summaryrefslogtreecommitdiffstatshomepage
path: root/scripts/src/osd
ModeNameSize
-rw-r--r--mac.lua5760logstatsplainblame
-rw-r--r--mac_cfg.lua598logstatsplainblame
-rw-r--r--modules.lua21768logstatsplainblame
-rw-r--r--sdl.lua13081logstatsplainblame
-rw-r--r--sdl_cfg.lua3196logstatsplainblame
-rw-r--r--uwp.lua3188logstatsplainblame
-rw-r--r--uwp_cfg.lua308logstatsplainblame
-rw-r--r--windows.lua7016logstatsplainblame
-rw-r--r--windows_cfg.lua964logstatsplainblame
9574b3cbe8a25137d2bbd17584ab90'>3rdparty/aes256cbc/LICENSE21
-rw-r--r--3rdparty/aes256cbc/README.md231
-rw-r--r--3rdparty/asmjit/CMakeLists.txt1013
-rw-r--r--3rdparty/asmjit/CMakePresets.json53
-rw-r--r--3rdparty/asmjit/CONTRIBUTING.md22
-rw-r--r--3rdparty/asmjit/LICENSE.md2
-rw-r--r--3rdparty/asmjit/README.md77
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.cpp83
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.h117
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_a64.cpp707
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_x86.cpp5336
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_overhead.cpp431
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_regalloc.cpp517
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/asmjitutils.h228
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/cmdline.h63
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/performancetimer.h27
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/random.h77
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.cpp107
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.h109
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_a64.cpp (renamed from 3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp)82
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x64.cpp (renamed from 3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp)171
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x86.cpp (renamed from 3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp)155
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.cpp407
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.h83
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_a64.cpp688
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_x86.cpp4694
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_emitters.cpp328
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_environment.cpp302
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_instinfo.cpp206
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_misc.h265
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_runner.cpp171
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler.cpp5674
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp49
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_sse2.cpp72
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_x86_sections.cpp169
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/broken.cpp (renamed from 3rdparty/asmjit/test/broken.cpp)38
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/broken.h (renamed from 3rdparty/asmjit/test/broken.h)4
-rw-r--r--3rdparty/asmjit/asmjit/a64.h55
-rw-r--r--3rdparty/asmjit/asmjit/arm.h57
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64archtraits_p.h82
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64assembler.cpp5338
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64assembler.h61
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64builder.cpp57
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64builder.h57
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64compiler.cpp72
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64compiler.h267
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64emithelper.cpp481
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64emithelper_p.h59
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64emitter.h1299
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64formatter.cpp66
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64formatter_p.h43
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64func.cpp212
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64func_p.h33
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64globals.h (renamed from 3rdparty/asmjit/src/asmjit/arm/a64globals.h)72
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instapi.cpp252
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instapi_p.h38
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instdb.cpp (renamed from 3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp)1716
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instdb.h77
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instdb_p.h885
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64operand.cpp85
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64operand.h1105
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64rapass.cpp909
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64rapass_p.h113
-rw-r--r--3rdparty/asmjit/asmjit/arm/armformatter.cpp620
-rw-r--r--3rdparty/asmjit/asmjit/arm/armformatter_p.h69
-rw-r--r--3rdparty/asmjit/asmjit/arm/armglobals.h17
-rw-r--r--3rdparty/asmjit/asmjit/arm/armutils.h247
-rw-r--r--3rdparty/asmjit/asmjit/asmjit-scope-begin.h (renamed from 3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h)2
-rw-r--r--3rdparty/asmjit/asmjit/asmjit-scope-end.h9
-rw-r--r--3rdparty/asmjit/asmjit/asmjit.h (renamed from 3rdparty/asmjit/src/asmjit/asmjit.h)6
-rw-r--r--3rdparty/asmjit/asmjit/asmjit.natvis245
-rw-r--r--3rdparty/asmjit/asmjit/core.h2320
-rw-r--r--3rdparty/asmjit/asmjit/core/api-build_p.h (renamed from 3rdparty/asmjit/src/asmjit/core/api-build_p.h)6
-rw-r--r--3rdparty/asmjit/asmjit/core/api-config.h695
-rw-r--r--3rdparty/asmjit/asmjit/core/archcommons.h (renamed from 3rdparty/asmjit/src/asmjit/core/archcommons.h)31
-rw-r--r--3rdparty/asmjit/asmjit/core/archtraits.cpp167
-rw-r--r--3rdparty/asmjit/asmjit/core/archtraits.h310
-rw-r--r--3rdparty/asmjit/asmjit/core/assembler.cpp444
-rw-r--r--3rdparty/asmjit/asmjit/core/assembler.h147
-rw-r--r--3rdparty/asmjit/asmjit/core/builder.cpp938
-rw-r--r--3rdparty/asmjit/asmjit/core/builder.h1664
-rw-r--r--3rdparty/asmjit/asmjit/core/builder_p.h38
-rw-r--r--3rdparty/asmjit/asmjit/core/codebuffer.h (renamed from 3rdparty/asmjit/src/asmjit/core/codebuffer.h)38
-rw-r--r--3rdparty/asmjit/asmjit/core/codeholder.cpp1451
-rw-r--r--3rdparty/asmjit/asmjit/core/codeholder.h1318
-rw-r--r--3rdparty/asmjit/asmjit/core/codewriter.cpp302
-rw-r--r--3rdparty/asmjit/asmjit/core/codewriter_p.h188
-rw-r--r--3rdparty/asmjit/asmjit/core/compiler.cpp615
-rw-r--r--3rdparty/asmjit/asmjit/core/compiler.h859
-rw-r--r--3rdparty/asmjit/asmjit/core/compilerdefs.h247
-rw-r--r--3rdparty/asmjit/asmjit/core/constpool.cpp371
-rw-r--r--3rdparty/asmjit/asmjit/core/constpool.h280
-rw-r--r--3rdparty/asmjit/asmjit/core/cpuinfo.cpp2386
-rw-r--r--3rdparty/asmjit/asmjit/core/cpuinfo.h1413
-rw-r--r--3rdparty/asmjit/asmjit/core/emithelper.cpp365
-rw-r--r--3rdparty/asmjit/asmjit/core/emithelper_p.h61
-rw-r--r--3rdparty/asmjit/asmjit/core/emitter.cpp443
-rw-r--r--3rdparty/asmjit/asmjit/core/emitter.h938
-rw-r--r--3rdparty/asmjit/asmjit/core/emitterutils.cpp129
-rw-r--r--3rdparty/asmjit/asmjit/core/emitterutils_p.h107
-rw-r--r--3rdparty/asmjit/asmjit/core/environment.cpp47
-rw-r--r--3rdparty/asmjit/asmjit/core/environment.h622
-rw-r--r--3rdparty/asmjit/asmjit/core/errorhandler.cpp19
-rw-r--r--3rdparty/asmjit/asmjit/core/errorhandler.h (renamed from 3rdparty/asmjit/src/asmjit/core/errorhandler.h)42
-rw-r--r--3rdparty/asmjit/asmjit/core/fixup.h282
-rw-r--r--3rdparty/asmjit/asmjit/core/formatter.cpp628
-rw-r--r--3rdparty/asmjit/asmjit/core/formatter.h266
-rw-r--r--3rdparty/asmjit/asmjit/core/formatter_p.h40
-rw-r--r--3rdparty/asmjit/asmjit/core/func.cpp316
-rw-r--r--3rdparty/asmjit/asmjit/core/func.h1878
-rw-r--r--3rdparty/asmjit/asmjit/core/funcargscontext.cpp340
-rw-r--r--3rdparty/asmjit/asmjit/core/funcargscontext_p.h226
-rw-r--r--3rdparty/asmjit/asmjit/core/globals.cpp (renamed from 3rdparty/asmjit/src/asmjit/core/globals.cpp)30
-rw-r--r--3rdparty/asmjit/asmjit/core/globals.h458
-rw-r--r--3rdparty/asmjit/asmjit/core/inst.cpp129
-rw-r--r--3rdparty/asmjit/asmjit/core/inst.h924
-rw-r--r--3rdparty/asmjit/asmjit/core/instdb.cpp142
-rw-r--r--3rdparty/asmjit/asmjit/core/instdb_p.h41
-rw-r--r--3rdparty/asmjit/asmjit/core/jitallocator.cpp1646
-rw-r--r--3rdparty/asmjit/asmjit/core/jitallocator.h615
-rw-r--r--3rdparty/asmjit/asmjit/core/jitruntime.cpp86
-rw-r--r--3rdparty/asmjit/asmjit/core/jitruntime.h (renamed from 3rdparty/asmjit/src/asmjit/core/jitruntime.h)24
-rw-r--r--3rdparty/asmjit/asmjit/core/logger.cpp (renamed from 3rdparty/asmjit/src/asmjit/core/logger.cpp)26
-rw-r--r--3rdparty/asmjit/asmjit/core/logger.h (renamed from 3rdparty/asmjit/src/asmjit/core/logger.h)56
-rw-r--r--3rdparty/asmjit/asmjit/core/misc_p.h (renamed from 3rdparty/asmjit/src/asmjit/core/misc_p.h)4
-rw-r--r--3rdparty/asmjit/asmjit/core/operand.cpp132
-rw-r--r--3rdparty/asmjit/asmjit/core/operand.h2690
-rw-r--r--3rdparty/asmjit/asmjit/core/osutils.cpp41
-rw-r--r--3rdparty/asmjit/asmjit/core/osutils.h (renamed from 3rdparty/asmjit/src/asmjit/core/osutils.h)6
-rw-r--r--3rdparty/asmjit/asmjit/core/osutils_p.h (renamed from 3rdparty/asmjit/src/asmjit/core/osutils_p.h)8
-rw-r--r--3rdparty/asmjit/asmjit/core/raassignment_p.h495
-rw-r--r--3rdparty/asmjit/asmjit/core/racfgblock_p.h390
-rw-r--r--3rdparty/asmjit/asmjit/core/racfgbuilder_p.h653
-rw-r--r--3rdparty/asmjit/asmjit/core/raconstraints_p.h65
-rw-r--r--3rdparty/asmjit/asmjit/core/radefs_p.h1038
-rw-r--r--3rdparty/asmjit/asmjit/core/rainst_p.h438
-rw-r--r--3rdparty/asmjit/asmjit/core/ralocal.cpp1272
-rw-r--r--3rdparty/asmjit/asmjit/core/ralocal_p.h302
-rw-r--r--3rdparty/asmjit/asmjit/core/rapass.cpp2352
-rw-r--r--3rdparty/asmjit/asmjit/core/rapass_p.h732
-rw-r--r--3rdparty/asmjit/asmjit/core/rareg_p.h353
-rw-r--r--3rdparty/asmjit/asmjit/core/rastack.cpp193
-rw-r--r--3rdparty/asmjit/asmjit/core/rastack_p.h194
-rw-r--r--3rdparty/asmjit/asmjit/core/string.cpp666
-rw-r--r--3rdparty/asmjit/asmjit/core/string.h417
-rw-r--r--3rdparty/asmjit/asmjit/core/target.cpp17
-rw-r--r--3rdparty/asmjit/asmjit/core/target.h71
-rw-r--r--3rdparty/asmjit/asmjit/core/type.cpp70
-rw-r--r--3rdparty/asmjit/asmjit/core/type.h512
-rw-r--r--3rdparty/asmjit/asmjit/core/virtmem.cpp1257
-rw-r--r--3rdparty/asmjit/asmjit/core/virtmem.h (renamed from 3rdparty/asmjit/src/asmjit/core/virtmem.h)97
-rw-r--r--3rdparty/asmjit/asmjit/host.h33
-rw-r--r--3rdparty/asmjit/asmjit/support/arena.cpp515
-rw-r--r--3rdparty/asmjit/asmjit/support/arena.h498
-rw-r--r--3rdparty/asmjit/asmjit/support/arenabitset.cpp253
-rw-r--r--3rdparty/asmjit/asmjit/support/arenabitset_p.h436
-rw-r--r--3rdparty/asmjit/asmjit/support/arenahash.cpp309
-rw-r--r--3rdparty/asmjit/asmjit/support/arenahash.h198
-rw-r--r--3rdparty/asmjit/asmjit/support/arenalist.cpp163
-rw-r--r--3rdparty/asmjit/asmjit/support/arenalist.h221
-rw-r--r--3rdparty/asmjit/asmjit/support/arenapool.h66
-rw-r--r--3rdparty/asmjit/asmjit/support/arenastring.h123
-rw-r--r--3rdparty/asmjit/asmjit/support/arenatree.cpp98
-rw-r--r--3rdparty/asmjit/asmjit/support/arenatree.h407
-rw-r--r--3rdparty/asmjit/asmjit/support/arenavector.cpp316
-rw-r--r--3rdparty/asmjit/asmjit/support/arenavector.h641
-rw-r--r--3rdparty/asmjit/asmjit/support/span.h337
-rw-r--r--3rdparty/asmjit/asmjit/support/support.cpp679
-rw-r--r--3rdparty/asmjit/asmjit/support/support.h1898
-rw-r--r--3rdparty/asmjit/asmjit/support/support_p.h255
-rw-r--r--3rdparty/asmjit/asmjit/ujit.h17
-rw-r--r--3rdparty/asmjit/asmjit/ujit/ujitbase.h734
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler.h2097
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler_a64.cpp4391
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler_utils_p.h32
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler_x86.cpp7591
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicondition.h293
-rw-r--r--3rdparty/asmjit/asmjit/ujit/uniop.h819
-rw-r--r--3rdparty/asmjit/asmjit/ujit/vecconsttable.cpp20
-rw-r--r--3rdparty/asmjit/asmjit/ujit/vecconsttable.h454
-rw-r--r--3rdparty/asmjit/asmjit/x86.h84
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86archtraits_p.h165
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86assembler.cpp5141
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86assembler.h706
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86builder.cpp58
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86builder.h354
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86compiler.cpp73
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86compiler.h828
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86emithelper.cpp708
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86emithelper_p.h121
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86emitter.h (renamed from 3rdparty/asmjit/src/asmjit/x86/x86emitter.h)2106
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86formatter.cpp1015
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86formatter_p.h58
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86func.cpp523
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86func_p.h33
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86globals.h (renamed from 3rdparty/asmjit/src/asmjit/x86/x86globals.h)494
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instapi.cpp1938
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instapi_p.h39
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instdb.cpp6182
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instdb.h704
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instdb_p.h (renamed from 3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h)85
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86opcode_p.h (renamed from 3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h)48
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86operand.cpp249
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86operand.h1195
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86rapass.cpp1653
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86rapass_p.h96
-rw-r--r--3rdparty/asmjit/configure.sh9
-rw-r--r--3rdparty/asmjit/configure_sanitizers.sh13
-rw-r--r--3rdparty/asmjit/configure_vs2022_x64.bat2
-rw-r--r--3rdparty/asmjit/configure_vs2022_x86.bat2
-rw-r--r--3rdparty/asmjit/db/LICENSE.md17
-rw-r--r--3rdparty/asmjit/db/README.md21
-rw-r--r--3rdparty/asmjit/db/aarch32.js987
-rw-r--r--3rdparty/asmjit/db/aarch64.js920
-rw-r--r--3rdparty/asmjit/db/base.js707
-rw-r--r--3rdparty/asmjit/db/exp.js760
-rw-r--r--3rdparty/asmjit/db/index.js11
-rw-r--r--3rdparty/asmjit/db/isa_aarch32.json2783
-rw-r--r--3rdparty/asmjit/db/isa_aarch64.json3820
-rw-r--r--3rdparty/asmjit/db/isa_aarch64_sme.json15
-rw-r--r--3rdparty/asmjit/db/isa_x86.json4244
-rw-r--r--3rdparty/asmjit/db/isa_x86.md145
-rw-r--r--3rdparty/asmjit/db/package.json29
-rw-r--r--3rdparty/asmjit/db/x86.js1273
-rw-r--r--3rdparty/asmjit/src/asmjit.natvis245
-rw-r--r--3rdparty/asmjit/src/asmjit/a64.h60
-rw-r--r--3rdparty/asmjit/src/asmjit/arm.h84
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h82
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp5183
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64assembler.h61
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64builder.cpp55
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64builder.h57
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp61
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64compiler.h254
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp470
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h50
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64emitter.h1232
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp59
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h42
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64func.cpp202
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64func_p.h33
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp231
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h41
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instdb.h72
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h873
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64operand.cpp85
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64operand.h650
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp854
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h105
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armformatter.cpp588
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armformatter_p.h69
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armglobals.h17
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armoperand.h396
-rw-r--r--3rdparty/asmjit/src/asmjit/arm/armutils.h226
-rw-r--r--3rdparty/asmjit/src/asmjit/asmjit-scope-end.h9
-rw-r--r--3rdparty/asmjit/src/asmjit/core.h1991
-rw-r--r--3rdparty/asmjit/src/asmjit/core/api-config.h666
-rw-r--r--3rdparty/asmjit/src/asmjit/core/archtraits.cpp161
-rw-r--r--3rdparty/asmjit/src/asmjit/core/archtraits.h293
-rw-r--r--3rdparty/asmjit/src/asmjit/core/assembler.cpp406
-rw-r--r--3rdparty/asmjit/src/asmjit/core/assembler.h130
-rw-r--r--3rdparty/asmjit/src/asmjit/core/builder.cpp897
-rw-r--r--3rdparty/asmjit/src/asmjit/core/builder.h1499
-rw-r--r--3rdparty/asmjit/src/asmjit/core/builder_p.h37
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codeholder.cpp1156
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codeholder.h1123
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codewriter.cpp278
-rw-r--r--3rdparty/asmjit/src/asmjit/core/codewriter_p.h179
-rw-r--r--3rdparty/asmjit/src/asmjit/core/compiler.cpp598
-rw-r--r--3rdparty/asmjit/src/asmjit/core/compiler.h741
-rw-r--r--3rdparty/asmjit/src/asmjit/core/compilerdefs.h171
-rw-r--r--3rdparty/asmjit/src/asmjit/core/constpool.cpp370
-rw-r--r--3rdparty/asmjit/src/asmjit/core/constpool.h261
-rw-r--r--3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp2000
-rw-r--r--3rdparty/asmjit/src/asmjit/core/cpuinfo.h1224
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emithelper.cpp344
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emithelper_p.h58
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitter.cpp415
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitter.h817
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitterutils.cpp127
-rw-r--r--3rdparty/asmjit/src/asmjit/core/emitterutils_p.h89
-rw-r--r--3rdparty/asmjit/src/asmjit/core/environment.cpp46
-rw-r--r--3rdparty/asmjit/src/asmjit/core/environment.h534
-rw-r--r--3rdparty/asmjit/src/asmjit/core/errorhandler.cpp18
-rw-r--r--3rdparty/asmjit/src/asmjit/core/formatter.cpp584
-rw-r--r--3rdparty/asmjit/src/asmjit/core/formatter.h249
-rw-r--r--3rdparty/asmjit/src/asmjit/core/formatter_p.h34
-rw-r--r--3rdparty/asmjit/src/asmjit/core/func.cpp300
-rw-r--r--3rdparty/asmjit/src/asmjit/core/func.h1595
-rw-r--r--3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp307
-rw-r--r--3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h199
-rw-r--r--3rdparty/asmjit/src/asmjit/core/globals.h421
-rw-r--r--3rdparty/asmjit/src/asmjit/core/inst.cpp117
-rw-r--r--3rdparty/asmjit/src/asmjit/core/inst.h804
-rw-r--r--3rdparty/asmjit/src/asmjit/core/instdb.cpp101
-rw-r--r--3rdparty/asmjit/src/asmjit/core/instdb_p.h40
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitallocator.cpp1563
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitallocator.h570
-rw-r--r--3rdparty/asmjit/src/asmjit/core/jitruntime.cpp79
-rw-r--r--3rdparty/asmjit/src/asmjit/core/operand.cpp132
-rw-r--r--3rdparty/asmjit/src/asmjit/core/operand.h1889
-rw-r--r--3rdparty/asmjit/src/asmjit/core/osutils.cpp40
-rw-r--r--3rdparty/asmjit/src/asmjit/core/raassignment_p.h418
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rabuilders_p.h612
-rw-r--r--3rdparty/asmjit/src/asmjit/core/radefs_p.h1212
-rw-r--r--3rdparty/asmjit/src/asmjit/core/ralocal.cpp1170
-rw-r--r--3rdparty/asmjit/src/asmjit/core/ralocal_p.h247
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rapass.cpp2061
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rapass_p.h1183
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rastack.cpp184
-rw-r--r--3rdparty/asmjit/src/asmjit/core/rastack_p.h166
-rw-r--r--3rdparty/asmjit/src/asmjit/core/string.cpp559
-rw-r--r--3rdparty/asmjit/src/asmjit/core/string.h383
-rw-r--r--3rdparty/asmjit/src/asmjit/core/support.cpp496
-rw-r--r--3rdparty/asmjit/src/asmjit/core/support.h1818
-rw-r--r--3rdparty/asmjit/src/asmjit/core/support_p.h27
-rw-r--r--3rdparty/asmjit/src/asmjit/core/target.cpp16
-rw-r--r--3rdparty/asmjit/src/asmjit/core/target.h59
-rw-r--r--3rdparty/asmjit/src/asmjit/core/type.cpp74
-rw-r--r--3rdparty/asmjit/src/asmjit/core/type.h443
-rw-r--r--3rdparty/asmjit/src/asmjit/core/virtmem.cpp1206
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zone.cpp353
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zone.h611
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonehash.cpp309
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonehash.h186
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonelist.cpp163
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonelist.h208
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonestack.cpp186
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonestack.h235
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonestring.h120
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonetree.cpp98
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonetree.h376
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonevector.cpp369
-rw-r--r--3rdparty/asmjit/src/asmjit/core/zonevector.h729
-rw-r--r--3rdparty/asmjit/src/asmjit/x86.h93
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h148
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp5114
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86assembler.h695
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86builder.cpp55
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86builder.h354
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp62
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86compiler.h726
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp640
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h60
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp992
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h58
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86func.cpp504
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86func_p.h33
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp1830
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h42
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp6187
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86instdb.h563
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86operand.cpp231
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86operand.h1145
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp1514
-rw-r--r--3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h94
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler.cpp93
-rw-r--r--3rdparty/asmjit/test/asmjit_test_assembler.h108
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler.cpp403
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler.h83
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp687
-rw-r--r--3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp4522
-rw-r--r--3rdparty/asmjit/test/asmjit_test_emitters.cpp325
-rw-r--r--3rdparty/asmjit/test/asmjit_test_execute.cpp103
-rw-r--r--3rdparty/asmjit/test/asmjit_test_instinfo.cpp187
-rw-r--r--3rdparty/asmjit/test/asmjit_test_misc.h257
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf.cpp72
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf.h114
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf_a64.cpp707
-rw-r--r--3rdparty/asmjit/test/asmjit_test_perf_x86.cpp5118
-rw-r--r--3rdparty/asmjit/test/asmjit_test_unit.cpp173
-rw-r--r--3rdparty/asmjit/test/asmjit_test_x86_sections.cpp169
-rw-r--r--3rdparty/asmjit/test/asmjitutils.h60
-rw-r--r--3rdparty/asmjit/test/cmdline.h61
-rw-r--r--3rdparty/asmjit/test/performancetimer.h33
-rw-r--r--3rdparty/asmjit/tools/configure-makefiles.sh13
-rw-r--r--3rdparty/asmjit/tools/configure-ninja.sh13
-rw-r--r--3rdparty/asmjit/tools/configure-sanitizers.sh17
-rw-r--r--3rdparty/asmjit/tools/configure-vs2019-x64.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-vs2019-x86.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-vs2022-x64.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-vs2022-x86.bat2
-rw-r--r--3rdparty/asmjit/tools/configure-xcode.sh8
-rw-r--r--3rdparty/asmjit/tools/enumgen.js17
-rwxr-xr-x[-rw-r--r--]3rdparty/asmjit/tools/enumgen.sh0
-rw-r--r--3rdparty/asmjit/tools/generator-commons.js36
-rw-r--r--3rdparty/asmjit/tools/generator-cxx.js10
-rw-r--r--3rdparty/asmjit/tools/tablegen-a64.js25
-rwxr-xr-x[-rw-r--r--]3rdparty/asmjit/tools/tablegen-a64.sh0
-rw-r--r--3rdparty/asmjit/tools/tablegen-x86.js443
-rwxr-xr-x[-rw-r--r--]3rdparty/asmjit/tools/tablegen-x86.sh0
-rw-r--r--3rdparty/asmjit/tools/tablegen.js165
-rwxr-xr-x[-rw-r--r--]3rdparty/asmjit/tools/tablegen.sh0
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/LICENSE.txt2
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imconfig.h152
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui.cpp9547
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui.h2088
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_demo.cpp6332
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_draw.cpp1495
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_internal.h1930
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_tables.cpp1109
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_widgets.cpp4334
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.inl12
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.inl17
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.h1
-rw-r--r--3rdparty/bgfx/3rdparty/stb/stb_textedit.h366
-rw-r--r--3rdparty/bgfx/3rdparty/stb/stb_truetype.h645
-rw-r--r--3rdparty/bgfx/examples/22-windows/windows.cpp15
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/bunnylod.cpp10
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry.cpp3
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_glfw.cpp77
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_p.h4
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_sdl.cpp92
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_windows.cpp8
-rw-r--r--3rdparty/bgfx/examples/common/example-glue.cpp2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.sc2
-rw-r--r--3rdparty/bgfx/examples/common/imgui/imgui.cpp68
-rw-r--r--3rdparty/bgfx/examples/common/imgui/imgui.h4
-rw-r--r--3rdparty/bgfx/examples/common/imgui/makefile2
-rw-r--r--3rdparty/bgfx/scripts/example-common.lua6
-rw-r--r--3rdparty/bgfx/scripts/genie.lua31
-rw-r--r--3rdparty/bgfx/scripts/geometryv.lua16
-rw-r--r--3rdparty/bgfx/scripts/texturev.lua16
-rw-r--r--3rdparty/bgfx/src/glcontext_egl.cpp102
-rw-r--r--3rdparty/bgfx/src/glcontext_egl.h17
-rw-r--r--3rdparty/bgfx/src/glcontext_html5.cpp5
-rw-r--r--3rdparty/bgfx/src/glcontext_html5.h2
-rw-r--r--3rdparty/bgfx/src/glcontext_nsgl.h2
-rw-r--r--3rdparty/bgfx/src/glcontext_nsgl.mm2
-rw-r--r--3rdparty/bgfx/src/glcontext_wgl.cpp3
-rw-r--r--3rdparty/bgfx/src/glcontext_wgl.h2
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.cpp4
-rw-r--r--3rdparty/bgfx/src/renderer_d3d12.cpp20
-rw-r--r--3rdparty/bgfx/src/renderer_gl.cpp9
-rw-r--r--3rdparty/bgfx/src/renderer_vk.cpp135
-rw-r--r--3rdparty/bgfx/src/renderer_vk.h28
-rw-r--r--3rdparty/bgfx/src/shader_spirv.cpp2
-rw-r--r--3rdparty/bx/include/bx/macros.h6
-rw-r--r--3rdparty/bx/scripts/toolchain.lua1
-rw-r--r--3rdparty/bx/src/mutex.cpp10
-rw-r--r--3rdparty/bx/src/os.cpp14
-rw-r--r--3rdparty/bx/src/thread.cpp15
-rw-r--r--3rdparty/expat/CMake.README14
-rw-r--r--3rdparty/expat/CMakeLists.txt636
-rw-r--r--3rdparty/expat/COPYING2
-rw-r--r--3rdparty/expat/Changes863
-rw-r--r--3rdparty/expat/ConfigureChecks.cmake24
-rw-r--r--3rdparty/expat/Makefile.am43
-rw-r--r--3rdparty/expat/Makefile.in164
-rw-r--r--3rdparty/expat/README.md161
-rw-r--r--3rdparty/expat/acinclude.m42
-rw-r--r--3rdparty/expat/aclocal.m4113
-rwxr-xr-x3rdparty/expat/buildconf.sh35
-rw-r--r--3rdparty/expat/cmake/autotools/expat-config-version.cmake.in65
-rw-r--r--3rdparty/expat/cmake/autotools/expat-noconfig__linux.cmake.in19
-rw-r--r--3rdparty/expat/cmake/autotools/expat-noconfig__macos.cmake.in19
-rw-r--r--3rdparty/expat/cmake/autotools/expat-noconfig__windows.cmake.in19
-rw-r--r--3rdparty/expat/cmake/autotools/expat-package-init.cmake25
-rw-r--r--3rdparty/expat/cmake/autotools/expat.cmake107
-rw-r--r--3rdparty/expat/cmake/mingw-toolchain.cmake1
-rwxr-xr-x3rdparty/expat/configure10315
-rw-r--r--3rdparty/expat/configure.ac196
-rwxr-xr-x3rdparty/expat/conftools/PrintPath116
-rwxr-xr-x3rdparty/expat/conftools/ar-lib2
-rw-r--r--3rdparty/expat/conftools/ax-cxx-compile-stdcxx-11.m439
-rw-r--r--3rdparty/expat/conftools/ax-cxx-compile-stdcxx.m41018
-rwxr-xr-x3rdparty/expat/conftools/compile2
-rwxr-xr-x3rdparty/expat/conftools/config.guess1209
-rwxr-xr-x3rdparty/expat/conftools/config.sub655
-rwxr-xr-x3rdparty/expat/conftools/depcomp2
-rwxr-xr-x3rdparty/expat/conftools/get-version.sh30
-rwxr-xr-x3rdparty/expat/conftools/install-sh148
-rw-r--r--3rdparty/expat/conftools/ltmain.sh1594
-rwxr-xr-x3rdparty/expat/conftools/missing2
-rwxr-xr-x3rdparty/expat/conftools/test-driver19
-rw-r--r--3rdparty/expat/doc/Makefile.am26
-rw-r--r--3rdparty/expat/doc/Makefile.in96
-rw-r--r--3rdparty/expat/doc/expat.pngbin920 -> 0 bytes-rw-r--r--3rdparty/expat/doc/ok.min.css2
-rw-r--r--3rdparty/expat/doc/reference.html636
-rw-r--r--3rdparty/expat/doc/style.css134
-rw-r--r--3rdparty/expat/doc/valid-xhtml10.pngbin1981 -> 0 bytes-rw-r--r--3rdparty/expat/doc/xmlwf.1135
-rw-r--r--3rdparty/expat/doc/xmlwf.xml223
-rw-r--r--3rdparty/expat/examples/Makefile.am8
-rw-r--r--3rdparty/expat/examples/Makefile.in74
-rw-r--r--3rdparty/expat/examples/element_declarations.c235
-rw-r--r--3rdparty/expat/examples/elements.c52
-rw-r--r--3rdparty/expat/examples/outline.c83
-rw-r--r--3rdparty/expat/expat.pc.cmake13
-rw-r--r--3rdparty/expat/expat.pc.in8
-rw-r--r--3rdparty/expat/expat_config.h143
-rw-r--r--3rdparty/expat/expat_config.h.cmake19
-rw-r--r--3rdparty/expat/expat_config.h.in24
-rwxr-xr-x3rdparty/expat/fix-xmltest-log.sh16
-rw-r--r--3rdparty/expat/fuzz/xml_lpm_fuzzer.cpp464
-rw-r--r--3rdparty/expat/fuzz/xml_lpm_fuzzer.proto58
-rw-r--r--3rdparty/expat/fuzz/xml_parse_fuzzer.c105
-rw-r--r--3rdparty/expat/fuzz/xml_parsebuffer_fuzzer.c117
-rw-r--r--3rdparty/expat/lib/Makefile.am17
-rw-r--r--3rdparty/expat/lib/Makefile.in139
-rw-r--r--3rdparty/expat/lib/ascii.h7
-rw-r--r--3rdparty/expat/lib/asciitab.h4
-rw-r--r--3rdparty/expat/lib/expat.h77
-rw-r--r--3rdparty/expat/lib/expat_config.h6
-rw-r--r--3rdparty/expat/lib/expat_external.h9
-rw-r--r--3rdparty/expat/lib/iasciitab.h4
-rw-r--r--3rdparty/expat/lib/internal.h74
-rw-r--r--3rdparty/expat/lib/latin1tab.h4
-rw-r--r--3rdparty/expat/lib/libexpat.def78
-rw-r--r--3rdparty/expat/lib/libexpat.def.cmake81
-rw-r--r--3rdparty/expat/lib/libexpatw.def78
-rw-r--r--3rdparty/expat/lib/nametab.h4
-rw-r--r--3rdparty/expat/lib/siphash.h26
-rw-r--r--3rdparty/expat/lib/utf8tab.h4
-rw-r--r--3rdparty/expat/lib/winconfig.h24
-rw-r--r--3rdparty/expat/lib/xmlparse.c2773
-rw-r--r--3rdparty/expat/lib/xmlrole.c18
-rw-r--r--3rdparty/expat/lib/xmlrole.h9
-rw-r--r--3rdparty/expat/lib/xmltok.c78
-rw-r--r--3rdparty/expat/lib/xmltok.h12
-rw-r--r--3rdparty/expat/lib/xmltok_impl.c38
-rw-r--r--3rdparty/expat/lib/xmltok_impl.h5
-rw-r--r--3rdparty/expat/lib/xmltok_ns.c8
-rw-r--r--3rdparty/expat/m4/libtool.m4682
-rw-r--r--3rdparty/expat/m4/ltoptions.m4108
-rw-r--r--3rdparty/expat/m4/ltsugar.m42
-rw-r--r--3rdparty/expat/m4/ltversion.m413
-rw-r--r--3rdparty/expat/m4/lt~obsolete.m44
-rw-r--r--3rdparty/expat/run.sh.in41
-rwxr-xr-x3rdparty/expat/test-driver-wrapper.sh3
-rw-r--r--3rdparty/expat/tests/Makefile.am65
-rw-r--r--3rdparty/expat/tests/Makefile.in302
-rw-r--r--3rdparty/expat/tests/README.md11
-rw-r--r--3rdparty/expat/tests/README.txt13
-rw-r--r--3rdparty/expat/tests/acc_tests.c458
-rw-r--r--3rdparty/expat/tests/acc_tests.h56
-rw-r--r--3rdparty/expat/tests/acc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/alloc_tests.c2154
-rw-r--r--3rdparty/expat/tests/alloc_tests.h56
-rw-r--r--3rdparty/expat/tests/alloc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/basic_tests.c6472
-rw-r--r--3rdparty/expat/tests/basic_tests.h56
-rw-r--r--3rdparty/expat/tests/basic_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/benchmark/Makefile.am3
-rw-r--r--3rdparty/expat/tests/benchmark/Makefile.in40
-rw-r--r--3rdparty/expat/tests/benchmark/benchmark.c73
-rw-r--r--3rdparty/expat/tests/chardata.c22
-rw-r--r--3rdparty/expat/tests/chardata.h5
-rw-r--r--3rdparty/expat/tests/chardata_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/common.c327
-rw-r--r--3rdparty/expat/tests/common.h155
-rw-r--r--3rdparty/expat/tests/common_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/dummy.c261
-rw-r--r--3rdparty/expat/tests/dummy.h150
-rw-r--r--3rdparty/expat/tests/dummy_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/handlers.c1979
-rw-r--r--3rdparty/expat/tests/handlers.h615
-rw-r--r--3rdparty/expat/tests/handlers_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/memcheck.c21
-rw-r--r--3rdparty/expat/tests/memcheck.h4
-rw-r--r--3rdparty/expat/tests/memcheck_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/minicheck.c80
-rw-r--r--3rdparty/expat/tests/minicheck.h84
-rw-r--r--3rdparty/expat/tests/minicheck_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/misc_tests.c709
-rw-r--r--3rdparty/expat/tests/misc_tests.h56
-rw-r--r--3rdparty/expat/tests/misc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/ns_tests.c754
-rw-r--r--3rdparty/expat/tests/ns_tests.h56
-rw-r--r--3rdparty/expat/tests/ns_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/nsalloc_tests.c1537
-rw-r--r--3rdparty/expat/tests/nsalloc_tests.h56
-rw-r--r--3rdparty/expat/tests/nsalloc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/runtests.c11607
-rw-r--r--3rdparty/expat/tests/runtests_cxx.cpp36
-rw-r--r--3rdparty/expat/tests/runtestspp.cpp36
-rw-r--r--3rdparty/expat/tests/structdata.c41
-rw-r--r--3rdparty/expat/tests/structdata.h3
-rw-r--r--3rdparty/expat/tests/structdata_cxx.cpp32
-rwxr-xr-x3rdparty/expat/tests/udiffer.py3
-rwxr-xr-x3rdparty/expat/tests/xmltest.sh48
-rw-r--r--3rdparty/expat/win32/README.txt4
-rw-r--r--3rdparty/expat/win32/build_expat_iss.bat12
-rw-r--r--3rdparty/expat/win32/expat.iss57
-rw-r--r--3rdparty/expat/win32/version.rc.cmake17
-rw-r--r--3rdparty/expat/xmlwf/Makefile.am4
-rw-r--r--3rdparty/expat/xmlwf/Makefile.in41
-rw-r--r--3rdparty/expat/xmlwf/codepage.c6
-rw-r--r--3rdparty/expat/xmlwf/codepage.h4
-rw-r--r--3rdparty/expat/xmlwf/ct.c3
-rw-r--r--3rdparty/expat/xmlwf/filemap.h4
-rw-r--r--3rdparty/expat/xmlwf/readfilemap.c31
-rw-r--r--3rdparty/expat/xmlwf/unixfilemap.c6
-rw-r--r--3rdparty/expat/xmlwf/win32filemap.c7
-rw-r--r--3rdparty/expat/xmlwf/xmlfile.c29
-rw-r--r--3rdparty/expat/xmlwf/xmlfile.h7
-rw-r--r--3rdparty/expat/xmlwf/xmlmime.c4
-rw-r--r--3rdparty/expat/xmlwf/xmlmime.h3
-rw-r--r--3rdparty/expat/xmlwf/xmltchar.h7
-rw-r--r--3rdparty/expat/xmlwf/xmlwf.c293
-rwxr-xr-x3rdparty/expat/xmlwf/xmlwf_helpgen.py41
-rwxr-xr-x3rdparty/expat/xmlwf/xmlwf_helpgen.sh5
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/bitmath.h11
-rw-r--r--3rdparty/genie/.travis.yml20
-rw-r--r--3rdparty/genie/README.md45
-rw-r--r--3rdparty/genie/build/gmake.darwin/Makefile1
-rw-r--r--3rdparty/genie/build/gmake.darwin/genie.make52
-rw-r--r--3rdparty/genie/build/gmake.freebsd/genie.make163
-rw-r--r--3rdparty/genie/build/gmake.linux/Makefile1
-rw-r--r--3rdparty/genie/build/gmake.linux/genie.make4
-rw-r--r--3rdparty/genie/build/gmake.solaris/Makefile34
-rw-r--r--3rdparty/genie/build/gmake.solaris/genie.make470
-rw-r--r--3rdparty/genie/build/gmake.windows/Makefile1
-rw-r--r--3rdparty/genie/build/gmake.windows/genie.make4
-rw-r--r--3rdparty/genie/docs/scripting-reference.md73
-rw-r--r--3rdparty/genie/makefile2
-rw-r--r--3rdparty/genie/scripts/genie.lua8
-rw-r--r--3rdparty/genie/src/_manifest.lua20
-rw-r--r--3rdparty/genie/src/actions/cmake/_cmake.lua13
-rw-r--r--3rdparty/genie/src/actions/cmake/cmake_project.lua506
-rw-r--r--3rdparty/genie/src/actions/cmake/cmake_workspace.lua71
-rw-r--r--3rdparty/genie/src/actions/fastbuild/_fastbuild.lua44
-rw-r--r--3rdparty/genie/src/actions/fastbuild/fastbuild_project.lua468
-rw-r--r--3rdparty/genie/src/actions/fastbuild/fastbuild_solution.lua195
-rw-r--r--3rdparty/genie/src/actions/jcdb/_jcdb.lua21
-rw-r--r--3rdparty/genie/src/actions/jcdb/jcdb_solution.lua153
-rw-r--r--3rdparty/genie/src/actions/make/_make.lua7
-rw-r--r--3rdparty/genie/src/actions/make/make_cpp.lua5
-rw-r--r--3rdparty/genie/src/actions/make/make_csharp.lua4
-rw-r--r--3rdparty/genie/src/actions/make/make_solution.lua1
-rw-r--r--3rdparty/genie/src/actions/make/make_swift.lua19
-rw-r--r--3rdparty/genie/src/actions/make/make_vala.lua314
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_cpp.lua124
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_solution.lua2
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_swift.lua1
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_swift_incremental.lua1
-rw-r--r--3rdparty/genie/src/actions/qbs/_qbs.lua41
-rw-r--r--3rdparty/genie/src/actions/qbs/qbs_base.lua9
-rw-r--r--3rdparty/genie/src/actions/qbs/qbs_cpp.lua285
-rw-r--r--3rdparty/genie/src/actions/qbs/qbs_solution.lua251
-rw-r--r--3rdparty/genie/src/actions/vstudio/_vstudio.lua58
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2022.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2026.lua63
-rw-r--r--3rdparty/genie/src/actions/vstudio/vsllvm.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_slnx.lua112
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_solution.lua27
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_vcxproj.lua141
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode10.lua2
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode11.lua91
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode14.lua121
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode15.lua124
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode8.lua32
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode9.lua4
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_common.lua47
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_scheme.lua7
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_workspace.lua1
-rw-r--r--3rdparty/genie/src/base/api.lua10
-rw-r--r--3rdparty/genie/src/base/bake.lua17
-rw-r--r--3rdparty/genie/src/base/cmdline.lua6
-rw-r--r--3rdparty/genie/src/base/config.lua1
-rw-r--r--3rdparty/genie/src/base/globals.lua20
-rw-r--r--3rdparty/genie/src/base/os.lua3
-rw-r--r--3rdparty/genie/src/base/path.lua10
-rw-r--r--3rdparty/genie/src/base/project.lua31
-rw-r--r--3rdparty/genie/src/host/premake.c2
-rw-r--r--3rdparty/genie/src/host/scripts.c589
-rw-r--r--3rdparty/genie/src/host/version.h5
-rw-r--r--3rdparty/genie/src/tools/gcc.lua19
-rw-r--r--3rdparty/genie/src/tools/valac.lua54
-rw-r--r--3rdparty/genie/tests/actions/vstudio/test_vs2010_flags.lua7
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc200x/test_mfc.lua98
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_mfc.lua60
-rw-r--r--3rdparty/genie/tests/premake4.lua2
-rw-r--r--3rdparty/lua/Makefile4
-rw-r--r--3rdparty/lua/README2
-rw-r--r--3rdparty/lua/doc/OSIApproved_100X125.pngbin0 -> 12127 bytes-rw-r--r--3rdparty/lua/doc/contents.html20
-rw-r--r--3rdparty/lua/doc/lua.118
-rw-r--r--3rdparty/lua/doc/lua.css1
-rw-r--r--3rdparty/lua/doc/manual.html355
-rw-r--r--3rdparty/lua/doc/osi-certified-72x60.pngbin3774 -> 0 bytes-rw-r--r--3rdparty/lua/doc/readme.html53
-rw-r--r--3rdparty/lua/src/Makefile5
-rw-r--r--3rdparty/lua/src/lapi.c253
-rw-r--r--3rdparty/lua/src/lapi.h17
-rw-r--r--3rdparty/lua/src/lauxlib.c84
-rw-r--r--3rdparty/lua/src/lcode.c170
-rw-r--r--3rdparty/lua/src/lcode.h3
-rw-r--r--3rdparty/lua/src/lcorolib.c4
-rw-r--r--3rdparty/lua/src/ldebug.c298
-rw-r--r--3rdparty/lua/src/ldebug.h3
-rw-r--r--3rdparty/lua/src/ldo.c239
-rw-r--r--3rdparty/lua/src/ldo.h18
-rw-r--r--3rdparty/lua/src/ldump.c8
-rw-r--r--3rdparty/lua/src/lfunc.c54
-rw-r--r--3rdparty/lua/src/lfunc.h6
-rw-r--r--3rdparty/lua/src/lgc.c124
-rw-r--r--3rdparty/lua/src/lgc.h19
-rw-r--r--3rdparty/lua/src/liolib.c27
-rw-r--r--3rdparty/lua/src/llex.c6
-rw-r--r--3rdparty/lua/src/llimits.h21
-rw-r--r--3rdparty/lua/src/lmathlib.c41
-rw-r--r--3rdparty/lua/src/lmem.c68
-rw-r--r--3rdparty/lua/src/loadlib.c18
-rw-r--r--3rdparty/lua/src/lobject.c38
-rw-r--r--3rdparty/lua/src/lobject.h37
-rw-r--r--3rdparty/lua/src/lopcodes.h10
-rw-r--r--3rdparty/lua/src/loslib.c38
-rw-r--r--3rdparty/lua/src/lparser.c43
-rw-r--r--3rdparty/lua/src/lstate.c71
-rw-r--r--3rdparty/lua/src/lstate.h28
-rw-r--r--3rdparty/lua/src/lstring.c13
-rw-r--r--3rdparty/lua/src/lstrlib.c2
-rw-r--r--3rdparty/lua/src/ltable.c47
-rw-r--r--3rdparty/lua/src/ltable.h3
-rw-r--r--3rdparty/lua/src/ltablib.c2
-rw-r--r--3rdparty/lua/src/ltm.c38
-rw-r--r--3rdparty/lua/src/lua.c56
-rw-r--r--3rdparty/lua/src/lua.h27
-rw-r--r--3rdparty/lua/src/luac.c6
-rw-r--r--3rdparty/lua/src/luaconf.h22
-rw-r--r--3rdparty/lua/src/lundump.c12
-rw-r--r--3rdparty/lua/src/lundump.h3
-rw-r--r--3rdparty/lua/src/lutf8lib.c27
-rw-r--r--3rdparty/lua/src/lvm.c309
-rw-r--r--3rdparty/lua/src/lvm.h5
-rw-r--r--3rdparty/portmidi/.github/workflows/build.yml47
-rw-r--r--3rdparty/portmidi/.github/workflows/docs.yml28
-rw-r--r--3rdparty/portmidi/.gitignore62
-rw-r--r--3rdparty/portmidi/ALL_BUILD.vcproj128
-rw-r--r--3rdparty/portmidi/CHANGELOG.txt21
-rw-r--r--3rdparty/portmidi/CMakeLists.txt244
-rw-r--r--3rdparty/portmidi/Doxyfile3098
-rw-r--r--3rdparty/portmidi/README.md104
-rw-r--r--3rdparty/portmidi/README.txt18
-rw-r--r--3rdparty/portmidi/ZERO_CHECK.vcproj128
-rw-r--r--3rdparty/portmidi/packaging/PortMidiConfig.cmake.in10
-rw-r--r--3rdparty/portmidi/packaging/portmidi.pc.in11
-rw-r--r--3rdparty/portmidi/pm_cl/README_CL.txt104
-rw-r--r--3rdparty/portmidi/pm_cl/cffi-portmidi.lisp384
-rw-r--r--3rdparty/portmidi/pm_cl/test-no-cm.lisp112
-rw-r--r--3rdparty/portmidi/pm_common/CMakeLists.txt230
-rw-r--r--3rdparty/portmidi/pm_common/pminternal.h59
-rw-r--r--3rdparty/portmidi/pm_common/pmjni.vcproj161
-rw-r--r--3rdparty/portmidi/pm_common/pmutil.c2
-rw-r--r--3rdparty/portmidi/pm_common/pmutil.h198
-rw-r--r--3rdparty/portmidi/pm_common/portmidi-dynamic.vcproj179
-rw-r--r--3rdparty/portmidi/pm_common/portmidi-static.vcproj141
-rw-r--r--3rdparty/portmidi/pm_common/portmidi.c720
-rw-r--r--3rdparty/portmidi/pm_common/portmidi.h908
-rw-r--r--3rdparty/portmidi/pm_csharp/README.txt20
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp40
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/ReadMe.txt31
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.cpp5
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.h7
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/app.icobin1078 -> 0 bytes-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/app.rc63
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.cpp6
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.h53
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.vcproj260
-rw-r--r--3rdparty/portmidi/pm_csharp/pm_managed/resource.h3
-rw-r--r--3rdparty/portmidi/pm_dylib/CMakeLists.txt127
-rw-r--r--3rdparty/portmidi/pm_dylib/README.txt11
-rw-r--r--3rdparty/portmidi/pm_dylib/portmidi-dynamic.vcproj158
-rw-r--r--3rdparty/portmidi/pm_haiku/pmhaiku.cpp514
-rw-r--r--3rdparty/portmidi/pm_java/CMakeLists.txt129
-rw-r--r--3rdparty/portmidi/pm_java/JavaExe.exebin131072 -> 0 bytes-rw-r--r--3rdparty/portmidi/pm_java/README.txt85
-rw-r--r--3rdparty/portmidi/pm_java/UpdateRsrcJavaExe.exebin102400 -> 0 bytes-rw-r--r--3rdparty/portmidi/pm_java/jportmidi/JPortMidi.java2
-rw-r--r--3rdparty/portmidi/pm_java/mac-make.sh26
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults-setup-script.iss44
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/PmDefaults.java8
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/README.txt19
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults9
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-license.txt2
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.bat1
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/readme-win32.txt11
-rw-r--r--3rdparty/portmidi/pm_java/pmjni/pmjni-VC8.vcproj225
-rw-r--r--3rdparty/portmidi/pm_java/pmjni/pmjni.c4
-rw-r--r--3rdparty/portmidi/pm_java/setup/pmdefaults-setup.exebin485013 -> 0 bytes-rw-r--r--3rdparty/portmidi/pm_linux/README_LINUX.txt56
-rw-r--r--3rdparty/portmidi/pm_linux/finddefault.c30
-rw-r--r--3rdparty/portmidi/pm_linux/finddefault.h5
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinux.c30
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxalsa.c605
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxnull.c31
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxnull.h6
-rw-r--r--3rdparty/portmidi/pm_mac/Makefile.osx8
-rw-r--r--3rdparty/portmidi/pm_mac/README_MAC.txt231
-rw-r--r--3rdparty/portmidi/pm_mac/finddefault.c4
-rw-r--r--3rdparty/portmidi/pm_mac/osxsupport.h18
-rw-r--r--3rdparty/portmidi/pm_mac/osxsupport.m37
-rw-r--r--3rdparty/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj594
-rw-r--r--3rdparty/portmidi/pm_mac/pmdefaults/make/build.xml87
-rw-r--r--3rdparty/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh31
-rw-r--r--3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf14
-rw-r--r--3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.stringsbin220 -> 0 bytes-rw-r--r--3rdparty/portmidi/pm_mac/pmdefaults/resources/Info.plist40
-rw-r--r--3rdparty/portmidi/pm_mac/pmdefaults/resources/Manifest1
-rw-r--r--3rdparty/portmidi/pm_mac/pmmac.c7
-rw-r--r--3rdparty/portmidi/pm_mac/pmmac.h2
-rw-r--r--3rdparty/portmidi/pm_mac/pmmacosxcm.c1310
-rw-r--r--3rdparty/portmidi/pm_mac/pmmacosxcm.h2
-rw-r--r--3rdparty/portmidi/pm_mac/readbinaryplist.c159
-rw-r--r--3rdparty/portmidi/pm_mac/readbinaryplist.h10
-rw-r--r--3rdparty/portmidi/pm_mingw/README-MINGW.txt11
-rw-r--r--3rdparty/portmidi/pm_mingw/eclipse/README.txt23
-rw-r--r--3rdparty/portmidi/pm_mingw/eclipse/dot-cproject710
-rw-r--r--3rdparty/portmidi/pm_mingw/eclipse/dot-project69
-rw-r--r--3rdparty/portmidi/pm_mingw/msys/README-MSYS.txt8
-rw-r--r--3rdparty/portmidi/pm_python/README_PYTHON.txt34
-rw-r--r--3rdparty/portmidi/pm_python/pyportmidi/__init__.py3
-rw-r--r--3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.c5663
-rw-r--r--3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.pyx537
-rw-r--r--3rdparty/portmidi/pm_python/pyportmidi/midi.py566
-rw-r--r--3rdparty/portmidi/pm_python/setup.py185
-rw-r--r--3rdparty/portmidi/pm_qt/README_QT.txt15
-rw-r--r--3rdparty/portmidi/pm_qt/portmidi.pro47
-rw-r--r--3rdparty/portmidi/pm_test/CMakeLists.txt52
-rw-r--r--3rdparty/portmidi/pm_test/README.txt376
-rw-r--r--3rdparty/portmidi/pm_test/fast.c290
-rw-r--r--3rdparty/portmidi/pm_test/fastrcv.c255
-rw-r--r--3rdparty/portmidi/pm_test/latency.c25
-rw-r--r--3rdparty/portmidi/pm_test/latency.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/midiclock.c23
-rw-r--r--3rdparty/portmidi/pm_test/midiclock.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/midithread.c60
-rw-r--r--3rdparty/portmidi/pm_test/midithread.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/midithru.c211
-rw-r--r--3rdparty/portmidi/pm_test/midithru.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/mm.c31
-rw-r--r--3rdparty/portmidi/pm_test/mm.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/multivirtual.c224
-rw-r--r--3rdparty/portmidi/pm_test/pmlist.c63
-rw-r--r--3rdparty/portmidi/pm_test/qtest.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/recvvirtual.c125
-rw-r--r--3rdparty/portmidi/pm_test/sendvirtual.c148
-rw-r--r--3rdparty/portmidi/pm_test/sysex.c84
-rw-r--r--3rdparty/portmidi/pm_test/sysex.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/test.c489
-rw-r--r--3rdparty/portmidi/pm_test/test.vcproj148
-rw-r--r--3rdparty/portmidi/pm_test/testio.c535
-rw-r--r--3rdparty/portmidi/pm_test/virttest.c339
-rw-r--r--3rdparty/portmidi/pm_win/README_WIN.txt201
-rw-r--r--3rdparty/portmidi/pm_win/clean_cmake.bat6
-rw-r--r--3rdparty/portmidi/pm_win/clean_up_vcproj.awk70
-rw-r--r--3rdparty/portmidi/pm_win/clean_up_vcproj.bat76
-rw-r--r--3rdparty/portmidi/pm_win/pmwin.c46
-rw-r--r--3rdparty/portmidi/pm_win/pmwinmm.c893
-rw-r--r--3rdparty/portmidi/pm_win/pmwinmm.h2
-rw-r--r--3rdparty/portmidi/pm_win/static.cmake8
-rw-r--r--3rdparty/portmidi/portmidi.sln147
-rw-r--r--3rdparty/portmidi/portmidi_cdt.zipbin210271 -> 0 bytes-rw-r--r--3rdparty/portmidi/porttime/porttime-VC8.vcproj225
-rw-r--r--3rdparty/portmidi/porttime/porttime.dsp104
-rw-r--r--3rdparty/portmidi/porttime/porttime.h58
-rw-r--r--3rdparty/portmidi/porttime/porttime.vcproj184
-rw-r--r--3rdparty/portmidi/porttime/pthaiku.cpp88
-rw-r--r--3rdparty/portmidi/porttime/ptlinux.c26
-rw-r--r--3rdparty/portmidi/porttime/ptmacosx_cf.c6
-rw-r--r--3rdparty/portmidi/porttime/ptmacosx_mach.c97
-rw-r--r--3rdparty/portmidi/porttime/ptwinmm.c6
-rw-r--r--3rdparty/softfloat/README.txt78
-rw-r--r--3rdparty/softfloat/f2xm1.c270
-rw-r--r--3rdparty/softfloat/fpatan.c389
-rw-r--r--3rdparty/softfloat/fpu_constant.h80
-rw-r--r--3rdparty/softfloat/fsincos.c645
-rw-r--r--3rdparty/softfloat/fyl2x.c486
-rw-r--r--3rdparty/softfloat/mamesf.h67
-rw-r--r--3rdparty/softfloat/milieu.h42
-rw-r--r--3rdparty/softfloat/softfloat-macros732
-rw-r--r--3rdparty/softfloat/softfloat-specialize470
-rw-r--r--3rdparty/softfloat/softfloat.c4941
-rw-r--r--3rdparty/softfloat/softfloat.h463
-rw-r--r--3rdparty/softfloat3/bochs_ext/f2xm1.c343
-rw-r--r--3rdparty/softfloat3/bochs_ext/isNaN.c69
-rw-r--r--3rdparty/softfloat3/bochs_ext/softfloat3_ext.h8
-rw-r--r--3rdparty/softfloat3/build/MAME/platform.h11
-rw-r--r--3rdparty/sol2/sol/sol.hpp9
-rw-r--r--3rdparty/ymfm/examples/buildall/buildall.cpp (renamed from 3rdparty/ymfm/buildall.cpp)0
-rw-r--r--3rdparty/ymfm/src/ymfm.h58
-rw-r--r--3rdparty/ymfm/src/ymfm_adpcm.cpp444
-rw-r--r--3rdparty/ymfm/src/ymfm_adpcm.h89
-rw-r--r--3rdparty/ymfm/src/ymfm_fm.h4
-rw-r--r--3rdparty/ymfm/src/ymfm_fm.ipp14
-rw-r--r--3rdparty/ymfm/src/ymfm_misc.h1
-rw-r--r--3rdparty/ymfm/src/ymfm_opl.cpp46
-rw-r--r--3rdparty/ymfm/src/ymfm_opl.h4
-rw-r--r--3rdparty/ymfm/src/ymfm_opm.cpp20
-rw-r--r--3rdparty/ymfm/src/ymfm_opn.cpp34
-rw-r--r--3rdparty/ymfm/src/ymfm_opn.h2
-rw-r--r--3rdparty/ymfm/src/ymfm_opq.cpp12
-rw-r--r--3rdparty/ymfm/src/ymfm_opx.h290
-rw-r--r--3rdparty/ymfm/src/ymfm_opz.cpp36
-rw-r--r--3rdparty/ymfm/src/ymfm_pcm.cpp1
-rw-r--r--3rdparty/ymfm/src/ymfm_ssg.h2
-rw-r--r--3rdparty/zlib/CMakeLists.txt43
-rw-r--r--3rdparty/zlib/ChangeLog10
-rw-r--r--3rdparty/zlib/FAQ3
-rw-r--r--3rdparty/zlib/Makefile.in16
-rw-r--r--3rdparty/zlib/README6
-rw-r--r--3rdparty/zlib/configure9
-rw-r--r--3rdparty/zlib/contrib/delphi/ZLib.pas2
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs2
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs2
-rw-r--r--3rdparty/zlib/contrib/infback9/inftree9.c6
-rw-r--r--3rdparty/zlib/contrib/infback9/inftree9.h4
-rw-r--r--3rdparty/zlib/contrib/iostream3/zfstream.h4
-rw-r--r--3rdparty/zlib/contrib/minizip/Makefile2
-rw-r--r--3rdparty/zlib/contrib/minizip/configure.ac2
-rw-r--r--3rdparty/zlib/contrib/minizip/ioapi.h2
-rw-r--r--3rdparty/zlib/contrib/minizip/miniunz.c18
-rw-r--r--3rdparty/zlib/contrib/minizip/unzip.c8
-rw-r--r--3rdparty/zlib/contrib/minizip/unzip.h2
-rw-r--r--3rdparty/zlib/contrib/minizip/zip.c21
-rw-r--r--3rdparty/zlib/contrib/minizip/zip.h4
-rw-r--r--3rdparty/zlib/contrib/nuget/nuget.csproj43
-rw-r--r--3rdparty/zlib/contrib/nuget/nuget.sln22
-rw-r--r--3rdparty/zlib/contrib/pascal/zlibpas.pas2
-rw-r--r--3rdparty/zlib/contrib/puff/puff.c8
-rw-r--r--3rdparty/zlib/contrib/vstudio/readme.txt10
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibvc.def2
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlibvc.def2
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlibvc.def2
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibvc.def2
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/miniunz.vcxproj409
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/minizip.vcxproj405
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/testzlib.vcxproj473
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj409
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibstat.vcxproj602
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibvc.sln179
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibvc.vcxproj875
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlibvc.def2
-rw-r--r--3rdparty/zlib/deflate.c47
-rw-r--r--3rdparty/zlib/deflate.h35
-rw-r--r--3rdparty/zlib/doc/algorithm.txt2
-rw-r--r--3rdparty/zlib/examples/gzlog.c4
-rw-r--r--3rdparty/zlib/examples/zran.c2
-rw-r--r--3rdparty/zlib/gzguts.h8
-rw-r--r--3rdparty/zlib/gzlib.c12
-rw-r--r--3rdparty/zlib/inflate.c2
-rw-r--r--3rdparty/zlib/inftrees.c6
-rw-r--r--3rdparty/zlib/inftrees.h4
-rw-r--r--3rdparty/zlib/old/visual-basic.txt2
-rw-r--r--3rdparty/zlib/os400/README4002
-rw-r--r--3rdparty/zlib/os400/zlib.inc6
-rw-r--r--3rdparty/zlib/qnx/package.qpg10
-rw-r--r--3rdparty/zlib/test/example.c25
-rw-r--r--3rdparty/zlib/test/minigzip.c32
-rw-r--r--3rdparty/zlib/treebuild.xml4
-rw-r--r--3rdparty/zlib/trees.c20
-rw-r--r--3rdparty/zlib/win32/DLL_FAQ.txt20
-rw-r--r--3rdparty/zlib/win32/README-WIN32.txt8
-rw-r--r--3rdparty/zlib/zconf.h10
-rw-r--r--3rdparty/zlib/zconf.h.cmakein10
-rw-r--r--3rdparty/zlib/zconf.h.in10
-rw-r--r--3rdparty/zlib/zlib.36
-rw-r--r--3rdparty/zlib/zlib.3.pdfbin19505 -> 25523 bytes-rw-r--r--3rdparty/zlib/zlib.h22
-rw-r--r--3rdparty/zlib/zutil.h27
-rw-r--r--COPYING9
-rw-r--r--README.md65
-rw-r--r--android-project/LICENSE42
-rw-r--r--android-project/app/src/main/AndroidManifest.xml4
-rw-r--r--ctrlr/hotrod.cfg1
-rw-r--r--ctrlr/hotrodse.cfg1
-rw-r--r--ctrlr/scorpionxg.cfg1
-rw-r--r--ctrlr/slikstik.cfg1
-rw-r--r--ctrlr/xarcade.cfg1
-rw-r--r--dist.mak94
-rw-r--r--docs/Makefile4
-rw-r--r--docs/man/mame.664
-rw-r--r--docs/source/advanced/bgfx.rst17
-rw-r--r--docs/source/advanced/ctrlr_config.rst18
-rw-r--r--docs/source/advanced/glsl.rst2
-rw-r--r--docs/source/advanced/hlsl.rst2
-rw-r--r--docs/source/advanced/linux-lightguns.rst91
-rw-r--r--docs/source/advanced/multiconfig.rst24
-rw-r--r--docs/source/advanced/paths.rst2
-rw-r--r--docs/source/commandline/commandline-all.rst361
-rw-r--r--docs/source/commandline/commandline-index.rst13
-rw-r--r--docs/source/conf.py8
-rw-r--r--docs/source/contributing/index.rst11
-rw-r--r--docs/source/contributing/softlist.rst8
-rw-r--r--docs/source/debugger/exceptionpoint.rst74
-rw-r--r--docs/source/debugger/index.rst5
-rw-r--r--docs/source/debugger/memory.rst17
-rw-r--r--docs/source/initialsetup/compilingmame.rst299
-rw-r--r--docs/source/initialsetup/mameintro.rst22
-rw-r--r--docs/source/license.rst2
-rw-r--r--docs/source/luascript/ref-common.rst6
-rw-r--r--docs/source/luascript/ref-core.rst7
-rw-r--r--docs/source/luascript/ref-devices.rst110
-rw-r--r--docs/source/luascript/ref-input.rst50
-rw-r--r--docs/source/luascript/ref-mem.rst6
-rw-r--r--docs/source/plugins/autofire.rst16
-rw-r--r--docs/source/plugins/data.rst2
-rw-r--r--docs/source/plugins/index.rst1
-rw-r--r--docs/source/plugins/inputmacro.rst126
-rw-r--r--docs/source/plugins/offscreenreload.rst90
-rw-r--r--docs/source/techspecs/audio_effects.rst147
-rw-r--r--docs/source/techspecs/cpu_device.rst68
-rw-r--r--docs/source/techspecs/device_sound_interface.rst319
-rw-r--r--docs/source/techspecs/floppy.rst4
-rw-r--r--docs/source/techspecs/index.rst4
-rw-r--r--docs/source/techspecs/layout_files.rst46
-rw-r--r--docs/source/techspecs/m6502.rst6
-rw-r--r--docs/source/techspecs/memory.rst4
-rw-r--r--docs/source/techspecs/nscsi.rst2
-rw-r--r--docs/source/techspecs/osd_audio.rst363
-rw-r--r--docs/source/techspecs/poly_manager.rst4
-rw-r--r--docs/source/techspecs/uml_instructions.rst4457
-rw-r--r--docs/source/tools/floptool.rst6
-rw-r--r--docs/source/usingmame/defaultkeys.rst58
-rw-r--r--docs/source/usingmame/frontends.rst11
-rw-r--r--docs/source/usingmame/mamemenus.rst191
-rw-r--r--docs/source/usingmame/usingmame.rst2
-rw-r--r--docs/source/whatis.rst2
-rwxr-xr-xdocs/update.sh2
-rw-r--r--hash/32x.xml114
-rw-r--r--hash/3do.xml96
-rw-r--r--hash/3do_m2.xml10
-rw-r--r--hash/a2600.xml116
-rw-r--r--hash/a2600_cass.xml24
-rw-r--r--hash/a7800.xml1135
-rw-r--r--hash/a800.xml2
-rw-r--r--hash/a800_flop.xml3
-rw-r--r--hash/abc1600_flop.xml76
-rw-r--r--hash/abc1600_hdd.xml25
-rw-r--r--hash/abc832_flop.xml56
-rw-r--r--hash/adam_cass.xml2
-rw-r--r--hash/aim65_cart.xml2
-rw-r--r--hash/alice90.xml2
-rw-r--r--hash/amiga_a1000.xml177
-rw-r--r--hash/amiga_a3000.xml157
-rw-r--r--hash/amiga_amix.xml118
-rw-r--r--hash/amiga_apps.xml2
-rw-r--r--hash/amiga_cd.xml347
-rw-r--r--hash/amiga_demos.xml32
-rw-r--r--hash/amiga_flop.xml1382
-rw-r--r--hash/amiga_hardware.xml179
-rw-r--r--hash/amiga_workbench.xml1084
-rw-r--r--hash/amigaaga_flop.xml23
-rw-r--r--hash/amigaocs_flop.xml239
-rw-r--r--hash/apfimag_cass.xml24
-rw-r--r--hash/apfm1000.xml2
-rw-r--r--hash/apogee.xml2
-rw-r--r--hash/apple1.xml22
-rw-r--r--hash/apple2_cass.xml927
-rw-r--r--hash/apple2_flop_clcracked.xml59296
-rw-r--r--hash/apple2_flop_misc.xml1678
-rw-r--r--hash/apple2_flop_orig.xml48290
-rw-r--r--hash/apple2_rom.xml45
-rw-r--r--hash/apple2gs_flop_clcracked.xml1383
-rw-r--r--hash/apple2gs_flop_misc.xml1045
-rw-r--r--hash/apple2gs_flop_orig.xml1825
-rw-r--r--hash/apple3.xml2
-rw-r--r--hash/aquarius_cass.xml10
-rw-r--r--hash/arcadia.xml16
-rw-r--r--hash/atom_rom.xml2
-rw-r--r--hash/attache.xml2
-rw-r--r--hash/bbc_cass.xml48
-rw-r--r--hash/bbc_flop_32016.xml28
-rw-r--r--hash/bbc_flop_arm.xml228
-rw-r--r--hash/bbc_rom.xml966
-rw-r--r--hash/bbc_vsm.xml80
-rw-r--r--hash/bbcbc.xml4
-rw-r--r--hash/bmjr_cass.xml22
-rw-r--r--hash/bml3_cass.xml37
-rw-r--r--hash/bml3_flop.xml23
-rw-r--r--hash/c64_cart.xml96
-rw-r--r--hash/c64_cass.xml6
-rw-r--r--hash/c64_flop_orig.xml568
-rw-r--r--hash/casio_rompack.xml2339
-rw-r--r--hash/cassvisn_cart.xml215
-rw-r--r--hash/cbm2_flop.xml8
-rw-r--r--hash/cbm8296_flop.xml18
-rw-r--r--hash/cd32.xml6
-rw-r--r--hash/cdi.xml1432
-rw-r--r--hash/cdtv.xml565
-rw-r--r--hash/cgenie_cass.xml2
-rw-r--r--hash/coco_cart.xml9
-rw-r--r--hash/coco_flop.xml8
-rw-r--r--hash/coleco.xml30
-rw-r--r--hash/coleco_homebrew.xml666
-rw-r--r--hash/cpc_cass.xml590
-rw-r--r--hash/cpc_flop.xml1090
-rw-r--r--hash/crvision.xml62
-rw-r--r--hash/database.xml2
-rw-r--r--hash/dc.xml56
-rw-r--r--hash/dmv.xml126
-rw-r--r--hash/dragon_cass.xml150
-rw-r--r--hash/dragon_flex.xml4
-rw-r--r--hash/dragon_flop.xml4
-rw-r--r--hash/duelmast_cart.xml28
-rw-r--r--hash/ekara_cart.xml685
-rw-r--r--hash/electron_cass.xml42
-rw-r--r--hash/ep64_cart.xml2
-rw-r--r--hash/ep64_flop.xml152
-rw-r--r--hash/evio.xml57
-rw-r--r--hash/famicom_flop.xml32
-rw-r--r--hash/fidel_scc.xml65
-rw-r--r--hash/fm77av.xml36
-rw-r--r--hash/fm7_cass.xml18
-rw-r--r--hash/fm7_disk.xml46
-rw-r--r--hash/fmtowns_cd.xml2680
-rw-r--r--hash/fmtowns_flop_misc.xml2
-rw-r--r--hash/gaelco_ds5002fp_rom.xml108
-rw-r--r--hash/galaxy.xml12
-rw-r--r--hash/gamegear.xml18
-rw-r--r--hash/gba.xml364
-rw-r--r--hash/gbcolor.xml214
-rw-r--r--hash/generic_cdrom.xml1228
-rw-r--r--hash/generic_flop_525.xml131
-rw-r--r--hash/ggm.xml30
-rw-r--r--hash/gp32.xml7
-rw-r--r--hash/h88_cass.xml21
-rw-r--r--hash/hikara.xml52
-rw-r--r--hash/horizon.xml4
-rw-r--r--hash/hp98x6_rom.xml46
-rw-r--r--hash/hyperscan.xml2
-rw-r--r--hash/hyperscan_card.xml2
-rw-r--r--hash/ibm5150.xml635
-rw-r--r--hash/ibm5150_hdd.xml11
-rw-r--r--hash/ibm5170.xml1690
-rw-r--r--hash/ibm5170_cdrom.xml3458
-rw-r--r--hash/ibm5170_hdd.xml37
-rw-r--r--hash/ibmpc110.xml43
-rw-r--r--hash/ibmpcjr_flop.xml12
-rw-r--r--hash/ibmpcjx.xml61
-rw-r--r--hash/jaguar.xml639
-rw-r--r--hash/jakks_gamekey_dp.xml2
-rw-r--r--hash/jakks_gamekey_dy.xml2
-rw-r--r--hash/jakks_gamekey_mv.xml2
-rw-r--r--hash/jakks_gamekey_nk.xml4
-rw-r--r--hash/jakks_gamekey_nm.xml6
-rw-r--r--hash/jakks_gamekey_sw.xml2
-rw-r--r--hash/jakks_gamekey_wp.xml29
-rw-r--r--hash/jazz.xml32
-rw-r--r--hash/juicebox.xml282
-rw-r--r--hash/juku.xml115
-rw-r--r--hash/k28.xml9
-rw-r--r--hash/k28o.xml35
-rw-r--r--hash/kc_cass.xml2
-rw-r--r--hash/kc_flop.xml4
-rw-r--r--hash/kim1_cass.xml72
-rw-r--r--hash/leapfrog_leappad_cart.xml293
-rw-r--r--hash/lisa.xml12
-rw-r--r--hash/lk3000.xml4
-rw-r--r--hash/lnux4004.xml20
-rw-r--r--hash/lviv.xml2
-rw-r--r--hash/lynx.xml4
-rw-r--r--hash/m3.xml20
-rw-r--r--hash/m5_cart.xml73
-rw-r--r--hash/m5_cass.xml214
-rw-r--r--hash/m5_flop.xml11
-rw-r--r--hash/mac_cdrom.xml118
-rw-r--r--hash/mac_flop_clcracked.xml1094
-rw-r--r--hash/mac_flop_orig.xml2495
-rw-r--r--hash/mbc200.xml2
-rw-r--r--hash/mbc55x.xml5
-rw-r--r--hash/mbee_quik.xml14
-rw-r--r--hash/mc10.xml12
-rw-r--r--hash/megacd.xml16845
-rw-r--r--hash/megacdj.xml5673
-rw-r--r--hash/megadriv.xml4862
-rw-r--r--hash/mephisto_smondial2.xml2
-rw-r--r--hash/microbox2_flop.xml31
-rw-r--r--hash/microvision.xml6
-rw-r--r--hash/mikro80.xml2
-rw-r--r--hash/mikrosha_cass.xml2
-rw-r--r--hash/mm2_flop.xml2
-rw-r--r--hash/mm2_hdd.xml21
-rw-r--r--hash/mo5_cart.xml101
-rw-r--r--hash/mo5_cass.xml2333
-rw-r--r--hash/mo5_flop.xml2
-rw-r--r--hash/mo6_cass.xml524
-rw-r--r--hash/mo6_flop.xml34
-rw-r--r--hash/mpc3000_flop.xml87
-rw-r--r--hash/mpc60_flop.xml370
-rw-r--r--hash/msx1_cart.xml495
-rw-r--r--hash/msx1_cass.xml32
-rw-r--r--hash/msx1_flop.xml3
-rw-r--r--hash/msx2_cart.xml15
-rw-r--r--hash/msx2_flop.xml23
-rw-r--r--hash/mt65_rom.xml8
-rw-r--r--hash/mz2000_cass.xml459
-rw-r--r--hash/mz2000_flop.xml33
-rw-r--r--hash/mz2000_snap.xml188
-rw-r--r--hash/mz2200_cass.xml124
-rw-r--r--hash/mz2500.xml880
-rw-r--r--hash/mz2500_flop.xml1273
-rw-r--r--hash/mz5500_flop.xml96
-rw-r--r--hash/mz800_rom.xml52
-rw-r--r--hash/mz80b_cass.xml118
-rw-r--r--hash/mz80b_flop.xml55
-rw-r--r--hash/mz80k_cass.xml508
-rw-r--r--hash/n64.xml13
-rw-r--r--hash/n64_lodgenet.xml4
-rw-r--r--hash/neocd.xml238
-rw-r--r--hash/neogeo.xml651
-rw-r--r--hash/nes.xml595
-rw-r--r--hash/nes_kstudio.xml4
-rw-r--r--hash/nes_ntbrom.xml4
-rw-r--r--hash/orao.xml4
-rw-r--r--hash/oric1_cass.xml690
-rw-r--r--hash/orina_stylish_plus_cart.xml21
-rw-r--r--hash/orion_flop.xml2
-rw-r--r--hash/osborne1.xml6
-rw-r--r--hash/p2000_cart.xml632
-rw-r--r--hash/p2000_cass.xml2257
-rw-r--r--hash/pasogo.xml16
-rw-r--r--hash/pasopia7_cass.xml54
-rw-r--r--hash/pc1000.xml22
-rw-r--r--hash/pc100_flop.xml110
-rw-r--r--hash/pc6001_cart.xml77
-rw-r--r--hash/pc6001_cass.xml226
-rw-r--r--hash/pc6001mk2_cass.xml265
-rw-r--r--hash/pc8801_cass.xml224
-rw-r--r--hash/pc8801_cdrom.xml141
-rw-r--r--hash/pc8801_flop.xml347
-rw-r--r--hash/pc88va.xml469
-rw-r--r--hash/pc88va_flop_orig.xml125
-rw-r--r--hash/pc98.xml20398
-rw-r--r--hash/pc98_cd.xml304
-rw-r--r--hash/pc98_flop_orig.xml189
-rw-r--r--hash/pc98_hdd.xml27
-rw-r--r--hash/pce_tourvision.xml2
-rw-r--r--hash/pcecd.xml1036
-rw-r--r--hash/pcfx.xml177
-rw-r--r--hash/pegasus_cart.xml2
-rw-r--r--hash/pencil2.xml82
-rw-r--r--hash/pencil2_cass.xml183
-rw-r--r--hash/photo_cd.xml39
-rw-r--r--hash/picno.xml95
-rw-r--r--hash/pippin.xml556
-rw-r--r--hash/pippin_flop.xml4
-rw-r--r--hash/pls1000_cart.xml78
-rw-r--r--hash/plus4_cart.xml8
-rw-r--r--hash/plus4_cass.xml14
-rw-r--r--hash/plus4_flop.xml11
-rw-r--r--hash/plus4_quik.xml33
-rw-r--r--hash/pmd85_cass.xml4
-rw-r--r--hash/pokemini.xml2
-rw-r--r--hash/polysix.xml26
-rw-r--r--hash/popstar_cart.xml43
-rw-r--r--hash/precur2w_cart.xml21
-rw-r--r--hash/princ.xml2
-rw-r--r--hash/pro128_cart.xml4
-rw-r--r--hash/pro128_cass.xml194
-rw-r--r--hash/psion1.xml29
-rw-r--r--hash/psion2.xml1345
-rw-r--r--hash/psion_flop.xml37
-rw-r--r--hash/psion_quik.xml171
-rw-r--r--hash/psion_ssd.xml83
-rw-r--r--hash/psx.xml14815
-rw-r--r--hash/pv1000.xml252
-rw-r--r--hash/pv2000.xml243
-rw-r--r--hash/r8_card.xml113
-rw-r--r--hash/radio86_cass.xml8
-rw-r--r--hash/roland_tnsc2.xml2
-rw-r--r--hash/s2000_flop.xml18
-rw-r--r--hash/s3000_cdrom.xml95
-rw-r--r--hash/samcoupe_cass.xml2
-rw-r--r--hash/samcoupe_flop.xml367
-rw-r--r--hash/sat_cart.xml83
-rw-r--r--hash/sat_vccart.xml82
-rw-r--r--hash/saturn.xml6320
-rw-r--r--hash/sc3000_cart.xml97
-rw-r--r--hash/sc3000_cass.xml280
-rw-r--r--hash/scv.xml219
-rw-r--r--hash/sd132_flop.xml80
-rw-r--r--hash/sd1_flop.xml20
-rw-r--r--hash/sega_beena_cart.xml932
-rw-r--r--hash/segacd.xml6065
-rw-r--r--hash/sg1000.xml28
-rw-r--r--hash/sgi_mips.xml8
-rw-r--r--hash/sgx.xml2
-rw-r--r--hash/smartcycle_cart.xml152
-rw-r--r--hash/smc777.xml1941
-rw-r--r--hash/sms.xml27
-rw-r--r--hash/snes.xml451
-rw-r--r--hash/snotec.xml168
-rw-r--r--hash/snread.xml12
-rw-r--r--hash/sorcerer_cass.xml67
-rw-r--r--hash/spc1000_cass.xml26
-rw-r--r--hash/spc1500_cass.xml2
-rw-r--r--hash/specnext_sd.xml38
-rw-r--r--hash/specpls3_flop.xml62
-rw-r--r--hash/spectrum_betadisc_flop.xml705
-rw-r--r--hash/spectrum_cass.xml15717
-rw-r--r--hash/squale_cart.xml33
-rw-r--r--hash/st_flop.xml53
-rw-r--r--hash/st_flop_demos.xml107
-rw-r--r--hash/sun_sparc.xml93
-rw-r--r--hash/super_tv_pc_cart.xml20
-rw-r--r--hash/supracan.xml218
-rw-r--r--hash/t1000.xml4
-rw-r--r--hash/takara_daigunder_dx_cart.xml90
-rw-r--r--hash/tdv2324.xml2
-rw-r--r--hash/telestory_cart.xml55
-rw-r--r--hash/teradrive_flop.xml121
-rw-r--r--hash/teradrive_hdd.xml29
-rw-r--r--hash/thinkpad8xx.xml147
-rw-r--r--hash/to770_cart.xml4
-rw-r--r--hash/to770a_cart.xml3
-rw-r--r--hash/to7_cart.xml132
-rw-r--r--hash/to7_cass.xml695
-rw-r--r--hash/to8_cass.xml18
-rw-r--r--hash/to_flop.xml521
-rw-r--r--hash/trs80_cass.xml12
-rw-r--r--hash/tsconf.xml461
-rw-r--r--hash/tsconf_betadisc_flop.xml30
-rw-r--r--hash/tvc_cass.xml116
-rw-r--r--hash/tvc_flop.xml266
-rw-r--r--hash/tvdear.xml41
-rw-r--r--hash/tvgogo.xml39
-rw-r--r--hash/tvochken.xml100
-rw-r--r--hash/u110_card.xml54
-rw-r--r--hash/vboy.xml3
-rw-r--r--hash/vfxsd_flop.xml32
-rw-r--r--hash/vg5k.xml98
-rw-r--r--hash/vgmplay.xml44
-rw-r--r--hash/vic1001_cart.xml48
-rw-r--r--hash/videopac.xml81
-rw-r--r--hash/vtech_innotab_cart.xml154
-rw-r--r--hash/vz_cass.xml4
-rw-r--r--hash/vz_snap.xml15
-rw-r--r--hash/wren_flop.xml63
-rw-r--r--hash/x07_cass.xml6
-rw-r--r--hash/x1_cass.xml78
-rw-r--r--hash/x1_flop.xml45
-rw-r--r--hash/x37_flop.xml73
-rw-r--r--hash/x37_hdd.xml21
-rw-r--r--hash/x68k_flop.xml378
-rw-r--r--hash/yeno_laptop_cart.xml30
-rw-r--r--hash/zorba.xml2
-rw-r--r--hash/zx81_cass.xml4564
-rw-r--r--language/Afrikaans/strings.po2
-rw-r--r--language/Albanian/strings.po2
-rw-r--r--language/Arabic/strings.po2
-rw-r--r--language/Basque/strings.po2
-rw-r--r--language/Belarusian/strings.po2526
-rw-r--r--language/Bosnian/strings.po2
-rw-r--r--language/Bulgarian/strings.po2
-rw-r--r--language/Burmese/strings.po2
-rw-r--r--language/Catalan/strings.po2
-rw-r--r--language/Chinese_Simplified/strings.po362
-rw-r--r--language/Chinese_Traditional/strings.po8
-rw-r--r--language/Croatian/strings.po2
-rw-r--r--language/Czech/strings.po2
-rw-r--r--language/Danish/strings.po2
-rw-r--r--language/Dutch/strings.po2
-rw-r--r--language/English/strings.po2
-rw-r--r--language/Estonian/strings.po2
-rw-r--r--language/Finnish/strings.po2
-rw-r--r--language/French/strings.po2
-rw-r--r--language/French_Belgium/strings.po2
-rw-r--r--language/French_Canada/strings.po2
-rw-r--r--language/Georgian/strings.po2
-rw-r--r--language/German/strings.po2
-rw-r--r--language/Greek/strings.po2
-rw-r--r--language/Hebrew/strings.po2
-rw-r--r--language/Hindi/strings.po2
-rw-r--r--language/Indonesian/strings.po2
-rw-r--r--language/Italian/strings.po2
-rw-r--r--language/Japanese/strings.po8340
-rw-r--r--language/Korean/strings.po2
-rw-r--r--language/Latvian/strings.po2
-rw-r--r--language/Lithuanian/strings.po2
-rw-r--r--language/Macedonian/strings.po2
-rw-r--r--language/Norwegian/strings.po2
-rw-r--r--language/Persian/strings.po2
-rw-r--r--language/Polish/strings.po2620
-rw-r--r--language/Portuguese/strings.po2
-rw-r--r--language/Portuguese_Brazil/strings.po2
-rw-r--r--language/Romanian/strings.po2
-rw-r--r--language/Russian/strings.po2
-rw-r--r--language/Serbian/strings.po2
-rw-r--r--language/Serbian_Cyrillic/strings.po2
-rw-r--r--language/Slovak/strings.po2
-rw-r--r--language/Slovenian/strings.po2
-rw-r--r--language/Spanish/strings.po2
-rw-r--r--language/Spanish_Mexico/strings.po2
-rw-r--r--language/Swedish/strings.po7531
-rw-r--r--language/Thai/strings.po2
-rw-r--r--language/Turkish/strings.po2
-rw-r--r--language/Ukrainian/strings.po105
-rw-r--r--language/Vietnamese/strings.po2
-rw-r--r--makefile434
-rw-r--r--plugins/autofire/autofire_menu.lua25
-rw-r--r--plugins/commonui/init.lua2
-rw-r--r--plugins/data/data_mameinfo.lua5
-rw-r--r--plugins/data/data_messinfo.lua5
-rw-r--r--plugins/hiscore/hiscore.dat1165
-rw-r--r--plugins/hiscore/init.lua316
-rw-r--r--plugins/inputmacro/init.lua12
-rw-r--r--plugins/inputmacro/inputmacro_menu.lua201
-rw-r--r--plugins/inputmacro/inputmacro_persist.lua6
-rw-r--r--plugins/inputmacro/plugin.json2
-rw-r--r--plugins/offscreenreload/init.lua96
-rw-r--r--plugins/offscreenreload/offscreenreload_menu.lua418
-rw-r--r--plugins/offscreenreload/offscreenreload_persist.lua133
-rw-r--r--plugins/offscreenreload/plugin.json10
-rw-r--r--plugins/vector/init.lua45
-rw-r--r--plugins/vector/plugin.json10
-rw-r--r--samples/MM1_keyboard/beep.wavbin16758 -> 0 bytes-rw-r--r--samples/MM1_keyboard/power_switch.wavbin74492 -> 0 bytes-rwxr-xr-xscripts/build/check_include_guards.py51
-rwxr-xr-xscripts/build/complay.py32
-rwxr-xr-xscripts/build/llvm-objdump-filter.py44
-rw-r--r--scripts/build/msgfmt.py2
-rw-r--r--scripts/build/verinfo.py2
-rw-r--r--scripts/genie.lua284
-rw-r--r--scripts/minimaws/lib/__init__.py2
-rw-r--r--scripts/minimaws/lib/assets/common.js1
-rw-r--r--scripts/minimaws/lib/assets/digest.js1
-rw-r--r--scripts/minimaws/lib/assets/machine.js1
-rw-r--r--scripts/minimaws/lib/assets/romident.js1
-rw-r--r--scripts/minimaws/lib/auxverbs.py4
-rw-r--r--scripts/minimaws/lib/dbaccess.py20
-rw-r--r--scripts/minimaws/lib/htmltmpl.py2
-rw-r--r--scripts/minimaws/lib/lxparse.py26
-rw-r--r--scripts/minimaws/lib/wsgiserve.py92
-rwxr-xr-xscripts/minimaws/minimaws.py2
-rwxr-xr-xscripts/src/3rdparty.lua599
-rw-r--r--scripts/src/bus.lua6259
-rw-r--r--scripts/src/cpu.lua490
-rw-r--r--scripts/src/devices.lua1
-rw-r--r--scripts/src/emu.lua29
-rw-r--r--scripts/src/formats.lua76
-rw-r--r--scripts/src/lib.lua6
-rw-r--r--scripts/src/machine.lua1455
-rw-r--r--scripts/src/main.lua40
-rw-r--r--scripts/src/mame/frontend.lua20
-rw-r--r--scripts/src/osd/mac.lua4
-rw-r--r--scripts/src/osd/modules.lua153
-rw-r--r--scripts/src/osd/sdl.lua30
-rw-r--r--scripts/src/osd/sdl3.lua476
-rw-r--r--scripts/src/osd/sdl3_cfg.lua166
-rw-r--r--scripts/src/osd/sdl_cfg.lua14
-rw-r--r--scripts/src/osd/windows.lua25
-rw-r--r--scripts/src/osd/windows_cfg.lua24
-rw-r--r--scripts/src/sound.lua569
-rw-r--r--scripts/src/tools.lua77
-rw-r--r--scripts/src/video.lua833
-rw-r--r--scripts/target/mame/mame.lua2
-rw-r--r--scripts/target/mame/tiny.lua7
-rw-r--r--scripts/toolchain.lua69
-rw-r--r--scripts/xslt/list-system-sources.xslt2
-rw-r--r--src/devices/bus/a1bus/a1bus.h17
-rw-r--r--src/devices/bus/a1bus/a1cassette.cpp8
-rw-r--r--src/devices/bus/a1bus/a1cffa.cpp8
-rw-r--r--src/devices/bus/a2bus/4play.cpp20
-rw-r--r--src/devices/bus/a2bus/a2alfam2.cpp35
-rw-r--r--src/devices/bus/a2bus/a2applicard.cpp20
-rw-r--r--src/devices/bus/a2bus/a2arcadebd.cpp13
-rw-r--r--src/devices/bus/a2bus/a2bus.cpp29
-rw-r--r--src/devices/bus/a2bus/a2bus.h37
-rw-r--r--src/devices/bus/a2bus/a2cffa.cpp17
-rw-r--r--src/devices/bus/a2bus/a2corvus.h15
-rw-r--r--src/devices/bus/a2bus/a2diskiing.cpp14
-rw-r--r--src/devices/bus/a2bus/a2diskiing.h25
-rw-r--r--src/devices/bus/a2bus/a2dx1.cpp5
-rw-r--r--src/devices/bus/a2bus/a2eauxslot.h10
-rw-r--r--src/devices/bus/a2bus/a2echoii.cpp18
-rw-r--r--src/devices/bus/a2bus/a2eext80col.h11
-rw-r--r--src/devices/bus/a2bus/a2eramworks3.h5
-rw-r--r--src/devices/bus/a2bus/a2estd80col.cpp2
-rw-r--r--src/devices/bus/a2bus/a2estd80col.h5
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.cpp16
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.h10
-rw-r--r--src/devices/bus/a2bus/a2ieee488.cpp195
-rw-r--r--src/devices/bus/a2bus/a2ieee488.h20
-rw-r--r--src/devices/bus/a2bus/a2iwm.cpp5
-rw-r--r--src/devices/bus/a2bus/a2iwm.h11
-rw-r--r--src/devices/bus/a2bus/a2mcms.cpp28
-rw-r--r--src/devices/bus/a2bus/a2mcms.h19
-rw-r--r--src/devices/bus/a2bus/a2memexp.cpp11
-rw-r--r--src/devices/bus/a2bus/a2midi.cpp14
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.cpp38
-rw-r--r--src/devices/bus/a2bus/a2parprn.cpp21
-rw-r--r--src/devices/bus/a2bus/a2pic.cpp29
-rw-r--r--src/devices/bus/a2bus/a2sam.cpp3
-rw-r--r--src/devices/bus/a2bus/a2scsi.cpp33
-rw-r--r--src/devices/bus/a2bus/a2scsi.h10
-rw-r--r--src/devices/bus/a2bus/a2sd.cpp77
-rw-r--r--src/devices/bus/a2bus/a2sd.h49
-rw-r--r--src/devices/bus/a2bus/a2sic.cpp211
-rw-r--r--src/devices/bus/a2bus/a2sic.h12
-rw-r--r--src/devices/bus/a2bus/a2softcard.cpp17
-rw-r--r--src/devices/bus/a2bus/a2softcard.h10
-rw-r--r--src/devices/bus/a2bus/a2ssc.cpp27
-rw-r--r--src/devices/bus/a2bus/a2superdrive.cpp32
-rw-r--r--src/devices/bus/a2bus/a2superdrive.h6
-rw-r--r--src/devices/bus/a2bus/a2swyft.cpp16
-rw-r--r--src/devices/bus/a2bus/a2themill.cpp10
-rw-r--r--src/devices/bus/a2bus/a2themill.h12
-rw-r--r--src/devices/bus/a2bus/a2thunderclock.cpp9
-rw-r--r--src/devices/bus/a2bus/a2ultraterm.cpp144
-rw-r--r--src/devices/bus/a2bus/a2videoterm.cpp93
-rw-r--r--src/devices/bus/a2bus/a2vulcan.cpp23
-rw-r--r--src/devices/bus/a2bus/a2wico_trackball.cpp245
-rw-r--r--src/devices/bus/a2bus/a2wico_trackball.h20
-rw-r--r--src/devices/bus/a2bus/a2zipdrive.cpp13
-rw-r--r--src/devices/bus/a2bus/ace2x00.cpp7
-rw-r--r--src/devices/bus/a2bus/ace2x00.h11
-rw-r--r--src/devices/bus/a2bus/agat7langcard.cpp6
-rw-r--r--src/devices/bus/a2bus/agat7langcard.h5
-rw-r--r--src/devices/bus/a2bus/agat7ports.cpp6
-rw-r--r--src/devices/bus/a2bus/agat7ports.h15
-rw-r--r--src/devices/bus/a2bus/agat7ram.cpp6
-rw-r--r--src/devices/bus/a2bus/agat7ram.h5
-rw-r--r--src/devices/bus/a2bus/agat840k_hle.cpp6
-rw-r--r--src/devices/bus/a2bus/agat840k_hle.h9
-rw-r--r--src/devices/bus/a2bus/agat_fdc.cpp8
-rw-r--r--src/devices/bus/a2bus/agat_fdc.h9
-rw-r--r--src/devices/bus/a2bus/booti.cpp15
-rw-r--r--src/devices/bus/a2bus/byte8251.cpp24
-rw-r--r--src/devices/bus/a2bus/cards.cpp28
-rw-r--r--src/devices/bus/a2bus/ccs7710.cpp50
-rw-r--r--src/devices/bus/a2bus/ccs7710.h39
-rw-r--r--src/devices/bus/a2bus/cmsscsi.cpp10
-rw-r--r--src/devices/bus/a2bus/cmsscsi.h10
-rw-r--r--src/devices/bus/a2bus/computereyes2.cpp6
-rw-r--r--src/devices/bus/a2bus/computereyes2.h6
-rw-r--r--src/devices/bus/a2bus/corvfdc01.cpp5
-rw-r--r--src/devices/bus/a2bus/corvfdc01.h9
-rw-r--r--src/devices/bus/a2bus/corvfdc02.cpp5
-rw-r--r--src/devices/bus/a2bus/corvfdc02.h9
-rw-r--r--src/devices/bus/a2bus/excel9.cpp5
-rw-r--r--src/devices/bus/a2bus/excel9.h11
-rw-r--r--src/devices/bus/a2bus/ezcgi.cpp27
-rw-r--r--src/devices/bus/a2bus/ezcgi.h6
-rw-r--r--src/devices/bus/a2bus/grafex.cpp6
-rw-r--r--src/devices/bus/a2bus/grafex.h6
-rw-r--r--src/devices/bus/a2bus/grappler.cpp49
-rw-r--r--src/devices/bus/a2bus/grappler.h6
-rw-r--r--src/devices/bus/a2bus/ibsap2.cpp184
-rw-r--r--src/devices/bus/a2bus/ibsap2.h19
-rw-r--r--src/devices/bus/a2bus/lancegs.cpp15
-rw-r--r--src/devices/bus/a2bus/laser128.cpp2
-rw-r--r--src/devices/bus/a2bus/laser128.h8
-rw-r--r--src/devices/bus/a2bus/mouse.cpp75
-rw-r--r--src/devices/bus/a2bus/mouse.h6
-rw-r--r--src/devices/bus/a2bus/nippelclock.cpp5
-rw-r--r--src/devices/bus/a2bus/nippelclock.h13
-rw-r--r--src/devices/bus/a2bus/noisemaker.cpp15
-rw-r--r--src/devices/bus/a2bus/pc_xporter.cpp33
-rw-r--r--src/devices/bus/a2bus/prodosromdrive.cpp4
-rw-r--r--src/devices/bus/a2bus/q68.cpp5
-rw-r--r--src/devices/bus/a2bus/q68.h16
-rw-r--r--src/devices/bus/a2bus/ramcard128k.cpp11
-rw-r--r--src/devices/bus/a2bus/ramcard128k.h5
-rw-r--r--src/devices/bus/a2bus/ramcard16k.cpp2
-rw-r--r--src/devices/bus/a2bus/ramcard16k.h4
-rw-r--r--src/devices/bus/a2bus/romcard.cpp44
-rw-r--r--src/devices/bus/a2bus/sider.cpp45
-rw-r--r--src/devices/bus/a2bus/sider.h14
-rw-r--r--src/devices/bus/a2bus/snesmax.cpp5
-rw-r--r--src/devices/bus/a2bus/softcard3.cpp10
-rw-r--r--src/devices/bus/a2bus/softcard3.h15
-rw-r--r--src/devices/bus/a2bus/ssbapple.cpp12
-rw-r--r--src/devices/bus/a2bus/ssprite.cpp13
-rw-r--r--src/devices/bus/a2bus/ssprite.h6
-rw-r--r--src/devices/bus/a2bus/suprterminal.cpp63
-rw-r--r--src/devices/bus/a2bus/sweetalk.cpp73
-rw-r--r--src/devices/bus/a2bus/sweetalk.h12
-rw-r--r--src/devices/bus/a2bus/timemasterho.cpp17
-rw-r--r--src/devices/bus/a2bus/titan3plus2.cpp5
-rw-r--r--src/devices/bus/a2bus/titan3plus2.h7
-rw-r--r--src/devices/bus/a2bus/transwarp.cpp85
-rw-r--r--src/devices/bus/a2bus/transwarp.h52
-rw-r--r--src/devices/bus/a2bus/uniprint.cpp18
-rw-r--r--src/devices/bus/a2bus/uthernet.cpp2
-rw-r--r--src/devices/bus/a2bus/vistaa800.cpp44
-rw-r--r--src/devices/bus/a2gameio/brightpen.cpp140
-rw-r--r--src/devices/bus/a2gameio/brightpen.h18
-rw-r--r--src/devices/bus/a2gameio/computereyes.cpp20
-rw-r--r--src/devices/bus/a2gameio/computereyes.h6
-rw-r--r--src/devices/bus/a2gameio/gameio.cpp19
-rw-r--r--src/devices/bus/a2gameio/gameio.h23
-rw-r--r--src/devices/bus/a2gameio/gizmo.cpp4
-rw-r--r--src/devices/bus/a2gameio/joyport.cpp6
-rw-r--r--src/devices/bus/a2gameio/joyport_paddles.cpp133
-rw-r--r--src/devices/bus/a2gameio/joyport_paddles.h19
-rw-r--r--src/devices/bus/a2gameio/joystick.cpp4
-rw-r--r--src/devices/bus/a2gameio/paddles.cpp4
-rw-r--r--src/devices/bus/a2gameio/wico_joystick.cpp128
-rw-r--r--src/devices/bus/a2gameio/wico_joystick.h20
-rw-r--r--src/devices/bus/a2kbd/a2kbd.cpp132
-rw-r--r--src/devices/bus/a2kbd/a2kbd.h134
-rw-r--r--src/devices/bus/a2kbd/am100kbd.cpp306
-rw-r--r--src/devices/bus/a2kbd/am100kbd.h14
-rw-r--r--src/devices/bus/a2kbd/ivelultrkb.cpp239
-rw-r--r--src/devices/bus/a2kbd/ivelultrkb.h14
-rw-r--r--src/devices/bus/a2kbd/kb200.cpp339
-rw-r--r--src/devices/bus/a2kbd/kb200.h14
-rw-r--r--src/devices/bus/a2kbd/nkbd.cpp424
-rw-r--r--src/devices/bus/a2kbd/nkbd.h14
-rw-r--r--src/devices/bus/a2kbd/tk10.cpp233
-rw-r--r--src/devices/bus/a2kbd/tk10.h14
-rw-r--r--src/devices/bus/a2kbd/videnh2.cpp438
-rw-r--r--src/devices/bus/a2kbd/videnh2.h15
-rw-r--r--src/devices/bus/a7800/a78_slot.h7
-rw-r--r--src/devices/bus/a7800/cpuwiz.h6
-rw-r--r--src/devices/bus/a7800/hiscore.h2
-rw-r--r--src/devices/bus/a7800/rom.h28
-rw-r--r--src/devices/bus/a7800/xboard.h12
-rw-r--r--src/devices/bus/a800/a5200_supercart.h14
-rw-r--r--src/devices/bus/a800/a800_carts.cpp2
-rw-r--r--src/devices/bus/a800/a800_slot.cpp4
-rw-r--r--src/devices/bus/a800/a800_slot.h22
-rw-r--r--src/devices/bus/a800/a8sio.cpp12
-rw-r--r--src/devices/bus/a800/a8sio.h38
-rw-r--r--src/devices/bus/a800/atari1050.cpp16
-rw-r--r--src/devices/bus/a800/atari1050.h16
-rw-r--r--src/devices/bus/a800/atari810.cpp18
-rw-r--r--src/devices/bus/a800/atari810.h16
-rw-r--r--src/devices/bus/a800/atarifdc.cpp (renamed from src/mame/atari/atarifdc.cpp)86
-rw-r--r--src/devices/bus/a800/atarifdc.h78
-rw-r--r--src/devices/bus/a800/atrax.h8
-rw-r--r--src/devices/bus/a800/bbsb.h12
-rw-r--r--src/devices/bus/a800/cassette.h6
-rw-r--r--src/devices/bus/a800/corina.h15
-rw-r--r--src/devices/bus/a800/maxflash.h14
-rw-r--r--src/devices/bus/a800/oss.h22
-rw-r--r--src/devices/bus/a800/phoenix.h20
-rw-r--r--src/devices/bus/a800/rom.h32
-rw-r--r--src/devices/bus/a800/rtime8.h6
-rw-r--r--src/devices/bus/a800/sic.h14
-rw-r--r--src/devices/bus/a800/sparta.h12
-rw-r--r--src/devices/bus/a800/supercharger.h6
-rw-r--r--src/devices/bus/a800/telelink2.cpp2
-rw-r--r--src/devices/bus/a800/telelink2.h10
-rw-r--r--src/devices/bus/a800/ultracart.h8
-rw-r--r--src/devices/bus/a800/williams.h14
-rw-r--r--src/devices/bus/abcbus/abc1656.cpp219
-rw-r--r--src/devices/bus/abcbus/abc1656.h74
-rw-r--r--src/devices/bus/abcbus/abc890.h16
-rw-r--r--src/devices/bus/abcbus/abcbus.cpp6
-rw-r--r--src/devices/bus/abcbus/abcbus.h19
-rw-r--r--src/devices/bus/abcbus/cadmouse.h12
-rw-r--r--src/devices/bus/abcbus/db4105.cpp505
-rw-r--r--src/devices/bus/abcbus/db4105.h85
-rw-r--r--src/devices/bus/abcbus/db4106.h20
-rw-r--r--src/devices/bus/abcbus/db4107.h20
-rw-r--r--src/devices/bus/abcbus/db4112.h20
-rw-r--r--src/devices/bus/abcbus/fd2.h12
-rw-r--r--src/devices/bus/abcbus/lux10828.h20
-rw-r--r--src/devices/bus/abcbus/lux21046.cpp3
-rw-r--r--src/devices/bus/abcbus/lux21046.h34
-rw-r--r--src/devices/bus/abcbus/lux21056.cpp3
-rw-r--r--src/devices/bus/abcbus/lux21056.h14
-rw-r--r--src/devices/bus/abcbus/lux4105.cpp545
-rw-r--r--src/devices/bus/abcbus/lux4105.h89
-rw-r--r--src/devices/bus/abcbus/memcard.h4
-rw-r--r--src/devices/bus/abcbus/ram.h2
-rw-r--r--src/devices/bus/abcbus/sio.h8
-rw-r--r--src/devices/bus/abcbus/slutprov.h6
-rw-r--r--src/devices/bus/abcbus/ssa.h8
-rw-r--r--src/devices/bus/abcbus/uni800.h6
-rw-r--r--src/devices/bus/abcbus/unidisk.h14
-rw-r--r--src/devices/bus/abckb/abc77.cpp4
-rw-r--r--src/devices/bus/abckb/abc77.h16
-rw-r--r--src/devices/bus/abckb/abc800kb.h10
-rw-r--r--src/devices/bus/abckb/abc99.cpp18
-rw-r--r--src/devices/bus/abckb/abc99.h37
-rw-r--r--src/devices/bus/abckb/abckb.h13
-rw-r--r--src/devices/bus/abckb/r8.cpp2
-rw-r--r--src/devices/bus/abckb/r8.h6
-rw-r--r--src/devices/bus/acorn/atom/discpack.cpp84
-rw-r--r--src/devices/bus/acorn/atom/discpack.h46
-rw-r--r--src/devices/bus/acorn/atom/econet.cpp80
-rw-r--r--src/devices/bus/acorn/atom/econet.h38
-rw-r--r--src/devices/bus/acorn/atom/gdos.cpp193
-rw-r--r--src/devices/bus/acorn/atom/gdos.h14
-rw-r--r--src/devices/bus/acorn/atom/gdos2015.cpp257
-rw-r--r--src/devices/bus/acorn/atom/gdos2015.h14
-rw-r--r--src/devices/bus/acorn/atom/mdcr.cpp115
-rw-r--r--src/devices/bus/acorn/atom/mdcr.h14
-rw-r--r--src/devices/bus/acorn/atom/sid.cpp51
-rw-r--r--src/devices/bus/acorn/atom/sid.h35
-rw-r--r--src/devices/bus/acorn/atom/speech.cpp91
-rw-r--r--src/devices/bus/acorn/atom/speech.h14
-rw-r--r--src/devices/bus/acorn/atom/switch.cpp123
-rw-r--r--src/devices/bus/acorn/atom/switch.h14
-rw-r--r--src/devices/bus/acorn/atom/tube.cpp69
-rw-r--r--src/devices/bus/acorn/atom/tube.h14
-rw-r--r--src/devices/bus/acorn/atom/vdu80.cpp144
-rw-r--r--src/devices/bus/acorn/atom/vdu80.h14
-rw-r--r--src/devices/bus/acorn/bus.cpp156
-rw-r--r--src/devices/bus/acorn/bus.h89
-rw-r--r--src/devices/bus/acorn/cms/4080term.cpp113
-rw-r--r--src/devices/bus/acorn/cms/4080term.h48
-rw-r--r--src/devices/bus/acorn/cms/fdc.cpp63
-rw-r--r--src/devices/bus/acorn/cms/fdc.h39
-rw-r--r--src/devices/bus/acorn/cms/hires.cpp74
-rw-r--r--src/devices/bus/acorn/cms/hires.h41
-rw-r--r--src/devices/bus/acorn/cms/ieee.cpp64
-rw-r--r--src/devices/bus/acorn/cms/ieee.h37
-rw-r--r--src/devices/bus/acorn/cu/cubio.cpp208
-rw-r--r--src/devices/bus/acorn/cu/cubio.h13
-rw-r--r--src/devices/bus/acorn/cu/cugraph.cpp193
-rw-r--r--src/devices/bus/acorn/cu/cugraph.h14
-rw-r--r--src/devices/bus/acorn/cu/teletext.cpp197
-rw-r--r--src/devices/bus/acorn/cu/teletext.h13
-rw-r--r--src/devices/bus/acorn/system/32k.cpp78
-rw-r--r--src/devices/bus/acorn/system/32k.h36
-rw-r--r--src/devices/bus/acorn/system/8k.cpp66
-rw-r--r--src/devices/bus/acorn/system/8k.h45
-rw-r--r--src/devices/bus/acorn/system/cass.cpp75
-rw-r--r--src/devices/bus/acorn/system/cass.h44
-rw-r--r--src/devices/bus/acorn/system/econet.cpp78
-rw-r--r--src/devices/bus/acorn/system/econet.h41
-rw-r--r--src/devices/bus/acorn/system/fdc.cpp68
-rw-r--r--src/devices/bus/acorn/system/fdc.h43
-rw-r--r--src/devices/bus/acorn/system/vdu40.cpp79
-rw-r--r--src/devices/bus/acorn/system/vdu40.h46
-rw-r--r--src/devices/bus/acorn/system/vdu80.cpp109
-rw-r--r--src/devices/bus/acorn/system/vdu80.h48
-rw-r--r--src/devices/bus/acorn/system/vib.cpp123
-rw-r--r--src/devices/bus/acorn/system/vib.h54
-rw-r--r--src/devices/bus/adam/adamlink.h2
-rw-r--r--src/devices/bus/adam/exp.h9
-rw-r--r--src/devices/bus/adam/ide.h6
-rw-r--r--src/devices/bus/adam/ram.h2
-rw-r--r--src/devices/bus/adamnet/adamnet.cpp4
-rw-r--r--src/devices/bus/adamnet/adamnet.h17
-rw-r--r--src/devices/bus/adamnet/ddp.h8
-rw-r--r--src/devices/bus/adamnet/fdc.cpp274
-rw-r--r--src/devices/bus/adamnet/fdc.h97
-rw-r--r--src/devices/bus/adamnet/kb.h8
-rw-r--r--src/devices/bus/adamnet/printer.h6
-rw-r--r--src/devices/bus/adamnet/spi.h8
-rw-r--r--src/devices/bus/adb/a9m0330.h12
-rw-r--r--src/devices/bus/adb/a9m0331.h10
-rw-r--r--src/devices/bus/adb/adb.h11
-rw-r--r--src/devices/bus/adb/adbhle.h4
-rw-r--r--src/devices/bus/amiga/cpuslot/a570.cpp194
-rw-r--r--src/devices/bus/amiga/cpuslot/a570.h66
-rw-r--r--src/devices/bus/amiga/cpuslot/a590.cpp271
-rw-r--r--src/devices/bus/amiga/cpuslot/a590.h63
-rw-r--r--src/devices/bus/amiga/cpuslot/action_replay.cpp293
-rw-r--r--src/devices/bus/amiga/cpuslot/action_replay.h106
-rw-r--r--src/devices/bus/amiga/cpuslot/cards.cpp37
-rw-r--r--src/devices/bus/amiga/cpuslot/cards.h22
-rw-r--r--src/devices/bus/amiga/cpuslot/cpuslot.cpp60
-rw-r--r--src/devices/bus/amiga/cpuslot/cpuslot.h151
-rw-r--r--src/devices/bus/amiga/cpuslot/megamix500.cpp150
-rw-r--r--src/devices/bus/amiga/cpuslot/megamix500.h51
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.cpp2
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.h8
-rw-r--r--src/devices/bus/amiga/keyboard/keyboard.h15
-rw-r--r--src/devices/bus/amiga/keyboard/mitsumi.cpp18
-rw-r--r--src/devices/bus/amiga/zorro/a2052.cpp70
-rw-r--r--src/devices/bus/amiga/zorro/a2052.h14
-rw-r--r--src/devices/bus/amiga/zorro/a2058.cpp60
-rw-r--r--src/devices/bus/amiga/zorro/a2058.h11
-rw-r--r--src/devices/bus/amiga/zorro/a2065.cpp139
-rw-r--r--src/devices/bus/amiga/zorro/a2065.h12
-rw-r--r--src/devices/bus/amiga/zorro/a2091.cpp249
-rw-r--r--src/devices/bus/amiga/zorro/a2091.h61
-rw-r--r--src/devices/bus/amiga/zorro/a2232.cpp54
-rw-r--r--src/devices/bus/amiga/zorro/a2232.h8
-rw-r--r--src/devices/bus/amiga/zorro/a590.cpp380
-rw-r--r--src/devices/bus/amiga/zorro/a590.h141
-rw-r--r--src/devices/bus/amiga/zorro/action_replay.cpp153
-rw-r--r--src/devices/bus/amiga/zorro/action_replay.h87
-rw-r--r--src/devices/bus/amiga/zorro/buddha.cpp277
-rw-r--r--src/devices/bus/amiga/zorro/buddha.h18
-rw-r--r--src/devices/bus/amiga/zorro/cards.cpp63
-rw-r--r--src/devices/bus/amiga/zorro/cards.h26
-rw-r--r--src/devices/bus/amiga/zorro/merlin.cpp191
-rw-r--r--src/devices/bus/amiga/zorro/merlin.h56
-rw-r--r--src/devices/bus/amiga/zorro/oktagon2008.cpp268
-rw-r--r--src/devices/bus/amiga/zorro/oktagon2008.h14
-rw-r--r--src/devices/bus/amiga/zorro/picasso2.cpp213
-rw-r--r--src/devices/bus/amiga/zorro/picasso2.h63
-rw-r--r--src/devices/bus/amiga/zorro/rainbow2.cpp222
-rw-r--r--src/devices/bus/amiga/zorro/rainbow2.h68
-rw-r--r--src/devices/bus/amiga/zorro/ripple.cpp234
-rw-r--r--src/devices/bus/amiga/zorro/ripple.h74
-rw-r--r--src/devices/bus/amiga/zorro/toccata.cpp318
-rw-r--r--src/devices/bus/amiga/zorro/toccata.h72
-rw-r--r--src/devices/bus/amiga/zorro/zorro.cpp354
-rw-r--r--src/devices/bus/amiga/zorro/zorro.h353
-rw-r--r--src/devices/bus/apf/slot.h9
-rw-r--r--src/devices/bus/applepp/applepp.cpp104
-rw-r--r--src/devices/bus/applepp/applepp.h75
-rw-r--r--src/devices/bus/applepp/storagehle.cpp105
-rw-r--r--src/devices/bus/applepp/storagehle.h58
-rw-r--r--src/devices/bus/apricot/expansion/expansion.h13
-rw-r--r--src/devices/bus/apricot/expansion/ram.h24
-rw-r--r--src/devices/bus/apricot/expansion/winchester.h14
-rw-r--r--src/devices/bus/apricot/keyboard/hle.h8
-rw-r--r--src/devices/bus/apricot/keyboard/keyboard.h11
-rw-r--r--src/devices/bus/apricot/video/mono.h6
-rw-r--r--src/devices/bus/apricot/video/video.h11
-rw-r--r--src/devices/bus/aquarius/c1541.h4
-rw-r--r--src/devices/bus/aquarius/mini.cpp88
-rw-r--r--src/devices/bus/aquarius/mini.h6
-rw-r--r--src/devices/bus/aquarius/qdisk.h6
-rw-r--r--src/devices/bus/aquarius/ram.h4
-rw-r--r--src/devices/bus/aquarius/rom.h2
-rw-r--r--src/devices/bus/aquarius/slot.h9
-rw-r--r--src/devices/bus/aquarius/supercart.h4
-rw-r--r--src/devices/bus/arcadia/slot.h7
-rw-r--r--src/devices/bus/archimedes/econet/econet.cpp77
-rw-r--r--src/devices/bus/archimedes/econet/econet.h46
-rw-r--r--src/devices/bus/archimedes/econet/midi.cpp123
-rw-r--r--src/devices/bus/archimedes/econet/midi.h65
-rw-r--r--src/devices/bus/archimedes/econet/rtfmjoy.cpp95
-rw-r--r--src/devices/bus/archimedes/econet/rtfmjoy.h41
-rw-r--r--src/devices/bus/archimedes/econet/slot.cpp8
-rw-r--r--src/devices/bus/archimedes/econet/slot.h13
-rw-r--r--src/devices/bus/archimedes/podule/a448.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/acejoy.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/armadeus.cpp8
-rw-r--r--src/devices/bus/archimedes/podule/eaglem2.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/ether1.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/ether2.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/ether3.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/ethera.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/etherd.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/etherr.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/faxpack.cpp16
-rw-r--r--src/devices/bus/archimedes/podule/faxpack.h2
-rw-r--r--src/devices/bus/archimedes/podule/greyhawk.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/hdisc.cpp8
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_cw.cpp8
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_morley.cpp8
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_we.cpp8
-rw-r--r--src/devices/bus/archimedes/podule/ide_be.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/ide_rdev.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/io.cpp65
-rw-r--r--src/devices/bus/archimedes/podule/io_hccs.cpp80
-rw-r--r--src/devices/bus/archimedes/podule/io_morley.cpp75
-rw-r--r--src/devices/bus/archimedes/podule/io_we.cpp94
-rw-r--r--src/devices/bus/archimedes/podule/lark.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/laserd.cpp18
-rw-r--r--src/devices/bus/archimedes/podule/midi_emr.cpp16
-rw-r--r--src/devices/bus/archimedes/podule/midimax.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/nexus.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/rom.cpp12
-rw-r--r--src/devices/bus/archimedes/podule/rs423.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/scan256.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/scanlight.cpp20
-rw-r--r--src/devices/bus/archimedes/podule/scsi_a500.cpp22
-rw-r--r--src/devices/bus/archimedes/podule/scsi_acorn.cpp142
-rw-r--r--src/devices/bus/archimedes/podule/scsi_acorn.h2
-rw-r--r--src/devices/bus/archimedes/podule/scsi_cumana.cpp35
-rw-r--r--src/devices/bus/archimedes/podule/scsi_ling.cpp24
-rw-r--r--src/devices/bus/archimedes/podule/scsi_morley.cpp30
-rw-r--r--src/devices/bus/archimedes/podule/scsi_oak.cpp27
-rw-r--r--src/devices/bus/archimedes/podule/scsi_vti.cpp30
-rw-r--r--src/devices/bus/archimedes/podule/serial.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/slot.cpp1
-rw-r--r--src/devices/bus/archimedes/podule/slot.h21
-rw-r--r--src/devices/bus/archimedes/podule/spectra.cpp10
-rw-r--r--src/devices/bus/archimedes/podule/tube.cpp6
-rw-r--r--src/devices/bus/astrocde/accessory.h9
-rw-r--r--src/devices/bus/astrocde/cassette.h6
-rw-r--r--src/devices/bus/astrocde/ctrl.h9
-rw-r--r--src/devices/bus/astrocde/exp.h17
-rw-r--r--src/devices/bus/astrocde/joy.h2
-rw-r--r--src/devices/bus/astrocde/lightpen.cpp2
-rw-r--r--src/devices/bus/astrocde/lightpen.h6
-rw-r--r--src/devices/bus/astrocde/ram.h16
-rw-r--r--src/devices/bus/astrocde/rom.h16
-rw-r--r--src/devices/bus/astrocde/slot.h15
-rw-r--r--src/devices/bus/ata/atadev.h2
-rw-r--r--src/devices/bus/ata/ataintf.h12
-rw-r--r--src/devices/bus/ata/atapicdr.cpp38
-rw-r--r--src/devices/bus/ata/atapicdr.h29
-rw-r--r--src/devices/bus/ata/atapihle.cpp6
-rw-r--r--src/devices/bus/ata/atapihle.h4
-rw-r--r--src/devices/bus/ata/cp2024.h8
-rw-r--r--src/devices/bus/ata/cr589.h4
-rw-r--r--src/devices/bus/ata/gdrom.cpp5
-rw-r--r--src/devices/bus/ata/gdrom.h4
-rw-r--r--src/devices/bus/ata/hdd.h6
-rw-r--r--src/devices/bus/ata/px320a.h8
-rw-r--r--src/devices/bus/ata/xm3301.h4
-rw-r--r--src/devices/bus/ata/zip100.cpp4
-rw-r--r--src/devices/bus/ata/zip100.h10
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.cpp27
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.h13
-rw-r--r--src/devices/bus/bbc/1mhzbus/24bbc.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/2ndserial.h6
-rw-r--r--src/devices/bus/bbc/1mhzbus/autoprom.h10
-rw-r--r--src/devices/bus/bbc/1mhzbus/barrybox.cpp88
-rw-r--r--src/devices/bus/bbc/1mhzbus/barrybox.h2
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebex.cpp155
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebex.h13
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebopl.h2
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/cc500.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/cisco.h6
-rw-r--r--src/devices/bus/bbc/1mhzbus/datacentre.cpp2
-rw-r--r--src/devices/bus/bbc/1mhzbus/datacentre.h8
-rw-r--r--src/devices/bus/bbc/1mhzbus/emrmidi.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/ide.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/ieee488.h16
-rw-r--r--src/devices/bus/bbc/1mhzbus/m2000.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/m5000.cpp19
-rw-r--r--src/devices/bus/bbc/1mhzbus/m5000.h18
-rw-r--r--src/devices/bus/bbc/1mhzbus/multiform.h12
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.h10
-rw-r--r--src/devices/bus/bbc/1mhzbus/pdram.h2
-rw-r--r--src/devices/bus/bbc/1mhzbus/pms64k.h6
-rw-r--r--src/devices/bus/bbc/1mhzbus/ramdisc.cpp127
-rw-r--r--src/devices/bus/bbc/1mhzbus/ramdisc.h54
-rw-r--r--src/devices/bus/bbc/1mhzbus/sasi.h6
-rw-r--r--src/devices/bus/bbc/1mhzbus/scsi.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/sprite.h6
-rw-r--r--src/devices/bus/bbc/analogue/analogue.cpp48
-rw-r--r--src/devices/bus/bbc/analogue/analogue.h21
-rw-r--r--src/devices/bus/bbc/analogue/bitstik.cpp156
-rw-r--r--src/devices/bus/bbc/analogue/bitstik.h63
-rw-r--r--src/devices/bus/bbc/analogue/cfa3000a.cpp103
-rw-r--r--src/devices/bus/bbc/analogue/cfa3000a.h41
-rw-r--r--src/devices/bus/bbc/analogue/joystick.cpp145
-rw-r--r--src/devices/bus/bbc/analogue/joystick.h54
-rw-r--r--src/devices/bus/bbc/analogue/lightpen.cpp251
-rw-r--r--src/devices/bus/bbc/analogue/lightpen.h16
-rw-r--r--src/devices/bus/bbc/analogue/micromike.cpp118
-rw-r--r--src/devices/bus/bbc/analogue/micromike.h13
-rw-r--r--src/devices/bus/bbc/analogue/quinkey.cpp11
-rw-r--r--src/devices/bus/bbc/analogue/quinkey.h17
-rw-r--r--src/devices/bus/bbc/cart/click.cpp62
-rw-r--r--src/devices/bus/bbc/cart/click.h36
-rw-r--r--src/devices/bus/bbc/cart/mastersd.cpp65
-rw-r--r--src/devices/bus/bbc/cart/mastersd.h73
-rw-r--r--src/devices/bus/bbc/cart/mega256.cpp42
-rw-r--r--src/devices/bus/bbc/cart/mega256.h36
-rw-r--r--src/devices/bus/bbc/cart/mr8000.cpp63
-rw-r--r--src/devices/bus/bbc/cart/mr8000.h35
-rw-r--r--src/devices/bus/bbc/cart/msc.cpp67
-rw-r--r--src/devices/bus/bbc/cart/msc.h37
-rw-r--r--src/devices/bus/bbc/cart/slot.h11
-rw-r--r--src/devices/bus/bbc/exp/autocue.cpp60
-rw-r--r--src/devices/bus/bbc/exp/autocue.h46
-rw-r--r--src/devices/bus/bbc/exp/exp.cpp62
-rw-r--r--src/devices/bus/bbc/exp/exp.h42
-rw-r--r--src/devices/bus/bbc/exp/jafacart.cpp75
-rw-r--r--src/devices/bus/bbc/exp/jafacart.h13
-rw-r--r--src/devices/bus/bbc/exp/magazzino.cpp65
-rw-r--r--src/devices/bus/bbc/exp/magazzino.h13
-rw-r--r--src/devices/bus/bbc/exp/mertec.cpp161
-rw-r--r--src/devices/bus/bbc/exp/mertec.h65
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h12
-rw-r--r--src/devices/bus/bbc/fdc/ams.cpp4
-rw-r--r--src/devices/bus/bbc/fdc/ams.h6
-rw-r--r--src/devices/bus/bbc/fdc/cumana.h10
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.h6
-rw-r--r--src/devices/bus/bbc/fdc/fdc.h7
-rw-r--r--src/devices/bus/bbc/fdc/kenda.h6
-rw-r--r--src/devices/bus/bbc/fdc/opus.h20
-rw-r--r--src/devices/bus/bbc/fdc/solidisk.cpp2
-rw-r--r--src/devices/bus/bbc/fdc/solidisk.h10
-rw-r--r--src/devices/bus/bbc/fdc/udm.h6
-rw-r--r--src/devices/bus/bbc/fdc/watford.h12
-rw-r--r--src/devices/bus/bbc/internal/aries.h16
-rw-r--r--src/devices/bus/bbc/internal/atpl.h10
-rw-r--r--src/devices/bus/bbc/internal/cumana68k.h8
-rw-r--r--src/devices/bus/bbc/internal/integrab.h10
-rw-r--r--src/devices/bus/bbc/internal/internal.cpp4
-rw-r--r--src/devices/bus/bbc/internal/internal.h13
-rw-r--r--src/devices/bus/bbc/internal/memex.h4
-rw-r--r--src/devices/bus/bbc/internal/morleyaa.h13
-rw-r--r--src/devices/bus/bbc/internal/overlay.h6
-rw-r--r--src/devices/bus/bbc/internal/peartree.h16
-rw-r--r--src/devices/bus/bbc/internal/ramamp.h6
-rw-r--r--src/devices/bus/bbc/internal/raven20.h4
-rw-r--r--src/devices/bus/bbc/internal/romex.h4
-rw-r--r--src/devices/bus/bbc/internal/stl2m128.h8
-rw-r--r--src/devices/bus/bbc/internal/stl4m32.cpp4
-rw-r--r--src/devices/bus/bbc/internal/stl4m32.h10
-rw-r--r--src/devices/bus/bbc/internal/stlswr.h12
-rw-r--r--src/devices/bus/bbc/internal/we32kram.h6
-rw-r--r--src/devices/bus/bbc/internal/werom.h10
-rw-r--r--src/devices/bus/bbc/internal/weromram.h4
-rw-r--r--src/devices/bus/bbc/joyport/joyport.cpp6
-rw-r--r--src/devices/bus/bbc/joyport/joyport.h11
-rw-r--r--src/devices/bus/bbc/joyport/joystick.cpp71
-rw-r--r--src/devices/bus/bbc/joyport/joystick.h38
-rw-r--r--src/devices/bus/bbc/joyport/mouse.cpp79
-rw-r--r--src/devices/bus/bbc/joyport/mouse.h51
-rw-r--r--src/devices/bus/bbc/modem/meup.cpp76
-rw-r--r--src/devices/bus/bbc/modem/meup.h41
-rw-r--r--src/devices/bus/bbc/modem/modem.cpp16
-rw-r--r--src/devices/bus/bbc/modem/modem.h12
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.cpp73
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.h67
-rw-r--r--src/devices/bus/bbc/rom/datagem.cpp49
-rw-r--r--src/devices/bus/bbc/rom/datagem.h37
-rw-r--r--src/devices/bus/bbc/rom/detalker.cpp106
-rw-r--r--src/devices/bus/bbc/rom/detalker.h13
-rw-r--r--src/devices/bus/bbc/rom/dfs.cpp83
-rw-r--r--src/devices/bus/bbc/rom/dfs.h30
-rw-r--r--src/devices/bus/bbc/rom/genie.cpp159
-rw-r--r--src/devices/bus/bbc/rom/genie.h37
-rw-r--r--src/devices/bus/bbc/rom/nvram.cpp55
-rw-r--r--src/devices/bus/bbc/rom/nvram.h31
-rw-r--r--src/devices/bus/bbc/rom/pal.cpp496
-rw-r--r--src/devices/bus/bbc/rom/pal.h179
-rw-r--r--src/devices/bus/bbc/rom/ram.cpp55
-rw-r--r--src/devices/bus/bbc/rom/ram.h31
-rw-r--r--src/devices/bus/bbc/rom/rom.cpp50
-rw-r--r--src/devices/bus/bbc/rom/rom.h30
-rw-r--r--src/devices/bus/bbc/rom/rtc.cpp116
-rw-r--r--src/devices/bus/bbc/rom/rtc.h62
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp41
-rw-r--r--src/devices/bus/bbc/rom/slot.h18
-rw-r--r--src/devices/bus/bbc/tube/cms6502.cpp129
-rw-r--r--src/devices/bus/bbc/tube/cms6502.h13
-rw-r--r--src/devices/bus/bbc/tube/tube.cpp3
-rw-r--r--src/devices/bus/bbc/tube/tube.h7
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.cpp189
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.h98
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp237
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.h126
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.cpp144
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.h78
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.cpp97
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.h63
-rw-r--r--src/devices/bus/bbc/tube/tube_a500.cpp77
-rw-r--r--src/devices/bus/bbc/tube/tube_a500.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.cpp99
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.h59
-rw-r--r--src/devices/bus/bbc/tube/tube_arm7.cpp127
-rw-r--r--src/devices/bus/bbc/tube/tube_arm7.h91
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.cpp92
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.h52
-rw-r--r--src/devices/bus/bbc/tube/tube_cms6809.cpp104
-rw-r--r--src/devices/bus/bbc/tube/tube_cms6809.h51
-rw-r--r--src/devices/bus/bbc/tube/tube_matchbox.cpp302
-rw-r--r--src/devices/bus/bbc/tube/tube_matchbox.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_rc6502.cpp172
-rw-r--r--src/devices/bus/bbc/tube/tube_rc6502.h96
-rw-r--r--src/devices/bus/bbc/tube/tube_x25.cpp96
-rw-r--r--src/devices/bus/bbc/tube/tube_x25.h64
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.cpp144
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.h84
-rw-r--r--src/devices/bus/bbc/tube/tube_zep100.cpp201
-rw-r--r--src/devices/bus/bbc/tube/tube_zep100.h108
-rw-r--r--src/devices/bus/bbc/userport/beebspch.cpp74
-rw-r--r--src/devices/bus/bbc/userport/beebspch.h45
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.cpp75
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.h39
-rw-r--r--src/devices/bus/bbc/userport/lcd.cpp67
-rw-r--r--src/devices/bus/bbc/userport/lcd.h45
-rw-r--r--src/devices/bus/bbc/userport/lvlecho.cpp134
-rw-r--r--src/devices/bus/bbc/userport/m4000.cpp110
-rw-r--r--src/devices/bus/bbc/userport/palext.cpp99
-rw-r--r--src/devices/bus/bbc/userport/palext.h68
-rw-r--r--src/devices/bus/bbc/userport/pointer.cpp144
-rw-r--r--src/devices/bus/bbc/userport/pointer.h92
-rw-r--r--src/devices/bus/bbc/userport/sdcard.cpp62
-rw-r--r--src/devices/bus/bbc/userport/sdcard.h65
-rw-r--r--src/devices/bus/bbc/userport/userport.h11
-rw-r--r--src/devices/bus/bbc/userport/usersplit.cpp76
-rw-r--r--src/devices/bus/bbc/userport/usersplit.h50
-rw-r--r--src/devices/bus/bbc/userport/voicebox.cpp77
-rw-r--r--src/devices/bus/bbc/userport/voicebox.h42
-rw-r--r--src/devices/bus/bbc/vsp/slot.cpp126
-rw-r--r--src/devices/bus/bbc/vsp/slot.h83
-rw-r--r--src/devices/bus/bbc/vsp/speech.cpp132
-rw-r--r--src/devices/bus/bbc/vsp/speech.h13
-rw-r--r--src/devices/bus/bbc/vsp/sweetalker.cpp71
-rw-r--r--src/devices/bus/bbc/vsp/sweetalker.h13
-rw-r--r--src/devices/bus/bk/ay.cpp104
-rw-r--r--src/devices/bus/bk/ay.h19
-rw-r--r--src/devices/bus/bk/carts.cpp26
-rw-r--r--src/devices/bus/bk/carts.h17
-rw-r--r--src/devices/bus/bk/covox.cpp91
-rw-r--r--src/devices/bus/bk/covox.h19
-rw-r--r--src/devices/bus/bk/joystick.cpp99
-rw-r--r--src/devices/bus/bk/joystick.h19
-rw-r--r--src/devices/bus/bk/loopback.cpp79
-rw-r--r--src/devices/bus/bk/loopback.h19
-rw-r--r--src/devices/bus/bk/parallel.cpp111
-rw-r--r--src/devices/bus/bk/parallel.h115
-rw-r--r--src/devices/bus/bk/printer.cpp101
-rw-r--r--src/devices/bus/bk/printer.h19
-rw-r--r--src/devices/bus/bml3/bml3bus.h11
-rw-r--r--src/devices/bus/bml3/bml3kanji.cpp86
-rw-r--r--src/devices/bus/bml3/bml3kanji.h51
-rw-r--r--src/devices/bus/bml3/bml3mp1802.cpp143
-rw-r--r--src/devices/bus/bml3/bml3mp1802.h62
-rw-r--r--src/devices/bus/bml3/bml3mp1805.cpp166
-rw-r--r--src/devices/bus/bml3/bml3mp1805.h61
-rw-r--r--src/devices/bus/bml3/bml3rtc.cpp109
-rw-r--r--src/devices/bus/bml3/bml3rtc.h54
-rw-r--r--src/devices/bus/bml3/kanji.cpp86
-rw-r--r--src/devices/bus/bml3/kanji.h51
-rw-r--r--src/devices/bus/bml3/mp1802.cpp143
-rw-r--r--src/devices/bus/bml3/mp1802.h62
-rw-r--r--src/devices/bus/bml3/mp1805.cpp163
-rw-r--r--src/devices/bus/bml3/mp1805.h61
-rw-r--r--src/devices/bus/bml3/rtc.cpp109
-rw-r--r--src/devices/bus/bml3/rtc.h54
-rw-r--r--src/devices/bus/bw2/exp.cpp89
-rw-r--r--src/devices/bus/bw2/exp.h62
-rw-r--r--src/devices/bus/bw2/ramcard.cpp72
-rw-r--r--src/devices/bus/bw2/ramcard.h21
-rw-r--r--src/devices/bus/c64/16kb.h8
-rw-r--r--src/devices/bus/c64/4dxh.cpp20
-rw-r--r--src/devices/bus/c64/4dxh.h4
-rw-r--r--src/devices/bus/c64/4ksa.cpp20
-rw-r--r--src/devices/bus/c64/4ksa.h4
-rw-r--r--src/devices/bus/c64/4tba.cpp20
-rw-r--r--src/devices/bus/c64/4tba.h4
-rw-r--r--src/devices/bus/c64/bn1541.h2
-rw-r--r--src/devices/bus/c64/buscard.h10
-rw-r--r--src/devices/bus/c64/buscard2.h10
-rw-r--r--src/devices/bus/c64/c128_comal80.h4
-rw-r--r--src/devices/bus/c64/c128_partner.cpp2
-rw-r--r--src/devices/bus/c64/c128_partner.h6
-rw-r--r--src/devices/bus/c64/comal80.h4
-rw-r--r--src/devices/bus/c64/cpm.cpp6
-rw-r--r--src/devices/bus/c64/cpm.h10
-rw-r--r--src/devices/bus/c64/currah_speech.h8
-rw-r--r--src/devices/bus/c64/dela_ep256.h6
-rw-r--r--src/devices/bus/c64/dela_ep64.h6
-rw-r--r--src/devices/bus/c64/dela_ep7x8.h6
-rw-r--r--src/devices/bus/c64/dinamic.h4
-rw-r--r--src/devices/bus/c64/dqbb.h4
-rw-r--r--src/devices/bus/c64/easy_calc_result.h4
-rw-r--r--src/devices/bus/c64/easyflash.cpp2
-rw-r--r--src/devices/bus/c64/easyflash.h8
-rw-r--r--src/devices/bus/c64/epyx_fast_load.h4
-rw-r--r--src/devices/bus/c64/exos.h2
-rw-r--r--src/devices/bus/c64/exp.h9
-rw-r--r--src/devices/bus/c64/fcc.cpp4
-rw-r--r--src/devices/bus/c64/fcc.h14
-rw-r--r--src/devices/bus/c64/final.cpp4
-rw-r--r--src/devices/bus/c64/final.h6
-rw-r--r--src/devices/bus/c64/final3.cpp4
-rw-r--r--src/devices/bus/c64/final3.h12
-rw-r--r--src/devices/bus/c64/fun_play.h4
-rw-r--r--src/devices/bus/c64/geocable.h4
-rw-r--r--src/devices/bus/c64/georam.h10
-rw-r--r--src/devices/bus/c64/ide64.h8
-rw-r--r--src/devices/bus/c64/ieee488.h6
-rw-r--r--src/devices/bus/c64/kingsoft.h4
-rw-r--r--src/devices/bus/c64/mach5.cpp2
-rw-r--r--src/devices/bus/c64/mach5.h6
-rw-r--r--src/devices/bus/c64/magic_desk.h4
-rw-r--r--src/devices/bus/c64/magic_formel.cpp2
-rw-r--r--src/devices/bus/c64/magic_formel.h8
-rw-r--r--src/devices/bus/c64/magic_voice.h6
-rw-r--r--src/devices/bus/c64/midi_maplin.h6
-rw-r--r--src/devices/bus/c64/midi_namesoft.h6
-rw-r--r--src/devices/bus/c64/midi_passport.h6
-rw-r--r--src/devices/bus/c64/midi_sci.h6
-rw-r--r--src/devices/bus/c64/midi_siel.h6
-rw-r--r--src/devices/bus/c64/mikro_assembler.h2
-rw-r--r--src/devices/bus/c64/multiscreen.h10
-rw-r--r--src/devices/bus/c64/music64.h8
-rw-r--r--src/devices/bus/c64/neoram.h4
-rw-r--r--src/devices/bus/c64/ocean.h4
-rw-r--r--src/devices/bus/c64/pagefox.h4
-rw-r--r--src/devices/bus/c64/partner.cpp2
-rw-r--r--src/devices/bus/c64/partner.h6
-rw-r--r--src/devices/bus/c64/prophet64.h4
-rw-r--r--src/devices/bus/c64/ps64.h6
-rw-r--r--src/devices/bus/c64/reu.h6
-rw-r--r--src/devices/bus/c64/rex.h4
-rw-r--r--src/devices/bus/c64/rex_ep256.h6
-rw-r--r--src/devices/bus/c64/ross.h4
-rw-r--r--src/devices/bus/c64/sfx_sound_expander.h8
-rw-r--r--src/devices/bus/c64/silverrock.h4
-rw-r--r--src/devices/bus/c64/simons_basic.h4
-rw-r--r--src/devices/bus/c64/speakeasy.h4
-rw-r--r--src/devices/bus/c64/stardos.cpp2
-rw-r--r--src/devices/bus/c64/stardos.h10
-rw-r--r--src/devices/bus/c64/std.h2
-rw-r--r--src/devices/bus/c64/structured_basic.h4
-rw-r--r--src/devices/bus/c64/super_explode.h4
-rw-r--r--src/devices/bus/c64/super_games.h4
-rw-r--r--src/devices/bus/c64/supercpu.cpp2
-rw-r--r--src/devices/bus/c64/supercpu.h12
-rw-r--r--src/devices/bus/c64/sw8k.h6
-rw-r--r--src/devices/bus/c64/swiftlink.h8
-rw-r--r--src/devices/bus/c64/system3.h8
-rw-r--r--src/devices/bus/c64/tdos.h8
-rw-r--r--src/devices/bus/c64/tibdd001.h12
-rw-r--r--src/devices/bus/c64/turbo232.h8
-rw-r--r--src/devices/bus/c64/vizastar.h2
-rw-r--r--src/devices/bus/c64/vw64.h4
-rw-r--r--src/devices/bus/c64/warp_speed.cpp2
-rw-r--r--src/devices/bus/c64/warp_speed.h6
-rw-r--r--src/devices/bus/c64/westermann.h4
-rw-r--r--src/devices/bus/c64/xl80.h8
-rw-r--r--src/devices/bus/c64/z80videopak.h8
-rw-r--r--src/devices/bus/c64/zaxxon.h2
-rw-r--r--src/devices/bus/casloopy/rom.h4
-rw-r--r--src/devices/bus/casloopy/slot.h7
-rw-r--r--src/devices/bus/cbm2/24k.h2
-rw-r--r--src/devices/bus/cbm2/exp.h9
-rw-r--r--src/devices/bus/cbm2/hrg.h14
-rw-r--r--src/devices/bus/cbm2/std.h2
-rw-r--r--src/devices/bus/cbm2/user.h11
-rw-r--r--src/devices/bus/cbmiec/c1526.cpp4
-rw-r--r--src/devices/bus/cbmiec/c1526.h26
-rw-r--r--src/devices/bus/cbmiec/c1541.cpp5
-rw-r--r--src/devices/bus/cbmiec/c1541.h64
-rw-r--r--src/devices/bus/cbmiec/c1571.h26
-rw-r--r--src/devices/bus/cbmiec/c1581.h14
-rw-r--r--src/devices/bus/cbmiec/c5181.cpp124
-rw-r--r--src/devices/bus/cbmiec/c5181.h44
-rw-r--r--src/devices/bus/cbmiec/c64_nl10.h10
-rw-r--r--src/devices/bus/cbmiec/cbmiec.cpp2
-rw-r--r--src/devices/bus/cbmiec/cbmiec.h13
-rw-r--r--src/devices/bus/cbmiec/cmdhd.h10
-rw-r--r--src/devices/bus/cbmiec/diag264_lb_iec.h2
-rw-r--r--src/devices/bus/cbmiec/fd2000.cpp2
-rw-r--r--src/devices/bus/cbmiec/fd2000.h20
-rw-r--r--src/devices/bus/cbmiec/interpod.h10
-rw-r--r--src/devices/bus/cbmiec/mps1200.h16
-rw-r--r--src/devices/bus/cbmiec/serialbox.cpp2
-rw-r--r--src/devices/bus/cbmiec/serialbox.h14
-rw-r--r--src/devices/bus/cbmiec/vic1515.h14
-rw-r--r--src/devices/bus/cbmiec/vic1520.h8
-rw-r--r--src/devices/bus/cbus/mpu_pc98.h45
-rw-r--r--src/devices/bus/cbus/pc9801_118.cpp255
-rw-r--r--src/devices/bus/cbus/pc9801_118.h70
-rw-r--r--src/devices/bus/cbus/pc9801_26.cpp227
-rw-r--r--src/devices/bus/cbus/pc9801_26.h64
-rw-r--r--src/devices/bus/cbus/pc9801_55.cpp253
-rw-r--r--src/devices/bus/cbus/pc9801_55.h80
-rw-r--r--src/devices/bus/cbus/pc9801_86.cpp573
-rw-r--r--src/devices/bus/cbus/pc9801_86.h126
-rw-r--r--src/devices/bus/cbus/pc9801_amd98.cpp202
-rw-r--r--src/devices/bus/cbus/pc9801_amd98.h59
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.cpp153
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.h134
-rw-r--r--src/devices/bus/cbus/pc9801_snd.cpp48
-rw-r--r--src/devices/bus/cbus/pc9801_snd.h33
-rw-r--r--src/devices/bus/centronics/adaptator.cpp91
-rw-r--r--src/devices/bus/centronics/adaptator.h44
-rw-r--r--src/devices/bus/centronics/chessmec.h2
-rw-r--r--src/devices/bus/centronics/comxpl80.h10
-rw-r--r--src/devices/bus/centronics/covox.cpp7
-rw-r--r--src/devices/bus/centronics/covox.h8
-rw-r--r--src/devices/bus/centronics/ctronics.cpp25
-rw-r--r--src/devices/bus/centronics/ctronics.h11
-rw-r--r--src/devices/bus/centronics/digiblst.h4
-rw-r--r--src/devices/bus/centronics/dsjoy.h4
-rw-r--r--src/devices/bus/centronics/epson_ex800.cpp2
-rw-r--r--src/devices/bus/centronics/epson_ex800.h12
-rw-r--r--src/devices/bus/centronics/epson_fx80.cpp320
-rw-r--r--src/devices/bus/centronics/epson_fx80.h20
-rw-r--r--src/devices/bus/centronics/epson_lx800.h12
-rw-r--r--src/devices/bus/centronics/epson_lx810l.cpp4
-rw-r--r--src/devices/bus/centronics/epson_lx810l.h14
-rw-r--r--src/devices/bus/centronics/epson_rx80.cpp171
-rw-r--r--src/devices/bus/centronics/epson_rx80.h19
-rw-r--r--src/devices/bus/centronics/hasp_savquest.cpp69
-rw-r--r--src/devices/bus/centronics/hasp_savquest.h61
-rw-r--r--src/devices/bus/centronics/mz1p16.cpp226
-rw-r--r--src/devices/bus/centronics/mz1p16.h60
-rw-r--r--src/devices/bus/centronics/nec_p72.h8
-rw-r--r--src/devices/bus/centronics/neomania_adapter.cpp169
-rw-r--r--src/devices/bus/centronics/neomania_adapter.h54
-rw-r--r--src/devices/bus/centronics/nlq401.h10
-rw-r--r--src/devices/bus/centronics/pc6022.cpp163
-rw-r--r--src/devices/bus/centronics/pc6022.h61
-rw-r--r--src/devices/bus/centronics/printer.h6
-rw-r--r--src/devices/bus/centronics/samdac.cpp7
-rw-r--r--src/devices/bus/centronics/samdac.h4
-rw-r--r--src/devices/bus/centronics/smartboard.h2
-rw-r--r--src/devices/bus/centronics/spjoy.h4
-rw-r--r--src/devices/bus/cgenie/expansion/expansion.cpp1
-rw-r--r--src/devices/bus/cgenie/expansion/expansion.h16
-rw-r--r--src/devices/bus/cgenie/expansion/floppy.h10
-rw-r--r--src/devices/bus/cgenie/parallel/joystick.h6
-rw-r--r--src/devices/bus/cgenie/parallel/parallel.cpp1
-rw-r--r--src/devices/bus/cgenie/parallel/parallel.h16
-rw-r--r--src/devices/bus/cgenie/parallel/printer.h6
-rw-r--r--src/devices/bus/chanf/rom.h16
-rw-r--r--src/devices/bus/chanf/slot.h7
-rw-r--r--src/devices/bus/coco/coco_dcmodem.cpp4
-rw-r--r--src/devices/bus/coco/coco_dwsock.cpp21
-rw-r--r--src/devices/bus/coco/coco_dwsock.h8
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp9
-rw-r--r--src/devices/bus/coco/coco_fdc.h4
-rw-r--r--src/devices/bus/coco/coco_gmc.cpp2
-rw-r--r--src/devices/bus/coco/coco_ide.h8
-rw-r--r--src/devices/bus/coco/coco_max.cpp6
-rw-r--r--src/devices/bus/coco/coco_midi.cpp6
-rw-r--r--src/devices/bus/coco/coco_multi.cpp12
-rw-r--r--src/devices/bus/coco/coco_multi.h6
-rw-r--r--src/devices/bus/coco/coco_orch90.cpp9
-rw-r--r--src/devices/bus/coco/coco_pak.h14
-rw-r--r--src/devices/bus/coco/coco_psg.h10
-rw-r--r--src/devices/bus/coco/coco_ram.cpp6
-rw-r--r--src/devices/bus/coco/coco_rs232.cpp4
-rw-r--r--src/devices/bus/coco/coco_ssc.cpp23
-rw-r--r--src/devices/bus/coco/coco_stecomp.cpp9
-rw-r--r--src/devices/bus/coco/coco_sym12.cpp13
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp10
-rw-r--r--src/devices/bus/coco/coco_wpk.h16
-rw-r--r--src/devices/bus/coco/coco_wpk2p.h4
-rw-r--r--src/devices/bus/coco/coco_xsid.cpp60
-rw-r--r--src/devices/bus/coco/coco_xsid.h13
-rw-r--r--src/devices/bus/coco/cococart.cpp8
-rw-r--r--src/devices/bus/coco/cococart.h9
-rw-r--r--src/devices/bus/coco/dragon_amtor.h6
-rw-r--r--src/devices/bus/coco/dragon_claw.h6
-rw-r--r--src/devices/bus/coco/dragon_fdc.cpp4
-rw-r--r--src/devices/bus/coco/dragon_jcbsnd.h6
-rw-r--r--src/devices/bus/coco/dragon_jcbspch.h6
-rw-r--r--src/devices/bus/coco/dragon_msx2.h8
-rw-r--r--src/devices/bus/coco/dragon_serial.cpp4
-rw-r--r--src/devices/bus/coco/dragon_sprites.h6
-rw-r--r--src/devices/bus/coco/meb_intrf.h19
-rw-r--r--src/devices/bus/coco/meb_rtime.cpp4
-rw-r--r--src/devices/bus/coleco/cartridge/activision.h6
-rw-r--r--src/devices/bus/coleco/cartridge/exp.cpp7
-rw-r--r--src/devices/bus/coleco/cartridge/exp.h14
-rw-r--r--src/devices/bus/coleco/cartridge/megacart.h10
-rw-r--r--src/devices/bus/coleco/cartridge/sgc.cpp206
-rw-r--r--src/devices/bus/coleco/cartridge/sgc.h83
-rw-r--r--src/devices/bus/coleco/cartridge/std.h9
-rw-r--r--src/devices/bus/coleco/cartridge/xin1.h11
-rw-r--r--src/devices/bus/coleco/controller/ctrl.h13
-rw-r--r--src/devices/bus/coleco/controller/hand.cpp4
-rw-r--r--src/devices/bus/coleco/controller/hand.h13
-rw-r--r--src/devices/bus/coleco/controller/sac.cpp6
-rw-r--r--src/devices/bus/coleco/controller/sac.h13
-rw-r--r--src/devices/bus/coleco/expansion/cards.h6
-rw-r--r--src/devices/bus/coleco/expansion/expansion.cpp1
-rw-r--r--src/devices/bus/coleco/expansion/expansion.h11
-rw-r--r--src/devices/bus/coleco/expansion/sgm.h8
-rw-r--r--src/devices/bus/compis/graphics.h11
-rw-r--r--src/devices/bus/compis/hrg.h12
-rw-r--r--src/devices/bus/compucolor/floppy.h17
-rw-r--r--src/devices/bus/comx35/clm.h8
-rw-r--r--src/devices/bus/comx35/eprom.h6
-rw-r--r--src/devices/bus/comx35/exp.h9
-rw-r--r--src/devices/bus/comx35/expbox.h8
-rw-r--r--src/devices/bus/comx35/fdc.h15
-rw-r--r--src/devices/bus/comx35/joycard.h6
-rw-r--r--src/devices/bus/comx35/printer.h8
-rw-r--r--src/devices/bus/comx35/ram.h4
-rw-r--r--src/devices/bus/comx35/thermal.h6
-rw-r--r--src/devices/bus/cpc/amdrum.h6
-rw-r--r--src/devices/bus/cpc/brunword4.h6
-rw-r--r--src/devices/bus/cpc/cpc_pds.h6
-rw-r--r--src/devices/bus/cpc/cpc_rom.h8
-rw-r--r--src/devices/bus/cpc/cpc_rs232.h10
-rw-r--r--src/devices/bus/cpc/cpc_ssa1.h16
-rw-r--r--src/devices/bus/cpc/cpcexp.h7
-rw-r--r--src/devices/bus/cpc/ddi1.h8
-rw-r--r--src/devices/bus/cpc/doubler.h6
-rw-r--r--src/devices/bus/cpc/hd20.h8
-rw-r--r--src/devices/bus/cpc/magicsound.h6
-rw-r--r--src/devices/bus/cpc/mface2.h10
-rw-r--r--src/devices/bus/cpc/musicmachine.cpp4
-rw-r--r--src/devices/bus/cpc/musicmachine.h6
-rw-r--r--src/devices/bus/cpc/playcity.cpp7
-rw-r--r--src/devices/bus/cpc/playcity.h6
-rw-r--r--src/devices/bus/cpc/smartwatch.cpp31
-rw-r--r--src/devices/bus/cpc/smartwatch.h15
-rw-r--r--src/devices/bus/cpc/symbfac2.cpp14
-rw-r--r--src/devices/bus/cpc/symbfac2.h8
-rw-r--r--src/devices/bus/cpc/transtape.cpp4
-rw-r--r--src/devices/bus/cpc/transtape.h8
-rw-r--r--src/devices/bus/crvision/rom.h7
-rw-r--r--src/devices/bus/crvision/slot.h9
-rw-r--r--src/devices/bus/dmv/dmvbus.h7
-rw-r--r--src/devices/bus/dmv/k012.h8
-rw-r--r--src/devices/bus/dmv/k210.h6
-rw-r--r--src/devices/bus/dmv/k220.h10
-rw-r--r--src/devices/bus/dmv/k230.h32
-rw-r--r--src/devices/bus/dmv/k233.h4
-rw-r--r--src/devices/bus/dmv/k801.h20
-rw-r--r--src/devices/bus/dmv/k803.h8
-rw-r--r--src/devices/bus/dmv/k806.h10
-rw-r--r--src/devices/bus/dmv/ram.h2
-rw-r--r--src/devices/bus/ecbbus/ecbbus.h22
-rw-r--r--src/devices/bus/ecbbus/grip.h14
-rw-r--r--src/devices/bus/econet/e01.cpp5
-rw-r--r--src/devices/bus/econet/e01.h17
-rw-r--r--src/devices/bus/econet/econet.h6
-rw-r--r--src/devices/bus/einstein/pipe/pipe.h11
-rw-r--r--src/devices/bus/einstein/pipe/silicon_disc.h14
-rw-r--r--src/devices/bus/einstein/pipe/speculator.cpp3
-rw-r--r--src/devices/bus/einstein/pipe/speculator.h6
-rw-r--r--src/devices/bus/einstein/pipe/tk02.h18
-rw-r--r--src/devices/bus/einstein/userport/mouse.h4
-rw-r--r--src/devices/bus/einstein/userport/speech.h6
-rw-r--r--src/devices/bus/einstein/userport/userport.cpp1
-rw-r--r--src/devices/bus/einstein/userport/userport.h17
-rw-r--r--src/devices/bus/ekara/rom.cpp30
-rw-r--r--src/devices/bus/ekara/rom.h11
-rw-r--r--src/devices/bus/ekara/slot.h9
-rw-r--r--src/devices/bus/electron/cart/abr.h2
-rw-r--r--src/devices/bus/electron/cart/ap34.h4
-rw-r--r--src/devices/bus/electron/cart/ap5.h4
-rw-r--r--src/devices/bus/electron/cart/aqr.h2
-rw-r--r--src/devices/bus/electron/cart/click.cpp2
-rw-r--r--src/devices/bus/electron/cart/click.h8
-rw-r--r--src/devices/bus/electron/cart/cumana.h4
-rw-r--r--src/devices/bus/electron/cart/elksdp1.cpp48
-rw-r--r--src/devices/bus/electron/cart/elksdp1.h46
-rw-r--r--src/devices/bus/electron/cart/mgc.h4
-rw-r--r--src/devices/bus/electron/cart/peg400.h4
-rw-r--r--src/devices/bus/electron/cart/romp144.h4
-rw-r--r--src/devices/bus/electron/cart/rs423.h4
-rw-r--r--src/devices/bus/electron/cart/slot.h16
-rw-r--r--src/devices/bus/electron/cart/sndexp.h6
-rw-r--r--src/devices/bus/electron/cart/sndexp3.h4
-rw-r--r--src/devices/bus/electron/cart/sp64.h4
-rw-r--r--src/devices/bus/electron/cart/std.h2
-rw-r--r--src/devices/bus/electron/cart/stlefs.h4
-rw-r--r--src/devices/bus/electron/cart/tube.h4
-rw-r--r--src/devices/bus/electron/elksd128.cpp133
-rw-r--r--src/devices/bus/electron/elksd128.h58
-rw-r--r--src/devices/bus/electron/elksd64.cpp44
-rw-r--r--src/devices/bus/electron/elksd64.h44
-rw-r--r--src/devices/bus/electron/exp.h7
-rw-r--r--src/devices/bus/electron/fbjoy.cpp66
-rw-r--r--src/devices/bus/electron/fbjoy.h39
-rw-r--r--src/devices/bus/electron/fbprint.h4
-rw-r--r--src/devices/bus/electron/m2105.cpp10
-rw-r--r--src/devices/bus/electron/m2105.h13
-rw-r--r--src/devices/bus/electron/mc68k.h17
-rw-r--r--src/devices/bus/electron/mode7.cpp2
-rw-r--r--src/devices/bus/electron/mode7.h8
-rw-r--r--src/devices/bus/electron/plus1.cpp10
-rw-r--r--src/devices/bus/electron/plus1.h12
-rw-r--r--src/devices/bus/electron/plus2.h4
-rw-r--r--src/devices/bus/electron/plus3.h6
-rw-r--r--src/devices/bus/electron/pwrjoy.cpp88
-rw-r--r--src/devices/bus/electron/pwrjoy.h41
-rw-r--r--src/devices/bus/electron/rombox.h8
-rw-r--r--src/devices/bus/electron/romboxp.h10
-rw-r--r--src/devices/bus/electron/sidewndr.cpp118
-rw-r--r--src/devices/bus/electron/sidewndr.h54
-rw-r--r--src/devices/bus/electron/voxbox.h6
-rw-r--r--src/devices/bus/ep64/exdos.h8
-rw-r--r--src/devices/bus/ep64/exp.cpp1
-rw-r--r--src/devices/bus/ep64/exp.h9
-rw-r--r--src/devices/bus/epson_qx/cqgmem.cpp2
-rw-r--r--src/devices/bus/epson_qx/cqgmem.h10
-rw-r--r--src/devices/bus/epson_qx/cr1510.cpp2
-rw-r--r--src/devices/bus/epson_qx/cr1510.h8
-rw-r--r--src/devices/bus/epson_qx/ide.cpp2
-rw-r--r--src/devices/bus/epson_qx/ide.h8
-rw-r--r--src/devices/bus/epson_qx/keyboard/keyboard.h25
-rw-r--r--src/devices/bus/epson_qx/multifont.cpp17
-rw-r--r--src/devices/bus/epson_qx/multifont.h14
-rw-r--r--src/devices/bus/epson_qx/option.cpp2
-rw-r--r--src/devices/bus/epson_qx/option.h23
-rw-r--r--src/devices/bus/epson_qx/semidisk.cpp148
-rw-r--r--src/devices/bus/epson_qx/semidisk.h65
-rw-r--r--src/devices/bus/epson_qx/sound_card.cpp6
-rw-r--r--src/devices/bus/epson_qx/sound_card.h16
-rw-r--r--src/devices/bus/epson_sio/epson_sio.cpp1
-rw-r--r--src/devices/bus/epson_sio/epson_sio.h9
-rw-r--r--src/devices/bus/epson_sio/pf10.h10
-rw-r--r--src/devices/bus/epson_sio/tf20.cpp3
-rw-r--r--src/devices/bus/epson_sio/tf20.h15
-rw-r--r--src/devices/bus/fmt_scsi/fmt121.h4
-rw-r--r--src/devices/bus/fmt_scsi/fmt_scsi.h11
-rw-r--r--src/devices/bus/fp1000/fp1000_exp.h19
-rw-r--r--src/devices/bus/fp1000/fp1020fd.h15
-rw-r--r--src/devices/bus/fp1000/fp1030_rampack.h14
-rw-r--r--src/devices/bus/fp1000/fp1060io.h13
-rw-r--r--src/devices/bus/fp1000/fp1060io_exp.h18
-rw-r--r--src/devices/bus/gamate/gamate_protection.h11
-rw-r--r--src/devices/bus/gamate/rom.h10
-rw-r--r--src/devices/bus/gamate/slot.h9
-rw-r--r--src/devices/bus/gameboy/gbslot.h5
-rw-r--r--src/devices/bus/gameboy/mdslot.cpp2
-rw-r--r--src/devices/bus/gameboy/mdslot.h5
-rw-r--r--src/devices/bus/gba/gba_slot.h9
-rw-r--r--src/devices/bus/gba/rom.h44
-rw-r--r--src/devices/bus/generic/ram.h4
-rw-r--r--src/devices/bus/gio64/gio64.h11
-rw-r--r--src/devices/bus/gio64/newport.cpp2
-rw-r--r--src/devices/bus/gio64/newport.h32
-rw-r--r--src/devices/bus/heathzenith/h19/tlb.cpp (renamed from src/mame/heathzenith/tlb.cpp)197
-rw-r--r--src/devices/bus/heathzenith/h19/tlb.h (renamed from src/mame/heathzenith/tlb.h)166
-rw-r--r--src/devices/bus/heathzenith/h8/cards.cpp50
-rw-r--r--src/devices/bus/heathzenith/h8/cards.h19
-rw-r--r--src/devices/bus/heathzenith/h8/cpu8080.cpp378
-rw-r--r--src/devices/bus/heathzenith/h8/cpu8080.h12
-rw-r--r--src/devices/bus/heathzenith/h8/front_panel.cpp364
-rw-r--r--src/devices/bus/heathzenith/h8/front_panel.h12
-rw-r--r--src/devices/bus/heathzenith/h8/h8bus.cpp375
-rw-r--r--src/devices/bus/heathzenith/h8/h8bus.h399
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_1.cpp85
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_1.h12
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_5.cpp238
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_5.h12
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_6.cpp533
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_6.h12
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_8.cpp157
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_8.h12
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_16.cpp117
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_16.h12
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_64.cpp248
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_64.h12
-rw-r--r--src/devices/bus/heathzenith/h89/cdr_fdc_880h.cpp415
-rw-r--r--src/devices/bus/heathzenith/h89/cdr_fdc_880h.h18
-rw-r--r--src/devices/bus/heathzenith/h89/h17_fdc.cpp385
-rw-r--r--src/devices/bus/heathzenith/h89/h17_fdc.h26
-rw-r--r--src/devices/bus/heathzenith/h89/h89bus.cpp566
-rw-r--r--src/devices/bus/heathzenith/h89/h89bus.h495
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_3.cpp359
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_3.h13
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_5.cpp209
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_5.h12
-rw-r--r--src/devices/bus/heathzenith/h89/mms77316_fdc.cpp355
-rw-r--r--src/devices/bus/heathzenith/h89/mms77316_fdc.h75
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_parallel_port.cpp206
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_parallel_port.h72
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_sound.cpp225
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_sound.h18
-rw-r--r--src/devices/bus/heathzenith/h89/we_pullup.cpp51
-rw-r--r--src/devices/bus/heathzenith/h89/we_pullup.h18
-rw-r--r--src/devices/bus/heathzenith/h89/z37_fdc.cpp268
-rw-r--r--src/devices/bus/heathzenith/h89/z37_fdc.h73
-rw-r--r--src/devices/bus/heathzenith/h89/z_89_11.cpp293
-rw-r--r--src/devices/bus/heathzenith/h89/z_89_11.h19
-rw-r--r--src/devices/bus/heathzenith/intr_cntrl/intr_cntrl.cpp (renamed from src/mame/heathzenith/intr_cntrl.cpp)0
-rw-r--r--src/devices/bus/heathzenith/intr_cntrl/intr_cntrl.h (renamed from src/mame/heathzenith/intr_cntrl.h)21
-rw-r--r--src/devices/bus/hexbus/hexbus.h9
-rw-r--r--src/devices/bus/hexbus/hx5102.h14
-rw-r--r--src/devices/bus/hexbus/tp0370.h4
-rw-r--r--src/devices/bus/hp80_io/82900.h14
-rw-r--r--src/devices/bus/hp80_io/82937.h12
-rw-r--r--src/devices/bus/hp80_io/82939.h10
-rw-r--r--src/devices/bus/hp80_io/hp80_io.cpp1
-rw-r--r--src/devices/bus/hp80_io/hp80_io.h17
-rw-r--r--src/devices/bus/hp9845_io/98032.h16
-rw-r--r--src/devices/bus/hp9845_io/98034.h14
-rw-r--r--src/devices/bus/hp9845_io/98035.h20
-rw-r--r--src/devices/bus/hp9845_io/98036.h8
-rw-r--r--src/devices/bus/hp9845_io/98046.h14
-rw-r--r--src/devices/bus/hp9845_io/hp9845_io.h2
-rw-r--r--src/devices/bus/hp9845_io/hp9871.h6
-rw-r--r--src/devices/bus/hp9845_io/hp9885.h6
-rw-r--r--src/devices/bus/hp_dio/hp98259.cpp329
-rw-r--r--src/devices/bus/hp_dio/hp98259.h19
-rw-r--r--src/devices/bus/hp_dio/hp98265a.cpp48
-rw-r--r--src/devices/bus/hp_dio/hp98265a.h6
-rw-r--r--src/devices/bus/hp_dio/hp98543.cpp10
-rw-r--r--src/devices/bus/hp_dio/hp98543.h6
-rw-r--r--src/devices/bus/hp_dio/hp98544.cpp10
-rw-r--r--src/devices/bus/hp_dio/hp98544.h6
-rw-r--r--src/devices/bus/hp_dio/hp98550.cpp10
-rw-r--r--src/devices/bus/hp_dio/hp98550.h6
-rw-r--r--src/devices/bus/hp_dio/hp98603a.cpp8
-rw-r--r--src/devices/bus/hp_dio/hp98603a.h6
-rw-r--r--src/devices/bus/hp_dio/hp98603b.cpp8
-rw-r--r--src/devices/bus/hp_dio/hp98603b.h6
-rw-r--r--src/devices/bus/hp_dio/hp98620.cpp4
-rw-r--r--src/devices/bus/hp_dio/hp98620.h6
-rw-r--r--src/devices/bus/hp_dio/hp98624.cpp8
-rw-r--r--src/devices/bus/hp_dio/hp98624.h6
-rw-r--r--src/devices/bus/hp_dio/hp98628_9.cpp1152
-rw-r--r--src/devices/bus/hp_dio/hp98628_9.h21
-rw-r--r--src/devices/bus/hp_dio/hp98643.cpp10
-rw-r--r--src/devices/bus/hp_dio/hp98643.h6
-rw-r--r--src/devices/bus/hp_dio/hp98644.cpp8
-rw-r--r--src/devices/bus/hp_dio/hp98644.h8
-rw-r--r--src/devices/bus/hp_dio/hp_dio.cpp12
-rw-r--r--src/devices/bus/hp_dio/hp_dio.h42
-rw-r--r--src/devices/bus/hp_dio/human_interface.h16
-rw-r--r--src/devices/bus/hp_hil/hlebase.h10
-rw-r--r--src/devices/bus/hp_hil/hlekbd.h14
-rw-r--r--src/devices/bus/hp_hil/hlemouse.cpp10
-rw-r--r--src/devices/bus/hp_hil/hlemouse.h10
-rw-r--r--src/devices/bus/hp_hil/hp_hil.h19
-rw-r--r--src/devices/bus/hp_ipc_io/82919.h8
-rw-r--r--src/devices/bus/hp_ipc_io/hp_ipc_io.cpp1
-rw-r--r--src/devices/bus/hp_ipc_io/hp_ipc_io.h13
-rw-r--r--src/devices/bus/idpartner/bus.h13
-rw-r--r--src/devices/bus/idpartner/gdp.cpp14
-rw-r--r--src/devices/bus/idpartner/sasi.cpp8
-rw-r--r--src/devices/bus/ieee488/c2031.cpp87
-rw-r--r--src/devices/bus/ieee488/c2031.h71
-rw-r--r--src/devices/bus/ieee488/c2040.cpp238
-rw-r--r--src/devices/bus/ieee488/c2040.h120
-rw-r--r--src/devices/bus/ieee488/c2040fdc.h62
-rw-r--r--src/devices/bus/ieee488/c8050.cpp285
-rw-r--r--src/devices/bus/ieee488/c8050.h139
-rw-r--r--src/devices/bus/ieee488/c8050fdc.h64
-rw-r--r--src/devices/bus/ieee488/c8280.cpp90
-rw-r--r--src/devices/bus/ieee488/c8280.h69
-rw-r--r--src/devices/bus/ieee488/d9060.cpp111
-rw-r--r--src/devices/bus/ieee488/d9060.h100
-rw-r--r--src/devices/bus/ieee488/grid2102.cpp358
-rw-r--r--src/devices/bus/ieee488/grid2102.h103
-rw-r--r--src/devices/bus/ieee488/hardbox.cpp74
-rw-r--r--src/devices/bus/ieee488/hardbox.h62
-rw-r--r--src/devices/bus/ieee488/hp9122c.cpp209
-rw-r--r--src/devices/bus/ieee488/hp9122c.h134
-rw-r--r--src/devices/bus/ieee488/hp9133.cpp16
-rw-r--r--src/devices/bus/ieee488/hp9133.h2
-rw-r--r--src/devices/bus/ieee488/hp9895.cpp150
-rw-r--r--src/devices/bus/ieee488/hp9895.h125
-rw-r--r--src/devices/bus/ieee488/ieee488.cpp42
-rw-r--r--src/devices/bus/ieee488/ieee488.h15
-rw-r--r--src/devices/bus/ieee488/remote488.cpp159
-rw-r--r--src/devices/bus/ieee488/remote488.h113
-rw-r--r--src/devices/bus/ieee488/shark.cpp51
-rw-r--r--src/devices/bus/ieee488/shark.h33
-rw-r--r--src/devices/bus/ieee488/softbox.cpp84
-rw-r--r--src/devices/bus/ieee488/softbox.h66
-rw-r--r--src/devices/bus/imi7000/imi5000h.h14
-rw-r--r--src/devices/bus/imi7000/imi7000.h11
-rw-r--r--src/devices/bus/intellec4/insdatastor.cpp6
-rw-r--r--src/devices/bus/intellec4/intellec4.h5
-rw-r--r--src/devices/bus/intellec4/prommemory.cpp2
-rw-r--r--src/devices/bus/intellec4/tapereader.cpp2
-rw-r--r--src/devices/bus/interpro/keyboard/hle.h14
-rw-r--r--src/devices/bus/interpro/keyboard/keyboard.h7
-rw-r--r--src/devices/bus/interpro/keyboard/lle.h20
-rw-r--r--src/devices/bus/interpro/mouse/mouse.cpp10
-rw-r--r--src/devices/bus/interpro/mouse/mouse.h19
-rw-r--r--src/devices/bus/interpro/sr/edge.cpp24
-rw-r--r--src/devices/bus/interpro/sr/edge.h58
-rw-r--r--src/devices/bus/interpro/sr/gt.cpp39
-rw-r--r--src/devices/bus/interpro/sr/gt.h44
-rw-r--r--src/devices/bus/interpro/sr/sr.h22
-rw-r--r--src/devices/bus/intv/ecs.h8
-rw-r--r--src/devices/bus/intv/slot.h7
-rw-r--r--src/devices/bus/intv/voice.h17
-rw-r--r--src/devices/bus/intv_ctrl/ctrl.h7
-rw-r--r--src/devices/bus/intv_ctrl/ecs_ctrl.h37
-rw-r--r--src/devices/bus/intv_ctrl/handctrl.h6
-rw-r--r--src/devices/bus/iq151/disc2.h8
-rw-r--r--src/devices/bus/iq151/grafik.h6
-rw-r--r--src/devices/bus/iq151/iq151.h7
-rw-r--r--src/devices/bus/iq151/minigraf.h6
-rw-r--r--src/devices/bus/iq151/ms151a.h6
-rw-r--r--src/devices/bus/iq151/rom.h4
-rw-r--r--src/devices/bus/iq151/staper.h6
-rw-r--r--src/devices/bus/iq151/video32.h6
-rw-r--r--src/devices/bus/iq151/video64.h6
-rw-r--r--src/devices/bus/isa/3c503.h6
-rw-r--r--src/devices/bus/isa/3c505.h18
-rw-r--r--src/devices/bus/isa/3xtwin.h10
-rw-r--r--src/devices/bus/isa/5080pa.cpp196
-rw-r--r--src/devices/bus/isa/5080pa.h13
-rw-r--r--src/devices/bus/isa/acb2072.cpp2
-rw-r--r--src/devices/bus/isa/acb2072.h10
-rw-r--r--src/devices/bus/isa/adlib.cpp30
-rw-r--r--src/devices/bus/isa/adlib.h9
-rw-r--r--src/devices/bus/isa/aga.h12
-rw-r--r--src/devices/bus/isa/aha1542b.cpp36
-rw-r--r--src/devices/bus/isa/aha1542b.h23
-rw-r--r--src/devices/bus/isa/aha1542c.cpp7
-rw-r--r--src/devices/bus/isa/aha1542c.h29
-rw-r--r--src/devices/bus/isa/aha174x.cpp21
-rw-r--r--src/devices/bus/isa/aha174x.h13
-rw-r--r--src/devices/bus/isa/amgda.cpp468
-rw-r--r--src/devices/bus/isa/amgda.h13
-rw-r--r--src/devices/bus/isa/asc88.cpp18
-rw-r--r--src/devices/bus/isa/asc88.h12
-rw-r--r--src/devices/bus/isa/bblue2.cpp4
-rw-r--r--src/devices/bus/isa/bblue2.h12
-rw-r--r--src/devices/bus/isa/bt54x.cpp45
-rw-r--r--src/devices/bus/isa/bt54x.h18
-rw-r--r--src/devices/bus/isa/cga.h50
-rw-r--r--src/devices/bus/isa/chessmdr.h8
-rw-r--r--src/devices/bus/isa/chessmsr.h10
-rw-r--r--src/devices/bus/isa/cl_sh260.cpp6
-rw-r--r--src/devices/bus/isa/cl_sh260.h16
-rw-r--r--src/devices/bus/isa/com.cpp100
-rw-r--r--src/devices/bus/isa/com.h53
-rw-r--r--src/devices/bus/isa/dcb.h10
-rw-r--r--src/devices/bus/isa/dectalk.cpp2
-rw-r--r--src/devices/bus/isa/dectalk.h24
-rw-r--r--src/devices/bus/isa/ega.cpp39
-rw-r--r--src/devices/bus/isa/ega.h10
-rw-r--r--src/devices/bus/isa/eis_hgb107x.cpp2
-rw-r--r--src/devices/bus/isa/eis_hgb107x.h10
-rw-r--r--src/devices/bus/isa/eis_sad8852.h14
-rw-r--r--src/devices/bus/isa/eis_twib.h8
-rw-r--r--src/devices/bus/isa/ex1280.cpp4
-rw-r--r--src/devices/bus/isa/ex1280.h10
-rw-r--r--src/devices/bus/isa/fdc.cpp104
-rw-r--r--src/devices/bus/isa/fdc.h47
-rw-r--r--src/devices/bus/isa/finalchs.cpp2
-rw-r--r--src/devices/bus/isa/finalchs.h16
-rw-r--r--src/devices/bus/isa/gblaster.cpp11
-rw-r--r--src/devices/bus/isa/gblaster.h6
-rw-r--r--src/devices/bus/isa/gus.cpp22
-rw-r--r--src/devices/bus/isa/gus.h18
-rw-r--r--src/devices/bus/isa/hdc.cpp17
-rw-r--r--src/devices/bus/isa/hdc.h25
-rw-r--r--src/devices/bus/isa/hpblp.cpp4
-rw-r--r--src/devices/bus/isa/hpblp.h14
-rw-r--r--src/devices/bus/isa/ibm_mfc.cpp7
-rw-r--r--src/devices/bus/isa/ibm_mfc.h6
-rw-r--r--src/devices/bus/isa/ibm_speech.h8
-rw-r--r--src/devices/bus/isa/ide.cpp7
-rw-r--r--src/devices/bus/isa/ide.h12
-rw-r--r--src/devices/bus/isa/isa.h20
-rw-r--r--src/devices/bus/isa/isa_cards.cpp172
-rw-r--r--src/devices/bus/isa/lbaenhancer.h16
-rw-r--r--src/devices/bus/isa/lpt.h8
-rw-r--r--src/devices/bus/isa/lrk330.cpp2
-rw-r--r--src/devices/bus/isa/lrk330.h16
-rw-r--r--src/devices/bus/isa/mc1502_fdc.h6
-rw-r--r--src/devices/bus/isa/mc1502_rom.h6
-rw-r--r--src/devices/bus/isa/mcd.cpp28
-rw-r--r--src/devices/bus/isa/mcd.h10
-rw-r--r--src/devices/bus/isa/mda.cpp1264
-rw-r--r--src/devices/bus/isa/mda.h133
-rw-r--r--src/devices/bus/isa/mpu401.cpp15
-rw-r--r--src/devices/bus/isa/mpu401.h7
-rw-r--r--src/devices/bus/isa/mufdc.h12
-rw-r--r--src/devices/bus/isa/myb3k_com.h8
-rw-r--r--src/devices/bus/isa/myb3k_fdc.h12
-rw-r--r--src/devices/bus/isa/ncr53c400.cpp235
-rw-r--r--src/devices/bus/isa/ncr53c400.h59
-rw-r--r--src/devices/bus/isa/ne1000.h8
-rw-r--r--src/devices/bus/isa/ne2000.h8
-rw-r--r--src/devices/bus/isa/np600.h12
-rw-r--r--src/devices/bus/isa/num9rev.h8
-rw-r--r--src/devices/bus/isa/omti8621.cpp141
-rw-r--r--src/devices/bus/isa/omti8621.h25
-rw-r--r--src/devices/bus/isa/opus100pm.h12
-rw-r--r--src/devices/bus/isa/p1_fdc.h8
-rw-r--r--src/devices/bus/isa/p1_hdc.h8
-rw-r--r--src/devices/bus/isa/p1_rom.h6
-rw-r--r--src/devices/bus/isa/p1_sound.h12
-rw-r--r--src/devices/bus/isa/pc1640_iga.h4
-rw-r--r--src/devices/bus/isa/pcat512me.cpp117
-rw-r--r--src/devices/bus/isa/pcat512me.h13
-rw-r--r--src/devices/bus/isa/pcmidi.h12
-rw-r--r--src/devices/bus/isa/pds.h8
-rw-r--r--src/devices/bus/isa/pgc.h14
-rw-r--r--src/devices/bus/isa/prose4k1.cpp92
-rw-r--r--src/devices/bus/isa/prose4k1.h13
-rw-r--r--src/devices/bus/isa/sb16.cpp221
-rw-r--r--src/devices/bus/isa/sb16.h31
-rw-r--r--src/devices/bus/isa/sblaster.cpp64
-rw-r--r--src/devices/bus/isa/sblaster.h25
-rw-r--r--src/devices/bus/isa/sc499.h10
-rw-r--r--src/devices/bus/isa/side116.h10
-rw-r--r--src/devices/bus/isa/ssi2001.h6
-rw-r--r--src/devices/bus/isa/stereo_fx.cpp15
-rw-r--r--src/devices/bus/isa/stereo_fx.h14
-rw-r--r--src/devices/bus/isa/svga_cirrus.cpp476
-rw-r--r--src/devices/bus/isa/svga_cirrus.h65
-rw-r--r--src/devices/bus/isa/svga_paradise.cpp236
-rw-r--r--src/devices/bus/isa/svga_paradise.h115
-rw-r--r--src/devices/bus/isa/svga_s3.cpp18
-rw-r--r--src/devices/bus/isa/svga_s3.h10
-rw-r--r--src/devices/bus/isa/svga_trident.cpp86
-rw-r--r--src/devices/bus/isa/svga_trident.h22
-rw-r--r--src/devices/bus/isa/svga_tseng.cpp163
-rw-r--r--src/devices/bus/isa/svga_tseng.h59
-rw-r--r--src/devices/bus/isa/tekram_dc820.cpp20
-rw-r--r--src/devices/bus/isa/tekram_dc820.h28
-rw-r--r--src/devices/bus/isa/tiga_spea.cpp80
-rw-r--r--src/devices/bus/isa/tiga_spea.h44
-rw-r--r--src/devices/bus/isa/ubpnic.cpp522
-rw-r--r--src/devices/bus/isa/ubpnic.h13
-rw-r--r--src/devices/bus/isa/ultra12f.h12
-rw-r--r--src/devices/bus/isa/ultra14f.cpp10
-rw-r--r--src/devices/bus/isa/ultra14f.h8
-rw-r--r--src/devices/bus/isa/ultra24f.cpp10
-rw-r--r--src/devices/bus/isa/ultra24f.h8
-rw-r--r--src/devices/bus/isa/vga.cpp22
-rw-r--r--src/devices/bus/isa/vga.h11
-rw-r--r--src/devices/bus/isa/vga_ati.cpp28
-rw-r--r--src/devices/bus/isa/vga_ati.h34
-rw-r--r--src/devices/bus/isa/wd1002a_wx1.h8
-rw-r--r--src/devices/bus/isa/wd1007a.cpp2
-rw-r--r--src/devices/bus/isa/wd1007a.h6
-rw-r--r--src/devices/bus/isa/wdxt_gen.h16
-rw-r--r--src/devices/bus/isa/wss.cpp72
-rw-r--r--src/devices/bus/isa/wss.h40
-rw-r--r--src/devices/bus/isa/xtide.h10
-rw-r--r--src/devices/bus/isa/zxbus_adapter.cpp37
-rw-r--r--src/devices/bus/isa/zxbus_adapter.h28
-rw-r--r--src/devices/bus/isbx/compis_fdc.h6
-rw-r--r--src/devices/bus/isbx/isbc_218a.cpp2
-rw-r--r--src/devices/bus/isbx/isbc_218a.h6
-rw-r--r--src/devices/bus/isbx/isbx.h17
-rw-r--r--src/devices/bus/jakks_gamekey/rom.h2
-rw-r--r--src/devices/bus/jakks_gamekey/slot.h7
-rw-r--r--src/devices/bus/jvs/cyberlead.cpp486
-rw-r--r--src/devices/bus/jvs/cyberlead.h95
-rw-r--r--src/devices/bus/jvs/jvs.cpp449
-rw-r--r--src/devices/bus/jvs/jvs.h154
-rw-r--r--src/devices/bus/jvs/jvshle.cpp868
-rw-r--r--src/devices/bus/jvs/jvshle.h175
-rw-r--r--src/devices/bus/jvs/namcoio.cpp1611
-rw-r--r--src/devices/bus/jvs/namcoio.h73
-rw-r--r--src/devices/bus/kc/d002.h8
-rw-r--r--src/devices/bus/kc/d004.cpp14
-rw-r--r--src/devices/bus/kc/d004.h20
-rw-r--r--src/devices/bus/kc/kc.h16
-rw-r--r--src/devices/bus/kc/ram.h10
-rw-r--r--src/devices/bus/kc/rom.h8
-rw-r--r--src/devices/bus/keytronic/informer_kbd.cpp440
-rw-r--r--src/devices/bus/keytronic/informer_kbd.h21
-rw-r--r--src/devices/bus/keytronic/kay_kbd.cpp (renamed from src/mame/kaypro/kay_kbd.cpp)52
-rw-r--r--src/devices/bus/keytronic/kay_kbd.h12
-rw-r--r--src/devices/bus/keytronic/keytronic.cpp91
-rw-r--r--src/devices/bus/keytronic/keytronic.h99
-rw-r--r--src/devices/bus/keytronic/keytronic_l2207.cpp454
-rw-r--r--src/devices/bus/keytronic/keytronic_l2207.h20
-rw-r--r--src/devices/bus/kim1/k1008_vismem.cpp8
-rw-r--r--src/devices/bus/kim1/k1016_16k.cpp2
-rw-r--r--src/devices/bus/kim1/kim1bus.h17
-rw-r--r--src/devices/bus/lpci/cirrus.h4
-rw-r--r--src/devices/bus/lpci/i82371ab.h4
-rw-r--r--src/devices/bus/lpci/i82371sb.h4
-rw-r--r--src/devices/bus/lpci/i82439tx.h4
-rw-r--r--src/devices/bus/lpci/mpc105.h4
-rw-r--r--src/devices/bus/lpci/northbridge.h4
-rw-r--r--src/devices/bus/lpci/pci.h11
-rw-r--r--src/devices/bus/lpci/southbridge.h12
-rw-r--r--src/devices/bus/lpci/vt82c505.h4
-rw-r--r--src/devices/bus/m5/slot.cpp33
-rw-r--r--src/devices/bus/m5/slot.h49
-rw-r--r--src/devices/bus/mackbd/keyboard.cpp20
-rw-r--r--src/devices/bus/mackbd/mackbd.h7
-rw-r--r--src/devices/bus/mackbd/pluskbd.cpp4
-rw-r--r--src/devices/bus/macpds/hyperdrive.h14
-rw-r--r--src/devices/bus/macpds/macpds.h24
-rw-r--r--src/devices/bus/macpds/pds_tpdfpd.h14
-rw-r--r--src/devices/bus/mc10/mc10_cart.h15
-rw-r--r--src/devices/bus/mc10/mcx128.cpp22
-rw-r--r--src/devices/bus/mc10/mcx128.h6
-rw-r--r--src/devices/bus/mc10/multiports_ext.cpp6
-rw-r--r--src/devices/bus/mc10/pak.cpp2
-rw-r--r--src/devices/bus/mc10/pak.h6
-rw-r--r--src/devices/bus/mc10/ram.cpp2
-rw-r--r--src/devices/bus/mc10/ram.h6
-rw-r--r--src/devices/bus/mc68000/floppy.h6
-rw-r--r--src/devices/bus/mc68000/ram.h4
-rw-r--r--src/devices/bus/mc68000/sysbus.h15
-rw-r--r--src/devices/bus/megadrive/cart/action_replay.cpp67
-rw-r--r--src/devices/bus/megadrive/cart/action_replay.h37
-rw-r--r--src/devices/bus/megadrive/cart/avartisan.cpp74
-rw-r--r--src/devices/bus/megadrive/cart/avartisan.h33
-rw-r--r--src/devices/bus/megadrive/cart/eeprom.cpp261
-rw-r--r--src/devices/bus/megadrive/cart/eeprom.h113
-rw-r--r--src/devices/bus/megadrive/cart/everdrive.cpp235
-rw-r--r--src/devices/bus/megadrive/cart/everdrive.h58
-rw-r--r--src/devices/bus/megadrive/cart/gamtec.cpp475
-rw-r--r--src/devices/bus/megadrive/cart/gamtec.h171
-rw-r--r--src/devices/bus/megadrive/cart/jcart.cpp177
-rw-r--r--src/devices/bus/megadrive/cart/jcart.h79
-rw-r--r--src/devices/bus/megadrive/cart/mcpirate.cpp225
-rw-r--r--src/devices/bus/megadrive/cart/mcpirate.h75
-rw-r--r--src/devices/bus/megadrive/cart/miky.cpp88
-rw-r--r--src/devices/bus/megadrive/cart/miky.h43
-rw-r--r--src/devices/bus/megadrive/cart/multigame.cpp183
-rw-r--r--src/devices/bus/megadrive/cart/multigame.h69
-rw-r--r--src/devices/bus/megadrive/cart/options.cpp220
-rw-r--r--src/devices/bus/megadrive/cart/options.h90
-rw-r--r--src/devices/bus/megadrive/cart/rockworld.cpp40
-rw-r--r--src/devices/bus/megadrive/cart/rockworld.h31
-rw-r--r--src/devices/bus/megadrive/cart/rom.cpp146
-rw-r--r--src/devices/bus/megadrive/cart/rom.h60
-rw-r--r--src/devices/bus/megadrive/cart/segach.cpp666
-rw-r--r--src/devices/bus/megadrive/cart/segach.h108
-rw-r--r--src/devices/bus/megadrive/cart/segach_img.h171
-rw-r--r--src/devices/bus/megadrive/cart/sfteam.cpp353
-rw-r--r--src/devices/bus/megadrive/cart/sfteam.h102
-rw-r--r--src/devices/bus/megadrive/cart/slot.cpp262
-rw-r--r--src/devices/bus/megadrive/cart/slot.h114
-rw-r--r--src/devices/bus/megadrive/cart/smb.cpp80
-rw-r--r--src/devices/bus/megadrive/cart/smb.h44
-rw-r--r--src/devices/bus/megadrive/cart/smw64.cpp141
-rw-r--r--src/devices/bus/megadrive/cart/smw64.h37
-rw-r--r--src/devices/bus/megadrive/cart/sram.cpp299
-rw-r--r--src/devices/bus/megadrive/cart/sram.h115
-rw-r--r--src/devices/bus/megadrive/cart/ssf.cpp223
-rw-r--r--src/devices/bus/megadrive/cart/ssf.h79
-rw-r--r--src/devices/bus/megadrive/cart/t5740.cpp102
-rw-r--r--src/devices/bus/megadrive/cart/t5740.h34
-rw-r--r--src/devices/bus/megadrive/cart/tekkensp.cpp64
-rw-r--r--src/devices/bus/megadrive/cart/tekkensp.h29
-rw-r--r--src/devices/bus/megadrive/cart/xboy.cpp216
-rw-r--r--src/devices/bus/megadrive/cart/xboy.h73
-rw-r--r--src/devices/bus/megadrive/eeprom.cpp36
-rw-r--r--src/devices/bus/megadrive/eeprom.h30
-rw-r--r--src/devices/bus/megadrive/ggenie.h6
-rw-r--r--src/devices/bus/megadrive/jcart.cpp2
-rw-r--r--src/devices/bus/megadrive/jcart.h16
-rw-r--r--src/devices/bus/megadrive/md_carts.cpp25
-rw-r--r--src/devices/bus/megadrive/md_slot.cpp25
-rw-r--r--src/devices/bus/megadrive/md_slot.h25
-rw-r--r--src/devices/bus/megadrive/rom.cpp243
-rw-r--r--src/devices/bus/megadrive/rom.h105
-rw-r--r--src/devices/bus/megadrive/sk.h6
-rw-r--r--src/devices/bus/megadrive/stm95.h4
-rw-r--r--src/devices/bus/megadrive/svp.h12
-rw-r--r--src/devices/bus/megadrive/titan.cpp67
-rw-r--r--src/devices/bus/megadrive/titan.h30
-rw-r--r--src/devices/bus/megadrive/tplay96.cpp66
-rw-r--r--src/devices/bus/megadrive/tplay96.h36
-rw-r--r--src/devices/bus/midi/midi.h7
-rw-r--r--src/devices/bus/midi/midiinport.h2
-rw-r--r--src/devices/bus/midi/midioutport.h2
-rw-r--r--src/devices/bus/mm2/crtc186.cpp302
-rw-r--r--src/devices/bus/mm2/crtc186.h98
-rw-r--r--src/devices/bus/mm2/exp.cpp122
-rw-r--r--src/devices/bus/mm2/exp.h173
-rw-r--r--src/devices/bus/mm2/meme186.cpp24
-rw-r--r--src/devices/bus/mm2/meme186.h30
-rw-r--r--src/devices/bus/mm2/mm2kb.cpp197
-rw-r--r--src/devices/bus/mm2/mm2kb.h52
-rw-r--r--src/devices/bus/mm2/mmc186.cpp234
-rw-r--r--src/devices/bus/mm2/mmc186.h84
-rw-r--r--src/devices/bus/mononcol/rom.h5
-rw-r--r--src/devices/bus/mononcol/slot.h6
-rw-r--r--src/devices/bus/mpf1/slot.cpp2
-rw-r--r--src/devices/bus/mpf1/slot.h11
-rw-r--r--src/devices/bus/mpf1/ssb.cpp88
-rw-r--r--src/devices/bus/mpf1/ssb.h1
-rw-r--r--src/devices/bus/msx/cart/arc.cpp4
-rw-r--r--src/devices/bus/msx/cart/ascii.cpp8
-rw-r--r--src/devices/bus/msx/cart/beepack.h4
-rw-r--r--src/devices/bus/msx/cart/bm_012.cpp8
-rw-r--r--src/devices/bus/msx/cart/cartridge.cpp2
-rw-r--r--src/devices/bus/msx/cart/disk.cpp22
-rw-r--r--src/devices/bus/msx/cart/dooly.cpp2
-rw-r--r--src/devices/bus/msx/cart/easi_speech.cpp4
-rw-r--r--src/devices/bus/msx/cart/easi_speech.h6
-rw-r--r--src/devices/bus/msx/cart/fmpac.cpp6
-rw-r--r--src/devices/bus/msx/cart/franky.cpp4
-rw-r--r--src/devices/bus/msx/cart/fs_sr021.cpp4
-rw-r--r--src/devices/bus/msx/cart/fs_sr022.cpp4
-rw-r--r--src/devices/bus/msx/cart/halnote.cpp2
-rw-r--r--src/devices/bus/msx/cart/hbi55.cpp6
-rw-r--r--src/devices/bus/msx/cart/hfox.cpp2
-rw-r--r--src/devices/bus/msx/cart/holy_quran.cpp2
-rw-r--r--src/devices/bus/msx/cart/ide.cpp8
-rw-r--r--src/devices/bus/msx/cart/ink.cpp4
-rw-r--r--src/devices/bus/msx/cart/kanji.cpp8
-rw-r--r--src/devices/bus/msx/cart/konami.cpp38
-rw-r--r--src/devices/bus/msx/cart/korean.cpp12
-rw-r--r--src/devices/bus/msx/cart/loveplus.cpp4
-rw-r--r--src/devices/bus/msx/cart/majutsushi.cpp2
-rw-r--r--src/devices/bus/msx/cart/matra.cpp4
-rw-r--r--src/devices/bus/msx/cart/moonsound.cpp25
-rw-r--r--src/devices/bus/msx/cart/msx_audio.cpp22
-rw-r--r--src/devices/bus/msx/cart/msx_audio_kb.cpp4
-rw-r--r--src/devices/bus/msx/cart/msx_audio_kb.h7
-rw-r--r--src/devices/bus/msx/cart/msxdos2.cpp4
-rw-r--r--src/devices/bus/msx/cart/quickdisk.cpp2
-rw-r--r--src/devices/bus/msx/cart/ram.cpp14
-rw-r--r--src/devices/bus/msx/cart/scsi.cpp23
-rw-r--r--src/devices/bus/msx/cart/slotexpander.cpp6
-rw-r--r--src/devices/bus/msx/cart/slotoptions.cpp2
-rw-r--r--src/devices/bus/msx/cart/slotoptions.h2
-rw-r--r--src/devices/bus/msx/cart/softcard.h4
-rw-r--r--src/devices/bus/msx/cart/superloderunner.cpp2
-rw-r--r--src/devices/bus/msx/cart/video80.cpp212
-rw-r--r--src/devices/bus/msx/cart/video80.h19
-rw-r--r--src/devices/bus/msx/cart/yamaha_ucn01.cpp4
-rw-r--r--src/devices/bus/msx/ctrl/ctrl.h7
-rw-r--r--src/devices/bus/msx/ctrl/hypershot.cpp2
-rw-r--r--src/devices/bus/msx/ctrl/libbler.cpp2
-rw-r--r--src/devices/bus/msx/ctrl/magickey.cpp2
-rw-r--r--src/devices/bus/msx/ctrl/mouse.cpp4
-rw-r--r--src/devices/bus/msx/ctrl/sgadapt.cpp4
-rw-r--r--src/devices/bus/msx/ctrl/towns6b.cpp2
-rw-r--r--src/devices/bus/msx/ctrl/vaus.cpp4
-rw-r--r--src/devices/bus/msx/ctrl/xe1ap.cpp4
-rw-r--r--src/devices/bus/msx/minicart/minicart.h2
-rw-r--r--src/devices/bus/msx/module/module.h2
-rw-r--r--src/devices/bus/msx/module/sfg.cpp21
-rw-r--r--src/devices/bus/msx/module/skw01.cpp6
-rw-r--r--src/devices/bus/msx/slot/ax230.h4
-rw-r--r--src/devices/bus/msx/slot/bruc100.h4
-rw-r--r--src/devices/bus/msx/slot/bunsetsu.h4
-rw-r--r--src/devices/bus/msx/slot/cartridge.h4
-rw-r--r--src/devices/bus/msx/slot/disk.cpp1
-rw-r--r--src/devices/bus/msx/slot/disk.h98
-rw-r--r--src/devices/bus/msx/slot/fs4600.cpp5
-rw-r--r--src/devices/bus/msx/slot/fs4600.h8
-rw-r--r--src/devices/bus/msx/slot/fsa1fm.cpp22
-rw-r--r--src/devices/bus/msx/slot/fsa1fm.h18
-rw-r--r--src/devices/bus/msx/slot/msx_rs232.cpp19
-rw-r--r--src/devices/bus/msx/slot/msx_rs232.h34
-rw-r--r--src/devices/bus/msx/slot/msx_write.h6
-rw-r--r--src/devices/bus/msx/slot/music.h2
-rw-r--r--src/devices/bus/msx/slot/panasonic08.cpp11
-rw-r--r--src/devices/bus/msx/slot/panasonic08.h8
-rw-r--r--src/devices/bus/msx/slot/panasonic08r.cpp166
-rw-r--r--src/devices/bus/msx/slot/panasonic08r.h52
-rw-r--r--src/devices/bus/msx/slot/ram.cpp9
-rw-r--r--src/devices/bus/msx/slot/ram.h4
-rw-r--r--src/devices/bus/msx/slot/ram_mm.cpp7
-rw-r--r--src/devices/bus/msx/slot/ram_mm.h8
-rw-r--r--src/devices/bus/msx/slot/rom.h2
-rw-r--r--src/devices/bus/msx/slot/sony08.cpp8
-rw-r--r--src/devices/bus/msx/slot/sony08.h8
-rw-r--r--src/devices/bus/mtu130/board.h8
-rw-r--r--src/devices/bus/mtu130/datamover.cpp2
-rw-r--r--src/devices/bus/mtu130/datamover.h12
-rw-r--r--src/devices/bus/mtx/cfx.h8
-rw-r--r--src/devices/bus/mtx/exp.h7
-rw-r--r--src/devices/bus/mtx/magrom.h6
-rw-r--r--src/devices/bus/mtx/rompak.h4
-rw-r--r--src/devices/bus/mtx/sdx.h25
-rw-r--r--src/devices/bus/multibus/cpuap.cpp26
-rw-r--r--src/devices/bus/multibus/cpuap.h14
-rw-r--r--src/devices/bus/multibus/dsd5217.cpp884
-rw-r--r--src/devices/bus/multibus/dsd5217.h13
-rw-r--r--src/devices/bus/multibus/exos201.cpp482
-rw-r--r--src/devices/bus/multibus/exos201.h13
-rw-r--r--src/devices/bus/multibus/isbc202.h8
-rw-r--r--src/devices/bus/multibus/isbc8024.cpp2
-rw-r--r--src/devices/bus/multibus/isbc8024.h14
-rw-r--r--src/devices/bus/multibus/labtam_3232.h12
-rw-r--r--src/devices/bus/multibus/labtam_vducom.cpp6
-rw-r--r--src/devices/bus/multibus/labtam_vducom.h23
-rw-r--r--src/devices/bus/multibus/labtam_z80sbc.h16
-rw-r--r--src/devices/bus/multibus/multibus.cpp50
-rw-r--r--src/devices/bus/multibus/multibus.h44
-rw-r--r--src/devices/bus/multibus/robotron_k7070.h18
-rw-r--r--src/devices/bus/multibus/robotron_k7071.cpp2
-rw-r--r--src/devices/bus/multibus/robotron_k7071.h12
-rw-r--r--src/devices/bus/multibus/serad.h14
-rw-r--r--src/devices/bus/multibus/sun1.cpp533
-rw-r--r--src/devices/bus/multibus/sun1.h14
-rw-r--r--src/devices/bus/mz80/ar_romcard.cpp123
-rw-r--r--src/devices/bus/mz80/ar_romcard.h14
-rw-r--r--src/devices/bus/mz80/mz1e05.cpp135
-rw-r--r--src/devices/bus/mz80/mz1e05.h14
-rw-r--r--src/devices/bus/mz80/mz1e30.cpp104
-rw-r--r--src/devices/bus/mz80/mz1e30.h14
-rw-r--r--src/devices/bus/mz80/mz1e35.cpp63
-rw-r--r--src/devices/bus/mz80/mz1e35.h14
-rw-r--r--src/devices/bus/mz80/mz1r18.cpp102
-rw-r--r--src/devices/bus/mz80/mz1r18.h14
-rw-r--r--src/devices/bus/mz80/mz1r37.cpp61
-rw-r--r--src/devices/bus/mz80/mz1r37.h38
-rw-r--r--src/devices/bus/mz80/mz80_exp.cpp88
-rw-r--r--src/devices/bus/mz80/mz80_exp.h80
-rw-r--r--src/devices/bus/nabupc/adapter.h6
-rw-r--r--src/devices/bus/nabupc/fdc.cpp6
-rw-r--r--src/devices/bus/nabupc/hdd.cpp4
-rw-r--r--src/devices/bus/nabupc/option.h17
-rw-r--r--src/devices/bus/nabupc/rs232.cpp4
-rw-r--r--src/devices/bus/nasbus/avc.h6
-rw-r--r--src/devices/bus/nasbus/floppy.h6
-rw-r--r--src/devices/bus/nasbus/nasbus.h15
-rw-r--r--src/devices/bus/nec_fdd/pc80s31k.cpp (renamed from src/mame/nec/pc80s31k.cpp)181
-rw-r--r--src/devices/bus/nec_fdd/pc80s31k.h (renamed from src/mame/nec/pc80s31k.h)45
-rw-r--r--src/devices/bus/neogeo/boot_cthd.h8
-rw-r--r--src/devices/bus/neogeo/boot_kof10th.h6
-rw-r--r--src/devices/bus/neogeo/boot_kof2k2.h6
-rw-r--r--src/devices/bus/neogeo/boot_kof2k3.h6
-rw-r--r--src/devices/bus/neogeo/boot_misc.h12
-rw-r--r--src/devices/bus/neogeo/boot_svc.h4
-rw-r--r--src/devices/bus/neogeo/cmc.h10
-rw-r--r--src/devices/bus/neogeo/fatfury2.h6
-rw-r--r--src/devices/bus/neogeo/kof2k2.h6
-rw-r--r--src/devices/bus/neogeo/kof98.h6
-rw-r--r--src/devices/bus/neogeo/mslugx.h6
-rw-r--r--src/devices/bus/neogeo/pcm2.h6
-rw-r--r--src/devices/bus/neogeo/prot_cmc.h4
-rw-r--r--src/devices/bus/neogeo/prot_cthd.h4
-rw-r--r--src/devices/bus/neogeo/prot_fatfury2.h6
-rw-r--r--src/devices/bus/neogeo/prot_kof2k2.h4
-rw-r--r--src/devices/bus/neogeo/prot_kof2k3bl.h4
-rw-r--r--src/devices/bus/neogeo/prot_kof98.h4
-rw-r--r--src/devices/bus/neogeo/prot_misc.h4
-rw-r--r--src/devices/bus/neogeo/prot_mslugx.h4
-rw-r--r--src/devices/bus/neogeo/prot_pcm2.h4
-rw-r--r--src/devices/bus/neogeo/prot_pvc.h4
-rw-r--r--src/devices/bus/neogeo/prot_sma.h4
-rw-r--r--src/devices/bus/neogeo/pvc.h6
-rw-r--r--src/devices/bus/neogeo/rom.h8
-rw-r--r--src/devices/bus/neogeo/sbp.h4
-rw-r--r--src/devices/bus/neogeo/slot.h9
-rw-r--r--src/devices/bus/neogeo/sma.h6
-rw-r--r--src/devices/bus/neogeo_ctrl/ctrl.h18
-rw-r--r--src/devices/bus/neogeo_ctrl/dial.h4
-rw-r--r--src/devices/bus/neogeo_ctrl/irrmaze.h4
-rw-r--r--src/devices/bus/neogeo_ctrl/joystick.h8
-rw-r--r--src/devices/bus/neogeo_ctrl/kizuna4p.h4
-rw-r--r--src/devices/bus/neogeo_ctrl/mahjong.h6
-rw-r--r--src/devices/bus/nes/2a03pur.h2
-rw-r--r--src/devices/bus/nes/act53.h2
-rw-r--r--src/devices/bus/nes/aladdin.h21
-rw-r--r--src/devices/bus/nes/ave.h2
-rw-r--r--src/devices/bus/nes/bandai.h12
-rw-r--r--src/devices/bus/nes/batlab.h2
-rw-r--r--src/devices/bus/nes/benshieng.h2
-rw-r--r--src/devices/bus/nes/bootleg.h46
-rw-r--r--src/devices/bus/nes/camerica.h4
-rw-r--r--src/devices/bus/nes/cony.h2
-rw-r--r--src/devices/bus/nes/datach.h19
-rw-r--r--src/devices/bus/nes/disksys.cpp63
-rw-r--r--src/devices/bus/nes/disksys.h14
-rw-r--r--src/devices/bus/nes/event.h8
-rw-r--r--src/devices/bus/nes/ggenie.h4
-rw-r--r--src/devices/bus/nes/irem.h4
-rw-r--r--src/devices/bus/nes/jaleco.h18
-rw-r--r--src/devices/bus/nes/jncota.h2
-rw-r--r--src/devices/bus/nes/jy.h2
-rw-r--r--src/devices/bus/nes/kaiser.h20
-rw-r--r--src/devices/bus/nes/karastudio.h19
-rw-r--r--src/devices/bus/nes/konami.h12
-rw-r--r--src/devices/bus/nes/legacy.h2
-rw-r--r--src/devices/bus/nes/mmc1.h2
-rw-r--r--src/devices/bus/nes/mmc1_clones.h12
-rw-r--r--src/devices/bus/nes/mmc2.h2
-rw-r--r--src/devices/bus/nes/mmc3.h2
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp4
-rw-r--r--src/devices/bus/nes/mmc3_clones.h76
-rw-r--r--src/devices/bus/nes/mmc5.cpp80
-rw-r--r--src/devices/bus/nes/mmc5.h40
-rw-r--r--src/devices/bus/nes/multigame.h76
-rw-r--r--src/devices/bus/nes/namcot.cpp5
-rw-r--r--src/devices/bus/nes/namcot.h14
-rw-r--r--src/devices/bus/nes/nanjing.h2
-rw-r--r--src/devices/bus/nes/nes_slot.cpp2
-rw-r--r--src/devices/bus/nes/nes_slot.h25
-rw-r--r--src/devices/bus/nes/ntdec.h2
-rw-r--r--src/devices/bus/nes/nxrom.h2
-rw-r--r--src/devices/bus/nes/pirate.h16
-rw-r--r--src/devices/bus/nes/pt554.h2
-rw-r--r--src/devices/bus/nes/racermate.h2
-rw-r--r--src/devices/bus/nes/rexsoft.h4
-rw-r--r--src/devices/bus/nes/sachen.h8
-rw-r--r--src/devices/bus/nes/sealie.h2
-rw-r--r--src/devices/bus/nes/somari.h2
-rw-r--r--src/devices/bus/nes/subor.h6
-rw-r--r--src/devices/bus/nes/sunsoft.cpp2
-rw-r--r--src/devices/bus/nes/sunsoft.h8
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.h23
-rw-r--r--src/devices/bus/nes/taito.h6
-rw-r--r--src/devices/bus/nes/tengen.h2
-rw-r--r--src/devices/bus/nes/txc.h4
-rw-r--r--src/devices/bus/nes/vrc_clones.h26
-rw-r--r--src/devices/bus/nes/waixing.h14
-rw-r--r--src/devices/bus/nes_ctrl/4score.h8
-rw-r--r--src/devices/bus/nes_ctrl/arkpaddle.h6
-rw-r--r--src/devices/bus/nes_ctrl/bandaihs.h12
-rw-r--r--src/devices/bus/nes_ctrl/bcbattle.h6
-rw-r--r--src/devices/bus/nes_ctrl/ctrl.h11
-rw-r--r--src/devices/bus/nes_ctrl/dorepiano.h4
-rw-r--r--src/devices/bus/nes_ctrl/fckeybrd.h12
-rw-r--r--src/devices/bus/nes_ctrl/fcmat.h6
-rw-r--r--src/devices/bus/nes_ctrl/hori.h8
-rw-r--r--src/devices/bus/nes_ctrl/joypad.h18
-rw-r--r--src/devices/bus/nes_ctrl/konamibag.h4
-rw-r--r--src/devices/bus/nes_ctrl/konamihs.h4
-rw-r--r--src/devices/bus/nes_ctrl/miracle.h6
-rw-r--r--src/devices/bus/nes_ctrl/mjpanel.h4
-rw-r--r--src/devices/bus/nes_ctrl/pachinko.h2
-rw-r--r--src/devices/bus/nes_ctrl/partytap.h4
-rw-r--r--src/devices/bus/nes_ctrl/powerpad.h4
-rw-r--r--src/devices/bus/nes_ctrl/rob.h14
-rw-r--r--src/devices/bus/nes_ctrl/sharpcass.h2
-rw-r--r--src/devices/bus/nes_ctrl/snesadapter.h2
-rw-r--r--src/devices/bus/nes_ctrl/suborkey.h6
-rw-r--r--src/devices/bus/nes_ctrl/turbofile.cpp2
-rw-r--r--src/devices/bus/nes_ctrl/turbofile.h8
-rw-r--r--src/devices/bus/nes_ctrl/zapper.cpp2
-rw-r--r--src/devices/bus/nes_ctrl/zapper.h12
-rw-r--r--src/devices/bus/nes_ctrl/zapper_sensor.h6
-rw-r--r--src/devices/bus/newbrain/eim.h8
-rw-r--r--src/devices/bus/newbrain/exp.h15
-rw-r--r--src/devices/bus/newbrain/fdc.h12
-rw-r--r--src/devices/bus/nscsi/applecd.cpp4
-rw-r--r--src/devices/bus/nscsi/applecd.h10
-rw-r--r--src/devices/bus/nscsi/cd.cpp1219
-rw-r--r--src/devices/bus/nscsi/cd.h44
-rw-r--r--src/devices/bus/nscsi/cdd2000.h10
-rw-r--r--src/devices/bus/nscsi/cdrn820s.h8
-rw-r--r--src/devices/bus/nscsi/cdu415.h8
-rw-r--r--src/devices/bus/nscsi/cdu561.h8
-rw-r--r--src/devices/bus/nscsi/cdu75s.h8
-rw-r--r--src/devices/bus/nscsi/cfp1080s.cpp3
-rw-r--r--src/devices/bus/nscsi/cfp1080s.h10
-rw-r--r--src/devices/bus/nscsi/crd254sh.h8
-rw-r--r--src/devices/bus/nscsi/cw7501.h16
-rw-r--r--src/devices/bus/nscsi/devices.cpp6
-rw-r--r--src/devices/bus/nscsi/dtc510.cpp271
-rw-r--r--src/devices/bus/nscsi/dtc510.h113
-rw-r--r--src/devices/bus/nscsi/hd.cpp453
-rw-r--r--src/devices/bus/nscsi/hd.h12
-rw-r--r--src/devices/bus/nscsi/pc8801_30.cpp616
-rw-r--r--src/devices/bus/nscsi/pc8801_30.h70
-rw-r--r--src/devices/bus/nscsi/pc98_hd.cpp110
-rw-r--r--src/devices/bus/nscsi/pc98_hd.h25
-rw-r--r--src/devices/bus/nscsi/s1410.cpp49
-rw-r--r--src/devices/bus/nscsi/s1410.h6
-rw-r--r--src/devices/bus/nscsi/smoc501.h10
-rw-r--r--src/devices/bus/nscsi/tape.cpp210
-rw-r--r--src/devices/bus/nscsi/tape.h22
-rw-r--r--src/devices/bus/nubus/8lc.cpp18
-rw-r--r--src/devices/bus/nubus/8lc.h6
-rw-r--r--src/devices/bus/nubus/bootbug.cpp98
-rw-r--r--src/devices/bus/nubus/bootbug.h36
-rw-r--r--src/devices/bus/nubus/cards.cpp36
-rw-r--r--src/devices/bus/nubus/cards.h1
-rw-r--r--src/devices/bus/nubus/enetlc.cpp178
-rw-r--r--src/devices/bus/nubus/enetlc.h13
-rw-r--r--src/devices/bus/nubus/enetnbtp.cpp149
-rw-r--r--src/devices/bus/nubus/enetnbtp.h12
-rw-r--r--src/devices/bus/nubus/laserview.cpp203
-rw-r--r--src/devices/bus/nubus/laserview.h1
-rw-r--r--src/devices/bus/nubus/nubus.cpp326
-rw-r--r--src/devices/bus/nubus/nubus.h125
-rw-r--r--src/devices/bus/nubus/nubus_48gc.cpp222
-rw-r--r--src/devices/bus/nubus/nubus_asntmc3b.cpp18
-rw-r--r--src/devices/bus/nubus/nubus_cb264.cpp302
-rw-r--r--src/devices/bus/nubus/nubus_image.cpp233
-rw-r--r--src/devices/bus/nubus/nubus_image.h73
-rw-r--r--src/devices/bus/nubus/nubus_m2hires.cpp558
-rw-r--r--src/devices/bus/nubus/nubus_m2hires.h47
-rw-r--r--src/devices/bus/nubus/nubus_m2video.cpp403
-rw-r--r--src/devices/bus/nubus/nubus_m2video.h45
-rw-r--r--src/devices/bus/nubus/nubus_radiustpd.cpp151
-rw-r--r--src/devices/bus/nubus/nubus_radiustpd.h45
-rw-r--r--src/devices/bus/nubus/nubus_spec8.cpp136
-rw-r--r--src/devices/bus/nubus/nubus_specpdq.cpp142
-rw-r--r--src/devices/bus/nubus/nubus_vikbw.cpp12
-rw-r--r--src/devices/bus/nubus/nubus_vikbw.h6
-rw-r--r--src/devices/bus/nubus/nubus_wsportrait.cpp299
-rw-r--r--src/devices/bus/nubus/nubus_wsportrait.h12
-rw-r--r--src/devices/bus/nubus/pds30_30hr.cpp817
-rw-r--r--src/devices/bus/nubus/pds30_30hr.h48
-rw-r--r--src/devices/bus/nubus/pds30_cb264.cpp330
-rw-r--r--src/devices/bus/nubus/pds30_cb264.h46
-rw-r--r--src/devices/bus/nubus/pds30_mc30.cpp315
-rw-r--r--src/devices/bus/nubus/pds30_mc30.h56
-rw-r--r--src/devices/bus/nubus/pds30_procolor816.cpp395
-rw-r--r--src/devices/bus/nubus/pds30_procolor816.h47
-rw-r--r--src/devices/bus/nubus/pds30_sigmalview.cpp206
-rw-r--r--src/devices/bus/nubus/pds30_sigmalview.h57
-rw-r--r--src/devices/bus/nubus/pwrbkduo/cards.cpp29
-rw-r--r--src/devices/bus/nubus/pwrbkduo/cards.h16
-rw-r--r--src/devices/bus/nubus/pwrbkduo/duodock.cpp809
-rw-r--r--src/devices/bus/nubus/pwrbkduo/duodock.h12
-rw-r--r--src/devices/bus/nubus/pwrbkduo/ethernetudock.cpp104
-rw-r--r--src/devices/bus/nubus/pwrbkduo/ethernetudock.h12
-rw-r--r--src/devices/bus/nubus/pwrbkduo/floppydock.cpp127
-rw-r--r--src/devices/bus/nubus/pwrbkduo/floppydock.h12
-rw-r--r--src/devices/bus/nubus/pwrbkduo/pwrbkduo.cpp58
-rw-r--r--src/devices/bus/nubus/pwrbkduo/pwrbkduo.h112
-rw-r--r--src/devices/bus/nubus/quadralink.cpp95
-rw-r--r--src/devices/bus/nubus/quadralink.h36
-rw-r--r--src/devices/bus/nubus/supermac.cpp8
-rw-r--r--src/devices/bus/nubus/supermac.h40
-rw-r--r--src/devices/bus/nubus/thunder4gx.cpp202
-rw-r--r--src/devices/bus/nubus/thunder4gx.h7
-rw-r--r--src/devices/bus/odyssey2/4in1.cpp2
-rw-r--r--src/devices/bus/odyssey2/chess.cpp10
-rw-r--r--src/devices/bus/odyssey2/homecomp.cpp12
-rw-r--r--src/devices/bus/odyssey2/ktaa.cpp2
-rw-r--r--src/devices/bus/odyssey2/rally.cpp63
-rw-r--r--src/devices/bus/odyssey2/rally.h1
-rw-r--r--src/devices/bus/odyssey2/rom.cpp2
-rw-r--r--src/devices/bus/odyssey2/slot.cpp94
-rw-r--r--src/devices/bus/odyssey2/slot.h24
-rw-r--r--src/devices/bus/odyssey2/test.cpp2
-rw-r--r--src/devices/bus/odyssey2/voice.cpp10
-rw-r--r--src/devices/bus/oricext/jasmin.cpp2
-rw-r--r--src/devices/bus/oricext/jasmin.h6
-rw-r--r--src/devices/bus/oricext/microdisc.cpp3
-rw-r--r--src/devices/bus/oricext/microdisc.h6
-rw-r--r--src/devices/bus/oricext/oricext.h7
-rw-r--r--src/devices/bus/pasopia/pac2.h13
-rw-r--r--src/devices/bus/pasopia/pac2exp.h4
-rw-r--r--src/devices/bus/pasopia/rampac2.h2
-rw-r--r--src/devices/bus/pasopia/rompac2.h4
-rw-r--r--src/devices/bus/pc1512/mouse.cpp8
-rw-r--r--src/devices/bus/pc1512/mouse.h11
-rw-r--r--src/devices/bus/pc8801/gsx8800.cpp4
-rw-r--r--src/devices/bus/pc8801/gsx8800.h4
-rw-r--r--src/devices/bus/pc8801/hmb20.cpp4
-rw-r--r--src/devices/bus/pc8801/hmb20.h4
-rw-r--r--src/devices/bus/pc8801/jmbx1.cpp12
-rw-r--r--src/devices/bus/pc8801/jmbx1.h4
-rw-r--r--src/devices/bus/pc8801/pc8801_23.cpp10
-rw-r--r--src/devices/bus/pc8801/pc8801_23.h17
-rw-r--r--src/devices/bus/pc8801/pc8801_31.cpp211
-rw-r--r--src/devices/bus/pc8801/pc8801_31.h43
-rw-r--r--src/devices/bus/pc8801/pc8801_exp.h17
-rw-r--r--src/devices/bus/pc8801/pcg8100.cpp4
-rw-r--r--src/devices/bus/pc8801/pcg8100.h8
-rw-r--r--src/devices/bus/pc98_54simm/README.md16
-rw-r--r--src/devices/bus/pc98_54simm/options.cpp27
-rw-r--r--src/devices/bus/pc98_54simm/options.h13
-rw-r--r--src/devices/bus/pc98_54simm/simm.cpp90
-rw-r--r--src/devices/bus/pc98_54simm/simm.h80
-rw-r--r--src/devices/bus/pc98_54simm/slot.cpp91
-rw-r--r--src/devices/bus/pc98_54simm/slot.h64
-rw-r--r--src/devices/bus/pc98_61simm/options.cpp28
-rw-r--r--src/devices/bus/pc98_61simm/options.h13
-rw-r--r--src/devices/bus/pc98_61simm/simm.cpp99
-rw-r--r--src/devices/bus/pc98_61simm/simm.h90
-rw-r--r--src/devices/bus/pc98_61simm/slot.cpp113
-rw-r--r--src/devices/bus/pc98_61simm/slot.h69
-rw-r--r--src/devices/bus/pc98_cbus/amd98.cpp202
-rw-r--r--src/devices/bus/pc98_cbus/amd98.h60
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2dd.cpp164
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2dd.h57
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2hd.cpp73
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2hd.h43
-rw-r--r--src/devices/bus/pc98_cbus/lgy98.cpp134
-rw-r--r--src/devices/bus/pc98_cbus/lgy98.h47
-rw-r--r--src/devices/bus/pc98_cbus/lha201.cpp230
-rw-r--r--src/devices/bus/pc98_cbus/lha201.h49
-rw-r--r--src/devices/bus/pc98_cbus/mif201.cpp82
-rw-r--r--src/devices/bus/pc98_cbus/mif201.h37
-rw-r--r--src/devices/bus/pc98_cbus/mpu_pc98.cpp (renamed from src/devices/bus/cbus/mpu_pc98.cpp)23
-rw-r--r--src/devices/bus/pc98_cbus/mpu_pc98.h47
-rw-r--r--src/devices/bus/pc98_cbus/options.cpp119
-rw-r--r--src/devices/bus/pc98_cbus/options.h15
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_02.cpp140
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_02.h95
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_118.cpp179
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_118.h59
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_14.cpp168
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_14.h45
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_26.cpp201
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_26.h60
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_27.cpp359
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_27.h73
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_55.cpp358
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_55.h100
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_86.cpp546
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_86.h115
-rw-r--r--src/devices/bus/pc98_cbus/pcfxga.cpp63
-rw-r--r--src/devices/bus/pc98_cbus/pcfxga.h33
-rw-r--r--src/devices/bus/pc98_cbus/sb16_ct2720.cpp131
-rw-r--r--src/devices/bus/pc98_cbus/sb16_ct2720.h53
-rw-r--r--src/devices/bus/pc98_cbus/slot.cpp217
-rw-r--r--src/devices/bus/pc98_cbus/slot.h178
-rw-r--r--src/devices/bus/pc98_cbus/sound.cpp244
-rw-r--r--src/devices/bus/pc98_cbus/sound.h75
-rw-r--r--src/devices/bus/pc98_cbus/sound_orchestra.cpp80
-rw-r--r--src/devices/bus/pc98_cbus/sound_orchestra.h43
-rw-r--r--src/devices/bus/pc98_cbus/speakboard.cpp134
-rw-r--r--src/devices/bus/pc98_cbus/speakboard.h40
-rw-r--r--src/devices/bus/pc98_cbus/wavestar.cpp99
-rw-r--r--src/devices/bus/pc98_cbus/wavestar.h39
-rw-r--r--src/devices/bus/pc_joy/pc_joy.cpp5
-rw-r--r--src/devices/bus/pc_joy/pc_joy.h2
-rw-r--r--src/devices/bus/pc_joy/pc_joy_magnum6.h8
-rw-r--r--src/devices/bus/pc_joy/pc_joy_sw.h6
-rw-r--r--src/devices/bus/pc_kbd/cherry_mx1500.cpp4
-rw-r--r--src/devices/bus/pc_kbd/cherry_mx1500.h12
-rw-r--r--src/devices/bus/pc_kbd/ec1841.h10
-rw-r--r--src/devices/bus/pc_kbd/hle_mouse.h12
-rw-r--r--src/devices/bus/pc_kbd/iskr1030.h12
-rw-r--r--src/devices/bus/pc_kbd/keytro.cpp4
-rw-r--r--src/devices/bus/pc_kbd/keytro.h18
-rw-r--r--src/devices/bus/pc_kbd/msnat.h18
-rw-r--r--src/devices/bus/pc_kbd/pc83.h10
-rw-r--r--src/devices/bus/pc_kbd/pc_kbdc.h21
-rw-r--r--src/devices/bus/pc_kbd/pcat101.h10
-rw-r--r--src/devices/bus/pc_kbd/pcat84.h14
-rw-r--r--src/devices/bus/pc_kbd/pcxt83.h10
-rw-r--r--src/devices/bus/pccard/ataflash.h22
-rw-r--r--src/devices/bus/pccard/k573npu.h6
-rw-r--r--src/devices/bus/pccard/konami_dual.h10
-rw-r--r--src/devices/bus/pccard/linflash.cpp4
-rw-r--r--src/devices/bus/pccard/linflash.h14
-rw-r--r--src/devices/bus/pccard/pccard.h7
-rw-r--r--src/devices/bus/pccard/sram.cpp6
-rw-r--r--src/devices/bus/pccard/sram.h24
-rw-r--r--src/devices/bus/pce/pce_acard.h6
-rw-r--r--src/devices/bus/pce/pce_rom.h6
-rw-r--r--src/devices/bus/pce/pce_scdsys.h4
-rw-r--r--src/devices/bus/pce/pce_slot.h9
-rw-r--r--src/devices/bus/pce_ctrl/joypad2.cpp14
-rw-r--r--src/devices/bus/pce_ctrl/joypad6.cpp14
-rw-r--r--src/devices/bus/pce_ctrl/mouse.cpp2
-rw-r--r--src/devices/bus/pce_ctrl/multitap.h6
-rw-r--r--src/devices/bus/pce_ctrl/pachinko.h4
-rw-r--r--src/devices/bus/pce_ctrl/pcectrl.h7
-rw-r--r--src/devices/bus/pce_ctrl/xhe3.cpp4
-rw-r--r--src/devices/bus/pci/aha2940au.cpp196
-rw-r--r--src/devices/bus/pci/aha2940au.h43
-rw-r--r--src/devices/bus/pci/audiowerk2.cpp4
-rw-r--r--src/devices/bus/pci/audiowerk2.h12
-rw-r--r--src/devices/bus/pci/clgd543x_alpine.cpp187
-rw-r--r--src/devices/bus/pci/clgd543x_alpine.h43
-rw-r--r--src/devices/bus/pci/clgd5446.cpp16
-rw-r--r--src/devices/bus/pci/clgd5446.h24
-rw-r--r--src/devices/bus/pci/clgd546x_laguna.cpp75
-rw-r--r--src/devices/bus/pci/clgd546x_laguna.h20
-rw-r--r--src/devices/bus/pci/cmi8738.cpp88
-rw-r--r--src/devices/bus/pci/cmi8738.h35
-rw-r--r--src/devices/bus/pci/cs4281.cpp88
-rw-r--r--src/devices/bus/pci/cs4281.h34
-rw-r--r--src/devices/bus/pci/ds2416.h4
-rw-r--r--src/devices/bus/pci/ess_maestro.cpp4
-rw-r--r--src/devices/bus/pci/ess_maestro.h20
-rw-r--r--src/devices/bus/pci/geforce.cpp8
-rw-r--r--src/devices/bus/pci/geforce.h14
-rw-r--r--src/devices/bus/pci/mga2064w.cpp56
-rw-r--r--src/devices/bus/pci/mga2064w.h27
-rw-r--r--src/devices/bus/pci/ncr53c825.cpp4
-rw-r--r--src/devices/bus/pci/ncr53c825.h20
-rw-r--r--src/devices/bus/pci/neon250.cpp190
-rw-r--r--src/devices/bus/pci/neon250.h53
-rw-r--r--src/devices/bus/pci/opti82c861.h6
-rw-r--r--src/devices/bus/pci/oti_spitfire.cpp38
-rw-r--r--src/devices/bus/pci/oti_spitfire.h29
-rw-r--r--src/devices/bus/pci/pci_slot.cpp28
-rw-r--r--src/devices/bus/pci/pci_slot.h11
-rw-r--r--src/devices/bus/pci/pdc20262.cpp59
-rw-r--r--src/devices/bus/pci/pdc20262.h37
-rw-r--r--src/devices/bus/pci/permedia2.cpp169
-rw-r--r--src/devices/bus/pci/permedia2.h52
-rw-r--r--src/devices/bus/pci/promotion.cpp16
-rw-r--r--src/devices/bus/pci/promotion.h18
-rw-r--r--src/devices/bus/pci/riva128.cpp31
-rw-r--r--src/devices/bus/pci/riva128.h26
-rw-r--r--src/devices/bus/pci/rivatnt.cpp14
-rw-r--r--src/devices/bus/pci/rivatnt.h22
-rw-r--r--src/devices/bus/pci/rtl8029as_pci.h10
-rw-r--r--src/devices/bus/pci/rtl8139_pci.h17
-rw-r--r--src/devices/bus/pci/sis6326.cpp728
-rw-r--r--src/devices/bus/pci/sis6326.h103
-rw-r--r--src/devices/bus/pci/sonicvibes.cpp15
-rw-r--r--src/devices/bus/pci/sonicvibes.h18
-rw-r--r--src/devices/bus/pci/sw1000xg.cpp7
-rw-r--r--src/devices/bus/pci/sw1000xg.h10
-rw-r--r--src/devices/bus/pci/trident_4dwavedx.cpp894
-rw-r--r--src/devices/bus/pci/trident_4dwavedx.h198
-rw-r--r--src/devices/bus/pci/trio_pci.cpp148
-rw-r--r--src/devices/bus/pci/trio_pci.h50
-rw-r--r--src/devices/bus/pci/virge_pci.cpp112
-rw-r--r--src/devices/bus/pci/virge_pci.h42
-rw-r--r--src/devices/bus/pci/vision.cpp12
-rw-r--r--src/devices/bus/pci/vision.h30
-rw-r--r--src/devices/bus/pci/vt6306.cpp8
-rw-r--r--src/devices/bus/pci/vt6306.h12
-rw-r--r--src/devices/bus/pci/wd9710_pci.cpp30
-rw-r--r--src/devices/bus/pci/wd9710_pci.h18
-rw-r--r--src/devices/bus/pci/ymf740c.cpp120
-rw-r--r--src/devices/bus/pci/ymf740c.h42
-rw-r--r--src/devices/bus/pci/ymp21.h6
-rw-r--r--src/devices/bus/pci/zr36057.cpp725
-rw-r--r--src/devices/bus/pci/zr36057.h104
-rw-r--r--src/devices/bus/pencil2/coleco.cpp55
-rw-r--r--src/devices/bus/pencil2/coleco.h13
-rw-r--r--src/devices/bus/pencil2/ram.cpp40
-rw-r--r--src/devices/bus/pencil2/ram.h13
-rw-r--r--src/devices/bus/pencil2/slot.cpp126
-rw-r--r--src/devices/bus/pencil2/slot.h85
-rw-r--r--src/devices/bus/pet/2joysnd.cpp20
-rw-r--r--src/devices/bus/pet/2joysnd.h6
-rw-r--r--src/devices/bus/pet/64k.h4
-rw-r--r--src/devices/bus/pet/c2n.h4
-rw-r--r--src/devices/bus/pet/cass.h7
-rw-r--r--src/devices/bus/pet/cb2snd.h4
-rw-r--r--src/devices/bus/pet/diag.h2
-rw-r--r--src/devices/bus/pet/diag264_lb_tape.h2
-rw-r--r--src/devices/bus/pet/exp.h11
-rw-r--r--src/devices/bus/pet/hsg.h14
-rw-r--r--src/devices/bus/pet/petuja.cpp20
-rw-r--r--src/devices/bus/pet/petuja.h4
-rw-r--r--src/devices/bus/pet/superpet.cpp7
-rw-r--r--src/devices/bus/pet/superpet.h12
-rw-r--r--src/devices/bus/pet/user.h9
-rw-r--r--src/devices/bus/plg1x0/plg100-vl.cpp12
-rw-r--r--src/devices/bus/plg1x0/plg100-vl.h4
-rw-r--r--src/devices/bus/plg1x0/plg150-ap.cpp8
-rw-r--r--src/devices/bus/plg1x0/plg150-ap.h4
-rw-r--r--src/devices/bus/plg1x0/plg1x0.cpp3
-rw-r--r--src/devices/bus/plg1x0/plg1x0.h8
-rw-r--r--src/devices/bus/plus4/c1551.h12
-rw-r--r--src/devices/bus/plus4/diag264_lb_user.h2
-rw-r--r--src/devices/bus/plus4/exp.h9
-rw-r--r--src/devices/bus/plus4/sid.h8
-rw-r--r--src/devices/bus/plus4/std.h2
-rw-r--r--src/devices/bus/pofo/ccm.h9
-rw-r--r--src/devices/bus/pofo/exp.h9
-rw-r--r--src/devices/bus/pofo/hpc101.h6
-rw-r--r--src/devices/bus/pofo/hpc102.h6
-rw-r--r--src/devices/bus/pofo/hpc104.h10
-rw-r--r--src/devices/bus/pofo/ram.h2
-rw-r--r--src/devices/bus/pofo/rom.h2
-rw-r--r--src/devices/bus/psi_kbd/ergoline.cpp6
-rw-r--r--src/devices/bus/psi_kbd/ergoline.h14
-rw-r--r--src/devices/bus/psi_kbd/hle.cpp34
-rw-r--r--src/devices/bus/psi_kbd/hle.h6
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.cpp2
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.h11
-rw-r--r--src/devices/bus/psion/honda/parallel.cpp67
-rw-r--r--src/devices/bus/psion/honda/parallel.h13
-rw-r--r--src/devices/bus/psion/honda/pclink.cpp50
-rw-r--r--src/devices/bus/psion/honda/pclink.h13
-rw-r--r--src/devices/bus/psion/honda/slot.cpp10
-rw-r--r--src/devices/bus/psion/honda/slot.h7
-rw-r--r--src/devices/bus/psion/honda/ssd.cpp85
-rw-r--r--src/devices/bus/psion/honda/ssd.h43
-rw-r--r--src/devices/bus/psion/module/serpar.cpp91
-rw-r--r--src/devices/bus/psion/module/serpar.h13
-rw-r--r--src/devices/bus/psion/module/slot.cpp7
-rw-r--r--src/devices/bus/psion/module/slot.h15
-rw-r--r--src/devices/bus/psion/sibo/3fax.h8
-rw-r--r--src/devices/bus/psion/sibo/3link.h16
-rw-r--r--src/devices/bus/psion/sibo/slot.h9
-rw-r--r--src/devices/bus/psx/analogue.cpp2
-rw-r--r--src/devices/bus/psx/analogue.h4
-rw-r--r--src/devices/bus/psx/ctlrport.h11
-rw-r--r--src/devices/bus/psx/gamebooster.h8
-rw-r--r--src/devices/bus/psx/memcard.h4
-rw-r--r--src/devices/bus/psx/multitap.h4
-rw-r--r--src/devices/bus/psx/parallel.h11
-rw-r--r--src/devices/bus/qbus/bk_altpro.cpp197
-rw-r--r--src/devices/bus/qbus/bk_altpro.h19
-rw-r--r--src/devices/bus/qbus/bk_irps.cpp105
-rw-r--r--src/devices/bus/qbus/bk_irps.h19
-rw-r--r--src/devices/bus/qbus/bk_kmd.cpp132
-rw-r--r--src/devices/bus/qbus/bk_kmd.h20
-rw-r--r--src/devices/bus/qbus/bk_samara.cpp173
-rw-r--r--src/devices/bus/qbus/bk_samara.h19
-rw-r--r--src/devices/bus/qbus/dsd4432.h8
-rw-r--r--src/devices/bus/qbus/dvk_dwhle.cpp572
-rw-r--r--src/devices/bus/qbus/dvk_dwhle.h19
-rw-r--r--src/devices/bus/qbus/dvk_kgd.cpp72
-rw-r--r--src/devices/bus/qbus/dvk_kgd.h50
-rw-r--r--src/devices/bus/qbus/dvk_kmd.cpp392
-rw-r--r--src/devices/bus/qbus/dvk_kmd.h19
-rw-r--r--src/devices/bus/qbus/dvk_ktlk.cpp186
-rw-r--r--src/devices/bus/qbus/dvk_ktlk.h19
-rw-r--r--src/devices/bus/qbus/dvk_mx.cpp180
-rw-r--r--src/devices/bus/qbus/dvk_mx.h159
-rw-r--r--src/devices/bus/qbus/pc11.cpp21
-rw-r--r--src/devices/bus/qbus/pc11.h5
-rw-r--r--src/devices/bus/qbus/qbus.cpp45
-rw-r--r--src/devices/bus/qbus/qbus.h27
-rw-r--r--src/devices/bus/qbus/qg640.h10
-rw-r--r--src/devices/bus/qbus/qtx.cpp39
-rw-r--r--src/devices/bus/qbus/qtx.h12
-rw-r--r--src/devices/bus/qbus/tdl12.cpp137
-rw-r--r--src/devices/bus/qbus/tdl12.h42
-rw-r--r--src/devices/bus/qbus/terak_v.cpp460
-rw-r--r--src/devices/bus/qbus/terak_v.h19
-rw-r--r--src/devices/bus/qbus/uknc_kmd.h4
-rw-r--r--src/devices/bus/qic02/qic02.cpp106
-rw-r--r--src/devices/bus/qic02/qic02.h123
-rw-r--r--src/devices/bus/ql/cst_q_plus4.h6
-rw-r--r--src/devices/bus/ql/cst_qdisc.h4
-rw-r--r--src/devices/bus/ql/cumana_fdi.h4
-rw-r--r--src/devices/bus/ql/exp.h13
-rw-r--r--src/devices/bus/ql/kempston_di.h10
-rw-r--r--src/devices/bus/ql/miracle_gold_card.h4
-rw-r--r--src/devices/bus/ql/miracle_hd.h10
-rw-r--r--src/devices/bus/ql/mp_fdi.h4
-rw-r--r--src/devices/bus/ql/opd_basic_master.h4
-rw-r--r--src/devices/bus/ql/pcml_qdisk.h4
-rw-r--r--src/devices/bus/ql/qubide.h10
-rw-r--r--src/devices/bus/ql/rom.h11
-rw-r--r--src/devices/bus/ql/sandy_superdisk.h8
-rw-r--r--src/devices/bus/ql/sandy_superqboard.cpp4
-rw-r--r--src/devices/bus/ql/sandy_superqboard.h12
-rw-r--r--src/devices/bus/ql/std.h2
-rw-r--r--src/devices/bus/ql/trumpcard.h8
-rw-r--r--src/devices/bus/rc2014/cf.cpp6
-rw-r--r--src/devices/bus/rc2014/cf.h6
-rw-r--r--src/devices/bus/rc2014/clock.cpp16
-rw-r--r--src/devices/bus/rc2014/edge.cpp12
-rw-r--r--src/devices/bus/rc2014/fdc.cpp20
-rw-r--r--src/devices/bus/rc2014/ide.cpp12
-rw-r--r--src/devices/bus/rc2014/micro.cpp22
-rw-r--r--src/devices/bus/rc2014/modules.cpp2
-rw-r--r--src/devices/bus/rc2014/ram.cpp12
-rw-r--r--src/devices/bus/rc2014/rc2014.h33
-rw-r--r--src/devices/bus/rc2014/rom.cpp16
-rw-r--r--src/devices/bus/rc2014/romram.cpp14
-rw-r--r--src/devices/bus/rc2014/rtc.cpp8
-rw-r--r--src/devices/bus/rc2014/serial.cpp22
-rw-r--r--src/devices/bus/rc2014/sound.cpp209
-rw-r--r--src/devices/bus/rc2014/sound.h19
-rw-r--r--src/devices/bus/rc2014/sound_ym_ay.cpp207
-rw-r--r--src/devices/bus/rc2014/sound_ym_ay.h19
-rw-r--r--src/devices/bus/rc2014/z180cpu.cpp8
-rw-r--r--src/devices/bus/rc2014/z80cpu.cpp12
-rw-r--r--src/devices/bus/rs232/exorterm.cpp2
-rw-r--r--src/devices/bus/rs232/exorterm.h8
-rw-r--r--src/devices/bus/rs232/heath_h19.cpp64
-rw-r--r--src/devices/bus/rs232/heath_h19.h13
-rw-r--r--src/devices/bus/rs232/hlemouse.cpp26
-rw-r--r--src/devices/bus/rs232/hlemouse.h24
-rw-r--r--src/devices/bus/rs232/ie15.cpp6
-rw-r--r--src/devices/bus/rs232/keyboard.cpp2
-rw-r--r--src/devices/bus/rs232/keyboard.h4
-rw-r--r--src/devices/bus/rs232/loopback.h4
-rw-r--r--src/devices/bus/rs232/mboardd.cpp17
-rw-r--r--src/devices/bus/rs232/nss_tvinterface.cpp54
-rw-r--r--src/devices/bus/rs232/null_modem.cpp84
-rw-r--r--src/devices/bus/rs232/null_modem.h10
-rw-r--r--src/devices/bus/rs232/patchbox.cpp4
-rw-r--r--src/devices/bus/rs232/printer.h8
-rw-r--r--src/devices/bus/rs232/pty.h8
-rw-r--r--src/devices/bus/rs232/rs232.cpp4
-rw-r--r--src/devices/bus/rs232/rs232.h29
-rw-r--r--src/devices/bus/rs232/rs232_sync_io.h8
-rw-r--r--src/devices/bus/rs232/scorpion.cpp10
-rw-r--r--src/devices/bus/rs232/swtpc8212.cpp2
-rw-r--r--src/devices/bus/rs232/swtpc8212.h8
-rw-r--r--src/devices/bus/rs232/teletex800.cpp98
-rw-r--r--src/devices/bus/rs232/terminal.cpp4
-rw-r--r--src/devices/bus/rs232/votraxtnt.cpp51
-rw-r--r--src/devices/bus/rs232/votraxtnt.h13
-rw-r--r--src/devices/bus/rs232/xvd701.h8
-rw-r--r--src/devices/bus/rtpc/kbd.cpp466
-rw-r--r--src/devices/bus/rtpc/kbd.h47
-rw-r--r--src/devices/bus/rtpc/kbd_con.cpp121
-rw-r--r--src/devices/bus/rtpc/kbd_con.h79
-rw-r--r--src/devices/bus/s100/am310.cpp12
-rw-r--r--src/devices/bus/s100/ascsasi.cpp38
-rw-r--r--src/devices/bus/s100/dg640.h8
-rw-r--r--src/devices/bus/s100/dj2db.h10
-rw-r--r--src/devices/bus/s100/djdma.h12
-rw-r--r--src/devices/bus/s100/mm65k16s.h8
-rw-r--r--src/devices/bus/s100/nsmdsa.h8
-rw-r--r--src/devices/bus/s100/nsmdsad.h8
-rw-r--r--src/devices/bus/s100/poly16k.cpp4
-rw-r--r--src/devices/bus/s100/polyfdc.cpp4
-rw-r--r--src/devices/bus/s100/polyvti.cpp8
-rw-r--r--src/devices/bus/s100/s100.h15
-rw-r--r--src/devices/bus/s100/seals8k.cpp4
-rw-r--r--src/devices/bus/s100/seals8k.h6
-rw-r--r--src/devices/bus/s100/vectordualmode.cpp81
-rw-r--r--src/devices/bus/s100/vectordualmode.h15
-rw-r--r--src/devices/bus/s100/wunderbus.h8
-rw-r--r--src/devices/bus/saitek_osa/bruteforce.cpp188
-rw-r--r--src/devices/bus/saitek_osa/bruteforce.h18
-rw-r--r--src/devices/bus/saitek_osa/expansion.cpp2
-rw-r--r--src/devices/bus/saitek_osa/expansion.h34
-rw-r--r--src/devices/bus/saitek_osa/maestro.cpp33
-rw-r--r--src/devices/bus/saitek_osa/maestro.h8
-rw-r--r--src/devices/bus/saitek_osa/maestroa.cpp25
-rw-r--r--src/devices/bus/saitek_osa/maestroa.h8
-rw-r--r--src/devices/bus/saitek_osa/sparc.cpp26
-rw-r--r--src/devices/bus/saitek_osa/sparc.h8
-rw-r--r--src/devices/bus/samcoupe/drive/atom.h4
-rw-r--r--src/devices/bus/samcoupe/drive/drive.h11
-rw-r--r--src/devices/bus/samcoupe/drive/floppy.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/blue_sampler.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/dallas.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/expansion.h7
-rw-r--r--src/devices/bus/samcoupe/expansion/onemeg.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/sambus.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/sdide.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/sid.h6
-rw-r--r--src/devices/bus/samcoupe/expansion/spi.h4
-rw-r--r--src/devices/bus/samcoupe/expansion/voicebox.h6
-rw-r--r--src/devices/bus/samcoupe/mouse/mouse.h6
-rw-r--r--src/devices/bus/samcoupe/mouse/mouseport.h7
-rw-r--r--src/devices/bus/sat_ctrl/analog.h6
-rw-r--r--src/devices/bus/sat_ctrl/ctrl.h11
-rw-r--r--src/devices/bus/sat_ctrl/joy.h6
-rw-r--r--src/devices/bus/sat_ctrl/joy_md.h4
-rw-r--r--src/devices/bus/sat_ctrl/keybd.cpp262
-rw-r--r--src/devices/bus/sat_ctrl/keybd.h6
-rw-r--r--src/devices/bus/sat_ctrl/mouse.h6
-rw-r--r--src/devices/bus/sat_ctrl/multitap.h4
-rw-r--r--src/devices/bus/sat_ctrl/pointer.h6
-rw-r--r--src/devices/bus/sat_ctrl/racing.h6
-rw-r--r--src/devices/bus/sat_ctrl/segatap.h4
-rw-r--r--src/devices/bus/saturn/bram.h4
-rw-r--r--src/devices/bus/saturn/dram.h4
-rw-r--r--src/devices/bus/saturn/rom.h4
-rw-r--r--src/devices/bus/saturn/sat_slot.h7
-rw-r--r--src/devices/bus/sbus/artecon.h6
-rw-r--r--src/devices/bus/sbus/bwtwo.h6
-rw-r--r--src/devices/bus/sbus/cgsix.cpp2
-rw-r--r--src/devices/bus/sbus/cgsix.h10
-rw-r--r--src/devices/bus/sbus/cgthree.h8
-rw-r--r--src/devices/bus/sbus/hme.h6
-rw-r--r--src/devices/bus/sbus/sbus.h17
-rw-r--r--src/devices/bus/sbus/sunpc.h6
-rw-r--r--src/devices/bus/scsi/cdu76s.h2
-rw-r--r--src/devices/bus/scsi/omti5100.h4
-rw-r--r--src/devices/bus/scsi/pc9801_sasi.cpp29
-rw-r--r--src/devices/bus/scsi/pc9801_sasi.h20
-rw-r--r--src/devices/bus/scsi/s1410.h8
-rw-r--r--src/devices/bus/scsi/sa1403d.h6
-rw-r--r--src/devices/bus/scsi/scsi.h6
-rw-r--r--src/devices/bus/scsi/scsicd.h6
-rw-r--r--src/devices/bus/scsi/scsicd512.cpp6
-rw-r--r--src/devices/bus/scsi/scsicd512.h14
-rw-r--r--src/devices/bus/scsi/scsihd.h4
-rw-r--r--src/devices/bus/scsi/scsihle.h6
-rw-r--r--src/devices/bus/scv/rom.cpp258
-rw-r--r--src/devices/bus/scv/rom.h149
-rw-r--r--src/devices/bus/scv/slot.cpp153
-rw-r--r--src/devices/bus/scv/slot.h94
-rw-r--r--src/devices/bus/sdk85/i8755.h6
-rw-r--r--src/devices/bus/sdk85/memexp.h7
-rw-r--r--src/devices/bus/sega8/ccatch.h2
-rw-r--r--src/devices/bus/sega8/mgear.h6
-rw-r--r--src/devices/bus/sega8/rom.h52
-rw-r--r--src/devices/bus/sega8/sega8_slot.h48
-rw-r--r--src/devices/bus/segaai/segaai_exp.h11
-rw-r--r--src/devices/bus/segaai/segaai_slot.h13
-rw-r--r--src/devices/bus/segaai/soundbox.cpp15
-rw-r--r--src/devices/bus/sg1000_exp/fm_unit.h6
-rw-r--r--src/devices/bus/sg1000_exp/kblink.h12
-rw-r--r--src/devices/bus/sg1000_exp/sg1000exp.cpp1
-rw-r--r--src/devices/bus/sg1000_exp/sg1000exp.h11
-rw-r--r--src/devices/bus/sg1000_exp/sk1100.cpp248
-rw-r--r--src/devices/bus/sg1000_exp/sk1100.h21
-rw-r--r--src/devices/bus/sg1000_exp/sk1100prn.cpp4
-rw-r--r--src/devices/bus/sg1000_exp/sk1100prn.h14
-rw-r--r--src/devices/bus/sg1000_exp/sp400.cpp233
-rw-r--r--src/devices/bus/sg1000_exp/sp400.h13
-rw-r--r--src/devices/bus/sms_ctrl/diypaddle.cpp8
-rw-r--r--src/devices/bus/sms_ctrl/graphic.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/lphaser.cpp10
-rw-r--r--src/devices/bus/sms_ctrl/md6bt.cpp4
-rw-r--r--src/devices/bus/sms_ctrl/mdpad.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/mouse.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/multitap.cpp6
-rw-r--r--src/devices/bus/sms_ctrl/rfu.cpp12
-rw-r--r--src/devices/bus/sms_ctrl/rs232adapt.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/rs232adapt.h6
-rw-r--r--src/devices/bus/sms_ctrl/smsctrl.h7
-rw-r--r--src/devices/bus/sms_ctrl/sports.cpp2
-rw-r--r--src/devices/bus/sms_ctrl/sportsjp.h6
-rw-r--r--src/devices/bus/sms_ctrl/teamplayer.cpp10
-rw-r--r--src/devices/bus/sms_ctrl/xe1ap.cpp4
-rw-r--r--src/devices/bus/sms_exp/gender.h4
-rw-r--r--src/devices/bus/sms_exp/smsexp.h11
-rw-r--r--src/devices/bus/snes/bsx.h18
-rw-r--r--src/devices/bus/snes/event.cpp12
-rw-r--r--src/devices/bus/snes/event.h12
-rw-r--r--src/devices/bus/snes/profighter.h32
-rw-r--r--src/devices/bus/snes/rom.h28
-rw-r--r--src/devices/bus/snes/rom21.h8
-rw-r--r--src/devices/bus/snes/sa1.cpp4
-rw-r--r--src/devices/bus/snes/sa1.h8
-rw-r--r--src/devices/bus/snes/sdd1.h4
-rw-r--r--src/devices/bus/snes/sfx.h10
-rw-r--r--src/devices/bus/snes/sgb.h14
-rw-r--r--src/devices/bus/snes/snes_carts.cpp3
-rw-r--r--src/devices/bus/snes/snes_slot.h19
-rw-r--r--src/devices/bus/snes/spc7110.h4
-rw-r--r--src/devices/bus/snes/st018.cpp157
-rw-r--r--src/devices/bus/snes/st018.h56
-rw-r--r--src/devices/bus/snes/sufami.h6
-rw-r--r--src/devices/bus/snes/upd.cpp68
-rw-r--r--src/devices/bus/snes/upd.h58
-rw-r--r--src/devices/bus/snes_ctrl/bcbattle.h6
-rw-r--r--src/devices/bus/snes_ctrl/ctrl.h7
-rw-r--r--src/devices/bus/snes_ctrl/joypad.h6
-rw-r--r--src/devices/bus/snes_ctrl/miracle.h6
-rw-r--r--src/devices/bus/snes_ctrl/mouse.h6
-rw-r--r--src/devices/bus/snes_ctrl/multitap.h8
-rw-r--r--src/devices/bus/snes_ctrl/pachinko.h6
-rw-r--r--src/devices/bus/snes_ctrl/sscope.h12
-rw-r--r--src/devices/bus/snes_ctrl/twintap.h6
-rw-r--r--src/devices/bus/spc1000/exp.h2
-rw-r--r--src/devices/bus/spc1000/fdd.h12
-rw-r--r--src/devices/bus/spc1000/vdp.h6
-rw-r--r--src/devices/bus/spectrum/ay/cards.cpp71
-rw-r--r--src/devices/bus/spectrum/ay/cards.h16
-rw-r--r--src/devices/bus/spectrum/ay/slot.cpp131
-rw-r--r--src/devices/bus/spectrum/ay/slot.h83
-rw-r--r--src/devices/bus/spectrum/beta.cpp4
-rw-r--r--src/devices/bus/spectrum/beta.h34
-rw-r--r--src/devices/bus/spectrum/beta128.cpp4
-rw-r--r--src/devices/bus/spectrum/beta128.h10
-rw-r--r--src/devices/bus/spectrum/d40.cpp2
-rw-r--r--src/devices/bus/spectrum/d40.h20
-rw-r--r--src/devices/bus/spectrum/dma/cards.cpp113
-rw-r--r--src/devices/bus/spectrum/dma/cards.h17
-rw-r--r--src/devices/bus/spectrum/dma/slot.cpp118
-rw-r--r--src/devices/bus/spectrum/dma/slot.h98
-rw-r--r--src/devices/bus/spectrum/exp.cpp8
-rw-r--r--src/devices/bus/spectrum/exp.h11
-rw-r--r--src/devices/bus/spectrum/floppyone.cpp2
-rw-r--r--src/devices/bus/spectrum/floppyone.h23
-rw-r--r--src/devices/bus/spectrum/fuller.h6
-rw-r--r--src/devices/bus/spectrum/intf1.h8
-rw-r--r--src/devices/bus/spectrum/intf2.h6
-rw-r--r--src/devices/bus/spectrum/kempdisc.h10
-rw-r--r--src/devices/bus/spectrum/kempjoy.h4
-rw-r--r--src/devices/bus/spectrum/kempmouse.cpp73
-rw-r--r--src/devices/bus/spectrum/kempmouse.h39
-rw-r--r--src/devices/bus/spectrum/logitek.cpp2
-rw-r--r--src/devices/bus/spectrum/logitek.h10
-rw-r--r--src/devices/bus/spectrum/lprint.h34
-rw-r--r--src/devices/bus/spectrum/melodik.h4
-rw-r--r--src/devices/bus/spectrum/mface.cpp2
-rw-r--r--src/devices/bus/spectrum/mface.h50
-rw-r--r--src/devices/bus/spectrum/mgt.cpp4
-rw-r--r--src/devices/bus/spectrum/mgt.h20
-rw-r--r--src/devices/bus/spectrum/mikroplus.h6
-rw-r--r--src/devices/bus/spectrum/mpoker.cpp4
-rw-r--r--src/devices/bus/spectrum/mpoker.h8
-rw-r--r--src/devices/bus/spectrum/musicmachine.cpp149
-rw-r--r--src/devices/bus/spectrum/musicmachine.h20
-rw-r--r--src/devices/bus/spectrum/nemoide.h14
-rw-r--r--src/devices/bus/spectrum/neogs.h14
-rw-r--r--src/devices/bus/spectrum/opus.h10
-rw-r--r--src/devices/bus/spectrum/plus2test.h4
-rw-r--r--src/devices/bus/spectrum/protek.h4
-rw-r--r--src/devices/bus/spectrum/sdi.h8
-rw-r--r--src/devices/bus/spectrum/sixword.cpp2
-rw-r--r--src/devices/bus/spectrum/sixword.h20
-rw-r--r--src/devices/bus/spectrum/smuc.h14
-rw-r--r--src/devices/bus/spectrum/speccydos.cpp2
-rw-r--r--src/devices/bus/spectrum/speccydos.h10
-rw-r--r--src/devices/bus/spectrum/specdrum.h4
-rw-r--r--src/devices/bus/spectrum/specmate.cpp2
-rw-r--r--src/devices/bus/spectrum/specmate.h10
-rw-r--r--src/devices/bus/spectrum/uslot.cpp2
-rw-r--r--src/devices/bus/spectrum/uslot.h6
-rw-r--r--src/devices/bus/spectrum/usource.cpp2
-rw-r--r--src/devices/bus/spectrum/usource.h6
-rw-r--r--src/devices/bus/spectrum/uspeech.cpp2
-rw-r--r--src/devices/bus/spectrum/uspeech.h8
-rw-r--r--src/devices/bus/spectrum/vtx5000.cpp8
-rw-r--r--src/devices/bus/spectrum/wafa.h8
-rw-r--r--src/devices/bus/spectrum/zxbus.cpp78
-rw-r--r--src/devices/bus/spectrum/zxbus.h128
-rw-r--r--src/devices/bus/spectrum/zxbus/bus.cpp94
-rw-r--r--src/devices/bus/spectrum/zxbus/bus.h130
-rw-r--r--src/devices/bus/spectrum/zxbus/nemoide.cpp (renamed from src/devices/bus/spectrum/nemoide.cpp)17
-rw-r--r--src/devices/bus/spectrum/zxbus/nemoide.h14
-rw-r--r--src/devices/bus/spectrum/zxbus/neogs.cpp (renamed from src/devices/bus/spectrum/neogs.cpp)84
-rw-r--r--src/devices/bus/spectrum/zxbus/neogs.h14
-rw-r--r--src/devices/bus/spectrum/zxbus/smuc.cpp (renamed from src/devices/bus/spectrum/smuc.cpp)31
-rw-r--r--src/devices/bus/spectrum/zxbus/smuc.h14
-rw-r--r--src/devices/bus/ss50/dc5.cpp14
-rw-r--r--src/devices/bus/ss50/dc5.h6
-rw-r--r--src/devices/bus/ss50/interface.h13
-rw-r--r--src/devices/bus/ss50/mpc.cpp6
-rw-r--r--src/devices/bus/ss50/mpc.h6
-rw-r--r--src/devices/bus/ss50/mps.cpp8
-rw-r--r--src/devices/bus/ss50/mps.h6
-rw-r--r--src/devices/bus/ss50/mps2.cpp4
-rw-r--r--src/devices/bus/ss50/mps2.h6
-rw-r--r--src/devices/bus/ss50/mpt.cpp6
-rw-r--r--src/devices/bus/ss50/mpt.h6
-rw-r--r--src/devices/bus/ss50/piaide.cpp4
-rw-r--r--src/devices/bus/ss50/piaide.h6
-rw-r--r--src/devices/bus/st/replay.cpp98
-rw-r--r--src/devices/bus/st/replay.h15
-rw-r--r--src/devices/bus/st/rom.cpp87
-rw-r--r--src/devices/bus/st/rom.h15
-rw-r--r--src/devices/bus/st/stcart.cpp46
-rw-r--r--src/devices/bus/st/stcart.h47
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp45
-rw-r--r--src/devices/bus/sunkbd/hlekbd.h13
-rw-r--r--src/devices/bus/sunkbd/sunkbd.cpp1
-rw-r--r--src/devices/bus/sunkbd/sunkbd.h7
-rw-r--r--src/devices/bus/sunmouse/hlemouse.cpp10
-rw-r--r--src/devices/bus/sunmouse/hlemouse.h12
-rw-r--r--src/devices/bus/sunmouse/sunmouse.h9
-rw-r--r--src/devices/bus/supracan/rom.cpp96
-rw-r--r--src/devices/bus/supracan/rom.h46
-rw-r--r--src/devices/bus/supracan/slot.cpp116
-rw-r--r--src/devices/bus/supracan/slot.h87
-rw-r--r--src/devices/bus/svi3x8/expander/expander.cpp6
-rw-r--r--src/devices/bus/svi3x8/expander/expander.h11
-rw-r--r--src/devices/bus/svi3x8/expander/sv601.h4
-rw-r--r--src/devices/bus/svi3x8/expander/sv602.h4
-rw-r--r--src/devices/bus/svi3x8/expander/sv603.h8
-rw-r--r--src/devices/bus/svi3x8/slot/slot.h13
-rw-r--r--src/devices/bus/svi3x8/slot/sv801.h6
-rw-r--r--src/devices/bus/svi3x8/slot/sv802.h4
-rw-r--r--src/devices/bus/svi3x8/slot/sv803.h4
-rw-r--r--src/devices/bus/svi3x8/slot/sv805.h4
-rw-r--r--src/devices/bus/svi3x8/slot/sv806.h6
-rw-r--r--src/devices/bus/svi3x8/slot/sv807.h6
-rw-r--r--src/devices/bus/tanbus/bullsnd.h4
-rw-r--r--src/devices/bus/tanbus/etirtc.h4
-rw-r--r--src/devices/bus/tanbus/etisnd.h4
-rw-r--r--src/devices/bus/tanbus/keyboard/keyboard.h17
-rw-r--r--src/devices/bus/tanbus/keyboard/mt006.cpp2
-rw-r--r--src/devices/bus/tanbus/keyboard/mt006.h4
-rw-r--r--src/devices/bus/tanbus/keyboard/mt009.cpp2
-rw-r--r--src/devices/bus/tanbus/keyboard/mt009.h8
-rw-r--r--src/devices/bus/tanbus/keyboard/spinveti.cpp2
-rw-r--r--src/devices/bus/tanbus/keyboard/spinveti.h4
-rw-r--r--src/devices/bus/tanbus/mpvdu.h4
-rw-r--r--src/devices/bus/tanbus/ra32k.h8
-rw-r--r--src/devices/bus/tanbus/radisc.h4
-rw-r--r--src/devices/bus/tanbus/ravdu.h6
-rw-r--r--src/devices/bus/tanbus/tanbus.h11
-rw-r--r--src/devices/bus/tanbus/tandos.h8
-rw-r--r--src/devices/bus/tanbus/tanex.h10
-rw-r--r--src/devices/bus/tanbus/tanhrg.h12
-rw-r--r--src/devices/bus/tanbus/tanram.h2
-rw-r--r--src/devices/bus/tanbus/tanrtc.h4
-rw-r--r--src/devices/bus/tanbus/tug64k.h4
-rw-r--r--src/devices/bus/tanbus/tug8082.h10
-rw-r--r--src/devices/bus/tanbus/tugcombo.h18
-rw-r--r--src/devices/bus/tanbus/tugpgm.h4
-rw-r--r--src/devices/bus/technics/kn5000/hdae5000.cpp135
-rw-r--r--src/devices/bus/technics/kn5000/hdae5000.h15
-rw-r--r--src/devices/bus/technics/kn5000/kn5000_extension.cpp45
-rw-r--r--src/devices/bus/technics/kn5000/kn5000_extension.h51
-rw-r--r--src/devices/bus/thomson/cc90_232.h8
-rw-r--r--src/devices/bus/thomson/cd90_015.cpp2
-rw-r--r--src/devices/bus/thomson/cd90_015.h12
-rw-r--r--src/devices/bus/thomson/cd90_351.cpp449
-rw-r--r--src/devices/bus/thomson/cd90_351.h108
-rw-r--r--src/devices/bus/thomson/cd90_640.cpp7
-rw-r--r--src/devices/bus/thomson/cd90_640.h12
-rw-r--r--src/devices/bus/thomson/cq90_028.h12
-rw-r--r--src/devices/bus/thomson/extension.h2
-rw-r--r--src/devices/bus/thomson/md90_120.h10
-rw-r--r--src/devices/bus/thomson/midipak.h8
-rw-r--r--src/devices/bus/thomson/nanoreseau.h16
-rw-r--r--src/devices/bus/thomson/rf57_932.h8
-rw-r--r--src/devices/bus/thomson/speech.h8
-rw-r--r--src/devices/bus/ti8x/bitsocket.cpp4
-rw-r--r--src/devices/bus/ti8x/graphlinkhle.cpp6
-rw-r--r--src/devices/bus/ti8x/teeconn.cpp4
-rw-r--r--src/devices/bus/ti8x/teeconn.h6
-rw-r--r--src/devices/bus/ti8x/ti8x.h13
-rw-r--r--src/devices/bus/ti8x/tispeaker.cpp7
-rw-r--r--src/devices/bus/ti8x/tispeaker.h6
-rw-r--r--src/devices/bus/ti99/colorbus/busmouse.cpp10
-rw-r--r--src/devices/bus/ti99/colorbus/busmouse.h4
-rw-r--r--src/devices/bus/ti99/colorbus/colorbus.h7
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.cpp472
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.h100
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.cpp10
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.h8
-rw-r--r--src/devices/bus/ti99/gromport/gromport.h11
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.cpp2
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.h8
-rw-r--r--src/devices/bus/ti99/gromport/singleconn.h2
-rw-r--r--src/devices/bus/ti99/internal/992board.h15
-rw-r--r--src/devices/bus/ti99/internal/998board.h21
-rw-r--r--src/devices/bus/ti99/internal/buffram.h8
-rw-r--r--src/devices/bus/ti99/internal/datamux.cpp4
-rw-r--r--src/devices/bus/ti99/internal/datamux.h4
-rw-r--r--src/devices/bus/ti99/internal/evpcconn.h2
-rw-r--r--src/devices/bus/ti99/internal/genboard.cpp21
-rw-r--r--src/devices/bus/ti99/internal/genboard.h17
-rw-r--r--src/devices/bus/ti99/internal/genkbd.h6
-rw-r--r--src/devices/bus/ti99/internal/ioport.cpp26
-rw-r--r--src/devices/bus/ti99/internal/ioport.h10
-rw-r--r--src/devices/bus/ti99/internal/splitter.cpp190
-rw-r--r--src/devices/bus/ti99/internal/splitter.h65
-rw-r--r--src/devices/bus/ti99/joyport/handset.h10
-rw-r--r--src/devices/bus/ti99/joyport/joyport.h7
-rw-r--r--src/devices/bus/ti99/joyport/mecmouse.h6
-rw-r--r--src/devices/bus/ti99/peb/bwg.cpp2
-rw-r--r--src/devices/bus/ti99/peb/bwg.h16
-rw-r--r--src/devices/bus/ti99/peb/cc_fdc.cpp15
-rw-r--r--src/devices/bus/ti99/peb/cc_fdc.h20
-rw-r--r--src/devices/bus/ti99/peb/evpc.h10
-rw-r--r--src/devices/bus/ti99/peb/forti.cpp11
-rw-r--r--src/devices/bus/ti99/peb/forti.h4
-rw-r--r--src/devices/bus/ti99/peb/hfdc.cpp2
-rw-r--r--src/devices/bus/ti99/peb/hfdc.h10
-rw-r--r--src/devices/bus/ti99/peb/horizon.cpp4
-rw-r--r--src/devices/bus/ti99/peb/horizon.h8
-rw-r--r--src/devices/bus/ti99/peb/hsgpl.h10
-rw-r--r--src/devices/bus/ti99/peb/memex.h8
-rw-r--r--src/devices/bus/ti99/peb/myarcfdc.cpp2
-rw-r--r--src/devices/bus/ti99/peb/myarcfdc.h16
-rw-r--r--src/devices/bus/ti99/peb/myarcmem.h6
-rw-r--r--src/devices/bus/ti99/peb/pcode.cpp2
-rw-r--r--src/devices/bus/ti99/peb/pcode.h10
-rw-r--r--src/devices/bus/ti99/peb/peribox.cpp141
-rw-r--r--src/devices/bus/ti99/peb/peribox.h32
-rw-r--r--src/devices/bus/ti99/peb/pgram.cpp4
-rw-r--r--src/devices/bus/ti99/peb/pgram.h4
-rw-r--r--src/devices/bus/ti99/peb/samsmem.cpp201
-rw-r--r--src/devices/bus/ti99/peb/samsmem.h32
-rw-r--r--src/devices/bus/ti99/peb/scsicard.cpp12
-rw-r--r--src/devices/bus/ti99/peb/scsicard.h20
-rw-r--r--src/devices/bus/ti99/peb/sidmaster.h4
-rw-r--r--src/devices/bus/ti99/peb/spchsyn.cpp193
-rw-r--r--src/devices/bus/ti99/peb/spchsyn.h55
-rw-r--r--src/devices/bus/ti99/peb/speechadapter.cpp158
-rw-r--r--src/devices/bus/ti99/peb/speechadapter.h49
-rw-r--r--src/devices/bus/ti99/peb/ti_32kmem.h4
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.cpp2
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.h8
-rw-r--r--src/devices/bus/ti99/peb/ti_rs232.h12
-rw-r--r--src/devices/bus/ti99/peb/tipi.cpp332
-rw-r--r--src/devices/bus/ti99/peb/tipi.h11
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.cpp4
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.h4
-rw-r--r--src/devices/bus/ti99/peb/tn_usbsm.h8
-rw-r--r--src/devices/bus/ti99/sidecar/arcturus.cpp93
-rw-r--r--src/devices/bus/ti99/sidecar/arcturus.h49
-rw-r--r--src/devices/bus/ti99/sidecar/speechsyn.cpp273
-rw-r--r--src/devices/bus/ti99/sidecar/speechsyn.h65
-rw-r--r--src/devices/bus/ti99/sidecar/thermal.cpp367
-rw-r--r--src/devices/bus/ti99/sidecar/thermal.h82
-rw-r--r--src/devices/bus/ti99x/990_dk.h4
-rw-r--r--src/devices/bus/ti99x/990_hd.h4
-rw-r--r--src/devices/bus/ti99x/990_tap.cpp2
-rw-r--r--src/devices/bus/ti99x/990_tap.h4
-rw-r--r--src/devices/bus/tiki100/8088.h12
-rw-r--r--src/devices/bus/tiki100/exp.h13
-rw-r--r--src/devices/bus/tiki100/hdc.h6
-rw-r--r--src/devices/bus/tim011/aycard.cpp6
-rw-r--r--src/devices/bus/tim011/exp.h7
-rw-r--r--src/devices/bus/tmc600/euro.h14
-rw-r--r--src/devices/bus/tvc/hbf.h8
-rw-r--r--src/devices/bus/tvc/tvc.h11
-rw-r--r--src/devices/bus/uts_kbd/400kbd.h10
-rw-r--r--src/devices/bus/uts_kbd/extw.cpp2
-rw-r--r--src/devices/bus/uts_kbd/extw.h12
-rw-r--r--src/devices/bus/uts_kbd/uts_kbd.h7
-rw-r--r--src/devices/bus/vboy/slot.h5
-rw-r--r--src/devices/bus/vc4000/slot.h14
-rw-r--r--src/devices/bus/vcs/compumat.h4
-rw-r--r--src/devices/bus/vcs/dpc.h6
-rw-r--r--src/devices/bus/vcs/harmony_melody.h8
-rw-r--r--src/devices/bus/vcs/rom.h34
-rw-r--r--src/devices/bus/vcs/scharger.cpp3
-rw-r--r--src/devices/bus/vcs/scharger.h6
-rw-r--r--src/devices/bus/vcs/vcs_slot.h9
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.h17
-rw-r--r--src/devices/bus/vcs_ctrl/cx85.h6
-rw-r--r--src/devices/bus/vcs_ctrl/joybooster.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/joybooster.h4
-rw-r--r--src/devices/bus/vcs_ctrl/joystick.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/joystick.h4
-rw-r--r--src/devices/bus/vcs_ctrl/keypad.h4
-rw-r--r--src/devices/bus/vcs_ctrl/lightpen.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/lightpen.h4
-rw-r--r--src/devices/bus/vcs_ctrl/mouse.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/mouse.h4
-rw-r--r--src/devices/bus/vcs_ctrl/paddles.h4
-rw-r--r--src/devices/bus/vcs_ctrl/trakball.cpp150
-rw-r--r--src/devices/bus/vcs_ctrl/trakball.h53
-rw-r--r--src/devices/bus/vcs_ctrl/wheel.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/wheel.h4
-rw-r--r--src/devices/bus/vectrex/rom.h4
-rw-r--r--src/devices/bus/vectrex/slot.h2
-rw-r--r--src/devices/bus/vic10/exp.h7
-rw-r--r--src/devices/bus/vic10/multimax.h4
-rw-r--r--src/devices/bus/vic10/std.h2
-rw-r--r--src/devices/bus/vic20/4cga.cpp20
-rw-r--r--src/devices/bus/vic20/4cga.h4
-rw-r--r--src/devices/bus/vic20/exp.h9
-rw-r--r--src/devices/bus/vic20/fe3.h8
-rw-r--r--src/devices/bus/vic20/megacart.h6
-rw-r--r--src/devices/bus/vic20/speakeasy.h4
-rw-r--r--src/devices/bus/vic20/std.h2
-rw-r--r--src/devices/bus/vic20/vic1010.h6
-rw-r--r--src/devices/bus/vic20/vic1011.h4
-rw-r--r--src/devices/bus/vic20/vic1110.h4
-rw-r--r--src/devices/bus/vic20/vic1111.h2
-rw-r--r--src/devices/bus/vic20/vic1112.h6
-rw-r--r--src/devices/bus/vic20/vic1210.h2
-rw-r--r--src/devices/bus/vic20/videopak.h8
-rw-r--r--src/devices/bus/vidbrain/comp_language.h2
-rw-r--r--src/devices/bus/vidbrain/exp.h9
-rw-r--r--src/devices/bus/vip/byteio.h13
-rw-r--r--src/devices/bus/vip/exp.h11
-rw-r--r--src/devices/bus/vip/vp550.h4
-rw-r--r--src/devices/bus/vip/vp570.h4
-rw-r--r--src/devices/bus/vip/vp575.h4
-rw-r--r--src/devices/bus/vip/vp585.h4
-rw-r--r--src/devices/bus/vip/vp590.h6
-rw-r--r--src/devices/bus/vip/vp595.h4
-rw-r--r--src/devices/bus/vip/vp620.h4
-rw-r--r--src/devices/bus/vip/vp700.h4
-rw-r--r--src/devices/bus/vme/cp31.h14
-rw-r--r--src/devices/bus/vme/enp10.cpp333
-rw-r--r--src/devices/bus/vme/enp10.h43
-rw-r--r--src/devices/bus/vme/hcpu30.cpp20
-rw-r--r--src/devices/bus/vme/hcpu30.h18
-rw-r--r--src/devices/bus/vme/hk68v10.cpp2
-rw-r--r--src/devices/bus/vme/hk68v10.h12
-rw-r--r--src/devices/bus/vme/mvme120.cpp4
-rw-r--r--src/devices/bus/vme/mvme120.h26
-rw-r--r--src/devices/bus/vme/mvme147.h12
-rw-r--r--src/devices/bus/vme/mvme180.h12
-rw-r--r--src/devices/bus/vme/mvme181.cpp14
-rw-r--r--src/devices/bus/vme/mvme181.h16
-rw-r--r--src/devices/bus/vme/mvme187.h12
-rw-r--r--src/devices/bus/vme/mvme327a.cpp17
-rw-r--r--src/devices/bus/vme/mvme327a.h14
-rw-r--r--src/devices/bus/vme/mvme328.cpp283
-rw-r--r--src/devices/bus/vme/mvme328.h56
-rw-r--r--src/devices/bus/vme/mvme350.h10
-rw-r--r--src/devices/bus/vme/mzr8105.h12
-rw-r--r--src/devices/bus/vme/mzr8300.h6
-rw-r--r--src/devices/bus/vme/smvme2000.h14
-rw-r--r--src/devices/bus/vme/sys68k_cpu1.cpp49
-rw-r--r--src/devices/bus/vme/sys68k_cpu1.h12
-rw-r--r--src/devices/bus/vme/sys68k_cpu20.h26
-rw-r--r--src/devices/bus/vme/sys68k_cpu30.h38
-rw-r--r--src/devices/bus/vme/sys68k_iscsi.cpp12
-rw-r--r--src/devices/bus/vme/sys68k_iscsi.h12
-rw-r--r--src/devices/bus/vme/sys68k_isio.h10
-rw-r--r--src/devices/bus/vme/tp880v.cpp163
-rw-r--r--src/devices/bus/vme/tp880v.h57
-rw-r--r--src/devices/bus/vme/tp881v.cpp32
-rw-r--r--src/devices/bus/vme/tp881v.h14
-rw-r--r--src/devices/bus/vme/tsvme104.cpp155
-rw-r--r--src/devices/bus/vme/tsvme104.h50
-rw-r--r--src/devices/bus/vme/vme.cpp78
-rw-r--r--src/devices/bus/vme/vme.h68
-rw-r--r--src/devices/bus/vme/vme_cards.cpp6
-rw-r--r--src/devices/bus/vme/vme_cards.h6
-rw-r--r--src/devices/bus/vsmile/keyboard.cpp14
-rw-r--r--src/devices/bus/vsmile/keyboard.h10
-rw-r--r--src/devices/bus/vsmile/mat.cpp24
-rw-r--r--src/devices/bus/vsmile/mat.h2
-rw-r--r--src/devices/bus/vsmile/pad.cpp24
-rw-r--r--src/devices/bus/vsmile/pad.h4
-rw-r--r--src/devices/bus/vsmile/rom.h4
-rw-r--r--src/devices/bus/vsmile/vsmile_ctrl.h11
-rw-r--r--src/devices/bus/vsmile/vsmile_slot.h9
-rw-r--r--src/devices/bus/vtech/ioexp/ioexp.cpp1
-rw-r--r--src/devices/bus/vtech/ioexp/ioexp.h16
-rw-r--r--src/devices/bus/vtech/ioexp/joystick.h6
-rw-r--r--src/devices/bus/vtech/ioexp/lpen.h4
-rw-r--r--src/devices/bus/vtech/ioexp/printer.h6
-rw-r--r--src/devices/bus/vtech/memexp/floppy.h12
-rw-r--r--src/devices/bus/vtech/memexp/memexp.cpp1
-rw-r--r--src/devices/bus/vtech/memexp/memexp.h20
-rw-r--r--src/devices/bus/vtech/memexp/memory.h18
-rw-r--r--src/devices/bus/vtech/memexp/rs232.h8
-rw-r--r--src/devices/bus/vtech/memexp/rtty.h6
-rw-r--r--src/devices/bus/vtech/memexp/sdloader.cpp66
-rw-r--r--src/devices/bus/vtech/memexp/sdloader.h57
-rw-r--r--src/devices/bus/vtech/memexp/wordpro.h6
-rw-r--r--src/devices/bus/wangpc/emb.h4
-rw-r--r--src/devices/bus/wangpc/lic.h8
-rw-r--r--src/devices/bus/wangpc/lvc.h6
-rw-r--r--src/devices/bus/wangpc/mcc.h6
-rw-r--r--src/devices/bus/wangpc/mvc.h6
-rw-r--r--src/devices/bus/wangpc/rtc.cpp5
-rw-r--r--src/devices/bus/wangpc/rtc.h15
-rw-r--r--src/devices/bus/wangpc/tig.h12
-rw-r--r--src/devices/bus/wangpc/wangpc.h13
-rw-r--r--src/devices/bus/wangpc/wdc.h12
-rw-r--r--src/devices/bus/waveblaster/db50xg.cpp12
-rw-r--r--src/devices/bus/waveblaster/db60xg.cpp12
-rw-r--r--src/devices/bus/waveblaster/omniwave.cpp8
-rw-r--r--src/devices/bus/waveblaster/waveblaster.cpp3
-rw-r--r--src/devices/bus/waveblaster/waveblaster.h8
-rw-r--r--src/devices/bus/waveblaster/wg130.cpp12
-rw-r--r--src/devices/bus/wswan/rom.h16
-rw-r--r--src/devices/bus/wswan/slot.h7
-rw-r--r--src/devices/bus/wysekbd/wysegakb.cpp290
-rw-r--r--src/devices/bus/wysekbd/wysegakb.h42
-rw-r--r--src/devices/bus/wysekbd/wysekbd.cpp16
-rw-r--r--src/devices/bus/wysekbd/wysekbd.h19
-rw-r--r--src/devices/bus/x68k/x68k_midi.h6
-rw-r--r--src/devices/bus/x68k/x68k_neptunex.h6
-rw-r--r--src/devices/bus/x68k/x68k_scsiext.cpp61
-rw-r--r--src/devices/bus/x68k/x68k_scsiext.h17
-rw-r--r--src/devices/bus/x68k/x68kexp.cpp4
-rw-r--r--src/devices/bus/x68k/x68kexp.h19
-rw-r--r--src/devices/bus/z29_kbd/he191_3425.cpp4
-rw-r--r--src/devices/bus/z29_kbd/he191_3425.h10
-rw-r--r--src/devices/bus/z29_kbd/keyboard.h9
-rw-r--r--src/devices/bus/z29_kbd/md_kbd.h16
-rw-r--r--src/devices/bus/z88/flash.h6
-rw-r--r--src/devices/bus/z88/ram.cpp2
-rw-r--r--src/devices/bus/z88/rom.cpp2
-rw-r--r--src/devices/bus/z88/z88.h9
-rw-r--r--src/devices/cpu/8x300/8x300.h5
-rw-r--r--src/devices/cpu/adsp2100/2100ops.hxx4
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.cpp113
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.h122
-rw-r--r--src/devices/cpu/alpha/alpha.h13
-rw-r--r--src/devices/cpu/alto2/a2disp.cpp2
-rw-r--r--src/devices/cpu/alto2/a2disp.h36
-rw-r--r--src/devices/cpu/alto2/a2ether.cpp2
-rw-r--r--src/devices/cpu/alto2/a2ether.h78
-rw-r--r--src/devices/cpu/alto2/alto2cpu.h13
-rw-r--r--src/devices/cpu/am29000/am29000.cpp2
-rw-r--r--src/devices/cpu/am29000/am29000.h5
-rw-r--r--src/devices/cpu/amis2000/amis2000.cpp2
-rw-r--r--src/devices/cpu/amis2000/amis2000.h17
-rw-r--r--src/devices/cpu/apexc/apexc.cpp6
-rw-r--r--src/devices/cpu/apexc/apexc.h5
-rw-r--r--src/devices/cpu/arc/arc.h5
-rw-r--r--src/devices/cpu/arcompact/arcompact.h7
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute.cpp8
-rw-r--r--src/devices/cpu/arm/arm.h5
-rw-r--r--src/devices/cpu/arm7/ap2010cpu.cpp6
-rw-r--r--src/devices/cpu/arm7/ap2010cpu.h5
-rw-r--r--src/devices/cpu/arm7/arm7.cpp118
-rw-r--r--src/devices/cpu/arm7/arm7.h391
-rw-r--r--src/devices/cpu/arm7/arm7core.h107
-rw-r--r--src/devices/cpu/arm7/arm7core.hxx14
-rw-r--r--src/devices/cpu/arm7/arm7dasm.cpp4
-rw-r--r--src/devices/cpu/arm7/arm7dasm.h4
-rw-r--r--src/devices/cpu/arm7/arm7drc.hxx1812
-rw-r--r--src/devices/cpu/arm7/arm7fe.hxx458
-rw-r--r--src/devices/cpu/arm7/arm7tdrc.hxx1592
-rw-r--r--src/devices/cpu/arm7/lpc210x.cpp3
-rw-r--r--src/devices/cpu/arm7/lpc210x.h17
-rw-r--r--src/devices/cpu/arm7/upd800468.cpp3
-rw-r--r--src/devices/cpu/arm7/upd800468.h15
-rw-r--r--src/devices/cpu/asap/asap.cpp13
-rw-r--r--src/devices/cpu/asap/asap.h5
-rw-r--r--src/devices/cpu/avr8/avr8.cpp28
-rw-r--r--src/devices/cpu/avr8/avr8.h33
-rw-r--r--src/devices/cpu/axc51/axc51.cpp2
-rw-r--r--src/devices/cpu/axc51/axc51.h29
-rw-r--r--src/devices/cpu/axc51/axc51dasm.h7
-rw-r--r--src/devices/cpu/axc51/axc51ops.hxx2
-rw-r--r--src/devices/cpu/bcp/dp8344.h5
-rw-r--r--src/devices/cpu/c33/s1c33209.h12
-rw-r--r--src/devices/cpu/capricorn/capricorn.h12
-rw-r--r--src/devices/cpu/ccpu/ccpu.cpp32
-rw-r--r--src/devices/cpu/ccpu/ccpu.h51
-rw-r--r--src/devices/cpu/cdc160/cdc160d.cpp379
-rw-r--r--src/devices/cpu/cdc160/cdc160d.h34
-rw-r--r--src/devices/cpu/clipper/clipper.cpp5
-rw-r--r--src/devices/cpu/clipper/clipper.h7
-rw-r--r--src/devices/cpu/clipper/clipperd.h6
-rw-r--r--src/devices/cpu/cop400/cop400.h23
-rw-r--r--src/devices/cpu/cop400/cop410ds.h6
-rw-r--r--src/devices/cpu/cop400/cop420ds.h6
-rw-r--r--src/devices/cpu/cop400/cop424ds.h6
-rw-r--r--src/devices/cpu/cop400/cop444ds.h6
-rw-r--r--src/devices/cpu/cops1/cops1base.cpp2
-rw-r--r--src/devices/cpu/cops1/cops1base.h6
-rw-r--r--src/devices/cpu/cops1/mm5799.h8
-rw-r--r--src/devices/cpu/cosmac/cosmac.cpp54
-rw-r--r--src/devices/cpu/cosmac/cosmac.h17
-rw-r--r--src/devices/cpu/cp1610/1610dasm.h6
-rw-r--r--src/devices/cpu/cp1610/cp1610.cpp2
-rw-r--r--src/devices/cpu/cp1610/cp1610.h7
-rw-r--r--src/devices/cpu/cr16b/cr16b.h4
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.h15
-rw-r--r--src/devices/cpu/diablo/diablo1300.h7
-rw-r--r--src/devices/cpu/drcbearm64.cpp5731
-rw-r--r--src/devices/cpu/drcbearm64.h26
-rw-r--r--src/devices/cpu/drcbec.cpp1165
-rw-r--r--src/devices/cpu/drcbec.h49
-rw-r--r--src/devices/cpu/drcbeut.cpp518
-rw-r--r--src/devices/cpu/drcbeut.h204
-rw-r--r--src/devices/cpu/drcbex64.cpp4829
-rw-r--r--src/devices/cpu/drcbex64.h290
-rw-r--r--src/devices/cpu/drcbex86.cpp6166
-rw-r--r--src/devices/cpu/drcbex86.h303
-rw-r--r--src/devices/cpu/drccache.cpp440
-rw-r--r--src/devices/cpu/drccache.h165
-rw-r--r--src/devices/cpu/drcfe.cpp393
-rw-r--r--src/devices/cpu/drcfe.h210
-rw-r--r--src/devices/cpu/drcfe.ipp389
-rw-r--r--src/devices/cpu/drcuml.cpp750
-rw-r--r--src/devices/cpu/drcuml.h76
-rw-r--r--src/devices/cpu/drcumlsh.h98
-rw-r--r--src/devices/cpu/dsp16/dsp16.cpp13
-rw-r--r--src/devices/cpu/dsp16/dsp16.h18
-rw-r--r--src/devices/cpu/dsp16/dsp16core.h7
-rw-r--r--src/devices/cpu/dsp16/dsp16fe.cpp138
-rw-r--r--src/devices/cpu/dsp16/dsp16fe.h50
-rw-r--r--src/devices/cpu/dsp32/dsp32.cpp12
-rw-r--r--src/devices/cpu/dsp32/dsp32.h5
-rw-r--r--src/devices/cpu/dsp56000/dsp56000.h5
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.cpp6
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.h93
-rw-r--r--src/devices/cpu/dsp56156/dsp56def.h12
-rw-r--r--src/devices/cpu/dsp56156/dsp56dsm.h6
-rw-r--r--src/devices/cpu/dsp56156/dsp56ops.hxx4
-rw-r--r--src/devices/cpu/dsp56156/dsp56pcu.cpp4
-rw-r--r--src/devices/cpu/dsp56156/dsp56pcu.h12
-rw-r--r--src/devices/cpu/dsp56156/inst.h15
-rw-r--r--src/devices/cpu/dsp56156/opcode.h6
-rw-r--r--src/devices/cpu/dsp56156/pmove.h15
-rw-r--r--src/devices/cpu/dsp56156/tables.h19
-rw-r--r--src/devices/cpu/dsp563xx/dsp56303.cpp65
-rw-r--r--src/devices/cpu/dsp563xx/dsp56303.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp56311.cpp65
-rw-r--r--src/devices/cpu/dsp563xx/dsp56311.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp56362.cpp67
-rw-r--r--src/devices/cpu/dsp563xx/dsp56362.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp56364.cpp66
-rw-r--r--src/devices/cpu/dsp563xx/dsp56364.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx-interp.cpp59826
-rwxr-xr-xsrc/devices/cpu/dsp563xx/dsp563xx-make.py1264
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx-tables.cpp34860
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx.cpp452
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx.h246
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx.lst1402
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xxd-tables.cpp35241
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xxd.cpp46
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xxd.h72
-rw-r--r--src/devices/cpu/dsp563xx/hi08.cpp190
-rw-r--r--src/devices/cpu/dsp563xx/hi08.h76
-rw-r--r--src/devices/cpu/dsp563xx/shi.cpp98
-rw-r--r--src/devices/cpu/dsp563xx/shi.h52
-rw-r--r--src/devices/cpu/dspp/dspp.cpp240
-rw-r--r--src/devices/cpu/dspp/dspp.h76
-rw-r--r--src/devices/cpu/dspp/dsppdasm.cpp676
-rw-r--r--src/devices/cpu/dspp/dsppdasm.h12
-rw-r--r--src/devices/cpu/dspp/dsppdrc.cpp180
-rw-r--r--src/devices/cpu/dspp/dsppfe.cpp187
-rw-r--r--src/devices/cpu/dspp/dsppfe.h91
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.cpp21
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.h6
-rw-r--r--src/devices/cpu/e0c6200/e0c6200op.cpp5
-rw-r--r--src/devices/cpu/e0c6200/e0c6s46.cpp317
-rw-r--r--src/devices/cpu/e0c6200/e0c6s46.h94
-rw-r--r--src/devices/cpu/e132xs/32xsdasm.cpp2148
-rw-r--r--src/devices/cpu/e132xs/32xsdasm.h53
-rw-r--r--src/devices/cpu/e132xs/32xsdefs.h230
-rw-r--r--src/devices/cpu/e132xs/e132xs.cpp1699
-rw-r--r--src/devices/cpu/e132xs/e132xs.h692
-rw-r--r--src/devices/cpu/e132xs/e132xsdrc.cpp1160
-rw-r--r--src/devices/cpu/e132xs/e132xsdrc_ops.hxx5902
-rw-r--r--src/devices/cpu/e132xs/e132xsfe.cpp1355
-rw-r--r--src/devices/cpu/e132xs/e132xsfe.h33
-rw-r--r--src/devices/cpu/e132xs/e132xsop.hxx1161
-rw-r--r--src/devices/cpu/e132xs/e1dasm.cpp1132
-rw-r--r--src/devices/cpu/e132xs/e1dasm.h51
-rw-r--r--src/devices/cpu/e132xs/e1defs.h247
-rw-r--r--src/devices/cpu/e132xs/e1fe.cpp1152
-rw-r--r--src/devices/cpu/e132xs/e1fe.h226
-rw-r--r--src/devices/cpu/es5510/es5510.cpp86
-rw-r--r--src/devices/cpu/es5510/es5510.h6
-rw-r--r--src/devices/cpu/es5510/es5510d.h6
-rw-r--r--src/devices/cpu/esrip/esrip.cpp13
-rw-r--r--src/devices/cpu/esrip/esrip.h7
-rw-r--r--src/devices/cpu/evolution/evo.cpp52
-rw-r--r--src/devices/cpu/evolution/evo.h40
-rw-r--r--src/devices/cpu/evolution/evod.cpp345
-rw-r--r--src/devices/cpu/evolution/evod.h34
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.cpp296
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.h21
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_adc.cpp304
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_adc.h72
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_clock.cpp355
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_clock.h74
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_intc.cpp269
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_intc.h64
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_port.cpp127
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_port.h57
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_ppg.cpp348
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_ppg.h70
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_reload.cpp381
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_reload.h75
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_uart.cpp456
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_uart.h98
-rw-r--r--src/devices/cpu/f2mc16/f2mc16d.cpp2
-rw-r--r--src/devices/cpu/f2mc16/f2mc16d.h2
-rw-r--r--src/devices/cpu/f2mc16/mb90570.cpp169
-rw-r--r--src/devices/cpu/f2mc16/mb90570.h55
-rw-r--r--src/devices/cpu/f2mc16/mb90610a.cpp138
-rw-r--r--src/devices/cpu/f2mc16/mb90610a.h59
-rw-r--r--src/devices/cpu/f2mc16/mb9061x.cpp457
-rw-r--r--src/devices/cpu/f2mc16/mb9061x.h180
-rw-r--r--src/devices/cpu/f2mc16/mb90640a.cpp134
-rw-r--r--src/devices/cpu/f2mc16/mb90640a.h52
-rw-r--r--src/devices/cpu/f8/f8.h7
-rw-r--r--src/devices/cpu/fr/fr.h6
-rw-r--r--src/devices/cpu/g65816/g65816.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816.h19
-rw-r--r--src/devices/cpu/g65816/g65816ds.cpp1
-rw-r--r--src/devices/cpu/g65816/g65816ds.h1
-rw-r--r--src/devices/cpu/g65816/g65816op.ipp9
-rw-r--r--src/devices/cpu/gigatron/gigatron.h24
-rw-r--r--src/devices/cpu/h16/hd641016.h8
-rw-r--r--src/devices/cpu/h6280/h6280.cpp19
-rw-r--r--src/devices/cpu/h6280/h6280.h11
-rw-r--r--src/devices/cpu/h8/c77.cpp216
-rw-r--r--src/devices/cpu/h8/c77.h95
-rw-r--r--src/devices/cpu/h8/gt913.cpp6
-rw-r--r--src/devices/cpu/h8/gt913.h8
-rw-r--r--src/devices/cpu/h8/h8.cpp2
-rw-r--r--src/devices/cpu/h8/h8.h49
-rw-r--r--src/devices/cpu/h8/h83002.h9
-rw-r--r--src/devices/cpu/h8/h83003.h9
-rw-r--r--src/devices/cpu/h8/h83006.h9
-rw-r--r--src/devices/cpu/h8/h83008.h9
-rw-r--r--src/devices/cpu/h8/h83032.h9
-rw-r--r--src/devices/cpu/h8/h83042.h9
-rw-r--r--src/devices/cpu/h8/h83048.cpp1
-rw-r--r--src/devices/cpu/h8/h83048.h11
-rw-r--r--src/devices/cpu/h8/h83217.h8
-rw-r--r--src/devices/cpu/h8/h8325.h8
-rw-r--r--src/devices/cpu/h8/h83337.h8
-rw-r--r--src/devices/cpu/h8/h8_adc.cpp17
-rw-r--r--src/devices/cpu/h8/h8_adc.h5
-rw-r--r--src/devices/cpu/h8/h8_dma.cpp2
-rw-r--r--src/devices/cpu/h8/h8_dma.h21
-rw-r--r--src/devices/cpu/h8/h8_dtc.cpp1
-rw-r--r--src/devices/cpu/h8/h8_dtc.h4
-rw-r--r--src/devices/cpu/h8/h8_intc.h14
-rw-r--r--src/devices/cpu/h8/h8_port.h4
-rw-r--r--src/devices/cpu/h8/h8_sci.cpp190
-rw-r--r--src/devices/cpu/h8/h8_sci.h12
-rw-r--r--src/devices/cpu/h8/h8_timer16.h10
-rw-r--r--src/devices/cpu/h8/h8_timer8.h4
-rw-r--r--src/devices/cpu/h8/h8_watchdog.h4
-rw-r--r--src/devices/cpu/h8/h8h.h1
-rw-r--r--src/devices/cpu/h8/h8s2000.h1
-rw-r--r--src/devices/cpu/h8/h8s2245.h10
-rw-r--r--src/devices/cpu/h8/h8s2319.h8
-rw-r--r--src/devices/cpu/h8/h8s2329.h10
-rw-r--r--src/devices/cpu/h8/h8s2357.h10
-rw-r--r--src/devices/cpu/h8/h8s2600.h5
-rw-r--r--src/devices/cpu/h8/h8s2655.h9
-rw-r--r--src/devices/cpu/h8/swx00.cpp6
-rw-r--r--src/devices/cpu/h8/swx00.h10
-rw-r--r--src/devices/cpu/h8500/h8500.h4
-rw-r--r--src/devices/cpu/h8500/h8500dasm.cpp2
-rw-r--r--src/devices/cpu/h8500/h8500dasm.h2
-rw-r--r--src/devices/cpu/h8500/h8510.h2
-rw-r--r--src/devices/cpu/h8500/h8520.h2
-rw-r--r--src/devices/cpu/h8500/h8532.h2
-rw-r--r--src/devices/cpu/h8500/h8534.h6
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.cpp403
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.h20
-rw-r--r--src/devices/cpu/hcd62121/hcd62121d.cpp16
-rw-r--r--src/devices/cpu/hd61700/hd61700.cpp9
-rw-r--r--src/devices/cpu/hd61700/hd61700.h5
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.cpp731
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.h198
-rw-r--r--src/devices/cpu/hmcs40/hmcs40d.cpp15
-rw-r--r--src/devices/cpu/hmcs40/hmcs40d.h5
-rw-r--r--src/devices/cpu/hmcs40/hmcs40op.cpp83
-rw-r--r--src/devices/cpu/hmcs400/hmcs400.cpp1024
-rw-r--r--src/devices/cpu/hmcs400/hmcs400.h557
-rw-r--r--src/devices/cpu/hmcs400/hmcs400d.cpp237
-rw-r--r--src/devices/cpu/hmcs400/hmcs400d.h31
-rw-r--r--src/devices/cpu/hmcs400/hmcs400op.cpp692
-rw-r--r--src/devices/cpu/hpc/hpc.h8
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.h11
-rw-r--r--src/devices/cpu/ht1130/ht1130.cpp1
-rw-r--r--src/devices/cpu/ht1130/ht1130.h13
-rw-r--r--src/devices/cpu/i386/athlon.cpp25
-rw-r--r--src/devices/cpu/i386/athlon.h4
-rw-r--r--src/devices/cpu/i386/cycles.h8
-rw-r--r--src/devices/cpu/i386/i386.cpp147
-rw-r--r--src/devices/cpu/i386/i386.h77
-rw-r--r--src/devices/cpu/i386/i386dasm.h14
-rw-r--r--src/devices/cpu/i386/i386op16.hxx50
-rw-r--r--src/devices/cpu/i386/i386op32.hxx72
-rw-r--r--src/devices/cpu/i386/i386ops.hxx20
-rw-r--r--src/devices/cpu/i386/i386priv.h14
-rw-r--r--src/devices/cpu/i386/i386segs.hxx18
-rw-r--r--src/devices/cpu/i386/i486ops.hxx5
-rw-r--r--src/devices/cpu/i386/pentops.hxx336
-rw-r--r--src/devices/cpu/i386/x87ops.hxx1070
-rw-r--r--src/devices/cpu/i386/x87priv.h85
-rw-r--r--src/devices/cpu/i8008/i8008.cpp2
-rw-r--r--src/devices/cpu/i8008/i8008.h4
-rw-r--r--src/devices/cpu/i8085/i8085.cpp149
-rw-r--r--src/devices/cpu/i8085/i8085.h33
-rw-r--r--src/devices/cpu/i8089/i8089.cpp1
-rw-r--r--src/devices/cpu/i8089/i8089.h6
-rw-r--r--src/devices/cpu/i8089/i8089_channel.cpp2
-rw-r--r--src/devices/cpu/i8089/i8089_channel.h10
-rw-r--r--src/devices/cpu/i8089/i8089_dasm.h6
-rw-r--r--src/devices/cpu/i86/i186.cpp193
-rw-r--r--src/devices/cpu/i86/i186.h57
-rw-r--r--src/devices/cpu/i86/i286.cpp38
-rw-r--r--src/devices/cpu/i86/i286.h6
-rw-r--r--src/devices/cpu/i86/i86.cpp205
-rw-r--r--src/devices/cpu/i86/i86.h18
-rw-r--r--src/devices/cpu/i86/i86.txt7
-rw-r--r--src/devices/cpu/i86/i86inline.h44
-rw-r--r--src/devices/cpu/i860/i860.h6
-rw-r--r--src/devices/cpu/i860/i860dec.hxx7
-rw-r--r--src/devices/cpu/i960/i960.cpp289
-rw-r--r--src/devices/cpu/i960/i960.h32
-rw-r--r--src/devices/cpu/i960/i960dis.cpp8
-rw-r--r--src/devices/cpu/ie15/ie15.cpp4
-rw-r--r--src/devices/cpu/ie15/ie15.h4
-rw-r--r--src/devices/cpu/jaguar/jaguar.cpp300
-rw-r--r--src/devices/cpu/jaguar/jaguar.h20
-rw-r--r--src/devices/cpu/ks0164/ks0164.cpp5
-rw-r--r--src/devices/cpu/ks0164/ks0164.h5
-rw-r--r--src/devices/cpu/lc6500/lc6500_dasm.cpp155
-rw-r--r--src/devices/cpu/lc6500/lc6500_dasm.h28
-rw-r--r--src/devices/cpu/lc6500/lc6554.cpp816
-rw-r--r--src/devices/cpu/lc6500/lc6554.h241
-rw-r--r--src/devices/cpu/lc8670/lc8670.cpp8
-rw-r--r--src/devices/cpu/lc8670/lc8670.h7
-rw-r--r--src/devices/cpu/lc8670/lc8670dsm.cpp259
-rw-r--r--src/devices/cpu/lc8670/lc8670dsm.h29
-rw-r--r--src/devices/cpu/lh5801/5801dasm.cpp4
-rw-r--r--src/devices/cpu/lh5801/lh5801.cpp3
-rw-r--r--src/devices/cpu/lh5801/lh5801.h5
-rw-r--r--src/devices/cpu/lr35902/lr35902.cpp3
-rw-r--r--src/devices/cpu/lr35902/lr35902.h5
-rw-r--r--src/devices/cpu/lr35902/lr35902d.h6
-rw-r--r--src/devices/cpu/m16c/m16cdasm.cpp1
-rw-r--r--src/devices/cpu/m37710/m37710.h29
-rw-r--r--src/devices/cpu/m37710/m37710op.h4
-rw-r--r--src/devices/cpu/m37710/m7700ds.h1
-rw-r--r--src/devices/cpu/m6502/deco16.cpp20
-rw-r--r--src/devices/cpu/m6502/deco16.h6
-rw-r--r--src/devices/cpu/m6502/dm65c02.lst20
-rw-r--r--src/devices/cpu/m6502/dvt3xx_spu.lst20
-rw-r--r--src/devices/cpu/m6502/dw65c02.lst20
-rw-r--r--src/devices/cpu/m6502/g65sc02.cpp46
-rw-r--r--src/devices/cpu/m6502/g65sc02.h54
-rw-r--r--src/devices/cpu/m6502/gew12.cpp14
-rw-r--r--src/devices/cpu/m6502/gew12.h14
-rw-r--r--src/devices/cpu/m6502/gew7.cpp18
-rw-r--r--src/devices/cpu/m6502/gew7.h14
-rw-r--r--src/devices/cpu/m6502/m3745x.cpp10
-rw-r--r--src/devices/cpu/m6502/m3745x.h16
-rw-r--r--src/devices/cpu/m6502/m37640.cpp2
-rw-r--r--src/devices/cpu/m6502/m37640.h6
-rw-r--r--src/devices/cpu/m6502/m4510.cpp118
-rw-r--r--src/devices/cpu/m6502/m4510.h41
-rw-r--r--src/devices/cpu/m6502/m50734.cpp8
-rw-r--r--src/devices/cpu/m6502/m50734.h6
-rw-r--r--src/devices/cpu/m6502/m5074x.cpp23
-rw-r--r--src/devices/cpu/m6502/m5074x.h34
-rw-r--r--src/devices/cpu/m6502/m6500_1.cpp26
-rw-r--r--src/devices/cpu/m6502/m6500_1.h6
-rw-r--r--src/devices/cpu/m6502/m6502.cpp490
-rw-r--r--src/devices/cpu/m6502/m6502.h109
-rw-r--r--src/devices/cpu/m6502/m6502.txt6
-rw-r--r--src/devices/cpu/m6502/m6502d.cpp12
-rw-r--r--src/devices/cpu/m6502/m6502d.h8
-rwxr-xr-xsrc/devices/cpu/m6502/m6502make.py43
-rw-r--r--src/devices/cpu/m6502/m6502mcu.ipp50
-rw-r--r--src/devices/cpu/m6502/m6503.cpp8
-rw-r--r--src/devices/cpu/m6502/m6504.cpp8
-rw-r--r--src/devices/cpu/m6502/m6507.cpp8
-rw-r--r--src/devices/cpu/m6502/m6509.cpp62
-rw-r--r--src/devices/cpu/m6502/m6509.h20
-rw-r--r--src/devices/cpu/m6502/m6510.cpp112
-rw-r--r--src/devices/cpu/m6502/m6510.h22
-rw-r--r--src/devices/cpu/m6502/m65c02.cpp33
-rw-r--r--src/devices/cpu/m6502/m65c02.h77
-rw-r--r--src/devices/cpu/m6502/m65c02d.cpp18
-rw-r--r--src/devices/cpu/m6502/m65c02d.h29
-rw-r--r--src/devices/cpu/m6502/m65ce02.cpp48
-rw-r--r--src/devices/cpu/m6502/m65ce02.h18
-rw-r--r--src/devices/cpu/m6502/m65sc02.cpp19
-rw-r--r--src/devices/cpu/m6502/m65sc02.h29
-rw-r--r--src/devices/cpu/m6502/m740.cpp110
-rw-r--r--src/devices/cpu/m6502/m740.h10
-rw-r--r--src/devices/cpu/m6502/m740d.cpp4
-rw-r--r--src/devices/cpu/m6502/m740d.h2
-rw-r--r--src/devices/cpu/m6502/m7501.cpp2
-rw-r--r--src/devices/cpu/m6502/odeco16.lst108
-rw-r--r--src/devices/cpu/m6502/om4510.lst26
-rw-r--r--src/devices/cpu/m6502/om6502.lst2960
-rw-r--r--src/devices/cpu/m6502/om6509.lst28
-rw-r--r--src/devices/cpu/m6502/om6510.lst64
-rw-r--r--src/devices/cpu/m6502/om65c02.lst897
-rw-r--r--src/devices/cpu/m6502/om65ce02.lst2212
-rw-r--r--src/devices/cpu/m6502/om740.lst2578
-rw-r--r--src/devices/cpu/m6502/or65c19.lst494
-rw-r--r--src/devices/cpu/m6502/orp2a03.lst490
-rw-r--r--src/devices/cpu/m6502/ovt3xx_spu.lst77
-rw-r--r--src/devices/cpu/m6502/ow65c02.lst897
-rw-r--r--src/devices/cpu/m6502/ow65c02s.lst1122
-rw-r--r--src/devices/cpu/m6502/oxavix.lst1424
-rw-r--r--src/devices/cpu/m6502/oxavix2000.lst320
-rw-r--r--src/devices/cpu/m6502/r65c02.cpp20
-rw-r--r--src/devices/cpu/m6502/r65c02.h20
-rw-r--r--src/devices/cpu/m6502/r65c19.cpp90
-rw-r--r--src/devices/cpu/m6502/r65c19.h20
-rw-r--r--src/devices/cpu/m6502/rp2a03.cpp10
-rw-r--r--src/devices/cpu/m6502/rp2a03.h6
-rw-r--r--src/devices/cpu/m6502/st2204.cpp78
-rw-r--r--src/devices/cpu/m6502/st2204.h12
-rw-r--r--src/devices/cpu/m6502/st2205u.cpp209
-rw-r--r--src/devices/cpu/m6502/st2205u.h22
-rw-r--r--src/devices/cpu/m6502/st2xxx.cpp76
-rw-r--r--src/devices/cpu/m6502/st2xxx.h20
-rw-r--r--src/devices/cpu/m6502/vt3xx_spu.cpp107
-rw-r--r--src/devices/cpu/m6502/vt3xx_spu.h67
-rw-r--r--src/devices/cpu/m6502/vt3xx_spud.cpp15
-rw-r--r--src/devices/cpu/m6502/vt3xx_spud.h26
-rw-r--r--src/devices/cpu/m6502/w65c02.cpp61
-rw-r--r--src/devices/cpu/m6502/w65c02.h80
-rw-r--r--src/devices/cpu/m6502/w65c02d.cpp18
-rw-r--r--src/devices/cpu/m6502/w65c02d.h29
-rw-r--r--src/devices/cpu/m6502/w65c02s.cpp2
-rw-r--r--src/devices/cpu/m6502/w65c02s.h6
-rw-r--r--src/devices/cpu/m6502/xavix.cpp97
-rw-r--r--src/devices/cpu/m6502/xavix.h27
-rw-r--r--src/devices/cpu/m6502/xavix2000.cpp1
-rw-r--r--src/devices/cpu/m6502/xavix2000.h2
-rw-r--r--src/devices/cpu/m6800/6800ops.hxx4
-rw-r--r--src/devices/cpu/m6800/m6800.cpp20
-rw-r--r--src/devices/cpu/m6800/m6800.h7
-rw-r--r--src/devices/cpu/m6800/m6801.cpp13
-rw-r--r--src/devices/cpu/m6800/m6801.h47
-rw-r--r--src/devices/cpu/m68000/fscpu32.h2
-rw-r--r--src/devices/cpu/m68000/m68000-sdf.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000-sdp.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000-sif.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000-sip.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000.cpp72
-rw-r--r--src/devices/cpu/m68000/m68000.h29
-rwxr-xr-xsrc/devices/cpu/m68000/m68000gen.py10
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sdfm.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sdpm.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sifm.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sipm.cpp1
-rw-r--r--src/devices/cpu/m68000/m68000mcu.cpp2
-rw-r--r--src/devices/cpu/m68000/m68000mcu.h8
-rw-r--r--src/devices/cpu/m68000/m68000musashi.h2
-rw-r--r--src/devices/cpu/m68000/m68008-sdf8.cpp11986
-rw-r--r--src/devices/cpu/m68000/m68008-sdp8.cpp11986
-rw-r--r--src/devices/cpu/m68000/m68008-sif8.cpp11986
-rw-r--r--src/devices/cpu/m68000/m68008-sip8.cpp11986
-rw-r--r--src/devices/cpu/m68000/m68008.cpp34
-rw-r--r--src/devices/cpu/m68000/m68008.h25
-rw-r--r--src/devices/cpu/m68000/m68010.cpp12
-rw-r--r--src/devices/cpu/m68000/m68010.h13
-rw-r--r--src/devices/cpu/m68000/m68020.h10
-rw-r--r--src/devices/cpu/m68000/m68030.cpp3
-rw-r--r--src/devices/cpu/m68000/m68030.h4
-rw-r--r--src/devices/cpu/m68000/m68040.cpp1
-rw-r--r--src/devices/cpu/m68000/m68040.h6
-rw-r--r--src/devices/cpu/m68000/m68k_in.lst298
-rw-r--r--src/devices/cpu/m68000/m68kcommon.h7
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp279
-rw-r--r--src/devices/cpu/m68000/m68kcpu.h67
-rw-r--r--src/devices/cpu/m68000/m68kdasm.cpp17
-rw-r--r--src/devices/cpu/m68000/m68kdasm.h3
-rw-r--r--src/devices/cpu/m68000/m68kfpu.cpp182
-rw-r--r--src/devices/cpu/m68000/m68kmmu.h2
-rw-r--r--src/devices/cpu/m68000/m68kmusashi.h23
-rw-r--r--src/devices/cpu/m68000/m68kops.cpp312
-rw-r--r--src/devices/cpu/m68000/m68kops.h1
-rw-r--r--src/devices/cpu/m68000/mcf5206e.cpp1378
-rw-r--r--src/devices/cpu/m68000/mcf5206e.h502
-rw-r--r--src/devices/cpu/m68000/scc68070.cpp30
-rw-r--r--src/devices/cpu/m68000/scc68070.h6
-rw-r--r--src/devices/cpu/m68000/tmp68301.cpp5
-rw-r--r--src/devices/cpu/m68000/tmp68301.h9
-rw-r--r--src/devices/cpu/m6805/hd6305.cpp639
-rw-r--r--src/devices/cpu/m6805/hd6305.h229
-rw-r--r--src/devices/cpu/m6805/m6805.cpp385
-rw-r--r--src/devices/cpu/m6805/m6805.h103
-rw-r--r--src/devices/cpu/m6805/m68705.cpp37
-rw-r--r--src/devices/cpu/m6805/m68705.h56
-rw-r--r--src/devices/cpu/m6805/m68hc05.cpp2
-rw-r--r--src/devices/cpu/m6805/m68hc05.h42
-rw-r--r--src/devices/cpu/m6805/m68hc05e1.h8
-rw-r--r--src/devices/cpu/m6805/m68hc05pge.cpp971
-rw-r--r--src/devices/cpu/m6805/m68hc05pge.h154
-rw-r--r--src/devices/cpu/m6809/6x09dasm.cpp220
-rw-r--r--src/devices/cpu/m6809/base6x09.lst38
-rw-r--r--src/devices/cpu/m6809/hd6309.cpp10
-rw-r--r--src/devices/cpu/m6809/hd6309.h4
-rw-r--r--src/devices/cpu/m6809/konami.cpp45
-rw-r--r--src/devices/cpu/m6809/konami.h2
-rw-r--r--src/devices/cpu/m6809/konami.lst107
-rw-r--r--src/devices/cpu/m6809/m6809.cpp15
-rw-r--r--src/devices/cpu/m6809/m6809.h22
-rw-r--r--src/devices/cpu/m6809/m6809.lst12
-rw-r--r--src/devices/cpu/m6809/m6809inl.h21
-rw-r--r--src/devices/cpu/m68hc16/cpu16.h4
-rw-r--r--src/devices/cpu/m68hc16/m68hc16z.h16
-rw-r--r--src/devices/cpu/m88000/m88000.cpp2
-rw-r--r--src/devices/cpu/m88000/m88000.h4
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp86
-rw-r--r--src/devices/cpu/mb86233/mb86233.h11
-rw-r--r--src/devices/cpu/mb86235/mb86235.cpp42
-rw-r--r--src/devices/cpu/mb86235/mb86235.h100
-rw-r--r--src/devices/cpu/mb86235/mb86235d.cpp134
-rw-r--r--src/devices/cpu/mb86235/mb86235defs.h21
-rw-r--r--src/devices/cpu/mb86235/mb86235drc.cpp202
-rw-r--r--src/devices/cpu/mb86235/mb86235fe.cpp524
-rw-r--r--src/devices/cpu/mb86235/mb86235fe.h170
-rw-r--r--src/devices/cpu/mb86235/mb86235ops.cpp1009
-rw-r--r--src/devices/cpu/mb88xx/mb88dasm.cpp1
-rw-r--r--src/devices/cpu/mb88xx/mb88dasm.h2
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.cpp150
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.h113
-rw-r--r--src/devices/cpu/mc68hc11/hc11ops.hxx30
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.cpp16
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.h17
-rw-r--r--src/devices/cpu/mcs40/mcs40.cpp42
-rw-r--r--src/devices/cpu/mcs40/mcs40.h8
-rw-r--r--src/devices/cpu/mcs48/mcs48.cpp567
-rw-r--r--src/devices/cpu/mcs48/mcs48.h207
-rw-r--r--src/devices/cpu/mcs48/mcs48dsm.cpp2
-rw-r--r--src/devices/cpu/mcs48/mcs48dsm.h9
-rw-r--r--src/devices/cpu/mcs51/ds5002fp.cpp391
-rw-r--r--src/devices/cpu/mcs51/ds5002fp.h118
-rw-r--r--src/devices/cpu/mcs51/i8051.cpp1379
-rw-r--r--src/devices/cpu/mcs51/i8051.h513
-rw-r--r--src/devices/cpu/mcs51/i8052.cpp182
-rw-r--r--src/devices/cpu/mcs51/i8052.h79
-rw-r--r--src/devices/cpu/mcs51/i80c51.cpp135
-rw-r--r--src/devices/cpu/mcs51/i80c51.h102
-rw-r--r--src/devices/cpu/mcs51/i80c52.cpp156
-rw-r--r--src/devices/cpu/mcs51/i80c52.h105
-rw-r--r--src/devices/cpu/mcs51/mcs51.cpp2800
-rw-r--r--src/devices/cpu/mcs51/mcs51.h647
-rw-r--r--src/devices/cpu/mcs51/mcs51dasm.cpp50
-rw-r--r--src/devices/cpu/mcs51/mcs51dasm.h26
-rw-r--r--src/devices/cpu/mcs51/mcs51ops.cpp1451
-rw-r--r--src/devices/cpu/mcs51/mcs51ops.hxx982
-rw-r--r--src/devices/cpu/mcs51/sab80c535.cpp130
-rw-r--r--src/devices/cpu/mcs51/sab80c535.h51
-rw-r--r--src/devices/cpu/mcs96/i8x9x.h7
-rw-r--r--src/devices/cpu/mcs96/i8xc196.h2
-rw-r--r--src/devices/cpu/mcs96/mcs96.h4
-rw-r--r--src/devices/cpu/mcs96/mcs96ops.lst4
-rw-r--r--src/devices/cpu/melps4/m58846.cpp2
-rw-r--r--src/devices/cpu/melps4/m58846.h8
-rw-r--r--src/devices/cpu/melps4/melps4.h5
-rw-r--r--src/devices/cpu/minx/minx.cpp41
-rw-r--r--src/devices/cpu/minx/minx.h13
-rw-r--r--src/devices/cpu/minx/minxd.h6
-rw-r--r--src/devices/cpu/minx/minxopce.h2
-rw-r--r--src/devices/cpu/mips/mips1.cpp277
-rw-r--r--src/devices/cpu/mips/mips1.h23
-rw-r--r--src/devices/cpu/mips/mips1dsm.cpp158
-rw-r--r--src/devices/cpu/mips/mips3.cpp256
-rw-r--r--src/devices/cpu/mips/mips3.h105
-rw-r--r--src/devices/cpu/mips/mips3com.cpp121
-rw-r--r--src/devices/cpu/mips/mips3com.h26
-rw-r--r--src/devices/cpu/mips/mips3drc.cpp422
-rw-r--r--src/devices/cpu/mips/mips3dsm.cpp204
-rw-r--r--src/devices/cpu/mips/mips3fe.cpp349
-rw-r--r--src/devices/cpu/mips/mips3fe.h118
-rw-r--r--src/devices/cpu/mips/ps2vif1.h4
-rw-r--r--src/devices/cpu/mips/ps2vu.h23
-rw-r--r--src/devices/cpu/mips/r4000.cpp9
-rw-r--r--src/devices/cpu/mips/r4000.h60
-rw-r--r--src/devices/cpu/mipsx/mipsx.cpp2
-rw-r--r--src/devices/cpu/mipsx/mipsx.h7
-rw-r--r--src/devices/cpu/mipsx/mipsxdasm.cpp159
-rw-r--r--src/devices/cpu/mk1/mk1.h4
-rw-r--r--src/devices/cpu/mn10200/mn10200.h7
-rw-r--r--src/devices/cpu/mn10300/mn103dasm.cpp929
-rw-r--r--src/devices/cpu/mn10300/mn103dasm.h42
-rw-r--r--src/devices/cpu/mn1400/mn1400.cpp3
-rw-r--r--src/devices/cpu/mn1400/mn1400base.h14
-rw-r--r--src/devices/cpu/mn1400/mn1400op.cpp2
-rw-r--r--src/devices/cpu/mn1880/mn1880.h6
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1.cpp1103
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1.h121
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1dasm.cpp445
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1dasm.h25
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor.h5
-rw-r--r--src/devices/cpu/nec/nec.cpp58
-rw-r--r--src/devices/cpu/nec/nec.h23
-rw-r--r--src/devices/cpu/nec/nec80inst.hxx36
-rw-r--r--src/devices/cpu/nec/necinstr.hxx382
-rw-r--r--src/devices/cpu/nec/necmacro.h333
-rw-r--r--src/devices/cpu/nec/necmodrm.h112
-rw-r--r--src/devices/cpu/nec/necpriv.ipp29
-rw-r--r--src/devices/cpu/nec/v25.cpp197
-rw-r--r--src/devices/cpu/nec/v25.h77
-rw-r--r--src/devices/cpu/nec/v25priv.ipp43
-rw-r--r--src/devices/cpu/nec/v25sfr.cpp221
-rw-r--r--src/devices/cpu/nec/v5x.cpp95
-rw-r--r--src/devices/cpu/nec/v5x.h77
-rw-r--r--src/devices/cpu/nios2/nios2.h4
-rw-r--r--src/devices/cpu/ns32000/common.h9
-rw-r--r--src/devices/cpu/ns32000/ns32000.cpp8
-rw-r--r--src/devices/cpu/ns32000/ns32000.h9
-rw-r--r--src/devices/cpu/nuon/nuon.h5
-rw-r--r--src/devices/cpu/olms66k/msm665xx.cpp3085
-rw-r--r--src/devices/cpu/olms66k/msm665xx.h108
-rw-r--r--src/devices/cpu/olms66k/nx8dasm.cpp150
-rw-r--r--src/devices/cpu/olms66k/nx8dasm.h10
-rw-r--r--src/devices/cpu/pace/pace.h4
-rw-r--r--src/devices/cpu/palm/palm.cpp2
-rw-r--r--src/devices/cpu/palm/palm.h5
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio.cpp9
-rw-r--r--src/devices/cpu/patinhofeio/patinhofeio_cpu.h12
-rw-r--r--src/devices/cpu/pdp1/pdp1.cpp37
-rw-r--r--src/devices/cpu/pdp1/pdp1.h39
-rw-r--r--src/devices/cpu/pdp8/hd6120.h4
-rw-r--r--src/devices/cpu/pdp8/pdp8.cpp11
-rw-r--r--src/devices/cpu/pdp8/pdp8.h15
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.h25
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.h21
-rw-r--r--src/devices/cpu/pic16x8x/pic16x8x.h15
-rw-r--r--src/devices/cpu/pic17/pic17.cpp1
-rw-r--r--src/devices/cpu/pic17/pic17.h8
-rw-r--r--src/devices/cpu/pic17/pic17c4x.h9
-rw-r--r--src/devices/cpu/powerpc/ppc.h72
-rw-r--r--src/devices/cpu/powerpc/ppc_dasm.h6
-rw-r--r--src/devices/cpu/powerpc/ppccom.cpp188
-rw-r--r--src/devices/cpu/powerpc/ppccom.h10
-rw-r--r--src/devices/cpu/powerpc/ppcdrc.cpp611
-rw-r--r--src/devices/cpu/powerpc/ppcfe.cpp1210
-rw-r--r--src/devices/cpu/powerpc/ppcfe.h155
-rw-r--r--src/devices/cpu/pps4/pps4.h9
-rw-r--r--src/devices/cpu/pps41/mm75.h2
-rw-r--r--src/devices/cpu/pps41/mm76.cpp3
-rw-r--r--src/devices/cpu/pps41/mm76.h12
-rw-r--r--src/devices/cpu/pps41/mm78.cpp3
-rw-r--r--src/devices/cpu/pps41/mm78.h14
-rw-r--r--src/devices/cpu/pps41/mm78la.h12
-rw-r--r--src/devices/cpu/pps41/pps41base.h5
-rw-r--r--src/devices/cpu/psx/dma.cpp356
-rw-r--r--src/devices/cpu/psx/dma.h5
-rw-r--r--src/devices/cpu/psx/irq.h4
-rw-r--r--src/devices/cpu/psx/mdec.h4
-rw-r--r--src/devices/cpu/psx/psx.h9
-rw-r--r--src/devices/cpu/psx/psxdasm.cpp125
-rw-r--r--src/devices/cpu/psx/rcnt.h4
-rw-r--r--src/devices/cpu/psx/sio.h2
-rw-r--r--src/devices/cpu/rii/riscii.cpp1
-rw-r--r--src/devices/cpu/rii/riscii.h8
-rw-r--r--src/devices/cpu/romp/romp.cpp8
-rw-r--r--src/devices/cpu/romp/romp.h180
-rw-r--r--src/devices/cpu/romp/rsc.h1
-rw-r--r--src/devices/cpu/rsp/rsp.cpp285
-rw-r--r--src/devices/cpu/rsp/rsp.h53
-rw-r--r--src/devices/cpu/rsp/rsp_dasm.cpp32
-rw-r--r--src/devices/cpu/rw5000/a5500.h4
-rw-r--r--src/devices/cpu/rw5000/a5900.h2
-rw-r--r--src/devices/cpu/rw5000/b5000.cpp3
-rw-r--r--src/devices/cpu/rw5000/b5000.h4
-rw-r--r--src/devices/cpu/rw5000/b6000.h4
-rw-r--r--src/devices/cpu/rw5000/b6100.h4
-rw-r--r--src/devices/cpu/rw5000/rw5000base.h4
-rw-r--r--src/devices/cpu/rx01/rx01.h4
-rw-r--r--src/devices/cpu/s2650/2650dasm.cpp105
-rw-r--r--src/devices/cpu/s2650/2650dasm.h7
-rw-r--r--src/devices/cpu/s2650/s2650.cpp1078
-rw-r--r--src/devices/cpu/s2650/s2650.h31
-rw-r--r--src/devices/cpu/s2650/s2650cpu.h33
-rw-r--r--src/devices/cpu/saturn/saturn.cpp10
-rw-r--r--src/devices/cpu/saturn/saturn.h5
-rw-r--r--src/devices/cpu/sc61860/sc61860.cpp2
-rw-r--r--src/devices/cpu/sc61860/sc61860.h7
-rw-r--r--src/devices/cpu/sc61860/scdasm.cpp19
-rw-r--r--src/devices/cpu/sc61860/scdasm.h2
-rw-r--r--src/devices/cpu/sc61860/scops.hxx7
-rw-r--r--src/devices/cpu/sc61860/sctable.hxx5
-rw-r--r--src/devices/cpu/scmp/scmp.cpp32
-rw-r--r--src/devices/cpu/scmp/scmp.h14
-rw-r--r--src/devices/cpu/score/score.h5
-rw-r--r--src/devices/cpu/scudsp/scudsp.cpp313
-rw-r--r--src/devices/cpu/scudsp/scudsp.h55
-rw-r--r--src/devices/cpu/se3208/se3208.cpp1331
-rw-r--r--src/devices/cpu/se3208/se3208.h244
-rw-r--r--src/devices/cpu/se3208/se3208dis.cpp954
-rw-r--r--src/devices/cpu/se3208/se3208dis.h158
-rw-r--r--src/devices/cpu/sh/sh.cpp301
-rw-r--r--src/devices/cpu/sh/sh.h65
-rw-r--r--src/devices/cpu/sh/sh2.cpp12
-rw-r--r--src/devices/cpu/sh/sh2.h24
-rw-r--r--src/devices/cpu/sh/sh2fe.cpp9
-rw-r--r--src/devices/cpu/sh/sh2fe.h28
-rw-r--r--src/devices/cpu/sh/sh3comn.cpp2404
-rw-r--r--src/devices/cpu/sh/sh3comn.h81
-rw-r--r--src/devices/cpu/sh/sh4.cpp2102
-rw-r--r--src/devices/cpu/sh/sh4.h1542
-rw-r--r--src/devices/cpu/sh/sh4comn.cpp2607
-rw-r--r--src/devices/cpu/sh/sh4comn.h10
-rw-r--r--src/devices/cpu/sh/sh4dmac.cpp330
-rw-r--r--src/devices/cpu/sh/sh4dmac.h35
-rw-r--r--src/devices/cpu/sh/sh4fe.cpp37
-rw-r--r--src/devices/cpu/sh/sh4fe.h36
-rw-r--r--src/devices/cpu/sh/sh4regs.h165
-rw-r--r--src/devices/cpu/sh/sh4tmu.cpp260
-rw-r--r--src/devices/cpu/sh/sh7014.h8
-rw-r--r--src/devices/cpu/sh/sh7014_bsc.h6
-rw-r--r--src/devices/cpu/sh/sh7014_dmac.h14
-rw-r--r--src/devices/cpu/sh/sh7014_intc.h6
-rw-r--r--src/devices/cpu/sh/sh7014_mtu.h16
-rw-r--r--src/devices/cpu/sh/sh7014_port.h4
-rw-r--r--src/devices/cpu/sh/sh7014_sci.h6
-rw-r--r--src/devices/cpu/sh/sh7021.h6
-rw-r--r--src/devices/cpu/sh/sh7032.h6
-rw-r--r--src/devices/cpu/sh/sh7042.h8
-rw-r--r--src/devices/cpu/sh/sh7604.cpp110
-rw-r--r--src/devices/cpu/sh/sh7604.h21
-rw-r--r--src/devices/cpu/sh/sh7604_bus.h6
-rw-r--r--src/devices/cpu/sh/sh7604_sci.h6
-rw-r--r--src/devices/cpu/sh/sh7604_wdt.h13
-rw-r--r--src/devices/cpu/sh/sh7709s.cpp558
-rw-r--r--src/devices/cpu/sh/sh7709s.h59
-rw-r--r--src/devices/cpu/sh/sh_adc.h4
-rw-r--r--src/devices/cpu/sh/sh_bsc.h4
-rw-r--r--src/devices/cpu/sh/sh_cmt.h4
-rw-r--r--src/devices/cpu/sh/sh_dasm.cpp2
-rw-r--r--src/devices/cpu/sh/sh_dasm.h6
-rw-r--r--src/devices/cpu/sh/sh_dmac.h8
-rw-r--r--src/devices/cpu/sh/sh_fe.cpp683
-rw-r--r--src/devices/cpu/sh/sh_fe.h129
-rw-r--r--src/devices/cpu/sh/sh_intc.h4
-rw-r--r--src/devices/cpu/sh/sh_mtu.cpp7
-rw-r--r--src/devices/cpu/sh/sh_mtu.h8
-rw-r--r--src/devices/cpu/sh/sh_port.h8
-rw-r--r--src/devices/cpu/sh/sh_sci.h4
-rw-r--r--src/devices/cpu/sharc/compute.hxx1752
-rw-r--r--src/devices/cpu/sharc/sharc.cpp1004
-rw-r--r--src/devices/cpu/sharc/sharc.h619
-rw-r--r--src/devices/cpu/sharc/sharc_dasm.cpp1256
-rw-r--r--src/devices/cpu/sharc/sharc_dasm.h66
-rw-r--r--src/devices/cpu/sharc/sharcdrc.cpp3518
-rw-r--r--src/devices/cpu/sharc/sharcdsm.cpp1251
-rw-r--r--src/devices/cpu/sharc/sharcdsm.h68
-rw-r--r--src/devices/cpu/sharc/sharcfe.cpp1410
-rw-r--r--src/devices/cpu/sharc/sharcfe.h254
-rw-r--r--src/devices/cpu/sharc/sharcinternal.ipp317
-rw-r--r--src/devices/cpu/sharc/sharcmem.hxx33
-rw-r--r--src/devices/cpu/sharc/sharcops.h134
-rw-r--r--src/devices/cpu/sharc/sharcops.hxx1468
-rw-r--r--src/devices/cpu/sharc/sharcops_table.cpp140
-rw-r--r--src/devices/cpu/sm510/sm500.cpp2
-rw-r--r--src/devices/cpu/sm510/sm500.h8
-rw-r--r--src/devices/cpu/sm510/sm500op.cpp3
-rw-r--r--src/devices/cpu/sm510/sm510.cpp2
-rw-r--r--src/devices/cpu/sm510/sm510.h4
-rw-r--r--src/devices/cpu/sm510/sm510base.cpp1
-rw-r--r--src/devices/cpu/sm510/sm510base.h5
-rw-r--r--src/devices/cpu/sm510/sm511.cpp2
-rw-r--r--src/devices/cpu/sm510/sm511.h8
-rw-r--r--src/devices/cpu/sm510/sm530.cpp2
-rw-r--r--src/devices/cpu/sm510/sm530.h8
-rw-r--r--src/devices/cpu/sm510/sm590.cpp2
-rw-r--r--src/devices/cpu/sm510/sm590.h16
-rw-r--r--src/devices/cpu/sm510/sm5a.cpp10
-rw-r--r--src/devices/cpu/sm510/sm5a.h11
-rw-r--r--src/devices/cpu/sm8500/sm8500.cpp5
-rw-r--r--src/devices/cpu/sm8500/sm8500.h5
-rw-r--r--src/devices/cpu/sonix16/sonix16.cpp708
-rw-r--r--src/devices/cpu/sonix16/sonix16.h106
-rw-r--r--src/devices/cpu/sonix16/sonix16d.cpp177
-rw-r--r--src/devices/cpu/sonix16/sonix16d.h42
-rw-r--r--src/devices/cpu/sparc/sparc.cpp26
-rw-r--r--src/devices/cpu/sparc/sparc.h31
-rw-r--r--src/devices/cpu/sparc/sparcdasm.h6
-rw-r--r--src/devices/cpu/sparc/sparcdefs.h8
-rw-r--r--src/devices/cpu/spc700/spc700.cpp1
-rw-r--r--src/devices/cpu/spc700/spc700.h5
-rw-r--r--src/devices/cpu/spc700/spc700ds.cpp1
-rw-r--r--src/devices/cpu/spc700/spc700ds.h9
-rw-r--r--src/devices/cpu/ssem/ssem.cpp11
-rw-r--r--src/devices/cpu/ssem/ssem.h7
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.h7
-rw-r--r--src/devices/cpu/ssp1601/ssp1601d.h6
-rw-r--r--src/devices/cpu/st62xx/st62xx.cpp5
-rw-r--r--src/devices/cpu/st62xx/st62xx.h15
-rw-r--r--src/devices/cpu/st62xx/st62xx_dasm.h6
-rw-r--r--src/devices/cpu/st9/st905x.h6
-rw-r--r--src/devices/cpu/st9/st9dasm.cpp4
-rw-r--r--src/devices/cpu/superfx/superfx.cpp1
-rw-r--r--src/devices/cpu/superfx/superfx.h5
-rw-r--r--src/devices/cpu/t11/t11.cpp312
-rw-r--r--src/devices/cpu/t11/t11.h65
-rw-r--r--src/devices/cpu/t11/t11dasm.cpp20
-rw-r--r--src/devices/cpu/t11/t11ops.hxx288
-rw-r--r--src/devices/cpu/t11/t11table.hxx64
-rw-r--r--src/devices/cpu/tlcs870/tlcs870.h7
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.cpp59
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.h147
-rw-r--r--src/devices/cpu/tlcs90/tlcs90d.cpp91
-rw-r--r--src/devices/cpu/tlcs90/tlcs90d.h36
-rw-r--r--src/devices/cpu/tlcs900/900tbl.hxx138
-rw-r--r--src/devices/cpu/tlcs900/dasm900.cpp379
-rw-r--r--src/devices/cpu/tlcs900/dasm900.h117
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.cpp43
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.h15
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241.cpp1709
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241.h300
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241_serial.cpp363
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241_serial.h95
-rw-r--r--src/devices/cpu/tlcs900/tmp95c061.cpp552
-rw-r--r--src/devices/cpu/tlcs900/tmp95c061.h131
-rw-r--r--src/devices/cpu/tlcs900/tmp95c063.cpp616
-rw-r--r--src/devices/cpu/tlcs900/tmp95c063.h170
-rw-r--r--src/devices/cpu/tlcs900/tmp96c141.cpp49
-rw-r--r--src/devices/cpu/tlcs900/tmp96c141.h9
-rw-r--r--src/devices/cpu/tms1000/smc1102.h5
-rw-r--r--src/devices/cpu/tms1000/tms0270.h6
-rw-r--r--src/devices/cpu/tms1000/tms0970.h6
-rw-r--r--src/devices/cpu/tms1000/tms0980.h8
-rw-r--r--src/devices/cpu/tms1000/tms1000.h10
-rw-r--r--src/devices/cpu/tms1000/tms1000c.h2
-rw-r--r--src/devices/cpu/tms1000/tms1100.h4
-rw-r--r--src/devices/cpu/tms1000/tms1400.h4
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.h16
-rw-r--r--src/devices/cpu/tms1000/tms2100.h7
-rw-r--r--src/devices/cpu/tms1000/tms2400.h2
-rw-r--r--src/devices/cpu/tms1000/tp0320.h6
-rw-r--r--src/devices/cpu/tms32010/32010dsm.cpp311
-rw-r--r--src/devices/cpu/tms32010/32010dsm.h59
-rw-r--r--src/devices/cpu/tms32010/dis32010.cpp136
-rw-r--r--src/devices/cpu/tms32010/tms32010.cpp1032
-rw-r--r--src/devices/cpu/tms32010/tms32010.h214
-rw-r--r--src/devices/cpu/tms32025/32025dsm.cpp479
-rw-r--r--src/devices/cpu/tms32025/32025dsm.h66
-rw-r--r--src/devices/cpu/tms32025/tms32025.cpp2128
-rw-r--r--src/devices/cpu/tms32025/tms32025.h408
-rw-r--r--src/devices/cpu/tms32031/32031ops.hxx6892
-rw-r--r--src/devices/cpu/tms32031/dis32031.cpp710
-rw-r--r--src/devices/cpu/tms32031/dis32031.h51
-rw-r--r--src/devices/cpu/tms32031/tms32031.cpp1064
-rw-r--r--src/devices/cpu/tms32031/tms32031.h850
-rw-r--r--src/devices/cpu/tms32051/32051ops.h253
-rw-r--r--src/devices/cpu/tms32051/32051ops.hxx1911
-rw-r--r--src/devices/cpu/tms32051/dis32051.cpp582
-rw-r--r--src/devices/cpu/tms32051/dis32051.h32
-rw-r--r--src/devices/cpu/tms32051/tms32051.cpp761
-rw-r--r--src/devices/cpu/tms32051/tms32051.h388
-rw-r--r--src/devices/cpu/tms32082/dis_mp.cpp496
-rw-r--r--src/devices/cpu/tms32082/dis_mp.h35
-rw-r--r--src/devices/cpu/tms32082/dis_pp.cpp902
-rw-r--r--src/devices/cpu/tms32082/dis_pp.h42
-rw-r--r--src/devices/cpu/tms32082/tms32082.cpp586
-rw-r--r--src/devices/cpu/tms32082/tms32082.h204
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x.cpp1029
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x.h213
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x_dasm.cpp309
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x_dasm.h41
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x.cpp2084
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x.h386
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x_dasm.cpp479
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x_dasm.h42
-rw-r--r--src/devices/cpu/tms320c3x/320c3x_ops.ipp6908
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x.cpp1065
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x.h855
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x_dasm.cpp709
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x_dasm.h51
-rw-r--r--src/devices/cpu/tms320c5x/320c5x_ops.ipp1911
-rw-r--r--src/devices/cpu/tms320c5x/320c5x_optable.cpp256
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x.cpp761
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x.h389
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x_dasm.cpp582
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x_dasm.h32
-rw-r--r--src/devices/cpu/tms320c82/mp_dasm.cpp496
-rw-r--r--src/devices/cpu/tms320c82/mp_dasm.h35
-rw-r--r--src/devices/cpu/tms320c82/mp_ops.cpp (renamed from src/devices/cpu/tms32082/mp_ops.cpp)28
-rw-r--r--src/devices/cpu/tms320c82/pp_dasm.cpp901
-rw-r--r--src/devices/cpu/tms320c82/pp_dasm.h42
-rw-r--r--src/devices/cpu/tms320c82/tms320c82.cpp588
-rw-r--r--src/devices/cpu/tms320c82/tms320c82.h204
-rw-r--r--src/devices/cpu/tms34010/34010ops.hxx40
-rw-r--r--src/devices/cpu/tms34010/tms34010.cpp5
-rw-r--r--src/devices/cpu/tms34010/tms34010.h13
-rw-r--r--src/devices/cpu/tms57002/tms57002.cpp28
-rw-r--r--src/devices/cpu/tms57002/tms57002.h9
-rw-r--r--src/devices/cpu/tms7000/7000dasm.cpp22
-rw-r--r--src/devices/cpu/tms7000/tms7000.h25
-rw-r--r--src/devices/cpu/tms9900/9900dasm.h6
-rw-r--r--src/devices/cpu/tms9900/ti990_10.cpp5
-rw-r--r--src/devices/cpu/tms9900/ti990_10.h7
-rw-r--r--src/devices/cpu/tms9900/tms9900.cpp9
-rw-r--r--src/devices/cpu/tms9900/tms9900.h1
-rw-r--r--src/devices/cpu/tms9900/tms9980a.cpp9
-rw-r--r--src/devices/cpu/tms9900/tms9980a.h3
-rw-r--r--src/devices/cpu/tms9900/tms9995.cpp5
-rw-r--r--src/devices/cpu/tms9900/tms9995.h7
-rw-r--r--src/devices/cpu/tms9900/tms99com.h9
-rw-r--r--src/devices/cpu/tx0/tx0.cpp4
-rw-r--r--src/devices/cpu/tx0/tx0.h4
-rw-r--r--src/devices/cpu/ucom4/ucom4.cpp2
-rw-r--r--src/devices/cpu/ucom4/ucom4.h13
-rw-r--r--src/devices/cpu/uml.cpp1606
-rw-r--r--src/devices/cpu/uml.h176
-rw-r--r--src/devices/cpu/unsp/unsp.cpp103
-rw-r--r--src/devices/cpu/unsp/unsp.h97
-rw-r--r--src/devices/cpu/unsp/unsp_exxx.cpp2
-rw-r--r--src/devices/cpu/unsp/unspdrc.cpp46
-rw-r--r--src/devices/cpu/unsp/unspfe.cpp214
-rw-r--r--src/devices/cpu/unsp/unspfe.h49
-rw-r--r--src/devices/cpu/upd177x/upd177x.cpp792
-rw-r--r--src/devices/cpu/upd177x/upd177x.h124
-rw-r--r--src/devices/cpu/upd177x/upd177xd.cpp24
-rw-r--r--src/devices/cpu/upd177x/upd177xd.h2
-rw-r--r--src/devices/cpu/upd7725/upd7725.cpp45
-rw-r--r--src/devices/cpu/upd7725/upd7725.h15
-rw-r--r--src/devices/cpu/upd777/upd777.cpp1262
-rw-r--r--src/devices/cpu/upd777/upd777.h165
-rw-r--r--src/devices/cpu/upd777/upd777dasm.cpp504
-rw-r--r--src/devices/cpu/upd777/upd777dasm.h34
-rw-r--r--src/devices/cpu/upd7810/upd7810.cpp159
-rw-r--r--src/devices/cpu/upd7810/upd7810.h41
-rw-r--r--src/devices/cpu/upd7810/upd7810_dasm.cpp238
-rw-r--r--src/devices/cpu/upd7810/upd7810_dasm.h6
-rw-r--r--src/devices/cpu/upd7810/upd7810_opcodes.cpp213
-rw-r--r--src/devices/cpu/upd78k/upd78k0.h10
-rw-r--r--src/devices/cpu/upd78k/upd78k2.h12
-rw-r--r--src/devices/cpu/upd78k/upd78k3.h10
-rw-r--r--src/devices/cpu/upd78k/upd78k4.h10
-rw-r--r--src/devices/cpu/v30mz/v30mz.cpp128
-rw-r--r--src/devices/cpu/v30mz/v30mz.h19
-rw-r--r--src/devices/cpu/v60/op12.hxx143
-rw-r--r--src/devices/cpu/v60/op2.hxx20
-rw-r--r--src/devices/cpu/v60/op3.hxx20
-rw-r--r--src/devices/cpu/v60/v60.cpp12
-rw-r--r--src/devices/cpu/v60/v60.h6
-rw-r--r--src/devices/cpu/v620/v620dasm.h6
-rw-r--r--src/devices/cpu/v810/v810.cpp12
-rw-r--r--src/devices/cpu/v810/v810.h5
-rw-r--r--src/devices/cpu/vax/vax.cpp100
-rw-r--r--src/devices/cpu/vax/vax.h82
-rw-r--r--src/devices/cpu/vax/vaxdasm.cpp50
-rw-r--r--src/devices/cpu/vax/vaxdasm.h14
-rw-r--r--src/devices/cpu/vt50/vt50.h4
-rw-r--r--src/devices/cpu/vt61/vt61.h4
-rw-r--r--src/devices/cpu/we32000/we32100.h4
-rw-r--r--src/devices/cpu/x86log.cpp239
-rw-r--r--src/devices/cpu/x86log.h207
-rw-r--r--src/devices/cpu/xa/xa.cpp3
-rw-r--r--src/devices/cpu/xa/xa.h17
-rw-r--r--src/devices/cpu/xa/xa_ops.cpp63
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp7
-rw-r--r--src/devices/cpu/xavix2/xavix2.h5
-rw-r--r--src/devices/cpu/xtensa/xtensa.h6
-rw-r--r--src/devices/cpu/z180/hd647180x.h6
-rw-r--r--src/devices/cpu/z180/z180.cpp30
-rw-r--r--src/devices/cpu/z180/z180.h15
-rw-r--r--src/devices/cpu/z180/z180asci.cpp12
-rw-r--r--src/devices/cpu/z180/z180asci.h8
-rw-r--r--src/devices/cpu/z180/z180csio.h6
-rw-r--r--src/devices/cpu/z180/z180dasm.cpp1
-rw-r--r--src/devices/cpu/z180/z180dasm.h1
-rw-r--r--src/devices/cpu/z180/z180dd.hxx3
-rw-r--r--src/devices/cpu/z180/z180op.hxx2
-rw-r--r--src/devices/cpu/z180/z180ops.h1
-rw-r--r--src/devices/cpu/z8/z8.cpp56
-rw-r--r--src/devices/cpu/z8/z8.h35
-rw-r--r--src/devices/cpu/z8/z8dasm.cpp2
-rw-r--r--src/devices/cpu/z80/kc82.cpp4
-rw-r--r--src/devices/cpu/z80/kc82.h4
-rw-r--r--src/devices/cpu/z80/kl5c80a12.h10
-rw-r--r--src/devices/cpu/z80/kl5c80a16.h8
-rw-r--r--src/devices/cpu/z80/kp63.h4
-rw-r--r--src/devices/cpu/z80/kp64.h4
-rw-r--r--src/devices/cpu/z80/kp69.h8
-rw-r--r--src/devices/cpu/z80/ky80.h4
-rw-r--r--src/devices/cpu/z80/lz8420m.h6
-rw-r--r--src/devices/cpu/z80/nsc800.cpp87
-rw-r--r--src/devices/cpu/z80/nsc800.h38
-rw-r--r--src/devices/cpu/z80/r800.cpp134
-rw-r--r--src/devices/cpu/z80/r800.h4
-rw-r--r--src/devices/cpu/z80/t6a84.cpp237
-rw-r--r--src/devices/cpu/z80/t6a84.h96
-rw-r--r--src/devices/cpu/z80/tmpz84c011.h8
-rw-r--r--src/devices/cpu/z80/tmpz84c015.cpp2
-rw-r--r--src/devices/cpu/z80/tmpz84c015.h6
-rw-r--r--src/devices/cpu/z80/z80.cpp651
-rw-r--r--src/devices/cpu/z80/z80.h180
-rw-r--r--src/devices/cpu/z80/z80.inc65
-rw-r--r--src/devices/cpu/z80/z80.lst5131
-rw-r--r--src/devices/cpu/z80/z80dasm.cpp6
-rw-r--r--src/devices/cpu/z80/z80make.py280
-rw-r--r--src/devices/cpu/z80/z80n.cpp8
-rw-r--r--src/devices/cpu/z80/z80n.h9
-rw-r--r--src/devices/cpu/z80/z84c015.cpp22
-rw-r--r--src/devices/cpu/z80/z84c015.h10
-rw-r--r--src/devices/cpu/z8000/z8000.cpp1
-rw-r--r--src/devices/cpu/z8000/z8000.h5
-rw-r--r--src/devices/imagedev/avivideo.h10
-rw-r--r--src/devices/imagedev/bitbngr.h10
-rw-r--r--src/devices/imagedev/cartrom.h6
-rw-r--r--src/devices/imagedev/cassette.cpp124
-rw-r--r--src/devices/imagedev/cassette.h18
-rw-r--r--src/devices/imagedev/cdromimg.cpp32
-rw-r--r--src/devices/imagedev/cdromimg.h10
-rw-r--r--src/devices/imagedev/diablo.h10
-rw-r--r--src/devices/imagedev/flopdrv.cpp175
-rw-r--r--src/devices/imagedev/flopdrv.h34
-rw-r--r--src/devices/imagedev/floppy.cpp1491
-rw-r--r--src/devices/imagedev/floppy.h308
-rw-r--r--src/devices/imagedev/harddriv.cpp2
-rw-r--r--src/devices/imagedev/harddriv.h10
-rw-r--r--src/devices/imagedev/magtape.h6
-rw-r--r--src/devices/imagedev/memcard.h6
-rw-r--r--src/devices/imagedev/mfmhd.h13
-rw-r--r--src/devices/imagedev/microdrv.h8
-rw-r--r--src/devices/imagedev/midiin.h6
-rw-r--r--src/devices/imagedev/midiout.h4
-rw-r--r--src/devices/imagedev/papertape.h6
-rw-r--r--src/devices/imagedev/picture.h8
-rw-r--r--src/devices/imagedev/printer.h8
-rw-r--r--src/devices/imagedev/simh_tape_image.h10
-rw-r--r--src/devices/imagedev/snapquik.cpp3
-rw-r--r--src/devices/imagedev/snapquik.h8
-rw-r--r--src/devices/imagedev/wafadrive.h12
-rw-r--r--src/devices/machine/1801vp128.cpp5
-rw-r--r--src/devices/machine/1801vp128.h6
-rw-r--r--src/devices/machine/1ma6.h6
-rw-r--r--src/devices/machine/1mb5.h4
-rw-r--r--src/devices/machine/2812fifo.cpp4
-rw-r--r--src/devices/machine/2812fifo.h7
-rw-r--r--src/devices/machine/28fxxx.h2
-rw-r--r--src/devices/machine/40105.h4
-rw-r--r--src/devices/machine/53c7xx.cpp70
-rw-r--r--src/devices/machine/53c7xx.h6
-rw-r--r--src/devices/machine/53c810.h2
-rw-r--r--src/devices/machine/64h156.h4
-rw-r--r--src/devices/machine/6522via.cpp30
-rw-r--r--src/devices/machine/6522via.h27
-rw-r--r--src/devices/machine/6525tpi.cpp28
-rw-r--r--src/devices/machine/6525tpi.h8
-rw-r--r--src/devices/machine/68153bim.h10
-rw-r--r--src/devices/machine/6821pia.h13
-rw-r--r--src/devices/machine/68230pit.h4
-rw-r--r--src/devices/machine/68307.h10
-rw-r--r--src/devices/machine/68307bus.h6
-rw-r--r--src/devices/machine/68340.cpp13
-rw-r--r--src/devices/machine/68340.h10
-rw-r--r--src/devices/machine/68340ser.cpp2
-rw-r--r--src/devices/machine/68340ser.h2
-rw-r--r--src/devices/machine/68340sim.cpp4
-rw-r--r--src/devices/machine/68340tmu.h4
-rw-r--r--src/devices/machine/6840ptm.h6
-rw-r--r--src/devices/machine/6850acia.h4
-rw-r--r--src/devices/machine/68561mpcc.h4
-rw-r--r--src/devices/machine/6883sam.h4
-rw-r--r--src/devices/machine/7200fifo.h4
-rw-r--r--src/devices/machine/7404.h4
-rw-r--r--src/devices/machine/74123.h4
-rw-r--r--src/devices/machine/74145.h4
-rw-r--r--src/devices/machine/74148.h8
-rw-r--r--src/devices/machine/74153.h10
-rw-r--r--src/devices/machine/74157.h2
-rw-r--r--src/devices/machine/74161.h4
-rw-r--r--src/devices/machine/74165.h12
-rw-r--r--src/devices/machine/74166.h12
-rw-r--r--src/devices/machine/74175.h8
-rw-r--r--src/devices/machine/74181.h2
-rw-r--r--src/devices/machine/74259.h4
-rw-r--r--src/devices/machine/74381.h4
-rw-r--r--src/devices/machine/74543.cpp2
-rw-r--r--src/devices/machine/74543.h4
-rw-r--r--src/devices/machine/74610.cpp212
-rw-r--r--src/devices/machine/74610.h110
-rw-r--r--src/devices/machine/7474.cpp14
-rw-r--r--src/devices/machine/7474.h12
-rw-r--r--src/devices/machine/8042kbdc.cpp12
-rw-r--r--src/devices/machine/8042kbdc.h6
-rw-r--r--src/devices/machine/82c100.cpp434
-rw-r--r--src/devices/machine/82c100.h146
-rw-r--r--src/devices/machine/82c606.cpp311
-rw-r--r--src/devices/machine/82c606.h105
-rw-r--r--src/devices/machine/82s129.h4
-rw-r--r--src/devices/machine/8364_paula.cpp385
-rw-r--r--src/devices/machine/8364_paula.h125
-rw-r--r--src/devices/machine/8530scc.cpp635
-rw-r--r--src/devices/machine/8530scc.h105
-rw-r--r--src/devices/machine/acorn_bmu.h2
-rw-r--r--src/devices/machine/acorn_ioc.h6
-rw-r--r--src/devices/machine/acorn_lc.h2
-rw-r--r--src/devices/machine/acorn_memc.h4
-rw-r--r--src/devices/machine/acorn_vidc.cpp25
-rw-r--r--src/devices/machine/acorn_vidc.h19
-rw-r--r--src/devices/machine/adc0804.h4
-rw-r--r--src/devices/machine/adc0808.h8
-rw-r--r--src/devices/machine/adc083x.h2
-rw-r--r--src/devices/machine/adc0844.h8
-rw-r--r--src/devices/machine/adc1038.h4
-rw-r--r--src/devices/machine/adc1213x.h4
-rw-r--r--src/devices/machine/aic565.h4
-rw-r--r--src/devices/machine/aic580.h6
-rw-r--r--src/devices/machine/aic6250.cpp86
-rw-r--r--src/devices/machine/aic6250.h8
-rw-r--r--src/devices/machine/aicartc.h4
-rw-r--r--src/devices/machine/alpha_8921.h4
-rw-r--r--src/devices/machine/am25s55x.h8
-rw-r--r--src/devices/machine/am2847.h4
-rw-r--r--src/devices/machine/am2901b.h4
-rw-r--r--src/devices/machine/am2910.h10
-rw-r--r--src/devices/machine/am79c30.h4
-rw-r--r--src/devices/machine/am79c90.cpp60
-rw-r--r--src/devices/machine/am79c90.h17
-rw-r--r--src/devices/machine/am9513.cpp19
-rw-r--r--src/devices/machine/am9513.h2
-rw-r--r--src/devices/machine/am9516.h4
-rw-r--r--src/devices/machine/am9517a.cpp19
-rw-r--r--src/devices/machine/am9517a.h20
-rw-r--r--src/devices/machine/am9519.h4
-rw-r--r--src/devices/machine/amiga_copper.cpp393
-rw-r--r--src/devices/machine/amiga_copper.h102
-rw-r--r--src/devices/machine/amigafdc.cpp702
-rw-r--r--src/devices/machine/amigafdc.h130
-rw-r--r--src/devices/machine/applefdintf.cpp15
-rw-r--r--src/devices/machine/applefdintf.h13
-rw-r--r--src/devices/machine/applepic.cpp80
-rw-r--r--src/devices/machine/applepic.h14
-rw-r--r--src/devices/machine/archimedes_keyb.h14
-rw-r--r--src/devices/machine/arm_iomd.cpp26
-rw-r--r--src/devices/machine/arm_iomd.h19
-rw-r--r--src/devices/machine/at.cpp1
-rw-r--r--src/devices/machine/at.h8
-rw-r--r--src/devices/machine/at28.cpp21
-rw-r--r--src/devices/machine/at28.h53
-rw-r--r--src/devices/machine/at28c16.cpp23
-rw-r--r--src/devices/machine/at28c16.h6
-rw-r--r--src/devices/machine/at28c64b.cpp271
-rw-r--r--src/devices/machine/at28c64b.h80
-rw-r--r--src/devices/machine/at45dbxx.h4
-rw-r--r--src/devices/machine/at_keybc.cpp27
-rw-r--r--src/devices/machine/at_keybc.h20
-rw-r--r--src/devices/machine/atahle.cpp609
-rw-r--r--src/devices/machine/atahle.h4
-rw-r--r--src/devices/machine/atastorage.cpp5
-rw-r--r--src/devices/machine/atastorage.h10
-rw-r--r--src/devices/machine/atmel_arm_aic.h6
-rw-r--r--src/devices/machine/ay31015.h4
-rw-r--r--src/devices/machine/ay34592.cpp236
-rw-r--r--src/devices/machine/ay34592.h81
-rw-r--r--src/devices/machine/bacta_datalogger.h4
-rw-r--r--src/devices/machine/bankdev.h16
-rw-r--r--src/devices/machine/bcreader.h8
-rw-r--r--src/devices/machine/bitmap_printer.cpp2
-rw-r--r--src/devices/machine/bitmap_printer.h8
-rw-r--r--src/devices/machine/bl_handhelds_menucontrol.h4
-rw-r--r--src/devices/machine/bq4847.cpp6
-rw-r--r--src/devices/machine/bq4847.h4
-rw-r--r--src/devices/machine/bq48x2.h2
-rw-r--r--src/devices/machine/buffer.h10
-rw-r--r--src/devices/machine/busmouse.cpp4
-rw-r--r--src/devices/machine/busmouse.h10
-rw-r--r--src/devices/machine/cammu.h38
-rw-r--r--src/devices/machine/cat702.h2
-rw-r--r--src/devices/machine/cdp1852.cpp36
-rw-r--r--src/devices/machine/cdp1852.h6
-rw-r--r--src/devices/machine/cdp1871.h2
-rw-r--r--src/devices/machine/cdp1879.h4
-rw-r--r--src/devices/machine/ch376.h2
-rw-r--r--src/devices/machine/chessmachine.cpp42
-rw-r--r--src/devices/machine/chessmachine.h20
-rw-r--r--src/devices/machine/clock.h2
-rw-r--r--src/devices/machine/com52c50.h6
-rw-r--r--src/devices/machine/com8116.h4
-rw-r--r--src/devices/machine/cop452.h4
-rw-r--r--src/devices/machine/corvushd.h2
-rw-r--r--src/devices/machine/cr511b.cpp753
-rw-r--r--src/devices/machine/cr511b.h139
-rw-r--r--src/devices/machine/cr560b.cpp969
-rw-r--r--src/devices/machine/cr560b.h148
-rw-r--r--src/devices/machine/cs4031.cpp50
-rw-r--r--src/devices/machine/cs4031.h98
-rw-r--r--src/devices/machine/cs8221.h6
-rw-r--r--src/devices/machine/cs8900a.cpp2
-rw-r--r--src/devices/machine/cs8900a.h4
-rw-r--r--src/devices/machine/cxd1095.h4
-rw-r--r--src/devices/machine/cxd1185.cpp116
-rw-r--r--src/devices/machine/cxd1185.h18
-rw-r--r--src/devices/machine/diablo_hd.h6
-rw-r--r--src/devices/machine/dimm_spd.h2
-rw-r--r--src/devices/machine/dl11.cpp237
-rw-r--r--src/devices/machine/dl11.h61
-rw-r--r--src/devices/machine/dmac.cpp647
-rw-r--r--src/devices/machine/dmac.h203
-rw-r--r--src/devices/machine/dp8390.cpp20
-rw-r--r--src/devices/machine/dp8390.h4
-rw-r--r--src/devices/machine/dp83932c.cpp32
-rw-r--r--src/devices/machine/dp83932c.h9
-rw-r--r--src/devices/machine/dp8573a.h8
-rw-r--r--src/devices/machine/ds1204.h2
-rw-r--r--src/devices/machine/ds1205.h2
-rw-r--r--src/devices/machine/ds1207.h4
-rw-r--r--src/devices/machine/ds1215.cpp340
-rw-r--r--src/devices/machine/ds1215.h77
-rw-r--r--src/devices/machine/ds1302.h2
-rw-r--r--src/devices/machine/ds1307.cpp66
-rw-r--r--src/devices/machine/ds1307.h36
-rw-r--r--src/devices/machine/ds1315.cpp305
-rw-r--r--src/devices/machine/ds1315.h65
-rw-r--r--src/devices/machine/ds1386.h2
-rw-r--r--src/devices/machine/ds17x85.h2
-rw-r--r--src/devices/machine/ds1994.h4
-rw-r--r--src/devices/machine/ds2401.h4
-rw-r--r--src/devices/machine/ds2404.h2
-rw-r--r--src/devices/machine/ds2430a.h4
-rw-r--r--src/devices/machine/ds6417.h4
-rw-r--r--src/devices/machine/ds75160a.h2
-rw-r--r--src/devices/machine/ds75161a.h2
-rw-r--r--src/devices/machine/e0516.h2
-rw-r--r--src/devices/machine/e05a03.h4
-rw-r--r--src/devices/machine/e05a30.h23
-rw-r--r--src/devices/machine/edlc.cpp22
-rw-r--r--src/devices/machine/edlc.h17
-rw-r--r--src/devices/machine/eeprom.h4
-rw-r--r--src/devices/machine/eeprom28.h535
-rw-r--r--src/devices/machine/eeprom28.ipp237
-rw-r--r--src/devices/machine/eeprompar.h8
-rw-r--r--src/devices/machine/eepromser.cpp62
-rw-r--r--src/devices/machine/eepromser.h13
-rw-r--r--src/devices/machine/elan_ep3a19a_soc.cpp191
-rw-r--r--src/devices/machine/elan_ep3a19a_soc.h74
-rw-r--r--src/devices/machine/elan_ep3a19asys.cpp (renamed from src/mame/tvgames/elan_ep3a19asys.cpp)13
-rw-r--r--src/devices/machine/elan_ep3a19asys.h38
-rw-r--r--src/devices/machine/elan_eu3a05_a.cpp (renamed from src/mame/tvgames/elan_eu3a05_a.cpp)12
-rw-r--r--src/devices/machine/elan_eu3a05_a.h (renamed from src/mame/tvgames/elan_eu3a05_a.h)14
-rw-r--r--src/devices/machine/elan_eu3a05_soc.cpp234
-rw-r--r--src/devices/machine/elan_eu3a05_soc.h98
-rw-r--r--src/devices/machine/elan_eu3a05commonsys.cpp (renamed from src/mame/tvgames/elan_eu3a05commonsys.cpp)41
-rw-r--r--src/devices/machine/elan_eu3a05commonsys.h71
-rw-r--r--src/devices/machine/elan_eu3a05commonvid.cpp (renamed from src/mame/tvgames/elan_eu3a05commonvid.cpp)7
-rw-r--r--src/devices/machine/elan_eu3a05commonvid.h36
-rw-r--r--src/devices/machine/elan_eu3a05gpio.cpp76
-rw-r--r--src/devices/machine/elan_eu3a05gpio.h41
-rw-r--r--src/devices/machine/elan_eu3a05sys.cpp108
-rw-r--r--src/devices/machine/elan_eu3a05sys.h45
-rw-r--r--src/devices/machine/elan_eu3a05vid.cpp (renamed from src/mame/tvgames/elan_eu3a05vid.cpp)150
-rw-r--r--src/devices/machine/elan_eu3a05vid.h113
-rw-r--r--src/devices/machine/elan_eu3a14_soc.cpp193
-rw-r--r--src/devices/machine/elan_eu3a14_soc.h104
-rw-r--r--src/devices/machine/elan_eu3a14sys.cpp (renamed from src/mame/tvgames/elan_eu3a14sys.cpp)10
-rw-r--r--src/devices/machine/elan_eu3a14sys.h37
-rw-r--r--src/devices/machine/elan_eu3a14vid.cpp (renamed from src/mame/tvgames/elan_eu3a14vid.cpp)117
-rw-r--r--src/devices/machine/elan_eu3a14vid.h101
-rw-r--r--src/devices/machine/em_reel.h2
-rw-r--r--src/devices/machine/er1400.h2
-rw-r--r--src/devices/machine/er2055.h2
-rw-r--r--src/devices/machine/exorterm.h12
-rw-r--r--src/devices/machine/f3853.h8
-rw-r--r--src/devices/machine/f4702.h2
-rw-r--r--src/devices/machine/f82c836.cpp514
-rw-r--r--src/devices/machine/f82c836.h243
-rw-r--r--src/devices/machine/fdc37c665gt.h8
-rw-r--r--src/devices/machine/fdc37c665ir.cpp452
-rw-r--r--src/devices/machine/fdc37c665ir.h113
-rw-r--r--src/devices/machine/fdc37c93x.cpp6
-rw-r--r--src/devices/machine/fdc37c93x.h20
-rw-r--r--src/devices/machine/fga002.h4
-rw-r--r--src/devices/machine/fm_scsi.h4
-rw-r--r--src/devices/machine/gen_fifo.h2
-rw-r--r--src/devices/machine/gen_latch.h8
-rw-r--r--src/devices/machine/generalplus_gpce4_soc.cpp1179
-rw-r--r--src/devices/machine/generalplus_gpce4_soc.h224
-rw-r--r--src/devices/machine/generalplus_gpl16250soc.cpp1856
-rw-r--r--src/devices/machine/generalplus_gpl16250soc.h485
-rw-r--r--src/devices/machine/generalplus_gpl16250soc_video.cpp1159
-rw-r--r--src/devices/machine/generalplus_gpl16250soc_video.h260
-rw-r--r--src/devices/machine/generalplus_gpl1625x_soc.cpp920
-rw-r--r--src/devices/machine/generalplus_gpl1625x_soc.h94
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc.cpp2016
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc.h384
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc_video.cpp1315
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc_video.h266
-rw-r--r--src/devices/machine/generalplus_gpl951xx_rtc.cpp253
-rw-r--r--src/devices/machine/generalplus_gpl951xx_rtc.h72
-rw-r--r--src/devices/machine/generalplus_gpl951xx_soc.cpp1890
-rw-r--r--src/devices/machine/generalplus_gpl951xx_soc.h347
-rw-r--r--src/devices/machine/generalplus_gpl_chx.cpp355
-rw-r--r--src/devices/machine/generalplus_gpl_chx.h69
-rw-r--r--src/devices/machine/generalplus_gpl_dma.cpp296
-rw-r--r--src/devices/machine/generalplus_gpl_dma.h54
-rw-r--r--src/devices/machine/generalplus_gpl_timebase.cpp131
-rw-r--r--src/devices/machine/generalplus_gpl_timebase.h53
-rw-r--r--src/devices/machine/generic_spi_flash.cpp550
-rw-r--r--src/devices/machine/generic_spi_flash.h102
-rw-r--r--src/devices/machine/genpc.cpp545
-rw-r--r--src/devices/machine/genpc.h177
-rw-r--r--src/devices/machine/gmboard.cpp413
-rw-r--r--src/devices/machine/gmboard.h87
-rw-r--r--src/devices/machine/gpl_renderer.cpp782
-rw-r--r--src/devices/machine/gpl_renderer.h106
-rw-r--r--src/devices/machine/gt64xxx.cpp2
-rw-r--r--src/devices/machine/gt64xxx.h10
-rw-r--r--src/devices/machine/gt913_io.h4
-rw-r--r--src/devices/machine/gt913_kbd.h4
-rw-r--r--src/devices/machine/gt913_snd.cpp8
-rw-r--r--src/devices/machine/gt913_snd.h12
-rw-r--r--src/devices/machine/hd63450.cpp212
-rw-r--r--src/devices/machine/hd63450.h38
-rw-r--r--src/devices/machine/hd64610.h2
-rw-r--r--src/devices/machine/hdc92x4.cpp20
-rw-r--r--src/devices/machine/hdc92x4.h4
-rw-r--r--src/devices/machine/hp_dc100_tape.h4
-rw-r--r--src/devices/machine/hp_taco.h6
-rw-r--r--src/devices/machine/i2cmem.cpp88
-rw-r--r--src/devices/machine/i2cmem.h4
-rw-r--r--src/devices/machine/i3001.h2
-rw-r--r--src/devices/machine/i3002.h2
-rw-r--r--src/devices/machine/i6300esb.h14
-rw-r--r--src/devices/machine/i7110.cpp3441
-rw-r--r--src/devices/machine/i7110.h767
-rw-r--r--src/devices/machine/i7220.h4
-rw-r--r--src/devices/machine/i80130.h12
-rw-r--r--src/devices/machine/i8087.cpp1082
-rw-r--r--src/devices/machine/i8087.h33
-rw-r--r--src/devices/machine/i8155.h4
-rw-r--r--src/devices/machine/i82091aa.cpp458
-rw-r--r--src/devices/machine/i82091aa.h95
-rw-r--r--src/devices/machine/i8212.h4
-rw-r--r--src/devices/machine/i8214.h2
-rw-r--r--src/devices/machine/i82355.h4
-rw-r--r--src/devices/machine/i82357.h8
-rw-r--r--src/devices/machine/i82371eb_acpi.cpp352
-rw-r--r--src/devices/machine/i82371eb_acpi.h50
-rw-r--r--src/devices/machine/i82371eb_ide.cpp4
-rw-r--r--src/devices/machine/i82371eb_isa.cpp312
-rw-r--r--src/devices/machine/i82371eb_isa.h43
-rw-r--r--src/devices/machine/i82371eb_usb.cpp144
-rw-r--r--src/devices/machine/i82371eb_usb.h21
-rw-r--r--src/devices/machine/i82371sb.cpp10
-rw-r--r--src/devices/machine/i82371sb.h27
-rw-r--r--src/devices/machine/i82425ex_psc.cpp447
-rw-r--r--src/devices/machine/i82425ex_psc.h96
-rw-r--r--src/devices/machine/i82426ex_ib.cpp349
-rw-r--r--src/devices/machine/i82426ex_ib.h101
-rw-r--r--src/devices/machine/i8243.h2
-rw-r--r--src/devices/machine/i82439hx.h6
-rw-r--r--src/devices/machine/i82439tx.h6
-rw-r--r--src/devices/machine/i82443bx_host.cpp10
-rw-r--r--src/devices/machine/i82443bx_host.h21
-rw-r--r--src/devices/machine/i8251.cpp284
-rw-r--r--src/devices/machine/i8251.h94
-rw-r--r--src/devices/machine/i82541.h10
-rw-r--r--src/devices/machine/i8255.cpp8
-rw-r--r--src/devices/machine/i8255.h4
-rw-r--r--src/devices/machine/i8256.cpp678
-rw-r--r--src/devices/machine/i8256.h127
-rw-r--r--src/devices/machine/i8257.cpp6
-rw-r--r--src/devices/machine/i8257.h6
-rw-r--r--src/devices/machine/i82586.cpp98
-rw-r--r--src/devices/machine/i82586.h13
-rw-r--r--src/devices/machine/i8271.h6
-rw-r--r--src/devices/machine/i8279.h4
-rw-r--r--src/devices/machine/i82875p.h18
-rw-r--r--src/devices/machine/i8291a.h6
-rw-r--r--src/devices/machine/i8355.h4
-rw-r--r--src/devices/machine/ibm21s850.h8
-rw-r--r--src/devices/machine/icd2053b.cpp179
-rw-r--r--src/devices/machine/icd2053b.h37
-rw-r--r--src/devices/machine/icd2061a.cpp2
-rw-r--r--src/devices/machine/icd2061a.h2
-rw-r--r--src/devices/machine/icm7170.h4
-rw-r--r--src/devices/machine/idectrl.h2
-rw-r--r--src/devices/machine/ie15.cpp10
-rw-r--r--src/devices/machine/ie15.h14
-rw-r--r--src/devices/machine/ie15_kbd.cpp16
-rw-r--r--src/devices/machine/ie15_kbd.h8
-rw-r--r--src/devices/machine/im6402.h4
-rw-r--r--src/devices/machine/input_merger.h5
-rw-r--r--src/devices/machine/ins8154.h4
-rw-r--r--src/devices/machine/ins8250.cpp6
-rw-r--r--src/devices/machine/ins8250.h10
-rw-r--r--src/devices/machine/intelfsh.cpp215
-rw-r--r--src/devices/machine/intelfsh.h53
-rw-r--r--src/devices/machine/iopcdvd.h4
-rw-r--r--src/devices/machine/iopdma.h4
-rw-r--r--src/devices/machine/iopintc.h4
-rw-r--r--src/devices/machine/iopsio2.h4
-rw-r--r--src/devices/machine/ioptimer.h4
-rw-r--r--src/devices/machine/it8671f.cpp1160
-rw-r--r--src/devices/machine/it8671f.h211
-rw-r--r--src/devices/machine/it8705f.cpp276
-rw-r--r--src/devices/machine/it8705f.h44
-rw-r--r--src/devices/machine/iwm.cpp29
-rw-r--r--src/devices/machine/iwm.h7
-rw-r--r--src/devices/machine/jvsdev.h4
-rw-r--r--src/devices/machine/jvshost.h4
-rw-r--r--src/devices/machine/k033906.cpp20
-rw-r--r--src/devices/machine/k033906.h15
-rw-r--r--src/devices/machine/k053252.cpp26
-rw-r--r--src/devices/machine/k053252.h6
-rw-r--r--src/devices/machine/k054321.h55
-rw-r--r--src/devices/machine/k056230.cpp2
-rw-r--r--src/devices/machine/k056230.h10
-rw-r--r--src/devices/machine/kb3600.h4
-rw-r--r--src/devices/machine/keyboard.cpp4
-rw-r--r--src/devices/machine/keyboard.h7
-rw-r--r--src/devices/machine/keytronic_l2207.cpp311
-rw-r--r--src/devices/machine/keytronic_l2207.h75
-rw-r--r--src/devices/machine/kr1601rr1.h4
-rw-r--r--src/devices/machine/kr2376.cpp33
-rw-r--r--src/devices/machine/kr2376.h28
-rw-r--r--src/devices/machine/laserdsc.cpp46
-rw-r--r--src/devices/machine/laserdsc.h15
-rw-r--r--src/devices/machine/latch8.h4
-rw-r--r--src/devices/machine/lc89510.cpp26
-rw-r--r--src/devices/machine/lc89510.h21
-rw-r--r--src/devices/machine/ldp1000.cpp4
-rw-r--r--src/devices/machine/ldp1000.h6
-rw-r--r--src/devices/machine/ldp1450.h6
-rw-r--r--src/devices/machine/ldp1450hle.cpp465
-rw-r--r--src/devices/machine/ldp1450hle.h34
-rw-r--r--src/devices/machine/ldpr8210.cpp68
-rw-r--r--src/devices/machine/ldpr8210.h26
-rw-r--r--src/devices/machine/ldv1000.h12
-rw-r--r--src/devices/machine/ldv1000hle.h4
-rw-r--r--src/devices/machine/ldv4200hle.h12
-rw-r--r--src/devices/machine/ldvp931.h10
-rw-r--r--src/devices/machine/legscsi.h2
-rw-r--r--src/devices/machine/lh5810.h4
-rw-r--r--src/devices/machine/lh79524_timer.cpp168
-rw-r--r--src/devices/machine/lh79524_timer.h49
-rw-r--r--src/devices/machine/locomo.h10
-rw-r--r--src/devices/machine/lpc-acpi.h6
-rw-r--r--src/devices/machine/lpc-pit.h6
-rw-r--r--src/devices/machine/lpc-rtc.h8
-rw-r--r--src/devices/machine/lpci.h4
-rw-r--r--src/devices/machine/m3002.h2
-rw-r--r--src/devices/machine/m68sfdc.cpp1
-rw-r--r--src/devices/machine/m68sfdc.h8
-rw-r--r--src/devices/machine/m6m80011ap.h4
-rw-r--r--src/devices/machine/m950x0.h4
-rw-r--r--src/devices/machine/m95320.cpp202
-rw-r--r--src/devices/machine/m95320.h59
-rw-r--r--src/devices/machine/macseconds.cpp55
-rw-r--r--src/devices/machine/macseconds.h23
-rw-r--r--src/devices/machine/mb14241.h4
-rw-r--r--src/devices/machine/mb3773.h4
-rw-r--r--src/devices/machine/mb87030.cpp192
-rw-r--r--src/devices/machine/mb87030.h27
-rw-r--r--src/devices/machine/mb87078.cpp179
-rw-r--r--src/devices/machine/mb87078.h51
-rw-r--r--src/devices/machine/mb8795.cpp407
-rw-r--r--src/devices/machine/mb8795.h110
-rw-r--r--src/devices/machine/mb89363b.h6
-rw-r--r--src/devices/machine/mb89371.cpp246
-rw-r--r--src/devices/machine/mb89371.h72
-rw-r--r--src/devices/machine/mb89374.h4
-rw-r--r--src/devices/machine/mc14411.h4
-rw-r--r--src/devices/machine/mc146818.cpp40
-rw-r--r--src/devices/machine/mc146818.h14
-rw-r--r--src/devices/machine/mc68328.cpp57
-rw-r--r--src/devices/machine/mc68328.h697
-rw-r--r--src/devices/machine/mc6843.cpp154
-rw-r--r--src/devices/machine/mc6843.h10
-rw-r--r--src/devices/machine/mc6844.h4
-rw-r--r--src/devices/machine/mc6846.h4
-rw-r--r--src/devices/machine/mc6852.cpp63
-rw-r--r--src/devices/machine/mc6852.h18
-rw-r--r--src/devices/machine/mc6854.h4
-rw-r--r--src/devices/machine/mc68681.cpp225
-rw-r--r--src/devices/machine/mc68681.h78
-rw-r--r--src/devices/machine/mc68901.h4
-rw-r--r--src/devices/machine/mc88200.h6
-rw-r--r--src/devices/machine/mccs1850.h4
-rw-r--r--src/devices/machine/mcf5206e.cpp1103
-rw-r--r--src/devices/machine/mcf5206e.h207
-rw-r--r--src/devices/machine/mdcr.cpp1
-rw-r--r--src/devices/machine/mdcr.h4
-rw-r--r--src/devices/machine/mediagx_cs5530_bridge.cpp5
-rw-r--r--src/devices/machine/mediagx_cs5530_bridge.h6
-rw-r--r--src/devices/machine/mediagx_cs5530_ide.cpp2
-rw-r--r--src/devices/machine/mediagx_cs5530_ide.h14
-rw-r--r--src/devices/machine/mediagx_cs5530_video.h14
-rw-r--r--src/devices/machine/mediagx_host.cpp2
-rw-r--r--src/devices/machine/mediagx_host.h20
-rw-r--r--src/devices/machine/meters.h4
-rw-r--r--src/devices/machine/micomxe1a.cpp4
-rw-r--r--src/devices/machine/micomxe1a.h1
-rw-r--r--src/devices/machine/microtch.cpp59
-rw-r--r--src/devices/machine/microtch.h24
-rw-r--r--src/devices/machine/mm5307.h4
-rw-r--r--src/devices/machine/mm5740.h4
-rw-r--r--src/devices/machine/mm58167.h4
-rw-r--r--src/devices/machine/mm58174.cpp189
-rw-r--r--src/devices/machine/mm58174.h36
-rw-r--r--src/devices/machine/mm58274c.h2
-rw-r--r--src/devices/machine/mm74c922.cpp14
-rw-r--r--src/devices/machine/mm74c922.h2
-rw-r--r--src/devices/machine/mos6526.cpp13
-rw-r--r--src/devices/machine/mos6526.h6
-rw-r--r--src/devices/machine/mos6529.h2
-rw-r--r--src/devices/machine/mos6530.h14
-rw-r--r--src/devices/machine/mos6551.cpp291
-rw-r--r--src/devices/machine/mos6551.h12
-rw-r--r--src/devices/machine/mos6702.h2
-rw-r--r--src/devices/machine/mos8706.h4
-rw-r--r--src/devices/machine/mos8722.h4
-rw-r--r--src/devices/machine/mos8726.h4
-rw-r--r--src/devices/machine/mpc106.h10
-rw-r--r--src/devices/machine/mpu401.h10
-rw-r--r--src/devices/machine/msm5001n.h6
-rw-r--r--src/devices/machine/msm5832.h2
-rw-r--r--src/devices/machine/msm58321.h2
-rw-r--r--src/devices/machine/msm6200.cpp30
-rw-r--r--src/devices/machine/msm6200.h10
-rw-r--r--src/devices/machine/msm6242.h4
-rw-r--r--src/devices/machine/msm6253.h2
-rw-r--r--src/devices/machine/mv6436x.h12
-rw-r--r--src/devices/machine/mv_sonora.cpp41
-rw-r--r--src/devices/machine/mv_sonora.h14
-rw-r--r--src/devices/machine/myb3k_kbd.h10
-rw-r--r--src/devices/machine/nandflash.h4
-rw-r--r--src/devices/machine/ncr5380.cpp69
-rw-r--r--src/devices/machine/ncr5380.h17
-rw-r--r--src/devices/machine/ncr5385.cpp59
-rw-r--r--src/devices/machine/ncr5385.h10
-rw-r--r--src/devices/machine/ncr53c90.cpp143
-rw-r--r--src/devices/machine/ncr53c90.h29
-rw-r--r--src/devices/machine/netlist.cpp64
-rw-r--r--src/devices/machine/netlist.h61
-rw-r--r--src/devices/machine/nmc9306.cpp19
-rw-r--r--src/devices/machine/nmc9306.h8
-rw-r--r--src/devices/machine/nmk112.cpp131
-rw-r--r--src/devices/machine/nmk112.h27
-rw-r--r--src/devices/machine/ns32081.cpp81
-rw-r--r--src/devices/machine/ns32081.h30
-rw-r--r--src/devices/machine/ns32082.h4
-rw-r--r--src/devices/machine/ns32202.h6
-rw-r--r--src/devices/machine/ns32382.h4
-rw-r--r--src/devices/machine/nsc810.cpp15
-rw-r--r--src/devices/machine/nsc810.h4
-rw-r--r--src/devices/machine/nscsi_bus.cpp959
-rw-r--r--src/devices/machine/nscsi_bus.h758
-rw-r--r--src/devices/machine/nscsi_cb.cpp9
-rw-r--r--src/devices/machine/nscsi_cb.h28
-rw-r--r--src/devices/machine/nscsi_hle.cpp810
-rw-r--r--src/devices/machine/nscsi_hle.h724
-rw-r--r--src/devices/machine/nvram.cpp9
-rw-r--r--src/devices/machine/nvram.h3
-rw-r--r--src/devices/machine/output_latch.h2
-rw-r--r--src/devices/machine/pc87306.cpp2
-rw-r--r--src/devices/machine/pc87306.h8
-rw-r--r--src/devices/machine/pc97338.cpp387
-rw-r--r--src/devices/machine/pc97338.h124
-rw-r--r--src/devices/machine/pc_fdc.h8
-rw-r--r--src/devices/machine/pc_lpt.cpp14
-rw-r--r--src/devices/machine/pc_lpt.h15
-rw-r--r--src/devices/machine/pcf8573.h2
-rw-r--r--src/devices/machine/pcf8583.h2
-rw-r--r--src/devices/machine/pcf8584.h4
-rw-r--r--src/devices/machine/pcf8593.h4
-rw-r--r--src/devices/machine/pcfx_intc.cpp163
-rw-r--r--src/devices/machine/pcfx_intc.h41
-rw-r--r--src/devices/machine/pci-apic.h4
-rw-r--r--src/devices/machine/pci-ide.h18
-rw-r--r--src/devices/machine/pci-sata.h16
-rw-r--r--src/devices/machine/pci-smbus.h6
-rw-r--r--src/devices/machine/pci-usb.cpp175
-rw-r--r--src/devices/machine/pci-usb.h33
-rw-r--r--src/devices/machine/pci.cpp24
-rw-r--r--src/devices/machine/pci.h35
-rw-r--r--src/devices/machine/pci9050.cpp3
-rw-r--r--src/devices/machine/pci9050.h6
-rw-r--r--src/devices/machine/pckeybrd.h12
-rw-r--r--src/devices/machine/pdc.cpp8
-rw-r--r--src/devices/machine/pdc.h16
-rw-r--r--src/devices/machine/pdp11.h4
-rw-r--r--src/devices/machine/phi.h4
-rw-r--r--src/devices/machine/pic8259.cpp13
-rw-r--r--src/devices/machine/pic8259.h4
-rw-r--r--src/devices/machine/pit8253.cpp81
-rw-r--r--src/devices/machine/pit8253.h22
-rw-r--r--src/devices/machine/pla.h2
-rw-r--r--src/devices/machine/ps2dma.h4
-rw-r--r--src/devices/machine/ps2intc.h4
-rw-r--r--src/devices/machine/ps2mc.h4
-rw-r--r--src/devices/machine/ps2pad.h4
-rw-r--r--src/devices/machine/ps2sif.h4
-rw-r--r--src/devices/machine/ps2timer.h4
-rw-r--r--src/devices/machine/pseudovia.cpp780
-rw-r--r--src/devices/machine/pseudovia.h120
-rw-r--r--src/devices/machine/psion_asic1.h4
-rw-r--r--src/devices/machine/psion_asic2.h4
-rw-r--r--src/devices/machine/psion_asic3.cpp5
-rw-r--r--src/devices/machine/psion_asic3.h4
-rw-r--r--src/devices/machine/psion_asic4.h4
-rw-r--r--src/devices/machine/psion_asic5.cpp5
-rw-r--r--src/devices/machine/psion_asic5.h6
-rw-r--r--src/devices/machine/psion_asic7.cpp175
-rw-r--r--src/devices/machine/psion_asic7.h72
-rw-r--r--src/devices/machine/psion_asic9.cpp198
-rw-r--r--src/devices/machine/psion_asic9.h27
-rw-r--r--src/devices/machine/psion_condor.h4
-rw-r--r--src/devices/machine/psion_ssd.cpp12
-rw-r--r--src/devices/machine/psion_ssd.h6
-rw-r--r--src/devices/machine/pxa255.cpp40
-rw-r--r--src/devices/machine/pxa255.h18
-rw-r--r--src/devices/machine/quadmouse.cpp128
-rw-r--r--src/devices/machine/quadmouse.h61
-rw-r--r--src/devices/machine/r10696.h4
-rw-r--r--src/devices/machine/r10788.h4
-rw-r--r--src/devices/machine/r65c52.h8
-rw-r--r--src/devices/machine/ra17xx.h4
-rw-r--r--src/devices/machine/ram.cpp8
-rw-r--r--src/devices/machine/ram.h27
-rw-r--r--src/devices/machine/rescap.h18
-rw-r--r--src/devices/machine/rf5c296.h2
-rw-r--r--src/devices/machine/ripple_counter.h2
-rw-r--r--src/devices/machine/rp5c01.h2
-rw-r--r--src/devices/machine/rp5c15.cpp15
-rw-r--r--src/devices/machine/rp5c15.h4
-rw-r--r--src/devices/machine/rp5h01.h4
-rw-r--r--src/devices/machine/rstbuf.h2
-rw-r--r--src/devices/machine/rtc4543.h4
-rw-r--r--src/devices/machine/rtc65271.h2
-rw-r--r--src/devices/machine/rtc9701.h4
-rw-r--r--src/devices/machine/s2350.cpp4
-rw-r--r--src/devices/machine/s2350.h5
-rw-r--r--src/devices/machine/s2636.cpp61
-rw-r--r--src/devices/machine/s2636.h16
-rw-r--r--src/devices/machine/s3520cf.h4
-rw-r--r--src/devices/machine/s3c2400.cpp4
-rw-r--r--src/devices/machine/s3c2400.h33
-rw-r--r--src/devices/machine/s3c2410.cpp4
-rw-r--r--src/devices/machine/s3c2410.h35
-rw-r--r--src/devices/machine/s3c2440.cpp4
-rw-r--r--src/devices/machine/s3c2440.h37
-rw-r--r--src/devices/machine/s3c24xx.hxx226
-rw-r--r--src/devices/machine/s3c44b0.cpp398
-rw-r--r--src/devices/machine/s3c44b0.h31
-rw-r--r--src/devices/machine/s_smp.h6
-rw-r--r--src/devices/machine/sa1110.cpp165
-rw-r--r--src/devices/machine/sa1110.h62
-rw-r--r--src/devices/machine/sa1111.h15
-rw-r--r--src/devices/machine/saa1043.cpp2
-rw-r--r--src/devices/machine/saa1043.h4
-rw-r--r--src/devices/machine/saa5070.h10
-rw-r--r--src/devices/machine/saa7191.h4
-rw-r--r--src/devices/machine/sc16is741.cpp1264
-rw-r--r--src/devices/machine/sc16is741.h132
-rw-r--r--src/devices/machine/scc2698b.h12
-rw-r--r--src/devices/machine/scc66470.h14
-rw-r--r--src/devices/machine/scc68070.h8
-rw-r--r--src/devices/machine/sci4.cpp2
-rw-r--r--src/devices/machine/sci4.h12
-rw-r--r--src/devices/machine/scn_pci.cpp55
-rw-r--r--src/devices/machine/scn_pci.h4
-rw-r--r--src/devices/machine/scnxx562.h10
-rw-r--r--src/devices/machine/scoop.h10
-rw-r--r--src/devices/machine/sda2006.h4
-rw-r--r--src/devices/machine/sdlc.cpp8
-rw-r--r--src/devices/machine/sdlc.h6
-rw-r--r--src/devices/machine/sega_md_ioport.cpp524
-rw-r--r--src/devices/machine/sega_md_ioport.h209
-rw-r--r--src/devices/machine/sega_scu.cpp791
-rw-r--r--src/devices/machine/sega_scu.h149
-rw-r--r--src/devices/machine/segacrp2_device.cpp15
-rw-r--r--src/devices/machine/segacrp2_device.h2
-rw-r--r--src/devices/machine/segacrpt_device.h11
-rw-r--r--src/devices/machine/sensorboard.cpp361
-rw-r--r--src/devices/machine/sensorboard.h24
-rw-r--r--src/devices/machine/sis5513_ide.cpp4
-rw-r--r--src/devices/machine/sis5513_ide.h20
-rw-r--r--src/devices/machine/sis630_gui.cpp10
-rw-r--r--src/devices/machine/sis630_gui.h40
-rw-r--r--src/devices/machine/sis630_host.cpp38
-rw-r--r--src/devices/machine/sis630_host.h13
-rw-r--r--src/devices/machine/sis7001_usb.cpp10
-rw-r--r--src/devices/machine/sis7001_usb.h10
-rw-r--r--src/devices/machine/sis7018_audio.cpp24
-rw-r--r--src/devices/machine/sis7018_audio.h14
-rw-r--r--src/devices/machine/sis85c496.cpp5
-rw-r--r--src/devices/machine/sis85c496.h16
-rw-r--r--src/devices/machine/sis900_eth.cpp2
-rw-r--r--src/devices/machine/sis900_eth.h14
-rw-r--r--src/devices/machine/sis950_acpi.cpp433
-rw-r--r--src/devices/machine/sis950_acpi.h97
-rw-r--r--src/devices/machine/sis950_lpc.cpp204
-rw-r--r--src/devices/machine/sis950_lpc.h47
-rw-r--r--src/devices/machine/sis950_smbus.cpp8
-rw-r--r--src/devices/machine/sis950_smbus.h6
-rw-r--r--src/devices/machine/smartboard.cpp7
-rw-r--r--src/devices/machine/smartboard.h6
-rw-r--r--src/devices/machine/smartmed.cpp39
-rw-r--r--src/devices/machine/smartmed.h8
-rw-r--r--src/devices/machine/smc91c9x.cpp9
-rw-r--r--src/devices/machine/smc91c9x.h4
-rw-r--r--src/devices/machine/smioc.cpp10
-rw-r--r--src/devices/machine/smioc.h10
-rw-r--r--src/devices/machine/spchrom.cpp139
-rw-r--r--src/devices/machine/spchrom.h43
-rw-r--r--src/devices/machine/spg110.cpp136
-rw-r--r--src/devices/machine/spg110.h12
-rw-r--r--src/devices/machine/spg110_video.cpp426
-rw-r--r--src/devices/machine/spg110_video.h107
-rw-r--r--src/devices/machine/spg290_cdservo.h4
-rw-r--r--src/devices/machine/spg290_i2c.h4
-rw-r--r--src/devices/machine/spg290_ppu.h6
-rw-r--r--src/devices/machine/spg290_timer.h4
-rw-r--r--src/devices/machine/spg2xx.cpp6
-rw-r--r--src/devices/machine/spg2xx.h8
-rw-r--r--src/devices/machine/spg2xx_audio.cpp11
-rw-r--r--src/devices/machine/spg2xx_audio.h10
-rw-r--r--src/devices/machine/spg2xx_io.h4
-rw-r--r--src/devices/machine/spg2xx_sysdma.h4
-rw-r--r--src/devices/machine/spg2xx_video.cpp16
-rw-r--r--src/devices/machine/spg2xx_video.h6
-rw-r--r--src/devices/machine/spg_renderer.cpp492
-rw-r--r--src/devices/machine/spg_renderer.h84
-rw-r--r--src/devices/machine/spi_psram.cpp427
-rw-r--r--src/devices/machine/spi_psram.h87
-rw-r--r--src/devices/machine/spi_sdcard.cpp487
-rw-r--r--src/devices/machine/spi_sdcard.h91
-rw-r--r--src/devices/machine/spifi3.cpp104
-rw-r--r--src/devices/machine/spifi3.h8
-rw-r--r--src/devices/machine/steppers.cpp23
-rw-r--r--src/devices/machine/steppers.h12
-rw-r--r--src/devices/machine/strata.h2
-rw-r--r--src/devices/machine/stvcd.cpp2817
-rw-r--r--src/devices/machine/stvcd.h280
-rw-r--r--src/devices/machine/sun1_mmu.cpp333
-rw-r--r--src/devices/machine/sun1_mmu.h73
-rw-r--r--src/devices/machine/sun4c_mmu.cpp2
-rw-r--r--src/devices/machine/sun4c_mmu.h12
-rw-r--r--src/devices/machine/swim1.cpp8
-rw-r--r--src/devices/machine/swim1.h4
-rw-r--r--src/devices/machine/swim2.h4
-rw-r--r--src/devices/machine/swim3.h4
-rw-r--r--src/devices/machine/swtpc8212.cpp32
-rw-r--r--src/devices/machine/swtpc8212.h12
-rw-r--r--src/devices/machine/t10mmc.cpp219
-rw-r--r--src/devices/machine/tc009xlvc.cpp2
-rw-r--r--src/devices/machine/tc009xlvc.h10
-rw-r--r--src/devices/machine/tc9223.h4
-rw-r--r--src/devices/machine/tdc1008.h10
-rw-r--r--src/devices/machine/te7750.h4
-rw-r--r--src/devices/machine/te7774.cpp233
-rwxr-xr-xsrc/devices/machine/te7774.h89
-rw-r--r--src/devices/machine/terminal.h8
-rw-r--r--src/devices/machine/thmfc1.cpp440
-rw-r--r--src/devices/machine/thmfc1.h106
-rw-r--r--src/devices/machine/ticket.cpp133
-rw-r--r--src/devices/machine/ticket.h64
-rw-r--r--src/devices/machine/timehelp.h8
-rw-r--r--src/devices/machine/timekpr.cpp35
-rw-r--r--src/devices/machine/timekpr.h17
-rw-r--r--src/devices/machine/timer.h4
-rw-r--r--src/devices/machine/tmc0430.h4
-rw-r--r--src/devices/machine/tmc0999.h2
-rw-r--r--src/devices/machine/tmc208k.h10
-rw-r--r--src/devices/machine/tms1024.cpp1
-rw-r--r--src/devices/machine/tms1024.h2
-rw-r--r--src/devices/machine/tms5501.h6
-rw-r--r--src/devices/machine/tms6100.h4
-rw-r--r--src/devices/machine/tms9901.h6
-rw-r--r--src/devices/machine/tms9914.cpp268
-rw-r--r--src/devices/machine/tms9914.h25
-rw-r--r--src/devices/machine/tsb12lv01a.h4
-rw-r--r--src/devices/machine/tube.h4
-rw-r--r--src/devices/machine/ucb1200.h10
-rw-r--r--src/devices/machine/um8498f.cpp496
-rw-r--r--src/devices/machine/um8498f.h245
-rw-r--r--src/devices/machine/upc82c710.h6
-rw-r--r--src/devices/machine/upc82c711.h6
-rw-r--r--src/devices/machine/upd1990a.h2
-rw-r--r--src/devices/machine/upd4701.h2
-rw-r--r--src/devices/machine/upd4991a.h2
-rw-r--r--src/devices/machine/upd4992.h2
-rw-r--r--src/devices/machine/upd7001.h2
-rw-r--r--src/devices/machine/upd7002.cpp17
-rw-r--r--src/devices/machine/upd7002.h38
-rw-r--r--src/devices/machine/upd7004.h8
-rw-r--r--src/devices/machine/upd71071.cpp31
-rw-r--r--src/devices/machine/upd71071.h2
-rw-r--r--src/devices/machine/upd7261.h6
-rw-r--r--src/devices/machine/upd765.cpp199
-rw-r--r--src/devices/machine/upd765.h63
-rw-r--r--src/devices/machine/v3021.h4
-rw-r--r--src/devices/machine/vic_pl192.h14
-rw-r--r--src/devices/machine/vl82c420.cpp595
-rw-r--r--src/devices/machine/vl82c420.h250
-rw-r--r--src/devices/machine/votraxtnt.cpp158
-rw-r--r--src/devices/machine/votraxtnt.h55
-rw-r--r--src/devices/machine/vr0uart.cpp57
-rw-r--r--src/devices/machine/vrc4373.h12
-rw-r--r--src/devices/machine/vrc5074.h14
-rw-r--r--src/devices/machine/vrender0.cpp347
-rw-r--r--src/devices/machine/vrender0.h218
-rw-r--r--src/devices/machine/vt8231_isa.h12
-rw-r--r--src/devices/machine/vt82c496.h4
-rw-r--r--src/devices/machine/vt82c586b_acpi.cpp1041
-rw-r--r--src/devices/machine/vt82c586b_acpi.h195
-rw-r--r--src/devices/machine/vt82c586b_ide.cpp399
-rw-r--r--src/devices/machine/vt82c586b_ide.h87
-rw-r--r--src/devices/machine/vt82c586b_isa.cpp996
-rw-r--r--src/devices/machine/vt82c586b_isa.h227
-rw-r--r--src/devices/machine/vt82c586b_usb.cpp109
-rw-r--r--src/devices/machine/vt82c586b_usb.h34
-rw-r--r--src/devices/machine/vt82c598mvp.cpp620
-rw-r--r--src/devices/machine/vt82c598mvp.h164
-rw-r--r--src/devices/machine/vt83c461.h2
-rw-r--r--src/devices/machine/w83787f.cpp2
-rw-r--r--src/devices/machine/w83787f.h8
-rw-r--r--src/devices/machine/w83877tf.cpp923
-rw-r--r--src/devices/machine/w83877tf.h167
-rw-r--r--src/devices/machine/w83977tf.cpp319
-rw-r--r--src/devices/machine/w83977tf.h40
-rw-r--r--src/devices/machine/watchdog.h4
-rw-r--r--src/devices/machine/wd1000.cpp50
-rw-r--r--src/devices/machine/wd1000.h5
-rw-r--r--src/devices/machine/wd1010.h4
-rw-r--r--src/devices/machine/wd11c00_17.h4
-rw-r--r--src/devices/machine/wd2010.cpp2
-rw-r--r--src/devices/machine/wd2010.h4
-rw-r--r--src/devices/machine/wd33c9x.cpp145
-rw-r--r--src/devices/machine/wd33c9x.h8
-rw-r--r--src/devices/machine/wd7600.cpp75
-rw-r--r--src/devices/machine/wd7600.h120
-rw-r--r--src/devices/machine/wd_fdc.cpp18
-rw-r--r--src/devices/machine/wd_fdc.h4
-rw-r--r--src/devices/machine/wozfdc.cpp9
-rw-r--r--src/devices/machine/wozfdc.h14
-rw-r--r--src/devices/machine/wtl3132.h4
-rw-r--r--src/devices/machine/x2201.h2
-rw-r--r--src/devices/machine/x2212.h2
-rw-r--r--src/devices/machine/x28.cpp23
-rw-r--r--src/devices/machine/x28.h65
-rw-r--r--src/devices/machine/x76f041.h4
-rw-r--r--src/devices/machine/x76f100.h4
-rw-r--r--src/devices/machine/xc1700e.h2
-rw-r--r--src/devices/machine/ym2148.h4
-rw-r--r--src/devices/machine/ym3802.h4
-rw-r--r--src/devices/machine/z8038.h6
-rw-r--r--src/devices/machine/z80ctc.h9
-rw-r--r--src/devices/machine/z80daisy_generic.h2
-rw-r--r--src/devices/machine/z80dma.cpp906
-rw-r--r--src/devices/machine/z80dma.h100
-rw-r--r--src/devices/machine/z80pio.h4
-rw-r--r--src/devices/machine/z80scc.cpp131
-rw-r--r--src/devices/machine/z80scc.h11
-rw-r--r--src/devices/machine/z80sio.cpp190
-rw-r--r--src/devices/machine/z80sio.h25
-rw-r--r--src/devices/machine/z80sti.h4
-rw-r--r--src/devices/machine/z8536.cpp473
-rw-r--r--src/devices/machine/z8536.h73
-rw-r--r--src/devices/machine/zfmicro_usb.cpp10
-rw-r--r--src/devices/machine/zfmicro_usb.h10
-rw-r--r--src/devices/sound/315-5641.h4
-rw-r--r--src/devices/sound/ac97_stac9704.cpp335
-rw-r--r--src/devices/sound/ac97_stac9704.h54
-rw-r--r--src/devices/sound/ad1848.cpp29
-rw-r--r--src/devices/sound/ad1848.h7
-rw-r--r--src/devices/sound/adc.cpp106
-rw-r--r--src/devices/sound/adc.h59
-rw-r--r--src/devices/sound/aica.cpp27
-rw-r--r--src/devices/sound/aica.h6
-rw-r--r--src/devices/sound/aicadsp.cpp32
-rw-r--r--src/devices/sound/aicadsp.h6
-rw-r--r--src/devices/sound/ap2010pcm.cpp11
-rw-r--r--src/devices/sound/ap2010pcm.h4
-rw-r--r--src/devices/sound/asc.cpp1640
-rw-r--r--src/devices/sound/asc.h213
-rw-r--r--src/devices/sound/astrocde.cpp11
-rw-r--r--src/devices/sound/astrocde.h6
-rw-r--r--src/devices/sound/awacs.cpp10
-rw-r--r--src/devices/sound/awacs.h6
-rw-r--r--src/devices/sound/ay8910.cpp80
-rw-r--r--src/devices/sound/ay8910.h19
-rw-r--r--src/devices/sound/bbd.cpp126
-rw-r--r--src/devices/sound/bbd.h42
-rw-r--r--src/devices/sound/beep.cpp13
-rw-r--r--src/devices/sound/beep.h6
-rw-r--r--src/devices/sound/bsmt2000.cpp12
-rw-r--r--src/devices/sound/bsmt2000.h18
-rw-r--r--src/devices/sound/c140.cpp55
-rw-r--r--src/devices/sound/c140.h10
-rw-r--r--src/devices/sound/c352.cpp190
-rw-r--r--src/devices/sound/c352.h15
-rw-r--r--src/devices/sound/c6280.cpp250
-rw-r--r--src/devices/sound/c6280.h7
-rw-r--r--src/devices/sound/cdda.cpp142
-rw-r--r--src/devices/sound/cdda.h13
-rw-r--r--src/devices/sound/cdp1863.cpp13
-rw-r--r--src/devices/sound/cdp1863.h6
-rw-r--r--src/devices/sound/cdp1864.cpp13
-rw-r--r--src/devices/sound/cdp1864.h8
-rw-r--r--src/devices/sound/cdp1869.cpp17
-rw-r--r--src/devices/sound/cdp1869.h16
-rw-r--r--src/devices/sound/cem3310.cpp188
-rw-r--r--src/devices/sound/cem3310.h77
-rw-r--r--src/devices/sound/cem3320.cpp141
-rw-r--r--src/devices/sound/cem3320.h68
-rw-r--r--src/devices/sound/cem3340.cpp265
-rw-r--r--src/devices/sound/cem3340.h74
-rw-r--r--src/devices/sound/cem3360.cpp19
-rw-r--r--src/devices/sound/cem3360.h37
-rw-r--r--src/devices/sound/cem3394.cpp391
-rw-r--r--src/devices/sound/cem3394.h54
-rw-r--r--src/devices/sound/cf61909.cpp6
-rw-r--r--src/devices/sound/cf61909.h8
-rw-r--r--src/devices/sound/ct1745.cpp335
-rw-r--r--src/devices/sound/ct1745.h69
-rw-r--r--src/devices/sound/dac.cpp41
-rw-r--r--src/devices/sound/dac.h39
-rw-r--r--src/devices/sound/dac3350a.cpp10
-rw-r--r--src/devices/sound/dac3350a.h6
-rw-r--r--src/devices/sound/dac76.cpp47
-rw-r--r--src/devices/sound/dac76.h66
-rw-r--r--src/devices/sound/digitalk.cpp22
-rw-r--r--src/devices/sound/digitalk.h4
-rw-r--r--src/devices/sound/disc_cls.h22
-rw-r--r--src/devices/sound/disc_inp.hxx45
-rw-r--r--src/devices/sound/discrete.cpp57
-rw-r--r--src/devices/sound/discrete.h53
-rw-r--r--src/devices/sound/dmadac.cpp14
-rw-r--r--src/devices/sound/dmadac.h12
-rw-r--r--src/devices/sound/dspv.cpp8
-rw-r--r--src/devices/sound/dspv.h15
-rw-r--r--src/devices/sound/es1373.cpp28
-rw-r--r--src/devices/sound/es1373.h12
-rw-r--r--src/devices/sound/es5503.cpp204
-rw-r--r--src/devices/sound/es5503.h20
-rw-r--r--src/devices/sound/es5506.cpp22
-rw-r--r--src/devices/sound/es5506.h20
-rw-r--r--src/devices/sound/es8712.h6
-rw-r--r--src/devices/sound/esqpump.cpp62
-rw-r--r--src/devices/sound/esqpump.h8
-rw-r--r--src/devices/sound/flt_biquad.cpp401
-rw-r--r--src/devices/sound/flt_biquad.h48
-rw-r--r--src/devices/sound/flt_rc.cpp22
-rw-r--r--src/devices/sound/flt_rc.h8
-rw-r--r--src/devices/sound/flt_vol.cpp6
-rw-r--r--src/devices/sound/flt_vol.h4
-rw-r--r--src/devices/sound/fz_pcm.cpp427
-rw-r--r--src/devices/sound/fz_pcm.h113
-rw-r--r--src/devices/sound/gaelco.cpp8
-rw-r--r--src/devices/sound/gaelco.h8
-rw-r--r--src/devices/sound/gb.cpp749
-rw-r--r--src/devices/sound/gb.h46
-rw-r--r--src/devices/sound/gew.cpp8
-rw-r--r--src/devices/sound/gew.h6
-rw-r--r--src/devices/sound/gew7.h2
-rw-r--r--src/devices/sound/gt155.cpp407
-rw-r--r--src/devices/sound/gt155.h103
-rw-r--r--src/devices/sound/hc55516.cpp213
-rw-r--r--src/devices/sound/hc55516.h29
-rw-r--r--src/devices/sound/huc6230.cpp12
-rw-r--r--src/devices/sound/huc6230.h6
-rw-r--r--src/devices/sound/i5000.cpp8
-rw-r--r--src/devices/sound/i5000.h6
-rw-r--r--src/devices/sound/ics2115.cpp227
-rw-r--r--src/devices/sound/ics2115.h23
-rw-r--r--src/devices/sound/iopspu.cpp3
-rw-r--r--src/devices/sound/iopspu.h12
-rw-r--r--src/devices/sound/iremga20.cpp11
-rw-r--r--src/devices/sound/iremga20.h6
-rw-r--r--src/devices/sound/k005289.cpp9
-rw-r--r--src/devices/sound/k005289.h4
-rw-r--r--src/devices/sound/k007232.cpp164
-rw-r--r--src/devices/sound/k007232.h21
-rw-r--r--src/devices/sound/k051649.cpp11
-rw-r--r--src/devices/sound/k051649.h8
-rw-r--r--src/devices/sound/k053260.cpp61
-rw-r--r--src/devices/sound/k053260.h20
-rw-r--r--src/devices/sound/k054321.cpp (renamed from src/devices/machine/k054321.cpp)26
-rw-r--r--src/devices/sound/k054321.h52
-rw-r--r--src/devices/sound/k054539.cpp247
-rw-r--r--src/devices/sound/k054539.h47
-rw-r--r--src/devices/sound/k056800.cpp2
-rw-r--r--src/devices/sound/k056800.h4
-rw-r--r--src/devices/sound/ks0164.cpp32
-rw-r--r--src/devices/sound/ks0164.h10
-rw-r--r--src/devices/sound/l4003.cpp383
-rw-r--r--src/devices/sound/l4003.h65
-rw-r--r--src/devices/sound/l7a1045_l6028_dsp_a.cpp776
-rw-r--r--src/devices/sound/l7a1045_l6028_dsp_a.h106
-rw-r--r--src/devices/sound/lc7535.cpp101
-rw-r--r--src/devices/sound/lc7535.h42
-rw-r--r--src/devices/sound/lc78836m.cpp13
-rw-r--r--src/devices/sound/lc78836m.h8
-rw-r--r--src/devices/sound/lc82310.cpp52
-rw-r--r--src/devices/sound/lc82310.h12
-rw-r--r--src/devices/sound/lmc1992.cpp3
-rw-r--r--src/devices/sound/lmc1992.h4
-rw-r--r--src/devices/sound/lynx.cpp19
-rw-r--r--src/devices/sound/lynx.h10
-rw-r--r--src/devices/sound/mas3507d.cpp25
-rw-r--r--src/devices/sound/mas3507d.h8
-rw-r--r--src/devices/sound/mb87077.cpp191
-rw-r--r--src/devices/sound/mb87077.h60
-rw-r--r--src/devices/sound/mea8000.cpp4
-rw-r--r--src/devices/sound/mea8000.h4
-rw-r--r--src/devices/sound/meg.h12
-rw-r--r--src/devices/sound/mixer.cpp2
-rw-r--r--src/devices/sound/mixer.h7
-rw-r--r--src/devices/sound/mm5837.cpp6
-rw-r--r--src/devices/sound/mm5837.h12
-rw-r--r--src/devices/sound/mmc5.cpp314
-rw-r--r--src/devices/sound/mmc5.h75
-rw-r--r--src/devices/sound/mos6560.cpp13
-rw-r--r--src/devices/sound/mos6560.h10
-rw-r--r--src/devices/sound/mos6581.cpp4
-rw-r--r--src/devices/sound/mos6581.h6
-rw-r--r--src/devices/sound/mos7360.cpp46
-rw-r--r--src/devices/sound/mos7360.h12
-rw-r--r--src/devices/sound/mpeg_audio.cpp294
-rw-r--r--src/devices/sound/mpeg_audio.h58
-rw-r--r--src/devices/sound/msm5205.cpp127
-rw-r--r--src/devices/sound/msm5205.h54
-rw-r--r--src/devices/sound/msm5232.cpp113
-rw-r--r--src/devices/sound/msm5232.h8
-rw-r--r--src/devices/sound/n63701x.cpp15
-rw-r--r--src/devices/sound/n63701x.h4
-rw-r--r--src/devices/sound/namco.cpp858
-rw-r--r--src/devices/sound/namco.h149
-rw-r--r--src/devices/sound/namco_163.cpp15
-rw-r--r--src/devices/sound/namco_163.h4
-rw-r--r--src/devices/sound/nes_apu.cpp16
-rw-r--r--src/devices/sound/nes_apu.h10
-rw-r--r--src/devices/sound/nes_apu_vt.h10
-rw-r--r--src/devices/sound/nes_defs.h74
-rw-r--r--src/devices/sound/nn71003f.cpp4
-rw-r--r--src/devices/sound/nn71003f.h12
-rw-r--r--src/devices/sound/okim6258.cpp12
-rw-r--r--src/devices/sound/okim6258.h6
-rw-r--r--src/devices/sound/okim6295.cpp50
-rw-r--r--src/devices/sound/okim6295.h12
-rw-r--r--src/devices/sound/okim6376.cpp105
-rw-r--r--src/devices/sound/okim6376.h6
-rw-r--r--src/devices/sound/okim6588.cpp4
-rw-r--r--src/devices/sound/okim6588.h6
-rw-r--r--src/devices/sound/okim9810.cpp26
-rw-r--r--src/devices/sound/okim9810.h8
-rw-r--r--src/devices/sound/pcd3311.cpp269
-rw-r--r--src/devices/sound/pcd3311.h44
-rw-r--r--src/devices/sound/pci-ac97.h12
-rw-r--r--src/devices/sound/pokey.cpp258
-rw-r--r--src/devices/sound/pokey.h29
-rw-r--r--src/devices/sound/qs1000.cpp38
-rw-r--r--src/devices/sound/qs1000.h16
-rw-r--r--src/devices/sound/qsound.cpp10
-rw-r--r--src/devices/sound/qsound.h15
-rw-r--r--src/devices/sound/qsoundhle.cpp47
-rw-r--r--src/devices/sound/qsoundhle.h10
-rw-r--r--src/devices/sound/rf5c400.cpp21
-rw-r--r--src/devices/sound/rf5c400.h4
-rw-r--r--src/devices/sound/rf5c68.cpp29
-rw-r--r--src/devices/sound/rf5c68.h8
-rw-r--r--src/devices/sound/roland_gp.cpp2
-rw-r--r--src/devices/sound/roland_gp.h6
-rw-r--r--src/devices/sound/roland_lp.cpp11
-rw-r--r--src/devices/sound/roland_lp.h6
-rw-r--r--src/devices/sound/roland_sa.cpp404
-rw-r--r--src/devices/sound/roland_sa.h59
-rw-r--r--src/devices/sound/rp2c33_snd.cpp10
-rw-r--r--src/devices/sound/rp2c33_snd.h19
-rw-r--r--src/devices/sound/s14001a.cpp269
-rw-r--r--src/devices/sound/s14001a.h89
-rw-r--r--src/devices/sound/s_dsp.cpp509
-rw-r--r--src/devices/sound/s_dsp.h40
-rw-r--r--src/devices/sound/saa1099.cpp13
-rw-r--r--src/devices/sound/saa1099.h4
-rw-r--r--src/devices/sound/samples.cpp68
-rw-r--r--src/devices/sound/samples.h13
-rw-r--r--src/devices/sound/sb0400.h6
-rw-r--r--src/devices/sound/scsp.cpp76
-rw-r--r--src/devices/sound/scsp.h8
-rw-r--r--src/devices/sound/segapcm.cpp12
-rw-r--r--src/devices/sound/segapcm.h10
-rw-r--r--src/devices/sound/setapcm.cpp11
-rw-r--r--src/devices/sound/setapcm.h4
-rw-r--r--src/devices/sound/sid.cpp10
-rw-r--r--src/devices/sound/sid.h2
-rw-r--r--src/devices/sound/sn76477.cpp8
-rw-r--r--src/devices/sound/sn76477.h6
-rw-r--r--src/devices/sound/sn76496.cpp231
-rw-r--r--src/devices/sound/sn76496.h68
-rw-r--r--src/devices/sound/snkwave.cpp44
-rw-r--r--src/devices/sound/snkwave.h4
-rw-r--r--src/devices/sound/sp0250.cpp20
-rw-r--r--src/devices/sound/sp0250.h6
-rw-r--r--src/devices/sound/sp0256.cpp13
-rw-r--r--src/devices/sound/sp0256.h6
-rw-r--r--src/devices/sound/spkrdev.cpp35
-rw-r--r--src/devices/sound/spkrdev.h11
-rw-r--r--src/devices/sound/spu.cpp13
-rw-r--r--src/devices/sound/spu.h8
-rw-r--r--src/devices/sound/ssi263hle.cpp4
-rw-r--r--src/devices/sound/ssi263hle.h8
-rw-r--r--src/devices/sound/st0016.cpp14
-rw-r--r--src/devices/sound/st0016.h4
-rw-r--r--src/devices/sound/stt_sa1.cpp11
-rw-r--r--src/devices/sound/stt_sa1.h6
-rw-r--r--src/devices/sound/swp00.cpp1791
-rw-r--r--src/devices/sound/swp00.h302
-rw-r--r--src/devices/sound/swp20.cpp4
-rw-r--r--src/devices/sound/swp20.h14
-rw-r--r--src/devices/sound/swp30.cpp4644
-rw-r--r--src/devices/sound/swp30.h553
-rw-r--r--src/devices/sound/swp30d.cpp172
-rw-r--r--src/devices/sound/swp30d.h39
-rw-r--r--src/devices/sound/swx00.cpp8
-rw-r--r--src/devices/sound/swx00.h16
-rw-r--r--src/devices/sound/t6721a.cpp3
-rw-r--r--src/devices/sound/t6721a.h4
-rw-r--r--src/devices/sound/t6w28.cpp21
-rw-r--r--src/devices/sound/t6w28.h4
-rw-r--r--src/devices/sound/ta7630.h2
-rw-r--r--src/devices/sound/tc8830f.cpp6
-rw-r--r--src/devices/sound/tc8830f.h4
-rw-r--r--src/devices/sound/tiaintf.cpp4
-rw-r--r--src/devices/sound/tiaintf.h6
-rw-r--r--src/devices/sound/tiasound.cpp10
-rw-r--r--src/devices/sound/tiasound.h2
-rw-r--r--src/devices/sound/tms3615.cpp17
-rw-r--r--src/devices/sound/tms3615.h4
-rw-r--r--src/devices/sound/tms3631.cpp103
-rw-r--r--src/devices/sound/tms3631.h48
-rw-r--r--src/devices/sound/tms36xx.cpp10
-rw-r--r--src/devices/sound/tms36xx.h4
-rw-r--r--src/devices/sound/tms5110.cpp126
-rw-r--r--src/devices/sound/tms5110.h21
-rw-r--r--src/devices/sound/tms5220.cpp379
-rw-r--r--src/devices/sound/tms5220.h36
-rw-r--r--src/devices/sound/tt5665.cpp45
-rw-r--r--src/devices/sound/tt5665.h10
-rw-r--r--src/devices/sound/uda1344.cpp18
-rw-r--r--src/devices/sound/uda1344.h10
-rw-r--r--src/devices/sound/upd1771.cpp547
-rw-r--r--src/devices/sound/upd1771.h78
-rw-r--r--src/devices/sound/upd65043gfu01.cpp249
-rw-r--r--src/devices/sound/upd65043gfu01.h56
-rw-r--r--src/devices/sound/upd7752.cpp3
-rw-r--r--src/devices/sound/upd7752.h10
-rw-r--r--src/devices/sound/upd7759.cpp16
-rw-r--r--src/devices/sound/upd7759.h12
-rw-r--r--src/devices/sound/upd931.cpp608
-rw-r--r--src/devices/sound/upd931.h154
-rw-r--r--src/devices/sound/upd933.cpp10
-rw-r--r--src/devices/sound/upd933.h6
-rw-r--r--src/devices/sound/upd934g.cpp54
-rw-r--r--src/devices/sound/upd934g.h21
-rw-r--r--src/devices/sound/va_eg.cpp362
-rw-r--r--src/devices/sound/va_eg.h192
-rw-r--r--src/devices/sound/va_ops.cpp133
-rw-r--r--src/devices/sound/va_ops.h119
-rw-r--r--src/devices/sound/va_vca.cpp328
-rw-r--r--src/devices/sound/va_vca.h241
-rw-r--r--src/devices/sound/va_vcf.cpp308
-rw-r--r--src/devices/sound/va_vcf.h107
-rw-r--r--src/devices/sound/vgm_visualizer.cpp22
-rw-r--r--src/devices/sound/vgm_visualizer.h16
-rw-r--r--src/devices/sound/vlm5030.cpp138
-rw-r--r--src/devices/sound/vlm5030.h18
-rw-r--r--src/devices/sound/votrax.cpp8
-rw-r--r--src/devices/sound/votrax.h12
-rw-r--r--src/devices/sound/vrc6.cpp13
-rw-r--r--src/devices/sound/vrc6.h6
-rw-r--r--src/devices/sound/vrender0.cpp334
-rw-r--r--src/devices/sound/vrender0.h66
-rw-r--r--src/devices/sound/wave.cpp73
-rw-r--r--src/devices/sound/wave.h48
-rw-r--r--src/devices/sound/x1_010.cpp28
-rw-r--r--src/devices/sound/x1_010.h4
-rw-r--r--src/devices/sound/xt446.cpp6
-rw-r--r--src/devices/sound/xt446.h20
-rw-r--r--src/devices/sound/ym2154.cpp14
-rw-r--r--src/devices/sound/ym2154.h6
-rw-r--r--src/devices/sound/ymf271.cpp85
-rw-r--r--src/devices/sound/ymf271.h6
-rw-r--r--src/devices/sound/ymfm_mame.h21
-rw-r--r--src/devices/sound/ymopl.cpp4
-rw-r--r--src/devices/sound/ymopl.h18
-rw-r--r--src/devices/sound/ymopn.h8
-rw-r--r--src/devices/sound/ymz280b.cpp18
-rw-r--r--src/devices/sound/ymz280b.h6
-rw-r--r--src/devices/sound/ymz770.cpp321
-rw-r--r--src/devices/sound/ymz770.h55
-rw-r--r--src/devices/sound/zsg2.cpp206
-rw-r--r--src/devices/sound/zsg2.h11
-rw-r--r--src/devices/video/315_5124.cpp8
-rw-r--r--src/devices/video/315_5124.h16
-rw-r--r--src/devices/video/315_5313.cpp54
-rw-r--r--src/devices/video/315_5313.h28
-rw-r--r--src/devices/video/82c425.cpp469
-rw-r--r--src/devices/video/82c425.h109
-rw-r--r--src/devices/video/am8052.h2
-rw-r--r--src/devices/video/ariel.cpp177
-rw-r--r--src/devices/video/ariel.h46
-rw-r--r--src/devices/video/ati_mach32.cpp64
-rw-r--r--src/devices/video/ati_mach32.h31
-rw-r--r--src/devices/video/ati_mach8.h8
-rw-r--r--src/devices/video/atirage.h26
-rw-r--r--src/devices/video/avgdvg.cpp8
-rw-r--r--src/devices/video/avgdvg.h10
-rw-r--r--src/devices/video/bt431.h20
-rw-r--r--src/devices/video/bt450.cpp99
-rw-r--r--src/devices/video/bt450.h37
-rw-r--r--src/devices/video/bt459.h6
-rw-r--r--src/devices/video/bt45x.cpp5
-rw-r--r--src/devices/video/bt45x.h47
-rw-r--r--src/devices/video/bt47x.cpp7
-rw-r--r--src/devices/video/bt47x.h20
-rw-r--r--src/devices/video/bt48x.cpp513
-rw-r--r--src/devices/video/bt48x.h115
-rw-r--r--src/devices/video/bufsprite.h2
-rw-r--r--src/devices/video/catseye.h4
-rw-r--r--src/devices/video/cdp1861.h4
-rw-r--r--src/devices/video/cdp1862.h4
-rw-r--r--src/devices/video/cesblit.h4
-rw-r--r--src/devices/video/crt9007.h6
-rw-r--r--src/devices/video/crt9021.h2
-rw-r--r--src/devices/video/crt9028.h4
-rw-r--r--src/devices/video/crt9212.h2
-rw-r--r--src/devices/video/crtc_ega.h4
-rw-r--r--src/devices/video/dl1416.cpp8
-rw-r--r--src/devices/video/dl1416.h12
-rw-r--r--src/devices/video/dm9368.cpp47
-rw-r--r--src/devices/video/dm9368.h12
-rw-r--r--src/devices/video/dp8350.h4
-rw-r--r--src/devices/video/dp8510.h4
-rw-r--r--src/devices/video/ds8874.h2
-rw-r--r--src/devices/video/ef9340_1.cpp39
-rw-r--r--src/devices/video/ef9340_1.h7
-rw-r--r--src/devices/video/ef9345.cpp626
-rw-r--r--src/devices/video/ef9345.h85
-rw-r--r--src/devices/video/ef9364.h6
-rw-r--r--src/devices/video/ef9365.h8
-rw-r--r--src/devices/video/ef9369.h4
-rw-r--r--src/devices/video/fixfreq.cpp2
-rw-r--r--src/devices/video/fixfreq.h6
-rw-r--r--src/devices/video/gb_lcd.h14
-rw-r--r--src/devices/video/gba_lcd.cpp11
-rw-r--r--src/devices/video/gba_lcd.h11
-rw-r--r--src/devices/video/gf4500.h4
-rw-r--r--src/devices/video/gf7600gs.h16
-rw-r--r--src/devices/video/hd44102.h4
-rw-r--r--src/devices/video/hd44352.cpp12
-rw-r--r--src/devices/video/hd44352.h4
-rw-r--r--src/devices/video/hd44780.cpp69
-rw-r--r--src/devices/video/hd44780.h42
-rw-r--r--src/devices/video/hd61202.h6
-rw-r--r--src/devices/video/hd61602.cpp206
-rw-r--r--src/devices/video/hd61602.h82
-rw-r--r--src/devices/video/hd61603.cpp3
-rw-r--r--src/devices/video/hd61603.h4
-rw-r--r--src/devices/video/hd61830.h8
-rw-r--r--src/devices/video/hd63484.cpp26
-rw-r--r--src/devices/video/hd63484.h8
-rw-r--r--src/devices/video/hd66421.h6
-rw-r--r--src/devices/video/hlcd0438.h2
-rw-r--r--src/devices/video/hlcd0488.h2
-rw-r--r--src/devices/video/hlcd0515.h2
-rw-r--r--src/devices/video/hlcd0538.cpp10
-rw-r--r--src/devices/video/hlcd0538.h19
-rw-r--r--src/devices/video/hp1ll3.h4
-rw-r--r--src/devices/video/huc6202.cpp264
-rw-r--r--src/devices/video/huc6202.h72
-rw-r--r--src/devices/video/huc6260.cpp194
-rw-r--r--src/devices/video/huc6260.h61
-rw-r--r--src/devices/video/huc6261.cpp268
-rw-r--r--src/devices/video/huc6261.h65
-rw-r--r--src/devices/video/huc6270.cpp730
-rw-r--r--src/devices/video/huc6270.h128
-rw-r--r--src/devices/video/huc6271.cpp36
-rw-r--r--src/devices/video/huc6271.h17
-rw-r--r--src/devices/video/huc6272.cpp447
-rw-r--r--src/devices/video/huc6272.h128
-rw-r--r--src/devices/video/i8244.cpp80
-rw-r--r--src/devices/video/i8244.h12
-rw-r--r--src/devices/video/i82730.h4
-rw-r--r--src/devices/video/i8275.h6
-rw-r--r--src/devices/video/ibm8514a.h4
-rw-r--r--src/devices/video/imagetek_i4100.cpp39
-rw-r--r--src/devices/video/imagetek_i4100.h35
-rw-r--r--src/devices/video/ims_cvc.h18
-rw-r--r--src/devices/video/jangou_blitter.h8
-rw-r--r--src/devices/video/k051316.cpp14
-rw-r--r--src/devices/video/k051316.h40
-rw-r--r--src/devices/video/k053936.cpp337
-rw-r--r--src/devices/video/k053936.h9
-rw-r--r--src/devices/video/ky3211_ky10510.cpp397
-rw-r--r--src/devices/video/ky3211_ky10510.h64
-rw-r--r--src/devices/video/lc7580.h2
-rw-r--r--src/devices/video/lc7985.h6
-rw-r--r--src/devices/video/m50458.h8
-rw-r--r--src/devices/video/mb86292.h8
-rw-r--r--src/devices/video/mb88303.cpp2
-rw-r--r--src/devices/video/mb88303.h4
-rw-r--r--src/devices/video/mb90082.h14
-rw-r--r--src/devices/video/mb_vcu.cpp483
-rw-r--r--src/devices/video/mb_vcu.h39
-rw-r--r--src/devices/video/mc68328lcd.h4
-rw-r--r--src/devices/video/mc6845.cpp12
-rw-r--r--src/devices/video/mc6845.h36
-rw-r--r--src/devices/video/mc6847.cpp231
-rw-r--r--src/devices/video/mc6847.h145
-rw-r--r--src/devices/video/md4330b.h2
-rw-r--r--src/devices/video/mm5445.h2
-rw-r--r--src/devices/video/mn1252.h4
-rw-r--r--src/devices/video/mos6566.h8
-rw-r--r--src/devices/video/mos8563.h10
-rw-r--r--src/devices/video/mr9735.cpp438
-rw-r--r--src/devices/video/mr9735.h149
-rw-r--r--src/devices/video/msm6222b.h4
-rw-r--r--src/devices/video/msm6255.h8
-rw-r--r--src/devices/video/nereid.h4
-rw-r--r--src/devices/video/nt7534.h4
-rw-r--r--src/devices/video/pc_vga.cpp356
-rw-r--r--src/devices/video/pc_vga.h43
-rw-r--r--src/devices/video/pc_vga_alliance.h19
-rw-r--r--src/devices/video/pc_vga_ati.cpp70
-rw-r--r--src/devices/video/pc_vga_ati.h17
-rw-r--r--src/devices/video/pc_vga_chips.cpp426
-rw-r--r--src/devices/video/pc_vga_chips.h63
-rw-r--r--src/devices/video/pc_vga_cirrus.cpp147
-rw-r--r--src/devices/video/pc_vga_cirrus.h43
-rw-r--r--src/devices/video/pc_vga_matrox.cpp12
-rw-r--r--src/devices/video/pc_vga_matrox.h15
-rw-r--r--src/devices/video/pc_vga_mediagx.h9
-rw-r--r--src/devices/video/pc_vga_nvidia.cpp2
-rw-r--r--src/devices/video/pc_vga_nvidia.h11
-rw-r--r--src/devices/video/pc_vga_oak.cpp2
-rw-r--r--src/devices/video/pc_vga_oak.h17
-rw-r--r--src/devices/video/pc_vga_paradise.cpp175
-rw-r--r--src/devices/video/pc_vga_paradise.h76
-rw-r--r--src/devices/video/pc_vga_s3.h16
-rw-r--r--src/devices/video/pc_vga_sis.cpp1650
-rw-r--r--src/devices/video/pc_vga_sis.h168
-rw-r--r--src/devices/video/pc_vga_trident.cpp6
-rw-r--r--src/devices/video/pc_vga_trident.h26
-rw-r--r--src/devices/video/pc_vga_tseng.cpp479
-rw-r--r--src/devices/video/pc_vga_tseng.h85
-rw-r--r--src/devices/video/pc_vga_video7.cpp109
-rw-r--r--src/devices/video/pc_vga_video7.h40
-rw-r--r--src/devices/video/pc_xga.h4
-rw-r--r--src/devices/video/pcd8544.h4
-rw-r--r--src/devices/video/pcf2100.h2
-rw-r--r--src/devices/video/poly.h52
-rw-r--r--src/devices/video/ppu2c0x.cpp320
-rw-r--r--src/devices/video/ppu2c0x.h194
-rw-r--r--src/devices/video/ppu2c0x_sh6578.cpp56
-rw-r--r--src/devices/video/ppu2c0x_sh6578.h30
-rw-r--r--src/devices/video/ppu2c0x_vt.cpp1223
-rw-r--r--src/devices/video/ppu2c0x_vt.h217
-rw-r--r--src/devices/video/ps2gif.h4
-rw-r--r--src/devices/video/ps2gs.h6
-rw-r--r--src/devices/video/psx.cpp15
-rw-r--r--src/devices/video/psx.h6
-rw-r--r--src/devices/video/pwm.h4
-rw-r--r--src/devices/video/ramdac.h6
-rw-r--r--src/devices/video/roc10937.cpp (renamed from src/devices/machine/roc10937.cpp)0
-rw-r--r--src/devices/video/roc10937.h (renamed from src/devices/machine/roc10937.h)11
-rw-r--r--src/devices/video/s3virge.cpp69
-rw-r--r--src/devices/video/s3virge.h55
-rw-r--r--src/devices/video/saa5050.cpp82
-rw-r--r--src/devices/video/saa5050.h40
-rw-r--r--src/devices/video/saa5240.cpp444
-rw-r--r--src/devices/video/saa5240.h52
-rw-r--r--src/devices/video/saa7110.cpp177
-rw-r--r--src/devices/video/saa7110.h46
-rw-r--r--src/devices/video/scn2674.h6
-rw-r--r--src/devices/video/sda5708.h4
-rw-r--r--src/devices/video/sed1200.h10
-rw-r--r--src/devices/video/sed1330.h8
-rw-r--r--src/devices/video/sed1356.cpp2
-rw-r--r--src/devices/video/sed1356.h8
-rw-r--r--src/devices/video/sed1375.h6
-rw-r--r--src/devices/video/sed1500.h2
-rw-r--r--src/devices/video/sed1520.cpp72
-rw-r--r--src/devices/video/sed1520.h40
-rw-r--r--src/devices/video/sn74s262.h6
-rw-r--r--src/devices/video/snes_ppu.h4
-rw-r--r--src/devices/video/sprite.cpp70
-rw-r--r--src/devices/video/sprite.h80
-rw-r--r--src/devices/video/st7626.cpp55
-rw-r--r--src/devices/video/st7626.h33
-rw-r--r--src/devices/video/st7735_lcdc.cpp362
-rw-r--r--src/devices/video/st7735_lcdc.h38
-rw-r--r--src/devices/video/t6963c.h12
-rw-r--r--src/devices/video/t6a04.h4
-rw-r--r--src/devices/video/tea1002.cpp22
-rw-r--r--src/devices/video/tea1002.h13
-rw-r--r--src/devices/video/tlc34076.h4
-rw-r--r--src/devices/video/tmap038.cpp6
-rw-r--r--src/devices/video/tmap038.h14
-rw-r--r--src/devices/video/tms34061.h4
-rw-r--r--src/devices/video/tms3556.h4
-rw-r--r--src/devices/video/tms9927.h6
-rw-r--r--src/devices/video/tms9928a.h6
-rw-r--r--src/devices/video/topcat.h6
-rw-r--r--src/devices/video/upd3301.h4
-rw-r--r--src/devices/video/upd72120.cpp632
-rw-r--r--src/devices/video/upd72120.h124
-rw-r--r--src/devices/video/upd7220.cpp781
-rw-r--r--src/devices/video/upd7220.h104
-rw-r--r--src/devices/video/upd7227.h6
-rw-r--r--src/devices/video/v9938.h6
-rw-r--r--src/devices/video/vector.cpp124
-rw-r--r--src/devices/video/vector.h43
-rw-r--r--src/devices/video/vic4567.cpp1998
-rw-r--r--src/devices/video/vic4567.h241
-rw-r--r--src/devices/video/voodoo.h10
-rw-r--r--src/devices/video/voodoo_2.h4
-rw-r--r--src/devices/video/voodoo_banshee.h10
-rw-r--r--src/devices/video/voodoo_pci.cpp42
-rw-r--r--src/devices/video/voodoo_pci.h52
-rw-r--r--src/devices/video/vrender0.cpp774
-rw-r--r--src/devices/video/vrender0.h173
-rw-r--r--src/devices/video/wd90c26.cpp64
-rw-r--r--src/devices/video/wd90c26.h18
-rw-r--r--src/devices/video/x1_001.h4
-rw-r--r--src/devices/video/x1_020_dx_101.cpp987
-rw-r--r--src/devices/video/x1_020_dx_101.h67
-rw-r--r--src/devices/video/ym7101.cpp1264
-rw-r--r--src/devices/video/ym7101.h208
-rw-r--r--src/devices/video/zeus2.cpp14
-rw-r--r--src/devices/video/zeus2.h17
-rw-r--r--src/devices/video/zr36060.cpp677
-rw-r--r--src/devices/video/zr36060.h108
-rw-r--r--src/devices/video/zr36110.h11
-rw-r--r--src/emu/addrmap.cpp14
-rw-r--r--src/emu/addrmap.h24
-rw-r--r--src/emu/attotime.cpp29
-rw-r--r--src/emu/audio_effects/aeffect.cpp49
-rw-r--r--src/emu/audio_effects/aeffect.h47
-rw-r--r--src/emu/audio_effects/compressor.cpp456
-rw-r--r--src/emu/audio_effects/compressor.h119
-rw-r--r--src/emu/audio_effects/eq.cpp353
-rw-r--r--src/emu/audio_effects/eq.h88
-rw-r--r--src/emu/audio_effects/filter.cpp271
-rw-r--r--src/emu/audio_effects/filter.h82
-rw-r--r--src/emu/audio_effects/reverb.cpp1868
-rw-r--r--src/emu/audio_effects/reverb.h442
-rw-r--r--src/emu/bookkeeping.cpp45
-rw-r--r--src/emu/bookkeeping.h11
-rw-r--r--src/emu/crsshair.cpp1
-rw-r--r--src/emu/debug/debugbuf.cpp117
-rw-r--r--src/emu/debug/debugbuf.h6
-rw-r--r--src/emu/debug/debugcmd.cpp1373
-rw-r--r--src/emu/debug/debugcmd.h9
-rw-r--r--src/emu/debug/debugcon.cpp119
-rw-r--r--src/emu/debug/debugcon.h11
-rw-r--r--src/emu/debug/debugcpu.cpp281
-rw-r--r--src/emu/debug/debugcpu.h7
-rw-r--r--src/emu/debug/debughlp.cpp74
-rw-r--r--src/emu/debug/debugvw.cpp30
-rw-r--r--src/emu/debug/debugvw.h7
-rw-r--r--src/emu/debug/dvbpoints.cpp7
-rw-r--r--src/emu/debug/dvbpoints.h1
-rw-r--r--src/emu/debug/dvdisasm.cpp75
-rw-r--r--src/emu/debug/dvdisasm.h17
-rw-r--r--src/emu/debug/dvepoints.cpp316
-rw-r--r--src/emu/debug/dvepoints.h49
-rw-r--r--src/emu/debug/dvmemory.cpp127
-rw-r--r--src/emu/debug/dvmemory.h6
-rw-r--r--src/emu/debug/dvrpoints.cpp6
-rw-r--r--src/emu/debug/dvrpoints.h1
-rw-r--r--src/emu/debug/dvstate.cpp18
-rw-r--r--src/emu/debug/dvwpoints.cpp5
-rw-r--r--src/emu/debug/dvwpoints.h1
-rw-r--r--src/emu/debug/express.cpp157
-rw-r--r--src/emu/debug/express.h20
-rw-r--r--src/emu/debug/points.cpp15
-rw-r--r--src/emu/debug/points.h1
-rw-r--r--src/emu/devcb.h12
-rw-r--r--src/emu/devcpu.cpp28
-rw-r--r--src/emu/devcpu.h4
-rw-r--r--src/emu/device.cpp34
-rw-r--r--src/emu/device.h142
-rw-r--r--src/emu/diexec.cpp70
-rw-r--r--src/emu/diexec.h15
-rw-r--r--src/emu/digfx.cpp38
-rw-r--r--src/emu/digfx.h14
-rw-r--r--src/emu/diimage.cpp20
-rw-r--r--src/emu/dimemory.cpp18
-rw-r--r--src/emu/dimemory.h7
-rw-r--r--src/emu/dinetwork.cpp28
-rw-r--r--src/emu/dinetwork.h6
-rw-r--r--src/emu/dipalette.cpp71
-rw-r--r--src/emu/dipalette.h64
-rw-r--r--src/emu/dirom.h3
-rw-r--r--src/emu/dirtc.h2
-rw-r--r--src/emu/diserial.cpp150
-rw-r--r--src/emu/diserial.h10
-rw-r--r--src/emu/dislot.cpp131
-rw-r--r--src/emu/dislot.h96
-rw-r--r--src/emu/disound.cpp457
-rw-r--r--src/emu/disound.h72
-rw-r--r--src/emu/drawgfx.cpp96
-rw-r--r--src/emu/drawgfx.h78
-rw-r--r--src/emu/drawgfxt.ipp23
-rw-r--r--src/emu/driver.h8
-rw-r--r--src/emu/drivers/testcpu.cpp2
-rw-r--r--src/emu/emufwd.h2
-rw-r--r--src/emu/emumem.cpp74
-rw-r--r--src/emu/emumem.h210
-rw-r--r--src/emu/emumem_aspace.cpp100
-rw-r--r--src/emu/emumem_hedr.h4
-rw-r--r--src/emu/emumem_hedr.ipp170
-rw-r--r--src/emu/emumem_hedw.h4
-rw-r--r--src/emu/emumem_hedw.ipp170
-rw-r--r--src/emu/emumem_mud.cpp7
-rw-r--r--src/emu/emumem_mview.cpp203
-rw-r--r--src/emu/emuopts.cpp57
-rw-r--r--src/emu/emuopts.h46
-rw-r--r--src/emu/emupal.cpp17
-rw-r--r--src/emu/emupal.h14
-rw-r--r--src/emu/gamedrv.h105
-rw-r--r--src/emu/http.cpp7
-rw-r--r--src/emu/image.cpp19
-rw-r--r--src/emu/inpttype.h20
-rw-r--r--src/emu/inpttype.ipp94
-rw-r--r--src/emu/input.cpp102
-rw-r--r--src/emu/input.h2
-rw-r--r--src/emu/inputdev.cpp52
-rw-r--r--src/emu/inputdev.h6
-rw-r--r--src/emu/ioport.cpp222
-rw-r--r--src/emu/ioport.h267
-rw-r--r--src/emu/layout/cyberlead.lay14
-rw-r--r--src/emu/layout/h8_fp.lay (renamed from src/mame/layout/h8.lay)0
-rw-r--r--src/emu/layout/nes_rob.lay18
-rw-r--r--src/emu/layout/noscreens.lay29
-rw-r--r--src/emu/layout/teletex800.lay167
-rw-r--r--src/emu/machine.cpp49
-rw-r--r--src/emu/machine.h1
-rw-r--r--src/emu/main.h3
-rw-r--r--src/emu/mconfig.cpp6
-rw-r--r--src/emu/natkeyboard.cpp155
-rw-r--r--src/emu/natkeyboard.h5
-rw-r--r--src/emu/network.cpp1
-rw-r--r--src/emu/output.cpp2
-rw-r--r--src/emu/output.h2
-rw-r--r--src/emu/recording.cpp13
-rw-r--r--src/emu/recording.h3
-rw-r--r--src/emu/render.cpp129
-rw-r--r--src/emu/render.h3
-rw-r--r--src/emu/rendersw.hxx330
-rw-r--r--src/emu/rendlay.cpp117
-rw-r--r--src/emu/resampler.cpp615
-rw-r--r--src/emu/resampler.h69
-rw-r--r--src/emu/romentry.cpp10
-rw-r--r--src/emu/romentry.h132
-rw-r--r--src/emu/romload.cpp19
-rw-r--r--src/emu/romload.h13
-rw-r--r--src/emu/save.cpp67
-rw-r--r--src/emu/save.h7
-rw-r--r--src/emu/schedule.cpp14
-rw-r--r--src/emu/schedule.h3
-rw-r--r--src/emu/screen.cpp113
-rw-r--r--src/emu/screen.h27
-rw-r--r--src/emu/softlist_dev.h2
-rw-r--r--src/emu/sound.cpp3635
-rw-r--r--src/emu/sound.h1121
-rw-r--r--src/emu/speaker.cpp217
-rw-r--r--src/emu/speaker.h128
-rw-r--r--src/emu/tilemap.cpp168
-rw-r--r--src/emu/tilemap.h45
-rw-r--r--src/emu/uiinput.cpp7
-rw-r--r--src/emu/uiinput.h8
-rw-r--r--src/emu/validity.cpp767
-rw-r--r--src/emu/validity.h5
-rw-r--r--src/emu/video.cpp4
-rw-r--r--src/emu/video.h1
-rw-r--r--src/emu/video/rgbgen.cpp117
-rw-r--r--src/emu/video/rgbgen.h431
-rw-r--r--src/emu/video/rgbsse.cpp188
-rw-r--r--src/emu/video/rgbsse.h502
-rw-r--r--src/emu/video/rgbutil.cpp305
-rw-r--r--src/emu/video/rgbutil.h429
-rw-r--r--src/emu/video/rgbvmx.cpp200
-rw-r--r--src/emu/video/rgbvmx.h744
-rw-r--r--src/emu/xtal.cpp1326
-rw-r--r--src/emu/xtal.h20
-rw-r--r--src/frontend/mame/cheat.cpp35
-rw-r--r--src/frontend/mame/cheat.h2
-rw-r--r--src/frontend/mame/clifront.cpp73
-rw-r--r--src/frontend/mame/infoxml.cpp224
-rw-r--r--src/frontend/mame/luaengine.cpp294
-rw-r--r--src/frontend/mame/luaengine.h8
-rw-r--r--src/frontend/mame/luaengine.ipp12
-rw-r--r--src/frontend/mame/luaengine_debug.cpp19
-rw-r--r--src/frontend/mame/luaengine_input.cpp257
-rw-r--r--src/frontend/mame/luaengine_mem.cpp6
-rw-r--r--src/frontend/mame/luaengine_render.cpp4
-rw-r--r--src/frontend/mame/mame.cpp12
-rw-r--r--src/frontend/mame/mameopts.cpp50
-rw-r--r--src/frontend/mame/ui/about.cpp4
-rw-r--r--src/frontend/mame/ui/about.h4
-rw-r--r--src/frontend/mame/ui/analogipt.cpp30
-rw-r--r--src/frontend/mame/ui/analogipt.h4
-rw-r--r--src/frontend/mame/ui/audio_effect_compressor.cpp514
-rw-r--r--src/frontend/mame/ui/audio_effect_compressor.h74
-rw-r--r--src/frontend/mame/ui/audio_effect_eq.cpp526
-rw-r--r--src/frontend/mame/ui/audio_effect_eq.h59
-rw-r--r--src/frontend/mame/ui/audio_effect_filter.cpp512
-rw-r--r--src/frontend/mame/ui/audio_effect_filter.h61
-rw-r--r--src/frontend/mame/ui/audio_effect_reverb.cpp747
-rw-r--r--src/frontend/mame/ui/audio_effect_reverb.h92
-rw-r--r--src/frontend/mame/ui/audioeffects.cpp288
-rw-r--r--src/frontend/mame/ui/audioeffects.h53
-rw-r--r--src/frontend/mame/ui/audiomix.cpp1206
-rw-r--r--src/frontend/mame/ui/audiomix.h100
-rw-r--r--src/frontend/mame/ui/auditmenu.cpp12
-rw-r--r--src/frontend/mame/ui/auditmenu.h4
-rw-r--r--src/frontend/mame/ui/barcode.cpp4
-rw-r--r--src/frontend/mame/ui/barcode.h5
-rw-r--r--src/frontend/mame/ui/cheatopt.cpp2
-rw-r--r--src/frontend/mame/ui/cheatopt.h2
-rw-r--r--src/frontend/mame/ui/confswitch.cpp35
-rw-r--r--src/frontend/mame/ui/confswitch.h8
-rw-r--r--src/frontend/mame/ui/custui.cpp48
-rw-r--r--src/frontend/mame/ui/custui.h16
-rw-r--r--src/frontend/mame/ui/datmenu.cpp10
-rw-r--r--src/frontend/mame/ui/datmenu.h6
-rw-r--r--src/frontend/mame/ui/devctrl.h6
-rw-r--r--src/frontend/mame/ui/devopt.cpp63
-rw-r--r--src/frontend/mame/ui/devopt.h2
-rw-r--r--src/frontend/mame/ui/dirmenu.cpp28
-rw-r--r--src/frontend/mame/ui/dirmenu.h2
-rw-r--r--src/frontend/mame/ui/filecreate.cpp119
-rw-r--r--src/frontend/mame/ui/filecreate.h62
-rw-r--r--src/frontend/mame/ui/filemngr.cpp231
-rw-r--r--src/frontend/mame/ui/filemngr.h9
-rw-r--r--src/frontend/mame/ui/filesel.cpp64
-rw-r--r--src/frontend/mame/ui/filesel.h20
-rw-r--r--src/frontend/mame/ui/floppycntrl.cpp362
-rw-r--r--src/frontend/mame/ui/floppycntrl.h25
-rw-r--r--src/frontend/mame/ui/imgcntrl.cpp476
-rw-r--r--src/frontend/mame/ui/imgcntrl.h46
-rw-r--r--src/frontend/mame/ui/info.cpp354
-rw-r--r--src/frontend/mame/ui/info.h61
-rw-r--r--src/frontend/mame/ui/info_pty.cpp4
-rw-r--r--src/frontend/mame/ui/info_pty.h2
-rw-r--r--src/frontend/mame/ui/inputdevices.cpp30
-rw-r--r--src/frontend/mame/ui/inputdevices.h2
-rw-r--r--src/frontend/mame/ui/inputmap.cpp118
-rw-r--r--src/frontend/mame/ui/inputmap.h33
-rw-r--r--src/frontend/mame/ui/inputopts.cpp16
-rw-r--r--src/frontend/mame/ui/inputopts.h2
-rw-r--r--src/frontend/mame/ui/inputtoggle.cpp4
-rw-r--r--src/frontend/mame/ui/inputtoggle.h2
-rw-r--r--src/frontend/mame/ui/keyboard.cpp2
-rw-r--r--src/frontend/mame/ui/keyboard.h2
-rw-r--r--src/frontend/mame/ui/mainmenu.cpp91
-rw-r--r--src/frontend/mame/ui/mainmenu.h2
-rw-r--r--src/frontend/mame/ui/menu.cpp156
-rw-r--r--src/frontend/mame/ui/menu.h43
-rw-r--r--src/frontend/mame/ui/midiinout.cpp78
-rw-r--r--src/frontend/mame/ui/midiinout.h48
-rw-r--r--src/frontend/mame/ui/miscmenu.cpp97
-rw-r--r--src/frontend/mame/ui/miscmenu.h14
-rw-r--r--src/frontend/mame/ui/moptions.cpp120
-rw-r--r--src/frontend/mame/ui/moptions.h5
-rw-r--r--src/frontend/mame/ui/optsmenu.cpp32
-rw-r--r--src/frontend/mame/ui/optsmenu.h4
-rw-r--r--src/frontend/mame/ui/pluginopt.cpp43
-rw-r--r--src/frontend/mame/ui/pluginopt.h6
-rw-r--r--src/frontend/mame/ui/prscntrl.cpp15
-rw-r--r--src/frontend/mame/ui/prscntrl.h2
-rw-r--r--src/frontend/mame/ui/quitmenu.cpp4
-rw-r--r--src/frontend/mame/ui/quitmenu.h4
-rw-r--r--src/frontend/mame/ui/selector.cpp4
-rw-r--r--src/frontend/mame/ui/selector.h4
-rw-r--r--src/frontend/mame/ui/selgame.cpp40
-rw-r--r--src/frontend/mame/ui/selgame.h4
-rw-r--r--src/frontend/mame/ui/selmenu.cpp152
-rw-r--r--src/frontend/mame/ui/selmenu.h10
-rw-r--r--src/frontend/mame/ui/selsoft.cpp38
-rw-r--r--src/frontend/mame/ui/selsoft.h2
-rw-r--r--src/frontend/mame/ui/simpleselgame.cpp34
-rw-r--r--src/frontend/mame/ui/simpleselgame.h9
-rw-r--r--src/frontend/mame/ui/sliders.cpp30
-rw-r--r--src/frontend/mame/ui/sliders.h4
-rw-r--r--src/frontend/mame/ui/slotopt.cpp18
-rw-r--r--src/frontend/mame/ui/slotopt.h2
-rw-r--r--src/frontend/mame/ui/sndmenu.cpp17
-rw-r--r--src/frontend/mame/ui/sndmenu.h5
-rw-r--r--src/frontend/mame/ui/state.cpp25
-rw-r--r--src/frontend/mame/ui/state.h8
-rw-r--r--src/frontend/mame/ui/submenu.cpp157
-rw-r--r--src/frontend/mame/ui/submenu.h6
-rw-r--r--src/frontend/mame/ui/swlist.cpp99
-rw-r--r--src/frontend/mame/ui/swlist.h58
-rw-r--r--src/frontend/mame/ui/tapectrl.cpp4
-rw-r--r--src/frontend/mame/ui/tapectrl.h2
-rw-r--r--src/frontend/mame/ui/textbox.cpp14
-rw-r--r--src/frontend/mame/ui/textbox.h6
-rw-r--r--src/frontend/mame/ui/toolbar.ipp12
-rw-r--r--src/frontend/mame/ui/ui.cpp754
-rw-r--r--src/frontend/mame/ui/ui.h62
-rw-r--r--src/frontend/mame/ui/uicmd14.md4
-rw-r--r--src/frontend/mame/ui/utils.cpp41
-rw-r--r--src/frontend/mame/ui/utils.h4
-rw-r--r--src/frontend/mame/ui/videoopt.cpp202
-rw-r--r--src/frontend/mame/ui/videoopt.h8
-rw-r--r--src/frontend/mame/ui/viewgfx.cpp187
-rw-r--r--src/frontend/mame/ui/viewgfx.h2
-rw-r--r--src/frontend/mame/ui/widgets.cpp6
-rw-r--r--src/lib/formats/86f_dsk.cpp268
-rw-r--r--src/lib/formats/86f_dsk.h35
-rw-r--r--src/lib/formats/a26_cas.cpp2
-rw-r--r--src/lib/formats/ace_tap.cpp2
-rw-r--r--src/lib/formats/acorn_dsk.cpp29
-rw-r--r--src/lib/formats/acorn_dsk.h2
-rw-r--r--src/lib/formats/adam_dsk.cpp381
-rw-r--r--src/lib/formats/adam_dsk.h18
-rw-r--r--src/lib/formats/aiffile.cpp173
-rw-r--r--src/lib/formats/aiffile.h11
-rw-r--r--src/lib/formats/all.cpp62
-rw-r--r--src/lib/formats/ap2_dsk.cpp1417
-rw-r--r--src/lib/formats/ap2_dsk.h97
-rw-r--r--src/lib/formats/ap_dsk35.cpp91
-rw-r--r--src/lib/formats/apd_dsk.cpp13
-rw-r--r--src/lib/formats/apd_dsk.h1
-rw-r--r--src/lib/formats/apf_apt.cpp4
-rw-r--r--src/lib/formats/apricotpc_dsk.cpp50
-rw-r--r--src/lib/formats/apricotpc_dsk.h33
-rw-r--r--src/lib/formats/apridisk.cpp8
-rw-r--r--src/lib/formats/apridisk.h1
-rw-r--r--src/lib/formats/as_dsk.cpp2
-rw-r--r--src/lib/formats/c3040_dsk.cpp2
-rw-r--r--src/lib/formats/c3040_dsk.h2
-rw-r--r--src/lib/formats/camplynx_cas.cpp2
-rw-r--r--src/lib/formats/cassimg.cpp48
-rw-r--r--src/lib/formats/cassimg.h6
-rw-r--r--src/lib/formats/cbm_tap.cpp2
-rw-r--r--src/lib/formats/ccvf_dsk.cpp5
-rw-r--r--src/lib/formats/ccvf_dsk.h1
-rw-r--r--src/lib/formats/cgen_cas.cpp2
-rw-r--r--src/lib/formats/cqm_dsk.cpp13
-rw-r--r--src/lib/formats/cqm_dsk.h2
-rw-r--r--src/lib/formats/csw_cas.cpp14
-rw-r--r--src/lib/formats/d88_dsk.cpp36
-rw-r--r--src/lib/formats/d88_dsk.h1
-rw-r--r--src/lib/formats/dcp_dsk.cpp17
-rw-r--r--src/lib/formats/dcp_dsk.h1
-rw-r--r--src/lib/formats/dfi_dsk.cpp5
-rw-r--r--src/lib/formats/dfi_dsk.h1
-rw-r--r--src/lib/formats/dim_dsk.cpp8
-rw-r--r--src/lib/formats/dim_dsk.h1
-rw-r--r--src/lib/formats/dip_dsk.cpp8
-rw-r--r--src/lib/formats/dip_dsk.h1
-rw-r--r--src/lib/formats/dmk_dsk.cpp6
-rw-r--r--src/lib/formats/dmk_dsk.h1
-rw-r--r--src/lib/formats/ds9_dsk.cpp2
-rw-r--r--src/lib/formats/dsk_dsk.cpp8
-rw-r--r--src/lib/formats/dsk_dsk.h1
-rw-r--r--src/lib/formats/esq16_dsk.cpp4
-rw-r--r--src/lib/formats/fc100_cas.cpp2
-rw-r--r--src/lib/formats/fdd_dsk.cpp13
-rw-r--r--src/lib/formats/fdd_dsk.h1
-rw-r--r--src/lib/formats/flopimg.cpp106
-rw-r--r--src/lib/formats/flopimg.h81
-rw-r--r--src/lib/formats/fm7_cas.cpp2
-rw-r--r--src/lib/formats/fmsx_cas.cpp4
-rw-r--r--src/lib/formats/fs_cbmdos.cpp267
-rw-r--r--src/lib/formats/fs_coco_os9.cpp234
-rw-r--r--src/lib/formats/fs_coco_rsdos.cpp229
-rw-r--r--src/lib/formats/fs_fat.cpp273
-rw-r--r--src/lib/formats/fs_hp98x5.cpp152
-rw-r--r--src/lib/formats/fs_hplif.cpp150
-rw-r--r--src/lib/formats/fs_isis.cpp113
-rw-r--r--src/lib/formats/fs_oric_jasmin.cpp338
-rw-r--r--src/lib/formats/fs_prodos.cpp354
-rw-r--r--src/lib/formats/fs_unformatted.cpp40
-rw-r--r--src/lib/formats/fs_unformatted.h4
-rw-r--r--src/lib/formats/fs_vtech.cpp297
-rw-r--r--src/lib/formats/fsblk.cpp243
-rw-r--r--src/lib/formats/fsblk.h237
-rw-r--r--src/lib/formats/fsblk_vec.cpp24
-rw-r--r--src/lib/formats/fsblk_vec.h20
-rw-r--r--src/lib/formats/fsd_dsk.cpp11
-rw-r--r--src/lib/formats/fsd_dsk.h1
-rw-r--r--src/lib/formats/fsmeta.cpp2
-rw-r--r--src/lib/formats/fsmeta.h10
-rw-r--r--src/lib/formats/fz1_dsk.cpp40
-rw-r--r--src/lib/formats/fz1_dsk.h29
-rw-r--r--src/lib/formats/gtp_cas.cpp2
-rw-r--r--src/lib/formats/h17disk.cpp253
-rw-r--r--src/lib/formats/h17disk.h38
-rw-r--r--src/lib/formats/h8_cas.cpp166
-rw-r--r--src/lib/formats/h8_cas.h4
-rw-r--r--src/lib/formats/hect_tap.cpp10
-rw-r--r--src/lib/formats/hxchfe_dsk.cpp864
-rw-r--r--src/lib/formats/hxchfe_dsk.h63
-rw-r--r--src/lib/formats/imd_dsk.cpp8
-rw-r--r--src/lib/formats/imd_dsk.h1
-rw-r--r--src/lib/formats/img_dsk.cpp3
-rw-r--r--src/lib/formats/ipf_dsk.cpp5
-rw-r--r--src/lib/formats/ipf_dsk.h1
-rw-r--r--src/lib/formats/jfd_dsk.cpp22
-rw-r--r--src/lib/formats/jfd_dsk.h1
-rw-r--r--src/lib/formats/juku_dsk.cpp10
-rw-r--r--src/lib/formats/juku_dsk.h4
-rw-r--r--src/lib/formats/jvc_dsk.cpp3
-rw-r--r--src/lib/formats/kc_cas.cpp6
-rw-r--r--src/lib/formats/kim1_cas.cpp2
-rw-r--r--src/lib/formats/lviv_lvt.cpp2
-rw-r--r--src/lib/formats/lw30_dsk.cpp6
-rw-r--r--src/lib/formats/lw30_dsk.h1
-rw-r--r--src/lib/formats/m20_dsk.cpp3
-rw-r--r--src/lib/formats/m5_dsk.cpp58
-rw-r--r--src/lib/formats/m5_dsk.h15
-rw-r--r--src/lib/formats/mbee_cas.cpp2
-rw-r--r--src/lib/formats/mfi_dsk.cpp28
-rw-r--r--src/lib/formats/mz_cas.cpp367
-rw-r--r--src/lib/formats/mz_cas.h1
-rw-r--r--src/lib/formats/nabupc_dsk.cpp5
-rw-r--r--src/lib/formats/nfd_dsk.cpp23
-rw-r--r--src/lib/formats/nfd_dsk.h1
-rw-r--r--src/lib/formats/orao_cas.cpp2
-rw-r--r--src/lib/formats/oric_dsk.cpp15
-rw-r--r--src/lib/formats/oric_tap.cpp184
-rw-r--r--src/lib/formats/p6001_cas.cpp2
-rw-r--r--src/lib/formats/pasti_dsk.cpp5
-rw-r--r--src/lib/formats/pasti_dsk.h1
-rw-r--r--src/lib/formats/pc98_dsk.cpp4
-rw-r--r--src/lib/formats/pc98fdi_dsk.cpp8
-rw-r--r--src/lib/formats/pc98fdi_dsk.h1
-rw-r--r--src/lib/formats/phc25_cas.cpp6
-rw-r--r--src/lib/formats/pk8020_dsk.cpp2
-rw-r--r--src/lib/formats/pmd_cas.cpp2
-rw-r--r--src/lib/formats/poly_dsk.cpp3
-rw-r--r--src/lib/formats/primoptp.cpp4
-rw-r--r--src/lib/formats/rk_cas.cpp8
-rw-r--r--src/lib/formats/rx01_dsk.cpp37
-rw-r--r--src/lib/formats/rx01_dsk.h19
-rw-r--r--src/lib/formats/sap_dsk.cpp165
-rw-r--r--src/lib/formats/sap_dsk.h29
-rw-r--r--src/lib/formats/sdf_dsk.cpp6
-rw-r--r--src/lib/formats/sdf_dsk.h1
-rw-r--r--src/lib/formats/sol_cas.cpp2
-rw-r--r--src/lib/formats/sorc_cas.cpp2
-rw-r--r--src/lib/formats/sord_cas.cpp8
-rw-r--r--src/lib/formats/spc1000_cas.cpp4
-rw-r--r--src/lib/formats/svi_cas.cpp2
-rw-r--r--src/lib/formats/svi_dsk.cpp3
-rw-r--r--src/lib/formats/td0_dsk.cpp8
-rw-r--r--src/lib/formats/td0_dsk.h1
-rw-r--r--src/lib/formats/thom_cas.cpp22
-rw-r--r--src/lib/formats/thom_dsk.cpp13
-rw-r--r--src/lib/formats/thom_dsk.h4
-rw-r--r--src/lib/formats/trs80_dsk.cpp6
-rw-r--r--src/lib/formats/trs_cas.cpp2
-rw-r--r--src/lib/formats/tzx_cas.cpp222
-rw-r--r--src/lib/formats/tzx_cas.h2
-rw-r--r--src/lib/formats/uef_cas.cpp17
-rw-r--r--src/lib/formats/vdk_dsk.cpp3
-rw-r--r--src/lib/formats/vg5k_cas.cpp2
-rw-r--r--src/lib/formats/vgi_dsk.cpp8
-rw-r--r--src/lib/formats/vt_cas.cpp6
-rw-r--r--src/lib/formats/vt_dsk.cpp9
-rw-r--r--src/lib/formats/wavfile.cpp77
-rw-r--r--src/lib/formats/wren_dsk.cpp43
-rw-r--r--src/lib/formats/wren_dsk.h34
-rw-r--r--src/lib/formats/x07_cas.cpp2
-rw-r--r--src/lib/formats/x1_tap.cpp2
-rw-r--r--src/lib/formats/zx81_p.cpp53
-rw-r--r--src/lib/netlist/build/create_devinc.py21
-rw-r--r--src/lib/netlist/build/create_lib_entries.py3
-rw-r--r--src/lib/netlist/generated/nld_devinc.h1743
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx_lib.cpp3
-rw-r--r--src/lib/netlist/nl_setup.cpp15
-rw-r--r--src/lib/netlist/nl_setup.h9
-rw-r--r--src/lib/netlist/prg/nltool.cpp2
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp2
-rw-r--r--src/lib/util/aes256cbc.cpp8
-rw-r--r--src/lib/util/aes256cbc.h28
-rw-r--r--src/lib/util/aviio.cpp2
-rw-r--r--src/lib/util/bitmap.h4
-rw-r--r--src/lib/util/cdrom.cpp947
-rw-r--r--src/lib/util/chd.cpp1281
-rw-r--r--src/lib/util/chd.h45
-rw-r--r--src/lib/util/chdcodec.cpp87
-rw-r--r--src/lib/util/chdcodec.h7
-rw-r--r--src/lib/util/client_ws.hpp16
-rw-r--r--src/lib/util/corestr.cpp1
-rw-r--r--src/lib/util/coretmpl.h154
-rw-r--r--src/lib/util/delegate.cpp208
-rw-r--r--src/lib/util/delegate.h18
-rw-r--r--src/lib/util/dvdrom.cpp4
-rw-r--r--src/lib/util/ioprocs.cpp11
-rw-r--r--src/lib/util/language.h16
-rw-r--r--src/lib/util/mfpresolve.cpp431
-rw-r--r--src/lib/util/mfpresolve.h151
-rw-r--r--src/lib/util/opresolv.cpp2
-rw-r--r--src/lib/util/opresolv.h11
-rw-r--r--src/lib/util/options.cpp165
-rw-r--r--src/lib/util/options.h13
-rw-r--r--src/lib/util/palette.cpp76
-rw-r--r--src/lib/util/palette.h26
-rw-r--r--src/lib/util/png.cpp95
-rw-r--r--src/lib/util/server_http_impl.hpp8
-rw-r--r--src/lib/util/server_ws_impl.hpp12
-rw-r--r--src/lib/util/strformat.h141
-rw-r--r--src/lib/util/xmlfile.cpp2
-rw-r--r--src/lib/util/zippath.cpp63
-rw-r--r--src/mame/access/acvirus.cpp758
-rw-r--r--src/mame/acorn/aa310.cpp161
-rw-r--r--src/mame/acorn/accomm.cpp702
-rw-r--r--src/mame/acorn/acorn_serproc.cpp324
-rw-r--r--src/mame/acorn/acorn_serproc.h117
-rw-r--r--src/mame/acorn/acrnsys.cpp348
-rw-r--r--src/mame/acorn/acrnsys1.cpp4
-rw-r--r--src/mame/acorn/acrnsys_kbd.cpp299
-rw-r--r--src/mame/acorn/acrnsys_kbd.h74
-rw-r--r--src/mame/acorn/aristmk5.cpp1836
-rw-r--r--src/mame/acorn/atom.cpp1163
-rw-r--r--src/mame/acorn/atom.h145
-rw-r--r--src/mame/acorn/bbc.cpp3120
-rw-r--r--src/mame/acorn/bbc.h401
-rw-r--r--src/mame/acorn/bbc_kbd.cpp1013
-rw-r--r--src/mame/acorn/bbc_kbd.h195
-rw-r--r--src/mame/acorn/bbc_m.cpp1547
-rw-r--r--src/mame/acorn/bbc_v.cpp252
-rw-r--r--src/mame/acorn/bbcb.cpp1003
-rw-r--r--src/mame/acorn/bbcbp.cpp934
-rw-r--r--src/mame/acorn/bbcm.cpp1477
-rw-r--r--src/mame/acorn/bbcmc.cpp813
-rw-r--r--src/mame/acorn/belatra.cpp230
-rw-r--r--src/mame/acorn/cms.cpp29
-rw-r--r--src/mame/acorn/electron.cpp447
-rw-r--r--src/mame/acorn/electron.h190
-rw-r--r--src/mame/acorn/electron_m.cpp646
-rw-r--r--src/mame/acorn/electron_ula.cpp657
-rw-r--r--src/mame/acorn/electron_ula.h144
-rw-r--r--src/mame/acorn/electron_v.cpp296
-rw-r--r--src/mame/acorn/ertictac.cpp32
-rw-r--r--src/mame/acorn/eurocube.cpp482
-rw-r--r--src/mame/acorn/reutapm.cpp426
-rw-r--r--src/mame/acorn/riscpc.cpp13
-rw-r--r--src/mame/acorn/ssfindo.cpp42
-rw-r--r--src/mame/act/apricot.cpp49
-rw-r--r--src/mame/act/apricotf.cpp8
-rw-r--r--src/mame/act/apricotkb.h12
-rw-r--r--src/mame/act/apricotp.cpp10
-rw-r--r--src/mame/act/apxen.cpp14
-rw-r--r--src/mame/act/victor9k.cpp233
-rw-r--r--src/mame/act/victor9k_fdc.cpp181
-rw-r--r--src/mame/act/victor9k_fdc.h15
-rw-r--r--src/mame/act/victor9k_hdc.cpp300
-rw-r--r--src/mame/act/victor9k_hdc.h112
-rw-r--r--src/mame/act/victor9k_kb.h8
-rw-r--r--src/mame/adc/super6.cpp30
-rw-r--r--src/mame/adc/super6.h10
-rw-r--r--src/mame/adc/superslave.cpp8
-rw-r--r--src/mame/adds/4000_260.cpp888
-rw-r--r--src/mame/adds/adds2020.cpp12
-rw-r--r--src/mame/adds/multivision.cpp548
-rw-r--r--src/mame/adds/vp60.cpp14
-rw-r--r--src/mame/adp/adp.cpp189
-rw-r--r--src/mame/adp/manohman.cpp73
-rw-r--r--src/mame/adp/servicetastatur.cpp321
-rw-r--r--src/mame/adp/stella8085.cpp864
-rw-r--r--src/mame/adp/stellafr.cpp638
-rw-r--r--src/mame/agat/agat.cpp94
-rw-r--r--src/mame/agat/agat7.h6
-rw-r--r--src/mame/agat/agat9.h6
-rw-r--r--src/mame/agat/agatkeyb.cpp4
-rw-r--r--src/mame/agat/agatkeyb.h6
-rw-r--r--src/mame/akai/akaiax80.cpp4
-rw-r--r--src/mame/akai/akaivx600.cpp26
-rw-r--r--src/mame/akai/mpc2000.cpp869
-rw-r--r--src/mame/akai/mpc3000.cpp562
-rw-r--r--src/mame/akai/mpc60.cpp659
-rw-r--r--src/mame/akai/s3000.cpp1058
-rw-r--r--src/mame/alesis/alesis.cpp12
-rw-r--r--src/mame/alesis/alesis.h22
-rw-r--r--src/mame/alesis/alesis_a.cpp8
-rw-r--r--src/mame/alesis/midiverb.cpp610
-rw-r--r--src/mame/alesis/qs.cpp105
-rw-r--r--src/mame/alliedleisure/ace.cpp356
-rw-r--r--src/mame/alliedleisure/aleisttl.cpp8
-rw-r--r--src/mame/alliedleisure/aztarac.cpp20
-rw-r--r--src/mame/alliedleisure/clayshoo.cpp335
-rw-r--r--src/mame/alliedleisure/killcom.cpp5
-rw-r--r--src/mame/alliedleisure/killcom.h14
-rw-r--r--src/mame/alliedleisure/trvquest.cpp4
-rw-r--r--src/mame/alpha/ad_sound.cpp14
-rw-r--r--src/mame/alpha/ad_sound.h20
-rw-r--r--src/mame/alpha/alpha68k.cpp547
-rw-r--r--src/mame/alpha/alpha68k.h249
-rw-r--r--src/mame/alpha/alpha68k_i.cpp52
-rw-r--r--src/mame/alpha/alpha68k_n.cpp206
-rw-r--r--src/mame/alpha/alpha68k_v.cpp28
-rw-r--r--src/mame/alpha/alpha8201.cpp4
-rw-r--r--src/mame/alpha/alpha8201.h6
-rw-r--r--src/mame/alpha/champbas.cpp47
-rw-r--r--src/mame/alpha/equites.cpp22
-rw-r--r--src/mame/alpha/meijinsn.cpp64
-rw-r--r--src/mame/alpha/shougi.cpp95
-rw-r--r--src/mame/alpha/splendor.cpp12
-rw-r--r--src/mame/altos/acs8600_ics.h10
-rw-r--r--src/mame/altos/altos2.cpp6
-rw-r--r--src/mame/altos/altos2_kbd.h18
-rw-r--r--src/mame/altos/altos486.cpp8
-rw-r--r--src/mame/altos/altos5.cpp48
-rw-r--r--src/mame/altos/altos586.cpp52
-rw-r--r--src/mame/altos/altos586_hdc.cpp26
-rw-r--r--src/mame/altos/altos586_hdc.h10
-rw-r--r--src/mame/altos/altos8600.cpp43
-rw-r--r--src/mame/amcoe/au1250.cpp122
-rw-r--r--src/mame/amcoe/sfbonus.cpp (renamed from src/mame/misc/sfbonus.cpp)2403
-rw-r--r--src/mame/amiga/agnus_copper.cpp421
-rw-r--r--src/mame/amiga/agnus_copper.h82
-rw-r--r--src/mame/amiga/akiko.cpp (renamed from src/devices/machine/akiko.cpp)8
-rw-r--r--src/mame/amiga/akiko.h (renamed from src/devices/machine/akiko.h)15
-rw-r--r--src/mame/amiga/alg.cpp52
-rw-r--r--src/mame/amiga/amiga.cpp678
-rw-r--r--src/mame/amiga/amiga.h83
-rw-r--r--src/mame/amiga/amiga_m.cpp191
-rw-r--r--src/mame/amiga/amiga_v.cpp205
-rw-r--r--src/mame/amiga/amigaaga.cpp402
-rw-r--r--src/mame/amiga/amigaaga.h2
-rw-r--r--src/mame/amiga/arsystems.cpp70
-rw-r--r--src/mame/amiga/cubo.cpp123
-rw-r--r--src/mame/amiga/gayle.cpp (renamed from src/devices/machine/gayle.cpp)0
-rw-r--r--src/mame/amiga/gayle.h (renamed from src/devices/machine/gayle.h)12
-rw-r--r--src/mame/amiga/mquake.cpp117
-rw-r--r--src/mame/amiga/paula.cpp412
-rw-r--r--src/mame/amiga/paula.h120
-rw-r--r--src/mame/amiga/paulafdc.cpp702
-rw-r--r--src/mame/amiga/paulafdc.h130
-rw-r--r--src/mame/amiga/upscope.cpp24
-rw-r--r--src/mame/amirix/wxstar4000.cpp36
-rw-r--r--src/mame/ampex/ampex.cpp6
-rw-r--r--src/mame/ampex/ampex210.cpp16
-rw-r--r--src/mame/ampex/ampex210_kbd.h8
-rw-r--r--src/mame/ampro/ampro.cpp20
-rw-r--r--src/mame/ampro/lb186.cpp24
-rw-r--r--src/mame/ampro/lbpc.cpp23
-rw-r--r--src/mame/amstrad/ams40041.h4
-rw-r--r--src/mame/amstrad/amstr_pc.cpp10
-rw-r--r--src/mame/amstrad/amstrad.cpp4
-rw-r--r--src/mame/amstrad/amstrad.h6
-rw-r--r--src/mame/amstrad/amstrad_m.cpp56
-rw-r--r--src/mame/amstrad/nc.cpp42
-rw-r--r--src/mame/amstrad/pc1512.h18
-rw-r--r--src/mame/amstrad/pc1512kb.h10
-rw-r--r--src/mame/amstrad/pcw.cpp10
-rw-r--r--src/mame/amstrad/pcw.h12
-rw-r--r--src/mame/amstrad/pcw16.cpp4
-rw-r--r--src/mame/amstrad/pcw16.h10
-rw-r--r--src/mame/amstrad/pda600.cpp10
-rw-r--r--src/mame/amstrad/pda600_copro.h6
-rw-r--r--src/mame/apf/apf.cpp12
-rw-r--r--src/mame/apollo/apollo.cpp212
-rw-r--r--src/mame/apollo/apollo.h40
-rw-r--r--src/mame/apollo/apollo_kbd.h8
-rw-r--r--src/mame/apollo/apollo_m.cpp4
-rw-r--r--src/mame/apple/adbmodem.h10
-rw-r--r--src/mame/apple/apple1.cpp6
-rw-r--r--src/mame/apple/apple2.cpp842
-rw-r--r--src/mame/apple/apple2common.cpp1017
-rw-r--r--src/mame/apple/apple2common.h10
-rw-r--r--src/mame/apple/apple2e.cpp2898
-rw-r--r--src/mame/apple/apple2gs.cpp1093
-rw-r--r--src/mame/apple/apple2video.cpp515
-rw-r--r--src/mame/apple/apple2video.h70
-rw-r--r--src/mame/apple/apple3.cpp14
-rw-r--r--src/mame/apple/apple3.h6
-rw-r--r--src/mame/apple/awacs_macrisc.cpp10
-rw-r--r--src/mame/apple/awacs_macrisc.h8
-rw-r--r--src/mame/apple/bandit.h8
-rw-r--r--src/mame/apple/burgundy.cpp10
-rw-r--r--src/mame/apple/burgundy.h6
-rw-r--r--src/mame/apple/csc.cpp340
-rw-r--r--src/mame/apple/csc.h55
-rw-r--r--src/mame/apple/cuda.cpp42
-rw-r--r--src/mame/apple/cuda.h30
-rw-r--r--src/mame/apple/dafb.cpp2
-rw-r--r--src/mame/apple/dafb.h24
-rw-r--r--src/mame/apple/dbdma.cpp4
-rw-r--r--src/mame/apple/dbdma.h12
-rw-r--r--src/mame/apple/dfac.cpp38
-rw-r--r--src/mame/apple/dfac.h4
-rw-r--r--src/mame/apple/dfac2.cpp89
-rw-r--r--src/mame/apple/dfac2.h32
-rw-r--r--src/mame/apple/djmemc.h14
-rw-r--r--src/mame/apple/egret.cpp21
-rw-r--r--src/mame/apple/egret.h11
-rw-r--r--src/mame/apple/f108.cpp26
-rw-r--r--src/mame/apple/f108.h14
-rw-r--r--src/mame/apple/gsc.cpp176
-rw-r--r--src/mame/apple/gsc.h51
-rw-r--r--src/mame/apple/heathrow.cpp4
-rw-r--r--src/mame/apple/heathrow.h30
-rw-r--r--src/mame/apple/imacg3.cpp14
-rw-r--r--src/mame/apple/iosb.cpp107
-rw-r--r--src/mame/apple/iosb.h25
-rw-r--r--src/mame/apple/iphone2g.cpp27
-rw-r--r--src/mame/apple/lisa.cpp850
-rw-r--r--src/mame/apple/lisa.h259
-rw-r--r--src/mame/apple/lisa_m.cpp1835
-rw-r--r--src/mame/apple/lisafdc.cpp476
-rw-r--r--src/mame/apple/lisafdc.h123
-rw-r--r--src/mame/apple/lisammu.cpp480
-rw-r--r--src/mame/apple/lisammu.h128
-rw-r--r--src/mame/apple/lisavideo.cpp270
-rw-r--r--src/mame/apple/lisavideo.h100
-rw-r--r--src/mame/apple/lwriter.cpp14
-rw-r--r--src/mame/apple/mac128.cpp627
-rw-r--r--src/mame/apple/macadb.cpp55
-rw-r--r--src/mame/apple/macadb.h12
-rw-r--r--src/mame/apple/macii.cpp110
-rw-r--r--src/mame/apple/maciici.cpp91
-rw-r--r--src/mame/apple/maciifx.cpp29
-rw-r--r--src/mame/apple/maciivx.cpp69
-rw-r--r--src/mame/apple/maclc.cpp117
-rw-r--r--src/mame/apple/maclc3.cpp91
-rw-r--r--src/mame/apple/macpdm.cpp292
-rw-r--r--src/mame/apple/macprtb.cpp164
-rw-r--r--src/mame/apple/macpwrbk030.cpp1328
-rw-r--r--src/mame/apple/macpwrbkmsc.cpp950
-rw-r--r--src/mame/apple/macquadra605.cpp56
-rw-r--r--src/mame/apple/macquadra630.cpp23
-rw-r--r--src/mame/apple/macquadra700.cpp124
-rw-r--r--src/mame/apple/macquadra800.cpp49
-rw-r--r--src/mame/apple/macrtc.cpp21
-rw-r--r--src/mame/apple/macrtc.h9
-rw-r--r--src/mame/apple/macscsi.h4
-rw-r--r--src/mame/apple/msc.cpp508
-rw-r--r--src/mame/apple/msc.h149
-rw-r--r--src/mame/apple/newton.cpp23
-rw-r--r--src/mame/apple/omega.cpp22
-rw-r--r--src/mame/apple/omega.h2
-rw-r--r--src/mame/apple/pippin.cpp19
-rw-r--r--src/mame/apple/powermacg3.cpp14
-rw-r--r--src/mame/apple/prav8ckb.cpp248
-rw-r--r--src/mame/apple/prav8ckb.h65
-rw-r--r--src/mame/apple/rbv.cpp435
-rw-r--r--src/mame/apple/rbv.h48
-rw-r--r--src/mame/apple/scsidma.cpp17
-rw-r--r--src/mame/apple/scsidma.h8
-rw-r--r--src/mame/apple/sonora.cpp246
-rw-r--r--src/mame/apple/sonora.h28
-rw-r--r--src/mame/apple/superga2.cpp17
-rw-r--r--src/mame/apple/tk2000.cpp173
-rw-r--r--src/mame/apple/v8.cpp433
-rw-r--r--src/mame/apple/v8.h61
-rw-r--r--src/mame/apple/valkyrie.h10
-rw-r--r--src/mame/apple/vasp.cpp273
-rw-r--r--src/mame/apple/vasp.h25
-rw-r--r--src/mame/appliedconcepts/boris.cpp10
-rw-r--r--src/mame/appliedconcepts/borisdpl.cpp8
-rw-r--r--src/mame/appliedconcepts/ggm.cpp19
-rw-r--r--src/mame/appliedconcepts/prodigy.cpp4
-rw-r--r--src/mame/arcadia/arcadia.h6
-rw-r--r--src/mame/arcadia/arcadia_a.cpp9
-rw-r--r--src/mame/arcadia/arcadia_a.h6
-rw-r--r--src/mame/aristocrat/aristmk4.cpp785
-rw-r--r--src/mame/aristocrat/aristmk6.cpp809
-rw-r--r--src/mame/aristocrat/aristmk7.cpp8
-rw-r--r--src/mame/aristocrat/caswin.cpp6
-rw-r--r--src/mame/astrocorp/astrcorp.cpp4691
-rw-r--r--src/mame/astrocorp/astropc.cpp479
-rw-r--r--src/mame/astrocorp/hummer.cpp355
-rw-r--r--src/mame/atari/a2600.cpp32
-rw-r--r--src/mame/atari/a7800.cpp139
-rw-r--r--src/mame/atari/akkaarrh.cpp6
-rw-r--r--src/mame/atari/antic.h4
-rw-r--r--src/mame/atari/arcadecl.cpp47
-rw-r--r--src/mame/atari/asic65.cpp6
-rw-r--r--src/mame/atari/asic65.h18
-rw-r--r--src/mame/atari/asteroid.cpp20
-rw-r--r--src/mame/atari/asteroid.h10
-rw-r--r--src/mame/atari/atari400.cpp81
-rw-r--r--src/mame/atari/atari400.h2
-rw-r--r--src/mame/atari/atarifb.cpp6
-rw-r--r--src/mame/atari/atarifb.h14
-rw-r--r--src/mame/atari/atarifdc.h74
-rw-r--r--src/mame/atari/atarig1.cpp70
-rw-r--r--src/mame/atari/atarig1.h48
-rw-r--r--src/mame/atari/atarig1_v.cpp34
-rw-r--r--src/mame/atari/atarig42.cpp66
-rw-r--r--src/mame/atari/atarig42.h49
-rw-r--r--src/mame/atari/atarig42_v.cpp52
-rw-r--r--src/mame/atari/atarigen.h4
-rw-r--r--src/mame/atari/atarigt.cpp158
-rw-r--r--src/mame/atari/atarigt.h59
-rw-r--r--src/mame/atari/atarigt_v.cpp55
-rw-r--r--src/mame/atari/atarigx2.cpp180
-rw-r--r--src/mame/atari/atarigx2.h31
-rw-r--r--src/mame/atari/atarigx2_v.cpp51
-rw-r--r--src/mame/atari/atarijsa.cpp66
-rw-r--r--src/mame/atari/atarijsa.h52
-rw-r--r--src/mame/atari/atarimo.cpp49
-rw-r--r--src/mame/atari/atarimo.h23
-rw-r--r--src/mame/atari/atarirle.cpp94
-rw-r--r--src/mame/atari/atarirle.h48
-rw-r--r--src/mame/atari/atarisac.cpp16
-rw-r--r--src/mame/atari/atarisac.h18
-rw-r--r--src/mame/atari/atariscom.h8
-rw-r--r--src/mame/atari/atarist.cpp72
-rw-r--r--src/mame/atari/atarist_v.h6
-rw-r--r--src/mame/atari/ataristb.h4
-rw-r--r--src/mame/atari/atarisy1.cpp196
-rw-r--r--src/mame/atari/atarisy1.h98
-rw-r--r--src/mame/atari/atarisy1_v.cpp157
-rw-r--r--src/mame/atari/atarisy2.cpp429
-rw-r--r--src/mame/atari/atarisy2.h86
-rw-r--r--src/mame/atari/atarisy2_v.cpp64
-rw-r--r--src/mame/atari/atarisy4.cpp34
-rw-r--r--src/mame/atari/atarittl.cpp60
-rw-r--r--src/mame/atari/atarivad.cpp21
-rw-r--r--src/mame/atari/atarivad.h4
-rw-r--r--src/mame/atari/atarixga.cpp4
-rw-r--r--src/mame/atari/atarixga.h8
-rw-r--r--src/mame/atari/atetris.cpp18
-rw-r--r--src/mame/atari/avalnche.cpp2
-rw-r--r--src/mame/atari/avalnche.h6
-rw-r--r--src/mame/atari/badlands.cpp24
-rw-r--r--src/mame/atari/badlands.h25
-rw-r--r--src/mame/atari/badlands_m.cpp6
-rw-r--r--src/mame/atari/badlands_ms.cpp13
-rw-r--r--src/mame/atari/badlands_v.cpp98
-rw-r--r--src/mame/atari/badlandsbl.cpp19
-rw-r--r--src/mame/atari/bartop52.cpp4
-rw-r--r--src/mame/atari/batman.cpp193
-rw-r--r--src/mame/atari/beathead.cpp6
-rw-r--r--src/mame/atari/blstroid.cpp77
-rw-r--r--src/mame/atari/boxer.cpp6
-rw-r--r--src/mame/atari/bsktball.cpp2
-rw-r--r--src/mame/atari/bsktball.h8
-rw-r--r--src/mame/atari/bwidow.cpp30
-rw-r--r--src/mame/atari/bwidow.h8
-rw-r--r--src/mame/atari/bzone.cpp17
-rw-r--r--src/mame/atari/bzone.h16
-rw-r--r--src/mame/atari/canyon.cpp13
-rw-r--r--src/mame/atari/cball.cpp15
-rw-r--r--src/mame/atari/ccastles.cpp10
-rw-r--r--src/mame/atari/centiped.cpp16
-rw-r--r--src/mame/atari/centiped.h30
-rw-r--r--src/mame/atari/cloak.cpp14
-rw-r--r--src/mame/atari/cloud9.cpp12
-rw-r--r--src/mame/atari/cmmb.cpp8
-rw-r--r--src/mame/atari/cops.cpp180
-rw-r--r--src/mame/atari/copsnrob.cpp13
-rw-r--r--src/mame/atari/cyberbal.cpp79
-rw-r--r--src/mame/atari/cybstorm.cpp188
-rw-r--r--src/mame/atari/destroyr.cpp12
-rw-r--r--src/mame/atari/dragrace.cpp19
-rw-r--r--src/mame/atari/eprom.cpp367
-rw-r--r--src/mame/atari/firefox.cpp29
-rw-r--r--src/mame/atari/firetrk.cpp156
-rw-r--r--src/mame/atari/flyball.cpp10
-rw-r--r--src/mame/atari/foodf.cpp8
-rw-r--r--src/mame/atari/gauntlet.cpp208
-rw-r--r--src/mame/atari/gtia.h4
-rw-r--r--src/mame/atari/gumrally.cpp4
-rw-r--r--src/mame/atari/harddriv.cpp255
-rw-r--r--src/mame/atari/harddriv.h153
-rw-r--r--src/mame/atari/harddriv_a.cpp11
-rw-r--r--src/mame/atari/hitparade.cpp6
-rw-r--r--src/mame/atari/irobot.cpp98
-rw-r--r--src/mame/atari/irobot.h168
-rw-r--r--src/mame/atari/irobot_m.cpp954
-rw-r--r--src/mame/atari/irobot_v.cpp278
-rw-r--r--src/mame/atari/jag_blitter.h6
-rw-r--r--src/mame/atari/jagblit.ipp144
-rw-r--r--src/mame/atari/jagobj.ipp509
-rw-r--r--src/mame/atari/jaguar.cpp737
-rw-r--r--src/mame/atari/jaguar.h167
-rw-r--r--src/mame/atari/jaguar_a.cpp166
-rw-r--r--src/mame/atari/jaguar_v.cpp178
-rw-r--r--src/mame/atari/jedi.cpp37
-rw-r--r--src/mame/atari/klax.cpp84
-rw-r--r--src/mame/atari/liberatr.cpp12
-rw-r--r--src/mame/atari/lynx.cpp11
-rw-r--r--src/mame/atari/lynx.h8
-rw-r--r--src/mame/atari/lynx_m.cpp6
-rw-r--r--src/mame/atari/marblmd2.cpp59
-rw-r--r--src/mame/atari/maria.cpp245
-rw-r--r--src/mame/atari/maria.h67
-rw-r--r--src/mame/atari/mathbox.h4
-rw-r--r--src/mame/atari/maxaflex.cpp8
-rw-r--r--src/mame/atari/mediagx.cpp19
-rw-r--r--src/mame/atari/metalmx.cpp31
-rw-r--r--src/mame/atari/mgolf.cpp10
-rw-r--r--src/mame/atari/mhavoc.cpp42
-rw-r--r--src/mame/atari/missile.cpp16
-rw-r--r--src/mame/atari/nitedrvr.cpp8
-rw-r--r--src/mame/atari/nl_flyball.cpp2
-rw-r--r--src/mame/atari/nl_flyball.h2
-rw-r--r--src/mame/atari/offtwall.cpp91
-rw-r--r--src/mame/atari/orbit.cpp17
-rw-r--r--src/mame/atari/pofo.cpp223
-rw-r--r--src/mame/atari/pofo_kbd.h4
-rw-r--r--src/mame/atari/pong.cpp12
-rw-r--r--src/mame/atari/poolshrk.cpp14
-rw-r--r--src/mame/atari/quantum.cpp4
-rw-r--r--src/mame/atari/quizshow.cpp14
-rw-r--r--src/mame/atari/rampart.cpp163
-rw-r--r--src/mame/atari/redbaron.cpp24
-rw-r--r--src/mame/atari/redbaron.h6
-rw-r--r--src/mame/atari/relief.cpp116
-rw-r--r--src/mame/atari/runaway.cpp16
-rw-r--r--src/mame/atari/sbrkout.cpp51
-rw-r--r--src/mame/atari/shuuz.cpp106
-rw-r--r--src/mame/atari/skullxbo.cpp171
-rw-r--r--src/mame/atari/skydiver.cpp6
-rw-r--r--src/mame/atari/skyraid.cpp6
-rw-r--r--src/mame/atari/slapstic.h4
-rw-r--r--src/mame/atari/sprint2.cpp72
-rw-r--r--src/mame/atari/sprint4.cpp41
-rw-r--r--src/mame/atari/sprint8.cpp16
-rw-r--r--src/mame/atari/starshp1.cpp20
-rw-r--r--src/mame/atari/starwars.cpp16
-rw-r--r--src/mame/atari/starwars.h8
-rw-r--r--src/mame/atari/stkbd.cpp27
-rw-r--r--src/mame/atari/stkbd.h8
-rw-r--r--src/mame/atari/stmmu.h6
-rw-r--r--src/mame/atari/stvideo.h6
-rw-r--r--src/mame/atari/subs.cpp13
-rw-r--r--src/mame/atari/tank8.cpp68
-rw-r--r--src/mame/atari/tempest.cpp20
-rw-r--r--src/mame/atari/thunderj.cpp248
-rw-r--r--src/mame/atari/tia.h4
-rw-r--r--src/mame/atari/tomcat.cpp35
-rw-r--r--src/mame/atari/toobin.cpp68
-rw-r--r--src/mame/atari/tourtabl.cpp11
-rw-r--r--src/mame/atari/triplhnt.cpp81
-rw-r--r--src/mame/atari/tunhunt.cpp10
-rw-r--r--src/mame/atari/ultratnk.cpp26
-rw-r--r--src/mame/atari/videopin.cpp10
-rw-r--r--src/mame/atari/vindictr.cpp129
-rw-r--r--src/mame/atari/wolfpack.cpp12
-rw-r--r--src/mame/atari/xybots.cpp100
-rw-r--r--src/mame/atlus/bowltry.cpp4
-rw-r--r--src/mame/atlus/cave.cpp1271
-rw-r--r--src/mame/atlus/cave.h303
-rw-r--r--src/mame/atlus/cave_v.cpp1126
-rw-r--r--src/mame/atlus/ohmygod.cpp23
-rw-r--r--src/mame/atlus/patapata.cpp46
-rw-r--r--src/mame/atlus/pitchtry.cpp167
-rw-r--r--src/mame/atlus/rallypnt.cpp11
-rw-r--r--src/mame/atlus/sprite013.cpp587
-rw-r--r--src/mame/atlus/sprite013.h96
-rw-r--r--src/mame/att/att3b2.cpp12
-rw-r--r--src/mame/att/att4425.cpp8
-rw-r--r--src/mame/att/att610.cpp12
-rw-r--r--src/mame/att/att630.cpp47
-rw-r--r--src/mame/att/blit.cpp12
-rw-r--r--src/mame/att/unixpc.cpp12
-rw-r--r--src/mame/ausnz/amust.cpp8
-rw-r--r--src/mame/ausnz/applix.cpp31
-rw-r--r--src/mame/ausnz/aussiebyte.cpp50
-rw-r--r--src/mame/ausnz/aussiebyte.h9
-rw-r--r--src/mame/ausnz/binbug.cpp4
-rw-r--r--src/mame/ausnz/d6800.cpp10
-rw-r--r--src/mame/ausnz/datum.cpp10
-rw-r--r--src/mame/ausnz/dg680.cpp8
-rw-r--r--src/mame/ausnz/dmax8000.cpp8
-rw-r--r--src/mame/ausnz/eacc.cpp6
-rw-r--r--src/mame/ausnz/eti660.cpp8
-rw-r--r--src/mame/ausnz/excali64.cpp20
-rw-r--r--src/mame/ausnz/labtam.cpp18
-rw-r--r--src/mame/ausnz/magnum.cpp154
-rw-r--r--src/mame/ausnz/mbee.cpp263
-rw-r--r--src/mame/ausnz/mbee.h31
-rw-r--r--src/mame/ausnz/pegasus.cpp8
-rw-r--r--src/mame/ausnz/pipbug.cpp8
-rw-r--r--src/mame/ausnz/poly.cpp50
-rw-r--r--src/mame/ausnz/poly.h18
-rw-r--r--src/mame/ausnz/poly_m.cpp7
-rw-r--r--src/mame/ausnz/proteus.cpp10
-rw-r--r--src/mame/ausnz/pulsar.cpp8
-rw-r--r--src/mame/ausnz/super80.cpp11
-rw-r--r--src/mame/ausnz/super80.h23
-rw-r--r--src/mame/ausnz/tec1.cpp12
-rw-r--r--src/mame/banctec/banctec.cpp8
-rw-r--r--src/mame/bandai/design_master.cpp6
-rw-r--r--src/mame/bandai/rx78.cpp10
-rw-r--r--src/mame/bandai/sv8000.cpp6
-rw-r--r--src/mame/bandai/tamag1.cpp173
-rw-r--r--src/mame/bandai/wswan.cpp627
-rw-r--r--src/mame/bandai/wswan_v.cpp836
-rw-r--r--src/mame/bandai/wswan_v.h88
-rw-r--r--src/mame/barcrest/mpu1.cpp47
-rw-r--r--src/mame/barcrest/mpu3.cpp55
-rw-r--r--src/mame/barcrest/mpu4.cpp100
-rw-r--r--src/mame/barcrest/mpu4.h14
-rw-r--r--src/mame/barcrest/mpu4_characteriser_bootleg.h14
-rw-r--r--src/mame/barcrest/mpu4_characteriser_pal.h4
-rw-r--r--src/mame/barcrest/mpu4_characteriser_pal_bwb.h4
-rw-r--r--src/mame/barcrest/mpu4_oki_sampled_sound.cpp4
-rw-r--r--src/mame/barcrest/mpu4_oki_sampled_sound.h4
-rw-r--r--src/mame/barcrest/mpu4bwb.cpp10
-rw-r--r--src/mame/barcrest/mpu4dealem.cpp6
-rw-r--r--src/mame/barcrest/mpu4mdm.cpp11
-rw-r--r--src/mame/barcrest/mpu4mod2sw.cpp11
-rw-r--r--src/mame/barcrest/mpu4mod4oki.cpp34
-rw-r--r--src/mame/barcrest/mpu4mod4yam.cpp10
-rw-r--r--src/mame/barcrest/mpu4plasma.cpp4
-rw-r--r--src/mame/barcrest/mpu4redpoint.cpp2
-rw-r--r--src/mame/barcrest/mpu4vid.cpp89
-rw-r--r--src/mame/barcrest/mpu5.cpp22
-rw-r--r--src/mame/barcrest/mpu5.h4
-rw-r--r--src/mame/barcrest/mpu5sw.cpp1262
-rw-r--r--src/mame/be/bebox.h8
-rw-r--r--src/mame/be/bebox_m.cpp4
-rw-r--r--src/mame/beehive/microb.cpp6
-rw-r--r--src/mame/benesse/challenge_gear.cpp49
-rw-r--r--src/mame/benesse/pockchal.cpp10
-rw-r--r--src/mame/bfm/bfcobra.cpp229
-rw-r--r--src/mame/bfm/bfm_ad5.cpp7
-rw-r--r--src/mame/bfm/bfm_ad5.h2
-rw-r--r--src/mame/bfm/bfm_ad5sw.cpp498
-rw-r--r--src/mame/bfm/bfm_adr2.h8
-rw-r--r--src/mame/bfm/bfm_bd1.h4
-rw-r--r--src/mame/bfm/bfm_bda.h4
-rw-r--r--src/mame/bfm/bfm_blackbox.cpp86
-rw-r--r--src/mame/bfm/bfm_cobra3.cpp599
-rw-r--r--src/mame/bfm/bfm_dm01.h14
-rw-r--r--src/mame/bfm/bfm_gu96x8m_k657c2.cpp13
-rw-r--r--src/mame/bfm/bfm_gu96x8m_k657c2.h10
-rw-r--r--src/mame/bfm/bfm_sc1.cpp35
-rw-r--r--src/mame/bfm/bfm_sc2.cpp73
-rw-r--r--src/mame/bfm/bfm_sc4.cpp51
-rw-r--r--src/mame/bfm/bfm_sc4.h12
-rw-r--r--src/mame/bfm/bfm_sc45_helper.cpp33
-rw-r--r--src/mame/bfm/bfm_sc5.cpp5
-rw-r--r--src/mame/bfm/bfm_sc5.h2
-rw-r--r--src/mame/bfm/bfm_sc5sw.cpp3364
-rw-r--r--src/mame/bfm/bfm_sc6.cpp8
-rw-r--r--src/mame/bfm/bfm_swp.cpp303
-rw-r--r--src/mame/bfm/bfmsys83.cpp6
-rw-r--r--src/mame/bfm/bfmsys85.cpp17
-rw-r--r--src/mame/bfm/rastersp.cpp119
-rw-r--r--src/mame/bitcorp/gamate.cpp18
-rw-r--r--src/mame/bitcorp/gamate_v.h10
-rw-r--r--src/mame/bmc/bmcbowl.cpp120
-rw-r--r--src/mame/bmc/bmcpokr.cpp802
-rw-r--r--src/mame/bmc/koftball.cpp554
-rw-r--r--src/mame/bmc/popobear.cpp461
-rw-r--r--src/mame/bondwell/bw12.cpp355
-rw-r--r--src/mame/bondwell/bw12.h144
-rw-r--r--src/mame/bondwell/bw2.cpp274
-rw-r--r--src/mame/bondwell/bw2.h101
-rw-r--r--src/mame/booth/apexc.h6
-rw-r--r--src/mame/bordun/att.cpp669
-rw-r--r--src/mame/bordun/skylncr.cpp (renamed from src/mame/misc/skylncr.cpp)311
-rw-r--r--src/mame/brainchild/pls1000.cpp209
-rw-r--r--src/mame/brother/pn8800fxb.cpp10
-rw-r--r--src/mame/burroughs/anzterm.cpp4
-rw-r--r--src/mame/burroughs/td831.cpp8
-rw-r--r--src/mame/camputers/camplynx.cpp16
-rw-r--r--src/mame/canon/canon_s80.cpp4
-rw-r--r--src/mame/canon/cat.cpp10
-rw-r--r--src/mame/canon/x07.cpp643
-rw-r--r--src/mame/canon/x07.h210
-rw-r--r--src/mame/cantab/jupace.cpp508
-rw-r--r--src/mame/capcom/1942.cpp126
-rw-r--r--src/mame/capcom/1942.h68
-rw-r--r--src/mame/capcom/1942_v.cpp27
-rw-r--r--src/mame/capcom/1943.cpp43
-rw-r--r--src/mame/capcom/1943.h41
-rw-r--r--src/mame/capcom/1943_v.cpp63
-rw-r--r--src/mame/capcom/alien.cpp78
-rw-r--r--src/mame/capcom/bionicc.cpp101
-rw-r--r--src/mame/capcom/blktiger.cpp35
-rw-r--r--src/mame/capcom/blktiger_ms.cpp66
-rw-r--r--src/mame/capcom/cbasebal.cpp22
-rw-r--r--src/mame/capcom/chakumelo.cpp106
-rw-r--r--src/mame/capcom/commando.cpp511
-rw-r--r--src/mame/capcom/cps1.cpp1090
-rw-r--r--src/mame/capcom/cps1.h198
-rw-r--r--src/mame/capcom/cps1_v.cpp1030
-rw-r--r--src/mame/capcom/cps1bl_5205.cpp132
-rw-r--r--src/mame/capcom/cps1bl_pic.cpp391
-rw-r--r--src/mame/capcom/cps2.cpp940
-rw-r--r--src/mame/capcom/cps2comm.cpp21
-rw-r--r--src/mame/capcom/cps2comm.h11
-rw-r--r--src/mame/capcom/cps3.cpp382
-rw-r--r--src/mame/capcom/cps3.h10
-rw-r--r--src/mame/capcom/cps3_a.cpp19
-rw-r--r--src/mame/capcom/cps3_a.h4
-rw-r--r--src/mame/capcom/egghunt.cpp12
-rw-r--r--src/mame/capcom/exedexes.cpp202
-rw-r--r--src/mame/capcom/fcrash.cpp383
-rw-r--r--src/mame/capcom/fcrash.h58
-rw-r--r--src/mame/capcom/gng.cpp461
-rw-r--r--src/mame/capcom/gunsmoke.cpp99
-rw-r--r--src/mame/capcom/higemaru.cpp66
-rw-r--r--src/mame/capcom/instantm.cpp12
-rw-r--r--src/mame/capcom/kenseim.cpp130
-rw-r--r--src/mame/capcom/lastduel.cpp546
-rw-r--r--src/mame/capcom/lastduel.h89
-rw-r--r--src/mame/capcom/lastduel_ms.cpp182
-rw-r--r--src/mame/capcom/lastduel_v.cpp246
-rw-r--r--src/mame/capcom/lwings.cpp1121
-rw-r--r--src/mame/capcom/mitchell.cpp166
-rw-r--r--src/mame/capcom/miteshin.cpp172
-rw-r--r--src/mame/capcom/psrockman.cpp6
-rw-r--r--src/mame/capcom/sf.cpp76
-rw-r--r--src/mame/capcom/sidearms.cpp432
-rw-r--r--src/mame/capcom/sidearms.h40
-rw-r--r--src/mame/capcom/sidearms_v.cpp59
-rw-r--r--src/mame/capcom/sonson.cpp9
-rw-r--r--src/mame/capcom/srumbler.cpp92
-rw-r--r--src/mame/capcom/supduck.cpp22
-rw-r--r--src/mame/capcom/tigeroad.cpp382
-rw-r--r--src/mame/capcom/tigeroad.h107
-rw-r--r--src/mame/capcom/tigeroad_spr.cpp26
-rw-r--r--src/mame/capcom/tigeroad_spr.h3
-rw-r--r--src/mame/capcom/tigeroad_v.cpp16
-rw-r--r--src/mame/capcom/tvcapcom.cpp8
-rw-r--r--src/mame/capcom/vulgus.cpp268
-rw-r--r--src/mame/casio/casio_rompack.cpp2
-rw-r--r--src/mame/casio/casloopy.cpp8
-rw-r--r--src/mame/casio/cfx9850.cpp12
-rw-r--r--src/mame/casio/cps2000.cpp401
-rw-r--r--src/mame/casio/ct8000.cpp874
-rw-r--r--src/mame/casio/ct8000_midi.cpp409
-rw-r--r--src/mame/casio/ct8000_midi.h89
-rw-r--r--src/mame/casio/ctk2000.cpp138
-rw-r--r--src/mame/casio/ctk551.cpp438
-rw-r--r--src/mame/casio/cz1.cpp45
-rw-r--r--src/mame/casio/cz101.cpp12
-rw-r--r--src/mame/casio/cz230s.cpp115
-rw-r--r--src/mame/casio/dg20.cpp445
-rw-r--r--src/mame/casio/fp1100.cpp61
-rw-r--r--src/mame/casio/fp200.cpp140
-rw-r--r--src/mame/casio/fp6000.cpp14
-rw-r--r--src/mame/casio/fp6000_kbd.h6
-rw-r--r--src/mame/casio/fz1.cpp732
-rw-r--r--src/mame/casio/ht6000.cpp8
-rw-r--r--src/mame/casio/ld50.cpp36
-rw-r--r--src/mame/casio/pb1000.cpp6
-rw-r--r--src/mame/casio/pickytlk.cpp686
-rw-r--r--src/mame/casio/pv1000.cpp235
-rw-r--r--src/mame/casio/pv2000.cpp8
-rw-r--r--src/mame/casio/ra3.h4
-rw-r--r--src/mame/casio/rz1.cpp10
-rw-r--r--src/mame/casio/sk1.cpp115
-rw-r--r--src/mame/casio/superjr.cpp299
-rw-r--r--src/mame/casio/sx1000.cpp10
-rw-r--r--src/mame/casio/wk1800.cpp646
-rw-r--r--src/mame/casio/zoomer.cpp700
-rw-r--r--src/mame/casio/zoomer_rtc.cpp150
-rw-r--r--src/mame/casio/zoomer_rtc.h72
-rw-r--r--src/mame/cave/cavepc.cpp11
-rw-r--r--src/mame/cave/cv1k.cpp281
-rw-r--r--src/mame/cave/cv1k_v.cpp1023
-rw-r--r--src/mame/cave/cv1k_v.h895
-rw-r--r--src/mame/cave/cv1k_v_blit0.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit1.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit2.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit3.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit4.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit5.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit6.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit7.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit8.cpp42
-rw-r--r--src/mame/cave/cv1k_v_in.ipp155
-rw-r--r--src/mame/cave/cv1k_v_pixel.ipp193
-rw-r--r--src/mame/cave/ep1c12.cpp991
-rw-r--r--src/mame/cave/ep1c12.h893
-rw-r--r--src/mame/cave/ep1c12_blit0.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit1.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit2.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit3.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit4.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit5.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit6.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit7.cpp559
-rw-r--r--src/mame/cave/ep1c12_blit8.cpp42
-rw-r--r--src/mame/cave/ep1c12in.ipp155
-rw-r--r--src/mame/cave/ep1c12pixel.ipp193
-rw-r--r--src/mame/cave/fstgfish.cpp56
-rw-r--r--src/mame/cce/mc1000.cpp12
-rw-r--r--src/mame/ccs/ccs2810.cpp28
-rw-r--r--src/mame/ceres/ceres.cpp12
-rw-r--r--src/mame/ces/cesclass.cpp154
-rw-r--r--src/mame/ces/galgames.cpp93
-rw-r--r--src/mame/chess/ave_arb.cpp10
-rw-r--r--src/mame/chess/cking_master.cpp265
-rw-r--r--src/mame/chess/cking_triomphe.cpp189
-rw-r--r--src/mame/chess/compuchess.cpp20
-rw-r--r--src/mame/chess/conchess.cpp35
-rw-r--r--src/mame/chess/conic_cchess2.cpp6
-rw-r--r--src/mame/chess/conic_cchess3.cpp6
-rw-r--r--src/mame/chess/krypton_regency.cpp350
-rw-r--r--src/mame/chess/regence.cpp10
-rw-r--r--src/mame/chess/tasc.cpp72
-rw-r--r--src/mame/chessking/master.cpp266
-rw-r--r--src/mame/chessking/pmicrodx.cpp248
-rw-r--r--src/mame/chessking/triomphe.cpp191
-rw-r--r--src/mame/chromatics/cgc7900.h10
-rw-r--r--src/mame/ci.flt4
-rw-r--r--src/mame/cinematronics/cchasm.cpp14
-rw-r--r--src/mame/cinematronics/cinemat.cpp53
-rw-r--r--src/mame/cinematronics/cinemat.h53
-rw-r--r--src/mame/cinematronics/cinemat_a.cpp4
-rw-r--r--src/mame/cinematronics/cinemat_a.h4
-rw-r--r--src/mame/cinematronics/cinemat_v.cpp2
-rw-r--r--src/mame/cinematronics/dlair.cpp44
-rw-r--r--src/mame/cinematronics/dlair2.cpp42
-rw-r--r--src/mame/cinematronics/embargo.cpp10
-rw-r--r--src/mame/cinematronics/jack.cpp783
-rw-r--r--src/mame/cinematronics/jack.h112
-rw-r--r--src/mame/cinematronics/jack_v.cpp221
-rw-r--r--src/mame/cinematronics/leland.cpp285
-rw-r--r--src/mame/cinematronics/leland.h276
-rw-r--r--src/mame/cinematronics/leland_a.cpp77
-rw-r--r--src/mame/cinematronics/leland_a.h30
-rw-r--r--src/mame/cinematronics/leland_m.cpp477
-rw-r--r--src/mame/cinematronics/leland_v.cpp185
-rw-r--r--src/mame/cirsa/cirsa2080606.cpp198
-rw-r--r--src/mame/cirsa/cirsa820xxx.cpp6
-rw-r--r--src/mame/cirsa/cirsa910510.cpp16
-rw-r--r--src/mame/cirsa/miniguay.cpp45
-rw-r--r--src/mame/cirsa/missbamby.cpp41
-rw-r--r--src/mame/cirsa/neptunp2.cpp295
-rw-r--r--src/mame/citoh/cit101.cpp10
-rw-r--r--src/mame/citoh/cit101_kbd.h18
-rw-r--r--src/mame/citoh/cit101xl.cpp10
-rw-r--r--src/mame/citoh/cit220.cpp14
-rw-r--r--src/mame/citoh/cit220_kbd.h14
-rw-r--r--src/mame/coleco/adam.cpp67
-rw-r--r--src/mame/coleco/adam.h16
-rw-r--r--src/mame/coleco/coleco.cpp29
-rw-r--r--src/mame/coleco/coleco.h77
-rw-r--r--src/mame/coleco/wrinkles.cpp4
-rw-r--r--src/mame/comad/funybubl.cpp14
-rw-r--r--src/mame/comad/galspnbl.cpp6
-rw-r--r--src/mame/comad/zerozone.cpp28
-rw-r--r--src/mame/commodore/c128.cpp82
-rw-r--r--src/mame/commodore/c64.cpp75
-rw-r--r--src/mame/commodore/c64dtv.cpp2
-rw-r--r--src/mame/commodore/c65.cpp914
-rw-r--r--src/mame/commodore/c900.cpp12
-rw-r--r--src/mame/commodore/cbm2.cpp12
-rw-r--r--src/mame/commodore/chessmate.cpp109
-rw-r--r--src/mame/commodore/clcd.cpp66
-rw-r--r--src/mame/commodore/kim1.cpp12
-rw-r--r--src/mame/commodore/mps1230.cpp6
-rw-r--r--src/mame/commodore/pet.cpp269
-rw-r--r--src/mame/commodore/plus4.cpp88
-rw-r--r--src/mame/commodore/vic10.cpp10
-rw-r--r--src/mame/commodore/vic20.cpp12
-rw-r--r--src/mame/compugraphic/pwrview.cpp12
-rw-r--r--src/mame/comx/comx35.cpp10
-rw-r--r--src/mame/comx/comx35.h12
-rw-r--r--src/mame/comx/comx35_v.cpp13
-rw-r--r--src/mame/concept/concept.cpp153
-rw-r--r--src/mame/concept/concept.h12
-rw-r--r--src/mame/concept/concept_kbd.cpp227
-rw-r--r--src/mame/concept/concept_kbd.h62
-rw-r--r--src/mame/concept/concept_m.cpp54
-rw-r--r--src/mame/conitec/prof180x.h8
-rw-r--r--src/mame/conitec/prof80.h8
-rw-r--r--src/mame/conitec/prof80mmu.h6
-rw-r--r--src/mame/cromemco/c10.cpp8
-rw-r--r--src/mame/cromemco/mcb216.cpp8
-rw-r--r--src/mame/cvs/cvs_base.cpp105
-rw-r--r--src/mame/cvs/cvs_base.h84
-rw-r--r--src/mame/cvs/galaxia.cpp759
-rw-r--r--src/mame/cvs/quasar.cpp634
-rw-r--r--src/mame/cxg/computachess.cpp247
-rw-r--r--src/mame/cybiko/cybiko.h10
-rw-r--r--src/mame/dai/dai.cpp7
-rw-r--r--src/mame/dai/dai.h6
-rw-r--r--src/mame/dai/dai_snd.cpp11
-rw-r--r--src/mame/dai/dai_snd.h6
-rw-r--r--src/mame/dataeast/actfancr.cpp22
-rw-r--r--src/mame/dataeast/astrof.cpp54
-rw-r--r--src/mame/dataeast/astrof.h14
-rw-r--r--src/mame/dataeast/backfire.cpp23
-rw-r--r--src/mame/dataeast/battlera.cpp126
-rw-r--r--src/mame/dataeast/boogwing.cpp617
-rw-r--r--src/mame/dataeast/boogwing.h72
-rw-r--r--src/mame/dataeast/boogwing_v.cpp317
-rw-r--r--src/mame/dataeast/brkthru.cpp515
-rw-r--r--src/mame/dataeast/btime.cpp1664
-rw-r--r--src/mame/dataeast/btime.h163
-rw-r--r--src/mame/dataeast/btime_m.cpp93
-rw-r--r--src/mame/dataeast/btime_v.cpp551
-rw-r--r--src/mame/dataeast/bwing.cpp331
-rw-r--r--src/mame/dataeast/cbuster.cpp12
-rw-r--r--src/mame/dataeast/chanbara.cpp248
-rw-r--r--src/mame/dataeast/cninja.cpp8
-rw-r--r--src/mame/dataeast/cninja.h24
-rw-r--r--src/mame/dataeast/cntsteer.cpp75
-rw-r--r--src/mame/dataeast/compgolf.cpp9
-rw-r--r--src/mame/dataeast/darkseal.cpp6
-rw-r--r--src/mame/dataeast/dassault.cpp74
-rw-r--r--src/mame/dataeast/dblewing.cpp10
-rw-r--r--src/mame/dataeast/dec0.cpp537
-rw-r--r--src/mame/dataeast/dec0.h285
-rw-r--r--src/mame/dataeast/dec0_m.cpp134
-rw-r--r--src/mame/dataeast/dec0_v.cpp159
-rw-r--r--src/mame/dataeast/dec8.cpp2371
-rw-r--r--src/mame/dataeast/dec8.h239
-rw-r--r--src/mame/dataeast/dec8_v.cpp168
-rw-r--r--src/mame/dataeast/decbac06.cpp7
-rw-r--r--src/mame/dataeast/decbac06.h10
-rw-r--r--src/mame/dataeast/deckarn.cpp94
-rw-r--r--src/mame/dataeast/deckarn.h3
-rw-r--r--src/mame/dataeast/decmxc06.h4
-rw-r--r--src/mame/dataeast/deco104.cpp12
-rw-r--r--src/mame/dataeast/deco104.h4
-rw-r--r--src/mame/dataeast/deco146.cpp176
-rw-r--r--src/mame/dataeast/deco146.h64
-rw-r--r--src/mame/dataeast/deco156.cpp46
-rw-r--r--src/mame/dataeast/deco156_m.cpp70
-rw-r--r--src/mame/dataeast/deco16ic.h4
-rw-r--r--src/mame/dataeast/deco222.cpp12
-rw-r--r--src/mame/dataeast/deco222.h16
-rw-r--r--src/mame/dataeast/deco32.cpp396
-rw-r--r--src/mame/dataeast/deco32.h88
-rw-r--r--src/mame/dataeast/deco32_v.cpp43
-rw-r--r--src/mame/dataeast/deco_ace.h4
-rw-r--r--src/mame/dataeast/deco_irq.h6
-rw-r--r--src/mame/dataeast/deco_ld.cpp218
-rw-r--r--src/mame/dataeast/deco_mlc.cpp24
-rw-r--r--src/mame/dataeast/deco_mlc.h15
-rw-r--r--src/mame/dataeast/deco_mlc_v.cpp26
-rw-r--r--src/mame/dataeast/decocass.cpp226
-rw-r--r--src/mame/dataeast/decocass.h160
-rw-r--r--src/mame/dataeast/decocass_m.cpp60
-rw-r--r--src/mame/dataeast/decocass_tape.cpp9
-rw-r--r--src/mame/dataeast/decocass_tape.h14
-rw-r--r--src/mame/dataeast/decocass_v.cpp36
-rw-r--r--src/mame/dataeast/decocomn.cpp101
-rw-r--r--src/mame/dataeast/decocomn.h52
-rw-r--r--src/mame/dataeast/decocpu6.cpp6
-rw-r--r--src/mame/dataeast/decocpu6.h4
-rw-r--r--src/mame/dataeast/decocpu7.cpp20
-rw-r--r--src/mame/dataeast/decocpu7.h8
-rw-r--r--src/mame/dataeast/decrmc3.h10
-rw-r--r--src/mame/dataeast/deshoros.cpp12
-rw-r--r--src/mame/dataeast/dfruit2.cpp449
-rw-r--r--src/mame/dataeast/dietgo.cpp75
-rw-r--r--src/mame/dataeast/dreambal.cpp8
-rw-r--r--src/mame/dataeast/exprraid.cpp54
-rw-r--r--src/mame/dataeast/ffantasy_ms.cpp218
-rw-r--r--src/mame/dataeast/firetrap.cpp24
-rw-r--r--src/mame/dataeast/funkyjet.cpp21
-rw-r--r--src/mame/dataeast/karnov.cpp197
-rw-r--r--src/mame/dataeast/kchamp.cpp71
-rw-r--r--src/mame/dataeast/kchamp.h33
-rw-r--r--src/mame/dataeast/kchamp_v.cpp63
-rw-r--r--src/mame/dataeast/kingobox.cpp833
-rw-r--r--src/mame/dataeast/kingobox.h105
-rw-r--r--src/mame/dataeast/kingobox_v.cpp305
-rw-r--r--src/mame/dataeast/lemmings.cpp21
-rw-r--r--src/mame/dataeast/liberate.cpp247
-rw-r--r--src/mame/dataeast/liberate.h55
-rw-r--r--src/mame/dataeast/liberate_v.cpp11
-rw-r--r--src/mame/dataeast/madalien.cpp14
-rw-r--r--src/mame/dataeast/madalien.h6
-rw-r--r--src/mame/dataeast/madalien_v.cpp2
-rw-r--r--src/mame/dataeast/madmotor.cpp171
-rw-r--r--src/mame/dataeast/metlclsh.cpp27
-rw-r--r--src/mame/dataeast/mirage.cpp95
-rw-r--r--src/mame/dataeast/pcktgal.cpp6
-rw-r--r--src/mame/dataeast/pktgaldx.cpp8
-rw-r--r--src/mame/dataeast/progolf.cpp16
-rw-r--r--src/mame/dataeast/rohga.cpp1080
-rw-r--r--src/mame/dataeast/rohga.h103
-rw-r--r--src/mame/dataeast/rohga_v.cpp357
-rw-r--r--src/mame/dataeast/scregg.cpp437
-rw-r--r--src/mame/dataeast/shootout.cpp35
-rw-r--r--src/mame/dataeast/sidepckt.cpp14
-rw-r--r--src/mame/dataeast/simpl156.cpp157
-rw-r--r--src/mame/dataeast/simpl156.h90
-rw-r--r--src/mame/dataeast/simpl156_v.cpp37
-rw-r--r--src/mame/dataeast/sshangha.cpp10
-rw-r--r--src/mame/dataeast/stadhero.cpp8
-rw-r--r--src/mame/dataeast/supbtime.cpp189
-rw-r--r--src/mame/dataeast/supbtime.h64
-rw-r--r--src/mame/dataeast/supbtime_v.cpp73
-rw-r--r--src/mame/dataeast/thedeep.cpp10
-rw-r--r--src/mame/dataeast/tryout.cpp14
-rw-r--r--src/mame/dataeast/tumbleb.cpp723
-rw-r--r--src/mame/dataeast/tumbleb.h219
-rw-r--r--src/mame/dataeast/tumbleb_v.cpp487
-rw-r--r--src/mame/dataeast/vaportra.cpp10
-rw-r--r--src/mame/ddr/ac1.cpp10
-rw-r--r--src/mame/ddr/bcs3.cpp8
-rw-r--r--src/mame/ddr/c80.cpp10
-rw-r--r--src/mame/ddr/chessmst.cpp48
-rw-r--r--src/mame/ddr/chessmstdm.cpp12
-rw-r--r--src/mame/ddr/huebler.h6
-rw-r--r--src/mame/ddr/jtc.cpp10
-rw-r--r--src/mame/ddr/k7659kb.h10
-rw-r--r--src/mame/ddr/kc.cpp7
-rw-r--r--src/mame/ddr/kc_keyb.h6
-rw-r--r--src/mame/ddr/kc_m.cpp32
-rw-r--r--src/mame/ddr/kramermc.cpp8
-rw-r--r--src/mame/ddr/lc80.cpp16
-rw-r--r--src/mame/ddr/llc1.cpp54
-rw-r--r--src/mame/ddr/llc2.cpp8
-rw-r--r--src/mame/ddr/mc8020.cpp6
-rw-r--r--src/mame/ddr/mc8030.cpp6
-rw-r--r--src/mame/ddr/nanos.cpp8
-rw-r--r--src/mame/ddr/pcm.cpp8
-rw-r--r--src/mame/ddr/poly880.cpp12
-rw-r--r--src/mame/ddr/polyplay.cpp18
-rw-r--r--src/mame/ddr/polyplay.h10
-rw-r--r--src/mame/ddr/sc2.cpp8
-rw-r--r--src/mame/ddr/slc1.cpp20
-rw-r--r--src/mame/ddr/sprachmg.cpp20
-rw-r--r--src/mame/ddr/vcs80.cpp8
-rw-r--r--src/mame/dec/dc305.h4
-rw-r--r--src/mame/dec/dc7061.cpp74
-rw-r--r--src/mame/dec/dc7061.h10
-rw-r--r--src/mame/dec/dc7085.h12
-rw-r--r--src/mame/dec/dct11em.cpp10
-rw-r--r--src/mame/dec/decioga.h6
-rw-r--r--src/mame/dec/decmate2.cpp24
-rw-r--r--src/mame/dec/dectalk.cpp40
-rw-r--r--src/mame/dec/decwritr.cpp8
-rw-r--r--src/mame/dec/dtc03.cpp18
-rw-r--r--src/mame/dec/jensen.cpp23
-rw-r--r--src/mame/dec/kn01.cpp20
-rw-r--r--src/mame/dec/kn02.cpp20
-rw-r--r--src/mame/dec/lk201.h12
-rw-r--r--src/mame/dec/pdp1.cpp2
-rw-r--r--src/mame/dec/pdp1.h211
-rw-r--r--src/mame/dec/pdp11.cpp12
-rw-r--r--src/mame/dec/pdp1_v.cpp14
-rw-r--r--src/mame/dec/rainbow.cpp122
-rw-r--r--src/mame/dec/rx01.cpp11
-rw-r--r--src/mame/dec/rx01.h12
-rw-r--r--src/mame/dec/sfb.h4
-rw-r--r--src/mame/dec/uvax1.cpp88
-rw-r--r--src/mame/dec/uvax2.cpp65
-rw-r--r--src/mame/dec/uvax3.cpp66
-rw-r--r--src/mame/dec/uvax3100.cpp184
-rw-r--r--src/mame/dec/vax11.cpp2
-rw-r--r--src/mame/dec/vk100.cpp8
-rw-r--r--src/mame/dec/vt100.cpp42
-rw-r--r--src/mame/dec/vt220.cpp26
-rw-r--r--src/mame/dec/vt240.cpp12
-rw-r--r--src/mame/dec/vt320.cpp22
-rw-r--r--src/mame/dec/vt52.cpp20
-rw-r--r--src/mame/dec/vt520.cpp25
-rw-r--r--src/mame/dec/vt62.cpp8
-rw-r--r--src/mame/dec/vtvideo.h8
-rw-r--r--src/mame/dg/aviion88k.cpp13
-rw-r--r--src/mame/dgrm/blackt96.cpp133
-rw-r--r--src/mame/dgrm/onetwo.cpp (renamed from src/mame/misc/onetwo.cpp)12
-rw-r--r--src/mame/dgrm/pokechmp.cpp10
-rw-r--r--src/mame/dms/dms5000.cpp4
-rw-r--r--src/mame/dms/dms86.cpp8
-rw-r--r--src/mame/dms/zsbc3.cpp4
-rw-r--r--src/mame/dooyong/dooyong.cpp423
-rw-r--r--src/mame/dooyong/dooyong_tilemap.cpp30
-rw-r--r--src/mame/dooyong/dooyong_tilemap.h42
-rw-r--r--src/mame/dooyong/gundealr.cpp82
-rw-r--r--src/mame/drc/zrt80.cpp8
-rw-r--r--src/mame/dummy.lst8
-rw-r--r--src/mame/dynax/ddenlovr.cpp6428
-rw-r--r--src/mame/dynax/dynax.cpp3054
-rw-r--r--src/mame/dynax/dynax.h93
-rw-r--r--src/mame/dynax/dynax_blitter_rev2.h2
-rw-r--r--src/mame/dynax/dynax_v.cpp4
-rw-r--r--src/mame/dynax/hanafuda.cpp118
-rw-r--r--src/mame/dynax/hanafuda.h11
-rw-r--r--src/mame/dynax/hnayayoi.cpp156
-rw-r--r--src/mame/dynax/mjdipsw.h78
-rw-r--r--src/mame/dynax/realbrk.cpp256
-rw-r--r--src/mame/dynax/realbrk.h27
-rw-r--r--src/mame/dynax/realbrk_v.cpp57
-rw-r--r--src/mame/dynax/royalmah.cpp1823
-rw-r--r--src/mame/eaca/cgenie.cpp8
-rw-r--r--src/mame/edevices/diverboy.cpp165
-rw-r--r--src/mame/edevices/edevices.cpp69
-rw-r--r--src/mame/edevices/edevices.h23
-rw-r--r--src/mame/edevices/fantland.cpp260
-rw-r--r--src/mame/edevices/fantland.h114
-rw-r--r--src/mame/edevices/fantland_v.cpp148
-rw-r--r--src/mame/edevices/mugsmash.cpp17
-rw-r--r--src/mame/edevices/mwarr.cpp136
-rw-r--r--src/mame/edevices/ppmast93.cpp20
-rw-r--r--src/mame/edevices/pzletime.cpp161
-rw-r--r--src/mame/edevices/stlforce.cpp117
-rw-r--r--src/mame/edevices/twins.cpp16
-rw-r--r--src/mame/efo/cedar_magnet.cpp16
-rw-r--r--src/mame/efo/cedar_magnet_flop.h6
-rw-r--r--src/mame/efo/cedar_magnet_plane.h8
-rw-r--r--src/mame/efo/cedar_magnet_sprite.h12
-rw-r--r--src/mame/efo/cidelsa.cpp24
-rw-r--r--src/mame/efo/cidelsa.h38
-rw-r--r--src/mame/efo/nightmare.cpp183
-rw-r--r--src/mame/elektor/avrmax.cpp8
-rw-r--r--src/mame/elektor/ec65.cpp6
-rw-r--r--src/mame/elektor/elekscmp.cpp6
-rw-r--r--src/mame/elektor/junior.cpp8
-rw-r--r--src/mame/elektron/elektronmono.cpp10
-rw-r--r--src/mame/emusys/emax.cpp22
-rw-r--r--src/mame/emusys/emu2.cpp16
-rw-r--r--src/mame/emusys/emu3.cpp24
-rw-r--r--src/mame/emusys/emu68k.cpp26
-rw-r--r--src/mame/ensoniq/enmirage.cpp56
-rw-r--r--src/mame/ensoniq/esq1.cpp338
-rw-r--r--src/mame/ensoniq/esq5505.cpp801
-rw-r--r--src/mame/ensoniq/esqasr.cpp22
-rw-r--r--src/mame/ensoniq/esqkt.cpp38
-rw-r--r--src/mame/ensoniq/esqlcd.cpp2
-rw-r--r--src/mame/ensoniq/esqlcd.h8
-rw-r--r--src/mame/ensoniq/esqmr.cpp15
-rw-r--r--src/mame/ensoniq/esqpanel.cpp374
-rw-r--r--src/mame/ensoniq/esqpanel.h79
-rw-r--r--src/mame/ensoniq/esqvfd.cpp435
-rw-r--r--src/mame/ensoniq/esqvfd.h49
-rw-r--r--src/mame/ensoniq/vfxcart.cpp193
-rw-r--r--src/mame/ensoniq/vfxcart.h71
-rw-r--r--src/mame/enterprise/dave.cpp (renamed from src/devices/sound/dave.cpp)38
-rw-r--r--src/mame/enterprise/dave.h (renamed from src/devices/sound/dave.h)33
-rw-r--r--src/mame/enterprise/ep64.cpp41
-rw-r--r--src/mame/enterprise/nick.cpp36
-rw-r--r--src/mame/enterprise/nick.h11
-rw-r--r--src/mame/entex/advision.cpp35
-rw-r--r--src/mame/entex/sag.cpp2
-rw-r--r--src/mame/eolith/eolith.cpp32
-rw-r--r--src/mame/eolith/eolith16.cpp19
-rw-r--r--src/mame/eolith/ghosteo.cpp434
-rw-r--r--src/mame/eolith/vegaeo.cpp11
-rw-r--r--src/mame/epoch/cassvisn.cpp112
-rw-r--r--src/mame/epoch/gamepock.cpp14
-rw-r--r--src/mame/epoch/scv.cpp754
-rw-r--r--src/mame/epson/hx20.h8
-rw-r--r--src/mame/epson/px4.cpp156
-rw-r--r--src/mame/epson/px8.h10
-rw-r--r--src/mame/epson/qx10.cpp302
-rw-r--r--src/mame/ericsson/alfaskop41xx.cpp16
-rw-r--r--src/mame/ericsson/e9161.cpp6
-rw-r--r--src/mame/ericsson/eispc.cpp8
-rw-r--r--src/mame/ericsson/eispc_kb.h10
-rw-r--r--src/mame/esprit/esp250c.cpp14
-rw-r--r--src/mame/esprit/executive10.cpp8
-rw-r--r--src/mame/esprit/executive10_102_kbd.h10
-rw-r--r--src/mame/excalibur/ivant.cpp2
-rw-r--r--src/mame/excalibur/ivanto.cpp15
-rw-r--r--src/mame/excalibur/mirage.cpp336
-rw-r--r--src/mame/excellent/aquarium.cpp24
-rw-r--r--src/mame/excellent/d9final.cpp134
-rw-r--r--src/mame/excellent/dblcrown.cpp449
-rw-r--r--src/mame/excellent/es8906.cpp364
-rw-r--r--src/mame/excellent/es9501.cpp614
-rw-r--r--src/mame/excellent/es9606.cpp355
-rw-r--r--src/mame/excellent/excellent_spr.cpp139
-rw-r--r--src/mame/excellent/excellent_spr.h18
-rw-r--r--src/mame/excellent/gcpinbal.cpp67
-rw-r--r--src/mame/excellent/lastbank.cpp808
-rw-r--r--src/mame/excellent/witch.cpp26
-rw-r--r--src/mame/exidy/carpolo.cpp11
-rw-r--r--src/mame/exidy/carpolo.h8
-rw-r--r--src/mame/exidy/circus.cpp239
-rw-r--r--src/mame/exidy/circus.h10
-rw-r--r--src/mame/exidy/circus_v.cpp2
-rw-r--r--src/mame/exidy/exidy.cpp122
-rw-r--r--src/mame/exidy/exidy440.cpp101
-rw-r--r--src/mame/exidy/exidy440.h12
-rw-r--r--src/mame/exidy/exidy440_a.cpp26
-rw-r--r--src/mame/exidy/exidy440_a.h12
-rw-r--r--src/mame/exidy/exidyttl.cpp10
-rw-r--r--src/mame/exidy/micropolis.h4
-rw-r--r--src/mame/exidy/sorcerer.cpp110
-rw-r--r--src/mame/exidy/sorcerer.h23
-rw-r--r--src/mame/exidy/sorcerer_m.cpp8
-rw-r--r--src/mame/exidy/starfire.cpp7
-rw-r--r--src/mame/exidy/starfire.h12
-rw-r--r--src/mame/exidy/vertigo.cpp7
-rw-r--r--src/mame/exidy/vertigo.h10
-rw-r--r--src/mame/exidy/victory.h6
-rw-r--r--src/mame/f32/crospang.cpp22
-rw-r--r--src/mame/f32/f-32.cpp131
-rw-r--r--src/mame/f32/silvmil.cpp30
-rw-r--r--src/mame/facit/f4431.cpp8
-rw-r--r--src/mame/facit/f4431_kbd.cpp2
-rw-r--r--src/mame/facit/f4431_kbd.h14
-rw-r--r--src/mame/facit/facit4440.cpp6
-rw-r--r--src/mame/fairchild/channelf.h8
-rw-r--r--src/mame/fairchild/channelf_a.cpp10
-rw-r--r--src/mame/fairchild/channelf_a.h4
-rw-r--r--src/mame/fairchild/f387x.cpp4
-rw-r--r--src/mame/fairlight/cmi.cpp174
-rw-r--r--src/mame/fairlight/cmi01a.cpp106
-rw-r--r--src/mame/fairlight/cmi01a.h23
-rw-r--r--src/mame/fairlight/cmi_ankbd.h10
-rw-r--r--src/mame/fairlight/cmi_mkbd.cpp150
-rw-r--r--src/mame/fairlight/cmi_mkbd.h66
-rw-r--r--src/mame/falco/f5220_kbd.h6
-rw-r--r--src/mame/falco/falco500.cpp14
-rw-r--r--src/mame/falco/falcots.cpp307
-rw-r--r--src/mame/falco/falcots28.cpp12
-rw-r--r--src/mame/fidelity/bridgeb.cpp8
-rw-r--r--src/mame/fidelity/card.cpp137
-rw-r--r--src/mame/fidelity/cc1.cpp14
-rw-r--r--src/mame/fidelity/cc10.cpp47
-rw-r--r--src/mame/fidelity/cc7.cpp50
-rw-r--r--src/mame/fidelity/checkc2.cpp2
-rw-r--r--src/mame/fidelity/chesster.cpp19
-rw-r--r--src/mame/fidelity/clockdiv.cpp11
-rw-r--r--src/mame/fidelity/clockdiv.h10
-rw-r--r--src/mame/fidelity/csc.cpp112
-rw-r--r--src/mame/fidelity/dames.cpp27
-rw-r--r--src/mame/fidelity/desdis.cpp30
-rw-r--r--src/mame/fidelity/eag68k.cpp85
-rw-r--r--src/mame/fidelity/eldorado.cpp37
-rw-r--r--src/mame/fidelity/elegance.cpp31
-rw-r--r--src/mame/fidelity/elite.cpp436
-rw-r--r--src/mame/fidelity/excel.cpp369
-rw-r--r--src/mame/fidelity/msc.cpp53
-rw-r--r--src/mame/fidelity/phantom.cpp403
-rw-r--r--src/mame/fidelity/sc12.cpp28
-rw-r--r--src/mame/fidelity/sc6.cpp318
-rw-r--r--src/mame/fidelity/sc8.cpp18
-rw-r--r--src/mame/fidelity/sc9.cpp102
-rw-r--r--src/mame/fidelity/vcc.cpp109
-rw-r--r--src/mame/fidelity/vsc.cpp102
-rw-r--r--src/mame/force/miniforce.cpp37
-rw-r--r--src/mame/fujitsu/fm7.cpp12
-rw-r--r--src/mame/fujitsu/fm7.h34
-rw-r--r--src/mame/fujitsu/fmt_icmem.h4
-rw-r--r--src/mame/fujitsu/fmtowns.cpp101
-rw-r--r--src/mame/fujitsu/fmtowns.h83
-rw-r--r--src/mame/fujitsu/secoinsa20.cpp626
-rw-r--r--src/mame/funtech/acan.cpp292
-rw-r--r--src/mame/funtech/acan.h70
-rw-r--r--src/mame/funtech/funtech_h8.cpp433
-rw-r--r--src/mame/funtech/funtech_z80.cpp757
-rw-r--r--src/mame/funtech/supracan.cpp2225
-rw-r--r--src/mame/funworld/4roses.cpp12
-rw-r--r--src/mame/funworld/funworld.cpp51
-rw-r--r--src/mame/funworld/funworld.h44
-rw-r--r--src/mame/funworld/photoply.cpp8
-rw-r--r--src/mame/funworld/photoplys.cpp6
-rw-r--r--src/mame/funworld/photoplysx.cpp6
-rw-r--r--src/mame/funworld/snookr10.cpp40
-rw-r--r--src/mame/funworld/snookr10.h8
-rw-r--r--src/mame/funworld/supercrd.cpp10
-rw-r--r--src/mame/fuuki/fuukifg.cpp185
-rw-r--r--src/mame/fuuki/fuukifg.h38
-rw-r--r--src/mame/fuuki/fuukifg2.cpp383
-rw-r--r--src/mame/fuuki/fuukifg2.h92
-rw-r--r--src/mame/fuuki/fuukifg2_v.cpp201
-rw-r--r--src/mame/fuuki/fuukifg3.cpp464
-rw-r--r--src/mame/fuuki/fuukifg3.h108
-rw-r--r--src/mame/fuuki/fuukifg3_v.cpp228
-rw-r--r--src/mame/fuuki/fuukispr.cpp180
-rw-r--r--src/mame/fuuki/fuukispr.h39
-rw-r--r--src/mame/fuuki/fuukitmap.cpp263
-rw-r--r--src/mame/fuuki/fuukitmap.h119
-rw-r--r--src/mame/gaelco/atvtrack.cpp42
-rw-r--r--src/mame/gaelco/bigkarnk_ms.cpp113
-rw-r--r--src/mame/gaelco/blmbycar.cpp46
-rw-r--r--src/mame/gaelco/ds5002fp_programmer.cpp128
-rw-r--r--src/mame/gaelco/futbol3.cpp196
-rw-r--r--src/mame/gaelco/gaelco.cpp1046
-rw-r--r--src/mame/gaelco/gaelco.h183
-rw-r--r--src/mame/gaelco/gaelco2.cpp1432
-rw-r--r--src/mame/gaelco/gaelco2.h145
-rw-r--r--src/mame/gaelco/gaelco2_m.cpp43
-rw-r--r--src/mame/gaelco/gaelco2_v.cpp247
-rw-r--r--src/mame/gaelco/gaelco3d.cpp809
-rw-r--r--src/mame/gaelco/gaelco3d.h40
-rw-r--r--src/mame/gaelco/gaelco3d_m.cpp18
-rw-r--r--src/mame/gaelco/gaelco3d_m.h6
-rw-r--r--src/mame/gaelco/gaelco3d_v.cpp214
-rw-r--r--src/mame/gaelco/gaelco_ds5002fp.cpp13
-rw-r--r--src/mame/gaelco/gaelco_ds5002fp.h17
-rw-r--r--src/mame/gaelco/gaelco_v.cpp97
-rw-r--r--src/mame/gaelco/gaelco_wrally_sprites.cpp52
-rw-r--r--src/mame/gaelco/gaelco_wrally_sprites.h26
-rw-r--r--src/mame/gaelco/gaelcof3.cpp147
-rw-r--r--src/mame/gaelco/gaelcopc.cpp21
-rw-r--r--src/mame/gaelco/gaelcrpt.h4
-rw-r--r--src/mame/gaelco/glass.cpp411
-rw-r--r--src/mame/gaelco/goldart.cpp351
-rw-r--r--src/mame/gaelco/lotoplay.cpp146
-rw-r--r--src/mame/gaelco/mastboy.cpp1110
-rw-r--r--src/mame/gaelco/mastboyo.cpp44
-rw-r--r--src/mame/gaelco/mastboyo_ms.cpp267
-rw-r--r--src/mame/gaelco/radsys.cpp82
-rw-r--r--src/mame/gaelco/rollext.cpp37
-rw-r--r--src/mame/gaelco/scalextric.cpp319
-rw-r--r--src/mame/gaelco/splash.cpp1388
-rw-r--r--src/mame/gaelco/splash.h164
-rw-r--r--src/mame/gaelco/splash_ms.cpp179
-rw-r--r--src/mame/gaelco/splash_v.cpp176
-rw-r--r--src/mame/gaelco/sralslot.cpp105
-rw-r--r--src/mame/gaelco/targeth.cpp137
-rw-r--r--src/mame/gaelco/thoop2.cpp212
-rw-r--r--src/mame/gaelco/wrally.cpp250
-rw-r--r--src/mame/gaelco/wrally_ms.cpp593
-rw-r--r--src/mame/gaelco/xorworld.cpp29
-rw-r--r--src/mame/gaelco/xorworld_ms.cpp540
-rw-r--r--src/mame/galaxian/119.cpp343
-rw-r--r--src/mame/galaxian/dambustr.cpp2
-rw-r--r--src/mame/galaxian/fastfred.cpp2
-rw-r--r--src/mame/galaxian/fastfred.h10
-rw-r--r--src/mame/galaxian/galaxian.cpp623
-rw-r--r--src/mame/galaxian/galaxian.h526
-rw-r--r--src/mame/galaxian/galaxian_a.h12
-rw-r--r--src/mame/galaxian/galaxian_rockclim.cpp6
-rw-r--r--src/mame/galaxian/galaxian_v.cpp130
-rw-r--r--src/mame/galaxian/galaxold.cpp447
-rw-r--r--src/mame/galaxian/galaxold.h70
-rw-r--r--src/mame/galaxian/galaxold_m.cpp19
-rw-r--r--src/mame/galaxian/galaxold_v.cpp21
-rw-r--r--src/mame/galaxian/scobra.cpp40
-rw-r--r--src/mame/galaxian/scramble.cpp2
-rw-r--r--src/mame/galaxian/scramble.h41
-rw-r--r--src/mame/galaxian/scramble_m.cpp11
-rw-r--r--src/mame/gamepark/gp2x.cpp5
-rw-r--r--src/mame/gamepark/gp32.cpp14
-rw-r--r--src/mame/gamepark/gp32.h13
-rw-r--r--src/mame/gametron/gatron.cpp8
-rw-r--r--src/mame/gametron/gotya.cpp8
-rw-r--r--src/mame/gametron/sbugger.cpp6
-rw-r--r--src/mame/gottlieb/exterm.cpp6
-rw-r--r--src/mame/gottlieb/gottlieb.cpp868
-rw-r--r--src/mame/gridcomp/gridcomp.cpp334
-rw-r--r--src/mame/gridcomp/gridkeyb.cpp142
-rw-r--r--src/mame/gridcomp/gridkeyb.h6
-rw-r--r--src/mame/gridcomp/gridrom.cpp63
-rw-r--r--src/mame/gridcomp/gridrom.h49
-rw-r--r--src/mame/grundy/newbrain.h10
-rw-r--r--src/mame/handheld/chessking.cpp15
-rw-r--r--src/mame/handheld/dbridgec.cpp260
-rw-r--r--src/mame/handheld/evolution_handheld.cpp261
-rw-r--r--src/mame/handheld/gameking.cpp6
-rw-r--r--src/mame/handheld/generalplus_gp3x_unknown.cpp116
-rw-r--r--src/mame/handheld/generalplus_gpce4.cpp498
-rw-r--r--src/mame/handheld/generalplus_gpel31xx.cpp84
-rw-r--r--src/mame/handheld/generalplus_gpl162xx_lcdtype.cpp (renamed from src/mame/tvgames/generalplus_gpl162xx_lcdtype.cpp)202
-rw-r--r--src/mame/handheld/generalplus_gpl951xx.cpp743
-rw-r--r--src/mame/handheld/gmaster.cpp6
-rw-r--r--src/mame/handheld/gw35th.cpp86
-rw-r--r--src/mame/handheld/hh_cop400.cpp324
-rw-r--r--src/mame/handheld/hh_cops1.cpp4
-rw-r--r--src/mame/handheld/hh_e0c6200.cpp597
-rw-r--r--src/mame/handheld/hh_hmcs40.cpp247
-rw-r--r--src/mame/handheld/hh_ht11xx.cpp281
-rw-r--r--src/mame/handheld/hh_mediatek_mt6260a.cpp78
-rw-r--r--src/mame/handheld/hh_melps4.cpp8
-rw-r--r--src/mame/handheld/hh_mn1400.cpp4
-rw-r--r--src/mame/handheld/hh_pic16.cpp16
-rw-r--r--src/mame/handheld/hh_pps41.cpp18
-rw-r--r--src/mame/handheld/hh_rw5000.cpp19
-rw-r--r--src/mame/handheld/hh_sm510.cpp913
-rw-r--r--src/mame/handheld/hh_sm510.h20
-rw-r--r--src/mame/handheld/hh_smc1k.cpp10
-rw-r--r--src/mame/handheld/hh_tms1k.cpp743
-rw-r--r--src/mame/handheld/hh_ucom4.cpp34
-rw-r--r--src/mame/handheld/lk3000.cpp8
-rw-r--r--src/mame/handheld/monty.cpp74
-rw-r--r--src/mame/handheld/pensebem.cpp10
-rw-r--r--src/mame/handheld/rzone.cpp4
-rw-r--r--src/mame/handheld/scrablex.cpp3
-rw-r--r--src/mame/handheld/st2302u_bbl_rom.cpp (renamed from src/mame/tvgames/st2302u_bbl_rom.cpp)90
-rw-r--r--src/mame/handheld/st2302u_bbl_spi.cpp499
-rw-r--r--src/mame/handheld/talkingbb.cpp15
-rw-r--r--src/mame/handheld/talkingfb.cpp12
-rw-r--r--src/mame/handheld/tama_4u.cpp84
-rw-r--r--src/mame/handheld/tama_id.cpp82
-rw-r--r--src/mame/handheld/tama_mix.cpp83
-rw-r--r--src/mame/handheld/teammate.cpp8
-rw-r--r--src/mame/handheld/unknown_bftetris_lcdc.cpp357
-rw-r--r--src/mame/handheld/unknown_bftetris_lcdc.h38
-rw-r--r--src/mame/handheld/vegaplus.cpp81
-rw-r--r--src/mame/handheld/wildfire.cpp2
-rw-r--r--src/mame/hds/hds200.cpp15
-rw-r--r--src/mame/hds/hds200_kbd.h8
-rw-r--r--src/mame/heathzenith/et3400.cpp16
-rw-r--r--src/mame/heathzenith/h17_fdc.cpp290
-rw-r--r--src/mame/heathzenith/h17_fdc.h90
-rw-r--r--src/mame/heathzenith/h19.cpp2
-rw-r--r--src/mame/heathzenith/h8.cpp449
-rw-r--r--src/mame/heathzenith/h89.cpp732
-rw-r--r--src/mame/heathzenith/h_88_cass.cpp166
-rw-r--r--src/mame/heathzenith/h_88_cass.h53
-rw-r--r--src/mame/heathzenith/mdt60.cpp6
-rw-r--r--src/mame/heathzenith/mms77316_fdc.cpp324
-rw-r--r--src/mame/heathzenith/mms77316_fdc.h80
-rw-r--r--src/mame/heathzenith/sigmasoft_parallel_port.cpp165
-rw-r--r--src/mame/heathzenith/sigmasoft_parallel_port.h67
-rw-r--r--src/mame/heathzenith/z100.cpp624
-rw-r--r--src/mame/heathzenith/z22.cpp6
-rw-r--r--src/mame/heathzenith/z29.cpp12
-rw-r--r--src/mame/heathzenith/z37_fdc.cpp237
-rw-r--r--src/mame/heathzenith/z37_fdc.h78
-rw-r--r--src/mame/hec2hrp/hec2hrp.h24
-rw-r--r--src/mame/hegenerglaser/academy.cpp12
-rw-r--r--src/mame/hegenerglaser/amsterdam.cpp38
-rw-r--r--src/mame/hegenerglaser/berlin.cpp8
-rw-r--r--src/mame/hegenerglaser/brikett.cpp109
-rw-r--r--src/mame/hegenerglaser/europa.cpp4
-rw-r--r--src/mame/hegenerglaser/excalibur.cpp263
-rw-r--r--src/mame/hegenerglaser/glasgow.cpp123
-rw-r--r--src/mame/hegenerglaser/mboard.cpp225
-rw-r--r--src/mame/hegenerglaser/mboard.h108
-rw-r--r--src/mame/hegenerglaser/mdisplay1.cpp91
-rw-r--r--src/mame/hegenerglaser/mdisplay1.h49
-rw-r--r--src/mame/hegenerglaser/mdisplay2.cpp111
-rw-r--r--src/mame/hegenerglaser/mdisplay2.h52
-rw-r--r--src/mame/hegenerglaser/mdisplay3.cpp126
-rw-r--r--src/mame/hegenerglaser/mdisplay3.h49
-rw-r--r--src/mame/hegenerglaser/milano.cpp6
-rw-r--r--src/mame/hegenerglaser/mm1.cpp29
-rw-r--r--src/mame/hegenerglaser/mm2.cpp197
-rw-r--r--src/mame/hegenerglaser/mm6.cpp241
-rw-r--r--src/mame/hegenerglaser/mmboard.cpp137
-rw-r--r--src/mame/hegenerglaser/mmboard.h90
-rw-r--r--src/mame/hegenerglaser/mmdisplay1.cpp90
-rw-r--r--src/mame/hegenerglaser/mmdisplay1.h46
-rw-r--r--src/mame/hegenerglaser/mmdisplay2.cpp113
-rw-r--r--src/mame/hegenerglaser/mmdisplay2.h52
-rw-r--r--src/mame/hegenerglaser/modena.cpp14
-rw-r--r--src/mame/hegenerglaser/modular.cpp49
-rw-r--r--src/mame/hegenerglaser/modular_tm.cpp63
-rw-r--r--src/mame/hegenerglaser/mondial.cpp8
-rw-r--r--src/mame/hegenerglaser/mondial2.cpp8
-rw-r--r--src/mame/hegenerglaser/mondial68k.cpp13
-rw-r--r--src/mame/hegenerglaser/montec.cpp10
-rw-r--r--src/mame/hegenerglaser/polgar.cpp10
-rw-r--r--src/mame/hegenerglaser/risc.cpp31
-rw-r--r--src/mame/hegenerglaser/roma2.cpp29
-rw-r--r--src/mame/hegenerglaser/smondial.cpp14
-rw-r--r--src/mame/hitachi/b16.cpp576
-rw-r--r--src/mame/hitachi/bmjr.cpp497
-rw-r--r--src/mame/hitachi/bml3.cpp822
-rw-r--r--src/mame/hitachi/bml3.h229
-rw-r--r--src/mame/hitachi/mbs1.cpp346
-rw-r--r--src/mame/hitachi/mbs1_mmu.cpp94
-rw-r--r--src/mame/hitachi/mbs1_mmu.h41
-rw-r--r--src/mame/homebrew/4004clk.cpp14
-rw-r--r--src/mame/homebrew/68ksbc.cpp2
-rw-r--r--src/mame/homebrew/chaos.cpp10
-rw-r--r--src/mame/homebrew/d6809.cpp6
-rw-r--r--src/mame/homebrew/dcebridge.cpp8
-rw-r--r--src/mame/homebrew/gigatron.cpp12
-rw-r--r--src/mame/homebrew/gs6502.cpp2
-rw-r--r--src/mame/homebrew/gs6809.cpp2
-rw-r--r--src/mame/homebrew/gscpm.cpp6
-rw-r--r--src/mame/homebrew/gsz80.cpp4
-rw-r--r--src/mame/homebrew/homez80.cpp6
-rw-r--r--src/mame/homebrew/lft_chiptune.cpp4
-rw-r--r--src/mame/homebrew/lft_craft.cpp8
-rw-r--r--src/mame/homebrew/lft_phasor.cpp8
-rw-r--r--src/mame/homebrew/linux4004.cpp278
-rw-r--r--src/mame/homebrew/minib.cpp6
-rw-r--r--src/mame/homebrew/mk1forth.cpp6
-rw-r--r--src/mame/homebrew/p112.cpp36
-rw-r--r--src/mame/homebrew/pc532.cpp79
-rw-r--r--src/mame/homebrew/phunsy.cpp8
-rw-r--r--src/mame/homebrew/pimps.cpp6
-rw-r--r--src/mame/homebrew/ravens.cpp12
-rw-r--r--src/mame/homebrew/sbc6510.cpp10
-rw-r--r--src/mame/homebrew/sitcom.cpp22
-rw-r--r--src/mame/homebrew/ultim809.cpp8
-rw-r--r--src/mame/homebrew/uzebox.cpp8
-rw-r--r--src/mame/homebrew/z80clock.cpp8
-rw-r--r--src/mame/homebrew/z80dev.cpp6
-rw-r--r--src/mame/homebrew/zexall.cpp24
-rw-r--r--src/mame/homelab/braiplus.cpp6
-rw-r--r--src/mame/homelab/homelab.cpp36
-rw-r--r--src/mame/hominn/hominn_980924.cpp352
-rw-r--r--src/mame/hominn/hominn_mcs51.cpp159
-rw-r--r--src/mame/hp/hp16500.cpp22
-rw-r--r--src/mame/hp/hp2100.cpp2
-rw-r--r--src/mame/hp/hp2620.cpp8
-rw-r--r--src/mame/hp/hp2640.cpp30
-rw-r--r--src/mame/hp/hp2640_tape.h6
-rw-r--r--src/mame/hp/hp3478a.cpp10
-rw-r--r--src/mame/hp/hp48.cpp13
-rw-r--r--src/mame/hp/hp48.h15
-rw-r--r--src/mame/hp/hp48_port.h8
-rw-r--r--src/mame/hp/hp49gp.cpp20
-rw-r--r--src/mame/hp/hp620lx.cpp79
-rw-r--r--src/mame/hp/hp64k.cpp8
-rw-r--r--src/mame/hp/hp700.cpp10
-rw-r--r--src/mame/hp/hp7596a.cpp4
-rw-r--r--src/mame/hp/hp80.cpp28
-rw-r--r--src/mame/hp/hp80_optrom.h2
-rw-r--r--src/mame/hp/hp95lx.cpp10
-rw-r--r--src/mame/hp/hp9825.cpp42
-rw-r--r--src/mame/hp/hp9825_optrom.h4
-rw-r--r--src/mame/hp/hp9825_tape.h6
-rw-r--r--src/mame/hp/hp9845.cpp62
-rw-r--r--src/mame/hp/hp9845.h10
-rw-r--r--src/mame/hp/hp9845_optrom.h2
-rw-r--r--src/mame/hp/hp9845_printer.h8
-rw-r--r--src/mame/hp/hp98x5_io_sys.h4
-rw-r--r--src/mame/hp/hp98x6.cpp119
-rw-r--r--src/mame/hp/hp98x6_optrom.cpp95
-rw-r--r--src/mame/hp/hp98x6_optrom.h46
-rw-r--r--src/mame/hp/hp98x6_upi.h8
-rw-r--r--src/mame/hp/hp9k.cpp2
-rw-r--r--src/mame/hp/hp9k_3xx.cpp20
-rw-r--r--src/mame/hp/hp_ipc.cpp14
-rw-r--r--src/mame/hp/hp_ipc_optrom.h2
-rw-r--r--src/mame/hp/hpz80unk.cpp8
-rw-r--r--src/mame/hp/jornada.cpp172
-rw-r--r--src/mame/huangyeh/hy-268a.cpp173
-rw-r--r--src/mame/huangyeh/hy-9802.cpp311
-rw-r--r--src/mame/husky/hawk.cpp8
-rw-r--r--src/mame/husky/hunter16.cpp12
-rw-r--r--src/mame/husky/hunter2.cpp8
-rw-r--r--src/mame/husky/husky.cpp133
-rw-r--r--src/mame/ibm/ibm3153.cpp16
-rw-r--r--src/mame/ibm/ibm3477.cpp113
-rw-r--r--src/mame/ibm/ibm5100.cpp22
-rw-r--r--src/mame/ibm/ibm5100_kbd.h6
-rw-r--r--src/mame/ibm/ibm5550.cpp8
-rw-r--r--src/mame/ibm/ibm6580.cpp14
-rw-r--r--src/mame/ibm/ibm6580_fdc.h8
-rw-r--r--src/mame/ibm/ibm6580_kbd.h10
-rw-r--r--src/mame/ibm/ptpc110.cpp348
-rw-r--r--src/mame/ibm/rosetta.cpp77
-rw-r--r--src/mame/ibm/rosetta.h5
-rw-r--r--src/mame/ibm/rs6000_type7xxx.cpp2
-rw-r--r--src/mame/ibm/rtpc.cpp477
-rw-r--r--src/mame/ibm/rtpc_iocc.cpp12
-rw-r--r--src/mame/ibm/rtpc_iocc.h4
-rw-r--r--src/mame/ibm/rtpc_kbd.cpp466
-rw-r--r--src/mame/ibm/rtpc_kbd.h49
-rw-r--r--src/mame/ibm/rtpc_kbdc.cpp122
-rw-r--r--src/mame/ibm/rtpc_kbdc.h76
-rw-r--r--src/mame/ibm/rtpc_kls.cpp425
-rw-r--r--src/mame/ibm/rtpc_kls.h71
-rw-r--r--src/mame/ibm/rtpc_mouse.cpp316
-rw-r--r--src/mame/ibm/rtpc_mouse.h61
-rw-r--r--src/mame/ibm/thinkpad600.cpp406
-rw-r--r--src/mame/ibm/thinkpad8xx.cpp112
-rw-r--r--src/mame/ice/calchase.cpp (renamed from src/mame/pc/calchase.cpp)68
-rw-r--r--src/mame/ice/chexx.cpp62
-rw-r--r--src/mame/ice/cutrope.cpp80
-rw-r--r--src/mame/ice/fcourtfev.cpp118
-rw-r--r--src/mame/ice/frenzyxprss.cpp21
-rw-r--r--src/mame/ice/ice_bozopail.cpp6
-rw-r--r--src/mame/ice/ice_hhhippos.cpp2
-rw-r--r--src/mame/ice/ice_tbd.cpp10
-rw-r--r--src/mame/ice/lethalj.cpp531
-rw-r--r--src/mame/ice/lethalj.h85
-rw-r--r--src/mame/ice/lethalj_v.cpp203
-rw-r--r--src/mame/ice/schexx4gen.cpp4
-rw-r--r--src/mame/ice/skimaxx.cpp (renamed from src/mame/misc/skimaxx.cpp)21
-rw-r--r--src/mame/ice/vp101.cpp14
-rw-r--r--src/mame/igs/5clown.cpp (renamed from src/mame/misc/5clown.cpp)165
-rw-r--r--src/mame/igs/cabaret.cpp272
-rw-r--r--src/mame/igs/dunhuang.cpp12
-rw-r--r--src/mame/igs/funtech.cpp494
-rw-r--r--src/mame/igs/goldstar.cpp24536
-rw-r--r--src/mame/igs/igs009.cpp338
-rw-r--r--src/mame/igs/igs011.cpp3494
-rw-r--r--src/mame/igs/igs011_video.cpp549
-rw-r--r--src/mame/igs/igs011_video.h97
-rw-r--r--src/mame/igs/igs012.cpp163
-rw-r--r--src/mame/igs/igs012.h38
-rw-r--r--src/mame/igs/igs017.cpp4324
-rw-r--r--src/mame/igs/igs017_igs031.cpp256
-rw-r--r--src/mame/igs/igs017_igs031.h49
-rw-r--r--src/mame/igs/igs022.h4
-rw-r--r--src/mame/igs/igs023_video.cpp811
-rw-r--r--src/mame/igs/igs023_video.h111
-rw-r--r--src/mame/igs/igs025.cpp35
-rw-r--r--src/mame/igs/igs025.h4
-rw-r--r--src/mame/igs/igs027a.cpp202
-rw-r--r--src/mame/igs/igs027a.h59
-rw-r--r--src/mame/igs/igs028.h4
-rw-r--r--src/mame/igs/igs036crypt.cpp595
-rw-r--r--src/mame/igs/igs036crypt.h55
-rw-r--r--src/mame/igs/igs_68k_023vid.cpp391
-rw-r--r--src/mame/igs/igs_fear.cpp855
-rw-r--r--src/mame/igs/igs_m027.cpp4400
-rw-r--r--src/mame/igs/igs_m027_023vid.cpp488
-rw-r--r--src/mame/igs/igs_m027_033vid.cpp503
-rw-r--r--src/mame/igs/igs_m027_link.cpp499
-rw-r--r--src/mame/igs/igs_m027xa.cpp1196
-rw-r--r--src/mame/igs/igs_m036.cpp565
-rw-r--r--src/mame/igs/igsmahjong.cpp27
-rw-r--r--src/mame/igs/igsmahjong.h53
-rw-r--r--src/mame/igs/igspc.cpp (renamed from src/mame/pc/igspc.cpp)6
-rw-r--r--src/mame/igs/igspoker.cpp1026
-rw-r--r--src/mame/igs/iqblock.cpp6
-rw-r--r--src/mame/igs/jackie.cpp26
-rw-r--r--src/mame/igs/lordgun.cpp330
-rw-r--r--src/mame/igs/lordgun.h159
-rw-r--r--src/mame/igs/lordgun_v.cpp236
-rw-r--r--src/mame/igs/pgm.cpp1681
-rw-r--r--src/mame/igs/pgm.h112
-rw-r--r--src/mame/igs/pgm2.cpp38
-rw-r--r--src/mame/igs/pgm2.h80
-rw-r--r--src/mame/igs/pgm2_memcard.cpp2
-rw-r--r--src/mame/igs/pgm2_memcard.h2
-rw-r--r--src/mame/igs/pgm3.cpp128
-rw-r--r--src/mame/igs/pgm_v.cpp670
-rw-r--r--src/mame/igs/pgmcrypt.cpp1426
-rw-r--r--src/mame/igs/pgmcrypt.h122
-rw-r--r--src/mame/igs/pgmprot_igs025_igs012.cpp7
-rw-r--r--src/mame/igs/pgmprot_igs025_igs012.h19
-rw-r--r--src/mame/igs/pgmprot_igs025_igs022.h36
-rw-r--r--src/mame/igs/pgmprot_igs025_igs028.h21
-rw-r--r--src/mame/igs/pgmprot_igs027a_type1.cpp36
-rw-r--r--src/mame/igs/pgmprot_igs027a_type1.h58
-rw-r--r--src/mame/igs/pgmprot_igs027a_type2.cpp21
-rw-r--r--src/mame/igs/pgmprot_igs027a_type2.h28
-rw-r--r--src/mame/igs/pgmprot_igs027a_type3.cpp12
-rw-r--r--src/mame/igs/pgmprot_igs027a_type3.h24
-rw-r--r--src/mame/igs/pgmprot_orlegend.h11
-rw-r--r--src/mame/igs/spoker.cpp1542
-rw-r--r--src/mame/igs/xamcu.cpp314
-rw-r--r--src/mame/igs/xamcu.h106
-rw-r--r--src/mame/igt/drw80pkr.cpp582
-rw-r--r--src/mame/igt/fortune1.cpp1776
-rw-r--r--src/mame/igt/gkigt.cpp958
-rw-r--r--src/mame/igt/peplus.cpp485
-rw-r--r--src/mame/igt/splus.cpp10
-rw-r--r--src/mame/igt/videopkr.cpp1617
-rw-r--r--src/mame/informer/informer_207_100.cpp132
-rw-r--r--src/mame/informer/informer_207_376.cpp9
-rw-r--r--src/mame/informer/informer_207_376_kbd.h6
-rw-r--r--src/mame/informer/informer_213.cpp104
-rw-r--r--src/mame/informer/informer_213_kbd.cpp302
-rw-r--r--src/mame/informer/informer_213_kbd.h58
-rw-r--r--src/mame/intel/basic52.cpp12
-rw-r--r--src/mame/intel/i420ex.cpp277
-rw-r--r--src/mame/intel/imds2.cpp18
-rw-r--r--src/mame/intel/imds2ioc.h14
-rw-r--r--src/mame/intel/imm6_76.h2
-rw-r--r--src/mame/intel/intellec4.cpp72
-rw-r--r--src/mame/intel/intellec8.cpp71
-rw-r--r--src/mame/intel/ipc.cpp6
-rw-r--r--src/mame/intel/ipds.cpp6
-rw-r--r--src/mame/intel/isbc.cpp26
-rw-r--r--src/mame/intel/isbc660.cpp22
-rw-r--r--src/mame/intel/isbc8010.cpp8
-rw-r--r--src/mame/intel/isbc8030.cpp4
-rw-r--r--src/mame/intel/isbc_208.h8
-rw-r--r--src/mame/intel/rex6000.cpp160
-rw-r--r--src/mame/intel/sdk51.cpp20
-rw-r--r--src/mame/intel/sdk80.cpp4
-rw-r--r--src/mame/intel/sdk85.cpp12
-rw-r--r--src/mame/intel/sdk86.cpp10
-rw-r--r--src/mame/intergraph/interpro.cpp189
-rw-r--r--src/mame/intergraph/interpro_arbga.h6
-rw-r--r--src/mame/intergraph/interpro_ioga.h14
-rw-r--r--src/mame/intergraph/interpro_mcga.h8
-rw-r--r--src/mame/intergraph/interpro_sga.h6
-rw-r--r--src/mame/interton/vc4000.h71
-rw-r--r--src/mame/interton/vc4000_a.cpp9
-rw-r--r--src/mame/interton/vc4000_a.h4
-rw-r--r--src/mame/interton/vc4000_v.cpp59
-rw-r--r--src/mame/irem/irem.h18
-rw-r--r--src/mame/irem/irem_cpu.cpp4
-rw-r--r--src/mame/irem/m10.cpp186
-rw-r--r--src/mame/irem/m102.cpp2
-rw-r--r--src/mame/irem/m107.cpp33
-rw-r--r--src/mame/irem/m119.cpp17
-rw-r--r--src/mame/irem/m14.cpp200
-rw-r--r--src/mame/irem/m52.cpp12
-rw-r--r--src/mame/irem/m57.cpp39
-rw-r--r--src/mame/irem/m58.cpp18
-rw-r--r--src/mame/irem/m62.cpp133
-rw-r--r--src/mame/irem/m62.h45
-rw-r--r--src/mame/irem/m62_bkungfu.cpp851
-rw-r--r--src/mame/irem/m62_v.cpp7
-rw-r--r--src/mame/irem/m63.cpp40
-rw-r--r--src/mame/irem/m72.cpp888
-rw-r--r--src/mame/irem/m72.h290
-rw-r--r--src/mame/irem/m72_a.h2
-rw-r--r--src/mame/irem/m72_v.cpp256
-rw-r--r--src/mame/irem/m78.cpp38
-rw-r--r--src/mame/irem/m80.cpp19
-rw-r--r--src/mame/irem/m90.h26
-rw-r--r--src/mame/irem/m90_v.cpp58
-rw-r--r--src/mame/irem/m92.cpp528
-rw-r--r--src/mame/irem/m92.h199
-rw-r--r--src/mame/irem/m92_v.cpp520
-rw-r--r--src/mame/irem/olibochu.cpp399
-rw-r--r--src/mame/irem/redalert.cpp8
-rw-r--r--src/mame/irem/redalert.h8
-rw-r--r--src/mame/irem/redalert_a.h20
-rw-r--r--src/mame/irem/redalert_v.cpp2
-rw-r--r--src/mame/irem/spartanxtec.cpp12
-rw-r--r--src/mame/irem/travrusa.cpp404
-rw-r--r--src/mame/irem/vigilant.cpp1305
-rw-r--r--src/mame/irem/vigilant.h96
-rw-r--r--src/mame/irem/vigilant_v.cpp476
-rw-r--r--src/mame/isc/compucolor.cpp8
-rw-r--r--src/mame/itech/capbowl.cpp37
-rw-r--r--src/mame/itech/iteagle.cpp117
-rw-r--r--src/mame/itech/iteagle_fpga.h28
-rw-r--r--src/mame/itech/itech32.cpp442
-rw-r--r--src/mame/itech/itech32.h32
-rw-r--r--src/mame/itech/itech8.cpp215
-rw-r--r--src/mame/itech/itech8.h63
-rw-r--r--src/mame/jaleco/acommand.cpp380
-rw-r--r--src/mame/jaleco/aeroboto.cpp10
-rw-r--r--src/mame/jaleco/argus.h28
-rw-r--r--src/mame/jaleco/armchamp.cpp10
-rw-r--r--src/mame/jaleco/bestleag.cpp136
-rw-r--r--src/mame/jaleco/bigstrkb.cpp15
-rw-r--r--src/mame/jaleco/blueprnt.cpp19
-rw-r--r--src/mame/jaleco/bnstars.cpp192
-rw-r--r--src/mame/jaleco/cischeat.cpp2561
-rw-r--r--src/mame/jaleco/cischeat.h272
-rw-r--r--src/mame/jaleco/cischeat_v.cpp1026
-rw-r--r--src/mame/jaleco/citycon.cpp10
-rw-r--r--src/mame/jaleco/dday.cpp751
-rw-r--r--src/mame/jaleco/ddayjlc.cpp741
-rw-r--r--src/mame/jaleco/exerion.cpp149
-rw-r--r--src/mame/jaleco/fcombat.cpp117
-rw-r--r--src/mame/jaleco/ginganin.cpp10
-rw-r--r--src/mame/jaleco/homerun.cpp158
-rw-r--r--src/mame/jaleco/jalblend.cpp24
-rw-r--r--src/mame/jaleco/jalblend.h9
-rw-r--r--src/mame/jaleco/jaleco_ms32_sysctrl.h8
-rw-r--r--src/mame/jaleco/jaleco_road.cpp288
-rw-r--r--src/mame/jaleco/jaleco_road.h77
-rw-r--r--src/mame/jaleco/jaleco_vj_pc.cpp19
-rw-r--r--src/mame/jaleco/jaleco_vj_qtaro.h12
-rw-r--r--src/mame/jaleco/jaleco_vj_sound.cpp6
-rw-r--r--src/mame/jaleco/jaleco_zoomspr.cpp327
-rw-r--r--src/mame/jaleco/jaleco_zoomspr.h69
-rw-r--r--src/mame/jaleco/jalmah.cpp28
-rw-r--r--src/mame/jaleco/megasys1.cpp1210
-rw-r--r--src/mame/jaleco/megasys1.h143
-rw-r--r--src/mame/jaleco/megasys1_v.cpp262
-rw-r--r--src/mame/jaleco/momoko.cpp8
-rw-r--r--src/mame/jaleco/ms1_gatearray.cpp84
-rw-r--r--src/mame/jaleco/ms1_gatearray.h14
-rw-r--r--src/mame/jaleco/ms1_tmap.cpp86
-rw-r--r--src/mame/jaleco/ms1_tmap.h36
-rw-r--r--src/mame/jaleco/ms32.cpp789
-rw-r--r--src/mame/jaleco/ms32.h50
-rw-r--r--src/mame/jaleco/ms32_sprite.h2
-rw-r--r--src/mame/jaleco/ms32_v.cpp45
-rw-r--r--src/mame/jaleco/pturn.cpp10
-rw-r--r--src/mame/jaleco/scudhamm.cpp1762
-rw-r--r--src/mame/jaleco/skyfox.cpp14
-rw-r--r--src/mame/jaleco/tetrisp2.cpp1035
-rw-r--r--src/mame/jaleco/tetrisp2.h272
-rw-r--r--src/mame/jaleco/tetrisp2_v.cpp180
-rw-r--r--src/mame/jpm/guab.cpp15
-rw-r--r--src/mame/jpm/jpmimpct.cpp94
-rw-r--r--src/mame/jpm/jpmimpct.h27
-rw-r--r--src/mame/jpm/jpmimpctsw.cpp18
-rw-r--r--src/mame/jpm/jpmmps.cpp422
-rw-r--r--src/mame/jpm/jpms80.cpp54
-rw-r--r--src/mame/jpm/jpmsru.cpp49
-rw-r--r--src/mame/jpm/jpmsys5.cpp18
-rw-r--r--src/mame/jpm/jpmsys5.h21
-rw-r--r--src/mame/jpm/jpmsys7.cpp33
-rw-r--r--src/mame/jpm/pl6_exp.cpp60
-rw-r--r--src/mame/jpm/pl6_exp.h67
-rw-r--r--src/mame/jpm/pl6_fpga.cpp388
-rw-r--r--src/mame/jpm/pl6_fpga.h253
-rw-r--r--src/mame/jpm/pl6_pic.cpp164
-rw-r--r--src/mame/jpm/pl6_pic.h84
-rw-r--r--src/mame/jpm/pluto5.cpp267
-rw-r--r--src/mame/jpm/pluto6.cpp632
-rw-r--r--src/mame/kaneko/airbustr.cpp204
-rw-r--r--src/mame/kaneko/djboy.cpp265
-rw-r--r--src/mame/kaneko/expro02.cpp45
-rw-r--r--src/mame/kaneko/galpani2.cpp7
-rw-r--r--src/mame/kaneko/galpani2.h8
-rw-r--r--src/mame/kaneko/galpani3.cpp378
-rw-r--r--src/mame/kaneko/galpanic.cpp83
-rw-r--r--src/mame/kaneko/galpanic_ms.cpp38
-rw-r--r--src/mame/kaneko/galpnipt.h6
-rw-r--r--src/mame/kaneko/hvyunit.cpp270
-rw-r--r--src/mame/kaneko/jchan.cpp78
-rw-r--r--src/mame/kaneko/kan_pand.cpp160
-rw-r--r--src/mame/kaneko/kan_pand.h39
-rw-r--r--src/mame/kaneko/kaneko16.cpp157
-rw-r--r--src/mame/kaneko/kaneko16.h163
-rw-r--r--src/mame/kaneko/kaneko16_v.cpp32
-rw-r--r--src/mame/kaneko/kaneko_calc3.cpp2234
-rw-r--r--src/mame/kaneko/kaneko_calc3.h16
-rw-r--r--src/mame/kaneko/kaneko_grap2.cpp93
-rw-r--r--src/mame/kaneko/kaneko_grap2.h90
-rw-r--r--src/mame/kaneko/kaneko_hit.h4
-rw-r--r--src/mame/kaneko/kaneko_rlespr.cpp553
-rw-r--r--src/mame/kaneko/kaneko_rlespr.h43
-rw-r--r--src/mame/kaneko/kaneko_spr.cpp185
-rw-r--r--src/mame/kaneko/kaneko_spr.h29
-rw-r--r--src/mame/kaneko/kaneko_tmap.cpp51
-rw-r--r--src/mame/kaneko/kaneko_tmap.h11
-rw-r--r--src/mame/kaneko/kaneko_toybox.h4
-rw-r--r--src/mame/kaneko/sandscrp.cpp55
-rw-r--r--src/mame/kaneko/sknsspr.cpp549
-rw-r--r--src/mame/kaneko/sknsspr.h32
-rw-r--r--src/mame/kaneko/snowbros.cpp1002
-rw-r--r--src/mame/kaneko/snowbros.h228
-rw-r--r--src/mame/kaneko/snowbros_v.cpp218
-rw-r--r--src/mame/kaneko/suprnova.cpp1193
-rw-r--r--src/mame/kaneko/suprnova.h233
-rw-r--r--src/mame/kaneko/suprnova_v.cpp591
-rw-r--r--src/mame/kawai/acr20.cpp4
-rw-r--r--src/mame/kawai/k1.cpp12
-rw-r--r--src/mame/kawai/k4.cpp6
-rw-r--r--src/mame/kawai/k5.cpp8
-rw-r--r--src/mame/kawai/ksp10.cpp4
-rw-r--r--src/mame/kawai/mb63h158.h4
-rw-r--r--src/mame/kawai/r100.cpp8
-rw-r--r--src/mame/kawai/sx240.cpp16
-rw-r--r--src/mame/kaypro/kay_kbd.h51
-rw-r--r--src/mame/kaypro/kaypro.cpp22
-rw-r--r--src/mame/kaypro/kaypro.h18
-rw-r--r--src/mame/kaypro/kaypro_m.cpp24
-rw-r--r--src/mame/kiwako/koikoi.cpp447
-rw-r--r--src/mame/koei/pasogo.cpp17
-rw-r--r--src/mame/konami/3dom2.cpp9
-rw-r--r--src/mame/konami/3dom2.h95
-rw-r--r--src/mame/konami/3dom2_te.h4
-rw-r--r--src/mame/konami/88games.cpp266
-rw-r--r--src/mame/konami/ajax.cpp74
-rw-r--r--src/mame/konami/aliens.cpp69
-rw-r--r--src/mame/konami/asterix.cpp224
-rw-r--r--src/mame/konami/battlnts.cpp39
-rw-r--r--src/mame/konami/bishi.cpp98
-rw-r--r--src/mame/konami/bladestl.cpp54
-rw-r--r--src/mame/konami/blockhl.cpp63
-rw-r--r--src/mame/konami/bottom9.cpp242
-rw-r--r--src/mame/konami/chqflag.cpp226
-rw-r--r--src/mame/konami/circusc.cpp259
-rw-r--r--src/mame/konami/cobra.cpp138
-rw-r--r--src/mame/konami/combatsc.cpp238
-rw-r--r--src/mame/konami/combatsc.h58
-rw-r--r--src/mame/konami/combatsc_v.cpp153
-rw-r--r--src/mame/konami/contra.cpp290
-rw-r--r--src/mame/konami/cougar.cpp15
-rw-r--r--src/mame/konami/crimfght.cpp266
-rw-r--r--src/mame/konami/dbz.cpp283
-rw-r--r--src/mame/konami/ddribble.cpp49
-rw-r--r--src/mame/konami/divebomb.cpp57
-rw-r--r--src/mame/konami/djmain.cpp868
-rw-r--r--src/mame/konami/fastlane.cpp147
-rw-r--r--src/mame/konami/finalizr.cpp88
-rw-r--r--src/mame/konami/firebeat.cpp279
-rw-r--r--src/mame/konami/flkatck.cpp239
-rw-r--r--src/mame/konami/gberet.cpp209
-rw-r--r--src/mame/konami/giclassic.cpp48
-rw-r--r--src/mame/konami/gijoe.cpp249
-rw-r--r--src/mame/konami/goldenregion.cpp15
-rw-r--r--src/mame/konami/gradius3.cpp301
-rw-r--r--src/mame/konami/gryzor_ms.cpp188
-rw-r--r--src/mame/konami/gticlub.cpp295
-rw-r--r--src/mame/konami/gyruss.cpp47
-rw-r--r--src/mame/konami/hcastle.cpp196
-rw-r--r--src/mame/konami/hexion.cpp8
-rw-r--r--src/mame/konami/hornet.cpp1053
-rw-r--r--src/mame/konami/hyperspt.cpp42
-rw-r--r--src/mame/konami/hyprolyb.h4
-rw-r--r--src/mame/konami/ironhors.cpp73
-rw-r--r--src/mame/konami/jackal.cpp15
-rw-r--r--src/mame/konami/jailbrek.cpp115
-rw-r--r--src/mame/konami/junofrst.cpp99
-rw-r--r--src/mame/konami/k001005.cpp335
-rw-r--r--src/mame/konami/k001005.h12
-rw-r--r--src/mame/konami/k001006.cpp90
-rw-r--r--src/mame/konami/k001006.h17
-rw-r--r--src/mame/konami/k001604.cpp9
-rw-r--r--src/mame/konami/k001604.h4
-rw-r--r--src/mame/konami/k005849.cpp143
-rw-r--r--src/mame/konami/k005849.h49
-rw-r--r--src/mame/konami/k007121.cpp318
-rw-r--r--src/mame/konami/k007121.h66
-rw-r--r--src/mame/konami/k007342.cpp69
-rw-r--r--src/mame/konami/k007342.h11
-rw-r--r--src/mame/konami/k007420.cpp118
-rw-r--r--src/mame/konami/k007420.h12
-rw-r--r--src/mame/konami/k007452.h4
-rw-r--r--src/mame/konami/k037122.cpp4
-rw-r--r--src/mame/konami/k037122.h4
-rw-r--r--src/mame/konami/k051733.cpp205
-rw-r--r--src/mame/konami/k051733.h30
-rw-r--r--src/mame/konami/k051960.cpp300
-rw-r--r--src/mame/konami/k051960.h58
-rw-r--r--src/mame/konami/k052109.cpp567
-rw-r--r--src/mame/konami/k052109.h84
-rw-r--r--src/mame/konami/k053244_k053245.cpp153
-rw-r--r--src/mame/konami/k053244_k053245.h52
-rw-r--r--src/mame/konami/k053246_k053247_k055673.cpp594
-rw-r--r--src/mame/konami/k053246_k053247_k055673.h46
-rw-r--r--src/mame/konami/k053250.cpp92
-rw-r--r--src/mame/konami/k053250.h14
-rw-r--r--src/mame/konami/k053250_ps.cpp106
-rw-r--r--src/mame/konami/k053250_ps.h20
-rw-r--r--src/mame/konami/k053251.cpp66
-rw-r--r--src/mame/konami/k053251.h21
-rw-r--r--src/mame/konami/k054000.cpp18
-rw-r--r--src/mame/konami/k054000.h6
-rw-r--r--src/mame/konami/k054156_k054157_k056832.cpp1268
-rw-r--r--src/mame/konami/k054156_k054157_k056832.h143
-rw-r--r--src/mame/konami/k054338.cpp120
-rw-r--r--src/mame/konami/k054338.h13
-rw-r--r--src/mame/konami/k055555.cpp36
-rw-r--r--src/mame/konami/k055555.h4
-rw-r--r--src/mame/konami/k057714.cpp4
-rw-r--r--src/mame/konami/k057714.h8
-rw-r--r--src/mame/konami/k573cass.h20
-rw-r--r--src/mame/konami/k573dio.cpp4
-rw-r--r--src/mame/konami/k573dio.h10
-rw-r--r--src/mame/konami/k573fpga.cpp116
-rw-r--r--src/mame/konami/k573fpga.h7
-rw-r--r--src/mame/konami/k573kara.h10
-rw-r--r--src/mame/konami/k573mcal.h12
-rw-r--r--src/mame/konami/k573mcr.h16
-rw-r--r--src/mame/konami/k573msu.h4
-rw-r--r--src/mame/konami/konami1.h2
-rw-r--r--src/mame/konami/konami_gn676_lan.h13
-rw-r--r--src/mame/konami/konami_helper.cpp62
-rw-r--r--src/mame/konami/konami_helper.h41
-rw-r--r--src/mame/konami/konamigq.cpp102
-rw-r--r--src/mame/konami/konamigs.cpp95
-rw-r--r--src/mame/konami/konamigv.cpp108
-rw-r--r--src/mame/konami/konamigx.cpp1593
-rw-r--r--src/mame/konami/konamigx.h250
-rw-r--r--src/mame/konami/konamigx_m.cpp259
-rw-r--r--src/mame/konami/konamigx_v.cpp887
-rw-r--r--src/mame/konami/konamiic.txt41
-rw-r--r--src/mame/konami/konamim2.cpp318
-rw-r--r--src/mame/konami/konamipt.h31
-rw-r--r--src/mame/konami/konblands.cpp10
-rw-r--r--src/mame/konami/konendev.cpp26
-rw-r--r--src/mame/konami/kongs470.cpp13
-rw-r--r--src/mame/konami/konmedal.cpp728
-rw-r--r--src/mame/konami/konmedal020.cpp15
-rw-r--r--src/mame/konami/konmedal68k.cpp51
-rw-r--r--src/mame/konami/konmedalppc.cpp24
-rw-r--r--src/mame/konami/konppc.cpp383
-rw-r--r--src/mame/konami/konppc.h105
-rw-r--r--src/mame/konami/konppc_jvshost.h4
-rw-r--r--src/mame/konami/kontest.cpp150
-rw-r--r--src/mame/konami/kpontoon.cpp17
-rw-r--r--src/mame/konami/kpython.cpp16
-rw-r--r--src/mame/konami/kpython2.cpp100
-rw-r--r--src/mame/konami/ksys573.cpp637
-rw-r--r--src/mame/konami/labyrunr.cpp362
-rw-r--r--src/mame/konami/lethal.cpp322
-rw-r--r--src/mame/konami/mainevt.cpp166
-rw-r--r--src/mame/konami/megazone.cpp197
-rw-r--r--src/mame/konami/midikbd.h2
-rw-r--r--src/mame/konami/mikie.cpp25
-rw-r--r--src/mame/konami/mogura.cpp106
-rw-r--r--src/mame/konami/moo.cpp507
-rw-r--r--src/mame/konami/mystwarr.cpp1236
-rw-r--r--src/mame/konami/mystwarr.h52
-rw-r--r--src/mame/konami/mystwarr_v.cpp147
-rw-r--r--src/mame/konami/nemesis.cpp1221
-rw-r--r--src/mame/konami/nemesis.h335
-rw-r--r--src/mame/konami/nemesis_v.cpp282
-rw-r--r--src/mame/konami/nwk-tr.cpp410
-rw-r--r--src/mame/konami/otomedius.cpp43
-rw-r--r--src/mame/konami/overdriv.cpp200
-rw-r--r--src/mame/konami/pandoras.cpp16
-rw-r--r--src/mame/konami/parodius.cpp94
-rw-r--r--src/mame/konami/pingpong.cpp104
-rw-r--r--src/mame/konami/piratesh.cpp97
-rw-r--r--src/mame/konami/plygonet.cpp35
-rw-r--r--src/mame/konami/pooyan.cpp17
-rw-r--r--src/mame/konami/qdrmfgp.cpp48
-rw-r--r--src/mame/konami/quickpick5.cpp583
-rw-r--r--src/mame/konami/rockrage.cpp42
-rw-r--r--src/mame/konami/rocnrope.cpp6
-rw-r--r--src/mame/konami/rollerg.cpp72
-rw-r--r--src/mame/konami/rungun.cpp342
-rw-r--r--src/mame/konami/sbasketb.cpp43
-rw-r--r--src/mame/konami/scotrsht.cpp8
-rw-r--r--src/mame/konami/shaolins.cpp49
-rw-r--r--src/mame/konami/simpsons.cpp253
-rw-r--r--src/mame/konami/spy.cpp294
-rw-r--r--src/mame/konami/stingnet.cpp36
-rw-r--r--src/mame/konami/surpratk.cpp125
-rw-r--r--src/mame/konami/tasman.cpp50
-rw-r--r--src/mame/konami/tgtpanic.cpp91
-rw-r--r--src/mame/konami/thunderx.cpp85
-rw-r--r--src/mame/konami/timeplt.cpp31
-rw-r--r--src/mame/konami/tmnt.cpp213
-rw-r--r--src/mame/konami/tmnt2.cpp1981
-rw-r--r--src/mame/konami/tp84.cpp97
-rw-r--r--src/mame/konami/trackfld.cpp442
-rw-r--r--src/mame/konami/trackfld.h134
-rw-r--r--src/mame/konami/trackfld_a.cpp74
-rw-r--r--src/mame/konami/trackfld_a.h11
-rw-r--r--src/mame/konami/trackfld_v.cpp247
-rw-r--r--src/mame/konami/tutankhm.cpp109
-rw-r--r--src/mame/konami/tutankhm.h68
-rw-r--r--src/mame/konami/tutankhm_v.cpp112
-rw-r--r--src/mame/konami/twin16.cpp479
-rw-r--r--src/mame/konami/twin16.h155
-rw-r--r--src/mame/konami/twin16_v.cpp419
-rw-r--r--src/mame/konami/twin16_v.h101
-rw-r--r--src/mame/konami/twinkle.cpp98
-rw-r--r--src/mame/konami/ultraman.cpp148
-rw-r--r--src/mame/konami/ultrsprt.cpp88
-rw-r--r--src/mame/konami/vendetta.cpp157
-rw-r--r--src/mame/konami/viper.cpp97
-rw-r--r--src/mame/konami/wecleman.cpp40
-rw-r--r--src/mame/konami/wecleman.h52
-rw-r--r--src/mame/konami/wecleman_v.cpp6
-rw-r--r--src/mame/konami/windy2.cpp4
-rw-r--r--src/mame/konami/windy2.h14
-rw-r--r--src/mame/konami/xexex.cpp203
-rw-r--r--src/mame/konami/xmen.cpp426
-rw-r--r--src/mame/konami/yiear.cpp90
-rw-r--r--src/mame/konami/zr107.cpp298
-rw-r--r--src/mame/konami/zs01.h4
-rw-r--r--src/mame/kontron/kdt6.cpp87
-rw-r--r--src/mame/korg/korgds8.cpp15
-rw-r--r--src/mame/korg/korgdss1.cpp29
-rw-r--r--src/mame/korg/korgdvp1.cpp12
-rw-r--r--src/mame/korg/korgdw8k.cpp14
-rw-r--r--src/mame/korg/korgm1.cpp11
-rw-r--r--src/mame/korg/korgtriton.cpp336
-rw-r--r--src/mame/korg/korgws.cpp10
-rw-r--r--src/mame/korg/korgz3.cpp17
-rw-r--r--src/mame/korg/microkorg.cpp29
-rw-r--r--src/mame/korg/poly61.cpp128
-rw-r--r--src/mame/korg/poly800.cpp16
-rw-r--r--src/mame/korg/polysix.cpp1005
-rw-r--r--src/mame/kurzweil/krz2000.cpp11
-rw-r--r--src/mame/kyber/kminus.cpp8
-rw-r--r--src/mame/kyocera/kyocera.h24
-rw-r--r--src/mame/layout/280zzzap.lay24
-rw-r--r--src/mame/layout/3bagfull.lay (renamed from src/mame/layout/3bagflvt.lay)0
-rw-r--r--src/mame/layout/3bagfullnz.lay (renamed from src/mame/layout/3bagflnz.lay)0
-rw-r--r--src/mame/layout/5acespkr.lay175
-rw-r--r--src/mame/layout/ac1clbmn.lay32
-rw-r--r--src/mame/layout/ac1gogld.lay24
-rw-r--r--src/mame/layout/ac1primt.lay24
-rw-r--r--src/mame/layout/ac1pster.lay24
-rw-r--r--src/mame/layout/ac1pstrt.lay24
-rw-r--r--src/mame/layout/ac1taklv.lay24
-rw-r--r--src/mame/layout/ace.lay2
-rw-r--r--src/mame/layout/aces1.lay12
-rw-r--r--src/mame/layout/aci_boris.lay16
-rw-r--r--src/mame/layout/aci_ggm.lay30
-rw-r--r--src/mame/layout/aci_prodigy.lay54
-rw-r--r--src/mame/layout/acrnsys_kbd.lay89
-rw-r--r--src/mame/layout/adpservice.lay97
-rw-r--r--src/mame/layout/alesis_midifex.lay807
-rw-r--r--src/mame/layout/alesis_midiverb.lay802
-rw-r--r--src/mame/layout/alphie.lay16
-rw-r--r--src/mame/layout/animalhs.lay258
-rw-r--r--src/mame/layout/ap10.lay212
-rw-r--r--src/mame/layout/arcmania.lay20
-rw-r--r--src/mame/layout/autorace.lay4
-rw-r--r--src/mame/layout/ave_arb.lay30
-rw-r--r--src/mame/layout/babydad.lay224
-rw-r--r--src/mame/layout/babypkr.lay249
-rw-r--r--src/mame/layout/ballch.lay180
-rw-r--r--src/mame/layout/bbcm.lay73
-rw-r--r--src/mame/layout/bcheetah.lay6
-rw-r--r--src/mame/layout/beaminv.lay17
-rw-r--r--src/mame/layout/beena.lay195
-rw-r--r--src/mame/layout/bejpoker.lay271
-rw-r--r--src/mame/layout/bfm_sc4.lay24
-rw-r--r--src/mame/layout/bfm_sc5.lay24
-rw-r--r--src/mame/layout/bfm_sc5_gu96x8.lay24
-rw-r--r--src/mame/layout/bfmsys85.lay10
-rw-r--r--src/mame/layout/bigtrak.lay8
-rw-r--r--src/mame/layout/blackpntu.lay271
-rw-r--r--src/mame/layout/blckjack.lay119
-rw-r--r--src/mame/layout/blockch.lay2
-rw-r--r--src/mame/layout/blockfvr.lay78
-rw-r--r--src/mame/layout/bonusch.lay349
-rw-r--r--src/mame/layout/bpartyb.lay876
-rw-r--r--src/mame/layout/bpoker.lay250
-rw-r--r--src/mame/layout/buckrog.lay14
-rw-r--r--src/mame/layout/buggybjr.lay24
-rw-r--r--src/mame/layout/buggyboy.lay48
-rw-r--r--src/mame/layout/buggychl.lay24
-rw-r--r--src/mame/layout/cbombers.lay24
-rw-r--r--src/mame/layout/ccly.lay415
-rw-r--r--src/mame/layout/cd3000i.lay881
-rw-r--r--src/mame/layout/cd3000xl.lay865
-rw-r--r--src/mame/layout/cdtv.lay259
-rw-r--r--src/mame/layout/ces_ccclass.lay156
-rw-r--r--src/mame/layout/ces_hrclass.lay81
-rw-r--r--src/mame/layout/ces_tsclass.lay114
-rw-r--r--src/mame/layout/changela.lay24
-rw-r--r--src/mame/layout/chasehq.lay24
-rw-r--r--src/mame/layout/chessmate.lay4
-rw-r--r--src/mame/layout/chessmst.lay4
-rw-r--r--src/mame/layout/chessmstdm.lay81
-rw-r--r--src/mame/layout/chqflag.lay24
-rw-r--r--src/mame/layout/cischeat.lay24
-rw-r--r--src/mame/layout/cking_master.lay14
-rw-r--r--src/mame/layout/cking_pmicrodx.lay82
-rw-r--r--src/mame/layout/cking_triomphe.lay2
-rw-r--r--src/mame/layout/cluedo.lay1248
-rw-r--r--src/mame/layout/cmast97.lay262
-rw-r--r--src/mame/layout/cmaster.lay80
-rw-r--r--src/mame/layout/cmv4.lay14
-rw-r--r--src/mame/layout/cnbaskb.lay8
-rw-r--r--src/mame/layout/cnfball.lay12
-rw-r--r--src/mame/layout/cnfball2.lay28
-rw-r--r--src/mame/layout/cnsector.lay4
-rw-r--r--src/mame/layout/codemagik.lay153
-rw-r--r--src/mame/layout/comparc.lay72
-rw-r--r--src/mame/layout/comparca.lay72
-rw-r--r--src/mame/layout/compperf.lay8
-rw-r--r--src/mame/layout/conchess.lay60
-rw-r--r--src/mame/layout/conic_cchess2.lay6
-rw-r--r--src/mame/layout/contcirc.lay24
-rw-r--r--src/mame/layout/copycat.lay12
-rw-r--r--src/mame/layout/cots.lay212
-rw-r--r--src/mame/layout/crzybugs.lay208
-rw-r--r--src/mame/layout/ct8000.lay393
-rw-r--r--src/mame/layout/ctainv.lay19
-rw-r--r--src/mame/layout/ctfk1.lay241
-rw-r--r--src/mame/layout/ctk530.lay152
-rw-r--r--src/mame/layout/cxg_chess2001.lay24
-rw-r--r--src/mame/layout/cxg_chess3008.lay480
-rw-r--r--src/mame/layout/cxg_commander.lay27
-rw-r--r--src/mame/layout/cxg_cpchess2.lay498
-rw-r--r--src/mame/layout/cxg_dominator.lay22
-rw-r--r--src/mame/layout/cxg_enterprise.lay2
-rw-r--r--src/mame/layout/cxg_galaxy.lay29
-rw-r--r--src/mame/layout/cxg_granada.lay458
-rw-r--r--src/mame/layout/cxg_junior.lay480
-rw-r--r--src/mame/layout/cxg_legend.lay500
-rw-r--r--src/mame/layout/cxg_pchess.lay73
-rw-r--r--src/mame/layout/cxg_professor.lay8
-rw-r--r--src/mame/layout/cxg_royal.lay510
-rw-r--r--src/mame/layout/cxg_scpchess.lay375
-rw-r--r--src/mame/layout/cxg_scpchessa.lay375
-rw-r--r--src/mame/layout/cxg_scptchess.lay375
-rw-r--r--src/mame/layout/cxg_scptchessa.lay375
-rw-r--r--src/mame/layout/cxg_senterprise.lay31
-rw-r--r--src/mame/layout/cxg_senterprisec.lay33
-rw-r--r--src/mame/layout/cxg_sphinx40.lay35
-rw-r--r--src/mame/layout/cxg_supra.lay521
-rw-r--r--src/mame/layout/cz1.lay152
-rw-r--r--src/mame/layout/cz101.lay128
-rw-r--r--src/mame/layout/cz230s.lay128
-rw-r--r--src/mame/layout/dataman.lay134
-rw-r--r--src/mame/layout/dblaxle.lay24
-rw-r--r--src/mame/layout/dbridgec.lay178
-rw-r--r--src/mame/layout/debutm.lay66
-rw-r--r--src/mame/layout/dendego.lay331
-rw-r--r--src/mame/layout/destroyr.lay24
-rw-r--r--src/mame/layout/disc2000.lay353
-rw-r--r--src/mame/layout/dolphntru.lay365
-rw-r--r--src/mame/layout/dolphntrua.lay365
-rw-r--r--src/mame/layout/drw80pkr.lay182
-rw-r--r--src/mame/layout/drwho.lay8
-rw-r--r--src/mame/layout/dunksunk.lay18
-rw-r--r--src/mame/layout/dx100.lay86
-rw-r--r--src/mame/layout/ecoinf2.lay16
-rw-r--r--src/mame/layout/ecoinf3.lay16
-rw-r--r--src/mame/layout/ecoinfr.lay12
-rw-r--r--src/mame/layout/efball.lay2
-rw-r--r--src/mame/layout/einvader.lay4
-rw-r--r--src/mame/layout/einvaderc.lay4
-rw-r--r--src/mame/layout/elbaskb.lay138
-rw-r--r--src/mame/layout/elcirculo.lay53
-rw-r--r--src/mame/layout/elecdet.lay52
-rw-r--r--src/mame/layout/elf2.lay180
-rw-r--r--src/mame/layout/enforceja.lay24
-rw-r--r--src/mame/layout/esq1.lay822
-rw-r--r--src/mame/layout/esq1by22.lay9
-rw-r--r--src/mame/layout/esq2by40.lay18
-rw-r--r--src/mame/layout/esq2by40_vfx.lay64
-rw-r--r--src/mame/layout/excal_ivant.lay12
-rw-r--r--src/mame/layout/excal_ivanto.lay10
-rw-r--r--src/mame/layout/excal_mirage.lay86
-rw-r--r--src/mame/layout/f1gpstar.lay24
-rw-r--r--src/mame/layout/f1superb.lay24
-rw-r--r--src/mame/layout/f2pbball.lay16
-rw-r--r--src/mame/layout/ferie.lay108
-rw-r--r--src/mame/layout/fidel_brc.lay2
-rw-r--r--src/mame/layout/fidel_bv3.lay70
-rw-r--r--src/mame/layout/fidel_cc7.lay (renamed from src/mame/layout/fidel_bcc.lay)0
-rw-r--r--src/mame/layout/fidel_classic.lay449
-rw-r--r--src/mame/layout/fidel_cphantom.lay349
-rw-r--r--src/mame/layout/fidel_des.lay451
-rw-r--r--src/mame/layout/fidel_desdis.lay32
-rw-r--r--src/mame/layout/fidel_desdis_68kg.lay32
-rw-r--r--src/mame/layout/fidel_desdis_68kr.lay32
-rw-r--r--src/mame/layout/fidel_eag.lay2
-rw-r--r--src/mame/layout/fidel_eag_68k.lay2
-rw-r--r--src/mame/layout/fidel_eag_priv.lay526
-rw-r--r--src/mame/layout/fidel_eas.lay210
-rw-r--r--src/mame/layout/fidel_eldorado.lay10
-rw-r--r--src/mame/layout/fidel_ex.lay2
-rw-r--r--src/mame/layout/fidel_gambitv.lay (renamed from src/mame/layout/fidel_gambit.lay)0
-rw-r--r--src/mame/layout/fidel_gin.lay70
-rw-r--r--src/mame/layout/fidel_msc_v1.lay4
-rw-r--r--src/mame/layout/fidel_msc_v2.lay105
-rw-r--r--src/mame/layout/fidel_phantom.lay346
-rw-r--r--src/mame/layout/fidel_sc12.lay14
-rw-r--r--src/mame/layout/finalapr.lay24
-rw-r--r--src/mame/layout/finallap.lay24
-rw-r--r--src/mame/layout/fingbowl.lay60
-rw-r--r--src/mame/layout/ftri1.lay8
-rw-r--r--src/mame/layout/gamball.lay8
-rw-r--r--src/mame/layout/geishanz.lay (renamed from src/mame/layout/geisha.lay)0
-rw-r--r--src/mame/layout/gldncrwn.lay24
-rw-r--r--src/mame/layout/goldnpkr.lay49
-rw-r--r--src/mame/layout/goldnswp.lay170
-rw-r--r--src/mame/layout/goldpyr.lay (renamed from src/mame/layout/goldpyrb.lay)0
-rw-r--r--src/mame/layout/grandmaster.lay730
-rw-r--r--src/mame/layout/granits.lay481
-rw-r--r--src/mame/layout/grchamp.lay24
-rw-r--r--src/mame/layout/gridiron.lay1
-rw-r--r--src/mame/layout/grobot9.lay27
-rw-r--r--src/mame/layout/gunchamp.lay3
-rw-r--r--src/mame/layout/gunchamps.lay3
-rw-r--r--src/mame/layout/h2hbaskb.lay12
-rw-r--r--src/mame/layout/h2hbaskbc.lay12
-rw-r--r--src/mame/layout/h2hboxing.lay6
-rw-r--r--src/mame/layout/h2hhockey.lay24
-rw-r--r--src/mame/layout/h2hhockeyc.lay24
-rw-r--r--src/mame/layout/h2hsoccerc.lay24
-rw-r--r--src/mame/layout/hh_e0c6200_lcd.lay (renamed from src/mame/layout/hh_ht11xx_single.lay)0
-rw-r--r--src/mame/layout/hh_ht11xx_lcd.lay15
-rw-r--r--src/mame/layout/hh_sm510_tripleh.lay35
-rw-r--r--src/mame/layout/hitparade.lay6
-rw-r--r--src/mame/layout/horseran.lay160
-rw-r--r--src/mame/layout/igsslot.lay132
-rw-r--r--src/mame/layout/imolagp.lay35
-rw-r--r--src/mame/layout/intchess.lay (renamed from src/mame/layout/saitek_intchess.lay)0
-rw-r--r--src/mame/layout/intellect02.lay62
-rw-r--r--src/mame/layout/iris1400.lay54
-rw-r--r--src/mame/layout/j2adnote.lay32
-rw-r--r--src/mame/layout/j2always.lay24
-rw-r--r--src/mame/layout/j2bankch.lay24
-rw-r--r--src/mame/layout/j2bigbnk.lay24
-rw-r--r--src/mame/layout/j2bigbox.lay24
-rw-r--r--src/mame/layout/j2blustr.lay24
-rw-r--r--src/mame/layout/j2cashbn.lay32
-rw-r--r--src/mame/layout/j2cashrl.lay24
-rw-r--r--src/mame/layout/j2cashro.lay24
-rw-r--r--src/mame/layout/j2cashrv.lay24
-rw-r--r--src/mame/layout/j2cashtk.lay24
-rw-r--r--src/mame/layout/j2coinsh.lay24
-rw-r--r--src/mame/layout/j2coppot.lay24
-rw-r--r--src/mame/layout/j2cprndx.lay24
-rw-r--r--src/mame/layout/j2criscr.lay24
-rw-r--r--src/mame/layout/j2crown.lay24
-rw-r--r--src/mame/layout/j2cshalm.lay24
-rw-r--r--src/mame/layout/j2cshcrd.lay24
-rw-r--r--src/mame/layout/j2cshfil.lay24
-rw-r--r--src/mame/layout/j2cshnud.lay24
-rw-r--r--src/mame/layout/j2cshsmh.lay24
-rw-r--r--src/mame/layout/j2cvault.lay24
-rw-r--r--src/mame/layout/j2droplt.lay24
-rw-r--r--src/mame/layout/j2ewn.lay24
-rw-r--r--src/mame/layout/j2ews.lay24
-rw-r--r--src/mame/layout/j2exec.lay32
-rw-r--r--src/mame/layout/j2fasttk.lay24
-rw-r--r--src/mame/layout/j2fiveal.lay24
-rw-r--r--src/mame/layout/j2fiveln.lay24
-rw-r--r--src/mame/layout/j2frucnx.lay24
-rw-r--r--src/mame/layout/j2fullhs.lay32
-rw-r--r--src/mame/layout/j2fws.lay24
-rw-r--r--src/mame/layout/j2ghostb.lay24
-rw-r--r--src/mame/layout/j2gldchy.lay24
-rw-r--r--src/mame/layout/j2goldbr.lay24
-rw-r--r--src/mame/layout/j2hilocl.lay32
-rw-r--r--src/mame/layout/j2hinote.lay32
-rw-r--r--src/mame/layout/j2hiroll.lay32
-rw-r--r--src/mame/layout/j2hitmon.lay24
-rw-r--r--src/mame/layout/j2hotpot.lay24
-rw-r--r--src/mame/layout/j2hotsht.lay32
-rw-r--r--src/mame/layout/j2hypnot.lay24
-rw-r--r--src/mame/layout/j2jackbr.lay24
-rw-r--r--src/mame/layout/j2kingcl.lay32
-rw-r--r--src/mame/layout/j2litean.lay24
-rw-r--r--src/mame/layout/j2litnot.lay32
-rw-r--r--src/mame/layout/j2lovshd.lay24
-rw-r--r--src/mame/layout/j2lovsht.lay24
-rw-r--r--src/mame/layout/j2luckar.lay24
-rw-r--r--src/mame/layout/j2lucky2.lay24
-rw-r--r--src/mame/layout/j2maxima.lay24
-rw-r--r--src/mame/layout/j2missis.lay32
-rw-r--r--src/mame/layout/j2monblt.lay24
-rw-r--r--src/mame/layout/j2mongam.lay32
-rw-r--r--src/mame/layout/j2montrp.lay24
-rw-r--r--src/mame/layout/j2nolimt.lay24
-rw-r--r--src/mame/layout/j2notesh.lay24
-rw-r--r--src/mame/layout/j2nudbnz.lay24
-rw-r--r--src/mame/layout/j2nudfev.lay24
-rw-r--r--src/mame/layout/j2nudmon.lay24
-rw-r--r--src/mame/layout/j2nudshf.lay24
-rw-r--r--src/mame/layout/j2paypkt.lay24
-rw-r--r--src/mame/layout/j2penny.lay24
-rw-r--r--src/mame/layout/j2plsmnd.lay32
-rw-r--r--src/mame/layout/j2plsnud.lay24
-rw-r--r--src/mame/layout/j2pndrsh.lay24
-rw-r--r--src/mame/layout/j2rdclb.lay32
-rw-r--r--src/mame/layout/j2reelbn.lay32
-rw-r--r--src/mame/layout/j2reelbo.lay32
-rw-r--r--src/mame/layout/j2reelcz.lay24
-rw-r--r--src/mame/layout/j2reelmc.lay32
-rw-r--r--src/mame/layout/j2reelmo.lay24
-rw-r--r--src/mame/layout/j2silvcl.lay24
-rw-r--r--src/mame/layout/j2silvsh.lay24
-rw-r--r--src/mame/layout/j2sldgld.lay48
-rw-r--r--src/mame/layout/j2slvrgh.lay24
-rw-r--r--src/mame/layout/j2spcrsv.lay24
-rw-r--r--src/mame/layout/j2sstrea.lay24
-rw-r--r--src/mame/layout/j2stahed.lay32
-rw-r--r--src/mame/layout/j2supfrc.lay32
-rw-r--r--src/mame/layout/j2suprsh.lay24
-rw-r--r--src/mame/layout/j2supsft.lay24
-rw-r--r--src/mame/layout/j2supstp.lay32
-rw-r--r--src/mame/layout/j2suptrk.lay24
-rw-r--r--src/mame/layout/j2swbank.lay24
-rw-r--r--src/mame/layout/j2take2.lay24
-rw-r--r--src/mame/layout/j2trail.lay24
-rw-r--r--src/mame/layout/j2tstplt.lay24
-rw-r--r--src/mame/layout/j5ar80cla.lay40
-rw-r--r--src/mame/layout/j5cira.lay32
-rw-r--r--src/mame/layout/j5fairp.lay32
-rw-r--r--src/mame/layout/j5firebl.lay24
-rw-r--r--src/mame/layout/j5hollyc.lay32
-rw-r--r--src/mame/layout/j5hotdoga.lay32
-rw-r--r--src/mame/layout/j5indsum.lay24
-rw-r--r--src/mame/layout/j5intr.lay32
-rw-r--r--src/mame/layout/j5movie.lay40
-rw-r--r--src/mame/layout/j5nite.lay40
-rw-r--r--src/mame/layout/j5palma.lay32
-rw-r--r--src/mame/layout/j5popeye.lay32
-rw-r--r--src/mame/layout/j5sizl.lay24
-rw-r--r--src/mame/layout/j5supbara.lay48
-rw-r--r--src/mame/layout/j5suphi.lay32
-rw-r--r--src/mame/layout/j5swop.lay32
-rw-r--r--src/mame/layout/j5term.lay32
-rw-r--r--src/mame/layout/j5topshp.lay32
-rw-r--r--src/mame/layout/j5trail.lay40
-rw-r--r--src/mame/layout/j5ujb.lay24
-rw-r--r--src/mame/layout/j5wsc.lay40
-rw-r--r--src/mame/layout/j6aceclb.lay20
-rw-r--r--src/mame/layout/j6acehi.lay32
-rw-r--r--src/mame/layout/j6amdrm.lay32
-rw-r--r--src/mame/layout/j6arcadee.lay16
-rw-r--r--src/mame/layout/j6big50.lay16
-rw-r--r--src/mame/layout/j6bigbukc.lay32
-rw-r--r--src/mame/layout/j6bigtopa.lay20
-rw-r--r--src/mame/layout/j6bnkrcl.lay40
-rw-r--r--src/mame/layout/j6bnza.lay32
-rw-r--r--src/mame/layout/j6btbwd.lay48
-rw-r--r--src/mame/layout/j6camelt.lay16
-rw-r--r--src/mame/layout/j6casclaf.lay40
-rw-r--r--src/mame/layout/j6cascze.lay32
-rw-r--r--src/mame/layout/j6colcsh.lay16
-rw-r--r--src/mame/layout/j6cpal.lay32
-rw-r--r--src/mame/layout/j6crack.lay32
-rw-r--r--src/mame/layout/j6drdogh.lay16
-rw-r--r--src/mame/layout/j6euphor.lay40
-rw-r--r--src/mame/layout/j6ewn.lay24
-rw-r--r--src/mame/layout/j6fastfr.lay40
-rw-r--r--src/mame/layout/j6ffce.lay40
-rw-r--r--src/mame/layout/j6frtpot.lay32
-rw-r--r--src/mame/layout/j6gidogh.lay32
-rw-r--r--src/mame/layout/j6gldclb.lay40
-rw-r--r--src/mame/layout/j6gogold.lay32
-rw-r--r--src/mame/layout/j6goldgla.lay32
-rw-r--r--src/mame/layout/j6guabc.lay32
-rw-r--r--src/mame/layout/j6guabcl.lay40
-rw-r--r--src/mame/layout/j6hapyhrb.lay30
-rw-r--r--src/mame/layout/j6impuls.lay16
-rw-r--r--src/mame/layout/j6impuls15.lay16
-rw-r--r--src/mame/layout/j6indy6.lay16
-rw-r--r--src/mame/layout/j6indy8.lay16
-rw-r--r--src/mame/layout/j6kfc.lay40
-rw-r--r--src/mame/layout/j6kungfu.lay16
-rw-r--r--src/mame/layout/j6megbck.lay32
-rw-r--r--src/mame/layout/j6mono60.lay40
-rw-r--r--src/mame/layout/j6mono6010.lay40
-rw-r--r--src/mame/layout/j6mono608.lay40
-rw-r--r--src/mame/layout/j6monst.lay40
-rw-r--r--src/mame/layout/j6montlk.lay32
-rw-r--r--src/mame/layout/j6montlk6.lay32
-rw-r--r--src/mame/layout/j6oxobin.lay12
-rw-r--r--src/mame/layout/j6oxobin10.lay12
-rw-r--r--src/mame/layout/j6quick.lay32
-rw-r--r--src/mame/layout/j6ra.lay32
-rw-r--r--src/mame/layout/j6redarwf.lay32
-rw-r--r--src/mame/layout/j6reelmn.lay24
-rw-r--r--src/mame/layout/j6rh6cld.lay48
-rw-r--r--src/mame/layout/j6rhchil.lay48
-rw-r--r--src/mame/layout/j6rico10.lay16
-rw-r--r--src/mame/layout/j6roller10.lay16
-rw-r--r--src/mame/layout/j6roller15.lay32
-rw-r--r--src/mame/layout/j6roller8.lay16
-rw-r--r--src/mame/layout/j6slagng.lay32
-rw-r--r--src/mame/layout/j6snakes.lay16
-rw-r--r--src/mame/layout/j6sonic10.lay16
-rw-r--r--src/mame/layout/j6stards.lay16
-rw-r--r--src/mame/layout/j6swpdrp.lay32
-rw-r--r--src/mame/layout/j6tombc.lay32
-rw-r--r--src/mame/layout/j6topflg.lay32
-rw-r--r--src/mame/layout/j6twst.lay32
-rw-r--r--src/mame/layout/j6untch.lay16
-rw-r--r--src/mame/layout/j6vindal.lay40
-rw-r--r--src/mame/layout/j6vivark.lay32
-rw-r--r--src/mame/layout/j6wizardd.lay16
-rw-r--r--src/mame/layout/j6wldkng.lay10
-rw-r--r--src/mame/layout/j80bac.lay24
-rw-r--r--src/mame/layout/j80bounc.lay24
-rw-r--r--src/mame/layout/j80frogh.lay24
-rw-r--r--src/mame/layout/j80golds.lay32
-rw-r--r--src/mame/layout/j80hotln.lay24
-rw-r--r--src/mame/layout/j80myspn.lay32
-rw-r--r--src/mame/layout/j80nudg2.lay24
-rw-r--r--src/mame/layout/j80rr.lay24
-rw-r--r--src/mame/layout/j80supbk.lay24
-rw-r--r--src/mame/layout/j80supst.lay32
-rw-r--r--src/mame/layout/j80topsp.lay24
-rw-r--r--src/mame/layout/j80wsprt2.lay24
-rw-r--r--src/mame/layout/jankenmn.lay82
-rw-r--r--src/mame/layout/jinpaish.lay291
-rw-r--r--src/mame/layout/jking02.lay332
-rw-r--r--src/mame/layout/jking04.lay204
-rw-r--r--src/mame/layout/jpmmps.lay12
-rw-r--r--src/mame/layout/jpms80.lay12
-rw-r--r--src/mame/layout/kchal.lay462
-rw-r--r--src/mame/layout/kenseim.lay549
-rw-r--r--src/mame/layout/kgbirdnz.lay (renamed from src/mame/layout/kgbird.lay)0
-rw-r--r--src/mame/layout/kim1.lay33
-rw-r--r--src/mame/layout/kingsran.lay447
-rw-r--r--src/mame/layout/kn5000.lay1337
-rw-r--r--src/mame/layout/konamigt.lay24
-rw-r--r--src/mame/layout/krypton_regency.lay485
-rw-r--r--src/mame/layout/krzykeno.lay225
-rw-r--r--src/mame/layout/kungfur.lay49
-rw-r--r--src/mame/layout/lagunar.lay24
-rw-r--r--src/mame/layout/lchicken.lay8
-rw-r--r--src/mame/layout/lependu.lay2
-rw-r--r--src/mame/layout/lightfgt.lay18
-rw-r--r--src/mame/layout/lilprof.lay48
-rw-r--r--src/mame/layout/lilprofo.lay88
-rw-r--r--src/mame/layout/linn_linndrum.lay905
-rw-r--r--src/mame/layout/ll3.lay349
-rw-r--r--src/mame/layout/lnux4004.lay79
-rw-r--r--src/mame/layout/lostreas.lay14
-rw-r--r--src/mame/layout/lucky8p1.lay21
-rw-r--r--src/mame/layout/m1albsqp.lay48
-rw-r--r--src/mame/layout/m1apollo2.lay48
-rw-r--r--src/mame/layout/m1bargnc.lay48
-rw-r--r--src/mame/layout/m1bghou.lay40
-rw-r--r--src/mame/layout/m1bigdel.lay24
-rw-r--r--src/mame/layout/m1calypsa.lay32
-rw-r--r--src/mame/layout/m1casclb.lay32
-rw-r--r--src/mame/layout/m1casroy1.lay32
-rw-r--r--src/mame/layout/m1chain.lay32
-rw-r--r--src/mame/layout/m1cik51o.lay32
-rw-r--r--src/mame/layout/m1clbfvr.lay40
-rw-r--r--src/mame/layout/m1cluecb1.lay40
-rw-r--r--src/mame/layout/m1cluedo4.lay32
-rw-r--r--src/mame/layout/m1cluessf.lay32
-rw-r--r--src/mame/layout/m1coro21n.lay32
-rw-r--r--src/mame/layout/m1cororrk.lay32
-rw-r--r--src/mame/layout/m1dkong91n.lay32
-rw-r--r--src/mame/layout/m1dxmono51o.lay40
-rw-r--r--src/mame/layout/m1eastndl.lay32
-rw-r--r--src/mame/layout/m1eastqv3.lay32
-rw-r--r--src/mame/layout/m1fantfbb.lay32
-rw-r--r--src/mame/layout/m1fightb.lay32
-rw-r--r--src/mame/layout/m1frexplc.lay32
-rw-r--r--src/mame/layout/m1gladg.lay32
-rw-r--r--src/mame/layout/m1grescb.lay32
-rw-r--r--src/mame/layout/m1guvnor.lay24
-rw-r--r--src/mame/layout/m1hotpoth.lay32
-rw-r--r--src/mame/layout/m1htclb.lay40
-rw-r--r--src/mame/layout/m1imclb.lay40
-rw-r--r--src/mame/layout/m1infern.lay32
-rw-r--r--src/mame/layout/m1inwinc.lay32
-rw-r--r--src/mame/layout/m1itjobc.lay32
-rw-r--r--src/mame/layout/m1itskob.lay32
-rw-r--r--src/mame/layout/m1jpmult.lay24
-rw-r--r--src/mame/layout/m1lucknon.lay24
-rw-r--r--src/mame/layout/m1luxorb.lay32
-rw-r--r--src/mame/layout/m1manhat.lay32
-rw-r--r--src/mame/layout/m1monclb.lay40
-rw-r--r--src/mame/layout/m1mongam.lay40
-rw-r--r--src/mame/layout/m1monmon.lay32
-rw-r--r--src/mame/layout/m1monou.lay40
-rw-r--r--src/mame/layout/m1nhp.lay32
-rw-r--r--src/mame/layout/m1nudbnke.lay32
-rw-r--r--src/mame/layout/m1omega.lay32
-rw-r--r--src/mame/layout/m1onbusa.lay32
-rw-r--r--src/mame/layout/m1pinkpc.lay32
-rw-r--r--src/mame/layout/m1przeeb.lay32
-rw-r--r--src/mame/layout/m1retpp.lay40
-rw-r--r--src/mame/layout/m1search.lay32
-rw-r--r--src/mame/layout/m1sptlgtc.lay32
-rw-r--r--src/mame/layout/m1startr.lay32
-rw-r--r--src/mame/layout/m1sudnima.lay32
-rw-r--r--src/mame/layout/m1taknot.lay24
-rw-r--r--src/mame/layout/m1thatlfc.lay32
-rw-r--r--src/mame/layout/m1topstr.lay32
-rw-r--r--src/mame/layout/m1triviax.lay32
-rw-r--r--src/mame/layout/m1trtr.lay32
-rw-r--r--src/mame/layout/m1ttcash.lay32
-rw-r--r--src/mame/layout/m1wldzner.lay32
-rw-r--r--src/mame/layout/m1wotwa.lay32
-rw-r--r--src/mame/layout/m3acech.lay24
-rw-r--r--src/mame/layout/m3autort.lay24
-rw-r--r--src/mame/layout/m3biggam.lay24
-rw-r--r--src/mame/layout/m3bigsht.lay24
-rw-r--r--src/mame/layout/m3blkhle.lay24
-rw-r--r--src/mame/layout/m3cabreta.lay32
-rw-r--r--src/mame/layout/m3chase.lay24
-rw-r--r--src/mame/layout/m3circle.lay32
-rw-r--r--src/mame/layout/m3cskill.lay24
-rw-r--r--src/mame/layout/m3cunlim.lay24
-rw-r--r--src/mame/layout/m3fortun.lay24
-rw-r--r--src/mame/layout/m3gcrown.lay24
-rw-r--r--src/mame/layout/m3gmine.lay24
-rw-r--r--src/mame/layout/m3lineup.lay24
-rw-r--r--src/mame/layout/m3loony.lay24
-rw-r--r--src/mame/layout/m3nnice.lay24
-rw-r--r--src/mame/layout/m3oddson.lay24
-rw-r--r--src/mame/layout/m3online.lay24
-rw-r--r--src/mame/layout/m3oxo.lay24
-rw-r--r--src/mame/layout/m3ratrce.lay24
-rw-r--r--src/mame/layout/m3razdaza.lay24
-rw-r--r--src/mame/layout/m3replay.lay24
-rw-r--r--src/mame/layout/m3rockpl.lay24
-rw-r--r--src/mame/layout/m3rollem.lay24
-rw-r--r--src/mame/layout/m3rxchng.lay32
-rw-r--r--src/mame/layout/m3sexcu.lay24
-rw-r--r--src/mame/layout/m3slight.lay24
-rw-r--r--src/mame/layout/m3snaphp.lay24
-rw-r--r--src/mame/layout/m3spoof.lay24
-rw-r--r--src/mame/layout/m3supadr.lay24
-rw-r--r--src/mame/layout/m3supnud.lay24
-rw-r--r--src/mame/layout/m3supspo.lay24
-rw-r--r--src/mame/layout/m3supwin.lay24
-rw-r--r--src/mame/layout/m3sweep.lay32
-rw-r--r--src/mame/layout/m3tfair.lay24
-rw-r--r--src/mame/layout/m3toplin.lay24
-rw-r--r--src/mame/layout/m3winagnb.lay24
-rw-r--r--src/mame/layout/m3winstr.lay24
-rw-r--r--src/mame/layout/m3xchngg.lay24
-rw-r--r--src/mame/layout/m4aao.lay32
-rw-r--r--src/mame/layout/m4actbnk.lay12
-rw-r--r--src/mame/layout/m4actclb.lay32
-rw-r--r--src/mame/layout/m4actpak.lay12
-rw-r--r--src/mame/layout/m4addr.lay32
-rw-r--r--src/mame/layout/m4alladv.lay24
-rw-r--r--src/mame/layout/m4alpha.lay32
-rw-r--r--src/mame/layout/m4andybt.lay51
-rw-r--r--src/mame/layout/m4andycp.lay16
-rw-r--r--src/mame/layout/m4andyfh.lay12
-rw-r--r--src/mame/layout/m4andyge.lay20
-rw-r--r--src/mame/layout/m4apachg.lay16
-rw-r--r--src/mame/layout/m4tenten.lay12
-rw-r--r--src/mame/layout/m5addams.lay32
-rw-r--r--src/mame/layout/m5all41d.lay32
-rw-r--r--src/mame/layout/m5arab.lay32
-rw-r--r--src/mame/layout/m5austin11.lay32
-rw-r--r--src/mame/layout/m5barkng.lay24
-rw-r--r--src/mame/layout/m5barmy.lay32
-rw-r--r--src/mame/layout/m5baxe04.lay32
-rw-r--r--src/mame/layout/m5bbro.lay32
-rw-r--r--src/mame/layout/m5bbrocl.lay40
-rw-r--r--src/mame/layout/m5beansa.lay32
-rw-r--r--src/mame/layout/m5bigchs.lay32
-rw-r--r--src/mame/layout/m5biggam.lay32
-rw-r--r--src/mame/layout/m5bling.lay40
-rw-r--r--src/mame/layout/m5blkwht11.lay32
-rw-r--r--src/mame/layout/m5bnzclb.lay40
-rw-r--r--src/mame/layout/m5btlbnk.lay56
-rw-r--r--src/mame/layout/m5bttf.lay32
-rw-r--r--src/mame/layout/m5bwaves.lay24
-rw-r--r--src/mame/layout/m5carou.lay32
-rw-r--r--src/mame/layout/m5cashat.lay32
-rw-r--r--src/mame/layout/m5cashrn.lay24
-rw-r--r--src/mame/layout/m5cbw.lay32
-rw-r--r--src/mame/layout/m5centcl.lay48
-rw-r--r--src/mame/layout/m5circlb33.lay48
-rw-r--r--src/mame/layout/m5circus0a.lay24
-rw-r--r--src/mame/layout/m5clifhn.lay32
-rw-r--r--src/mame/layout/m5clown11.lay32
-rw-r--r--src/mame/layout/m5codft.lay40
-rw-r--r--src/mame/layout/m5cosclb.lay48
-rw-r--r--src/mame/layout/m5crzkni.lay24
-rw-r--r--src/mame/layout/m5cshkcb.lay40
-rw-r--r--src/mame/layout/m5cshstx.lay32
-rw-r--r--src/mame/layout/m5dblqtsb.lay32
-rw-r--r--src/mame/layout/m5devil.lay32
-rw-r--r--src/mame/layout/m5dick10.lay32
-rw-r--r--src/mame/layout/m5doshpk05.lay32
-rw-r--r--src/mame/layout/m5egr.lay24
-rw-r--r--src/mame/layout/m5elband.lay64
-rw-r--r--src/mame/layout/m5elim.lay32
-rw-r--r--src/mame/layout/m5evgrhr.lay24
-rw-r--r--src/mame/layout/m5ewn.lay32
-rw-r--r--src/mame/layout/m5extrm.lay32
-rw-r--r--src/mame/layout/m5fiddle.lay32
-rw-r--r--src/mame/layout/m5fire.lay32
-rw-r--r--src/mame/layout/m5firebl.lay32
-rw-r--r--src/mame/layout/m5flipcr.lay32
-rw-r--r--src/mame/layout/m5fortby.lay32
-rw-r--r--src/mame/layout/m5frnzy.lay32
-rw-r--r--src/mame/layout/m5funsun.lay32
-rw-r--r--src/mame/layout/m5gdrag.lay32
-rw-r--r--src/mame/layout/m5ggems20.lay56
-rw-r--r--src/mame/layout/m5gimmie.lay32
-rw-r--r--src/mame/layout/m5grush.lay24
-rw-r--r--src/mame/layout/m5grush5.lay24
-rw-r--r--src/mame/layout/m5gsstrk07.lay24
-rw-r--r--src/mame/layout/m5gstrik.lay40
-rw-r--r--src/mame/layout/m5hellrz.lay32
-rw-r--r--src/mame/layout/m5hgl14.lay32
-rw-r--r--src/mame/layout/m5hiclau.lay64
-rw-r--r--src/mame/layout/m5hifly.lay32
-rw-r--r--src/mame/layout/m5hilok.lay40
-rw-r--r--src/mame/layout/m5hisprt.lay32
-rw-r--r--src/mame/layout/m5hlsumo.lay32
-rw-r--r--src/mame/layout/m5holy.lay32
-rw-r--r--src/mame/layout/m5hopidl.lay56
-rw-r--r--src/mame/layout/m5hotslt.lay24
-rw-r--r--src/mame/layout/m5hotstf.lay32
-rw-r--r--src/mame/layout/m5hypvip.lay32
-rw-r--r--src/mame/layout/m5jackbx.lay40
-rw-r--r--src/mame/layout/m5jackp2.lay32
-rw-r--r--src/mame/layout/m5jackpt.lay32
-rw-r--r--src/mame/layout/m5jlyjwl.lay24
-rw-r--r--src/mame/layout/m5jmpgem01.lay32
-rw-r--r--src/mame/layout/m5kingqc06.lay32
-rw-r--r--src/mame/layout/m5kkebab.lay32
-rw-r--r--src/mame/layout/m5korma.lay32
-rw-r--r--src/mame/layout/m5loony.lay32
-rw-r--r--src/mame/layout/m5loot.lay48
-rw-r--r--src/mame/layout/m5lotta.lay32
-rw-r--r--src/mame/layout/m5martns07.lay24
-rw-r--r--src/mame/layout/m5mega.lay32
-rw-r--r--src/mame/layout/m5mmak06.lay32
-rw-r--r--src/mame/layout/m5monmst.lay32
-rw-r--r--src/mame/layout/m5mpfc.lay32
-rw-r--r--src/mame/layout/m5mprio.lay32
-rw-r--r--src/mame/layout/m5neptun.lay32
-rw-r--r--src/mame/layout/m5nnww.lay24
-rw-r--r--src/mame/layout/m5oohaah.lay32
-rw-r--r--src/mame/layout/m5oohrio.lay24
-rw-r--r--src/mame/layout/m5openbx05.lay24
-rw-r--r--src/mame/layout/m5overld.lay40
-rw-r--r--src/mame/layout/m5peepsh.lay32
-rw-r--r--src/mame/layout/m5piefac.lay56
-rw-r--r--src/mame/layout/m5piefcr.lay48
-rw-r--r--src/mame/layout/m5ppussy.lay32
-rw-r--r--src/mame/layout/m5psyccl01.lay40
-rw-r--r--src/mame/layout/m5psycho.lay32
-rw-r--r--src/mame/layout/m5ptyani.lay32
-rw-r--r--src/mame/layout/m5qdrawb.lay32
-rw-r--r--src/mame/layout/m5qshot04.lay24
-rw-r--r--src/mame/layout/m5ratpka.lay32
-rw-r--r--src/mame/layout/m5razdz10.lay32
-rw-r--r--src/mame/layout/m5redbal.lay32
-rw-r--r--src/mame/layout/m5redrcka.lay40
-rw-r--r--src/mame/layout/m5resfrg.lay32
-rw-r--r--src/mame/layout/m5revo13.lay32
-rw-r--r--src/mame/layout/m5rfymc.lay24
-rw-r--r--src/mame/layout/m5rgclb12.lay32
-rw-r--r--src/mame/layout/m5rhrgt02.lay24
-rw-r--r--src/mame/layout/m5ritj.lay32
-rw-r--r--src/mame/layout/m5rollup.lay64
-rw-r--r--src/mame/layout/m5rollx.lay40
-rw-r--r--src/mame/layout/m5rthh.lay40
-rw-r--r--src/mame/layout/m5rub.lay32
-rw-r--r--src/mame/layout/m5rwb.lay48
-rw-r--r--src/mame/layout/m5scharg.lay32
-rw-r--r--src/mame/layout/m5seven.lay24
-rw-r--r--src/mame/layout/m5shark.lay32
-rw-r--r--src/mame/layout/m5sheik.lay32
-rw-r--r--src/mame/layout/m5skulcl20.lay48
-rw-r--r--src/mame/layout/m5sondra.lay32
-rw-r--r--src/mame/layout/m5speccl.lay40
-rw-r--r--src/mame/layout/m5spiker.lay32
-rw-r--r--src/mame/layout/m5spins.lay24
-rw-r--r--src/mame/layout/m5squids06.lay32
-rw-r--r--src/mame/layout/m5sstrk.lay24
-rw-r--r--src/mame/layout/m5starcl.lay48
-rw-r--r--src/mame/layout/m5stars26.lay48
-rw-r--r--src/mame/layout/m5stax.lay32
-rw-r--r--src/mame/layout/m5supnov.lay32
-rw-r--r--src/mame/layout/m5supro.lay24
-rw-r--r--src/mame/layout/m5tbird.lay32
-rw-r--r--src/mame/layout/m5tempcl.lay40
-rw-r--r--src/mame/layout/m5tempp.lay48
-rw-r--r--src/mame/layout/m5tempt2.lay32
-rw-r--r--src/mame/layout/m5tictacbwb.lay48
-rw-r--r--src/mame/layout/m5trail.lay40
-rw-r--r--src/mame/layout/m5ultimo04.lay32
-rw-r--r--src/mame/layout/m5upover.lay40
-rw-r--r--src/mame/layout/m5vampup.lay32
-rw-r--r--src/mame/layout/m5vertgo.lay32
-rw-r--r--src/mame/layout/m5wking05.lay24
-rw-r--r--src/mame/layout/m5wonga.lay40
-rw-r--r--src/mame/layout/m5wthing20.lay40
-rw-r--r--src/mame/layout/m5xchn.lay24
-rw-r--r--src/mame/layout/m5xfact11.lay56
-rw-r--r--src/mame/layout/mac3.lay37
-rw-r--r--src/mame/layout/magibomb_ab45a.lay (renamed from src/mame/layout/magibombb.lay)0
-rw-r--r--src/mame/layout/marmagicua.lay (renamed from src/mame/layout/marmagicu.lay)0
-rw-r--r--src/mame/layout/marywu.lay6
-rw-r--r--src/mame/layout/matchme.lay30
-rw-r--r--src/mame/layout/matchnum.lay12
-rw-r--r--src/mame/layout/mathmagi.lay60
-rw-r--r--src/mame/layout/mathmarv.lay63
-rw-r--r--src/mame/layout/maygay1b.lay12
-rw-r--r--src/mame/layout/mbdtower.lay8
-rw-r--r--src/mame/layout/mchess.lay4
-rw-r--r--src/mame/layout/mcompgin.lay414
-rw-r--r--src/mame/layout/mega10k.lay26
-rw-r--r--src/mame/layout/megacd.lay30
-rw-r--r--src/mame/layout/megaline.lay250
-rw-r--r--src/mame/layout/mephisto_1.lay12
-rw-r--r--src/mame/layout/mephisto_3.lay12
-rw-r--r--src/mame/layout/mephisto_academy.lay4
-rw-r--r--src/mame/layout/mephisto_alm16.lay12
-rw-r--r--src/mame/layout/mephisto_alm32.lay12
-rw-r--r--src/mame/layout/mephisto_amsterdam.lay131
-rw-r--r--src/mame/layout/mephisto_berlin.lay24
-rw-r--r--src/mame/layout/mephisto_bup.lay112
-rw-r--r--src/mame/layout/mephisto_esb2.lay12
-rw-r--r--src/mame/layout/mephisto_excalibur.lay621
-rw-r--r--src/mame/layout/mephisto_gen32.lay12
-rw-r--r--src/mame/layout/mephisto_glasgow.lay119
-rw-r--r--src/mame/layout/mephisto_junior.lay10
-rw-r--r--src/mame/layout/mephisto_mega4.lay34
-rw-r--r--src/mame/layout/mephisto_milano.lay30
-rw-r--r--src/mame/layout/mephisto_mirage.lay71
-rw-r--r--src/mame/layout/mephisto_mm1.lay124
-rw-r--r--src/mame/layout/mephisto_mm2.lay113
-rw-r--r--src/mame/layout/mephisto_mm5.lay113
-rw-r--r--src/mame/layout/mephisto_mm6.lay469
-rw-r--r--src/mame/layout/mephisto_modena.lay27
-rw-r--r--src/mame/layout/mephisto_modular_tm.lay12
-rw-r--r--src/mame/layout/mephisto_mondial68k.lay20
-rw-r--r--src/mame/layout/mephisto_montreal.lay121
-rw-r--r--src/mame/layout/mephisto_montreux.lay127
-rw-r--r--src/mame/layout/mephisto_polgar.lay4
-rw-r--r--src/mame/layout/mephisto_risc.lay4
-rw-r--r--src/mame/layout/mephisto_roma2.lay131
-rw-r--r--src/mame/layout/mephisto_schachak.lay13
-rw-r--r--src/mame/layout/mephisto_smondial.lay34
-rw-r--r--src/mame/layout/mfootb.lay12
-rw-r--r--src/mame/layout/mfootb2.lay12
-rw-r--r--src/mame/layout/microvision.lay4
-rw-r--r--src/mame/layout/mmarvin.lay31
-rw-r--r--src/mame/layout/monkeysee.lay2
-rw-r--r--src/mame/layout/moog_source.lay1331
-rw-r--r--src/mame/layout/mpc2000xl.lay1255
-rw-r--r--src/mame/layout/mpc3000.lay1466
-rw-r--r--src/mame/layout/mpc60.lay1275
-rw-r--r--src/mame/layout/mpu3.lay12
-rw-r--r--src/mame/layout/mpu4.lay13
-rw-r--r--src/mame/layout/mpu4ext.lay4
-rw-r--r--src/mame/layout/mpu4plasma.lay4
-rw-r--r--src/mame/layout/mrmusical.lay76
-rw-r--r--src/mame/layout/msthawk.lay34
-rw-r--r--src/mame/layout/msx_turbor.lay91
-rw-r--r--src/mame/layout/mt2090.lay256
-rw-r--r--src/mame/layout/mu2000.lay339
-rw-r--r--src/mame/layout/mu50.lay152
-rw-r--r--src/mame/layout/nd8lines.lay327
-rw-r--r--src/mame/layout/noraut09_sureshot.lay166
-rw-r--r--src/mame/layout/noraut10.lay183
-rw-r--r--src/mame/layout/noraut11.lay40
-rw-r--r--src/mame/layout/noraut12.lay73
-rw-r--r--src/mame/layout/novag_accord.lay6
-rw-r--r--src/mame/layout/novag_beluga.lay502
-rw-r--r--src/mame/layout/novag_cexpert.lay166
-rw-r--r--src/mame/layout/novag_cforte.lay14
-rw-r--r--src/mame/layout/novag_chesstea.lay184
-rw-r--r--src/mame/layout/novag_cnchess.lay939
-rw-r--r--src/mame/layout/novag_constq.lay48
-rw-r--r--src/mame/layout/novag_diablo68.lay504
-rw-r--r--src/mame/layout/novag_diablo68k.lay504
-rw-r--r--src/mame/layout/novag_diamond.lay496
-rw-r--r--src/mame/layout/novag_diamond2.lay18
-rw-r--r--src/mame/layout/novag_emerclp.lay34
-rw-r--r--src/mame/layout/novag_gomoku.lay513
-rw-r--r--src/mame/layout/novag_mentor16.lay140
-rw-r--r--src/mame/layout/novag_micro.lay4
-rw-r--r--src/mame/layout/novag_micro2.lay4
-rw-r--r--src/mame/layout/novag_mk1.lay16
-rw-r--r--src/mame/layout/novag_mk2.lay265
-rw-r--r--src/mame/layout/novag_mk2a.lay262
-rw-r--r--src/mame/layout/novag_obsidian.lay488
-rw-r--r--src/mame/layout/novag_primo.lay160
-rw-r--r--src/mame/layout/novag_robotadv.lay10
-rw-r--r--src/mame/layout/novag_savant.lay118
-rw-r--r--src/mame/layout/novag_scorpio68.lay531
-rw-r--r--src/mame/layout/novag_scorpio68k.lay531
-rw-r--r--src/mame/layout/novag_sdiamond.lay16
-rw-r--r--src/mame/layout/novag_sexpert.lay164
-rw-r--r--src/mame/layout/novag_sforte.lay92
-rw-r--r--src/mame/layout/novag_snova.lay20
-rw-r--r--src/mame/layout/novag_ssensor4.lay229
-rw-r--r--src/mame/layout/novag_supercon.lay146
-rw-r--r--src/mame/layout/novag_supremo.lay168
-rw-r--r--src/mame/layout/novag_zircon2.lay14
-rw-r--r--src/mame/layout/oberheim_dmx.lay832
-rw-r--r--src/mame/layout/oberheim_xpander.lay73
-rw-r--r--src/mame/layout/oceanpar.lay208
-rw-r--r--src/mame/layout/omar1.lay8
-rw-r--r--src/mame/layout/omar2.lay8
-rw-r--r--src/mame/layout/omegrace.lay19
-rw-r--r--src/mame/layout/outrun.lay24
-rw-r--r--src/mame/layout/overdriv.lay24
-rw-r--r--src/mame/layout/packmon.lay4
-rw-r--r--src/mame/layout/pacominv.lay38
-rw-r--r--src/mame/layout/paia_fatman.lay717
-rw-r--r--src/mame/layout/paia_midi2cv8.lay282
-rw-r--r--src/mame/layout/palmmd8.lay61
-rw-r--r--src/mame/layout/patinho.lay1390
-rw-r--r--src/mame/layout/pdrift.lay24
-rw-r--r--src/mame/layout/pengpaycea.lay895
-rw-r--r--src/mame/layout/pengpaydx.lay760
-rw-r--r--src/mame/layout/pg1000.lay1042
-rw-r--r--src/mame/layout/pl6dev.lay126
-rw-r--r--src/mame/layout/pl6vdev.lay131
-rw-r--r--src/mame/layout/pm5644.lay419
-rw-r--r--src/mame/layout/pntnpuzls.lay163
-rw-r--r--src/mame/layout/polepos.lay24
-rw-r--r--src/mame/layout/proconn.lay12
-rw-r--r--src/mame/layout/prophet600.lay4
-rw-r--r--src/mame/layout/psr11.lay86
-rw-r--r--src/mame/layout/psr110.lay128
-rw-r--r--src/mame/layout/psr150.lay152
-rw-r--r--src/mame/layout/psr180.lay152
-rw-r--r--src/mame/layout/psr60.lay86
-rw-r--r--src/mame/layout/psr70.lay100
-rw-r--r--src/mame/layout/psr75.lay128
-rw-r--r--src/mame/layout/psr76.lay128
-rw-r--r--src/mame/layout/pss11.lay92
-rw-r--r--src/mame/layout/pss12.lay94
-rw-r--r--src/mame/layout/pss170.lay15
-rw-r--r--src/mame/layout/pss21.lay104
-rw-r--r--src/mame/layout/pss31.lay128
-rw-r--r--src/mame/layout/pss6.lay94
-rw-r--r--src/mame/layout/qkracer.lay48
-rw-r--r--src/mame/layout/qkracera.lay48
-rw-r--r--src/mame/layout/quizwizc.lay2
-rw-r--r--src/mame/layout/radr.lay24
-rw-r--r--src/mame/layout/regence.lay70
-rw-r--r--src/mame/layout/roland_d70.lay709
-rw-r--r--src/mame/layout/roland_tr707.lay1236
-rw-r--r--src/mame/layout/roundup5.lay24
-rw-r--r--src/mame/layout/royal5p.lay207
-rw-r--r--src/mame/layout/s2000.lay826
-rw-r--r--src/mame/layout/s3000.lay877
-rwxr-xr-xsrc/mame/layout/s3000xl.lay840
-rw-r--r--src/mame/layout/saitek_blitz.lay4
-rw-r--r--src/mame/layout/saitek_centurion.lay14
-rw-r--r--src/mame/layout/saitek_chessac.lay6
-rw-r--r--src/mame/layout/saitek_chesstrv.lay14
-rw-r--r--src/mame/layout/saitek_chesstrvi.lay22
-rw-r--r--src/mame/layout/saitek_companion.lay30
-rw-r--r--src/mame/layout/saitek_companion3.lay76
-rw-r--r--src/mame/layout/saitek_conquistador.lay4
-rw-r--r--src/mame/layout/saitek_corona.lay44
-rw-r--r--src/mame/layout/saitek_cougar.lay10
-rw-r--r--src/mame/layout/saitek_delta1.lay10
-rw-r--r--src/mame/layout/saitek_ecbackg.lay95
-rw-r--r--src/mame/layout/saitek_electrio.lay910
-rw-r--r--src/mame/layout/saitek_expchess.lay97
-rw-r--r--src/mame/layout/saitek_galileo.lay60
-rw-r--r--src/mame/layout/saitek_gk2000.lay4
-rw-r--r--src/mame/layout/saitek_gk2100.lay4
-rw-r--r--src/mame/layout/saitek_mark5.lay236
-rw-r--r--src/mame/layout/saitek_mark6.lay236
-rw-r--r--src/mame/layout/saitek_minichess.lay4
-rw-r--r--src/mame/layout/saitek_mk12.lay530
-rw-r--r--src/mame/layout/saitek_pcheckers.lay647
-rw-r--r--src/mame/layout/saitek_pchess.lay434
-rw-r--r--src/mame/layout/saitek_pplus.lay462
-rw-r--r--src/mame/layout/saitek_prschess.lay4
-rw-r--r--src/mame/layout/saitek_renaissance.lay60
-rw-r--r--src/mame/layout/saitek_risc2500.lay127
-rw-r--r--src/mame/layout/saitek_sbackgc.lay681
-rw-r--r--src/mame/layout/saitek_schess.lay48
-rw-r--r--src/mame/layout/saitek_sstar28k.lay30
-rw-r--r--src/mame/layout/saitek_ssystem3.lay6
-rw-r--r--src/mame/layout/saitek_ssystem4.lay6
-rw-r--r--src/mame/layout/saitek_stratos.lay42
-rw-r--r--src/mame/layout/saitek_tatrain.lay4
-rw-r--r--src/mame/layout/saitek_teammate.lay4
-rw-r--r--src/mame/layout/saitek_tschess.lay464
-rw-r--r--src/mame/layout/saitek_tstar432.lay30
-rw-r--r--src/mame/layout/sball2k1.lay203
-rw-r--r--src/mame/layout/sc1_vfd.lay12
-rw-r--r--src/mame/layout/sc1_vid.lay24
-rw-r--r--src/mame/layout/sc1barcd.lay32
-rw-r--r--src/mame/layout/sc1bartk.lay32
-rw-r--r--src/mame/layout/sc1cl65.lay48
-rw-r--r--src/mame/layout/sc1clbtma.lay40
-rw-r--r--src/mame/layout/sc1cwcl.lay40
-rw-r--r--src/mame/layout/sc1dblch.lay32
-rw-r--r--src/mame/layout/sc1pwrl.lay24
-rw-r--r--src/mame/layout/sc1sirb.lay32
-rw-r--r--src/mame/layout/sc1spct.lay32
-rw-r--r--src/mame/layout/sc1str4.lay24
-rw-r--r--src/mame/layout/sc2_dmd.lay12
-rw-r--r--src/mame/layout/sc2casr2.lay72
-rw-r--r--src/mame/layout/sc2copcl7.lay40
-rw-r--r--src/mame/layout/sc2cpe.lay40
-rw-r--r--src/mame/layout/sc2cpg.lay40
-rw-r--r--src/mame/layout/sc2eggs1.lay32
-rw-r--r--src/mame/layout/sc2heypr.lay40
-rw-r--r--src/mame/layout/sc2in1.lay244
-rw-r--r--src/mame/layout/sc2majes.lay24
-rw-r--r--src/mame/layout/sc2prem2.lay60
-rw-r--r--src/mame/layout/sc2prom.lay32
-rw-r--r--src/mame/layout/sc2ptytm1.lay32
-rw-r--r--src/mame/layout/sc2suprz1.lay32
-rw-r--r--src/mame/layout/sc2town2.lay32
-rw-r--r--src/mame/layout/sc4_dmd.lay24
-rw-r--r--src/mame/layout/sc4acesh.lay40
-rw-r--r--src/mame/layout/sc4bantm.lay32
-rw-r--r--src/mame/layout/sc4bedcl.lay40
-rw-r--r--src/mame/layout/sc4blast.lay40
-rw-r--r--src/mame/layout/sc4blokq.lay32
-rw-r--r--src/mame/layout/sc4bobcl.lay40
-rw-r--r--src/mame/layout/sc4brksp.lay40
-rw-r--r--src/mame/layout/sc4brollb.lay32
-rw-r--r--src/mame/layout/sc4cabin.lay32
-rw-r--r--src/mame/layout/sc4canca.lay32
-rw-r--r--src/mame/layout/sc4captn.lay32
-rw-r--r--src/mame/layout/sc4cariqd.lay32
-rw-r--r--src/mame/layout/sc4carrya.lay32
-rw-r--r--src/mame/layout/sc4cashm.lay32
-rw-r--r--src/mame/layout/sc4cclasd.lay48
-rw-r--r--src/mame/layout/sc4cclim.lay24
-rw-r--r--src/mame/layout/sc4cfcas.lay24
-rw-r--r--src/mame/layout/sc4chainb.lay40
-rw-r--r--src/mame/layout/sc4chavy.lay40
-rw-r--r--src/mame/layout/sc4chick.lay24
-rw-r--r--src/mame/layout/sc4chuba.lay32
-rw-r--r--src/mame/layout/sc4clashd.lay32
-rw-r--r--src/mame/layout/sc4clue.lay40
-rw-r--r--src/mame/layout/sc4cmania.lay32
-rw-r--r--src/mame/layout/sc4cmous.lay40
-rw-r--r--src/mame/layout/sc4cnfr.lay32
-rw-r--r--src/mame/layout/sc4coro.lay32
-rw-r--r--src/mame/layout/sc4crc.lay32
-rw-r--r--src/mame/layout/sc4crcla.lay40
-rw-r--r--src/mame/layout/sc4crzgna.lay24
-rw-r--r--src/mame/layout/sc4crzkya.lay24
-rw-r--r--src/mame/layout/sc4cvanif.lay32
-rw-r--r--src/mame/layout/sc4cvclb.lay40
-rw-r--r--src/mame/layout/sc4dayltf.lay80
-rw-r--r--src/mame/layout/sc4deepi.lay40
-rw-r--r--src/mame/layout/sc4derby.lay40
-rw-r--r--src/mame/layout/sc4dmineb.lay40
-rw-r--r--src/mame/layout/sc4dnd.lay24
-rw-r--r--src/mame/layout/sc4dnddw.lay24
-rw-r--r--src/mame/layout/sc4dndtp.lay24
-rw-r--r--src/mame/layout/sc4drubyb.lay24
-rw-r--r--src/mame/layout/sc4duckqa.lay40
-rw-r--r--src/mame/layout/sc4dyna.lay32
-rw-r--r--src/mame/layout/sc4eascsc.lay32
-rw-r--r--src/mame/layout/sc4emmerc.lay32
-rw-r--r--src/mame/layout/sc4fastfb.lay32
-rw-r--r--src/mame/layout/sc4fd7tha.lay32
-rw-r--r--src/mame/layout/sc4fever.lay40
-rw-r--r--src/mame/layout/sc4fire.lay32
-rw-r--r--src/mame/layout/sc4fpitcb.lay32
-rw-r--r--src/mame/layout/sc4ftopib.lay32
-rw-r--r--src/mame/layout/sc4fullt.lay40
-rw-r--r--src/mame/layout/sc4fwpcs.lay32
-rw-r--r--src/mame/layout/sc4gaga.lay32
-rw-r--r--src/mame/layout/sc4gball.lay32
-rw-r--r--src/mame/layout/sc4gd.lay40
-rw-r--r--src/mame/layout/sc4gdclb.lay48
-rw-r--r--src/mame/layout/sc4ggdlxf.lay24
-rw-r--r--src/mame/layout/sc4gldcl.lay40
-rw-r--r--src/mame/layout/sc4gslam.lay48
-rw-r--r--src/mame/layout/sc4gx.lay24
-rw-r--r--src/mame/layout/sc4hdd.lay32
-rw-r--r--src/mame/layout/sc4hi5.lay32
-rw-r--r--src/mame/layout/sc4hilo.lay32
-rw-r--r--src/mame/layout/sc4himi.lay32
-rw-r--r--src/mame/layout/sc4hissa.lay32
-rw-r--r--src/mame/layout/sc4holyw.lay32
-rw-r--r--src/mame/layout/sc4hotpr.lay32
-rw-r--r--src/mame/layout/sc4hotwd.lay48
-rw-r--r--src/mame/layout/sc4hyde.lay32
-rw-r--r--src/mame/layout/sc4jack.lay40
-rw-r--r--src/mame/layout/sc4kalei.lay32
-rw-r--r--src/mame/layout/sc4knokb.lay40
-rw-r--r--src/mame/layout/sc4lined.lay24
-rw-r--r--src/mame/layout/sc4lions.lay32
-rw-r--r--src/mame/layout/sc4lirb.lay32
-rw-r--r--src/mame/layout/sc4lkbcl.lay40
-rw-r--r--src/mame/layout/sc4lockb.lay32
-rw-r--r--src/mame/layout/sc4mgr.lay32
-rw-r--r--src/mame/layout/sc4mmmg.lay32
-rw-r--r--src/mame/layout/sc4mondxe.lay24
-rw-r--r--src/mame/layout/sc4monoba.lay32
-rw-r--r--src/mame/layout/sc4monot.lay24
-rw-r--r--src/mame/layout/sc4motor.lay32
-rw-r--r--src/mame/layout/sc4mou.lay32
-rw-r--r--src/mame/layout/sc4mr2rc.lay32
-rw-r--r--src/mame/layout/sc4mspid.lay32
-rw-r--r--src/mame/layout/sc4mtbb.lay32
-rw-r--r--src/mame/layout/sc4mtbclb.lay40
-rw-r--r--src/mame/layout/sc4nmtj.lay32
-rw-r--r--src/mame/layout/sc4nudita.lay24
-rw-r--r--src/mame/layout/sc4paccl.lay40
-rw-r--r--src/mame/layout/sc4pacqpa.lay32
-rw-r--r--src/mame/layout/sc4pen1c.lay32
-rw-r--r--src/mame/layout/sc4pgold.lay40
-rw-r--r--src/mame/layout/sc4pipe.lay32
-rw-r--r--src/mame/layout/sc4plumb.lay40
-rw-r--r--src/mame/layout/sc4po8.lay32
-rw-r--r--src/mame/layout/sc4polic.lay40
-rw-r--r--src/mame/layout/sc4pony.lay40
-rw-r--r--src/mame/layout/sc4potsha.lay32
-rw-r--r--src/mame/layout/sc4ppclb.lay48
-rw-r--r--src/mame/layout/sc4pstata.lay32
-rw-r--r--src/mame/layout/sc4pwrbq.lay32
-rw-r--r--src/mame/layout/sc4pwrsg.lay40
-rw-r--r--src/mame/layout/sc4qmodo.lay32
-rw-r--r--src/mame/layout/sc4quidrb.lay32
-rw-r--r--src/mame/layout/sc4redsq.lay32
-rw-r--r--src/mame/layout/sc4revod.lay32
-rw-r--r--src/mame/layout/sc4rhxcl.lay48
-rw-r--r--src/mame/layout/sc4rhxcsa.lay32
-rw-r--r--src/mame/layout/sc4richl.lay40
-rw-r--r--src/mame/layout/sc4rmo.lay24
-rw-r--r--src/mame/layout/sc4rogds.lay32
-rw-r--r--src/mame/layout/sc4roksc.lay32
-rw-r--r--src/mame/layout/sc4rotc.lay40
-rw-r--r--src/mame/layout/sc4rtc.lay32
-rw-r--r--src/mame/layout/sc4rttt.lay32
-rw-r--r--src/mame/layout/sc4s6cd.lay48
-rw-r--r--src/mame/layout/sc4sahed.lay32
-rw-r--r--src/mame/layout/sc4sbust.lay32
-rw-r--r--src/mame/layout/sc4slci.lay40
-rw-r--r--src/mame/layout/sc4slihd.lay32
-rw-r--r--src/mame/layout/sc4smk7.lay24
-rw-r--r--src/mame/layout/sc4solgl.lay32
-rw-r--r--src/mame/layout/sc4sparkd.lay32
-rw-r--r--src/mame/layout/sc4sprng.lay32
-rw-r--r--src/mame/layout/sc4srrca.lay24
-rw-r--r--src/mame/layout/sc4starpk.lay32
-rw-r--r--src/mame/layout/sc4strk.lay24
-rw-r--r--src/mame/layout/sc4suscl.lay40
-rw-r--r--src/mame/layout/sc4susk.lay32
-rw-r--r--src/mame/layout/sc4taekw.lay32
-rw-r--r--src/mame/layout/sc4takcl.lay40
-rw-r--r--src/mame/layout/sc4tbana.lay40
-rw-r--r--src/mame/layout/sc4tempt.lay32
-rw-r--r--src/mame/layout/sc4tfclb.lay40
-rw-r--r--src/mame/layout/sc4tic2.lay24
-rw-r--r--src/mame/layout/sc4tload.lay32
-rw-r--r--src/mame/layout/sc4tpshta.lay32
-rw-r--r--src/mame/layout/sc4trail.lay32
-rw-r--r--src/mame/layout/sc4tridn.lay40
-rw-r--r--src/mame/layout/sc4ttomb.lay32
-rw-r--r--src/mame/layout/sc4vrgclb.lay40
-rw-r--r--src/mame/layout/sc4wldjkc.lay24
-rw-r--r--src/mame/layout/sc4xmarka.lay32
-rw-r--r--src/mame/layout/scrabsen.lay4
-rw-r--r--src/mame/layout/sd1.lay3388
-rw-r--r--src/mame/layout/sd132.lay3398
-rw-r--r--src/mame/layout/sequential_prophet5.lay1279
-rw-r--r--src/mame/layout/sequential_sixtrak.lay1351
-rw-r--r--src/mame/layout/showhandc.lay (renamed from src/mame/layout/showhanc.lay)0
-rw-r--r--src/mame/layout/simon.lay16
-rw-r--r--src/mame/layout/skillch.lay250
-rw-r--r--src/mame/layout/skillcha.lay250
-rw-r--r--src/mame/layout/smc777.lay89
-rw-r--r--src/mame/layout/sminiboy.lay272
-rw-r--r--src/mame/layout/solvalou.lay33
-rw-r--r--src/mame/layout/spacezap.lay1
-rw-r--r--src/mame/layout/spdheat.lay96
-rw-r--r--src/mame/layout/speedfrk.lay24
-rw-r--r--src/mame/layout/speedrs.lay24
-rw-r--r--src/mame/layout/speedup.lay24
-rw-r--r--src/mame/layout/spyhunt.lay62
-rw-r--r--src/mame/layout/spyhunttec.lay62
-rw-r--r--src/mame/layout/sr16.lay1
-rw-r--r--src/mame/layout/ssimon.lay26
-rw-r--r--src/mame/layout/sspeedr.lay24
-rw-r--r--src/mame/layout/starwbc.lay8
-rw-r--r--src/mame/layout/starzan.lay382
-rw-r--r--src/mame/layout/stellafr.lay93
-rw-r--r--src/mame/layout/stocker.lay24
-rw-r--r--src/mame/layout/stopthief.lay6
-rw-r--r--src/mame/layout/strobe.lay7
-rw-r--r--src/mame/layout/superchs.lay48
-rw-r--r--src/mame/layout/t1850.lay48
-rw-r--r--src/mame/layout/tama.lay68
-rw-r--r--src/mame/layout/tarzan103m.lay268
-rw-r--r--src/mame/layout/tascr30.lay8
-rw-r--r--src/mame/layout/tcfball.lay12
-rw-r--r--src/mame/layout/tchess.lay76
-rw-r--r--src/mame/layout/technodr.lay28
-rw-r--r--src/mame/layout/ti1680.lay62
-rw-r--r--src/mame/layout/ti95.lay38
-rw-r--r--src/mame/layout/tmbaskb.lay2
-rw-r--r--src/mame/layout/tmvolleyb.lay2
-rw-r--r--src/mame/layout/topracer.lay24
-rw-r--r--src/mame/layout/topspeed.lay24
-rw-r--r--src/mame/layout/tripfev.lay208
-rw-r--r--src/mame/layout/tripslot.lay280
-rw-r--r--src/mame/layout/ttfball.lay12
-rw-r--r--src/mame/layout/turbo.lay38
-rw-r--r--src/mame/layout/turbotag.lay24
-rw-r--r--src/mame/layout/tvochken.lay2
-rw-r--r--src/mame/layout/tx1.lay48
-rw-r--r--src/mame/layout/unkchx.lay183
-rw-r--r--src/mame/layout/us2pfball.lay19
-rw-r--r--src/mame/layout/v4in1eg.lay8
-rw-r--r--src/mame/layout/vclock3.lay2
-rw-r--r--src/mame/layout/vet3000.lay425
-rw-r--r--src/mame/layout/vfx.lay3158
-rw-r--r--src/mame/layout/vfxsd.lay3388
-rw-r--r--src/mame/layout/vgmplay.lay114
-rw-r--r--src/mame/layout/videoart.lay10
-rw-r--r--src/mame/layout/videocba.lay52
-rw-r--r--src/mame/layout/videodad.lay191
-rw-r--r--src/mame/layout/videopkr.lay246
-rw-r--r--src/mame/layout/virusa.lay1190
-rw-r--r--src/mame/layout/virusb.lay1217
-rw-r--r--src/mame/layout/virusc.lay1375
-rw-r--r--src/mame/layout/viruscl.lay1253
-rw-r--r--src/mame/layout/virusrck.lay680
-rw-r--r--src/mame/layout/virusrckxl.lay675
-rw-r--r--src/mame/layout/visnqust.lay51
-rw-r--r--src/mame/layout/vpoker.lay192
-rw-r--r--src/mame/layout/vr.lay3
-rw-r--r--src/mame/layout/wackygtr.lay252
-rw-r--r--src/mame/layout/warrior.lay32
-rw-r--r--src/mame/layout/wcat3.lay240
-rw-r--r--src/mame/layout/wcat3a.lay258
-rw-r--r--src/mame/layout/wecleman.lay24
-rw-r--r--src/mame/layout/wtigerc.lay (renamed from src/mame/layout/wtiger.lay)0
-rw-r--r--src/mame/layout/yeno_301xl.lay28
-rw-r--r--src/mame/layout/yeno_416xl.lay34
-rw-r--r--src/mame/layout/yeno_532xl.lay56
-rw-r--r--src/mame/layout/zodiac.lay26
-rw-r--r--src/mame/layout/zoomer.lay309
-rw-r--r--src/mame/leapfrog/iquest.cpp28
-rw-r--r--src/mame/leapfrog/leappad.cpp70
-rw-r--r--src/mame/leapfrog/leapster.cpp16
-rw-r--r--src/mame/leapfrog/leapster_explorer.cpp8
-rw-r--r--src/mame/learsiegler/adm11.cpp16
-rw-r--r--src/mame/learsiegler/adm23.cpp4
-rw-r--r--src/mame/learsiegler/adm31.cpp8
-rw-r--r--src/mame/learsiegler/adm36.cpp10
-rw-r--r--src/mame/liberty/freedom120.cpp10
-rw-r--r--src/mame/liberty/freedom200.cpp12
-rw-r--r--src/mame/liberty/freedom220_kbd.cpp2
-rw-r--r--src/mame/liberty/freedom220_kbd.h14
-rw-r--r--src/mame/linn/linndrum.cpp1893
-rw-r--r--src/mame/lsi/m3.cpp86
-rw-r--r--src/mame/lsi/octo_kbd.h6
-rw-r--r--src/mame/lsi/octopus.cpp16
-rw-r--r--src/mame/luxor/abc1600.cpp370
-rw-r--r--src/mame/luxor/abc1600.h180
-rw-r--r--src/mame/luxor/abc1600_mmu.cpp638
-rw-r--r--src/mame/luxor/abc1600_mmu.h156
-rw-r--r--src/mame/luxor/abc1600_v.cpp90
-rw-r--r--src/mame/luxor/abc1600_v.h34
-rw-r--r--src/mame/luxor/abc1600mac.cpp704
-rw-r--r--src/mame/luxor/abc1600mac.h144
-rw-r--r--src/mame/luxor/abc80.cpp315
-rw-r--r--src/mame/luxor/abc80.h51
-rw-r--r--src/mame/luxor/abc80_v.cpp42
-rw-r--r--src/mame/luxor/abc80kb.h14
-rw-r--r--src/mame/luxor/abc80x.cpp16
-rw-r--r--src/mame/luxor/abc80x.h50
-rw-r--r--src/mame/luxor/ds90.cpp166
-rw-r--r--src/mame/luxor/x37.cpp651
-rw-r--r--src/mame/luxor/x37_sasi.cpp293
-rw-r--r--src/mame/luxor/x37_sasi.h84
-rw-r--r--src/mame/makerbot/replicator.cpp12
-rw-r--r--src/mame/mame.lst81900
-rw-r--r--src/mame/matic/barata.cpp2
-rw-r--r--src/mame/matsushita/duet16.cpp6
-rw-r--r--src/mame/matsushita/jr100.cpp6
-rw-r--r--src/mame/matsushita/jr200.cpp12
-rw-r--r--src/mame/matsushita/kn5000.cpp732
-rw-r--r--src/mame/matsushita/kn5000_cpanel.cpp913
-rw-r--r--src/mame/matsushita/kn5000_cpanel.h124
-rw-r--r--src/mame/matsushita/myb3k.cpp10
-rw-r--r--src/mame/mattel/aquarius.cpp5
-rw-r--r--src/mame/mattel/aquarius.h10
-rw-r--r--src/mame/mattel/chess.cpp5
-rw-r--r--src/mame/mattel/intv.h18
-rw-r--r--src/mame/mattel/juicebox.cpp108
-rw-r--r--src/mame/mattel/pixtermu.cpp364
-rw-r--r--src/mame/mattel/stic.h6
-rw-r--r--src/mame/maygay/maygay1b.cpp35
-rw-r--r--src/mame/maygay/maygay1b.h15
-rw-r--r--src/mame/maygay/maygay1bsw.cpp12
-rw-r--r--src/mame/maygay/maygayep.cpp1836
-rw-r--r--src/mame/maygay/maygayew.cpp496
-rw-r--r--src/mame/maygay/maygayv1.cpp13
-rw-r--r--src/mame/maygay/mmm.cpp6
-rw-r--r--src/mame/mc/mc68000.cpp8
-rw-r--r--src/mame/mc/mccpm.cpp8
-rw-r--r--src/mame/mchester/ssem.cpp76
-rw-r--r--src/mame/meadows/lazercmd.cpp49
-rw-r--r--src/mame/meadows/meadows.cpp98
-rw-r--r--src/mame/meadows/meadwttl.cpp14
-rw-r--r--src/mame/meadows/warpsped.cpp8
-rw-r--r--src/mame/memotech/mtx.cpp8
-rw-r--r--src/mame/memotech/mtx.h10
-rw-r--r--src/mame/mera/ec7915.cpp6
-rw-r--r--src/mame/mera/konin.cpp8
-rw-r--r--src/mame/mera/m79152pc.cpp10
-rw-r--r--src/mame/mera/vdm7932x.cpp16
-rw-r--r--src/mame/merit/merit.cpp352
-rw-r--r--src/mame/merit/merit3xx.cpp36
-rw-r--r--src/mame/merit/meritm.cpp158
-rw-r--r--src/mame/merit/merits.cpp21
-rw-r--r--src/mame/merit/meritsdx.cpp6
-rw-r--r--src/mame/merit/mgames.cpp14
-rw-r--r--src/mame/merit/mtouchxl.cpp33
-rw-r--r--src/mame/merit/pubtimed.cpp44
-rw-r--r--src/mame/metro/hyprduel.cpp22
-rw-r--r--src/mame/metro/metro.cpp345
-rw-r--r--src/mame/metro/metro.h70
-rw-r--r--src/mame/metro/rabbit.cpp15
-rw-r--r--src/mame/metro/tmmjprd.cpp117
-rw-r--r--src/mame/mg1/kbd.h12
-rw-r--r--src/mame/mg1/mg1.cpp174
-rw-r--r--src/mame/microcraft/dim68k.cpp6
-rw-r--r--src/mame/microcraft/dim68k_kbd.h12
-rw-r--r--src/mame/microkey/primo.cpp57
-rw-r--r--src/mame/microkey/primo.h32
-rw-r--r--src/mame/microkey/primo_m.cpp47
-rw-r--r--src/mame/microsoft/jazz.cpp31
-rw-r--r--src/mame/microsoft/mct_adr.cpp6
-rw-r--r--src/mame/microsoft/mct_adr.h8
-rw-r--r--src/mame/microsoft/xbox.cpp65
-rw-r--r--src/mame/microterm/ergo201.cpp8
-rw-r--r--src/mame/microterm/microterm_f8.cpp10
-rw-r--r--src/mame/microterm/mt420.cpp10
-rw-r--r--src/mame/microterm/mt440.cpp10
-rw-r--r--src/mame/microterm/mt5510.cpp10
-rw-r--r--src/mame/midcoin/24cdjuke.cpp11
-rw-r--r--src/mame/midcoin/wallc.cpp17
-rw-r--r--src/mame/midcoin/wink.cpp14
-rw-r--r--src/mame/midw8080/8080bw.cpp817
-rw-r--r--src/mame/midw8080/8080bw.h168
-rw-r--r--src/mame/midw8080/8080bw_a.cpp7
-rw-r--r--src/mame/midw8080/8080bw_a.h6
-rw-r--r--src/mame/midw8080/8080bw_v.cpp175
-rw-r--r--src/mame/midw8080/mw8080bw.cpp354
-rw-r--r--src/mame/midw8080/mw8080bw.h147
-rw-r--r--src/mame/midw8080/mw8080bw_a.cpp46
-rw-r--r--src/mame/midw8080/mw8080bw_a.h74
-rw-r--r--src/mame/midw8080/nl_gunfight.cpp2
-rw-r--r--src/mame/midw8080/rotaryf.cpp6
-rw-r--r--src/mame/midway/astrocde.cpp46
-rw-r--r--src/mame/midway/astrocde.h56
-rw-r--r--src/mame/midway/astrohome.cpp6
-rw-r--r--src/mame/midway/atlantis.cpp43
-rw-r--r--src/mame/midway/balsente.cpp152
-rw-r--r--src/mame/midway/balsente.h32
-rw-r--r--src/mame/midway/balsente_m.cpp2
-rw-r--r--src/mame/midway/cashline.cpp228
-rw-r--r--src/mame/midway/csd.h8
-rw-r--r--src/mame/midway/gridlee.cpp2
-rw-r--r--src/mame/midway/gridlee.h12
-rw-r--r--src/mame/midway/gridlee_a.cpp8
-rw-r--r--src/mame/midway/mcr.cpp64
-rw-r--r--src/mame/midway/mcr.h28
-rw-r--r--src/mame/midway/mcr3.cpp19
-rw-r--r--src/mame/midway/mcr3.h10
-rw-r--r--src/mame/midway/mcr68.cpp18
-rw-r--r--src/mame/midway/midqslvr.cpp53
-rw-r--r--src/mame/midway/midtunit.h16
-rw-r--r--src/mame/midway/midtunit_v.h10
-rw-r--r--src/mame/midway/midvunit.cpp104
-rw-r--r--src/mame/midway/midvunit.h43
-rw-r--r--src/mame/midway/midway.cpp54
-rw-r--r--src/mame/midway/midway.h32
-rw-r--r--src/mame/midway/midwayic.h14
-rw-r--r--src/mame/midway/midwayttl.cpp2
-rw-r--r--src/mame/midway/midwunit.cpp64
-rw-r--r--src/mame/midway/midwunit.h6
-rw-r--r--src/mame/midway/midxunit.cpp545
-rw-r--r--src/mame/midway/midxunit.h85
-rw-r--r--src/mame/midway/midxunit_m.cpp326
-rw-r--r--src/mame/midway/midyunit.cpp290
-rw-r--r--src/mame/midway/midyunit.h37
-rw-r--r--src/mame/midway/midyunit_m.cpp23
-rw-r--r--src/mame/midway/midzeus.cpp312
-rw-r--r--src/mame/midway/midzeus.h24
-rw-r--r--src/mame/midway/midzeus_v.cpp2
-rw-r--r--src/mame/midway/mw18w.cpp10
-rw-r--r--src/mame/midway/mwsub.cpp6
-rw-r--r--src/mame/midway/nl_sspeedr.h12
-rw-r--r--src/mame/midway/omegrace.cpp27
-rw-r--r--src/mame/midway/pinball2k.cpp21
-rw-r--r--src/mame/midway/predators.cpp953
-rw-r--r--src/mame/midway/seattle.cpp361
-rw-r--r--src/mame/midway/sente6vb.cpp23
-rw-r--r--src/mame/midway/sente6vb.h12
-rw-r--r--src/mame/midway/spyhuntertec.cpp14
-rw-r--r--src/mame/midway/sspeedr.cpp320
-rw-r--r--src/mame/midway/sspeedr.h103
-rw-r--r--src/mame/midway/sspeedr_v.cpp263
-rw-r--r--src/mame/midway/starrider.cpp105
-rw-r--r--src/mame/midway/tmaster.cpp18
-rw-r--r--src/mame/midway/vegas.cpp389
-rw-r--r--src/mame/midway/williams.cpp161
-rw-r--r--src/mame/midway/williams.h163
-rw-r--r--src/mame/midway/williams_m.cpp48
-rw-r--r--src/mame/midway/williams_v.cpp285
-rw-r--r--src/mame/midway/williamsblitter.cpp251
-rw-r--r--src/mame/midway/williamsblitter.h129
-rw-r--r--src/mame/midway/wmg.cpp52
-rw-r--r--src/mame/midway/zwackery.cpp6
-rw-r--r--src/mame/miltonbradley/grandmaster.cpp286
-rw-r--r--src/mame/miltonbradley/microvision.cpp515
-rw-r--r--src/mame/miltonbradley/microvsn.cpp515
-rw-r--r--src/mame/miltonbradley/milton.cpp311
-rw-r--r--src/mame/miltonbradley/milton6805.cpp303
-rw-r--r--src/mame/miltonbradley/vectrex.h16
-rw-r--r--src/mame/miltonbradley/vectrex_m.cpp9
-rw-r--r--src/mame/miltonbradley/vectrex_v.cpp1
-rw-r--r--src/mame/mips/mips.cpp1218
-rw-r--r--src/mame/mips/mips.h8
-rw-r--r--src/mame/mips/mips_i2000.cpp713
-rw-r--r--src/mame/mips/mips_r3030.cpp549
-rw-r--r--src/mame/mips/mips_rambo.h6
-rw-r--r--src/mame/misc/39in1.cpp98
-rw-r--r--src/mame/misc/3do.cpp481
-rw-r--r--src/mame/misc/3do.h166
-rw-r--r--src/mame/misc/3do_amy.cpp150
-rw-r--r--src/mame/misc/3do_amy.h46
-rw-r--r--src/mame/misc/3do_clio.cpp759
-rw-r--r--src/mame/misc/3do_clio.h182
-rw-r--r--src/mame/misc/3do_m.cpp967
-rw-r--r--src/mame/misc/3do_madam.cpp1411
-rw-r--r--src/mame/misc/3do_madam.h225
-rw-r--r--src/mame/misc/3do_portfolio.cpp221
-rw-r--r--src/mame/misc/3do_portfolio.h12
-rw-r--r--src/mame/misc/4enlinea.cpp18
-rw-r--r--src/mame/misc/4enraya.cpp189
-rw-r--r--src/mame/misc/a1supply.cpp14
-rw-r--r--src/mame/misc/ace_sp_reelctrl.h10
-rw-r--r--src/mame/misc/acefruit.cpp192
-rw-r--r--src/mame/misc/aces1.cpp105
-rw-r--r--src/mame/misc/acesp.cpp1080
-rw-r--r--src/mame/misc/adi_unk_kbd.cpp318
-rw-r--r--src/mame/misc/adi_unk_kbd.h65
-rw-r--r--src/mame/misc/adi_vt52.cpp312
-rw-r--r--src/mame/misc/age_candy.cpp8
-rw-r--r--src/mame/misc/alinvade.cpp6
-rw-r--r--src/mame/misc/amaticmg.cpp264
-rw-r--r--src/mame/misc/amerihok.cpp10
-rw-r--r--src/mame/misc/ampoker2.cpp28
-rw-r--r--src/mame/misc/ampoker2.h8
-rw-r--r--src/mame/misc/amspdwy.cpp19
-rw-r--r--src/mame/misc/amstarz80.cpp76
-rw-r--r--src/mame/misc/amusco.cpp291
-rw-r--r--src/mame/misc/amuzy.cpp291
-rw-r--r--src/mame/misc/anes.cpp59
-rw-r--r--src/mame/misc/arachnid.cpp4
-rw-r--r--src/mame/misc/artmagic.cpp10
-rw-r--r--src/mame/misc/artmagic.h24
-rw-r--r--src/mame/misc/astrafr.cpp374
-rw-r--r--src/mame/misc/astrcorp.cpp3280
-rw-r--r--src/mame/misc/astropc.cpp308
-rw-r--r--src/mame/misc/atronic.cpp1264
-rw-r--r--src/mame/misc/attckufo.cpp6
-rw-r--r--src/mame/misc/avt.cpp6
-rw-r--r--src/mame/misc/babysuprem.cpp22
-rw-r--r--src/mame/misc/bailey.cpp10
-rw-r--r--src/mame/misc/banpresto_bpsc68000.cpp502
-rw-r--r--src/mame/misc/beaminv.cpp221
-rw-r--r--src/mame/misc/beezer.cpp8
-rw-r--r--src/mame/misc/belatra.cpp182
-rw-r--r--src/mame/misc/bingoman.cpp12
-rw-r--r--src/mame/misc/bingor.cpp24
-rw-r--r--src/mame/misc/blitz68k.cpp275
-rw-r--r--src/mame/misc/blocktax.cpp54
-rw-r--r--src/mame/misc/bntyhunt.cpp13
-rw-r--r--src/mame/misc/boramz80.cpp767
-rw-r--r--src/mame/misc/brglitz.cpp13
-rw-r--r--src/mame/misc/buster.cpp4
-rw-r--r--src/mame/misc/calomega.cpp204
-rw-r--r--src/mame/misc/calomega.h14
-rw-r--r--src/mame/misc/cardline.cpp122
-rw-r--r--src/mame/misc/carrera.cpp490
-rw-r--r--src/mame/misc/castle.cpp10
-rw-r--r--src/mame/misc/cb2001.cpp812
-rw-r--r--src/mame/misc/chameleonrx1.cpp79
-rw-r--r--src/mame/misc/chamrx1.cpp81
-rw-r--r--src/mame/misc/chance32.cpp281
-rw-r--r--src/mame/misc/changyu.cpp320
-rw-r--r--src/mame/misc/chicago.cpp8
-rw-r--r--src/mame/misc/chsuper.cpp12
-rw-r--r--src/mame/misc/cleartone.cpp6
-rw-r--r--src/mame/misc/clowndwn.cpp8
-rw-r--r--src/mame/misc/clpoker.cpp18
-rw-r--r--src/mame/misc/cocoloco.cpp8
-rw-r--r--src/mame/misc/coinmstr.cpp137
-rw-r--r--src/mame/misc/coinmvga.cpp15
-rw-r--r--src/mame/misc/cointek.cpp303
-rw-r--r--src/mame/misc/comebaby.cpp123
-rw-r--r--src/mame/misc/compucranes.cpp101
-rw-r--r--src/mame/misc/coolpool.cpp253
-rw-r--r--src/mame/misc/coolpool.h166
-rw-r--r--src/mame/misc/corona.cpp34
-rw-r--r--src/mame/misc/cosmos_playc8f.cpp8
-rw-r--r--src/mame/misc/cowtipping.cpp11
-rw-r--r--src/mame/misc/crazybal.cpp51
-rw-r--r--src/mame/misc/cromptons.cpp14
-rw-r--r--src/mame/misc/crospuzl.cpp157
-rw-r--r--src/mame/misc/crystal.cpp295
-rw-r--r--src/mame/misc/ctvboy.cpp10
-rw-r--r--src/mame/misc/cubeqst.cpp134
-rw-r--r--src/mame/misc/cupidon.cpp19
-rw-r--r--src/mame/misc/cvs.cpp (renamed from src/mame/cvs/cvs.cpp)1237
-rw-r--r--src/mame/misc/cwheel.cpp2
-rw-r--r--src/mame/misc/cybertnk.cpp29
-rw-r--r--src/mame/misc/daphor32.cpp257
-rw-r--r--src/mame/misc/daryde.cpp10
-rw-r--r--src/mame/misc/dcheese.cpp51
-rw-r--r--src/mame/misc/dcheese.h10
-rw-r--r--src/mame/misc/ddz.cpp86
-rw-r--r--src/mame/misc/deecoseal.cpp170
-rw-r--r--src/mame/misc/dfruit.cpp40
-rw-r--r--src/mame/misc/dgpix.cpp78
-rw-r--r--src/mame/misc/diamondking.cpp31
-rw-r--r--src/mame/misc/discoboy.cpp21
-rw-r--r--src/mame/misc/dmainevent.cpp4
-rw-r--r--src/mame/misc/dominob.cpp6
-rw-r--r--src/mame/misc/dorachan.cpp88
-rw-r--r--src/mame/misc/drdmania.cpp6
-rw-r--r--src/mame/misc/dreamwld.cpp16
-rw-r--r--src/mame/misc/ds2000.cpp353
-rw-r--r--src/mame/misc/dwarfd.cpp14
-rw-r--r--src/mame/misc/dynadice.cpp14
-rw-r--r--src/mame/misc/dynamoah.cpp12
-rw-r--r--src/mame/misc/ecoinf1.cpp22
-rw-r--r--src/mame/misc/ecoinf2.cpp15
-rw-r--r--src/mame/misc/ecoinf3.cpp13
-rw-r--r--src/mame/misc/ecoinfr.cpp19
-rw-r--r--src/mame/misc/efdt.h10
-rw-r--r--src/mame/misc/efg8080.cpp10
-rw-r--r--src/mame/misc/electra.cpp10
-rw-r--r--src/mame/misc/enigma2.cpp181
-rw-r--r--src/mame/misc/epos.cpp35
-rw-r--r--src/mame/misc/esd16.cpp884
-rw-r--r--src/mame/misc/esd16.h111
-rw-r--r--src/mame/misc/esd16_v.cpp197
-rw-r--r--src/mame/misc/esh.cpp13
-rw-r--r--src/mame/misc/esripsys.cpp26
-rw-r--r--src/mame/misc/esripsys.h10
-rw-r--r--src/mame/misc/ettrivia.cpp8
-rw-r--r--src/mame/misc/eva.cpp2
-rw-r--r--src/mame/misc/extrema.cpp60
-rw-r--r--src/mame/misc/ez2d.cpp71
-rw-r--r--src/mame/misc/falgas_m89.cpp22
-rw-r--r--src/mame/misc/fastinvaders.cpp34
-rw-r--r--src/mame/misc/fireball.cpp14
-rw-r--r--src/mame/misc/flipjack.cpp12
-rw-r--r--src/mame/misc/flower.cpp78
-rw-r--r--src/mame/misc/flower_a.cpp29
-rw-r--r--src/mame/misc/flower_a.h14
-rw-r--r--src/mame/misc/fortecar.cpp8
-rw-r--r--src/mame/misc/freekick.cpp64
-rw-r--r--src/mame/misc/freeway.cpp12
-rw-r--r--src/mame/misc/fresh.cpp165
-rw-r--r--src/mame/misc/funeball.cpp6
-rw-r--r--src/mame/misc/fungames.cpp42
-rw-r--r--src/mame/misc/funkball.cpp74
-rw-r--r--src/mame/misc/galaxi.cpp278
-rw-r--r--src/mame/misc/galgame.cpp4
-rw-r--r--src/mame/misc/gambl186.cpp8
-rw-r--r--src/mame/misc/gameace.cpp10
-rw-r--r--src/mame/misc/gamemasters.cpp4
-rw-r--r--src/mame/misc/gammagic.cpp6
-rw-r--r--src/mame/misc/gamtor.cpp1269
-rw-r--r--src/mame/misc/gei.cpp114
-rw-r--r--src/mame/misc/gfamily.cpp54
-rw-r--r--src/mame/misc/gi6809.cpp28
-rw-r--r--src/mame/misc/globalfr.cpp51
-rw-r--r--src/mame/misc/globalvr.cpp26
-rw-r--r--src/mame/misc/gluck2.cpp271
-rw-r--r--src/mame/misc/gms.cpp2737
-rw-r--r--src/mame/misc/goldngam.cpp8
-rw-r--r--src/mame/misc/goldnpkr.cpp3560
-rw-r--r--src/mame/misc/good.cpp11
-rw-r--r--src/mame/misc/gotcha.cpp170
-rw-r--r--src/mame/misc/gotcha.h86
-rw-r--r--src/mame/misc/gotcha_v.cpp102
-rw-r--r--src/mame/misc/gsspade.cpp8
-rw-r--r--src/mame/misc/gumbo.cpp15
-rw-r--r--src/mame/misc/gunpey.cpp19
-rw-r--r--src/mame/misc/h01x.cpp8
-rw-r--r--src/mame/misc/haiwei.cpp263
-rw-r--r--src/mame/misc/hapyfish.cpp15
-rw-r--r--src/mame/misc/hazelgr.cpp6
-rw-r--r--src/mame/misc/hideseek.cpp7
-rw-r--r--src/mame/misc/highvdeo.cpp46
-rw-r--r--src/mame/misc/hitpoker.cpp262
-rw-r--r--src/mame/misc/hobbyplay.cpp4
-rw-r--r--src/mame/misc/homedata.cpp221
-rw-r--r--src/mame/misc/homedata.h5
-rw-r--r--src/mame/misc/hotblock.cpp8
-rw-r--r--src/mame/misc/hotchili.cpp8
-rw-r--r--src/mame/misc/hotstuff.cpp8
-rw-r--r--src/mame/misc/houseball.cpp2
-rw-r--r--src/mame/misc/imolagp.cpp30
-rw-r--r--src/mame/misc/inder_sb.cpp2
-rw-r--r--src/mame/misc/inder_sb.h10
-rw-r--r--src/mame/misc/interflip8035.cpp34
-rw-r--r--src/mame/misc/intrscti.cpp10
-rw-r--r--src/mame/misc/island.cpp8
-rw-r--r--src/mame/misc/istellar.cpp27
-rw-r--r--src/mame/misc/itgambl2.cpp396
-rw-r--r--src/mame/misc/itgambl3.cpp18
-rw-r--r--src/mame/misc/itgamble.cpp283
-rw-r--r--src/mame/misc/jackhouse.cpp14
-rw-r--r--src/mame/misc/jackpool.cpp4
-rw-r--r--src/mame/misc/jackpot.cpp8
-rw-r--r--src/mame/misc/jaminator.cpp32
-rw-r--r--src/mame/misc/jokrwild.cpp4
-rw-r--r--src/mame/misc/joystand.cpp16
-rw-r--r--src/mame/misc/jubilee.cpp6
-rw-r--r--src/mame/misc/jungleyo.cpp116
-rw-r--r--src/mame/misc/kas89.cpp12
-rw-r--r--src/mame/misc/katosmedz80.cpp18
-rw-r--r--src/mame/misc/kingpin.cpp16
-rw-r--r--src/mame/misc/ladyfrog.h10
-rw-r--r--src/mame/misc/laserbas.cpp158
-rw-r--r--src/mame/misc/laz_aftrshok.cpp12
-rw-r--r--src/mame/misc/laz_ribrac.cpp19
-rw-r--r--src/mame/misc/lependu.cpp239
-rw-r--r--src/mame/misc/limenko.cpp576
-rw-r--r--src/mame/misc/ltcasino.cpp10
-rw-r--r--src/mame/misc/luckybal.cpp8
-rw-r--r--src/mame/misc/magic10.cpp120
-rw-r--r--src/mame/misc/magicard.cpp62
-rw-r--r--src/mame/misc/magicfly.cpp380
-rw-r--r--src/mame/misc/magictg.cpp26
-rw-r--r--src/mame/misc/magreel.cpp8
-rw-r--r--src/mame/misc/magtouch.cpp8
-rw-r--r--src/mame/misc/majorpkr.cpp85
-rw-r--r--src/mame/misc/malzak.cpp202
-rw-r--r--src/mame/misc/malzak.h83
-rw-r--r--src/mame/misc/malzak_v.cpp118
-rw-r--r--src/mame/misc/marywu.cpp192
-rw-r--r--src/mame/misc/matrix.cpp14
-rw-r--r--src/mame/misc/mcatadv.cpp86
-rw-r--r--src/mame/misc/mcm70.cpp18
-rw-r--r--src/mame/misc/megaphx.cpp6
-rw-r--r--src/mame/misc/megaturbo.cpp295
-rw-r--r--src/mame/misc/menghong.cpp371
-rw-r--r--src/mame/misc/meyc8080.cpp10
-rw-r--r--src/mame/misc/meyc8088.cpp6
-rw-r--r--src/mame/misc/mgavegas.cpp10
-rw-r--r--src/mame/misc/micro3d.cpp67
-rw-r--r--src/mame/misc/micro3d.h27
-rw-r--r--src/mame/misc/micro3d_a.cpp15
-rw-r--r--src/mame/misc/micro3d_a.h6
-rw-r--r--src/mame/misc/micro3d_m.cpp70
-rw-r--r--src/mame/misc/microbox2.cpp391
-rw-r--r--src/mame/misc/microdar.cpp55
-rw-r--r--src/mame/misc/mil4000.cpp8
-rw-r--r--src/mame/misc/mindset.cpp (renamed from src/mame/skeleton/mindset.cpp)45
-rw-r--r--src/mame/misc/miniboy7.cpp600
-rw-r--r--src/mame/misc/minivideo.cpp10
-rw-r--r--src/mame/misc/mirax.cpp214
-rw-r--r--src/mame/misc/mirderby.cpp24
-rw-r--r--src/mame/misc/miuchiz.cpp234
-rw-r--r--src/mame/misc/mjsenpu.cpp509
-rw-r--r--src/mame/misc/mole.cpp385
-rw-r--r--src/mame/misc/monon_color.cpp12
-rw-r--r--src/mame/misc/mosaic.cpp111
-rw-r--r--src/mame/misc/mpu12wbk.cpp10
-rw-r--r--src/mame/misc/mtu130.cpp16
-rw-r--r--src/mame/misc/multfish.cpp1052
-rw-r--r--src/mame/misc/multfish.h77
-rw-r--r--src/mame/misc/multfish_boot.cpp249
-rw-r--r--src/mame/misc/murogem.cpp2
-rw-r--r--src/mame/misc/murogmbl.cpp8
-rw-r--r--src/mame/misc/musclem.cpp4
-rw-r--r--src/mame/misc/nabupc.cpp8
-rw-r--r--src/mame/misc/nabupc_kbd.h19
-rw-r--r--src/mame/misc/ncarrera.cpp574
-rw-r--r--src/mame/misc/neomania.cpp38
-rw-r--r--src/mame/misc/neoprint.cpp110
-rw-r--r--src/mame/misc/news.cpp8
-rw-r--r--src/mame/misc/nexus3d.cpp17
-rw-r--r--src/mame/misc/nibble.cpp12
-rw-r--r--src/mame/misc/norautp.cpp4417
-rw-r--r--src/mame/misc/norautp.h107
-rw-r--r--src/mame/misc/norautp_a.cpp100
-rw-r--r--src/mame/misc/notechan.cpp4
-rw-r--r--src/mame/misc/nsg6809.cpp4
-rw-r--r--src/mame/misc/nsmpoker.cpp8
-rw-r--r--src/mame/misc/odyssey.cpp15
-rw-r--r--src/mame/misc/oneshot.cpp12
-rw-r--r--src/mame/misc/opercoin.cpp6
-rw-r--r--src/mame/misc/pachifev.cpp8
-rw-r--r--src/mame/misc/paracaidista.cpp472
-rw-r--r--src/mame/misc/pasha2.cpp87
-rw-r--r--src/mame/misc/pass.cpp8
-rw-r--r--src/mame/misc/photon.cpp8
-rw-r--r--src/mame/misc/photon2.cpp8
-rw-r--r--src/mame/misc/piggypas.cpp26
-rw-r--r--src/mame/misc/pipeline.cpp12
-rw-r--r--src/mame/misc/pkscram.cpp8
-rw-r--r--src/mame/misc/playcenter.cpp12
-rw-r--r--src/mame/misc/plsonic4.cpp8
-rw-r--r--src/mame/misc/pmc.cpp10
-rw-r--r--src/mame/misc/pntnpuzl.cpp14
-rw-r--r--src/mame/misc/pntnpuzls.cpp308
-rw-r--r--src/mame/misc/poker72.cpp10
-rw-r--r--src/mame/misc/pokerout.cpp8
-rw-r--r--src/mame/misc/policetr.cpp31
-rw-r--r--src/mame/misc/policetr.h23
-rw-r--r--src/mame/misc/policetr_v.cpp7
-rw-r--r--src/mame/misc/potgoldu.cpp10
-rw-r--r--src/mame/misc/proconn.cpp288
-rw-r--r--src/mame/misc/ps_m3.cpp485
-rw-r--r--src/mame/misc/psattack.cpp107
-rw-r--r--src/mame/misc/pse.cpp78
-rw-r--r--src/mame/misc/quizo.cpp6
-rw-r--r--src/mame/misc/quizpun2.cpp86
-rw-r--r--src/mame/misc/radikaldarts.cpp80
-rw-r--r--src/mame/misc/rawthrillspc.cpp16
-rw-r--r--src/mame/misc/rcorsair.cpp10
-rw-r--r--src/mame/misc/re900.cpp10
-rw-r--r--src/mame/misc/rgum.cpp22
-rw-r--r--src/mame/misc/roul.cpp10
-rw-r--r--src/mame/misc/rulechan.cpp14
-rw-r--r--src/mame/misc/sanremmg.cpp11
-rw-r--r--src/mame/misc/sanremo.cpp8
-rw-r--r--src/mame/misc/savquest.cpp625
-rw-r--r--src/mame/misc/scm_500.cpp10
-rw-r--r--src/mame/misc/shangkid.h32
-rw-r--r--src/mame/misc/silverball.cpp99
-rw-r--r--src/mame/misc/skeetsht.cpp8
-rw-r--r--src/mame/misc/skyarmy.cpp39
-rw-r--r--src/mame/misc/sliver.cpp82
-rw-r--r--src/mame/misc/smd2144c.cpp6
-rw-r--r--src/mame/misc/smotor.cpp8
-rw-r--r--src/mame/misc/smsmcorp.cpp12
-rw-r--r--src/mame/misc/spcforce.cpp (renamed from src/mame/venture/spcforce.cpp)46
-rw-r--r--src/mame/misc/spdamjes.cpp4
-rw-r--r--src/mame/misc/spool99.cpp148
-rw-r--r--src/mame/misc/sprcros2.cpp581
-rw-r--r--src/mame/misc/sshanghai.cpp685
-rw-r--r--src/mame/misc/ssingles.cpp677
-rw-r--r--src/mame/misc/startouch.cpp201
-rw-r--r--src/mame/misc/statriv2.cpp558
-rw-r--r--src/mame/misc/stc3910.cpp392
-rw-r--r--src/mame/misc/stop.cpp4
-rw-r--r--src/mame/misc/strkzn.cpp10
-rw-r--r--src/mame/misc/sttechno.cpp7
-rw-r--r--src/mame/misc/stuntair.cpp12
-rw-r--r--src/mame/misc/su2000.cpp18
-rw-r--r--src/mame/misc/summit.cpp4
-rw-r--r--src/mame/misc/sumt8035.cpp14
-rw-r--r--src/mame/misc/tapatune.cpp56
-rw-r--r--src/mame/misc/tattack.cpp146
-rw-r--r--src/mame/misc/taxidriv.cpp10
-rw-r--r--src/mame/misc/teamjocs.cpp2
-rw-r--r--src/mame/misc/tecnodar.cpp6
-rw-r--r--src/mame/misc/thayers.cpp23
-rw-r--r--src/mame/misc/tickee.cpp46
-rw-r--r--src/mame/misc/timelimt.cpp (renamed from src/mame/thepit/timelimt.cpp)24
-rw-r--r--src/mame/misc/tmspoker.cpp10
-rw-r--r--src/mame/misc/tomsadvs.cpp19
-rw-r--r--src/mame/misc/toratora.cpp10
-rw-r--r--src/mame/misc/triton.cpp21
-rw-r--r--src/mame/misc/triviaquiz.cpp10
-rw-r--r--src/mame/misc/trivrus.cpp88
-rw-r--r--src/mame/misc/truco.cpp497
-rw-r--r--src/mame/misc/trucocl.cpp10
-rw-r--r--src/mame/misc/truesys.cpp4
-rw-r--r--src/mame/misc/trvmadns.cpp16
-rw-r--r--src/mame/misc/ttchamp.cpp46
-rw-r--r--src/mame/misc/tugboat.cpp6
-rw-r--r--src/mame/misc/tvg01.cpp15
-rw-r--r--src/mame/misc/twinbskt.cpp2
-rw-r--r--src/mame/misc/umipoker.cpp473
-rw-r--r--src/mame/misc/unkgolf.cpp2
-rw-r--r--src/mame/misc/unkhorse.cpp253
-rw-r--r--src/mame/misc/unkpoker.cpp90
-rw-r--r--src/mame/misc/unktop.cpp4
-rw-r--r--src/mame/misc/usbilliards.cpp8
-rw-r--r--src/mame/misc/usgames.cpp10
-rw-r--r--src/mame/misc/v0bowl.cpp41
-rw-r--r--src/mame/misc/vamphalf.cpp844
-rw-r--r--src/mame/misc/vamphalf_prot.cpp420
-rw-r--r--src/mame/misc/vamphalf_prot.h77
-rw-r--r--src/mame/misc/vampire.cpp6
-rw-r--r--src/mame/misc/vcombat.cpp12
-rw-r--r--src/mame/misc/video21.cpp307
-rw-r--r--src/mame/misc/videoart.cpp4
-rw-r--r--src/mame/misc/videosaa.cpp6
-rw-r--r--src/mame/misc/vlc.cpp6
-rw-r--r--src/mame/misc/vlc34010.cpp10
-rw-r--r--src/mame/misc/vocalizer.cpp21
-rw-r--r--src/mame/misc/voyager.cpp21
-rw-r--r--src/mame/misc/vpoker.cpp798
-rw-r--r--src/mame/misc/vroulet.cpp43
-rw-r--r--src/mame/misc/whtm68k.cpp463
-rw-r--r--src/mame/misc/wildpkr.cpp14
-rw-r--r--src/mame/misc/winbingo.cpp8
-rw-r--r--src/mame/misc/wms.cpp72
-rw-r--r--src/mame/misc/wren.cpp680
-rw-r--r--src/mame/misc/xtom3d.cpp333
-rw-r--r--src/mame/misc/xtom3d_piu10.h6
-rw-r--r--src/mame/misc/xyonix.cpp12
-rw-r--r--src/mame/misc/yuvomz80.cpp21
-rw-r--r--src/mame/misc/z80ne.cpp36
-rw-r--r--src/mame/mit/tx0.cpp2
-rw-r--r--src/mame/mit/tx0.h137
-rw-r--r--src/mame/mit/tx0_v.cpp77
-rw-r--r--src/mame/mits/al8800b.cpp46
-rw-r--r--src/mame/mits/altair.cpp6
-rw-r--r--src/mame/mits/mits680b.cpp2
-rw-r--r--src/mame/mitsubishi/multi16.cpp8
-rw-r--r--src/mame/mitsubishi/multi8.cpp12
-rw-r--r--src/mame/mitsubishi/trium.cpp4
-rw-r--r--src/mame/modelracing/dribling.cpp (renamed from src/mame/mr/dribling.cpp)8
-rw-r--r--src/mame/modelracing/nl_dribling.cpp (renamed from src/mame/mr/nl_dribling.cpp)0
-rw-r--r--src/mame/modelracing/nl_dribling.h10
-rw-r--r--src/mame/modelracing/sshot.cpp463
-rw-r--r--src/mame/modelracing/subhuntr.cpp (renamed from src/mame/mr/subhuntr.cpp)23
-rw-r--r--src/mame/moog/memorymoog.cpp1128
-rw-r--r--src/mame/moog/nl_source.cpp105
-rw-r--r--src/mame/moog/nl_source.h12
-rw-r--r--src/mame/moog/source.cpp1074
-rw-r--r--src/mame/morrow/microdec.cpp8
-rw-r--r--src/mame/morrow/mpz80.cpp2
-rw-r--r--src/mame/morrow/mpz80.h8
-rw-r--r--src/mame/morrow/tricep.cpp6
-rw-r--r--src/mame/motorola/ampscarp.cpp4
-rw-r--r--src/mame/motorola/assist05.cpp136
-rw-r--r--src/mame/motorola/exorciser.cpp22
-rw-r--r--src/mame/motorola/m6805evs.cpp4
-rw-r--r--src/mame/motorola/m8120.cpp2
-rw-r--r--src/mame/motorola/mekd1.cpp6
-rw-r--r--src/mame/motorola/mekd2.cpp4
-rw-r--r--src/mame/motorola/mekd3.cpp61
-rw-r--r--src/mame/motorola/mekd4.cpp63
-rw-r--r--src/mame/motorola/mekd5.cpp57
-rw-r--r--src/mame/motorola/mex68kecb.cpp236
-rw-r--r--src/mame/motorola/mvme162.cpp2
-rw-r--r--src/mame/motorola/powerstack.cpp2
-rw-r--r--src/mame/motorola/sys1121.cpp2
-rw-r--r--src/mame/motorola/uchroma68.cpp11
-rw-r--r--src/mame/mr/nl_dribling.h10
-rw-r--r--src/mame/mr/sshot.cpp401
-rw-r--r--src/mame/msx/forte2.cpp6
-rw-r--r--src/mame/msx/msx.cpp9
-rw-r--r--src/mame/msx/msx.h23
-rw-r--r--src/mame/msx/msx1_bruc100.cpp2
-rw-r--r--src/mame/msx/msx1_v9938.cpp2
-rw-r--r--src/mame/msx/msx2p.cpp96
-rw-r--r--src/mame/msx/msx_kanji12.h2
-rw-r--r--src/mame/msx/msx_keyboard.cpp146
-rw-r--r--src/mame/msx/msx_matsushita.h4
-rw-r--r--src/mame/msx/msx_s1985.h2
-rw-r--r--src/mame/msx/msx_s1990.cpp268
-rw-r--r--src/mame/msx/msx_s1990.h93
-rw-r--r--src/mame/msx/msx_systemflags.h2
-rw-r--r--src/mame/msx/msxtr.cpp463
-rw-r--r--src/mame/msx/pengadvb.cpp10
-rw-r--r--src/mame/msx/sangho.cpp12
-rw-r--r--src/mame/msx/sfkick.cpp14
-rw-r--r--src/mame/multitech/mkit09.cpp18
-rw-r--r--src/mame/multitech/mpf1.cpp28
-rw-r--r--src/mame/multitech/mpf1_88.cpp10
-rw-r--r--src/mame/multitech/mpf1p.cpp10
-rw-r--r--src/mame/mupid/mdisk.cpp8
-rw-r--r--src/mame/mupid/mupid2.cpp8
-rw-r--r--src/mame/nakajima/nakajies.cpp134
-rw-r--r--src/mame/namco/20pacgal.cpp142
-rw-r--r--src/mame/namco/20pacgal.h36
-rw-r--r--src/mame/namco/20pacgal_v.cpp161
-rw-r--r--src/mame/namco/30test.cpp4
-rw-r--r--src/mame/namco/baraduke.cpp283
-rw-r--r--src/mame/namco/bosco.cpp41
-rw-r--r--src/mame/namco/bosco.h4
-rw-r--r--src/mame/namco/c117.h6
-rw-r--r--src/mame/namco/cgang.cpp10
-rw-r--r--src/mame/namco/cswat.cpp146
-rw-r--r--src/mame/namco/dangbar.cpp14
-rw-r--r--src/mame/namco/digdug.cpp36
-rw-r--r--src/mame/namco/digdug.h6
-rw-r--r--src/mame/namco/dkmb.cpp9
-rw-r--r--src/mame/namco/ds5000.cpp400
-rw-r--r--src/mame/namco/ds6000.cpp232
-rw-r--r--src/mame/namco/funcube.cpp675
-rw-r--r--src/mame/namco/funcube_touchscreen.cpp92
-rw-r--r--src/mame/namco/funcube_touchscreen.h47
-rw-r--r--src/mame/namco/gal3.cpp187
-rw-r--r--src/mame/namco/galaga.cpp74
-rw-r--r--src/mame/namco/galaga.h16
-rw-r--r--src/mame/namco/galaga_v.cpp49
-rw-r--r--src/mame/namco/gaplus.cpp5
-rw-r--r--src/mame/namco/gaplus.h14
-rw-r--r--src/mame/namco/geebee.cpp124
-rw-r--r--src/mame/namco/geebee.h4
-rw-r--r--src/mame/namco/kungfur.cpp6
-rw-r--r--src/mame/namco/mappy.cpp377
-rw-r--r--src/mame/namco/mappy.h66
-rw-r--r--src/mame/namco/mappy_v.cpp115
-rw-r--r--src/mame/namco/md8412b_s23.cpp1063
-rw-r--r--src/mame/namco/md8412b_s23.h334
-rw-r--r--src/mame/namco/namco06.cpp6
-rw-r--r--src/mame/namco/namco06.h4
-rw-r--r--src/mame/namco/namco50.cpp24
-rw-r--r--src/mame/namco/namco50.h20
-rw-r--r--src/mame/namco/namco51.cpp50
-rw-r--r--src/mame/namco/namco51.h17
-rw-r--r--src/mame/namco/namco52.cpp20
-rw-r--r--src/mame/namco/namco52.h12
-rw-r--r--src/mame/namco/namco53.cpp46
-rw-r--r--src/mame/namco/namco53.h18
-rw-r--r--src/mame/namco/namco54.cpp27
-rw-r--r--src/mame/namco/namco54.h11
-rw-r--r--src/mame/namco/namco62.cpp2
-rw-r--r--src/mame/namco/namco62.h8
-rw-r--r--src/mame/namco/namco65.cpp7
-rw-r--r--src/mame/namco/namco65.h14
-rw-r--r--src/mame/namco/namco68.cpp2
-rw-r--r--src/mame/namco/namco68.h12
-rw-r--r--src/mame/namco/namco_c116.h2
-rw-r--r--src/mame/namco/namco_c123tmap.cpp80
-rw-r--r--src/mame/namco/namco_c123tmap.h12
-rw-r--r--src/mame/namco/namco_c139.h8
-rw-r--r--src/mame/namco/namco_c148.cpp143
-rw-r--r--src/mame/namco/namco_c148.h85
-rw-r--r--src/mame/namco/namco_c169roz.cpp76
-rw-r--r--src/mame/namco/namco_c169roz.h14
-rw-r--r--src/mame/namco/namco_c45road.cpp87
-rw-r--r--src/mame/namco/namco_c45road.h24
-rw-r--r--src/mame/namco/namco_c67.cpp32
-rw-r--r--src/mame/namco/namco_c67.h25
-rw-r--r--src/mame/namco/namco_cus4xtmap.cpp119
-rw-r--r--src/mame/namco/namco_cus4xtmap.h73
-rw-r--r--src/mame/namco/namco_dsp.cpp52
-rw-r--r--src/mame/namco/namco_dsp.h34
-rw-r--r--src/mame/namco/namco_settings.cpp5
-rw-r--r--src/mame/namco/namco_settings.h4
-rw-r--r--src/mame/namco/namcoeva.cpp (renamed from src/mame/seta/namcoeva.cpp)84
-rw-r--r--src/mame/namco/namcofl.cpp191
-rw-r--r--src/mame/namco/namcoio.h10
-rw-r--r--src/mame/namco/namcoio_gearbox.cpp2
-rw-r--r--src/mame/namco/namcoio_gearbox.h10
-rw-r--r--src/mame/namco/namcomcu.h10
-rw-r--r--src/mame/namco/namcona1.cpp694
-rw-r--r--src/mame/namco/namcona1.h17
-rw-r--r--src/mame/namco/namcona1_v.cpp54
-rw-r--r--src/mame/namco/namconb1.cpp150
-rw-r--r--src/mame/namco/namconb1.h110
-rw-r--r--src/mame/namco/namconb1_v.cpp141
-rw-r--r--src/mame/namco/namcond1.cpp29
-rw-r--r--src/mame/namco/namcops2.cpp132
-rw-r--r--src/mame/namco/namcos1.cpp288
-rw-r--r--src/mame/namco/namcos1.h85
-rw-r--r--src/mame/namco/namcos10.cpp251
-rw-r--r--src/mame/namco/namcos10_exio.h14
-rw-r--r--src/mame/namco/namcos11.cpp25
-rw-r--r--src/mame/namco/namcos12.cpp4337
-rw-r--r--src/mame/namco/namcos12_cdxa.cpp111
-rw-r--r--src/mame/namco/namcos12_cdxa.h20
-rw-r--r--src/mame/namco/namcos14x.cpp637
-rw-r--r--src/mame/namco/namcos1_m.cpp169
-rw-r--r--src/mame/namco/namcos1_sprite.cpp193
-rw-r--r--src/mame/namco/namcos1_sprite.h63
-rw-r--r--src/mame/namco/namcos1_v.cpp173
-rw-r--r--src/mame/namco/namcos1b.cpp8
-rw-r--r--src/mame/namco/namcos2.cpp817
-rw-r--r--src/mame/namco/namcos2.h410
-rw-r--r--src/mame/namco/namcos21.cpp771
-rw-r--r--src/mame/namco/namcos21_3d.cpp320
-rw-r--r--src/mame/namco/namcos21_3d.h51
-rw-r--r--src/mame/namco/namcos21_c67.cpp730
-rw-r--r--src/mame/namco/namcos21_de.cpp497
-rw-r--r--src/mame/namco/namcos21_dsp.cpp304
-rw-r--r--src/mame/namco/namcos21_dsp.h100
-rw-r--r--src/mame/namco/namcos21_dsp_c67.cpp737
-rw-r--r--src/mame/namco/namcos21_dsp_c67.h191
-rw-r--r--src/mame/namco/namcos22.cpp3557
-rw-r--r--src/mame/namco/namcos22.h66
-rw-r--r--src/mame/namco/namcos22_v.cpp440
-rw-r--r--src/mame/namco/namcos23.cpp7499
-rw-r--r--src/mame/namco/namcos2_m.cpp232
-rw-r--r--src/mame/namco/namcos2_roz.cpp203
-rw-r--r--src/mame/namco/namcos2_roz.h10
-rw-r--r--src/mame/namco/namcos2_sprite.cpp324
-rw-r--r--src/mame/namco/namcos2_sprite.h57
-rw-r--r--src/mame/namco/namcos2_v.cpp181
-rw-r--r--src/mame/namco/namcos6.cpp284
-rw-r--r--src/mame/namco/namcos86.cpp870
-rw-r--r--src/mame/namco/namcos86.h133
-rw-r--r--src/mame/namco/namcos86_v.cpp310
-rw-r--r--src/mame/namco/ns10crypt.h16
-rw-r--r--src/mame/namco/ns11prot.h4
-rw-r--r--src/mame/namco/pacland.cpp29
-rw-r--r--src/mame/namco/polepos.cpp551
-rw-r--r--src/mame/namco/polepos.h105
-rw-r--r--src/mame/namco/polepos_a.cpp65
-rw-r--r--src/mame/namco/polepos_a.h14
-rw-r--r--src/mame/namco/polepos_v.cpp107
-rw-r--r--src/mame/namco/quickncrash.cpp86
-rw-r--r--src/mame/namco/rallyx.cpp87
-rw-r--r--src/mame/namco/rallyx.h10
-rw-r--r--src/mame/namco/rallyx_v.cpp4
-rw-r--r--src/mame/namco/rbowlorama.cpp23
-rw-r--r--src/mame/namco/sg_vga.cpp702
-rw-r--r--src/mame/namco/shootaway2.cpp12
-rw-r--r--src/mame/namco/skykid.cpp197
-rw-r--r--src/mame/namco/starfield_05xx.h4
-rw-r--r--src/mame/namco/sweetland.cpp2
-rw-r--r--src/mame/namco/sweetland4.cpp20
-rw-r--r--src/mame/namco/tankbatt.cpp4
-rw-r--r--src/mame/namco/tceptor.cpp68
-rw-r--r--src/mame/namco/tceptor.h32
-rw-r--r--src/mame/namco/tceptor_v.cpp95
-rw-r--r--src/mame/namco/toypop.cpp473
-rw-r--r--src/mame/namco/turrett.cpp116
-rw-r--r--src/mame/namco/turrett.h30
-rw-r--r--src/mame/namco/turrett_a.cpp29
-rw-r--r--src/mame/namco/turrett_v.cpp59
-rw-r--r--src/mame/namco/vpx3220a.cpp818
-rw-r--r--src/mame/namco/vpx3220a.h103
-rw-r--r--src/mame/namco/wacky_gator.cpp22
-rw-r--r--src/mame/namco/warpwarp.cpp6
-rw-r--r--src/mame/namco/warpwarp.h10
-rw-r--r--src/mame/namco/warpwarp_a.cpp107
-rw-r--r--src/mame/namco/warpwarp_a.h17
-rw-r--r--src/mame/namco/warpwarp_v.cpp8
-rw-r--r--src/mame/namco/xevious.h8
-rw-r--r--src/mame/namco/ygv608.cpp4
-rw-r--r--src/mame/namco/ygv608.h8
-rw-r--r--src/mame/nasco/crgolf.cpp24
-rw-r--r--src/mame/nasco/himesiki.cpp14
-rw-r--r--src/mame/nasco/suprgolf.cpp53
-rw-r--r--src/mame/nascom/nascom1.cpp21
-rw-r--r--src/mame/natsemi/icm3216.cpp27
-rw-r--r--src/mame/natsemi/ns32kdb.cpp6
-rw-r--r--src/mame/natsemi/ns5652.cpp4
-rw-r--r--src/mame/natsemi/sys16.cpp8
-rw-r--r--src/mame/ncd/bert_m.h6
-rw-r--r--src/mame/ncd/ncd68k.cpp14
-rw-r--r--src/mame/ncd/ncd88k.cpp14
-rw-r--r--src/mame/ncd/ncdmips.cpp44
-rw-r--r--src/mame/ncd/ncdppc.cpp4
-rw-r--r--src/mame/ncr/dmv.cpp33
-rw-r--r--src/mame/ncr/dmv_keyb.h10
-rw-r--r--src/mame/nec/apc.cpp252
-rw-r--r--src/mame/nec/bungo.cpp46
-rw-r--r--src/mame/nec/bungo.h9
-rw-r--r--src/mame/nec/ews4800.cpp24
-rw-r--r--src/mame/nec/pc100.cpp254
-rw-r--r--src/mame/nec/pc6001.cpp61
-rw-r--r--src/mame/nec/pc6001.h46
-rw-r--r--src/mame/nec/pc8001.cpp48
-rw-r--r--src/mame/nec/pc8001.h26
-rw-r--r--src/mame/nec/pc8401a.cpp14
-rw-r--r--src/mame/nec/pc8801.cpp160
-rw-r--r--src/mame/nec/pc8801.h42
-rw-r--r--src/mame/nec/pc88va.cpp443
-rw-r--r--src/mame/nec/pc88va.h131
-rw-r--r--src/mame/nec/pc88va_sgp.cpp249
-rw-r--r--src/mame/nec/pc88va_sgp.h39
-rw-r--r--src/mame/nec/pc88va_v.cpp488
-rw-r--r--src/mame/nec/pc9801.cpp1846
-rw-r--r--src/mame/nec/pc9801.h177
-rw-r--r--src/mame/nec/pc9801_cd.cpp35
-rw-r--r--src/mame/nec/pc9801_cd.h23
-rw-r--r--src/mame/nec/pc9801_epson.cpp174
-rw-r--r--src/mame/nec/pc9801_epson.h22
-rw-r--r--src/mame/nec/pc9801_kbd.cpp317
-rw-r--r--src/mame/nec/pc9801_kbd.h64
-rw-r--r--src/mame/nec/pc9801_memsw.cpp169
-rw-r--r--src/mame/nec/pc9801_memsw.h56
-rw-r--r--src/mame/nec/pc9801_v.cpp215
-rw-r--r--src/mame/nec/pc9821.cpp1480
-rw-r--r--src/mame/nec/pc9821.h133
-rw-r--r--src/mame/nec/pc98_cd.cpp54
-rw-r--r--src/mame/nec/pc98_cd.h23
-rw-r--r--src/mame/nec/pc98_kbd.cpp517
-rw-r--r--src/mame/nec/pc98_kbd.h94
-rw-r--r--src/mame/nec/pc98_memsw.cpp142
-rw-r--r--src/mame/nec/pc98_memsw.h37
-rw-r--r--src/mame/nec/pc98_sdip.cpp85
-rw-r--r--src/mame/nec/pc98_sdip.h49
-rw-r--r--src/mame/nec/pc98ha.cpp200
-rw-r--r--src/mame/nec/pc98ha.h26
-rw-r--r--src/mame/nec/pc_h98.cpp27
-rw-r--r--src/mame/nec/pce.cpp80
-rw-r--r--src/mame/nec/pce.h37
-rw-r--r--src/mame/nec/pce_cd.cpp218
-rw-r--r--src/mame/nec/pce_cd.h221
-rw-r--r--src/mame/nec/pcfx.cpp423
-rw-r--r--src/mame/nec/piet1.cpp420
-rw-r--r--src/mame/nec/tk80bs.cpp4
-rw-r--r--src/mame/neogeo/midas.cpp151
-rw-r--r--src/mame/neogeo/neogeo.cpp257
-rw-r--r--src/mame/neogeo/neogeo.h36
-rw-r--r--src/mame/neogeo/neogeo_spr.cpp258
-rw-r--r--src/mame/neogeo/neogeo_spr.h153
-rw-r--r--src/mame/neogeo/neogeo_v.cpp32
-rw-r--r--src/mame/neogeo/neogeocd.cpp454
-rw-r--r--src/mame/neogeo/neopcb.cpp21
-rw-r--r--src/mame/neogeo/ng_memcard.h2
-rw-r--r--src/mame/netronics/elf.cpp101
-rw-r--r--src/mame/netronics/elf.h28
-rw-r--r--src/mame/netronics/exp85.cpp10
-rw-r--r--src/mame/newcrest/chess2001.cpp (renamed from src/mame/cxg/chess2001.cpp)22
-rw-r--r--src/mame/newcrest/chess3008.cpp260
-rw-r--r--src/mame/newcrest/chess3008_lcd.cpp104
-rw-r--r--src/mame/newcrest/chess3008_lcd.h42
-rw-r--r--src/mame/newcrest/computachess.cpp245
-rw-r--r--src/mame/newcrest/computachess2.cpp206
-rw-r--r--src/mame/newcrest/dominator.cpp (renamed from src/mame/cxg/dominator.cpp)95
-rw-r--r--src/mame/newcrest/junior.cpp250
-rw-r--r--src/mame/newcrest/legend.cpp468
-rw-r--r--src/mame/newcrest/pchess.cpp220
-rw-r--r--src/mame/newcrest/professor.cpp (renamed from src/mame/cxg/professor.cpp)12
-rw-r--r--src/mame/newcrest/royal.cpp366
-rw-r--r--src/mame/newcrest/senterprise.cpp (renamed from src/mame/cxg/senterprise.cpp)117
-rw-r--r--src/mame/newcrest/sphinx40.cpp (renamed from src/mame/cxg/sphinx40.cpp)17
-rw-r--r--src/mame/next/next.cpp22
-rw-r--r--src/mame/next/next.h33
-rw-r--r--src/mame/next/nextkbd.cpp184
-rw-r--r--src/mame/next/nextkbd.h8
-rw-r--r--src/mame/next/nextmo.h6
-rw-r--r--src/mame/nichibutsu/armedf.cpp159
-rw-r--r--src/mame/nichibutsu/armedf.h79
-rw-r--r--src/mame/nichibutsu/armedf_v.cpp68
-rw-r--r--src/mame/nichibutsu/cclimber.cpp2033
-rw-r--r--src/mame/nichibutsu/cclimber.h234
-rw-r--r--src/mame/nichibutsu/cclimber_m.cpp116
-rw-r--r--src/mame/nichibutsu/cclimber_v.cpp778
-rw-r--r--src/mame/nichibutsu/clshroad.cpp12
-rw-r--r--src/mame/nichibutsu/cop01.cpp337
-rw-r--r--src/mame/nichibutsu/dacholer.cpp28
-rw-r--r--src/mame/nichibutsu/galivan.cpp1685
-rw-r--r--src/mame/nichibutsu/galivan.h138
-rw-r--r--src/mame/nichibutsu/galivan_v.cpp407
-rw-r--r--src/mame/nichibutsu/gomoku.cpp14
-rw-r--r--src/mame/nichibutsu/gomoku_a.cpp29
-rw-r--r--src/mame/nichibutsu/gomoku_a.h6
-rw-r--r--src/mame/nichibutsu/hrdvd.cpp29
-rw-r--r--src/mame/nichibutsu/hyhoo.cpp10
-rw-r--r--src/mame/nichibutsu/jangou.cpp30
-rw-r--r--src/mame/nichibutsu/magmax.cpp182
-rw-r--r--src/mame/nichibutsu/myvision.cpp47
-rw-r--r--src/mame/nichibutsu/nb1412m2.h8
-rw-r--r--src/mame/nichibutsu/nb1413m3.cpp3
-rw-r--r--src/mame/nichibutsu/nb1413m3.h4
-rw-r--r--src/mame/nichibutsu/nb1414m4.h4
-rw-r--r--src/mame/nichibutsu/nbmj8688.cpp180
-rw-r--r--src/mame/nichibutsu/nbmj8688.h32
-rw-r--r--src/mame/nichibutsu/nbmj8891.cpp155
-rw-r--r--src/mame/nichibutsu/nbmj8891.h127
-rw-r--r--src/mame/nichibutsu/nbmj8900.h8
-rw-r--r--src/mame/nichibutsu/nbmj8991.cpp65
-rw-r--r--src/mame/nichibutsu/nbmj8991.h34
-rw-r--r--src/mame/nichibutsu/nbmj9195.cpp145
-rw-r--r--src/mame/nichibutsu/nbmj9195.h68
-rw-r--r--src/mame/nichibutsu/nichild.cpp12
-rw-r--r--src/mame/nichibutsu/nichisnd.cpp19
-rw-r--r--src/mame/nichibutsu/nichisnd.h12
-rw-r--r--src/mame/nichibutsu/nightgal.cpp86
-rw-r--r--src/mame/nichibutsu/niyanpai.cpp827
-rw-r--r--src/mame/nichibutsu/niyanpai.h108
-rw-r--r--src/mame/nichibutsu/niyanpai_v.cpp455
-rw-r--r--src/mame/nichibutsu/nyanpai.cpp717
-rw-r--r--src/mame/nichibutsu/nyanpai.h180
-rw-r--r--src/mame/nichibutsu/nyanpai_v.cpp397
-rw-r--r--src/mame/nichibutsu/pastelg.cpp16
-rw-r--r--src/mame/nichibutsu/seicross.cpp517
-rw-r--r--src/mame/nichibutsu/shettle.cpp11
-rw-r--r--src/mame/nichibutsu/terracre.cpp63
-rw-r--r--src/mame/nichibutsu/tubep.cpp127
-rw-r--r--src/mame/nichibutsu/tubep.h40
-rw-r--r--src/mame/nichibutsu/tubep_v.cpp2
-rw-r--r--src/mame/nichibutsu/wiping.cpp17
-rw-r--r--src/mame/nichibutsu/wiping_a.cpp40
-rw-r--r--src/mame/nichibutsu/wiping_a.h14
-rw-r--r--src/mame/nintendo/aleck64.cpp17
-rw-r--r--src/mame/nintendo/blockfvr.cpp290
-rw-r--r--src/mame/nintendo/cham24.cpp8
-rw-r--r--src/mame/nintendo/compmahj.cpp6
-rw-r--r--src/mame/nintendo/cothello.cpp6
-rw-r--r--src/mame/nintendo/dkong.cpp162
-rw-r--r--src/mame/nintendo/dkong.h80
-rw-r--r--src/mame/nintendo/dkong_a.cpp2
-rw-r--r--src/mame/nintendo/famibox.cpp14
-rw-r--r--src/mame/nintendo/gamecube.cpp54
-rw-r--r--src/mame/nintendo/gb.cpp52
-rw-r--r--src/mame/nintendo/gba.cpp236
-rw-r--r--src/mame/nintendo/gba.h44
-rw-r--r--src/mame/nintendo/m6502_swap_op_d2_d7.cpp10
-rw-r--r--src/mame/nintendo/m6502_swap_op_d2_d7.h12
-rw-r--r--src/mame/nintendo/m6502_swap_op_d5_d6.cpp52
-rw-r--r--src/mame/nintendo/m6502_swap_op_d5_d6.h27
-rw-r--r--src/mame/nintendo/m6502_vtscr.cpp97
-rw-r--r--src/mame/nintendo/m6502_vtscr.h58
-rw-r--r--src/mame/nintendo/mario.cpp969
-rw-r--r--src/mame/nintendo/mario.h160
-rw-r--r--src/mame/nintendo/mario_a.cpp689
-rw-r--r--src/mame/nintendo/mario_v.cpp228
-rw-r--r--src/mame/nintendo/mmagic.cpp35
-rw-r--r--src/mame/nintendo/multigam.cpp18
-rw-r--r--src/mame/nintendo/n64.cpp17
-rw-r--r--src/mame/nintendo/n64.h26
-rw-r--r--src/mame/nintendo/n64_gateway.cpp17
-rw-r--r--src/mame/nintendo/n64_m.cpp54
-rw-r--r--src/mame/nintendo/n64_v.cpp30
-rw-r--r--src/mame/nintendo/n64_v.h9
-rw-r--r--src/mame/nintendo/n8080.cpp3
-rw-r--r--src/mame/nintendo/n8080_a.cpp1
-rw-r--r--src/mame/nintendo/nds.cpp8
-rw-r--r--src/mame/nintendo/nds.h13
-rw-r--r--src/mame/nintendo/nes.cpp368
-rw-r--r--src/mame/nintendo/nes.h117
-rw-r--r--src/mame/nintendo/nes_arcade_bl.cpp15
-rw-r--r--src/mame/nintendo/nes_clone.cpp403
-rw-r--r--src/mame/nintendo/nes_m.cpp235
-rw-r--r--src/mame/nintendo/nes_m8.cpp106
-rw-r--r--src/mame/nintendo/nes_m82.cpp10
-rw-r--r--src/mame/nintendo/nes_sh6578.cpp151
-rw-r--r--src/mame/nintendo/nes_v.cpp64
-rw-r--r--src/mame/nintendo/nes_vt02_vt03.cpp588
-rw-r--r--src/mame/nintendo/nes_vt09.cpp146
-rw-r--r--src/mame/nintendo/nes_vt09_soc.cpp6
-rw-r--r--src/mame/nintendo/nes_vt09_soc.h15
-rw-r--r--src/mame/nintendo/nes_vt32.cpp323
-rw-r--r--src/mame/nintendo/nes_vt32_soc.cpp428
-rw-r--r--src/mame/nintendo/nes_vt32_soc.h66
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown.cpp1864
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown_soc.cpp958
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown_soc.h239
-rw-r--r--src/mame/nintendo/nes_vt42xx.cpp618
-rw-r--r--src/mame/nintendo/nes_vt42xx_soc.cpp202
-rw-r--r--src/mame/nintendo/nes_vt42xx_soc.h58
-rw-r--r--src/mame/nintendo/nes_vt4ffx_soc.cpp510
-rw-r--r--src/mame/nintendo/nes_vt4ffx_soc.h141
-rw-r--r--src/mame/nintendo/nes_vt_soc.cpp654
-rw-r--r--src/mame/nintendo/nes_vt_soc.h231
-rw-r--r--src/mame/nintendo/nl_mario.cpp7
-rw-r--r--src/mame/nintendo/nss.cpp49
-rw-r--r--src/mame/nintendo/playch10.cpp42
-rw-r--r--src/mame/nintendo/pokemini.cpp6
-rw-r--r--src/mame/nintendo/popeye.cpp10
-rw-r--r--src/mame/nintendo/popeye.h16
-rw-r--r--src/mame/nintendo/popeye_v.cpp89
-rw-r--r--src/mame/nintendo/punchout.cpp17
-rw-r--r--src/mame/nintendo/punchout.h14
-rw-r--r--src/mame/nintendo/punchout_v.cpp26
-rw-r--r--src/mame/nintendo/rdpblend.cpp3
-rw-r--r--src/mame/nintendo/rdpblend.h18
-rw-r--r--src/mame/nintendo/rdptpipe.cpp34
-rw-r--r--src/mame/nintendo/rdptpipe.h18
-rw-r--r--src/mame/nintendo/rp2a03_vtscr.cpp92
-rw-r--r--src/mame/nintendo/rp2a03_vtscr.h58
-rw-r--r--src/mame/nintendo/sfcbox.cpp33
-rw-r--r--src/mame/nintendo/snes.cpp22
-rw-r--r--src/mame/nintendo/snes.h4
-rw-r--r--src/mame/nintendo/snes_m.cpp4
-rw-r--r--src/mame/nintendo/snesb.cpp318
-rw-r--r--src/mame/nintendo/snesb51.cpp37
-rw-r--r--src/mame/nintendo/spacefb.cpp125
-rw-r--r--src/mame/nintendo/vboy.cpp17
-rw-r--r--src/mame/nintendo/vsnes.cpp229
-rw-r--r--src/mame/nintendo/vt1682.cpp847
-rw-r--r--src/mame/nintendo/vt1682_alu.cpp55
-rw-r--r--src/mame/nintendo/vt1682_alu.h9
-rw-r--r--src/mame/nintendo/vt1682_io.cpp181
-rw-r--r--src/mame/nintendo/vt1682_io.h28
-rw-r--r--src/mame/nintendo/vt1682_timer.cpp1
-rw-r--r--src/mame/nintendo/vt1682_timer.h6
-rw-r--r--src/mame/nintendo/vt1682_uio.h4
-rw-r--r--src/mame/nintendo/vt369_adpcm.cpp46
-rw-r--r--src/mame/nintendo/vt369_adpcm.h52
-rw-r--r--src/mame/nintendo/vt_menu_protection.cpp117
-rw-r--r--src/mame/nintendo/vt_menu_protection.h38
-rw-r--r--src/mame/nintendo/vt_menu_protection_lxcap.cpp113
-rw-r--r--src/mame/nintendo/vt_menu_protection_lxcap.h36
-rw-r--r--src/mame/nintendo/vt_unknown.cpp108
-rw-r--r--src/mame/nix/fitfight.h12
-rw-r--r--src/mame/nix/pirates.cpp8
-rw-r--r--src/mame/nl.flt4
-rw-r--r--src/mame/nmk/cultures.cpp12
-rw-r--r--src/mame/nmk/ddealer.cpp121
-rw-r--r--src/mame/nmk/macrossp.cpp21
-rw-r--r--src/mame/nmk/nmk004.cpp67
-rw-r--r--src/mame/nmk/nmk004.h44
-rw-r--r--src/mame/nmk/nmk16.cpp1571
-rw-r--r--src/mame/nmk/nmk16.h385
-rw-r--r--src/mame/nmk/nmk16_v.cpp58
-rw-r--r--src/mame/nmk/nmk16spr.h4
-rw-r--r--src/mame/nmk/nmk214.h4
-rw-r--r--src/mame/nmk/nmk_irq.cpp252
-rw-r--r--src/mame/nmk/nmk_irq.h66
-rw-r--r--src/mame/nmk/nmkmedal.cpp114
-rw-r--r--src/mame/nmk/quizdna.cpp369
-rw-r--r--src/mame/nmk/quizpani.cpp173
-rw-r--r--src/mame/nokia/dbox.cpp127
-rw-r--r--src/mame/nokia/mikromik.cpp2
-rw-r--r--src/mame/nokia/mikromik.h10
-rw-r--r--src/mame/nokia/mikromikko2.cpp605
-rw-r--r--src/mame/nokia/mikromikko2.h154
-rw-r--r--src/mame/nokia/mm1kb.cpp44
-rw-r--r--src/mame/nokia/mm1kb.h34
-rw-r--r--src/mame/nokia/nokia_3310.cpp67
-rw-r--r--src/mame/northstar/horizon.cpp8
-rw-r--r--src/mame/novadesitec/novadesitec_fr002.cpp6
-rw-r--r--src/mame/novadesitec/novadesitec_fr004.cpp10
-rw-r--r--src/mame/novadesitec/novadesitec_fr009.cpp4
-rw-r--r--src/mame/novag/accord.cpp10
-rw-r--r--src/mame/novag/cexpert.cpp42
-rw-r--r--src/mame/novag/cforte.cpp26
-rw-r--r--src/mame/novag/cnchess.cpp246
-rw-r--r--src/mame/novag/const.cpp77
-rw-r--r--src/mame/novag/constjr.cpp8
-rw-r--r--src/mame/novag/diablo.cpp113
-rw-r--r--src/mame/novag/diamond.cpp538
-rw-r--r--src/mame/novag/diamond2.cpp431
-rw-r--r--src/mame/novag/emerclp.cpp127
-rw-r--r--src/mame/novag/gomoku.cpp248
-rw-r--r--src/mame/novag/mentor16.cpp8
-rw-r--r--src/mame/novag/micro.cpp11
-rw-r--r--src/mame/novag/micro2.cpp29
-rw-r--r--src/mame/novag/primo.cpp113
-rw-r--r--src/mame/novag/robotadv.cpp15
-rw-r--r--src/mame/novag/sapphire.cpp193
-rw-r--r--src/mame/novag/savant.cpp26
-rw-r--r--src/mame/novag/sdiamond.cpp15
-rw-r--r--src/mame/novag/sexpert.cpp76
-rw-r--r--src/mame/novag/vip.cpp26
-rw-r--r--src/mame/novag/zircon2.cpp10
-rw-r--r--src/mame/novation/basssta.cpp14
-rw-r--r--src/mame/novation/drumsta.cpp6
-rw-r--r--src/mame/oberheim/dmx.cpp1625
-rw-r--r--src/mame/oberheim/ob8.cpp446
-rw-r--r--src/mame/oberheim/xpander.cpp1152
-rw-r--r--src/mame/olivetti/att6300p.cpp1065
-rw-r--r--src/mame/olivetti/att6300p_fdc.cpp74
-rw-r--r--src/mame/olivetti/att6300p_fdc.h29
-rw-r--r--src/mame/olivetti/att6300p_mmu.cpp337
-rw-r--r--src/mame/olivetti/att6300p_mmu.h88
-rw-r--r--src/mame/olivetti/celint2k.cpp375
-rw-r--r--src/mame/olivetti/m20.cpp12
-rw-r--r--src/mame/olivetti/m20_8086.h12
-rw-r--r--src/mame/olivetti/m20_kbd.h12
-rw-r--r--src/mame/olivetti/m24.cpp22
-rw-r--r--src/mame/olivetti/m24_kbd.cpp140
-rw-r--r--src/mame/olivetti/m24_kbd.h29
-rw-r--r--src/mame/olivetti/m24_z8000.h14
-rw-r--r--src/mame/olivetti/olivpc1.cpp10
-rw-r--r--src/mame/olympia/dday.cpp11
-rw-r--r--src/mame/olympia/lbeach.cpp14
-rw-r--r--src/mame/olympia/monzagp.cpp56
-rw-r--r--src/mame/olympia/portrait.cpp18
-rw-r--r--src/mame/olympia/vega.cpp17
-rw-r--r--src/mame/olympiaint/olyboss.cpp10
-rw-r--r--src/mame/olympiaint/olytext.cpp8
-rw-r--r--src/mame/olympiaint/peoplepc.cpp8
-rw-r--r--src/mame/omnibyte/msbc1.cpp4
-rw-r--r--src/mame/omnibyte/ob68k1a.h6
-rw-r--r--src/mame/omori/battlex.cpp69
-rw-r--r--src/mame/omori/carjmbre.cpp112
-rw-r--r--src/mame/omori/popper.cpp18
-rw-r--r--src/mame/omori/spaceg.cpp281
-rw-r--r--src/mame/omori/yakyuken.cpp344
-rw-r--r--src/mame/omron/luna_68k.cpp397
-rw-r--r--src/mame/omron/luna_68k_bm.cpp74
-rw-r--r--src/mame/omron/luna_68k_bm.h39
-rw-r--r--src/mame/omron/luna_68k_cmc.cpp74
-rw-r--r--src/mame/omron/luna_68k_cmc.h40
-rw-r--r--src/mame/omron/luna_68k_gpu.cpp764
-rw-r--r--src/mame/omron/luna_68k_gpu.h136
-rw-r--r--src/mame/omron/luna_68k_ioc.cpp355
-rw-r--r--src/mame/omron/luna_68k_ioc.h94
-rw-r--r--src/mame/omron/luna_68k_video.cpp55
-rw-r--r--src/mame/omron/luna_68k_video.h51
-rw-r--r--src/mame/omron/luna_88k.cpp131
-rw-r--r--src/mame/omron/luna_kbd.cpp2
-rw-r--r--src/mame/omron/luna_kbd.h8
-rw-r--r--src/mame/openuni/hektor.cpp24
-rw-r--r--src/mame/orca/akazukin.cpp13
-rw-r--r--src/mame/orca/espial.cpp345
-rw-r--r--src/mame/orca/funkybee.cpp8
-rw-r--r--src/mame/orca/kyugo.cpp368
-rw-r--r--src/mame/orca/kyugo.h102
-rw-r--r--src/mame/orca/kyugo_v.cpp207
-rw-r--r--src/mame/orca/marineb.cpp14
-rw-r--r--src/mame/orca/orca40c.cpp22
-rw-r--r--src/mame/orca/orca40c.h4
-rw-r--r--src/mame/orca/sub.cpp12
-rw-r--r--src/mame/orca/vastar.cpp18
-rw-r--r--src/mame/orca/vastar_viddev.h4
-rw-r--r--src/mame/orca/zodiack.cpp269
-rw-r--r--src/mame/orla/hk1000.cpp32
-rw-r--r--src/mame/orla/xm200.cpp4
-rw-r--r--src/mame/osborne/osbexec.cpp8
-rw-r--r--src/mame/osborne/osborne1.cpp22
-rw-r--r--src/mame/osborne/vixen.cpp10
-rw-r--r--src/mame/osi/osi.cpp3
-rw-r--r--src/mame/osi/osi.h16
-rw-r--r--src/mame/pacific/mrflea.cpp12
-rw-r--r--src/mame/pacific/thief.cpp16
-rw-r--r--src/mame/pacman/jrpacman.cpp46
-rw-r--r--src/mame/pacman/jumpshot.cpp11
-rw-r--r--src/mame/pacman/pacman.cpp1878
-rw-r--r--src/mame/pacman/pacman.h160
-rw-r--r--src/mame/pacman/pacman_v.cpp306
-rw-r--r--src/mame/pacman/pacplus.cpp11
-rw-r--r--src/mame/pacman/pengo.cpp106
-rw-r--r--src/mame/pacman/schick.cpp20
-rw-r--r--src/mame/paia/fatman.cpp792
-rw-r--r--src/mame/paia/midi2cv8.cpp541
-rw-r--r--src/mame/palm/palm.cpp64
-rw-r--r--src/mame/palm/palmz22.cpp24
-rw-r--r--src/mame/pc/README.md53
-rw-r--r--src/mame/pc/agro.cpp89
-rw-r--r--src/mame/pc/asst128.cpp16
-rw-r--r--src/mame/pc/at.cpp350
-rw-r--r--src/mame/pc/atpci.cpp6
-rw-r--r--src/mame/pc/champ2.cpp225
-rw-r--r--src/mame/pc/compc.cpp12
-rw-r--r--src/mame/pc/conliner.cpp7
-rw-r--r--src/mame/pc/ct486.cpp70
-rw-r--r--src/mame/pc/cuttherope.cpp82
-rw-r--r--src/mame/pc/ec184x.cpp8
-rw-r--r--src/mame/pc/europc.cpp10
-rw-r--r--src/mame/pc/europc_kbd.h10
-rw-r--r--src/mame/pc/filetto.cpp431
-rw-r--r--src/mame/pc/fruitpc.cpp9
-rw-r--r--src/mame/pc/genpc.cpp4
-rw-r--r--src/mame/pc/ibmpc.cpp4
-rw-r--r--src/mame/pc/ibmpcjr.cpp113
-rw-r--r--src/mame/pc/iskr103x.cpp4
-rw-r--r--src/mame/pc/mc1502.cpp8
-rw-r--r--src/mame/pc/mdartstr.cpp718
-rw-r--r--src/mame/pc/megapc.cpp215
-rw-r--r--src/mame/pc/nforcepc.cpp15
-rw-r--r--src/mame/pc/nforcepc.h44
-rw-r--r--src/mame/pc/pangofun.cpp238
-rw-r--r--src/mame/pc/paokaipc.cpp281
-rw-r--r--src/mame/pc/pc.cpp18
-rw-r--r--src/mame/pc/pc_t1t.cpp1529
-rw-r--r--src/mame/pc/pc_t1t.h264
-rw-r--r--src/mame/pc/pcat_dyn.cpp6
-rw-r--r--src/mame/pc/pcat_nit.cpp10
-rw-r--r--src/mame/pc/pcipc.cpp216
-rw-r--r--src/mame/pc/pcipc_sis.cpp58
-rw-r--r--src/mame/pc/pcipc_via.cpp483
-rw-r--r--src/mame/pc/pcxt.cpp625
-rw-r--r--src/mame/pc/play4texash.cpp97
-rw-r--r--src/mame/pc/poisk1.cpp10
-rw-r--r--src/mame/pc/przone.cpp27
-rw-r--r--src/mame/pc/ps2.cpp15
-rw-r--r--src/mame/pc/pulltrig.cpp189
-rw-r--r--src/mame/pc/quakeat.cpp38
-rw-r--r--src/mame/pc/queen.cpp13
-rw-r--r--src/mame/pc/scatsx.cpp197
-rw-r--r--src/mame/pc/seawolfnm.cpp87
-rw-r--r--src/mame/pc/sis630.cpp101
-rw-r--r--src/mame/pc/sshuffle.cpp96
-rw-r--r--src/mame/pc/tandy1t.cpp768
-rw-r--r--src/mame/pc/teradrive.cpp1088
-rw-r--r--src/mame/pc/tetriskr.cpp281
-rw-r--r--src/mame/pc/tosh1000.cpp10
-rw-r--r--src/mame/pc/tosh1000_bram.h4
-rw-r--r--src/mame/pce/ggconnie.cpp189
-rw-r--r--src/mame/pce/paranoia.cpp95
-rw-r--r--src/mame/pce/pcecommn.cpp81
-rw-r--r--src/mame/pce/pcecommn.h48
-rw-r--r--src/mame/pce/tourvis.cpp90
-rw-r--r--src/mame/pce/uapce.cpp136
-rw-r--r--src/mame/philips/cdi.cpp69
-rw-r--r--src/mame/philips/cdi.h16
-rw-r--r--src/mame/philips/cdicdic.cpp373
-rw-r--r--src/mame/philips/cdicdic.h14
-rw-r--r--src/mame/philips/cdislavehle.cpp154
-rw-r--r--src/mame/philips/cdislavehle.h7
-rw-r--r--src/mame/philips/mcd212.cpp1145
-rw-r--r--src/mame/philips/mcd212.h110
-rw-r--r--src/mame/philips/minitel_2_rpic.cpp87
-rw-r--r--src/mame/philips/odyssey2.cpp36
-rw-r--r--src/mame/philips/p2000t.cpp591
-rw-r--r--src/mame/philips/p2000t.h99
-rw-r--r--src/mame/philips/p2000t_m.cpp185
-rw-r--r--src/mame/philips/p2000t_v.cpp61
-rw-r--r--src/mame/philips/patgen.cpp423
-rw-r--r--src/mame/philips/philipsbo.cpp28
-rw-r--r--src/mame/philips/vg5k.cpp10
-rw-r--r--src/mame/philips/yes.cpp17
-rw-r--r--src/mame/phoenix/naughtyb.cpp18
-rw-r--r--src/mame/phoenix/naughtyb.h6
-rw-r--r--src/mame/phoenix/phoenix.cpp703
-rw-r--r--src/mame/phoenix/phoenix.h12
-rw-r--r--src/mame/phoenix/phoenix_a.cpp9
-rw-r--r--src/mame/phoenix/phoenix_a.h4
-rw-r--r--src/mame/phoenix/phoenix_v.cpp23
-rw-r--r--src/mame/phoenix/pleiads.cpp77
-rw-r--r--src/mame/phoenix/pleiads.h12
-rw-r--r--src/mame/phoenix/safarir.cpp8
-rw-r--r--src/mame/pinball/allied.cpp10
-rw-r--r--src/mame/pinball/alvg.cpp67
-rw-r--r--src/mame/pinball/atari_4x4.cpp8
-rw-r--r--src/mame/pinball/atari_s1.cpp24
-rw-r--r--src/mame/pinball/atari_s2.cpp8
-rw-r--r--src/mame/pinball/barni.cpp12
-rw-r--r--src/mame/pinball/bingo.cpp98
-rw-r--r--src/mame/pinball/by17.cpp76
-rw-r--r--src/mame/pinball/by35.cpp128
-rw-r--r--src/mame/pinball/by6803.cpp68
-rw-r--r--src/mame/pinball/by68701.cpp16
-rw-r--r--src/mame/pinball/byvid.cpp22
-rw-r--r--src/mame/pinball/capcom.cpp40
-rw-r--r--src/mame/pinball/criter75.cpp131
-rw-r--r--src/mame/pinball/de_2.cpp64
-rw-r--r--src/mame/pinball/de_3.cpp327
-rw-r--r--src/mame/pinball/decodmd1.h10
-rw-r--r--src/mame/pinball/decodmd2.h8
-rw-r--r--src/mame/pinball/decodmd3.h8
-rw-r--r--src/mame/pinball/decopincpu.cpp2
-rw-r--r--src/mame/pinball/decopincpu.h18
-rw-r--r--src/mame/pinball/flicker.cpp26
-rw-r--r--src/mame/pinball/g627.cpp8
-rw-r--r--src/mame/pinball/genpin.h7
-rw-r--r--src/mame/pinball/gp_1.cpp8
-rw-r--r--src/mame/pinball/gp_2.cpp40
-rw-r--r--src/mame/pinball/gts1.cpp32
-rw-r--r--src/mame/pinball/gts3.cpp57
-rw-r--r--src/mame/pinball/gts3a.cpp192
-rw-r--r--src/mame/pinball/gts80.cpp26
-rw-r--r--src/mame/pinball/gts80a.cpp60
-rw-r--r--src/mame/pinball/gts80b.cpp154
-rw-r--r--src/mame/pinball/hankin.cpp10
-rw-r--r--src/mame/pinball/icecold.cpp18
-rw-r--r--src/mame/pinball/idsa.cpp19
-rw-r--r--src/mame/pinball/inder.cpp26
-rw-r--r--src/mame/pinball/inderp.cpp14
-rw-r--r--src/mame/pinball/jeutel.cpp16
-rw-r--r--src/mame/pinball/joctronic.cpp32
-rw-r--r--src/mame/pinball/jp.cpp38
-rw-r--r--src/mame/pinball/jvh.cpp20
-rw-r--r--src/mame/pinball/kissproto.cpp10
-rw-r--r--src/mame/pinball/lancelot.cpp24
-rw-r--r--src/mame/pinball/lckydraw.cpp8
-rw-r--r--src/mame/pinball/ltd.cpp58
-rw-r--r--src/mame/pinball/macp.cpp59
-rw-r--r--src/mame/pinball/mephistp.cpp54
-rw-r--r--src/mame/pinball/micropin.cpp38
-rw-r--r--src/mame/pinball/missamer.cpp6
-rw-r--r--src/mame/pinball/mrgame.cpp49
-rw-r--r--src/mame/pinball/newcanasta.cpp20
-rw-r--r--src/mame/pinball/nsm.cpp21
-rw-r--r--src/mame/pinball/peyper.cpp50
-rw-r--r--src/mame/pinball/pinsnd88.cpp10
-rw-r--r--src/mame/pinball/pinsnd88.h8
-rw-r--r--src/mame/pinball/play_1.cpp24
-rw-r--r--src/mame/pinball/play_2.cpp45
-rw-r--r--src/mame/pinball/play_3.cpp122
-rw-r--r--src/mame/pinball/recel.cpp55
-rw-r--r--src/mame/pinball/rowamet.cpp12
-rw-r--r--src/mame/pinball/s11.cpp4
-rw-r--r--src/mame/pinball/s11.h14
-rw-r--r--src/mame/pinball/s11a.cpp14
-rw-r--r--src/mame/pinball/s11b.cpp53
-rw-r--r--src/mame/pinball/s11c.cpp6
-rw-r--r--src/mame/pinball/s3.cpp8
-rw-r--r--src/mame/pinball/s4.cpp8
-rw-r--r--src/mame/pinball/s6.cpp8
-rw-r--r--src/mame/pinball/s7.cpp62
-rw-r--r--src/mame/pinball/s8.cpp18
-rw-r--r--src/mame/pinball/s9.cpp8
-rw-r--r--src/mame/pinball/sam.cpp401
-rw-r--r--src/mame/pinball/sleic.cpp20
-rw-r--r--src/mame/pinball/spectra.cpp6
-rw-r--r--src/mame/pinball/spinb.cpp44
-rw-r--r--src/mame/pinball/spirit76.cpp6
-rw-r--r--src/mame/pinball/st_mp100.cpp32
-rw-r--r--src/mame/pinball/st_mp200.cpp75
-rw-r--r--src/mame/pinball/stargame.cpp16
-rw-r--r--src/mame/pinball/supstarf.cpp14
-rw-r--r--src/mame/pinball/taito.cpp100
-rw-r--r--src/mame/pinball/techno.cpp21
-rw-r--r--src/mame/pinball/vd.cpp19
-rw-r--r--src/mame/pinball/whitestar.cpp725
-rw-r--r--src/mame/pinball/wico.cpp8
-rw-r--r--src/mame/pinball/wms_shuffle.cpp20
-rw-r--r--src/mame/pinball/wpc.h4
-rw-r--r--src/mame/pinball/wpc_95.cpp1730
-rw-r--r--src/mame/pinball/wpc_an.cpp46
-rw-r--r--src/mame/pinball/wpc_dcs.cpp70
-rw-r--r--src/mame/pinball/wpc_dmd.h8
-rw-r--r--src/mame/pinball/wpc_dot.cpp38
-rw-r--r--src/mame/pinball/wpc_dot.h10
-rw-r--r--src/mame/pinball/wpc_flip1.cpp18
-rw-r--r--src/mame/pinball/wpc_flip2.cpp106
-rw-r--r--src/mame/pinball/wpc_lamp.h4
-rw-r--r--src/mame/pinball/wpc_out.h4
-rw-r--r--src/mame/pinball/wpc_pic.h4
-rw-r--r--src/mame/pinball/wpc_s.cpp1910
-rw-r--r--src/mame/pinball/wpc_shift.h6
-rw-r--r--src/mame/pinball/wpcsnd.h8
-rw-r--r--src/mame/pinball/zac_1.cpp44
-rw-r--r--src/mame/pinball/zac_2.cpp129
-rw-r--r--src/mame/pinball/zac_proto.cpp6
-rw-r--r--src/mame/pinball/zpinball.cpp14
-rw-r--r--src/mame/pitronics/beta.cpp6
-rw-r--r--src/mame/playmark/drtomy.cpp8
-rw-r--r--src/mame/playmark/playmark.cpp683
-rw-r--r--src/mame/playmark/playmark.h268
-rw-r--r--src/mame/playmark/playmark_v.cpp254
-rw-r--r--src/mame/playmark/powerbal.cpp166
-rw-r--r--src/mame/playmark/sderby.cpp320
-rw-r--r--src/mame/playmark/sslam.cpp4
-rw-r--r--src/mame/playmark/sslam.h16
-rw-r--r--src/mame/poly88/poly88.cpp4
-rw-r--r--src/mame/poly88/poly88.h16
-rw-r--r--src/mame/positron/positron.cpp33
-rw-r--r--src/mame/promat/1945kiii.cpp109
-rw-r--r--src/mame/promat/3x3puzzl.cpp49
-rw-r--r--src/mame/promat/gstream.cpp56
-rw-r--r--src/mame/psikyo/psikyo.cpp495
-rw-r--r--src/mame/psikyo/psikyo.h162
-rw-r--r--src/mame/psikyo/psikyo4.cpp127
-rw-r--r--src/mame/psikyo/psikyo4.h18
-rw-r--r--src/mame/psikyo/psikyo_v.cpp18
-rw-r--r--src/mame/psikyo/psikyosh.cpp229
-rw-r--r--src/mame/psikyo/psikyosh.h75
-rw-r--r--src/mame/psikyo/psikyosh_v.cpp754
-rw-r--r--src/mame/psion/codec.cpp108
-rw-r--r--src/mame/psion/codec.h40
-rw-r--r--src/mame/psion/etna.cpp132
-rw-r--r--src/mame/psion/etna.h44
-rw-r--r--src/mame/psion/mc400.cpp473
-rw-r--r--src/mame/psion/mc600.cpp593
-rw-r--r--src/mame/psion/psion.cpp1010
-rw-r--r--src/mame/psion/psion.h120
-rw-r--r--src/mame/psion/psion3.cpp33
-rw-r--r--src/mame/psion/psion3a.cpp273
-rw-r--r--src/mame/psion/psion5.cpp975
-rw-r--r--src/mame/psion/psion5.h217
-rw-r--r--src/mame/psion/psion5mx.cpp768
-rw-r--r--src/mame/psion/psion7.cpp478
-rw-r--r--src/mame/psion/psion_pack.cpp3
-rw-r--r--src/mame/psion/psion_pack.h10
-rw-r--r--src/mame/psion/psionhc.cpp48
-rw-r--r--src/mame/psion/siena.cpp149
-rw-r--r--src/mame/psion/thera.cpp696
-rw-r--r--src/mame/psion/thera.h130
-rw-r--r--src/mame/psion/windermere.cpp996
-rw-r--r--src/mame/psion/windermere.h263
-rw-r--r--src/mame/psion/workabout.cpp76
-rw-r--r--src/mame/quantel/dpb7000.cpp996
-rw-r--r--src/mame/quantel/harriet.cpp17
-rw-r--r--src/mame/qume/qvt102.cpp6
-rw-r--r--src/mame/qume/qvt103.cpp6
-rw-r--r--src/mame/qume/qvt190.cpp4
-rw-r--r--src/mame/qume/qvt201.cpp4
-rw-r--r--src/mame/qume/qvt70.cpp10
-rw-r--r--src/mame/ramtek/hitme.cpp3
-rw-r--r--src/mame/ramtek/hitme.h10
-rw-r--r--src/mame/ramtek/m79amb.cpp6
-rw-r--r--src/mame/ramtek/ramtek.cpp20
-rw-r--r--src/mame/ramtek/starcrus.cpp520
-rw-r--r--src/mame/ramtek/starcrus.h88
-rw-r--r--src/mame/ramtek/starcrus_v.cpp376
-rw-r--r--src/mame/rare/btoads.cpp21
-rw-r--r--src/mame/rare/kinst.cpp42
-rw-r--r--src/mame/rare/xtheball.cpp29
-rw-r--r--src/mame/rca/microkit.cpp14
-rw-r--r--src/mame/rca/studio2.cpp24
-rw-r--r--src/mame/rca/vip.cpp4
-rw-r--r--src/mame/rca/vip.h8
-rw-r--r--src/mame/recfranco/rf51w14cg.cpp6
-rw-r--r--src/mame/recfranco/rfjailbrk.cpp4
-rw-r--r--src/mame/recfranco/rfslots8085.cpp22
-rw-r--r--src/mame/recfranco/rfslotsmcs48.cpp18
-rw-r--r--src/mame/recfranco/rfslotspcpent.cpp4
-rw-r--r--src/mame/regnecentralen/rc702.cpp8
-rw-r--r--src/mame/regnecentralen/rc759.cpp8
-rw-r--r--src/mame/regnecentralen/rc759_kbd.h6
-rw-r--r--src/mame/rm/rm380z.cpp120
-rw-r--r--src/mame/rm/rm380z.h54
-rw-r--r--src/mame/rm/rm380z_m.cpp28
-rw-r--r--src/mame/rm/rm380z_v.cpp38
-rw-r--r--src/mame/rm/rm480z.cpp372
-rw-r--r--src/mame/rm/rm480z.h153
-rw-r--r--src/mame/rm/rm480z_m.cpp249
-rw-r--r--src/mame/rm/rm480z_v.cpp260
-rw-r--r--src/mame/rm/rm_mq2.cpp256
-rw-r--r--src/mame/rm/rm_mq2.h53
-rw-r--r--src/mame/rm/rmnimbus.cpp6
-rw-r--r--src/mame/rm/rmnimbus.h18
-rw-r--r--src/mame/rm/rmnkbd.h4
-rw-r--r--src/mame/robotron/a5105.cpp10
-rw-r--r--src/mame/robotron/a51xx.cpp12
-rw-r--r--src/mame/robotron/a7150.cpp14
-rw-r--r--src/mame/robotron/k1003.cpp6
-rw-r--r--src/mame/robotron/k8915.cpp8
-rw-r--r--src/mame/robotron/rt1715.cpp69
-rw-r--r--src/mame/robotron/z1013.cpp14
-rw-r--r--src/mame/robotron/z9001.cpp8
-rw-r--r--src/mame/rockwell/aim65.cpp2
-rw-r--r--src/mame/rockwell/aim65.h4
-rw-r--r--src/mame/rockwell/aim65_40.cpp2
-rw-r--r--src/mame/roland/alphajuno.cpp29
-rw-r--r--src/mame/roland/boss_se70.cpp4
-rw-r--r--src/mame/roland/boss_sx700.cpp8
-rw-r--r--src/mame/roland/bu3905.h2
-rw-r--r--src/mame/roland/juno106.cpp12
-rw-r--r--src/mame/roland/juno6.cpp6
-rw-r--r--src/mame/roland/jx8p_synth.cpp4
-rw-r--r--src/mame/roland/jx8p_synth.h12
-rw-r--r--src/mame/roland/mb62h195.h2
-rw-r--r--src/mame/roland/mb63h114.cpp59
-rw-r--r--src/mame/roland/mb63h114.h26
-rw-r--r--src/mame/roland/mb63h149.h4
-rw-r--r--src/mame/roland/mb87013.h4
-rw-r--r--src/mame/roland/pg200.h6
-rw-r--r--src/mame/roland/roland_cm32p.cpp179
-rw-r--r--src/mame/roland/roland_d10.cpp12
-rw-r--r--src/mame/roland/roland_d50.cpp128
-rw-r--r--src/mame/roland/roland_d70.cpp155
-rw-r--r--src/mame/roland/roland_jd800.cpp4
-rw-r--r--src/mame/roland/roland_jv80.cpp10
-rw-r--r--src/mame/roland/roland_jx3p.cpp26
-rw-r--r--src/mame/roland/roland_jx8p.cpp12
-rw-r--r--src/mame/roland/roland_mc50.cpp12
-rw-r--r--src/mame/roland/roland_mt32.cpp28
-rw-r--r--src/mame/roland/roland_mt80s.cpp4
-rw-r--r--src/mame/roland/roland_pg1000.cpp508
-rw-r--r--src/mame/roland/roland_pr100.cpp6
-rw-r--r--src/mame/roland/roland_r8.cpp84
-rw-r--r--src/mame/roland/roland_ra30.cpp4
-rw-r--r--src/mame/roland/roland_s10.cpp22
-rw-r--r--src/mame/roland/roland_s50.cpp103
-rw-r--r--src/mame/roland/roland_sc55.cpp2
-rw-r--r--src/mame/roland/roland_sc55mk2.cpp2
-rw-r--r--src/mame/roland/roland_sc88.cpp4
-rw-r--r--src/mame/roland/roland_tb303.cpp2
-rw-r--r--src/mame/roland/roland_tnsc1.cpp2
-rw-r--r--src/mame/roland/roland_tnsc2.cpp2
-rw-r--r--src/mame/roland/roland_tr505.cpp2
-rw-r--r--src/mame/roland/roland_tr606.cpp4
-rw-r--r--src/mame/roland/roland_tr707.cpp1751
-rw-r--r--src/mame/roland/roland_tr808.cpp4
-rw-r--r--src/mame/roland/roland_tr909.cpp6
-rw-r--r--src/mame/roland/roland_u20.cpp13
-rw-r--r--src/mame/roland/sa16.h4
-rw-r--r--src/mame/rolm/r9751.cpp22
-rw-r--r--src/mame/sage/sage2.h6
-rw-r--r--src/mame/saitek/blitz.cpp37
-rw-r--r--src/mame/saitek/chessac.cpp4
-rw-r--r--src/mame/saitek/chesstrv.cpp12
-rw-r--r--src/mame/saitek/companion.cpp4
-rw-r--r--src/mame/saitek/companion2.cpp32
-rw-r--r--src/mame/saitek/corona.cpp20
-rw-r--r--src/mame/saitek/cp2000.cpp53
-rw-r--r--src/mame/saitek/delta1.cpp11
-rw-r--r--src/mame/saitek/ecbackg.cpp554
-rw-r--r--src/mame/saitek/edames.cpp12
-rw-r--r--src/mame/saitek/electrio.cpp443
-rw-r--r--src/mame/saitek/exechess.cpp10
-rw-r--r--src/mame/saitek/gk2000.cpp123
-rw-r--r--src/mame/saitek/intchess.cpp59
-rw-r--r--src/mame/saitek/leonardo.cpp49
-rw-r--r--src/mame/saitek/mark5.cpp16
-rw-r--r--src/mame/saitek/minichess.cpp26
-rw-r--r--src/mame/saitek/prisma.cpp18
-rw-r--r--src/mame/saitek/prschess.cpp5
-rw-r--r--src/mame/saitek/renaissance.cpp51
-rw-r--r--src/mame/saitek/risc2500.cpp241
-rw-r--r--src/mame/saitek/sbackgc.cpp725
-rw-r--r--src/mame/saitek/schess.cpp4
-rw-r--r--src/mame/saitek/simultano.cpp14
-rw-r--r--src/mame/saitek/ssystem3.cpp28
-rw-r--r--src/mame/saitek/stratos.cpp46
-rw-r--r--src/mame/saitek/stratos.h8
-rw-r--r--src/mame/saitek/superstar.cpp23
-rw-r--r--src/mame/saitek/tatrain.cpp6
-rw-r--r--src/mame/saitek/tschess.cpp199
-rw-r--r--src/mame/saitek/turbo16k.cpp32
-rw-r--r--src/mame/saitek/turbos24k.cpp14
-rw-r--r--src/mame/samcoupe/samcoupe.cpp14
-rw-r--r--src/mame/samsung/dvd-n5xx.cpp4
-rw-r--r--src/mame/samsung/spc1000.cpp14
-rw-r--r--src/mame/samsung/spc1500.cpp8
-rw-r--r--src/mame/sanritsu/appoooh.cpp61
-rw-r--r--src/mame/sanritsu/bankp.cpp81
-rw-r--r--src/mame/sanritsu/chinsan.cpp40
-rw-r--r--src/mame/sanritsu/drmicro.cpp29
-rw-r--r--src/mame/sanritsu/jantotsu.cpp35
-rw-r--r--src/mame/sanritsu/jongkyo.cpp (renamed from src/mame/kiwako/jongkyo.cpp)37
-rw-r--r--src/mame/sanritsu/koikoi.cpp477
-rw-r--r--src/mame/sanritsu/mermaid.h18
-rw-r--r--src/mame/sanritsu/mermaid_v.cpp1
-rw-r--r--src/mame/sanritsu/mjkjidai.cpp115
-rw-r--r--src/mame/sanritsu/mrjong.cpp (renamed from src/mame/kiwako/mrjong.cpp)39
-rw-r--r--src/mame/sanritsu/ron.cpp56
-rw-r--r--src/mame/sanritsu/sprcros2.cpp700
-rw-r--r--src/mame/sanyo/mbc55x.cpp3
-rw-r--r--src/mame/sanyo/mbc55x.h14
-rw-r--r--src/mame/sanyo/mbc55x_kbd.h10
-rw-r--r--src/mame/sanyo/phc20.cpp6
-rw-r--r--src/mame/sanyo/phc25.cpp406
-rw-r--r--src/mame/saturn/st17xx.cpp27
-rw-r--r--src/mame/sealy/sealy.cpp148
-rw-r--r--src/mame/sealy/sealy_8031.cpp276
-rw-r--r--src/mame/sealy/sealy_eagle.cpp2
-rw-r--r--src/mame/sealy/sealy_fr.cpp2
-rw-r--r--src/mame/sealy/sealy_m16c.cpp228
-rw-r--r--src/mame/sealy/sealy_z80.cpp306
-rw-r--r--src/mame/sega/315-5838_317-0229_comp.h10
-rw-r--r--src/mame/sega/315-5881_crypt.cpp14
-rw-r--r--src/mame/sega/315-5881_crypt.h8
-rw-r--r--src/mame/sega/315-6154.cpp81
-rw-r--r--src/mame/sega/315-6154.h14
-rw-r--r--src/mame/sega/315_5195.h15
-rw-r--r--src/mame/sega/315_5296.h4
-rw-r--r--src/mame/sega/315_5338a.cpp2
-rw-r--r--src/mame/sega/315_5338a.h2
-rw-r--r--src/mame/sega/315_5649.cpp4
-rw-r--r--src/mame/sega/315_5649.h4
-rw-r--r--src/mame/sega/9h0-0008_card.cpp165
-rw-r--r--src/mame/sega/9h0-0008_card.h64
-rw-r--r--src/mame/sega/9h0-0008_card_reader.cpp150
-rw-r--r--src/mame/sega/9h0-0008_card_reader.h91
-rw-r--r--src/mame/sega/9h0-0008_iox.cpp52
-rw-r--r--src/mame/sega/9h0-0008_iox.h63
-rw-r--r--src/mame/sega/angelkds.cpp16
-rw-r--r--src/mame/sega/anyworks.cpp2
-rw-r--r--src/mame/sega/awboard.h6
-rw-r--r--src/mame/sega/bingoc.cpp18
-rw-r--r--src/mame/sega/bingoct.cpp2
-rw-r--r--src/mame/sega/bingoct.h20
-rw-r--r--src/mame/sega/blockade.cpp22
-rw-r--r--src/mame/sega/calcune.cpp82
-rw-r--r--src/mame/sega/chihiro.cpp47
-rw-r--r--src/mame/sega/coolridr.cpp40
-rw-r--r--src/mame/sega/dc-ctrl.h2
-rw-r--r--src/mame/sega/dc.cpp3
-rw-r--r--src/mame/sega/dc.h12
-rw-r--r--src/mame/sega/dc_atomiswave.h6
-rw-r--r--src/mame/sega/dc_g2if.h10
-rw-r--r--src/mame/sega/dcchk.cpp327
-rw-r--r--src/mame/sega/dccons.cpp52
-rw-r--r--src/mame/sega/dccons.h14
-rw-r--r--src/mame/sega/deniam.cpp18
-rw-r--r--src/mame/sega/digamart.cpp4
-rw-r--r--src/mame/sega/dotrikun.cpp37
-rw-r--r--src/mame/sega/dsb2.cpp270
-rw-r--r--src/mame/sega/dsb2.h82
-rw-r--r--src/mame/sega/dsbz80.cpp21
-rw-r--r--src/mame/sega/dsbz80.h14
-rw-r--r--src/mame/sega/eshockey.cpp6
-rw-r--r--src/mame/sega/fd1089.cpp2
-rw-r--r--src/mame/sega/fd1089.h6
-rw-r--r--src/mame/sega/fd1094.cpp2
-rw-r--r--src/mame/sega/fd1094.h8
-rw-r--r--src/mame/sega/flashbeats.cpp35
-rw-r--r--src/mame/sega/fwheel.cpp14
-rw-r--r--src/mame/sega/gpworld.cpp13
-rw-r--r--src/mame/sega/gunsense.h8
-rw-r--r--src/mame/sega/hikaru.cpp944
-rw-r--r--src/mame/sega/hshavoc.cpp31
-rw-r--r--src/mame/sega/jvs13551.cpp4
-rw-r--r--src/mame/sega/jvs13551.h10
-rw-r--r--src/mame/sega/kopunch.cpp12
-rw-r--r--src/mame/sega/lindbergh.cpp12
-rw-r--r--src/mame/sega/m1comm.h12
-rw-r--r--src/mame/sega/m2comm.h6
-rw-r--r--src/mame/sega/m3comm.cpp4
-rw-r--r--src/mame/sega/m3comm.h10
-rw-r--r--src/mame/sega/m50dass.cpp52
-rw-r--r--src/mame/sega/m50dass.h30
-rw-r--r--src/mame/sega/magistr16.cpp481
-rw-r--r--src/mame/sega/maple-dc.h8
-rw-r--r--src/mame/sega/mapledev.h2
-rw-r--r--src/mame/sega/mdconsole.cpp118
-rw-r--r--src/mame/sega/mdconsole.h20
-rw-r--r--src/mame/sega/mdioport.cpp524
-rw-r--r--src/mame/sega/mdioport.h209
-rw-r--r--src/mame/sega/megacd.cpp130
-rw-r--r--src/mame/sega/megacd.h17
-rw-r--r--src/mame/sega/megadriv.cpp155
-rw-r--r--src/mame/sega/megadriv.h31
-rw-r--r--src/mame/sega/megadriv_acbl.cpp907
-rw-r--r--src/mame/sega/megadriv_acbl.h92
-rw-r--r--src/mame/sega/megadriv_firecore.cpp509
-rw-r--r--src/mame/sega/megadriv_rad.cpp515
-rw-r--r--src/mame/sega/megadriv_sunmix.cpp4
-rw-r--r--src/mame/sega/megadriv_sunplus_hybrid.cpp172
-rw-r--r--src/mame/sega/megadriv_unksoc.cpp511
-rw-r--r--src/mame/sega/megadriv_vt_hybrid.cpp166
-rw-r--r--src/mame/sega/megadriv_ybox.cpp822
-rw-r--r--src/mame/sega/megaplay.cpp14
-rw-r--r--src/mame/sega/megatech.cpp12
-rw-r--r--src/mame/sega/mie.cpp16
-rw-r--r--src/mame/sega/mie.h22
-rw-r--r--src/mame/sega/model1.cpp17
-rw-r--r--src/mame/sega/model1.h24
-rw-r--r--src/mame/sega/model1_m.cpp4
-rw-r--r--src/mame/sega/model1_v.cpp5
-rw-r--r--src/mame/sega/model1io.h10
-rw-r--r--src/mame/sega/model1io2.cpp2
-rw-r--r--src/mame/sega/model1io2.h14
-rw-r--r--src/mame/sega/model2.cpp1222
-rw-r--r--src/mame/sega/model2.h529
-rw-r--r--src/mame/sega/model2_m.cpp53
-rw-r--r--src/mame/sega/model2_v.cpp1756
-rw-r--r--src/mame/sega/model2rd.ipp424
-rw-r--r--src/mame/sega/model3.cpp466
-rw-r--r--src/mame/sega/model3.h39
-rw-r--r--src/mame/sega/model3_v.cpp39
-rw-r--r--src/mame/sega/monacogp.cpp10
-rw-r--r--src/mame/sega/naomi.cpp112
-rw-r--r--src/mame/sega/naomi.h12
-rw-r--r--src/mame/sega/naomibd.h6
-rw-r--r--src/mame/sega/naomig1.h6
-rw-r--r--src/mame/sega/naomigd.cpp2
-rw-r--r--src/mame/sega/naomigd.h34
-rw-r--r--src/mame/sega/naomim1.h6
-rw-r--r--src/mame/sega/naomim2.h6
-rw-r--r--src/mame/sega/naomim4.h6
-rw-r--r--src/mame/sega/naomirom.h4
-rw-r--r--src/mame/sega/powervr2.cpp154
-rw-r--r--src/mame/sega/powervr2.h24
-rw-r--r--src/mame/sega/puckpkmn.cpp653
-rw-r--r--src/mame/sega/s32comm.h6
-rw-r--r--src/mame/sega/saturn.cpp81
-rw-r--r--src/mame/sega/saturn.h235
-rw-r--r--src/mame/sega/saturn_cd_hle.cpp2920
-rw-r--r--src/mame/sega/saturn_cd_hle.h275
-rw-r--r--src/mame/sega/saturn_cdb.h8
-rw-r--r--src/mame/sega/saturn_m.cpp26
-rw-r--r--src/mame/sega/saturn_scu.cpp803
-rw-r--r--src/mame/sega/saturn_scu.h144
-rw-r--r--src/mame/sega/saturn_v.cpp4266
-rw-r--r--src/mame/sega/sderby2.cpp14
-rw-r--r--src/mame/sega/sega16sp.h2
-rw-r--r--src/mame/sega/sega_beena.cpp196
-rw-r--r--src/mame/sega/sega_ferie.cpp699
-rw-r--r--src/mame/sega/sega_sawatte.cpp8
-rw-r--r--src/mame/sega/segaai.cpp8
-rw-r--r--src/mame/sega/segaatom.cpp15
-rw-r--r--src/mame/sega/segabb.h10
-rw-r--r--src/mame/sega/segabill.cpp2
-rw-r--r--src/mame/sega/segabill.h14
-rw-r--r--src/mame/sega/segac2.cpp212
-rw-r--r--src/mame/sega/segacoin.cpp10
-rw-r--r--src/mame/sega/segae.cpp22
-rw-r--r--src/mame/sega/segafruit.cpp7
-rw-r--r--src/mame/sega/segag80.h4
-rw-r--r--src/mame/sega/segag80r.cpp378
-rw-r--r--src/mame/sega/segag80r.h60
-rw-r--r--src/mame/sega/segag80r_a.cpp400
-rw-r--r--src/mame/sega/segag80r_a.h68
-rw-r--r--src/mame/sega/segag80v.cpp18
-rw-r--r--src/mame/sega/segag80v.h14
-rw-r--r--src/mame/sega/segahang.cpp417
-rw-r--r--src/mame/sega/segahang.h146
-rw-r--r--src/mame/sega/segahang_v.cpp128
-rw-r--r--src/mame/sega/segaic16.cpp2
-rw-r--r--src/mame/sega/segaic16.h4
-rw-r--r--src/mame/sega/segaic16_m.h12
-rw-r--r--src/mame/sega/segaic16_road.h4
-rw-r--r--src/mame/sega/segaic24.cpp61
-rw-r--r--src/mame/sega/segaic24.h12
-rw-r--r--src/mame/sega/segajw.cpp26
-rw-r--r--src/mame/sega/segald.cpp13
-rw-r--r--src/mame/sega/segaorun.cpp387
-rw-r--r--src/mame/sega/segaorun.h179
-rw-r--r--src/mame/sega/segaorun_v.cpp170
-rw-r--r--src/mame/sega/segapico.cpp45
-rw-r--r--src/mame/sega/segapm.cpp4
-rw-r--r--src/mame/sega/segas16a.cpp545
-rw-r--r--src/mame/sega/segas16a.h208
-rw-r--r--src/mame/sega/segas16a_v.cpp91
-rw-r--r--src/mame/sega/segas16b.cpp1094
-rw-r--r--src/mame/sega/segas16b.h69
-rw-r--r--src/mame/sega/segas16b_isgsm.cpp12
-rw-r--r--src/mame/sega/segas16b_v.cpp54
-rw-r--r--src/mame/sega/segas18.cpp31
-rw-r--r--src/mame/sega/segas18.h20
-rw-r--r--src/mame/sega/segas18_astormbl.cpp68
-rw-r--r--src/mame/sega/segas18_v.cpp81
-rw-r--r--src/mame/sega/segas24.cpp370
-rw-r--r--src/mame/sega/segas24.h204
-rw-r--r--src/mame/sega/segas24_v.cpp61
-rw-r--r--src/mame/sega/segas32.cpp933
-rw-r--r--src/mame/sega/segas32.h139
-rw-r--r--src/mame/sega/segas32_m.cpp133
-rw-r--r--src/mame/sega/segas32_v.cpp584
-rw-r--r--src/mame/sega/segashiobd.cpp2
-rw-r--r--src/mame/sega/segashiobd.h10
-rw-r--r--src/mame/sega/segasm1.cpp52
-rw-r--r--src/mame/sega/segasp.cpp284
-rw-r--r--src/mame/sega/segaspeech.h8
-rw-r--r--src/mame/sega/segattl.cpp54
-rw-r--r--src/mame/sega/segaufo.cpp86
-rw-r--r--src/mame/sega/segaufoh8.cpp42
-rw-r--r--src/mame/sega/segausb.cpp8
-rw-r--r--src/mame/sega/segausb.h16
-rw-r--r--src/mame/sega/segaxbd.cpp250
-rw-r--r--src/mame/sega/segaxbd.h50
-rw-r--r--src/mame/sega/segaxbd_v.cpp105
-rw-r--r--src/mame/sega/segaybd.cpp523
-rw-r--r--src/mame/sega/segaybd.h172
-rw-r--r--src/mame/sega/segaybd_v.cpp94
-rw-r--r--src/mame/sega/sg1000.cpp134
-rw-r--r--src/mame/sega/sg1000a.cpp20
-rw-r--r--src/mame/sega/shtzone.cpp18
-rw-r--r--src/mame/sega/smpc.cpp (renamed from src/devices/machine/smpc.cpp)67
-rw-r--r--src/mame/sega/smpc.h (renamed from src/devices/machine/smpc.h)38
-rw-r--r--src/mame/sega/sms.cpp9
-rw-r--r--src/mame/sega/sms.h41
-rw-r--r--src/mame/sega/sms_bootleg.cpp21
-rw-r--r--src/mame/sega/speedbsk.cpp18
-rw-r--r--src/mame/sega/stactics.cpp20
-rw-r--r--src/mame/sega/stv.cpp199
-rw-r--r--src/mame/sega/stv.h35
-rw-r--r--src/mame/sega/stvdev.cpp9
-rw-r--r--src/mame/sega/suprloco.cpp17
-rw-r--r--src/mame/sega/svmu.cpp8
-rw-r--r--src/mame/sega/system1.cpp1999
-rw-r--r--src/mame/sega/system1.h199
-rw-r--r--src/mame/sega/system16.cpp217
-rw-r--r--src/mame/sega/system16.h171
-rw-r--r--src/mame/sega/system16_v.cpp235
-rw-r--r--src/mame/sega/system1_v.cpp116
-rw-r--r--src/mame/sega/timetrv.cpp10
-rw-r--r--src/mame/sega/triforce.cpp185
-rw-r--r--src/mame/sega/turbo.cpp10
-rw-r--r--src/mame/sega/turbo.h26
-rw-r--r--src/mame/sega/turbo_a.cpp70
-rw-r--r--src/mame/sega/tvochken_card.cpp157
-rw-r--r--src/mame/sega/tvochken_card.h54
-rw-r--r--src/mame/sega/unkhockey.cpp4
-rw-r--r--src/mame/sega/vicdual-97269pb.h6
-rw-r--r--src/mame/sega/vicdual-97271p.h6
-rw-r--r--src/mame/sega/vicdual.cpp1877
-rw-r--r--src/mame/sega/vicdual.h127
-rw-r--r--src/mame/sega/vicdual_a.h4
-rw-r--r--src/mame/sega/winclub.cpp15
-rw-r--r--src/mame/sega/y2.cpp29
-rw-r--r--src/mame/sega/zaxxon.cpp161
-rw-r--r--src/mame/sega/zaxxon.h87
-rw-r--r--src/mame/sega/zaxxon_v.cpp10
-rw-r--r--src/mame/seibu/airraid.cpp30
-rw-r--r--src/mame/seibu/airraid_dev.h6
-rw-r--r--src/mame/seibu/banprestoms.cpp183
-rw-r--r--src/mame/seibu/banprestomsz80.cpp424
-rw-r--r--src/mame/seibu/bloodbro.cpp87
-rw-r--r--src/mame/seibu/bloodbro_ms.cpp425
-rw-r--r--src/mame/seibu/cabal.cpp39
-rw-r--r--src/mame/seibu/cabal_ms.cpp176
-rw-r--r--src/mame/seibu/darkmist.cpp8
-rw-r--r--src/mame/seibu/dcon.cpp12
-rw-r--r--src/mame/seibu/deadang.cpp73
-rw-r--r--src/mame/seibu/dynduke.cpp150
-rw-r--r--src/mame/seibu/feversoc.cpp172
-rw-r--r--src/mame/seibu/goal92.cpp12
-rw-r--r--src/mame/seibu/goodejan.cpp68
-rw-r--r--src/mame/seibu/kncljoe.cpp112
-rw-r--r--src/mame/seibu/legionna.cpp52
-rw-r--r--src/mame/seibu/legionna.h18
-rw-r--r--src/mame/seibu/metlfrzr.cpp10
-rw-r--r--src/mame/seibu/mustache.cpp152
-rw-r--r--src/mame/seibu/panicr.cpp4
-rw-r--r--src/mame/seibu/r2crypt.cpp41
-rw-r--r--src/mame/seibu/r2crypt.h10
-rw-r--r--src/mame/seibu/r2dx_v33.cpp457
-rw-r--r--src/mame/seibu/raiden.cpp45
-rw-r--r--src/mame/seibu/raiden2.cpp1075
-rw-r--r--src/mame/seibu/raiden2.h180
-rw-r--r--src/mame/seibu/raiden2_v.cpp296
-rw-r--r--src/mame/seibu/raiden_ms.cpp12
-rw-r--r--src/mame/seibu/sei021x_sei0220_spr.h4
-rw-r--r--src/mame/seibu/sei25x_rise1x_spr.cpp212
-rw-r--r--src/mame/seibu/sei25x_rise1x_spr.h62
-rw-r--r--src/mame/seibu/sei80bu.cpp91
-rw-r--r--src/mame/seibu/sei80bu.h31
-rw-r--r--src/mame/seibu/seibu_crtc.h6
-rw-r--r--src/mame/seibu/seibu_helper.cpp44
-rw-r--r--src/mame/seibu/seibu_helper.h13
-rw-r--r--src/mame/seibu/seibucats.cpp147
-rw-r--r--src/mame/seibu/seibucop.h2
-rw-r--r--src/mame/seibu/seibucop_cmd.ipp2
-rw-r--r--src/mame/seibu/seibuspi.cpp821
-rw-r--r--src/mame/seibu/seibuspi.h367
-rw-r--r--src/mame/seibu/seibuspi_m.cpp69
-rw-r--r--src/mame/seibu/seibuspi_m.h9
-rw-r--r--src/mame/seibu/seibuspi_v.cpp418
-rw-r--r--src/mame/seibu/seicopbl.h12
-rw-r--r--src/mame/seibu/sengokmj.cpp13
-rw-r--r--src/mame/seibu/stfight.cpp150
-rw-r--r--src/mame/seibu/stfight_dev.cpp110
-rw-r--r--src/mame/seibu/stfight_dev.h9
-rw-r--r--src/mame/seibu/t5182.h12
-rw-r--r--src/mame/seibu/toki.cpp35
-rw-r--r--src/mame/seibu/toki_ms.cpp118
-rw-r--r--src/mame/seibu/wiz.cpp24
-rw-r--r--src/mame/sequential/prophet5.cpp3445
-rw-r--r--src/mame/sequential/prophet600.cpp126
-rw-r--r--src/mame/sequential/sixtrak.cpp1156
-rw-r--r--src/mame/seta/albazc.cpp8
-rw-r--r--src/mame/seta/albazg.cpp (renamed from src/mame/alba/albazg.cpp)41
-rw-r--r--src/mame/seta/champbwl.cpp250
-rw-r--r--src/mame/seta/downtown.cpp388
-rw-r--r--src/mame/seta/hanaawas.cpp149
-rw-r--r--src/mame/seta/hanadojo.cpp451
-rw-r--r--src/mame/seta/iox_hle.cpp126
-rw-r--r--src/mame/seta/iox_hle.h41
-rw-r--r--src/mame/seta/jclub2.cpp536
-rw-r--r--src/mame/seta/kiwame.cpp117
-rw-r--r--src/mame/seta/macs.cpp206
-rw-r--r--src/mame/seta/rmhaihai.cpp (renamed from src/mame/alba/rmhaihai.cpp)212
-rw-r--r--src/mame/seta/seta.cpp465
-rw-r--r--src/mame/seta/seta2.cpp1343
-rw-r--r--src/mame/seta/seta2.h262
-rw-r--r--src/mame/seta/seta2_v.cpp958
-rw-r--r--src/mame/seta/simple_st0016.cpp305
-rw-r--r--src/mame/seta/speedatk.cpp372
-rw-r--r--src/mame/seta/speedatk.h68
-rw-r--r--src/mame/seta/speedatk_v.cpp102
-rw-r--r--src/mame/seta/speglsht.cpp200
-rw-r--r--src/mame/seta/srmp2.cpp16
-rw-r--r--src/mame/seta/srmp5.cpp307
-rw-r--r--src/mame/seta/srmp6.cpp83
-rw-r--r--src/mame/seta/ssv.cpp251
-rw-r--r--src/mame/seta/ssv.h65
-rw-r--r--src/mame/seta/st0016.cpp210
-rw-r--r--src/mame/seta/st0016.h67
-rw-r--r--src/mame/seta/st0020.cpp451
-rw-r--r--src/mame/seta/st0020.h92
-rw-r--r--src/mame/seta/thedealr.cpp10
-rw-r--r--src/mame/seta/vsmjtria.cpp (renamed from src/mame/alba/vsmjtria.cpp)143
-rw-r--r--src/mame/seta/x1_012.h4
-rw-r--r--src/mame/sfrj/galaxy.cpp10
-rw-r--r--src/mame/sfrj/galeb.cpp6
-rw-r--r--src/mame/sfrj/hr84.cpp6
-rw-r--r--src/mame/sfrj/idpart_video.cpp18
-rw-r--r--src/mame/sfrj/idpartner.cpp17
-rw-r--r--src/mame/sfrj/lola8a.cpp18
-rw-r--r--src/mame/sfrj/orao.cpp6
-rw-r--r--src/mame/sfrj/pecom.cpp16
-rw-r--r--src/mame/sfrj/pmp11.cpp116
-rw-r--r--src/mame/sfrj/tim011.cpp56
-rw-r--r--src/mame/sfrj/tim011_kbd.cpp327
-rw-r--r--src/mame/sfrj/tim011_kbd.h72
-rw-r--r--src/mame/sfrj/tim100.cpp13
-rw-r--r--src/mame/sgi/crime.h8
-rw-r--r--src/mame/sgi/crimson.cpp4
-rw-r--r--src/mame/sgi/ctl1.h6
-rw-r--r--src/mame/sgi/gl1.cpp380
-rw-r--r--src/mame/sgi/gl1.h13
-rw-r--r--src/mame/sgi/gm1.cpp138
-rw-r--r--src/mame/sgi/gm1.h51
-rw-r--r--src/mame/sgi/hal2.cpp7
-rw-r--r--src/mame/sgi/hal2.h6
-rw-r--r--src/mame/sgi/hpc1.h8
-rw-r--r--src/mame/sgi/hpc3.h6
-rw-r--r--src/mame/sgi/indy_indigo2.cpp68
-rw-r--r--src/mame/sgi/int2.h8
-rw-r--r--src/mame/sgi/ioc2.cpp6
-rw-r--r--src/mame/sgi/ioc2.h16
-rw-r--r--src/mame/sgi/ip12.cpp27
-rw-r--r--src/mame/sgi/ip2.cpp829
-rw-r--r--src/mame/sgi/ip2.h13
-rw-r--r--src/mame/sgi/ip20.cpp23
-rw-r--r--src/mame/sgi/ip4.cpp196
-rw-r--r--src/mame/sgi/ip4.h35
-rw-r--r--src/mame/sgi/ip6.cpp23
-rw-r--r--src/mame/sgi/iris.cpp210
-rw-r--r--src/mame/sgi/iris3130.cpp723
-rw-r--r--src/mame/sgi/iris_kbd.cpp299
-rw-r--r--src/mame/sgi/iris_kbd.h13
-rw-r--r--src/mame/sgi/iris_power.cpp2
-rw-r--r--src/mame/sgi/kbd.cpp5
-rw-r--r--src/mame/sgi/kbd.h21
-rw-r--r--src/mame/sgi/light.h8
-rw-r--r--src/mame/sgi/mace.h8
-rw-r--r--src/mame/sgi/mc.h6
-rw-r--r--src/mame/sgi/o2.cpp2
-rw-r--r--src/mame/sgi/octane.cpp2
-rw-r--r--src/mame/sgi/pic1.h8
-rw-r--r--src/mame/sgi/pm2.cpp391
-rw-r--r--src/mame/sgi/pm2.h13
-rw-r--r--src/mame/sgi/pm2_mmu.cpp322
-rw-r--r--src/mame/sgi/pm2_mmu.h74
-rw-r--r--src/mame/sgi/sgi_ge5.h15
-rw-r--r--src/mame/sgi/sgi_gr1.h13
-rw-r--r--src/mame/sgi/sgi_re2.h4
-rw-r--r--src/mame/sgi/sgi_xmap2.h4
-rw-r--r--src/mame/sgi/tt.cpp48
-rw-r--r--src/mame/sgi/vc1.h4
-rw-r--r--src/mame/sgi/vino.h6
-rw-r--r--src/mame/shared/alpha68k_palette.h4
-rw-r--r--src/mame/shared/alpha68k_spr.cpp193
-rw-r--r--src/mame/shared/alpha68k_spr.h54
-rw-r--r--src/mame/shared/awpvid.cpp42
-rw-r--r--src/mame/shared/awpvid.h17
-rw-r--r--src/mame/shared/ballysound.cpp59
-rw-r--r--src/mame/shared/ballysound.h38
-rw-r--r--src/mame/shared/cage.cpp134
-rw-r--r--src/mame/shared/cage.h24
-rw-r--r--src/mame/shared/cclimber_a.h4
-rw-r--r--src/mame/shared/dcs.cpp59
-rw-r--r--src/mame/shared/dcs.h7
-rw-r--r--src/mame/shared/decobsmt.cpp6
-rw-r--r--src/mame/shared/decospr.h4
-rw-r--r--src/mame/shared/efo_sound3.cpp115
-rw-r--r--src/mame/shared/efo_sound3.h42
-rw-r--r--src/mame/shared/efo_zsu.h12
-rw-r--r--src/mame/shared/exidysound.cpp308
-rw-r--r--src/mame/shared/exidysound.h59
-rw-r--r--src/mame/shared/fruitsamples.h4
-rw-r--r--src/mame/shared/gottlieb_a.cpp22
-rw-r--r--src/mame/shared/gottlieb_a.h77
-rw-r--r--src/mame/shared/inder_vid.h10
-rw-r--r--src/mame/shared/isbc_215g.h12
-rw-r--r--src/mame/shared/mahjong.cpp554
-rw-r--r--src/mame/shared/mahjong.h89
-rw-r--r--src/mame/shared/mega32x.cpp301
-rw-r--r--src/mame/shared/mega32x.h37
-rw-r--r--src/mame/shared/megacdcd.cpp120
-rw-r--r--src/mame/shared/megacdcd.h12
-rw-r--r--src/mame/shared/mitcrt.h2
-rw-r--r--src/mame/shared/ms7004.h12
-rw-r--r--src/mame/shared/namco_c355spr.cpp622
-rw-r--r--src/mame/shared/namco_c355spr.h93
-rw-r--r--src/mame/shared/pcshare.h2
-rw-r--r--src/mame/shared/rax.cpp9
-rw-r--r--src/mame/shared/rax.h12
-rw-r--r--src/mame/shared/s11c_bg.h20
-rw-r--r--src/mame/shared/sec.h4
-rw-r--r--src/mame/shared/segam1audio.cpp15
-rw-r--r--src/mame/shared/segam1audio.h12
-rw-r--r--src/mame/shared/seibusound.cpp131
-rw-r--r--src/mame/shared/seibusound.h61
-rw-r--r--src/mame/shared/snk68_spr.cpp199
-rw-r--r--src/mame/shared/snk68_spr.h52
-rw-r--r--src/mame/shared/taito68705.h14
-rw-r--r--src/mame/shared/taitosnd.h4
-rw-r--r--src/mame/shared/tecmo_spr.cpp11
-rw-r--r--src/mame/shared/tecmo_spr.h4
-rw-r--r--src/mame/shared/teleprinter.h4
-rw-r--r--src/mame/shared/timeplt_a.cpp27
-rw-r--r--src/mame/shared/timeplt_a.h15
-rw-r--r--src/mame/shared/vboysound.cpp11
-rw-r--r--src/mame/shared/vboysound.h6
-rw-r--r--src/mame/shared/vt100_kbd.h12
-rw-r--r--src/mame/shared/williamssound.cpp17
-rw-r--r--src/mame/shared/williamssound.h72
-rw-r--r--src/mame/shared/wswansound.cpp397
-rw-r--r--src/mame/shared/wswansound.h111
-rw-r--r--src/mame/shared/xbox.cpp2
-rw-r--r--src/mame/shared/xbox.h18
-rw-r--r--src/mame/shared/xbox_nv2a.cpp210
-rw-r--r--src/mame/shared/xbox_nv2a.h4
-rw-r--r--src/mame/shared/xbox_pci.cpp118
-rw-r--r--src/mame/shared/xbox_pci.h122
-rw-r--r--src/mame/shared/xbox_usb.cpp4
-rw-r--r--src/mame/shared/xbox_usb.h11
-rw-r--r--src/mame/sharp/fontwriter.cpp10
-rw-r--r--src/mame/sharp/mz2000.cpp1533
-rw-r--r--src/mame/sharp/mz2500.cpp800
-rw-r--r--src/mame/sharp/mz2500.h283
-rw-r--r--src/mame/sharp/mz3500.cpp583
-rw-r--r--src/mame/sharp/mz5500.cpp521
-rw-r--r--src/mame/sharp/mz6500.cpp190
-rw-r--r--src/mame/sharp/mz700.cpp65
-rw-r--r--src/mame/sharp/mz700.h24
-rw-r--r--src/mame/sharp/mz700_m.cpp28
-rw-r--r--src/mame/sharp/mz80.cpp8
-rw-r--r--src/mame/sharp/mz80.h6
-rw-r--r--src/mame/sharp/pc1251.h14
-rw-r--r--src/mame/sharp/pc1350.h4
-rw-r--r--src/mame/sharp/pc1401.h6
-rw-r--r--src/mame/sharp/pc1403.cpp2
-rw-r--r--src/mame/sharp/pc1403.h14
-rw-r--r--src/mame/sharp/pc1500.cpp8
-rw-r--r--src/mame/sharp/pce220.cpp348
-rw-r--r--src/mame/sharp/pce220_ser.h4
-rw-r--r--src/mame/sharp/pocketc.h4
-rw-r--r--src/mame/sharp/wizard.cpp9
-rw-r--r--src/mame/sharp/x1.cpp35
-rw-r--r--src/mame/sharp/x1.h31
-rw-r--r--src/mame/sharp/x1_m.cpp20
-rw-r--r--src/mame/sharp/x1twin.cpp65
-rw-r--r--src/mame/sharp/x68k.cpp430
-rw-r--r--src/mame/sharp/x68k.h64
-rw-r--r--src/mame/sharp/x68k_crtc.cpp8
-rw-r--r--src/mame/sharp/x68k_crtc.h4
-rw-r--r--src/mame/sharp/x68k_hdc.h2
-rw-r--r--src/mame/sharp/x68k_kbd.h6
-rw-r--r--src/mame/sharp/x68k_mouse.cpp103
-rw-r--r--src/mame/sharp/x68k_mouse.h36
-rw-r--r--src/mame/sharp/x68k_v.cpp16
-rw-r--r--src/mame/sharp/zaurus.cpp28
-rw-r--r--src/mame/siemens/bitel.cpp12
-rw-r--r--src/mame/siemens/pcd.cpp10
-rw-r--r--src/mame/siemens/pcd.h30
-rw-r--r--src/mame/siemens/pcd_kbd.h10
-rw-r--r--src/mame/siemens/pcd_v.cpp6
-rw-r--r--src/mame/siemens/pcmx2.cpp22
-rw-r--r--src/mame/siemens/pg685.cpp10
-rw-r--r--src/mame/sigma/nyny.cpp189
-rw-r--r--src/mame/sigma/r2dtank.cpp81
-rw-r--r--src/mame/sigma/sammymdl.cpp1038
-rw-r--r--src/mame/sigma/sigma21.cpp4
-rw-r--r--src/mame/sigma/sigmab31.cpp31
-rw-r--r--src/mame/sigma/sigmab52.cpp16
-rw-r--r--src/mame/sigma/sigmab88.cpp8
-rw-r--r--src/mame/sigma/sigmab98.cpp1557
-rw-r--r--src/mame/sigma/spiders.cpp2
-rw-r--r--src/mame/sigma/spiders.h6
-rw-r--r--src/mame/sigma/spiders_a.cpp2
-rw-r--r--src/mame/sinclair/atm.cpp31
-rw-r--r--src/mame/sinclair/atm.h15
-rw-r--r--src/mame/sinclair/beta_m.cpp34
-rw-r--r--src/mame/sinclair/beta_m.h10
-rw-r--r--src/mame/sinclair/byte.cpp286
-rw-r--r--src/mame/sinclair/chloe.cpp215
-rw-r--r--src/mame/sinclair/elwro800.cpp10
-rw-r--r--src/mame/sinclair/evo/glukrs.cpp51
-rw-r--r--src/mame/sinclair/evo/glukrs.h38
-rw-r--r--src/mame/sinclair/evo/pentevo.cpp (renamed from src/mame/sinclair/pentevo.cpp)158
-rw-r--r--src/mame/sinclair/evo/tsconf.cpp395
-rw-r--r--src/mame/sinclair/evo/tsconf.h259
-rw-r--r--src/mame/sinclair/evo/tsconf_beta.cpp275
-rw-r--r--src/mame/sinclair/evo/tsconf_beta.h72
-rw-r--r--src/mame/sinclair/evo/tsconf_copper.cpp217
-rw-r--r--src/mame/sinclair/evo/tsconf_copper.h46
-rw-r--r--src/mame/sinclair/evo/tsconf_dma.cpp276
-rw-r--r--src/mame/sinclair/evo/tsconf_dma.h77
-rw-r--r--src/mame/sinclair/evo/tsconf_m.cpp1071
-rw-r--r--src/mame/sinclair/evo/tsconf_rs232.cpp413
-rw-r--r--src/mame/sinclair/evo/tsconf_rs232.h81
-rw-r--r--src/mame/sinclair/glukrs.cpp59
-rw-r--r--src/mame/sinclair/glukrs.h44
-rw-r--r--src/mame/sinclair/hrust.cpp222
-rw-r--r--src/mame/sinclair/hrust.h40
-rw-r--r--src/mame/sinclair/next/specnext.cpp4227
-rw-r--r--src/mame/sinclair/next/specnext_copper.cpp157
-rw-r--r--src/mame/sinclair/next/specnext_copper.h (renamed from src/mame/sinclair/specnext_copper.h)9
-rw-r--r--src/mame/sinclair/next/specnext_ctc.cpp53
-rw-r--r--src/mame/sinclair/next/specnext_ctc.h27
-rw-r--r--src/mame/sinclair/next/specnext_divmmc.cpp (renamed from src/mame/sinclair/specnext_divmmc.cpp)3
-rw-r--r--src/mame/sinclair/next/specnext_divmmc.h (renamed from src/mame/sinclair/specnext_divmmc.h)6
-rw-r--r--src/mame/sinclair/next/specnext_dma.cpp148
-rw-r--r--src/mame/sinclair/next/specnext_dma.h37
-rw-r--r--src/mame/sinclair/next/specnext_im2.cpp62
-rw-r--r--src/mame/sinclair/next/specnext_im2.h40
-rw-r--r--src/mame/sinclair/next/specnext_layer2.cpp258
-rw-r--r--src/mame/sinclair/next/specnext_layer2.h78
-rw-r--r--src/mame/sinclair/next/specnext_lores.cpp136
-rw-r--r--src/mame/sinclair/next/specnext_lores.h (renamed from src/mame/sinclair/specnext_lores.h)12
-rw-r--r--src/mame/sinclair/next/specnext_multiface.cpp (renamed from src/mame/sinclair/specnext_multiface.cpp)2
-rw-r--r--src/mame/sinclair/next/specnext_multiface.h (renamed from src/mame/sinclair/specnext_multiface.h)6
-rw-r--r--src/mame/sinclair/next/specnext_sprites.cpp (renamed from src/mame/sinclair/specnext_sprites.cpp)90
-rw-r--r--src/mame/sinclair/next/specnext_sprites.h (renamed from src/mame/sinclair/specnext_sprites.h)11
-rw-r--r--src/mame/sinclair/next/specnext_tiles.cpp192
-rw-r--r--src/mame/sinclair/next/specnext_tiles.h80
-rw-r--r--src/mame/sinclair/next/specnext_uart.cpp182
-rw-r--r--src/mame/sinclair/next/specnext_uart.h54
-rw-r--r--src/mame/sinclair/pentagon.cpp50
-rw-r--r--src/mame/sinclair/qimi.cpp4
-rw-r--r--src/mame/sinclair/qimi.h6
-rw-r--r--src/mame/sinclair/ql.cpp8
-rw-r--r--src/mame/sinclair/scorpion.cpp242
-rw-r--r--src/mame/sinclair/screen_ula.cpp91
-rw-r--r--src/mame/sinclair/screen_ula.h15
-rw-r--r--src/mame/sinclair/spec128.cpp180
-rw-r--r--src/mame/sinclair/spec128.h30
-rw-r--r--src/mame/sinclair/spec_snqk.cpp187
-rw-r--r--src/mame/sinclair/spec_snqk.h9
-rw-r--r--src/mame/sinclair/specnext.cpp3531
-rw-r--r--src/mame/sinclair/specnext_copper.cpp143
-rw-r--r--src/mame/sinclair/specnext_ctc.cpp26
-rw-r--r--src/mame/sinclair/specnext_ctc.h22
-rw-r--r--src/mame/sinclair/specnext_dma.cpp118
-rw-r--r--src/mame/sinclair/specnext_dma.h32
-rw-r--r--src/mame/sinclair/specnext_layer2.cpp183
-rw-r--r--src/mame/sinclair/specnext_layer2.h66
-rw-r--r--src/mame/sinclair/specnext_lores.cpp111
-rw-r--r--src/mame/sinclair/specnext_tiles.cpp157
-rw-r--r--src/mame/sinclair/specnext_tiles.h76
-rw-r--r--src/mame/sinclair/specpls3.cpp58
-rw-r--r--src/mame/sinclair/specpls3.h11
-rw-r--r--src/mame/sinclair/spectrum.cpp212
-rw-r--r--src/mame/sinclair/spectrum.h132
-rw-r--r--src/mame/sinclair/spectrum_ula.cpp238
-rw-r--r--src/mame/sinclair/spectrum_ula.h148
-rw-r--r--src/mame/sinclair/spectrum_v.cpp118
-rw-r--r--src/mame/sinclair/sprinter.cpp862
-rw-r--r--src/mame/sinclair/timex.cpp64
-rw-r--r--src/mame/sinclair/timex.h37
-rw-r--r--src/mame/sinclair/tsconf.cpp335
-rw-r--r--src/mame/sinclair/tsconf.h235
-rw-r--r--src/mame/sinclair/tsconf_m.cpp962
-rw-r--r--src/mame/sinclair/tsconfdma.cpp236
-rw-r--r--src/mame/sinclair/tsconfdma.h71
-rw-r--r--src/mame/sinclair/upd65031.cpp (renamed from src/mame/acorn/upd65031.cpp)0
-rw-r--r--src/mame/sinclair/upd65031.h (renamed from src/mame/acorn/upd65031.h)10
-rw-r--r--src/mame/sinclair/z88.cpp (renamed from src/mame/acorn/z88.cpp)2
-rw-r--r--src/mame/sinclair/z88.h (renamed from src/mame/acorn/z88.h)16
-rw-r--r--src/mame/sinclair/z88_impexp.cpp (renamed from src/mame/acorn/z88_impexp.cpp)0
-rw-r--r--src/mame/sinclair/z88_impexp.h (renamed from src/mame/acorn/z88_impexp.h)10
-rw-r--r--src/mame/sinclair/z88_v.cpp (renamed from src/mame/acorn/z88_v.cpp)0
-rw-r--r--src/mame/sinclair/zx.h18
-rw-r--r--src/mame/sinclair/zx8301.h4
-rw-r--r--src/mame/sinclair/zx8302.h2
-rw-r--r--src/mame/skeleton/600cat.cpp4
-rw-r--r--src/mame/skeleton/aaa.cpp6
-rw-r--r--src/mame/skeleton/acd.cpp2
-rw-r--r--src/mame/skeleton/aceex.cpp10
-rw-r--r--src/mame/skeleton/adacp150.cpp10
-rw-r--r--src/mame/skeleton/aid80f.cpp10
-rw-r--r--src/mame/skeleton/airbase99.cpp4
-rw-r--r--src/mame/skeleton/alcat7100.cpp6
-rw-r--r--src/mame/skeleton/alesis_qs.cpp106
-rw-r--r--src/mame/skeleton/alfaskop_s41_kb.h10
-rw-r--r--src/mame/skeleton/alphasma.cpp328
-rw-r--r--src/mame/skeleton/alphasma3k.cpp12
-rw-r--r--src/mame/skeleton/am1000.cpp10
-rw-r--r--src/mame/skeleton/amlogic_aml7212.cpp73
-rw-r--r--src/mame/skeleton/amusement_6502.cpp132
-rw-r--r--src/mame/skeleton/antonelli_hd6305.cpp8
-rw-r--r--src/mame/skeleton/aquaplus_piece.cpp4
-rw-r--r--src/mame/skeleton/argox.cpp4
-rw-r--r--src/mame/skeleton/attache.cpp57
-rw-r--r--src/mame/skeleton/aws.cpp299
-rw-r--r--src/mame/skeleton/aws_kb.cpp307
-rw-r--r--src/mame/skeleton/aws_kb.h43
-rw-r--r--src/mame/skeleton/ax20.cpp6
-rw-r--r--src/mame/skeleton/banpresto_tomy_h8s.cpp255
-rw-r--r--src/mame/skeleton/basf7100.cpp14
-rw-r--r--src/mame/skeleton/basf7100_kbd.h8
-rw-r--r--src/mame/skeleton/bert.cpp4
-rw-r--r--src/mame/skeleton/biorhythm.cpp104
-rw-r--r--src/mame/skeleton/biorhythm_fp.cpp128
-rw-r--r--src/mame/skeleton/bitgraph.cpp42
-rw-r--r--src/mame/skeleton/blaucds32.cpp147
-rw-r--r--src/mame/skeleton/bolsaint.cpp71
-rw-r--r--src/mame/skeleton/boo.cpp4
-rw-r--r--src/mame/skeleton/bpmmicro.cpp6
-rw-r--r--src/mame/skeleton/br8641.cpp6
-rw-r--r--src/mame/skeleton/bullion2.cpp143
-rw-r--r--src/mame/skeleton/busicom.cpp16
-rw-r--r--src/mame/skeleton/busicom.h14
-rw-r--r--src/mame/skeleton/busicom_v.cpp2
-rw-r--r--src/mame/skeleton/c2color.cpp14
-rw-r--r--src/mame/skeleton/cadillacjack_mc68340.cpp356
-rw-r--r--src/mame/skeleton/camirf1.cpp81
-rw-r--r--src/mame/skeleton/candela.cpp10
-rw-r--r--src/mame/skeleton/caramball.cpp4
-rw-r--r--src/mame/skeleton/cardinal.cpp14
-rw-r--r--src/mame/skeleton/cbnt2039.cpp6
-rw-r--r--src/mame/skeleton/cd100.cpp10
-rw-r--r--src/mame/skeleton/cd2650.cpp28
-rw-r--r--src/mame/skeleton/cdc721.cpp8
-rw-r--r--src/mame/skeleton/cdsys5.cpp6
-rw-r--r--src/mame/skeleton/cit1500.cpp6
-rw-r--r--src/mame/skeleton/ckz80.cpp8
-rw-r--r--src/mame/skeleton/cle68k.cpp687
-rw-r--r--src/mame/skeleton/clownmgc.cpp287
-rw-r--r--src/mame/skeleton/clxvme186.cpp12
-rw-r--r--src/mame/skeleton/codata.cpp4
-rw-r--r--src/mame/skeleton/consola_emt.cpp12
-rw-r--r--src/mame/skeleton/controlid.cpp10
-rw-r--r--src/mame/skeleton/cortex.cpp213
-rw-r--r--src/mame/skeleton/cosmicos.cpp47
-rw-r--r--src/mame/skeleton/cp1.cpp6
-rw-r--r--src/mame/skeleton/css11501sk9.cpp141
-rw-r--r--src/mame/skeleton/ct909e_segadvd.cpp11
-rw-r--r--src/mame/skeleton/cubieboard4.cpp8
-rw-r--r--src/mame/skeleton/cxhumax.cpp12
-rw-r--r--src/mame/skeleton/cxhumax.h11
-rw-r--r--src/mame/skeleton/d400.cpp4
-rw-r--r--src/mame/skeleton/daruma.cpp10
-rw-r--r--src/mame/skeleton/dash4.cpp88
-rw-r--r--src/mame/skeleton/datacast.cpp27
-rw-r--r--src/mame/skeleton/design.cpp34
-rw-r--r--src/mame/skeleton/dharma_z180.cpp172
-rw-r--r--src/mame/skeleton/diablo1300.cpp12
-rw-r--r--src/mame/skeleton/didact.cpp72
-rw-r--r--src/mame/skeleton/digel804.cpp27
-rw-r--r--src/mame/skeleton/digiblast.cpp9
-rw-r--r--src/mame/skeleton/digijet.cpp2
-rw-r--r--src/mame/skeleton/digilog320.cpp16
-rw-r--r--src/mame/skeleton/digilog400.cpp14
-rw-r--r--src/mame/skeleton/digilog_kbd.cpp2
-rw-r--r--src/mame/skeleton/digilog_kbd.h10
-rw-r--r--src/mame/skeleton/digitech_gsp5.cpp4
-rw-r--r--src/mame/skeleton/dm7000.cpp10
-rw-r--r--src/mame/skeleton/dps1.cpp8
-rw-r--r--src/mame/skeleton/dsb46.cpp8
-rw-r--r--src/mame/skeleton/dual68.cpp8
-rw-r--r--src/mame/skeleton/dyna_d0404.cpp236
-rw-r--r--src/mame/skeleton/dyna_d0703.cpp183
-rw-r--r--src/mame/skeleton/dyna_dc4000.cpp431
-rw-r--r--src/mame/skeleton/e100.cpp234
-rw-r--r--src/mame/skeleton/easy_karaoke.cpp99
-rw-r--r--src/mame/skeleton/eks515.cpp76
-rw-r--r--src/mame/skeleton/elcirculo.cpp62
-rw-r--r--src/mame/skeleton/elzet80.cpp12
-rw-r--r--src/mame/skeleton/epic14e.cpp8
-rw-r--r--src/mame/skeleton/epoch_tv_globe.cpp115
-rw-r--r--src/mame/skeleton/esprit.cpp8
-rw-r--r--src/mame/skeleton/eurit.cpp6
-rw-r--r--src/mame/skeleton/eurocom2.cpp14
-rw-r--r--src/mame/skeleton/evolution_handheld.cpp83
-rw-r--r--src/mame/skeleton/extrema_m27sv.cpp386
-rw-r--r--src/mame/skeleton/fanucs15.cpp10
-rw-r--r--src/mame/skeleton/fanucspmg.cpp8
-rw-r--r--src/mame/skeleton/fc100.cpp46
-rw-r--r--src/mame/skeleton/fdek_h8s.cpp242
-rw-r--r--src/mame/skeleton/fk1.cpp8
-rw-r--r--src/mame/skeleton/flashgun.cpp105
-rw-r--r--src/mame/skeleton/flashvga2.cpp310
-rw-r--r--src/mame/skeleton/fs3216.cpp16
-rw-r--r--src/mame/skeleton/ft68m.cpp6
-rw-r--r--src/mame/skeleton/gamebox.cpp119
-rw-r--r--src/mame/skeleton/ganbaremo.cpp10
-rw-r--r--src/mame/skeleton/gem_rp.cpp4
-rw-r--r--src/mame/skeleton/gimix.cpp8
-rw-r--r--src/mame/skeleton/gm1000.cpp19
-rw-r--r--src/mame/skeleton/gnat10.cpp12
-rw-r--r--src/mame/skeleton/goupil.cpp10
-rw-r--r--src/mame/skeleton/grfd2301.cpp8
-rw-r--r--src/mame/skeleton/happyvideo.cpp2
-rw-r--r--src/mame/skeleton/hazeltin.cpp8
-rw-r--r--src/mame/skeleton/hazl1420.cpp8
-rw-r--r--src/mame/skeleton/hkcastle.cpp145
-rw-r--r--src/mame/skeleton/hohnadam.cpp12
-rw-r--r--src/mame/skeleton/hprot1.cpp18
-rw-r--r--src/mame/skeleton/ht68k.cpp4
-rw-r--r--src/mame/skeleton/hudson_poems.cpp20
-rw-r--r--src/mame/skeleton/i7000.cpp10
-rw-r--r--src/mame/skeleton/iam2.cpp221
-rw-r--r--src/mame/skeleton/icatel.cpp19
-rw-r--r--src/mame/skeleton/icebox.cpp6
-rw-r--r--src/mame/skeleton/iez80.cpp10
-rw-r--r--src/mame/skeleton/if800.cpp14
-rw-r--r--src/mame/skeleton/ikt5a.cpp12
-rw-r--r--src/mame/skeleton/imsai.cpp8
-rw-r--r--src/mame/skeleton/indiana.cpp9
-rw-r--r--src/mame/skeleton/is48x.cpp10
-rw-r--r--src/mame/skeleton/itc4.cpp4
-rw-r--r--src/mame/skeleton/itt1700.cpp6
-rw-r--r--src/mame/skeleton/itt1700_kbd.h8
-rw-r--r--src/mame/skeleton/itt3030.cpp10
-rw-r--r--src/mame/skeleton/itt9216.cpp8
-rw-r--r--src/mame/skeleton/jade.cpp4
-rw-r--r--src/mame/skeleton/jinhuang6.cpp149
-rw-r--r--src/mame/skeleton/jonos.cpp6
-rw-r--r--src/mame/skeleton/juku.cpp560
-rw-r--r--src/mame/skeleton/junior80.cpp10
-rw-r--r--src/mame/skeleton/kkcount.cpp2
-rw-r--r--src/mame/skeleton/koto_zevio.cpp26
-rw-r--r--src/mame/skeleton/kron.cpp4
-rw-r--r--src/mame/skeleton/lanmao.cpp687
-rw-r--r--src/mame/skeleton/leadsinger2.cpp129
-rw-r--r--src/mame/skeleton/lee1214.cpp8
-rw-r--r--src/mame/skeleton/lee1220.cpp8
-rw-r--r--src/mame/skeleton/lft.cpp12
-rw-r--r--src/mame/skeleton/lg-dvd.cpp4
-rw-r--r--src/mame/skeleton/lgtz80.cpp1045
-rw-r--r--src/mame/skeleton/lilith.cpp2
-rw-r--r--src/mame/skeleton/lms46.cpp6
-rw-r--r--src/mame/skeleton/madmoney2.cpp4
-rw-r--r--src/mame/skeleton/marsvending.cpp118
-rw-r--r--src/mame/skeleton/mcc1.cpp181
-rw-r--r--src/mame/skeleton/megacrane.cpp151
-rw-r--r--src/mame/skeleton/mes.cpp8
-rw-r--r--src/mame/skeleton/mfabfz.cpp10
-rw-r--r--src/mame/skeleton/mgt_multigame.cpp159
-rw-r--r--src/mame/skeleton/mice.cpp32
-rw-r--r--src/mame/skeleton/mice3s68k.cpp116
-rw-r--r--src/mame/skeleton/micral.cpp14
-rw-r--r--src/mame/skeleton/micro20.cpp6
-rw-r--r--src/mame/skeleton/micromon.cpp8
-rw-r--r--src/mame/skeleton/micronic.cpp8
-rw-r--r--src/mame/skeleton/mightyframe.cpp6
-rw-r--r--src/mame/skeleton/milwaukee.cpp4
-rw-r--r--src/mame/skeleton/mini2440.cpp15
-rw-r--r--src/mame/skeleton/miniframe.cpp8
-rw-r--r--src/mame/skeleton/minihock.cpp2
-rw-r--r--src/mame/skeleton/miuchiz.cpp147
-rw-r--r--src/mame/skeleton/ml20.cpp6
-rw-r--r--src/mame/skeleton/mmd1.cpp10
-rw-r--r--src/mame/skeleton/mmd2.cpp10
-rw-r--r--src/mame/skeleton/mod8.cpp6
-rw-r--r--src/mame/skeleton/modellot.cpp10
-rw-r--r--src/mame/skeleton/molecular.cpp22
-rw-r--r--src/mame/skeleton/ms9540.cpp6
-rw-r--r--src/mame/skeleton/mstation.cpp10
-rw-r--r--src/mame/skeleton/mt735.cpp6
-rw-r--r--src/mame/skeleton/mtd1256.cpp8
-rw-r--r--src/mame/skeleton/mw4pole.cpp4
-rw-r--r--src/mame/skeleton/mx2178.cpp8
-rw-r--r--src/mame/skeleton/mx3210.cpp6
-rw-r--r--src/mame/skeleton/mycom.cpp8
-rw-r--r--src/mame/skeleton/ngen.cpp113
-rw-r--r--src/mame/skeleton/ngen_kb.cpp8
-rw-r--r--src/mame/skeleton/ngen_kb.h6
-rw-r--r--src/mame/skeleton/nordlead.cpp81
-rw-r--r--src/mame/skeleton/omdisv22.cpp176
-rw-r--r--src/mame/skeleton/onyx.cpp12
-rw-r--r--src/mame/skeleton/optomaxv.cpp730
-rw-r--r--src/mame/skeleton/orina_stylish_plus.cpp67
-rw-r--r--src/mame/skeleton/p8k.cpp10
-rw-r--r--src/mame/skeleton/paipaile.cpp123
-rw-r--r--src/mame/skeleton/palestra.cpp2
-rw-r--r--src/mame/skeleton/palsystems_sh2.cpp267
-rw-r--r--src/mame/skeleton/pap2.cpp103
-rw-r--r--src/mame/skeleton/pcksurfer.cpp2
-rw-r--r--src/mame/skeleton/pdt3100.cpp6
-rw-r--r--src/mame/skeleton/pegasos2.cpp10
-rw-r--r--src/mame/skeleton/pencil2.cpp139
-rw-r--r--src/mame/skeleton/perq.cpp2
-rw-r--r--src/mame/skeleton/pes.cpp10
-rw-r--r--src/mame/skeleton/picno.cpp13
-rw-r--r--src/mame/skeleton/plan80.cpp10
-rw-r--r--src/mame/skeleton/pm68k.cpp4
-rw-r--r--src/mame/skeleton/powerpack.cpp80
-rw-r--r--src/mame/skeleton/probowl.cpp171
-rw-r--r--src/mame/skeleton/proteus3.cpp6
-rw-r--r--src/mame/skeleton/pt68k4.cpp18
-rw-r--r--src/mame/skeleton/ptcsol.cpp8
-rw-r--r--src/mame/skeleton/pullttrigger.cpp94
-rw-r--r--src/mame/skeleton/pv9234.cpp175
-rw-r--r--src/mame/skeleton/pwp14.cpp8
-rw-r--r--src/mame/skeleton/qmquasar.cpp12
-rw-r--r--src/mame/skeleton/qmsirius.cpp12
-rw-r--r--src/mame/skeleton/qtsbc.cpp8
-rw-r--r--src/mame/skeleton/ramstar.cpp10
-rw-r--r--src/mame/skeleton/rd100.cpp6
-rw-r--r--src/mame/skeleton/rvoice.cpp2
-rw-r--r--src/mame/skeleton/sacstate.cpp8
-rw-r--r--src/mame/skeleton/sammy_pachislo_z80.cpp101
-rw-r--r--src/mame/skeleton/sansa_fuze.cpp5
-rw-r--r--src/mame/skeleton/sartorius.cpp8
-rw-r--r--src/mame/skeleton/sb180.cpp6
-rw-r--r--src/mame/skeleton/sb8085.cpp8
-rw-r--r--src/mame/skeleton/sbrain.cpp22
-rw-r--r--src/mame/skeleton/scopus.cpp8
-rw-r--r--src/mame/skeleton/seattlecmp.cpp4
-rw-r--r--src/mame/skeleton/semcrossw.cpp2
-rw-r--r--src/mame/skeleton/seoul88.cpp4
-rw-r--r--src/mame/skeleton/sgm.cpp191
-rw-r--r--src/mame/skeleton/sh4robot.cpp11
-rw-r--r--src/mame/skeleton/shine.cpp6
-rw-r--r--src/mame/skeleton/shoken_md06.cpp286
-rw-r--r--src/mame/skeleton/si5500.cpp8
-rw-r--r--src/mame/skeleton/sk101bl.cpp12
-rw-r--r--src/mame/skeleton/slsstars.cpp4
-rw-r--r--src/mame/skeleton/softbox.cpp6
-rw-r--r--src/mame/skeleton/solbourne.cpp2
-rw-r--r--src/mame/skeleton/squale.cpp406
-rw-r--r--src/mame/skeleton/sterz80.cpp23
-rw-r--r--src/mame/skeleton/swyft.cpp8
-rw-r--r--src/mame/skeleton/symbolics.cpp8
-rw-r--r--src/mame/skeleton/synthex.cpp6
-rw-r--r--src/mame/skeleton/sys2900.cpp10
-rw-r--r--src/mame/skeleton/sys9002.cpp6
-rw-r--r--src/mame/skeleton/systec.cpp6
-rw-r--r--src/mame/skeleton/systel1.cpp10
-rw-r--r--src/mame/skeleton/syvg.cpp164
-rw-r--r--src/mame/skeleton/tamagotchi_pix.cpp166
-rw-r--r--src/mame/skeleton/tavernie.cpp16
-rw-r--r--src/mame/skeleton/tc_manhattan.cpp106
-rw-r--r--src/mame/skeleton/tecnbras.cpp14
-rw-r--r--src/mame/skeleton/teleray10.cpp10
-rw-r--r--src/mame/skeleton/telex1192.cpp6
-rw-r--r--src/mame/skeleton/telex274.cpp8
-rw-r--r--src/mame/skeleton/telex277d.cpp6
-rw-r--r--src/mame/skeleton/terak.cpp107
-rw-r--r--src/mame/skeleton/terco.cpp4
-rw-r--r--src/mame/skeleton/terminal.cpp14
-rw-r--r--src/mame/skeleton/testlove.cpp95
-rw-r--r--src/mame/skeleton/textelcomp.cpp14
-rw-r--r--src/mame/skeleton/ti630.cpp14
-rw-r--r--src/mame/skeleton/ticz80.cpp226
-rw-r--r--src/mame/skeleton/tk635.cpp8
-rw-r--r--src/mame/skeleton/tnshc08.cpp6
-rw-r--r--src/mame/skeleton/tr175.cpp8
-rw-r--r--src/mame/skeleton/tsispch.cpp43
-rw-r--r--src/mame/skeleton/tulip1.cpp9
-rw-r--r--src/mame/skeleton/turnierdart.cpp141
-rw-r--r--src/mame/skeleton/tvcobrasd.cpp22
-rw-r--r--src/mame/skeleton/tvdear.cpp220
-rw-r--r--src/mame/skeleton/unistar.cpp8
-rw-r--r--src/mame/skeleton/unkcrane8085.cpp160
-rw-r--r--src/mame/skeleton/v6809.cpp6
-rw-r--r--src/mame/skeleton/vanguardmk1.cpp4
-rw-r--r--src/mame/skeleton/vd56sp.cpp4
-rw-r--r--src/mame/skeleton/vector3.cpp6
-rw-r--r--src/mame/skeleton/vectrix.cpp6
-rw-r--r--src/mame/skeleton/venteta.cpp148
-rw-r--r--src/mame/skeleton/vgame.cpp341
-rw-r--r--src/mame/skeleton/vp415.cpp34
-rw-r--r--src/mame/skeleton/webtouchone.cpp28
-rw-r--r--src/mame/skeleton/xbase09.cpp6
-rw-r--r--src/mame/skeleton/xinyun.cpp183
-rw-r--r--src/mame/skeleton/xor100.cpp14
-rw-r--r--src/mame/skeleton/yeno_ks56c1660.cpp109
-rw-r--r--src/mame/skeleton/zeebo_qualcomm_adreno130.cpp8
-rw-r--r--src/mame/skeleton/zfirenze.cpp108
-rw-r--r--src/mame/skeleton/zms8085.cpp8
-rw-r--r--src/mame/skeleton/zorba.cpp221
-rw-r--r--src/mame/skeleton/zorbakbd.cpp6
-rw-r--r--src/mame/skeleton/zorbakbd.h8
-rw-r--r--src/mame/skeleton/zt8802.cpp6
-rw-r--r--src/mame/skeleton/zvenezia.cpp165
-rw-r--r--src/mame/slicer/slicer.cpp4
-rw-r--r--src/mame/snk/bbusters.cpp222
-rw-r--r--src/mame/snk/dmndrby.cpp8
-rw-r--r--src/mame/snk/drderby.cpp254
-rw-r--r--src/mame/snk/hng64.cpp419
-rw-r--r--src/mame/snk/hng64.h549
-rw-r--r--src/mame/snk/hng64_3d.ipp267
-rw-r--r--src/mame/snk/hng64_a.cpp299
-rw-r--r--src/mame/snk/hng64_sprite.ipp120
-rw-r--r--src/mame/snk/hng64_v.cpp511
-rw-r--r--src/mame/snk/k1ge.cpp872
-rw-r--r--src/mame/snk/k1ge.h79
-rw-r--r--src/mame/snk/lasso.cpp758
-rw-r--r--src/mame/snk/lasso.h116
-rw-r--r--src/mame/snk/lasso_v.cpp381
-rw-r--r--src/mame/snk/mainsnk.cpp40
-rw-r--r--src/mame/snk/mechatt.cpp150
-rw-r--r--src/mame/snk/miconkit.cpp10
-rw-r--r--src/mame/snk/munchmo.cpp182
-rw-r--r--src/mame/snk/neocrnvl.cpp93
-rw-r--r--src/mame/snk/ngp.cpp311
-rw-r--r--src/mame/snk/prehisle.cpp26
-rw-r--r--src/mame/snk/snk.cpp1415
-rw-r--r--src/mame/snk/snk.h460
-rw-r--r--src/mame/snk/snk6502.cpp229
-rw-r--r--src/mame/snk/snk6502.h32
-rw-r--r--src/mame/snk/snk6502_a.cpp8
-rw-r--r--src/mame/snk/snk6502_a.h34
-rw-r--r--src/mame/snk/snk6502_v.cpp42
-rw-r--r--src/mame/snk/snk68.cpp144
-rw-r--r--src/mame/snk/snk_bbusters_spr.cpp22
-rw-r--r--src/mame/snk/snk_bbusters_spr.h2
-rw-r--r--src/mame/snk/snk_v.cpp349
-rw-r--r--src/mame/sony/betacam.cpp10
-rw-r--r--src/mame/sony/bvm.cpp4
-rw-r--r--src/mame/sony/clie_db.cpp4
-rw-r--r--src/mame/sony/cxd8442q.cpp2
-rw-r--r--src/mame/sony/cxd8442q.h8
-rw-r--r--src/mame/sony/cxd8452aq.h8
-rw-r--r--src/mame/sony/dfs500.cpp14
-rw-r--r--src/mame/sony/dmac3.h4
-rw-r--r--src/mame/sony/dmac_0266.h6
-rw-r--r--src/mame/sony/dmac_0448.h6
-rw-r--r--src/mame/sony/dpsv55.cpp29
-rw-r--r--src/mame/sony/librie.cpp2
-rw-r--r--src/mame/sony/news_020_mmu.cpp355
-rw-r--r--src/mame/sony/news_020_mmu.h51
-rw-r--r--src/mame/sony/news_38xx.cpp980
-rw-r--r--src/mame/sony/news_68k.cpp130
-rw-r--r--src/mame/sony/news_68k_iop.cpp1133
-rw-r--r--src/mame/sony/news_hid.h12
-rw-r--r--src/mame/sony/news_iop_scsi.cpp368
-rw-r--r--src/mame/sony/news_iop_scsi.h84
-rw-r--r--src/mame/sony/news_r3k.cpp145
-rw-r--r--src/mame/sony/news_r4k.cpp49
-rw-r--r--src/mame/sony/pockstat.cpp27
-rw-r--r--src/mame/sony/ps2sony.cpp10
-rw-r--r--src/mame/sony/psx.cpp16
-rw-r--r--src/mame/sony/psxcd.cpp2
-rw-r--r--src/mame/sony/psxcd.h8
-rw-r--r--src/mame/sony/pve500.cpp19
-rw-r--r--src/mame/sony/smc777.cpp1226
-rw-r--r--src/mame/sony/smc777_kbd.cpp586
-rw-r--r--src/mame/sony/smc777_kbd.h62
-rw-r--r--src/mame/sony/taito_zm.cpp8
-rw-r--r--src/mame/sony/taito_zm.h10
-rw-r--r--src/mame/sony/taitogn.cpp1396
-rw-r--r--src/mame/sony/umatic.cpp6
-rw-r--r--src/mame/sony/zn.cpp5092
-rw-r--r--src/mame/sony/zn.h582
-rw-r--r--src/mame/sony/znmcu.cpp79
-rw-r--r--src/mame/sony/znmcu.h46
-rw-r--r--src/mame/sord/future32.cpp668
-rw-r--r--src/mame/sord/m5.cpp1094
-rw-r--r--src/mame/stern/astinvad.cpp41
-rw-r--r--src/mame/stern/berzerk.cpp16
-rw-r--r--src/mame/stern/cliffhgr.cpp17
-rw-r--r--src/mame/stern/mazerbla.cpp168
-rw-r--r--src/mame/stern/supdrapo.cpp11
-rw-r--r--src/mame/stm/pp.cpp10
-rw-r--r--src/mame/stm/stmpc.cpp14
-rw-r--r--src/mame/subsino/lastfght.cpp13
-rw-r--r--src/mame/subsino/subsino.cpp498
-rw-r--r--src/mame/subsino/subsino2.cpp596
-rw-r--r--src/mame/subsino/subsino_io.h4
-rw-r--r--src/mame/subsino/subsino_kr_h8.cpp194
-rw-r--r--src/mame/success/big10.cpp (renamed from src/mame/msx/big10.cpp)39
-rw-r--r--src/mame/success/kurukuru.cpp (renamed from src/mame/misc/kurukuru.cpp)53
-rw-r--r--src/mame/success/othello.cpp (renamed from src/mame/misc/othello.cpp)134
-rw-r--r--src/mame/success/skopro.cpp (renamed from src/mame/misc/skopro.cpp)10
-rw-r--r--src/mame/success/sothello.cpp (renamed from src/mame/misc/sothello.cpp)14
-rw-r--r--src/mame/success/tonton.cpp (renamed from src/mame/sunelectronics/tonton.cpp)22
-rw-r--r--src/mame/sun/e250.cpp121
-rw-r--r--src/mame/sun/sun1.cpp122
-rw-r--r--src/mame/sun/sun2.cpp109
-rw-r--r--src/mame/sun/sun3.cpp188
-rw-r--r--src/mame/sun/sun3x.cpp26
-rw-r--r--src/mame/sun/sun4.cpp78
-rw-r--r--src/mame/sun/sun_gem.cpp43
-rw-r--r--src/mame/sun/sun_gem.h23
-rw-r--r--src/mame/sun/ultra45.cpp83
-rw-r--r--src/mame/suna/go2000.cpp18
-rw-r--r--src/mame/suna/goindol.cpp10
-rw-r--r--src/mame/suna/suna16.cpp56
-rw-r--r--src/mame/suna/suna16.h34
-rw-r--r--src/mame/suna/suna8.cpp115
-rw-r--r--src/mame/suna/suna8.h44
-rw-r--r--src/mame/suna/suna8_a.cpp5
-rw-r--r--src/mame/sunelectronics/arabian.cpp31
-rw-r--r--src/mame/sunelectronics/blockch.cpp6
-rw-r--r--src/mame/sunelectronics/dai3wksi.cpp6
-rw-r--r--src/mame/sunelectronics/ikki.cpp21
-rw-r--r--src/mame/sunelectronics/kangaroo.cpp325
-rw-r--r--src/mame/sunelectronics/markham.cpp46
-rw-r--r--src/mame/sunelectronics/route16.cpp618
-rw-r--r--src/mame/sunelectronics/route16.h87
-rw-r--r--src/mame/sunelectronics/route16_v.cpp148
-rw-r--r--src/mame/sunelectronics/shangha3.cpp74
-rw-r--r--src/mame/sunelectronics/shanghai.cpp26
-rw-r--r--src/mame/sunwise/anoworld.cpp19
-rw-r--r--src/mame/sunwise/jankenmn.cpp8
-rw-r--r--src/mame/sunwise/jankmg2.cpp188
-rw-r--r--src/mame/svi/svi318.cpp10
-rw-r--r--src/mame/svision/svis_snd.cpp11
-rw-r--r--src/mame/svision/svis_snd.h4
-rw-r--r--src/mame/svision/svision.cpp29
-rw-r--r--src/mame/swtpc/swtpc.cpp8
-rw-r--r--src/mame/swtpc/swtpc09.cpp6
-rw-r--r--src/mame/swtpc/swtpc09.h18
-rw-r--r--src/mame/synertek/ktm3.cpp24
-rw-r--r--src/mame/synertek/mbc020.cpp2
-rw-r--r--src/mame/synertek/sym1.cpp4
-rw-r--r--src/mame/ta/alphatpc16.cpp12
-rw-r--r--src/mame/ta/alphatpx.cpp173
-rw-r--r--src/mame/ta/alphatro.cpp23
-rw-r--r--src/mame/tab/e22_kbd.h6
-rw-r--r--src/mame/tab/tabe22.cpp13
-rw-r--r--src/mame/taito/2mindril.cpp21
-rw-r--r--src/mame/taito/40love.h14
-rw-r--r--src/mame/taito/arkanoid.cpp155
-rw-r--r--src/mame/taito/arkanoid.h28
-rw-r--r--src/mame/taito/arkanoid_m.cpp2
-rw-r--r--src/mame/taito/ashnojoe.cpp12
-rw-r--r--src/mame/taito/asuka.cpp141
-rw-r--r--src/mame/taito/bigevglf.cpp16
-rw-r--r--src/mame/taito/bingowav.cpp14
-rw-r--r--src/mame/taito/bking.cpp751
-rw-r--r--src/mame/taito/bking.h114
-rw-r--r--src/mame/taito/bking_v.cpp321
-rw-r--r--src/mame/taito/bublbobl.cpp25
-rw-r--r--src/mame/taito/bublbobl.h21
-rw-r--r--src/mame/taito/buggychl.cpp14
-rw-r--r--src/mame/taito/capr1.cpp4
-rw-r--r--src/mame/taito/caprcyc.cpp4
-rw-r--r--src/mame/taito/cchance.cpp10
-rw-r--r--src/mame/taito/chaknpop.cpp15
-rw-r--r--src/mame/taito/changela.cpp8
-rw-r--r--src/mame/taito/cpzodiac.cpp19
-rw-r--r--src/mame/taito/crbaloon.cpp4
-rw-r--r--src/mame/taito/crbaloon.h10
-rw-r--r--src/mame/taito/cucaracha.cpp10
-rw-r--r--src/mame/taito/cyclemb.cpp22
-rw-r--r--src/mame/taito/darius.cpp27
-rw-r--r--src/mame/taito/dinoking.cpp32
-rw-r--r--src/mame/taito/exzisus.cpp10
-rw-r--r--src/mame/taito/fgoal.cpp10
-rw-r--r--src/mame/taito/flstory.cpp82
-rw-r--r--src/mame/taito/galastrm.cpp25
-rw-r--r--src/mame/taito/gladiatr.cpp13
-rw-r--r--src/mame/taito/gladiatr.h26
-rw-r--r--src/mame/taito/grchamp.cpp9
-rw-r--r--src/mame/taito/grchamp.h16
-rw-r--r--src/mame/taito/groundfx.cpp11
-rw-r--r--src/mame/taito/gsword.cpp2
-rw-r--r--src/mame/taito/gsword.h30
-rw-r--r--src/mame/taito/gunbustr.cpp151
-rw-r--r--src/mame/taito/gunbustr_link.cpp655
-rw-r--r--src/mame/taito/gunbustr_link.h48
-rw-r--r--src/mame/taito/halleys.cpp10
-rw-r--r--src/mame/taito/haplucky.cpp50
-rw-r--r--src/mame/taito/heromem.cpp32
-rw-r--r--src/mame/taito/invqix.cpp69
-rw-r--r--src/mame/taito/jollyjgr.cpp423
-rw-r--r--src/mame/taito/kikikai.cpp7
-rw-r--r--src/mame/taito/ksayakyu.cpp10
-rw-r--r--src/mame/taito/lgp.cpp17
-rw-r--r--src/mame/taito/lkage.cpp24
-rw-r--r--src/mame/taito/lsasquad.cpp535
-rw-r--r--src/mame/taito/lsasquad.h84
-rw-r--r--src/mame/taito/lsasquad_m.cpp74
-rw-r--r--src/mame/taito/lsasquad_v.cpp205
-rw-r--r--src/mame/taito/marinedt.cpp300
-rw-r--r--src/mame/taito/minivadr.cpp56
-rw-r--r--src/mame/taito/missb2.cpp10
-rw-r--r--src/mame/taito/mlanding.cpp32
-rw-r--r--src/mame/taito/msisaac.cpp10
-rw-r--r--src/mame/taito/ninjaw.cpp86
-rw-r--r--src/mame/taito/nl_sspeedr.cpp (renamed from src/mame/midway/nl_sspeedr.cpp)0
-rw-r--r--src/mame/taito/nl_sspeedr.h12
-rw-r--r--src/mame/taito/nycaptor.cpp88
-rw-r--r--src/mame/taito/nycaptor.h22
-rw-r--r--src/mame/taito/nycaptor_v.cpp2
-rw-r--r--src/mame/taito/opwolf.cpp311
-rw-r--r--src/mame/taito/othunder.cpp22
-rw-r--r--src/mame/taito/othunder.h9
-rw-r--r--src/mame/taito/othunder_v.cpp7
-rw-r--r--src/mame/taito/pc080sn.h2
-rw-r--r--src/mame/taito/pc090oj.h4
-rw-r--r--src/mame/taito/pitnrun.cpp27
-rw-r--r--src/mame/taito/pkspirit.cpp24
-rw-r--r--src/mame/taito/qix.cpp187
-rw-r--r--src/mame/taito/qix.h204
-rw-r--r--src/mame/taito/qix_a.cpp98
-rw-r--r--src/mame/taito/qix_m.cpp118
-rw-r--r--src/mame/taito/qix_v.cpp169
-rw-r--r--src/mame/taito/rastan.cpp8
-rw-r--r--src/mame/taito/rbisland.cpp12
-rw-r--r--src/mame/taito/retofinv.cpp57
-rw-r--r--src/mame/taito/rollrace.cpp19
-rw-r--r--src/mame/taito/roundup.cpp1912
-rw-r--r--src/mame/taito/sbmjb.cpp129
-rw-r--r--src/mame/taito/sbowling.cpp6
-rw-r--r--src/mame/taito/scyclone.cpp609
-rw-r--r--src/mame/taito/slapshot.cpp68
-rw-r--r--src/mame/taito/slapshot.h10
-rw-r--r--src/mame/taito/slapshot_v.cpp106
-rw-r--r--src/mame/taito/spdheat.cpp14
-rw-r--r--src/mame/taito/sspeedr.cpp648
-rw-r--r--src/mame/taito/ssrj.cpp8
-rw-r--r--src/mame/taito/superchs.cpp7
-rw-r--r--src/mame/taito/superchs.h8
-rw-r--r--src/mame/taito/superchs_v.cpp2
-rw-r--r--src/mame/taito/superqix.cpp223
-rw-r--r--src/mame/taito/superqix.h39
-rw-r--r--src/mame/taito/suprridr.cpp (renamed from src/mame/venture/suprridr.cpp)66
-rw-r--r--src/mame/taito/taito_b.cpp339
-rw-r--r--src/mame/taito/taito_b.h144
-rw-r--r--src/mame/taito/taito_b_v.cpp96
-rw-r--r--src/mame/taito/taito_en.cpp44
-rw-r--r--src/mame/taito/taito_en.h18
-rw-r--r--src/mame/taito/taito_f2.cpp818
-rw-r--r--src/mame/taito/taito_f2.h406
-rw-r--r--src/mame/taito/taito_f2_v.cpp222
-rw-r--r--src/mame/taito/taito_f3.cpp46
-rw-r--r--src/mame/taito/taito_f3.h18
-rw-r--r--src/mame/taito/taito_f3_v.cpp6
-rw-r--r--src/mame/taito/taito_h.cpp82
-rw-r--r--src/mame/taito/taito_h.h14
-rw-r--r--src/mame/taito/taito_l.cpp725
-rw-r--r--src/mame/taito/taito_l.h217
-rw-r--r--src/mame/taito/taito_l_v.cpp43
-rw-r--r--src/mame/taito/taito_o.cpp38
-rw-r--r--src/mame/taito/taito_x.cpp58
-rw-r--r--src/mame/taito/taito_z.cpp330
-rw-r--r--src/mame/taito/taito_z.h75
-rw-r--r--src/mame/taito/taito_z_v.cpp10
-rw-r--r--src/mame/taito/taitoair.cpp40
-rw-r--r--src/mame/taito/taitoair.h49
-rw-r--r--src/mame/taito/taitocchip.cpp4
-rw-r--r--src/mame/taito/taitocchip.h2
-rw-r--r--src/mame/taito/taitoio.h24
-rw-r--r--src/mame/taito/taitoio_opto.h2
-rw-r--r--src/mame/taito/taitoio_yoke.h6
-rw-r--r--src/mame/taito/taitojc.cpp388
-rw-r--r--src/mame/taito/taitojc.h168
-rw-r--r--src/mame/taito/taitojc_v.cpp176
-rw-r--r--src/mame/taito/taitopjc.cpp297
-rw-r--r--src/mame/taito/taitosj.cpp549
-rw-r--r--src/mame/taito/taitosj.h30
-rw-r--r--src/mame/taito/taitosj_m.cpp8
-rw-r--r--src/mame/taito/taitosj_v.cpp81
-rw-r--r--src/mame/taito/taitosjsec.h12
-rw-r--r--src/mame/taito/taitottl.cpp54
-rw-r--r--src/mame/taito/taitotx.cpp19
-rw-r--r--src/mame/taito/taitotz.cpp1572
-rw-r--r--src/mame/taito/taitowlf.cpp125
-rw-r--r--src/mame/taito/tc0060dca.cpp54
-rw-r--r--src/mame/taito/tc0060dca.h31
-rw-r--r--src/mame/taito/tc0080vco.cpp19
-rw-r--r--src/mame/taito/tc0080vco.h2
-rw-r--r--src/mame/taito/tc0100scn.cpp26
-rw-r--r--src/mame/taito/tc0100scn.h8
-rw-r--r--src/mame/taito/tc0110pcr.cpp127
-rw-r--r--src/mame/taito/tc0110pcr.h24
-rw-r--r--src/mame/taito/tc0150rod.h2
-rw-r--r--src/mame/taito/tc0180vcu.cpp140
-rw-r--r--src/mame/taito/tc0180vcu.h26
-rw-r--r--src/mame/taito/tc0280grd.cpp79
-rw-r--r--src/mame/taito/tc0280grd.h40
-rw-r--r--src/mame/taito/tc0360pri.h4
-rw-r--r--src/mame/taito/tc0480scp.cpp30
-rw-r--r--src/mame/taito/tc0480scp.h4
-rw-r--r--src/mame/taito/tc0780fpa.cpp129
-rw-r--r--src/mame/taito/tc0780fpa.h16
-rw-r--r--src/mame/taito/tnzs.cpp99
-rw-r--r--src/mame/taito/topspeed.cpp35
-rw-r--r--src/mame/taito/tsamurai.cpp20
-rw-r--r--src/mame/taito/tsamurai.h38
-rw-r--r--src/mame/taito/undrfire.cpp57
-rw-r--r--src/mame/taito/undrfire.h12
-rw-r--r--src/mame/taito/undrfire_v.cpp14
-rw-r--r--src/mame/taito/vicshoot.cpp4
-rw-r--r--src/mame/taito/volfied.cpp6
-rw-r--r--src/mame/taito/warriorb.cpp62
-rw-r--r--src/mame/taito/wgp.cpp1188
-rw-r--r--src/mame/taito/wgp.h124
-rw-r--r--src/mame/taito/wgp_v.cpp696
-rw-r--r--src/mame/taito/wyvernf0.cpp210
-rw-r--r--src/mame/tandberg/tdv2100_disp_logic.cpp196
-rw-r--r--src/mame/tandberg/tdv2100_disp_logic.h16
-rw-r--r--src/mame/tandberg/tdv2100_kbd.h14
-rw-r--r--src/mame/tandberg/tdv2324.h12
-rw-r--r--src/mame/tangerine/alphatan.cpp4
-rw-r--r--src/mame/tangerine/hhtiger.cpp25
-rw-r--r--src/mame/tangerine/microtan.cpp54
-rw-r--r--src/mame/tangerine/microtan.h12
-rw-r--r--src/mame/tangerine/oric.cpp26
-rw-r--r--src/mame/tatsumi/apache3.cpp671
-rw-r--r--src/mame/tatsumi/cyclwarr.cpp1284
-rw-r--r--src/mame/tatsumi/kingdrby.cpp30
-rw-r--r--src/mame/tatsumi/lockon.cpp23
-rw-r--r--src/mame/tatsumi/lockon.h20
-rw-r--r--src/mame/tatsumi/lockon_v.cpp4
-rw-r--r--src/mame/tatsumi/roundup5.cpp782
-rw-r--r--src/mame/tatsumi/tatsumi.cpp1675
-rw-r--r--src/mame/tatsumi/tatsumi.h224
-rw-r--r--src/mame/tatsumi/tatsumi_m.cpp330
-rw-r--r--src/mame/tatsumi/tatsumi_v.cpp1284
-rw-r--r--src/mame/tatsumi/tx1.h12
-rw-r--r--src/mame/tatsumi/tx1_a.cpp23
-rw-r--r--src/mame/tatsumi/tx1_a.h36
-rw-r--r--src/mame/tatsumi/tzbx15_sprites.cpp562
-rw-r--r--src/mame/tatsumi/tzbx15_sprites.h83
-rw-r--r--src/mame/tatung/einstein.cpp18
-rw-r--r--src/mame/tch/kickgoal.cpp279
-rw-r--r--src/mame/tch/kickgoal.h124
-rw-r--r--src/mame/tch/kickgoal_v.cpp169
-rw-r--r--src/mame/tch/littlerb.cpp19
-rw-r--r--src/mame/tch/rltennis.cpp297
-rw-r--r--src/mame/tch/rltennis.h57
-rw-r--r--src/mame/tch/rltennis_v.cpp237
-rw-r--r--src/mame/tch/speedspn.cpp20
-rw-r--r--src/mame/tch/wheelfir.cpp19
-rw-r--r--src/mame/teamconcepts/comquest.cpp15
-rw-r--r--src/mame/tecfri/ambush.cpp76
-rw-r--r--src/mame/tecfri/holeland.cpp35
-rw-r--r--src/mame/tecfri/sauro.cpp84
-rw-r--r--src/mame/tecfri/speedbal.cpp53
-rw-r--r--src/mame/technos/battlane.cpp10
-rw-r--r--src/mame/technos/blockout.cpp21
-rw-r--r--src/mame/technos/bogeyman.cpp53
-rw-r--r--src/mame/technos/chinagat.cpp20
-rw-r--r--src/mame/technos/ddragon.cpp261
-rw-r--r--src/mame/technos/ddragon.h34
-rw-r--r--src/mame/technos/ddragon3.cpp101
-rw-r--r--src/mame/technos/ddragon3.h24
-rw-r--r--src/mame/technos/ddragon3_v.cpp194
-rw-r--r--src/mame/technos/ddragon_ms.cpp186
-rw-r--r--src/mame/technos/dogfgt.cpp368
-rw-r--r--src/mame/technos/matmania.cpp84
-rw-r--r--src/mame/technos/mystston.cpp45
-rw-r--r--src/mame/technos/renegade.cpp26
-rw-r--r--src/mame/technos/shadfrce.cpp78
-rw-r--r--src/mame/technos/spdodgeb.cpp33
-rw-r--r--src/mame/technos/ssozumo.cpp50
-rw-r--r--src/mame/technos/tagteam.cpp80
-rw-r--r--src/mame/technos/vball.cpp28
-rw-r--r--src/mame/technos/wwfsstar.cpp107
-rw-r--r--src/mame/technos/xain.cpp6
-rw-r--r--src/mame/technos/xain.h14
-rw-r--r--src/mame/tecmo/bombjack.cpp63
-rw-r--r--src/mame/tecmo/gaiden.cpp974
-rw-r--r--src/mame/tecmo/gaiden.h212
-rw-r--r--src/mame/tecmo/gaiden_v.cpp358
-rw-r--r--src/mame/tecmo/lvcards.cpp20
-rw-r--r--src/mame/tecmo/pbaction.cpp62
-rw-r--r--src/mame/tecmo/senjyo.cpp825
-rw-r--r--src/mame/tecmo/senjyo.h140
-rw-r--r--src/mame/tecmo/senjyo_v.cpp314
-rw-r--r--src/mame/tecmo/shadoww_ms.cpp469
-rw-r--r--src/mame/tecmo/solomon.cpp8
-rw-r--r--src/mame/tecmo/spbactn.cpp12
-rw-r--r--src/mame/tecmo/tbowl.cpp12
-rw-r--r--src/mame/tecmo/tecmo.cpp1037
-rw-r--r--src/mame/tecmo/tecmo.h113
-rw-r--r--src/mame/tecmo/tecmo16.cpp37
-rw-r--r--src/mame/tecmo/tecmo_mix.h4
-rw-r--r--src/mame/tecmo/tecmo_v.cpp191
-rw-r--r--src/mame/tecmo/tecmosys.cpp19
-rw-r--r--src/mame/tecmo/tecmosys.h12
-rw-r--r--src/mame/tecmo/tehkanwc.cpp96
-rw-r--r--src/mame/tecmo/wc90.cpp19
-rw-r--r--src/mame/tecmo/wc90b.cpp39
-rw-r--r--src/mame/tektronix/tek405x.h12
-rw-r--r--src/mame/tektronix/tek410x.cpp8
-rw-r--r--src/mame/tektronix/tek410x_kbd.cpp46
-rw-r--r--src/mame/tektronix/tek410x_kbd.h10
-rw-r--r--src/mame/tektronix/tek43xx.cpp4
-rw-r--r--src/mame/tektronix/tek440x.cpp21
-rw-r--r--src/mame/tektronix/tek_msu_fdc.cpp25
-rw-r--r--src/mame/tektronix/tek_msu_fdc.h13
-rw-r--r--src/mame/tektronix/tekigw.cpp49
-rw-r--r--src/mame/tektronix/tekxp33x.cpp10
-rw-r--r--src/mame/tektronix/xd88.cpp8
-rw-r--r--src/mame/telenova/compis.cpp10
-rw-r--r--src/mame/telenova/compiskb.h8
-rw-r--r--src/mame/telercas/tmc1800.cpp6
-rw-r--r--src/mame/telercas/tmc1800.h32
-rw-r--r--src/mame/telercas/tmc2000e.h8
-rw-r--r--src/mame/telercas/tmc600.cpp2
-rw-r--r--src/mame/telercas/tmc600.h8
-rw-r--r--src/mame/televideo/ts3000.cpp6
-rw-r--r--src/mame/televideo/ts802.cpp13
-rw-r--r--src/mame/televideo/ts803.cpp50
-rw-r--r--src/mame/televideo/ts816.cpp11
-rw-r--r--src/mame/televideo/tv910.cpp6
-rw-r--r--src/mame/televideo/tv912.cpp14
-rw-r--r--src/mame/televideo/tv924.cpp6
-rw-r--r--src/mame/televideo/tv950.cpp6
-rw-r--r--src/mame/televideo/tv950kb.h10
-rw-r--r--src/mame/televideo/tv955.cpp12
-rw-r--r--src/mame/televideo/tv955kb.cpp4
-rw-r--r--src/mame/televideo/tv955kb.h10
-rw-r--r--src/mame/televideo/tv965.cpp162
-rw-r--r--src/mame/televideo/tv990.cpp8
-rw-r--r--src/mame/tesla/ondra.cpp2
-rw-r--r--src/mame/tesla/ondra.h8
-rw-r--r--src/mame/tesla/pmd85.cpp4
-rw-r--r--src/mame/tesla/pmd85.h20
-rw-r--r--src/mame/tesla/pmi80.cpp12
-rw-r--r--src/mame/tesla/sapi1.cpp24
-rw-r--r--src/mame/thepit/thepit.cpp1488
-rw-r--r--src/mame/thepit/thepit.h109
-rw-r--r--src/mame/thepit/thepit_v.cpp329
-rw-r--r--src/mame/thomson/thomson.cpp735
-rw-r--r--src/mame/thomson/thomson.h382
-rw-r--r--src/mame/thomson/thomson_m.cpp1833
-rw-r--r--src/mame/thomson/thomson_v.cpp1400
-rw-r--r--src/mame/thomson/to_kbd.cpp999
-rw-r--r--src/mame/thomson/to_kbd.h121
-rw-r--r--src/mame/thomson/to_video.cpp1630
-rw-r--r--src/mame/thomson/to_video.h291
-rw-r--r--src/mame/ti/733_asr.h6
-rw-r--r--src/mame/ti/911_vdt.h6
-rw-r--r--src/mame/ti/avigo.cpp22
-rw-r--r--src/mame/ti/avigo.h12
-rw-r--r--src/mame/ti/cc40.cpp12
-rw-r--r--src/mame/ti/evmbug.cpp10
-rw-r--r--src/mame/ti/exelv.cpp18
-rw-r--r--src/mame/ti/geneve.cpp108
-rw-r--r--src/mame/ti/snspell.cpp18
-rw-r--r--src/mame/ti/snspellc.cpp16
-rw-r--r--src/mame/ti/spellb.cpp14
-rw-r--r--src/mame/ti/ti74.cpp10
-rw-r--r--src/mame/ti/ti85.h32
-rw-r--r--src/mame/ti/ti89.cpp28
-rw-r--r--src/mame/ti/ti931.cpp8
-rw-r--r--src/mame/ti/ti990_10.cpp8
-rw-r--r--src/mame/ti/ti990_4.cpp10
-rw-r--r--src/mame/ti/ti99_2.cpp7
-rw-r--r--src/mame/ti/ti99_4p.cpp244
-rw-r--r--src/mame/ti/ti99_4x.cpp8
-rw-r--r--src/mame/ti/ti99_8.cpp19
-rw-r--r--src/mame/ti/tipc.cpp589
-rw-r--r--src/mame/ti/tm990189.cpp19
-rw-r--r--src/mame/tiger/bingobear.cpp8
-rw-r--r--src/mame/tiger/gamecom.h6
-rw-r--r--src/mame/tiger/k28.cpp10
-rw-r--r--src/mame/tiger/k28o.cpp48
-rw-r--r--src/mame/tiger/pylo.cpp2
-rw-r--r--src/mame/tigertel/docg3.h4
-rw-r--r--src/mame/tigertel/gizmondo.cpp36
-rw-r--r--src/mame/tiki/tiki100.cpp2
-rw-r--r--src/mame/tiki/tiki100.h8
-rw-r--r--src/mame/tiny.lst134
-rw-r--r--src/mame/tms/vet3000.cpp204
-rw-r--r--src/mame/toaplan/batsugun.cpp662
-rw-r--r--src/mame/toaplan/dogyuun.cpp494
-rw-r--r--src/mame/toaplan/dt7.cpp632
-rw-r--r--src/mame/toaplan/enmadaio.cpp397
-rw-r--r--src/mame/toaplan/fireshrk.cpp822
-rw-r--r--src/mame/toaplan/fixeight.cpp704
-rw-r--r--src/mame/toaplan/ghox.cpp330
-rw-r--r--src/mame/toaplan/gp9001.cpp92
-rw-r--r--src/mame/toaplan/gp9001.h23
-rw-r--r--src/mame/toaplan/kbash.cpp493
-rw-r--r--src/mame/toaplan/mjsister.cpp211
-rw-r--r--src/mame/toaplan/pipibibi.cpp477
-rw-r--r--src/mame/toaplan/raizing.cpp1289
-rw-r--r--src/mame/toaplan/raizing.h101
-rw-r--r--src/mame/toaplan/raizing_batrider.cpp1411
-rw-r--r--src/mame/toaplan/rallybik.cpp432
-rw-r--r--src/mame/toaplan/slapfght.cpp660
-rw-r--r--src/mame/toaplan/slapfght.h215
-rw-r--r--src/mame/toaplan/slapfght_m.cpp37
-rw-r--r--src/mame/toaplan/slapfght_ms.cpp20
-rw-r--r--src/mame/toaplan/slapfght_v.cpp76
-rw-r--r--src/mame/toaplan/snowbro2.cpp441
-rw-r--r--src/mame/toaplan/sunwise.cpp694
-rw-r--r--src/mame/toaplan/tekipaki.cpp338
-rw-r--r--src/mame/toaplan/toaplan1.cpp1780
-rw-r--r--src/mame/toaplan/toaplan1.h257
-rw-r--r--src/mame/toaplan/toaplan1_m.cpp243
-rw-r--r--src/mame/toaplan/toaplan1_v.cpp838
-rw-r--r--src/mame/toaplan/toaplan2.cpp6550
-rw-r--r--src/mame/toaplan/toaplan2.h307
-rw-r--r--src/mame/toaplan/toaplan2_v.cpp404
-rw-r--r--src/mame/toaplan/toaplan_bcu.cpp333
-rw-r--r--src/mame/toaplan/toaplan_bcu.h92
-rw-r--r--src/mame/toaplan/toaplan_coincounter.cpp43
-rw-r--r--src/mame/toaplan/toaplan_coincounter.h25
-rw-r--r--src/mame/toaplan/toaplan_dsp.cpp154
-rw-r--r--src/mame/toaplan/toaplan_dsp.h67
-rw-r--r--src/mame/toaplan/toaplan_fcu.cpp262
-rw-r--r--src/mame/toaplan/toaplan_fcu.h79
-rw-r--r--src/mame/toaplan/toaplan_scu.cpp49
-rw-r--r--src/mame/toaplan/toaplan_scu.h13
-rw-r--r--src/mame/toaplan/toaplan_txtilemap.cpp157
-rw-r--r--src/mame/toaplan/toaplan_txtilemap.h71
-rw-r--r--src/mame/toaplan/toaplan_v25_tables.h179
-rw-r--r--src/mame/toaplan/toaplan_video_controller.cpp139
-rw-r--r--src/mame/toaplan/toaplan_video_controller.h65
-rw-r--r--src/mame/toaplan/toaplipt.h6
-rw-r--r--src/mame/toaplan/truxton2.cpp291
-rw-r--r--src/mame/toaplan/twincobr.cpp234
-rw-r--r--src/mame/toaplan/twincobr.h88
-rw-r--r--src/mame/toaplan/twincobr_m.cpp184
-rw-r--r--src/mame/toaplan/twincobr_ms.cpp179
-rw-r--r--src/mame/toaplan/twincobr_v.cpp73
-rw-r--r--src/mame/toaplan/vfive.cpp341
-rw-r--r--src/mame/toaplan/wardner.cpp140
-rw-r--r--src/mame/tomy/kisssite.cpp16
-rw-r--r--src/mame/tomy/tomy_princ.cpp487
-rw-r--r--src/mame/tomy/tutor.cpp10
-rw-r--r--src/mame/torch/quadx.cpp172
-rw-r--r--src/mame/torch/triplex.cpp431
-rw-r--r--src/mame/toshiba/paso1600.cpp8
-rw-r--r--src/mame/toshiba/pasopia.cpp8
-rw-r--r--src/mame/toshiba/pasopia7.cpp407
-rw-r--r--src/mame/trainer/amico2k.cpp4
-rw-r--r--src/mame/trainer/babbage.cpp6
-rw-r--r--src/mame/trainer/bob85.cpp6
-rw-r--r--src/mame/trainer/crei680.cpp8
-rw-r--r--src/mame/trainer/cvicny.cpp4
-rw-r--r--src/mame/trainer/dolphunk.cpp10
-rw-r--r--src/mame/trainer/emma2.cpp6
-rw-r--r--src/mame/trainer/instruct.cpp10
-rw-r--r--src/mame/trainer/mac3.cpp287
-rw-r--r--src/mame/trainer/mcg85.cpp85
-rw-r--r--src/mame/trainer/mk14.cpp4
-rw-r--r--src/mame/trainer/ms68k.cpp326
-rw-r--r--src/mame/trainer/pro80.cpp10
-rw-r--r--src/mame/trainer/savia84.cpp6
-rw-r--r--src/mame/trainer/selz80.cpp12
-rw-r--r--src/mame/trainer/thaler.cpp8
-rw-r--r--src/mame/trainer/tk80.cpp14
-rw-r--r--src/mame/trainer/zapcomputer.cpp6
-rw-r--r--src/mame/trs/agvision.cpp18
-rw-r--r--src/mame/trs/coco.cpp3
-rw-r--r--src/mame/trs/coco.h10
-rw-r--r--src/mame/trs/coco12.cpp241
-rw-r--r--src/mame/trs/coco12.h28
-rw-r--r--src/mame/trs/coco3.cpp152
-rw-r--r--src/mame/trs/coco3.h8
-rw-r--r--src/mame/trs/coco3_m.cpp41
-rw-r--r--src/mame/trs/coco_vhd.h2
-rw-r--r--src/mame/trs/dgn_beta.h6
-rw-r--r--src/mame/trs/dgnalpha.cpp2
-rw-r--r--src/mame/trs/dragon.cpp168
-rw-r--r--src/mame/trs/dragon.h16
-rw-r--r--src/mame/trs/gime.cpp383
-rw-r--r--src/mame/trs/gime.h9
-rw-r--r--src/mame/trs/lnw80.cpp12
-rw-r--r--src/mame/trs/max80.cpp6
-rw-r--r--src/mame/trs/mc10.cpp8
-rw-r--r--src/mame/trs/meritum.cpp10
-rw-r--r--src/mame/trs/radionic.cpp6
-rw-r--r--src/mame/trs/tandy2k.cpp15
-rw-r--r--src/mame/trs/tandy2k.h14
-rw-r--r--src/mame/trs/tandy2kb.h10
-rw-r--r--src/mame/trs/trs80.cpp7
-rw-r--r--src/mame/trs/trs80.h16
-rw-r--r--src/mame/trs/trs80dt1.cpp18
-rw-r--r--src/mame/trs/trs80m2.cpp6
-rw-r--r--src/mame/trs/trs80m2.h16
-rw-r--r--src/mame/trs/trs80m2kb.h10
-rw-r--r--src/mame/trs/trs80m3.h22
-rw-r--r--src/mame/trs/vis.cpp63
-rw-r--r--src/mame/tryom/chess.cpp6
-rw-r--r--src/mame/tryom/gammonm.cpp2
-rw-r--r--src/mame/tryom/omar.cpp8
-rw-r--r--src/mame/tvgames/actions_atj2279b.cpp11
-rw-r--r--src/mame/tvgames/bl_handhelds_lcdc.cpp122
-rw-r--r--src/mame/tvgames/bl_handhelds_lcdc.h37
-rw-r--r--src/mame/tvgames/elan_ep3a19a.cpp272
-rw-r--r--src/mame/tvgames/elan_ep3a19asys.h38
-rw-r--r--src/mame/tvgames/elan_eu3a05.cpp611
-rw-r--r--src/mame/tvgames/elan_eu3a05commonsys.h73
-rw-r--r--src/mame/tvgames/elan_eu3a05commonvid.h35
-rw-r--r--src/mame/tvgames/elan_eu3a05gpio.cpp90
-rw-r--r--src/mame/tvgames/elan_eu3a05gpio.h49
-rw-r--r--src/mame/tvgames/elan_eu3a05sys.cpp90
-rw-r--r--src/mame/tvgames/elan_eu3a05sys.h35
-rw-r--r--src/mame/tvgames/elan_eu3a05vid.h100
-rw-r--r--src/mame/tvgames/elan_eu3a14.cpp371
-rw-r--r--src/mame/tvgames/elan_eu3a14sys.h37
-rw-r--r--src/mame/tvgames/elan_eu3a14vid.h102
-rw-r--r--src/mame/tvgames/generalplus_gp327902.cpp242
-rw-r--r--src/mame/tvgames/generalplus_gpl16250.cpp87
-rw-r--r--src/mame/tvgames/generalplus_gpl16250.h144
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_m.cpp34
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_m.h42
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_mobigo.cpp45
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_nand.cpp74
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_nand.h60
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_rom.cpp655
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_romram.cpp99
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_romram.h75
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_spi.cpp231
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_spi_direct.cpp256
-rw-r--r--src/mame/tvgames/generalplus_gpl32612.cpp417
-rw-r--r--src/mame/tvgames/generalplus_gpl_unknown.cpp638
-rw-r--r--src/mame/tvgames/generalplus_gpm453x_nand.cpp110
-rw-r--r--src/mame/tvgames/generalplus_gpm453x_sdcard.cpp178
-rw-r--r--src/mame/tvgames/gpm4530a_lexibook_jg7420.cpp94
-rw-r--r--src/mame/tvgames/hyperscan_card.h4
-rw-r--r--src/mame/tvgames/hyperscan_ctrl.h6
-rw-r--r--src/mame/tvgames/magiceyes_pollux_vr3520f.cpp11
-rw-r--r--src/mame/tvgames/micom_mahjong.cpp23
-rw-r--r--src/mame/tvgames/monkey_king_3b.cpp23
-rw-r--r--src/mame/tvgames/myaatari.cpp116
-rw-r--r--src/mame/tvgames/pubint_storyreader.cpp8
-rw-r--r--src/mame/tvgames/spg110.cpp401
-rw-r--r--src/mame/tvgames/spg29x.cpp35
-rw-r--r--src/mame/tvgames/spg29x_lexibook_jg7425.cpp53
-rw-r--r--src/mame/tvgames/spg2xx.cpp1011
-rw-r--r--src/mame/tvgames/spg2xx.h191
-rw-r--r--src/mame/tvgames/spg2xx_digimake.cpp2
-rw-r--r--src/mame/tvgames/spg2xx_dreamlife.cpp33
-rw-r--r--src/mame/tvgames/spg2xx_ican.cpp4
-rw-r--r--src/mame/tvgames/spg2xx_jakks.cpp630
-rw-r--r--src/mame/tvgames/spg2xx_jakks_gkr.cpp58
-rw-r--r--src/mame/tvgames/spg2xx_jakks_sharp.cpp2
-rw-r--r--src/mame/tvgames/spg2xx_jakks_tvtouch.cpp4
-rw-r--r--src/mame/tvgames/spg2xx_lexibook.cpp118
-rw-r--r--src/mame/tvgames/spg2xx_mysprtch.cpp8
-rw-r--r--src/mame/tvgames/spg2xx_pdc.cpp57
-rw-r--r--src/mame/tvgames/spg2xx_playvision.cpp4
-rw-r--r--src/mame/tvgames/spg2xx_senario.cpp20
-rw-r--r--src/mame/tvgames/spg2xx_senario_poker.cpp30
-rw-r--r--src/mame/tvgames/spg2xx_senca.cpp10
-rw-r--r--src/mame/tvgames/spg2xx_smarttv.cpp4
-rw-r--r--src/mame/tvgames/spg2xx_telestory.cpp6
-rw-r--r--src/mame/tvgames/spg2xx_tvgogo.cpp4
-rw-r--r--src/mame/tvgames/spg2xx_vii.cpp4
-rw-r--r--src/mame/tvgames/spg2xx_wiwi.cpp89
-rw-r--r--src/mame/tvgames/spg2xx_zone.cpp67
-rw-r--r--src/mame/tvgames/st2302u_bbl_spi.cpp392
-rw-r--r--src/mame/tvgames/titan_soc.cpp13
-rw-r--r--src/mame/tvgames/trkfldch.cpp204
-rw-r--r--src/mame/tvgames/tvgame.cpp4
-rw-r--r--src/mame/tvgames/xavix.cpp1341
-rw-r--r--src/mame/tvgames/xavix.h694
-rw-r--r--src/mame/tvgames/xavix2.cpp137
-rw-r--r--src/mame/tvgames/xavix2002_io.cpp21
-rw-r--r--src/mame/tvgames/xavix2002_io.h4
-rw-r--r--src/mame/tvgames/xavix_2000.cpp212
-rw-r--r--src/mame/tvgames/xavix_2000.h8
-rw-r--r--src/mame/tvgames/xavix_2002.cpp865
-rw-r--r--src/mame/tvgames/xavix_2002.h125
-rw-r--r--src/mame/tvgames/xavix_a.cpp534
-rw-r--r--src/mame/tvgames/xavix_adc.h4
-rw-r--r--src/mame/tvgames/xavix_anport.h4
-rw-r--r--src/mame/tvgames/xavix_io.h4
-rw-r--r--src/mame/tvgames/xavix_m.cpp425
-rw-r--r--src/mame/tvgames/xavix_madfb_ball.cpp2
-rw-r--r--src/mame/tvgames/xavix_madfb_ball.h6
-rw-r--r--src/mame/tvgames/xavix_math.cpp205
-rw-r--r--src/mame/tvgames/xavix_math.h14
-rw-r--r--src/mame/tvgames/xavix_mtrk_wheel.cpp2
-rw-r--r--src/mame/tvgames/xavix_mtrk_wheel.h6
-rw-r--r--src/mame/tvgames/xavix_sound.cpp903
-rw-r--r--src/mame/tvgames/xavix_sound.h139
-rw-r--r--src/mame/tvgames/xavix_v.cpp893
-rw-r--r--src/mame/ultimachine/rambo.cpp14
-rw-r--r--src/mame/ultratec/minicom.cpp9
-rw-r--r--src/mame/umc/pc486vl.cpp232
-rw-r--r--src/mame/umc/supracan.cpp2473
-rw-r--r--src/mame/umc/umc6619_sound.cpp355
-rw-r--r--src/mame/umc/umc6619_sound.h73
-rw-r--r--src/mame/umc/umc6650.cpp80
-rw-r--r--src/mame/umc/umc6650.h33
-rw-r--r--src/mame/unicard/bbcbc.cpp8
-rw-r--r--src/mame/unico/drgnmst.h20
-rw-r--r--src/mame/unico/goori.cpp23
-rw-r--r--src/mame/unico/silkroad.cpp21
-rw-r--r--src/mame/unico/unianapc.cpp13
-rw-r--r--src/mame/unico/unico.cpp53
-rw-r--r--src/mame/unisonic/gic.cpp10
-rw-r--r--src/mame/unisonic/gic.h8
-rw-r--r--src/mame/unisonic/unichamp.cpp4
-rw-r--r--src/mame/unisys/univac.cpp10
-rw-r--r--src/mame/universal/cheekyms.cpp13
-rw-r--r--src/mame/universal/cheekyms_a.h4
-rw-r--r--src/mame/universal/cosmic.cpp72
-rw-r--r--src/mame/universal/cosmic.h12
-rw-r--r--src/mame/universal/cosmicg.cpp10
-rw-r--r--src/mame/universal/docastle.cpp1209
-rw-r--r--src/mame/universal/docastle.h103
-rw-r--r--src/mame/universal/docastle_m.cpp90
-rw-r--r--src/mame/universal/docastle_v.cpp222
-rw-r--r--src/mame/universal/getaway.cpp6
-rw-r--r--src/mame/universal/ladybug.cpp50
-rw-r--r--src/mame/universal/ladybug_video.h8
-rw-r--r--src/mame/universal/mrdo.cpp2
-rw-r--r--src/mame/universal/mrdo.h8
-rw-r--r--src/mame/universal/pachislo_z80.cpp105
-rw-r--r--src/mame/universal/sraider.cpp10
-rw-r--r--src/mame/universal/superdq.cpp19
-rw-r--r--src/mame/universal/zerohour.cpp60
-rw-r--r--src/mame/universal/zerohour_stars.h4
-rw-r--r--src/mame/upl/mouser.cpp14
-rw-r--r--src/mame/upl/ninjakd2.cpp132
-rw-r--r--src/mame/upl/ninjakd2.h28
-rw-r--r--src/mame/upl/nova2001.cpp12
-rw-r--r--src/mame/upl/nova2001.h20
-rw-r--r--src/mame/upl/xxmissio.cpp26
-rw-r--r--src/mame/usp/patinho_feio.cpp312
-rw-r--r--src/mame/usp/patinhofeio.cpp384
-rw-r--r--src/mame/usp/patinhofeio.h61
-rw-r--r--src/mame/ussr/1801vp014.cpp4
-rw-r--r--src/mame/ussr/1801vp014.h6
-rw-r--r--src/mame/ussr/1801vp033.cpp227
-rw-r--r--src/mame/ussr/1801vp033.h117
-rw-r--r--src/mame/ussr/apogee.cpp6
-rw-r--r--src/mame/ussr/argo.cpp8
-rw-r--r--src/mame/ussr/b2m.cpp10
-rw-r--r--src/mame/ussr/b2m.h14
-rw-r--r--src/mame/ussr/b2m_m.cpp14
-rw-r--r--src/mame/ussr/bk.cpp226
-rw-r--r--src/mame/ussr/bk.h70
-rw-r--r--src/mame/ussr/bk_m.cpp222
-rw-r--r--src/mame/ussr/cm1800.cpp6
-rw-r--r--src/mame/ussr/debut.cpp33
-rw-r--r--src/mame/ussr/dvk_kcgd.cpp332
-rw-r--r--src/mame/ussr/dvk_ksm.cpp11
-rw-r--r--src/mame/ussr/im01.cpp8
-rw-r--r--src/mame/ussr/intellect02.cpp8
-rw-r--r--src/mame/ussr/irisha.cpp8
-rw-r--r--src/mame/ussr/istrebiteli.cpp46
-rw-r--r--src/mame/ussr/juku.cpp841
-rw-r--r--src/mame/ussr/jukumouse.cpp118
-rw-r--r--src/mame/ussr/jukumouse.h35
-rw-r--r--src/mame/ussr/km035.h12
-rw-r--r--src/mame/ussr/krokha.cpp2
-rw-r--r--src/mame/ussr/lviv.cpp2
-rw-r--r--src/mame/ussr/lviv.h8
-rw-r--r--src/mame/ussr/mikro80.h12
-rw-r--r--src/mame/ussr/mikrosha.cpp8
-rw-r--r--src/mame/ussr/mk85.cpp6
-rw-r--r--src/mame/ussr/mk90.cpp6
-rw-r--r--src/mame/ussr/mk98.cpp10
-rw-r--r--src/mame/ussr/ms0515.cpp12
-rw-r--r--src/mame/ussr/ms6102.cpp8
-rw-r--r--src/mame/ussr/okean240.cpp8
-rw-r--r--src/mame/ussr/orion.h27
-rw-r--r--src/mame/ussr/partner.h6
-rw-r--r--src/mame/ussr/pk32.cpp255
-rw-r--r--src/mame/ussr/pk8000.cpp8
-rw-r--r--src/mame/ussr/pk8020.cpp181
-rw-r--r--src/mame/ussr/pk8020.h29
-rw-r--r--src/mame/ussr/pk8020_m.cpp39
-rw-r--r--src/mame/ussr/pk8020_v.cpp20
-rw-r--r--src/mame/ussr/pyl601.cpp6
-rw-r--r--src/mame/ussr/radio86.h20
-rw-r--r--src/mame/ussr/sm1800.cpp6
-rw-r--r--src/mame/ussr/sm7238.cpp8
-rw-r--r--src/mame/ussr/special.h22
-rw-r--r--src/mame/ussr/special_gambl.cpp16
-rw-r--r--src/mame/ussr/specialsound.cpp14
-rw-r--r--src/mame/ussr/specialsound.h12
-rw-r--r--src/mame/ussr/tiamc1.cpp10
-rw-r--r--src/mame/ussr/tiamc1.h12
-rw-r--r--src/mame/ussr/tiamc1_a.cpp6
-rw-r--r--src/mame/ussr/tiamc1_a.h4
-rw-r--r--src/mame/ussr/uknc.cpp8
-rw-r--r--src/mame/ussr/unior.cpp8
-rw-r--r--src/mame/ussr/ut88.h16
-rw-r--r--src/mame/ussr/vector06.cpp4
-rw-r--r--src/mame/ussr/vector06.h8
-rw-r--r--src/mame/ussr/vm1timer.cpp184
-rw-r--r--src/mame/ussr/vm1timer.h63
-rw-r--r--src/mame/ussr/vta2000.cpp4
-rw-r--r--src/mame/valadon/bagman.cpp6
-rw-r--r--src/mame/valadon/bagman.h18
-rw-r--r--src/mame/valadon/tankbust.cpp15
-rw-r--r--src/mame/vectorgraphic/sbcvideo.h8
-rw-r--r--src/mame/vectorgraphic/v4_kbd.h10
-rw-r--r--src/mame/vectorgraphic/vector4.cpp10
-rw-r--r--src/mame/venture/looping.cpp879
-rw-r--r--src/mame/verifone/tranz330.cpp2
-rw-r--r--src/mame/verifone/tranz330.h16
-rw-r--r--src/mame/vidbrain/uv201.h4
-rw-r--r--src/mame/vidbrain/vidbrain.cpp10
-rw-r--r--src/mame/videogames/looping.cpp987
-rw-r--r--src/mame/videogames/supertnk.cpp (renamed from src/mame/misc/supertnk.cpp)15
-rw-r--r--src/mame/videogames/video21.cpp322
-rw-r--r--src/mame/videoton/tvc.cpp30
-rw-r--r--src/mame/videoton/tvc_a.cpp14
-rw-r--r--src/mame/videoton/tvc_a.h6
-rw-r--r--src/mame/virtual/dsp563xx.ipp11825
-rw-r--r--src/mame/virtual/dsp563xx.lst998
-rw-r--r--src/mame/virtual/ldplayer.cpp77
-rw-r--r--src/mame/virtual/utdsp563xx.cpp706
-rwxr-xr-xsrc/mame/virtual/utdsp563xx.py120
-rw-r--r--src/mame/virtual/utm6502.cpp254
-rw-r--r--src/mame/virtual/vgmplay.cpp526
-rw-r--r--src/mame/virtual/wavesynth.cpp9
-rw-r--r--src/mame/visual/v100.cpp8
-rw-r--r--src/mame/visual/v102.cpp8
-rw-r--r--src/mame/visual/v102_kbd.h18
-rw-r--r--src/mame/visual/v1050.h12
-rw-r--r--src/mame/visual/v1050kb.h10
-rw-r--r--src/mame/visual/v50.cpp10
-rw-r--r--src/mame/visual/v50_kbd.h10
-rw-r--r--src/mame/visual/v550.cpp12
-rw-r--r--src/mame/visual/xds.cpp11
-rw-r--r--src/mame/visual/xds_kbd.h6
-rw-r--r--src/mame/votrax/votrhv.cpp298
-rw-r--r--src/mame/votrax/votrpss.cpp6
-rw-r--r--src/mame/votrax/votrtnt.cpp119
-rw-r--r--src/mame/vsystem/aerofgt.cpp48
-rw-r--r--src/mame/vsystem/crshrace.cpp71
-rw-r--r--src/mame/vsystem/f1gp.cpp197
-rw-r--r--src/mame/vsystem/fromanc2.cpp120
-rw-r--r--src/mame/vsystem/fromanc2.h26
-rw-r--r--src/mame/vsystem/fromance.cpp185
-rw-r--r--src/mame/vsystem/fromance.h27
-rw-r--r--src/mame/vsystem/gstriker.cpp54
-rw-r--r--src/mame/vsystem/inufuku.cpp26
-rw-r--r--src/mame/vsystem/mb60553.h10
-rw-r--r--src/mame/vsystem/ojankohs.cpp706
-rw-r--r--src/mame/vsystem/ojankohs.h189
-rw-r--r--src/mame/vsystem/ojankohs_v.cpp291
-rw-r--r--src/mame/vsystem/pipedrm.cpp52
-rw-r--r--src/mame/vsystem/pspikes.cpp221
-rw-r--r--src/mame/vsystem/pspikes_ms.cpp181
-rw-r--r--src/mame/vsystem/rpunch.cpp20
-rw-r--r--src/mame/vsystem/suprslam.cpp23
-rw-r--r--src/mame/vsystem/tail2nos.cpp156
-rw-r--r--src/mame/vsystem/taotaido.cpp21
-rw-r--r--src/mame/vsystem/vs9209.h4
-rw-r--r--src/mame/vsystem/vs920a.h4
-rw-r--r--src/mame/vsystem/vsystem_gga.h2
-rw-r--r--src/mame/vsystem/vsystem_spr.cpp2
-rw-r--r--src/mame/vsystem/vsystem_spr.h4
-rw-r--r--src/mame/vsystem/vsystem_spr2.h4
-rw-r--r--src/mame/vsystem/welltris.cpp14
-rw-r--r--src/mame/vtech/clickstart.cpp99
-rw-r--r--src/mame/vtech/crvision.cpp4
-rw-r--r--src/mame/vtech/crvision.h8
-rw-r--r--src/mame/vtech/gamemachine.cpp14
-rw-r--r--src/mame/vtech/geniuscolor.cpp80
-rw-r--r--src/mame/vtech/geniusiq.cpp326
-rw-r--r--src/mame/vtech/geniusjr.cpp40
-rw-r--r--src/mame/vtech/gkidabc.cpp72
-rw-r--r--src/mame/vtech/glcx.cpp10
-rw-r--r--src/mame/vtech/innotv_innotabmax.cpp9
-rw-r--r--src/mame/vtech/inteladv.cpp14
-rw-r--r--src/mame/vtech/iqunlim.cpp10
-rw-r--r--src/mame/vtech/kidsupstar.cpp8
-rw-r--r--src/mame/vtech/laser3k.cpp308
-rw-r--r--src/mame/vtech/lcmate2.cpp6
-rw-r--r--src/mame/vtech/learnwin.cpp14
-rw-r--r--src/mame/vtech/magibook.cpp72
-rw-r--r--src/mame/vtech/nl_gamemachine.cpp3
-rw-r--r--src/mame/vtech/pc1000.cpp8
-rw-r--r--src/mame/vtech/pc2000.cpp137
-rw-r--r--src/mame/vtech/pc4.h6
-rw-r--r--src/mame/vtech/phusion.cpp4
-rw-r--r--src/mame/vtech/prestige.cpp113
-rw-r--r--src/mame/vtech/primusex.cpp347
-rw-r--r--src/mame/vtech/socrates.cpp210
-rw-r--r--src/mame/vtech/socrates_a.cpp6
-rw-r--r--src/mame/vtech/socrates_a.h4
-rw-r--r--src/mame/vtech/storio.cpp26
-rw-r--r--src/mame/vtech/vsmile.cpp7
-rw-r--r--src/mame/vtech/vsmile.h16
-rw-r--r--src/mame/vtech/vsmileb.cpp26
-rw-r--r--src/mame/vtech/vsmilepro.cpp4
-rw-r--r--src/mame/vtech/vtech1.cpp22
-rw-r--r--src/mame/vtech/vtech2.cpp2
-rw-r--r--src/mame/vtech/vtech2.h14
-rw-r--r--src/mame/vtech/vtech5303.cpp86
-rw-r--r--src/mame/vtech/vtech_eu3a12.cpp32
-rw-r--r--src/mame/vtech/vtech_innotab.cpp8
-rw-r--r--src/mame/wang/wangpc.cpp8
-rw-r--r--src/mame/wang/wangpckb.cpp6
-rw-r--r--src/mame/wang/wangpckb.h14
-rw-r--r--src/mame/wavemate/bullet.cpp6
-rw-r--r--src/mame/wavemate/bullet.h16
-rw-r--r--src/mame/wavemate/jupiter.cpp10
-rw-r--r--src/mame/westinghouse/testconsole.cpp4
-rw-r--r--src/mame/wicat/t7000.cpp13
-rw-r--r--src/mame/wicat/wicat.cpp21
-rw-r--r--src/mame/wing/luckgrln.cpp169
-rw-r--r--src/mame/wing/lucky37.cpp72
-rw-r--r--src/mame/wing/lucky74.cpp58
-rw-r--r--src/mame/wing/lucky74.h10
-rw-r--r--src/mame/wing/pinkiri8.cpp735
-rw-r--r--src/mame/wing/slotcarn.cpp22
-rw-r--r--src/mame/wing/superwng.cpp14
-rw-r--r--src/mame/wyse/wy100.cpp10
-rw-r--r--src/mame/wyse/wy150.cpp18
-rw-r--r--src/mame/wyse/wy30p.cpp43
-rw-r--r--src/mame/wyse/wy50.cpp20
-rw-r--r--src/mame/wyse/wy50kb.h6
-rw-r--r--src/mame/wyse/wy55.cpp24
-rw-r--r--src/mame/wyse/wy60.cpp12
-rw-r--r--src/mame/wyse/wy85.cpp274
-rw-r--r--src/mame/xerox/alto1.cpp2
-rw-r--r--src/mame/xerox/alto2.cpp10
-rw-r--r--src/mame/xerox/bigbord2.cpp19
-rw-r--r--src/mame/xerox/notetaker.cpp19
-rw-r--r--src/mame/xerox/x820kb.h10
-rw-r--r--src/mame/xerox/xerox820.cpp32
-rw-r--r--src/mame/xerox/xerox820.h20
-rw-r--r--src/mame/yachiyo/atamanot.cpp537
-rw-r--r--src/mame/yachiyo/mole.cpp365
-rw-r--r--src/mame/yachiyo/ssingles.cpp320
-rw-r--r--src/mame/yachiyo/sstrangr.cpp (renamed from src/mame/misc/sstrangr.cpp)21
-rw-r--r--src/mame/yamaha/fb01.cpp15
-rw-r--r--src/mame/yamaha/mks3.cpp413
-rw-r--r--src/mame/yamaha/mks3.h40
-rw-r--r--src/mame/yamaha/mu5lcd.cpp9
-rw-r--r--src/mame/yamaha/mu5lcd.h10
-rw-r--r--src/mame/yamaha/mulcd.cpp37
-rw-r--r--src/mame/yamaha/mulcd.h19
-rw-r--r--src/mame/yamaha/tg100.cpp11
-rw-r--r--src/mame/yamaha/yman1x.cpp7
-rw-r--r--src/mame/yamaha/ymdx100.cpp19
-rw-r--r--src/mame/yamaha/ymdx11.cpp13
-rw-r--r--src/mame/yamaha/ymdx7.cpp6
-rw-r--r--src/mame/yamaha/ymdx9.cpp6
-rw-r--r--src/mame/yamaha/ymmu10.cpp59
-rw-r--r--src/mame/yamaha/ymmu100.cpp33
-rw-r--r--src/mame/yamaha/ymmu128.cpp29
-rw-r--r--src/mame/yamaha/ymmu15.cpp39
-rw-r--r--src/mame/yamaha/ymmu2000.cpp99
-rw-r--r--src/mame/yamaha/ymmu5.cpp15
-rw-r--r--src/mame/yamaha/ymmu50.cpp76
-rw-r--r--src/mame/yamaha/ymmu80.cpp25
-rw-r--r--src/mame/yamaha/ymmu90.cpp64
-rw-r--r--src/mame/yamaha/ympcs30.cpp4
-rw-r--r--src/mame/yamaha/ymps400.cpp4
-rw-r--r--src/mame/yamaha/ympsr11.cpp4
-rw-r--r--src/mame/yamaha/ympsr150.cpp964
-rw-r--r--src/mame/yamaha/ympsr16.cpp24
-rw-r--r--src/mame/yamaha/ympsr2000.cpp32
-rw-r--r--src/mame/yamaha/ympsr260.cpp6
-rw-r--r--src/mame/yamaha/ympsr340.cpp28
-rw-r--r--src/mame/yamaha/ympsr40.cpp4
-rw-r--r--src/mame/yamaha/ympsr400.cpp15
-rw-r--r--src/mame/yamaha/ympsr540.cpp45
-rw-r--r--src/mame/yamaha/ympsr60.cpp59
-rw-r--r--src/mame/yamaha/ympss170.cpp227
-rw-r--r--src/mame/yamaha/ymqs300.cpp15
-rw-r--r--src/mame/yamaha/ymqy70.cpp9
-rw-r--r--src/mame/yamaha/ymrx15.cpp11
-rw-r--r--src/mame/yamaha/ymsy35.cpp6
-rw-r--r--src/mame/yamaha/ymtx81z.cpp11
-rw-r--r--src/mame/yamaha/ymvl1.cpp12
-rw-r--r--src/mame/yamaha/ymvl70.cpp15
-rw-r--r--src/mame/yeno/301xl.cpp10
-rw-r--r--src/mame/yeno/416xl.cpp4
-rw-r--r--src/mame/yeno/532xl.cpp4
-rw-r--r--src/mame/yunsung/nmg5.cpp16
-rw-r--r--src/mame/yunsung/paradise.cpp28
-rw-r--r--src/mame/yunsung/yunsun16.cpp40
-rw-r--r--src/mame/yunsung/yunsung8.cpp23
-rw-r--r--src/mame/zaccaria/galaxia.cpp889
-rw-r--r--src/mame/zaccaria/laserbat.h8
-rw-r--r--src/mame/zaccaria/laserbat_v.cpp18
-rw-r--r--src/mame/zaccaria/quasar.cpp664
-rw-r--r--src/mame/zaccaria/seabattl.cpp30
-rw-r--r--src/mame/zaccaria/zac1b1120.cpp10
-rw-r--r--src/mame/zaccaria/zaccaria.cpp481
-rw-r--r--src/mame/zaccaria/zaccaria.h72
-rw-r--r--src/mame/zaccaria/zaccaria_a.cpp21
-rw-r--r--src/mame/zaccaria/zaccaria_a.h24
-rw-r--r--src/mame/zaccaria/zaccaria_v.cpp252
-rw-r--r--src/mame/zpa/iq151.cpp46
-rw-r--r--src/mame/zvt/pp01.cpp42
-rw-r--r--src/mame/zvt/pp01.h69
-rw-r--r--src/mame/zvt/pp01_m.cpp149
-rw-r--r--src/mame/zvt/pp01_v.cpp20
-rw-r--r--src/osd/asio.h8
-rw-r--r--src/osd/eigcc.h68
-rw-r--r--src/osd/eigccarm.h34
-rw-r--r--src/osd/eigccx86.h69
-rw-r--r--src/osd/eivc.h8
-rw-r--r--src/osd/eivcx86.h38
-rw-r--r--src/osd/eminline.h108
-rw-r--r--src/osd/interface/audio.cpp51
-rw-r--r--src/osd/interface/audio.h162
-rw-r--r--src/osd/interface/inputcode.h16
-rw-r--r--src/osd/interface/midiport.h10
-rw-r--r--src/osd/interface/nethandler.cpp1
-rw-r--r--src/osd/interface/nethandler.h27
-rw-r--r--src/osd/mac/macmain.cpp1
-rw-r--r--src/osd/modules/debugger/debuggdbstub.cpp922
-rw-r--r--src/osd/modules/debugger/debugimgui.cpp22
-rw-r--r--src/osd/modules/debugger/debugosx.mm11
-rw-r--r--src/osd/modules/debugger/debugqt.cpp18
-rw-r--r--src/osd/modules/debugger/debugwin.cpp30
-rw-r--r--src/osd/modules/debugger/osx/debugconsole.mm4
-rw-r--r--src/osd/modules/debugger/osx/debugview.mm50
-rw-r--r--src/osd/modules/debugger/osx/disassemblyview.mm6
-rw-r--r--src/osd/modules/debugger/osx/disassemblyviewer.mm16
-rw-r--r--src/osd/modules/debugger/osx/exceptionpointsview.h23
-rw-r--r--src/osd/modules/debugger/osx/exceptionpointsview.mm27
-rw-r--r--src/osd/modules/debugger/osx/memoryview.mm4
-rw-r--r--src/osd/modules/debugger/osx/memoryviewer.mm8
-rw-r--r--src/osd/modules/debugger/osx/pointsviewer.mm40
-rw-r--r--src/osd/modules/debugger/qt/breakpointswindow.cpp21
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.cpp13
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.cpp34
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.h4
-rw-r--r--src/osd/modules/debugger/qt/deviceinformationwindow.cpp4
-rw-r--r--src/osd/modules/debugger/qt/logwindow.cpp4
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.cpp9
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.cpp19
-rw-r--r--src/osd/modules/debugger/qt/windowqt.cpp1
-rw-r--r--src/osd/modules/debugger/qt/windowqt.h4
-rw-r--r--src/osd/modules/debugger/win/consolewininfo.cpp54
-rw-r--r--src/osd/modules/debugger/win/consolewininfo.h8
-rw-r--r--src/osd/modules/debugger/win/debugviewinfo.cpp11
-rw-r--r--src/osd/modules/debugger/win/debugwin.h3
-rw-r--r--src/osd/modules/debugger/win/debugwininfo.cpp18
-rw-r--r--src/osd/modules/debugger/win/debugwininfo.h5
-rw-r--r--src/osd/modules/debugger/win/disasmbasewininfo.cpp24
-rw-r--r--src/osd/modules/debugger/win/disasmbasewininfo.h2
-rw-r--r--src/osd/modules/debugger/win/disasmwininfo.cpp27
-rw-r--r--src/osd/modules/debugger/win/editwininfo.cpp13
-rw-r--r--src/osd/modules/debugger/win/editwininfo.h5
-rw-r--r--src/osd/modules/debugger/win/memoryviewinfo.cpp6
-rw-r--r--src/osd/modules/debugger/win/memorywininfo.cpp2
-rw-r--r--src/osd/modules/debugger/win/pointswininfo.cpp21
-rw-r--r--src/osd/modules/debugger/xmlconfig.cpp1
-rw-r--r--src/osd/modules/debugger/xmlconfig.h1
-rw-r--r--src/osd/modules/file/posixdir.cpp17
-rw-r--r--src/osd/modules/file/posixfile.cpp18
-rw-r--r--src/osd/modules/file/posixptty.cpp95
-rw-r--r--src/osd/modules/file/stdfile.cpp28
-rw-r--r--src/osd/modules/file/winfile.cpp36
-rw-r--r--src/osd/modules/file/winrtfile.cpp18
-rw-r--r--src/osd/modules/font/font_dwrite.cpp30
-rw-r--r--src/osd/modules/font/font_sdl.cpp9
-rw-r--r--src/osd/modules/font/font_sdl3.cpp389
-rw-r--r--src/osd/modules/input/input_common.cpp30
-rw-r--r--src/osd/modules/input/input_common.h22
-rw-r--r--src/osd/modules/input/input_dinput.cpp10
-rw-r--r--src/osd/modules/input/input_rawinput.cpp13
-rw-r--r--src/osd/modules/input/input_sdl.cpp94
-rw-r--r--src/osd/modules/input/input_sdl3.cpp2957
-rw-r--r--src/osd/modules/input/input_win32.cpp177
-rw-r--r--src/osd/modules/input/input_winhybrid.cpp3
-rw-r--r--src/osd/modules/input/input_x11.cpp4
-rw-r--r--src/osd/modules/lib/osdlib_macosx.cpp17
-rw-r--r--src/osd/modules/lib/osdlib_unix.cpp87
-rw-r--r--src/osd/modules/lib/osdlib_win32.cpp38
-rw-r--r--src/osd/modules/lib/osdobj_common.cpp165
-rw-r--r--src/osd/modules/lib/osdobj_common.h53
-rw-r--r--src/osd/modules/midi/midi_module.h12
-rw-r--r--src/osd/modules/midi/none.cpp2
-rw-r--r--src/osd/modules/midi/portmidi.cpp10
-rw-r--r--src/osd/modules/monitor/monitor_dxgi.cpp73
-rw-r--r--src/osd/modules/monitor/monitor_module.h25
-rw-r--r--src/osd/modules/monitor/monitor_sdl.cpp30
-rw-r--r--src/osd/modules/monitor/monitor_win32.cpp50
-rw-r--r--src/osd/modules/netdev/netdev_common.cpp39
-rw-r--r--src/osd/modules/netdev/netdev_common.h36
-rw-r--r--src/osd/modules/netdev/netdev_module.h9
-rw-r--r--src/osd/modules/netdev/none.cpp19
-rw-r--r--src/osd/modules/netdev/pcap.cpp214
-rw-r--r--src/osd/modules/netdev/taptun.cpp105
-rw-r--r--src/osd/modules/opengl/osd_opengl.h11
-rw-r--r--src/osd/modules/osdmodule.h2
-rw-r--r--src/osd/modules/osdwindow.h1
-rw-r--r--src/osd/modules/output/console.cpp2
-rw-r--r--src/osd/modules/output/network.cpp5
-rw-r--r--src/osd/modules/output/none.cpp2
-rw-r--r--src/osd/modules/render/aviwrite.cpp9
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp2
-rw-r--r--src/osd/modules/render/bgfx/shadermanager.cpp9
-rw-r--r--src/osd/modules/render/bgfx/shaders/shader.mk2
-rw-r--r--src/osd/modules/render/draw13.cpp8
-rw-r--r--src/osd/modules/render/drawbgfx.cpp122
-rw-r--r--src/osd/modules/render/drawogl.cpp19
-rw-r--r--src/osd/modules/render/drawsdl.cpp10
-rw-r--r--src/osd/modules/render/drawsdl3accel.cpp1165
-rw-r--r--src/osd/modules/render/drawsdl3soft.cpp713
-rw-r--r--src/osd/modules/render/sdlglcontext.h12
-rw-r--r--src/osd/modules/sound/coreaudio_sound.cpp2157
-rw-r--r--src/osd/modules/sound/direct_sound.cpp584
-rw-r--r--src/osd/modules/sound/js_sound.cpp100
-rw-r--r--src/osd/modules/sound/js_sound.js32
-rw-r--r--src/osd/modules/sound/mmdevice_helpers.cpp355
-rw-r--r--src/osd/modules/sound/mmdevice_helpers.h149
-rw-r--r--src/osd/modules/sound/none.cpp17
-rw-r--r--src/osd/modules/sound/pa_sound.cpp621
-rw-r--r--src/osd/modules/sound/pipewire_sound.cpp837
-rw-r--r--src/osd/modules/sound/pulse_sound.cpp647
-rw-r--r--src/osd/modules/sound/sdl3_sound.cpp381
-rw-r--r--src/osd/modules/sound/sdl_sound.cpp547
-rw-r--r--src/osd/modules/sound/sound_module.cpp204
-rw-r--r--src/osd/modules/sound/sound_module.h79
-rw-r--r--src/osd/modules/sound/wasapi_sound.cpp1670
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp1730
-rw-r--r--src/osd/osdcore.h11
-rw-r--r--src/osd/osdepend.h27
-rw-r--r--src/osd/osdfile.h26
-rw-r--r--src/osd/osdnet.cpp110
-rw-r--r--src/osd/osdnet.h66
-rw-r--r--src/osd/osdsync.cpp12
-rw-r--r--src/osd/sdl/osdsdl.cpp5
-rw-r--r--src/osd/sdl/sdlprefix.h23
-rwxr-xr-xsrc/osd/sdl/taputil.sh2
-rw-r--r--src/osd/sdl/video.cpp12
-rw-r--r--src/osd/sdl/window.cpp4
-rw-r--r--src/osd/sdl3/android_main.cpp11
-rw-r--r--src/osd/sdl3/osdsdl.cpp893
-rw-r--r--src/osd/sdl3/osdsdl.h216
-rw-r--r--src/osd/sdl3/sdlmain.cpp118
-rw-r--r--src/osd/sdl3/sdlopts.cpp127
-rw-r--r--src/osd/sdl3/sdlopts.h104
-rw-r--r--src/osd/sdl3/sdlprefix.h65
-rwxr-xr-xsrc/osd/sdl3/taputil.sh43
-rw-r--r--src/osd/sdl3/video.cpp192
-rw-r--r--src/osd/sdl3/window.cpp1404
-rw-r--r--src/osd/sdl3/window.h133
-rw-r--r--src/osd/strconv.cpp8
-rw-r--r--src/osd/windows/window.cpp114
-rw-r--r--src/osd/windows/window.h8
-rw-r--r--src/osd/windows/winmain.cpp67
-rw-r--r--src/osd/windows/winmain.h17
-rw-r--r--src/tools/aueffectutil-Info.plist45
-rw-r--r--src/tools/aueffectutil.mm1053
-rw-r--r--src/tools/castool.cpp2
-rw-r--r--src/tools/chdman.cpp153
-rw-r--r--src/tools/floptool.cpp908
-rw-r--r--src/tools/image_handler.cpp18
-rw-r--r--src/tools/image_handler.h2
-rw-r--r--src/tools/imgtool/filtbas.cpp216
-rw-r--r--src/tools/imgtool/filteoln.cpp4
-rw-r--r--src/tools/imgtool/filter.cpp27
-rw-r--r--src/tools/imgtool/filter.h46
-rw-r--r--src/tools/imgtool/imgtool.cpp244
-rw-r--r--src/tools/imgtool/imgtool.h19
-rw-r--r--src/tools/imgtool/library.h257
-rw-r--r--src/tools/imgtool/main.cpp148
-rw-r--r--src/tools/imgtool/modules/amiga.cpp6
-rw-r--r--src/tools/imgtool/modules/bml3.cpp26
-rw-r--r--src/tools/imgtool/modules/dgndos.cpp24
-rw-r--r--src/tools/imgtool/modules/fat.cpp34
-rw-r--r--src/tools/imgtool/modules/hp85_tape.cpp2
-rw-r--r--src/tools/imgtool/modules/hp9845_tape.cpp2
-rw-r--r--src/tools/imgtool/modules/os9.cpp2
-rw-r--r--src/tools/imgtool/modules/pc_hard.cpp1
-rw-r--r--src/tools/imgtool/modules/rsdos.cpp24
-rw-r--r--src/tools/imgtool/modules/thomson.cpp206
-rw-r--r--src/tools/imgtool/modules/vzdos.cpp148
-rw-r--r--src/tools/jedutil.cpp2
-rw-r--r--src/tools/ldresample.cpp4
-rw-r--r--src/tools/ldverify.cpp4
-rw-r--r--src/tools/pngcmp.cpp4
-rw-r--r--src/tools/romcmp.cpp6
-rw-r--r--src/tools/split.cpp2
-rw-r--r--src/tools/testkeys.cpp90
-rw-r--r--src/tools/unidasm.cpp88
-rw-r--r--src/zexall/main.cpp2
-rw-r--r--src/zexall/zexall.cpp4
-rw-r--r--uismall.bdf135
-rw-r--r--web/LICENSE2
13801 files changed, 1630873 insertions, 856324 deletions
diff --git a/.github/workflows/bgfxshaders.yml b/.github/workflows/bgfxshaders.yml
index 26b2418f696..bff5085e509 100644
--- a/.github/workflows/bgfxshaders.yml
+++ b/.github/workflows/bgfxshaders.yml
@@ -23,7 +23,9 @@ jobs:
- uses: msys2/setup-msys2@v2
with:
install: git make mingw-w64-x86_64-gcc mingw-w64-x86_64-python mingw-w64-x86_64-libc++
- - uses: actions/checkout@master
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
- name: Prevent make from rebuilding GLSL parser source
run: |
touch 3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c
@@ -35,7 +37,8 @@ jobs:
env:
MINGW64: "/mingw64"
run: make shaders
- - uses: actions/upload-artifact@master
+ - uses: actions/upload-artifact@main
with:
name: mame-bgfx-${{ github.sha }}
path: bgfx/shaders
+ if-no-files-found: error
diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml
index f6f924df624..03e263bff80 100644
--- a/.github/workflows/ci-linux.yml
+++ b/.github/workflows/ci-linux.yml
@@ -24,9 +24,7 @@ permissions:
contents: read
jobs:
-
build-linux:
- runs-on: ubuntu-latest
strategy:
matrix:
compiler: [gcc, clang]
@@ -42,12 +40,15 @@ jobs:
cxx: clang++
subtarget: mame
executable: mame
+ runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@master
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
- sudo apt-get install -y libsdl2-dev libsdl2-ttf-dev libasound2-dev libxinerama-dev libxi-dev qtbase5-dev qtbase5-dev-tools
+ sudo apt-get install -y libsdl2-dev libsdl2-ttf-dev libfontconfig-dev libasound2-dev libxinerama-dev libxi-dev qt6-base-dev qt6-base-dev-tools
- name: Install clang
if: matrix.compiler == 'clang'
run: sudo apt-get install -y clang
@@ -58,17 +59,18 @@ jobs:
ARCHOPTS: ${{ matrix.archopts }}
SUBTARGET: ${{ matrix.subtarget }}
TOOLS: 1
- run: make -j2
+ run: make -j3
- name: Validate
run: ./${{ matrix.executable }} -validate
- name: Reconcile driver list
run: ./${{ matrix.executable }} -listxml | python scripts/build/makedep.py reconcilelist -l src/mame/${{ matrix.subtarget }}.lst -
- name: ORM check
run: python scripts/minimaws/minimaws.py load --executable ./${{ matrix.executable }} --softwarepath hash
- - uses: actions/upload-artifact@master
+ - uses: actions/upload-artifact@main
with:
name: ${{ matrix.executable }}-linux-${{ matrix.compiler }}-${{ github.sha }}
path: |
${{ matrix.executable }}
chdman
unidasm
+ if-no-files-found: error
diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml
index 85f17967282..ae8c0abcdc7 100644
--- a/.github/workflows/ci-macos.yml
+++ b/.github/workflows/ci-macos.yml
@@ -22,13 +22,14 @@ permissions:
contents: read
jobs:
-
build-macos:
runs-on: macOS-latest
steps:
- - uses: actions/checkout@master
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
- name: Install dependencies
- run: brew install python3 sdl2
+ run: brew install python3 sdl3
- name: Build
env:
USE_LIBSDL: 1
@@ -36,10 +37,11 @@ jobs:
run: make -j2
- name: Validate
run: ./mame -validate
- - uses: actions/upload-artifact@master
+ - uses: actions/upload-artifact@main
with:
name: mame-macos-${{ github.sha }}
path: |
mame
chdman
unidasm
+ if-no-files-found: error
diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml
index c7d394838f1..8d3801a921a 100644
--- a/.github/workflows/ci-windows.yml
+++ b/.github/workflows/ci-windows.yml
@@ -22,47 +22,65 @@ permissions:
contents: read
jobs:
-
build-windows:
- runs-on: windows-latest
- defaults:
- run:
- shell: msys2 {0}
strategy:
matrix:
- compiler: [gcc, clang]
+ compiler: [gcc-x64, clang-x64, clang-arm64]
include:
- - compiler: gcc
+ - compiler: gcc-x64
+ os: windows-latest
+ msys: UCRT64
+ slug: mingw-w64-ucrt-x86_64
cc: gcc
cxx: g++
subtarget: mame
executable: mame
- - compiler: clang
+ - compiler: clang-x64
+ os: windows-latest
+ msys: CLANG64
+ slug: mingw-w64-clang-x86_64
+ extrapkg: mingw-w64-clang-x86_64-gcc-compat
cc: clang
cxx: clang++
subtarget: tiny
executable: mametiny
+ - compiler: clang-arm64
+ os: windows-11-arm
+ msys: CLANGARM64
+ slug: mingw-w64-clang-aarch64
+ extrapkg: mingw-w64-clang-aarch64-gcc-compat
+ cc: clang
+ cxx: clang++
+ subtarget: mame
+ executable: mame
+ runs-on: ${{ matrix.os }}
+ defaults:
+ run:
+ shell: msys2 {0}
steps:
- - uses: msys2/setup-msys2@v2
+ - uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2.31.1
+ with:
+ msystem: ${{ matrix.msys }}
+ install: git make ${{ matrix.slug }}-${{ matrix.cc }} ${{ matrix.slug }}-python ${{ matrix.slug }}-lld ${{ matrix.slug }}-llvm ${{ matrix.slug }}-libc++ ${{ matrix.extrapkg }}
+ - uses: actions/checkout@main
with:
- install: git make mingw-w64-x86_64-${{ matrix.compiler }} mingw-w64-x86_64-python mingw-w64-x86_64-lld mingw-w64-x86_64-llvm mingw-w64-x86_64-libc++
- - uses: actions/checkout@master
+ fetch-depth: 0
- name: Build
env:
- MINGW64: "/mingw64"
OVERRIDE_AR: "llvm-ar"
OVERRIDE_CC: ${{ matrix.cc }}
OVERRIDE_CXX: ${{ matrix.cxx }}
ARCHOPTS: "-fuse-ld=lld"
SUBTARGET: ${{ matrix.subtarget }}
TOOLS: 1
- run: make -j2
+ run: make -j3
- name: Validate
run: ./${{ matrix.executable }}.exe -validate
- - uses: actions/upload-artifact@master
+ - uses: actions/upload-artifact@main
with:
name: ${{ matrix.executable }}-windows-${{ matrix.compiler }}-${{ github.sha }}
path: |
${{ matrix.executable }}.exe
chdman.exe
unidasm.exe
+ if-no-files-found: error
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 454f60fa754..2c3bf612028 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -17,7 +17,9 @@ jobs:
build-docs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@master
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
@@ -26,10 +28,11 @@ jobs:
- name: Build HTML
run: make -C docs html
- name: Build PDF
- run: make -C docs latexpdf
- - uses: actions/upload-artifact@master
+ run: make -C docs PAPER=a4 latexpdf
+ - uses: actions/upload-artifact@main
with:
name: mame-docs-${{ github.sha }}
path: |
docs/build/html
docs/build/latex/MAME.pdf
+ if-no-files-found: error
diff --git a/.github/workflows/hash.yml b/.github/workflows/hash.yml
index 91405ad6863..5e55145422e 100644
--- a/.github/workflows/hash.yml
+++ b/.github/workflows/hash.yml
@@ -21,7 +21,9 @@ jobs:
validate:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@master
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
diff --git a/.github/workflows/includeguards.yml b/.github/workflows/includeguards.yml
new file mode 100644
index 00000000000..6d17fe5f5ba
--- /dev/null
+++ b/.github/workflows/includeguards.yml
@@ -0,0 +1,26 @@
+name: 'Check #include guards'
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - 'src/devices/**.h'
+ - 'src/mame/**.h'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'src/devices/**.h'
+ - 'src/mame/**.h'
+
+permissions:
+ contents: read
+
+jobs:
+ validate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Validate
+ run: python3 scripts/build/check_include_guards.py src/devices src/mame
diff --git a/.github/workflows/language.yml b/.github/workflows/language.yml
index 586904c1a49..a5c6eaf358f 100644
--- a/.github/workflows/language.yml
+++ b/.github/workflows/language.yml
@@ -17,10 +17,13 @@ jobs:
build-language:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@master
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
- name: Compile message catalogs
run: for x in language/*/*.po ; do python scripts/build/msgfmt.py --output-file "`dirname "$x"`/`basename "$x" .po`.mo" "$x" ; done
- - uses: actions/upload-artifact@master
+ - uses: actions/upload-artifact@main
with:
name: mame-language-${{ github.sha }}
path: language/*/*.mo
+ if-no-files-found: error
diff --git a/3rdparty/README.md b/3rdparty/README.md
index 3ed8c22e456..25c4fc0b9f9 100644
--- a/3rdparty/README.md
+++ b/3rdparty/README.md
@@ -1,5 +1,7 @@
# **3rdparty** #
+aescbc - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
asio - [Boost Software License](http://www.boost.org/LICENSE_1_0.txt)
asmjit - [zlib license](http://opensource.org/licenses/Zlib)
@@ -56,8 +58,6 @@ pugixml - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
rapidjson - [The MIT License (MIT)](http://opensource.org/licenses/MIT), [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) (msinttypes), JSON license (JSON_checker)
-softfloat - ["Softfloat 2b" U.C. Berkeley modified license](https://github.com/mamedev/mame/blob/master/3rdparty/softfloat/README.txt) MIT compatible
-
softfloat3 - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
sol2 - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
diff --git a/3rdparty/aes256cbc/AES_256_CBC.h b/3rdparty/aes256cbc/AES_256_CBC.h
new file mode 100644
index 00000000000..c2cf4a42021
--- /dev/null
+++ b/3rdparty/aes256cbc/AES_256_CBC.h
@@ -0,0 +1,993 @@
+#ifndef __AES_256_CBC_H__
+#define __AES_256_CBC_H__
+
+#define AES_BLOCK_SIZE 16
+#define AES_KEY_SIZE 32
+
+#define GETU32(in_data) (((unsigned int)(in_data)[0] << 24) ^ \
+ ((unsigned int)(in_data)[1] << 16) ^ \
+ ((unsigned int)(in_data)[2] << 8) ^ \
+ ((unsigned int)(in_data)[3] << 0))
+
+#define PUTU32(out_data, st) { (out_data)[0] = (unsigned char)((st) >> 24); \
+ (out_data)[1] = (unsigned char)((st) >> 16); \
+ (out_data)[2] = (unsigned char)((st) >> 8); \
+ (out_data)[3] = (unsigned char)((st) >> 0); }
+
+static const unsigned int Te0[256] =
+{
+ 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
+ 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
+ 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
+ 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
+ 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
+ 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
+ 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
+ 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
+ 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
+ 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
+ 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
+ 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
+ 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
+ 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
+ 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
+ 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
+ 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
+ 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
+ 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
+ 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
+ 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
+ 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
+ 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
+ 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
+ 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
+ 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
+ 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
+ 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
+ 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
+ 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
+ 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
+ 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
+ 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
+ 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
+ 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
+ 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
+ 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
+ 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
+ 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
+ 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
+ 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
+ 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
+ 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
+ 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
+ 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
+ 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
+ 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
+ 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
+ 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
+ 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
+ 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
+ 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
+ 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
+ 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
+ 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
+ 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
+ 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
+ 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
+ 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
+ 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
+ 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
+ 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
+ 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
+ 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
+};
+
+static const unsigned int Te1[256] =
+{
+ 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
+ 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
+ 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
+ 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
+ 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
+ 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
+ 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
+ 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
+ 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
+ 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
+ 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
+ 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
+ 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
+ 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
+ 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
+ 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
+ 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
+ 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
+ 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
+ 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
+ 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
+ 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
+ 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
+ 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
+ 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
+ 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
+ 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
+ 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
+ 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
+ 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
+ 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
+ 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
+ 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
+ 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
+ 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
+ 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
+ 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
+ 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
+ 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
+ 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
+ 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
+ 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
+ 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
+ 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
+ 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
+ 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
+ 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
+ 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
+ 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
+ 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
+ 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
+ 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
+ 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
+ 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
+ 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
+ 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
+ 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
+ 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
+ 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
+ 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
+ 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
+ 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
+ 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
+ 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
+};
+
+static const unsigned int Te2[256] =
+{
+ 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
+ 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
+ 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
+ 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
+ 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
+ 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
+ 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
+ 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
+ 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
+ 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
+ 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
+ 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
+ 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
+ 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
+ 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
+ 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
+ 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
+ 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
+ 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
+ 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
+ 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
+ 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
+ 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
+ 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
+ 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
+ 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
+ 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
+ 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
+ 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
+ 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
+ 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
+ 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
+ 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
+ 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
+ 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
+ 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
+ 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
+ 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
+ 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
+ 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
+ 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
+ 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
+ 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
+ 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
+ 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
+ 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
+ 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
+ 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
+ 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
+ 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
+ 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
+ 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
+ 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
+ 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
+ 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
+ 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
+ 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
+ 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
+ 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
+ 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
+ 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
+ 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
+ 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
+ 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
+};
+
+static const unsigned int Te3[256] =
+{
+ 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
+ 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
+ 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
+ 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
+ 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
+ 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
+ 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
+ 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
+ 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
+ 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
+ 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
+ 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
+ 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
+ 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
+ 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
+ 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
+ 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
+ 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
+ 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
+ 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
+ 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
+ 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
+ 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
+ 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
+ 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
+ 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
+ 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
+ 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
+ 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
+ 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
+ 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
+ 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
+ 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
+ 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
+ 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
+ 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
+ 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
+ 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
+ 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
+ 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
+ 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
+ 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
+ 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
+ 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
+ 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
+ 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
+ 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
+ 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
+ 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
+ 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
+ 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
+ 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
+ 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
+ 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
+ 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
+ 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
+ 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
+ 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
+ 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
+ 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
+ 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
+ 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
+ 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
+ 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
+};
+
+static const unsigned int Te4[256] =
+{
+ 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
+ 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
+ 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
+ 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
+ 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
+ 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
+ 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
+ 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
+ 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
+ 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
+ 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
+ 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
+ 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
+ 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
+ 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
+ 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
+ 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
+ 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
+ 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
+ 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
+ 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
+ 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
+ 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
+ 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
+ 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
+ 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
+ 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
+ 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
+ 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
+ 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
+ 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
+ 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
+ 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
+ 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
+ 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
+ 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
+ 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
+ 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
+ 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
+ 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
+ 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
+ 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
+ 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
+ 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
+ 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
+ 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
+ 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
+ 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
+ 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
+ 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
+ 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
+ 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
+ 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
+ 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
+ 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
+ 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
+ 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
+ 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
+ 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
+ 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
+ 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
+ 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
+ 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
+ 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
+};
+
+static const unsigned int Td0[256] =
+{
+ 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
+ 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
+ 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
+ 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
+ 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
+ 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
+ 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
+ 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
+ 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
+ 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
+ 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
+ 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
+ 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
+ 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
+ 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
+ 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
+ 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
+ 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
+ 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
+ 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
+ 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
+ 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
+ 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
+ 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
+ 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
+ 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
+ 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
+ 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
+ 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
+ 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
+ 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
+ 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
+ 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
+ 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
+ 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
+ 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
+ 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
+ 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
+ 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
+ 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
+ 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
+ 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
+ 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
+ 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
+ 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
+ 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
+ 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
+ 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
+ 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
+ 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
+ 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
+ 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
+ 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
+ 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
+ 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
+ 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
+ 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
+ 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
+ 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
+ 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
+ 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
+ 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
+ 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
+ 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
+};
+
+static const unsigned int Td1[256] =
+{
+ 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
+ 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
+ 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
+ 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
+ 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
+ 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
+ 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
+ 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
+ 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
+ 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
+ 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
+ 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
+ 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
+ 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
+ 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
+ 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
+ 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
+ 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
+ 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
+ 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
+ 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
+ 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
+ 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
+ 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
+ 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
+ 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
+ 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
+ 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
+ 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
+ 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
+ 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
+ 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
+ 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
+ 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
+ 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
+ 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
+ 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
+ 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
+ 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
+ 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
+ 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
+ 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
+ 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
+ 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
+ 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
+ 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
+ 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
+ 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
+ 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
+ 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
+ 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
+ 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
+ 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
+ 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
+ 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
+ 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
+ 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
+ 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
+ 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
+ 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
+ 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
+ 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
+ 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
+ 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
+};
+
+static const unsigned int Td2[256] =
+{
+ 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
+ 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
+ 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
+ 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
+ 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
+ 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
+ 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
+ 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
+ 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
+ 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
+ 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
+ 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
+ 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
+ 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
+ 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
+ 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
+ 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
+ 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
+ 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
+ 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
+ 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
+ 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
+ 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
+ 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
+ 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
+ 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
+ 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
+ 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
+ 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
+ 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
+ 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
+ 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
+ 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
+ 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
+ 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
+ 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
+ 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
+ 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
+ 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
+ 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
+ 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
+ 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
+ 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
+ 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
+ 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
+ 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
+ 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
+ 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
+ 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
+ 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
+ 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
+ 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
+ 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
+ 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
+ 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
+ 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
+ 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
+ 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
+ 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
+ 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
+ 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
+ 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
+ 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
+ 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
+};
+
+static const unsigned int Td3[256] =
+{
+ 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
+ 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
+ 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
+ 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
+ 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
+ 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
+ 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
+ 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
+ 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
+ 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
+ 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
+ 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
+ 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
+ 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
+ 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
+ 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
+ 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
+ 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
+ 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
+ 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
+ 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
+ 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
+ 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
+ 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
+ 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
+ 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
+ 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
+ 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
+ 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
+ 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
+ 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
+ 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
+ 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
+ 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
+ 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
+ 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
+ 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
+ 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
+ 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
+ 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
+ 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
+ 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
+ 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
+ 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
+ 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
+ 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
+ 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
+ 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
+ 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
+ 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
+ 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
+ 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
+ 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
+ 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
+ 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
+ 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
+ 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
+ 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
+ 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
+ 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
+ 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
+ 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
+ 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
+ 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
+};
+
+static const unsigned int Td4[256] =
+{
+ 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
+ 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
+ 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
+ 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
+ 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
+ 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
+ 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
+ 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
+ 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
+ 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
+ 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
+ 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
+ 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
+ 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
+ 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
+ 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
+ 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
+ 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
+ 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
+ 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
+ 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
+ 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
+ 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
+ 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
+ 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
+ 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
+ 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
+ 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
+ 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
+ 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
+ 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
+ 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
+ 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
+ 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
+ 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
+ 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
+ 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
+ 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
+ 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
+ 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
+ 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
+ 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
+ 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
+ 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
+ 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
+ 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
+ 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
+ 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
+ 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
+ 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
+ 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
+ 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
+ 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
+ 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
+ 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
+ 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
+ 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
+ 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
+ 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
+ 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
+ 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
+ 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
+ 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
+ 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
+};
+
+static const unsigned int rcon[10] = {
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000
+};
+
+typedef struct {
+ unsigned int roundkey[60];
+ unsigned int iv[4];
+} AES_CTX;
+
+void AES_EncryptInit(AES_CTX *ctx, const unsigned char *key, const unsigned char *iv) {
+ ctx->roundkey[0] = GETU32(key + 0);
+ ctx->roundkey[1] = GETU32(key + 4);
+ ctx->roundkey[2] = GETU32(key + 8);
+ ctx->roundkey[3] = GETU32(key + 12);
+ ctx->roundkey[4] = GETU32(key + 16);
+ ctx->roundkey[5] = GETU32(key + 20);
+ ctx->roundkey[6] = GETU32(key + 24);
+ ctx->roundkey[7] = GETU32(key + 28);
+
+ ctx->iv[0] = GETU32(iv + 0);
+ ctx->iv[1] = GETU32(iv + 4);
+ ctx->iv[2] = GETU32(iv + 8);
+ ctx->iv[3] = GETU32(iv + 12);
+
+ for (unsigned char index = 8; index < 60; index += 8) {
+ ctx->roundkey[index] = ctx->roundkey[index - 8] ^
+ (Te4[(ctx->roundkey[index - 1] >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(ctx->roundkey[index - 1] >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(ctx->roundkey[index - 1] >> 0) & 0xff] & 0x0000ff00) ^
+ (Te4[(ctx->roundkey[index - 1] >> 24) & 0xff] & 0x000000ff) ^ rcon[index / 8 -1];
+ ctx->roundkey[index + 1] = ctx->roundkey[index - 7] ^ ctx->roundkey[index];
+ ctx->roundkey[index + 2] = ctx->roundkey[index - 6] ^ ctx->roundkey[index + 1];
+ ctx->roundkey[index + 3] = ctx->roundkey[index - 5] ^ ctx->roundkey[index + 2];
+
+ if (index == 56) {
+ break;
+ }
+
+ ctx->roundkey[index + 4] = ctx->roundkey[index - 4] ^
+ (Te4[(ctx->roundkey[index + 3] >> 24)] & 0xff000000) ^
+ (Te4[(ctx->roundkey[index + 3] >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(ctx->roundkey[index + 3] >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(ctx->roundkey[index + 3] >> 0) & 0xff] & 0x000000ff);
+ ctx->roundkey[index + 5] = ctx->roundkey[index - 3] ^ ctx->roundkey[index + 4];
+ ctx->roundkey[index + 6] = ctx->roundkey[index - 2] ^ ctx->roundkey[index + 5];
+ ctx->roundkey[index + 7] = ctx->roundkey[index - 1] ^ ctx->roundkey[index + 6];
+ }
+}
+
+void AES_DecryptInit(AES_CTX *ctx, const unsigned char *key, const unsigned char *iv) {
+ AES_EncryptInit(ctx, key, iv);
+
+ unsigned int temp;
+
+ // Next, invert the order of the round keys.
+ for (unsigned char i = 0, j = 56; i < j; i += 4, j -= 4) {
+ temp = ctx->roundkey[i + 0];
+ ctx->roundkey[i + 0] = ctx->roundkey[j + 0];
+ ctx->roundkey[j + 0] = temp;
+
+ temp = ctx->roundkey[i + 1];
+ ctx->roundkey[i + 1] = ctx->roundkey[j + 1];
+ ctx->roundkey[j + 1] = temp;
+
+ temp = ctx->roundkey[i + 2];
+ ctx->roundkey[i + 2] = ctx->roundkey[j + 2];
+ ctx->roundkey[j + 2] = temp;
+
+ temp = ctx->roundkey[i + 3];
+ ctx->roundkey[i + 3] = ctx->roundkey[j + 3];
+ ctx->roundkey[j + 3] = temp;
+ }
+
+ // Finally, apply the inverse MixColumn transform to all round keys except the first and last.
+ for (unsigned char index = 4; index < 56; index += 4) {
+ ctx->roundkey[index] =
+ Td0[Te4[(ctx->roundkey[index] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index] >> 0) & 0xff] & 0xff];
+ ctx->roundkey[index + 1] =
+ Td0[Te4[(ctx->roundkey[index + 1] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index + 1] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index + 1] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index + 1] >> 0) & 0xff] & 0xff];
+ ctx->roundkey[index + 2] =
+ Td0[Te4[(ctx->roundkey[index + 2] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index + 2] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index + 2] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index + 2] >> 0) & 0xff] & 0xff];
+ ctx->roundkey[index + 3] =
+ Td0[Te4[(ctx->roundkey[index + 3] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index + 3] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index + 3] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index + 3] >> 0) & 0xff] & 0xff];
+ }
+}
+
+void AES_Encrypt(AES_CTX *ctx, const unsigned char in_data[AES_BLOCK_SIZE], unsigned char out_data[AES_BLOCK_SIZE]) {
+ unsigned int s0, s1, s2, s3, t0, t1, t2, t3;
+
+ s0 = GETU32(in_data + 0) ^ ctx->iv[0] ^ ctx->roundkey[0];
+ s1 = GETU32(in_data + 4) ^ ctx->iv[1] ^ ctx->roundkey[1];
+ s2 = GETU32(in_data + 8) ^ ctx->iv[2] ^ ctx->roundkey[2];
+ s3 = GETU32(in_data + 12) ^ ctx->iv[3] ^ ctx->roundkey[3];
+
+ // round 1
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[ 4];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[ 5];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[ 6];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[ 7];
+ // round 2
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[ 8];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[ 9];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[10];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[11];
+ // round 3
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[12];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[13];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[14];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[15];
+ // round 4
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[16];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[17];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[18];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[19];
+ // round 5
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[20];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[21];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[22];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[23];
+ // round 6
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[24];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[25];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[26];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[27];
+ // round 7
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[28];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[29];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[30];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[31];
+ // round 8
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[32];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[33];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[34];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[35];
+ // round 9
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[36];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[37];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[38];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[39];
+ // round 10
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[40];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[41];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[42];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[43];
+ // round 11
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[44];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[45];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[46];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[47];
+ // round 12
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[48];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[49];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[50];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[51];
+ // round 13
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[52];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[53];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[54];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[55];
+
+ // Apply the final round and map the cipher state to a byte array block
+ s0 = (Te4[(t0 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t3 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[56];
+ s1 = (Te4[(t1 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t0 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[57];
+ s2 = (Te4[(t2 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t1 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[58];
+ s3 = (Te4[(t3 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t2 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[59];
+
+ PUTU32(out_data + 0, s0);
+ PUTU32(out_data + 4, s1);
+ PUTU32(out_data + 8, s2);
+ PUTU32(out_data + 12, s3);
+
+ ctx->iv[0] = s0;
+ ctx->iv[1] = s1;
+ ctx->iv[2] = s2;
+ ctx->iv[3] = s3;
+}
+
+void AES_Decrypt(AES_CTX *ctx, const unsigned char in_data[AES_BLOCK_SIZE], unsigned char out_data[AES_BLOCK_SIZE]) {
+ unsigned int s0, s1, s2, s3, t0, t1, t2, t3, temp[4];
+
+ s0 = GETU32(in_data + 0) ^ ctx->roundkey[0];
+ s1 = GETU32(in_data + 4) ^ ctx->roundkey[1];
+ s2 = GETU32(in_data + 8) ^ ctx->roundkey[2];
+ s3 = GETU32(in_data + 12) ^ ctx->roundkey[3];
+
+ temp[0] = GETU32(in_data + 0);
+ temp[1] = GETU32(in_data + 4);
+ temp[2] = GETU32(in_data + 8);
+ temp[3] = GETU32(in_data + 12);
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[ 4];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[ 5];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[ 6];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[ 7];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[ 8];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[ 9];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[10];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[11];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[12];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[13];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[14];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[15];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[16];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[17];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[18];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[19];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[20];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[21];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[22];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[23];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[24];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[25];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[26];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[27];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[28];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[29];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[30];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[31];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[32];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[33];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[34];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[35];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[36];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[37];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[38];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[39];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[40];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[41];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[42];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[43];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[44];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[45];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[46];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[47];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[48];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[49];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[50];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[51];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[52];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[53];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[54];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[55];
+
+ s0 = (Td4[(t0 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t1 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[56];
+ s1 = (Td4[(t1 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t2 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[57];
+ s2 = (Td4[(t2 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t3 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[58];
+ s3 = (Td4[(t3 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t0 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[59];
+
+ PUTU32(out_data + 0, s0 ^ ctx->iv[0]);
+ PUTU32(out_data + 4, s1 ^ ctx->iv[1]);
+ PUTU32(out_data + 8, s2 ^ ctx->iv[2]);
+ PUTU32(out_data + 12, s3 ^ ctx->iv[3]);
+
+ ctx->iv[0] = temp[0];
+ ctx->iv[1] = temp[1];
+ ctx->iv[2] = temp[2];
+ ctx->iv[3] = temp[3];
+}
+
+void AES_CTX_Free(AES_CTX *ctx) {
+ for (int index = 0; index < 60; index++) {
+ ctx->roundkey[index] = 0x00;
+ }
+
+ ctx->iv[0] = 0x00;
+ ctx->iv[1] = 0x00;
+ ctx->iv[2] = 0x00;
+ ctx->iv[3] = 0x00;
+}
+
+#endif
diff --git a/3rdparty/aes256cbc/LICENSE b/3rdparty/aes256cbc/LICENSE
new file mode 100644
index 00000000000..348d370b85b
--- /dev/null
+++ b/3rdparty/aes256cbc/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Hallo Weeks
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/3rdparty/aes256cbc/README.md b/3rdparty/aes256cbc/README.md
new file mode 100644
index 00000000000..d3825e64a99
--- /dev/null
+++ b/3rdparty/aes256cbc/README.md
@@ -0,0 +1,231 @@
+## Overview
+This GitHub repository contains a standard implementation of the Advanced Encryption Standard (AES) with a focus on AES-256 CBC (Cipher Block Chaining) encryption. AES-256 is a highly secure encryption standard due to its 256-bit key size, providing robust protection for sensitive data. CBC mode ensures increased security by chaining each plaintext block to the previous ciphertext block before encryption, making it resistant to certain cryptographic attacks.
+
+## Features
+- **Header-only:** No need for external dependencies, simplifying integration into existing projects.
+- **AES-256-CBC support:** Enables robust encryption and decryption using the Advanced Encryption Standard with a 256-bit key size and Cipher Block Chaining mode.
+- **Seamless integration:** Provides straightforward usage examples for effortless incorporation into applications.
+- **Compatibility:** Data encrypted using this standard AES-256 CBC algorithm can be decrypted using any compliant AES-256 CBC decryption implementation.
+
+## Usage
+
+To utilize this standard AES-256 CBC implementation, follow the instructions provided below:
+
+### Including "AES_256_CBC.h" Header
+
+Before utilizing the AES encryption and decryption functions, ensure that you've included the "AES_256_CBC.h" header in your code. This header provides access to the AES functionality.
+
+```c
+#include "AES_256_CBC.h"
+```
+
+
+### AES Context Initialization
+
+To perform AES encryption and decryption, you must initialize an AES context. This context serves as a container for maintaining the encryption and decryption state.
+
+```c
+AES_CTX ctx;
+```
+
+### Initialize Encryption
+
+To perform encryption, initialize the AES context and provide the encryption key and iv.
+
+```c
+AES_EncryptInit(&ctx, key, iv);
+```
+
+
+
+### Encryption Function
+
+The AES encryption function allows you to encrypt a single blocks of data, and this implementation does not support padding. Ensure that you provide data blocks of precisely 16 bytes.
+
+```c
+AES_Encrypt(&ctx, plaintext, ciphertext);
+```
+
+
+### Initialize Decryption
+
+To perform decryption, initialize the AES context with the same key used for encryption.
+
+```c
+AES_DecryptInit(&ctx, key, iv);
+```
+
+### Decryption Function
+
+The AES decryption function allows you to decrypt a single blocks of data, and this implementation does not support padding. Ensure that you provide ciphertext blocks of precisely 16 bytes.
+
+```c
+AES_Decrypt(&ctx, ciphertext, plaintext);
+```
+
+### Encryption and Decryption Function Completion
+
+After you have finished using the AES encryption and decryption functions and no longer require the AES context, it's essential to clear sensitive information from memory. Use the following function to achieve this:
+
+```c
+AES_CTX_Free(&ctx);
+```
+
+### Example Code (main.c)
+
+Here's an example code snippet in C for using this standard AES-256 CBC implementation:
+
+```c
+#include <stdio.h>
+#include "AES_256_CBC.h"
+
+// Function to print the title and hexadecimal representation of data
+void output(const char *title, const unsigned char *data, unsigned int size) {
+ printf("%s", title);
+ for (unsigned int index = 0; index < size; index++) {
+ printf("%02X", data[index]);
+ }
+ printf("\n");
+}
+
+int main(int argc, const char *argv[]) {
+ // AES-256 key (32 bytes)
+ unsigned char key[AES_KEY_SIZE] = {
+ 0x49, 0x2F, 0xA8, 0x1E, 0xD7, 0x82, 0x4C, 0x93,
+ 0x36, 0x7B, 0xC1, 0xF8, 0xA0, 0xE5, 0x1A, 0x5D,
+ 0x98, 0xA1, 0x01, 0x11, 0x32, 0xE3, 0xC6, 0xC1,
+ 0xF3, 0x5C, 0x3A, 0xD6, 0x1E, 0x64, 0x12, 0xD6
+ };
+
+ // AES-256 iv (16 bytes)
+ unsigned char iv[AES_BLOCK_SIZE] = {
+ 0x3A, 0x04, 0x2F, 0x3D, 0x37, 0x61, 0x34, 0x3D,
+ 0x49, 0x60, 0x33, 0x63, 0x4A, 0x3D, 0x36, 0x63
+ };
+
+
+ // Data block to be encrypted (16 bytes)
+ unsigned char data[AES_BLOCK_SIZE] = {
+ 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+ 0x61, 0x6E, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21
+ };
+
+ // Print original data
+ output("ori: 0x", data, 16);
+
+ // Initialize AES context
+ AES_CTX ctx;
+
+ // Initialize encryption with the provided key and iv
+ AES_EncryptInit(&ctx, key, iv);
+
+ // Perform encryption
+ AES_Encrypt(&ctx, data, data);
+
+ // Print encrypted data
+ output("enc: 0x", data, 16);
+
+ // Initialize decryption with the same key and iv
+ AES_DecryptInit(&ctx, key, iv);
+
+ // Perform decryption
+ AES_Decrypt(&ctx, data, data);
+
+ // Print decrypted data
+ output("dec: 0x", data, 16);
+
+ // Clean up: zero out the round key array for security purposes
+ AES_CTX_Free(&ctx);
+
+ return 0;
+}
+```
+
+### Example Code (main.c)
+
+Here's an example code snippet in C demonstrating AES-256 CBC encryption and decryption with PKCS#7 padding support:
+
+```c
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+#include "AES_256_CBC.h"
+
+// Encryption data with padding PKCS7
+uint32_t EncryptData(uint8_t *data, uint32_t size, const uint8_t *key, const uint8_t *iv) {
+ uint8_t padding_size = AES_BLOCK_SIZE - (size % AES_BLOCK_SIZE);
+ uint32_t data_size = size + padding_size;
+
+ // adding padding value
+ for (uint8_t index = 0; index < padding_size; index++) {
+ data[size + index] = padding_size;
+ }
+
+ AES_CTX ctx;
+ AES_EncryptInit(&ctx, key, iv);
+
+ for (uint32_t offset = 0; offset < data_size; offset += AES_BLOCK_SIZE) {
+ AES_Encrypt(&ctx, data + offset, data + offset);
+ }
+
+ AES_CTX_Free(&ctx);
+
+ return data_size;
+}
+
+// Decryption data with padding PKCS7
+uint32_t DecryptData(uint8_t *data, uint32_t size, const uint8_t *key, const uint8_t *iv) {
+ AES_CTX ctx;
+ AES_DecryptInit(&ctx, key, iv);
+
+ for (uint32_t offset = 0; offset < size; offset += AES_BLOCK_SIZE) {
+ AES_Decrypt(&ctx, data + offset, data + offset);
+ }
+
+ AES_CTX_Free(&ctx);
+
+ return size - data[size - 1];
+}
+
+
+void output(const char *title, const uint8_t *data, unsigned int size) {
+ printf("%s", title);
+ for (unsigned int index = 0; index < size; index++) {
+ printf("%02X", data[index]);
+ }
+ printf("\n");
+}
+
+int main(int argc, const char *argv[]) {
+ uint8_t data[32];
+ uint8_t key[AES_KEY_SIZE];
+ uint8_t iv[AES_BLOCK_SIZE];
+ int data_len = 0;
+
+ memcpy(data, "halloweeks", 10);
+ memset(key, 0x69, 32);
+ memset(iv, 0x78, 16);
+ data_len = 10; // original data length
+
+ output("ori: 0x", data, data_len);
+
+ data_len = EncryptData(data, data_len, key, iv);
+
+ output("enc: 0x", data, data_len);
+
+ data_len = DecryptData(data, data_len, key, iv);
+
+ output("dec: 0x", data, data_len);
+ return 0;
+}
+```
+
+## Contributions
+
+Contributions and feedback are welcome! If you find issues or have ideas for improvements, please open an issue or submit a pull request.
+
+## License
+
+This standard AES-256 CBC implementation is provided under the [MIT License](./LICENSE).
diff --git a/3rdparty/asmjit/CMakeLists.txt b/3rdparty/asmjit/CMakeLists.txt
index 9d459f00cad..a5aace5d632 100644
--- a/3rdparty/asmjit/CMakeLists.txt
+++ b/3rdparty/asmjit/CMakeLists.txt
@@ -1,352 +1,112 @@
-cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
-
-cmake_policy(PUSH)
-
-if (POLICY CMP0063)
- cmake_policy(SET CMP0063 NEW) # Honor visibility properties.
-endif()
-
-if (POLICY CMP0092)
- cmake_policy(SET CMP0092 NEW) # Don't add -W3 warning level by default.
-endif()
-
-# Don't create a project if it was already created by another CMakeLists.txt.
-# This allows one library to embed another library without making a collision.
-if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit")
- project(asmjit CXX)
-endif()
-
-include(CheckCXXCompilerFlag)
-INCLUDE(CheckCXXSourceCompiles)
-include(GNUInstallDirs)
-
-# AsmJit - Deprecated
-# ===================
-
-if (DEFINED ASMJIT_BUILD_EMBED)
- message(DEPRECATION "ASMJIT_BUILD_EMBED is deprecated, use ASMJIT_EMBED")
- set(ASMJIT_EMBED "${ASMJIT_BUILD_EMBED}")
-endif()
-
-if (DEFINED ASMJIT_BUILD_STATIC)
- message(DEPRECATION "ASMJIT_BUILD_STATIC is deprecated, use ASMJIT_STATIC")
- set(ASMJIT_STATIC "${ASMJIT_BUILD_STATIC}")
-endif()
-
-# AsmJit - Configuration - Build
-# ==============================
-
-if (NOT DEFINED ASMJIT_TEST)
- set(ASMJIT_TEST FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_EMBED)
- set(ASMJIT_EMBED FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_STATIC)
- set(ASMJIT_STATIC ${ASMJIT_EMBED})
-endif()
-
-if (NOT DEFINED ASMJIT_SANITIZE)
- set(ASMJIT_SANITIZE FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_CUSTOM_FLAGS)
- set(ASMJIT_NO_CUSTOM_FLAGS FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_NATVIS)
- set(ASMJIT_NO_NATVIS FALSE)
-endif()
-
-# EMBED implies STATIC.
-if (ASMJIT_EMBED AND NOT ASMJIT_STATIC)
- set(ASMJIT_STATIC TRUE)
-endif()
-
-# AsmJit - Configuration - Backend
+# AsmJit
+# ======
+
+# AsmJit library provides a single alias that can use used to consume it as a dependency:
+#
+# `asmjit::asmjit`
+#
+# Depending on options, the alias would be either a static or shared library (depending on
+# `ASMJIT_STATIC=ON|OFF` options) or it would be an interface library if `ASMJIT_EMBED=ON`.
+#
+# NOTE: When `ASMJIT_EMBED=ON` AsmJit won't add any installation instructions of libraries
+# or header files. Embed is literally for users that want to consume AsmJit as source code
+# without creating an intermediate static library. C++ flags, which used by the consuming
+# target will then be used to compile the embedded AsmJit source code as well. This option
+# improves the control of how AsmJit is both compiled and consumed.
+#
+# Consuming AsmJit
+# ----------------
+#
+# The recommended scenario to consume AsmJit is to clone it to a directory where third
+# party libraries are placed (this can be done even if you use a package manager such as
+# vcpkg or conan to manage other dependencies). Usually, the directory is called '3rdparty'
+# and it resides in your project's root, but it's just a recommendation, not a convention.
+# In such case, consuming a cloned AsmJit from your own project would look like this:
+#
+# # == Configure AsmJit options ==
+# set(ASMJIT_EMBED ON or OFF) # AsmJit uses ASMJIT_EMBED=OFF by default.
+# set(ASMJIT_STATIC ON or OFF) # AsmJit uses ASMJIT_STATIC=OFF by default.
+# add_subdirectory(3rdparty/asmjit asmjit) # Adds AsmJit as a sub-project.
+#
+# # == Consume AsmJit as a CMake dependency ==
+# add_executable(test_app main.cpp) # Target executable having main.cpp
+# target_link_libraries(test_app asmjit::asmjit) # Adds AsmJit as a dependency to test_app.
+#
+# Developing & Testing AsmJit
+# ---------------------------
+#
+# There are sample configure scripts provided, which reside in project root. In general, to
+# develop AsmJit it must be configured with `ASMJIT_TEST=ON` to build AsmJit tests and they
+# have to pass. Here is a simple cmake invocation to build AsmJit with tests enabled:
+#
+# cmake . -B build/Debug -DCMAKE_BUILD_TYPE=Debug -DASMJIT_TEST=ON
+#
+# See <asmjit.com> for more details.
+
+cmake_minimum_required(VERSION 3.24 FATAL_ERROR)
+
+# AsmJit - Project & Configuration
# ================================
-if (NOT DEFINED ASMJIT_NO_X86)
- set(ASMJIT_NO_X86 FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_AARCH64)
- set(ASMJIT_NO_AARCH64 FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_FOREIGN)
- set(ASMJIT_NO_FOREIGN FALSE)
-endif()
-
-# AsmJit - Configuration - Features
-# =================================
-
-if (NOT DEFINED ASMJIT_NO_DEPRECATED)
- set(ASMJIT_NO_DEPRECATED FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_SHM_OPEN)
- set(ASMJIT_NO_SHM_OPEN FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_JIT)
- set(ASMJIT_NO_JIT FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_TEXT)
- set(ASMJIT_NO_TEXT FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_LOGGING)
- set(ASMJIT_NO_LOGGING ${ASMJIT_NO_TEXT})
-endif()
-
-if (NOT DEFINED ASMJIT_NO_VALIDATION)
- set(ASMJIT_NO_VALIDATION FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_INTROSPECTION)
- set(ASMJIT_NO_INTROSPECTION FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_BUILDER)
- set(ASMJIT_NO_BUILDER FALSE)
-endif()
-
-if (NOT DEFINED ASMJIT_NO_COMPILER)
- if (ASMJIT_NO_BUILDER OR ASMJIT_NO_INTROSPECTION)
- set(ASMJIT_NO_COMPILER TRUE)
- else()
- set(ASMJIT_NO_COMPILER FALSE)
- endif()
-endif()
-
-# AsmJit - Configuration - CMake Introspection
-# ============================================
-
-set(ASMJIT_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "Location of 'asmjit'")
-set(ASMJIT_TEST "${ASMJIT_TEST}" CACHE BOOL "Build 'asmjit' test applications")
-set(ASMJIT_EMBED "${ASMJIT_EMBED}" CACHE BOOL "Embed 'asmjit' library (no targets)")
-set(ASMJIT_STATIC "${ASMJIT_STATIC}" CACHE BOOL "Build 'asmjit' library as static")
-set(ASMJIT_SANITIZE "${ASMJIT_SANITIZE}" CACHE STRING "Build with sanitizers: 'address', 'undefined', etc...")
-set(ASMJIT_NO_NATVIS "${ASMJIT_NO_NATVIS}" CACHE BOOL "Disable natvis support (embedding asmjit.natvis in PDB)")
-set(ASMJIT_NO_CUSTOM_FLAGS "${ASMJIT_NO_CUSTOM_FLAGS}" CACHE BOOL "Disable extra compilation flags added by AsmJit to its targets")
-
-set(ASMJIT_NO_X86 "${ASMJIT_NO_X86}" CACHE BOOL "Disable X86/X64 backend")
-set(ASMJIT_NO_AARCH64 "${ASMJIT_NO_AARCH64}" CACHE BOOL "Disable AArch64 backend")
-set(ASMJIT_NO_FOREIGN "${ASMJIT_NO_FOREIGN}" CACHE BOOL "Disable all foreign architectures (enables only a target architecture)")
-
-set(ASMJIT_NO_DEPRECATED "${ASMJIT_NO_DEPRECATED}" CACHE BOOL "Disable deprecated API at build time")
-set(ASMJIT_NO_SHM_OPEN "${ASMJIT_NO_SHM_OPEN}" CACHE BOOL "Disable the use of shm_open() even on platforms where it's supported")
-set(ASMJIT_NO_JIT "${ASMJIT_NO_JIT}" CACHE BOOL "Disable VirtMem, JitAllocator, and JitRuntime at build time")
-set(ASMJIT_NO_TEXT "${ASMJIT_NO_TEXT}" CACHE BOOL "Disable textual representation of instructions, enums, cpu features, ...")
-set(ASMJIT_NO_LOGGING "${ASMJIT_NO_LOGGING}" CACHE BOOL "Disable logging features at build time")
-set(ASMJIT_NO_VALIDATION "${ASMJIT_NO_VALIDATION}" CACHE BOOL "Disable instruction validation API at build time")
-set(ASMJIT_NO_INTROSPECTION "${ASMJIT_NO_INTROSPECTION}" CACHE BOOL "Disable instruction introspection API at build time")
-set(ASMJIT_NO_BUILDER "${ASMJIT_NO_BUILDER}" CACHE BOOL "Disable Builder emitter at build time")
-set(ASMJIT_NO_COMPILER "${ASMJIT_NO_COMPILER}" CACHE BOOL "Disable Compiler emitter at build time")
-
-# AsmJit - Project
-# ================
-
-set(ASMJIT_INCLUDE_DIRS "${ASMJIT_DIR}/src") # Include directory is the same as source dir.
-set(ASMJIT_DEPS "") # AsmJit dependencies (libraries) for the linker.
-set(ASMJIT_LIBS "") # Dependencies of libs/apps that want to use AsmJit.
-set(ASMJIT_CFLAGS "") # Public compiler flags.
-set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type.
-set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds.
-set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds.
-set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers.
-set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers.
-
-# AsmJit - Utilities
-# ==================
-
-function(asmjit_detect_cflags out)
- set(out_array ${${out}})
- foreach(flag ${ARGN})
- string(REGEX REPLACE "[+]" "x" flag_signature "${flag}")
- string(REGEX REPLACE "[-=:;/.\]" "_" flag_signature "${flag_signature}")
- check_cxx_compiler_flag(${flag} "__CxxFlag_${flag_signature}")
- if (${__CxxFlag_${flag_signature}})
- list(APPEND out_array "${flag}")
- endif()
- endforeach()
- set(${out} "${out_array}" PARENT_SCOPE)
-endfunction()
-
-# Support for various sanitizers provided by C/C++ compilers.
-function(asmjit_detect_sanitizers out)
- set(_out_array ${${out}})
- set(_flags "")
-
- foreach(_arg ${ARGN})
- string(REPLACE "," ";" _arg "${_arg}")
- list(APPEND _flags ${_arg})
- endforeach()
-
- foreach(_flag ${_flags})
- if (NOT "${_flag}" MATCHES "^-fsanitize=")
- SET(_flag "-fsanitize=${_flag}")
- endif()
-
- # Sanitizers also require link flags, see CMAKE_REQUIRED_FLAGS.
- set(CMAKE_REQUIRED_FLAGS "${_flag}")
- asmjit_detect_cflags(_out_array ${_flag})
- unset(CMAKE_REQUIRED_FLAGS)
- endforeach()
-
- set(${out} "${_out_array}" PARENT_SCOPE)
-endfunction()
-
-function(asmjit_add_target target target_type)
- set(single_val "")
- set(multi_val SOURCES LIBRARIES CFLAGS CFLAGS_DBG CFLAGS_REL)
- cmake_parse_arguments("X" "" "${single_val}" "${multi_val}" ${ARGN})
-
- if ("${target_type}" MATCHES "^(EXECUTABLE|TEST)$")
- add_executable(${target} ${X_SOURCES})
- else()
- add_library(${target} ${target_type} ${X_SOURCES})
- endif()
-
- set_target_properties(${target} PROPERTIES DEFINE_SYMBOL "")
- target_link_libraries(${target} PRIVATE ${X_LIBRARIES})
-
- # target_link_options was added in cmake v3.13, don't use it for now...
- foreach(link_flag ${ASMJIT_PRIVATE_LFLAGS})
- set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flag}")
- endforeach()
-
- target_compile_features(${target} PUBLIC cxx_std_11)
- set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS NO)
- set_property(TARGET ${target} PROPERTY CXX_VISIBILITY_PRESET hidden)
- target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$<CONFIG:Debug>:${X_CFLAGS_DBG}> $<$<NOT:$<CONFIG:Debug>>:${X_CFLAGS_REL}>)
-
- if ("${target_type}" STREQUAL "TEST")
- add_test(NAME ${target} COMMAND ${target})
- endif()
-endfunction()
-
-# AsmJit - Compiler Support
-# =========================
-
-# We will have to keep this most likely forever as some users may still be using it.
-set(ASMJIT_INCLUDE_DIR "${ASMJIT_INCLUDE_DIRS}")
-
-if (NOT ASMJIT_NO_CUSTOM_FLAGS)
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
- list(APPEND ASMJIT_PRIVATE_CFLAGS
- -MP # [+] Multi-Process Compilation.
- -GF # [+] Eliminate duplicate strings.
- -Zc:__cplusplus # [+] Conforming __cplusplus definition.
- -Zc:inline # [+] Remove unreferenced COMDAT.
- -Zc:strictStrings # [+] Strict const qualification of string literals.
- -Zc:threadSafeInit- # [-] Thread-safe statics.
- -W4) # [+] Warning level 4.
-
- list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG
- -GS) # [+] Buffer security-check.
-
- list(APPEND ASMJIT_PRIVATE_CFLAGS_REL
- -GS- # [-] Buffer security-check.
- -O2 # [+] Favor speed over size.
- -Oi) # [+] Generate intrinsic functions.
- elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang)$")
- list(APPEND ASMJIT_PRIVATE_CFLAGS -Wall -Wextra -Wconversion)
- list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-math-errno)
- list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2)
-
- # -fno-semantic-interposition is not available on apple - the compiler issues a warning, which is not detected.
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
- asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics)
- else()
- asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics -fno-semantic-interposition)
- endif()
-
- # The following flags can save few bytes in the resulting binary.
- asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL
- -fmerge-all-constants # Merge all constants even if it violates ISO C++.
- -fno-enforce-eh-specs) # Don't enforce termination if noexcept function throws.
- endif()
-endif()
-
-# Support for sanitizers.
-if (ASMJIT_SANITIZE)
- asmjit_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE})
- if (ASMJIT_SANITIZE_CFLAGS)
- message("-- Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'")
-
- # Linker must receive the same flags as the compiler when it comes to sanitizers.
- set(ASMJIT_SANITIZE_LFLAGS ${ASMJIT_SANITIZE_CFLAGS})
-
- # Don't omit frame pointer if sanitizers are enabled.
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
- list(APPEND ASMJIT_SANITIZE_CFLAGS -Oy-)
- else()
- list(APPEND ASMJIT_SANITIZE_CFLAGS -fno-omit-frame-pointer -g)
- endif()
-
- list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_SANITIZE_CFLAGS})
- list(APPEND ASMJIT_PRIVATE_LFLAGS ${ASMJIT_SANITIZE_LFLAGS})
+# Don't create a project if it was already created by another CMakeLists.txt. This makes
+# it possible to support both add_subdirectory() and include() ways of using AsmJit as a
+# dependency.
+if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmjit")
+ project(asmjit
+ LANGUAGES CXX
+ DESCRIPTION "Low-latency machine code generation"
+ HOMEPAGE_URL "https://asmjit.com")
+endif()
+
+set(ASMJIT_SANITIZE "" CACHE STRING "Sanitizers to use (development)")
+set(ASMJIT_SANITIZE_OPTS "" CACHE STRING "Extra flags for sanitizers (development)")
+
+option(ASMJIT_EMBED "Embed 'asmjit' as an interface library (no static/shared library)" OFF)
+option(ASMJIT_STATIC "Build 'asmjit' as a static library (implied by ASMJIT_EMBED)" ${ASMJIT_EMBED})
+option(ASMJIT_TEST "Build 'asmjit' tests and benchmarks (development)" OFF)
+
+option(ASMJIT_NO_NATVIS "Disable natvis support (embedding asmjit.natvis in PDB)" OFF)
+option(ASMJIT_NO_CUSTOM_FLAGS "Disable extra compilation flags added by AsmJit to its targets" OFF)
+option(ASMJIT_NO_ABI_NAMESPACE "Disable the use of inline ABI namespace {asmjit::v...}" OFF)
+option(ASMJIT_NO_SHM_OPEN "Disable the use of shm_open() (some platforms have better options)" OFF)
+option(ASMJIT_NO_X86 "Disable X86/X64 backend" OFF)
+option(ASMJIT_NO_AARCH64 "Disable AArch64 backend" OFF)
+option(ASMJIT_NO_FOREIGN "Disable all foreign backends (enables only a backend that matches the target)" OFF)
+option(ASMJIT_NO_JIT "Disable VirtMem, JitAllocator, and JitRuntime at build time" OFF)
+option(ASMJIT_NO_TEXT "Disable textual representation of instructions, enums, cpu features, ..." OFF)
+option(ASMJIT_NO_LOGGING "Disable logging features (build feature)" ${ASMJIT_NO_TEXT})
+option(ASMJIT_NO_INTROSPECTION "Disable instruction validation and introspection API (build feature)" OFF)
+option(ASMJIT_NO_BUILDER "Disable AsmJit's Builder emitter (build feature)" OFF)
+
+if (NOT ASMJIT_NO_BUILDER AND NOT ASMJIT_NO_INTROSPECTION)
+ option(ASMJIT_NO_COMPILER "Disable AsmJit's Compiler emitter (build feature)" OFF)
+else()
+ if (NOT ASMJIT_NO_COMPILER)
+ unset(ASMJIT_NO_COMPILER CACHE)
endif()
+ option(ASMJIT_NO_COMPILER "Disable AsmJit's Compiler emitter (build feature)" ON)
endif()
-if (WIN32)
- # Dependency: nothing extra at the moment.
-elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
- # Dependency: libc is the only required library on Android as it also provides libthread.
- message("-- Dependency: adding libc (Android target detected)")
- list(APPEND ASMJIT_DEPS c)
-elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku")
- # Dependency: libroot is used by Haiku instead of libc, so link to libroot and libpthread.
- message("-- Dependency: adding libroot and libpthread (Haiku target detected)")
- list(APPEND ASMJIT_DEPS root pthread)
+if (NOT ASMJIT_NO_COMPILER)
+ option(ASMJIT_NO_UJIT "Disable AsmJit's UniCompiler backend (build feature)" OFF)
else()
- # Dependency: libc is always required.
- message("-- Dependency: adding libc (Linux, BSD, or other UNIX/POSIX environment)")
- list(APPEND ASMJIT_DEPS c)
-
- # Dependency: pthread (required so AsmJit can use pthread_lock).
- check_cxx_source_compiles("
- #include <pthread.h>
- int main() {
- pthread_mutex_t m;
- pthread_mutex_init(&m, nullptr);
- return pthread_mutex_destroy(&m);
- }
- " ASMJIT_LIBC_HAS_LIBPTHREAD)
- if (ASMJIT_LIBC_HAS_LIBPTHREAD)
- message("-- Dependency: libpthread provided by libc (not linking to libpthread)")
- else()
- message("-- Dependency: libpthread not provided by libc, linking to libpthread")
- list(APPEND ASMJIT_DEPS pthread)
- endif()
-
- # Dependency: shm_open (required so AsmJit can use shm_open on supported platforms).
- if ("${CMAKE_SYSTEM_NAME}" MATCHES "^(Linux|NetBSD)$" AND NOT ASMJIT_NO_SHM_OPEN)
- check_cxx_source_compiles("
- #include <sys/mman.h>
- int main() {
- const char file_name[1] {};
- return shm_open(file_name, 0, 0);
- }
- " ASMJIT_LIBC_HAS_LIBRT)
- if (ASMJIT_LIBC_HAS_LIBRT)
- message("-- Dependency: shm_open provided by libc (not linking to librt)")
- else()
- message("-- Dependency: shm_open not provided by libc, linking to librt")
- list(APPEND ASMJIT_DEPS rt)
- endif()
+ if (NOT ASMJIT_NO_UJIT)
+ unset(ASMJIT_NO_UJIT CACHE)
endif()
+ option(ASMJIT_NO_UJIT "Disable AsmJit's UniCompiler backend (build feature)" ON)
endif()
-set(ASMJIT_LIBS ${ASMJIT_DEPS})
-if (NOT ASMJIT_EMBED)
- list(INSERT ASMJIT_LIBS 0 asmjit)
-endif()
+# AsmJit - Build Definitions and Source Files
+# ===========================================
+
+set(ASMJIT_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}") # AsmJit include directory is the same as <root> directory.
+set(ASMJIT_LIBS "") # AsmJit library dependencies for the linker.
+set(ASMJIT_CFLAGS "") # Public compiler flags.
+set(ASMJIT_PRIVATE_CFLAGS "") # Private compiler flags independent of build type.
+set(ASMJIT_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds.
+set(ASMJIT_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds.
+set(ASMJIT_SANITIZE_CFLAGS "") # Compiler flags required by currently enabled sanitizers.
+set(ASMJIT_SANITIZE_LFLAGS "") # Linker flags required by currently enabled sanitizers.
if (ASMJIT_EMBED)
set(ASMJIT_TARGET_TYPE "EMBED")
@@ -355,44 +115,13 @@ elseif (ASMJIT_STATIC)
else()
set(ASMJIT_TARGET_TYPE "SHARED")
endif()
+message(STATUS "[asmjit] == Configuring AsmJit ('ASMJIT_TARGET_TYPE=${ASMJIT_TARGET_TYPE}') ==")
-foreach(build_option # AsmJit build options.
- ASMJIT_STATIC
- ASMJIT_NO_DEPRECATED
- # AsmJit backends selection.
- ASMJIT_NO_X86
- ASMJIT_NO_AARCH64
- ASMJIT_NO_FOREIGN
- # AsmJit features selection.
- ASMJIT_NO_JIT
- ASMJIT_NO_TEXT
- ASMJIT_NO_LOGGING
- ASMJIT_NO_INTROSPECTION
- ASMJIT_NO_VALIDATION
- ASMJIT_NO_BUILDER
- ASMJIT_NO_COMPILER)
- if (${build_option})
- List(APPEND ASMJIT_CFLAGS "-D${build_option}")
- List(APPEND ASMJIT_PRIVATE_CFLAGS "-D${build_option}")
- endif()
-endforeach()
-
-# AsmJit - Linker Support
-# =======================
-
-if (WIN32)
- if (CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe")
- set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE)
- endif()
-endif()
-
-# AsmJit - Source
-# ===============
-
-set(ASMJIT_SRC_LIST
+set(ASMJIT_SRC
asmjit/asmjit.h
asmjit/asmjit-scope-begin.h
asmjit/asmjit-scope-end.h
+ asmjit/host.h
asmjit/core.h
asmjit/core/api-build_p.h
@@ -426,6 +155,7 @@ set(ASMJIT_SRC_LIST
asmjit/core/environment.h
asmjit/core/errorhandler.cpp
asmjit/core/errorhandler.h
+ asmjit/core/fixup.h
asmjit/core/formatter.cpp
asmjit/core/formatter.h
asmjit/core/func.cpp
@@ -451,44 +181,51 @@ set(ASMJIT_SRC_LIST
asmjit/core/osutils.h
asmjit/core/osutils_p.h
asmjit/core/raassignment_p.h
- asmjit/core/rabuilders_p.h
+ asmjit/core/racfgblock_p.h
+ asmjit/core/racfgbuilder_p.h
+ asmjit/core/raconstraints_p.h
asmjit/core/radefs_p.h
+ asmjit/core/rainst_p.h
asmjit/core/ralocal.cpp
asmjit/core/ralocal_p.h
asmjit/core/rapass.cpp
asmjit/core/rapass_p.h
+ asmjit/core/rareg_p.h
asmjit/core/rastack.cpp
asmjit/core/rastack_p.h
asmjit/core/string.cpp
asmjit/core/string.h
- asmjit/core/support.cpp
- asmjit/core/support.h
asmjit/core/target.cpp
asmjit/core/target.h
asmjit/core/type.cpp
asmjit/core/type.h
asmjit/core/virtmem.cpp
asmjit/core/virtmem.h
- asmjit/core/zone.cpp
- asmjit/core/zone.h
- asmjit/core/zonehash.cpp
- asmjit/core/zonehash.h
- asmjit/core/zonelist.cpp
- asmjit/core/zonelist.h
- asmjit/core/zonestack.cpp
- asmjit/core/zonestack.h
- asmjit/core/zonestring.h
- asmjit/core/zonetree.cpp
- asmjit/core/zonetree.h
- asmjit/core/zonevector.cpp
- asmjit/core/zonevector.h
+
+ asmjit/support/arena.cpp
+ asmjit/support/arena.h
+ asmjit/support/arenabitset.cpp
+ asmjit/support/arenabitset_p.h
+ asmjit/support/arenahash.cpp
+ asmjit/support/arenahash.h
+ asmjit/support/arenalist.cpp
+ asmjit/support/arenalist.h
+ asmjit/support/arenapool.h
+ asmjit/support/arenastring.h
+ asmjit/support/arenatree.cpp
+ asmjit/support/arenatree.h
+ asmjit/support/arenavector.cpp
+ asmjit/support/arenavector.h
+ asmjit/support/span.h
+ asmjit/support/support.cpp
+ asmjit/support/support.h
+ asmjit/support/support_p.h
asmjit/a64.h
asmjit/arm.h
asmjit/arm/armformatter.cpp
asmjit/arm/armformatter_p.h
asmjit/arm/armglobals.h
- asmjit/arm/armoperand.h
asmjit/arm/armutils.h
asmjit/arm/a64archtraits_p.h
asmjit/arm/a64assembler.cpp
@@ -539,139 +276,371 @@ set(ASMJIT_SRC_LIST
asmjit/x86/x86operand.h
asmjit/x86/x86rapass.cpp
asmjit/x86/x86rapass_p.h
+
+ asmjit/ujit.h
+ asmjit/ujit/ujitbase.h
+ asmjit/ujit/unicompiler.h
+ asmjit/ujit/unicompiler_a64.cpp
+ asmjit/ujit/unicompiler_x86.cpp
+ asmjit/ujit/unicompiler_utils_p.h
+ asmjit/ujit/unicondition.h
+ asmjit/ujit/uniop.h
+ asmjit/ujit/vecconsttable.cpp
+ asmjit/ujit/vecconsttable.h
)
-if (MSVC AND NOT ASMJIT_NO_NATVIS)
- list(APPEND ASMJIT_SRC_LIST asmjit.natvis)
+# AsmJit - CMake Utilities
+# ========================
+
+include(CheckCXXCompilerFlag)
+include(CheckCXXSourceCompiles)
+include(GNUInstallDirs)
+
+# Detects target architecture - since the code doesn't run it works also for cross-compilation.
+function(asmjit_detect_target_arch out)
+ set(${out} "unknown" PARENT_SCOPE)
+ foreach(target_arch "X86_64" "AARCH64" "X86" "AARCH32")
+ check_cxx_source_compiles("
+ #if defined(_M_X64) || defined(__x86_64__)
+ static int target_arch_is_X86_64() { return 1; }
+ #elif defined(_M_IX86) || defined(__X86__) || defined(__i386__)
+ static int target_arch_is_X86() { return 1; }
+ #elif defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__)
+ static int target_arch_is_AARCH64() { return 1; }
+ #elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__) || defined(__thumb2__)
+ static int target_arch_is_AARCH32() { return 1; }
+ #endif
+ int main(void) { return target_arch_is_${target_arch}(); }" "${out}_${target_arch}")
+ if (${${out}_${target_arch}})
+ set(${out} "${target_arch}" PARENT_SCOPE)
+ return()
+ endif()
+ endforeach()
+endfunction()
+
+# Detects C++ compile flags and appends all detected ones to `out`.
+function(asmjit_detect_cflags out)
+ set(out_array ${${out}})
+ foreach(flag ${ARGN})
+ string(REGEX REPLACE "[+]" "x" flag_signature "${flag}")
+ string(REGEX REPLACE "[-=:;/.\]" "_" flag_signature "${flag_signature}")
+ check_cxx_compiler_flag(${flag} "__CxxFlag_${flag_signature}")
+ if (${__CxxFlag_${flag_signature}})
+ list(APPEND out_array "${flag}")
+ endif()
+ endforeach()
+ set(${out} "${out_array}" PARENT_SCOPE)
+endfunction()
+
+# Support for various sanitizers provided by C/C++ compilers.
+function(asmjit_detect_sanitizers out)
+ set(_out_array ${${out}})
+ set(_flags "")
+
+ foreach(_arg ${ARGN})
+ string(REPLACE "," ";" _arg "${_arg}")
+ list(APPEND _flags ${_arg})
+ endforeach()
+
+ foreach(_flag ${_flags})
+ if (NOT "${_flag}" MATCHES "^-fsanitize=")
+ SET(_flag "-fsanitize=${_flag}")
+ endif()
+
+ # Sanitizers also require link flags, see CMAKE_REQUIRED_FLAGS.
+ set(CMAKE_REQUIRED_FLAGS "${_flag}")
+ asmjit_detect_cflags(_out_array ${_flag})
+ unset(CMAKE_REQUIRED_FLAGS)
+ endforeach()
+
+ set(${out} "${_out_array}" PARENT_SCOPE)
+endfunction()
+
+function(asmjit_add_target target target_type)
+ set(single_val "")
+ set(multi_val SOURCES LIBRARIES CFLAGS CFLAGS_DBG CFLAGS_REL)
+ cmake_parse_arguments("X" "" "${single_val}" "${multi_val}" ${ARGN})
+
+ if ("${target_type}" MATCHES "^(EXECUTABLE|TEST)$")
+ add_executable(${target} ${X_SOURCES})
+ else()
+ add_library(${target} ${target_type} ${X_SOURCES})
+ endif()
+
+ set_target_properties(${target}
+ PROPERTIES
+ DEFINE_SYMBOL ""
+ CXX_VISIBILITY_PRESET hidden)
+ target_compile_options(${target} PRIVATE ${X_CFLAGS} ${ASMJIT_SANITIZE_CFLAGS} $<$<CONFIG:Debug>:${X_CFLAGS_DBG}> $<$<NOT:$<CONFIG:Debug>>:${X_CFLAGS_REL}>)
+ target_compile_features(${target} PUBLIC cxx_std_17)
+ target_link_options(${target} PRIVATE ${ASMJIT_PRIVATE_LFLAGS})
+ target_link_libraries(${target} PRIVATE ${X_LIBRARIES})
+
+ if ("${target_type}" STREQUAL "TEST")
+ add_test(NAME ${target} COMMAND ${target})
+ endif()
+endfunction()
+
+# AsmJit - Compiler Support
+# =========================
+
+if (NOT ASMJIT_EMBED)
+ if (NOT ASMJIT_NO_CUSTOM_FLAGS)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -W4) # [+] Warning level 4.
+
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -MP) # [+] Multi-Process Compilation.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -GF) # [+] Eliminate duplicate strings.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -Zc:__cplusplus) # [+] Conforming __cplusplus definition.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -Zc:inline) # [+] Remove unreferenced COMDAT.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -Zc:strictStrings) # [+] Strict const qualification of string literals.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -Zc:threadSafeInit-) # [-] Thread-safe statics.
+
+ list(APPEND ASMJIT_PRIVATE_CFLAGS_DBG -GS) # [+] Buffer security-check.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -GS-) # [-] Buffer security-check.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2) # [+] Favor speed over size.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -Oi) # [+] Generate intrinsic functions.
+ elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang")
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -Wall -Wextra -Wconversion) # [+] Add baseline warnings that can be used safely even with system headers.
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -Wdouble-promotion) # [+] Warn about double promotions.
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -Wduplicated-cond) # [+] Warn about duplicate conditions.
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -Wduplicated-branches) # [+] Warn about duplicate branches.
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -Wlogical-op) # [+] Warn about suspicious uses of logical operators in expressions.
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -Wlogical-not-parentheses) # [+] Warn about logical not used on the left hand side operand of a comparison.
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -Wrestrict)
+
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-math-errno) # [-] Disable math functions setting errno (performance reasons).
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -fno-threadsafe-statics) # [-] Don't add guards when initializing statics (we don't need it).
+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -O2) # [+] Compiling with -O2 in release mode is what we generally want.
+ list(APPEND ASMJIT_PRIVATE_CFLAGS_REL -fmerge-all-constants) # [+] We don't need unique address per constant (merging improves library size).
+
+ # -fno-semantic-interposition is not available on apple - the compiler issues a warning, which is not detected.
+ if (NOT APPLE)
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS -fno-semantic-interposition)
+ endif()
+
+ if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "iOS")
+ asmjit_detect_cflags(ASMJIT_PRIVATE_CFLAGS_REL -fno-enforce-eh-specs) # [-] Don't enforce termination if noexcept function throws.
+ endif()
+ endif()
+ endif()
+
+ # Support for sanitizers.
+ if (ASMJIT_SANITIZE)
+ asmjit_detect_sanitizers(ASMJIT_SANITIZE_CFLAGS ${ASMJIT_SANITIZE})
+ if (ASMJIT_SANITIZE_CFLAGS)
+ message(STATUS "[asmjit] Enabling sanitizers: '${ASMJIT_SANITIZE_CFLAGS}'")
+
+ # Linker must receive the same flags as the compiler when it comes to sanitizers.
+ set(ASMJIT_SANITIZE_LFLAGS ${ASMJIT_SANITIZE_CFLAGS})
+
+ # Don't omit frame pointer if sanitizers are enabled.
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
+ list(APPEND ASMJIT_SANITIZE_CFLAGS -Oy-)
+ else()
+ list(APPEND ASMJIT_SANITIZE_CFLAGS -fno-omit-frame-pointer -g)
+ endif()
+
+ list(APPEND ASMJIT_PRIVATE_CFLAGS ${ASMJIT_SANITIZE_CFLAGS})
+ list(APPEND ASMJIT_PRIVATE_LFLAGS ${ASMJIT_SANITIZE_LFLAGS})
+ endif()
+ endif()
endif()
-set(ASMJIT_SRC "")
-foreach(src_file ${ASMJIT_SRC_LIST})
- set(src_file "${ASMJIT_DIR}/src/${src_file}")
- list(APPEND ASMJIT_SRC ${src_file})
+if ("${CMAKE_SYSTEM_NAME}" MATCHES "^Windows")
+ # Dependency: Windows target needs no extra dependencies, however, we have to check for .natvis support.
+ if(CMAKE_LINKER MATCHES "^(lld-link|link)\\.exe$")
+ set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE)
+ endif()
+elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
+ # Dependency: libc is the only required library on Android as it also provides libpthread.
+ message(STATUS "[asmjit] Adding 'libc' dependency (Android)")
+ list(APPEND ASMJIT_LIBS c)
+elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku")
+ # Dependency: libroot is used by Haiku instead of libc, so link to libroot and libpthread.
+ message(STATUS "[asmjit] Adding 'libroot' and 'libpthread' dependencies (Haiku)")
+ list(APPEND ASMJIT_LIBS root pthread)
+else()
+ # Dependency: libc is always required.
+ message(STATUS "[asmjit] Adding 'libc' dependency (Linux, BSD, or other UNIX/POSIX environment)")
+ list(APPEND ASMJIT_LIBS c)
- if ("${src_file}" MATCHES "\\.natvis")
- if (ASMJIT_LINKER_SUPPORTS_NATVIS)
- list(APPEND ASMJIT_PRIVATE_LFLAGS "-natvis:${src_file}")
+ # Dependency: pthread (required so AsmJit can use pthread_lock).
+ check_cxx_source_compiles("
+ #include <pthread.h>
+ int main() {
+ pthread_mutex_t m;
+ pthread_mutex_init(&m, nullptr);
+ return pthread_mutex_destroy(&m);
+ }
+ " ASMJIT_LIBC_HAS_LIBPTHREAD)
+ if (ASMJIT_LIBC_HAS_LIBPTHREAD)
+ message(STATUS "[asmjit] Library 'libpthread' provided by 'libc' (not linking to libpthread)")
+ else()
+ message(STATUS "[asmjit] Library 'libpthread' not provided by 'libc' (linking to libpthread)")
+ list(APPEND ASMJIT_LIBS pthread)
+ endif()
+
+ # Dependency: shm_open (required so AsmJit can use shm_open on supported platforms).
+ if ("${CMAKE_SYSTEM_NAME}" MATCHES "^(Linux|NetBSD)$" AND NOT ASMJIT_NO_SHM_OPEN)
+ check_cxx_source_compiles("
+ #include <sys/mman.h>
+ int main() {
+ const char file_name[1] {};
+ return shm_open(file_name, 0, 0);
+ }
+ " ASMJIT_LIBC_HAS_LIBRT)
+ if (ASMJIT_LIBC_HAS_LIBRT)
+ message(STATUS "[asmjit] Symbol 'shm_open' provided by libc (not linking to librt)")
+ else()
+ message(STATUS "[asmjit] Symbol 'shm_open' not provided by libc, linking to librt")
+ list(APPEND ASMJIT_LIBS rt)
endif()
endif()
-endforeach()
+endif()
-source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC})
+if (ASMJIT_STATIC OR ASMJIT_EMBED)
+ list(APPEND ASMJIT_CFLAGS -DASMJIT_STATIC)
+endif()
-# AsmJit - Summary
-# ================
+if (ASMJIT_NO_SHM_OPEN)
+ list(APPEND ASMJIT_PRIVATE_CFLAGS -DASMJIT_NO_SHM_OPEN)
+endif()
+
+foreach(build_option ASMJIT_NO_X86
+ ASMJIT_NO_AARCH64
+ ASMJIT_NO_FOREIGN
+ ASMJIT_NO_ABI_NAMESPACE
+ ASMJIT_NO_JIT
+ ASMJIT_NO_TEXT
+ ASMJIT_NO_LOGGING
+ ASMJIT_NO_INTROSPECTION
+ ASMJIT_NO_BUILDER
+ ASMJIT_NO_COMPILER
+ ASMJIT_NO_UJIT)
+ if (${build_option})
+ list(APPEND ASMJIT_CFLAGS "-D${build_option}")
+ endif()
+endforeach()
+
+if (ASMJIT_LINKER_SUPPORTS_NATVIS AND NOT ASMJIT_NO_NATVIS)
+ list(APPEND ASMJIT_SRC asmjit/asmjit.natvis)
+ list(APPEND ASMJIT_PRIVATE_LFLAGS "-natvis:${CMAKE_CURRENT_LIST_DIR}/asmjit/asmjit.natvis")
+endif()
-message("** AsmJit Summary **")
-message(" ASMJIT_DIR=${ASMJIT_DIR}")
-message(" ASMJIT_TEST=${ASMJIT_TEST}")
-message(" ASMJIT_TARGET_TYPE=${ASMJIT_TARGET_TYPE}")
-message(" ASMJIT_DEPS=${ASMJIT_DEPS}")
-message(" ASMJIT_LIBS=${ASMJIT_LIBS}")
-message(" ASMJIT_CFLAGS=${ASMJIT_CFLAGS}")
-message(" ASMJIT_PRIVATE_CFLAGS=${ASMJIT_PRIVATE_CFLAGS}")
-message(" ASMJIT_PRIVATE_CFLAGS_DBG=${ASMJIT_PRIVATE_CFLAGS_DBG}")
-message(" ASMJIT_PRIVATE_CFLAGS_REL=${ASMJIT_PRIVATE_CFLAGS_REL}")
+source_group(TREE "${CMAKE_CURRENT_LIST_DIR}" FILES ${ASMJIT_SRC})
# AsmJit - Targets
# ================
-if (NOT ASMJIT_EMBED)
- # Add AsmJit target.
+message(STATUS "[asmjit] Adding 'asmjit::asmjit' target ('ASMJIT_TARGET_TYPE=${ASMJIT_TARGET_TYPE}')")
+
+if (ASMJIT_EMBED)
+ add_library(asmjit_embed INTERFACE)
+ target_sources(asmjit_embed INTERFACE ${ASMJIT_SRC})
+ target_link_libraries(asmjit_embed INTERFACE ${ASMJIT_LIBS})
+ target_compile_options(asmjit_embed INTERFACE ${ASMJIT_CFLAGS})
+ target_include_directories(asmjit_embed BEFORE INTERFACE ${ASMJIT_INCLUDE_DIRS})
+ add_library(asmjit::asmjit ALIAS asmjit_embed)
+else()
+ foreach(v "ASMJIT_LIBS"
+ "ASMJIT_CFLAGS"
+ "ASMJIT_PRIVATE_CFLAGS"
+ "ASMJIT_PRIVATE_CFLAGS_DBG"
+ "ASMJIT_PRIVATE_CFLAGS_REL"
+ "ASMJIT_SANITIZE_CFLAGS"
+ "ASMJIT_SANITIZE_LFLAGS")
+ if (NOT "${${v}}" STREQUAL "")
+ message(" ${v}=${${v}}")
+ endif()
+ endforeach()
+
asmjit_add_target(asmjit "${ASMJIT_TARGET_TYPE}"
- SOURCES ${ASMJIT_SRC}
- LIBRARIES ${ASMJIT_DEPS}
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
-
- target_compile_options(asmjit INTERFACE ${ASMJIT_CFLAGS})
- target_include_directories(asmjit BEFORE INTERFACE
- $<BUILD_INTERFACE:${ASMJIT_INCLUDE_DIRS}>
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
-
- # Add blend2d::blend2d alias.
+ SOURCES ${ASMJIT_SRC}
+ LIBRARIES ${ASMJIT_LIBS}
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+
+ target_compile_options(asmjit PUBLIC ${ASMJIT_CFLAGS})
+ target_include_directories(asmjit BEFORE PUBLIC $<BUILD_INTERFACE:${ASMJIT_INCLUDE_DIRS}>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
add_library(asmjit::asmjit ALIAS asmjit)
- # TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now.
- add_library(AsmJit::AsmJit ALIAS asmjit)
- # Add AsmJit install instructions (library and public headers).
+ # AsmJit - Install Instructions
+ # -----------------------------
+
if (NOT ASMJIT_NO_INSTALL)
+ message(STATUS "[asmjit] Enabling install support ('ASMJIT_NO_INSTALL=OFF')")
+
install(TARGETS asmjit
EXPORT asmjit-config
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+
install(EXPORT asmjit-config
NAMESPACE asmjit::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/asmjit")
- foreach(_src_file ${ASMJIT_SRC_LIST})
+ foreach(_src_file ${ASMJIT_SRC})
if ("${_src_file}" MATCHES "\\.h$" AND NOT "${_src_file}" MATCHES "_p\\.h$")
get_filename_component(_src_dir ${_src_file} PATH)
- install(FILES "${ASMJIT_DIR}/src/${_src_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_src_dir}")
+ install(FILES "${CMAKE_CURRENT_LIST_DIR}/${_src_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_src_dir}")
endif()
endforeach()
endif()
- # Add AsmJit tests.
+ # AsmJit - Tests & Benchmarks
+ # ---------------------------
+
if (ASMJIT_TEST)
enable_testing()
+ message(STATUS "[asmjit] Enabling AsmJit tests ('ASMJIT_TEST=${ASMJIT_TEST}')")
# Special target that always uses embedded AsmJit.
- asmjit_add_target(asmjit_test_unit TEST
- SOURCES ${ASMJIT_SRC}
- test/asmjit_test_unit.cpp
- test/broken.cpp
- test/broken.h
- LIBRARIES ${ASMJIT_DEPS}
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- -DASMJIT_TEST
- -DASMJIT_STATIC
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
- target_include_directories(asmjit_test_unit BEFORE PRIVATE ${ASMJIT_INCLUDE_DIRS})
+ asmjit_add_target(asmjit_test_runner TEST
+ SOURCES ${ASMJIT_SRC}
+ asmjit-testing/tests/asmjit_test_runner.cpp
+ asmjit-testing/tests/broken.cpp
+ asmjit-testing/tests/broken.h
+ LIBRARIES ${ASMJIT_LIBS}
+ CFLAGS ${ASMJIT_CFLAGS}
+ ${ASMJIT_PRIVATE_CFLAGS}
+ -DASMJIT_TEST
+ -DASMJIT_STATIC
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ target_include_directories(asmjit_test_runner BEFORE PRIVATE ${ASMJIT_INCLUDE_DIRS})
asmjit_add_target(asmjit_test_assembler TEST
- SOURCES test/asmjit_test_assembler.cpp
- test/asmjit_test_assembler.h
- test/asmjit_test_assembler_a64.cpp
- test/asmjit_test_assembler_x64.cpp
- test/asmjit_test_assembler_x86.cpp
- LIBRARIES asmjit::asmjit
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
-
- asmjit_add_target(asmjit_test_perf EXECUTABLE
- SOURCES test/asmjit_test_perf.cpp
- test/asmjit_test_perf_a64.cpp
- test/asmjit_test_perf_x86.cpp
- SOURCES test/asmjit_test_perf.h
- LIBRARIES asmjit::asmjit
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
-
- foreach(_target asmjit_test_emitters
- asmjit_test_execute
- asmjit_test_x86_sections)
- asmjit_add_target(${_target} TEST
- SOURCES test/${_target}.cpp
- LIBRARIES asmjit::asmjit
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ SOURCES asmjit-testing/tests/asmjit_test_assembler.cpp
+ asmjit-testing/tests/asmjit_test_assembler.h
+ asmjit-testing/tests/asmjit_test_assembler_a64.cpp
+ asmjit-testing/tests/asmjit_test_assembler_x64.cpp
+ asmjit-testing/tests/asmjit_test_assembler_x86.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+
+ foreach(app asmjit_test_environment asmjit_test_emitters asmjit_test_x86_sections)
+ asmjit_add_target(${app} TEST
+ SOURCES asmjit-testing/tests/${app}.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
endforeach()
if (NOT ASMJIT_NO_INTROSPECTION)
asmjit_add_target(asmjit_test_instinfo TEST
- SOURCES test/asmjit_test_instinfo.cpp
- LIBRARIES asmjit::asmjit
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ SOURCES asmjit-testing/tests/asmjit_test_instinfo.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
endif()
if (NOT (ASMJIT_NO_BUILDER OR ASMJIT_NO_COMPILER))
@@ -679,39 +648,69 @@ if (NOT ASMJIT_EMBED)
# Some compilers don't like passing -msse2 for 64-bit targets, and some compilers targeting non-x86
# would pass "-msse2" compile flag check, but with a warning not detected by CMake. Thus, verify that
# our target is really 32-bit X86 and only use -msse2 or -arch:SSE2 flags when necessary.
- set(ASMJIT_SSE2_CFLAGS "")
+ asmjit_detect_target_arch(ASMJIT_TARGET_ARCH)
- check_cxx_source_compiles("
- #if defined(_M_IX86) || defined(__X86__) || defined(__i386__)
- int target_is_32_bit_x86() { return 1; }
- #else
- // Compile error...
- #endif
-
- int main() {
- return target_is_32_bit_x86();
- }
- " ASMJIT_TARGET_IS_32_BIT_X86)
-
- if (ASMJIT_TARGET_IS_32_BIT_X86)
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
- asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-arch:SSE2")
- else()
- asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS "-msse2")
+ set(ASMJIT_SSE2_CFLAGS "")
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
+ if (ASMJIT_TARGET_ARCH STREQUAL "X86")
+ asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS -arch:SSE2)
+ endif()
+ if (ASMJIT_TARGET_ARCH MATCHES "^(X86|X86_64)$")
+ asmjit_detect_cflags(ASMJIT_AVX2FMA_CFLAGS -arch:AVX2)
+ endif()
+ else()
+ if (ASMJIT_TARGET_ARCH STREQUAL "X86")
+ asmjit_detect_cflags(ASMJIT_SSE2_CFLAGS -msse2)
+ endif()
+ if (ASMJIT_TARGET_ARCH MATCHES "^(X86|X86_64)$")
+ asmjit_detect_cflags(ASMJIT_AVX2FMA_CFLAGS -mavx2 -mfma)
endif()
endif()
+
asmjit_add_target(asmjit_test_compiler TEST
- SOURCES test/asmjit_test_compiler.cpp
- test/asmjit_test_compiler.h
- test/asmjit_test_compiler_a64.cpp
- test/asmjit_test_compiler_x86.cpp
- LIBRARIES asmjit::asmjit
- CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS}
- CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
- CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ SOURCES asmjit-testing/tests/asmjit_test_compiler.cpp
+ asmjit-testing/tests/asmjit_test_compiler.h
+ asmjit-testing/tests/asmjit_test_compiler_a64.cpp
+ asmjit-testing/tests/asmjit_test_compiler_x86.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ endif()
+
+ if (NOT ASMJIT_NO_UJIT)
+ asmjit_add_target(asmjit_test_unicompiler TEST
+ SOURCES asmjit-testing/tests/asmjit_test_unicompiler.cpp
+ asmjit-testing/tests/asmjit_test_unicompiler_sse2.cpp
+ asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp
+ asmjit-testing/tests/broken.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS} ${ASMJIT_SSE2_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ set_property(SOURCE asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp APPEND PROPERTY COMPILE_OPTIONS ${ASMJIT_AVX2FMA_CFLAGS})
endif()
+ asmjit_add_target(asmjit_bench_codegen EXECUTABLE
+ SOURCES asmjit-testing/bench/asmjit_bench_codegen.cpp
+ asmjit-testing/bench/asmjit_bench_codegen_a64.cpp
+ asmjit-testing/bench/asmjit_bench_codegen_x86.cpp
+ SOURCES asmjit-testing/bench/asmjit_bench_codegen.h
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+
+ foreach(app asmjit_bench_overhead asmjit_bench_regalloc)
+ asmjit_add_target(${app} TEST
+ SOURCES asmjit-testing/bench/${app}.cpp
+ LIBRARIES asmjit::asmjit
+ CFLAGS ${ASMJIT_PRIVATE_CFLAGS}
+ CFLAGS_DBG ${ASMJIT_PRIVATE_CFLAGS_DBG}
+ CFLAGS_REL ${ASMJIT_PRIVATE_CFLAGS_REL})
+ endforeach()
+
endif()
endif()
-cmake_policy(POP)
+message(STATUS "[asmjit] == Configuring done ==")
diff --git a/3rdparty/asmjit/CMakePresets.json b/3rdparty/asmjit/CMakePresets.json
new file mode 100644
index 00000000000..862e718ed89
--- /dev/null
+++ b/3rdparty/asmjit/CMakePresets.json
@@ -0,0 +1,53 @@
+{
+ "version": 10,
+ "configurePresets": [
+ {
+ "name": "conf-base",
+ "hidden": true,
+ "description": "${presetName}",
+ "binaryDir": "${sourceDir}/build/${presetName}",
+ "cacheVariables": { "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" }
+ },
+
+ {
+ "name": "conf-debug",
+ "hidden": true,
+ "inherits": "conf-base",
+ "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" }
+ },
+
+ {
+ "name": "conf-release",
+ "hidden": true,
+ "inherits": "conf-base",
+ "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_INTERPROCEDURAL_OPTIMIZATION": "ON" }
+ },
+
+ { "name": "conf-test" , "hidden": true, "cacheVariables": { "ASMJIT_TEST": "ON" } },
+ { "name": "conf-static" , "hidden": true, "cacheVariables": { "ASMJIT_STATIC": "ON" } },
+ { "name": "conf-shared" , "hidden": true, "cacheVariables": { "ASMJIT_STATIC": "OFF" } },
+ { "name": "conf-asan" , "hidden": true, "cacheVariables": { "ASMJIT_SANITIZE": "address" } },
+ { "name": "conf-msan" , "hidden": true, "cacheVariables": { "ASMJIT_SANITIZE": "memory" } },
+ { "name": "conf-tsan" , "hidden": true, "cacheVariables": { "ASMJIT_SANITIZE": "thread" } },
+ { "name": "conf-ubsan" , "hidden": true, "cacheVariables": { "ASMJIT_SANITIZE": "undefined" } },
+ { "name": "conf-32" , "hidden": true, "environment": { "CFLAGS": "-m32", "CXXFLAGS": "-m32" } },
+ { "name": "conf-avx2" , "hidden": true, "environment": { "CXXFLAGS": "-mavx2 -mbmi -mbmi2" } },
+
+ { "name": "debug" , "inherits": ["conf-debug", "conf-test", "conf-static"] },
+ { "name": "debug-asan" , "inherits": ["conf-debug", "conf-test", "conf-static", "conf-asan"] },
+ { "name": "debug-msan" , "inherits": ["conf-debug", "conf-test", "conf-static", "conf-msan"] },
+ { "name": "debug-ubsan" , "inherits": ["conf-debug", "conf-test", "conf-static", "conf-ubsan"] },
+ { "name": "debug-32" , "inherits": ["conf-debug", "conf-test", "conf-static", "conf-32"] },
+ { "name": "debug-shared" , "inherits": ["conf-debug", "conf-test", "conf-shared"] },
+ { "name": "debug-shared-32" , "inherits": ["conf-debug", "conf-test", "conf-shared", "conf-32"] },
+
+ { "name": "release" , "inherits": ["conf-release", "conf-test", "conf-static"] },
+ { "name": "release-avx2" , "inherits": ["conf-release", "conf-test", "conf-static", "conf-avx2"] },
+ { "name": "release-asan" , "inherits": ["conf-release", "conf-test", "conf-static", "conf-asan"] },
+ { "name": "release-msan" , "inherits": ["conf-release", "conf-test", "conf-static", "conf-msan"] },
+ { "name": "release-ubsan" , "inherits": ["conf-release", "conf-test", "conf-static", "conf-ubsan"] },
+ { "name": "release-32" , "inherits": ["conf-release", "conf-test", "conf-static", "conf-32"] },
+ { "name": "release-shared" , "inherits": ["conf-release", "conf-test", "conf-shared"] },
+ { "name": "release-shared-32", "inherits": ["conf-release", "conf-test", "conf-shared", "conf-32"] }
+ ]
+}
diff --git a/3rdparty/asmjit/CONTRIBUTING.md b/3rdparty/asmjit/CONTRIBUTING.md
index 54f5047b223..7c33cc036f4 100644
--- a/3rdparty/asmjit/CONTRIBUTING.md
+++ b/3rdparty/asmjit/CONTRIBUTING.md
@@ -10,7 +10,7 @@
### Asking questions
- * We prefer GitHub issues to be used for reporting bugs or feature requests, but it's still okay to ask questions there as well. However, please consider joining our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) to ask questions; it has an active community that can quickly respond.
+ * We prefer GitHub issues to be used for reporting bugs or feature requests, but it's still okay to ask questions there as well. However, please consider joining our [Public Chat](https://app.element.io/#/room/#asmjit:matrix.org) to ask questions; it has an active community that can quickly respond.
### Suggesting feature requests
@@ -26,7 +26,7 @@
### Suggesting a website content enhancement
- * [AsmJit's website](https://asmjit.com) is also generated, but not from public sources at the moment. If you did find an issue on the website you can either use contact information on the [support page](https://asmjit.com/support.html) or to discuss the change on our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im). Alternatively, opening a regular issue is also okay.
+ * [AsmJit's website](https://asmjit.com) is also generated, but not from public sources at the moment. If you did find an issue on the website you can either use contact information on the [support page](https://asmjit.com/support.html) or to discuss the change on our [Public Chat](https://app.element.io/#/room/#asmjit:matrix.org). Alternatively, opening a regular issue is also okay.
## Coding Style & Consistency
@@ -37,42 +37,44 @@
* Initially, AsmJit coding style was based on Google C++ Style Guide, but it has diverged from it.
- * Include guards use `<PATH_TO_SRC>_H_INCLUDED` format.
+ * Include guards use `ASMJIT_<...PATH...>_H_INCLUDED` format.
* `asmjit` namespace must be open by `ASMJIT_BEGIN_NAMESPACE` and closed by `ASMJIT_END_NAMESPACE`
* `asmjit::xxx` (backend specific) nested namespace must be open by `ASMJIT_BEGIN_SUB_NAMESPACE(xxx)` and closed by `ASMJIT_END_SUB_NAMESPACE`.
- * Opening bracket is on the same line, like `struct Something {`, `if (condition) {`, etc...
+ * Opening brackets are on the same line, like `struct Something {`, `if (condition) {`, etc...
* The code uses a soft limit of 120 characters per line (including documentation), but it's not enforced and it's okay to use more when it makes sense (for example defining tables, etc...).
- * Since AsmJit doesn't use Exceptions nor RTTI the code cannot use containers provided by the C++ standard library. In general, we try to only use a bare minimum from the C++ standard library to make it viable to use AsmJit even in C code bases where JIT complier is implemented in C++ ([Erlang](https://www.erlang.org/) can be seen as a great example).
+ * Since AsmJit doesn't use Exceptions nor RTTI the code cannot use containers provided by the C++ standard library. In general, we try to only use a bare minimum from the C++ standard library to make it viable to use AsmJit even in C code bases where JIT compiler is implemented in C++ ([Erlang](https://www.erlang.org/) can be seen as a great example).
+
+ * Please don't bring your own coding style preferences into the code base.
## Testing
* AsmJit uses a minimalist unit testing framework to write unit tests to avoid third-party dependencies.
- * At the moment tests are in the same file as the implementation and are only compiled when `ASMJIT_TEST` macro is defined.
+ * At the moment tests are in the same file as the implementation and are only compiled when `ASMJIT_TEST` macro is defined (will change in the future).
* Use `-DASMJIT_TEST=1` when invoking [CMake](https://cmake.org/) to compile AsmJit tests.
- * Unit tests are compiled to a single `asmjit_test_unit[.exe]` executable.
+ * Unit tests are compiled to a single `asmjit_test_runner[.exe]` executable.
* Other tests have their own executables based on what is tested.
- * Always add assembler tests when adding new instructions, see [asmjit_test_assembler_x64.cpp](./test/asmjit_test_assembler_x64.cpp) and [asmjit_test_assembler_a64.cpp](./test/asmjit_test_assembler_a64.cpp) for more details.
+ * Always add assembler tests when adding new instructions, see [asmjit_test_assembler_x64.cpp](./asmjit-testing/tests/asmjit_test_assembler_x64.cpp) and [asmjit_test_assembler_a64.cpp](./asmjit-testing/tests/asmjit_test_assembler_a64.cpp) for more details.
## Pull Request Messages
+ * If a change breaks ABI it must start with `[abi]` - this prefix has a precedence over anything else.
+
* If a change fixes a bug the message should should start with `[bug]`.
* If a change fixes or enhances documentation it should start with `[doc]`.
* If a change fixes or enhances our CI it should start with `[ci]`.
- * If a change breaks ABI it must start with `[abi]`.
-
* Otherwise there is no suggested prefix.
## ABI Changes
diff --git a/3rdparty/asmjit/LICENSE.md b/3rdparty/asmjit/LICENSE.md
index d87dbf9bca2..7818b21e52a 100644
--- a/3rdparty/asmjit/LICENSE.md
+++ b/3rdparty/asmjit/LICENSE.md
@@ -1,4 +1,4 @@
-Copyright (c) 2008-2024 The AsmJit Authors
+Copyright (c) 2008-2025 Petr Kobalicek
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/3rdparty/asmjit/README.md b/3rdparty/asmjit/README.md
index ee0c7200ed3..5920eab1906 100644
--- a/3rdparty/asmjit/README.md
+++ b/3rdparty/asmjit/README.md
@@ -1,26 +1,54 @@
AsmJit
------
-AsmJit is a lightweight library for machine code generation written in C++ language.
+AsmJit is a library for low-latency machine code generation written in C++.
* [Official Home Page (asmjit.com)](https://asmjit.com)
* [Official Repository (asmjit/asmjit)](https://github.com/asmjit/asmjit)
- * [Public Chat Channel](https://app.gitter.im/#/room/#asmjit:gitter.im)
+ * [Public Chat Channel](https://app.element.io/#/room/#asmjit:matrix.org)
* [Zlib License](./LICENSE.md)
See [asmjit.com](https://asmjit.com) page for more details, examples, and documentation.
+Project Organization
+--------------------
+
+ * **`/`** - Project root - project files and scripts, `include` path points here
+ * **asmjit** - AsmJit source code and headers
+ * **core** - Core API, backend independent except relocations
+ * **support** - Support classes and functions
+ * **arm** - ARM specific API, designed to be common for both AArch32 and AArch64
+ * **a64** - AArch64 specific API, used only by AArch64 backends
+ * **x86** - X86 specific API, used only by X86 and X64 backends
+ * **ujit** - Universal JIT API
+ * **asmjit-testing** - Unit tests, integration tests, and benchmarks (don't embed in your project)
+ * **commons** - Common utilities shared between tests and benchmarks
+ * **bench** - Benchmarks
+ * **tests** - Unit tests and integration tests
+ * **db** - Instruction database
+ * **tools** - Tools used to re-regenerate generated files (instruction DB, enum strings)
+
+Roadmap
+-------
+
+ * See [Roadmap](https://asmjit.com/roadmap.html) page for more details
+
Documentation
-------------
* [Documentation Index](https://asmjit.com/doc/index.html)
- * [Build Instructions](https://asmjit.com/doc/group__asmjit__build.html)
+ * [Build Instructions](https://asmjit.com/doc/group__asmjit__build.html) (includes [CMake Integration](https://asmjit.com/doc/group__asmjit__build.html#cmake_integration))
-Contributing
-------------
+Contributing Guidelines
+-----------------------
* See [CONTRIBUTING](./CONTRIBUTING.md) page for more details
+Development & Testing
+---------------------
+
+ * Basic configure scripts that invoke cmake are provided in project root.
+
Breaking Changes
----------------
@@ -28,43 +56,24 @@ Breaking the API is sometimes inevitable, what to do?
* See [Breaking Changes Guide](https://asmjit.com/doc/group__asmjit__breaking__changes.html), which is now part of AsmJit documentation
* See asmjit tests, they always compile and provide implementation of many use-cases:
- * [asmjit_test_emitters.cpp](./test/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters
- * [asmjit_test_assembler_x86.cpp](./test/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64)
- * [asmjit_test_compiler_x86.cpp](./test/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64)
- * [asmjit_test_instinfo.cpp](./test/asmjit_test_instinfo.cpp) - Tests that query instruction information
- * [asmjit_test_x86_sections.cpp](./test/asmjit_test_x86_sections.cpp) - Multiple sections test.
- * Visit our [Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) if you need a quick help
+ * [asmjit_test_emitters.cpp](./asmjit-testing/tests/asmjit_test_emitters.cpp) - Tests that demonstrate the purpose of emitters
+ * [asmjit_test_assembler_x86.cpp](./asmjit-testing/tests/asmjit_test_assembler_x86.cpp) - Tests targeting AsmJit's Assembler (x86/x64)
+ * [asmjit_test_compiler_x86.cpp](./asmjit-testing/tests/asmjit_test_compiler_x86.cpp) - Tests targeting AsmJit's Compiler (x86/x64)
+ * [asmjit_test_instinfo.cpp](./asmjit-testing/tests/asmjit_test_instinfo.cpp) - Tests that query instruction information
+ * [asmjit_test_x86_sections.cpp](./asmjit-testing/tests/asmjit_test_x86_sections.cpp) - Multiple sections test
+ * Visit our [Public Chat](https://app.element.io/#/room/#asmjit:matrix.org) if you need a quick help
-Project Organization
---------------------
-
- * **`/`** - Project root
- * **src** - Source code
- * **asmjit** - Source code and headers (always point include path in here)
- * **core** - Core API, backend independent except relocations
- * **arm** - ARM specific API, used only by ARM and AArch64 backends
- * **x86** - X86 specific API, used only by X86 and X64 backends
- * **test** - Unit and integration tests (don't embed in your project)
- * **tools** - Tools used for configuring, documenting, and generating files
-
-Ports
------
-
- * [ ] 32-bit ARM/Thumb port (work in progress)
- * [ ] RISC-V port (not in progress, help welcome)
-
-Support
--------
+Support & Funding
+-----------------
* AsmJit project has both community and commercial support, see [AsmJit's Support Page](https://asmjit.com/support.html)
- * You can help the development and maintenance through Petr Kobalicek's [GitHub sponsors Profile](https://github.com/sponsors/kobalicek)
+ * If you use this software commercially, please see the [Funding Page](https://kobalicek.com/funding.html) and support the development
Notable Donors List:
* [ZehMatt](https://github.com/ZehMatt)
-
Authors & Maintainers
---------------------
- * Petr Kobalicek <kobalicek.petr@gmail.com>
+ * Petr Kobalicek <kobalicek.petr@gmail.com> ([website](https://kobalicek.com))
diff --git a/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.cpp b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.cpp
new file mode 100644
index 00000000000..89e71a30848
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.cpp
@@ -0,0 +1,83 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/commons/cmdline.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+using namespace asmjit;
+
+static void print_app_info() noexcept {
+ printf("AsmJit Benchmark CodeGen v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+}
+
+#if !defined(ASMJIT_NO_X86)
+void benchmark_x86_emitters(uint32_t num_iterations, bool test_x86, bool test_x64) noexcept;
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+void benchmark_aarch64_emitters(uint32_t num_iterations);
+#endif
+
+int main(int argc, char* argv[]) {
+ CmdLine cmd_line(argc, argv);
+ uint32_t num_iterations = 100000;
+
+ print_app_info();
+
+ printf("Usage:\n");
+ printf(" --help Show usage only\n");
+ printf(" --quick Decrease the number of iterations to make tests quicker\n");
+ printf(" --arch=<ARCH> Select architecture(s) to run ('all' by default)\n");
+ printf("\n");
+
+ printf("Architectures:\n");
+#if !defined(ASMJIT_NO_X86)
+ printf(" --arch=x86 32-bit X86 architecture (X86)\n");
+ printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
+#endif
+#if !defined(ASMJIT_NO_AARCH64)
+ printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
+#endif
+ printf("\n");
+
+ if (cmd_line.has_arg("--help"))
+ return 0;
+
+ if (cmd_line.has_arg("--quick"))
+ num_iterations = 1000;
+
+ const char* arch = cmd_line.value_of("--arch", "all");
+
+#if !defined(ASMJIT_NO_X86)
+ bool test_x86 = strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0;
+ bool test_x64 = strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0;
+
+ if (test_x86 || test_x64) {
+ benchmark_x86_emitters(num_iterations, test_x86, test_x64);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ bool test_aarch64 = strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0;
+
+ if (test_aarch64) {
+ benchmark_aarch64_emitters(num_iterations);
+ }
+#endif
+
+ return 0;
+}
diff --git a/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.h b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.h
new file mode 100644
index 00000000000..ae6b372dc29
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.h
@@ -0,0 +1,117 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_PERF_H_INCLUDED
+#define ASMJIT_TEST_PERF_H_INCLUDED
+
+#include <asmjit/core.h>
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/commons/performancetimer.h>
+
+namespace asmjit_perf_utils {
+
+class TestErrorHandler : public asmjit::ErrorHandler {
+ void handle_error(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) override {
+ (void)err;
+ (void)origin;
+ printf("ERROR: %s\n", message);
+ abort();
+ }
+};
+
+#ifndef ASMJIT_NO_BUILDER
+template<typename BuilderT, typename FuncT>
+static uint32_t calculate_instruction_count(asmjit::CodeHolder& code, asmjit::Arch arch, const FuncT& func) noexcept {
+ BuilderT builder;
+ TestErrorHandler eh;
+
+ asmjit::Environment env(arch);
+ code.init(env);
+ code.set_error_handler(&eh);
+ code.attach(&builder);
+ func(builder);
+
+ uint32_t count = 0;
+ asmjit::BaseNode* node = builder.first_node();
+
+ while (node) {
+ count += uint32_t(node->is_inst());
+ node = node->next();
+ }
+
+ code.reset();
+ return count;
+}
+#endif
+
+static inline double calculate_mbps(double duration_us, uint64_t output_size) noexcept {
+ if (duration_us == 0)
+ return 0.0;
+
+ double bytes_total = double(output_size);
+ return (bytes_total * 1000000) / (duration_us * 1024 * 1024);
+}
+
+static inline double calculate_mips(double duration, uint64_t instruction_count) noexcept {
+ if (duration == 0)
+ return 0.0;
+
+ return double(instruction_count) * 1000000.0 / (duration * 1e6);
+}
+
+template<typename EmitterT, typename FuncT>
+static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t num_iterations, const char* test_name, uint32_t instruction_count, const FuncT& func) noexcept {
+ EmitterT emitter;
+ TestErrorHandler eh;
+
+ const char* arch_name = asmjit_arch_as_string(arch);
+ const char* emitter_name =
+ emitter.is_assembler() ? "Assembler" :
+ emitter.is_compiler() ? "Compiler" :
+ emitter.is_builder() ? "Builder" : "Unknown";
+
+ uint64_t code_size = 0;
+ asmjit::Environment env(arch);
+
+ PerformanceTimer timer;
+ double duration = std::numeric_limits<double>::infinity();
+
+ code.init(env);
+ code.set_error_handler(&eh);
+ code.attach(&emitter);
+
+ for (uint32_t r = 0; r < num_iterations; r++) {
+ code_size = 0;
+
+ timer.start();
+ func(emitter);
+ code_size += code.code_size();
+
+ code.reinit();
+ timer.stop();
+
+ duration = asmjit::Support::min(duration, timer.duration() * 1000);
+ }
+
+ printf(" [%-7s] %-9s %-16s | CodeSize:%5llu [B] | Time:%7.3f [us]", arch_name, emitter_name, test_name, (unsigned long long)code_size, duration);
+ if (code_size) {
+ printf(" | Speed:%7.1f [MiB/s]", calculate_mbps(duration, code_size));
+ }
+ else {
+ printf(" | Speed: N/A ");
+ }
+
+ if (instruction_count) {
+ printf(", %8.1f [MInst/s]", calculate_mips(duration, instruction_count));
+ }
+
+ printf("\n");
+ code.reset();
+}
+
+} // {asmjit_perf_utils}
+
+#endif // ASMJIT_TEST_PERF_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_a64.cpp b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_a64.cpp
new file mode 100644
index 00000000000..7bb85356b93
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_a64.cpp
@@ -0,0 +1,707 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_AARCH64)
+#include <asmjit/a64.h>
+
+#include <asmjit-testing/bench/asmjit_bench_codegen.h>
+
+#include <limits>
+#include <stdio.h>
+#include <string.h>
+
+using namespace asmjit;
+
+// Generates a long sequence of GP instructions.
+template<typename Emitter>
+static void generate_gp_sequence_internal(
+ Emitter& cc,
+ const a64::Gp& a, const a64::Gp& b, const a64::Gp& c, const a64::Gp& d) {
+
+ using namespace asmjit::a64;
+
+ Gp wa = a.w();
+ Gp wb = b.w();
+ Gp wc = c.w();
+ Gp wd = d.w();
+
+ Gp xa = a.x();
+ Gp xb = b.x();
+ Gp xc = c.x();
+ Gp xd = d.x();
+
+ Mem m = ptr(xd);
+
+ cc.mov(wa, 0);
+ cc.mov(wb, 1);
+ cc.mov(wc, 2);
+ cc.mov(wd, 3);
+
+ cc.adc(wa, wb, wc);
+ cc.adc(xa, xb, xc);
+ cc.adc(wa, wzr, wc);
+ cc.adc(xa, xzr, xc);
+ cc.adc(wzr, wb, wc);
+ cc.adc(xzr, xb, xc);
+ cc.adcs(wa, wb, wc);
+ cc.adcs(xa, xb, xc);
+ cc.add(wa, wb, wc);
+ cc.add(xa, xb, xc);
+ cc.add(wa, wb, wc, lsl(3));
+ cc.add(xa, xb, xc, lsl(3));
+ cc.add(wa, wzr, wc);
+ cc.add(xa, xzr, xc);
+ cc.add(wzr, wb, wc);
+ cc.add(xzr, xb, xc);
+ cc.add(wc, wd, 0, lsl(12));
+ cc.add(xc, xd, 0, lsl(12));
+ cc.add(wc, wd, 1024, lsl(12));
+ cc.add(xc, xd, 1024, lsl(12));
+ cc.add(wc, wd, 1024, lsl(12));
+ cc.add(xc, xd, 1024, lsl(12));
+ cc.adds(wa, wb, wc);
+ cc.adds(xa, xb, xc);
+ cc.adr(xa, 0);
+ cc.adr(xa, 256);
+ cc.adrp(xa, 4096);
+ cc.and_(wa, wb, wc);
+ cc.and_(xa, xb, xc);
+ cc.and_(wa, wb, 1);
+ cc.and_(xa, xb, 1);
+ cc.and_(wa, wb, 15);
+ cc.and_(xa, xb, 15);
+ cc.and_(wa, wzr, wc);
+ cc.and_(xa, xzr, xc);
+ cc.and_(wzr, wb, wc);
+ cc.and_(xzr, xb, xc);
+ cc.and_(wa, wb, 0x1);
+ cc.and_(xa, xb, 0x1);
+ cc.and_(wa, wb, 0xf);
+ cc.and_(xa, xb, 0xf);
+ cc.ands(wa, wb, wc);
+ cc.ands(xa, xb, xc);
+ cc.ands(wa, wzr, wc);
+ cc.ands(xa, xzr, xc);
+ cc.ands(wzr, wb, wc);
+ cc.ands(xzr, xb, xc);
+ cc.ands(wa, wb, 0x1);
+ cc.ands(xa, xb, 0x1);
+ cc.ands(wa, wb, 0xf);
+ cc.ands(xa, xb, 0xf);
+ cc.asr(wa, wb, 15);
+ cc.asr(xa, xb, 15);
+ cc.asrv(wa, wb, wc);
+ cc.asrv(xa, xb, xc);
+ cc.bfc(wa, 8, 16);
+ cc.bfc(xa, 8, 16);
+ cc.bfi(wa, wb, 8, 16);
+ cc.bfi(xa, xb, 8, 16);
+ cc.bfm(wa, wb, 8, 16);
+ cc.bfm(xa, xb, 8, 16);
+ cc.bfxil(wa, wb, 8, 16);
+ cc.bfxil(xa, xb, 8, 16);
+ cc.bic(wa, wb, wc, lsl(4));
+ cc.bic(xa, xb, xc, lsl(4));
+ cc.bic(wa, wzr, wc);
+ cc.bic(xa, xzr, xc);
+ cc.bics(wa, wb, wc, lsl(4));
+ cc.bics(xa, xb, xc, lsl(4));
+ cc.bics(wa, wzr, wc);
+ cc.bics(xa, xzr, xc);
+ cc.cas(wa, wb, m);
+ cc.cas(xa, xb, m);
+ cc.casa(wa, wb, m);
+ cc.casa(xa, xb, m);
+ cc.casab(wa, wb, m);
+ cc.casah(wa, wb, m);
+ cc.casal(wa, wb, m);
+ cc.casal(xa, xb, m);
+ cc.casalb(wa, wb, m);
+ cc.casalh(wa, wb, m);
+ cc.casb(wa, wb, m);
+ cc.cash(wa, wb, m);
+ cc.casl(wa, wb, m);
+ cc.casl(xa, xb, m);
+ cc.caslb(wa, wb, m);
+ cc.caslh(wa, wb, m);
+ cc.ccmn(wa, wb, 3, CondCode::kEQ);
+ cc.ccmn(xa, xb, 3, CondCode::kEQ);
+ cc.ccmn(wa, 2, 3, CondCode::kEQ);
+ cc.ccmn(xa, 2, 3, CondCode::kEQ);
+ cc.ccmn(wa, wzr, 3, CondCode::kEQ);
+ cc.ccmn(xa, xzr, 3, CondCode::kEQ);
+ cc.ccmp(wa, wb, 3, CondCode::kEQ);
+ cc.ccmp(xa, xb, 3, CondCode::kEQ);
+ cc.ccmp(wa, 2, 3, CondCode::kEQ);
+ cc.ccmp(xa, 2, 3, CondCode::kEQ);
+ cc.ccmp(wa, wzr, 3, CondCode::kEQ);
+ cc.ccmp(xa, xzr, 3, CondCode::kEQ);
+ cc.cinc(wa, wb, CondCode::kEQ);
+ cc.cinc(xa, xb, CondCode::kEQ);
+ cc.cinc(wzr, wb, CondCode::kEQ);
+ cc.cinc(wa, wzr, CondCode::kEQ);
+ cc.cinc(xzr, xb, CondCode::kEQ);
+ cc.cinc(xa, xzr, CondCode::kEQ);
+ cc.cinv(wa, wb, CondCode::kEQ);
+ cc.cinv(xa, xb, CondCode::kEQ);
+ cc.cinv(wzr, wb, CondCode::kEQ);
+ cc.cinv(wa, wzr, CondCode::kEQ);
+ cc.cinv(xzr, xb, CondCode::kEQ);
+ cc.cinv(xa, xzr, CondCode::kEQ);
+ cc.cls(wa, wb);
+ cc.cls(xa, xb);
+ cc.cls(wa, wzr);
+ cc.cls(xa, xzr);
+ cc.cls(wzr, wb);
+ cc.cls(xzr, xb);
+ cc.clz(wa, wb);
+ cc.clz(xa, xb);
+ cc.clz(wa, wzr);
+ cc.clz(xa, xzr);
+ cc.clz(wzr, wb);
+ cc.clz(xzr, xb);
+ cc.cmn(wa, 33);
+ cc.cmn(xa, 33);
+ cc.cmn(wa, wb);
+ cc.cmn(xa, xb);
+ cc.cmn(wa, wb, uxtb(2));
+ cc.cmn(xa, wb, uxtb(2));
+ cc.cmp(wa, 33);
+ cc.cmp(xa, 33);
+ cc.cmp(wa, wb);
+ cc.cmp(xa, xb);
+ cc.cmp(wa, wb, uxtb(2));
+ cc.cmp(xa, wb, uxtb(2));
+ cc.crc32b(wa, wb, wc);
+ cc.crc32b(wzr, wb, wc);
+ cc.crc32b(wa, wzr, wc);
+ cc.crc32b(wa, wb, wzr);
+ cc.crc32cb(wa, wb, wc);
+ cc.crc32cb(wzr, wb, wc);
+ cc.crc32cb(wa, wzr, wc);
+ cc.crc32cb(wa, wb, wzr);
+ cc.crc32ch(wa, wb, wc);
+ cc.crc32ch(wzr, wb, wc);
+ cc.crc32ch(wa, wzr, wc);
+ cc.crc32ch(wa, wb, wzr);
+ cc.crc32cw(wa, wb, wc);
+ cc.crc32cw(wzr, wb, wc);
+ cc.crc32cw(wa, wzr, wc);
+ cc.crc32cw(wa, wb, wzr);
+ cc.crc32cx(wa, wb, xc);
+ cc.crc32cx(wzr, wb, xc);
+ cc.crc32cx(wa, wzr, xc);
+ cc.crc32cx(wa, wb, xzr);
+ cc.crc32h(wa, wb, wc);
+ cc.crc32h(wzr, wb, wc);
+ cc.crc32h(wa, wzr, wc);
+ cc.crc32h(wa, wb, wzr);
+ cc.crc32w(wa, wb, wc);
+ cc.crc32w(wzr, wb, wc);
+ cc.crc32w(wa, wzr, wc);
+ cc.crc32w(wa, wb, wzr);
+ cc.crc32x(wa, wb, xc);
+ cc.crc32x(wzr, wb, xc);
+ cc.crc32x(wa, wzr, xc);
+ cc.crc32x(wa, wb, xzr);
+ cc.csel(wa, wb, wc, CondCode::kEQ);
+ cc.csel(xa, xb, xc, CondCode::kEQ);
+ cc.cset(wa, CondCode::kEQ);
+ cc.cset(xa, CondCode::kEQ);
+ cc.cset(wa, CondCode::kEQ);
+ cc.cset(xa, CondCode::kEQ);
+ cc.csetm(wa, CondCode::kEQ);
+ cc.csetm(xa, CondCode::kEQ);
+ cc.csinc(wa, wb, wc, CondCode::kEQ);
+ cc.csinc(xa, xb, xc, CondCode::kEQ);
+ cc.csinv(wa, wb, wc, CondCode::kEQ);
+ cc.csinv(xa, xb, xc, CondCode::kEQ);
+ cc.csneg(wa, wb, wc, CondCode::kEQ);
+ cc.csneg(xa, xb, xc, CondCode::kEQ);
+ cc.eon(wa, wb, wc);
+ cc.eon(wzr, wb, wc);
+ cc.eon(wa, wzr, wc);
+ cc.eon(wa, wb, wzr);
+ cc.eon(wa, wb, wc, lsl(4));
+ cc.eon(xa, xb, xc);
+ cc.eon(xzr, xb, xc);
+ cc.eon(xa, xzr, xc);
+ cc.eon(xa, xb, xzr);
+ cc.eon(xa, xb, xc, lsl(4));
+ cc.eor(wa, wb, wc);
+ cc.eor(wzr, wb, wc);
+ cc.eor(wa, wzr, wc);
+ cc.eor(wa, wb, wzr);
+ cc.eor(xa, xb, xc);
+ cc.eor(xzr, xb, xc);
+ cc.eor(xa, xzr, xc);
+ cc.eor(xa, xb, xzr);
+ cc.eor(wa, wb, wc, lsl(4));
+ cc.eor(xa, xb, xc, lsl(4));
+ cc.eor(wa, wb, 0x4000);
+ cc.eor(xa, xb, 0x8000);
+ cc.extr(wa, wb, wc, 15);
+ cc.extr(wzr, wb, wc, 15);
+ cc.extr(wa, wzr, wc, 15);
+ cc.extr(wa, wb, wzr, 15);
+ cc.extr(xa, xb, xc, 15);
+ cc.extr(xzr, xb, xc, 15);
+ cc.extr(xa, xzr, xc, 15);
+ cc.extr(xa, xb, xzr, 15);
+ cc.ldadd(wa, wb, m);
+ cc.ldadd(xa, xb, m);
+ cc.ldadda(wa, wb, m);
+ cc.ldadda(xa, xb, m);
+ cc.ldaddab(wa, wb, m);
+ cc.ldaddah(wa, wb, m);
+ cc.ldaddal(wa, wb, m);
+ cc.ldaddal(xa, xb, m);
+ cc.ldaddalb(wa, wb, m);
+ cc.ldaddalh(wa, wb, m);
+ cc.ldaddb(wa, wb, m);
+ cc.ldaddh(wa, wb, m);
+ cc.ldaddl(wa, wb, m);
+ cc.ldaddl(xa, xb, m);
+ cc.ldaddlb(wa, wb, m);
+ cc.ldaddlh(wa, wb, m);
+ cc.ldclr(wa, wb, m);
+ cc.ldclr(xa, xb, m);
+ cc.ldclra(wa, wb, m);
+ cc.ldclra(xa, xb, m);
+ cc.ldclrab(wa, wb, m);
+ cc.ldclrah(wa, wb, m);
+ cc.ldclral(wa, wb, m);
+ cc.ldclral(xa, xb, m);
+ cc.ldclralb(wa, wb, m);
+ cc.ldclralh(wa, wb, m);
+ cc.ldclrb(wa, wb, m);
+ cc.ldclrh(wa, wb, m);
+ cc.ldclrl(wa, wb, m);
+ cc.ldclrl(xa, xb, m);
+ cc.ldclrlb(wa, wb, m);
+ cc.ldclrlh(wa, wb, m);
+ cc.ldeor(wa, wb, m);
+ cc.ldeor(xa, xb, m);
+ cc.ldeora(wa, wb, m);
+ cc.ldeora(xa, xb, m);
+ cc.ldeorab(wa, wb, m);
+ cc.ldeorah(wa, wb, m);
+ cc.ldeoral(wa, wb, m);
+ cc.ldeoral(xa, xb, m);
+ cc.ldeoralb(wa, wb, m);
+ cc.ldeoralh(wa, wb, m);
+ cc.ldeorb(wa, wb, m);
+ cc.ldeorh(wa, wb, m);
+ cc.ldeorl(wa, wb, m);
+ cc.ldeorl(xa, xb, m);
+ cc.ldeorlb(wa, wb, m);
+ cc.ldeorlh(wa, wb, m);
+ cc.ldlar(wa, m);
+ cc.ldlar(xa, m);
+ cc.ldlarb(wa, m);
+ cc.ldlarh(wa, m);
+ cc.ldnp(wa, wb, m);
+ cc.ldnp(xa, xb, m);
+ cc.ldp(wa, wb, m);
+ cc.ldp(xa, xb, m);
+ cc.ldpsw(xa, xb, m);
+ cc.ldr(wa, m);
+ cc.ldr(xa, m);
+ cc.ldrb(wa, m);
+ cc.ldrh(wa, m);
+ cc.ldrsw(xa, m);
+ cc.ldraa(xa, m);
+ cc.ldrab(xa, m);
+ cc.ldset(wa, wb, m);
+ cc.ldset(xa, xb, m);
+ cc.ldseta(wa, wb, m);
+ cc.ldseta(xa, xb, m);
+ cc.ldsetab(wa, wb, m);
+ cc.ldsetah(wa, wb, m);
+ cc.ldsetal(wa, wb, m);
+ cc.ldsetal(xa, xb, m);
+ cc.ldsetalh(wa, wb, m);
+ cc.ldsetalb(wa, wb, m);
+ cc.ldsetb(wa, wb, m);
+ cc.ldseth(wa, wb, m);
+ cc.ldsetl(wa, wb, m);
+ cc.ldsetl(xa, xb, m);
+ cc.ldsetlb(wa, wb, m);
+ cc.ldsetlh(wa, wb, m);
+ cc.ldsmax(wa, wb, m);
+ cc.ldsmax(xa, xb, m);
+ cc.ldsmaxa(wa, wb, m);
+ cc.ldsmaxa(xa, xb, m);
+ cc.ldsmaxab(wa, wb, m);
+ cc.ldsmaxah(wa, wb, m);
+ cc.ldsmaxal(wa, wb, m);
+ cc.ldsmaxal(xa, xb, m);
+ cc.ldsmaxalb(wa, wb, m);
+ cc.ldsmaxalh(wa, wb, m);
+ cc.ldsmaxb(wa, wb, m);
+ cc.ldsmaxh(wa, wb, m);
+ cc.ldsmaxl(wa, wb, m);
+ cc.ldsmaxl(xa, xb, m);
+ cc.ldsmaxlb(wa, wb, m);
+ cc.ldsmaxlh(wa, wb, m);
+ cc.ldsmin(wa, wb, m);
+ cc.ldsmin(xa, xb, m);
+ cc.ldsmina(wa, wb, m);
+ cc.ldsmina(xa, xb, m);
+ cc.ldsminab(wa, wb, m);
+ cc.ldsminah(wa, wb, m);
+ cc.ldsminal(wa, wb, m);
+ cc.ldsminal(xa, xb, m);
+ cc.ldsminalb(wa, wb, m);
+ cc.ldsminalh(wa, wb, m);
+ cc.ldsminb(wa, wb, m);
+ cc.ldsminh(wa, wb, m);
+ cc.ldsminl(wa, wb, m);
+ cc.ldsminl(xa, xb, m);
+ cc.ldsminlb(wa, wb, m);
+ cc.ldsminlh(wa, wb, m);
+ cc.ldtr(wa, m);
+ cc.ldtr(xa, m);
+ cc.ldtrb(wa, m);
+ cc.ldtrh(wa, m);
+ cc.ldtrsb(wa, m);
+ cc.ldtrsh(wa, m);
+ cc.ldtrsw(xa, m);
+ cc.ldumax(wa, wb, m);
+ cc.ldumax(xa, xb, m);
+ cc.ldumaxa(wa, wb, m);
+ cc.ldumaxa(xa, xb, m);
+ cc.ldumaxab(wa, wb, m);
+ cc.ldumaxah(wa, wb, m);
+ cc.ldumaxal(wa, wb, m);
+ cc.ldumaxal(xa, xb, m);
+ cc.ldumaxalb(wa, wb, m);
+ cc.ldumaxalh(wa, wb, m);
+ cc.ldumaxb(wa, wb, m);
+ cc.ldumaxh(wa, wb, m);
+ cc.ldumaxl(wa, wb, m);
+ cc.ldumaxl(xa, xb, m);
+ cc.ldumaxlb(wa, wb, m);
+ cc.ldumaxlh(wa, wb, m);
+ cc.ldumin(wa, wb, m);
+ cc.ldumin(xa, xb, m);
+ cc.ldumina(wa, wb, m);
+ cc.ldumina(xa, xb, m);
+ cc.lduminab(wa, wb, m);
+ cc.lduminah(wa, wb, m);
+ cc.lduminal(wa, wb, m);
+ cc.lduminal(xa, xb, m);
+ cc.lduminalb(wa, wb, m);
+ cc.lduminalh(wa, wb, m);
+ cc.lduminb(wa, wb, m);
+ cc.lduminh(wa, wb, m);
+ cc.lduminl(wa, wb, m);
+ cc.lduminl(xa, xb, m);
+ cc.lduminlb(wa, wb, m);
+ cc.lduminlh(wa, wb, m);
+ cc.ldur(wa, m);
+ cc.ldur(xa, m);
+ cc.ldurb(wa, m);
+ cc.ldurh(wa, m);
+ cc.ldursb(wa, m);
+ cc.ldursh(wa, m);
+ cc.ldursw(xa, m);
+ cc.ldxp(wa, wb, m);
+ cc.ldxp(xa, xb, m);
+ cc.ldxr(wa, m);
+ cc.ldxr(xa, m);
+ cc.ldxrb(wa, m);
+ cc.ldxrh(wa, m);
+ cc.lsl(wa, wb, wc);
+ cc.lsl(xa, xb, xc);
+ cc.lsl(wa, wb, 15);
+ cc.lsl(xa, xb, 15);
+ cc.lslv(wa, wb, wc);
+ cc.lslv(xa, xb, xc);
+ cc.lsr(wa, wb, wc);
+ cc.lsr(xa, xb, xc);
+ cc.lsr(wa, wb, 15);
+ cc.lsr(xa, xb, 15);
+ cc.lsrv(wa, wb, wc);
+ cc.lsrv(xa, xb, xc);
+ cc.madd(wa, wb, wc, wd);
+ cc.madd(xa, xb, xc, xd);
+ cc.mneg(wa, wb, wc);
+ cc.mneg(xa, xb, xc);
+ cc.mov(wa, wb);
+ cc.mov(xa, xb);
+ cc.mov(wa, 0);
+ cc.mov(wa, 1);
+ cc.mov(wa, 2);
+ cc.mov(wa, 3);
+ cc.mov(wa, 4);
+ cc.mov(wa, 5);
+ cc.mov(wa, 6);
+ cc.mov(wa, 7);
+ cc.mov(wa, 8);
+ cc.mov(wa, 9);
+ cc.mov(wa, 10);
+ cc.mov(wa, 0xA234);
+ cc.mov(xa, 0xA23400000000);
+ cc.msub(wa, wb, wc, wd);
+ cc.msub(xa, xb, xc, xd);
+ cc.mul(wa, wb, wc);
+ cc.mul(xa, xb, xc);
+ cc.mvn_(wa, wb);
+ cc.mvn_(xa, xb);
+ cc.mvn_(wa, wb, lsl(4));
+ cc.mvn_(xa, xb, lsl(4));
+ cc.neg(wa, wb);
+ cc.neg(xa, xb);
+ cc.neg(wa, wb, lsl(4));
+ cc.neg(xa, xb, lsl(4));
+ cc.negs(wa, wb);
+ cc.negs(xa, xb);
+ cc.negs(wa, wb, lsl(4));
+ cc.negs(xa, xb, lsl(4));
+ cc.ngc(wa, wb);
+ cc.ngc(xa, xb);
+ cc.ngcs(wa, wb);
+ cc.ngcs(xa, xb);
+ cc.orn(wa, wb, wc);
+ cc.orn(xa, xb, xc);
+ cc.orn(wa, wb, wc, lsl(4));
+ cc.orn(xa, xb, xc, lsl(4));
+ cc.orr(wa, wb, wc);
+ cc.orr(xa, xb, xc);
+ cc.orr(wa, wb, wc, lsl(4));
+ cc.orr(xa, xb, xc, lsl(4));
+ cc.orr(wa, wb, 0x4000);
+ cc.orr(xa, xb, 0x8000);
+ cc.rbit(wa, wb);
+ cc.rbit(xa, xb);
+ cc.rev(wa, wb);
+ cc.rev(xa, xb);
+ cc.rev16(wa, wb);
+ cc.rev16(xa, xb);
+ cc.rev32(xa, xb);
+ cc.rev64(xa, xb);
+ cc.ror(wa, wb, wc);
+ cc.ror(xa, xb, xc);
+ cc.ror(wa, wb, 15);
+ cc.ror(xa, xb, 15);
+ cc.rorv(wa, wb, wc);
+ cc.rorv(xa, xb, xc);
+ cc.sbc(wa, wb, wc);
+ cc.sbc(xa, xb, xc);
+ cc.sbcs(wa, wb, wc);
+ cc.sbcs(xa, xb, xc);
+ cc.sbfiz(wa, wb, 5, 10);
+ cc.sbfiz(xa, xb, 5, 10);
+ cc.sbfm(wa, wb, 5, 10);
+ cc.sbfm(xa, xb, 5, 10);
+ cc.sbfx(wa, wb, 5, 10);
+ cc.sbfx(xa, xb, 5, 10);
+ cc.sdiv(wa, wb, wc);
+ cc.sdiv(xa, xb, xc);
+ cc.smaddl(xa, wb, wc, xd);
+ cc.smnegl(xa, wb, wc);
+ cc.smsubl(xa, wb, wc, xd);
+ cc.smulh(xa, xb, xc);
+ cc.smull(xa, wb, wc);
+ cc.stp(wa, wb, m);
+ cc.stp(xa, xb, m);
+ cc.sttr(wa, m);
+ cc.sttr(xa, m);
+ cc.sttrb(wa, m);
+ cc.sttrh(wa, m);
+ cc.stur(wa, m);
+ cc.stur(xa, m);
+ cc.sturb(wa, m);
+ cc.sturh(wa, m);
+ cc.stxp(wa, wb, wc, m);
+ cc.stxp(wa, xb, xc, m);
+ cc.stxr(wa, wb, m);
+ cc.stxr(wa, xb, m);
+ cc.stxrb(wa, wb, m);
+ cc.stxrh(wa, wb, m);
+ cc.sub(wa, wb, wc);
+ cc.sub(xa, xb, xc);
+ cc.sub(wa, wb, wc, lsl(3));
+ cc.sub(xa, xb, xc, lsl(3));
+ cc.subg(xa, xb, 32, 11);
+ cc.subp(xa, xb, xc);
+ cc.subps(xa, xb, xc);
+ cc.subs(wa, wb, wc);
+ cc.subs(xa, xb, xc);
+ cc.subs(wa, wb, wc, lsl(3));
+ cc.subs(xa, xb, xc, lsl(3));
+ cc.sxtb(wa, wb);
+ cc.sxtb(xa, wb);
+ cc.sxth(wa, wb);
+ cc.sxth(xa, wb);
+ cc.sxtw(xa, wb);
+ cc.tst(wa, 1);
+ cc.tst(xa, 1);
+ cc.tst(wa, wb);
+ cc.tst(xa, xb);
+ cc.tst(wa, wb, lsl(4));
+ cc.tst(xa, xb, lsl(4));
+ cc.udiv(wa, wb, wc);
+ cc.udiv(xa, xb, xc);
+ cc.ubfiz(wa, wb, 5, 10);
+ cc.ubfiz(xa, xb, 5, 10);
+ cc.ubfm(wa, wb, 5, 10);
+ cc.ubfm(xa, xb, 5, 10);
+ cc.ubfx(wa, wb, 5, 10);
+ cc.ubfx(xa, xb, 5, 10);
+ cc.umaddl(xa, wb, wc, xd);
+ cc.umnegl(xa, wb, wc);
+ cc.umsubl(xa, wb, wc, xd);
+ cc.umulh(xa, xb, xc);
+ cc.umull(xa, wb, wc);
+ cc.uxtb(wa, wb);
+ cc.uxth(wa, wb);
+}
+
+static void generate_gp_sequence(BaseEmitter& emitter, bool emit_prolog_epilog) {
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ a64::Compiler& cc = *emitter.as<a64::Compiler>();
+
+ a64::Gp a = cc.new_gp_ptr("a");
+ a64::Gp b = cc.new_gp_ptr("b");
+ a64::Gp c = cc.new_gp_ptr("c");
+ a64::Gp d = cc.new_gp_ptr("d");
+
+ cc.add_func(FuncSignature::build<void>());
+ generate_gp_sequence_internal(cc, a, b, c, d);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ a64::Builder& cc = *emitter.as<a64::Builder>();
+
+ a64::Gp a = a64::x0;
+ a64::Gp b = a64::x1;
+ a64::Gp c = a64::x2;
+ a64::Gp d = a64::x3;
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(a, b, c, d);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_gp_sequence_internal(cc, a, b, c, d);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_gp_sequence_internal(cc, a, b, c, d);
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ a64::Assembler& cc = *emitter.as<a64::Assembler>();
+
+ a64::Gp a = a64::x0;
+ a64::Gp b = a64::x1;
+ a64::Gp c = a64::x2;
+ a64::Gp d = a64::x3;
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(a, b, c, d);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_gp_sequence_internal(cc, a, b, c, d);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_gp_sequence_internal(cc, a, b, c, d);
+ }
+
+ return;
+ }
+}
+
+template<typename EmitterFn>
+static void benchmark_a64_function(Arch arch, uint32_t num_iterations, const char* description, const EmitterFn& emitter_fn) noexcept {
+ CodeHolder code;
+ printf("%s:\n", description);
+
+ uint32_t instruction_count = 0;
+
+#ifndef ASMJIT_NO_BUILDER
+ instruction_count = asmjit_perf_utils::calculate_instruction_count<a64::Builder>(code, arch, [&](a64::Builder& cc) {
+ emitter_fn(cc, false);
+ });
+#endif
+
+ asmjit_perf_utils::bench<a64::Assembler>(code, arch, num_iterations, "[raw]", instruction_count, [&](a64::Assembler& cc) {
+ emitter_fn(cc, false);
+ });
+
+ asmjit_perf_utils::bench<a64::Assembler>(code, arch, num_iterations, "[validated]", instruction_count, [&](a64::Assembler& cc) {
+ cc.add_diagnostic_options(DiagnosticOptions::kValidateAssembler);
+ emitter_fn(cc, false);
+ });
+
+ asmjit_perf_utils::bench<a64::Assembler>(code, arch, num_iterations, "[prolog/epilog]", instruction_count, [&](a64::Assembler& cc) {
+ cc.add_diagnostic_options(DiagnosticOptions::kValidateAssembler);
+ emitter_fn(cc, true);
+ });
+
+#ifndef ASMJIT_NO_BUILDER
+ asmjit_perf_utils::bench<a64::Builder>(code, arch, num_iterations, "[no-asm]", instruction_count, [&](a64::Builder& cc) {
+ emitter_fn(cc, false);
+ });
+
+ asmjit_perf_utils::bench<a64::Builder>(code, arch, num_iterations, "[finalized]", instruction_count, [&](a64::Builder& cc) {
+ emitter_fn(cc, false);
+ cc.finalize();
+ });
+
+ asmjit_perf_utils::bench<a64::Builder>(code, arch, num_iterations, "[prolog/epilog]", instruction_count, [&](a64::Builder& cc) {
+ emitter_fn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+ asmjit_perf_utils::bench<a64::Compiler>(code, arch, num_iterations, "[no-asm]", instruction_count, [&](a64::Compiler& cc) {
+ emitter_fn(cc, true);
+ });
+
+ asmjit_perf_utils::bench<a64::Compiler>(code, arch, num_iterations, "[finalized]", instruction_count, [&](a64::Compiler& cc) {
+ emitter_fn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+ printf("\n");
+}
+
+void benchmark_aarch64_emitters(uint32_t num_iterations) {
+ static const char description[] = "GpSequence (Sequence of GP instructions - reg/mem)";
+ benchmark_a64_function(Arch::kAArch64, num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_gp_sequence(emitter, emit_prolog_epilog);
+ });
+}
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_x86.cpp b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_x86.cpp
new file mode 100644
index 00000000000..586420bd06a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_x86.cpp
@@ -0,0 +1,5336 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86)
+#include <asmjit/x86.h>
+
+#include <asmjit-testing/bench/asmjit_bench_codegen.h>
+#include <asmjit-testing/tests/asmjit_test_misc.h>
+
+#include <limits>
+#include <stdio.h>
+#include <string.h>
+
+using namespace asmjit;
+
+enum class InstForm {
+ kReg,
+ kMem
+};
+
+// Generates a long sequence of GP instructions.
+template<typename Emitter>
+static void generate_gp_sequence_internal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& a, const x86::Gp& b, const x86::Gp& c, const x86::Gp& d) {
+
+ cc.mov(a, 0xAAAAAAAA);
+ cc.mov(b, 0xBBBBBBBB);
+ cc.mov(c, 0xCCCCCCCC);
+ cc.mov(d, 0xFFFFFFFF);
+
+ if (form == InstForm::kReg) {
+ cc.adc(a, b);
+ cc.adc(b, c);
+ cc.adc(c, d);
+ cc.add(a, b);
+ cc.add(b, c);
+ cc.add(c, d);
+ cc.and_(a, b);
+ cc.and_(b, c);
+ cc.and_(c, d);
+ cc.bsf(a, b);
+ cc.bsf(b, c);
+ cc.bsf(c, d);
+ cc.bsr(a, b);
+ cc.bsr(b, c);
+ cc.bsr(c, d);
+ cc.bswap(a);
+ cc.bswap(b);
+ cc.bswap(c);
+ cc.bt(a, b);
+ cc.bt(b, c);
+ cc.bt(c, d);
+ cc.btc(a, b);
+ cc.btc(b, c);
+ cc.btc(c, d);
+ cc.btr(a, b);
+ cc.btr(b, c);
+ cc.btr(c, d);
+ cc.bts(a, b);
+ cc.bts(b, c);
+ cc.bts(c, d);
+ cc.cmp(a, b);
+ cc.cmovc(a, b);
+ cc.cmp(b, c);
+ cc.cmovc(b, c);
+ cc.cmp(c, d);
+ cc.cmovc(c, d);
+ cc.dec(a);
+ cc.dec(b);
+ cc.dec(c);
+ cc.imul(a, b);
+ cc.imul(b, c);
+ cc.imul(c, d);
+ cc.movsx(a, b.r8_lo());
+ cc.movsx(b, c.r8_lo());
+ cc.movsx(c, d.r8_lo());
+ cc.movzx(a, b.r8_lo());
+ cc.movzx(b, c.r8_lo());
+ cc.movzx(c, d.r8_lo());
+ cc.neg(a);
+ cc.neg(b);
+ cc.neg(c);
+ cc.not_(a);
+ cc.not_(b);
+ cc.not_(c);
+ cc.or_(a, b);
+ cc.or_(b, c);
+ cc.or_(c, d);
+ cc.sbb(a, b);
+ cc.sbb(b, c);
+ cc.sbb(c, d);
+ cc.sub(a, b);
+ cc.sub(b, c);
+ cc.sub(c, d);
+ cc.test(a, b);
+ cc.test(b, c);
+ cc.test(c, d);
+ cc.xchg(a, b);
+ cc.xchg(b, c);
+ cc.xchg(c, d);
+ cc.xor_(a, b);
+ cc.xor_(b, c);
+ cc.xor_(c, d);
+
+ cc.rcl(a, c.r8_lo());
+ cc.rcl(b, c.r8_lo());
+ cc.rcl(d, c.r8_lo());
+ cc.rcr(a, c.r8_lo());
+ cc.rcr(b, c.r8_lo());
+ cc.rcr(d, c.r8_lo());
+ cc.rol(a, c.r8_lo());
+ cc.rol(b, c.r8_lo());
+ cc.rol(d, c.r8_lo());
+ cc.ror(a, c.r8_lo());
+ cc.ror(b, c.r8_lo());
+ cc.ror(d, c.r8_lo());
+ cc.shl(a, c.r8_lo());
+ cc.shl(b, c.r8_lo());
+ cc.shl(d, c.r8_lo());
+ cc.shr(a, c.r8_lo());
+ cc.shr(b, c.r8_lo());
+ cc.shr(d, c.r8_lo());
+ cc.sar(a, c.r8_lo());
+ cc.sar(b, c.r8_lo());
+ cc.sar(d, c.r8_lo());
+ cc.shld(a, b, c.r8_lo());
+ cc.shld(b, d, c.r8_lo());
+ cc.shld(d, a, c.r8_lo());
+ cc.shrd(a, b, c.r8_lo());
+ cc.shrd(b, d, c.r8_lo());
+ cc.shrd(d, a, c.r8_lo());
+
+ cc.adcx(a, b);
+ cc.adox(a, b);
+ cc.adcx(b, c);
+ cc.adox(b, c);
+ cc.adcx(c, d);
+ cc.adox(c, d);
+ cc.andn(a, b, c);
+ cc.andn(b, c, d);
+ cc.andn(c, d, a);
+ cc.bextr(a, b, c);
+ cc.bextr(b, c, d);
+ cc.bextr(c, d, a);
+ cc.blsi(a, b);
+ cc.blsi(b, c);
+ cc.blsi(c, d);
+ cc.blsmsk(a, b);
+ cc.blsmsk(b, c);
+ cc.blsmsk(c, d);
+ cc.blsr(a, b);
+ cc.blsr(b, c);
+ cc.blsr(c, d);
+ cc.bzhi(a, b, c);
+ cc.bzhi(b, c, d);
+ cc.bzhi(c, d, a);
+ cc.lzcnt(a, b);
+ cc.lzcnt(b, c);
+ cc.lzcnt(c, d);
+ cc.pdep(a, b, c);
+ cc.pdep(b, c, d);
+ cc.pdep(c, d, a);
+ cc.pext(a, b, c);
+ cc.pext(b, c, d);
+ cc.pext(c, d, a);
+ cc.popcnt(a, b);
+ cc.popcnt(b, c);
+ cc.popcnt(c, d);
+ cc.rorx(a, b, 8);
+ cc.rorx(b, c, 8);
+ cc.rorx(c, d, 8);
+ cc.sarx(a, b, c);
+ cc.sarx(b, c, d);
+ cc.sarx(c, d, a);
+ cc.shlx(a, b, c);
+ cc.shlx(b, c, d);
+ cc.shlx(c, d, a);
+ cc.shrx(a, b, c);
+ cc.shrx(b, c, d);
+ cc.shrx(c, d, a);
+ cc.tzcnt(a, b);
+ cc.tzcnt(b, c);
+ cc.tzcnt(c, d);
+ }
+ else {
+ uint32_t register_size = cc.register_size();
+ x86::Mem m = x86::ptr(c, 0, register_size);
+ x86::Mem m8 = x86::byte_ptr(c);
+
+ cc.adc(a, m);
+ cc.adc(b, m);
+ cc.adc(c, m);
+ cc.add(a, m);
+ cc.add(b, m);
+ cc.add(c, m);
+ cc.and_(a, m);
+ cc.and_(b, m);
+ cc.and_(c, m);
+ cc.bsf(a, m);
+ cc.bsf(b, m);
+ cc.bsf(c, m);
+ cc.bsr(a, m);
+ cc.bsr(b, m);
+ cc.bsr(c, m);
+ cc.bt(m, a);
+ cc.bt(m, b);
+ cc.bt(m, c);
+ cc.btc(m, a);
+ cc.btc(m, b);
+ cc.btc(m, c);
+ cc.btr(m, a);
+ cc.btr(m, b);
+ cc.btr(m, c);
+ cc.bts(m, a);
+ cc.bts(m, b);
+ cc.bts(m, c);
+ cc.cmp(a, m);
+ cc.cmovc(a, m);
+ cc.cmp(b, m);
+ cc.cmovc(b, m);
+ cc.cmp(c, m);
+ cc.cmovc(c, m);
+ cc.dec(m);
+ cc.movsx(a, m8);
+ cc.movsx(b, m8);
+ cc.movsx(c, m8);
+ cc.movzx(a, m8);
+ cc.movzx(b, m8);
+ cc.movzx(c, m8);
+ cc.neg(m);
+ cc.not_(m);
+ cc.or_(a, m);
+ cc.or_(b, m);
+ cc.or_(c, m);
+ cc.sbb(a, m);
+ cc.sbb(b, m);
+ cc.sbb(c, m);
+ cc.sub(a, m);
+ cc.sub(b, m);
+ cc.sub(c, m);
+ cc.test(m, a);
+ cc.test(m, b);
+ cc.test(m, c);
+ cc.xchg(a, m);
+ cc.xchg(b, m);
+ cc.xchg(c, m);
+ cc.xor_(a, m);
+ cc.xor_(b, m);
+ cc.xor_(c, m);
+
+ cc.rcl(m, c.r8_lo());
+ cc.rcr(m, c.r8_lo());
+ cc.rol(m, c.r8_lo());
+ cc.ror(m, c.r8_lo());
+ cc.shl(m, c.r8_lo());
+ cc.shr(m, c.r8_lo());
+ cc.sar(m, c.r8_lo());
+ cc.shld(m, b, c.r8_lo());
+ cc.shld(m, d, c.r8_lo());
+ cc.shld(m, a, c.r8_lo());
+ cc.shrd(m, b, c.r8_lo());
+ cc.shrd(m, d, c.r8_lo());
+ cc.shrd(m, a, c.r8_lo());
+
+ cc.adcx(a, m);
+ cc.adox(a, m);
+ cc.adcx(b, m);
+ cc.adox(b, m);
+ cc.adcx(c, m);
+ cc.adox(c, m);
+ cc.andn(a, b, m);
+ cc.andn(b, c, m);
+ cc.andn(c, d, m);
+ cc.bextr(a, m, c);
+ cc.bextr(b, m, d);
+ cc.bextr(c, m, a);
+ cc.blsi(a, m);
+ cc.blsi(b, m);
+ cc.blsi(c, m);
+ cc.blsmsk(a, m);
+ cc.blsmsk(b, m);
+ cc.blsmsk(c, m);
+ cc.blsr(a, m);
+ cc.blsr(b, m);
+ cc.blsr(c, m);
+ cc.bzhi(a, m, c);
+ cc.bzhi(b, m, d);
+ cc.bzhi(c, m, a);
+ cc.lzcnt(a, m);
+ cc.lzcnt(b, m);
+ cc.lzcnt(c, m);
+ cc.pdep(a, b, m);
+ cc.pdep(b, c, m);
+ cc.pdep(c, d, m);
+ cc.pext(a, b, m);
+ cc.pext(b, c, m);
+ cc.pext(c, d, m);
+ cc.popcnt(a, m);
+ cc.popcnt(b, m);
+ cc.popcnt(c, m);
+ cc.rorx(a, m, 8);
+ cc.rorx(b, m, 8);
+ cc.rorx(c, m, 8);
+ cc.sarx(a, m, c);
+ cc.sarx(b, m, d);
+ cc.sarx(c, m, a);
+ cc.shlx(a, m, c);
+ cc.shlx(b, m, d);
+ cc.shlx(c, m, a);
+ cc.shrx(a, m, c);
+ cc.shrx(b, m, d);
+ cc.shrx(c, m, a);
+ cc.tzcnt(a, m);
+ cc.tzcnt(b, m);
+ cc.tzcnt(c, m);
+ }
+}
+
+static void generate_empty_function(BaseEmitter& emitter, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp rv = cc.new_gp32("rv");
+
+ cc.add_func(FuncSignature::build<uint32_t>());
+ cc.mov(rv, 0);
+ cc.ret(rv);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ Gp rv = eax;
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<uint32_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(rv);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ cc.mov(rv, 0);
+ cc.emit_epilog(frame);
+ }
+ else {
+ cc.mov(rv, 0);
+ cc.ret();
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ Gp rv = eax;
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<uint32_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(rv);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ cc.mov(rv, 0);
+ cc.emit_epilog(frame);
+ }
+ else {
+ cc.mov(rv, 0);
+ cc.ret();
+ }
+
+ return;
+ }
+}
+
+static void generate_n_ops_sequence(BaseEmitter& emitter, uint32_t ops, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp ra = cc.new_gp32("ra");
+ Gp rb = cc.new_gp32("rb");
+ Gp rc = cc.new_gp32("rc");
+ Gp rd = cc.new_gp32("rd");
+
+ FuncNode* f = cc.add_func(FuncSignature::build<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>());
+ f->set_arg(0, ra);
+ f->set_arg(1, rb);
+ f->set_arg(2, rc);
+ f->set_arg(3, rd);
+
+ for (uint32_t i = 0; i < ops; i += 4) {
+ cc.add(ra, rb);
+ cc.imul(ra, rc);
+ cc.sub(ra, rd);
+ cc.imul(ra, rc);
+ }
+
+ cc.ret(ra);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ Gp ra = eax;
+ Gp rb = ebx;
+ Gp rc = ecx;
+ Gp rd = edx;
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(ra, rb, rc, rd);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ for (uint32_t i = 0; i < ops; i += 4) {
+ cc.add(ra, rb);
+ cc.imul(ra, rc);
+ cc.sub(ra, rd);
+ cc.imul(ra, rc);
+ }
+ cc.emit_epilog(frame);
+ }
+ else {
+ for (uint32_t i = 0; i < ops; i += 4) {
+ cc.add(ra, rb);
+ cc.imul(ra, rc);
+ cc.sub(ra, rd);
+ cc.imul(ra, rc);
+ }
+ cc.ret();
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ Gp ra = eax;
+ Gp rb = ebx;
+ Gp rc = ecx;
+ Gp rd = edx;
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(ra, rb, rc, rd);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ for (uint32_t i = 0; i < ops; i += 4) {
+ cc.add(ra, rb);
+ cc.imul(ra, rc);
+ cc.sub(ra, rd);
+ cc.imul(ra, rc);
+ }
+ cc.emit_epilog(frame);
+ }
+ else {
+ for (uint32_t i = 0; i < ops; i += 4) {
+ cc.add(ra, rb);
+ cc.imul(ra, rc);
+ cc.sub(ra, rd);
+ cc.imul(ra, rc);
+ }
+ cc.ret();
+ }
+
+ return;
+ }
+}
+
+static void generate_gp_sequence(BaseEmitter& emitter, InstForm form, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp a = cc.new_gp_ptr("a");
+ Gp b = cc.new_gp_ptr("b");
+ Gp c = cc.new_gp_ptr("c");
+ Gp d = cc.new_gp_ptr("d");
+
+ cc.add_func(FuncSignature::build<void>());
+ generate_gp_sequence_internal(cc, form, a, b, c, d);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ x86::Gp a = cc.zax();
+ x86::Gp b = cc.zbx();
+ x86::Gp c = cc.zcx();
+ x86::Gp d = cc.zdx();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(a, b, c, d);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_gp_sequence_internal(cc, form, a, b, c, d);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_gp_sequence_internal(cc, form, a, b, c, d);
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ x86::Gp a = cc.zax();
+ x86::Gp b = cc.zbx();
+ x86::Gp c = cc.zcx();
+ x86::Gp d = cc.zdx();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(a, b, c, d);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_gp_sequence_internal(cc, form, a, b, c, d);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_gp_sequence_internal(cc, form, a, b, c, d);
+ }
+
+ return;
+ }
+}
+
+// Generates a long sequence of SSE instructions using only registers.
+template<typename Emitter>
+static void generate_sse_sequenceInternal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& gp,
+ const x86::Vec& xmm_a, const x86::Vec& xmm_b, const x86::Vec& xmm_c, const x86::Vec& xmm_d) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is_32bit() ? gpd : gpq;
+
+ cc.xor_(gpd, gpd);
+ cc.xorps(xmm_a, xmm_a);
+ cc.xorps(xmm_b, xmm_b);
+ cc.xorps(xmm_c, xmm_c);
+ cc.xorps(xmm_d, xmm_d);
+
+ if (form == InstForm::kReg) {
+ // SSE.
+ cc.addps(xmm_a, xmm_b);
+ cc.addss(xmm_a, xmm_b);
+ cc.andnps(xmm_a, xmm_b);
+ cc.andps(xmm_a, xmm_b);
+ cc.cmpps(xmm_a, xmm_b, 0);
+ cc.cmpss(xmm_a, xmm_b, 0);
+ cc.comiss(xmm_a, xmm_b);
+ cc.cvtsi2ss(xmm_a, gpd);
+ cc.cvtsi2ss(xmm_a, gpz);
+ cc.cvtss2si(gpd, xmm_b);
+ cc.cvtss2si(gpz, xmm_b);
+ cc.cvttss2si(gpd, xmm_b);
+ cc.cvttss2si(gpz, xmm_b);
+ cc.divps(xmm_a, xmm_b);
+ cc.divss(xmm_a, xmm_b);
+ cc.maxps(xmm_a, xmm_b);
+ cc.maxss(xmm_a, xmm_b);
+ cc.minps(xmm_a, xmm_b);
+ cc.minss(xmm_a, xmm_b);
+ cc.movaps(xmm_a, xmm_b);
+ cc.movd(gpd, xmm_b);
+ cc.movd(xmm_a, gpd);
+ cc.movq(xmm_a, xmm_b);
+ cc.movhlps(xmm_a, xmm_b);
+ cc.movlhps(xmm_a, xmm_b);
+ cc.movups(xmm_a, xmm_b);
+ cc.mulps(xmm_a, xmm_b);
+ cc.mulss(xmm_a, xmm_b);
+ cc.orps(xmm_a, xmm_b);
+ cc.rcpps(xmm_a, xmm_b);
+ cc.rcpss(xmm_a, xmm_b);
+ cc.psadbw(xmm_a, xmm_b);
+ cc.rsqrtps(xmm_a, xmm_b);
+ cc.rsqrtss(xmm_a, xmm_b);
+ cc.sfence();
+ cc.shufps(xmm_a, xmm_b, 0);
+ cc.sqrtps(xmm_a, xmm_b);
+ cc.sqrtss(xmm_a, xmm_b);
+ cc.subps(xmm_a, xmm_b);
+ cc.subss(xmm_a, xmm_b);
+ cc.ucomiss(xmm_a, xmm_b);
+ cc.unpckhps(xmm_a, xmm_b);
+ cc.unpcklps(xmm_a, xmm_b);
+ cc.xorps(xmm_a, xmm_b);
+
+ // SSE2.
+ cc.addpd(xmm_a, xmm_b);
+ cc.addsd(xmm_a, xmm_b);
+ cc.andnpd(xmm_a, xmm_b);
+ cc.andpd(xmm_a, xmm_b);
+ cc.cmppd(xmm_a, xmm_b, 0);
+ cc.cmpsd(xmm_a, xmm_b, 0);
+ cc.comisd(xmm_a, xmm_b);
+ cc.cvtdq2pd(xmm_a, xmm_b);
+ cc.cvtdq2ps(xmm_a, xmm_b);
+ cc.cvtpd2dq(xmm_a, xmm_b);
+ cc.cvtpd2ps(xmm_a, xmm_b);
+ cc.cvtps2dq(xmm_a, xmm_b);
+ cc.cvtps2pd(xmm_a, xmm_b);
+ cc.cvtsd2si(gpd, xmm_b);
+ cc.cvtsd2si(gpz, xmm_b);
+ cc.cvtsd2ss(xmm_a, xmm_b);
+ cc.cvtsi2sd(xmm_a, gpd);
+ cc.cvtsi2sd(xmm_a, gpz);
+ cc.cvtss2sd(xmm_a, xmm_b);
+ cc.cvtss2si(gpd, xmm_b);
+ cc.cvtss2si(gpz, xmm_b);
+ cc.cvttpd2dq(xmm_a, xmm_b);
+ cc.cvttps2dq(xmm_a, xmm_b);
+ cc.cvttsd2si(gpd, xmm_b);
+ cc.cvttsd2si(gpz, xmm_b);
+ cc.divpd(xmm_a, xmm_b);
+ cc.divsd(xmm_a, xmm_b);
+ cc.maxpd(xmm_a, xmm_b);
+ cc.maxsd(xmm_a, xmm_b);
+ cc.minpd(xmm_a, xmm_b);
+ cc.minsd(xmm_a, xmm_b);
+ cc.movdqa(xmm_a, xmm_b);
+ cc.movdqu(xmm_a, xmm_b);
+ cc.movmskps(gpd, xmm_b);
+ cc.movmskpd(gpd, xmm_b);
+ cc.movsd(xmm_a, xmm_b);
+ cc.mulpd(xmm_a, xmm_b);
+ cc.mulsd(xmm_a, xmm_b);
+ cc.orpd(xmm_a, xmm_b);
+ cc.packsswb(xmm_a, xmm_b);
+ cc.packssdw(xmm_a, xmm_b);
+ cc.packuswb(xmm_a, xmm_b);
+ cc.paddb(xmm_a, xmm_b);
+ cc.paddw(xmm_a, xmm_b);
+ cc.paddd(xmm_a, xmm_b);
+ cc.paddq(xmm_a, xmm_b);
+ cc.paddsb(xmm_a, xmm_b);
+ cc.paddsw(xmm_a, xmm_b);
+ cc.paddusb(xmm_a, xmm_b);
+ cc.paddusw(xmm_a, xmm_b);
+ cc.pand(xmm_a, xmm_b);
+ cc.pandn(xmm_a, xmm_b);
+ cc.pavgb(xmm_a, xmm_b);
+ cc.pavgw(xmm_a, xmm_b);
+ cc.pcmpeqb(xmm_a, xmm_b);
+ cc.pcmpeqw(xmm_a, xmm_b);
+ cc.pcmpeqd(xmm_a, xmm_b);
+ cc.pcmpgtb(xmm_a, xmm_b);
+ cc.pcmpgtw(xmm_a, xmm_b);
+ cc.pcmpgtd(xmm_a, xmm_b);
+ cc.pmaxsw(xmm_a, xmm_b);
+ cc.pmaxub(xmm_a, xmm_b);
+ cc.pminsw(xmm_a, xmm_b);
+ cc.pminub(xmm_a, xmm_b);
+ cc.pmovmskb(gpd, xmm_b);
+ cc.pmulhw(xmm_a, xmm_b);
+ cc.pmulhuw(xmm_a, xmm_b);
+ cc.pmullw(xmm_a, xmm_b);
+ cc.pmuludq(xmm_a, xmm_b);
+ cc.por(xmm_a, xmm_b);
+ cc.pslld(xmm_a, xmm_b);
+ cc.pslld(xmm_a, 0);
+ cc.psllq(xmm_a, xmm_b);
+ cc.psllq(xmm_a, 0);
+ cc.psllw(xmm_a, xmm_b);
+ cc.psllw(xmm_a, 0);
+ cc.pslldq(xmm_a, 0);
+ cc.psrad(xmm_a, xmm_b);
+ cc.psrad(xmm_a, 0);
+ cc.psraw(xmm_a, xmm_b);
+ cc.psraw(xmm_a, 0);
+ cc.psubb(xmm_a, xmm_b);
+ cc.psubw(xmm_a, xmm_b);
+ cc.psubd(xmm_a, xmm_b);
+ cc.psubq(xmm_a, xmm_b);
+ cc.pmaddwd(xmm_a, xmm_b);
+ cc.pshufd(xmm_a, xmm_b, 0);
+ cc.pshufhw(xmm_a, xmm_b, 0);
+ cc.pshuflw(xmm_a, xmm_b, 0);
+ cc.psrld(xmm_a, xmm_b);
+ cc.psrld(xmm_a, 0);
+ cc.psrlq(xmm_a, xmm_b);
+ cc.psrlq(xmm_a, 0);
+ cc.psrldq(xmm_a, 0);
+ cc.psrlw(xmm_a, xmm_b);
+ cc.psrlw(xmm_a, 0);
+ cc.psubsb(xmm_a, xmm_b);
+ cc.psubsw(xmm_a, xmm_b);
+ cc.psubusb(xmm_a, xmm_b);
+ cc.psubusw(xmm_a, xmm_b);
+ cc.punpckhbw(xmm_a, xmm_b);
+ cc.punpckhwd(xmm_a, xmm_b);
+ cc.punpckhdq(xmm_a, xmm_b);
+ cc.punpckhqdq(xmm_a, xmm_b);
+ cc.punpcklbw(xmm_a, xmm_b);
+ cc.punpcklwd(xmm_a, xmm_b);
+ cc.punpckldq(xmm_a, xmm_b);
+ cc.punpcklqdq(xmm_a, xmm_b);
+ cc.pxor(xmm_a, xmm_b);
+ cc.sqrtpd(xmm_a, xmm_b);
+ cc.sqrtsd(xmm_a, xmm_b);
+ cc.subpd(xmm_a, xmm_b);
+ cc.subsd(xmm_a, xmm_b);
+ cc.ucomisd(xmm_a, xmm_b);
+ cc.unpckhpd(xmm_a, xmm_b);
+ cc.unpcklpd(xmm_a, xmm_b);
+ cc.xorpd(xmm_a, xmm_b);
+
+ // SSE3.
+ cc.addsubpd(xmm_a, xmm_b);
+ cc.addsubps(xmm_a, xmm_b);
+ cc.haddpd(xmm_a, xmm_b);
+ cc.haddps(xmm_a, xmm_b);
+ cc.hsubpd(xmm_a, xmm_b);
+ cc.hsubps(xmm_a, xmm_b);
+ cc.movddup(xmm_a, xmm_b);
+ cc.movshdup(xmm_a, xmm_b);
+ cc.movsldup(xmm_a, xmm_b);
+
+ // SSSE3.
+ cc.psignb(xmm_a, xmm_b);
+ cc.psignw(xmm_a, xmm_b);
+ cc.psignd(xmm_a, xmm_b);
+ cc.phaddw(xmm_a, xmm_b);
+ cc.phaddd(xmm_a, xmm_b);
+ cc.phaddsw(xmm_a, xmm_b);
+ cc.phsubw(xmm_a, xmm_b);
+ cc.phsubd(xmm_a, xmm_b);
+ cc.phsubsw(xmm_a, xmm_b);
+ cc.pmaddubsw(xmm_a, xmm_b);
+ cc.pabsb(xmm_a, xmm_b);
+ cc.pabsw(xmm_a, xmm_b);
+ cc.pabsd(xmm_a, xmm_b);
+ cc.pmulhrsw(xmm_a, xmm_b);
+ cc.pshufb(xmm_a, xmm_b);
+ cc.palignr(xmm_a, xmm_b, 0);
+
+ // SSE4.1.
+ cc.blendpd(xmm_a, xmm_b, 0);
+ cc.blendps(xmm_a, xmm_b, 0);
+ cc.blendvpd(xmm_a, xmm_b, xmm_a);
+ cc.blendvps(xmm_a, xmm_b, xmm_a);
+
+ cc.dppd(xmm_a, xmm_b, 0);
+ cc.dpps(xmm_a, xmm_b, 0);
+ cc.extractps(gpd, xmm_b, 0);
+ cc.insertps(xmm_a, xmm_b, 0);
+ cc.mpsadbw(xmm_a, xmm_b, 0);
+ cc.packusdw(xmm_a, xmm_b);
+ cc.pblendvb(xmm_a, xmm_b, xmm_a);
+ cc.pblendw(xmm_a, xmm_b, 0);
+ cc.pcmpeqq(xmm_a, xmm_b);
+ cc.pextrb(gpd, xmm_b, 0);
+ cc.pextrd(gpd, xmm_b, 0);
+ if (cc.is_64bit()) cc.pextrq(gpq, xmm_b, 0);
+ cc.pextrw(gpd, xmm_b, 0);
+ cc.phminposuw(xmm_a, xmm_b);
+ cc.pinsrb(xmm_a, gpd, 0);
+ cc.pinsrd(xmm_a, gpd, 0);
+ cc.pinsrw(xmm_a, gpd, 0);
+ cc.pmaxuw(xmm_a, xmm_b);
+ cc.pmaxsb(xmm_a, xmm_b);
+ cc.pmaxsd(xmm_a, xmm_b);
+ cc.pmaxud(xmm_a, xmm_b);
+ cc.pminsb(xmm_a, xmm_b);
+ cc.pminuw(xmm_a, xmm_b);
+ cc.pminud(xmm_a, xmm_b);
+ cc.pminsd(xmm_a, xmm_b);
+ cc.pmovsxbw(xmm_a, xmm_b);
+ cc.pmovsxbd(xmm_a, xmm_b);
+ cc.pmovsxbq(xmm_a, xmm_b);
+ cc.pmovsxwd(xmm_a, xmm_b);
+ cc.pmovsxwq(xmm_a, xmm_b);
+ cc.pmovsxdq(xmm_a, xmm_b);
+ cc.pmovzxbw(xmm_a, xmm_b);
+ cc.pmovzxbd(xmm_a, xmm_b);
+ cc.pmovzxbq(xmm_a, xmm_b);
+ cc.pmovzxwd(xmm_a, xmm_b);
+ cc.pmovzxwq(xmm_a, xmm_b);
+ cc.pmovzxdq(xmm_a, xmm_b);
+ cc.pmuldq(xmm_a, xmm_b);
+ cc.pmulld(xmm_a, xmm_b);
+ cc.ptest(xmm_a, xmm_b);
+ cc.roundps(xmm_a, xmm_b, 0);
+ cc.roundss(xmm_a, xmm_b, 0);
+ cc.roundpd(xmm_a, xmm_b, 0);
+ cc.roundsd(xmm_a, xmm_b, 0);
+ }
+ else {
+ x86::Mem m = x86::ptr(gpz);
+
+ cc.addps(xmm_a, m);
+ cc.addss(xmm_a, m);
+ cc.andnps(xmm_a, m);
+ cc.andps(xmm_a, m);
+ cc.cmpps(xmm_a, m, 0);
+ cc.cmpss(xmm_a, m, 0);
+ cc.comiss(xmm_a, m);
+ cc.cvtpi2ps(xmm_a, m);
+ cc.cvtsi2ss(xmm_a, m);
+ cc.cvtss2si(gpd, m);
+ cc.cvtss2si(gpz, m);
+ cc.cvttss2si(gpd, m);
+ cc.cvttss2si(gpz, m);
+ cc.divps(xmm_a, m);
+ cc.divss(xmm_a, m);
+ cc.maxps(xmm_a, m);
+ cc.maxss(xmm_a, m);
+ cc.minps(xmm_a, m);
+ cc.minss(xmm_a, m);
+ cc.movaps(xmm_a, m);
+ cc.movaps(m, xmm_b);
+ cc.movd(m, xmm_b);
+ cc.movd(xmm_a, m);
+ cc.movq(m, xmm_b);
+ cc.movq(xmm_a, m);
+ cc.movhps(xmm_a, m);
+ cc.movhps(m, xmm_b);
+ cc.movlps(xmm_a, m);
+ cc.movlps(m, xmm_b);
+ cc.movntps(m, xmm_b);
+ cc.movss(xmm_a, m);
+ cc.movss(m, xmm_b);
+ cc.movups(xmm_a, m);
+ cc.movups(m, xmm_b);
+ cc.mulps(xmm_a, m);
+ cc.mulss(xmm_a, m);
+ cc.orps(xmm_a, m);
+ cc.rcpps(xmm_a, m);
+ cc.rcpss(xmm_a, m);
+ cc.psadbw(xmm_a, m);
+ cc.rsqrtps(xmm_a, m);
+ cc.rsqrtss(xmm_a, m);
+ cc.shufps(xmm_a, m, 0);
+ cc.sqrtps(xmm_a, m);
+ cc.sqrtss(xmm_a, m);
+ cc.stmxcsr(m);
+ cc.subps(xmm_a, m);
+ cc.subss(xmm_a, m);
+ cc.ucomiss(xmm_a, m);
+ cc.unpckhps(xmm_a, m);
+ cc.unpcklps(xmm_a, m);
+ cc.xorps(xmm_a, m);
+
+ // SSE2.
+ cc.addpd(xmm_a, m);
+ cc.addsd(xmm_a, m);
+ cc.andnpd(xmm_a, m);
+ cc.andpd(xmm_a, m);
+ cc.cmppd(xmm_a, m, 0);
+ cc.cmpsd(xmm_a, m, 0);
+ cc.comisd(xmm_a, m);
+ cc.cvtdq2pd(xmm_a, m);
+ cc.cvtdq2ps(xmm_a, m);
+ cc.cvtpd2dq(xmm_a, m);
+ cc.cvtpd2ps(xmm_a, m);
+ cc.cvtpi2pd(xmm_a, m);
+ cc.cvtps2dq(xmm_a, m);
+ cc.cvtps2pd(xmm_a, m);
+ cc.cvtsd2si(gpd, m);
+ cc.cvtsd2si(gpz, m);
+ cc.cvtsd2ss(xmm_a, m);
+ cc.cvtsi2sd(xmm_a, m);
+ cc.cvtss2sd(xmm_a, m);
+ cc.cvtss2si(gpd, m);
+ cc.cvtss2si(gpz, m);
+ cc.cvttpd2dq(xmm_a, m);
+ cc.cvttps2dq(xmm_a, m);
+ cc.cvttsd2si(gpd, m);
+ cc.cvttsd2si(gpz, m);
+ cc.divpd(xmm_a, m);
+ cc.divsd(xmm_a, m);
+ cc.maxpd(xmm_a, m);
+ cc.maxsd(xmm_a, m);
+ cc.minpd(xmm_a, m);
+ cc.minsd(xmm_a, m);
+ cc.movdqa(xmm_a, m);
+ cc.movdqa(m, xmm_b);
+ cc.movdqu(xmm_a, m);
+ cc.movdqu(m, xmm_b);
+ cc.movsd(xmm_a, m);
+ cc.movsd(m, xmm_b);
+ cc.movapd(xmm_a, m);
+ cc.movapd(m, xmm_b);
+ cc.movhpd(xmm_a, m);
+ cc.movhpd(m, xmm_b);
+ cc.movlpd(xmm_a, m);
+ cc.movlpd(m, xmm_b);
+ cc.movntdq(m, xmm_b);
+ cc.movntpd(m, xmm_b);
+ cc.movupd(xmm_a, m);
+ cc.movupd(m, xmm_b);
+ cc.mulpd(xmm_a, m);
+ cc.mulsd(xmm_a, m);
+ cc.orpd(xmm_a, m);
+ cc.packsswb(xmm_a, m);
+ cc.packssdw(xmm_a, m);
+ cc.packuswb(xmm_a, m);
+ cc.paddb(xmm_a, m);
+ cc.paddw(xmm_a, m);
+ cc.paddd(xmm_a, m);
+ cc.paddq(xmm_a, m);
+ cc.paddsb(xmm_a, m);
+ cc.paddsw(xmm_a, m);
+ cc.paddusb(xmm_a, m);
+ cc.paddusw(xmm_a, m);
+ cc.pand(xmm_a, m);
+ cc.pandn(xmm_a, m);
+ cc.pavgb(xmm_a, m);
+ cc.pavgw(xmm_a, m);
+ cc.pcmpeqb(xmm_a, m);
+ cc.pcmpeqw(xmm_a, m);
+ cc.pcmpeqd(xmm_a, m);
+ cc.pcmpgtb(xmm_a, m);
+ cc.pcmpgtw(xmm_a, m);
+ cc.pcmpgtd(xmm_a, m);
+ cc.pmaxsw(xmm_a, m);
+ cc.pmaxub(xmm_a, m);
+ cc.pminsw(xmm_a, m);
+ cc.pminub(xmm_a, m);
+ cc.pmulhw(xmm_a, m);
+ cc.pmulhuw(xmm_a, m);
+ cc.pmullw(xmm_a, m);
+ cc.pmuludq(xmm_a, m);
+ cc.por(xmm_a, m);
+ cc.pslld(xmm_a, m);
+ cc.psllq(xmm_a, m);
+ cc.psllw(xmm_a, m);
+ cc.psrad(xmm_a, m);
+ cc.psraw(xmm_a, m);
+ cc.psubb(xmm_a, m);
+ cc.psubw(xmm_a, m);
+ cc.psubd(xmm_a, m);
+ cc.psubq(xmm_a, m);
+ cc.pmaddwd(xmm_a, m);
+ cc.pshufd(xmm_a, m, 0);
+ cc.pshufhw(xmm_a, m, 0);
+ cc.pshuflw(xmm_a, m, 0);
+ cc.psrld(xmm_a, m);
+ cc.psrlq(xmm_a, m);
+ cc.psrlw(xmm_a, m);
+ cc.psubsb(xmm_a, m);
+ cc.psubsw(xmm_a, m);
+ cc.psubusb(xmm_a, m);
+ cc.psubusw(xmm_a, m);
+ cc.punpckhbw(xmm_a, m);
+ cc.punpckhwd(xmm_a, m);
+ cc.punpckhdq(xmm_a, m);
+ cc.punpckhqdq(xmm_a, m);
+ cc.punpcklbw(xmm_a, m);
+ cc.punpcklwd(xmm_a, m);
+ cc.punpckldq(xmm_a, m);
+ cc.punpcklqdq(xmm_a, m);
+ cc.pxor(xmm_a, m);
+ cc.sqrtpd(xmm_a, m);
+ cc.sqrtsd(xmm_a, m);
+ cc.subpd(xmm_a, m);
+ cc.subsd(xmm_a, m);
+ cc.ucomisd(xmm_a, m);
+ cc.unpckhpd(xmm_a, m);
+ cc.unpcklpd(xmm_a, m);
+ cc.xorpd(xmm_a, m);
+
+ // SSE3.
+ cc.addsubpd(xmm_a, m);
+ cc.addsubps(xmm_a, m);
+ cc.haddpd(xmm_a, m);
+ cc.haddps(xmm_a, m);
+ cc.hsubpd(xmm_a, m);
+ cc.hsubps(xmm_a, m);
+ cc.lddqu(xmm_a, m);
+ cc.movddup(xmm_a, m);
+ cc.movshdup(xmm_a, m);
+ cc.movsldup(xmm_a, m);
+
+ // SSSE3.
+ cc.psignb(xmm_a, m);
+ cc.psignw(xmm_a, m);
+ cc.psignd(xmm_a, m);
+ cc.phaddw(xmm_a, m);
+ cc.phaddd(xmm_a, m);
+ cc.phaddsw(xmm_a, m);
+ cc.phsubw(xmm_a, m);
+ cc.phsubd(xmm_a, m);
+ cc.phsubsw(xmm_a, m);
+ cc.pmaddubsw(xmm_a, m);
+ cc.pabsb(xmm_a, m);
+ cc.pabsw(xmm_a, m);
+ cc.pabsd(xmm_a, m);
+ cc.pmulhrsw(xmm_a, m);
+ cc.pshufb(xmm_a, m);
+ cc.palignr(xmm_a, m, 0);
+
+ // SSE4.1.
+ cc.blendpd(xmm_a, m, 0);
+ cc.blendps(xmm_a, m, 0);
+ cc.blendvpd(xmm_a, m, xmm_a);
+ cc.blendvps(xmm_a, m, xmm_a);
+
+ cc.dppd(xmm_a, m, 0);
+ cc.dpps(xmm_a, m, 0);
+ cc.extractps(m, xmm_b, 0);
+ cc.insertps(xmm_a, m, 0);
+ cc.movntdqa(xmm_a, m);
+ cc.mpsadbw(xmm_a, m, 0);
+ cc.packusdw(xmm_a, m);
+ cc.pblendvb(xmm_a, m, xmm_a);
+ cc.pblendw(xmm_a, m, 0);
+ cc.pcmpeqq(xmm_a, m);
+ cc.pextrb(m, xmm_b, 0);
+ cc.pextrd(m, xmm_b, 0);
+ if (cc.is_64bit()) cc.pextrq(m, xmm_b, 0);
+ cc.pextrw(m, xmm_b, 0);
+ cc.phminposuw(xmm_a, m);
+ cc.pinsrb(xmm_a, m, 0);
+ cc.pinsrd(xmm_a, m, 0);
+ cc.pinsrw(xmm_a, m, 0);
+ cc.pmaxuw(xmm_a, m);
+ cc.pmaxsb(xmm_a, m);
+ cc.pmaxsd(xmm_a, m);
+ cc.pmaxud(xmm_a, m);
+ cc.pminsb(xmm_a, m);
+ cc.pminuw(xmm_a, m);
+ cc.pminud(xmm_a, m);
+ cc.pminsd(xmm_a, m);
+ cc.pmovsxbw(xmm_a, m);
+ cc.pmovsxbd(xmm_a, m);
+ cc.pmovsxbq(xmm_a, m);
+ cc.pmovsxwd(xmm_a, m);
+ cc.pmovsxwq(xmm_a, m);
+ cc.pmovsxdq(xmm_a, m);
+ cc.pmovzxbw(xmm_a, m);
+ cc.pmovzxbd(xmm_a, m);
+ cc.pmovzxbq(xmm_a, m);
+ cc.pmovzxwd(xmm_a, m);
+ cc.pmovzxwq(xmm_a, m);
+ cc.pmovzxdq(xmm_a, m);
+ cc.pmuldq(xmm_a, m);
+ cc.pmulld(xmm_a, m);
+ cc.ptest(xmm_a, m);
+ cc.roundps(xmm_a, m, 0);
+ cc.roundss(xmm_a, m, 0);
+ cc.roundpd(xmm_a, m, 0);
+ cc.roundsd(xmm_a, m, 0);
+
+ // SSE4.2.
+ cc.pcmpgtq(xmm_a, m);
+ }
+}
+
+static void generate_sse_sequence(BaseEmitter& emitter, InstForm form, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp gp = cc.new_gpz("gp");
+ Vec a = cc.new_xmm("a");
+ Vec b = cc.new_xmm("b");
+ Vec c = cc.new_xmm("c");
+ Vec d = cc.new_xmm("d");
+
+ cc.add_func(FuncSignature::build<void>());
+ generate_sse_sequenceInternal(cc, form, gp, a, b, c, d);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(eax, xmm0, xmm1, xmm2, xmm3);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_sse_sequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_sse_sequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(eax, xmm0, xmm1, xmm2, xmm3);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_sse_sequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_sse_sequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
+ }
+
+ return;
+ }
+}
+
+// Generates a long sequence of AVX instructions.
+template<typename Emitter>
+static void generate_avx_sequenceInternalRegOnly(
+ Emitter& cc,
+ const x86::Gp& gp,
+ const x86::Vec& vec_a, const x86::Vec& vec_b, const x86::Vec& vec_c, const x86::Vec& vec_d) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is_32bit() ? gpd : gpq;
+
+ x86::Vec xmm_a = vec_a.xmm();
+ x86::Vec xmm_b = vec_b.xmm();
+ x86::Vec xmm_c = vec_c.xmm();
+ x86::Vec xmm_d = vec_d.xmm();
+
+ x86::Vec ymm_a = vec_a.ymm();
+ x86::Vec ymm_b = vec_b.ymm();
+ x86::Vec ymm_c = vec_c.ymm();
+
+ cc.xor_(gpd, gpd);
+ cc.vxorps(xmm_a, xmm_a, xmm_a);
+ cc.vxorps(xmm_b, xmm_b, xmm_b);
+ cc.vxorps(xmm_c, xmm_c, xmm_c);
+ cc.vxorps(xmm_d, xmm_d, xmm_d);
+
+ cc.vaddpd(xmm_a, xmm_b, xmm_c);
+ cc.vaddpd(ymm_a, ymm_b, ymm_c);
+ cc.vaddps(xmm_a, xmm_b, xmm_c);
+ cc.vaddps(ymm_a, ymm_b, ymm_c);
+ cc.vaddsd(xmm_a, xmm_b, xmm_c);
+ cc.vaddss(xmm_a, xmm_b, xmm_c);
+ cc.vaddsubpd(xmm_a, xmm_b, xmm_c);
+ cc.vaddsubpd(ymm_a, ymm_b, ymm_c);
+ cc.vaddsubps(xmm_a, xmm_b, xmm_c);
+ cc.vaddsubps(ymm_a, ymm_b, ymm_c);
+ cc.vandpd(xmm_a, xmm_b, xmm_c);
+ cc.vandpd(ymm_a, ymm_b, ymm_c);
+ cc.vandps(xmm_a, xmm_b, xmm_c);
+ cc.vandps(ymm_a, ymm_b, ymm_c);
+ cc.vandnpd(xmm_a, xmm_b, xmm_c);
+ cc.vandnpd(ymm_a, ymm_b, ymm_c);
+ cc.vandnps(xmm_a, xmm_b, xmm_c);
+ cc.vandnps(ymm_a, ymm_b, ymm_c);
+ cc.vblendpd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vblendpd(ymm_a, ymm_b, ymm_c, 0);
+ cc.vblendps(xmm_a, xmm_b, xmm_c, 0);
+ cc.vblendps(ymm_a, ymm_b, ymm_c, 0);
+ cc.vblendvpd(xmm_a, xmm_b, xmm_c, xmm_a);
+ cc.vblendvpd(ymm_a, ymm_b, ymm_c, ymm_a);
+ cc.vcmppd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vcmppd(ymm_a, ymm_b, ymm_c, 0);
+ cc.vcmpps(xmm_a, xmm_b, xmm_c, 0);
+ cc.vcmpps(ymm_a, ymm_b, ymm_c, 0);
+ cc.vcmpsd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vcmpss(xmm_a, xmm_b, xmm_c, 0);
+ cc.vcomisd(xmm_a, xmm_b);
+ cc.vcomiss(xmm_a, xmm_b);
+ cc.vcvtdq2pd(xmm_a, xmm_b);
+ cc.vcvtdq2pd(ymm_a, xmm_b);
+ cc.vcvtdq2ps(xmm_a, xmm_b);
+ cc.vcvtdq2ps(ymm_a, ymm_b);
+ cc.vcvtpd2dq(xmm_a, xmm_b);
+ cc.vcvtpd2dq(xmm_a, ymm_b);
+ cc.vcvtpd2ps(xmm_a, xmm_b);
+ cc.vcvtpd2ps(xmm_a, ymm_b);
+ cc.vcvtps2dq(xmm_a, xmm_b);
+ cc.vcvtps2dq(ymm_a, ymm_b);
+ cc.vcvtps2pd(xmm_a, xmm_b);
+ cc.vcvtps2pd(ymm_a, xmm_b);
+ cc.vcvtsd2si(gpd, xmm_b);
+ cc.vcvtsd2si(gpz, xmm_b);
+ cc.vcvtsd2ss(xmm_a, xmm_b, xmm_c);
+ cc.vcvtsi2sd(xmm_a, xmm_b, gpd);
+ cc.vcvtsi2sd(xmm_a, xmm_b, gpz);
+ cc.vcvtsi2ss(xmm_a, xmm_b, gpd);
+ cc.vcvtsi2ss(xmm_a, xmm_b, gpz);
+ cc.vcvtss2sd(xmm_a, xmm_b, xmm_c);
+ cc.vcvtss2si(gpd, xmm_b);
+ cc.vcvttpd2dq(xmm_a, xmm_b);
+ cc.vcvttpd2dq(xmm_a, ymm_b);
+ cc.vcvttps2dq(xmm_a, xmm_b);
+ cc.vcvttps2dq(ymm_a, ymm_b);
+ cc.vcvttsd2si(gpd, xmm_b);
+ cc.vcvttss2si(gpz, xmm_b);
+ cc.vdivpd(xmm_a, xmm_b, xmm_c);
+ cc.vdivpd(ymm_a, ymm_b, ymm_c);
+ cc.vdivps(xmm_a, xmm_b, xmm_c);
+ cc.vdivps(ymm_a, ymm_b, ymm_c);
+ cc.vdivsd(xmm_a, xmm_b, xmm_c);
+ cc.vdivss(xmm_a, xmm_b, xmm_c);
+ cc.vdppd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vdpps(xmm_a, xmm_b, xmm_c, 0);
+ cc.vdpps(ymm_a, ymm_b, ymm_c, 0);
+ cc.vextractf128(xmm_a, ymm_b, 0);
+ cc.vextractps(gpd, xmm_b, 0);
+ cc.vhaddpd(xmm_a, xmm_b, xmm_c);
+ cc.vhaddpd(ymm_a, ymm_b, ymm_c);
+ cc.vhaddps(xmm_a, xmm_b, xmm_c);
+ cc.vhaddps(ymm_a, ymm_b, ymm_c);
+ cc.vhsubpd(xmm_a, xmm_b, xmm_c);
+ cc.vhsubpd(ymm_a, ymm_b, ymm_c);
+ cc.vhsubps(xmm_a, xmm_b, xmm_c);
+ cc.vhsubps(ymm_a, ymm_b, ymm_c);
+ cc.vinsertf128(ymm_a, ymm_b, xmm_c, 0);
+ cc.vinsertps(xmm_a, xmm_b, xmm_c, 0);
+ cc.vmaxpd(xmm_a, xmm_b, xmm_c);
+ cc.vmaxpd(ymm_a, ymm_b, ymm_c);
+ cc.vmaxps(xmm_a, xmm_b, xmm_c);
+ cc.vmaxps(ymm_a, ymm_b, ymm_c);
+ cc.vmaxsd(xmm_a, xmm_b, xmm_c);
+ cc.vmaxss(xmm_a, xmm_b, xmm_c);
+ cc.vminpd(xmm_a, xmm_b, xmm_c);
+ cc.vminpd(ymm_a, ymm_b, ymm_c);
+ cc.vminps(xmm_a, xmm_b, xmm_c);
+ cc.vminps(ymm_a, ymm_b, ymm_c);
+ cc.vminsd(xmm_a, xmm_b, xmm_c);
+ cc.vminss(xmm_a, xmm_b, xmm_c);
+ cc.vmovapd(xmm_a, xmm_b);
+ cc.vmovapd(ymm_a, ymm_b);
+ cc.vmovaps(xmm_a, xmm_b);
+ cc.vmovaps(ymm_a, ymm_b);
+ cc.vmovd(xmm_a, gpd);
+ cc.vmovd(gpd, xmm_b);
+ cc.vmovddup(xmm_a, xmm_b);
+ cc.vmovddup(ymm_a, ymm_b);
+ cc.vmovdqa(xmm_a, xmm_b);
+ cc.vmovdqa(ymm_a, ymm_b);
+ cc.vmovdqu(xmm_a, xmm_b);
+ cc.vmovdqu(ymm_a, ymm_b);
+ cc.vmovhlps(xmm_a, xmm_b, xmm_c);
+ cc.vmovlhps(xmm_a, xmm_b, xmm_c);
+ cc.vmovmskpd(gpd, xmm_b);
+ cc.vmovmskpd(gpd, ymm_b);
+ cc.vmovmskps(gpd, xmm_b);
+ cc.vmovmskps(gpd, ymm_b);
+ cc.vmovsd(xmm_a, xmm_b, xmm_c);
+ cc.vmovshdup(xmm_a, xmm_b);
+ cc.vmovshdup(ymm_a, ymm_b);
+ cc.vmovsldup(xmm_a, xmm_b);
+ cc.vmovsldup(ymm_a, ymm_b);
+ cc.vmovss(xmm_a, xmm_b, xmm_c);
+ cc.vmovupd(xmm_a, xmm_b);
+ cc.vmovupd(ymm_a, ymm_b);
+ cc.vmovups(xmm_a, xmm_b);
+ cc.vmovups(ymm_a, ymm_b);
+ cc.vmpsadbw(xmm_a, xmm_b, xmm_c, 0);
+ cc.vmulpd(xmm_a, xmm_b, xmm_c);
+ cc.vmulpd(ymm_a, ymm_b, ymm_c);
+ cc.vmulps(xmm_a, xmm_b, xmm_c);
+ cc.vmulps(ymm_a, ymm_b, ymm_c);
+ cc.vmulsd(xmm_a, xmm_b, xmm_c);
+ cc.vmulss(xmm_a, xmm_b, xmm_c);
+ cc.vorpd(xmm_a, xmm_b, xmm_c);
+ cc.vorpd(ymm_a, ymm_b, ymm_c);
+ cc.vorps(xmm_a, xmm_b, xmm_c);
+ cc.vorps(ymm_a, ymm_b, ymm_c);
+ cc.vpabsb(xmm_a, xmm_b);
+ cc.vpabsd(xmm_a, xmm_b);
+ cc.vpabsw(xmm_a, xmm_b);
+ cc.vpackssdw(xmm_a, xmm_b, xmm_c);
+ cc.vpacksswb(xmm_a, xmm_b, xmm_c);
+ cc.vpackusdw(xmm_a, xmm_b, xmm_c);
+ cc.vpackuswb(xmm_a, xmm_b, xmm_c);
+ cc.vpaddb(xmm_a, xmm_b, xmm_c);
+ cc.vpaddd(xmm_a, xmm_b, xmm_c);
+ cc.vpaddq(xmm_a, xmm_b, xmm_c);
+ cc.vpaddw(xmm_a, xmm_b, xmm_c);
+ cc.vpaddsb(xmm_a, xmm_b, xmm_c);
+ cc.vpaddsw(xmm_a, xmm_b, xmm_c);
+ cc.vpaddusb(xmm_a, xmm_b, xmm_c);
+ cc.vpaddusw(xmm_a, xmm_b, xmm_c);
+ cc.vpalignr(xmm_a, xmm_b, xmm_c, 0);
+ cc.vpand(xmm_a, xmm_b, xmm_c);
+ cc.vpandn(xmm_a, xmm_b, xmm_c);
+ cc.vpavgb(xmm_a, xmm_b, xmm_c);
+ cc.vpavgw(xmm_a, xmm_b, xmm_c);
+ cc.vpblendvb(xmm_a, xmm_b, xmm_c, xmm_a);
+ cc.vpblendw(xmm_a, xmm_b, xmm_c, 0);
+ cc.vpcmpeqb(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpeqd(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpeqq(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpeqw(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpgtb(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpgtd(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpgtq(xmm_a, xmm_b, xmm_c);
+ cc.vpcmpgtw(xmm_a, xmm_b, xmm_c);
+ cc.vpermilpd(xmm_a, xmm_b, xmm_c);
+ cc.vpermilpd(ymm_a, ymm_b, ymm_c);
+ cc.vpermilpd(xmm_a, xmm_b, 0);
+ cc.vpermilpd(ymm_a, ymm_b, 0);
+ cc.vpermilps(xmm_a, xmm_b, xmm_c);
+ cc.vpermilps(ymm_a, ymm_b, ymm_c);
+ cc.vpermilps(xmm_a, xmm_b, 0);
+ cc.vpermilps(ymm_a, ymm_b, 0);
+ cc.vperm2f128(ymm_a, ymm_b, ymm_c, 0);
+ cc.vpextrb(gpd, xmm_b, 0);
+ cc.vpextrd(gpd, xmm_b, 0);
+ if (cc.is_64bit()) cc.vpextrq(gpq, xmm_b, 0);
+ cc.vpextrw(gpd, xmm_b, 0);
+ cc.vphaddd(xmm_a, xmm_b, xmm_c);
+ cc.vphaddsw(xmm_a, xmm_b, xmm_c);
+ cc.vphaddw(xmm_a, xmm_b, xmm_c);
+ cc.vphminposuw(xmm_a, xmm_b);
+ cc.vphsubd(xmm_a, xmm_b, xmm_c);
+ cc.vphsubsw(xmm_a, xmm_b, xmm_c);
+ cc.vphsubw(xmm_a, xmm_b, xmm_c);
+ cc.vpinsrb(xmm_a, xmm_b, gpd, 0);
+ cc.vpinsrd(xmm_a, xmm_b, gpd, 0);
+ cc.vpinsrw(xmm_a, xmm_b, gpd, 0);
+ cc.vpmaddubsw(xmm_a, xmm_b, xmm_c);
+ cc.vpmaddwd(xmm_a, xmm_b, xmm_c);
+ cc.vpmaxsb(xmm_a, xmm_b, xmm_c);
+ cc.vpmaxsd(xmm_a, xmm_b, xmm_c);
+ cc.vpmaxsw(xmm_a, xmm_b, xmm_c);
+ cc.vpmaxub(xmm_a, xmm_b, xmm_c);
+ cc.vpmaxud(xmm_a, xmm_b, xmm_c);
+ cc.vpmaxuw(xmm_a, xmm_b, xmm_c);
+ cc.vpminsb(xmm_a, xmm_b, xmm_c);
+ cc.vpminsd(xmm_a, xmm_b, xmm_c);
+ cc.vpminsw(xmm_a, xmm_b, xmm_c);
+ cc.vpminub(xmm_a, xmm_b, xmm_c);
+ cc.vpminud(xmm_a, xmm_b, xmm_c);
+ cc.vpminuw(xmm_a, xmm_b, xmm_c);
+ cc.vpmovmskb(gpd, xmm_b);
+ cc.vpmovsxbd(xmm_a, xmm_b);
+ cc.vpmovsxbq(xmm_a, xmm_b);
+ cc.vpmovsxbw(xmm_a, xmm_b);
+ cc.vpmovsxdq(xmm_a, xmm_b);
+ cc.vpmovsxwd(xmm_a, xmm_b);
+ cc.vpmovsxwq(xmm_a, xmm_b);
+ cc.vpmovzxbd(xmm_a, xmm_b);
+ cc.vpmovzxbq(xmm_a, xmm_b);
+ cc.vpmovzxbw(xmm_a, xmm_b);
+ cc.vpmovzxdq(xmm_a, xmm_b);
+ cc.vpmovzxwd(xmm_a, xmm_b);
+ cc.vpmovzxwq(xmm_a, xmm_b);
+ cc.vpmuldq(xmm_a, xmm_b, xmm_c);
+ cc.vpmulhrsw(xmm_a, xmm_b, xmm_c);
+ cc.vpmulhuw(xmm_a, xmm_b, xmm_c);
+ cc.vpmulhw(xmm_a, xmm_b, xmm_c);
+ cc.vpmulld(xmm_a, xmm_b, xmm_c);
+ cc.vpmullw(xmm_a, xmm_b, xmm_c);
+ cc.vpmuludq(xmm_a, xmm_b, xmm_c);
+ cc.vpor(xmm_a, xmm_b, xmm_c);
+ cc.vpsadbw(xmm_a, xmm_b, xmm_c);
+ cc.vpshufb(xmm_a, xmm_b, xmm_c);
+ cc.vpshufd(xmm_a, xmm_b, 0);
+ cc.vpshufhw(xmm_a, xmm_b, 0);
+ cc.vpshuflw(xmm_a, xmm_b, 0);
+ cc.vpsignb(xmm_a, xmm_b, xmm_c);
+ cc.vpsignd(xmm_a, xmm_b, xmm_c);
+ cc.vpsignw(xmm_a, xmm_b, xmm_c);
+ cc.vpslld(xmm_a, xmm_b, xmm_c);
+ cc.vpslld(xmm_a, xmm_b, 0);
+ cc.vpslldq(xmm_a, xmm_b, 0);
+ cc.vpsllq(xmm_a, xmm_b, xmm_c);
+ cc.vpsllq(xmm_a, xmm_b, 0);
+ cc.vpsllw(xmm_a, xmm_b, xmm_c);
+ cc.vpsllw(xmm_a, xmm_b, 0);
+ cc.vpsrad(xmm_a, xmm_b, xmm_c);
+ cc.vpsrad(xmm_a, xmm_b, 0);
+ cc.vpsraw(xmm_a, xmm_b, xmm_c);
+ cc.vpsraw(xmm_a, xmm_b, 0);
+ cc.vpsrld(xmm_a, xmm_b, xmm_c);
+ cc.vpsrld(xmm_a, xmm_b, 0);
+ cc.vpsrldq(xmm_a, xmm_b, 0);
+ cc.vpsrlq(xmm_a, xmm_b, xmm_c);
+ cc.vpsrlq(xmm_a, xmm_b, 0);
+ cc.vpsrlw(xmm_a, xmm_b, xmm_c);
+ cc.vpsrlw(xmm_a, xmm_b, 0);
+ cc.vpsubb(xmm_a, xmm_b, xmm_c);
+ cc.vpsubd(xmm_a, xmm_b, xmm_c);
+ cc.vpsubq(xmm_a, xmm_b, xmm_c);
+ cc.vpsubw(xmm_a, xmm_b, xmm_c);
+ cc.vpsubsb(xmm_a, xmm_b, xmm_c);
+ cc.vpsubsw(xmm_a, xmm_b, xmm_c);
+ cc.vpsubusb(xmm_a, xmm_b, xmm_c);
+ cc.vpsubusw(xmm_a, xmm_b, xmm_c);
+ cc.vptest(xmm_a, xmm_b);
+ cc.vptest(ymm_a, ymm_b);
+ cc.vpunpckhbw(xmm_a, xmm_b, xmm_c);
+ cc.vpunpckhdq(xmm_a, xmm_b, xmm_c);
+ cc.vpunpckhqdq(xmm_a, xmm_b, xmm_c);
+ cc.vpunpckhwd(xmm_a, xmm_b, xmm_c);
+ cc.vpunpcklbw(xmm_a, xmm_b, xmm_c);
+ cc.vpunpckldq(xmm_a, xmm_b, xmm_c);
+ cc.vpunpcklqdq(xmm_a, xmm_b, xmm_c);
+ cc.vpunpcklwd(xmm_a, xmm_b, xmm_c);
+ cc.vpxor(xmm_a, xmm_b, xmm_c);
+ cc.vrcpps(xmm_a, xmm_b);
+ cc.vrcpps(ymm_a, ymm_b);
+ cc.vrcpss(xmm_a, xmm_b, xmm_c);
+ cc.vrsqrtps(xmm_a, xmm_b);
+ cc.vrsqrtps(ymm_a, ymm_b);
+ cc.vrsqrtss(xmm_a, xmm_b, xmm_c);
+ cc.vroundpd(xmm_a, xmm_b, 0);
+ cc.vroundpd(ymm_a, ymm_b, 0);
+ cc.vroundps(xmm_a, xmm_b, 0);
+ cc.vroundps(ymm_a, ymm_b, 0);
+ cc.vroundsd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vroundss(xmm_a, xmm_b, xmm_c, 0);
+ cc.vshufpd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vshufpd(ymm_a, ymm_b, ymm_c, 0);
+ cc.vshufps(xmm_a, xmm_b, xmm_c, 0);
+ cc.vshufps(ymm_a, ymm_b, ymm_c, 0);
+ cc.vsqrtpd(xmm_a, xmm_b);
+ cc.vsqrtpd(ymm_a, ymm_b);
+ cc.vsqrtps(xmm_a, xmm_b);
+ cc.vsqrtps(ymm_a, ymm_b);
+ cc.vsqrtsd(xmm_a, xmm_b, xmm_c);
+ cc.vsqrtss(xmm_a, xmm_b, xmm_c);
+ cc.vsubpd(xmm_a, xmm_b, xmm_c);
+ cc.vsubpd(ymm_a, ymm_b, ymm_c);
+ cc.vsubps(xmm_a, xmm_b, xmm_c);
+ cc.vsubps(ymm_a, ymm_b, ymm_c);
+ cc.vsubsd(xmm_a, xmm_b, xmm_c);
+ cc.vsubss(xmm_a, xmm_b, xmm_c);
+ cc.vtestps(xmm_a, xmm_b);
+ cc.vtestps(ymm_a, ymm_b);
+ cc.vtestpd(xmm_a, xmm_b);
+ cc.vtestpd(ymm_a, ymm_b);
+ cc.vucomisd(xmm_a, xmm_b);
+ cc.vucomiss(xmm_a, xmm_b);
+ cc.vunpckhpd(xmm_a, xmm_b, xmm_c);
+ cc.vunpckhpd(ymm_a, ymm_b, ymm_c);
+ cc.vunpckhps(xmm_a, xmm_b, xmm_c);
+ cc.vunpckhps(ymm_a, ymm_b, ymm_c);
+ cc.vunpcklpd(xmm_a, xmm_b, xmm_c);
+ cc.vunpcklpd(ymm_a, ymm_b, ymm_c);
+ cc.vunpcklps(xmm_a, xmm_b, xmm_c);
+ cc.vunpcklps(ymm_a, ymm_b, ymm_c);
+ cc.vxorpd(xmm_a, xmm_b, xmm_c);
+ cc.vxorpd(ymm_a, ymm_b, ymm_c);
+ cc.vxorps(xmm_a, xmm_b, xmm_c);
+ cc.vxorps(ymm_a, ymm_b, ymm_c);
+
+ // AVX+AESNI.
+ cc.vaesdec(xmm_a, xmm_b, xmm_c);
+ cc.vaesdeclast(xmm_a, xmm_b, xmm_c);
+ cc.vaesenc(xmm_a, xmm_b, xmm_c);
+ cc.vaesenclast(xmm_a, xmm_b, xmm_c);
+ cc.vaesimc(xmm_a, xmm_b);
+ cc.vaeskeygenassist(xmm_a, xmm_b, 0);
+
+ // AVX+PCLMULQDQ.
+ cc.vpclmulqdq(xmm_a, xmm_b, xmm_c, 0);
+
+ // AVX2.
+ cc.vbroadcastsd(ymm_a, xmm_b);
+ cc.vbroadcastss(xmm_a, xmm_b);
+ cc.vbroadcastss(ymm_a, xmm_b);
+ cc.vextracti128(xmm_a, ymm_b, 0);
+ cc.vinserti128(ymm_a, ymm_b, xmm_c, 0);
+ cc.vmpsadbw(ymm_a, ymm_b, ymm_c, 0);
+ cc.vpabsb(ymm_a, ymm_b);
+ cc.vpabsd(ymm_a, ymm_b);
+ cc.vpabsw(ymm_a, ymm_b);
+ cc.vpackssdw(ymm_a, ymm_b, ymm_c);
+ cc.vpacksswb(ymm_a, ymm_b, ymm_c);
+ cc.vpackusdw(ymm_a, ymm_b, ymm_c);
+ cc.vpackuswb(ymm_a, ymm_b, ymm_c);
+ cc.vpaddb(ymm_a, ymm_b, ymm_c);
+ cc.vpaddd(ymm_a, ymm_b, ymm_c);
+ cc.vpaddq(ymm_a, ymm_b, ymm_c);
+ cc.vpaddw(ymm_a, ymm_b, ymm_c);
+ cc.vpaddsb(ymm_a, ymm_b, ymm_c);
+ cc.vpaddsw(ymm_a, ymm_b, ymm_c);
+ cc.vpaddusb(ymm_a, ymm_b, ymm_c);
+ cc.vpaddusw(ymm_a, ymm_b, ymm_c);
+ cc.vpalignr(ymm_a, ymm_b, ymm_c, 0);
+ cc.vpand(ymm_a, ymm_b, ymm_c);
+ cc.vpandn(ymm_a, ymm_b, ymm_c);
+ cc.vpavgb(ymm_a, ymm_b, ymm_c);
+ cc.vpavgw(ymm_a, ymm_b, ymm_c);
+ cc.vpblendd(xmm_a, xmm_b, xmm_c, 0);
+ cc.vpblendd(ymm_a, ymm_b, ymm_c, 0);
+ cc.vpblendvb(ymm_a, ymm_b, ymm_c, ymm_a);
+ cc.vpblendw(ymm_a, ymm_b, ymm_c, 0);
+ cc.vpbroadcastb(xmm_a, xmm_b);
+ cc.vpbroadcastb(ymm_a, xmm_b);
+ cc.vpbroadcastd(xmm_a, xmm_b);
+ cc.vpbroadcastd(ymm_a, xmm_b);
+ cc.vpbroadcastq(xmm_a, xmm_b);
+ cc.vpbroadcastq(ymm_a, xmm_b);
+ cc.vpbroadcastw(xmm_a, xmm_b);
+ cc.vpbroadcastw(ymm_a, xmm_b);
+ cc.vpcmpeqb(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpeqd(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpeqq(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpeqw(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpgtb(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpgtd(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpgtq(ymm_a, ymm_b, ymm_c);
+ cc.vpcmpgtw(ymm_a, ymm_b, ymm_c);
+ cc.vperm2i128(ymm_a, ymm_b, ymm_c, 0);
+ cc.vpermd(ymm_a, ymm_b, ymm_c);
+ cc.vpermps(ymm_a, ymm_b, ymm_c);
+ cc.vpermpd(ymm_a, ymm_b, 0);
+ cc.vpermq(ymm_a, ymm_b, 0);
+ cc.vpmovmskb(gpd, ymm_b);
+ cc.vpmovsxbd(ymm_a, xmm_b);
+ cc.vpmovsxbq(ymm_a, xmm_b);
+ cc.vpmovsxbw(ymm_a, xmm_b);
+ cc.vpmovsxdq(ymm_a, xmm_b);
+ cc.vpmovsxwd(ymm_a, xmm_b);
+ cc.vpmovsxwq(ymm_a, xmm_b);
+ cc.vpmovzxbd(ymm_a, xmm_b);
+ cc.vpmovzxbq(ymm_a, xmm_b);
+ cc.vpmovzxbw(ymm_a, xmm_b);
+ cc.vpmovzxdq(ymm_a, xmm_b);
+ cc.vpmovzxwd(ymm_a, xmm_b);
+ cc.vpmovzxwq(ymm_a, xmm_b);
+ cc.vpshufd(ymm_a, ymm_b, 0);
+ cc.vpshufhw(ymm_a, ymm_b, 0);
+ cc.vpshuflw(ymm_a, ymm_b, 0);
+ cc.vpslld(ymm_a, ymm_b, 0);
+ cc.vpslldq(ymm_a, ymm_b, 0);
+ cc.vpsllq(ymm_a, ymm_b, 0);
+ cc.vpsllw(ymm_a, ymm_b, 0);
+ cc.vpsrad(ymm_a, ymm_b, 0);
+ cc.vpsraw(ymm_a, ymm_b, 0);
+ cc.vpsrld(ymm_a, ymm_b, 0);
+ cc.vpsrldq(ymm_a, ymm_b, 0);
+ cc.vpsrlq(ymm_a, ymm_b, 0);
+ cc.vpsrlw(ymm_a, ymm_b, 0);
+ cc.vphaddd(ymm_a, ymm_b, ymm_c);
+ cc.vphaddsw(ymm_a, ymm_b, ymm_c);
+ cc.vphaddw(ymm_a, ymm_b, ymm_c);
+ cc.vphsubd(ymm_a, ymm_b, ymm_c);
+ cc.vphsubsw(ymm_a, ymm_b, ymm_c);
+ cc.vphsubw(ymm_a, ymm_b, ymm_c);
+ cc.vpmaddubsw(ymm_a, ymm_b, ymm_c);
+ cc.vpmaddwd(ymm_a, ymm_b, ymm_c);
+ cc.vpmaxsb(ymm_a, ymm_b, ymm_c);
+ cc.vpmaxsd(ymm_a, ymm_b, ymm_c);
+ cc.vpmaxsw(ymm_a, ymm_b, ymm_c);
+ cc.vpmaxub(ymm_a, ymm_b, ymm_c);
+ cc.vpmaxud(ymm_a, ymm_b, ymm_c);
+ cc.vpmaxuw(ymm_a, ymm_b, ymm_c);
+ cc.vpminsb(ymm_a, ymm_b, ymm_c);
+ cc.vpminsd(ymm_a, ymm_b, ymm_c);
+ cc.vpminsw(ymm_a, ymm_b, ymm_c);
+ cc.vpminub(ymm_a, ymm_b, ymm_c);
+ cc.vpminud(ymm_a, ymm_b, ymm_c);
+ cc.vpminuw(ymm_a, ymm_b, ymm_c);
+ cc.vpmuldq(ymm_a, ymm_b, ymm_c);
+ cc.vpmulhrsw(ymm_a, ymm_b, ymm_c);
+ cc.vpmulhuw(ymm_a, ymm_b, ymm_c);
+ cc.vpmulhw(ymm_a, ymm_b, ymm_c);
+ cc.vpmulld(ymm_a, ymm_b, ymm_c);
+ cc.vpmullw(ymm_a, ymm_b, ymm_c);
+ cc.vpmuludq(ymm_a, ymm_b, ymm_c);
+ cc.vpor(ymm_a, ymm_b, ymm_c);
+ cc.vpsadbw(ymm_a, ymm_b, ymm_c);
+ cc.vpshufb(ymm_a, ymm_b, ymm_c);
+ cc.vpsignb(ymm_a, ymm_b, ymm_c);
+ cc.vpsignd(ymm_a, ymm_b, ymm_c);
+ cc.vpsignw(ymm_a, ymm_b, ymm_c);
+ cc.vpslld(ymm_a, ymm_b, xmm_c);
+ cc.vpsllq(ymm_a, ymm_b, xmm_c);
+ cc.vpsllvd(xmm_a, xmm_b, xmm_c);
+ cc.vpsllvd(ymm_a, ymm_b, ymm_c);
+ cc.vpsllvq(xmm_a, xmm_b, xmm_c);
+ cc.vpsllvq(ymm_a, ymm_b, ymm_c);
+ cc.vpsllw(ymm_a, ymm_b, xmm_c);
+ cc.vpsrad(ymm_a, ymm_b, xmm_c);
+ cc.vpsravd(xmm_a, xmm_b, xmm_c);
+ cc.vpsravd(ymm_a, ymm_b, ymm_c);
+ cc.vpsraw(ymm_a, ymm_b, xmm_c);
+ cc.vpsrld(ymm_a, ymm_b, xmm_c);
+ cc.vpsrlq(ymm_a, ymm_b, xmm_c);
+ cc.vpsrlvd(xmm_a, xmm_b, xmm_c);
+ cc.vpsrlvd(ymm_a, ymm_b, ymm_c);
+ cc.vpsrlvq(xmm_a, xmm_b, xmm_c);
+ cc.vpsrlvq(ymm_a, ymm_b, ymm_c);
+ cc.vpsrlw(ymm_a, ymm_b, xmm_c);
+ cc.vpsubb(ymm_a, ymm_b, ymm_c);
+ cc.vpsubd(ymm_a, ymm_b, ymm_c);
+ cc.vpsubq(ymm_a, ymm_b, ymm_c);
+ cc.vpsubsb(ymm_a, ymm_b, ymm_c);
+ cc.vpsubsw(ymm_a, ymm_b, ymm_c);
+ cc.vpsubusb(ymm_a, ymm_b, ymm_c);
+ cc.vpsubusw(ymm_a, ymm_b, ymm_c);
+ cc.vpsubw(ymm_a, ymm_b, ymm_c);
+ cc.vpunpckhbw(ymm_a, ymm_b, ymm_c);
+ cc.vpunpckhdq(ymm_a, ymm_b, ymm_c);
+ cc.vpunpckhqdq(ymm_a, ymm_b, ymm_c);
+ cc.vpunpckhwd(ymm_a, ymm_b, ymm_c);
+ cc.vpunpcklbw(ymm_a, ymm_b, ymm_c);
+ cc.vpunpckldq(ymm_a, ymm_b, ymm_c);
+ cc.vpunpcklqdq(ymm_a, ymm_b, ymm_c);
+ cc.vpunpcklwd(ymm_a, ymm_b, ymm_c);
+ cc.vpxor(ymm_a, ymm_b, ymm_c);
+
+ // FMA.
+ cc.vfmadd132pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd132pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmadd132ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd132ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmadd132sd(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd132ss(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd213pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd213pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmadd213ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd213ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmadd213sd(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd213ss(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd231pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd231pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmadd231ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd231ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmadd231sd(xmm_a, xmm_b, xmm_c);
+ cc.vfmadd231ss(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub132pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub132pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmaddsub132ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub132ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmaddsub213pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub213pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmaddsub213ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub213ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmaddsub231pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub231pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmaddsub231ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmaddsub231ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub132pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub132pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub132ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub132ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub132sd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub132ss(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub213pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub213pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub213ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub213ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub213sd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub213ss(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub231pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub231pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub231ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub231ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmsub231sd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsub231ss(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd132pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd132pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmsubadd132ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd132ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmsubadd213pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd213pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmsubadd213ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd213ps(ymm_a, ymm_b, ymm_c);
+ cc.vfmsubadd231pd(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd231pd(ymm_a, ymm_b, ymm_c);
+ cc.vfmsubadd231ps(xmm_a, xmm_b, xmm_c);
+ cc.vfmsubadd231ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd132pd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd132pd(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd132ps(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd132ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd132sd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd132ss(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd213pd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd213pd(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd213ps(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd213ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd213sd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd213ss(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd231pd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd231pd(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd231ps(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd231ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmadd231sd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmadd231ss(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub132pd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub132pd(ymm_a, ymm_b, ymm_c);
+ cc.vfnmsub132ps(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub132ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmsub132sd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub132ss(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub213pd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub213pd(ymm_a, ymm_b, ymm_c);
+ cc.vfnmsub213ps(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub213ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmsub213sd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub213ss(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub231pd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub231pd(ymm_a, ymm_b, ymm_c);
+ cc.vfnmsub231ps(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub231ps(ymm_a, ymm_b, ymm_c);
+ cc.vfnmsub231sd(xmm_a, xmm_b, xmm_c);
+ cc.vfnmsub231ss(xmm_a, xmm_b, xmm_c);
+}
+
+// Generates a long sequence of AVX instructions.
+template<typename Emitter>
+static void generate_avx_sequenceInternalRegMem(
+ Emitter& cc,
+ const x86::Gp& gp,
+ const x86::Vec& vec_a, const x86::Vec& vec_b, const x86::Vec& vec_c, const x86::Vec& vec_d) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is_32bit() ? gpd : gpq;
+
+ x86::Vec xmm_a = vec_a.xmm();
+ x86::Vec xmm_b = vec_b.xmm();
+ x86::Vec xmm_c = vec_c.xmm();
+ x86::Vec xmm_d = vec_d.xmm();
+
+ x86::Vec ymm_a = vec_a.ymm();
+ x86::Vec ymm_b = vec_b.ymm();
+ x86::Vec ymm_c = vec_c.ymm();
+ x86::Vec ymm_d = vec_d.ymm();
+
+ x86::Mem m = x86::ptr(gpz);
+ x86::Mem m128 = x86::xmmword_ptr(gpz);
+ x86::Mem m256 = x86::xmmword_ptr(gpz);
+ x86::Mem vx_ptr = x86::ptr(gpz, xmm_d);
+ x86::Mem vy_ptr = x86::ptr(gpz, ymm_d);
+
+ cc.xor_(gpd, gpd);
+ cc.vxorps(xmm_a, xmm_a, xmm_a);
+ cc.vxorps(xmm_b, xmm_b, xmm_b);
+ cc.vxorps(xmm_c, xmm_c, xmm_c);
+ cc.vxorps(xmm_d, xmm_d, xmm_d);
+
+ cc.vaddpd(xmm_a, xmm_b, m);
+ cc.vaddpd(ymm_a, ymm_b, m);
+ cc.vaddps(xmm_a, xmm_b, m);
+ cc.vaddps(ymm_a, ymm_b, m);
+ cc.vaddsd(xmm_a, xmm_b, m);
+ cc.vaddss(xmm_a, xmm_b, m);
+ cc.vaddsubpd(xmm_a, xmm_b, m);
+ cc.vaddsubpd(ymm_a, ymm_b, m);
+ cc.vaddsubps(xmm_a, xmm_b, m);
+ cc.vaddsubps(ymm_a, ymm_b, m);
+ cc.vandpd(xmm_a, xmm_b, m);
+ cc.vandpd(ymm_a, ymm_b, m);
+ cc.vandps(xmm_a, xmm_b, m);
+ cc.vandps(ymm_a, ymm_b, m);
+ cc.vandnpd(xmm_a, xmm_b, m);
+ cc.vandnpd(ymm_a, ymm_b, m);
+ cc.vandnps(xmm_a, xmm_b, m);
+ cc.vandnps(ymm_a, ymm_b, m);
+ cc.vblendpd(xmm_a, xmm_b, m, 0);
+ cc.vblendpd(ymm_a, ymm_b, m, 0);
+ cc.vblendps(xmm_a, xmm_b, m, 0);
+ cc.vblendps(ymm_a, ymm_b, m, 0);
+ cc.vblendvpd(xmm_a, xmm_b, m, xmm_a);
+ cc.vblendvpd(ymm_a, ymm_b, m, ymm_a);
+ cc.vbroadcastf128(ymm_a, m);
+ cc.vbroadcastsd(ymm_a, m);
+ cc.vbroadcastss(xmm_a, m);
+ cc.vbroadcastss(ymm_a, m);
+ cc.vcmppd(xmm_a, xmm_b, m, 0);
+ cc.vcmppd(ymm_a, ymm_b, m, 0);
+ cc.vcmpps(xmm_a, xmm_b, m, 0);
+ cc.vcmpps(ymm_a, ymm_b, m, 0);
+ cc.vcmpsd(xmm_a, xmm_b, m, 0);
+ cc.vcmpss(xmm_a, xmm_b, m, 0);
+ cc.vcomisd(xmm_a, m);
+ cc.vcomiss(xmm_a, m);
+ cc.vcvtdq2pd(xmm_a, m);
+ cc.vcvtdq2pd(ymm_a, m);
+ cc.vcvtdq2ps(xmm_a, m);
+ cc.vcvtdq2ps(ymm_a, m);
+ cc.vcvtpd2dq(xmm_a, m128);
+ cc.vcvtpd2dq(xmm_a, m256);
+ cc.vcvtpd2ps(xmm_a, m128);
+ cc.vcvtpd2ps(xmm_a, m256);
+ cc.vcvtps2dq(xmm_a, m);
+ cc.vcvtps2dq(ymm_a, m);
+ cc.vcvtps2pd(xmm_a, m);
+ cc.vcvtps2pd(ymm_a, m);
+ cc.vcvtsd2si(gpd, m);
+ cc.vcvtsd2ss(xmm_a, xmm_b, m);
+ cc.vcvtsi2sd(xmm_a, xmm_b, m);
+ cc.vcvtsi2ss(xmm_a, xmm_b, m);
+ cc.vcvtss2sd(xmm_a, xmm_b, m);
+ cc.vcvtss2si(gpd, m);
+ cc.vcvttpd2dq(xmm_a, m128);
+ cc.vcvttpd2dq(xmm_a, m256);
+ cc.vcvttps2dq(xmm_a, m);
+ cc.vcvttps2dq(ymm_a, m);
+ cc.vcvttsd2si(gpd, m);
+ cc.vcvttss2si(gpd, m);
+ cc.vdivpd(xmm_a, xmm_b, m);
+ cc.vdivpd(ymm_a, ymm_b, m);
+ cc.vdivps(xmm_a, xmm_b, m);
+ cc.vdivps(ymm_a, ymm_b, m);
+ cc.vdivsd(xmm_a, xmm_b, m);
+ cc.vdivss(xmm_a, xmm_b, m);
+ cc.vdppd(xmm_a, xmm_b, m, 0);
+ cc.vdpps(xmm_a, xmm_b, m, 0);
+ cc.vdpps(ymm_a, ymm_b, m, 0);
+ cc.vextractf128(m, ymm_b, 0);
+ cc.vextractps(m, xmm_b, 0);
+ cc.vhaddpd(xmm_a, xmm_b, m);
+ cc.vhaddpd(ymm_a, ymm_b, m);
+ cc.vhaddps(xmm_a, xmm_b, m);
+ cc.vhaddps(ymm_a, ymm_b, m);
+ cc.vhsubpd(xmm_a, xmm_b, m);
+ cc.vhsubpd(ymm_a, ymm_b, m);
+ cc.vhsubps(xmm_a, xmm_b, m);
+ cc.vhsubps(ymm_a, ymm_b, m);
+ cc.vinsertf128(ymm_a, ymm_b, m, 0);
+ cc.vinsertps(xmm_a, xmm_b, m, 0);
+ cc.vlddqu(xmm_a, m);
+ cc.vlddqu(ymm_a, m);
+ cc.vmaskmovps(xmm_a, xmm_b, m);
+ cc.vmaskmovps(ymm_a, ymm_b, m);
+ cc.vmaskmovps(m, xmm_b, xmm_c);
+ cc.vmaskmovps(m, ymm_b, ymm_c);
+ cc.vmaskmovpd(xmm_a, xmm_b, m);
+ cc.vmaskmovpd(ymm_a, ymm_b, m);
+ cc.vmaskmovpd(m, xmm_b, xmm_c);
+ cc.vmaskmovpd(m, ymm_b, ymm_c);
+ cc.vmaxpd(xmm_a, xmm_b, m);
+ cc.vmaxpd(ymm_a, ymm_b, m);
+ cc.vmaxps(xmm_a, xmm_b, m);
+ cc.vmaxps(ymm_a, ymm_b, m);
+ cc.vmaxsd(xmm_a, xmm_b, m);
+ cc.vmaxss(xmm_a, xmm_b, m);
+ cc.vminpd(xmm_a, xmm_b, m);
+ cc.vminpd(ymm_a, ymm_b, m);
+ cc.vminps(xmm_a, xmm_b, m);
+ cc.vminps(ymm_a, ymm_b, m);
+ cc.vminsd(xmm_a, xmm_b, m);
+ cc.vminss(xmm_a, xmm_b, m);
+ cc.vmovapd(xmm_a, m);
+ cc.vmovapd(m, xmm_b);
+ cc.vmovapd(ymm_a, m);
+ cc.vmovapd(m, ymm_b);
+ cc.vmovaps(xmm_a, m);
+ cc.vmovaps(m, xmm_b);
+ cc.vmovaps(ymm_a, m);
+ cc.vmovaps(m, ymm_b);
+ cc.vmovd(xmm_a, m);
+ cc.vmovd(m, xmm_b);
+ cc.vmovddup(xmm_a, m);
+ cc.vmovddup(ymm_a, m);
+ cc.vmovdqa(xmm_a, m);
+ cc.vmovdqa(m, xmm_b);
+ cc.vmovdqa(ymm_a, m);
+ cc.vmovdqa(m, ymm_b);
+ cc.vmovdqu(xmm_a, m);
+ cc.vmovdqu(m, xmm_b);
+ cc.vmovdqu(ymm_a, m);
+ cc.vmovdqu(m, ymm_b);
+ cc.vmovhpd(xmm_a, xmm_b, m);
+ cc.vmovhps(xmm_a, xmm_b, m);
+ cc.vmovhps(m, xmm_b);
+ cc.vmovlpd(xmm_a, xmm_b, m);
+ cc.vmovlpd(m, xmm_b);
+ cc.vmovlps(xmm_a, xmm_b, m);
+ cc.vmovlps(m, xmm_b);
+ cc.vmovntdq(m, xmm_b);
+ cc.vmovntdq(m, ymm_b);
+ cc.vmovntdqa(xmm_a, m);
+ cc.vmovntpd(m, xmm_b);
+ cc.vmovntpd(m, ymm_b);
+ cc.vmovntps(m, xmm_b);
+ cc.vmovntps(m, ymm_b);
+ cc.vmovsd(xmm_a, m);
+ cc.vmovsd(m, xmm_b);
+ cc.vmovshdup(xmm_a, m);
+ cc.vmovshdup(ymm_a, m);
+ cc.vmovsldup(xmm_a, m);
+ cc.vmovsldup(ymm_a, m);
+ cc.vmovss(xmm_a, m);
+ cc.vmovss(m, xmm_b);
+ cc.vmovupd(xmm_a, m);
+ cc.vmovupd(m, xmm_b);
+ cc.vmovupd(ymm_a, m);
+ cc.vmovupd(m, ymm_b);
+ cc.vmovups(xmm_a, m);
+ cc.vmovups(m, xmm_b);
+ cc.vmovups(ymm_a, m);
+ cc.vmovups(m, ymm_b);
+ cc.vmpsadbw(xmm_a, xmm_b, m, 0);
+ cc.vmulpd(xmm_a, xmm_b, m);
+ cc.vmulpd(ymm_a, ymm_b, m);
+ cc.vmulps(xmm_a, xmm_b, m);
+ cc.vmulps(ymm_a, ymm_b, m);
+ cc.vmulsd(xmm_a, xmm_b, m);
+ cc.vmulss(xmm_a, xmm_b, m);
+ cc.vorpd(xmm_a, xmm_b, m);
+ cc.vorpd(ymm_a, ymm_b, m);
+ cc.vorps(xmm_a, xmm_b, m);
+ cc.vorps(ymm_a, ymm_b, m);
+ cc.vpabsb(xmm_a, m);
+ cc.vpabsd(xmm_a, m);
+ cc.vpabsw(xmm_a, m);
+ cc.vpackssdw(xmm_a, xmm_b, m);
+ cc.vpacksswb(xmm_a, xmm_b, m);
+ cc.vpackusdw(xmm_a, xmm_b, m);
+ cc.vpackuswb(xmm_a, xmm_b, m);
+ cc.vpaddb(xmm_a, xmm_b, m);
+ cc.vpaddd(xmm_a, xmm_b, m);
+ cc.vpaddq(xmm_a, xmm_b, m);
+ cc.vpaddw(xmm_a, xmm_b, m);
+ cc.vpaddsb(xmm_a, xmm_b, m);
+ cc.vpaddsw(xmm_a, xmm_b, m);
+ cc.vpaddusb(xmm_a, xmm_b, m);
+ cc.vpaddusw(xmm_a, xmm_b, m);
+ cc.vpalignr(xmm_a, xmm_b, m, 0);
+ cc.vpand(xmm_a, xmm_b, m);
+ cc.vpandn(xmm_a, xmm_b, m);
+ cc.vpavgb(xmm_a, xmm_b, m);
+ cc.vpavgw(xmm_a, xmm_b, m);
+ cc.vpblendvb(xmm_a, xmm_b, m, xmm_a);
+ cc.vpblendw(xmm_a, xmm_b, m, 0);
+ cc.vpcmpeqb(xmm_a, xmm_b, m);
+ cc.vpcmpeqd(xmm_a, xmm_b, m);
+ cc.vpcmpeqq(xmm_a, xmm_b, m);
+ cc.vpcmpeqw(xmm_a, xmm_b, m);
+ cc.vpcmpgtb(xmm_a, xmm_b, m);
+ cc.vpcmpgtd(xmm_a, xmm_b, m);
+ cc.vpcmpgtq(xmm_a, xmm_b, m);
+ cc.vpcmpgtw(xmm_a, xmm_b, m);
+ cc.vpermilpd(xmm_a, xmm_b, m);
+ cc.vpermilpd(ymm_a, ymm_b, m);
+ cc.vpermilpd(xmm_a, m, 0);
+ cc.vpermilpd(ymm_a, m, 0);
+ cc.vpermilps(xmm_a, xmm_b, m);
+ cc.vpermilps(ymm_a, ymm_b, m);
+ cc.vpermilps(xmm_a, m, 0);
+ cc.vpermilps(ymm_a, m, 0);
+ cc.vperm2f128(ymm_a, ymm_b, m, 0);
+ cc.vpextrb(m, xmm_b, 0);
+ cc.vpextrd(m, xmm_b, 0);
+ if (cc.is_64bit()) cc.vpextrq(m, xmm_b, 0);
+ cc.vpextrw(m, xmm_b, 0);
+ cc.vphaddd(xmm_a, xmm_b, m);
+ cc.vphaddsw(xmm_a, xmm_b, m);
+ cc.vphaddw(xmm_a, xmm_b, m);
+ cc.vphminposuw(xmm_a, m);
+ cc.vphsubd(xmm_a, xmm_b, m);
+ cc.vphsubsw(xmm_a, xmm_b, m);
+ cc.vphsubw(xmm_a, xmm_b, m);
+ cc.vpinsrb(xmm_a, xmm_b, m, 0);
+ cc.vpinsrd(xmm_a, xmm_b, m, 0);
+ cc.vpinsrw(xmm_a, xmm_b, m, 0);
+ cc.vpmaddubsw(xmm_a, xmm_b, m);
+ cc.vpmaddwd(xmm_a, xmm_b, m);
+ cc.vpmaxsb(xmm_a, xmm_b, m);
+ cc.vpmaxsd(xmm_a, xmm_b, m);
+ cc.vpmaxsw(xmm_a, xmm_b, m);
+ cc.vpmaxub(xmm_a, xmm_b, m);
+ cc.vpmaxud(xmm_a, xmm_b, m);
+ cc.vpmaxuw(xmm_a, xmm_b, m);
+ cc.vpminsb(xmm_a, xmm_b, m);
+ cc.vpminsd(xmm_a, xmm_b, m);
+ cc.vpminsw(xmm_a, xmm_b, m);
+ cc.vpminub(xmm_a, xmm_b, m);
+ cc.vpminud(xmm_a, xmm_b, m);
+ cc.vpminuw(xmm_a, xmm_b, m);
+ cc.vpmovsxbd(xmm_a, m);
+ cc.vpmovsxbq(xmm_a, m);
+ cc.vpmovsxbw(xmm_a, m);
+ cc.vpmovsxdq(xmm_a, m);
+ cc.vpmovsxwd(xmm_a, m);
+ cc.vpmovsxwq(xmm_a, m);
+ cc.vpmovzxbd(xmm_a, m);
+ cc.vpmovzxbq(xmm_a, m);
+ cc.vpmovzxbw(xmm_a, m);
+ cc.vpmovzxdq(xmm_a, m);
+ cc.vpmovzxwd(xmm_a, m);
+ cc.vpmovzxwq(xmm_a, m);
+ cc.vpmuldq(xmm_a, xmm_b, m);
+ cc.vpmulhrsw(xmm_a, xmm_b, m);
+ cc.vpmulhuw(xmm_a, xmm_b, m);
+ cc.vpmulhw(xmm_a, xmm_b, m);
+ cc.vpmulld(xmm_a, xmm_b, m);
+ cc.vpmullw(xmm_a, xmm_b, m);
+ cc.vpmuludq(xmm_a, xmm_b, m);
+ cc.vpor(xmm_a, xmm_b, m);
+ cc.vpsadbw(xmm_a, xmm_b, m);
+ cc.vpshufb(xmm_a, xmm_b, m);
+ cc.vpshufd(xmm_a, m, 0);
+ cc.vpshufhw(xmm_a, m, 0);
+ cc.vpshuflw(xmm_a, m, 0);
+ cc.vpsignb(xmm_a, xmm_b, m);
+ cc.vpsignd(xmm_a, xmm_b, m);
+ cc.vpsignw(xmm_a, xmm_b, m);
+ cc.vpslld(xmm_a, xmm_b, m);
+ cc.vpsllq(xmm_a, xmm_b, m);
+ cc.vpsllw(xmm_a, xmm_b, m);
+ cc.vpsrad(xmm_a, xmm_b, m);
+ cc.vpsraw(xmm_a, xmm_b, m);
+ cc.vpsrld(xmm_a, xmm_b, m);
+ cc.vpsrlq(xmm_a, xmm_b, m);
+ cc.vpsrlw(xmm_a, xmm_b, m);
+ cc.vpsubb(xmm_a, xmm_b, m);
+ cc.vpsubd(xmm_a, xmm_b, m);
+ cc.vpsubq(xmm_a, xmm_b, m);
+ cc.vpsubw(xmm_a, xmm_b, m);
+ cc.vpsubsb(xmm_a, xmm_b, m);
+ cc.vpsubsw(xmm_a, xmm_b, m);
+ cc.vpsubusb(xmm_a, xmm_b, m);
+ cc.vpsubusw(xmm_a, xmm_b, m);
+ cc.vptest(xmm_a, m);
+ cc.vptest(ymm_a, m);
+ cc.vpunpckhbw(xmm_a, xmm_b, m);
+ cc.vpunpckhdq(xmm_a, xmm_b, m);
+ cc.vpunpckhqdq(xmm_a, xmm_b, m);
+ cc.vpunpckhwd(xmm_a, xmm_b, m);
+ cc.vpunpcklbw(xmm_a, xmm_b, m);
+ cc.vpunpckldq(xmm_a, xmm_b, m);
+ cc.vpunpcklqdq(xmm_a, xmm_b, m);
+ cc.vpunpcklwd(xmm_a, xmm_b, m);
+ cc.vpxor(xmm_a, xmm_b, m);
+ cc.vrcpps(xmm_a, m);
+ cc.vrcpps(ymm_a, m);
+ cc.vrcpss(xmm_a, xmm_b, m);
+ cc.vrsqrtps(xmm_a, m);
+ cc.vrsqrtps(ymm_a, m);
+ cc.vrsqrtss(xmm_a, xmm_b, m);
+ cc.vroundpd(xmm_a, m, 0);
+ cc.vroundpd(ymm_a, m, 0);
+ cc.vroundps(xmm_a, m, 0);
+ cc.vroundps(ymm_a, m, 0);
+ cc.vroundsd(xmm_a, xmm_b, m, 0);
+ cc.vroundss(xmm_a, xmm_b, m, 0);
+ cc.vshufpd(xmm_a, xmm_b, m, 0);
+ cc.vshufpd(ymm_a, ymm_b, m, 0);
+ cc.vshufps(xmm_a, xmm_b, m, 0);
+ cc.vshufps(ymm_a, ymm_b, m, 0);
+ cc.vsqrtpd(xmm_a, m);
+ cc.vsqrtpd(ymm_a, m);
+ cc.vsqrtps(xmm_a, m);
+ cc.vsqrtps(ymm_a, m);
+ cc.vsqrtsd(xmm_a, xmm_b, m);
+ cc.vsqrtss(xmm_a, xmm_b, m);
+ cc.vsubpd(xmm_a, xmm_b, m);
+ cc.vsubpd(ymm_a, ymm_b, m);
+ cc.vsubps(xmm_a, xmm_b, m);
+ cc.vsubps(ymm_a, ymm_b, m);
+ cc.vsubsd(xmm_a, xmm_b, m);
+ cc.vsubss(xmm_a, xmm_b, m);
+ cc.vtestps(xmm_a, m);
+ cc.vtestps(ymm_a, m);
+ cc.vtestpd(xmm_a, m);
+ cc.vtestpd(ymm_a, m);
+ cc.vucomisd(xmm_a, m);
+ cc.vucomiss(xmm_a, m);
+ cc.vunpckhpd(xmm_a, xmm_b, m);
+ cc.vunpckhpd(ymm_a, ymm_b, m);
+ cc.vunpckhps(xmm_a, xmm_b, m);
+ cc.vunpckhps(ymm_a, ymm_b, m);
+ cc.vunpcklpd(xmm_a, xmm_b, m);
+ cc.vunpcklpd(ymm_a, ymm_b, m);
+ cc.vunpcklps(xmm_a, xmm_b, m);
+ cc.vunpcklps(ymm_a, ymm_b, m);
+ cc.vxorpd(xmm_a, xmm_b, m);
+ cc.vxorpd(ymm_a, ymm_b, m);
+ cc.vxorps(xmm_a, xmm_b, m);
+ cc.vxorps(ymm_a, ymm_b, m);
+
+ // AVX+AESNI.
+ cc.vaesdec(xmm_a, xmm_b, m);
+ cc.vaesdeclast(xmm_a, xmm_b, m);
+ cc.vaesenc(xmm_a, xmm_b, m);
+ cc.vaesenclast(xmm_a, xmm_b, m);
+ cc.vaesimc(xmm_a, m);
+ cc.vaeskeygenassist(xmm_a, m, 0);
+
+ // AVX+PCLMULQDQ.
+ cc.vpclmulqdq(xmm_a, xmm_b, m, 0);
+
+ // AVX2.
+ cc.vbroadcasti128(ymm_a, m);
+ cc.vextracti128(m, ymm_b, 0);
+ cc.vgatherdpd(xmm_a, vx_ptr, xmm_c);
+ cc.vgatherdpd(ymm_a, vx_ptr, ymm_c);
+ cc.vgatherdps(xmm_a, vx_ptr, xmm_c);
+ cc.vgatherdps(ymm_a, vy_ptr, ymm_c);
+ cc.vgatherqpd(xmm_a, vx_ptr, xmm_c);
+ cc.vgatherqpd(ymm_a, vy_ptr, ymm_c);
+ cc.vgatherqps(xmm_a, vx_ptr, xmm_c);
+ cc.vgatherqps(xmm_a, vy_ptr, xmm_c);
+ cc.vinserti128(ymm_a, ymm_b, m, 0);
+ cc.vmovntdqa(ymm_a, m);
+ cc.vmpsadbw(ymm_a, ymm_b, m, 0);
+ cc.vpabsb(ymm_a, m);
+ cc.vpabsd(ymm_a, m);
+ cc.vpabsw(ymm_a, m);
+ cc.vpackssdw(ymm_a, ymm_b, m);
+ cc.vpacksswb(ymm_a, ymm_b, m);
+ cc.vpackusdw(ymm_a, ymm_b, m);
+ cc.vpackuswb(ymm_a, ymm_b, m);
+ cc.vpaddb(ymm_a, ymm_b, m);
+ cc.vpaddd(ymm_a, ymm_b, m);
+ cc.vpaddq(ymm_a, ymm_b, m);
+ cc.vpaddw(ymm_a, ymm_b, m);
+ cc.vpaddsb(ymm_a, ymm_b, m);
+ cc.vpaddsw(ymm_a, ymm_b, m);
+ cc.vpaddusb(ymm_a, ymm_b, m);
+ cc.vpaddusw(ymm_a, ymm_b, m);
+ cc.vpalignr(ymm_a, ymm_b, m, 0);
+ cc.vpand(ymm_a, ymm_b, m);
+ cc.vpandn(ymm_a, ymm_b, m);
+ cc.vpavgb(ymm_a, ymm_b, m);
+ cc.vpavgw(ymm_a, ymm_b, m);
+ cc.vpblendd(xmm_a, xmm_b, m, 0);
+ cc.vpblendd(ymm_a, ymm_b, m, 0);
+ cc.vpblendvb(ymm_a, ymm_b, m, ymm_a);
+ cc.vpblendw(ymm_a, ymm_b, m, 0);
+ cc.vpbroadcastb(xmm_a, m);
+ cc.vpbroadcastb(ymm_a, m);
+ cc.vpbroadcastd(xmm_a, m);
+ cc.vpbroadcastd(ymm_a, m);
+ cc.vpbroadcastq(xmm_a, m);
+ cc.vpbroadcastq(ymm_a, m);
+ cc.vpbroadcastw(xmm_a, m);
+ cc.vpbroadcastw(ymm_a, m);
+ cc.vpcmpeqb(ymm_a, ymm_b, m);
+ cc.vpcmpeqd(ymm_a, ymm_b, m);
+ cc.vpcmpeqq(ymm_a, ymm_b, m);
+ cc.vpcmpeqw(ymm_a, ymm_b, m);
+ cc.vpcmpgtb(ymm_a, ymm_b, m);
+ cc.vpcmpgtd(ymm_a, ymm_b, m);
+ cc.vpcmpgtq(ymm_a, ymm_b, m);
+ cc.vpcmpgtw(ymm_a, ymm_b, m);
+ cc.vperm2i128(ymm_a, ymm_b, m, 0);
+ cc.vpermd(ymm_a, ymm_b, m);
+ cc.vpermps(ymm_a, ymm_b, m);
+ cc.vpermpd(ymm_a, m, 0);
+ cc.vpermq(ymm_a, m, 0);
+ cc.vpgatherdd(xmm_a, vx_ptr, xmm_c);
+ cc.vpgatherdd(ymm_a, vy_ptr, ymm_c);
+ cc.vpgatherdq(xmm_a, vx_ptr, xmm_c);
+ cc.vpgatherdq(ymm_a, vx_ptr, ymm_c);
+ cc.vpgatherqd(xmm_a, vx_ptr, xmm_c);
+ cc.vpgatherqd(xmm_a, vy_ptr, xmm_c);
+ cc.vpgatherqq(xmm_a, vx_ptr, xmm_c);
+ cc.vpgatherqq(ymm_a, vy_ptr, ymm_c);
+ cc.vpmovsxbd(ymm_a, m);
+ cc.vpmovsxbq(ymm_a, m);
+ cc.vpmovsxbw(ymm_a, m);
+ cc.vpmovsxdq(ymm_a, m);
+ cc.vpmovsxwd(ymm_a, m);
+ cc.vpmovsxwq(ymm_a, m);
+ cc.vpmovzxbd(ymm_a, m);
+ cc.vpmovzxbq(ymm_a, m);
+ cc.vpmovzxbw(ymm_a, m);
+ cc.vpmovzxdq(ymm_a, m);
+ cc.vpmovzxwd(ymm_a, m);
+ cc.vpmovzxwq(ymm_a, m);
+ cc.vpshufd(ymm_a, m, 0);
+ cc.vpshufhw(ymm_a, m, 0);
+ cc.vpshuflw(ymm_a, m, 0);
+ cc.vphaddd(ymm_a, ymm_b, m);
+ cc.vphaddsw(ymm_a, ymm_b, m);
+ cc.vphaddw(ymm_a, ymm_b, m);
+ cc.vphsubd(ymm_a, ymm_b, m);
+ cc.vphsubsw(ymm_a, ymm_b, m);
+ cc.vphsubw(ymm_a, ymm_b, m);
+ cc.vpmaddubsw(ymm_a, ymm_b, m);
+ cc.vpmaddwd(ymm_a, ymm_b, m);
+ cc.vpmaskmovd(m, xmm_b, xmm_c);
+ cc.vpmaskmovd(m, ymm_b, ymm_c);
+ cc.vpmaskmovd(xmm_a, xmm_b, m);
+ cc.vpmaskmovd(ymm_a, ymm_b, m);
+ cc.vpmaskmovq(m, xmm_b, xmm_c);
+ cc.vpmaskmovq(m, ymm_b, ymm_c);
+ cc.vpmaskmovq(xmm_a, xmm_b, m);
+ cc.vpmaskmovq(ymm_a, ymm_b, m);
+ cc.vpmaxsb(ymm_a, ymm_b, m);
+ cc.vpmaxsd(ymm_a, ymm_b, m);
+ cc.vpmaxsw(ymm_a, ymm_b, m);
+ cc.vpmaxub(ymm_a, ymm_b, m);
+ cc.vpmaxud(ymm_a, ymm_b, m);
+ cc.vpmaxuw(ymm_a, ymm_b, m);
+ cc.vpminsb(ymm_a, ymm_b, m);
+ cc.vpminsd(ymm_a, ymm_b, m);
+ cc.vpminsw(ymm_a, ymm_b, m);
+ cc.vpminub(ymm_a, ymm_b, m);
+ cc.vpminud(ymm_a, ymm_b, m);
+ cc.vpminuw(ymm_a, ymm_b, m);
+ cc.vpmuldq(ymm_a, ymm_b, m);
+ cc.vpmulhrsw(ymm_a, ymm_b, m);
+ cc.vpmulhuw(ymm_a, ymm_b, m);
+ cc.vpmulhw(ymm_a, ymm_b, m);
+ cc.vpmulld(ymm_a, ymm_b, m);
+ cc.vpmullw(ymm_a, ymm_b, m);
+ cc.vpmuludq(ymm_a, ymm_b, m);
+ cc.vpor(ymm_a, ymm_b, m);
+ cc.vpsadbw(ymm_a, ymm_b, m);
+ cc.vpshufb(ymm_a, ymm_b, m);
+ cc.vpsignb(ymm_a, ymm_b, m);
+ cc.vpsignd(ymm_a, ymm_b, m);
+ cc.vpsignw(ymm_a, ymm_b, m);
+ cc.vpslld(ymm_a, ymm_b, m);
+ cc.vpsllq(ymm_a, ymm_b, m);
+ cc.vpsllvd(xmm_a, xmm_b, m);
+ cc.vpsllvd(ymm_a, ymm_b, m);
+ cc.vpsllvq(xmm_a, xmm_b, m);
+ cc.vpsllvq(ymm_a, ymm_b, m);
+ cc.vpsllw(ymm_a, ymm_b, m);
+ cc.vpsrad(ymm_a, ymm_b, m);
+ cc.vpsravd(xmm_a, xmm_b, m);
+ cc.vpsravd(ymm_a, ymm_b, m);
+ cc.vpsraw(ymm_a, ymm_b, m);
+ cc.vpsrld(ymm_a, ymm_b, m);
+ cc.vpsrlq(ymm_a, ymm_b, m);
+ cc.vpsrlvd(xmm_a, xmm_b, m);
+ cc.vpsrlvd(ymm_a, ymm_b, m);
+ cc.vpsrlvq(xmm_a, xmm_b, m);
+ cc.vpsrlvq(ymm_a, ymm_b, m);
+ cc.vpsrlw(ymm_a, ymm_b, m);
+ cc.vpsubb(ymm_a, ymm_b, m);
+ cc.vpsubd(ymm_a, ymm_b, m);
+ cc.vpsubq(ymm_a, ymm_b, m);
+ cc.vpsubsb(ymm_a, ymm_b, m);
+ cc.vpsubsw(ymm_a, ymm_b, m);
+ cc.vpsubusb(ymm_a, ymm_b, m);
+ cc.vpsubusw(ymm_a, ymm_b, m);
+ cc.vpsubw(ymm_a, ymm_b, m);
+ cc.vpunpckhbw(ymm_a, ymm_b, m);
+ cc.vpunpckhdq(ymm_a, ymm_b, m);
+ cc.vpunpckhqdq(ymm_a, ymm_b, m);
+ cc.vpunpckhwd(ymm_a, ymm_b, m);
+ cc.vpunpcklbw(ymm_a, ymm_b, m);
+ cc.vpunpckldq(ymm_a, ymm_b, m);
+ cc.vpunpcklqdq(ymm_a, ymm_b, m);
+ cc.vpunpcklwd(ymm_a, ymm_b, m);
+ cc.vpxor(ymm_a, ymm_b, m);
+}
+
+// Generates a long sequence of AVX instructions.
+template<typename Emitter>
+static void generate_avx_sequenceInternal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& gp,
+ const x86::Vec& vec_a, const x86::Vec& vec_b, const x86::Vec& vec_c, const x86::Vec& vec_d) {
+
+ if (form == InstForm::kReg)
+ generate_avx_sequenceInternalRegOnly(cc, gp, vec_a, vec_b, vec_c, vec_d);
+ else
+ generate_avx_sequenceInternalRegMem(cc, gp, vec_a, vec_b, vec_c, vec_d);
+}
+
+static void generate_avx_sequence(BaseEmitter& emitter, InstForm form, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp gp = cc.new_gpz("gp");
+ x86::Vec a = cc.new_ymm("a");
+ x86::Vec b = cc.new_ymm("b");
+ x86::Vec c = cc.new_ymm("c");
+ x86::Vec d = cc.new_ymm("d");
+
+ cc.add_func(FuncSignature::build<void>());
+ generate_avx_sequenceInternal(cc, form, gp, a, b, c, d);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(eax, ymm0, ymm1, ymm2, ymm3);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_avx_sequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_avx_sequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(eax, ymm0, ymm1, ymm2, ymm3);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_avx_sequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_avx_sequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
+ }
+
+ return;
+ }
+}
+
+// Generates a long sequence of AVX512 instructions.
+template<typename Emitter>
+static void generate_avx512_sequence_internal_reg_only(
+ Emitter& cc,
+ const x86::Gp& gp,
+ const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
+ const x86::Vec& vec_a, const x86::Vec& vec_b, const x86::Vec& vec_c, const x86::Vec& vec_d) {
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is_32bit() ? gpd : gpq;
+
+ x86::Vec xmm_a = vec_a.xmm();
+ x86::Vec xmm_b = vec_b.xmm();
+ x86::Vec xmm_c = vec_c.xmm();
+ x86::Vec xmm_d = vec_d.xmm();
+
+ x86::Vec ymm_a = vec_a.ymm();
+ x86::Vec ymm_b = vec_b.ymm();
+ x86::Vec ymm_c = vec_c.ymm();
+
+ x86::Vec zmm_a = vec_a.zmm();
+ x86::Vec zmm_b = vec_b.zmm();
+ x86::Vec zmm_c = vec_c.zmm();
+
+ cc.xor_(gpd, gpd);
+ cc.vxorps(xmm_a, xmm_a, xmm_a);
+ cc.vxorps(xmm_b, xmm_b, xmm_b);
+ cc.vxorps(xmm_c, xmm_c, xmm_c);
+ cc.vxorps(xmm_d, xmm_d, xmm_d);
+
+ cc.kaddb(kA, kB, kC);
+ cc.kaddd(kA, kB, kC);
+ cc.kaddq(kA, kB, kC);
+ cc.kaddw(kA, kB, kC);
+ cc.kandb(kA, kB, kC);
+ cc.kandd(kA, kB, kC);
+ cc.kandnb(kA, kB, kC);
+ cc.kandnd(kA, kB, kC);
+ cc.kandnq(kA, kB, kC);
+ cc.kandnw(kA, kB, kC);
+ cc.kandq(kA, kB, kC);
+ cc.kandw(kA, kB, kC);
+ cc.kmovb(kA, kB);
+ cc.kmovb(kA, gpd);
+ cc.kmovb(gpd, kB);
+ cc.kmovd(kA, kB);
+ cc.kmovd(kA, gpd);
+ cc.kmovd(gpd, kB);
+ cc.kmovq(kA, kB);
+ if (cc.is_64bit()) cc.kmovq(kA, gpq);
+ if (cc.is_64bit()) cc.kmovq(gpq, kB);
+ cc.kmovw(kA, kB);
+ cc.kmovw(kA, gpd);
+ cc.kmovw(gpd, kB);
+ cc.knotb(kA, kB);
+ cc.knotd(kA, kB);
+ cc.knotq(kA, kB);
+ cc.knotw(kA, kB);
+ cc.korb(kA, kB, kC);
+ cc.kord(kA, kB, kC);
+ cc.korq(kA, kB, kC);
+ cc.kortestb(kA, kB);
+ cc.kortestd(kA, kB);
+ cc.kortestq(kA, kB);
+ cc.kortestw(kA, kB);
+ cc.korw(kA, kB, kC);
+ cc.kshiftlb(kA, kB, 0);
+ cc.kshiftld(kA, kB, 0);
+ cc.kshiftlq(kA, kB, 0);
+ cc.kshiftlw(kA, kB, 0);
+ cc.kshiftrb(kA, kB, 0);
+ cc.kshiftrd(kA, kB, 0);
+ cc.kshiftrq(kA, kB, 0);
+ cc.kshiftrw(kA, kB, 0);
+ cc.ktestb(kA, kB);
+ cc.ktestd(kA, kB);
+ cc.ktestq(kA, kB);
+ cc.ktestw(kA, kB);
+ cc.kunpckbw(kA, kB, kC);
+ cc.kunpckdq(kA, kB, kC);
+ cc.kunpckwd(kA, kB, kC);
+ cc.kxnorb(kA, kB, kC);
+ cc.kxnord(kA, kB, kC);
+ cc.kxnorq(kA, kB, kC);
+ cc.kxnorw(kA, kB, kC);
+ cc.kxorb(kA, kB, kC);
+ cc.kxord(kA, kB, kC);
+ cc.kxorq(kA, kB, kC);
+ cc.kxorw(kA, kB, kC);
+ cc.nop();
+
+ cc.evex().vaddpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vaddpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vaddpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vaddps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vaddps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vaddps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vaddsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vaddss(xmm_a, xmm_b, xmm_c);
+ cc.evex().valignd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().valignd(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().valignd(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().valignq(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().valignq(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().valignq(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vandnpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vandnpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vandnpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vandnps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vandnps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vandnps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vandpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vandpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vandpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vandps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vandps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vandps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vblendmpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vblendmpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vblendmpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vblendmps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vblendmps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vblendmps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vbroadcastf32x2(ymm_a, xmm_b);
+ cc.evex().vbroadcastf32x2(zmm_a, xmm_b);
+ cc.evex().vbroadcasti32x2(xmm_a, xmm_b);
+ cc.evex().vbroadcasti32x2(ymm_a, xmm_b);
+ cc.evex().vbroadcasti32x2(zmm_a, xmm_b);
+ cc.evex().vbroadcastsd(ymm_a, xmm_b);
+ cc.evex().vbroadcastsd(zmm_a, xmm_b);
+ cc.evex().vbroadcastss(xmm_a, xmm_b);
+ cc.evex().vbroadcastss(ymm_a, xmm_b);
+ cc.evex().vbroadcastss(zmm_a, xmm_b);
+ cc.evex().vcmppd(kA, xmm_b, xmm_c, 0);
+ cc.evex().vcmppd(kA, ymm_b, ymm_c, 0);
+ cc.evex().vcmppd(kA, zmm_b, zmm_c, 0);
+ cc.evex().vcmpps(kA, xmm_b, xmm_c, 0);
+ cc.evex().vcmpps(kA, ymm_b, ymm_c, 0);
+ cc.evex().vcmpps(kA, zmm_b, zmm_c, 0);
+ cc.evex().vcmpsd(kA, xmm_b, xmm_c, 0);
+ cc.evex().vcmpss(kA, xmm_b, xmm_c, 0);
+ cc.evex().vcomisd(xmm_a, xmm_b);
+ cc.evex().vcomiss(xmm_a, xmm_b);
+ cc.evex().vcompresspd(xmm_a, xmm_b);
+ cc.evex().vcompresspd(ymm_a, ymm_b);
+ cc.evex().vcompresspd(zmm_a, zmm_b);
+ cc.evex().vcompressps(xmm_a, xmm_b);
+ cc.evex().vcompressps(ymm_a, ymm_b);
+ cc.evex().vcompressps(zmm_a, zmm_b);
+ cc.evex().vcvtdq2pd(xmm_a, xmm_b);
+ cc.evex().vcvtdq2pd(ymm_a, xmm_b);
+ cc.evex().vcvtdq2pd(zmm_a, ymm_b);
+ cc.evex().vcvtdq2ps(xmm_a, xmm_b);
+ cc.evex().vcvtdq2ps(ymm_a, ymm_b);
+ cc.evex().vcvtdq2ps(zmm_a, zmm_b);
+ cc.evex().vcvtpd2dq(xmm_a, xmm_b);
+ cc.evex().vcvtpd2dq(xmm_a, ymm_b);
+ cc.evex().vcvtpd2dq(ymm_a, zmm_b);
+ cc.evex().vcvtpd2qq(xmm_a, xmm_b);
+ cc.evex().vcvtpd2qq(ymm_a, ymm_b);
+ cc.evex().vcvtpd2qq(zmm_a, zmm_b);
+ cc.evex().vcvtpd2udq(xmm_a, xmm_b);
+ cc.evex().vcvtpd2udq(xmm_a, ymm_b);
+ cc.evex().vcvtpd2udq(ymm_a, zmm_b);
+ cc.evex().vcvtpd2uqq(xmm_a, xmm_b);
+ cc.evex().vcvtpd2uqq(ymm_a, ymm_b);
+ cc.evex().vcvtpd2uqq(zmm_a, zmm_b);
+ cc.evex().vcvtph2ps(xmm_a, xmm_b);
+ cc.evex().vcvtph2ps(ymm_a, xmm_b);
+ cc.evex().vcvtph2ps(zmm_a, ymm_b);
+ cc.evex().vcvtps2dq(xmm_a, xmm_b);
+ cc.evex().vcvtps2dq(ymm_a, ymm_b);
+ cc.evex().vcvtps2dq(zmm_a, zmm_b);
+ cc.evex().vcvtps2pd(xmm_a, xmm_b);
+ cc.evex().vcvtps2pd(ymm_a, xmm_b);
+ cc.evex().vcvtps2pd(zmm_a, ymm_b);
+ cc.evex().vcvtps2ph(xmm_a, xmm_b, 0);
+ cc.evex().vcvtps2ph(xmm_a, ymm_b, 0);
+ cc.evex().vcvtps2ph(ymm_a, zmm_b, 0);
+ cc.evex().vcvtps2qq(xmm_a, xmm_b);
+ cc.evex().vcvtps2qq(ymm_a, xmm_b);
+ cc.evex().vcvtps2qq(zmm_a, ymm_b);
+ cc.evex().vcvtps2udq(xmm_a, xmm_b);
+ cc.evex().vcvtps2udq(ymm_a, ymm_b);
+ cc.evex().vcvtps2udq(zmm_a, zmm_b);
+ cc.evex().vcvtps2uqq(xmm_a, xmm_b);
+ cc.evex().vcvtps2uqq(ymm_a, xmm_b);
+ cc.evex().vcvtps2uqq(zmm_a, ymm_b);
+ cc.evex().vcvtqq2pd(xmm_a, xmm_b);
+ cc.evex().vcvtqq2pd(ymm_a, ymm_b);
+ cc.evex().vcvtqq2pd(zmm_a, zmm_b);
+ cc.evex().vcvtqq2ps(xmm_a, xmm_b);
+ cc.evex().vcvtqq2ps(xmm_a, ymm_b);
+ cc.evex().vcvtqq2ps(ymm_a, zmm_b);
+ cc.evex().vcvtsd2si(gpd, xmm_b);
+ cc.evex().vcvtsd2si(gpz, xmm_b);
+ cc.evex().vcvtsd2ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vcvtsd2usi(gpd, xmm_b);
+ cc.evex().vcvtsd2usi(gpz, xmm_b);
+ cc.evex().vcvtsi2sd(xmm_a, xmm_b, gpd);
+ cc.evex().vcvtsi2sd(xmm_a, xmm_b, gpz);
+ cc.evex().vcvtsi2ss(xmm_a, xmm_b, gpd);
+ cc.evex().vcvtsi2ss(xmm_a, xmm_b, gpz);
+ cc.evex().vcvtss2sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vcvtss2si(gpd, xmm_b);
+ cc.evex().vcvtss2si(gpz, xmm_b);
+ cc.evex().vcvtss2usi(gpd, xmm_b);
+ cc.evex().vcvtss2usi(gpz, xmm_b);
+ cc.evex().vcvttpd2dq(xmm_a, xmm_b);
+ cc.evex().vcvttpd2dq(xmm_a, ymm_b);
+ cc.evex().vcvttpd2dq(ymm_a, zmm_b);
+ cc.evex().vcvttpd2qq(xmm_a, xmm_b);
+ cc.evex().vcvttpd2qq(ymm_a, ymm_b);
+ cc.evex().vcvttpd2qq(zmm_a, zmm_b);
+ cc.evex().vcvttpd2udq(xmm_a, xmm_b);
+ cc.evex().vcvttpd2udq(xmm_a, ymm_b);
+ cc.evex().vcvttpd2udq(ymm_a, zmm_b);
+ cc.evex().vcvttpd2uqq(xmm_a, xmm_b);
+ cc.evex().vcvttpd2uqq(ymm_a, ymm_b);
+ cc.evex().vcvttpd2uqq(zmm_a, zmm_b);
+ cc.evex().vcvttps2dq(xmm_a, xmm_b);
+ cc.evex().vcvttps2dq(ymm_a, ymm_b);
+ cc.evex().vcvttps2dq(zmm_a, zmm_b);
+ cc.evex().vcvttps2qq(xmm_a, xmm_b);
+ cc.evex().vcvttps2qq(ymm_a, xmm_b);
+ cc.evex().vcvttps2qq(zmm_a, ymm_b);
+ cc.evex().vcvttps2udq(xmm_a, xmm_b);
+ cc.evex().vcvttps2udq(ymm_a, ymm_b);
+ cc.evex().vcvttps2udq(zmm_a, zmm_b);
+ cc.evex().vcvttps2uqq(xmm_a, xmm_b);
+ cc.evex().vcvttps2uqq(ymm_a, xmm_b);
+ cc.evex().vcvttps2uqq(zmm_a, ymm_b);
+ cc.evex().vcvttsd2si(gpd, xmm_b);
+ cc.evex().vcvttsd2si(gpz, xmm_b);
+ cc.evex().vcvttsd2usi(gpd, xmm_b);
+ cc.evex().vcvttsd2usi(gpz, xmm_b);
+ cc.evex().vcvttss2si(gpd, xmm_b);
+ cc.evex().vcvttss2si(gpz, xmm_b);
+ cc.evex().vcvttss2usi(gpd, xmm_b);
+ cc.evex().vcvttss2usi(gpz, xmm_b);
+ cc.evex().vcvtudq2pd(xmm_a, xmm_b);
+ cc.evex().vcvtudq2pd(ymm_a, xmm_b);
+ cc.evex().vcvtudq2pd(zmm_a, ymm_b);
+ cc.evex().vcvtudq2ps(xmm_a, xmm_b);
+ cc.evex().vcvtudq2ps(ymm_a, ymm_b);
+ cc.evex().vcvtudq2ps(zmm_a, zmm_b);
+ cc.evex().vcvtuqq2pd(xmm_a, xmm_b);
+ cc.evex().vcvtuqq2pd(ymm_a, ymm_b);
+ cc.evex().vcvtuqq2pd(zmm_a, zmm_b);
+ cc.evex().vcvtuqq2ps(xmm_a, xmm_b);
+ cc.evex().vcvtuqq2ps(xmm_a, ymm_b);
+ cc.evex().vcvtuqq2ps(ymm_a, zmm_b);
+ cc.evex().vcvtusi2sd(xmm_a, xmm_b, gpd);
+ cc.evex().vcvtusi2sd(xmm_a, xmm_b, gpz);
+ cc.evex().vcvtusi2ss(xmm_a, xmm_b, gpd);
+ cc.evex().vcvtusi2ss(xmm_a, xmm_b, gpz);
+ cc.evex().vdbpsadbw(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vdbpsadbw(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vdbpsadbw(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vdivpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vdivpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vdivpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vdivps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vdivps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vdivps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vdivsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vdivss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vexpandpd(xmm_a, xmm_b);
+ cc.evex().vexpandpd(ymm_a, ymm_b);
+ cc.evex().vexpandpd(zmm_a, zmm_b);
+ cc.evex().vexpandps(xmm_a, xmm_b);
+ cc.evex().vexpandps(ymm_a, ymm_b);
+ cc.evex().vexpandps(zmm_a, zmm_b);
+ cc.evex().vextractf32x4(xmm_a, ymm_b, 0);
+ cc.evex().vextractf32x4(xmm_a, zmm_b, 0);
+ cc.evex().vextractf32x8(ymm_a, zmm_b, 0);
+ cc.evex().vextractf64x2(xmm_a, ymm_b, 0);
+ cc.evex().vextractf64x2(xmm_a, zmm_b, 0);
+ cc.evex().vextractf64x4(ymm_a, zmm_b, 0);
+ cc.evex().vextracti32x4(xmm_a, ymm_b, 0);
+ cc.evex().vextracti32x4(xmm_a, zmm_b, 0);
+ cc.evex().vextracti32x8(ymm_a, zmm_b, 0);
+ cc.evex().vextracti64x2(xmm_a, ymm_b, 0);
+ cc.evex().vextracti64x2(xmm_a, zmm_b, 0);
+ cc.evex().vextracti64x4(ymm_a, zmm_b, 0);
+ cc.evex().vextractps(gpd, xmm_b, 0);
+ cc.evex().vfixupimmpd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vfixupimmpd(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vfixupimmpd(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vfixupimmps(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vfixupimmps(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vfixupimmps(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vfixupimmsd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vfixupimmss(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vfmadd132pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd132pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmadd132pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmadd132ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd132ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmadd132ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmadd132sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd132ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd213pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd213pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmadd213pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmadd213ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd213ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmadd213ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmadd213sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd213ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd231pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd231pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmadd231pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmadd231ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd231ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmadd231ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmadd231sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmadd231ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub132pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub132pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmaddsub132pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmaddsub132ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub132ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmaddsub132ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmaddsub213pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub213pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmaddsub213pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmaddsub213ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub213ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmaddsub213ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmaddsub231pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub231pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmaddsub231pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmaddsub231ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmaddsub231ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmaddsub231ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub132pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub132pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsub132pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub132ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub132ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsub132ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub132sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub132ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub213pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub213pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsub213pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub213ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub213ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsub213ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub213sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub213ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub231pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub231pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsub231pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub231ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub231ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsub231ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsub231sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsub231ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd132pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd132pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsubadd132pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsubadd132ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd132ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsubadd132ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsubadd213pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd213pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsubadd213pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsubadd213ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd213ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsubadd213ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsubadd231pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd231pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsubadd231pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfmsubadd231ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfmsubadd231ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfmsubadd231ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd132pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd132pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmadd132pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd132ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd132ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmadd132ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd132sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd132ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd213pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd213pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmadd213pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd213ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd213ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmadd213ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd213sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd213ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd231pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd231pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmadd231pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd231ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd231ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmadd231ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmadd231sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmadd231ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub132pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub132pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmsub132pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmsub132ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub132ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmsub132ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmsub132sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub132ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub213pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub213pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmsub213pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmsub213ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub213ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmsub213ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmsub213sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub213ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub231pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub231pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmsub231pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmsub231ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub231ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vfnmsub231ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vfnmsub231sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfnmsub231ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vfpclasspd(kA, xmm_b, 0);
+ cc.evex().vfpclasspd(kA, ymm_b, 0);
+ cc.evex().vfpclasspd(kA, zmm_b, 0);
+ cc.evex().vfpclassps(kA, xmm_b, 0);
+ cc.evex().vfpclassps(kA, ymm_b, 0);
+ cc.evex().vfpclassps(kA, zmm_b, 0);
+ cc.evex().vfpclasssd(kA, xmm_b, 0);
+ cc.evex().vfpclassss(kA, xmm_b, 0);
+ cc.evex().vgetexppd(xmm_a, xmm_b);
+ cc.evex().vgetexppd(ymm_a, ymm_b);
+ cc.evex().vgetexppd(zmm_a, zmm_b);
+ cc.evex().vgetexpps(xmm_a, xmm_b);
+ cc.evex().vgetexpps(ymm_a, ymm_b);
+ cc.evex().vgetexpps(zmm_a, zmm_b);
+ cc.evex().vgetexpsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vgetexpss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vgetmantpd(xmm_a, xmm_b, 0);
+ cc.evex().vgetmantpd(ymm_a, ymm_b, 0);
+ cc.evex().vgetmantpd(zmm_a, zmm_b, 0);
+ cc.evex().vgetmantps(xmm_a, xmm_b, 0);
+ cc.evex().vgetmantps(ymm_a, ymm_b, 0);
+ cc.evex().vgetmantps(zmm_a, zmm_b, 0);
+ cc.evex().vgetmantsd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vgetmantss(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vinsertf32x4(ymm_a, ymm_b, xmm_c, 0);
+ cc.evex().vinsertf32x4(zmm_a, zmm_b, xmm_c, 0);
+ cc.evex().vinsertf32x8(zmm_a, zmm_b, ymm_c, 0);
+ cc.evex().vinsertf64x2(ymm_a, ymm_b, xmm_c, 0);
+ cc.evex().vinsertf64x2(zmm_a, zmm_b, xmm_c, 0);
+ cc.evex().vinsertf64x4(zmm_a, zmm_b, ymm_c, 0);
+ cc.evex().vinserti32x4(ymm_a, ymm_b, xmm_c, 0);
+ cc.evex().vinserti32x4(zmm_a, zmm_b, xmm_c, 0);
+ cc.evex().vinserti32x8(zmm_a, zmm_b, ymm_c, 0);
+ cc.evex().vinserti64x2(ymm_a, ymm_b, xmm_c, 0);
+ cc.evex().vinserti64x2(zmm_a, zmm_b, xmm_c, 0);
+ cc.evex().vinserti64x4(zmm_a, zmm_b, ymm_c, 0);
+ cc.evex().vinsertps(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vmaxpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmaxpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vmaxpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vmaxps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmaxps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vmaxps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vmaxsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmaxss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vminpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vminpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vminpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vminps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vminps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vminps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vminsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vminss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmovapd(xmm_a, xmm_b);
+ cc.evex().vmovapd(xmm_a, xmm_b);
+ cc.evex().vmovapd(ymm_a, ymm_b);
+ cc.evex().vmovapd(ymm_a, ymm_b);
+ cc.evex().vmovapd(zmm_a, zmm_b);
+ cc.evex().vmovapd(zmm_a, zmm_b);
+ cc.evex().vmovaps(xmm_a, xmm_b);
+ cc.evex().vmovaps(xmm_a, xmm_b);
+ cc.evex().vmovaps(ymm_a, ymm_b);
+ cc.evex().vmovaps(ymm_a, ymm_b);
+ cc.evex().vmovaps(zmm_a, zmm_b);
+ cc.evex().vmovaps(zmm_a, zmm_b);
+ cc.evex().vmovd(gpd, xmm_b);
+ cc.evex().vmovd(xmm_a, gpd);
+ cc.evex().vmovddup(xmm_a, xmm_b);
+ cc.evex().vmovddup(ymm_a, ymm_b);
+ cc.evex().vmovddup(zmm_a, zmm_b);
+ cc.evex().vmovdqa32(xmm_a, xmm_b);
+ cc.evex().vmovdqa32(xmm_a, xmm_b);
+ cc.evex().vmovdqa32(ymm_a, ymm_b);
+ cc.evex().vmovdqa32(ymm_a, ymm_b);
+ cc.evex().vmovdqa32(zmm_a, zmm_b);
+ cc.evex().vmovdqa32(zmm_a, zmm_b);
+ cc.evex().vmovdqa64(xmm_a, xmm_b);
+ cc.evex().vmovdqa64(xmm_a, xmm_b);
+ cc.evex().vmovdqa64(ymm_a, ymm_b);
+ cc.evex().vmovdqa64(ymm_a, ymm_b);
+ cc.evex().vmovdqa64(zmm_a, zmm_b);
+ cc.evex().vmovdqa64(zmm_a, zmm_b);
+ cc.evex().vmovdqu16(xmm_a, xmm_b);
+ cc.evex().vmovdqu16(xmm_a, xmm_b);
+ cc.evex().vmovdqu16(ymm_a, ymm_b);
+ cc.evex().vmovdqu16(ymm_a, ymm_b);
+ cc.evex().vmovdqu16(zmm_a, zmm_b);
+ cc.evex().vmovdqu16(zmm_a, zmm_b);
+ cc.evex().vmovdqu32(xmm_a, xmm_b);
+ cc.evex().vmovdqu32(xmm_a, xmm_b);
+ cc.evex().vmovdqu32(ymm_a, ymm_b);
+ cc.evex().vmovdqu32(ymm_a, ymm_b);
+ cc.evex().vmovdqu32(zmm_a, zmm_b);
+ cc.evex().vmovdqu32(zmm_a, zmm_b);
+ cc.evex().vmovdqu64(xmm_a, xmm_b);
+ cc.evex().vmovdqu64(xmm_a, xmm_b);
+ cc.evex().vmovdqu64(ymm_a, ymm_b);
+ cc.evex().vmovdqu64(ymm_a, ymm_b);
+ cc.evex().vmovdqu64(zmm_a, zmm_b);
+ cc.evex().vmovdqu64(zmm_a, zmm_b);
+ cc.evex().vmovdqu8(xmm_a, xmm_b);
+ cc.evex().vmovdqu8(xmm_a, xmm_b);
+ cc.evex().vmovdqu8(ymm_a, ymm_b);
+ cc.evex().vmovdqu8(ymm_a, ymm_b);
+ cc.evex().vmovdqu8(zmm_a, zmm_b);
+ cc.evex().vmovdqu8(zmm_a, zmm_b);
+ cc.evex().vmovhlps(xmm_a, xmm_b, xmm_c);
+ if (cc.is_64bit()) cc.evex().vmovq(gpq, xmm_b);
+ if (cc.is_64bit()) cc.evex().vmovq(xmm_a, gpq);
+ cc.evex().vmovq(xmm_a, xmm_b);
+ cc.evex().vmovsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmovshdup(xmm_a, xmm_b);
+ cc.evex().vmovshdup(ymm_a, ymm_b);
+ cc.evex().vmovshdup(zmm_a, zmm_b);
+ cc.evex().vmovsldup(xmm_a, xmm_b);
+ cc.evex().vmovsldup(ymm_a, ymm_b);
+ cc.evex().vmovsldup(zmm_a, zmm_b);
+ cc.evex().vmovss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmovupd(xmm_a, xmm_b);
+ cc.evex().vmovupd(xmm_a, xmm_b);
+ cc.evex().vmovupd(ymm_a, ymm_b);
+ cc.evex().vmovupd(ymm_a, ymm_b);
+ cc.evex().vmovupd(zmm_a, zmm_b);
+ cc.evex().vmovupd(zmm_a, zmm_b);
+ cc.evex().vmovups(xmm_a, xmm_b);
+ cc.evex().vmovups(xmm_a, xmm_b);
+ cc.evex().vmovups(ymm_a, ymm_b);
+ cc.evex().vmovups(ymm_a, ymm_b);
+ cc.evex().vmovups(zmm_a, zmm_b);
+ cc.evex().vmovups(zmm_a, zmm_b);
+ cc.evex().vmulpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmulpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vmulpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vmulps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmulps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vmulps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vmulsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vmulss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vorpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vorpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vorpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vorps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vorps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vorps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpabsb(xmm_a, xmm_b);
+ cc.evex().vpabsb(ymm_a, ymm_b);
+ cc.evex().vpabsb(zmm_a, zmm_b);
+ cc.evex().vpabsd(xmm_a, xmm_b);
+ cc.evex().vpabsd(ymm_a, ymm_b);
+ cc.evex().vpabsd(zmm_a, zmm_b);
+ cc.evex().vpabsq(xmm_a, xmm_b);
+ cc.evex().vpabsq(ymm_a, ymm_b);
+ cc.evex().vpabsq(zmm_a, zmm_b);
+ cc.evex().vpabsw(xmm_a, xmm_b);
+ cc.evex().vpabsw(ymm_a, ymm_b);
+ cc.evex().vpabsw(zmm_a, zmm_b);
+ cc.evex().vpackssdw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpackssdw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpackssdw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpacksswb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpacksswb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpacksswb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpackusdw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpackusdw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpackusdw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpackuswb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpackuswb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpackuswb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddsb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddsb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddsb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddsw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddsw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddsw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddusb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddusb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddusb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddusw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddusw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddusw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpaddw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpaddw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpaddw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpalignr(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vpalignr(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vpalignr(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vpandd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpandd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpandd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpandnd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpandnd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpandnd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpandnq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpandnq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpandnq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpandq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpandq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpandq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpavgb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpavgb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpavgb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpavgw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpavgw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpavgw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpblendmb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpblendmb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpblendmb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpblendmd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpblendmd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpblendmd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpblendmq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpblendmq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpblendmq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpblendmw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpblendmw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpblendmw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpbroadcastb(xmm_a, gpd);
+ cc.evex().vpbroadcastb(xmm_a, xmm_b);
+ cc.evex().vpbroadcastb(ymm_a, gpd);
+ cc.evex().vpbroadcastb(ymm_a, xmm_b);
+ cc.evex().vpbroadcastb(zmm_a, gpd);
+ cc.evex().vpbroadcastb(zmm_a, xmm_b);
+ cc.evex().vpbroadcastd(xmm_a, gpd);
+ cc.evex().vpbroadcastd(xmm_a, xmm_b);
+ cc.evex().vpbroadcastd(ymm_a, gpd);
+ cc.evex().vpbroadcastd(ymm_a, xmm_b);
+ cc.evex().vpbroadcastd(zmm_a, gpd);
+ cc.evex().vpbroadcastd(zmm_a, xmm_b);
+ cc.evex().vpbroadcastmb2q(xmm_a, kB);
+ cc.evex().vpbroadcastmb2q(ymm_a, kB);
+ cc.evex().vpbroadcastmb2q(zmm_a, kB);
+ cc.evex().vpbroadcastmw2d(xmm_a, kB);
+ cc.evex().vpbroadcastmw2d(ymm_a, kB);
+ cc.evex().vpbroadcastmw2d(zmm_a, kB);
+ if (cc.is_64bit()) cc.evex().vpbroadcastq(xmm_a, gpq);
+ cc.evex().vpbroadcastq(xmm_a, xmm_b);
+ if (cc.is_64bit()) cc.evex().vpbroadcastq(ymm_a, gpq);
+ cc.evex().vpbroadcastq(ymm_a, xmm_b);
+ if (cc.is_64bit()) cc.evex().vpbroadcastq(zmm_a, gpq);
+ cc.evex().vpbroadcastq(zmm_a, xmm_b);
+ cc.evex().vpbroadcastw(xmm_a, gpd);
+ cc.evex().vpbroadcastw(xmm_a, xmm_b);
+ cc.evex().vpbroadcastw(ymm_a, gpd);
+ cc.evex().vpbroadcastw(ymm_a, xmm_b);
+ cc.evex().vpbroadcastw(zmm_a, gpd);
+ cc.evex().vpbroadcastw(zmm_a, xmm_b);
+ cc.evex().vpcmpb(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpb(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpb(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpd(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpd(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpd(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpeqb(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpeqb(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpeqb(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpeqd(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpeqd(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpeqd(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpeqq(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpeqq(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpeqq(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpeqw(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpeqw(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpeqw(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpgtb(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpgtb(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpgtb(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpgtd(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpgtd(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpgtd(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpgtq(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpgtq(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpgtq(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpgtw(kA, xmm_b, xmm_c);
+ cc.evex().vpcmpgtw(kA, ymm_b, ymm_c);
+ cc.evex().vpcmpgtw(kA, zmm_b, zmm_c);
+ cc.evex().vpcmpq(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpq(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpq(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpub(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpub(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpub(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpud(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpud(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpud(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpuq(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpuq(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpuq(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpuw(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpuw(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpuw(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcmpw(kA, xmm_b, xmm_c, 0);
+ cc.evex().vpcmpw(kA, ymm_b, ymm_c, 0);
+ cc.evex().vpcmpw(kA, zmm_b, zmm_c, 0);
+ cc.evex().vpcompressd(xmm_a, xmm_b);
+ cc.evex().vpcompressd(ymm_a, ymm_b);
+ cc.evex().vpcompressd(zmm_a, zmm_b);
+ cc.evex().vpcompressq(xmm_a, xmm_b);
+ cc.evex().vpcompressq(ymm_a, ymm_b);
+ cc.evex().vpcompressq(zmm_a, zmm_b);
+ cc.evex().vpconflictd(xmm_a, xmm_b);
+ cc.evex().vpconflictd(ymm_a, ymm_b);
+ cc.evex().vpconflictd(zmm_a, zmm_b);
+ cc.evex().vpconflictq(xmm_a, xmm_b);
+ cc.evex().vpconflictq(ymm_a, ymm_b);
+ cc.evex().vpconflictq(zmm_a, zmm_b);
+ cc.evex().vpermb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermi2b(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermi2b(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermi2b(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermi2d(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermi2d(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermi2d(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermi2pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermi2pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermi2pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermi2ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermi2ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermi2ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermi2q(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermi2q(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermi2q(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermi2w(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermi2w(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermi2w(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermilpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermilpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermilpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermilpd(xmm_a, xmm_b, 0);
+ cc.evex().vpermilpd(ymm_a, ymm_b, 0);
+ cc.evex().vpermilpd(zmm_a, zmm_b, 0);
+ cc.evex().vpermilps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermilps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermilps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermilps(xmm_a, xmm_b, 0);
+ cc.evex().vpermilps(ymm_a, ymm_b, 0);
+ cc.evex().vpermilps(zmm_a, zmm_b, 0);
+ cc.evex().vpermq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermq(ymm_a, ymm_b, 0);
+ cc.evex().vpermq(zmm_a, zmm_b, 0);
+ cc.evex().vpermt2b(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermt2b(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermt2b(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermt2d(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermt2d(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermt2d(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermt2pd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermt2pd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermt2pd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermt2ps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermt2ps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermt2ps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermt2q(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermt2q(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermt2q(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermt2w(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermt2w(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermt2w(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpermw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpermw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpermw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpexpandd(xmm_a, xmm_b);
+ cc.evex().vpexpandd(ymm_a, ymm_b);
+ cc.evex().vpexpandd(zmm_a, zmm_b);
+ cc.evex().vpexpandq(xmm_a, xmm_b);
+ cc.evex().vpexpandq(ymm_a, ymm_b);
+ cc.evex().vpexpandq(zmm_a, zmm_b);
+ cc.evex().vpextrb(gpd, xmm_b, 0);
+ cc.evex().vpextrd(gpd, xmm_b, 0);
+ if (cc.is_64bit()) cc.evex().vpextrq(gpq, xmm_b, 0);
+ cc.evex().vpextrw(gpd, xmm_b, 0);
+ cc.evex().vpinsrb(xmm_a, xmm_b, gpd, 0);
+ cc.evex().vpinsrd(xmm_a, xmm_b, gpd, 0);
+ if (cc.is_64bit()) cc.evex().vpinsrq(xmm_a, xmm_b, gpq, 0);
+ cc.evex().vpinsrw(xmm_a, xmm_b, gpd, 0);
+ cc.evex().vplzcntd(xmm_a, xmm_b);
+ cc.evex().vplzcntd(ymm_a, ymm_b);
+ cc.evex().vplzcntd(zmm_a, zmm_b);
+ cc.evex().vplzcntq(xmm_a, xmm_b);
+ cc.evex().vplzcntq(ymm_a, ymm_b);
+ cc.evex().vplzcntq(zmm_a, zmm_b);
+ cc.evex().vpmadd52huq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmadd52huq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmadd52huq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmadd52luq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmadd52luq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmadd52luq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaddubsw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaddubsw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaddubsw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaddwd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaddwd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaddwd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxsb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxsb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxsb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxsd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxsd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxsq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxsq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxsq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxsw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxsw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxsw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxub(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxub(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxub(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxud(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxud(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxud(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxuq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxuq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxuq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmaxuw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmaxuw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmaxuw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminsb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminsb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminsb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminsd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminsd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminsq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminsq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminsq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminsw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminsw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminsw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminub(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminub(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminub(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminud(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminud(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminud(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminuq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminuq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminuq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpminuw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpminuw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpminuw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmovb2m(kA, xmm_b);
+ cc.evex().vpmovb2m(kA, ymm_b);
+ cc.evex().vpmovb2m(kA, zmm_b);
+ cc.evex().vpmovd2m(kA, xmm_b);
+ cc.evex().vpmovd2m(kA, ymm_b);
+ cc.evex().vpmovd2m(kA, zmm_b);
+ cc.evex().vpmovdb(xmm_a, xmm_b);
+ cc.evex().vpmovdb(xmm_a, ymm_b);
+ cc.evex().vpmovdb(xmm_a, zmm_b);
+ cc.evex().vpmovdw(xmm_a, xmm_b);
+ cc.evex().vpmovdw(xmm_a, ymm_b);
+ cc.evex().vpmovdw(ymm_a, zmm_b);
+ cc.evex().vpmovm2b(xmm_a, kB);
+ cc.evex().vpmovm2b(ymm_a, kB);
+ cc.evex().vpmovm2b(zmm_a, kB);
+ cc.evex().vpmovm2d(xmm_a, kB);
+ cc.evex().vpmovm2d(ymm_a, kB);
+ cc.evex().vpmovm2d(zmm_a, kB);
+ cc.evex().vpmovm2q(xmm_a, kB);
+ cc.evex().vpmovm2q(ymm_a, kB);
+ cc.evex().vpmovm2q(zmm_a, kB);
+ cc.evex().vpmovm2w(xmm_a, kB);
+ cc.evex().vpmovm2w(ymm_a, kB);
+ cc.evex().vpmovm2w(zmm_a, kB);
+ cc.evex().vpmovq2m(kA, xmm_b);
+ cc.evex().vpmovq2m(kA, ymm_b);
+ cc.evex().vpmovq2m(kA, zmm_b);
+ cc.evex().vpmovqb(xmm_a, xmm_b);
+ cc.evex().vpmovqb(xmm_a, ymm_b);
+ cc.evex().vpmovqb(xmm_a, zmm_b);
+ cc.evex().vpmovqd(xmm_a, xmm_b);
+ cc.evex().vpmovqd(xmm_a, ymm_b);
+ cc.evex().vpmovqd(ymm_a, zmm_b);
+ cc.evex().vpmovqw(xmm_a, xmm_b);
+ cc.evex().vpmovqw(xmm_a, ymm_b);
+ cc.evex().vpmovqw(xmm_a, zmm_b);
+ cc.evex().vpmovsdb(xmm_a, xmm_b);
+ cc.evex().vpmovsdb(xmm_a, ymm_b);
+ cc.evex().vpmovsdb(xmm_a, zmm_b);
+ cc.evex().vpmovsdw(xmm_a, xmm_b);
+ cc.evex().vpmovsdw(xmm_a, ymm_b);
+ cc.evex().vpmovsdw(ymm_a, zmm_b);
+ cc.evex().vpmovsqb(xmm_a, xmm_b);
+ cc.evex().vpmovsqb(xmm_a, ymm_b);
+ cc.evex().vpmovsqb(xmm_a, zmm_b);
+ cc.evex().vpmovsqd(xmm_a, xmm_b);
+ cc.evex().vpmovsqd(xmm_a, ymm_b);
+ cc.evex().vpmovsqd(ymm_a, zmm_b);
+ cc.evex().vpmovsqw(xmm_a, xmm_b);
+ cc.evex().vpmovsqw(xmm_a, ymm_b);
+ cc.evex().vpmovsqw(xmm_a, zmm_b);
+ cc.evex().vpmovswb(xmm_a, xmm_b);
+ cc.evex().vpmovswb(xmm_a, ymm_b);
+ cc.evex().vpmovswb(ymm_a, zmm_b);
+ cc.evex().vpmovsxbd(xmm_a, xmm_b);
+ cc.evex().vpmovsxbd(ymm_a, xmm_b);
+ cc.evex().vpmovsxbd(zmm_a, xmm_b);
+ cc.evex().vpmovsxbq(xmm_a, xmm_b);
+ cc.evex().vpmovsxbq(ymm_a, xmm_b);
+ cc.evex().vpmovsxbq(zmm_a, xmm_b);
+ cc.evex().vpmovsxbw(xmm_a, xmm_b);
+ cc.evex().vpmovsxbw(ymm_a, xmm_b);
+ cc.evex().vpmovsxbw(zmm_a, ymm_b);
+ cc.evex().vpmovsxdq(xmm_a, xmm_b);
+ cc.evex().vpmovsxdq(ymm_a, xmm_b);
+ cc.evex().vpmovsxdq(zmm_a, ymm_b);
+ cc.evex().vpmovsxwd(xmm_a, xmm_b);
+ cc.evex().vpmovsxwd(ymm_a, xmm_b);
+ cc.evex().vpmovsxwd(zmm_a, ymm_b);
+ cc.evex().vpmovsxwq(xmm_a, xmm_b);
+ cc.evex().vpmovsxwq(ymm_a, xmm_b);
+ cc.evex().vpmovsxwq(zmm_a, xmm_b);
+ cc.evex().vpmovusdb(xmm_a, xmm_b);
+ cc.evex().vpmovusdb(xmm_a, ymm_b);
+ cc.evex().vpmovusdb(xmm_a, zmm_b);
+ cc.evex().vpmovusdw(xmm_a, xmm_b);
+ cc.evex().vpmovusdw(xmm_a, ymm_b);
+ cc.evex().vpmovusdw(ymm_a, zmm_b);
+ cc.evex().vpmovusqb(xmm_a, xmm_b);
+ cc.evex().vpmovusqb(xmm_a, ymm_b);
+ cc.evex().vpmovusqb(xmm_a, zmm_b);
+ cc.evex().vpmovusqd(xmm_a, xmm_b);
+ cc.evex().vpmovusqd(xmm_a, ymm_b);
+ cc.evex().vpmovusqd(ymm_a, zmm_b);
+ cc.evex().vpmovusqw(xmm_a, xmm_b);
+ cc.evex().vpmovusqw(xmm_a, ymm_b);
+ cc.evex().vpmovusqw(xmm_a, zmm_b);
+ cc.evex().vpmovuswb(xmm_a, xmm_b);
+ cc.evex().vpmovuswb(xmm_a, ymm_b);
+ cc.evex().vpmovuswb(ymm_a, zmm_b);
+ cc.evex().vpmovw2m(kA, xmm_b);
+ cc.evex().vpmovw2m(kA, ymm_b);
+ cc.evex().vpmovw2m(kA, zmm_b);
+ cc.evex().vpmovwb(xmm_a, xmm_b);
+ cc.evex().vpmovwb(xmm_a, ymm_b);
+ cc.evex().vpmovwb(ymm_a, zmm_b);
+ cc.evex().vpmovzxbd(xmm_a, xmm_b);
+ cc.evex().vpmovzxbd(ymm_a, xmm_b);
+ cc.evex().vpmovzxbd(zmm_a, xmm_b);
+ cc.evex().vpmovzxbq(xmm_a, xmm_b);
+ cc.evex().vpmovzxbq(ymm_a, xmm_b);
+ cc.evex().vpmovzxbq(zmm_a, xmm_b);
+ cc.evex().vpmovzxbw(xmm_a, xmm_b);
+ cc.evex().vpmovzxbw(ymm_a, xmm_b);
+ cc.evex().vpmovzxbw(zmm_a, ymm_b);
+ cc.evex().vpmovzxdq(xmm_a, xmm_b);
+ cc.evex().vpmovzxdq(ymm_a, xmm_b);
+ cc.evex().vpmovzxdq(zmm_a, ymm_b);
+ cc.evex().vpmovzxwd(xmm_a, xmm_b);
+ cc.evex().vpmovzxwd(ymm_a, xmm_b);
+ cc.evex().vpmovzxwd(zmm_a, ymm_b);
+ cc.evex().vpmovzxwq(xmm_a, xmm_b);
+ cc.evex().vpmovzxwq(ymm_a, xmm_b);
+ cc.evex().vpmovzxwq(zmm_a, xmm_b);
+ cc.evex().vpmuldq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmuldq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmuldq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmulhrsw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmulhrsw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmulhrsw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmulhuw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmulhuw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmulhuw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmulhw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmulhw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmulhw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmulld(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmulld(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmulld(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmullq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmullq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmullq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmullw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmullw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmullw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmultishiftqb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmultishiftqb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmultishiftqb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpmuludq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpmuludq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpmuludq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpopcntd(zmm_a, zmm_b);
+ cc.evex().vpopcntq(zmm_a, zmm_b);
+ cc.evex().vpord(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpord(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpord(zmm_a, zmm_b, zmm_c);
+ cc.evex().vporq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vporq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vporq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vprold(xmm_a, xmm_b, 0);
+ cc.evex().vprold(ymm_a, ymm_b, 0);
+ cc.evex().vprold(zmm_a, zmm_b, 0);
+ cc.evex().vprolq(xmm_a, xmm_b, 0);
+ cc.evex().vprolq(ymm_a, ymm_b, 0);
+ cc.evex().vprolq(zmm_a, zmm_b, 0);
+ cc.evex().vprolvd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vprolvd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vprolvd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vprolvq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vprolvq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vprolvq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vprord(xmm_a, xmm_b, 0);
+ cc.evex().vprord(ymm_a, ymm_b, 0);
+ cc.evex().vprord(zmm_a, zmm_b, 0);
+ cc.evex().vprorq(xmm_a, xmm_b, 0);
+ cc.evex().vprorq(ymm_a, ymm_b, 0);
+ cc.evex().vprorq(zmm_a, zmm_b, 0);
+ cc.evex().vprorvd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vprorvd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vprorvd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vprorvq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vprorvq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vprorvq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsadbw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsadbw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsadbw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpshufb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpshufb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpshufb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpshufd(xmm_a, xmm_b, 0);
+ cc.evex().vpshufd(ymm_a, ymm_b, 0);
+ cc.evex().vpshufd(zmm_a, zmm_b, 0);
+ cc.evex().vpshufhw(xmm_a, xmm_b, 0);
+ cc.evex().vpshufhw(ymm_a, ymm_b, 0);
+ cc.evex().vpshufhw(zmm_a, zmm_b, 0);
+ cc.evex().vpshuflw(xmm_a, xmm_b, 0);
+ cc.evex().vpshuflw(ymm_a, ymm_b, 0);
+ cc.evex().vpshuflw(zmm_a, zmm_b, 0);
+ cc.evex().vpslld(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpslld(xmm_a, xmm_b, 0);
+ cc.evex().vpslld(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpslld(ymm_a, ymm_b, 0);
+ cc.evex().vpslld(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpslld(zmm_a, zmm_b, 0);
+ cc.evex().vpslldq(xmm_a, xmm_b, 0);
+ cc.evex().vpslldq(ymm_a, ymm_b, 0);
+ cc.evex().vpslldq(zmm_a, zmm_b, 0);
+ cc.evex().vpsllq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsllq(xmm_a, xmm_b, 0);
+ cc.evex().vpsllq(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsllq(ymm_a, ymm_b, 0);
+ cc.evex().vpsllq(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsllq(zmm_a, zmm_b, 0);
+ cc.evex().vpsllvd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsllvd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsllvd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsllvq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsllvq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsllvq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsllvw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsllvw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsllvw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsllw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsllw(xmm_a, xmm_b, 0);
+ cc.evex().vpsllw(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsllw(ymm_a, ymm_b, 0);
+ cc.evex().vpsllw(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsllw(zmm_a, zmm_b, 0);
+ cc.evex().vpsrad(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrad(xmm_a, xmm_b, 0);
+ cc.evex().vpsrad(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsrad(ymm_a, ymm_b, 0);
+ cc.evex().vpsrad(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsrad(zmm_a, zmm_b, 0);
+ cc.evex().vpsraq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsraq(xmm_a, xmm_b, 0);
+ cc.evex().vpsraq(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsraq(ymm_a, ymm_b, 0);
+ cc.evex().vpsraq(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsraq(zmm_a, zmm_b, 0);
+ cc.evex().vpsravd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsravd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsravd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsravq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsravq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsravq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsravw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsravw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsravw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsraw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsraw(xmm_a, xmm_b, 0);
+ cc.evex().vpsraw(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsraw(ymm_a, ymm_b, 0);
+ cc.evex().vpsraw(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsraw(zmm_a, zmm_b, 0);
+ cc.evex().vpsrld(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrld(xmm_a, xmm_b, 0);
+ cc.evex().vpsrld(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsrld(ymm_a, ymm_b, 0);
+ cc.evex().vpsrld(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsrld(zmm_a, zmm_b, 0);
+ cc.evex().vpsrldq(xmm_a, xmm_b, 0);
+ cc.evex().vpsrldq(ymm_a, ymm_b, 0);
+ cc.evex().vpsrldq(zmm_a, zmm_b, 0);
+ cc.evex().vpsrlq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrlq(xmm_a, xmm_b, 0);
+ cc.evex().vpsrlq(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsrlq(ymm_a, ymm_b, 0);
+ cc.evex().vpsrlq(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsrlq(zmm_a, zmm_b, 0);
+ cc.evex().vpsrlvd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrlvd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsrlvd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsrlvq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrlvq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsrlvq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsrlvw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrlvw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsrlvw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsrlw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsrlw(xmm_a, xmm_b, 0);
+ cc.evex().vpsrlw(ymm_a, ymm_b, xmm_c);
+ cc.evex().vpsrlw(ymm_a, ymm_b, 0);
+ cc.evex().vpsrlw(zmm_a, zmm_b, xmm_c);
+ cc.evex().vpsrlw(zmm_a, zmm_b, 0);
+ cc.evex().vpsubb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubsb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubsb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubsb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubsw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubsw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubsw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubusb(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubusb(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubusb(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubusw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubusw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubusw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpsubw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpsubw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpsubw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpternlogd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vpternlogd(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vpternlogd(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vpternlogq(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vpternlogq(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vpternlogq(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vptestmb(kA, xmm_b, xmm_c);
+ cc.evex().vptestmb(kA, ymm_b, ymm_c);
+ cc.evex().vptestmb(kA, zmm_b, zmm_c);
+ cc.evex().vptestmd(kA, xmm_b, xmm_c);
+ cc.evex().vptestmd(kA, ymm_b, ymm_c);
+ cc.evex().vptestmd(kA, zmm_b, zmm_c);
+ cc.evex().vptestmq(kA, xmm_b, xmm_c);
+ cc.evex().vptestmq(kA, ymm_b, ymm_c);
+ cc.evex().vptestmq(kA, zmm_b, zmm_c);
+ cc.evex().vptestmw(kA, xmm_b, xmm_c);
+ cc.evex().vptestmw(kA, ymm_b, ymm_c);
+ cc.evex().vptestmw(kA, zmm_b, zmm_c);
+ cc.evex().vptestnmb(kA, xmm_b, xmm_c);
+ cc.evex().vptestnmb(kA, ymm_b, ymm_c);
+ cc.evex().vptestnmb(kA, zmm_b, zmm_c);
+ cc.evex().vptestnmd(kA, xmm_b, xmm_c);
+ cc.evex().vptestnmd(kA, ymm_b, ymm_c);
+ cc.evex().vptestnmd(kA, zmm_b, zmm_c);
+ cc.evex().vptestnmq(kA, xmm_b, xmm_c);
+ cc.evex().vptestnmq(kA, ymm_b, ymm_c);
+ cc.evex().vptestnmq(kA, zmm_b, zmm_c);
+ cc.evex().vptestnmw(kA, xmm_b, xmm_c);
+ cc.evex().vptestnmw(kA, ymm_b, ymm_c);
+ cc.evex().vptestnmw(kA, zmm_b, zmm_c);
+ cc.evex().vpunpckhbw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpckhbw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpckhbw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpckhdq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpckhdq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpckhdq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpckhqdq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpckhqdq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpckhqdq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpckhwd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpckhwd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpckhwd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpcklbw(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpcklbw(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpcklbw(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpckldq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpckldq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpckldq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpcklqdq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpcklqdq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpcklqdq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpunpcklwd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpunpcklwd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpunpcklwd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpxord(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpxord(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpxord(zmm_a, zmm_b, zmm_c);
+ cc.evex().vpxorq(xmm_a, xmm_b, xmm_c);
+ cc.evex().vpxorq(ymm_a, ymm_b, ymm_c);
+ cc.evex().vpxorq(zmm_a, zmm_b, zmm_c);
+ cc.evex().vrangepd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrangepd(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vrangepd(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vrangeps(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrangeps(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vrangeps(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vrangesd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrangess(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrcp14pd(xmm_a, xmm_b);
+ cc.evex().vrcp14pd(ymm_a, ymm_b);
+ cc.evex().vrcp14pd(zmm_a, zmm_b);
+ cc.evex().vrcp14ps(xmm_a, xmm_b);
+ cc.evex().vrcp14ps(ymm_a, ymm_b);
+ cc.evex().vrcp14ps(zmm_a, zmm_b);
+ cc.evex().vrcp14sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vrcp14ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vreducepd(xmm_a, xmm_b, 0);
+ cc.evex().vreducepd(ymm_a, ymm_b, 0);
+ cc.evex().vreducepd(zmm_a, zmm_b, 0);
+ cc.evex().vreduceps(xmm_a, xmm_b, 0);
+ cc.evex().vreduceps(ymm_a, ymm_b, 0);
+ cc.evex().vreduceps(zmm_a, zmm_b, 0);
+ cc.evex().vreducesd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vreducess(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrndscalepd(xmm_a, xmm_b, 0);
+ cc.evex().vrndscalepd(ymm_a, ymm_b, 0);
+ cc.evex().vrndscalepd(zmm_a, zmm_b, 0);
+ cc.evex().vrndscaleps(xmm_a, xmm_b, 0);
+ cc.evex().vrndscaleps(ymm_a, ymm_b, 0);
+ cc.evex().vrndscaleps(zmm_a, zmm_b, 0);
+ cc.evex().vrndscalesd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrndscaless(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vrsqrt14pd(xmm_a, xmm_b);
+ cc.evex().vrsqrt14pd(ymm_a, ymm_b);
+ cc.evex().vrsqrt14pd(zmm_a, zmm_b);
+ cc.evex().vrsqrt14ps(xmm_a, xmm_b);
+ cc.evex().vrsqrt14ps(ymm_a, ymm_b);
+ cc.evex().vrsqrt14ps(zmm_a, zmm_b);
+ cc.evex().vrsqrt14sd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vrsqrt14ss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vscalefpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vscalefpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vscalefpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vscalefps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vscalefps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vscalefps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vscalefsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vscalefss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vshuff32x4(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vshuff32x4(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vshuff64x2(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vshuff64x2(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vshufi32x4(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vshufi32x4(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vshufi64x2(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vshufi64x2(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vshufpd(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vshufpd(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vshufpd(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vshufps(xmm_a, xmm_b, xmm_c, 0);
+ cc.evex().vshufps(ymm_a, ymm_b, ymm_c, 0);
+ cc.evex().vshufps(zmm_a, zmm_b, zmm_c, 0);
+ cc.evex().vsqrtpd(xmm_a, xmm_b);
+ cc.evex().vsqrtpd(ymm_a, ymm_b);
+ cc.evex().vsqrtpd(zmm_a, zmm_b);
+ cc.evex().vsqrtps(xmm_a, xmm_b);
+ cc.evex().vsqrtps(ymm_a, ymm_b);
+ cc.evex().vsqrtps(zmm_a, zmm_b);
+ cc.evex().vsqrtsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vsqrtss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vsubpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vsubpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vsubpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vsubps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vsubps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vsubps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vsubsd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vsubss(xmm_a, xmm_b, xmm_c);
+ cc.evex().vucomisd(xmm_a, xmm_b);
+ cc.evex().vucomiss(xmm_a, xmm_b);
+ cc.evex().vunpckhpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vunpckhpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vunpckhpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vunpckhps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vunpckhps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vunpckhps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vunpcklpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vunpcklpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vunpcklpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vunpcklps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vunpcklps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vunpcklps(zmm_a, zmm_b, zmm_c);
+ cc.evex().vxorpd(xmm_a, xmm_b, xmm_c);
+ cc.evex().vxorpd(ymm_a, ymm_b, ymm_c);
+ cc.evex().vxorpd(zmm_a, zmm_b, zmm_c);
+ cc.evex().vxorps(xmm_a, xmm_b, xmm_c);
+ cc.evex().vxorps(ymm_a, ymm_b, ymm_c);
+ cc.evex().vxorps(zmm_a, zmm_b, zmm_c);
+}
+
+template<typename Emitter>
+static void generate_avx512_sequence_internal_reg_mem(
+ Emitter& cc,
+ const x86::Gp& gp,
+ const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
+ const x86::Vec& vec_a, const x86::Vec& vec_b, const x86::Vec& vec_c, const x86::Vec& vec_d) {
+
+ Support::maybe_unused(kC);
+
+ x86::Gp gpd = gp.r32();
+ x86::Gp gpq = gp.r64();
+ x86::Gp gpz = cc.is_32bit() ? gpd : gpq;
+
+ x86::Vec xmm_a = vec_a.xmm();
+ x86::Vec xmm_b = vec_b.xmm();
+ x86::Vec xmm_c = vec_c.xmm();
+ x86::Vec xmm_d = vec_d.xmm();
+
+ x86::Vec ymm_a = vec_a.ymm();
+ x86::Vec ymm_b = vec_b.ymm();
+ x86::Vec ymm_d = vec_d.ymm();
+
+ x86::Vec zmm_a = vec_a.zmm();
+ x86::Vec zmm_b = vec_b.zmm();
+ x86::Vec zmm_d = vec_d.zmm();
+
+ x86::Mem m = x86::ptr(gpz);
+ x86::Mem m32 = x86::dword_ptr(gpz);
+ x86::Mem m64 = x86::qword_ptr(gpz);
+ x86::Mem m128 = x86::xmmword_ptr(gpz);
+ x86::Mem m256 = x86::ymmword_ptr(gpz);
+ x86::Mem m512 = x86::zmmword_ptr(gpz);
+ x86::Mem vx_ptr = x86::ptr(gpz, xmm_d);
+ x86::Mem vy_ptr = x86::ptr(gpz, ymm_d);
+ x86::Mem vz_ptr = x86::ptr(gpz, zmm_d);
+
+ cc.xor_(gpd, gpd);
+ cc.vxorps(xmm_a, xmm_a, xmm_a);
+ cc.vxorps(xmm_b, xmm_b, xmm_b);
+ cc.vxorps(xmm_c, xmm_c, xmm_c);
+ cc.vxorps(xmm_d, xmm_d, xmm_d);
+
+ cc.kmovb(kA, m);
+ cc.kmovb(m, kB);
+ cc.kmovd(kA, m);
+ cc.kmovd(m, kB);
+ cc.kmovq(kA, m);
+ cc.kmovq(m, kB);
+ cc.kmovw(kA, m);
+ cc.kmovw(m, kB);
+
+ cc.evex().vaddpd(xmm_a, xmm_b, m);
+ cc.evex().vaddpd(ymm_a, ymm_b, m);
+ cc.evex().vaddpd(zmm_a, zmm_b, m);
+ cc.evex().vaddps(xmm_a, xmm_b, m);
+ cc.evex().vaddps(ymm_a, ymm_b, m);
+ cc.evex().vaddps(zmm_a, zmm_b, m);
+ cc.evex().vaddsd(xmm_a, xmm_b, m);
+ cc.evex().vaddss(xmm_a, xmm_b, m);
+ cc.evex().valignd(xmm_a, xmm_b, m, 0);
+ cc.evex().valignd(ymm_a, ymm_b, m, 0);
+ cc.evex().valignd(zmm_a, zmm_b, m, 0);
+ cc.evex().valignq(xmm_a, xmm_b, m, 0);
+ cc.evex().valignq(ymm_a, ymm_b, m, 0);
+ cc.evex().valignq(zmm_a, zmm_b, m, 0);
+ cc.evex().vandnpd(xmm_a, xmm_b, m);
+ cc.evex().vandnpd(ymm_a, ymm_b, m);
+ cc.evex().vandnpd(zmm_a, zmm_b, m);
+ cc.evex().vandnps(xmm_a, xmm_b, m);
+ cc.evex().vandnps(ymm_a, ymm_b, m);
+ cc.evex().vandnps(zmm_a, zmm_b, m);
+ cc.evex().vandpd(xmm_a, xmm_b, m);
+ cc.evex().vandpd(ymm_a, ymm_b, m);
+ cc.evex().vandpd(zmm_a, zmm_b, m);
+ cc.evex().vandps(xmm_a, xmm_b, m);
+ cc.evex().vandps(ymm_a, ymm_b, m);
+ cc.evex().vandps(zmm_a, zmm_b, m);
+ cc.evex().vblendmpd(xmm_a, xmm_b, m);
+ cc.evex().vblendmpd(ymm_a, ymm_b, m);
+ cc.evex().vblendmpd(zmm_a, zmm_b, m);
+ cc.evex().vblendmps(xmm_a, xmm_b, m);
+ cc.evex().vblendmps(ymm_a, ymm_b, m);
+ cc.evex().vblendmps(zmm_a, zmm_b, m);
+ cc.evex().vbroadcastf32x2(ymm_a, m);
+ cc.evex().vbroadcastf32x2(zmm_a, m);
+ cc.evex().vbroadcastf32x4(ymm_a, m);
+ cc.evex().vbroadcastf32x4(zmm_a, m);
+ cc.evex().vbroadcastf32x8(zmm_a, m);
+ cc.evex().vbroadcastf64x2(ymm_a, m);
+ cc.evex().vbroadcastf64x2(zmm_a, m);
+ cc.evex().vbroadcastf64x4(zmm_a, m);
+ cc.evex().vbroadcasti32x2(xmm_a, m);
+ cc.evex().vbroadcasti32x2(ymm_a, m);
+ cc.evex().vbroadcasti32x2(zmm_a, m);
+ cc.evex().vbroadcasti32x4(ymm_a, m);
+ cc.evex().vbroadcasti32x4(zmm_a, m);
+ cc.evex().vbroadcasti32x8(zmm_a, m);
+ cc.evex().vbroadcasti64x2(ymm_a, m);
+ cc.evex().vbroadcasti64x2(zmm_a, m);
+ cc.evex().vbroadcasti64x4(zmm_a, m);
+ cc.evex().vbroadcastsd(ymm_a, m);
+ cc.evex().vbroadcastsd(zmm_a, m);
+ cc.evex().vbroadcastss(xmm_a, m);
+ cc.evex().vbroadcastss(ymm_a, m);
+ cc.evex().vbroadcastss(zmm_a, m);
+ cc.evex().vcmppd(kA, xmm_b, m, 0);
+ cc.evex().vcmppd(kA, ymm_b, m, 0);
+ cc.evex().vcmppd(kA, zmm_b, m, 0);
+ cc.evex().vcmpps(kA, xmm_b, m, 0);
+ cc.evex().vcmpps(kA, ymm_b, m, 0);
+ cc.evex().vcmpps(kA, zmm_b, m, 0);
+ cc.evex().vcmpsd(kA, xmm_b, m, 0);
+ cc.evex().vcmpss(kA, xmm_b, m, 0);
+ cc.evex().vcomisd(xmm_a, m);
+ cc.evex().vcomiss(xmm_a, m);
+ cc.evex().vcompresspd(m, xmm_b);
+ cc.evex().vcompresspd(m, ymm_b);
+ cc.evex().vcompresspd(m, zmm_b);
+ cc.evex().vcompressps(m, xmm_b);
+ cc.evex().vcompressps(m, ymm_b);
+ cc.evex().vcompressps(m, zmm_b);
+ cc.evex().vcvtdq2pd(xmm_a, m);
+ cc.evex().vcvtdq2pd(ymm_a, m);
+ cc.evex().vcvtdq2pd(zmm_a, m);
+ cc.evex().vcvtdq2ps(xmm_a, m);
+ cc.evex().vcvtdq2ps(ymm_a, m);
+ cc.evex().vcvtdq2ps(zmm_a, m);
+ cc.evex().vcvtpd2dq(xmm_a, m128);
+ cc.evex().vcvtpd2dq(xmm_a, m256);
+ cc.evex().vcvtpd2dq(ymm_a, m512);
+ cc.evex().vcvtpd2qq(xmm_a, m);
+ cc.evex().vcvtpd2qq(ymm_a, m);
+ cc.evex().vcvtpd2qq(zmm_a, m);
+ cc.evex().vcvtpd2udq(xmm_a, m128);
+ cc.evex().vcvtpd2udq(xmm_a, m256);
+ cc.evex().vcvtpd2udq(ymm_a, m512);
+ cc.evex().vcvtpd2uqq(xmm_a, m);
+ cc.evex().vcvtpd2uqq(ymm_a, m);
+ cc.evex().vcvtpd2uqq(zmm_a, m);
+ cc.evex().vcvtph2ps(xmm_a, m);
+ cc.evex().vcvtph2ps(ymm_a, m);
+ cc.evex().vcvtph2ps(zmm_a, m);
+ cc.evex().vcvtps2dq(xmm_a, m);
+ cc.evex().vcvtps2dq(ymm_a, m);
+ cc.evex().vcvtps2dq(zmm_a, m);
+ cc.evex().vcvtps2pd(xmm_a, m);
+ cc.evex().vcvtps2pd(ymm_a, m);
+ cc.evex().vcvtps2pd(zmm_a, m);
+ cc.evex().vcvtps2ph(m, xmm_b, 0);
+ cc.evex().vcvtps2ph(m, ymm_b, 0);
+ cc.evex().vcvtps2ph(m, zmm_b, 0);
+ cc.evex().vcvtps2qq(xmm_a, m);
+ cc.evex().vcvtps2qq(ymm_a, m);
+ cc.evex().vcvtps2qq(zmm_a, m);
+ cc.evex().vcvtps2udq(xmm_a, m);
+ cc.evex().vcvtps2udq(ymm_a, m);
+ cc.evex().vcvtps2udq(zmm_a, m);
+ cc.evex().vcvtps2uqq(xmm_a, m);
+ cc.evex().vcvtps2uqq(ymm_a, m);
+ cc.evex().vcvtps2uqq(zmm_a, m);
+ cc.evex().vcvtqq2pd(xmm_a, m);
+ cc.evex().vcvtqq2pd(ymm_a, m);
+ cc.evex().vcvtqq2pd(zmm_a, m);
+ cc.evex().vcvtqq2ps(xmm_a, m128);
+ cc.evex().vcvtqq2ps(xmm_a, m256);
+ cc.evex().vcvtqq2ps(ymm_a, m512);
+ cc.evex().vcvtsd2si(gpd, m);
+ cc.evex().vcvtsd2si(gpz, m);
+ cc.evex().vcvtsd2ss(xmm_a, xmm_b, m);
+ cc.evex().vcvtsd2usi(gpd, m);
+ cc.evex().vcvtsd2usi(gpz, m);
+ cc.evex().vcvtsi2sd(xmm_a, xmm_b, m32);
+ if (cc.is_64bit()) cc.evex().vcvtsi2sd(xmm_a, xmm_b, m64);
+ cc.evex().vcvtsi2ss(xmm_a, xmm_b, m32);
+ if (cc.is_64bit()) cc.evex().vcvtsi2ss(xmm_a, xmm_b, m64);
+ cc.evex().vcvtss2sd(xmm_a, xmm_b, m);
+ cc.evex().vcvtss2si(gpd, m);
+ cc.evex().vcvtss2si(gpz, m);
+ cc.evex().vcvtss2usi(gpd, m);
+ cc.evex().vcvtss2usi(gpz, m);
+ cc.evex().vcvttpd2dq(xmm_a, m128);
+ cc.evex().vcvttpd2dq(xmm_a, m256);
+ cc.evex().vcvttpd2dq(ymm_a, m512);
+ cc.evex().vcvttpd2qq(xmm_a, m);
+ cc.evex().vcvttpd2qq(ymm_a, m);
+ cc.evex().vcvttpd2qq(zmm_a, m);
+ cc.evex().vcvttpd2udq(xmm_a, m128);
+ cc.evex().vcvttpd2udq(xmm_a, m256);
+ cc.evex().vcvttpd2udq(ymm_a, m512);
+ cc.evex().vcvttpd2uqq(xmm_a, m);
+ cc.evex().vcvttpd2uqq(ymm_a, m);
+ cc.evex().vcvttpd2uqq(zmm_a, m);
+ cc.evex().vcvttps2dq(xmm_a, m);
+ cc.evex().vcvttps2dq(ymm_a, m);
+ cc.evex().vcvttps2dq(zmm_a, m);
+ cc.evex().vcvttps2qq(xmm_a, m);
+ cc.evex().vcvttps2qq(ymm_a, m);
+ cc.evex().vcvttps2qq(zmm_a, m);
+ cc.evex().vcvttps2udq(xmm_a, m);
+ cc.evex().vcvttps2udq(ymm_a, m);
+ cc.evex().vcvttps2udq(zmm_a, m);
+ cc.evex().vcvttps2uqq(xmm_a, m);
+ cc.evex().vcvttps2uqq(ymm_a, m);
+ cc.evex().vcvttps2uqq(zmm_a, m);
+ cc.evex().vcvttsd2si(gpd, m);
+ cc.evex().vcvttsd2si(gpz, m);
+ cc.evex().vcvttsd2usi(gpd, m);
+ cc.evex().vcvttsd2usi(gpz, m);
+ cc.evex().vcvttss2si(gpd, m);
+ cc.evex().vcvttss2si(gpz, m);
+ cc.evex().vcvttss2usi(gpd, m);
+ cc.evex().vcvttss2usi(gpz, m);
+ cc.evex().vcvtudq2pd(xmm_a, m);
+ cc.evex().vcvtudq2pd(ymm_a, m);
+ cc.evex().vcvtudq2pd(zmm_a, m);
+ cc.evex().vcvtudq2ps(xmm_a, m);
+ cc.evex().vcvtudq2ps(ymm_a, m);
+ cc.evex().vcvtudq2ps(zmm_a, m);
+ cc.evex().vcvtuqq2pd(xmm_a, m);
+ cc.evex().vcvtuqq2pd(ymm_a, m);
+ cc.evex().vcvtuqq2pd(zmm_a, m);
+ cc.evex().vcvtuqq2ps(xmm_a, m128);
+ cc.evex().vcvtuqq2ps(xmm_a, m256);
+ cc.evex().vcvtuqq2ps(ymm_a, m512);
+ cc.evex().vcvtusi2sd(xmm_a, xmm_b, m32);
+ if (cc.is_64bit()) cc.evex().vcvtusi2sd(xmm_a, xmm_b, m64);
+ cc.evex().vcvtusi2ss(xmm_a, xmm_b, m32);
+ if (cc.is_64bit()) cc.evex().vcvtusi2ss(xmm_a, xmm_b, m64);
+ cc.evex().vdbpsadbw(xmm_a, xmm_b, m, 0);
+ cc.evex().vdbpsadbw(ymm_a, ymm_b, m, 0);
+ cc.evex().vdbpsadbw(zmm_a, zmm_b, m, 0);
+ cc.evex().vdivpd(xmm_a, xmm_b, m);
+ cc.evex().vdivpd(ymm_a, ymm_b, m);
+ cc.evex().vdivpd(zmm_a, zmm_b, m);
+ cc.evex().vdivps(xmm_a, xmm_b, m);
+ cc.evex().vdivps(ymm_a, ymm_b, m);
+ cc.evex().vdivps(zmm_a, zmm_b, m);
+ cc.evex().vdivsd(xmm_a, xmm_b, m);
+ cc.evex().vdivss(xmm_a, xmm_b, m);
+ cc.evex().vexpandpd(xmm_a, m);
+ cc.evex().vexpandpd(ymm_a, m);
+ cc.evex().vexpandpd(zmm_a, m);
+ cc.evex().vexpandps(xmm_a, m);
+ cc.evex().vexpandps(ymm_a, m);
+ cc.evex().vexpandps(zmm_a, m);
+ cc.evex().vextractf32x4(m, ymm_b, 0);
+ cc.evex().vextractf32x4(m, zmm_b, 0);
+ cc.evex().vextractf32x8(m, zmm_b, 0);
+ cc.evex().vextractf64x2(m, ymm_b, 0);
+ cc.evex().vextractf64x2(m, zmm_b, 0);
+ cc.evex().vextractf64x4(m, zmm_b, 0);
+ cc.evex().vextracti32x4(m, ymm_b, 0);
+ cc.evex().vextracti32x4(m, zmm_b, 0);
+ cc.evex().vextracti32x8(m, zmm_b, 0);
+ cc.evex().vextracti64x2(m, ymm_b, 0);
+ cc.evex().vextracti64x2(m, zmm_b, 0);
+ cc.evex().vextracti64x4(m, zmm_b, 0);
+ cc.evex().vextractps(m, xmm_b, 0);
+ cc.evex().vfixupimmpd(xmm_a, xmm_b, m, 0);
+ cc.evex().vfixupimmpd(ymm_a, ymm_b, m, 0);
+ cc.evex().vfixupimmpd(zmm_a, zmm_b, m, 0);
+ cc.evex().vfixupimmps(xmm_a, xmm_b, m, 0);
+ cc.evex().vfixupimmps(ymm_a, ymm_b, m, 0);
+ cc.evex().vfixupimmps(zmm_a, zmm_b, m, 0);
+ cc.evex().vfixupimmsd(xmm_a, xmm_b, m, 0);
+ cc.evex().vfixupimmss(xmm_a, xmm_b, m, 0);
+ cc.evex().vfmadd132pd(xmm_a, xmm_b, m);
+ cc.evex().vfmadd132pd(ymm_a, ymm_b, m);
+ cc.evex().vfmadd132pd(zmm_a, zmm_b, m);
+ cc.evex().vfmadd132ps(xmm_a, xmm_b, m);
+ cc.evex().vfmadd132ps(ymm_a, ymm_b, m);
+ cc.evex().vfmadd132ps(zmm_a, zmm_b, m);
+ cc.evex().vfmadd132sd(xmm_a, xmm_b, m);
+ cc.evex().vfmadd132ss(xmm_a, xmm_b, m);
+ cc.evex().vfmadd213pd(xmm_a, xmm_b, m);
+ cc.evex().vfmadd213pd(ymm_a, ymm_b, m);
+ cc.evex().vfmadd213pd(zmm_a, zmm_b, m);
+ cc.evex().vfmadd213ps(xmm_a, xmm_b, m);
+ cc.evex().vfmadd213ps(ymm_a, ymm_b, m);
+ cc.evex().vfmadd213ps(zmm_a, zmm_b, m);
+ cc.evex().vfmadd213sd(xmm_a, xmm_b, m);
+ cc.evex().vfmadd213ss(xmm_a, xmm_b, m);
+ cc.evex().vfmadd231pd(xmm_a, xmm_b, m);
+ cc.evex().vfmadd231pd(ymm_a, ymm_b, m);
+ cc.evex().vfmadd231pd(zmm_a, zmm_b, m);
+ cc.evex().vfmadd231ps(xmm_a, xmm_b, m);
+ cc.evex().vfmadd231ps(ymm_a, ymm_b, m);
+ cc.evex().vfmadd231ps(zmm_a, zmm_b, m);
+ cc.evex().vfmadd231sd(xmm_a, xmm_b, m);
+ cc.evex().vfmadd231ss(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub132pd(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub132pd(ymm_a, ymm_b, m);
+ cc.evex().vfmaddsub132pd(zmm_a, zmm_b, m);
+ cc.evex().vfmaddsub132ps(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub132ps(ymm_a, ymm_b, m);
+ cc.evex().vfmaddsub132ps(zmm_a, zmm_b, m);
+ cc.evex().vfmaddsub213pd(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub213pd(ymm_a, ymm_b, m);
+ cc.evex().vfmaddsub213pd(zmm_a, zmm_b, m);
+ cc.evex().vfmaddsub213ps(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub213ps(ymm_a, ymm_b, m);
+ cc.evex().vfmaddsub213ps(zmm_a, zmm_b, m);
+ cc.evex().vfmaddsub231pd(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub231pd(ymm_a, ymm_b, m);
+ cc.evex().vfmaddsub231pd(zmm_a, zmm_b, m);
+ cc.evex().vfmaddsub231ps(xmm_a, xmm_b, m);
+ cc.evex().vfmaddsub231ps(ymm_a, ymm_b, m);
+ cc.evex().vfmaddsub231ps(zmm_a, zmm_b, m);
+ cc.evex().vfmsub132pd(xmm_a, xmm_b, m);
+ cc.evex().vfmsub132pd(ymm_a, ymm_b, m);
+ cc.evex().vfmsub132pd(zmm_a, zmm_b, m);
+ cc.evex().vfmsub132ps(xmm_a, xmm_b, m);
+ cc.evex().vfmsub132ps(ymm_a, ymm_b, m);
+ cc.evex().vfmsub132ps(zmm_a, zmm_b, m);
+ cc.evex().vfmsub132sd(xmm_a, xmm_b, m);
+ cc.evex().vfmsub132ss(xmm_a, xmm_b, m);
+ cc.evex().vfmsub213pd(xmm_a, xmm_b, m);
+ cc.evex().vfmsub213pd(ymm_a, ymm_b, m);
+ cc.evex().vfmsub213pd(zmm_a, zmm_b, m);
+ cc.evex().vfmsub213ps(xmm_a, xmm_b, m);
+ cc.evex().vfmsub213ps(ymm_a, ymm_b, m);
+ cc.evex().vfmsub213ps(zmm_a, zmm_b, m);
+ cc.evex().vfmsub213sd(xmm_a, xmm_b, m);
+ cc.evex().vfmsub213ss(xmm_a, xmm_b, m);
+ cc.evex().vfmsub231pd(xmm_a, xmm_b, m);
+ cc.evex().vfmsub231pd(ymm_a, ymm_b, m);
+ cc.evex().vfmsub231pd(zmm_a, zmm_b, m);
+ cc.evex().vfmsub231ps(xmm_a, xmm_b, m);
+ cc.evex().vfmsub231ps(ymm_a, ymm_b, m);
+ cc.evex().vfmsub231ps(zmm_a, zmm_b, m);
+ cc.evex().vfmsub231sd(xmm_a, xmm_b, m);
+ cc.evex().vfmsub231ss(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd132pd(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd132pd(ymm_a, ymm_b, m);
+ cc.evex().vfmsubadd132pd(zmm_a, zmm_b, m);
+ cc.evex().vfmsubadd132ps(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd132ps(ymm_a, ymm_b, m);
+ cc.evex().vfmsubadd132ps(zmm_a, zmm_b, m);
+ cc.evex().vfmsubadd213pd(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd213pd(ymm_a, ymm_b, m);
+ cc.evex().vfmsubadd213pd(zmm_a, zmm_b, m);
+ cc.evex().vfmsubadd213ps(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd213ps(ymm_a, ymm_b, m);
+ cc.evex().vfmsubadd213ps(zmm_a, zmm_b, m);
+ cc.evex().vfmsubadd231pd(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd231pd(ymm_a, ymm_b, m);
+ cc.evex().vfmsubadd231pd(zmm_a, zmm_b, m);
+ cc.evex().vfmsubadd231ps(xmm_a, xmm_b, m);
+ cc.evex().vfmsubadd231ps(ymm_a, ymm_b, m);
+ cc.evex().vfmsubadd231ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd132pd(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd132pd(ymm_a, ymm_b, m);
+ cc.evex().vfnmadd132pd(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd132ps(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd132ps(ymm_a, ymm_b, m);
+ cc.evex().vfnmadd132ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd132sd(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd132ss(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd213pd(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd213pd(ymm_a, ymm_b, m);
+ cc.evex().vfnmadd213pd(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd213ps(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd213ps(ymm_a, ymm_b, m);
+ cc.evex().vfnmadd213ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd213sd(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd213ss(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd231pd(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd231pd(ymm_a, ymm_b, m);
+ cc.evex().vfnmadd231pd(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd231ps(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd231ps(ymm_a, ymm_b, m);
+ cc.evex().vfnmadd231ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmadd231sd(xmm_a, xmm_b, m);
+ cc.evex().vfnmadd231ss(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub132pd(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub132pd(ymm_a, ymm_b, m);
+ cc.evex().vfnmsub132pd(zmm_a, zmm_b, m);
+ cc.evex().vfnmsub132ps(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub132ps(ymm_a, ymm_b, m);
+ cc.evex().vfnmsub132ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmsub132sd(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub132ss(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub213pd(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub213pd(ymm_a, ymm_b, m);
+ cc.evex().vfnmsub213pd(zmm_a, zmm_b, m);
+ cc.evex().vfnmsub213ps(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub213ps(ymm_a, ymm_b, m);
+ cc.evex().vfnmsub213ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmsub213sd(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub213ss(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub231pd(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub231pd(ymm_a, ymm_b, m);
+ cc.evex().vfnmsub231pd(zmm_a, zmm_b, m);
+ cc.evex().vfnmsub231ps(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub231ps(ymm_a, ymm_b, m);
+ cc.evex().vfnmsub231ps(zmm_a, zmm_b, m);
+ cc.evex().vfnmsub231sd(xmm_a, xmm_b, m);
+ cc.evex().vfnmsub231ss(xmm_a, xmm_b, m);
+ cc.evex().vfpclasspd(kA, m128, 0);
+ cc.evex().vfpclasspd(kA, m256, 0);
+ cc.evex().vfpclasspd(kA, m512, 0);
+ cc.evex().vfpclassps(kA, m128, 0);
+ cc.evex().vfpclassps(kA, m256, 0);
+ cc.evex().vfpclassps(kA, m512, 0);
+ cc.evex().vfpclasssd(kA, m, 0);
+ cc.evex().vfpclassss(kA, m, 0);
+ cc.evex().k(kA).vgatherdpd(xmm_a, vx_ptr);
+ cc.evex().k(kA).vgatherdpd(ymm_a, vx_ptr);
+ cc.evex().k(kA).vgatherdpd(zmm_a, vy_ptr);
+ cc.evex().k(kA).vgatherdps(xmm_a, vx_ptr);
+ cc.evex().k(kA).vgatherdps(ymm_a, vy_ptr);
+ cc.evex().k(kA).vgatherdps(zmm_a, vz_ptr);
+ cc.evex().k(kA).vgatherqpd(xmm_a, vx_ptr);
+ cc.evex().k(kA).vgatherqpd(ymm_a, vy_ptr);
+ cc.evex().k(kA).vgatherqpd(zmm_a, vz_ptr);
+ cc.evex().k(kA).vgatherqps(xmm_a, vx_ptr);
+ cc.evex().k(kA).vgatherqps(xmm_a, vy_ptr);
+ cc.evex().k(kA).vgatherqps(ymm_a, vz_ptr);
+ cc.evex().vgetexppd(xmm_a, m);
+ cc.evex().vgetexppd(ymm_a, m);
+ cc.evex().vgetexppd(zmm_a, m);
+ cc.evex().vgetexpps(xmm_a, m);
+ cc.evex().vgetexpps(ymm_a, m);
+ cc.evex().vgetexpps(zmm_a, m);
+ cc.evex().vgetexpsd(xmm_a, xmm_b, m);
+ cc.evex().vgetexpss(xmm_a, xmm_b, m);
+ cc.evex().vgetmantpd(xmm_a, m, 0);
+ cc.evex().vgetmantpd(ymm_a, m, 0);
+ cc.evex().vgetmantpd(zmm_a, m, 0);
+ cc.evex().vgetmantps(xmm_a, m, 0);
+ cc.evex().vgetmantps(ymm_a, m, 0);
+ cc.evex().vgetmantps(zmm_a, m, 0);
+ cc.evex().vgetmantsd(xmm_a, xmm_b, m, 0);
+ cc.evex().vgetmantss(xmm_a, xmm_b, m, 0);
+ cc.evex().vinsertf32x4(ymm_a, ymm_b, m, 0);
+ cc.evex().vinsertf32x4(zmm_a, zmm_b, m, 0);
+ cc.evex().vinsertf32x8(zmm_a, zmm_b, m, 0);
+ cc.evex().vinsertf64x2(ymm_a, ymm_b, m, 0);
+ cc.evex().vinsertf64x2(zmm_a, zmm_b, m, 0);
+ cc.evex().vinsertf64x4(zmm_a, zmm_b, m, 0);
+ cc.evex().vinserti32x4(ymm_a, ymm_b, m, 0);
+ cc.evex().vinserti32x4(zmm_a, zmm_b, m, 0);
+ cc.evex().vinserti32x8(zmm_a, zmm_b, m, 0);
+ cc.evex().vinserti64x2(ymm_a, ymm_b, m, 0);
+ cc.evex().vinserti64x2(zmm_a, zmm_b, m, 0);
+ cc.evex().vinserti64x4(zmm_a, zmm_b, m, 0);
+ cc.evex().vinsertps(xmm_a, xmm_b, m, 0);
+ cc.evex().vmaxpd(xmm_a, xmm_b, m);
+ cc.evex().vmaxpd(ymm_a, ymm_b, m);
+ cc.evex().vmaxpd(zmm_a, zmm_b, m);
+ cc.evex().vmaxps(xmm_a, xmm_b, m);
+ cc.evex().vmaxps(ymm_a, ymm_b, m);
+ cc.evex().vmaxps(zmm_a, zmm_b, m);
+ cc.evex().vmaxsd(xmm_a, xmm_b, m);
+ cc.evex().vmaxss(xmm_a, xmm_b, m);
+ cc.evex().vminpd(xmm_a, xmm_b, m);
+ cc.evex().vminpd(ymm_a, ymm_b, m);
+ cc.evex().vminpd(zmm_a, zmm_b, m);
+ cc.evex().vminps(xmm_a, xmm_b, m);
+ cc.evex().vminps(ymm_a, ymm_b, m);
+ cc.evex().vminps(zmm_a, zmm_b, m);
+ cc.evex().vminsd(xmm_a, xmm_b, m);
+ cc.evex().vminss(xmm_a, xmm_b, m);
+ cc.evex().vmovapd(xmm_a, m);
+ cc.evex().vmovapd(m, xmm_b);
+ cc.evex().vmovapd(ymm_a, m);
+ cc.evex().vmovapd(m, ymm_b);
+ cc.evex().vmovapd(zmm_a, m);
+ cc.evex().vmovapd(m, zmm_b);
+ cc.evex().vmovaps(xmm_a, m);
+ cc.evex().vmovaps(m, xmm_b);
+ cc.evex().vmovaps(ymm_a, m);
+ cc.evex().vmovaps(m, ymm_b);
+ cc.evex().vmovaps(zmm_a, m);
+ cc.evex().vmovaps(m, zmm_b);
+ cc.evex().vmovd(m, xmm_b);
+ cc.evex().vmovd(xmm_a, m);
+ cc.evex().vmovddup(xmm_a, m);
+ cc.evex().vmovddup(ymm_a, m);
+ cc.evex().vmovddup(zmm_a, m);
+ cc.evex().vmovdqa32(xmm_a, m);
+ cc.evex().vmovdqa32(m, xmm_b);
+ cc.evex().vmovdqa32(ymm_a, m);
+ cc.evex().vmovdqa32(m, ymm_b);
+ cc.evex().vmovdqa32(zmm_a, m);
+ cc.evex().vmovdqa32(m, zmm_b);
+ cc.evex().vmovdqa64(xmm_a, m);
+ cc.evex().vmovdqa64(m, xmm_b);
+ cc.evex().vmovdqa64(ymm_a, m);
+ cc.evex().vmovdqa64(m, ymm_b);
+ cc.evex().vmovdqa64(zmm_a, m);
+ cc.evex().vmovdqa64(m, zmm_b);
+ cc.evex().vmovdqu16(xmm_a, m);
+ cc.evex().vmovdqu16(m, xmm_b);
+ cc.evex().vmovdqu16(ymm_a, m);
+ cc.evex().vmovdqu16(m, ymm_b);
+ cc.evex().vmovdqu16(zmm_a, m);
+ cc.evex().vmovdqu16(m, zmm_b);
+ cc.evex().vmovdqu32(xmm_a, m);
+ cc.evex().vmovdqu32(m, xmm_b);
+ cc.evex().vmovdqu32(ymm_a, m);
+ cc.evex().vmovdqu32(m, ymm_b);
+ cc.evex().vmovdqu32(zmm_a, m);
+ cc.evex().vmovdqu32(m, zmm_b);
+ cc.evex().vmovdqu64(xmm_a, m);
+ cc.evex().vmovdqu64(m, xmm_b);
+ cc.evex().vmovdqu64(ymm_a, m);
+ cc.evex().vmovdqu64(m, ymm_b);
+ cc.evex().vmovdqu64(zmm_a, m);
+ cc.evex().vmovdqu64(m, zmm_b);
+ cc.evex().vmovdqu8(xmm_a, m);
+ cc.evex().vmovdqu8(m, xmm_b);
+ cc.evex().vmovdqu8(ymm_a, m);
+ cc.evex().vmovdqu8(m, ymm_b);
+ cc.evex().vmovdqu8(zmm_a, m);
+ cc.evex().vmovdqu8(m, zmm_b);
+ cc.evex().vmovhpd(m, xmm_b);
+ cc.evex().vmovhpd(xmm_a, xmm_b, m);
+ cc.evex().vmovhps(m, xmm_b);
+ cc.evex().vmovhps(xmm_a, xmm_b, m);
+ cc.evex().vmovlpd(m, xmm_b);
+ cc.evex().vmovlpd(xmm_a, xmm_b, m);
+ cc.evex().vmovlps(m, xmm_b);
+ cc.evex().vmovlps(xmm_a, xmm_b, m);
+ cc.evex().vmovntdq(m, xmm_b);
+ cc.evex().vmovntdq(m, ymm_b);
+ cc.evex().vmovntdq(m, zmm_b);
+ cc.evex().vmovntdqa(xmm_a, m);
+ cc.evex().vmovntdqa(ymm_a, m);
+ cc.evex().vmovntdqa(zmm_a, m);
+ cc.evex().vmovntpd(m, xmm_b);
+ cc.evex().vmovntpd(m, ymm_b);
+ cc.evex().vmovntpd(m, zmm_b);
+ cc.evex().vmovntps(m, xmm_b);
+ cc.evex().vmovntps(m, ymm_b);
+ cc.evex().vmovntps(m, zmm_b);
+ cc.evex().vmovq(m, xmm_b);
+ cc.evex().vmovq(xmm_a, m);
+ cc.evex().vmovq(xmm_a, m);
+ cc.evex().vmovq(m, xmm_b);
+ cc.evex().vmovsd(m, xmm_b);
+ cc.evex().vmovsd(xmm_a, m);
+ cc.evex().vmovshdup(xmm_a, m);
+ cc.evex().vmovshdup(ymm_a, m);
+ cc.evex().vmovshdup(zmm_a, m);
+ cc.evex().vmovsldup(xmm_a, m);
+ cc.evex().vmovsldup(ymm_a, m);
+ cc.evex().vmovsldup(zmm_a, m);
+ cc.evex().vmovss(m, xmm_b);
+ cc.evex().vmovss(xmm_a, m);
+ cc.evex().vmovupd(xmm_a, m);
+ cc.evex().vmovupd(m, xmm_b);
+ cc.evex().vmovupd(ymm_a, m);
+ cc.evex().vmovupd(m, ymm_b);
+ cc.evex().vmovupd(zmm_a, m);
+ cc.evex().vmovupd(m, zmm_b);
+ cc.evex().vmovups(xmm_a, m);
+ cc.evex().vmovups(m, xmm_b);
+ cc.evex().vmovups(ymm_a, m);
+ cc.evex().vmovups(m, ymm_b);
+ cc.evex().vmovups(zmm_a, m);
+ cc.evex().vmovups(m, zmm_b);
+ cc.evex().vmulpd(xmm_a, xmm_b, m);
+ cc.evex().vmulpd(ymm_a, ymm_b, m);
+ cc.evex().vmulpd(zmm_a, zmm_b, m);
+ cc.evex().vmulps(xmm_a, xmm_b, m);
+ cc.evex().vmulps(ymm_a, ymm_b, m);
+ cc.evex().vmulps(zmm_a, zmm_b, m);
+ cc.evex().vmulsd(xmm_a, xmm_b, m);
+ cc.evex().vmulss(xmm_a, xmm_b, m);
+ cc.evex().vorpd(xmm_a, xmm_b, m);
+ cc.evex().vorpd(ymm_a, ymm_b, m);
+ cc.evex().vorpd(zmm_a, zmm_b, m);
+ cc.evex().vorps(xmm_a, xmm_b, m);
+ cc.evex().vorps(ymm_a, ymm_b, m);
+ cc.evex().vorps(zmm_a, zmm_b, m);
+ cc.evex().vpabsb(xmm_a, m);
+ cc.evex().vpabsb(ymm_a, m);
+ cc.evex().vpabsb(zmm_a, m);
+ cc.evex().vpabsd(xmm_a, m);
+ cc.evex().vpabsd(ymm_a, m);
+ cc.evex().vpabsd(zmm_a, m);
+ cc.evex().vpabsq(xmm_a, m);
+ cc.evex().vpabsq(ymm_a, m);
+ cc.evex().vpabsq(zmm_a, m);
+ cc.evex().vpabsw(xmm_a, m);
+ cc.evex().vpabsw(ymm_a, m);
+ cc.evex().vpabsw(zmm_a, m);
+ cc.evex().vpackssdw(xmm_a, xmm_b, m);
+ cc.evex().vpackssdw(ymm_a, ymm_b, m);
+ cc.evex().vpackssdw(zmm_a, zmm_b, m);
+ cc.evex().vpacksswb(xmm_a, xmm_b, m);
+ cc.evex().vpacksswb(ymm_a, ymm_b, m);
+ cc.evex().vpacksswb(zmm_a, zmm_b, m);
+ cc.evex().vpackusdw(xmm_a, xmm_b, m);
+ cc.evex().vpackusdw(ymm_a, ymm_b, m);
+ cc.evex().vpackusdw(zmm_a, zmm_b, m);
+ cc.evex().vpackuswb(xmm_a, xmm_b, m);
+ cc.evex().vpackuswb(ymm_a, ymm_b, m);
+ cc.evex().vpackuswb(zmm_a, zmm_b, m);
+ cc.evex().vpaddb(xmm_a, xmm_b, m);
+ cc.evex().vpaddb(ymm_a, ymm_b, m);
+ cc.evex().vpaddb(zmm_a, zmm_b, m);
+ cc.evex().vpaddd(xmm_a, xmm_b, m);
+ cc.evex().vpaddd(ymm_a, ymm_b, m);
+ cc.evex().vpaddd(zmm_a, zmm_b, m);
+ cc.evex().vpaddq(xmm_a, xmm_b, m);
+ cc.evex().vpaddq(ymm_a, ymm_b, m);
+ cc.evex().vpaddq(zmm_a, zmm_b, m);
+ cc.evex().vpaddsb(xmm_a, xmm_b, m);
+ cc.evex().vpaddsb(ymm_a, ymm_b, m);
+ cc.evex().vpaddsb(zmm_a, zmm_b, m);
+ cc.evex().vpaddsw(xmm_a, xmm_b, m);
+ cc.evex().vpaddsw(ymm_a, ymm_b, m);
+ cc.evex().vpaddsw(zmm_a, zmm_b, m);
+ cc.evex().vpaddusb(xmm_a, xmm_b, m);
+ cc.evex().vpaddusb(ymm_a, ymm_b, m);
+ cc.evex().vpaddusb(zmm_a, zmm_b, m);
+ cc.evex().vpaddusw(xmm_a, xmm_b, m);
+ cc.evex().vpaddusw(ymm_a, ymm_b, m);
+ cc.evex().vpaddusw(zmm_a, zmm_b, m);
+ cc.evex().vpaddw(xmm_a, xmm_b, m);
+ cc.evex().vpaddw(ymm_a, ymm_b, m);
+ cc.evex().vpaddw(zmm_a, zmm_b, m);
+ cc.evex().vpalignr(xmm_a, xmm_b, m, 0);
+ cc.evex().vpalignr(ymm_a, ymm_b, m, 0);
+ cc.evex().vpalignr(zmm_a, zmm_b, m, 0);
+ cc.evex().vpandd(xmm_a, xmm_b, m);
+ cc.evex().vpandd(ymm_a, ymm_b, m);
+ cc.evex().vpandd(zmm_a, zmm_b, m);
+ cc.evex().vpandnd(xmm_a, xmm_b, m);
+ cc.evex().vpandnd(ymm_a, ymm_b, m);
+ cc.evex().vpandnd(zmm_a, zmm_b, m);
+ cc.evex().vpandnq(xmm_a, xmm_b, m);
+ cc.evex().vpandnq(ymm_a, ymm_b, m);
+ cc.evex().vpandnq(zmm_a, zmm_b, m);
+ cc.evex().vpandq(xmm_a, xmm_b, m);
+ cc.evex().vpandq(ymm_a, ymm_b, m);
+ cc.evex().vpandq(zmm_a, zmm_b, m);
+ cc.evex().vpavgb(xmm_a, xmm_b, m);
+ cc.evex().vpavgb(ymm_a, ymm_b, m);
+ cc.evex().vpavgb(zmm_a, zmm_b, m);
+ cc.evex().vpavgw(xmm_a, xmm_b, m);
+ cc.evex().vpavgw(ymm_a, ymm_b, m);
+ cc.evex().vpavgw(zmm_a, zmm_b, m);
+ cc.evex().vpblendmb(xmm_a, xmm_b, m);
+ cc.evex().vpblendmb(ymm_a, ymm_b, m);
+ cc.evex().vpblendmb(zmm_a, zmm_b, m);
+ cc.evex().vpblendmd(xmm_a, xmm_b, m);
+ cc.evex().vpblendmd(ymm_a, ymm_b, m);
+ cc.evex().vpblendmd(zmm_a, zmm_b, m);
+ cc.evex().vpblendmq(xmm_a, xmm_b, m);
+ cc.evex().vpblendmq(ymm_a, ymm_b, m);
+ cc.evex().vpblendmq(zmm_a, zmm_b, m);
+ cc.evex().vpblendmw(xmm_a, xmm_b, m);
+ cc.evex().vpblendmw(ymm_a, ymm_b, m);
+ cc.evex().vpblendmw(zmm_a, zmm_b, m);
+ cc.evex().vpbroadcastb(xmm_a, m);
+ cc.evex().vpbroadcastb(ymm_a, m);
+ cc.evex().vpbroadcastb(zmm_a, m);
+ cc.evex().vpbroadcastd(xmm_a, m);
+ cc.evex().vpbroadcastd(ymm_a, m);
+ cc.evex().vpbroadcastd(zmm_a, m);
+ cc.evex().vpbroadcastq(xmm_a, m);
+ cc.evex().vpbroadcastq(ymm_a, m);
+ cc.evex().vpbroadcastq(zmm_a, m);
+ cc.evex().vpbroadcastw(xmm_a, m);
+ cc.evex().vpbroadcastw(ymm_a, m);
+ cc.evex().vpbroadcastw(zmm_a, m);
+ cc.evex().vpcmpb(kA, xmm_b, m, 0);
+ cc.evex().vpcmpb(kA, ymm_b, m, 0);
+ cc.evex().vpcmpb(kA, zmm_b, m, 0);
+ cc.evex().vpcmpd(kA, xmm_b, m, 0);
+ cc.evex().vpcmpd(kA, ymm_b, m, 0);
+ cc.evex().vpcmpd(kA, zmm_b, m, 0);
+ cc.evex().vpcmpeqb(kA, xmm_b, m);
+ cc.evex().vpcmpeqb(kA, ymm_b, m);
+ cc.evex().vpcmpeqb(kA, zmm_b, m);
+ cc.evex().vpcmpeqd(kA, xmm_b, m);
+ cc.evex().vpcmpeqd(kA, ymm_b, m);
+ cc.evex().vpcmpeqd(kA, zmm_b, m);
+ cc.evex().vpcmpeqq(kA, xmm_b, m);
+ cc.evex().vpcmpeqq(kA, ymm_b, m);
+ cc.evex().vpcmpeqq(kA, zmm_b, m);
+ cc.evex().vpcmpeqw(kA, xmm_b, m);
+ cc.evex().vpcmpeqw(kA, ymm_b, m);
+ cc.evex().vpcmpeqw(kA, zmm_b, m);
+ cc.evex().vpcmpgtb(kA, xmm_b, m);
+ cc.evex().vpcmpgtb(kA, ymm_b, m);
+ cc.evex().vpcmpgtb(kA, zmm_b, m);
+ cc.evex().vpcmpgtd(kA, xmm_b, m);
+ cc.evex().vpcmpgtd(kA, ymm_b, m);
+ cc.evex().vpcmpgtd(kA, zmm_b, m);
+ cc.evex().vpcmpgtq(kA, xmm_b, m);
+ cc.evex().vpcmpgtq(kA, ymm_b, m);
+ cc.evex().vpcmpgtq(kA, zmm_b, m);
+ cc.evex().vpcmpgtw(kA, xmm_b, m);
+ cc.evex().vpcmpgtw(kA, ymm_b, m);
+ cc.evex().vpcmpgtw(kA, zmm_b, m);
+ cc.evex().vpcmpq(kA, xmm_b, m, 0);
+ cc.evex().vpcmpq(kA, ymm_b, m, 0);
+ cc.evex().vpcmpq(kA, zmm_b, m, 0);
+ cc.evex().vpcmpub(kA, xmm_b, m, 0);
+ cc.evex().vpcmpub(kA, ymm_b, m, 0);
+ cc.evex().vpcmpub(kA, zmm_b, m, 0);
+ cc.evex().vpcmpud(kA, xmm_b, m, 0);
+ cc.evex().vpcmpud(kA, ymm_b, m, 0);
+ cc.evex().vpcmpud(kA, zmm_b, m, 0);
+ cc.evex().vpcmpuq(kA, xmm_b, m, 0);
+ cc.evex().vpcmpuq(kA, ymm_b, m, 0);
+ cc.evex().vpcmpuq(kA, zmm_b, m, 0);
+ cc.evex().vpcmpuw(kA, xmm_b, m, 0);
+ cc.evex().vpcmpuw(kA, ymm_b, m, 0);
+ cc.evex().vpcmpuw(kA, zmm_b, m, 0);
+ cc.evex().vpcmpw(kA, xmm_b, m, 0);
+ cc.evex().vpcmpw(kA, ymm_b, m, 0);
+ cc.evex().vpcmpw(kA, zmm_b, m, 0);
+ cc.evex().vpcompressd(m, xmm_b);
+ cc.evex().vpcompressd(m, ymm_b);
+ cc.evex().vpcompressd(m, zmm_b);
+ cc.evex().vpcompressq(m, xmm_b);
+ cc.evex().vpcompressq(m, ymm_b);
+ cc.evex().vpcompressq(m, zmm_b);
+ cc.evex().vpconflictd(xmm_a, m);
+ cc.evex().vpconflictd(ymm_a, m);
+ cc.evex().vpconflictd(zmm_a, m);
+ cc.evex().vpconflictq(xmm_a, m);
+ cc.evex().vpconflictq(ymm_a, m);
+ cc.evex().vpconflictq(zmm_a, m);
+ cc.evex().vpermb(xmm_a, xmm_b, m);
+ cc.evex().vpermb(ymm_a, ymm_b, m);
+ cc.evex().vpermb(zmm_a, zmm_b, m);
+ cc.evex().vpermd(ymm_a, ymm_b, m);
+ cc.evex().vpermd(zmm_a, zmm_b, m);
+ cc.evex().vpermi2b(xmm_a, xmm_b, m);
+ cc.evex().vpermi2b(ymm_a, ymm_b, m);
+ cc.evex().vpermi2b(zmm_a, zmm_b, m);
+ cc.evex().vpermi2d(xmm_a, xmm_b, m);
+ cc.evex().vpermi2d(ymm_a, ymm_b, m);
+ cc.evex().vpermi2d(zmm_a, zmm_b, m);
+ cc.evex().vpermi2pd(xmm_a, xmm_b, m);
+ cc.evex().vpermi2pd(ymm_a, ymm_b, m);
+ cc.evex().vpermi2pd(zmm_a, zmm_b, m);
+ cc.evex().vpermi2ps(xmm_a, xmm_b, m);
+ cc.evex().vpermi2ps(ymm_a, ymm_b, m);
+ cc.evex().vpermi2ps(zmm_a, zmm_b, m);
+ cc.evex().vpermi2q(xmm_a, xmm_b, m);
+ cc.evex().vpermi2q(ymm_a, ymm_b, m);
+ cc.evex().vpermi2q(zmm_a, zmm_b, m);
+ cc.evex().vpermi2w(xmm_a, xmm_b, m);
+ cc.evex().vpermi2w(ymm_a, ymm_b, m);
+ cc.evex().vpermi2w(zmm_a, zmm_b, m);
+ cc.evex().vpermilpd(xmm_a, xmm_b, m);
+ cc.evex().vpermilpd(ymm_a, ymm_b, m);
+ cc.evex().vpermilpd(zmm_a, zmm_b, m);
+ cc.evex().vpermilpd(xmm_a, m, 0);
+ cc.evex().vpermilpd(ymm_a, m, 0);
+ cc.evex().vpermilpd(zmm_a, m, 0);
+ cc.evex().vpermilps(xmm_a, xmm_b, m);
+ cc.evex().vpermilps(ymm_a, ymm_b, m);
+ cc.evex().vpermilps(zmm_a, zmm_b, m);
+ cc.evex().vpermilps(xmm_a, m, 0);
+ cc.evex().vpermilps(ymm_a, m, 0);
+ cc.evex().vpermilps(zmm_a, m, 0);
+ cc.evex().vpermq(ymm_a, ymm_b, m);
+ cc.evex().vpermq(zmm_a, zmm_b, m);
+ cc.evex().vpermq(ymm_a, m, 0);
+ cc.evex().vpermq(zmm_a, m, 0);
+ cc.evex().vpermt2b(xmm_a, xmm_b, m);
+ cc.evex().vpermt2b(ymm_a, ymm_b, m);
+ cc.evex().vpermt2b(zmm_a, zmm_b, m);
+ cc.evex().vpermt2d(xmm_a, xmm_b, m);
+ cc.evex().vpermt2d(ymm_a, ymm_b, m);
+ cc.evex().vpermt2d(zmm_a, zmm_b, m);
+ cc.evex().vpermt2pd(xmm_a, xmm_b, m);
+ cc.evex().vpermt2pd(ymm_a, ymm_b, m);
+ cc.evex().vpermt2pd(zmm_a, zmm_b, m);
+ cc.evex().vpermt2ps(xmm_a, xmm_b, m);
+ cc.evex().vpermt2ps(ymm_a, ymm_b, m);
+ cc.evex().vpermt2ps(zmm_a, zmm_b, m);
+ cc.evex().vpermt2q(xmm_a, xmm_b, m);
+ cc.evex().vpermt2q(ymm_a, ymm_b, m);
+ cc.evex().vpermt2q(zmm_a, zmm_b, m);
+ cc.evex().vpermt2w(xmm_a, xmm_b, m);
+ cc.evex().vpermt2w(ymm_a, ymm_b, m);
+ cc.evex().vpermt2w(zmm_a, zmm_b, m);
+ cc.evex().vpermw(xmm_a, xmm_b, m);
+ cc.evex().vpermw(ymm_a, ymm_b, m);
+ cc.evex().vpermw(zmm_a, zmm_b, m);
+ cc.evex().vpexpandd(xmm_a, m);
+ cc.evex().vpexpandd(ymm_a, m);
+ cc.evex().vpexpandd(zmm_a, m);
+ cc.evex().vpexpandq(xmm_a, m);
+ cc.evex().vpexpandq(ymm_a, m);
+ cc.evex().vpexpandq(zmm_a, m);
+ cc.evex().vpextrb(m, xmm_b, 0);
+ cc.evex().vpextrd(m, xmm_b, 0);
+ if (cc.is_64bit()) cc.evex().vpextrq(m, xmm_b, 0);
+ cc.evex().vpextrw(m, xmm_b, 0);
+ cc.evex().k(kA).vpgatherdd(xmm_a, vx_ptr);
+ cc.evex().k(kA).vpgatherdd(ymm_a, vy_ptr);
+ cc.evex().k(kA).vpgatherdd(zmm_a, vz_ptr);
+ cc.evex().k(kA).vpgatherdq(xmm_a, vx_ptr);
+ cc.evex().k(kA).vpgatherdq(ymm_a, vx_ptr);
+ cc.evex().k(kA).vpgatherdq(zmm_a, vy_ptr);
+ cc.evex().k(kA).vpgatherqd(xmm_a, vx_ptr);
+ cc.evex().k(kA).vpgatherqd(xmm_a, vy_ptr);
+ cc.evex().k(kA).vpgatherqd(ymm_a, vz_ptr);
+ cc.evex().k(kA).vpgatherqq(xmm_a, vx_ptr);
+ cc.evex().k(kA).vpgatherqq(ymm_a, vy_ptr);
+ cc.evex().k(kA).vpgatherqq(zmm_a, vz_ptr);
+ cc.evex().vpinsrb(xmm_a, xmm_b, m, 0);
+ cc.evex().vpinsrd(xmm_a, xmm_b, m, 0);
+ if (cc.is_64bit()) cc.evex().vpinsrq(xmm_a, xmm_b, m, 0);
+ cc.evex().vpinsrw(xmm_a, xmm_b, m, 0);
+ cc.evex().vplzcntd(xmm_a, m);
+ cc.evex().vplzcntd(ymm_a, m);
+ cc.evex().vplzcntd(zmm_a, m);
+ cc.evex().vplzcntq(xmm_a, m);
+ cc.evex().vplzcntq(ymm_a, m);
+ cc.evex().vplzcntq(zmm_a, m);
+ cc.evex().vpmadd52huq(xmm_a, xmm_b, m);
+ cc.evex().vpmadd52huq(ymm_a, ymm_b, m);
+ cc.evex().vpmadd52huq(zmm_a, zmm_b, m);
+ cc.evex().vpmadd52luq(xmm_a, xmm_b, m);
+ cc.evex().vpmadd52luq(ymm_a, ymm_b, m);
+ cc.evex().vpmadd52luq(zmm_a, zmm_b, m);
+ cc.evex().vpmaddubsw(xmm_a, xmm_b, m);
+ cc.evex().vpmaddubsw(ymm_a, ymm_b, m);
+ cc.evex().vpmaddubsw(zmm_a, zmm_b, m);
+ cc.evex().vpmaddwd(xmm_a, xmm_b, m);
+ cc.evex().vpmaddwd(ymm_a, ymm_b, m);
+ cc.evex().vpmaddwd(zmm_a, zmm_b, m);
+ cc.evex().vpmaxsb(xmm_a, xmm_b, m);
+ cc.evex().vpmaxsb(ymm_a, ymm_b, m);
+ cc.evex().vpmaxsb(zmm_a, zmm_b, m);
+ cc.evex().vpmaxsd(xmm_a, xmm_b, m);
+ cc.evex().vpmaxsd(ymm_a, ymm_b, m);
+ cc.evex().vpmaxsd(zmm_a, zmm_b, m);
+ cc.evex().vpmaxsq(xmm_a, xmm_b, m);
+ cc.evex().vpmaxsq(ymm_a, ymm_b, m);
+ cc.evex().vpmaxsq(zmm_a, zmm_b, m);
+ cc.evex().vpmaxsw(xmm_a, xmm_b, m);
+ cc.evex().vpmaxsw(ymm_a, ymm_b, m);
+ cc.evex().vpmaxsw(zmm_a, zmm_b, m);
+ cc.evex().vpmaxub(xmm_a, xmm_b, m);
+ cc.evex().vpmaxub(ymm_a, ymm_b, m);
+ cc.evex().vpmaxub(zmm_a, zmm_b, m);
+ cc.evex().vpmaxud(xmm_a, xmm_b, m);
+ cc.evex().vpmaxud(ymm_a, ymm_b, m);
+ cc.evex().vpmaxud(zmm_a, zmm_b, m);
+ cc.evex().vpmaxuq(xmm_a, xmm_b, m);
+ cc.evex().vpmaxuq(ymm_a, ymm_b, m);
+ cc.evex().vpmaxuq(zmm_a, zmm_b, m);
+ cc.evex().vpmaxuw(xmm_a, xmm_b, m);
+ cc.evex().vpmaxuw(ymm_a, ymm_b, m);
+ cc.evex().vpmaxuw(zmm_a, zmm_b, m);
+ cc.evex().vpminsb(xmm_a, xmm_b, m);
+ cc.evex().vpminsb(ymm_a, ymm_b, m);
+ cc.evex().vpminsb(zmm_a, zmm_b, m);
+ cc.evex().vpminsd(xmm_a, xmm_b, m);
+ cc.evex().vpminsd(ymm_a, ymm_b, m);
+ cc.evex().vpminsd(zmm_a, zmm_b, m);
+ cc.evex().vpminsq(xmm_a, xmm_b, m);
+ cc.evex().vpminsq(ymm_a, ymm_b, m);
+ cc.evex().vpminsq(zmm_a, zmm_b, m);
+ cc.evex().vpminsw(xmm_a, xmm_b, m);
+ cc.evex().vpminsw(ymm_a, ymm_b, m);
+ cc.evex().vpminsw(zmm_a, zmm_b, m);
+ cc.evex().vpminub(xmm_a, xmm_b, m);
+ cc.evex().vpminub(ymm_a, ymm_b, m);
+ cc.evex().vpminub(zmm_a, zmm_b, m);
+ cc.evex().vpminud(xmm_a, xmm_b, m);
+ cc.evex().vpminud(ymm_a, ymm_b, m);
+ cc.evex().vpminud(zmm_a, zmm_b, m);
+ cc.evex().vpminuq(xmm_a, xmm_b, m);
+ cc.evex().vpminuq(ymm_a, ymm_b, m);
+ cc.evex().vpminuq(zmm_a, zmm_b, m);
+ cc.evex().vpminuw(xmm_a, xmm_b, m);
+ cc.evex().vpminuw(ymm_a, ymm_b, m);
+ cc.evex().vpminuw(zmm_a, zmm_b, m);
+ cc.evex().vpmovdb(m, xmm_b);
+ cc.evex().vpmovdb(m, ymm_b);
+ cc.evex().vpmovdb(m, zmm_b);
+ cc.evex().vpmovdw(m, xmm_b);
+ cc.evex().vpmovdw(m, ymm_b);
+ cc.evex().vpmovdw(m, zmm_b);
+ cc.evex().vpmovqb(m, xmm_b);
+ cc.evex().vpmovqb(m, ymm_b);
+ cc.evex().vpmovqb(m, zmm_b);
+ cc.evex().vpmovqd(m, xmm_b);
+ cc.evex().vpmovqd(m, ymm_b);
+ cc.evex().vpmovqd(m, zmm_b);
+ cc.evex().vpmovqw(m, xmm_b);
+ cc.evex().vpmovqw(m, ymm_b);
+ cc.evex().vpmovqw(m, zmm_b);
+ cc.evex().vpmovsdb(m, xmm_b);
+ cc.evex().vpmovsdb(m, ymm_b);
+ cc.evex().vpmovsdb(m, zmm_b);
+ cc.evex().vpmovsdw(m, xmm_b);
+ cc.evex().vpmovsdw(m, ymm_b);
+ cc.evex().vpmovsdw(m, zmm_b);
+ cc.evex().vpmovsqb(m, xmm_b);
+ cc.evex().vpmovsqb(m, ymm_b);
+ cc.evex().vpmovsqb(m, zmm_b);
+ cc.evex().vpmovsqd(m, xmm_b);
+ cc.evex().vpmovsqd(m, ymm_b);
+ cc.evex().vpmovsqd(m, zmm_b);
+ cc.evex().vpmovsqw(m, xmm_b);
+ cc.evex().vpmovsqw(m, ymm_b);
+ cc.evex().vpmovsqw(m, zmm_b);
+ cc.evex().vpmovswb(m, xmm_b);
+ cc.evex().vpmovswb(m, ymm_b);
+ cc.evex().vpmovswb(m, zmm_b);
+ cc.evex().vpmovsxbd(xmm_a, m);
+ cc.evex().vpmovsxbd(ymm_a, m);
+ cc.evex().vpmovsxbd(zmm_a, m);
+ cc.evex().vpmovsxbq(xmm_a, m);
+ cc.evex().vpmovsxbq(ymm_a, m);
+ cc.evex().vpmovsxbq(zmm_a, m);
+ cc.evex().vpmovsxbw(xmm_a, m);
+ cc.evex().vpmovsxbw(ymm_a, m);
+ cc.evex().vpmovsxbw(zmm_a, m);
+ cc.evex().vpmovsxdq(xmm_a, m);
+ cc.evex().vpmovsxdq(ymm_a, m);
+ cc.evex().vpmovsxdq(zmm_a, m);
+ cc.evex().vpmovsxwd(xmm_a, m);
+ cc.evex().vpmovsxwd(ymm_a, m);
+ cc.evex().vpmovsxwd(zmm_a, m);
+ cc.evex().vpmovsxwq(xmm_a, m);
+ cc.evex().vpmovsxwq(ymm_a, m);
+ cc.evex().vpmovsxwq(zmm_a, m);
+ cc.evex().vpmovusdb(m, xmm_b);
+ cc.evex().vpmovusdb(m, ymm_b);
+ cc.evex().vpmovusdb(m, zmm_b);
+ cc.evex().vpmovusdw(m, xmm_b);
+ cc.evex().vpmovusdw(m, ymm_b);
+ cc.evex().vpmovusdw(m, zmm_b);
+ cc.evex().vpmovusqb(m, xmm_b);
+ cc.evex().vpmovusqb(m, ymm_b);
+ cc.evex().vpmovusqb(m, zmm_b);
+ cc.evex().vpmovusqd(m, xmm_b);
+ cc.evex().vpmovusqd(m, ymm_b);
+ cc.evex().vpmovusqd(m, zmm_b);
+ cc.evex().vpmovusqw(m, xmm_b);
+ cc.evex().vpmovusqw(m, ymm_b);
+ cc.evex().vpmovusqw(m, zmm_b);
+ cc.evex().vpmovuswb(m, xmm_b);
+ cc.evex().vpmovuswb(m, ymm_b);
+ cc.evex().vpmovuswb(m, zmm_b);
+ cc.evex().vpmovwb(m, xmm_b);
+ cc.evex().vpmovwb(m, ymm_b);
+ cc.evex().vpmovwb(m, zmm_b);
+ cc.evex().vpmovzxbd(xmm_a, m);
+ cc.evex().vpmovzxbd(ymm_a, m);
+ cc.evex().vpmovzxbd(zmm_a, m);
+ cc.evex().vpmovzxbq(xmm_a, m);
+ cc.evex().vpmovzxbq(ymm_a, m);
+ cc.evex().vpmovzxbq(zmm_a, m);
+ cc.evex().vpmovzxbw(xmm_a, m);
+ cc.evex().vpmovzxbw(ymm_a, m);
+ cc.evex().vpmovzxbw(zmm_a, m);
+ cc.evex().vpmovzxdq(xmm_a, m);
+ cc.evex().vpmovzxdq(ymm_a, m);
+ cc.evex().vpmovzxdq(zmm_a, m);
+ cc.evex().vpmovzxwd(xmm_a, m);
+ cc.evex().vpmovzxwd(ymm_a, m);
+ cc.evex().vpmovzxwd(zmm_a, m);
+ cc.evex().vpmovzxwq(xmm_a, m);
+ cc.evex().vpmovzxwq(ymm_a, m);
+ cc.evex().vpmovzxwq(zmm_a, m);
+ cc.evex().vpmuldq(xmm_a, xmm_b, m);
+ cc.evex().vpmuldq(ymm_a, ymm_b, m);
+ cc.evex().vpmuldq(zmm_a, zmm_b, m);
+ cc.evex().vpmulhrsw(xmm_a, xmm_b, m);
+ cc.evex().vpmulhrsw(ymm_a, ymm_b, m);
+ cc.evex().vpmulhrsw(zmm_a, zmm_b, m);
+ cc.evex().vpmulhuw(xmm_a, xmm_b, m);
+ cc.evex().vpmulhuw(ymm_a, ymm_b, m);
+ cc.evex().vpmulhuw(zmm_a, zmm_b, m);
+ cc.evex().vpmulhw(xmm_a, xmm_b, m);
+ cc.evex().vpmulhw(ymm_a, ymm_b, m);
+ cc.evex().vpmulhw(zmm_a, zmm_b, m);
+ cc.evex().vpmulld(xmm_a, xmm_b, m);
+ cc.evex().vpmulld(ymm_a, ymm_b, m);
+ cc.evex().vpmulld(zmm_a, zmm_b, m);
+ cc.evex().vpmullq(xmm_a, xmm_b, m);
+ cc.evex().vpmullq(ymm_a, ymm_b, m);
+ cc.evex().vpmullq(zmm_a, zmm_b, m);
+ cc.evex().vpmullw(xmm_a, xmm_b, m);
+ cc.evex().vpmullw(ymm_a, ymm_b, m);
+ cc.evex().vpmullw(zmm_a, zmm_b, m);
+ cc.evex().vpmultishiftqb(xmm_a, xmm_b, m);
+ cc.evex().vpmultishiftqb(ymm_a, ymm_b, m);
+ cc.evex().vpmultishiftqb(zmm_a, zmm_b, m);
+ cc.evex().vpmuludq(xmm_a, xmm_b, m);
+ cc.evex().vpmuludq(ymm_a, ymm_b, m);
+ cc.evex().vpmuludq(zmm_a, zmm_b, m);
+ cc.evex().vpopcntd(zmm_a, m);
+ cc.evex().vpopcntq(zmm_a, m);
+ cc.evex().vpord(xmm_a, xmm_b, m);
+ cc.evex().vpord(ymm_a, ymm_b, m);
+ cc.evex().vpord(zmm_a, zmm_b, m);
+ cc.evex().vporq(xmm_a, xmm_b, m);
+ cc.evex().vporq(ymm_a, ymm_b, m);
+ cc.evex().vporq(zmm_a, zmm_b, m);
+ cc.evex().vprold(xmm_a, m, 0);
+ cc.evex().vprold(ymm_a, m, 0);
+ cc.evex().vprold(zmm_a, m, 0);
+ cc.evex().vprolq(xmm_a, m, 0);
+ cc.evex().vprolq(ymm_a, m, 0);
+ cc.evex().vprolq(zmm_a, m, 0);
+ cc.evex().vprolvd(xmm_a, xmm_b, m);
+ cc.evex().vprolvd(ymm_a, ymm_b, m);
+ cc.evex().vprolvd(zmm_a, zmm_b, m);
+ cc.evex().vprolvq(xmm_a, xmm_b, m);
+ cc.evex().vprolvq(ymm_a, ymm_b, m);
+ cc.evex().vprolvq(zmm_a, zmm_b, m);
+ cc.evex().vprord(xmm_a, m, 0);
+ cc.evex().vprord(ymm_a, m, 0);
+ cc.evex().vprord(zmm_a, m, 0);
+ cc.evex().vprorq(xmm_a, m, 0);
+ cc.evex().vprorq(ymm_a, m, 0);
+ cc.evex().vprorq(zmm_a, m, 0);
+ cc.evex().vprorvd(xmm_a, xmm_b, m);
+ cc.evex().vprorvd(ymm_a, ymm_b, m);
+ cc.evex().vprorvd(zmm_a, zmm_b, m);
+ cc.evex().vprorvq(xmm_a, xmm_b, m);
+ cc.evex().vprorvq(ymm_a, ymm_b, m);
+ cc.evex().vprorvq(zmm_a, zmm_b, m);
+ cc.evex().vpsadbw(xmm_a, xmm_b, m);
+ cc.evex().vpsadbw(ymm_a, ymm_b, m);
+ cc.evex().vpsadbw(zmm_a, zmm_b, m);
+ cc.evex().k(kA).vpscatterdd(vx_ptr, xmm_b);
+ cc.evex().k(kA).vpscatterdd(vy_ptr, ymm_b);
+ cc.evex().k(kA).vpscatterdd(vz_ptr, zmm_b);
+ cc.evex().k(kA).vpscatterdq(vx_ptr, xmm_b);
+ cc.evex().k(kA).vpscatterdq(vx_ptr, ymm_b);
+ cc.evex().k(kA).vpscatterdq(vy_ptr, zmm_b);
+ cc.evex().k(kA).vpscatterqd(vx_ptr, xmm_b);
+ cc.evex().k(kA).vpscatterqd(vy_ptr, xmm_b);
+ cc.evex().k(kA).vpscatterqd(vz_ptr, ymm_b);
+ cc.evex().k(kA).vpscatterqq(vx_ptr, xmm_b);
+ cc.evex().k(kA).vpscatterqq(vy_ptr, ymm_b);
+ cc.evex().k(kA).vpscatterqq(vz_ptr, zmm_b);
+ cc.evex().vpshufb(xmm_a, xmm_b, m);
+ cc.evex().vpshufb(ymm_a, ymm_b, m);
+ cc.evex().vpshufb(zmm_a, zmm_b, m);
+ cc.evex().vpshufd(xmm_a, m, 0);
+ cc.evex().vpshufd(ymm_a, m, 0);
+ cc.evex().vpshufd(zmm_a, m, 0);
+ cc.evex().vpshufhw(xmm_a, m, 0);
+ cc.evex().vpshufhw(ymm_a, m, 0);
+ cc.evex().vpshufhw(zmm_a, m, 0);
+ cc.evex().vpshuflw(xmm_a, m, 0);
+ cc.evex().vpshuflw(ymm_a, m, 0);
+ cc.evex().vpshuflw(zmm_a, m, 0);
+ cc.evex().vpslld(xmm_a, xmm_b, m);
+ cc.evex().vpslld(xmm_a, m, 0);
+ cc.evex().vpslld(ymm_a, ymm_b, m);
+ cc.evex().vpslld(ymm_a, m, 0);
+ cc.evex().vpslld(zmm_a, zmm_b, m);
+ cc.evex().vpslld(zmm_a, m, 0);
+ cc.evex().vpslldq(xmm_a, m, 0);
+ cc.evex().vpslldq(ymm_a, m, 0);
+ cc.evex().vpslldq(zmm_a, m, 0);
+ cc.evex().vpsllq(xmm_a, xmm_b, m);
+ cc.evex().vpsllq(xmm_a, m, 0);
+ cc.evex().vpsllq(ymm_a, ymm_b, m);
+ cc.evex().vpsllq(ymm_a, m, 0);
+ cc.evex().vpsllq(zmm_a, zmm_b, m);
+ cc.evex().vpsllq(zmm_a, m, 0);
+ cc.evex().vpsllvd(xmm_a, xmm_b, m);
+ cc.evex().vpsllvd(ymm_a, ymm_b, m);
+ cc.evex().vpsllvd(zmm_a, zmm_b, m);
+ cc.evex().vpsllvq(xmm_a, xmm_b, m);
+ cc.evex().vpsllvq(ymm_a, ymm_b, m);
+ cc.evex().vpsllvq(zmm_a, zmm_b, m);
+ cc.evex().vpsllvw(xmm_a, xmm_b, m);
+ cc.evex().vpsllvw(ymm_a, ymm_b, m);
+ cc.evex().vpsllvw(zmm_a, zmm_b, m);
+ cc.evex().vpsllw(xmm_a, xmm_b, m);
+ cc.evex().vpsllw(xmm_a, m, 0);
+ cc.evex().vpsllw(ymm_a, ymm_b, m);
+ cc.evex().vpsllw(ymm_a, m, 0);
+ cc.evex().vpsllw(zmm_a, zmm_b, m);
+ cc.evex().vpsllw(zmm_a, m, 0);
+ cc.evex().vpsrad(xmm_a, xmm_b, m);
+ cc.evex().vpsrad(xmm_a, m, 0);
+ cc.evex().vpsrad(ymm_a, ymm_b, m);
+ cc.evex().vpsrad(ymm_a, m, 0);
+ cc.evex().vpsrad(zmm_a, zmm_b, m);
+ cc.evex().vpsrad(zmm_a, m, 0);
+ cc.evex().vpsraq(xmm_a, xmm_b, m);
+ cc.evex().vpsraq(xmm_a, m, 0);
+ cc.evex().vpsraq(ymm_a, ymm_b, m);
+ cc.evex().vpsraq(ymm_a, m, 0);
+ cc.evex().vpsraq(zmm_a, zmm_b, m);
+ cc.evex().vpsraq(zmm_a, m, 0);
+ cc.evex().vpsravd(xmm_a, xmm_b, m);
+ cc.evex().vpsravd(ymm_a, ymm_b, m);
+ cc.evex().vpsravd(zmm_a, zmm_b, m);
+ cc.evex().vpsravq(xmm_a, xmm_b, m);
+ cc.evex().vpsravq(ymm_a, ymm_b, m);
+ cc.evex().vpsravq(zmm_a, zmm_b, m);
+ cc.evex().vpsravw(xmm_a, xmm_b, m);
+ cc.evex().vpsravw(ymm_a, ymm_b, m);
+ cc.evex().vpsravw(zmm_a, zmm_b, m);
+ cc.evex().vpsraw(xmm_a, xmm_b, m);
+ cc.evex().vpsraw(xmm_a, m, 0);
+ cc.evex().vpsraw(ymm_a, ymm_b, m);
+ cc.evex().vpsraw(ymm_a, m, 0);
+ cc.evex().vpsraw(zmm_a, zmm_b, m);
+ cc.evex().vpsraw(zmm_a, m, 0);
+ cc.evex().vpsrld(xmm_a, xmm_b, m);
+ cc.evex().vpsrld(xmm_a, m, 0);
+ cc.evex().vpsrld(ymm_a, ymm_b, m);
+ cc.evex().vpsrld(ymm_a, m, 0);
+ cc.evex().vpsrld(zmm_a, zmm_b, m);
+ cc.evex().vpsrld(zmm_a, m, 0);
+ cc.evex().vpsrldq(xmm_a, m, 0);
+ cc.evex().vpsrldq(ymm_a, m, 0);
+ cc.evex().vpsrldq(zmm_a, m, 0);
+ cc.evex().vpsrlq(xmm_a, xmm_b, m);
+ cc.evex().vpsrlq(xmm_a, m, 0);
+ cc.evex().vpsrlq(ymm_a, ymm_b, m);
+ cc.evex().vpsrlq(ymm_a, m, 0);
+ cc.evex().vpsrlq(zmm_a, zmm_b, m);
+ cc.evex().vpsrlq(zmm_a, m, 0);
+ cc.evex().vpsrlvd(xmm_a, xmm_b, m);
+ cc.evex().vpsrlvd(ymm_a, ymm_b, m);
+ cc.evex().vpsrlvd(zmm_a, zmm_b, m);
+ cc.evex().vpsrlvq(xmm_a, xmm_b, m);
+ cc.evex().vpsrlvq(ymm_a, ymm_b, m);
+ cc.evex().vpsrlvq(zmm_a, zmm_b, m);
+ cc.evex().vpsrlvw(xmm_a, xmm_b, m);
+ cc.evex().vpsrlvw(ymm_a, ymm_b, m);
+ cc.evex().vpsrlvw(zmm_a, zmm_b, m);
+ cc.evex().vpsrlw(xmm_a, xmm_b, m);
+ cc.evex().vpsrlw(xmm_a, m, 0);
+ cc.evex().vpsrlw(ymm_a, ymm_b, m);
+ cc.evex().vpsrlw(ymm_a, m, 0);
+ cc.evex().vpsrlw(zmm_a, zmm_b, m);
+ cc.evex().vpsrlw(zmm_a, m, 0);
+ cc.evex().vpsubb(xmm_a, xmm_b, m);
+ cc.evex().vpsubb(ymm_a, ymm_b, m);
+ cc.evex().vpsubb(zmm_a, zmm_b, m);
+ cc.evex().vpsubd(xmm_a, xmm_b, m);
+ cc.evex().vpsubd(ymm_a, ymm_b, m);
+ cc.evex().vpsubd(zmm_a, zmm_b, m);
+ cc.evex().vpsubq(xmm_a, xmm_b, m);
+ cc.evex().vpsubq(ymm_a, ymm_b, m);
+ cc.evex().vpsubq(zmm_a, zmm_b, m);
+ cc.evex().vpsubsb(xmm_a, xmm_b, m);
+ cc.evex().vpsubsb(ymm_a, ymm_b, m);
+ cc.evex().vpsubsb(zmm_a, zmm_b, m);
+ cc.evex().vpsubsw(xmm_a, xmm_b, m);
+ cc.evex().vpsubsw(ymm_a, ymm_b, m);
+ cc.evex().vpsubsw(zmm_a, zmm_b, m);
+ cc.evex().vpsubusb(xmm_a, xmm_b, m);
+ cc.evex().vpsubusb(ymm_a, ymm_b, m);
+ cc.evex().vpsubusb(zmm_a, zmm_b, m);
+ cc.evex().vpsubusw(xmm_a, xmm_b, m);
+ cc.evex().vpsubusw(ymm_a, ymm_b, m);
+ cc.evex().vpsubusw(zmm_a, zmm_b, m);
+ cc.evex().vpsubw(xmm_a, xmm_b, m);
+ cc.evex().vpsubw(ymm_a, ymm_b, m);
+ cc.evex().vpsubw(zmm_a, zmm_b, m);
+ cc.evex().vpternlogd(xmm_a, xmm_b, m, 0);
+ cc.evex().vpternlogd(ymm_a, ymm_b, m, 0);
+ cc.evex().vpternlogd(zmm_a, zmm_b, m, 0);
+ cc.evex().vpternlogq(xmm_a, xmm_b, m, 0);
+ cc.evex().vpternlogq(ymm_a, ymm_b, m, 0);
+ cc.evex().vpternlogq(zmm_a, zmm_b, m, 0);
+ cc.evex().vptestmb(kA, xmm_b, m);
+ cc.evex().vptestmb(kA, ymm_b, m);
+ cc.evex().vptestmb(kA, zmm_b, m);
+ cc.evex().vptestmd(kA, xmm_b, m);
+ cc.evex().vptestmd(kA, ymm_b, m);
+ cc.evex().vptestmd(kA, zmm_b, m);
+ cc.evex().vptestmq(kA, xmm_b, m);
+ cc.evex().vptestmq(kA, ymm_b, m);
+ cc.evex().vptestmq(kA, zmm_b, m);
+ cc.evex().vptestmw(kA, xmm_b, m);
+ cc.evex().vptestmw(kA, ymm_b, m);
+ cc.evex().vptestmw(kA, zmm_b, m);
+ cc.evex().vptestnmb(kA, xmm_b, m);
+ cc.evex().vptestnmb(kA, ymm_b, m);
+ cc.evex().vptestnmb(kA, zmm_b, m);
+ cc.evex().vptestnmd(kA, xmm_b, m);
+ cc.evex().vptestnmd(kA, ymm_b, m);
+ cc.evex().vptestnmd(kA, zmm_b, m);
+ cc.evex().vptestnmq(kA, xmm_b, m);
+ cc.evex().vptestnmq(kA, ymm_b, m);
+ cc.evex().vptestnmq(kA, zmm_b, m);
+ cc.evex().vptestnmw(kA, xmm_b, m);
+ cc.evex().vptestnmw(kA, ymm_b, m);
+ cc.evex().vptestnmw(kA, zmm_b, m);
+ cc.evex().vpunpckhbw(xmm_a, xmm_b, m);
+ cc.evex().vpunpckhbw(ymm_a, ymm_b, m);
+ cc.evex().vpunpckhbw(zmm_a, zmm_b, m);
+ cc.evex().vpunpckhdq(xmm_a, xmm_b, m);
+ cc.evex().vpunpckhdq(ymm_a, ymm_b, m);
+ cc.evex().vpunpckhdq(zmm_a, zmm_b, m);
+ cc.evex().vpunpckhqdq(xmm_a, xmm_b, m);
+ cc.evex().vpunpckhqdq(ymm_a, ymm_b, m);
+ cc.evex().vpunpckhqdq(zmm_a, zmm_b, m);
+ cc.evex().vpunpckhwd(xmm_a, xmm_b, m);
+ cc.evex().vpunpckhwd(ymm_a, ymm_b, m);
+ cc.evex().vpunpckhwd(zmm_a, zmm_b, m);
+ cc.evex().vpunpcklbw(xmm_a, xmm_b, m);
+ cc.evex().vpunpcklbw(ymm_a, ymm_b, m);
+ cc.evex().vpunpcklbw(zmm_a, zmm_b, m);
+ cc.evex().vpunpckldq(xmm_a, xmm_b, m);
+ cc.evex().vpunpckldq(ymm_a, ymm_b, m);
+ cc.evex().vpunpckldq(zmm_a, zmm_b, m);
+ cc.evex().vpunpcklqdq(xmm_a, xmm_b, m);
+ cc.evex().vpunpcklqdq(ymm_a, ymm_b, m);
+ cc.evex().vpunpcklqdq(zmm_a, zmm_b, m);
+ cc.evex().vpunpcklwd(xmm_a, xmm_b, m);
+ cc.evex().vpunpcklwd(ymm_a, ymm_b, m);
+ cc.evex().vpunpcklwd(zmm_a, zmm_b, m);
+ cc.evex().vpxord(xmm_a, xmm_b, m);
+ cc.evex().vpxord(ymm_a, ymm_b, m);
+ cc.evex().vpxord(zmm_a, zmm_b, m);
+ cc.evex().vpxorq(xmm_a, xmm_b, m);
+ cc.evex().vpxorq(ymm_a, ymm_b, m);
+ cc.evex().vpxorq(zmm_a, zmm_b, m);
+ cc.evex().vrangepd(xmm_a, xmm_b, m, 0);
+ cc.evex().vrangepd(ymm_a, ymm_b, m, 0);
+ cc.evex().vrangepd(zmm_a, zmm_b, m, 0);
+ cc.evex().vrangeps(xmm_a, xmm_b, m, 0);
+ cc.evex().vrangeps(ymm_a, ymm_b, m, 0);
+ cc.evex().vrangeps(zmm_a, zmm_b, m, 0);
+ cc.evex().vrangesd(xmm_a, xmm_b, m, 0);
+ cc.evex().vrangess(xmm_a, xmm_b, m, 0);
+ cc.evex().vrcp14pd(xmm_a, m);
+ cc.evex().vrcp14pd(ymm_a, m);
+ cc.evex().vrcp14pd(zmm_a, m);
+ cc.evex().vrcp14ps(xmm_a, m);
+ cc.evex().vrcp14ps(ymm_a, m);
+ cc.evex().vrcp14ps(zmm_a, m);
+ cc.evex().vrcp14sd(xmm_a, xmm_b, m);
+ cc.evex().vrcp14ss(xmm_a, xmm_b, m);
+ cc.evex().vreducepd(xmm_a, m, 0);
+ cc.evex().vreducepd(ymm_a, m, 0);
+ cc.evex().vreducepd(zmm_a, m, 0);
+ cc.evex().vreduceps(xmm_a, m, 0);
+ cc.evex().vreduceps(ymm_a, m, 0);
+ cc.evex().vreduceps(zmm_a, m, 0);
+ cc.evex().vreducesd(xmm_a, xmm_b, m, 0);
+ cc.evex().vreducess(xmm_a, xmm_b, m, 0);
+ cc.evex().vrndscalepd(xmm_a, m, 0);
+ cc.evex().vrndscalepd(ymm_a, m, 0);
+ cc.evex().vrndscalepd(zmm_a, m, 0);
+ cc.evex().vrndscaleps(xmm_a, m, 0);
+ cc.evex().vrndscaleps(ymm_a, m, 0);
+ cc.evex().vrndscaleps(zmm_a, m, 0);
+ cc.evex().vrndscalesd(xmm_a, xmm_b, m, 0);
+ cc.evex().vrndscaless(xmm_a, xmm_b, m, 0);
+ cc.evex().vrsqrt14pd(xmm_a, m);
+ cc.evex().vrsqrt14pd(ymm_a, m);
+ cc.evex().vrsqrt14pd(zmm_a, m);
+ cc.evex().vrsqrt14ps(xmm_a, m);
+ cc.evex().vrsqrt14ps(ymm_a, m);
+ cc.evex().vrsqrt14ps(zmm_a, m);
+ cc.evex().vrsqrt14sd(xmm_a, xmm_b, m);
+ cc.evex().vrsqrt14ss(xmm_a, xmm_b, m);
+ cc.evex().vscalefpd(xmm_a, xmm_b, m);
+ cc.evex().vscalefpd(ymm_a, ymm_b, m);
+ cc.evex().vscalefpd(zmm_a, zmm_b, m);
+ cc.evex().vscalefps(xmm_a, xmm_b, m);
+ cc.evex().vscalefps(ymm_a, ymm_b, m);
+ cc.evex().vscalefps(zmm_a, zmm_b, m);
+ cc.evex().vscalefsd(xmm_a, xmm_b, m);
+ cc.evex().vscalefss(xmm_a, xmm_b, m);
+ cc.evex().k(kA).vscatterdpd(vx_ptr, xmm_b);
+ cc.evex().k(kA).vscatterdpd(vx_ptr, ymm_b);
+ cc.evex().k(kA).vscatterdpd(vy_ptr, zmm_b);
+ cc.evex().k(kA).vscatterdps(vx_ptr, xmm_b);
+ cc.evex().k(kA).vscatterdps(vy_ptr, ymm_b);
+ cc.evex().k(kA).vscatterdps(vz_ptr, zmm_b);
+ cc.evex().k(kA).vscatterqpd(vx_ptr, xmm_b);
+ cc.evex().k(kA).vscatterqpd(vy_ptr, ymm_b);
+ cc.evex().k(kA).vscatterqpd(vz_ptr, zmm_b);
+ cc.evex().k(kA).vscatterqps(vx_ptr, xmm_b);
+ cc.evex().k(kA).vscatterqps(vy_ptr, xmm_b);
+ cc.evex().k(kA).vscatterqps(vz_ptr, ymm_b);
+ cc.evex().vshuff32x4(ymm_a, ymm_b, m, 0);
+ cc.evex().vshuff32x4(zmm_a, zmm_b, m, 0);
+ cc.evex().vshuff64x2(ymm_a, ymm_b, m, 0);
+ cc.evex().vshuff64x2(zmm_a, zmm_b, m, 0);
+ cc.evex().vshufi32x4(ymm_a, ymm_b, m, 0);
+ cc.evex().vshufi32x4(zmm_a, zmm_b, m, 0);
+ cc.evex().vshufi64x2(ymm_a, ymm_b, m, 0);
+ cc.evex().vshufi64x2(zmm_a, zmm_b, m, 0);
+ cc.evex().vshufpd(xmm_a, xmm_b, m, 0);
+ cc.evex().vshufpd(ymm_a, ymm_b, m, 0);
+ cc.evex().vshufpd(zmm_a, zmm_b, m, 0);
+ cc.evex().vshufps(xmm_a, xmm_b, m, 0);
+ cc.evex().vshufps(ymm_a, ymm_b, m, 0);
+ cc.evex().vshufps(zmm_a, zmm_b, m, 0);
+ cc.evex().vsqrtpd(xmm_a, m);
+ cc.evex().vsqrtpd(ymm_a, m);
+ cc.evex().vsqrtpd(zmm_a, m);
+ cc.evex().vsqrtps(xmm_a, m);
+ cc.evex().vsqrtps(ymm_a, m);
+ cc.evex().vsqrtps(zmm_a, m);
+ cc.evex().vsqrtsd(xmm_a, xmm_b, m);
+ cc.evex().vsqrtss(xmm_a, xmm_b, m);
+ cc.evex().vsubpd(xmm_a, xmm_b, m);
+ cc.evex().vsubpd(ymm_a, ymm_b, m);
+ cc.evex().vsubpd(zmm_a, zmm_b, m);
+ cc.evex().vsubps(xmm_a, xmm_b, m);
+ cc.evex().vsubps(ymm_a, ymm_b, m);
+ cc.evex().vsubps(zmm_a, zmm_b, m);
+ cc.evex().vsubsd(xmm_a, xmm_b, m);
+ cc.evex().vsubss(xmm_a, xmm_b, m);
+ cc.evex().vucomisd(xmm_a, m);
+ cc.evex().vucomiss(xmm_a, m);
+ cc.evex().vunpckhpd(xmm_a, xmm_b, m);
+ cc.evex().vunpckhpd(ymm_a, ymm_b, m);
+ cc.evex().vunpckhpd(zmm_a, zmm_b, m);
+ cc.evex().vunpckhps(xmm_a, xmm_b, m);
+ cc.evex().vunpckhps(ymm_a, ymm_b, m);
+ cc.evex().vunpckhps(zmm_a, zmm_b, m);
+ cc.evex().vunpcklpd(xmm_a, xmm_b, m);
+ cc.evex().vunpcklpd(ymm_a, ymm_b, m);
+ cc.evex().vunpcklpd(zmm_a, zmm_b, m);
+ cc.evex().vunpcklps(xmm_a, xmm_b, m);
+ cc.evex().vunpcklps(ymm_a, ymm_b, m);
+ cc.evex().vunpcklps(zmm_a, zmm_b, m);
+ cc.evex().vxorpd(xmm_a, xmm_b, m);
+ cc.evex().vxorpd(ymm_a, ymm_b, m);
+ cc.evex().vxorpd(zmm_a, zmm_b, m);
+ cc.evex().vxorps(xmm_a, xmm_b, m);
+ cc.evex().vxorps(ymm_a, ymm_b, m);
+ cc.evex().vxorps(zmm_a, zmm_b, m);
+}
+
+// Generates a long sequence of AVX512 instructions.
+template<typename Emitter>
+static void generate_avx512_sequence_internal(
+ Emitter& cc,
+ InstForm form,
+ const x86::Gp& gp,
+ const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
+ const x86::Vec& vec_a, const x86::Vec& vec_b, const x86::Vec& vec_c, const x86::Vec& vec_d) {
+
+ if (form == InstForm::kReg)
+ generate_avx512_sequence_internal_reg_only(cc, gp, kA, kB, kC, vec_a, vec_b, vec_c, vec_d);
+ else
+ generate_avx512_sequence_internal_reg_mem(cc, gp, kA, kB, kC, vec_a, vec_b, vec_c, vec_d);
+}
+
+static void generate_avx512_sequence(BaseEmitter& emitter, InstForm form, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp gp = cc.new_gpz("gp");
+ Vec vec_a = cc.new_zmm("vec_a");
+ Vec vec_b = cc.new_zmm("vec_b");
+ Vec vec_c = cc.new_zmm("vec_c");
+ Vec vec_d = cc.new_zmm("vec_d");
+
+ KReg kA = cc.new_kq("kA");
+ KReg kB = cc.new_kq("kB");
+ KReg kC = cc.new_kq("kC");
+
+ cc.add_func(FuncSignature::build<void>());
+ generate_avx512_sequence_internal(cc, form, gp, kA, kB, kC, vec_a, vec_b, vec_c, vec_d);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_avx512_sequence_internal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_avx512_sequence_internal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ generate_avx512_sequence_internal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_avx512_sequence_internal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
+ }
+
+ return;
+ }
+}
+
+template<typename EmitterFn>
+static void benchmark_x86_function(Arch arch, uint32_t num_iterations, const char* description, const EmitterFn& emitter_fn) noexcept {
+ CodeHolder code;
+ printf("%s:\n", description);
+
+ uint32_t instruction_count = 0;
+
+#ifndef ASMJIT_NO_BUILDER
+ instruction_count = asmjit_perf_utils::calculate_instruction_count<x86::Builder>(code, arch, [&](x86::Builder& cc) {
+ emitter_fn(cc, false);
+ });
+#endif
+
+ asmjit_perf_utils::bench<x86::Assembler>(code, arch, num_iterations, "[raw]", instruction_count, [&](x86::Assembler& cc) {
+ emitter_fn(cc, false);
+ });
+
+ asmjit_perf_utils::bench<x86::Assembler>(code, arch, num_iterations, "[validated]", instruction_count, [&](x86::Assembler& cc) {
+ cc.add_diagnostic_options(DiagnosticOptions::kValidateAssembler);
+ emitter_fn(cc, false);
+ });
+
+ asmjit_perf_utils::bench<x86::Assembler>(code, arch, num_iterations, "[prolog/epilog]", instruction_count, [&](x86::Assembler& cc) {
+ emitter_fn(cc, true);
+ });
+
+#ifndef ASMJIT_NO_BUILDER
+ asmjit_perf_utils::bench<x86::Builder>(code, arch, num_iterations, "[no-asm]", instruction_count, [&](x86::Builder& cc) {
+ emitter_fn(cc, false);
+ });
+
+ asmjit_perf_utils::bench<x86::Builder>(code, arch, num_iterations, "[finalized]", instruction_count, [&](x86::Builder& cc) {
+ emitter_fn(cc, false);
+ cc.finalize();
+ });
+
+ asmjit_perf_utils::bench<x86::Builder>(code, arch, num_iterations, "[prolog/epilog]", instruction_count, [&](x86::Builder& cc) {
+ emitter_fn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+
+ asmjit_perf_utils::bench<x86::Compiler>(code, arch, num_iterations, "[no-asm]", instruction_count, [&](x86::Compiler& cc) {
+ emitter_fn(cc, true);
+ });
+
+ asmjit_perf_utils::bench<x86::Compiler>(code, arch, num_iterations, "[finalized]", instruction_count, [&](x86::Compiler& cc) {
+ emitter_fn(cc, true);
+ cc.finalize();
+ });
+#endif
+
+ printf("\n");
+}
+
+void benchmark_x86_emitters(uint32_t num_iterations, bool test_x86, bool test_x64) {
+ uint32_t i = 0;
+ uint32_t n = 0;
+
+ Arch archs[2] {};
+
+ if (test_x86) archs[n++] = Arch::kX86;
+ if (test_x64) archs[n++] = Arch::kX64;
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "Empty function (mov + return from function)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_empty_function(emitter, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "4-Ops sequence (4 ops + return from function)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_n_ops_sequence(emitter, 4, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "16-Ops sequence (16 ops + return from function)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_n_ops_sequence(emitter, 16, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "32-Ops sequence (32 ops + return from function)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_n_ops_sequence(emitter, 32, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "64-Ops sequence (64 ops + return from function)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_n_ops_sequence(emitter, 64, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "GpSequence<Reg> (Sequence of GP instructions - reg-only)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_gp_sequence(emitter, InstForm::kReg, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "GpSequence<Mem> (Sequence of GP instructions - reg/mem)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_gp_sequence(emitter, InstForm::kMem, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "SseSequence<Reg> (sequence of SSE+ instructions - reg-only)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_sse_sequence(emitter, InstForm::kReg, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "SseSequence<Mem> (sequence of SSE+ instructions - reg/mem)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_sse_sequence(emitter, InstForm::kMem, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "AvxSequence<Reg> (sequence of AVX+ instructions - reg-only)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_avx_sequence(emitter, InstForm::kReg, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "AvxSequence<Mem> (sequence of AVX+ instructions - reg/mem)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_avx_sequence(emitter, InstForm::kMem, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "Avx512Sequence<Reg> (sequence of AVX512+ instructions - reg-only)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_avx512_sequence(emitter, InstForm::kReg, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "Avx512Sequence<Mem> (sequence of AVX512+ instructions - reg/mem)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ generate_avx512_sequence(emitter, InstForm::kMem, emit_prolog_epilog);
+ });
+ }
+
+ for (i = 0; i < n; i++) {
+ static const char description[] = "SseAlphaBlend (alpha-blend function with labels and jumps)";
+ benchmark_x86_function(archs[i], num_iterations, description, [](BaseEmitter& emitter, bool emit_prolog_epilog) {
+ asmtest::generate_sse_alpha_blend(emitter, emit_prolog_epilog);
+ });
+ }
+}
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_overhead.cpp b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_overhead.cpp
new file mode 100644
index 00000000000..94ef13774af
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_overhead.cpp
@@ -0,0 +1,431 @@
+#include <asmjit/host.h>
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/commons/cmdline.h>
+#include <asmjit-testing/commons/performancetimer.h>
+
+#include <stdint.h>
+
+using namespace asmjit;
+
+static void print_app_info(size_t n) noexcept {
+ printf("AsmJit Benchmark Overhead v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+
+ printf("This benchmark was designed to benchmark the cost of initialization and\n"
+ "reset (or reinitialization) of CodeHolder and Emitters; and the cost of\n"
+ "moving a minimal assembled function to executable memory. Each output line\n"
+ "provides the following columns:\n"
+ "\n"
+ " - <Test> - test case name - either 'CodeHolder' only or an emitter\n"
+ " - Strategy - reusability strategy - whether init/reset or reinit is used\n"
+ " - Reuse Only - no code generation, no use of emitter except for init/reuse\n"
+ " - Func - function was assembled\n"
+ " - RA - function was compiled (registers allocated) (Compiler)\n"
+ " - Asm - function was finalized & serialized (Builder/Compiler)\n"
+ " - RT - function was added to JitRuntime and then removed from it\n"
+ "\n"
+ "Essentially the output provides an insight into the cost of reusing\n"
+ "CodeHolder and other emitters, and the cost of assembling, finalizing,\n"
+ "and moving the assembled code into executable memory by separating each\n"
+ "phase.\n\n"
+ );
+
+ printf("The number of iterations benchmarked: %zu (override by --count=n)\n", n);
+ printf("\n");
+}
+
+enum class AssemblerOp {
+ kNone,
+ kRT
+};
+
+enum class BuilderOp {
+ kNone,
+ kFinalize,
+ kFinalize_RT
+};
+
+enum class CompilerOp {
+ kNone,
+ kCompile,
+ kFinalize,
+ kFinalize_RT
+};
+
+#if !defined(ASMJIT_NO_JIT)
+
+class MyErrorHandler : public ErrorHandler {
+public:
+ void handle_error(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) override {
+ Support::maybe_unused(err, origin);
+ fprintf(stderr, "AsmJit error: %s\n", message);
+ }
+};
+
+enum class InitStrategy : uint32_t {
+ kInitReset,
+ kReinit
+};
+
+static inline void bench_codeholder(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+ }
+ }
+}
+
+#if ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86)
+template<typename EmitterT>
+static ASMJIT_INLINE void emit_raw_func(EmitterT& emitter) {
+ emitter.mov(x86::eax, 0);
+ emitter.ret();
+}
+
+template<typename CompilerT>
+static ASMJIT_INLINE void compile_raw_func(CompilerT& cc) {
+ x86::Gp r = cc.new_gp32();
+ cc.mov(r, 0);
+ cc.ret(r);
+}
+#endif
+
+#if ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)
+template<typename EmitterT>
+static ASMJIT_INLINE void emit_raw_func(EmitterT& emitter) {
+ emitter.mov(a64::w0, 0);
+ emitter.ret(a64::x30);
+}
+
+template<typename CompilerT>
+static ASMJIT_INLINE void compile_raw_func(CompilerT& cc) {
+ a64::Gp gp = cc.new_gp32();
+ cc.mov(gp, 0);
+ cc.ret(gp);
+}
+#endif
+
+#if defined(ASMJIT_HAS_HOST_BACKEND)
+template<typename AssemblerT>
+static inline void bench_assembler(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+ AssemblerT a;
+ MyErrorHandler eh;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&a);
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&a);
+
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+ }
+ }
+}
+
+template<typename AssemblerT, AssemblerOp op>
+static inline void bench_assembler_func(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+ AssemblerT a;
+ MyErrorHandler eh;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&a);
+ emit_raw_func(a);
+
+ if constexpr (op == AssemblerOp::kRT) {
+ using Func = uint32_t(*)(void);
+ Func fn;
+ rt.add(&fn, &code);
+ rt.release(fn);
+ }
+
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&a);
+
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+ emit_raw_func(a);
+
+ if constexpr (op == AssemblerOp::kRT) {
+ using Func = uint32_t(*)(void);
+ Func fn;
+ rt.add(&fn, &code);
+ rt.release(fn);
+ }
+ }
+ }
+}
+#endif
+
+#if defined(ASMJIT_HAS_HOST_BACKEND) && !defined(ASMJIT_NO_BUILDER)
+template<typename BuilderT>
+static inline void bench_builder(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+ BuilderT b;
+ MyErrorHandler eh;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&b);
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&b);
+
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+ }
+ }
+}
+
+template<typename BuilderT, BuilderOp op>
+static inline void bench_builder_func(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+ BuilderT b;
+ MyErrorHandler eh;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&b);
+ emit_raw_func(b);
+
+ if constexpr (op >= BuilderOp::kFinalize) {
+ b.finalize();
+ if constexpr (op == BuilderOp::kFinalize_RT) {
+ using Func = uint32_t(*)(void);
+ Func fn;
+ rt.add(&fn, &code);
+ rt.release(fn);
+ }
+ }
+
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&b);
+
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+ emit_raw_func(b);
+
+ if constexpr (op >= BuilderOp::kFinalize) {
+ b.finalize();
+ if constexpr (op == BuilderOp::kFinalize_RT) {
+ using Func = uint32_t(*)(void);
+ Func fn;
+ rt.add(&fn, &code);
+ rt.release(fn);
+ }
+ }
+ }
+ }
+}
+#endif // ASMJIT_HAS_HOST_BACKEND && !ASMJIT_NO_BUILDER
+
+#if defined(ASMJIT_HAS_HOST_BACKEND) && !defined(ASMJIT_NO_COMPILER)
+template<typename CompilerT>
+static inline void bench_compiler(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+ CompilerT cc;
+ MyErrorHandler eh;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&cc);
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&cc);
+
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+ }
+ }
+}
+
+template<typename CompilerT, CompilerOp op>
+static inline void bench_compiler_func(InitStrategy strategy, size_t count) {
+ JitRuntime rt;
+ CodeHolder code;
+ CompilerT cc;
+ MyErrorHandler eh;
+
+ if (strategy == InitStrategy::kInitReset) {
+ for (size_t i = 0; i < count; i++) {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&cc);
+
+ (void)cc.add_func(FuncSignature::build<uint32_t>());
+ compile_raw_func(cc);
+ cc.end_func();
+
+ if constexpr (op == CompilerOp::kCompile) {
+ cc.run_passes();
+ }
+ else if constexpr (op >= CompilerOp::kFinalize) {
+ cc.finalize();
+ if constexpr (op == CompilerOp::kFinalize_RT) {
+ using Func = uint32_t(*)(void);
+ Func fn;
+ rt.add(&fn, &code);
+ rt.release(fn);
+ }
+ }
+
+ code.reset();
+ }
+ }
+ else {
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+ code.attach(&cc);
+
+ for (size_t i = 0; i < count; i++) {
+ code.reinit();
+
+ (void)cc.add_func(FuncSignature::build<uint32_t>());
+ compile_raw_func(cc);
+ cc.end_func();
+
+ if constexpr (op == CompilerOp::kCompile) {
+ cc.run_passes();
+ }
+ else if constexpr (op >= CompilerOp::kFinalize) {
+ cc.finalize();
+ if constexpr (op == CompilerOp::kFinalize_RT) {
+ using Func = uint32_t(*)(void);
+ Func fn;
+ rt.add(&fn, &code);
+ rt.release(fn);
+ }
+ }
+ }
+ }
+}
+#endif // ASMJIT_HAS_HOST_BACKEND && !ASMJIT_NO_COMPILER
+
+template<typename Lambda>
+static inline void test_perf(const char* group, const char* params, InitStrategy strategy, size_t n, Lambda&& fn) {
+ PerformanceTimer timer;
+ const char* strategy_name = strategy == InitStrategy::kInitReset ? "init/reset" : "reinit";
+
+ timer.start();
+ fn(strategy, n);
+ timer.stop();
+
+ printf("| %-10s | %-10s | %-23s| %8.1f [ms] |\n", group, strategy_name, params, timer.duration());
+}
+
+static inline void test_perf_all(InitStrategy strategy, size_t n) {
+ using IS = InitStrategy;
+
+ const char frame[] = "+------------+------------+------------------------+---------------+\n";
+ const char header[] = "| Group | Strategy | Features Used | Time [ms] |\n";
+
+ printf(frame);
+ printf(header);
+ printf(frame);
+
+ test_perf("CodeHolder", "Reuse Only" , strategy, n, [](IS s, size_t n) { bench_codeholder(s, n); });
+
+#if defined(ASMJIT_HAS_HOST_BACKEND)
+ test_perf("Assembler ", "Reuse Only" , strategy, n, [](IS s, size_t n) { bench_assembler<host::Assembler>(s, n); });
+ test_perf("Assembler ", "Func" , strategy, n, [](IS s, size_t n) { bench_assembler_func<host::Assembler, AssemblerOp::kNone>(s, n); });
+ test_perf("Assembler ", "Func + RT" , strategy, n, [](IS s, size_t n) { bench_assembler_func<host::Assembler, AssemblerOp::kRT>(s, n); });
+#endif
+
+#if defined(ASMJIT_HAS_HOST_BACKEND) && !defined(ASMJIT_NO_BUILDER)
+ test_perf("Builder ", "Reuse Only" , strategy, n, [](IS s, size_t n) { bench_builder<host::Builder>(s, n); });
+ test_perf("Builder ", "Func" , strategy, n, [](IS s, size_t n) { bench_builder_func<host::Builder, BuilderOp::kNone>(s, n); });
+ test_perf("Builder ", "Func + Asm" , strategy, n, [](IS s, size_t n) { bench_builder_func<host::Builder, BuilderOp::kFinalize>(s, n); });
+ test_perf("Builder ", "Func + Asm + RT" , strategy, n, [](IS s, size_t n) { bench_builder_func<host::Builder, BuilderOp::kFinalize_RT>(s, n); });
+#endif
+
+#if defined(ASMJIT_HAS_HOST_BACKEND) && !defined(ASMJIT_NO_COMPILER)
+
+ test_perf("Compiler ", "Reuse Only" , strategy, n, [](IS s, size_t n) { bench_compiler<host::Compiler>(s, n); });
+ test_perf("Compiler ", "Func" , strategy, n, [](IS s, size_t n) { bench_compiler_func<host::Compiler, CompilerOp::kNone>(s, n); });
+ test_perf("Compiler ", "Func + RA" , strategy, n, [](IS s, size_t n) { bench_compiler_func<host::Compiler, CompilerOp::kCompile>(s, n); });
+ test_perf("Compiler ", "Func + RA + Asm" , strategy, n, [](IS s, size_t n) { bench_compiler_func<host::Compiler, CompilerOp::kFinalize>(s, n); });
+ test_perf("Compiler ", "Func + RA + Asm + RT", strategy, n, [](IS s, size_t n) { bench_compiler_func<host::Compiler, CompilerOp::kFinalize_RT>(s, n); });
+#endif
+
+ printf(frame);
+}
+
+int main(int argc, char* argv[]) {
+ CmdLine cmd_line(argc, argv);
+ size_t n = cmd_line.value_as_uint("--count", 1000000);
+
+ print_app_info(n);
+
+ test_perf_all(InitStrategy::kInitReset, n);
+ printf("\n");
+ test_perf_all(InitStrategy::kReinit, n);
+
+ return 0;
+}
+
+#else
+
+int main() {
+ print_app_info(0);
+ printf("!!AsmJit Benchmark Reuse is currently disabled: <ASMJIT_NO_JIT> or unsuitable target architecture !!\n");
+ return 0;
+}
+
+#endif
diff --git a/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_regalloc.cpp b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_regalloc.cpp
new file mode 100644
index 00000000000..60c52c7c38b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_regalloc.cpp
@@ -0,0 +1,517 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See asmjit.h or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86.h>
+#endif // !ASMJIT_NO_X86
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/a64.h>
+#endif // !ASMJIT_NO_AARCH64
+
+#include <asmjit-testing/commons/asmjitutils.h>
+
+#if !defined(ASMJIT_NO_COMPILER)
+ #include <asmjit-testing/commons/cmdline.h>
+ #include <asmjit-testing/commons/performancetimer.h>
+ #include <asmjit-testing/commons/random.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <memory>
+#include <vector>
+
+using namespace asmjit;
+
+static void print_app_info() {
+ printf("AsmJit Benchmark RegAlloc v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+}
+
+#if !defined(ASMJIT_NO_COMPILER)
+
+class BenchRegAllocApp {
+public:
+ const char* _arch = nullptr;
+ bool _help_only = false;
+ bool _verbose = false;
+ uint32_t _maximum_complexity = 65536;
+
+ BenchRegAllocApp() noexcept
+ : _arch("all") {}
+ ~BenchRegAllocApp() noexcept {}
+
+ template<class T>
+ inline void add_t() { T::add(*this); }
+
+ int handle_args(int argc, const char* const* argv);
+ void show_info();
+
+ bool should_run_arch(Arch arch) const noexcept;
+ void emit_code(BaseCompiler* cc, uint32_t complexity, uint32_t reg_count);
+
+#if !defined(ASMJIT_NO_X86)
+ void emit_code_x86(x86::Compiler* cc, uint32_t complexity, uint32_t reg_count);
+#endif // !ASMJIT_NO_X86
+
+#if !defined(ASMJIT_NO_AARCH64)
+ void emit_code_aarch64(a64::Compiler* cc, uint32_t complexity, uint32_t reg_count);
+#endif // !ASMJIT_NO_AARCH64
+
+ int run();
+ bool run_arch(Arch arch);
+};
+
+int BenchRegAllocApp::handle_args(int argc, const char* const* argv) {
+ CmdLine cmd(argc, argv);
+ _arch = cmd.value_of("--arch", "all");
+ _maximum_complexity = cmd.value_as_uint("--complexity", _maximum_complexity);
+
+ if (cmd.has_arg("--help")) _help_only = true;
+ if (cmd.has_arg("--verbose")) _verbose = true;
+
+ return 0;
+}
+
+void BenchRegAllocApp::show_info() {
+ print_app_info();
+
+ printf("Usage:\n");
+ printf(" asmjit_bench_regalloc [arguments]\n");
+ printf("\n");
+
+ printf("Arguments:\n");
+ printf(" --help Show usage only\n");
+ printf(" --arch=<NAME> Select architecture to run ('all' by default)\n");
+ printf(" --verbose Verbose output\n");
+ printf(" --complexity=<n> Maximum complexity to test (%u)\n", _maximum_complexity);
+ printf("\n");
+
+ printf("Architectures:\n");
+#if !defined(ASMJIT_NO_X86)
+ printf(" --arch=x86 32-bit X86 architecture (X86)\n");
+ printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
+#endif
+#if !defined(ASMJIT_NO_AARCH64)
+ printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
+#endif
+ printf("\n");
+}
+
+bool BenchRegAllocApp::should_run_arch(Arch arch) const noexcept {
+ if (strcmp(_arch, "all") == 0) {
+ return true;
+ }
+
+ if (strcmp(_arch, "x86") == 0 && arch == Arch::kX86) {
+ return true;
+ }
+
+ if (strcmp(_arch, "x64") == 0 && arch == Arch::kX64) {
+ return true;
+ }
+
+ if (strcmp(_arch, "aarch64") == 0 && arch == Arch::kAArch64) {
+ return true;
+ }
+
+ return false;
+}
+
+void BenchRegAllocApp::emit_code(BaseCompiler* cc, uint32_t complexity, uint32_t reg_count) {
+#if !defined(ASMJIT_NO_X86)
+ if (cc->arch() == Arch::kX86 || cc->arch() == Arch::kX64) {
+ emit_code_x86(cc->as<x86::Compiler>(), complexity, reg_count);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (cc->arch() == Arch::kAArch64) {
+ emit_code_aarch64(cc->as<a64::Compiler>(), complexity, reg_count);
+ }
+#endif
+}
+
+constexpr size_t kLocalRegCount = 3;
+constexpr size_t kLocalOpCount = 15;
+
+#if !defined(ASMJIT_NO_X86)
+void BenchRegAllocApp::emit_code_x86(x86::Compiler* cc, uint32_t complexity, uint32_t reg_count) {
+ TestUtils::Random rnd(0x1234);
+
+ std::vector<Label> labels;
+ std::vector<uint32_t> used_labels;
+ std::vector<x86::Vec> virt_regs;
+
+ x86::Gp arg_ptr = cc->new_gp_ptr("arg_ptr");
+ x86::Gp counter = cc->new_gp_ptr("counter");
+
+ for (size_t i = 0; i < complexity; i++) {
+ labels.push_back(cc->new_label());
+ used_labels.push_back(0u);
+ }
+
+ for (size_t i = 0; i < reg_count; i++) {
+ virt_regs.push_back(cc->new_xmm_sd("v%u", unsigned(i)));
+ }
+
+ FuncNode* func = cc->add_func(FuncSignature::build<void, size_t, void*>());
+ func->add_attributes(FuncAttributes::kX86_AVXEnabled);
+ func->set_arg(0, counter);
+ func->set_arg(1, arg_ptr);
+
+ for (size_t i = 0; i < reg_count; i++) {
+ cc->vmovsd(virt_regs[i], x86::ptr_64(arg_ptr, int32_t(i * 8)));
+ }
+
+ auto next_label = [&]() {
+ uint32_t id = rnd.next_uint32() % complexity;
+ if (used_labels[id] > 1) {
+ id = 0;
+ do {
+ if (++id >= complexity) {
+ id = 0;
+ }
+ } while (used_labels[id] != 0);
+ }
+
+ used_labels[id]++;
+ return labels[id];
+ };
+
+ for (size_t i = 0; i < labels.size(); i++) {
+ cc->bind(labels[i]);
+
+ x86::Vec locals[kLocalRegCount];
+ for (size_t j = 0; j < kLocalRegCount; j++) {
+ locals[j] = cc->new_xmm_sd("local%u", unsigned(j));
+ }
+
+ size_t local_op_threshold = kLocalOpCount - kLocalRegCount;
+
+ for (size_t j = 0; j < 15; j++) {
+ uint32_t op = rnd.next_uint32() % 6u;
+ uint32_t id1 = rnd.next_uint32() % reg_count;
+ uint32_t id2 = rnd.next_uint32() % reg_count;
+
+ x86::Vec v0 = virt_regs[id1];
+ x86::Vec v1 = virt_regs[id1];
+ x86::Vec v2 = virt_regs[id2];
+
+ if (j < kLocalRegCount) {
+ v0 = locals[j];
+ }
+
+ if (j >= local_op_threshold) {
+ v2 = locals[j - local_op_threshold];
+ }
+
+ switch (op) {
+ case 0: cc->vaddsd(v0, v1, v2); break;
+ case 1: cc->vsubsd(v0, v1, v2); break;
+ case 2: cc->vmulsd(v0, v1, v2); break;
+ case 3: cc->vdivsd(v0, v1, v2); break;
+ case 4: cc->vminsd(v0, v1, v2); break;
+ case 5: cc->vmaxsd(v0, v1, v2); break;
+ }
+ }
+
+ cc->sub(counter, 1);
+ cc->jns(next_label());
+ }
+
+ for (size_t i = 0; i < reg_count; i++) {
+ cc->vmovsd(x86::ptr_64(arg_ptr, int32_t(i * 8)), virt_regs[i]);
+ }
+
+ cc->end_func();
+}
+#endif // !ASMJIT_NO_X86
+
+#if !defined(ASMJIT_NO_AARCH64)
+void BenchRegAllocApp::emit_code_aarch64(a64::Compiler* cc, uint32_t complexity, uint32_t reg_count) {
+ TestUtils::Random rnd(0x1234);
+
+ std::vector<Label> labels;
+ std::vector<uint32_t> used_labels;
+ std::vector<a64::Vec> virt_regs;
+
+ a64::Gp arg_ptr = cc->new_gp_ptr("arg_ptr");
+ a64::Gp counter = cc->new_gp_ptr("counter");
+
+ for (size_t i = 0; i < complexity; i++) {
+ labels.push_back(cc->new_label());
+ used_labels.push_back(0u);
+ }
+
+ for (size_t i = 0; i < reg_count; i++) {
+ virt_regs.push_back(cc->new_vec_d("v%u", unsigned(i)));
+ }
+
+ FuncNode* func = cc->add_func(FuncSignature::build<void, size_t, void*>());
+ func->add_attributes(FuncAttributes::kX86_AVXEnabled);
+ func->set_arg(0, counter);
+ func->set_arg(1, arg_ptr);
+
+ for (size_t i = 0; i < reg_count; i++) {
+ cc->ldr(virt_regs[i].d(), a64::ptr(arg_ptr, int32_t(i * 8) & 1023));
+ }
+
+ auto next_label = [&]() {
+ uint32_t id = rnd.next_uint32() % complexity;
+ if (used_labels[id] > 1) {
+ id = 0;
+ do {
+ if (++id >= complexity) {
+ id = 0;
+ }
+ } while (used_labels[id] != 0);
+ }
+
+ used_labels[id]++;
+ return labels[id];
+ };
+
+ for (size_t i = 0; i < labels.size(); i++) {
+ cc->bind(labels[i]);
+
+ a64::Vec locals[kLocalRegCount];
+ for (size_t j = 0; j < kLocalRegCount; j++) {
+ locals[j] = cc->new_vec_d("local%u", unsigned(j));
+ }
+
+ size_t local_op_threshold = kLocalOpCount - kLocalRegCount;
+
+ for (size_t j = 0; j < 15; j++) {
+ uint32_t op = rnd.next_uint32() % 6;
+ uint32_t id1 = rnd.next_uint32() % reg_count;
+ uint32_t id2 = rnd.next_uint32() % reg_count;
+
+ a64::Vec v0 = virt_regs[id1];
+ a64::Vec v1 = virt_regs[id1];
+ a64::Vec v2 = virt_regs[id2];
+
+ if (j < kLocalRegCount) {
+ v0 = locals[j];
+ }
+
+ if (j >= local_op_threshold) {
+ v2 = locals[j - local_op_threshold];
+ }
+
+ switch (op) {
+ case 0: cc->fadd(v0.d(), v1.d(), v2.d()); break;
+ case 1: cc->fsub(v0.d(), v1.d(), v2.d()); break;
+ case 2: cc->fmul(v0.d(), v1.d(), v2.d()); break;
+ case 3: cc->fdiv(v0.d(), v1.d(), v2.d()); break;
+ case 4: cc->fmin(v0.d(), v1.d(), v2.d()); break;
+ case 5: cc->fmax(v0.d(), v1.d(), v2.d()); break;
+ }
+ }
+
+ cc->subs(counter, counter, 1);
+ cc->b_hi(next_label());
+ }
+
+ for (size_t i = 0; i < reg_count; i++) {
+ cc->str(virt_regs[i].d(), a64::ptr(arg_ptr, int32_t(i * 8) & 1023));
+ }
+
+ cc->end_func();
+}
+#endif // !ASMJIT_NO_AARCH64
+
+int BenchRegAllocApp::run() {
+ if (should_run_arch(Arch::kX64) && !run_arch(Arch::kX64)) {
+ return 1;
+ }
+
+ if (should_run_arch(Arch::kAArch64) && !run_arch(Arch::kAArch64)) {
+ return 1;
+ }
+
+ return 0;
+}
+
+bool BenchRegAllocApp::run_arch(Arch arch) {
+ Environment custom_env;
+ CpuFeatures features;
+
+ switch (arch) {
+ case Arch::kX86:
+ case Arch::kX64:
+ features.add(CpuFeatures::X86::kADX,
+ CpuFeatures::X86::kAVX,
+ CpuFeatures::X86::kAVX2,
+ CpuFeatures::X86::kBMI,
+ CpuFeatures::X86::kBMI2,
+ CpuFeatures::X86::kCMOV,
+ CpuFeatures::X86::kF16C,
+ CpuFeatures::X86::kFMA,
+ CpuFeatures::X86::kFPU,
+ CpuFeatures::X86::kI486,
+ CpuFeatures::X86::kLZCNT,
+ CpuFeatures::X86::kMMX,
+ CpuFeatures::X86::kMMX2,
+ CpuFeatures::X86::kPOPCNT,
+ CpuFeatures::X86::kSSE,
+ CpuFeatures::X86::kSSE2,
+ CpuFeatures::X86::kSSE3,
+ CpuFeatures::X86::kSSSE3,
+ CpuFeatures::X86::kSSE4_1,
+ CpuFeatures::X86::kSSE4_2,
+ CpuFeatures::X86::kAVX,
+ CpuFeatures::X86::kAVX2);
+ break;
+
+ case Arch::kAArch64:
+ features.add(CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kASIMD,
+ CpuFeatures::ARM::kIDIVA,
+ CpuFeatures::ARM::kIDIVT,
+ CpuFeatures::ARM::kPMULL);
+ break;
+
+ default:
+ return false;
+ }
+
+ CodeHolder code;
+
+ custom_env.init(arch);
+ code.init(custom_env, features);
+
+ std::unique_ptr<BaseCompiler> cc;
+
+#ifndef ASMJIT_NO_X86
+ if (code.arch() == Arch::kX86 || code.arch() == Arch::kX64) {
+ cc = std::make_unique<x86::Compiler>();
+ }
+#endif // !ASMJIT_NO_X86
+
+#ifndef ASMJIT_NO_AARCH64
+ if (code.arch() == Arch::kAArch64) {
+ cc = std::make_unique<a64::Compiler>();
+ }
+#endif // !ASMJIT_NO_AARCH64
+
+ if (!cc)
+ return false;
+
+ PerformanceTimer emit_timer;
+ PerformanceTimer finalize_timer;
+
+ uint32_t reg_count = 35;
+
+ code.reinit();
+ code.attach(cc.get());
+
+ // Dry run to not benchmark allocs on the first run.
+ emit_code(cc.get(), 0, reg_count);
+ cc->finalize();
+ code.reinit();
+
+#if !defined(ASMJIT_NO_LOGGING)
+ StringLogger logger;
+ if (_verbose) {
+ code.set_logger(&logger);
+ cc->add_diagnostic_options(DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll);
+ }
+#endif // !ASMJIT_NO_LOGGING
+
+ printf("+-----------------------------------------+-----------+-----------------------------------+--------------+--------------+\n");
+ printf("| Input Configuration | Output | Reserved Memory [KiB] | Time Elapsed [ms] |\n");
+ printf("+--------+------------+--------+----------+-----------+-----------+-----------+-----------+--------------+--------------+\n");
+ printf("| Arch | Complexity | Labels | RegCount | CodeSize | Code Hold.| Compiler | Pass Temp.| Emit Time | Reg. Alloc |\n");
+ printf("+--------+------------+--------+----------+-----------+-----------+-----------+-----------+--------------+--------------+\n");
+
+ for (uint32_t complexity = 1u; complexity <= _maximum_complexity; complexity *= 2u) {
+ emit_timer.start();
+ emit_code(cc.get(), complexity + 1, reg_count);
+ emit_timer.stop();
+
+ finalize_timer.start();
+ Error err = cc->finalize();
+ finalize_timer.stop();
+
+#if !defined(ASMJIT_NO_LOGGING)
+ if (_verbose) {
+ printf("%s\n", logger.data());
+ logger.clear();
+ }
+#endif
+
+ code.flatten();
+
+ double emit_time = emit_timer.duration();
+ double finalize_time = finalize_timer.duration();
+ size_t code_size = code.code_size();
+ size_t label_count = code.label_count();
+ size_t virt_reg_count = cc->virt_regs().size();
+
+ ArenaStatistics code_holder_stats = code._arena.statistics();
+ ArenaStatistics compiler_stats = cc->_builder_arena.statistics();
+ ArenaStatistics pass_stats = cc->_pass_arena.statistics();
+
+ printf(
+ "| %-7s| %10u | %6zu | %8zu | %9zu | %9zu | %9zu | %9zu | %12.3f | %12.3f |",
+ asmjit_arch_as_string(arch),
+ complexity,
+ label_count,
+ virt_reg_count,
+ code_size,
+ (code_holder_stats.reserved_size() + 1023) / 1024,
+ (compiler_stats.reserved_size() + 1023) / 1024,
+ (pass_stats.reserved_size() + 1023) / 1024,
+ emit_time,
+ finalize_time
+ );
+
+ if (err != Error::kOk) {
+ printf(" (err: %s)", DebugUtils::error_as_string(err));
+ }
+
+ printf("\n");
+
+ code.reinit();
+ }
+
+ printf("+--------+------------+--------+----------+-----------+-----------+-----------+-----------+--------------+--------------+\n");
+ printf("\n");
+
+ return true;
+}
+
+int main(int argc, char* argv[]) {
+ BenchRegAllocApp app;
+
+ app.handle_args(argc, argv);
+ app.show_info();
+
+ if (app._help_only)
+ return 0;
+
+ return app.run();
+}
+
+#else
+
+int main() {
+ print_app_info();
+ printf("!! This Benchmark is disabled: <ASMJIT_NO_JIT> or unsuitable target architecture !!\n");
+ return 0;
+}
+
+#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit-testing/commons/asmjitutils.h b/3rdparty/asmjit/asmjit-testing/commons/asmjitutils.h
new file mode 100644
index 00000000000..90d9d010dd2
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/commons/asmjitutils.h
@@ -0,0 +1,228 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJITUTILS_H_INCLUDED
+#define ASMJITUTILS_H_INCLUDED
+
+#include <asmjit/core.h>
+
+namespace {
+
+[[maybe_unused]]
+static const char* asmjit_build_type() noexcept {
+#if defined(ASMJIT_BUILD_DEBUG)
+ static const char build_type[] = "Debug";
+#else
+ static const char build_type[] = "Release";
+#endif
+ return build_type;
+}
+
+[[maybe_unused]]
+static const char* asmjit_arch_as_string(asmjit::Arch arch) noexcept {
+ switch (arch) {
+ case asmjit::Arch::kX86 : return "X86";
+ case asmjit::Arch::kX64 : return "X64";
+
+ case asmjit::Arch::kRISCV32 : return "RISCV32";
+ case asmjit::Arch::kRISCV64 : return "RISCV64";
+
+ case asmjit::Arch::kARM : return "ARM";
+ case asmjit::Arch::kAArch64 : return "AArch64";
+ case asmjit::Arch::kThumb : return "Thumb";
+
+ case asmjit::Arch::kMIPS32_LE : return "MIPS_LE";
+ case asmjit::Arch::kMIPS64_LE : return "MIPS64_LE";
+
+ case asmjit::Arch::kARM_BE : return "ARM_BE";
+ case asmjit::Arch::kThumb_BE : return "Thumb_BE";
+ case asmjit::Arch::kAArch64_BE: return "AArch64_BE";
+
+ case asmjit::Arch::kMIPS32_BE : return "MIPS_BE";
+ case asmjit::Arch::kMIPS64_BE : return "MIPS64_BE";
+
+ default:
+ return "<Unknown>";
+ }
+}
+
+[[maybe_unused]]
+static void print_indented(const char* str, size_t indent) noexcept {
+ const char* start = str;
+ while (*str) {
+ if (*str == '\n') {
+ size_t size = (size_t)(str - start);
+ printf("%*s%.*s\n", size ? int(indent) : 0, "", int(size), start);
+ start = str + 1;
+ }
+ str++;
+ }
+
+ size_t size = (size_t)(str - start);
+ if (size)
+ printf("%*s%.*s\n", int(indent), "", int(size), start);
+}
+
+[[maybe_unused]]
+static void print_cpu_info() noexcept {
+ const asmjit::CpuInfo& cpu = asmjit::CpuInfo::host();
+
+ // CPU Information
+ // ---------------
+
+ printf("CPU Info:\n");
+ printf(" Vendor : %s\n", cpu.vendor());
+ printf(" Brand : %s\n", cpu.brand());
+ printf(" Model ID : 0x%08X (%u)\n", cpu.model_id(), cpu.model_id());
+ printf(" Brand ID : 0x%08X (%u)\n", cpu.brand_id(), cpu.brand_id());
+ printf(" Family ID : 0x%08X (%u)\n", cpu.family_id(), cpu.family_id());
+ printf(" Stepping : %u\n", cpu.stepping());
+ printf(" Processor Type : %u\n", cpu.processor_type());
+ printf(" Max logical Processors : %u\n", cpu.max_logical_processors());
+ printf(" Cache-Line Size : %u\n", cpu.cache_line_size());
+ printf(" HW-Thread Count : %u\n", cpu.hw_thread_count());
+ printf("\n");
+
+ // CPU Features
+ // ------------
+
+ using asmjit::CpuHints;
+
+#ifndef ASMJIT_NO_LOGGING
+ printf("CPU Features:\n");
+ asmjit::CpuFeatures::Iterator it(cpu.features().iterator());
+ while (it.has_next()) {
+ uint32_t feature_id = uint32_t(it.next());
+ asmjit::StringTmp<64> feature_string;
+ asmjit::Formatter::format_feature(feature_string, cpu.arch(), feature_id);
+ printf(" %s\n", feature_string.data());
+ };
+ printf("\n");
+#endif // !ASMJIT_NO_LOGGING
+
+ // CPU Hints
+ // ---------
+
+ printf("CPU Hints:\n");
+ auto print_hint = [&](CpuHints hint, const char* name) {
+ if ((cpu.hints() & hint) != CpuHints::kNone) {
+ printf(" %s\n", name);
+ }
+ };
+
+ print_hint(CpuHints::kVecMaskedOps8 , "VecMaskedOps8" );
+ print_hint(CpuHints::kVecMaskedOps16 , "VecMaskedOps16" );
+ print_hint(CpuHints::kVecMaskedOps32 , "VecMaskedOps32" );
+ print_hint(CpuHints::kVecMaskedOps64 , "VecMaskedOps64" );
+ print_hint(CpuHints::kVecFastIntMul32, "VecFastIntMul32");
+ print_hint(CpuHints::kVecFastIntMul64, "VecFastIntMul64");
+ print_hint(CpuHints::kVecFastGather , "VecFastGather" );
+ print_hint(CpuHints::kVecMaskedStore , "VecMaskedStore" );
+
+ printf("\n");
+}
+
+[[maybe_unused]]
+static void print_build_options() {
+ auto stringify_build_definition = [](bool b) { return b ? "defined" : "(not defined)"; };
+
+#if defined(ASMJIT_NO_X86)
+ constexpr bool no_x86 = true;
+#else
+ constexpr bool no_x86 = false;
+#endif
+
+#if defined(ASMJIT_NO_AARCH64)
+ constexpr bool no_aarch64 = true;
+#else
+ constexpr bool no_aarch64 = false;
+#endif
+
+#if defined(ASMJIT_NO_FOREIGN)
+ constexpr bool no_foreign = true;
+#else
+ constexpr bool no_foreign = false;
+#endif
+
+#if defined(ASMJIT_NO_ABI_NAMESPACE)
+ constexpr bool no_abi_namespace = true;
+#else
+ constexpr bool no_abi_namespace = false;
+#endif
+
+#if defined(ASMJIT_NO_SHM_OPEN)
+ constexpr bool no_shm_open = true;
+#else
+ constexpr bool no_shm_open = false;
+#endif
+
+#if defined(ASMJIT_NO_JIT)
+ constexpr bool no_jit = true;
+#else
+ constexpr bool no_jit = false;
+#endif
+
+#if defined(ASMJIT_NO_TEXT)
+ constexpr bool no_text = true;
+#else
+ constexpr bool no_text = false;
+#endif
+
+#if defined(ASMJIT_NO_LOGGING)
+ constexpr bool no_logging = true;
+#else
+ constexpr bool no_logging = false;
+#endif
+
+#if defined(ASMJIT_NO_INTROSPECTION)
+ constexpr bool no_introspection = true;
+#else
+ constexpr bool no_introspection = false;
+#endif
+
+#if defined(ASMJIT_NO_BUILDER)
+ constexpr bool no_builder = true;
+#else
+ constexpr bool no_builder = false;
+#endif
+
+#if defined(ASMJIT_NO_COMPILER)
+ constexpr bool no_compiler = true;
+#else
+ constexpr bool no_compiler = false;
+#endif
+
+#if defined(ASMJIT_NO_UJIT)
+ constexpr bool no_ujit = true;
+#else
+ constexpr bool no_ujit = false;
+#endif
+
+ printf("Build Options:\n");
+ printf(" BUILD_TYPE : %s\n", asmjit_build_type());
+ printf(" ASMJIT_NO_ABI_NAMESPACE: %s\n", stringify_build_definition(no_abi_namespace));
+ printf(" ASMJIT_NO_SHM_OPEN : %s\n", stringify_build_definition(no_shm_open));
+ printf("\n");
+
+ printf("Build Backends:\n");
+ printf(" ASMJIT_NO_X86 : %s\n", stringify_build_definition(no_x86));
+ printf(" ASMJIT_NO_AARCH64 : %s\n", stringify_build_definition(no_aarch64));
+ printf(" ASMJIT_NO_FOREIGN : %s\n", stringify_build_definition(no_foreign));
+ printf("\n");
+
+ printf("Build Features:\n");
+ printf(" ASMJIT_NO_JIT : %s\n", stringify_build_definition(no_jit));
+ printf(" ASMJIT_NO_TEXT : %s\n", stringify_build_definition(no_text));
+ printf(" ASMJIT_NO_LOGGING : %s\n", stringify_build_definition(no_logging));
+ printf(" ASMJIT_NO_INTROSPECTION: %s\n", stringify_build_definition(no_introspection));
+ printf(" ASMJIT_NO_BUILDER : %s\n", stringify_build_definition(no_builder));
+ printf(" ASMJIT_NO_COMPILER : %s\n", stringify_build_definition(no_compiler));
+ printf(" ASMJIT_NO_UJIT : %s\n", stringify_build_definition(no_ujit));
+ printf("\n");
+}
+
+} // {anonymous}
+
+#endif // ASMJITUTILS_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/commons/cmdline.h b/3rdparty/asmjit/asmjit-testing/commons/cmdline.h
new file mode 100644
index 00000000000..571fc2058cb
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/commons/cmdline.h
@@ -0,0 +1,63 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef CMDLINE_H_INCLUDED
+#define CMDLINE_H_INCLUDED
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+class CmdLine {
+public:
+ int _argc;
+ const char* const* _argv;
+
+ CmdLine(int argc, const char* const* argv)
+ : _argc(argc),
+ _argv(argv) {}
+
+ bool has_arg(const char* key) const {
+ for (int i = 1; i < _argc; i++) {
+ if (strcmp(key, _argv[i]) == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ const char* value_of(const char* key, const char* default_value) const {
+ size_t keySize = strlen(key);
+ for (int i = 1; i < _argc; i++) {
+ const char* val = _argv[i];
+ if (strlen(val) >= keySize + 1 && val[keySize] == '=' && memcmp(val, key, keySize) == 0)
+ return val + keySize + 1;
+ }
+
+ return default_value;
+ }
+
+ int value_as_int(const char* key, int default_value) const {
+ const char* val = value_of(key, nullptr);
+ if (val == nullptr || val[0] == '\0')
+ return default_value;
+
+ return atoi(val);
+ }
+
+ unsigned value_as_uint(const char* key, unsigned default_value) const {
+ const char* val = value_of(key, nullptr);
+ if (val == nullptr || val[0] == '\0')
+ return default_value;
+
+ int v = atoi(val);
+ if (v < 0)
+ return default_value;
+ else
+ return unsigned(v);
+ }
+};
+
+#endif // CMDLINE_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/commons/performancetimer.h b/3rdparty/asmjit/asmjit-testing/commons/performancetimer.h
new file mode 100644
index 00000000000..8041498888f
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/commons/performancetimer.h
@@ -0,0 +1,27 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef PERFORMANCETIMER_H_INCLUDED
+#define PERFORMANCETIMER_H_INCLUDED
+
+#include <chrono>
+
+class PerformanceTimer {
+public:
+ using TimePoint = std::chrono::high_resolution_clock::time_point;
+
+ TimePoint _start_time {};
+ TimePoint _end_time {};
+
+ inline void start() { _start_time = std::chrono::high_resolution_clock::now(); }
+ inline void stop() { _end_time = std::chrono::high_resolution_clock::now(); }
+
+ inline double duration() const {
+ std::chrono::duration<double> elapsed = _end_time - _start_time;
+ return elapsed.count() * 1000;
+ }
+};
+
+#endif // PERFORMANCETIMER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/commons/random.h b/3rdparty/asmjit/asmjit-testing/commons/random.h
new file mode 100644
index 00000000000..27f99f6afc0
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/commons/random.h
@@ -0,0 +1,77 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef TESTING_COMMONS_RANDOM_H_INCLUDED
+#define TESTING_COMMONS_RANDOM_H_INCLUDED
+
+#include <stdint.h>
+#include <string.h>
+
+namespace TestUtils {
+namespace {
+
+// A pseudo random number generator based on a paper by Sebastiano Vigna:
+// http://vigna.di.unimi.it/ftp/papers/xorshiftplus.pdf
+class Random {
+public:
+ // Constants suggested as `23/18/5`.
+ static inline constexpr uint32_t kStep1_SHL = 23;
+ static inline constexpr uint32_t kStep2_SHR = 18;
+ static inline constexpr uint32_t kStep3_SHR = 5;
+
+ uint64_t _state[2];
+
+ inline explicit Random(uint64_t seed = 0) noexcept { reset(seed); }
+ inline Random(const Random& other) noexcept = default;
+
+ inline void reset(uint64_t seed = 0) noexcept {
+ // The number is arbitrary, it means nothing.
+ constexpr uint64_t kZeroSeed = 0x1F0A2BE71D163FA0u;
+
+ // Generate the state data by using splitmix64.
+ for (uint32_t i = 0; i < 2; i++) {
+ seed += 0x9E3779B97F4A7C15u;
+ uint64_t x = seed;
+ x = (x ^ (x >> 30)) * 0xBF58476D1CE4E5B9u;
+ x = (x ^ (x >> 27)) * 0x94D049BB133111EBu;
+ x = (x ^ (x >> 31));
+ _state[i] = x != 0 ? x : kZeroSeed;
+ }
+ }
+
+ inline uint32_t next_uint32() noexcept {
+ return uint32_t(next_uint64() >> 32);
+ }
+
+ inline uint64_t next_uint64() noexcept {
+ uint64_t x = _state[0];
+ uint64_t y = _state[1];
+
+ x ^= x << kStep1_SHL;
+ y ^= y >> kStep3_SHR;
+ x ^= x >> kStep2_SHR;
+ x ^= y;
+
+ _state[0] = y;
+ _state[1] = x;
+ return x + y;
+ }
+
+ inline double next_double() noexcept {
+ constexpr uint32_t kMantissaShift = 64 - 52;
+ constexpr uint64_t kExpMsk = 0x3FF0000000000000u;
+
+ uint64_t u = (next_uint64() >> kMantissaShift) | kExpMsk;
+ double d = 0.0;
+
+ memcpy(&d, &u, 8);
+ return d - 1.0;
+ }
+};
+
+} // {anonymous}
+} // {TestUtils}
+
+#endif // TESTING_COMMONS_RANDOM_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.cpp
new file mode 100644
index 00000000000..6e15697ab89
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.cpp
@@ -0,0 +1,107 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/commons/cmdline.h>
+#include <asmjit-testing/tests/asmjit_test_assembler.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+using namespace asmjit;
+
+#if !defined(ASMJIT_NO_X86)
+bool test_x86_assembler(const TestSettings& settings) noexcept;
+bool test_x64_assembler(const TestSettings& settings) noexcept;
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+bool test_aarch64_assembler(const TestSettings& settings) noexcept;
+#endif
+
+static void print_app_info() noexcept {
+ printf("AsmJit Assembler Test-Suite v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+}
+
+static void print_app_usage(const TestSettings& settings) noexcept {
+ printf("Usage:\n");
+ printf(" --help Show usage only\n");
+ printf(" --verbose Show only assembling errors [%s]\n", settings.verbose ? "x" : " ");
+ printf(" --validate Use instruction validation [%s]\n", settings.validate ? "x" : " ");
+ printf(" --arch=<ARCH> Select architecture to run ('all' by default)\n");
+ printf("\n");
+
+ printf("Architectures:\n");
+#if !defined(ASMJIT_NO_X86)
+ printf(" --arch=x86 32-bit X86 architecture (X86)\n");
+ printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
+#endif
+#if !defined(ASMJIT_NO_AARCH64)
+ printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
+#endif
+ printf("\n");
+}
+
+int main(int argc, char* argv[]) {
+ CmdLine cmd_line(argc, argv);
+
+ TestSettings settings {};
+ settings.verbose = cmd_line.has_arg("--verbose");
+ settings.validate = cmd_line.has_arg("--validate");
+
+ print_app_info();
+ print_app_usage(settings);
+
+ if (cmd_line.has_arg("--help")) {
+ return 0;
+ }
+
+ const char* arch = cmd_line.value_of("--arch", "all");
+ bool x86_failed = false;
+ bool x64_failed = false;
+ bool aarch64_failed = false;
+
+#if !defined(ASMJIT_NO_X86)
+ if ((strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0))
+ x86_failed = !test_x86_assembler(settings);
+
+ if ((strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0))
+ x64_failed = !test_x64_assembler(settings);
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0))
+ aarch64_failed = !test_aarch64_assembler(settings);
+#endif
+
+ bool failed = x86_failed || x64_failed || aarch64_failed;
+
+ if (failed) {
+ if (x86_failed)
+ printf("** X86 test suite failed **\n");
+
+ if (x64_failed)
+ printf("** X64 test suite failed **\n");
+
+ if (aarch64_failed)
+ printf("** AArch64 test suite failed **\n");
+
+ printf("** FAILURE **\n");
+ }
+ else {
+ printf("** SUCCESS **\n");
+ }
+
+ return failed ? 1 : 0;
+}
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.h b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.h
new file mode 100644
index 00000000000..f57b70617e1
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.h
@@ -0,0 +1,109 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_ASSEMBLER_H_INCLUDED
+#define ASMJIT_TEST_ASSEMBLER_H_INCLUDED
+
+#include <asmjit/core.h>
+
+#include <stdio.h>
+
+struct TestSettings {
+ bool verbose;
+ bool validate;
+};
+
+template<typename AssemblerType>
+class AssemblerTester {
+public:
+ asmjit::Environment env {};
+ asmjit::CodeHolder code {};
+ AssemblerType assembler {};
+ asmjit::Label L0 {};
+ const TestSettings& settings;
+
+ size_t passed {};
+ size_t count {};
+
+ AssemblerTester(asmjit::Arch arch, const TestSettings& settings) noexcept
+ : env(arch),
+ settings(settings) {
+ prepare();
+ }
+
+ void print_header(const char* arch_name) noexcept {
+ printf("%s assembler tests:\n", arch_name);
+ }
+
+ void print_summary() noexcept {
+ printf(" Passed: %zu / %zu tests\n\n", passed, count);
+ }
+
+ bool did_pass() const noexcept { return passed == count; }
+
+ void prepare() noexcept {
+ code.reset();
+ code.init(env, 0);
+ code.attach(&assembler);
+ L0 = assembler.new_label();
+
+ if (settings.validate)
+ assembler.add_diagnostic_options(asmjit::DiagnosticOptions::kValidateAssembler);
+ }
+
+ ASMJIT_NOINLINE bool test_valid_instruction(const char* s, const char* expected_opcode, asmjit::Error err = asmjit::Error::kOk) noexcept {
+ count++;
+
+ if (err != asmjit::Error::kOk) {
+ printf(" !! %s\n"
+ " <%s>\n", s, asmjit::DebugUtils::error_as_string(err));
+ prepare();
+ return false;
+ }
+
+ asmjit::String encoded_opcode;
+ asmjit::Section* text = code.text_section();
+
+ encoded_opcode.append_hex(text->data(), text->buffer_size());
+ if (encoded_opcode != expected_opcode) {
+ printf(" !! [%s] <- %s\n"
+ " [%s] (Expected)\n", encoded_opcode.data(), s, expected_opcode);
+ prepare();
+ return false;
+ }
+
+ if (settings.verbose)
+ printf(" OK [%s] <- %s\n", encoded_opcode.data(), s);
+
+ passed++;
+ prepare();
+ return true;
+ }
+
+ ASMJIT_NOINLINE bool test_invalid_instruction(const char* s, asmjit::Error expected_error, asmjit::Error err) noexcept {
+ count++;
+
+ if (err == asmjit::Error::kOk) {
+ printf(" !! %s passed, but should have failed with <%s> error\n", s, asmjit::DebugUtils::error_as_string(expected_error));
+ prepare();
+ return false;
+ }
+
+ if (err != asmjit::Error::kOk) {
+ printf(" !! %s failed with <%s>, but should have failed with <%s>\n", s, asmjit::DebugUtils::error_as_string(err), asmjit::DebugUtils::error_as_string(expected_error));
+ prepare();
+ return false;
+ }
+
+ if (settings.verbose)
+ printf(" OK [%s] <- %s\n", asmjit::DebugUtils::error_as_string(err), s);
+
+ passed++;
+ prepare();
+ return true;
+ }
+};
+
+#endif // ASMJIT_TEST_ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_a64.cpp
index 8da77b3ff50..15aa84fc59c 100644
--- a/3rdparty/asmjit/test/asmjit_test_assembler_a64.cpp
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_a64.cpp
@@ -1,27 +1,29 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#include <asmjit/core.h>
#if !defined(ASMJIT_NO_AARCH64)
#include <asmjit/a64.h>
+
+#include <asmjit-testing/tests/asmjit_test_assembler.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "asmjit_test_assembler.h"
-#include "cmdline.h"
-
using namespace asmjit;
#define TEST_INSTRUCTION(OPCODE, ...) \
- tester.testValidInstruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__)
+ tester.test_valid_instruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__)
-static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_aarch64_assembler_base(AssemblerTester<a64::Assembler>& tester) noexcept {
using namespace a64;
+ TEST_INSTRUCTION("4120C05A", abs(w1, w2));
+ TEST_INSTRUCTION("4120C0DA", abs(x1, x2));
TEST_INSTRUCTION("4100031A", adc(w1, w2, w3));
TEST_INSTRUCTION("4100039A", adc(x1, x2, x3));
TEST_INSTRUCTION("E103031A", adc(w1, wzr, w3));
@@ -42,6 +44,7 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("E103038B", add(x1, xzr, x3));
TEST_INSTRUCTION("5F00030B", add(wzr, w2, w3));
TEST_INSTRUCTION("5F00038B", add(xzr, x2, x3));
+ TEST_INSTRUCTION("4140238B", add(x1, x2, w3, uxtw(0)));
TEST_INSTRUCTION("83004011", add(w3, w4, 0, lsl(12)));
TEST_INSTRUCTION("83004091", add(x3, x4, 0, lsl(12)));
TEST_INSTRUCTION("83005011", add(w3, w4, 1024, lsl(12)));
@@ -139,6 +142,7 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("60031FD6", br(x27));
TEST_INSTRUCTION("E0031FD6", br(xzr));
TEST_INSTRUCTION("200020D4", brk(1));
+ TEST_INSTRUCTION("DF2403D5", bti(Predicate::BTI::kJC));
TEST_INSTRUCTION("627CA188", cas(w1, w2, ptr(x3)));
TEST_INSTRUCTION("627CA1C8", cas(x1, x2, ptr(x3)));
TEST_INSTRUCTION("627CE188", casa(w1, w2, ptr(x3)));
@@ -188,6 +192,8 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("E1139F5A", cinv(w1, wzr, CondCode::kEQ));
TEST_INSTRUCTION("5F1082DA", cinv(xzr, x2, CondCode::kEQ));
TEST_INSTRUCTION("E1139FDA", cinv(x1, xzr, CondCode::kEQ));
+ TEST_INSTRUCTION("DF2203D5", clrbhb());
+ TEST_INSTRUCTION("1F2503D5", chkfeat(x16));
TEST_INSTRUCTION("5F3B03D5", clrex(11));
TEST_INSTRUCTION("4114C05A", cls(w1, w2));
TEST_INSTRUCTION("4114C0DA", cls(x1, x2));
@@ -210,7 +216,8 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("3F00022B", cmn(w1, w2));
TEST_INSTRUCTION("3F0002AB", cmn(x1, x2));
TEST_INSTRUCTION("3F08222B", cmn(w1, w2, uxtb(2)));
- TEST_INSTRUCTION("3F0822AB", cmn(x1, x2, uxtb(2)));
+ TEST_INSTRUCTION("3F0822AB", cmn(x1, w2, uxtb(2)));
+ TEST_INSTRUCTION("5F4023AB", cmn(x2, w3, uxtw(0)));
TEST_INSTRUCTION("FF43212B", cmn(wsp, w1));
TEST_INSTRUCTION("FF07212B", cmn(wsp, w1, uxtb(1)));
TEST_INSTRUCTION("FF6321AB", cmn(sp, x1));
@@ -224,7 +231,8 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("3F00026B", cmp(w1, w2));
TEST_INSTRUCTION("3F0002EB", cmp(x1, x2));
TEST_INSTRUCTION("3F08226B", cmp(w1, w2, uxtb(2)));
- TEST_INSTRUCTION("3F0822EB", cmp(x1, x2, uxtb(2)));
+ TEST_INSTRUCTION("3F0822EB", cmp(x1, w2, uxtb(2)));
+ TEST_INSTRUCTION("5F4023EB", cmp(x2, w3, uxtw(0)));
TEST_INSTRUCTION("FF43216B", cmp(wsp, w1));
TEST_INSTRUCTION("FF07216B", cmp(wsp, w1, uxtb(1)));
TEST_INSTRUCTION("FF6321EB", cmp(sp, x1));
@@ -233,6 +241,8 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("3F00DFBA", cmpp(x1, sp));
TEST_INSTRUCTION("FF03C2BA", cmpp(sp, x2));
TEST_INSTRUCTION("FF03DFBA", cmpp(sp, sp));
+ TEST_INSTRUCTION("411CC05A", cnt(w1, w2));
+ TEST_INSTRUCTION("411CC0DA", cnt(x1, x2));
TEST_INSTRUCTION("4140C31A", crc32b(w1, w2, w3));
TEST_INSTRUCTION("5F40C31A", crc32b(wzr, w2, w3));
TEST_INSTRUCTION("E143C31A", crc32b(w1, wzr, w3));
@@ -280,6 +290,8 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("410083DA", csinv(x1, x2, x3, CondCode::kEQ));
TEST_INSTRUCTION("4104835A", csneg(w1, w2, w3, CondCode::kEQ));
TEST_INSTRUCTION("410483DA", csneg(x1, x2, x3, CondCode::kEQ));
+ TEST_INSTRUCTION("4118C05A", ctz(w1, w2));
+ TEST_INSTRUCTION("4118C0DA", ctz(x1, x2));
TEST_INSTRUCTION("2F740BD5", dc(Predicate::DC::kZVA, x15));
TEST_INSTRUCTION("2100B0D4", dcps1(0x8001));
TEST_INSTRUCTION("2200B0D4", dcps2(0x8001));
@@ -822,10 +834,10 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("4190039B", msub(x1, x2, x3, x4));
TEST_INSTRUCTION("417C031B", mul(w1, w2, w3));
TEST_INSTRUCTION("417C039B", mul(x1, x2, x3));
- TEST_INSTRUCTION("E103222A", mvn(w1, w2));
- TEST_INSTRUCTION("E10322AA", mvn(x1, x2));
- TEST_INSTRUCTION("E113222A", mvn(w1, w2, lsl(4)));
- TEST_INSTRUCTION("E11322AA", mvn(x1, x2, lsl(4)));
+ TEST_INSTRUCTION("E103222A", mvn_(w1, w2));
+ TEST_INSTRUCTION("E10322AA", mvn_(x1, x2));
+ TEST_INSTRUCTION("E113222A", mvn_(w1, w2, lsl(4)));
+ TEST_INSTRUCTION("E11322AA", mvn_(x1, x2, lsl(4)));
TEST_INSTRUCTION("E103024B", neg(w1, w2));
TEST_INSTRUCTION("E10302CB", neg(x1, x2));
TEST_INSTRUCTION("E113024B", neg(w1, w2, lsl(4)));
@@ -899,7 +911,15 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("2D08003A", setf8(w1));
TEST_INSTRUCTION("2D48003A", setf16(w1));
TEST_INSTRUCTION("4110239B", smaddl(x1, w2, w3, x4));
+ TEST_INSTRUCTION("4160C31A", smax(w1, w2, w3));
+ TEST_INSTRUCTION("4160C39A", smax(x1, x2, x3));
+ TEST_INSTRUCTION("4134C011", smax(w1, w2, 13));
+ TEST_INSTRUCTION("4134C091", smax(x1, x2, 13));
TEST_INSTRUCTION("230000D4", smc(1));
+ TEST_INSTRUCTION("4168C31A", smin(w1, w2, w3));
+ TEST_INSTRUCTION("4168C39A", smin(x1, x2, x3));
+ TEST_INSTRUCTION("4134C811", smin(w1, w2, 13));
+ TEST_INSTRUCTION("4134C891", smin(x1, x2, 13));
TEST_INSTRUCTION("41FC239B", smnegl(x1, w2, w3));
TEST_INSTRUCTION("4190239B", smsubl(x1, w2, w3, x4));
TEST_INSTRUCTION("417C439B", smulh(x1, x2, x3));
@@ -1095,6 +1115,14 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("41380553", ubfx(w1, w2, 5, 10));
TEST_INSTRUCTION("413845D3", ubfx(x1, x2, 5, 10));
TEST_INSTRUCTION("4110A39B", umaddl(x1, w2, w3, x4));
+ TEST_INSTRUCTION("4164C31A", umax(w1, w2, w3));
+ TEST_INSTRUCTION("4164C39A", umax(x1, x2, x3));
+ TEST_INSTRUCTION("4134C411", umax(w1, w2, 13));
+ TEST_INSTRUCTION("4134C491", umax(x1, x2, 13));
+ TEST_INSTRUCTION("416CC31A", umin(w1, w2, w3));
+ TEST_INSTRUCTION("416CC39A", umin(x1, x2, x3));
+ TEST_INSTRUCTION("4134CC11", umin(w1, w2, 13));
+ TEST_INSTRUCTION("4134CC91", umin(x1, x2, 13));
TEST_INSTRUCTION("41FCA39B", umnegl(x1, w2, w3));
TEST_INSTRUCTION("4190A39B", umsubl(x1, w2, w3, x4));
TEST_INSTRUCTION("417CC39B", umulh(x1, x2, x3));
@@ -1107,7 +1135,7 @@ static void ASMJIT_NOINLINE testA64AssemblerBase(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("FF2003D5", xpaclri());
}
-static void ASMJIT_NOINLINE testA64AssemblerRel(AssemblerTester<a64::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_aarch64_assembler_rel(AssemblerTester<a64::Assembler>& tester) noexcept {
using namespace a64;
// Must be a reference, because it's recreated after every `TEST_INSTRUCTION()`.
@@ -1157,7 +1185,7 @@ static void ASMJIT_NOINLINE testA64AssemblerRel(AssemblerTester<a64::Assembler>&
TEST_INSTRUCTION("010008B6", tbz(x1, 33, L0));
}
-static void ASMJIT_NOINLINE testA64AssemblerSIMD(AssemblerTester<a64::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_aarch64_assembler_simd(AssemblerTester<a64::Assembler>& tester) noexcept {
using namespace a64;
TEST_INSTRUCTION("41B8200E", abs(v1.b8(), v2.b8()));
@@ -1879,6 +1907,10 @@ static void ASMJIT_NOINLINE testA64AssemblerSIMD(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("01F4034F", fmov(v1.s4(), 0.5));
TEST_INSTRUCTION("01F4004F", fmov(v1.s4(), 2.0));
TEST_INSTRUCTION("01F4036F", fmov(v1.d2(), 0.5));
+ TEST_INSTRUCTION("00F4030F", fmov(v0.s2(), 0.5));
+ TEST_INSTRUCTION("00F4000F", fmov(v0.s2(), 2.0));
+ TEST_INSTRUCTION("00F4034F", fmov(v0.s4(), 0.5));
+ TEST_INSTRUCTION("00F4004F", fmov(v0.s4(), 2.0));
TEST_INSTRUCTION("01F4006F", fmov(v1.d2(), 2.0));
TEST_INSTRUCTION("4190C31F", fmsub(h1, h2, h3, h4));
TEST_INSTRUCTION("4190031F", fmsub(s1, s2, s3, s4));
@@ -2590,8 +2622,8 @@ static void ASMJIT_NOINLINE testA64AssemblerSIMD(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("419C234E", mul(v1.b16(), v2.b16(), v3.b16()));
TEST_INSTRUCTION("419C634E", mul(v1.h8(), v2.h8(), v3.h8()));
TEST_INSTRUCTION("419CA34E", mul(v1.s4(), v2.s4(), v3.s4()));
- TEST_INSTRUCTION("4158202E", mvn(v1.b8(), v2.b8()));
- TEST_INSTRUCTION("4158206E", mvn(v1.b16(), v2.b16()));
+ TEST_INSTRUCTION("4158202E", mvn_(v1.b8(), v2.b8()));
+ TEST_INSTRUCTION("4158206E", mvn_(v1.b16(), v2.b16()));
TEST_INSTRUCTION("4185012F", mvni(v1.h4(), 42));
TEST_INSTRUCTION("4105012F", mvni(v1.s2(), 42));
TEST_INSTRUCTION("4185016F", mvni(v1.h8(), 42));
@@ -3984,7 +4016,7 @@ static void ASMJIT_NOINLINE testA64AssemblerSIMD(AssemblerTester<a64::Assembler>
TEST_INSTRUCTION("4178C34E", zip2(v1.d2(), v2.d2(), v3.d2()));
}
-static void ASMJIT_NOINLINE testA64AssemblerExtras(AssemblerTester<a64::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_aarch64_assembler_extra(AssemblerTester<a64::Assembler>& tester) noexcept {
using namespace a64;
// AsmJit additions - AArch64 assembler accepts variety of immediates in
@@ -4005,19 +4037,19 @@ static void ASMJIT_NOINLINE testA64AssemblerExtras(AssemblerTester<a64::Assemble
TEST_INSTRUCTION("C167074F", movi(v1.d2(), 0xFE000000FE000000));
}
-bool testA64Assembler(const TestSettings& settings) noexcept {
+bool test_aarch64_assembler(const TestSettings& settings) noexcept {
using namespace a64;
AssemblerTester<Assembler> tester(Arch::kAArch64, settings);
- tester.printHeader("AArch64");
+ tester.print_header("AArch64");
- testA64AssemblerBase(tester);
- testA64AssemblerRel(tester);
- testA64AssemblerSIMD(tester);
- testA64AssemblerExtras(tester);
+ test_aarch64_assembler_base(tester);
+ test_aarch64_assembler_rel(tester);
+ test_aarch64_assembler_simd(tester);
+ test_aarch64_assembler_extra(tester);
- tester.printSummary();
- return tester.didPass();
+ tester.print_summary();
+ return tester.did_pass();
}
#undef TEST_INSTRUCTION
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x64.cpp
index 556c0eb9f5c..0fa2345a08e 100644
--- a/3rdparty/asmjit/test/asmjit_test_assembler_x64.cpp
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x64.cpp
@@ -1,25 +1,25 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#include <asmjit/core.h>
#if !defined(ASMJIT_NO_X86)
#include <asmjit/x86.h>
+
+#include <asmjit-testing/tests/asmjit_test_assembler.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "asmjit_test_assembler.h"
-#include "cmdline.h"
-
using namespace asmjit;
#define TEST_INSTRUCTION(OPCODE, ...) \
- tester.testValidInstruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__)
+ tester.test_valid_instruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__)
-static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_base(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("80D101" , adc(cl, 1));
@@ -915,6 +915,8 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester<x86::Assembler>
TEST_INSTRUCTION("0FA0" , push(fs));
TEST_INSTRUCTION("669C" , pushf());
TEST_INSTRUCTION("9C" , pushfq());
+ TEST_INSTRUCTION("66680100" , pushw(1));
+ TEST_INSTRUCTION("66683412" , pushw(0x1234));
TEST_INSTRUCTION("D2D1" , rcl(cl, cl));
TEST_INSTRUCTION("D0D1" , rcl(cl, 1));
TEST_INSTRUCTION("D2D5" , rcl(ch, cl));
@@ -1455,7 +1457,7 @@ static void ASMJIT_NOINLINE testX64AssemblerBase(AssemblerTester<x86::Assembler>
TEST_INSTRUCTION("48338C1A80000000" , xor_(rcx, qword_ptr(rdx, rbx, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerBaseExt(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_base_ext(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("0F38FC9C1180000000" , aadd(ptr(rcx, rdx, 0, 128), ebx));
@@ -1894,16 +1896,12 @@ static void ASMJIT_NOINLINE testX64AssemblerBaseExt(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("F3480FAED1" , wrfsbase(rcx));
TEST_INSTRUCTION("F30FAED9" , wrgsbase(ecx));
TEST_INSTRUCTION("F3480FAED9" , wrgsbase(rcx));
- TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx));
TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(rcx, rdx, 0, 128), ebx));
TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(rcx, rdx, 0, 128), ebx));
- TEST_INSTRUCTION("480F38F6D1" , wrssq(rcx, rdx));
TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(ptr(rcx, rdx, 0, 128), rbx));
TEST_INSTRUCTION("480F38F69C1180000000" , wrssq(qword_ptr(rcx, rdx, 0, 128), rbx));
- TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx));
TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(rcx, rdx, 0, 128), ebx));
TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(rcx, rdx, 0, 128), ebx));
- TEST_INSTRUCTION("66480F38F5D1" , wrussq(rcx, rdx));
TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(ptr(rcx, rdx, 0, 128), rbx));
TEST_INSTRUCTION("66480F38F59C1180000000" , wrussq(qword_ptr(rcx, rdx, 0, 128), rbx));
TEST_INSTRUCTION("0F01D5" , xend());
@@ -1926,7 +1924,7 @@ static void ASMJIT_NOINLINE testX64AssemblerBaseExt(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("0F01D6" , xtest());
}
-static void ASMJIT_NOINLINE testX64AssemblerMMX_SSE(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_mmx_sse(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2));
@@ -3076,7 +3074,7 @@ static void ASMJIT_NOINLINE testX64AssemblerMMX_SSE(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("0F578C1A80000000" , xorps(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3));
@@ -4625,7 +4623,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("C5F877" , vzeroupper());
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_NE_CONVERT(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_ne_convert(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E27AB18C1A80000000" , vbcstnebf162ps(xmm1, ptr(rdx, rbx, 0, 128)));
@@ -4658,7 +4656,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_NE_CONVERT(AssemblerTester<x86::
TEST_INSTRUCTION("C4E27E728C1A80000000" , vex().vcvtneps2bf16(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_vnni(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E25150F4" , vex().vpdpbusd(xmm6, xmm5, xmm4));
@@ -4671,7 +4669,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI(AssemblerTester<x86::Assemb
TEST_INSTRUCTION("C4E25553F4" , vex().vpdpwssds(ymm6, ymm5, ymm4));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI_INT8(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_vnni_int8(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E26B50CB" , vpdpbssd(xmm1, xmm2, xmm3));
@@ -4712,7 +4710,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI_INT8(AssemblerTester<x86::A
TEST_INSTRUCTION("C4E26C518C2B80000000" , vpdpbuuds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI_INT16(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_vnni_int16(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E26AD2CB" , vpdpwsud(xmm1, xmm2, xmm3));
@@ -4753,7 +4751,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_VNNI_INT16(AssemblerTester<x86::
TEST_INSTRUCTION("C4E26CD38C2B80000000" , vpdpwuuds(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_SHA512(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_sha512(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E27FCCCA" , vsha512msg1(ymm1, xmm2));
@@ -4761,7 +4759,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_SHA512(AssemblerTester<x86::Asse
TEST_INSTRUCTION("C4E26FCBCB" , vsha512rnds2(ymm1, ymm2, xmm3));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_SM3(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_sm3(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E268DACB" , vsm3msg1(xmm1, xmm2, xmm3));
@@ -4775,7 +4773,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_SM3(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("C4E369DE8C2B8000000001" , vsm3rnds2(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128), 1));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX_SM4(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx_sm4(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E26ADACB" , vsm4key4(xmm1, xmm2, xmm3));
@@ -4792,7 +4790,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX_SM4(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("C4E26FDA8C2B80000000" , vsm4rnds4(ymm1, ymm2, ymmword_ptr(rbx, rbp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerFMA(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_fma(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3));
@@ -5085,7 +5083,7 @@ static void ASMJIT_NOINLINE testX64AssemblerFMA(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerFMA4(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_fma4(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4));
@@ -5250,7 +5248,7 @@ static void ASMJIT_NOINLINE testX64AssemblerFMA4(AssemblerTester<x86::Assembler>
TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128), xmm6));
}
-static void ASMJIT_NOINLINE testX64AssemblerXOP(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_xop(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2));
@@ -5465,7 +5463,7 @@ static void ASMJIT_NOINLINE testX64AssemblerXOP(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(rdx, rbx, 0, 128), xmm4));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx512(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3));
@@ -5543,14 +5541,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("C4E1ED47CB" , kxord(k1, k2, k3));
TEST_INSTRUCTION("C4E1EC47CB" , kxorq(k1, k2, k3));
TEST_INSTRUCTION("C5EC47CB" , kxorw(k1, k2, k3));
- TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F1ED4858CB" , vaddpd(zmm1, zmm2, zmm3));
TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
@@ -5724,7 +5714,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F27E08724C1A08" , vcvtneps2bf16(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F27E28724C1A04" , vcvtneps2bf16(xmm1, ymmword_ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F27E4872CA" , vcvtneps2bf16(ymm1, zmm2));
- TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, zmmword_ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F1FF48E6CA" , vcvtpd2dq(ymm1, zmm2));
TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, ptr(rdx, rbx, 0, 128)));
@@ -5962,12 +5951,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F1ED485ECB" , vdivpd(zmm1, zmm2, zmm3));
TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F1ED485E4C2B02" , vdivpd(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F2FD48C8CA" , vexp2pd(zmm1, zmm2));
- TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F27D48C8CA" , vexp2ps(zmm1, zmm2));
- TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F2FD0888CA" , vexpandpd(xmm1, xmm2));
TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, xmmword_ptr(rdx, rbx, 0, 128)));
@@ -6178,14 +6161,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F27D09924C1A20" , k(k1).vgatherdps(xmm1, ptr(rdx, xmm3, 0, 128)));
TEST_INSTRUCTION("62F27D29924C1A20" , k(k1).vgatherdps(ymm1, ptr(rdx, ymm3, 0, 128)));
TEST_INSTRUCTION("62F27D49924C1A20" , k(k1).vgatherdps(zmm1, ptr(rdx, zmm3, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C64C1110" , k(k1).vgatherpf0dpd(ptr(rcx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C64C1120" , k(k1).vgatherpf0dps(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C74C1110" , k(k1).vgatherpf0qpd(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C74C1120" , k(k1).vgatherpf0qps(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C6541110" , k(k1).vgatherpf1dpd(ptr(rcx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C6541120" , k(k1).vgatherpf1dps(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C7541110" , k(k1).vgatherpf1qpd(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C7541120" , k(k1).vgatherpf1qps(ptr(rcx, zmm2, 0, 128)));
TEST_INSTRUCTION("62F2FD09934C1A10" , k(k1).vgatherqpd(xmm1, ptr(rdx, xmm3, 0, 128)));
TEST_INSTRUCTION("62F2FD29934C1A10" , k(k1).vgatherqpd(ymm1, ptr(rdx, ymm3, 0, 128)));
TEST_INSTRUCTION("62F2FD49934C1A10" , k(k1).vgatherqpd(zmm1, ptr(rdx, zmm3, 0, 128)));
@@ -6458,10 +6433,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F2DF4868D1" , vp2intersectq(k2, k3, zmm4, zmm1));
TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, ptr(rcx, rdx, 0, 128)));
TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, zmmword_ptr(rcx, rdx, 0, 128)));
- TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F27D481CCA" , vpabsb(zmm1, zmm2));
TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, ptr(rdx, rbx, 0, 128)));
TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
@@ -8086,18 +8057,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F26D084DCB" , vrcp14ss(xmm1, xmm2, xmm3));
TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CACA" , vrcp28pd(zmm1, zmm2));
- TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CACA" , vrcp28ps(zmm1, zmm2));
- TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CBCB" , vrcp28sd(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CBCB" , vrcp28ss(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F3FD0856CA01" , vreducepd(xmm1, xmm2, 1));
TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, ptr(rdx, rbx, 0, 128), 1));
TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, xmmword_ptr(rdx, rbx, 0, 128), 1));
@@ -8170,18 +8129,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F26D084FCB" , vrsqrt14ss(xmm1, xmm2, xmm3));
TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CCCA" , vrsqrt28pd(zmm1, zmm2));
- TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CCCA" , vrsqrt28ps(zmm1, zmm2));
- TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, zmmword_ptr(rdx, rbx, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CDCB" , vrsqrt28sd(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, qword_ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CDCB" , vrsqrt28ss(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, dword_ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F2ED082CCB" , vscalefpd(xmm1, xmm2, xmm3));
TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, ptr(rbx, rbp, 0, 128)));
TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, xmmword_ptr(rbx, rbp, 0, 128)));
@@ -8212,14 +8159,6 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F27D09A25C1120" , k(k1).vscatterdps(ptr(rcx, xmm2, 0, 128), xmm3));
TEST_INSTRUCTION("62F27D29A25C1120" , k(k1).vscatterdps(ptr(rcx, ymm2, 0, 128), ymm3));
TEST_INSTRUCTION("62F27D49A25C1120" , k(k1).vscatterdps(ptr(rcx, zmm2, 0, 128), zmm3));
- TEST_INSTRUCTION("62F2FD49C66C1110" , k(k1).vscatterpf0dpd(ptr(rcx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C66C1120" , k(k1).vscatterpf0dps(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C76C1110" , k(k1).vscatterpf0qpd(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C76C1120" , k(k1).vscatterpf0qps(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C6741110" , k(k1).vscatterpf1dpd(ptr(rcx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C6741120" , k(k1).vscatterpf1dps(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C7741110" , k(k1).vscatterpf1qpd(ptr(rcx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C7741120" , k(k1).vscatterpf1qps(ptr(rcx, zmm2, 0, 128)));
TEST_INSTRUCTION("62F2FD09A35C1110" , k(k1).vscatterqpd(ptr(rcx, xmm2, 0, 128), xmm3));
TEST_INSTRUCTION("62F2FD29A35C1110" , k(k1).vscatterqpd(ptr(rcx, ymm2, 0, 128), ymm3));
TEST_INSTRUCTION("62F2FD49A35C1110" , k(k1).vscatterqpd(ptr(rcx, zmm2, 0, 128), zmm3));
@@ -8288,7 +8227,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, zmmword_ptr(rbx, rbp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX512_FP16(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx512_fp16(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("62F5560810F4" , vmovsh(xmm6, xmm5, xmm4));
@@ -8316,7 +8255,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_FP16(AssemblerTester<x86::Ass
// Tests generated from 'llvm/test/MC/X86/intel-syntax-avx512.s' file to ensure compatibility with LLVM assembler.
//
// NOTE: Split to 4 functions as compilers can be really slow when compiling it for some reason.
-static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_1(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx512_llvm_1(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("62F174485808" , vaddps(zmm1, zmm1, zmmword_ptr(rax)));
@@ -10078,7 +10017,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_1(AssemblerTester<x86::A
TEST_INSTRUCTION("62621508BF92FCFDFFFF" , vfnmsub231ss(xmm26, xmm13, dword_ptr(rdx, -516)));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_2(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx512_llvm_2(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("6212FD4842F1" , vgetexppd(zmm14, zmm25));
@@ -13123,7 +13062,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_2(AssemblerTester<x86::A
TEST_INSTRUCTION("62E2D55877A2F8FBFFFF" , vpermi2pd(zmm20, zmm5, qword_ptr(rdx, -1032)._1to8()));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_3(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx512_llvm_3(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("62E1A54858CA" , vaddpd(zmm17, zmm11, zmm2));
@@ -15420,7 +15359,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_3(AssemblerTester<x86::A
TEST_INSTRUCTION("62619D58DB9AF8FBFFFF" , vpandq(zmm27, zmm12, qword_ptr(rdx, -1032)._1to8()));
}
-static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_4(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_avx512_llvm_4(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("62C23D4064FC" , vpblendmd(zmm23, zmm24, zmm12));
@@ -17923,7 +17862,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAVX512_LLVM_4(AssemblerTester<x86::A
TEST_INSTRUCTION("62B2FD49A1948100040000" , k(k1).vpscatterqq(zmmword_ptr(rcx, zmm8, 2, 1024), zmm2));
}
-static void ASMJIT_NOINLINE testX64AssemblerAMX(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_amx(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E27849841180000000" , ldtilecfg(ptr(rcx, rdx, 0, 128)));
@@ -17945,7 +17884,7 @@ static void ASMJIT_NOINLINE testX64AssemblerAMX(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("C4E27B49C8" , tilezero(tmm1));
}
-static void ASMJIT_NOINLINE testX64AssemblerExtras(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x64_assembler_extra(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
// Extended X64 tests.
@@ -18096,37 +18035,37 @@ static void ASMJIT_NOINLINE testX64AssemblerExtras(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("0F01DF" , invlpga(rax, ecx));
}
-bool testX64Assembler(const TestSettings& settings) noexcept {
+bool test_x64_assembler(const TestSettings& settings) noexcept {
using namespace x86;
AssemblerTester<Assembler> tester(Arch::kX64, settings);
- tester.printHeader("X64");
+ tester.print_header("X64");
- testX64AssemblerBase(tester);
- testX64AssemblerBaseExt(tester);
- testX64AssemblerMMX_SSE(tester);
- testX64AssemblerAVX(tester);
- testX64AssemblerAVX_NE_CONVERT(tester);
- testX64AssemblerAVX_VNNI(tester);
- testX64AssemblerAVX_VNNI_INT8(tester);
- testX64AssemblerAVX_VNNI_INT16(tester);
- testX64AssemblerAVX_SHA512(tester);
- testX64AssemblerAVX_SM3(tester);
- testX64AssemblerAVX_SM4(tester);
- testX64AssemblerFMA(tester);
- testX64AssemblerFMA4(tester);
- testX64AssemblerXOP(tester);
- testX64AssemblerAVX512(tester);
- testX64AssemblerAVX512_FP16(tester);
- testX64AssemblerAVX512_LLVM_1(tester);
- testX64AssemblerAVX512_LLVM_2(tester);
- testX64AssemblerAVX512_LLVM_3(tester);
- testX64AssemblerAVX512_LLVM_4(tester);
- testX64AssemblerAMX(tester);
- testX64AssemblerExtras(tester);
+ test_x64_assembler_base(tester);
+ test_x64_assembler_base_ext(tester);
+ test_x64_assembler_mmx_sse(tester);
+ test_x64_assembler_avx(tester);
+ test_x64_assembler_avx_ne_convert(tester);
+ test_x64_assembler_avx_vnni(tester);
+ test_x64_assembler_avx_vnni_int8(tester);
+ test_x64_assembler_avx_vnni_int16(tester);
+ test_x64_assembler_avx_sha512(tester);
+ test_x64_assembler_avx_sm3(tester);
+ test_x64_assembler_avx_sm4(tester);
+ test_x64_assembler_fma(tester);
+ test_x64_assembler_fma4(tester);
+ test_x64_assembler_xop(tester);
+ test_x64_assembler_avx512(tester);
+ test_x64_assembler_avx512_fp16(tester);
+ test_x64_assembler_avx512_llvm_1(tester);
+ test_x64_assembler_avx512_llvm_2(tester);
+ test_x64_assembler_avx512_llvm_3(tester);
+ test_x64_assembler_avx512_llvm_4(tester);
+ test_x64_assembler_amx(tester);
+ test_x64_assembler_extra(tester);
- tester.printSummary();
- return tester.didPass();
+ tester.print_summary();
+ return tester.did_pass();
}
#undef TEST_INSTRUCTION
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x86.cpp
index 6143d8cef91..c273d17c400 100644
--- a/3rdparty/asmjit/test/asmjit_test_assembler_x86.cpp
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x86.cpp
@@ -1,28 +1,28 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#include <asmjit/core.h>
#if !defined(ASMJIT_NO_X86)
#include <asmjit/x86.h>
+
+#include <asmjit-testing/tests/asmjit_test_assembler.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "asmjit_test_assembler.h"
-#include "cmdline.h"
-
using namespace asmjit;
#define TEST_INSTRUCTION(OPCODE, ...) \
- tester.testValidInstruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__)
+ tester.test_valid_instruction(#__VA_ARGS__, OPCODE, tester.assembler.__VA_ARGS__)
#define FAIL_INSTRUCTION(ExpectedError, ...) \
- tester.testInvalidInstruction(#__VA_ARGS__, ExpectedError, tester.assembler.__VA_ARGS__)
+ tester.test_invalid_instruction(#__VA_ARGS__, ExpectedError, tester.assembler.__VA_ARGS__)
-static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_base(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("37" , aaa(ax));
@@ -710,6 +710,8 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester<x86::Assembler>
TEST_INSTRUCTION("60" , pushad());
TEST_INSTRUCTION("669C" , pushf());
TEST_INSTRUCTION("9C" , pushfd());
+ TEST_INSTRUCTION("66680100" , pushw(1));
+ TEST_INSTRUCTION("66683412" , pushw(0x1234));
TEST_INSTRUCTION("D2D1" , rcl(cl, cl));
TEST_INSTRUCTION("D0D1" , rcl(cl, 1));
TEST_INSTRUCTION("D2D5" , rcl(ch, cl));
@@ -1164,7 +1166,7 @@ static void ASMJIT_NOINLINE testX86AssemblerBase(AssemblerTester<x86::Assembler>
TEST_INSTRUCTION("338C1A80000000" , xor_(ecx, dword_ptr(edx, ebx, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerBaseExt(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_base_ext(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("0F38FC9C1180000000" , aadd(ptr(ecx, edx, 0, 128), ebx));
@@ -1434,10 +1436,8 @@ static void ASMJIT_NOINLINE testX86AssemblerBaseExt(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(ptr(ecx, edx, 0, 128)));
TEST_INSTRUCTION("F30FC7B41180000000" , vmxon(qword_ptr(ecx, edx, 0, 128)));
TEST_INSTRUCTION("F30F09" , wbnoinvd());
- TEST_INSTRUCTION("0F38F6D1" , wrssd(ecx, edx));
TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(ptr(ecx, edx, 0, 128), ebx));
TEST_INSTRUCTION("0F38F69C1180000000" , wrssd(dword_ptr(ecx, edx, 0, 128), ebx));
- TEST_INSTRUCTION("660F38F5D1" , wrussd(ecx, edx));
TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(ptr(ecx, edx, 0, 128), ebx));
TEST_INSTRUCTION("660F38F59C1180000000" , wrussd(dword_ptr(ecx, edx, 0, 128), ebx));
TEST_INSTRUCTION("0F01D5" , xend());
@@ -1454,7 +1454,7 @@ static void ASMJIT_NOINLINE testX86AssemblerBaseExt(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("0F01D6" , xtest());
}
-static void ASMJIT_NOINLINE testX86AssemblerMMX_SSE(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_mmx_sse(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("660F58CA" , addpd(xmm1, xmm2));
@@ -2578,7 +2578,7 @@ static void ASMJIT_NOINLINE testX86AssemblerMMX_SSE(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("0F578C1A80000000" , xorps(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C5E958CB" , vaddpd(xmm1, xmm2, xmm3));
@@ -4107,7 +4107,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("C5F877" , vzeroupper());
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_NE_CONVERT(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_ne_convert(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E27AB18C1A80000000" , vbcstnebf162ps(xmm1, ptr(edx, ebx, 0, 128)));
@@ -4140,7 +4140,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_NE_CONVERT(AssemblerTester<x86::
TEST_INSTRUCTION("C4E27E728C1A80000000" , vex().vcvtneps2bf16(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_vnni(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E25150F4" , vex().vpdpbusd(xmm6, xmm5, xmm4));
@@ -4153,7 +4153,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI(AssemblerTester<x86::Assemb
TEST_INSTRUCTION("C4E25553F4" , vex().vpdpwssds(ymm6, ymm5, ymm4));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI_INT8(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_vnni_int8(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E26B50CB" , vpdpbssd(xmm1, xmm2, xmm3));
@@ -4194,7 +4194,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI_INT8(AssemblerTester<x86::A
TEST_INSTRUCTION("C4E26C518C2B80000000" , vpdpbuuds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI_INT16(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_vnni_int16(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E26AD2CB" , vpdpwsud(xmm1, xmm2, xmm3));
@@ -4235,7 +4235,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_VNNI_INT16(AssemblerTester<x86::
TEST_INSTRUCTION("C4E26CD38C2B80000000" , vpdpwuuds(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_SHA512(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_sha512(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E27FCCCA" , vsha512msg1(ymm1, xmm2));
@@ -4243,7 +4243,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_SHA512(AssemblerTester<x86::Asse
TEST_INSTRUCTION("C4E26FCBCB" , vsha512rnds2(ymm1, ymm2, xmm3));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_SM3(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_sm3(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E268DACB" , vsm3msg1(xmm1, xmm2, xmm3));
@@ -4257,7 +4257,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_SM3(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("C4E369DE8C2B8000000001" , vsm3rnds2(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128), 1));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX_SM4(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx_sm4(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E26ADACB" , vsm4key4(xmm1, xmm2, xmm3));
@@ -4274,7 +4274,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX_SM4(AssemblerTester<x86::Assembl
TEST_INSTRUCTION("C4E26FDA8C2B80000000" , vsm4rnds4(ymm1, ymm2, ymmword_ptr(ebx, ebp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerFMA(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_fma(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E2E998CB" , vfmadd132pd(xmm1, xmm2, xmm3));
@@ -4567,7 +4567,7 @@ static void ASMJIT_NOINLINE testX86AssemblerFMA(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("C4E269BF8C2B80000000" , vfnmsub231ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerFMA4(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_fma4(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C4E3E969CC30" , vfmaddpd(xmm1, xmm2, xmm3, xmm4));
@@ -4732,7 +4732,7 @@ static void ASMJIT_NOINLINE testX86AssemblerFMA4(AssemblerTester<x86::Assembler>
TEST_INSTRUCTION("C4E3697E8C2B8000000060" , vfnmsubss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128), xmm6));
}
-static void ASMJIT_NOINLINE testX86AssemblerXOP(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_xop(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("8FE97881CA" , vfrczpd(xmm1, xmm2));
@@ -4947,7 +4947,7 @@ static void ASMJIT_NOINLINE testX86AssemblerXOP(AssemblerTester<x86::Assembler>&
TEST_INSTRUCTION("8FE958958C1A80000000" , vpshlw(xmm1, xmmword_ptr(edx, ebx, 0, 128), xmm4));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx512(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("C5ED4ACB" , kaddb(k1, k2, k3));
@@ -5023,14 +5023,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("C4E1ED47CB" , kxord(k1, k2, k3));
TEST_INSTRUCTION("C4E1EC47CB" , kxorq(k1, k2, k3));
TEST_INSTRUCTION("C5EC47CB" , kxorw(k1, k2, k3));
- TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F489A4C1A08" , v4fmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F089B4C1A08" , v4fmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F48AA4C1A08" , v4fnmaddps(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F08AB4C1A08" , v4fnmaddss(xmm1, xmm4, xmm5, xmm6, xmm7, xmmword_ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F1ED4858CB" , vaddpd(zmm1, zmm2, zmm3));
TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F1ED48584C2B02" , vaddpd(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
@@ -5204,7 +5196,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F27E08724C1A08" , vcvtneps2bf16(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F27E28724C1A04" , vcvtneps2bf16(xmm1, ymmword_ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F27E4872CA" , vcvtneps2bf16(ymm1, zmm2));
- TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F27E48724C1A02" , vcvtneps2bf16(ymm1, zmmword_ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F1FF48E6CA" , vcvtpd2dq(ymm1, zmm2));
TEST_INSTRUCTION("62F1FF48E64C1A02" , vcvtpd2dq(ymm1, ptr(edx, ebx, 0, 128)));
@@ -5426,12 +5417,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F26E4852CB" , vdpbf16ps(zmm1, zmm2, zmm3));
TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F26E48524C2B02" , vdpbf16ps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F2FD48C8CA" , vexp2pd(zmm1, zmm2));
- TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F2FD48C84C1A02" , vexp2pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F27D48C8CA" , vexp2ps(zmm1, zmm2));
- TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F27D48C84C1A02" , vexp2ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F2FD0888CA" , vexpandpd(xmm1, xmm2));
TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F2FD08884C1A10" , vexpandpd(xmm1, xmmword_ptr(edx, ebx, 0, 128)));
@@ -5642,14 +5627,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F27D09924C1A20" , k(k1).vgatherdps(xmm1, ptr(edx, xmm3, 0, 128)));
TEST_INSTRUCTION("62F27D29924C1A20" , k(k1).vgatherdps(ymm1, ptr(edx, ymm3, 0, 128)));
TEST_INSTRUCTION("62F27D49924C1A20" , k(k1).vgatherdps(zmm1, ptr(edx, zmm3, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C64C1110" , k(k1).vgatherpf0dpd(ptr(ecx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C64C1120" , k(k1).vgatherpf0dps(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C74C1110" , k(k1).vgatherpf0qpd(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C74C1120" , k(k1).vgatherpf0qps(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C6541110" , k(k1).vgatherpf1dpd(ptr(ecx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C6541120" , k(k1).vgatherpf1dps(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C7541110" , k(k1).vgatherpf1qpd(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C7541120" , k(k1).vgatherpf1qps(ptr(ecx, zmm2, 0, 128)));
TEST_INSTRUCTION("62F2FD09934C1A10" , k(k1).vgatherqpd(xmm1, ptr(edx, xmm3, 0, 128)));
TEST_INSTRUCTION("62F2FD29934C1A10" , k(k1).vgatherqpd(ymm1, ptr(edx, ymm3, 0, 128)));
TEST_INSTRUCTION("62F2FD49934C1A10" , k(k1).vgatherqpd(zmm1, ptr(edx, zmm3, 0, 128)));
@@ -5918,10 +5895,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F2DF4868D1" , vp2intersectq(k2, k3, zmm4, zmm1));
TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, ptr(ecx, edx, 0, 128)));
TEST_INSTRUCTION("62F2DF4868541102" , vp2intersectq(k2, k3, zmm4, zmmword_ptr(ecx, edx, 0, 128)));
- TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F48524C1A08" , vp4dpwssd(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F25F48534C1A08" , vp4dpwssds(zmm1, zmm4, zmm5, zmm6, zmm7, xmmword_ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F27D481CCA" , vpabsb(zmm1, zmm2));
TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, ptr(edx, ebx, 0, 128)));
TEST_INSTRUCTION("62F27D481C4C1A02" , vpabsb(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
@@ -7543,18 +7516,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F26D084DCB" , vrcp14ss(xmm1, xmm2, xmm3));
TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F26D084D4C2B20" , vrcp14ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CACA" , vrcp28pd(zmm1, zmm2));
- TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CA4C1A02" , vrcp28pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CACA" , vrcp28ps(zmm1, zmm2));
- TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CA4C1A02" , vrcp28ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CBCB" , vrcp28sd(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CB4C2B10" , vrcp28sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CBCB" , vrcp28ss(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CB4C2B20" , vrcp28ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F3FD0856CA01" , vreducepd(xmm1, xmm2, 1));
TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, ptr(edx, ebx, 0, 128), 1));
TEST_INSTRUCTION("62F3FD08564C1A0801" , vreducepd(xmm1, xmmword_ptr(edx, ebx, 0, 128), 1));
@@ -7627,18 +7588,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F26D084FCB" , vrsqrt14ss(xmm1, xmm2, xmm3));
TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F26D084F4C2B20" , vrsqrt14ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CCCA" , vrsqrt28pd(zmm1, zmm2));
- TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F2FD48CC4C1A02" , vrsqrt28pd(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CCCA" , vrsqrt28ps(zmm1, zmm2));
- TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F27D48CC4C1A02" , vrsqrt28ps(zmm1, zmmword_ptr(edx, ebx, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CDCB" , vrsqrt28sd(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F2ED08CD4C2B10" , vrsqrt28sd(xmm1, xmm2, qword_ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CDCB" , vrsqrt28ss(xmm1, xmm2, xmm3));
- TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
- TEST_INSTRUCTION("62F26D08CD4C2B20" , vrsqrt28ss(xmm1, xmm2, dword_ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F2ED082CCB" , vscalefpd(xmm1, xmm2, xmm3));
TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, ptr(ebx, ebp, 0, 128)));
TEST_INSTRUCTION("62F2ED082C4C2B08" , vscalefpd(xmm1, xmm2, xmmword_ptr(ebx, ebp, 0, 128)));
@@ -7669,14 +7618,6 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F27D09A25C1120" , k(k1).vscatterdps(ptr(ecx, xmm2, 0, 128), xmm3));
TEST_INSTRUCTION("62F27D29A25C1120" , k(k1).vscatterdps(ptr(ecx, ymm2, 0, 128), ymm3));
TEST_INSTRUCTION("62F27D49A25C1120" , k(k1).vscatterdps(ptr(ecx, zmm2, 0, 128), zmm3));
- TEST_INSTRUCTION("62F2FD49C66C1110" , k(k1).vscatterpf0dpd(ptr(ecx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C66C1120" , k(k1).vscatterpf0dps(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C76C1110" , k(k1).vscatterpf0qpd(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C76C1120" , k(k1).vscatterpf0qps(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C6741110" , k(k1).vscatterpf1dpd(ptr(ecx, ymm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C6741120" , k(k1).vscatterpf1dps(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F2FD49C7741110" , k(k1).vscatterpf1qpd(ptr(ecx, zmm2, 0, 128)));
- TEST_INSTRUCTION("62F27D49C7741120" , k(k1).vscatterpf1qps(ptr(ecx, zmm2, 0, 128)));
TEST_INSTRUCTION("62F2FD09A35C1110" , k(k1).vscatterqpd(ptr(ecx, xmm2, 0, 128), xmm3));
TEST_INSTRUCTION("62F2FD29A35C1110" , k(k1).vscatterqpd(ptr(ecx, ymm2, 0, 128), ymm3));
TEST_INSTRUCTION("62F2FD49A35C1110" , k(k1).vscatterqpd(ptr(ecx, zmm2, 0, 128), zmm3));
@@ -7739,7 +7680,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512(AssemblerTester<x86::Assemble
TEST_INSTRUCTION("62F16C48574C2B02" , vxorps(zmm1, zmm2, zmmword_ptr(ebx, ebp, 0, 128)));
}
-static void ASMJIT_NOINLINE testX86AssemblerAVX512_FP16(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_avx512_FP16(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
TEST_INSTRUCTION("62F5560810F4" , vmovsh(xmm6, xmm5, xmm4));
@@ -8383,7 +8324,7 @@ static void ASMJIT_NOINLINE testX86AssemblerAVX512_FP16(AssemblerTester<x86::Ass
TEST_INSTRUCTION("62F6568FD77280" , k(k7).z().vfmulcsh(xmm6, xmm5, dword_ptr(edx, -512)));
}
-static void ASMJIT_NOINLINE testX86AssemblerExtras(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_extra(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
// Extended X86 tests.
@@ -8506,7 +8447,7 @@ static void ASMJIT_NOINLINE testX86AssemblerExtras(AssemblerTester<x86::Assemble
/*
// TODO: Failures can be enabled once the assembler always validates.
-static void ASMJIT_NOINLINE testX86AssemblerFailures(AssemblerTester<x86::Assembler>& tester) noexcept {
+static void ASMJIT_NOINLINE test_x86_assembler_failures(AssemblerTester<x86::Assembler>& tester) noexcept {
using namespace x86;
FAIL_INSTRUCTION(kErrorInvalidInstruction , movs(byte_ptr(eax), byte_ptr(esi)));
@@ -8515,34 +8456,34 @@ static void ASMJIT_NOINLINE testX86AssemblerFailures(AssemblerTester<x86::Assemb
}
*/
-bool testX86Assembler(const TestSettings& settings) noexcept {
+bool test_x86_assembler(const TestSettings& settings) noexcept {
using namespace x86;
AssemblerTester<Assembler> tester(Arch::kX86, settings);
- tester.printHeader("X86");
+ tester.print_header("X86");
- testX86AssemblerBase(tester);
- testX86AssemblerBaseExt(tester);
- testX86AssemblerMMX_SSE(tester);
- testX86AssemblerAVX(tester);
- testX86AssemblerAVX_NE_CONVERT(tester);
- testX86AssemblerAVX_VNNI(tester);
- testX86AssemblerAVX_VNNI_INT8(tester);
- testX86AssemblerAVX_VNNI_INT16(tester);
- testX86AssemblerAVX_SHA512(tester);
- testX86AssemblerAVX_SM3(tester);
- testX86AssemblerAVX_SM4(tester);
- testX86AssemblerFMA(tester);
- testX86AssemblerFMA4(tester);
- testX86AssemblerXOP(tester);
- testX86AssemblerAVX512(tester);
- testX86AssemblerAVX512_FP16(tester);
- testX86AssemblerExtras(tester);
+ test_x86_assembler_base(tester);
+ test_x86_assembler_base_ext(tester);
+ test_x86_assembler_mmx_sse(tester);
+ test_x86_assembler_avx(tester);
+ test_x86_assembler_avx_ne_convert(tester);
+ test_x86_assembler_avx_vnni(tester);
+ test_x86_assembler_avx_vnni_int8(tester);
+ test_x86_assembler_avx_vnni_int16(tester);
+ test_x86_assembler_avx_sha512(tester);
+ test_x86_assembler_avx_sm3(tester);
+ test_x86_assembler_avx_sm4(tester);
+ test_x86_assembler_fma(tester);
+ test_x86_assembler_fma4(tester);
+ test_x86_assembler_xop(tester);
+ test_x86_assembler_avx512(tester);
+ test_x86_assembler_avx512_FP16(tester);
+ test_x86_assembler_extra(tester);
- // testX86AssemblerFailures(tester);
+ // test_x86_assembler_failures(tester);
- tester.printSummary();
- return tester.didPass();
+ tester.print_summary();
+ return tester.did_pass();
}
#undef FAIL_INSTRUCTION
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.cpp
new file mode 100644
index 00000000000..13765e0d73b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.cpp
@@ -0,0 +1,407 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <memory>
+#include <vector>
+#include <chrono>
+
+#if !defined(ASMJIT_NO_COMPILER)
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/commons/cmdline.h>
+#include <asmjit-testing/commons/performancetimer.h>
+#include <asmjit-testing/tests/asmjit_test_compiler.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86.h>
+ void compiler_add_x86_tests(TestApp& app);
+#endif // !ASMJIT_NO_X86
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/a64.h>
+ void compiler_add_a64_tests(TestApp& app);
+#endif // !ASMJIT_NO_AARCH64
+
+using namespace asmjit;
+
+int TestApp::handle_args(int argc, const char* const* argv) {
+ CmdLine cmd(argc, argv);
+ _arch = cmd.value_of("--arch", "all");
+ _filter = cmd.value_of("--filter", nullptr);
+
+ if (cmd.has_arg("--help")) _help_only = true;
+ if (cmd.has_arg("--verbose")) _verbose = true;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (cmd.has_arg("--dump-asm")) _dump_asm = true;
+#endif // !ASMJIT_NO_LOGGING
+
+ if (cmd.has_arg("--dump-hex")) _dump_hex = true;
+
+ return 0;
+}
+
+void TestApp::show_info() {
+ printf("AsmJit Compiler Test-Suite v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+
+ printf("Usage:\n");
+ printf(" --help Show usage only\n");
+ printf(" --arch=<NAME> Select architecture to run ('all' by default)\n");
+ printf(" --filter=<NAME> Use a filter to restrict which test is called\n");
+ printf(" --verbose Verbose output\n");
+ printf(" --dump-asm Assembler output\n");
+ printf(" --dump-hex Hexadecimal output (relocated, only for host arch)\n");
+ printf("\n");
+}
+
+#ifndef ASMJIT_NO_LOGGING
+class IndentedStdoutLogger : public Logger {
+public:
+ ASMJIT_NONCOPYABLE(IndentedStdoutLogger)
+
+ size_t _indentation = 0;
+
+ explicit IndentedStdoutLogger(size_t indentation) noexcept
+ : _indentation(indentation) {}
+
+ Error _log(const char* data, size_t size = SIZE_MAX) noexcept override {
+ asmjit::Support::maybe_unused(size);
+ print_indented(data, _indentation);
+ return Error::kOk;
+ }
+};
+#endif // !ASMJIT_NO_LOGGING
+
+bool TestApp::should_run(const TestCase* tc) {
+ if (!_filter)
+ return true;
+
+ return strstr(tc->name(), _filter) != nullptr;
+}
+
+int TestApp::run() {
+#ifndef ASMJIT_NO_LOGGING
+ FormatOptions format_options;
+ format_options.add_flags(
+ FormatFlags::kMachineCode |
+ FormatFlags::kShowAliases |
+ FormatFlags::kExplainImms |
+ FormatFlags::kRegCasts );
+ format_options.set_indentation(FormatIndentationGroup::kCode, 2);
+
+ IndentedStdoutLogger print_logger(4);
+ print_logger.set_options(format_options);
+
+ StringLogger string_logger;
+ string_logger.set_options(format_options);
+
+ auto print_string_logger_content = [&]() {
+ if (!_verbose) {
+ printf("%s", string_logger.data());
+ fflush(stdout);
+ }
+ };
+#else
+ auto print_string_logger_content = [&]() {};
+#endif // !ASMJIT_NO_LOGGING
+
+ // maybe unused...
+ Support::maybe_unused(print_string_logger_content);
+
+#ifndef ASMJIT_NO_JIT
+ JitRuntime runtime;
+#endif // !ASMJIT_NO_JIT
+
+ PerformanceTimer compile_timer;
+ PerformanceTimer finalize_timer;
+
+ double compile_time = 0;
+ double finalize_time = 0;
+
+ for (std::unique_ptr<TestCase>& test : _tests) {
+ if (!should_run(test.get()))
+ continue;
+
+ _num_tests++;
+
+ for (uint32_t pass = 0; pass < 2; pass++) {
+ bool runnable = false;
+ CodeHolder code;
+ SimpleErrorHandler error_handler;
+
+ const char* status_separator = " ";
+
+ // Filter architecture to run.
+ if (strcmp(_arch, "all") != 0) {
+ switch (test->arch()) {
+ case Arch::kX86:
+ if (strcmp(_arch, "x86") == 0)
+ break;
+ continue;
+ case Arch::kX64:
+ if (strcmp(_arch, "x64") == 0)
+ break;
+ continue;
+ case Arch::kAArch64:
+ if (strcmp(_arch, "aarch64") == 0)
+ break;
+ continue;
+ default:
+ continue;
+ }
+ }
+
+ // Use platform environment and CPU features when the test can run on the arch.
+#ifndef ASMJIT_NO_JIT
+ if (runtime.arch() == test->arch()) {
+ code.init(runtime.environment(), runtime.cpu_features());
+ runnable = true;
+ }
+#endif // !ASMJIT_NO_JIT
+
+ if (!code.is_initialized()) {
+ Environment custom_env;
+ CpuFeatures features;
+
+ switch (test->arch()) {
+ case Arch::kX86:
+ case Arch::kX64:
+ features.add(CpuFeatures::X86::kADX,
+ CpuFeatures::X86::kAVX,
+ CpuFeatures::X86::kAVX2,
+ CpuFeatures::X86::kBMI,
+ CpuFeatures::X86::kBMI2,
+ CpuFeatures::X86::kCMOV,
+ CpuFeatures::X86::kF16C,
+ CpuFeatures::X86::kFMA,
+ CpuFeatures::X86::kFPU,
+ CpuFeatures::X86::kI486,
+ CpuFeatures::X86::kLZCNT,
+ CpuFeatures::X86::kMMX,
+ CpuFeatures::X86::kMMX2,
+ CpuFeatures::X86::kPOPCNT,
+ CpuFeatures::X86::kSSE,
+ CpuFeatures::X86::kSSE2,
+ CpuFeatures::X86::kSSE3,
+ CpuFeatures::X86::kSSSE3,
+ CpuFeatures::X86::kSSE4_1,
+ CpuFeatures::X86::kSSE4_2);
+ break;
+
+ case Arch::kAArch64:
+ features.add(CpuFeatures::ARM::kAES,
+ CpuFeatures::ARM::kASIMD,
+ CpuFeatures::ARM::kIDIVA,
+ CpuFeatures::ARM::kIDIVT,
+ CpuFeatures::ARM::kPMULL);
+ break;
+
+ default:
+ break;
+ }
+
+ custom_env.init(test->arch());
+ code.init(custom_env, features);
+ }
+
+ code.set_error_handler(&error_handler);
+
+ if (pass != 0) {
+ printf("[Test:%s] %s", asmjit_arch_as_string(test->arch()), test->name());
+ fflush(stdout);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_verbose || _dump_asm || _dump_hex) {
+ printf("\n");
+ status_separator = " ";
+ }
+
+ if (_verbose) {
+ printf(" [Log]\n");
+ code.set_logger(&print_logger);
+ }
+ else {
+ string_logger.clear();
+ code.set_logger(&string_logger);
+ }
+#endif // !ASMJIT_NO_LOGGING
+ }
+
+ std::unique_ptr<BaseCompiler> cc;
+
+#ifndef ASMJIT_NO_X86
+ if (code.arch() == Arch::kX86 || code.arch() == Arch::kX64)
+ cc = std::make_unique<x86::Compiler>(&code);
+#endif // !ASMJIT_NO_X86
+
+#ifndef ASMJIT_NO_AARCH64
+ if (code.arch() == Arch::kAArch64)
+ cc = std::make_unique<a64::Compiler>(&code);
+#endif // !ASMJIT_NO_AARCH64
+
+ if (!cc)
+ continue;
+
+#ifndef ASMJIT_NO_LOGGING
+ cc->add_diagnostic_options(DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll);
+#endif // !ASMJIT_NO_LOGGING
+
+ compile_timer.start();
+ test->compile(*cc);
+ compile_timer.stop();
+
+ Error err = error_handler._err;
+ if (err == Error::kOk) {
+ finalize_timer.start();
+ err = cc->finalize();
+ finalize_timer.stop();
+ }
+
+ // The first pass is only used for timing of serialization and compilation, because otherwise it would be
+ // biased by logging, which takes much more time than finalize() does. We want to benchmark Compiler the
+ // way it would be used in the production.
+ if (pass == 0) {
+ _output_size += code.code_size();
+ compile_time += compile_timer.duration();
+ finalize_time += finalize_timer.duration();
+ continue;
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_dump_asm) {
+ String sb;
+ Formatter::format_node_list(sb, format_options, cc.get());
+ printf(" [Assembly]\n");
+ print_indented(sb.data(), 4);
+ }
+#endif // !ASMJIT_NO_LOGGING
+
+#ifndef ASMJIT_NO_JIT
+ if (runnable) {
+ void* func = nullptr;
+ if (err == Error::kOk)
+ err = runtime.add(&func, &code);
+
+ if (err == Error::kOk && _dump_hex) {
+ String sb;
+ sb.append_hex((void*)func, code.code_size());
+ printf(" [Hex Dump]:\n");
+ for (size_t i = 0; i < sb.size(); i += 76) {
+ printf(" %.60s\n", sb.data() + i);
+ }
+ }
+
+ if (_verbose)
+ fflush(stdout);
+
+ if (err == Error::kOk) {
+ StringTmp<128> result;
+ StringTmp<128> expect;
+
+ if (test->run(func, result, expect)) {
+ if (!_verbose)
+ printf("%s[RUN OK]\n", status_separator);
+ }
+ else {
+ if (!_verbose)
+ printf("%s[RUN FAILED]\n", status_separator);
+
+ print_string_logger_content();
+ printf(" [Output]\n");
+ printf(" Returned: %s\n", result.data());
+ printf(" Expected: %s\n", expect.data());
+ _num_failed++;
+ }
+
+ if (_dump_asm)
+ printf("\n");
+
+ runtime.release(func);
+ }
+ else {
+ if (!_verbose)
+ printf("%s[COMPILE FAILED]\n", status_separator);
+
+ print_string_logger_content();
+ printf(" [Status]\n");
+ printf(" ERROR 0x%08X: %s\n", unsigned(err), error_handler._message.data());
+ _num_failed++;
+ }
+ }
+#endif // !ASMJIT_NO_JIT
+
+ if (!runnable) {
+ if (err != Error::kOk) {
+ printf(" [Status]\n");
+ printf(" ERROR 0x%08X: %s\n", unsigned(err), error_handler._message.data());
+ _num_failed++;
+ }
+ else {
+ printf("%s[COMPILE OK]\n", status_separator);
+ }
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_verbose || _dump_asm || _dump_hex) {
+ printf("\n");
+ }
+#endif // !ASMJIT_NO_LOGGING
+ }
+ }
+
+ printf("\n");
+ printf("Summary:\n");
+ printf(" OutputSize: %zu bytes\n", _output_size);
+ printf(" CompileTime: %.2f ms\n", compile_time);
+ printf(" FinalizeTime: %.2f ms\n", finalize_time);
+ printf("\n");
+
+ if (_num_failed == 0)
+ printf("** SUCCESS: All %u tests passed **\n", _num_tests);
+ else
+ printf("** FAILURE: %u of %u tests failed **\n", _num_failed, _num_tests);
+
+ return _num_failed == 0 ? 0 : 1;
+}
+
+int main(int argc, char* argv[]) {
+ TestApp app;
+
+ app.handle_args(argc, argv);
+ app.show_info();
+
+#if !defined(ASMJIT_NO_X86)
+ compiler_add_x86_tests(app);
+#endif // !ASMJIT_NO_X86
+
+#if !defined(ASMJIT_NO_AARCH64)
+ compiler_add_a64_tests(app);
+#endif // !ASMJIT_NO_AARCH64
+
+ return app.run();
+}
+
+#else
+
+int main(int argc, char* argv[]) {
+ Support::maybe_unused(argc, argv);
+
+ printf("AsmJit Compiler Test suite is disabled when compiling with ASMJIT_NO_COMPILER\n\n");
+ return 0;
+}
+
+#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.h b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.h
new file mode 100644
index 00000000000..51d62a750ca
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.h
@@ -0,0 +1,83 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_COMPILER_H_INCLUDED
+#define ASMJIT_TEST_COMPILER_H_INCLUDED
+
+#include <asmjit/core.h>
+
+#include <memory>
+#include <vector>
+
+class SimpleErrorHandler : public asmjit::ErrorHandler {
+public:
+ SimpleErrorHandler()
+ : _err(asmjit::Error::kOk) {}
+
+ void handle_error(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) override {
+ asmjit::Support::maybe_unused(origin);
+ _err = err;
+ _message.assign(message);
+ }
+
+ asmjit::Error _err;
+ asmjit::String _message;
+};
+
+//! A test case interface for testing AsmJit's Compiler.
+class TestCase {
+public:
+ TestCase(const char* name, asmjit::Arch arch) {
+ if (name)
+ _name.assign(name);
+ _arch = arch;
+ }
+
+ virtual ~TestCase() {}
+
+ inline const char* name() const { return _name.data(); }
+ inline asmjit::Arch arch() const { return _arch; }
+
+ virtual void compile(asmjit::BaseCompiler& cc) = 0;
+ virtual bool run(void* func, asmjit::String& result, asmjit::String& expect) = 0;
+
+ asmjit::String _name;
+ asmjit::Arch _arch;
+};
+
+class TestApp {
+public:
+ std::vector<std::unique_ptr<TestCase>> _tests;
+
+ const char* _arch = nullptr;
+ const char* _filter = nullptr;
+ bool _help_only = false;
+ bool _verbose = false;
+ bool _dump_asm = false;
+ bool _dump_hex = false;
+
+ unsigned _num_tests = 0;
+ unsigned _num_failed = 0;
+ size_t _output_size = 0;
+
+ TestApp() noexcept
+ : _arch("all") {}
+ ~TestApp() noexcept {}
+
+ void add(TestCase* test) noexcept {
+ _tests.push_back(std::unique_ptr<TestCase>(test));
+ }
+
+ template<class T>
+ inline void add_t() { T::add(*this); }
+
+ int handle_args(int argc, const char* const* argv);
+ void show_info();
+
+ bool should_run(const TestCase* tc);
+ int run();
+};
+
+#endif // ASMJIT_TEST_COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_a64.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_a64.cpp
new file mode 100644
index 00000000000..d714f7e947c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_a64.cpp
@@ -0,0 +1,688 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_COMPILER) && !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/a64.h>
+
+#include <asmjit-testing/tests/asmjit_test_compiler.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+using namespace asmjit;
+
+// a64::Compiler - A64TestCase
+// ===========================
+
+class A64TestCase : public TestCase {
+public:
+ A64TestCase(const char* name = nullptr)
+ : TestCase(name, Arch::kAArch64) {}
+
+ void compile(BaseCompiler& cc) override {
+ compile(static_cast<a64::Compiler&>(cc));
+ }
+
+ virtual void compile(a64::Compiler& cc) = 0;
+};
+
+// a64::Compiler - A64Test_GpArgs
+// ==============================
+
+class A64Test_GpArgs : public A64TestCase {
+public:
+ uint32_t _arg_count;
+ bool _preserve_fp;
+
+ A64Test_GpArgs(uint32_t arg_count, bool preserve_fp)
+ : _arg_count(arg_count),
+ _preserve_fp(preserve_fp) {
+ _name.assign_format("GpArgs {NumArgs=%u PreserveFP=%c}", arg_count, preserve_fp ? 'Y' : 'N');
+ }
+
+ static void add(TestApp& app) {
+ for (uint32_t i = 0; i <= 16; i++) {
+ app.add(new A64Test_GpArgs(i, true));
+ app.add(new A64Test_GpArgs(i, false));
+ }
+ }
+
+ void compile(a64::Compiler& cc) override {
+ uint32_t arg_count = _arg_count;
+ FuncSignature signature;
+
+ signature.set_ret_t<int>();
+ for (uint32_t i = 0; i < arg_count; i++) {
+ signature.add_arg_t<int>();
+ }
+
+ FuncNode* func_node = cc.add_func(signature);
+ if (_preserve_fp)
+ func_node->frame().set_preserved_fp();
+
+ a64::Gp sum;
+
+ if (arg_count) {
+ for (uint32_t i = 0; i < arg_count; i++) {
+ a64::Gp i_reg = cc.new_gp32("i%u", i);
+ func_node->set_arg(i, i_reg);
+
+ if (i == 0)
+ sum = i_reg;
+ else
+ cc.add(sum, sum, i_reg);
+ }
+ }
+ else {
+ sum = cc.new_gp32("i");
+ cc.mov(sum, 0);
+ }
+
+ cc.ret(sum);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using U = unsigned int;
+
+ using Func0 = U (*)();
+ using Func1 = U (*)(U);
+ using Func2 = U (*)(U, U);
+ using Func3 = U (*)(U, U, U);
+ using Func4 = U (*)(U, U, U, U);
+ using Func5 = U (*)(U, U, U, U, U);
+ using Func6 = U (*)(U, U, U, U, U, U);
+ using Func7 = U (*)(U, U, U, U, U, U, U);
+ using Func8 = U (*)(U, U, U, U, U, U, U, U);
+ using Func9 = U (*)(U, U, U, U, U, U, U, U, U);
+ using Func10 = U (*)(U, U, U, U, U, U, U, U, U, U);
+ using Func11 = U (*)(U, U, U, U, U, U, U, U, U, U, U);
+ using Func12 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func13 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func14 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func15 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func16 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+
+ unsigned int result_ret = 0;
+ unsigned int expect_ret = 0;
+
+ switch (_arg_count) {
+ case 0:
+ result_ret = ptr_as_func<Func0>(_func)();
+ expect_ret = 0;
+ break;
+ case 1:
+ result_ret = ptr_as_func<Func1>(_func)(1);
+ expect_ret = 1;
+ break;
+ case 2:
+ result_ret = ptr_as_func<Func2>(_func)(1, 2);
+ expect_ret = 1 + 2;
+ break;
+ case 3:
+ result_ret = ptr_as_func<Func3>(_func)(1, 2, 3);
+ expect_ret = 1 + 2 + 3;
+ break;
+ case 4:
+ result_ret = ptr_as_func<Func4>(_func)(1, 2, 3, 4);
+ expect_ret = 1 + 2 + 3 + 4;
+ break;
+ case 5:
+ result_ret = ptr_as_func<Func5>(_func)(1, 2, 3, 4, 5);
+ expect_ret = 1 + 2 + 3 + 4 + 5;
+ break;
+ case 6:
+ result_ret = ptr_as_func<Func6>(_func)(1, 2, 3, 4, 5, 6);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6;
+ break;
+ case 7:
+ result_ret = ptr_as_func<Func7>(_func)(1, 2, 3, 4, 5, 6, 7);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7;
+ break;
+ case 8:
+ result_ret = ptr_as_func<Func8>(_func)(1, 2, 3, 4, 5, 6, 7, 8);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8;
+ break;
+ case 9:
+ result_ret = ptr_as_func<Func9>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9;
+ break;
+ case 10:
+ result_ret = ptr_as_func<Func10>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
+ break;
+ case 11:
+ result_ret = ptr_as_func<Func11>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11;
+ break;
+ case 12:
+ result_ret = ptr_as_func<Func12>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
+ break;
+ case 13:
+ result_ret = ptr_as_func<Func13>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13;
+ break;
+ case 14:
+ result_ret = ptr_as_func<Func14>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14;
+ break;
+ case 15:
+ result_ret = ptr_as_func<Func15>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15;
+ break;
+ case 16:
+ result_ret = ptr_as_func<Func16>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16;
+ break;
+ }
+
+ result.assign_format("ret={%u, %u}", result_ret >> 28, result_ret & 0x0FFFFFFFu);
+ expect.assign_format("ret={%u, %u}", expect_ret >> 28, expect_ret & 0x0FFFFFFFu);
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - A64Test_Simd1
+// =============================
+
+class A64Test_Simd1 : public A64TestCase {
+public:
+ A64Test_Simd1()
+ : A64TestCase("Simd1") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Simd1());
+ }
+
+ void compile(a64::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*, const void*, const void*>());
+
+ a64::Gp dst = cc.new_gp_ptr("dst");
+ a64::Gp src1 = cc.new_gp_ptr("src1");
+ a64::Gp src2 = cc.new_gp_ptr("src2");
+
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src1);
+ func_node->set_arg(2, src2);
+
+ a64::Vec v1 = cc.new_vec_q("vec1");
+ a64::Vec v2 = cc.new_vec_q("vec2");
+ a64::Vec v3 = cc.new_vec_q("vec3");
+
+ cc.ldr(v2, a64::ptr(src1));
+ cc.ldr(v3, a64::ptr(src2));
+ cc.add(v1.b16(), v2.b16(), v3.b16());
+ cc.str(v1, a64::ptr(dst));
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*, const void*, const void*);
+
+ uint32_t dst[4];
+ uint32_t a_src[4] = { 0 , 1 , 2 , 255 };
+ uint32_t b_src[4] = { 99, 17, 33, 1 };
+
+ // NOTE: It's a byte-add, so uint8_t(255+1) == 0.
+ uint32_t ref[4] = { 99, 18, 35, 0 };
+
+ ptr_as_func<Func>(_func)(dst, a_src, b_src);
+
+ result.assign_format("ret={%u, %u, %u, %u}", dst[0], dst[1], dst[2], dst[3]);
+ expect.assign_format("ret={%u, %u, %u, %u}", ref[0], ref[1], ref[2], ref[3]);
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - A64Test_ManyRegs
+// ================================
+
+class A64Test_ManyRegs : public A64TestCase {
+public:
+ uint32_t _reg_count;
+
+ A64Test_ManyRegs(uint32_t n)
+ : A64TestCase(),
+ _reg_count(n) {
+ _name.assign_format("GpRegs {NumRegs=%u}", n);
+ }
+
+ static void add(TestApp& app) {
+ for (uint32_t i = 2; i < 64; i++)
+ app.add(new A64Test_ManyRegs(i));
+ }
+
+ void compile(a64::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ a64::Gp* regs = static_cast<a64::Gp*>(malloc(_reg_count * sizeof(a64::Gp)));
+
+ for (uint32_t i = 0; i < _reg_count; i++) {
+ regs[i] = cc.new_gp32("reg%u", i);
+ cc.mov(regs[i], i + 1);
+ }
+
+ a64::Gp sum = cc.new_gp32("sum");
+ cc.mov(sum, 0);
+
+ for (uint32_t i = 0; i < _reg_count; i++) {
+ cc.add(sum, sum, regs[i]);
+ }
+
+ cc.ret(sum);
+ cc.end_func();
+
+ free(regs);
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ result.assign_format("ret={%d}", func());
+ expect.assign_format("ret={%d}", calc_sum());
+
+ return result == expect;
+ }
+
+ uint32_t calc_sum() const {
+ return (_reg_count | 1) * ((_reg_count + 1) / 2);
+ }
+};
+
+// a64::Compiler - A64Test_Adr
+// ===========================
+
+class A64Test_Adr : public A64TestCase {
+public:
+ A64Test_Adr()
+ : A64TestCase("Adr") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Adr());
+ }
+
+ void compile(a64::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ a64::Gp addr = cc.new_gp_ptr("addr");
+ a64::Gp val = cc.new_gp_ptr("val");
+
+ Label L_Table = cc.new_label();
+
+ cc.adr(addr, L_Table);
+ cc.ldrsw(val, a64::ptr(addr, 8));
+ cc.ret(val);
+ cc.end_func();
+
+ cc.bind(L_Table);
+ cc.embed_int32(1);
+ cc.embed_int32(2);
+ cc.embed_int32(3);
+ cc.embed_int32(4);
+ cc.embed_int32(5);
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ result.assign_format("ret={%d}", func());
+ expect.assign_format("ret={%d}", 3);
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - A64Test_Branch1
+// ===============================
+
+class A64Test_Branch1 : public A64TestCase {
+public:
+ A64Test_Branch1()
+ : A64TestCase("Branch1") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Branch1());
+ }
+
+ void compile(a64::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*, size_t>());
+
+ a64::Gp p = cc.new_gp_ptr("p");
+ a64::Gp count = cc.new_gp_ptr("count");
+ a64::Gp i = cc.new_gp_ptr("i");
+ Label L = cc.new_label();
+
+ func_node->set_arg(0, p);
+ func_node->set_arg(1, count);
+
+ cc.mov(i, 0);
+
+ cc.bind(L);
+ cc.strb(i.w(), a64::ptr(p, i));
+ cc.add(i, i, 1);
+ cc.cmp(i, count);
+ cc.b_ne(L);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void* p, size_t n);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint8_t array[16];
+ func(array, 16);
+
+ expect.assign("ret={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}");
+
+ result.assign("ret={");
+ for (size_t i = 0; i < 16; i++) {
+ if (i)
+ result.append(", ");
+ result.append_format("%d", int(array[i]));
+ }
+ result.append("}");
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - A64Test_Invoke1
+// ===============================
+
+class A64Test_Invoke1 : public A64TestCase {
+public:
+ A64Test_Invoke1()
+ : A64TestCase("Invoke1") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Invoke1());
+ }
+
+ void compile(a64::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<uint32_t, uint32_t, uint32_t>());
+
+ a64::Gp x = cc.new_gp32("x");
+ a64::Gp y = cc.new_gp32("y");
+ a64::Gp r = cc.new_gp32("r");
+ a64::Gp fn = cc.new_gp_ptr("fn");
+
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+
+ cc.mov(fn, (uint64_t)called_fn);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), fn, FuncSignature::build<uint32_t, uint32_t, uint32_t>());
+ invoke_node->set_arg(0, x);
+ invoke_node->set_arg(1, y);
+ invoke_node->set_ret(0, r);
+
+ cc.ret(r);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(uint32_t, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t x = 49;
+ uint32_t y = 7;
+
+ result.assign_format("ret={%u}", func(x, y));
+ expect.assign_format("ret={%u}", x - y);
+
+ return result == expect;
+ }
+
+ static uint32_t called_fn(uint32_t x, uint32_t y) {
+ return x - y;
+ }
+};
+
+// a64::Compiler - A64Test_Invoke2
+// ===============================
+
+class A64Test_Invoke2 : public A64TestCase {
+public:
+ A64Test_Invoke2()
+ : A64TestCase("Invoke2") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Invoke2());
+ }
+
+ void compile(a64::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, double, double>());
+
+ a64::Vec x = cc.new_vec_d("x");
+ a64::Vec y = cc.new_vec_d("y");
+ a64::Vec r = cc.new_vec_d("r");
+ a64::Gp fn = cc.new_gp_ptr("fn");
+
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+ cc.mov(fn, (uint64_t)called_fn);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), fn, FuncSignature::build<double, double, double>());
+ invoke_node->set_arg(0, x);
+ invoke_node->set_arg(1, y);
+ invoke_node->set_ret(0, r);
+
+ cc.ret(r);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double x = 49;
+ double y = 7;
+
+ result.assign_format("ret={%f}", func(x, y));
+ expect.assign_format("ret={%f}", called_fn(x, y));
+
+ return result == expect;
+ }
+
+ static double called_fn(double x, double y) {
+ return x - y;
+ }
+};
+
+// a64::Compiler - A64Test_Invoke3
+// ===============================
+
+class A64Test_Invoke3 : public A64TestCase {
+public:
+ A64Test_Invoke3()
+ : A64TestCase("Invoke3") {}
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_Invoke3());
+ }
+
+ void compile(a64::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, double, double>());
+
+ a64::Vec x = cc.new_vec_d("x");
+ a64::Vec y = cc.new_vec_d("y");
+ a64::Vec r = cc.new_vec_d("r");
+ a64::Gp fn = cc.new_gp_ptr("fn");
+
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+ cc.mov(fn, (uint64_t)called_fn);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), fn, FuncSignature::build<double, double, double>());
+ invoke_node->set_arg(0, y);
+ invoke_node->set_arg(1, x);
+ invoke_node->set_ret(0, r);
+
+ cc.ret(r);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double x = 49;
+ double y = 7;
+
+ result.assign_format("ret={%f}", func(x, y));
+ expect.assign_format("ret={%f}", called_fn(y, x));
+
+ return result == expect;
+ }
+
+ static double called_fn(double x, double y) {
+ return x - y;
+ }
+};
+
+// a64::Compiler - A64Test_JumpTable
+// =================================
+
+class A64Test_JumpTable : public A64TestCase {
+public:
+ bool _annotated;
+
+ A64Test_JumpTable(bool annotated)
+ : A64TestCase("A64Test_JumpTable"),
+ _annotated(annotated) {
+ _name.assign_format("JumpTable {%s}", annotated ? "Annotated" : "Unknown Target");
+ }
+
+ enum Operator {
+ kOperatorAdd = 0,
+ kOperatorSub = 1,
+ kOperatorMul = 2,
+ kOperatorDiv = 3
+ };
+
+ static void add(TestApp& app) {
+ app.add(new A64Test_JumpTable(false));
+ app.add(new A64Test_JumpTable(true));
+ }
+
+ void compile(a64::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<float, float, float, uint32_t>());
+
+ a64::Vec a = cc.new_vec_s("a");
+ a64::Vec b = cc.new_vec_s("b");
+ a64::Gp op = cc.new_gp32("op");
+
+ a64::Gp target = cc.new_gp_ptr("target");
+ a64::Gp offset = cc.new_gp_ptr("offset");
+
+ Label L_End = cc.new_label();
+
+ Label L_Table = cc.new_label();
+ Label L_Add = cc.new_label();
+ Label L_Sub = cc.new_label();
+ Label L_Mul = cc.new_label();
+ Label L_Div = cc.new_label();
+
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+ func_node->set_arg(2, op);
+
+ cc.adr(target, L_Table);
+ cc.ldrsw(offset, a64::ptr(target, op, a64::sxtw(2)));
+ cc.add(target, target, offset);
+
+ // JumpAnnotation allows to annotate all possible jump targets of
+ // instructions where it cannot be deduced from operands.
+ if (_annotated) {
+ JumpAnnotation* annotation = cc.new_jump_annotation();
+ annotation->add_label(L_Add);
+ annotation->add_label(L_Sub);
+ annotation->add_label(L_Mul);
+ annotation->add_label(L_Div);
+ cc.br(target, annotation);
+ }
+ else {
+ cc.br(target);
+ }
+
+ cc.bind(L_Add);
+ cc.fadd(a, a, b);
+ cc.b(L_End);
+
+ cc.bind(L_Sub);
+ cc.fsub(a, a, b);
+ cc.b(L_End);
+
+ cc.bind(L_Mul);
+ cc.fmul(a, a, b);
+ cc.b(L_End);
+
+ cc.bind(L_Div);
+ cc.fdiv(a, a, b);
+
+ cc.bind(L_End);
+ cc.ret(a);
+ cc.end_func();
+
+ cc.bind(L_Table);
+ cc.embed_label_delta(L_Add, L_Table, 4);
+ cc.embed_label_delta(L_Sub, L_Table, 4);
+ cc.embed_label_delta(L_Mul, L_Table, 4);
+ cc.embed_label_delta(L_Div, L_Table, 4);
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = float (*)(float, float, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ float dst[4];
+ float ref[4];
+
+ dst[0] = func(33.0f, 14.0f, kOperatorAdd);
+ dst[1] = func(33.0f, 14.0f, kOperatorSub);
+ dst[2] = func(10.0f, 6.0f, kOperatorMul);
+ dst[3] = func(80.0f, 8.0f, kOperatorDiv);
+
+ ref[0] = 47.0f;
+ ref[1] = 19.0f;
+ ref[2] = 60.0f;
+ ref[3] = 10.0f;
+
+ result.assign_format("ret={%f, %f, %f, %f}", double(dst[0]), double(dst[1]), double(dst[2]), double(dst[3]));
+ expect.assign_format("ret={%f, %f, %f, %f}", double(ref[0]), double(ref[1]), double(ref[2]), double(ref[3]));
+
+ return result == expect;
+ }
+};
+
+// a64::Compiler - Export
+// ======================
+
+void compiler_add_a64_tests(TestApp& app) {
+ app.add_t<A64Test_GpArgs>();
+ app.add_t<A64Test_ManyRegs>();
+ app.add_t<A64Test_Simd1>();
+ app.add_t<A64Test_Adr>();
+ app.add_t<A64Test_Branch1>();
+ app.add_t<A64Test_Invoke1>();
+ app.add_t<A64Test_Invoke2>();
+ app.add_t<A64Test_Invoke3>();
+ app.add_t<A64Test_JumpTable>();
+}
+
+#endif // !ASMJIT_NO_COMPILER && !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_x86.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_x86.cpp
new file mode 100644
index 00000000000..b586a4bc9f8
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_x86.cpp
@@ -0,0 +1,4694 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
+
+#include <asmjit/x86.h>
+
+#include <asmjit-testing/tests/asmjit_test_misc.h>
+#include <asmjit-testing/tests/asmjit_test_compiler.h>
+
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if ASMJIT_ARCH_X86
+ // Required for function tests that pass / return XMM registers.
+ #include <emmintrin.h>
+#endif
+
+#ifdef _MSC_VER
+// Interaction between '_setjmp' and C++ object destruction is non-portable.
+#pragma warning(disable: 4611)
+#endif
+
+using namespace asmjit;
+
+// x86::Compiler - X86TestCase
+// ===========================
+
+class X86TestCase : public TestCase {
+public:
+ X86TestCase(const char* name = nullptr)
+ : TestCase(name, Arch::kHost == Arch::kX86 ? Arch::kX86 : Arch::kX64) {}
+
+ void compile(BaseCompiler& cc) override {
+ compile(static_cast<x86::Compiler&>(cc));
+ }
+
+ virtual void compile(x86::Compiler& cc) = 0;
+};
+
+// x86::Compiler - X86Test_AlignBase
+// =================================
+
+class X86Test_AlignBase : public X86TestCase {
+public:
+ X86Test_AlignBase(uint32_t arg_count, uint32_t alignment, bool preserve_fp)
+ : _arg_count(arg_count),
+ _alignment(alignment),
+ _preserve_fp(preserve_fp) {
+ _name.assign_format("AlignBase {NumArgs=%u Alignment=%u PreserveFP=%c}", arg_count, alignment, preserve_fp ? 'Y' : 'N');
+ }
+
+ static void add(TestApp& app) {
+ for (uint32_t i = 0; i <= 16; i++) {
+ for (uint32_t a = 16; a <= 32; a += 16) {
+ app.add(new X86Test_AlignBase(i, a, true));
+ app.add(new X86Test_AlignBase(i, a, false));
+ }
+ }
+ }
+
+ void compile(x86::Compiler& cc) override {
+ uint32_t arg_count = _arg_count;
+
+ FuncSignature signature(CallConvId::kCDecl);
+ signature.set_ret_t<int>();
+ for (uint32_t i = 0; i < arg_count; i++) {
+ signature.add_arg_t<int>();
+ }
+
+ FuncNode* func_node = cc.add_func(signature);
+ if (_preserve_fp)
+ func_node->frame().set_preserved_fp();
+
+ x86::Gp gp_var = cc.new_gp_ptr("gp_var");
+ x86::Gp gp_sum;
+ x86::Mem stack = cc.new_stack(_alignment, _alignment);
+
+ // Do a sum of arguments to verify a possible relocation when misaligned.
+ if (arg_count) {
+ for (uint32_t i = 0; i < arg_count; i++) {
+ x86::Gp gp_arg = cc.new_gp32("gp_arg%u", i);
+ func_node->set_arg(i, gp_arg);
+
+ if (i == 0)
+ gp_sum = gp_arg;
+ else
+ cc.add(gp_sum, gp_arg);
+ }
+ }
+
+ // Check alignment of the stack (has to be 16).
+ cc.lea(gp_var, stack);
+ cc.and_(gp_var, _alignment - 1);
+
+ // Add a sum of all arguments to check if they are correct.
+ if (arg_count)
+ cc.or_(gp_var.r32(), gp_sum);
+
+ cc.ret(gp_var);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using U = unsigned int;
+
+ using Func0 = U (*)();
+ using Func1 = U (*)(U);
+ using Func2 = U (*)(U, U);
+ using Func3 = U (*)(U, U, U);
+ using Func4 = U (*)(U, U, U, U);
+ using Func5 = U (*)(U, U, U, U, U);
+ using Func6 = U (*)(U, U, U, U, U, U);
+ using Func7 = U (*)(U, U, U, U, U, U, U);
+ using Func8 = U (*)(U, U, U, U, U, U, U, U);
+ using Func9 = U (*)(U, U, U, U, U, U, U, U, U);
+ using Func10 = U (*)(U, U, U, U, U, U, U, U, U, U);
+ using Func11 = U (*)(U, U, U, U, U, U, U, U, U, U, U);
+ using Func12 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func13 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func14 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func15 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+ using Func16 = U (*)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
+
+ unsigned int result_ret = 0;
+ unsigned int expect_ret = 0;
+
+ switch (_arg_count) {
+ case 0:
+ result_ret = ptr_as_func<Func0>(_func)();
+ expect_ret = 0;
+ break;
+ case 1:
+ result_ret = ptr_as_func<Func1>(_func)(1);
+ expect_ret = 1;
+ break;
+ case 2:
+ result_ret = ptr_as_func<Func2>(_func)(1, 2);
+ expect_ret = 1 + 2;
+ break;
+ case 3:
+ result_ret = ptr_as_func<Func3>(_func)(1, 2, 3);
+ expect_ret = 1 + 2 + 3;
+ break;
+ case 4:
+ result_ret = ptr_as_func<Func4>(_func)(1, 2, 3, 4);
+ expect_ret = 1 + 2 + 3 + 4;
+ break;
+ case 5:
+ result_ret = ptr_as_func<Func5>(_func)(1, 2, 3, 4, 5);
+ expect_ret = 1 + 2 + 3 + 4 + 5;
+ break;
+ case 6:
+ result_ret = ptr_as_func<Func6>(_func)(1, 2, 3, 4, 5, 6);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6;
+ break;
+ case 7:
+ result_ret = ptr_as_func<Func7>(_func)(1, 2, 3, 4, 5, 6, 7);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7;
+ break;
+ case 8:
+ result_ret = ptr_as_func<Func8>(_func)(1, 2, 3, 4, 5, 6, 7, 8);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8;
+ break;
+ case 9:
+ result_ret = ptr_as_func<Func9>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9;
+ break;
+ case 10:
+ result_ret = ptr_as_func<Func10>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
+ break;
+ case 11:
+ result_ret = ptr_as_func<Func11>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11;
+ break;
+ case 12:
+ result_ret = ptr_as_func<Func12>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
+ break;
+ case 13:
+ result_ret = ptr_as_func<Func13>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13;
+ break;
+ case 14:
+ result_ret = ptr_as_func<Func14>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14;
+ break;
+ case 15:
+ result_ret = ptr_as_func<Func15>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15;
+ break;
+ case 16:
+ result_ret = ptr_as_func<Func16>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
+ expect_ret = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16;
+ break;
+ }
+
+ result.assign_format("ret={%u, %u}", result_ret >> 28, result_ret & 0x0FFFFFFFu);
+ expect.assign_format("ret={%u, %u}", expect_ret >> 28, expect_ret & 0x0FFFFFFFu);
+
+ return result == expect;
+ }
+
+ uint32_t _arg_count;
+ uint32_t _alignment;
+ bool _preserve_fp;
+};
+
+// x86::Compiler - X86Test_NoCode
+// ==============================
+
+class X86Test_NoCode : public X86TestCase {
+public:
+ X86Test_NoCode() : X86TestCase("NoCode") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_NoCode());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<void>());
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ Support::maybe_unused(result, expect);
+
+ using Func = void (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+ return true;
+ }
+};
+
+// x86::Compiler - X86Test_NoAlign
+// ===============================
+
+class X86Test_NoAlign : public X86TestCase {
+public:
+ X86Test_NoAlign() : X86TestCase("NoAlign") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_NoAlign());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<void>());
+ cc.align(AlignMode::kCode, 0);
+ cc.align(AlignMode::kCode, 1);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ Support::maybe_unused(result, expect);
+
+ using Func = void (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+ return true;
+ }
+};
+
+// x86::Compiler - X86Test_IndirectBranchProtection
+// ================================================
+
+class X86Test_IndirectBranchProtection : public X86TestCase {
+public:
+ X86Test_IndirectBranchProtection() : X86TestCase("IndirectBranchProtection") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_IndirectBranchProtection());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func = cc.add_func(FuncSignature::build<void>());
+ func->add_attributes(FuncAttributes::kIndirectBranchProtection);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ Support::maybe_unused(result, expect);
+
+ using Func = void (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+ return true;
+ }
+};
+
+
+// x86::Compiler - X86Test_JumpMerge
+// =================================
+
+class X86Test_JumpMerge : public X86TestCase {
+public:
+ X86Test_JumpMerge() : X86TestCase("JumpMerge") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpMerge());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ Label L0 = cc.new_label();
+ Label L1 = cc.new_label();
+ Label L2 = cc.new_label();
+ Label LEnd = cc.new_label();
+
+ x86::Gp dst = cc.new_gp_ptr("dst");
+ x86::Gp val = cc.new_gp32("val");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, int*, int>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, val);
+
+ cc.cmp(val, 0);
+ cc.je(L2);
+
+ cc.cmp(val, 1);
+ cc.je(L1);
+
+ cc.cmp(val, 2);
+ cc.je(L0);
+
+ cc.mov(x86::dword_ptr(dst), val);
+ cc.jmp(LEnd);
+
+ // On purpose. This tests whether the CFG constructs a single basic-block
+ // from multiple labels next to each other.
+ cc.bind(L0);
+ cc.bind(L1);
+ cc.bind(L2);
+ cc.mov(x86::dword_ptr(dst), 0);
+
+ cc.bind(LEnd);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(int*, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int arr[5] = { -1, -1, -1, -1, -1 };
+ int exp[5] = { 0, 0, 0, 3, 4 };
+
+ for (int i = 0; i < 5; i++)
+ func(&arr[i], i);
+
+ result.assign_format("ret={%d, %d, %d, %d, %d}", arr[0], arr[1], arr[2], arr[3], arr[4]);
+ expect.assign_format("ret={%d, %d, %d, %d, %d}", exp[0], exp[1], exp[2], exp[3], exp[4]);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_JumpCross
+// =================================
+
+class X86Test_JumpCross : public X86TestCase {
+public:
+ X86Test_JumpCross() : X86TestCase("JumpCross") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpCross());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<void>());
+
+ Label L1 = cc.new_label();
+ Label L2 = cc.new_label();
+ Label L3 = cc.new_label();
+
+ cc.jmp(L2);
+
+ cc.bind(L1);
+ cc.jmp(L3);
+
+ cc.bind(L2);
+ cc.jmp(L1);
+
+ cc.bind(L3);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ Support::maybe_unused(result, expect);
+
+ using Func = void (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+ return true;
+ }
+};
+
+// x86::Compiler - X86Test_JumpMany
+// ================================
+
+class X86Test_JumpMany : public X86TestCase {
+public:
+ X86Test_JumpMany() : X86TestCase("JumpMany") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpMany());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+ for (uint32_t i = 0; i < 1000; i++) {
+ Label L = cc.new_label();
+ cc.jmp(L);
+ cc.bind(L);
+ }
+
+ x86::Gp ret = cc.new_gp32("ret");
+ cc.xor_(ret, ret);
+ cc.ret(ret);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 0;
+
+ result.assign_format("ret={%d}", result_ret);
+ expect.assign_format("ret={%d}", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_JumpUnreachable1
+// ========================================
+
+class X86Test_JumpUnreachable1 : public X86TestCase {
+public:
+ X86Test_JumpUnreachable1() : X86TestCase("JumpUnreachable1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpUnreachable1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<void>());
+
+ Label L_1 = cc.new_label();
+ Label L_2 = cc.new_label();
+ Label L_3 = cc.new_label();
+ Label L_4 = cc.new_label();
+ Label L_5 = cc.new_label();
+ Label L_6 = cc.new_label();
+ Label L_7 = cc.new_label();
+
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+
+ cc.bind(L_2);
+ cc.bind(L_3);
+
+ cc.jmp(L_1);
+
+ cc.bind(L_5);
+ cc.mov(v0, 0);
+
+ cc.bind(L_6);
+ cc.jmp(L_3);
+ cc.mov(v1, 1);
+ cc.jmp(L_1);
+
+ cc.bind(L_4);
+ cc.jmp(L_2);
+ cc.bind(L_7);
+ cc.add(v0, v1);
+
+ cc.align(AlignMode::kCode, 16);
+ cc.bind(L_1);
+ cc.ret();
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+
+ result.append("ret={}");
+ expect.append("ret={}");
+
+ return true;
+ }
+};
+
+// x86::Compiler - X86Test_JumpUnreachable2
+// ========================================
+
+class X86Test_JumpUnreachable2 : public X86TestCase {
+public:
+ X86Test_JumpUnreachable2() : X86TestCase("JumpUnreachable2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpUnreachable2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<void>());
+
+ Label L_1 = cc.new_label();
+ Label L_2 = cc.new_label();
+
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+
+ cc.jmp(L_1);
+ cc.bind(L_2);
+ cc.mov(v0, 1);
+ cc.mov(v1, 2);
+ cc.cmp(v0, v1);
+ cc.jz(L_2);
+ cc.jmp(L_1);
+
+ cc.bind(L_1);
+ cc.ret();
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ func();
+
+ result.append("ret={}");
+ expect.append("ret={}");
+
+ return true;
+ }
+};
+
+// x86::Compiler - X86Test_JumpTable1
+// ==================================
+
+class X86Test_JumpTable1 : public X86TestCase {
+public:
+ bool _annotated;
+
+ X86Test_JumpTable1(bool annotated)
+ : X86TestCase("X86Test_JumpTable1"),
+ _annotated(annotated) {
+ _name.assign_format("JumpTable {%s}", annotated ? "Annotated" : "Unknown Reg/Mem");
+ }
+
+ enum Operator {
+ kOperatorAdd = 0,
+ kOperatorSub = 1,
+ kOperatorMul = 2,
+ kOperatorDiv = 3
+ };
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable1(false));
+ app.add(new X86Test_JumpTable1(true));
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Vec a = cc.new_xmm_ss("a");
+ x86::Vec b = cc.new_xmm_ss("b");
+ x86::Gp op = cc.new_gp32("op");
+ x86::Gp target = cc.new_gp_ptr("target");
+ x86::Gp offset = cc.new_gp_ptr("offset");
+
+ Label L_Table = cc.new_label();
+ Label L_Add = cc.new_label();
+ Label L_Sub = cc.new_label();
+ Label L_Mul = cc.new_label();
+ Label L_Div = cc.new_label();
+ Label L_End = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<float, float, float, uint32_t>());
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+ func_node->set_arg(2, op);
+
+ cc.lea(offset, x86::ptr(L_Table));
+ if (cc.is_64bit())
+ cc.movsxd(target, x86::dword_ptr(offset, op.clone_as(offset), 2));
+ else
+ cc.mov(target, x86::dword_ptr(offset, op.clone_as(offset), 2));
+ cc.add(target, offset);
+
+ // JumpAnnotation allows to annotate all possible jump targets of
+ // instructions where it cannot be deduced from operands.
+ if (_annotated) {
+ JumpAnnotation* annotation = cc.new_jump_annotation();
+ annotation->add_label(L_Add);
+ annotation->add_label(L_Sub);
+ annotation->add_label(L_Mul);
+ annotation->add_label(L_Div);
+ cc.jmp(target, annotation);
+ }
+ else {
+ cc.jmp(target);
+ }
+
+ cc.bind(L_Add);
+ cc.addss(a, b);
+ cc.jmp(L_End);
+
+ cc.bind(L_Sub);
+ cc.subss(a, b);
+ cc.jmp(L_End);
+
+ cc.bind(L_Mul);
+ cc.mulss(a, b);
+ cc.jmp(L_End);
+
+ cc.bind(L_Div);
+ cc.divss(a, b);
+
+ cc.bind(L_End);
+ cc.ret(a);
+
+ cc.end_func();
+
+ cc.bind(L_Table);
+ cc.embed_label_delta(L_Add, L_Table, 4);
+ cc.embed_label_delta(L_Sub, L_Table, 4);
+ cc.embed_label_delta(L_Mul, L_Table, 4);
+ cc.embed_label_delta(L_Div, L_Table, 4);
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = float (*)(float, float, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ float results[4];
+ float expected[4];
+
+ results[0] = func(33.0f, 14.0f, kOperatorAdd);
+ results[1] = func(33.0f, 14.0f, kOperatorSub);
+ results[2] = func(10.0f, 6.0f, kOperatorMul);
+ results[3] = func(80.0f, 8.0f, kOperatorDiv);
+
+ expected[0] = 47.0f;
+ expected[1] = 19.0f;
+ expected[2] = 60.0f;
+ expected[3] = 10.0f;
+
+ result.assign_format("ret={%f, %f, %f, %f}", double(results[0]), double(results[1]), double(results[2]), double(results[3]));
+ expect.assign_format("ret={%f, %f, %f, %f}", double(expected[0]), double(expected[1]), double(expected[2]), double(expected[3]));
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_JumpTable2
+// ==================================
+
+class X86Test_JumpTable2 : public X86TestCase {
+public:
+ X86Test_JumpTable2()
+ : X86TestCase("JumpTable {Jumping to Begin}") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp result = cc.new_gp32("result");
+ x86::Gp value = cc.new_gp32("value");
+ x86::Gp target = cc.new_gp_ptr("target");
+ x86::Gp offset = cc.new_gp_ptr("offset");
+
+ Label L_Table = cc.new_label();
+ Label L_Begin = cc.new_label();
+ Label L_Case0 = cc.new_label();
+ Label L_Case1 = cc.new_label();
+ Label L_End = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int>());
+ func_node->set_arg(0, value);
+
+ cc.bind(L_Begin);
+ cc.lea(offset, x86::ptr(L_Table));
+ if (cc.is_64bit())
+ cc.movsxd(target, x86::dword_ptr(offset, value.clone_as(offset), 2));
+ else
+ cc.mov(target, x86::dword_ptr(offset, value.clone_as(offset), 2));
+ cc.add(target, offset);
+
+ {
+ JumpAnnotation* annotation = cc.new_jump_annotation();
+ annotation->add_label(L_Case0);
+ annotation->add_label(L_Case1);
+ annotation->add_label(L_Begin); // Never used, just for the purpose of the test.
+ cc.jmp(target, annotation);
+
+ cc.bind(L_Case0);
+ cc.mov(result, 0);
+ cc.jmp(L_End);
+
+ cc.bind(L_Case1);
+ cc.mov(result, 1);
+ cc.jmp(L_End);
+ }
+
+ cc.bind(L_End);
+ cc.ret(result);
+
+ cc.end_func();
+
+ cc.bind(L_Table);
+ cc.embed_label_delta(L_Case0, L_Table, 4);
+ cc.embed_label_delta(L_Case1, L_Table, 4);
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int results[2];
+ int expected[2];
+
+ results[0] = func(0);
+ results[1] = func(1);
+
+ expected[0] = 0;
+ expected[1] = 1;
+
+ result.assign_format("ret={%d, %d}", results[0], results[1]);
+ expect.assign_format("ret={%d, %d}", expected[0], expected[1]);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_JumpTable3
+// ==================================
+
+class X86Test_JumpTable3 : public X86TestCase {
+public:
+ X86Test_JumpTable3()
+ : X86TestCase("JumpTable {Jumping to a single label}") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable3());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ Label L_Target = cc.new_label();
+ x86::Gp target = cc.new_gp_ptr("target");
+ x86::Gp result = cc.new_gp32("result");
+
+ JumpAnnotation* annotation = cc.new_jump_annotation();
+ annotation->add_label(L_Target);
+
+ cc.lea(target, x86::ptr(L_Target));
+ cc.jmp(target, annotation);
+
+ cc.bind(L_Target);
+ cc.mov(result, 1234);
+ cc.ret(result);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int out = func();
+ int expected = 1234;
+
+ result.assign_format("ret=%d", out);
+ expect.assign_format("ret=%d", expected);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_JumpTable4
+// ==================================
+
+class X86Test_JumpTable4 : public X86TestCase {
+public:
+ X86Test_JumpTable4()
+ : X86TestCase("JumpTable {Jumping to a single label and multiple labels}") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_JumpTable4());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp result = cc.new_gp32("result");
+ x86::Gp condition = cc.new_gp32("condition");
+
+ FuncNode* func = cc.add_func(FuncSignature::build<int, int>());
+ func->set_arg(0, condition);
+
+ Label L_NonZero = cc.new_label();
+ cc.test(condition, condition);
+ cc.jnz(L_NonZero);
+
+ {
+ JumpAnnotation* annotation = cc.new_jump_annotation();
+ Label L_Target = cc.new_label();
+ annotation->add_label(L_Target);
+
+ x86::Gp target = cc.new_gp_ptr("target");
+ cc.lea(target, x86::ptr(L_Target));
+ cc.jmp(target, annotation);
+ cc.bind(L_Target);
+ cc.mov(result, 1234);
+ cc.ret(result);
+ }
+
+ {
+ JumpAnnotation* annotation = cc.new_jump_annotation();
+ Label L_Target1 = cc.new_label();
+ Label L_Target2 = cc.new_label();
+ annotation->add_label(L_Target1);
+ annotation->add_label(L_Target2);
+
+ cc.bind(L_NonZero);
+ x86::Gp target = cc.new_gp_ptr("target");
+ cc.lea(target, x86::ptr(L_Target1));
+ cc.jmp(target, annotation);
+
+ cc.bind(L_Target1);
+ cc.mov(result, 4321);
+ cc.ret(result);
+
+ // Never executed.
+ cc.bind(L_Target2);
+ cc.mov(result, 0);
+ cc.ret(result);
+ }
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int results[2] = { func(0), func(1) };
+ int expected[2] = { 1234, 4321 };
+
+ result.assign_format("ret={%d, %d}", results[0], results[1]);
+ expect.assign_format("ret={%d, %d}", expected[0], expected[1]);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocBase
+// =================================
+
+class X86Test_AllocBase : public X86TestCase {
+public:
+ X86Test_AllocBase() : X86TestCase("AllocBase") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocBase());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+ x86::Gp v2 = cc.new_gp32("v2");
+ x86::Gp v3 = cc.new_gp32("v3");
+ x86::Gp v4 = cc.new_gp32("v4");
+
+ cc.xor_(v0, v0);
+
+ cc.mov(v1, 1);
+ cc.mov(v2, 2);
+ cc.mov(v3, 3);
+ cc.mov(v4, 4);
+
+ cc.add(v0, v1);
+ cc.add(v0, v2);
+ cc.add(v0, v3);
+ cc.add(v0, v4);
+
+ cc.ret(v0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 1 + 2 + 3 + 4;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocMany1
+// ==================================
+
+class X86Test_AllocMany1 : public X86TestCase {
+public:
+ X86Test_AllocMany1() : X86TestCase("AllocMany1") {}
+
+ static inline constexpr uint32_t kCount = 8;
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocMany1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp a0 = cc.new_gp_ptr("a0");
+ x86::Gp a1 = cc.new_gp_ptr("a1");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, int*, int*>());
+ func_node->set_arg(0, a0);
+ func_node->set_arg(1, a1);
+
+ // Create some variables.
+ x86::Gp t = cc.new_gp32("t");
+ x86::Gp x[kCount];
+
+ uint32_t i;
+
+ // Setup variables (use mov with reg/imm to se if register allocator works).
+ for (i = 0; i < kCount; i++) x[i] = cc.new_gp32("x%u", i);
+ for (i = 0; i < kCount; i++) cc.mov(x[i], int(i + 1));
+
+ // Make sum (addition).
+ cc.xor_(t, t);
+ for (i = 0; i < kCount; i++) cc.add(t, x[i]);
+
+ // Store result to a given pointer in first argument.
+ cc.mov(x86::dword_ptr(a0), t);
+
+ // Clear t.
+ cc.xor_(t, t);
+
+ // Make sum (subtraction).
+ for (i = 0; i < kCount; i++) cc.sub(t, x[i]);
+
+ // Store result to a given pointer in second argument.
+ cc.mov(x86::dword_ptr(a1), t);
+
+ // End of function.
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(int*, int*);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_x = 0;
+ int result_y = 0;
+
+ int expect_x = 36;
+ int expect_y = -36;
+
+ func(&result_x, &result_y);
+
+ result.assign_format("ret={x=%d, y=%d}", result_x, result_y);
+ expect.assign_format("ret={x=%d, y=%d}", expect_x, expect_y);
+
+ return result_x == expect_x && result_y == expect_y;
+ }
+};
+
+// x86::Compiler - X86Test_AllocMany2
+// ==================================
+
+class X86Test_AllocMany2 : public X86TestCase {
+public:
+ X86Test_AllocMany2() : X86TestCase("AllocMany2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocMany2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp a = cc.new_gp_ptr("a");
+ x86::Gp v[32];
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, uint32_t*>());
+ func_node->set_arg(0, a);
+
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) v[i] = cc.new_gp32("v%d", i);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.xor_(v[i], v[i]);
+
+ x86::Gp x = cc.new_gp32("x");
+ Label L = cc.new_label();
+
+ cc.mov(x, 32);
+ cc.bind(L);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.add(v[i], i);
+
+ cc.dec(x);
+ cc.jnz(L);
+ for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.mov(x86::dword_ptr(a, int(i * 4)), v[i]);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(uint32_t*);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t i;
+ uint32_t result_buf[32] {};
+ uint32_t expect_buf[32] {};
+
+ for (i = 0; i < ASMJIT_ARRAY_SIZE(result_buf); i++)
+ expect_buf[i] = i * 32;
+ func(result_buf);
+
+ for (i = 0; i < ASMJIT_ARRAY_SIZE(result_buf); i++) {
+ if (i != 0) {
+ result.append(',');
+ expect.append(',');
+ }
+
+ result.append_format("%u", result_buf[i]);
+ expect.append_format("%u", expect_buf[i]);
+ }
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocInt8
+// =================================
+
+class X86Test_AllocInt8 : public X86TestCase {
+public:
+ X86Test_AllocInt8() : X86TestCase("AllocInt8") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocInt8());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp x = cc.new_gp8("x");
+ x86::Gp y = cc.new_gp32("y");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int8_t>());
+ func_node->set_arg(0, x);
+
+ cc.movsx(y, x);
+
+ cc.ret(y);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int8_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(int8_t(-13));
+ int expect_ret = -13;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocUnhandledArg
+// =========================================
+
+class X86Test_AllocUnhandledArg : public X86TestCase {
+public:
+ X86Test_AllocUnhandledArg() : X86TestCase("AllocUnhandledArg") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocUnhandledArg());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp x = cc.new_gp32("x");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int>());
+ func_node->set_arg(2, x);
+
+ cc.ret(x);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(42, 155, 199);
+ int expect_ret = 199;
+
+ result.assign_format("ret={%d}", result_ret);
+ expect.assign_format("ret={%d}", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocArgsIntPtr
+// =======================================
+
+class X86Test_AllocArgsIntPtr : public X86TestCase {
+public:
+ X86Test_AllocArgsIntPtr() : X86TestCase("AllocArgsIntPtr") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocArgsIntPtr());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*, void*, void*, void*, void*, void*, void*, void*>());
+ x86::Gp var[8];
+
+ for (uint32_t i = 0; i < 8; i++) {
+ var[i] = cc.new_gp_ptr("var%u", i);
+ func_node->set_arg(i, var[i]);
+ }
+
+ for (uint32_t i = 0; i < 8; i++) {
+ cc.add(var[i], int(i + 1));
+ }
+
+ // Move some data into buffer provided by arguments so we can verify if it
+ // really works without looking into assembler output.
+ for (uint32_t i = 0; i < 8; i++) {
+ cc.add(x86::byte_ptr(var[i]), int(i + 1));
+ }
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*, void*, void*, void*, void*, void*, void*, void*);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint8_t result_buf[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ uint8_t expect_buf[9] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
+
+ func(result_buf, result_buf, result_buf, result_buf,
+ result_buf, result_buf, result_buf, result_buf);
+
+ result.assign_format("buf={%d, %d, %d, %d, %d, %d, %d, %d, %d}",
+ result_buf[0], result_buf[1], result_buf[2], result_buf[3],
+ result_buf[4], result_buf[5], result_buf[6], result_buf[7],
+ result_buf[8]);
+
+ expect.assign_format("buf={%d, %d, %d, %d, %d, %d, %d, %d, %d}",
+ expect_buf[0], expect_buf[1], expect_buf[2], expect_buf[3],
+ expect_buf[4], expect_buf[5], expect_buf[6], expect_buf[7],
+ expect_buf[8]);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocArgsFloat
+// ======================================
+
+class X86Test_AllocArgsFloat : public X86TestCase {
+public:
+ X86Test_AllocArgsFloat() : X86TestCase("AllocArgsFloat") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocArgsFloat());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, float, float, float, float, float, float, float, void*>());
+
+ x86::Gp p = cc.new_gp_ptr("p");
+ x86::Vec xv[7];
+
+ for (uint32_t i = 0; i < 7; i++) {
+ xv[i] = cc.new_xmm_ss("xv%u", i);
+ func_node->set_arg(i, xv[i]);
+ }
+
+ func_node->set_arg(7, p);
+
+ cc.addss(xv[0], xv[1]);
+ cc.addss(xv[0], xv[2]);
+ cc.addss(xv[0], xv[3]);
+ cc.addss(xv[0], xv[4]);
+ cc.addss(xv[0], xv[5]);
+ cc.addss(xv[0], xv[6]);
+
+ cc.movss(x86::ptr(p), xv[0]);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(float, float, float, float, float, float, float, float*);
+ Func func = ptr_as_func<Func>(_func);
+
+ float result_ret = 0;
+ float expect_ret = 1.0f + 2.0f + 3.0f + 4.0f + 5.0f + 6.0f + 7.0f;
+
+ func(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, &result_ret);
+
+ result.assign_format("ret={%g}", double(result_ret));
+ expect.assign_format("ret={%g}", double(expect_ret));
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocArgsDouble
+// =======================================
+
+class X86Test_AllocArgsDouble : public X86TestCase {
+public:
+ X86Test_AllocArgsDouble() : X86TestCase("AllocArgsDouble") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocArgsDouble());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, double, double, double, double, double, double, double, void*>());
+
+ x86::Gp p = cc.new_gp_ptr("p");
+ x86::Vec xv[7];
+
+ for (uint32_t i = 0; i < 7; i++) {
+ xv[i] = cc.new_xmm_sd("xv%u", i);
+ func_node->set_arg(i, xv[i]);
+ }
+
+ func_node->set_arg(7, p);
+
+ cc.addsd(xv[0], xv[1]);
+ cc.addsd(xv[0], xv[2]);
+ cc.addsd(xv[0], xv[3]);
+ cc.addsd(xv[0], xv[4]);
+ cc.addsd(xv[0], xv[5]);
+ cc.addsd(xv[0], xv[6]);
+
+ cc.movsd(x86::ptr(p), xv[0]);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(double, double, double, double, double, double, double, double*);
+ Func func = ptr_as_func<Func>(_func);
+
+ double result_ret = 0;
+ double expect_ret = 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0;
+
+ func(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, &result_ret);
+
+ result.assign_format("ret={%g}", result_ret);
+ expect.assign_format("ret={%g}", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocArgsVec
+// ====================================
+
+#if ASMJIT_ARCH_X86
+class X86Test_AllocArgsVec : public X86TestCase {
+public:
+ X86Test_AllocArgsVec() : X86TestCase("AllocArgsVec") {}
+
+ static void add(TestApp& app) {
+ // Not supported on Windows.
+#ifndef _WIN32
+ app.add(new X86Test_AllocArgsVec());
+#else
+ Support::maybe_unused(app);
+#endif
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Vec a = cc.new_xmm("xmm_a");
+ x86::Vec b = cc.new_xmm("xmm_b");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<Type::Vec128, Type::Vec128, Type::Vec128>());
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+
+ cc.paddb(a, b);
+ cc.ret(a);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = __m128i (*)(__m128i, __m128i);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint8_t a_data[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+ uint8_t b_data[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
+
+ uint8_t r_data[16] {};
+ uint8_t e_data[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
+
+ __m128i a_vec = _mm_loadu_si128(reinterpret_cast<const __m128i*>(a_data));
+ __m128i b_vec = _mm_loadu_si128(reinterpret_cast<const __m128i*>(b_data));
+
+ __m128i r_vec = func(a_vec, b_vec);
+ _mm_storeu_si128(reinterpret_cast<__m128i*>(r_data), r_vec);
+
+ result.append_hex(r_data, 16);
+ expect.append_hex(e_data, 16);
+
+ return result == expect;
+ }
+};
+#endif // ASMJIT_ARCH_X86
+
+// x86::Compiler - X86Test_AllocRetFloat1
+// ======================================
+
+class X86Test_AllocRetFloat1 : public X86TestCase {
+public:
+ X86Test_AllocRetFloat1() : X86TestCase("AllocRetFloat1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocRetFloat1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Vec x = cc.new_xmm_ss("x");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<float, float>());
+ func_node->set_arg(0, x);
+
+ cc.ret(x);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = float (*)(float);
+ Func func = ptr_as_func<Func>(_func);
+
+ float result_ret = func(42.0f);
+ float expect_ret = 42.0f;
+
+ result.assign_format("ret={%g}", double(result_ret));
+ expect.assign_format("ret={%g}", double(expect_ret));
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocRetFloat2
+// ======================================
+
+class X86Test_AllocRetFloat2 : public X86TestCase {
+public:
+ X86Test_AllocRetFloat2() : X86TestCase("AllocRetFloat2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocRetFloat2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Vec x = cc.new_xmm_ss("x");
+ x86::Vec y = cc.new_xmm_ss("y");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<float, float, float>());
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+
+ cc.addss(x, y);
+ cc.ret(x);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = float (*)(float, float);
+ Func func = ptr_as_func<Func>(_func);
+
+ float result_ret = func(1.0f, 2.0f);
+ float expect_ret = 1.0f + 2.0f;
+
+ result.assign_format("ret={%g}", double(result_ret));
+ expect.assign_format("ret={%g}", double(expect_ret));
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocRetDouble1
+// =======================================
+
+class X86Test_AllocRetDouble1 : public X86TestCase {
+public:
+ X86Test_AllocRetDouble1() : X86TestCase("AllocRetDouble1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocRetDouble1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Vec x = cc.new_xmm_sd("x");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, double>());
+ func_node->set_arg(0, x);
+
+ cc.ret(x);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double result_ret = func(42.0);
+ double expect_ret = 42.0;
+
+ result.assign_format("ret={%g}", result_ret);
+ expect.assign_format("ret={%g}", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocRetDouble2
+// =======================================
+
+class X86Test_AllocRetDouble2 : public X86TestCase {
+public:
+ X86Test_AllocRetDouble2() : X86TestCase("AllocRetDouble2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocRetDouble2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Vec x = cc.new_xmm_sd("x");
+ x86::Vec y = cc.new_xmm_sd("y");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, double, double>());
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+
+ cc.addsd(x, y);
+ cc.ret(x);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double result_ret = func(1.0, 2.0);
+ double expect_ret = 1.0 + 2.0;
+
+ result.assign_format("ret={%g}", result_ret);
+ expect.assign_format("ret={%g}", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AllocStack
+// ==================================
+
+class X86Test_AllocStack : public X86TestCase {
+public:
+ X86Test_AllocStack() : X86TestCase("AllocStack") {}
+
+ static inline constexpr uint32_t kSize = 256u;
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AllocStack());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ x86::Mem stack = cc.new_stack(kSize, 1);
+ stack.set_size(1);
+
+ x86::Gp i = cc.new_gp_ptr("i");
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+
+ Label L_1 = cc.new_label();
+ Label L_2 = cc.new_label();
+
+ // Fill stack by sequence [0, 1, 2, 3 ... 255].
+ cc.xor_(i, i);
+
+ x86::Mem stack_with_index = stack.clone();
+ stack_with_index.set_index(i, 0);
+
+ cc.bind(L_1);
+ cc.mov(stack_with_index, i.r8());
+ cc.inc(i);
+ cc.cmp(i, 255);
+ cc.jle(L_1);
+
+ // Sum sequence in stack.
+ cc.xor_(i, i);
+ cc.xor_(a, a);
+
+ cc.bind(L_2);
+ cc.movzx(b, stack_with_index);
+ cc.add(a, b);
+ cc.inc(i);
+ cc.cmp(i, 255);
+ cc.jle(L_2);
+
+ cc.ret(a);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 32640;
+
+ result.assign_int(result_ret);
+ expect.assign_int(expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_Imul1
+// =============================
+
+class X86Test_Imul1 : public X86TestCase {
+public:
+ X86Test_Imul1() : X86TestCase("Imul1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_Imul1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp dst_hi = cc.new_gp_ptr("dst_hi");
+ x86::Gp dst_lo = cc.new_gp_ptr("dst_lo");
+
+ x86::Gp v_hi = cc.new_gp32("v_hi");
+ x86::Gp v_lo = cc.new_gp32("v_lo");
+ x86::Gp src = cc.new_gp32("src");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, int*, int*, int, int>());
+ func_node->set_arg(0, dst_hi);
+ func_node->set_arg(1, dst_lo);
+ func_node->set_arg(2, v_lo);
+ func_node->set_arg(3, src);
+
+ cc.imul(v_hi, v_lo, src);
+ cc.mov(x86::dword_ptr(dst_hi), v_hi);
+ cc.mov(x86::dword_ptr(dst_lo), v_lo);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(int*, int*, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int v0 = 4;
+ int v1 = 4;
+
+ int result_hi = 0;
+ int result_lo = 0;
+
+ int expect_hi = 0;
+ int expect_lo = v0 * v1;
+
+ func(&result_hi, &result_lo, v0, v1);
+
+ result.assign_format("hi=%d, lo=%d", result_hi, result_lo);
+ expect.assign_format("hi=%d, lo=%d", expect_hi, expect_lo);
+
+ return result_hi == expect_hi && result_lo == expect_lo;
+ }
+};
+
+// x86::Compiler - X86Test_Imul2
+// =============================
+
+class X86Test_Imul2 : public X86TestCase {
+public:
+ X86Test_Imul2() : X86TestCase("Imul2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_Imul2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp dst = cc.new_gp_ptr("dst");
+ x86::Gp src = cc.new_gp_ptr("src");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, int*, const int*>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src);
+
+ for (unsigned int i = 0; i < 4; i++) {
+ x86::Gp x = cc.new_gp32("x");
+ x86::Gp y = cc.new_gp32("y");
+ x86::Gp hi = cc.new_gp32("hi");
+
+ cc.mov(x, x86::dword_ptr(src, 0));
+ cc.mov(y, x86::dword_ptr(src, 4));
+
+ cc.imul(hi, x, y);
+ cc.add(x86::dword_ptr(dst, 0), hi);
+ cc.add(x86::dword_ptr(dst, 4), x);
+ }
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(int*, const int*);
+ Func func = ptr_as_func<Func>(_func);
+
+ int src[2] = { 4, 9 };
+ int result_ret[2] = { 0, 0 };
+ int expect_ret[2] = { 0, (4 * 9) * 4 };
+
+ func(result_ret, src);
+
+ result.assign_format("ret={%d, %d}", result_ret[0], result_ret[1]);
+ expect.assign_format("ret={%d, %d}", expect_ret[0], expect_ret[1]);
+
+ return result_ret[0] == expect_ret[0] && result_ret[1] == expect_ret[1];
+ }
+};
+
+// x86::Compiler - X86Test_Idiv1
+// =============================
+
+class X86Test_Idiv1 : public X86TestCase {
+public:
+ X86Test_Idiv1() : X86TestCase("Idiv1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_Idiv1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+ x86::Gp dummy = cc.new_gp32("dummy");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int>());
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+
+ cc.xor_(dummy, dummy);
+ cc.idiv(dummy, a, b);
+
+ cc.ret(a);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int v0 = 2999;
+ int v1 = 245;
+
+ int result_ret = func(v0, v1);
+ int expect_ret = 2999 / 245;
+
+ result.assign_format("result=%d", result_ret);
+ expect.assign_format("result=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_Setz
+// ============================
+
+class X86Test_Setz : public X86TestCase {
+public:
+ X86Test_Setz() : X86TestCase("Setz") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_Setz());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp src0 = cc.new_gp32("src0");
+ x86::Gp src1 = cc.new_gp32("src1");
+ x86::Gp dst0 = cc.new_gp_ptr("dst0");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, int, int, char*>());
+ func_node->set_arg(0, src0);
+ func_node->set_arg(1, src1);
+ func_node->set_arg(2, dst0);
+
+ cc.cmp(src0, src1);
+ cc.setz(x86::byte_ptr(dst0));
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(int, int, char*);
+ Func func = ptr_as_func<Func>(_func);
+
+ char result_buf[4] {};
+ char expect_buf[4] = { 1, 0, 0, 1 };
+
+ func(0, 0, &result_buf[0]); // We are expecting 1 (0 == 0).
+ func(0, 1, &result_buf[1]); // We are expecting 0 (0 != 1).
+ func(1, 0, &result_buf[2]); // We are expecting 0 (1 != 0).
+ func(1, 1, &result_buf[3]); // We are expecting 1 (1 == 1).
+
+ result.assign_format("out={%d, %d, %d, %d}", result_buf[0], result_buf[1], result_buf[2], result_buf[3]);
+ expect.assign_format("out={%d, %d, %d, %d}", expect_buf[0], expect_buf[1], expect_buf[2], expect_buf[3]);
+
+ return result_buf[0] == expect_buf[0] &&
+ result_buf[1] == expect_buf[1] &&
+ result_buf[2] == expect_buf[2] &&
+ result_buf[3] == expect_buf[3] ;
+ }
+};
+
+// x86::Compiler - X86Test_ShlRor
+// ==============================
+
+class X86Test_ShlRor : public X86TestCase {
+public:
+ X86Test_ShlRor() : X86TestCase("ShlRor") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_ShlRor());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp dst = cc.new_gp_ptr("dst");
+ x86::Gp var = cc.new_gp32("var");
+ x86::Gp v_shl_param = cc.new_gp32("v_shl_param");
+ x86::Gp v_ror_param = cc.new_gp32("v_ror_param");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, int*, int, int, int>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, var);
+ func_node->set_arg(2, v_shl_param);
+ func_node->set_arg(3, v_ror_param);
+
+ cc.shl(var, v_shl_param);
+ cc.ror(var, v_ror_param);
+ cc.mov(x86::dword_ptr(dst), var);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(int*, int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int v0 = 0x000000FF;
+
+ int result_ret = 0;
+ int expect_ret = 0x0000FF00;
+
+ func(&result_ret, v0, 16, 8);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_GpbLo
+// =============================
+
+class X86Test_GpbLo1 : public X86TestCase {
+public:
+ X86Test_GpbLo1() : X86TestCase("GpbLo1") {}
+
+ static inline constexpr uint32_t kCount = 32u;
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_GpbLo1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp reg_Ptr = cc.new_gp_ptr("reg_Ptr");
+ x86::Gp sum = cc.new_gp32("sum");
+ x86::Gp x[kCount];
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<uint32_t, uint32_t*>());
+ func_node->set_arg(0, reg_Ptr);
+
+ for (uint32_t i = 0; i < kCount; i++) {
+ x[i] = cc.new_gp32("x%u", i);
+ }
+
+ // Init pseudo-regs with values from our array.
+ for (uint32_t i = 0; i < kCount; i++) {
+ cc.mov(x[i], x86::dword_ptr(reg_Ptr, int(i * 4)));
+ }
+
+ for (uint32_t i = 2; i < kCount; i++) {
+ // Add and truncate to 8 bit; no purpose, just mess with jit.
+ cc.add (x[i ], x[i-1]);
+ cc.movzx(x[i ], x[i ].r8());
+ cc.movzx(x[i-2], x[i-1].r8());
+ cc.movzx(x[i-1], x[i-2].r8());
+ }
+
+ // Sum up all computed values.
+ cc.mov(sum, 0);
+ for (uint32_t i = 0; i < kCount; i++) {
+ cc.add(sum, x[i]);
+ }
+
+ // Return the sum.
+ cc.ret(sum);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(uint32_t*);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t i;
+ uint32_t buf[kCount];
+ uint32_t result_ret = 0;
+ uint32_t expect_ret = 0;
+
+ for (i = 0; i < kCount; i++) {
+ buf[i] = 1;
+ }
+
+ for (i = 2; i < kCount; i++) {
+ buf[i ]+= buf[i-1];
+ buf[i ] = buf[i ] & 0xFF;
+ buf[i-2] = buf[i-1] & 0xFF;
+ buf[i-1] = buf[i-2] & 0xFF;
+ }
+
+ for (i = 0; i < kCount; i++) {
+ expect_ret += buf[i];
+ }
+
+ for (i = 0; i < kCount; i++) {
+ buf[i] = 1;
+ }
+ result_ret = func(buf);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_GpbLo2
+// ==============================
+
+class X86Test_GpbLo2 : public X86TestCase {
+public:
+ X86Test_GpbLo2() : X86TestCase("GpbLo2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_GpbLo2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v = cc.new_gp32("v");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<uint32_t, uint32_t>());
+ func_node->set_arg(0, v);
+
+ cc.mov(v.r8(), 0xFF);
+ cc.ret(v);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t result_ret = func(0x12345678u);
+ uint32_t expect_ret = 0x123456FFu;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_RepMovsb
+// ================================
+
+class X86Test_RepMovsb : public X86TestCase {
+public:
+ X86Test_RepMovsb() : X86TestCase("RepMovsb") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_RepMovsb());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp dst = cc.new_gp_ptr("dst");
+ x86::Gp src = cc.new_gp_ptr("src");
+ x86::Gp cnt = cc.new_gp_ptr("cnt");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*, void*, size_t>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src);
+ func_node->set_arg(2, cnt);
+
+ cc.rep(cnt).movs(x86::byte_ptr(dst), x86::byte_ptr(src));
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*, void*, size_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ char dst[20] = { 0 };
+ char src[20] = "Hello AsmJit!";
+ func(dst, src, strlen(src) + 1);
+
+ result.assign_format("ret=\"%s\"", dst);
+ expect.assign_format("ret=\"%s\"", src);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_IfElse1
+// ===============================
+
+class X86Test_IfElse1 : public X86TestCase {
+public:
+ X86Test_IfElse1() : X86TestCase("IfElse1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_IfElse1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v1 = cc.new_gp32("v1");
+ x86::Gp v2 = cc.new_gp32("v2");
+
+ Label L_1 = cc.new_label();
+ Label L_2 = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int>());
+ func_node->set_arg(0, v1);
+ func_node->set_arg(1, v2);
+
+ cc.cmp(v1, v2);
+ cc.jg(L_1);
+
+ cc.mov(v1, 1);
+ cc.jmp(L_2);
+
+ cc.bind(L_1);
+ cc.mov(v1, 2);
+
+ cc.bind(L_2);
+ cc.ret(v1);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int a = func(0, 1);
+ int b = func(1, 0);
+
+ result.append_format("ret={%d, %d}", a, b);
+ expect.append_format("ret={%d, %d}", 1, 2);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_IfElse2
+// ===============================
+
+class X86Test_IfElse2 : public X86TestCase {
+public:
+ X86Test_IfElse2() : X86TestCase("IfElse2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_IfElse2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v1 = cc.new_gp32("v1");
+ x86::Gp v2 = cc.new_gp32("v2");
+
+ Label L_1 = cc.new_label();
+ Label L_2 = cc.new_label();
+ Label L_3 = cc.new_label();
+ Label L_4 = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int>());
+ func_node->set_arg(0, v1);
+ func_node->set_arg(1, v2);
+
+ cc.jmp(L_1);
+ cc.bind(L_2);
+ cc.jmp(L_4);
+ cc.bind(L_1);
+
+ cc.cmp(v1, v2);
+ cc.jg(L_3);
+
+ cc.mov(v1, 1);
+ cc.jmp(L_2);
+
+ cc.bind(L_3);
+ cc.mov(v1, 2);
+ cc.jmp(L_2);
+
+ cc.bind(L_4);
+
+ cc.ret(v1);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int a = func(0, 1);
+ int b = func(1, 0);
+
+ result.append_format("ret={%d, %d}", a, b);
+ expect.append_format("ret={%d, %d}", 1, 2);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_IfElse3
+// ===============================
+
+class X86Test_IfElse3 : public X86TestCase {
+public:
+ X86Test_IfElse3() : X86TestCase("IfElse3") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_IfElse3());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v1 = cc.new_gp32("v1");
+ x86::Gp v2 = cc.new_gp32("v2");
+ x86::Gp counter = cc.new_gp32("counter");
+
+ Label L_1 = cc.new_label();
+ Label L_Loop = cc.new_label();
+ Label L_Exit = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int>());
+ func_node->set_arg(0, v1);
+ func_node->set_arg(1, v2);
+
+ cc.cmp(v1, v2);
+ cc.jg(L_1);
+
+ cc.mov(counter, 0);
+
+ cc.bind(L_Loop);
+ cc.mov(v1, counter);
+
+ cc.inc(counter);
+ cc.cmp(counter, 1);
+ cc.jle(L_Loop);
+ cc.jmp(L_Exit);
+
+ cc.bind(L_1);
+ cc.mov(v1, 2);
+
+ cc.bind(L_Exit);
+ cc.ret(v1);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int a = func(0, 1);
+ int b = func(1, 0);
+
+ result.append_format("ret={%d, %d}", a, b);
+ expect.append_format("ret={%d, %d}", 1, 2);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_IfElse4
+// ===============================
+
+class X86Test_IfElse4 : public X86TestCase {
+public:
+ X86Test_IfElse4() : X86TestCase("IfElse4") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_IfElse4());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v1 = cc.new_gp32("v1");
+ x86::Gp v2 = cc.new_gp32("v2");
+ x86::Gp counter = cc.new_gp32("counter");
+
+ Label L_1 = cc.new_label();
+ Label L_Loop1 = cc.new_label();
+ Label L_Loop2 = cc.new_label();
+ Label L_Exit = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int>());
+ func_node->set_arg(0, v1);
+ func_node->set_arg(1, v2);
+
+ cc.mov(counter, 0);
+ cc.cmp(v1, v2);
+ cc.jg(L_1);
+
+ cc.bind(L_Loop1);
+ cc.mov(v1, counter);
+
+ cc.inc(counter);
+ cc.cmp(counter, 1);
+ cc.jle(L_Loop1);
+ cc.jmp(L_Exit);
+
+ cc.bind(L_1);
+ cc.bind(L_Loop2);
+ cc.mov(v1, counter);
+ cc.inc(counter);
+ cc.cmp(counter, 2);
+ cc.jle(L_Loop2);
+
+ cc.bind(L_Exit);
+ cc.ret(v1);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int a = func(0, 1);
+ int b = func(1, 0);
+
+ result.append_format("ret={%d, %d}", a, b);
+ expect.append_format("ret={%d, %d}", 1, 2);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_Memcpy
+// ==============================
+
+class X86Test_Memcpy : public X86TestCase {
+public:
+ X86Test_Memcpy() : X86TestCase("Memcpy") {}
+
+ static inline constexpr uint32_t kCount = 32u;
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_Memcpy());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp dst = cc.new_gp_ptr("dst");
+ x86::Gp src = cc.new_gp_ptr("src");
+ x86::Gp cnt = cc.new_gp_ptr("cnt");
+
+ Label L_Loop = cc.new_label(); // Create base labels we use
+ Label L_Exit = cc.new_label(); // in our function.
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, uint32_t*, const uint32_t*, size_t>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src);
+ func_node->set_arg(2, cnt);
+
+ cc.test(cnt, cnt); // Exit if the size is zero.
+ cc.jz(L_Exit);
+
+ cc.bind(L_Loop); // Bind the loop label here.
+
+ x86::Gp tmp = cc.new_gp32("tmp"); // Copy a single dword (4 bytes).
+ cc.mov(tmp, x86::dword_ptr(src));
+ cc.mov(x86::dword_ptr(dst), tmp);
+
+ cc.add(src, 4); // Increment dst/src pointers.
+ cc.add(dst, 4);
+
+ cc.dec(cnt); // Loop until cnt isn't zero.
+ cc.jnz(L_Loop);
+
+ cc.bind(L_Exit); // Bind the exit label here.
+ cc.end_func(); // End of function.
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(uint32_t*, const uint32_t*, size_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t i;
+
+ uint32_t dst_buffer[kCount];
+ uint32_t src_buffer[kCount];
+
+ for (i = 0; i < kCount; i++) {
+ dst_buffer[i] = 0;
+ src_buffer[i] = i;
+ }
+
+ func(dst_buffer, src_buffer, kCount);
+
+ result.assign("buf={");
+ expect.assign("buf={");
+
+ for (i = 0; i < kCount; i++) {
+ if (i != 0) {
+ result.append(", ");
+ expect.append(", ");
+ }
+
+ result.append_format("%u", unsigned(dst_buffer[i]));
+ expect.append_format("%u", unsigned(src_buffer[i]));
+ }
+
+ result.append("}");
+ expect.append("}");
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_ExtraBlock
+// ==================================
+
+class X86Test_ExtraBlock : public X86TestCase {
+public:
+ X86Test_ExtraBlock() : X86TestCase("ExtraBlock") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_ExtraBlock());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp cond = cc.new_gp32("cond");
+ x86::Gp ret = cc.new_gp32("ret");
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int>());
+ func_node->set_arg(0, cond);
+ func_node->set_arg(1, a);
+ func_node->set_arg(2, b);
+
+ Label L_Ret = cc.new_label();
+ Label L_Extra = cc.new_label();
+
+ cc.test(cond, cond);
+ cc.jnz(L_Extra);
+
+ cc.mov(ret, a);
+ cc.add(ret, b);
+
+ cc.bind(L_Ret);
+ cc.ret(ret);
+
+ // Emit code sequence at the end of the function.
+ BaseNode* prev_cursor = cc.set_cursor(func_node->end_node()->prev());
+ cc.bind(L_Extra);
+ cc.mov(ret, a);
+ cc.sub(ret, b);
+ cc.jmp(L_Ret);
+ cc.set_cursor(prev_cursor);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int ret1 = func(0, 4, 5);
+ int ret2 = func(1, 4, 5);
+
+ int exp1 = 4 + 5;
+ int exp2 = 4 - 5;
+
+ result.assign_format("ret={%d, %d}", ret1, ret2);
+ expect.assign_format("ret={%d, %d}", exp1, exp2);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AlphaBlend
+// ==================================
+
+class X86Test_AlphaBlend : public X86TestCase {
+public:
+ X86Test_AlphaBlend() : X86TestCase("AlphaBlend") {}
+
+ static inline constexpr uint32_t kCount = 17u;
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_AlphaBlend());
+ }
+
+ static uint32_t blend_src_over(uint32_t d, uint32_t s) {
+ uint32_t sa_inv = ~s >> 24;
+
+ uint32_t d_20 = (d ) & 0x00FF00FF;
+ uint32_t d_31 = (d >> 8) & 0x00FF00FF;
+
+ d_20 *= sa_inv;
+ d_31 *= sa_inv;
+
+ d_20 = ((d_20 + ((d_20 >> 8) & 0x00FF00FFu) + 0x00800080u) & 0xFF00FF00u) >> 8;
+ d_31 = ((d_31 + ((d_31 >> 8) & 0x00FF00FFu) + 0x00800080u) & 0xFF00FF00u);
+
+ return d_20 + d_31 + s;
+ }
+
+ void compile(x86::Compiler& cc) override {
+ asmtest::generate_sse_alpha_blend(cc, true);
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*, const void*, size_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ static const uint32_t dst_const_data[] = { 0x00000000, 0x10101010, 0x20100804, 0x30200003, 0x40204040, 0x5000004D, 0x60302E2C, 0x706F6E6D, 0x807F4F2F, 0x90349001, 0xA0010203, 0xB03204AB, 0xC023AFBD, 0xD0D0D0C0, 0xE0AABBCC, 0xFFFFFFFF, 0xF8F4F2F1 };
+ static const uint32_t src_const_data[] = { 0xE0E0E0E0, 0xA0008080, 0x341F1E1A, 0xFEFEFEFE, 0x80302010, 0x49490A0B, 0x998F7798, 0x00000000, 0x01010101, 0xA0264733, 0xBAB0B1B9, 0xFF000000, 0xDAB0A0C1, 0xE0BACFDA, 0x99887766, 0xFFFFFF80, 0xEE0A5FEC };
+
+ uint32_t dst_buffer_storage[kCount + 3];
+ uint32_t src_buffer_storage[kCount + 3];
+
+ // Has to be aligned.
+ uint32_t* dst_buffer = (uint32_t*)Support::align_up<intptr_t>((intptr_t)dst_buffer_storage, 16);
+ uint32_t* src_buffer = (uint32_t*)Support::align_up<intptr_t>((intptr_t)src_buffer_storage, 16);
+
+ memcpy(dst_buffer, dst_const_data, sizeof(dst_const_data));
+ memcpy(src_buffer, src_const_data, sizeof(src_const_data));
+
+ uint32_t i;
+ uint32_t exp_buffer[kCount];
+
+ for (i = 0; i < kCount; i++) {
+ exp_buffer[i] = blend_src_over(dst_buffer[i], src_buffer[i]);
+ }
+
+ func(dst_buffer, src_buffer, kCount);
+
+ result.assign("buf={");
+ expect.assign("buf={");
+
+ for (i = 0; i < kCount; i++) {
+ if (i != 0) {
+ result.append(", ");
+ expect.append(", ");
+ }
+
+ result.append_format("%08X", unsigned(dst_buffer[i]));
+ expect.append_format("%08X", unsigned(exp_buffer[i]));
+ }
+
+ result.append("}");
+ expect.append("}");
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AVX512_KK
+// =================================
+
+class X86Test_AVX512_KK : public X86TestCase {
+public:
+ X86Test_AVX512_KK() : X86TestCase("AVX512_KK") {}
+
+ static void add(TestApp& app) {
+ const CpuInfo& cpu_info = CpuInfo::host();
+
+ if (cpu_info.features().x86().has_avx512_f()) {
+ app.add(new X86Test_AVX512_KK());
+ }
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<uint32_t, const void*, const void*, uint32_t>());
+
+ x86::Gp a = cc.new_gp_ptr("a");
+ x86::Gp b = cc.new_gp_ptr("b");
+ x86::Gp pred = cc.new_gp32("pred");
+ x86::Gp result = cc.new_gp32("result");
+
+ x86::Vec va = cc.new_zmm("va");
+ x86::Vec vb = cc.new_zmm("vb");
+ x86::KReg k_in = cc.new_kd("k_in");
+ x86::KReg k_out = cc.new_kd("k_out");
+
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+ func_node->set_arg(2, pred);
+
+ cc.vmovdqu32(va, x86::ptr(a));
+ cc.vmovdqu32(vb, x86::ptr(b));
+ cc.kmovd(k_in, pred);
+ cc.k(k_in).vpcmpeqd(k_out, va, vb);
+ cc.kmovd(result, k_out);
+ cc.ret(result);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(const void*, const void*, uint32_t pred_k);
+ Func func = ptr_as_func<Func>(_func);
+
+ static const uint32_t src_a[16] = { 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1 };
+ static const uint32_t src_b[16] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 };
+
+ uint32_t ret = func(src_a, src_b, 0xF0F0);
+
+ result.assign_format("0x%08X", ret);
+ expect.assign_format("0x%08X", 0xA040u);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_AVX512_TernLog
+// ======================================
+
+class X86Test_AVX512_TernLog : public X86TestCase {
+public:
+ X86Test_AVX512_TernLog() : X86TestCase("AVX512_TernLog") {}
+
+ static void add(TestApp& app) {
+ const CpuInfo& cpu_info = CpuInfo::host();
+
+ if (cpu_info.features().x86().has_avx512_f()) {
+ app.add(new X86Test_AVX512_TernLog());
+ }
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*>());
+
+ x86::Gp out_ptr = cc.new_gp_ptr("out_ptr");
+ x86::Vec vec = cc.new_zmm("vec");
+
+ func_node->set_arg(0, out_ptr);
+
+ cc.vpternlogd(vec, vec, vec, 0xFFu);
+ cc.vmovdqu8(x86::ptr(out_ptr), vec);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t out[16] {};
+ func(out);
+
+ result.assign("{");
+ expect.assign("{");
+
+ for (uint32_t i = 0; i < 16; i++) {
+ if (i) {
+ result.append(", ");
+ expect.append(", ");
+ }
+ result.append_format("0x%08X", out[i]);
+ expect.append_format("0x%08X", 0xFFFFFFFFu);
+ }
+
+ result.append("}");
+ expect.append("}");
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncArgInt8
+// ===================================
+
+class X86Test_FuncArgInt8 : public X86TestCase {
+public:
+ X86Test_FuncArgInt8() : X86TestCase("FuncArgInt8") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncArgInt8());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<unsigned, uint8_t, uint8_t, uint32_t>());
+ func_node->set_arg(0, v0);
+ func_node->set_arg(1, v1);
+
+ cc.add(v0, v1);
+
+ cc.ret(v0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(uint8_t, uint8_t, uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t arg = uint32_t(uintptr_t(_func) & 0xFFFFFFFF);
+
+ unsigned result_ret = func(uint8_t(arg & 0xFF), uint8_t(arg & 0xFF), arg);
+ unsigned expect_ret = (arg & 0xFF) * 2;
+
+ result.assign_format("ret=%u", result_ret);
+ expect.assign_format("ret=%u", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallBase1
+// =====================================
+
+class X86Test_FuncCallBase1 : public X86TestCase {
+public:
+ X86Test_FuncCallBase1() : X86TestCase("FuncCallBase1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallBase1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+ x86::Gp v2 = cc.new_gp32("v2");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int>());
+ func_node->set_arg(0, v0);
+ func_node->set_arg(1, v1);
+ func_node->set_arg(2, v2);
+
+ // Just do something.
+ cc.shl(v0, 1);
+ cc.shl(v1, 1);
+ cc.shl(v2, 1);
+
+ // Call a function.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), FuncSignature::build<int, int, int, int>());
+ invoke_node->set_arg(0, v2);
+ invoke_node->set_arg(1, v1);
+ invoke_node->set_arg(2, v0);
+ invoke_node->set_ret(0, v0);
+
+ cc.ret(v0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(3, 2, 1);
+ int expect_ret = 36;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+
+ static int called_fn(int a, int b, int c) { return (a + b) * c; }
+};
+
+// x86::Compiler - X86Test_FuncCallBase2
+// =====================================
+
+class X86Test_FuncCallBase2 : public X86TestCase {
+public:
+ X86Test_FuncCallBase2() : X86TestCase("FuncCallBase2") {}
+
+ static inline constexpr uint32_t kSize = 256u;
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallBase2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ const int kTokenSize = 32;
+
+ x86::Mem s1 = cc.new_stack(kTokenSize, 32);
+ x86::Mem s2 = cc.new_stack(kTokenSize, 32);
+
+ x86::Gp p1 = cc.new_gp_ptr("p1");
+ x86::Gp p2 = cc.new_gp_ptr("p2");
+
+ x86::Gp ret = cc.new_gp32("ret");
+ Label L_Exit = cc.new_label();
+
+ static const char token[kTokenSize] = "-+:|abcdefghijklmnopqrstuvwxyz|";
+ InvokeNode* invoke_node;
+
+ cc.lea(p1, s1);
+ cc.lea(p2, s2);
+
+ // Try to corrupt the stack if wrongly allocated.
+ cc.invoke(Out(invoke_node), imm((void*)memcpy), FuncSignature::build<void*, void*, void*, size_t>());
+ invoke_node->set_arg(0, p1);
+ invoke_node->set_arg(1, imm(token));
+ invoke_node->set_arg(2, imm(kTokenSize));
+ invoke_node->set_ret(0, p1);
+
+ cc.invoke(Out(invoke_node), imm((void*)memcpy), FuncSignature::build<void*, void*, void*, size_t>());
+ invoke_node->set_arg(0, p2);
+ invoke_node->set_arg(1, imm(token));
+ invoke_node->set_arg(2, imm(kTokenSize));
+ invoke_node->set_ret(0, p2);
+
+ cc.invoke(Out(invoke_node), imm((void*)memcmp), FuncSignature::build<int, void*, void*, size_t>());
+ invoke_node->set_arg(0, p1);
+ invoke_node->set_arg(1, p2);
+ invoke_node->set_arg(2, imm(kTokenSize));
+ invoke_node->set_ret(0, ret);
+
+ // This should be 0 on success, however, if both `p1` and `p2` were
+ // allocated in the same address this check will still pass.
+ cc.cmp(ret, 0);
+ cc.jnz(L_Exit);
+
+ // Checks whether `p1` and `p2` are different (must be).
+ cc.xor_(ret, ret);
+ cc.cmp(p1, p2);
+ cc.setz(ret.r8());
+
+ cc.bind(L_Exit);
+ cc.ret(ret);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 0; // Must be zero, stack addresses must be different.
+
+ result.assign_int(result_ret);
+ expect.assign_int(expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallStd
+// ===================================
+
+class X86Test_FuncCallStd : public X86TestCase {
+public:
+ X86Test_FuncCallStd() : X86TestCase("FuncCallStd") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallStd());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp x = cc.new_gp32("x");
+ x86::Gp y = cc.new_gp32("y");
+ x86::Gp z = cc.new_gp32("z");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int>());
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+ func_node->set_arg(2, z);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<int, int, int, int>(CallConvId::kStdCall));
+ invoke_node->set_arg(0, x);
+ invoke_node->set_arg(1, y);
+ invoke_node->set_arg(2, z);
+ invoke_node->set_ret(0, x);
+
+ cc.ret(x);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(1, 42, 3);
+ int expect_ret = called_fn(1, 42, 3);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+
+ // STDCALL function that is called inside the generated one.
+ static int ASMJIT_STDCALL called_fn(int a, int b, int c) noexcept {
+ return (a + b) * c;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallFast
+// ====================================
+
+class X86Test_FuncCallFast : public X86TestCase {
+public:
+ X86Test_FuncCallFast() : X86TestCase("FuncCallFast") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallFast());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp var = cc.new_gp32("var");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int>());
+ func_node->set_arg(0, var);
+
+ InvokeNode* invoke_node;
+
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), FuncSignature::build<int, int>(CallConvId::kFastCall));
+ invoke_node->set_arg(0, var);
+ invoke_node->set_ret(0, var);
+
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), FuncSignature::build<int, int>(CallConvId::kFastCall));
+ invoke_node->set_arg(0, var);
+ invoke_node->set_ret(0, var);
+
+ cc.ret(var);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(9);
+ int expect_ret = (9 * 9) * (9 * 9);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+
+ // FASTCALL function that is called inside the generated one.
+ static int ASMJIT_FASTCALL called_fn(int a) noexcept {
+ return a * a;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallSIMD
+// ====================================
+
+#if ASMJIT_ARCH_X86
+class X86Test_FuncCallSIMD : public X86TestCase {
+public:
+ bool _use_vector_call;
+
+ X86Test_FuncCallSIMD(bool use_vector_call)
+ : X86TestCase(),
+ _use_vector_call(use_vector_call) {
+ _name.assign_format("FuncCallSIMD {%s}", _use_vector_call ? "__vectorcall" : "__cdecl");
+ }
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallSIMD(false));
+#ifdef _MSC_VER
+ app.add(new X86Test_FuncCallSIMD(true));
+#endif
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*, const void*, const void*>());
+
+ x86::Gp result_ptr = cc.new_gp_ptr("result_ptr");
+ x86::Gp a_ptr = cc.new_gp_ptr("a_ptr");
+ x86::Gp b_ptr = cc.new_gp_ptr("b_ptr");
+ x86::Gp p_fn = cc.new_gp_ptr("p_fn");
+
+ x86::Vec xmm_a = cc.new_xmm("xmm_a");
+ x86::Vec xmm_b = cc.new_xmm("xmm_b");
+
+ func_node->set_arg(0, result_ptr);
+ func_node->set_arg(1, a_ptr);
+ func_node->set_arg(2, b_ptr);
+
+ CallConvId call_conv_id = CallConvId::kCDecl;
+ Imm p_fn_imm = imm((void*)called_fn_cdecl);
+
+#ifdef _MSC_VER
+ if (_use_vector_call) {
+ call_conv_id = CallConvId::kVectorCall;
+ p_fn_imm = imm((void*)called_fn_vectorcall);
+ }
+#endif
+
+ cc.mov(p_fn, p_fn_imm);
+ cc.movdqu(xmm_a, x86::ptr(a_ptr));
+ cc.movdqu(xmm_b, x86::ptr(b_ptr));
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), p_fn, FuncSignature::build<Type::Vec128, Type::Vec128, Type::Vec128>(call_conv_id));
+
+ invoke_node->set_arg(0, xmm_a);
+ invoke_node->set_arg(1, xmm_b);
+ invoke_node->set_ret(0, xmm_a);
+
+ cc.movdqu(x86::ptr(result_ptr), xmm_a);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*, const void*, const void*);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint8_t a_data[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+ uint8_t b_data[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
+
+ uint8_t r_data[16] {};
+ uint8_t e_data[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
+
+ func(r_data, a_data, b_data);
+
+ result.append_hex(r_data, 16);
+ expect.append_hex(e_data, 16);
+
+ return result == expect;
+ }
+
+ static __m128i called_fn_cdecl(__m128i a, __m128i b) {
+ return _mm_add_epi8(a, b);
+ }
+
+#ifdef _MSC_VER
+ static __m128i __vectorcall called_fn_vectorcall(__m128i a, __m128i b) {
+ return _mm_add_epi8(a, b);
+ }
+#endif
+};
+#endif // ASMJIT_ARCH_X86
+
+// x86::Compiler - X86Test_FuncCallLight
+// =====================================
+
+class X86Test_FuncCallLight : public X86TestCase {
+public:
+ X86Test_FuncCallLight() : X86TestCase("FuncCallLight") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallLight());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncSignature f1_signature = FuncSignature::build<void, const void*, const void*, const void*, const void*, void*>();
+ FuncSignature f2_signature = FuncSignature::build<Type::Vec128, Type::Vec128, Type::Vec128>(CallConvId::kLightCall2);
+
+ FuncNode* f1_node = cc.new_func(f1_signature);
+ FuncNode* f2_node = cc.new_func(f2_signature);
+
+ {
+ x86::Gp a_ptr = cc.new_gp_ptr("a_ptr");
+ x86::Gp b_ptr = cc.new_gp_ptr("b_ptr");
+ x86::Gp c_ptr = cc.new_gp_ptr("c_ptr");
+ x86::Gp d_ptr = cc.new_gp_ptr("d_ptr");
+ x86::Gp p_out = cc.new_gp_ptr("p_out");
+
+ x86::Vec xmm_a = cc.new_xmm("xmm_a");
+ x86::Vec xmm_b = cc.new_xmm("xmm_b");
+ x86::Vec xmm_c = cc.new_xmm("xmm_c");
+ x86::Vec xmm_d = cc.new_xmm("xmm_d");
+
+ cc.add_func(f1_node);
+ f1_node->set_arg(0, a_ptr);
+ f1_node->set_arg(1, b_ptr);
+ f1_node->set_arg(2, c_ptr);
+ f1_node->set_arg(3, d_ptr);
+ f1_node->set_arg(4, p_out);
+
+ cc.movups(xmm_a, x86::ptr(a_ptr));
+ cc.movups(xmm_b, x86::ptr(b_ptr));
+ cc.movups(xmm_c, x86::ptr(c_ptr));
+ cc.movups(xmm_d, x86::ptr(d_ptr));
+
+ x86::Vec xmm_x = cc.new_xmm("xmm_x");
+ x86::Vec xmm_y = cc.new_xmm("xmm_y");
+
+ InvokeNode* invoke_node;
+
+ cc.invoke(Out(invoke_node), f2_node->label(), f2_signature);
+ invoke_node->set_arg(0, xmm_a);
+ invoke_node->set_arg(1, xmm_b);
+ invoke_node->set_ret(0, xmm_x);
+
+ cc.invoke(Out(invoke_node), f2_node->label(), f2_signature);
+ invoke_node->set_arg(0, xmm_c);
+ invoke_node->set_arg(1, xmm_d);
+ invoke_node->set_ret(0, xmm_y);
+
+ cc.pmullw(xmm_x, xmm_y);
+ cc.movups(x86::ptr(p_out), xmm_x);
+
+ cc.end_func();
+ }
+
+ {
+ x86::Vec xmm_a = cc.new_xmm("xmm_a");
+ x86::Vec xmm_b = cc.new_xmm("xmm_b");
+
+ cc.add_func(f2_node);
+ f2_node->set_arg(0, xmm_a);
+ f2_node->set_arg(1, xmm_b);
+ cc.paddw(xmm_a, xmm_b);
+ cc.ret(xmm_a);
+ cc.end_func();
+ }
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(const void*, const void*, const void*, const void*, void*);
+
+ Func func = ptr_as_func<Func>(_func);
+
+ int16_t a[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+ int16_t b[8] = { 7, 6, 5, 4, 3, 2, 1, 0 };
+ int16_t c[8] = { 1, 3, 9, 7, 5, 4, 2, 1 };
+ int16_t d[8] = { 2, 0,-6,-4,-2,-1, 1, 2 };
+
+ int16_t o[8] {};
+ int oexp = 7 * 3;
+
+ func(a, b, c, d, o);
+
+ result.assign_format("ret={%02X %02X %02X %02X %02X %02X %02X %02X}", o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7]);
+ expect.assign_format("ret={%02X %02X %02X %02X %02X %02X %02X %02X}", oexp, oexp, oexp, oexp, oexp, oexp, oexp, oexp);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallManyArgs
+// ========================================
+
+class X86Test_FuncCallManyArgs : public X86TestCase {
+public:
+ X86Test_FuncCallManyArgs() : X86TestCase("FuncCallManyArgs") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallManyArgs());
+ }
+
+ static int called_fn(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {
+ return (a * b * c * d * e) + (f * g * h * i * j);
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ // Prepare.
+ x86::Gp va = cc.new_gp32("va");
+ x86::Gp vb = cc.new_gp32("vb");
+ x86::Gp vc = cc.new_gp32("vc");
+ x86::Gp vd = cc.new_gp32("vd");
+ x86::Gp ve = cc.new_gp32("ve");
+ x86::Gp vf = cc.new_gp32("vf");
+ x86::Gp vg = cc.new_gp32("vg");
+ x86::Gp vh = cc.new_gp32("vh");
+ x86::Gp vi = cc.new_gp32("vi");
+ x86::Gp vj = cc.new_gp32("vj");
+
+ cc.mov(va, 0x03);
+ cc.mov(vb, 0x12);
+ cc.mov(vc, 0xA0);
+ cc.mov(vd, 0x0B);
+ cc.mov(ve, 0x2F);
+ cc.mov(vf, 0x02);
+ cc.mov(vg, 0x0C);
+ cc.mov(vh, 0x12);
+ cc.mov(vi, 0x18);
+ cc.mov(vj, 0x1E);
+
+ // Function call.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
+ invoke_node->set_arg(0, va);
+ invoke_node->set_arg(1, vb);
+ invoke_node->set_arg(2, vc);
+ invoke_node->set_arg(3, vd);
+ invoke_node->set_arg(4, ve);
+ invoke_node->set_arg(5, vf);
+ invoke_node->set_arg(6, vg);
+ invoke_node->set_arg(7, vh);
+ invoke_node->set_arg(8, vi);
+ invoke_node->set_arg(9, vj);
+ invoke_node->set_ret(0, va);
+
+ cc.ret(va);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = called_fn(0x03, 0x12, 0xA0, 0x0B, 0x2F, 0x02, 0x0C, 0x12, 0x18, 0x1E);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallDuplicateArgs
+// =============================================
+
+class X86Test_FuncCallDuplicateArgs : public X86TestCase {
+public:
+ X86Test_FuncCallDuplicateArgs() : X86TestCase("FuncCallDuplicateArgs") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallDuplicateArgs());
+ }
+
+ static int called_fn(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {
+ return (a * b * c * d * e) + (f * g * h * i * j);
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ // Prepare.
+ x86::Gp a = cc.new_gp32("a");
+ cc.mov(a, 3);
+
+ // Call function.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
+ invoke_node->set_arg(0, a);
+ invoke_node->set_arg(1, a);
+ invoke_node->set_arg(2, a);
+ invoke_node->set_arg(3, a);
+ invoke_node->set_arg(4, a);
+ invoke_node->set_arg(5, a);
+ invoke_node->set_arg(6, a);
+ invoke_node->set_arg(7, a);
+ invoke_node->set_arg(8, a);
+ invoke_node->set_arg(9, a);
+ invoke_node->set_ret(0, a);
+
+ cc.ret(a);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = called_fn(3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallImmArgs
+// =======================================
+
+class X86Test_FuncCallImmArgs : public X86TestCase {
+public:
+ X86Test_FuncCallImmArgs() : X86TestCase("FuncCallImmArgs") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallImmArgs());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ // Prepare.
+ x86::Gp rv = cc.new_gp32("rv");
+
+ // Call function.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)X86Test_FuncCallManyArgs::called_fn),
+ FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
+
+ invoke_node->set_arg(0, imm(0x03));
+ invoke_node->set_arg(1, imm(0x12));
+ invoke_node->set_arg(2, imm(0xA0));
+ invoke_node->set_arg(3, imm(0x0B));
+ invoke_node->set_arg(4, imm(0x2F));
+ invoke_node->set_arg(5, imm(0x02));
+ invoke_node->set_arg(6, imm(0x0C));
+ invoke_node->set_arg(7, imm(0x12));
+ invoke_node->set_arg(8, imm(0x18));
+ invoke_node->set_arg(9, imm(0x1E));
+ invoke_node->set_ret(0, rv);
+
+ cc.ret(rv);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = X86Test_FuncCallManyArgs::called_fn(0x03, 0x12, 0xA0, 0x0B, 0x2F, 0x02, 0x0C, 0x12, 0x18, 0x1E);
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallPtrArgs
+// =======================================
+
+class X86Test_FuncCallPtrArgs : public X86TestCase {
+public:
+ X86Test_FuncCallPtrArgs() : X86TestCase("FuncCallPtrArgs") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallPtrArgs());
+ }
+
+ static int called_fn(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j) {
+ return int((intptr_t)a) +
+ int((intptr_t)b) +
+ int((intptr_t)c) +
+ int((intptr_t)d) +
+ int((intptr_t)e) +
+ int((intptr_t)f) +
+ int((intptr_t)g) +
+ int((intptr_t)h) +
+ int((intptr_t)i) +
+ int((intptr_t)j) ;
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ // Prepare.
+ x86::Gp rv = cc.new_gp32("rv");
+
+ // Call function.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<int, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*>());
+
+ invoke_node->set_arg(0, imm(0x01));
+ invoke_node->set_arg(1, imm(0x02));
+ invoke_node->set_arg(2, imm(0x03));
+ invoke_node->set_arg(3, imm(0x04));
+ invoke_node->set_arg(4, imm(0x05));
+ invoke_node->set_arg(5, imm(0x06));
+ invoke_node->set_arg(6, imm(0x07));
+ invoke_node->set_arg(7, imm(0x08));
+ invoke_node->set_arg(8, imm(0x09));
+ invoke_node->set_arg(9, imm(0x0A));
+ invoke_node->set_ret(0, rv);
+
+ cc.ret(rv);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 55;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallRefArgs
+// =======================================
+
+class X86Test_FuncCallRefArgs : public X86TestCase {
+public:
+ X86Test_FuncCallRefArgs() : X86TestCase("FuncCallRefArgs") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallRefArgs());
+ }
+
+ static int called_fn(int& a, int& b, int& c, int& d) {
+ a += a;
+ b += b;
+ c += c;
+ d += d;
+ return a + b + c + d;
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int&, int&, int&, int&>());
+
+ // Prepare.
+ x86::Gp arg1 = cc.new_gp32();
+ x86::Gp arg2 = cc.new_gp32();
+ x86::Gp arg3 = cc.new_gp32();
+ x86::Gp arg4 = cc.new_gp32();
+ x86::Gp rv = cc.new_gp32("rv");
+
+ func_node->set_arg(0, arg1);
+ func_node->set_arg(1, arg2);
+ func_node->set_arg(2, arg3);
+ func_node->set_arg(3, arg4);
+
+ // Call function.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<int, int&, int&, int&, int&>());
+
+ invoke_node->set_arg(0, arg1);
+ invoke_node->set_arg(1, arg2);
+ invoke_node->set_arg(2, arg3);
+ invoke_node->set_arg(3, arg4);
+ invoke_node->set_ret(0, rv);
+
+ cc.ret(rv);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int&, int&, int&, int&);
+ Func func = ptr_as_func<Func>(_func);
+
+ int inputs[4] = { 1, 2, 3, 4 };
+ int outputs[4] = { 2, 4, 6, 8 };
+ int result_ret = func(inputs[0], inputs[1], inputs[2], inputs[3]);
+ int expect_ret = 20;
+
+ result.assign_format("ret={%08X %08X %08X %08X %08X}", result_ret, inputs[0], inputs[1], inputs[2], inputs[3]);
+ expect.assign_format("ret={%08X %08X %08X %08X %08X}", expect_ret, outputs[0], outputs[1], outputs[2], outputs[3]);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallFloatAsXmmRet
+// =============================================
+
+class X86Test_FuncCallFloatAsXmmRet : public X86TestCase {
+public:
+ X86Test_FuncCallFloatAsXmmRet() : X86TestCase("FuncCallFloatAsXmmRet") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallFloatAsXmmRet());
+ }
+
+ static float called_fn(float a, float b) {
+ return a * b;
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<float, float, float>());
+
+ x86::Vec a = cc.new_xmm_ss("a");
+ x86::Vec b = cc.new_xmm_ss("b");
+ x86::Vec ret = cc.new_xmm_ss("ret");
+
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+
+ // Call function.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), FuncSignature::build<float, float, float>());
+ invoke_node->set_arg(0, a);
+ invoke_node->set_arg(1, b);
+ invoke_node->set_ret(0, ret);
+
+ cc.ret(ret);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = float (*)(float, float);
+ Func func = ptr_as_func<Func>(_func);
+
+ float result_ret = func(15.5f, 2.0f);
+ float expect_ret = called_fn(15.5f, 2.0f);
+
+ result.assign_format("ret=%g", double(result_ret));
+ expect.assign_format("ret=%g", double(expect_ret));
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallDoubleAsXmmRet
+// ==============================================
+
+class X86Test_FuncCallDoubleAsXmmRet : public X86TestCase {
+public:
+ X86Test_FuncCallDoubleAsXmmRet() : X86TestCase("FuncCallDoubleAsXmmRet") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallDoubleAsXmmRet());
+ }
+
+ static double called_fn(double a, double b) {
+ return a * b;
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, double, double>());
+
+ x86::Vec a = cc.new_xmm_sd("a");
+ x86::Vec b = cc.new_xmm_sd("b");
+ x86::Vec ret = cc.new_xmm_sd("ret");
+
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), FuncSignature::build<double, double, double>());
+ invoke_node->set_arg(0, a);
+ invoke_node->set_arg(1, b);
+ invoke_node->set_ret(0, ret);
+
+ cc.ret(ret);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double result_ret = func(15.5, 2.0);
+ double expect_ret = called_fn(15.5, 2.0);
+
+ result.assign_format("ret=%g", result_ret);
+ expect.assign_format("ret=%g", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallConditional
+// ===========================================
+
+class X86Test_FuncCallConditional : public X86TestCase {
+public:
+ X86Test_FuncCallConditional() : X86TestCase("FuncCallConditional") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallConditional());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp x = cc.new_gp32("x");
+ x86::Gp y = cc.new_gp32("y");
+ x86::Gp op = cc.new_gp32("op");
+
+ InvokeNode* invoke_node;
+ x86::Gp result;
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int>());
+ func_node->set_arg(0, x);
+ func_node->set_arg(1, y);
+ func_node->set_arg(2, op);
+
+ Label op_add = cc.new_label();
+ Label op_mul = cc.new_label();
+
+ cc.cmp(op, 0);
+ cc.jz(op_add);
+ cc.cmp(op, 1);
+ cc.jz(op_mul);
+
+ result = cc.new_gp32("result_0");
+ cc.mov(result, 0);
+ cc.ret(result);
+
+ cc.bind(op_add);
+ result = cc.new_gp32("result_1");
+
+ cc.invoke(Out(invoke_node), (uint64_t)called_fn_add, FuncSignature::build<int, int, int>());
+ invoke_node->set_arg(0, x);
+ invoke_node->set_arg(1, y);
+ invoke_node->set_ret(0, result);
+ cc.ret(result);
+
+ cc.bind(op_mul);
+ result = cc.new_gp32("result_2");
+
+ cc.invoke(Out(invoke_node), (uint64_t)called_fn_mul, FuncSignature::build<int, int, int>());
+ invoke_node->set_arg(0, x);
+ invoke_node->set_arg(1, y);
+ invoke_node->set_ret(0, result);
+
+ cc.ret(result);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int arg1 = 4;
+ int arg2 = 8;
+
+ int result_add = func(arg1, arg2, 0);
+ int expect_add = called_fn_add(arg1, arg2);
+
+ int result_mul = func(arg1, arg2, 1);
+ int expect_mul = called_fn_mul(arg1, arg2);
+
+ result.assign_format("ret={add=%d, mul=%d}", result_add, result_mul);
+ expect.assign_format("ret={add=%d, mul=%d}", expect_add, expect_mul);
+
+ return (result_add == expect_add) && (result_mul == expect_mul);
+ }
+
+ static int called_fn_add(int x, int y) { return x + y; }
+ static int called_fn_mul(int x, int y) { return x * y; }
+};
+
+// x86::Compiler - X86Test_FuncCallMultiple
+// ========================================
+
+class X86Test_FuncCallMultiple : public X86TestCase {
+public:
+ X86Test_FuncCallMultiple() : X86TestCase("FuncCallMultiple") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMultiple());
+ }
+
+ static int ASMJIT_FASTCALL called_fn(int* p_int, int index) {
+ return p_int[index];
+ }
+
+ void compile(x86::Compiler& cc) override {
+ unsigned int i;
+
+ x86::Gp buf = cc.new_gp_ptr("buf");
+ x86::Gp acc0 = cc.new_gp32("acc0");
+ x86::Gp acc1 = cc.new_gp32("acc1");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int*>());
+ func_node->set_arg(0, buf);
+
+ cc.mov(acc0, 0);
+ cc.mov(acc1, 0);
+
+ for (i = 0; i < 4; i++) {
+ x86::Gp ret = cc.new_gp32("ret");
+ x86::Gp ptr = cc.new_gp_ptr("ptr");
+ x86::Gp idx = cc.new_gp32("idx");
+ InvokeNode* invoke_node;
+
+ cc.mov(ptr, buf);
+ cc.mov(idx, int(i));
+
+ cc.invoke(Out(invoke_node), (uint64_t)called_fn, FuncSignature::build<int, int*, int>(CallConvId::kFastCall));
+ invoke_node->set_arg(0, ptr);
+ invoke_node->set_arg(1, idx);
+ invoke_node->set_ret(0, ret);
+
+ cc.add(acc0, ret);
+
+ cc.mov(ptr, buf);
+ cc.mov(idx, int(i));
+
+ cc.invoke(Out(invoke_node), (uint64_t)called_fn, FuncSignature::build<int, int*, int>(CallConvId::kFastCall));
+ invoke_node->set_arg(0, ptr);
+ invoke_node->set_arg(1, idx);
+ invoke_node->set_ret(0, ret);
+
+ cc.sub(acc1, ret);
+ }
+
+ cc.add(acc0, acc1);
+ cc.ret(acc0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int*);
+ Func func = ptr_as_func<Func>(_func);
+
+ int buffer[4] = { 127, 87, 23, 17 };
+
+ int result_ret = func(buffer);
+ int expect_ret = 0;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallRecursive
+// =========================================
+
+class X86Test_FuncCallRecursive : public X86TestCase {
+public:
+ X86Test_FuncCallRecursive() : X86TestCase("FuncCallRecursive") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallRecursive());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ x86::Gp val = cc.new_gp32("val");
+ Label skip = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int>());
+ func_node->set_arg(0, val);
+
+ cc.cmp(val, 1);
+ cc.jle(skip);
+
+ x86::Gp tmp = cc.new_gp32("tmp");
+ cc.mov(tmp, val);
+ cc.dec(tmp);
+
+ InvokeNode* invoke_node;
+
+ cc.invoke(Out(invoke_node), func_node->label(), FuncSignature::build<int, int>());
+ invoke_node->set_arg(0, tmp);
+ invoke_node->set_ret(0, tmp);
+ cc.mul(cc.new_gp32(), val, tmp);
+
+ cc.bind(skip);
+ cc.ret(val);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(5);
+ int expect_ret = 1 * 2 * 3 * 4 * 5;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallVarArg1
+// =======================================
+
+class X86Test_FuncCallVarArg1 : public X86TestCase {
+public:
+ X86Test_FuncCallVarArg1() : X86TestCase("FuncCallVarArg1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallVarArg1());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int, int>());
+
+ x86::Gp a0 = cc.new_gp32("a0");
+ x86::Gp a1 = cc.new_gp32("a1");
+ x86::Gp a2 = cc.new_gp32("a2");
+ x86::Gp a3 = cc.new_gp32("a3");
+
+ func_node->set_arg(0, a0);
+ func_node->set_arg(1, a1);
+ func_node->set_arg(2, a2);
+ func_node->set_arg(3, a3);
+
+ // We call `int func(size_t, ...)`
+ // - The `va_index` must be 1 (first argument after size_t).
+ // - The full signature of varargs (int, int, int, int) must follow.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<int, size_t, int, int, int, int>(CallConvId::kCDecl, 1));
+ invoke_node->set_arg(0, imm(4));
+ invoke_node->set_arg(1, a0);
+ invoke_node->set_arg(2, a1);
+ invoke_node->set_arg(3, a2);
+ invoke_node->set_arg(4, a3);
+ invoke_node->set_ret(0, a0);
+
+ cc.ret(a0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(1, 2, 3, 4);
+ int expect_ret = 1 + 2 + 3 + 4;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+
+ static int called_fn(size_t n, ...) {
+ int sum = 0;
+ va_list ap;
+ va_start(ap, n);
+ for (size_t i = 0; i < n; i++) {
+ int arg = va_arg(ap, int);
+ sum += arg;
+ }
+ va_end(ap);
+ return sum;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallVarArg2
+// =======================================
+
+class X86Test_FuncCallVarArg2 : public X86TestCase {
+public:
+ X86Test_FuncCallVarArg2() : X86TestCase("FuncCallVarArg2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallVarArg2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, double, double, double, double>());
+
+ x86::Vec a0 = cc.new_xmm_sd("a0");
+ x86::Vec a1 = cc.new_xmm_sd("a1");
+ x86::Vec a2 = cc.new_xmm_sd("a2");
+ x86::Vec a3 = cc.new_xmm_sd("a3");
+
+ func_node->set_arg(0, a0);
+ func_node->set_arg(1, a1);
+ func_node->set_arg(2, a2);
+ func_node->set_arg(3, a3);
+
+ // We call `double func(size_t, ...)`
+ // - The `va_index` must be 1 (first argument after size_t).
+ // - The full signature of varargs (double, double, double, double) must follow.
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)called_fn),
+ FuncSignature::build<double, size_t, double, double, double, double>(CallConvId::kCDecl, 1));
+ invoke_node->set_arg(0, imm(4));
+ invoke_node->set_arg(1, a0);
+ invoke_node->set_arg(2, a1);
+ invoke_node->set_arg(3, a2);
+ invoke_node->set_arg(4, a3);
+ invoke_node->set_ret(0, a0);
+
+ cc.ret(a0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(double, double, double, double);
+ Func func = ptr_as_func<Func>(_func);
+
+ double result_ret = func(1.0, 2.0, 3.0, 4.0);
+ double expect_ret = 1.0 + 2.0 + 3.0 + 4.0;
+
+ result.assign_format("ret=%f", result_ret);
+ expect.assign_format("ret=%f", expect_ret);
+
+ return result == expect;
+ }
+
+ static double called_fn(size_t n, ...) {
+ double sum = 0;
+ va_list ap;
+ va_start(ap, n);
+ for (size_t i = 0; i < n; i++) {
+ double arg = va_arg(ap, double);
+ sum += arg;
+ }
+ va_end(ap);
+ return sum;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallInt64Arg
+// ========================================
+
+class X86Test_FuncCallInt64Arg : public X86TestCase {
+public:
+ X86Test_FuncCallInt64Arg() : X86TestCase("FuncCallInt64Arg") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallInt64Arg());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<uint64_t, uint64_t>());
+
+ if (cc.is_64bit()) {
+ x86::Gp reg = cc.new_gp64();
+ func_node->set_arg(0, reg);
+ cc.add(reg, 1);
+ cc.ret(reg);
+ }
+ else {
+ x86::Gp hi = cc.new_gp32("hi");
+ x86::Gp lo = cc.new_gp32("lo");
+
+ func_node->set_arg(0, 0, lo);
+ func_node->set_arg(0, 1, hi);
+
+ cc.add(lo, 1);
+ cc.adc(hi, 0);
+ cc.ret(lo, hi);
+ }
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint64_t (*)(uint64_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint64_t result_ret = func(uint64_t(0xFFFFFFFF));
+ uint64_t expect_ret = 0x100000000;
+
+ result.assign_format("ret=%llu", (unsigned long long)result_ret);
+ expect.assign_format("ret=%llu", (unsigned long long)expect_ret);
+
+ return result == expect;
+ }
+
+ static double called_fn(size_t n, ...) {
+ double sum = 0;
+ va_list ap;
+ va_start(ap, n);
+ for (size_t i = 0; i < n; i++) {
+ double arg = va_arg(ap, double);
+ sum += arg;
+ }
+ va_end(ap);
+ return sum;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallMisc1
+// =====================================
+
+class X86Test_FuncCallMisc1 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc1() : X86TestCase("FuncCallMisc1") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc1());
+ }
+
+ static void dummy(int, int) {}
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int>());
+
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+ x86::Gp r = cc.new_gp32("r");
+
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)dummy),
+ FuncSignature::build<void, int, int>());
+ invoke_node->set_arg(0, a);
+ invoke_node->set_arg(1, b);
+
+ cc.lea(r, x86::ptr(a, b));
+ cc.ret(r);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(44, 199);
+ int expect_ret = 243;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_FuncCallMisc2
+// =====================================
+
+class X86Test_FuncCallMisc2 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc2() : X86TestCase("FuncCallMisc2") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc2());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, const double*>());
+
+ x86::Gp p = cc.new_gp_ptr("p");
+ x86::Vec arg = cc.new_xmm_sd("arg");
+ x86::Vec ret = cc.new_xmm_sd("ret");
+
+ func_node->set_arg(0, p);
+ cc.movsd(arg, x86::ptr(p));
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)op),
+ FuncSignature::build<double, double>());
+ invoke_node->set_arg(0, arg);
+ invoke_node->set_ret(0, ret);
+
+ cc.ret(ret);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(const double*);
+ Func func = ptr_as_func<Func>(_func);
+
+ double arg = 2;
+
+ double result_ret = func(&arg);
+ double expect_ret = op(arg);
+
+ result.assign_format("ret=%g", result_ret);
+ expect.assign_format("ret=%g", expect_ret);
+
+ return result == expect;
+ }
+
+ static double op(double a) { return a * a; }
+};
+
+// x86::Compiler - X86Test_FuncCallMisc3
+// =====================================
+
+class X86Test_FuncCallMisc3 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc3() : X86TestCase("FuncCallMisc3") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc3());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<double, const double*>());
+
+ x86::Gp p = cc.new_gp_ptr("p");
+ x86::Vec arg = cc.new_xmm_sd("arg");
+ x86::Vec ret = cc.new_xmm_sd("ret");
+
+ func_node->set_arg(0, p);
+ cc.movsd(arg, x86::ptr(p));
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ imm((void*)op),
+ FuncSignature::build<double, double>());
+ invoke_node->set_arg(0, arg);
+ invoke_node->set_ret(0, ret);
+
+ cc.xorps(arg, arg);
+ cc.subsd(arg, ret);
+
+ cc.ret(arg);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(const double*);
+ Func func = ptr_as_func<Func>(_func);
+
+ double arg = 2;
+
+ double result_ret = func(&arg);
+ double expect_ret = -op(arg);
+
+ result.assign_format("ret=%g", result_ret);
+ expect.assign_format("ret=%g", expect_ret);
+
+ return result == expect;
+ }
+
+ static double op(double a) { return a * a; }
+};
+
+// x86::Compiler - X86Test_FuncCallMisc4
+// =====================================
+
+class X86Test_FuncCallMisc4 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc4() : X86TestCase("FuncCallMisc4") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc4());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ InvokeNode* invoke_node;
+
+ FuncSignature func_signature;
+ func_signature.set_call_conv_id(CallConvId::kCDecl);
+ func_signature.set_ret(TypeId::kFloat64);
+ cc.add_func(func_signature);
+
+ FuncSignature invoke_signature;
+ invoke_signature.set_call_conv_id(CallConvId::kCDecl);
+ invoke_signature.set_ret(TypeId::kFloat64);
+
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), invoke_signature);
+ x86::Vec ret = cc.new_xmm_sd("ret");
+ invoke_node->set_ret(0, ret);
+ cc.ret(ret);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = double (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ double result_ret = func();
+ double expect_ret = 3.14;
+
+ result.assign_format("ret=%g", result_ret);
+ expect.assign_format("ret=%g", expect_ret);
+
+ return result == expect;
+ }
+
+ static double called_fn() { return 3.14; }
+};
+
+// x86::Compiler - X86Test_FuncCallMisc5
+// =====================================
+
+// The register allocator should clobber the register used by the `call` itself.
+class X86Test_FuncCallMisc5 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc5() : X86TestCase("FuncCallMisc5") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc5());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ x86::Gp p_fn = cc.new_gp_ptr("p_fn");
+ x86::Gp vars[16];
+
+ uint32_t i, reg_count = cc.arch() == Arch::kX86 ? 8 : 16;
+ ASMJIT_ASSERT(reg_count <= ASMJIT_ARRAY_SIZE(vars));
+
+ cc.mov(p_fn, imm((void*)called_fn));
+
+ for (i = 0; i < reg_count; i++) {
+ if (i == x86::Gp::kIdBp || i == x86::Gp::kIdSp)
+ continue;
+
+ vars[i] = cc.new_gp32("%%%u", unsigned(i));
+ cc.mov(vars[i], 1);
+ }
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), p_fn, FuncSignature::build<void>());
+
+ for (i = 1; i < reg_count; i++)
+ if (vars[i].is_valid())
+ cc.add(vars[0], vars[i]);
+ cc.ret(vars[0]);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = sizeof(void*) == 4 ? 6 : 14;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+
+ static void called_fn() {}
+};
+
+// x86::Compiler - X86Test_FuncCallMisc6
+// =====================================
+
+class X86Test_FuncCallMisc6 : public X86TestCase {
+public:
+ X86Test_FuncCallMisc6() : X86TestCase("FuncCallMisc6") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_FuncCallMisc6());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<uint32_t, uint32_t>());
+
+ constexpr uint32_t kCount = 16;
+
+ x86::Gp v[kCount];
+ x86::Gp arg_val = cc.new_gp32("arg_val");
+ x86::Gp ret_val = cc.new_gp32("ret_val");
+
+ func_node->set_arg(0, arg_val);
+ cc.add(arg_val, 1);
+
+ for (uint32_t i = 0; i < kCount; i++) {
+ v[i] = cc.new_gp32("v%u", i);
+ }
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), imm((void*)called_fn), FuncSignature::build<uint32_t, uint32_t>());
+ invoke_node->set_arg(0, arg_val);
+ invoke_node->set_ret(0, ret_val);
+
+ for (uint32_t i = 0; i < kCount; i++) {
+ cc.mov(v[i], i + 1);
+ }
+
+ for (uint32_t i = 0; i < kCount; i++) {
+ cc.add(arg_val, v[i]);
+ }
+
+ cc.add(ret_val, arg_val);
+ cc.ret(ret_val);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(uint32_t x);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t result_ret = func(111);
+ uint32_t expect_ret = 111 + 112 + 2 + (1 + 16) * 8;
+
+ result.assign_format("ret=%u", result_ret);
+ expect.assign_format("ret=%u", expect_ret);
+
+ return result == expect;
+ }
+
+ static uint32_t called_fn(uint32_t x) { return x + 1; }
+};
+
+// x86::Compiler - X86Test_FuncCallAVXClobber
+// ==========================================
+
+class X86Test_FuncCallAVXClobber : public X86TestCase {
+public:
+ X86Test_FuncCallAVXClobber() : X86TestCase("FuncCallAVXClobber") {}
+
+ static void add(TestApp& app) {
+ const CpuInfo& cpu_info = CpuInfo::host();
+
+ if (cpu_info.features().x86().has_avx2() && sizeof(void*) == 8) {
+ app.add(new X86Test_FuncCallAVXClobber());
+ }
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* main_func = cc.add_func(FuncSignature::build<void, void*, const void*, const void*>());
+ main_func->frame().set_avx_enabled();
+ main_func->frame().set_avx_cleanup();
+
+ // We need a Windows calling convention to test this properly also on a non-Windows machine.
+ FuncNode* helper_func = cc.new_func(FuncSignature::build<void, void*, const void*>(CallConvId::kX64Windows));
+ helper_func->frame().set_avx_enabled();
+ helper_func->frame().set_avx_cleanup();
+
+ {
+ size_t i;
+
+ x86::Gp d_ptr = cc.new_gp_ptr("d_ptr");
+ x86::Gp a_ptr = cc.new_gp_ptr("a_ptr");
+ x86::Gp b_ptr = cc.new_gp_ptr("b_ptr");
+ x86::Gp t_ptr = cc.new_gp_ptr("t_ptr");
+ x86::Vec acc[8];
+ x86::Mem stack = cc.new_stack(32, 1, "stack");
+
+ main_func->set_arg(0, d_ptr);
+ main_func->set_arg(1, a_ptr);
+ main_func->set_arg(2, b_ptr);
+
+ cc.lea(t_ptr, stack);
+ for (i = 0; i < 8; i++) {
+ acc[i] = cc.new_ymm("acc%zu", i);
+ cc.vmovdqu(acc[i], x86::ptr(a_ptr));
+ }
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node),
+ helper_func->label(),
+ FuncSignature::build<void, void*, const void*>(CallConvId::kX64Windows));
+ invoke_node->set_arg(0, t_ptr);
+ invoke_node->set_arg(1, b_ptr);
+
+ for (i = 1; i < 8; i++) {
+ cc.vpaddd(acc[0], acc[0], acc[i]);
+ }
+
+ cc.vpaddd(acc[0], acc[0], x86::ptr(t_ptr));
+ cc.vmovdqu(x86::ptr(d_ptr), acc[0]);
+
+ cc.end_func();
+ }
+
+ {
+ cc.add_func(helper_func);
+
+ x86::Gp d_ptr = cc.new_gp_ptr("d_ptr");
+ x86::Gp a_ptr = cc.new_gp_ptr("a_ptr");
+
+ helper_func->set_arg(0, d_ptr);
+ helper_func->set_arg(1, a_ptr);
+
+ x86::Gp tmp = cc.new_gp_ptr("tmp");
+ x86::Vec acc = cc.new_ymm("acc");
+
+ cc.mov(tmp, 1);
+ cc.vmovd(acc.xmm(), tmp);
+ cc.vpbroadcastd(acc, acc.xmm());
+ cc.vpaddd(acc, acc, x86::ptr(a_ptr));
+ cc.vmovdqu(x86::ptr(d_ptr), acc);
+
+ cc.end_func();
+ }
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = void (*)(void*, const void*, const void*);
+ Func func = ptr_as_func<Func>(_func);
+
+ size_t i;
+
+ static const uint32_t a_data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+ static const uint32_t b_data[8] = { 6, 3, 5, 9, 1, 8, 7, 2 };
+
+ uint32_t result_data[8] {};
+ uint32_t expect_data[8] {};
+
+ for (i = 0; i < 8; i++)
+ expect_data[i] = a_data[i] * 8 + b_data[i] + 1;
+
+ func(result_data, a_data, b_data);
+
+ result.assign("{");
+ expect.assign("{");
+
+ for (i = 0; i < 8; i++) {
+ result.append_format("%u", result_data[i]);
+ expect.append_format("%u", expect_data[i]);
+
+ if (i != 7) result.append(", ");
+ if (i != 7) expect.append(", ");
+ }
+
+ result.append("}");
+ expect.append("}");
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_VecToScalar
+// ===================================
+
+class X86Test_VecToScalar : public X86TestCase {
+public:
+ static inline constexpr uint32_t kVecCount = 64;
+
+ X86Test_VecToScalar() : X86TestCase("VecToScalar") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_VecToScalar());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func = cc.add_func(FuncSignature::build<uint32_t, uint32_t>());
+
+ x86::Gp x = cc.new_gp32("x");
+ x86::Gp t = cc.new_gp32("t");
+ x86::Vec v[kVecCount];
+
+ func->set_arg(0, x);
+
+ for (size_t i = 0; i < kVecCount; i++) {
+ v[i] = cc.new_xmm("v%d", i);
+ if (i != 0)
+ cc.add(x, 1);
+ cc.movd(v[i], x);
+ }
+
+ cc.xor_(x, x);
+
+ for (size_t i = 0; i < kVecCount; i++) {
+ cc.movd(t, v[i]);
+ cc.add(x, t);
+ }
+
+ cc.ret(x);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = uint32_t (*)(uint32_t);
+ Func func = ptr_as_func<Func>(_func);
+
+ uint32_t result_ret = func(1);
+ uint32_t expect_ret = 2080; // 1 + 2 + 3 + ... + 64
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_MiscLocalConstPool
+// ==========================================
+
+class X86Test_MiscLocalConstPool : public X86TestCase {
+public:
+ X86Test_MiscLocalConstPool() : X86TestCase("MiscLocalConstPool") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_MiscLocalConstPool());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+
+ x86::Mem c0 = cc.new_int32_const(ConstPoolScope::kLocal, 200);
+ x86::Mem c1 = cc.new_int32_const(ConstPoolScope::kLocal, 33);
+
+ cc.mov(v0, c0);
+ cc.mov(v1, c1);
+ cc.add(v0, v1);
+
+ cc.ret(v0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 233;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_MiscGlobalConstPool
+// ===========================================
+
+class X86Test_MiscGlobalConstPool : public X86TestCase {
+public:
+ X86Test_MiscGlobalConstPool() : X86TestCase("MiscGlobalConstPool") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_MiscGlobalConstPool());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ cc.add_func(FuncSignature::build<int>());
+
+ x86::Gp v0 = cc.new_gp32("v0");
+ x86::Gp v1 = cc.new_gp32("v1");
+
+ x86::Mem c0 = cc.new_int32_const(ConstPoolScope::kGlobal, 200);
+ x86::Mem c1 = cc.new_int32_const(ConstPoolScope::kGlobal, 33);
+
+ cc.mov(v0, c0);
+ cc.mov(v1, c1);
+ cc.add(v0, v1);
+
+ cc.ret(v0);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(void);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func();
+ int expect_ret = 233;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_MiscMultiRet
+// ====================================
+
+struct X86Test_MiscMultiRet : public X86TestCase {
+ X86Test_MiscMultiRet() : X86TestCase("MiscMultiRet") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_MiscMultiRet());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, int, int>());
+
+ x86::Gp op = cc.new_gp32("op");
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+
+ Label L_Zero = cc.new_label();
+ Label L_Add = cc.new_label();
+ Label L_Sub = cc.new_label();
+ Label L_Mul = cc.new_label();
+ Label L_Div = cc.new_label();
+
+ func_node->set_arg(0, op);
+ func_node->set_arg(1, a);
+ func_node->set_arg(2, b);
+
+ cc.cmp(op, 0);
+ cc.jz(L_Add);
+
+ cc.cmp(op, 1);
+ cc.jz(L_Sub);
+
+ cc.cmp(op, 2);
+ cc.jz(L_Mul);
+
+ cc.cmp(op, 3);
+ cc.jz(L_Div);
+
+ cc.bind(L_Zero);
+ cc.xor_(a, a);
+ cc.ret(a);
+
+ cc.bind(L_Add);
+ cc.add(a, b);
+ cc.ret(a);
+
+ cc.bind(L_Sub);
+ cc.sub(a, b);
+ cc.ret(a);
+
+ cc.bind(L_Mul);
+ cc.imul(a, b);
+ cc.ret(a);
+
+ cc.bind(L_Div);
+ cc.cmp(b, 0);
+ cc.jz(L_Zero);
+
+ x86::Gp zero = cc.new_gp32("zero");
+ cc.xor_(zero, zero);
+ cc.idiv(zero, a, b);
+ cc.ret(a);
+
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int, int);
+
+ Func func = ptr_as_func<Func>(_func);
+
+ int a = 44;
+ int b = 3;
+
+ int r0 = func(0, a, b);
+ int r1 = func(1, a, b);
+ int r2 = func(2, a, b);
+ int r3 = func(3, a, b);
+ int e0 = a + b;
+ int e1 = a - b;
+ int e2 = a * b;
+ int e3 = a / b;
+
+ result.assign_format("ret={%d %d %d %d}", r0, r1, r2, r3);
+ expect.assign_format("ret={%d %d %d %d}", e0, e1, e2, e3);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_MiscMultiFunc
+// =====================================
+
+class X86Test_MiscMultiFunc : public X86TestCase {
+public:
+ X86Test_MiscMultiFunc() : X86TestCase("MiscMultiFunc") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_MiscMultiFunc());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ FuncNode* f1_node = cc.new_func(FuncSignature::build<int, int, int>());
+ FuncNode* f2_node = cc.new_func(FuncSignature::build<int, int, int>());
+
+ {
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+
+ cc.add_func(f1_node);
+ f1_node->set_arg(0, a);
+ f1_node->set_arg(1, b);
+
+ InvokeNode* invoke_node;
+ cc.invoke(Out(invoke_node), f2_node->label(), FuncSignature::build<int, int, int>());
+ invoke_node->set_arg(0, a);
+ invoke_node->set_arg(1, b);
+ invoke_node->set_ret(0, a);
+
+ cc.ret(a);
+ cc.end_func();
+ }
+
+ {
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp32("b");
+
+ cc.add_func(f2_node);
+ f2_node->set_arg(0, a);
+ f2_node->set_arg(1, b);
+
+ cc.add(a, b);
+ cc.ret(a);
+ cc.end_func();
+ }
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (*)(int, int);
+
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = func(56, 22);
+ int expect_ret = 56 + 22;
+
+ result.assign_format("ret=%d", result_ret);
+ expect.assign_format("ret=%d", expect_ret);
+
+ return result == expect;
+ }
+};
+
+// x86::Compiler - X86Test_MiscUnfollow
+// ====================================
+
+// Global (I didn't find a better way to test this).
+static jmp_buf global_jmp_buf;
+
+class X86Test_MiscUnfollow : public X86TestCase {
+public:
+ X86Test_MiscUnfollow() : X86TestCase("MiscUnfollow") {}
+
+ static void add(TestApp& app) {
+ app.add(new X86Test_MiscUnfollow());
+ }
+
+ void compile(x86::Compiler& cc) override {
+ // NOTE: Fastcall calling convention is the most appropriate here as all arguments are passed via registers and
+ // there won't be any stack misalignment in the `handler()`. This was failing on MacOS when targeting 32-bit mode.
+ x86::Gp a = cc.new_gp32("a");
+ x86::Gp b = cc.new_gp_ptr("b");
+ Label tramp = cc.new_label();
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<int, int, void*>(CallConvId::kFastCall));
+ func_node->set_arg(0, a);
+ func_node->set_arg(1, b);
+
+ cc.cmp(a, 0);
+ cc.jz(tramp);
+ cc.ret(a);
+ cc.bind(tramp);
+ cc.unfollow().jmp(b);
+ cc.end_func();
+ }
+
+ bool run(void* _func, String& result, String& expect) override {
+ using Func = int (ASMJIT_FASTCALL*)(int, void*);
+ Func func = ptr_as_func<Func>(_func);
+
+ int result_ret = 0;
+ int expect_ret = 1;
+
+ if (!setjmp(global_jmp_buf))
+ result_ret = func(0, (void*)handler);
+ else
+ result_ret = 1;
+
+ result.assign_format("ret={%d}", result_ret);
+ expect.assign_format("ret={%d}", expect_ret);
+
+ return result == expect;
+ }
+
+ static void ASMJIT_FASTCALL handler() { longjmp(global_jmp_buf, 1); }
+};
+
+// x86::Compiler - Tests
+// =====================
+
+void compiler_add_x86_tests(TestApp& app) {
+ // Base tests.
+ app.add_t<X86Test_NoCode>();
+ app.add_t<X86Test_NoAlign>();
+ app.add_t<X86Test_IndirectBranchProtection>();
+ app.add_t<X86Test_AlignBase>();
+
+ // Jump tests.
+ app.add_t<X86Test_JumpMerge>();
+ app.add_t<X86Test_JumpCross>();
+ app.add_t<X86Test_JumpMany>();
+ app.add_t<X86Test_JumpUnreachable1>();
+ app.add_t<X86Test_JumpUnreachable2>();
+ app.add_t<X86Test_JumpTable1>();
+ app.add_t<X86Test_JumpTable2>();
+ app.add_t<X86Test_JumpTable3>();
+ app.add_t<X86Test_JumpTable4>();
+
+ // Alloc and instruction tests.
+ app.add_t<X86Test_AllocBase>();
+ app.add_t<X86Test_AllocMany1>();
+ app.add_t<X86Test_AllocMany2>();
+ app.add_t<X86Test_AllocInt8>();
+ app.add_t<X86Test_AllocUnhandledArg>();
+ app.add_t<X86Test_AllocArgsIntPtr>();
+ app.add_t<X86Test_AllocArgsFloat>();
+ app.add_t<X86Test_AllocArgsDouble>();
+#if ASMJIT_ARCH_X86
+ app.add_t<X86Test_AllocArgsVec>();
+#endif
+ app.add_t<X86Test_AllocRetFloat1>();
+ app.add_t<X86Test_AllocRetFloat2>();
+ app.add_t<X86Test_AllocRetDouble1>();
+ app.add_t<X86Test_AllocRetDouble2>();
+ app.add_t<X86Test_AllocStack>();
+ app.add_t<X86Test_Imul1>();
+ app.add_t<X86Test_Imul2>();
+ app.add_t<X86Test_Idiv1>();
+ app.add_t<X86Test_Setz>();
+ app.add_t<X86Test_ShlRor>();
+ app.add_t<X86Test_GpbLo1>();
+ app.add_t<X86Test_GpbLo2>();
+ app.add_t<X86Test_RepMovsb>();
+ app.add_t<X86Test_IfElse1>();
+ app.add_t<X86Test_IfElse2>();
+ app.add_t<X86Test_IfElse3>();
+ app.add_t<X86Test_IfElse4>();
+ app.add_t<X86Test_Memcpy>();
+ app.add_t<X86Test_ExtraBlock>();
+ app.add_t<X86Test_AlphaBlend>();
+ app.add_t<X86Test_AVX512_KK>();
+ app.add_t<X86Test_AVX512_TernLog>();
+
+ // Function arguments handling tests.
+ app.add_t<X86Test_FuncArgInt8>();
+
+ // Function call tests.
+ app.add_t<X86Test_FuncCallBase1>();
+ app.add_t<X86Test_FuncCallBase2>();
+ app.add_t<X86Test_FuncCallStd>();
+ app.add_t<X86Test_FuncCallFast>();
+#if ASMJIT_ARCH_X86
+ app.add_t<X86Test_FuncCallSIMD>();
+#endif
+ app.add_t<X86Test_FuncCallLight>();
+ app.add_t<X86Test_FuncCallManyArgs>();
+ app.add_t<X86Test_FuncCallDuplicateArgs>();
+ app.add_t<X86Test_FuncCallImmArgs>();
+ app.add_t<X86Test_FuncCallPtrArgs>();
+ app.add_t<X86Test_FuncCallRefArgs>();
+ app.add_t<X86Test_FuncCallFloatAsXmmRet>();
+ app.add_t<X86Test_FuncCallDoubleAsXmmRet>();
+ app.add_t<X86Test_FuncCallConditional>();
+ app.add_t<X86Test_FuncCallMultiple>();
+ app.add_t<X86Test_FuncCallRecursive>();
+ app.add_t<X86Test_FuncCallVarArg1>();
+ app.add_t<X86Test_FuncCallVarArg2>();
+ app.add_t<X86Test_FuncCallInt64Arg>();
+ app.add_t<X86Test_FuncCallMisc1>();
+ app.add_t<X86Test_FuncCallMisc2>();
+ app.add_t<X86Test_FuncCallMisc3>();
+ app.add_t<X86Test_FuncCallMisc4>();
+ app.add_t<X86Test_FuncCallMisc5>();
+ app.add_t<X86Test_FuncCallMisc6>();
+ app.add_t<X86Test_FuncCallAVXClobber>();
+
+ // Miscellaneous tests.
+ app.add_t<X86Test_VecToScalar>();
+ app.add_t<X86Test_MiscLocalConstPool>();
+ app.add_t<X86Test_MiscGlobalConstPool>();
+ app.add_t<X86Test_MiscMultiRet>();
+ app.add_t<X86Test_MiscMultiFunc>();
+ app.add_t<X86Test_MiscUnfollow>();
+}
+
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_emitters.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_emitters.cpp
new file mode 100644
index 00000000000..0386652e4aa
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_emitters.cpp
@@ -0,0 +1,328 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <asmjit/core.h>
+
+#if ASMJIT_ARCH_X86 != 0
+ #include <asmjit/x86.h>
+#endif
+
+#if ASMJIT_ARCH_ARM == 64
+ #include <asmjit/a64.h>
+#endif
+
+#include <asmjit-testing/commons/asmjitutils.h>
+
+using namespace asmjit;
+
+static void print_app_info() noexcept {
+ printf("AsmJit Emitters Test-Suite v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+}
+
+#if !defined(ASMJIT_NO_JIT) && ((ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86 )) || \
+ (ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)) )
+
+// Signature of the generated function.
+using SumIntsFunc = void (*)(int* dst, const int* a, const int* b);
+
+// X86 Backend
+// -----------
+
+#if ASMJIT_ARCH_X86 != 0
+// This function works with both x86::Assembler and x86::Builder. It shows how
+// `x86::Emitter` can be used to make your code more generic.
+static void generate_func_with_emitter(x86::Emitter* emitter) noexcept {
+ // Decide which registers will be mapped to function arguments. Try changing
+ // registers of `dst`, `src_a`, and `src_b` and see what happens in function's
+ // prolog and epilog.
+ x86::Gp dst = emitter->zax();
+ x86::Gp src_a = emitter->zcx();
+ x86::Gp src_b = emitter->zdx();
+
+ // Decide which vector registers to use. We use these to keep the code generic,
+ // you can switch to any other registers when needed.
+ x86::Vec vec0 = x86::xmm0;
+ x86::Vec vec1 = x86::xmm1;
+
+ // Create and initialize `FuncDetail` and `FuncFrame`.
+ FuncDetail func;
+ func.init(FuncSignature::build<void, int*, const int*, const int*>(), emitter->environment());
+
+ FuncFrame frame;
+ frame.init(func);
+
+ // Make or registers dirty.
+ frame.add_dirty_regs(vec0, vec1);
+
+ FuncArgsAssignment args(&func); // Create arguments assignment context.
+ args.assign_all(dst, src_a, src_b); // Assign our registers to arguments.
+ args.update_func_frame(frame); // Reflect our args in FuncFrame.
+ frame.finalize();
+
+ // Emit prolog and allocate arguments to registers.
+ emitter->emit_prolog(frame);
+ emitter->emit_args_assignment(frame, args);
+
+ emitter->movdqu(vec0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
+ emitter->movdqu(vec1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
+
+ emitter->paddd(vec0, vec1); // Add 4 ints in XMM1 to XMM0.
+ emitter->movdqu(x86::ptr(dst), vec0); // Store the result to [dst].
+
+ // Emit epilog and return.
+ emitter->emit_epilog(frame);
+}
+
+#ifndef ASMJIT_NO_COMPILER
+// This function works with x86::Compiler, provided for comparison.
+static void generate_func_with_compiler(x86::Compiler* cc) noexcept {
+ x86::Gp dst = cc->new_gp_ptr("dst");
+ x86::Gp src_a = cc->new_gp_ptr("src_a");
+ x86::Gp src_b = cc->new_gp_ptr("src_b");
+ x86::Vec vec0 = cc->new_xmm("vec0");
+ x86::Vec vec1 = cc->new_xmm("vec1");
+
+ FuncNode* func_node = cc->add_func(FuncSignature::build<void, int*, const int*, const int*>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src_a);
+ func_node->set_arg(2, src_b);
+
+ cc->movdqu(vec0, x86::ptr(src_a));
+ cc->movdqu(vec1, x86::ptr(src_b));
+ cc->paddd(vec0, vec1);
+ cc->movdqu(x86::ptr(dst), vec0);
+ cc->end_func();
+}
+#endif
+
+static Error generate_func(CodeHolder& code, EmitterType emitter_type) noexcept {
+ switch (emitter_type) {
+ case EmitterType::kAssembler: {
+ printf("Using x86::Assembler:\n");
+ x86::Assembler a(&code);
+ generate_func_with_emitter(a.as<x86::Emitter>());
+ return Error::kOk;
+ }
+
+#ifndef ASMJIT_NO_BUILDER
+ case EmitterType::kBuilder: {
+ printf("Using x86::Builder:\n");
+ x86::Builder cb(&code);
+ generate_func_with_emitter(cb.as<x86::Emitter>());
+
+ return cb.finalize();
+ }
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+ case EmitterType::kCompiler: {
+ printf("Using x86::Compiler:\n");
+ x86::Compiler cc(&code);
+ generate_func_with_compiler(&cc);
+
+ return cc.finalize();
+ }
+#endif
+
+ default: {
+ printf("** FAILURE: No emitter to use **\n");
+ exit(1);
+ }
+ }
+}
+#endif
+
+// AArch64 Backend
+// ---------------
+
+#if ASMJIT_ARCH_ARM == 64
+// This function works with both a64::Assembler and a64::Builder. It shows how
+// `a64::Emitter` can be used to make your code more generic.
+static void generate_func_with_emitter(a64::Emitter* emitter) noexcept {
+ // Decide which registers will be mapped to function arguments. Try changing
+ // registers of `dst`, `src_a`, and `src_b` and see what happens in function's
+ // prolog and epilog.
+ a64::Gp dst = a64::x0;
+ a64::Gp src_a = a64::x1;
+ a64::Gp src_b = a64::x2;
+
+ // Decide which vector registers to use. We use these to keep the code generic,
+ // you can switch to any other registers when needed.
+ a64::Vec vec0 = a64::v0;
+ a64::Vec vec1 = a64::v1;
+ a64::Vec vec2 = a64::v2;
+
+ // Create and initialize `FuncDetail` and `FuncFrame`.
+ FuncDetail func;
+ func.init(FuncSignature::build<void, int*, const int*, const int*>(), emitter->environment());
+
+ FuncFrame frame;
+ frame.init(func);
+
+ // Make XMM0 and XMM1 dirty. VEC group includes XMM|YMM|ZMM registers.
+ frame.add_dirty_regs(vec0, vec1, vec2);
+
+ FuncArgsAssignment args(&func); // Create arguments assignment context.
+ args.assign_all(dst, src_a, src_b); // Assign our registers to arguments.
+ args.update_func_frame(frame); // Reflect our args in FuncFrame.
+ frame.finalize();
+
+ // Emit prolog and allocate arguments to registers.
+ emitter->emit_prolog(frame);
+ emitter->emit_args_assignment(frame, args);
+
+ emitter->ld1(vec0.b16(), a64::ptr(src_a)); // Load 4 ints from [src_a] to vec0.
+ emitter->ld1(vec1.b16(), a64::ptr(src_b)); // Load 4 ints from [src_b] to vec1.
+ emitter->add(vec2.s4(), vec0.s4(), vec1.s4()); // Add 4 ints of vec0 and vec1 and store to vec2.
+ emitter->st1(vec2.b16(), a64::ptr(dst)); // Store the result (vec2) to [dst].
+
+ // Emit epilog and return.
+ emitter->emit_epilog(frame);
+}
+
+#ifndef ASMJIT_NO_COMPILER
+// This function works with x86::Compiler, provided for comparison.
+static void generate_func_with_compiler(a64::Compiler* cc) noexcept {
+ a64::Gp dst = cc->new_gp_ptr("dst");
+ a64::Gp src_a = cc->new_gp_ptr("src_a");
+ a64::Gp src_b = cc->new_gp_ptr("src_b");
+ a64::Vec vec0 = cc->new_vec_q("vec0");
+ a64::Vec vec1 = cc->new_vec_q("vec1");
+ a64::Vec vec2 = cc->new_vec_q("vec2");
+
+ FuncNode* func_node = cc->add_func(FuncSignature::build<void, int*, const int*, const int*>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src_a);
+ func_node->set_arg(2, src_b);
+
+ cc->ld1(vec0.b16(), a64::ptr(src_a)); // Load 4 ints from [src_a] to vec0.
+ cc->ld1(vec1.b16(), a64::ptr(src_b)); // Load 4 ints from [src_b] to vec1.
+ cc->add(vec2.s4(), vec0.s4(), vec1.s4()); // Add 4 ints of vec0 and vec1 and store to vec2.
+ cc->st1(vec2.b16(), a64::ptr(dst)); // Store the result (vec2) to [dst].
+ cc->end_func();
+}
+#endif
+
+static Error generate_func(CodeHolder& code, EmitterType emitter_type) noexcept {
+ switch (emitter_type) {
+ case EmitterType::kAssembler: {
+ printf("Using a64::Assembler:\n");
+ a64::Assembler a(&code);
+ generate_func_with_emitter(a.as<a64::Emitter>());
+ return Error::kOk;
+ }
+
+#ifndef ASMJIT_NO_BUILDER
+ case EmitterType::kBuilder: {
+ printf("Using a64::Builder:\n");
+ a64::Builder cb(&code);
+ generate_func_with_emitter(cb.as<a64::Emitter>());
+
+ return cb.finalize();
+ }
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+ case EmitterType::kCompiler: {
+ printf("Using a64::Compiler:\n");
+ a64::Compiler cc(&code);
+ generate_func_with_compiler(&cc);
+
+ return cc.finalize();
+ }
+#endif
+
+ default: {
+ printf("** FAILURE: No emitter to use **\n");
+ exit(1);
+ }
+ }
+}
+#endif
+
+// Testing
+// -------
+
+static uint32_t test_func(JitRuntime& rt, EmitterType emitter_type) noexcept {
+#ifndef ASMJIT_NO_LOGGING
+ FileLogger logger(stdout);
+ logger.set_indentation(FormatIndentationGroup::kCode, 2);
+#endif
+
+ CodeHolder code;
+ code.init(rt.environment(), rt.cpu_features());
+
+#ifndef ASMJIT_NO_LOGGING
+ code.set_logger(&logger);
+#endif
+
+ Error err = generate_func(code, emitter_type);
+ if (err != Error::kOk) {
+ printf("** FAILURE: Failed to generate a function: %s **\n", DebugUtils::error_as_string(err));
+ return 1;
+ }
+
+ // Add the code generated to the runtime.
+ SumIntsFunc fn;
+ err = rt.add(&fn, &code);
+
+ if (err != Error::kOk) {
+ printf("** FAILURE: JitRuntime::add() failed: %s **\n", DebugUtils::error_as_string(err));
+ return 1;
+ }
+
+ // Execute the generated function.
+ static const int in_a[4] = { 4, 3, 2, 1 };
+ static const int in_b[4] = { 1, 5, 2, 8 };
+ int out[4] {};
+ fn(out, in_a, in_b);
+
+ // Should print {5 8 4 9}.
+ printf("Result = { %d %d %d %d }\n\n", out[0], out[1], out[2], out[3]);
+
+ rt.release(fn);
+ return out[0] == 5 && out[1] == 8 && out[2] == 4 && out[3] == 9;
+}
+
+int main() {
+ print_app_info();
+
+ JitRuntime rt;
+ unsigned failed_count = 0;
+
+ failed_count += !test_func(rt, EmitterType::kAssembler);
+
+#ifndef ASMJIT_NO_BUILDER
+ failed_count += !test_func(rt, EmitterType::kBuilder);
+#endif
+
+#ifndef ASMJIT_NO_COMPILER
+ failed_count += !test_func(rt, EmitterType::kCompiler);
+#endif
+
+ if (!failed_count)
+ printf("** SUCCESS **\n");
+ else
+ printf("** FAILURE - %u %s failed ** \n", failed_count, failed_count == 1 ? "test" : "tests");
+
+ return failed_count ? 1 : 0;
+}
+#else
+int main() {
+ print_app_info();
+ printf("!! This test is disabled: <ASMJIT_NO_JIT> or unsuitable target architecture !!\n");
+ return 0;
+}
+#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_environment.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_environment.cpp
new file mode 100644
index 00000000000..be39d51d503
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_environment.cpp
@@ -0,0 +1,302 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 != 0
+ #include <asmjit/x86.h>
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+ #include <asmjit/a64.h>
+#endif
+
+#include <asmjit-testing/commons/asmjitutils.h>
+
+using namespace asmjit;
+
+static void print_app_info() {
+ printf("AsmJit Environment Test v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+
+ printf("This application can be used to verify AsmJit build options and to verify the\n");
+ printf("environment where it runs. For example to check CPU extensions available, system\n");
+ printf("hardening (RWX restrictions), large page support, and virtual memory allocations.\n");
+ printf("\n");
+}
+
+const char* stringify_bool(bool b) noexcept { return b ? "true" : "false"; };
+const char* stringify_result(Error err) noexcept { return err == Error::kOk ? "success" : DebugUtils::error_as_string(err); };
+
+using VoidFunc = void (ASMJIT_CDECL*)(void);
+
+#if !defined(ASMJIT_NO_JIT)
+
+#if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 != 0
+#define TEST_ENVIRONMENT_HAS_JIT
+
+static void emit_void_function(CodeHolder& code) noexcept {
+ x86::Assembler a(&code);
+ a.ret();
+}
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+#define TEST_ENVIRONMENT_HAS_JIT
+
+static void emit_void_function(CodeHolder& code) noexcept {
+ a64::Assembler a(&code);
+ a.ret(a64::x30);
+}
+#endif
+
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+static void* offset_pointer(void* ptr, size_t offset) noexcept {
+ return static_cast<void*>(static_cast<uint8_t*>(ptr) + offset);
+}
+
+static size_t write_empty_function_at(void* ptr, size_t size) noexcept {
+ printf(" Write JIT code at addr : %p\n", ptr);
+
+ CodeHolder code;
+ Error err = code.init(Environment::host());
+ if (err != Error::kOk) {
+ printf( "Failed to initialize CodeHolder (%s)\n", DebugUtils::error_as_string(err));
+ return 0;
+ }
+
+ emit_void_function(code);
+ code.flatten();
+ code.copy_flattened_data(ptr, size);
+
+ return code.code_size();
+}
+
+static void flush_instruction_cache(void* ptr, size_t size) noexcept {
+ printf(" Flush JIT code at addr : %p [size=%zu]\n", ptr, size);
+ VirtMem::flush_instruction_cache(ptr, size);
+}
+
+static void invoke_void_function(void* ptr) noexcept {
+ printf(" Invoke JIT code at addr : %p\n", ptr);
+
+ // In case it crashes, we want to have the output flushed.
+ fflush(stdout);
+
+ VoidFunc func = reinterpret_cast<VoidFunc>(ptr);
+ func();
+}
+#endif
+
+static void print_virt_mem_info_and_test_execution() noexcept {
+ using MemoryFlags = VirtMem::MemoryFlags;
+ using HardenedRuntimeInfo = VirtMem::HardenedRuntimeInfo;
+ using HardenedRuntimeFlags = VirtMem::HardenedRuntimeFlags;
+
+ // Size of a virtual memory allocation.
+ constexpr size_t kVMemAllocSize = 65536;
+
+ // Offset to the first function to execute (must be greater than 8 for UBSAN to work).
+ [[maybe_unused]]
+ constexpr size_t kVirtFuncOffset = 64;
+
+ size_t large_page_size = VirtMem::large_page_size();
+ HardenedRuntimeInfo rti = VirtMem::hardened_runtime_info();
+
+ printf("Large/Huge Pages Info:\n");
+ printf(" Large pages supported : %s\n", stringify_bool(large_page_size != 0u));
+ if (large_page_size >= 1024 * 1024) {
+ printf(" Large page size : %zu MiB\n", large_page_size / (1024u * 1024u));
+ }
+ else if (large_page_size) {
+ printf(" Large page size : %zu KiB\n", large_page_size / 1024u);
+ }
+ printf("\n");
+
+ printf("Hardened Environment Info:\n");
+ printf(" Hardening was detected : %s\n", stringify_bool(rti.has_flag(HardenedRuntimeFlags::kEnabled )));
+ printf(" MAP_JIT is available : %s\n", stringify_bool(rti.has_flag(HardenedRuntimeFlags::kMapJit )));
+ printf(" DualMapping is available: %s\n", stringify_bool(rti.has_flag(HardenedRuntimeFlags::kDualMapping)));
+ printf("\n");
+
+ if (!rti.has_flag(HardenedRuntimeFlags::kEnabled)) {
+ printf("Virtual Memory Allocation (RWX):\n");
+
+ void* ptr = nullptr;
+ Error result = VirtMem::alloc(&ptr, kVMemAllocSize, MemoryFlags::kAccessRWX);
+ printf(" Alloc virt memory (RWX) : %s\n", stringify_result(result));
+
+ if (result == Error::kOk) {
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+ void* func_ptr = offset_pointer(ptr, kVirtFuncOffset);
+ size_t func_size = write_empty_function_at(func_ptr, kVMemAllocSize);
+
+ if (func_size) {
+ flush_instruction_cache(func_ptr, func_size);
+ invoke_void_function(func_ptr);
+ }
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+ result = VirtMem::release(ptr, kVMemAllocSize);
+ printf(" Release virt memory : %s\n", stringify_result(result));
+ }
+
+ printf("\n");
+ }
+
+ {
+ printf("Virtual Memory Allocation (RW - Flipping Permissions RW<->RX):\n");
+
+ void* ptr = nullptr;
+ Error result = VirtMem::alloc(&ptr, kVMemAllocSize, MemoryFlags::kAccessRW | MemoryFlags::kMMapMaxAccessRWX);
+ printf(" Alloc virt memory (RW) : %s (allocation uses kMMapMaxAccessRWX)\n", stringify_result(result));
+
+ if (result == Error::kOk) {
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+ void* func_ptr = offset_pointer(ptr, kVirtFuncOffset);
+ size_t func_size = write_empty_function_at(func_ptr, kVMemAllocSize);
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+ result = VirtMem::protect(ptr, kVMemAllocSize, MemoryFlags::kAccessRX);
+ printf(" Protect virt memory (RX): %s\n", stringify_result(result));
+
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+ if (func_size) {
+ flush_instruction_cache(func_ptr, func_size);
+ invoke_void_function(func_ptr);
+ }
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+ result = VirtMem::protect(ptr, kVMemAllocSize, MemoryFlags::kAccessRW);
+ printf(" Protect virt memory (RW): %s\n", stringify_result(result));
+
+ result = VirtMem::release(ptr, kVMemAllocSize);
+ printf(" Release virt memory (RW): %s\n", stringify_result(result));
+ }
+
+ printf("\n");
+ }
+
+ if (rti.has_flag(HardenedRuntimeFlags::kMapJit)) {
+ printf("Virtual Memory Allocation (MAP_JIT):\n");
+
+ void* ptr = nullptr;
+ Error result = VirtMem::alloc(&ptr, kVMemAllocSize, MemoryFlags::kAccessRWX | MemoryFlags::kMMapEnableMapJit);
+ printf(" Alloc virt mem (RWX) : %s (allocation uses kMMapEnableMapJit)\n", stringify_result(result));
+
+ if (result == Error::kOk) {
+ printf(" Protect JIT Memory (RW) : (per-thread protection)\n");
+ VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadWrite);
+
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+ void* func_ptr = offset_pointer(ptr, kVirtFuncOffset);
+ size_t func_size = write_empty_function_at(func_ptr, kVMemAllocSize);
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+ printf(" Protect JIT Memory (RX) : (per-thread protection)\n");
+ VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadExecute);
+
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+ if (func_size) {
+ flush_instruction_cache(func_ptr, func_size);
+ invoke_void_function(func_ptr);
+ }
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+ result = VirtMem::release(ptr, kVMemAllocSize);
+ printf(" Release virt memory : %s\n", stringify_result(result));
+ }
+
+ printf("\n");
+ }
+
+ if (rti.has_flag(HardenedRuntimeFlags::kDualMapping)) {
+ printf("Virtual Memory Allocation (Dual Mapping):\n");
+
+ VirtMem::DualMapping dm {};
+ Error result = VirtMem::alloc_dual_mapping(Out(dm), kVMemAllocSize, MemoryFlags::kAccessRWX);
+ printf(" Alloc dual mem (RW+RX) : %s\n", stringify_result(result));
+
+ if (result == Error::kOk) {
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+ size_t func_size = write_empty_function_at(offset_pointer(dm.rw, kVirtFuncOffset), kVMemAllocSize);
+ if (func_size) {
+ flush_instruction_cache(offset_pointer(dm.rx, kVirtFuncOffset), func_size);
+ invoke_void_function(offset_pointer(dm.rx, kVirtFuncOffset));
+ }
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+ result = VirtMem::release_dual_mapping(dm, kVMemAllocSize);
+ printf(" Release dual mem (RW+RX): %s\n", stringify_result(result));
+ }
+
+ printf("\n");
+ }
+}
+
+#if defined(TEST_ENVIRONMENT_HAS_JIT)
+static void print_jit_runtime_info_and_test_execution_with_params(const JitAllocator::CreateParams* params, const char* params_name) noexcept {
+ printf("JitRuntime (%s):\n", params_name);
+
+ JitRuntime rt(params);
+ CodeHolder code;
+
+ Error result = code.init(rt.environment());
+ printf(" CodeHolder init result : %s\n", stringify_result(result));
+
+ if (result != Error::kOk) {
+ return;
+ }
+
+ emit_void_function(code);
+ VoidFunc fn;
+
+ result = rt.add(&fn, &code);
+ printf(" Runtime.add() result : %s\n", stringify_result(result));
+
+ if (result == Error::kOk) {
+ invoke_void_function((void*)fn);
+
+ result = rt.release(fn);
+ printf(" Runtime.release() result: %s\n", stringify_result(result));
+ }
+
+ printf("\n");
+}
+
+static void print_jit_runtime_info_and_test_execution() noexcept {
+ print_jit_runtime_info_and_test_execution_with_params(nullptr, "<no params>");
+
+ if (VirtMem::large_page_size()) {
+ JitAllocator::CreateParams p{};
+ p.options = JitAllocatorOptions::kUseLargePages;
+
+ print_jit_runtime_info_and_test_execution_with_params(&p, "large pages");
+ }
+}
+#endif // TEST_ENVIRONMENT_HAS_JIT
+
+#endif // !ASMJIT_NO_JIT
+
+int main() {
+ print_app_info();
+ print_build_options();
+ print_cpu_info();
+
+#if !defined(ASMJIT_NO_JIT)
+ print_virt_mem_info_and_test_execution();
+#endif // !ASMJIT_NO_JIT
+
+#if !defined(ASMJIT_NO_JIT) && defined(TEST_ENVIRONMENT_HAS_JIT)
+ print_jit_runtime_info_and_test_execution();
+#endif // !ASMJIT_NO_JIT && TEST_ENVIRONMENT_HAS_JIT
+
+ return 0;
+}
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_instinfo.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_instinfo.cpp
new file mode 100644
index 00000000000..a7c2924166a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_instinfo.cpp
@@ -0,0 +1,206 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86.h>
+#endif
+
+#include <stdio.h>
+
+#include <asmjit-testing/commons/asmjitutils.h>
+
+using namespace asmjit;
+
+static void print_app_info() noexcept {
+ printf("AsmJit Instruction Info Test Suite v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+}
+
+namespace {
+
+#if !defined(ASMJIT_NO_X86)
+static char access_letter(bool r, bool w) noexcept {
+ return r && w ? 'X' : r ? 'R' : w ? 'W' : '_';
+}
+
+static void print_info(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count) {
+ StringTmp<512> sb;
+
+ // Read & Write Information
+ // ------------------------
+
+ InstRWInfo rw;
+ InstAPI::query_rw_info(arch, inst, operands, op_count, &rw);
+
+#ifndef ASMJIT_NO_LOGGING
+ Formatter::format_instruction(sb, FormatFlags::kNone, nullptr, arch, inst, Span(operands, op_count));
+#else
+ sb.append("<Logging-Not-Available>");
+#endif
+ sb.append("\n");
+
+ sb.append(" Operands:\n");
+ for (uint32_t i = 0; i < rw.op_count(); i++) {
+ const OpRWInfo& op = rw.operand(i);
+
+ sb.append_format(" [%u] Op=%c Read=%016llX Write=%016llX Extend=%016llX",
+ i,
+ access_letter(op.is_read(), op.is_write()),
+ op.read_byte_mask(),
+ op.write_byte_mask(),
+ op.extend_byte_mask());
+
+ if (op.is_mem_base_used()) {
+ sb.append_format(" Base=%c", access_letter(op.is_mem_base_read(), op.is_mem_base_write()));
+ if (op.is_mem_base_pre_modify())
+ sb.append_format(" <PRE>");
+ if (op.is_mem_base_post_modify())
+ sb.append_format(" <POST>");
+ }
+
+ if (op.is_mem_index_used()) {
+ sb.append_format(" Index=%c", access_letter(op.is_mem_index_read(), op.is_mem_index_write()));
+ }
+
+ sb.append("\n");
+ }
+
+ // CPU Flags (Read/Write)
+ // ----------------------
+
+ if ((rw.read_flags() | rw.write_flags()) != CpuRWFlags::kNone) {
+ sb.append(" Flags: \n");
+
+ struct FlagMap {
+ CpuRWFlags flag;
+ char name[4];
+ };
+
+ static const FlagMap flag_map_table[] = {
+ { CpuRWFlags::kX86_CF, "CF" },
+ { CpuRWFlags::kX86_OF, "OF" },
+ { CpuRWFlags::kX86_SF, "SF" },
+ { CpuRWFlags::kX86_ZF, "ZF" },
+ { CpuRWFlags::kX86_AF, "AF" },
+ { CpuRWFlags::kX86_PF, "PF" },
+ { CpuRWFlags::kX86_DF, "DF" },
+ { CpuRWFlags::kX86_IF, "IF" },
+ { CpuRWFlags::kX86_AC, "AC" },
+ { CpuRWFlags::kX86_C0, "C0" },
+ { CpuRWFlags::kX86_C1, "C1" },
+ { CpuRWFlags::kX86_C2, "C2" },
+ { CpuRWFlags::kX86_C3, "C3" }
+ };
+
+ sb.append(" ");
+ for (uint32_t f = 0; f < 13; f++) {
+ char c = access_letter((rw.read_flags() & flag_map_table[f].flag) != CpuRWFlags::kNone,
+ (rw.write_flags() & flag_map_table[f].flag) != CpuRWFlags::kNone);
+ if (c != '_')
+ sb.append_format("%s=%c ", flag_map_table[f].name, c);
+ }
+
+ sb.append("\n");
+ }
+
+ // CPU Features
+ // ------------
+
+ CpuFeatures features;
+ InstAPI::query_features(arch, inst, operands, op_count, &features);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (!features.is_empty()) {
+ sb.append(" Features:\n");
+ sb.append(" ");
+
+ bool first = true;
+ CpuFeatures::Iterator it(features.iterator());
+ while (it.has_next()) {
+ uint32_t feature_id = uint32_t(it.next());
+ if (!first)
+ sb.append(" & ");
+ Formatter::format_feature(sb, arch, feature_id);
+ first = false;
+ }
+ sb.append("\n");
+ }
+#endif
+
+ printf("%s\n", sb.data());
+}
+
+template<typename... Args>
+static void print_info_simple(Arch arch,InstId inst_id, InstOptions options, Args&&... args) {
+ BaseInst inst(inst_id);
+ inst.add_options(options);
+ Operand_ op_array[] = { std::forward<Args>(args)... };
+ print_info(arch, inst, op_array, sizeof...(args));
+}
+
+template<typename... Args>
+static void print_info_extra(Arch arch, InstId inst_id, InstOptions options, const Reg& extra_reg, Args&&... args) {
+ BaseInst inst(inst_id);
+ inst.add_options(options);
+ inst.set_extra_reg(extra_reg);
+ Operand_ op_array[] = { std::forward<Args>(args)... };
+ print_info(arch, inst, op_array, sizeof...(args));
+}
+#endif // !ASMJIT_NO_X86
+
+static void test_x86_arch() {
+#if !defined(ASMJIT_NO_X86)
+ using namespace x86;
+ Arch arch = Arch::kX64;
+
+ print_info_simple(arch, Inst::kIdAdd, InstOptions::kNone, eax, ebx);
+ print_info_simple(arch, Inst::kIdXor, InstOptions::kNone, eax, eax);
+ print_info_simple(arch, Inst::kIdLods, InstOptions::kNone, eax, dword_ptr(rsi));
+
+ print_info_simple(arch, Inst::kIdPshufd, InstOptions::kNone, xmm0, xmm1, imm(0));
+ print_info_simple(arch, Inst::kIdPabsb, InstOptions::kNone, mm1, mm2);
+ print_info_simple(arch, Inst::kIdPabsb, InstOptions::kNone, xmm1, xmm2);
+ print_info_simple(arch, Inst::kIdPextrw, InstOptions::kNone, eax, mm1, imm(0));
+ print_info_simple(arch, Inst::kIdPextrw, InstOptions::kNone, eax, xmm1, imm(0));
+ print_info_simple(arch, Inst::kIdPextrw, InstOptions::kNone, ptr(rax), xmm1, imm(0));
+
+ print_info_simple(arch, Inst::kIdVpdpbusd, InstOptions::kNone, xmm0, xmm1, xmm2);
+ print_info_simple(arch, Inst::kIdVpdpbusd, InstOptions::kX86_Vex, xmm0, xmm1, xmm2);
+
+ print_info_simple(arch, Inst::kIdVaddpd, InstOptions::kNone, ymm0, ymm1, ymm2);
+ print_info_simple(arch, Inst::kIdVaddpd, InstOptions::kNone, ymm0, ymm30, ymm31);
+ print_info_simple(arch, Inst::kIdVaddpd, InstOptions::kNone, zmm0, zmm1, zmm2);
+
+ print_info_simple(arch, Inst::kIdVpternlogd, InstOptions::kNone, zmm0, zmm0, zmm0, imm(0xFF));
+ print_info_simple(arch, Inst::kIdVpternlogq, InstOptions::kNone, zmm0, zmm1, zmm2, imm(0x33));
+
+ print_info_extra(arch, Inst::kIdVaddpd, InstOptions::kNone, k1, zmm0, zmm1, zmm2);
+ print_info_extra(arch, Inst::kIdVaddpd, InstOptions::kX86_ZMask, k1, zmm0, zmm1, zmm2);
+
+ print_info_simple(arch, Inst::kIdVcvtdq2pd, InstOptions::kNone, xmm0, xmm1);
+ print_info_simple(arch, Inst::kIdVcvtdq2pd, InstOptions::kNone, ymm0, xmm1);
+ print_info_simple(arch, Inst::kIdVcvtdq2pd, InstOptions::kNone, zmm0, ymm1);
+
+ print_info_simple(arch, Inst::kIdVcvtdq2pd, InstOptions::kNone, xmm0, ptr(rsi));
+ print_info_simple(arch, Inst::kIdVcvtdq2pd, InstOptions::kNone, ymm0, ptr(rsi));
+ print_info_simple(arch, Inst::kIdVcvtdq2pd, InstOptions::kNone, zmm0, ptr(rsi));
+#endif // !ASMJIT_NO_X86
+}
+
+} // {anonymous}
+
+int main() {
+ print_app_info();
+ test_x86_arch();
+
+ return 0;
+}
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_misc.h b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_misc.h
new file mode 100644
index 00000000000..67ea6c7aaf7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_misc.h
@@ -0,0 +1,265 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_TEST_MISC_H_INCLUDED
+#define ASMJIT_TEST_MISC_H_INCLUDED
+
+#include <asmjit/x86.h>
+
+namespace asmtest {
+
+using namespace asmjit;
+
+// Generates a typical alpha blend function that uses SSE2 instruction set.
+// This function combines emitting instructions with control flow constructs
+// like binding Labels and jumping to them. This should be pretty representative.
+template<typename Emitter>
+static void generate_sse_alpha_blend_internal(
+ Emitter& cc,
+ const x86::Gp& dst, const x86::Gp& src, const x86::Gp& n,
+ const x86::Gp& gp0,
+ const x86::Vec& simd0, const x86::Vec& simd1, const x86::Vec& simd2, const x86::Vec& simd3,
+ const x86::Vec& simd4, const x86::Vec& simd5, const x86::Vec& simd6, const x86::Vec& simd7) {
+
+ x86::Gp i = n;
+ x86::Gp j = gp0;
+
+ x86::Vec vzero = simd0;
+ x86::Vec v0080 = simd1;
+ x86::Vec v0101 = simd2;
+
+ Label L_SmallLoop = cc.new_label();
+ Label L_SmallEnd = cc.new_label();
+ Label L_LargeLoop = cc.new_label();
+ Label L_LargeEnd = cc.new_label();
+ Label L_Done = cc.new_label();
+
+ // Load SIMD Constants.
+ cc.xorps(vzero, vzero);
+ cc.mov(gp0.r32(), 0x00800080);
+ cc.movd(v0080, gp0.r32());
+ cc.mov(gp0.r32(), 0x01010101);
+ cc.movd(v0101, gp0.r32());
+ cc.pshufd(v0080, v0080, x86::shuffle_imm(0, 0, 0, 0));
+ cc.pshufd(v0101, v0101, x86::shuffle_imm(0, 0, 0, 0));
+
+ // How many pixels have to be processed to make the loop aligned.
+ cc.xor_(j, j);
+ cc.sub(j, dst);
+ cc.and_(j, 15);
+ cc.shr(j, 2);
+ cc.jz(L_SmallEnd);
+
+ cc.cmp(j, i);
+ cc.cmovg(j, i); // j = min(i, j)
+ cc.sub(i, j); // i -= j
+
+ // Small loop.
+ cc.bind(L_SmallLoop);
+ {
+ x86::Vec x0 = simd3;
+ x86::Vec y0 = simd4;
+ x86::Vec a0 = simd5;
+
+ cc.movd(y0, x86::ptr(src));
+ cc.movd(x0, x86::ptr(dst));
+
+ cc.pcmpeqb(a0, a0);
+ cc.pxor(a0, y0);
+ cc.psrlw(a0, 8);
+ cc.punpcklbw(x0, vzero);
+
+ cc.pshuflw(a0, a0, x86::shuffle_imm(1, 1, 1, 1));
+ cc.punpcklbw(y0, vzero);
+
+ cc.pmullw(x0, a0);
+ cc.paddsw(x0, v0080);
+ cc.pmulhuw(x0, v0101);
+
+ cc.paddw(x0, y0);
+ cc.packuswb(x0, x0);
+
+ cc.movd(x86::ptr(dst), x0);
+
+ cc.add(dst, 4);
+ cc.add(src, 4);
+
+ cc.dec(j);
+ cc.jnz(L_SmallLoop);
+ }
+
+ // Second section, prepare for an aligned loop.
+ cc.bind(L_SmallEnd);
+
+ cc.test(i, i);
+ cc.mov(j, i);
+ cc.jz(L_Done);
+
+ cc.and_(j, 3);
+ cc.shr(i, 2);
+ cc.jz(L_LargeEnd);
+
+ // Aligned loop.
+ cc.bind(L_LargeLoop);
+ {
+ x86::Vec x0 = simd3;
+ x86::Vec x1 = simd4;
+ x86::Vec y0 = simd5;
+ x86::Vec a0 = simd6;
+ x86::Vec a1 = simd7;
+
+ cc.movups(y0, x86::ptr(src));
+ cc.movaps(x0, x86::ptr(dst));
+
+ cc.pcmpeqb(a0, a0);
+ cc.xorps(a0, y0);
+ cc.movaps(x1, x0);
+
+ cc.psrlw(a0, 8);
+ cc.punpcklbw(x0, vzero);
+
+ cc.movaps(a1, a0);
+ cc.punpcklwd(a0, a0);
+
+ cc.punpckhbw(x1, vzero);
+ cc.punpckhwd(a1, a1);
+
+ cc.pshufd(a0, a0, x86::shuffle_imm(3, 3, 1, 1));
+ cc.pshufd(a1, a1, x86::shuffle_imm(3, 3, 1, 1));
+
+ cc.pmullw(x0, a0);
+ cc.pmullw(x1, a1);
+
+ cc.paddsw(x0, v0080);
+ cc.paddsw(x1, v0080);
+
+ cc.pmulhuw(x0, v0101);
+ cc.pmulhuw(x1, v0101);
+
+ cc.add(src, 16);
+ cc.packuswb(x0, x1);
+
+ cc.paddw(x0, y0);
+ cc.movaps(x86::ptr(dst), x0);
+
+ cc.add(dst, 16);
+
+ cc.dec(i);
+ cc.jnz(L_LargeLoop);
+ }
+
+ cc.bind(L_LargeEnd);
+ cc.test(j, j);
+ cc.jnz(L_SmallLoop);
+
+ cc.bind(L_Done);
+}
+
+static void generate_sse_alpha_blend(asmjit::BaseEmitter& emitter, bool emit_prolog_epilog) {
+ using namespace asmjit::x86;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (emitter.is_compiler()) {
+ Compiler& cc = *emitter.as<Compiler>();
+
+ Gp dst = cc.new_gp_ptr("dst");
+ Gp src = cc.new_gp_ptr("src");
+ Gp i = cc.new_gp_ptr("i");
+ Gp j = cc.new_gp_ptr("j");
+
+ Vec v0 = cc.new_xmm("v0");
+ Vec v1 = cc.new_xmm("v1");
+ Vec v2 = cc.new_xmm("v2");
+ Vec v3 = cc.new_xmm("v3");
+ Vec v4 = cc.new_xmm("v4");
+ Vec v5 = cc.new_xmm("v5");
+ Vec v6 = cc.new_xmm("v6");
+ Vec v7 = cc.new_xmm("v7");
+
+ FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*, const void*, size_t>());
+ func_node->set_arg(0, dst);
+ func_node->set_arg(1, src);
+ func_node->set_arg(2, i);
+ generate_sse_alpha_blend_internal(cc, dst, src, i, j, v0, v1, v2, v3, v4, v5, v6, v7);
+ cc.end_func();
+
+ return;
+ }
+#endif
+
+#ifndef ASMJIT_NO_BUILDER
+ if (emitter.is_builder()) {
+ Builder& cc = *emitter.as<Builder>();
+
+ x86::Gp dst = cc.zax();
+ x86::Gp src = cc.zcx();
+ x86::Gp i = cc.zdx();
+ x86::Gp j = cc.zdi();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(dst, src, i, j);
+ frame.add_dirty_regs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+
+ FuncArgsAssignment args(&func);
+ args.assign_all(dst, src, i);
+ args.update_func_frame(frame);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ cc.emit_args_assignment(frame, args);
+ generate_sse_alpha_blend_internal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_sse_alpha_blend_internal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ }
+
+ return;
+ }
+#endif
+
+ if (emitter.is_assembler()) {
+ Assembler& cc = *emitter.as<Assembler>();
+
+ x86::Gp dst = cc.zax();
+ x86::Gp src = cc.zcx();
+ x86::Gp i = cc.zdx();
+ x86::Gp j = cc.zdi();
+
+ if (emit_prolog_epilog) {
+ FuncDetail func;
+ func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(dst, src, i, j);
+ frame.add_dirty_regs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+
+ FuncArgsAssignment args(&func);
+ args.assign_all(dst, src, i);
+ args.update_func_frame(frame);
+ frame.finalize();
+
+ cc.emit_prolog(frame);
+ cc.emit_args_assignment(frame, args);
+ generate_sse_alpha_blend_internal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ cc.emit_epilog(frame);
+ }
+ else {
+ generate_sse_alpha_blend_internal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ }
+
+ return;
+ }
+}
+
+} // {asmtest}
+
+#endif // ASMJIT_TEST_MISC_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_runner.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_runner.cpp
new file mode 100644
index 00000000000..6e02b88cf2b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_runner.cpp
@@ -0,0 +1,171 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86.h>
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/a64.h>
+#endif
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/tests/broken.h>
+
+#if !defined(ASMJIT_NO_COMPILER)
+#include <asmjit/core/racfgblock_p.h>
+#include <asmjit/core/rainst_p.h>
+#include <asmjit/core/rapass_p.h>
+#endif
+
+using namespace asmjit;
+
+#define DUMP_TYPE(...) \
+ printf(" %-26s: %u\n", #__VA_ARGS__, uint32_t(sizeof(__VA_ARGS__)))
+
+static void print_type_sizes(void) noexcept {
+ printf("Size of C++ types:\n");
+ DUMP_TYPE(int8_t);
+ DUMP_TYPE(int16_t);
+ DUMP_TYPE(int32_t);
+ DUMP_TYPE(int64_t);
+ DUMP_TYPE(int);
+ DUMP_TYPE(long);
+ DUMP_TYPE(size_t);
+ DUMP_TYPE(intptr_t);
+ DUMP_TYPE(float);
+ DUMP_TYPE(double);
+ DUMP_TYPE(void*);
+ printf("\n");
+
+ printf("Size of base classes:\n");
+ DUMP_TYPE(BaseAssembler);
+ DUMP_TYPE(BaseEmitter);
+ DUMP_TYPE(CodeBuffer);
+ DUMP_TYPE(CodeHolder);
+ DUMP_TYPE(ConstPool);
+ DUMP_TYPE(Fixup);
+ DUMP_TYPE(LabelEntry);
+ DUMP_TYPE(LabelEntry::ExtraData);
+ DUMP_TYPE(RelocEntry);
+ DUMP_TYPE(Section);
+ DUMP_TYPE(String);
+ DUMP_TYPE(Target);
+ printf("\n");
+
+ printf("Size of arena classes:\n");
+ DUMP_TYPE(Arena);
+ DUMP_TYPE(ArenaHashNode);
+ DUMP_TYPE(ArenaHash<ArenaHashNode>);
+ DUMP_TYPE(ArenaList<int>);
+ DUMP_TYPE(ArenaVector<int>);
+ DUMP_TYPE(ArenaString<16>);
+ printf("\n");
+
+ printf("Size of operand classes:\n");
+ DUMP_TYPE(Operand);
+ DUMP_TYPE(Reg);
+ DUMP_TYPE(BaseMem);
+ DUMP_TYPE(Imm);
+ DUMP_TYPE(Label);
+ printf("\n");
+
+ printf("Size of function classes:\n");
+ DUMP_TYPE(CallConv);
+ DUMP_TYPE(FuncFrame);
+ DUMP_TYPE(FuncValue);
+ DUMP_TYPE(FuncDetail);
+ DUMP_TYPE(FuncSignature);
+ DUMP_TYPE(FuncArgsAssignment);
+ printf("\n");
+
+#if !defined(ASMJIT_NO_BUILDER)
+ constexpr uint32_t kBaseOpCapacity = InstNode::kBaseOpCapacity;
+ constexpr uint32_t kFullOpCapacity = InstNode::kFullOpCapacity;
+
+ printf("Size of builder classes:\n");
+ DUMP_TYPE(BaseBuilder);
+ DUMP_TYPE(BaseNode);
+ DUMP_TYPE(InstNode);
+ DUMP_TYPE(InstNodeWithOperands<kBaseOpCapacity>);
+ DUMP_TYPE(InstNodeWithOperands<kFullOpCapacity>);
+ DUMP_TYPE(AlignNode);
+ DUMP_TYPE(LabelNode);
+ DUMP_TYPE(EmbedDataNode);
+ DUMP_TYPE(EmbedLabelNode);
+ DUMP_TYPE(ConstPoolNode);
+ DUMP_TYPE(CommentNode);
+ DUMP_TYPE(SentinelNode);
+ printf("\n");
+#endif
+
+#if !defined(ASMJIT_NO_COMPILER)
+ printf("Size of compiler classes:\n");
+ DUMP_TYPE(BaseCompiler);
+ DUMP_TYPE(FuncNode);
+ DUMP_TYPE(FuncRetNode);
+ DUMP_TYPE(InvokeNode);
+ DUMP_TYPE(VirtReg);
+ printf("\n");
+
+ printf("Size of compiler classes (RA):\n");
+ DUMP_TYPE(BaseRAPass);
+ DUMP_TYPE(RABlock);
+ DUMP_TYPE(RAInst);
+ DUMP_TYPE(RATiedReg);
+ DUMP_TYPE(RAWorkReg);
+ printf("\n");
+#endif
+
+#if !defined(ASMJIT_NO_X86)
+ printf("Size of x86-specific classes:\n");
+ DUMP_TYPE(x86::Assembler);
+ #if !defined(ASMJIT_NO_BUILDER)
+ DUMP_TYPE(x86::Builder);
+ #endif
+ #if !defined(ASMJIT_NO_COMPILER)
+ DUMP_TYPE(x86::Compiler);
+ #endif
+ DUMP_TYPE(x86::InstDB::InstInfo);
+ DUMP_TYPE(x86::InstDB::CommonInfo);
+ DUMP_TYPE(x86::InstDB::OpSignature);
+ DUMP_TYPE(x86::InstDB::InstSignature);
+ printf("\n");
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ printf("Size of aarch64-specific classes:\n");
+ DUMP_TYPE(a64::Assembler);
+ #if !defined(ASMJIT_NO_BUILDER)
+ DUMP_TYPE(a64::Builder);
+ #endif
+ #if !defined(ASMJIT_NO_COMPILER)
+ DUMP_TYPE(a64::Compiler);
+ #endif
+ printf("\n");
+#endif
+}
+
+#undef DUMP_TYPE
+
+static void on_before_run(void) noexcept {
+ print_build_options();
+ print_cpu_info();
+ print_type_sizes();
+}
+
+int main(int argc, const char* argv[]) {
+ printf("AsmJit Unit-Test v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(Arch::kHost),
+ asmjit_build_type()
+ );
+
+ return BrokenAPI::run(argc, argv, on_before_run);
+}
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler.cpp
new file mode 100644
index 00000000000..3ceba1af5e4
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler.cpp
@@ -0,0 +1,5674 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/ujit.h>
+
+#include <asmjit-testing/commons/asmjitutils.h>
+#include <asmjit-testing/commons/random.h>
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+static void print_app_info() noexcept {
+ printf("AsmJit UniCompiler Test Suite v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
+ unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
+ unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
+ unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
+ asmjit_arch_as_string(asmjit::Arch::kHost),
+ asmjit_build_type()
+ );
+}
+
+#if !defined(ASMJIT_NO_UJIT) && !defined(ASMJIT_NO_JIT)
+
+#include <asmjit-testing/tests/broken.h>
+
+namespace UniCompilerTests {
+
+using namespace asmjit;
+using namespace asmjit::ujit;
+
+// ujit::UniCompiler - Tests - Constants
+// =====================================
+
+static constexpr uint64_t kRandomSeed = 0x1234u;
+static constexpr uint32_t kTestIterCount = 1000u;
+
+static ASMJIT_INLINE_CONSTEXPR uint32_t byte_width_from_vec_width(VecWidth vw) noexcept {
+ return 16u << uint32_t(vw);
+}
+
+// ujit::UniCompiler - Tests - MulAdd
+// ==================================
+
+#if defined(ASMJIT_UJIT_X86)
+
+float fadd(float a, float b) noexcept;
+float fsub(float a, float b) noexcept;
+float fmul(float a, float b) noexcept;
+float fdiv(float a, float b) noexcept;
+float fsqrt(float a) noexcept;
+float fmadd_nofma_ref(float a, float b, float c) noexcept;
+float fmadd_fma_ref(float a, float b, float c) noexcept;
+
+double fadd(double a, double b) noexcept;
+double fsub(double a, double b) noexcept;
+double fmul(double a, double b) noexcept;
+double fdiv(double a, double b) noexcept;
+double fsqrt(double a) noexcept;
+double fmadd_nofma_ref(double a, double b, double c) noexcept;
+double fmadd_fma_ref(double a, double b, double c) noexcept;
+
+void madd_fma_check_valgrind_bug(const float a[4], const float b[4], const float c[4], float dst[4]) noexcept;
+
+#else
+
+static ASMJIT_NOINLINE float fadd(float a, float b) noexcept { return a + b; }
+static ASMJIT_NOINLINE float fsub(float a, float b) noexcept { return a - b; }
+static ASMJIT_NOINLINE float fmul(float a, float b) noexcept { return a * b; }
+static ASMJIT_NOINLINE float fdiv(float a, float b) noexcept { return a / b; }
+static ASMJIT_NOINLINE float fsqrt(float a) noexcept { return std::sqrt(a); }
+static ASMJIT_NOINLINE float fmadd_nofma_ref(float a, float b, float c) noexcept { return a * b + c; }
+static ASMJIT_NOINLINE float fmadd_fma_ref(float a, float b, float c) noexcept { return std::fma(a, b, c); }
+
+static ASMJIT_NOINLINE double fadd(double a, double b) noexcept { return a + b; }
+static ASMJIT_NOINLINE double fsub(double a, double b) noexcept { return a - b; }
+static ASMJIT_NOINLINE double fmul(double a, double b) noexcept { return a * b; }
+static ASMJIT_NOINLINE double fdiv(double a, double b) noexcept { return a / b; }
+static ASMJIT_NOINLINE double fsqrt(double a) noexcept { return std::sqrt(a); }
+static ASMJIT_NOINLINE double fmadd_nofma_ref(double a, double b, double c) noexcept { return fadd(fmul(a, b), c); }
+static ASMJIT_NOINLINE double fmadd_fma_ref(double a, double b, double c) noexcept { return std::fma(a, b, c); }
+
+#endif
+
+static ASMJIT_INLINE float fsign(float a) noexcept { return Support::bit_cast<float>(Support::bit_cast<uint32_t>(a) & (uint32_t(1) << 31)); }
+static ASMJIT_INLINE double fsign(double a) noexcept { return Support::bit_cast<double>(Support::bit_cast<uint64_t>(a) & (uint64_t(1) << 63)); }
+
+static ASMJIT_INLINE float fxor(float a, float b) noexcept { return Support::bit_cast<float>(Support::bit_cast<uint32_t>(a) ^ Support::bit_cast<uint32_t>(b)); }
+static ASMJIT_INLINE double fxor(double a, double b) noexcept { return Support::bit_cast<double>(Support::bit_cast<uint64_t>(a) ^ Support::bit_cast<uint64_t>(b)); }
+
+// ujit::UniCompiler - Tests - Types
+// =================================
+
+struct Variation {
+ uint32_t value;
+
+ [[nodiscard]] ASMJIT_INLINE_CONSTEXPR bool operator==(uint32_t v) const noexcept { return value == v; }
+ [[nodiscard]] ASMJIT_INLINE_CONSTEXPR bool operator!=(uint32_t v) const noexcept { return value != v; }
+ [[nodiscard]] ASMJIT_INLINE_CONSTEXPR bool operator<=(uint32_t v) const noexcept { return value <= v; }
+ [[nodiscard]] ASMJIT_INLINE_CONSTEXPR bool operator< (uint32_t v) const noexcept { return value < v; }
+ [[nodiscard]] ASMJIT_INLINE_CONSTEXPR bool operator>=(uint32_t v) const noexcept { return value >= v; }
+ [[nodiscard]] ASMJIT_INLINE_CONSTEXPR bool operator> (uint32_t v) const noexcept { return value > v; }
+};
+
+// ujit::UniCompiler - Tests - JIT Function Prototypes
+// ===================================================
+
+typedef uint32_t (*TestCondRRFunc)(int32_t a, int32_t b);
+typedef uint32_t (*TestCondRIFunc)(int32_t a);
+
+typedef void (*TestMFunc)(void* ptr);
+typedef uintptr_t (*TestRMFunc)(uintptr_t reg, void* ptr);
+typedef void (*TestMRFunc)(void* ptr, uintptr_t reg);
+
+typedef uint32_t (*TestRRFunc)(uint32_t a);
+typedef uint32_t (*TestRRRFunc)(uint32_t a, uint32_t b);
+typedef uint32_t (*TestRRIFunc)(uint32_t a);
+
+typedef void (*TestVVFunc)(void* dst, const void* src);
+typedef void (*TestVVVFunc)(void* dst, const void* src1, const void* src2);
+typedef void (*TestVVVVFunc)(void* dst, const void* src1, const void* src2, const void* src3);
+
+// ujit::UniCompiler - Tests - JIT Context Error Handler
+// =====================================================
+
+class TestErrorHandler : public ErrorHandler {
+public:
+ TestErrorHandler() noexcept {}
+ ~TestErrorHandler() noexcept override {}
+
+ void handle_error(Error err, const char* message, BaseEmitter* origin) override {
+ Support::maybe_unused(origin);
+ EXPECT_EQ(err, Error::kOk)
+ .message("AsmJit Error: %s", message);
+ }
+};
+// ujit::UniCompiler - Tests - JIT Context for Testing
+// ===================================================
+
+class JitContext {
+public:
+ JitRuntime rt;
+ CpuFeatures features {};
+ CpuHints cpu_hints {};
+
+#if !defined(ASMJIT_NO_LOGGING)
+ StringLogger logger;
+#endif // !ASMJIT_NO_LOGGING
+
+ TestErrorHandler eh;
+ CodeHolder code;
+ BackendCompiler cc;
+
+ void prepare() noexcept {
+ code.reset();
+ code.init(rt.environment());
+ code.set_error_handler(&eh);
+
+#if !defined(ASMJIT_NO_LOGGING)
+ logger.clear();
+ code.set_logger(&logger);
+#endif // !ASMJIT_NO_LOGGING
+
+ code.attach(&cc);
+ cc.add_diagnostic_options(DiagnosticOptions::kRAAnnotate);
+ cc.add_diagnostic_options(DiagnosticOptions::kValidateAssembler);
+ cc.add_diagnostic_options(DiagnosticOptions::kValidateIntermediate);
+ }
+
+ template<typename Fn>
+ Fn finish() {
+ Fn fn;
+ EXPECT_EQ(cc.finalize(), Error::kOk);
+ EXPECT_EQ(rt.add(&fn, &code), Error::kOk);
+ code.reset();
+ return fn;
+ }
+
+#if !defined(ASMJIT_NO_LOGGING)
+ const char* logger_content() const noexcept { return logger.data(); }
+#else
+ const char* logger_content() const noexcept { return "<ASMJIT_NO_LOGGING>"; }
+#endif
+};
+
+// ujit::UniCompiler - Tests - Conditional Operations - Functions
+// ==============================================================
+
+static TestCondRRFunc create_func_cond_rr(JitContext& ctx, UniOpCond op, CondCode cond_code, uint32_t variation) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<uint32_t, int32_t, int32_t>());
+ EXPECT_NOT_NULL(node);
+
+ Gp a = uc.new_gp32("a");
+ Gp b = uc.new_gp32("b");
+ Gp result = uc.new_gp32("result");
+
+ node->set_arg(0, a);
+ node->set_arg(1, b);
+
+ switch (variation) {
+ case 0: {
+ // Test a conditional branch based on the given condition.
+ Label done = uc.new_label();
+ uc.mov(result, 1);
+ uc.j(done, UniCondition(op, cond_code, a, b));
+ uc.mov(result, 0);
+ uc.bind(done);
+ break;
+ }
+
+ case 1: {
+ // Test a cmov functionality.
+ Gp true_value = uc.new_gp32("true_value");
+ uc.mov(result, 0);
+ uc.mov(true_value, 1);
+ uc.cmov(result, true_value, UniCondition(op, cond_code, a, b));
+ break;
+ }
+
+ case 2: {
+ // Test a select functionality.
+ Gp false_value = uc.new_gp32("false_value");
+ Gp true_value = uc.new_gp32("true_value");
+ uc.mov(false_value, 0);
+ uc.mov(true_value, 1);
+ uc.select(result, true_value, false_value, UniCondition(op, cond_code, a, b));
+ break;
+ }
+ }
+
+ uc.ret(result);
+ uc.end_func();
+
+ return ctx.finish<TestCondRRFunc>();
+}
+
+static TestCondRIFunc create_func_cond_ri(JitContext& ctx, UniOpCond op, CondCode cond_code, Imm b_imm) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<uint32_t, int32_t>());
+ EXPECT_NOT_NULL(node);
+
+ Gp a = uc.new_gp32("a");
+ Gp result = uc.new_gp32("result");
+ Label done = uc.new_label();
+
+ node->set_arg(0, a);
+ uc.mov(result, 1);
+ uc.j(done, UniCondition(op, cond_code, a, b_imm));
+ uc.mov(result, 0);
+ uc.bind(done);
+ uc.ret(result);
+
+ uc.end_func();
+ return ctx.finish<TestCondRIFunc>();
+}
+
+// ujit::UniCompiler - Tests - Conditional Operations - Runner
+// ===========================================================
+
+static ASMJIT_NOINLINE void test_conditional_op(JitContext& ctx, UniOpCond op, CondCode cond_code, int32_t a, int32_t b, bool expected) {
+ for (uint32_t variation = 0; variation < 3; variation++) {
+ TestCondRRFunc fn_rr = create_func_cond_rr(ctx, op, cond_code, variation);
+ TestCondRIFunc fn_ri = create_func_cond_ri(ctx, op, cond_code, b);
+
+ uint32_t observed_rr = fn_rr(a, b);
+ EXPECT_EQ(observed_rr, uint32_t(expected))
+ .message("Operation failed (RR):\n"
+ " Input #1: %d\n"
+ " Input #2: %d\n"
+ " Expected: %d\n"
+ " Observed: %d\n"
+ "Assembly:\n%s",
+ a,
+ b,
+ uint32_t(expected),
+ observed_rr,
+ ctx.logger_content());
+
+ uint32_t observed_ri = fn_ri(a);
+ EXPECT_EQ(observed_ri, uint32_t(expected))
+ .message("Operation failed (RI):\n"
+ " Input #1: %d\n"
+ " Input #2: %d\n"
+ " Expected: %d\n"
+ " Observed: %d\n"
+ "Assembly:\n%s",
+ a,
+ b,
+ uint32_t(expected),
+ observed_ri,
+ ctx.logger_content());
+
+ ctx.rt.reset();
+ }
+}
+
+static ASMJIT_NOINLINE void test_cond_ops(JitContext& ctx) {
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kEqual, 0, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kEqual, 1, 1, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kEqual, 1, 2, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kEqual, 100, 31, false);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kNotEqual, 0, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kNotEqual, 1, 1, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kNotEqual, 1, 2, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kNotEqual, 100, 31, true);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGT, 0, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGT, 1, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGT, 111111, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGT, 111111, 222, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGT, 222, 111111, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGT, 222, 111, true);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGE, 0, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGE, 1, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGE, 111111, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGE, 111111, 111111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGE, 111111, 222, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedGE, 222, 111111, false);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 0, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 1, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 0, 1, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 111111, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 111111, 222, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 222, 111111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLT, 222, 111, false);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 0, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 1, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 0, 1, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 111111, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 111111, 222, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 222, 111111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kUnsignedLE, 22222, 22222, true);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, 0, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, 1, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, 111111, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, 111111, -222, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, -222, 111111, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, -222, -111, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGT, -111, -1, false);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, 0, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, 1, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, 111111, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, 111111, 111111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, 111111, -222, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, -222, 111111, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, -111, -1, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedGE, -111, -111, true);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, 0, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, 1, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, 111111, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, 111111, -222, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, -222, 111111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, -222, -111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, -111, -1, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLT, -1, -1, false);
+
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, 0, 0, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, 1, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, 111111, 0, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, 111111, -222, false);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, -222, 111111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, -222, -111, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, -111, -1, true);
+ test_conditional_op(ctx, UniOpCond::kCompare, CondCode::kSignedLE, -1, -1, true);
+
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kZero, 0, 0, true);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kZero, 1, 0, true);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kZero, 111111, 0, true);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kZero, 111111, -222, false);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kZero, -222, 111111, false);
+
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kNotZero, 0, 0, false);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kNotZero, 1, 0, false);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kNotZero, 111111, 0, false);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kNotZero, 111111, -222, true);
+ test_conditional_op(ctx, UniOpCond::kTest, CondCode::kNotZero, -222, 111111, true);
+
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTZero, int32_t(0x0), 0, true);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTZero, int32_t(0x1), 0, false);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTZero, int32_t(0xFF), 7, false);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTZero, int32_t(0xFF), 9, true);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTZero, int32_t(0xFFFFFFFF), 31, false);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTZero, int32_t(0x7FFFFFFF), 31, true);
+
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTNotZero, int32_t(0x0), 0, false);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTNotZero, int32_t(0x1), 0, true);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTNotZero, int32_t(0xFF), 7, true);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTNotZero, int32_t(0xFF), 9, false);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTNotZero, int32_t(0xFFFFFFFF), 31, true);
+ test_conditional_op(ctx, UniOpCond::kBitTest, CondCode::kBTNotZero, int32_t(0x7FFFFFFF), 31, false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kZero, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kZero, int32_t(0x00000001), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kZero, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kZero, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kNotZero, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kNotZero, int32_t(0x00000001), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kNotZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAnd, CondCode::kNotZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kZero, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kZero, int32_t(0x00000001), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kZero, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kZero, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kNotZero, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kNotZero, int32_t(0x00000001), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kNotZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignOr, CondCode::kNotZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kZero, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kZero, int32_t(0x00000001), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kZero, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kZero, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kNotZero, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kNotZero, int32_t(0x00000001), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kNotZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignXor, CondCode::kNotZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kZero, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kZero, int32_t(0xFF000000), int32_t(0x01000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kZero, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kZero, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotZero, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotZero, int32_t(0xFF000000), int32_t(0x01000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kCarry, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kCarry, int32_t(0xFF000000), int32_t(0x01000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kCarry, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kCarry, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kCarry, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kCarry, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotCarry, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotCarry, int32_t(0xFF000000), int32_t(0x01000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotCarry, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotCarry, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotCarry, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotCarry, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kSign, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kSign, int32_t(0xFF000000), int32_t(0x01000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kSign, int32_t(0x000000FF), int32_t(0x80000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kSign, int32_t(0x000000FF), int32_t(0x800000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kSign, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kSign, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotSign, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotSign, int32_t(0xFF000000), int32_t(0x01000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotSign, int32_t(0x000000FF), int32_t(0x80000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotSign, int32_t(0x000000FF), int32_t(0x800000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotSign, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignAdd, CondCode::kNotSign, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kZero, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kZero, int32_t(0xFF000000), int32_t(0x01000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kZero, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kZero, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotZero, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotZero, int32_t(0xFF000000), int32_t(0x01000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotZero, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotZero, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotZero, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0xFF000000), int32_t(0x01000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0x000000FF), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedLT, int32_t(0x00000111), int32_t(0x0000F0FF), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGE, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGE, int32_t(0xFF000000), int32_t(0x01000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGE, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGE, int32_t(0x000000FF), int32_t(0x000000FF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGE, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGE, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kSign, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kSign, int32_t(0x00000000), int32_t(0xFFFFFFFF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kSign, int32_t(0x00000000), int32_t(0x00000001), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kSign, int32_t(0x00000001), int32_t(0x00000010), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kSign, int32_t(0xFFFFFFFF), int32_t(0xFF000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kSign, int32_t(0x7FFFFFFF), int32_t(0x80000000), true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotSign, int32_t(0x00000000), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotSign, int32_t(0x00000000), int32_t(0xFFFFFFFF), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotSign, int32_t(0x00000000), int32_t(0x00000001), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotSign, int32_t(0x00000001), int32_t(0x00000010), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotSign, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kNotSign, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0x00000000), int32_t(0x00000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0xFF000000), int32_t(0x01000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0x000000FF), int32_t(0x00000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0x000000FF), int32_t(0x000000FF), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0xFFFFFFFF), int32_t(0xFF000000), true);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0x7FFFFFFF), int32_t(0x80000000), false);
+ test_conditional_op(ctx, UniOpCond::kAssignSub, CondCode::kUnsignedGT, int32_t(0x00000111), int32_t(0x0000F0FF), false);
+
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kZero, int32_t(0x00000000), 1, true);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kZero, int32_t(0x000000FF), 8, true);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kZero, int32_t(0x000000FF), 7, false);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kZero, int32_t(0xFFFFFFFF), 31, false);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kZero, int32_t(0x7FFFFFFF), 31, true);
+
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kNotZero, int32_t(0x00000000), 1, false);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kNotZero, int32_t(0x000000FF), 8, false);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kNotZero, int32_t(0x000000FF), 7, true);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kNotZero, int32_t(0xFFFFFFFF), 31, true);
+ test_conditional_op(ctx, UniOpCond::kAssignShr, CondCode::kNotZero, int32_t(0x7FFFFFFF), 31, false);
+}
+
+// ujit::UniCompiler - Tests - M Operations - Functions
+// ====================================================
+
+static TestMFunc create_func_m(JitContext& ctx, UniOpM op) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp ptr = uc.new_gpz("ptr");
+ node->set_arg(0, ptr);
+ uc.emit_m(op, mem_ptr(ptr));
+
+ uc.end_func();
+ return ctx.finish<TestMFunc>();
+}
+
+// ujit::UniCompiler - Tests - M Operations - Runner
+// =================================================
+
+static ASMJIT_NOINLINE void test_m_ops(JitContext& ctx) {
+ uint8_t buffer[8];
+
+ TestMFunc fn_zero_u8 = create_func_m(ctx, UniOpM::kStoreZeroU8);
+ memcpy(buffer, "ABCDEFGH", 8);
+ fn_zero_u8(buffer + 0);
+ EXPECT_EQ(memcmp(buffer, "\0BCDEFGH", 8), 0);
+ fn_zero_u8(buffer + 5);
+ EXPECT_EQ(memcmp(buffer, "\0BCDE\0GH", 8), 0);
+
+ TestMFunc fn_zero_u16 = create_func_m(ctx, UniOpM::kStoreZeroU16);
+ memcpy(buffer, "ABCDEFGH", 8);
+ fn_zero_u16(buffer + 0);
+ EXPECT_EQ(memcmp(buffer, "\0\0CDEFGH", 8), 0);
+ fn_zero_u16(buffer + 4);
+ EXPECT_EQ(memcmp(buffer, "\0\0CD\0\0GH", 8), 0);
+
+ TestMFunc fn_zero_u32 = create_func_m(ctx, UniOpM::kStoreZeroU32);
+ memcpy(buffer, "ABCDEFGH", 8);
+ fn_zero_u32(buffer + 0);
+ EXPECT_EQ(memcmp(buffer, "\0\0\0\0EFGH", 8), 0);
+ fn_zero_u32(buffer + 4);
+ EXPECT_EQ(memcmp(buffer, "\0\0\0\0\0\0\0\0", 8), 0);
+
+#if ASMJIT_ARCH_BITS >= 64
+ TestMFunc fn_zero_u64 = create_func_m(ctx, UniOpM::kStoreZeroU64);
+ memcpy(buffer, "ABCDEFGH", 8);
+ fn_zero_u64(buffer + 0);
+ EXPECT_EQ(memcmp(buffer, "\0\0\0\0\0\0\0\0", 8), 0);
+#endif
+
+ TestMFunc fn_zero_reg = create_func_m(ctx, UniOpM::kStoreZeroReg);
+ memcpy(buffer, "ABCDEFGH", 8);
+ fn_zero_reg(buffer + 0);
+#if ASMJIT_ARCH_BITS >= 64
+ EXPECT_EQ(memcmp(buffer, "\0\0\0\0\0\0\0\0", 8), 0);
+#else
+ EXPECT_EQ(memcmp(buffer, "\0\0\0\0EFGH", 8), 0);
+#endif
+
+ ctx.rt.reset();
+}
+
+// ujit::UniCompiler - Tests - RM Operations - Functions
+// =====================================================
+
+static TestRMFunc create_func_rm(JitContext& ctx, UniOpRM op) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<uintptr_t, uintptr_t, void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp reg = uc.new_gpz("reg");
+ Gp ptr = uc.new_gpz("ptr");
+
+ node->set_arg(0, reg);
+ node->set_arg(1, ptr);
+
+ uc.emit_rm(op, reg, mem_ptr(ptr));
+ uc.ret(reg);
+
+ uc.end_func();
+ return ctx.finish<TestRMFunc>();
+}
+
+// ujit::UniCompiler - Tests - RM Operations - Runner
+// ==================================================
+
+static ASMJIT_NOINLINE void test_rm_ops(JitContext& ctx) {
+ union Mem {
+ uint8_t buffer[8];
+ uint16_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ };
+
+ Mem mem{};
+
+ TestRMFunc fn_load_i8 = create_func_rm(ctx, UniOpRM::kLoadI8);
+ mem.u8 = uint8_t(int8_t(6));
+ EXPECT_EQ(fn_load_i8(0, mem.buffer), uintptr_t(intptr_t(6)));
+
+ mem.u8 = uint8_t(int8_t(-6));
+ EXPECT_EQ(fn_load_i8(0, mem.buffer), uintptr_t(intptr_t(-6)));
+
+ TestRMFunc fn_load_u8 = create_func_rm(ctx, UniOpRM::kLoadU8);
+ mem.u8 = uint8_t(0x80);
+ EXPECT_EQ(fn_load_u8(0, mem.buffer), 0x80u);
+
+ mem.u8 = uint8_t(0xFF);
+ EXPECT_EQ(fn_load_u8(0, mem.buffer), 0xFFu);
+
+ TestRMFunc fn_load_i16 = create_func_rm(ctx, UniOpRM::kLoadI16);
+ mem.u16 = uint16_t(int16_t(666));
+ EXPECT_EQ(fn_load_i16(0, mem.buffer), uintptr_t(intptr_t(666)));
+
+ mem.u16 = uint16_t(int16_t(-666));
+ EXPECT_EQ(fn_load_i16(0, mem.buffer), uintptr_t(intptr_t(-666)));
+
+ TestRMFunc fn_load_u16 = create_func_rm(ctx, UniOpRM::kLoadU16);
+ mem.u16 = uint16_t(0x8000);
+ EXPECT_EQ(fn_load_u16(0, mem.buffer), 0x8000u);
+
+ mem.u16 = uint16_t(0xFEED);
+ EXPECT_EQ(fn_load_u16(0, mem.buffer), 0xFEEDu);
+
+ TestRMFunc fn_load_i32 = create_func_rm(ctx, UniOpRM::kLoadI32);
+ mem.u32 = uint32_t(int32_t(666666));
+ EXPECT_EQ(fn_load_i32(0, mem.buffer), uintptr_t(intptr_t(666666)));
+
+ mem.u32 = uint32_t(int32_t(-666666));
+ EXPECT_EQ(fn_load_i32(0, mem.buffer), uintptr_t(intptr_t(-666666)));
+
+ TestRMFunc fn_load_u32 = create_func_rm(ctx, UniOpRM::kLoadU32);
+ mem.u32 = 0x12345678;
+ EXPECT_EQ(fn_load_u32(0, mem.buffer), uint32_t(0x12345678));
+
+#if ASMJIT_ARCH_BITS >= 64
+ TestRMFunc fn_load_i64 = create_func_rm(ctx, UniOpRM::kLoadI64);
+ mem.u64 = 0xF123456789ABCDEFu;
+ EXPECT_EQ(fn_load_i64(0, mem.buffer), 0xF123456789ABCDEFu);
+
+ TestRMFunc fn_load_u64 = create_func_rm(ctx, UniOpRM::kLoadU64);
+ mem.u64 = 0xF123456789ABCDEFu;
+ EXPECT_EQ(fn_load_u64(0, mem.buffer), 0xF123456789ABCDEFu);
+#endif
+
+ TestRMFunc fn_load_reg = create_func_rm(ctx, UniOpRM::kLoadReg);
+ mem.u64 = 0xF123456789ABCDEFu;
+#if ASMJIT_ARCH_BITS >= 64
+ EXPECT_EQ(fn_load_reg(0, mem.buffer), 0xF123456789ABCDEFu);
+#else
+ EXPECT_EQ(fn_load_reg(0, mem.buffer), 0x89ABCDEFu);
+#endif
+
+ TestRMFunc fn_load_merge_u8 = create_func_rm(ctx, UniOpRM::kLoadMergeU8);
+ mem.u8 = uint8_t(0xAA);
+ EXPECT_EQ(fn_load_merge_u8(0x1F2FFF00, mem.buffer), 0x1F2FFFAAu);
+
+ TestRMFunc fn_load_shift_u8 = create_func_rm(ctx, UniOpRM::kLoadShiftU8);
+ mem.u8 = uint8_t(0xAA);
+ EXPECT_EQ(fn_load_shift_u8(0x002FFF00, mem.buffer), 0x2FFF00AAu);
+
+ TestRMFunc fn_load_merge_u16 = create_func_rm(ctx, UniOpRM::kLoadMergeU16);
+ mem.u16 = uint16_t(0xAABB);
+ EXPECT_EQ(fn_load_merge_u16(0x1F2F0000, mem.buffer), 0x1F2FAABBu);
+
+ TestRMFunc fn_load_shift_u16 = create_func_rm(ctx, UniOpRM::kLoadShiftU16);
+ mem.u16 = uint16_t(0xAABB);
+ EXPECT_EQ(fn_load_shift_u16(0x00001F2F, mem.buffer), 0x1F2FAABBu);
+
+ ctx.rt.reset();
+}
+
+// ujit::UniCompiler - Tests - MR Operations - Functions
+// =====================================================
+
+static TestMRFunc create_func_mr(JitContext& ctx, UniOpMR op) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*, uintptr_t>());
+ EXPECT_NOT_NULL(node);
+
+ Gp ptr = uc.new_gpz("ptr");
+ Gp reg = uc.new_gpz("reg");
+
+ node->set_arg(0, ptr);
+ node->set_arg(1, reg);
+
+ uc.emit_mr(op, mem_ptr(ptr), reg);
+
+ uc.end_func();
+ return ctx.finish<TestMRFunc>();
+}
+
+// ujit::UniCompiler - Tests - MR Operations - Runner
+// ==================================================
+
+static ASMJIT_NOINLINE void test_mr_ops(JitContext& ctx) {
+ union Mem {
+ uint8_t buffer[8];
+ uint16_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ };
+
+ Mem mem{};
+
+ TestMRFunc fn_store_u8 = create_func_mr(ctx, UniOpMR::kStoreU8);
+ memcpy(mem.buffer, "ABCDEFGH", 8);
+ fn_store_u8(mem.buffer, 0x7A);
+ EXPECT_EQ(memcmp(mem.buffer, "zBCDEFGH", 8), 0);
+
+ TestMRFunc fn_store_u16 = create_func_mr(ctx, UniOpMR::kStoreU16);
+ memcpy(mem.buffer, "ABCDEFGH", 8);
+ fn_store_u16(mem.buffer, 0x7A7A);
+ EXPECT_EQ(memcmp(mem.buffer, "zzCDEFGH", 8), 0);
+
+ TestMRFunc fn_store_u32 = create_func_mr(ctx, UniOpMR::kStoreU32);
+ memcpy(mem.buffer, "ABCDEFGH", 8);
+ fn_store_u32(mem.buffer, 0x7A7A7A7A);
+ EXPECT_EQ(memcmp(mem.buffer, "zzzzEFGH", 8), 0);
+
+#if ASMJIT_ARCH_BITS >= 64
+ TestMRFunc fn_store_u64 = create_func_mr(ctx, UniOpMR::kStoreU64);
+ memcpy(mem.buffer, "ABCDEFGH", 8);
+ fn_store_u64(mem.buffer, 0x7A7A7A7A7A7A7A7A);
+ EXPECT_EQ(memcmp(mem.buffer, "zzzzzzzz", 8), 0);
+#endif
+
+ TestMRFunc fn_store_reg = create_func_mr(ctx, UniOpMR::kStoreReg);
+ memcpy(mem.buffer, "ABCDEFGH", 8);
+#if ASMJIT_ARCH_BITS >= 64
+ fn_store_reg(mem.buffer, 0x7A7A7A7A7A7A7A7A);
+ EXPECT_EQ(memcmp(mem.buffer, "zzzzzzzz", 8), 0);
+#else
+ fn_store_reg(mem.buffer, 0x7A7A7A7A);
+ EXPECT_EQ(memcmp(mem.buffer, "zzzzEFGH", 8), 0);
+#endif
+
+ TestMRFunc fn_add_u8 = create_func_mr(ctx, UniOpMR::kAddU8);
+ mem.u64 = 0;
+ mem.u8 = 42;
+ fn_add_u8(mem.buffer, 13);
+ EXPECT_EQ(mem.u8, 55u);
+ EXPECT_EQ(memcmp(mem.buffer + 1, "\0\0\0\0\0\0\0", 7), 0);
+
+ TestMRFunc fn_add_u16 = create_func_mr(ctx, UniOpMR::kAddU16);
+ mem.u64 = 0;
+ mem.u16 = 442;
+ fn_add_u16(mem.buffer, 335);
+ EXPECT_EQ(mem.u16, 777u);
+ EXPECT_EQ(memcmp(mem.buffer + 2, "\0\0\0\0\0\0", 6), 0);
+
+ TestMRFunc fn_add_u32 = create_func_mr(ctx, UniOpMR::kAddU32);
+ mem.u64 = 0;
+ mem.u32 = 442332;
+ fn_add_u32(mem.buffer, 335223);
+ EXPECT_EQ(mem.u32, 777555u);
+ EXPECT_EQ(memcmp(mem.buffer + 4, "\0\0\0\0", 4), 0);
+
+#if ASMJIT_ARCH_BITS >= 64
+ TestMRFunc fn_add_u64 = create_func_mr(ctx, UniOpMR::kAddU64);
+ mem.u64 = 0xF123456789ABCDEFu;
+ fn_add_u64(mem.buffer, 0x0102030405060708u);
+ EXPECT_EQ(mem.u64, 0xF225486B8EB1D4F7u);
+#endif
+
+ TestMRFunc fn_add_reg = create_func_mr(ctx, UniOpMR::kAddReg);
+ mem.u64 = 0xFFFFFFFFFFFFFFFF;
+#if ASMJIT_ARCH_BITS >= 64
+ fn_add_reg(mem.buffer, 1);
+ EXPECT_EQ(mem.u64, 0u);
+#else
+ mem.u32 = 0x01020304;
+ fn_add_reg(mem.buffer, 0x02030405);
+ EXPECT_EQ(mem.u32, 0x03050709u);
+ EXPECT_EQ(memcmp(mem.buffer + 4, "\xFF\xFF\xFF\xFF", 4), 0);
+#endif
+
+ ctx.rt.reset();
+}
+
+// ujit::UniCompiler - Tests - RR Operations - Functions
+// =====================================================
+
+static TestRRFunc create_func_rr(JitContext& ctx, UniOpRR op) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<uint32_t, uint32_t>());
+ EXPECT_NOT_NULL(node);
+
+ Gp r = uc.new_gp32("r");
+ node->set_arg(0, r);
+ uc.emit_2i(op, r, r);
+ uc.ret(r);
+
+ uc.end_func();
+ return ctx.finish<TestRRFunc>();
+}
+
+// ujit::UniCompiler - Tests - RR Operations - Runner
+// ==================================================
+
+static ASMJIT_NOINLINE void test_rr_ops(JitContext& ctx) {
+ TestRRFunc fn_abs = create_func_rr(ctx, UniOpRR::kAbs);
+ EXPECT_EQ(fn_abs(0u), 0u);
+ EXPECT_EQ(fn_abs(1u), 1u);
+ EXPECT_EQ(fn_abs(uint32_t(-1)), 1u);
+ EXPECT_EQ(fn_abs(uint32_t(-333)), 333u);
+ EXPECT_EQ(fn_abs(0x80000000u), 0x80000000u);
+
+ TestRRFunc fn_neg = create_func_rr(ctx, UniOpRR::kNeg);
+ EXPECT_EQ(fn_neg(0u), 0u);
+ EXPECT_EQ(fn_neg(1u), uint32_t(-1));
+ EXPECT_EQ(fn_neg(uint32_t(-1)), 1u);
+ EXPECT_EQ(fn_neg(uint32_t(-333)), 333u);
+ EXPECT_EQ(fn_neg(333u), uint32_t(-333));
+ EXPECT_EQ(fn_neg(0x80000000u), 0x80000000u);
+
+ TestRRFunc fn_not = create_func_rr(ctx, UniOpRR::kNot);
+ EXPECT_EQ(fn_not(0u), 0xFFFFFFFFu);
+ EXPECT_EQ(fn_not(1u), 0xFFFFFFFEu);
+ EXPECT_EQ(fn_not(0xFFFFFFFF), 0u);
+ EXPECT_EQ(fn_not(0x12333245), ~0x12333245u);
+ EXPECT_EQ(fn_not(0x80000000u), 0x7FFFFFFFu);
+
+ TestRRFunc fn_bswap32 = create_func_rr(ctx, UniOpRR::kBSwap);
+ EXPECT_EQ(fn_bswap32(0x11223344u), 0x44332211u);
+ EXPECT_EQ(fn_bswap32(0xFFFF0000u), 0x0000FFFFu);
+ EXPECT_EQ(fn_bswap32(0x00000000u), 0x00000000u);
+
+ TestRRFunc fn_clz32 = create_func_rr(ctx, UniOpRR::kCLZ);
+ EXPECT_EQ(fn_clz32(0x80000000u), 0u);
+ EXPECT_EQ(fn_clz32(0x40000000u), 1u);
+ EXPECT_EQ(fn_clz32(0x00800000u), 8u);
+ EXPECT_EQ(fn_clz32(0x00008000u), 16u);
+ EXPECT_EQ(fn_clz32(0x00000080u), 24u);
+ EXPECT_EQ(fn_clz32(0x00000001u), 31u);
+
+ TestRRFunc fn_ctz32 = create_func_rr(ctx, UniOpRR::kCTZ);
+ EXPECT_EQ(fn_ctz32(0x80000000u), 31u);
+ EXPECT_EQ(fn_ctz32(0x40000000u), 30u);
+ EXPECT_EQ(fn_ctz32(0x00800000u), 23u);
+ EXPECT_EQ(fn_ctz32(0x00008000u), 15u);
+ EXPECT_EQ(fn_ctz32(0x00000080u), 7u);
+ EXPECT_EQ(fn_ctz32(0x00000001u), 0u);
+
+ TestRRFunc fn_reflect = create_func_rr(ctx, UniOpRR::kReflect);
+ EXPECT_EQ(fn_reflect(0x00000000u), 0x00000000u);
+ EXPECT_EQ(fn_reflect(0x00FF0000u), 0x00FF0000u);
+ EXPECT_EQ(fn_reflect(0x000000FFu), 0x000000FFu);
+ EXPECT_EQ(fn_reflect(0x80000000u), 0x7FFFFFFFu);
+ EXPECT_EQ(fn_reflect(0xFFFFFFFFu), 0x00000000u);
+ EXPECT_EQ(fn_reflect(0x88FF0000u), 0x7700FFFFu);
+
+ ctx.rt.reset();
+}
+
+// ujit::UniCompiler - Tests - RRR Operations - Functions
+// ======================================================
+
+static TestRRRFunc create_func_rrr(JitContext& ctx, UniOpRRR op) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<uint32_t, uint32_t, uint32_t>());
+ EXPECT_NOT_NULL(node);
+
+ Gp a = uc.new_gp32("a");
+ Gp b = uc.new_gp32("b");
+ Gp result = uc.new_gp32("result");
+
+ node->set_arg(0, a);
+ node->set_arg(1, b);
+
+ uc.emit_3i(op, result, a, b);
+ uc.ret(result);
+
+ uc.end_func();
+ return ctx.finish<TestRRRFunc>();
+}
+
+static TestRRIFunc create_func_rri(JitContext& ctx, UniOpRRR op, Imm bImm) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(VecWidth::k128);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<uint32_t, uint32_t>());
+ EXPECT_NOT_NULL(node);
+
+ Gp a = uc.new_gp32("a");
+ Gp result = uc.new_gp32("result");
+
+ node->set_arg(0, a);
+
+ uc.emit_3i(op, result, a, bImm);
+ uc.ret(result);
+
+ uc.end_func();
+ return ctx.finish<TestRRIFunc>();
+}
+
+// ujit::UniCompiler - Tests - RRR Operations - Runner
+// ===================================================
+
+static ASMJIT_NOINLINE void test_rrr_op(JitContext& ctx, UniOpRRR op, uint32_t a, uint32_t b, uint32_t expected) {
+ TestRRRFunc fn_rrr = create_func_rrr(ctx, op);
+ uint32_t observed_rrr = fn_rrr(a, b);
+ EXPECT_EQ(observed_rrr, expected)
+ .message("Operation failed (RRR):\n"
+ " Input #1: %d\n"
+ " Input #2: %d\n"
+ " Expected: %d\n"
+ " Observed: %d\n"
+ "Assembly:\n%s",
+ a,
+ b,
+ uint32_t(expected),
+ observed_rrr,
+ ctx.logger_content());
+
+ TestRRIFunc fn_rri = create_func_rri(ctx, op, Imm(b));
+ uint32_t observed_rri = fn_rri(a);
+ EXPECT_EQ(observed_rri, expected)
+ .message("Operation failed (RRI):\n"
+ " Input #1: %d\n"
+ " Input #2: %d\n"
+ " Expected: %d\n"
+ " Observed: %d\n"
+ "Assembly:\n%s",
+ a,
+ b,
+ uint32_t(expected),
+ observed_rri,
+ ctx.logger_content());
+
+ ctx.rt.reset();
+}
+
+static ASMJIT_NOINLINE void test_rrr_ops(JitContext& ctx) {
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0u, 0u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0xFFu, 0x11u, 0x11u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0x11u, 0xFFu, 0x11u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0xFF11u, 0x1111u, 0x1111u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0x1111u, 0xFF11u, 0x1111u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0x0000FFFFu, 0xFFFF0000u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0xFFFFFFFFu, 0xFFFF0000u, 0xFFFF0000u);
+ test_rrr_op(ctx, UniOpRRR::kAnd, 0x11111111u, 0x11223344u, 0x11001100u);
+
+ test_rrr_op(ctx, UniOpRRR::kOr, 0u, 0u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0xFFu, 0x11u, 0xFFu);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0x11u, 0xFFu, 0xFFu);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0xFF11u, 0x1111u, 0xFF11u);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0x1111u, 0xFF11u, 0xFF11u);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0x0000FFFFu, 0xFFFF0001u, 0xFFFFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0xFFFFFFFFu, 0xFF000000u, 0xFFFFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kOr, 0x11111111u, 0x00223344u, 0x11333355u);
+
+ test_rrr_op(ctx, UniOpRRR::kXor, 0u, 0u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0xFFu, 0x11u, 0xEEu);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0x11u, 0xFFu, 0xEEu);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0xFF11u, 0x1111u, 0xEE00u);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0x1111u, 0xFF11u, 0xEE00u);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0x0000FFFFu, 0xFFFF0001u, 0xFFFFFFFEu);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0xFFFFFFFFu, 0xFF000000u, 0x00FFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kXor, 0x11111111u, 0x00223344u, 0x11332255u);
+
+ test_rrr_op(ctx, UniOpRRR::kBic, 0u, 0u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0xFFu, 0x11u, 0xEEu);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0x11u, 0xFFu, 0x00u);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0xFF11u, 0x1111u, 0xEE00u);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0x1111u, 0xFF11u, 0x0000u);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0x0000FFFFu, 0xFFFF0000u, 0x0000FFFFu);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0xFFFFFFFFu, 0xFFFF0000u, 0x0000FFFFu);
+ test_rrr_op(ctx, UniOpRRR::kBic, 0x11111111u, 0x11223344u, 0x00110011u);
+
+ test_rrr_op(ctx, UniOpRRR::kAdd, 0u, 0u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kAdd, 1u, 2u, 3u);
+ test_rrr_op(ctx, UniOpRRR::kAdd, 0xFF000000u, 0x00FFFFFFu, 0xFFFFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kAdd, 1u, 0xFFFu, 0x1000u);
+ test_rrr_op(ctx, UniOpRRR::kAdd, 1u, 0xFFF000u, 0xFFF001u);
+
+ test_rrr_op(ctx, UniOpRRR::kSub, 1u, 2u, 0xFFFFFFFFu);
+
+ test_rrr_op(ctx, UniOpRRR::kMul, 1000u, 999u, 999000u);
+ test_rrr_op(ctx, UniOpRRR::kMul, 0xFFFFu, 0x00010001u, 0xFFFFFFFFu);
+
+ test_rrr_op(ctx, UniOpRRR::kUDiv, 100000u, 1000u, 100u);
+
+ test_rrr_op(ctx, UniOpRRR::kUMod, 1999u, 1000u, 999u);
+
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(1111), uint32_t(0), uint32_t(0));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(-1111), uint32_t(0), uint32_t(-1111));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(1), uint32_t(22), uint32_t(1));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(1), uint32_t(0), uint32_t(0));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(100101033), uint32_t(999), uint32_t(999));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(100101033), uint32_t(112), uint32_t(112));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(112), uint32_t(1125532), uint32_t(112));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(1111), uint32_t(-1), uint32_t(-1));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(-1111), uint32_t(-1), uint32_t(-1111));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(-1), uint32_t(-22), uint32_t(-22));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(-1), uint32_t(-128), uint32_t(-128));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(-128), uint32_t(-1), uint32_t(-128));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(-128), uint32_t(9), uint32_t(-128));
+ test_rrr_op(ctx, UniOpRRR::kSMin, uint32_t(12444), uint32_t(-1), uint32_t(-1));
+
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(1), uint32_t(22), uint32_t(22));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(1), uint32_t(0), uint32_t(1));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(100101033), uint32_t(999), uint32_t(100101033));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(100101033), uint32_t(112), uint32_t(100101033));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(112), uint32_t(1125532), uint32_t(1125532));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(1111), uint32_t(-1), uint32_t(1111));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(-1111), uint32_t(-1), uint32_t(-1));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(-1), uint32_t(-22), uint32_t(-1));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(-1), uint32_t(-128), uint32_t(-1));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(-128), uint32_t(-1), uint32_t(-1));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(-128), uint32_t(9), uint32_t(9));
+ test_rrr_op(ctx, UniOpRRR::kSMax, uint32_t(12444), uint32_t(-1), uint32_t(12444));
+
+ test_rrr_op(ctx, UniOpRRR::kUMin, 1, 22, 1);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 22, 1, 1);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 1, 255, 1);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 255, 1, 1);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 1023, 255, 255);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 255, 1023, 255);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 0xFFFFFFFFu, 255, 255);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 255, 0xFFFFFFFFu, 255);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 0xFFFFFFFFu, 0xFFFFFF00u, 0xFFFFFF00u);
+ test_rrr_op(ctx, UniOpRRR::kUMin, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu);
+
+ test_rrr_op(ctx, UniOpRRR::kUMax, 1, 22, 22);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 22, 1, 22);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 1, 255, 255);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 255, 1, 255);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 1023, 255, 1023);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 255, 1023, 1023);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 0xFFFFFFFFu, 255, 0xFFFFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 255, 0xFFFFFFFFu, 0xFFFFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 0xFFFFFFFFu, 0xFFFFFF00u, 0xFFFFFFFFu);
+ test_rrr_op(ctx, UniOpRRR::kUMax, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu);
+
+ test_rrr_op(ctx, UniOpRRR::kSll, 1u, 1u, 1u << 1);
+ test_rrr_op(ctx, UniOpRRR::kSll, 1u, 22u, 1u << 22);
+ test_rrr_op(ctx, UniOpRRR::kSll, 1u, 31u, 1u << 31);
+ test_rrr_op(ctx, UniOpRRR::kSll, 0x7FFFFFFFu, 1u, 0xFFFFFFFEu);
+
+ test_rrr_op(ctx, UniOpRRR::kSrl, 1u, 1u, 1u >> 1);
+ test_rrr_op(ctx, UniOpRRR::kSrl, 1u, 22u, 1u >> 22);
+ test_rrr_op(ctx, UniOpRRR::kSrl, 1u, 31u, 1u >> 31);
+ test_rrr_op(ctx, UniOpRRR::kSrl, 0x7FFFFFFFu, 1u, 0x7FFFFFFFu >> 1);
+
+ test_rrr_op(ctx, UniOpRRR::kSra, 1u, 1u, 1u >> 1);
+ test_rrr_op(ctx, UniOpRRR::kSra, 1u, 22u, 1u >> 22);
+ test_rrr_op(ctx, UniOpRRR::kSra, 1u, 31u, 1u >> 31);
+ test_rrr_op(ctx, UniOpRRR::kSra, 0x7FFFFFFFu, 1u, 0x7FFFFFFFu >> 1);
+ test_rrr_op(ctx, UniOpRRR::kSra, 0xF0000000u, 4u, 0xFF000000u);
+ test_rrr_op(ctx, UniOpRRR::kSra, 0x80000000u, 31u, 0xFFFFFFFFu);
+
+ test_rrr_op(ctx, UniOpRRR::kRol, 0x11223344u, 8u, 0x22334411u);
+ test_rrr_op(ctx, UniOpRRR::kRol, 0x11223344u, 16u, 0x33441122u);
+ test_rrr_op(ctx, UniOpRRR::kRol, 0xFCFFDABBu, 1u, 0xF9FFB577u);
+
+ test_rrr_op(ctx, UniOpRRR::kRor, 0x11223344u, 8u, 0x44112233u);
+ test_rrr_op(ctx, UniOpRRR::kRor, 0x11223344u, 16u, 0x33441122u);
+ test_rrr_op(ctx, UniOpRRR::kRor, 0xF0000000u, 1u, 0x78000000u);
+
+ test_rrr_op(ctx, UniOpRRR::kSBound, 0, 244u, 0);
+ test_rrr_op(ctx, UniOpRRR::kSBound, 42, 244u, 42u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, 1111, 244u, 244u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, 9999999, 111244u, 111244u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, uint32_t(int32_t(-1)), 1000u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, uint32_t(INT32_MIN), 100000u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, uint32_t(INT32_MAX), 0u, 0u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, uint32_t(INT32_MAX), 100000u, 100000u);
+ test_rrr_op(ctx, UniOpRRR::kSBound, uint32_t(INT32_MAX), uint32_t(INT32_MAX), uint32_t(INT32_MAX));
+}
+
+// ujit::UniCompiler - Tests - SIMD - Functions
+// ============================================
+
+// The following variations are supported:
+// - 0 - separate destination & source registers
+// - 1 - destination register is a source register as well
+// - 2 - source is a memory operand
+// - 3 - source register is a GP register (only for broadcasts from a GP register, otherwise maps to 0)
+static constexpr uint32_t kNumVariationsVV = 3;
+static constexpr uint32_t kNumVariationsVV_Broadcast = 4;
+
+static TestVVFunc create_func_vv(JitContext& ctx, VecWidth vw, UniOpVV op, Variation variation = Variation{0}) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(vw);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*, const void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp dst_ptr = uc.new_gpz("dst_ptr");
+ Gp src_ptr = uc.new_gpz("src_ptr");
+
+ node->set_arg(0, dst_ptr);
+ node->set_arg(1, src_ptr);
+
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+
+ // There are some instructions that fill the high part of the register, so just zero the destination to make
+ // sure that we can test this function (that the low part is actually zeroed and doesn't contain garbage).
+ uc.v_zero_i(dst_vec);
+
+ if (variation == 3u && (op == UniOpVV::kBroadcastU8 ||
+ op == UniOpVV::kBroadcastU8Z ||
+ op == UniOpVV::kBroadcastU32 ||
+ op == UniOpVV::kBroadcastU64 ||
+ op == UniOpVV::kBroadcastF32 ||
+ op == UniOpVV::kBroadcastF64)) {
+ // This is used to test broadcasts from a GP register to a vector register.
+ Gp src_gp = uc.new_gpz("src_gp");
+
+ switch (op) {
+ case UniOpVV::kBroadcastU8:
+ case UniOpVV::kBroadcastU8Z:
+ uc.load_u8(src_gp, mem_ptr(src_ptr));
+ uc.emit_2v(op, dst_vec, src_gp);
+ break;
+
+ case UniOpVV::kBroadcastU16:
+ case UniOpVV::kBroadcastU16Z:
+ uc.load_u16(src_gp, mem_ptr(src_ptr));
+ uc.emit_2v(op, dst_vec, src_gp);
+ break;
+
+ case UniOpVV::kBroadcastU32:
+ case UniOpVV::kBroadcastF32:
+ uc.load_u32(src_gp, mem_ptr(src_ptr));
+ uc.emit_2v(op, dst_vec, src_gp);
+ break;
+
+ case UniOpVV::kBroadcastU64:
+ case UniOpVV::kBroadcastF64:
+ // Prevent using 64-bit registers on 32-bit architectures (that would fail).
+ if (uc.is_64bit()) {
+ uc.load_u64(src_gp, mem_ptr(src_ptr));
+ uc.emit_2v(op, dst_vec, src_gp);
+ }
+ else {
+ uc.emit_2v(op, dst_vec, mem_ptr(src_ptr));
+ }
+ break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else if (variation == 2u) {
+ uc.emit_2v(op, dst_vec, mem_ptr(src_ptr));
+ }
+ else if (variation == 1u) {
+ uc.v_loaduvec(dst_vec, mem_ptr(src_ptr));
+ uc.emit_2v(op, dst_vec, dst_vec);
+ }
+ else {
+ Vec src_vec = uc.new_vec_with_width(vw, "src_vec");
+ uc.v_loaduvec(src_vec, mem_ptr(src_ptr));
+ uc.emit_2v(op, dst_vec, src_vec);
+ }
+
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ uc.end_func();
+ return ctx.finish<TestVVFunc>();
+}
+
+// The following variations are supported:
+// - 0 - separate destination & source registers
+// - 1 - destination register is a source register as well
+// - 2 - source is a memory operand
+static constexpr uint32_t kNumVariationsVVI = 3;
+
+static TestVVFunc create_func_vvi(JitContext& ctx, VecWidth vw, UniOpVVI op, uint32_t imm, Variation variation = Variation{0}) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(vw);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*, const void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp dst_ptr = uc.new_gpz("dst_ptr");
+ Gp src_ptr = uc.new_gpz("src_ptr");
+
+ node->set_arg(0, dst_ptr);
+ node->set_arg(1, src_ptr);
+
+ Vec src_vec = uc.new_vec_with_width(vw, "src_vec");
+
+ switch (variation.value) {
+ default:
+ case 0: {
+ // There are some instructions that fill the high part of the register, so just zero the destination to make
+ // sure that we can test this function (that the low part is actually zeroed and doesn't contain garbage).
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.v_zero_i(dst_vec);
+
+ uc.v_loaduvec(src_vec, mem_ptr(src_ptr));
+ uc.emit_2vi(op, dst_vec, src_vec, imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ break;
+ }
+
+ case 1: {
+ uc.v_loaduvec(src_vec, mem_ptr(src_ptr));
+ uc.emit_2vi(op, src_vec, src_vec, imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src_vec);
+ break;
+ }
+
+ case 2: {
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.emit_2vi(op, dst_vec, mem_ptr(src_ptr), imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+ break;
+ }
+ }
+
+ uc.end_func();
+ return ctx.finish<TestVVFunc>();
+}
+
+// The following variations are supported:
+// - 0 - separate destination & source registers
+// - 1 - destination register is the same as the first source register
+// - 2 - destination register is the same as the second source register
+// - 3 - separate destination & source registers, the second source is a memory operand
+// - 4 - destination register is the same as the first source register, second source is a memory operand
+static constexpr uint32_t kNumVariationsVVV = 5;
+
+static TestVVVFunc create_func_vvv(JitContext& ctx, VecWidth vw, UniOpVVV op, Variation variation = Variation{0}) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(vw);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*, const void*, const void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp dst_ptr = uc.new_gpz("dst_ptr");
+ Gp src1_ptr = uc.new_gpz("src1_ptr");
+ Gp src2_ptr = uc.new_gpz("src2_ptr");
+
+ node->set_arg(0, dst_ptr);
+ node->set_arg(1, src1_ptr);
+ node->set_arg(2, src2_ptr);
+
+ Vec src1_vec = uc.new_vec_with_width(vw, "src1_vec");
+ Vec src2_vec = uc.new_vec_with_width(vw, "src2_vec");
+
+ switch (variation.value) {
+ default:
+ case 0: {
+ // There are some instructions that fill the high part of the register, so just zero the destination to make
+ // sure that we can test this function (that the low part is actually zeroed and doesn't contain garbage).
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.v_zero_i(dst_vec);
+
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.emit_3v(op, dst_vec, src1_vec, src2_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ break;
+ }
+
+ case 1: {
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.emit_3v(op, src1_vec, src1_vec, src2_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src1_vec);
+
+ break;
+ }
+
+ case 2: {
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.emit_3v(op, src2_vec, src1_vec, src2_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src2_vec);
+
+ break;
+ }
+
+ case 3: {
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.v_zero_i(dst_vec);
+
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.emit_3v(op, dst_vec, src1_vec, mem_ptr(src2_ptr));
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ break;
+ }
+
+ case 4: {
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.emit_3v(op, src1_vec, src1_vec, mem_ptr(src2_ptr));
+ uc.v_storeuvec(mem_ptr(dst_ptr), src1_vec);
+
+ break;
+ }
+ }
+
+ uc.end_func();
+ return ctx.finish<TestVVVFunc>();
+}
+
+static constexpr uint32_t kNumVariationsVVVI = 5;
+
+static TestVVVFunc create_func_vvvi(JitContext& ctx, VecWidth vw, UniOpVVVI op, uint32_t imm, Variation variation = Variation{0}) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(vw);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*, const void*, const void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp dst_ptr = uc.new_gpz("dst_ptr");
+ Gp src1_ptr = uc.new_gpz("src1_ptr");
+ Gp src2_ptr = uc.new_gpz("src2_ptr");
+
+ node->set_arg(0, dst_ptr);
+ node->set_arg(1, src1_ptr);
+ node->set_arg(2, src2_ptr);
+
+ Vec src1_vec = uc.new_vec_with_width(vw, "src1_vec");
+ Vec src2_vec = uc.new_vec_with_width(vw, "src2_vec");
+
+ switch (variation.value) {
+ default:
+ case 0: {
+ // There are some instructions that fill the high part of the register, so just zero the destination to make
+ // sure that we can test this function (that the low part is actually zeroed and doesn't contain garbage).
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.v_zero_i(dst_vec);
+
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.emit_3vi(op, dst_vec, src1_vec, src2_vec, imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ break;
+ }
+
+ case 1: {
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.emit_3vi(op, src1_vec, src1_vec, src2_vec, imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src1_vec);
+
+ break;
+ }
+
+ case 2: {
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.emit_3vi(op, src2_vec, src1_vec, src2_vec, imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src2_vec);
+
+ break;
+ }
+
+ case 3: {
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.v_zero_i(dst_vec);
+
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.emit_3vi(op, dst_vec, src1_vec, mem_ptr(src2_ptr), imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ break;
+ }
+
+ case 4: {
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.emit_3vi(op, src1_vec, src1_vec, mem_ptr(src2_ptr), imm);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src1_vec);
+
+ break;
+ }
+ }
+
+ uc.end_func();
+ return ctx.finish<TestVVVFunc>();
+}
+
+// The following variations are supported:
+// - 0 - separate destination & source registers
+// - 1 - destination register is the first source register
+// - 2 - destination register is the second source register
+// - 3 - destination register is the third source register
+static constexpr uint32_t kNumVariationsVVVV = 4;
+
+static TestVVVVFunc create_func_vvvv(JitContext& ctx, VecWidth vw, UniOpVVVV op, Variation variation = Variation{0}) {
+ ctx.prepare();
+
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+ uc.init_vec_width(vw);
+
+ FuncNode* node = uc.add_func(FuncSignature::build<void, void*, const void*, const void*, const void*>());
+ EXPECT_NOT_NULL(node);
+
+ Gp dst_ptr = uc.new_gpz("dst_ptr");
+ Gp src1_ptr = uc.new_gpz("src1_ptr");
+ Gp src2_ptr = uc.new_gpz("src2_ptr");
+ Gp src3_ptr = uc.new_gpz("src3_ptr");
+
+ node->set_arg(0, dst_ptr);
+ node->set_arg(1, src1_ptr);
+ node->set_arg(2, src2_ptr);
+ node->set_arg(3, src3_ptr);
+
+ Vec src1_vec = uc.new_vec_with_width(vw, "src1_vec");
+ Vec src2_vec = uc.new_vec_with_width(vw, "src2_vec");
+ Vec src3_vec = uc.new_vec_with_width(vw, "src3_vec");
+
+ uc.v_loaduvec(src1_vec, mem_ptr(src1_ptr));
+ uc.v_loaduvec(src2_vec, mem_ptr(src2_ptr));
+ uc.v_loaduvec(src3_vec, mem_ptr(src3_ptr));
+
+ switch (variation.value) {
+ default:
+ case 0: {
+ // There are some instructions that fill the high part of the register, so just zero the destination to make
+ // sure that we can test this function (that the low part is actually zeroed and doesn't contain garbage).
+ Vec dst_vec = uc.new_vec_with_width(vw, "dst_vec");
+ uc.v_zero_i(dst_vec);
+
+ uc.emit_4v(op, dst_vec, src1_vec, src2_vec, src3_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), dst_vec);
+
+ break;
+ }
+
+ case 1: {
+ uc.emit_4v(op, src1_vec, src1_vec, src2_vec, src3_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src1_vec);
+
+ break;
+ }
+
+ case 2: {
+ uc.emit_4v(op, src2_vec, src1_vec, src2_vec, src3_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src2_vec);
+
+ break;
+ }
+
+ case 3: {
+ uc.emit_4v(op, src3_vec, src1_vec, src2_vec, src3_vec);
+ uc.v_storeuvec(mem_ptr(dst_ptr), src3_vec);
+
+ break;
+ }
+ }
+
+ uc.end_func();
+ return ctx.finish<TestVVVVFunc>();
+}
+// ujit::UniCompiler - Tests - SIMD - Vector Overlay
+// =================================================
+
+enum class VecElementType : uint8_t {
+ kInt8,
+ kInt16,
+ kInt32,
+ kInt64,
+ kUInt8,
+ kUInt16,
+ kUInt32,
+ kUInt64,
+ kFloat32,
+ kFloat64
+};
+
+struct VecOpInfo {
+ uint32_t _data;
+
+ ASMJIT_INLINE_NODEBUG uint32_t count() const noexcept { return _data >> 28; }
+
+ ASMJIT_INLINE_NODEBUG VecElementType ret() const noexcept { return VecElementType((_data >> 24) & 0xFu); }
+ ASMJIT_INLINE_NODEBUG VecElementType arg(uint32_t i) const noexcept { return VecElementType((_data >> (i * 4)) & 0xFu); }
+
+ static ASMJIT_INLINE_NODEBUG VecOpInfo make(VecElementType ret, VecElementType arg0) noexcept {
+ return VecOpInfo{(1u << 28) | (uint32_t(ret) << 24) | uint32_t(arg0)};
+ }
+
+ static ASMJIT_INLINE_NODEBUG VecOpInfo make(VecElementType ret, VecElementType arg0, VecElementType arg1) noexcept {
+ return VecOpInfo{(1u << 28) | (uint32_t(ret) << 24) | uint32_t(arg0) | (uint32_t(arg1) << 4)};
+ }
+
+ static ASMJIT_INLINE_NODEBUG VecOpInfo make(VecElementType ret, VecElementType arg0, VecElementType arg1, VecElementType arg2) noexcept {
+ return VecOpInfo{(1u << 28) | (uint32_t(ret) << 24) | uint32_t(arg0) | (uint32_t(arg1) << 4) | (uint32_t(arg2) << 8)};
+ }
+
+ static ASMJIT_INLINE_NODEBUG VecOpInfo make(VecElementType ret, VecElementType arg0, VecElementType arg1, VecElementType arg2, VecElementType arg3) noexcept {
+ return VecOpInfo{(1u << 28) | (uint32_t(ret) << 24) | uint32_t(arg0) | (uint32_t(arg1) << 4) | (uint32_t(arg2) << 8) | (uint32_t(arg3) << 12)};
+ }
+};
+
+template<uint32_t kW>
+struct alignas(16) VecOverlay {
+ union {
+ int8_t data_i8[kW];
+ uint8_t data_u8[kW];
+
+ int16_t data_i16[kW / 2u];
+ uint16_t data_u16[kW / 2u];
+
+ int32_t data_i32[kW / 4u];
+ uint32_t data_u32[kW / 4u];
+
+ int64_t data_i64[kW / 8u];
+ uint64_t data_u64[kW / 8u];
+
+ float data_f32[kW / 4u];
+ double data_f64[kW / 8u];
+ };
+
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG T* data() noexcept;
+
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG const T* data() const noexcept;
+
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG T get(size_t index) const noexcept;
+
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG void set(size_t index, const T& value) noexcept;
+
+ template<uint32_t kOtherW>
+ ASMJIT_INLINE_NODEBUG void copy_16b_from(const VecOverlay<kOtherW>& other) noexcept {
+ data_u64[0] = other.data_u64[0];
+ data_u64[1] = other.data_u64[1];
+ }
+};
+
+template<typename T>
+struct VecAccess;
+
+template<>
+struct VecAccess<int8_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int8_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_i8; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const int8_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_i8; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int8_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_i8[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, int8_t value) noexcept { vec.data_i8[index] = value; }
+};
+
+template<>
+struct VecAccess<int16_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int16_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_i16; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const int16_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_i16; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int16_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_i16[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, int16_t value) noexcept { vec.data_i16[index] = value; }
+};
+
+template<>
+struct VecAccess<int32_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int32_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_i32; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const int32_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_i32; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int32_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_i32[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, int32_t value) noexcept { vec.data_i32[index] = value; }
+};
+
+template<>
+struct VecAccess<int64_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int64_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_i64; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const int64_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_i64; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG int64_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_i64[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, int64_t value) noexcept { vec.data_i64[index] = value; }
+};
+
+template<>
+struct VecAccess<uint8_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint8_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_u8; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const uint8_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_u8; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint8_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_u8[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, uint8_t value) noexcept { vec.data_u8[index] = value; }
+};
+
+template<>
+struct VecAccess<uint16_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint16_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_u16; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const uint16_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_u16; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint16_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_u16[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, uint16_t value) noexcept { vec.data_u16[index] = value; }
+};
+
+template<>
+struct VecAccess<uint32_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint32_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_u32; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const uint32_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_u32; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint32_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_u32[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, uint32_t value) noexcept { vec.data_u32[index] = value; }
+};
+
+template<>
+struct VecAccess<uint64_t> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint64_t* data(VecOverlay<kW>& vec) noexcept { return vec.data_u64; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const uint64_t* data(const VecOverlay<kW>& vec) noexcept { return vec.data_u64; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG uint64_t get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_u64[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, uint64_t value) noexcept { vec.data_u64[index] = value; }
+};
+
+template<>
+struct VecAccess<float> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG float* data(VecOverlay<kW>& vec) noexcept { return vec.data_f32; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const float* data(const VecOverlay<kW>& vec) noexcept { return vec.data_f32; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG float get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_f32[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, float value) noexcept { vec.data_f32[index] = value; }
+};
+
+template<>
+struct VecAccess<double> {
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG double* data(VecOverlay<kW>& vec) noexcept { return vec.data_f64; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG const double* data(const VecOverlay<kW>& vec) noexcept { return vec.data_f64; }
+
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG double get(const VecOverlay<kW>& vec, size_t index) noexcept { return vec.data_f64[index]; }
+ template<uint32_t kW> static ASMJIT_INLINE_NODEBUG void set(VecOverlay<kW>& vec, size_t index, double value) noexcept { vec.data_f64[index] = value; }
+};
+
+template<uint32_t kW>
+template<typename T>
+ASMJIT_INLINE_NODEBUG T* VecOverlay<kW>::data() noexcept { return VecAccess<T>::data(*this); }
+
+template<uint32_t kW>
+template<typename T>
+ASMJIT_INLINE_NODEBUG const T* VecOverlay<kW>::data() const noexcept { return VecAccess<T>::data(*this); }
+
+template<uint32_t kW>
+template<typename T>
+ASMJIT_INLINE_NODEBUG T VecOverlay<kW>::get(size_t index) const noexcept { return VecAccess<T>::get(*this, index); }
+
+template<uint32_t kW>
+template<typename T>
+ASMJIT_INLINE_NODEBUG void VecOverlay<kW>::set(size_t index, const T& value) noexcept { return VecAccess<T>::set(*this, index, value); }
+
+template<typename T> struct TypeNameToString {};
+template<> struct TypeNameToString<int8_t > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "int8"; } };
+template<> struct TypeNameToString<int16_t > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "int16"; } };
+template<> struct TypeNameToString<int32_t > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "int32"; } };
+template<> struct TypeNameToString<int64_t > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "int64"; } };
+template<> struct TypeNameToString<uint8_t > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "uint8"; } };
+template<> struct TypeNameToString<uint16_t> { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "uint16"; } };
+template<> struct TypeNameToString<uint32_t> { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "uint32"; } };
+template<> struct TypeNameToString<uint64_t> { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "uint64"; } };
+template<> struct TypeNameToString<float > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "float32"; } };
+template<> struct TypeNameToString<double > { static ASMJIT_INLINE_NODEBUG const char* get() noexcept { return "float64"; } };
+
+template<uint32_t kW>
+static bool vec_eq(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ return memcmp(a.data_u8, b.data_u8, kW) == 0;
+}
+
+template<typename T>
+static bool float_eq(const T& a, const T& b) noexcept {
+ return a == b || (std::isnan(a) && std::isnan(b));
+}
+
+template<uint32_t kW>
+static bool vec_eq(const VecOverlay<kW>& a, const VecOverlay<kW>& b, VecElementType element_type) noexcept {
+ if (element_type == VecElementType::kFloat32) {
+ size_t count = kW / sizeof(float);
+ for (size_t i = 0; i < count; i++) {
+ if (!float_eq(a.data_f32[i], b.data_f32[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ else if (element_type == VecElementType::kFloat64) {
+ size_t count = kW / sizeof(double);
+ for (size_t i = 0; i < count; i++) {
+ if (!float_eq(a.data_f64[i], b.data_f64[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ else {
+ return vec_eq(a, b);
+ }
+}
+
+template<uint32_t kW>
+static ASMJIT_NOINLINE String vec_stringify(const VecOverlay<kW>& vec, VecElementType element_type) noexcept {
+ String s;
+ s.append('{');
+
+ switch (element_type) {
+ case VecElementType::kInt8 : { for (uint32_t i = 0; i < kW ; i++) s.append_format("%s%d" , i == 0 ? "" : ", ", vec.data_i8[i]); break; }
+ case VecElementType::kInt16 : { for (uint32_t i = 0; i < kW / 2; i++) s.append_format("%s%d" , i == 0 ? "" : ", ", vec.data_i16[i]); break; }
+ case VecElementType::kInt32 : { for (uint32_t i = 0; i < kW / 4; i++) s.append_format("%s%d" , i == 0 ? "" : ", ", vec.data_i32[i]); break; }
+ case VecElementType::kInt64 : { for (uint32_t i = 0; i < kW / 8; i++) s.append_format("%s%lld", i == 0 ? "" : ", ", (long long)vec.data_i64[i]); break; }
+ case VecElementType::kUInt8 : { for (uint32_t i = 0; i < kW ; i++) s.append_format("%s%u" , i == 0 ? "" : ", ", vec.data_u8[i]); break; }
+ case VecElementType::kUInt16 : { for (uint32_t i = 0; i < kW / 2; i++) s.append_format("%s%u" , i == 0 ? "" : ", ", vec.data_u16[i]); break; }
+ case VecElementType::kUInt32 : { for (uint32_t i = 0; i < kW / 4; i++) s.append_format("%s%u" , i == 0 ? "" : ", ", vec.data_u32[i]); break; }
+ case VecElementType::kUInt64 : { for (uint32_t i = 0; i < kW / 8; i++) s.append_format("%s%llu", i == 0 ? "" : ", ", (unsigned long long)vec.data_u64[i]); break; }
+ case VecElementType::kFloat32: { for (uint32_t i = 0; i < kW / 4; i++) s.append_format("%s%.20f" , i == 0 ? "" : ", ", double(vec.data_f32[i])); break; }
+ case VecElementType::kFloat64: { for (uint32_t i = 0; i < kW / 8; i++) s.append_format("%s%.20f" , i == 0 ? "" : ", ", double(vec.data_f64[i])); break; }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ s.append('}');
+ return s;
+}
+
+// ujit::UniCompiler - Tests - SIMD - Metadata
+// ===========================================
+
+static const char* vec_op_name_vv(UniOpVV op) noexcept {
+ switch (op) {
+ case UniOpVV::kMov : return "v_mov";
+ case UniOpVV::kMovU64 : return "v_mov_u64";
+ case UniOpVV::kBroadcastU8Z : return "v_broadcast_u8z";
+ case UniOpVV::kBroadcastU16Z : return "v_broadcast_u16z";
+ case UniOpVV::kBroadcastU8 : return "v_broadcast_u8";
+ case UniOpVV::kBroadcastU16 : return "v_broadcast_u16";
+ case UniOpVV::kBroadcastU32 : return "v_broadcast_u32";
+ case UniOpVV::kBroadcastU64 : return "v_broadcast_u64";
+ case UniOpVV::kBroadcastF32 : return "v_broadcast_f32";
+ case UniOpVV::kBroadcastF64 : return "v_broadcast_f64";
+ case UniOpVV::kBroadcastV128_U32 : return "v_broadcast_v128_u32";
+ case UniOpVV::kBroadcastV128_U64 : return "v_broadcast_v128_u64";
+ case UniOpVV::kBroadcastV128_F32 : return "v_broadcast_v128_f32";
+ case UniOpVV::kBroadcastV128_F64 : return "v_broadcast_v128_f64";
+ case UniOpVV::kBroadcastV256_U32 : return "v_broadcast_v256_u32";
+ case UniOpVV::kBroadcastV256_U64 : return "v_broadcast_v256_u64";
+ case UniOpVV::kBroadcastV256_F32 : return "v_broadcast_v256_f32";
+ case UniOpVV::kBroadcastV256_F64 : return "v_broadcast_v256_f64";
+ case UniOpVV::kAbsI8 : return "v_abs_i8";
+ case UniOpVV::kAbsI16 : return "v_abs_i16";
+ case UniOpVV::kAbsI32 : return "v_abs_i32";
+ case UniOpVV::kAbsI64 : return "v_abs_i64";
+ case UniOpVV::kNotU32 : return "v_not_u32";
+ case UniOpVV::kNotU64 : return "v_not_u64";
+ case UniOpVV::kCvtI8LoToI16 : return "v_cvt_i8_lo_to_i16";
+ case UniOpVV::kCvtI8HiToI16 : return "v_cvt_i8_hi_to_i16";
+ case UniOpVV::kCvtU8LoToU16 : return "v_cvt_u8_lo_to_u16";
+ case UniOpVV::kCvtU8HiToU16 : return "v_cvt_u8_hi_to_u16";
+ case UniOpVV::kCvtI8ToI32 : return "v_cvt_i8_to_i32";
+ case UniOpVV::kCvtU8ToU32 : return "v_cvt_u8_to_u32";
+ case UniOpVV::kCvtI16LoToI32 : return "v_cvt_i16_lo_to_i32";
+ case UniOpVV::kCvtI16HiToI32 : return "v_cvt_i16_hi_to_i32";
+ case UniOpVV::kCvtU16LoToU32 : return "v_cvt_u16_lo_to_u32";
+ case UniOpVV::kCvtU16HiToU32 : return "v_cvt_u16_hi_to_u32";
+ case UniOpVV::kCvtI32LoToI64 : return "v_cvt_i32_lo_to_i64";
+ case UniOpVV::kCvtI32HiToI64 : return "v_cvt_i32_hi_to_i64";
+ case UniOpVV::kCvtU32LoToU64 : return "v_cvt_u32_lo_to_u64";
+ case UniOpVV::kCvtU32HiToU64 : return "v_cvt_u32_hi_to_u64";
+ case UniOpVV::kAbsF32S : return "s_abs_f32";
+ case UniOpVV::kAbsF64S : return "s_abs_f64";
+ case UniOpVV::kAbsF32 : return "v_abs_f32";
+ case UniOpVV::kAbsF64 : return "v_abs_f64";
+ case UniOpVV::kNegF32S : return "s_neg_f32";
+ case UniOpVV::kNegF64S : return "s_neg_f64";
+ case UniOpVV::kNegF32 : return "v_neg_f32";
+ case UniOpVV::kNegF64 : return "v_neg_f64";
+ case UniOpVV::kNotF32 : return "v_not_f32";
+ case UniOpVV::kNotF64 : return "v_not_f64";
+ case UniOpVV::kTruncF32S : return "v_trunc_f32s";
+ case UniOpVV::kTruncF64S : return "v_trunc_f64s";
+ case UniOpVV::kTruncF32 : return "v_trunc_f32";
+ case UniOpVV::kTruncF64 : return "v_trunc_f64";
+ case UniOpVV::kFloorF32S : return "v_floor_f32s";
+ case UniOpVV::kFloorF64S : return "v_floor_f64s";
+ case UniOpVV::kFloorF32 : return "v_floor_f32";
+ case UniOpVV::kFloorF64 : return "v_floor_f64";
+ case UniOpVV::kCeilF32S : return "v_ceil_f32s";
+ case UniOpVV::kCeilF64S : return "v_ceil_f64s";
+ case UniOpVV::kCeilF32 : return "v_ceil_f32";
+ case UniOpVV::kCeilF64 : return "v_ceil_f64";
+ case UniOpVV::kRoundEvenF32S : return "v_round_even_f32s";
+ case UniOpVV::kRoundEvenF64S : return "v_round_even_f64s";
+ case UniOpVV::kRoundEvenF32 : return "v_round_even_f32";
+ case UniOpVV::kRoundEvenF64 : return "v_round_even_f64";
+ case UniOpVV::kRoundHalfAwayF32S : return "v_round_half_away_f32s";
+ case UniOpVV::kRoundHalfAwayF64S : return "v_round_half_away_f64s";
+ case UniOpVV::kRoundHalfAwayF32 : return "v_round_half_away_f32";
+ case UniOpVV::kRoundHalfAwayF64 : return "v_round_half_away_f64";
+ case UniOpVV::kRoundHalfUpF32S : return "v_round_half_up_f32s";
+ case UniOpVV::kRoundHalfUpF64S : return "v_round_half_up_f64s";
+ case UniOpVV::kRoundHalfUpF32 : return "v_round_half_up_f32";
+ case UniOpVV::kRoundHalfUpF64 : return "v_round_half_up_f64";
+ case UniOpVV::kRcpF32 : return "v_rcp_f32";
+ case UniOpVV::kRcpF64 : return "v_rcp_f64";
+ case UniOpVV::kSqrtF32S : return "v_sqrt_f32s";
+ case UniOpVV::kSqrtF64S : return "v_sqrt_f64s";
+ case UniOpVV::kSqrtF32 : return "v_sqrt_f32";
+ case UniOpVV::kSqrtF64 : return "v_sqrt_f64";
+ case UniOpVV::kCvtF32ToF64S : return "v_cvt_f32_to_f64s";
+ case UniOpVV::kCvtF64ToF32S : return "v_cvt_f64_to_f32s";
+ case UniOpVV::kCvtI32ToF32 : return "v_cvt_i32_to_f32";
+ case UniOpVV::kCvtF32LoToF64 : return "v_cvt_f32_lo_to_f64";
+ case UniOpVV::kCvtF32HiToF64 : return "v_cvt_f32_hi_to_f64";
+ case UniOpVV::kCvtF64ToF32Lo : return "v_cvt_f64_to_f32_lo";
+ case UniOpVV::kCvtF64ToF32Hi : return "v_cvt_f64_to_f32_hi";
+ case UniOpVV::kCvtI32LoToF64 : return "v_cvt_i32_lo_to_f64";
+ case UniOpVV::kCvtI32HiToF64 : return "v_cvt_i32_hi_to_f64";
+ case UniOpVV::kCvtTruncF32ToI32 : return "v_cvt_trunc_f32_to_i32";
+ case UniOpVV::kCvtTruncF64ToI32Lo: return "v_cvt_trunc_f64_to_i32_lo";
+ case UniOpVV::kCvtTruncF64ToI32Hi: return "v_cvt_trunc_f64_to_i32_hi";
+ case UniOpVV::kCvtRoundF32ToI32 : return "v_cvt_round_f32_to_i32";
+ case UniOpVV::kCvtRoundF64ToI32Lo: return "v_cvt_round_f64_to_i32_lo";
+ case UniOpVV::kCvtRoundF64ToI32Hi: return "v_cvt_round_f64_to_i32_hi";
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static VecOpInfo vec_op_info_vv(UniOpVV op) noexcept {
+ using VE = VecElementType;
+
+ switch (op) {
+ case UniOpVV::kMov : return VecOpInfo::make(VE::kUInt8, VE::kUInt8);
+ case UniOpVV::kMovU64 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8);
+ case UniOpVV::kBroadcastU8Z : return VecOpInfo::make(VE::kUInt8, VE::kUInt8);
+ case UniOpVV::kBroadcastU16Z : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVV::kBroadcastU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8);
+ case UniOpVV::kBroadcastU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVV::kBroadcastU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVV::kBroadcastU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVV::kBroadcastF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kBroadcastF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kBroadcastV128_U32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVV::kBroadcastV128_U64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVV::kBroadcastV128_F32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kBroadcastV128_F64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kBroadcastV256_U32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVV::kBroadcastV256_U64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVV::kBroadcastV256_F32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kBroadcastV256_F64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kAbsI8 : return VecOpInfo::make(VE::kUInt8, VE::kInt8);
+ case UniOpVV::kAbsI16 : return VecOpInfo::make(VE::kUInt16, VE::kInt16);
+ case UniOpVV::kAbsI32 : return VecOpInfo::make(VE::kUInt32, VE::kInt32);
+ case UniOpVV::kAbsI64 : return VecOpInfo::make(VE::kUInt64, VE::kInt64);
+ case UniOpVV::kNotU32 : return VecOpInfo::make(VE::kUInt32, VE::kInt32);
+ case UniOpVV::kNotU64 : return VecOpInfo::make(VE::kUInt64, VE::kInt64);
+ case UniOpVV::kCvtI8LoToI16 : return VecOpInfo::make(VE::kInt16, VE::kInt8);
+ case UniOpVV::kCvtI8HiToI16 : return VecOpInfo::make(VE::kInt16, VE::kInt8);
+ case UniOpVV::kCvtU8LoToU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt8);
+ case UniOpVV::kCvtU8HiToU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt8);
+ case UniOpVV::kCvtI8ToI32 : return VecOpInfo::make(VE::kInt32, VE::kInt8);
+ case UniOpVV::kCvtU8ToU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt8);
+ case UniOpVV::kCvtI16LoToI32 : return VecOpInfo::make(VE::kInt32, VE::kInt16);
+ case UniOpVV::kCvtI16HiToI32 : return VecOpInfo::make(VE::kInt32, VE::kInt16);
+ case UniOpVV::kCvtU16LoToU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt16);
+ case UniOpVV::kCvtU16HiToU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt16);
+ case UniOpVV::kCvtI32LoToI64 : return VecOpInfo::make(VE::kInt64, VE::kInt32);
+ case UniOpVV::kCvtI32HiToI64 : return VecOpInfo::make(VE::kInt64, VE::kInt32);
+ case UniOpVV::kCvtU32LoToU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt32);
+ case UniOpVV::kCvtU32HiToU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt32);
+ case UniOpVV::kAbsF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kAbsF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kAbsF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kAbsF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kNegF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kNegF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kNegF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kNegF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kNotF32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVV::kNotF64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVV::kTruncF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kTruncF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kTruncF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kTruncF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kFloorF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kFloorF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kFloorF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kFloorF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kCeilF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kCeilF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kCeilF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kCeilF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRoundEvenF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRoundEvenF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRoundEvenF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRoundEvenF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRoundHalfAwayF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRoundHalfAwayF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRoundHalfAwayF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRoundHalfAwayF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRoundHalfUpF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRoundHalfUpF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRoundHalfUpF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRoundHalfUpF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kRcpF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kRcpF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kSqrtF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kSqrtF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kSqrtF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVV::kSqrtF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVV::kCvtF32ToF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat32);
+ case UniOpVV::kCvtF64ToF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat64);
+ case UniOpVV::kCvtI32ToF32 : return VecOpInfo::make(VE::kFloat32, VE::kInt32);
+ case UniOpVV::kCvtF32LoToF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat32);
+ case UniOpVV::kCvtF32HiToF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat32);
+ case UniOpVV::kCvtF64ToF32Lo : return VecOpInfo::make(VE::kFloat32, VE::kFloat64);
+ case UniOpVV::kCvtF64ToF32Hi : return VecOpInfo::make(VE::kFloat32, VE::kFloat64);
+ case UniOpVV::kCvtI32LoToF64 : return VecOpInfo::make(VE::kFloat64, VE::kInt32);
+ case UniOpVV::kCvtI32HiToF64 : return VecOpInfo::make(VE::kFloat64, VE::kInt32);
+ case UniOpVV::kCvtTruncF32ToI32 : return VecOpInfo::make(VE::kInt32, VE::kFloat32);
+ case UniOpVV::kCvtTruncF64ToI32Lo: return VecOpInfo::make(VE::kInt32, VE::kFloat64);
+ case UniOpVV::kCvtTruncF64ToI32Hi: return VecOpInfo::make(VE::kInt32, VE::kFloat64);
+ case UniOpVV::kCvtRoundF32ToI32 : return VecOpInfo::make(VE::kInt32, VE::kFloat32);
+ case UniOpVV::kCvtRoundF64ToI32Lo: return VecOpInfo::make(VE::kInt32, VE::kFloat64);
+ case UniOpVV::kCvtRoundF64ToI32Hi: return VecOpInfo::make(VE::kInt32, VE::kFloat64);
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static const char* vec_op_name_vvi(UniOpVVI op) noexcept {
+ switch (op) {
+ case UniOpVVI::kSllU16 : return "v_sll_u16";
+ case UniOpVVI::kSllU32 : return "v_sll_u32";
+ case UniOpVVI::kSllU64 : return "v_sll_u64";
+ case UniOpVVI::kSrlU16 : return "v_srl_u16";
+ case UniOpVVI::kSrlU32 : return "v_srl_u32";
+ case UniOpVVI::kSrlU64 : return "v_srl_u64";
+ case UniOpVVI::kSraI16 : return "v_sra_i16";
+ case UniOpVVI::kSraI32 : return "v_sra_i32";
+ case UniOpVVI::kSraI64 : return "v_sra_i64";
+ case UniOpVVI::kSllbU128 : return "v_sllb_u128";
+ case UniOpVVI::kSrlbU128 : return "v_srlb_u128";
+ case UniOpVVI::kSwizzleU16x4 : return "v_swizzle_u16x4";
+ case UniOpVVI::kSwizzleLoU16x4 : return "v_swizzle_lo_u16x4";
+ case UniOpVVI::kSwizzleHiU16x4 : return "v_swizzle_hi_u16x4";
+ case UniOpVVI::kSwizzleU32x4 : return "v_swizzle_u32x4";
+ case UniOpVVI::kSwizzleU64x2 : return "v_swizzle_u64x2";
+ case UniOpVVI::kSwizzleF32x4 : return "v_swizzle_f32x4";
+ case UniOpVVI::kSwizzleF64x2 : return "v_swizzle_f64x2";
+ case UniOpVVI::kSwizzleU64x4 : return "v_swizzle_u64x4";
+ case UniOpVVI::kSwizzleF64x4 : return "v_swizzle_f64x4";
+ case UniOpVVI::kExtractV128_I32: return "v_extract_v128_i32";
+ case UniOpVVI::kExtractV128_I64: return "v_extract_v128_i64";
+ case UniOpVVI::kExtractV128_F32: return "v_extract_v128_f32";
+ case UniOpVVI::kExtractV128_F64: return "v_extract_v128_f64";
+ case UniOpVVI::kExtractV256_I32: return "v_extract_v256_i32";
+ case UniOpVVI::kExtractV256_I64: return "v_extract_v256_i64";
+ case UniOpVVI::kExtractV256_F32: return "v_extract_v256_f32";
+ case UniOpVVI::kExtractV256_F64: return "v_extract_v256_f64";
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ case UniOpVVI::kSrlRndU16 : return "v_srl_rnd_u16";
+ case UniOpVVI::kSrlRndU32 : return "v_srl_rnd_u32";
+ case UniOpVVI::kSrlRndU64 : return "v_srl_rnd_u64";
+ case UniOpVVI::kSrlAccU16 : return "v_srl_acc_u16";
+ case UniOpVVI::kSrlAccU32 : return "v_srl_acc_u32";
+ case UniOpVVI::kSrlAccU64 : return "v_srl_acc_u64";
+ case UniOpVVI::kSrlRndAccU16 : return "v_srl_rnd_acc_u16";
+ case UniOpVVI::kSrlRndAccU32 : return "v_srl_rnd_acc_u32";
+ case UniOpVVI::kSrlRndAccU64 : return "v_srl_rnd_acc_u64";
+ case UniOpVVI::kSrlnLoU16 : return "v_srln_lo_u16";
+ case UniOpVVI::kSrlnHiU16 : return "v_srln_hi_u16";
+ case UniOpVVI::kSrlnLoU32 : return "v_srln_lo_u32";
+ case UniOpVVI::kSrlnHiU32 : return "v_srln_hi_u32";
+ case UniOpVVI::kSrlnLoU64 : return "v_srln_lo_u64";
+ case UniOpVVI::kSrlnHiU64 : return "v_srln_hi_u64";
+ case UniOpVVI::kSrlnRndLoU16 : return "v_srln_rnd_lo_u16";
+ case UniOpVVI::kSrlnRndHiU16 : return "v_srln_rnd_hi_u16";
+ case UniOpVVI::kSrlnRndLoU32 : return "v_srln_rnd_lo_u32";
+ case UniOpVVI::kSrlnRndHiU32 : return "v_srln_rnd_hi_u32";
+ case UniOpVVI::kSrlnRndLoU64 : return "v_srln_rnd_lo_u64";
+ case UniOpVVI::kSrlnRndHiU64 : return "v_srln_rnd_hi_u64";
+#endif // ASMJIT_UJIT_AARCH64
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static VecOpInfo vec_op_info_vvi(UniOpVVI op) noexcept {
+ using VE = VecElementType;
+
+ switch (op) {
+ case UniOpVVI::kSllU16 : return VecOpInfo::make(VE::kUInt16 , VE::kUInt16);
+ case UniOpVVI::kSllU32 : return VecOpInfo::make(VE::kUInt32 , VE::kUInt32);
+ case UniOpVVI::kSllU64 : return VecOpInfo::make(VE::kUInt64 , VE::kUInt64);
+ case UniOpVVI::kSrlU16 : return VecOpInfo::make(VE::kUInt16 , VE::kUInt16);
+ case UniOpVVI::kSrlU32 : return VecOpInfo::make(VE::kUInt32 , VE::kUInt32);
+ case UniOpVVI::kSrlU64 : return VecOpInfo::make(VE::kUInt64 , VE::kUInt64);
+ case UniOpVVI::kSraI16 : return VecOpInfo::make(VE::kInt16 , VE::kInt16);
+ case UniOpVVI::kSraI32 : return VecOpInfo::make(VE::kInt32 , VE::kInt32);
+ case UniOpVVI::kSraI64 : return VecOpInfo::make(VE::kInt64 , VE::kInt64);
+ case UniOpVVI::kSllbU128 : return VecOpInfo::make(VE::kUInt8 , VE::kUInt8);
+ case UniOpVVI::kSrlbU128 : return VecOpInfo::make(VE::kUInt8 , VE::kUInt8);
+ case UniOpVVI::kSwizzleU16x4 : return VecOpInfo::make(VE::kUInt16 , VE::kUInt16);
+ case UniOpVVI::kSwizzleLoU16x4 : return VecOpInfo::make(VE::kUInt16 , VE::kUInt16);
+ case UniOpVVI::kSwizzleHiU16x4 : return VecOpInfo::make(VE::kUInt16 , VE::kUInt16);
+ case UniOpVVI::kSwizzleU32x4 : return VecOpInfo::make(VE::kUInt32 , VE::kUInt32);
+ case UniOpVVI::kSwizzleU64x2 : return VecOpInfo::make(VE::kUInt64 , VE::kUInt64);
+ case UniOpVVI::kSwizzleF32x4 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVVI::kSwizzleF64x2 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVVI::kSwizzleU64x4 : return VecOpInfo::make(VE::kUInt64 , VE::kUInt64);
+ case UniOpVVI::kSwizzleF64x4 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVVI::kExtractV128_I32: return VecOpInfo::make(VE::kInt32 , VE::kInt32);
+ case UniOpVVI::kExtractV128_I64: return VecOpInfo::make(VE::kInt64 , VE::kInt64);
+ case UniOpVVI::kExtractV128_F32: return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVVI::kExtractV128_F64: return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+ case UniOpVVI::kExtractV256_I32: return VecOpInfo::make(VE::kUInt32 , VE::kUInt32);
+ case UniOpVVI::kExtractV256_I64: return VecOpInfo::make(VE::kUInt64 , VE::kUInt64);
+ case UniOpVVI::kExtractV256_F32: return VecOpInfo::make(VE::kFloat32, VE::kFloat32);
+ case UniOpVVI::kExtractV256_F64: return VecOpInfo::make(VE::kFloat64, VE::kFloat64);
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ case UniOpVVI::kSrlRndU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVVI::kSrlRndU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVVI::kSrlRndU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVVI::kSrlAccU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVVI::kSrlAccU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVVI::kSrlAccU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVVI::kSrlRndAccU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVVI::kSrlRndAccU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVVI::kSrlRndAccU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVVI::kSrlnLoU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVVI::kSrlnHiU16 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVVI::kSrlnLoU32 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVVI::kSrlnHiU32 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16);
+ case UniOpVVI::kSrlnLoU64 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32);
+ case UniOpVVI::kSrlnHiU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64);
+ case UniOpVVI::kSrlnRndLoU16 : return VecOpInfo::make(VE::kUInt8 , VE::kUInt16);
+ case UniOpVVI::kSrlnRndHiU16 : return VecOpInfo::make(VE::kUInt8 , VE::kUInt16);
+ case UniOpVVI::kSrlnRndLoU32 : return VecOpInfo::make(VE::kUInt16, VE::kUInt32);
+ case UniOpVVI::kSrlnRndHiU32 : return VecOpInfo::make(VE::kUInt16, VE::kUInt32);
+ case UniOpVVI::kSrlnRndLoU64 : return VecOpInfo::make(VE::kUInt32, VE::kUInt64);
+ case UniOpVVI::kSrlnRndHiU64 : return VecOpInfo::make(VE::kUInt32, VE::kUInt64);
+#endif // ASMJIT_UJIT_AARCH64
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static const char* vec_op_name_vvv(UniOpVVV op) noexcept {
+ switch (op) {
+ case UniOpVVV::kAndU32 : return "v_and_u32";
+ case UniOpVVV::kAndU64 : return "v_and_u64";
+ case UniOpVVV::kOrU32 : return "v_or_u32";
+ case UniOpVVV::kOrU64 : return "v_or_u64";
+ case UniOpVVV::kXorU32 : return "v_xor_u32";
+ case UniOpVVV::kXorU64 : return "v_xor_u64";
+ case UniOpVVV::kAndnU32 : return "v_andn_u32";
+ case UniOpVVV::kAndnU64 : return "v_andn_u64";
+ case UniOpVVV::kBicU32 : return "v_bic_u32";
+ case UniOpVVV::kBicU64 : return "v_bic_u64";
+ case UniOpVVV::kAvgrU8 : return "v_avgr_u8";
+ case UniOpVVV::kAvgrU16 : return "v_avgr_u16";
+ case UniOpVVV::kAddU8 : return "v_add_u8";
+ case UniOpVVV::kAddU16 : return "v_add_u16";
+ case UniOpVVV::kAddU32 : return "v_add_u32";
+ case UniOpVVV::kAddU64 : return "v_add_u64";
+ case UniOpVVV::kSubU8 : return "v_sub_u8";
+ case UniOpVVV::kSubU16 : return "v_sub_u16";
+ case UniOpVVV::kSubU32 : return "v_sub_u32";
+ case UniOpVVV::kSubU64 : return "v_sub_u64";
+ case UniOpVVV::kAddsI8 : return "v_adds_i8";
+ case UniOpVVV::kAddsU8 : return "v_adds_u8";
+ case UniOpVVV::kAddsI16 : return "v_adds_i16";
+ case UniOpVVV::kAddsU16 : return "v_adds_u16";
+ case UniOpVVV::kSubsI8 : return "v_subs_i8";
+ case UniOpVVV::kSubsU8 : return "v_subs_u8";
+ case UniOpVVV::kSubsI16 : return "v_subs_i16";
+ case UniOpVVV::kSubsU16 : return "v_subs_u16";
+ case UniOpVVV::kMulU16 : return "v_mul_u16";
+ case UniOpVVV::kMulU32 : return "v_mul_u32";
+ case UniOpVVV::kMulU64 : return "v_mul_u64";
+ case UniOpVVV::kMulhI16 : return "v_mulh_i16";
+ case UniOpVVV::kMulhU16 : return "v_mulh_u16";
+ case UniOpVVV::kMulU64_LoU32 : return "v_mul_u64_lo_u32";
+ case UniOpVVV::kMHAddI16_I32 : return "v_mhadd_i16_i32";
+ case UniOpVVV::kMinI8 : return "v_min_i8";
+ case UniOpVVV::kMinU8 : return "v_min_u8";
+ case UniOpVVV::kMinI16 : return "v_min_i16";
+ case UniOpVVV::kMinU16 : return "v_min_u16";
+ case UniOpVVV::kMinI32 : return "v_min_i32";
+ case UniOpVVV::kMinU32 : return "v_min_u32";
+ case UniOpVVV::kMinI64 : return "v_min_i64";
+ case UniOpVVV::kMinU64 : return "v_min_u64";
+ case UniOpVVV::kMaxI8 : return "v_max_i8";
+ case UniOpVVV::kMaxU8 : return "v_max_u8";
+ case UniOpVVV::kMaxI16 : return "v_max_i16";
+ case UniOpVVV::kMaxU16 : return "v_max_u16";
+ case UniOpVVV::kMaxI32 : return "v_max_i32";
+ case UniOpVVV::kMaxU32 : return "v_max_u32";
+ case UniOpVVV::kMaxI64 : return "v_max_i64";
+ case UniOpVVV::kMaxU64 : return "v_max_u64";
+ case UniOpVVV::kCmpEqU8 : return "v_cmp_eq_u8";
+ case UniOpVVV::kCmpEqU16 : return "v_cmp_eq_u16";
+ case UniOpVVV::kCmpEqU32 : return "v_cmp_eq_u32";
+ case UniOpVVV::kCmpEqU64 : return "v_cmp_eq_u64";
+ case UniOpVVV::kCmpGtI8 : return "v_cmp_gt_i8";
+ case UniOpVVV::kCmpGtU8 : return "v_cmp_gt_u8";
+ case UniOpVVV::kCmpGtI16 : return "v_cmp_gt_i16";
+ case UniOpVVV::kCmpGtU16 : return "v_cmp_gt_u16";
+ case UniOpVVV::kCmpGtI32 : return "v_cmp_gt_i32";
+ case UniOpVVV::kCmpGtU32 : return "v_cmp_gt_u32";
+ case UniOpVVV::kCmpGtI64 : return "v_cmp_gt_i64";
+ case UniOpVVV::kCmpGtU64 : return "v_cmp_gt_u64";
+ case UniOpVVV::kCmpGeI8 : return "v_cmp_ge_i8";
+ case UniOpVVV::kCmpGeU8 : return "v_cmp_ge_u8";
+ case UniOpVVV::kCmpGeI16 : return "v_cmp_ge_i16";
+ case UniOpVVV::kCmpGeU16 : return "v_cmp_ge_u16";
+ case UniOpVVV::kCmpGeI32 : return "v_cmp_ge_i32";
+ case UniOpVVV::kCmpGeU32 : return "v_cmp_ge_u32";
+ case UniOpVVV::kCmpGeI64 : return "v_cmp_ge_i64";
+ case UniOpVVV::kCmpGeU64 : return "v_cmp_ge_u64";
+ case UniOpVVV::kCmpLtI8 : return "v_cmp_lt_i8";
+ case UniOpVVV::kCmpLtU8 : return "v_cmp_lt_u8";
+ case UniOpVVV::kCmpLtI16 : return "v_cmp_lt_i16";
+ case UniOpVVV::kCmpLtU16 : return "v_cmp_lt_u16";
+ case UniOpVVV::kCmpLtI32 : return "v_cmp_lt_i32";
+ case UniOpVVV::kCmpLtU32 : return "v_cmp_lt_u32";
+ case UniOpVVV::kCmpLtI64 : return "v_cmp_lt_i64";
+ case UniOpVVV::kCmpLtU64 : return "v_cmp_lt_u64";
+ case UniOpVVV::kCmpLeI8 : return "v_cmp_le_i8";
+ case UniOpVVV::kCmpLeU8 : return "v_cmp_le_u8";
+ case UniOpVVV::kCmpLeI16 : return "v_cmp_le_i16";
+ case UniOpVVV::kCmpLeU16 : return "v_cmp_le_u16";
+ case UniOpVVV::kCmpLeI32 : return "v_cmp_le_i32";
+ case UniOpVVV::kCmpLeU32 : return "v_cmp_le_u32";
+ case UniOpVVV::kCmpLeI64 : return "v_cmp_le_i64";
+ case UniOpVVV::kCmpLeU64 : return "v_cmp_le_u64";
+ case UniOpVVV::kAndF32 : return "v_and_f32";
+ case UniOpVVV::kAndF64 : return "v_and_f64";
+ case UniOpVVV::kOrF32 : return "v_or_f32";
+ case UniOpVVV::kOrF64 : return "v_or_f64";
+ case UniOpVVV::kXorF32 : return "v_xor_f32";
+ case UniOpVVV::kXorF64 : return "v_xor_f64";
+ case UniOpVVV::kAndnF32 : return "v_andn_f32";
+ case UniOpVVV::kAndnF64 : return "v_andn_f64";
+ case UniOpVVV::kBicF32 : return "v_bic_f32";
+ case UniOpVVV::kBicF64 : return "v_bic_f64";
+ case UniOpVVV::kAddF32S : return "v_add_f32s";
+ case UniOpVVV::kAddF64S : return "v_add_f64s";
+ case UniOpVVV::kAddF32 : return "v_add_f32";
+ case UniOpVVV::kAddF64 : return "v_add_f64";
+ case UniOpVVV::kSubF32S : return "v_sub_f32s";
+ case UniOpVVV::kSubF64S : return "v_sub_f64s";
+ case UniOpVVV::kSubF32 : return "v_sub_f32";
+ case UniOpVVV::kSubF64 : return "v_sub_f64";
+ case UniOpVVV::kMulF32S : return "v_mul_f32s";
+ case UniOpVVV::kMulF64S : return "v_mul_f64s";
+ case UniOpVVV::kMulF32 : return "v_mul_f32";
+ case UniOpVVV::kMulF64 : return "v_mul_f64";
+ case UniOpVVV::kDivF32S : return "v_div_f32s";
+ case UniOpVVV::kDivF64S : return "v_div_f64s";
+ case UniOpVVV::kDivF32 : return "v_div_f32";
+ case UniOpVVV::kDivF64 : return "v_div_f64";
+ case UniOpVVV::kModF32S : return "v_mod_f32s";
+ case UniOpVVV::kModF64S : return "v_mod_f64s";
+ case UniOpVVV::kModF32 : return "v_mod_f32";
+ case UniOpVVV::kModF64 : return "v_mod_f64";
+ case UniOpVVV::kMinF32S : return "v_min_f32s";
+ case UniOpVVV::kMinF64S : return "v_min_f64s";
+ case UniOpVVV::kMinF32 : return "v_min_f32";
+ case UniOpVVV::kMinF64 : return "v_min_f64";
+ case UniOpVVV::kMaxF32S : return "v_max_f32s";
+ case UniOpVVV::kMaxF64S : return "v_max_f64s";
+ case UniOpVVV::kMaxF32 : return "v_max_f32";
+ case UniOpVVV::kMaxF64 : return "v_max_f64";
+ case UniOpVVV::kCmpEqF32S : return "v_cmp_eq_f32s";
+ case UniOpVVV::kCmpEqF64S : return "v_cmp_eq_f64s";
+ case UniOpVVV::kCmpEqF32 : return "v_cmp_eq_f32";
+ case UniOpVVV::kCmpEqF64 : return "v_cmp_eq_f64";
+ case UniOpVVV::kCmpNeF32S : return "v_cmp_ne_f32s";
+ case UniOpVVV::kCmpNeF64S : return "v_cmp_ne_f64s";
+ case UniOpVVV::kCmpNeF32 : return "v_cmp_ne_f32";
+ case UniOpVVV::kCmpNeF64 : return "v_cmp_ne_f64";
+ case UniOpVVV::kCmpGtF32S : return "v_cmp_gt_f32s";
+ case UniOpVVV::kCmpGtF64S : return "v_cmp_gt_f64s";
+ case UniOpVVV::kCmpGtF32 : return "v_cmp_gt_f32";
+ case UniOpVVV::kCmpGtF64 : return "v_cmp_gt_f64";
+ case UniOpVVV::kCmpGeF32S : return "v_cmp_ge_f32s";
+ case UniOpVVV::kCmpGeF64S : return "v_cmp_ge_f64s";
+ case UniOpVVV::kCmpGeF32 : return "v_cmp_ge_f32";
+ case UniOpVVV::kCmpGeF64 : return "v_cmp_ge_f64";
+ case UniOpVVV::kCmpLtF32S : return "v_cmp_lt_f32s";
+ case UniOpVVV::kCmpLtF64S : return "v_cmp_lt_f64s";
+ case UniOpVVV::kCmpLtF32 : return "v_cmp_lt_f32";
+ case UniOpVVV::kCmpLtF64 : return "v_cmp_lt_f64";
+ case UniOpVVV::kCmpLeF32S : return "v_cmp_le_f32s";
+ case UniOpVVV::kCmpLeF64S : return "v_cmp_le_f64s";
+ case UniOpVVV::kCmpLeF32 : return "v_cmp_le_f32";
+ case UniOpVVV::kCmpLeF64 : return "v_cmp_le_f64";
+ case UniOpVVV::kCmpOrdF32S : return "v_cmp_ord_f32s";
+ case UniOpVVV::kCmpOrdF64S : return "v_cmp_ord_f64s";
+ case UniOpVVV::kCmpOrdF32 : return "v_cmp_ord_f32";
+ case UniOpVVV::kCmpOrdF64 : return "v_cmp_ord_f64";
+ case UniOpVVV::kCmpUnordF32S : return "v_cmp_unord_f32s";
+ case UniOpVVV::kCmpUnordF64S : return "v_cmp_unord_f64s";
+ case UniOpVVV::kCmpUnordF32 : return "v_cmp_unord_f32";
+ case UniOpVVV::kCmpUnordF64 : return "v_cmp_unord_f64";
+ case UniOpVVV::kHAddF64 : return "v_hadd_f64";
+ case UniOpVVV::kCombineLoHiU64 : return "v_combine_lo_hi_u64";
+ case UniOpVVV::kCombineLoHiF64 : return "v_combine_lo_hi_f64";
+ case UniOpVVV::kCombineHiLoU64 : return "v_combine_hi_lo_u64";
+ case UniOpVVV::kCombineHiLoF64 : return "v_combine_hi_lo_f64";
+ case UniOpVVV::kInterleaveLoU8 : return "v_interleave_lo_u8";
+ case UniOpVVV::kInterleaveHiU8 : return "v_interleave_hi_u8";
+ case UniOpVVV::kInterleaveLoU16: return "v_interleave_lo_u16";
+ case UniOpVVV::kInterleaveHiU16: return "v_interleave_hi_u16";
+ case UniOpVVV::kInterleaveLoU32: return "v_interleave_lo_u32";
+ case UniOpVVV::kInterleaveHiU32: return "v_interleave_hi_u32";
+ case UniOpVVV::kInterleaveLoU64: return "v_interleave_lo_u64";
+ case UniOpVVV::kInterleaveHiU64: return "v_interleave_hi_u64";
+ case UniOpVVV::kInterleaveLoF32: return "v_interleave_lo_f32";
+ case UniOpVVV::kInterleaveHiF32: return "v_interleave_hi_f32";
+ case UniOpVVV::kInterleaveLoF64: return "v_interleave_lo_f64";
+ case UniOpVVV::kInterleaveHiF64: return "v_interleave_hi_f64";
+ case UniOpVVV::kPacksI16_I8 : return "v_packs_i16_i8";
+ case UniOpVVV::kPacksI16_U8 : return "v_packs_i16_u8";
+ case UniOpVVV::kPacksI32_I16 : return "v_packs_i32_i16";
+ case UniOpVVV::kPacksI32_U16 : return "v_packs_i32_u16";
+ case UniOpVVV::kSwizzlev_U8 : return "v_swizzlev_u8";
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ case UniOpVVV::kMulwLoI8 : return "v_mulw_lo_i8";
+ case UniOpVVV::kMulwLoU8 : return "v_mulw_lo_u8";
+ case UniOpVVV::kMulwHiI8 : return "v_mulw_hi_i8";
+ case UniOpVVV::kMulwHiU8 : return "v_mulw_hi_u8";
+ case UniOpVVV::kMulwLoI16 : return "v_mulw_lo_i16";
+ case UniOpVVV::kMulwLoU16 : return "v_mulw_lo_u16";
+ case UniOpVVV::kMulwHiI16 : return "v_mulw_hi_i16";
+ case UniOpVVV::kMulwHiU16 : return "v_mulw_hi_u16";
+ case UniOpVVV::kMulwLoI32 : return "v_mulw_lo_i32";
+ case UniOpVVV::kMulwLoU32 : return "v_mulw_lo_u32";
+ case UniOpVVV::kMulwHiI32 : return "v_mulw_hi_i32";
+ case UniOpVVV::kMulwHiU32 : return "v_mulw_hi_u32";
+ case UniOpVVV::kMAddwLoI8 : return "v_maddw_lo_i8";
+ case UniOpVVV::kMAddwLoU8 : return "v_maddw_lo_u8";
+ case UniOpVVV::kMAddwHiI8 : return "v_maddw_hi_i8";
+ case UniOpVVV::kMAddwHiU8 : return "v_maddw_hi_u8";
+ case UniOpVVV::kMAddwLoI16 : return "v_maddw_lo_i16";
+ case UniOpVVV::kMAddwLoU16 : return "v_maddw_lo_u16";
+ case UniOpVVV::kMAddwHiI16 : return "v_maddw_hi_i16";
+ case UniOpVVV::kMAddwHiU16 : return "v_maddw_hi_u16";
+ case UniOpVVV::kMAddwLoI32 : return "v_maddw_lo_i32";
+ case UniOpVVV::kMAddwLoU32 : return "v_maddw_lo_u32";
+ case UniOpVVV::kMAddwHiI32 : return "v_maddw_hi_i32";
+ case UniOpVVV::kMAddwHiU32 : return "v_maddw_hi_u32";
+#endif // ASMJIT_UJIT_AARCH64
+
+#if defined(ASMJIT_UJIT_X86)
+ case UniOpVVV::kPermuteU8 : return "v_permute_u8";
+ case UniOpVVV::kPermuteU16 : return "v_permute_u16";
+ case UniOpVVV::kPermuteU32 : return "v_permute_u32";
+ case UniOpVVV::kPermuteU64 : return "v_permute_u64";
+#endif // ASMJIT_UJIT_X86
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static VecOpInfo vec_op_info_vvv(UniOpVVV op) noexcept {
+ using VE = VecElementType;
+
+ switch (op) {
+ case UniOpVVV::kAndU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kAndU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kOrU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kOrU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kXorU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kXorU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kAndnU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kAndnU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kBicU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kBicU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kAvgrU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kAvgrU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kAddU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kAddU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kAddU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kAddU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kSubU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kSubU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kSubU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kSubU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kAddsI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kAddsU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kAddsI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kAddsU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kSubsI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kSubsU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kSubsI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kSubsU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMulU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMulU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kMulU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kMulhI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMulhU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMulU64_LoU32 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt32);
+ case UniOpVVV::kMHAddI16_I32 : return VecOpInfo::make(VE::kInt32, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMinI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kMinU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kMinI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMinU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMinI32 : return VecOpInfo::make(VE::kInt32, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kMinU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kMinI64 : return VecOpInfo::make(VE::kInt64, VE::kInt64, VE::kInt64);
+ case UniOpVVV::kMinU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kMaxI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kMaxU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kMaxI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMaxU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMaxI32 : return VecOpInfo::make(VE::kInt32, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kMaxU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kMaxI64 : return VecOpInfo::make(VE::kInt64, VE::kInt64, VE::kInt64);
+ case UniOpVVV::kMaxU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCmpEqU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kCmpEqU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kCmpEqU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kCmpEqU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCmpGtI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kCmpGtU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kCmpGtI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kCmpGtU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kCmpGtI32 : return VecOpInfo::make(VE::kInt32, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kCmpGtU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kCmpGtI64 : return VecOpInfo::make(VE::kInt64, VE::kInt64, VE::kInt64);
+ case UniOpVVV::kCmpGtU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCmpGeI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kCmpGeU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kCmpGeI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kCmpGeU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kCmpGeI32 : return VecOpInfo::make(VE::kInt32, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kCmpGeU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kCmpGeI64 : return VecOpInfo::make(VE::kInt64, VE::kInt64, VE::kInt64);
+ case UniOpVVV::kCmpGeU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCmpLtI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kCmpLtU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kCmpLtI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kCmpLtU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kCmpLtI32 : return VecOpInfo::make(VE::kInt32, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kCmpLtU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kCmpLtI64 : return VecOpInfo::make(VE::kInt64, VE::kInt64, VE::kInt64);
+ case UniOpVVV::kCmpLtU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCmpLeI8 : return VecOpInfo::make(VE::kInt8, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kCmpLeU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kCmpLeI16 : return VecOpInfo::make(VE::kInt16, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kCmpLeU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kCmpLeI32 : return VecOpInfo::make(VE::kInt32, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kCmpLeU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kCmpLeI64 : return VecOpInfo::make(VE::kInt64, VE::kInt64, VE::kInt64);
+ case UniOpVVV::kCmpLeU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kAndF32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kAndF64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kOrF32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kOrF64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kXorF32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kXorF64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kAndnF32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kAndnF64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kBicF32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kBicF64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kAddF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kAddF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kAddF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kAddF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kSubF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kSubF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kSubF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kSubF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kMulF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kMulF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kMulF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kMulF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kDivF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kDivF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kDivF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kDivF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kModF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kModF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kModF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kModF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kMinF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kMinF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kMinF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kMinF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kMaxF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kMaxF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kMaxF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kMaxF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpEqF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpEqF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpEqF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpEqF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpNeF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpNeF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpNeF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpNeF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpGtF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpGtF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpGtF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpGtF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpGeF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpGeF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpGeF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpGeF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpLtF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpLtF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpLtF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpLtF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpLeF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpLeF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpLeF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpLeF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpOrdF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpOrdF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpOrdF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpOrdF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpUnordF32S : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpUnordF64S : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCmpUnordF32 : return VecOpInfo::make(VE::kUInt32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kCmpUnordF64 : return VecOpInfo::make(VE::kUInt64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kHAddF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCombineLoHiU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCombineLoHiF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kCombineHiLoU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kCombineHiLoF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kInterleaveLoU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kInterleaveHiU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kInterleaveLoU16: return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kInterleaveHiU16: return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kInterleaveLoU32: return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kInterleaveHiU32: return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kInterleaveLoU64: return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kInterleaveHiU64: return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVV::kInterleaveLoF32: return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kInterleaveHiF32: return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVV::kInterleaveLoF64: return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kInterleaveHiF64: return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVV::kPacksI16_I8 : return VecOpInfo::make(VE::kInt8, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kPacksI16_U8 : return VecOpInfo::make(VE::kUInt8, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kPacksI32_I16 : return VecOpInfo::make(VE::kInt16, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kPacksI32_U16 : return VecOpInfo::make(VE::kUInt16, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kSwizzlev_U8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ case UniOpVVV::kMulwLoI8 : return VecOpInfo::make(VE::kInt16, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kMulwLoU8 : return VecOpInfo::make(VE::kUInt16, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kMulwHiI8 : return VecOpInfo::make(VE::kInt16, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kMulwHiU8 : return VecOpInfo::make(VE::kUInt16, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kMulwLoI16 : return VecOpInfo::make(VE::kInt32, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMulwLoU16 : return VecOpInfo::make(VE::kUInt32, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMulwHiI16 : return VecOpInfo::make(VE::kInt32, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMulwHiU16 : return VecOpInfo::make(VE::kUInt32, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMulwLoI32 : return VecOpInfo::make(VE::kInt64, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kMulwLoU32 : return VecOpInfo::make(VE::kUInt64, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kMulwHiI32 : return VecOpInfo::make(VE::kInt64, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kMulwHiU32 : return VecOpInfo::make(VE::kUInt64, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kMAddwLoI8 : return VecOpInfo::make(VE::kInt16, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kMAddwLoU8 : return VecOpInfo::make(VE::kUInt16, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kMAddwHiI8 : return VecOpInfo::make(VE::kInt16, VE::kInt8, VE::kInt8);
+ case UniOpVVV::kMAddwHiU8 : return VecOpInfo::make(VE::kUInt16, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kMAddwLoI16 : return VecOpInfo::make(VE::kInt32, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMAddwLoU16 : return VecOpInfo::make(VE::kUInt32, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMAddwHiI16 : return VecOpInfo::make(VE::kInt32, VE::kInt16, VE::kInt16);
+ case UniOpVVV::kMAddwHiU16 : return VecOpInfo::make(VE::kUInt32, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kMAddwLoI32 : return VecOpInfo::make(VE::kInt64, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kMAddwLoU32 : return VecOpInfo::make(VE::kUInt64, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kMAddwHiI32 : return VecOpInfo::make(VE::kInt64, VE::kInt32, VE::kInt32);
+ case UniOpVVV::kMAddwHiU32 : return VecOpInfo::make(VE::kUInt64, VE::kUInt32, VE::kUInt32);
+#endif // ASMJIT_UJIT_AARCH64
+
+#if defined(ASMJIT_UJIT_X86)
+ case UniOpVVV::kPermuteU8 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVV::kPermuteU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVV::kPermuteU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVV::kPermuteU64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+#endif // ASMJIT_UJIT_X86
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static const char* vec_op_name_vvvi(UniOpVVVI op) noexcept {
+ switch (op) {
+ case UniOpVVVI::kAlignr_U128 : return "v_alignr_u128";
+ case UniOpVVVI::kInterleaveShuffleU32x4: return "v_interleave_shuffle_u32x4";
+ case UniOpVVVI::kInterleaveShuffleU64x2: return "v_interleave_shuffle_u64x2";
+ case UniOpVVVI::kInterleaveShuffleF32x4: return "v_interleave_shuffle_f32x4";
+ case UniOpVVVI::kInterleaveShuffleF64x2: return "v_interleave_shuffle_f64x2";
+ case UniOpVVVI::kInsertV128_U32 : return "v_insert_v128_u32";
+ case UniOpVVVI::kInsertV128_F32 : return "v_insert_v128_f32";
+ case UniOpVVVI::kInsertV128_U64 : return "v_insert_v128_u64";
+ case UniOpVVVI::kInsertV128_F64 : return "v_insert_v128_f64";
+ case UniOpVVVI::kInsertV256_U32 : return "v_insert_v256_u32";
+ case UniOpVVVI::kInsertV256_F32 : return "v_insert_v256_f32";
+ case UniOpVVVI::kInsertV256_U64 : return "v_insert_v256_u64";
+ case UniOpVVVI::kInsertV256_F64 : return "v_insert_v256_f64";
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static VecOpInfo vec_op_info_vvvi(UniOpVVVI op) noexcept {
+ using VE = VecElementType;
+
+ switch (op) {
+ case UniOpVVVI::kAlignr_U128 : return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVVI::kInterleaveShuffleU32x4: return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVVI::kInterleaveShuffleU64x2: return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVVI::kInterleaveShuffleF32x4: return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVI::kInterleaveShuffleF64x2: return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVI::kInsertV128_U32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVVI::kInsertV128_F32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVI::kInsertV128_U64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVVI::kInsertV128_F64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVI::kInsertV256_U32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVVI::kInsertV256_F32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVI::kInsertV256_U64 : return VecOpInfo::make(VE::kUInt64, VE::kUInt64, VE::kUInt64);
+ case UniOpVVVI::kInsertV256_F64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64);
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+static const char* vec_op_name_vvvv(UniOpVVVV op) noexcept {
+ switch (op) {
+ case UniOpVVVV::kBlendV_U8: return "v_blendv_u8";
+ case UniOpVVVV::kMAddU16 : return "v_madd_u16";
+ case UniOpVVVV::kMAddU32 : return "v_madd_u32";
+ case UniOpVVVV::kMAddF32S : return "v_madd_f32s";
+ case UniOpVVVV::kMAddF64S : return "v_madd_f64s";
+ case UniOpVVVV::kMAddF32 : return "v_madd_f32";
+ case UniOpVVVV::kMAddF64 : return "v_madd_f64";
+ case UniOpVVVV::kMSubF32S : return "v_msub_f32s";
+ case UniOpVVVV::kMSubF64S : return "v_msub_f64s";
+ case UniOpVVVV::kMSubF32 : return "v_msub_f32";
+ case UniOpVVVV::kMSubF64 : return "v_msub_f64";
+ case UniOpVVVV::kNMAddF32S: return "v_nmadd_f32s";
+ case UniOpVVVV::kNMAddF64S: return "v_nmadd_f64s";
+ case UniOpVVVV::kNMAddF32 : return "v_nmadd_f32";
+ case UniOpVVVV::kNMAddF64 : return "v_nmadd_f64";
+ case UniOpVVVV::kNMSubF32S: return "v_nmsub_f32s";
+ case UniOpVVVV::kNMSubF64S: return "v_nmsub_f64s";
+ case UniOpVVVV::kNMSubF32 : return "v_nmsub_f32";
+ case UniOpVVVV::kNMSubF64 : return "v_nmsub_f64";
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static VecOpInfo vec_op_info_vvvv(UniOpVVVV op) noexcept {
+ using VE = VecElementType;
+
+ switch (op) {
+ case UniOpVVVV::kBlendV_U8: return VecOpInfo::make(VE::kUInt8, VE::kUInt8, VE::kUInt8, VE::kUInt8);
+ case UniOpVVVV::kMAddU16 : return VecOpInfo::make(VE::kUInt16, VE::kUInt16, VE::kUInt16, VE::kUInt16);
+ case UniOpVVVV::kMAddU32 : return VecOpInfo::make(VE::kUInt32, VE::kUInt32, VE::kUInt32, VE::kUInt32);
+ case UniOpVVVV::kMAddF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kMAddF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kMAddF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kMAddF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kMSubF32S : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kMSubF64S : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kMSubF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kMSubF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kNMAddF32S: return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kNMAddF64S: return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kNMAddF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kNMAddF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kNMSubF32S: return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kNMSubF64S: return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ case UniOpVVVV::kNMSubF32 : return VecOpInfo::make(VE::kFloat32, VE::kFloat32, VE::kFloat32, VE::kFloat32);
+ case UniOpVVVV::kNMSubF64 : return VecOpInfo::make(VE::kFloat64, VE::kFloat64, VE::kFloat64, VE::kFloat64);
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+// ujit::UniCompiler - Tests - SIMD - Float To Int - Machine Behavior
+// ==================================================================
+
+template<FloatToIntOutsideRangeBehavior behavior, typename IntT, typename FloatT>
+static ASMJIT_INLINE_NODEBUG int32_t cvt_float_to_int_trunc(const FloatT& x) noexcept {
+ constexpr IntT min_value = std::numeric_limits<IntT>::lowest();
+ constexpr IntT max_value = std::numeric_limits<IntT>::max();
+ constexpr IntT zero = IntT(0);
+
+ if (std::isnan(x)) {
+ return behavior == FloatToIntOutsideRangeBehavior::kSmallestValue ? min_value : zero;
+ }
+
+ if (x < FloatT(min_value)) {
+ return min_value;
+ }
+
+ if (x > FloatT(max_value)) {
+ return behavior == FloatToIntOutsideRangeBehavior::kSmallestValue ? min_value : max_value;
+ }
+
+ return IntT(x);
+}
+
+template<FloatToIntOutsideRangeBehavior behavior, typename IntT, typename FloatT>
+static ASMJIT_INLINE_NODEBUG int32_t cvt_float_to_int_round(const FloatT& x) noexcept {
+ constexpr IntT min_value = std::numeric_limits<IntT>::lowest();
+ constexpr IntT max_value = std::numeric_limits<IntT>::max();
+ constexpr IntT zero = IntT(0);
+
+ if (std::isnan(x)) {
+ return behavior == FloatToIntOutsideRangeBehavior::kSmallestValue ? min_value : zero;
+ }
+
+ if (x < FloatT(min_value)) {
+ return min_value;
+ }
+
+ if (x > FloatT(max_value)) {
+ return behavior == FloatToIntOutsideRangeBehavior::kSmallestValue ? min_value : max_value;
+ }
+
+ return IntT(std::nearbyint(x));
+}
+
+// ujit::UniCompiler - Tests - SIMD - Data Generators & Constraints
+// ================================================================
+
+// Data generator, which is used to fill the content of SIMD registers.
+class DataGenInt {
+public:
+ TestUtils::Random rng;
+ uint32_t step;
+
+ struct Float32Data {
+ uint32_t u32;
+ float f32;
+ };
+
+ ASMJIT_INLINE explicit DataGenInt(uint64_t seed) noexcept
+ : rng(seed),
+ step(0) {}
+
+ ASMJIT_NOINLINE uint64_t next_uint64() noexcept {
+ if (++step >= 256) {
+ step = 0;
+ }
+
+ // NOTE: Nothing really elaborate - sometimes we want to test also numbers
+ // that random number generators won't return often, so we hardcode some.
+ switch (step) {
+ case 0: return 0u;
+ case 1: return 0u;
+ case 2: return 0u;
+ case 6: return 1u;
+ case 7: return 0u;
+ case 10: return 0u;
+ case 11: return 0xFFu;
+ case 15: return 0xFFFFu;
+ case 17: return 0xFFFFFFFFu;
+ case 21: return 0xFFFFFFFFFFFFFFFFu;
+ case 24: return 1u;
+ case 40: return 0xFFu;
+ case 55: return 0x8080808080808080u;
+ case 66: return 0x80000080u;
+ case 69: return 1u;
+ case 79: return 0x7F;
+ case 122: return 0xFFFFu;
+ case 123: return 0xFFFFu;
+ case 124: return 0xFFFFu;
+ case 127: return 1u;
+ case 130: return 0xFFu;
+ case 142: return 0x7FFFu;
+ case 143: return 0x7FFFu;
+ case 144: return 0u;
+ case 145: return 0x7FFFu;
+ default : return rng.next_uint64();
+ }
+ }
+
+ ASMJIT_NOINLINE float next_float32() noexcept {
+ if (++step >= 256) {
+ step = 0;
+ }
+
+ switch (step) {
+ case 0: return 0.0f;
+ case 1: return 0.0f;
+ case 2: return 0.0f;
+ case 6: return 1.0f;
+ case 7: return 0.0f;
+ case 10: return 0.00001f;
+ case 11: return 2.0f;
+ case 12: return -std::numeric_limits<float>::infinity();
+ case 15: return 3.0f;
+ case 17: return 256.0f;
+ case 21: return 0.5f;
+ case 23: return std::numeric_limits<float>::quiet_NaN();
+ case 24: return 0.25f;
+ case 27: return std::numeric_limits<float>::quiet_NaN();
+ case 29: return std::numeric_limits<float>::infinity();
+ case 31: return std::numeric_limits<float>::quiet_NaN();
+ case 35: return std::numeric_limits<float>::quiet_NaN();
+ case 40: return 5.12323f;
+ case 45: return -std::numeric_limits<float>::infinity();
+ case 55: return 100.5f;
+ case 66: return 0.1f;
+ case 69: return 0.2f;
+ case 79: return 0.3f;
+ case 89: return -13005961.0f;
+ case 99: return -std::numeric_limits<float>::infinity();
+ case 100:
+ case 102:
+ case 104:
+ case 106:
+ case 108: return float(rng.next_double());
+ case 110:
+ case 112:
+ case 114:
+ case 116:
+ case 118: return -float(rng.next_double());
+ case 122: return 10.3f;
+ case 123: return 20.3f;
+ case 124: return -100.3f;
+ case 127: return 1.3f;
+ case 130: return std::numeric_limits<float>::quiet_NaN();
+ case 135: return -std::numeric_limits<float>::infinity();
+ case 142: return 1.0f;
+ case 143: return 1.5f;
+ case 144: return 2.0f;
+ case 145: return std::numeric_limits<float>::infinity();
+ case 155: return -1.5f;
+ case 165: return -0.5f;
+ case 175: return -1.0f;
+ case 245: return 2.5f;
+
+ default: {
+ float sign = rng.next_uint32() < 0x7FFFFFF ? 1.0f : -1.0f;
+ return float(rng.next_double() * double(rng.next_uint32() & 0xFFFFFFu)) * sign;
+ }
+ }
+ }
+
+ ASMJIT_NOINLINE double next_float64() noexcept {
+ if (++step >= 256) {
+ step = 0;
+ }
+
+ switch (step) {
+ case 0: return 0.0;
+ case 1: return 0.0;
+ case 2: return 0.0;
+ case 6: return 1.0;
+ case 7: return 0.0;
+ case 10: return 0.00001;
+ case 11: return 2.0;
+ case 12: return -std::numeric_limits<double>::infinity();
+ case 15: return 3.0;
+ case 17: return 256.0;
+ case 21: return 0.5;
+ case 23: return std::numeric_limits<double>::quiet_NaN();
+ case 24: return 0.25;
+ case 27: return std::numeric_limits<double>::quiet_NaN();
+ case 29: return std::numeric_limits<double>::infinity();
+ case 31: return std::numeric_limits<double>::quiet_NaN();
+ case 35: return std::numeric_limits<double>::quiet_NaN();
+ case 40: return 5.12323;
+ case 45: return -std::numeric_limits<double>::infinity();
+ case 55: return 100.5;
+ case 66: return 0.1;
+ case 69: return 0.2;
+ case 79: return 0.3;
+ case 80: return 4503599627370495.5;
+ case 99: return -std::numeric_limits<double>::infinity();
+ case 100:
+ case 102:
+ case 104:
+ case 106:
+ case 108: return rng.next_double();
+ case 110:
+ case 112:
+ case 114:
+ case 116:
+ case 118: return -rng.next_double();
+ case 122: return 10.3;
+ case 123: return 20.3;
+ case 124: return -100.3;
+ case 125: return 4503599627370496.0;
+ case 127: return 1.3;
+ case 130: return std::numeric_limits<double>::quiet_NaN();
+ case 135: return -std::numeric_limits<double>::infinity();
+ case 142: return 1.0;
+ case 143: return 1.5;
+ case 144: return 2.0;
+ case 145: return std::numeric_limits<double>::infinity();
+ case 155: return -1.5;
+ case 165: return -0.5;
+ case 175: return -1.0;
+ case 245: return 2.5;
+ case 248: return -4503599627370495.5;
+
+ default: {
+ double sign = rng.next_uint32() < 0x7FFFFFF ? 1.0 : -1.0;
+ return double(rng.next_double() * double(rng.next_uint32() & 0x3FFFFFFFu)) * sign;
+ }
+ }
+ }
+};
+
+template<typename T>
+struct half_minus_1ulp_const;
+
+template<> struct half_minus_1ulp_const<float> { static inline constexpr float value = 0.49999997f; };
+template<> struct half_minus_1ulp_const<double> { static inline constexpr double value = 0.49999999999999994; };
+
+// Some SIMD operations are constrained, especially those higher level. So, to successfully test these we
+// have to model the constraints in a way that the SIMD instruction we test actually gets the correct input.
+// Note that a constraint doesn't have to be always range based, it could be anything.
+struct ConstraintNone {
+ template<uint32_t kW>
+ static ASMJIT_INLINE_NODEBUG void apply(VecOverlay<kW>& v) noexcept { Support::maybe_unused(v); }
+};
+
+template<typename ElementT, typename Derived>
+struct ConstraintBase {
+ template<uint32_t kW>
+ static ASMJIT_INLINE void apply(VecOverlay<kW>& v) noexcept {
+ ElementT* elements = v.template data<ElementT>();
+ for (size_t i = 0; i < kW / sizeof(ElementT); i++) {
+ elements[i] = Derived::apply_one(elements[i]);
+ }
+ }
+};
+
+template<uint8_t kMin, uint8_t kMax>
+struct ConstraintRangeU8 : public ConstraintBase<uint16_t, ConstraintRangeU8<kMin, kMax>> {
+ static ASMJIT_INLINE_NODEBUG uint8_t apply_one(uint8_t x) noexcept { return std::clamp(x, kMin, kMax); }
+};
+
+template<uint16_t kMin, uint16_t kMax>
+struct ConstraintRangeU16 : public ConstraintBase<uint16_t, ConstraintRangeU16<kMin, kMax>> {
+ static ASMJIT_INLINE_NODEBUG uint16_t apply_one(uint16_t x) noexcept { return std::clamp(x, kMin, kMax); }
+};
+
+template<uint32_t kMin, uint32_t kMax>
+struct ConstraintRangeU32 : public ConstraintBase<uint32_t, ConstraintRangeU32<kMin, kMax>> {
+ static ASMJIT_INLINE_NODEBUG uint32_t apply_one(uint32_t x) noexcept { return std::clamp(x, kMin, kMax); }
+};
+
+// ujit::UniCompiler - Tests - Generic Operations
+// ==============================================
+
+template<typename T>
+static ASMJIT_INLINE_NODEBUG std::make_unsigned_t<T> cast_uint(const T& x) noexcept {
+ return static_cast<std::make_unsigned_t<T>>(x);
+}
+
+template<typename T>
+static ASMJIT_INLINE_NODEBUG std::make_signed_t<T> cast_int(const T& x) noexcept {
+ return static_cast<std::make_signed_t<T>>(x);
+}
+
+static ASMJIT_INLINE_NODEBUG int8_t saturate_i16_to_i8(int16_t x) noexcept {
+ return x < int16_t(-128) ? int8_t(-128) :
+ x > int16_t( 127) ? int8_t( 127) : int8_t(x & 0xFF);
+}
+
+static ASMJIT_INLINE_NODEBUG uint8_t saturate_i16_to_u8(int16_t x) noexcept {
+ return x < int16_t(0x00) ? uint8_t(0x00) :
+ x > int16_t(0xFF) ? uint8_t(0xFF) : uint8_t(x & 0xFF);
+}
+
+static ASMJIT_INLINE_NODEBUG int16_t saturate_i32_to_i16(int32_t x) noexcept {
+ return x < int32_t(-32768) ? int16_t(-32768) :
+ x > int32_t( 32767) ? int16_t( 32767) : int16_t(x & 0xFFFF);
+}
+
+static ASMJIT_INLINE_NODEBUG uint16_t saturate_i32_to_u16(int32_t x) noexcept {
+ return x < int32_t(0x0000) ? uint16_t(0x0000) :
+ x > int32_t(0xFFFF) ? uint16_t(0xFFFF) : uint16_t(x & 0xFFFF);
+}
+
+template<typename T, typename Derived> struct op_each_vv {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / sizeof(T); i++) {
+ out.set(i, Derived::apply_one(a.template get<T>(i)));
+ }
+ return out;
+ }
+};
+
+template<typename T, typename Derived> struct op_each_vvi {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / sizeof(T); i++) {
+ out.set(i, Derived::apply_one(a.template get<T>(i), imm));
+ }
+ return out;
+ }
+};
+
+template<typename T, typename Derived> struct op_each_vvv {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / sizeof(T); i++) {
+ out.set(i, Derived::apply_one(a.template get<T>(i), b.template get<T>(i)));
+ }
+ return out;
+ }
+};
+
+template<typename T, typename Derived> struct op_each_vvvi {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b, uint32_t imm) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / sizeof(T); i++) {
+ out.set(i, Derived::apply_one(a.template get<T>(i), b.template get<T>(i), imm));
+ }
+ return out;
+ }
+};
+
+template<typename T, typename Derived> struct op_each_vvvv {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b, const VecOverlay<kW>& c) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / sizeof(T); i++) {
+ out.set(i, Derived::apply_one(a.template get<T>(i), b.template get<T>(i), c.template get<T>(i)));
+ }
+ return out;
+ }
+};
+
+template<ScalarOpBehavior kB, typename T, typename Derived> struct op_scalar_vv {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out {};
+ if constexpr (kB == ScalarOpBehavior::kPreservingVec128) {
+ out.copy_16b_from(a);
+ }
+ out.set(0, Derived::apply_one(a.template get<T>(0)));
+ return out;
+ }
+};
+
+template<ScalarOpBehavior kB, typename T, typename Derived> struct op_scalar_vvi {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ VecOverlay<kW> out {};
+ if constexpr (kB == ScalarOpBehavior::kPreservingVec128) {
+ out.copy_16b_from(a);
+ }
+ out.set(0, Derived::apply_one(a.template get<T>(0), imm));
+ return out;
+ }
+};
+
+template<ScalarOpBehavior kB, typename T, typename Derived> struct op_scalar_vvv {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out {};
+ if constexpr (kB == ScalarOpBehavior::kPreservingVec128) {
+ out.copy_16b_from(a);
+ }
+ out.set(0, Derived::apply_one(a.template get<T>(0), b.template get<T>(0)));
+ return out;
+ }
+};
+
+template<ScalarOpBehavior kB, typename T, typename Derived> struct op_scalar_vvvv {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b, const VecOverlay<kW>& c) noexcept {
+ VecOverlay<kW> out {};
+ if constexpr (kB == ScalarOpBehavior::kPreservingVec128) {
+ out.copy_16b_from(a);
+ }
+ out.set(0, Derived::apply_one(a.template get<T>(0), b.template get<T>(0), c.template get<T>(0)));
+ return out;
+ }
+};
+
+// ujit::UniCompiler - Tests - Generic Operations - VV
+// ===================================================
+
+struct vec_op_mov : public op_each_vv<uint32_t, vec_op_mov> {
+ static ASMJIT_INLINE_NODEBUG uint32_t apply_one(const uint32_t& a) noexcept { return a; }
+};
+
+struct vec_op_mov_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ out.data_u64[0] = a.data_u64[0];
+ return out;
+ }
+};
+
+struct vec_op_broadcast_u8 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW; i++)
+ out.data_u8[i] = a.data_u8[0];
+ return out;
+ }
+};
+
+struct vec_op_broadcast_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / 2u; i++) {
+ out.data_u16[i] = a.data_u16[0];
+ }
+ return out;
+ }
+};
+
+struct vec_op_broadcast_u32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / 4u; i++) {
+ out.data_u32[i] = a.data_u32[0];
+ }
+ return out;
+ }
+};
+
+struct vec_op_broadcast_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t i = 0; i < kW / 8u; i++) {
+ out.data_u64[i] = a.data_u64[0];
+ }
+ return out;
+ }
+};
+
+struct vec_op_broadcast_u128 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+
+ for (uint32_t i = 0; i < kW / 8u; i += 2) {
+ out.data_u64[i + 0] = a.data_u64[0];
+ out.data_u64[i + 1] = a.data_u64[1];
+ }
+ return out;
+ }
+};
+
+struct vec_op_broadcast_u256 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ if constexpr (kW < 32) {
+ out = a;
+ }
+ else {
+ for (uint32_t i = 0; i < kW / 8u; i += 4) {
+ out.data_u64[i + 0] = a.data_u64[0];
+ out.data_u64[i + 1] = a.data_u64[1];
+ out.data_u64[i + 2] = a.data_u64[2];
+ out.data_u64[i + 3] = a.data_u64[3];
+ }
+ }
+ return out;
+ }
+};
+
+template<typename T> struct vec_op_abs : public op_each_vv<T, vec_op_abs<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return a < 0 ? T(cast_uint(T(0)) - cast_uint(a)) : a; }
+};
+
+template<typename T> struct vec_op_neg : public op_each_vv<T, vec_op_neg<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return T(cast_uint(T(0)) - cast_uint(a)); }
+};
+
+template<typename T> struct vec_op_not : public op_each_vv<T, vec_op_not<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return T(~a); }
+};
+
+struct vec_op_cvt_i8_lo_to_i16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i16[off / 2 + 0] = a.data_i8[off / 2 + 0];
+ out.data_i16[off / 2 + 1] = a.data_i8[off / 2 + 1];
+ out.data_i16[off / 2 + 2] = a.data_i8[off / 2 + 2];
+ out.data_i16[off / 2 + 3] = a.data_i8[off / 2 + 3];
+ out.data_i16[off / 2 + 4] = a.data_i8[off / 2 + 4];
+ out.data_i16[off / 2 + 5] = a.data_i8[off / 2 + 5];
+ out.data_i16[off / 2 + 6] = a.data_i8[off / 2 + 6];
+ out.data_i16[off / 2 + 7] = a.data_i8[off / 2 + 7];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i8_hi_to_i16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i16[off / 2 + 0] = a.data_i8[kW / 2 + off / 2 + 0];
+ out.data_i16[off / 2 + 1] = a.data_i8[kW / 2 + off / 2 + 1];
+ out.data_i16[off / 2 + 2] = a.data_i8[kW / 2 + off / 2 + 2];
+ out.data_i16[off / 2 + 3] = a.data_i8[kW / 2 + off / 2 + 3];
+ out.data_i16[off / 2 + 4] = a.data_i8[kW / 2 + off / 2 + 4];
+ out.data_i16[off / 2 + 5] = a.data_i8[kW / 2 + off / 2 + 5];
+ out.data_i16[off / 2 + 6] = a.data_i8[kW / 2 + off / 2 + 6];
+ out.data_i16[off / 2 + 7] = a.data_i8[kW / 2 + off / 2 + 7];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u8_lo_to_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u16[off / 2 + 0] = a.data_u8[off / 2 + 0];
+ out.data_u16[off / 2 + 1] = a.data_u8[off / 2 + 1];
+ out.data_u16[off / 2 + 2] = a.data_u8[off / 2 + 2];
+ out.data_u16[off / 2 + 3] = a.data_u8[off / 2 + 3];
+ out.data_u16[off / 2 + 4] = a.data_u8[off / 2 + 4];
+ out.data_u16[off / 2 + 5] = a.data_u8[off / 2 + 5];
+ out.data_u16[off / 2 + 6] = a.data_u8[off / 2 + 6];
+ out.data_u16[off / 2 + 7] = a.data_u8[off / 2 + 7];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u8_hi_to_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u16[off / 2 + 0] = a.data_u8[kW / 2 + off / 2 + 0];
+ out.data_u16[off / 2 + 1] = a.data_u8[kW / 2 + off / 2 + 1];
+ out.data_u16[off / 2 + 2] = a.data_u8[kW / 2 + off / 2 + 2];
+ out.data_u16[off / 2 + 3] = a.data_u8[kW / 2 + off / 2 + 3];
+ out.data_u16[off / 2 + 4] = a.data_u8[kW / 2 + off / 2 + 4];
+ out.data_u16[off / 2 + 5] = a.data_u8[kW / 2 + off / 2 + 5];
+ out.data_u16[off / 2 + 6] = a.data_u8[kW / 2 + off / 2 + 6];
+ out.data_u16[off / 2 + 7] = a.data_u8[kW / 2 + off / 2 + 7];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i8_to_i32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 4 + 0] = a.data_i8[off / 4 + 0];
+ out.data_i32[off / 4 + 1] = a.data_i8[off / 4 + 1];
+ out.data_i32[off / 4 + 2] = a.data_i8[off / 4 + 2];
+ out.data_i32[off / 4 + 3] = a.data_i8[off / 4 + 3];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u8_to_u32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u32[off / 4 + 0] = a.data_u8[off / 4 + 0];
+ out.data_u32[off / 4 + 1] = a.data_u8[off / 4 + 1];
+ out.data_u32[off / 4 + 2] = a.data_u8[off / 4 + 2];
+ out.data_u32[off / 4 + 3] = a.data_u8[off / 4 + 3];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i16_lo_to_i32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 4 + 0] = a.data_i16[off / 4 + 0];
+ out.data_i32[off / 4 + 1] = a.data_i16[off / 4 + 1];
+ out.data_i32[off / 4 + 2] = a.data_i16[off / 4 + 2];
+ out.data_i32[off / 4 + 3] = a.data_i16[off / 4 + 3];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i16_hi_to_i32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 4 + 0] = a.data_i16[kW / 4 + off / 4 + 0];
+ out.data_i32[off / 4 + 1] = a.data_i16[kW / 4 + off / 4 + 1];
+ out.data_i32[off / 4 + 2] = a.data_i16[kW / 4 + off / 4 + 2];
+ out.data_i32[off / 4 + 3] = a.data_i16[kW / 4 + off / 4 + 3];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u16_lo_to_u32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u32[off / 4 + 0] = a.data_u16[off / 4 + 0];
+ out.data_u32[off / 4 + 1] = a.data_u16[off / 4 + 1];
+ out.data_u32[off / 4 + 2] = a.data_u16[off / 4 + 2];
+ out.data_u32[off / 4 + 3] = a.data_u16[off / 4 + 3];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u16_hi_to_u32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u32[off / 4 + 0] = a.data_u16[kW / 4 + off / 4 + 0];
+ out.data_u32[off / 4 + 1] = a.data_u16[kW / 4 + off / 4 + 1];
+ out.data_u32[off / 4 + 2] = a.data_u16[kW / 4 + off / 4 + 2];
+ out.data_u32[off / 4 + 3] = a.data_u16[kW / 4 + off / 4 + 3];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i32_lo_to_i64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i64[off / 8 + 0] = a.data_i32[off / 8 + 0];
+ out.data_i64[off / 8 + 1] = a.data_i32[off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i32_hi_to_i64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i64[off / 8 + 0] = a.data_i32[kW / 8 + off / 8 + 0];
+ out.data_i64[off / 8 + 1] = a.data_i32[kW / 8 + off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u32_lo_to_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = a.data_u32[off / 8 + 0];
+ out.data_u64[off / 8 + 1] = a.data_u32[off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_u32_hi_to_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = a.data_u32[kW / 8 + off / 8 + 0];
+ out.data_u64[off / 8 + 1] = a.data_u32[kW / 8 + off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+template<typename T> struct vec_op_fabs : public op_each_vv<T, vec_op_fabs<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::fabs(a); }
+};
+
+template<typename T> struct vec_op_trunc : public op_each_vv<T, vec_op_trunc<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::trunc(a); }
+};
+
+template<typename T> struct vec_op_floor : public op_each_vv<T, vec_op_floor<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::floor(a); }
+};
+
+template<typename T> struct vec_op_ceil : public op_each_vv<T, vec_op_ceil<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::ceil(a); }
+};
+
+template<typename T> struct vec_op_round_even : public op_each_vv<T, vec_op_round_even<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::nearbyint(a); }
+};
+
+template<typename T> struct vec_op_round_half_away : public op_each_vv<T, vec_op_round_half_away<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::trunc(fadd(a, fxor(half_minus_1ulp_const<T>::value, fsign(a)))); }
+};
+
+template<typename T> struct vec_op_round_half_up : public op_each_vv<T, vec_op_round_half_up<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::floor(fadd(a, half_minus_1ulp_const<T>::value)); }
+};
+
+template<typename T> struct vec_op_sqrt : public op_each_vv<T, vec_op_sqrt<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return fsqrt(a); }
+};
+
+template<typename T> struct vec_op_rcp : public op_each_vv<T, vec_op_rcp<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return fdiv(T(1), a); }
+};
+
+struct vec_op_cvt_i32_to_f32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_f32[off / 4 + 0] = float(a.data_i32[off / 4 + 0]);
+ out.data_f32[off / 4 + 1] = float(a.data_i32[off / 4 + 1]);
+ out.data_f32[off / 4 + 2] = float(a.data_i32[off / 4 + 2]);
+ out.data_f32[off / 4 + 3] = float(a.data_i32[off / 4 + 3]);
+ }
+ return out;
+ }
+};
+
+template<bool kHi>
+struct vec_op_cvt_f32_to_f64_impl {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ uint32_t adj = kHi ? kW / 8 : 0u;
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_f64[off / 8 + 0] = double(a.data_f32[off / 8 + adj + 0]);
+ out.data_f64[off / 8 + 1] = double(a.data_f32[off / 8 + adj + 1]);
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_f32_lo_to_f64 : public vec_op_cvt_f32_to_f64_impl<false> {};
+struct vec_op_cvt_f32_hi_to_f64 : public vec_op_cvt_f32_to_f64_impl<true> {};
+
+template<bool kHi>
+struct vec_op_cvt_f64_to_f32_impl {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ uint32_t adj = kHi ? kW / 8 : 0u;
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_f32[off / 8 + adj + 0] = float(a.data_f64[off / 8 + 0]);
+ out.data_f32[off / 8 + adj + 1] = float(a.data_f64[off / 8 + 1]);
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_f64_to_f32_lo : public vec_op_cvt_f64_to_f32_impl<false> {};
+struct vec_op_cvt_f64_to_f32_hi : public vec_op_cvt_f64_to_f32_impl<true> {};
+
+template<bool kHi>
+struct vec_op_cvt_i32_to_f64_impl {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ uint32_t adj = kHi ? kW / 8 : 0u;
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_f64[off / 8 + 0] = double(a.data_i32[off / 8 + adj + 0]);
+ out.data_f64[off / 8 + 1] = double(a.data_i32[off / 8 + adj + 1]);
+ }
+ return out;
+ }
+};
+
+struct vec_op_cvt_i32_lo_to_f64 : public vec_op_cvt_i32_to_f64_impl<false> {};
+struct vec_op_cvt_i32_hi_to_f64 : public vec_op_cvt_i32_to_f64_impl<true> {};
+
+template<FloatToIntOutsideRangeBehavior behavior>
+struct vec_op_cvt_trunc_f32_to_i32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 4 + 0] = cvt_float_to_int_trunc<behavior, int32_t>(a.data_f32[off / 4 + 0]);
+ out.data_i32[off / 4 + 1] = cvt_float_to_int_trunc<behavior, int32_t>(a.data_f32[off / 4 + 1]);
+ out.data_i32[off / 4 + 2] = cvt_float_to_int_trunc<behavior, int32_t>(a.data_f32[off / 4 + 2]);
+ out.data_i32[off / 4 + 3] = cvt_float_to_int_trunc<behavior, int32_t>(a.data_f32[off / 4 + 3]);
+ }
+ return out;
+ }
+};
+
+template<FloatToIntOutsideRangeBehavior behavior, bool kHi>
+struct vec_op_cvt_trunc_f64_to_i32_impl {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ uint32_t adj = kHi ? kW / 8 : 0u;
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 8 + adj + 0] = cvt_float_to_int_trunc<behavior, int32_t>(a.data_f64[off / 8 + 0]);
+ out.data_i32[off / 8 + adj + 1] = cvt_float_to_int_trunc<behavior, int32_t>(a.data_f64[off / 8 + 1]);
+ }
+ return out;
+ }
+};
+
+template<FloatToIntOutsideRangeBehavior behavior>
+struct vec_op_cvt_trunc_f64_to_i32_lo : vec_op_cvt_trunc_f64_to_i32_impl<behavior, false> {};
+
+template<FloatToIntOutsideRangeBehavior behavior>
+struct vec_op_cvt_trunc_f64_to_i32_hi : vec_op_cvt_trunc_f64_to_i32_impl<behavior, true> {};
+
+template<FloatToIntOutsideRangeBehavior behavior>
+struct vec_op_cvt_round_f32_to_i32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 4 + 0] = cvt_float_to_int_round<behavior, int32_t>(a.data_f32[off / 4 + 0]);
+ out.data_i32[off / 4 + 1] = cvt_float_to_int_round<behavior, int32_t>(a.data_f32[off / 4 + 1]);
+ out.data_i32[off / 4 + 2] = cvt_float_to_int_round<behavior, int32_t>(a.data_f32[off / 4 + 2]);
+ out.data_i32[off / 4 + 3] = cvt_float_to_int_round<behavior, int32_t>(a.data_f32[off / 4 + 3]);
+ }
+ return out;
+ }
+};
+
+template<FloatToIntOutsideRangeBehavior behavior, bool kHi>
+struct vec_op_cvt_round_f64_to_i32_impl {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ uint32_t adj = kHi ? kW / 8 : 0u;
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i32[off / 8 + adj + 0] = cvt_float_to_int_round<behavior, int32_t>(a.data_f64[off / 8 + 0]);
+ out.data_i32[off / 8 + adj + 1] = cvt_float_to_int_round<behavior, int32_t>(a.data_f64[off / 8 + 1]);
+ }
+ return out;
+ }
+};
+
+template<FloatToIntOutsideRangeBehavior behavior>
+struct vec_op_cvt_round_f64_to_i32_lo : vec_op_cvt_round_f64_to_i32_impl<behavior, false> {};
+template<FloatToIntOutsideRangeBehavior behavior>
+struct vec_op_cvt_round_f64_to_i32_hi : vec_op_cvt_round_f64_to_i32_impl<behavior, true> {};
+
+struct scalar_op_cvt_f32_to_f64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ out.data_f64[0] = a.data_f32[0];
+ return out;
+ }
+};
+
+struct scalar_op_cvt_f64_to_f32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a) noexcept {
+ VecOverlay<kW> out{};
+ out.data_f32[0] = a.data_f64[0];
+ return out;
+ }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_trunc : public op_scalar_vv<kB, T, scalar_op_trunc<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::trunc(a); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_floor : public op_scalar_vv<kB, T, scalar_op_floor<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::floor(a); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_ceil : public op_scalar_vv<kB, T, scalar_op_ceil<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::ceil(a); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_round_even : public op_scalar_vv<kB, T, scalar_op_round_even<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::nearbyint(a); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_round_half_away : public op_scalar_vv<kB, T, scalar_op_round_half_away<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::trunc(fadd(a, fxor(half_minus_1ulp_const<T>::value, fsign(a)))); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_round_half_up : public op_scalar_vv<kB, T, scalar_op_round_half_up<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return std::floor(fadd(a, half_minus_1ulp_const<T>::value)); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_sqrt : public op_scalar_vv<kB, T, scalar_op_sqrt<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a) noexcept { return fsqrt(a); }
+};
+
+// ujit::UniCompiler - Tests - Generic Operations - VVI
+// ====================================================
+
+template<typename T> struct vec_op_slli : public op_each_vvi<T, vec_op_slli<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, uint32_t imm) noexcept { return T(cast_uint(a) << imm); }
+};
+
+template<typename T> struct vec_op_srli : public op_each_vvi<T, vec_op_srli<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, uint32_t imm) noexcept { return T(cast_uint(a) >> imm); }
+};
+
+template<typename T> struct vec_op_rsrli : public op_each_vvi<T, vec_op_rsrli<T>> {
+ static ASMJIT_INLINE T apply_one(const T& a, uint32_t imm) noexcept {
+ T add = T((a & (T(1) << (imm - 1))) != 0);
+ return T((cast_uint(a) >> imm) + cast_uint(add));
+ }
+};
+
+template<typename T> struct vec_op_srai : public op_each_vvi<T, vec_op_srai<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, uint32_t imm) noexcept { return T(cast_int(a) >> imm); }
+};
+
+struct vec_op_sllb_u128 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 16; i++) {
+ out.data_u8[off + i] = i < imm ? uint8_t(0) : a.data_u8[off + i - imm];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_srlb_u128 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 16; i++) {
+ out.data_u8[off + i] = i + imm < 16u ? a.data_u8[off + i + imm] : uint8_t(0);
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_swizzle_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ uint32_t D = (imm >> 24) & 0x3;
+ uint32_t C = (imm >> 16) & 0x3;
+ uint32_t B = (imm >> 8) & 0x3;
+ uint32_t A = (imm >> 0) & 0x3;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u16[off / 2 + 0] = a.data_u16[off / 2 + 0 + A];
+ out.data_u16[off / 2 + 1] = a.data_u16[off / 2 + 0 + B];
+ out.data_u16[off / 2 + 2] = a.data_u16[off / 2 + 0 + C];
+ out.data_u16[off / 2 + 3] = a.data_u16[off / 2 + 0 + D];
+ out.data_u16[off / 2 + 4] = a.data_u16[off / 2 + 4 + A];
+ out.data_u16[off / 2 + 5] = a.data_u16[off / 2 + 4 + B];
+ out.data_u16[off / 2 + 6] = a.data_u16[off / 2 + 4 + C];
+ out.data_u16[off / 2 + 7] = a.data_u16[off / 2 + 4 + D];
+ }
+ return out;
+ }
+};
+
+struct vec_op_swizzle_lo_u16x4 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ uint32_t D = (imm >> 24) & 0x3;
+ uint32_t C = (imm >> 16) & 0x3;
+ uint32_t B = (imm >> 8) & 0x3;
+ uint32_t A = (imm >> 0) & 0x3;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u16[off / 2 + 0] = a.data_u16[off / 2 + A];
+ out.data_u16[off / 2 + 1] = a.data_u16[off / 2 + B];
+ out.data_u16[off / 2 + 2] = a.data_u16[off / 2 + C];
+ out.data_u16[off / 2 + 3] = a.data_u16[off / 2 + D];
+ memcpy(out.data_u8 + off + 8, a.data_u8 + off + 8, 8);
+ }
+ return out;
+ }
+};
+
+struct vec_op_swizzle_hi_u16x4 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ uint32_t D = (imm >> 24) & 0x3;
+ uint32_t C = (imm >> 16) & 0x3;
+ uint32_t B = (imm >> 8) & 0x3;
+ uint32_t A = (imm >> 0) & 0x3;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ memcpy(out.data_u8 + off, a.data_u8 + off, 8);
+ out.data_u16[off / 2 + 4] = a.data_u16[off / 2 + 4 + A];
+ out.data_u16[off / 2 + 5] = a.data_u16[off / 2 + 4 + B];
+ out.data_u16[off / 2 + 6] = a.data_u16[off / 2 + 4 + C];
+ out.data_u16[off / 2 + 7] = a.data_u16[off / 2 + 4 + D];
+ }
+ return out;
+ }
+};
+
+struct vec_op_swizzle_u32x4 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ uint32_t D = (imm >> 24) & 0x3;
+ uint32_t C = (imm >> 16) & 0x3;
+ uint32_t B = (imm >> 8) & 0x3;
+ uint32_t A = (imm >> 0) & 0x3;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u32[off / 4 + 0] = a.data_u32[off / 4 + A];
+ out.data_u32[off / 4 + 1] = a.data_u32[off / 4 + B];
+ out.data_u32[off / 4 + 2] = a.data_u32[off / 4 + C];
+ out.data_u32[off / 4 + 3] = a.data_u32[off / 4 + D];
+ }
+ return out;
+ }
+};
+
+struct vec_op_swizzle_u64x2 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, uint32_t imm) noexcept {
+ uint32_t B = (imm >> 8) & 0x1;
+ uint32_t A = (imm >> 0) & 0x1;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = a.data_u64[off / 8 + A];
+ out.data_u64[off / 8 + 1] = a.data_u64[off / 8 + B];
+ }
+ return out;
+ }
+};
+
+// ujit::UniCompiler - Tests - SIMD - Generic Operations - VVV
+// ===========================================================
+
+template<typename T> struct vec_op_and : public op_each_vvv<T, vec_op_and<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(a & b); }
+};
+
+template<typename T> struct vec_op_or : public op_each_vvv<T, vec_op_or<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(a | b); }
+};
+
+template<typename T> struct vec_op_xor : public op_each_vvv<T, vec_op_xor<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(a ^ b); }
+};
+
+template<typename T> struct vec_op_andn : public op_each_vvv<T, vec_op_andn<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(~a & b); }
+};
+
+template<typename T> struct vec_op_bic : public op_each_vvv<T, vec_op_bic<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(a & ~b); }
+};
+
+template<typename T> struct vec_op_add : public op_each_vvv<T, vec_op_add<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(cast_uint(a) + cast_uint(b)); }
+};
+
+template<typename T> struct vec_op_adds : public op_each_vvv<T, vec_op_adds<T>> {
+ static ASMJIT_INLINE T apply_one(const T& a, const T& b) noexcept {
+ Support::FastUInt8 of{};
+ T result = Support::add_overflow(a, b, &of);
+
+ if (!of) {
+ return result;
+ }
+
+ if constexpr (std::is_unsigned_v<T>) {
+ return std::numeric_limits<T>::max();
+ }
+ else {
+ return b > T(0) ? std::numeric_limits<T>::max() : std::numeric_limits<T>::lowest();
+ }
+ }
+};
+
+template<typename T> struct vec_op_sub : public op_each_vvv<T, vec_op_sub<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T(cast_uint(a) - cast_uint(b)); }
+};
+
+template<typename T> struct vec_op_subs : public op_each_vvv<T, vec_op_subs<T>> {
+ static ASMJIT_INLINE T apply_one(const T& a, const T& b) noexcept {
+ Support::FastUInt8 of{};
+ T result = Support::sub_overflow(a, b, &of);
+
+ if (!of) {
+ return result;
+ }
+
+ if constexpr (std::is_unsigned_v<T>) {
+ return std::numeric_limits<T>::lowest();
+ }
+ else {
+ return b > T(0) ? std::numeric_limits<T>::lowest() : std::numeric_limits<T>::max();
+ }
+ }
+};
+
+template<typename T> struct vec_op_mul : public op_each_vvv<T, vec_op_mul<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return T((uint64_t(a) * uint64_t(b)) & uint64_t(~T(0))); }
+};
+
+template<typename T> struct vec_op_mulhi : public op_each_vvv<T, vec_op_mulhi<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept {
+ uint64_t result = uint64_t(int64_t(cast_int(a))) * uint64_t(int64_t(cast_int(b)));
+ return T(T(result >> (sizeof(T) * 8u)) & T(~T(0)));
+ }
+};
+
+template<typename T> struct vec_op_mulhu : public op_each_vvv<T, vec_op_mulhu<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept {
+ uint64_t result = uint64_t(a) * uint64_t(b);
+ return T(result >> (sizeof(T) * 8u)) & uint64_t(~T(0));
+ }
+};
+
+struct vec_op_mul_u64_lo_u32 : public op_each_vvv<uint64_t, vec_op_mul_u64_lo_u32> {
+ static ASMJIT_INLINE_NODEBUG uint64_t apply_one(const uint64_t& a, const uint64_t& b) noexcept {
+ return uint64_t(a) * uint64_t(b & 0xFFFFFFFFu);
+ }
+};
+
+struct vec_op_mhadd_i16_i32 : public op_each_vvv<uint32_t, vec_op_mhadd_i16_i32> {
+ static ASMJIT_INLINE_NODEBUG uint32_t apply_one(const uint32_t& a, const uint32_t& b) noexcept {
+ uint32_t al = uint32_t(int32_t(int16_t(a & 0xFFFF)));
+ uint32_t ah = uint32_t(int32_t(int16_t(a >> 16)));
+
+ uint32_t bl = uint32_t(int32_t(int16_t(b & 0xFFFF)));
+ uint32_t bh = uint32_t(int32_t(int16_t(b >> 16)));
+
+ return al * bl + ah * bh;
+ }
+};
+
+template<typename T> struct vec_op_madd : public op_each_vvvv<T, vec_op_madd<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return T((uint64_t(a) * uint64_t(b) + uint64_t(c)) & uint64_t(~T(0))); }
+};
+
+template<typename T> struct vec_op_min : public op_each_vvv<T, vec_op_min<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a < b ? a : b; }
+};
+
+template<typename T> struct vec_op_max : public op_each_vvv<T, vec_op_max<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a > b ? a : b; }
+};
+
+template<typename T> struct vec_op_cmp_eq : public op_each_vvv<T, vec_op_cmp_eq<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a == b ? Support::bit_ones<T> : T(0); }
+};
+
+template<typename T> struct vec_op_cmp_ne : public op_each_vvv<T, vec_op_cmp_ne<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a != b ? Support::bit_ones<T> : T(0); }
+};
+
+template<typename T> struct vec_op_cmp_gt : public op_each_vvv<T, vec_op_cmp_gt<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a > b ? Support::bit_ones<T> : T(0); }
+};
+
+template<typename T> struct vec_op_cmp_ge : public op_each_vvv<T, vec_op_cmp_ge<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a >= b ? Support::bit_ones<T> : T(0); }
+};
+
+template<typename T> struct vec_op_cmp_lt : public op_each_vvv<T, vec_op_cmp_lt<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a < b ? Support::bit_ones<T> : T(0); }
+};
+
+template<typename T> struct vec_op_cmp_le : public op_each_vvv<T, vec_op_cmp_le<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a <= b ? Support::bit_ones<T> : T(0); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fadd : public op_scalar_vvv<kB, T, scalar_op_fadd<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fadd(a, b); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fsub : public op_scalar_vvv<kB, T, scalar_op_fsub<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fsub(a, b); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmul : public op_scalar_vvv<kB, T, scalar_op_fmul<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fmul(a, b); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fdiv : public op_scalar_vvv<kB, T, scalar_op_fdiv<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fdiv(a, b); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmin_ternary : public op_scalar_vvv<kB, T, scalar_op_fmin_ternary<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a < b ? a : b; }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmax_ternary : public op_scalar_vvv<kB, T, scalar_op_fmax_ternary<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a > b ? a : b; }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmin_finite : public op_scalar_vvv<kB, T, scalar_op_fmin_finite<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return std::isnan(a) ? b : std::isnan(b) ? a : Support::min(a, b); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmax_finite : public op_scalar_vvv<kB, T, scalar_op_fmax_finite<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return std::isnan(a) ? b : std::isnan(b) ? a : Support::max(a, b); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmadd_nofma : public op_scalar_vvvv<kB, T, scalar_op_fmadd_nofma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(a, b, c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmsub_nofma : public op_scalar_vvvv<kB, T, scalar_op_fmsub_nofma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(a, b, -c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fnmadd_nofma : public op_scalar_vvvv<kB, T, scalar_op_fnmadd_nofma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(-a, b, c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fnmsub_nofma : public op_scalar_vvvv<kB, T, scalar_op_fnmsub_nofma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(-a, b, -c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmadd_fma : public op_scalar_vvvv<kB, T, scalar_op_fmadd_fma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(a, b, c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fmsub_fma : public op_scalar_vvvv<kB, T, scalar_op_fmsub_fma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(a, b, -c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fnmadd_fma : public op_scalar_vvvv<kB, T, scalar_op_fnmadd_fma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(-a, b, c); }
+};
+
+template<ScalarOpBehavior kB, typename T> struct scalar_op_fnmsub_fma : public op_scalar_vvvv<kB, T, scalar_op_fnmsub_fma<kB, T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(-a, b, -c); }
+};
+
+template<typename T> struct vec_op_fadd : public op_each_vvv<T, vec_op_fadd<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fadd(a, b); }
+};
+
+template<typename T> struct vec_op_fsub : public op_each_vvv<T, vec_op_fsub<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fsub(a, b); }
+};
+
+template<typename T> struct vec_op_fmul : public op_each_vvv<T, vec_op_fmul<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fmul(a, b); }
+};
+
+template<typename T> struct vec_op_fdiv : public op_each_vvv<T, vec_op_fdiv<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return fdiv(a, b); }
+};
+
+template<typename T> struct vec_op_fmin_ternary : public op_each_vvv<T, vec_op_fmin_ternary<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a < b ? a : b; }
+};
+
+template<typename T> struct vec_op_fmax_ternary : public op_each_vvv<T, vec_op_fmax_ternary<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return a > b ? a : b; }
+};
+
+template<typename T> struct vec_op_fmin_finite : public op_each_vvv<T, vec_op_fmin_finite<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return std::isnan(a) ? b : std::isnan(b) ? a : Support::min(a, b); }
+};
+
+template<typename T> struct vec_op_fmax_finite : public op_each_vvv<T, vec_op_fmax_finite<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b) noexcept { return std::isnan(a) ? b : std::isnan(b) ? a : Support::max(a, b); }
+};
+
+template<typename T> struct vec_op_fmadd_nofma : public op_each_vvvv<T, vec_op_fmadd_nofma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(a, b, c); }
+};
+
+template<typename T> struct vec_op_fmsub_nofma : public op_each_vvvv<T, vec_op_fmsub_nofma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(a, b, -c); }
+};
+
+template<typename T> struct vec_op_fnmadd_nofma : public op_each_vvvv<T, vec_op_fnmadd_nofma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(-a, b, c); }
+};
+
+template<typename T> struct vec_op_fnmsub_nofma : public op_each_vvvv<T, vec_op_fnmsub_nofma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_nofma_ref(-a, b, -c); }
+};
+
+template<typename T> struct vec_op_fmadd_fma : public op_each_vvvv<T, vec_op_fmadd_fma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(a, b, c); }
+};
+
+template<typename T> struct vec_op_fmsub_fma : public op_each_vvvv<T, vec_op_fmsub_fma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(a, b, -c); }
+};
+
+template<typename T> struct vec_op_fnmadd_fma : public op_each_vvvv<T, vec_op_fnmadd_fma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(-a, b, c); }
+};
+
+template<typename T> struct vec_op_fnmsub_fma : public op_each_vvvv<T, vec_op_fnmsub_fma<T>> {
+ static ASMJIT_INLINE_NODEBUG T apply_one(const T& a, const T& b, const T& c) noexcept { return fmadd_fma_ref(-a, b, -c); }
+};
+
+template<typename T>
+struct cmp_result {
+ typedef T Result;
+
+ static ASMJIT_INLINE_NODEBUG Result make(bool result) noexcept { return result ? Result(~Result(0)) : Result(0); }
+};
+
+template<>
+struct cmp_result<float> {
+ typedef uint32_t Result;
+
+ static ASMJIT_INLINE_NODEBUG Result make(bool result) noexcept { return result ? ~Result(0) : Result(0); }
+};
+
+template<>
+struct cmp_result<double> {
+ typedef uint64_t Result;
+
+ static ASMJIT_INLINE_NODEBUG Result make(bool result) noexcept { return result ? ~Result(0) : Result(0); }
+};
+
+template<typename T> struct vec_op_fcmpo_eq : public op_each_vvv<T, vec_op_fcmpo_eq<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(a == b); }
+};
+
+template<typename T> struct vec_op_fcmpu_ne : public op_each_vvv<T, vec_op_fcmpu_ne<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(!(a == b)); }
+};
+
+template<typename T> struct vec_op_fcmpo_gt : public op_each_vvv<T, vec_op_fcmpo_gt<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(a > b); }
+};
+
+template<typename T> struct vec_op_fcmpo_ge : public op_each_vvv<T, vec_op_fcmpo_ge<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(a >= b); }
+};
+
+template<typename T> struct vec_op_fcmpo_lt : public op_each_vvv<T, vec_op_fcmpo_lt<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(a < b); }
+};
+
+template<typename T> struct vec_op_fcmpo_le : public op_each_vvv<T, vec_op_fcmpo_le<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(a <= b); }
+};
+
+template<typename T> struct vec_op_fcmp_ord : public op_each_vvv<T, vec_op_fcmp_ord<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(!std::isnan(a) && !std::isnan(b)); }
+};
+
+template<typename T> struct vec_op_fcmp_unord : public op_each_vvv<T, vec_op_fcmp_unord<T>> {
+ static ASMJIT_INLINE_NODEBUG typename cmp_result<T>::Result apply_one(const T& a, const T& b) noexcept { return cmp_result<T>::make(std::isnan(a) || std::isnan(b)); }
+};
+
+struct vec_op_hadd_f64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_f64[off / 8 + 0] = a.data_f64[off / 8 + 0] + a.data_f64[off / 8 + 1];
+ out.data_f64[off / 8 + 1] = b.data_f64[off / 8 + 0] + b.data_f64[off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+struct vec_op_combine_lo_hi_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = b.data_u64[off / 8 + 1];
+ out.data_u64[off / 8 + 1] = a.data_u64[off / 8 + 0];
+ }
+ return out;
+ }
+};
+
+struct vec_op_combine_hi_lo_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = b.data_u64[off / 8 + 0];
+ out.data_u64[off / 8 + 1] = a.data_u64[off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_lo_u8 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 8; i++) {
+ out.data_u8[off + i * 2 + 0] = a.data_u8[off + i];
+ out.data_u8[off + i * 2 + 1] = b.data_u8[off + i];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_hi_u8 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 8; i++) {
+ out.data_u8[off + i * 2 + 0] = a.data_u8[off + 8 + i];
+ out.data_u8[off + i * 2 + 1] = b.data_u8[off + 8 + i];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_lo_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 4; i++) {
+ out.data_u16[off / 2 + i * 2 + 0] = a.data_u16[off / 2 + i];
+ out.data_u16[off / 2 + i * 2 + 1] = b.data_u16[off / 2 + i];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_hi_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 4; i++) {
+ out.data_u16[off / 2 + i * 2 + 0] = a.data_u16[off / 2 + 4 + i];
+ out.data_u16[off / 2 + i * 2 + 1] = b.data_u16[off / 2 + 4 + i];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_lo_u32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 2; i++) {
+ out.data_u32[off / 4 + i * 2 + 0] = a.data_u32[off / 4 + i];
+ out.data_u32[off / 4 + i * 2 + 1] = b.data_u32[off / 4 + i];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_hi_u32 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 2; i++) {
+ out.data_u32[off / 4 + i * 2 + 0] = a.data_u32[off / 4 + 2 + i];
+ out.data_u32[off / 4 + i * 2 + 1] = b.data_u32[off / 4 + 2 + i];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_lo_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = a.data_u64[off / 8 + 0];
+ out.data_u64[off / 8 + 1] = b.data_u64[off / 8 + 0];
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_hi_u64 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = a.data_u64[off / 8 + 1];
+ out.data_u64[off / 8 + 1] = b.data_u64[off / 8 + 1];
+ }
+ return out;
+ }
+};
+
+// ujit::UniCompiler - Tests - SIMD - Generic Operations - VVVI
+// ============================================================
+
+struct vec_op_alignr_u128 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b, uint32_t imm) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 16; i++) {
+ out.data_u8[off + i] = i + imm < 16 ? b.data_u8[off + i + imm] : a.data_u8[off + i + imm - 16];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_shuffle_u32x4 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b, uint32_t imm) noexcept {
+ uint32_t D = (imm >> 24) & 0x3;
+ uint32_t C = (imm >> 16) & 0x3;
+ uint32_t B = (imm >> 8) & 0x3;
+ uint32_t A = (imm >> 0) & 0x3;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u32[off / 4 + 0] = a.data_u32[off / 4 + A];
+ out.data_u32[off / 4 + 1] = a.data_u32[off / 4 + B];
+ out.data_u32[off / 4 + 2] = b.data_u32[off / 4 + C];
+ out.data_u32[off / 4 + 3] = b.data_u32[off / 4 + D];
+ }
+ return out;
+ }
+};
+
+struct vec_op_interleave_shuffle_u64x2 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b, uint32_t imm) noexcept {
+ uint32_t B = (imm >> 8) & 0x1;
+ uint32_t A = (imm >> 0) & 0x1;
+
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u64[off / 8 + 0] = a.data_u64[off / 8 + A];
+ out.data_u64[off / 8 + 1] = b.data_u64[off / 8 + B];
+ }
+ return out;
+ }
+};
+
+struct vec_op_packs_i16_i8 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i8[off + 0] = saturate_i16_to_i8(a.data_i16[off / 2 + 0]);
+ out.data_i8[off + 1] = saturate_i16_to_i8(a.data_i16[off / 2 + 1]);
+ out.data_i8[off + 2] = saturate_i16_to_i8(a.data_i16[off / 2 + 2]);
+ out.data_i8[off + 3] = saturate_i16_to_i8(a.data_i16[off / 2 + 3]);
+ out.data_i8[off + 4] = saturate_i16_to_i8(a.data_i16[off / 2 + 4]);
+ out.data_i8[off + 5] = saturate_i16_to_i8(a.data_i16[off / 2 + 5]);
+ out.data_i8[off + 6] = saturate_i16_to_i8(a.data_i16[off / 2 + 6]);
+ out.data_i8[off + 7] = saturate_i16_to_i8(a.data_i16[off / 2 + 7]);
+ out.data_i8[off + 8] = saturate_i16_to_i8(b.data_i16[off / 2 + 0]);
+ out.data_i8[off + 9] = saturate_i16_to_i8(b.data_i16[off / 2 + 1]);
+ out.data_i8[off + 10] = saturate_i16_to_i8(b.data_i16[off / 2 + 2]);
+ out.data_i8[off + 11] = saturate_i16_to_i8(b.data_i16[off / 2 + 3]);
+ out.data_i8[off + 12] = saturate_i16_to_i8(b.data_i16[off / 2 + 4]);
+ out.data_i8[off + 13] = saturate_i16_to_i8(b.data_i16[off / 2 + 5]);
+ out.data_i8[off + 14] = saturate_i16_to_i8(b.data_i16[off / 2 + 6]);
+ out.data_i8[off + 15] = saturate_i16_to_i8(b.data_i16[off / 2 + 7]);
+ }
+ return out;
+ }
+};
+
+struct vec_op_packs_i16_u8 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u8[off + 0] = saturate_i16_to_u8(a.data_i16[off / 2 + 0]);
+ out.data_u8[off + 1] = saturate_i16_to_u8(a.data_i16[off / 2 + 1]);
+ out.data_u8[off + 2] = saturate_i16_to_u8(a.data_i16[off / 2 + 2]);
+ out.data_u8[off + 3] = saturate_i16_to_u8(a.data_i16[off / 2 + 3]);
+ out.data_u8[off + 4] = saturate_i16_to_u8(a.data_i16[off / 2 + 4]);
+ out.data_u8[off + 5] = saturate_i16_to_u8(a.data_i16[off / 2 + 5]);
+ out.data_u8[off + 6] = saturate_i16_to_u8(a.data_i16[off / 2 + 6]);
+ out.data_u8[off + 7] = saturate_i16_to_u8(a.data_i16[off / 2 + 7]);
+ out.data_u8[off + 8] = saturate_i16_to_u8(b.data_i16[off / 2 + 0]);
+ out.data_u8[off + 9] = saturate_i16_to_u8(b.data_i16[off / 2 + 1]);
+ out.data_u8[off + 10] = saturate_i16_to_u8(b.data_i16[off / 2 + 2]);
+ out.data_u8[off + 11] = saturate_i16_to_u8(b.data_i16[off / 2 + 3]);
+ out.data_u8[off + 12] = saturate_i16_to_u8(b.data_i16[off / 2 + 4]);
+ out.data_u8[off + 13] = saturate_i16_to_u8(b.data_i16[off / 2 + 5]);
+ out.data_u8[off + 14] = saturate_i16_to_u8(b.data_i16[off / 2 + 6]);
+ out.data_u8[off + 15] = saturate_i16_to_u8(b.data_i16[off / 2 + 7]);
+ }
+ return out;
+ }
+};
+
+struct vec_op_packs_i32_i16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_i16[off / 2 + 0] = saturate_i32_to_i16(a.data_i32[off / 4 + 0]);
+ out.data_i16[off / 2 + 1] = saturate_i32_to_i16(a.data_i32[off / 4 + 1]);
+ out.data_i16[off / 2 + 2] = saturate_i32_to_i16(a.data_i32[off / 4 + 2]);
+ out.data_i16[off / 2 + 3] = saturate_i32_to_i16(a.data_i32[off / 4 + 3]);
+ out.data_i16[off / 2 + 4] = saturate_i32_to_i16(b.data_i32[off / 4 + 0]);
+ out.data_i16[off / 2 + 5] = saturate_i32_to_i16(b.data_i32[off / 4 + 1]);
+ out.data_i16[off / 2 + 6] = saturate_i32_to_i16(b.data_i32[off / 4 + 2]);
+ out.data_i16[off / 2 + 7] = saturate_i32_to_i16(b.data_i32[off / 4 + 3]);
+ }
+ return out;
+ }
+};
+
+struct vec_op_packs_i32_u16 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ out.data_u16[off / 2 + 0] = saturate_i32_to_u16(a.data_i32[off / 4 + 0]);
+ out.data_u16[off / 2 + 1] = saturate_i32_to_u16(a.data_i32[off / 4 + 1]);
+ out.data_u16[off / 2 + 2] = saturate_i32_to_u16(a.data_i32[off / 4 + 2]);
+ out.data_u16[off / 2 + 3] = saturate_i32_to_u16(a.data_i32[off / 4 + 3]);
+ out.data_u16[off / 2 + 4] = saturate_i32_to_u16(b.data_i32[off / 4 + 0]);
+ out.data_u16[off / 2 + 5] = saturate_i32_to_u16(b.data_i32[off / 4 + 1]);
+ out.data_u16[off / 2 + 6] = saturate_i32_to_u16(b.data_i32[off / 4 + 2]);
+ out.data_u16[off / 2 + 7] = saturate_i32_to_u16(b.data_i32[off / 4 + 3]);
+ }
+ return out;
+ }
+};
+
+// ujit::UniCompiler - Tests - SIMD - Generic Operations - VVVV
+// ============================================================
+
+struct vec_op_blendv_bits : public op_each_vvvv<uint32_t, vec_op_blendv_bits> {
+ static ASMJIT_INLINE_NODEBUG uint32_t apply_one(const uint32_t& a, const uint32_t& b, const uint32_t& c) noexcept { return ((a & ~c) | (b & c)); }
+};
+
+struct vec_op_swizzlev_u8 {
+ template<uint32_t kW>
+ static ASMJIT_INLINE VecOverlay<kW> apply(const VecOverlay<kW>& a, const VecOverlay<kW>& b) noexcept {
+ VecOverlay<kW> out{};
+ for (uint32_t off = 0; off < kW; off += 16) {
+ for (uint32_t i = 0; i < 16; i++) {
+ size_t sel = b.data_u8[off + i] & (0x8F); // 3 bits ignored.
+ out.data_u8[off + i] = sel & 0x80 ? uint8_t(0) : a.data_u8[off + sel];
+ }
+ }
+ return out;
+ }
+};
+
+struct vec_op_div255_u16 : public op_each_vv<uint16_t, vec_op_div255_u16> {
+ static ASMJIT_INLINE uint16_t apply_one(const uint16_t& a) noexcept {
+ uint32_t x = a + 0x80u;
+ return uint16_t((x + (x >> 8)) >> 8);
+ }
+};
+
+struct vec_op_div65535_u32 : public op_each_vv<uint32_t, vec_op_div65535_u32> {
+ static ASMJIT_INLINE uint32_t apply_one(const uint32_t& a) noexcept {
+ uint32_t x = a + 0x8000u;
+ return uint32_t((x + (x >> 16)) >> 16);
+ }
+};
+
+// ujit::UniCompiler - Tests - SIMD - Utilities
+// ============================================
+
+template<uint32_t kW>
+static void fill_random_bytes(DataGenInt& dg, VecOverlay<kW>& dst) noexcept {
+ for (uint32_t i = 0; i < kW / 8u; i++) {
+ dst.data_u64[i] = dg.next_uint64();
+ }
+}
+
+template<uint32_t kW>
+static void fill_random_f32(DataGenInt& dg, VecOverlay<kW>& dst) noexcept {
+ for (uint32_t i = 0; i < kW / 4u; i++) {
+ dst.data_f32[i] = dg.next_float32();
+ }
+}
+
+template<uint32_t kW>
+static void fill_random_f64(DataGenInt& dg, VecOverlay<kW>& dst) noexcept {
+ for (uint32_t i = 0; i < kW / 8u; i++) {
+ dst.data_f64[i] = dg.next_float64();
+ }
+}
+
+template<uint32_t kW>
+static void fill_random_data(DataGenInt& dg, VecOverlay<kW>& dst, VecElementType element_type) noexcept {
+ switch (element_type) {
+ case VecElementType::kFloat32:
+ fill_random_f32(dg, dst);
+ break;
+
+ case VecElementType::kFloat64:
+ fill_random_f64(dg, dst);
+ break;
+
+ default:
+ fill_random_bytes(dg, dst);
+ break;
+ }
+}
+
+// ujit::UniCompiler - Tests - SIMD - Verification
+// ===============================================
+
+template<uint32_t kW>
+static ASMJIT_NOINLINE void test_vecop_vv_failed(UniOpVV op, Variation variation, const VecOverlay<kW>& arg0, const VecOverlay<kW>& observed, const VecOverlay<kW>& expected, const char* assembly) noexcept {
+ VecOpInfo op_info = vec_op_info_vv(op);
+
+ String arg0_str = vec_stringify(arg0, op_info.arg(0));
+ String observed_str = vec_stringify(observed, op_info.ret());
+ String expected_str = vec_stringify(expected, op_info.ret());
+
+ EXPECT(false)
+ .message("Operation '%s' (variation %u) failed:\n"
+ " Input #0: %s\n"
+ " Expected: %s\n"
+ " Observed: %s\n"
+ "Assembly:\n%s",
+ vec_op_name_vv(op),
+ variation.value,
+ arg0_str.data(),
+ expected_str.data(),
+ observed_str.data(),
+ assembly);
+}
+
+template<uint32_t kW>
+static ASMJIT_NOINLINE void test_vecop_vvi_failed(UniOpVVI op, Variation variation, const VecOverlay<kW>& arg0, const VecOverlay<kW>& observed, const VecOverlay<kW>& expected, uint32_t imm, const char* assembly) noexcept {
+ VecOpInfo op_info = vec_op_info_vvi(op);
+
+ String arg0_str = vec_stringify(arg0, op_info.arg(0));
+ String observed_str = vec_stringify(observed, op_info.ret());
+ String expected_str = vec_stringify(expected, op_info.ret());
+
+ EXPECT(false)
+ .message("Operation '%s' (variation %u) failed:\n"
+ " Input #0: %s\n"
+ " ImmValue: %u (0x%08X)\n"
+ " Expected: %s\n"
+ " Observed: %s\n"
+ "Assembly:\n%s",
+ vec_op_name_vvi(op),
+ variation.value,
+ arg0_str.data(),
+ imm, imm,
+ expected_str.data(),
+ observed_str.data(),
+ assembly);
+}
+
+template<uint32_t kW>
+static ASMJIT_NOINLINE void test_vecop_vvv_failed(UniOpVVV op, Variation variation, const VecOverlay<kW>& arg0, const VecOverlay<kW>& arg1, const VecOverlay<kW>& observed, const VecOverlay<kW>& expected, const char* assembly) noexcept {
+ VecOpInfo op_info = vec_op_info_vvv(op);
+
+ String arg0_str = vec_stringify(arg0, op_info.arg(0));
+ String arg1_str = vec_stringify(arg1, op_info.arg(1));
+ String observed_str = vec_stringify(observed, op_info.ret());
+ String expected_str = vec_stringify(expected, op_info.ret());
+
+ EXPECT(false)
+ .message("Operation '%s' (variation %u) failed:\n"
+ " Input #0: %s\n"
+ " Input #1: %s\n"
+ " Expected: %s\n"
+ " Observed: %s\n"
+ "Assembly:\n%s",
+ vec_op_name_vvv(op),
+ variation.value,
+ arg0_str.data(),
+ arg1_str.data(),
+ expected_str.data(),
+ observed_str.data(),
+ assembly);
+}
+
+template<uint32_t kW>
+static ASMJIT_NOINLINE void test_vecop_vvvi_failed(UniOpVVVI op, Variation variation, const VecOverlay<kW>& arg0, const VecOverlay<kW>& arg1, const VecOverlay<kW>& observed, const VecOverlay<kW>& expected, uint32_t imm, const char* assembly) noexcept {
+ VecOpInfo op_info = vec_op_info_vvvi(op);
+
+ String arg0_str = vec_stringify(arg0, op_info.arg(0));
+ String arg1_str = vec_stringify(arg1, op_info.arg(1));
+ String observed_str = vec_stringify(observed, op_info.ret());
+ String expected_str = vec_stringify(expected, op_info.ret());
+
+ EXPECT(false)
+ .message("Operation '%s' (variation %u) failed:\n"
+ " Input #1: %s\n"
+ " Input #2: %s\n"
+ " ImmValue: %u (0x%08X)\n"
+ " Expected: %s\n"
+ " Observed: %s\n"
+ "Assembly:\n%s",
+ vec_op_name_vvvi(op),
+ variation.value,
+ arg0_str.data(),
+ arg1_str.data(),
+ imm, imm,
+ expected_str.data(),
+ observed_str.data(),
+ assembly);
+}
+
+template<uint32_t kW>
+static ASMJIT_NOINLINE void test_vecop_vvvv_failed(UniOpVVVV op, Variation variation, const VecOverlay<kW>& arg0, const VecOverlay<kW>& arg1, const VecOverlay<kW>& arg2, const VecOverlay<kW>& observed, const VecOverlay<kW>& expected, const char* assembly) noexcept {
+ VecOpInfo op_info = vec_op_info_vvvv(op);
+
+ String arg0_str = vec_stringify(arg0, op_info.arg(0));
+ String arg1_str = vec_stringify(arg1, op_info.arg(1));
+ String arg2_str = vec_stringify(arg2, op_info.arg(2));
+ String observed_str = vec_stringify(observed, op_info.ret());
+ String expected_str = vec_stringify(expected, op_info.ret());
+
+ EXPECT(false)
+ .message("Operation '%s' (variation %u) failed\n"
+ " Input #1: %s\n"
+ " Input #2: %s\n"
+ " Input #3: %s\n"
+ " Expected: %s\n"
+ " Observed: %s\n"
+ "Assembly:\n%s",
+ vec_op_name_vvvv(op),
+ variation.value,
+ arg0_str.data(),
+ arg1_str.data(),
+ arg2_str.data(),
+ expected_str.data(),
+ observed_str.data(),
+ assembly);
+}
+
+// ujit::UniCompiler - Tests - Integer Operations - VV
+// ===================================================
+
+template<VecWidth kVecWidth, UniOpVV kOp, typename GenericOp, typename Constraint>
+static ASMJIT_NOINLINE void test_vecop_vv_constraint(JitContext& ctx, Variation variation = Variation{0}) {
+ constexpr uint32_t kW = byte_width_from_vec_width(kVecWidth);
+
+ TestVVFunc compiled_apply = create_func_vv(ctx, kVecWidth, kOp, variation);
+ DataGenInt dg(kRandomSeed);
+
+ VecOpInfo op_info = vec_op_info_vv(kOp);
+
+ for (uint32_t iter = 0; iter < kTestIterCount; iter++) {
+ VecOverlay<kW> a {};
+ VecOverlay<kW> observed {};
+ VecOverlay<kW> expected {};
+
+ fill_random_data(dg, a, op_info.arg(0));
+ Constraint::apply(a);
+
+ compiled_apply(&observed, &a);
+ expected = GenericOp::apply(a);
+
+ if (!vec_eq(observed, expected, op_info.ret())) {
+ test_vecop_vv_failed(kOp, variation, a, observed, expected, ctx.logger_content());
+ }
+ }
+
+ ctx.rt.release(compiled_apply);
+}
+
+template<VecWidth kVecWidth, UniOpVV kOp, typename GenericOp>
+static void test_vecop_vv(JitContext& ctx, Variation variation = Variation{0}) {
+ return test_vecop_vv_constraint<kVecWidth, kOp, GenericOp, ConstraintNone>(ctx, variation);
+}
+
+// ujit::UniCompiler - Tests - SIMD - Integer Operations - VVI
+// ===========================================================
+
+template<VecWidth kVecWidth, UniOpVVI kOp, typename GenericOp, typename Constraint>
+static ASMJIT_NOINLINE void test_vecop_vvi_constraint(JitContext& ctx, uint32_t imm, Variation variation = Variation{0}) {
+ constexpr uint32_t kW = byte_width_from_vec_width(kVecWidth);
+
+ TestVVFunc compiled_apply = create_func_vvi(ctx, kVecWidth, kOp, imm, variation);
+ DataGenInt dg(kRandomSeed);
+
+ VecOpInfo op_info = vec_op_info_vvi(kOp);
+
+ for (uint32_t iter = 0; iter < kTestIterCount; iter++) {
+ VecOverlay<kW> a {};
+ VecOverlay<kW> observed {};
+ VecOverlay<kW> expected {};
+
+ fill_random_data(dg, a, op_info.arg(0));
+ Constraint::apply(a);
+
+ compiled_apply(&observed, &a);
+ expected = GenericOp::apply(a, imm);
+
+ if (!vec_eq(observed, expected, op_info.ret())) {
+ test_vecop_vvi_failed(kOp, variation, a, observed, expected, imm, ctx.logger_content());
+ }
+ }
+
+ ctx.rt.release(compiled_apply);
+}
+
+template<VecWidth kVecWidth, UniOpVVI kOp, typename GenericOp>
+static void test_vecop_vvi(JitContext& ctx, uint32_t imm, Variation variation = Variation{0}) {
+ return test_vecop_vvi_constraint<kVecWidth, kOp, GenericOp, ConstraintNone>(ctx, imm, variation);
+}
+
+// ujit::UniCompiler - Tests - SIMD - Integer Operations - VVV
+// ===========================================================
+
+template<VecWidth kVecWidth, UniOpVVV kOp, typename GenericOp, typename Constraint>
+static ASMJIT_NOINLINE void test_vecop_vvv_constraint(JitContext& ctx, Variation variation = Variation{0}) {
+ constexpr uint32_t kW = byte_width_from_vec_width(kVecWidth);
+
+ TestVVVFunc compiled_apply = create_func_vvv(ctx, kVecWidth, kOp, variation);
+ DataGenInt dg(kRandomSeed);
+
+ VecOpInfo op_info = vec_op_info_vvv(kOp);
+
+ for (uint32_t iter = 0; iter < kTestIterCount; iter++) {
+ VecOverlay<kW> a {};
+ VecOverlay<kW> b {};
+ VecOverlay<kW> observed {};
+ VecOverlay<kW> expected {};
+
+ fill_random_data(dg, a, op_info.arg(0));
+ fill_random_data(dg, b, op_info.arg(1));
+ Constraint::apply(a);
+ Constraint::apply(b);
+
+ compiled_apply(&observed, &a, &b);
+ expected = GenericOp::apply(a, b);
+
+ if (!vec_eq(observed, expected, op_info.ret())) {
+ test_vecop_vvv_failed(kOp, variation, a, b, observed, expected, ctx.logger_content());
+ }
+ }
+
+ ctx.rt.release(compiled_apply);
+}
+
+template<VecWidth kVecWidth, UniOpVVV kOp, typename GenericOp>
+static void test_vecop_vvv(JitContext& ctx, Variation variation = Variation{0}) {
+ return test_vecop_vvv_constraint<kVecWidth, kOp, GenericOp, ConstraintNone>(ctx, variation);
+}
+
+// ujit::UniCompiler - Tests - SIMD - Integer Operations - VVVI
+// ============================================================
+
+template<VecWidth kVecWidth, UniOpVVVI kOp, typename GenericOp, typename Constraint>
+static ASMJIT_NOINLINE void test_vecop_vvvi_constraint(JitContext& ctx, uint32_t imm, Variation variation = Variation{0}) {
+ constexpr uint32_t kW = byte_width_from_vec_width(kVecWidth);
+
+ TestVVVFunc compiled_apply = create_func_vvvi(ctx, kVecWidth, kOp, imm, variation);
+ DataGenInt dg(kRandomSeed);
+
+ VecOpInfo op_info = vec_op_info_vvvi(kOp);
+
+ for (uint32_t iter = 0; iter < kTestIterCount; iter++) {
+ VecOverlay<kW> a {};
+ VecOverlay<kW> b {};
+ VecOverlay<kW> observed {};
+ VecOverlay<kW> expected {};
+
+ fill_random_data(dg, a, op_info.arg(0));
+ fill_random_data(dg, b, op_info.arg(1));
+ Constraint::apply(a);
+ Constraint::apply(b);
+
+ compiled_apply(&observed, &a, &b);
+ expected = GenericOp::apply(a, b, imm);
+
+ if (!vec_eq(observed, expected, op_info.ret())) {
+ test_vecop_vvvi_failed(kOp, variation, a, b, observed, expected, imm, ctx.logger_content());
+ }
+ }
+
+ ctx.rt.release(compiled_apply);
+}
+
+template<VecWidth kVecWidth, UniOpVVVI kOp, typename GenericOp>
+static void test_vecop_vvvi(JitContext& ctx, uint32_t imm, Variation variation = Variation{0}) {
+ return test_vecop_vvvi_constraint<kVecWidth, kOp, GenericOp, ConstraintNone>(ctx, imm, variation);
+}
+
+// ujit::UniCompiler - Tests - SIMD - Integer Operations - VVVV
+// ============================================================
+
+template<VecWidth kVecWidth, UniOpVVVV kOp, typename GenericOp, typename Constraint>
+static ASMJIT_NOINLINE void test_vecop_vvvv_constraint(JitContext& ctx, Variation variation = Variation{0}) {
+ constexpr uint32_t kW = byte_width_from_vec_width(kVecWidth);
+
+ TestVVVVFunc compiled_apply = create_func_vvvv(ctx, kVecWidth, kOp, variation);
+ DataGenInt dg(kRandomSeed);
+
+ VecOpInfo op_info = vec_op_info_vvvv(kOp);
+
+ for (uint32_t iter = 0; iter < kTestIterCount; iter++) {
+ VecOverlay<kW> a {};
+ VecOverlay<kW> b {};
+ VecOverlay<kW> c {};
+ VecOverlay<kW> observed {};
+ VecOverlay<kW> expected {};
+
+ fill_random_data(dg, a, op_info.arg(0));
+ fill_random_data(dg, b, op_info.arg(1));
+ fill_random_data(dg, c, op_info.arg(2));
+ Constraint::apply(a);
+ Constraint::apply(b);
+ Constraint::apply(c);
+
+ compiled_apply(&observed, &a, &b, &c);
+ expected = GenericOp::apply(a, b, c);
+
+ if (!vec_eq(observed, expected, op_info.ret())) {
+ test_vecop_vvvv_failed(kOp, variation, a, b, c, observed, expected, ctx.logger_content());
+ }
+ }
+}
+
+template<VecWidth kVecWidth, UniOpVVVV kOp, typename GenericOp>
+static void test_vecop_vvvv(JitContext& ctx, Variation variation = Variation{0}) {
+ return test_vecop_vvvv_constraint<kVecWidth, kOp, GenericOp, ConstraintNone>(ctx, variation);
+}
+
+// ujit::UniCompiler - Tests - SIMD - Runner
+// =========================================
+
+template<VecWidth kVecWidth>
+static ASMJIT_NOINLINE void test_simd_ops(JitContext& ctx) {
+ // We need to know some behaviors in advance so we can select the right test function,
+ // so create a dummy compiler and extract the necessary information from it.
+ ScalarOpBehavior scalar_op_behavior {};
+ FMAddOpBehavior fmadd_op_behavior {};
+ FloatToIntOutsideRangeBehavior float_to_int_behavior {};
+
+ {
+ ctx.prepare();
+ UniCompiler uc(&ctx.cc, ctx.features, ctx.cpu_hints);
+
+ scalar_op_behavior = uc.scalar_op_behavior();
+ fmadd_op_behavior = uc.fmadd_op_behavior();
+ float_to_int_behavior = uc.float_to_int_outside_range_behavior();
+ }
+
+ bool valgrind_fma_bug = false;
+
+#if defined(ASMJIT_UJIT_X86)
+ // When running under valgrind there is a bug in its instrumentation of FMA SS/SD instructions.
+ // Instead of keeping the unaffected elements in the destination register they are cleared instead,
+ // which would cause test failures. So, detect whether we are running under Valgind that has this
+ // bug and avoid scalar FMA tests in that case.
+ if (fmadd_op_behavior != FMAddOpBehavior::kNoFMA) {
+ float a[4] = { 1, 2, 3, 4 };
+ float b[4] = { 2, 4, 8, 1 };
+ float c[4] = { 4, 7, 3, 9 };
+
+ float d[4] {};
+ madd_fma_check_valgrind_bug(a, b, c, d);
+
+ valgrind_fma_bug = d[1] == 0.0f;
+ }
+#endif // ASMJIT_UJIT_X86
+
+ INFO(" Testing mov");
+ {
+ test_vecop_vv<kVecWidth, UniOpVV::kMov, vec_op_mov>(ctx);
+ test_vecop_vv<kVecWidth, UniOpVV::kMovU64, vec_op_mov_u64>(ctx);
+ }
+
+ INFO(" Testing broadcast");
+ {
+ // Test all broadcasts - vector based, GP to vector, and memory to vector.
+ for (uint32_t v = 0; v < kNumVariationsVV_Broadcast; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastU8Z, vec_op_broadcast_u8>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastU16Z, vec_op_broadcast_u16>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastU8, vec_op_broadcast_u8>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastU16, vec_op_broadcast_u16>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastU32, vec_op_broadcast_u32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastU64, vec_op_broadcast_u64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastF32, vec_op_broadcast_u32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastF64, vec_op_broadcast_u64>(ctx, Variation{v});
+
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV128_U32, vec_op_broadcast_u128>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV128_U64, vec_op_broadcast_u128>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV128_F32, vec_op_broadcast_u128>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV128_F64, vec_op_broadcast_u128>(ctx, Variation{v});
+
+ if constexpr (kVecWidth > VecWidth::k256) {
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV256_U32, vec_op_broadcast_u256>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV256_U64, vec_op_broadcast_u256>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV256_F32, vec_op_broadcast_u256>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kBroadcastV256_F64, vec_op_broadcast_u256>(ctx, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing abs (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kAbsI8, vec_op_abs<int8_t>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kAbsI16, vec_op_abs<int16_t>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kAbsI32, vec_op_abs<int32_t>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kAbsI64, vec_op_abs<int64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing not (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kNotU32, vec_op_not<uint32_t>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kNotU64, vec_op_not<uint64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing cvt (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI8LoToI16, vec_op_cvt_i8_lo_to_i16>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI8HiToI16, vec_op_cvt_i8_hi_to_i16>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU8LoToU16, vec_op_cvt_u8_lo_to_u16>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU8HiToU16, vec_op_cvt_u8_hi_to_u16>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI8ToI32, vec_op_cvt_i8_to_i32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU8ToU32, vec_op_cvt_u8_to_u32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI16LoToI32, vec_op_cvt_i16_lo_to_i32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI16HiToI32, vec_op_cvt_i16_hi_to_i32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU16LoToU32, vec_op_cvt_u16_lo_to_u32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU16HiToU32, vec_op_cvt_u16_hi_to_u32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI32LoToI64, vec_op_cvt_i32_lo_to_i64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI32HiToI64, vec_op_cvt_i32_hi_to_i64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU32LoToU64, vec_op_cvt_u32_lo_to_u64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtU32HiToU64, vec_op_cvt_u32_hi_to_u64>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing abs (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kAbsF32, vec_op_fabs<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kAbsF64, vec_op_fabs<double>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing not (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kNotF32, vec_op_not<uint32_t>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kNotF64, vec_op_not<uint64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing rounding (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ // Variation 2 means that the source operand is memory, which would ALWAYS zero the rest of the register.
+ if (scalar_op_behavior == ScalarOpBehavior::kZeroing || v == 2u) {
+ test_vecop_vv<kVecWidth, UniOpVV::kTruncF32S, scalar_op_trunc<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kTruncF64S, scalar_op_trunc<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kFloorF32S, scalar_op_floor<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kFloorF64S, scalar_op_floor<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCeilF32S, scalar_op_ceil<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCeilF64S, scalar_op_ceil<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundEvenF32S, scalar_op_round_even<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundEvenF64S, scalar_op_round_even<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfAwayF32S, scalar_op_round_half_away<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfAwayF64S, scalar_op_round_half_away<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfUpF32S, scalar_op_round_half_up<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfUpF64S, scalar_op_round_half_up<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{v});
+ }
+ else {
+ test_vecop_vv<kVecWidth, UniOpVV::kTruncF32S, scalar_op_trunc<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kTruncF64S, scalar_op_trunc<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kFloorF32S, scalar_op_floor<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kFloorF64S, scalar_op_floor<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCeilF32S, scalar_op_ceil<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCeilF64S, scalar_op_ceil<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundEvenF32S, scalar_op_round_even<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundEvenF64S, scalar_op_round_even<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfAwayF32S, scalar_op_round_half_away<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfAwayF64S, scalar_op_round_half_away<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfUpF32S, scalar_op_round_half_up<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfUpF64S, scalar_op_round_half_up<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{v});
+ }
+
+ test_vecop_vv<kVecWidth, UniOpVV::kTruncF32, vec_op_trunc<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kTruncF64, vec_op_trunc<double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kFloorF32, vec_op_floor<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kFloorF64, vec_op_floor<double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCeilF32, vec_op_ceil<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCeilF64, vec_op_ceil<double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundEvenF32, vec_op_round_even<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundEvenF64, vec_op_round_even<double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfAwayF32, vec_op_round_half_away<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfAwayF64, vec_op_round_half_away<double>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfUpF32, vec_op_round_half_up<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRoundHalfUpF64, vec_op_round_half_up<double>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing rcp (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kRcpF32, vec_op_rcp<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kRcpF64, vec_op_rcp<double>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing sqrt (float)");
+ {
+ if (scalar_op_behavior == ScalarOpBehavior::kZeroing) {
+ test_vecop_vv<kVecWidth, UniOpVV::kSqrtF32S, scalar_op_sqrt<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vv<kVecWidth, UniOpVV::kSqrtF64S, scalar_op_sqrt<ScalarOpBehavior::kZeroing, double>>(ctx);
+ }
+ else {
+ test_vecop_vv<kVecWidth, UniOpVV::kSqrtF32S, scalar_op_sqrt<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vv<kVecWidth, UniOpVV::kSqrtF64S, scalar_op_sqrt<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+ }
+
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ test_vecop_vv<kVecWidth, UniOpVV::kSqrtF32, vec_op_sqrt<float>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kSqrtF64, vec_op_sqrt<double>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing cvt (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVV; v++) {
+ // TODO: [JIT] Re-enable when the content of the remaining part of the register is formalized.
+ // test_vecop_vv<kVecWidth, UniOpVV::kCvtF32ToF64S, scalar_op_cvt_f32_to_f64>(ctx);
+ // test_vecop_vv<kVecWidth, UniOpVV::kCvtF64ToF32S, scalar_op_cvt_f64_to_f32>(ctx);
+
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI32ToF32, vec_op_cvt_i32_to_f32>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtF32LoToF64, vec_op_cvt_f32_lo_to_f64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtF32HiToF64, vec_op_cvt_f32_hi_to_f64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtF64ToF32Lo, vec_op_cvt_f64_to_f32_lo>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtF64ToF32Hi, vec_op_cvt_f64_to_f32_hi>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI32LoToF64, vec_op_cvt_i32_lo_to_f64>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtI32HiToF64, vec_op_cvt_i32_hi_to_f64>(ctx, Variation{v});
+
+ if (float_to_int_behavior == FloatToIntOutsideRangeBehavior::kSmallestValue) {
+ constexpr FloatToIntOutsideRangeBehavior behavior = FloatToIntOutsideRangeBehavior::kSmallestValue;
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtTruncF32ToI32, vec_op_cvt_trunc_f32_to_i32<behavior>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtTruncF64ToI32Lo, vec_op_cvt_trunc_f64_to_i32_lo<behavior>>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtTruncF64ToI32Hi, vec_op_cvt_trunc_f64_to_i32_hi<behavior>>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtRoundF32ToI32, vec_op_cvt_round_f32_to_i32<behavior>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtRoundF64ToI32Lo, vec_op_cvt_round_f64_to_i32_lo<behavior>>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtRoundF64ToI32Hi, vec_op_cvt_round_f64_to_i32_hi<behavior>>(ctx, Variation{0});
+ }
+ else {
+ constexpr FloatToIntOutsideRangeBehavior behavior = FloatToIntOutsideRangeBehavior::kSaturatedValue;
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtTruncF32ToI32, vec_op_cvt_trunc_f32_to_i32<behavior>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtTruncF64ToI32Lo, vec_op_cvt_trunc_f64_to_i32_lo<behavior>>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtTruncF64ToI32Hi, vec_op_cvt_trunc_f64_to_i32_hi<behavior>>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtRoundF32ToI32, vec_op_cvt_round_f32_to_i32<behavior>>(ctx, Variation{v});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtRoundF64ToI32Lo, vec_op_cvt_round_f64_to_i32_lo<behavior>>(ctx, Variation{0});
+ test_vecop_vv<kVecWidth, UniOpVV::kCvtRoundF64ToI32Hi, vec_op_cvt_round_f64_to_i32_hi<behavior>>(ctx, Variation{0});
+ }
+ }
+ }
+
+ INFO(" Testing bit shift");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVI; v++) {
+/*
+ for (uint32_t i = 1; i < 8; i++) {
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSllU8 , vec_op_slli<uint8_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSrlU8 , vec_op_srli<uint8_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSraI8 , vec_op_srai<int8_t>>(ctx, i, Variation{v});
+ }
+*/
+ for (uint32_t i = 1; i < 16; i++) {
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSllU16, vec_op_slli<uint16_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSrlU16, vec_op_srli<uint16_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSraI16, vec_op_srai<int16_t>>(ctx, i, Variation{v});
+ }
+
+ for (uint32_t i = 1; i < 32; i++) {
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSllU32, vec_op_slli<uint32_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSrlU32, vec_op_srli<uint32_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSraI32, vec_op_srai<int32_t>>(ctx, i, Variation{v});
+ }
+
+ for (uint32_t i = 1; i < 64; i++) {
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSllU64, vec_op_slli<uint64_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSrlU64, vec_op_srli<uint64_t>>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSraI64, vec_op_srai<int64_t>>(ctx, i, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing sllb_u128 & srlb_u128");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVI; v++) {
+ for (uint32_t i = 1; i < 16; i++) {
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSllbU128, vec_op_sllb_u128>(ctx, i, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSrlbU128, vec_op_srlb_u128>(ctx, i, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing swizzle_[lo|hi]_u16x4");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVI; v++) {
+ for (uint32_t i = 0; i < 256; i++) {
+ uint32_t imm = swizzle((i >> 6) & 3, (i >> 4) & 3, (i >> 2) & 3, i & 3).value;
+
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleLoU16x4, vec_op_swizzle_lo_u16x4>(ctx, imm, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleHiU16x4, vec_op_swizzle_hi_u16x4>(ctx, imm, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleU16x4, vec_op_swizzle_u16>(ctx, imm, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing swizzle_u32x4");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVI; v++) {
+ for (uint32_t i = 0; i < 256; i++) {
+ uint32_t imm = swizzle((i >> 6) & 3, (i >> 4) & 3, (i >> 2) & 3, i & 3).value;
+
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleU32x4, vec_op_swizzle_u32x4>(ctx, imm, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleF32x4, vec_op_swizzle_u32x4>(ctx, imm, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing swizzle_u64x2");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVI; v++) {
+ for (uint32_t i = 0; i < 4; i++) {
+ uint32_t imm = swizzle((i >> 1) & 1, i & 1).value;
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleU64x2, vec_op_swizzle_u64x2>(ctx, imm, Variation{v});
+ test_vecop_vvi<kVecWidth, UniOpVVI::kSwizzleF64x2, vec_op_swizzle_u64x2>(ctx, imm, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing logical (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndU32, vec_op_and<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndU64, vec_op_and<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kOrU32, vec_op_or<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kOrU64, vec_op_or<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kXorU32, vec_op_xor<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kXorU64, vec_op_xor<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndnU32, vec_op_andn<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndnU64, vec_op_andn<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kBicU32, vec_op_bic<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kBicU64, vec_op_bic<uint64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing add / adds (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddU8, vec_op_add<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddU16, vec_op_add<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddU32, vec_op_add<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddU64, vec_op_add<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddsI8, vec_op_adds<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddsI16, vec_op_adds<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddsU8, vec_op_adds<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddsU16, vec_op_adds<uint16_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing sub / subs (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubU8, vec_op_sub<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubU16, vec_op_sub<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubU32, vec_op_sub<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubU64, vec_op_sub<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubsI8, vec_op_subs<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubsI16, vec_op_subs<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubsU8, vec_op_subs<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubsU16, vec_op_subs<uint16_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing mul (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulU16, vec_op_mul<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulU32, vec_op_mul<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulU64, vec_op_mul<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulhI16, vec_op_mulhi<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulhU16, vec_op_mulhu<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulU64_LoU32, vec_op_mul_u64_lo_u32>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing mhadd (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMHAddI16_I32, vec_op_mhadd_i16_i32>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing madd (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVVV; v++) {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddU16, vec_op_madd<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddU32, vec_op_madd<uint32_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing min / max (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinI8, vec_op_min<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinI16, vec_op_min<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinI32, vec_op_min<int32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinI64, vec_op_min<int64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinU8, vec_op_min<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinU16, vec_op_min<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinU32, vec_op_min<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinU64, vec_op_min<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxI8, vec_op_max<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxI16, vec_op_max<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxI32, vec_op_max<int32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxI64, vec_op_max<int64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxU8, vec_op_max<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxU16, vec_op_max<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxU32, vec_op_max<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxU64, vec_op_max<uint64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing cmp (int)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpEqU8, vec_op_cmp_eq<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpEqU16, vec_op_cmp_eq<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpEqU32, vec_op_cmp_eq<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpEqU64, vec_op_cmp_eq<uint64_t>>(ctx, Variation{v});
+/*
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpNeU8, vec_op_cmp_ne<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpNeU16, vec_op_cmp_ne<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpNeU32, vec_op_cmp_ne<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpNeU64, vec_op_cmp_ne<uint64_t>>(ctx, Variation{v});
+*/
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtI8, vec_op_cmp_gt<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtI16, vec_op_cmp_gt<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtI32, vec_op_cmp_gt<int32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtI64, vec_op_cmp_gt<int64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtU8, vec_op_cmp_gt<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtU16, vec_op_cmp_gt<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtU32, vec_op_cmp_gt<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtU64, vec_op_cmp_gt<uint64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeI8, vec_op_cmp_ge<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeI16, vec_op_cmp_ge<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeI32, vec_op_cmp_ge<int32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeI64, vec_op_cmp_ge<int64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeU8, vec_op_cmp_ge<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeU16, vec_op_cmp_ge<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeU32, vec_op_cmp_ge<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeU64, vec_op_cmp_ge<uint64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtI8, vec_op_cmp_lt<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtI16, vec_op_cmp_lt<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtI32, vec_op_cmp_lt<int32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtI64, vec_op_cmp_lt<int64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtU8, vec_op_cmp_lt<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtU16, vec_op_cmp_lt<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtU32, vec_op_cmp_lt<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtU64, vec_op_cmp_lt<uint64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeI8, vec_op_cmp_le<int8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeI16, vec_op_cmp_le<int16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeI32, vec_op_cmp_le<int32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeI64, vec_op_cmp_le<int64_t>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeU8, vec_op_cmp_le<uint8_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeU16, vec_op_cmp_le<uint16_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeU32, vec_op_cmp_le<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeU64, vec_op_cmp_le<uint64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing logical (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndF32, vec_op_and<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndF64, vec_op_and<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kOrF32, vec_op_or<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kOrF64, vec_op_or<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kXorF32, vec_op_xor<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kXorF64, vec_op_xor<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndnF32, vec_op_andn<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAndnF64, vec_op_andn<uint64_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kBicF32, vec_op_bic<uint32_t>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kBicF64, vec_op_bic<uint64_t>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing arithmetic (float)");
+ {
+ if (scalar_op_behavior == ScalarOpBehavior::kZeroing) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddF32S, scalar_op_fadd<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddF64S, scalar_op_fadd<ScalarOpBehavior::kZeroing, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubF32S, scalar_op_fsub<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubF64S, scalar_op_fsub<ScalarOpBehavior::kZeroing, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulF32S, scalar_op_fmul<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulF64S, scalar_op_fmul<ScalarOpBehavior::kZeroing, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kDivF32S, scalar_op_fdiv<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kDivF64S, scalar_op_fdiv<ScalarOpBehavior::kZeroing, double>>(ctx);
+ }
+ else {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddF32S, scalar_op_fadd<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddF64S, scalar_op_fadd<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubF32S, scalar_op_fsub<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubF64S, scalar_op_fsub<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulF32S, scalar_op_fmul<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulF64S, scalar_op_fmul<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kDivF32S, scalar_op_fdiv<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kDivF64S, scalar_op_fdiv<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+ }
+
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddF32, vec_op_fadd<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kAddF64, vec_op_fadd<double>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubF32, vec_op_fsub<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kSubF64, vec_op_fsub<double>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulF32, vec_op_fmul<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMulF64, vec_op_fmul<double>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kDivF32, vec_op_fdiv<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kDivF64, vec_op_fdiv<double>>(ctx, Variation{v});
+ }
+ }
+
+ if (fmadd_op_behavior == FMAddOpBehavior::kNoFMA) {
+ INFO(" Testing madd (no-fma) (float)");
+ {
+ if (scalar_op_behavior == ScalarOpBehavior::kZeroing) {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF32S, scalar_op_fmadd_nofma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF64S, scalar_op_fmadd_nofma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF32S, scalar_op_fmsub_nofma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF64S, scalar_op_fmsub_nofma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF32S, scalar_op_fnmadd_nofma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF64S, scalar_op_fnmadd_nofma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF32S, scalar_op_fnmsub_nofma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF64S, scalar_op_fnmsub_nofma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ }
+ else {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF32S, scalar_op_fmadd_nofma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF64S, scalar_op_fmadd_nofma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF32S, scalar_op_fmsub_nofma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF64S, scalar_op_fmsub_nofma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF32S, scalar_op_fnmadd_nofma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF64S, scalar_op_fnmadd_nofma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF32S, scalar_op_fnmsub_nofma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF64S, scalar_op_fnmsub_nofma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ }
+
+ for (uint32_t v = 0; v < kNumVariationsVVVV; v++) {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF32, vec_op_fmadd_nofma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF64, vec_op_fmadd_nofma<double>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF32, vec_op_fmsub_nofma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF64, vec_op_fmsub_nofma<double>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF32, vec_op_fnmadd_nofma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF64, vec_op_fnmadd_nofma<double>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF32, vec_op_fnmsub_nofma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF64, vec_op_fnmsub_nofma<double>>(ctx, Variation{v});
+ }
+ }
+ }
+ else {
+ INFO(" Testing madd (fma) (float)");
+ {
+ if (valgrind_fma_bug) {
+ INFO(" (scalar FMA tests ignored due to a Valgrind bug!)");
+ }
+ else {
+ if (scalar_op_behavior == ScalarOpBehavior::kZeroing) {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF32S, scalar_op_fmadd_fma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF64S, scalar_op_fmadd_fma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF32S, scalar_op_fmsub_fma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF64S, scalar_op_fmsub_fma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF32S, scalar_op_fnmadd_fma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF64S, scalar_op_fnmadd_fma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF32S, scalar_op_fnmsub_fma<ScalarOpBehavior::kZeroing, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF64S, scalar_op_fnmsub_fma<ScalarOpBehavior::kZeroing, double>>(ctx, Variation{0});
+ }
+ else {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF32S, scalar_op_fmadd_fma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF64S, scalar_op_fmadd_fma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF32S, scalar_op_fmsub_fma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF64S, scalar_op_fmsub_fma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF32S, scalar_op_fnmadd_fma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF64S, scalar_op_fnmadd_fma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF32S, scalar_op_fnmsub_fma<ScalarOpBehavior::kPreservingVec128, float>>(ctx, Variation{0});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF64S, scalar_op_fnmsub_fma<ScalarOpBehavior::kPreservingVec128, double>>(ctx, Variation{0});
+ }
+ }
+
+ for (uint32_t v = 0; v < kNumVariationsVVVV; v++) {
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF32, vec_op_fmadd_fma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMAddF64, vec_op_fmadd_fma<double>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF32, vec_op_fmsub_fma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kMSubF64, vec_op_fmsub_fma<double>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF32, vec_op_fnmadd_fma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMAddF64, vec_op_fnmadd_fma<double>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF32, vec_op_fnmsub_fma<float>>(ctx, Variation{v});
+ test_vecop_vvvv<kVecWidth, UniOpVVVV::kNMSubF64, vec_op_fnmsub_fma<double>>(ctx, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing min / max (float)");
+ {
+#if defined(ASMJIT_UJIT_X86)
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF32S, scalar_op_fmin_ternary<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF64S, scalar_op_fmin_ternary<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF32S, scalar_op_fmax_ternary<ScalarOpBehavior::kPreservingVec128, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF64S, scalar_op_fmax_ternary<ScalarOpBehavior::kPreservingVec128, double>>(ctx);
+
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF32, vec_op_fmin_ternary<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF64, vec_op_fmin_ternary<double>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF32, vec_op_fmax_ternary<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF64, vec_op_fmax_ternary<double>>(ctx, Variation{v});
+ }
+#endif
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF32S, scalar_op_fmin_finite<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF64S, scalar_op_fmin_finite<ScalarOpBehavior::kZeroing, double>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF32S, scalar_op_fmax_finite<ScalarOpBehavior::kZeroing, float>>(ctx);
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF64S, scalar_op_fmax_finite<ScalarOpBehavior::kZeroing, double>>(ctx);
+
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF32, vec_op_fmin_finite<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMinF64, vec_op_fmin_finite<double>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF32, vec_op_fmax_finite<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kMaxF64, vec_op_fmax_finite<double>>(ctx, Variation{v});
+ }
+#endif
+ }
+
+ INFO(" Testing cmp (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpEqF32, vec_op_fcmpo_eq<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpEqF64, vec_op_fcmpo_eq<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpNeF32, vec_op_fcmpu_ne<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpNeF64, vec_op_fcmpu_ne<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtF32, vec_op_fcmpo_gt<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGtF64, vec_op_fcmpo_gt<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeF32, vec_op_fcmpo_ge<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpGeF64, vec_op_fcmpo_ge<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtF32, vec_op_fcmpo_lt<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLtF64, vec_op_fcmpo_lt<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeF32, vec_op_fcmpo_le<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpLeF64, vec_op_fcmpo_le<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpOrdF32, vec_op_fcmp_ord<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpOrdF64, vec_op_fcmp_ord<double>>(ctx, Variation{v});
+
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpUnordF32, vec_op_fcmp_unord<float>>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCmpUnordF64, vec_op_fcmp_unord<double>>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing hadd (float)");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kHAddF64, vec_op_hadd_f64>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing combine");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCombineLoHiU64, vec_op_combine_lo_hi_u64>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCombineLoHiF64, vec_op_combine_lo_hi_u64>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCombineHiLoU64, vec_op_combine_hi_lo_u64>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kCombineHiLoF64, vec_op_combine_hi_lo_u64>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing interleave");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveLoU8, vec_op_interleave_lo_u8>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveHiU8, vec_op_interleave_hi_u8>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveLoU16, vec_op_interleave_lo_u16>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveHiU16, vec_op_interleave_hi_u16>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveLoU32, vec_op_interleave_lo_u32>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveHiU32, vec_op_interleave_hi_u32>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveLoU64, vec_op_interleave_lo_u64>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kInterleaveHiU64, vec_op_interleave_hi_u64>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing packs");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVV; v++) {
+ test_vecop_vvv<kVecWidth, UniOpVVV::kPacksI16_I8, vec_op_packs_i16_i8>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kPacksI16_U8, vec_op_packs_i16_u8>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kPacksI32_I16, vec_op_packs_i32_i16>(ctx, Variation{v});
+ test_vecop_vvv<kVecWidth, UniOpVVV::kPacksI32_U16, vec_op_packs_i32_u16>(ctx, Variation{v});
+ }
+ }
+
+ INFO(" Testing alignr_u128");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVVI; v++) {
+ for (uint32_t i = 1; i < 16; i++) {
+ test_vecop_vvvi<kVecWidth, UniOpVVVI::kAlignr_U128, vec_op_alignr_u128>(ctx, i, Variation{v});
+ }
+ }
+ }
+
+ INFO(" Testing interleave_shuffle");
+ {
+ for (uint32_t v = 0; v < kNumVariationsVVVI; v++) {
+ for (uint32_t i = 0; i < 256; i++) {
+ uint32_t imm = swizzle((i >> 6) & 3, (i >> 4) & 3, (i >> 2) & 3, i & 3).value;
+
+ test_vecop_vvvi<kVecWidth, UniOpVVVI::kInterleaveShuffleU32x4, vec_op_interleave_shuffle_u32x4>(ctx, imm, Variation{v});
+ test_vecop_vvvi<kVecWidth, UniOpVVVI::kInterleaveShuffleF32x4, vec_op_interleave_shuffle_u32x4>(ctx, imm, Variation{v});
+ }
+
+ for (uint32_t i = 0; i < 4; i++) {
+ uint32_t imm = swizzle((i >> 1) & 1, i & 1).value;
+
+ test_vecop_vvvi<kVecWidth, UniOpVVVI::kInterleaveShuffleU64x2, vec_op_interleave_shuffle_u64x2>(ctx, imm, Variation{v});
+ test_vecop_vvvi<kVecWidth, UniOpVVVI::kInterleaveShuffleF64x2, vec_op_interleave_shuffle_u64x2>(ctx, imm, Variation{v});
+ }
+ }
+ }
+}
+
+static void test_gp_ops(JitContext& ctx) {
+ test_cond_ops(ctx);
+ test_m_ops(ctx);
+ test_rm_ops(ctx);
+ test_mr_ops(ctx);
+ test_rr_ops(ctx);
+ test_rrr_ops(ctx);
+}
+
+#if defined(ASMJIT_UJIT_X86)
+static void dump_feature_list(String& out, const CpuFeatures& features) {
+#if !defined(ASMJIT_NO_LOGGING)
+ CpuFeatures::Iterator it = features.iterator();
+ bool first = true;
+ while (it.has_next()) {
+ size_t feature_id = it.next();
+ if (!first) {
+ out.append(' ');
+ }
+ Formatter::format_feature(out, Arch::kHost, uint32_t(feature_id));
+ first = false;
+ }
+#else
+ Support::maybe_unused(features);
+ out.append("<ASMJIT_NO_LOGGING>");
+#endif
+}
+
+static void test_x86_ops(JitContext& ctx, const CpuFeatures& host_features) {
+ using Ext = CpuFeatures::X86;
+
+ {
+ String s;
+ dump_feature_list(s, host_features);
+ INFO("Available CPU features: %s", s.data());
+ }
+
+ // Features that must always be available;
+ CpuFeatures base;
+ base.add(Ext::kI486, Ext::kCMOV, Ext::kCMPXCHG8B, Ext::kFPU, Ext::kSSE, Ext::kSSE2);
+
+ // To verify that JIT implements ALL features with ALL possible CPU flags, we use profiles to select features
+ // that the JIT compiler will be allowed to use. The features are gradually increased similarly to how new CPU
+ // generations introduced them. We cannot cover ALL possible CPUs, but that's not even necessary as we test
+ // individual operations where instructions can be selected on the features available.
+
+ // GP variations.
+ {
+ CpuFeatures profiles[4] {};
+ profiles[0] = base;
+
+ profiles[1] = profiles[0];
+ profiles[1].add(Ext::kADX, Ext::kBMI);
+
+ profiles[2] = profiles[1];
+ profiles[2].add(Ext::kBMI2, Ext::kLZCNT, Ext::kMOVBE, Ext::kPOPCNT);
+
+ profiles[3] = host_features;
+
+ bool first = true;
+ CpuFeatures last_filtered;
+
+ for (const CpuFeatures& profile : profiles) {
+ CpuFeatures filtered = profile;
+
+ for (uint32_t i = 0; i < CpuFeatures::kNumBitWords; i++) {
+ filtered.data()._bits[i] &= host_features.data()._bits[i];
+ }
+
+ if (!first && filtered == last_filtered) {
+ continue;
+ }
+
+ String s;
+ if (filtered == host_features) {
+ s.assign("[ALL]");
+ }
+ else {
+ dump_feature_list(s, filtered);
+ }
+
+ ctx.features = filtered;
+
+ INFO("Testing JIT compiler GP ops with [%s]", s.data());
+ test_gp_ops(ctx);
+
+ first = false;
+ last_filtered = filtered;
+ }
+ }
+
+ // SIMD variations covering SSE2+, AVX+, and AVX512+ cases.
+ {
+ CpuFeatures profiles[15] {};
+ profiles[0] = base;
+
+ profiles[1] = profiles[0];
+ profiles[1].add(Ext::kSSE3);
+
+ profiles[2] = profiles[1];
+ profiles[2].add(Ext::kSSSE3);
+
+ profiles[3] = profiles[2];
+ profiles[3].add(Ext::kSSE4_1);
+
+ profiles[4] = profiles[3];
+ profiles[4].add(Ext::kSSE4_2, Ext::kADX, Ext::kBMI, Ext::kBMI2, Ext::kLZCNT, Ext::kMOVBE, Ext::kPOPCNT);
+
+ profiles[5] = profiles[4];
+ profiles[5].add(Ext::kPCLMULQDQ);
+
+ profiles[6] = profiles[5];
+ profiles[6].add(Ext::kAVX);
+
+ profiles[7] = profiles[6];
+ profiles[7].add(Ext::kAVX2);
+
+ profiles[8] = profiles[7];
+ profiles[8].add(Ext::kF16C, Ext::kFMA, Ext::kVAES, Ext::kVPCLMULQDQ);
+
+ profiles[9] = profiles[8];
+ profiles[9].add(Ext::kAVX_IFMA, Ext::kAVX_NE_CONVERT, Ext::kAVX_VNNI, Ext::kAVX_VNNI_INT8, Ext::kAVX_VNNI_INT16);
+
+ // We start deliberately from a profile that doesn't contains AVX_xxx
+ // extensions as these didn't exist when the first AVX512 CPUs were shipped.
+ profiles[10] = profiles[8];
+ profiles[10].add(Ext::kAVX512_F, Ext::kAVX512_BW, Ext::kAVX512_DQ, Ext::kAVX512_CD, Ext::kAVX512_VL);
+
+ profiles[11] = profiles[10];
+ profiles[11].add(Ext::kAVX512_IFMA, Ext::kAVX512_VBMI);
+
+ profiles[12] = profiles[11];
+ profiles[12].add(Ext::kAVX512_BITALG, Ext::kAVX512_VBMI2, Ext::kAVX512_VNNI, Ext::kAVX512_VPOPCNTDQ);
+
+ profiles[13] = profiles[12];
+ profiles[13].add(Ext::kAVX512_BF16, Ext::kAVX512_FP16);
+
+ profiles[14] = host_features;
+
+ bool first = true;
+ CpuFeatures last_filtered;
+
+ for (const CpuFeatures& profile : profiles) {
+ CpuFeatures filtered = profile;
+
+ for (uint32_t i = 0; i < CpuFeatures::kNumBitWords; i++) {
+ filtered.data()._bits[i] &= host_features.data()._bits[i];
+ }
+
+ if (!first && filtered == last_filtered) {
+ continue;
+ }
+
+ String s;
+ if (filtered == host_features) {
+ s.assign("[ALL]");
+ }
+ else {
+ dump_feature_list(s, filtered);
+ }
+
+ ctx.features = filtered;
+
+ INFO("Testing JIT compiler 128-bit SIMD ops with [%s]", s.data());
+ test_simd_ops<VecWidth::k128>(ctx);
+
+ if (filtered.x86().has_avx2()) {
+ INFO("Testing JIT compiler 256-bit SIMD ops with [%s]", s.data());
+ test_simd_ops<VecWidth::k256>(ctx);
+ }
+
+ if (filtered.x86().has_avx512_f()) {
+ INFO("Testing JIT compiler 512-bit SIMD ops with [%s]", s.data());
+ test_simd_ops<VecWidth::k512>(ctx);
+ }
+
+ first = false;
+ last_filtered = filtered;
+ }
+ }
+}
+#endif // ASMJIT_UJIT_X86
+
+#if defined(ASMJIT_UJIT_AARCH64)
+static void test_a64_ops(JitContext& ctx, const CpuFeatures& host_features) {
+ ctx.features = host_features;
+
+ test_gp_ops(ctx);
+ test_simd_ops<VecWidth::k128>(ctx);
+}
+#endif // ASMJIT_UJIT_AARCH64
+
+} // {UniCompilerTests}
+
+UNIT(unicompiler) {
+ UniCompilerTests::JitContext ctx;
+ asmjit::CpuFeatures host_features = asmjit::CpuInfo::host().features();
+
+#if defined(ASMJIT_UJIT_X86)
+ UniCompilerTests::test_x86_ops(ctx, host_features);
+#elif defined(ASMJIT_UJIT_AARCH64)
+ UniCompilerTests::test_a64_ops(ctx, host_features);
+#endif
+}
+
+int main(int argc, const char* argv[]) {
+ print_app_info();
+ return BrokenAPI::run(argc, argv);
+}
+
+#else
+
+int main() {
+ print_app_info();
+ printf("!! This test is disabled: <ASMJIT_NO_[U]JIT> or unsuitable arvhitecture !!\n");
+ return 0;
+}
+
+#endif // !ASMJIT_NO_UJIT && !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp
new file mode 100644
index 00000000000..ed980394eab
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp
@@ -0,0 +1,49 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/ujit.h>
+
+#if defined(ASMJIT_UJIT_X86)
+
+#if defined(_MSC_VER)
+ #include <intrin.h>
+#else
+ #include <immintrin.h>
+#endif
+
+namespace UniCompilerTests {
+
+// A reference implementation of MUL+ADD with the use of FMA. This has to be provided otherwise the
+// compiler may use FPU registers in 32-bit x86 case, which would make the result different than when
+// compiled by JIT compiler that would use XMM registers (32/64-bit SSE/AVX operations).
+
+float fmadd_fma_ref(float a, float b, float c) noexcept {
+ __m128 av = _mm_set1_ps(a);
+ __m128 bv = _mm_set1_ps(b);
+ __m128 cv = _mm_set1_ps(c);
+
+ return _mm_cvtss_f32(_mm_fmadd_ss(av, bv, cv));
+}
+
+double fmadd_fma_ref(double a, double b, double c) noexcept {
+ __m128d av = _mm_set1_pd(a);
+ __m128d bv = _mm_set1_pd(b);
+ __m128d cv = _mm_set1_pd(c);
+
+ return _mm_cvtsd_f64(_mm_fmadd_sd(av, bv, cv));
+}
+
+void madd_fma_check_valgrind_bug(const float a[4], const float b[4], const float c[4], float dst[4]) noexcept {
+ __m128 av = _mm_loadu_ps(a);
+ __m128 bv = _mm_loadu_ps(b);
+ __m128 cv = _mm_loadu_ps(c);
+
+ __m128 dv = _mm_fmadd_ss(av, bv, cv);
+ _mm_storeu_ps(dst, dv);
+}
+
+} // {UniCompilerTests}
+
+#endif // ASMJIT_UJIT_X86
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_sse2.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_sse2.cpp
new file mode 100644
index 00000000000..fa49e6027df
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_sse2.cpp
@@ -0,0 +1,72 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/ujit.h>
+
+#if defined(ASMJIT_UJIT_X86)
+
+#if defined(_MSC_VER)
+ #include <intrin.h>
+#else
+ #include <emmintrin.h>
+#endif
+
+namespace UniCompilerTests {
+
+// A reference implementation of MUL+ADD without the use of FMA. This has to be provided otherwise the
+// compiler may use FPU registers in 32-bit x86 case, which would make the result different than when
+// compiled by JIT compiler that would use XMM registers (32/64-bit SSE/AVX operations).
+
+float fadd(float a, float b) noexcept {
+ return _mm_cvtss_f32(_mm_add_ss(_mm_set1_ps(a), _mm_set1_ps(b)));
+}
+
+float fsub(float a, float b) noexcept {
+ return _mm_cvtss_f32(_mm_sub_ss(_mm_set1_ps(a), _mm_set1_ps(b)));
+}
+
+float fmul(float a, float b) noexcept {
+ return _mm_cvtss_f32(_mm_mul_ss(_mm_set1_ps(a), _mm_set1_ps(b)));
+}
+
+float fdiv(float a, float b) noexcept {
+ return _mm_cvtss_f32(_mm_div_ss(_mm_set1_ps(a), _mm_set1_ps(b)));
+}
+
+float fsqrt(float a) noexcept {
+ return _mm_cvtss_f32(_mm_sqrt_ss(_mm_set1_ps(a)));
+}
+
+float fmadd_nofma_ref(float a, float b, float c) noexcept {
+ return _mm_cvtss_f32(_mm_add_ss(_mm_mul_ss(_mm_set1_ps(a), _mm_set1_ps(b)), _mm_set1_ps(c)));
+}
+
+double fadd(double a, double b) noexcept {
+ return _mm_cvtsd_f64(_mm_add_sd(_mm_set1_pd(a), _mm_set1_pd(b)));
+}
+
+double fsub(double a, double b) noexcept {
+ return _mm_cvtsd_f64(_mm_sub_sd(_mm_set1_pd(a), _mm_set1_pd(b)));
+}
+
+double fmul(double a, double b) noexcept {
+ return _mm_cvtsd_f64(_mm_mul_sd(_mm_set1_pd(a), _mm_set1_pd(b)));
+}
+
+double fdiv(double a, double b) noexcept {
+ return _mm_cvtsd_f64(_mm_div_sd(_mm_set1_pd(a), _mm_set1_pd(b)));
+}
+
+double fsqrt(double a) noexcept {
+ return _mm_cvtsd_f64(_mm_sqrt_sd(_mm_setzero_pd(), _mm_set1_pd(a)));
+}
+
+double fmadd_nofma_ref(double a, double b, double c) noexcept {
+ return _mm_cvtsd_f64(_mm_add_sd(_mm_mul_sd(_mm_set1_pd(a), _mm_set1_pd(b)), _mm_set1_pd(c)));
+}
+
+} // {UniCompilerTests}
+
+#endif // ASMJIT_UJIT_X86
diff --git a/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_x86_sections.cpp b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_x86_sections.cpp
new file mode 100644
index 00000000000..2084ddb637a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit-testing/tests/asmjit_test_x86_sections.cpp
@@ -0,0 +1,169 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+// ----------------------------------------------------------------------------
+// This is a working example that demonstrates how multiple sections can be
+// used in a JIT-based code generator. It shows also the necessary tooling
+// that is expected to be done by the user when the feature is used. It's
+// important to handle the following cases:
+//
+// - Assign offsets to sections when the code generation is finished.
+// - Tell the CodeHolder to resolve unresolved fixups and check whether
+// all fixups were resolved.
+// - Relocate the code
+// - Copy the code to the destination address.
+// ----------------------------------------------------------------------------
+
+#include <asmjit/core.h>
+#if ASMJIT_ARCH_X86 && !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_JIT)
+
+#include <asmjit/x86.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+using namespace asmjit;
+
+// The generated function is very simple, it only accesses the built-in data
+// (from .data section) at the index as provided by its first argument. This
+// data is inlined into the resulting function so we can use it this array
+// for verification that the function returns correct values.
+static const uint8_t data_array[] = { 2, 9, 4, 7, 1, 3, 8, 5, 6, 0 };
+
+static void fail(const char* message, Error err) {
+ printf("** FAILURE: %s (%s) **\n", message, DebugUtils::error_as_string(err));
+ exit(1);
+}
+
+int main() {
+ printf("AsmJit X86 Sections Test\n\n");
+
+ Environment env = Environment::host();
+ JitAllocator allocator;
+
+#ifndef ASMJIT_NO_LOGGING
+ FileLogger logger(stdout);
+ logger.set_indentation(FormatIndentationGroup::kCode, 2);
+#endif
+
+ CodeHolder code;
+ code.init(env);
+
+#ifndef ASMJIT_NO_LOGGING
+ code.set_logger(&logger);
+#endif
+
+ Section* data_section;
+ Error err = code.new_section(Out(data_section), ".data", SIZE_MAX, SectionFlags::kNone, 8);
+
+ if (err != Error::kOk) {
+ fail("Failed to create a .data section", err);
+ }
+ else {
+ printf("Generating code:\n");
+ x86::Assembler a(&code);
+ x86::Gp idx = a.zax();
+ x86::Gp addr = a.zcx();
+
+ Label data = a.new_label();
+
+ FuncDetail func;
+ func.init(FuncSignature::build<size_t, size_t>(), code.environment());
+
+ FuncFrame frame;
+ frame.init(func);
+ frame.add_dirty_regs(idx, addr);
+
+ FuncArgsAssignment args(&func);
+ args.assign_all(idx);
+ args.update_func_frame(frame);
+ frame.finalize();
+
+ a.emit_prolog(frame);
+ a.emit_args_assignment(frame, args);
+
+ a.lea(addr, x86::ptr(data));
+ a.movzx(idx, x86::byte_ptr(addr, idx));
+
+ a.emit_epilog(frame);
+
+ a.section(data_section);
+ a.bind(data);
+
+ a.embed(data_array, sizeof(data_array));
+ }
+
+ // Manually change he offsets of each section, start at 0. This code is very similar to
+ // what `CodeHolder::flatten()` does, however, it's shown here how to do it explicitly.
+ printf("\nCalculating section offsets:\n");
+ uint64_t offset = 0;
+ for (Section* section : code.sections_by_order()) {
+ offset = Support::align_up(offset, section->alignment());
+ section->set_offset(offset);
+ offset += section->real_size();
+
+ printf(" [0x%08X %s] {Id=%u Size=%u}\n",
+ uint32_t(section->offset()),
+ section->name(),
+ section->section_id(),
+ uint32_t(section->real_size()));
+ }
+ size_t code_size = size_t(offset);
+ printf(" Final code size: %zu\n", code_size);
+
+ // Resolve cross-section fixups (if any). On 32-bit X86 this is not necessary
+ // as this is handled through relocations as the addressing is different.
+ if (code.has_unresolved_fixups()) {
+ printf("\nResolving cross-section fixups:\n");
+ printf(" Before 'resolve_cross_section_fixups()': %zu\n", code.unresolved_fixup_count());
+
+ err = code.resolve_cross_section_fixups();
+ if (err != Error::kOk) {
+ fail("Failed to resolve cross-section fixups", err);
+ }
+ printf(" After 'resolve_cross_section_fixups()': %zu\n", code.unresolved_fixup_count());
+ }
+
+ // Allocate memory for the function and relocate it there.
+ JitAllocator::Span span;
+ err = allocator.alloc(Out(span), code_size);
+ if (err != Error::kOk)
+ fail("Failed to allocate executable memory", err);
+
+ // Relocate to the base-address of the allocated memory.
+ code.relocate_to_base(uint64_t(uintptr_t(span.rx())));
+
+ allocator.write(span, [&](JitAllocator::Span& span) noexcept -> Error {
+ // Copy the flattened code into `mem.rw`. There are two ways. You can either copy
+ // everything manually by iterating over all sections or use `copy_flattened_data`.
+ // This code is similar to what `copy_flattened_data(p, code_size, 0)` would do:
+ for (Section* section : code.sections_by_order())
+ memcpy(static_cast<uint8_t*>(span.rw()) + size_t(section->offset()), section->data(), section->buffer_size());
+ return Error::kOk;
+ });
+
+ // Execute the function and test whether it works.
+ using Func = size_t (*)(size_t idx);
+ Func fn = (Func)span.rx();
+
+ printf("\n");
+ if (fn(0) != data_array[0] ||
+ fn(3) != data_array[3] ||
+ fn(6) != data_array[6] ||
+ fn(9) != data_array[9] ) {
+ printf("** FAILURE: The generated function returned incorrect result(s) **\n");
+ return 1;
+ }
+
+ printf("** SUCCESS **\n");
+ return 0;
+}
+
+#else
+int main() {
+ printf("!! This test is disabled: ASMJIT_NO_JIT or unsuitable target architecture !!\n\n");
+ return 0;
+}
+#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/test/broken.cpp b/3rdparty/asmjit/asmjit-testing/tests/broken.cpp
index c28ffa7288e..34d4db6804b 100644
--- a/3rdparty/asmjit/test/broken.cpp
+++ b/3rdparty/asmjit/asmjit-testing/tests/broken.cpp
@@ -44,7 +44,7 @@ struct BrokenGlobal {
BrokenAPI::Unit* _unitList;
BrokenAPI::Unit* _unitRunning;
- bool hasArg(const char* a) const noexcept {
+ bool has_arg(const char* a) const noexcept {
for (int i = 1; i < _argc; i++)
if (strcmp(_argv[i], a) == 0)
return true;
@@ -106,13 +106,13 @@ static bool BrokenAPI_canRun(BrokenAPI::Unit* unit) noexcept {
const char** argv = global._argv;
const char* unitName = unit->name;
- bool hasFilter = false;
+ bool has_filter = false;
for (i = 1; i < argc; i++) {
const char* arg = argv[i];
if (BrokenAPI_startsWith(arg, "--run-") && strcmp(arg, "--run-all") != 0) {
- hasFilter = true;
+ has_filter = true;
if (BrokenAPI_matchesFilter(unitName, arg + 6))
return true;
@@ -120,7 +120,7 @@ static bool BrokenAPI_canRun(BrokenAPI::Unit* unit) noexcept {
}
// If no filter has been specified the default is to run.
- return !hasFilter;
+ return !has_filter;
}
static void BrokenAPI_runUnit(BrokenAPI::Unit* unit) noexcept {
@@ -134,7 +134,7 @@ static void BrokenAPI_runUnit(BrokenAPI::Unit* unit) noexcept {
static void BrokenAPI_runAll() noexcept {
BrokenAPI::Unit* unit = _brokenGlobal._unitList;
- bool hasUnits = unit != NULL;
+ bool has_units = unit != NULL;
size_t count = 0;
int currentPriority = 0;
@@ -159,7 +159,7 @@ static void BrokenAPI_runAll() noexcept {
}
else {
INFO("\nWarning:");
- INFO(" No units %s!", hasUnits ? "matched the filter" : "defined");
+ INFO(" No units %s!", has_units ? "matched the filter" : "defined");
}
}
@@ -179,8 +179,8 @@ static void BrokenAPI_listAll() noexcept {
}
}
-bool BrokenAPI::hasArg(const char* name) noexcept {
- return _brokenGlobal.hasArg(name);
+bool BrokenAPI::has_arg(const char* name) noexcept {
+ return _brokenGlobal.has_arg(name);
}
void BrokenAPI::addUnit(Unit* unit) noexcept {
@@ -207,13 +207,13 @@ void BrokenAPI::setOutputFile(FILE* file) noexcept {
global._file = file;
}
-int BrokenAPI::run(int argc, const char* argv[], Entry onBeforeRun, Entry onAfterRun) {
+int BrokenAPI::run(int argc, const char* argv[], Entry on_before_run, Entry onAfterRun) {
BrokenGlobal& global = _brokenGlobal;
global._argc = argc;
global._argv = argv;
- if (global.hasArg("--help")) {
+ if (global.has_arg("--help")) {
INFO("Options:");
INFO(" --help - print this usage");
INFO(" --list - list all tests");
@@ -222,13 +222,13 @@ int BrokenAPI::run(int argc, const char* argv[], Entry onBeforeRun, Entry onAfte
return 0;
}
- if (global.hasArg("--list")) {
+ if (global.has_arg("--list")) {
BrokenAPI_listAll();
return 0;
}
- if (onBeforeRun)
- onBeforeRun();
+ if (on_before_run)
+ on_before_run();
// We don't care about filters here, it's implemented by `runAll`.
BrokenAPI_runAll();
@@ -253,20 +253,20 @@ static void BrokenAPI_printMessage(const char* prefix, const char* fmt, va_list
char staticBuffer[512];
size_t fmtSize = strlen(fmt);
- size_t prefixSize = strlen(prefix);
+ size_t prefix_size = strlen(prefix);
char* fmtBuf = staticBuffer;
- if (fmtSize > kBufferSize - 2 - prefixSize)
- fmtBuf = static_cast<char*>(malloc(fmtSize + prefixSize + 2));
+ if (fmtSize > kBufferSize - 2 - prefix_size)
+ fmtBuf = static_cast<char*>(malloc(fmtSize + prefix_size + 2));
if (!fmtBuf) {
fprintf(dst, "%sCannot allocate buffer for vfprintf()\n", prefix);
}
else {
- memcpy(fmtBuf, prefix, prefixSize);
- memcpy(fmtBuf + prefixSize, fmt, fmtSize);
+ memcpy(fmtBuf, prefix, prefix_size);
+ memcpy(fmtBuf + prefix_size, fmt, fmtSize);
- fmtSize += prefixSize;
+ fmtSize += prefix_size;
if (fmtBuf[fmtSize - 1] != '\n')
fmtBuf[fmtSize++] = '\n';
fmtBuf[fmtSize] = '\0';
diff --git a/3rdparty/asmjit/test/broken.h b/3rdparty/asmjit/asmjit-testing/tests/broken.h
index 74b901c3699..cec5b92ac5e 100644
--- a/3rdparty/asmjit/test/broken.h
+++ b/3rdparty/asmjit/asmjit-testing/tests/broken.h
@@ -52,7 +52,7 @@ enum Flags : unsigned {
struct Unit;
-bool hasArg(const char* name) noexcept;
+bool has_arg(const char* name) noexcept;
//! Register a new unit test (called automatically by `AutoUnit` and `UNIT`).
void addUnit(Unit* unit) noexcept;
@@ -63,7 +63,7 @@ void setOutputFile(FILE* file) noexcept;
//! Initialize `Broken` framework.
//!
//! Returns `true` if `run()` should be called.
-int run(int argc, const char* argv[], Entry onBeforeRun = nullptr, Entry onAfterRun = nullptr);
+int run(int argc, const char* argv[], Entry on_before_run = nullptr, Entry onAfterRun = nullptr);
//! Log message, adds automatically new line if not present.
void info(const char* fmt, ...) noexcept;
diff --git a/3rdparty/asmjit/asmjit/a64.h b/3rdparty/asmjit/asmjit/a64.h
new file mode 100644
index 00000000000..01287897a56
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/a64.h
@@ -0,0 +1,55 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_A64_H_INCLUDED
+#define ASMJIT_A64_H_INCLUDED
+
+//! \addtogroup asmjit_a64
+//!
+//! ### Emitters
+//!
+//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
+//! - \ref a64::Builder - AArch64 builder.
+//! - \ref a64::Compiler - AArch64 compiler.
+//! - \ref a64::Emitter - AArch64 emitter (abstract).
+//!
+//! ### Supported Instructions
+//!
+//! - Emitters:
+//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility
+//! functions. The member functions provided are part of all AArch64 emitters.
+//!
+//! - Instruction representation:
+//! - \ref a64::Inst::Id - instruction identifiers.
+//!
+//! ### Register Operands
+//!
+//! - \ref a64::Gp - General purpose register (abstracts 32-bit and 64-bit general purpose registers).
+//! - \ref a64::Vec - Vector register (abstracts B, H, S, D, and Q NEON register with possible element type and index).
+//!
+//! ### Memory Operands
+//!
+//! - \ref a64::Mem - AArch64 memory operand that provides support for all ARM addressing features including base,
+//! index, pre/post increment, and ARM-specific shift addressing + index extending.
+//!
+//! ### Other
+//!
+//! - \ref arm::Shift - Shift operation and value.
+//! - \ref arm::Utils - Utilities that can help during code generation for AArch32 and AArch64.
+
+#include <asmjit/arm.h>
+
+#include <asmjit/asmjit-scope-begin.h>
+#include <asmjit/arm/a64assembler.h>
+#include <asmjit/arm/a64builder.h>
+#include <asmjit/arm/a64compiler.h>
+#include <asmjit/arm/a64emitter.h>
+#include <asmjit/arm/a64globals.h>
+#include <asmjit/arm/a64instdb.h>
+#include <asmjit/arm/a64operand.h>
+#include <asmjit/asmjit-scope-end.h>
+
+#endif // ASMJIT_A64_H_INCLUDED
+
diff --git a/3rdparty/asmjit/asmjit/arm.h b/3rdparty/asmjit/asmjit/arm.h
new file mode 100644
index 00000000000..af5d736c2cc
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm.h
@@ -0,0 +1,57 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_H_INCLUDED
+#define ASMJIT_ARM_H_INCLUDED
+
+//! \addtogroup asmjit_arm
+//!
+//! ### Namespaces
+//!
+//! - \ref arm - arm namespace provides common functionality for both AArch32 and AArch64 backends.
+//! \ref arm namespace, so you can only use a single namespace when targeting AArch32 architecture.
+//! - \ref a64 - a64 namespace provides support for AArch64 architecture. In addition it includes
+//! \ref arm namespace, so you can only use a single namespace when targeting AArch64 architecture.
+//!
+//! ### Emitters
+//!
+//! - AArch64:
+//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
+//! - \ref a64::Builder - AArch64 builder.
+//! - \ref a64::Compiler - AArch64 compiler.
+//! - \ref a64::Emitter - AArch64 emitter (abstract).
+//!
+//! ### Supported Instructions
+//!
+//! - AArch64:
+//! - Emitters:
+//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also
+//! utility functions. The member functions provided are part of all AArch64 emitters.
+//! - Instruction representation:
+//! - \ref a64::Inst::Id - instruction identifiers.
+//!
+//! ### ARM Operands
+//!
+//! - AArch64:
+//! - \ref a64::Gp - 32-bit or 64-bit general purpose register used by AArch64:
+//! - \ref a64::Vec - Vector (SIMD) register.
+//! - \ref a64::Mem - AArch64 memory operand that provides support for all AArch64 addressing features
+//! including base, index, pre/post increment, and AArch64 specific shift/extend of memory index.
+//!
+//! ### Memory Operands
+//!
+//! ### Other
+//!
+//! - \ref arm::Shift - Shift operation and value (both AArch32 and AArch64).
+//! - \ref arm::Utils - Utilities that can help during code generation for AArch32 and AArch64.
+
+#include <asmjit/core.h>
+
+#include <asmjit/asmjit-scope-begin.h>
+#include <asmjit/arm/armglobals.h>
+#include <asmjit/arm/armutils.h>
+#include <asmjit/asmjit-scope-end.h>
+
+#endif // ASMJIT_ARM_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64archtraits_p.h b/3rdparty/asmjit/asmjit/arm/a64archtraits_p.h
new file mode 100644
index 00000000000..ce1e943b77b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64archtraits_p.h
@@ -0,0 +1,82 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
+#define ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/core/type.h>
+#include <asmjit/arm/a64globals.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+static const constexpr ArchTraits a64_arch_traits = {
+ // SP/FP/LR/PC.
+ Gp::kIdSp, Gp::kIdFp, Gp::kIdLr, 0xFFu,
+
+ // Reserved.
+ { 0u, 0u, 0u },
+
+ // HW stack alignment (AArch64 requires stack aligned to 16 bytes at HW level).
+ 16u,
+
+ // Min/max stack offset - byte addressing is the worst, vec.q addressing the best.
+ 4095, 65520,
+
+ // Supported register types.
+ 0u | (1u << uint32_t(RegType::kGp32 ))
+ | (1u << uint32_t(RegType::kGp64 ))
+ | (1u << uint32_t(RegType::kVec8 ))
+ | (1u << uint32_t(RegType::kVec16 ))
+ | (1u << uint32_t(RegType::kVec32 ))
+ | (1u << uint32_t(RegType::kVec64 ))
+ | (1u << uint32_t(RegType::kVec128))
+ | (1u << uint32_t(RegType::kMask )),
+
+ // Instruction hints [Gp, Vec, Mask, Extra].
+ {{
+ InstHints::kPushPop,
+ InstHints::kPushPop,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // TypeIdToRegType.
+ #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt64) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt64) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kVec32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kVec64 : RegType::kNone)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kByte,
+ ArchTypeNameId::kHWord,
+ ArchTypeNameId::kWord,
+ ArchTypeNameId::kXWord
+ }
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64assembler.cpp b/3rdparty/asmjit/asmjit/arm/a64assembler.cpp
new file mode 100644
index 00000000000..982da3d3298
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64assembler.cpp
@@ -0,0 +1,5338 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/core/codewriter_p.h>
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/emitterutils_p.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/armformatter_p.h>
+#include <asmjit/arm/armutils.h>
+#include <asmjit/arm/a64assembler.h>
+#include <asmjit/arm/a64emithelper_p.h>
+#include <asmjit/arm/a64instdb_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Assembler - Utils
+// ======================
+
+static ASMJIT_INLINE_CONSTEXPR uint32_t diff(RegType a, RegType b) noexcept { return uint32_t(a) - uint32_t(b); }
+static ASMJIT_INLINE_CONSTEXPR uint32_t diff(VecElementType element_type, VecElementType base_type) noexcept { return uint32_t(element_type) - uint32_t(base_type); }
+
+// a64::Assembler - Cond
+// =====================
+
+static inline uint32_t cond_code_to_opcode_field(uint32_t cond) noexcept { return (uint32_t(cond) - 2u) & 0xFu; }
+
+// a64::Assembler - Bits
+// =====================
+
+template<typename T>
+static inline constexpr uint32_t B(const T& index) noexcept { return uint32_t(1u) << uint32_t(index); }
+
+static constexpr uint32_t kSP = Gp::kIdSp;
+static constexpr uint32_t kZR = Gp::kIdZr;
+static constexpr uint32_t kWX = InstDB::kWX;
+
+// a64::Assembler - ShiftOpToLdStOptMap
+// ====================================
+
+// Table that maps ShiftOp to OPT part in LD/ST (register) opcode.
+#define VALUE(index) index == uint32_t(ShiftOp::kUXTW) ? 2u : \
+ index == uint32_t(ShiftOp::kLSL) ? 3u : \
+ index == uint32_t(ShiftOp::kSXTW) ? 6u : \
+ index == uint32_t(ShiftOp::kSXTX) ? 7u : 0xFF
+static const uint8_t shift_op_to_ld_st_opt_map[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
+#undef VALUE
+
+// a64::Assembler - ExtendOpToRegType
+// ==================================
+
+static inline RegType extend_option_to_reg_type(uint32_t option) noexcept {
+ uint32_t pred = (uint32_t(RegType::kGp32) << (0x0 * 4)) | // 0b000 - UXTB.
+ (uint32_t(RegType::kGp32) << (0x1 * 4)) | // 0b001 - UXTH.
+ (uint32_t(RegType::kGp32) << (0x2 * 4)) | // 0b010 - UXTW.
+ (uint32_t(RegType::kGp64) << (0x3 * 4)) | // 0b011 - UXTX|LSL.
+ (uint32_t(RegType::kGp32) << (0x4 * 4)) | // 0b100 - SXTB.
+ (uint32_t(RegType::kGp32) << (0x5 * 4)) | // 0b101 - SXTH.
+ (uint32_t(RegType::kGp32) << (0x6 * 4)) | // 0b110 - SXTW.
+ (uint32_t(RegType::kGp64) << (0x7 * 4)) ; // 0b111 - SXTX.
+ return RegType((pred >> (option * 4u)) & 0xFu);
+}
+
+// asmjit::a64::Assembler - SizeOp
+// ===============================
+
+//! Struct that contains Size (2 bits), Q flag, and S (scalar) flag. These values
+//! are used to encode Q, Size, and Scalar fields in an opcode.
+struct SizeOp {
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint8_t k128BitShift = 0;
+ static inline constexpr uint8_t kScalarShift = 1;
+ static inline constexpr uint8_t kSizeShift = 2;
+
+ static inline constexpr uint8_t kQ = uint8_t(1u << k128BitShift);
+ static inline constexpr uint8_t kS = uint8_t(1u << kScalarShift);
+
+ static inline constexpr uint8_t k00 = uint8_t(0 << kSizeShift);
+ static inline constexpr uint8_t k01 = uint8_t(1 << kSizeShift);
+ static inline constexpr uint8_t k10 = uint8_t(2 << kSizeShift);
+ static inline constexpr uint8_t k11 = uint8_t(3 << kSizeShift);
+
+ static inline constexpr uint8_t k00Q = k00 | kQ;
+ static inline constexpr uint8_t k01Q = k01 | kQ;
+ static inline constexpr uint8_t k10Q = k10 | kQ;
+ static inline constexpr uint8_t k11Q = k11 | kQ;
+
+ static inline constexpr uint8_t k00S = k00 | kS;
+ static inline constexpr uint8_t k01S = k01 | kS;
+ static inline constexpr uint8_t k10S = k10 | kS;
+ static inline constexpr uint8_t k11S = k11 | kS;
+
+ static inline constexpr uint8_t kInvalid = 0xFFu;
+
+ // Masks used by SizeOpMap.
+ static inline constexpr uint8_t kSzQ = (0x3u << kSizeShift) | kQ;
+ static inline constexpr uint8_t kSzS = (0x3u << kSizeShift) | kS;
+ static inline constexpr uint8_t kSzQS = (0x3u << kSizeShift) | kQ | kS;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint8_t value;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ inline bool is_valid() const noexcept { return value != kInvalid; }
+ inline void make_invalid() noexcept { value = kInvalid; }
+
+ inline uint32_t q() const noexcept { return (value >> k128BitShift) & 0x1u; }
+ inline uint32_t qs() const noexcept { return ((value >> k128BitShift) | (value >> kScalarShift)) & 0x1u; }
+ inline uint32_t scalar() const noexcept { return (value >> kScalarShift) & 0x1u; }
+ inline uint32_t size() const noexcept { return (value >> kSizeShift) & 0x3u; }
+
+ inline void decrement_size() noexcept {
+ ASMJIT_ASSERT(size() > 0);
+ value = uint8_t(value - (1u << kSizeShift));
+ }
+
+ //! \}
+};
+
+struct SizeOpTable {
+ enum TableId : uint8_t {
+ kTableBin = 0,
+ kTableAny,
+ kCount
+ };
+
+ // 40 elements for each combination.
+ SizeOp array[(uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8) + 1) * 8];
+};
+
+#define VALUE_BIN(x) { \
+ x == (((uint32_t(RegType::kVec64 ) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00 : \
+ x == (((uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00Q : \
+ x == (((uint32_t(RegType::kVec64 ) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \
+ x == (((uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : SizeOp::kInvalid \
+}
+
+#define VALUE_ANY(x) { \
+ x == (((uint32_t(RegType::kVec8) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00S : \
+ x == (((uint32_t(RegType::kVec16) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k01S : \
+ x == (((uint32_t(RegType::kVec32) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k10S : \
+ x == (((uint32_t(RegType::kVec64) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k11S : \
+ x == (((uint32_t(RegType::kVec64) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \
+ x == (((uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : \
+ x == (((uint32_t(RegType::kVec64) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01 : \
+ x == (((uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01Q : \
+ x == (((uint32_t(RegType::kVec64) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10 : \
+ x == (((uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10Q : \
+ x == (((uint32_t(RegType::kVec64) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11S : \
+ x == (((uint32_t(RegType::kVec128) - uint32_t(RegType::kVec8)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11Q : SizeOp::kInvalid \
+}
+
+static const SizeOpTable size_op_table[SizeOpTable::kCount] = {
+ {{ ASMJIT_LOOKUP_TABLE_40(VALUE_BIN, 0) }},
+ {{ ASMJIT_LOOKUP_TABLE_40(VALUE_ANY, 0) }}
+};
+
+#undef VALUE_ANY
+#undef VALUE_BIN
+
+struct SizeOpMap {
+ uint8_t table_id;
+ uint8_t size_op_mask;
+ uint16_t accept_mask;
+};
+
+static const constexpr SizeOpMap size_op_map[InstDB::kVO_Count] = {
+ { // kVO_V_B:
+ SizeOpTable::kTableBin, SizeOp::kQ , uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q))
+ },
+
+ { // kVO_V_BH:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q))
+ },
+
+ { // kVO_V_BH_4S:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_BHS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_BHS_D2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k11Q))
+ },
+
+ { // kVO_V_HS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_S:
+ SizeOpTable::kTableAny, SizeOp::kQ , uint16_t(B(SizeOp::k10) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_B8H4:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k01))
+ },
+
+ { // kVO_V_B8H4S2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k01) | B(SizeOp::k10))
+ },
+
+ { // kVO_V_B8D1:
+ SizeOpTable::kTableAny, SizeOp::kSzQ , uint16_t(B(SizeOp::k00) | B(SizeOp::k11S))
+ },
+
+ { // kVO_V_H4S2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k10))
+ },
+
+ { // kVO_V_B16:
+ SizeOpTable::kTableBin, SizeOp::kQ , uint16_t(B(SizeOp::k00Q))
+ },
+
+ { // kVO_V_B16H8:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k01Q))
+ },
+
+ { // kVO_V_B16H8S4:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k01Q) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_B16D2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k11Q))
+ },
+
+ { // kVO_V_H8S4:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01Q) | B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_S4:
+ SizeOpTable::kTableAny, 0 , uint16_t(B(SizeOp::k10Q))
+ },
+
+ { // kVO_V_D2:
+ SizeOpTable::kTableAny, 0 , uint16_t(B(SizeOp::k11Q))
+ },
+
+ { // kVO_SV_BHS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k00S) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S))
+ },
+
+ { // kVO_SV_B8H4S2:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00S) | B(SizeOp::k01) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10S))
+ },
+
+ { // kVO_SV_HS:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S))
+ },
+
+ { // kVO_V_Any:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k11S) | B(SizeOp::k11Q))
+ },
+
+ { // kVO_SV_Any:
+ SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k00S) |
+ B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) |
+ B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S) |
+ B(SizeOp::k11) | B(SizeOp::k11Q) | B(SizeOp::k11S))
+ }
+};
+
+static const Operand_& significant_simd_op(const Operand_& o0, const Operand_& o1, uint32_t inst_flags) noexcept {
+ return !(inst_flags & InstDB::kInstFlagLong) ? o0 : o1;
+}
+
+static inline SizeOp element_type_to_size_op(uint32_t vec_op_type, RegType reg_type, VecElementType element_type) noexcept {
+ // Instruction data or Assembler is wrong if this triggers an assertion failure.
+ ASMJIT_ASSERT(vec_op_type < InstDB::kVO_Count);
+ // ElementType uses 3 bits in the operand signature, it should never overflow.
+ ASMJIT_ASSERT(uint32_t(element_type) <= 0x7u);
+
+ const SizeOpMap& map = size_op_map[vec_op_type];
+ const SizeOpTable& table = size_op_table[map.table_id];
+
+ size_t index = (Support::min<uint32_t>(diff(reg_type, RegType::kVec8), diff(RegType::kVec128, RegType::kVec8) + 1) << 3) | uint32_t(element_type);
+ SizeOp op = table.array[index];
+ SizeOp modified_op { uint8_t(op.value & map.size_op_mask) };
+
+ if (!Support::bit_test(map.accept_mask, op.value)) {
+ modified_op.make_invalid();
+ }
+
+ return modified_op;
+}
+
+// a64::Assembler - Immediate Encoding Utilities (Integral)
+// ========================================================
+
+using Utils::LogicalImm;
+
+struct HalfWordImm {
+ uint32_t hw;
+ uint32_t inv;
+ uint32_t imm;
+};
+
+struct LMHImm {
+ uint32_t lm;
+ uint32_t h;
+ uint32_t max_rm_id;
+};
+
+static inline uint32_t count_zero_half_words_64(uint64_t imm) noexcept {
+ return uint32_t((imm & 0x000000000000FFFFu) == 0) +
+ uint32_t((imm & 0x00000000FFFF0000u) == 0) +
+ uint32_t((imm & 0x0000FFFF00000000u) == 0) +
+ uint32_t((imm & 0xFFFF000000000000u) == 0) ;
+}
+
+static uint32_t encode_mov_sequence_32(uint32_t out[2], uint32_t imm, uint32_t rd, uint32_t x) noexcept {
+ ASMJIT_ASSERT(rd <= 31);
+
+ uint32_t kMovZ = 0b01010010100000000000000000000000 | (x << 31);
+ uint32_t kMovN = 0b00010010100000000000000000000000;
+ uint32_t kMovK = 0b01110010100000000000000000000000;
+
+ if ((imm & 0xFFFF0000u) == 0x00000000u) {
+ out[0] = kMovZ | (0 << 21) | ((imm & 0xFFFFu) << 5) | rd;
+ return 1;
+ }
+
+ if ((imm & 0xFFFF0000u) == 0xFFFF0000u) {
+ out[0] = kMovN | (0 << 21) | ((~imm & 0xFFFFu) << 5) | rd;
+ return 1;
+ }
+
+ if ((imm & 0x0000FFFFu) == 0x00000000u) {
+ out[0] = kMovZ | (1 << 21) | ((imm >> 16) << 5) | rd;
+ return 1;
+ }
+
+ if ((imm & 0x0000FFFFu) == 0x0000FFFFu) {
+ out[0] = kMovN | (1 << 21) | ((~imm >> 16) << 5) | rd;
+ return 1;
+ }
+
+ out[0] = kMovZ | (0 << 21) | ((imm & 0xFFFFu) << 5) | rd;
+ out[1] = kMovK | (1 << 21) | ((imm >> 16) << 5) | rd;
+ return 2;
+}
+
+static uint32_t encode_mov_sequence_64(uint32_t out[4], uint64_t imm, uint32_t rd, uint32_t x) noexcept {
+ ASMJIT_ASSERT(rd <= 31);
+
+ uint32_t kMovZ = 0b11010010100000000000000000000000;
+ uint32_t kMovN = 0b10010010100000000000000000000000;
+ uint32_t kMovK = 0b11110010100000000000000000000000;
+
+ if (imm <= 0xFFFFFFFFu)
+ return encode_mov_sequence_32(out, uint32_t(imm), rd, x);
+
+ uint32_t zhw = count_zero_half_words_64( imm);
+ uint32_t ohw = count_zero_half_words_64(~imm);
+
+ if (zhw >= ohw) {
+ uint32_t op = kMovZ;
+ uint32_t count = 0;
+
+ for (uint32_t hw_index = 0; hw_index < 4; hw_index++, imm >>= 16) {
+ uint32_t hw_imm = uint32_t(imm & 0xFFFFu);
+ if (hw_imm == 0) {
+ continue;
+ }
+
+ out[count++] = op | (hw_index << 21) | (hw_imm << 5) | rd;
+ op = kMovK;
+ }
+
+ // This should not happen - zero should be handled by encode_mov_sequence_32().
+ ASMJIT_ASSERT(count > 0);
+
+ return count;
+ }
+ else {
+ uint32_t op = kMovN;
+ uint32_t count = 0;
+ uint32_t neg_mask = 0xFFFFu;
+
+ for (uint32_t hw_index = 0; hw_index < 4; hw_index++, imm >>= 16) {
+ uint32_t hw_imm = uint32_t(imm & 0xFFFFu);
+ if (hw_imm == 0xFFFFu) {
+ continue;
+ }
+
+ out[count++] = op | (hw_index << 21) | ((hw_imm ^ neg_mask) << 5) | rd;
+ op = kMovK;
+ neg_mask = 0;
+ }
+
+ if (count == 0) {
+ out[count++] = kMovN | ((0xFFFF ^ neg_mask) << 5) | rd;
+ }
+
+ return count;
+ }
+}
+
+static inline bool encode_lmh(uint32_t size_field, uint32_t element_index, Out<LMHImm> out) noexcept {
+ if (size_field != 1 && size_field != 2)
+ return false;
+
+ uint32_t h_shift = 3u - size_field;
+ uint32_t lm_shift = size_field - 1u;
+ uint32_t max_element_index = 15u >> size_field;
+
+ out->h = element_index >> h_shift;
+ out->lm = (element_index << lm_shift) & 0x3u;
+ out->max_rm_id = (8u << size_field) - 1;
+
+ return element_index <= max_element_index;
+}
+
+// a64::Assembler - Opcode
+// =======================
+
+//! Helper class to store and manipulate ARM opcode.
+struct Opcode {
+ uint32_t v;
+
+ enum Bits : uint32_t {
+ kN = (1u << 22),
+ kQ = (1u << 30),
+ kX = (1u << 31)
+ };
+
+ // --------------------------------------------------------------------------
+ // [Opcode Builder]
+ // --------------------------------------------------------------------------
+
+ inline uint32_t get() const noexcept { return v; }
+ inline void reset(uint32_t value) noexcept { v = value; }
+
+ inline bool has_q() const noexcept { return (v & kQ) != 0; }
+ inline bool has_x() const noexcept { return (v & kX) != 0; }
+
+ template<typename T>
+ inline Opcode& add_imm(T value, uint32_t bit_index) noexcept { return operator|=(uint32_t(value) << bit_index); }
+
+ template<typename T>
+ inline Opcode& xor_imm(T value, uint32_t bit_index) noexcept { return operator^=(uint32_t(value) << bit_index); }
+
+ template<typename T, typename Condition>
+ inline Opcode& add_if(T value, const Condition& condition) noexcept { return operator|=(condition ? uint32_t(value) : uint32_t(0)); }
+
+ inline Opcode& add_logical_imm(const LogicalImm& logical_imm) noexcept {
+ add_imm(logical_imm.n, 22);
+ add_imm(logical_imm.r, 16);
+ add_imm(logical_imm.s, 10);
+ return *this;
+ }
+
+ inline Opcode& add_reg(uint32_t id, uint32_t bit_index) noexcept { return operator|=((id & 31u) << bit_index); }
+ inline Opcode& add_reg(const Operand_& op, uint32_t bit_index) noexcept { return add_reg(op.id(), bit_index); }
+
+ inline Opcode& operator=(uint32_t x) noexcept { v = x; return *this; }
+ inline Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; }
+ inline Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; }
+ inline Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; }
+
+ inline uint32_t operator&(uint32_t x) const noexcept { return v & x; }
+ inline uint32_t operator|(uint32_t x) const noexcept { return v | x; }
+ inline uint32_t operator^(uint32_t x) const noexcept { return v ^ x; }
+};
+
+// a64::Assembler - Signature Utilities
+// ====================================
+
+// TODO: [ARM] Deprecate match_signature.
+static inline bool match_signature(const Operand_& o0, const Operand_& o1, uint32_t inst_flags) noexcept {
+ if (!(inst_flags & (InstDB::kInstFlagLong | InstDB::kInstFlagNarrow)))
+ return o0.signature() == o1.signature();
+
+ // TODO: [ARM] Something smart to validate this.
+ return true;
+}
+
+static inline bool match_signature(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t inst_flags) noexcept {
+ return match_signature(o0, o1, inst_flags) && o1.signature() == o2.signature();
+}
+
+static inline bool match_signature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, uint32_t inst_flags) noexcept {
+ return match_signature(o0, o1, inst_flags) && o1.signature() == o2.signature() && o2.signature() == o3.signature();
+}
+
+// Memory must be either:
+// 1. Absolute address, which will be converted to relative.
+// 2. Relative displacement (Label).
+// 3. Base register + either offset or index.
+static inline bool check_mem_base_index_rel(const Mem& mem) noexcept {
+ // Allowed base types (Nothing, Label, and Gp64).
+ constexpr uint32_t kBaseMask = B(0) | B(RegType::kLabelTag) | B(RegType::kGp64);
+ // Allowed index types (Nothing, Gp32, and Gp64).
+ constexpr uint32_t kIndexMask = B(0) | B(RegType::kGp32) | B(RegType::kGp64) ;
+
+ RegType base_type = mem.base_type();
+ RegType index_type = mem.index_type();
+
+ if (!Support::bit_test(kBaseMask, base_type)) {
+ return false;
+ }
+
+ if (base_type > RegType::kLabelTag) {
+ // Index allows either Gp32 or Gp64.
+ if (!Support::bit_test(kIndexMask, index_type)) {
+ return false;
+ }
+
+ if (index_type == RegType::kNone) {
+ return true;
+ }
+ else {
+ return !mem.has_offset();
+ }
+ }
+ else {
+ // No index register allowed if this is a PC relative address (literal).
+ return index_type == RegType::kNone;
+ }
+}
+
+struct EncodeFpOpcodeBits {
+ uint32_t size_mask;
+ uint32_t mask[3];
+};
+
+static inline bool pick_fp_opcode(const Vec& reg, uint32_t s_op, uint32_t s_hf, uint32_t v_op, uint32_t v_hf, Opcode* opcode, uint32_t* sz_out) noexcept {
+ static constexpr uint32_t kQBitIndex = 30;
+
+ static const EncodeFpOpcodeBits sz_bits_table[InstDB::kHF_Count] = {
+ { B(2) | B(1) , { 0u , 0u, B(22) } },
+ { B(2) | B(1) | B(0), { 0u , 0u, 0u } },
+ { B(2) | B(1) | B(0), { B(23) | B(22) , 0u, B(22) } },
+ { B(2) | B(1) | B(0), { B(22) | B(20) | B(19) , 0u, B(22) } },
+ { B(2) | B(1) | B(0), { B(22) | B(21) | B(15) | B(14), 0u, B(22) } },
+ { B(2) | B(1) | B(0), { B(23) , 0u, B(22) } }
+ };
+
+ if (!reg.has_element_type()) {
+ // Scalar operation [HSD].
+ uint32_t sz = diff(reg.reg_type(), RegType::kVec16);
+ if (sz > 2u || !Support::bit_test(sz_bits_table[s_hf].size_mask, sz)) {
+ return false;
+ }
+
+ opcode->reset(sz_bits_table[s_hf].mask[sz] ^ s_op);
+ *sz_out = sz;
+ return s_op != 0;
+ }
+ else {
+ // Vector operation [HSD].
+ uint32_t q = diff(reg.reg_type(), RegType::kVec64);
+ uint32_t sz = diff(reg.element_type(), VecElementType::kH);
+
+ if (q > 1u || sz > 2u || !Support::bit_test(sz_bits_table[v_hf].size_mask, sz)) {
+ return false;
+ }
+
+ opcode->reset(sz_bits_table[v_hf].mask[sz] ^ (v_op | (q << kQBitIndex)));
+ *sz_out = sz;
+ return v_op != 0;
+ }
+}
+
+static inline bool pick_fp_opcode(const Vec& reg, uint32_t s_op, uint32_t s_hf, uint32_t v_op, uint32_t v_hf, Opcode* opcode) noexcept {
+ uint32_t sz;
+ return pick_fp_opcode(reg, s_op, s_hf, v_op, v_hf, opcode, &sz);
+}
+
+// a64::Assembler - Operand Checks
+// ===============================
+
+// Checks whether all operands have the same signature.
+static inline bool check_signature(const Operand_& o0, const Operand_& o1) noexcept {
+ return o0.signature() == o1.signature();
+}
+
+static inline bool check_signature(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ return o0.signature() == o1.signature() &&
+ o1.signature() == o2.signature();
+}
+
+static inline bool check_signature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ return o0.signature() == o1.signature() &&
+ o1.signature() == o2.signature() &&
+ o2.signature() == o3.signature();
+}
+
+// Checks whether the register is GP register of the allowed types.
+//
+// Allowed is a 2-bit mask, where the first bits allows Gp32 and the second bit allows Gp64. These bits are usually
+// stored within the instruction, but could be also hardcoded in the assembler for instructions where GP types are
+// not selectable.
+static inline bool check_gp_type(const Operand_& op, uint32_t allowed) noexcept {
+ RegType type = op.as<Reg>().reg_type();
+ return Support::bit_test(allowed << uint32_t(RegType::kGp32), type);
+}
+
+static inline bool check_gp_type(const Operand_& op, uint32_t allowed, uint32_t* x) noexcept {
+ // NOTE: We set 'x' to one only when Gp32 is allowed, otherwise the X is part
+ // of the opcode and we cannot set it. This is why this works without requiring
+ // additional logic.
+ RegType type = op.as<Reg>().reg_type();
+ *x = diff(type, RegType::kGp32) & allowed;
+ return Support::bit_test(allowed << uint32_t(RegType::kGp32), type);
+}
+
+static inline bool check_gp_type(const Operand_& o0, const Operand_& o1, uint32_t allowed, uint32_t* x) noexcept {
+ return check_gp_type(o0, allowed, x) && check_signature(o0, o1);
+}
+
+static inline bool check_gp_type(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t allowed, uint32_t* x) noexcept {
+ return check_gp_type(o0, allowed, x) && check_signature(o0, o1, o2);
+}
+
+static inline bool check_gp_id(const Operand_& op, uint32_t hi_id = kZR) noexcept {
+ uint32_t id = op.as<Reg>().id();
+ return id < 31u || id == hi_id;
+}
+
+static inline bool check_gp_id(const Operand_& o0, const Operand_& o1, uint32_t hi_id = kZR) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+
+ return (id0 < 31u || id0 == hi_id) && (id1 < 31u || id1 == hi_id);
+}
+
+static inline bool check_gp_id(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t hi_id = kZR) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+ uint32_t id2 = o2.as<Reg>().id();
+
+ return (id0 < 31u || id0 == hi_id) && (id1 < 31u || id1 == hi_id) && (id2 < 31u || id2 == hi_id);
+}
+
+static inline bool check_vec_id(const Operand_& op) noexcept {
+ uint32_t id = op.as<Reg>().id();
+ return id <= 31u;
+}
+
+static inline bool check_vec_id(const Operand_& o0, const Operand_& o1) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+
+ return (id0 | id1) <= 31u;
+}
+
+/* Unused at the moment.
+static inline bool check_vec_id(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+ uint32_t id2 = o2.as<Reg>().id();
+
+ return (id0 | id1 | id2) <= 31u;
+}
+
+static inline bool check_vec_id(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ uint32_t id0 = o0.as<Reg>().id();
+ uint32_t id1 = o1.as<Reg>().id();
+ uint32_t id2 = o2.as<Reg>().id();
+ uint32_t id3 = o3.as<Reg>().id();
+
+ return (id0 | id1 | id2 | id3) <= 31u;
+}
+*/
+
+static inline bool check_mem_base(const Mem& mem) noexcept {
+ return mem.base_type() == RegType::kGp64 && mem.base_id() <= 31;
+}
+
+static inline bool check_even(const Operand_& o0, const Operand_& o1) noexcept {
+ return ((o0.id() | o1.id()) & 1) == 0;
+}
+
+static inline bool check_consecutive(const Operand_& o0, const Operand_& o1) noexcept {
+ return ((o0.id() + 1u) & 0x1Fu) == o1.id();
+}
+
+static inline bool check_consecutive(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ return ((o0.id() + 1u) & 0x1Fu) == o1.id() &&
+ ((o0.id() + 2u) & 0x1Fu) == o2.id();
+}
+
+static inline bool check_consecutive(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ return ((o0.id() + 1u) & 0x1Fu) == o1.id() &&
+ ((o0.id() + 2u) & 0x1Fu) == o2.id() &&
+ ((o0.id() + 3u) & 0x1Fu) == o3.id();
+}
+
+// a64::Assembler - CheckReg
+// =========================
+
+#define V(index) (index == uint32_t(RegType::kGp32) ? Gp::kIdZr : \
+ index == uint32_t(RegType::kGp64) ? Gp::kIdZr : \
+ index == uint32_t(RegType::kVec8) ? 31u : \
+ index == uint32_t(RegType::kVec16) ? 31u : \
+ index == uint32_t(RegType::kVec32) ? 31u : \
+ index == uint32_t(RegType::kVec64) ? 31u : \
+ index == uint32_t(RegType::kVec128) ? 31u : 0)
+static const Support::Array<uint8_t, 32> common_hi_reg_id_of_type_table = {{
+ ASMJIT_LOOKUP_TABLE_32(V, 0)
+}};
+#undef V
+
+static inline bool check_valid_regs(const Operand_& o0) noexcept {
+ return bool(unsigned(o0.id() < 31) | unsigned(o0.id() == common_hi_reg_id_of_type_table[o0.as<Reg>().reg_type()]));
+}
+
+static inline bool check_valid_regs(const Operand_& o0, const Operand_& o1) noexcept {
+ return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == common_hi_reg_id_of_type_table[o0.as<Reg>().reg_type()])) &
+ (unsigned(o1.id() < 31) | unsigned(o1.id() == common_hi_reg_id_of_type_table[o1.as<Reg>().reg_type()])));
+}
+
+static inline bool check_valid_regs(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
+ return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == common_hi_reg_id_of_type_table[o0.as<Reg>().reg_type()])) &
+ (unsigned(o1.id() < 31) | unsigned(o1.id() == common_hi_reg_id_of_type_table[o1.as<Reg>().reg_type()])) &
+ (unsigned(o2.id() < 31) | unsigned(o2.id() == common_hi_reg_id_of_type_table[o2.as<Reg>().reg_type()])));
+}
+
+static inline bool check_valid_regs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
+ return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == common_hi_reg_id_of_type_table[o0.as<Reg>().reg_type()])) &
+ (unsigned(o1.id() < 31) | unsigned(o1.id() == common_hi_reg_id_of_type_table[o1.as<Reg>().reg_type()])) &
+ (unsigned(o2.id() < 31) | unsigned(o2.id() == common_hi_reg_id_of_type_table[o2.as<Reg>().reg_type()])) &
+ (unsigned(o3.id() < 31) | unsigned(o3.id() == common_hi_reg_id_of_type_table[o3.as<Reg>().reg_type()])));
+}
+
+// a64::Assembler - Construction & Destruction
+// ===========================================
+
+Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
+ _arch_mask = uint64_t(1) << uint32_t(Arch::kAArch64);
+ init_emitter_funcs(this);
+
+ if (code) {
+ code->attach(this);
+ }
+}
+
+Assembler::~Assembler() noexcept {}
+
+// a64::Assembler - Emit
+// =====================
+
+#define ENC_OPS1(OP0) \
+ (uint32_t(OperandType::k##OP0))
+
+#define ENC_OPS2(OP0, OP1) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3))
+
+#define ENC_OPS3(OP0, OP1, OP2) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6))
+
+#define ENC_OPS4(OP0, OP1, OP2, OP3) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6) + \
+ (uint32_t(OperandType::k##OP3) << 9))
+
+Error Assembler::_emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) {
+ // Logging/Validation/Error.
+ constexpr InstOptions kRequiresSpecialHandling = InstOptions::kReserved;
+
+ Error err;
+ CodeWriter writer(this);
+
+ // Combine all instruction options and also check whether the instruction
+ // is valid. All options that require special handling (including invalid
+ // instruction) are handled by the next branch.
+ InstOptions options = InstOptions(inst_id - 1 >= Inst::_kIdCount - 1) | InstOptions((size_t)(_buffer_end - writer.cursor()) < 4) | inst_options() | forced_inst_options();
+
+ CondCode inst_cc = BaseInst::extract_arm_cond_code(inst_id);
+ inst_id = inst_id & uint32_t(InstIdParts::kRealId);
+
+ if (inst_id >= Inst::_kIdCount) {
+ inst_id = 0;
+ }
+
+ const InstDB::InstInfo* inst_info = &InstDB::_inst_info_table[inst_id];
+ uint32_t encoding_index = inst_info->_encoding_data_index;
+
+ Opcode opcode;
+ uint32_t isign4;
+ uint32_t inst_flags;
+
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const Operand_* rm_rel = nullptr;
+
+ uint32_t multiple_op_data[4];
+ uint32_t multiple_op_count;
+
+ // These are only used when instruction uses a relative displacement.
+ OffsetFormat offset_format; // Offset format.
+ uint64_t offset_value; // Offset value (if known).
+
+ if (ASMJIT_UNLIKELY(Support::test(options, kRequiresSpecialHandling))) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ // Unknown instruction.
+ if (ASMJIT_UNLIKELY(inst_id == 0)) {
+ goto InvalidInstruction;
+ }
+
+ // Condition code can only be used with 'B' instruction.
+ if (ASMJIT_UNLIKELY(inst_cc != CondCode::kAL && inst_id != Inst::kIdB)) {
+ goto InvalidInstruction;
+ }
+
+ // Grow request, happens rarely.
+ err = writer.ensure_space(this, 4);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+
+#ifndef ASMJIT_NO_INTROSPECTION
+ // Strict validation.
+ if (has_diagnostic_option(DiagnosticOptions::kValidateAssembler)) {
+ Operand_ op_array[Globals::kMaxOpCount];
+ EmitterUtils::op_array_from_emit_args(op_array, o0, o1, o2, op_ext);
+
+ err = _funcs.validate(BaseInst(inst_id, options, _extra_reg), op_array, Globals::kMaxOpCount, ValidationFlags::kNone);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+ }
+#endif
+ }
+
+ // Signature of the first 4 operands.
+ isign4 = (uint32_t(o0.op_type()) ) +
+ (uint32_t(o1.op_type()) << 3) +
+ (uint32_t(o2.op_type()) << 6) +
+ (uint32_t(o3.op_type()) << 9);
+ inst_flags = inst_info->flags();
+
+ switch (inst_info->_encoding) {
+ // ------------------------------------------------------------------------
+ // [Base - Universal]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseOp: {
+ const InstDB::EncodingData::BaseOp& op_data = InstDB::EncodingData::baseOp[encoding_index];
+
+ if (isign4 == 0) {
+ opcode.reset(op_data.opcode);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseOpX16: {
+ const InstDB::EncodingData::BaseOpX16& op_data = InstDB::EncodingData::baseOpX16[encoding_index];
+
+ if (isign4 == ENC_OPS1(Reg) && o0.as<Reg>().is_gp64(16)) {
+ opcode.reset(op_data.opcode);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseOpImm: {
+ const InstDB::EncodingData::BaseOpImm& op_data = InstDB::EncodingData::baseOpImm[encoding_index];
+
+ if (isign4 == ENC_OPS1(Imm)) {
+ uint64_t imm = o0.as<Imm>().value_as<uint64_t>();
+ uint32_t immMax = 1u << op_data.imm_bits;
+
+ if (imm >= immMax)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(imm, op_data.imm_offset);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseR: {
+ const InstDB::EncodingData::BaseR& op_data = InstDB::EncodingData::baseR[encoding_index];
+
+ if (isign4 == ENC_OPS1(Reg)) {
+ if (!check_gp_type(o0, op_data.reg_type))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.reg_hi_id))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_reg(o0, op_data.r_shift);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRR: {
+ const InstDB::EncodingData::BaseRR& op_data = InstDB::EncodingData::baseRR[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.a_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o1, op_data.b_type))
+ goto InvalidInstruction;
+
+ if (op_data.uniform && !check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.a_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o1, op_data.b_hi_id))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, op_data.b_shift);
+ opcode.add_reg(o0, op_data.a_shift);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRRR: {
+ const InstDB::EncodingData::BaseRRR& op_data = InstDB::EncodingData::baseRRR[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.a_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o1, op_data.b_type))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o2, op_data.c_type))
+ goto InvalidInstruction;
+
+ if (op_data.uniform && !check_signature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.a_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o1, op_data.b_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o2, op_data.c_hi_id))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRRRR: {
+ const InstDB::EncodingData::BaseRRRR& op_data = InstDB::EncodingData::baseRRRR[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.a_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o1, op_data.b_type))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o2, op_data.c_type))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o3, op_data.d_type))
+ goto InvalidInstruction;
+
+ if (op_data.uniform && !check_signature(o0, o1, o2, o3))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.a_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o1, op_data.b_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o2, op_data.c_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o3, op_data.d_hi_id))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_reg(o3, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRRII: {
+ const InstDB::EncodingData::BaseRRII& op_data = InstDB::EncodingData::baseRRII[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ if (!check_gp_type(o0, op_data.a_type))
+ goto InvalidInstruction;
+
+ if (!check_gp_type(o1, op_data.b_type))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.a_hi_id))
+ goto InvalidPhysId;
+
+ if (!check_gp_id(o1, op_data.b_hi_id))
+ goto InvalidPhysId;
+
+ if (o2.as<Imm>().value_as<uint64_t>() >= Support::bit_mask<uint32_t>(op_data.a_imm_size + op_data.a_imm_discard_lsb) ||
+ o3.as<Imm>().value_as<uint64_t>() >= Support::bit_mask<uint32_t>(op_data.b_imm_size + op_data.b_imm_discard_lsb))
+ goto InvalidImmediate;
+
+ uint32_t a_imm = o2.as<Imm>().value_as<uint32_t>() >> op_data.a_imm_discard_lsb;
+ uint32_t b_imm = o3.as<Imm>().value_as<uint32_t>() >> op_data.b_imm_discard_lsb;
+
+ if ((a_imm << op_data.a_imm_discard_lsb) != o2.as<Imm>().value_as<uint32_t>() ||
+ (b_imm << op_data.b_imm_discard_lsb) != o3.as<Imm>().value_as<uint32_t>())
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(a_imm, op_data.a_imm_offset);
+ opcode.add_imm(b_imm, op_data.b_imm_offset);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Mov]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseMov: {
+ // MOV is a pseudo instruction that uses various instructions depending on its signature.
+ uint32_t x = diff(o0.as<Reg>().reg_type(), RegType::kGp32);
+ if (x > 1)
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!o0.as<Reg>().is_gp())
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ bool has_sp = o0.as<Gp>().is_sp() || o1.as<Gp>().is_sp();
+ if (has_sp) {
+ // Cannot be combined with ZR.
+ if (!check_gp_id(o0, o1, kSP))
+ goto InvalidPhysId;
+
+ // MOV Rd, Rm -> ADD Rd, Rn, #0.
+ opcode.reset(0b00010001000000000000000000000000);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+ else {
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ // MOV Rd, Rm -> ORR Rd, <ZR>, Rm.
+ opcode.reset(0b00101010000000000000001111100000);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, 16);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (!o0.as<Reg>().is_gp())
+ goto InvalidInstruction;
+
+ uint64_t imm_value = o1.as<Imm>().value_as<uint64_t>();
+ if (!x)
+ imm_value &= 0xFFFFFFFFu;
+
+ // Prefer a single MOVN/MOVZ instruction over a logical instruction.
+ multiple_op_count = encode_mov_sequence_64(multiple_op_data, imm_value, o0.id() & 31, x);
+ if (multiple_op_count == 1 && !o0.as<Gp>().is_sp()) {
+ opcode.reset(multiple_op_data[0]);
+ goto EmitOp;
+ }
+
+ // Logical instructions use 13-bit immediate pattern encoded as N:ImmR:ImmS.
+ LogicalImm logical_imm;
+ if (!o0.as<Gp>().is_zr()) {
+ if (Utils::encode_logical_imm(imm_value, x ? 64 : 32, Out(logical_imm))) {
+ if (!check_gp_id(o0, kSP))
+ goto InvalidPhysId;
+
+ opcode.reset(0b00110010000000000000001111100000);
+ opcode.add_imm(x, 31);
+ opcode.add_logical_imm(logical_imm);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+ }
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ goto EmitOp_Multiple;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseMovKNZ: {
+ const InstDB::EncodingData::BaseMovKNZ& op_data = InstDB::EncodingData::baseMovKNZ[encoding_index];
+
+ uint32_t x = diff(o0.as<Reg>().reg_type(), RegType::kGp32);
+ if (x > 1)
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ uint64_t imm16 = o1.as<Imm>().value_as<uint64_t>();
+ if (imm16 > 0xFFFFu)
+ goto InvalidImmediate;
+
+ opcode.add_imm(imm16, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ uint64_t imm16 = o1.as<Imm>().value_as<uint64_t>();
+ uint32_t shift_type = o2.as<Imm>().predicate();
+ uint64_t shiftValue = o2.as<Imm>().value_as<uint64_t>();
+
+ if (imm16 > 0xFFFFu || shiftValue > 48 || shift_type != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ // Convert shift value to 'hw' field.
+ uint32_t hw = uint32_t(shiftValue) >> 4;
+ if ((hw << 4) != uint32_t(shiftValue))
+ goto InvalidImmediate;
+
+ opcode.add_imm(hw, 21);
+ opcode.add_imm(imm16, 5);
+ opcode.add_reg(o0, 0);
+
+ if (!x && hw > 1u)
+ goto InvalidImmediate;
+
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Adr]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseAdr: {
+ const InstDB::EncodingData::BaseAdr& op_data = InstDB::EncodingData::baseAdr[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Label) || isign4 == ENC_OPS2(Reg, Imm)) {
+ if (!o0.as<Reg>().is_gp64())
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_reg(o0, 0);
+ offset_format.reset_to_imm_value(op_data.offset_type, 4, 5, 21, 0);
+
+ if (inst_id == Inst::kIdAdrp)
+ offset_format._imm_discard_lsb = 12;
+
+ rm_rel = &o1;
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Arithmetic and Logical]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseAddSub: {
+ const InstDB::EncodingData::BaseAddSub& op_data = InstDB::EncodingData::baseAddSub[encoding_index];
+
+ uint32_t x;
+ if (!check_gp_type(o0, o1, kWX, &x))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) || isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ opcode.reset(uint32_t(op_data.immediate_op) << 24);
+
+ // ADD | SUB (immediate) - ZR is not allowed.
+ // ADDS|SUBS (immediate) - ZR allowed in Rd, SP allowed in Rn.
+ uint32_t a_hi_id = opcode.get() & B(29) ? kZR : kSP;
+ uint32_t b_hi_id = kSP;
+
+ if (!check_gp_id(o0, a_hi_id) || !check_gp_id(o1, b_hi_id))
+ goto InvalidPhysId;
+
+ // ADD|SUB (immediate) use 12-bit immediate optionally shifted by 'LSL #12'.
+ uint64_t imm = o2.as<Imm>().value_as<uint64_t>();
+ uint32_t shift = 0;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ if (o3.as<Imm>().predicate() != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ if (o3.as<Imm>().value() != 0 && o3.as<Imm>().value() != 12)
+ goto InvalidImmediate;
+
+ shift = uint32_t(o3.as<Imm>().value() != 0);
+ }
+
+ // Accept immediate value of '0x00XXX000' by setting 'shift' to 12.
+ if (imm > 0xFFFu) {
+ if (shift || (imm & ~uint64_t(0xFFFu << 12)) != 0)
+ goto InvalidImmediate;
+ shift = 1;
+ imm >>= 12;
+ }
+
+ opcode.add_imm(x, 31);
+ opcode.add_imm(shift, 22);
+ opcode.add_imm(imm, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) || isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ uint32_t op_size = x ? 64 : 32;
+ uint64_t shift = 0;
+ uint32_t shift_type = uint32_t(ShiftOp::kLSL);
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ shift_type = o3.as<Imm>().predicate();
+ shift = o3.as<Imm>().value_as<uint64_t>();
+ }
+
+ if (!check_gp_id(o2, kZR))
+ goto InvalidPhysId;
+
+ // Shift operation - LSL, LSR, ASR.
+ if (shift_type <= uint32_t(ShiftOp::kASR)) {
+ bool has_sp = o0.as<Gp>().is_sp() || o1.as<Gp>().is_sp();
+ if (!has_sp) {
+ if (!check_signature(o1, o2)) {
+ goto InvalidInstruction;
+ }
+
+ if (!check_gp_id(o0, o1, kZR)) {
+ goto InvalidPhysId;
+ }
+
+ if (shift >= op_size) {
+ goto InvalidImmediate;
+ }
+
+ opcode.reset(uint32_t(op_data.shifted_op) << 21);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(shift_type, 22);
+ opcode.add_reg(o2, 16);
+ opcode.add_imm(shift, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ // SP register can only be used with LSL or Extend.
+ if (shift_type != uint32_t(ShiftOp::kLSL)) {
+ goto InvalidImmediate;
+ }
+
+ shift_type = x ? uint32_t(ShiftOp::kUXTX) : uint32_t(ShiftOp::kUXTW);
+ }
+
+ // Extend operation - UXTB, UXTH, UXTW, UXTX, SXTB, SXTH, SXTW, SXTX.
+ opcode.reset(uint32_t(op_data.extended_op) << 21);
+ shift_type -= uint32_t(ShiftOp::kUXTB);
+
+ if (shift_type > 7 || shift > 4) {
+ goto InvalidImmediate;
+ }
+
+ if (!(opcode.get() & B(29))) {
+ // ADD|SUB (extend) - ZR is not allowed.
+ if (!check_gp_id(o0, o1, kSP))
+ goto InvalidPhysId;
+ }
+ else {
+ // ADDS|SUBS (extend) - ZR allowed in Rd, SP allowed in Rn.
+ if (!check_gp_id(o0, kZR) || !check_gp_id(o1, kSP))
+ goto InvalidPhysId;
+ }
+
+ // Validate whether the register operands match extend option.
+ if (o2.as<Reg>().reg_type() != extend_option_to_reg_type(shift_type) || o1.as<Reg>().reg_type() < o2.as<Reg>().reg_type()) {
+ goto InvalidInstruction;
+ }
+
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_imm(shift_type, 13);
+ opcode.add_imm(shift, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseLogical: {
+ const InstDB::EncodingData::BaseLogical& op_data = InstDB::EncodingData::baseLogical[encoding_index];
+
+ uint32_t x;
+ if (!check_gp_type(o0, o1, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t op_size = x ? 64 : 32;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && op_data.immediate_op != 0) {
+ opcode.reset(uint32_t(op_data.immediate_op) << 23);
+
+ // AND|ANDS|BIC|BICS|ORR|EOR (immediate) uses a LogicalImm format described by N:R:S values.
+ uint64_t imm_mask = Support::lsb_mask<uint64_t>(op_size);
+ uint64_t imm_value = o2.as<Imm>().value_as<uint64_t>();
+
+ if (op_data.negate_imm)
+ imm_value ^= imm_mask;
+
+ // Logical instructions use 13-bit immediate pattern encoded as N:ImmS:ImmR.
+ LogicalImm logical_imm;
+ if (!Utils::encode_logical_imm(imm_value & imm_mask, op_size, Out(logical_imm)))
+ goto InvalidImmediate;
+
+ // AND|BIC|ORR|EOR (immediate) can have SP on destination, but ANDS|BICS (immediate) cannot.
+ uint32_t kOpANDS = 0x3 << 29;
+ bool isANDS = (opcode.get() & kOpANDS) == kOpANDS;
+
+ if (!check_gp_id(o0, isANDS ? kZR : kSP) || !check_gp_id(o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.add_imm(x, 31);
+ opcode.add_logical_imm(logical_imm);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (!check_signature(o1, o2))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!check_gp_id(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(uint32_t(op_data.shifted_op) << 21);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!check_gp_id(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ uint32_t shift_type = o3.as<Imm>().predicate();
+ uint64_t op_shift = o3.as<Imm>().value_as<uint64_t>();
+
+ if (shift_type > 0x3 || op_shift >= op_size)
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(op_data.shifted_op) << 21);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(shift_type, 22);
+ opcode.add_reg(o2, 16);
+ opcode.add_imm(op_shift, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCmpCmn: {
+ const InstDB::EncodingData::BaseCmpCmn& op_data = InstDB::EncodingData::baseCmpCmn[encoding_index];
+
+ uint32_t x;
+ if (!check_gp_type(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ // CMN|CMP (immediate) - ZR is not allowed.
+ if (!check_gp_id(o0, kSP))
+ goto InvalidPhysId;
+
+ // CMN|CMP (immediate) use 12-bit immediate optionally shifted by 'LSL #12'.
+ const Imm& imm12 = o1.as<Imm>();
+ uint32_t imm_shift = 0;
+ uint64_t imm_value = imm12.value_as<uint64_t>();
+
+ if (imm_value > 0xFFFu) {
+ if ((imm_value & ~uint64_t(0xFFFu << 12)) != 0)
+ goto InvalidImmediate;
+ imm_shift = 1;
+ imm_value >>= 12;
+ }
+
+ opcode.reset(uint32_t(op_data.immediate_op) << 24);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(imm_shift, 22);
+ opcode.add_imm(imm_value, 10);
+ opcode.add_reg(o0, 5);
+ opcode.add_reg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Reg) || isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ uint32_t op_size = x ? 64 : 32;
+ uint32_t shift_type = 0;
+ uint64_t shift_value = 0;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ shift_type = o2.as<Imm>().predicate();
+ shift_value = o2.as<Imm>().value_as<uint64_t>();
+ }
+
+ bool has_sp = o0.as<Gp>().is_sp() || o1.as<Gp>().is_sp();
+
+ // Shift operation - LSL, LSR, ASR.
+ if (shift_type <= uint32_t(ShiftOp::kASR)) {
+ if (!has_sp) {
+ if (!check_signature(o0, o1)) {
+ goto InvalidInstruction;
+ }
+
+ if (shift_value >= op_size) {
+ goto InvalidImmediate;
+ }
+
+ opcode.reset(uint32_t(op_data.shifted_op) << 21);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(shift_type, 22);
+ opcode.add_reg(o1, 16);
+ opcode.add_imm(shift_value, 10);
+ opcode.add_reg(o0, 5);
+ opcode.add_reg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ // SP register can only be used with LSL or Extend.
+ if (shift_type != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ shift_type = x ? uint32_t(ShiftOp::kUXTX) : uint32_t(ShiftOp::kUXTW);
+ }
+
+ // Extend operation - UXTB, UXTH, UXTW, UXTX, SXTB, SXTH, SXTW, SXTX.
+ shift_type -= uint32_t(ShiftOp::kUXTB);
+ if (shift_type > 7 || shift_value > 4) {
+ goto InvalidImmediate;
+ }
+
+ // Validate whether the register operands match extend option.
+ if (o1.as<Reg>().reg_type() != extend_option_to_reg_type(shift_type) || o0.as<Reg>().reg_type() < o1.as<Reg>().reg_type()) {
+ goto InvalidInstruction;
+ }
+
+ opcode.reset(uint32_t(op_data.extended_op) << 21);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, 16);
+ opcode.add_imm(shift_type, 13);
+ opcode.add_imm(shift_value, 10);
+ opcode.add_reg(o0, 5);
+ opcode.add_reg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseMvnNeg: {
+ const InstDB::EncodingData::BaseMvnNeg& op_data = InstDB::EncodingData::baseMvnNeg[encoding_index];
+
+ uint32_t x;
+ if (!check_gp_type(o0, o1, kWX, &x))
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, 16);
+ opcode.add_reg(o0, 0);
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint32_t op_size = x ? 64 : 32;
+ uint32_t shift_type = o2.as<Imm>().predicate();
+ uint64_t shift_value = o2.as<Imm>().value_as<uint64_t>();
+
+ if (shift_type > uint32_t(ShiftOp::kROR) || shift_value >= op_size)
+ goto InvalidImmediate;
+
+ opcode.add_imm(shift_type, 22);
+ opcode.add_imm(shift_value, 10);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseTst: {
+ const InstDB::EncodingData::BaseTst& op_data = InstDB::EncodingData::baseTst[encoding_index];
+
+ uint32_t x;
+ if (!check_gp_type(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ uint32_t op_size = x ? 64 : 32;
+
+ if (isign4 == ENC_OPS2(Reg, Imm) && op_data.immediate_op != 0) {
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ // TST (immediate) uses a LogicalImm format described by N:R:S values.
+ uint64_t imm_mask = Support::lsb_mask<uint64_t>(op_size);
+ uint64_t imm_value = o1.as<Imm>().value_as<uint64_t>();
+
+ // Logical instructions use 13-bit immediate pattern encoded as N:ImmS:ImmR.
+ LogicalImm logical_imm;
+ if (!Utils::encode_logical_imm(imm_value & imm_mask, op_size, Out(logical_imm)))
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(op_data.immediate_op) << 22);
+ opcode.add_logical_imm(logical_imm);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o0, 5);
+ opcode.add_reg(Gp::kIdZr, 0);
+ goto EmitOp;
+ }
+
+ opcode.reset(uint32_t(op_data.shifted_op) << 21);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, 16);
+ opcode.add_reg(o0, 5);
+ opcode.add_reg(Gp::kIdZr, 0);
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint32_t shift_type = o2.as<Imm>().predicate();
+ uint64_t op_shift = o2.as<Imm>().value_as<uint64_t>();
+
+ if (shift_type > 0x3 || op_shift >= op_size)
+ goto InvalidImmediate;
+
+ opcode.add_imm(shift_type, 22);
+ opcode.add_imm(op_shift, 10);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Bit Manipulation]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseBfc: {
+ const InstDB::EncodingData::BaseBfc& op_data = InstDB::EncodingData::baseBfc[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o1.as<Imm>().value_as<uint64_t>();
+ uint64_t width = o2.as<Imm>().value_as<uint64_t>();
+ uint32_t op_size = x ? 64 : 32;
+
+ if (lsb >= op_size || width == 0 || width > op_size)
+ goto InvalidImmediate;
+
+ uint32_t lsb32 = Support::neg(uint32_t(lsb)) & (op_size - 1);
+ uint32_t width32 = uint32_t(width) - 1;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_imm(lsb32, 16);
+ opcode.add_imm(width32, 10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBfi: {
+ const InstDB::EncodingData::BaseBfi& op_data = InstDB::EncodingData::baseBfi[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o2.as<Imm>().value_as<uint64_t>();
+ uint64_t width = o3.as<Imm>().value_as<uint64_t>();
+ uint32_t op_size = x ? 64 : 32;
+
+ if (lsb >= op_size || width == 0 || width > op_size)
+ goto InvalidImmediate;
+
+ uint32_t imm_l = Support::neg(uint32_t(lsb)) & (op_size - 1);
+ uint32_t imm_w = uint32_t(width) - 1;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_imm(imm_l, 16);
+ opcode.add_imm(imm_w, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBfm: {
+ const InstDB::EncodingData::BaseBfm& op_data = InstDB::EncodingData::baseBfm[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1))
+ goto InvalidPhysId;
+
+ uint64_t imm_r = o2.as<Imm>().value_as<uint64_t>();
+ uint64_t imm_s = o3.as<Imm>().value_as<uint64_t>();
+ uint32_t op_size = x ? 64 : 32;
+
+ if ((imm_r | imm_s) >= op_size)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_imm(imm_r, 16);
+ opcode.add_imm(imm_s, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBfx: {
+ const InstDB::EncodingData::BaseBfx& op_data = InstDB::EncodingData::baseBfx[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o2.as<Imm>().value_as<uint64_t>();
+ uint64_t width = o3.as<Imm>().value_as<uint64_t>();
+ uint32_t op_size = x ? 64 : 32;
+
+ if (lsb >= op_size || width == 0 || width > op_size)
+ goto InvalidImmediate;
+
+ uint32_t lsb32 = uint32_t(lsb);
+ uint32_t width32 = lsb32 + uint32_t(width) - 1u;
+
+ if (width32 >= op_size)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_imm(lsb32, 16);
+ opcode.add_imm(width32, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseExtend: {
+ const InstDB::EncodingData::BaseExtend& op_data = InstDB::EncodingData::baseExtend[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!o1.as<Reg>().is_gp32())
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseExtract: {
+ const InstDB::EncodingData::BaseExtract& op_data = InstDB::EncodingData::baseExtract[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, o2))
+ goto InvalidPhysId;
+
+ uint64_t lsb = o3.as<Imm>().value_as<uint64_t>();
+ uint32_t op_size = x ? 64 : 32;
+
+ if (lsb >= op_size)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_reg(o2, 16);
+ opcode.add_imm(lsb, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRev: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.reset(0b01011010110000000000100000000000);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseShift: {
+ const InstDB::EncodingData::BaseShift& op_data = InstDB::EncodingData::baseShift[encoding_index];
+
+ uint32_t x;
+ if (!check_gp_type(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!check_signature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.register_op());
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && op_data.immediate_op()) {
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint64_t imm_r = o2.as<Imm>().value_as<uint64_t>();
+ uint32_t op_size = x ? 64 : 32;
+
+ if (imm_r >= op_size)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.immediate_op());
+ opcode.add_imm(x, 31);
+ opcode.add_imm(x, 22);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+
+ if (opcode.get() & B(10)) {
+ // ASR and LSR (immediate) has the same logic.
+ opcode.add_imm(x, 15);
+ opcode.add_imm(imm_r, 16);
+ goto EmitOp;
+ }
+
+ if (op_data.ror == 0) {
+ // LSL (immediate) is an alias to UBFM
+ uint32_t ubfm_imm_r = Support::neg(uint32_t(imm_r)) & (op_size - 1);
+ uint32_t ubfm_imm_s = op_size - 1 - uint32_t(imm_r);
+
+ opcode.add_imm(ubfm_imm_r, 16);
+ opcode.add_imm(ubfm_imm_s, 10);
+ goto EmitOp;
+ }
+ else {
+ // ROR (immediate) is an alias to EXTR.
+ opcode.add_imm(imm_r, 10);
+ opcode.add_reg(o1, 16);
+ goto EmitOp;
+ }
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Conditionals]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseCCmp: {
+ const InstDB::EncodingData::BaseCCmp& op_data = InstDB::EncodingData::baseCCmp[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm) || isign4 == ENC_OPS4(Reg, Imm, Imm, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ uint64_t nzcv = o2.as<Imm>().value_as<uint64_t>();
+ uint64_t cond = o3.as<Imm>().value_as<uint64_t>();
+
+ if ((nzcv | cond) > 0xFu)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(cond)), 12);
+ opcode.add_imm(nzcv, 0);
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ // CCMN|CCMP (register) form.
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o1, 16);
+ opcode.add_reg(o0, 5);
+ goto EmitOp;
+ }
+ else {
+ // CCMN|CCMP (immediate) form.
+ uint64_t imm5 = o1.as<Imm>().value_as<uint64_t>();
+ if (imm5 > 0x1F)
+ goto InvalidImmediate;
+
+ opcode.add_imm(1, 11);
+ opcode.add_imm(imm5, 16);
+ opcode.add_reg(o0, 5);
+ goto EmitOp;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCInc: {
+ const InstDB::EncodingData::BaseCInc& op_data = InstDB::EncodingData::baseCInc[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, o1, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ uint64_t cond = o2.as<Imm>().value_as<uint64_t>();
+ if (cond - 2u > 0xEu)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o1, 16);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(cond)) ^ 1u, 12);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCSel: {
+ const InstDB::EncodingData::BaseCSel& op_data = InstDB::EncodingData::baseCSel[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, o1, o2, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ uint64_t cond = o3.as<Imm>().value_as<uint64_t>();
+ if (cond > 0xFu)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(cond)), 12);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseCSet: {
+ const InstDB::EncodingData::BaseCSet& op_data = InstDB::EncodingData::baseCSet[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ uint64_t cond = o1.as<Imm>().value_as<uint64_t>();
+ if (cond - 2u >= 0xEu)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(cond)) ^ 1u, 12);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Min/Max]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseMinMax: {
+ const InstDB::EncodingData::BaseMinMax& op_data = InstDB::EncodingData::baseMinMax[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.register_op);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o2, 16);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, InstDB::kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ uint64_t imm = o2.as<Imm>().value_as<uint64_t>();
+
+ if (op_data.immediate_op & (1u << 18)) {
+ // Zero extend imm.
+ if (!Support::is_uint_n<8>(imm)) {
+ goto InvalidImmediate;
+ }
+ }
+ else {
+ // Sign extend imm.
+ if (!Support::is_int_n<8>(int64_t(imm))) {
+ goto InvalidImmediate;
+ }
+ }
+
+ opcode.reset(op_data.immediate_op);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(uint32_t(imm & 0xFFu), 10);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Special]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseAtDcIcTlbi: {
+ const InstDB::EncodingData::BaseAtDcIcTlbi& op_data = InstDB::EncodingData::baseAtDcIcTlbi[encoding_index];
+
+ if (isign4 == ENC_OPS1(Imm) || isign4 == ENC_OPS2(Imm, Reg)) {
+ if (op_data.mandatory_reg && isign4 != ENC_OPS2(Imm, Reg))
+ goto InvalidInstruction;
+
+ if (o0.as<Imm>().value_as<uint64_t>() > 0x7FFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o0.as<Imm>().value_as<uint32_t>();
+ if ((imm & op_data.imm_verify_mask) != op_data.imm_verify_data)
+ goto InvalidImmediate;
+
+ uint32_t rt = 31;
+ if (o1.is_reg()) {
+ if (!o1.as<Reg>().is_gp64())
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o1, kZR))
+ goto InvalidPhysId;
+
+ rt = o1.id() & 31;
+ }
+
+ opcode.reset(0b11010101000010000000000000000000);
+ opcode.add_imm(imm, 5);
+ opcode.add_reg(rt, 0);
+ goto EmitOp;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingBaseMrs: {
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (!o0.as<Reg>().is_gp64())
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ if (o1.as<Imm>().value_as<uint64_t>() > 0xFFFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o1.as<Imm>().value_as<uint32_t>();
+ if (!(imm & B(15)))
+ goto InvalidImmediate;
+
+ opcode.reset(0b11010101001100000000000000000000);
+ opcode.add_imm(imm, 5);
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseMsr: {
+ if (isign4 == ENC_OPS2(Imm, Reg)) {
+ if (!o1.as<Reg>().is_gp64())
+ goto InvalidInstruction;
+
+ if (o0.as<Imm>().value_as<uint64_t>() > 0xFFFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o0.as<Imm>().value_as<uint32_t>();
+ if (!(imm & B(15)))
+ goto InvalidImmediate;
+
+ if (!check_gp_id(o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(0b11010101000100000000000000000000);
+ opcode.add_imm(imm, 5);
+ opcode.add_reg(o1, 0);
+ goto EmitOp;
+ }
+
+ if (isign4 == ENC_OPS2(Imm, Imm)) {
+ if (o0.as<Imm>().value_as<uint64_t>() > 0x1Fu)
+ goto InvalidImmediate;
+
+ if (o1.as<Imm>().value_as<uint64_t>() > 0xFu)
+ goto InvalidImmediate;
+
+ uint32_t op = o0.as<Imm>().value_as<uint32_t>();
+ uint32_t crm = o1.as<Imm>().value_as<uint32_t>();
+
+ uint32_t op1 = uint32_t(op) >> 3;
+ uint32_t op2 = uint32_t(op) & 0x7u;
+
+ opcode.reset(0b11010101000000000100000000011111);
+ opcode.add_imm(op1, 16);
+ opcode.add_imm(crm, 8);
+ opcode.add_imm(op2, 5);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseSys: {
+ if (isign4 == ENC_OPS4(Imm, Imm, Imm, Imm)) {
+ if (o0.as<Imm>().value_as<uint64_t>() > 0x7u ||
+ o1.as<Imm>().value_as<uint64_t>() > 0xFu ||
+ o2.as<Imm>().value_as<uint64_t>() > 0xFu ||
+ o3.as<Imm>().value_as<uint64_t>() > 0x7u)
+ goto InvalidImmediate;
+
+ uint32_t op1 = o0.as<Imm>().value_as<uint32_t>();
+ uint32_t crn = o1.as<Imm>().value_as<uint32_t>();
+ uint32_t crm = o2.as<Imm>().value_as<uint32_t>();
+ uint32_t op2 = o3.as<Imm>().value_as<uint32_t>();
+ uint32_t rt = 31;
+
+ const Operand_& o4 = op_ext[EmitterUtils::kOp4];
+ if (o4.is_reg()) {
+ if (!o4.as<Reg>().is_gp64())
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o4, kZR))
+ goto InvalidPhysId;
+
+ rt = o4.id() & 31;
+ }
+ else if (!o4.is_none()) {
+ goto InvalidInstruction;
+ }
+
+ opcode.reset(0b11010101000010000000000000000000);
+ opcode.add_imm(op1, 16);
+ opcode.add_imm(crn, 12);
+ opcode.add_imm(crm, 8);
+ opcode.add_imm(op2, 5);
+ opcode.add_imm(rt, 0);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Branch]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseBranchReg: {
+ const InstDB::EncodingData::BaseBranchReg& op_data = InstDB::EncodingData::baseBranchReg[encoding_index];
+
+ if (isign4 == ENC_OPS1(Reg)) {
+ if (!o0.as<Reg>().is_gp64())
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_reg(o0, 5);
+ goto EmitOp;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBranchRel: {
+ const InstDB::EncodingData::BaseBranchRel& op_data = InstDB::EncodingData::baseBranchRel[encoding_index];
+
+ if (isign4 == ENC_OPS1(Label) || isign4 == ENC_OPS1(Imm)) {
+ opcode.reset(op_data.opcode);
+ rm_rel = &o0;
+
+ // A variation that uses Cond code (or where Cond code is forced like BC.<cond>).
+ if (inst_cc != CondCode::kAL || Support::bit_test(opcode.v, 30)) {
+ if (opcode.has_x()) {
+ // Condition code cannot be applied when the instruction has X bit set (this would be BL instruction).
+ goto InvalidInstruction;
+ }
+
+ opcode |= B(30);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(inst_cc)), 0);
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 0, 26, 2);
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBranchCmp: {
+ const InstDB::EncodingData::BaseBranchCmp& op_data = InstDB::EncodingData::baseBranchCmp[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Label) || isign4 == ENC_OPS2(Reg, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode);
+ opcode.add_imm(x, 31);
+ opcode.add_reg(o0, 0);
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 5, 19, 2);
+
+ rm_rel = &o1;
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseBranchTst: {
+ const InstDB::EncodingData::BaseBranchTst& op_data = InstDB::EncodingData::baseBranchTst[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Imm, Label) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ uint32_t x;
+ if (!check_gp_type(o0, kWX, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ uint64_t imm = o1.as<Imm>().value_as<uint64_t>();
+
+ opcode.reset(op_data.opcode);
+ if (imm >= 32) {
+ if (!x)
+ goto InvalidImmediate;
+ opcode.add_imm(x, 31);
+ imm &= 0x1F;
+ }
+
+ opcode.add_reg(o0, 0);
+ opcode.add_imm(imm, 19);
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 5, 14, 2);
+
+ rm_rel = &o2;
+ goto EmitOp_Rel;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Prefetch]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBasePrfm: {
+ const InstDB::EncodingData::BasePrfm& op_data = InstDB::EncodingData::basePrfm[encoding_index];
+
+ if (isign4 == ENC_OPS2(Imm, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t imm_shift = 3u;
+
+ if (o0.as<Imm>().value_as<uint64_t>() > 0x1Fu)
+ goto InvalidImmediate;
+
+ if (!check_mem_base_index_rel(m))
+ goto InvalidAddress;
+
+ int64_t offset = m.offset();
+ uint32_t prfop = o0.as<Imm>().value_as<uint32_t>();
+
+ if (m.has_base_reg()) {
+ // [Base {Offset | Index}]
+ if (m.has_index()) {
+ uint32_t opt = shift_op_to_ld_st_opt_map[size_t(m.shift_op())];
+ if (opt == 0xFF)
+ goto InvalidAddress;
+
+ uint32_t shift = m.shift();
+ uint32_t s = shift != 0;
+
+ if (s && shift != imm_shift)
+ goto InvalidAddressScale;
+
+ opcode.reset(uint32_t(op_data.register_op) << 21);
+ opcode.add_imm(opt, 13);
+ opcode.add_imm(s, 12);
+ opcode |= B(11);
+ opcode.add_imm(prfop, 0);
+ goto EmitOp_MemBaseIndex_Rn5_Rm16;
+ }
+
+ if (!Support::is_int_n<32>(offset))
+ goto InvalidDisplacement;
+
+ int32_t offset32 = int32_t(offset);
+
+ if (m.is_pre_or_post())
+ goto InvalidAddress;
+
+ uint32_t imm12 = uint32_t(offset32) >> imm_shift;
+
+ if (Support::is_uint_n<12>(imm12) && (imm12 << imm_shift) == uint32_t(offset32)) {
+ opcode.reset(uint32_t(op_data.s_offset_op) << 22);
+ opcode.add_imm(imm12, 10);
+ opcode.add_imm(prfop, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ if (Support::is_int_n<9>(offset32)) {
+ opcode.reset(uint32_t(op_data.u_offset_op) << 21);
+ opcode.add_imm(uint32_t(offset32) & 0x1FFu, 12);
+ opcode.add_imm(prfop, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+ else {
+ opcode.reset(uint32_t(op_data.literal_op) << 24);
+ opcode.add_imm(prfop, 0);
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Base - Load / Store]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingBaseLdSt: {
+ const InstDB::EncodingData::BaseLdSt& op_data = InstDB::EncodingData::baseLdSt[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ // Instructions that work with either word or dword have the unsigned
+ // offset shift set to 2 (word), so we set it to 3 (dword) if this is
+ // X version of the instruction.
+ uint32_t x_shift_mask = uint32_t(op_data.u_offset_shift == 2);
+ uint32_t imm_shift = uint32_t(op_data.u_offset_shift) + (x & x_shift_mask);
+
+ if (!check_mem_base_index_rel(m))
+ goto InvalidAddress;
+
+ int64_t offset = m.offset();
+ if (m.has_base_reg()) {
+ // [Base {Offset | Index}]
+ if (m.has_index()) {
+ uint32_t opt = shift_op_to_ld_st_opt_map[size_t(m.shift_op())];
+ if (opt == 0xFF)
+ goto InvalidAddress;
+
+ uint32_t shift = m.shift();
+ uint32_t s = shift != 0;
+
+ if (s && shift != imm_shift)
+ goto InvalidAddressScale;
+
+ opcode.reset(uint32_t(op_data.register_op) << 21);
+ opcode.xor_imm(x, op_data.x_offset);
+ opcode.add_imm(opt, 13);
+ opcode.add_imm(s, 12);
+ opcode |= B(11);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBaseIndex_Rn5_Rm16;
+ }
+
+ // Makes it easier to work with the offset especially on 32-bit arch.
+ if (!Support::is_int_n<32>(offset))
+ goto InvalidDisplacement;
+ int32_t offset32 = int32_t(offset);
+
+ if (m.is_pre_or_post()) {
+ if (!Support::is_int_n<9>(offset32))
+ goto InvalidDisplacement;
+
+ opcode.reset(uint32_t(op_data.pre_post_op) << 21);
+ opcode.xor_imm(x, op_data.x_offset);
+ opcode.add_imm(offset32 & 0x1FF, 12);
+ opcode.add_imm(m.is_pre_index(), 11);
+ opcode |= B(10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ else {
+ uint32_t imm12 = uint32_t(offset32) >> imm_shift;
+
+ // Alternative form of LDUR/STUR and related instructions as described by AArch64 reference manual:
+ //
+ // If this instruction is not encodable with scaled unsigned offset, try unscaled signed offset.
+ if (!Support::is_uint_n<12>(imm12) || (imm12 << imm_shift) != uint32_t(offset32)) {
+ inst_id = op_data.u_alt_inst_id;
+ inst_info = &InstDB::_inst_info_table[inst_id];
+ encoding_index = inst_info->_encoding_data_index;
+ goto Case_BaseLdurStur;
+ }
+
+ opcode.reset(uint32_t(op_data.u_offset_op) << 22);
+ opcode.xor_imm(x, op_data.x_offset);
+ opcode.add_imm(imm12, 10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ }
+ else {
+ if (!op_data.literal_op)
+ goto InvalidAddress;
+
+ opcode.reset(uint32_t(op_data.literal_op) << 24);
+ opcode.xor_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 0);
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseLdpStp: {
+ const InstDB::EncodingData::BaseLdpStp& op_data = InstDB::EncodingData::baseLdpStp[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t x;
+ if (!check_gp_type(o0, o1, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ if (m.base_type() != RegType::kGp64 || m.has_index())
+ goto InvalidAddress;
+
+ if (m.is_offset_64bit())
+ goto InvalidDisplacement;
+
+ uint32_t offset_shift = op_data.offset_shift + x;
+ int32_t offset32 = m.offset_lo32() >> offset_shift;
+
+ // Make sure we didn't lose bits by applying the mandatory offset shift.
+ if (uint32_t(offset32) << offset_shift != uint32_t(m.offset_lo32()))
+ goto InvalidDisplacement;
+
+ // Offset is encoded as 7-bit immediate.
+ if (!Support::is_int_n<7>(offset32))
+ goto InvalidDisplacement;
+
+ if (m.is_pre_or_post() && offset32 != 0) {
+ if (!op_data.pre_post_op)
+ goto InvalidAddress;
+
+ opcode.reset(uint32_t(op_data.pre_post_op) << 22);
+ opcode.add_imm(m.is_pre_index(), 24);
+ }
+ else {
+ opcode.reset(uint32_t(op_data.offset_op) << 22);
+ }
+
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_imm(offset32 & 0x7F, 15);
+ opcode.add_reg(o1, 10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseStx: {
+ const InstDB::EncodingData::BaseStx& op_data = InstDB::EncodingData::baseStx[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ uint32_t x;
+
+ if (!o0.as<Reg>().is_gp32() || !check_gp_type(o1, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 16);
+ opcode.add_reg(o1, 0);
+
+ rm_rel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseLdxp: {
+ const InstDB::EncodingData::BaseLdxp& op_data = InstDB::EncodingData::baseLdxp[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ uint32_t x;
+
+ if (!check_gp_type(o0, op_data.reg_type, &x) || !check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o1, 10);
+ opcode.add_reg(o0, 0);
+
+ rm_rel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseStxp: {
+ const InstDB::EncodingData::BaseStxp& op_data = InstDB::EncodingData::baseStxp[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
+ const Mem& m = o3.as<Mem>();
+ uint32_t x;
+
+ if (!o0.as<Reg>().is_gp32() || !check_gp_type(o1, op_data.reg_type, &x) || !check_signature(o1, o2))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, o2, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 16);
+ opcode.add_reg(o2, 10);
+ opcode.add_reg(o1, 0);
+
+ rm_rel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRM_NoImm: {
+ const InstDB::EncodingData::BaseRM_NoImm& op_data = InstDB::EncodingData::baseRM_NoImm[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.reg_hi_id))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRM_SImm9: {
+Case_BaseLdurStur:
+ const InstDB::EncodingData::BaseRM_SImm9& op_data = InstDB::EncodingData::baseRM_SImm9[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.reg_hi_id))
+ goto InvalidPhysId;
+
+ if (m.has_base_reg() && !m.has_index()) {
+ if (m.is_offset_64bit())
+ goto InvalidDisplacement;
+
+ int32_t offset32 = m.offset_lo32() >> op_data.imm_shift;
+ if (Support::shl(offset32, op_data.imm_shift) != m.offset_lo32())
+ goto InvalidDisplacement;
+
+ if (!Support::is_int_n<9>(offset32))
+ goto InvalidDisplacement;
+
+ if (m.is_fixed_offset()) {
+ opcode.reset(op_data.offset_op());
+ }
+ else {
+ if (!op_data.pre_post_op())
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.pre_post_op());
+ opcode.xor_imm(m.is_pre_index(), 11);
+ }
+
+ opcode.xor_imm(x, op_data.x_offset);
+ opcode.add_imm(offset32 & 0x1FF, 12);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseRM_SImm10: {
+ const InstDB::EncodingData::BaseRM_SImm10& op_data = InstDB::EncodingData::baseRM_SImm10[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t x;
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, op_data.reg_hi_id))
+ goto InvalidPhysId;
+
+ if (m.has_base_reg() && !m.has_index()) {
+ if (m.is_offset_64bit())
+ goto InvalidDisplacement;
+
+ int32_t offset32 = m.offset_lo32() >> op_data.imm_shift;
+ if (Support::shl(offset32, op_data.imm_shift) != m.offset_lo32())
+ goto InvalidDisplacement;
+
+ if (!Support::is_int_n<10>(offset32))
+ goto InvalidDisplacement;
+
+ if (m.is_post_index())
+ goto InvalidAddress;
+
+ // Offset has 10 bits, sign is stored in the 10th bit.
+ offset32 &= 0x3FF;
+
+ opcode.reset(op_data.opcode());
+ opcode.xor_imm(m.is_pre_index(), 11);
+ opcode.xor_imm(x, op_data.x_offset);
+ opcode.add_imm(offset32 >> 9, 22);
+ opcode.add_imm(offset32, 12);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseAtomicOp: {
+ const InstDB::EncodingData::BaseAtomicOp& op_data = InstDB::EncodingData::baseAtomicOp[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ uint32_t x;
+
+ if (!check_gp_type(o0, op_data.reg_type, &x) || !check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, o1, kZR))
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 16);
+ opcode.add_reg(o1, 0);
+
+ rm_rel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseAtomicSt: {
+ const InstDB::EncodingData::BaseAtomicSt& op_data = InstDB::EncodingData::baseAtomicSt[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ uint32_t x;
+
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_gp_id(o0, kZR))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 16);
+ opcode.add_reg(Gp::kIdZr, 0);
+
+ rm_rel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingBaseAtomicCasp: {
+ const InstDB::EncodingData::BaseAtomicCasp& op_data = InstDB::EncodingData::baseAtomicCasp[encoding_index];
+ const Operand_& o4 = op_ext[EmitterUtils::kOp4];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg) && o4.is_mem()) {
+ const Mem& m = o4.as<Mem>();
+ uint32_t x;
+
+ if (!check_gp_type(o0, op_data.reg_type, &x))
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1, o2, o3))
+ goto InvalidInstruction;
+
+ if (!check_even(o0, o2) || !check_gp_id(o0, o2, kZR))
+ goto InvalidPhysId;
+
+ if (!check_consecutive(o0, o1) || !check_consecutive(o2, o3))
+ goto InvalidPhysId;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(x, op_data.x_offset);
+ opcode.add_reg(o0, 16);
+ opcode.add_reg(o2, 0);
+
+ rm_rel = &m;
+ goto EmitOp_MemBaseNoImm_Rn5;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [FSimd - Instructions]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingFSimdSV: {
+ const InstDB::EncodingData::FSimdSV& op_data = InstDB::EncodingData::fSimdSV[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t q = diff(o1.as<Reg>().reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ // This operation is only defined for:
+ // hD, vS.{4|8}h (16-bit)
+ // sD, vS.4s (32-bit)
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ uint32_t element_sz = diff(o1.as<Vec>().element_type(), VecElementType::kH);
+
+ // Size greater than 1 means 64-bit elements, not supported.
+ if ((sz | element_sz) > 1 || sz != element_sz)
+ goto InvalidInstruction;
+
+ // Size 1 (32-bit float) requires at least 4 elements.
+ if (sz && !q)
+ goto InvalidInstruction;
+
+ // Bit flipping according to sz.
+ static const uint32_t sz_bits_table[] = { B(29), 0 };
+
+ opcode.reset(op_data.opcode << 10);
+ opcode ^= sz_bits_table[sz];
+ opcode.add_imm(q, 30);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVV: {
+ const InstDB::EncodingData::FSimdVV& op_data = InstDB::EncodingData::fSimdVV[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.scalar_op(), op_data.scalar_hf(), op_data.vector_op(), op_data.vector_hf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVVV: {
+ const InstDB::EncodingData::FSimdVVV& op_data = InstDB::EncodingData::fSimdVVV[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.scalar_op(), op_data.scalar_hf(), op_data.vector_op(), op_data.vector_hf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVVVe: {
+ const InstDB::EncodingData::FSimdVVVe& op_data = InstDB::EncodingData::fSimdVVVe[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!o2.as<Vec>().has_element_index()) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.scalar_op(), op_data.scalar_hf(), op_data.vector_op(), op_data.vector_hf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ uint32_t q = o1.as<Reg>().is_vec128();
+ uint32_t sz;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.element_scalar_op(), InstDB::kHF_D, op_data.element_vector_op(), InstDB::kHF_D, &opcode, &sz))
+ goto InvalidInstruction;
+
+ if (sz == 0 && o2.as<Reg>().id() > 15)
+ goto InvalidPhysId;
+
+ uint32_t element_index = o2.as<Vec>().element_index();
+ if (element_index > (7u >> sz))
+ goto InvalidElementIndex;
+
+ uint32_t hlm = element_index << sz;
+ opcode.add_imm(q, 30);
+ opcode.add_imm(hlm & 3u, 20);
+ opcode.add_imm(hlm >> 2, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdVVVV: {
+ const InstDB::EncodingData::FSimdVVVV& op_data = InstDB::EncodingData::fSimdVVVV[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ if (!match_signature(o0, o1, o2, o3, inst_flags))
+ goto InvalidInstruction;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.scalar_op(), op_data.scalar_hf(), op_data.vector_op(), op_data.vector_hf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16_Ra10;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcadd: {
+ const InstDB::EncodingData::SimdFcadd& op_data = InstDB::EncodingData::simdFcadd[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!check_signature(o0, o1, o2) || o0.as<Vec>().has_element_index())
+ goto InvalidInstruction;
+
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ uint32_t sz = diff(o0.as<Vec>().element_type(), VecElementType::kB);
+ if (sz == 0 || sz > 3)
+ goto InvalidInstruction;
+
+ // 0 <- 90deg.
+ // 1 <- 270deg.
+ uint32_t rot = 0;
+ if (o3.as<Imm>().value() == 270)
+ rot = 1;
+ else if (o3.as<Imm>().value() != 90)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(q, 30);
+ opcode.add_imm(sz, 22);
+ opcode.add_imm(rot, 12);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFccmpFccmpe: {
+ const InstDB::EncodingData::SimdFccmpFccmpe& op_data = InstDB::EncodingData::simdFccmpFccmpe[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1) || o0.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ uint64_t nzcv = o2.as<Imm>().value_as<uint64_t>();
+ uint64_t cond = o3.as<Imm>().value_as<uint64_t>();
+
+ if ((nzcv | cond) > 0xFu)
+ goto InvalidImmediate;
+
+ uint32_t type = (sz - 1) & 0x3u;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(type, 22);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(cond)), 12);
+ opcode.add_imm(nzcv, 0);
+
+ goto EmitOp_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcm: {
+ const InstDB::EncodingData::SimdFcm& op_data = InstDB::EncodingData::simdFcm[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) && op_data.has_register_op()) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.register_scalar_op(), op_data.register_scalar_hf(), op_data.register_vector_op(), op_data.register_vector_hf(), &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && op_data.has_zero_op()) {
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (o2.as<Imm>().value() != 0 || o2.as<Imm>().predicate() != 0)
+ goto InvalidImmediate;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.zero_scalar_op(), InstDB::kHF_B, op_data.zero_vector_op(), InstDB::kHF_B, &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcmla: {
+ const InstDB::EncodingData::SimdFcmla& op_data = InstDB::EncodingData::simdFcmla[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ uint32_t sz = diff(o0.as<Vec>().element_type(), VecElementType::kB);
+ if (sz == 0 || sz > 3)
+ goto InvalidInstruction;
+
+ uint32_t rot = 0;
+ switch (o3.as<Imm>().value()) {
+ case 0 : rot = 0; break;
+ case 90 : rot = 1; break;
+ case 180: rot = 2; break;
+ case 270: rot = 3; break;
+ default:
+ goto InvalidImmediate;
+ }
+
+ if (!o2.as<Vec>().has_element_index()) {
+ if (!check_signature(o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.regular_op());
+ opcode.add_imm(q, 30);
+ opcode.add_imm(sz, 22);
+ opcode.add_imm(rot, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (o0.as<Vec>().element_type() != o2.as<Vec>().element_type())
+ goto InvalidInstruction;
+
+ // Only allowed vectors are: 4H, 8H, and 4S.
+ if (!(sz == 1 || (q == 1 && sz == 2)))
+ goto InvalidInstruction;
+
+ // Element index ranges:
+ // 4H - ElementIndex[0..1] (index 2..3 is UNDEFINED).
+ // 8H - ElementIndex[0..3].
+ // 4S - ElementIndex[0..1].
+ uint32_t element_index = o2.as<Vec>().element_index();
+ uint32_t hl_field_shift = sz == 1 ? 0u : 1u;
+ uint32_t max_element_index = q == 1 && sz == 1 ? 3u : 1u;
+
+ if (element_index > max_element_index)
+ goto InvalidElementIndex;
+
+ uint32_t hl = element_index << hl_field_shift;
+
+ opcode.reset(op_data.element_op());
+ opcode.add_imm(q, 30);
+ opcode.add_imm(sz, 22);
+ opcode.add_imm(hl & 1u, 21); // L field.
+ opcode.add_imm(hl >> 1, 11); // H field.
+ opcode.add_imm(rot, 13);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcmpFcmpe: {
+ const InstDB::EncodingData::SimdFcmpFcmpe& op_data = InstDB::EncodingData::simdFcmpFcmpe[encoding_index];
+
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ uint32_t type = (sz - 1) & 0x3u;
+
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(type, 22);
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (o1.as<Imm>().value() != 0 || o1.as<Imm>().predicate() != 0)
+ goto InvalidInstruction;
+
+ opcode |= B(3);
+ goto EmitOp_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcsel: {
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ if (!check_signature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ uint32_t type = (sz - 1) & 0x3u;
+
+ if (sz > 2 || o0.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ uint64_t cond = o3.as<Imm>().value_as<uint64_t>();
+ if (cond > 0xFu)
+ goto InvalidImmediate;
+
+ opcode.reset(0b00011110001000000000110000000000);
+ opcode.add_imm(type, 22);
+ opcode.add_imm(cond_code_to_opcode_field(uint32_t(cond)), 12);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcvt: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ uint32_t dst_sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ uint32_t src_sz = diff(o1.as<Reg>().reg_type(), RegType::kVec16);
+
+ if ((dst_sz | src_sz) > 3)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().has_element_type() || o1.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ // Table that provides 'type' and 'opc' according to the dst/src combination.
+ static const uint8_t table[] = {
+ 0xFFu, // H <- H (Invalid).
+ 0x03u, // H <- S (type=00 opc=11).
+ 0x13u, // H <- D (type=01 opc=11).
+ 0xFFu, // H <- Q (Invalid).
+ 0x30u, // S <- H (type=11 opc=00).
+ 0xFFu, // S <- S (Invalid).
+ 0x10u, // S <- D (type=01 opc=00).
+ 0xFFu, // S <- Q (Invalid).
+ 0x31u, // D <- H (type=11 opc=01).
+ 0x01u, // D <- S (type=00 opc=01).
+ 0xFFu, // D <- D (Invalid).
+ 0xFFu, // D <- Q (Invalid).
+ 0xFFu, // Q <- H (Invalid).
+ 0xFFu, // Q <- S (Invalid).
+ 0xFFu, // Q <- D (Invalid).
+ 0xFFu // Q <- Q (Invalid).
+ };
+
+ uint32_t type_opc = table[(dst_sz << 2) | src_sz];
+ opcode.reset(0b0001111000100010010000 << 10);
+ opcode.add_imm(type_opc >> 4, 22);
+ opcode.add_imm(type_opc & 15, 15);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcvtLN: {
+ const InstDB::EncodingData::SimdFcvtLN& op_data = InstDB::EncodingData::simdFcvtLN[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // Scalar form - only FCVTXN.
+ if (o0.as<Vec>().is_vec32() && o1.as<Vec>().is_vec64()) {
+ if (!op_data.has_scalar())
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().has_element_type() || o1.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.scalar_op());
+ opcode |= B(22); // sz bit must be 1, the only supported combination of FCVTXN.
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ opcode.reset(op_data.vector_op());
+
+ const Vec& rl = (inst_flags & InstDB::kInstFlagLong) ? o0.as<Vec>() : o1.as<Vec>();
+ const Vec& rn = (inst_flags & InstDB::kInstFlagLong) ? o1.as<Vec>() : o0.as<Vec>();
+
+ uint32_t q = diff(rn.reg_type(), RegType::kVec64);
+ if (uint32_t(opcode.has_q()) != q)
+ goto InvalidInstruction;
+
+ if (rl.is_vec_s4() && rn.element_type() == VecElementType::kH && !op_data.is_cvtxn()) {
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (rl.is_vec_d2() && rn.element_type() == VecElementType::kS) {
+ opcode |= B(22);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFcvtSV: {
+ const InstDB::EncodingData::SimdFcvtSV& op_data = InstDB::EncodingData::simdFcvtSV[encoding_index];
+
+ // So we can support both IntToFloat and FloatToInt conversions.
+ const Operand_& op_gp = op_data.is_float_to_int() ? o0 : o1;
+ const Operand_& op_vec = op_data.is_float_to_int() ? o1 : o0;
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (op_gp.as<Reg>().is_gp() && op_vec.as<Reg>().is_vec()) {
+ uint32_t x = op_gp.as<Reg>().is_gp64();
+ uint32_t type = diff(op_vec.as<Reg>().reg_type(), RegType::kVec16);
+
+ if (type > 2u)
+ goto InvalidInstruction;
+
+ type = (type - 1u) & 0x3;
+ opcode.reset(op_data.general_op());
+ opcode.add_imm(type, 22);
+ opcode.add_imm(x, 31);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().is_vec() && o1.as<Reg>().is_vec()) {
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.scalar_int_op(), InstDB::kHF_B, op_data.vector_int_op(), InstDB::kHF_B, &opcode))
+ goto InvalidInstruction;
+
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && op_data.is_fixed_point()) {
+ if (o2.as<Imm>().value_as<uint64_t>() >= 64)
+ goto InvalidInstruction;
+
+ uint32_t scale = o2.as<Imm>().value_as<uint32_t>();
+ if (scale == 0)
+ goto InvalidInstruction;
+
+ if (op_gp.as<Reg>().is_gp() && op_vec.as<Reg>().is_vec()) {
+ uint32_t x = op_gp.as<Reg>().is_gp64();
+ uint32_t type = diff(op_vec.as<Reg>().reg_type(), RegType::kVec16);
+
+ uint32_t scale_limit = 32u << x;
+ if (scale > scale_limit)
+ goto InvalidInstruction;
+
+ type = (type - 1u) & 0x3;
+ opcode.reset(op_data.general_op() ^ B(21));
+ opcode.add_imm(type, 22);
+ opcode.add_imm(x, 31);
+ opcode.add_imm(64u - scale, 10);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().is_vec() && o1.as<Reg>().is_vec()) {
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ uint32_t sz;
+ if (!pick_fp_opcode(o0.as<Vec>(), op_data.scalar_fp_op(), InstDB::kHF_0, op_data.vector_fp_op(), InstDB::kHF_0, &opcode, &sz))
+ goto InvalidInstruction;
+
+ uint32_t scale_limit = 16u << sz;
+ if (scale > scale_limit)
+ goto InvalidInstruction;
+
+ uint32_t imm = Support::neg(scale) & Support::lsb_mask<uint32_t>(sz + 4 + 1);
+ opcode.add_imm(imm, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFmlal: {
+ const InstDB::EncodingData::SimdFmlal& op_data = InstDB::EncodingData::simdFmlal[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ uint32_t q_is_optional = op_data.optional_q();
+
+ if (q_is_optional) {
+ // This instruction works with either 64-bit or 128-bit registers,
+ // encoded by Q bit.
+ if (q > 1)
+ goto InvalidInstruction;
+ }
+ else {
+ // This instruction requires 128-bit vector registers.
+ if (q != 1)
+ goto InvalidInstruction;
+
+ // The instruction is ehtier B (bottom) or T (top), which is part of
+ // the opcode, which uses Q bit, so we have to clear it explicitly.
+ q = 0;
+ }
+
+ if (uint32_t(o0.as<Reg>().reg_type()) != uint32_t(o1.as<Reg>().reg_type()) + q_is_optional ||
+ uint32_t(o0.as<Vec>().element_type()) != op_data.ta ||
+ uint32_t(o1.as<Vec>().element_type()) != op_data.tb)
+ goto InvalidInstruction;
+
+ if (!o2.as<Vec>().has_element_index()) {
+ if (!check_signature(o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.vector_op());
+ opcode.add_imm(q, 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (uint32_t(o2.as<Vec>().element_type()) != op_data.tElement)
+ goto InvalidInstruction;
+
+ if (o2.as<Reg>().id() > 15)
+ goto InvalidPhysId;
+
+ uint32_t element_index = o2.as<Vec>().element_index();
+ if (element_index > 7u)
+ goto InvalidElementIndex;
+
+ opcode.reset(op_data.element_op());
+ opcode.add_imm(q, 30);
+ opcode.add_imm(element_index & 3u, 20);
+ opcode.add_imm(element_index >> 2, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdFmov: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // FMOV Gp <-> Vec opcode:
+ opcode.reset(0b00011110001001100000000000000000);
+
+ if (o0.as<Reg>().is_gp() && o1.as<Reg>().is_vec()) {
+ // FMOV Wd, Hn (sf=0 type=11 rmode=00 op=110)
+ // FMOV Xd, Hn (sf=1 type=11 rmode=00 op=110)
+ // FMOV Wd, Sn (sf=0 type=00 rmode=00 op=110)
+ // FMOV Xd, Dn (sf=1 type=11 rmode=00 op=110)
+ // FMOV Xd, Vn.d[1] (sf=1 type=10 rmode=01 op=110)
+ uint32_t x = o0.as<Reg>().is_gp64();
+ uint32_t sz = diff(o1.as<Reg>().reg_type(), RegType::kVec16);
+
+ uint32_t type = (sz - 1) & 0x3u;
+ uint32_t r_mode_op = 0b00110;
+
+ if (o1.as<Vec>().has_element_index()) {
+ // Special case.
+ if (!x || !o1.as<Vec>().is_vec_d2() || o1.as<Vec>().element_index() != 1)
+ goto InvalidInstruction;
+ type = 0b10;
+ r_mode_op = 0b01110;
+ }
+ else {
+ // Must be scalar.
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o1.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ if (o1.as<Vec>().is_vec32() && x)
+ goto InvalidInstruction;
+
+ if (o1.as<Vec>().is_vec64() && !x)
+ goto InvalidInstruction;
+ }
+
+ opcode.add_imm(x, 31);
+ opcode.add_imm(type, 22);
+ opcode.add_imm(r_mode_op, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().is_vec() && o1.as<Reg>().is_gp()) {
+ // FMOV Hd, Wn (sf=0 type=11 rmode=00 op=111)
+ // FMOV Hd, Xn (sf=1 type=11 rmode=00 op=111)
+ // FMOV Sd, Wn (sf=0 type=00 rmode=00 op=111)
+ // FMOV Dd, Xn (sf=1 type=11 rmode=00 op=111)
+ // FMOV Vd.d[1], Xn (sf=1 type=10 rmode=01 op=111)
+ uint32_t x = o1.as<Reg>().is_gp64();
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+
+ uint32_t type = (sz - 1) & 0x3u;
+ uint32_t r_mode_op = 0b00111;
+
+ if (o0.as<Vec>().has_element_index()) {
+ // Special case.
+ if (!x || !o0.as<Vec>().is_vec_d2() || o0.as<Vec>().element_index() != 1)
+ goto InvalidInstruction;
+ type = 0b10;
+ r_mode_op = 0b01111;
+ }
+ else {
+ // Must be scalar.
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().is_vec32() && x)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().is_vec64() && !x)
+ goto InvalidInstruction;
+ }
+
+ opcode.add_imm(x, 31);
+ opcode.add_imm(type, 22);
+ opcode.add_imm(r_mode_op, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (check_signature(o0, o1)) {
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ if (o0.as<Vec>().has_element_type())
+ goto InvalidInstruction;
+
+ uint32_t type = (sz - 1) & 0x3;
+ opcode.reset(0b00011110001000000100000000000000);
+ opcode.add_imm(type, 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm)) {
+ if (o0.as<Reg>().is_vec()) {
+ double fp_value;
+ if (o1.as<Imm>().is_double())
+ fp_value = o1.as<Imm>().value_as<double>();
+ else if (o1.as<Imm>().is_int32())
+ fp_value = o1.as<Imm>().value_as<int32_t>();
+ else
+ goto InvalidImmediate;
+
+ if (!Utils::is_fp64_imm8(fp_value))
+ goto InvalidImmediate;
+
+ uint32_t imm8 = Utils::encode_fp64_to_imm8(fp_value);
+ if (!o0.as<Vec>().has_element_type()) {
+ // FMOV (scalar, immediate).
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ uint32_t type = (sz - 1u) & 0x3u;
+
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ opcode.reset(0b00011110001000000001000000000000);
+ opcode.add_imm(type, 22);
+ opcode.add_imm(imm8, 13);
+ goto EmitOp_Rd0;
+ }
+ else {
+ uint32_t q = diff(o0.as<Vec>().reg_type(), RegType::kVec64);
+ uint32_t sz = diff(o0.as<Vec>().element_type(), VecElementType::kH);
+
+ if (q > 1 || sz > 2)
+ goto InvalidInstruction;
+
+ static const uint32_t sz_bits_table[3] = { B(11), 0, B(29) };
+ opcode.reset(0b00001111000000001111010000000000);
+ opcode ^= sz_bits_table[sz];
+ opcode.add_imm(q, 30);
+ opcode.add_imm(imm8 >> 5, 16);
+ opcode.add_imm(imm8 & 31, 5);
+ goto EmitOp_Rd0;
+ }
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingFSimdPair: {
+ const InstDB::EncodingData::FSimdPair& op_data = InstDB::EncodingData::fSimdPair[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // This operation is only defined for:
+ // hD, vS.2h (16-bit)
+ // sD, vS.2s (32-bit)
+ // dD, vS.2d (64-bit)
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec16);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ static const uint32_t szSignatures[3] = {
+ RegTraits<RegType::kVec32>::kSignature | (Vec::kSignatureElementH),
+ RegTraits<RegType::kVec64>::kSignature | (Vec::kSignatureElementS),
+ RegTraits<RegType::kVec128>::kSignature | (Vec::kSignatureElementD)
+ };
+
+ if (o1.signature() != szSignatures[sz])
+ goto InvalidInstruction;
+
+ static const uint32_t sz_bits_table[] = { B(29), 0, B(22) };
+ opcode.reset(op_data.scalar_op());
+ opcode ^= sz_bits_table[sz];
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!check_signature(o0, o1, o2))
+ goto InvalidInstruction;
+
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ uint32_t sz = diff(o0.as<Vec>().element_type(), VecElementType::kH);
+ if (sz > 2)
+ goto InvalidInstruction;
+
+ static const uint32_t sz_bits_table[3] = { B(22) | B(21) | B(15) | B(14), 0, B(22) };
+ opcode.reset(op_data.vector_op());
+ opcode ^= sz_bits_table[sz];
+ opcode.add_imm(q, 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [ISimd - Instructions]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingISimdSV: {
+ const InstDB::EncodingData::ISimdSV& op_data = InstDB::EncodingData::iSimdSV[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // The first destination operand is scalar, which matches element-type of source vectors.
+ uint32_t L = (inst_flags & InstDB::kInstFlagLong) != 0;
+ if (diff(o0.as<Vec>().reg_type(), RegType::kVec8) != diff(o1.as<Vec>().element_type(), VecElementType::kB) + L)
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o1.as<Reg>().reg_type(), o1.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(size_op.q(), 30);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVV: {
+ const InstDB::EncodingData::ISimdVV& op_data = InstDB::EncodingData::iSimdVV[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ const Operand_& sop = significant_simd_op(o0, o1, inst_flags);
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVx: {
+ const InstDB::EncodingData::ISimdVVx& op_data = InstDB::EncodingData::iSimdVVx[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (o0.signature() != op_data.op0_signature ||
+ o1.signature() != op_data.op1_signature)
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVV: {
+ const InstDB::EncodingData::ISimdVVV& op_data = InstDB::EncodingData::iSimdVVV[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ const Operand_& sop = significant_simd_op(o0, o1, inst_flags);
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVx: {
+ const InstDB::EncodingData::ISimdVVVx& op_data = InstDB::EncodingData::iSimdVVVx[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (o0.signature() != op_data.op0_signature ||
+ o1.signature() != op_data.op1_signature ||
+ o2.signature() != op_data.op2_signature)
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdWWV: {
+ // Special case for wide add/sub [s|b][add|sub][w]{2}.
+ const InstDB::EncodingData::ISimdWWV& op_data = InstDB::EncodingData::iSimdWWV[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o2.as<Reg>().reg_type(), o2.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1) || !o0.as<Reg>().is_vec128() || uint32_t(o0.as<Vec>().element_type()) != uint32_t(o2.as<Vec>().element_type()) + 1u)
+ goto InvalidInstruction;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVe: {
+ const InstDB::EncodingData::ISimdVVVe& op_data = InstDB::EncodingData::iSimdVVVe[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ const Operand_& sop = significant_simd_op(o0, o1, inst_flags);
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ if (!o2.as<Vec>().has_element_index()) {
+ SizeOp size_op = element_type_to_size_op(op_data.regular_vec_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (!check_signature(o1, o2))
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.regular_op) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ SizeOp size_op = element_type_to_size_op(op_data.element_vec_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ uint32_t element_index = o2.as<Vec>().element_index();
+ LMHImm lmh;
+
+ if (!encode_lmh(size_op.size(), element_index, Out(lmh)))
+ goto InvalidElementIndex;
+
+ if (o2.as<Reg>().id() > lmh.max_rm_id)
+ goto InvalidPhysId;
+
+ opcode.reset(uint32_t(op_data.element_op) << 10);
+ opcode.add_imm(size_op.q(), 30);
+ opcode.add_imm(size_op.size(), 22);
+ opcode.add_imm(lmh.lm, 20);
+ opcode.add_imm(lmh.h, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVI: {
+ const InstDB::EncodingData::ISimdVVVI& op_data = InstDB::EncodingData::iSimdVVVI[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ const Operand_& sop = significant_simd_op(o0, o1, inst_flags);
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ uint64_t imm_value = o3.as<Imm>().value_as<uint64_t>();
+ uint32_t imm_size = op_data.imm_size;
+
+ if (op_data.imm64_has_one_bit_less && !size_op.q())
+ imm_size--;
+
+ uint32_t immMax = 1u << imm_size;
+ if (imm_value >= immMax)
+ goto InvalidImmediate;
+
+ opcode.reset(op_data.opcode());
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ opcode.add_imm(imm_value, op_data.imm_shift);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVV: {
+ const InstDB::EncodingData::ISimdVVVV& op_data = InstDB::EncodingData::iSimdVVVV[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ const Operand_& sop = significant_simd_op(o0, o1, inst_flags);
+ if (!match_signature(o0, o1, o2, o3, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16_Ra10;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingISimdVVVVx: {
+ const InstDB::EncodingData::ISimdVVVVx& op_data = InstDB::EncodingData::iSimdVVVVx[encoding_index];
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ if (o0.signature() != op_data.op0_signature ||
+ o1.signature() != op_data.op1_signature ||
+ o2.signature() != op_data.op2_signature ||
+ o3.signature() != op_data.op3_signature)
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ goto EmitOp_Rd0_Rn5_Rm16_Ra10;
+ }
+
+ break;
+ }
+
+
+ case InstDB::kEncodingISimdPair: {
+ const InstDB::EncodingData::ISimdPair& op_data = InstDB::EncodingData::iSimdPair[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg) && op_data.opcode2) {
+ if (o0.as<Vec>().is_vec_d1() && o1.as<Vec>().is_vec_d2()) {
+ opcode.reset(uint32_t(op_data.opcode2) << 10);
+ opcode.add_imm(0x3, 22); // size.
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.op_type3, o0.as<Reg>().reg_type(), o0.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.opcode3) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdBicOrr: {
+ const InstDB::EncodingData::SimdBicOrr& op_data = InstDB::EncodingData::simdBicOrr[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(InstDB::kVO_V_B, o0.as<Reg>().reg_type(), o0.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.register_op) << 10);
+ opcode.add_imm(size_op.q(), 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS2(Reg, Imm) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ SizeOp size_op = element_type_to_size_op(InstDB::kVO_V_HS, o0.as<Reg>().reg_type(), o0.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (o1.as<Imm>().value_as<uint64_t>() > 0xFFFFFFFFu)
+ goto InvalidImmediate;
+
+ uint32_t imm = o1.as<Imm>().value_as<uint32_t>();
+ uint32_t shift = 0;
+ uint32_t max_shift = (8u << size_op.size()) - 8u;
+
+ if (o2.is_imm()) {
+ if (o2.as<Imm>().predicate() != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ if (imm > 0xFFu || o2.as<Imm>().value_as<uint64_t>() > max_shift)
+ goto InvalidImmediate;
+
+ shift = o2.as<Imm>().value_as<uint32_t>();
+ if ((shift & 0x7u) != 0u)
+ goto InvalidImmediate;
+ }
+ else if (imm) {
+ shift = Support::ctz(imm) & ~0x7u;
+ imm >>= shift;
+
+ if (imm > 0xFFu || shift > max_shift)
+ goto InvalidImmediate;
+ }
+
+ uint32_t cmode = 0x1u | ((shift / 8u) << 1);
+ if (size_op.size() == 1)
+ cmode |= B(3);
+
+ // The immediate value is split into ABC and DEFGH parts.
+ uint32_t abc = (imm >> 5) & 0x7u;
+ uint32_t defgh = imm & 0x1Fu;
+
+ opcode.reset(uint32_t(op_data.immediate_op) << 10);
+ opcode.add_imm(size_op.q(), 30);
+ opcode.add_imm(abc, 16);
+ opcode.add_imm(cmode, 12);
+ opcode.add_imm(defgh, 5);
+ goto EmitOp_Rd0;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdCmp: {
+ const InstDB::EncodingData::SimdCmp& op_data = InstDB::EncodingData::simdCmp[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) && op_data.register_op) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o0.as<Reg>().reg_type(), o0.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.register_op) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && op_data.zero_op) {
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ if (o2.as<Imm>().value() != 0)
+ goto InvalidImmediate;
+
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o0.as<Reg>().reg_type(), o0.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.zero_op) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdDot: {
+ const InstDB::EncodingData::SimdDot& op_data = InstDB::EncodingData::simdDot[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ uint32_t size = 2;
+
+ if (q > 1u)
+ goto InvalidInstruction;
+
+ if (!o2.as<Vec>().has_element_index()) {
+ if (!op_data.vector_op)
+ goto InvalidInstruction;
+
+ if (o0.as<Reg>().reg_type() != o1.as<Reg>().reg_type() || o1.as<Reg>().reg_type() != o2.as<Reg>().reg_type())
+ goto InvalidInstruction;
+
+ if (uint32_t(o0.as<Vec>().element_type()) != op_data.ta ||
+ uint32_t(o1.as<Vec>().element_type()) != op_data.tb ||
+ uint32_t(o2.as<Vec>().element_type()) != op_data.tb)
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.vector_op) << 10);
+ opcode.add_imm(q, 30);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ else {
+ if (!op_data.element_op)
+ goto InvalidInstruction;
+
+ if (o0.as<Reg>().reg_type() != o1.as<Reg>().reg_type() || !o2.as<Reg>().is_vec128())
+ goto InvalidInstruction;
+
+ if (uint32_t(o0.as<Vec>().element_type()) != op_data.ta ||
+ uint32_t(o1.as<Vec>().element_type()) != op_data.tb ||
+ uint32_t(o2.as<Vec>().element_type()) != op_data.tElement)
+ goto InvalidInstruction;
+
+ uint32_t element_index = o2.as<Vec>().element_index();
+ LMHImm lmh;
+
+ if (!encode_lmh(size, element_index, Out(lmh)))
+ goto InvalidElementIndex;
+
+ if (o2.as<Reg>().id() > lmh.max_rm_id)
+ goto InvalidPhysId;
+
+ opcode.reset(uint32_t(op_data.element_op) << 10);
+ opcode.add_imm(q, 30);
+ opcode.add_imm(lmh.lm, 20);
+ opcode.add_imm(lmh.h, 11);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdDup: SimdDup: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ // Truth table of valid encodings of `Q:1|ElementType:3`
+ uint32_t kValidEncodings = B(uint32_t(VecElementType::kB) + 0) |
+ B(uint32_t(VecElementType::kH) + 0) |
+ B(uint32_t(VecElementType::kS) + 0) |
+ B(uint32_t(VecElementType::kB) + 8) |
+ B(uint32_t(VecElementType::kH) + 8) |
+ B(uint32_t(VecElementType::kS) + 8) |
+ B(uint32_t(VecElementType::kD) + 8) ;
+
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+
+ if (o1.as<Reg>().is_gp()) {
+ // DUP - Vec (scalar|vector) <- GP register.
+ //
+ // NOTE: This is only scalar for `dup d, x` case, otherwise the value
+ // would be duplicated across all vector elements (1, 2, 4, 8, or 16).
+ uint32_t element_type = uint32_t(o0.as<Vec>().element_type());
+ if (q > 1 || !Support::bit_test(kValidEncodings, (q << 3) | element_type))
+ goto InvalidInstruction;
+
+ uint32_t lsb_index = element_type - 1u;
+ uint32_t imm5 = 1u << lsb_index;
+
+ opcode.reset(0b0000111000000000000011 << 10);
+ opcode.add_imm(q, 30);
+ opcode.add_imm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (!o1.as<Reg>().is_vec() || !o1.as<Vec>().has_element_index())
+ goto InvalidInstruction;
+
+ uint32_t dst_index = o1.as<Vec>().element_index();
+ if (!o0.as<Vec>().has_element_type()) {
+ // DUP - Vec (scalar) <- Vec[N].
+ uint32_t lsb_index = diff(o0.as<Reg>().reg_type(), RegType::kVec8);
+
+ if (lsb_index != diff(o1.as<Vec>().element_type(), VecElementType::kB) || lsb_index > 3)
+ goto InvalidInstruction;
+
+ uint32_t imm5 = ((dst_index << 1) | 1u) << lsb_index;
+ if (imm5 > 31)
+ goto InvalidElementIndex;
+
+ opcode.reset(0b0101111000000000000001 << 10);
+ opcode.add_imm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ else {
+ // DUP - Vec (all) <- Vec[N].
+ uint32_t element_type = uint32_t(o0.as<Vec>().element_type());
+ if (q > 1 || !Support::bit_test(kValidEncodings, (q << 3) | element_type))
+ goto InvalidInstruction;
+
+ uint32_t lsb_index = element_type - 1u;
+ uint32_t imm5 = ((dst_index << 1) | 1u) << lsb_index;
+
+ if (imm5 > 31)
+ goto InvalidElementIndex;
+
+ opcode.reset(0b0000111000000000000001 << 10);
+ opcode.add_imm(q, 30);
+ opcode.add_imm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdIns: SimdIns: {
+ if (isign4 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().is_vec128()) {
+ if (!o0.as<Vec>().has_element_index())
+ goto InvalidInstruction;
+
+ uint32_t element_type = uint32_t(o0.as<Vec>().element_type());
+ uint32_t dst_index = o0.as<Vec>().element_index();
+ uint32_t lsb_index = element_type - 1u;
+
+ uint32_t imm5 = ((dst_index << 1) | 1u) << lsb_index;
+ if (imm5 > 31)
+ goto InvalidElementIndex;
+
+ if (o1.as<Reg>().is_gp()) {
+ // INS - Vec[N] <- GP register.
+ opcode.reset(0b0100111000000000000111 << 10);
+ opcode.add_imm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+ else if (o1.as<Reg>().is_vec128() && o1.as<Vec>().has_element_index()) {
+ // INS - Vec[N] <- Vec[M].
+ if (o0.as<Vec>().element_type() != o1.as<Vec>().element_type())
+ goto InvalidInstruction;
+
+ uint32_t src_index = o1.as<Vec>().element_index();
+ if (o0.as<Reg>().reg_type() != o1.as<Reg>().reg_type())
+ goto InvalidInstruction;
+
+ uint32_t imm4 = src_index << lsb_index;
+ if (imm4 > 15)
+ goto InvalidElementIndex;
+
+ opcode.reset(0b0110111000000000000001 << 10);
+ opcode.add_imm(imm5, 16);
+ opcode.add_imm(imm4, 11);
+ goto EmitOp_Rd0_Rn5;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdMov: {
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ if (o0.as<Reg>().is_vec() && o1.as<Reg>().is_vec()) {
+ // INS v.x[index], v.x[index].
+ if (o0.as<Vec>().has_element_index() && o1.as<Vec>().has_element_index())
+ goto SimdIns;
+
+ // DUP {b|h|s|d}, v.{b|h|s|d}[index].
+ if (o1.as<Vec>().has_element_index())
+ goto SimdDup;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ // ORR Vd, Vn, Vm
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ opcode.reset(0b0000111010100000000111 << 10);
+ opcode.add_imm(q, 30);
+ opcode.add_reg(o1, 16); // Vn == Vm.
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (o0.as<Reg>().is_vec() && o1.as<Reg>().is_gp()) {
+ // INS v.x[index], Rn.
+ if (o0.as<Vec>().has_element_index())
+ goto SimdIns;
+
+ goto InvalidInstruction;
+ }
+
+ if (o0.as<Reg>().is_gp() && o1.as<Reg>().is_vec()) {
+ // UMOV Rd, V.{s|d}[index].
+ encoding_index = 1;
+ goto SimdUmov;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdMoviMvni: {
+ const InstDB::EncodingData::SimdMoviMvni& op_data = InstDB::EncodingData::simdMoviMvni[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Imm) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
+ SizeOp size_op = element_type_to_size_op(InstDB::kVO_V_Any, o0.as<Reg>().reg_type(), o0.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ uint64_t imm64 = o1.as<Imm>().value_as<uint64_t>();
+ uint32_t imm8 = 0;
+ uint32_t cmode = 0;
+ uint32_t inverted = op_data.inverted;
+ uint32_t op = 0;
+ uint32_t shift = 0;
+ uint32_t shift_op = uint32_t(ShiftOp::kLSL);
+
+ if (size_op.size() == 3u) {
+ // The second immediate should not be present, however, we accept
+ // an immediate value of zero as some user code may still pass it.
+ if (o2.is_imm() && o0.as<Imm>().value() != 0)
+ goto InvalidImmediate;
+
+ if (Utils::is_byte_mask_imm(imm64)) {
+ imm8 = Utils::encode_imm64_byte_mask_to_imm8(imm64);
+ }
+ else {
+ // Change from D to S and from 64-bit imm to 32-bit imm if this
+ // is not a byte-mask pattern.
+ if ((imm64 >> 32) == (imm64 & 0xFFFFFFFFu)) {
+ imm64 &= 0xFFFFFFFFu;
+ size_op.decrement_size();
+ }
+ else {
+ goto InvalidImmediate;
+ }
+ }
+ }
+
+ if (size_op.size() < 3u) {
+ if (imm64 > 0xFFFFFFFFu)
+ goto InvalidImmediate;
+ imm8 = uint32_t(imm64);
+
+ if (size_op.size() == 2) {
+ if ((imm8 >> 16) == (imm8 & 0xFFFFu)) {
+ imm8 >>= 16;
+ size_op.decrement_size();
+ }
+ }
+
+ if (size_op.size() == 1) {
+ if (imm8 > 0xFFFFu)
+ goto InvalidImmediate;
+
+ if ((imm8 >> 8) == (imm8 & 0xFFu)) {
+ imm8 >>= 8;
+ size_op.decrement_size();
+ }
+ }
+
+ uint32_t max_shift = (8u << size_op.size()) - 8u;
+ if (o2.is_imm()) {
+ if (imm8 > 0xFFu || o2.as<Imm>().value_as<uint64_t>() > max_shift)
+ goto InvalidImmediate;
+
+ shift = o2.as<Imm>().value_as<uint32_t>();
+ shift_op = o2.as<Imm>().predicate();
+ }
+ else if (imm8) {
+ shift = Support::ctz(imm8) & ~0x7u;
+ imm8 >>= shift;
+
+ if (imm8 > 0xFFu || shift > max_shift)
+ goto InvalidImmediate;
+ }
+
+ if ((shift & 0x7u) != 0u)
+ goto InvalidImmediate;
+ }
+
+ shift /= 8u;
+
+ switch (size_op.size()) {
+ case 0:
+ if (shift_op != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ if (inverted) {
+ imm8 = ~imm8 & 0xFFu;
+ }
+
+ cmode = B(3) | B(2) | B(1);
+ break;
+
+ case 1:
+ if (shift_op != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ cmode = B(3) | (shift << 1);
+ op = inverted;
+ break;
+
+ case 2:
+ if (shift_op == uint32_t(ShiftOp::kLSL)) {
+ cmode = shift << 1;
+ }
+ else if (shift_op == uint32_t(ShiftOp::kMSL)) {
+ if (shift == 0 || shift > 2)
+ goto InvalidImmediate;
+ cmode = B(3) | B(2) | (shift - 1u);
+ }
+ else {
+ goto InvalidImmediate;
+ }
+
+ op = inverted;
+ break;
+
+ case 3:
+ if (inverted) {
+ imm8 = ~imm8 & 0xFFu;
+ }
+
+ op = 1;
+ cmode = B(3) | B(2) | B(1);
+ break;
+ }
+
+ // The immediate value is split into ABC and DEFGH parts.
+ uint32_t abc = (imm8 >> 5) & 0x7u;
+ uint32_t defgh = imm8 & 0x1Fu;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(size_op.q(), 30);
+ opcode.add_imm(op, 29);
+ opcode.add_imm(abc, 16);
+ opcode.add_imm(cmode, 12);
+ opcode.add_imm(defgh, 5);
+ goto EmitOp_Rd0;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdShift: {
+ const InstDB::EncodingData::SimdShift& op_data = InstDB::EncodingData::simdShift[encoding_index];
+
+ const Operand_& sop = significant_simd_op(o0, o1, inst_flags);
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, sop.as<Reg>().reg_type(), sop.as<Vec>().element_type());
+
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm) && op_data.immediate_op) {
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ if (o2.as<Imm>().value_as<uint64_t>() > 63)
+ goto InvalidImmediate;
+
+ uint32_t lsb_shift = size_op.size() + 3u;
+ uint32_t lsb_mask = (1u << lsb_shift) - 1u;
+ uint32_t imm = o2.as<Imm>().value_as<uint32_t>();
+
+ // Some instructions use IMM and some X - IMM, so negate if required.
+ if (op_data.inverted_imm) {
+ if (imm == 0 || imm > (1u << lsb_shift))
+ goto InvalidImmediate;
+ imm = Support::neg(imm) & lsb_mask;
+ }
+
+ if (imm > lsb_mask)
+ goto InvalidImmediate;
+ imm |= (1u << lsb_shift);
+
+ opcode.reset(uint32_t(op_data.immediate_op) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(imm, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) && op_data.register_op) {
+ if (!match_signature(o0, o1, o2, inst_flags))
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.register_op) << 10);
+ opcode.add_imm(size_op.qs(), 30);
+ opcode.add_imm(size_op.scalar(), 28);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdShiftES: {
+ const InstDB::EncodingData::SimdShiftES& op_data = InstDB::EncodingData::simdShiftES[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o1.as<Reg>().reg_type(), o1.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ // The immediate value must match the element size.
+ uint64_t shift = o2.as<Imm>().value_as<uint64_t>();
+ uint32_t shift_op = o2.as<Imm>().predicate();
+
+ if (shift != (8u << size_op.size()) || shift_op != uint32_t(ShiftOp::kLSL))
+ goto InvalidImmediate;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(size_op.q(), 30);
+ opcode.add_imm(size_op.size(), 22);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdSm3tt: {
+ const InstDB::EncodingData::SimdSm3tt& op_data = InstDB::EncodingData::simdSm3tt[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (o0.as<Vec>().is_vec_s4() && o1.as<Vec>().is_vec_s4() && o2.as<Vec>().is_vec_s4() && o2.as<Vec>().has_element_index()) {
+ uint32_t imm2 = o2.as<Vec>().element_index();
+ if (imm2 > 3)
+ goto InvalidElementIndex;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(imm2, 12);
+ goto EmitOp_Rd0_Rn5_Rm16;
+ }
+ }
+
+ break;
+ }
+
+
+ case InstDB::kEncodingSimdSmovUmov: SimdUmov: {
+ const InstDB::EncodingData::SimdSmovUmov& op_data = InstDB::EncodingData::simdSmovUmov[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().is_gp() && o1.as<Reg>().is_vec()) {
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o1.as<Reg>().reg_type(), o1.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (!o1.as<Vec>().has_element_index())
+ goto InvalidInstruction;
+
+ uint32_t x = o0.as<Gp>().is_gp64();
+ uint32_t gp_must_be_x = uint32_t(size_op.size() >= 3u - op_data.is_signed);
+
+ if (op_data.is_signed) {
+ if (gp_must_be_x && !x)
+ goto InvalidInstruction;
+ }
+ else {
+ if (x != gp_must_be_x)
+ goto InvalidInstruction;
+ }
+
+ uint32_t element_index = o1.as<Vec>().element_index();
+ uint32_t max_element_index = 15u >> size_op.size();
+
+ if (element_index > max_element_index)
+ goto InvalidElementIndex;
+
+ uint32_t imm5 = (1u | (element_index << 1)) << size_op.size();
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(x, 30);
+ opcode.add_imm(imm5, 16);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdSxtlUxtl: {
+ const InstDB::EncodingData::SimdSxtlUxtl& op_data = InstDB::EncodingData::simdSxtlUxtl[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Reg)) {
+ SizeOp size_op = element_type_to_size_op(op_data.vec_op_type, o1.as<Reg>().reg_type(), o1.as<Vec>().element_type());
+ if (!size_op.is_valid())
+ goto InvalidInstruction;
+
+ if (!match_signature(o0, o1, inst_flags))
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(size_op.q(), 30);
+ opcode.add_imm(1u, size_op.size() + 19);
+ goto EmitOp_Rd0_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdTblTbx: {
+ const InstDB::EncodingData::SimdTblTbx& op_data = InstDB::EncodingData::simdTblTbx[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Reg) || isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B }, <Vm>.<Ta>
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B }, <Vm>.<Ta>
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B, <Vn+2>.16B }, <Vm>.<Ta>
+ // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B, <Vn+2>.16B, <Vn+3>.16B }, <Vm>.<Ta>
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+
+ const Operand_& o4 = op_ext[EmitterUtils::kOp4];
+ const Operand_& o5 = op_ext[EmitterUtils::kOp5];
+
+ uint32_t q = diff(o0.as<Reg>().reg_type(), RegType::kVec64);
+ if (q > 1 || o0.as<Vec>().has_element_index())
+ goto InvalidInstruction;
+
+ if (!o1.as<Vec>().is_vec_b16() || o1.as<Vec>().has_element_index())
+ goto InvalidInstruction;
+
+ uint32_t len = uint32_t(!o3.is_none()) + uint32_t(!o4.is_none()) + uint32_t(!o5.is_none());
+ opcode.add_imm(q, 30);
+ opcode.add_imm(len, 13);
+
+ switch (len) {
+ case 0:
+ if (!check_signature(o0, o2))
+ goto InvalidInstruction;
+
+ if (o2.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.add_reg(o2, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ case 1:
+ if (!check_signature(o0, o3))
+ goto InvalidInstruction;
+
+ if (o3.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.add_reg(o3, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ case 2:
+ if (!check_signature(o0, o4))
+ goto InvalidInstruction;
+
+ if (o4.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.add_reg(o4, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ case 3:
+ if (!check_signature(o0, o5))
+ goto InvalidInstruction;
+
+ if (o5.id() > 31)
+ goto InvalidPhysId;
+
+ opcode.add_reg(o5, 16);
+ goto EmitOp_Rd0_Rn5;
+
+ default:
+ // Should never happen.
+ goto InvalidInstruction;
+ }
+ }
+
+ break;
+ }
+
+ // ------------------------------------------------------------------------
+ // [Simd - Load / Store]
+ // ------------------------------------------------------------------------
+
+ case InstDB::kEncodingSimdLdSt: {
+ const InstDB::EncodingData::SimdLdSt& op_data = InstDB::EncodingData::simdLdSt[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ // Width | SZ | XY | XSZ
+ // -------+----------+-----------+-----
+ // 8-bit | size==00 | opc == 01 | 000
+ // 16-bit | size==01 | opc == 01 | 001
+ // 32-bit | size==10 | opc == 01 | 010
+ // 64-bit | size==11 | opc == 01 | 011
+ // 128-bit| size==00 | opc == 11 | 100
+ uint32_t xsz = diff(o0.as<Reg>().reg_type(), RegType::kVec8);
+ if (xsz > 4u || o0.as<Vec>().has_element_index())
+ goto InvalidRegType;
+
+ if (!check_vec_id(o0))
+ goto InvalidPhysId;
+
+ if (!check_mem_base_index_rel(m))
+ goto InvalidAddress;
+
+ int64_t offset = m.offset();
+ if (m.has_base_reg()) {
+ // [Base {Offset | Index}]
+ if (m.has_index()) {
+ uint32_t opt = shift_op_to_ld_st_opt_map[size_t(m.shift_op())];
+ if (opt == 0xFFu)
+ goto InvalidAddress;
+
+ uint32_t shift = m.shift();
+ uint32_t s = (shift != 0);
+
+ if (s && shift != xsz)
+ goto InvalidAddressScale;
+
+ opcode.reset(uint32_t(op_data.register_op) << 21);
+ opcode.add_imm(xsz & 3u, 30);
+ opcode.add_imm(xsz >> 2, 23);
+ opcode.add_imm(opt, 13);
+ opcode.add_imm(s, 12);
+ opcode |= B(11);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBaseIndex_Rn5_Rm16;
+ }
+
+ // Makes it easier to work with the offset especially on 32-bit arch.
+ if (!Support::is_int_n<32>(offset))
+ goto InvalidDisplacement;
+ int32_t offset32 = int32_t(offset);
+
+ if (m.is_pre_or_post()) {
+ if (!Support::is_int_n<9>(offset32))
+ goto InvalidDisplacement;
+
+ opcode.reset(uint32_t(op_data.pre_post_op) << 21);
+ opcode.add_imm(xsz & 3u, 30);
+ opcode.add_imm(xsz >> 2, 23);
+ opcode.add_imm(offset32 & 0x1FF, 12);
+ opcode.add_imm(m.is_pre_index(), 11);
+ opcode |= B(10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ else {
+ uint32_t imm12 = uint32_t(offset32) >> xsz;
+
+ // If this instruction is not encodable with scaled unsigned offset, try unscaled signed offset.
+ if (!Support::is_uint_n<12>(imm12) || (imm12 << xsz) != uint32_t(offset32)) {
+ inst_id = op_data.u_alt_inst_id;
+ inst_info = &InstDB::_inst_info_table[inst_id];
+ encoding_index = inst_info->_encoding_data_index;
+ goto Case_SimdLdurStur;
+ }
+
+ opcode.reset(uint32_t(op_data.u_offset_op) << 22);
+ opcode.add_imm(xsz & 3u, 30);
+ opcode.add_imm(xsz >> 2, 23);
+ opcode.add_imm(imm12, 10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+ }
+ else {
+ if (!op_data.literal_op)
+ goto InvalidAddress;
+
+ if (xsz < 2u)
+ goto InvalidRegType;
+
+ uint32_t opc = xsz - 2u;
+ opcode.reset(uint32_t(op_data.literal_op) << 24);
+ opcode.add_imm(opc, 30);
+ opcode.add_reg(o0, 0);
+ offset_format.reset_to_imm_value(OffsetType::kSignedOffset, 4, 5, 19, 2);
+ goto EmitOp_Rel;
+ }
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdLdpStp: {
+ const InstDB::EncodingData::SimdLdpStp& op_data = InstDB::EncodingData::simdLdpStp[encoding_index];
+
+ if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ const Mem& m = o2.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t opc = diff(o0.as<Reg>().reg_type(), RegType::kVec32);
+ if (opc > 2u || o0.as<Vec>().has_element_type_or_index())
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1))
+ goto InvalidInstruction;
+
+ if (!check_vec_id(o0, o1))
+ goto InvalidPhysId;
+
+ if (m.base_type() != RegType::kGp64 || m.has_index())
+ goto InvalidAddress;
+
+ if (m.is_offset_64bit())
+ goto InvalidDisplacement;
+
+ uint32_t offset_shift = 2u + opc;
+ int32_t offset32 = m.offset_lo32() >> offset_shift;
+
+ // Make sure we didn't lose bits by applying the mandatory offset shift.
+ if (Support::shl(offset32, offset_shift) != m.offset_lo32())
+ goto InvalidDisplacement;
+
+ // Offset is encoded as a 7-bit immediate.
+ if (!Support::is_int_n<7>(offset32))
+ goto InvalidDisplacement;
+
+ if (m.is_pre_or_post() && offset32 != 0) {
+ if (!op_data.pre_post_op)
+ goto InvalidAddress;
+
+ opcode.reset(uint32_t(op_data.pre_post_op) << 22);
+ opcode.add_imm(m.is_pre_index(), 24);
+ }
+ else {
+ opcode.reset(uint32_t(op_data.offset_op) << 22);
+ }
+
+ opcode.add_imm(opc, 30);
+ opcode.add_imm(offset32 & 0x7F, 15);
+ opcode.add_reg(o1, 10);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdLdurStur: {
+Case_SimdLdurStur:
+ const InstDB::EncodingData::SimdLdurStur& op_data = InstDB::EncodingData::simdLdurStur[encoding_index];
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ const Mem& m = o1.as<Mem>();
+ rm_rel = &m;
+
+ uint32_t sz = diff(o0.as<Reg>().reg_type(), RegType::kVec8);
+ if (sz > 4 || o0.as<Vec>().has_element_type_or_index())
+ goto InvalidInstruction;
+
+ if (!check_vec_id(o0))
+ goto InvalidPhysId;
+
+ if (!check_mem_base_index_rel(m))
+ goto InvalidAddress;
+
+ if (m.has_base_reg() && !m.has_index() && !m.is_pre_or_post()) {
+ if (m.is_offset_64bit())
+ goto InvalidDisplacement;
+
+ int32_t offset32 = m.offset_lo32();
+ if (!Support::is_int_n<9>(offset32))
+ goto InvalidDisplacement;
+
+ opcode.reset(uint32_t(op_data.opcode) << 10);
+ opcode.add_imm(sz & 3u, 30);
+ opcode.add_imm(sz >> 2, 23);
+ opcode.add_imm(offset32 & 0x1FF, 12);
+ opcode.add_reg(o0, 0);
+ goto EmitOp_MemBase_Rn5;
+ }
+
+ goto InvalidAddress;
+ }
+
+ break;
+ }
+
+ case InstDB::kEncodingSimdLdNStN: {
+ const InstDB::EncodingData::SimdLdNStN& op_data = InstDB::EncodingData::simdLdNStN[encoding_index];
+ const Operand_& o4 = op_ext[EmitterUtils::kOp4];
+
+ uint32_t n = 1;
+
+ if (isign4 == ENC_OPS2(Reg, Mem)) {
+ if (op_data.n != 1)
+ goto InvalidInstruction;
+
+ rm_rel = &o1;
+ }
+ else if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
+ if (op_data.n != 1 && op_data.n != 2)
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1) || !check_consecutive(o0, o1))
+ goto InvalidInstruction;
+
+ n = 2;
+ rm_rel = &o2;
+ }
+ else if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem) && o4.is_none()) {
+ if (op_data.n != 1 && op_data.n != 3)
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1, o2) || !check_consecutive(o0, o1, o2))
+ goto InvalidInstruction;
+
+ n = 3;
+ rm_rel = &o3;
+ }
+ else if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg) && o4.is_mem()) {
+ if (op_data.n != 1 && op_data.n != 4)
+ goto InvalidInstruction;
+
+ if (!check_signature(o0, o1, o2, o3) || !check_consecutive(o0, o1, o2, o3))
+ goto InvalidInstruction;
+
+ n = 4;
+ rm_rel = &o4;
+ }
+ else {
+ goto InvalidInstruction;
+ }
+
+ // We will use `v` and `m` from now as those are relevant for encoding.
+ const Vec& v = o0.as<Vec>();
+ const Mem& m = rm_rel->as<Mem>();
+
+ uint32_t q = 0;
+ uint32_t rm = 0;
+ uint32_t rn = m.base_id();
+ uint32_t sz = diff(v.element_type(), VecElementType::kB);
+ uint32_t opc_s_size = sz;
+ uint32_t offset_possibility = 0;
+
+ if (sz > 3)
+ goto InvalidInstruction;
+
+ if (m.base_type() != RegType::kGp64)
+ goto InvalidAddress;
+
+ // Rn cannot be ZR, but can be SP.
+ if (rn > 30 && rn != Gp::kIdSp)
+ goto InvalidAddress;
+
+ rn &= 31;
+
+ if (op_data.replicate) {
+ if (n != op_data.n)
+ goto InvalidInstruction;
+
+ // Replicates to the whole register, element index cannot be used.
+ if (v.has_element_index())
+ goto InvalidInstruction;
+
+ q = diff(v.reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ opcode.reset(uint32_t(op_data.single_op) << 10);
+ offset_possibility = (1u << sz) * n;
+ }
+ else if (v.has_element_index()) {
+ if (n != op_data.n)
+ goto InvalidInstruction;
+
+ // LDx/STx (single structure).
+ static const uint8_t opc_s_size_by_sz_table[] = { 0x0u << 3, 0x2u << 3, 0x4u << 3, (0x4u << 3) | 1u };
+
+ opcode.reset(uint32_t(op_data.single_op) << 10);
+ opc_s_size = opc_s_size_by_sz_table[sz];
+ offset_possibility = (1u << sz) * op_data.n;
+
+ uint32_t element_index = v.element_index();
+ uint32_t max_element_index = 15 >> sz;
+
+ if (element_index > max_element_index)
+ goto InvalidElementIndex;
+
+ element_index <<= sz;
+ q = element_index >> 3;
+ opc_s_size |= element_index & 0x7u;
+ }
+ else {
+ // LDx/STx (multiple structures).
+ static const uint8_t opc_s_size_by_n_table[] = { 0u, 0x7u << 2, 0xAu << 2, 0x6u << 2, 0x2u << 2 };
+
+ q = diff(v.reg_type(), RegType::kVec64);
+ if (q > 1)
+ goto InvalidInstruction;
+
+ if (op_data.n == 1)
+ opc_s_size |= opc_s_size_by_n_table[n];
+
+ opcode.reset(uint32_t(op_data.multiple_op) << 10);
+ offset_possibility = (8u << q) * n;
+ }
+
+ if (m.has_index()) {
+ if (m.has_offset() || !m.is_post_index())
+ goto InvalidAddress;
+
+ rm = m.index_id();
+ if (rm > 30)
+ goto InvalidAddress;
+
+ // Bit 23 - PostIndex.
+ opcode |= B(23);
+ }
+ else {
+ if (m.has_offset()) {
+ if (m.offset() != int32_t(offset_possibility) || !m.is_post_index())
+ goto InvalidAddress;
+ rm = 31;
+
+ // Bit 23 - PostIndex.
+ opcode |= B(23);
+ }
+ }
+
+ opcode.add_imm(q, 30);
+ opcode.add_imm(rm, 16);
+ opcode.add_imm(opc_s_size, 10);
+ opcode.add_imm(rn, 5);
+ goto EmitOp_Rd0;
+ }
+
+ default:
+ break;
+ }
+
+ goto InvalidInstruction;
+
+ // --------------------------------------------------------------------------
+ // [EmitGp - Single]
+ // --------------------------------------------------------------------------
+
+EmitOp_Rd0:
+ if (!check_valid_regs(o0))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o0, 0);
+ goto EmitOp;
+
+EmitOp_Rn5:
+ if (!check_valid_regs(o0))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o0, 5);
+ goto EmitOp;
+
+EmitOp_Rn5_Rm16:
+ if (!check_valid_regs(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o0, 5);
+ opcode.add_reg(o1, 16);
+ goto EmitOp;
+
+EmitOp_Rd0_Rn5:
+ if (!check_valid_regs(o0, o1))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o0, 0);
+ opcode.add_reg(o1, 5);
+ goto EmitOp;
+
+EmitOp_Rd0_Rn5_Rm16_Ra10:
+ if (!check_valid_regs(o0, o1, o2, o3))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o0, 0);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o2, 16);
+ opcode.add_reg(o3, 10);
+ goto EmitOp;
+
+EmitOp_Rd0_Rn5_Rm16:
+ if (!check_valid_regs(o0, o1, o3))
+ goto InvalidPhysId;
+
+ opcode.add_reg(o0, 0);
+ opcode.add_reg(o1, 5);
+ opcode.add_reg(o2, 16);
+ goto EmitOp;
+
+ // --------------------------------------------------------------------------
+ // [EmitGp - Multiple]
+ // --------------------------------------------------------------------------
+
+EmitOp_Multiple:
+ {
+ ASMJIT_ASSERT(multiple_op_count > 0);
+ err = writer.ensure_space(this, multiple_op_count * 4u);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+
+ for (uint32_t i = 0; i < multiple_op_count; i++) {
+ writer.emit32u_le(multiple_op_data[i]);
+ }
+
+ goto EmitDone;
+ }
+
+ // --------------------------------------------------------------------------
+ // [EmitGp - Memory]
+ // --------------------------------------------------------------------------
+
+EmitOp_MemBase_Rn5:
+ if (!check_mem_base(rm_rel->as<Mem>())) {
+ goto InvalidAddress;
+ }
+
+ opcode.add_reg(rm_rel->as<Mem>().base_id(), 5);
+ goto EmitOp;
+
+EmitOp_MemBaseNoImm_Rn5:
+ if (!check_mem_base(rm_rel->as<Mem>()) || rm_rel->as<Mem>().has_index()) {
+ goto InvalidAddress;
+ }
+
+ if (rm_rel->as<Mem>().has_offset()) {
+ goto InvalidDisplacement;
+ }
+
+ opcode.add_reg(rm_rel->as<Mem>().base_id(), 5);
+ goto EmitOp;
+
+EmitOp_MemBaseIndex_Rn5_Rm16:
+ if (!rm_rel->as<Mem>().has_base_reg()) {
+ goto InvalidAddress;
+ }
+
+ if (rm_rel->as<Mem>().index_id() > 30 && rm_rel->as<Mem>().index_id() != Gp::kIdZr) {
+ goto InvalidPhysId;
+ }
+
+ opcode.add_reg(rm_rel->as<Mem>().index_id(), 16);
+ opcode.add_reg(rm_rel->as<Mem>().base_id(), 5);
+ goto EmitOp;
+
+ // --------------------------------------------------------------------------
+ // [EmitOp - PC Relative]
+ // --------------------------------------------------------------------------
+
+EmitOp_Rel:
+ {
+ if (rm_rel->is_label() || rm_rel->is_mem()) {
+ uint32_t label_id;
+ int64_t label_offset = 0;
+
+ if (rm_rel->is_label()) {
+ label_id = rm_rel->as<Label>().id();
+ }
+ else {
+ label_id = rm_rel->as<Mem>().base_id();
+ label_offset = rm_rel->as<Mem>().offset();
+ }
+
+ if (ASMJIT_UNLIKELY(!_code->is_label_valid(label_id))) {
+ goto InvalidLabel;
+ }
+
+ LabelEntry& le = _code->label_entry_of(label_id);
+
+ if (offset_format.type() == OffsetType::kAArch64_ADRP) {
+ // TODO: [ARM] Always create relocation entry.
+ }
+
+ if (le.is_bound_to(_section)) {
+ // Label bound to the current section.
+ offset_value = le.offset() - uint64_t(offset()) + uint64_t(label_offset);
+ goto EmitOp_DispImm;
+ }
+ else {
+ // Create a fixup referencing an non-bound label.
+ size_t code_offset = writer.offset_from(_buffer_data);
+ Fixup* fixup = _code->new_fixup(le, _section->section_id(), code_offset, intptr_t(label_offset), offset_format);
+
+ if (ASMJIT_UNLIKELY(!fixup)) {
+ goto OutOfMemory;
+ }
+
+ goto EmitOp;
+ }
+ }
+ }
+
+ if (rm_rel->is_imm()) {
+ uint64_t base_address = _code->base_address();
+ uint64_t section_offset = _section->offset();
+
+ uint64_t target_offset = rm_rel->as<Imm>().value_as<uint64_t>();
+ size_t code_offset = writer.offset_from(_buffer_data);
+
+ if (!EmitterUtils::is_absolute_location(base_address, section_offset)) {
+ // Create a new RelocEntry as we cannot calculate the offset right now.
+ RelocEntry* re;
+ err = _code->new_reloc_entry(Out(re), RelocType::kAbsToRel);
+ if (err != Error::kOk) {
+ goto Failed;
+ }
+
+ re->_source_section_id = _section->section_id();
+ re->_source_offset = code_offset;
+ re->_format = offset_format;
+ re->_payload = rm_rel->as<Imm>().value_as<uint64_t>() + 4u;
+ goto EmitOp;
+ }
+ else {
+ uint64_t pc = base_address + section_offset + code_offset;
+
+ if (offset_format.type() == OffsetType::kAArch64_ADRP) {
+ pc &= ~uint64_t(4096 - 1);
+ }
+
+ offset_value = target_offset - pc;
+ goto EmitOp_DispImm;
+ }
+ }
+
+ goto InvalidInstruction;
+
+EmitOp_DispImm:
+ {
+ if ((offset_value & Support::lsb_mask<uint32_t>(offset_format.imm_discard_lsb())) != 0) {
+ goto InvalidDisplacement;
+ }
+
+ int64_t disp_imm64 = int64_t(offset_value) >> offset_format.imm_discard_lsb();
+ if (!EmitterUtils::is_encodable_offset_64(disp_imm64, offset_format.imm_bit_count())) {
+ goto InvalidDisplacement;
+ }
+
+ uint32_t disp_imm32 = uint32_t(disp_imm64 & Support::lsb_mask<uint32_t>(offset_format.imm_bit_count()));
+ switch (offset_format.type()) {
+ case OffsetType::kSignedOffset: {
+ opcode.add_imm(disp_imm32, offset_format.imm_bit_shift());
+ goto EmitOp;
+ }
+
+ case OffsetType::kAArch64_ADR:
+ case OffsetType::kAArch64_ADRP: {
+ uint32_t imm_lo = disp_imm32 & 0x3u;
+ uint32_t imm_hi = disp_imm32 >> 2;
+ opcode.add_imm(imm_lo, 29);
+ opcode.add_imm(imm_hi, 5);
+ goto EmitOp;
+ }
+
+ default:
+ goto InvalidDisplacement;
+ }
+ }
+
+ // --------------------------------------------------------------------------
+ // [EmitOp - Opcode]
+ // --------------------------------------------------------------------------
+
+EmitOp:
+ writer.emit32u_le(opcode.get());
+ goto EmitDone;
+
+ // --------------------------------------------------------------------------
+ // [Done]
+ // --------------------------------------------------------------------------
+
+EmitDone:
+ if (Support::test(options, InstOptions::kReserved)) {
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ EmitterUtils::log_instruction_emitted(this, BaseInst::compose_arm_inst_id(inst_id, inst_cc), options, o0, o1, o2, op_ext, 0, 0, writer.cursor());
+ }
+#endif
+ }
+
+ reset_state();
+
+ writer.done(this);
+ return Error::kOk;
+
+ // --------------------------------------------------------------------------
+ // [Error Handler]
+ // --------------------------------------------------------------------------
+
+#define ERROR_HANDLER(ERR) ERR: err = make_error(Error::k##ERR); goto Failed;
+ ERROR_HANDLER(OutOfMemory)
+ ERROR_HANDLER(InvalidAddress)
+ ERROR_HANDLER(InvalidAddressScale)
+ ERROR_HANDLER(InvalidDisplacement)
+ ERROR_HANDLER(InvalidElementIndex)
+ ERROR_HANDLER(InvalidLabel)
+ ERROR_HANDLER(InvalidImmediate)
+ ERROR_HANDLER(InvalidInstruction)
+ ERROR_HANDLER(InvalidPhysId)
+ ERROR_HANDLER(InvalidRegType)
+#undef ERROR_HANDLER
+
+Failed:
+#ifndef ASMJIT_NO_LOGGING
+ return EmitterUtils::log_instruction_failed(this, err, inst_id, options, o0, o1, o2, op_ext);
+#else
+ reset_state();
+ return report_error(err);
+#endif
+}
+
+#undef ENC_OPS1
+#undef ENC_OPS2
+#undef ENC_OPS3
+#undef ENC_OPS4
+
+// a64::Assembler - Align
+// ======================
+
+Error Assembler::align(AlignMode align_mode, uint32_t alignment) {
+ constexpr uint32_t kNopA64 = 0xD503201Fu; // [11010101|00000011|00100000|00011111].
+
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ if (ASMJIT_UNLIKELY(uint32_t(align_mode) > uint32_t(AlignMode::kMaxValue))) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ if (alignment <= 1) {
+ return Error::kOk;
+ }
+
+ if (ASMJIT_UNLIKELY(!Support::is_power_of_2_up_to(alignment, Globals::kMaxAlignment))) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ uint32_t i = uint32_t(Support::align_up_diff<size_t>(offset(), alignment));
+ if (i == 0) {
+ return Error::kOk;
+ }
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, i));
+
+ switch (align_mode) {
+ case AlignMode::kCode: {
+ uint32_t pattern = kNopA64;
+
+ if (ASMJIT_UNLIKELY(offset() & 0x3u)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ while (i >= 4) {
+ writer.emit32u_le(pattern);
+ i -= 4;
+ }
+
+ ASMJIT_ASSERT(i == 0);
+ break;
+ }
+
+ case AlignMode::kData:
+ case AlignMode::kZero:
+ writer.emit_zeros(i);
+ break;
+ }
+
+ writer.done(this);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<128> sb;
+ sb.append_chars(' ', _logger->indentation(FormatIndentationGroup::kCode));
+ sb.append_format("align %u\n", alignment);
+ _logger->log(sb);
+ }
+#endif
+
+ return Error::kOk;
+}
+
+// a64::Assembler - Events
+// =======================
+
+Error Assembler::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ _instruction_alignment = uint8_t(4);
+ update_emitter_funcs(this);
+
+ return Error::kOk;
+}
+
+Error Assembler::on_detach(CodeHolder& code) noexcept {
+ return Base::on_detach(code);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit/arm/a64assembler.h b/3rdparty/asmjit/asmjit/arm/a64assembler.h
new file mode 100644
index 00000000000..d6723a88d8e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64assembler.h
@@ -0,0 +1,61 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
+#define ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/arm/a64emitter.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 assembler implementation.
+class ASMJIT_VIRTAPI Assembler
+ : public BaseAssembler,
+ public EmitterExplicitT<Assembler> {
+
+public:
+ using Base = BaseAssembler;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API Assembler(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API ~Assembler() noexcept override;
+
+ //! \}
+
+ //! \name Emit
+ //! \{
+
+ ASMJIT_API Error _emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) override;
+
+ //! \}
+
+ //! \name Align
+ //! \{
+
+ ASMJIT_API Error align(AlignMode align_mode, uint32_t alignment) override;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64builder.cpp b/3rdparty/asmjit/asmjit/arm/a64builder.cpp
new file mode 100644
index 00000000000..470f66f4585
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64builder.cpp
@@ -0,0 +1,57 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_BUILDER)
+
+#include <asmjit/arm/a64assembler.h>
+#include <asmjit/arm/a64builder.h>
+#include <asmjit/arm/a64emithelper_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Builder - Construction & Destruction
+// =========================================
+
+Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
+ _arch_mask = uint64_t(1) << uint32_t(Arch::kAArch64);
+ init_emitter_funcs(this);
+
+ if (code) {
+ code->attach(this);
+ }
+}
+Builder::~Builder() noexcept {}
+
+// a64::Builder - Events
+// =====================
+
+Error Builder::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ _instruction_alignment = uint8_t(4);
+ update_emitter_funcs(this);
+
+ return Error::kOk;
+}
+
+Error Builder::on_detach(CodeHolder& code) noexcept {
+ return Base::on_detach(code);
+}
+
+// a64::Builder - Finalize
+// =======================
+
+Error Builder::finalize() {
+ ASMJIT_PROPAGATE(run_passes());
+ Assembler a(_code);
+ a.add_encoding_options(encoding_options());
+ a.add_diagnostic_options(diagnostic_options());
+ return serialize_to(&a);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/asmjit/arm/a64builder.h b/3rdparty/asmjit/asmjit/arm/a64builder.h
new file mode 100644
index 00000000000..c3708f971f9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64builder.h
@@ -0,0 +1,57 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64BUILDER_H_INCLUDED
+#define ASMJIT_ARM_A64BUILDER_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_BUILDER
+
+#include <asmjit/core/builder.h>
+#include <asmjit/arm/a64emitter.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 builder implementation.
+class ASMJIT_VIRTAPI Builder
+ : public BaseBuilder,
+ public EmitterExplicitT<Builder> {
+public:
+ ASMJIT_NONCOPYABLE(Builder)
+ using Base = BaseBuilder;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API ~Builder() noexcept override;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+
+ //! \}
+
+ //! \name Finalize
+ //! \{
+
+ ASMJIT_API Error finalize() override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_BUILDER
+#endif // ASMJIT_ARM_A64BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64compiler.cpp b/3rdparty/asmjit/asmjit/arm/a64compiler.cpp
new file mode 100644
index 00000000000..83157bb524a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64compiler.cpp
@@ -0,0 +1,72 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_COMPILER)
+
+#include <asmjit/arm/a64assembler.h>
+#include <asmjit/arm/a64compiler.h>
+#include <asmjit/arm/a64emithelper_p.h>
+#include <asmjit/arm/a64rapass_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Compiler - Construction & Destruction
+// ==========================================
+
+Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
+ _arch_mask = uint64_t(1) << uint32_t(Arch::kAArch64);
+ init_emitter_funcs(this);
+
+ if (code) {
+ code->attach(this);
+ }
+}
+Compiler::~Compiler() noexcept {}
+
+// a64::Compiler - Events
+// ======================
+
+Error Compiler::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+ Error err = add_pass<ARMRAPass>();
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ on_detach(code);
+ return err;
+ }
+
+ _instruction_alignment = uint8_t(4);
+ update_emitter_funcs(this);
+
+ return Error::kOk;
+}
+
+Error Compiler::on_detach(CodeHolder& code) noexcept {
+ return Base::on_detach(code);
+}
+
+Error Compiler::on_reinit(CodeHolder& code) noexcept {
+ Error err = Base::on_reinit(code);
+ if (err == Error::kOk) {
+ err = add_pass<ARMRAPass>();
+ }
+ return err;
+}
+
+// a64::Compiler - Finalize
+// ========================
+
+Error Compiler::finalize() {
+ ASMJIT_PROPAGATE(run_passes());
+ Assembler a(_code);
+ a.add_encoding_options(encoding_options());
+ a.add_diagnostic_options(diagnostic_options());
+ return serialize_to(&a);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/arm/a64compiler.h b/3rdparty/asmjit/asmjit/arm/a64compiler.h
new file mode 100644
index 00000000000..8e5c8cdd3b0
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64compiler.h
@@ -0,0 +1,267 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64COMPILER_H_INCLUDED
+#define ASMJIT_ARM_A64COMPILER_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/type.h>
+#include <asmjit/arm/a64emitter.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64 compiler implementation.
+class ASMJIT_VIRTAPI Compiler
+ : public BaseCompiler,
+ public EmitterExplicitT<Compiler> {
+public:
+ ASMJIT_NONCOPYABLE(Compiler)
+ using Base = BaseCompiler;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API ~Compiler() noexcept override;
+
+ //! \}
+
+ //! \name Virtual Registers
+ //! \{
+
+ //! Creates a new general-purpose register with `type_id` type and optional name passed via `args`.
+ //!
+ //! \note Using \ref TypeId is too generic. In general it's recommended to use \ref new_gp32(),
+ //! \ref new_gp64(), and \ref new_gpz() or \ref new_gp_ptr().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp(TypeId type_id, Args&&... args) { return new_reg<Gp>(type_id, std::forward<Args>(args)...); }
+
+ //! Creates a new vector register with `type_id` type and optional name passed via `args`.
+ //!
+ //! \note Using \ref TypeId is too generic. In general it's recommended to use \ref new_vec128(),
+ //! \ref new_vec_s(), \ref new_vec_d(), \ref new_vec_q(), ...
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec(TypeId type_id, Args&&... args) { return new_reg<Vec>(type_id, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit general purpose register mapped to low 32 bits of a full register (on 64-bit targets).
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp32(Args&&... args) { return new_reg<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
+
+ //! Creates a new 64-bit general purpose register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp64(Args&&... args) { return new_reg<Gp>(TypeId::kUInt64, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit general purpose register.
+ //!
+ //! \note This is a convenience function alias of \ref new_gp32().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gpw(Args&&... args) { return new_reg<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
+
+ //! Creates a new 64-bit general purpose register.
+ //!
+ //! \note This is a convenience function alias of \ref new_gp64().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gpx(Args&&... args) { return new_reg<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit or 64-bit general purpose register depending on the target register width.
+ //!
+ //! \note This is a convenience function, on aarch64 target it always creates a 64-bit general-purpose register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gpz(Args&&... args) { return new_reg<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit or 64-bit general purpose register depending on the target register width.
+ //!
+ //! \note This is a convenience function, on aarch64 target it always creates a 64-bit general-purpose register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp_ptr(Args&&... args) { return new_reg<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x4, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register that will be used for scalar 32-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f32x1(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x1, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register that will be used for scalar 64-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f64x1(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x1, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register that will be used for packed 32-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f32x4(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x4, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register that will be used for packed 64-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f64x2(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x2, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit vector register (S).
+ //!
+ //! \note This may look like an alias of \ref new_vec128_f32x1(), but it's not. This really creates a 32-bit
+ //! register, which has a type \ref RegType::kVec32, whereas \ref new_vec128_f32x1() creates a register,
+ //! which has a type \ref RegType::kVec64
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec_s(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128_f64x1() that matches aarch64 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec_d(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128() that matches aarch64 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec_q(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x4, std::forward<Args>(args)...); }
+
+ //! \}
+
+ //! \name Stack
+ //! \{
+
+ //! Creates a new stack and returns a \ref Mem operand that can be used to address it.
+ ASMJIT_INLINE_NODEBUG Mem new_stack(uint32_t size, uint32_t alignment, const char* name = nullptr) {
+ Mem m(Globals::NoInit);
+ _new_stack(Out<BaseMem>(m), size, alignment, name);
+ return m;
+ }
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ //! Put data to a constant-pool and get a memory reference to it.
+ ASMJIT_INLINE_NODEBUG Mem new_const(ConstPoolScope scope, const void* data, size_t size) {
+ Mem m(Globals::NoInit);
+ _new_const(Out<BaseMem>(m), scope, data, size);
+ return m;
+ }
+
+ //! Put a BYTE `val` to a constant-pool (8 bits).
+ ASMJIT_INLINE_NODEBUG Mem new_byte_const(ConstPoolScope scope, uint8_t val) noexcept { return new_const(scope, &val, 1); }
+ //! Put a HWORD `val` to a constant-pool (16 bits).
+ ASMJIT_INLINE_NODEBUG Mem new_half_const(ConstPoolScope scope, uint16_t val) noexcept { return new_const(scope, &val, 2); }
+ //! Put a WORD `val` to a constant-pool (32 bits).
+ ASMJIT_INLINE_NODEBUG Mem new_word_const(ConstPoolScope scope, uint32_t val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a DWORD `val` to a constant-pool (64 bits).
+ ASMJIT_INLINE_NODEBUG Mem new_dword_const(ConstPoolScope scope, uint64_t val) noexcept { return new_const(scope, &val, 8); }
+
+ //! Put a WORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_int16_const(ConstPoolScope scope, int16_t val) noexcept { return new_const(scope, &val, 2); }
+ //! Put a WORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_uint16_const(ConstPoolScope scope, uint16_t val) noexcept { return new_const(scope, &val, 2); }
+ //! Put a DWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_int32_const(ConstPoolScope scope, int32_t val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a DWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_uint32_const(ConstPoolScope scope, uint32_t val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a QWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_int64_const(ConstPoolScope scope, int64_t val) noexcept { return new_const(scope, &val, 8); }
+ //! Put a QWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_uint64_const(ConstPoolScope scope, uint64_t val) noexcept { return new_const(scope, &val, 8); }
+
+ //! Put a SP-FP `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_float_const(ConstPoolScope scope, float val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a DP-FP `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_double_const(ConstPoolScope scope, double val) noexcept { return new_const(scope, &val, 8); }
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
+
+ //! Force the compiler to not follow the conditional or unconditional jump.
+ ASMJIT_INLINE_NODEBUG Compiler& unfollow() noexcept { _inst_options |= InstOptions::kUnfollow; return *this; }
+
+ //! \}
+
+ //! \name Compiler specific
+ //! \{
+
+ //! Special pseudo-instruction that can be used to load a memory address into `o0` GP register.
+ //!
+ //! \note At the moment this instruction is only useful to load a stack allocated address into a GP register
+ //! for further use. It makes very little sense to use it for anything else. The semantics of this instruction
+ //! is the same as X86 `LEA` (load effective address) instruction.
+ ASMJIT_INLINE_NODEBUG Error load_address_of(const Gp& o0, const Mem& o1) { return _emitter()->_emitI(Inst::kIdAdr, o0, o1); }
+
+ //! \}
+
+ //! \name Function Call & Ret Intrinsics
+ //! \{
+
+ //! Invoke a function call without `target` type enforcement.
+ ASMJIT_INLINE_NODEBUG Error invoke_(Out<InvokeNode*> out, const Operand_& target, const FuncSignature& signature) {
+ return add_invoke_node(out, Inst::kIdBlr, target, signature);
+ }
+
+ //! Invoke a function call of the given `target` and `signature` and store the added node to `out`.
+ //!
+ //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`,
+ //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails
+ //! nullptr is stored in `out` and error code is returned.
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); }
+
+ //! Return from function.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE_NODEBUG Error ret() { return add_ret(Operand(), Operand()); }
+
+ //! Return from function - one value.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE_NODEBUG Error ret(const Reg& o0) { return add_ret(o0, Operand()); }
+
+ //! Return from function - two values / register pair.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE_NODEBUG Error ret(const Reg& o0, const Reg& o1) { return add_ret(o0, o1); }
+
+ //! \}
+
+ //! \name Jump Tables Support
+ //! \{
+
+ using EmitterExplicitT<Compiler>::br;
+
+ //! Adds a jump to the given `target` with the provided jump `annotation`.
+ ASMJIT_INLINE_NODEBUG Error br(const Reg& target, JumpAnnotation* annotation) { return emit_annotated_jump(Inst::kIdBr, target, annotation); }
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_reinit(CodeHolder& code) noexcept override;
+
+ //! \}
+
+ //! \name Finalize
+ //! \{
+
+ ASMJIT_API Error finalize() override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_ARM_A64COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64emithelper.cpp b/3rdparty/asmjit/asmjit/arm/a64emithelper.cpp
new file mode 100644
index 00000000000..3e4049c0a0d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64emithelper.cpp
@@ -0,0 +1,481 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/funcargscontext_p.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/a64emithelper_p.h>
+#include <asmjit/arm/a64formatter_p.h>
+#include <asmjit/arm/a64instapi_p.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::EmitHelper - Emit Operations
+// =================================
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_reg_move(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId type_id, const char* comment) {
+
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::is_valid(type_id) && !TypeUtils::is_abstract(type_id));
+
+ emitter->set_inline_comment(comment);
+
+ if (dst_.is_reg() && src_.is_mem()) {
+ Reg dst(dst_.as<Reg>());
+ Mem src(src_.as<Mem>());
+
+ switch (type_id) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ return emitter->ldrb(dst.as<Gp>(), src);
+
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ return emitter->ldrh(dst.as<Gp>(), src);
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ return emitter->ldr(dst.as<Gp>().w(), src);
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ return emitter->ldr(dst.as<Gp>().x(), src);
+
+ default: {
+ if (TypeUtils::is_float32(type_id) || TypeUtils::is_vec32(type_id)) {
+ return emitter->ldr(dst.as<Vec>().s(), src);
+ }
+
+ if (TypeUtils::is_float64(type_id) || TypeUtils::is_vec64(type_id)) {
+ return emitter->ldr(dst.as<Vec>().d(), src);
+ }
+
+ if (TypeUtils::is_vec128(type_id)) {
+ return emitter->ldr(dst.as<Vec>().q(), src);
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (dst_.is_mem() && src_.is_reg()) {
+ Mem dst(dst_.as<Mem>());
+ Reg src(src_.as<Reg>());
+
+ switch (type_id) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ return emitter->strb(src.as<Gp>(), dst);
+
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ return emitter->strh(src.as<Gp>(), dst);
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ return emitter->str(src.as<Gp>().w(), dst);
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ return emitter->str(src.as<Gp>().x(), dst);
+
+ default: {
+ if (TypeUtils::is_float32(type_id) || TypeUtils::is_vec32(type_id)) {
+ return emitter->str(src.as<Vec>().s(), dst);
+ }
+
+ if (TypeUtils::is_float64(type_id) || TypeUtils::is_vec64(type_id)) {
+ return emitter->str(src.as<Vec>().d(), dst);
+ }
+
+ if (TypeUtils::is_vec128(type_id)) {
+ return emitter->str(src.as<Vec>().q(), dst);
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (dst_.is_reg() && src_.is_reg()) {
+ Reg dst(dst_.as<Reg>());
+ Reg src(src_.as<Reg>());
+
+ switch (type_id) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ return emitter->mov(dst.as<Gp>().x(), src.as<Gp>().x());
+
+ default: {
+ if (TypeUtils::is_float32(type_id) || TypeUtils::is_vec32(type_id)) {
+ return emitter->fmov(dst.as<Vec>().s(), src.as<Vec>().s());
+ }
+
+ if (TypeUtils::is_float64(type_id) || TypeUtils::is_vec64(type_id)) {
+ return emitter->mov(dst.as<Vec>().b8(), src.as<Vec>().b8());
+ }
+
+ if (TypeUtils::is_vec128(type_id)) {
+ return emitter->mov(dst.as<Vec>().b16(), src.as<Vec>().b16());
+ }
+
+ break;
+ }
+ }
+ }
+
+ emitter->set_inline_comment(nullptr);
+ return make_error(Error::kInvalidState);
+}
+
+Error EmitHelper::emit_reg_swap(
+ const Reg& a,
+ const Reg& b, const char* comment) {
+
+ Support::maybe_unused(a, b, comment);
+ return make_error(Error::kInvalidState);
+}
+
+// TODO: [ARM] EmitArgMove is unfinished.
+Error EmitHelper::emit_arg_move(
+ const Reg& dst_, TypeId dst_type_id,
+ const Operand_& src_, TypeId src_type_id, const char* comment) {
+
+ // Deduce optional `dst_type_id`, which may be `TypeId::kVoid` in some cases.
+ if (dst_type_id == TypeId::kVoid) {
+ dst_type_id = RegUtils::type_id_of(dst_.reg_type());
+ }
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::is_valid(dst_type_id) && !TypeUtils::is_abstract(dst_type_id));
+ ASMJIT_ASSERT(TypeUtils::is_valid(src_type_id) && !TypeUtils::is_abstract(src_type_id));
+
+ Reg dst(dst_.as<Reg>());
+ Operand src(src_);
+
+ uint32_t dst_size = TypeUtils::size_of(dst_type_id);
+ uint32_t src_size = TypeUtils::size_of(src_type_id);
+
+ if (TypeUtils::is_int(dst_type_id)) {
+ if (TypeUtils::is_int(src_type_id)) {
+ uint32_t x = uint32_t(dst_size == 8);
+
+ dst.set_signature(OperandSignature{x ? RegTraits<RegType::kGp64>::kSignature : RegTraits<RegType::kGp32>::kSignature});
+ _emitter->set_inline_comment(comment);
+
+ if (src.is_reg()) {
+ src.set_signature(dst.signature());
+ return _emitter->emit(Inst::kIdMov, dst, src);
+ }
+ else if (src.is_mem()) {
+ InstId inst_id = Inst::kIdNone;
+ switch (src_type_id) {
+ case TypeId::kInt8: inst_id = Inst::kIdLdrsb; break;
+ case TypeId::kUInt8: inst_id = Inst::kIdLdrb; break;
+ case TypeId::kInt16: inst_id = Inst::kIdLdrsh; break;
+ case TypeId::kUInt16: inst_id = Inst::kIdLdrh; break;
+ case TypeId::kInt32: inst_id = x ? Inst::kIdLdrsw : Inst::kIdLdr; break;
+ case TypeId::kUInt32: inst_id = Inst::kIdLdr; break;
+ case TypeId::kInt64: inst_id = Inst::kIdLdr; break;
+ case TypeId::kUInt64: inst_id = Inst::kIdLdr; break;
+ default:
+ return make_error(Error::kInvalidState);
+ }
+ return _emitter->emit(inst_id, dst, src);
+ }
+ }
+ }
+
+ if (TypeUtils::is_float(dst_type_id) || TypeUtils::is_vec(dst_type_id)) {
+ if (TypeUtils::is_float(src_type_id) || TypeUtils::is_vec(src_type_id)) {
+ switch (src_size) {
+ case 2: dst.as<Vec>().set_signature(RegTraits<RegType::kVec16>::kSignature); break;
+ case 4: dst.as<Vec>().set_signature(RegTraits<RegType::kVec32>::kSignature); break;
+ case 8: dst.as<Vec>().set_signature(RegTraits<RegType::kVec64>::kSignature); break;
+ case 16: dst.as<Vec>().set_signature(RegTraits<RegType::kVec128>::kSignature); break;
+ default:
+ return make_error(Error::kInvalidState);
+ }
+
+ _emitter->set_inline_comment(comment);
+
+ if (src.is_reg()) {
+ InstId inst_id = src_size <= 4 ? Inst::kIdFmov_v : Inst::kIdMov_v;
+ src.set_signature(dst.signature());
+ return _emitter->emit(inst_id, dst, src);
+ }
+ else if (src.is_mem()) {
+ return _emitter->emit(Inst::kIdLdr_v, dst, src);
+ }
+ }
+ }
+
+ return make_error(Error::kInvalidState);
+}
+
+// a64::EmitHelper - Emit Prolog & Epilog
+// ======================================
+
+struct LoadStoreInstructions {
+ InstId single_inst_id;
+ InstId pair_inst_id;
+};
+
+struct PrologEpilogInfo {
+ struct RegPair {
+ uint8_t ids[2];
+ uint16_t offset;
+ };
+
+ struct GroupData {
+ RegPair pairs[16];
+ uint32_t pair_count;
+ };
+
+ Support::Array<GroupData, 2> groups;
+ uint32_t size_total;
+
+ Error init(const FuncFrame& frame) noexcept {
+ uint32_t offset = 0;
+
+ for (RegGroup group : Support::enumerate(RegGroup::kGp, RegGroup::kVec)) {
+ GroupData& data = groups[group];
+
+ uint32_t n = 0;
+ uint32_t pair_count = 0;
+ RegPair* pairs = data.pairs;
+
+ uint32_t slot_size = frame.save_restore_reg_size(group);
+ RegMask saved_regs = frame.saved_regs(group);
+
+ if (group == RegGroup::kGp && frame.has_preserved_fp()) {
+ // Must be at the beginning of the push/pop sequence.
+ ASMJIT_ASSERT(pair_count == 0);
+
+ pairs[0].offset = uint16_t(offset);
+ pairs[0].ids[0] = Gp::kIdFp;
+ pairs[0].ids[1] = Gp::kIdLr;
+ offset += slot_size * 2;
+ pair_count++;
+
+ saved_regs &= ~Support::bit_mask<RegMask>(Gp::kIdFp, Gp::kIdLr);
+ }
+
+ Support::BitWordIterator<uint32_t> it(saved_regs);
+ while (it.has_next()) {
+ pairs[pair_count].ids[n] = uint8_t(it.next());
+
+ if (++n == 2) {
+ pairs[pair_count].offset = uint16_t(offset);
+ offset += slot_size * 2;
+
+ n = 0;
+ pair_count++;
+ }
+ }
+
+ if (n == 1) {
+ pairs[pair_count].ids[1] = uint8_t(Reg::kIdBad);
+ pairs[pair_count].offset = uint16_t(offset);
+ offset += slot_size * 2;
+ pair_count++;
+ }
+
+ data.pair_count = pair_count;
+ }
+
+ size_total = offset;
+ return Error::kOk;
+ }
+};
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_prolog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ PrologEpilogInfo pei;
+ ASMJIT_PROPAGATE(pei.init(frame));
+
+ static const Support::Array<Reg, 2> group_regs = {{ x0, d0 }};
+ static const Support::Array<LoadStoreInstructions, 2> group_insts = {{
+ { Inst::kIdStr , Inst::kIdStp },
+ { Inst::kIdStr_v, Inst::kIdStp_v }
+ }};
+
+ // Emit: 'bti {jc}' (indirect branch protection).
+ if (frame.has_indirect_branch_protection()) {
+ ASMJIT_PROPAGATE(emitter->bti(Predicate::BTI::kJC));
+ }
+
+ uint32_t adjust_initial_offset = pei.size_total;
+
+ for (RegGroup group : Support::enumerate(RegGroup::kGp, RegGroup::kVec)) {
+ const PrologEpilogInfo::GroupData& data = pei.groups[group];
+ uint32_t pair_count = data.pair_count;
+
+ Reg regs[2] = { group_regs[group], group_regs[group] };
+ Mem mem = ptr(sp);
+
+ const LoadStoreInstructions& insts = group_insts[group];
+ for (uint32_t i = 0; i < pair_count; i++) {
+ const PrologEpilogInfo::RegPair& pair = data.pairs[i];
+
+ regs[0].set_id(pair.ids[0]);
+ regs[1].set_id(pair.ids[1]);
+ mem.set_offset_lo32(pair.offset);
+
+ if (pair.offset == 0 && adjust_initial_offset) {
+ mem.set_offset(-int(adjust_initial_offset));
+ mem.make_pre_index();
+ }
+
+ if (pair.ids[1] == Reg::kIdBad) {
+ ASMJIT_PROPAGATE(emitter->emit(insts.single_inst_id, regs[0], mem));
+ }
+ else {
+ ASMJIT_PROPAGATE(emitter->emit(insts.pair_inst_id, regs[0], regs[1], mem));
+ }
+
+ mem.reset_offset_mode();
+
+ if (i == 0 && frame.has_preserved_fp()) {
+ ASMJIT_PROPAGATE(emitter->mov(x29, sp));
+ }
+ }
+ }
+
+ if (frame.has_stack_adjustment()) {
+ uint32_t adj = frame.stack_adjustment();
+ if (adj <= 0xFFFu) {
+ ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj));
+ }
+ else if (adj <= 0xFFFFFFu) {
+ // TODO: [ARM] Prolog - we must touch the pages otherwise it's undefined.
+ ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj & 0x000FFFu));
+ ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj & 0xFFF000u));
+ }
+ else {
+ return make_error(Error::kInvalidState);
+ }
+ }
+
+ return Error::kOk;
+}
+
+// TODO: [ARM] Emit epilog.
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_epilog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ PrologEpilogInfo pei;
+ ASMJIT_PROPAGATE(pei.init(frame));
+
+ static const Support::Array<Reg, 2> group_regs = {{ x0, d0 }};
+ static const Support::Array<LoadStoreInstructions, 2> group_insts = {{
+ { Inst::kIdLdr , Inst::kIdLdp },
+ { Inst::kIdLdr_v, Inst::kIdLdp_v }
+ }};
+
+ uint32_t adjust_initial_offset = pei.size_total;
+
+ if (frame.has_stack_adjustment()) {
+ uint32_t adj = frame.stack_adjustment();
+ if (adj <= 0xFFFu) {
+ ASMJIT_PROPAGATE(emitter->add(sp, sp, adj));
+ }
+ else if (adj <= 0xFFFFFFu) {
+ ASMJIT_PROPAGATE(emitter->add(sp, sp, adj & 0x000FFFu));
+ ASMJIT_PROPAGATE(emitter->add(sp, sp, adj & 0xFFF000u));
+ }
+ else {
+ return make_error(Error::kInvalidState);
+ }
+ }
+
+ for (int g = 1; g >= 0; g--) {
+ RegGroup group = RegGroup(g);
+ const PrologEpilogInfo::GroupData& data = pei.groups[group];
+ uint32_t pair_count = data.pair_count;
+
+ Reg regs[2] = { group_regs[group], group_regs[group] };
+ Mem mem = ptr(sp);
+
+ const LoadStoreInstructions& insts = group_insts[group];
+
+ for (int i = int(pair_count) - 1; i >= 0; i--) {
+ const PrologEpilogInfo::RegPair& pair = data.pairs[i];
+
+ regs[0].set_id(pair.ids[0]);
+ regs[1].set_id(pair.ids[1]);
+ mem.set_offset_lo32(pair.offset);
+
+ if (pair.offset == 0 && adjust_initial_offset) {
+ mem.set_offset(int(adjust_initial_offset));
+ mem.make_post_index();
+ }
+
+ if (pair.ids[1] == Reg::kIdBad) {
+ ASMJIT_PROPAGATE(emitter->emit(insts.single_inst_id, regs[0], mem));
+ }
+ else {
+ ASMJIT_PROPAGATE(emitter->emit(insts.pair_inst_id, regs[0], regs[1], mem));
+ }
+
+ mem.reset_offset_mode();
+ }
+ }
+
+ ASMJIT_PROPAGATE(emitter->ret(x30));
+
+ return Error::kOk;
+}
+
+static Error ASMJIT_CDECL Emitter_emitProlog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emit_helper(emitter);
+ return emit_helper.emit_prolog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitEpilog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emit_helper(emitter);
+ return emit_helper.emit_epilog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitArgsAssignment(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
+ EmitHelper emit_helper(emitter);
+ return emit_helper.emit_args_assignment(frame, args);
+}
+
+void init_emitter_funcs(BaseEmitter* emitter) {
+ emitter->_funcs.emit_prolog = Emitter_emitProlog;
+ emitter->_funcs.emit_epilog = Emitter_emitEpilog;
+ emitter->_funcs.emit_args_assignment = Emitter_emitArgsAssignment;
+
+#ifndef ASMJIT_NO_LOGGING
+ emitter->_funcs.format_instruction = FormatterInternal::format_instruction;
+#endif
+
+#ifndef ASMJIT_NO_INTROSPECTION
+ emitter->_funcs.validate = InstInternal::validate;
+#endif
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit/arm/a64emithelper_p.h b/3rdparty/asmjit/asmjit/arm/a64emithelper_p.h
new file mode 100644
index 00000000000..1648a0c9922
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64emithelper_p.h
@@ -0,0 +1,59 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED
+#define ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+
+#include <asmjit/core/emithelper_p.h>
+#include <asmjit/core/func.h>
+#include <asmjit/arm/a64emitter.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+class EmitHelper : public BaseEmitHelper {
+public:
+ ASMJIT_INLINE_NODEBUG explicit EmitHelper(BaseEmitter* emitter = nullptr) noexcept
+ : BaseEmitHelper(emitter) {}
+
+ ASMJIT_INLINE_NODEBUG ~EmitHelper() noexcept override = default;
+
+ ASMJIT_INLINE void reset(BaseEmitter* emitter) noexcept {
+ _emitter = emitter;
+ }
+
+ Error emit_reg_move(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId type_id, const char* comment = nullptr) override;
+
+ Error emit_reg_swap(
+ const Reg& a,
+ const Reg& b, const char* comment = nullptr) override;
+
+ Error emit_arg_move(
+ const Reg& dst_, TypeId dst_type_id,
+ const Operand_& src_, TypeId src_type_id, const char* comment = nullptr) override;
+
+ Error emit_prolog(const FuncFrame& frame);
+ Error emit_epilog(const FuncFrame& frame);
+};
+
+void init_emitter_funcs(BaseEmitter* emitter);
+
+[[maybe_unused]]
+static inline void update_emitter_funcs(BaseEmitter* emitter) noexcept { Support::maybe_unused(emitter); }
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64emitter.h b/3rdparty/asmjit/asmjit/arm/a64emitter.h
new file mode 100644
index 00000000000..b511d04a2a9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64emitter.h
@@ -0,0 +1,1299 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64EMITTER_H_INCLUDED
+#define ASMJIT_ARM_A64EMITTER_H_INCLUDED
+
+#include <asmjit/core/emitter.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/a64instdb.h>
+#include <asmjit/arm/a64operand.h>
+
+// MSVC targeting AArch64 defines a lot of macros without underscores clashing
+// with AArch64 instruction names. We have to workaround until it's fixed in SDK.
+#if defined(_MSC_VER) && defined(mvn)
+ #define ASMJIT_RESTORE_MSVC_AARCH64_MACROS
+ #pragma push_macro("mvn")
+ #undef mvn
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+#define ASMJIT_INST_0x(NAME, ID) \
+ inline Error NAME() { return _emitter()->_emitI(Inst::kId##ID); }
+
+#define ASMJIT_INST_1x(NAME, ID, T0) \
+ inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); }
+
+#define ASMJIT_INST_2x(NAME, ID, T0, T1) \
+ inline Error NAME(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID, o0, o1); }
+
+#define ASMJIT_INST_3x(NAME, ID, T0, T1, T2) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2); }
+
+#define ASMJIT_INST_4x(NAME, ID, T0, T1, T2, T3) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3); }
+
+#define ASMJIT_INST_5x(NAME, ID, T0, T1, T2, T3, T4) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4); }
+
+#define ASMJIT_INST_6x(NAME, ID, T0, T1, T2, T3, T4, T5) \
+ inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4, const T5& o5) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4, o5); }
+
+#define ASMJIT_INST_1cc(NAME, ID, T0) \
+ inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); } \
+ \
+ inline Error NAME(CondCode cc, const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, cc), o0); } \
+ \
+ inline Error NAME##_eq(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kEQ), o0); } \
+ inline Error NAME##_ne(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kNE), o0); } \
+ inline Error NAME##_cs(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kCS), o0); } \
+ inline Error NAME##_hs(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kHS), o0); } \
+ inline Error NAME##_cc(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kCC), o0); } \
+ inline Error NAME##_lo(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kLO), o0); } \
+ inline Error NAME##_mi(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kMI), o0); } \
+ inline Error NAME##_pl(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kPL), o0); } \
+ inline Error NAME##_vs(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kVS), o0); } \
+ inline Error NAME##_vc(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kVC), o0); } \
+ inline Error NAME##_hi(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kHI), o0); } \
+ inline Error NAME##_ls(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kLS), o0); } \
+ inline Error NAME##_ge(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kGE), o0); } \
+ inline Error NAME##_lt(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kLT), o0); } \
+ inline Error NAME##_gt(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kGT), o0); } \
+ inline Error NAME##_le(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kLE), o0); } \
+ inline Error NAME##_al(const T0& o0) { return _emitter()->_emitI(BaseInst::compose_arm_inst_id(Inst::kId##ID, CondCode::kAL), o0); }
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! ARM emitter.
+//!
+//! NOTE: This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
+//! \ref Assembler, \ref Builder, or \ref Compiler (use with caution with \ref Compiler as it expects virtual
+//! registers to be used).
+template<typename This>
+struct EmitterExplicitT {
+ //! \cond
+
+ // These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
+ // I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
+ ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG This* _emitter() noexcept { return static_cast<This*>(this); }
+ ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG const This* _emitter() const noexcept { return static_cast<const This*>(this); }
+
+ //! \endcond
+
+
+ //! \name Native Registers
+ //! \{
+
+ //! Returns either 32-bit or 64-bit GP register of the given `id` depending on the emitter's architecture.
+ inline Gp gpz(uint32_t id) const noexcept { return Gp(_emitter()->_gp_signature, id); }
+ //! Clones the given `reg` to either 32-bit or 64-bit GP register depending on the emitter's architecture.
+ inline Gp gpz(const Gp& reg) const noexcept { return Gp(_emitter()->_gp_signature, reg.id()); }
+
+ //! \}
+
+ //! \name General Purpose Instructions
+ //! \{
+
+ ASMJIT_INST_3x(adc, Adc, Gp, Gp, Gp)
+ ASMJIT_INST_3x(adcs, Adcs, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(add, Add, Gp, Gp, Gp)
+ ASMJIT_INST_4x(add, Add, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(add, Add, Gp, Gp, Imm)
+ ASMJIT_INST_4x(add, Add, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_3x(adds, Adds, Gp, Gp, Gp)
+ ASMJIT_INST_3x(adds, Adds, Gp, Gp, Imm)
+ ASMJIT_INST_4x(adds, Adds, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_4x(adds, Adds, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_2x(adr, Adr, Gp, Imm)
+ ASMJIT_INST_2x(adr, Adr, Gp, Label)
+ ASMJIT_INST_2x(adrp, Adrp, Gp, Imm)
+ ASMJIT_INST_2x(adrp, Adrp, Gp, Label)
+
+ ASMJIT_INST_3x(and_, And, Gp, Gp, Imm)
+ ASMJIT_INST_3x(and_, And, Gp, Gp, Gp)
+ ASMJIT_INST_4x(and_, And, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(ands, Ands, Gp, Gp, Imm)
+ ASMJIT_INST_3x(ands, Ands, Gp, Gp, Gp)
+ ASMJIT_INST_4x(ands, Ands, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(asr, Asr, Gp, Gp, Imm)
+ ASMJIT_INST_3x(asr, Asr, Gp, Gp, Gp)
+ ASMJIT_INST_3x(asrv, Asrv, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(at, At, Imm, Gp)
+
+ ASMJIT_INST_3x(bfc, Bfc, Gp, Imm, Imm)
+ ASMJIT_INST_4x(bfi, Bfi, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(bfm, Bfm, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(bfxil, Bfxil, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_3x(bic, Bic, Gp, Gp, Imm)
+ ASMJIT_INST_3x(bic, Bic, Gp, Gp, Gp)
+ ASMJIT_INST_4x(bic, Bic, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(bics, Bics, Gp, Gp, Imm)
+ ASMJIT_INST_3x(bics, Bics, Gp, Gp, Gp)
+ ASMJIT_INST_4x(bics, Bics, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_1x(brk, Brk, Imm)
+
+ ASMJIT_INST_4x(ccmn, Ccmn, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(ccmn, Ccmn, Gp, Imm, Imm, Imm)
+ ASMJIT_INST_4x(ccmp, Ccmp, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(ccmp, Ccmp, Gp, Imm, Imm, Imm)
+
+ ASMJIT_INST_3x(cinc, Cinc, Gp, Gp, Imm)
+ ASMJIT_INST_3x(cinv, Cinv, Gp, Gp, Imm)
+
+ ASMJIT_INST_1x(clrex, Clrex, Imm)
+
+ ASMJIT_INST_2x(cls, Cls, Gp, Gp)
+ ASMJIT_INST_2x(clz, Clz, Gp, Gp)
+
+ ASMJIT_INST_2x(cmn, Cmn, Gp, Gp)
+ ASMJIT_INST_3x(cmn, Cmn, Gp, Gp, Imm)
+ ASMJIT_INST_2x(cmn, Cmn, Gp, Imm)
+ ASMJIT_INST_3x(cmn, Cmn, Gp, Imm, Imm)
+ ASMJIT_INST_2x(cmp, Cmp, Gp, Gp)
+ ASMJIT_INST_3x(cmp, Cmp, Gp, Gp, Imm)
+ ASMJIT_INST_2x(cmp, Cmp, Gp, Imm)
+ ASMJIT_INST_3x(cmp, Cmp, Gp, Imm, Imm)
+
+ ASMJIT_INST_3x(cneg, Cneg, Gp, Gp, Imm)
+
+ ASMJIT_INST_4x(csel, Csel, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_2x(cset, Cset, Gp, Imm)
+ ASMJIT_INST_2x(csetm, Csetm, Gp, Imm)
+
+ ASMJIT_INST_4x(csinc, Csinc, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_4x(csinv, Csinv, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_4x(csneg, Csneg, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(dc, Dc, Imm, Gp)
+ ASMJIT_INST_1x(dmb, Dmb, Imm)
+ ASMJIT_INST_1x(dsb, Dsb, Imm)
+ ASMJIT_INST_0x(drps, Drps)
+
+ ASMJIT_INST_3x(eon, Eon, Gp, Gp, Gp)
+ ASMJIT_INST_4x(eon, Eon, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(eor, Eor, Gp, Gp, Imm)
+ ASMJIT_INST_3x(eor, Eor, Gp, Gp, Gp)
+ ASMJIT_INST_4x(eor, Eor, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_0x(eret, Eret)
+ ASMJIT_INST_0x(esb, Esb)
+
+ ASMJIT_INST_4x(extr, Extr, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_1x(hlt, Hlt, Imm)
+ ASMJIT_INST_1x(hvc, Hvc, Imm)
+ ASMJIT_INST_2x(ic, Ic, Imm, Gp)
+ ASMJIT_INST_1x(isb, Isb, Imm)
+
+ ASMJIT_INST_3x(lsl, Lsl, Gp, Gp, Imm)
+ ASMJIT_INST_3x(lsl, Lsl, Gp, Gp, Gp)
+ ASMJIT_INST_3x(lslv, Lslv, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(lsr, Lsr, Gp, Gp, Imm)
+ ASMJIT_INST_3x(lsr, Lsr, Gp, Gp, Gp)
+ ASMJIT_INST_3x(lsrv, Lsrv, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(madd, Madd, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(mneg, Mneg, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(mov, Mov, Gp, Gp)
+ ASMJIT_INST_2x(mov, Mov, Gp, Imm)
+ ASMJIT_INST_2x(movk, Movk, Gp, Imm)
+ ASMJIT_INST_3x(movk, Movk, Gp, Imm, Imm)
+ ASMJIT_INST_2x(movn, Movn, Gp, Imm)
+ ASMJIT_INST_3x(movn, Movn, Gp, Imm, Imm)
+ ASMJIT_INST_2x(movz, Movz, Gp, Imm)
+ ASMJIT_INST_3x(movz, Movz, Gp, Imm, Imm)
+
+ ASMJIT_INST_2x(mrs, Mrs, Gp, Imm)
+ ASMJIT_INST_2x(msr, Msr, Imm, Gp)
+ ASMJIT_INST_2x(msr, Msr, Imm, Imm)
+
+ ASMJIT_INST_4x(msub, Msub, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(mul, Mul, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(mvn, Mvn, Gp, Gp)
+ ASMJIT_INST_3x(mvn, Mvn, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(mvn_, Mvn, Gp, Gp)
+ ASMJIT_INST_3x(mvn_, Mvn, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(neg, Neg, Gp, Gp)
+ ASMJIT_INST_3x(neg, Neg, Gp, Gp, Imm)
+ ASMJIT_INST_2x(negs, Negs, Gp, Gp)
+ ASMJIT_INST_3x(negs, Negs, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(ngc, Ngc, Gp, Gp)
+ ASMJIT_INST_2x(ngcs, Ngcs, Gp, Gp)
+
+ ASMJIT_INST_3x(orn, Orn, Gp, Gp, Gp)
+ ASMJIT_INST_4x(orn, Orn, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(orr, Orr, Gp, Gp, Imm)
+ ASMJIT_INST_3x(orr, Orr, Gp, Gp, Gp)
+ ASMJIT_INST_4x(orr, Orr, Gp, Gp, Gp, Imm)
+
+ ASMJIT_INST_2x(rbit, Rbit, Gp, Gp)
+ ASMJIT_INST_1x(ret, Ret, Gp)
+
+ ASMJIT_INST_2x(rev, Rev, Gp, Gp)
+ ASMJIT_INST_2x(rev16, Rev16, Gp, Gp)
+ ASMJIT_INST_2x(rev32, Rev32, Gp, Gp)
+ ASMJIT_INST_2x(rev64, Rev64, Gp, Gp)
+
+ ASMJIT_INST_3x(ror, Ror, Gp, Gp, Imm)
+ ASMJIT_INST_3x(ror, Ror, Gp, Gp, Gp)
+ ASMJIT_INST_3x(rorv, Rorv, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(sbc, Sbc, Gp, Gp, Gp)
+ ASMJIT_INST_3x(sbcs, Sbcs, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(sbfiz, Sbfiz, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(sbfm, Sbfm, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(sbfx, Sbfx, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_3x(sdiv, Sdiv, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(smaddl, Smaddl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_1x(smc, Smc, Imm)
+ ASMJIT_INST_3x(smnegl, Smnegl, Gp, Gp, Gp)
+ ASMJIT_INST_4x(smsubl, Smsubl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(smulh, Smulh, Gp, Gp, Gp)
+ ASMJIT_INST_3x(smull, Smull, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(sub, Sub, Gp, Gp, Gp)
+ ASMJIT_INST_4x(sub, Sub, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(sub, Sub, Gp, Gp, Imm)
+ ASMJIT_INST_4x(sub, Sub, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_3x(subs, Subs, Gp, Gp, Gp)
+ ASMJIT_INST_4x(subs, Subs, Gp, Gp, Gp, Imm)
+ ASMJIT_INST_3x(subs, Subs, Gp, Gp, Imm)
+ ASMJIT_INST_4x(subs, Subs, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_1x(svc, Svc, Imm)
+
+ ASMJIT_INST_2x(sxtb, Sxtb, Gp, Gp)
+ ASMJIT_INST_2x(sxth, Sxth, Gp, Gp)
+ ASMJIT_INST_2x(sxtw, Sxtw, Gp, Gp)
+
+ ASMJIT_INST_4x(sys, Sys, Imm, Imm, Imm, Imm)
+ ASMJIT_INST_5x(sys, Sys, Imm, Imm, Imm, Imm, Gp)
+
+ ASMJIT_INST_2x(tlbi, Tlbi, Imm, Gp)
+ ASMJIT_INST_2x(tst, Tst, Gp, Imm)
+ ASMJIT_INST_2x(tst, Tst, Gp, Gp)
+ ASMJIT_INST_3x(tst, Tst, Gp, Gp, Imm)
+
+ ASMJIT_INST_3x(udiv, Udiv, Gp, Gp, Gp)
+
+ ASMJIT_INST_4x(ubfiz, Ubfiz, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(ubfm, Ubfm, Gp, Gp, Imm, Imm)
+ ASMJIT_INST_4x(ubfx, Ubfx, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_4x(umaddl, Umaddl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umnegl, Umnegl, Gp, Gp, Gp)
+ ASMJIT_INST_4x(umsubl, Umsubl, Gp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umull, Umull, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umulh, Umulh, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(uxtb, Uxtb, Gp, Gp)
+ ASMJIT_INST_2x(uxth, Uxth, Gp, Gp)
+
+ ASMJIT_INST_0x(csdb, Csdb)
+ ASMJIT_INST_1x(dcps1, Dcps1, Imm)
+ ASMJIT_INST_1x(dcps2, Dcps2, Imm)
+ ASMJIT_INST_1x(dcps3, Dcps3, Imm)
+ ASMJIT_INST_0x(pssbb, Pssbb)
+ ASMJIT_INST_0x(ssbb, Ssbb)
+ ASMJIT_INST_1x(udf, Udf, Imm)
+
+ //! \}
+
+ //! \name Branch Instructions
+ //! \{
+
+ ASMJIT_INST_1cc(b, B, Imm)
+ ASMJIT_INST_1cc(b, B, Label)
+ ASMJIT_INST_1x(bl, Bl, Imm)
+ ASMJIT_INST_1x(bl, Bl, Label)
+ ASMJIT_INST_1x(blr, Blr, Gp)
+ ASMJIT_INST_1x(br, Br, Gp)
+ ASMJIT_INST_2x(cbz, Cbz, Gp, Imm)
+ ASMJIT_INST_2x(cbz, Cbz, Gp, Label)
+ ASMJIT_INST_2x(cbnz, Cbnz, Gp, Imm)
+ ASMJIT_INST_2x(cbnz, Cbnz, Gp, Label)
+ ASMJIT_INST_3x(tbnz, Tbnz, Gp, Imm, Imm)
+ ASMJIT_INST_3x(tbnz, Tbnz, Gp, Imm, Label)
+ ASMJIT_INST_3x(tbz, Tbz, Gp, Imm, Imm)
+ ASMJIT_INST_3x(tbz, Tbz, Gp, Imm, Label)
+
+ //! \}
+
+ //! \name Load & Store Instructions
+ //! \{
+
+ ASMJIT_INST_3x(cas, Cas, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casa, Casa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casab, Casab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casah, Casah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casal, Casal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casalb, Casalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casalh, Casalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casb, Casb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(cash, Cash, Gp, Gp, Mem)
+ ASMJIT_INST_3x(casl, Casl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(caslb, Caslb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(caslh, Caslh, Gp, Gp, Mem)
+
+ ASMJIT_INST_5x(casp, Casp, Gp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_5x(caspa, Caspa, Gp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_5x(caspal, Caspal, Gp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_5x(caspl, Caspl, Gp, Gp, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldadd, Ldadd, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldadda, Ldadda, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddab, Ldaddab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddah, Ldaddah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddal, Ldaddal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddalb, Ldaddalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddalh, Ldaddalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddb, Ldaddb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddh, Ldaddh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddl, Ldaddl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddlb, Ldaddlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaddlh, Ldaddlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldar, Ldar, Gp, Mem)
+ ASMJIT_INST_2x(ldarb, Ldarb, Gp, Mem)
+ ASMJIT_INST_2x(ldarh, Ldarh, Gp, Mem)
+
+ ASMJIT_INST_2x(ldaxr, Ldaxr, Gp, Mem)
+ ASMJIT_INST_2x(ldaxrb, Ldaxrb, Gp, Mem)
+ ASMJIT_INST_2x(ldaxrh, Ldaxrh, Gp, Mem)
+
+ ASMJIT_INST_3x(ldclr, Ldclr, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclra, Ldclra, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrab, Ldclrab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrah, Ldclrah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclral, Ldclral, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclralb, Ldclralb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclralh, Ldclralh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrb, Ldclrb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrh, Ldclrh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrl, Ldclrl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrlb, Ldclrlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldclrlh, Ldclrlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldeor, Ldeor, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeora, Ldeora, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorab, Ldeorab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorah, Ldeorah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeoral, Ldeoral, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeoralb, Ldeoralb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeoralh, Ldeoralh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorb, Ldeorb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorh, Ldeorh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorl, Ldeorl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorlb, Ldeorlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldeorlh, Ldeorlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldlar, Ldlar, Gp, Mem)
+ ASMJIT_INST_2x(ldlarb, Ldlarb, Gp, Mem)
+ ASMJIT_INST_2x(ldlarh, Ldlarh, Gp, Mem)
+
+ ASMJIT_INST_3x(ldnp, Ldnp, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldp, Ldp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldpsw, Ldpsw, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldr, Ldr, Gp, Mem)
+ ASMJIT_INST_2x(ldrb, Ldrb, Gp, Mem)
+ ASMJIT_INST_2x(ldrh, Ldrh, Gp, Mem)
+ ASMJIT_INST_2x(ldrsb, Ldrsb, Gp, Mem)
+ ASMJIT_INST_2x(ldrsh, Ldrsh, Gp, Mem)
+ ASMJIT_INST_2x(ldrsw, Ldrsw, Gp, Mem)
+
+ ASMJIT_INST_3x(ldset, Ldset, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldseta, Ldseta, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetab, Ldsetab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetah, Ldsetah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetal, Ldsetal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetalb, Ldsetalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetalh, Ldsetalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetb, Ldsetb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldseth, Ldseth, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetl, Ldsetl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetlb, Ldsetlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsetlh, Ldsetlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldsmax, Ldsmax, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxa, Ldsmaxa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxab, Ldsmaxab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxah, Ldsmaxah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxal, Ldsmaxal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxalb, Ldsmaxalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxalh, Ldsmaxalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxb, Ldsmaxb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxh, Ldsmaxh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxl, Ldsmaxl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxlb, Ldsmaxlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmaxlh, Ldsmaxlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldsmin, Ldsmin, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsmina, Ldsmina, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminab, Ldsminab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminah, Ldsminah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminal, Ldsminal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminalb, Ldsminalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminalh, Ldsminalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminb, Ldsminb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminh, Ldsminh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminl, Ldsminl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminlb, Ldsminlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldsminlh, Ldsminlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldtr, Ldtr, Gp, Mem)
+ ASMJIT_INST_2x(ldtrb, Ldtrb, Gp, Mem)
+ ASMJIT_INST_2x(ldtrh, Ldtrh, Gp, Mem)
+ ASMJIT_INST_2x(ldtrsb, Ldtrsb, Gp, Mem)
+ ASMJIT_INST_2x(ldtrsh, Ldtrsh, Gp, Mem)
+ ASMJIT_INST_2x(ldtrsw, Ldtrsw, Gp, Mem)
+
+ ASMJIT_INST_3x(ldumax, Ldumax, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxa, Ldumaxa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxab, Ldumaxab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxah, Ldumaxah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxal, Ldumaxal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxalb, Ldumaxalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxalh, Ldumaxalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxb, Ldumaxb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxh, Ldumaxh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxl, Ldumaxl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxlb, Ldumaxlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumaxlh, Ldumaxlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(ldumin, Ldumin, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldumina, Ldumina, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminab, Lduminab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminah, Lduminah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminal, Lduminal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminalb, Lduminalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminalh, Lduminalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminb, Lduminb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminh, Lduminh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminl, Lduminl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminlb, Lduminlb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(lduminlh, Lduminlh, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldur, Ldur, Gp, Mem)
+ ASMJIT_INST_2x(ldurb, Ldurb, Gp, Mem)
+ ASMJIT_INST_2x(ldurh, Ldurh, Gp, Mem)
+ ASMJIT_INST_2x(ldursb, Ldursb, Gp, Mem)
+ ASMJIT_INST_2x(ldursh, Ldursh, Gp, Mem)
+ ASMJIT_INST_2x(ldursw, Ldursw, Gp, Mem)
+
+ ASMJIT_INST_3x(ldxp, Ldxp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(ldaxp, Ldaxp, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(ldxr, Ldxr, Gp, Mem)
+ ASMJIT_INST_2x(ldxrb, Ldxrb, Gp, Mem)
+ ASMJIT_INST_2x(ldxrh, Ldxrh, Gp, Mem)
+
+ ASMJIT_INST_2x(prfm, Prfm, Imm, Mem)
+
+ ASMJIT_INST_2x(stadd, Stadd, Gp, Mem)
+ ASMJIT_INST_2x(staddb, Staddb, Gp, Mem)
+ ASMJIT_INST_2x(staddh, Staddh, Gp, Mem)
+ ASMJIT_INST_2x(staddl, Staddl, Gp, Mem)
+ ASMJIT_INST_2x(staddlb, Staddlb, Gp, Mem)
+ ASMJIT_INST_2x(staddlh, Staddlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stclr, Stclr, Gp, Mem)
+ ASMJIT_INST_2x(stclrb, Stclrb, Gp, Mem)
+ ASMJIT_INST_2x(stclrh, Stclrh, Gp, Mem)
+ ASMJIT_INST_2x(stclrl, Stclrl, Gp, Mem)
+ ASMJIT_INST_2x(stclrlb, Stclrlb, Gp, Mem)
+ ASMJIT_INST_2x(stclrlh, Stclrlh, Gp, Mem)
+
+ ASMJIT_INST_2x(steor, Steor, Gp, Mem)
+ ASMJIT_INST_2x(steorb, Steorb, Gp, Mem)
+ ASMJIT_INST_2x(steorh, Steorh, Gp, Mem)
+ ASMJIT_INST_2x(steorl, Steorl, Gp, Mem)
+ ASMJIT_INST_2x(steorlb, Steorlb, Gp, Mem)
+ ASMJIT_INST_2x(steorlh, Steorlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stllr, Stllr, Gp, Mem)
+ ASMJIT_INST_2x(stllrb, Stllrb, Gp, Mem)
+ ASMJIT_INST_2x(stllrh, Stllrh, Gp, Mem)
+
+ ASMJIT_INST_2x(stlr, Stllr, Gp, Mem)
+ ASMJIT_INST_2x(stlrb, Stllrb, Gp, Mem)
+ ASMJIT_INST_2x(stlrh, Stllrh, Gp, Mem)
+
+ ASMJIT_INST_3x(stlxr, Stlxr, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stlxrb, Stlxrb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stlxrh, Stlxrh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(stnp, Stnp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stp, Stp, Gp, Gp, Mem)
+
+ ASMJIT_INST_2x(str, Str, Gp, Mem)
+ ASMJIT_INST_2x(strb, Strb, Gp, Mem)
+ ASMJIT_INST_2x(strh, Strh, Gp, Mem)
+
+ ASMJIT_INST_2x(stset, Stset, Gp, Mem)
+ ASMJIT_INST_2x(stsetb, Stsetb, Gp, Mem)
+ ASMJIT_INST_2x(stseth, Stseth, Gp, Mem)
+ ASMJIT_INST_2x(stsetl, Stsetl, Gp, Mem)
+ ASMJIT_INST_2x(stsetlb, Stsetlb, Gp, Mem)
+ ASMJIT_INST_2x(stsetlh, Stsetlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stsmax, Stsmax, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxb, Stsmaxb, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxh, Stsmaxh, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxl, Stsmaxl, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxlb, Stsmaxlb, Gp, Mem)
+ ASMJIT_INST_2x(stsmaxlh, Stsmaxlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stsmin, Stsmin, Gp, Mem)
+ ASMJIT_INST_2x(stsminb, Stsminb, Gp, Mem)
+ ASMJIT_INST_2x(stsminh, Stsminh, Gp, Mem)
+ ASMJIT_INST_2x(stsminl, Stsminl, Gp, Mem)
+ ASMJIT_INST_2x(stsminlb, Stsminlb, Gp, Mem)
+ ASMJIT_INST_2x(stsminlh, Stsminlh, Gp, Mem)
+
+ ASMJIT_INST_2x(sttr, Sttr, Gp, Mem)
+ ASMJIT_INST_2x(sttrb, Sttrb, Gp, Mem)
+ ASMJIT_INST_2x(sttrh, Sttrh, Gp, Mem)
+
+ ASMJIT_INST_2x(stumax, Stumax, Gp, Mem)
+ ASMJIT_INST_2x(stumaxb, Stumaxb, Gp, Mem)
+ ASMJIT_INST_2x(stumaxh, Stumaxh, Gp, Mem)
+ ASMJIT_INST_2x(stumaxl, Stumaxl, Gp, Mem)
+ ASMJIT_INST_2x(stumaxlb, Stumaxlb, Gp, Mem)
+ ASMJIT_INST_2x(stumaxlh, Stumaxlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stumin, Stumin, Gp, Mem)
+ ASMJIT_INST_2x(stuminb, Stuminb, Gp, Mem)
+ ASMJIT_INST_2x(stuminh, Stuminh, Gp, Mem)
+ ASMJIT_INST_2x(stuminl, Stuminl, Gp, Mem)
+ ASMJIT_INST_2x(stuminlb, Stuminlb, Gp, Mem)
+ ASMJIT_INST_2x(stuminlh, Stuminlh, Gp, Mem)
+
+ ASMJIT_INST_2x(stur, Stur, Gp, Mem)
+ ASMJIT_INST_2x(sturb, Sturb, Gp, Mem)
+ ASMJIT_INST_2x(sturh, Sturh, Gp, Mem)
+
+ ASMJIT_INST_4x(stxp, Stxp, Gp, Gp, Gp, Mem)
+ ASMJIT_INST_4x(stlxp, Stlxp, Gp, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(stxr, Stxr, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stxrb, Stxrb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(stxrh, Stxrh, Gp, Gp, Mem)
+
+ ASMJIT_INST_3x(swp, Swp, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpa, Swpa, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpab, Swpab, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpah, Swpah, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpal, Swpal, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpalb, Swpalb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpalh, Swpalh, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpb, Swpb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swph, Swph, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swpl, Swpl, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swplb, Swplb, Gp, Gp, Mem)
+ ASMJIT_INST_3x(swplh, Swplh, Gp, Gp, Mem)
+ //! \}
+
+ //! \name BTI Instructions
+ //! \{
+
+ ASMJIT_INST_1x(bti, Bti, Imm)
+
+ //! \}
+
+ //! \name CHK Instructions
+ //! \{
+
+ ASMJIT_INST_1x(chkfeat, Chkfeat, Gp)
+
+ //! \}
+
+ //! \name CLRBHB Instructions
+ //! \{
+
+ ASMJIT_INST_0x(clrbhb, Clrbhb)
+
+ //! \}
+
+ //! \name CRC Instructions (ARMv8.1-A, optional in ARMv8.0-A)
+ //! \{
+
+ ASMJIT_INST_3x(crc32b, Crc32b, Gp, Gp, Gp)
+ ASMJIT_INST_3x(crc32h, Crc32h, Gp, Gp, Gp)
+ ASMJIT_INST_3x(crc32w, Crc32w, Gp, Gp, Gp)
+ ASMJIT_INST_3x(crc32x, Crc32x, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(crc32cb, Crc32cb, Gp, Gp, Gp)
+ ASMJIT_INST_3x(crc32ch, Crc32ch, Gp, Gp, Gp)
+ ASMJIT_INST_3x(crc32cw, Crc32cw, Gp, Gp, Gp)
+ ASMJIT_INST_3x(crc32cx, Crc32cx, Gp, Gp, Gp)
+
+ //! \}
+
+ //! \name CSSC Instructions
+ //! \{
+
+ ASMJIT_INST_2x(abs, Abs, Gp, Gp)
+ ASMJIT_INST_2x(cnt, Cnt, Gp, Gp)
+ ASMJIT_INST_2x(ctz, Ctz, Gp, Gp)
+ ASMJIT_INST_3x(smax, Smax, Gp, Gp, Gp)
+ ASMJIT_INST_3x(smax, Smax, Gp, Gp, Imm)
+ ASMJIT_INST_3x(smin, Smin, Gp, Gp, Gp)
+ ASMJIT_INST_3x(smin, Smin, Gp, Gp, Imm)
+ ASMJIT_INST_3x(umax, Umax, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umax, Umax, Gp, Gp, Imm)
+ ASMJIT_INST_3x(umin, Umin, Gp, Gp, Gp)
+ ASMJIT_INST_3x(umin, Umin, Gp, Gp, Imm)
+
+ //! \}
+
+ //! \name DGH Instructions
+ //! \{
+
+ ASMJIT_INST_0x(dgh, Dgh)
+
+ //! \}
+
+ //! \name FLAGM Instructions
+ //! \{
+
+ ASMJIT_INST_0x(cfinv, Cfinv)
+ ASMJIT_INST_1x(setf8, Setf8, Gp)
+ ASMJIT_INST_1x(setf16, Setf16, Gp)
+
+ //! \}
+
+ //! \name FLAGM2 Instructions
+ //! \{
+
+ ASMJIT_INST_0x(axflag, Axflag)
+ ASMJIT_INST_0x(xaflag, Xaflag)
+
+ //! \}
+
+ //! \name HBC Instructions
+ //! \{
+
+ ASMJIT_INST_1cc(bc, Bc, Imm)
+ ASMJIT_INST_1cc(bc, Bc, Label)
+
+ //! \}
+
+ //! \name MTE Instructions
+ //! \{
+
+ ASMJIT_INST_2x(autda, Autda, Gp, Gp)
+ ASMJIT_INST_2x(autdb, Autdb, Gp, Gp)
+ ASMJIT_INST_1x(autdza, Autdza, Gp)
+ ASMJIT_INST_1x(autdzb, Autdzb, Gp)
+ ASMJIT_INST_2x(autia, Autia, Gp, Gp)
+ ASMJIT_INST_0x(autia1716, Autia1716)
+ ASMJIT_INST_0x(autiasp, Autiasp)
+ ASMJIT_INST_0x(autiaz, Autiaz)
+ ASMJIT_INST_2x(autib, Autib, Gp, Gp)
+ ASMJIT_INST_0x(autib1716, Autib1716)
+ ASMJIT_INST_0x(autibsp, Autibsp)
+ ASMJIT_INST_0x(autibz, Autibz)
+ ASMJIT_INST_1x(autiza, Autiza, Gp)
+ ASMJIT_INST_1x(autizb, Autizb, Gp)
+
+ ASMJIT_INST_3x(gmi, Gmi, Gp, Gp, Gp)
+
+ ASMJIT_INST_2x(cmpp, Cmpp, Gp, Gp)
+ ASMJIT_INST_4x(addg, Addg, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_2x(ldg, Ldg, Gp, Mem)
+ ASMJIT_INST_2x(ldgm, Ldgm, Gp, Mem)
+ ASMJIT_INST_2x(ldraa, Ldraa, Gp, Mem)
+ ASMJIT_INST_2x(ldrab, Ldrab, Gp, Mem)
+
+ ASMJIT_INST_2x(pacda, Pacda, Gp, Gp)
+ ASMJIT_INST_2x(pacdb, Pacdb, Gp, Gp)
+ ASMJIT_INST_1x(pacdza, Pacdza, Gp)
+ ASMJIT_INST_1x(pacdzb, Pacdzb, Gp)
+ ASMJIT_INST_3x(pacga, Pacga, Gp, Gp, Gp)
+
+ ASMJIT_INST_3x(subp, Subp, Gp, Gp, Gp)
+ ASMJIT_INST_3x(subps, Subps, Gp, Gp, Gp)
+ ASMJIT_INST_4x(subg, Subg, Gp, Gp, Imm, Imm)
+
+ ASMJIT_INST_2x(st2g, St2g, Gp, Mem)
+ ASMJIT_INST_2x(stg, Stg, Gp, Mem)
+ ASMJIT_INST_3x(stgp, Stgp, Gp, Gp, Mem)
+ ASMJIT_INST_2x(stgm, Stgm, Gp, Mem)
+ ASMJIT_INST_2x(stzg, Stzg, Gp, Mem)
+ ASMJIT_INST_2x(stz2g, Stz2g, Gp, Mem)
+ ASMJIT_INST_2x(stzgm, Stzgm, Gp, Mem)
+
+ ASMJIT_INST_1x(xpacd, Xpacd, Gp)
+ ASMJIT_INST_1x(xpaci, Xpaci, Gp)
+ ASMJIT_INST_0x(xpaclri, Xpaclri)
+
+ //! \}
+
+ //! \name Hint Instructions
+ //! \{
+
+ ASMJIT_INST_1x(hint, Hint, Imm)
+ ASMJIT_INST_0x(nop, Nop)
+ ASMJIT_INST_0x(sev, Sev)
+ ASMJIT_INST_0x(sevl, Sevl)
+ ASMJIT_INST_0x(wfe, Wfe)
+ ASMJIT_INST_0x(wfi, Wfi)
+ ASMJIT_INST_0x(yield, Yield)
+
+ //! \}
+
+ //! \name SIMD & FP Instructions
+ //! \{
+
+ ASMJIT_INST_2x(abs, Abs_v, Vec, Vec)
+ ASMJIT_INST_3x(add, Add_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(addhn, Addhn_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(addhn2, Addhn2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(addp, Addp_v, Vec, Vec)
+ ASMJIT_INST_3x(addp, Addp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(addv, Addv_v, Vec, Vec)
+ ASMJIT_INST_3x(and_, And_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(bic, Bic_v, Vec, Imm)
+ ASMJIT_INST_3x(bic, Bic_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(bic, Bic_v, Vec, Imm, Imm)
+ ASMJIT_INST_3x(bif, Bif_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(bit, Bit_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(bsl, Bsl_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(cls, Cls_v, Vec, Vec)
+ ASMJIT_INST_2x(clz, Clz_v, Vec, Vec)
+ ASMJIT_INST_3x(cmeq, Cmeq_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(cmeq, Cmeq_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(cmge, Cmge_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(cmge, Cmge_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(cmgt, Cmgt_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(cmgt, Cmgt_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(cmhi, Cmhi_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(cmhs, Cmhs_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(cmle, Cmle_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(cmlt, Cmlt_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(cmtst, Cmtst_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(cnt, Cnt_v, Vec, Vec)
+ ASMJIT_INST_2x(dup, Dup_v, Vec, Gp)
+ ASMJIT_INST_2x(dup, Dup_v, Vec, Vec)
+ ASMJIT_INST_3x(eor, Eor_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(ext, Ext_v, Vec, Vec, Vec, Imm)
+ ASMJIT_INST_3x(fabd, Fabd_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fabs, Fabs_v, Vec, Vec)
+ ASMJIT_INST_3x(facge, Facge_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(facgt, Facgt_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fadd, Fadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(faddp, Faddp_v, Vec, Vec)
+ ASMJIT_INST_3x(faddp, Faddp_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(fccmp, Fccmp_v, Vec, Vec, Imm, Imm)
+ ASMJIT_INST_4x(fccmpe, Fccmpe_v, Vec, Vec, Imm, Imm)
+ ASMJIT_INST_3x(fcmeq, Fcmeq_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fcmeq, Fcmeq_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(fcmge, Fcmge_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fcmge, Fcmge_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(fcmgt, Fcmgt_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fcmgt, Fcmgt_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(fcmle, Fcmle_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(fcmlt, Fcmlt_v, Vec, Vec, Imm)
+ ASMJIT_INST_2x(fcmp, Fcmp_v, Vec, Vec)
+ ASMJIT_INST_2x(fcmp, Fcmp_v, Vec, Imm)
+ ASMJIT_INST_2x(fcmpe, Fcmpe_v, Vec, Vec)
+ ASMJIT_INST_2x(fcmpe, Fcmpe_v, Vec, Imm)
+ ASMJIT_INST_4x(fcsel, Fcsel_v, Vec, Vec, Vec, Imm)
+ ASMJIT_INST_2x(fcvt, Fcvt_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtas, Fcvtas_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtas, Fcvtas_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtau, Fcvtau_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtau, Fcvtau_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtl, Fcvtl_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtl2, Fcvtl2_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtms, Fcvtms_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtms, Fcvtms_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtmu, Fcvtmu_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtmu, Fcvtmu_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtn, Fcvtn_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtn2, Fcvtn2_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtns, Fcvtns_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtns, Fcvtns_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtnu, Fcvtnu_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtnu, Fcvtnu_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtps, Fcvtps_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtps, Fcvtps_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtpu, Fcvtpu_v, Gp, Vec)
+ ASMJIT_INST_2x(fcvtpu, Fcvtpu_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtxn, Fcvtxn_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtxn2, Fcvtxn2_v, Vec, Vec)
+ ASMJIT_INST_2x(fcvtzs, Fcvtzs_v, Gp, Vec)
+ ASMJIT_INST_3x(fcvtzs, Fcvtzs_v, Gp, Vec, Imm)
+ ASMJIT_INST_2x(fcvtzs, Fcvtzs_v, Vec, Vec)
+ ASMJIT_INST_3x(fcvtzs, Fcvtzs_v, Vec, Vec, Imm)
+ ASMJIT_INST_2x(fcvtzu, Fcvtzu_v, Gp, Vec)
+ ASMJIT_INST_3x(fcvtzu, Fcvtzu_v, Gp, Vec, Imm)
+ ASMJIT_INST_2x(fcvtzu, Fcvtzu_v, Vec, Vec)
+ ASMJIT_INST_3x(fcvtzu, Fcvtzu_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(fdiv, Fdiv_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(fmadd, Fmadd_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmax, Fmax_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmaxnm, Fmaxnm_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmaxnmp, Fmaxnmp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fmaxnmp, Fmaxnmp_v, Vec, Vec)
+ ASMJIT_INST_2x(fmaxnmv, Fmaxnmv_v, Vec, Vec)
+ ASMJIT_INST_3x(fmaxp, Fmaxp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fmaxp, Fmaxp_v, Vec, Vec)
+ ASMJIT_INST_2x(fmaxv, Fmaxv_v, Vec, Vec)
+ ASMJIT_INST_3x(fmin, Fmin_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fminnm, Fminnm_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fminnmv, Fminnmv_v, Vec, Vec)
+ ASMJIT_INST_3x(fminnmp, Fminnmp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fminnmp, Fminnmp_v, Vec, Vec)
+ ASMJIT_INST_2x(fminp, Fminp_v, Vec, Vec)
+ ASMJIT_INST_3x(fminp, Fminp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fminv, Fminv_v, Vec, Vec)
+ ASMJIT_INST_3x(fmla, Fmla_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmls, Fmls_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fmov, Fmov_v, Gp, Vec)
+ ASMJIT_INST_2x(fmov, Fmov_v, Vec, Gp)
+ ASMJIT_INST_2x(fmov, Fmov_v, Vec, Vec)
+ ASMJIT_INST_2x(fmov, Fmov_v, Vec, Imm)
+ ASMJIT_INST_4x(fmsub, Fmsub_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmul, Fmul_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmulx, Fmulx_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fneg, Fneg_v, Vec, Vec)
+ ASMJIT_INST_4x(fnmadd, Fnmadd_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_4x(fnmsub, Fnmsub_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fnmul, Fnmul_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(frecpe, Frecpe_v, Vec, Vec)
+ ASMJIT_INST_3x(frecps, Frecps_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(frecpx, Frecpx_v, Vec, Vec)
+ ASMJIT_INST_2x(frint32x, Frint32x_v, Vec, Vec)
+ ASMJIT_INST_2x(frint32z, Frint32z_v, Vec, Vec)
+ ASMJIT_INST_2x(frint64x, Frint64x_v, Vec, Vec)
+ ASMJIT_INST_2x(frint64z, Frint64z_v, Vec, Vec)
+ ASMJIT_INST_2x(frinta, Frinta_v, Vec, Vec)
+ ASMJIT_INST_2x(frinti, Frinti_v, Vec, Vec)
+ ASMJIT_INST_2x(frintm, Frintm_v, Vec, Vec)
+ ASMJIT_INST_2x(frintn, Frintn_v, Vec, Vec)
+ ASMJIT_INST_2x(frintp, Frintp_v, Vec, Vec)
+ ASMJIT_INST_2x(frintx, Frintx_v, Vec, Vec)
+ ASMJIT_INST_2x(frintz, Frintz_v, Vec, Vec)
+ ASMJIT_INST_2x(frsqrte, Frsqrte_v, Vec, Vec)
+ ASMJIT_INST_3x(frsqrts, Frsqrts_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(fsqrt, Fsqrt_v, Vec, Vec)
+ ASMJIT_INST_3x(fsub, Fsub_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(ins, Ins_v, Vec, Gp)
+ ASMJIT_INST_2x(ins, Ins_v, Vec, Vec)
+ ASMJIT_INST_2x(ld1, Ld1_v, Vec, Mem)
+ ASMJIT_INST_3x(ld1, Ld1_v, Vec, Vec, Mem)
+ ASMJIT_INST_4x(ld1, Ld1_v, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_5x(ld1, Ld1_v, Vec, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_2x(ld1r, Ld1r_v, Vec, Mem)
+ ASMJIT_INST_3x(ld2, Ld2_v, Vec, Vec, Mem)
+ ASMJIT_INST_3x(ld2r, Ld2r_v, Vec, Vec, Mem)
+ ASMJIT_INST_4x(ld3, Ld3_v, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_4x(ld3r, Ld3r_v, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_5x(ld4, Ld4_v, Vec, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_5x(ld4r, Ld4r_v, Vec, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_3x(ldnp, Ldnp_v, Vec, Vec, Mem)
+ ASMJIT_INST_3x(ldp, Ldp_v, Vec, Vec, Mem)
+ ASMJIT_INST_2x(ldr, Ldr_v, Vec, Mem)
+ ASMJIT_INST_2x(ldur, Ldur_v, Vec, Mem)
+ ASMJIT_INST_3x(mla, Mla_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(mls, Mls_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(mov, Mov_v, Vec, Vec)
+ ASMJIT_INST_2x(mov, Mov_v, Gp, Vec)
+ ASMJIT_INST_2x(mov, Mov_v, Vec, Gp)
+ ASMJIT_INST_2x(movi, Movi_v, Vec, Imm)
+ ASMJIT_INST_3x(movi, Movi_v, Vec, Imm, Imm)
+ ASMJIT_INST_3x(mul, Mul_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(mvn, Mvn_v, Vec, Vec)
+ ASMJIT_INST_2x(mvn_, Mvn_v, Vec, Vec)
+ ASMJIT_INST_2x(mvni, Mvni_v, Vec, Imm)
+ ASMJIT_INST_3x(mvni, Mvni_v, Vec, Imm, Imm)
+ ASMJIT_INST_2x(neg, Neg_v, Vec, Vec)
+ ASMJIT_INST_2x(not_, Not_v, Vec, Vec)
+ ASMJIT_INST_3x(orn, Orn_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(orr, Orr_v, Vec, Imm)
+ ASMJIT_INST_3x(orr, Orr_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(orr, Orr_v, Vec, Imm, Imm)
+ ASMJIT_INST_3x(pmul, Pmul_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(pmull, Pmull_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(pmull2, Pmull2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(raddhn, Raddhn_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(raddhn2, Raddhn2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(rbit, Rbit_v, Vec, Vec)
+ ASMJIT_INST_2x(rev16, Rev16_v, Vec, Vec)
+ ASMJIT_INST_2x(rev32, Rev32_v, Vec, Vec)
+ ASMJIT_INST_2x(rev64, Rev64_v, Vec, Vec)
+ ASMJIT_INST_3x(rshrn, Rshrn_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(rshrn2, Rshrn2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(rsubhn, Rsubhn_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(rsubhn2, Rsubhn2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(saba, Saba_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sabal, Sabal_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sabal2, Sabal2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sabd, Sabd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sabdl, Sabdl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sabdl2, Sabdl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sadalp, Sadalp_v, Vec, Vec)
+ ASMJIT_INST_3x(saddl, Saddl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(saddl2, Saddl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(saddlp, Saddlp_v, Vec, Vec)
+ ASMJIT_INST_2x(saddlv, Saddlv_v, Vec, Vec)
+ ASMJIT_INST_3x(saddw, Saddw_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(saddw2, Saddw2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(scvtf, Scvtf_v, Vec, Gp)
+ ASMJIT_INST_3x(scvtf, Scvtf_v, Vec, Gp, Imm)
+ ASMJIT_INST_2x(scvtf, Scvtf_v, Vec, Vec)
+ ASMJIT_INST_3x(scvtf, Scvtf_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(shadd, Shadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(shl, Shl_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(shll, Shll_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(shll2, Shll2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(shrn, Shrn_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(shrn2, Shrn2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(shsub, Shsub_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sli, Sli_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(smax, Smax_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(smaxp, Smaxp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(smaxv, Smaxv_v, Vec, Vec)
+ ASMJIT_INST_3x(smin, Smin_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sminp, Sminp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sminv, Sminv_v, Vec, Vec)
+ ASMJIT_INST_3x(smlal, Smlal_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(smlal2, Smlal2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(smlsl, Smlsl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(smlsl2, Smlsl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(smov, Smov_v, Gp, Vec)
+ ASMJIT_INST_3x(smull, Smull_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(smull2, Smull2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sqabs, Sqabs_v, Vec, Vec)
+ ASMJIT_INST_3x(sqadd, Sqadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmlal, Sqdmlal_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmlal2, Sqdmlal2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmlsl, Sqdmlsl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmlsl2, Sqdmlsl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmulh, Sqdmulh_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmull, Sqdmull_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqdmull2, Sqdmull2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sqneg, Sqneg_v, Vec, Vec)
+ ASMJIT_INST_3x(sqrdmulh, Sqrdmulh_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqrshl, Sqrshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqrshrn, Sqrshrn_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqrshrn2, Sqrshrn2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqrshrun, Sqrshrun_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqrshrun2, Sqrshrun2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqshl, Sqshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqshl, Sqshl_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqshlu, Sqshlu_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqshrn, Sqshrn_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqshrn2, Sqshrn2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqshrun, Sqshrun_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqshrun2, Sqshrun2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sqsub, Sqsub_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sqxtn, Sqxtn_v, Vec, Vec)
+ ASMJIT_INST_2x(sqxtn2, Sqxtn2_v, Vec, Vec)
+ ASMJIT_INST_2x(sqxtun, Sqxtun_v, Vec, Vec)
+ ASMJIT_INST_2x(sqxtun2, Sqxtun2_v, Vec, Vec)
+ ASMJIT_INST_3x(srhadd, Srhadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sri, Sri_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(srshl, Srshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(srshr, Srshr_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(srsra, Srsra_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sshl, Sshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sshll, Sshll_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sshll2, Sshll2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(sshr, Sshr_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(ssra, Ssra_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(ssubl, Ssubl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(ssubl2, Ssubl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(ssubw, Ssubw_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(ssubw2, Ssubw2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(st1, St1_v, Vec, Mem)
+ ASMJIT_INST_3x(st1, St1_v, Vec, Vec, Mem)
+ ASMJIT_INST_4x(st1, St1_v, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_5x(st1, St1_v, Vec, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_3x(st2, St2_v, Vec, Vec, Mem)
+ ASMJIT_INST_4x(st3, St3_v, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_5x(st4, St4_v, Vec, Vec, Vec, Vec, Mem)
+ ASMJIT_INST_3x(stnp, Stnp_v, Vec, Vec, Mem)
+ ASMJIT_INST_3x(stp, Stp_v, Vec, Vec, Mem)
+ ASMJIT_INST_2x(str, Str_v, Vec, Mem)
+ ASMJIT_INST_2x(stur, Stur_v, Vec, Mem)
+ ASMJIT_INST_3x(sub, Sub_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(subhn, Subhn_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(subhn2, Subhn2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(suqadd, Suqadd_v, Vec, Vec)
+ ASMJIT_INST_2x(sxtl, Sxtl_v, Vec, Vec)
+ ASMJIT_INST_2x(sxtl2, Sxtl2_v, Vec, Vec)
+ ASMJIT_INST_3x(tbl, Tbl_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(tbl, Tbl_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_5x(tbl, Tbl_v, Vec, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_6x(tbl, Tbl_v, Vec, Vec, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(tbx, Tbx_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(tbx, Tbx_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_5x(tbx, Tbx_v, Vec, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_6x(tbx, Tbx_v, Vec, Vec, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(trn1, Trn1_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(trn2, Trn2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uaba, Uaba_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uabal, Uabal_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uabal2, Uabal2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uabd, Uabd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uabdl, Uabdl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uabdl2, Uabdl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(uadalp, Uadalp_v, Vec, Vec)
+ ASMJIT_INST_3x(uaddl, Uaddl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uaddl2, Uaddl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(uaddlp, Uaddlp_v, Vec, Vec)
+ ASMJIT_INST_2x(uaddlv, Uaddlv_v, Vec, Vec)
+ ASMJIT_INST_3x(uaddw, Uaddw_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uaddw2, Uaddw2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(ucvtf, Ucvtf_v, Vec, Gp)
+ ASMJIT_INST_3x(ucvtf, Ucvtf_v, Vec, Gp, Imm)
+ ASMJIT_INST_2x(ucvtf, Ucvtf_v, Vec, Vec)
+ ASMJIT_INST_3x(ucvtf, Ucvtf_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uhadd, Uhadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uhsub, Uhsub_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(umax, Umax_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(umaxp, Umaxp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(umaxv, Umaxv_v, Vec, Vec)
+ ASMJIT_INST_3x(umin, Umin_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uminp, Uminp_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(uminv, Uminv_v, Vec, Vec)
+ ASMJIT_INST_3x(umlal, Umlal_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(umlal2, Umlal2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(umlsl, Umlsl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(umlsl2, Umlsl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(umov, Umov_v, Gp, Vec)
+ ASMJIT_INST_3x(umull, Umull_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(umull2, Umull2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uqadd, Uqadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uqrshl, Uqrshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uqrshl, Uqrshl_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uqrshrn, Uqrshrn_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uqrshrn2, Uqrshrn2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uqshl, Uqshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uqshl, Uqshl_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uqshrn, Uqshrn_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uqshrn2, Uqshrn2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(uqsub, Uqsub_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(uqxtn, Uqxtn_v, Vec, Vec)
+ ASMJIT_INST_2x(uqxtn2, Uqxtn2_v, Vec, Vec)
+ ASMJIT_INST_2x(urecpe, Urecpe_v, Vec, Vec)
+ ASMJIT_INST_3x(urhadd, Urhadd_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(urshl, Urshl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(urshr, Urshr_v, Vec, Vec, Imm)
+ ASMJIT_INST_2x(ursqrte, Ursqrte_v, Vec, Vec)
+ ASMJIT_INST_3x(ursra, Ursra_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(ushl, Ushl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(ushll, Ushll_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(ushll2, Ushll2_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(ushr, Ushr_v, Vec, Vec, Imm)
+ ASMJIT_INST_2x(usqadd, Usqadd_v, Vec, Vec)
+ ASMJIT_INST_3x(usra, Usra_v, Vec, Vec, Imm)
+ ASMJIT_INST_3x(usubl, Usubl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(usubl2, Usubl2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(usubw, Usubw_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(usubw2, Usubw2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(uxtl, Uxtl_v, Vec, Vec)
+ ASMJIT_INST_2x(uxtl2, Uxtl2_v, Vec, Vec)
+ ASMJIT_INST_3x(uzp1, Uzp1_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(uzp2, Uzp2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(xtn, Xtn_v, Vec, Vec)
+ ASMJIT_INST_2x(xtn2, Xtn2_v, Vec, Vec)
+ ASMJIT_INST_3x(zip1, Zip1_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(zip2, Zip2_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name AES Instructions
+ //! \{
+
+ ASMJIT_INST_2x(aesd, Aesd_v, Vec, Vec)
+ ASMJIT_INST_2x(aese, Aese_v, Vec, Vec)
+ ASMJIT_INST_2x(aesimc, Aesimc_v, Vec, Vec)
+ ASMJIT_INST_2x(aesmc, Aesmc_v, Vec, Vec)
+
+ //! \}
+
+ //! \name SHA1 Instructions
+ //! \{
+
+ ASMJIT_INST_3x(sha1c, Sha1c_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sha1h, Sha1h_v, Vec, Vec)
+ ASMJIT_INST_3x(sha1m, Sha1m_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sha1p, Sha1p_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sha1su0, Sha1su0_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sha1su1, Sha1su1_v, Vec, Vec)
+
+ //! \}
+
+ //! \name SHA2 Instructions
+ //! \{
+
+ ASMJIT_INST_3x(sha256h, Sha256h_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sha256h2, Sha256h2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sha256su0, Sha256su0_v, Vec, Vec)
+ ASMJIT_INST_3x(sha256su1, Sha256su1_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name RDMA Instructions (ARMv8.1-A)
+ //! \{
+
+ ASMJIT_INST_3x(sqrdmlah, Sqrdmlah_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sqrdmlsh, Sqrdmlsh_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name FCMA Instruction (ARMv8.3-A)
+ //! \{
+
+ ASMJIT_INST_4x(fcadd, Fcadd_v, Vec, Vec, Vec, Imm)
+ ASMJIT_INST_4x(fcmla, Fcmla_v, Vec, Vec, Vec, Imm)
+
+ //! \}
+
+ //! \name JSCVT Instruction (ARMv8.3-A)
+ //! \{
+
+ ASMJIT_INST_2x(fjcvtzs, Fjcvtzs_v, Gp, Vec)
+
+ //! \}
+
+ //! \name FHM Instructions
+ //! \{
+
+ ASMJIT_INST_3x(fmlal, Fmlal_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmlal2, Fmlal2_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmlsl, Fmlsl_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(fmlsl2, Fmlsl2_v, Vec, Vec, Vec)
+
+
+ //! \}
+
+ //! \name SHA3 Instructions (ARMv8.4-A, optional in ARMv8.2-A)
+ //! \{
+
+ ASMJIT_INST_4x(bcax, Bcax_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_4x(eor3, Eor3_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(rax1, Rax1_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(xar, Xar_v, Vec, Vec, Vec, Imm)
+
+ //! \}
+
+ //! \name SHA512 Instructions (ARMv8.4-A)
+ //! \{
+
+ ASMJIT_INST_3x(sha512h, Sha512h_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sha512h2, Sha512h2_v, Vec, Vec, Vec)
+ ASMJIT_INST_2x(sha512su0, Sha512su0_v, Vec, Vec)
+ ASMJIT_INST_3x(sha512su1, Sha512su1_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name SM3 Instructions (ARMv8.4-A)
+ //! \{
+
+ ASMJIT_INST_3x(sm3partw1, Sm3partw1_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sm3partw2, Sm3partw2_v, Vec, Vec, Vec)
+ ASMJIT_INST_4x(sm3ss1, Sm3ss1_v, Vec, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sm3tt1a, Sm3tt1a_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sm3tt1b, Sm3tt1b_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sm3tt2a, Sm3tt2a_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sm3tt2b, Sm3tt2b_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name SM4 Instructions (ARMv8.4-A)
+ //! \{
+
+ ASMJIT_INST_2x(sm4e, Sm4e_v, Vec, Vec)
+ ASMJIT_INST_3x(sm4ekey, Sm4ekey_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name DOTPROD Instructions (ARMv8.4-A, optional in ARMv8.2-A)
+ //! \{
+
+ ASMJIT_INST_3x(sdot, Sdot_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(udot, Udot_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name BF16 Instructions (ARMv8.6-A)
+ //! \{
+
+ ASMJIT_INST_2x(bfcvt, Bfcvt_v, Vec, Vec)
+ ASMJIT_INST_2x(bfcvtn, Bfcvtn_v, Vec, Vec)
+ ASMJIT_INST_2x(bfcvtn2, Bfcvtn2_v, Vec, Vec)
+ ASMJIT_INST_3x(bfmlalb, Bfmlalb_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(bfmlalt, Bfmlalt_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(bfmmla, Bfmmla_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(bfdot, Bfdot_v, Vec, Vec, Vec)
+
+ //! \}
+
+ //! \name I8MM Instructions (ARMv8.6-A)
+ //! \{
+
+ ASMJIT_INST_3x(smmla, Smmla_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(sudot, Sudot_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(ummla, Ummla_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(usdot, Usdot_v, Vec, Vec, Vec)
+ ASMJIT_INST_3x(usmmla, Usmmla_v, Vec, Vec, Vec)
+
+ //! \}
+};
+
+//! Emitter (AArch64).
+//!
+//! \note This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
+//! `a64::Assembler`, `a64::Builder`, or `a64::Compiler` (use with caution with `a64::Compiler` as it requires
+//! virtual registers).
+class Emitter : public BaseEmitter, public EmitterExplicitT<Emitter> {
+ ASMJIT_NONCONSTRUCTIBLE(Emitter)
+};
+
+//! \}
+
+#undef ASMJIT_INST_0x
+#undef ASMJIT_INST_1x
+#undef ASMJIT_INST_2x
+#undef ASMJIT_INST_3x
+#undef ASMJIT_INST_4x
+#undef ASMJIT_INST_5x
+#undef ASMJIT_INST_6x
+#undef ASMJIT_INST_1cc
+
+ASMJIT_END_SUB_NAMESPACE
+
+// Restore undefined MSVC AArch64 macros.
+#if defined(ASMJIT_RESTORE_MSVC_AARCH64_MACROS)
+ #pragma pop_macro("mvn")
+#endif
+
+#endif // ASMJIT_ARM_A64EMITTER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64formatter.cpp b/3rdparty/asmjit/asmjit/arm/a64formatter.cpp
new file mode 100644
index 00000000000..76fd7eb33ed
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64formatter.cpp
@@ -0,0 +1,66 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_LOGGING)
+
+#include <asmjit/core/misc_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/a64formatter_p.h>
+#include <asmjit/arm/a64instapi_p.h>
+#include <asmjit/arm/a64instdb_p.h>
+#include <asmjit/arm/a64operand.h>
+
+#ifndef ASMJIT_NO_COMPILER
+ #include <asmjit/core/compiler.h>
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::FormatterInternal - Format Instruction
+// ===========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_instruction(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept {
+
+ // Format instruction options and instruction mnemonic.
+ InstId inst_id = inst.real_id();
+ if (inst_id != Inst::kIdNone && inst_id < Inst::_kIdCount) {
+ InstStringifyOptions stringify_options =
+ Support::test(format_flags, FormatFlags::kShowAliases)
+ ? InstStringifyOptions::kAliases
+ : InstStringifyOptions::kNone;
+ ASMJIT_PROPAGATE(InstInternal::inst_id_to_string(inst_id, stringify_options, sb));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append_format("[InstId=#%u]", unsigned(inst_id)));
+ }
+
+ CondCode cc = inst.arm_cond_code();
+ if (cc != CondCode::kAL) {
+ ASMJIT_PROPAGATE(sb.append('.'));
+ ASMJIT_PROPAGATE(format_cond_code(sb, cc));
+ }
+
+ for (size_t i = 0u; i < operands.size(); i++) {
+ const Operand_& op = operands[i];
+ if (op.is_none()) {
+ break;
+ }
+
+ ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
+ ASMJIT_PROPAGATE(format_operand(sb, format_flags, emitter, arch, op));
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/asmjit/arm/a64formatter_p.h b/3rdparty/asmjit/asmjit/arm/a64formatter_p.h
new file mode 100644
index 00000000000..39af75a67e9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64formatter_p.h
@@ -0,0 +1,43 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
+#define ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_LOGGING
+
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/string.h>
+#include <asmjit/support/span.h>
+#include <asmjit/arm/armformatter_p.h>
+#include <asmjit/arm/a64globals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+namespace FormatterInternal {
+
+using namespace arm::FormatterInternal;
+
+Error ASMJIT_CDECL format_instruction(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept;
+
+} // {FormatterInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
+#endif // ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64func.cpp b/3rdparty/asmjit/asmjit/arm/a64func.cpp
new file mode 100644
index 00000000000..afa05a8e2d6
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64func.cpp
@@ -0,0 +1,212 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/arm/a64func_p.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+namespace FuncInternal {
+
+static inline bool should_treat_as_cdecl(CallConvId call_conv_id) noexcept {
+ return call_conv_id == CallConvId::kCDecl ||
+ call_conv_id == CallConvId::kStdCall ||
+ call_conv_id == CallConvId::kFastCall ||
+ call_conv_id == CallConvId::kVectorCall ||
+ call_conv_id == CallConvId::kThisCall ||
+ call_conv_id == CallConvId::kRegParm1 ||
+ call_conv_id == CallConvId::kRegParm2 ||
+ call_conv_id == CallConvId::kRegParm3;
+}
+
+static RegType reg_type_from_fp_or_vec_type_id(TypeId type_id) noexcept {
+ if (type_id == TypeId::kFloat32) {
+ return RegType::kVec32;
+ }
+ else if (type_id == TypeId::kFloat64) {
+ return RegType::kVec64;
+ }
+ else if (TypeUtils::is_vec32(type_id)) {
+ return RegType::kVec32;
+ }
+ else if (TypeUtils::is_vec64(type_id)) {
+ return RegType::kVec64;
+ }
+ else if (TypeUtils::is_vec128(type_id)) {
+ return RegType::kVec128;
+ }
+ else {
+ return RegType::kNone;
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error init_call_conv(CallConv& cc, CallConvId call_conv_id, const Environment& environment) noexcept {
+ cc.set_arch(environment.arch());
+ cc.set_strategy(environment.is_darwin_abi() ? CallConvStrategy::kAArch64Apple : CallConvStrategy::kDefault);
+
+ cc.set_save_restore_reg_size(RegGroup::kGp, 8);
+ cc.set_save_restore_reg_size(RegGroup::kVec, 8);
+ cc.set_save_restore_alignment(RegGroup::kGp, 16);
+ cc.set_save_restore_alignment(RegGroup::kVec, 16);
+ cc.set_save_restore_alignment(RegGroup::kMask, 8);
+ cc.set_save_restore_alignment(RegGroup::kExtra, 1);
+ cc.set_passed_order(RegGroup::kGp, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_natural_stack_alignment(16);
+
+ if (should_treat_as_cdecl(call_conv_id)) {
+ // ARM doesn't have that many calling conventions as we can find in X86 world, treat most conventions as __cdecl.
+ cc.set_id(CallConvId::kCDecl);
+ cc.set_preserved_regs(RegGroup::kGp, Support::bit_mask<RegMask>(Gp::kIdOs, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
+ cc.set_preserved_regs(RegGroup::kVec, Support::bit_mask<RegMask>(8, 9, 10, 11, 12, 13, 14, 15));
+ }
+ else {
+ cc.set_id(call_conv_id);
+ cc.set_save_restore_reg_size(RegGroup::kVec, 16);
+ cc.set_preserved_regs(RegGroup::kGp, Support::bit_mask<RegMask>(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
+ cc.set_preserved_regs(RegGroup::kVec, Support::bit_mask<RegMask>(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31));
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error init_func_detail(FuncDetail& func, const FuncSignature& signature) noexcept {
+ Support::maybe_unused(signature);
+
+ const CallConv& cc = func.call_conv();
+ uint32_t arg_count = func.arg_count();
+ uint32_t stack_offset = 0;
+
+ // Minimum stack size of a single argument passed via stack. The standard AArch64 calling convention
+ // specifies 8 bytes, so each function argument would occupy at least 8 bytes even if it needs less.
+ // However, Apple has decided to not follow this rule and function argument can occupy less, for
+ // example two consecutive 32-bit arguments would occupy 8 bytes total, instead of 16 as specified
+ // by ARM.
+ uint32_t min_stack_arg_size = cc.strategy() == CallConvStrategy::kAArch64Apple ? 4u : 8u;
+
+ if (func.has_ret()) {
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ TypeId type_id = func._rets[value_index].type_id();
+
+ // Terminate at the first void type (end of the pack).
+ if (type_id == TypeId::kVoid)
+ break;
+
+ switch (type_id) {
+ case TypeId::kInt8:
+ case TypeId::kInt16:
+ case TypeId::kInt32: {
+ func._rets[value_index].init_reg(RegType::kGp32, value_index, TypeId::kInt32);
+ break;
+ }
+
+ case TypeId::kUInt8:
+ case TypeId::kUInt16:
+ case TypeId::kUInt32: {
+ func._rets[value_index].init_reg(RegType::kGp32, value_index, TypeId::kUInt32);
+ break;
+ }
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64: {
+ func._rets[value_index].init_reg(RegType::kGp64, value_index, type_id);
+ break;
+ }
+
+ default: {
+ RegType reg_type = reg_type_from_fp_or_vec_type_id(type_id);
+ if (reg_type == RegType::kNone) {
+ return make_error(Error::kInvalidRegType);
+ }
+
+ func._rets[value_index].init_reg(reg_type, value_index, type_id);
+ break;
+ }
+ }
+ }
+ }
+
+ switch (cc.strategy()) {
+ case CallConvStrategy::kDefault:
+ case CallConvStrategy::kAArch64Apple: {
+ uint32_t gpz_pos = 0;
+ uint32_t vec_pos = 0;
+
+ for (uint32_t i = 0; i < arg_count; i++) {
+ FuncValue& arg = func._args[i][0];
+ TypeId type_id = arg.type_id();
+
+ if (TypeUtils::is_int(type_id)) {
+ uint32_t reg_id = Reg::kIdBad;
+
+ if (gpz_pos < CallConv::kMaxRegArgsPerGroup) {
+ reg_id = cc._passed_order[RegGroup::kGp].id[gpz_pos];
+ }
+
+ if (reg_id != Reg::kIdBad) {
+ RegType reg_type = type_id <= TypeId::kUInt32 ? RegType::kGp32 : RegType::kGp64;
+ arg.assign_reg_data(reg_type, reg_id);
+ func.add_used_regs(RegGroup::kGp, Support::bit_mask<RegMask>(reg_id));
+ gpz_pos++;
+ }
+ else {
+ uint32_t size = Support::max<uint32_t>(TypeUtils::size_of(type_id), min_stack_arg_size);
+ if (size >= 8) {
+ stack_offset = Support::align_up(stack_offset, 8);
+ }
+ arg.assign_stack_offset(int32_t(stack_offset));
+ stack_offset += size;
+ }
+ continue;
+ }
+
+ if (TypeUtils::is_float(type_id) || TypeUtils::is_vec(type_id)) {
+ uint32_t reg_id = Reg::kIdBad;
+
+ if (vec_pos < CallConv::kMaxRegArgsPerGroup) {
+ reg_id = cc._passed_order[RegGroup::kVec].id[vec_pos];
+ }
+
+ if (reg_id != Reg::kIdBad) {
+ RegType reg_type = reg_type_from_fp_or_vec_type_id(type_id);
+ if (reg_type == RegType::kNone) {
+ return make_error(Error::kInvalidRegType);
+ }
+
+ arg.init_type_id(type_id);
+ arg.assign_reg_data(reg_type, reg_id);
+ func.add_used_regs(RegGroup::kVec, Support::bit_mask<RegMask>(reg_id));
+ vec_pos++;
+ }
+ else {
+ uint32_t size = Support::max<uint32_t>(TypeUtils::size_of(type_id), min_stack_arg_size);
+ if (size >= 8) {
+ stack_offset = Support::align_up(stack_offset, 8);
+ }
+ arg.assign_stack_offset(int32_t(stack_offset));
+ stack_offset += size;
+ }
+ continue;
+ }
+ }
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidState);
+ }
+
+ func._arg_stack_size = Support::align_up(stack_offset, 8u);
+ return Error::kOk;
+}
+
+} // {FuncInternal}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit/arm/a64func_p.h b/3rdparty/asmjit/asmjit/arm/a64func_p.h
new file mode 100644
index 00000000000..a322a48845d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64func_p.h
@@ -0,0 +1,33 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64FUNC_P_H_INCLUDED
+#define ASMJIT_ARM_A64FUNC_P_H_INCLUDED
+
+#include <asmjit/core/func.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+//! AArch64-specific function API (calling conventions and other utilities).
+namespace FuncInternal {
+
+//! Initialize `CallConv` structure (AArch64 specific).
+Error init_call_conv(CallConv& cc, CallConvId call_conv_id, const Environment& environment) noexcept;
+
+//! Initialize `FuncDetail` (AArch64 specific).
+Error init_func_detail(FuncDetail& func, const FuncSignature& signature) noexcept;
+
+} // {FuncInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64FUNC_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64globals.h b/3rdparty/asmjit/asmjit/arm/a64globals.h
index 8093885b32c..9abf069506e 100644
--- a/3rdparty/asmjit/src/asmjit/arm/a64globals.h
+++ b/3rdparty/asmjit/asmjit/arm/a64globals.h
@@ -1,12 +1,12 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_ARM_A64GLOBALS_H_INCLUDED
#define ASMJIT_ARM_A64GLOBALS_H_INCLUDED
-#include "../arm/armglobals.h"
+#include <asmjit/arm/armglobals.h>
//! \namespace asmjit::a64
//! \ingroup asmjit_a64
@@ -21,11 +21,12 @@ ASMJIT_BEGIN_SUB_NAMESPACE(a64)
//! AArch64 instruction.
//!
//! \note Only used to hold ARM-specific enumerations and static functions.
-struct Inst {
+namespace Inst {
//! Instruction id.
enum Id : uint32_t {
// ${InstId:Begin}
kIdNone = 0, //!< Instruction ''.
+ kIdAbs, //!< Instruction 'abs'.
kIdAdc, //!< Instruction 'adc'.
kIdAdcs, //!< Instruction 'adcs'.
kIdAdd, //!< Instruction 'add'.
@@ -54,6 +55,7 @@ struct Inst {
kIdAutizb, //!< Instruction 'autizb'.
kIdAxflag, //!< Instruction 'axflag'.
kIdB, //!< Instruction 'b'.
+ kIdBc, //!< Instruction 'bc'.
kIdBfc, //!< Instruction 'bfc'.
kIdBfi, //!< Instruction 'bfi'.
kIdBfm, //!< Instruction 'bfm'.
@@ -64,6 +66,7 @@ struct Inst {
kIdBlr, //!< Instruction 'blr'.
kIdBr, //!< Instruction 'br'.
kIdBrk, //!< Instruction 'brk'.
+ kIdBti, //!< Instruction 'bti'.
kIdCas, //!< Instruction 'cas'.
kIdCasa, //!< Instruction 'casa'.
kIdCasab, //!< Instruction 'casab'.
@@ -85,8 +88,10 @@ struct Inst {
kIdCcmn, //!< Instruction 'ccmn'.
kIdCcmp, //!< Instruction 'ccmp'.
kIdCfinv, //!< Instruction 'cfinv'.
+ kIdChkfeat, //!< Instruction 'chkfeat'.
kIdCinc, //!< Instruction 'cinc'.
kIdCinv, //!< Instruction 'cinv'.
+ kIdClrbhb, //!< Instruction 'clrbhb'.
kIdClrex, //!< Instruction 'clrex'.
kIdCls, //!< Instruction 'cls'.
kIdClz, //!< Instruction 'clz'.
@@ -94,6 +99,7 @@ struct Inst {
kIdCmp, //!< Instruction 'cmp'.
kIdCmpp, //!< Instruction 'cmpp'.
kIdCneg, //!< Instruction 'cneg'.
+ kIdCnt, //!< Instruction 'cnt'.
kIdCrc32b, //!< Instruction 'crc32b'.
kIdCrc32cb, //!< Instruction 'crc32cb'.
kIdCrc32ch, //!< Instruction 'crc32ch'.
@@ -109,6 +115,7 @@ struct Inst {
kIdCsinc, //!< Instruction 'csinc'.
kIdCsinv, //!< Instruction 'csinv'.
kIdCsneg, //!< Instruction 'csneg'.
+ kIdCtz, //!< Instruction 'ctz'.
kIdDc, //!< Instruction 'dc'.
kIdDcps1, //!< Instruction 'dcps1'.
kIdDcps2, //!< Instruction 'dcps2'.
@@ -311,7 +318,9 @@ struct Inst {
kIdSev, //!< Instruction 'sev'.
kIdSevl, //!< Instruction 'sevl'.
kIdSmaddl, //!< Instruction 'smaddl'.
+ kIdSmax, //!< Instruction 'smax'.
kIdSmc, //!< Instruction 'smc'.
+ kIdSmin, //!< Instruction 'smin'.
kIdSmnegl, //!< Instruction 'smnegl'.
kIdSmsubl, //!< Instruction 'smsubl'.
kIdSmulh, //!< Instruction 'smulh'.
@@ -429,6 +438,8 @@ struct Inst {
kIdUdf, //!< Instruction 'udf'.
kIdUdiv, //!< Instruction 'udiv'.
kIdUmaddl, //!< Instruction 'umaddl'.
+ kIdUmax, //!< Instruction 'umax'.
+ kIdUmin, //!< Instruction 'umin'.
kIdUmnegl, //!< Instruction 'umnegl'.
kIdUmull, //!< Instruction 'umull'.
kIdUmulh, //!< Instruction 'umulh'.
@@ -794,16 +805,16 @@ struct Inst {
// ${InstId:End}
};
- //! Tests whether the `instId` is defined (counts also Inst::kIdNone, which must be zero).
- static ASMJIT_INLINE_NODEBUG bool isDefinedId(InstId instId) noexcept { return (instId & uint32_t(InstIdParts::kRealId)) < _kIdCount; }
-};
+ //! Tests whether the `inst_id` is defined (counts also Inst::kIdNone, which must be zero).
+ static ASMJIT_INLINE_NODEBUG bool is_defined_id(InstId inst_id) noexcept { return (inst_id & uint32_t(InstIdParts::kRealId)) < _kIdCount; }
+}
namespace Predicate {
//! Address translate options (AT).
namespace AT {
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
- return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2) noexcept {
+ return (op1 << 11) | (crn << 7) | (crm << 3) | (op2 << 0);
}
enum Value : uint32_t {
@@ -824,6 +835,17 @@ namespace AT {
};
}
+//! Branch target identification targets (BTI).
+namespace BTI {
+ //! Branch target identification targets
+ enum Value : uint32_t {
+ kNone = 0u,
+ kC = 1u,
+ kJ = 2u,
+ kJC = 3u
+ };
+}
+
//! Data barrier options (DMB/DSB).
namespace DB {
//! Data barrier immediate values.
@@ -860,8 +882,8 @@ namespace DB {
//! Data cache maintenance options.
namespace DC {
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
- return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2) noexcept {
+ return (op1 << 11) | (crn << 7) | (crm << 3) | (op2 << 0);
}
//! Data cache maintenance immediate values.
@@ -899,8 +921,8 @@ namespace DC {
//! Instruction cache maintenance options.
namespace IC {
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
- return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2) noexcept {
+ return (op1 << 11) | (crn << 7) | (crm << 3) | (op2 << 0);
}
//! Instruction cache maintenance immediate values.
@@ -953,8 +975,8 @@ namespace PSB {
}
namespace TLBI {
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
- return (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2) noexcept {
+ return (op1 << 11) | (crn << 7) | (crm << 3) | (op2 << 0);
}
enum Value : uint32_t {
@@ -1052,7 +1074,7 @@ namespace TSB {
//! Processor state access through MSR.
namespace PState {
//! Encodes a pstate from `op0` and `op1`.
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op0, uint32_t op1) noexcept {
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(uint32_t op0, uint32_t op1) noexcept {
return (op0 << 3) | (op1 << 0);
}
@@ -1067,7 +1089,7 @@ namespace PState {
kSSBS = encode(0b011, 0b001),
kTCO = encode(0b011, 0b100)
};
-};
+}
//! System register identifiers and utilities (MSR/MRS).
namespace SysReg {
@@ -1075,23 +1097,23 @@ namespace SysReg {
struct Fields {
uint8_t op0;
uint8_t op1;
- uint8_t cRn;
- uint8_t cRm;
+ uint8_t crn;
+ uint8_t crm;
uint8_t op2;
};
- //! Encodes a system register from `op0`, `op1`, `cRn`, `cRm`, and `op2` fields.
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(uint32_t op0, uint32_t op1, uint32_t cRn, uint32_t cRm, uint32_t op2) noexcept {
- return (op0 << 14) | (op1 << 11) | (cRn << 7) | (cRm << 3) | (op2 << 0);
+ //! Encodes a system register from `op0`, `op1`, `crn`, `crm`, and `op2` fields.
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(uint32_t op0, uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2) noexcept {
+ return (op0 << 14) | (op1 << 11) | (crn << 7) | (crm << 3) | (op2 << 0);
}
//! Encodes a system register from `fields`.
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t encode(const Fields& fields) noexcept {
- return encode(fields.op0, fields.op1, fields.cRn, fields.cRm, fields.op2);
+ static ASMJIT_INLINE_CONSTEXPR uint32_t encode(const Fields& fields) noexcept {
+ return encode(fields.op0, fields.op1, fields.crn, fields.crm, fields.op2);
}
//! Decodes a system register to \ref Fields.
- static ASMJIT_INLINE_NODEBUG constexpr Fields decode(uint32_t id) noexcept {
+ static ASMJIT_INLINE_CONSTEXPR Fields decode(uint32_t id) noexcept {
return Fields {
uint8_t((id >> 14) & 0x3u),
uint8_t((id >> 11) & 0x7u),
@@ -1884,7 +1906,7 @@ namespace SysReg {
kZCR_EL2 = encode(0b11, 0b100, 0b0001, 0b0010, 0b000), // RW
kZCR_EL3 = encode(0b11, 0b110, 0b0001, 0b0010, 0b000) // RW
};
-};
+}
} // {Predicate}
diff --git a/3rdparty/asmjit/asmjit/arm/a64instapi.cpp b/3rdparty/asmjit/asmjit/arm/a64instapi.cpp
new file mode 100644
index 00000000000..a7f3229c27b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64instapi.cpp
@@ -0,0 +1,252 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/support/support_p.h>
+#include <asmjit/arm/a64instapi_p.h>
+#include <asmjit/arm/a64instdb_p.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+namespace InstInternal {
+
+// a64::InstInternal - Text
+// ========================
+
+#ifndef ASMJIT_NO_TEXT
+Error inst_id_to_string(InstId inst_id, InstStringifyOptions options, String& output) noexcept {
+ uint32_t real_id = inst_id & uint32_t(InstIdParts::kRealId);
+ if (ASMJIT_UNLIKELY(!Inst::is_defined_id(real_id))) {
+ return make_error(Error::kInvalidInstruction);
+ }
+
+ return InstNameUtils::decode(InstDB::_inst_name_index_table[real_id], options, InstDB::_inst_name_string_table, output);
+}
+
+InstId string_to_inst_id(const char* s, size_t len) noexcept {
+ if (ASMJIT_UNLIKELY(!s)) {
+ return BaseInst::kIdNone;
+ }
+
+ if (len == SIZE_MAX) {
+ len = strlen(s);
+ }
+
+ if (len == 0u || len > InstDB::_inst_name_index.max_name_length) {
+ return BaseInst::kIdNone;
+ }
+
+ return InstNameUtils::find_instruction(s, len, InstDB::_inst_name_index_table, InstDB::_inst_name_string_table, InstDB::_inst_name_index);
+}
+#endif // !ASMJIT_NO_TEXT
+
+// a64::InstInternal - Validate
+// ============================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+ASMJIT_FAVOR_SIZE Error validate(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept {
+ // TODO:
+ Support::maybe_unused(inst, operands, op_count, validation_flags);
+ return Error::kOk;
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// a64::InstInternal - QueryRWInfo
+// ===============================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+struct InstRWInfoData {
+ uint8_t rwx[Globals::kMaxOpCount];
+};
+
+static const InstRWInfoData inst_rw_info_table[] = {
+ #define R uint8_t(OpRWFlags::kRead)
+ #define W uint8_t(OpRWFlags::kWrite)
+ #define X uint8_t(OpRWFlags::kRW)
+
+ {{ R, R, R, R, R, R }}, // kRWI_R
+ {{ R, W, R, R, R, R }}, // kRWI_RW
+ {{ R, X, R, R, R, R }}, // kRWI_RX
+ {{ R, R, W, R, R, R }}, // kRWI_RRW
+ {{ R, W, X, R, R, R }}, // kRWI_RWX
+ {{ W, R, R, R, R, R }}, // kRWI_W
+ {{ W, R, W, R, R, R }}, // kRWI_WRW
+ {{ W, R, X, R, R, R }}, // kRWI_WRX
+ {{ W, R, R, W, R, R }}, // kRWI_WRRW
+ {{ W, R, R, X, R, R }}, // kRWI_WRRX
+ {{ W, W, R, R, R, R }}, // kRWI_WW
+ {{ X, R, R, R, R, R }}, // kRWI_X
+ {{ X, R, X, R, R, R }}, // kRWI_XRX
+ {{ X, X, R, R, X, R }}, // kRWI_XXRRX
+
+ {{ W, R, R, R, R, R }}, // kRWI_LDn
+ {{ R, W, R, R, R, R }}, // kRWI_STn
+ {{ R, R, R, R, R, R }} // kRWI_TODO
+
+ #undef R
+ #undef W
+ #undef X
+};
+
+static const uint8_t element_type_size_table[8] = { 0, 1, 2, 4, 8, 4, 4, 0 };
+
+Error query_rw_info(const BaseInst& inst, const Operand_* operands, size_t op_count, InstRWInfo* out) noexcept {
+ // Get the instruction data.
+ uint32_t real_id = inst.inst_id() & uint32_t(InstIdParts::kRealId);
+
+ if (ASMJIT_UNLIKELY(!Inst::is_defined_id(real_id))) {
+ return make_error(Error::kInvalidInstruction);
+ }
+
+ out->_inst_flags = InstRWFlags::kNone;
+ out->_op_count = uint8_t(op_count);
+ out->_rm_feature = 0;
+ out->_extra_reg.reset();
+ out->_read_flags = CpuRWFlags::kNone; // TODO: [ARM] Read PSTATUS.
+ out->_write_flags = CpuRWFlags::kNone; // TODO: [ARM] Write PSTATUS
+
+ const InstDB::InstInfo& inst_info = InstDB::_inst_info_table[real_id];
+ const InstRWInfoData& rw_info = inst_rw_info_table[inst_info.rw_info_index()];
+
+ if (inst_info.has_flag(InstDB::kInstFlagConsecutive) && op_count > 2) {
+ for (uint32_t i = 0; i < op_count; i++) {
+ OpRWInfo& op = out->_operands[i];
+ const Operand_& src_op = operands[i];
+
+ if (!src_op.is_reg_or_mem()) {
+ op.reset();
+ continue;
+ }
+
+ OpRWFlags rw_flags = i < op_count - 1 ? (OpRWFlags)rw_info.rwx[0] : (OpRWFlags)rw_info.rwx[1];
+
+ op._op_flags = rw_flags & ~(OpRWFlags::kZExt);
+ op._phys_id = Reg::kIdBad;
+ op._rm_size = 0;
+ op._reset_reserved();
+
+ uint64_t r_byte_mask = op.is_read() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+ uint64_t w_byte_mask = op.is_write() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+
+ op._read_byte_mask = r_byte_mask;
+ op._write_byte_mask = w_byte_mask;
+ op._extend_byte_mask = 0;
+ op._consecutive_lead_count = 0;
+
+ if (src_op.is_reg()) {
+ if (i == 0) {
+ op._consecutive_lead_count = uint8_t(op_count - 1);
+ }
+ else {
+ op.add_op_flags(OpRWFlags::kConsecutive);
+ }
+ }
+ else {
+ const Mem& mem_op = src_op.as<Mem>();
+
+ if (mem_op.has_base()) {
+ op.add_op_flags(OpRWFlags::kMemBaseRead);
+ if ((mem_op.has_index() || mem_op.has_offset()) && mem_op.is_pre_or_post()) {
+ op.add_op_flags(OpRWFlags::kMemBaseWrite);
+ }
+ }
+
+ if (mem_op.has_index()) {
+ op.add_op_flags(OpRWFlags::kMemIndexRead);
+ }
+ }
+ }
+ }
+ else {
+ for (uint32_t i = 0; i < op_count; i++) {
+ OpRWInfo& op = out->_operands[i];
+ const Operand_& src_op = operands[i];
+
+ if (!src_op.is_reg_or_mem()) {
+ op.reset();
+ continue;
+ }
+
+ OpRWFlags rw_flags = (OpRWFlags)rw_info.rwx[i];
+
+ op._op_flags = rw_flags & ~(OpRWFlags::kZExt);
+ op._phys_id = Reg::kIdBad;
+ op._rm_size = 0;
+ op._reset_reserved();
+
+ uint64_t r_byte_mask = op.is_read() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+ uint64_t w_byte_mask = op.is_write() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
+
+ op._read_byte_mask = r_byte_mask;
+ op._write_byte_mask = w_byte_mask;
+ op._extend_byte_mask = 0;
+ op._consecutive_lead_count = 0;
+
+ if (src_op.is_reg()) {
+ if (src_op.as<Vec>().has_element_index()) {
+ // Only part of the vector is accessed if element index [] is used.
+ VecElementType element_type = src_op.as<Vec>().element_type();
+ uint32_t element_index = src_op.as<Vec>().element_index();
+
+ uint32_t element_size = element_type_size_table[size_t(element_type)];
+ uint64_t access_mask = uint64_t(Support::lsb_mask<uint32_t>(element_size)) << (element_index * element_size);
+
+ op._read_byte_mask &= access_mask;
+ op._write_byte_mask &= access_mask;
+ }
+
+ // TODO: [ARM] RW info is not finished.
+ }
+ else {
+ const Mem& mem_op = src_op.as<Mem>();
+
+ if (mem_op.has_base()) {
+ op.add_op_flags(OpRWFlags::kMemBaseRead);
+ if ((mem_op.has_index() || mem_op.has_offset()) && mem_op.is_pre_or_post()) {
+ op.add_op_flags(OpRWFlags::kMemBaseWrite);
+ }
+ }
+
+ if (mem_op.has_index()) {
+ op.add_op_flags(OpRWFlags::kMemIndexRead);
+ }
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// a64::InstInternal - QueryFeatures
+// =================================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error query_features(const BaseInst& inst, const Operand_* operands, size_t op_count, CpuFeatures* out) noexcept {
+ // TODO: [ARM] QueryFeatures not implemented yet.
+ Support::maybe_unused(inst, operands, op_count, out);
+ return Error::kOk;
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+} // {InstInternal}
+
+// a64::InstInternal - Unit
+// ========================
+
+#if defined(ASMJIT_TEST)
+UNIT(arm_inst_api_text) {
+ // TODO:
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit/arm/a64instapi_p.h b/3rdparty/asmjit/asmjit/arm/a64instapi_p.h
new file mode 100644
index 00000000000..90290a81ed0
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64instapi_p.h
@@ -0,0 +1,38 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
+#define ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
+
+#include <asmjit/core/inst.h>
+#include <asmjit/core/operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+namespace InstInternal {
+
+#ifndef ASMJIT_NO_TEXT
+Error ASMJIT_CDECL inst_id_to_string(InstId inst_id, InstStringifyOptions options, String& output) noexcept;
+InstId ASMJIT_CDECL string_to_inst_id(const char* s, size_t len) noexcept;
+#endif // !ASMJIT_NO_TEXT
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error ASMJIT_CDECL validate(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept;
+Error ASMJIT_CDECL query_rw_info(const BaseInst& inst, const Operand_* operands, size_t op_count, InstRWInfo* out) noexcept;
+Error ASMJIT_CDECL query_features(const BaseInst& inst, const Operand_* operands, size_t op_count, CpuFeatures* out) noexcept;
+#endif // !ASMJIT_NO_INTROSPECTION
+
+} // {InstInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp b/3rdparty/asmjit/asmjit/arm/a64instdb.cpp
index b19f8808a63..2ebb1eeeb07 100644
--- a/3rdparty/asmjit/src/asmjit/arm/a64instdb.cpp
+++ b/3rdparty/asmjit/asmjit/arm/a64instdb.cpp
@@ -1,15 +1,15 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
-#include "../core/api-build_p.h"
+#include <asmjit/core/api-build_p.h>
#if !defined(ASMJIT_NO_AARCH64)
-#include "../core/codeholder.h"
-#include "../core/support.h"
-#include "../arm/a64instdb_p.h"
-#include "../arm/a64operand.h"
+#include <asmjit/core/codeholder.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/a64instdb_p.h>
+#include <asmjit/arm/a64operand.h>
ASMJIT_BEGIN_SUB_NAMESPACE(a64)
@@ -19,12 +19,12 @@ namespace InstDB {
// ===========================
// Defines an ARM/AArch64 instruction.
-#define INST(id, opcodeEncoding, opcodeData, rwInfoIndex, flags, opcodeDataIndex) { \
- uint32_t(kEncoding##opcodeEncoding), \
- uint32_t(opcodeDataIndex), \
- 0, \
- uint16_t(rwInfoIndex), \
- uint16_t(flags) \
+#define INST(id, opcode_encoding, opcode_data, rw_info_index, flags, opcode_data_index) { \
+ uint32_t(kEncoding##opcode_encoding), \
+ uint32_t(opcode_data_index), \
+ 0, \
+ uint16_t(rw_info_index), \
+ uint16_t(flags) \
}
#define F(flag) kInstFlag##flag
@@ -43,9 +43,6 @@ ERETAA, ERETAB: Exception Return, with pointer authentication.
LDAPxxx
PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA: Pointer Authentication Code for Instruction address, using key A.
PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB: Pointer Authentication Code for Instruction address, using key B.
-PRFM (immediate): Prefetch Memory (immediate).
-PRFM (literal): Prefetch Memory (literal).
-PRFM (register): Prefetch Memory (register).
PRFUM: Prefetch Memory (unscaled offset).
RETAA, RETAB: Return from subroutine, with pointer authentication.
RMIF: Rotate, Mask Insert Flags.
@@ -53,776 +50,787 @@ SYSL
IRG: Insert Random Tag.
INST_(Irg , BaseRRR , (0b1001101011000000000100, kX , kSP, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 0 , 1 ), // #1
*/
-const InstInfo _instInfoTable[] = {
+const InstInfo _inst_info_table[] = {
// +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+
// | Instruction Id | Encoding | Opcode Data | RW Info | Instruction Flags |DatX|
// +------------------+---------------------+--------------------------------------------------------------------------------------+-----------+---------------------------+----+
// ${InstInfo:Begin}
INST(None , None , (_) , 0 , 0 , 0 ), // #0
- INST(Adc , BaseRRR , (0b0001101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 ), // #1
- INST(Adcs , BaseRRR , (0b0011101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 ), // #2
- INST(Add , BaseAddSub , (0b0001011000, 0b0001011001, 0b0010001) , kRWI_W , 0 , 0 ), // #3
- INST(Addg , BaseRRII , (0b1001000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 0 ), // #4
- INST(Adds , BaseAddSub , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_W , 0 , 1 ), // #5
- INST(Adr , BaseAdr , (0b0001000000000000000000, OffsetType::kAArch64_ADR) , kRWI_W , 0 , 0 ), // #6
- INST(Adrp , BaseAdr , (0b1001000000000000000000, OffsetType::kAArch64_ADRP) , kRWI_W , 0 , 1 ), // #7
- INST(And , BaseLogical , (0b0001010000, 0b00100100, 0) , kRWI_W , 0 , 0 ), // #8
- INST(Ands , BaseLogical , (0b1101010000, 0b11100100, 0) , kRWI_W , 0 , 1 ), // #9
- INST(Asr , BaseShift , (0b0001101011000000001010, 0b0001001100000000011111, 0) , kRWI_W , 0 , 0 ), // #10
- INST(Asrv , BaseShift , (0b0001101011000000001010, 0b0000000000000000000000, 0) , kRWI_W , 0 , 1 ), // #11
- INST(At , BaseAtDcIcTlbi , (0b00011111110000, 0b00001111000000, true) , kRWI_RX , 0 , 0 ), // #12
- INST(Autda , BaseRR , (0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 0 ), // #13
- INST(Autdza , BaseR , (0b11011010110000010011101111100000, kX, kZR, 0) , kRWI_X , 0 , 0 ), // #14
- INST(Autdb , BaseRR , (0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 1 ), // #15
- INST(Autdzb , BaseR , (0b11011010110000010011111111100000, kX, kZR, 0) , kRWI_X , 0 , 1 ), // #16
- INST(Autia , BaseRR , (0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 2 ), // #17
- INST(Autia1716 , BaseOp , (0b11010101000000110010000110011111) , 0 , 0 , 0 ), // #18
- INST(Autiasp , BaseOp , (0b11010101000000110010001110111111) , 0 , 0 , 1 ), // #19
- INST(Autiaz , BaseOp , (0b11010101000000110010001110011111) , 0 , 0 , 2 ), // #20
- INST(Autib , BaseRR , (0b11011010110000010001010000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 3 ), // #21
- INST(Autib1716 , BaseOp , (0b11010101000000110010000111011111) , 0 , 0 , 3 ), // #22
- INST(Autibsp , BaseOp , (0b11010101000000110010001111111111) , 0 , 0 , 4 ), // #23
- INST(Autibz , BaseOp , (0b11010101000000110010001111011111) , 0 , 0 , 5 ), // #24
- INST(Autiza , BaseR , (0b11011010110000010011001111100000, kX, kZR, 0) , kRWI_X , 0 , 2 ), // #25
- INST(Autizb , BaseR , (0b11011010110000010011011111100000, kX, kZR, 0) , kRWI_X , 0 , 3 ), // #26
- INST(Axflag , BaseOp , (0b11010101000000000100000001011111) , 0 , 0 , 6 ), // #27
- INST(B , BaseBranchRel , (0b00010100000000000000000000000000) , 0 , F(Cond) , 0 ), // #28
- INST(Bfc , BaseBfc , (0b00110011000000000000001111100000) , kRWI_X , 0 , 0 ), // #29
- INST(Bfi , BaseBfi , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #30
- INST(Bfm , BaseBfm , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #31
- INST(Bfxil , BaseBfx , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #32
- INST(Bic , BaseLogical , (0b0001010001, 0b00100100, 1) , kRWI_W , 0 , 2 ), // #33
- INST(Bics , BaseLogical , (0b1101010001, 0b11100100, 1) , kRWI_W , 0 , 3 ), // #34
- INST(Bl , BaseBranchRel , (0b10010100000000000000000000000000) , 0 , 0 , 1 ), // #35
- INST(Blr , BaseBranchReg , (0b11010110001111110000000000000000) , kRWI_R , 0 , 0 ), // #36
- INST(Br , BaseBranchReg , (0b11010110000111110000000000000000) , kRWI_R , 0 , 1 ), // #37
- INST(Brk , BaseOpImm , (0b11010100001000000000000000000000, 16, 5) , 0 , 0 , 0 ), // #38
- INST(Cas , BaseAtomicOp , (0b1000100010100000011111, kWX, 30, 0) , kRWI_XRX , 0 , 0 ), // #39
- INST(Casa , BaseAtomicOp , (0b1000100011100000011111, kWX, 30, 1) , kRWI_XRX , 0 , 1 ), // #40
- INST(Casab , BaseAtomicOp , (0b0000100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 2 ), // #41
- INST(Casah , BaseAtomicOp , (0b0100100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 3 ), // #42
- INST(Casal , BaseAtomicOp , (0b1000100011100000111111, kWX, 30, 1) , kRWI_XRX , 0 , 4 ), // #43
- INST(Casalb , BaseAtomicOp , (0b0000100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 5 ), // #44
- INST(Casalh , BaseAtomicOp , (0b0100100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 6 ), // #45
- INST(Casb , BaseAtomicOp , (0b0000100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 7 ), // #46
- INST(Cash , BaseAtomicOp , (0b0100100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 8 ), // #47
- INST(Casl , BaseAtomicOp , (0b1000100010100000111111, kWX, 30, 0) , kRWI_XRX , 0 , 9 ), // #48
- INST(Caslb , BaseAtomicOp , (0b0000100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 10 ), // #49
- INST(Caslh , BaseAtomicOp , (0b0100100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 11 ), // #50
- INST(Casp , BaseAtomicCasp , (0b0000100000100000011111, kWX, 30) , kRWI_XXRRX, 0 , 0 ), // #51
- INST(Caspa , BaseAtomicCasp , (0b0000100001100000011111, kWX, 30) , kRWI_XXRRX, 0 , 1 ), // #52
- INST(Caspal , BaseAtomicCasp , (0b0000100001100000111111, kWX, 30) , kRWI_XXRRX, 0 , 2 ), // #53
- INST(Caspl , BaseAtomicCasp , (0b0000100000100000111111, kWX, 30) , kRWI_XXRRX, 0 , 3 ), // #54
- INST(Cbnz , BaseBranchCmp , (0b00110101000000000000000000000000) , kRWI_R , 0 , 0 ), // #55
- INST(Cbz , BaseBranchCmp , (0b00110100000000000000000000000000) , kRWI_R , 0 , 1 ), // #56
- INST(Ccmn , BaseCCmp , (0b00111010010000000000000000000000) , kRWI_R , 0 , 0 ), // #57
- INST(Ccmp , BaseCCmp , (0b01111010010000000000000000000000) , kRWI_R , 0 , 1 ), // #58
- INST(Cfinv , BaseOp , (0b11010101000000000100000000011111) , 0 , 0 , 7 ), // #59
- INST(Cinc , BaseCInc , (0b00011010100000000000010000000000) , kRWI_W , 0 , 0 ), // #60
- INST(Cinv , BaseCInc , (0b01011010100000000000000000000000) , kRWI_W , 0 , 1 ), // #61
- INST(Clrex , BaseOpImm , (0b11010101000000110011000001011111, 4, 8) , 0 , 0 , 1 ), // #62
- INST(Cls , BaseRR , (0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 4 ), // #63
- INST(Clz , BaseRR , (0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 5 ), // #64
- INST(Cmn , BaseCmpCmn , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_R , 0 , 0 ), // #65
- INST(Cmp , BaseCmpCmn , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_R , 0 , 1 ), // #66
- INST(Cmpp , BaseRR , (0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true) , kRWI_R , 0 , 6 ), // #67
- INST(Cneg , BaseCInc , (0b01011010100000000000010000000000) , kRWI_W , 0 , 2 ), // #68
- INST(Crc32b , BaseRRR , (0b0001101011000000010000, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 2 ), // #69
- INST(Crc32cb , BaseRRR , (0b0001101011000000010100, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 3 ), // #70
- INST(Crc32ch , BaseRRR , (0b0001101011000000010101, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 4 ), // #71
- INST(Crc32cw , BaseRRR , (0b0001101011000000010110, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 5 ), // #72
- INST(Crc32cx , BaseRRR , (0b1001101011000000010111, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 6 ), // #73
- INST(Crc32h , BaseRRR , (0b0001101011000000010001, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 7 ), // #74
- INST(Crc32w , BaseRRR , (0b0001101011000000010010, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 8 ), // #75
- INST(Crc32x , BaseRRR , (0b1001101011000000010011, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 9 ), // #76
- INST(Csdb , BaseOp , (0b11010101000000110010001010011111) , 0 , 0 , 8 ), // #77
- INST(Csel , BaseCSel , (0b00011010100000000000000000000000) , kRWI_W , 0 , 0 ), // #78
- INST(Cset , BaseCSet , (0b00011010100111110000011111100000) , kRWI_W , 0 , 0 ), // #79
- INST(Csetm , BaseCSet , (0b01011010100111110000001111100000) , kRWI_W , 0 , 1 ), // #80
- INST(Csinc , BaseCSel , (0b00011010100000000000010000000000) , kRWI_W , 0 , 1 ), // #81
- INST(Csinv , BaseCSel , (0b01011010100000000000000000000000) , kRWI_W , 0 , 2 ), // #82
- INST(Csneg , BaseCSel , (0b01011010100000000000010000000000) , kRWI_W , 0 , 3 ), // #83
- INST(Dc , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, true) , kRWI_RX , 0 , 1 ), // #84
- INST(Dcps1 , BaseOpImm , (0b11010100101000000000000000000001, 16, 5) , 0 , 0 , 2 ), // #85
- INST(Dcps2 , BaseOpImm , (0b11010100101000000000000000000010, 16, 5) , 0 , 0 , 3 ), // #86
- INST(Dcps3 , BaseOpImm , (0b11010100101000000000000000000011, 16, 5) , 0 , 0 , 4 ), // #87
- INST(Dgh , BaseOp , (0b11010101000000110010000011011111) , 0 , 0 , 9 ), // #88
- INST(Dmb , BaseOpImm , (0b11010101000000110011000010111111, 4, 8) , 0 , 0 , 5 ), // #89
- INST(Drps , BaseOp , (0b11010110101111110000001111100000) , 0 , 0 , 10 ), // #90
- INST(Dsb , BaseOpImm , (0b11010101000000110011000010011111, 4, 8) , 0 , 0 , 6 ), // #91
- INST(Eon , BaseLogical , (0b1001010001, 0b10100100, 1) , kRWI_W , 0 , 4 ), // #92
- INST(Eor , BaseLogical , (0b1001010000, 0b10100100, 0) , kRWI_W , 0 , 5 ), // #93
- INST(Esb , BaseOp , (0b11010101000000110010001000011111) , 0 , 0 , 11 ), // #94
- INST(Extr , BaseExtract , (0b00010011100000000000000000000000) , kRWI_W , 0 , 0 ), // #95
- INST(Eret , BaseOp , (0b11010110100111110000001111100000) , 0 , 0 , 12 ), // #96
- INST(Gmi , BaseRRR , (0b1001101011000000000101, kX , kZR, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 10 ), // #97
- INST(Hint , BaseOpImm , (0b11010101000000110010000000011111, 7, 5) , 0 , 0 , 7 ), // #98
- INST(Hlt , BaseOpImm , (0b11010100010000000000000000000000, 16, 5) , 0 , 0 , 8 ), // #99
- INST(Hvc , BaseOpImm , (0b11010100000000000000000000000010, 16, 5) , 0 , 0 , 9 ), // #100
- INST(Ic , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, false) , kRWI_RX , 0 , 2 ), // #101
- INST(Isb , BaseOpImm , (0b11010101000000110011000011011111, 4, 8) , 0 , 0 , 10 ), // #102
- INST(Ldadd , BaseAtomicOp , (0b1011100000100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 12 ), // #103
- INST(Ldadda , BaseAtomicOp , (0b1011100010100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 13 ), // #104
- INST(Ldaddab , BaseAtomicOp , (0b0011100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 14 ), // #105
- INST(Ldaddah , BaseAtomicOp , (0b0111100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 15 ), // #106
- INST(Ldaddal , BaseAtomicOp , (0b1011100011100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 16 ), // #107
- INST(Ldaddalb , BaseAtomicOp , (0b0011100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 17 ), // #108
- INST(Ldaddalh , BaseAtomicOp , (0b0111100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 18 ), // #109
- INST(Ldaddb , BaseAtomicOp , (0b0011100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 19 ), // #110
- INST(Ldaddh , BaseAtomicOp , (0b0111100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 20 ), // #111
- INST(Ldaddl , BaseAtomicOp , (0b1011100001100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 21 ), // #112
- INST(Ldaddlb , BaseAtomicOp , (0b0011100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 22 ), // #113
- INST(Ldaddlh , BaseAtomicOp , (0b0111100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 23 ), // #114
- INST(Ldar , BaseRM_NoImm , (0b1000100011011111111111, kWX, kZR, 30) , kRWI_W , 0 , 0 ), // #115
- INST(Ldarb , BaseRM_NoImm , (0b0000100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 1 ), // #116
- INST(Ldarh , BaseRM_NoImm , (0b0100100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 2 ), // #117
- INST(Ldaxp , BaseLdxp , (0b1000100001111111100000, kWX, 30) , kRWI_WW , 0 , 0 ), // #118
- INST(Ldaxr , BaseRM_NoImm , (0b1000100001011111111111, kWX, kZR, 30) , kRWI_W , 0 , 3 ), // #119
- INST(Ldaxrb , BaseRM_NoImm , (0b0000100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 4 ), // #120
- INST(Ldaxrh , BaseRM_NoImm , (0b0100100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 5 ), // #121
- INST(Ldclr , BaseAtomicOp , (0b1011100000100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 24 ), // #122
- INST(Ldclra , BaseAtomicOp , (0b1011100010100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 25 ), // #123
- INST(Ldclrab , BaseAtomicOp , (0b0011100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 26 ), // #124
- INST(Ldclrah , BaseAtomicOp , (0b0111100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 27 ), // #125
- INST(Ldclral , BaseAtomicOp , (0b1011100011100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 28 ), // #126
- INST(Ldclralb , BaseAtomicOp , (0b0011100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 29 ), // #127
- INST(Ldclralh , BaseAtomicOp , (0b0111100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 30 ), // #128
- INST(Ldclrb , BaseAtomicOp , (0b0011100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 31 ), // #129
- INST(Ldclrh , BaseAtomicOp , (0b0111100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 32 ), // #130
- INST(Ldclrl , BaseAtomicOp , (0b1011100001100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 33 ), // #131
- INST(Ldclrlb , BaseAtomicOp , (0b0011100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 34 ), // #132
- INST(Ldclrlh , BaseAtomicOp , (0b0111100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 35 ), // #133
- INST(Ldeor , BaseAtomicOp , (0b1011100000100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 36 ), // #134
- INST(Ldeora , BaseAtomicOp , (0b1011100010100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 37 ), // #135
- INST(Ldeorab , BaseAtomicOp , (0b0011100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 38 ), // #136
- INST(Ldeorah , BaseAtomicOp , (0b0111100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 39 ), // #137
- INST(Ldeoral , BaseAtomicOp , (0b1011100011100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 40 ), // #138
- INST(Ldeoralb , BaseAtomicOp , (0b0011100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 41 ), // #139
- INST(Ldeoralh , BaseAtomicOp , (0b0111100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 42 ), // #140
- INST(Ldeorb , BaseAtomicOp , (0b0011100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 43 ), // #141
- INST(Ldeorh , BaseAtomicOp , (0b0111100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 44 ), // #142
- INST(Ldeorl , BaseAtomicOp , (0b1011100001100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 45 ), // #143
- INST(Ldeorlb , BaseAtomicOp , (0b0011100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 46 ), // #144
- INST(Ldeorlh , BaseAtomicOp , (0b0111100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 47 ), // #145
- INST(Ldg , BaseRM_SImm9 , (0b1101100101100000000000, 0b0000000000000000000000, kX , kZR, 0, 4) , kRWI_W , 0 , 0 ), // #146
- INST(Ldgm , BaseRM_NoImm , (0b1101100111100000000000, kX , kZR, 0 ) , kRWI_W , 0 , 6 ), // #147
- INST(Ldlar , BaseRM_NoImm , (0b1000100011011111011111, kWX, kZR, 30) , kRWI_W , 0 , 7 ), // #148
- INST(Ldlarb , BaseRM_NoImm , (0b0000100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 8 ), // #149
- INST(Ldlarh , BaseRM_NoImm , (0b0100100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 9 ), // #150
- INST(Ldnp , BaseLdpStp , (0b0010100001, 0 , kWX, 31, 2) , kRWI_WW , 0 , 0 ), // #151
- INST(Ldp , BaseLdpStp , (0b0010100101, 0b0010100011, kWX, 31, 2) , kRWI_W , 0 , 1 ), // #152
- INST(Ldpsw , BaseLdpStp , (0b0110100101, 0b0110100011, kX , 0 , 2) , kRWI_WW , 0 , 2 ), // #153
- INST(Ldr , BaseLdSt , (0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur) , kRWI_W , 0 , 0 ), // #154
- INST(Ldraa , BaseRM_SImm10 , (0b1111100000100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 0 ), // #155
- INST(Ldrab , BaseRM_SImm10 , (0b1111100010100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 1 ), // #156
- INST(Ldrb , BaseLdSt , (0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb) , kRWI_W , 0 , 1 ), // #157
- INST(Ldrh , BaseLdSt , (0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh) , kRWI_W , 0 , 2 ), // #158
- INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000111, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 ), // #159
- INST(Ldrsh , BaseLdSt , (0b0111100111, 0b01111000100, 0b01111000111, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 ), // #160
- INST(Ldrsw , BaseLdSt , (0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw) , kRWI_W , 0 , 5 ), // #161
- INST(Ldset , BaseAtomicOp , (0b1011100000100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 48 ), // #162
- INST(Ldseta , BaseAtomicOp , (0b1011100010100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 49 ), // #163
- INST(Ldsetab , BaseAtomicOp , (0b0011100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 50 ), // #164
- INST(Ldsetah , BaseAtomicOp , (0b0111100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 51 ), // #165
- INST(Ldsetal , BaseAtomicOp , (0b1011100011100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 52 ), // #166
- INST(Ldsetalb , BaseAtomicOp , (0b0011100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 53 ), // #167
- INST(Ldsetalh , BaseAtomicOp , (0b0111100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 54 ), // #168
- INST(Ldsetb , BaseAtomicOp , (0b0011100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 55 ), // #169
- INST(Ldseth , BaseAtomicOp , (0b0111100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 56 ), // #170
- INST(Ldsetl , BaseAtomicOp , (0b1011100001100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 57 ), // #171
- INST(Ldsetlb , BaseAtomicOp , (0b0011100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 58 ), // #172
- INST(Ldsetlh , BaseAtomicOp , (0b0111100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 59 ), // #173
- INST(Ldsmax , BaseAtomicOp , (0b1011100000100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 60 ), // #174
- INST(Ldsmaxa , BaseAtomicOp , (0b1011100010100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 61 ), // #175
- INST(Ldsmaxab , BaseAtomicOp , (0b0011100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 62 ), // #176
- INST(Ldsmaxah , BaseAtomicOp , (0b0111100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 63 ), // #177
- INST(Ldsmaxal , BaseAtomicOp , (0b1011100011100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 64 ), // #178
- INST(Ldsmaxalb , BaseAtomicOp , (0b0011100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 65 ), // #179
- INST(Ldsmaxalh , BaseAtomicOp , (0b0111100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 66 ), // #180
- INST(Ldsmaxb , BaseAtomicOp , (0b0011100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 67 ), // #181
- INST(Ldsmaxh , BaseAtomicOp , (0b0111100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 68 ), // #182
- INST(Ldsmaxl , BaseAtomicOp , (0b1011100001100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 69 ), // #183
- INST(Ldsmaxlb , BaseAtomicOp , (0b0011100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 70 ), // #184
- INST(Ldsmaxlh , BaseAtomicOp , (0b0111100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 71 ), // #185
- INST(Ldsmin , BaseAtomicOp , (0b1011100000100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 72 ), // #186
- INST(Ldsmina , BaseAtomicOp , (0b1011100010100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 73 ), // #187
- INST(Ldsminab , BaseAtomicOp , (0b0011100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 74 ), // #188
- INST(Ldsminah , BaseAtomicOp , (0b0111100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 75 ), // #189
- INST(Ldsminal , BaseAtomicOp , (0b1011100011100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 76 ), // #190
- INST(Ldsminalb , BaseAtomicOp , (0b0011100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 77 ), // #191
- INST(Ldsminalh , BaseAtomicOp , (0b0111100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 78 ), // #192
- INST(Ldsminb , BaseAtomicOp , (0b0011100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 79 ), // #193
- INST(Ldsminh , BaseAtomicOp , (0b0111100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 80 ), // #194
- INST(Ldsminl , BaseAtomicOp , (0b1011100001100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 81 ), // #195
- INST(Ldsminlb , BaseAtomicOp , (0b0011100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 82 ), // #196
- INST(Ldsminlh , BaseAtomicOp , (0b0111100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 83 ), // #197
- INST(Ldtr , BaseRM_SImm9 , (0b1011100001000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 1 ), // #198
- INST(Ldtrb , BaseRM_SImm9 , (0b0011100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 2 ), // #199
- INST(Ldtrh , BaseRM_SImm9 , (0b0111100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 3 ), // #200
- INST(Ldtrsb , BaseRM_SImm9 , (0b0011100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 4 ), // #201
- INST(Ldtrsh , BaseRM_SImm9 , (0b0111100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 5 ), // #202
- INST(Ldtrsw , BaseRM_SImm9 , (0b1011100010000000000010, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 6 ), // #203
- INST(Ldumax , BaseAtomicOp , (0b1011100000100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 84 ), // #204
- INST(Ldumaxa , BaseAtomicOp , (0b1011100010100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 85 ), // #205
- INST(Ldumaxab , BaseAtomicOp , (0b0011100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 86 ), // #206
- INST(Ldumaxah , BaseAtomicOp , (0b0111100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 87 ), // #207
- INST(Ldumaxal , BaseAtomicOp , (0b1011100011100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 88 ), // #208
- INST(Ldumaxalb , BaseAtomicOp , (0b0011100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 89 ), // #209
- INST(Ldumaxalh , BaseAtomicOp , (0b0111100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 90 ), // #210
- INST(Ldumaxb , BaseAtomicOp , (0b0011100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 91 ), // #211
- INST(Ldumaxh , BaseAtomicOp , (0b0111100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 92 ), // #212
- INST(Ldumaxl , BaseAtomicOp , (0b1011100001100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 93 ), // #213
- INST(Ldumaxlb , BaseAtomicOp , (0b0011100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 94 ), // #214
- INST(Ldumaxlh , BaseAtomicOp , (0b0111100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 95 ), // #215
- INST(Ldumin , BaseAtomicOp , (0b1011100000100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 96 ), // #216
- INST(Ldumina , BaseAtomicOp , (0b1011100010100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 97 ), // #217
- INST(Lduminab , BaseAtomicOp , (0b0011100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 98 ), // #218
- INST(Lduminah , BaseAtomicOp , (0b0111100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 99 ), // #219
- INST(Lduminal , BaseAtomicOp , (0b1011100011100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 100), // #220
- INST(Lduminalb , BaseAtomicOp , (0b0011100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 101), // #221
- INST(Lduminalh , BaseAtomicOp , (0b0111100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 102), // #222
- INST(Lduminb , BaseAtomicOp , (0b0011100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 103), // #223
- INST(Lduminh , BaseAtomicOp , (0b0111100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 104), // #224
- INST(Lduminl , BaseAtomicOp , (0b1011100001100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 105), // #225
- INST(Lduminlb , BaseAtomicOp , (0b0011100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 106), // #226
- INST(Lduminlh , BaseAtomicOp , (0b0111100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 107), // #227
- INST(Ldur , BaseRM_SImm9 , (0b1011100001000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 7 ), // #228
- INST(Ldurb , BaseRM_SImm9 , (0b0011100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 8 ), // #229
- INST(Ldurh , BaseRM_SImm9 , (0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 9 ), // #230
- INST(Ldursb , BaseRM_SImm9 , (0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 10 ), // #231
- INST(Ldursh , BaseRM_SImm9 , (0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 11 ), // #232
- INST(Ldursw , BaseRM_SImm9 , (0b1011100010000000000000, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 12 ), // #233
- INST(Ldxp , BaseLdxp , (0b1000100001111111000000, kWX, 30) , kRWI_WW , 0 , 1 ), // #234
- INST(Ldxr , BaseRM_NoImm , (0b1000100001011111011111, kWX, kZR, 30) , kRWI_W , 0 , 10 ), // #235
- INST(Ldxrb , BaseRM_NoImm , (0b0000100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 11 ), // #236
- INST(Ldxrh , BaseRM_NoImm , (0b0100100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 12 ), // #237
- INST(Lsl , BaseShift , (0b0001101011000000001000, 0b0101001100000000000000, 0) , kRWI_W , 0 , 2 ), // #238
- INST(Lslv , BaseShift , (0b0001101011000000001000, 0b0000000000000000000000, 0) , kRWI_W , 0 , 3 ), // #239
- INST(Lsr , BaseShift , (0b0001101011000000001001, 0b0101001100000000011111, 0) , kRWI_W , 0 , 4 ), // #240
- INST(Lsrv , BaseShift , (0b0001101011000000001001, 0b0000000000000000000000, 0) , kRWI_W , 0 , 5 ), // #241
- INST(Madd , BaseRRRR , (0b0001101100000000000000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 ), // #242
- INST(Mneg , BaseRRR , (0b0001101100000000111111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 11 ), // #243
- INST(Mov , BaseMov , (_) , kRWI_W , 0 , 0 ), // #244
- INST(Movk , BaseMovKNZ , (0b01110010100000000000000000000000) , kRWI_X , 0 , 0 ), // #245
- INST(Movn , BaseMovKNZ , (0b00010010100000000000000000000000) , kRWI_W , 0 , 1 ), // #246
- INST(Movz , BaseMovKNZ , (0b01010010100000000000000000000000) , kRWI_W , 0 , 2 ), // #247
- INST(Mrs , BaseMrs , (_) , kRWI_W , 0 , 0 ), // #248
- INST(Msr , BaseMsr , (_) , kRWI_W , 0 , 0 ), // #249
- INST(Msub , BaseRRRR , (0b0001101100000000100000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 ), // #250
- INST(Mul , BaseRRR , (0b0001101100000000011111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 12 ), // #251
- INST(Mvn , BaseMvnNeg , (0b00101010001000000000001111100000) , kRWI_W , 0 , 0 ), // #252
- INST(Neg , BaseMvnNeg , (0b01001011000000000000001111100000) , kRWI_W , 0 , 1 ), // #253
- INST(Negs , BaseMvnNeg , (0b01101011000000000000001111100000) , kRWI_W , 0 , 2 ), // #254
- INST(Ngc , BaseRR , (0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 7 ), // #255
- INST(Ngcs , BaseRR , (0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 8 ), // #256
- INST(Nop , BaseOp , (0b11010101000000110010000000011111) , 0 , 0 , 13 ), // #257
- INST(Orn , BaseLogical , (0b0101010001, 0b01100100, 1) , kRWI_W , 0 , 6 ), // #258
- INST(Orr , BaseLogical , (0b0101010000, 0b01100100, 0) , kRWI_W , 0 , 7 ), // #259
- INST(Pacda , BaseRR , (0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 9 ), // #260
- INST(Pacdb , BaseRR , (0b11011010110000010000110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 10 ), // #261
- INST(Pacdza , BaseR , (0b11011010110000010010101111100000, kX, kZR, 0) , kRWI_X , 0 , 4 ), // #262
- INST(Pacdzb , BaseR , (0b11011010110000010010111111100000, kX, kZR, 0) , kRWI_X , 0 , 5 ), // #263
- INST(Pacga , BaseRRR , (0b1001101011000000001100, kX, kZR, kX, kZR, kX, kSP, false) , kRWI_W , 0 , 13 ), // #264
- INST(Prfm , BasePrfm , (0b11111000101, 0b1111100110, 0b11111000100, 0b11011000) , kRWI_R , 0 , 0 ), // #265
- INST(Pssbb , BaseOp , (0b11010101000000110011010010011111) , 0 , 0 , 14 ), // #266
- INST(Rbit , BaseRR , (0b01011010110000000000000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 11 ), // #267
- INST(Ret , BaseBranchReg , (0b11010110010111110000000000000000) , kRWI_R , 0 , 2 ), // #268
- INST(Rev , BaseRev , (_) , kRWI_W , 0 , 0 ), // #269
- INST(Rev16 , BaseRR , (0b01011010110000000000010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 12 ), // #270
- INST(Rev32 , BaseRR , (0b11011010110000000000100000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 13 ), // #271
- INST(Rev64 , BaseRR , (0b11011010110000000000110000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 14 ), // #272
- INST(Ror , BaseShift , (0b0001101011000000001011, 0b0001001110000000000000, 1) , kRWI_W , 0 , 6 ), // #273
- INST(Rorv , BaseShift , (0b0001101011000000001011, 0b0000000000000000000000, 1) , kRWI_W , 0 , 7 ), // #274
- INST(Sbc , BaseRRR , (0b0101101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 14 ), // #275
- INST(Sbcs , BaseRRR , (0b0111101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 15 ), // #276
- INST(Sbfiz , BaseBfi , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #277
- INST(Sbfm , BaseBfm , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #278
- INST(Sbfx , BaseBfx , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #279
- INST(Sdiv , BaseRRR , (0b0001101011000000000011, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 16 ), // #280
- INST(Setf8 , BaseR , (0b00111010000000000000100000001101, kW, kZR, 5) , 0 , 0 , 6 ), // #281
- INST(Setf16 , BaseR , (0b00111010000000000100100000001101, kW, kZR, 5) , 0 , 0 , 7 ), // #282
- INST(Sev , BaseOp , (0b11010101000000110010000010011111) , 0 , 0 , 15 ), // #283
- INST(Sevl , BaseOp , (0b11010101000000110010000010111111) , 0 , 0 , 16 ), // #284
- INST(Smaddl , BaseRRRR , (0b1001101100100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 2 ), // #285
- INST(Smc , BaseOpImm , (0b11010100000000000000000000000011, 16, 5) , 0 , 0 , 11 ), // #286
- INST(Smnegl , BaseRRR , (0b1001101100100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 17 ), // #287
- INST(Smsubl , BaseRRRR , (0b1001101100100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 3 ), // #288
- INST(Smulh , BaseRRR , (0b1001101101000000011111, kX , kZR, kX , kZR, kX , kZR, true) , kRWI_W , 0 , 18 ), // #289
- INST(Smull , BaseRRR , (0b1001101100100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 19 ), // #290
- INST(Ssbb , BaseOp , (0b11010101000000110011000010011111) , 0 , 0 , 17 ), // #291
- INST(St2g , BaseRM_SImm9 , (0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 13 ), // #292
- INST(Stadd , BaseAtomicSt , (0b1011100000100000000000, kWX, 30) , kRWI_RX , 0 , 0 ), // #293
- INST(Staddl , BaseAtomicSt , (0b1011100001100000000000, kWX, 30) , kRWI_RX , 0 , 1 ), // #294
- INST(Staddb , BaseAtomicSt , (0b0011100000100000000000, kW , 0 ) , kRWI_RX , 0 , 2 ), // #295
- INST(Staddlb , BaseAtomicSt , (0b0011100001100000000000, kW , 0 ) , kRWI_RX , 0 , 3 ), // #296
- INST(Staddh , BaseAtomicSt , (0b0111100000100000000000, kW , 0 ) , kRWI_RX , 0 , 4 ), // #297
- INST(Staddlh , BaseAtomicSt , (0b0111100001100000000000, kW , 0 ) , kRWI_RX , 0 , 5 ), // #298
- INST(Stclr , BaseAtomicSt , (0b1011100000100000000100, kWX, 30) , kRWI_RX , 0 , 6 ), // #299
- INST(Stclrl , BaseAtomicSt , (0b1011100001100000000100, kWX, 30) , kRWI_RX , 0 , 7 ), // #300
- INST(Stclrb , BaseAtomicSt , (0b0011100000100000000100, kW , 0 ) , kRWI_RX , 0 , 8 ), // #301
- INST(Stclrlb , BaseAtomicSt , (0b0011100001100000000100, kW , 0 ) , kRWI_RX , 0 , 9 ), // #302
- INST(Stclrh , BaseAtomicSt , (0b0111100000100000000100, kW , 0 ) , kRWI_RX , 0 , 10 ), // #303
- INST(Stclrlh , BaseAtomicSt , (0b0111100001100000000100, kW , 0 ) , kRWI_RX , 0 , 11 ), // #304
- INST(Steor , BaseAtomicSt , (0b1011100000100000001000, kWX, 30) , kRWI_RX , 0 , 12 ), // #305
- INST(Steorl , BaseAtomicSt , (0b1011100001100000001000, kWX, 30) , kRWI_RX , 0 , 13 ), // #306
- INST(Steorb , BaseAtomicSt , (0b0011100000100000001000, kW , 0 ) , kRWI_RX , 0 , 14 ), // #307
- INST(Steorlb , BaseAtomicSt , (0b0011100001100000001000, kW , 0 ) , kRWI_RX , 0 , 15 ), // #308
- INST(Steorh , BaseAtomicSt , (0b0111100000100000001000, kW , 0 ) , kRWI_RX , 0 , 16 ), // #309
- INST(Steorlh , BaseAtomicSt , (0b0111100001100000001000, kW , 0 ) , kRWI_RX , 0 , 17 ), // #310
- INST(Stg , BaseRM_SImm9 , (0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 14 ), // #311
- INST(Stgm , BaseRM_NoImm , (0b1101100110100000000000, kX , kZR, 0 ) , kRWI_RW , 0 , 13 ), // #312
- INST(Stgp , BaseLdpStp , (0b0110100100, 0b0110100010, kX, 0, 4) , kRWI_RRW , 0 , 3 ), // #313
- INST(Stllr , BaseRM_NoImm , (0b1000100010011111011111, kWX, kZR, 30) , kRWI_RW , 0 , 14 ), // #314
- INST(Stllrb , BaseRM_NoImm , (0b0000100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 15 ), // #315
- INST(Stllrh , BaseRM_NoImm , (0b0100100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 16 ), // #316
- INST(Stlr , BaseRM_NoImm , (0b1000100010011111111111, kWX, kZR, 30) , kRWI_RW , 0 , 17 ), // #317
- INST(Stlrb , BaseRM_NoImm , (0b0000100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 18 ), // #318
- INST(Stlrh , BaseRM_NoImm , (0b0100100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 19 ), // #319
- INST(Stlxp , BaseStxp , (0b1000100000100000100000, kWX, 30) , kRWI_WRRX , 0 , 0 ), // #320
- INST(Stlxr , BaseAtomicOp , (0b1000100000000000111111, kWX, 30, 1) , kRWI_WRX , 0 , 108), // #321
- INST(Stlxrb , BaseAtomicOp , (0b0000100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 109), // #322
- INST(Stlxrh , BaseAtomicOp , (0b0100100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 110), // #323
- INST(Stnp , BaseLdpStp , (0b0010100000, 0 , kWX, 31, 2) , kRWI_RRW , 0 , 4 ), // #324
- INST(Stp , BaseLdpStp , (0b0010100100, 0b0010100010, kWX, 31, 2) , kRWI_RRW , 0 , 5 ), // #325
- INST(Str , BaseLdSt , (0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur) , kRWI_RW , 0 , 6 ), // #326
- INST(Strb , BaseLdSt , (0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb) , kRWI_RW , 0 , 7 ), // #327
- INST(Strh , BaseLdSt , (0b0111100100, 0b01111000000, 0b01111000001, 0 , kWX, 30, 1, Inst::kIdSturh) , kRWI_RW , 0 , 8 ), // #328
- INST(Stset , BaseAtomicSt , (0b1011100000100000001100, kWX, 30) , kRWI_RX , 0 , 18 ), // #329
- INST(Stsetl , BaseAtomicSt , (0b1011100001100000001100, kWX, 30) , kRWI_RX , 0 , 19 ), // #330
- INST(Stsetb , BaseAtomicSt , (0b0011100000100000001100, kW , 0 ) , kRWI_RX , 0 , 20 ), // #331
- INST(Stsetlb , BaseAtomicSt , (0b0011100001100000001100, kW , 0 ) , kRWI_RX , 0 , 21 ), // #332
- INST(Stseth , BaseAtomicSt , (0b0111100000100000001100, kW , 0 ) , kRWI_RX , 0 , 22 ), // #333
- INST(Stsetlh , BaseAtomicSt , (0b0111100001100000001100, kW , 0 ) , kRWI_RX , 0 , 23 ), // #334
- INST(Stsmax , BaseAtomicSt , (0b1011100000100000010000, kWX, 30) , kRWI_RX , 0 , 24 ), // #335
- INST(Stsmaxl , BaseAtomicSt , (0b1011100001100000010000, kWX, 30) , kRWI_RX , 0 , 25 ), // #336
- INST(Stsmaxb , BaseAtomicSt , (0b0011100000100000010000, kW , 0 ) , kRWI_RX , 0 , 26 ), // #337
- INST(Stsmaxlb , BaseAtomicSt , (0b0011100001100000010000, kW , 0 ) , kRWI_RX , 0 , 27 ), // #338
- INST(Stsmaxh , BaseAtomicSt , (0b0111100000100000010000, kW , 0 ) , kRWI_RX , 0 , 28 ), // #339
- INST(Stsmaxlh , BaseAtomicSt , (0b0111100001100000010000, kW , 0 ) , kRWI_RX , 0 , 29 ), // #340
- INST(Stsmin , BaseAtomicSt , (0b1011100000100000010100, kWX, 30) , kRWI_RX , 0 , 30 ), // #341
- INST(Stsminl , BaseAtomicSt , (0b1011100001100000010100, kWX, 30) , kRWI_RX , 0 , 31 ), // #342
- INST(Stsminb , BaseAtomicSt , (0b0011100000100000010100, kW , 0 ) , kRWI_RX , 0 , 32 ), // #343
- INST(Stsminlb , BaseAtomicSt , (0b0011100001100000010100, kW , 0 ) , kRWI_RX , 0 , 33 ), // #344
- INST(Stsminh , BaseAtomicSt , (0b0111100000100000010100, kW , 0 ) , kRWI_RX , 0 , 34 ), // #345
- INST(Stsminlh , BaseAtomicSt , (0b0111100001100000010100, kW , 0 ) , kRWI_RX , 0 , 35 ), // #346
- INST(Sttr , BaseRM_SImm9 , (0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 15 ), // #347
- INST(Sttrb , BaseRM_SImm9 , (0b0011100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 16 ), // #348
- INST(Sttrh , BaseRM_SImm9 , (0b0111100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 17 ), // #349
- INST(Stumax , BaseAtomicSt , (0b1011100000100000011000, kWX, 30) , kRWI_RX , 0 , 36 ), // #350
- INST(Stumaxl , BaseAtomicSt , (0b1011100001100000011000, kWX, 30) , kRWI_RX , 0 , 37 ), // #351
- INST(Stumaxb , BaseAtomicSt , (0b0011100000100000011000, kW , 0 ) , kRWI_RX , 0 , 38 ), // #352
- INST(Stumaxlb , BaseAtomicSt , (0b0011100001100000011000, kW , 0 ) , kRWI_RX , 0 , 39 ), // #353
- INST(Stumaxh , BaseAtomicSt , (0b0111100000100000011000, kW , 0 ) , kRWI_RX , 0 , 40 ), // #354
- INST(Stumaxlh , BaseAtomicSt , (0b0111100001100000011000, kW , 0 ) , kRWI_RX , 0 , 41 ), // #355
- INST(Stumin , BaseAtomicSt , (0b1011100000100000011100, kWX, 30) , kRWI_RX , 0 , 42 ), // #356
- INST(Stuminl , BaseAtomicSt , (0b1011100001100000011100, kWX, 30) , kRWI_RX , 0 , 43 ), // #357
- INST(Stuminb , BaseAtomicSt , (0b0011100000100000011100, kW , 0 ) , kRWI_RX , 0 , 44 ), // #358
- INST(Stuminlb , BaseAtomicSt , (0b0011100001100000011100, kW , 0 ) , kRWI_RX , 0 , 45 ), // #359
- INST(Stuminh , BaseAtomicSt , (0b0111100000100000011100, kW , 0 ) , kRWI_RX , 0 , 46 ), // #360
- INST(Stuminlh , BaseAtomicSt , (0b0111100001100000011100, kW , 0 ) , kRWI_RX , 0 , 47 ), // #361
- INST(Stur , BaseRM_SImm9 , (0b1011100000000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 18 ), // #362
- INST(Sturb , BaseRM_SImm9 , (0b0011100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 19 ), // #363
- INST(Sturh , BaseRM_SImm9 , (0b0111100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 20 ), // #364
- INST(Stxp , BaseStxp , (0b1000100000100000000000, kWX, 30) , kRWI_WRRW , 0 , 1 ), // #365
- INST(Stxr , BaseStx , (0b1000100000000000011111, kWX, 30) , kRWI_WRW , 0 , 0 ), // #366
- INST(Stxrb , BaseStx , (0b0000100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 1 ), // #367
- INST(Stxrh , BaseStx , (0b0100100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 2 ), // #368
- INST(Stz2g , BaseRM_SImm9 , (0b1101100111100000000010, 0b1101100111100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 21 ), // #369
- INST(Stzg , BaseRM_SImm9 , (0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 22 ), // #370
- INST(Stzgm , BaseRM_NoImm , (0b1101100100100000000000, kX , kZR, 0) , kRWI_RW , 0 , 20 ), // #371
- INST(Sub , BaseAddSub , (0b1001011000, 0b1001011001, 0b1010001) , kRWI_W , 0 , 2 ), // #372
- INST(Subg , BaseRRII , (0b1101000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 1 ), // #373
- INST(Subp , BaseRRR , (0b1001101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 20 ), // #374
- INST(Subps , BaseRRR , (0b1011101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 21 ), // #375
- INST(Subs , BaseAddSub , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_W , 0 , 3 ), // #376
- INST(Svc , BaseOpImm , (0b11010100000000000000000000000001, 16, 5) , 0 , 0 , 12 ), // #377
- INST(Swp , BaseAtomicOp , (0b1011100000100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 111), // #378
- INST(Swpa , BaseAtomicOp , (0b1011100010100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 112), // #379
- INST(Swpab , BaseAtomicOp , (0b0011100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 113), // #380
- INST(Swpah , BaseAtomicOp , (0b0111100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 114), // #381
- INST(Swpal , BaseAtomicOp , (0b1011100011100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 115), // #382
- INST(Swpalb , BaseAtomicOp , (0b0011100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 116), // #383
- INST(Swpalh , BaseAtomicOp , (0b0111100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 117), // #384
- INST(Swpb , BaseAtomicOp , (0b0011100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 118), // #385
- INST(Swph , BaseAtomicOp , (0b0111100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 119), // #386
- INST(Swpl , BaseAtomicOp , (0b1011100001100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 120), // #387
- INST(Swplb , BaseAtomicOp , (0b0011100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 121), // #388
- INST(Swplh , BaseAtomicOp , (0b0111100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 122), // #389
- INST(Sxtb , BaseExtend , (0b0001001100000000000111, kWX, 0) , kRWI_W , 0 , 0 ), // #390
- INST(Sxth , BaseExtend , (0b0001001100000000001111, kWX, 0) , kRWI_W , 0 , 1 ), // #391
- INST(Sxtw , BaseExtend , (0b1001001101000000011111, kX , 0) , kRWI_W , 0 , 2 ), // #392
- INST(Sys , BaseSys , (_) , kRWI_W , 0 , 0 ), // #393
- INST(Tlbi , BaseAtDcIcTlbi , (0b00011110000000, 0b00010000000000, false) , kRWI_RX , 0 , 3 ), // #394
- INST(Tst , BaseTst , (0b1101010000, 0b111001000) , kRWI_R , 0 , 0 ), // #395
- INST(Tbnz , BaseBranchTst , (0b00110111000000000000000000000000) , kRWI_R , 0 , 0 ), // #396
- INST(Tbz , BaseBranchTst , (0b00110110000000000000000000000000) , kRWI_R , 0 , 1 ), // #397
- INST(Ubfiz , BaseBfi , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #398
- INST(Ubfm , BaseBfm , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #399
- INST(Ubfx , BaseBfx , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #400
- INST(Udf , BaseOpImm , (0b00000000000000000000000000000000, 16, 0) , 0 , 0 , 13 ), // #401
- INST(Udiv , BaseRRR , (0b0001101011000000000010, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 22 ), // #402
- INST(Umaddl , BaseRRRR , (0b1001101110100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 4 ), // #403
- INST(Umnegl , BaseRRR , (0b1001101110100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 23 ), // #404
- INST(Umull , BaseRRR , (0b1001101110100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 24 ), // #405
- INST(Umulh , BaseRRR , (0b1001101111000000011111, kX , kZR, kX , kZR, kX , kZR, false) , kRWI_W , 0 , 25 ), // #406
- INST(Umsubl , BaseRRRR , (0b1001101110100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 5 ), // #407
- INST(Uxtb , BaseExtend , (0b0101001100000000000111, kW, 1) , kRWI_W , 0 , 3 ), // #408
- INST(Uxth , BaseExtend , (0b0101001100000000001111, kW, 1) , kRWI_W , 0 , 4 ), // #409
- INST(Wfe , BaseOp , (0b11010101000000110010000001011111) , 0 , 0 , 18 ), // #410
- INST(Wfi , BaseOp , (0b11010101000000110010000001111111) , 0 , 0 , 19 ), // #411
- INST(Xaflag , BaseOp , (0b11010101000000000100000000111111) , 0 , 0 , 20 ), // #412
- INST(Xpacd , BaseR , (0b11011010110000010100011111100000, kX, kZR, 0) , kRWI_X , 0 , 8 ), // #413
- INST(Xpaci , BaseR , (0b11011010110000010100001111100000, kX, kZR, 0) , kRWI_X , 0 , 9 ), // #414
- INST(Xpaclri , BaseOp , (0b11010101000000110010000011111111) , kRWI_X , 0 , 21 ), // #415
- INST(Yield , BaseOp , (0b11010101000000110010000000111111) , 0 , 0 , 22 ), // #416
- INST(Abs_v , ISimdVV , (0b0000111000100000101110, kVO_V_Any) , kRWI_W , 0 , 0 ), // #417
- INST(Add_v , ISimdVVV , (0b0000111000100000100001, kVO_V_Any) , kRWI_W , 0 , 0 ), // #418
- INST(Addhn_v , ISimdVVV , (0b0000111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 1 ), // #419
- INST(Addhn2_v , ISimdVVV , (0b0100111000100000010000, kVO_V_B16H8S4) , kRWI_W , F(Narrow) , 2 ), // #420
- INST(Addp_v , ISimdPair , (0b0101111000110001101110, 0b0000111000100000101111, kVO_V_Any) , kRWI_W , F(Pair) , 0 ), // #421
- INST(Addv_v , ISimdSV , (0b0000111000110001101110, kVO_V_BH_4S) , kRWI_W , 0 , 0 ), // #422
- INST(Aesd_v , ISimdVVx , (0b0100111000101000010110, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 0 ), // #423
- INST(Aese_v , ISimdVVx , (0b0100111000101000010010, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 1 ), // #424
- INST(Aesimc_v , ISimdVVx , (0b0100111000101000011110, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 2 ), // #425
- INST(Aesmc_v , ISimdVVx , (0b0100111000101000011010, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 3 ), // #426
- INST(And_v , ISimdVVV , (0b0000111000100000000111, kVO_V_B) , kRWI_W , 0 , 3 ), // #427
- INST(Bcax_v , ISimdVVVV , (0b1100111000100000000000, kVO_V_B16) , kRWI_W , 0 , 0 ), // #428
- INST(Bfcvt_v , ISimdVVx , (0b0001111001100011010000, kOp_H, kOp_S) , kRWI_W , 0 , 4 ), // #429
- INST(Bfcvtn_v , ISimdVVx , (0b0000111010100001011010, kOp_V4H, kOp_V4S) , kRWI_W , F(Narrow) , 5 ), // #430
- INST(Bfcvtn2_v , ISimdVVx , (0b0100111010100001011010, kOp_V8H, kOp_V4S) , kRWI_W , F(Narrow) , 6 ), // #431
- INST(Bfdot_v , SimdDot , (0b0010111001000000111111, 0b0000111101000000111100, kET_S, kET_H, kET_2H) , kRWI_X , 0 , 0 ), // #432
- INST(Bfmlalb_v , SimdFmlal , (0b0010111011000000111111, 0b0000111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 0 ), // #433
- INST(Bfmlalt_v , SimdFmlal , (0b0110111011000000111111, 0b0100111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 1 ), // #434
- INST(Bfmmla_v , ISimdVVVx , (0b0110111001000000111011, kOp_V4S, kOp_V8H, kOp_V8H) , kRWI_X , F(Long) , 0 ), // #435
- INST(Bic_v , SimdBicOrr , (0b0000111001100000000111, 0b0010111100000000000001) , kRWI_W , 0 , 0 ), // #436
- INST(Bif_v , ISimdVVV , (0b0010111011100000000111, kVO_V_B) , kRWI_X , 0 , 4 ), // #437
- INST(Bit_v , ISimdVVV , (0b0010111010100000000111, kVO_V_B) , kRWI_X , 0 , 5 ), // #438
- INST(Bsl_v , ISimdVVV , (0b0010111001100000000111, kVO_V_B) , kRWI_X , 0 , 6 ), // #439
- INST(Cls_v , ISimdVV , (0b0000111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 1 ), // #440
- INST(Clz_v , ISimdVV , (0b0010111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 2 ), // #441
- INST(Cmeq_v , SimdCmp , (0b0010111000100000100011, 0b0000111000100000100110, kVO_V_Any) , kRWI_W , 0 , 0 ), // #442
- INST(Cmge_v , SimdCmp , (0b0000111000100000001111, 0b0010111000100000100010, kVO_V_Any) , kRWI_W , 0 , 1 ), // #443
- INST(Cmgt_v , SimdCmp , (0b0000111000100000001101, 0b0000111000100000100010, kVO_V_Any) , kRWI_W , 0 , 2 ), // #444
- INST(Cmhi_v , SimdCmp , (0b0010111000100000001101, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 3 ), // #445
- INST(Cmhs_v , SimdCmp , (0b0010111000100000001111, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 4 ), // #446
- INST(Cmle_v , SimdCmp , (0b0000000000000000000000, 0b0010111000100000100110, kVO_V_Any) , kRWI_W , 0 , 5 ), // #447
- INST(Cmlt_v , SimdCmp , (0b0000000000000000000000, 0b0000111000100000101010, kVO_V_Any) , kRWI_W , 0 , 6 ), // #448
- INST(Cmtst_v , ISimdVVV , (0b0000111000100000100011, kVO_V_Any) , kRWI_W , 0 , 7 ), // #449
- INST(Cnt_v , ISimdVV , (0b0000111000100000010110, kVO_V_B) , kRWI_W , 0 , 3 ), // #450
- INST(Dup_v , SimdDup , (_) , kRWI_W , 0 , 0 ), // #451
- INST(Eor_v , ISimdVVV , (0b0010111000100000000111, kVO_V_B) , kRWI_W , 0 , 8 ), // #452
- INST(Eor3_v , ISimdVVVV , (0b1100111000000000000000, kVO_V_B16) , kRWI_W , 0 , 1 ), // #453
- INST(Ext_v , ISimdVVVI , (0b0010111000000000000000, kVO_V_B, 4, 11, 1) , kRWI_W , 0 , 0 ), // #454
- INST(Fabd_v , FSimdVVV , (0b0111111010100000110101, kHF_C, 0b0010111010100000110101, kHF_C) , kRWI_W , 0 , 0 ), // #455
- INST(Fabs_v , FSimdVV , (0b0001111000100000110000, kHF_A, 0b0000111010100000111110, kHF_B) , kRWI_W , 0 , 0 ), // #456
- INST(Facge_v , FSimdVVV , (0b0111111000100000111011, kHF_C, 0b0010111000100000111011, kHF_C) , kRWI_W , 0 , 1 ), // #457
- INST(Facgt_v , FSimdVVV , (0b0111111010100000111011, kHF_C, 0b0010111010100000111011, kHF_C) , kRWI_W , 0 , 2 ), // #458
- INST(Fadd_v , FSimdVVV , (0b0001111000100000001010, kHF_A, 0b0000111000100000110101, kHF_C) , kRWI_W , 0 , 3 ), // #459
- INST(Faddp_v , FSimdPair , (0b0111111000110000110110, 0b0010111000100000110101) , kRWI_W , 0 , 0 ), // #460
- INST(Fcadd_v , SimdFcadd , (0b0010111000000000111001) , kRWI_W , 0 , 0 ), // #461
- INST(Fccmp_v , SimdFccmpFccmpe , (0b00011110001000000000010000000000) , kRWI_R , 0 , 0 ), // #462
- INST(Fccmpe_v , SimdFccmpFccmpe , (0b00011110001000000000010000010000) , kRWI_R , 0 , 1 ), // #463
- INST(Fcmeq_v , SimdFcm , (0b0000111000100000111001, kHF_C, 0b0000111010100000110110) , kRWI_W , 0 , 0 ), // #464
- INST(Fcmge_v , SimdFcm , (0b0010111000100000111001, kHF_C, 0b0010111010100000110010) , kRWI_W , 0 , 1 ), // #465
- INST(Fcmgt_v , SimdFcm , (0b0010111010100000111001, kHF_C, 0b0000111010100000110010) , kRWI_W , 0 , 2 ), // #466
- INST(Fcmla_v , SimdFcmla , (0b0010111000000000110001, 0b0010111100000000000100) , kRWI_X , 0 , 0 ), // #467
- INST(Fcmle_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0010111010100000110110) , kRWI_W , 0 , 3 ), // #468
- INST(Fcmlt_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0000111010100000111010) , kRWI_W , 0 , 4 ), // #469
- INST(Fcmp_v , SimdFcmpFcmpe , (0b00011110001000000010000000000000) , kRWI_R , 0 , 0 ), // #470
- INST(Fcmpe_v , SimdFcmpFcmpe , (0b00011110001000000010000000010000) , kRWI_R , 0 , 1 ), // #471
- INST(Fcsel_v , SimdFcsel , (_) , kRWI_W , 0 , 0 ), // #472
- INST(Fcvt_v , SimdFcvt , (_) , kRWI_W , 0 , 0 ), // #473
- INST(Fcvtas_v , SimdFcvtSV , (0b0000111000100001110010, 0b0000000000000000000000, 0b0001111000100100000000, 1) , kRWI_W , 0 , 0 ), // #474
- INST(Fcvtau_v , SimdFcvtSV , (0b0010111000100001110010, 0b0000000000000000000000, 0b0001111000100101000000, 1) , kRWI_W , 0 , 1 ), // #475
- INST(Fcvtl_v , SimdFcvtLN , (0b0000111000100001011110, 0, 0) , kRWI_W , F(Long) , 0 ), // #476
- INST(Fcvtl2_v , SimdFcvtLN , (0b0100111000100001011110, 0, 0) , kRWI_W , F(Long) , 1 ), // #477
- INST(Fcvtms_v , SimdFcvtSV , (0b0000111000100001101110, 0b0000000000000000000000, 0b0001111000110000000000, 1) , kRWI_W , 0 , 2 ), // #478
- INST(Fcvtmu_v , SimdFcvtSV , (0b0010111000100001101110, 0b0000000000000000000000, 0b0001111000110001000000, 1) , kRWI_W , 0 , 3 ), // #479
- INST(Fcvtn_v , SimdFcvtLN , (0b0000111000100001011010, 0, 0) , kRWI_W , F(Narrow) , 2 ), // #480
- INST(Fcvtn2_v , SimdFcvtLN , (0b0100111000100001011010, 0, 0) , kRWI_X , F(Narrow) , 3 ), // #481
- INST(Fcvtns_v , SimdFcvtSV , (0b0000111000100001101010, 0b0000000000000000000000, 0b0001111000100000000000, 1) , kRWI_W , 0 , 4 ), // #482
- INST(Fcvtnu_v , SimdFcvtSV , (0b0010111000100001101010, 0b0000000000000000000000, 0b0001111000100001000000, 1) , kRWI_W , 0 , 5 ), // #483
- INST(Fcvtps_v , SimdFcvtSV , (0b0000111010100001101010, 0b0000000000000000000000, 0b0001111000101000000000, 1) , kRWI_W , 0 , 6 ), // #484
- INST(Fcvtpu_v , SimdFcvtSV , (0b0010111010100001101010, 0b0000000000000000000000, 0b0001111000101001000000, 1) , kRWI_W , 0 , 7 ), // #485
- INST(Fcvtxn_v , SimdFcvtLN , (0b0010111000100001011010, 1, 1) , kRWI_W , F(Narrow) , 4 ), // #486
- INST(Fcvtxn2_v , SimdFcvtLN , (0b0110111000100001011010, 1, 0) , kRWI_X , F(Narrow) , 5 ), // #487
- INST(Fcvtzs_v , SimdFcvtSV , (0b0000111010100001101110, 0b0000111100000000111111, 0b0001111000111000000000, 1) , kRWI_W , 0 , 8 ), // #488
- INST(Fcvtzu_v , SimdFcvtSV , (0b0010111010100001101110, 0b0010111100000000111111, 0b0001111000111001000000, 1) , kRWI_W , 0 , 9 ), // #489
- INST(Fdiv_v , FSimdVVV , (0b0001111000100000000110, kHF_A, 0b0010111000100000111111, kHF_C) , kRWI_W , 0 , 4 ), // #490
- INST(Fjcvtzs_v , ISimdVVx , (0b0001111001111110000000, kOp_GpW, kOp_D) , kRWI_W , 0 , 7 ), // #491
- INST(Fmadd_v , FSimdVVVV , (0b0001111100000000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 0 ), // #492
- INST(Fmax_v , FSimdVVV , (0b0001111000100000010010, kHF_A, 0b0000111000100000111101, kHF_C) , kRWI_W , 0 , 5 ), // #493
- INST(Fmaxnm_v , FSimdVVV , (0b0001111000100000011010, kHF_A, 0b0000111000100000110001, kHF_C) , kRWI_W , 0 , 6 ), // #494
- INST(Fmaxnmp_v , FSimdPair , (0b0111111000110000110010, 0b0010111000100000110001) , kRWI_W , 0 , 1 ), // #495
- INST(Fmaxnmv_v , FSimdSV , (0b0010111000110000110010) , kRWI_W , 0 , 0 ), // #496
- INST(Fmaxp_v , FSimdPair , (0b0111111000110000111110, 0b0010111000100000111101) , kRWI_W , 0 , 2 ), // #497
- INST(Fmaxv_v , FSimdSV , (0b0010111000110000111110) , kRWI_W , 0 , 1 ), // #498
- INST(Fmin_v , FSimdVVV , (0b0001111000100000010110, kHF_A, 0b0000111010100000111101, kHF_C) , kRWI_W , 0 , 7 ), // #499
- INST(Fminnm_v , FSimdVVV , (0b0001111000100000011110, kHF_A, 0b0000111010100000110001, kHF_C) , kRWI_W , 0 , 8 ), // #500
- INST(Fminnmp_v , FSimdPair , (0b0111111010110000110010, 0b0010111010100000110001) , kRWI_W , 0 , 3 ), // #501
- INST(Fminnmv_v , FSimdSV , (0b0010111010110000110010) , kRWI_W , 0 , 2 ), // #502
- INST(Fminp_v , FSimdPair , (0b0111111010110000111110, 0b0010111010100000111101) , kRWI_W , 0 , 4 ), // #503
- INST(Fminv_v , FSimdSV , (0b0010111010110000111110) , kRWI_W , 0 , 3 ), // #504
- INST(Fmla_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111000100000110011, 0b0000111110000000000100) , kRWI_X , F(VH0_15) , 0 ), // #505
- INST(Fmlal_v , SimdFmlal , (0b0000111000100000111011, 0b0000111110000000000000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 2 ), // #506
- INST(Fmlal2_v , SimdFmlal , (0b0010111000100000110011, 0b0010111110000000100000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 3 ), // #507
- INST(Fmls_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111010100000110011, 0b0000111110000000010100) , kRWI_X , F(VH0_15) , 1 ), // #508
- INST(Fmlsl_v , SimdFmlal , (0b0000111010100000111011, 0b0000111110000000010000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 4 ), // #509
- INST(Fmlsl2_v , SimdFmlal , (0b0010111010100000110011, 0b0010111110000000110000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 5 ), // #510
- INST(Fmov_v , SimdFmov , (_) , kRWI_W , 0 , 0 ), // #511
- INST(Fmsub_v , FSimdVVVV , (0b0001111100000000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 1 ), // #512
- INST(Fmul_v , FSimdVVVe , (0b0001111000100000000010, kHF_A, 0b0010111000100000110111, 0b0000111110000000100100) , kRWI_W , F(VH0_15) , 2 ), // #513
- INST(Fmulx_v , FSimdVVVe , (0b0101111000100000110111, kHF_C, 0b0000111000100000110111, 0b0010111110000000100100) , kRWI_W , F(VH0_15) , 3 ), // #514
- INST(Fneg_v , FSimdVV , (0b0001111000100001010000, kHF_A, 0b0010111010100000111110, kHF_B) , kRWI_W , 0 , 1 ), // #515
- INST(Fnmadd_v , FSimdVVVV , (0b0001111100100000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 2 ), // #516
- INST(Fnmsub_v , FSimdVVVV , (0b0001111100100000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 ), // #517
- INST(Fnmul_v , FSimdVVV , (0b0001111000100000100010, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 9 ), // #518
- INST(Frecpe_v , FSimdVV , (0b0101111010100001110110, kHF_B, 0b0000111010100001110110, kHF_B) , kRWI_W , 0 , 2 ), // #519
- INST(Frecps_v , FSimdVVV , (0b0101111000100000111111, kHF_C, 0b0000111000100000111111, kHF_C) , kRWI_W , 0 , 10 ), // #520
- INST(Frecpx_v , FSimdVV , (0b0101111010100001111110, kHF_B, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 ), // #521
- INST(Frint32x_v , FSimdVV , (0b0001111000101000110000, kHF_N, 0b0010111000100001111010, kHF_N) , kRWI_W , 0 , 4 ), // #522
- INST(Frint32z_v , FSimdVV , (0b0001111000101000010000, kHF_N, 0b0000111000100001111010, kHF_N) , kRWI_W , 0 , 5 ), // #523
- INST(Frint64x_v , FSimdVV , (0b0001111000101001110000, kHF_N, 0b0010111000100001111110, kHF_N) , kRWI_W , 0 , 6 ), // #524
- INST(Frint64z_v , FSimdVV , (0b0001111000101001010000, kHF_N, 0b0000111000100001111110, kHF_N) , kRWI_W , 0 , 7 ), // #525
- INST(Frinta_v , FSimdVV , (0b0001111000100110010000, kHF_A, 0b0010111000100001100010, kHF_B) , kRWI_W , 0 , 8 ), // #526
- INST(Frinti_v , FSimdVV , (0b0001111000100111110000, kHF_A, 0b0010111010100001100110, kHF_B) , kRWI_W , 0 , 9 ), // #527
- INST(Frintm_v , FSimdVV , (0b0001111000100101010000, kHF_A, 0b0000111000100001100110, kHF_B) , kRWI_W , 0 , 10 ), // #528
- INST(Frintn_v , FSimdVV , (0b0001111000100100010000, kHF_A, 0b0000111000100001100010, kHF_B) , kRWI_W , 0 , 11 ), // #529
- INST(Frintp_v , FSimdVV , (0b0001111000100100110000, kHF_A, 0b0000111010100001100010, kHF_B) , kRWI_W , 0 , 12 ), // #530
- INST(Frintx_v , FSimdVV , (0b0001111000100111010000, kHF_A, 0b0010111000100001100110, kHF_B) , kRWI_W , 0 , 13 ), // #531
- INST(Frintz_v , FSimdVV , (0b0001111000100101110000, kHF_A, 0b0000111010100001100110, kHF_B) , kRWI_W , 0 , 14 ), // #532
- INST(Frsqrte_v , FSimdVV , (0b0111111010100001110110, kHF_B, 0b0010111010100001110110, kHF_B) , kRWI_W , 0 , 15 ), // #533
- INST(Frsqrts_v , FSimdVVV , (0b0101111010100000111111, kHF_C, 0b0000111010100000111111, kHF_C) , kRWI_W , 0 , 11 ), // #534
- INST(Fsqrt_v , FSimdVV , (0b0001111000100001110000, kHF_A, 0b0010111010100001111110, kHF_B) , kRWI_W , 0 , 16 ), // #535
- INST(Fsub_v , FSimdVVV , (0b0001111000100000001110, kHF_A, 0b0000111010100000110101, kHF_C) , kRWI_W , 0 , 12 ), // #536
- INST(Ins_v , SimdIns , (_) , kRWI_X , 0 , 0 ), // #537
- INST(Ld1_v , SimdLdNStN , (0b0000110101000000000000, 0b0000110001000000001000, 1, 0) , kRWI_LDn , F(Consecutive) , 0 ), // #538
- INST(Ld1r_v , SimdLdNStN , (0b0000110101000000110000, 0b0000000000000000000000, 1, 1) , kRWI_LDn , F(Consecutive) , 1 ), // #539
- INST(Ld2_v , SimdLdNStN , (0b0000110101100000000000, 0b0000110001000000100000, 2, 0) , kRWI_LDn , F(Consecutive) , 2 ), // #540
- INST(Ld2r_v , SimdLdNStN , (0b0000110101100000110000, 0b0000000000000000000000, 2, 1) , kRWI_LDn , F(Consecutive) , 3 ), // #541
- INST(Ld3_v , SimdLdNStN , (0b0000110101000000001000, 0b0000110001000000010000, 3, 0) , kRWI_LDn , F(Consecutive) , 4 ), // #542
- INST(Ld3r_v , SimdLdNStN , (0b0000110101000000111000, 0b0000000000000000000000, 3, 1) , kRWI_LDn , F(Consecutive) , 5 ), // #543
- INST(Ld4_v , SimdLdNStN , (0b0000110101100000001000, 0b0000110001000000000000, 4, 0) , kRWI_LDn , F(Consecutive) , 6 ), // #544
- INST(Ld4r_v , SimdLdNStN , (0b0000110101100000111000, 0b0000000000000000000000, 4, 1) , kRWI_LDn , F(Consecutive) , 7 ), // #545
- INST(Ldnp_v , SimdLdpStp , (0b0010110001, 0b0000000000) , kRWI_WW , 0 , 0 ), // #546
- INST(Ldp_v , SimdLdpStp , (0b0010110101, 0b0010110011) , kRWI_WW , 0 , 1 ), // #547
- INST(Ldr_v , SimdLdSt , (0b0011110101, 0b00111100010, 0b00111100011, 0b00011100, Inst::kIdLdur_v) , kRWI_W , 0 , 0 ), // #548
- INST(Ldur_v , SimdLdurStur , (0b0011110001000000000000) , kRWI_W , 0 , 0 ), // #549
- INST(Mla_v , ISimdVVVe , (0b0000111000100000100101, kVO_V_BHS, 0b0010111100000000000000, kVO_V_HS) , kRWI_X , F(VH0_15) , 0 ), // #550
- INST(Mls_v , ISimdVVVe , (0b0010111000100000100101, kVO_V_BHS, 0b0010111100000000010000, kVO_V_HS) , kRWI_X , F(VH0_15) , 1 ), // #551
- INST(Mov_v , SimdMov , (_) , kRWI_W , 0 , 0 ), // #552
- INST(Movi_v , SimdMoviMvni , (0b0000111100000000000001, 0) , kRWI_W , 0 , 0 ), // #553
- INST(Mul_v , ISimdVVVe , (0b0000111000100000100111, kVO_V_BHS, 0b0000111100000000100000, kVO_V_HS) , kRWI_W , F(VH0_15) , 2 ), // #554
- INST(Mvn_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 4 ), // #555
- INST(Mvni_v , SimdMoviMvni , (0b0000111100000000000001, 1) , kRWI_W , 0 , 1 ), // #556
- INST(Neg_v , ISimdVV , (0b0010111000100000101110, kVO_V_Any) , kRWI_W , 0 , 5 ), // #557
- INST(Not_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 6 ), // #558
- INST(Orn_v , ISimdVVV , (0b0000111011100000000111, kVO_V_B) , kRWI_W , 0 , 9 ), // #559
- INST(Orr_v , SimdBicOrr , (0b0000111010100000000111, 0b0000111100000000000001) , kRWI_W , 0 , 1 ), // #560
- INST(Pmul_v , ISimdVVV , (0b0010111000100000100111, kVO_V_B) , kRWI_W , 0 , 10 ), // #561
- INST(Pmull_v , ISimdVVV , (0b0000111000100000111000, kVO_V_B8D1) , kRWI_W , F(Long) , 11 ), // #562
- INST(Pmull2_v , ISimdVVV , (0b0100111000100000111000, kVO_V_B16D2) , kRWI_W , F(Long) , 12 ), // #563
- INST(Raddhn_v , ISimdVVV , (0b0010111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 13 ), // #564
- INST(Raddhn2_v , ISimdVVV , (0b0110111000100000010000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 ), // #565
- INST(Rax1_v , ISimdVVV , (0b1100111001100000100011, kVO_V_D2) , kRWI_W , 0 , 15 ), // #566
- INST(Rbit_v , ISimdVV , (0b0010111001100000010110, kVO_V_B) , kRWI_W , 0 , 7 ), // #567
- INST(Rev16_v , ISimdVV , (0b0000111000100000000110, kVO_V_B) , kRWI_W , 0 , 8 ), // #568
- INST(Rev32_v , ISimdVV , (0b0010111000100000000010, kVO_V_BH) , kRWI_W , 0 , 9 ), // #569
- INST(Rev64_v , ISimdVV , (0b0000111000100000000010, kVO_V_BHS) , kRWI_W , 0 , 10 ), // #570
- INST(Rshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100011, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 0 ), // #571
- INST(Rshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 1 ), // #572
- INST(Rsubhn_v , ISimdVVV , (0b0010111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 16 ), // #573
- INST(Rsubhn2_v , ISimdVVV , (0b0110111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 17 ), // #574
- INST(Saba_v , ISimdVVV , (0b0000111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 18 ), // #575
- INST(Sabal_v , ISimdVVV , (0b0000111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 19 ), // #576
- INST(Sabal2_v , ISimdVVV , (0b0100111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 20 ), // #577
- INST(Sabd_v , ISimdVVV , (0b0000111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 21 ), // #578
- INST(Sabdl_v , ISimdVVV , (0b0000111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 ), // #579
- INST(Sabdl2_v , ISimdVVV , (0b0100111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 ), // #580
- INST(Sadalp_v , ISimdVV , (0b0000111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 11 ), // #581
- INST(Saddl_v , ISimdVVV , (0b0000111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 24 ), // #582
- INST(Saddl2_v , ISimdVVV , (0b0100111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 25 ), // #583
- INST(Saddlp_v , ISimdVV , (0b0000111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 12 ), // #584
- INST(Saddlv_v , ISimdSV , (0b0000111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 1 ), // #585
- INST(Saddw_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 0 ), // #586
- INST(Saddw2_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 1 ), // #587
- INST(Scvtf_v , SimdFcvtSV , (0b0000111000100001110110, 0b0000111100000000111001, 0b0001111000100010000000, 0) , kRWI_W , 0 , 10 ), // #588
- INST(Sdot_v , SimdDot , (0b0000111010000000100101, 0b0000111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 1 ), // #589
- INST(Sha1c_v , ISimdVVVx , (0b0101111000000000000000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 1 ), // #590
- INST(Sha1h_v , ISimdVVx , (0b0101111000101000000010, kOp_S, kOp_S) , kRWI_W , 0 , 8 ), // #591
- INST(Sha1m_v , ISimdVVVx , (0b0101111000000000001000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 2 ), // #592
- INST(Sha1p_v , ISimdVVVx , (0b0101111000000000000100, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 3 ), // #593
- INST(Sha1su0_v , ISimdVVVx , (0b0101111000000000001100, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 4 ), // #594
- INST(Sha1su1_v , ISimdVVx , (0b0101111000101000000110, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 9 ), // #595
- INST(Sha256h_v , ISimdVVVx , (0b0101111000000000010000, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 5 ), // #596
- INST(Sha256h2_v , ISimdVVVx , (0b0101111000000000010100, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 6 ), // #597
- INST(Sha256su0_v , ISimdVVx , (0b0101111000101000001010, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 10 ), // #598
- INST(Sha256su1_v , ISimdVVVx , (0b0101111000000000011000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 7 ), // #599
- INST(Sha512h_v , ISimdVVVx , (0b1100111001100000100000, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 8 ), // #600
- INST(Sha512h2_v , ISimdVVVx , (0b1100111001100000100001, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 9 ), // #601
- INST(Sha512su0_v , ISimdVVx , (0b1100111011000000100000, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 11 ), // #602
- INST(Sha512su1_v , ISimdVVVx , (0b1100111001100000100010, kOp_V2D, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 10 ), // #603
- INST(Shadd_v , ISimdVVV , (0b0000111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 26 ), // #604
- INST(Shl_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000010101, 0, kVO_V_Any) , kRWI_W , 0 , 2 ), // #605
- INST(Shll_v , SimdShiftES , (0b0010111000100001001110, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 ), // #606
- INST(Shll2_v , SimdShiftES , (0b0110111000100001001110, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 ), // #607
- INST(Shrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100001, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 3 ), // #608
- INST(Shrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 4 ), // #609
- INST(Shsub_v , ISimdVVV , (0b0000111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 27 ), // #610
- INST(Sli_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010101, 0, kVO_V_Any) , kRWI_X , 0 , 5 ), // #611
- INST(Sm3partw1_v , ISimdVVVx , (0b1100111001100000110000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 11 ), // #612
- INST(Sm3partw2_v , ISimdVVVx , (0b1100111001100000110001, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 ), // #613
- INST(Sm3ss1_v , ISimdVVVVx , (0b1100111001000000000000, kOp_V4S, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_W , 0 , 0 ), // #614
- INST(Sm3tt1a_v , SimdSm3tt , (0b1100111001000000100000) , kRWI_X , 0 , 0 ), // #615
- INST(Sm3tt1b_v , SimdSm3tt , (0b1100111001000000100001) , kRWI_X , 0 , 1 ), // #616
- INST(Sm3tt2a_v , SimdSm3tt , (0b1100111001000000100010) , kRWI_X , 0 , 2 ), // #617
- INST(Sm3tt2b_v , SimdSm3tt , (0b1100111001000000100011) , kRWI_X , 0 , 3 ), // #618
- INST(Sm4e_v , ISimdVVx , (0b1100111011000000100001, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 ), // #619
- INST(Sm4ekey_v , ISimdVVVx , (0b1100111001100000110010, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 13 ), // #620
- INST(Smax_v , ISimdVVV , (0b0000111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 28 ), // #621
- INST(Smaxp_v , ISimdVVV , (0b0000111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 29 ), // #622
- INST(Smaxv_v , ISimdSV , (0b0000111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 2 ), // #623
- INST(Smin_v , ISimdVVV , (0b0000111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 30 ), // #624
- INST(Sminp_v , ISimdVVV , (0b0000111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 31 ), // #625
- INST(Sminv_v , ISimdSV , (0b0000111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 3 ), // #626
- INST(Smlal_v , ISimdVVVe , (0b0000111000100000100000, kVO_V_B8H4S2, 0b0000111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 3 ), // #627
- INST(Smlal2_v , ISimdVVVe , (0b0100111000100000100000, kVO_V_B16H8S4, 0b0100111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 4 ), // #628
- INST(Smlsl_v , ISimdVVVe , (0b0000111000100000101000, kVO_V_B8H4S2, 0b0000111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 5 ), // #629
- INST(Smlsl2_v , ISimdVVVe , (0b0100111000100000101000, kVO_V_B16H8S4, 0b0100111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 6 ), // #630
- INST(Smmla_v , ISimdVVVx , (0b0100111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 14 ), // #631
- INST(Smov_v , SimdSmovUmov , (0b0000111000000000001011, kVO_V_BHS, 1) , kRWI_W , 0 , 0 ), // #632
- INST(Smull_v , ISimdVVVe , (0b0000111000100000110000, kVO_V_B8H4S2, 0b0000111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 7 ), // #633
- INST(Smull2_v , ISimdVVVe , (0b0100111000100000110000, kVO_V_B16H8S4, 0b0100111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 8 ), // #634
- INST(Sqabs_v , ISimdVV , (0b0000111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 13 ), // #635
- INST(Sqadd_v , ISimdVVV , (0b0000111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 32 ), // #636
- INST(Sqdmlal_v , ISimdVVVe , (0b0000111000100000100100, kVO_SV_BHS, 0b0000111100000000001100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 9 ), // #637
- INST(Sqdmlal2_v , ISimdVVVe , (0b0100111000100000100100, kVO_V_B16H8S4, 0b0100111100000000001100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 10 ), // #638
- INST(Sqdmlsl_v , ISimdVVVe , (0b0000111000100000101100, kVO_SV_BHS, 0b0000111100000000011100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 11 ), // #639
- INST(Sqdmlsl2_v , ISimdVVVe , (0b0100111000100000101100, kVO_V_B16H8S4, 0b0100111100000000011100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 12 ), // #640
- INST(Sqdmulh_v , ISimdVVVe , (0b0000111000100000101101, kVO_SV_HS, 0b0000111100000000110000, kVO_SV_HS) , kRWI_W , F(VH0_15) , 13 ), // #641
- INST(Sqdmull_v , ISimdVVVe , (0b0000111000100000110100, kVO_SV_BHS, 0b0000111100000000101100, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 14 ), // #642
- INST(Sqdmull2_v , ISimdVVVe , (0b0100111000100000110100, kVO_V_B16H8S4, 0b0100111100000000101100, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 15 ), // #643
- INST(Sqneg_v , ISimdVV , (0b0010111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 14 ), // #644
- INST(Sqrdmlah_v , ISimdVVVe , (0b0010111000000000100001, kVO_SV_HS, 0b0010111100000000110100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 16 ), // #645
- INST(Sqrdmlsh_v , ISimdVVVe , (0b0010111000000000100011, kVO_SV_HS, 0b0010111100000000111100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 17 ), // #646
- INST(Sqrdmulh_v , ISimdVVVe , (0b0010111000100000101101, kVO_SV_HS, 0b0000111100000000110100, kVO_SV_HS) , kRWI_W , F(VH0_15) , 18 ), // #647
- INST(Sqrshl_v , SimdShift , (0b0000111000100000010111, 0b0000000000000000000000, 1, kVO_SV_Any) , kRWI_W , 0 , 6 ), // #648
- INST(Sqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 7 ), // #649
- INST(Sqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 8 ), // #650
- INST(Sqrshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100011, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 9 ), // #651
- INST(Sqrshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 10 ), // #652
- INST(Sqshl_v , SimdShift , (0b0000111000100000010011, 0b0000111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 11 ), // #653
- INST(Sqshlu_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000011001, 0, kVO_SV_Any) , kRWI_W , 0 , 12 ), // #654
- INST(Sqshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 13 ), // #655
- INST(Sqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 ), // #656
- INST(Sqshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100001, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 ), // #657
- INST(Sqshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 ), // #658
- INST(Sqsub_v , ISimdVVV , (0b0000111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 33 ), // #659
- INST(Sqxtn_v , ISimdVV , (0b0000111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 ), // #660
- INST(Sqxtn2_v , ISimdVV , (0b0100111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 ), // #661
- INST(Sqxtun_v , ISimdVV , (0b0010111000100001001010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 17 ), // #662
- INST(Sqxtun2_v , ISimdVV , (0b0110111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 18 ), // #663
- INST(Srhadd_v , ISimdVVV , (0b0000111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 34 ), // #664
- INST(Sri_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010001, 1, kVO_V_Any) , kRWI_W , 0 , 17 ), // #665
- INST(Srshl_v , SimdShift , (0b0000111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 18 ), // #666
- INST(Srshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 19 ), // #667
- INST(Srsra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 20 ), // #668
- INST(Sshl_v , SimdShift , (0b0000111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 21 ), // #669
- INST(Sshll_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 ), // #670
- INST(Sshll2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 ), // #671
- INST(Sshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 24 ), // #672
- INST(Ssra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 25 ), // #673
- INST(Ssubl_v , ISimdVVV , (0b0000111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 35 ), // #674
- INST(Ssubl2_v , ISimdVVV , (0b0100111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 36 ), // #675
- INST(Ssubw_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 2 ), // #676
- INST(Ssubw2_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B16H8S4) , kRWI_X , 0 , 3 ), // #677
- INST(St1_v , SimdLdNStN , (0b0000110100000000000000, 0b0000110000000000001000, 1, 0) , kRWI_STn , F(Consecutive) , 8 ), // #678
- INST(St2_v , SimdLdNStN , (0b0000110100100000000000, 0b0000110000000000100000, 2, 0) , kRWI_STn , F(Consecutive) , 9 ), // #679
- INST(St3_v , SimdLdNStN , (0b0000110100000000001000, 0b0000110000000000010000, 3, 0) , kRWI_STn , F(Consecutive) , 10 ), // #680
- INST(St4_v , SimdLdNStN , (0b0000110100100000001000, 0b0000110000000000000000, 4, 0) , kRWI_STn , F(Consecutive) , 11 ), // #681
- INST(Stnp_v , SimdLdpStp , (0b0010110000, 0b0000000000) , kRWI_RRW , 0 , 2 ), // #682
- INST(Stp_v , SimdLdpStp , (0b0010110100, 0b0010110010) , kRWI_RRW , 0 , 3 ), // #683
- INST(Str_v , SimdLdSt , (0b0011110100, 0b00111100000, 0b00111100001, 0b00000000, Inst::kIdStur_v) , kRWI_RW , 0 , 1 ), // #684
- INST(Stur_v , SimdLdurStur , (0b0011110000000000000000) , kRWI_RW , 0 , 1 ), // #685
- INST(Sub_v , ISimdVVV , (0b0010111000100000100001, kVO_V_Any) , kRWI_W , 0 , 37 ), // #686
- INST(Subhn_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 38 ), // #687
- INST(Subhn2_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 39 ), // #688
- INST(Sudot_v , SimdDot , (0b0000000000000000000000, 0b0000111100000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 2 ), // #689
- INST(Suqadd_v , ISimdVV , (0b0000111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 19 ), // #690
- INST(Sxtl_v , SimdSxtlUxtl , (0b0000111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 ), // #691
- INST(Sxtl2_v , SimdSxtlUxtl , (0b0100111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 ), // #692
- INST(Tbl_v , SimdTblTbx , (0b0000111000000000000000) , kRWI_W , 0 , 0 ), // #693
- INST(Tbx_v , SimdTblTbx , (0b0000111000000000000100) , kRWI_W , 0 , 1 ), // #694
- INST(Trn1_v , ISimdVVV , (0b0000111000000000001010, kVO_V_BHS_D2) , kRWI_W , 0 , 40 ), // #695
- INST(Trn2_v , ISimdVVV , (0b0000111000000000011010, kVO_V_BHS_D2) , kRWI_W , 0 , 41 ), // #696
- INST(Uaba_v , ISimdVVV , (0b0010111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 42 ), // #697
- INST(Uabal_v , ISimdVVV , (0b0010111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 43 ), // #698
- INST(Uabal2_v , ISimdVVV , (0b0110111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 44 ), // #699
- INST(Uabd_v , ISimdVVV , (0b0010111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 45 ), // #700
- INST(Uabdl_v , ISimdVVV , (0b0010111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 46 ), // #701
- INST(Uabdl2_v , ISimdVVV , (0b0110111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 47 ), // #702
- INST(Uadalp_v , ISimdVV , (0b0010111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 20 ), // #703
- INST(Uaddl_v , ISimdVVV , (0b0010111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 48 ), // #704
- INST(Uaddl2_v , ISimdVVV , (0b0110111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 49 ), // #705
- INST(Uaddlp_v , ISimdVV , (0b0010111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 21 ), // #706
- INST(Uaddlv_v , ISimdSV , (0b0010111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 4 ), // #707
- INST(Uaddw_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 4 ), // #708
- INST(Uaddw2_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 5 ), // #709
- INST(Ucvtf_v , SimdFcvtSV , (0b0010111000100001110110, 0b0010111100000000111001, 0b0001111000100011000000, 0) , kRWI_W , 0 , 11 ), // #710
- INST(Udot_v , SimdDot , (0b0010111010000000100101, 0b0010111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 3 ), // #711
- INST(Uhadd_v , ISimdVVV , (0b0010111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 50 ), // #712
- INST(Uhsub_v , ISimdVVV , (0b0010111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 51 ), // #713
- INST(Umax_v , ISimdVVV , (0b0010111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 52 ), // #714
- INST(Umaxp_v , ISimdVVV , (0b0010111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 53 ), // #715
- INST(Umaxv_v , ISimdSV , (0b0010111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 5 ), // #716
- INST(Umin_v , ISimdVVV , (0b0010111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 54 ), // #717
- INST(Uminp_v , ISimdVVV , (0b0010111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 55 ), // #718
- INST(Uminv_v , ISimdSV , (0b0010111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 6 ), // #719
- INST(Umlal_v , ISimdVVVe , (0b0010111000100000100000, kVO_V_B8H4S2, 0b0010111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 19 ), // #720
- INST(Umlal2_v , ISimdVVVe , (0b0110111000100000100000, kVO_V_B16H8S4, 0b0010111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 20 ), // #721
- INST(Umlsl_v , ISimdVVVe , (0b0010111000100000101000, kVO_V_B8H4S2, 0b0010111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 21 ), // #722
- INST(Umlsl2_v , ISimdVVVe , (0b0110111000100000101000, kVO_V_B16H8S4, 0b0110111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 22 ), // #723
- INST(Ummla_v , ISimdVVVx , (0b0110111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 15 ), // #724
- INST(Umov_v , SimdSmovUmov , (0b0000111000000000001111, kVO_V_Any, 0) , kRWI_W , 0 , 1 ), // #725
- INST(Umull_v , ISimdVVVe , (0b0010111000100000110000, kVO_V_B8H4S2, 0b0010111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 23 ), // #726
- INST(Umull2_v , ISimdVVVe , (0b0110111000100000110000, kVO_V_B16H8S4, 0b0110111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 24 ), // #727
- INST(Uqadd_v , ISimdVVV , (0b0010111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 56 ), // #728
- INST(Uqrshl_v , SimdShift , (0b0010111000100000010111, 0b0000000000000000000000, 0, kVO_SV_Any) , kRWI_W , 0 , 26 ), // #729
- INST(Uqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 27 ), // #730
- INST(Uqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 ), // #731
- INST(Uqshl_v , SimdShift , (0b0010111000100000010011, 0b0010111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 29 ), // #732
- INST(Uqshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 30 ), // #733
- INST(Uqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 31 ), // #734
- INST(Uqsub_v , ISimdVVV , (0b0010111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 57 ), // #735
- INST(Uqxtn_v , ISimdVV , (0b0010111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 22 ), // #736
- INST(Uqxtn2_v , ISimdVV , (0b0110111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 23 ), // #737
- INST(Urecpe_v , ISimdVV , (0b0000111010100001110010, kVO_V_S) , kRWI_W , 0 , 24 ), // #738
- INST(Urhadd_v , ISimdVVV , (0b0010111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 58 ), // #739
- INST(Urshl_v , SimdShift , (0b0010111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 32 ), // #740
- INST(Urshr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 33 ), // #741
- INST(Ursqrte_v , ISimdVV , (0b0010111010100001110010, kVO_V_S) , kRWI_W , 0 , 25 ), // #742
- INST(Ursra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 34 ), // #743
- INST(Usdot_v , SimdDot , (0b0000111010000000100111, 0b0000111110000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 4 ), // #744
- INST(Ushl_v , SimdShift , (0b0010111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 35 ), // #745
- INST(Ushll_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 36 ), // #746
- INST(Ushll2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 37 ), // #747
- INST(Ushr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 38 ), // #748
- INST(Usmmla_v , ISimdVVVx , (0b0100111010000000101011, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 16 ), // #749
- INST(Usqadd_v , ISimdVV , (0b0010111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 26 ), // #750
- INST(Usra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 39 ), // #751
- INST(Usubl_v , ISimdVVV , (0b0010111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 59 ), // #752
- INST(Usubl2_v , ISimdVVV , (0b0110111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 60 ), // #753
- INST(Usubw_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 6 ), // #754
- INST(Usubw2_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B16H8S4) , kRWI_W , 0 , 7 ), // #755
- INST(Uxtl_v , SimdSxtlUxtl , (0b0010111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 2 ), // #756
- INST(Uxtl2_v , SimdSxtlUxtl , (0b0110111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 3 ), // #757
- INST(Uzp1_v , ISimdVVV , (0b0000111000000000000110, kVO_V_BHS_D2) , kRWI_W , 0 , 61 ), // #758
- INST(Uzp2_v , ISimdVVV , (0b0000111000000000010110, kVO_V_BHS_D2) , kRWI_W , 0 , 62 ), // #759
- INST(Xar_v , ISimdVVVI , (0b1100111001100000100011, kVO_V_D2, 6, 10, 0) , kRWI_W , 0 , 1 ), // #760
- INST(Xtn_v , ISimdVV , (0b0000111000100001001010, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 27 ), // #761
- INST(Xtn2_v , ISimdVV , (0b0100111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 ), // #762
- INST(Zip1_v , ISimdVVV , (0b0000111000000000001110, kVO_V_BHS_D2) , kRWI_W , 0 , 63 ), // #763
- INST(Zip2_v , ISimdVVV , (0b0000111000000000011110, kVO_V_BHS_D2) , kRWI_W , 0 , 64 ) // #764
+ INST(Abs , BaseRR , (0b01011010110000000010000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 0 ), // #1
+ INST(Adc , BaseRRR , (0b0001101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 ), // #2
+ INST(Adcs , BaseRRR , (0b0011101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 ), // #3
+ INST(Add , BaseAddSub , (0b0001011000, 0b0001011001, 0b0010001) , kRWI_W , 0 , 0 ), // #4
+ INST(Addg , BaseRRII , (0b1001000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 0 ), // #5
+ INST(Adds , BaseAddSub , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_W , 0 , 1 ), // #6
+ INST(Adr , BaseAdr , (0b0001000000000000000000, OffsetType::kAArch64_ADR) , kRWI_W , 0 , 0 ), // #7
+ INST(Adrp , BaseAdr , (0b1001000000000000000000, OffsetType::kAArch64_ADRP) , kRWI_W , 0 , 1 ), // #8
+ INST(And , BaseLogical , (0b0001010000, 0b00100100, 0) , kRWI_W , 0 , 0 ), // #9
+ INST(Ands , BaseLogical , (0b1101010000, 0b11100100, 0) , kRWI_W , 0 , 1 ), // #10
+ INST(Asr , BaseShift , (0b0001101011000000001010, 0b0001001100000000011111, 0) , kRWI_W , 0 , 0 ), // #11
+ INST(Asrv , BaseShift , (0b0001101011000000001010, 0b0000000000000000000000, 0) , kRWI_W , 0 , 1 ), // #12
+ INST(At , BaseAtDcIcTlbi , (0b00011111110000, 0b00001111000000, true) , kRWI_RX , 0 , 0 ), // #13
+ INST(Autda , BaseRR , (0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 1 ), // #14
+ INST(Autdza , BaseR , (0b11011010110000010011101111100000, kX, kZR, 0) , kRWI_X , 0 , 0 ), // #15
+ INST(Autdb , BaseRR , (0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 2 ), // #16
+ INST(Autdzb , BaseR , (0b11011010110000010011111111100000, kX, kZR, 0) , kRWI_X , 0 , 1 ), // #17
+ INST(Autia , BaseRR , (0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 3 ), // #18
+ INST(Autia1716 , BaseOp , (0b11010101000000110010000110011111) , 0 , 0 , 0 ), // #19
+ INST(Autiasp , BaseOp , (0b11010101000000110010001110111111) , 0 , 0 , 1 ), // #20
+ INST(Autiaz , BaseOp , (0b11010101000000110010001110011111) , 0 , 0 , 2 ), // #21
+ INST(Autib , BaseRR , (0b11011010110000010001010000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 4 ), // #22
+ INST(Autib1716 , BaseOp , (0b11010101000000110010000111011111) , 0 , 0 , 3 ), // #23
+ INST(Autibsp , BaseOp , (0b11010101000000110010001111111111) , 0 , 0 , 4 ), // #24
+ INST(Autibz , BaseOp , (0b11010101000000110010001111011111) , 0 , 0 , 5 ), // #25
+ INST(Autiza , BaseR , (0b11011010110000010011001111100000, kX, kZR, 0) , kRWI_X , 0 , 2 ), // #26
+ INST(Autizb , BaseR , (0b11011010110000010011011111100000, kX, kZR, 0) , kRWI_X , 0 , 3 ), // #27
+ INST(Axflag , BaseOp , (0b11010101000000000100000001011111) , 0 , 0 , 6 ), // #28
+ INST(B , BaseBranchRel , (0b00010100000000000000000000000000) , 0 , F(Cond) , 0 ), // #29
+ INST(Bc , BaseBranchRel , (0b00010100000000000000000000010000) , 0 , F(Cond) , 1 ), // #30
+ INST(Bfc , BaseBfc , (0b00110011000000000000001111100000) , kRWI_X , 0 , 0 ), // #31
+ INST(Bfi , BaseBfi , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #32
+ INST(Bfm , BaseBfm , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #33
+ INST(Bfxil , BaseBfx , (0b00110011000000000000000000000000) , kRWI_X , 0 , 0 ), // #34
+ INST(Bic , BaseLogical , (0b0001010001, 0b00100100, 1) , kRWI_W , 0 , 2 ), // #35
+ INST(Bics , BaseLogical , (0b1101010001, 0b11100100, 1) , kRWI_W , 0 , 3 ), // #36
+ INST(Bl , BaseBranchRel , (0b10010100000000000000000000000000) , 0 , 0 , 2 ), // #37
+ INST(Blr , BaseBranchReg , (0b11010110001111110000000000000000) , kRWI_R , 0 , 0 ), // #38
+ INST(Br , BaseBranchReg , (0b11010110000111110000000000000000) , kRWI_R , 0 , 1 ), // #39
+ INST(Brk , BaseOpImm , (0b11010100001000000000000000000000, 16, 5) , 0 , 0 , 0 ), // #40
+ INST(Bti , BaseOpImm , (0b11010101000000110010010000011111, 2, 6) , 0 , 0 , 1 ), // #41
+ INST(Cas , BaseAtomicOp , (0b1000100010100000011111, kWX, 30, 0) , kRWI_XRX , 0 , 0 ), // #42
+ INST(Casa , BaseAtomicOp , (0b1000100011100000011111, kWX, 30, 1) , kRWI_XRX , 0 , 1 ), // #43
+ INST(Casab , BaseAtomicOp , (0b0000100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 2 ), // #44
+ INST(Casah , BaseAtomicOp , (0b0100100011100000011111, kW , 0 , 1) , kRWI_XRX , 0 , 3 ), // #45
+ INST(Casal , BaseAtomicOp , (0b1000100011100000111111, kWX, 30, 1) , kRWI_XRX , 0 , 4 ), // #46
+ INST(Casalb , BaseAtomicOp , (0b0000100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 5 ), // #47
+ INST(Casalh , BaseAtomicOp , (0b0100100011100000111111, kW , 0 , 1) , kRWI_XRX , 0 , 6 ), // #48
+ INST(Casb , BaseAtomicOp , (0b0000100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 7 ), // #49
+ INST(Cash , BaseAtomicOp , (0b0100100010100000011111, kW , 0 , 0) , kRWI_XRX , 0 , 8 ), // #50
+ INST(Casl , BaseAtomicOp , (0b1000100010100000111111, kWX, 30, 0) , kRWI_XRX , 0 , 9 ), // #51
+ INST(Caslb , BaseAtomicOp , (0b0000100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 10 ), // #52
+ INST(Caslh , BaseAtomicOp , (0b0100100010100000111111, kW , 0 , 0) , kRWI_XRX , 0 , 11 ), // #53
+ INST(Casp , BaseAtomicCasp , (0b0000100000100000011111, kWX, 30) , kRWI_XXRRX, F(Consecutive) , 0 ), // #54
+ INST(Caspa , BaseAtomicCasp , (0b0000100001100000011111, kWX, 30) , kRWI_XXRRX, F(Consecutive) , 1 ), // #55
+ INST(Caspal , BaseAtomicCasp , (0b0000100001100000111111, kWX, 30) , kRWI_XXRRX, F(Consecutive) , 2 ), // #56
+ INST(Caspl , BaseAtomicCasp , (0b0000100000100000111111, kWX, 30) , kRWI_XXRRX, F(Consecutive) , 3 ), // #57
+ INST(Cbnz , BaseBranchCmp , (0b00110101000000000000000000000000) , kRWI_R , 0 , 0 ), // #58
+ INST(Cbz , BaseBranchCmp , (0b00110100000000000000000000000000) , kRWI_R , 0 , 1 ), // #59
+ INST(Ccmn , BaseCCmp , (0b00111010010000000000000000000000) , kRWI_R , 0 , 0 ), // #60
+ INST(Ccmp , BaseCCmp , (0b01111010010000000000000000000000) , kRWI_R , 0 , 1 ), // #61
+ INST(Cfinv , BaseOp , (0b11010101000000000100000000011111) , 0 , 0 , 7 ), // #62
+ INST(Chkfeat , BaseOpX16 , (0b11010101000000110010010100011111) , 0 , 0 , 0 ), // #63
+ INST(Cinc , BaseCInc , (0b00011010100000000000010000000000) , kRWI_W , 0 , 0 ), // #64
+ INST(Cinv , BaseCInc , (0b01011010100000000000000000000000) , kRWI_W , 0 , 1 ), // #65
+ INST(Clrbhb , BaseOp , (0b11010101000000110010001011011111) , 0 , 0 , 8 ), // #66
+ INST(Clrex , BaseOpImm , (0b11010101000000110011000001011111, 4, 8) , 0 , 0 , 2 ), // #67
+ INST(Cls , BaseRR , (0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 5 ), // #68
+ INST(Clz , BaseRR , (0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 6 ), // #69
+ INST(Cmn , BaseCmpCmn , (0b0101011000, 0b0101011001, 0b0110001) , kRWI_R , 0 , 0 ), // #70
+ INST(Cmp , BaseCmpCmn , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_R , 0 , 1 ), // #71
+ INST(Cmpp , BaseRR , (0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true) , kRWI_R , 0 , 7 ), // #72
+ INST(Cneg , BaseCInc , (0b01011010100000000000010000000000) , kRWI_W , 0 , 2 ), // #73
+ INST(Cnt , BaseRR , (0b01011010110000000001110000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 8 ), // #74
+ INST(Crc32b , BaseRRR , (0b0001101011000000010000, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 2 ), // #75
+ INST(Crc32cb , BaseRRR , (0b0001101011000000010100, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 3 ), // #76
+ INST(Crc32ch , BaseRRR , (0b0001101011000000010101, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 4 ), // #77
+ INST(Crc32cw , BaseRRR , (0b0001101011000000010110, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 5 ), // #78
+ INST(Crc32cx , BaseRRR , (0b1001101011000000010111, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 6 ), // #79
+ INST(Crc32h , BaseRRR , (0b0001101011000000010001, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 7 ), // #80
+ INST(Crc32w , BaseRRR , (0b0001101011000000010010, kW, kZR, kW, kZR, kW, kZR, false) , kRWI_W , 0 , 8 ), // #81
+ INST(Crc32x , BaseRRR , (0b1001101011000000010011, kW, kZR, kW, kZR, kX, kZR, false) , kRWI_W , 0 , 9 ), // #82
+ INST(Csdb , BaseOp , (0b11010101000000110010001010011111) , 0 , 0 , 9 ), // #83
+ INST(Csel , BaseCSel , (0b00011010100000000000000000000000) , kRWI_W , 0 , 0 ), // #84
+ INST(Cset , BaseCSet , (0b00011010100111110000011111100000) , kRWI_W , 0 , 0 ), // #85
+ INST(Csetm , BaseCSet , (0b01011010100111110000001111100000) , kRWI_W , 0 , 1 ), // #86
+ INST(Csinc , BaseCSel , (0b00011010100000000000010000000000) , kRWI_W , 0 , 1 ), // #87
+ INST(Csinv , BaseCSel , (0b01011010100000000000000000000000) , kRWI_W , 0 , 2 ), // #88
+ INST(Csneg , BaseCSel , (0b01011010100000000000010000000000) , kRWI_W , 0 , 3 ), // #89
+ INST(Ctz , BaseRR , (0b01011010110000000001100000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 9 ), // #90
+ INST(Dc , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, true) , kRWI_RX , 0 , 1 ), // #91
+ INST(Dcps1 , BaseOpImm , (0b11010100101000000000000000000001, 16, 5) , 0 , 0 , 3 ), // #92
+ INST(Dcps2 , BaseOpImm , (0b11010100101000000000000000000010, 16, 5) , 0 , 0 , 4 ), // #93
+ INST(Dcps3 , BaseOpImm , (0b11010100101000000000000000000011, 16, 5) , 0 , 0 , 5 ), // #94
+ INST(Dgh , BaseOp , (0b11010101000000110010000011011111) , 0 , 0 , 10 ), // #95
+ INST(Dmb , BaseOpImm , (0b11010101000000110011000010111111, 4, 8) , 0 , 0 , 6 ), // #96
+ INST(Drps , BaseOp , (0b11010110101111110000001111100000) , 0 , 0 , 11 ), // #97
+ INST(Dsb , BaseOpImm , (0b11010101000000110011000010011111, 4, 8) , 0 , 0 , 7 ), // #98
+ INST(Eon , BaseLogical , (0b1001010001, 0b10100100, 1) , kRWI_W , 0 , 4 ), // #99
+ INST(Eor , BaseLogical , (0b1001010000, 0b10100100, 0) , kRWI_W , 0 , 5 ), // #100
+ INST(Esb , BaseOp , (0b11010101000000110010001000011111) , 0 , 0 , 12 ), // #101
+ INST(Extr , BaseExtract , (0b00010011100000000000000000000000) , kRWI_W , 0 , 0 ), // #102
+ INST(Eret , BaseOp , (0b11010110100111110000001111100000) , 0 , 0 , 13 ), // #103
+ INST(Gmi , BaseRRR , (0b1001101011000000000101, kX , kZR, kX , kSP, kX , kZR, true) , kRWI_W , 0 , 10 ), // #104
+ INST(Hint , BaseOpImm , (0b11010101000000110010000000011111, 7, 5) , 0 , 0 , 8 ), // #105
+ INST(Hlt , BaseOpImm , (0b11010100010000000000000000000000, 16, 5) , 0 , 0 , 9 ), // #106
+ INST(Hvc , BaseOpImm , (0b11010100000000000000000000000010, 16, 5) , 0 , 0 , 10 ), // #107
+ INST(Ic , BaseAtDcIcTlbi , (0b00011110000000, 0b00001110000000, false) , kRWI_RX , 0 , 2 ), // #108
+ INST(Isb , BaseOpImm , (0b11010101000000110011000011011111, 4, 8) , 0 , 0 , 11 ), // #109
+ INST(Ldadd , BaseAtomicOp , (0b1011100000100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 12 ), // #110
+ INST(Ldadda , BaseAtomicOp , (0b1011100010100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 13 ), // #111
+ INST(Ldaddab , BaseAtomicOp , (0b0011100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 14 ), // #112
+ INST(Ldaddah , BaseAtomicOp , (0b0111100010100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 15 ), // #113
+ INST(Ldaddal , BaseAtomicOp , (0b1011100011100000000000, kWX, 30, 1) , kRWI_WRX , 0 , 16 ), // #114
+ INST(Ldaddalb , BaseAtomicOp , (0b0011100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 17 ), // #115
+ INST(Ldaddalh , BaseAtomicOp , (0b0111100011100000000000, kW , 0 , 1) , kRWI_WRX , 0 , 18 ), // #116
+ INST(Ldaddb , BaseAtomicOp , (0b0011100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 19 ), // #117
+ INST(Ldaddh , BaseAtomicOp , (0b0111100000100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 20 ), // #118
+ INST(Ldaddl , BaseAtomicOp , (0b1011100001100000000000, kWX, 30, 0) , kRWI_WRX , 0 , 21 ), // #119
+ INST(Ldaddlb , BaseAtomicOp , (0b0011100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 22 ), // #120
+ INST(Ldaddlh , BaseAtomicOp , (0b0111100001100000000000, kW , 0 , 0) , kRWI_WRX , 0 , 23 ), // #121
+ INST(Ldar , BaseRM_NoImm , (0b1000100011011111111111, kWX, kZR, 30) , kRWI_W , 0 , 0 ), // #122
+ INST(Ldarb , BaseRM_NoImm , (0b0000100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 1 ), // #123
+ INST(Ldarh , BaseRM_NoImm , (0b0100100011011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 2 ), // #124
+ INST(Ldaxp , BaseLdxp , (0b1000100001111111100000, kWX, 30) , kRWI_WW , 0 , 0 ), // #125
+ INST(Ldaxr , BaseRM_NoImm , (0b1000100001011111111111, kWX, kZR, 30) , kRWI_W , 0 , 3 ), // #126
+ INST(Ldaxrb , BaseRM_NoImm , (0b0000100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 4 ), // #127
+ INST(Ldaxrh , BaseRM_NoImm , (0b0100100001011111111111, kW , kZR, 0 ) , kRWI_W , 0 , 5 ), // #128
+ INST(Ldclr , BaseAtomicOp , (0b1011100000100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 24 ), // #129
+ INST(Ldclra , BaseAtomicOp , (0b1011100010100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 25 ), // #130
+ INST(Ldclrab , BaseAtomicOp , (0b0011100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 26 ), // #131
+ INST(Ldclrah , BaseAtomicOp , (0b0111100010100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 27 ), // #132
+ INST(Ldclral , BaseAtomicOp , (0b1011100011100000000100, kWX, 30, 1) , kRWI_WRX , 0 , 28 ), // #133
+ INST(Ldclralb , BaseAtomicOp , (0b0011100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 29 ), // #134
+ INST(Ldclralh , BaseAtomicOp , (0b0111100011100000000100, kW , 0 , 1) , kRWI_WRX , 0 , 30 ), // #135
+ INST(Ldclrb , BaseAtomicOp , (0b0011100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 31 ), // #136
+ INST(Ldclrh , BaseAtomicOp , (0b0111100000100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 32 ), // #137
+ INST(Ldclrl , BaseAtomicOp , (0b1011100001100000000100, kWX, 30, 0) , kRWI_WRX , 0 , 33 ), // #138
+ INST(Ldclrlb , BaseAtomicOp , (0b0011100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 34 ), // #139
+ INST(Ldclrlh , BaseAtomicOp , (0b0111100001100000000100, kW , 0 , 0) , kRWI_WRX , 0 , 35 ), // #140
+ INST(Ldeor , BaseAtomicOp , (0b1011100000100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 36 ), // #141
+ INST(Ldeora , BaseAtomicOp , (0b1011100010100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 37 ), // #142
+ INST(Ldeorab , BaseAtomicOp , (0b0011100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 38 ), // #143
+ INST(Ldeorah , BaseAtomicOp , (0b0111100010100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 39 ), // #144
+ INST(Ldeoral , BaseAtomicOp , (0b1011100011100000001000, kWX, 30, 1) , kRWI_WRX , 0 , 40 ), // #145
+ INST(Ldeoralb , BaseAtomicOp , (0b0011100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 41 ), // #146
+ INST(Ldeoralh , BaseAtomicOp , (0b0111100011100000001000, kW , 0 , 1) , kRWI_WRX , 0 , 42 ), // #147
+ INST(Ldeorb , BaseAtomicOp , (0b0011100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 43 ), // #148
+ INST(Ldeorh , BaseAtomicOp , (0b0111100000100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 44 ), // #149
+ INST(Ldeorl , BaseAtomicOp , (0b1011100001100000001000, kWX, 30, 0) , kRWI_WRX , 0 , 45 ), // #150
+ INST(Ldeorlb , BaseAtomicOp , (0b0011100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 46 ), // #151
+ INST(Ldeorlh , BaseAtomicOp , (0b0111100001100000001000, kW , 0 , 0) , kRWI_WRX , 0 , 47 ), // #152
+ INST(Ldg , BaseRM_SImm9 , (0b1101100101100000000000, 0b0000000000000000000000, kX , kZR, 0, 4) , kRWI_W , 0 , 0 ), // #153
+ INST(Ldgm , BaseRM_NoImm , (0b1101100111100000000000, kX , kZR, 0 ) , kRWI_W , 0 , 6 ), // #154
+ INST(Ldlar , BaseRM_NoImm , (0b1000100011011111011111, kWX, kZR, 30) , kRWI_W , 0 , 7 ), // #155
+ INST(Ldlarb , BaseRM_NoImm , (0b0000100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 8 ), // #156
+ INST(Ldlarh , BaseRM_NoImm , (0b0100100011011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 9 ), // #157
+ INST(Ldnp , BaseLdpStp , (0b0010100001, 0 , kWX, 31, 2) , kRWI_WW , 0 , 0 ), // #158
+ INST(Ldp , BaseLdpStp , (0b0010100101, 0b0010100011, kWX, 31, 2) , kRWI_WW , 0 , 1 ), // #159
+ INST(Ldpsw , BaseLdpStp , (0b0110100101, 0b0110100011, kX , 0 , 2) , kRWI_WW , 0 , 2 ), // #160
+ INST(Ldr , BaseLdSt , (0b1011100101, 0b10111000010, 0b10111000011, 0b00011000, kWX, 30, 2, Inst::kIdLdur) , kRWI_W , 0 , 0 ), // #161
+ INST(Ldraa , BaseRM_SImm10 , (0b1111100000100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 0 ), // #162
+ INST(Ldrab , BaseRM_SImm10 , (0b1111100010100000000001, kX , kZR, 0, 3) , kRWI_W , 0 , 1 ), // #163
+ INST(Ldrb , BaseLdSt , (0b0011100101, 0b00111000010, 0b00111000011, 0 , kW , 0 , 0, Inst::kIdLdurb) , kRWI_W , 0 , 1 ), // #164
+ INST(Ldrh , BaseLdSt , (0b0111100101, 0b01111000010, 0b01111000011, 0 , kW , 0 , 1, Inst::kIdLdurh) , kRWI_W , 0 , 2 ), // #165
+ INST(Ldrsb , BaseLdSt , (0b0011100111, 0b00111000100, 0b00111000111, 0 , kWX, 22, 0, Inst::kIdLdursb) , kRWI_W , 0 , 3 ), // #166
+ INST(Ldrsh , BaseLdSt , (0b0111100111, 0b01111000100, 0b01111000111, 0 , kWX, 22, 1, Inst::kIdLdursh) , kRWI_W , 0 , 4 ), // #167
+ INST(Ldrsw , BaseLdSt , (0b1011100110, 0b10111000100, 0b10111000101, 0b10011000, kX , 0 , 2, Inst::kIdLdursw) , kRWI_W , 0 , 5 ), // #168
+ INST(Ldset , BaseAtomicOp , (0b1011100000100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 48 ), // #169
+ INST(Ldseta , BaseAtomicOp , (0b1011100010100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 49 ), // #170
+ INST(Ldsetab , BaseAtomicOp , (0b0011100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 50 ), // #171
+ INST(Ldsetah , BaseAtomicOp , (0b0111100010100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 51 ), // #172
+ INST(Ldsetal , BaseAtomicOp , (0b1011100011100000001100, kWX, 30, 1) , kRWI_WRX , 0 , 52 ), // #173
+ INST(Ldsetalb , BaseAtomicOp , (0b0011100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 53 ), // #174
+ INST(Ldsetalh , BaseAtomicOp , (0b0111100011100000001100, kW , 0 , 1) , kRWI_WRX , 0 , 54 ), // #175
+ INST(Ldsetb , BaseAtomicOp , (0b0011100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 55 ), // #176
+ INST(Ldseth , BaseAtomicOp , (0b0111100000100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 56 ), // #177
+ INST(Ldsetl , BaseAtomicOp , (0b1011100001100000001100, kWX, 30, 0) , kRWI_WRX , 0 , 57 ), // #178
+ INST(Ldsetlb , BaseAtomicOp , (0b0011100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 58 ), // #179
+ INST(Ldsetlh , BaseAtomicOp , (0b0111100001100000001100, kW , 0 , 0) , kRWI_WRX , 0 , 59 ), // #180
+ INST(Ldsmax , BaseAtomicOp , (0b1011100000100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 60 ), // #181
+ INST(Ldsmaxa , BaseAtomicOp , (0b1011100010100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 61 ), // #182
+ INST(Ldsmaxab , BaseAtomicOp , (0b0011100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 62 ), // #183
+ INST(Ldsmaxah , BaseAtomicOp , (0b0111100010100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 63 ), // #184
+ INST(Ldsmaxal , BaseAtomicOp , (0b1011100011100000010000, kWX, 30, 1) , kRWI_WRX , 0 , 64 ), // #185
+ INST(Ldsmaxalb , BaseAtomicOp , (0b0011100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 65 ), // #186
+ INST(Ldsmaxalh , BaseAtomicOp , (0b0111100011100000010000, kW , 0 , 1) , kRWI_WRX , 0 , 66 ), // #187
+ INST(Ldsmaxb , BaseAtomicOp , (0b0011100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 67 ), // #188
+ INST(Ldsmaxh , BaseAtomicOp , (0b0111100000100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 68 ), // #189
+ INST(Ldsmaxl , BaseAtomicOp , (0b1011100001100000010000, kWX, 30, 0) , kRWI_WRX , 0 , 69 ), // #190
+ INST(Ldsmaxlb , BaseAtomicOp , (0b0011100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 70 ), // #191
+ INST(Ldsmaxlh , BaseAtomicOp , (0b0111100001100000010000, kW , 0 , 0) , kRWI_WRX , 0 , 71 ), // #192
+ INST(Ldsmin , BaseAtomicOp , (0b1011100000100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 72 ), // #193
+ INST(Ldsmina , BaseAtomicOp , (0b1011100010100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 73 ), // #194
+ INST(Ldsminab , BaseAtomicOp , (0b0011100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 74 ), // #195
+ INST(Ldsminah , BaseAtomicOp , (0b0111100010100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 75 ), // #196
+ INST(Ldsminal , BaseAtomicOp , (0b1011100011100000010100, kWX, 30, 1) , kRWI_WRX , 0 , 76 ), // #197
+ INST(Ldsminalb , BaseAtomicOp , (0b0011100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 77 ), // #198
+ INST(Ldsminalh , BaseAtomicOp , (0b0111100011100000010100, kW , 0 , 1) , kRWI_WRX , 0 , 78 ), // #199
+ INST(Ldsminb , BaseAtomicOp , (0b0011100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 79 ), // #200
+ INST(Ldsminh , BaseAtomicOp , (0b0111100000100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 80 ), // #201
+ INST(Ldsminl , BaseAtomicOp , (0b1011100001100000010100, kWX, 30, 0) , kRWI_WRX , 0 , 81 ), // #202
+ INST(Ldsminlb , BaseAtomicOp , (0b0011100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 82 ), // #203
+ INST(Ldsminlh , BaseAtomicOp , (0b0111100001100000010100, kW , 0 , 0) , kRWI_WRX , 0 , 83 ), // #204
+ INST(Ldtr , BaseRM_SImm9 , (0b1011100001000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 1 ), // #205
+ INST(Ldtrb , BaseRM_SImm9 , (0b0011100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 2 ), // #206
+ INST(Ldtrh , BaseRM_SImm9 , (0b0111100001000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 3 ), // #207
+ INST(Ldtrsb , BaseRM_SImm9 , (0b0011100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 4 ), // #208
+ INST(Ldtrsh , BaseRM_SImm9 , (0b0111100011000000000010, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 5 ), // #209
+ INST(Ldtrsw , BaseRM_SImm9 , (0b1011100010000000000010, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 6 ), // #210
+ INST(Ldumax , BaseAtomicOp , (0b1011100000100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 84 ), // #211
+ INST(Ldumaxa , BaseAtomicOp , (0b1011100010100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 85 ), // #212
+ INST(Ldumaxab , BaseAtomicOp , (0b0011100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 86 ), // #213
+ INST(Ldumaxah , BaseAtomicOp , (0b0111100010100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 87 ), // #214
+ INST(Ldumaxal , BaseAtomicOp , (0b1011100011100000011000, kWX, 30, 1) , kRWI_WRX , 0 , 88 ), // #215
+ INST(Ldumaxalb , BaseAtomicOp , (0b0011100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 89 ), // #216
+ INST(Ldumaxalh , BaseAtomicOp , (0b0111100011100000011000, kW , 0 , 1) , kRWI_WRX , 0 , 90 ), // #217
+ INST(Ldumaxb , BaseAtomicOp , (0b0011100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 91 ), // #218
+ INST(Ldumaxh , BaseAtomicOp , (0b0111100000100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 92 ), // #219
+ INST(Ldumaxl , BaseAtomicOp , (0b1011100001100000011000, kWX, 30, 0) , kRWI_WRX , 0 , 93 ), // #220
+ INST(Ldumaxlb , BaseAtomicOp , (0b0011100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 94 ), // #221
+ INST(Ldumaxlh , BaseAtomicOp , (0b0111100001100000011000, kW , 0 , 0) , kRWI_WRX , 0 , 95 ), // #222
+ INST(Ldumin , BaseAtomicOp , (0b1011100000100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 96 ), // #223
+ INST(Ldumina , BaseAtomicOp , (0b1011100010100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 97 ), // #224
+ INST(Lduminab , BaseAtomicOp , (0b0011100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 98 ), // #225
+ INST(Lduminah , BaseAtomicOp , (0b0111100010100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 99 ), // #226
+ INST(Lduminal , BaseAtomicOp , (0b1011100011100000011100, kWX, 30, 1) , kRWI_WRX , 0 , 100), // #227
+ INST(Lduminalb , BaseAtomicOp , (0b0011100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 101), // #228
+ INST(Lduminalh , BaseAtomicOp , (0b0111100011100000011100, kW , 0 , 1) , kRWI_WRX , 0 , 102), // #229
+ INST(Lduminb , BaseAtomicOp , (0b0011100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 103), // #230
+ INST(Lduminh , BaseAtomicOp , (0b0111100000100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 104), // #231
+ INST(Lduminl , BaseAtomicOp , (0b1011100001100000011100, kWX, 30, 0) , kRWI_WRX , 0 , 105), // #232
+ INST(Lduminlb , BaseAtomicOp , (0b0011100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 106), // #233
+ INST(Lduminlh , BaseAtomicOp , (0b0111100001100000011100, kW , 0 , 0) , kRWI_WRX , 0 , 107), // #234
+ INST(Ldur , BaseRM_SImm9 , (0b1011100001000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_W , 0 , 7 ), // #235
+ INST(Ldurb , BaseRM_SImm9 , (0b0011100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 8 ), // #236
+ INST(Ldurh , BaseRM_SImm9 , (0b0111100001000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_W , 0 , 9 ), // #237
+ INST(Ldursb , BaseRM_SImm9 , (0b0011100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 10 ), // #238
+ INST(Ldursh , BaseRM_SImm9 , (0b0111100011000000000000, 0b0000000000000000000000, kWX, kZR, 22, 0) , kRWI_W , 0 , 11 ), // #239
+ INST(Ldursw , BaseRM_SImm9 , (0b1011100010000000000000, 0b0000000000000000000000, kX , kZR, 0 , 0) , kRWI_W , 0 , 12 ), // #240
+ INST(Ldxp , BaseLdxp , (0b1000100001111111000000, kWX, 30) , kRWI_WW , 0 , 1 ), // #241
+ INST(Ldxr , BaseRM_NoImm , (0b1000100001011111011111, kWX, kZR, 30) , kRWI_W , 0 , 10 ), // #242
+ INST(Ldxrb , BaseRM_NoImm , (0b0000100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 11 ), // #243
+ INST(Ldxrh , BaseRM_NoImm , (0b0100100001011111011111, kW , kZR, 0 ) , kRWI_W , 0 , 12 ), // #244
+ INST(Lsl , BaseShift , (0b0001101011000000001000, 0b0101001100000000000000, 0) , kRWI_W , 0 , 2 ), // #245
+ INST(Lslv , BaseShift , (0b0001101011000000001000, 0b0000000000000000000000, 0) , kRWI_W , 0 , 3 ), // #246
+ INST(Lsr , BaseShift , (0b0001101011000000001001, 0b0101001100000000011111, 0) , kRWI_W , 0 , 4 ), // #247
+ INST(Lsrv , BaseShift , (0b0001101011000000001001, 0b0000000000000000000000, 0) , kRWI_W , 0 , 5 ), // #248
+ INST(Madd , BaseRRRR , (0b0001101100000000000000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 0 ), // #249
+ INST(Mneg , BaseRRR , (0b0001101100000000111111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 11 ), // #250
+ INST(Mov , BaseMov , (_) , kRWI_W , 0 , 0 ), // #251
+ INST(Movk , BaseMovKNZ , (0b01110010100000000000000000000000) , kRWI_X , 0 , 0 ), // #252
+ INST(Movn , BaseMovKNZ , (0b00010010100000000000000000000000) , kRWI_W , 0 , 1 ), // #253
+ INST(Movz , BaseMovKNZ , (0b01010010100000000000000000000000) , kRWI_W , 0 , 2 ), // #254
+ INST(Mrs , BaseMrs , (_) , kRWI_W , 0 , 0 ), // #255
+ INST(Msr , BaseMsr , (_) , kRWI_W , 0 , 0 ), // #256
+ INST(Msub , BaseRRRR , (0b0001101100000000100000, kWX, kZR, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 1 ), // #257
+ INST(Mul , BaseRRR , (0b0001101100000000011111, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 12 ), // #258
+ INST(Mvn , BaseMvnNeg , (0b00101010001000000000001111100000) , kRWI_W , 0 , 0 ), // #259
+ INST(Neg , BaseMvnNeg , (0b01001011000000000000001111100000) , kRWI_W , 0 , 1 ), // #260
+ INST(Negs , BaseMvnNeg , (0b01101011000000000000001111100000) , kRWI_W , 0 , 2 ), // #261
+ INST(Ngc , BaseRR , (0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 10 ), // #262
+ INST(Ngcs , BaseRR , (0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true) , kRWI_W , 0 , 11 ), // #263
+ INST(Nop , BaseOp , (0b11010101000000110010000000011111) , 0 , 0 , 14 ), // #264
+ INST(Orn , BaseLogical , (0b0101010001, 0b01100100, 1) , kRWI_W , 0 , 6 ), // #265
+ INST(Orr , BaseLogical , (0b0101010000, 0b01100100, 0) , kRWI_W , 0 , 7 ), // #266
+ INST(Pacda , BaseRR , (0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 12 ), // #267
+ INST(Pacdb , BaseRR , (0b11011010110000010000110000000000, kX, kZR, 0, kX, kSP, 5, true) , kRWI_X , 0 , 13 ), // #268
+ INST(Pacdza , BaseR , (0b11011010110000010010101111100000, kX, kZR, 0) , kRWI_X , 0 , 4 ), // #269
+ INST(Pacdzb , BaseR , (0b11011010110000010010111111100000, kX, kZR, 0) , kRWI_X , 0 , 5 ), // #270
+ INST(Pacga , BaseRRR , (0b1001101011000000001100, kX, kZR, kX, kZR, kX, kSP, false) , kRWI_W , 0 , 13 ), // #271
+ INST(Prfm , BasePrfm , (0b11111000101, 0b1111100110, 0b11111000100, 0b11011000) , kRWI_R , 0 , 0 ), // #272
+ INST(Pssbb , BaseOp , (0b11010101000000110011010010011111) , 0 , 0 , 15 ), // #273
+ INST(Rbit , BaseRR , (0b01011010110000000000000000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 14 ), // #274
+ INST(Ret , BaseBranchReg , (0b11010110010111110000000000000000) , kRWI_R , 0 , 2 ), // #275
+ INST(Rev , BaseRev , (_) , kRWI_W , 0 , 0 ), // #276
+ INST(Rev16 , BaseRR , (0b01011010110000000000010000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 15 ), // #277
+ INST(Rev32 , BaseRR , (0b11011010110000000000100000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 16 ), // #278
+ INST(Rev64 , BaseRR , (0b11011010110000000000110000000000, kWX, kZR, 0, kWX, kZR, 5, true) , kRWI_W , 0 , 17 ), // #279
+ INST(Ror , BaseShift , (0b0001101011000000001011, 0b0001001110000000000000, 1) , kRWI_W , 0 , 6 ), // #280
+ INST(Rorv , BaseShift , (0b0001101011000000001011, 0b0000000000000000000000, 1) , kRWI_W , 0 , 7 ), // #281
+ INST(Sbc , BaseRRR , (0b0101101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 14 ), // #282
+ INST(Sbcs , BaseRRR , (0b0111101000000000000000, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 15 ), // #283
+ INST(Sbfiz , BaseBfi , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #284
+ INST(Sbfm , BaseBfm , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #285
+ INST(Sbfx , BaseBfx , (0b00010011000000000000000000000000) , kRWI_W , 0 , 1 ), // #286
+ INST(Sdiv , BaseRRR , (0b0001101011000000000011, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 16 ), // #287
+ INST(Setf8 , BaseR , (0b00111010000000000000100000001101, kW, kZR, 5) , 0 , 0 , 6 ), // #288
+ INST(Setf16 , BaseR , (0b00111010000000000100100000001101, kW, kZR, 5) , 0 , 0 , 7 ), // #289
+ INST(Sev , BaseOp , (0b11010101000000110010000010011111) , 0 , 0 , 16 ), // #290
+ INST(Sevl , BaseOp , (0b11010101000000110010000010111111) , 0 , 0 , 17 ), // #291
+ INST(Smaddl , BaseRRRR , (0b1001101100100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 2 ), // #292
+ INST(Smax , BaseMinMax , (0b00011010110000000110000000000000, 0b00010001110000000000000000000000) , kRWI_W , 0 , 0 ), // #293
+ INST(Smc , BaseOpImm , (0b11010100000000000000000000000011, 16, 5) , 0 , 0 , 12 ), // #294
+ INST(Smin , BaseMinMax , (0b00011010110000000110100000000000, 0b00010001110010000000000000000000) , kRWI_W , 0 , 1 ), // #295
+ INST(Smnegl , BaseRRR , (0b1001101100100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 17 ), // #296
+ INST(Smsubl , BaseRRRR , (0b1001101100100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 3 ), // #297
+ INST(Smulh , BaseRRR , (0b1001101101000000011111, kX , kZR, kX , kZR, kX , kZR, true) , kRWI_W , 0 , 18 ), // #298
+ INST(Smull , BaseRRR , (0b1001101100100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 19 ), // #299
+ INST(Ssbb , BaseOp , (0b11010101000000110011000010011111) , 0 , 0 , 18 ), // #300
+ INST(St2g , BaseRM_SImm9 , (0b1101100110100000000010, 0b1101100110100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 13 ), // #301
+ INST(Stadd , BaseAtomicSt , (0b1011100000100000000000, kWX, 30) , kRWI_RX , 0 , 0 ), // #302
+ INST(Staddl , BaseAtomicSt , (0b1011100001100000000000, kWX, 30) , kRWI_RX , 0 , 1 ), // #303
+ INST(Staddb , BaseAtomicSt , (0b0011100000100000000000, kW , 0 ) , kRWI_RX , 0 , 2 ), // #304
+ INST(Staddlb , BaseAtomicSt , (0b0011100001100000000000, kW , 0 ) , kRWI_RX , 0 , 3 ), // #305
+ INST(Staddh , BaseAtomicSt , (0b0111100000100000000000, kW , 0 ) , kRWI_RX , 0 , 4 ), // #306
+ INST(Staddlh , BaseAtomicSt , (0b0111100001100000000000, kW , 0 ) , kRWI_RX , 0 , 5 ), // #307
+ INST(Stclr , BaseAtomicSt , (0b1011100000100000000100, kWX, 30) , kRWI_RX , 0 , 6 ), // #308
+ INST(Stclrl , BaseAtomicSt , (0b1011100001100000000100, kWX, 30) , kRWI_RX , 0 , 7 ), // #309
+ INST(Stclrb , BaseAtomicSt , (0b0011100000100000000100, kW , 0 ) , kRWI_RX , 0 , 8 ), // #310
+ INST(Stclrlb , BaseAtomicSt , (0b0011100001100000000100, kW , 0 ) , kRWI_RX , 0 , 9 ), // #311
+ INST(Stclrh , BaseAtomicSt , (0b0111100000100000000100, kW , 0 ) , kRWI_RX , 0 , 10 ), // #312
+ INST(Stclrlh , BaseAtomicSt , (0b0111100001100000000100, kW , 0 ) , kRWI_RX , 0 , 11 ), // #313
+ INST(Steor , BaseAtomicSt , (0b1011100000100000001000, kWX, 30) , kRWI_RX , 0 , 12 ), // #314
+ INST(Steorl , BaseAtomicSt , (0b1011100001100000001000, kWX, 30) , kRWI_RX , 0 , 13 ), // #315
+ INST(Steorb , BaseAtomicSt , (0b0011100000100000001000, kW , 0 ) , kRWI_RX , 0 , 14 ), // #316
+ INST(Steorlb , BaseAtomicSt , (0b0011100001100000001000, kW , 0 ) , kRWI_RX , 0 , 15 ), // #317
+ INST(Steorh , BaseAtomicSt , (0b0111100000100000001000, kW , 0 ) , kRWI_RX , 0 , 16 ), // #318
+ INST(Steorlh , BaseAtomicSt , (0b0111100001100000001000, kW , 0 ) , kRWI_RX , 0 , 17 ), // #319
+ INST(Stg , BaseRM_SImm9 , (0b1101100100100000000010, 0b1101100100100000000001, kX, kSP, 0, 4) , kRWI_RW , 0 , 14 ), // #320
+ INST(Stgm , BaseRM_NoImm , (0b1101100110100000000000, kX , kZR, 0 ) , kRWI_RW , 0 , 13 ), // #321
+ INST(Stgp , BaseLdpStp , (0b0110100100, 0b0110100010, kX, 0, 4) , kRWI_RRW , 0 , 3 ), // #322
+ INST(Stllr , BaseRM_NoImm , (0b1000100010011111011111, kWX, kZR, 30) , kRWI_RW , 0 , 14 ), // #323
+ INST(Stllrb , BaseRM_NoImm , (0b0000100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 15 ), // #324
+ INST(Stllrh , BaseRM_NoImm , (0b0100100010011111011111, kW , kZR, 0 ) , kRWI_RW , 0 , 16 ), // #325
+ INST(Stlr , BaseRM_NoImm , (0b1000100010011111111111, kWX, kZR, 30) , kRWI_RW , 0 , 17 ), // #326
+ INST(Stlrb , BaseRM_NoImm , (0b0000100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 18 ), // #327
+ INST(Stlrh , BaseRM_NoImm , (0b0100100010011111111111, kW , kZR, 0 ) , kRWI_RW , 0 , 19 ), // #328
+ INST(Stlxp , BaseStxp , (0b1000100000100000100000, kWX, 30) , kRWI_WRRX , 0 , 0 ), // #329
+ INST(Stlxr , BaseAtomicOp , (0b1000100000000000111111, kWX, 30, 1) , kRWI_WRX , 0 , 108), // #330
+ INST(Stlxrb , BaseAtomicOp , (0b0000100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 109), // #331
+ INST(Stlxrh , BaseAtomicOp , (0b0100100000000000111111, kW , 0 , 1) , kRWI_WRX , 0 , 110), // #332
+ INST(Stnp , BaseLdpStp , (0b0010100000, 0 , kWX, 31, 2) , kRWI_RRW , 0 , 4 ), // #333
+ INST(Stp , BaseLdpStp , (0b0010100100, 0b0010100010, kWX, 31, 2) , kRWI_RRW , 0 , 5 ), // #334
+ INST(Str , BaseLdSt , (0b1011100100, 0b10111000000, 0b10111000001, 0 , kWX, 30, 2, Inst::kIdStur) , kRWI_RW , 0 , 6 ), // #335
+ INST(Strb , BaseLdSt , (0b0011100100, 0b00111000000, 0b00111000001, 0 , kW , 30, 0, Inst::kIdSturb) , kRWI_RW , 0 , 7 ), // #336
+ INST(Strh , BaseLdSt , (0b0111100100, 0b01111000000, 0b01111000001, 0 , kWX, 30, 1, Inst::kIdSturh) , kRWI_RW , 0 , 8 ), // #337
+ INST(Stset , BaseAtomicSt , (0b1011100000100000001100, kWX, 30) , kRWI_RX , 0 , 18 ), // #338
+ INST(Stsetl , BaseAtomicSt , (0b1011100001100000001100, kWX, 30) , kRWI_RX , 0 , 19 ), // #339
+ INST(Stsetb , BaseAtomicSt , (0b0011100000100000001100, kW , 0 ) , kRWI_RX , 0 , 20 ), // #340
+ INST(Stsetlb , BaseAtomicSt , (0b0011100001100000001100, kW , 0 ) , kRWI_RX , 0 , 21 ), // #341
+ INST(Stseth , BaseAtomicSt , (0b0111100000100000001100, kW , 0 ) , kRWI_RX , 0 , 22 ), // #342
+ INST(Stsetlh , BaseAtomicSt , (0b0111100001100000001100, kW , 0 ) , kRWI_RX , 0 , 23 ), // #343
+ INST(Stsmax , BaseAtomicSt , (0b1011100000100000010000, kWX, 30) , kRWI_RX , 0 , 24 ), // #344
+ INST(Stsmaxl , BaseAtomicSt , (0b1011100001100000010000, kWX, 30) , kRWI_RX , 0 , 25 ), // #345
+ INST(Stsmaxb , BaseAtomicSt , (0b0011100000100000010000, kW , 0 ) , kRWI_RX , 0 , 26 ), // #346
+ INST(Stsmaxlb , BaseAtomicSt , (0b0011100001100000010000, kW , 0 ) , kRWI_RX , 0 , 27 ), // #347
+ INST(Stsmaxh , BaseAtomicSt , (0b0111100000100000010000, kW , 0 ) , kRWI_RX , 0 , 28 ), // #348
+ INST(Stsmaxlh , BaseAtomicSt , (0b0111100001100000010000, kW , 0 ) , kRWI_RX , 0 , 29 ), // #349
+ INST(Stsmin , BaseAtomicSt , (0b1011100000100000010100, kWX, 30) , kRWI_RX , 0 , 30 ), // #350
+ INST(Stsminl , BaseAtomicSt , (0b1011100001100000010100, kWX, 30) , kRWI_RX , 0 , 31 ), // #351
+ INST(Stsminb , BaseAtomicSt , (0b0011100000100000010100, kW , 0 ) , kRWI_RX , 0 , 32 ), // #352
+ INST(Stsminlb , BaseAtomicSt , (0b0011100001100000010100, kW , 0 ) , kRWI_RX , 0 , 33 ), // #353
+ INST(Stsminh , BaseAtomicSt , (0b0111100000100000010100, kW , 0 ) , kRWI_RX , 0 , 34 ), // #354
+ INST(Stsminlh , BaseAtomicSt , (0b0111100001100000010100, kW , 0 ) , kRWI_RX , 0 , 35 ), // #355
+ INST(Sttr , BaseRM_SImm9 , (0b1011100000000000000010, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 15 ), // #356
+ INST(Sttrb , BaseRM_SImm9 , (0b0011100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 16 ), // #357
+ INST(Sttrh , BaseRM_SImm9 , (0b0111100000000000000010, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 17 ), // #358
+ INST(Stumax , BaseAtomicSt , (0b1011100000100000011000, kWX, 30) , kRWI_RX , 0 , 36 ), // #359
+ INST(Stumaxl , BaseAtomicSt , (0b1011100001100000011000, kWX, 30) , kRWI_RX , 0 , 37 ), // #360
+ INST(Stumaxb , BaseAtomicSt , (0b0011100000100000011000, kW , 0 ) , kRWI_RX , 0 , 38 ), // #361
+ INST(Stumaxlb , BaseAtomicSt , (0b0011100001100000011000, kW , 0 ) , kRWI_RX , 0 , 39 ), // #362
+ INST(Stumaxh , BaseAtomicSt , (0b0111100000100000011000, kW , 0 ) , kRWI_RX , 0 , 40 ), // #363
+ INST(Stumaxlh , BaseAtomicSt , (0b0111100001100000011000, kW , 0 ) , kRWI_RX , 0 , 41 ), // #364
+ INST(Stumin , BaseAtomicSt , (0b1011100000100000011100, kWX, 30) , kRWI_RX , 0 , 42 ), // #365
+ INST(Stuminl , BaseAtomicSt , (0b1011100001100000011100, kWX, 30) , kRWI_RX , 0 , 43 ), // #366
+ INST(Stuminb , BaseAtomicSt , (0b0011100000100000011100, kW , 0 ) , kRWI_RX , 0 , 44 ), // #367
+ INST(Stuminlb , BaseAtomicSt , (0b0011100001100000011100, kW , 0 ) , kRWI_RX , 0 , 45 ), // #368
+ INST(Stuminh , BaseAtomicSt , (0b0111100000100000011100, kW , 0 ) , kRWI_RX , 0 , 46 ), // #369
+ INST(Stuminlh , BaseAtomicSt , (0b0111100001100000011100, kW , 0 ) , kRWI_RX , 0 , 47 ), // #370
+ INST(Stur , BaseRM_SImm9 , (0b1011100000000000000000, 0b0000000000000000000000, kWX, kZR, 30, 0) , kRWI_RW , 0 , 18 ), // #371
+ INST(Sturb , BaseRM_SImm9 , (0b0011100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 19 ), // #372
+ INST(Sturh , BaseRM_SImm9 , (0b0111100000000000000000, 0b0000000000000000000000, kW , kZR, 0 , 0) , kRWI_RW , 0 , 20 ), // #373
+ INST(Stxp , BaseStxp , (0b1000100000100000000000, kWX, 30) , kRWI_WRRW , 0 , 1 ), // #374
+ INST(Stxr , BaseStx , (0b1000100000000000011111, kWX, 30) , kRWI_WRW , 0 , 0 ), // #375
+ INST(Stxrb , BaseStx , (0b0000100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 1 ), // #376
+ INST(Stxrh , BaseStx , (0b0100100000000000011111, kW , 0 ) , kRWI_WRW , 0 , 2 ), // #377
+ INST(Stz2g , BaseRM_SImm9 , (0b1101100111100000000010, 0b1101100111100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 21 ), // #378
+ INST(Stzg , BaseRM_SImm9 , (0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4) , kRWI_RW , 0 , 22 ), // #379
+ INST(Stzgm , BaseRM_NoImm , (0b1101100100100000000000, kX , kZR, 0) , kRWI_RW , 0 , 20 ), // #380
+ INST(Sub , BaseAddSub , (0b1001011000, 0b1001011001, 0b1010001) , kRWI_W , 0 , 2 ), // #381
+ INST(Subg , BaseRRII , (0b1101000110000000000000, kX, kSP, kX, kSP, 6, 4, 16, 4, 0, 10) , kRWI_W , 0 , 1 ), // #382
+ INST(Subp , BaseRRR , (0b1001101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 20 ), // #383
+ INST(Subps , BaseRRR , (0b1011101011000000000000, kX, kZR, kX, kSP, kX, kSP, false) , kRWI_W , 0 , 21 ), // #384
+ INST(Subs , BaseAddSub , (0b1101011000, 0b1101011001, 0b1110001) , kRWI_W , 0 , 3 ), // #385
+ INST(Svc , BaseOpImm , (0b11010100000000000000000000000001, 16, 5) , 0 , 0 , 13 ), // #386
+ INST(Swp , BaseAtomicOp , (0b1011100000100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 111), // #387
+ INST(Swpa , BaseAtomicOp , (0b1011100010100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 112), // #388
+ INST(Swpab , BaseAtomicOp , (0b0011100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 113), // #389
+ INST(Swpah , BaseAtomicOp , (0b0111100010100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 114), // #390
+ INST(Swpal , BaseAtomicOp , (0b1011100011100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 115), // #391
+ INST(Swpalb , BaseAtomicOp , (0b0011100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 116), // #392
+ INST(Swpalh , BaseAtomicOp , (0b0111100011100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 117), // #393
+ INST(Swpb , BaseAtomicOp , (0b0011100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 118), // #394
+ INST(Swph , BaseAtomicOp , (0b0111100000100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 119), // #395
+ INST(Swpl , BaseAtomicOp , (0b1011100001100000100000, kWX, 30, 1) , kRWI_RWX , 0 , 120), // #396
+ INST(Swplb , BaseAtomicOp , (0b0011100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 121), // #397
+ INST(Swplh , BaseAtomicOp , (0b0111100001100000100000, kW , 0 , 1) , kRWI_RWX , 0 , 122), // #398
+ INST(Sxtb , BaseExtend , (0b0001001100000000000111, kWX, 0) , kRWI_W , 0 , 0 ), // #399
+ INST(Sxth , BaseExtend , (0b0001001100000000001111, kWX, 0) , kRWI_W , 0 , 1 ), // #400
+ INST(Sxtw , BaseExtend , (0b1001001101000000011111, kX , 0) , kRWI_W , 0 , 2 ), // #401
+ INST(Sys , BaseSys , (_) , kRWI_W , 0 , 0 ), // #402
+ INST(Tlbi , BaseAtDcIcTlbi , (0b00011110000000, 0b00010000000000, false) , kRWI_RX , 0 , 3 ), // #403
+ INST(Tst , BaseTst , (0b1101010000, 0b111001000) , kRWI_R , 0 , 0 ), // #404
+ INST(Tbnz , BaseBranchTst , (0b00110111000000000000000000000000) , kRWI_R , 0 , 0 ), // #405
+ INST(Tbz , BaseBranchTst , (0b00110110000000000000000000000000) , kRWI_R , 0 , 1 ), // #406
+ INST(Ubfiz , BaseBfi , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #407
+ INST(Ubfm , BaseBfm , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #408
+ INST(Ubfx , BaseBfx , (0b01010011000000000000000000000000) , kRWI_W , 0 , 2 ), // #409
+ INST(Udf , BaseOpImm , (0b00000000000000000000000000000000, 16, 0) , 0 , 0 , 14 ), // #410
+ INST(Udiv , BaseRRR , (0b0001101011000000000010, kWX, kZR, kWX, kZR, kWX, kZR, true) , kRWI_W , 0 , 22 ), // #411
+ INST(Umaddl , BaseRRRR , (0b1001101110100000000000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 4 ), // #412
+ INST(Umax , BaseMinMax , (0b00011010110000000110010000000000, 0b00010001110001000000000000000000) , kRWI_W , 0 , 2 ), // #413
+ INST(Umin , BaseMinMax , (0b00011010110000000110110000000000, 0b00010001110011000000000000000000) , kRWI_W , 0 , 3 ), // #414
+ INST(Umnegl , BaseRRR , (0b1001101110100000111111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 23 ), // #415
+ INST(Umull , BaseRRR , (0b1001101110100000011111, kX , kZR, kW , kZR, kW , kZR, false) , kRWI_W , 0 , 24 ), // #416
+ INST(Umulh , BaseRRR , (0b1001101111000000011111, kX , kZR, kX , kZR, kX , kZR, false) , kRWI_W , 0 , 25 ), // #417
+ INST(Umsubl , BaseRRRR , (0b1001101110100000100000, kX , kZR, kW , kZR, kW , kZR, kX , kZR, false) , kRWI_W , 0 , 5 ), // #418
+ INST(Uxtb , BaseExtend , (0b0101001100000000000111, kW, 1) , kRWI_W , 0 , 3 ), // #419
+ INST(Uxth , BaseExtend , (0b0101001100000000001111, kW, 1) , kRWI_W , 0 , 4 ), // #420
+ INST(Wfe , BaseOp , (0b11010101000000110010000001011111) , 0 , 0 , 19 ), // #421
+ INST(Wfi , BaseOp , (0b11010101000000110010000001111111) , 0 , 0 , 20 ), // #422
+ INST(Xaflag , BaseOp , (0b11010101000000000100000000111111) , 0 , 0 , 21 ), // #423
+ INST(Xpacd , BaseR , (0b11011010110000010100011111100000, kX, kZR, 0) , kRWI_X , 0 , 8 ), // #424
+ INST(Xpaci , BaseR , (0b11011010110000010100001111100000, kX, kZR, 0) , kRWI_X , 0 , 9 ), // #425
+ INST(Xpaclri , BaseOp , (0b11010101000000110010000011111111) , kRWI_X , 0 , 22 ), // #426
+ INST(Yield , BaseOp , (0b11010101000000110010000000111111) , 0 , 0 , 23 ), // #427
+ INST(Abs_v , ISimdVV , (0b0000111000100000101110, kVO_V_Any) , kRWI_W , 0 , 0 ), // #428
+ INST(Add_v , ISimdVVV , (0b0000111000100000100001, kVO_V_Any) , kRWI_W , 0 , 0 ), // #429
+ INST(Addhn_v , ISimdVVV , (0b0000111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 1 ), // #430
+ INST(Addhn2_v , ISimdVVV , (0b0100111000100000010000, kVO_V_B16H8S4) , kRWI_W , F(Narrow) , 2 ), // #431
+ INST(Addp_v , ISimdPair , (0b0101111000110001101110, 0b0000111000100000101111, kVO_V_Any) , kRWI_W , F(Pair) , 0 ), // #432
+ INST(Addv_v , ISimdSV , (0b0000111000110001101110, kVO_V_BH_4S) , kRWI_W , 0 , 0 ), // #433
+ INST(Aesd_v , ISimdVVx , (0b0100111000101000010110, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 0 ), // #434
+ INST(Aese_v , ISimdVVx , (0b0100111000101000010010, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 1 ), // #435
+ INST(Aesimc_v , ISimdVVx , (0b0100111000101000011110, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 2 ), // #436
+ INST(Aesmc_v , ISimdVVx , (0b0100111000101000011010, kOp_V16B, kOp_V16B) , kRWI_W , 0 , 3 ), // #437
+ INST(And_v , ISimdVVV , (0b0000111000100000000111, kVO_V_B) , kRWI_W , 0 , 3 ), // #438
+ INST(Bcax_v , ISimdVVVV , (0b1100111000100000000000, kVO_V_B16) , kRWI_W , 0 , 0 ), // #439
+ INST(Bfcvt_v , ISimdVVx , (0b0001111001100011010000, kOp_H, kOp_S) , kRWI_W , 0 , 4 ), // #440
+ INST(Bfcvtn_v , ISimdVVx , (0b0000111010100001011010, kOp_V4H, kOp_V4S) , kRWI_W , F(Narrow) , 5 ), // #441
+ INST(Bfcvtn2_v , ISimdVVx , (0b0100111010100001011010, kOp_V8H, kOp_V4S) , kRWI_W , F(Narrow) , 6 ), // #442
+ INST(Bfdot_v , SimdDot , (0b0010111001000000111111, 0b0000111101000000111100, kET_S, kET_H, kET_2H) , kRWI_X , 0 , 0 ), // #443
+ INST(Bfmlalb_v , SimdFmlal , (0b0010111011000000111111, 0b0000111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 0 ), // #444
+ INST(Bfmlalt_v , SimdFmlal , (0b0110111011000000111111, 0b0100111111000000111100, 0, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 1 ), // #445
+ INST(Bfmmla_v , ISimdVVVx , (0b0110111001000000111011, kOp_V4S, kOp_V8H, kOp_V8H) , kRWI_X , F(Long) , 0 ), // #446
+ INST(Bic_v , SimdBicOrr , (0b0000111001100000000111, 0b0010111100000000000001) , kRWI_W , 0 , 0 ), // #447
+ INST(Bif_v , ISimdVVV , (0b0010111011100000000111, kVO_V_B) , kRWI_X , 0 , 4 ), // #448
+ INST(Bit_v , ISimdVVV , (0b0010111010100000000111, kVO_V_B) , kRWI_X , 0 , 5 ), // #449
+ INST(Bsl_v , ISimdVVV , (0b0010111001100000000111, kVO_V_B) , kRWI_X , 0 , 6 ), // #450
+ INST(Cls_v , ISimdVV , (0b0000111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 1 ), // #451
+ INST(Clz_v , ISimdVV , (0b0010111000100000010010, kVO_V_BHS) , kRWI_W , 0 , 2 ), // #452
+ INST(Cmeq_v , SimdCmp , (0b0010111000100000100011, 0b0000111000100000100110, kVO_V_Any) , kRWI_W , 0 , 0 ), // #453
+ INST(Cmge_v , SimdCmp , (0b0000111000100000001111, 0b0010111000100000100010, kVO_V_Any) , kRWI_W , 0 , 1 ), // #454
+ INST(Cmgt_v , SimdCmp , (0b0000111000100000001101, 0b0000111000100000100010, kVO_V_Any) , kRWI_W , 0 , 2 ), // #455
+ INST(Cmhi_v , SimdCmp , (0b0010111000100000001101, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 3 ), // #456
+ INST(Cmhs_v , SimdCmp , (0b0010111000100000001111, 0b0000000000000000000000, kVO_V_Any) , kRWI_W , 0 , 4 ), // #457
+ INST(Cmle_v , SimdCmp , (0b0000000000000000000000, 0b0010111000100000100110, kVO_V_Any) , kRWI_W , 0 , 5 ), // #458
+ INST(Cmlt_v , SimdCmp , (0b0000000000000000000000, 0b0000111000100000101010, kVO_V_Any) , kRWI_W , 0 , 6 ), // #459
+ INST(Cmtst_v , ISimdVVV , (0b0000111000100000100011, kVO_V_Any) , kRWI_W , 0 , 7 ), // #460
+ INST(Cnt_v , ISimdVV , (0b0000111000100000010110, kVO_V_B) , kRWI_W , 0 , 3 ), // #461
+ INST(Dup_v , SimdDup , (_) , kRWI_W , 0 , 0 ), // #462
+ INST(Eor_v , ISimdVVV , (0b0010111000100000000111, kVO_V_B) , kRWI_W , 0 , 8 ), // #463
+ INST(Eor3_v , ISimdVVVV , (0b1100111000000000000000, kVO_V_B16) , kRWI_W , 0 , 1 ), // #464
+ INST(Ext_v , ISimdVVVI , (0b0010111000000000000000, kVO_V_B, 4, 11, 1) , kRWI_W , 0 , 0 ), // #465
+ INST(Fabd_v , FSimdVVV , (0b0111111010100000110101, kHF_C, 0b0010111010100000110101, kHF_C) , kRWI_W , 0 , 0 ), // #466
+ INST(Fabs_v , FSimdVV , (0b0001111000100000110000, kHF_A, 0b0000111010100000111110, kHF_B) , kRWI_W , 0 , 0 ), // #467
+ INST(Facge_v , FSimdVVV , (0b0111111000100000111011, kHF_C, 0b0010111000100000111011, kHF_C) , kRWI_W , 0 , 1 ), // #468
+ INST(Facgt_v , FSimdVVV , (0b0111111010100000111011, kHF_C, 0b0010111010100000111011, kHF_C) , kRWI_W , 0 , 2 ), // #469
+ INST(Fadd_v , FSimdVVV , (0b0001111000100000001010, kHF_A, 0b0000111000100000110101, kHF_C) , kRWI_W , 0 , 3 ), // #470
+ INST(Faddp_v , FSimdPair , (0b0111111000110000110110, 0b0010111000100000110101) , kRWI_W , 0 , 0 ), // #471
+ INST(Fcadd_v , SimdFcadd , (0b0010111000000000111001) , kRWI_W , 0 , 0 ), // #472
+ INST(Fccmp_v , SimdFccmpFccmpe , (0b00011110001000000000010000000000) , kRWI_R , 0 , 0 ), // #473
+ INST(Fccmpe_v , SimdFccmpFccmpe , (0b00011110001000000000010000010000) , kRWI_R , 0 , 1 ), // #474
+ INST(Fcmeq_v , SimdFcm , (0b0000111000100000111001, kHF_C, 0b0000111010100000110110) , kRWI_W , 0 , 0 ), // #475
+ INST(Fcmge_v , SimdFcm , (0b0010111000100000111001, kHF_C, 0b0010111010100000110010) , kRWI_W , 0 , 1 ), // #476
+ INST(Fcmgt_v , SimdFcm , (0b0010111010100000111001, kHF_C, 0b0000111010100000110010) , kRWI_W , 0 , 2 ), // #477
+ INST(Fcmla_v , SimdFcmla , (0b0010111000000000110001, 0b0010111100000000000100) , kRWI_X , 0 , 0 ), // #478
+ INST(Fcmle_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0010111010100000110110) , kRWI_W , 0 , 3 ), // #479
+ INST(Fcmlt_v , SimdFcm , (0b0000000000000000000000, kHF_C, 0b0000111010100000111010) , kRWI_W , 0 , 4 ), // #480
+ INST(Fcmp_v , SimdFcmpFcmpe , (0b00011110001000000010000000000000) , kRWI_R , 0 , 0 ), // #481
+ INST(Fcmpe_v , SimdFcmpFcmpe , (0b00011110001000000010000000010000) , kRWI_R , 0 , 1 ), // #482
+ INST(Fcsel_v , SimdFcsel , (_) , kRWI_W , 0 , 0 ), // #483
+ INST(Fcvt_v , SimdFcvt , (_) , kRWI_W , 0 , 0 ), // #484
+ INST(Fcvtas_v , SimdFcvtSV , (0b0000111000100001110010, 0b0000000000000000000000, 0b0001111000100100000000, 1) , kRWI_W , 0 , 0 ), // #485
+ INST(Fcvtau_v , SimdFcvtSV , (0b0010111000100001110010, 0b0000000000000000000000, 0b0001111000100101000000, 1) , kRWI_W , 0 , 1 ), // #486
+ INST(Fcvtl_v , SimdFcvtLN , (0b0000111000100001011110, 0, 0) , kRWI_W , F(Long) , 0 ), // #487
+ INST(Fcvtl2_v , SimdFcvtLN , (0b0100111000100001011110, 0, 0) , kRWI_W , F(Long) , 1 ), // #488
+ INST(Fcvtms_v , SimdFcvtSV , (0b0000111000100001101110, 0b0000000000000000000000, 0b0001111000110000000000, 1) , kRWI_W , 0 , 2 ), // #489
+ INST(Fcvtmu_v , SimdFcvtSV , (0b0010111000100001101110, 0b0000000000000000000000, 0b0001111000110001000000, 1) , kRWI_W , 0 , 3 ), // #490
+ INST(Fcvtn_v , SimdFcvtLN , (0b0000111000100001011010, 0, 0) , kRWI_W , F(Narrow) , 2 ), // #491
+ INST(Fcvtn2_v , SimdFcvtLN , (0b0100111000100001011010, 0, 0) , kRWI_X , F(Narrow) , 3 ), // #492
+ INST(Fcvtns_v , SimdFcvtSV , (0b0000111000100001101010, 0b0000000000000000000000, 0b0001111000100000000000, 1) , kRWI_W , 0 , 4 ), // #493
+ INST(Fcvtnu_v , SimdFcvtSV , (0b0010111000100001101010, 0b0000000000000000000000, 0b0001111000100001000000, 1) , kRWI_W , 0 , 5 ), // #494
+ INST(Fcvtps_v , SimdFcvtSV , (0b0000111010100001101010, 0b0000000000000000000000, 0b0001111000101000000000, 1) , kRWI_W , 0 , 6 ), // #495
+ INST(Fcvtpu_v , SimdFcvtSV , (0b0010111010100001101010, 0b0000000000000000000000, 0b0001111000101001000000, 1) , kRWI_W , 0 , 7 ), // #496
+ INST(Fcvtxn_v , SimdFcvtLN , (0b0010111000100001011010, 1, 1) , kRWI_W , F(Narrow) , 4 ), // #497
+ INST(Fcvtxn2_v , SimdFcvtLN , (0b0110111000100001011010, 1, 0) , kRWI_X , F(Narrow) , 5 ), // #498
+ INST(Fcvtzs_v , SimdFcvtSV , (0b0000111010100001101110, 0b0000111100000000111111, 0b0001111000111000000000, 1) , kRWI_W , 0 , 8 ), // #499
+ INST(Fcvtzu_v , SimdFcvtSV , (0b0010111010100001101110, 0b0010111100000000111111, 0b0001111000111001000000, 1) , kRWI_W , 0 , 9 ), // #500
+ INST(Fdiv_v , FSimdVVV , (0b0001111000100000000110, kHF_A, 0b0010111000100000111111, kHF_C) , kRWI_W , 0 , 4 ), // #501
+ INST(Fjcvtzs_v , ISimdVVx , (0b0001111001111110000000, kOp_GpW, kOp_D) , kRWI_W , 0 , 7 ), // #502
+ INST(Fmadd_v , FSimdVVVV , (0b0001111100000000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 0 ), // #503
+ INST(Fmax_v , FSimdVVV , (0b0001111000100000010010, kHF_A, 0b0000111000100000111101, kHF_C) , kRWI_W , 0 , 5 ), // #504
+ INST(Fmaxnm_v , FSimdVVV , (0b0001111000100000011010, kHF_A, 0b0000111000100000110001, kHF_C) , kRWI_W , 0 , 6 ), // #505
+ INST(Fmaxnmp_v , FSimdPair , (0b0111111000110000110010, 0b0010111000100000110001) , kRWI_W , 0 , 1 ), // #506
+ INST(Fmaxnmv_v , FSimdSV , (0b0010111000110000110010) , kRWI_W , 0 , 0 ), // #507
+ INST(Fmaxp_v , FSimdPair , (0b0111111000110000111110, 0b0010111000100000111101) , kRWI_W , 0 , 2 ), // #508
+ INST(Fmaxv_v , FSimdSV , (0b0010111000110000111110) , kRWI_W , 0 , 1 ), // #509
+ INST(Fmin_v , FSimdVVV , (0b0001111000100000010110, kHF_A, 0b0000111010100000111101, kHF_C) , kRWI_W , 0 , 7 ), // #510
+ INST(Fminnm_v , FSimdVVV , (0b0001111000100000011110, kHF_A, 0b0000111010100000110001, kHF_C) , kRWI_W , 0 , 8 ), // #511
+ INST(Fminnmp_v , FSimdPair , (0b0111111010110000110010, 0b0010111010100000110001) , kRWI_W , 0 , 3 ), // #512
+ INST(Fminnmv_v , FSimdSV , (0b0010111010110000110010) , kRWI_W , 0 , 2 ), // #513
+ INST(Fminp_v , FSimdPair , (0b0111111010110000111110, 0b0010111010100000111101) , kRWI_W , 0 , 4 ), // #514
+ INST(Fminv_v , FSimdSV , (0b0010111010110000111110) , kRWI_W , 0 , 3 ), // #515
+ INST(Fmla_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111000100000110011, 0b0000111110000000000100) , kRWI_X , F(VH0_15) , 0 ), // #516
+ INST(Fmlal_v , SimdFmlal , (0b0000111000100000111011, 0b0000111110000000000000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 2 ), // #517
+ INST(Fmlal2_v , SimdFmlal , (0b0010111000100000110011, 0b0010111110000000100000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 3 ), // #518
+ INST(Fmls_v , FSimdVVVe , (0b0000000000000000000000, kHF_N, 0b0000111010100000110011, 0b0000111110000000010100) , kRWI_X , F(VH0_15) , 1 ), // #519
+ INST(Fmlsl_v , SimdFmlal , (0b0000111010100000111011, 0b0000111110000000010000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 4 ), // #520
+ INST(Fmlsl2_v , SimdFmlal , (0b0010111010100000110011, 0b0010111110000000110000, 1, kET_S, kET_H, kET_H) , kRWI_X , F(VH0_15) , 5 ), // #521
+ INST(Fmov_v , SimdFmov , (_) , kRWI_W , 0 , 0 ), // #522
+ INST(Fmsub_v , FSimdVVVV , (0b0001111100000000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 1 ), // #523
+ INST(Fmul_v , FSimdVVVe , (0b0001111000100000000010, kHF_A, 0b0010111000100000110111, 0b0000111110000000100100) , kRWI_W , F(VH0_15) , 2 ), // #524
+ INST(Fmulx_v , FSimdVVVe , (0b0101111000100000110111, kHF_C, 0b0000111000100000110111, 0b0010111110000000100100) , kRWI_W , F(VH0_15) , 3 ), // #525
+ INST(Fneg_v , FSimdVV , (0b0001111000100001010000, kHF_A, 0b0010111010100000111110, kHF_B) , kRWI_W , 0 , 1 ), // #526
+ INST(Fnmadd_v , FSimdVVVV , (0b0001111100100000000000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 2 ), // #527
+ INST(Fnmsub_v , FSimdVVVV , (0b0001111100100000100000, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 ), // #528
+ INST(Fnmul_v , FSimdVVV , (0b0001111000100000100010, kHF_A, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 9 ), // #529
+ INST(Frecpe_v , FSimdVV , (0b0101111010100001110110, kHF_B, 0b0000111010100001110110, kHF_B) , kRWI_W , 0 , 2 ), // #530
+ INST(Frecps_v , FSimdVVV , (0b0101111000100000111111, kHF_C, 0b0000111000100000111111, kHF_C) , kRWI_W , 0 , 10 ), // #531
+ INST(Frecpx_v , FSimdVV , (0b0101111010100001111110, kHF_B, 0b0000000000000000000000, kHF_N) , kRWI_W , 0 , 3 ), // #532
+ INST(Frint32x_v , FSimdVV , (0b0001111000101000110000, kHF_N, 0b0010111000100001111010, kHF_N) , kRWI_W , 0 , 4 ), // #533
+ INST(Frint32z_v , FSimdVV , (0b0001111000101000010000, kHF_N, 0b0000111000100001111010, kHF_N) , kRWI_W , 0 , 5 ), // #534
+ INST(Frint64x_v , FSimdVV , (0b0001111000101001110000, kHF_N, 0b0010111000100001111110, kHF_N) , kRWI_W , 0 , 6 ), // #535
+ INST(Frint64z_v , FSimdVV , (0b0001111000101001010000, kHF_N, 0b0000111000100001111110, kHF_N) , kRWI_W , 0 , 7 ), // #536
+ INST(Frinta_v , FSimdVV , (0b0001111000100110010000, kHF_A, 0b0010111000100001100010, kHF_B) , kRWI_W , 0 , 8 ), // #537
+ INST(Frinti_v , FSimdVV , (0b0001111000100111110000, kHF_A, 0b0010111010100001100110, kHF_B) , kRWI_W , 0 , 9 ), // #538
+ INST(Frintm_v , FSimdVV , (0b0001111000100101010000, kHF_A, 0b0000111000100001100110, kHF_B) , kRWI_W , 0 , 10 ), // #539
+ INST(Frintn_v , FSimdVV , (0b0001111000100100010000, kHF_A, 0b0000111000100001100010, kHF_B) , kRWI_W , 0 , 11 ), // #540
+ INST(Frintp_v , FSimdVV , (0b0001111000100100110000, kHF_A, 0b0000111010100001100010, kHF_B) , kRWI_W , 0 , 12 ), // #541
+ INST(Frintx_v , FSimdVV , (0b0001111000100111010000, kHF_A, 0b0010111000100001100110, kHF_B) , kRWI_W , 0 , 13 ), // #542
+ INST(Frintz_v , FSimdVV , (0b0001111000100101110000, kHF_A, 0b0000111010100001100110, kHF_B) , kRWI_W , 0 , 14 ), // #543
+ INST(Frsqrte_v , FSimdVV , (0b0111111010100001110110, kHF_B, 0b0010111010100001110110, kHF_B) , kRWI_W , 0 , 15 ), // #544
+ INST(Frsqrts_v , FSimdVVV , (0b0101111010100000111111, kHF_C, 0b0000111010100000111111, kHF_C) , kRWI_W , 0 , 11 ), // #545
+ INST(Fsqrt_v , FSimdVV , (0b0001111000100001110000, kHF_A, 0b0010111010100001111110, kHF_B) , kRWI_W , 0 , 16 ), // #546
+ INST(Fsub_v , FSimdVVV , (0b0001111000100000001110, kHF_A, 0b0000111010100000110101, kHF_C) , kRWI_W , 0 , 12 ), // #547
+ INST(Ins_v , SimdIns , (_) , kRWI_X , 0 , 0 ), // #548
+ INST(Ld1_v , SimdLdNStN , (0b0000110101000000000000, 0b0000110001000000001000, 1, 0) , kRWI_LDn , F(Consecutive) , 0 ), // #549
+ INST(Ld1r_v , SimdLdNStN , (0b0000110101000000110000, 0b0000000000000000000000, 1, 1) , kRWI_LDn , F(Consecutive) , 1 ), // #550
+ INST(Ld2_v , SimdLdNStN , (0b0000110101100000000000, 0b0000110001000000100000, 2, 0) , kRWI_LDn , F(Consecutive) , 2 ), // #551
+ INST(Ld2r_v , SimdLdNStN , (0b0000110101100000110000, 0b0000000000000000000000, 2, 1) , kRWI_LDn , F(Consecutive) , 3 ), // #552
+ INST(Ld3_v , SimdLdNStN , (0b0000110101000000001000, 0b0000110001000000010000, 3, 0) , kRWI_LDn , F(Consecutive) , 4 ), // #553
+ INST(Ld3r_v , SimdLdNStN , (0b0000110101000000111000, 0b0000000000000000000000, 3, 1) , kRWI_LDn , F(Consecutive) , 5 ), // #554
+ INST(Ld4_v , SimdLdNStN , (0b0000110101100000001000, 0b0000110001000000000000, 4, 0) , kRWI_LDn , F(Consecutive) , 6 ), // #555
+ INST(Ld4r_v , SimdLdNStN , (0b0000110101100000111000, 0b0000000000000000000000, 4, 1) , kRWI_LDn , F(Consecutive) , 7 ), // #556
+ INST(Ldnp_v , SimdLdpStp , (0b0010110001, 0b0000000000) , kRWI_WW , 0 , 0 ), // #557
+ INST(Ldp_v , SimdLdpStp , (0b0010110101, 0b0010110011) , kRWI_WW , 0 , 1 ), // #558
+ INST(Ldr_v , SimdLdSt , (0b0011110101, 0b00111100010, 0b00111100011, 0b00011100, Inst::kIdLdur_v) , kRWI_W , 0 , 0 ), // #559
+ INST(Ldur_v , SimdLdurStur , (0b0011110001000000000000) , kRWI_W , 0 , 0 ), // #560
+ INST(Mla_v , ISimdVVVe , (0b0000111000100000100101, kVO_V_BHS, 0b0010111100000000000000, kVO_V_HS) , kRWI_X , F(VH0_15) , 0 ), // #561
+ INST(Mls_v , ISimdVVVe , (0b0010111000100000100101, kVO_V_BHS, 0b0010111100000000010000, kVO_V_HS) , kRWI_X , F(VH0_15) , 1 ), // #562
+ INST(Mov_v , SimdMov , (_) , kRWI_W , 0 , 0 ), // #563
+ INST(Movi_v , SimdMoviMvni , (0b0000111100000000000001, 0) , kRWI_W , 0 , 0 ), // #564
+ INST(Mul_v , ISimdVVVe , (0b0000111000100000100111, kVO_V_BHS, 0b0000111100000000100000, kVO_V_HS) , kRWI_W , F(VH0_15) , 2 ), // #565
+ INST(Mvn_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 4 ), // #566
+ INST(Mvni_v , SimdMoviMvni , (0b0000111100000000000001, 1) , kRWI_W , 0 , 1 ), // #567
+ INST(Neg_v , ISimdVV , (0b0010111000100000101110, kVO_V_Any) , kRWI_W , 0 , 5 ), // #568
+ INST(Not_v , ISimdVV , (0b0010111000100000010110, kVO_V_B) , kRWI_W , 0 , 6 ), // #569
+ INST(Orn_v , ISimdVVV , (0b0000111011100000000111, kVO_V_B) , kRWI_W , 0 , 9 ), // #570
+ INST(Orr_v , SimdBicOrr , (0b0000111010100000000111, 0b0000111100000000000001) , kRWI_W , 0 , 1 ), // #571
+ INST(Pmul_v , ISimdVVV , (0b0010111000100000100111, kVO_V_B) , kRWI_W , 0 , 10 ), // #572
+ INST(Pmull_v , ISimdVVV , (0b0000111000100000111000, kVO_V_B8D1) , kRWI_W , F(Long) , 11 ), // #573
+ INST(Pmull2_v , ISimdVVV , (0b0100111000100000111000, kVO_V_B16D2) , kRWI_W , F(Long) , 12 ), // #574
+ INST(Raddhn_v , ISimdVVV , (0b0010111000100000010000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 13 ), // #575
+ INST(Raddhn2_v , ISimdVVV , (0b0110111000100000010000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 ), // #576
+ INST(Rax1_v , ISimdVVV , (0b1100111001100000100011, kVO_V_D2) , kRWI_W , 0 , 15 ), // #577
+ INST(Rbit_v , ISimdVV , (0b0010111001100000010110, kVO_V_B) , kRWI_W , 0 , 7 ), // #578
+ INST(Rev16_v , ISimdVV , (0b0000111000100000000110, kVO_V_B) , kRWI_W , 0 , 8 ), // #579
+ INST(Rev32_v , ISimdVV , (0b0010111000100000000010, kVO_V_BH) , kRWI_W , 0 , 9 ), // #580
+ INST(Rev64_v , ISimdVV , (0b0000111000100000000010, kVO_V_BHS) , kRWI_W , 0 , 10 ), // #581
+ INST(Rshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100011, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 0 ), // #582
+ INST(Rshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 1 ), // #583
+ INST(Rsubhn_v , ISimdVVV , (0b0010111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 16 ), // #584
+ INST(Rsubhn2_v , ISimdVVV , (0b0110111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 17 ), // #585
+ INST(Saba_v , ISimdVVV , (0b0000111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 18 ), // #586
+ INST(Sabal_v , ISimdVVV , (0b0000111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 19 ), // #587
+ INST(Sabal2_v , ISimdVVV , (0b0100111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 20 ), // #588
+ INST(Sabd_v , ISimdVVV , (0b0000111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 21 ), // #589
+ INST(Sabdl_v , ISimdVVV , (0b0000111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 ), // #590
+ INST(Sabdl2_v , ISimdVVV , (0b0100111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 ), // #591
+ INST(Sadalp_v , ISimdVV , (0b0000111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 11 ), // #592
+ INST(Saddl_v , ISimdVVV , (0b0000111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 24 ), // #593
+ INST(Saddl2_v , ISimdVVV , (0b0100111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 25 ), // #594
+ INST(Saddlp_v , ISimdVV , (0b0000111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 12 ), // #595
+ INST(Saddlv_v , ISimdSV , (0b0000111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 1 ), // #596
+ INST(Saddw_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 0 ), // #597
+ INST(Saddw2_v , ISimdWWV , (0b0000111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 1 ), // #598
+ INST(Scvtf_v , SimdFcvtSV , (0b0000111000100001110110, 0b0000111100000000111001, 0b0001111000100010000000, 0) , kRWI_W , 0 , 10 ), // #599
+ INST(Sdot_v , SimdDot , (0b0000111010000000100101, 0b0000111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 1 ), // #600
+ INST(Sha1c_v , ISimdVVVx , (0b0101111000000000000000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 1 ), // #601
+ INST(Sha1h_v , ISimdVVx , (0b0101111000101000000010, kOp_S, kOp_S) , kRWI_W , 0 , 8 ), // #602
+ INST(Sha1m_v , ISimdVVVx , (0b0101111000000000001000, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 2 ), // #603
+ INST(Sha1p_v , ISimdVVVx , (0b0101111000000000000100, kOp_Q, kOp_S, kOp_V4S) , kRWI_X , 0 , 3 ), // #604
+ INST(Sha1su0_v , ISimdVVVx , (0b0101111000000000001100, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 4 ), // #605
+ INST(Sha1su1_v , ISimdVVx , (0b0101111000101000000110, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 9 ), // #606
+ INST(Sha256h_v , ISimdVVVx , (0b0101111000000000010000, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 5 ), // #607
+ INST(Sha256h2_v , ISimdVVVx , (0b0101111000000000010100, kOp_Q, kOp_Q, kOp_V4S) , kRWI_X , 0 , 6 ), // #608
+ INST(Sha256su0_v , ISimdVVx , (0b0101111000101000001010, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 10 ), // #609
+ INST(Sha256su1_v , ISimdVVVx , (0b0101111000000000011000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 7 ), // #610
+ INST(Sha512h_v , ISimdVVVx , (0b1100111001100000100000, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 8 ), // #611
+ INST(Sha512h2_v , ISimdVVVx , (0b1100111001100000100001, kOp_Q, kOp_Q, kOp_V2D) , kRWI_X , 0 , 9 ), // #612
+ INST(Sha512su0_v , ISimdVVx , (0b1100111011000000100000, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 11 ), // #613
+ INST(Sha512su1_v , ISimdVVVx , (0b1100111001100000100010, kOp_V2D, kOp_V2D, kOp_V2D) , kRWI_X , 0 , 10 ), // #614
+ INST(Shadd_v , ISimdVVV , (0b0000111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 26 ), // #615
+ INST(Shl_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000010101, 0, kVO_V_Any) , kRWI_W , 0 , 2 ), // #616
+ INST(Shll_v , SimdShiftES , (0b0010111000100001001110, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 ), // #617
+ INST(Shll2_v , SimdShiftES , (0b0110111000100001001110, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 ), // #618
+ INST(Shrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100001, 1, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 3 ), // #619
+ INST(Shrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 4 ), // #620
+ INST(Shsub_v , ISimdVVV , (0b0000111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 27 ), // #621
+ INST(Sli_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010101, 0, kVO_V_Any) , kRWI_X , 0 , 5 ), // #622
+ INST(Sm3partw1_v , ISimdVVVx , (0b1100111001100000110000, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 11 ), // #623
+ INST(Sm3partw2_v , ISimdVVVx , (0b1100111001100000110001, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 ), // #624
+ INST(Sm3ss1_v , ISimdVVVVx , (0b1100111001000000000000, kOp_V4S, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_W , 0 , 0 ), // #625
+ INST(Sm3tt1a_v , SimdSm3tt , (0b1100111001000000100000) , kRWI_X , 0 , 0 ), // #626
+ INST(Sm3tt1b_v , SimdSm3tt , (0b1100111001000000100001) , kRWI_X , 0 , 1 ), // #627
+ INST(Sm3tt2a_v , SimdSm3tt , (0b1100111001000000100010) , kRWI_X , 0 , 2 ), // #628
+ INST(Sm3tt2b_v , SimdSm3tt , (0b1100111001000000100011) , kRWI_X , 0 , 3 ), // #629
+ INST(Sm4e_v , ISimdVVx , (0b1100111011000000100001, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 12 ), // #630
+ INST(Sm4ekey_v , ISimdVVVx , (0b1100111001100000110010, kOp_V4S, kOp_V4S, kOp_V4S) , kRWI_X , 0 , 13 ), // #631
+ INST(Smax_v , ISimdVVV , (0b0000111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 28 ), // #632
+ INST(Smaxp_v , ISimdVVV , (0b0000111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 29 ), // #633
+ INST(Smaxv_v , ISimdSV , (0b0000111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 2 ), // #634
+ INST(Smin_v , ISimdVVV , (0b0000111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 30 ), // #635
+ INST(Sminp_v , ISimdVVV , (0b0000111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 31 ), // #636
+ INST(Sminv_v , ISimdSV , (0b0000111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 3 ), // #637
+ INST(Smlal_v , ISimdVVVe , (0b0000111000100000100000, kVO_V_B8H4S2, 0b0000111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 3 ), // #638
+ INST(Smlal2_v , ISimdVVVe , (0b0100111000100000100000, kVO_V_B16H8S4, 0b0100111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 4 ), // #639
+ INST(Smlsl_v , ISimdVVVe , (0b0000111000100000101000, kVO_V_B8H4S2, 0b0000111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 5 ), // #640
+ INST(Smlsl2_v , ISimdVVVe , (0b0100111000100000101000, kVO_V_B16H8S4, 0b0100111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 6 ), // #641
+ INST(Smmla_v , ISimdVVVx , (0b0100111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 14 ), // #642
+ INST(Smov_v , SimdSmovUmov , (0b0000111000000000001011, kVO_V_BHS, 1) , kRWI_W , 0 , 0 ), // #643
+ INST(Smull_v , ISimdVVVe , (0b0000111000100000110000, kVO_V_B8H4S2, 0b0000111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 7 ), // #644
+ INST(Smull2_v , ISimdVVVe , (0b0100111000100000110000, kVO_V_B16H8S4, 0b0100111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 8 ), // #645
+ INST(Sqabs_v , ISimdVV , (0b0000111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 13 ), // #646
+ INST(Sqadd_v , ISimdVVV , (0b0000111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 32 ), // #647
+ INST(Sqdmlal_v , ISimdVVVe , (0b0000111000100000100100, kVO_SV_BHS, 0b0000111100000000001100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 9 ), // #648
+ INST(Sqdmlal2_v , ISimdVVVe , (0b0100111000100000100100, kVO_V_B16H8S4, 0b0100111100000000001100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 10 ), // #649
+ INST(Sqdmlsl_v , ISimdVVVe , (0b0000111000100000101100, kVO_SV_BHS, 0b0000111100000000011100, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 11 ), // #650
+ INST(Sqdmlsl2_v , ISimdVVVe , (0b0100111000100000101100, kVO_V_B16H8S4, 0b0100111100000000011100, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 12 ), // #651
+ INST(Sqdmulh_v , ISimdVVVe , (0b0000111000100000101101, kVO_SV_HS, 0b0000111100000000110000, kVO_SV_HS) , kRWI_W , F(VH0_15) , 13 ), // #652
+ INST(Sqdmull_v , ISimdVVVe , (0b0000111000100000110100, kVO_SV_BHS, 0b0000111100000000101100, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 14 ), // #653
+ INST(Sqdmull2_v , ISimdVVVe , (0b0100111000100000110100, kVO_V_B16H8S4, 0b0100111100000000101100, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 15 ), // #654
+ INST(Sqneg_v , ISimdVV , (0b0010111000100000011110, kVO_SV_Any) , kRWI_W , 0 , 14 ), // #655
+ INST(Sqrdmlah_v , ISimdVVVe , (0b0010111000000000100001, kVO_SV_HS, 0b0010111100000000110100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 16 ), // #656
+ INST(Sqrdmlsh_v , ISimdVVVe , (0b0010111000000000100011, kVO_SV_HS, 0b0010111100000000111100, kVO_SV_HS) , kRWI_X , F(VH0_15) , 17 ), // #657
+ INST(Sqrdmulh_v , ISimdVVVe , (0b0010111000100000101101, kVO_SV_HS, 0b0000111100000000110100, kVO_SV_HS) , kRWI_W , F(VH0_15) , 18 ), // #658
+ INST(Sqrshl_v , SimdShift , (0b0000111000100000010111, 0b0000000000000000000000, 1, kVO_SV_Any) , kRWI_W , 0 , 6 ), // #659
+ INST(Sqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 7 ), // #660
+ INST(Sqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 8 ), // #661
+ INST(Sqrshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100011, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 9 ), // #662
+ INST(Sqrshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100011, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 10 ), // #663
+ INST(Sqshl_v , SimdShift , (0b0000111000100000010011, 0b0000111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 11 ), // #664
+ INST(Sqshlu_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000011001, 0, kVO_SV_Any) , kRWI_W , 0 , 12 ), // #665
+ INST(Sqshrn_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 13 ), // #666
+ INST(Sqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 14 ), // #667
+ INST(Sqshrun_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100001, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 ), // #668
+ INST(Sqshrun2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100001, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 ), // #669
+ INST(Sqsub_v , ISimdVVV , (0b0000111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 33 ), // #670
+ INST(Sqxtn_v , ISimdVV , (0b0000111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 15 ), // #671
+ INST(Sqxtn2_v , ISimdVV , (0b0100111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 16 ), // #672
+ INST(Sqxtun_v , ISimdVV , (0b0010111000100001001010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 17 ), // #673
+ INST(Sqxtun2_v , ISimdVV , (0b0110111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 18 ), // #674
+ INST(Srhadd_v , ISimdVVV , (0b0000111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 34 ), // #675
+ INST(Sri_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000010001, 1, kVO_V_Any) , kRWI_W , 0 , 17 ), // #676
+ INST(Srshl_v , SimdShift , (0b0000111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 18 ), // #677
+ INST(Srshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 19 ), // #678
+ INST(Srsra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 20 ), // #679
+ INST(Sshl_v , SimdShift , (0b0000111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 21 ), // #680
+ INST(Sshll_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 22 ), // #681
+ INST(Sshll2_v , SimdShift , (0b0000000000000000000000, 0b0100111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 23 ), // #682
+ INST(Sshr_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 24 ), // #683
+ INST(Ssra_v , SimdShift , (0b0000000000000000000000, 0b0000111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 25 ), // #684
+ INST(Ssubl_v , ISimdVVV , (0b0000111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 35 ), // #685
+ INST(Ssubl2_v , ISimdVVV , (0b0100111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 36 ), // #686
+ INST(Ssubw_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 2 ), // #687
+ INST(Ssubw2_v , ISimdWWV , (0b0000111000100000001100, kVO_V_B16H8S4) , kRWI_X , 0 , 3 ), // #688
+ INST(St1_v , SimdLdNStN , (0b0000110100000000000000, 0b0000110000000000001000, 1, 0) , kRWI_STn , F(Consecutive) , 8 ), // #689
+ INST(St2_v , SimdLdNStN , (0b0000110100100000000000, 0b0000110000000000100000, 2, 0) , kRWI_STn , F(Consecutive) , 9 ), // #690
+ INST(St3_v , SimdLdNStN , (0b0000110100000000001000, 0b0000110000000000010000, 3, 0) , kRWI_STn , F(Consecutive) , 10 ), // #691
+ INST(St4_v , SimdLdNStN , (0b0000110100100000001000, 0b0000110000000000000000, 4, 0) , kRWI_STn , F(Consecutive) , 11 ), // #692
+ INST(Stnp_v , SimdLdpStp , (0b0010110000, 0b0000000000) , kRWI_RRW , 0 , 2 ), // #693
+ INST(Stp_v , SimdLdpStp , (0b0010110100, 0b0010110010) , kRWI_RRW , 0 , 3 ), // #694
+ INST(Str_v , SimdLdSt , (0b0011110100, 0b00111100000, 0b00111100001, 0b00000000, Inst::kIdStur_v) , kRWI_RW , 0 , 1 ), // #695
+ INST(Stur_v , SimdLdurStur , (0b0011110000000000000000) , kRWI_RW , 0 , 1 ), // #696
+ INST(Sub_v , ISimdVVV , (0b0010111000100000100001, kVO_V_Any) , kRWI_W , 0 , 37 ), // #697
+ INST(Subhn_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 38 ), // #698
+ INST(Subhn2_v , ISimdVVV , (0b0000111000100000011000, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 39 ), // #699
+ INST(Sudot_v , SimdDot , (0b0000000000000000000000, 0b0000111100000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 2 ), // #700
+ INST(Suqadd_v , ISimdVV , (0b0000111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 19 ), // #701
+ INST(Sxtl_v , SimdSxtlUxtl , (0b0000111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 0 ), // #702
+ INST(Sxtl2_v , SimdSxtlUxtl , (0b0100111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 1 ), // #703
+ INST(Tbl_v , SimdTblTbx , (0b0000111000000000000000) , kRWI_W , 0 , 0 ), // #704
+ INST(Tbx_v , SimdTblTbx , (0b0000111000000000000100) , kRWI_W , 0 , 1 ), // #705
+ INST(Trn1_v , ISimdVVV , (0b0000111000000000001010, kVO_V_BHS_D2) , kRWI_W , 0 , 40 ), // #706
+ INST(Trn2_v , ISimdVVV , (0b0000111000000000011010, kVO_V_BHS_D2) , kRWI_W , 0 , 41 ), // #707
+ INST(Uaba_v , ISimdVVV , (0b0010111000100000011111, kVO_V_BHS) , kRWI_X , 0 , 42 ), // #708
+ INST(Uabal_v , ISimdVVV , (0b0010111000100000010100, kVO_V_B8H4S2) , kRWI_X , F(Long) , 43 ), // #709
+ INST(Uabal2_v , ISimdVVV , (0b0110111000100000010100, kVO_V_B16H8S4) , kRWI_X , F(Long) , 44 ), // #710
+ INST(Uabd_v , ISimdVVV , (0b0010111000100000011101, kVO_V_BHS) , kRWI_W , 0 , 45 ), // #711
+ INST(Uabdl_v , ISimdVVV , (0b0010111000100000011100, kVO_V_B8H4S2) , kRWI_W , F(Long) , 46 ), // #712
+ INST(Uabdl2_v , ISimdVVV , (0b0110111000100000011100, kVO_V_B16H8S4) , kRWI_W , F(Long) , 47 ), // #713
+ INST(Uadalp_v , ISimdVV , (0b0010111000100000011010, kVO_V_BHS) , kRWI_X , F(Long) | F(Pair) , 20 ), // #714
+ INST(Uaddl_v , ISimdVVV , (0b0010111000100000000000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 48 ), // #715
+ INST(Uaddl2_v , ISimdVVV , (0b0110111000100000000000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 49 ), // #716
+ INST(Uaddlp_v , ISimdVV , (0b0010111000100000001010, kVO_V_BHS) , kRWI_W , F(Long) | F(Pair) , 21 ), // #717
+ INST(Uaddlv_v , ISimdSV , (0b0010111000110000001110, kVO_V_BH_4S) , kRWI_W , F(Long) , 4 ), // #718
+ INST(Uaddw_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B8H4S2) , kRWI_W , 0 , 4 ), // #719
+ INST(Uaddw2_v , ISimdWWV , (0b0010111000100000000100, kVO_V_B16H8S4) , kRWI_W , 0 , 5 ), // #720
+ INST(Ucvtf_v , SimdFcvtSV , (0b0010111000100001110110, 0b0010111100000000111001, 0b0001111000100011000000, 0) , kRWI_W , 0 , 11 ), // #721
+ INST(Udot_v , SimdDot , (0b0010111010000000100101, 0b0010111110000000111000, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 3 ), // #722
+ INST(Uhadd_v , ISimdVVV , (0b0010111000100000000001, kVO_V_BHS) , kRWI_W , 0 , 50 ), // #723
+ INST(Uhsub_v , ISimdVVV , (0b0010111000100000001001, kVO_V_BHS) , kRWI_W , 0 , 51 ), // #724
+ INST(Umax_v , ISimdVVV , (0b0010111000100000011001, kVO_V_BHS) , kRWI_W , 0 , 52 ), // #725
+ INST(Umaxp_v , ISimdVVV , (0b0010111000100000101001, kVO_V_BHS) , kRWI_W , 0 , 53 ), // #726
+ INST(Umaxv_v , ISimdSV , (0b0010111000110000101010, kVO_V_BH_4S) , kRWI_W , 0 , 5 ), // #727
+ INST(Umin_v , ISimdVVV , (0b0010111000100000011011, kVO_V_BHS) , kRWI_W , 0 , 54 ), // #728
+ INST(Uminp_v , ISimdVVV , (0b0010111000100000101011, kVO_V_BHS) , kRWI_W , 0 , 55 ), // #729
+ INST(Uminv_v , ISimdSV , (0b0010111000110001101010, kVO_V_BH_4S) , kRWI_W , 0 , 6 ), // #730
+ INST(Umlal_v , ISimdVVVe , (0b0010111000100000100000, kVO_V_B8H4S2, 0b0010111100000000001000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 19 ), // #731
+ INST(Umlal2_v , ISimdVVVe , (0b0110111000100000100000, kVO_V_B16H8S4, 0b0010111100000000001000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 20 ), // #732
+ INST(Umlsl_v , ISimdVVVe , (0b0010111000100000101000, kVO_V_B8H4S2, 0b0010111100000000011000, kVO_V_H4S2) , kRWI_X , F(Long) | F(VH0_15) , 21 ), // #733
+ INST(Umlsl2_v , ISimdVVVe , (0b0110111000100000101000, kVO_V_B16H8S4, 0b0110111100000000011000, kVO_V_H8S4) , kRWI_X , F(Long) | F(VH0_15) , 22 ), // #734
+ INST(Ummla_v , ISimdVVVx , (0b0110111010000000101001, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 15 ), // #735
+ INST(Umov_v , SimdSmovUmov , (0b0000111000000000001111, kVO_V_Any, 0) , kRWI_W , 0 , 1 ), // #736
+ INST(Umull_v , ISimdVVVe , (0b0010111000100000110000, kVO_V_B8H4S2, 0b0010111100000000101000, kVO_V_H4S2) , kRWI_W , F(Long) | F(VH0_15) , 23 ), // #737
+ INST(Umull2_v , ISimdVVVe , (0b0110111000100000110000, kVO_V_B16H8S4, 0b0110111100000000101000, kVO_V_H8S4) , kRWI_W , F(Long) | F(VH0_15) , 24 ), // #738
+ INST(Uqadd_v , ISimdVVV , (0b0010111000100000000011, kVO_SV_Any) , kRWI_W , 0 , 56 ), // #739
+ INST(Uqrshl_v , SimdShift , (0b0010111000100000010111, 0b0000000000000000000000, 0, kVO_SV_Any) , kRWI_W , 0 , 26 ), // #740
+ INST(Uqrshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100111, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 27 ), // #741
+ INST(Uqrshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100111, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 ), // #742
+ INST(Uqshl_v , SimdShift , (0b0010111000100000010011, 0b0010111100000000011101, 0, kVO_SV_Any) , kRWI_W , 0 , 29 ), // #743
+ INST(Uqshrn_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000100101, 1, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 30 ), // #744
+ INST(Uqshrn2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000100101, 1, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 31 ), // #745
+ INST(Uqsub_v , ISimdVVV , (0b0010111000100000001011, kVO_SV_Any) , kRWI_W , 0 , 57 ), // #746
+ INST(Uqxtn_v , ISimdVV , (0b0010111000100001010010, kVO_SV_B8H4S2) , kRWI_W , F(Narrow) , 22 ), // #747
+ INST(Uqxtn2_v , ISimdVV , (0b0110111000100001010010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 23 ), // #748
+ INST(Urecpe_v , ISimdVV , (0b0000111010100001110010, kVO_V_S) , kRWI_W , 0 , 24 ), // #749
+ INST(Urhadd_v , ISimdVVV , (0b0010111000100000000101, kVO_V_BHS) , kRWI_W , 0 , 58 ), // #750
+ INST(Urshl_v , SimdShift , (0b0010111000100000010101, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 32 ), // #751
+ INST(Urshr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001001, 1, kVO_V_Any) , kRWI_W , 0 , 33 ), // #752
+ INST(Ursqrte_v , ISimdVV , (0b0010111010100001110010, kVO_V_S) , kRWI_W , 0 , 25 ), // #753
+ INST(Ursra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000001101, 1, kVO_V_Any) , kRWI_X , 0 , 34 ), // #754
+ INST(Usdot_v , SimdDot , (0b0000111010000000100111, 0b0000111110000000111100, kET_S, kET_B, kET_4B) , kRWI_X , 0 , 4 ), // #755
+ INST(Ushl_v , SimdShift , (0b0010111000100000010001, 0b0000000000000000000000, 0, kVO_V_Any) , kRWI_W , 0 , 35 ), // #756
+ INST(Ushll_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000101001, 0, kVO_V_B8H4S2) , kRWI_W , F(Long) , 36 ), // #757
+ INST(Ushll2_v , SimdShift , (0b0000000000000000000000, 0b0110111100000000101001, 0, kVO_V_B16H8S4) , kRWI_W , F(Long) , 37 ), // #758
+ INST(Ushr_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000001, 1, kVO_V_Any) , kRWI_W , 0 , 38 ), // #759
+ INST(Usmmla_v , ISimdVVVx , (0b0100111010000000101011, kOp_V4S, kOp_V16B, kOp_V16B) , kRWI_X , 0 , 16 ), // #760
+ INST(Usqadd_v , ISimdVV , (0b0010111000100000001110, kVO_SV_Any) , kRWI_X , 0 , 26 ), // #761
+ INST(Usra_v , SimdShift , (0b0000000000000000000000, 0b0010111100000000000101, 1, kVO_V_Any) , kRWI_X , 0 , 39 ), // #762
+ INST(Usubl_v , ISimdVVV , (0b0010111000100000001000, kVO_V_B8H4S2) , kRWI_W , F(Long) , 59 ), // #763
+ INST(Usubl2_v , ISimdVVV , (0b0110111000100000001000, kVO_V_B16H8S4) , kRWI_W , F(Long) , 60 ), // #764
+ INST(Usubw_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B8H4S2) , kRWI_W , 0 , 6 ), // #765
+ INST(Usubw2_v , ISimdWWV , (0b0010111000100000001100, kVO_V_B16H8S4) , kRWI_W , 0 , 7 ), // #766
+ INST(Uxtl_v , SimdSxtlUxtl , (0b0010111100000000101001, kVO_V_B8H4S2) , kRWI_W , F(Long) , 2 ), // #767
+ INST(Uxtl2_v , SimdSxtlUxtl , (0b0110111100000000101001, kVO_V_B16H8S4) , kRWI_W , F(Long) , 3 ), // #768
+ INST(Uzp1_v , ISimdVVV , (0b0000111000000000000110, kVO_V_BHS_D2) , kRWI_W , 0 , 61 ), // #769
+ INST(Uzp2_v , ISimdVVV , (0b0000111000000000010110, kVO_V_BHS_D2) , kRWI_W , 0 , 62 ), // #770
+ INST(Xar_v , ISimdVVVI , (0b1100111001100000100011, kVO_V_D2, 6, 10, 0) , kRWI_W , 0 , 1 ), // #771
+ INST(Xtn_v , ISimdVV , (0b0000111000100001001010, kVO_V_B8H4S2) , kRWI_W , F(Narrow) , 27 ), // #772
+ INST(Xtn2_v , ISimdVV , (0b0100111000100001001010, kVO_V_B16H8S4) , kRWI_X , F(Narrow) , 28 ), // #773
+ INST(Zip1_v , ISimdVVV , (0b0000111000000000001110, kVO_V_BHS_D2) , kRWI_W , 0 , 63 ), // #774
+ INST(Zip2_v , ISimdVVV , (0b0000111000000000011110, kVO_V_BHS_D2) , kRWI_W , 0 , 64 ) // #775
// ${InstInfo:End}
};
@@ -1070,8 +1078,9 @@ const BaseBranchReg baseBranchReg[3] = {
{ 0b11010110010111110000000000000000 } // ret
};
-const BaseBranchRel baseBranchRel[2] = {
+const BaseBranchRel baseBranchRel[3] = {
{ 0b00010100000000000000000000000000 }, // b
+ { 0b00010100000000000000000000010000 }, // bc
{ 0b10010100000000000000000000000000 } // bl
};
@@ -1157,6 +1166,13 @@ const BaseLogical baseLogical[8] = {
{ 0b0101010000, 0b01100100, 0 } // orr
};
+const BaseMinMax baseMinMax[4] = {
+ { 0b00011010110000000110000000000000, 0b00010001110000000000000000000000 }, // smax
+ { 0b00011010110000000110100000000000, 0b00010001110010000000000000000000 }, // smin
+ { 0b00011010110000000110010000000000, 0b00010001110001000000000000000000 }, // umax
+ { 0b00011010110000000110110000000000, 0b00010001110011000000000000000000 } // umin
+};
+
const BaseMovKNZ baseMovKNZ[3] = {
{ 0b01110010100000000000000000000000 }, // movk
{ 0b00010010100000000000000000000000 }, // movn
@@ -1169,7 +1185,7 @@ const BaseMvnNeg baseMvnNeg[3] = {
{ 0b01101011000000000000001111100000 } // negs
};
-const BaseOp baseOp[23] = {
+const BaseOp baseOp[24] = {
{ 0b11010101000000110010000110011111 }, // autia1716
{ 0b11010101000000110010001110111111 }, // autiasp
{ 0b11010101000000110010001110011111 }, // autiaz
@@ -1178,6 +1194,7 @@ const BaseOp baseOp[23] = {
{ 0b11010101000000110010001111011111 }, // autibz
{ 0b11010101000000000100000001011111 }, // axflag
{ 0b11010101000000000100000000011111 }, // cfinv
+ { 0b11010101000000110010001011011111 }, // clrbhb
{ 0b11010101000000110010001010011111 }, // csdb
{ 0b11010101000000110010000011011111 }, // dgh
{ 0b11010110101111110000001111100000 }, // drps
@@ -1195,8 +1212,9 @@ const BaseOp baseOp[23] = {
{ 0b11010101000000110010000000111111 } // yield
};
-const BaseOpImm baseOpImm[14] = {
+const BaseOpImm baseOpImm[15] = {
{ 0b11010100001000000000000000000000, 16, 5 }, // brk
+ { 0b11010101000000110010010000011111, 2, 6 }, // bti
{ 0b11010101000000110011000001011111, 4, 8 }, // clrex
{ 0b11010100101000000000000000000001, 16, 5 }, // dcps1
{ 0b11010100101000000000000000000010, 16, 5 }, // dcps2
@@ -1212,6 +1230,10 @@ const BaseOpImm baseOpImm[14] = {
{ 0b00000000000000000000000000000000, 16, 0 } // udf
};
+const BaseOpX16 baseOpX16[1] = {
+ { 0b11010101000000110010010100011111 } // chkfeat
+};
+
const BasePrfm basePrfm[1] = {
{ 0b11111000101, 0b1111100110, 0b11111000100, 0b11011000 } // prfm
};
@@ -1284,7 +1306,8 @@ const BaseRM_SImm9 baseRM_SImm9[23] = {
{ 0b1101100101100000000010, 0b1101100101100000000001, kX , kSP, 0, 4 } // stzg
};
-const BaseRR baseRR[15] = {
+const BaseRR baseRR[18] = {
+ { 0b01011010110000000010000000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // abs
{ 0b11011010110000010001100000000000, kX, kZR, 0, kX, kSP, 5, true }, // autda
{ 0b11011010110000010001110000000000, kX, kZR, 0, kX, kSP, 5, true }, // autdb
{ 0b11011010110000010001000000000000, kX, kZR, 0, kX, kSP, 5, true }, // autia
@@ -1292,6 +1315,8 @@ const BaseRR baseRR[15] = {
{ 0b01011010110000000001010000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // cls
{ 0b01011010110000000001000000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // clz
{ 0b10111010110000000000000000011111, kX, kSP, 5, kX, kSP, 16, true }, // cmpp
+ { 0b01011010110000000001110000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // cnt
+ { 0b01011010110000000001100000000000, kWX, kZR, 0, kWX, kZR, 5, true }, // ctz
{ 0b01011010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true }, // ngc
{ 0b01111010000000000000001111100000, kWX, kZR, 0, kWX, kZR, 16, true }, // ngcs
{ 0b11011010110000010000100000000000, kX, kZR, 0, kX, kSP, 5, true }, // pacda
@@ -1851,8 +1876,8 @@ const InstDB::CommonInfo InstDB::commonData[] = {
#ifndef ASMJIT_NO_TEXT
// ${NameData:Begin}
// ------------------- Automatically generated, do not edit -------------------
-const InstNameIndex InstDB::instNameIndex = {{
- { Inst::kIdAdc , Inst::kIdAnd_v + 1 },
+const InstNameIndex InstDB::_inst_name_index = {{
+ { Inst::kIdAbs , Inst::kIdAnd_v + 1 },
{ Inst::kIdB , Inst::kIdBsl_v + 1 },
{ Inst::kIdCas , Inst::kIdCnt_v + 1 },
{ Inst::kIdDc , Inst::kIdDup_v + 1 },
@@ -1880,15 +1905,24 @@ const InstNameIndex InstDB::instNameIndex = {{
{ Inst::kIdZip1_v , Inst::kIdZip2_v + 1 }
}, uint16_t(9)};
-const char InstDB::_instNameStringTable[] =
- "autia1716autibldsmaxalhldsminalldumaxallduminalsha256su0sha512su1sm3partwsqrshru"
- "nldaddalldclralldeoralldsetallbstsmaxstsminstumaxstuminfrint32z64x64zh2sqdmlalsl"
- "2sqdmulsqrdmlaulhn2sqshruuqrshrspcrc32cstaddstclrsteorstsetxpaclbfcvtbfmlaltfcvt"
- "xfjcvtzfmaxnmfminnmfrsqrraddrsubsha1sm3tt12a2bsm4ekeysqxtuuqshrursqrsetfrev8";
-
-
-const uint32_t InstDB::_instNameIndexTable[] = {
+const char InstDB::_inst_name_string_table[] =
+ "\x61\x75\x74\x69\x61\x31\x37\x31\x36\x61\x75\x74\x69\x62\x6C\x64\x73\x6D\x61\x78\x61\x6C\x68\x6C\x64\x73\x6D\x69\x6E"
+ "\x61\x6C\x6C\x64\x75\x6D\x61\x78\x61\x6C\x6C\x64\x75\x6D\x69\x6E\x61\x6C\x73\x68\x61\x32\x35\x36\x73\x75\x30\x73\x68"
+ "\x61\x35\x31\x32\x73\x75\x31\x73\x6D\x33\x70\x61\x72\x74\x77\x73\x71\x72\x73\x68\x72\x75\x6E\x6C\x64\x61\x64\x64\x61"
+ "\x6C\x6C\x64\x63\x6C\x72\x61\x6C\x6C\x64\x65\x6F\x72\x61\x6C\x6C\x64\x73\x65\x74\x61\x6C\x6C\x62\x73\x74\x73\x6D\x61"
+ "\x78\x73\x74\x73\x6D\x69\x6E\x73\x74\x75\x6D\x61\x78\x73\x74\x75\x6D\x69\x6E\x66\x72\x69\x6E\x74\x33\x32\x7A\x36\x34"
+ "\x78\x36\x34\x7A\x68\x32\x73\x71\x64\x6D\x6C\x61\x6C\x73\x6C\x32\x73\x71\x64\x6D\x75\x6C\x73\x71\x72\x64\x6D\x6C\x61"
+ "\x75\x6C\x68\x6E\x32\x73\x71\x73\x68\x72\x75\x75\x71\x72\x73\x68\x72\x73\x70\x63\x68\x6B\x66\x65\x61\x63\x72\x63\x33"
+ "\x32\x63\x73\x74\x61\x64\x64\x73\x74\x63\x6C\x72\x73\x74\x65\x6F\x72\x73\x74\x73\x65\x74\x78\x70\x61\x63\x6C\x62\x66"
+ "\x63\x76\x74\x62\x66\x6D\x6C\x61\x6C\x74\x66\x63\x76\x74\x78\x66\x6A\x63\x76\x74\x7A\x66\x6D\x61\x78\x6E\x6D\x66\x6D"
+ "\x69\x6E\x6E\x6D\x66\x72\x73\x71\x72\x72\x61\x64\x64\x72\x73\x75\x62\x73\x68\x61\x31\x73\x6D\x33\x74\x74\x31\x32\x61"
+ "\x32\x62\x73\x6D\x34\x65\x6B\x65\x79\x73\x71\x78\x74\x75\x75\x71\x73\x68\x72\x75\x72\x73\x71\x72\x73\x65\x74\x66\x72"
+ "\x65\x76\x38";
+
+
+const uint32_t InstDB::_inst_name_index_table[] = {
0x80000000, // Small ''.
+ 0x80004C41, // Small 'abs'.
0x80000C81, // Small 'adc'.
0x80098C81, // Small 'adcs'.
0x80001081, // Small 'add'.
@@ -1917,6 +1951,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x85A4D2A1, // Small 'autizb'.
0x8E161B01, // Small 'axflag'.
0x80000002, // Small 'b'.
+ 0x80000062, // Small 'bc'.
0x80000CC2, // Small 'bfc'.
0x800024C2, // Small 'bfi'.
0x800034C2, // Small 'bfm'.
@@ -1927,6 +1962,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80004982, // Small 'blr'.
0x80000242, // Small 'br'.
0x80002E42, // Small 'brk'.
+ 0x80002682, // Small 'bti'.
0x80004C23, // Small 'cas'.
0x8000CC23, // Small 'casa'.
0x8020CC23, // Small 'casab'.
@@ -1948,8 +1984,10 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80073463, // Small 'ccmn'.
0x80083463, // Small 'ccmp'.
0x816724C3, // Small 'cfinv'.
+ 0x100260C1, // Large 'chkfea|t'.
0x8001B923, // Small 'cinc'.
0x800B3923, // Small 'cinv'.
+ 0x84814983, // Small 'clrbhb'.
0x8182C983, // Small 'clrex'.
0x80004D83, // Small 'cls'.
0x80006983, // Small 'clz'.
@@ -1957,11 +1995,12 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x800041A3, // Small 'cmp'.
0x800841A3, // Small 'cmpp'.
0x800395C3, // Small 'cneg'.
+ 0x800051C3, // Small 'cnt'.
0x85DF0E43, // Small 'crc32b'.
- 0x100D60C1, // Large 'crc32c|b'.
- 0x101660C1, // Large 'crc32c|h'.
- 0x104860C1, // Large 'crc32c|w'.
- 0x101360C1, // Large 'crc32c|x'.
+ 0x100D60C7, // Large 'crc32c|b'.
+ 0x101660C7, // Large 'crc32c|h'.
+ 0x104860C7, // Large 'crc32c|w'.
+ 0x101360C7, // Large 'crc32c|x'.
0x91DF0E43, // Small 'crc32h'.
0xAFDF0E43, // Small 'crc32w'.
0xB1DF0E43, // Small 'crc32x'.
@@ -1972,6 +2011,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80372663, // Small 'csinc'.
0x81672663, // Small 'csinv'.
0x8072BA63, // Small 'csneg'.
+ 0x80006A83, // Small 'ctz'.
0x80000064, // Small 'dc'.
0x81C9C064, // Small 'dcps1'.
0x81D9C064, // Small 'dcps2'.
@@ -2158,9 +2198,9 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x800A2452, // Small 'rbit'.
0x800050B2, // Small 'ret'.
0x800058B2, // Small 'rev'.
- 0x20073138, // Large 'rev|16'.
+ 0x2007313E, // Large 'rev|16'.
0x81DF58B2, // Small 'rev32'.
- 0x208F3138, // Large 'rev|64'.
+ 0x208F313E, // Large 'rev|64'.
0x800049F2, // Small 'ror'.
0x800B49F2, // Small 'rorv'.
0x80000C53, // Small 'sbc'.
@@ -2169,12 +2209,14 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80069853, // Small 'sbfm'.
0x800C1853, // Small 'sbfx'.
0x800B2493, // Small 'sdiv'.
- 0x113B4134, // Large 'setf|8'.
- 0x20074134, // Large 'setf|16'.
+ 0x1141413A, // Large 'setf|8'.
+ 0x2007413A, // Large 'setf|16'.
0x800058B3, // Small 'sev'.
0x800658B3, // Small 'sevl'.
0x984205B3, // Small 'smaddl'.
+ 0x800C05B3, // Small 'smax'.
0x80000DB3, // Small 'smc'.
+ 0x800725B3, // Small 'smin'.
0x9872B9B3, // Small 'smnegl'.
0x982ACDB3, // Small 'smsubl'.
0x808655B3, // Small 'smulh'.
@@ -2184,21 +2226,21 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80420693, // Small 'stadd'.
0x98420693, // Small 'staddl'.
0x84420693, // Small 'staddb'.
- 0x206D50C7, // Large 'stadd|lb'.
+ 0x206D50CD, // Large 'stadd|lb'.
0x90420693, // Small 'staddh'.
- 0x201550C7, // Large 'stadd|lh'.
+ 0x201550CD, // Large 'stadd|lh'.
0x81260E93, // Small 'stclr'.
0x99260E93, // Small 'stclrl'.
0x85260E93, // Small 'stclrb'.
- 0x206D50CC, // Large 'stclr|lb'.
+ 0x206D50D2, // Large 'stclr|lb'.
0x91260E93, // Small 'stclrh'.
- 0x201550CC, // Large 'stclr|lh'.
+ 0x201550D2, // Large 'stclr|lh'.
0x81279693, // Small 'steor'.
0x99279693, // Small 'steorl'.
0x85279693, // Small 'steorb'.
- 0x206D50D1, // Large 'steor|lb'.
+ 0x206D50D7, // Large 'steor|lb'.
0x91279693, // Small 'steorh'.
- 0x201550D1, // Large 'steor|lh'.
+ 0x201550D7, // Large 'steor|lh'.
0x80001E93, // Small 'stg'.
0x80069E93, // Small 'stgm'.
0x80081E93, // Small 'stgp'.
@@ -2220,9 +2262,9 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x8142CE93, // Small 'stset'.
0x9942CE93, // Small 'stsetl'.
0x8542CE93, // Small 'stsetb'.
- 0x206D50D6, // Large 'stset|lb'.
+ 0x206D50DC, // Large 'stset|lb'.
0x9142CE93, // Small 'stseth'.
- 0x201550D6, // Large 'stset|lh'.
+ 0x201550DC, // Large 'stset|lh'.
0xB016CE93, // Small 'stsmax'.
0x100E606F, // Large 'stsmax|l'.
0x100D606F, // Large 'stsmax|b'.
@@ -2292,6 +2334,8 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80001895, // Small 'udf'.
0x800B2495, // Small 'udiv'.
0x984205B5, // Small 'umaddl'.
+ 0x800C05B5, // Small 'umax'.
+ 0x800725B5, // Small 'umin'.
0x9872B9B5, // Small 'umnegl'.
0x80C655B5, // Small 'umull'.
0x808655B5, // Small 'umulh'.
@@ -2303,7 +2347,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x8E161838, // Small 'xaflag'.
0x80418618, // Small 'xpacd'.
0x80918618, // Small 'xpaci'.
- 0x208850DB, // Large 'xpacl|ri'.
+ 0x208850E1, // Large 'xpacl|ri'.
0x80461539, // Small 'yield'.
0x80004C41, // Small 'abs'.
0x80001081, // Small 'add'.
@@ -2319,10 +2363,10 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x800C0462, // Small 'bcax'.
0x814B0CC2, // Small 'bfcvt'.
0x9D4B0CC2, // Small 'bfcvtn'.
- 0x20B150E0, // Large 'bfcvt|n2'.
+ 0x20B150E6, // Large 'bfcvt|n2'.
0x814790C2, // Small 'bfdot'.
- 0x206D50E5, // Large 'bfmla|lb'.
- 0x20EA50E5, // Large 'bfmla|lt'.
+ 0x206D50EB, // Large 'bfmla|lb'.
+ 0x20F050EB, // Large 'bfmla|lt'.
0x82C6B4C2, // Small 'bfmmla'.
0x80000D22, // Small 'bic'.
0x80001922, // Small 'bif'.
@@ -2375,22 +2419,22 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0xA70A5866, // Small 'fcvtps'.
0xAB0A5866, // Small 'fcvtpu'.
0x9D8A5866, // Small 'fcvtxn'.
- 0x20B150EC, // Large 'fcvtx|n2'.
+ 0x20B150F2, // Large 'fcvtx|n2'.
0xA7AA5866, // Small 'fcvtzs'.
0xABAA5866, // Small 'fcvtzu'.
0x800B2486, // Small 'fdiv'.
- 0x101060F1, // Large 'fjcvtz|s'.
+ 0x101060F7, // Large 'fjcvtz|s'.
0x804205A6, // Small 'fmadd'.
0x800C05A6, // Small 'fmax'.
0x9AEC05A6, // Small 'fmaxnm'.
- 0x104460F7, // Large 'fmaxnm|p'.
- 0x10E360F7, // Large 'fmaxnm|v'.
+ 0x104460FD, // Large 'fmaxnm|p'.
+ 0x10E960FD, // Large 'fmaxnm|v'.
0x810C05A6, // Small 'fmaxp'.
0x816C05A6, // Small 'fmaxv'.
0x800725A6, // Small 'fmin'.
0x9AE725A6, // Small 'fminnm'.
- 0x104460FD, // Large 'fminnm|p'.
- 0x10E360FD, // Large 'fminnm|v'.
+ 0x10446103, // Large 'fminnm|p'.
+ 0x10E96103, // Large 'fminnm|v'.
0x810725A6, // Small 'fminp'.
0x816725A6, // Small 'fminv'.
0x8000B1A6, // Small 'fmla'.
@@ -2421,8 +2465,8 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0xA1472646, // Small 'frintp'.
0xB1472646, // Small 'frintx'.
0xB5472646, // Small 'frintz'.
- 0x20D25103, // Large 'frsqr|te'.
- 0x20705103, // Large 'frsqr|ts'.
+ 0x20D85109, // Large 'frsqr|te'.
+ 0x20705109, // Large 'frsqr|ts'.
0x81494666, // Small 'fsqrt'.
0x80015666, // Small 'fsub'.
0x80004DC9, // Small 'ins'.
@@ -2453,16 +2497,16 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80C655B0, // Small 'pmull'.
0xBAC655B0, // Small 'pmull2'.
0x9C821032, // Small 'raddhn'.
- 0x30B04108, // Large 'radd|hn2'.
+ 0x30B0410E, // Large 'radd|hn2'.
0x800E6032, // Small 'rax1'.
0x800A2452, // Small 'rbit'.
- 0x20073138, // Large 'rev|16'.
+ 0x2007313E, // Large 'rev|16'.
0x81DF58B2, // Small 'rev32'.
- 0x208F3138, // Large 'rev|64'.
+ 0x208F313E, // Large 'rev|64'.
0x80E92272, // Small 'rshrn'.
0xBAE92272, // Small 'rshrn2'.
0x9C815672, // Small 'rsubhn'.
- 0x30B0410C, // Large 'rsub|hn2'.
+ 0x30B04112, // Large 'rsub|hn2'.
0x80008833, // Small 'saba'.
0x80C08833, // Small 'sabal'.
0xBAC08833, // Small 'sabal2'.
@@ -2482,8 +2526,8 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x808E0513, // Small 'sha1h'.
0x80DE0513, // Small 'sha1m'.
0x810E0513, // Small 'sha1p'.
- 0x30354110, // Large 'sha1|su0'.
- 0x303E4110, // Large 'sha1|su1'.
+ 0x30354116, // Large 'sha1|su0'.
+ 0x303E4116, // Large 'sha1|su1'.
0x1016602F, // Large 'sha256|h'.
0x2095602F, // Large 'sha256|h2'.
0x0000902F, // Large 'sha256su0'.
@@ -2503,12 +2547,12 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x10058041, // Large 'sm3partw|1'.
0x10328041, // Large 'sm3partw|2'.
0xB939F9B3, // Small 'sm3ss1'.
- 0x10006114, // Large 'sm3tt1|a'.
- 0x100D6114, // Large 'sm3tt1|b'.
- 0x211A5114, // Large 'sm3tt|2a'.
- 0x211C5114, // Large 'sm3tt|2b'.
+ 0x1000611A, // Large 'sm3tt1|a'.
+ 0x100D611A, // Large 'sm3tt1|b'.
+ 0x2120511A, // Large 'sm3tt|2a'.
+ 0x2122511A, // Large 'sm3tt|2b'.
0x8002FDB3, // Small 'sm4e'.
- 0x0000711E, // Large 'sm4ekey'.
+ 0x00007124, // Large 'sm4ekey'.
0x800C05B3, // Small 'smax'.
0x810C05B3, // Small 'smaxp'.
0x816C05B3, // Small 'smaxv'.
@@ -2551,7 +2595,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x80EA6233, // Small 'sqxtn'.
0xBAEA6233, // Small 'sqxtn2'.
0x9D5A6233, // Small 'sqxtun'.
- 0x20B15125, // Large 'sqxtu|n2'.
+ 0x20B1512B, // Large 'sqxtu|n2'.
0x8840A253, // Small 'srhadd'.
0x80002653, // Small 'sri'.
0x80C44E53, // Small 'srshl'.
@@ -2622,7 +2666,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x20B160B9, // Large 'uqrshr|n2'.
0x80C44E35, // Small 'uqshl'.
0x9D244E35, // Small 'uqshrn'.
- 0x20B1512A, // Large 'uqshr|n2'.
+ 0x20B15130, // Large 'uqshr|n2'.
0x802ACE35, // Small 'uqsub'.
0x80EA6235, // Small 'uqxtn'.
0xBAEA6235, // Small 'uqxtn2'.
@@ -2630,7 +2674,7 @@ const uint32_t InstDB::_instNameIndexTable[] = {
0x8840A255, // Small 'urhadd'.
0x80C44E55, // Small 'urshl'.
0x81244E55, // Small 'urshr'.
- 0x20D2512F, // Large 'ursqr|te'.
+ 0x20D85135, // Large 'ursqr|te'.
0x80194E55, // Small 'ursra'.
0x81479275, // Small 'usdot'.
0x80062275, // Small 'ushl'.
diff --git a/3rdparty/asmjit/asmjit/arm/a64instdb.h b/3rdparty/asmjit/asmjit/arm/a64instdb.h
new file mode 100644
index 00000000000..e044aca9a92
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64instdb.h
@@ -0,0 +1,77 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64INSTDB_H_INCLUDED
+#define ASMJIT_ARM_A64INSTDB_H_INCLUDED
+
+#include <asmjit/arm/a64globals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! Instruction database (AArch64).
+namespace InstDB {
+
+//! Instruction flags.
+enum InstFlags : uint32_t {
+ //! The instruction provides conditional execution.
+ kInstFlagCond = 0x00000001u,
+ //! SIMD instruction that processes elements in pairs.
+ kInstFlagPair = 0x00000002u,
+ //! SIMD instruction that does widening (Long).
+ kInstFlagLong = 0x00000004u,
+ //! SIMD instruction that does narrowing (Narrow).
+ kInstFlagNarrow = 0x00000008u,
+ //! SIMD element access of half-words can only be used with v0..15.
+ kInstFlagVH0_15 = 0x00000010u,
+
+ //! Instruction uses consecutive registers if the number of operands is greater than 2.
+ kInstFlagConsecutive = 0x00000080u
+};
+
+//! Instruction information (AArch64).
+struct InstInfo {
+ //! Instruction encoding type.
+ uint32_t _encoding : 8;
+ //! Index to data specific to each encoding type.
+ uint32_t _encoding_data_index : 8;
+ uint32_t _reserved : 16;
+
+ uint16_t _rw_info_index;
+ uint16_t _flags;
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t rw_info_index() const noexcept { return _rw_info_index; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t flags() const noexcept { return _flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(uint32_t flag) const { return (_flags & flag) != 0; }
+
+ //! \}
+};
+
+ASMJIT_VARAPI const InstInfo _inst_info_table[];
+
+[[nodiscard]]
+static ASMJIT_INLINE const InstInfo& inst_info_by_id(InstId inst_id) noexcept {
+ inst_id &= uint32_t(InstIdParts::kRealId);
+ ASMJIT_ASSERT(Inst::is_defined_id(inst_id));
+ return _inst_info_table[inst_id];
+}
+
+} // {InstDB}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64INSTDB_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64instdb_p.h b/3rdparty/asmjit/asmjit/arm/a64instdb_p.h
new file mode 100644
index 00000000000..b4b45283aab
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64instdb_p.h
@@ -0,0 +1,885 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
+#define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
+
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/instdb_p.h>
+#include <asmjit/arm/a64instdb.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+namespace InstDB {
+
+// a64::InstDB - Constants Used by Instructions
+// ============================================
+
+// GP register types supported by base instructions.
+static constexpr uint32_t kW = 0x1;
+static constexpr uint32_t kX = 0x2;
+static constexpr uint32_t kWX = 0x3;
+
+// GP high register IDs supported by the instruction.
+static constexpr uint32_t kZR = Gp::kIdZr;
+static constexpr uint32_t kSP = Gp::kIdSp;
+
+// a64::InstDB - RWInfo
+// ====================
+
+enum RWInfoType : uint32_t {
+ kRWI_R,
+ kRWI_RW,
+ kRWI_RX,
+ kRWI_RRW,
+ kRWI_RWX,
+ kRWI_W,
+ kRWI_WRW,
+ kRWI_WRX,
+ kRWI_WRRW,
+ kRWI_WRRX,
+ kRWI_WW,
+ kRWI_X,
+ kRWI_XRX,
+ kRWI_XXRRX,
+
+ kRWI_LDn,
+ kRWI_STn,
+
+ kRWI_SpecialStart = kRWI_LDn
+};
+
+// a64::InstDB - ElementType
+// =========================
+
+enum InstElementType : uint8_t {
+ kET_None = uint8_t(VecElementType::kNone),
+ kET_B = uint8_t(VecElementType::kB),
+ kET_H = uint8_t(VecElementType::kH),
+ kET_S = uint8_t(VecElementType::kS),
+ kET_D = uint8_t(VecElementType::kD),
+ kET_2H = uint8_t(VecElementType::kH2),
+ kET_4B = uint8_t(VecElementType::kB4)
+};
+
+// a64::InstDB - GpType
+// ====================
+
+enum GpType : uint8_t {
+ kGp_W,
+ kGp_X,
+ kGp_X_SP
+};
+
+// a64::InstDB - OPSig
+// ===================
+
+enum kOpSignature : uint32_t {
+ kOp_GpW = RegTraits<RegType::kGp32>::kSignature,
+ kOp_GpX = RegTraits<RegType::kGp64>::kSignature,
+ kOp_B = RegTraits<RegType::kVec8>::kSignature,
+ kOp_H = RegTraits<RegType::kVec16>::kSignature,
+ kOp_S = RegTraits<RegType::kVec32>::kSignature,
+ kOp_D = RegTraits<RegType::kVec64>::kSignature,
+ kOp_Q = RegTraits<RegType::kVec128>::kSignature,
+
+ kOp_V8B = kOp_D | Vec::kSignatureElementB,
+ kOp_V4H = kOp_D | Vec::kSignatureElementH,
+ kOp_V2S = kOp_D | Vec::kSignatureElementS,
+
+ kOp_V16B = kOp_Q | Vec::kSignatureElementB,
+ kOp_V8H = kOp_Q | Vec::kSignatureElementH,
+ kOp_V4S = kOp_Q | Vec::kSignatureElementS,
+ kOp_V2D = kOp_Q | Vec::kSignatureElementD
+};
+
+// a64::InstDB - HFConv
+// ====================
+
+enum kHFConv : uint32_t {
+ //! FP16 version of the instruction is not available.
+ kHF_N,
+
+ //! Doesn't do any change to the opcode.
+ kHF_0,
+
+ kHF_A,
+ kHF_B,
+ kHF_C,
+ kHF_D,
+
+ kHF_Count
+};
+
+// a64::InstDB - VOType
+// ====================
+
+//! Vector operand type combinations used by FP&SIMD instructions.
+enum VOType : uint32_t {
+ kVO_V_B,
+ kVO_V_BH,
+ kVO_V_BH_4S,
+ kVO_V_BHS,
+ kVO_V_BHS_D2,
+ kVO_V_HS,
+ kVO_V_S,
+
+ kVO_V_B8H4,
+ kVO_V_B8H4S2,
+ kVO_V_B8D1,
+ kVO_V_H4S2,
+
+ kVO_V_B16,
+ kVO_V_B16H8,
+ kVO_V_B16H8S4,
+ kVO_V_B16D2,
+ kVO_V_H8S4,
+ kVO_V_S4,
+ kVO_V_D2,
+
+ kVO_SV_BHS,
+ kVO_SV_B8H4S2,
+ kVO_SV_HS,
+ kVO_V_Any,
+ kVO_SV_Any,
+
+ kVO_Count
+};
+
+// a64::InstDB - EncodingId
+// ========================
+
+// ${EncodingId:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+enum EncodingId : uint32_t {
+ kEncodingNone = 0,
+ kEncodingBaseAddSub,
+ kEncodingBaseAdr,
+ kEncodingBaseAtDcIcTlbi,
+ kEncodingBaseAtomicCasp,
+ kEncodingBaseAtomicOp,
+ kEncodingBaseAtomicSt,
+ kEncodingBaseBfc,
+ kEncodingBaseBfi,
+ kEncodingBaseBfm,
+ kEncodingBaseBfx,
+ kEncodingBaseBranchCmp,
+ kEncodingBaseBranchReg,
+ kEncodingBaseBranchRel,
+ kEncodingBaseBranchTst,
+ kEncodingBaseCCmp,
+ kEncodingBaseCInc,
+ kEncodingBaseCSel,
+ kEncodingBaseCSet,
+ kEncodingBaseCmpCmn,
+ kEncodingBaseExtend,
+ kEncodingBaseExtract,
+ kEncodingBaseLdSt,
+ kEncodingBaseLdpStp,
+ kEncodingBaseLdxp,
+ kEncodingBaseLogical,
+ kEncodingBaseMinMax,
+ kEncodingBaseMov,
+ kEncodingBaseMovKNZ,
+ kEncodingBaseMrs,
+ kEncodingBaseMsr,
+ kEncodingBaseMvnNeg,
+ kEncodingBaseOp,
+ kEncodingBaseOpImm,
+ kEncodingBaseOpX16,
+ kEncodingBasePrfm,
+ kEncodingBaseR,
+ kEncodingBaseRM_NoImm,
+ kEncodingBaseRM_SImm10,
+ kEncodingBaseRM_SImm9,
+ kEncodingBaseRR,
+ kEncodingBaseRRII,
+ kEncodingBaseRRR,
+ kEncodingBaseRRRR,
+ kEncodingBaseRev,
+ kEncodingBaseShift,
+ kEncodingBaseStx,
+ kEncodingBaseStxp,
+ kEncodingBaseSys,
+ kEncodingBaseTst,
+ kEncodingFSimdPair,
+ kEncodingFSimdSV,
+ kEncodingFSimdVV,
+ kEncodingFSimdVVV,
+ kEncodingFSimdVVVV,
+ kEncodingFSimdVVVe,
+ kEncodingISimdPair,
+ kEncodingISimdSV,
+ kEncodingISimdVV,
+ kEncodingISimdVVV,
+ kEncodingISimdVVVI,
+ kEncodingISimdVVVV,
+ kEncodingISimdVVVVx,
+ kEncodingISimdVVVe,
+ kEncodingISimdVVVx,
+ kEncodingISimdVVx,
+ kEncodingISimdWWV,
+ kEncodingSimdBicOrr,
+ kEncodingSimdCmp,
+ kEncodingSimdDot,
+ kEncodingSimdDup,
+ kEncodingSimdFcadd,
+ kEncodingSimdFccmpFccmpe,
+ kEncodingSimdFcm,
+ kEncodingSimdFcmla,
+ kEncodingSimdFcmpFcmpe,
+ kEncodingSimdFcsel,
+ kEncodingSimdFcvt,
+ kEncodingSimdFcvtLN,
+ kEncodingSimdFcvtSV,
+ kEncodingSimdFmlal,
+ kEncodingSimdFmov,
+ kEncodingSimdIns,
+ kEncodingSimdLdNStN,
+ kEncodingSimdLdSt,
+ kEncodingSimdLdpStp,
+ kEncodingSimdLdurStur,
+ kEncodingSimdMov,
+ kEncodingSimdMoviMvni,
+ kEncodingSimdShift,
+ kEncodingSimdShiftES,
+ kEncodingSimdSm3tt,
+ kEncodingSimdSmovUmov,
+ kEncodingSimdSxtlUxtl,
+ kEncodingSimdTblTbx
+};
+// ----------------------------------------------------------------------------
+// ${EncodingId:End}
+
+// a64::InstDB::EncodingData
+// =========================
+
+namespace EncodingData {
+
+#define M_OPCODE(field, bits) \
+ uint32_t _##field : bits; \
+ ASMJIT_INLINE_CONSTEXPR uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); }
+
+struct BaseOp {
+ uint32_t opcode;
+};
+
+struct BaseOpX16 {
+ uint32_t opcode;
+};
+
+struct BaseOpImm {
+ uint32_t opcode;
+ uint16_t imm_bits;
+ uint16_t imm_offset;
+};
+
+struct BaseR {
+ uint32_t opcode;
+ uint32_t reg_type : 8;
+ uint32_t reg_hi_id : 8;
+ uint32_t r_shift : 8;
+};
+
+struct BaseRR {
+ uint32_t opcode;
+ uint32_t a_type : 2;
+ uint32_t a_hi_id : 6;
+ uint32_t a_shift : 5;
+ uint32_t b_type : 2;
+ uint32_t b_hi_id : 6;
+ uint32_t b_shift : 5;
+ uint32_t uniform : 1;
+};
+
+struct BaseRRR {
+ M_OPCODE(opcode, 22)
+ uint32_t a_type : 2;
+ uint32_t a_hi_id : 6;
+ uint32_t b_type : 2;
+ uint32_t b_hi_id : 6;
+ uint32_t c_type : 2;
+ uint32_t c_hi_id : 6;
+ uint32_t uniform : 1;
+};
+
+struct BaseRRRR {
+ M_OPCODE(opcode, 22)
+ uint32_t a_type : 2;
+ uint32_t a_hi_id : 6;
+ uint32_t b_type : 2;
+ uint32_t b_hi_id : 6;
+ uint32_t c_type : 2;
+ uint32_t c_hi_id : 6;
+ uint32_t d_type : 2;
+ uint32_t d_hi_id : 6;
+ uint32_t uniform : 1;
+};
+
+struct BaseRRII {
+ M_OPCODE(opcode, 22)
+ uint32_t a_type : 2;
+ uint32_t a_hi_id : 6;
+ uint32_t b_type : 2;
+ uint32_t b_hi_id : 6;
+ uint32_t a_imm_size : 6;
+ uint32_t a_imm_discard_lsb : 5;
+ uint32_t a_imm_offset : 5;
+ uint32_t b_imm_size : 6;
+ uint32_t b_imm_discard_lsb : 5;
+ uint32_t b_imm_offset : 5;
+};
+
+struct BaseAtDcIcTlbi {
+ uint32_t imm_verify_mask : 14;
+ uint32_t imm_verify_data : 14;
+ uint32_t mandatory_reg : 1;
+};
+
+struct BaseAdcSbc {
+ uint32_t opcode;
+};
+
+struct BaseMinMax {
+ uint32_t register_op;
+ uint32_t immediate_op;
+};
+
+struct BaseAddSub {
+ uint32_t shifted_op : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
+ uint32_t extended_op : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|Rd|
+ uint32_t immediate_op: 10; // sf|.......|Sh| Imm:12 |Rn|Rd|
+};
+
+struct BaseAdr {
+ M_OPCODE(opcode, 22)
+ OffsetType offset_type : 8;
+};
+
+struct BaseBfm {
+ uint32_t opcode; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
+};
+
+struct BaseCmpCmn {
+ uint32_t shifted_op : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
+ uint32_t extended_op : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|11111|
+ uint32_t immediate_op: 10; // sf|.......|Sh| Imm:12 |Rn|11111|
+};
+
+struct BaseExtend {
+ M_OPCODE(opcode, 22) // sf|........|N|......|......|Rn|Rd|
+ uint32_t reg_type : 2;
+ uint32_t u : 1;
+};
+
+struct BaseLogical {
+ uint32_t shifted_op : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
+ uint32_t immediate_op: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
+ uint32_t negate_imm : 1; // True if this is an operation that must negate IMM.
+};
+
+struct BaseMvnNeg {
+ uint32_t opcode;
+};
+
+struct BaseShift {
+ M_OPCODE(register_op, 22)
+ M_OPCODE(immediate_op, 22)
+ uint32_t ror : 2;
+};
+
+struct BaseTst {
+ uint32_t shifted_op : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
+ uint32_t immediate_op: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|11111|
+};
+
+struct BaseRM_NoImm {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t reg_hi_id : 6;
+ uint32_t x_offset : 5;
+};
+
+struct BaseRM_SImm9 {
+ M_OPCODE(offset_op, 22)
+ M_OPCODE(pre_post_op, 22)
+ uint32_t reg_type : 2;
+ uint32_t reg_hi_id : 6;
+ uint32_t x_offset : 5;
+ uint32_t imm_shift : 4;
+};
+
+struct BaseRM_SImm10 {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t reg_hi_id : 6;
+ uint32_t x_offset : 5;
+ uint32_t imm_shift : 4;
+};
+
+struct BasePrfm {
+ uint32_t register_op : 11;
+ uint32_t s_offset_op : 10;
+ uint32_t u_offset_op : 11;
+ uint32_t literal_op;
+};
+
+struct BaseLdSt {
+ uint32_t u_offset_op : 10;
+ uint32_t pre_post_op : 11;
+ uint32_t register_op : 11;
+ uint32_t literal_op : 8;
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+ uint32_t u_offset_shift : 3;
+ uint32_t u_alt_inst_id : 14;
+};
+
+struct BaseLdpStp {
+ uint32_t offset_op : 10;
+ uint32_t pre_post_op : 10;
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+ uint32_t offset_shift : 3;
+};
+
+struct BaseStx {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+};
+
+struct BaseLdxp {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+};
+
+struct BaseStxp {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+};
+
+struct BaseAtomicOp {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+ uint32_t zr : 1;
+};
+
+struct BaseAtomicSt {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+};
+
+struct BaseAtomicCasp {
+ M_OPCODE(opcode, 22)
+ uint32_t reg_type : 2;
+ uint32_t x_offset : 5;
+};
+
+using BaseBranchReg = BaseOp;
+using BaseBranchRel = BaseOp;
+using BaseBranchCmp = BaseOp;
+using BaseBranchTst = BaseOp;
+using BaseExtract = BaseOp;
+using BaseBfc = BaseOp;
+using BaseBfi = BaseOp;
+using BaseBfx = BaseOp;
+using BaseCCmp = BaseOp;
+using BaseCInc = BaseOp;
+using BaseCSet = BaseOp;
+using BaseCSel = BaseOp;
+using BaseMovKNZ = BaseOp;
+using BaseMull = BaseOp;
+
+struct FSimdGeneric {
+ uint32_t _scalar_op : 28;
+ uint32_t _scalarHf : 4;
+ uint32_t _vector_op : 28;
+ uint32_t _vectorHf : 4;
+
+ constexpr uint32_t scalar_op() const noexcept { return uint32_t(_scalar_op) << 10; }
+ constexpr uint32_t vector_op() const noexcept { return uint32_t(_vector_op) << 10; }
+ constexpr uint32_t scalar_hf() const noexcept { return uint32_t(_scalarHf); }
+ constexpr uint32_t vector_hf() const noexcept { return uint32_t(_vectorHf); }
+};
+
+using FSimdVV = FSimdGeneric;
+using FSimdVVV = FSimdGeneric;
+using FSimdVVVV = FSimdGeneric;
+
+struct FSimdSV {
+ uint32_t opcode;
+};
+
+struct FSimdVVVe {
+ uint32_t _scalar_op : 28;
+ uint32_t _scalarHf : 4;
+ uint32_t _vector_op;
+ uint32_t _elementOp;
+
+ constexpr uint32_t scalar_op() const noexcept { return uint32_t(_scalar_op) << 10; }
+ constexpr uint32_t scalar_hf() const noexcept { return uint32_t(_scalarHf); };
+ constexpr uint32_t vector_op() const noexcept { return uint32_t(_vector_op) << 10; }
+ constexpr uint32_t vector_hf() const noexcept { return kHF_C; }
+ constexpr uint32_t element_scalar_op() const noexcept { return (uint32_t(_elementOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t element_vector_op() const noexcept { return (uint32_t(_elementOp) << 10); }
+};
+
+struct SimdFcadd {
+ uint32_t _opcode;
+
+ constexpr uint32_t opcode() const noexcept { return _opcode << 10; }
+};
+
+struct SimdFcmla {
+ uint32_t _regularOp;
+ uint32_t _elementOp;
+
+ constexpr uint32_t regular_op() const noexcept { return uint32_t(_regularOp) << 10; }
+ constexpr uint32_t element_op() const noexcept { return (uint32_t(_elementOp) << 10); }
+};
+
+struct SimdFccmpFccmpe {
+ uint32_t _opcode;
+ constexpr uint32_t opcode() const noexcept { return _opcode; }
+};
+
+struct SimdFcm {
+ uint32_t _registerOp : 28;
+ uint32_t _registerHf : 4;
+
+ uint32_t _zero_op : 28;
+
+ constexpr bool has_register_op() const noexcept { return _registerOp != 0; }
+ constexpr bool has_zero_op() const noexcept { return _zero_op != 0; }
+
+ constexpr uint32_t register_scalar_op() const noexcept { return (uint32_t(_registerOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t register_vector_op() const noexcept { return uint32_t(_registerOp) << 10; }
+ constexpr uint32_t register_scalar_hf() const noexcept { return uint32_t(_registerHf); }
+ constexpr uint32_t register_vector_hf() const noexcept { return uint32_t(_registerHf); }
+
+ constexpr uint32_t zero_scalar_op() const noexcept { return (uint32_t(_zero_op) << 10) | (0x5u << 28); }
+ constexpr uint32_t zero_vector_op() const noexcept { return (uint32_t(_zero_op) << 10); }
+};
+
+struct SimdFcmpFcmpe {
+ uint32_t _opcode;
+ constexpr uint32_t opcode() const noexcept { return _opcode; }
+};
+
+struct SimdFcvtLN {
+ uint32_t _opcode : 22;
+ uint32_t _is_cvtxn : 1;
+ uint32_t _has_scalar : 1;
+
+ constexpr uint32_t scalar_op() const noexcept { return (uint32_t(_opcode) << 10) | (0x5u << 28); }
+ constexpr uint32_t vector_op() const noexcept { return (uint32_t(_opcode) << 10); }
+
+ constexpr uint32_t is_cvtxn() const noexcept { return _is_cvtxn; }
+ constexpr uint32_t has_scalar() const noexcept { return _has_scalar; }
+};
+
+struct SimdFcvtSV {
+ uint32_t _vectorIntOp;
+ uint32_t _vectorFpOp;
+ uint32_t _general_op : 31;
+ uint32_t _isFloatToInt : 1;
+
+ constexpr uint32_t scalar_int_op() const noexcept { return (uint32_t(_vectorIntOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t vector_int_op() const noexcept { return uint32_t(_vectorIntOp) << 10; }
+ constexpr uint32_t scalar_fp_op() const noexcept { return (uint32_t(_vectorFpOp) << 10) | (0x5u << 28); }
+ constexpr uint32_t vector_fp_op() const noexcept { return uint32_t(_vectorFpOp) << 10; }
+ constexpr uint32_t general_op() const noexcept { return (uint32_t(_general_op) << 10); }
+
+ constexpr uint32_t is_float_to_int() const noexcept { return _isFloatToInt; }
+ constexpr uint32_t is_fixed_point() const noexcept { return _vectorFpOp != 0; }
+};
+
+struct SimdFmlal {
+ uint32_t _vector_op;
+ uint32_t _elementOp;
+ uint8_t _optionalQ;
+ uint8_t ta;
+ uint8_t tb;
+ uint8_t tElement;
+
+ constexpr uint32_t vector_op() const noexcept { return uint32_t(_vector_op) << 10; }
+ constexpr uint32_t element_op() const noexcept { return uint32_t(_elementOp) << 10; }
+ constexpr uint32_t optional_q() const noexcept { return _optionalQ; }
+};
+
+struct FSimdPair {
+ uint32_t _scalar_op;
+ uint32_t _vector_op;
+
+ constexpr uint32_t scalar_op() const noexcept { return uint32_t(_scalar_op) << 10; }
+ constexpr uint32_t vector_op() const noexcept { return uint32_t(_vector_op) << 10; }
+};
+
+struct ISimdVV {
+ M_OPCODE(opcode, 22)
+ uint32_t vec_op_type : 6;
+};
+
+struct ISimdVVx {
+ M_OPCODE(opcode, 22)
+ uint32_t op0_signature;
+ uint32_t op1_signature;
+};
+
+struct ISimdSV {
+ M_OPCODE(opcode, 22)
+ uint32_t vec_op_type : 6;
+};
+
+struct ISimdVVV {
+ M_OPCODE(opcode, 22)
+ uint32_t vec_op_type : 6;
+};
+
+struct ISimdVVVx {
+ M_OPCODE(opcode, 22)
+ uint32_t op0_signature;
+ uint32_t op1_signature;
+ uint32_t op2_signature;
+};
+
+struct ISimdWWV {
+ M_OPCODE(opcode, 22)
+ uint32_t vec_op_type : 6;
+};
+
+struct ISimdVVVe {
+ uint32_t regular_op : 26; // 22 bits used.
+ uint32_t regular_vec_type : 6;
+ uint32_t element_op : 26; // 22 bits used.
+ uint32_t element_vec_type : 6;
+};
+
+struct ISimdVVVI {
+ M_OPCODE(opcode, 22)
+ uint32_t vec_op_type : 6;
+ uint32_t imm_size : 4;
+ uint32_t imm_shift : 4;
+ uint32_t imm64_has_one_bit_less : 1;
+};
+
+struct ISimdVVVV {
+ uint32_t opcode : 22;
+ uint32_t vec_op_type : 6;
+};
+
+struct ISimdVVVVx {
+ uint32_t opcode;
+ uint32_t op0_signature;
+ uint32_t op1_signature;
+ uint32_t op2_signature;
+ uint32_t op3_signature;
+};
+
+struct SimdBicOrr {
+ uint32_t register_op; // 22 bits used.
+ uint32_t immediate_op; // 22 bits used.
+};
+
+struct SimdCmp {
+ uint32_t register_op;
+ uint32_t zero_op : 22;
+ uint32_t vec_op_type : 6;
+};
+
+struct SimdDot {
+ uint32_t vector_op; // 22 bits used.
+ uint32_t element_op; // 22 bits used.
+ uint8_t ta; // Element-type of the first operand.
+ uint8_t tb; // Element-type of the second and third operands.
+ uint8_t tElement; // Element-type of the element index[] operand.
+};
+
+struct SimdMoviMvni {
+ uint32_t opcode : 31;
+ uint32_t inverted : 1;
+};
+
+struct SimdLdSt {
+ uint32_t u_offset_op : 10;
+ uint32_t pre_post_op : 11;
+ uint32_t register_op : 11;
+ uint32_t literal_op : 8;
+ uint32_t u_alt_inst_id : 16;
+};
+
+struct SimdLdNStN {
+ uint32_t single_op;
+ uint32_t multiple_op : 22;
+ uint32_t n : 3;
+ uint32_t replicate : 1;
+};
+
+struct SimdLdpStp {
+ uint32_t offset_op : 10;
+ uint32_t pre_post_op : 10;
+};
+
+struct SimdLdurStur {
+ uint32_t opcode;
+};
+
+struct ISimdPair {
+ uint32_t opcode2; // 22 bits used.
+ uint32_t opcode3 : 26; // 22 bits used.
+ uint32_t op_type3 : 6;
+};
+
+struct SimdShift {
+ uint32_t register_op; // 22 bits used.
+ uint32_t immediate_op : 22; // 22 bits used.
+ uint32_t inverted_imm : 1;
+ uint32_t vec_op_type : 6;
+};
+
+struct SimdShiftES {
+ uint32_t opcode : 22;
+ uint32_t vec_op_type : 6;
+};
+
+struct SimdSm3tt {
+ uint32_t opcode;
+};
+
+struct SimdSmovUmov {
+ uint32_t opcode : 22;
+ uint32_t vec_op_type : 6;
+ uint32_t is_signed : 1;
+};
+
+struct SimdSxtlUxtl {
+ uint32_t opcode : 22;
+ uint32_t vec_op_type : 6;
+};
+
+struct SimdTblTbx {
+ uint32_t opcode;
+};
+
+#undef M_OPCODE
+
+// ${EncodingDataForward:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+extern const BaseAddSub baseAddSub[4];
+extern const BaseAdr baseAdr[2];
+extern const BaseAtDcIcTlbi baseAtDcIcTlbi[4];
+extern const BaseAtomicCasp baseAtomicCasp[4];
+extern const BaseAtomicOp baseAtomicOp[123];
+extern const BaseAtomicSt baseAtomicSt[48];
+extern const BaseBfc baseBfc[1];
+extern const BaseBfi baseBfi[3];
+extern const BaseBfm baseBfm[3];
+extern const BaseBfx baseBfx[3];
+extern const BaseBranchCmp baseBranchCmp[2];
+extern const BaseBranchReg baseBranchReg[3];
+extern const BaseBranchRel baseBranchRel[3];
+extern const BaseBranchTst baseBranchTst[2];
+extern const BaseCCmp baseCCmp[2];
+extern const BaseCInc baseCInc[3];
+extern const BaseCSel baseCSel[4];
+extern const BaseCSet baseCSet[2];
+extern const BaseCmpCmn baseCmpCmn[2];
+extern const BaseExtend baseExtend[5];
+extern const BaseExtract baseExtract[1];
+extern const BaseLdSt baseLdSt[9];
+extern const BaseLdpStp baseLdpStp[6];
+extern const BaseLdxp baseLdxp[2];
+extern const BaseLogical baseLogical[8];
+extern const BaseMinMax baseMinMax[4];
+extern const BaseMovKNZ baseMovKNZ[3];
+extern const BaseMvnNeg baseMvnNeg[3];
+extern const BaseOp baseOp[24];
+extern const BaseOpImm baseOpImm[15];
+extern const BaseOpX16 baseOpX16[1];
+extern const BasePrfm basePrfm[1];
+extern const BaseR baseR[10];
+extern const BaseRM_NoImm baseRM_NoImm[21];
+extern const BaseRM_SImm10 baseRM_SImm10[2];
+extern const BaseRM_SImm9 baseRM_SImm9[23];
+extern const BaseRR baseRR[18];
+extern const BaseRRII baseRRII[2];
+extern const BaseRRR baseRRR[26];
+extern const BaseRRRR baseRRRR[6];
+extern const BaseShift baseShift[8];
+extern const BaseStx baseStx[3];
+extern const BaseStxp baseStxp[2];
+extern const BaseTst baseTst[1];
+extern const FSimdPair fSimdPair[5];
+extern const FSimdSV fSimdSV[4];
+extern const FSimdVV fSimdVV[17];
+extern const FSimdVVV fSimdVVV[13];
+extern const FSimdVVVV fSimdVVVV[4];
+extern const FSimdVVVe fSimdVVVe[4];
+extern const ISimdPair iSimdPair[1];
+extern const ISimdSV iSimdSV[7];
+extern const ISimdVV iSimdVV[29];
+extern const ISimdVVV iSimdVVV[65];
+extern const ISimdVVVI iSimdVVVI[2];
+extern const ISimdVVVV iSimdVVVV[2];
+extern const ISimdVVVVx iSimdVVVVx[1];
+extern const ISimdVVVe iSimdVVVe[25];
+extern const ISimdVVVx iSimdVVVx[17];
+extern const ISimdVVx iSimdVVx[13];
+extern const ISimdWWV iSimdWWV[8];
+extern const SimdBicOrr simdBicOrr[2];
+extern const SimdCmp simdCmp[7];
+extern const SimdDot simdDot[5];
+extern const SimdFcadd simdFcadd[1];
+extern const SimdFccmpFccmpe simdFccmpFccmpe[2];
+extern const SimdFcm simdFcm[5];
+extern const SimdFcmla simdFcmla[1];
+extern const SimdFcmpFcmpe simdFcmpFcmpe[2];
+extern const SimdFcvtLN simdFcvtLN[6];
+extern const SimdFcvtSV simdFcvtSV[12];
+extern const SimdFmlal simdFmlal[6];
+extern const SimdLdNStN simdLdNStN[12];
+extern const SimdLdSt simdLdSt[2];
+extern const SimdLdpStp simdLdpStp[4];
+extern const SimdLdurStur simdLdurStur[2];
+extern const SimdMoviMvni simdMoviMvni[2];
+extern const SimdShift simdShift[40];
+extern const SimdShiftES simdShiftES[2];
+extern const SimdSm3tt simdSm3tt[4];
+extern const SimdSmovUmov simdSmovUmov[2];
+extern const SimdSxtlUxtl simdSxtlUxtl[4];
+extern const SimdTblTbx simdTblTbx[2];
+// ----------------------------------------------------------------------------
+// ${EncodingDataForward:End}
+
+} // {EncodingData}
+
+// a64::InstDB - Tables
+// ====================
+
+#ifndef ASMJIT_NO_TEXT
+extern const InstNameIndex _inst_name_index;
+extern const char _inst_name_string_table[];
+extern const uint32_t _inst_name_index_table[];
+#endif // !ASMJIT_NO_TEXT
+
+} // {InstDB}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_A64_ARMINSTDB_H_P_INCLUDED
+
diff --git a/3rdparty/asmjit/asmjit/arm/a64operand.cpp b/3rdparty/asmjit/asmjit/arm/a64operand.cpp
new file mode 100644
index 00000000000..f1eddb55e5d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64operand.cpp
@@ -0,0 +1,85 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/core/misc_p.h>
+#include <asmjit/arm/a64operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::Operand - Tests
+// ====================
+
+#if defined(ASMJIT_TEST)
+UNIT(a64_operand) {
+ INFO("Checking if a64::reg(...) matches built-in IDs");
+ EXPECT_EQ(w(5), w5);
+ EXPECT_EQ(x(5), x5);
+
+ INFO("Checking Gp register properties");
+ EXPECT_TRUE(Gp().is_reg());
+ EXPECT_TRUE(w0.is_reg());
+ EXPECT_TRUE(x0.is_reg());
+ EXPECT_EQ(w0.id(), 0u);
+ EXPECT_EQ(x0.id(), 0u);
+ EXPECT_EQ(wzr.id(), Gp::kIdZr);
+ EXPECT_EQ(xzr.id(), Gp::kIdZr);
+ EXPECT_EQ(wsp.id(), Gp::kIdSp);
+ EXPECT_EQ(sp.id(), Gp::kIdSp);
+ EXPECT_EQ(w0.size(), 4u);
+ EXPECT_EQ(x0.size(), 8u);
+ EXPECT_EQ(w0.reg_type(), RegType::kGp32);
+ EXPECT_EQ(x0.reg_type(), RegType::kGp64);
+ EXPECT_EQ(w0.reg_group(), RegGroup::kGp);
+ EXPECT_EQ(x0.reg_group(), RegGroup::kGp);
+
+ INFO("Checking Vec register properties");
+ EXPECT_EQ(v0.reg_type(), RegType::kVec128);
+ EXPECT_EQ(d0.reg_type(), RegType::kVec64);
+ EXPECT_EQ(s0.reg_type(), RegType::kVec32);
+ EXPECT_EQ(h0.reg_type(), RegType::kVec16);
+ EXPECT_EQ(b0.reg_type(), RegType::kVec8);
+
+ EXPECT_EQ(v0.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(d0.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(s0.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(h0.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(b0.reg_group(), RegGroup::kVec);
+
+ INFO("Checking Vec register element[] access");
+ Vec vd_1 = v15.d(1);
+ EXPECT_EQ(vd_1.reg_type(), RegType::kVec128);
+ EXPECT_EQ(vd_1.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(vd_1.id(), 15u);
+ EXPECT_TRUE(vd_1.is_vec_d2());
+ EXPECT_EQ(vd_1.element_type(), VecElementType::kD);
+ EXPECT_TRUE(vd_1.has_element_index());
+ EXPECT_EQ(vd_1.element_index(), 1u);
+
+ Vec vs_3 = v15.s(3);
+ EXPECT_EQ(vs_3.reg_type(), RegType::kVec128);
+ EXPECT_EQ(vs_3.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(vs_3.id(), 15u);
+ EXPECT_TRUE(vs_3.is_vec_s4());
+ EXPECT_EQ(vs_3.element_type(), VecElementType::kS);
+ EXPECT_TRUE(vs_3.has_element_index());
+ EXPECT_EQ(vs_3.element_index(), 3u);
+
+ Vec vb_4 = v15.b4(3);
+ EXPECT_EQ(vb_4.reg_type(), RegType::kVec128);
+ EXPECT_EQ(vb_4.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(vb_4.id(), 15u);
+ EXPECT_TRUE(vb_4.is_vec_b4x4());
+ EXPECT_EQ(vb_4.element_type(), VecElementType::kB4);
+ EXPECT_TRUE(vb_4.has_element_index());
+ EXPECT_EQ(vb_4.element_index(), 3u);
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/asmjit/arm/a64operand.h b/3rdparty/asmjit/asmjit/arm/a64operand.h
new file mode 100644
index 00000000000..ba5f98b8fcb
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64operand.h
@@ -0,0 +1,1105 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64OPERAND_H_INCLUDED
+#define ASMJIT_ARM_A64OPERAND_H_INCLUDED
+
+#include <asmjit/core/operand.h>
+#include <asmjit/arm/armglobals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \addtogroup asmjit_a64
+//! \{
+
+//! General purpose register (AArch64).
+class Gp : public UniGp {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(Gp, UniGp)
+
+ //! \name Constants
+ //! \{
+
+ //! Special register id.
+ enum Id : uint32_t {
+ //! Register that depends on OS, could be used as TLS offset.
+ kIdOs = 18,
+ //! Frame pointer register id.
+ kIdFp = 29,
+ //! Link register id.
+ kIdLr = 30,
+ //! Stack register id.
+ kIdSp = 31,
+ //! Zero register id.
+ //!
+ //! Although zero register has the same id as stack register it has a special treatment, because we need to be
+ //! able to distinguish between these two at API level. Some instructions were designed to be used with SP and
+ //! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing.
+ //!
+ //! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs,
+ //! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction.
+ kIdZr = 63
+ };
+
+ //! \}
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Creates a new 32-bit low general purpose register (W) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r32(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp32>(), reg_id); }
+
+ //! Creates a new 64-bit low general purpose register (X) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r64(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp64>(), reg_id); }
+
+ //! Creates a new 32-bit low general purpose register (W) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_w(uint32_t reg_id) noexcept { return make_r32(reg_id); }
+
+ //! Creates a new 64-bit low general purpose register (X) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_x(uint32_t reg_id) noexcept { return make_r64(reg_id); }
+
+ //! \}
+
+ //! \name Gp Register Accessors
+ //! \{
+
+ //! Test whether this register is ZR register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_zr() const noexcept { return id() == kIdZr; }
+
+ //! Test whether this register is SP register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_sp() const noexcept { return id() == kIdSp; }
+
+ //! Clones and casts this register to a 32-bit (W) register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r32() const noexcept { return make_r32(id()); }
+
+ //! Clones and casts this register to a 64-bit (X) register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r64() const noexcept { return make_r64(id()); }
+
+ //! Clones and casts this register to a 32-bit (W) register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp w() const noexcept { return r32(); }
+
+ //! Clones and casts this register to a 64-bit (X) register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp x() const noexcept { return r64(); }
+
+ //! \}
+};
+
+//! Vector element type (AArch64).
+enum class VecElementType : uint32_t {
+ //! No element type specified.
+ kNone = 0,
+ //! Byte elements (B8 or B16).
+ kB,
+ //! Halfword elements (H4 or H8).
+ kH,
+ //! Singleword elements (S2 or S4).
+ kS,
+ //! Doubleword elements (D2).
+ kD,
+ //! Byte elements grouped by 4 bytes (B4).
+ //!
+ //! \note This element-type is only used by few instructions.
+ kB4,
+ //! Halfword elements grouped by 2 halfwords (H2).
+ //!
+ //! \note This element-type is only used by few instructions.
+ kH2,
+
+ //! Maximum value of \ref VecElementType
+ kMaxValue = kH2
+};
+
+//! Vector register (AArch64).
+class Vec : public UniVec {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(Vec, UniVec)
+
+ //! \cond
+
+ // Register element type (3 bits).
+ // |........|........|.XXX....|........|
+ static inline constexpr uint32_t kSignatureRegElementTypeShift = 12;
+ static inline constexpr uint32_t kSignatureRegElementTypeMask = 0x07 << kSignatureRegElementTypeShift;
+
+ // Register has element index (1 bit).
+ // |........|........|X.......|........|
+ static inline constexpr uint32_t kSignatureRegElementFlagShift = 15;
+ static inline constexpr uint32_t kSignatureRegElementFlagMask = 0x01 << kSignatureRegElementFlagShift;
+
+ // Register element index (4 bits).
+ // |........|....XXXX|........|........|
+ static inline constexpr uint32_t kSignatureRegElementIndexShift = 16;
+ static inline constexpr uint32_t kSignatureRegElementIndexMask = 0x0F << kSignatureRegElementIndexShift;
+
+ static inline constexpr uint32_t kSignatureElementB = uint32_t(VecElementType::kB) << kSignatureRegElementTypeShift;
+ static inline constexpr uint32_t kSignatureElementH = uint32_t(VecElementType::kH) << kSignatureRegElementTypeShift;
+ static inline constexpr uint32_t kSignatureElementS = uint32_t(VecElementType::kS) << kSignatureRegElementTypeShift;
+ static inline constexpr uint32_t kSignatureElementD = uint32_t(VecElementType::kD) << kSignatureRegElementTypeShift;
+ static inline constexpr uint32_t kSignatureElementB4 = uint32_t(VecElementType::kB4) << kSignatureRegElementTypeShift;
+ static inline constexpr uint32_t kSignatureElementH2 = uint32_t(VecElementType::kH2) << kSignatureRegElementTypeShift;
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature _make_element_access_signature(VecElementType element_type, uint32_t element_index) noexcept {
+ return OperandSignature{
+ uint32_t(RegTraits<RegType::kVec128>::kSignature) |
+ uint32_t(kSignatureRegElementFlagMask) |
+ (uint32_t(element_type) << kSignatureRegElementTypeShift) |
+ (uint32_t(element_index << kSignatureRegElementIndexShift))
+ };
+ }
+
+ //! \endcond
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Creates a new 8-bit vector register (B) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v8(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec8>(), reg_id); }
+
+ //! Creates a new 16-bit vector register (H) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v16(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec16>(), reg_id); }
+
+ //! Creates a new 32-bit vector register (S) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v32(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec32>(), reg_id); }
+
+ //! Creates a new 64-bit vector register (D) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v64(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec64>(), reg_id); }
+
+ //! Creates a new 128-bit vector register (Q) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v128(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec128>(), reg_id); }
+
+ //! Creates a new 8-bit vector register (B) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_b(uint32_t reg_id) noexcept { return make_v8(reg_id); }
+
+ //! Creates a new 16-bit vector register (H) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_h(uint32_t reg_id) noexcept { return make_v16(reg_id); }
+
+ //! Creates a new 32-bit vector register (S) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_s(uint32_t reg_id) noexcept { return make_v32(reg_id); }
+
+ //! Creates a new 64-bit vector register (D) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_d(uint32_t reg_id) noexcept { return make_v64(reg_id); }
+
+ //! Creates a new 128-bit vector register (Q) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_q(uint32_t reg_id) noexcept { return make_v128(reg_id); }
+
+ //! Creates a new 32-bit vector register (S) having the given vector `element_type` and register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v32_with_element_type(VecElementType element_type, uint32_t reg_id) noexcept {
+ uint32_t signature = RegTraits<RegType::kVec32>::kSignature | uint32_t(element_type) << kSignatureRegElementTypeShift;
+ return Vec(OperandSignature{signature}, reg_id);
+ }
+
+ //! Creates a new 64-bit vector register (D) having the given vector `element_type` and register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v64_with_element_type(VecElementType element_type, uint32_t reg_id) noexcept {
+ uint32_t signature = RegTraits<RegType::kVec64>::kSignature | uint32_t(element_type) << kSignatureRegElementTypeShift;
+ return Vec(OperandSignature{signature}, reg_id);
+ }
+
+ //! Creates a new 128-bit vector register (Q) having the given vector `element_type` and register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v128_with_element_type(VecElementType element_type, uint32_t reg_id) noexcept {
+ uint32_t signature = RegTraits<RegType::kVec128>::kSignature | uint32_t(element_type) << kSignatureRegElementTypeShift;
+ return Vec(OperandSignature{signature}, reg_id);
+ }
+
+ //! Creates a new 128-bit vector of type specified by `element_type` and `element_index`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v128_with_element_index(VecElementType element_type, uint32_t element_index, uint32_t reg_id) noexcept {
+ return Vec(_make_element_access_signature(element_type, element_index), reg_id);
+ }
+
+ //! \}
+
+ //! \name Vector Register Accessors
+ //! \{
+
+ //! Returns whether the register has element type or element index (or both).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_element_type_or_index() const noexcept {
+ return _signature.has_field<kSignatureRegElementTypeMask | kSignatureRegElementFlagMask>();
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_b8() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec64>::kSignature | kSignatureElementB);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_h4() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec64>::kSignature | kSignatureElementH);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_s2() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec64>::kSignature | kSignatureElementS);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_d1() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec64>::kSignature);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_b16() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec128>::kSignature | kSignatureElementB);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_h8() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec128>::kSignature | kSignatureElementH);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_s4() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec128>::kSignature | kSignatureElementS);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_d2() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec128>::kSignature | kSignatureElementD);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_b4x4() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec128>::kSignature | kSignatureElementB4);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec_h2x4() const noexcept {
+ return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kVec128>::kSignature | kSignatureElementH2);
+ }
+
+ //! Clones and casts the register to an 8-bit B register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v8() const noexcept { return make_v8(id()); }
+
+ //! Clones and casts the register to a 16-bit H register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v16() const noexcept { return make_v16(id()); }
+
+ //! Clones and casts the register to a 32-bit S register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v32() const noexcept { return make_v32(id()); }
+
+ //! Clones and casts the register to a 64-bit D register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v64() const noexcept { return make_v64(id()); }
+
+ //! Clones and casts the register to a 128-bit Q register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v128() const noexcept { return make_v128(id()); }
+
+ //! Clones and casts the register to an 8-bit B register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec b() const noexcept { return make_v8(id()); }
+
+ //! Clones and casts the register to a 16-bit H register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec h() const noexcept { return make_v16(id()); }
+
+ //! Clones and casts the register to a 32-bit S register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec s() const noexcept { return make_v32(id()); }
+
+ //! Clones and casts the register to a 64-bit D register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec d() const noexcept { return make_v64(id()); }
+
+ //! Clones and casts the register to a 128-bit Q register (element type & index is not cloned).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec q() const noexcept { return make_v128(id()); }
+
+ //! Clones and casts the register to a 128-bit V.B[element_index] register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec b(uint32_t element_index) const noexcept { return make_v128_with_element_index(VecElementType::kB, element_index, id()); }
+
+ //! Clones and casts the register to a 128-bit V.H[element_index] register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec h(uint32_t element_index) const noexcept { return make_v128_with_element_index(VecElementType::kH, element_index, id()); }
+
+ //! Clones and casts the register to a 128-bit V.S[element_index] register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec s(uint32_t element_index) const noexcept { return make_v128_with_element_index(VecElementType::kS, element_index, id()); }
+
+ //! Clones and casts the register to a 128-bit V.D[element_index] register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec d(uint32_t element_index) const noexcept { return make_v128_with_element_index(VecElementType::kD, element_index, id()); }
+
+ //! Clones and casts the register to a 128-bit V.H2[element_index] register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec h2(uint32_t element_index) const noexcept { return make_v128_with_element_index(VecElementType::kH2, element_index, id()); }
+
+ //! Clones and casts the register to a 128-bit V.B4[element_index] register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec b4(uint32_t element_index) const noexcept { return make_v128_with_element_index(VecElementType::kB4, element_index, id()); }
+
+ //! Clones and casts the register to V.8B.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec b8() const noexcept { return make_v64_with_element_type(VecElementType::kB, id()); }
+
+ //! Clones and casts the register to V.16B.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec b16() const noexcept { return make_v128_with_element_type(VecElementType::kB, id()); }
+
+ //! Clones and casts the register to V.2H.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec h2() const noexcept { return make_v32_with_element_type(VecElementType::kH, id()); }
+
+ //! Clones and casts the register to V.4H.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec h4() const noexcept { return make_v64_with_element_type(VecElementType::kH, id()); }
+
+ //! Clones and casts the register to V.8H.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec h8() const noexcept { return make_v128_with_element_type(VecElementType::kH, id()); }
+
+ //! Clones and casts the register to V.2S.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec s2() const noexcept { return make_v64_with_element_type(VecElementType::kS, id()); }
+
+ //! Clones and casts the register to V.4S.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec s4() const noexcept { return make_v128_with_element_type(VecElementType::kS, id()); }
+
+ //! Clones and casts the register to V.2D.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec d2() const noexcept { return make_v128_with_element_type(VecElementType::kD, id()); }
+
+ //! \}
+
+ //! \name Element Type Accessors
+ //! \{
+
+ //! Returns whether the vector register has associated a vector element type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_element_type() const noexcept {
+ return _signature.has_field<kSignatureRegElementTypeMask>();
+ }
+
+ //! Returns vector element type of the register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR VecElementType element_type() const noexcept {
+ return VecElementType(_signature.get_field<kSignatureRegElementTypeMask>());
+ }
+
+ //! Sets vector element type of the register to `element_type`.
+ ASMJIT_INLINE_CONSTEXPR void set_element_type(VecElementType element_type) noexcept {
+ _signature.set_field<kSignatureRegElementTypeMask>(uint32_t(element_type));
+ }
+
+ //! Resets vector element type to none.
+ ASMJIT_INLINE_CONSTEXPR void reset_element_type() noexcept {
+ _signature.set_field<kSignatureRegElementTypeMask>(0);
+ }
+
+ //! \}
+
+ //! \name Element Index Accessors
+ //! \{
+
+ //! Returns whether the register has element index (it's an element index access).
+ ASMJIT_INLINE_CONSTEXPR bool has_element_index() const noexcept {
+ return _signature.has_field<kSignatureRegElementFlagMask>();
+ }
+
+ //! Returns element index of the register.
+ ASMJIT_INLINE_CONSTEXPR uint32_t element_index() const noexcept {
+ return _signature.get_field<kSignatureRegElementIndexMask>();
+ }
+
+ //! Sets element index of the register to `element_type`.
+ ASMJIT_INLINE_CONSTEXPR void set_element_index(uint32_t element_index) noexcept {
+ _signature |= kSignatureRegElementFlagMask;
+ _signature.set_field<kSignatureRegElementIndexMask>(element_index);
+ }
+
+ //! Resets element index of the register.
+ ASMJIT_INLINE_CONSTEXPR void reset_element_index() noexcept {
+ _signature &= ~(kSignatureRegElementFlagMask | kSignatureRegElementIndexMask);
+ }
+
+ //! Clones a vector register with element access enabled at the given `element_index`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec at(uint32_t element_index) const noexcept {
+ return Vec((signature() & ~kSignatureRegElementIndexMask) | (element_index << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id());
+ }
+
+ //! \}
+};
+
+//! Memory operand (AArch64).
+class Mem : public BaseMem {
+public:
+ //! \cond INTERNAL
+
+ // Index shift value (5 bits).
+ // |........|.....XXX|XX......|........|
+ static inline constexpr uint32_t kSignatureMemShiftValueShift = 14;
+ static inline constexpr uint32_t kSignatureMemShiftValueMask = 0x1Fu << kSignatureMemShiftValueShift;
+
+ // Index shift operation (4 bits).
+ // |........|XXXX....|........|........|
+ static inline constexpr uint32_t kSignatureMemShiftOpShift = 20;
+ static inline constexpr uint32_t kSignatureMemShiftOpMask = 0x0Fu << kSignatureMemShiftOpShift;
+
+ // Offset mode type (2 bits).
+ // |......XX|........|........|........|
+ static inline constexpr uint32_t kSignatureMemOffsetModeShift = 24;
+ static inline constexpr uint32_t kSignatureMemOffsetModeMask = 0x03u << kSignatureMemOffsetModeShift;
+
+ //! \endcond
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Construct a default `Mem` operand, that points to [0].
+ ASMJIT_INLINE_CONSTEXPR Mem() noexcept
+ : BaseMem() {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Mem& other) noexcept
+ : BaseMem(other) {}
+
+ ASMJIT_INLINE_NODEBUG explicit Mem(Globals::NoInit_) noexcept
+ : BaseMem(Globals::NoInit) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Signature& signature, uint32_t base_id, uint32_t index_id, int32_t offset) noexcept
+ : BaseMem(signature, base_id, index_id, offset) {}
+
+ ASMJIT_INLINE_CONSTEXPR explicit Mem(const Label& base, int32_t off = 0, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(RegType::kLabelTag) |
+ signature, base.id(), 0, off) {}
+
+ ASMJIT_INLINE_CONSTEXPR explicit Mem(const Reg& base, int32_t off = 0, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(base.reg_type()) |
+ signature, base.id(), 0, off) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Reg& base, const Reg& index, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(base.reg_type()) |
+ Signature::from_mem_index_type(index.reg_type()) |
+ signature, base.id(), index.id(), 0) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Reg& base, const Reg& index, const Shift& shift, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(base.reg_type()) |
+ Signature::from_mem_index_type(index.reg_type()) |
+ Signature::from_value<kSignatureMemShiftOpMask>(uint32_t(shift.op())) |
+ Signature::from_value<kSignatureMemShiftValueMask>(shift.value()) |
+ signature, base.id(), index.id(), 0) {}
+
+ ASMJIT_INLINE_CONSTEXPR explicit Mem(uint64_t base, Signature signature = Signature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR Mem& operator=(const Mem& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Clone
+ //! \{
+
+ //! Clones the memory operand.
+ ASMJIT_INLINE_CONSTEXPR Mem clone() const noexcept { return Mem(*this); }
+
+ //! Gets new memory operand adjusted by `off`.
+ ASMJIT_INLINE_CONSTEXPR Mem clone_adjusted(int64_t off) const noexcept {
+ Mem result(*this);
+ result.add_offset(off);
+ return result;
+ }
+
+ //! Clones the memory operand and makes it pre-index.
+ ASMJIT_INLINE_CONSTEXPR Mem pre() const noexcept {
+ Mem result(*this);
+ result.set_offset_mode(OffsetMode::kPreIndex);
+ return result;
+ }
+
+ //! Clones the memory operand, applies a given offset `off` and makes it pre-index.
+ ASMJIT_INLINE_CONSTEXPR Mem pre(int64_t off) const noexcept {
+ Mem result(*this);
+ result.set_offset_mode(OffsetMode::kPreIndex);
+ result.add_offset(off);
+ return result;
+ }
+
+ //! Clones the memory operand and makes it post-index.
+ ASMJIT_INLINE_CONSTEXPR Mem post() const noexcept {
+ Mem result(*this);
+ result.set_offset_mode(OffsetMode::kPostIndex);
+ return result;
+ }
+
+ //! Clones the memory operand, applies a given offset `off` and makes it post-index.
+ ASMJIT_INLINE_CONSTEXPR Mem post(int64_t off) const noexcept {
+ Mem result(*this);
+ result.set_offset_mode(OffsetMode::kPostIndex);
+ result.add_offset(off);
+ return result;
+ }
+
+ //! \}
+
+ //! \name Base & Index
+ //! \{
+
+ //! Converts memory `base_type` and `base_id` to `arm::Reg` instance.
+ //!
+ //! The memory must have a valid base register otherwise the result will be wrong.
+ ASMJIT_INLINE_NODEBUG Reg base_reg() const noexcept { return Reg::from_type_and_id(base_type(), base_id()); }
+
+ //! Converts memory `index_type` and `index_id` to `arm::Reg` instance.
+ //!
+ //! The memory must have a valid index register otherwise the result will be wrong.
+ ASMJIT_INLINE_NODEBUG Reg index_reg() const noexcept { return Reg::from_type_and_id(index_type(), index_id()); }
+
+ using BaseMem::set_index;
+
+ ASMJIT_INLINE_CONSTEXPR void set_index(const Reg& index, uint32_t shift) noexcept {
+ set_index(index);
+ set_shift(shift);
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void set_index(const Reg& index, Shift shift) noexcept {
+ set_index(index);
+ set_shift(shift);
+ }
+
+ //! \}
+
+ //! \name ARM Specific Features
+ //! \{
+
+ //! Gets offset mode.
+ ASMJIT_INLINE_CONSTEXPR OffsetMode offset_mode() const noexcept { return OffsetMode(_signature.get_field<kSignatureMemOffsetModeMask>()); }
+ //! Sets offset mode to `mode`.
+ ASMJIT_INLINE_CONSTEXPR void set_offset_mode(OffsetMode mode) noexcept { _signature.set_field<kSignatureMemOffsetModeMask>(uint32_t(mode)); }
+ //! Resets offset mode to default (fixed offset, without write-back).
+ ASMJIT_INLINE_CONSTEXPR void reset_offset_mode() noexcept { _signature.set_field<kSignatureMemOffsetModeMask>(uint32_t(OffsetMode::kFixed)); }
+
+ //! Tests whether the current memory offset mode is fixed (see \ref arm::OffsetMode::kFixed).
+ ASMJIT_INLINE_CONSTEXPR bool is_fixed_offset() const noexcept { return offset_mode() == OffsetMode::kFixed; }
+ //! Tests whether the current memory offset mode is either pre-index or post-index (write-back is used).
+ ASMJIT_INLINE_CONSTEXPR bool is_pre_or_post() const noexcept { return offset_mode() != OffsetMode::kFixed; }
+ //! Tests whether the current memory offset mode is pre-index (write-back is used).
+ ASMJIT_INLINE_CONSTEXPR bool is_pre_index() const noexcept { return offset_mode() == OffsetMode::kPreIndex; }
+ //! Tests whether the current memory offset mode is post-index (write-back is used).
+ ASMJIT_INLINE_CONSTEXPR bool is_post_index() const noexcept { return offset_mode() == OffsetMode::kPostIndex; }
+
+ //! Sets offset mode of this memory operand to pre-index (write-back is used).
+ ASMJIT_INLINE_CONSTEXPR void make_pre_index() noexcept { set_offset_mode(OffsetMode::kPreIndex); }
+ //! Sets offset mode of this memory operand to post-index (write-back is used).
+ ASMJIT_INLINE_CONSTEXPR void make_post_index() noexcept { set_offset_mode(OffsetMode::kPostIndex); }
+
+ //! Gets shift operation that is used by index register.
+ ASMJIT_INLINE_CONSTEXPR ShiftOp shift_op() const noexcept { return ShiftOp(_signature.get_field<kSignatureMemShiftOpMask>()); }
+ //! Sets shift operation that is used by index register.
+ ASMJIT_INLINE_CONSTEXPR void set_shift_op(ShiftOp sop) noexcept { _signature.set_field<kSignatureMemShiftOpMask>(uint32_t(sop)); }
+ //! Resets shift operation that is used by index register to LSL (default value).
+ ASMJIT_INLINE_CONSTEXPR void reset_shift_op() noexcept { _signature.set_field<kSignatureMemShiftOpMask>(uint32_t(ShiftOp::kLSL)); }
+
+ //! Gets whether the memory operand has shift (aka scale) constant.
+ ASMJIT_INLINE_CONSTEXPR bool has_shift() const noexcept { return _signature.has_field<kSignatureMemShiftValueMask>(); }
+ //! Gets the memory operand's shift (aka scale) constant.
+ ASMJIT_INLINE_CONSTEXPR uint32_t shift() const noexcept { return _signature.get_field<kSignatureMemShiftValueMask>(); }
+ //! Sets the memory operand's shift (aka scale) constant.
+ ASMJIT_INLINE_CONSTEXPR void set_shift(uint32_t shift) noexcept { _signature.set_field<kSignatureMemShiftValueMask>(shift); }
+
+ //! Sets the memory operand's shift and shift operation.
+ ASMJIT_INLINE_CONSTEXPR void set_shift(Shift shift) noexcept {
+ _signature.set_field<kSignatureMemShiftOpMask>(uint32_t(shift.op()));
+ _signature.set_field<kSignatureMemShiftValueMask>(shift.value());
+ }
+
+ //! Resets the memory operand's shift (aka scale) constant to zero.
+ ASMJIT_INLINE_CONSTEXPR void reset_shift() noexcept { _signature.set_field<kSignatureMemShiftValueMask>(0); }
+
+ //! \}
+};
+
+#ifndef _DOXYGEN
+namespace regs {
+#endif
+
+//! Creates a 32-bit W register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp w(uint32_t id) noexcept { return Gp::make_r32(id); }
+
+//! Creates a 32-bit W register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp32(uint32_t id) noexcept { return Gp::make_r32(id); }
+
+//! Creates a 64-bit X register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp x(uint32_t id) noexcept { return Gp::make_r64(id); }
+
+//! Creates a 64-bit X register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp64(uint32_t id) noexcept { return Gp::make_r64(id); }
+
+//! Creates an 8-bit B register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec b(uint32_t id) noexcept { return Vec::make_v8(id); }
+
+//! Creates a 16-bit H register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec h(uint32_t id) noexcept { return Vec::make_v16(id); }
+
+//! Creates a 32-bit S register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec s(uint32_t id) noexcept { return Vec::make_v32(id); }
+
+//! Creates a 64-bit D register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec d(uint32_t id) noexcept { return Vec::make_v64(id); }
+
+//! Creates a 128-bit Q register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec q(uint32_t id) noexcept { return Vec::make_v128(id); }
+
+//! Creates a 128-bit V register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec v(uint32_t id) noexcept { return Vec::make_v128(id); }
+
+static constexpr Gp w0 = Gp::make_r32(0);
+static constexpr Gp w1 = Gp::make_r32(1);
+static constexpr Gp w2 = Gp::make_r32(2);
+static constexpr Gp w3 = Gp::make_r32(3);
+static constexpr Gp w4 = Gp::make_r32(4);
+static constexpr Gp w5 = Gp::make_r32(5);
+static constexpr Gp w6 = Gp::make_r32(6);
+static constexpr Gp w7 = Gp::make_r32(7);
+static constexpr Gp w8 = Gp::make_r32(8);
+static constexpr Gp w9 = Gp::make_r32(9);
+static constexpr Gp w10 = Gp::make_r32(10);
+static constexpr Gp w11 = Gp::make_r32(11);
+static constexpr Gp w12 = Gp::make_r32(12);
+static constexpr Gp w13 = Gp::make_r32(13);
+static constexpr Gp w14 = Gp::make_r32(14);
+static constexpr Gp w15 = Gp::make_r32(15);
+static constexpr Gp w16 = Gp::make_r32(16);
+static constexpr Gp w17 = Gp::make_r32(17);
+static constexpr Gp w18 = Gp::make_r32(18);
+static constexpr Gp w19 = Gp::make_r32(19);
+static constexpr Gp w20 = Gp::make_r32(20);
+static constexpr Gp w21 = Gp::make_r32(21);
+static constexpr Gp w22 = Gp::make_r32(22);
+static constexpr Gp w23 = Gp::make_r32(23);
+static constexpr Gp w24 = Gp::make_r32(24);
+static constexpr Gp w25 = Gp::make_r32(25);
+static constexpr Gp w26 = Gp::make_r32(26);
+static constexpr Gp w27 = Gp::make_r32(27);
+static constexpr Gp w28 = Gp::make_r32(28);
+static constexpr Gp w29 = Gp::make_r32(29);
+static constexpr Gp w30 = Gp::make_r32(30);
+static constexpr Gp wzr = Gp::make_r32(Gp::kIdZr);
+static constexpr Gp wsp = Gp::make_r32(Gp::kIdSp);
+
+static constexpr Gp x0 = Gp::make_r64(0);
+static constexpr Gp x1 = Gp::make_r64(1);
+static constexpr Gp x2 = Gp::make_r64(2);
+static constexpr Gp x3 = Gp::make_r64(3);
+static constexpr Gp x4 = Gp::make_r64(4);
+static constexpr Gp x5 = Gp::make_r64(5);
+static constexpr Gp x6 = Gp::make_r64(6);
+static constexpr Gp x7 = Gp::make_r64(7);
+static constexpr Gp x8 = Gp::make_r64(8);
+static constexpr Gp x9 = Gp::make_r64(9);
+static constexpr Gp x10 = Gp::make_r64(10);
+static constexpr Gp x11 = Gp::make_r64(11);
+static constexpr Gp x12 = Gp::make_r64(12);
+static constexpr Gp x13 = Gp::make_r64(13);
+static constexpr Gp x14 = Gp::make_r64(14);
+static constexpr Gp x15 = Gp::make_r64(15);
+static constexpr Gp x16 = Gp::make_r64(16);
+static constexpr Gp x17 = Gp::make_r64(17);
+static constexpr Gp x18 = Gp::make_r64(18);
+static constexpr Gp x19 = Gp::make_r64(19);
+static constexpr Gp x20 = Gp::make_r64(20);
+static constexpr Gp x21 = Gp::make_r64(21);
+static constexpr Gp x22 = Gp::make_r64(22);
+static constexpr Gp x23 = Gp::make_r64(23);
+static constexpr Gp x24 = Gp::make_r64(24);
+static constexpr Gp x25 = Gp::make_r64(25);
+static constexpr Gp x26 = Gp::make_r64(26);
+static constexpr Gp x27 = Gp::make_r64(27);
+static constexpr Gp x28 = Gp::make_r64(28);
+static constexpr Gp x29 = Gp::make_r64(29);
+static constexpr Gp x30 = Gp::make_r64(30);
+static constexpr Gp xzr = Gp::make_r64(Gp::kIdZr);
+static constexpr Gp sp = Gp::make_r64(Gp::kIdSp);
+
+static constexpr Vec b0 = Vec::make_v8(0);
+static constexpr Vec b1 = Vec::make_v8(1);
+static constexpr Vec b2 = Vec::make_v8(2);
+static constexpr Vec b3 = Vec::make_v8(3);
+static constexpr Vec b4 = Vec::make_v8(4);
+static constexpr Vec b5 = Vec::make_v8(5);
+static constexpr Vec b6 = Vec::make_v8(6);
+static constexpr Vec b7 = Vec::make_v8(7);
+static constexpr Vec b8 = Vec::make_v8(8);
+static constexpr Vec b9 = Vec::make_v8(9);
+static constexpr Vec b10 = Vec::make_v8(10);
+static constexpr Vec b11 = Vec::make_v8(11);
+static constexpr Vec b12 = Vec::make_v8(12);
+static constexpr Vec b13 = Vec::make_v8(13);
+static constexpr Vec b14 = Vec::make_v8(14);
+static constexpr Vec b15 = Vec::make_v8(15);
+static constexpr Vec b16 = Vec::make_v8(16);
+static constexpr Vec b17 = Vec::make_v8(17);
+static constexpr Vec b18 = Vec::make_v8(18);
+static constexpr Vec b19 = Vec::make_v8(19);
+static constexpr Vec b20 = Vec::make_v8(20);
+static constexpr Vec b21 = Vec::make_v8(21);
+static constexpr Vec b22 = Vec::make_v8(22);
+static constexpr Vec b23 = Vec::make_v8(23);
+static constexpr Vec b24 = Vec::make_v8(24);
+static constexpr Vec b25 = Vec::make_v8(25);
+static constexpr Vec b26 = Vec::make_v8(26);
+static constexpr Vec b27 = Vec::make_v8(27);
+static constexpr Vec b28 = Vec::make_v8(28);
+static constexpr Vec b29 = Vec::make_v8(29);
+static constexpr Vec b30 = Vec::make_v8(30);
+static constexpr Vec b31 = Vec::make_v8(31);
+
+static constexpr Vec h0 = Vec::make_v16(0);
+static constexpr Vec h1 = Vec::make_v16(1);
+static constexpr Vec h2 = Vec::make_v16(2);
+static constexpr Vec h3 = Vec::make_v16(3);
+static constexpr Vec h4 = Vec::make_v16(4);
+static constexpr Vec h5 = Vec::make_v16(5);
+static constexpr Vec h6 = Vec::make_v16(6);
+static constexpr Vec h7 = Vec::make_v16(7);
+static constexpr Vec h8 = Vec::make_v16(8);
+static constexpr Vec h9 = Vec::make_v16(9);
+static constexpr Vec h10 = Vec::make_v16(10);
+static constexpr Vec h11 = Vec::make_v16(11);
+static constexpr Vec h12 = Vec::make_v16(12);
+static constexpr Vec h13 = Vec::make_v16(13);
+static constexpr Vec h14 = Vec::make_v16(14);
+static constexpr Vec h15 = Vec::make_v16(15);
+static constexpr Vec h16 = Vec::make_v16(16);
+static constexpr Vec h17 = Vec::make_v16(17);
+static constexpr Vec h18 = Vec::make_v16(18);
+static constexpr Vec h19 = Vec::make_v16(19);
+static constexpr Vec h20 = Vec::make_v16(20);
+static constexpr Vec h21 = Vec::make_v16(21);
+static constexpr Vec h22 = Vec::make_v16(22);
+static constexpr Vec h23 = Vec::make_v16(23);
+static constexpr Vec h24 = Vec::make_v16(24);
+static constexpr Vec h25 = Vec::make_v16(25);
+static constexpr Vec h26 = Vec::make_v16(26);
+static constexpr Vec h27 = Vec::make_v16(27);
+static constexpr Vec h28 = Vec::make_v16(28);
+static constexpr Vec h29 = Vec::make_v16(29);
+static constexpr Vec h30 = Vec::make_v16(30);
+static constexpr Vec h31 = Vec::make_v16(31);
+
+static constexpr Vec s0 = Vec::make_v32(0);
+static constexpr Vec s1 = Vec::make_v32(1);
+static constexpr Vec s2 = Vec::make_v32(2);
+static constexpr Vec s3 = Vec::make_v32(3);
+static constexpr Vec s4 = Vec::make_v32(4);
+static constexpr Vec s5 = Vec::make_v32(5);
+static constexpr Vec s6 = Vec::make_v32(6);
+static constexpr Vec s7 = Vec::make_v32(7);
+static constexpr Vec s8 = Vec::make_v32(8);
+static constexpr Vec s9 = Vec::make_v32(9);
+static constexpr Vec s10 = Vec::make_v32(10);
+static constexpr Vec s11 = Vec::make_v32(11);
+static constexpr Vec s12 = Vec::make_v32(12);
+static constexpr Vec s13 = Vec::make_v32(13);
+static constexpr Vec s14 = Vec::make_v32(14);
+static constexpr Vec s15 = Vec::make_v32(15);
+static constexpr Vec s16 = Vec::make_v32(16);
+static constexpr Vec s17 = Vec::make_v32(17);
+static constexpr Vec s18 = Vec::make_v32(18);
+static constexpr Vec s19 = Vec::make_v32(19);
+static constexpr Vec s20 = Vec::make_v32(20);
+static constexpr Vec s21 = Vec::make_v32(21);
+static constexpr Vec s22 = Vec::make_v32(22);
+static constexpr Vec s23 = Vec::make_v32(23);
+static constexpr Vec s24 = Vec::make_v32(24);
+static constexpr Vec s25 = Vec::make_v32(25);
+static constexpr Vec s26 = Vec::make_v32(26);
+static constexpr Vec s27 = Vec::make_v32(27);
+static constexpr Vec s28 = Vec::make_v32(28);
+static constexpr Vec s29 = Vec::make_v32(29);
+static constexpr Vec s30 = Vec::make_v32(30);
+static constexpr Vec s31 = Vec::make_v32(31);
+
+static constexpr Vec d0 = Vec::make_v64(0);
+static constexpr Vec d1 = Vec::make_v64(1);
+static constexpr Vec d2 = Vec::make_v64(2);
+static constexpr Vec d3 = Vec::make_v64(3);
+static constexpr Vec d4 = Vec::make_v64(4);
+static constexpr Vec d5 = Vec::make_v64(5);
+static constexpr Vec d6 = Vec::make_v64(6);
+static constexpr Vec d7 = Vec::make_v64(7);
+static constexpr Vec d8 = Vec::make_v64(8);
+static constexpr Vec d9 = Vec::make_v64(9);
+static constexpr Vec d10 = Vec::make_v64(10);
+static constexpr Vec d11 = Vec::make_v64(11);
+static constexpr Vec d12 = Vec::make_v64(12);
+static constexpr Vec d13 = Vec::make_v64(13);
+static constexpr Vec d14 = Vec::make_v64(14);
+static constexpr Vec d15 = Vec::make_v64(15);
+static constexpr Vec d16 = Vec::make_v64(16);
+static constexpr Vec d17 = Vec::make_v64(17);
+static constexpr Vec d18 = Vec::make_v64(18);
+static constexpr Vec d19 = Vec::make_v64(19);
+static constexpr Vec d20 = Vec::make_v64(20);
+static constexpr Vec d21 = Vec::make_v64(21);
+static constexpr Vec d22 = Vec::make_v64(22);
+static constexpr Vec d23 = Vec::make_v64(23);
+static constexpr Vec d24 = Vec::make_v64(24);
+static constexpr Vec d25 = Vec::make_v64(25);
+static constexpr Vec d26 = Vec::make_v64(26);
+static constexpr Vec d27 = Vec::make_v64(27);
+static constexpr Vec d28 = Vec::make_v64(28);
+static constexpr Vec d29 = Vec::make_v64(29);
+static constexpr Vec d30 = Vec::make_v64(30);
+static constexpr Vec d31 = Vec::make_v64(31);
+
+static constexpr Vec q0 = Vec::make_v128(0);
+static constexpr Vec q1 = Vec::make_v128(1);
+static constexpr Vec q2 = Vec::make_v128(2);
+static constexpr Vec q3 = Vec::make_v128(3);
+static constexpr Vec q4 = Vec::make_v128(4);
+static constexpr Vec q5 = Vec::make_v128(5);
+static constexpr Vec q6 = Vec::make_v128(6);
+static constexpr Vec q7 = Vec::make_v128(7);
+static constexpr Vec q8 = Vec::make_v128(8);
+static constexpr Vec q9 = Vec::make_v128(9);
+static constexpr Vec q10 = Vec::make_v128(10);
+static constexpr Vec q11 = Vec::make_v128(11);
+static constexpr Vec q12 = Vec::make_v128(12);
+static constexpr Vec q13 = Vec::make_v128(13);
+static constexpr Vec q14 = Vec::make_v128(14);
+static constexpr Vec q15 = Vec::make_v128(15);
+static constexpr Vec q16 = Vec::make_v128(16);
+static constexpr Vec q17 = Vec::make_v128(17);
+static constexpr Vec q18 = Vec::make_v128(18);
+static constexpr Vec q19 = Vec::make_v128(19);
+static constexpr Vec q20 = Vec::make_v128(20);
+static constexpr Vec q21 = Vec::make_v128(21);
+static constexpr Vec q22 = Vec::make_v128(22);
+static constexpr Vec q23 = Vec::make_v128(23);
+static constexpr Vec q24 = Vec::make_v128(24);
+static constexpr Vec q25 = Vec::make_v128(25);
+static constexpr Vec q26 = Vec::make_v128(26);
+static constexpr Vec q27 = Vec::make_v128(27);
+static constexpr Vec q28 = Vec::make_v128(28);
+static constexpr Vec q29 = Vec::make_v128(29);
+static constexpr Vec q30 = Vec::make_v128(30);
+static constexpr Vec q31 = Vec::make_v128(31);
+
+static constexpr Vec v0 = Vec::make_v128(0);
+static constexpr Vec v1 = Vec::make_v128(1);
+static constexpr Vec v2 = Vec::make_v128(2);
+static constexpr Vec v3 = Vec::make_v128(3);
+static constexpr Vec v4 = Vec::make_v128(4);
+static constexpr Vec v5 = Vec::make_v128(5);
+static constexpr Vec v6 = Vec::make_v128(6);
+static constexpr Vec v7 = Vec::make_v128(7);
+static constexpr Vec v8 = Vec::make_v128(8);
+static constexpr Vec v9 = Vec::make_v128(9);
+static constexpr Vec v10 = Vec::make_v128(10);
+static constexpr Vec v11 = Vec::make_v128(11);
+static constexpr Vec v12 = Vec::make_v128(12);
+static constexpr Vec v13 = Vec::make_v128(13);
+static constexpr Vec v14 = Vec::make_v128(14);
+static constexpr Vec v15 = Vec::make_v128(15);
+static constexpr Vec v16 = Vec::make_v128(16);
+static constexpr Vec v17 = Vec::make_v128(17);
+static constexpr Vec v18 = Vec::make_v128(18);
+static constexpr Vec v19 = Vec::make_v128(19);
+static constexpr Vec v20 = Vec::make_v128(20);
+static constexpr Vec v21 = Vec::make_v128(21);
+static constexpr Vec v22 = Vec::make_v128(22);
+static constexpr Vec v23 = Vec::make_v128(23);
+static constexpr Vec v24 = Vec::make_v128(24);
+static constexpr Vec v25 = Vec::make_v128(25);
+static constexpr Vec v26 = Vec::make_v128(26);
+static constexpr Vec v27 = Vec::make_v128(27);
+static constexpr Vec v28 = Vec::make_v128(28);
+static constexpr Vec v29 = Vec::make_v128(29);
+static constexpr Vec v30 = Vec::make_v128(30);
+static constexpr Vec v31 = Vec::make_v128(31);
+
+#ifndef _DOXYGEN
+} // {regs}
+
+// Make `a64::regs` accessible through `a64` namespace as well.
+using namespace regs;
+#endif
+
+//! \name Shift Operation Construction
+//! \{
+
+//! Constructs a `LSL #value` shift (logical shift left).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); }
+
+//! Constructs a `LSR #value` shift (logical shift right).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); }
+
+//! Constructs a `ASR #value` shift (arithmetic shift right).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); }
+
+//! Constructs a `ROR #value` shift (rotate right).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); }
+
+//! Constructs a `RRX` shift (rotate with carry by 1).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); }
+
+//! Constructs a `MSL #value` shift (logical shift left filling ones).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); }
+
+//! Constructs a `UXTB #value` extend and shift (unsigned byte extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); }
+
+//! Constructs a `UXTH #value` extend and shift (unsigned hword extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); }
+
+//! Constructs a `UXTW #value` extend and shift (unsigned word extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); }
+
+//! Constructs a `UXTX #value` extend and shift (unsigned dword extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); }
+
+//! Constructs a `SXTB #value` extend and shift (signed byte extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); }
+
+//! Constructs a `SXTH #value` extend and shift (signed hword extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); }
+
+//! Constructs a `SXTW #value` extend and shift (signed word extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); }
+
+//! Constructs a `SXTX #value` extend and shift (signed dword extend) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); }
+
+//! \}
+
+//! \name Memory Operand Construction
+//! \{
+
+//! Creates `[base, offset]` memory operand (offset mode) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Gp& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset);
+}
+
+//! Creates `[base, offset]!` memory operand (pre-index mode) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset, OperandSignature::from_value<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPreIndex));
+}
+
+//! Creates `[base], offset` memory operand (post-index mode) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset, OperandSignature::from_value<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPostIndex));
+}
+
+//! Creates `[base, index]` memory operand (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Gp& base, const Gp& index) noexcept {
+ return Mem(base, index);
+}
+
+//! Creates `[base, index]!` memory operand (pre-index mode) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_pre(const Gp& base, const Gp& index) noexcept {
+ return Mem(base, index, OperandSignature::from_value<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPreIndex));
+}
+
+//! Creates `[base], index` memory operand (post-index mode) (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_post(const Gp& base, const Gp& index) noexcept {
+ return Mem(base, index, OperandSignature::from_value<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPostIndex));
+}
+
+//! Creates `[base, index, SHIFT_OP #shift]` memory operand (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept {
+ return Mem(base, index, shift);
+}
+
+//! Creates `[base, offset]` memory operand (AArch64).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Label& base, int32_t offset = 0) noexcept {
+ return Mem(base, offset);
+}
+
+//! Creates `[base]` absolute memory operand (AArch32 or AArch64).
+//!
+//! \note The concept of absolute memory operands doesn't exist on ARM, the ISA only provides PC relative addressing.
+//! Absolute memory operands can only be used if it's known that the PC relative offset is encodable and that it
+//! would be within the limits. Absolute address is also often output from disassemblers, so AsmJit supports it to
+//! make it possible to assemble such output back.
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(uint64_t base) noexcept { return Mem(base); }
+
+// TODO: [ARM] PC + offset address.
+#if 0
+//! Creates `[PC + offset]` (relative) memory operand.
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const PC& pc, int32_t offset = 0) noexcept {
+ return Mem(pc, offset);
+}
+#endif
+
+//! \}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_A64OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/a64rapass.cpp b/3rdparty/asmjit/asmjit/arm/a64rapass.cpp
new file mode 100644
index 00000000000..9dbd00488d8
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64rapass.cpp
@@ -0,0 +1,909 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_COMPILER)
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/a64assembler.h>
+#include <asmjit/arm/a64compiler.h>
+#include <asmjit/arm/a64emithelper_p.h>
+#include <asmjit/arm/a64instapi_p.h>
+#include <asmjit/arm/a64instdb_p.h>
+#include <asmjit/arm/a64rapass_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+// a64::ARMRAPass - Helpers
+// ========================
+
+// TODO: [ARM] These should be shared with all backends.
+[[maybe_unused]]
+static inline uint64_t ra_imm_mask_from_size(uint32_t size) noexcept {
+ ASMJIT_ASSERT(size > 0 && size < 256);
+ static const uint64_t masks[] = {
+ 0x00000000000000FFu, // 1
+ 0x000000000000FFFFu, // 2
+ 0x00000000FFFFFFFFu, // 4
+ 0xFFFFFFFFFFFFFFFFu, // 8
+ 0x0000000000000000u, // 16
+ 0x0000000000000000u, // 32
+ 0x0000000000000000u, // 64
+ 0x0000000000000000u, // 128
+ 0x0000000000000000u // 256
+ };
+ return masks[Support::ctz(size)];
+}
+
+static const RegMask ra_consecutive_lead_count_to_reg_mask_filter[5] = {
+ 0xFFFFFFFFu, // [0] No consecutive.
+ 0x00000000u, // [1] Invalid, never used.
+ 0x7FFFFFFFu, // [2] 2 consecutive registers.
+ 0x3FFFFFFFu, // [3] 3 consecutive registers.
+ 0x1FFFFFFFu // [4] 4 consecutive registers.
+};
+
+[[nodiscard]]
+static inline RATiedFlags ra_use_out_flags_from_rw_flags(OpRWFlags rw_flags) noexcept {
+ static constexpr RATiedFlags map[] = {
+ RATiedFlags::kNone,
+ RATiedFlags::kRead | RATiedFlags::kUse, // kRead
+ RATiedFlags::kWrite | RATiedFlags::kOut, // kWrite
+ RATiedFlags::kRW | RATiedFlags::kUse, // kRW
+ };
+
+ return map[uint32_t(rw_flags & OpRWFlags::kRW)];
+}
+
+[[nodiscard]]
+static inline RATiedFlags ra_reg_rw_flags(OpRWFlags flags) noexcept {
+ return ra_use_out_flags_from_rw_flags(flags);
+}
+
+[[nodiscard]]
+static inline RATiedFlags ra_mem_base_rw_flags(OpRWFlags flags) noexcept {
+ constexpr uint32_t shift = Support::ctz_const<OpRWFlags::kMemBaseRW>;
+ return ra_use_out_flags_from_rw_flags(OpRWFlags(uint32_t(flags) >> shift) & OpRWFlags::kRW);
+}
+
+[[nodiscard]]
+static inline RATiedFlags ra_mem_index_rw_flags(OpRWFlags flags) noexcept {
+ constexpr uint32_t shift = Support::ctz_const<OpRWFlags::kMemIndexRW>;
+ return ra_use_out_flags_from_rw_flags(OpRWFlags(uint32_t(flags) >> shift) & OpRWFlags::kRW);
+}
+// a64::RACFGBuilder
+// =================
+
+class RACFGBuilder : public RACFGBuilderT<RACFGBuilder> {
+public:
+ Arch _arch;
+
+ inline RACFGBuilder(ARMRAPass& pass) noexcept
+ : RACFGBuilderT<RACFGBuilder>(pass),
+ _arch(pass.cc().arch()) {}
+
+ [[nodiscard]]
+ inline Compiler& cc() const noexcept { return static_cast<Compiler&>(_cc); }
+
+ [[nodiscard]]
+ Error on_instruction(InstNode* inst, InstControlFlow& control_type, RAInstBuilder& ib) noexcept;
+
+ [[nodiscard]]
+ Error on_before_invoke(InvokeNode* invoke_node) noexcept;
+
+ [[nodiscard]]
+ Error on_invoke(InvokeNode* invoke_node, RAInstBuilder& ib) noexcept;
+
+ [[nodiscard]]
+ Error move_imm_to_reg_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_, Out<Reg> out) noexcept;
+
+ [[nodiscard]]
+ Error move_imm_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_) noexcept;
+
+ [[nodiscard]]
+ Error move_reg_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Reg& reg) noexcept;
+
+ [[nodiscard]]
+ Error on_before_ret(FuncRetNode* func_ret) noexcept;
+
+ [[nodiscard]]
+ Error on_ret(FuncRetNode* func_ret, RAInstBuilder& ib) noexcept;
+};
+
+// a64::RACFGBuilder - OnInst
+// ==========================
+
+// TODO: [ARM] This is just a workaround...
+static InstControlFlow get_control_flow_type(InstId inst_id) noexcept {
+ switch (BaseInst::extract_real_id(inst_id)) {
+ case Inst::kIdB:
+ case Inst::kIdBr:
+ if (BaseInst::extract_arm_cond_code(inst_id) == CondCode::kAL) {
+ return InstControlFlow::kJump;
+ }
+ else {
+ return InstControlFlow::kBranch;
+ }
+
+ case Inst::kIdBl:
+ case Inst::kIdBlr:
+ return InstControlFlow::kCall;
+
+ case Inst::kIdCbz:
+ case Inst::kIdCbnz:
+ case Inst::kIdTbz:
+ case Inst::kIdTbnz:
+ return InstControlFlow::kBranch;
+
+ case Inst::kIdRet:
+ return InstControlFlow::kReturn;
+
+ default:
+ return InstControlFlow::kRegular;
+ }
+}
+
+Error RACFGBuilder::on_instruction(InstNode* inst, InstControlFlow& control_type, RAInstBuilder& ib) noexcept {
+ InstRWInfo rw_info;
+
+ if (Inst::is_defined_id(inst->real_id())) {
+ InstId inst_id = inst->inst_id();
+ Span<const Operand> operands = inst->operands();
+
+ ASMJIT_PROPAGATE(InstInternal::query_rw_info(inst->baseInst(), operands.data(), operands.size(), &rw_info));
+
+ const InstDB::InstInfo& inst_info = InstDB::inst_info_by_id(inst_id);
+ uint32_t single_reg_ops = 0;
+
+ ib.add_inst_rw_flags(rw_info.inst_flags());
+
+ if (!operands.is_empty()) {
+ uint32_t consecutive_offset = 0xFFFFFFFFu;
+ RAWorkReg* consecutive_parent = nullptr;
+
+ for (size_t i = 0u; i < operands.size(); i++) {
+ const Operand& op = operands[i];
+ const OpRWInfo& op_rw_info = rw_info.operand(i);
+
+ if (op.is_reg()) {
+ // Register Operand
+ // ----------------
+ const Reg& reg = op.as<Reg>();
+
+ RATiedFlags flags = ra_reg_rw_flags(op_rw_info.op_flags());
+ uint32_t virt_index = Operand::virt_id_to_index(reg.id());
+
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ // Use RW instead of Write in case that not the whole register is overwritten. This is important for
+ // liveness as we cannot kill a register that will be used.
+ if ((flags & RATiedFlags::kRW) == RATiedFlags::kWrite) {
+ if (work_reg->reg_byte_mask() & ~(op_rw_info.write_byte_mask() | op_rw_info.extend_byte_mask())) {
+ // Not write-only operation.
+ flags = (flags & ~RATiedFlags::kOut) | (RATiedFlags::kRead | RATiedFlags::kUse);
+ }
+ }
+
+ RegGroup group = work_reg->group();
+
+ RegMask use_regs = _pass._available_regs[group];
+ RegMask out_regs = use_regs;
+
+ uint32_t use_id = Reg::kIdBad;
+ uint32_t out_id = Reg::kIdBad;
+
+ uint32_t use_rewrite_mask = 0;
+ uint32_t out_rewrite_mask = 0;
+
+ if (op_rw_info.consecutive_lead_count()) {
+ // There must be a single consecutive register lead, otherwise the RW data is invalid.
+ if (consecutive_offset != 0xFFFFFFFFu) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // A consecutive lead register cannot be used as a consecutive +1/+2/+3 register, the registers must be distinct.
+ if (RATiedReg::consecutive_data_from_flags(flags) != 0) {
+ return make_error(Error::kNotConsecutiveRegs);
+ }
+
+ flags |= RATiedFlags::kLeadConsecutive | RATiedReg::consecutive_data_to_flags(op_rw_info.consecutive_lead_count() - 1);
+ consecutive_offset = 0;
+
+ RegMask filter = ra_consecutive_lead_count_to_reg_mask_filter[op_rw_info.consecutive_lead_count()];
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ flags |= RATiedFlags::kUseConsecutive;
+ use_regs &= filter;
+ }
+ else {
+ flags |= RATiedFlags::kOutConsecutive;
+ out_regs &= filter;
+ }
+ }
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&reg._base_id));
+ if (op_rw_info.has_op_flag(OpRWFlags::kRegPhysId)) {
+ use_id = op_rw_info.phys_id();
+ flags |= RATiedFlags::kUseFixed;
+ }
+ else if (op_rw_info.has_op_flag(OpRWFlags::kConsecutive)) {
+ if (consecutive_offset == 0xFFFFFFFFu) {
+ return make_error(Error::kInvalidState);
+ }
+ flags |= RATiedFlags::kUseConsecutive | RATiedReg::consecutive_data_to_flags(++consecutive_offset);
+ }
+ }
+ else {
+ out_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&reg._base_id));
+ if (op_rw_info.has_op_flag(OpRWFlags::kRegPhysId)) {
+ out_id = op_rw_info.phys_id();
+ flags |= RATiedFlags::kOutFixed;
+ }
+ else if (op_rw_info.has_op_flag(OpRWFlags::kConsecutive)) {
+ if (consecutive_offset == 0xFFFFFFFFu) {
+ return make_error(Error::kInvalidState);
+ }
+ flags |= RATiedFlags::kOutConsecutive | RATiedReg::consecutive_data_to_flags(++consecutive_offset);
+ }
+ }
+
+ // Special cases regarding element access.
+ if (reg.as<Vec>().has_element_index()) {
+ // Only the first 0..15 registers can be used if the register uses
+ // element accessor that accesses half-words (h[0..7] elements).
+ if (inst_info.has_flag(InstDB::kInstFlagVH0_15) && reg.as<Vec>().element_type() == VecElementType::kH) {
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_id &= 0x0000FFFFu;
+ }
+ else {
+ out_id &= 0x0000FFFFu;
+ }
+ }
+ }
+
+ ASMJIT_PROPAGATE(ib.add(work_reg, flags, use_regs, use_id, use_rewrite_mask, out_regs, out_id, out_rewrite_mask, op_rw_info.rm_size(), consecutive_parent));
+ if (single_reg_ops == i) {
+ single_reg_ops++;
+ }
+
+ if (Support::test(flags, RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive)) {
+ consecutive_parent = work_reg;
+ }
+ }
+ }
+ else if (op.is_mem()) {
+ // Memory Operand
+ // --------------
+ const Mem& mem = op.as<Mem>();
+
+ if (mem.is_reg_home()) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(mem.base_id())));
+ if (ASMJIT_UNLIKELY(!_pass.get_or_create_stack_slot(work_reg))) {
+ return make_error(Error::kOutOfMemory);
+ }
+ }
+ else if (mem.has_base_reg()) {
+ uint32_t virt_index = Operand::virt_id_to_index(mem.base_id());
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RATiedFlags flags = ra_mem_base_rw_flags(op_rw_info.op_flags());
+ RegGroup group = work_reg->group();
+ RegMask allocable = _pass._available_regs[group];
+
+ // Base registers have never fixed id on ARM.
+ const uint32_t use_id = Reg::kIdBad;
+ const uint32_t out_id = Reg::kIdBad;
+
+ uint32_t use_rewrite_mask = 0;
+ uint32_t out_rewrite_mask = 0;
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._base_id));
+ }
+ else {
+ out_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._base_id));
+ }
+
+ ASMJIT_PROPAGATE(ib.add(work_reg, flags, allocable, use_id, use_rewrite_mask, allocable, out_id, out_rewrite_mask));
+ }
+ }
+
+ if (mem.has_index_reg()) {
+ uint32_t virt_index = Operand::virt_id_to_index(mem.index_id());
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RATiedFlags flags = ra_mem_index_rw_flags(op_rw_info.op_flags());
+ RegGroup group = work_reg->group();
+ RegMask allocable = _pass._available_regs[group];
+
+ // Index registers have never fixed id on ARM.
+ const uint32_t use_id = Reg::kIdBad;
+ const uint32_t out_id = Reg::kIdBad;
+
+ uint32_t use_rewrite_mask = 0;
+ uint32_t out_rewrite_mask = 0;
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._data[Operand::kDataMemIndexId]));
+ }
+ else {
+ out_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._data[Operand::kDataMemIndexId]));
+ }
+
+ ASMJIT_PROPAGATE(ib.add(work_reg, RATiedFlags::kUse | RATiedFlags::kRead, allocable, use_id, use_rewrite_mask, allocable, out_id, out_rewrite_mask));
+ }
+ }
+ }
+ }
+ }
+
+ control_type = get_control_flow_type(inst_id);
+ }
+
+ return Error::kOk;
+}
+
+// a64::RACFGBuilder - OnInvoke
+// ============================
+
+Error RACFGBuilder::on_before_invoke(InvokeNode* invoke_node) noexcept {
+ const FuncDetail& fd = invoke_node->detail();
+ uint32_t arg_count = invoke_node->arg_count();
+
+ cc().set_cursor(invoke_node->prev());
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ const FuncValuePack& arg_pack = fd.arg_pack(arg_index);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ if (!arg_pack[value_index])
+ break;
+
+ const FuncValue& arg = arg_pack[value_index];
+ const Operand& op = invoke_node->arg(arg_index, value_index);
+
+ if (op.is_none())
+ continue;
+
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (arg.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup arg_group = RegUtils::group_of(arg.reg_type());
+
+ if (reg_group != arg_group) {
+ // TODO: [ARM] Conversion is not supported.
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ else {
+ ASMJIT_PROPAGATE(move_reg_to_stack_arg(invoke_node, arg, reg));
+ }
+ }
+ else if (op.is_imm()) {
+ if (arg.is_reg()) {
+ Reg reg;
+ ASMJIT_PROPAGATE(move_imm_to_reg_arg(invoke_node, arg, op.as<Imm>(), Out(reg)));
+ invoke_node->_args[arg_index][value_index] = reg;
+ }
+ else {
+ ASMJIT_PROPAGATE(move_imm_to_stack_arg(invoke_node, arg, op.as<Imm>()));
+ }
+ }
+ }
+ }
+
+ cc().set_cursor(invoke_node);
+
+ if (fd.has_ret()) {
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ const FuncValue& ret = fd.ret(value_index);
+ if (!ret) {
+ break;
+ }
+
+ const Operand& op = invoke_node->ret(value_index);
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (ret.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup ret_group = RegUtils::group_of(ret.reg_type());
+
+ if (reg_group != ret_group) {
+ // TODO: [ARM] Conversion is not supported.
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ }
+ }
+ }
+
+ // This block has function call(s).
+ _cur_block->add_flags(RABlockFlags::kHasFuncCalls);
+ _pass.func()->frame().add_attributes(FuncAttributes::kHasFuncCalls);
+ _pass.func()->frame().update_call_stack_size(fd.arg_stack_size());
+
+ return Error::kOk;
+}
+
+Error RACFGBuilder::on_invoke(InvokeNode* invoke_node, RAInstBuilder& ib) noexcept {
+ uint32_t arg_count = invoke_node->arg_count();
+ const FuncDetail& fd = invoke_node->detail();
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ const FuncValuePack& arg_pack = fd.arg_pack(arg_index);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ if (!arg_pack[value_index]) {
+ continue;
+ }
+
+ const FuncValue& arg = arg_pack[value_index];
+ const Operand& op = invoke_node->arg(arg_index, value_index);
+
+ if (op.is_none()) {
+ continue;
+ }
+
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (arg.is_indirect()) {
+ RegGroup reg_group = work_reg->group();
+ if (reg_group != RegGroup::kGp) {
+ return make_error(Error::kInvalidState);
+ }
+ ASMJIT_PROPAGATE(ib.add_call_arg(work_reg, arg.reg_id()));
+ }
+ else if (arg.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup arg_group = RegUtils::group_of(arg.reg_type());
+
+ if (reg_group == arg_group) {
+ ASMJIT_PROPAGATE(ib.add_call_arg(work_reg, arg.reg_id()));
+ }
+ }
+ }
+ }
+ }
+
+ for (uint32_t ret_index = 0; ret_index < Globals::kMaxValuePack; ret_index++) {
+ const FuncValue& ret = fd.ret(ret_index);
+ if (!ret) {
+ break;
+ }
+
+ const Operand& op = invoke_node->ret(ret_index);
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (ret.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup ret_group = RegUtils::group_of(ret.reg_type());
+
+ if (reg_group == ret_group) {
+ ASMJIT_PROPAGATE(ib.add_call_ret(work_reg, ret.reg_id()));
+ }
+ }
+ else {
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ }
+
+ // Setup clobbered registers.
+ ib._clobbered[0] = Support::lsb_mask<RegMask>(_pass._phys_reg_count.get(RegGroup(0))) & ~fd.preserved_regs(RegGroup(0));
+ ib._clobbered[1] = Support::lsb_mask<RegMask>(_pass._phys_reg_count.get(RegGroup(1))) & ~fd.preserved_regs(RegGroup(1));
+ ib._clobbered[2] = Support::lsb_mask<RegMask>(_pass._phys_reg_count.get(RegGroup(2))) & ~fd.preserved_regs(RegGroup(2));
+ ib._clobbered[3] = Support::lsb_mask<RegMask>(_pass._phys_reg_count.get(RegGroup(3))) & ~fd.preserved_regs(RegGroup(3));
+
+ return Error::kOk;
+}
+
+// a64::RACFGBuilder - MoveImmToRegArg
+// ===================================
+
+Error RACFGBuilder::move_imm_to_reg_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_, Out<Reg> out) noexcept {
+ Support::maybe_unused(invoke_node);
+ ASMJIT_ASSERT(arg.is_reg());
+
+ Imm imm(imm_);
+ TypeId type_id = TypeId::kVoid;
+
+ switch (arg.type_id()) {
+ case TypeId::kInt8 : type_id = TypeId::kUInt64; imm.sign_extend_int8(); break;
+ case TypeId::kUInt8 : type_id = TypeId::kUInt64; imm.zero_extend_uint8(); break;
+ case TypeId::kInt16 : type_id = TypeId::kUInt64; imm.sign_extend_int16(); break;
+ case TypeId::kUInt16: type_id = TypeId::kUInt64; imm.zero_extend_uint16(); break;
+ case TypeId::kInt32 : type_id = TypeId::kUInt64; imm.sign_extend_int32(); break;
+ case TypeId::kUInt32: type_id = TypeId::kUInt64; imm.zero_extend_uint32(); break;
+ case TypeId::kInt64 : type_id = TypeId::kUInt64; break;
+ case TypeId::kUInt64: type_id = TypeId::kUInt64; break;
+
+ default:
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ ASMJIT_PROPAGATE(cc()._new_reg(out, type_id, nullptr));
+ cc().virt_reg_by_id(out->id())->set_weight(BaseRAPass::kCallArgWeight);
+ return cc().mov(out->as<Gp>(), imm);
+}
+
+// a64::RACFGBuilder - MoveImmToStackArg
+// =====================================
+
+Error RACFGBuilder::move_imm_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_) noexcept {
+ Reg reg;
+
+ ASMJIT_PROPAGATE(move_imm_to_reg_arg(invoke_node, arg, imm_, Out(reg)));
+ ASMJIT_PROPAGATE(move_reg_to_stack_arg(invoke_node, arg, reg));
+
+ return Error::kOk;
+}
+
+// a64::RACFGBuilder - MoveRegToStackArg
+// =====================================
+
+Error RACFGBuilder::move_reg_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Reg& reg) noexcept {
+ Support::maybe_unused(invoke_node);
+ Mem stack_ptr = ptr(_pass._sp.as<Gp>(), arg.stack_offset());
+
+ if (reg.is_gp()) {
+ return cc().str(reg.as<Gp>(), stack_ptr);
+ }
+
+ if (reg.is_vec()) {
+ return cc().str(reg.as<Vec>(), stack_ptr);
+ }
+
+ return make_error(Error::kInvalidState);
+}
+
+// a64::RACFGBuilder - OnReg
+// =========================
+
+Error RACFGBuilder::on_before_ret(FuncRetNode* func_ret) noexcept {
+ Support::maybe_unused(func_ret);
+ return Error::kOk;
+}
+
+Error RACFGBuilder::on_ret(FuncRetNode* func_ret, RAInstBuilder& ib) noexcept {
+ const FuncDetail& func_detail = _pass.func()->detail();
+ Span<const Operand> operands = func_ret->operands();
+
+ for (size_t i = 0; i < operands.size(); i++) {
+ const Operand& op = operands[i];
+ if (op.is_none()) {
+ continue;
+ }
+
+ const FuncValue& ret = func_detail.ret(i);
+ if (ASMJIT_UNLIKELY(!ret.is_reg())) {
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ if (op.is_reg()) {
+ // Register return value.
+ const Reg& reg = op.as<Reg>();
+ uint32_t virt_index = Operand::virt_id_to_index(reg.id());
+
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RegGroup group = work_reg->group();
+ RegMask allocable = _pass._available_regs[group];
+ ASMJIT_PROPAGATE(ib.add(work_reg, RATiedFlags::kUse | RATiedFlags::kRead, allocable, ret.reg_id(), 0, 0, Reg::kIdBad, 0));
+ }
+ }
+ else {
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+
+ return Error::kOk;
+}
+
+// a64::ARMRAPass - Construction & Destruction
+// ===========================================
+
+ARMRAPass::ARMRAPass(BaseCompiler& cc) noexcept
+ : BaseRAPass(cc) { _emit_helper_ptr = &_emit_helper; }
+ARMRAPass::~ARMRAPass() noexcept {}
+
+// a64::ARMRAPass - OnInit / OnDone
+// ================================
+
+void ARMRAPass::on_init() noexcept {
+ Arch arch = cc().arch();
+
+ _emit_helper.reset(&_cb);
+ _arch_traits = &ArchTraits::by_arch(arch);
+ _phys_reg_count.set(RegGroup::kGp, 32);
+ _phys_reg_count.set(RegGroup::kVec, 32);
+ _phys_reg_count.set(RegGroup::kMask, 0);
+ _phys_reg_count.set(RegGroup::kExtra, 0);
+ _build_phys_index();
+
+ _available_regs[RegGroup::kGp] = Support::lsb_mask<uint32_t>(_phys_reg_count.get(RegGroup::kGp));
+ _available_regs[RegGroup::kVec] = Support::lsb_mask<uint32_t>(_phys_reg_count.get(RegGroup::kVec));
+ _available_regs[RegGroup::kMask] = Support::lsb_mask<uint32_t>(_phys_reg_count.get(RegGroup::kMask));
+ _available_regs[RegGroup::kExtra] = Support::lsb_mask<uint32_t>(_phys_reg_count.get(RegGroup::kExtra));
+
+ _scratch_reg_indexes[0] = uint8_t(27);
+ _scratch_reg_indexes[1] = uint8_t(28);
+
+ const FuncFrame& frame = _func->frame();
+
+ // The architecture specific setup makes implicitly all registers available. So
+ // make unavailable all registers that are special and cannot be used in general.
+ bool has_preserved_fp = frame.has_preserved_fp();
+
+ // Apple ABI requires that the frame-pointer register is not changed by leaf functions and properly updated
+ // by non-leaf functions. So, let's make this register unavailable as it's just not safe to update it.
+ if (has_preserved_fp || cc().environment().is_darwin_abi()) {
+ make_unavailable(RegGroup::kGp, Gp::kIdFp);
+ }
+ make_unavailable(RegGroup::kGp, Gp::kIdSp);
+ make_unavailable(RegGroup::kGp, Gp::kIdOs); // OS-specific use, usually TLS.
+ make_unavailable(frame._unavailable_regs);
+
+ _sp = sp;
+ _fp = x29;
+}
+
+void ARMRAPass::on_done() noexcept {}
+
+// a64::ARMRAPass - BuildCFG
+// =========================
+
+Error ARMRAPass::build_cfg_nodes() noexcept {
+ return RACFGBuilder(*this).run();
+}
+
+// a64::ARMRAPass - Rewrite
+// ========================
+
+ASMJIT_FAVOR_SPEED Error ARMRAPass::rewrite() noexcept {
+ const size_t virt_count = cc()._virt_regs.size();
+ return rewrite_iterate([&](BaseNode* node, BaseNode* stop, RABlock* block) noexcept -> Error {
+ while (node != stop) {
+ BaseNode* next = node->next();
+
+ if (node->is_inst()) {
+ InstNode* inst = node->as<InstNode>();
+ RAInst* ra_inst = node->pass_data<RAInst>();
+
+ Span<Operand> operands = inst->operands();
+
+ // Rewrite virtual registers into physical registers.
+ if (ra_inst) {
+ // This data is allocated by Arena passed to `run_on_function()`, which will be reset after the RA pass
+ // finishes. So reset this data to prevent having a dead pointer after the RA pass is complete.
+ node->reset_pass_data();
+
+ // If the instruction contains pass data (ra_inst) then it was a subject for register allocation and must be
+ // rewritten to use physical regs.
+ const RATiedReg* tied_regs = ra_inst->tied_regs();
+ uint32_t tied_count = ra_inst->tied_count();
+
+ for (uint32_t i = 0; i < tied_count; i++) {
+ const RATiedReg& tied_reg = tied_regs[i];
+
+ Support::BitWordIterator<uint32_t> use_it(tied_reg.use_rewrite_mask());
+ if (use_it.has_next()) {
+ uint32_t use_id = tied_reg.use_id();
+ do {
+ inst->_rewrite_id_at_index(use_it.next(), use_id);
+ } while (use_it.has_next());
+ }
+
+ Support::BitWordIterator<uint32_t> out_it(tied_reg.out_rewrite_mask());
+ if (out_it.has_next()) {
+ uint32_t out_id = tied_reg.out_id();
+ do {
+ inst->_rewrite_id_at_index(out_it.next(), out_id);
+ } while (out_it.has_next());
+ }
+ }
+
+ if (ASMJIT_UNLIKELY(node->type() != NodeType::kInst)) {
+ // FuncRet terminates the flow, it must either be removed if the exit
+ // label is next to it (optimization) or patched to an architecture
+ // dependent jump instruction that jumps to the function's exit before
+ // the epilog.
+ if (node->type() == NodeType::kFuncRet) {
+ if (!is_next_to(node, _func->exit_node())) {
+ cc().set_cursor(node->prev());
+ ASMJIT_PROPAGATE(emit_jump(_func->exit_node()->label()));
+ }
+
+ BaseNode* prev = node->prev();
+ cc().remove_node(node);
+
+ if (block) {
+ block->set_last(prev);
+ }
+ }
+ }
+ }
+
+ // Rewrite stack slot addresses.
+ for (Operand& op : operands) {
+ if (op.is_mem()) {
+ BaseMem& mem = op.as<BaseMem>();
+ if (mem.is_reg_home()) {
+ uint32_t virt_index = Operand::virt_id_to_index(mem.base_id());
+ if (ASMJIT_UNLIKELY(virt_index >= virt_count)) {
+ return make_error(Error::kInvalidVirtId);
+ }
+
+ VirtReg* virt_reg = cc().virt_reg_by_index(virt_index);
+ RAWorkReg* work_reg = virt_reg->work_reg();
+ ASMJIT_ASSERT(work_reg != nullptr);
+
+ RAStackSlot* slot = work_reg->stack_slot();
+ int32_t offset = slot->offset();
+
+ mem._set_base(_sp.reg_type(), slot->base_reg_id());
+ mem.clear_reg_home();
+ mem.add_offset_lo32(offset);
+ }
+ }
+ }
+
+ // Rewrite `load_address_of()` construct.
+ if (inst->real_id() == Inst::kIdAdr && operands.size() == 2 && operands[1].is_mem()) {
+ BaseMem mem = operands[1].as<BaseMem>();
+ int64_t offset = mem.offset();
+
+ if (!mem.has_base_or_index()) {
+ inst->set_inst_id(Inst::kIdMov);
+ inst->set_op(1, Imm(offset));
+ }
+ else {
+ if (mem.has_index()) {
+ return make_error(Error::kInvalidAddressIndex);
+ }
+
+ Gp dst = Gp::make_r64(operands[0].as<Gp>().id());
+ Gp base = Gp::make_r64(mem.base_id());
+
+ InstId arith_inst = offset < 0 ? Inst::kIdSub : Inst::kIdAdd;
+ uint64_t abs_offset = offset < 0 ? Support::neg(uint64_t(offset)) : uint64_t(offset);
+
+ inst->set_inst_id(arith_inst);
+ inst->set_op_count(3);
+ inst->set_op(1, base);
+ inst->set_op(2, Imm(abs_offset));
+
+ // Use two operations if the offset cannot be encoded with ADD/SUB.
+ if (abs_offset > 0xFFFu && (abs_offset & ~uint64_t(0xFFF000u)) != 0) {
+ if (abs_offset <= 0xFFFFFFu) {
+ cc().set_cursor(inst->prev());
+ ASMJIT_PROPAGATE(cc().emit(arith_inst, dst, base, Imm(abs_offset & 0xFFFu)));
+
+ inst->set_op(1, dst);
+ inst->set_op(2, Imm(abs_offset & 0xFFF000u));
+ }
+ else {
+ cc().set_cursor(inst->prev());
+ ASMJIT_PROPAGATE(cc().emit(Inst::kIdMov, operands[0], Imm(abs_offset)));
+
+ inst->set_op(1, base);
+ inst->set_op(2, dst);
+ }
+ }
+ }
+ }
+ }
+
+ node = next;
+ }
+
+ return Error::kOk;
+ });
+}
+
+// a64::ARMRAPass - Prolog & Epilog
+// ================================
+
+Error ARMRAPass::update_stack_frame() noexcept {
+ if (_func->frame().has_func_calls()) {
+ _func->frame().add_dirty_regs(RegGroup::kGp, Support::bit_mask<RegMask>(Gp::kIdLr));
+ }
+
+ return BaseRAPass::update_stack_frame();
+}
+
+// a64::ARMRAPass - OnEmit
+// =======================
+
+Error ARMRAPass::emit_move(RAWorkReg* w_reg, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept {
+ Reg dst(w_reg->signature(), dst_phys_id);
+ Reg src(w_reg->signature(), src_phys_id);
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<MOVE> ", 7u, w_reg->virt_reg());
+ comment = _tmp_string.data();
+ }
+#endif
+
+ return _emit_helper.emit_reg_move(dst, src, w_reg->type_id(), comment);
+}
+
+Error ARMRAPass::emit_swap(RAWorkReg* a_reg, uint32_t a_phys_id, RAWorkReg* b_reg, uint32_t b_phys_id) noexcept {
+ Support::maybe_unused(a_reg, a_phys_id, b_reg, b_phys_id);
+ return make_error(Error::kInvalidState);
+}
+
+Error ARMRAPass::emit_load(RAWorkReg* w_reg, uint32_t dst_phys_id) noexcept {
+ Reg dst_reg(w_reg->signature(), dst_phys_id);
+ BaseMem src_mem(work_reg_as_mem(w_reg));
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<LOAD> ", 7u, w_reg->virt_reg());
+ comment = _tmp_string.data();
+ }
+#endif
+
+ return _emit_helper.emit_reg_move(dst_reg, src_mem, w_reg->type_id(), comment);
+}
+
+Error ARMRAPass::emit_save(RAWorkReg* w_reg, uint32_t src_phys_id) noexcept {
+ BaseMem dst_mem(work_reg_as_mem(w_reg));
+ Reg src_reg(w_reg->signature(), src_phys_id);
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<SAVE> ", 7u, w_reg->virt_reg());
+ comment = _tmp_string.data();
+ }
+#endif
+
+ return _emit_helper.emit_reg_move(dst_mem, src_reg, w_reg->type_id(), comment);
+}
+
+Error ARMRAPass::emit_jump(const Label& label) noexcept {
+ return cc().b(label);
+}
+
+Error ARMRAPass::emit_pre_call(InvokeNode* invoke_node) noexcept {
+ Support::maybe_unused(invoke_node);
+ return Error::kOk;
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/arm/a64rapass_p.h b/3rdparty/asmjit/asmjit/arm/a64rapass_p.h
new file mode 100644
index 00000000000..dfab0c23644
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/a64rapass_p.h
@@ -0,0 +1,113 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
+#define ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/racfgblock_p.h>
+#include <asmjit/core/racfgbuilder_p.h>
+#include <asmjit/core/rapass_p.h>
+#include <asmjit/arm/a64assembler.h>
+#include <asmjit/arm/a64compiler.h>
+#include <asmjit/arm/a64emithelper_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(a64)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_a64
+//! \{
+
+//! ARM register allocation pass.
+//!
+//! Takes care of generating function prologs and epilogs, and also performs
+//! register allocation.
+class ARMRAPass : public BaseRAPass {
+public:
+ ASMJIT_NONCOPYABLE(ARMRAPass)
+ using Base = BaseRAPass;
+
+ //! \name Members
+ //! \{
+
+ EmitHelper _emit_helper;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ARMRAPass(BaseCompiler& cc) noexcept;
+ ~ARMRAPass() noexcept override;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the compiler casted to `arm::Compiler`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Compiler& cc() const noexcept { return static_cast<Compiler&>(_cb); }
+
+ //! Returns emit helper.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG EmitHelper* emit_helper() noexcept { return &_emit_helper; }
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ void on_init() noexcept override;
+ void on_done() noexcept override;
+
+ //! \}
+
+ //! \name CFG
+ //! \{
+
+ Error build_cfg_nodes() noexcept override;
+
+ //! \}
+
+ //! \name Rewrite
+ //! \{
+
+ Error rewrite() noexcept override;
+
+ //! \}
+
+ //! \name Prolog & Epilog
+ //! \{
+
+ Error update_stack_frame() noexcept override;
+
+ //! \}
+
+ //! \name Emit Helpers
+ //! \{
+
+ Error emit_move(RAWorkReg* work_reg, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept override;
+ Error emit_swap(RAWorkReg* a_reg, uint32_t a_phys_id, RAWorkReg* b_reg, uint32_t b_phys_id) noexcept override;
+
+ Error emit_load(RAWorkReg* work_reg, uint32_t dst_phys_id) noexcept override;
+ Error emit_save(RAWorkReg* work_reg, uint32_t src_phys_id) noexcept override;
+
+ Error emit_jump(const Label& label) noexcept override;
+ Error emit_pre_call(InvokeNode* invoke_node) noexcept override;
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/armformatter.cpp b/3rdparty/asmjit/asmjit/arm/armformatter.cpp
new file mode 100644
index 00000000000..5ad83ae6957
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/armformatter.cpp
@@ -0,0 +1,620 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_LOGGING
+
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/arm/armformatter_p.h>
+#include <asmjit/arm/a64operand.h>
+#include <asmjit/arm/a64instapi_p.h>
+#include <asmjit/arm/a64instdb_p.h>
+
+#ifndef ASMJIT_NO_COMPILER
+ #include <asmjit/core/compiler.h>
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+// arm::FormatterInternal - Format Feature
+// =======================================
+
+Error FormatterInternal::format_feature(String& sb, uint32_t feature_id) noexcept {
+ // @EnumStringBegin{"enum": "CpuFeatures::ARM", "output": "feature_string", "strip": "k"}@
+ static const char feature_string_data[] =
+ "None\0"
+ "ARMv6\0"
+ "ARMv7\0"
+ "ARMv8a\0"
+ "THUMB\0"
+ "THUMBv2\0"
+ "ABLE\0"
+ "ADERR\0"
+ "AES\0"
+ "AFP\0"
+ "AIE\0"
+ "AMU1\0"
+ "AMU1_1\0"
+ "ANERR\0"
+ "ASIMD\0"
+ "BF16\0"
+ "BRBE\0"
+ "BTI\0"
+ "BWE\0"
+ "CCIDX\0"
+ "CHK\0"
+ "CLRBHB\0"
+ "CMOW\0"
+ "CMPBR\0"
+ "CONSTPACFIELD\0"
+ "CPA\0"
+ "CPA2\0"
+ "CPUID\0"
+ "CRC32\0"
+ "CSSC\0"
+ "CSV2\0"
+ "CSV2_3\0"
+ "CSV3\0"
+ "D128\0"
+ "DGH\0"
+ "DIT\0"
+ "DOTPROD\0"
+ "DPB\0"
+ "DPB2\0"
+ "EBEP\0"
+ "EBF16\0"
+ "ECBHB\0"
+ "ECV\0"
+ "EDHSR\0"
+ "EDSP\0"
+ "F8E4M3\0"
+ "F8E5M2\0"
+ "F8F16MM\0"
+ "F8F32MM\0"
+ "FAMINMAX\0"
+ "FCMA\0"
+ "FGT\0"
+ "FGT2\0"
+ "FHM\0"
+ "FLAGM\0"
+ "FLAGM2\0"
+ "FMAC\0"
+ "FP\0"
+ "FP16\0"
+ "FP16CONV\0"
+ "FP8\0"
+ "FP8DOT2\0"
+ "FP8DOT4\0"
+ "FP8FMA\0"
+ "FPMR\0"
+ "FPRCVT\0"
+ "FRINTTS\0"
+ "GCS\0"
+ "HACDBS\0"
+ "HAFDBS\0"
+ "HAFT\0"
+ "HDBSS\0"
+ "HBC\0"
+ "HCX\0"
+ "HPDS\0"
+ "HPDS2\0"
+ "I8MM\0"
+ "IDIVA\0"
+ "IDIVT\0"
+ "ITE\0"
+ "JSCVT\0"
+ "LOR\0"
+ "LRCPC\0"
+ "LRCPC2\0"
+ "LRCPC3\0"
+ "LS64\0"
+ "LS64_ACCDATA\0"
+ "LS64_V\0"
+ "LS64WB\0"
+ "LSE\0"
+ "LSE128\0"
+ "LSE2\0"
+ "LSFE\0"
+ "LSUI\0"
+ "LUT\0"
+ "LVA\0"
+ "LVA3\0"
+ "MEC\0"
+ "MOPS\0"
+ "MPAM\0"
+ "MTE\0"
+ "MTE2\0"
+ "MTE3\0"
+ "MTE4\0"
+ "MTE_ASYM_FAULT\0"
+ "MTE_ASYNC\0"
+ "MTE_CANONICAL_TAGS\0"
+ "MTE_NO_ADDRESS_TAGS\0"
+ "MTE_PERM_S1\0"
+ "MTE_STORE_ONLY\0"
+ "MTE_TAGGED_FAR\0"
+ "MTPMU\0"
+ "NMI\0"
+ "NV\0"
+ "NV2\0"
+ "OCCMO\0"
+ "PAN\0"
+ "PAN2\0"
+ "PAN3\0"
+ "PAUTH\0"
+ "PFAR\0"
+ "PMU\0"
+ "PMULL\0"
+ "PRFMSLC\0"
+ "RAS\0"
+ "RAS1_1\0"
+ "RAS2\0"
+ "RASSA2\0"
+ "RDM\0"
+ "RME\0"
+ "RNG\0"
+ "RNG_TRAP\0"
+ "RPRES\0"
+ "RPRFM\0"
+ "S1PIE\0"
+ "S1POE\0"
+ "S2PIE\0"
+ "S2POE\0"
+ "SB\0"
+ "SCTLR2\0"
+ "SEBEP\0"
+ "SEL2\0"
+ "SHA1\0"
+ "SHA256\0"
+ "SHA3\0"
+ "SHA512\0"
+ "SM3\0"
+ "SM4\0"
+ "SME\0"
+ "SME2\0"
+ "SME2_1\0"
+ "SME2_2\0"
+ "SME_AES\0"
+ "SME_B16B16\0"
+ "SME_B16F32\0"
+ "SME_BI32I32\0"
+ "SME_F16F16\0"
+ "SME_F16F32\0"
+ "SME_F32F32\0"
+ "SME_F64F64\0"
+ "SME_F8F16\0"
+ "SME_F8F32\0"
+ "SME_FA64\0"
+ "SME_I16I32\0"
+ "SME_I16I64\0"
+ "SME_I8I32\0"
+ "SME_LUTv2\0"
+ "SME_MOP4\0"
+ "SME_TMOP\0"
+ "SPE\0"
+ "SPE1_1\0"
+ "SPE1_2\0"
+ "SPE1_3\0"
+ "SPE1_4\0"
+ "SPE_ALTCLK\0"
+ "SPE_CRR\0"
+ "SPE_EFT\0"
+ "SPE_FDS\0"
+ "SPE_FPF\0"
+ "SPE_SME\0"
+ "SPECRES\0"
+ "SPECRES2\0"
+ "SPMU\0"
+ "SSBS\0"
+ "SSBS2\0"
+ "SSVE_AES\0"
+ "SSVE_BITPERM\0"
+ "SSVE_FEXPA\0"
+ "SSVE_FP8DOT2\0"
+ "SSVE_FP8DOT4\0"
+ "SSVE_FP8FMA\0"
+ "SVE\0"
+ "SVE2\0"
+ "SVE2_1\0"
+ "SVE2_2\0"
+ "SVE_AES\0"
+ "SVE_AES2\0"
+ "SVE_B16B16\0"
+ "SVE_BF16\0"
+ "SVE_BFSCALE\0"
+ "SVE_BITPERM\0"
+ "SVE_EBF16\0"
+ "SVE_ELTPERM\0"
+ "SVE_F16MM\0"
+ "SVE_F32MM\0"
+ "SVE_F64MM\0"
+ "SVE_I8MM\0"
+ "SVE_PMULL128\0"
+ "SVE_SHA3\0"
+ "SVE_SM4\0"
+ "SYSINSTR128\0"
+ "SYSREG128\0"
+ "THE\0"
+ "TLBIOS\0"
+ "TLBIRANGE\0"
+ "TLBIW\0"
+ "TME\0"
+ "TRF\0"
+ "UAO\0"
+ "VFP_D32\0"
+ "VHE\0"
+ "VMID16\0"
+ "WFXT\0"
+ "XNX\0"
+ "XS\0"
+ "<Unknown>\0";
+
+ static const uint16_t feature_string_index[] = {
+ 0, 5, 11, 17, 24, 30, 38, 43, 49, 53, 57, 61, 66, 73, 79, 85, 90, 95, 99,
+ 103, 109, 113, 120, 125, 131, 145, 149, 154, 160, 166, 171, 176, 183, 188,
+ 193, 197, 201, 209, 213, 218, 223, 229, 235, 239, 245, 250, 257, 264, 272,
+ 280, 289, 294, 298, 303, 307, 313, 320, 325, 328, 333, 342, 346, 354, 362,
+ 369, 374, 381, 389, 393, 400, 407, 412, 418, 422, 426, 431, 437, 442, 448,
+ 454, 458, 464, 468, 474, 481, 488, 493, 506, 513, 520, 524, 531, 536, 541,
+ 546, 550, 554, 559, 563, 568, 573, 577, 582, 587, 592, 607, 617, 636, 656,
+ 668, 683, 698, 704, 708, 711, 715, 721, 725, 730, 735, 741, 746, 750, 756,
+ 764, 768, 775, 780, 787, 791, 795, 799, 808, 814, 820, 826, 832, 838, 844,
+ 847, 854, 860, 865, 870, 877, 882, 889, 893, 897, 901, 906, 913, 920, 928,
+ 939, 950, 962, 973, 984, 995, 1006, 1016, 1026, 1035, 1046, 1057, 1067, 1077,
+ 1086, 1095, 1099, 1106, 1113, 1120, 1127, 1138, 1146, 1154, 1162, 1170, 1178,
+ 1186, 1195, 1200, 1205, 1211, 1220, 1233, 1244, 1257, 1270, 1282, 1286, 1291,
+ 1298, 1305, 1313, 1322, 1333, 1342, 1354, 1366, 1376, 1388, 1398, 1408, 1418,
+ 1427, 1440, 1449, 1457, 1469, 1479, 1483, 1490, 1500, 1506, 1510, 1514, 1518,
+ 1526, 1530, 1537, 1542, 1546, 1549
+ };
+ // @EnumStringEnd@
+
+ return sb.append(feature_string_data + feature_string_index[Support::min(feature_id, uint32_t(CpuFeatures::ARM::kMaxValue) + 1u)]);
+}
+
+// arm::FormatterInternal - Format Constants
+// =========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_cond_code(String& sb, CondCode cc) noexcept {
+ static const char cond_code_string_data[] =
+ "al\0" "na\0"
+ "eq\0" "ne\0"
+ "hs\0" "lo\0" "mi\0" "pl\0" "vs\0" "vc\0"
+ "hi\0" "ls\0" "ge\0" "lt\0" "gt\0" "le\0"
+ "<Unknown>";
+ return sb.append(cond_code_string_data + Support::min<uint32_t>(uint32_t(cc), 16u) * 3);
+}
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_shift_op(String& sb, ShiftOp shift_op) noexcept {
+ const char* str = nullptr;
+ switch (shift_op) {
+ case ShiftOp::kLSL: str = "lsl"; break;
+ case ShiftOp::kLSR: str = "lsr"; break;
+ case ShiftOp::kASR: str = "asr"; break;
+ case ShiftOp::kROR: str = "ror"; break;
+ case ShiftOp::kRRX: str = "rrx"; break;
+ case ShiftOp::kMSL: str = "msl"; break;
+ case ShiftOp::kUXTB: str = "uxtb"; break;
+ case ShiftOp::kUXTH: str = "uxth"; break;
+ case ShiftOp::kUXTW: str = "uxtw"; break;
+ case ShiftOp::kUXTX: str = "uxtx"; break;
+ case ShiftOp::kSXTB: str = "sxtb"; break;
+ case ShiftOp::kSXTH: str = "sxth"; break;
+ case ShiftOp::kSXTW: str = "sxtw"; break;
+ case ShiftOp::kSXTX: str = "sxtx"; break;
+ default: str = "<Unknown>"; break;
+ }
+ return sb.append(str);
+}
+
+// arm::FormatterInternal - Format Register
+// ========================================
+
+struct FormatElementData {
+ char letter;
+ uint8_t element_count;
+ uint8_t only_index;
+ uint8_t reserved;
+};
+
+static constexpr FormatElementData format_element_data_table[9] = {
+ { '?' , 0 , 0, 0 }, // None
+ { 'b' , 16, 0, 0 }, // bX or b[index]
+ { 'h' , 8 , 0, 0 }, // hX or h[index]
+ { 's' , 4 , 0, 0 }, // sX or s[index]
+ { 'd' , 2 , 0, 0 }, // dX or d[index]
+ { 'b' , 4 , 1, 0 }, // ?? or b4[index]
+ { 'h' , 2 , 1, 0 }, // ?? or h2[index]
+ { '?' , 0 , 0, 0 }, // invalid (possibly stored in Operand)
+ { '?' , 0 , 0, 0 } // invalid (never stored in Operand, bug...)
+};
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_register(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_id,
+ uint32_t element_type,
+ uint32_t element_index) noexcept {
+
+ Support::maybe_unused(flags);
+ Support::maybe_unused(arch);
+
+ static const char bhsdq[] = "bhsdq";
+
+ bool is_virt_reg_formatted = false;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (Operand::is_virt_id(reg_id)) {
+ if (emitter && emitter->is_compiler()) {
+ const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
+ if (cc->is_virt_id_valid(reg_id)) {
+ VirtReg* virt_reg = cc->virt_reg_by_id(reg_id);
+ ASMJIT_ASSERT(virt_reg != nullptr);
+
+ ASMJIT_PROPAGATE(Formatter::format_virt_reg_name(sb, virt_reg));
+ is_virt_reg_formatted = true;
+ }
+ }
+ }
+#else
+ Support::maybe_unused(emitter, flags);
+#endif
+
+ if (!is_virt_reg_formatted) {
+ char letter = '\0';
+ switch (reg_type) {
+ case RegType::kVec8:
+ case RegType::kVec16:
+ case RegType::kVec32:
+ case RegType::kVec64:
+ case RegType::kVec128:
+ letter = bhsdq[uint32_t(reg_type) - uint32_t(RegType::kVec8)];
+ if (element_type) {
+ letter = 'v';
+ }
+ break;
+
+ case RegType::kGp32:
+ if (Environment::is_64bit(arch)) {
+ letter = 'w';
+
+ if (reg_id == a64::Gp::kIdZr) {
+ return sb.append("wzr", 3);
+ }
+
+ if (reg_id == a64::Gp::kIdSp) {
+ return sb.append("wsp", 3);
+ }
+ }
+ else {
+ letter = 'r';
+ }
+ break;
+
+ case RegType::kGp64:
+ if (Environment::is_64bit(arch)) {
+ if (reg_id == a64::Gp::kIdZr) {
+ return sb.append("xzr", 3);
+ }
+
+ if (reg_id == a64::Gp::kIdSp) {
+ return sb.append("sp", 2);
+ }
+
+ letter = 'x';
+ break;
+ }
+
+ // X registers are undefined in 32-bit mode.
+ [[fallthrough]];
+
+ default:
+ ASMJIT_PROPAGATE(sb.append_format("<Reg-%u>?%u", uint32_t(reg_type), reg_id));
+ break;
+ }
+
+ if (letter)
+ ASMJIT_PROPAGATE(sb.append_format("%c%u", letter, reg_id));
+ }
+
+ constexpr uint32_t kElementTypeCount = uint32_t(a64::VecElementType::kMaxValue) + 1;
+ if (element_type) {
+ element_type = Support::min(element_type, kElementTypeCount);
+
+ FormatElementData element_data = format_element_data_table[element_type];
+ uint32_t element_count = element_data.element_count;
+
+ if (reg_type == RegType::kVec64) {
+ element_count /= 2u;
+ }
+
+ ASMJIT_PROPAGATE(sb.append('.'));
+ if (element_count) {
+ ASMJIT_PROPAGATE(sb.append_uint(element_count));
+ }
+ ASMJIT_PROPAGATE(sb.append(element_data.letter));
+ }
+
+ if (element_index != 0xFFFFFFFFu) {
+ ASMJIT_PROPAGATE(sb.append_format("[%u]", element_index));
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_register_list(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_mask) noexcept {
+
+ bool first = true;
+
+ ASMJIT_PROPAGATE(sb.append('{'));
+ while (reg_mask != 0u) {
+ uint32_t start = Support::ctz(reg_mask);
+ uint32_t count = 0u;
+
+ uint32_t mask = 1u << start;
+ do {
+ reg_mask &= ~mask;
+ mask <<= 1u;
+ count++;
+ } while (reg_mask & mask);
+
+ if (!first) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+ }
+
+ ASMJIT_PROPAGATE(format_register(sb, flags, emitter, arch, reg_type, start, 0, 0xFFFFFFFFu));
+ if (count >= 2u) {
+ ASMJIT_PROPAGATE(sb.append('-'));
+ ASMJIT_PROPAGATE(format_register(sb, flags, emitter, arch, reg_type, start + count - 1, 0, 0xFFFFFFFFu));
+ }
+
+ first = false;
+ }
+ ASMJIT_PROPAGATE(sb.append('}'));
+
+ return Error::kOk;
+}
+
+// a64::FormatterInternal - Format Operand
+// =======================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_operand(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept {
+
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+
+ uint32_t element_type = op._signature.get_field<a64::Vec::kSignatureRegElementTypeMask>();
+ uint32_t element_index = op.as<a64::Vec>().element_index();
+
+ if (!op.as<a64::Vec>().has_element_index()) {
+ element_index = 0xFFFFFFFFu;
+ }
+
+ return format_register(sb, flags, emitter, arch, reg.reg_type(), reg.id(), element_type, element_index);
+ }
+
+ if (op.is_mem()) {
+ const a64::Mem& m = op.as<a64::Mem>();
+ ASMJIT_PROPAGATE(sb.append('['));
+
+ if (m.has_base()) {
+ if (m.has_base_label()) {
+ ASMJIT_PROPAGATE(Formatter::format_label(sb, flags, emitter, m.base_id()));
+ }
+ else {
+ FormatFlags modified_flags = flags;
+ if (m.is_reg_home()) {
+ ASMJIT_PROPAGATE(sb.append('&'));
+ modified_flags &= ~FormatFlags::kRegCasts;
+ }
+ ASMJIT_PROPAGATE(format_register(sb, modified_flags, emitter, arch, m.base_type(), m.base_id()));
+ }
+ }
+ else {
+ // ARM really requires base.
+ if (m.has_index() || m.has_offset()) {
+ ASMJIT_PROPAGATE(sb.append("<None>"));
+ }
+ }
+
+ // The post index makes it look like there was another operand, but it's
+ // still the part of AsmJit's `arm::Mem` operand so it's consistent with
+ // other architectures.
+ if (m.is_post_index())
+ ASMJIT_PROPAGATE(sb.append(']'));
+
+ if (m.has_index()) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+ ASMJIT_PROPAGATE(format_register(sb, flags, emitter, arch, m.index_type(), m.index_id()));
+ }
+
+ if (m.has_offset()) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+
+ int64_t off = int64_t(m.offset());
+ uint32_t base = 10;
+
+ if (Support::test(flags, FormatFlags::kHexOffsets) && uint64_t(off) > 9) {
+ base = 16;
+ }
+
+ if (base == 10) {
+ ASMJIT_PROPAGATE(sb.append_int(off, base));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append("0x"));
+ ASMJIT_PROPAGATE(sb.append_uint(uint64_t(off), base));
+ }
+ }
+
+ if (m.has_shift()) {
+ ASMJIT_PROPAGATE(sb.append(' '));
+ if (!m.is_pre_or_post()) {
+ ASMJIT_PROPAGATE(format_shift_op(sb, m.shift_op()));
+ }
+ ASMJIT_PROPAGATE(sb.append_format(" %u", m.shift()));
+ }
+
+ if (!m.is_post_index()) {
+ ASMJIT_PROPAGATE(sb.append(']'));
+ }
+
+ if (m.is_pre_index()) {
+ ASMJIT_PROPAGATE(sb.append('!'));
+ }
+
+ return Error::kOk;
+ }
+
+ if (op.is_imm()) {
+ const Imm& i = op.as<Imm>();
+ int64_t val = i.value();
+ uint32_t predicate = i.predicate();
+
+ if (predicate) {
+ ASMJIT_PROPAGATE(format_shift_op(sb, ShiftOp(predicate)));
+ ASMJIT_PROPAGATE(sb.append(' '));
+ }
+
+ if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
+ ASMJIT_PROPAGATE(sb.append("0x"));
+ return sb.append_uint(uint64_t(val), 16);
+ }
+ else {
+ return sb.append_int(val, 10);
+ }
+ }
+
+ if (op.is_label()) {
+ return Formatter::format_label(sb, flags, emitter, op.id());
+ }
+
+ if (op.is_reg_list()) {
+ const BaseRegList& reg_list = op.as<BaseRegList>();
+ return format_register_list(sb, flags, emitter, arch, reg_list.reg_type(), reg_list.list());
+ }
+
+ return sb.append("<None>");
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/asmjit/arm/armformatter_p.h b/3rdparty/asmjit/asmjit/arm/armformatter_p.h
new file mode 100644
index 00000000000..ae9adfff938
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/armformatter_p.h
@@ -0,0 +1,69 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
+#define ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_LOGGING
+
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/string.h>
+#include <asmjit/arm/armglobals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_arm
+//! \{
+
+namespace FormatterInternal {
+
+Error ASMJIT_CDECL format_feature(
+ String& sb,
+ uint32_t feature_id) noexcept;
+
+Error ASMJIT_CDECL format_cond_code(
+ String& sb,
+ CondCode cc) noexcept;
+
+Error ASMJIT_CDECL format_shift_op(
+ String& sb,
+ ShiftOp shift_op) noexcept;
+
+Error ASMJIT_CDECL format_register(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_id,
+ uint32_t element_type = 0,
+ uint32_t element_index = 0xFFFFFFFF) noexcept;
+
+Error ASMJIT_CDECL format_register_list(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_mask) noexcept;
+
+Error ASMJIT_CDECL format_operand(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept;
+
+} // {FormatterInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
+#endif // ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/armglobals.h b/3rdparty/asmjit/asmjit/arm/armglobals.h
new file mode 100644
index 00000000000..864c4f72cc3
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/armglobals.h
@@ -0,0 +1,17 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
+#define ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
+
+#include <asmjit/core/archcommons.h>
+#include <asmjit/core/inst.h>
+
+//! \namespace asmjit::arm
+//! \ingroup asmjit_arm
+//!
+//! API shared between AArch32 & AArch64 backends.
+
+#endif // ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/arm/armutils.h b/3rdparty/asmjit/asmjit/arm/armutils.h
new file mode 100644
index 00000000000..bf0708dd115
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/arm/armutils.h
@@ -0,0 +1,247 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_ARM_ARMUTILS_H_INCLUDED
+#define ASMJIT_ARM_ARMUTILS_H_INCLUDED
+
+#include <asmjit/support/support.h>
+#include <asmjit/arm/armglobals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(arm)
+
+//! \addtogroup asmjit_arm
+//! \{
+
+//! Public utilities and helpers for targeting AArch32 and AArch64 architectures.
+namespace Utils {
+
+//! Encodes a 12-bit immediate part of opcode that ise used by a standard 32-bit ARM encoding.
+[[maybe_unused]]
+[[nodiscard]]
+static ASMJIT_INLINE bool encode_aarch32_imm(uint64_t imm, Out<uint32_t> imm_out) noexcept {
+ if (imm & 0xFFFFFFFF00000000u)
+ return false;
+
+ uint32_t v = uint32_t(imm);
+ uint32_t r = 0;
+
+ if (v <= 0xFFu) {
+ imm_out = v;
+ return true;
+ }
+
+ // Rotate if there are bits on both ends (LSB and MSB)
+ // (otherwise we would not be able to calculate the rotation with ctz).
+ if (v & 0xFF0000FFu) {
+ v = Support::ror(v, 16);
+ r = 16u;
+ }
+
+ uint32_t n = Support::ctz(v) & ~0x1u;
+ r = (r - n) & 0x1Eu;
+ v = Support::ror(v, n);
+
+ if (v > 0xFFu)
+ return false;
+
+ imm_out = v | (r << 7);
+ return true;
+}
+
+//! Decomposed fields of a logical immediate value.
+struct LogicalImm {
+ uint32_t n;
+ uint32_t s;
+ uint32_t r;
+};
+
+//! Encodes the given `imm` value of the given `width` to a logical immediate value represented as N, S, and R fields
+//! and writes these fields to `out`.
+//!
+//! Encoding Table:
+//!
+//! ```
+//! +---+--------+--------+------+
+//! | N | ImmS | ImmR | Size |
+//! +---+--------+--------+------+
+//! | 1 | ssssss | rrrrrr | 64 |
+//! | 0 | 0sssss | .rrrrr | 32 |
+//! | 0 | 10ssss | ..rrrr | 16 |
+//! | 0 | 110sss | ...rrr | 8 |
+//! | 0 | 1110ss | ....rr | 4 |
+//! | 0 | 11110s | .....r | 2 |
+//! +---+--------+--------+------+
+//! ```
+[[maybe_unused]]
+[[nodiscard]]
+static ASMJIT_INLINE bool encode_logical_imm(uint64_t imm, uint32_t width, Out<LogicalImm> out) noexcept {
+ // Determine the element width, which must be 2, 4, 8, 16, 32, or 64 bits.
+ do {
+ width /= 2u;
+ uint64_t mask = (uint64_t(1) << width) - 1u;
+ if ((imm & mask) != ((imm >> width) & mask)) {
+ width *= 2u;
+ break;
+ }
+ } while (width > 2u);
+
+ // Patterns of all zeros and all ones are not encodable.
+ uint64_t lsb_mask = Support::lsb_mask<uint64_t>(width);
+ imm &= lsb_mask;
+
+ if (imm == 0 || imm == lsb_mask) {
+ return false;
+ }
+
+ // Inspect the pattern and get the most important bit indexes.
+ //
+ // o_index <-+ +-> z_index
+ // | |
+ // |..zeros..|o_count|z_count|..ones..|
+ // |000000000|111111|000000|11111111|
+
+ uint32_t z_index = Support::ctz(~imm);
+ uint64_t z_imm = imm ^ ((uint64_t(1) << z_index) - 1);
+ uint32_t z_count = (z_imm ? Support::ctz(z_imm) : width) - z_index;
+
+ uint32_t o_index = z_index + z_count;
+ uint64_t o_imm = ~(z_imm ^ Support::lsb_mask<uint64_t>(o_index));
+ uint32_t o_count = (o_imm ? Support::ctz(o_imm) : width) - (o_index);
+
+ // Verify whether the bit-pattern is encodable.
+ uint64_t must_be_zero = o_imm ^ ~Support::lsb_mask<uint64_t>(o_index + o_count);
+ if (must_be_zero != 0 || (z_index > 0 && width - (o_index + o_count) != 0u)) {
+ return false;
+ }
+
+ out->n = width == 64;
+ out->s = (o_count + z_index - 1) | (Support::neg(width * 2u) & 0x3Fu);
+ out->r = width - o_index;
+ return true;
+}
+
+//! Returns true if the given `imm` value is encodable as a logical immediate. The `width` argument describes the
+//! width of the operation, and must be either 32 or 64. This function can be used to test whether an immediate
+//! value can be used with AND, ANDS, BIC, BICS, EON, EOR, ORN, and ORR instruction.
+[[maybe_unused]]
+[[nodiscard]]
+static ASMJIT_INLINE bool is_logical_imm(uint64_t imm, uint32_t width) noexcept {
+ LogicalImm dummy;
+ return encode_logical_imm(imm, width, Out(dummy));
+}
+
+//! Returns true if the given `imm` value is encodable as an immediate with `add` and `sub` instructions on AArch64.
+//! These two instructions can encode 12-bit immediate value optionally shifted left by 12 bits.
+[[maybe_unused]]
+[[nodiscard]]
+static ASMJIT_INLINE bool is_add_sub_imm(uint64_t imm) noexcept {
+ return imm <= 0xFFFu || (imm & ~uint64_t(0xFFFu << 12)) == 0;
+}
+
+//! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either
+//! 0x00 or 0xFF. Some ARM instructions accept immediate values that form a byte-mask and this function can be used
+//! to verify that the immediate is encodable before using the value.
+template<typename T>
+[[nodiscard]]
+static ASMJIT_INLINE bool is_byte_mask_imm(const T& imm) noexcept {
+ constexpr T kMask = T(0x0101010101010101 & Support::bit_ones<T>);
+ return imm == (imm & kMask) * T(255);
+}
+
+// [.......A|B.......|.......C|D.......|.......E|F.......|.......G|H.......]
+[[maybe_unused]]
+[[nodiscard]]
+static ASMJIT_INLINE uint32_t encode_imm64_byte_mask_to_imm8(uint64_t imm) noexcept {
+ return uint32_t(((imm >> (7 - 0)) & 0b00000011) | // [.......G|H.......]
+ ((imm >> (23 - 2)) & 0b00001100) | // [.......E|F.......]
+ ((imm >> (39 - 4)) & 0b00110000) | // [.......C|D.......]
+ ((imm >> (55 - 6)) & 0b11000000)); // [.......A|B.......]
+}
+
+//! \cond
+//! A generic implementation that checks whether a floating point value can be converted to ARM Imm8.
+template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
+[[nodiscard]]
+static ASMJIT_INLINE bool is_fp_imm8_generic(T val) noexcept {
+ constexpr uint32_t kAllBsMask = Support::lsb_mask_const<uint32_t>(kNumBBits);
+ constexpr uint32_t kB0Pattern = Support::bit_mask<uint32_t>(kNumBBits - 1);
+ constexpr uint32_t kB1Pattern = kAllBsMask ^ kB0Pattern;
+
+ T imm_z = val & Support::lsb_mask<T>(kNumZeroBits);
+ uint32_t imm_b = uint32_t(val >> (kNumZeroBits + kNumCDEFGHBits)) & kAllBsMask;
+
+ // ImmZ must be all zeros and ImmB must either be B0 or B1 pattern.
+ return imm_z == 0 && (imm_b == kB0Pattern || imm_b == kB1Pattern);
+}
+//! \endcond
+
+//! Returns true if the given half precision floating point `val` can be encoded as ARM IMM8 value, which represents
+//! a limited set of floating point immediate values, which can be used with FMOV instruction.
+//!
+//! The floating point must have bits distributed in the following way:
+//!
+//! ```
+//! [aBbbcdef|gh000000]
+//! ```
+[[nodiscard]]
+static ASMJIT_INLINE bool is_fp16_imm8(uint32_t val) noexcept { return is_fp_imm8_generic<uint32_t, 3, 6, 6>(val); }
+
+//! Returns true if the given single precision floating point `val` can be encoded as ARM IMM8 value, which represents
+//! a limited set of floating point immediate values, which can be used with FMOV instruction.
+//!
+//! The floating point must have bits distributed in the following way:
+//!
+//! ```
+//! [aBbbbbbc|defgh000|00000000|00000000]
+//! ```
+[[nodiscard]]
+static ASMJIT_INLINE bool is_fp32_imm8(uint32_t val) noexcept { return is_fp_imm8_generic<uint32_t, 6, 6, 19>(val); }
+
+//! \overload
+[[nodiscard]]
+static ASMJIT_INLINE bool is_fp32_imm8(float val) noexcept { return is_fp32_imm8(Support::bit_cast<uint32_t>(val)); }
+
+//! Returns true if the given double precision floating point `val` can be encoded as ARM IMM8 value, which represents
+//! a limited set of floating point immediate values, which can be used with FMOV instruction.
+//!
+//! The floating point must have bits distributed in the following way:
+//!
+//! ```
+//! [aBbbbbbb|bbcdefgh|00000000|00000000|00000000|00000000|00000000|00000000]
+//! ```
+[[nodiscard]]
+static ASMJIT_INLINE bool is_fp64_imm8(uint64_t val) noexcept { return is_fp_imm8_generic<uint64_t, 9, 6, 48>(val); }
+
+//! \overload
+[[nodiscard]]
+static ASMJIT_INLINE bool is_fp64_imm8(double val) noexcept { return is_fp64_imm8(Support::bit_cast<uint64_t>(val)); }
+
+//! \cond
+template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
+static ASMJIT_INLINE uint32_t encode_fp_to_imm8_generic(T val) noexcept {
+ uint32_t bits = uint32_t(val >> kNumZeroBits);
+ return ((bits >> (kNumBBits + kNumCDEFGHBits - 7)) & 0x80u) | (bits & 0x7F);
+}
+//! \endcond
+
+//! Encodes a double precision floating point value into IMM8 format.
+//!
+//! \note This function expects that `is_fp64_imm8(val) == true` so it doesn't perform any checks of the value and just
+//! rearranges some bits into Imm8 order.
+[[nodiscard]]
+static ASMJIT_INLINE uint32_t encode_fp64_to_imm8(uint64_t val) noexcept { return encode_fp_to_imm8_generic<uint64_t, 9, 6, 48>(val); }
+
+//! \overload
+[[nodiscard]]
+static ASMJIT_INLINE uint32_t encode_fp64_to_imm8(double val) noexcept { return encode_fp64_to_imm8(Support::bit_cast<uint64_t>(val)); }
+
+} // {Utils}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_ARM_ARMUTILS_H_INCLUDED
+
diff --git a/3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h b/3rdparty/asmjit/asmjit/asmjit-scope-begin.h
index 93397b584a6..78ba411f1d6 100644
--- a/3rdparty/asmjit/src/asmjit/asmjit-scope-begin.h
+++ b/3rdparty/asmjit/asmjit/asmjit-scope-begin.h
@@ -1,6 +1,6 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifdef _WIN32
diff --git a/3rdparty/asmjit/asmjit/asmjit-scope-end.h b/3rdparty/asmjit/asmjit/asmjit-scope-end.h
new file mode 100644
index 00000000000..b11ca2239f2
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/asmjit-scope-end.h
@@ -0,0 +1,9 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifdef _WIN32
+ #pragma pop_macro("min")
+ #pragma pop_macro("max")
+#endif
diff --git a/3rdparty/asmjit/src/asmjit/asmjit.h b/3rdparty/asmjit/asmjit/asmjit.h
index f5184eb5777..235d826796a 100644
--- a/3rdparty/asmjit/src/asmjit/asmjit.h
+++ b/3rdparty/asmjit/asmjit/asmjit.h
@@ -24,10 +24,12 @@
#ifndef ASMJIT_ASMJIT_H_INCLUDED
#define ASMJIT_ASMJIT_H_INCLUDED
-#include "./core.h"
+#pragma message("asmjit/asmjit.h is deprecated! Please use asmjit/[core|x86|a64|host].h instead.")
+
+#include <asmjit/core.h>
#ifndef ASMJIT_NO_X86
- #include "./x86.h"
+ #include <asmjit/x86.h>
#endif
#endif // ASMJIT_ASMJIT_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/asmjit.natvis b/3rdparty/asmjit/asmjit/asmjit.natvis
new file mode 100644
index 00000000000..c107c7f7aba
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/asmjit.natvis
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- asmjit visualizer for Visual Studio (natvis) -->
+
+<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
+ <Type Name="asmjit::String">
+ <Intrinsic Name="isSmall" Expression="(_type &lt; 0x1F)"/>
+ <DisplayString Condition="isSmall()">{_small.data, s8}</DisplayString>
+ <DisplayString Condition="!isSmall()">{_large.data, s8}</DisplayString>
+ <Expand HideRawView="true">
+ <Synthetic Name="_type">
+ <DisplayString Condition="(_type &lt; 0x1F)">Small</DisplayString>
+ <DisplayString Condition="(_type == 0x1F)">Large</DisplayString>
+ <DisplayString Condition="(_type &gt; 0x1F)">External</DisplayString>
+ </Synthetic>
+ <Item Name="_size" Condition="isSmall()" ExcludeView="simple">(int)_small.type, d</Item>
+ <Item Name="_size" Condition="!isSmall()" ExcludeView="simple">_large.size, d</Item>
+ <Item Name="_capacity" Condition="isSmall()" ExcludeView="simple">asmjit::String::kSSOCapacity, d</Item>
+ <Item Name="_capacity" Condition="!isSmall()" ExcludeView="simple">_large.capacity, d</Item>
+ <Item Name="_data" Condition="isSmall()" ExcludeView="simple">_small.data, s8</Item>
+ <Item Name="_data" Condition="!isSmall()" ExcludeView="simple">_large.data, s8</Item>
+ </Expand>
+ </Type>
+
+ <Type Name="asmjit::ArenaVector&lt;*&gt;">
+ <DisplayString>{{ [size={_size, d} capacity={_capacity, d}] }}</DisplayString>
+ <Expand>
+ <Item Name="_size" ExcludeView="simple">_size, d</Item>
+ <Item Name="_capacity" ExcludeView="simple">_capacity, d</Item>
+ <ArrayItems>
+ <Size>_size</Size>
+ <ValuePointer>(($T1*)_data)</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+
+ <Type Name="asmjit::OperandSignature">
+ <Intrinsic Name="op_type" Expression="(asmjit::OperandType)(_bits &amp; 0x7)" />
+ <Intrinsic Name="opSize" Expression="(_bits &gt;&gt; 24) &amp; 0xFF" />
+ <Intrinsic Name="reg_type" Expression="(asmjit::RegType)((_bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="reg_group" Expression="(asmjit::RegGroup)((_bits &gt;&gt; 8) &amp; 0xF)" />
+ <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_bits &gt;&gt; 8) &amp; 0x1F)" />
+ <Intrinsic Name="memRegHome" Expression="(bool)((_bits &gt;&gt; 13) &amp; 0x1)" />
+ <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_bits &gt;&gt; 18) &amp; 0x7)" />
+ <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_bits &gt;&gt; 14) &amp; 0x3)" />
+ <Intrinsic Name="memX86ShiftValue" Expression="((_bits &gt;&gt; 16) &amp; 0x3)" />
+ <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_bits &gt;&gt; 21) &amp; 0x7)" />
+ <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_bits &gt;&gt; 3) &amp; 0x1)" />
+
+ <DisplayString Condition="op_type() == asmjit::OperandType::kNone">[None]</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kReg">[Reg] {{ type={reg_type()} group={reg_group()} size={opSize(), d} }}</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kMem">[Mem] {{ base={memBaseType()} index={memIndexType()} }}</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kImm">[Imm] {{ type={immType()} }}</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kLabel">[Label]</DisplayString>
+ <DisplayString Condition="op_type() &gt; asmjit::OperandType::kMaxValue">[Unknown]</DisplayString>
+
+ <Expand HideRawView="true">
+ <Item Name="bits">_bits, X</Item>
+ <Item Name="op.type">op_type()</Item>
+ <Item Name="reg.type" Condition="op_type() == asmjit::OperandType::kReg">reg_type()</Item>
+ <Item Name="reg.group" Condition="op_type() == asmjit::OperandType::kReg">reg_group()</Item>
+ <Item Name="reg.size" Condition="op_type() == asmjit::OperandType::kReg">opSize(), d</Item>
+ <Item Name="mem.base_type" Condition="op_type() == asmjit::OperandType::kMem">memBaseType()</Item>
+ <Item Name="mem.index_type" Condition="op_type() == asmjit::OperandType::kMem">memIndexType()</Item>
+ <Item Name="mem.regHome" Condition="op_type() == asmjit::OperandType::kMem">memRegHome()</Item>
+ <Item Name="mem.size" Condition="op_type() == asmjit::OperandType::kMem">opSize(), d</Item>
+ <Item Name="mem.x86.segment" Condition="op_type() == asmjit::OperandType::kMem">memX86Segment()</Item>
+ <Item Name="mem.x86.addr_type" Condition="op_type() == asmjit::OperandType::kMem">memX86AddrType()</Item>
+ <Item Name="mem.x86.shift" Condition="op_type() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
+ <Item Name="mem.x86.broadcast" Condition="op_type() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
+ <Item Name="imm.type" Condition="op_type() == asmjit::OperandType::kImm">immType()</Item>
+ </Expand>
+ </Type>
+
+ <Type Name="asmjit::Operand_">
+ <Intrinsic Name="op_type" Expression="(asmjit::OperandType)(_signature._bits &amp; 0x7)" />
+ <Intrinsic Name="opSize" Expression="(_signature._bits &gt;&gt; 24) &amp; 0xFF" />
+ <Intrinsic Name="reg_type" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="reg_group" Expression="(asmjit::RegGroup)((_signature._bits &gt;&gt; 8) &amp; 0xF)" />
+ <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 3) &amp; 0x1F)" />
+ <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 8) &amp; 0x1F)" />
+ <Intrinsic Name="memRegHome" Expression="(bool)((_signature._bits &gt;&gt; 13) &amp; 0x1)" />
+ <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_signature._bits &gt;&gt; 18) &amp; 0x7)" />
+ <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_signature._bits &gt;&gt; 14) &amp; 0x3)" />
+ <Intrinsic Name="memX86ShiftValue" Expression="((_signature._bits &gt;&gt; 16) &amp; 0x3)" />
+ <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_signature._bits &gt;&gt; 21) &amp; 0x7)" />
+ <Intrinsic Name="memBaseId" Expression="_base_id" />
+ <Intrinsic Name="memIndexId" Expression="_data[0]" />
+ <Intrinsic Name="memOffset32b" Expression="(__int64)int(_data[1])" />
+ <Intrinsic Name="memOffset64b" Expression="(__int64) ((unsigned __int64)_base_id &lt;&lt; 32) | ((unsigned __int64)_data[1])" />
+ <Intrinsic Name="memOffset" Expression="memBaseType() != asmjit::RegType::kNone ? memOffset32b() : memOffset64b()" />
+ <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_signature._bits &gt;&gt; 3) &amp; 0x1)" />
+ <Intrinsic Name="immValue" Expression="((__int64)_data[1] &lt;&lt; 32) | (__int64)_data[0]" />
+
+ <DisplayString Condition="op_type() == asmjit::OperandType::kNone">[None]</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kReg">[Reg] {{ id={_base_id, d} group={reg_group(), d} type={reg_type(), d} size={opSize(), d} }}</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kMem">[Mem] {{ base_id={memBaseId(), d} index_id={memIndexId(), d} offset={(__int64)memOffset(), d} }}</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kImm">[Imm] {{ val={immValue(), d} hex={immValue(), X} }}</DisplayString>
+ <DisplayString Condition="op_type() == asmjit::OperandType::kLabel">[Label] {{ id={_base_id} }}</DisplayString>
+ <DisplayString Condition="op_type() &gt; 4">[Unknown]</DisplayString>
+ <Expand HideRawView="true">
+ <Item Name="_signature">_signature._bits, X</Item>
+ <Item Name="op.type">op_type()</Item>
+ <Item Name="op.size">opSize(), d</Item>
+ <Item Name="reg.type" Condition="op_type() == asmjit::OperandType::kReg">reg_type()</Item>
+ <Item Name="reg.group" Condition="op_type() == asmjit::OperandType::kReg">reg_group()</Item>
+ <Item Name="reg.id" Condition="op_type() == asmjit::OperandType::kReg">_base_id, d</Item>
+ <Item Name="mem.base_type" Condition="op_type() == asmjit::OperandType::kMem">memBaseType()</Item>
+ <Item Name="mem.base_id" Condition="op_type() == asmjit::OperandType::kMem &amp;&amp; memBaseType() != asmjit::RegType::kNone">memBaseId()</Item>
+ <Item Name="mem.index_type" Condition="op_type() == asmjit::OperandType::kMem">memIndexType()</Item>
+ <Item Name="mem.index_id" Condition="op_type() == asmjit::OperandType::kMem &amp;&amp; memIndexType() != asmjit::RegType::kNone">memIndexId()</Item>
+ <Item Name="mem.regHome" Condition="op_type() == asmjit::OperandType::kMem">memRegHome()</Item>
+ <Item Name="mem.offset" Condition="op_type() == asmjit::OperandType::kMem">memOffset(), d</Item>
+ <Item Name="mem.x86.segment" Condition="op_type() == asmjit::OperandType::kMem">memX86Segment()</Item>
+ <Item Name="mem.x86.addr_type" Condition="op_type() == asmjit::OperandType::kMem">memX86AddrType()</Item>
+ <Item Name="mem.x86.shift" Condition="op_type() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
+ <Item Name="mem.x86.broadcast" Condition="op_type() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
+ <Item Name="imm.type" Condition="op_type() == asmjit::OperandType::kImm">immType()</Item>
+ <Item Name="imm.value" Condition="op_type() == asmjit::OperandType::kImm">immValue(), X</Item>
+ <Item Name="label.id" Condition="op_type() == asmjit::OperandType::kLabel">_base_id, d</Item>
+ <Item Name="raw.base_id">_base_id</Item>
+ <Item Name="raw.data[0]">_data[0]</Item>
+ <Item Name="raw.data[1]">_data[1]</Item>
+ </Expand>
+ </Type>
+
+ <Type Name="asmjit::FuncValue">
+ <Intrinsic Name="is_reg" Expression="(_data &amp; asmjit::FuncValue::kFlagIsReg) != 0" />
+ <Intrinsic Name="isStack" Expression="(_data &amp; asmjit::FuncValue::kFlagIsStack) != 0" />
+ <Intrinsic Name="isIndirect" Expression="(_data &amp; asmjit::FuncValue::kFlagIsIndirect) != 0" />
+ <Intrinsic Name="is_done" Expression="(_data &amp; asmjit::FuncValue::kFlagIsDone) != 0" />
+
+ <Intrinsic Name="type_id" Expression="((_data &amp; asmjit::FuncValue::kTypeIdMask) &gt;&gt; asmjit::FuncValue::kTypeIdShift)" />
+ <Intrinsic Name="reg_id" Expression="((_data &amp; asmjit::FuncValue::kRegIdMask) &gt;&gt; asmjit::FuncValue::kRegIdShift)" />
+ <Intrinsic Name="reg_type" Expression="((_data &amp; asmjit::FuncValue::kRegTypeMask) &gt;&gt; asmjit::FuncValue::kRegTypeShift)" />
+ <Intrinsic Name="stack_offset" Expression="((_data &amp; asmjit::FuncValue::kStackOffsetMask) &gt;&gt; asmjit::FuncValue::kStackOffsetShift)" />
+
+ <DisplayString Condition="is_reg()">[RegValue {{ reg_type={reg_type()} indirect={isIndirect()} done={is_done()} }}]</DisplayString>
+ <DisplayString Condition="isStack()">[StackValue {{ indirect={isIndirect()} done={is_done()} }}]</DisplayString>
+ <DisplayString Condition="!is_reg() &amp;&amp; !isStack()">[Unknown]</DisplayString>
+
+ <Expand HideRawView="true">
+ <Item Name="data">_data</Item>
+ <Item Name="type_id">(asmjit::TypeId)(type_id())</Item>
+ <Item Name="reg_type" Condition="is_reg()">(asmjit::RegType)reg_type()</Item>
+ <Item Name="reg_id" Condition="is_reg()">reg_id()</Item>
+ <Item Name="stack_offset" Condition="isStack()">stack_offset()</Item>
+ </Expand>
+ </Type>
+
+ <Type Name="asmjit::BaseNode">
+ <Intrinsic Name="nodeType" Expression="_node_type" />
+
+ <Intrinsic Name="is_inst" Expression="nodeType() == asmjit::NodeType::kInst"></Intrinsic>
+ <Intrinsic Name="is_section" Expression="nodeType() == asmjit::NodeType::kSection"></Intrinsic>
+ <Intrinsic Name="is_label" Expression="nodeType() == asmjit::NodeType::kLabel"></Intrinsic>
+ <Intrinsic Name="is_align" Expression="nodeType() == asmjit::NodeType::kAlign"></Intrinsic>
+ <Intrinsic Name="is_embed_data" Expression="nodeType() == asmjit::NodeType::kEmbedData"></Intrinsic>
+ <Intrinsic Name="is_embed_label" Expression="nodeType() == asmjit::NodeType::kEmbedLabel"></Intrinsic>
+ <Intrinsic Name="is_embed_label_delta" Expression="nodeType() == asmjit::NodeType::kEmbedLabelDelta"></Intrinsic>
+ <Intrinsic Name="is_const_pool" Expression="nodeType() == asmjit::NodeType::kConstPool"></Intrinsic>
+ <Intrinsic Name="is_comment" Expression="nodeType() == asmjit::NodeType::kComment"></Intrinsic>
+ <Intrinsic Name="is_sentinel" Expression="nodeType() == asmjit::NodeType::kSentinel"></Intrinsic>
+ <Intrinsic Name="isJump" Expression="nodeType() == asmjit::NodeType::kJump"></Intrinsic>
+ <Intrinsic Name="is_func" Expression="nodeType() == asmjit::NodeType::kFunc"></Intrinsic>
+ <Intrinsic Name="is_func_ret" Expression="nodeType() == asmjit::NodeType::kFuncRet"></Intrinsic>
+ <Intrinsic Name="is_invoke" Expression="nodeType() == asmjit::NodeType::kInvoke"></Intrinsic>
+
+ <Intrinsic Name="actsAsInst" Expression="is_inst() || isJump() || is_func() || is_func_ret() || is_invoke()" />
+ <Intrinsic Name="actsAsLabel" Expression="is_label() || is_func()" />
+
+ <DisplayString Condition="is_inst()">[InstNode]</DisplayString>
+ <DisplayString Condition="is_section()">[SectionNode]</DisplayString>
+ <DisplayString Condition="is_label()">[LabelNode]</DisplayString>
+ <DisplayString Condition="is_align()">[AlignNode]</DisplayString>
+ <DisplayString Condition="is_embed_data()">[EmbedDataNode]</DisplayString>
+ <DisplayString Condition="is_embed_label()">[EmbedLabelNode]</DisplayString>
+ <DisplayString Condition="is_embed_label_delta()">[EmbedLabelDeltaNode]</DisplayString>
+ <DisplayString Condition="is_const_pool()">[ConstPoolNode]</DisplayString>
+ <DisplayString Condition="is_comment()">[CommentNode]</DisplayString>
+ <DisplayString Condition="is_sentinel()">[SentinelNode]</DisplayString>
+ <DisplayString Condition="isJump()">[JumpNode]</DisplayString>
+ <DisplayString Condition="is_func()">[FuncNode]</DisplayString>
+ <DisplayString Condition="is_func_ret()">[FuncRetNode]</DisplayString>
+ <DisplayString Condition="is_invoke()">[InvokeNode]</DisplayString>
+ <DisplayString Condition="nodeType() == asmjit::NodeType::kNone || nodeType() &gt; 18">[UnknownNode {nodeType(), d}]</DisplayString>
+
+ <Expand HideRawView="true">
+ <Item Name="prev">_prev</Item>
+ <Item Name="next">_next</Item>
+
+ <Item Name="nodeType">_node_type</Item>
+ <Item Name="nodeFlags">_node_flags</Item>
+
+ <Item Name="position">_position</Item>
+ <Item Name="user_data.u64">_userDataU64</Item>
+ <Item Name="user_data.ptr">_userDataPtr</Item>
+ <Item Name="pass_data">_passData</Item>
+ <Item Name="inline_comment">_inline_comment, s8</Item>
+
+ <Item Name="baseInst" Condition="actsAsInst()">((asmjit::InstNode*)this)-&gt;_baseInst</Item>
+ <Item Name="op_count" Condition="actsAsInst()">_inst._op_count</Item>
+ <Item Name="op_capacity" Condition="actsAsInst()">_inst._op_capacity</Item>
+ <Item Name="op_array" Condition="actsAsInst()">((asmjit::InstNode*)this)-&gt;_opArray, [_inst._op_count]</Item>
+
+ <Item Name="section_id" Condition="is_section()">((asmjit::SectionNode*)this)-&gt;_section_id</Item>
+ <Item Name="nextSection" Condition="is_section()">((asmjit::SectionNode*)this)-&gt;_nextSection</Item>
+
+ <Item Name="label_id" Condition="is_label()">((asmjit::LabelNode*)this)-&gt;_label_id</Item>
+
+ <Item Name="align_mode" Condition="is_align()">((asmjit::AlignNode*)this)-&gt;_align_data._align_mode</Item>
+ <Item Name="alignment" Condition="is_align()">((asmjit::AlignNode*)this)-&gt;_alignment</Item>
+
+ <Item Name="type_id" Condition="is_embed_data()">_embed._type_id, d</Item>
+ <Item Name="type_size" Condition="is_embed_data()">_embed._type_size, d</Item>
+ <Item Name="item_count" Condition="is_embed_data()">((asmjit::EmbedDataNode*)this)-&gt;_item_count</Item>
+ <Item Name="repeat_count" Condition="is_embed_data()">((asmjit::EmbedDataNode*)this)-&gt;_repeat_count</Item>
+ <Item Name="inlineData" Condition="is_embed_data()">((asmjit::EmbedDataNode*)this)-&gt;_inlineData</Item>
+ <Item Name="externalData" Condition="is_embed_data()">((asmjit::EmbedDataNode*)this)-&gt;_externalData</Item>
+
+ <Item Name="label_id" Condition="is_embed_label()">((asmjit::EmbedLabelNode*)this)-&gt;_label_id</Item>
+
+ <Item Name="label_id" Condition="is_embed_label_delta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_label_id</Item>
+ <Item Name="base_label_id" Condition="is_embed_label_delta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_base_label_id</Item>
+ <Item Name="data_size" Condition="is_embed_label_delta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_data_size</Item>
+
+ <Item Name="const_pool" Condition="is_const_pool()">((asmjit::ConstPoolNode*)this)-&gt;_const_pool</Item>
+
+ <Item Name="sentinel.sentinel_type" Condition="is_sentinel()">_sentinel._sentinel_type</Item>
+
+ <Item Name="annotation" Condition="isJump()">((asmjit::JumpNode*)this)-&gt;_annotation</Item>
+
+ <Item Name="func_detail" Condition="is_func()">((asmjit::FuncNode*)this)-&gt;_func_detail</Item>
+ <Item Name="frame" Condition="is_func()">((asmjit::FuncNode*)this)-&gt;_frame</Item>
+ <Item Name="exit_node" Condition="is_func()">((asmjit::FuncNode*)this)-&gt;_exit_node</Item>
+ <Item Name="end" Condition="is_func()">((asmjit::FuncNode*)this)-&gt;_end</Item>
+ <Item Name="args" Condition="is_func()">((asmjit::FuncNode*)this)-&gt;_args, [((asmjit::FuncNode*)this)-&gt;_func_detail._arg_count]</Item>
+
+ <Item Name="func_detail" Condition="is_invoke()">((asmjit::InvokeNode*)this)-&gt;_func_detail</Item>
+ <Item Name="rets" Condition="is_invoke()">((asmjit::InvokeNode*)this)-&gt;_rets</Item>
+ <Item Name="args" Condition="is_invoke()">((asmjit::InvokeNode*)this)-&gt;_args, [((asmjit::InvokeNode*)this)-&gt;_func_detail._arg_count]</Item>
+ </Expand>
+ </Type>
+</AutoVisualizer>
diff --git a/3rdparty/asmjit/asmjit/core.h b/3rdparty/asmjit/asmjit/core.h
new file mode 100644
index 00000000000..c26ddb83985
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core.h
@@ -0,0 +1,2320 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// SPDX-License-Identifier: Zlib
+// Official GitHub Repository: https://github.com/asmjit/asmjit
+//
+// Copyright (c) 2008-2025 The AsmJit Authors
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+#ifndef ASMJIT_CORE_H_INCLUDED
+#define ASMJIT_CORE_H_INCLUDED
+
+//! Root namespace used by AsmJit.
+namespace asmjit {
+
+//! \mainpage API Reference
+//!
+//! AsmJit C++ API reference documentation generated by Doxygen.
+//!
+//! AsmJit library uses one global namespace called \ref asmjit, which provides the whole functionality. Core
+//! functionality is within \ref asmjit namespace and architecture specific functionality is always in its own
+//! namespace. For example \ref asmjit::x86 provides both 32-bit and 64-bit X86 code generation.
+//!
+//! \section doc_groups Documentation Groups
+//!
+//! AsmJit documentation is structured into groups. Groups can be followed in order to learn AsmJit, but knowledge
+//! from multiple groups is required to use AsmJit properly:
+//!
+//! $$DOCS_GROUP_OVERVIEW$$
+//!
+//! \note It's important to understand that in order to learn AsmJit all groups are important. Some groups can be
+//! omitted if a particular tool is out of interest - for example \ref asmjit_assembler users don't need to know
+//! about \ref asmjit_builder, but it's not the opposite. \ref asmjit_builder users should know about \ref
+//! asmjit_assembler as it also uses operands, labels, and other concepts. Similarly \ref asmjit_compiler users
+//! should know how both \ref asmjit_assembler and \ref asmjit_builder tools work.
+//!
+//! \section where_to_start Where To Start
+//!
+//! AsmJit \ref asmjit_core provides the following two classes that are essential from the code generation perspective:
+//!
+//! - \ref CodeHolder provides functionality to temporarily hold the generated code. It stores all the necessary
+//! information about the code - code buffers, sections, labels, symbols, and information about relocations.
+//!
+//! - \ref BaseEmitter provides interface used by emitter implementations. The interface provides basic building
+//! blocks that are then implemented by \ref BaseAssembler, \ref BaseBuilder, and \ref BaseCompiler.
+//!
+//! Code emitters:
+//!
+//! - \ref asmjit_assembler - provides direct machine code generation.
+//!
+//! - \ref asmjit_builder - provides intermediate code generation that can be processed before it's serialized to
+//! \ref BaseAssembler.
+//!
+//! - \ref asmjit_compiler - provides high-level code generation with built-in register allocation.
+//!
+//! - \ref FuncNode - provides insight into how function looks from the Compiler perspective and how it's stored in
+//! a node-list.
+//!
+//! \section main_recommendations Recommendations
+//!
+//! The following steps are recommended for all AsmJit users:
+//!
+//! - Make sure that you use \ref Logger, see \ref asmjit_logging.
+//!
+//! - Make sure that you use \ref ErrorHandler, see \ref asmjit_error_handling.
+//!
+//! - Instruction validation in your debug builds can reveal problems too. AsmJit provides validation at instruction
+//! level that can be enabled via \ref BaseEmitter::add_diagnostic_options(). See \ref DiagnosticOptions for more
+//! details.
+//!
+//! - If you are a Compiler user, use diagnostic options and read carefully if anything suspicious pops out.
+//! Diagnostic options can be enabled via \ref BaseEmitter::add_diagnostic_options(). If unsure which ones to use,
+//! enable annotations and all debug options: `DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll`.
+//!
+//! - Make sure you put a breakpoint into \ref make_error() function if you have a problem with AsmJit
+//! returning errors during instruction encoding or register allocation. Having an active breakpoint there can
+//! help to reveal the origin of the error, to inspect variables and other conditions that caused it.
+//!
+//! The reason for using \ref Logger and \ref ErrorHandler is that they provide a very useful information about what's
+//! happening inside emitters. In many cases the information provided by these two is crucial to quickly identify and
+//! fix issues that happen during development (for example wrong instruction, address, or register used). In addition,
+//! output from \ref Logger is always necessary when filling bug reports. In other words, using logging and proper error
+//! handling can save a lot of time during the development and can also save users from submitting issues.
+//!
+//! \section other_pages Other Pages
+//!
+//! - <a href="annotated.html">Class List</a> - List of classes sorted alphabetically
+//! - <a href="namespaceasmjit.html">AsmJit Namespace</a> - List of symbols provided by `asmjit` namespace
+
+
+//! \defgroup asmjit_build Build Instructions
+//! \brief Build instructions, supported environments, and feature selection.
+//!
+//! ### Overview
+//!
+//! AsmJit is designed to be easy embeddable in any project. However, it depends on some compile-time definitions that
+//! can be used to enable or disable features to decrease the resulting binary size. A typical way of building AsmJit
+//! is to use [cmake](https://www.cmake.org), but it's also possible to just include AsmJit source code in your project
+//! and to just build it. The easiest way to include AsmJit in your project is to just include **src** directory in
+//! your project and to define \ref ASMJIT_STATIC. AsmJit can be just updated from time to time without any changes to
+//! this integration process. Do not embed AsmJit's `test` files in such case as these are used exclusively for testing.
+//!
+//! \section supported_environment Supported Operating Systems, Compilers, and Build Tools
+//!
+//! ### Supported C++ Compilers
+//!
+//! - Requirements:
+//!
+//! - AsmJit won't build without C++17 enabled. If you use older GCC or Clang you would have to enable at least
+//! C++17 standard through compiler flags.
+//!
+//! - Tested:
+//!
+//! - **Clang** - Tested by GitHub Actions - Clang 14+ is officially supported and tested by CI, older Clang versions
+//! having C++17 should work, but these versions are not tested anymore due to upgraded CI images.
+//!
+//! - **GNU** - Tested by GitHub Actions - GCC 9+ is officially supported and tested by CI, older GCC versions such
+//! as GCC 7 should work, but these versions are not tested anymore due to upgraded CI images.
+//!
+//! - **MINGW** - Reported to work, but not tested in our CI environment (help welcome!).
+//!
+//! - **MSVC** - Tested by GitHub Actions - VS2022 and onwards are officially supported and tested by CI, VS2015,
+//! VS2017, and VS2019 are not tested anymore due to upgraded CI images. VS2019 should work well.
+//!
+//! ### Supported Operating Systems and Platforms
+//!
+//! - Tested:
+//!
+//! - **BSD** - FreeBSD, NetBSD, and OpenBSD tested by GitHub Actions (only recent images are tested by CI). BSD
+//! runners only test BSD images with Clang compiler. Both X86_64 and AArch64 host builds are tested.
+//!
+//! - **Linux** - Tested by GitHub Actions (only recent Ubuntu images are tested by CI, in general any distribution
+//! should be supported as AsmJit has no dependencies). Linux tests X86, X86_64, and AArch64 host builds.
+//!
+//! - **Mac OS** - Tested by GitHub Actions.
+//!
+//! - **Windows** - Tested by GitHub Actions - (Windows 7+ is officially supported).
+//!
+//! - **Emscripten** - Works if compiled with \ref ASMJIT_NO_JIT. AsmJit cannot generate WASM code, but can be
+//! used to generate X86/X64/AArch64 code within a browser, for example.
+//!
+//! - Untested:
+//!
+//! - **Haiku** - Reported to work, not tested by CI.
+//!
+//! - **Other** operating systems would require some testing and support in the following files:
+//! - [core/api-config.h](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/api-config.h)
+//! - [core/osutils.cpp](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/osutils.cpp)
+//! - [core/virtmem.cpp](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/virtmem.cpp)
+//!
+//! ### Supported Backends / Architectures
+//!
+//! - **X86** and **X86_64** - Both 32-bit and 64-bit backends tested on CI.
+//! - **AArch64** - Tested on CI (Native Apple runners and Linux emulated via QEMU).
+//!
+//! \section build_mode Static Builds and Embedding
+//!
+//! These definitions can be used to enable static library build. Embed is used when AsmJit's source code is embedded
+//! directly in another project, implies static build as well.
+//!
+//! - \ref ASMJIT_EMBED - Asmjit is embedded, implies \ref ASMJIT_STATIC.
+//! - \ref ASMJIT_STATIC - Enable static-library build.
+//!
+//! \note Projects that use AsmJit statically must define \ref ASMJIT_STATIC in all compilation units that use AsmJit,
+//! otherwise AsmJit would use dynamic library imports in \ref ASMJIT_API decorator. The recommendation is to define
+//! this macro across the whole project that uses AsmJit this way.
+//!
+//! \section cmake_integration CMake Integration
+//!
+//! AsmJit has a first-class CMake support. When consuming AsmJit as a cmake dependency, just use `asmjit::asmjit`
+//! as a link dependency, which would instrument cmake to setup everything else, including include paths, and build
+//! flags (either defining `ASMJIT_STATIC` or not, and possibly defining other AsmJit feature macros). For example
+//! considering that AsmJit was fetched to `3rdparty/asmjit` directory in your project as an external dependency,
+//! you can just use the following CMake snippet that integrates AsmJit with your own CMake project:
+//!
+//! ```cmake
+//! cmake_minimum_required(VERSION 3.30 FATAL_ERROR)
+//! project(app C CXX)
+//!
+//! set(ASMJIT_DIR "3rdparty/asmjit") # Location of AsmJit.
+//! set(ASMJIT_STATIC TRUE) # Force static build.
+//! add_subdirectory("${ASMJIT_DIR}") # Adds AsmJit sub-project to your project.
+//!
+//! add_executable(app asmjit_consumer.cpp) # Adds executable that uses AsmJit.
+//! target_link_libraries(app asmjit::asmjit) # Adds AsmJit as a dependency to app.
+//! target_compile_features(app PUBLIC cxx_std_17) # Makes C++17 as a requirement.
+//! ```
+//!
+//! \section build_type Build Type Configuration
+//!
+//! These definitions control whether asserts are active or not. By default AsmJit would autodetect build configuration
+//! from existing pre-processor definitions, but this behavior can be overridden, for example to enable debug asserts
+//! in release configuration.
+//!
+//! - \ref ASMJIT_BUILD_DEBUG - Overrides build configuration to debug, asserts will be enabled in this case.
+//! - \ref ASMJIT_BUILD_RELEASE - Overrides build configuration to release, asserts will be disabled in this case.
+//!
+//! \note There is usually no need to override the build configuration. AsmJit detects the build configuration by
+//! checking whether `NDEBUG` is defined and automatically defines \ref ASMJIT_BUILD_RELEASE if configuration overrides
+//! were not used. We only recommend using build configuration overrides in special situations, like using AsmJit in
+//! release configuration with asserts enabled for whatever reason.
+//!
+//! \section build_backends AsmJit Backends
+//!
+//! All backends AsmJit supports are included by default. To exclude a backend use the following build-type macros:
+//!
+//! - \ref ASMJIT_NO_X86 - Disables both X86 and X86_64 backends.
+//! - \ref ASMJIT_NO_AARCH64 - Disables AArch64 backend.
+//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architecture backends, only keeps a native backend.
+//! For example if your target is X86, `ASMJIT_NO_FOREIGN` would disable every backend but X86.
+//!
+//! \section build_options Build Options
+//!
+//! - \ref ASMJIT_NO_SHM_OPEN - Disables functionality that uses `shm_open()`.
+//!
+//! - \ref ASMJIT_NO_ABI_NAMESPACE - Disables inline ABI namespace within `asmjit` namespace. This is only provided
+//! for users that control all the dependencies (even transitive ones) and that make sure that no two AsmJit
+//! versions are used at the same time. This option can be debugging a little simpler as there would not be ABI
+//! tag after `asmjit::` namespace. Otherwise asmjit would look like `asmjit::_abi_1_13::`, for example.
+//!
+//! \section build_features Build Features
+//!
+//! AsmJit builds by default all supported features, which includes all emitters, logging, instruction validation
+//! and introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...`
+//! definitions.
+//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime.
+//!
+//! - \ref ASMJIT_NO_TEXT - Disables everything that contains string representation of AsmJit constants, should
+//! be used together with \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the ability to query
+//! instruction names, register names, etc...
+//!
+//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter.
+//!
+//! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection and validation API, must be used together
+//! with \ref ASMJIT_NO_COMPILER as \ref asmjit_compiler requires introspection for its liveness analysis and
+//! register allocation.
+//!
+//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref
+//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder.
+//!
+//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely.
+//!
+//! \note It's not recommended to disable features if you plan to build AsmJit as a shared library that will be
+//! used by multiple projects that you don't control how AsmJit was built (for example AsmJit in a Linux distribution).
+//! The possibility to disable certain features exists mainly for customized AsmJit builds.
+
+
+//! \defgroup asmjit_breaking_changes Breaking Changes
+//! \brief Documentation of breaking changes.
+//!
+//! ### Overview
+//!
+//! AsmJit is a live project that is being actively developed. Deprecating the existing API in favor of a new
+//! one is preferred, but it's not always possible if the changes are significant. AsmJit authors prefer to do
+//! accumulated breaking changes at once instead of breaking the API often. This page documents deprecated and
+//! removed APIs and should serve as a how-to guide for people that want to port existing code to work with the
+//! newest AsmJit.
+//!
+//! \section api_changes API Changes
+//!
+//! ### Changes committed at 2025-09-06
+//!
+//! Core changes:
+//!
+//! - Refactored AsmJit to use snake_case_function_names() instead of camelCasedFunctionNames().
+//!
+//! - Renamed Compiler's `newIntPtr()` and `newUIntPtr()` to `new_gp_ptr()`, or you should use just `new_gpz()`.
+//!
+//! - Renamed Zone to Arena (including containers) and merged Arena and ArenaAllocator into a single class.
+//!
+//! - Removed `Support::Temporary` in favor of `Span<uint8_t>`. `CodeHolder` and `Arena` now accept
+//! `Span<uint8_t>` instead of `Support::Temporary`.
+//!
+//! ### Changes committed at 2025-06-15
+//!
+//! Core changes:
+//!
+//! - No more architecture specific \ref RegTraits - removed `BaseRegTraits` and kept just RegTraits:
+//!
+//! - `BaseRegTraits` -> `RegTraits`
+//! - `arm::RegTraits` -> `RegTraits`
+//! - `x86::RegTraits` -> `RegTraits`
+//!
+//! - Removed register signature and helper functions from ArchTraits. This functionality is now available
+//! via asmjit::RegTraits and asmjit::RegUtils and doesn't require a valid architecture traits instance.
+//!
+//! - No more architecture specific Gp/Vec/Mask register types in RegType and RegGroup:
+//!
+//! - `RegGroup::kX86_Rip` -> `RegGroup::kPC`
+//! - `RegGroup::kX86_KReg` -> `RegGroup::kMask`
+//! - `RegType::kX86_GpbLo` -> `RegType::kGp8Lo`
+//! - `RegType::kX86_GpbLo` -> `RegType::kGp8Lo`
+//! - `RegType::kX86_GpbHi` -> `RegType::kGp8Hi`
+//! - `RegType::kX86_Gpw` -> `RegType::kGp16`
+//! - `RegType::kX86_Gpd` -> `RegType::kGp32`
+//! - `RegType::kX86_Gpq` -> `RegType::kGp64`
+//! - `RegType::kX86_Xmm` -> `RegType::kVec128`
+//! - `RegType::kX86_Ymm` -> `RegType::kVec256`
+//! - `RegType::kX86_Zmm` -> `RegType::kVec512`
+//! - `RegType::kX86_KReg` -> `RegType::kMask`
+//! - `RegType::kARM_PC` -> `RegType::kPC`
+//! - `RegType::kARM_GpW` -> `RegType::kGp32`
+//! - `RegType::kARM_GpX` -> `RegType::kGp64`
+//! - `RegType::kARM_VecB` -> `RegType::kVec8`
+//! - `RegType::kARM_VecH` -> `RegType::kVec16`
+//! - `RegType::kARM_VecS` -> `RegType::kVec32`
+//! - `RegType::kARM_VecD` -> `RegType::kVec64`
+//! - `RegType::kARM_VecQ` -> `RegType::kVec128`
+//! - `RegType::kARM_VecV` -> `RegType::kVec128`
+//!
+//! - Renamed `asmjit::BaseReg` to asmjit::Reg, added `asmjit::UniGp` and `asmjit::UniVec` which are now base
+//! classes for platform specific `[x86|a64]::Gp` and `[x86|a64]::Vec`
+//!
+//! - Gp and Vec register API is now more platform independent - use `isGp32()` instead of `isGpd()`, similarly,
+//! use `isGp64` instead of `isGpq()` (X86_64) or `isGpX()` (AArch64), etc... The same applies to vectors -
+//! use `isVec128()` instead of `isXmm()` (X86) or `isVecQ()` (AArch64), `isVec256()` instead of `isYmm()`,
+//! etc...
+//!
+//! - Renamed some member functions in Operand and Reg:
+//!
+//! - `isType(regId)` -> `isReg(regId)`
+//! - `isGroup(regGroup)` -> `isReg(regGroup)`
+//! - `regOp.type()` -> `regOp.regType()`
+//! - `regOp.group()` -> `regOp.regGroup()`
+//!
+//! - Removed some static functions from \ref Operand, \ref Reg, etc... in favor of member functions. Most
+//! of the operand functionality is now provided by \ref Operand_ class:
+//!
+//! - `Operand::isGp(op)` -> op.isGp();
+//! - `x86::Reg::isGp(op, id)` -> op.isGp(id);
+//!
+//! - Removed sub-registers `x86::Gpb`, `x86::GpbLo`, `x86::GpbHi`, `x86::Gpw`, `x86::Gpd`, `x86::Gpq`, `x86::Xmm`,
+//! `x86::Ymm`, `x86::Zmm` - use just `x86::Gp` and `x86::Vec`, which represent all removed X86 sub-registers.
+//! From now, use `x86::Gp` to work with x86 general purpose registers and `x86::Vec` to work with XMM, YMM,
+//! and ZMM registers.
+//!
+//! - Removed sub-registers `a64::GpW` and `a64::GpX`, `a64::VecB`, `a64::VecH`, `a64::VecS`, `a64::VecD`,
+//! `a64::VecV`, which represent all removed AArch64 sub-registers. From now, use `a64::Gp` to work with
+//! general purpose registers and `a64::Vec` to work with NEON registers of any size, element type, and
+//! element index.
+//!
+//! - Since sub-register types are gone it's no longer possible to write `gpb(id)` to get AL register, etc...
+//! However, all register operands that can hold multiple register types now offer `Reg::make_xxx(id)` API,
+//! which can be used as a convenience or just use platform specific API like `x86::gpd(id)` or `x86::gp32(id)`,
+//! similarly for AArch64 use `a64::x(id)` or `a64::gp64(id)`, etc...
+//!
+//! - Renamed some id getters - `Section::id()` -> `Section::sectionId()`, etc...
+//!
+//! Builder changes:
+//!
+//! - Removed BaseBuilder::deletePass() - this function was most likely never used by user code and it was also
+//! never used by AsmJit. Passes should be only added and not removed, which simplifies some planned future
+//! changes.
+//!
+//! ### Changes committed at 2025-05-24
+//!
+//! Core changes:
+//!
+//! - AsmJit now requires C++17 to compile.
+//!
+//! - Deprecated asmjit/asmjit.h header. Use asmjit/core.h to include everything except backend specific stuff,
+//! and asmjit/x86.h or asmjit/a64.h to include tools of a specific architecture. At this time the asmjit.h
+//! header is just deprecated, so it will still work as it used to for some time.
+//!
+//! ### Changes committed at 2025-05-10
+//!
+//! Core changes:
+//!
+//! - Removed AVX512 functionality that was never used on x86 hardware as Xeon Phi was never supported by AsmJit:
+//!
+//! - AVX512_ER
+//! - AVX512_PF
+//! - AVX512_4FMAPS
+//! - AVX512_4VNNIW
+//!
+//! - Instruction 'vcvtneps2bf16' no longer accepts memory operand without explicit size (to minimize ambiguity)
+//!
+//! ### Changes committed at 2024-01-01
+//!
+//! Core changes:
+//!
+//! - Renamed equality functions `eq()` to `equals()` - Only related to `String`, `ZoneVector`, and `CpuFeatures`.
+//! Old function names were deprecated.
+//!
+//! - Removed `CallConvId::kNone` in favor of `CallConvId::kCDecl`, which is now the default calling convention.
+//!
+//! - Deprecated `CallConvId::kHost` in favor of `CallConvId::kCDecl` - host calling convention is now not part
+//! of CallConvId, it can be calculated from CallConvId and Environment instead.
+//!
+//! ### Changes committed at 2023-12-27
+//!
+//! Core changes:
+//!
+//! - Renamed `a64::Vec::ElementType` to `a64::VecElementType` and made it a typed enum. This enum was used mostly
+//! internally, but there is a public API using it, so it's a breaking change.
+//!
+//! - Refactored `FuncSignature`, `FuncSignatureT`, and `FuncSignatureBuilder`. There is only `FuncSignature` now,
+//! which acts as a function signature holder and builder. Replace `FuncSignatureBuilder` with `FuncSignature`
+//! and use `FuncSignature::build<args>` instead of `FuncSignatureT<args>`. The old API has been deprecated.
+//!
+//! - The maximum number of function arguments was raised from 16 to 32.
+//!
+//! ### Changes committed at 2023-12-26
+//!
+//! Core changes:
+//!
+//! - Reworked InstNode and InstExNode to be friendlier to static analysis and to not cause undefined behavior.
+//! InstNode has no operands visually embedded within the struct so there is no _opArray (which was internal).
+//! This means that sizeof(InstNode) changed, but since it's allocated by AsmJit this should be fine. Moreover,
+//! there is no longer InstExNode as that was more a hack, instead there is now InstNodeWithOperands, which is
+//! a template and specifies the number of operands embedded (InstNode accesses these). All nodes that inherited
+//! InstExNode now just inherit InstNodeWithOperands<InstNode::kBaseOpCapacity>, which would provide the same
+//! number of nodes as InstNode.
+//!
+//! - Moved GP and Vec registers from asmjit::arm namespace to asmjit::a64 namespace. At this time there was
+//! no prior deprecation as having arm::Vec would collide with a64::Vec as arm namespace is used within a64
+//! namespace. Just change `arm::Gp` to `a64::Gp` and `arm::Vec` to `a64::Vec`.
+//!
+//! ### Changes committed at 2023-09-10
+//!
+//! Core changes:
+//!
+//! - Changed allocation API to work with spans (JitAllocator).
+//!
+//! - This change is required to support more hardened platforms in the future that make it very difficult
+//! to write JIT compilers.
+//! - `JitAllocator::Span` now represents a memory that the user can access. It abstracts both regular and
+//! dual mappings.
+//! - The `Span` is mostly designed to make it possible to write into it, so in general the read+execute
+//! pointer is what user is intended to keep. Use `span.rx()` to access RX pointer. `Span` is not needed
+//! after the memory it references has been modified, only remember `span.rx()` pointer, which is then
+//! used to deallocate or change the memory the span references.
+//! - Use a new `JitAllocator::alloc()` to allocate a `Span`, then pass the populated Span to `JitAllocator`
+//! write API such as `JitAllocator::write()` - note that JitAllocator can also establish a scope, so you
+//! can use a lambda function that would perform the write, but since it's going through JitAllocator it's
+//! able to ensure that the memory is actually writable.
+//! - If you need to repopulate a `Span` from rx pointer, use `JitAllocator::query(<span-out>, rx)` to get it.
+//! - Study what JitRuntime is doing to better understand how this new API works in detail.
+//! - Users of JitRuntime do not have to do anything as JitRuntime properly abstracts the allocation.
+//!
+//! - Renamed some X86 CPU features to make them compatible with architecture manuals:
+//!
+//! - Changed `AVX512_CDI` to `AVX512_CD`.
+//! - Changed `AVX512_ERI` to `AVX512_ER`.
+//! - Changed `AVX512_PFI` to `AVX512_PF`.
+//!
+//! - Old names were deprecated.
+//!
+//! ### Changes committed at 2021-12-13
+//!
+//! Core changes:
+//!
+//! - Removed old deprecated API.
+//!
+//! - Many enumerations were changed to enum class, and many public APIs were changed to use such enums instead
+//! of uint32_t. This change makes some APIs backward incompatible - there are no deprecations this time.
+//!
+//! - Extracted operand signature manipulation to `OperandSignature`.
+//! - Setting function arguments through `Compiler::setArg()` was deprecated, use FuncNode::setArg() instead.
+//! - Moved `{arch}::Features::k` to `CpuFeatures::{arch}::k`.
+//! - Moved `BaseEmitter::kEncodingOption` to `EncodingOptions::k`.
+//! - Moved `BaseEmitter::kFlag` to `EmitterFlags::k`.
+//! - Moved `BaseEmitter::kType` to `EmitterType::k`.
+//! - Moved `BaseEmitter::kValidationOption` to `DiagnosticOptions::kValidate`.
+//! - Moved `BaseFeatures` to `CpuFeatures`.
+//! - Moved `BaseInst::kControl` to `InstControlFlow::k`.
+//! - Moved `BaseInst::kOption` and `x86::Inst::kOption` to `InstOptions::k`.
+//! - Moved `BaseNode::kNode` to `NodeType::k`.
+//! - Moved `BaseReg::kGroup` and `x86::Reg::kGroup` to `RegGroup::k`.
+//! - Moved `BaseReg::kType` and `x86::Reg::kType` to `RegType::k`.
+//! - Moved `CallConv::kFlag` to `CallConvFlags::k`.
+//! - Moved `CallConv::kId` to `CallConvId::k`.
+//! - Moved `CallConv::kStrategy` to `CallConvStrategy::k`.
+//! - Moved `CodeBuffer::kFlag` to `CodeBufferFlags`.
+//! - Moved `ConstPool::kScope` to `ConstPoolScope::k`.
+//! - Moved `Environment::kArch` to `Arch::k`.
+//! - Moved `Environment::kSubArch` to `SubArch::k`.
+//! - Moved `Environment::kFormat` to `OjectFormat::k`.
+//! - Moved `Environment::kPlatform` to `Platform::k`.
+//! - Moved `Environment::kAbi` to `PlatformABI::k`.
+//! - Moved `Environment::kVendor` to `Vendor::k`.
+//! - Moved `FormatOptions::kFlag` to `FormatFlags::k` and `DiagnosticOptions::k` (Compiler diagnostics flags).
+//! - Moved `FormatOptions::kIndentation` to `FormatIndentationGroup::k`.
+//! - Moved `FuncFrame::kAttr` to `FuncAttributes::k`.
+//! - Moved `Globals::kReset` to `ResetPolicy::k`.
+//! - Moved `InstDB::kAvx512Flag` to `InstDB::Avx512Flags::k`.
+//! - Moved `InstDB::kFlag` to `InstDB::InstFlags::k`.
+//! - Moved `InstDB::kMemFlag` to `InstDB::OpFlags::kMem`.
+//! - Moved `InstDB::kMode` to `InstDB::Mode::k`.
+//! - Moved `InstDB::kOpFlag` to `InstDB::OpFlags::k{OpType}...`.
+//! - Moved `JitAllocator::kOption` to `JitAllocatorOptions::k`.
+//! - Moved `Label::kType` to `LabelType::k`.
+//! - Moved `Operand::kOpType` to `OperandType::k`.
+//! - Moved `OpRWInfo::kFlag` to `OpRWFlags::k`.
+//! - Moved `Type::kId` to `TypeId::k`.
+//! - Moved `VirtMem::k` to `VirtMem::MemoryFlags::k`.
+//!
+//! ### Changes committed at 2020-05-30
+//!
+//! AsmJit has been cleaned up significantly, many todo items have been fixed and many functions and classes have
+//! been redesigned, some in an incompatible way.
+//!
+//! Core changes:
+//!
+//! - `Imm` operand has now only `Imm::value()` and `Imm::valueAs()` functions that return its value content,
+//! and `Imm::setValue()` function that sets the content. Functions like `setI8()`, `setU8()` were deprecated.
+//!
+//! Old functions were deprecated, but code using them should still compile.
+//!
+//! - `ArchInfo` has been replaced with `Environment`. Environment provides more details about the architecture,
+//! but drops some properties that were used by arch info - `gpSize(`) and `gpCount()`. `gpSize()` can be replaced
+//! with `registerSize()` getter, which returns a native register size of the architecture the environment uses.
+//! However, `gpCount()` was removed - at the moment `ArchTraits` can be used to access such properties.
+//!
+//! Some other functions were renamed, like `ArchInfo::isX86Family()` is now `Environment::isFamilyX86()`, etc.
+//! The reason for changing the order was support for more properties and all the accessors now start with the
+//! type of the property, like `Environment::isPlatformWindows()`.
+//!
+//! This function causes many other classes to provide `environment()` getter instead of `archInfo()` getter.
+//! In addition, AsmJit now uses `arch()` to get an architecture instead of `archId()`. `ArchInfo::kIdXXX` was
+//! renamed to `Environment::kArchXXX`.
+//!
+//! Some functions were deprecated, some removed...
+//!
+//! - `CodeInfo` has been removed in favor of `Environment`. If you used `CodeInfo` to set architecture and base
+//! address, this is now possible with `Environment` and setting base address explicitly by `CodeHolder::init()`
+//! - the first argument is `Environment`, and the second argument is base address, which defaults to
+//! `Globals::kNoBaseAddress`.
+//!
+//! CodeInfo class was deprecated, but the code using it should still compile with warnings.
+//!
+//! - `CallConv` has been updated to offer a more unified way of representing calling conventions - many calling
+//! conventions were abstracted to follow standard naming like `CallConvId::kCDecl` or `CallConvId::kStdCall`.
+//!
+//! This change means that other APIs like `FuncDetail::init()` now require both, calling convention and target
+//! `Environment`.
+//!
+//! - `Logging` namespace has been renamed to `Formatter`, which now provides general functionality for formatting
+//! in AsmJit.
+//!
+//! Logging namespace should still work, but its use is deprecated. Unfortunately this will be without deprecation
+//! warnings, so make sure you don't use it.
+//!
+//! - `Data64`, `Data128`, and `Data256` structs were deprecated and should no longer be used. There is no replacement,
+//! AsmJit users should simply create their own structures if they need them or use the new repeated embed API in
+//! emitters, see `BaseEmitter::embedDataArray()`.
+//!
+//! Emitter changes:
+//!
+//! - `BaseEmitter::emit()` function signature has been changed to accept 3 operands by reference and the rest 3
+//! operands as a continuous array. This change is purely cosmetic and shouldn't affect users as emit() has many
+//! overloads that dispatch to the right function.
+//!
+//! - `x86::Emitter` (Assembler, Builder, Compiler) deprecates embed utilities like `dint8()`, `duint8()`, `duint16()`,
+//! `dxmm()`, etc... in favor of a new and more powerful `BaseEmitter::embedDataArray()`. This function also allows
+//! emitting repeated values and/or patterns, which is used by helpers `BaseEmitter::embedUInt8()`, and others...
+//!
+//! - Validation is now available through `BaseEmitter::DiagnosticOptions`, which can be enabled/disabled through
+//! `BaseEmitter::addDiagnosticOptions()` and `BaseEmitter::clearDiagnosticOptions()`, respectively. Validation
+//! options now separate between encoding and Builder/Compiler so it's possible to choose the granularity required.
+//!
+//! Builder changes:
+//!
+//! - Internal functions for creating nodes were redesigned. They now accept a pointer to the node created as
+//! a first parameter. These changes should not affect AsmJit users as these functions were used internally.
+//!
+//! Compiler changes:
+//!
+//! - `FuncCallNode` has been renamed to `InvokeNode`. Additionally, function calls should now use
+//! `x86::Compiler::invoke()` instead of `call()`. The reason behind this is to remove the confusion between a
+//! `call` instruction and AsmJit's `call()` intrinsic, which is now `invoke()`.
+//!
+//! - Creating new nodes also changed. Now the preferred way of invoking a function is to call
+//! `x86::Compiler::invoke()` where the first argument is `InvokeNode**`. The function now returns an error and
+//! would call `ErrorHandler` in case of a failure. Error handling was unspecified in the past - the function was
+//! marked noexcept, but called error handler, which could throw.
+//!
+//! The reason behind this change is to make the API consistent with other changes and to also make it possible
+//! to inspect the possible error. In the previous API it returned a new node or `nullptr` in case of error,
+//! which the user couldn't inspect unless there was an attached `ErrorHandler`.
+//!
+//! Samples:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! // The basic setup of JitRuntime and CodeHolder changed, use environment()
+//! // instead of codeInfo().
+//! void basicSetup() {
+//! JitRuntime rt;
+//! CodeHolder code(rt.environment());
+//! }
+//!
+//! // Calling a function (Compiler) changed - use invoke() instead of call().
+//! void functionInvocation(x86::Compiler& cc) {
+//! InvokeNode* invokeNode;
+//! cc.invoke(&invokeNode, targetOperand, FuncSignature::build<...>(...));
+//! }
+//! ```
+
+
+//! \defgroup asmjit_core Core
+//! \brief Globals, code storage, and emitter interface.
+//!
+//! ### Overview
+//!
+//! AsmJit library uses \ref CodeHolder to hold code during code generation and emitters inheriting from \ref
+//! BaseEmitter to emit code. CodeHolder uses containers to manage its data:
+//!
+//! - \ref Section - stores information about a code or data section.
+//! - \ref CodeBuffer - stores actual code or data, part of \ref Section.
+//! - \ref LabelEntry - stores information about a \ref Label - its name, offset, section where it belongs to,
+//! and other bits.
+//! - \ref Fixup - stores information about positions in code that needs to be fixed up later, for example
+//! when referencing a \ref Label, which was not bound to a position in code yet.
+//! - \ref RelocEntry - stores information about a relocation.
+//! - \ref AddressTableEntry - stores information about an absolute address, which was used in a jump or call.
+//! Code referencing an absolute address may need relocation or a record in address table.
+//!
+//! To generate code you would need to instantiate at least the following classes:
+//!
+//! - \ref CodeHolder - to hold code during code generation.
+//! - \ref BaseEmitter - to emit code into \ref CodeHolder.
+//! - \ref Target (optional) - most likely \ref JitRuntime to keep the generated code in executable memory. \ref
+//! Target can be customized by inheriting from it.
+//!
+//! There are also other core classes that are important:
+//!
+//! - \ref Environment - describes where the code will run. Environment brings the concept of target triples or
+//! tuples into AsmJit, which means that users can specify target architecture, platform, and ABI.
+//! - \ref TypeId - encapsulates lightweight type functionality that can be used to describe primitive and vector
+//! types. Types are used by higher level utilities, for example by \ref asmjit_function and \ref asmjit_compiler.
+//! - \ref CpuInfo - encapsulates CPU information - stores both CPU information and CPU features described by \ref
+//! CpuFeatures.
+//!
+//! AsmJit also provides global constants:
+//!
+//! - \ref Globals - namespace that provides global constants.
+//!
+//! \note CodeHolder examples use \ref x86::Assembler as abstract interfaces cannot be used to generate code.
+//!
+//! \section code_holder_and_emitters CodeHolder & Emitters
+//!
+//! The example below shows how the mentioned classes interact to generate X86 code:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! // Signature of the generated function.
+//! using Func = int (*)(void);
+//!
+//! int main() {
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//!
+//! CodeHolder code; // Holds code and relocation information.
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//!
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
+//! a.mov(x86::eax, 1); // Move one to eax register.
+//! a.ret(); // Return from function.
+//! // ===== x86::Assembler is no longer needed from here and can be destroyed =====
+//!
+//! Func fn; // Holds address to the generated function.
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//! // ===== CodeHolder is no longer needed from here and can be destroyed =====
+//!
+//! int result = fn(); // Execute the generated code.
+//! printf("%d\n", result); // Print the resulting "1".
+//!
+//! // All classes use RAII, all resources will be released before `main()` returns,
+//! // the generated function can be, however, released explicitly if you intend to
+//! // reuse or keep the runtime alive, which you should in a production-ready code.
+//! rt.release(fn);
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! The example above used \ref x86::Assembler as an emitter. AsmJit provides the following emitters that offer various
+//! levels of abstraction:
+//!
+//! - \ref asmjit_assembler - Low-level emitter that emits directly to \ref CodeBuffer.
+//! - \ref asmjit_builder - Low-level emitter that emits to a \ref BaseNode list.
+//! - \ref asmjit_compiler - High-level emitter that provides register allocation.
+//!
+//! \section targets_and_jit_runtime Targets and JitRuntime
+//!
+//! AsmJit's \ref Target is an interface that provides basic target abstraction. At the moment AsmJit provides only
+//! one implementation called \ref JitRuntime, which as the name suggests provides JIT code target and execution
+//! runtime. \ref JitRuntime provides all the necessary stuff to implement a simple JIT compiler with basic memory
+//! management. It only provides \ref JitRuntime::add() and \ref JitRuntime::release() functions that are used to
+//! either add code to the runtime or release it. \ref JitRuntime doesn't do any decisions on when the code should be
+//! released, the decision is up to the developer.
+//!
+//! See more at \ref asmjit_virtual_memory group.
+//!
+//! ### More About Environment
+//!
+//! In the previous example the \ref Environment is retrieved from \ref JitRuntime. It's logical as \ref JitRuntime
+//! always returns an \ref Environment that is compatible with the host. For example if your application runs on X86_64
+//! CPU the \ref Environment returned will use \ref Arch::kX64 architecture in contrast to \ref Arch::kX86, which will
+//! be used in 32-bit mode on an X86 target.
+//!
+//! AsmJit allows to setup the \ref Environment manually and to select a different architecture and ABI when necessary.
+//! So let's do something else this time, let's always generate a 32-bit code and print its binary representation. To
+//! do that, we can create our own \ref Environment and initialize it to \ref Arch::kX86.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main(int argc, char* argv[]) {
+//! using namespace asmjit::x86;
+//!
+//! // Create a custom environment initialized to 32-bit X86 architecture.
+//! Environment env;
+//! env.set_arch(Arch::kX86);
+//!
+//! CodeHolder code; // Create a CodeHolder.
+//! code.init(env); // Initialize CodeHolder with custom environment.
+//!
+//! // Generate a 32-bit function that sums 4 floats and looks like:
+//! // void func(float* dst, const float* a, const float* b)
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to `code`.
+//!
+//! a.mov(eax, dword_ptr(esp, 4)); // Load the destination pointer.
+//! a.mov(ecx, dword_ptr(esp, 8)); // Load the first source pointer.
+//! a.mov(edx, dword_ptr(esp, 12)); // Load the second source pointer.
+//!
+//! a.movups(xmm0, ptr(ecx)); // Load 4 floats from [ecx] to XMM0.
+//! a.movups(xmm1, ptr(edx)); // Load 4 floats from [edx] to XMM1.
+//! a.addps(xmm0, xmm1); // Add 4 floats in XMM1 to XMM0.
+//! a.movups(ptr(eax), xmm0); // Store the result to [eax].
+//! a.ret(); // Return from function.
+//!
+//! // We have no Runtime this time, it's on us what we do with the code.
+//! // CodeHolder stores code in Section, which provides some basic properties
+//! // and CodeBuffer structure. We are interested in section's CodeBuffer.
+//! //
+//! // NOTE: The first section is always '.text', it can be retrieved by
+//! // code.section_by_id(0) or simply by code.text_section().
+//! CodeBuffer& buffer = code.text_section()->buffer();
+//!
+//! // Print the machine-code generated or do something else with it...
+//! // 8B4424048B4C24048B5424040F28010F58010F2900C3
+//! for (size_t i = 0; i < buffer.length; i++)
+//! printf("%02X", buffer.data[i]);
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! \section explicit_code_relocation Explicit Code Relocation
+//!
+//! In addition to \ref Environment, \ref CodeHolder can be configured to specify a base-address (or a virtual base
+//! address in a linker terminology), which could be static (useful when you know the location where the target's
+//! machine code will be) or dynamic. AsmJit assumes dynamic base-address by default and relocates the code held by
+//! \ref CodeHolder to a user provided address on-demand. To be able to relocate to a user provided address it needs
+//! to store some information about relocations, which is represented by \ref RelocEntry. Relocation entries are only
+//! required if you call external functions from the generated code that cannot be encoded by using a 32-bit
+//! displacement (64-bit displacements are not provided by aby supported architecture).
+//!
+//! There is also a concept called \ref Fixup - it's a lightweight data structure that doesn't have any identifier and
+//! is stored in \ref LabelEntry and \ref CodeHolder as a single-linked list. Fixup represents either a reference to an
+//! unbound label and cross-sections references (only relevant to code that uses multiple sections). Since crossing
+//! sections is something that cannot be resolved immediately these fixups persist until offsets of these sections are
+//! assigned and until \ref CodeHolder::resolve_cross_section_fixups() is called. It's an error if you end up with code that
+//! still has fixups after flattening. You can verify it by calling \ref CodeHolder::has_unresolved_fixups(), which inspects
+//! the value returned by \ref CodeHolder::unresolved_fixup_count().
+//!
+//! AsmJit can flatten code that uses multiple sections by assigning each section an incrementing offset that respects
+//! its alignment. Use \ref CodeHolder::flatten() to do that. After the sections are flattened their offsets and
+//! virtual sizes are adjusted to respect each section's buffer size and alignment. The \ref
+//! CodeHolder::resolve_cross_section_fixups() function must be called before relocating the code held by \ref CodeHolder.
+//! You can also flatten your code manually by iterating over all sections and calculating their offsets (relative to
+//! base) by your own algorithm. In that case \ref CodeHolder::flatten() should not be called, however,
+//! \ref CodeHolder::resolve_cross_section_fixups() should be.
+//!
+//! The example below shows how to use a built-in virtual memory allocator \ref JitAllocator instead of using \ref
+//! JitRuntime (just in case you want to use your own memory management) and how to relocate the generated code
+//! into your own memory block - you can use your own virtual memory allocator if you prefer that, but that's OS
+//! specific and not covered by the documentation.
+//!
+//! The following code is similar to the previous one, but implements a function working in both 32-bit and 64-bit
+//! environments:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! using SumIntsFunc = void (*)(int* dst, const int* a, const int* b);
+//!
+//! int main() {
+//! // Create a custom environment that matches the current host environment.
+//! Environment env = Environment::host();
+//! CpuFeatures cpu_features = CpuInfo::host().features();
+//!
+//! CodeHolder code; // Create a CodeHolder.
+//! code.init(env, cpu_features); // Initialize CodeHolder with environment.
+//!
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to `code`.
+//!
+//! // Signature: 'void func(int* dst, const int* a, const int* b)'.
+//! x86::Gp dst;
+//! x86::Gp src_a;
+//! x86::Gp src_b;
+//!
+//! // Handle the difference between 32-bit and 64-bit calling conventions
+//! // (arguments passed through stack vs. arguments passed by registers).
+//! if (env.is_32bit()) {
+//! dst = x86::eax;
+//! src_a = x86::ecx;
+//! src_b = x86::edx;
+//! a.mov(dst , x86::dword_ptr(x86::esp, 4));
+//! a.mov(src_a, x86::dword_ptr(x86::esp, 8));
+//! a.mov(src_b, x86::dword_ptr(x86::esp, 12));
+//! }
+//! else {
+//! if (env.is_platform_windows()) {
+//! dst = x86::rcx; // First argument (destination pointer).
+//! src_a = x86::rdx; // Second argument (source 'a' pointer).
+//! src_b = x86::r8; // Third argument (source 'b' pointer).
+//! }
+//! else {
+//! dst = x86::rdi; // First argument (destination pointer).
+//! src_a = x86::rsi; // Second argument (source 'a' pointer).
+//! src_b = x86::rdx; // Third argument (source 'b' pointer).
+//! }
+//! }
+//!
+//! a.movdqu(x86::xmm0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
+//! a.movdqu(x86::xmm1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
+//! a.paddd(x86::xmm0, x86::xmm1); // Add 4 ints in XMM1 to XMM0.
+//! a.movdqu(x86::ptr(dst), x86::xmm0); // Store the result to [dst].
+//! a.ret(); // Return from function.
+//!
+//! // Even when we didn't use multiple sections AsmJit could insert one section
+//! // called '.addrtab' (address table section), which would be filled by data
+//! // required by relocations (absolute jumps and calls). You can omit this code
+//! // if you are 100% sure your code doesn't contain multiple sections and
+//! // such relocations. You can use `CodeHolder::has_address_table_section()` to
+//! // verify whether the address table section does exist.
+//! code.flatten();
+//! code.resolve_cross_section_fixups();
+//!
+//! // After the code was generated it can be relocated manually to any memory
+//! // location, however, we need to know it's size before we perform memory
+//! // allocation. `CodeHolder::code_size()` returns the worst estimated code
+//! // size in case that relocations are not possible without trampolines (in
+//! // that case some extra code at the end of the current code buffer is
+//! // generated during relocation).
+//! size_t estimated_size = code.code_size();
+//!
+//! // Instead of rolling up our own memory allocator we can use the one AsmJit
+//! // provides. It's decoupled so you don't need to use `JitRuntime` for that.
+//! JitAllocator allocator;
+//!
+//! // Allocate an executable virtual memory and handle a possible failure.
+//! JitAllocator::Span span;
+//! Error err = allocator.alloc(span, estimated_size);
+//!
+//! if (err != Error::kOk) { // <- NOTE: This must be checked, always!
+//! return 0;
+//! }
+//!
+//! // Now relocate the code to the address provided by the memory allocator.
+//! // Please note that this DOESN'T COPY anything to it. This function will
+//! // store the address in CodeHolder and use relocation entries to patch
+//! // the existing code in all sections to respect the base address provided.
+//! code.relocate_to_base((uint64_t)span.rx());
+//!
+//! // This is purely optional. There are cases in which the relocation can omit
+//! // unneeded data, which would shrink the size of address table. If that
+//! // happened the code_size returned after relocate_to_base() would be smaller
+//! // than the originally `estimated_size`.
+//! size_t code_size = code.code_size();
+//!
+//! // This will copy code from all sections to `p`. Iterating over all sections
+//! // and calling `memcpy()` would work as well, however, this function supports
+//! // additional options that can be used to also zero pad sections' virtual
+//! // size, etc.
+//! //
+//! // With some additional features, copyFlattenData() does roughly the following:
+//! //
+//! // allocator.write([&](JitAllocator::Span& span) noexcept -> Error {
+//! // for (Section* section : code.sections()) {
+//! // uint8_t* p = (uint8_t*)span.rw() + section->offset();
+//! // memcpy(p, section->data(), section->buffer_size());
+//! // }
+//! // return Error::kOk;
+//! // }
+//! allocator.write([&](JitAllocator::Span& span) noexcept -> Error {
+//! code.copy_flattened_data(span.rw(), code_size, CopySectionFlags::kPadSectionBuffer);
+//! return Error::kOk;
+//! });
+//!
+//! // Execute the generated function.
+//! int in_a[4] = { 4, 3, 2, 1 };
+//! int in_b[4] = { 1, 5, 2, 8 };
+//! int out[4];
+//!
+//! // This code uses AsmJit's ptr_as_func<> to cast between void* and SumIntsFunc.
+//! SumIntsFunc fn = ptr_as_func<SumIntsFunc>(span.rx());
+//! fn(out, in_a, in_b);
+//!
+//! // Prints {5 8 4 9}
+//! printf("{%d %d %d %d}\n", out[0], out[1], out[2], out[3]);
+//!
+//! // Release `fn` is it's no longer needed. It will be destroyed with 'vm'
+//! // instance anyway, but it's a good practice to release it explicitly
+//! // when you know that the function will not be needed anymore.
+//! allocator.release(fn);
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! If you know the base-address in advance (before the code generation) it can be passed as a second argument to
+//! \ref CodeHolder::init(). In that case the Assembler will know the absolute position of each instruction and
+//! would be able to use it during instruction encoding to prevent relocations where possible. The following example
+//! shows how to configure the base address:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! void initialize_code_holder_example(CodeHolder& code) {
+//! Environment env = Environment::host();
+//! CpuFeatures cpu_features = CpuInfo::host().features();
+//! uint64_t base_address = uint64_t(0x1234);
+//!
+//! // initialize CodeHolder with environment and custom base address.
+//! code.init(env, cpu_features, base_address);
+//! }
+//! ```
+//!
+//! \section labels Label Offsets and Links
+//!
+//! When a label that is not yet bound is used by the Assembler, it creates a \ref Fixup, which is then referenced
+//! by \ref LabelEntry. Fixups are also created if a label is referenced in a different section than in which it was
+//! bound. Let's examine some functions that can be used to check whether there are any unresolved fixups.
+//!
+//! ```
+//! #include <asmjit/core.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! void label_links_example(CodeHolder& code, const Label& label) {
+//! // Tests whether the `label` is bound.
+//! bool is_bound = code.is_label_bound(label);
+//! printf("Label %u is %s\n", label.id(), is_bound ? "bound" : "not bound");
+//!
+//! // Returns true if the code contains either referenced, but unbound
+//! // labels, or cross-section fixups that are not resolved yet.
+//! bool has_unresolved = code.has_unresolved_fixups(); // Boolean answer.
+//! size_t n_unresolved = code.unresolved_fixup_count(); // Count of unresolved fixups.
+//!
+//! printf("Number of unresolved fixups: %zu\n", n_unresolved);
+//! }
+//! ```
+//!
+//! There is no function that would return the number of unbound labels as this is completely unimportant from
+//! CodeHolder's perspective. If a label is not used then it doesn't matter whether it's bound or not, only actually
+//! used labels matter. After a Label is bound it's possible to query its offset relative to the start of the
+//! section where it was bound:
+//!
+//! ```
+//! #include <asmjit/core.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! void labelOffsetExample(CodeHolder& code, const Label& label) {
+//! // Label offset is known after it's bound. The offset provided is relative
+//! // to the start of the section, see below for alternative. If the given
+//! // label is not bound the offset returned will be zero. It's recommended
+//! // to always check whether the label is bound before using its offset.
+//! uint64_t section_offset = code.label_offset(label);
+//! printf("Label offset relative to section: %llu\n", (unsigned long long)section_offset);
+//!
+//! // If you use multiple sections and want the offset relative to the base.
+//! // NOTE: This function expects that the section has already an offset and
+//! // the label-link was resolved (if this is not true you will still get an
+//! // offset relative to the start of the section).
+//! uint64_t base_offset = code.label_offset_from_base(label);
+//! printf("Label offset relative to base: %llu\n", (unsigned long long)base_offset);
+//! }
+//! ```
+//!
+//! \section code_sections Code & Data Sections
+//!
+//! AsmJit allows to create multiple sections within the same \ref CodeHolder. A test-case
+//! [asmjit_test_x86_sections.cpp](https://github.com/asmjit/asmjit/blob/master/asmjit-testing/tests/asmjit_test_x86_sections.cpp)
+//! can be used as a reference point although the following example should also provide a useful insight:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! void sections_example(CodeHolder& code) {
+//! // Text section is always provided as the first section.
+//! Section* text = code.text_section(); // or code.section_by_id(0);
+//!
+//! // To create another section use CodeHolder::new_section().
+//! Section* data;
+//! Error err = code.new_section(Out(data),
+//! ".data", // Section name
+//! SIZE_MAX, // Name length if the name is not null terminated (or SIZE_MAX).
+//! SectionFlags::kNone, // Section flags, see SectionFlags.
+//! 8, // Section alignment, must be power of 2.
+//! 0); // Section order value (optional, default 0).
+//!
+//! // When you switch sections in Assembler, Builder, or Compiler the cursor
+//! // will always move to the end of that section. When you create an Assembler
+//! // the cursor would be placed at the end of the first (.text) section, which
+//! // is initially empty.
+//! x86::Assembler a(&code);
+//! Label L_Data = a.new_label();
+//!
+//! a.mov(x86::eax, x86::ebx); // Emits in .text section.
+//!
+//! a.section(data); // Switches to the end of .data section.
+//! a.bind(L_Data); // Binds label in this .data section
+//! a.db(0x01); // Emits byte in .data section.
+//!
+//! a.section(text); // Switches to the end of .text section.
+//! a.add(x86::ebx, x86::eax); // Emits in .text section.
+//!
+//! // References a label in .text section, which was bound in .data section. This would create a
+//! // fixup even when the L_Data is already bound, because the reference crosses sections. See below...
+//! a.lea(x86::rsi, x86::ptr(L_Data));
+//! }
+//! ```
+//!
+//! The last line in the example above shows that a \ref Fixup would be created even for bound labels that cross
+//! sections. In this case a referenced label was bound in another section, which means that the reference couldn't
+//! be resolved at that moment. If your code uses sections, but you wish AsmJit to flatten these sections (you don't
+//! plan to flatten them manually) then there is a ready API for that.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! // ... (continuing the previous example) ...
+//! void sections_example_continued(CodeHolder& code) {
+//! // Suppose we have some code that contains multiple sections and
+//! // we would like to flatten it by using AsmJit's built-in API:
+//! Error err = code.flatten();
+//! if (err != Error::kOk) {
+//! // There are many reasons it can fail, so always handle a possible error.
+//! printf("Failed to flatten the code: %s\n", DebugUtils::error_as_string(err));
+//! exit(1);
+//! }
+//!
+//! // After flattening all sections would contain assigned offsets relative to base.
+//! // Offsets are 64-bit unsigned integers so we cast them to `size_t` for simplicity.
+//! // On 32-bit targets it's guaranteed that the offset cannot be greater than `2^32 - 1`.
+//! printf("Data section offset %zu", size_t(data->offset()));
+//!
+//! // The flattening doesn't resolve unresolved fixups, this
+//! // has to be done manually as flattening can be done separately.
+//! err = code.resolve_cross_section_fixups();
+//! if (err != Error::kOk) {
+//! // This is the kind of error that should always be handled...
+//! printf("Failed to resolve fixups: %s\n", DebugUtils::error_as_string(err));
+//! exit(1);
+//! }
+//!
+//! if (code.has_unresolved_fixups()) {
+//! // This would mean either unbound label or some other issue.
+//! printf("The code has %zu unbound labels\n", code.unresolved_fixup_count());
+//! exit(1);
+//! }
+//! }
+//! ```
+
+
+//! \defgroup asmjit_assembler Assembler
+//! \brief Assembler interface and operands.
+//!
+//! ### Overview
+//!
+//! AsmJit's Assembler is used to emit machine code directly into a \ref CodeBuffer. In general, code generation
+//! with assembler requires the knowledge of the following:
+//!
+//! - \ref BaseAssembler and architecture-specific assemblers:
+//! - \ref x86::Assembler - Assembler implementation targeting X86 and X86_64 architectures.
+//! - \ref a64::Assembler - Assembler implementation targeting AArch64 architecture.
+//! - \ref Operand and its variations:
+//! - \ref Reg - Base class for a register operand, inherited by:
+//! - \ref UniGp - Universal abstraction of a general purpose register, inherited by:
+//! - \ref x86::Gp - GP register operand specific to X86 and X86_64 architectures.
+//! - \ref a64::Gp - GP Register operand specific to AArch64 architecture.
+//! - \ref UniVec - Universal abstraction of a vector register, inherited by:
+//! - \ref x86::Vec - Vector register operand specific to X86 and X86_64 architectures.
+//! - \ref a64::Vec - Vector register operand specific to AArch64 architecture.
+//! - \ref x86::Mm, \ref x86::KReg, \ref x86::Tmm, and other architecture specific register operands.
+//! - \ref BaseMem - Base class for a memory operand, inherited by:
+//! - \ref x86::Mem - Memory operand specific to X86 and X86_64 architectures.
+//! - \ref a64::Mem - Memory operand specific to AArch64 architecture.
+//! - \ref Imm - Immediate (value) operand.
+//! - \ref Label - Label operand.
+//!
+//! \note Assembler examples use \ref x86::Assembler as abstract interfaces cannot be used to generate code.
+//!
+//! \section operand_basics Operand Basics
+//!
+//! Let's start with operands. \ref Operand is a data structure that defines a data layout of any operand. It can be
+//! inherited, but any class inheriting it cannot add any members to it, only the existing layout can be reused.
+//! AsmJit allows to construct operands dynamically, to store them, and to query a complete information about them
+//! at run-time. Operands are small (always 16 bytes per \ref Operand) and can be copied and passed by value. Please
+//! never allocate individual operands dynamically by using a `new` keyword - it would work, but then you would have
+//! to be responsible for deleting such operands. In AsmJit operands are always part of some other data structures
+//! like \ref InstNode, which is part of \ref asmjit_builder tool.
+//!
+//! Operands contain only identifiers, but not pointers to any code-generation data. For example \ref Label operand
+//! only provides label identifier, but not a pointer to \ref LabelEntry structure. In AsmJit such IDs are used to
+//! link stuff together without having to deal with pointers.
+//!
+//! AsmJit's operands all inherit from a base class called \ref Operand. Operands have the following properties that
+//! are commonly accessible by getters and setters:
+//!
+//! - \ref Operand - Base operand, which only provides accessors that are common to all operand types.
+//! - \ref Reg - Describes either physical or virtual register. Physical registers have ids that match the target's
+//! machine id directly whereas virtual registers must be allocated into physical registers by a register allocator
+//! pass. Register operand provides:
+//! - Register Type (\ref RegType) - Unique id that describes each possible register provided by the target
+//! architecture - for example X86 backend provides general purpose registers (GPB-LO, GPB-HI, GPW, GPD, and GPQ)
+//! and various types of other registers like K, MM, BND, XMM, YMM, ZMM, and TMM.
+//! - Register Group (\ref RegGroup) - Groups multiple register types under a single group - for example all
+//! general-purpose registers (of all sizes) on X86 are part of \ref RegGroup::kGp and all SIMD registers
+//! (XMM, YMM, ZMM) are part of \ref RegGroup::kVec.
+//! - Register Size - Contains the size of the register in bytes. If the size depends on the mode (32-bit vs
+//! 64-bit) then generally the higher size is used (for example RIP register has size 8 by default).
+//! - Register Id - Contains physical or virtual id of the register.
+//! - Unified interface of general purpose registers is provided by \ref UniGp, which acts as a base of
+//! all architecture specific GP registers such as \ref x86::Gp and \ref a64::Gp.
+//! - Unified interface of vector registers is provided by \ref UniVec, which acts as a base of all architecture
+//! specific vector registers such as \ref x86::Vec and \ref a64::Vec. Please note that X86 MMX registers are
+//! not part of \ref x86::Vec, instead they are modeled as \ref x86::Mm.
+//! - \ref BaseMem - Used to reference a memory location. Memory operand provides:
+//! - Base Register - A base register type and id (physical or virtual).
+//! - Index Register - An index register type and id (physical or virtual).
+//! - Offset - Displacement or absolute address to be referenced (32-bit if base register is used and 64-bit if
+//! base register is not used).
+//! - Flags that can describe various architecture dependent information (like scale and segment-override on X86).
+//! - \ref Imm - Immediate values are usually part of instructions (encoded within the instruction itself) or data.
+//! - \ref Label - used to reference a location in code or data. Labels must be created by the \ref BaseEmitter or
+//! by \ref CodeHolder. Each label has its unique id per \ref CodeHolder instance.
+//!
+//! \section operand_manipulation Operand Manipulation
+//!
+//! AsmJit allows to construct operands dynamically, to store them, and to query a complete information about them at
+//! run-time. Operands are small (always 16 bytes per `Operand`) and should be always copied (by value) if you intend
+//! to store them (don't create operands by using `new` keyword, it's not recommended). Operands are safe to be passed
+//! to `memcpy()` and `memset()`, which becomes handy when working with arrays of operands. If you set all members of
+//! an \ref Operand to zero the operand would become NONE operand, which is the same as a default constructed Operand.
+//!
+//! The example below illustrates how operands can be used and modified even without using any other code generation
+//! classes. The example uses X86 architecture-specific operands.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! // Registers can be copied, it's a common practice.
+//! x86::Gp dstRegByValue() { return x86::ecx; }
+//!
+//! void usingOperandsExample(x86::Assembler& a) {
+//! // Gets `ecx` register returned by a function.
+//! x86::Gp dst = dstRegByValue();
+//! // Gets `rax` register directly from the provided `x86` namespace.
+//! x86::Gp src = x86::rax;
+//! // Constructs `r10` dynamically.
+//! x86::Gp idx = x86::gpq(10);
+//! // Constructs [src + idx] memory address - referencing [rax + r10].
+//! x86::Mem m = x86::ptr(src, idx);
+//!
+//! // Examine `m`: Returns `RegType::kGp64`.
+//! m.index_type();
+//! // Examine `m`: Returns 10 (`r10`).
+//! m.index_id();
+//!
+//! // Reconstruct `idx` stored in mem:
+//! x86::Gp idx_2 = x86::Gp::from_type_and_id(m.index_type(), m.index_id());
+//!
+//! // True, `idx` and `idx_2` are identical.
+//! idx == idx_2;
+//!
+//! // Possible - op will still be the same as `m`.
+//! Operand op = m;
+//! // True (can be casted to BaseMem or architecture-specific Mem).
+//! op.is_mem();
+//!
+//! // True, `op` is just a copy of `m`.
+//! m == op;
+//!
+//! // Static cast is fine and valid here.
+//! static_cast<BaseMem&>(op).add_offset(1);
+//! // However, using `as<T>()` to cast to a derived type is preferred.
+//! op.as<BaseMem>().add_offset(1);
+//! // False, `op` now points to [rax + r10 + 2], which is not [rax + r10].
+//! m == op;
+//!
+//! // Emitting 'mov' - type safe way.
+//! a.mov(dst, m);
+//! // Not possible, `mov` doesn't provide mov(x86::Gp, Operand) overload.
+//! a.mov(dst, op);
+//!
+//! // Type-unsafe, but possible.
+//! a.emit(x86::Inst::kIdMov, dst, m);
+//! // Also possible, `emit()` is type-less and can be used with raw Operand.
+//! a.emit(x86::Inst::kIdMov, dst, op);
+//! }
+//! ```
+//!
+//! Some operands have to be created explicitly by emitters. For example labels must be created by \ref
+//! BaseEmitter::new_label(), which creates a label entry and returns a \ref Label operand with the id that refers
+//! to it. Such label then can be used by emitters.
+//!
+//! \section memory_operands Memory Operands
+//!
+//! Some architectures like X86 provide a complex memory addressing model that allows to encode addresses having a
+//! BASE register, INDEX register with a possible scale (left shift), and displacement (called offset in AsmJit).
+//! Memory address on X86 can also specify memory segment (segment-override in X86 terminology) and some instructions
+//! (gather / scatter) require INDEX to be a \ref x86::Vec register instead of a general-purpose register.
+//!
+//! AsmJit allows to encode and work with all forms of addresses mentioned and implemented by X86. In addition, it
+//! also allows to construct absolute 64-bit memory address operands, which is only allowed in one form of 'mov'
+//! instruction.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! void testX86Mem() {
+//! // Makes it easier to access x86 stuff...
+//! using namespace asmjit::x86;
+//!
+//! // BASE + OFFSET.
+//! Mem a = ptr(rax); // a = [rax]
+//! Mem b = ptr(rax, 15); // b = [rax + 15]
+//!
+//! // BASE + INDEX << SHIFT - Shift is in BITS as used by X86!
+//! Mem c = ptr(rax, rbx); // c = [rax + rbx]
+//! Mem d = ptr(rax, rbx, 2); // d = [rax + rbx << 2]
+//! Mem e = ptr(rax, rbx, 2, 15); // e = [rax + rbx << 2 + 15]
+//!
+//! // BASE + VM (Vector Index) (encoded as MOD+VSIB).
+//! Mem f = ptr(rax, xmm1); // f = [rax + xmm1]
+//! Mem g = ptr(rax, xmm1, 2); // g = [rax + xmm1 << 2]
+//! Mem h = ptr(rax, xmm1, 2, 15); // h = [rax + xmm1 << 2 + 15]
+//!
+//! // Absolute address:
+//! uint64_t addr = (uint64_t)0x1234;
+//! Mem i = ptr(addr); // i = [0x1234]
+//! Mem j = ptr(addr, rbx); // j = [0x1234 + rbx]
+//! Mem k = ptr(addr, rbx, 2); // k = [0x1234 + rbx << 2]
+//!
+//! // LABEL - Will be encoded as RIP (64-bit) or absolute address (32-bit).
+//! Label L = ...;
+//! Mem m = ptr(L); // m = [L]
+//! Mem n = ptr(L, rbx); // n = [L + rbx]
+//! Mem o = ptr(L, rbx, 2); // o = [L + rbx << 2]
+//! Mem p = ptr(L, rbx, 2, 15); // p = [L + rbx << 2 + 15]
+//!
+//! // RIP - 64-bit only (RIP can't use INDEX).
+//! Mem q = ptr(rip, 24); // q = [rip + 24]
+//! }
+//! ```
+//!
+//! Memory operands can optionally contain memory size. This is required by instructions where the memory size cannot
+//! be deduced from other operands, like `inc` and `dec` on X86:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! void testX86Mem() {
+//! // The same as: dword ptr [rax + rbx].
+//! x86::Mem a = x86::dword_ptr(x86::rax, x86::rbx);
+//!
+//! // The same as: qword ptr [rdx + rsi << 0 + 1].
+//! x86::Mem b = x86::qword_ptr(x86::rdx, x86::rsi, 0, 1);
+//! }
+//! ```
+//!
+//! Memory operands provide API that can be used to access its properties:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! void testX86Mem() {
+//! // The same as: dword ptr [rax + 12].
+//! x86::Mem mem = x86::dword_ptr(x86::rax, 12);
+//!
+//! mem.has_base(); // true.
+//! mem.has_index(); // false.
+//! mem.size(); // 4.
+//! mem.offset(); // 12.
+//!
+//! mem.set_size(0); // Sets the size to 0 (makes it size-less).
+//! mem.add_offset(-1); // Adds -1 to the offset and makes it 11.
+//! mem.set_offset(0); // Sets the offset to 0.
+//! mem.set_base(x86::rcx); // Changes BASE to RCX.
+//! mem.set_index(x86::rax); // Changes INDEX to RAX.
+//! mem.has_index(); // true.
+//! }
+//! ```
+//!
+//! Making changes to memory operand is very comfortable when emitting loads
+//! and stores:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! void testX86Mem(CodeHolder& code) {
+//! x86::Assembler a(code); // Your initialized x86::Assembler.
+//! x86::Mem mSrc = x86::ptr(eax); // Construct [eax] memory operand.
+//!
+//! // One way of emitting bunch of loads is to use `mem.adjusted()`, which
+//! // returns a new memory operand and keeps the source operand unchanged.
+//! a.movaps(x86::xmm0, mSrc); // No adjustment needed to load [eax].
+//! a.movaps(x86::xmm1, mSrc.adjusted(16)); // Loads from [eax + 16].
+//! a.movaps(x86::xmm2, mSrc.adjusted(32)); // Loads from [eax + 32].
+//! a.movaps(x86::xmm3, mSrc.adjusted(48)); // Loads from [eax + 48].
+//!
+//! // ... do something with xmm0-3 ...
+//!
+//! // Another way of adjusting memory is to change the operand in-place.
+//! // If you want to keep the original operand you can simply clone it.
+//! x86::Mem mDst = mSrc.clone(); // Clone mSrc.
+//!
+//! a.movaps(mDst, x86::xmm0); // Stores xmm0 to [eax].
+//! mDst.add_offset(16); // Adds 16 to `mDst`.
+//!
+//! a.movaps(mDst, x86::xmm1); // Stores to [eax + 16] .
+//! mDst.add_offset(16); // Adds 16 to `mDst`.
+//!
+//! a.movaps(mDst, x86::xmm2); // Stores to [eax + 32].
+//! mDst.add_offset(16); // Adds 16 to `mDst`.
+//!
+//! a.movaps(mDst, x86::xmm3); // Stores to [eax + 48].
+//! }
+//! ```
+//!
+//! \section examples Assembler Examples
+//!
+//! - \ref x86::Assembler provides many X86/X64 examples.
+
+
+//! \defgroup asmjit_builder Builder
+//! \brief Builder interface, nodes, and passes.
+//!
+//! ### Overview
+//!
+//! Both \ref BaseBuilder and \ref BaseCompiler interfaces describe emitters that emit into a representation that
+//! allows further processing. The code stored in such representation is completely safe to be patched, simplified,
+//! reordered, obfuscated, removed, injected, analyzed, or processed some other way. Each instruction, label,
+//! directive, or other building block is stored as \ref BaseNode (or derived class like \ref InstNode or \ref
+//! LabelNode) and contains all the information necessary to pass that node later to the assembler.
+//!
+//! \ref BaseBuilder is an emitter that inherits from \ref BaseEmitter interface. It was designed to provide a maximum
+//! compatibility with the existing \ref BaseAssembler emitter so users can move from assembler to builder when needed,
+//! for example to implement post-processing, which is not possible with Assembler.
+//!
+//! \section builder_nodes Builder Nodes
+//!
+//! \ref BaseBuilder doesn't generate machine code directly, it uses an intermediate representation based on nodes,
+//! however, it allows to serialize to \ref BaseAssembler when the code is ready to be encoded.
+//!
+//! There are multiple node types used by both \ref BaseBuilder and \ref BaseCompiler :
+//!
+//! - Basic nodes:
+//! - \ref BaseNode - Base class for all nodes.
+//! - \ref InstNode - Represents an instruction node.
+//! - \ref AlignNode - Represents an alignment directive (.align).
+//! - \ref LabelNode - Represents a location where to bound a \ref Label.
+//!
+//! - Data nodes:
+//! - \ref EmbedDataNode - Represents data.
+//! - \ref EmbedLabelNode - Represents \ref Label address embedded as data.
+//! - \ref EmbedLabelDeltaNode - Represents a difference of two labels embedded in data.
+//! - \ref ConstPoolNode - Represents a constant pool data embedded as data.
+//!
+//! - Informative nodes:
+//! - \ref CommentNode - Represents a comment string, doesn't affect code generation.
+//! - \ref SentinelNode - A marker that can be used to remember certain position in code or data, doesn't affect
+//! code generation. Used by \ref FuncNode to mark the end of a function.
+//!
+//! - Other nodes are provided by \ref asmjit_compiler infrastructure.
+//!
+//! \section builder_examples Examples
+//!
+//! - \ref x86::Builder - Builder implementation targeting X86 and X86_64 architectures.
+//! - \ref a64::Builder - Builder implementation targeting AArch64 architecture.
+
+
+//! \defgroup asmjit_compiler Compiler
+//! \brief Compiler interface.
+//!
+//! ### Overview
+//!
+//! \ref BaseCompiler is a high-level interface, which provides register allocation and support for defining and
+//! invoking functions, built on top of \ref BaseBuilder interface At the moment it's the easiest way of generating
+//! code in AsmJit as most architecture and OS specifics is properly abstracted and handled by AsmJit automatically.
+//! However, abstractions also mean restrictions, which means that \ref BaseCompiler has more limitations than \ref
+//! BaseAssembler or \ref BaseBuilder.
+//!
+//! Since \ref BaseCompiler provides register allocation it also establishes the concept of functions - a function
+//! in Compiler sense is a unit in which virtual registers are allocated into physical registers by the register
+//! allocator. In addition, it enables to use such virtual registers in function invocations.
+//!
+//! \ref BaseCompiler automatically handles function calling conventions. It's still architecture dependent, but
+//! makes the code generation much easies. Functions are essential; the first-step to generate some code is to define
+//! a signature of the function to be generated (before generating the function body itself). Function arguments and
+//! return value(s) are handled by assigning virtual registers to them. Similarly, function calls are handled the same
+//! way.
+//!
+//! \section compiler_nodes Compiler Nodes
+//!
+//! \ref BaseCompiler adds some nodes that are required for function generation and invocation:
+//!
+//! - \ref FuncNode - Represents a function definition.
+//! - \ref FuncRetNode - Represents a function return.
+//! - \ref InvokeNode - Represents a function invocation.
+//!
+//! \ref BaseCompiler also makes the use of passes (\ref Pass) and automatically adds an architecture-dependent
+//! register allocator pass to the list of passes when attached to \ref CodeHolder.
+//!
+//! \section compiler_examples Compiler Examples
+//!
+//! - \ref x86::Compiler - Compiler implementation targeting X86 and X86_64 architectures.
+//! - \ref a64::Compiler - Compiler implementation targeting AArch64 architecture.
+//!
+//! \section compiler_tips Compiler Tips
+//!
+//! Users of AsmJit have done mistakes in the past, this section should provide some useful tips for beginners:
+//!
+//! - Virtual registers in compiler are bound to a single function. At the moment the implementation doesn't
+//! care whether a single virtual register is used in multiple functions, but it sees it as two independent
+//! virtual registers in that case. This means that virtual registers cannot be used to implement global
+//! variables. Global variables are basically memory addresses which functions can read from and write to,
+//! and they have to be implemented in the same way.
+//!
+//! - Compiler provides a useful debugging functionality, which can be turned on through \ref FormatFlags. Use
+//! \ref Logger::add_flags() to turn on additional logging features when using Compiler.
+
+
+//! \defgroup asmjit_function Function
+//! \brief Function definitions.
+//!
+//! ### Overview
+//!
+//! AsmJit provides functionality that can be used to define function signatures and to calculate automatically
+//! optimal function frame that can be used directly by a prolog and epilog insertion. This feature was exclusive
+//! to AsmJit's Compiler for a very long time, but was abstracted out and is now available for all users regardless
+//! of the emitter they use. The following use cases are possible:
+//!
+//! - Calculate function frame before the function is generated - this is the only way available to \ref
+//! BaseAssembler users and it will be described in this section.
+//!
+//! - Calculate function frame after the function is generated - this way is generally used by \ref BaseBuilder
+//! and \ref BaseCompiler emitters and this way is generally described in \ref asmjit_compiler section.
+//!
+//! The following concepts are used to describe and create functions in AsmJit:
+//!
+//! - \ref TypeId - Type-id is an 8-bit value that describes a platform independent type as we know from C/C++.
+//! It provides abstractions for most common types like `int8_t`, `uint32_t`, `uintptr_t`, `float`, `double`,
+//! and all possible vector types to match ISAs up to AVX512. \ref TypeId was introduced originally for \ref
+//! asmjit_compiler, but it's now used by \ref FuncSignature as well.
+//!
+//! - \ref CallConv - Describes a calling convention - this class contains instructions to assign registers and
+//! stack addresses to function arguments and return value(s), but doesn't specify any function signature itself.
+//! Calling conventions are architecture and OS dependent.
+//!
+//! - \ref FuncSignature - Describes a function signature, for example `int func(int, int)`. FuncSignature contains
+//! a function calling convention id, return value type, and function arguments. The signature itself is platform
+//! independent and uses \ref TypeId to describe types of function arguments and function return value(s).
+//!
+//! - \ref FuncDetail - Architecture and ABI dependent information that describes \ref CallConv and expanded \ref
+//! FuncSignature. Each function argument and return value is represented as \ref FuncValue that contains the
+//! original \ref TypeId enriched with additional information that specifies whether the value is passed or
+//! returned by register (and which register) or by stack. Each value also contains some other metadata that
+//! provide additional information required to handle it properly (for example whether a vector is passed
+//! indirectly by a pointer as required by WIN64 calling convention).
+//!
+//! - \ref FuncFrame - Contains information about the function frame that can be used by prolog/epilog inserter
+//! (PEI). Holds call stack size size and alignment, local stack size and alignment, and various attributes that
+//! describe how prolog and epilog should be constructed. `FuncFrame` doesn't know anything about function's
+//! arguments or return values, it hold only information necessary to create a valid and ABI conforming function
+//! prologs and epilogs.
+//!
+//! - \ref FuncArgsAssignment - A helper class that can be used to reassign function arguments into user specified
+//! registers. It's architecture and ABI dependent mapping from function arguments described by \ref CallConv
+//! and \ref FuncDetail into registers specified by the user.
+//!
+//! It's a lot of concepts where each represents one step in a function frame calculation. It can be used to create
+//! function prologs, epilogs, and also to calculate information necessary to perform function calls.
+
+
+//! \defgroup asmjit_logging Logging
+//! \brief Logging and formatting.
+//!
+//! ### Overview
+//!
+//! The initial phase of a project that generates machine code is not always smooth. Failure cases are common not just
+//! at the beginning phase, but also during the development or refactoring. AsmJit provides logging functionality to
+//! address this issue. AsmJit does already a good job with function overloading to prevent from emitting unencodable
+//! instructions, but it can't prevent from emitting machine code that is correct at instruction level, but doesn't
+//! work when it's executed asa whole. Logging has always been an important part of AsmJit's infrastructure and looking
+//! at logs can sometimes reveal code generation issues quickly.
+//!
+//! AsmJit provides API for logging and formatting:
+//!
+//! - \ref Logger - A logger that you can pass to \ref CodeHolder and all emitters that inherit from \ref BaseEmitter.
+//!
+//! - \ref FormatOptions - Formatting options that can change how instructions and operands are formatted.
+//!
+//! - \ref Formatter - A namespace that provides functions that can format input data like \ref Operand, \ref Reg,
+//! \ref Label, and \ref BaseNode into \ref String.
+//!
+//! AsmJit's \ref Logger serves the following purposes:
+//!
+//! - Provides a basic foundation for logging.
+//!
+//! - Abstract class leaving the implementation on users. The following built-in implementations are provided for
+//! simplicity:
+//!
+//! - \ref FileLogger implements logging into a standard `FILE` stream.
+//! - \ref StringLogger serializes all logs into a \ref String instance.
+//!
+//! AsmJit's \ref FormatOptions provides the following to customize the formatting of instructions and operands through:
+//!
+//! - \ref FormatFlags
+//! - \ref FormatIndentationGroup
+//!
+//! \section logging Logging
+//!
+//! A \ref Logger is typically attached to a \ref CodeHolder, which propagates it to all attached emitters
+//! automatically. The example below illustrates how to use \ref FileLogger that outputs to standard output:
+//!
+//! ```
+//! #include <asmjit/core.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! FileLogger logger(stdout); // Logger should always survive CodeHolder.
+//!
+//! CodeHolder code; // Holds code and relocation information.
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! code.set_logger(&logger); // Attach the `logger` to `code` holder.
+//!
+//! // ... code as usual, everything emitted will be logged to `stdout` ...
+//! return 0;
+//! }
+//! ```
+//!
+//! If output to FILE stream is not desired it's possible to use \ref StringLogger, which concatenates everything
+//! into a multi-line string:
+//!
+//! ```
+//! #include <asmjit/core.h>
+//! #include <stdio.h>
+//! #include <utility>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! StringLogger logger; // Logger should always survive CodeHolder.
+//!
+//! CodeHolder code; // Holds code and relocation information.
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! code.set_logger(&logger); // Attach the `logger` to `code` holder.
+//!
+//! // ... code as usual, logging will be concatenated to logger string ...
+//!
+//! // You can either use the string from StringLogger directly or you can
+//! // move it. Logger::data() returns its content as null terminated char[].
+//! printf("Logger content: %s\n", logger.data());
+//!
+//! // It can be moved into your own string like this:
+//! String content = std::move(logger.content());
+//! printf("The same content: %s\n", content.data());
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! \section formatting Formatting
+//!
+//! AsmJit uses \ref Formatter to format inputs that are then passed to \ref Logger. Formatting is public and can be
+//! used by AsmJit users as well. The most important thing to know regarding formatting is that \ref Formatter always
+//! appends to the output string, so it can be used to build complex strings without having to concatenate
+//! intermediate strings.
+//!
+//! The first example illustrates how to format operands:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! void logOperand(Arch arch, const Operand_& op) {
+//! // The emitter is optional (named labels and virtual registers need it).
+//! BaseEmitter* emitter = nullptr;
+//!
+//! // No flags by default.
+//! FormatFlags format_flags = FormatFlags::kNone;
+//!
+//! StringTmp<128> sb;
+//! Formatter::format_operand(sb, format_flags, emitter, arch, op);
+//! printf("%s\n", sb.data());
+//! }
+//!
+//! void formattingExample() {
+//! using namespace x86;
+//!
+//! // Architecture is not part of operand, it must be passed explicitly.
+//! // Format flags. We pass it explicitly also to 'logOperand' to make
+//! // compatible with what AsmJit normally does.
+//! Arch arch = Arch::kX64;
+//!
+//! logOperand(arch, rax); // Prints 'rax'.
+//! logOperand(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`.
+//! logOperand(arch, dword_ptr(rax, rbx, 2)); // Prints 'dword [rax + rbx * 4]`.
+//! logOperand(arch, imm(42)); // Prints '42'.
+//! }
+//! ```
+//!
+//! Next example illustrates how to format whole instructions:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//! #include <utility>
+//!
+//! using namespace asmjit;
+//!
+//! template<typename... Args>
+//! void logInstruction(Arch arch, const BaseInst& inst, Args&&... args) {
+//! // The emitter is optional (named labels and virtual registers need it).
+//! BaseEmitter* emitter = nullptr;
+//!
+//! // No flags by default.
+//! FormatFlags format_flags = FormatFlags::kNone;
+//!
+//! // The formatter expects operands in an array.
+//! Operand_ operands[] { std::forward<Args>(args)... };
+//!
+//! StringTmp<128> sb;
+//! Formatter::format_instruction(
+//! sb, format_flags, emitter, arch, inst, operands, sizeof...(args));
+//! printf("%s\n", sb.data());
+//! }
+//!
+//! void formattingExample() {
+//! using namespace x86;
+//!
+//! // Architecture is not part of operand, it must be passed explicitly.
+//! // Format flags. We pass it explicitly also to 'logOperand' to make
+//! // compatible with what AsmJit normally does.
+//! Arch arch = Arch::kX64;
+//!
+//! // Prints 'mov rax, rcx'.
+//! logInstruction(arch, BaseInst(Inst::kIdMov), rax, rcx);
+//!
+//! // Prints 'vaddpd zmm0, zmm1, [rax] {1to8}'.
+//! logInstruction(arch,
+//! BaseInst(Inst::kIdVaddpd),
+//! zmm0, zmm1, ptr(rax)._1to8());
+//!
+//! // BaseInst abstracts instruction id, instruction options, and extra_reg.
+//! // Prints 'lock add [rax], rcx'.
+//! logInstruction(arch,
+//! BaseInst(Inst::kIdAdd, InstOptions::kX86_Lock),
+//! ptr(rax), rcx);
+//!
+//! // Similarly an extra register (like AVX-512 selector) can be used.
+//! // Prints 'vaddpd zmm0 {k2} {z}, zmm1, [rax]'.
+//! logInstruction(arch,
+//! BaseInst(Inst::kIdAdd, InstOptions::kX86_ZMask, k2),
+//! zmm0, zmm1, ptr(rax));
+//! }
+//! ```
+//!
+//! And finally, the example below illustrates how to use a built-in function to format the content of
+//! \ref BaseBuilder, which consists of nodes:
+//!
+//! ```
+//! #include <asmjit/core.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! void formattingExample(BaseBuilder* builder) {
+//! FormatOptions format_options {};
+//!
+//! // This also shows how temporary strings can be used.
+//! StringTmp<512> sb;
+//!
+//! // FormatNodeList requires the String for output, formatting flags, which
+//! // were zero (no extra flags), and the builder instance, which we have
+//! // provided. An overloaded version also exists, which accepts begin and
+//! // and end nodes, which can be used to only format a range of nodes.
+//! Formatter::format_node_list(sb, format_options, builder);
+//!
+//! // You can do whatever else with the string, it's always null terminated,
+//! // so it can be passed to C functions like printf().
+//! printf("%s\n", sb.data());
+//! }
+//! ```
+
+
+//! \defgroup asmjit_error_handling Error Handling
+//! \brief Error handling.
+//!
+//! ### Overview
+//!
+//! AsmJit uses error codes to represent and return errors. Every function that can fail returns an \ref Error code.
+//! Exceptions are never thrown by AsmJit itself even in extreme conditions like out-of-memory, but it's possible to
+//! override \ref ErrorHandler::handle_error() to throw, in that case no error will be returned and exception will be
+//! thrown instead. All functions where this can happen are not marked `noexcept`.
+//!
+//! Errors should never be ignored, however, checking errors after each AsmJit API call would simply over-complicate
+//! the whole code generation experience. \ref ErrorHandler exists to make the use of AsmJit API simpler as it allows
+//! to customize how errors can be handled:
+//!
+//! - Record the error and continue (the way how the error is user-implemented).
+//! - Throw an exception. AsmJit doesn't use exceptions and is completely exception-safe, but it's perfectly legal
+//! to throw an exception from the error handler.
+//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler, Builder and Compiler to a
+//! consistent state before calling \ref ErrorHandler::handle_error(), so `longjmp()` can be used without issues
+//! to cancel the code-generation if an error occurred. This method can be used if exception handling in your
+//! project is turned off and you still want some comfort. In most cases it should be safe as AsmJit uses \ref
+//! Arena allocated memory and the ownership of memory it allocates always ends with the instance that allocated
+//! it. If using this approach please never jump outside the life-time of \ref CodeHolder and \ref BaseEmitter.
+//!
+//! \section using_error_handler Using ErrorHandler
+//!
+//! An example of attaching \ref ErrorHandler to \ref CodeHolder.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! // A simple error handler implementation, extend according to your needs.
+//! class MyErrorHandler : public ErrorHandler {
+//! public:
+//! void handle_error(Error err, const char* message, BaseEmitter* origin) override {
+//! printf("AsmJit error: %s\n", message);
+//! }
+//! };
+//!
+//! int main() {
+//! JitRuntime rt;
+//!
+//! MyErrorHandler myErrorHandler;
+//! CodeHolder code;
+//!
+//! code.init(rt.environment(), rt.cpu_features());
+//! code.set_error_handler(&myErrorHandler);
+//!
+//! x86::Assembler a(&code);
+//! // ... code generation ...
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! Useful classes in error handling group:
+//!
+//! - See \ref DebugUtils that provides utilities useful for debugging.
+//! - See \ref Error that lists error codes that AsmJit uses.
+//! - See \ref ErrorHandler for more details about error handling.
+
+
+//! \defgroup asmjit_instruction_db Instruction DB
+//! \brief Instruction database (introspection, read/write, validation, ...).
+//!
+//! ### Overview
+//!
+//! AsmJit provides a public instruction database that can be used to query information about a complete instruction.
+//! The instruction database requires the knowledge of the following:
+//!
+//! - \ref BaseInst - Base instruction that contains instruction id, options, and a possible extra-register that
+//! represents either REP prefix counter or AVX-512 selector (mask).
+//!
+//! - \ref Operand - Represents operands of an instruction.
+//!
+//! Each instruction can be then queried for the following information:
+//!
+//! - \ref InstRWInfo - Read/write information of instruction and its operands (includes \ref OpRWInfo).
+//!
+//! - \ref CpuFeatures - CPU features required to execute the instruction.
+//!
+//! In addition to query functionality AsmJit is also able to validate whether an instruction and its operands are
+//! valid. This is useful for making sure that what user tries to emit is correct and it can be also used by other
+//! projects that parse user input, like AsmTK project.
+//!
+//! \section instruction_query Instruction Queries
+//!
+//! The instruction query API is provided by \ref InstAPI namespace. The following queries are possible:
+//!
+//! - \ref InstAPI::query_rw_info() - queries read/write information of the given instruction and its operands.
+//! Includes also CPU flags read/written.
+//!
+//! - \ref InstAPI::query_features() - queries CPU features that are required to execute the given instruction. A full
+//! instruction with operands must be given as some architectures like X86 may require different features for the
+//! same instruction based on its operands.
+//!
+//! - <a href="https://github.com/asmjit/asmjit/blob/master/asmjit-testing/tests/asmjit_test_instinfo.cpp">asmjit_test_instinfo.cpp</a>
+//! can be also used as a reference about accessing instruction information.
+//!
+//! \section instruction_validation Instruction Validation
+//!
+//! The instruction validation API is provided by \ref InstAPI namespace in the similar fashion like the Query API,
+//! however, validation can also be turned on at \ref BaseEmitter level. The following is possible:
+//!
+//! - \ref InstAPI::validate() - low-level instruction validation function that is used internally by emitters
+//! if strict validation is enabled.
+//!
+//! - \ref BaseEmitter::add_diagnostic_options() - can be used to enable validation at emitter level, see \ref
+//! DiagnosticOptions.
+
+
+//! \defgroup asmjit_virtual_memory Virtual Memory
+//! \brief Virtual memory management.
+//!
+//! ### Overview
+//!
+//! AsmJit's virtual memory management is divided into three main categories:
+//!
+//! - \ref VirtMem namespace provides low level interface that can be used for cross-platform virtual memory
+//! allocation. This API is a thin wrapper around operating system specific calls such as `VirtualAlloc()` and
+//! `mmap()` and it's intended to be used by AsmJit's higher level API. Low-level virtual memory functions can
+//! be used to allocate virtual memory, change its permissions, and to release it. Additionally, an API that
+//! allows to create dual mapping (to support hardened environments) is provided.
+//!
+//! - \ref JitAllocator provides middle level API, which is built on top of \ref VirtMem internally and offers
+//! nicer API that can be used by users to allocate executable memory conveniently. \ref JitAllocator tries to
+//! be smart, for example automatically using dual mapping or `MAP_JIT` on hardened environments.
+//!
+//! - \ref JitRuntime provides high level API, which implements \ref Target interface and uses \ref JitAllocator
+//! under the hood. Since \ref JitRuntime inherits from \ref Target it makes it easy to use with \ref CodeHolder.
+//! Many AsmJit examples use \ref JitRuntime for its simplicity and easy integration.
+//!
+//! The main difference between \ref VirtMem and \ref JitAllocator is that \ref VirtMem can only be used to allocate
+//! whole pages, whereas \ref JitAllocator has `malloc()` like API that allows to allocate smaller quantities that
+//! usually represent the size of an assembled function or a chunk of functions that can represent a module, for
+//! example. \ref JitAllocator then tracks used space of each page it maintains. Internally, \ref JitAllocator uses
+//! two bit arrays to track occupied regions in each allocated block of pages.
+//!
+//! \section hardened_environments Hardened Environments
+//!
+//! In the past, allocating virtual memory with Read+Write+Execute (RWX) access permissions was easy. However, modern
+//! operating systems and runtime environments often use hardening, which typically prohibits mapping pages with both
+//! Write and Execute permissions (known as the W^X policy). This presents a challenge for JIT compilers because
+//! generated code for a single function is unlikely to fit in exactly N pages without leaving some space empty. To
+//! accommodate this, the execution environment may need to temporarily change the permissions of existing pages to
+//! read+write (RW) to insert new code into them, however, sometimes it's not possible to ensure that no thread is
+//! executing code in such affected pages in a multithreaded environment, in which multiple threads may be executing
+//! generated code.
+//!
+//! Such restrictions leave a lot of complexity on the application, so AsmJit implements a dual mapping technique to
+//! make the life of AsmJit users easier. In this technique, a region of memory is mapped to two different virtual
+//! addresses with different access permissions. One virtual address is mapped with read and write (RW) access, which
+//! is used by the JIT compiler to write generated code. The other virtual address is mapped with read and execute (RX)
+//! access, which is used by the application to execute the generated code.
+//!
+//! However, implementing dual mapping can be challenging because it typically requires obtaining an anonymous file
+//! descriptor on most Unix-like operating systems. This file descriptor is then passed to mmap() twice to create
+//! the two mappings. AsmJit handles this challenge by using system-specific techniques such as `memfd_create()` on
+//! Linux, `shm_open(SHM_ANON)` on BSD, and `MAP_REMAPDUP` with `mremap()` on NetBSD. The latter approach does not
+//! require a file descriptor. If none of these options are available, AsmJit uses a plain `open()` call followed by
+//! `unlink()`.
+//!
+//! The most challenging part is actually obtaining a file descriptor that can be passed to `mmap()` with `PROT_EXEC`.
+//! This is still something that may fail, for example the environment could be hardened in a way that this would
+//! not be possible at all, and thus dual mapping would not work.
+//!
+//! Dual mapping is provided by both \ref VirtMem and \ref JitAllocator.
+
+
+//! \defgroup asmjit_support Support
+//! \brief Provides utility functions, arena allocator, and arena-backed containers.
+//!
+//! ### Overview
+//!
+//! This functionality is primarily intended for AsmJit's internal use, but is exposed to users since it may be used
+//! in public headers as well. \ref Arena and arena-backed containers are used by many AsmJit classes, which are public,
+//! and AsmJit doesn't try to hide the use.
+//!
+//! The arena allocator is used for most allocations within AsmJit. It is optimized for fast allocation of small objects,
+//! avoiding the overhead of `malloc()`. Memory is managed in large blocks that are split into smaller chunks, reducing
+//! fragmentation and improving performance.
+//!
+//! Releasing an arena allocator invalidates memory it holds, allowing efficient cleanup without per-object destruction.
+//! Long-lived objects typically reset their data in the destructor or via `reset()` for allocation reuse. All AsmJit
+//! containers use \ref Arena allocator.
+//!
+//! \section arena_allocators Arena Allocators
+//!
+//! - \ref Arena - Arena memory allocator that quickly allocates the requested memory from larger chunks and then
+//! frees everything at once. AsmJit uses Arena allocators almost everywhere as almost everything is short-lived.
+//!
+//! - \ref ArenaTmp - A temporary \ref Arena with some initial static storage. If the allocation requests fit the
+//! static storage allocated then there will be no dynamic memory allocation during the lifetime of \ref ArenaTmp,
+//! otherwise it would act as \ref Arena with one preallocated block at the beginning.
+//!
+//! \section arena_containers Arena-Allocated Containers
+//!
+//! - \ref ArenaString - Arena allocated string.
+//! - \ref ArenaHash - Arena allocated hash table.
+//! - \ref ArenaTree - Arena allocated red-black tree.
+//! - \ref ArenaList - Arena allocated double-linked list.
+//! - \ref ArenaVector - Arena allocated vector.
+//!
+//! \section using_arena_containers Using Arena-Allocated Containers
+//!
+//! The most common data structure exposed by AsmJit is \ref ArenaVector. It's very similar to `std::vector`, but the
+//! implementation doesn't use exceptions and uses the mentioned \ref Arena allocator for increased performance and
+//! decreased memory footprint. You don't have to worry about allocations as you should not need to add items to
+//! AsmJit's data structures directly as there should be API for all required operations.
+//!
+//! Most of the time, AsmJit returns a non-owning Span instead of a reference to the allocator when it returns an array
+//! of something. For example, the following APIs in \ref CodeHolder return a non-owning \ref Span instance:
+//!
+//! ```
+//! using namespace asmjit;
+//!
+//! void example(CodeHolder& code) {
+//! // Contains all section entries managed by CodeHolder.
+//! Span<Section*> sections = code.sections();
+//!
+//! // Contains all label entries managed by CodeHolder.
+//! Span<LabelEntry> label_entries = code.label_entries();
+//!
+//! // Contains all relocation entries managed by CodeHolder.
+//! Span<RelocEntry*> reloc_entries = code.reloc_entries();
+//! }
+//! ```
+//!
+//! \ref Span has overloaded array access operator to make it possible to access its elements through operator[].
+//! Some standard functions like \ref ArenaVector::is_empty(), \ref ArenaVector::size(), and \ref ArenaVector::data() are
+//! provided as well. Vectors are also iterable through a range-based for loop:
+//!
+//! ```
+//! using namespace asmjit;
+//!
+//! void example(CodeHolder& code) {
+//! Span<LabelEntry> label_entries = code.label_entries();
+//! for (size_t label_id = 0; label_id < label_entries.size(); label_id++) {
+//! const LabelEntry& le = label_entries[label_id];
+//! if (le.is_bound()) {
+//! printf("Bound Label #%u at offset=%llu\n", uint32_t(label_id), (unsigned long long)le.offset());
+//! }
+//! }
+//! }
+//! ```
+//!
+//! \section design_considerations Design Considerations
+//!
+//! Arena-allocated containers do not store the allocator within the container. This decision was made to reduce the
+//! footprint of such containers as AsmJit tooling, especially Compiler's register allocation, may use many instances
+//! of such containers to perform code analysis and register allocation.
+//!
+//! For example to append an item into an \ref ArenaVector it's required to pass the allocator as the first argument,
+//! so it can be used in case that the vector needs to grow. Such function also returns an error, which must be
+//! propagated to the caller.
+//!
+//! ```
+//! using namespace asmjit;
+//!
+//! Error example(Arena& arena) {
+//! ArenaVector<int> vector;
+//!
+//! // Unfortunately, arena must be provided to all functions that mutate
+//! // the vector. However, AsmJit users should never need to do this as all
+//! // manipulation should be done through public API, which takes care of
+//! // this.
+//! for (int i = 0; i < 100; i++) {
+//! ASMJIT_PROPAGATE(vector.append(arena, i));
+//! }
+//!
+//! // By default vector's destructor doesn't release anything as it knows
+//! // that its content is allocated by Arena. However, \ref ArenaVector::release
+//! // can be used to explicitly release the vector data back to the allocator if
+//! // necessary
+//! vector.release(arena);
+//! }
+//! ```
+//!
+//! Containers like \ref ArenaVector also provide a functionality to reserve a certain number of items before any items
+//! are added to it. This approach is used internally in most places as it allows to prepare space for data that will
+//! be added to some container before the data itself was created.
+//!
+//! ```
+//! using namespace asmjit;
+//!
+//! Error example(Arena& arena) {
+//! ArenaVector<int> vector;
+//!
+//! ASMJIT_PROPAGATE(vector.reserve_additional(arena, 100));
+//! for (int i = 0; i < 100; i++) {
+//! // Cannot fail.
+//! vector.append_unchecked(arena, i);
+//! }
+//!
+//! vector.release(arena);
+//! }
+//! ```
+
+
+//! \defgroup asmjit_utilities Utilities
+//! \brief Utility classes and functions.
+//!
+//! ### Overview
+//!
+//! AsmJit uses and provides utility classes and functions, that can be used with AsmJit. The functionality can be
+//! divided into the following topics:
+//!
+//! \section string_utilities String Utilities
+//!
+//! - \ref String - AsmJit's string container, which is used internally and which doesn't use exceptions and has
+//! a stable layout, which is not dependent on C++ standard library.
+//!
+//! - \ref StringTmp - String that can have base storage allocated on stack. The amount of storage on stack can
+//! be specified as a template parameter.
+//!
+//! - \ref FixedString - Fixed string container limited up to N characters.
+//!
+//! \section codegen_utilities Code Generation Utilities
+//!
+//! - \ref ConstPool - Constant pool used by \ref BaseCompiler, but also available to users that may find use of it.
+//!
+//! \section support_utilities Support Functionality Used by AsmJit
+//!
+//! - \ref Support namespace provides many other utility functions and classes that are used by AsmJit, and made
+//! public.
+
+
+//! \defgroup asmjit_x86 X86 Backend
+//! \brief X86/X64 backend.
+
+
+//! \defgroup asmjit_arm ARM Commons
+//! \brief ARM commons shared between AArch32 and AArch64.
+
+
+//! \defgroup asmjit_a64 AArch64 Backend
+//! \brief AArch64 backend.
+
+//! \defgroup asmjit_ujit Universal JIT
+//! \brief Universal JIT abstracts X86, X86_64, and AArch64 code generation.
+//!
+//! ### Overview
+//!
+//! Universal JIT (UJIT) is an abstraction that uses AsmJit's Compiler, but provides target independent API that
+//! users can use to target multiple target architectures at a time. The goal of Universal JIT is not to provide
+//! its own IR. Instead, it translates user calls into target-dependent instructions (or instruction sequences)
+//! and allows users to switch to target-specific assembly only where required for extra performance.
+//!
+//! \warning UJIT is still in an experimental phase, expect minor API breaks in the future especially towards API
+//! stabilization.
+//!
+//! API Overview
+//!
+//! Compiler:
+//!
+//! - \ref ujit::UniCompiler - UniCompiler that wraps an existing \ref ujit::BackendCompiler.
+//! - \ref ujit::BackendCompiler - alias of a platform-dependent Compiler (\ref x86::Compiler or \ref a64::Compiler).
+//!
+//! Operands:
+//!
+//! - \ref ujit::Gp - alias of a platform-dependent general-purpose register (\ref x86::Gp, \ref a64::Gp).
+//! - \ref ujit::Vec - alias of a platform-dependent vector register (\ref x86::Vec, \ref a64::Vec).
+//! - \ref ujit::Mem - alias of a platform-dependent memory operand (\ref x86::Mem, \ref a64::Mem).
+//!
+//! Conditions:
+//!
+//! - \ref ujit::CondCode - alias of a platform-dependent condition code (\ref x86::CondCode, a64::CondCode).
+//! - \ref ujit::UniCondition - platform-independent condition representation that can be used with some ujit
+//! instructions.
+//!
+//! Instructions:
+//!
+//! - \ref ujit::UniOpCond - instruction that can be used by \ref ujit::UniCondition.
+//! - \ref ujit::UniOpM - instruction with a single `[mem]` operand.
+//! - \ref ujit::UniOpRM - instruction with `[reg, mem]` operands.
+//! - \ref ujit::UniOpMR - instruction with `[mem, reg]` operands.
+//! - \ref ujit::UniOpRR - instruction with `[reg, reg]` operands.
+//! - \ref ujit::UniOpRRR - instruction with `[reg, reg, reg]` operands.
+//! - \ref ujit::UniOpVR - instruction with `[vec, reg]` operands.
+//! - \ref ujit::UniOpVM - instruction with `[vec, mem]` operands.
+//! - \ref ujit::UniOpMV - instruction with `[mem, vec]` operands.
+//! - \ref ujit::UniOpVV - instruction with `[vec, vec]` operands.
+//! - \ref ujit::UniOpVVI - instruction with `[vec, vec, imm]` operands.
+//! - \ref ujit::UniOpVVV - instruction with `[vec, vec, vec]` operands.
+//! - \ref ujit::UniOpVVVI - instruction with `[vec, vec, vec, imm]` operands.
+//! - \ref ujit::UniOpVVVV - instruction with `[vec, vec, vec, vec]` operands.
+//!
+//! ### UniCompiler Example
+//!
+//! Using UniCompiler is like using a regular platform-dependent AsmJit's Compiler - UniCompiler wraps its API
+//! and delegates most of non-emit calls to Compiler, however, it abstracts how instructions are emitted so it
+//! could offer universal API for both general-purpose and SIMD instructions. The following example demonstrates
+//! how to use it:
+//!
+//! ```
+//! #include <asmjit/ujit.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! // Signature of the generated function.
+//! using Func = void (*)(uint32_t* dst, const uint32_t* src1, const uint32_t* src2);
+//!
+//! JitRuntime rt; // Creates a JIT runtime that holds executable code.
+//! FileLogger logger(stdout); // Creates a logger that prints to stdout.
+//! CodeHolder code; // Creates a CodeHolder - holds code and other information.
+//!
+//! code.init(rt.environment(), // Initializes CodeHolder to match the JIT environment.
+//! rt.cpu_features());
+//! code.set_logger(&logger); // Initializes CodeHolder's logger.
+//!
+//! ujit::BackendCompiler backend_cc(&code); // Creates a regular backend compiler instance.
+//! ujit::UniCompiler uc(&backend_cc, // Creates UniCompiler with attached backend compiler.
+//! rt.cpu_features(), // CPU features must be passed explicitly.
+//! rt.cpu_hints()); // CPU hints must be passed explicitly.
+//!
+//! // Begin a function of the required signature (this exactly matches the Compiler use).
+//! FuncNode* func = uc.add_func(FuncSignature::build<void, uint32_t*, const uint32_t*, const uint32_t*>());
+//!
+//! ujit::Gp d_ptr = uc.new_gp_ptr(); // Creates a destination pointer.
+//! ujit::Gp a_ptr = uc.new_gp_ptr(); // Creates a first source pointer.
+//! ujit::Gp b_ptr = uc.new_gp_ptr(); // Creates a second source pointer.
+//!
+//! func->set_arg(0, d_ptr); // Assigns 1st argument.
+//! func->set_arg(1, a_ptr); // Assigns 2nd argument.
+//! func->set_arg(2, b_ptr); // Assigns 3rd argument.
+//!
+//! ujit::Vec v0 = uc.new_vec128(); // Creates a 128-bit vector register.
+//! ujit::Vec v1 = uc.new_vec128(); // Creates a 128-bit vector register.
+//!
+//! uc.v_loadu128(v0, ujit::mem_ptr(a_ptr)); // Unaligned load of 128 bits from [a_ptr] into v0.
+//! uc.v_loadu128(v1, ujit::mem_ptr(b_ptr)); // Unaligned load of 128 bits from [b_ptr] into v1.
+//! uc.v_add_i32(v0, v0, v1); // Vector addition of 4 32-bit integers.
+//! uc.v_storeu128(ujit::mem_ptr(d_ptr), v0);// Unaligned store of 128 bits from v0 to [d_ptr].
+//!
+//! uc.end_func(); // End of the function body.
+//! Error err1 = uc.finalize(); // Translates and assembles the whole 'backend_cc' content.
+//!
+//! if (err1 != Error::kOk) {
+//! // Handle a possible error returned by AsmJit as finalize can fail. One reason could be wrong operands
+//! // to some instruction or other platform constraints. Usually UniCompiler handles most of platform
+//! // constraints by itself, but this error code must be checked regardless.
+//! return 1;
+//! }
+//! // ----> Both BackendCompiler and UniCompiler are no longer needed from here and can be destroyed <----
+//!
+//! Func fn;
+//! Error err2 = rt.add(&fn, &code); // Add the generated code to JIT runtime (executable memory).
+//!
+//! if (err2 != Error::kOk) {
+//! // Handle a possible error returned by AsmJit. This would be either out of executable memory or failure
+//! // to allocate it (for example excessive user-space hardening or making the allocation of executable
+//! // memory forbidden).
+//! return 1;
+//! }
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! // Input data.
+//! static constexpr uint32_t a_data[4] = {1u,2u,4u,8u};
+//! static constexpr uint32_t b_data[4] = {6u,4u,3u,1u};
+//!
+//! // Output data.
+//! uint32_t d_data[4] {};
+//!
+//! // Calls the generated function.
+//! fn(d_data, a_data, b_data);
+//!
+//! // Prints both inputs and the output.
+//! printf("a_data={%u,%u,%u,%u}\n", a_data[0], a_data[1], a_data[2], a_data[3]);
+//! printf("b_data={%u,%u,%u,%u}\n", b_data[0], b_data[1], b_data[2], b_data[3]);
+//! printf("d_data={%u,%u,%u,%u}\n", d_data[0], d_data[1], d_data[2], d_data[3]);
+//!
+//! // Explicitly removes the function from JIT runtime.
+//! rt.release(fn);
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! ### Emitting Backend-Specific Code
+//!
+//! In cases, in which backend-specific code is required for performance reasons, it's possible to use the
+//! underlying backend-specific Compiler, which is provided as a `cc` member of `UniCompiler`. The next example
+//! demonstrates how to use AArch64-specific code path during code generation:
+//!
+//! ```
+//! #include <asmjit/ujit.h>
+//!
+//! using namespace asmjit;
+//!
+//! void emit_backend_specific_code(UniCompiler& uc, const ujit::Gp& a, const ujit::Gp& b, const ujit::Gp& c) {
+//! #if defined(ASMJIT_UJIT_AARCH64)
+//! // Emit aarch64 specific code via `uc.cc`:
+//! uc.cc->orn(a, b, c);
+//! #else
+//! // Generic code.
+//! ujit::Gp tmp = uc.new_similar_reg(a);
+//! uc.not_(tmp, c);
+//! uc.or_(a, b, tmp);
+//! #endif
+//! ```
+//!
+
+//! \cond INTERNAL
+//! \defgroup asmjit_ra RA
+//! \brief Register allocator internals.
+//! \endcond
+
+} // {asmjit}
+
+#include <asmjit/asmjit-scope-begin.h>
+
+#include <asmjit/core/api-config.h>
+#include <asmjit/core/archcommons.h>
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/builder.h>
+#include <asmjit/core/codebuffer.h>
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/constpool.h>
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/emitter.h>
+#include <asmjit/core/environment.h>
+#include <asmjit/core/errorhandler.h>
+#include <asmjit/core/fixup.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/func.h>
+#include <asmjit/core/globals.h>
+#include <asmjit/core/inst.h>
+#include <asmjit/core/jitallocator.h>
+#include <asmjit/core/jitruntime.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/osutils.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/target.h>
+#include <asmjit/core/type.h>
+#include <asmjit/core/virtmem.h>
+
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenahash.h>
+#include <asmjit/support/arenalist.h>
+#include <asmjit/support/arenapool.h>
+#include <asmjit/support/arenastring.h>
+#include <asmjit/support/arenatree.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/span.h>
+#include <asmjit/support/support.h>
+
+#include <asmjit/asmjit-scope-end.h>
+
+#endif // ASMJIT_CORE_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/api-build_p.h b/3rdparty/asmjit/asmjit/core/api-build_p.h
index 3ddc9e78d22..2de68d25977 100644
--- a/3rdparty/asmjit/src/asmjit/core/api-build_p.h
+++ b/3rdparty/asmjit/asmjit/core/api-build_p.h
@@ -1,6 +1,6 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_API_BUILD_P_H_INCLUDED
@@ -48,7 +48,7 @@
#endif
-#include "./api-config.h"
+#include <asmjit/core/api-config.h>
#if !defined(ASMJIT_BUILD_DEBUG) && defined(__GNUC__) && !defined(__clang__)
#define ASMJIT_FAVOR_SIZE __attribute__((__optimize__("Os")))
@@ -68,7 +68,7 @@
// Include a unit testing package if this is a `asmjit_test_unit` build.
#if defined(ASMJIT_TEST)
- #include "../../../test/broken.h"
+ #include <asmjit-testing/tests/broken.h>
#endif
#endif // ASMJIT_CORE_API_BUILD_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/api-config.h b/3rdparty/asmjit/asmjit/core/api-config.h
new file mode 100644
index 00000000000..3444cb0739d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/api-config.h
@@ -0,0 +1,695 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_API_CONFIG_H_INCLUDED
+#define ASMJIT_CORE_API_CONFIG_H_INCLUDED
+
+// AsmJit Library & ABI Version
+// ============================
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Makes a 32-bit integer that represents AsmJit version in `(major << 16) | (minor << 8) | patch` form.
+#define ASMJIT_LIBRARY_MAKE_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
+
+//! AsmJit library version, see \ref ASMJIT_LIBRARY_MAKE_VERSION for a version format reference.
+#define ASMJIT_LIBRARY_VERSION ASMJIT_LIBRARY_MAKE_VERSION(1, 21, 0)
+
+//! \def ASMJIT_ABI_NAMESPACE
+//!
+//! AsmJit ABI namespace is an inline namespace within \ref asmjit namespace.
+//!
+//! It's used to make sure that when user links to an incompatible version of AsmJit, it won't link. It has also
+//! some additional properties as well. When `ASMJIT_ABI_NAMESPACE` is defined by the user it would override the
+//! AsmJit default, which makes it possible to use multiple AsmJit libraries within a single project, totally
+//! controlled by users. This is useful especially in cases in which some of such library comes from third party.
+#if !defined(ASMJIT_ABI_NAMESPACE)
+ #define ASMJIT_ABI_NAMESPACE v1_21
+#endif // !ASMJIT_ABI_NAMESPACE
+
+//! \}
+
+// Global Dependencies
+// ===================
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h> // We really want std types as globals, not under 'std' namespace.
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <initializer_list>
+#include <limits>
+#include <type_traits>
+#include <utility>
+
+#if !defined(_WIN32) && !defined(__EMSCRIPTEN__)
+ #include <pthread.h>
+#endif
+
+// Build Options
+// =============
+
+#if defined(_DOXYGEN)
+
+// NOTE: Doxygen cannot document macros that are not defined, that's why we have to define them and then undefine
+// them immediately, so it won't use the macros with its own preprocessor.
+
+//! \addtogroup asmjit_build
+//! \{
+
+//! \def ASMJIT_EMBED
+//!
+//! Asmjit is embedded, implies \ref ASMJIT_STATIC.
+#define ASMJIT_EMBED
+#undef ASMJIT_EMBED
+
+//! \def ASMJIT_STATIC
+//!
+//! Enables static-library build.
+#define ASMJIT_STATIC
+#undef ASMJIT_STATIC
+
+//! \def ASMJIT_BUILD_DEBUG
+//!
+//! Defined when AsmJit's build configuration is 'Debug'.
+//!
+//! \note Can be defined explicitly to bypass auto-detection.
+#define ASMJIT_BUILD_DEBUG
+#undef ASMJIT_BUILD_DEBUG
+
+//! \def ASMJIT_BUILD_RELEASE
+//!
+//! Defined when AsmJit's build configuration is 'Release'.
+//!
+//! \note Can be defined explicitly to bypass auto-detection.
+#define ASMJIT_BUILD_RELEASE
+#undef ASMJIT_BUILD_RELEASE
+
+//! \def ASMJIT_NO_ABI_NAMESPACE
+//!
+//! Disables the use of an inline ABI namespace within asmjit namespace (the inline namespace is used as an ABI tag).
+#define ASMJIT_NO_ABI_NAMESPACE
+#undef ASMJIT_NO_ABI_NAMESPACE
+
+//! \def ASMJIT_NO_X86
+//!
+//! Disables X86/X64 backends.
+#define ASMJIT_NO_X86
+#undef ASMJIT_NO_X86
+
+//! \def ASMJIT_NO_AARCH64
+//!
+//! Disables AArch64 backend.
+#define ASMJIT_NO_AARCH64
+#undef ASMJIT_NO_AARCH64
+
+//! \def ASMJIT_NO_SHM_OPEN
+//!
+//! Disables the use of `shm_open` on all targets even when it's supported.
+#define ASMJIT_NO_SHM_OPEN
+#undef ASMJIT_NO_SHM_OPEN
+
+//! \def ASMJIT_NO_JIT
+//!
+//! Disables JIT memory management and \ref asmjit::JitRuntime.
+#define ASMJIT_NO_JIT
+#undef ASMJIT_NO_JIT
+
+//! \def ASMJIT_NO_LOGGING
+//!
+//! Disables \ref asmjit::Logger and \ref asmjit::Formatter.
+#define ASMJIT_NO_LOGGING
+#undef ASMJIT_NO_LOGGING
+
+//! \def ASMJIT_NO_TEXT
+//!
+//! Disables everything that contains text.
+#define ASMJIT_NO_TEXT
+#undef ASMJIT_NO_TEXT
+
+//! \def ASMJIT_NO_INTROSPECTION
+//!
+//! Disables instruction introspection API.
+#define ASMJIT_NO_INTROSPECTION
+#undef ASMJIT_NO_INTROSPECTION
+
+//! \def ASMJIT_NO_FOREIGN
+//!
+//! Disables non-host backends entirely (useful for JIT compilers to minimize the library size).
+#define ASMJIT_NO_FOREIGN
+#undef ASMJIT_NO_FOREIGN
+
+//! \def ASMJIT_NO_BUILDER
+//!
+//! Disables \ref asmjit_builder functionality completely.
+#define ASMJIT_NO_BUILDER
+#undef ASMJIT_NO_BUILDER
+
+//! \def ASMJIT_NO_COMPILER
+//!
+//! Disables \ref asmjit_compiler functionality completely.
+#define ASMJIT_NO_COMPILER
+#undef ASMJIT_NO_COMPILER
+
+//! \def ASMJIT_NO_UJIT
+//!
+//! Disables \ref asmjit_ujit functionality completely.
+#define ASMJIT_NO_UJIT
+#undef ASMJIT_NO_UJIT
+
+//! \}
+
+//! \cond
+// ASMJIT_NO_BUILDER implies ASMJIT_NO_COMPILER.
+#if defined(ASMJIT_NO_BUILDER) && !defined(ASMJIT_NO_COMPILER)
+ #define ASMJIT_NO_COMPILER
+#endif
+
+// ASMJIT_NO_COMPILER implies ASMJIT_NO_UJIT.
+#if defined(ASMJIT_NO_COMPILER) && !defined(ASMJIT_NO_UJIT)
+ #define ASMJIT_NO_UJIT
+#endif
+
+// Prevent compile-time errors caused by misconfiguration.
+#if defined(ASMJIT_NO_TEXT) && !defined(ASMJIT_NO_LOGGING)
+ #pragma message("'ASMJIT_NO_TEXT' can only be defined when 'ASMJIT_NO_LOGGING' is defined.")
+ #undef ASMJIT_NO_TEXT
+#endif
+
+#if defined(ASMJIT_NO_INTROSPECTION) && !defined(ASMJIT_NO_COMPILER)
+ #pragma message("'ASMJIT_NO_INTROSPECTION' can only be defined when 'ASMJIT_NO_COMPILER' is defined")
+ #undef ASMJIT_NO_INTROSPECTION
+#endif
+
+//! \endcond
+
+#endif // _DOXYGEN
+
+// Build Mode
+// ==========
+
+//! \cond
+// Detect ASMJIT_BUILD_DEBUG and ASMJIT_BUILD_RELEASE if not defined.
+#if !defined(ASMJIT_BUILD_DEBUG) && !defined(ASMJIT_BUILD_RELEASE)
+ #if !defined(NDEBUG)
+ #define ASMJIT_BUILD_DEBUG
+ #else
+ #define ASMJIT_BUILD_RELEASE
+ #endif
+#endif
+//! \endcond
+
+// Target Architecture Detection
+// =============================
+
+//! \addtogroup asmjit_core
+//! \{
+
+#if defined(_DOXYGEN)
+
+ //! \def ASMJIT_ARCH_X86
+ //!
+ //! Defined to either 0, 32, or 64 depending on whether the target CPU is X86 (32) or X86_64 (64).
+ #define ASMJIT_ARCH_X86 __detected_at_runtime__
+
+ //! \def ASMJIT_ARCH_ARM
+ //!
+ //! Defined to either 0, 32, or 64 depending on whether the target CPU is ARM (32) or AArch64 (64).
+ #define ASMJIT_ARCH_ARM __detected_at_runtime__
+
+ //! \def ASMJIT_ARCH_MIPS
+ //!
+ //! Defined to either 0, 32, or 64 depending on whether the target CPU is MIPS (32) or MISP64 (64).
+ #define ASMJIT_ARCH_MIPS __detected_at_runtime__
+
+ //! \def ASMJIT_ARCH_RISCV
+ //!
+ //! Defined to either 0, 32, or 64 depending on whether the target CPU is RV32 (32) or RV64 (64).
+ #define ASMJIT_ARCH_RISCV __detected_at_runtime__
+
+ //! \def ASMJIT_ARCH_LA
+ //!
+ //! Defined to either 0, 32, or 64 depending on whether the target CPU is 32-bit or 64-bit LoongArch.
+ #define ASMJIT_ARCH_LA __detected_at_runtime__
+
+ //! \def ASMJIT_ARCH_BITS
+ //!
+ //! Defined to either 32 or 64 depending on the target.
+ #define ASMJIT_ARCH_BITS __detected_at_runtime__(32 | 64)
+
+ //! \def ASMJIT_HAS_HOST_BACKEND
+ //!
+ //! Defined when AsmJit is built with the target architecture backend.
+ //!
+ //! For example if AsmJit is building for x86 or x86_64 architectures and `ASMJIT_NO_X86` is not defined,
+ //! it would define `ASMJIT_HAS_HOST_BACKEND` when `<asmjit/code.h>` or ``<asmjit/host.h>` is included.
+ #define ASMJIT_HAS_HOST_BACKEND __detected_at_runtime__
+
+#else
+
+ #if defined(_M_X64) || defined(__x86_64__)
+ #define ASMJIT_ARCH_X86 64
+ #elif defined(_M_IX86) || defined(__X86__) || defined(__i386__)
+ #define ASMJIT_ARCH_X86 32
+ #else
+ #define ASMJIT_ARCH_X86 0
+ #endif
+
+ #if defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__)
+ # define ASMJIT_ARCH_ARM 64
+ #elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__) || defined(__thumb2__)
+ #define ASMJIT_ARCH_ARM 32
+ #else
+ #define ASMJIT_ARCH_ARM 0
+ #endif
+
+ #if defined(_MIPS_ARCH_MIPS64) || defined(__mips64)
+ #define ASMJIT_ARCH_MIPS 64
+ #elif defined(_MIPS_ARCH_MIPS32) || defined(_M_MRX000) || defined(__mips__)
+ #define ASMJIT_ARCH_MIPS 32
+ #else
+ #define ASMJIT_ARCH_MIPS 0
+ #endif
+
+ #if (defined(__riscv) || defined(__riscv__)) && defined(__riscv_xlen)
+ // NOTE `__riscv` is the correct macro in this case as specified by "RISC-V Toolchain Conventions".
+ #define ASMJIT_ARCH_RISCV __riscv_xlen
+ #else
+ #define ASMJIT_ARCH_RISCV 0
+ #endif
+
+ #if defined(__loongarch__) && defined(__loongarch_grlen)
+ #define ASMJIT_ARCH_LA __loongarch_grlen
+ #else
+ #define ASMJIT_ARCH_LA 0
+ #endif
+
+ #define ASMJIT_ARCH_BITS (ASMJIT_ARCH_X86 | ASMJIT_ARCH_ARM | ASMJIT_ARCH_MIPS | ASMJIT_ARCH_RISCV | ASMJIT_ARCH_LA)
+ #if ASMJIT_ARCH_BITS == 0 && !defined(_DOXYGEN)
+ #undef ASMJIT_ARCH_BITS
+ #if defined(__LP64__) || defined(_LP64)
+ #define ASMJIT_ARCH_BITS 64
+ #else
+ #define ASMJIT_ARCH_BITS 32
+ #endif
+ #endif
+
+ #if defined(ASMJIT_NO_FOREIGN)
+ #if !ASMJIT_ARCH_X86 && !defined(ASMJIT_NO_X86)
+ #define ASMJIT_NO_X86
+ #endif
+
+ #if ASMJIT_ARCH_ARM != 64 && !defined(ASMJIT_NO_AARCH64)
+ #define ASMJIT_NO_AARCH64
+ #endif
+ #endif
+
+ #if ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86)
+ #define ASMJIT_HAS_HOST_BACKEND
+ #endif
+
+ #if ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)
+ #define ASMJIT_HAS_HOST_BACKEND
+ #endif
+
+ #if !defined(ASMJIT_NO_UJIT)
+ #if !defined(ASMJIT_NO_X86) && ASMJIT_ARCH_X86 != 0
+ #define ASMJIT_UJIT_X86
+ #elif !defined(ASMJIT_NO_AARCH64) && ASMJIT_ARCH_ARM == 64
+ #define ASMJIT_UJIT_AARCH64
+ #else
+ #define ASMJIT_NO_UJIT
+ #endif
+ #endif
+
+#endif // _DOXYGEN
+
+//! \}
+
+// C++ Compiler and Features Detection
+// ===================================
+
+#if defined(__GNUC__) && defined(__has_attribute)
+ #define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (__has_attribute(NAME))
+#else
+ #define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (!(!(CHECK)))
+#endif // !ASMJIT_CXX_HAS_ATTRIBUTE
+
+// API Decorators & C++ Extensions
+// ===============================
+
+//! \addtogroup asmjit_core
+//! \{
+
+#if defined(_DOXYGEN)
+//! \def ASMJIT_API
+//!
+//! A decorator that is used to decorate API that AsmJit exports when built as a shared library.
+#define ASMJIT_API
+
+//! \def ASMJIT_VIRTAPI
+//!
+//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which
+//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class
+//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export
+//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API).
+#define ASMJIT_VIRTAPI
+
+//! \def ASMJIT_INLINE
+//!
+//! Decorator to force inlining of functions, uses either `__attribute__((__always_inline__))` or __forceinline,
+//! depending on C++ compiler.
+#define ASMJIT_INLINE inline
+
+//! \def ASMJIT_INLINE_NODEBUG
+//!
+//! Like \ref ASMJIT_INLINE, but uses additionally `__nodebug__` or `__artificial__` attribute to make the
+//! debugging of some AsmJit functions easier, especially getters and one-line abstractions where usually you don't
+//! want to step in.
+#define ASMJIT_INLINE_NODEBUG inline
+
+//! \def ASMJIT_INLINE_CONSTEXPR
+//!
+//! Like \ref ASMJIT_INLINE_NODEBUG, but having an additional `constexpr` attribute.
+#define ASMJIT_INLINE_CONSTEXPR inline constexpr
+
+//! \def ASMJIT_NOINLINE
+//!
+//! Decorator to avoid inlining of functions, uses either `__attribute__((__noinline__))` or `__declspec(noinline)`
+//! depending on C++ compiler.
+#define ASMJIT_NOINLINE
+
+//! \def ASMJIT_CDECL
+//!
+//! CDECL function attribute - either `__attribute__((__cdecl__))` or `__cdecl`.
+#define ASMJIT_CDECL
+
+//! \def ASMJIT_STDCALL
+//!
+//! STDCALL function attribute - either `__attribute__((__stdcall__))` or `__stdcall`.
+//!
+//! \note This expands to nothing on non-x86 targets as STDCALL is X86 specific.
+#define ASMJIT_STDCALL
+
+//! \def ASMJIT_FASTCALL
+//!
+//! FASTCALL function attribute - either `__attribute__((__fastcall__))` or `__fastcall`.
+//!
+//! \note Expands to nothing on non-x86 targets as FASTCALL is X86 specific.
+#define ASMJIT_FASTCALL
+
+//! \def ASMJIT_REGPARM(N)
+//!
+//! Expands to `__attribute__((__regparm__(N)))` when compiled by GCC or clang, nothing otherwise.
+#define ASMJIT_REGPARM(N)
+
+//! \def ASMJIT_VECTORCALL
+//!
+//! VECTORCALL function attribute - either `__attribute__((__vectorcall__))` or `__vectorcall`.
+//!
+//! \note Expands to nothing on non-x86 targets as VECTORCALL is X86 specific.
+#define ASMJIT_VECTORCALL
+
+//! \def ASMJIT_MAY_ALIAS
+//!
+//! Expands to `__attribute__((__may_alias__))` if supported.
+#define ASMJIT_MAY_ALIAS
+
+//! \def ASMJIT_ASSUME(...)
+//!
+//! Macro that tells the C/C++ compiler that the expression `...` evaluates to true.
+//!
+//! This macro has two purposes:
+//!
+//! 1. Enable optimizations that would not be possible without the assumption.
+//! 2. Hint static analysis tools that a certain condition is true to prevent false positives.
+#define ASMJIT_ASSUME(...)
+
+//! \def ASMJIT_LIKELY(...)
+//!
+//! Condition is likely to be taken (mostly error handling and edge cases).
+#define ASMJIT_LIKELY(...)
+
+//! \def ASMJIT_UNLIKELY(...)
+//!
+//! Condition is unlikely to be taken (mostly error handling and edge cases).
+#define ASMJIT_UNLIKELY(...)
+
+#else
+
+// API (Export / Import).
+#if !defined(ASMJIT_STATIC)
+ #if defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__))
+ #ifdef ASMJIT_EXPORTS
+ #define ASMJIT_API __declspec(dllexport)
+ #else
+ #define ASMJIT_API __declspec(dllimport)
+ #endif
+ #elif defined(_WIN32) && defined(__GNUC__)
+ #ifdef ASMJIT_EXPORTS
+ #define ASMJIT_API __attribute__((__dllexport__))
+ #else
+ #define ASMJIT_API __attribute__((__dllimport__))
+ #endif
+ #elif defined(__GNUC__)
+ #define ASMJIT_API __attribute__((__visibility__("default")))
+ #endif
+#endif
+
+#if !defined(ASMJIT_API)
+ #define ASMJIT_API
+#endif
+
+#if !defined(ASMJIT_VARAPI)
+ #define ASMJIT_VARAPI extern ASMJIT_API
+#endif
+
+#if defined(__GNUC__) && !defined(_WIN32)
+ #define ASMJIT_VIRTAPI ASMJIT_API
+#else
+ #define ASMJIT_VIRTAPI
+#endif
+
+// Function attributes.
+#if !defined(ASMJIT_BUILD_DEBUG) && defined(__GNUC__) && !defined(_DOXYGEN)
+ #define ASMJIT_INLINE inline __attribute__((__always_inline__))
+#elif !defined(ASMJIT_BUILD_DEBUG) && defined(_MSC_VER) && !defined(_DOXYGEN)
+ #define ASMJIT_INLINE __forceinline
+#else
+ #define ASMJIT_INLINE inline
+#endif
+
+
+#if defined(__clang__) && !defined(_DOXYGEN)
+ #define ASMJIT_INLINE_NODEBUG inline __attribute__((__always_inline__, __nodebug__))
+#elif defined(__GNUC__) && !defined(_DOXYGEN)
+ #define ASMJIT_INLINE_NODEBUG inline __attribute__((__always_inline__, __artificial__))
+#else
+ #define ASMJIT_INLINE_NODEBUG inline
+#endif
+
+#define ASMJIT_INLINE_CONSTEXPR constexpr ASMJIT_INLINE_NODEBUG
+
+#if defined(__GNUC__)
+ #define ASMJIT_NOINLINE __attribute__((__noinline__))
+#elif defined(_MSC_VER)
+ #define ASMJIT_NOINLINE __declspec(noinline)
+#else
+ #define ASMJIT_NOINLINE
+#endif
+
+// Calling conventions.
+#if ASMJIT_ARCH_X86 == 32 && defined(__GNUC__)
+ #define ASMJIT_CDECL __attribute__((__cdecl__))
+ #define ASMJIT_STDCALL __attribute__((__stdcall__))
+ #define ASMJIT_FASTCALL __attribute__((__fastcall__))
+ #define ASMJIT_REGPARM(N) __attribute__((__regparm__(N)))
+#elif ASMJIT_ARCH_X86 == 32 && defined(_MSC_VER)
+ #define ASMJIT_CDECL __cdecl
+ #define ASMJIT_STDCALL __stdcall
+ #define ASMJIT_FASTCALL __fastcall
+ #define ASMJIT_REGPARM(N)
+#else
+ #define ASMJIT_CDECL
+ #define ASMJIT_STDCALL
+ #define ASMJIT_FASTCALL
+ #define ASMJIT_REGPARM(N)
+#endif
+
+#if ASMJIT_ARCH_X86 && defined(_WIN32) && defined(_MSC_VER)
+ #define ASMJIT_VECTORCALL __vectorcall
+#elif ASMJIT_ARCH_X86 && defined(_WIN32)
+ #define ASMJIT_VECTORCALL __attribute__((__vectorcall__))
+#else
+ #define ASMJIT_VECTORCALL
+#endif
+
+#if defined(__GNUC__)
+ #define ASMJIT_ALIGNAS(ALIGNMENT) __attribute__((__aligned__(ALIGNMENT)))
+#elif defined(_MSC_VER)
+ #define ASMJIT_ALIGNAS(ALIGNMENT) __declspec(align(ALIGNMENT))
+#else
+ #define ASMJIT_ALIGNAS(ALIGNMENT) alignas(ALIGNMENT)
+#endif
+
+#if defined(__GNUC__)
+ #define ASMJIT_MAY_ALIAS __attribute__((__may_alias__))
+#else
+ #define ASMJIT_MAY_ALIAS
+#endif
+
+#if defined(__clang__) && !defined(_DOXYGEN)
+ // NOTE: Clang allows to apply this attribute to function arguments, which is what we want. Once GCC decides
+ // to support this use, we will enable it for GCC as well. However, until that, it will be clang only, which
+ // is what we need for static analysis.
+ #define ASMJIT_NONNULL(FUNCTION_ARGUMENT) FUNCTION_ARGUMENT __attribute__((__nonnull__))
+#else
+ #define ASMJIT_NONNULL(FUNCTION_ARGUMENT) FUNCTION_ARGUMENT
+#endif
+
+#if defined(__clang__)
+ #define ASMJIT_ASSUME(...) __builtin_assume(__VA_ARGS__)
+#elif defined(__GNUC__)
+ #define ASMJIT_ASSUME(...) do { if (!(__VA_ARGS__)) __builtin_unreachable(); } while (0)
+#elif defined(_MSC_VER)
+ #define ASMJIT_ASSUME(...) __assume(__VA_ARGS__)
+#else
+ #define ASMJIT_ASSUME(...) (void)0
+#endif
+
+#if defined(__GNUC__)
+ #define ASMJIT_LIKELY(...) __builtin_expect(!!(__VA_ARGS__), 1)
+ #define ASMJIT_UNLIKELY(...) __builtin_expect(!!(__VA_ARGS__), 0)
+#else
+ #define ASMJIT_LIKELY(...) (__VA_ARGS__)
+ #define ASMJIT_UNLIKELY(...) (__VA_ARGS__)
+#endif
+
+// Utilities.
+#define ASMJIT_OFFSET_OF(STRUCT, MEMBER) ((int)(intptr_t)((const char*)&((const STRUCT*)0x100)->MEMBER) - 0x100)
+#define ASMJIT_ARRAY_SIZE(X) uint32_t(sizeof(X) / sizeof(X[0]))
+
+#if ASMJIT_CXX_HAS_ATTRIBUTE(no_sanitize, 0)
+ #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize__("undefined")))
+#elif defined(__GNUC__)
+ #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize_undefined__))
+#else
+ #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF
+#endif
+
+#endif // _DOXYGEN
+
+//! \}
+
+// Diagnostic Macros
+// ======================================
+
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_DOXYGEN)
+ #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
+ __pragma(warning(push)) \
+ __pragma(warning(disable: 4127)) /* conditional expression is const */ \
+ __pragma(warning(disable: 4201)) /* nameless struct/union */
+ #define ASMJIT_END_DIAGNOSTIC_SCOPE \
+ __pragma(warning(pop))
+#else
+ #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE
+ #define ASMJIT_END_DIAGNOSTIC_SCOPE
+#endif
+
+// Begin-Namespace & End-Namespace Macros
+// ======================================
+
+#if !defined(ASMJIT_NO_ABI_NAMESPACE) && !defined(_DOXYGEN)
+ #define ASMJIT_BEGIN_NAMESPACE \
+ ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
+ namespace asmjit { \
+ inline namespace ASMJIT_ABI_NAMESPACE {
+ #define ASMJIT_END_NAMESPACE \
+ }} \
+ ASMJIT_END_DIAGNOSTIC_SCOPE
+#else
+ #define ASMJIT_BEGIN_NAMESPACE \
+ ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
+ namespace asmjit {
+ #define ASMJIT_END_NAMESPACE \
+ } \
+ ASMJIT_END_DIAGNOSTIC_SCOPE
+#endif
+
+#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) ASMJIT_BEGIN_NAMESPACE namespace NAMESPACE {
+#define ASMJIT_END_SUB_NAMESPACE } ASMJIT_END_NAMESPACE
+
+// C++ Utilities
+// =============
+
+#define ASMJIT_NONCOPYABLE(Type) \
+ Type(const Type& other) = delete; \
+ Type& operator=(const Type& other) = delete;
+
+#define ASMJIT_NONCONSTRUCTIBLE(Type) \
+ Type() = delete; \
+ Type(const Type& other) = delete; \
+ Type& operator=(const Type& other) = delete;
+
+//! \def ASMJIT_DEFINE_ENUM_FLAGS(T)
+//!
+//! Defines bit operations for enumeration flags.
+#if defined(_DOXYGEN)
+ #define ASMJIT_DEFINE_ENUM_FLAGS(T)
+#else
+ #define ASMJIT_DEFINE_ENUM_FLAGS(T) \
+ static ASMJIT_INLINE_CONSTEXPR T operator~(T a) noexcept { \
+ return T(~std::underlying_type_t<T>(a)); \
+ } \
+ \
+ static ASMJIT_INLINE_CONSTEXPR T operator|(T a, T b) noexcept { \
+ return T(std::underlying_type_t<T>(a) | std::underlying_type_t<T>(b)); \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR T operator&(T a, T b) noexcept { \
+ return T(std::underlying_type_t<T>(a) & std::underlying_type_t<T>(b)); \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR T operator^(T a, T b) noexcept { \
+ return T(std::underlying_type_t<T>(a) ^ std::underlying_type_t<T>(b)); \
+ } \
+ \
+ static ASMJIT_INLINE_CONSTEXPR T& operator|=(T& a, T b) noexcept { \
+ a = T(std::underlying_type_t<T>(a) | std::underlying_type_t<T>(b)); \
+ return a; \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR T& operator&=(T& a, T b) noexcept { \
+ a = T(std::underlying_type_t<T>(a) & std::underlying_type_t<T>(b)); \
+ return a; \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR T& operator^=(T& a, T b) noexcept { \
+ a = T(std::underlying_type_t<T>(a) ^ std::underlying_type_t<T>(b)); \
+ return a; \
+ }
+#endif
+
+//! \def ASMJIT_DEFINE_ENUM_COMPARE(T)
+//!
+//! Defines comparison operations for enumeration flags.
+#if defined(_DOXYGEN)
+ #define ASMJIT_DEFINE_ENUM_COMPARE(T)
+#else
+ #define ASMJIT_DEFINE_ENUM_COMPARE(T) \
+ static ASMJIT_INLINE_CONSTEXPR bool operator<(T a, T b) noexcept { \
+ return (std::underlying_type_t<T>)(a) < (std::underlying_type_t<T>)(b); \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR bool operator<=(T a, T b) noexcept { \
+ return (std::underlying_type_t<T>)(a) <= (std::underlying_type_t<T>)(b); \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR bool operator>(T a, T b) noexcept { \
+ return (std::underlying_type_t<T>)(a) > (std::underlying_type_t<T>)(b); \
+ } \
+ static ASMJIT_INLINE_CONSTEXPR bool operator>=(T a, T b) noexcept { \
+ return (std::underlying_type_t<T>)(a) >= (std::underlying_type_t<T>)(b); \
+ }
+#endif
+
+#endif // ASMJIT_CORE_API_CONFIG_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/archcommons.h b/3rdparty/asmjit/asmjit/core/archcommons.h
index 2b47d17c1b4..2ab5ca98771 100644
--- a/3rdparty/asmjit/src/asmjit/core/archcommons.h
+++ b/3rdparty/asmjit/asmjit/core/archcommons.h
@@ -1,6 +1,6 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ARCHCOMMONS_H_INCLUDED
@@ -10,7 +10,7 @@
// allows to be created from arm::Shift in a const-expr way, so the arm::Shift must be provided. So this header file
// provides everything architecture-specific that is used by the Core API.
-#include "../core/globals.h"
+#include <asmjit/core/globals.h>
ASMJIT_BEGIN_SUB_NAMESPACE(arm)
@@ -80,7 +80,7 @@ enum class CondCode : uint8_t {
//! \cond
-static constexpr CondCode _reverseCondTable[] = {
+static constexpr CondCode _reverse_cond_table[] = {
CondCode::kAL, // AL <- AL
CondCode::kNA, // NA <- NA
CondCode::kEQ, // EQ <- EQ
@@ -101,9 +101,12 @@ static constexpr CondCode _reverseCondTable[] = {
//! \endcond
//! Reverses a condition code (reverses the corresponding operands of a comparison).
-static ASMJIT_INLINE_NODEBUG constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; }
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR CondCode reverse_cond(CondCode cond) noexcept { return _reverse_cond_table[uint8_t(cond)]; }
+
//! Negates a condition code.
-static ASMJIT_INLINE_NODEBUG constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); }
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR CondCode negate_cond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ uint8_t(1)); }
//! Memory offset mode.
//!
@@ -180,22 +183,26 @@ public:
ASMJIT_INLINE_NODEBUG Shift() noexcept = default;
//! Copy constructor (default)
- ASMJIT_INLINE_NODEBUG constexpr Shift(const Shift& other) noexcept = default;
+ ASMJIT_INLINE_CONSTEXPR Shift(const Shift& other) noexcept = default;
//! Constructs Shift from operation `op` and shift `value`.
- ASMJIT_INLINE_NODEBUG constexpr Shift(ShiftOp op, uint32_t value) noexcept
+ ASMJIT_INLINE_CONSTEXPR Shift(ShiftOp op, uint32_t value) noexcept
: _op(op),
_value(value) {}
//! Returns the shift operation.
- ASMJIT_INLINE_NODEBUG constexpr ShiftOp op() const noexcept { return _op; }
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR ShiftOp op() const noexcept { return _op; }
+
//! Sets shift operation to `op`.
- ASMJIT_INLINE_NODEBUG void setOp(ShiftOp op) noexcept { _op = op; }
+ ASMJIT_INLINE_NODEBUG void set_pp(ShiftOp op) noexcept { _op = op; }
//! Returns the shift amount.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t value() const noexcept { return _value; }
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t value() const noexcept { return _value; }
+
//! Sets shift amount to `value`.
- ASMJIT_INLINE_NODEBUG void setValue(uint32_t value) noexcept { _value = value; }
+ ASMJIT_INLINE_NODEBUG void set_value(uint32_t value) noexcept { _value = value; }
};
//! \}
@@ -247,7 +254,7 @@ enum class DataType : uint32_t {
kMaxValue = 15
};
-static ASMJIT_INLINE_NODEBUG uint32_t dataTypeSize(DataType dt) noexcept {
+static ASMJIT_INLINE_NODEBUG uint32_t data_type_size(DataType dt) noexcept {
static constexpr uint8_t table[] = { 0, 1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 1, 2, 8 };
return table[size_t(dt)];
}
diff --git a/3rdparty/asmjit/asmjit/core/archtraits.cpp b/3rdparty/asmjit/asmjit/core/archtraits.cpp
new file mode 100644
index 00000000000..d4b3ec7e2e1
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/archtraits.cpp
@@ -0,0 +1,167 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/environment.h>
+#include <asmjit/core/misc_p.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86/x86archtraits_p.h>
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/arm/a64archtraits_p.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+static const constexpr ArchTraits no_arch_traits = {
+ // SP/FP/LR/PC.
+ 0xFFu, 0xFFu, 0xFFu, 0xFFu,
+
+ // Reserved,
+ { 0u, 0u, 0u },
+
+ // HW stack alignment.
+ 0u,
+
+ // Min/Max stack offset.
+ 0, 0,
+
+ // Supported register types.
+ 0u,
+
+ // ISA features [Gp, Vec, Mask, Extra].
+ {{
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // TypeIdToRegType.
+ #define V(index) RegType::kNone
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kByte,
+ ArchTypeNameId::kHalf,
+ ArchTypeNameId::kWord,
+ ArchTypeNameId::kQuad
+ }
+};
+
+ASMJIT_VARAPI const ArchTraits _arch_traits[uint32_t(Arch::kMaxValue) + 1] = {
+ // No architecture.
+ no_arch_traits,
+
+ // X86/X86 architectures.
+#if !defined(ASMJIT_NO_X86)
+ x86::x86_arch_traits,
+ x86::x64_arch_traits,
+#else
+ no_arch_traits,
+ no_arch_traits,
+#endif
+
+ // RISCV32/RISCV64 architectures.
+ no_arch_traits,
+ no_arch_traits,
+
+ // ARM architecture
+ no_arch_traits,
+
+ // AArch64 architecture.
+#if !defined(ASMJIT_NO_AARCH64)
+ a64::a64_arch_traits,
+#else
+ no_arch_traits,
+#endif
+
+ // ARM/Thumb architecture.
+ no_arch_traits,
+
+ // Reserved.
+ no_arch_traits,
+
+ // MIPS32/MIPS64
+ no_arch_traits,
+ no_arch_traits
+};
+
+ASMJIT_FAVOR_SIZE Error ArchUtils::type_id_to_reg_signature(Arch arch, TypeId type_id, Out<TypeId> type_id_out, Out<OperandSignature> reg_signature_out) noexcept {
+ const ArchTraits& arch_traits = ArchTraits::by_arch(arch);
+
+ // TODO: Remove this, should never be used like this.
+ // Passed RegType instead of TypeId?
+ if (uint32_t(type_id) <= uint32_t(RegType::kMaxValue)) {
+ type_id = RegUtils::type_id_of(RegType(uint32_t(type_id)));
+ }
+
+ if (ASMJIT_UNLIKELY(!TypeUtils::is_valid(type_id))) {
+ return make_error(Error::kInvalidTypeId);
+ }
+
+ // First normalize architecture dependent types.
+ if (TypeUtils::is_abstract(type_id)) {
+ bool is_32bit = Environment::is_32bit(arch);
+ if (type_id == TypeId::kIntPtr) {
+ type_id = is_32bit ? TypeId::kInt32 : TypeId::kInt64;
+ }
+ else {
+ type_id = is_32bit ? TypeId::kUInt32 : TypeId::kUInt64;
+ }
+ }
+
+ // Type size helps to construct all groups of registers.
+ // TypeId is invalid if the size is zero.
+ uint32_t size = TypeUtils::size_of(type_id);
+ if (ASMJIT_UNLIKELY(!size)) {
+ return make_error(Error::kInvalidTypeId);
+ }
+
+ if (ASMJIT_UNLIKELY(type_id == TypeId::kFloat80)) {
+ return make_error(Error::kInvalidUseOfF80);
+ }
+
+ RegType reg_type = RegType::kNone;
+ if (TypeUtils::is_between(type_id, TypeId::_kBaseStart, TypeId::_kVec32Start)) {
+ reg_type = arch_traits._type_id_to_reg_type[uint32_t(type_id) - uint32_t(TypeId::_kBaseStart)];
+ if (reg_type == RegType::kNone) {
+ if (type_id == TypeId::kInt64 || type_id == TypeId::kUInt64) {
+ return make_error(Error::kInvalidUseOfGpq);
+ }
+ else {
+ return make_error(Error::kInvalidTypeId);
+ }
+ }
+ }
+ else {
+ if (size <= 8 && arch_traits.has_reg_type(RegType::kVec64)) {
+ reg_type = RegType::kVec64;
+ }
+ else if (size <= 16 && arch_traits.has_reg_type(RegType::kVec128)) {
+ reg_type = RegType::kVec128;
+ }
+ else if (size == 32 && arch_traits.has_reg_type(RegType::kVec256)) {
+ reg_type = RegType::kVec256;
+ }
+ else if (arch_traits.has_reg_type(RegType::kVec512)) {
+ reg_type = RegType::kVec512;
+ }
+ else {
+ return make_error(Error::kInvalidTypeId);
+ }
+ }
+
+ *type_id_out = type_id;
+ *reg_signature_out = RegUtils::signature_of(reg_type);
+ return Error::kOk;
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/archtraits.h b/3rdparty/asmjit/asmjit/core/archtraits.h
new file mode 100644
index 00000000000..fc999753d94
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/archtraits.h
@@ -0,0 +1,310 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
+#define ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
+
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Instruction set architecture (ISA).
+enum class Arch : uint8_t {
+ //! Unknown or uninitialized ISA.
+ kUnknown = 0,
+
+ //! 32-bit X86 ISA.
+ kX86 = 1,
+ //! 64-bit X86 ISA also known as X64, X86_64, and AMD64.
+ kX64 = 2,
+
+ //! 32-bit RISC-V ISA.
+ kRISCV32 = 3,
+ //! 64-bit RISC-V ISA.
+ kRISCV64 = 4,
+
+ //! 32-bit ARM ISA (little endian).
+ kARM = 5,
+ //! 64-bit ARM ISA in (little endian).
+ kAArch64 = 6,
+ //! 32-bit ARM ISA in Thumb mode (little endian).
+ kThumb = 7,
+
+ //! 64-bit LoongArch.
+ kLA64 = 8,
+
+ //! 32-bit MIPS ISA in (little endian).
+ kMIPS32_LE = 9,
+ //! 64-bit MIPS ISA in (little endian).
+ kMIPS64_LE = 10,
+
+ //! 32-bit ARM ISA (big endian).
+ kARM_BE = 11,
+ //! 64-bit ARM ISA in (big endian).
+ kAArch64_BE = 12,
+ //! 32-bit ARM ISA in Thumb mode (big endian).
+ kThumb_BE = 13,
+
+ //! 32-bit MIPS ISA in (big endian).
+ kMIPS32_BE = 15,
+ //! 64-bit MIPS ISA in (big endian).
+ kMIPS64_BE = 16,
+
+ //! Maximum value of `Arch`.
+ kMaxValue = kMIPS64_BE,
+
+ //! Mask used by 32-bit ISAs (odd are 32-bit, even are 64-bit).
+ k32BitMask = 0x01,
+ //! First big-endian architecture.
+ kBigEndian = kARM_BE,
+
+ //! ISA detected at compile-time (ISA of the host).
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#else
+ ASMJIT_ARCH_X86 == 32 ? kX86 :
+ ASMJIT_ARCH_X86 == 64 ? kX64 :
+
+ ASMJIT_ARCH_RISCV == 32 ? kRISCV32 :
+ ASMJIT_ARCH_RISCV == 64 ? kRISCV64 :
+
+ ASMJIT_ARCH_LA == 64 ? kLA64 :
+
+ ASMJIT_ARCH_ARM == 32 && Support::ByteOrder::kNative == Support::ByteOrder::kLE ? kARM :
+ ASMJIT_ARCH_ARM == 32 && Support::ByteOrder::kNative == Support::ByteOrder::kBE ? kARM_BE :
+ ASMJIT_ARCH_ARM == 64 && Support::ByteOrder::kNative == Support::ByteOrder::kLE ? kAArch64 :
+ ASMJIT_ARCH_ARM == 64 && Support::ByteOrder::kNative == Support::ByteOrder::kBE ? kAArch64_BE :
+
+ ASMJIT_ARCH_MIPS == 32 && Support::ByteOrder::kNative == Support::ByteOrder::kLE ? kMIPS32_LE :
+ ASMJIT_ARCH_MIPS == 32 && Support::ByteOrder::kNative == Support::ByteOrder::kBE ? kMIPS32_BE :
+ ASMJIT_ARCH_MIPS == 64 && Support::ByteOrder::kNative == Support::ByteOrder::kLE ? kMIPS64_LE :
+ ASMJIT_ARCH_MIPS == 64 && Support::ByteOrder::kNative == Support::ByteOrder::kBE ? kMIPS64_BE :
+
+ kUnknown
+#endif
+};
+
+//! Sub-architecture.
+enum class SubArch : uint8_t {
+ //! Unknown or uninitialized architecture sub-type.
+ kUnknown = 0,
+
+ //! Maximum value of `SubArch`.
+ kMaxValue = kUnknown,
+
+ //! Sub-architecture detected at compile-time (sub-architecture of the host).
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#else
+ kUnknown
+#endif
+};
+
+//! Identifier used to represent names of different data types across architectures.
+enum class ArchTypeNameId : uint8_t {
+ //! Describes 'db' (X86|X86_64 convention, always 8-bit quantity).
+ kDB = 0,
+ //! Describes 'dw' (X86|X86_64 convention, always 16-bit word).
+ kDW,
+ //! Describes 'dd' (X86|X86_64 convention, always 32-bit word).
+ kDD,
+ //! Describes 'dq' (X86|X86_64 convention, always 64-bit word).
+ kDQ,
+ //! Describes 'byte' (always 8-bit quantity).
+ kByte,
+ //! Describes 'half' (most likely 16-bit word).
+ kHalf,
+ //! Describes 'word' (either 16-bit or 32-bit word).
+ kWord,
+ //! Describes 'hword' (most likely 16-bit word).
+ kHWord,
+ //! Describes 'dword' (either 32-bit or 64-bit word).
+ kDWord,
+ //! Describes 'qword' (64-bit word).
+ kQWord,
+ //! Describes 'xword' (64-bit word).
+ kXWord,
+ //! Describes 'short' (always 16-bit word).
+ kShort,
+ //! Describes 'long' (most likely 32-bit word).
+ kLong,
+ //! Describes 'quad' (64-bit word).
+ kQuad,
+
+ //! Maximum value of `ArchTypeNameId`.
+ kMaxValue = kQuad
+};
+
+//! Instruction feature hints for each register group provided by \ref ArchTraits.
+//!
+//! Instruction feature hints describe miscellaneous instructions provided by the architecture that can be used by
+//! register allocator to make certain things simpler - like register swaps or emitting register push/pop sequences.
+//!
+//! \remarks Instruction feature hints are only defined for register groups that can be used with \ref
+//! asmjit_compiler infrastructure. Register groups that are not managed by Compiler are not provided by
+//! \ref ArchTraits and cannot be queried.
+enum class InstHints : uint8_t {
+ //! No feature hints.
+ kNoHints = 0,
+
+ //! Architecture supports a register swap by using a single instruction.
+ kRegSwap = 0x01u,
+ //! Architecture provides push/pop instructions.
+ kPushPop = 0x02u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstHints)
+
+//! Architecture traits used by Function API and Compiler's register allocator.
+struct ArchTraits {
+ //! \name Members
+ //! \{
+
+ //! Stack pointer register id.
+ uint8_t _sp_reg_id;
+ //! Frame pointer register id.
+ uint8_t _fp_reg_id;
+ //! Link register id.
+ uint8_t _link_reg_id;
+ //! Instruction pointer (or program counter) register id, if accessible.
+ uint8_t _pc_reg_id;
+
+ // Reserved.
+ uint8_t _reserved[3];
+ //! Hardware stack alignment requirement.
+ uint8_t _hw_stack_alignment;
+
+ //! Minimum addressable offset on stack guaranteed for all instructions.
+ uint32_t _min_stack_offset;
+ //! Maximum addressable offset on stack depending on specific instruction.
+ uint32_t _max_stack_offset;
+
+ //! Bit-mask indexed by \ref RegType that describes, which register types are supported by the ISA.
+ uint32_t _supported_reg_types;
+
+ //! Flags for each virtual register group.
+ Support::Array<InstHints, Globals::kNumVirtGroups> _inst_hints;
+
+ //! Maps scalar TypeId values (from TypeId::_kIdBaseStart) to register types, see \ref TypeId.
+ Support::Array<RegType, 32> _type_id_to_reg_type;
+
+ //! Word name identifiers of 8-bit, 16-bit, 32-bit, and 64-bit quantities that appear in formatted text.
+ ArchTypeNameId _type_name_id_table[4];
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns stack pointer register id (always GP register).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t sp_reg_id() const noexcept { return _sp_reg_id; }
+
+ //! Returns stack frame register id (always GP register).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t fp_reg_id() const noexcept { return _fp_reg_id; }
+
+ //! Returns link register id, if the architecture provides it (always GP register).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t link_reg_id() const noexcept { return _link_reg_id; }
+
+ //! Returns program counter register id, if the architecture exposes it (always GP register).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t pc_reg_id() const noexcept { return _pc_reg_id; }
+
+ //! Returns a hardware stack alignment requirement.
+ //!
+ //! \note This is a hardware constraint. Architectures that don't constrain it would return the lowest alignment
+ //! (1), however, some architectures may constrain the alignment, for example AArch64 requires 16-byte alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t hw_stack_alignment() const noexcept { return _hw_stack_alignment; }
+
+ //! Tests whether the architecture provides link register, which is used across function calls. If the link
+ //! register is not provided then a function call pushes the return address on stack (X86/X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_link_reg() const noexcept { return _link_reg_id != Reg::kIdBad; }
+
+ //! Returns minimum addressable offset on stack guaranteed for all instructions.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t min_stack_offset() const noexcept { return _min_stack_offset; }
+
+ //! Returns maximum addressable offset on stack depending on specific instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t max_stack_offset() const noexcept { return _max_stack_offset; }
+
+ //! Returns ISA flags of the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstHints inst_feature_hints(RegGroup group) const noexcept { return _inst_hints[group]; }
+
+ //! Tests whether the given register `group` has the given `flag` set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inst_hint(RegGroup group, InstHints feature) const noexcept { return Support::test(_inst_hints[group], feature); }
+
+ //! Tests whether the ISA provides register swap instruction for the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inst_reg_swap(RegGroup group) const noexcept { return has_inst_hint(group, InstHints::kRegSwap); }
+
+ //! Tests whether the ISA provides push/pop instructions for the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inst_push_pop(RegGroup group) const noexcept { return has_inst_hint(group, InstHints::kPushPop); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_reg_type(RegType type) const noexcept {
+ if (ASMJIT_UNLIKELY(type > RegType::kMaxValue)) {
+ type = RegType::kNone;
+ }
+ return Support::bit_test(_supported_reg_types, uint32_t(type));
+ }
+
+ //! Returns a table of ISA word names that appear in formatted text. Word names are ISA dependent.
+ //!
+ //! The index of this table is log2 of the size:
+ //! - [0] 8-bits
+ //! - [1] 16-bits
+ //! - [2] 32-bits
+ //! - [3] 64-bits
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const ArchTypeNameId* type_name_id_table() const noexcept { return _type_name_id_table; }
+
+ //! Returns an ISA word name identifier of the given `index`, see \ref type_name_id_table() for more details.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArchTypeNameId type_name_id_by_index(uint32_t index) const noexcept { return _type_name_id_table[index]; }
+
+ //! \}
+
+ //! \name Statics
+ //! \{
+
+ //! Returns a const reference to `ArchTraits` for the given architecture `arch`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG const ArchTraits& by_arch(Arch arch) noexcept;
+
+ //! \}
+};
+
+ASMJIT_VARAPI const ArchTraits _arch_traits[uint32_t(Arch::kMaxValue) + 1];
+
+//! \cond
+ASMJIT_INLINE_NODEBUG const ArchTraits& ArchTraits::by_arch(Arch arch) noexcept { return _arch_traits[uint32_t(arch)]; }
+//! \endcond
+
+//! Architecture utilities.
+namespace ArchUtils {
+
+ASMJIT_API Error type_id_to_reg_signature(Arch arch, TypeId type_id, Out<TypeId> type_id_out, Out<OperandSignature> reg_signature_out) noexcept;
+
+} // {ArchUtils}
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/assembler.cpp b/3rdparty/asmjit/asmjit/core/assembler.cpp
new file mode 100644
index 00000000000..37f270cc625
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/assembler.cpp
@@ -0,0 +1,444 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/codewriter_p.h>
+#include <asmjit/core/constpool.h>
+#include <asmjit/core/emitterutils_p.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// BaseAssembler - Construction & Destruction
+// ==========================================
+
+BaseAssembler::BaseAssembler() noexcept
+ : BaseEmitter(EmitterType::kAssembler) {}
+
+BaseAssembler::~BaseAssembler() noexcept {}
+
+// BaseAssembler - Buffer Management
+// =================================
+
+Error BaseAssembler::set_offset(size_t offset) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ size_t size = Support::max<size_t>(_section->buffer_size(), this->offset());
+ if (ASMJIT_UNLIKELY(offset > size)) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ _buffer_ptr = _buffer_data + offset;
+ return Error::kOk;
+}
+
+// BaseAssembler - Section Management
+// ==================================
+
+static ASMJIT_INLINE Error BaseAssembler_initSection(BaseAssembler* self, Section* section) noexcept {
+ uint8_t* p = section->_buffer._data;
+
+ self->_section = section;
+ self->_buffer_data = p;
+ self->_buffer_ptr = p + section->_buffer._size;
+ self->_buffer_end = p + section->_buffer._capacity;
+
+ return Error::kOk;
+}
+
+Error BaseAssembler::section(Section* section) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ if (!_code->is_section_valid(section->section_id()) || _code->_sections[section->section_id()] != section) {
+ return report_error(make_error(Error::kInvalidSection));
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ _logger->logf(".section %s {#%u}\n", section->name(), section->section_id());
+ }
+#endif
+
+ return BaseAssembler_initSection(this, section);
+}
+
+// BaseAssembler - Label Management
+// ================================
+
+Label BaseAssembler::new_label() {
+ Label label;
+
+ if (ASMJIT_LIKELY(_code)) {
+ Error err = _code->new_label_id(Out(label._base_id));
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ report_error(err);
+ }
+ }
+
+ return label;
+}
+
+Label BaseAssembler::new_named_label(const char* name, size_t name_size, LabelType type, uint32_t parent_id) {
+ Label label;
+
+ if (ASMJIT_LIKELY(_code)) {
+ uint32_t label_id;
+ Error err = _code->new_named_label_id(Out(label_id), name, name_size, type, parent_id);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ report_error(err);
+ }
+ else {
+ label.set_id(label_id);
+ }
+ }
+
+ return label;
+}
+
+Error BaseAssembler::bind(const Label& label) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ Error err = _code->bind_label(label, _section->section_id(), offset());
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ EmitterUtils::log_label_bound(this, label);
+ }
+#endif
+
+ reset_inline_comment();
+ if (err != Error::kOk) {
+ return report_error(err);
+ }
+
+ return Error::kOk;
+}
+
+// BaseAssembler - Embed
+// =====================
+
+Error BaseAssembler::embed(const void* data, size_t data_size) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ if (data_size == 0) {
+ return Error::kOk;
+ }
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, data_size));
+
+ writer.emit_data(data, data_size);
+ writer.done(this);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<512> sb;
+ Formatter::format_data(sb, _logger->flags(), arch(), TypeId::kUInt8, data, data_size, 1);
+ sb.append('\n');
+ _logger->log(sb);
+ }
+#endif
+
+ return Error::kOk;
+}
+
+Error BaseAssembler::embed_data_array(TypeId type_id, const void* data, size_t item_count, size_t repeat_count) {
+ uint32_t deabstract_delta = TypeUtils::deabstract_delta_of_size(register_size());
+ TypeId final_type_id = TypeUtils::deabstract(type_id, deabstract_delta);
+
+ if (ASMJIT_UNLIKELY(!TypeUtils::is_valid(final_type_id))) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ if (item_count == 0 || repeat_count == 0) {
+ return Error::kOk;
+ }
+
+ uint32_t type_size = TypeUtils::size_of(final_type_id);
+ Support::FastUInt8 of = 0;
+
+ size_t data_size = Support::mul_overflow(item_count, size_t(type_size), &of);
+ size_t total_size = Support::mul_overflow(data_size, repeat_count, &of);
+
+ if (ASMJIT_UNLIKELY(of)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, total_size));
+
+ for (size_t i = 0; i < repeat_count; i++) {
+ writer.emit_data(data, data_size);
+ }
+ writer.done(this);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<512> sb;
+ Formatter::format_data(sb, _logger->flags(), arch(), type_id, data, item_count, repeat_count);
+ sb.append('\n');
+ _logger->log(sb);
+ }
+#endif
+
+ return Error::kOk;
+}
+
+#ifndef ASMJIT_NO_LOGGING
+static const TypeId data_type_id_by_size_table[9] = {
+ TypeId::kVoid, // [0] (invalid)
+ TypeId::kUInt8, // [1] (uint8_t)
+ TypeId::kUInt16, // [2] (uint16_t)
+ TypeId::kVoid, // [3] (invalid)
+ TypeId::kUInt32, // [4] (uint32_t)
+ TypeId::kVoid, // [5] (invalid)
+ TypeId::kVoid, // [6] (invalid)
+ TypeId::kVoid, // [7] (invalid)
+ TypeId::kUInt64 // [8] (uint64_t)
+};
+#endif
+
+Error BaseAssembler::embed_const_pool(const Label& label, const ConstPool& pool) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ if (ASMJIT_UNLIKELY(!is_label_valid(label))) {
+ return report_error(make_error(Error::kInvalidLabel));
+ }
+
+ ASMJIT_PROPAGATE(align(AlignMode::kData, uint32_t(pool.alignment())));
+ ASMJIT_PROPAGATE(bind(label));
+
+ size_t size = pool.size();
+ if (!size) {
+ return Error::kOk;
+ }
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, size));
+
+#ifndef ASMJIT_NO_LOGGING
+ uint8_t* data = writer.cursor();
+#endif
+
+ pool.fill(writer.cursor());
+ writer.advance(size);
+ writer.done(this);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ uint32_t data_size_log2 = Support::min<uint32_t>(Support::ctz(pool.min_item_size()), 3);
+ uint32_t data_size = 1 << data_size_log2;
+
+ StringTmp<512> sb;
+ Formatter::format_data(sb, _logger->flags(), arch(), data_type_id_by_size_table[data_size], data, size >> data_size_log2);
+ sb.append('\n');
+ _logger->log(sb);
+ }
+#endif
+
+ return Error::kOk;
+}
+
+Error BaseAssembler::embed_label(const Label& label, size_t data_size) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ if (ASMJIT_UNLIKELY(!is_label_valid(label))) {
+ return report_error(make_error(Error::kInvalidLabel));
+ }
+
+ RelocEntry* re;
+ LabelEntry& le = _code->label_entry_of(label);
+
+ if (data_size == 0) {
+ data_size = register_size();
+ }
+
+ if (ASMJIT_UNLIKELY(!Support::is_power_of_2_up_to(data_size, 8u))) {
+ return report_error(make_error(Error::kInvalidOperandSize));
+ }
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, data_size));
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<256> sb;
+ sb.append('.');
+ Formatter::format_data_type(sb, _logger->flags(), arch(), data_type_id_by_size_table[data_size]);
+ sb.append(' ');
+ Formatter::format_label(sb, FormatFlags::kNone, this, label.id());
+ sb.append('\n');
+ _logger->log(sb);
+ }
+#endif
+
+ Error err = _code->new_reloc_entry(Out(re), RelocType::kRelToAbs);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ re->_source_section_id = _section->section_id();
+ re->_source_offset = offset();
+ re->_format.reset_to_simple_value(OffsetType::kUnsignedOffset, data_size);
+
+ if (le.is_bound()) {
+ re->_target_section_id = le.section_id();
+ re->_payload = le.offset();
+ }
+ else {
+ OffsetFormat of;
+ of.reset_to_simple_value(OffsetType::kUnsignedOffset, data_size);
+
+ Fixup* fixup = _code->new_fixup(le, _section->section_id(), offset(), 0, of);
+ if (ASMJIT_UNLIKELY(!fixup)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ fixup->label_or_reloc_id = re->id();
+ }
+
+ // Emit dummy DWORD/QWORD depending on the data size.
+ writer.emit_zeros(data_size);
+ writer.done(this);
+
+ return Error::kOk;
+}
+
+Error BaseAssembler::embed_label_delta(const Label& label, const Label& base, size_t data_size) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ if (ASMJIT_UNLIKELY(!Support::bool_and(_code->is_label_valid(label), _code->is_label_valid(base)))) {
+ return report_error(make_error(Error::kInvalidLabel));
+ }
+
+ LabelEntry& label_entry = _code->label_entry_of(label);
+ LabelEntry& base_entry = _code->label_entry_of(base);
+
+ if (data_size == 0) {
+ data_size = register_size();
+ }
+
+ if (ASMJIT_UNLIKELY(!Support::is_power_of_2_up_to(data_size, 8u))) {
+ return report_error(make_error(Error::kInvalidOperandSize));
+ }
+
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, data_size));
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<256> sb;
+ sb.append('.');
+ Formatter::format_data_type(sb, _logger->flags(), arch(), data_type_id_by_size_table[data_size]);
+ sb.append(" (");
+ Formatter::format_label(sb, FormatFlags::kNone, this, label.id());
+ sb.append(" - ");
+ Formatter::format_label(sb, FormatFlags::kNone, this, base.id());
+ sb.append(")\n");
+ _logger->log(sb);
+ }
+#endif
+
+ // If both labels are bound within the same section it means the delta can be calculated now.
+ if (label_entry.is_bound() && base_entry.is_bound() && label_entry.section_id() == base_entry.section_id()) {
+ uint64_t delta = label_entry.offset() - base_entry.offset();
+ writer.emit_value_le(delta, data_size);
+ }
+ else {
+ RelocEntry* re;
+ Error err = _code->new_reloc_entry(Out(re), RelocType::kExpression);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ Expression* exp = _code->_arena.new_oneshot<Expression>();
+ if (ASMJIT_UNLIKELY(!exp)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ exp->reset();
+ exp->op_type = ExpressionOpType::kSub;
+ exp->set_value_as_label_id(0, label.id());
+ exp->set_value_as_label_id(1, base.id());
+
+ re->_format.reset_to_simple_value(OffsetType::kSignedOffset, data_size);
+ re->_source_section_id = _section->section_id();
+ re->_source_offset = offset();
+ re->_payload = (uint64_t)(uintptr_t)exp;
+
+ writer.emit_zeros(data_size);
+ }
+
+ writer.done(this);
+ return Error::kOk;
+}
+
+// BaseAssembler - Comment
+// =======================
+
+Error BaseAssembler::comment(const char* data, size_t size) {
+ if (!has_emitter_flag(EmitterFlags::kLogComments)) {
+ if (!has_emitter_flag(EmitterFlags::kAttached)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+ return Error::kOk;
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ // Logger cannot be NULL if `EmitterFlags::kLogComments` is set.
+ ASMJIT_ASSERT(_logger != nullptr);
+
+ _logger->log(data, size);
+ _logger->log("\n", 1);
+ return Error::kOk;
+#else
+ Support::maybe_unused(data, size);
+ return Error::kOk;
+#endif
+}
+
+// BaseAssembler - Events
+// ======================
+
+Error BaseAssembler::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ // Attach to the end of the .text section.
+ return BaseAssembler_initSection(this, code._sections[0]);
+}
+
+Error BaseAssembler::on_detach(CodeHolder& code) noexcept {
+ _section = nullptr;
+ _buffer_data = nullptr;
+ _buffer_end = nullptr;
+ _buffer_ptr = nullptr;
+ return Base::on_detach(code);
+}
+
+Error BaseAssembler::on_reinit(CodeHolder& code) noexcept {
+ // BaseEmitter::on_reinit() never fails.
+ (void)Base::on_reinit(code);
+
+ return BaseAssembler_initSection(this, code._sections[0]);
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/assembler.h b/3rdparty/asmjit/asmjit/core/assembler.h
new file mode 100644
index 00000000000..021b325f9f5
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/assembler.h
@@ -0,0 +1,147 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_ASSEMBLER_H_INCLUDED
+#define ASMJIT_CORE_ASSEMBLER_H_INCLUDED
+
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/emitter.h>
+#include <asmjit/core/operand.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_assembler
+//! \{
+
+//! Base assembler.
+//!
+//! This is a base class that provides interface used by architecture specific assembler implementations. Assembler
+//! doesn't hold any data, instead it's attached to \ref CodeHolder, which provides all the data that Assembler needs
+//! and which can be altered by it.
+//!
+//! Check out architecture specific assemblers for more details and examples:
+//!
+//! - \ref x86::Assembler - X86/X64 assembler implementation.
+//! - \ref a64::Assembler - AArch64 assembler implementation.
+class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter {
+public:
+ ASMJIT_NONCOPYABLE(BaseAssembler)
+ using Base = BaseEmitter;
+
+ //! \name Members
+ //! \{
+
+ //! Current section where the assembling happens.
+ Section* _section = nullptr;
+ //! Start of the CodeBuffer of the current section.
+ uint8_t* _buffer_data = nullptr;
+ //! End (first invalid byte) of the current section.
+ uint8_t* _buffer_end = nullptr;
+ //! Pointer in the CodeBuffer of the current section.
+ uint8_t* _buffer_ptr = nullptr;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `BaseAssembler` instance.
+ ASMJIT_API BaseAssembler() noexcept;
+ //! Destroys the `BaseAssembler` instance.
+ ASMJIT_API ~BaseAssembler() noexcept override;
+
+ //! \}
+
+ //! \name Code-Buffer Management
+ //! \{
+
+ //! Returns the capacity of the current CodeBuffer.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t buffer_capacity() const noexcept { return (size_t)(_buffer_end - _buffer_data); }
+
+ //! Returns the number of remaining bytes in the current CodeBuffer.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t remaining_space() const noexcept { return (size_t)(_buffer_end - _buffer_ptr); }
+
+ //! Returns the current position in the CodeBuffer.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t offset() const noexcept { return (size_t)(_buffer_ptr - _buffer_data); }
+
+ //! Sets the current position in the CodeBuffer to `offset`.
+ //!
+ //! \note The `offset` cannot be greater than buffer size even if it's within the buffer's capacity.
+ ASMJIT_API Error set_offset(size_t offset);
+
+ //! Returns the start of the CodeBuffer in the current section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* buffer_data() const noexcept { return _buffer_data; }
+
+ //! Returns the end (first invalid byte) in the current section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* buffer_end() const noexcept { return _buffer_end; }
+
+ //! Returns the current pointer in the CodeBuffer in the current section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* buffer_ptr() const noexcept { return _buffer_ptr; }
+
+ //! \}
+
+ //! \name Section Management
+ //! \{
+
+ //! Returns the current section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Section* current_section() const noexcept { return _section; }
+
+ ASMJIT_API Error section(Section* section) override;
+
+ //! \}
+
+ //! \name Label Management
+ //! \{
+
+ ASMJIT_API Label new_label() override;
+ ASMJIT_API Label new_named_label(const char* name, size_t name_size = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId) override;
+
+ ASMJIT_API Error bind(const Label& label) override;
+
+ //! \}
+
+ //! \name Embed
+ //! \{
+
+ ASMJIT_API Error embed(const void* data, size_t data_size) override;
+ ASMJIT_API Error embed_data_array(TypeId type_id, const void* data, size_t item_count, size_t repeat_count = 1) override;
+ ASMJIT_API Error embed_const_pool(const Label& label, const ConstPool& pool) override;
+
+ ASMJIT_API Error embed_label(const Label& label, size_t data_size = 0) override;
+ ASMJIT_API Error embed_label_delta(const Label& label, const Label& base, size_t data_size = 0) override;
+
+ //! \}
+
+ //! \name Comment
+ //! \{
+
+ ASMJIT_API Error comment(const char* data, size_t size = SIZE_MAX) override;
+
+ ASMJIT_INLINE Error comment(Span<const char> data) { return comment(data.data(), data.size()); }
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_reinit(CodeHolder& code) noexcept override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/builder.cpp b/3rdparty/asmjit/asmjit/core/builder.cpp
new file mode 100644
index 00000000000..8fba8a5fd1c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/builder.cpp
@@ -0,0 +1,938 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_BUILDER
+
+#include <asmjit/core/builder.h>
+#include <asmjit/core/emitterutils_p.h>
+#include <asmjit/core/errorhandler.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// PostponedErrorHandler (Internal)
+// ================================
+
+//! Postponed error handler that never throws. Used as a temporal error handler
+//! to run passes. If error occurs, the caller is notified and will call the
+//! real error handler, that can throw.
+class PostponedErrorHandler : public ErrorHandler {
+public:
+ void handle_error(Error err, const char* message, BaseEmitter* origin) override {
+ Support::maybe_unused(err, origin);
+ _message.assign(message);
+ }
+
+ StringTmp<128> _message;
+};
+
+// BaseBuilder - Utilities
+// =======================
+
+static void BaseBuilder_delete_passes(BaseBuilder* self) noexcept {
+ for (Pass* pass : self->_passes) {
+ pass->~Pass();
+ }
+ self->_passes.reset();
+}
+
+// BaseBuilder - Construction & Destruction
+// ========================================
+
+BaseBuilder::BaseBuilder() noexcept
+ : BaseEmitter(EmitterType::kBuilder),
+ _builder_arena(64u * 1024u),
+ _pass_arena(64u * 1024u) {}
+
+BaseBuilder::~BaseBuilder() noexcept {
+ BaseBuilder_delete_passes(this);
+}
+
+// BaseBuilder - Node Management
+// =============================
+
+Error BaseBuilder::new_inst_node(Out<InstNode*> out, InstId inst_id, InstOptions inst_options, uint32_t op_count) {
+ uint32_t op_capacity = InstNode::capacity_of_op_count(op_count);
+ ASMJIT_ASSERT(op_capacity >= InstNode::kBaseOpCapacity);
+
+ void* ptr = _builder_arena.alloc_oneshot(InstNode::node_size_of_op_capacity(op_capacity));
+ if (ASMJIT_UNLIKELY(!ptr)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ out = new(Support::PlacementNew{ptr}) InstNode(inst_id, inst_options, op_count, op_capacity);
+ return Error::kOk;
+}
+
+Error BaseBuilder::new_label_node(Out<LabelNode*> out) {
+ out = nullptr;
+
+ ASMJIT_PROPAGATE(new_node_t<LabelNode>(out));
+ return register_label_node(*out);
+}
+
+Error BaseBuilder::new_align_node(Out<AlignNode*> out, AlignMode align_mode, uint32_t alignment) {
+ out = nullptr;
+ return new_node_t<AlignNode>(out, align_mode, alignment);
+}
+
+Error BaseBuilder::new_embed_data_node(Out<EmbedDataNode*> out, TypeId type_id, const void* data, size_t item_count, size_t repeat_count) {
+ out = nullptr;
+
+ uint32_t deabstract_delta = TypeUtils::deabstract_delta_of_size(register_size());
+ TypeId final_type_id = TypeUtils::deabstract(type_id, deabstract_delta);
+
+ if (ASMJIT_UNLIKELY(!TypeUtils::is_valid(final_type_id))) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ uint32_t type_size = TypeUtils::size_of(final_type_id);
+ Support::FastUInt8 of = 0;
+
+ size_t node_size = Support::madd_overflow(item_count, size_t(type_size), sizeof(EmbedDataNode), &of);
+ if (ASMJIT_UNLIKELY(of)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ EmbedDataNode* node = nullptr;
+ ASMJIT_PROPAGATE(
+ new_node_with_size_t<EmbedDataNode>(Out(node), Arena::aligned_size(node_size), type_id, uint8_t(type_size), item_count, repeat_count)
+ );
+
+ if (data) {
+ memcpy(node->data(), data, node->data_size());
+ }
+
+ out = node;
+ return Error::kOk;
+}
+
+Error BaseBuilder::new_const_pool_node(Out<ConstPoolNode*> out) {
+ out = nullptr;
+
+ ASMJIT_PROPAGATE(new_node_t<ConstPoolNode>(out, _builder_arena));
+ return register_label_node(*out);
+}
+
+Error BaseBuilder::new_comment_node(Out<CommentNode*> out, const char* data, size_t size) {
+ out = nullptr;
+
+ if (data) {
+ if (size == SIZE_MAX) {
+ size = strlen(data);
+ }
+
+ if (size > 0) {
+ data = static_cast<char*>(_builder_arena.dup(data, size, true));
+ if (ASMJIT_UNLIKELY(!data)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+ }
+ }
+
+ return new_node_t<CommentNode>(out, data);
+}
+
+BaseNode* BaseBuilder::add_node(BaseNode* node) noexcept {
+ ASMJIT_ASSERT(!node->_prev);
+ ASMJIT_ASSERT(!node->_next);
+ ASMJIT_ASSERT(!node->is_active());
+
+ if (!_cursor) {
+ if (_node_list.is_empty()) {
+ _node_list.reset(node, node);
+ }
+ else {
+ node->_next = _node_list.first();
+ _node_list._first->_prev = node;
+ _node_list._first = node;
+ }
+ }
+ else {
+ BaseNode* prev = _cursor;
+ BaseNode* next = _cursor->next();
+
+ node->_prev = prev;
+ node->_next = next;
+
+ prev->_next = node;
+ if (next) {
+ next->_prev = node;
+ }
+ else {
+ _node_list._last = node;
+ }
+ }
+
+ node->_add_flags(NodeFlags::kIsActive);
+ if (node->is_section()) {
+ _dirty_section_links = true;
+ }
+
+ _cursor = node;
+ return node;
+}
+
+BaseNode* BaseBuilder::add_after(BaseNode* node, BaseNode* ref) noexcept {
+ ASMJIT_ASSERT(!node->_prev);
+ ASMJIT_ASSERT(!node->_next);
+
+ BaseNode* prev = ref;
+ BaseNode* next = ref->next();
+
+ node->_prev = prev;
+ node->_next = next;
+
+ node->_add_flags(NodeFlags::kIsActive);
+ if (node->is_section()) {
+ _dirty_section_links = true;
+ }
+
+ prev->_next = node;
+ if (next) {
+ next->_prev = node;
+ }
+ else {
+ _node_list._last = node;
+ }
+
+ return node;
+}
+
+BaseNode* BaseBuilder::add_before(BaseNode* node, BaseNode* ref) noexcept {
+ ASMJIT_ASSERT(!node->_prev);
+ ASMJIT_ASSERT(!node->_next);
+ ASMJIT_ASSERT(!node->is_active());
+ ASMJIT_ASSERT(ref->is_active());
+
+ BaseNode* prev = ref->prev();
+ BaseNode* next = ref;
+
+ node->_prev = prev;
+ node->_next = next;
+
+ node->_add_flags(NodeFlags::kIsActive);
+ if (node->is_section()) {
+ _dirty_section_links = true;
+ }
+
+ next->_prev = node;
+ if (prev) {
+ prev->_next = node;
+ }
+ else {
+ _node_list._first = node;
+ }
+
+ return node;
+}
+
+BaseNode* BaseBuilder::remove_node(BaseNode* node) noexcept {
+ if (!node->is_active()) {
+ return node;
+ }
+
+ BaseNode* prev = node->prev();
+ BaseNode* next = node->next();
+
+ if (_node_list._first == node) {
+ _node_list._first = next;
+ }
+ else {
+ prev->_next = next;
+ }
+
+ if (_node_list._last == node) {
+ _node_list._last = prev;
+ }
+ else {
+ next->_prev = prev;
+ }
+
+ node->_prev = nullptr;
+ node->_next = nullptr;
+ node->_clear_flags(NodeFlags::kIsActive);
+
+ if (node->is_section()) {
+ _dirty_section_links = true;
+ }
+
+ if (_cursor == node) {
+ _cursor = prev;
+ }
+
+ return node;
+}
+
+void BaseBuilder::remove_nodes(BaseNode* first, BaseNode* last) noexcept {
+ if (first == last) {
+ remove_node(first);
+ return;
+ }
+
+ if (!first->is_active()) {
+ return;
+ }
+
+ BaseNode* prev = first->prev();
+ BaseNode* next = last->next();
+
+ if (_node_list._first == first) {
+ _node_list._first = next;
+ }
+ else {
+ prev->_next = next;
+ }
+
+ if (_node_list._last == last) {
+ _node_list._last = prev;
+ }
+ else {
+ next->_prev = prev;
+ }
+
+ BaseNode* node = first;
+ uint32_t did_remove_section = false;
+
+ for (;;) {
+ next = node->next();
+ ASMJIT_ASSERT(next != nullptr);
+
+ node->_prev = nullptr;
+ node->_next = nullptr;
+ node->_clear_flags(NodeFlags::kIsActive);
+ did_remove_section |= uint32_t(node->is_section());
+
+ if (_cursor == node) {
+ _cursor = prev;
+ }
+
+ if (node == last) {
+ break;
+ }
+ node = next;
+ }
+
+ if (did_remove_section) {
+ _dirty_section_links = true;
+ }
+}
+
+// BaseBuilder - Sections
+// ======================
+
+Error BaseBuilder::section_node_of(Out<SectionNode*> out, uint32_t section_id) {
+ out = nullptr;
+
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ if (ASMJIT_UNLIKELY(!_code->is_section_valid(section_id))) {
+ return report_error(make_error(Error::kInvalidSection));
+ }
+
+ if (section_id >= _section_nodes.size()) {
+ Error err = _section_nodes.reserve_grow(_builder_arena, section_id + 1);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+ }
+
+ SectionNode* node = nullptr;
+ if (section_id < _section_nodes.size()) {
+ node = _section_nodes[section_id];
+ }
+
+ if (!node) {
+ ASMJIT_PROPAGATE(new_node_t<SectionNode>(Out(node), section_id));
+
+ // We have already reserved enough space, this cannot fail now.
+ if (section_id >= _section_nodes.size()) {
+ // SAFETY: No need to check for error condition as we have already reserved enough space.
+ (void)_section_nodes.resize_grow(_builder_arena, section_id + 1);
+ }
+
+ _section_nodes[section_id] = node;
+ }
+
+ out = node;
+ return Error::kOk;
+}
+
+Error BaseBuilder::section(Section* section) {
+ SectionNode* node;
+ ASMJIT_PROPAGATE(section_node_of(Out(node), section->section_id()));
+ ASMJIT_ASSUME(node != nullptr);
+
+ if (!node->is_active()) {
+ // Insert the section at the end if it was not part of the code.
+ add_after(node, last_node());
+ _cursor = node;
+ }
+ else {
+ // This is a bit tricky. We cache section links to make sure that switching sections doesn't involve
+ // traversal in linked-list unless the position of the section has changed.
+ if (has_dirty_section_links()) {
+ update_section_links();
+ }
+
+ if (node->_next_section) {
+ _cursor = node->_next_section->_prev;
+ }
+ else {
+ _cursor = _node_list.last();
+ }
+ }
+
+ return Error::kOk;
+}
+
+void BaseBuilder::update_section_links() noexcept {
+ if (!_dirty_section_links) {
+ return;
+ }
+
+ BaseNode* node_ = _node_list.first();
+ SectionNode* current_section = nullptr;
+
+ while (node_) {
+ if (node_->is_section()) {
+ if (current_section) {
+ current_section->_next_section = node_->as<SectionNode>();
+ }
+ current_section = node_->as<SectionNode>();
+ }
+ node_ = node_->next();
+ }
+
+ if (current_section) {
+ current_section->_next_section = nullptr;
+ }
+
+ _dirty_section_links = false;
+}
+
+// BaseBuilder - Labels
+// ====================
+
+Error BaseBuilder::label_node_of(Out<LabelNode*> out, uint32_t label_id) {
+ out = nullptr;
+
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ uint32_t index = label_id;
+ if (ASMJIT_UNLIKELY(index >= _code->label_count())) {
+ return make_error(Error::kInvalidLabel);
+ }
+
+ if (index >= _label_nodes.size()) {
+ ASMJIT_PROPAGATE(_label_nodes.resize_grow(_builder_arena, index + 1));
+ }
+
+ LabelNode* node = _label_nodes[index];
+ if (!node) {
+ ASMJIT_PROPAGATE(new_node_t<LabelNode>(Out(node), label_id));
+ _label_nodes[index] = node;
+ }
+
+ out = node;
+ return Error::kOk;
+}
+
+Error BaseBuilder::register_label_node(LabelNode* node) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ uint32_t label_id;
+ ASMJIT_PROPAGATE(_code->new_label_id(Out(label_id)));
+
+ // We just added one label so it must be true.
+ ASMJIT_ASSERT(_label_nodes.size() < label_id + 1);
+ ASMJIT_PROPAGATE(_label_nodes.resize_grow(_builder_arena, label_id + 1));
+
+ _label_nodes[label_id] = node;
+ node->_label_id = label_id;
+
+ return Error::kOk;
+}
+
+static Error Builder_new_label_internal(BaseBuilder* self, uint32_t label_id) {
+ ASMJIT_ASSERT(self->_label_nodes.size() < label_id + 1);
+
+ uint32_t grow_by = label_id - self->_label_nodes._size + 1u;
+ Error err = self->_label_nodes.reserve_additional(self->_builder_arena, grow_by);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return self->report_error(err);
+ }
+
+ LabelNode* node = nullptr;
+ ASMJIT_PROPAGATE(self->new_node_t<LabelNode>(Out(node), label_id));
+
+ while (grow_by > 1u) {
+ self->_label_nodes.append_unchecked(nullptr);
+ grow_by--;
+ }
+
+ self->_label_nodes.append_unchecked(node);
+ node->_label_id = label_id;
+
+ return Error::kOk;
+}
+
+Label BaseBuilder::new_label() {
+ Label label;
+
+ if (ASMJIT_LIKELY(_code)) {
+ uint32_t label_id;
+ Error err = _code->new_label_id(Out(label_id));
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ report_error(err);
+ }
+ else {
+ if (ASMJIT_LIKELY(Builder_new_label_internal(this, label_id) == Error::kOk)) {
+ label.set_id(label_id);
+ }
+ }
+ }
+
+ return label;
+}
+
+Label BaseBuilder::new_named_label(const char* name, size_t name_size, LabelType type, uint32_t parent_id) {
+ Label label;
+
+ if (ASMJIT_LIKELY(_code)) {
+ uint32_t label_id;
+ Error err = _code->new_named_label_id(Out(label_id), name, name_size, type, parent_id);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ report_error(err);
+ }
+ else {
+ if (ASMJIT_LIKELY(Builder_new_label_internal(this, label_id) == Error::kOk)) {
+ label.set_id(label_id);
+ }
+ }
+ }
+
+ return label;
+}
+
+Error BaseBuilder::bind(const Label& label) {
+ LabelNode* node;
+ ASMJIT_PROPAGATE(label_node_of(Out(node), label));
+
+ add_node(node);
+ return Error::kOk;
+}
+
+// BaseBuilder - Passes
+// ====================
+
+ASMJIT_FAVOR_SIZE Pass* BaseBuilder::pass_by_name(const char* name) const noexcept {
+ for (Pass* pass : _passes) {
+ if (strcmp(pass->name(), name) == 0) {
+ return pass;
+ }
+ }
+ return nullptr;
+}
+
+ASMJIT_FAVOR_SIZE Error BaseBuilder::_add_pass(Pass* pass) noexcept {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ if (ASMJIT_UNLIKELY(pass == nullptr)) {
+ // Since this is directly called by `add_pass()` we treat `null` argument
+ // as out-of-memory condition. Otherwise it would be an API misuse.
+ return make_error(Error::kOutOfMemory);
+ }
+
+ if (ASMJIT_UNLIKELY(&pass->_cb != this)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ ASMJIT_PROPAGATE(_passes.append(_builder_arena, pass));
+ return Error::kOk;
+}
+
+Error BaseBuilder::run_passes() {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ if (_passes.is_empty()) {
+ return Error::kOk;
+ }
+
+ ErrorHandler* prev = error_handler();
+ PostponedErrorHandler postponed;
+
+ Error err = Error::kOk;
+ set_error_handler(&postponed);
+
+ for (Pass* pass : _passes) {
+ _pass_arena.reset();
+ err = pass->run(_pass_arena, _logger);
+ if (err != Error::kOk) {
+ break;
+ }
+ }
+ _pass_arena.reset();
+ set_error_handler(prev);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err, !postponed._message.is_empty() ? postponed._message.data() : nullptr);
+ }
+
+ return Error::kOk;
+}
+
+// BaseBuilder - Emit
+// ==================
+
+Error BaseBuilder::_emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) {
+ uint32_t op_count = EmitterUtils::op_count_from_emit_args(o0, o1, o2, op_ext);
+ InstOptions options = inst_options() | forced_inst_options();
+
+ if (Support::test(options, InstOptions::kReserved)) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+#ifndef ASMJIT_NO_INTROSPECTION
+ // Strict validation.
+ if (has_diagnostic_option(DiagnosticOptions::kValidateIntermediate)) {
+ Operand_ op_array[Globals::kMaxOpCount];
+ EmitterUtils::op_array_from_emit_args(op_array, o0, o1, o2, op_ext);
+
+ ValidationFlags validation_flags = is_compiler() ? ValidationFlags::kEnableVirtRegs : ValidationFlags::kNone;
+ Error err = _funcs.validate(BaseInst(inst_id, options, _extra_reg), op_array, op_count, validation_flags);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+#ifndef ASMJIT_NO_LOGGING
+ return EmitterUtils::log_instruction_failed(this, err, inst_id, options, o0, o1, o2, op_ext);
+#else
+ reset_state();
+ return report_error(err);
+#endif
+ }
+ }
+#endif
+
+ // Clear instruction options that should never be part of a regular instruction.
+ options &= ~InstOptions::kReserved;
+ }
+
+ uint32_t op_capacity = InstNode::capacity_of_op_count(op_count);
+ ASMJIT_ASSERT(op_capacity >= InstNode::kBaseOpCapacity);
+
+ void* ptr = _builder_arena.alloc_oneshot(InstNode::node_size_of_op_capacity(op_capacity));
+ const char* comment = inline_comment();
+
+ reset_inst_options();
+ reset_inline_comment();
+
+ if (ASMJIT_UNLIKELY(!ptr)) {
+ reset_extra_reg();
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ InstNode* node = new(Support::PlacementNew{ptr}) InstNode(inst_id, options, op_count, op_capacity);
+ node->set_extra_reg(extra_reg());
+ node->set_op(0, o0);
+ node->set_op(1, o1);
+ node->set_op(2, o2);
+ for (uint32_t i = 3; i < op_count; i++) {
+ node->set_op(i, op_ext[i - 3]);
+ }
+ node->reset_op_range(op_count, op_capacity);
+
+ if (comment) {
+ node->set_inline_comment(static_cast<char*>(_builder_arena.dup(comment, strlen(comment), true)));
+ }
+
+ add_node(node);
+ reset_extra_reg();
+ return Error::kOk;
+}
+
+// BaseBuilder - Align
+// ===================
+
+Error BaseBuilder::align(AlignMode align_mode, uint32_t alignment) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ AlignNode* node;
+ ASMJIT_PROPAGATE(new_align_node(Out(node), align_mode, alignment));
+ ASMJIT_ASSUME(node != nullptr);
+
+ add_node(node);
+ return Error::kOk;
+}
+
+// BaseBuilder - Embed
+// ===================
+
+Error BaseBuilder::embed(const void* data, size_t data_size) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ EmbedDataNode* node;
+ ASMJIT_PROPAGATE(new_embed_data_node(Out(node), TypeId::kUInt8, data, data_size));
+ ASMJIT_ASSUME(node != nullptr);
+
+ add_node(node);
+ return Error::kOk;
+}
+
+Error BaseBuilder::embed_data_array(TypeId type_id, const void* data, size_t item_count, size_t item_repeat) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ EmbedDataNode* node;
+ ASMJIT_PROPAGATE(new_embed_data_node(Out(node), type_id, data, item_count, item_repeat));
+ ASMJIT_ASSUME(node != nullptr);
+
+ add_node(node);
+ return Error::kOk;
+}
+
+Error BaseBuilder::embed_const_pool(const Label& label, const ConstPool& pool) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ if (!is_label_valid(label)) {
+ return report_error(make_error(Error::kInvalidLabel));
+ }
+
+ ASMJIT_PROPAGATE(align(AlignMode::kData, uint32_t(pool.alignment())));
+ ASMJIT_PROPAGATE(bind(label));
+
+ EmbedDataNode* node;
+ ASMJIT_PROPAGATE(new_embed_data_node(Out(node), TypeId::kUInt8, nullptr, pool.size()));
+ ASMJIT_ASSUME(node != nullptr);
+
+ pool.fill(node->data());
+ add_node(node);
+ return Error::kOk;
+}
+
+// BaseBuilder - EmbedLabel & EmbedLabelDelta
+// ==========================================
+
+Error BaseBuilder::embed_label(const Label& label, size_t data_size) {
+ if (ASMJIT_UNLIKELY(!Support::bool_and(_code, Support::is_zero_or_power_of_2_up_to(data_size, 8u)))) {
+ return report_error(make_error(!_code ? Error::kNotInitialized : Error::kInvalidArgument));
+ }
+
+ EmbedLabelNode* node = nullptr;
+ ASMJIT_PROPAGATE(new_node_t<EmbedLabelNode>(Out(node), label.id(), uint32_t(data_size)));
+
+ add_node(node);
+ return Error::kOk;
+}
+
+Error BaseBuilder::embed_label_delta(const Label& label, const Label& base, size_t data_size) {
+ if (ASMJIT_UNLIKELY(!Support::bool_and(_code, Support::is_zero_or_power_of_2_up_to(data_size, 8u)))) {
+ return report_error(make_error(!_code ? Error::kNotInitialized : Error::kInvalidArgument));
+ }
+
+ EmbedLabelDeltaNode* node = nullptr;
+ ASMJIT_PROPAGATE(new_node_t<EmbedLabelDeltaNode>(Out(node), label.id(), base.id(), uint32_t(data_size)));
+
+ add_node(node);
+ return Error::kOk;
+}
+
+// BaseBuilder - Comment
+// =====================
+
+Error BaseBuilder::comment(const char* data, size_t size) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ CommentNode* node;
+ ASMJIT_PROPAGATE(new_comment_node(Out(node), data, size));
+ ASMJIT_ASSUME(node != nullptr);
+
+ add_node(node);
+ return Error::kOk;
+}
+
+// BaseBuilder - SerializeTo
+// =========================
+
+Error BaseBuilder::serialize_to(BaseEmitter* dst) {
+ Error err = Error::kOk;
+ BaseNode* node_ = _node_list.first();
+
+ Operand_ op_array[Globals::kMaxOpCount];
+
+ do {
+ dst->set_inline_comment(node_->inline_comment());
+
+ if (node_->is_inst()) {
+ InstNode* node = node_->as<InstNode>();
+
+ // NOTE: Inlined to remove one additional call per instruction.
+ dst->set_inst_options(node->options());
+ dst->set_extra_reg(node->extra_reg());
+
+ const Operand_* op = node->operands_data();
+ const Operand_* op_ext = EmitterUtils::no_ext;
+
+ size_t op_count = node->op_count();
+ if (op_count > 3) {
+ size_t i = 4;
+ op_array[3] = op[3];
+
+ while (i < op_count) {
+ op_array[i].copy_from(op[i]);
+ i++;
+ }
+ while (i < Globals::kMaxOpCount) {
+ op_array[i].reset();
+ i++;
+ }
+ op_ext = op_array + 3;
+ }
+
+ err = dst->_emit(node->inst_id(), op[0], op[1], op[2], op_ext);
+ }
+ else if (node_->is_label()) {
+ if (node_->is_const_pool()) {
+ ConstPoolNode* node = node_->as<ConstPoolNode>();
+ err = dst->embed_const_pool(node->label(), node->const_pool());
+ }
+ else {
+ LabelNode* node = node_->as<LabelNode>();
+ err = dst->bind(node->label());
+ }
+ }
+ else if (node_->is_align()) {
+ AlignNode* node = node_->as<AlignNode>();
+ err = dst->align(node->align_mode(), node->alignment());
+ }
+ else if (node_->is_embed_data()) {
+ EmbedDataNode* node = node_->as<EmbedDataNode>();
+ err = dst->embed_data_array(node->type_id(), node->data(), node->item_count(), node->repeat_count());
+ }
+ else if (node_->is_embed_label()) {
+ EmbedLabelNode* node = node_->as<EmbedLabelNode>();
+ err = dst->embed_label(node->label(), node->data_size());
+ }
+ else if (node_->is_embed_label_delta()) {
+ EmbedLabelDeltaNode* node = node_->as<EmbedLabelDeltaNode>();
+ err = dst->embed_label_delta(node->label(), node->base_babel(), node->data_size());
+ }
+ else if (node_->is_section()) {
+ SectionNode* node = node_->as<SectionNode>();
+ err = dst->section(_code->section_by_id(node->section_id()));
+ }
+ else if (node_->is_comment()) {
+ CommentNode* node = node_->as<CommentNode>();
+ err = dst->comment(node->inline_comment());
+ }
+
+ if (err != Error::kOk) {
+ break;
+ }
+ node_ = node_->next();
+ } while (node_);
+
+ return err;
+}
+
+// BaseBuilder - Events
+// ====================
+
+static ASMJIT_INLINE void BaseBuilder_clear_all(BaseBuilder* self) noexcept {
+ self->_section_nodes.reset();
+ self->_label_nodes.reset();
+
+ self->_builder_arena.reset();
+ self->_pass_arena.reset();
+
+ self->_cursor = nullptr;
+ self->_node_list.reset();
+}
+
+static ASMJIT_INLINE Error BaseBuilder_init_section(BaseBuilder* self) noexcept {
+ SectionNode* initial_section;
+
+ ASMJIT_PROPAGATE(self->section_node_of(Out(initial_section), 0));
+ ASMJIT_PROPAGATE(self->_passes.reserve_additional(self->_builder_arena, 4));
+
+ ASMJIT_ASSUME(initial_section != nullptr);
+ self->_cursor = initial_section;
+ self->_node_list.reset(initial_section, initial_section);
+ initial_section->_assign_flags(NodeFlags::kIsActive);
+
+ return Error::kOk;
+}
+
+Error BaseBuilder::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ Error err = BaseBuilder_init_section(this);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ on_detach(code);
+ }
+ return err;
+}
+
+Error BaseBuilder::on_detach(CodeHolder& code) noexcept {
+ BaseBuilder_delete_passes(this);
+ BaseBuilder_clear_all(this);
+
+ return Base::on_detach(code);
+}
+
+Error BaseBuilder::on_reinit(CodeHolder& code) noexcept {
+ // BaseEmitter::on_reinit() never fails.
+ (void)Base::on_reinit(code);
+
+ BaseBuilder_delete_passes(this);
+ BaseBuilder_clear_all(this);
+ return BaseBuilder_init_section(this);
+}
+
+// Pass - Construction & Destruction
+// =================================
+
+Pass::Pass(BaseBuilder& cb, const char* name) noexcept
+ : _cb(cb),
+ _name(name) {}
+Pass::~Pass() noexcept {}
+
+// Pass - Interface
+// ================
+
+// [[pure virtual]]
+Error Pass::run(Arena& arena, Logger* logger) {
+ Support::maybe_unused(arena, logger);
+ return make_error(Error::kInvalidState);
+}
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/asmjit/core/builder.h b/3rdparty/asmjit/asmjit/core/builder.h
new file mode 100644
index 00000000000..d65929db5b0
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/builder.h
@@ -0,0 +1,1664 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_BUILDER_H_INCLUDED
+#define ASMJIT_CORE_BUILDER_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_BUILDER
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/constpool.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/inst.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_builder
+//! \{
+
+class BaseBuilder;
+class Pass;
+
+class BaseNode;
+class InstNode;
+class SectionNode;
+class LabelNode;
+class AlignNode;
+class EmbedDataNode;
+class EmbedLabelNode;
+class ConstPoolNode;
+class CommentNode;
+class SentinelNode;
+class LabelDeltaNode;
+
+//! Type of node used by \ref BaseBuilder and \ref BaseCompiler.
+enum class NodeType : uint8_t {
+ //! Invalid node (internal, don't use).
+ kNone = 0,
+
+ // [BaseBuilder]
+
+ //! Node is \ref InstNode.
+ kInst = 1,
+ //! Node is \ref SectionNode.
+ kSection = 2,
+ //! Node is \ref LabelNode.
+ kLabel = 3,
+ //! Node is \ref AlignNode.
+ kAlign = 4,
+ //! Node is \ref EmbedDataNode.
+ kEmbedData = 5,
+ //! Node is \ref EmbedLabelNode.
+ kEmbedLabel = 6,
+ //! Node is \ref EmbedLabelDeltaNode.
+ kEmbedLabelDelta = 7,
+ //! Node is \ref ConstPoolNode.
+ kConstPool = 8,
+ //! Node is \ref CommentNode.
+ kComment = 9,
+ //! Node is \ref SentinelNode.
+ kSentinel = 10,
+
+ // [BaseCompiler]
+
+ //! Node is \ref JumpNode (acts as InstNode).
+ kJump = 15,
+ //! Node is \ref FuncNode (acts as LabelNode).
+ kFunc = 16,
+ //! Node is \ref FuncRetNode (acts as InstNode).
+ kFuncRet = 17,
+ //! Node is \ref InvokeNode (acts as InstNode).
+ kInvoke = 18,
+
+ // [UserDefined]
+
+ //! First id of a user-defined node.
+ kUser = 32
+};
+
+//! Node flags, specify what the node is and/or does.
+enum class NodeFlags : uint8_t {
+ //! No flags.
+ kNone = 0,
+ //! Node is code that can be executed (instruction, label, align, etc...).
+ kIsCode = 0x01u,
+ //! Node is data that cannot be executed (data, const-pool, etc...).
+ kIsData = 0x02u,
+ //! Node is informative, can be removed and ignored.
+ kIsInformative = 0x04u,
+ //! Node can be safely removed if unreachable.
+ kIsRemovable = 0x08u,
+ //! Node does nothing when executed (label, align, explicit nop).
+ kHasNoEffect = 0x10u,
+ //! Node is an instruction or acts as it.
+ kActsAsInst = 0x20u,
+ //! Node is a label or acts as it.
+ kActsAsLabel = 0x40u,
+ //! Node is active (part of the code).
+ kIsActive = 0x80u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(NodeFlags)
+
+//! Node position represents a unique position of a node (most likely an \ref InstNode) in code.
+enum class NodePosition : uint32_t {};
+
+//! Type of the sentinel (purely informative purpose).
+enum class SentinelType : uint8_t {
+ //! Type of the sentinel is not known.
+ kUnknown = 0u,
+ //! This is a sentinel used at the end of \ref FuncNode.
+ kFuncEnd = 1u
+};
+
+//! Node list.
+//!
+//! A double-linked list of pointers to \ref BaseNode, managed by \ref BaseBuilder or \ref BaseCompiler.
+//!
+//! \note At the moment NodeList is just a view, but it's planned that it will get more functionality in the future.
+class NodeList {
+public:
+ //! \name Members
+ //! \{
+
+ //! First node in the list or nullptr if there are no nodes in the list.
+ BaseNode* _first = nullptr;
+ //! Last node in the list or nullptr if there are no nodes in the list.
+ BaseNode* _last = nullptr;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG NodeList() noexcept {}
+
+ ASMJIT_INLINE_NODEBUG NodeList(BaseNode* first, BaseNode* last) noexcept
+ : _first(first),
+ _last(last) {}
+
+ //! \}
+
+ //! \name Reset
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _first = nullptr;
+ _last = nullptr;
+ }
+
+ ASMJIT_INLINE_NODEBUG void reset(BaseNode* first, BaseNode* last) noexcept {
+ _first = first;
+ _last = last;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _first == nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* first() const noexcept { return _first; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* last() const noexcept { return _last; }
+
+ //! \}
+};
+
+//! Builder interface.
+//!
+//! `BaseBuilder` interface was designed to be used as a \ref BaseAssembler replacement in case pre-processing or
+//! post-processing of the generated code is required. The code can be modified during or after code generation.
+//! Pre processing or post processing can be done manually or through a \ref Pass object. \ref BaseBuilder stores
+//! the emitted code as a double-linked list of nodes, which allows O(1) insertion and removal during processing.
+//!
+//! Check out architecture specific builders for more details and examples:
+//!
+//! - \ref x86::Builder - X86/X64 builder implementation.
+//! - \ref a64::Builder - AArch64 builder implementation.
+class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter {
+public:
+ ASMJIT_NONCOPYABLE(BaseBuilder)
+ using Base = BaseEmitter;
+
+ //! \name Members
+ //! \{
+
+ //! Arena used to allocate nodes and passes.
+ Arena _builder_arena;
+ //! Arena only used by `Pass::run()`.
+ Arena _pass_arena;
+
+ //! Array of `Pass` objects.
+ ArenaVector<Pass*> _passes;
+ //! Maps section indexes to `LabelNode` nodes.
+ ArenaVector<SectionNode*> _section_nodes;
+ //! Maps label indexes to `LabelNode` nodes.
+ ArenaVector<LabelNode*> _label_nodes;
+
+ //! Current node (cursor).
+ BaseNode* _cursor = nullptr;
+ //! First and last nodes.
+ NodeList _node_list;
+
+ //! The sections links are dirty (used internally).
+ bool _dirty_section_links = false;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `BaseBuilder` instance.
+ ASMJIT_API BaseBuilder() noexcept;
+ //! Destroys the `BaseBuilder` instance.
+ ASMJIT_API ~BaseBuilder() noexcept override;
+
+ //! \}
+
+ //! \name Node Management
+ //! \{
+
+ //! Returns first and last node of Builder/Compiler wrapped in \ref NodeList.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeList node_list() const noexcept { return _node_list; }
+
+ //! Returns the first node.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* first_node() const noexcept { return _node_list.first(); }
+
+ //! Returns the last node.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* last_node() const noexcept { return _node_list.last(); }
+
+ //! Allocates data required for a node.
+ template<typename T, typename... Args>
+ ASMJIT_INLINE Error new_node_with_size_t(Out<T*> out, size_t size, Args&&... args) {
+ ASMJIT_ASSERT(Support::is_aligned(size, Arena::kAlignment));
+
+ void* ptr =_builder_arena.alloc_oneshot(size);
+ if (ASMJIT_UNLIKELY(!ptr)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ out = new(Support::PlacementNew{ptr}) T(std::forward<Args>(args)...);
+ return Error::kOk;
+ }
+
+ //! Allocates and instantiates a new node of type `T` and returns its instance. If the allocation fails `nullptr`
+ //! is returned.
+ //!
+ //! The template argument `T` must be a type that is extends \ref BaseNode.
+ //!
+ //! \remarks The pointer returned (if non-null) is owned by the Builder or Compiler. When the Builder/Compiler
+ //! is destroyed it destroys all nodes it created so no manual memory management is required.
+ template<typename T, typename... Args>
+ ASMJIT_INLINE Error new_node_t(Out<T*> out, Args&&... args) {
+ void* ptr = _builder_arena.alloc_oneshot(Arena::aligned_size_of<T>());
+
+ if (ASMJIT_UNLIKELY(!ptr)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ out = new(Support::PlacementNew{ptr}) T(std::forward<Args>(args)...);
+ return Error::kOk;
+ }
+
+ //! Creates a new \ref InstNode.
+ ASMJIT_API Error new_inst_node(Out<InstNode*> out, InstId inst_id, InstOptions inst_options, uint32_t op_count);
+ //! Creates a new \ref LabelNode.
+ ASMJIT_API Error new_label_node(Out<LabelNode*> out);
+ //! Creates a new \ref AlignNode.
+ ASMJIT_API Error new_align_node(Out<AlignNode*> out, AlignMode align_mode, uint32_t alignment);
+ //! Creates a new \ref EmbedDataNode.
+ ASMJIT_API Error new_embed_data_node(Out<EmbedDataNode*> out, TypeId type_id, const void* data, size_t item_count, size_t repeat_count = 1);
+ //! Creates a new \ref ConstPoolNode.
+ ASMJIT_API Error new_const_pool_node(Out<ConstPoolNode*> out);
+ //! Creates a new \ref CommentNode.
+ ASMJIT_API Error new_comment_node(Out<CommentNode*> out, const char* data, size_t size);
+
+ //! Adds `node` after the current and sets the current node to the given `node`.
+ ASMJIT_API BaseNode* add_node(BaseNode* ASMJIT_NONNULL(node)) noexcept;
+ //! Inserts the given `node` after `ref`.
+ ASMJIT_API BaseNode* add_after(BaseNode* ASMJIT_NONNULL(node), BaseNode* ASMJIT_NONNULL(ref)) noexcept;
+ //! Inserts the given `node` before `ref`.
+ ASMJIT_API BaseNode* add_before(BaseNode* ASMJIT_NONNULL(node), BaseNode* ASMJIT_NONNULL(ref)) noexcept;
+ //! Removes the given `node`.
+ ASMJIT_API BaseNode* remove_node(BaseNode* ASMJIT_NONNULL(node)) noexcept;
+ //! Removes multiple nodes.
+ ASMJIT_API void remove_nodes(BaseNode* first, BaseNode* last) noexcept;
+
+ //! Returns the cursor.
+ //!
+ //! When the Builder/Compiler is created it automatically creates a '.text' \ref SectionNode, which will be the
+ //! initial one. When instructions are added they are always added after the cursor and the cursor is changed
+ //! to be that newly added node. Use `set_cursor()` to change where new nodes are inserted.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* cursor() const noexcept { return _cursor; }
+
+ //! Sets the current cursor to `node` and returns the previous one.
+ //!
+ //! \remarks This function returns the previous cursor for convenience, but the return value can be safely ignored
+ //! in case it's not important for the user.
+ ASMJIT_INLINE_NODEBUG BaseNode* set_cursor(BaseNode* node) noexcept {
+ BaseNode* old = _cursor;
+ _cursor = node;
+ return old;
+ }
+
+ //! \}
+
+ //! \name Section Management
+ //! \{
+
+ //! Returns a vector of SectionNode objects.
+ //!
+ //! \note If a section of some id is not associated with the Builder/Compiler it would be null, so always check
+ //! for nulls if you iterate over the vector.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<SectionNode*> section_nodes() const noexcept {
+ return _section_nodes.as_span();
+ }
+
+ //! Tests whether the `SectionNode` of the given `section_id` was registered.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_registered_section_node(uint32_t section_id) const noexcept {
+ return section_id < _section_nodes.size() && _section_nodes[section_id] != nullptr;
+ }
+
+ //! Returns or creates a `SectionNode` that matches the given `section_id`.
+ //!
+ //! \remarks This function will either get the existing `SectionNode` or create it in case it wasn't created before.
+ //! You can check whether a section has a registered `SectionNode` by using `BaseBuilder::has_registered_section_node()`.
+ ASMJIT_API Error section_node_of(Out<SectionNode*> out, uint32_t section_id);
+
+ ASMJIT_API Error section(Section* ASMJIT_NONNULL(section)) override;
+
+ //! Returns whether the section links of active section nodes are dirty. You can update these links by calling
+ //! `update_section_links()` in such case.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_dirty_section_links() const noexcept { return _dirty_section_links; }
+
+ //! Updates links of all active section nodes.
+ ASMJIT_API void update_section_links() noexcept;
+
+ //! \}
+
+ //! \name Label Management
+ //! \{
+
+ //! Returns a vector of \ref LabelNode nodes.
+ //!
+ //! \note If a label of some id is not associated with the Builder/Compiler it would be null, so always check for
+ //! nulls if you iterate over the vector.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<LabelNode*> label_nodes() const noexcept { return _label_nodes.as_span(); }
+
+ //! Tests whether the `LabelNode` of the given `label_id` was registered.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_registered_label_node(uint32_t label_id) const noexcept {
+ return label_id < _label_nodes.size() && _label_nodes[label_id] != nullptr;
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_registered_label_node(const Label& label) const noexcept {
+ return has_registered_label_node(label.id());
+ }
+
+ //! Gets or creates a \ref LabelNode that matches the given `label_id`.
+ //!
+ //! \remarks This function will either get the existing `LabelNode` or create it in case it wasn't created before.
+ //! You can check whether a label has a registered `LabelNode` by calling \ref BaseBuilder::has_registered_label_node().
+ ASMJIT_API Error label_node_of(Out<LabelNode*> out, uint32_t label_id);
+
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error label_node_of(Out<LabelNode*> out, const Label& label) {
+ return label_node_of(out, label.id());
+ }
+
+ //! Registers this \ref LabelNode (internal).
+ //!
+ //! This function is used internally to register a newly created `LabelNode` with this instance of Builder/Compiler.
+ //! Use \ref label_node_of() functions to get back \ref LabelNode from a label or its identifier.
+ [[nodiscard]]
+ ASMJIT_API Error register_label_node(LabelNode* ASMJIT_NONNULL(node));
+
+ [[nodiscard]]
+ ASMJIT_API Label new_label() override;
+
+ [[nodiscard]]
+ ASMJIT_API Label new_named_label(const char* name, size_t name_size = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId) override;
+
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_named_label(Span<const char> name, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId) {
+ return new_named_label(name.data(), name.size(), type, parent_id);
+ }
+
+ ASMJIT_API Error bind(const Label& label) override;
+
+ //! \}
+
+ //! \name Passes
+ //! \{
+
+ //! Returns a vector of `Pass` instances that will be executed by `run_passes()`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<Pass*> passes() const noexcept { return _passes.as_span(); }
+
+ //! Allocates and instantiates a new pass of type `T` and returns its instance. If the allocation fails `nullptr` is
+ //! returned.
+ //!
+ //! The template argument `T` must be a type that is extends \ref Pass.
+ //!
+ //! \remarks The pointer returned (if non-null) is owned by the Builder or Compiler. When the Builder/Compiler is
+ //! destroyed it destroys all passes it created so no manual memory management is required.
+ template<typename PassT, typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE PassT* new_pass(Args&&... args) noexcept { return _builder_arena.new_oneshot<PassT>(*this, std::forward<Args>(args)...); }
+
+ template<typename T, typename... Args>
+ ASMJIT_INLINE Error add_pass(Args&&... args) { return _add_pass(new_pass<T, Args...>(std::forward<Args>(args)...)); }
+
+ //! Returns `Pass` by name.
+ //!
+ //! If the pass having the given `name` doesn't exist `nullptr` is returned.
+ [[nodiscard]]
+ ASMJIT_API Pass* pass_by_name(const char* name) const noexcept;
+
+ //! Adds `pass` to the list of passes.
+ ASMJIT_API Error _add_pass(Pass* pass) noexcept;
+
+ //! Runs all passes in order.
+ ASMJIT_API Error run_passes();
+
+ //! \}
+
+ //! \name Emit
+ //! \{
+
+ ASMJIT_API Error _emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) override;
+
+ //! \}
+
+ //! \name Align
+ //! \{
+
+ ASMJIT_API Error align(AlignMode align_mode, uint32_t alignment) override;
+
+ //! \}
+
+ //! \name Embed
+ //! \{
+
+ ASMJIT_API Error embed(const void* data, size_t data_size) override;
+ ASMJIT_API Error embed_data_array(TypeId type_id, const void* data, size_t count, size_t repeat = 1) override;
+ ASMJIT_API Error embed_const_pool(const Label& label, const ConstPool& pool) override;
+
+ ASMJIT_API Error embed_label(const Label& label, size_t data_size = 0) override;
+ ASMJIT_API Error embed_label_delta(const Label& label, const Label& base, size_t data_size = 0) override;
+
+ //! \}
+
+ //! \name Comment
+ //! \{
+
+ ASMJIT_API Error comment(const char* data, size_t size = SIZE_MAX) override;
+
+ ASMJIT_INLINE Error comment(Span<const char> data) { return comment(data.data(), data.size()); }
+
+ //! \}
+
+ //! \name Serialization
+ //! \{
+
+ //! Serializes everything the given emitter `dst`.
+ //!
+ //! Although not explicitly required the emitter will most probably be of Assembler type. The reason is that
+ //! there is no known use of serializing nodes held by Builder/Compiler into another Builder-like emitter.
+ ASMJIT_API Error serialize_to(BaseEmitter* dst);
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_reinit(CodeHolder& code) noexcept override;
+
+ //! \}
+};
+
+//! Base node.
+//!
+//! Every node represents a building-block used by \ref BaseBuilder. It can be instruction, data, label, comment,
+//! directive, or any other high-level representation that can be transformed to the building blocks mentioned.
+//! Every class that inherits \ref BaseBuilder can define its own high-level nodes that can be later lowered to
+//! basic nodes like instructions.
+class BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(BaseNode)
+
+ //! \name Members
+ //! \{
+
+ union {
+ struct {
+ //! Previous node.
+ BaseNode* _prev;
+ //! Next node.
+ BaseNode* _next;
+ };
+ //! Links (an alternative view of previous and next nodes).
+ BaseNode* _links[2];
+ };
+
+ //! Node type.
+ NodeType _node_type;
+ //! Node flags.
+ NodeFlags _node_flags;
+
+ //! Data shared between all types of nodes.
+ struct AnyData {
+ //! Not used by BaseNode.
+ uint8_t _reserved_0;
+ //! Not used by BaseNode.
+ uint8_t _reserved_1;
+ };
+
+ //! Data used by \ref AlignNode.
+ struct AlignData {
+ //! Align mode.
+ AlignMode _align_mode;
+ //! Not used by AlignNode.
+ uint8_t _reserved;
+ };
+
+ //! Data used by \ref InstNode.
+ struct InstData {
+ //! Instruction operands count (used).
+ uint8_t _op_count;
+ //! Instruction operands capacity (allocated).
+ uint8_t _op_capacity;
+ };
+
+ //! Data used by \ref EmbedDataNode.
+ struct EmbedData {
+ //! Type id.
+ TypeId _type_id;
+ //! Size of `_type_id`.
+ uint8_t _type_size;
+ };
+
+ //! Data used by \ref SentinelNode.
+ struct SentinelData {
+ //! Sentinel type.
+ SentinelType _sentinel_type;
+ //! Not used by BaseNode.
+ uint8_t _reserved_1;
+ };
+
+ //! Data that can have different meaning depending on \ref NodeType.
+ union {
+ //! Data useful by any node type.
+ AnyData _any;
+ //! Data specific to \ref AlignNode.
+ AlignData _align_data;
+ //! Data specific to \ref InstNode.
+ InstData _inst;
+ //! Data specific to \ref EmbedDataNode.
+ EmbedData _embed;
+ //! Data specific to \ref SentinelNode.
+ SentinelData _sentinel;
+ };
+
+ //! Node position in code (should be unique).
+ NodePosition _position;
+
+#if !defined(ASMJIT_NO_NODE_USERDATA)
+ //! Value reserved for AsmJit users never touched by AsmJit itself.
+ union {
+ //! User data as 64-bit integer.
+ uint64_t _user_data_u64;
+ //! User data as pointer.
+ void* _user_data_ptr;
+ };
+#endif
+
+ //! Data used exclusively by the current `Pass`.
+ void* _pass_data;
+
+ //! Inline comment/annotation or nullptr if not used.
+ const char* _inline_comment;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `BaseNode` - always use `BaseBuilder` to allocate nodes.
+ ASMJIT_INLINE_NODEBUG explicit BaseNode(NodeType node_type, NodeFlags node_flags = NodeFlags::kNone) noexcept {
+ _prev = nullptr;
+ _next = nullptr;
+ _node_type = node_type;
+ _node_flags = node_flags;
+ _any._reserved_0 = 0;
+ _any._reserved_1 = 0;
+ _position = NodePosition(0);
+#if !defined(ASMJIT_NO_NODE_USERDATA)
+ _user_data_u64 = 0;
+#endif
+ _pass_data = nullptr;
+ _inline_comment = nullptr;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Casts this node to `T*`.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* as() noexcept { return static_cast<T*>(this); }
+
+ //! Casts this node to `const T*`.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const T* as() const noexcept { return static_cast<const T*>(this); }
+
+ //! Returns previous node or `nullptr` if this node is either first or not part of Builder/Compiler node-list.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* prev() const noexcept { return _prev; }
+
+ //! Returns next node or `nullptr` if this node is either last or not part of Builder/Compiler node-list.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* next() const noexcept { return _next; }
+
+ //! Returns the type of the node, see \ref NodeType.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeType type() const noexcept { return _node_type; }
+
+ //! Sets the type of the node, see `NodeType` (internal).
+ //!
+ //! \remarks You should never set a type of a node to anything else than the initial value. This function is only
+ //! provided for users that use custom nodes and need to change the type either during construction or later.
+ ASMJIT_INLINE_NODEBUG void _set_type(NodeType type) noexcept { _node_type = type; }
+
+ //! Tests whether this node is either `InstNode` or extends it.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_inst() const noexcept { return has_flag(NodeFlags::kActsAsInst); }
+
+ //! Tests whether this node is `SectionNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_section() const noexcept { return type() == NodeType::kSection; }
+
+ //! Tests whether this node is either `LabelNode` or extends it.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_label() const noexcept { return has_flag(NodeFlags::kActsAsLabel); }
+
+ //! Tests whether this node is `AlignNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_align() const noexcept { return type() == NodeType::kAlign; }
+
+ //! Tests whether this node is `EmbedDataNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_embed_data() const noexcept { return type() == NodeType::kEmbedData; }
+
+ //! Tests whether this node is `EmbedLabelNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_embed_label() const noexcept { return type() == NodeType::kEmbedLabel; }
+
+ //! Tests whether this node is `EmbedLabelDeltaNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_embed_label_delta() const noexcept { return type() == NodeType::kEmbedLabelDelta; }
+
+ //! Tests whether this node is `ConstPoolNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_const_pool() const noexcept { return type() == NodeType::kConstPool; }
+
+ //! Tests whether this node is `CommentNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_comment() const noexcept { return type() == NodeType::kComment; }
+
+ //! Tests whether this node is `SentinelNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_sentinel() const noexcept { return type() == NodeType::kSentinel; }
+
+ //! Tests whether this node is `FuncNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_func() const noexcept { return type() == NodeType::kFunc; }
+
+ //! Tests whether this node is `FuncRetNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_func_ret() const noexcept { return type() == NodeType::kFuncRet; }
+
+ //! Tests whether this node is `InvokeNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_invoke() const noexcept { return type() == NodeType::kInvoke; }
+
+ //! Returns the node flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeFlags flags() const noexcept { return _node_flags; }
+
+ //! Tests whether the node has the given `flag` set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(NodeFlags flag) const noexcept { return Support::test(_node_flags, flag); }
+
+ //! Replaces node flags with `flags`.
+ ASMJIT_INLINE_NODEBUG void _assign_flags(NodeFlags flags) noexcept { _node_flags = flags; }
+
+ //! Adds the given `flags` to node flags.
+ ASMJIT_INLINE_NODEBUG void _add_flags(NodeFlags flags) noexcept { _node_flags |= flags; }
+
+ //! Clears the given `flags` from node flags.
+ ASMJIT_INLINE_NODEBUG void _clear_flags(NodeFlags flags) noexcept { _node_flags &= ~flags; }
+
+ //! Tests whether the node is code that can be executed.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_code() const noexcept { return has_flag(NodeFlags::kIsCode); }
+
+ //! Tests whether the node is data that cannot be executed.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_data() const noexcept { return has_flag(NodeFlags::kIsData); }
+
+ //! Tests whether the node is informative only (is never encoded like comment, etc...).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_informative() const noexcept { return has_flag(NodeFlags::kIsInformative); }
+
+ //! Tests whether the node is removable if it's in an unreachable code block.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_removable() const noexcept { return has_flag(NodeFlags::kIsRemovable); }
+
+ //! Tests whether the node has no effect when executed (label, .align, nop, ...).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_no_effect() const noexcept { return has_flag(NodeFlags::kHasNoEffect); }
+
+ //! Tests whether the node is part of the code.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_active() const noexcept { return has_flag(NodeFlags::kIsActive); }
+
+ //! Tests whether the node has a position assigned.
+ //!
+ //! \remarks Returns `true` if node position is non-zero.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_position() const noexcept { return _position != NodePosition(0); }
+
+ //! Returns node position.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodePosition position() const noexcept { return _position; }
+
+ //! Sets node position.
+ //!
+ //! Node position is a 32-bit unsigned integer that is used by Compiler to track where the node is relatively to
+ //! the start of the function. It doesn't describe a byte position in a binary, instead it's just a pseudo position
+ //! used by liveness analysis and other tools around Compiler.
+ //!
+ //! If you don't use Compiler then you may use `position()` and `set_position()` freely for your own purposes if
+ //! the 32-bit value limit is okay for you.
+ ASMJIT_INLINE_NODEBUG void set_position(NodePosition position) noexcept { _position = position; }
+
+#if !defined(ASMJIT_NO_NODE_USERDATA)
+ //! Returns user data casted to `T*`.
+ //!
+ //! User data is dedicated to be used only by AsmJit users and not touched by the library. The data is of a pointer
+ //! size so you can either store a pointer or `int64_t` value through `set_user_data_as_ptr()`, `set_user_data_as_int64()`
+ //! and `set_user_data_as_uint64()`.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* user_data_as_ptr() const noexcept { return static_cast<T*>(_user_data_ptr); }
+
+ //! Returns user data casted to `int64_t`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG int64_t user_data_as_int64() const noexcept { return int64_t(_user_data_u64); }
+
+ //! Returns user data casted to `uint64_t`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t user_data_as_uint64() const noexcept { return _user_data_u64; }
+
+ //! Sets user data to `data`.
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG void set_user_data_as_ptr(T* data) noexcept { _user_data_ptr = static_cast<void*>(data); }
+ //! Sets used data to the given 64-bit signed `value`.
+ ASMJIT_INLINE_NODEBUG void set_user_data_as_int64(int64_t value) noexcept { _user_data_u64 = uint64_t(value); }
+ //! Sets used data to the given 64-bit unsigned `value`.
+ ASMJIT_INLINE_NODEBUG void set_user_data_as_uint64(uint64_t value) noexcept { _user_data_u64 = value; }
+
+ //! Resets user data to zero / nullptr.
+ ASMJIT_INLINE_NODEBUG void reset_user_data() noexcept { _user_data_u64 = 0; }
+#endif
+
+ //! Tests whether the node has an associated pass data.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_pass_data() const noexcept { return _pass_data != nullptr; }
+
+ //! Returns the node pass data - data used during processing & transformations.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* pass_data() const noexcept { return (T*)_pass_data; }
+
+ //! Sets the node pass data to `data`.
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG void set_pass_data(T* data) noexcept { _pass_data = (void*)data; }
+ //! Resets the node pass data to nullptr.
+ ASMJIT_INLINE_NODEBUG void reset_pass_data() noexcept { _pass_data = nullptr; }
+
+ //! Tests whether the node has an inline comment/annotation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inline_comment() const noexcept { return _inline_comment != nullptr; }
+
+ //! Returns an inline comment/annotation string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* inline_comment() const noexcept { return _inline_comment; }
+
+ //! Sets an inline comment/annotation string to `s`.
+ ASMJIT_INLINE_NODEBUG void set_inline_comment(const char* s) noexcept { _inline_comment = s; }
+ //! Resets an inline comment/annotation string to nullptr.
+ ASMJIT_INLINE_NODEBUG void reset_inline_comment() noexcept { _inline_comment = nullptr; }
+
+ //! \}
+};
+
+//! Instruction node.
+//!
+//! Wraps an instruction with its options and operands.
+class InstNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(InstNode)
+
+ //! \name Constants
+ //! \{
+
+ //! The number of embedded operands for a default \ref InstNode instance that are always allocated as a part of
+ //! the instruction itself. Minimum embedded operands is 4, but in 32-bit more pointers are smaller and we can
+ //! embed 5. The rest (up to 6 operands) is considered extended.
+ //!
+ //! The number of operands InstNode holds is decided when \ref InstNode is created.
+ static inline constexpr uint32_t kBaseOpCapacity = 3u;
+
+ //! Count of maximum number of operands \ref InstNode can hold.
+ static inline constexpr uint32_t kFullOpCapacity = Globals::kMaxOpCount;
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Operand Capacity Utilities
+ //! \{
+
+ //! Returns the capacity required for the given operands count `op_count`.
+ //!
+ //! There are only two capacities used - \ref kBaseOpCapacity and \ref kFullOpCapacity, so this function
+ //! is used to decide between these two. The general rule is that instructions that can be represented with
+ //! \ref kBaseOpCapacity would use this value, and all others would take \ref kFullOpCapacity.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR uint32_t capacity_of_op_count(uint32_t op_count) noexcept {
+ return op_count <= kBaseOpCapacity ? kBaseOpCapacity : kFullOpCapacity;
+ }
+
+ //! Calculates the size of \ref InstNode required to hold at most `op_capacity` operands.
+ //!
+ //! This function is used internally to allocate \ref InstNode.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR size_t node_size_of_op_capacity(uint32_t op_capacity) noexcept {
+ return Arena::aligned_size(sizeof(InstNode) + op_capacity * sizeof(Operand));
+ }
+
+ //! \}
+ //! \endcond
+
+ //! \name Members
+ //! \{
+
+ //! Base instruction data.
+ BaseInst _base_inst;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `InstNode` instance.
+ ASMJIT_INLINE_NODEBUG InstNode(InstId inst_id, InstOptions options, uint32_t op_count, uint32_t op_capacity = kBaseOpCapacity) noexcept
+ : BaseNode(NodeType::kInst, NodeFlags::kIsCode | NodeFlags::kIsRemovable | NodeFlags::kActsAsInst),
+ _base_inst(inst_id, options) {
+ _inst._op_capacity = uint8_t(op_capacity);
+ _inst._op_count = uint8_t(op_count);
+ }
+
+ //! \cond INTERNAL
+ //! Reset all built-in operands, including `extra_reg`.
+ ASMJIT_INLINE_NODEBUG void _reset_ops() noexcept {
+ _base_inst.reset_extra_reg();
+ reset_op_range(0, op_capacity());
+ }
+ //! \endcond
+
+ //! \}
+
+ //! \name Instruction Object
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseInst& baseInst() noexcept { return _base_inst; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const BaseInst& baseInst() const noexcept { return _base_inst; }
+
+ //! \}
+
+ //! \name Instruction Id
+ //! \{
+
+ //! Returns the instruction id, see `BaseInst::Id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstId inst_id() const noexcept { return _base_inst.inst_id(); }
+
+ //! Returns the instruction real id, see `BaseInst::Id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstId real_id() const noexcept { return _base_inst.real_id(); }
+
+ //! Sets the instruction id to `id`, see `BaseInst::Id`.
+ ASMJIT_INLINE_NODEBUG void set_inst_id(InstId id) noexcept { _base_inst.set_inst_id(id); }
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
+
+ //! Returns instruction options, see \ref InstOptions for more details.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _base_inst.options(); }
+
+ //! Tests whether instruction has the given `option` set/enabled.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_option(InstOptions option) const noexcept { return _base_inst.has_option(option); }
+
+ //! Sets instruction `options` to the provided value, resetting all others.
+ ASMJIT_INLINE_NODEBUG void set_options(InstOptions options) noexcept { _base_inst.set_options(options); }
+ //! Adds instruction `options` to the instruction.
+ ASMJIT_INLINE_NODEBUG void add_options(InstOptions options) noexcept { _base_inst.add_options(options); }
+ //! Clears instruction `options` of the instruction (disables the given options).
+ ASMJIT_INLINE_NODEBUG void clear_options(InstOptions options) noexcept { _base_inst.clear_options(options); }
+ //! Resets instruction options to none - disabling all instruction options.
+ ASMJIT_INLINE_NODEBUG void reset_options() noexcept { _base_inst.reset_options(); }
+
+ //! \}
+
+ //! \name Extra Register
+ //! \{
+
+ //! Tests whether the node has an extra register operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_extra_reg() const noexcept { return _base_inst.has_extra_reg(); }
+
+ //! Returns extra register operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegOnly& extra_reg() noexcept { return _base_inst.extra_reg(); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RegOnly& extra_reg() const noexcept { return _base_inst.extra_reg(); }
+
+ //! Sets extra register operand to `reg`.
+ ASMJIT_INLINE_NODEBUG void set_extra_reg(const Reg& reg) noexcept { _base_inst.set_extra_reg(reg); }
+ //! Sets extra register operand to `reg`.
+ ASMJIT_INLINE_NODEBUG void set_extra_reg(const RegOnly& reg) noexcept { _base_inst.set_extra_reg(reg); }
+ //! Resets extra register operand.
+ ASMJIT_INLINE_NODEBUG void reset_extra_reg() noexcept { _base_inst.reset_extra_reg(); }
+
+ //! \}
+
+ //! \name Instruction Operands
+ //! \{
+
+ //! Returns all operands instruction uses as `Span<Operand>`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<Operand> operands() noexcept { return Span<Operand>(operands_data(), _inst._op_count); }
+
+ //! Returns all operands instruction uses as `Span<const Operand>`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const Operand> operands() const noexcept { return Span<const Operand>(operands_data(), _inst._op_count); }
+
+ //! Returns operands array.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Operand* operands_data() noexcept { return Support::offset_ptr<Operand>(this, sizeof(InstNode)); }
+
+ //! Returns operands array (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Operand* operands_data() const noexcept { return Support::offset_ptr<Operand>(this, sizeof(InstNode)); }
+
+ //! Returns operand count.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t op_count() const noexcept { return _inst._op_count; }
+
+ //! Returns operand capacity.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t op_capacity() const noexcept { return _inst._op_capacity; }
+
+ //! Sets operand count.
+ ASMJIT_INLINE_NODEBUG void set_op_count(size_t op_count) noexcept { _inst._op_count = uint8_t(op_count); }
+
+ //! Returns operand at the given `index`.
+ [[nodiscard]]
+ inline Operand& op(size_t index) noexcept {
+ ASMJIT_ASSERT(index < op_capacity());
+
+ Operand* ops = operands_data();
+ return ops[index].as<Operand>();
+ }
+
+ //! Returns operand at the given `index` (const).
+ [[nodiscard]]
+ inline const Operand& op(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < op_capacity());
+
+ const Operand* ops = operands_data();
+ return ops[index].as<Operand>();
+ }
+
+ //! Sets operand at the given `index` to `op`.
+ inline void set_op(size_t index, const Operand_& op) noexcept {
+ ASMJIT_ASSERT(index < op_capacity());
+
+ Operand* ops = operands_data();
+ ops[index].copy_from(op);
+ }
+
+ //! Resets operand at the given `index` to none.
+ inline void reset_op(size_t index) noexcept {
+ ASMJIT_ASSERT(index < op_capacity());
+
+ Operand* ops = operands_data();
+ ops[index].reset();
+ }
+
+ //! Resets operands at `[start, end)` range.
+ inline void reset_op_range(size_t start, size_t end) noexcept {
+ Operand* ops = operands_data();
+ for (size_t i = start; i < end; i++)
+ ops[i].reset();
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Tests whether the given operand type `op_type` is used by the instruction.
+ [[nodiscard]]
+ inline bool has_op_type(OperandType op_type) const noexcept {
+ for (const Operand& op : operands()) {
+ if (op.op_type() == op_type) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ //! Tests whether the instruction uses at least one register operand.
+ [[nodiscard]]
+ inline bool has_reg_op() const noexcept { return has_op_type(OperandType::kReg); }
+
+ //! Tests whether the instruction uses at least one memory operand.
+ [[nodiscard]]
+ inline bool has_mem_op() const noexcept { return has_op_type(OperandType::kMem); }
+
+ //! Tests whether the instruction uses at least one immediate operand.
+ [[nodiscard]]
+ inline bool has_imm_op() const noexcept { return has_op_type(OperandType::kImm); }
+
+ //! Tests whether the instruction uses at least one label operand.
+ [[nodiscard]]
+ inline bool has_label_op() const noexcept { return has_op_type(OperandType::kLabel); }
+
+ //! Returns the index of the given operand type `op_type`.
+ //!
+ //! \note If the operand type wa found, the value returned represents its index in \ref operands()
+ //! array, otherwise `SIZE_MAX` is returned to signalize that the operand was not found.
+ [[nodiscard]]
+ inline size_t index_of_op_type(OperandType op_type) const noexcept {
+ Span<const Operand> ops = operands();
+ for (size_t i = 0u; i < ops.size(); i++) {
+ if (ops[i].op_type() == op_type)
+ return i;
+ }
+
+ return SIZE_MAX;
+ }
+
+ //! A shortcut that calls `index_of_op_type(OperandType::kMem)`.
+ [[nodiscard]]
+ inline size_t index_of_mem_op() const noexcept { return index_of_op_type(OperandType::kMem); }
+
+ //! A shortcut that calls `index_of_op_type(OperandType::kImm)`.
+ [[nodiscard]]
+ inline size_t index_of_imm_op() const noexcept { return index_of_op_type(OperandType::kImm); }
+
+ //! A shortcut that calls `index_of_op_type(OperandType::kLabel)`.
+ [[nodiscard]]
+ inline size_t index_of_label_op() const noexcept { return index_of_op_type(OperandType::kLabel); }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Rewriting
+ //! \{
+
+ //! Returns `uint32_t[]` view that represents BaseInst::RegOnly and instruction operands.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t* _get_rewrite_array() noexcept { return &_base_inst._extra_reg._id; }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const uint32_t* _get_rewrite_array() const noexcept { return &_base_inst._extra_reg._id; }
+
+ //! Maximum value of rewrite id - 6 operands each having 4 slots is 24, one RegOnly having 2 slots => 26.
+ static inline constexpr uint32_t kMaxRewriteId = 26 - 1;
+
+ //! Returns a rewrite index of the given pointer to `id`.
+ //!
+ //! This function returns a value that can be then passed to \ref _rewrite_id_at_index() function. It can address
+ //! any id from any operand that is used by the instruction in addition to \ref BaseInst::extra_reg field, which
+ //! can also be used by the register allocator.
+ [[nodiscard]]
+ inline uint32_t _get_rewrite_index(const uint32_t* id) const noexcept {
+ const uint32_t* array = _get_rewrite_array();
+ ASMJIT_ASSERT(array <= id);
+
+ size_t index = (size_t)(id - array);
+ ASMJIT_ASSERT(index <= kMaxRewriteId);
+
+ return uint32_t(index);
+ }
+
+ //! Rewrites the given `index` to the provided identifier `id`.
+ //!
+ //! \note This is an internal function that is used by a \ref BaseCompiler implementation to rewrite virtual
+ //! registers to physical registers. The rewriter in this case sees all operands as array of uint32 values
+ //! and the given `index` describes a position in this array. For example a single \ref Operand would be
+ //! decomposed to 4 uint32_t values, where the first at index 0 would be operand signature, next would be
+ //! base id, etc... This is a comfortable way of patching operands without having to check for their types.
+ inline void _rewrite_id_at_index(uint32_t index, uint32_t id) noexcept {
+ ASMJIT_ASSERT(index <= kMaxRewriteId);
+
+ uint32_t* array = _get_rewrite_array();
+ array[index] = id;
+ }
+
+ //! \}
+ //! \endcond
+};
+
+//! Instruction node with embedded operands following \ref InstNode layout.
+//!
+//! \note This is used to make tools such as static analysis and compilers happy about the layout. There were two
+//! instruction nodes in the past, having the second extend the operand array of the first, but that has caused
+//! undefined behavior and made recent tools unhappy about that.
+template<uint32_t kN>
+class InstNodeWithOperands : public InstNode {
+public:
+ Operand_ _operands[kN];
+
+ //! Creates a new `InstNodeWithOperands` instance.
+ ASMJIT_INLINE_NODEBUG InstNodeWithOperands(InstId inst_id, InstOptions options, uint32_t op_count) noexcept
+ : InstNode(inst_id, options, op_count, kN) {}
+};
+
+//! Section node.
+class SectionNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(SectionNode)
+
+ //! \name Members
+ //! \{
+
+ //! Section id.
+ uint32_t _section_id;
+
+ //! Next section node that follows this section.
+ //!
+ //! This link is only valid when the section is active (is part of the code) and when `Builder::has_dirty_section_links()`
+ //! returns `false`. If you intend to use this field you should always call `Builder::update_section_links()` before you
+ //! do so.
+ SectionNode* _next_section;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `SectionNode` instance.
+ ASMJIT_INLINE_NODEBUG explicit SectionNode(uint32_t section_id = 0) noexcept
+ : BaseNode(NodeType::kSection, NodeFlags::kHasNoEffect),
+ _section_id(section_id),
+ _next_section(nullptr) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the section id.
+ ASMJIT_INLINE_NODEBUG uint32_t section_id() const noexcept { return _section_id; }
+
+ //! \}
+};
+
+//! Label node.
+class LabelNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(LabelNode)
+
+ //! \name Members
+ //! \{
+
+ //! Label identifier.
+ uint32_t _label_id;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `LabelNode` instance.
+ ASMJIT_INLINE_NODEBUG explicit LabelNode(uint32_t label_id = Globals::kInvalidId) noexcept
+ : BaseNode(NodeType::kLabel, NodeFlags::kHasNoEffect | NodeFlags::kActsAsLabel),
+ _label_id(label_id) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns \ref Label representation of the \ref LabelNode.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_label_id); }
+
+ //! Returns the id of the label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t label_id() const noexcept { return _label_id; }
+
+ //! \}
+};
+
+//! Align directive (BaseBuilder).
+//!
+//! Wraps `.align` directive.
+class AlignNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(AlignNode)
+
+ //! \name Members
+ //! \{
+
+ //! Alignment (in bytes).
+ uint32_t _alignment;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `AlignNode` instance.
+ ASMJIT_INLINE_NODEBUG AlignNode(AlignMode align_mode, uint32_t alignment) noexcept
+ : BaseNode(NodeType::kAlign, NodeFlags::kIsCode | NodeFlags::kHasNoEffect) {
+
+ _align_data._align_mode = align_mode;
+ _alignment = alignment;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns align mode.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG AlignMode align_mode() const noexcept { return _align_data._align_mode; }
+
+ //! Sets align mode to `align_mode`.
+ ASMJIT_INLINE_NODEBUG void set_align_mode(AlignMode align_mode) noexcept { _align_data._align_mode = align_mode; }
+
+ //! Returns align offset in bytes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
+
+ //! Sets align offset in bytes to `offset`.
+ ASMJIT_INLINE_NODEBUG void set_alignment(uint32_t alignment) noexcept { _alignment = alignment; }
+
+ //! \}
+};
+
+//! Embed data node.
+//!
+//! Wraps `.data` directive. The node contains data that will be placed at the node's position in the assembler
+//! stream. The data is considered to be RAW; no analysis nor byte-order conversion is performed on RAW data.
+class EmbedDataNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(EmbedDataNode)
+
+ //! \name Members
+ //! \{
+
+ size_t _item_count;
+ size_t _repeat_count;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `EmbedDataNode` instance.
+ ASMJIT_INLINE_NODEBUG EmbedDataNode(TypeId type_id, uint8_t type_size, size_t item_count, size_t repeat_count) noexcept
+ : BaseNode(NodeType::kEmbedData, NodeFlags::kIsData),
+ _item_count(item_count),
+ _repeat_count(repeat_count) {
+ _embed._type_id = type_id;
+ _embed._type_size = type_size;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns data type as \ref TypeId.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG TypeId type_id() const noexcept { return _embed._type_id; }
+
+ //! Returns the size of a single data element.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t type_size() const noexcept { return _embed._type_size; }
+
+ //! Returns a pointer to the data casted to `T*` - `uint8_t*` by default.
+ template<typename T = uint8_t>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* data() noexcept { return Support::offset_ptr<T>(this, sizeof(EmbedDataNode)); }
+
+ //! Returns a pointer to the data casted to `T*` - `const uint8_t*` by default (const).
+ template<typename T = uint8_t>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const uint8_t* data() const noexcept { return Support::offset_ptr<T>(this, sizeof(EmbedDataNode)); }
+
+ //! Returns the number of (typed) items in the array.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t item_count() const noexcept { return _item_count; }
+
+ //! Returns how many times the data is repeated (default 1).
+ //!
+ //! Repeated data is useful when defining constants for SIMD, for example.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t repeat_count() const noexcept { return _repeat_count; }
+
+ //! Returns the size of the data, not considering the number of times it repeats.
+ //!
+ //! \note The returned value is the same as `type_size() * item_count()`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t data_size() const noexcept { return size_t(type_size()) * _item_count; }
+
+ //! \}
+};
+
+//! Label data node.
+class EmbedLabelNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(EmbedLabelNode)
+
+ //! \name Members
+ //! \{
+
+ uint32_t _label_id;
+ uint32_t _data_size;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `EmbedLabelNode` instance.
+ ASMJIT_INLINE_NODEBUG EmbedLabelNode(uint32_t label_id = 0, uint32_t data_size = 0) noexcept
+ : BaseNode(NodeType::kEmbedLabel, NodeFlags::kIsData),
+ _label_id(label_id),
+ _data_size(data_size) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the label to embed as \ref Label operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_label_id); }
+
+ //! Sets the label id from `label` operand.
+ ASMJIT_INLINE_NODEBUG void set_label(const Label& label) noexcept { set_label_id(label.id()); }
+
+ //! Returns the id of the label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t label_id() const noexcept { return _label_id; }
+
+ //! Sets the label id (use with caution, improper use can break a lot of things).
+ ASMJIT_INLINE_NODEBUG void set_label_id(uint32_t label_id) noexcept { _label_id = label_id; }
+
+ //! Returns the data size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t data_size() const noexcept { return _data_size; }
+
+ //! Sets the data size.
+ ASMJIT_INLINE_NODEBUG void set_data_size(uint32_t data_size) noexcept { _data_size = data_size; }
+
+ //! \}
+};
+
+//! Label data node.
+class EmbedLabelDeltaNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(EmbedLabelDeltaNode)
+
+ //! \name Members
+ //! \{
+
+ uint32_t _label_id;
+ uint32_t _base_label_id;
+ uint32_t _data_size;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `EmbedLabelDeltaNode` instance.
+ ASMJIT_INLINE_NODEBUG EmbedLabelDeltaNode(uint32_t label_id = 0, uint32_t base_label_id = 0, uint32_t data_size = 0) noexcept
+ : BaseNode(NodeType::kEmbedLabelDelta, NodeFlags::kIsData),
+ _label_id(label_id),
+ _base_label_id(base_label_id),
+ _data_size(data_size) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the label as `Label` operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_label_id); }
+
+ //! Sets the label id from `label` operand.
+ ASMJIT_INLINE_NODEBUG void set_label(const Label& label) noexcept { set_label_id(label.id()); }
+
+ //! Returns the id of the label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t label_id() const noexcept { return _label_id; }
+
+ //! Sets the label id.
+ ASMJIT_INLINE_NODEBUG void set_label_id(uint32_t label_id) noexcept { _label_id = label_id; }
+
+ //! Returns the base label as `Label` operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label base_babel() const noexcept { return Label(_base_label_id); }
+
+ //! Returns the id of the base label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t base_label_id() const noexcept { return _base_label_id; }
+
+ //! Sets the base label id from `label` operand.
+ ASMJIT_INLINE_NODEBUG void set_base_label(const Label& base_babel) noexcept { set_base_label_id(base_babel.id()); }
+ //! Sets the base label id.
+ ASMJIT_INLINE_NODEBUG void set_base_label_id(uint32_t base_label_id) noexcept { _base_label_id = base_label_id; }
+
+ //! Returns the size of the embedded label address.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t data_size() const noexcept { return _data_size; }
+
+ //! Sets the size of the embedded label address.
+ ASMJIT_INLINE_NODEBUG void set_data_size(uint32_t data_size) noexcept { _data_size = data_size; }
+
+ //! \}
+};
+
+//! A node that wraps `ConstPool`.
+class ConstPoolNode : public LabelNode {
+public:
+ ASMJIT_NONCOPYABLE(ConstPoolNode)
+
+ //! \name Members
+ //! \{
+
+ ConstPool _const_pool;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `ConstPoolNode` instance.
+ ASMJIT_INLINE_NODEBUG ConstPoolNode(Arena& arena, uint32_t id = 0) noexcept
+ : LabelNode(id),
+ _const_pool(arena) {
+
+ _set_type(NodeType::kConstPool);
+ _add_flags(NodeFlags::kIsData);
+ _clear_flags(NodeFlags::kIsCode | NodeFlags::kHasNoEffect);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the constant-pool is empty.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _const_pool.is_empty(); }
+
+ //! Returns the size of the constant-pool in bytes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _const_pool.size(); }
+
+ //! Returns minimum alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t alignment() const noexcept { return _const_pool.alignment(); }
+
+ //! Returns the wrapped `ConstPool` instance.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ConstPool& const_pool() noexcept { return _const_pool; }
+
+ //! Returns the wrapped `ConstPool` instance (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const ConstPool& const_pool() const noexcept { return _const_pool; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! See `ConstPool::add()`.
+ ASMJIT_INLINE_NODEBUG Error add(const void* data, size_t size, Out<size_t> offset_out) noexcept {
+ return _const_pool.add(data, size, offset_out);
+ }
+
+ //! \}
+};
+
+//! Comment node.
+class CommentNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(CommentNode)
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `CommentNode` instance.
+ ASMJIT_INLINE_NODEBUG CommentNode(const char* comment) noexcept
+ : BaseNode(NodeType::kComment, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect | NodeFlags::kIsRemovable) {
+ _inline_comment = comment;
+ }
+
+ //! \}
+};
+
+//! Sentinel node.
+//!
+//! Sentinel is a marker that is completely ignored by the code builder. It's used to remember a position in a code
+//! as it never gets removed by any pass.
+class SentinelNode : public BaseNode {
+public:
+ ASMJIT_NONCOPYABLE(SentinelNode)
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `SentinelNode` instance.
+ ASMJIT_INLINE_NODEBUG SentinelNode(SentinelType sentinel_type = SentinelType::kUnknown) noexcept
+ : BaseNode(NodeType::kSentinel, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect) {
+
+ _sentinel._sentinel_type = sentinel_type;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the type of the sentinel.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SentinelType sentinel_type() const noexcept {
+ return _sentinel._sentinel_type;
+ }
+
+ //! Sets the type of the sentinel.
+ ASMJIT_INLINE_NODEBUG void set_sentinel_type(SentinelType type) noexcept {
+ _sentinel._sentinel_type = type;
+ }
+
+ //! \}
+};
+
+//! Pass can be used to implement code transformations, analysis, and lowering.
+class ASMJIT_VIRTAPI Pass {
+public:
+ ASMJIT_BASE_CLASS(Pass)
+ ASMJIT_NONCOPYABLE(Pass)
+
+ //! \name Members
+ //! \{
+
+ //! BaseBuilder this pass is assigned to.
+ BaseBuilder& _cb;
+ //! Name of the pass.
+ const char* _name {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API Pass(BaseBuilder& cb, const char* name) noexcept;
+ ASMJIT_API virtual ~Pass() noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns \ref BaseBuilder associated with the pass.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseBuilder& cb() const noexcept { return _cb; }
+
+ //! Returns the name of the pass.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name; }
+
+ //! \}
+
+ //! \name Pass Interface
+ //! \{
+
+ //! Processes the code stored in Builder or Compiler.
+ //!
+ //! This is the only function that is called by the `BaseBuilder` to process the code. It passes `arena`,
+ //! which will be reset after the `run()` finishes.
+ ASMJIT_API virtual Error run(Arena& arena, Logger* logger);
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_BUILDER
+#endif // ASMJIT_CORE_BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/builder_p.h b/3rdparty/asmjit/asmjit/core/builder_p.h
new file mode 100644
index 00000000000..131dadb5719
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/builder_p.h
@@ -0,0 +1,38 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_BUILDER_P_H_INCLUDED
+#define ASMJIT_CORE_BUILDER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_BUILDER
+
+#include <asmjit/core/builder.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_builder
+//! \{
+
+static ASMJIT_INLINE void Builder_assign_inline_comment(BaseBuilder* self, BaseNode* node, const char* comment) noexcept {
+ if (comment) {
+ node->set_inline_comment(static_cast<char*>(self->_builder_arena.dup(comment, strlen(comment), true)));
+ }
+}
+
+static ASMJIT_INLINE void Builder_assign_inst_state(BaseBuilder* self, InstNode* node, const BaseEmitter::State& state) noexcept {
+ node->set_options(state.options);
+ node->set_extra_reg(state.extra_reg);
+ Builder_assign_inline_comment(self, node, state.comment);
+}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_BUILDER
+#endif // ASMJIT_CORE_BUILDER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/codebuffer.h b/3rdparty/asmjit/asmjit/core/codebuffer.h
index d4b7cebbcef..347bfa1e568 100644
--- a/3rdparty/asmjit/src/asmjit/core/codebuffer.h
+++ b/3rdparty/asmjit/asmjit/core/codebuffer.h
@@ -1,13 +1,13 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_CODEBUFFER_H_INCLUDED
#define ASMJIT_CORE_CODEBUFFER_H_INCLUDED
-#include "../core/globals.h"
-#include "../core/support.h"
+#include <asmjit/core/globals.h>
+#include <asmjit/support/support.h>
ASMJIT_BEGIN_NAMESPACE
@@ -45,11 +45,14 @@ struct CodeBuffer {
//! \{
//! Returns a reference to the byte at the given `index`.
+ [[nodiscard]]
inline uint8_t& operator[](size_t index) noexcept {
ASMJIT_ASSERT(index < _size);
return _data[index];
}
+
//! \overload
+ [[nodiscard]]
inline const uint8_t& operator[](size_t index) const noexcept {
ASMJIT_ASSERT(index < _size);
return _data[index];
@@ -61,34 +64,47 @@ struct CodeBuffer {
//! \{
//! Returns code buffer flags.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG CodeBufferFlags flags() const noexcept { return _flags; }
+
//! Tests whether the code buffer has the given `flag` set.
- ASMJIT_INLINE_NODEBUG bool hasFlag(CodeBufferFlags flag) const noexcept { return Support::test(_flags, flag); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(CodeBufferFlags flag) const noexcept { return Support::test(_flags, flag); }
//! Tests whether this code buffer has a fixed size.
//!
//! Fixed size means that the code buffer is fixed and cannot grow.
- ASMJIT_INLINE_NODEBUG bool isFixed() const noexcept { return hasFlag(CodeBufferFlags::kIsFixed); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_fixed() const noexcept { return has_flag(CodeBufferFlags::kIsFixed); }
//! Tests whether the data in this code buffer is external.
//!
//! External data can only be provided by users, it's never used by AsmJit.
- ASMJIT_INLINE_NODEBUG bool isExternal() const noexcept { return hasFlag(CodeBufferFlags::kIsExternal); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_external() const noexcept { return has_flag(CodeBufferFlags::kIsExternal); }
//! Tests whether the data in this code buffer is allocated (non-null).
- ASMJIT_INLINE_NODEBUG bool isAllocated() const noexcept { return _data != nullptr; }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_allocated() const noexcept { return _data != nullptr; }
//! Tests whether the code buffer is empty.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return !_size; }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return !_size; }
//! Returns the size of the data.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
//! Returns the capacity of the data.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return _capacity; }
//! Returns the pointer to the data the buffer references.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG uint8_t* data() noexcept { return _data; }
+
//! \overload
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG const uint8_t* data() const noexcept { return _data; }
//! \}
@@ -96,10 +112,16 @@ struct CodeBuffer {
//! \name Iterators
//! \{
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG uint8_t* begin() noexcept { return _data; }
+
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG const uint8_t* begin() const noexcept { return _data; }
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG uint8_t* end() noexcept { return _data + _size; }
+
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG const uint8_t* end() const noexcept { return _data + _size; }
//! \}
diff --git a/3rdparty/asmjit/asmjit/core/codeholder.cpp b/3rdparty/asmjit/asmjit/core/codeholder.cpp
new file mode 100644
index 00000000000..c628bf2f6f6
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/codeholder.cpp
@@ -0,0 +1,1451 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/codewriter_p.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/support/support.h>
+
+#include <algorithm>
+#include <tuple>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// CodeHolder - X86 Utilities
+// ==========================
+
+//! Encodes a MOD byte.
+static inline uint32_t x86_encode_mod(uint32_t m, uint32_t o, uint32_t rm) noexcept {
+ return (m << 6) | (o << 3) | rm;
+}
+
+// CodeHolder - LabelEntry Globals & Utilities
+// ===========================================
+
+static constexpr LabelEntry::ExtraData CodeHolder_make_shared_label_extra_data() noexcept {
+ LabelEntry::ExtraData extra_data {};
+ extra_data._section_id = Globals::kInvalidId;
+ extra_data._parent_id = Globals::kInvalidId;
+ return extra_data;
+}
+
+static constexpr LabelEntry::ExtraData CodeHolder_shared_label_extra_data = CodeHolder_make_shared_label_extra_data();
+
+class ResolveFixupIterator {
+public:
+ Fixup* _fixup {};
+ Fixup** _prev {};
+ size_t _resolved_count {};
+ size_t _unresolved_count {};
+
+ ASMJIT_INLINE_NODEBUG explicit ResolveFixupIterator(Fixup** prev_fixup_ptr) noexcept { reset(prev_fixup_ptr); }
+ ASMJIT_INLINE_NODEBUG bool is_valid() const noexcept { return _fixup != nullptr; }
+ ASMJIT_INLINE_NODEBUG Fixup* fixup() const noexcept { return _fixup; }
+
+ ASMJIT_INLINE void reset(Fixup** prev_fixup_ptr) noexcept {
+ _prev = prev_fixup_ptr;
+ _fixup = *_prev;
+ }
+
+ ASMJIT_INLINE void next() noexcept {
+ _prev = &_fixup->next;
+ _fixup = *_prev;
+ _unresolved_count++;
+ }
+
+ ASMJIT_INLINE void resolve_and_next(CodeHolder* code) noexcept {
+ Fixup* fixup_to_delete = _fixup;
+
+ _fixup = _fixup->next;
+ *_prev = _fixup;
+
+ _resolved_count++;
+ code->_fixup_data_pool.release(fixup_to_delete);
+ }
+
+ ASMJIT_INLINE_NODEBUG size_t resolved_count() const noexcept { return _resolved_count; }
+ ASMJIT_INLINE_NODEBUG size_t unresolved_count() const noexcept { return _unresolved_count; }
+};
+
+// CodeHolder - Section Globals & Utilities
+// ========================================
+
+static const char Section_address_table_name[] = ".addrtab";
+
+static ASMJIT_INLINE void Section_init_name(
+ Section* section,
+ char c0 = 0, char c1 = 0, char c2 = 0, char c3 = 0,
+ char c4 = 0, char c5 = 0, char c6 = 0, char c7 = 0) noexcept {
+
+ section->_name.u32[0] = Support::bytepack32_4x8(uint8_t(c0), uint8_t(c1), uint8_t(c2), uint8_t(c3));
+ section->_name.u32[1] = Support::bytepack32_4x8(uint8_t(c4), uint8_t(c5), uint8_t(c6), uint8_t(c7));
+ section->_name.u32[2] = 0u;
+ section->_name.u32[3] = 0u;
+}
+
+static ASMJIT_INLINE void Section_init_data(Section* section, uint32_t section_id, SectionFlags flags, uint32_t alignment, int order, uint64_t offset) noexcept {
+ section->_section_id = section_id;
+
+ // These two fields are not used by sections (see \ref LabelEntry for more details about why).
+ section->_internal_label_type = LabelType::kAnonymous;
+ section->_internal_label_flags = LabelFlags::kNone;
+
+ section->assign_flags(flags);
+ section->_alignment = alignment;
+ section->_order = order;
+ section->_offset = offset;
+ section->_virtual_size = 0;
+}
+
+static ASMJIT_INLINE void Section_init_buffer(Section* section) noexcept {
+ section->_buffer = CodeBuffer{};
+}
+
+static ASMJIT_INLINE void Section_release_buffer(Section* section) noexcept {
+ if (Support::bool_and(section->_buffer.data() != nullptr, !section->_buffer.is_external())) {
+ ::free(section->_buffer._data);
+ }
+}
+
+// CodeHolder - Utilities
+// ======================
+
+static ASMJIT_INLINE Error CodeHolder_init_section_storage(CodeHolder* self) noexcept {
+ Error err1 = self->_sections.reserve_additional(self->_arena);
+ Error err2 = self->_sections_by_order.reserve_additional(self->_arena);
+
+ return Error(uint32_t(err1) | uint32_t(err2));
+}
+
+static ASMJIT_INLINE void CodeHolder_add_text_section(CodeHolder* self) noexcept {
+ Section* text_section = &self->_text_section;
+
+ Section_init_data(text_section, 0u, SectionFlags::kExecutable | SectionFlags::kReadOnly | SectionFlags::kBuiltIn, 0u, std::numeric_limits<int>::lowest(), 0);
+ Section_init_name(text_section, '.', 't', 'e', 'x', 't');
+
+ self->_sections.append_unchecked(text_section);
+ self->_sections_by_order.append_unchecked(text_section);
+}
+
+static ASMJIT_NOINLINE void CodeHolder_detach_emitters(CodeHolder* self) noexcept {
+ BaseEmitter* emitter = self->_attached_first;
+
+ while (emitter) {
+ BaseEmitter* next = emitter->_attached_next;
+
+ emitter->_attached_prev = nullptr;
+ (void)emitter->on_detach(*self);
+ emitter->_attached_next = nullptr;
+ emitter->_code = nullptr;
+
+ emitter = next;
+ self->_attached_first = next;
+ }
+
+ self->_attached_last = nullptr;
+}
+
+static ASMJIT_INLINE void CodeHolder_reset_env_and_attached_logger_and_eh(CodeHolder* self) noexcept {
+ self->_environment.reset();
+ self->_cpu_features.reset();
+ self->_base_address = Globals::kNoBaseAddress;
+ self->_logger = nullptr;
+ self->_error_handler = nullptr;
+}
+
+// Reset sections.
+static ASMJIT_INLINE void CodeHolder_reset_sections(CodeHolder* self, ResetPolicy reset_policy) noexcept {
+ // Reset all sections except the first one (.text section).
+ uint32_t from_section = reset_policy == ResetPolicy::kHard ? 0u : 1u;
+ uint32_t section_count = self->_sections._size;
+
+ for (uint32_t i = from_section; i < section_count; i++) {
+ Section* section = self->_sections[i];
+
+ Section_release_buffer(section);
+ section->_buffer._data = nullptr;
+ section->_buffer._capacity = 0;
+ }
+}
+
+// Reset arena and all containers using it.
+static ASMJIT_INLINE void CodeHolder_reset_containers(CodeHolder* self, ResetPolicy reset_policy) noexcept {
+ // Soft reset won't wipe out the .text section, so set its size to 0 for future reuse.
+ self->_text_section._buffer._size = 0;
+
+ self->_named_labels.reset();
+ self->_relocations.reset();
+ self->_label_entries.reset();
+
+ self->_fixups = nullptr;
+ self->_fixup_data_pool.reset();
+ self->_unresolved_fixup_count = 0;
+
+ self->_sections.reset();
+ self->_sections_by_order.reset();
+
+ self->_address_table_section = nullptr;
+ self->_address_table_entries.reset();
+
+ self->_arena.reset(reset_policy);
+}
+
+// Reset sections and containers.
+static ASMJIT_NOINLINE void CodeHolder_reset_sections_and_containers(CodeHolder* self, ResetPolicy reset_policy) noexcept {
+ CodeHolder_reset_sections(self, reset_policy);
+ CodeHolder_reset_containers(self, reset_policy);
+}
+
+static ASMJIT_INLINE void CodeHolder_on_settings_updated(CodeHolder* self) noexcept {
+ // Notify all attached emitters about a settings update.
+ BaseEmitter* emitter = self->_attached_first;
+ while (emitter) {
+ emitter->on_settings_updated();
+ emitter = emitter->_attached_next;
+ }
+}
+
+// CodeHolder - Construction & Destruction
+// =======================================
+
+CodeHolder::CodeHolder(Span<uint8_t> static_arena_memory) noexcept
+ : _environment(),
+ _cpu_features{},
+ _base_address(Globals::kNoBaseAddress),
+ _logger(nullptr),
+ _error_handler(nullptr),
+ _arena(16u * 1024u, static_arena_memory),
+ _attached_first(nullptr),
+ _attached_last(nullptr),
+ _fixups(nullptr),
+ _unresolved_fixup_count(0),
+ _text_section{},
+ _address_table_section(nullptr) {}
+
+CodeHolder::~CodeHolder() noexcept {
+ if (is_initialized()) {
+ CodeHolder_detach_emitters(this);
+ CodeHolder_reset_sections(this, ResetPolicy::kHard);
+ }
+ else {
+ Section_release_buffer(&_text_section);
+ }
+}
+
+// CodeHolder - Initialization & Reset
+// ===================================
+
+Error CodeHolder::init(const Environment& environment, uint64_t base_address) noexcept {
+ return init(environment, CpuFeatures{}, base_address);
+}
+
+Error CodeHolder::init(const Environment& environment, const CpuFeatures& cpu_features, uint64_t base_address) noexcept {
+ // Cannot initialize if it's already initialized or the environment passed is invalid.
+ if (ASMJIT_UNLIKELY(Support::bool_or(is_initialized(), !environment.is_initialized()))) {
+ Error err = is_initialized() ? Error::kAlreadyInitialized : Error::kInvalidArgument;
+ return make_error(err);
+ }
+
+ // If we are just initializing there should be no emitters attached.
+ ASMJIT_ASSERT(_attached_first == nullptr);
+ ASMJIT_ASSERT(_attached_last == nullptr);
+
+ // Create a default section and insert it to the `_sections` array.
+ Error err = CodeHolder_init_section_storage(this);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ _arena.reset();
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _environment = environment;
+ _cpu_features = cpu_features;
+ _base_address = base_address;
+
+ CodeHolder_add_text_section(this);
+ return Error::kOk;
+}
+
+Error CodeHolder::reinit() noexcept {
+ // Cannot reinitialize if it's not initialized.
+ if (ASMJIT_UNLIKELY(!is_initialized())) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ CodeHolder_reset_sections_and_containers(this, ResetPolicy::kSoft);
+
+ // Create a default section and insert it to the `_sections` array.
+ (void)CodeHolder_init_section_storage(this);
+ CodeHolder_add_text_section(this);
+
+ BaseEmitter* emitter = _attached_first;
+ while (emitter) {
+ emitter->on_reinit(*this);
+ emitter = emitter->_attached_next;
+ }
+
+ return Error::kOk;
+}
+
+void CodeHolder::reset(ResetPolicy reset_policy) noexcept {
+ if (is_initialized()) {
+ CodeHolder_detach_emitters(this);
+ CodeHolder_reset_env_and_attached_logger_and_eh(this);
+ CodeHolder_reset_sections_and_containers(this, reset_policy);
+ }
+}
+
+// CodeHolder - Attach / Detach
+// ============================
+
+Error CodeHolder::attach(BaseEmitter* emitter) noexcept {
+ // Catch a possible misuse of the API.
+ if (ASMJIT_UNLIKELY(!emitter)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ // Invalid emitter, this should not be possible.
+ EmitterType type = emitter->emitter_type();
+ if (ASMJIT_UNLIKELY(type == EmitterType::kNone || uint32_t(type) > uint32_t(EmitterType::kMaxValue))) {
+ return make_error(Error::kInvalidState);
+ }
+
+ uint64_t arch_mask = emitter->_arch_mask;
+ if (ASMJIT_UNLIKELY(!(arch_mask & (uint64_t(1) << uint32_t(arch()))))) {
+ return make_error(Error::kInvalidArch);
+ }
+
+ // This is suspicious, but don't fail if `emitter` is already attached
+ // to this code holder. This is not error, but it's not recommended.
+ if (emitter->_code != nullptr) {
+ if (emitter->_code == this) {
+ return Error::kOk;
+ }
+ return make_error(Error::kInvalidState);
+ }
+
+ // Reserve the space now as we cannot fail after `on_attach()` succeeded.
+ ASMJIT_PROPAGATE(emitter->on_attach(*this));
+
+ // Make sure CodeHolder <-> BaseEmitter are connected.
+ ASMJIT_ASSERT(emitter->_code == this);
+
+ // Add `emitter` to a double linked-list.
+ {
+ BaseEmitter* last = _attached_last;
+
+ emitter->_attached_prev = last;
+ _attached_last = emitter;
+
+ if (last) {
+ last->_attached_next = emitter;
+ }
+ else {
+ _attached_first = emitter;
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error CodeHolder::detach(BaseEmitter* emitter) noexcept {
+ if (ASMJIT_UNLIKELY(!emitter)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ if (ASMJIT_UNLIKELY(emitter->_code != this)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // NOTE: We always detach if we were asked to, if error happens during
+ // `emitter->on_detach()` we just propagate it, but the BaseEmitter will
+ // be detached.
+ Error err = Error::kOk;
+ if (!emitter->is_destroyed()) {
+ err = emitter->on_detach(*this);
+ }
+
+ // Remove `emitter` from a double linked-list.
+ {
+ BaseEmitter* prev = emitter->_attached_prev;
+ BaseEmitter* next = emitter->_attached_next;
+
+ if (prev) { prev->_attached_next = next; } else { _attached_first = next; }
+ if (next) { next->_attached_prev = prev; } else { _attached_last = prev; }
+
+ emitter->_code = nullptr;
+ emitter->_attached_prev = nullptr;
+ emitter->_attached_next = nullptr;
+ }
+
+ return err;
+}
+
+// CodeHolder - Logging
+// ====================
+
+void CodeHolder::set_logger(Logger* logger) noexcept {
+#ifndef ASMJIT_NO_LOGGING
+ _logger = logger;
+ CodeHolder_on_settings_updated(this);
+#else
+ Support::maybe_unused(logger);
+#endif
+}
+
+// CodeHolder - Error Handling
+// ===========================
+
+void CodeHolder::set_error_handler(ErrorHandler* error_handler) noexcept {
+ _error_handler = error_handler;
+ CodeHolder_on_settings_updated(this);
+}
+
+// CodeHolder - Code Buffer
+// ========================
+
+static Error CodeHolder_reserve_internal(CodeHolder* self, CodeBuffer* cb, size_t n) noexcept {
+ uint8_t* old_data = cb->_data;
+ uint8_t* new_data;
+
+ if (old_data && !cb->is_external()) {
+ new_data = static_cast<uint8_t*>(::realloc(old_data, n));
+ }
+ else {
+ new_data = static_cast<uint8_t*>(::malloc(n));
+ }
+
+ if (ASMJIT_UNLIKELY(!new_data)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ cb->_data = new_data;
+ cb->_capacity = n;
+
+ // Update pointers used by assemblers, if attached.
+ BaseEmitter* emitter = self->_attached_first;
+ while (emitter) {
+ if (emitter->is_assembler()) {
+ BaseAssembler* a = static_cast<BaseAssembler*>(emitter);
+ if (&a->_section->_buffer == cb) {
+ size_t offset = a->offset();
+
+ a->_buffer_data = new_data;
+ a->_buffer_end = new_data + n;
+ a->_buffer_ptr = new_data + offset;
+ }
+ }
+ emitter = emitter->_attached_next;
+ }
+
+ return Error::kOk;
+}
+
+Error CodeHolder::grow_buffer(CodeBuffer* cb, size_t n) noexcept {
+ // The size of the section must be valid.
+ size_t size = cb->size();
+ if (ASMJIT_UNLIKELY(n > std::numeric_limits<uintptr_t>::max() - size)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // We can now check if growing the buffer is really necessary. It's unlikely
+ // that this function is called while there is still room for `n` bytes.
+ size_t capacity = cb->capacity();
+ size_t required = cb->size() + n;
+
+ if (ASMJIT_UNLIKELY(required <= capacity)) {
+ return Error::kOk;
+ }
+
+ if (cb->is_fixed()) {
+ return make_error(Error::kTooLarge);
+ }
+
+ size_t kInitialCapacity = 8192u - Globals::kAllocOverhead;
+ if (capacity < kInitialCapacity) {
+ capacity = kInitialCapacity;
+ }
+ else {
+ capacity += Globals::kAllocOverhead;
+ }
+
+ do {
+ size_t old = capacity;
+ size_t capacity_increase = capacity < Globals::kGrowThreshold ? capacity : Globals::kGrowThreshold;
+
+ capacity += capacity_increase;
+
+ // Overflow.
+ if (ASMJIT_UNLIKELY(old > capacity)) {
+ return make_error(Error::kOutOfMemory);
+ }
+ } while (capacity - Globals::kAllocOverhead < required);
+
+ return CodeHolder_reserve_internal(this, cb, capacity - Globals::kAllocOverhead);
+}
+
+Error CodeHolder::reserve_buffer(CodeBuffer* cb, size_t n) noexcept {
+ size_t capacity = cb->capacity();
+
+ if (n <= capacity) {
+ return Error::kOk;
+ }
+
+ if (cb->is_fixed()) {
+ return make_error(Error::kTooLarge);
+ }
+
+ return CodeHolder_reserve_internal(this, cb, n);
+}
+
+// CodeHolder - Sections
+// =====================
+
+Error CodeHolder::new_section(Out<Section*> section_out, const char* name, size_t name_size, SectionFlags flags, uint32_t alignment, int32_t order) noexcept {
+ *section_out = nullptr;
+
+ if (ASMJIT_UNLIKELY(!Support::is_zero_or_power_of_2(alignment))) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ if (name_size == SIZE_MAX) {
+ name_size = strlen(name);
+ }
+
+ if (ASMJIT_UNLIKELY(name_size > Globals::kMaxSectionNameSize)) {
+ return make_error(Error::kInvalidSectionName);
+ }
+
+ uint32_t section_id = _sections._size;
+ if (ASMJIT_UNLIKELY(section_id == Globals::kInvalidId)) {
+ return make_error(Error::kTooManySections);
+ }
+
+ ASMJIT_PROPAGATE(_sections.reserve_additional(_arena));
+ ASMJIT_PROPAGATE(_sections_by_order.reserve_additional(_arena));
+
+ Section* section = _arena.alloc_oneshot<Section>();
+ if (ASMJIT_UNLIKELY(!section)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ if (alignment == 0u) {
+ alignment = 1u;
+ }
+
+ Section_init_data(section, section_id, flags, alignment, order, Globals::kNoSectionOffset);
+ Section_init_buffer(section);
+ memcpy(section->_name.str, name, name_size);
+
+ Section** insert_position = std::lower_bound(_sections_by_order.begin(), _sections_by_order.end(), section, [](const Section* a, const Section* b) {
+ return std::make_tuple(a->order(), a->section_id()) < std::make_tuple(b->order(), b->section_id());
+ });
+
+ _sections.append_unchecked(section);
+ _sections_by_order.insert_unchecked((size_t)(insert_position - _sections_by_order.data()), section);
+
+ *section_out = section;
+ return Error::kOk;
+}
+
+Section* CodeHolder::section_by_name(const char* name, size_t name_size) const noexcept {
+ if (name_size == SIZE_MAX) {
+ name_size = strlen(name);
+ }
+
+ // This could be also put in a hash-table similarly like we do with labels, however it's questionable as
+ // the number of sections should be pretty low in general. Create an issue if this becomes a problem.
+ if (name_size <= Globals::kMaxSectionNameSize) {
+ for (Section* section : _sections) {
+ if (memcmp(section->_name.str, name, name_size) == 0 && section->_name.str[name_size] == '\0') {
+ return section;
+ }
+ }
+ }
+
+ return nullptr;
+}
+
+Section* CodeHolder::ensure_address_table_section() noexcept {
+ if (_address_table_section) {
+ return _address_table_section;
+ }
+
+ new_section(Out(_address_table_section),
+ Section_address_table_name,
+ sizeof(Section_address_table_name) - 1,
+ SectionFlags::kNone,
+ _environment.register_size(),
+ std::numeric_limits<int32_t>::max());
+ return _address_table_section;
+}
+
+Error CodeHolder::add_address_to_address_table(uint64_t address) noexcept {
+ AddressTableEntry* entry = _address_table_entries.get(address);
+ if (entry) {
+ return Error::kOk;
+ }
+
+ Section* section = ensure_address_table_section();
+ if (ASMJIT_UNLIKELY(!section)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ entry = _arena.new_oneshot<AddressTableEntry>(address);
+ if (ASMJIT_UNLIKELY(!entry)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _address_table_entries.insert(entry);
+ section->_virtual_size += _environment.register_size();
+
+ return Error::kOk;
+}
+
+// CodeHolder - Labels & Symbols
+// =============================
+
+//! Only used to lookup a label from `_named_labels`.
+class LabelByName {
+public:
+ const char* _key {};
+ uint32_t _key_size {};
+ uint32_t _hash_code {};
+ uint32_t _parent_id {};
+
+ inline LabelByName(const char* key, size_t key_size, uint32_t hash_code, uint32_t parent_id) noexcept
+ : _key(key),
+ _key_size(uint32_t(key_size)),
+ _hash_code(hash_code),
+ _parent_id(parent_id) {}
+
+ [[nodiscard]]
+ inline uint32_t hash_code() const noexcept { return _hash_code; }
+
+ [[nodiscard]]
+ inline bool matches(const CodeHolder::NamedLabelExtraData* node) const noexcept {
+ return Support::bool_and(node->extra_data._name_size == _key_size,
+ node->extra_data._parent_id == _parent_id) &&
+ ::memcmp(node->extra_data.name(), _key, _key_size) == 0;
+ }
+};
+
+// Returns a hash of `name` and fixes `name_size` if it's `SIZE_MAX`.
+static uint32_t CodeHolder_hash_name_and_get_size(const char* name, size_t& name_size) noexcept {
+ uint32_t hash_code = 0;
+ if (name_size == SIZE_MAX) {
+ size_t i = 0;
+ for (;;) {
+ uint8_t c = uint8_t(name[i]);
+ if (!c) {
+ break;
+ }
+ hash_code = Support::hash_char(hash_code, c);
+ i++;
+ }
+ name_size = i;
+ }
+ else {
+ for (size_t i = 0; i < name_size; i++) {
+ uint8_t c = uint8_t(name[i]);
+ if (ASMJIT_UNLIKELY(!c)) {
+ name_size = i;
+ break;
+ }
+ hash_code = Support::hash_char(hash_code, c);
+ }
+ }
+ return hash_code;
+}
+
+Fixup* CodeHolder::new_fixup(LabelEntry& le, uint32_t section_id, size_t offset, intptr_t rel, const OffsetFormat& format) noexcept {
+ // Cannot be bound if we are creating a link.
+ ASMJIT_ASSERT(!le.is_bound());
+
+ Fixup* link = _fixup_data_pool.alloc(_arena);
+ if (ASMJIT_UNLIKELY(!link)) {
+ return nullptr;
+ }
+
+ link->next = le._get_fixups();
+ link->section_id = section_id;
+ link->label_or_reloc_id = Globals::kInvalidId;
+ link->offset = offset;
+ link->rel = rel;
+ link->format = format;
+
+ le._set_fixups(link);
+ _unresolved_fixup_count++;
+
+ return link;
+}
+
+Error CodeHolder::new_label_id(Out<uint32_t> label_id_out) noexcept {
+ uint32_t label_id = _label_entries._size;
+ Error err = _label_entries.reserve_additional(_arena);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ label_id_out = Globals::kInvalidId;
+ return err;
+ }
+ else {
+ label_id_out = label_id;
+ _label_entries.append_unchecked(LabelEntry{const_cast<LabelEntry::ExtraData*>(&CodeHolder_shared_label_extra_data), uint64_t(0)});
+ return Error::kOk;
+ }
+}
+
+Error CodeHolder::new_named_label_id(Out<uint32_t> label_id_out, const char* name, size_t name_size, LabelType type, uint32_t parent_id) noexcept {
+ uint32_t label_id = _label_entries._size;
+ uint32_t hash_code = CodeHolder_hash_name_and_get_size(name, name_size);
+
+ label_id_out = Globals::kInvalidId;
+ ASMJIT_PROPAGATE(_label_entries.reserve_additional(_arena));
+
+ if (name_size == 0) {
+ if (type != LabelType::kAnonymous) {
+ return make_error(Error::kInvalidLabelName);
+ }
+
+ label_id_out = label_id;
+ _label_entries.append_unchecked(LabelEntry{const_cast<LabelEntry::ExtraData*>(&CodeHolder_shared_label_extra_data), uint64_t(0)});
+ return Error::kOk;
+ }
+
+ if (ASMJIT_UNLIKELY(name_size > Globals::kMaxLabelNameSize)) {
+ return make_error(Error::kLabelNameTooLong);
+ }
+
+ size_t extra_data_size = sizeof(LabelEntry::ExtraData) + name_size + 1u;
+
+ switch (type) {
+ case LabelType::kAnonymous: {
+ // Anonymous labels cannot have a parent (or more specifically, parent is useless here).
+ if (ASMJIT_UNLIKELY(parent_id != Globals::kInvalidId)) {
+ return make_error(Error::kInvalidParentLabel);
+ }
+
+ LabelEntry::ExtraData* extra_data = _arena.alloc_oneshot<LabelEntry::ExtraData>(Arena::aligned_size(extra_data_size));
+ if (ASMJIT_UNLIKELY(!extra_data)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ char* name_ptr = reinterpret_cast<char*>(extra_data) + sizeof(LabelEntry::ExtraData);
+ extra_data->_section_id = Globals::kInvalidId;
+ extra_data->_internal_label_type = type;
+ extra_data->_internal_label_flags = LabelFlags::kHasOwnExtraData | LabelFlags::kHasName;
+ extra_data->_internal_uint16_data = 0;
+ extra_data->_parent_id = Globals::kInvalidId;
+ extra_data->_name_size = uint32_t(name_size);
+ memcpy(name_ptr, name, name_size);
+ name_ptr[name_size] = '\0';
+
+ label_id_out = label_id;
+ _label_entries.append_unchecked(LabelEntry{extra_data, uint64_t(0)});
+ return Error::kOk;
+ }
+
+ case LabelType::kLocal: {
+ if (ASMJIT_UNLIKELY(parent_id >= _label_entries.size())) {
+ return make_error(Error::kInvalidParentLabel);
+ }
+
+ hash_code ^= parent_id;
+ break;
+ }
+
+ case LabelType::kGlobal:
+ case LabelType::kExternal: {
+ if (ASMJIT_UNLIKELY(parent_id != Globals::kInvalidId)) {
+ return make_error(Error::kInvalidParentLabel);
+ }
+ break;
+ }
+
+ default: {
+ return make_error(Error::kInvalidArgument);
+ }
+ }
+
+ extra_data_size += sizeof(ArenaHashNode);
+
+ // Don't allow to insert duplicates. Local labels allow duplicates that have different ids, however, this is
+ // already accomplished by having a different hashes between the same label names having different parent labels.
+ NamedLabelExtraData* named_node = _named_labels.get(LabelByName(name, name_size, hash_code, parent_id));
+ if (ASMJIT_UNLIKELY(named_node)) {
+ return make_error(Error::kLabelAlreadyDefined);
+ }
+
+ named_node = _arena.alloc_oneshot<NamedLabelExtraData>(Arena::aligned_size(extra_data_size));
+ if (ASMJIT_UNLIKELY(!named_node)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ LabelFlags label_flags =
+ (parent_id == Globals::kInvalidId)
+ ? LabelFlags::kHasOwnExtraData | LabelFlags::kHasName
+ : LabelFlags::kHasOwnExtraData | LabelFlags::kHasName | LabelFlags::kHasParent;
+
+ named_node->_hash_next = nullptr;
+ named_node->_hash_code = hash_code;
+ named_node->_custom_data = label_id;
+ named_node->extra_data._section_id = Globals::kInvalidId;
+ named_node->extra_data._internal_label_type = type;
+ named_node->extra_data._internal_label_flags = label_flags;
+ named_node->extra_data._internal_uint16_data = 0;
+ named_node->extra_data._parent_id = parent_id;
+ named_node->extra_data._name_size = uint32_t(name_size);
+
+ char* name_ptr = reinterpret_cast<char*>(&named_node->extra_data) + sizeof(LabelEntry::ExtraData);
+ memcpy(name_ptr, name, name_size);
+ name_ptr[name_size] = '\0';
+
+ label_id_out = label_id;
+ _label_entries.append_unchecked(LabelEntry{&named_node->extra_data, uint64_t(0)});
+ _named_labels.insert(_arena, named_node);
+
+ return Error::kOk;
+}
+
+uint32_t CodeHolder::label_id_by_name(const char* name, size_t name_size, uint32_t parent_id) noexcept {
+ uint32_t hash_code = CodeHolder_hash_name_and_get_size(name, name_size);
+ if (ASMJIT_UNLIKELY(!name_size)) {
+ return 0;
+ }
+
+ if (parent_id != Globals::kInvalidId) {
+ hash_code ^= parent_id;
+ }
+
+ NamedLabelExtraData* named_node = _named_labels.get(LabelByName(name, name_size, hash_code, parent_id));
+ return named_node ? named_node->label_id() : uint32_t(Globals::kInvalidId);
+}
+
+
+ASMJIT_API Error CodeHolder::resolve_cross_section_fixups() noexcept {
+ if (!has_unresolved_fixups()) {
+ return Error::kOk;
+ }
+
+ Error err = Error::kOk;
+ ResolveFixupIterator it(&_fixups);
+
+ while (it.is_valid()) {
+ Fixup* fixup = it.fixup();
+ LabelEntry& le = label_entry_of(fixup->label_or_reloc_id);
+
+ Support::FastUInt8 of{};
+ Section* to_section = _sections[le.section_id()];
+ uint64_t to_offset = Support::add_overflow(to_section->offset(), le.offset(), &of);
+
+ Section* from_section = section_by_id(fixup->section_id);
+ size_t fixup_offset = fixup->offset;
+
+ CodeBuffer& buf = from_section->buffer();
+ ASMJIT_ASSERT(fixup_offset < buf.size());
+
+ // Calculate the offset relative to the start of the virtual base.
+ uint64_t from_offset = Support::add_overflow<uint64_t>(from_section->offset(), fixup_offset, &of);
+ int64_t displacement = int64_t(to_offset - from_offset + uint64_t(int64_t(fixup->rel)));
+
+ if (ASMJIT_UNLIKELY(of)) {
+ err = make_error(Error::kInvalidDisplacement);
+ }
+ else {
+ ASMJIT_ASSERT(size_t(fixup_offset) < buf.size());
+ ASMJIT_ASSERT(buf.size() - size_t(fixup_offset) >= fixup->format.value_size());
+
+ // Overwrite a real displacement in the CodeBuffer.
+ if (CodeWriterUtils::write_offset(buf._data + fixup_offset, displacement, fixup->format)) {
+ it.resolve_and_next(this);
+ continue;
+ }
+ }
+
+ it.next();
+ }
+
+ _unresolved_fixup_count -= it.resolved_count();
+ return err;
+}
+
+ASMJIT_API Error CodeHolder::bind_label(const Label& label, uint32_t to_section_id, uint64_t to_offset) noexcept {
+ uint32_t label_id = label.id();
+
+ if (ASMJIT_UNLIKELY(label_id >= _label_entries.size())) {
+ return make_error(Error::kInvalidLabel);
+ }
+
+ if (ASMJIT_UNLIKELY(to_section_id >= _sections.size())) {
+ return make_error(Error::kInvalidSection);
+ }
+
+ LabelEntry& le = _label_entries[label_id];
+
+ // Label can be bound only once.
+ if (ASMJIT_UNLIKELY(le.is_bound())) {
+ return make_error(Error::kLabelAlreadyBound);
+ }
+
+ Section* section = _sections[to_section_id];
+ CodeBuffer& buf = section->buffer();
+
+ // Bind the label - this either assigns a section to LabelEntry's `_object_data` or `_section_id` in own `ExtraData`.
+ // This is basically how this works - when the ExtraData is shared, we replace it by section as the section header
+ // is compatible with ExtraData header, and when the LabelEntry has its own ExtraData, the section identifier must
+ // be assigned.
+ if (le._has_own_extra_data()) {
+ le._own_extra_data()->_section_id = to_section_id;
+ }
+ else {
+ le._object_data = section;
+ }
+
+ // It must be in this order as _offset_or_fixups as basically a union.
+ Fixup* label_fixups = le._get_fixups();
+ le._offset_or_fixups = to_offset;
+
+ if (!label_fixups) {
+ return Error::kOk;
+ }
+
+ // Fix all fixups of this label we have collected so far if they are within the same
+ // section. We ignore any cross-section fixups as these have to be fixed later.
+ Error err = Error::kOk;
+
+ ResolveFixupIterator it(&label_fixups);
+ ASMJIT_ASSERT(it.is_valid());
+
+ do {
+ Fixup* fixup = it.fixup();
+
+ uint32_t reloc_id = fixup->label_or_reloc_id;
+ uint32_t from_section_id = fixup->section_id;
+ size_t from_offset = fixup->offset;
+
+ if (reloc_id != Globals::kInvalidId) {
+ // Adjust the relocation payload.
+ RelocEntry* re = _relocations[reloc_id];
+ re->_payload += to_offset;
+ re->_target_section_id = to_section_id;
+ }
+ else if (from_section_id != to_section_id) {
+ fixup->label_or_reloc_id = label_id;
+ it.next();
+ continue;
+ }
+ else {
+ ASMJIT_ASSERT(from_offset < buf.size());
+ int64_t displacement = int64_t(to_offset - uint64_t(from_offset) + uint64_t(int64_t(fixup->rel)));
+
+ // Size of the value we are going to patch.
+ ASMJIT_ASSERT(buf.size() - size_t(from_offset) >= fixup->format.region_size());
+
+ // Overwrite a real displacement in the CodeBuffer.
+ if (!CodeWriterUtils::write_offset(buf._data + from_offset, displacement, fixup->format)) {
+ err = make_error(Error::kInvalidDisplacement);
+ fixup->label_or_reloc_id = label_id;
+ it.next();
+ continue;
+ }
+ }
+
+ it.resolve_and_next(this);
+ } while (it.is_valid());
+
+ if (it.unresolved_count()) {
+ *it._prev = _fixups;
+ _fixups = label_fixups;
+ }
+
+ _unresolved_fixup_count -= it.resolved_count();
+ return err;
+}
+
+// CodeHolder - Relocations
+// ========================
+
+Error CodeHolder::new_reloc_entry(Out<RelocEntry*> dst, RelocType reloc_type) noexcept {
+ ASMJIT_PROPAGATE(_relocations.reserve_additional(_arena));
+
+ uint32_t reloc_id = _relocations._size;
+ if (ASMJIT_UNLIKELY(reloc_id == Globals::kInvalidId)) {
+ return make_error(Error::kTooManyRelocations);
+ }
+
+ RelocEntry* re = _arena.alloc_oneshot<RelocEntry>();
+ if (ASMJIT_UNLIKELY(!re)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ re->_id = reloc_id;
+ re->_reloc_type = reloc_type;
+ re->_format = OffsetFormat{};
+ re->_source_section_id = Globals::kInvalidId;
+ re->_target_section_id = Globals::kInvalidId;
+ re->_source_offset = 0;
+ re->_payload = 0;
+ _relocations.append_unchecked(re);
+
+ dst = re;
+ return Error::kOk;
+}
+
+// CodeHolder - Expression Evaluation
+// ==================================
+
+static Error CodeHolder_evaluate_expression(CodeHolder* self, Expression* exp, uint64_t* out) noexcept {
+ uint64_t value[2];
+ for (size_t i = 0; i < 2; i++) {
+ uint64_t v;
+ switch (exp->value_type[i]) {
+ case ExpressionValueType::kNone: {
+ v = 0;
+ break;
+ }
+
+ case ExpressionValueType::kConstant: {
+ v = exp->value[i].constant;
+ break;
+ }
+
+ case ExpressionValueType::kLabel: {
+ uint32_t label_id = exp->value[i].label_id;
+ if (ASMJIT_UNLIKELY(label_id >= self->label_count())) {
+ return make_error(Error::kInvalidLabel);
+ }
+
+ LabelEntry& le = self->_label_entries[label_id];
+ if (!le.is_bound()) {
+ return make_error(Error::kExpressionLabelNotBound);
+ }
+
+ v = self->_sections[le.section_id()]->offset() + le.offset();
+ break;
+ }
+
+ case ExpressionValueType::kExpression: {
+ Expression* nested = exp->value[i].expression;
+ ASMJIT_PROPAGATE(CodeHolder_evaluate_expression(self, nested, &v));
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidState);
+ }
+
+ value[i] = v;
+ }
+
+ uint64_t result;
+ uint64_t& a = value[0];
+ uint64_t& b = value[1];
+
+ switch (exp->op_type) {
+ case ExpressionOpType::kAdd:
+ result = a + b;
+ break;
+
+ case ExpressionOpType::kSub:
+ result = a - b;
+ break;
+
+ case ExpressionOpType::kMul:
+ result = a * b;
+ break;
+
+ case ExpressionOpType::kSll:
+ result = (b > 63) ? uint64_t(0) : uint64_t(a << b);
+ break;
+
+ case ExpressionOpType::kSrl:
+ result = (b > 63) ? uint64_t(0) : uint64_t(a >> b);
+ break;
+
+ case ExpressionOpType::kSra:
+ result = Support::sar(a, Support::min<uint64_t>(b, 63));
+ break;
+
+ default:
+ return make_error(Error::kInvalidState);
+ }
+
+ *out = result;
+ return Error::kOk;
+}
+
+// CodeHolder - Utilities
+// ======================
+
+Error CodeHolder::flatten() noexcept {
+ uint64_t offset = 0;
+ for (Section* section : _sections_by_order) {
+ uint64_t real_size = section->real_size();
+ if (real_size) {
+ uint64_t aligned_offset = Support::align_up(offset, section->alignment());
+ if (ASMJIT_UNLIKELY(aligned_offset < offset)) {
+ return make_error(Error::kTooLarge);
+ }
+
+ Support::FastUInt8 of = 0;
+ offset = Support::add_overflow(aligned_offset, real_size, &of);
+
+ if (ASMJIT_UNLIKELY(of)) {
+ return make_error(Error::kTooLarge);
+ }
+ }
+ }
+
+ // Now we know that we can assign offsets of all sections properly.
+ offset = 0;
+ Section* prev = nullptr;
+ for (Section* section : _sections_by_order) {
+ uint64_t real_size = section->real_size();
+ if (real_size) {
+ offset = Support::align_up(offset, section->alignment());
+ }
+ section->set_offset(offset);
+
+ // Make sure the previous section extends a bit to cover the alignment.
+ if (prev) {
+ prev->_virtual_size = offset - prev->_offset;
+ }
+
+ prev = section;
+ offset += real_size;
+ }
+
+ return Error::kOk;
+}
+
+size_t CodeHolder::code_size() const noexcept {
+ Support::FastUInt8 of = 0;
+ uint64_t offset = 0;
+
+ for (Section* section : _sections_by_order) {
+ uint64_t real_size = section->real_size();
+
+ if (real_size) {
+ uint64_t aligned_offset = Support::align_up(offset, section->alignment());
+ ASMJIT_ASSERT(aligned_offset >= offset);
+ offset = Support::add_overflow(aligned_offset, real_size, &of);
+ }
+ }
+
+ if ((sizeof(uint64_t) > sizeof(size_t) && offset > uint64_t(SIZE_MAX)) || of) {
+ return SIZE_MAX;
+ }
+
+ return size_t(offset);
+}
+
+Error CodeHolder::relocate_to_base(uint64_t base_address, RelocationSummary* summary_out) noexcept {
+ // Make sure `summary_out` pointer is always valid as we want to fill it.
+ RelocationSummary summary_tmp;
+ if (summary_out == nullptr) {
+ summary_out = &summary_tmp;
+ }
+
+ // Fill `summary_out` defaults.
+ summary_out->code_size_reduction = 0u;
+
+ // Base address must be provided.
+ if (ASMJIT_UNLIKELY(base_address == Globals::kNoBaseAddress)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ _base_address = base_address;
+ uint32_t address_size = _environment.register_size();
+
+ Section* address_table_section = _address_table_section;
+ uint32_t address_table_entry_size = 0;
+ uint8_t* address_table_entry_data = nullptr;
+
+ if (address_table_section) {
+ ASMJIT_PROPAGATE(reserve_buffer(&address_table_section->_buffer, size_t(address_table_section->virtual_size())));
+ address_table_entry_data = address_table_section->_buffer.data();
+ }
+
+ // Relocate all recorded locations.
+ for (const RelocEntry* re : _relocations) {
+ // Possibly deleted or optimized-out entry.
+ if (re->reloc_type() == RelocType::kNone) {
+ continue;
+ }
+
+ Section* source_section = section_by_id(re->source_section_id());
+ Section* target_section = nullptr;
+
+ if (re->target_section_id() != Globals::kInvalidId) {
+ target_section = section_by_id(re->target_section_id());
+ }
+
+ uint64_t value = re->payload();
+ uint64_t section_offset = source_section->offset();
+ uint64_t source_offset = re->source_offset();
+
+ // Make sure that the `RelocEntry` doesn't go out of bounds.
+ size_t region_size = re->format().region_size();
+ if (ASMJIT_UNLIKELY(re->source_offset() >= source_section->buffer_size() ||
+ source_section->buffer_size() - size_t(re->source_offset()) < region_size)) {
+ return make_error(Error::kInvalidRelocEntry);
+ }
+
+ uint8_t* buffer = source_section->data();
+
+ switch (re->reloc_type()) {
+ case RelocType::kExpression: {
+ Expression* expression = (Expression*)(uintptr_t(value));
+ ASMJIT_PROPAGATE(CodeHolder_evaluate_expression(this, expression, &value));
+ break;
+ }
+
+ case RelocType::kAbsToAbs: {
+ break;
+ }
+
+ case RelocType::kRelToAbs: {
+ // Value is currently a relative offset from the start of its section.
+ // We have to convert it to an absolute offset (including base address).
+ if (ASMJIT_UNLIKELY(!target_section)) {
+ return make_error(Error::kInvalidRelocEntry);
+ }
+
+ //value += base_address + section_offset + source_offset + region_size;
+ value += base_address + target_section->offset();
+ break;
+ }
+
+ case RelocType::kAbsToRel: {
+ value -= base_address + section_offset + source_offset + region_size;
+
+ // Sign extend as we are not interested in the high 32-bit word in a 32-bit address space.
+ if (address_size <= 4) {
+ value = uint64_t(int64_t(int32_t(value & 0xFFFFFFFFu)));
+ }
+ else if (!Support::is_int_n<32>(int64_t(value))) {
+ return make_error(Error::kRelocOffsetOutOfRange);
+ }
+
+ break;
+ }
+
+ case RelocType::kX64AddressEntry: {
+ size_t value_offset = size_t(re->source_offset()) + re->format().value_offset();
+ if (re->format().value_size() != 4 || value_offset < 2) {
+ return make_error(Error::kInvalidRelocEntry);
+ }
+
+ // First try whether a relative 32-bit displacement would work.
+ value -= base_address + section_offset + source_offset + region_size;
+ if (!Support::is_int_n<32>(int64_t(value))) {
+ // Relative 32-bit displacement is not possible, use '.addrtab' section.
+ AddressTableEntry* at_entry = _address_table_entries.get(re->payload());
+ if (ASMJIT_UNLIKELY(!at_entry)) {
+ return make_error(Error::kInvalidRelocEntry);
+ }
+
+ // Cannot be null as we have just matched the `AddressTableEntry`.
+ ASMJIT_ASSERT(address_table_section != nullptr);
+
+ if (!at_entry->has_assigned_slot()) {
+ at_entry->_slot = address_table_entry_size++;
+ }
+
+ size_t at_entry_index = size_t(at_entry->slot()) * address_size;
+ uint64_t addr_src = section_offset + source_offset + region_size;
+ uint64_t addr_dst = address_table_section->offset() + uint64_t(at_entry_index);
+
+ value = addr_dst - addr_src;
+ if (!Support::is_int_n<32>(int64_t(value))) {
+ return make_error(Error::kRelocOffsetOutOfRange);
+ }
+
+ // Bytes that replace [REX, OPCODE] bytes.
+ uint32_t byte0 = 0xFF;
+ uint32_t byte1 = buffer[value_offset - 1];
+
+ if (byte1 == 0xE8) {
+ // Patch CALL/MOD byte to FF /2 (-> 0x15).
+ byte1 = x86_encode_mod(0, 2, 5);
+ }
+ else if (byte1 == 0xE9) {
+ // Patch JMP/MOD byte to FF /4 (-> 0x25).
+ byte1 = x86_encode_mod(0, 4, 5);
+ }
+ else {
+ return make_error(Error::kInvalidRelocEntry);
+ }
+
+ // Patch `jmp/call` instruction.
+ buffer[value_offset - 2] = uint8_t(byte0);
+ buffer[value_offset - 1] = uint8_t(byte1);
+
+ Support::storeu_u64_le(address_table_entry_data + at_entry_index, re->payload());
+ }
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidRelocEntry);
+ }
+
+ if (!CodeWriterUtils::write_offset(buffer + re->source_offset(), int64_t(value), re->format())) {
+ return make_error(Error::kInvalidRelocEntry);
+ }
+ }
+
+ // Fixup the virtual size of the address table if it's the last section.
+ if (_sections_by_order.last() == address_table_section) {
+ ASMJIT_ASSERT(address_table_section != nullptr);
+
+ size_t reserved_size = size_t(address_table_section->_virtual_size);
+ size_t address_table_size = address_table_entry_size * address_size;
+
+ address_table_section->_buffer._size = address_table_size;
+ address_table_section->_virtual_size = address_table_size;
+
+ ASMJIT_ASSERT(reserved_size >= address_table_size);
+ size_t code_size_reduction = reserved_size - address_table_size;
+
+ summary_out->code_size_reduction = code_size_reduction;
+ }
+
+ return Error::kOk;
+}
+
+Error CodeHolder::copy_section_data(void* dst, size_t dst_size, uint32_t section_id, CopySectionFlags copy_flags) noexcept {
+ if (ASMJIT_UNLIKELY(!is_section_valid(section_id))) {
+ return make_error(Error::kInvalidSection);
+ }
+
+ Section* section = section_by_id(section_id);
+ size_t buffer_size = section->buffer_size();
+
+ if (ASMJIT_UNLIKELY(dst_size < buffer_size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ memcpy(dst, section->data(), buffer_size);
+
+ if (buffer_size < dst_size && Support::test(copy_flags, CopySectionFlags::kPadSectionBuffer)) {
+ size_t padding_size = dst_size - buffer_size;
+ memset(static_cast<uint8_t*>(dst) + buffer_size, 0, padding_size);
+ }
+
+ return Error::kOk;
+}
+
+Error CodeHolder::copy_flattened_data(void* dst, size_t dst_size, CopySectionFlags copy_flags) noexcept {
+ size_t end = 0;
+ for (Section* section : _sections_by_order) {
+ if (section->offset() > dst_size) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ size_t buffer_size = section->buffer_size();
+ size_t offset = size_t(section->offset());
+
+ if (ASMJIT_UNLIKELY(dst_size - offset < buffer_size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ uint8_t* dst_target = static_cast<uint8_t*>(dst) + offset;
+ size_t padding_size = 0;
+ memcpy(dst_target, section->data(), buffer_size);
+
+ if (Support::test(copy_flags, CopySectionFlags::kPadSectionBuffer) && buffer_size < section->virtual_size()) {
+ padding_size = Support::min<size_t>(dst_size - offset, size_t(section->virtual_size())) - buffer_size;
+ memset(dst_target + buffer_size, 0, padding_size);
+ }
+
+ end = Support::max(end, offset + buffer_size + padding_size);
+ }
+
+ if (end < dst_size && Support::test(copy_flags, CopySectionFlags::kPadTargetBuffer)) {
+ memset(static_cast<uint8_t*>(dst) + end, 0, dst_size - end);
+ }
+
+ return Error::kOk;
+}
+
+// CodeHolder - Tests
+// ==================
+
+#if defined(ASMJIT_TEST)
+UNIT(code_holder) {
+ CodeHolder code;
+
+ INFO("Verifying CodeHolder::init()");
+ Environment env;
+ env.init(Arch::kX86);
+
+ code.init(env);
+ EXPECT_EQ(code.arch(), Arch::kX86);
+
+ INFO("Verifying named labels");
+ uint32_t dummy_id;
+ uint32_t label_id1;
+ uint32_t label_id2;
+
+ // Anonymous labels can have no-name (this is basically like calling `code.new_label_id()`).
+ EXPECT_EQ(code.new_named_label_id(Out(dummy_id), "", SIZE_MAX, LabelType::kAnonymous), Error::kOk);
+
+ // Global labels must have a name - not providing one is an error.
+ EXPECT_EQ(code.new_named_label_id(Out(dummy_id), "", SIZE_MAX, LabelType::kGlobal), Error::kInvalidLabelName);
+
+ // A name of a global label cannot repeat.
+ EXPECT_EQ(code.new_named_label_id(Out(label_id1), "NamedLabel1", SIZE_MAX, LabelType::kGlobal), Error::kOk);
+ EXPECT_EQ(code.new_named_label_id(Out(dummy_id), "NamedLabel1", SIZE_MAX, LabelType::kGlobal), Error::kLabelAlreadyDefined);
+ EXPECT_TRUE(code.is_label_valid(label_id1));
+ EXPECT_EQ(code.label_entry_of(label_id1).name_size(), 11u);
+ EXPECT_EQ(strcmp(code.label_entry_of(label_id1).name(), "NamedLabel1"), 0);
+ EXPECT_EQ(code.label_id_by_name("NamedLabel1"), label_id1);
+
+ EXPECT_EQ(code.new_named_label_id(Out(label_id2), "NamedLabel2", SIZE_MAX, LabelType::kGlobal), Error::kOk);
+ EXPECT_EQ(code.new_named_label_id(Out(dummy_id), "NamedLabel2", SIZE_MAX, LabelType::kGlobal), Error::kLabelAlreadyDefined);
+ EXPECT_TRUE(code.is_label_valid(label_id2));
+ EXPECT_EQ(code.label_entry_of(label_id2).name_size(), 11u);
+ EXPECT_EQ(strcmp(code.label_entry_of(label_id2).name(), "NamedLabel2"), 0);
+ EXPECT_EQ(code.label_id_by_name("NamedLabel2"), label_id2);
+
+ INFO("Verifying .text properties");
+ Section* section_text = code.text_section();
+ EXPECT_TRUE(section_text->has_offset());
+
+ INFO("Verifying section ordering");
+ Section* section_a;
+ EXPECT_EQ(code.new_section(Out(section_a), "high-priority", SIZE_MAX, SectionFlags::kNone, 1, -1), Error::kOk);
+ EXPECT_EQ(code.sections()[0], section_text);
+ EXPECT_EQ(code.sections()[1], section_a);
+ EXPECT_EQ(code.sections_by_order()[0], section_text);
+ EXPECT_EQ(code.sections_by_order()[1], section_a);
+ EXPECT_FALSE(section_a->has_offset());
+
+ Section* section_b;
+ EXPECT_EQ(code.new_section(Out(section_b), "higher-priority", SIZE_MAX, SectionFlags::kNone, 1, -2), Error::kOk);
+ EXPECT_EQ(code.sections()[0], section_text);
+ EXPECT_EQ(code.sections()[1], section_a);
+ EXPECT_EQ(code.sections()[2], section_b);
+ EXPECT_EQ(code.sections_by_order()[0], section_text);
+ EXPECT_EQ(code.sections_by_order()[1], section_b);
+ EXPECT_EQ(code.sections_by_order()[2], section_a);
+ EXPECT_FALSE(section_b->has_offset());
+
+ Section* section_c;
+ EXPECT_EQ(code.new_section(Out(section_c), "low-priority", SIZE_MAX, SectionFlags::kNone, 1, 2), Error::kOk);
+ EXPECT_EQ(code.sections()[0], section_text);
+ EXPECT_EQ(code.sections()[1], section_a);
+ EXPECT_EQ(code.sections()[2], section_b);
+ EXPECT_EQ(code.sections()[3], section_c);
+ EXPECT_EQ(code.sections_by_order()[0], section_text);
+ EXPECT_EQ(code.sections_by_order()[1], section_b);
+ EXPECT_EQ(code.sections_by_order()[2], section_a);
+ EXPECT_EQ(code.sections_by_order()[3], section_c);
+ EXPECT_FALSE(section_c->has_offset());
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/codeholder.h b/3rdparty/asmjit/asmjit/core/codeholder.h
new file mode 100644
index 00000000000..f8dcfb7b52a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/codeholder.h
@@ -0,0 +1,1318 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_CODEHOLDER_H_INCLUDED
+#define ASMJIT_CORE_CODEHOLDER_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/codebuffer.h>
+#include <asmjit/core/errorhandler.h>
+#include <asmjit/core/fixup.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/target.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenahash.h>
+#include <asmjit/support/arenapool.h>
+#include <asmjit/support/arenastring.h>
+#include <asmjit/support/arenatree.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/span.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+class BaseEmitter;
+class CodeHolder;
+class LabelEntry;
+class Logger;
+
+//! Operator type that can be used within an \ref Expression.
+enum class ExpressionOpType : uint8_t {
+ //! Addition.
+ kAdd = 0,
+ //! Subtraction.
+ kSub = 1,
+ //! Multiplication
+ kMul = 2,
+ //! Logical left shift.
+ kSll = 3,
+ //! Logical right shift.
+ kSrl = 4,
+ //! Arithmetic right shift.
+ kSra = 5
+};
+
+//! Value type that can be used within an \ref Expression.
+enum class ExpressionValueType : uint8_t {
+ //! No value or invalid.
+ kNone = 0,
+ //! Value is 64-bit unsigned integer (constant).
+ kConstant = 1,
+ //! Value is \ref LabelEntry, which references a \ref Label.
+ kLabel = 2,
+ //! Value is \ref Expression
+ kExpression = 3
+};
+
+//! Expression node that can reference constants, labels, and another expressions.
+struct Expression {
+ //! Expression value.
+ union Value {
+ //! Constant.
+ uint64_t constant;
+ //! Pointer to another expression.
+ Expression* expression;
+ //! Label identifier
+ uint32_t label_id;
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Operation type.
+ ExpressionOpType op_type;
+ //! Value types of \ref value.
+ ExpressionValueType value_type[2];
+ //! Reserved for future use, should be initialized to zero.
+ uint8_t reserved[5];
+ //! Expression left and right values.
+ Value value[2];
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Resets the whole expression.
+ //!
+ //! Changes both values to \ref ExpressionValueType::kNone.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Expression{}; }
+
+ //! Sets the value type at `index` to \ref ExpressionValueType::kConstant and its content to `constant`.
+ ASMJIT_INLINE_NODEBUG void set_value_as_constant(size_t index, uint64_t constant) noexcept {
+ value_type[index] = ExpressionValueType::kConstant;
+ value[index].constant = constant;
+ }
+
+ //! Sets the value type at `index` to \ref ExpressionValueType::kLabel and its content to `label_entry`.
+ ASMJIT_INLINE_NODEBUG void set_value_as_label_id(size_t index, uint32_t label_id) noexcept {
+ value_type[index] = ExpressionValueType::kLabel;
+ value[index].label_id = label_id;
+ }
+
+ //! Sets the value type at `index` to \ref ExpressionValueType::kExpression and its content to `expression`.
+ ASMJIT_INLINE_NODEBUG void set_value_as_expression(size_t index, Expression* expression) noexcept {
+ value_type[index] = ExpressionValueType::kExpression;
+ value[index].expression = expression;
+ }
+
+ //! \}
+};
+
+//! Relocation type.
+enum class RelocType : uint32_t {
+ //! None/deleted (no relocation).
+ kNone = 0,
+ //! Expression evaluation, `_payload` is pointer to `Expression`.
+ kExpression = 1,
+ //! Relative relocation from one section to another.
+ kSectionRelative = 2,
+ //! Relocate absolute to absolute.
+ kAbsToAbs = 3,
+ //! Relocate relative to absolute.
+ kRelToAbs = 4,
+ //! Relocate absolute to relative.
+ kAbsToRel = 5,
+ //! Relocate absolute to relative or use trampoline.
+ kX64AddressEntry = 6
+};
+
+//! Type of the \ref Label.
+enum class LabelType : uint8_t {
+ //! Anonymous label that can optionally have a name, which is only used for debugging purposes.
+ kAnonymous = 0u,
+ //! Local label (always has parent_id).
+ kLocal = 1u,
+ //! Global label (never has parent_id).
+ kGlobal = 2u,
+ //! External label (references an external symbol).
+ kExternal = 3u,
+
+ //! Maximum value of `LabelType`.
+ kMaxValue = kExternal
+};
+
+//! Label flags describe some details about labels used by \ref LabelEntry, mostly for AsmJit's own use.
+enum class LabelFlags : uint8_t {
+ //! No flags.
+ kNone = 0x00u,
+ //! Label has associated extra data with it that it owns.
+ kHasOwnExtraData = 0x01u,
+ //! Label has a name.
+ kHasName = 0x02u,
+ //! Label has a parent (only a local label can have a parent).
+ kHasParent = 0x04u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(LabelFlags)
+
+//! Section flags, used by \ref Section.
+enum class SectionFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+ //! Executable (.text sections).
+ kExecutable = 0x0001u,
+ //! Read-only (.text and .data sections).
+ kReadOnly = 0x0002u,
+ //! Zero initialized by the loader (BSS).
+ kZeroInitialized = 0x0004u,
+ //! Info / comment flag.
+ kComment = 0x0008u,
+ //! Section is built in and created by default (.text section).
+ kBuiltIn = 0x4000u,
+ //! Section created implicitly, can be deleted by \ref Target.
+ kImplicit = 0x8000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(SectionFlags)
+
+//! Flags that can be used with \ref CodeHolder::copy_section_data() and \ref CodeHolder::copy_flattened_data().
+enum class CopySectionFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! If virtual size of a section is greater than the size of its \ref CodeBuffer then all bytes between the buffer
+ //! size and virtual size will be zeroed. If this option is not set then those bytes would be left as is, which
+ //! means that if the user didn't initialize them they would have a previous content, which may be unwanted.
+ kPadSectionBuffer = 0x00000001u,
+
+ //! Clears the target buffer if the flattened data is less than the destination size. This option works
+ //! only with \ref CodeHolder::copy_flattened_data() as it processes multiple sections. It is ignored by
+ //! \ref CodeHolder::copy_section_data().
+ kPadTargetBuffer = 0x00000002u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(CopySectionFlags)
+
+//! Base class for both \ref Section and \ref LabelEntry::ExtraData.
+class SectionOrLabelEntryExtraHeader {
+public:
+ //! \name Members
+ //! \{
+
+ //! Section id - describes either a section where a \ref Label is bound or it's a real section id of \ref Section.
+ uint32_t _section_id;
+
+ //! Internal label type is only used by \ref LabelEntry::ExtraData. \ref Section always leaves this field zero,
+ //! which describes an anonymous label. Anonymous labels are default and always used when there is no
+ //! \ref LabelEntry::ExtraData
+ LabelType _internal_label_type;
+
+ //! Internal label flags, used by \ref LabelEntry::ExtraData. \ref Section doesn't use these flags and sets them
+ //! to zero.
+ LabelFlags _internal_label_flags;
+
+ //! Internal data used freely by \ref Section and \ref LabelEntry::ExtraData.
+ uint16_t _internal_uint16_data;
+
+ //! \}
+};
+
+//! Section entry.
+class Section : public SectionOrLabelEntryExtraHeader {
+public:
+ //! \name Members
+ //! \{
+
+ //! Section alignment requirements (0 if no requirements).
+ uint32_t _alignment;
+ //! Order (lower value means higher priority).
+ int32_t _order;
+ //! Offset of this section from base-address.
+ uint64_t _offset;
+ //! Virtual size of the section (zero initialized sections).
+ uint64_t _virtual_size;
+ //! Section name (max 35 characters, PE allows max 8).
+ FixedString<Globals::kMaxSectionNameSize + 1> _name;
+ //! Code or data buffer.
+ CodeBuffer _buffer;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the section id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t section_id() const noexcept { return _section_id; }
+
+ //! Returns the section name, as a null terminated string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.str; }
+
+ //! Returns the section data.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* data() noexcept { return _buffer.data(); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const uint8_t* data() const noexcept { return _buffer.data(); }
+
+ //! Returns the section flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SectionFlags flags() const noexcept { return SectionFlags(_internal_uint16_data); }
+
+ //! Tests whether the section has the given `flag`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(SectionFlags flag) const noexcept { return Support::test(_internal_uint16_data, uint32_t(flag)); }
+
+ //! Assigns `flags` to the section (replaces all existing flags).
+ ASMJIT_INLINE_NODEBUG void assign_flags(SectionFlags flags) noexcept { _internal_uint16_data = uint16_t(flags); }
+
+ //! Adds `flags` to the section flags.
+ ASMJIT_INLINE_NODEBUG void add_flags(SectionFlags flags) noexcept { _internal_uint16_data = uint16_t(_internal_uint16_data | uint32_t(flags)); }
+
+ //! Removes `flags` from the section flags.
+ ASMJIT_INLINE_NODEBUG void clear_flags(SectionFlags flags) noexcept { _internal_uint16_data = uint16_t(_internal_uint16_data | ~uint32_t(flags)); }
+
+ //! Returns the minimum section alignment
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
+
+ //! Sets the minimum section alignment
+ ASMJIT_INLINE_NODEBUG void set_alignment(uint32_t alignment) noexcept { _alignment = alignment; }
+
+ //! Returns the section order, which has a higher priority than section id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG int32_t order() const noexcept { return _order; }
+
+ //! Returns the section offset, relative to base.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t offset() const noexcept { return _offset; }
+
+ //! Set the section offset.
+ //!
+ //! \note If the section's offset hasn't been assigned, the returned value would be \ref Globals::kNoSectionOffset.
+ ASMJIT_INLINE_NODEBUG void set_offset(uint64_t offset) noexcept { _offset = offset; }
+
+ //! Returns whether the section's offset has been already assigned.
+ //!
+ //! This is true for the first built-in .text section and for all sections that have been flattened.
+ ASMJIT_INLINE_NODEBUG bool has_offset() const noexcept { return _offset != Globals::kNoSectionOffset; }
+
+ //! Returns the virtual size of the section.
+ //!
+ //! Virtual size is initially zero and is never changed by AsmJit. It's normal if virtual size is smaller than
+ //! size returned by `buffer_size()` as the buffer stores real data emitted by assemblers or appended by users.
+ //!
+ //! Use `real_size()` to get the real and final size of this section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t virtual_size() const noexcept { return _virtual_size; }
+
+ //! Sets the virtual size of the section.
+ ASMJIT_INLINE_NODEBUG void set_virtual_size(uint64_t virtual_size) noexcept { _virtual_size = virtual_size; }
+
+ //! Returns the buffer size of the section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t buffer_size() const noexcept { return _buffer.size(); }
+
+ //! Returns the real size of the section calculated from virtual and buffer sizes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t real_size() const noexcept { return Support::max<uint64_t>(virtual_size(), buffer_size()); }
+
+ //! Returns the `CodeBuffer` used by this section.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CodeBuffer& buffer() noexcept { return _buffer; }
+
+ //! Returns the `CodeBuffer` used by this section (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const CodeBuffer& buffer() const noexcept { return _buffer; }
+
+ //! \}
+};
+
+//! Entry in an address table.
+class AddressTableEntry : public ArenaTreeNodeT<AddressTableEntry> {
+public:
+ ASMJIT_NONCOPYABLE(AddressTableEntry)
+
+ //! \name Members
+ //! \{
+
+ //! Address.
+ uint64_t _address;
+ //! Slot.
+ uint32_t _slot;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG explicit AddressTableEntry(uint64_t address) noexcept
+ : _address(address),
+ _slot(0xFFFFFFFFu) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t address() const noexcept { return _address; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t slot() const noexcept { return _slot; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_assigned_slot() const noexcept { return _slot != 0xFFFFFFFFu; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator<(const AddressTableEntry& other) const noexcept { return _address < other._address; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator>(const AddressTableEntry& other) const noexcept { return _address > other._address; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator<(uint64_t query_address) const noexcept { return _address < query_address; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator>(uint64_t query_address) const noexcept { return _address > query_address; }
+
+ //! \}
+};
+
+//! Relocation entry.
+struct RelocEntry {
+ //! \name Members
+ //! \{
+
+ //! Relocation id.
+ uint32_t _id;
+ //! Type of the relocation.
+ RelocType _reloc_type;
+ //! Format of the relocated value.
+ OffsetFormat _format;
+ //! Source section id.
+ uint32_t _source_section_id;
+ //! Target section id.
+ uint32_t _target_section_id;
+ //! Source offset (relative to start of the section).
+ uint64_t _source_offset;
+ //! Payload (target offset, target address, expression, etc).
+ uint64_t _payload;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RelocType reloc_type() const noexcept { return _reloc_type; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const OffsetFormat& format() const noexcept { return _format; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t source_section_id() const noexcept { return _source_section_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t target_section_id() const noexcept { return _target_section_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t source_offset() const noexcept { return _source_offset; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t payload() const noexcept { return _payload; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Expression* payload_as_expression() const noexcept {
+ return reinterpret_cast<Expression*>(uintptr_t(_payload));
+ }
+
+ //! \}
+};
+
+//! Label entry provides data stored by \ref CodeHolder for each \ref Label.
+//!
+//! Label entry is used mostly internall by AsmJit, but it's possibly to use it to query various information about
+//! a label. For example to get its type, flags, name, and fixups (if the label is not bound) or offset (if the label
+//! is bound).
+//!
+//! To make the entry small, it's currently split into two data structures - \ref LabelEntry, which is stored in an
+//! array as a value, and \ref LabelEntry::ExtraData, which can be pointed to via \ref LabelEntry::_object_data. Extra
+//! data of unnamed anonymous labels is shared (and immutable), thus all unnamed anonymous labels would only use
+//! \ref LabelEntry (16 bytes per label).
+class LabelEntry {
+public:
+ //! Contains extra data that is only created when the label is not anonymous or has a name.
+ struct ExtraData : public SectionOrLabelEntryExtraHeader {
+ //! Label parent id or zero.
+ uint32_t _parent_id;
+ //! Label name length.
+ uint32_t _name_size;
+
+ //! Returns a name associated with this extra data - a valid pointer is only returned when the label has a name, which
+ //! is marked by \ref LabelFlags::kHasName flag.
+ ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return Support::offset_ptr<char>(this, sizeof(ExtraData)); }
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Either references a \ref Section where the label is bound or \ref ExtraData.
+ SectionOrLabelEntryExtraHeader* _object_data;
+
+ //! Label entry payload.
+ //!
+ //! When a Label is bound, `_offset_or_fixups` is the relative offset from the start of the section where
+ //! the \ref Label has been bound, otherwise `_offset_or_fixups` is a pointer to the first \ref Fixup.
+ uint64_t _offset_or_fixups;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the type of the label.
+ //!
+ //! The type of the label depends on how it was created. Most JIT code uses unnamed anonymous labels created by
+ //! emitters, for example \ref BaseEmitter::new_label() returns a \ref Label instance having id that was created
+ //! by \ref CodeHolder::new_label_id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG LabelType label_type() const noexcept { return _object_data->_internal_label_type; }
+
+ //! Returns label flags.
+ //!
+ //! \note Label flags are mostly for internal use, there is probably no reason to use them in user code.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG LabelFlags label_flags() const noexcept { return _object_data->_internal_label_flags; }
+
+ //! Tests whether the label has the given `flag` set.
+ //!
+ //! \note Using other getters instead is advised, for example using \ref has_name() and \ref has_parent() is better
+ //! (and shorter) than checking label flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_label_flag(LabelFlags flag) const noexcept { return Support::test(_object_data->_internal_label_flags, flag); }
+
+ //! Tests whether the LabelEntry has own extra data (see \ref LabelEntry::ExtraData).
+ //!
+ //! \note This should only be used by AsmJit for internal purposes. Own extra data means that the LabelEntry has
+ //! a mutable extra data separately allocated. This information should not be necessary to users as LabelEntry
+ //! getters should encapsulate label introspection.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool _has_own_extra_data() const noexcept { return has_label_flag(LabelFlags::kHasOwnExtraData); }
+
+ //! Tests whether the Label represented by this LabelEntry has a name.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_name() const noexcept { return has_label_flag(LabelFlags::kHasName); }
+
+ //! Tests whether the Label represented by this LabelEntry has a parent label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_parent() const noexcept { return has_label_flag(LabelFlags::kHasParent); }
+
+ //! Tests whether the label represented by this LabelEntry is bound.
+ //!
+ //! Bound label means that it has an associated \ref Section and a position in such section. Labels are bound by
+ //! calling \ref BaseEmitter::bind() method with \ref Label operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_bound() const noexcept { return _object_data->_section_id != Globals::kInvalidId; }
+
+ //! Tests whether the label is bound to a the given `section`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_bound_to(const Section* section) const noexcept { return _object_data->_section_id == section->section_id(); }
+
+ //! Tests whether the label is bound to a the given `section_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_bound_to(uint32_t section_id) const noexcept { return _object_data->_section_id == section_id; }
+
+ //! Returns the section where the label was bound.
+ //!
+ //! If the label was not yet bound the return value is `nullptr`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t section_id() const noexcept { return _object_data->_section_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE ExtraData* _own_extra_data() const noexcept {
+ ASMJIT_ASSERT(_has_own_extra_data());
+ return static_cast<ExtraData*>(_object_data);
+ }
+
+ //! Returns label's parent id or \ref Globals::kInvalidId if the label has no parent.
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t parent_id() const noexcept {
+ return _has_own_extra_data() ? _own_extra_data()->_parent_id : Globals::kInvalidId;
+ }
+
+ //! Returns the label's name.
+ //!
+ //! \note Local labels will return their local name without their parent part, for example ".L1".
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* name() const noexcept {
+ return has_name() ? _own_extra_data()->name() : nullptr;
+ }
+
+ //! Returns size of label's name.
+ //!
+ //! \note Label name is always null terminated, so you can use `strlen()` to get it, however, it's also cached in
+ //! `LabelEntry` itself, so if you want to know the size the fastest way is to call `LabelEntry::name_size()`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t name_size() const noexcept {
+ return has_name() ? _own_extra_data()->_name_size : uint32_t(0);
+ }
+
+ //! Returns unresolved fixups associated with this label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_fixups() const noexcept {
+ return Support::bool_and(!is_bound(), _offset_or_fixups != 0u);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Fixup* _get_fixups() const noexcept { return reinterpret_cast<Fixup*>(uintptr_t(_offset_or_fixups)); }
+
+ ASMJIT_INLINE_NODEBUG void _set_fixups(Fixup* first) noexcept { _offset_or_fixups = reinterpret_cast<uintptr_t>(first); }
+
+ //! Returns unresolved fixups associated with this label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Fixup* unresolved_fixups() const noexcept { return !is_bound() ? _get_fixups() : nullptr; }
+
+ //! Returns the label offset (can only be used after the label is bound).
+ //!
+ //! \note This would trigger an assertion failure in debug builds when called on an unbound label. When accessing
+ //! offsets, always check whether the label is bound. Unbound labels don't have offsets.
+ [[nodiscard]]
+ ASMJIT_INLINE uint64_t offset() const noexcept {
+ ASMJIT_ASSERT(is_bound());
+ return _offset_or_fixups;
+ }
+
+ //! \}
+};
+
+//! Holds assembled code and data (including sections, labels, and relocation information).
+//!
+//! CodeHolder connects emitters with their targets. It provides them interface that can be used to query information
+//! about the target environment (architecture, etc...) and API to create labels, sections, relocations, and to write
+//! data to a \ref CodeBuffer, which is always part of \ref Section. More than one emitter can be attached to a single
+//! CodeHolder instance at a time, which is used in practice
+//!
+//! CodeHolder provides interface for all emitter types. Assemblers use CodeHolder to write into \ref CodeBuffer, and
+//! higher level emitters like Builder and Compiler use CodeHolder to manage labels and sections so higher level code
+//! can be serialized to Assembler by \ref BaseEmitter::finalize() and \ref BaseBuilder::serialize_to().
+//!
+//! In order to use CodeHolder, it must be first initialized by \ref init(). After the CodeHolder has been successfully
+//! initialized it can be used to hold assembled code, sections, labels, relocations, and to attach / detach code
+//! emitters. After the end of code generation it can be used to query physical locations of labels and to relocate
+//! the assembled code into the right address. Please not that calling \ref init() twice doesn't work and would return
+//! an error - to reuse CodeHolder it has to be first \ref reset() or reinitialized by calling \ref reinit().
+//!
+//! Multiple Functions
+//! ------------------
+//!
+//! CodeHolder can be used to hold a single function or multiple functions - when it's holding multiple functions it's
+//! considered like a module (or library, or something that provides more than just a single function). When a code is
+//! relocated and moved into executable memory, you typically get a single pointer back. When CodeHolder holds a single
+//! function, it's the pointer to such function. However, when CodeHolder holds multiple functions, that pointer is
+//! basically start of the code, which is usually the first function.
+//!
+//! In order to get a pointer to more functions, it's necessary to use \ref Label for each function and then to get the
+//! offset to each such function via \ref CodeHolder::label_offset_from_base() - which returns an offset, which is relative
+//! to the start of the assembled code. When using higher level emitters such as \ref asmjit_compiler labels are created
+//! automatically - \ref FuncNode inherits from \ref LabelNode, so a function is a label at the same time.
+//!
+//! To query and apply an offset, consider the following code, which uses \ref x86::Compiler to create two functions:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//! #include <string.h>
+//!
+//! int main(int argc, char* argv[]) {
+//! using namespace asmjit;
+//!
+//! JitRuntime rt;
+//! CodeHolder code;
+//! code.init(rt.environment());
+//!
+//! x86::Compiler cc(&code);
+//!
+//! // Generate first function.
+//! FuncNode* func1_node = cc.add_func(FuncSignature::build<uint32_t>());
+//! Label func1_label = func1_node->label();
+//!
+//! {
+//! x86::Gp r = cc.new_gp32("r0");
+//! cc.mov(r, 0);
+//! cc.ret(r);
+//! cc.end_func();
+//! }
+//!
+//! // Generate second function.
+//! FuncNode* func2_node = cc.add_func(FuncSignature::build<uint32_t>());
+//! Label func2_label = func2_node->label();
+//!
+//! {
+//! x86::Gp r = cc.new_gp32("r1");
+//! cc.mov(r, 1);
+//! cc.ret(r);
+//! cc.end_func();
+//! }
+//!
+//! // Finalize the generated code - this would also call `serialize_to()`.
+//! Error err = cc.finalize();
+//! if (err != Error::kOk) {
+//! printf("ERROR during finalization: %s\n", DebugUtils::error_as_string(err));
+//! return 1;
+//! }
+//!
+//! // We have deliberately used void* as a pointer type as it's start of an assembled module.
+//! void* module;
+//! err = rt.add(&module, &code);
+//!
+//! if (err != Error::kOk) {
+//! printf("ERROR during allocation/relocation: %s\n", DebugUtils::error_as_string(err));
+//! return 1;
+//! }
+//!
+//! // Normally both CodeHolder and Compiler are not needed after the code has been finalized
+//! // and allocated/relocated into an executable memory. However, in order to get the required
+//! // offsets it's necessary to query CodeHolder for positions in code, and to get these it's
+//! // required to either have `FuncNode` or `Label`.
+//! size_t func1_offset = code.label_offset_from_base(func1_label);
+//! size_t func2_offset = code.label_offset_from_base(func2_label);
+//!
+//! using Fn = uint32_t(*)(void);
+//!
+//! Fn fn1 = ptr_as_func<Fn>(module, func1_offset);
+//! Fn fn2 = ptr_as_func<Fn>(module, func2_offset);
+//!
+//! printf("fn1()=%u fn2()=%u\n", fn1(), fn2());
+//!
+//! // The module has to be released at once - individual functions cannot be released.
+//! rt.release(module);
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! CodeHolder Reusability
+//! ----------------------
+//!
+//! If you intend to generate a lot of code, or tiny code, it's advised to reuse CodeHolder and emitter instances.
+//! There are currently two ways of reusing CodeHolder and emitters - one is using \ref CodeHolder::init() followed
+//! by \ref CodeHolder::reset(), and another is initializing once by \ref CodeHolder::init() and then reinitializing
+//! by \ref CodeHolder::reinit(). The first strategy is shown below:
+//!
+//! ```
+//! // All of them will be reused for code generation by using an 'init()/reset()' strategy.
+//! Environment env = ...; // Environment to use, for example from JitRuntime.
+//! CodeHolder code; // CodeHolder to reuse (all allocated memory will be held by it until it's destroyed).
+//! x86::Compiler cc; // Emitter to reuse (for example x86::Compiler).
+//!
+//! for (size_t i = 0; i < ...; i++) {
+//! // Initialize the CodeHolder first.
+//! code.init(env);
+//! code.attach(&emitter);
+//!
+//! [[code generation as usual]]
+//!
+//! code.reset();
+//! }
+//! ```
+//!
+//! While this approach is good for many use-cases, there is even a faster strategy called reinitialization, which is
+//! provided by \ref CodeHolder::reinit(). The idea of reinit is to reinitialize the CodeHolder into a state, which
+//! was achieved by initializing it by \ref CodeHolder::init(), by optionally attaching \ref Logger, \ref ErrorHandler,
+//! and emitters of any kind. See an example below:
+//!
+//! ```
+//! // All of them will be reused for code generation by using a 'reinit()' strategy.
+//! Environment env = ...; // Environment to use, for example from JitRuntime.
+//! CodeHolder code; // CodeHolder to reuse (all allocated memory will be held by it until it's destroyed).
+//! x86::Compiler cc; // Emitter to reuse (for example x86::Compiler).
+//!
+//! // Initialize the CodeHolder and attach emitters to it (attaching ErrorHandler is advised!)
+//! code.init(env);
+//! code.attach(&emitter);
+//!
+//! for (size_t i = 0; i < ...; i++) {
+//! [[code generation as usual]]
+//!
+//! // Optionally you can start the loop with 'code.reinit()', but this is cleaner as it wipes out all intermediate
+//! // states of CodeHolder and the attached emitters. It won't detach Logger, ErrorHandler, nor attached emitters.
+//! code.reinit();
+//! }
+//! ```
+//!
+//! \note \ref CodeHolder has an ability to attach an \ref ErrorHandler, however, the error handler is not triggered
+//! by \ref CodeHolder itself, it's instead propagated to all emitters that attach to it.
+class CodeHolder {
+public:
+ ASMJIT_NONCOPYABLE(CodeHolder)
+
+ //! \name Types
+ //! \{
+
+ //! \cond INTERNAL
+ struct NamedLabelExtraData : public ArenaHashNode {
+ LabelEntry::ExtraData extra_data;
+
+ ASMJIT_INLINE_NODEBUG uint32_t label_id() const noexcept { return _custom_data; }
+ };
+ //! \endcond
+
+ //! An informative data structure that is filled with some details that happened during \ref relocate_to_base().
+ struct RelocationSummary {
+ //! The number of bytes the final code has been reduced by.
+ //!
+ //! At the moment this is the same as the number of bytes that the address table was shrunk, because it was
+ //! possible to avoid certain entries during relocation - the functions that would be otherwise present were
+ //! close enough to avoid them in the .addrtab section.
+ size_t code_size_reduction;
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Environment information.
+ Environment _environment;
+ //! CPU features of the target architecture.
+ CpuFeatures _cpu_features;
+ //! Base address or \ref Globals::kNoBaseAddress.
+ uint64_t _base_address;
+
+ //! Attached `Logger`, used by all consumers.
+ Logger* _logger;
+ //! Attached `ErrorHandler`.
+ ErrorHandler* _error_handler;
+
+ //! Arena allocator used to allocate core structures.
+ Arena _arena;
+
+ //! First emitter attached to this CodeHolder (double-linked list).
+ BaseEmitter* _attached_first;
+ //! Last emitter attached to this CodeHolder (double-linked list).
+ BaseEmitter* _attached_last;
+
+ //! Section entries.
+ ArenaVector<Section*> _sections;
+ //! Section entries sorted by section order and then section id.
+ ArenaVector<Section*> _sections_by_order;
+
+ //! Label entries.
+ ArenaVector<LabelEntry> _label_entries;
+ //! Relocation entries.
+ ArenaVector<RelocEntry*> _relocations;
+ //! Label name -> LabelEntry::ExtraData (only used by labels that have a name and are not anonymous).
+ ArenaHash<NamedLabelExtraData> _named_labels;
+ //! Unresolved fixups that are most likely references across sections.
+ Fixup* _fixups;
+ //! Pool containing \ref Fixup instances for quickly recycling them.
+ ArenaPool<Fixup> _fixup_data_pool;
+ //! Count of unresolved fixups of unbound labels (at the end of assembling this should be zero).
+ size_t _unresolved_fixup_count;
+
+ //! Text section - always one part of a CodeHolder itself.
+ Section _text_section;
+
+ //! Pointer to an address table section (or null if this section doesn't exist).
+ Section* _address_table_section;
+ //! Address table entries.
+ ArenaTree<AddressTableEntry> _address_table_entries;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates an uninitialized CodeHolder (you must init() it before it can be used).
+ //!
+ //! An optional `temporary` argument can be used to initialize the first block of \ref Arena
+ //! that \ref CodeHolder uses into a temporary memory provided by the user.
+ ASMJIT_API explicit CodeHolder(Span<uint8_t> static_arena_memory = Span<uint8_t>{}) noexcept;
+
+ //! Destroys the CodeHolder and frees all resources it has allocated.
+ ASMJIT_API ~CodeHolder() noexcept;
+
+ //! Tests whether the `CodeHolder` has been initialized.
+ //!
+ //! Emitters can be only attached to initialized `CodeHolder` instances.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_initialized() const noexcept { return _environment.is_initialized(); }
+
+ //! Initializes CodeHolder to hold code described by the given `environment` and `base_address`.
+ ASMJIT_API Error init(const Environment& environment, uint64_t base_address = Globals::kNoBaseAddress) noexcept;
+ //! Initializes CodeHolder to hold code described by the given `environment`, `cpu_features`, and `base_address`.
+ ASMJIT_API Error init(const Environment& environment, const CpuFeatures& cpu_features, uint64_t base_address = Globals::kNoBaseAddress) noexcept;
+
+ //! Reinitializes CodeHolder with the same environment, cpu features, and base address as it had, and notifies
+ //! all attached emitters of reinitialization. If the \ref CodeHolder was not initialized, \ref Error::kNotInitialized
+ //! is returned.
+ //!
+ //! Reinitialization is designed to be a faster alternative compared to \ref reset() followed by \ref init() chain.
+ //! The purpose of reinitialization is a very quick reuse of \ref CodeHolder and all attached emitters (most likely
+ //! Assembler or Compiler) without paying the cost of complete initialization and then assignment of all the loggers,
+ //! error handlers, and emitters.
+ //!
+ //! \note Semantically reinit() is the same as using \ref reset() with \ref ResetPolicy::kSoft parameter followed by
+ //! \ref init(), and then by attaching loggers, error handlers, and emitters that were attached previously. This
+ //! means that after reinitialization you will get a clean and ready for use \ref CodeHolder, which was initialized
+ //! the same way as before.
+ ASMJIT_API Error reinit() noexcept;
+
+ //! Detaches all code-generators attached and resets the `CodeHolder`.
+ ASMJIT_API void reset(ResetPolicy reset_policy = ResetPolicy::kSoft) noexcept;
+
+ //! \}
+
+ //! \name Attach & Detach
+ //! \{
+
+ //! Attaches an emitter to this `CodeHolder`.
+ ASMJIT_API Error attach(BaseEmitter* emitter) noexcept;
+ //! Detaches an emitter from this `CodeHolder`.
+ ASMJIT_API Error detach(BaseEmitter* emitter) noexcept;
+
+ //! \}
+
+ //! \name Memory Allocators
+ //! \{
+
+ //! Returns the allocator that the `CodeHolder` uses.
+ //!
+ //! \note This should be only used for AsmJit's purposes. Code holder uses arena allocator to allocate everything,
+ //! so anything allocated through this allocator will be invalidated by \ref CodeHolder::reset() or by CodeHolder's
+ //! destructor.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arena& arena() const noexcept { return const_cast<Arena&>(_arena); }
+
+ //! \}
+
+ //! \name Code & Architecture
+ //! \{
+
+ //! Returns the target environment information.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; }
+
+ //! Returns the target architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return environment().arch(); }
+
+ //! Returns the target sub-architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SubArch sub_arch() const noexcept { return environment().sub_arch(); }
+
+ //! Returns the minimum CPU features of the target architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const CpuFeatures& cpu_features() const noexcept { return _cpu_features; }
+
+ //! Tests whether a static base-address is set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_base_address() const noexcept { return _base_address != Globals::kNoBaseAddress; }
+
+ //! Returns a static base-address or \ref Globals::kNoBaseAddress, if not set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t base_address() const noexcept { return _base_address; }
+
+ //! \}
+
+ //! \name Attached Emitters
+ //! \{
+
+ //! Returns a vector of attached emitters.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseEmitter* attached_first() noexcept { return _attached_first; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseEmitter* attached_last() noexcept { return _attached_last; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const BaseEmitter* attached_first() const noexcept { return _attached_first; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const BaseEmitter* attached_last() const noexcept { return _attached_last; }
+
+ //! \}
+
+ //! \name Logging
+ //! \{
+
+ //! Returns the attached logger.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; }
+
+ //! Attaches a `logger` to CodeHolder and propagates it to all attached emitters.
+ ASMJIT_API void set_logger(Logger* logger) noexcept;
+
+ //! Resets the logger to none.
+ ASMJIT_INLINE_NODEBUG void reset_logger() noexcept { set_logger(nullptr); }
+
+ //! \name Error Handling
+ //! \{
+
+ //! Tests whether the CodeHolder has an attached error handler, see \ref ErrorHandler.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_error_handler() const noexcept { return _error_handler != nullptr; }
+
+ //! Returns the attached error handler.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ErrorHandler* error_handler() const noexcept { return _error_handler; }
+
+ //! Attach an error handler to this `CodeHolder`.
+ ASMJIT_API void set_error_handler(ErrorHandler* error_handler) noexcept;
+
+ //! Resets the error handler to none.
+ ASMJIT_INLINE_NODEBUG void reset_error_handler() noexcept { set_error_handler(nullptr); }
+
+ //! \}
+
+ //! \name Code Buffer
+ //! \{
+
+ //! Makes sure that at least `n` bytes can be added to CodeHolder's buffer `cb`.
+ //!
+ //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the behavior of the function is undefined.
+ ASMJIT_API Error grow_buffer(CodeBuffer* cb, size_t n) noexcept;
+
+ //! Reserves the size of `cb` to at least `n` bytes.
+ //!
+ //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the behavior of the function is undefined.
+ ASMJIT_API Error reserve_buffer(CodeBuffer* cb, size_t n) noexcept;
+
+ //! \}
+
+ //! \name Sections
+ //! \{
+
+ //! Returns an array of `Section*` records.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<Section*> sections() const noexcept { return _sections.as_span(); }
+
+ //! Returns an array of `Section*` records sorted according to section order first, then section id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<Section*> sections_by_order() const noexcept { return _sections_by_order.as_span(); }
+
+ //! Returns the number of sections.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t section_count() const noexcept { return _sections.size(); }
+
+ //! Tests whether the given `section_id` is valid.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_section_valid(uint32_t section_id) const noexcept { return section_id < _sections.size(); }
+
+ //! Creates a new section and return its pointer in `section_out`.
+ //!
+ //! Returns `Error`, does not report a possible error to `ErrorHandler`.
+ ASMJIT_API Error new_section(Out<Section*> section_out, const char* name, size_t name_size = SIZE_MAX, SectionFlags flags = SectionFlags::kNone, uint32_t alignment = 1, int32_t order = 0) noexcept;
+
+ //! Returns a section entry of the given index.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Section* section_by_id(uint32_t section_id) const noexcept { return _sections[section_id]; }
+
+ //! Returns section-id that matches the given `name`.
+ //!
+ //! If there is no such section `Section::kInvalidId` is returned.
+ [[nodiscard]]
+ ASMJIT_API Section* section_by_name(const char* name, size_t name_size = SIZE_MAX) const noexcept;
+
+ //! Returns '.text' section (section that commonly represents code).
+ //!
+ //! \note Text section is always the first section in \ref CodeHolder::sections() array.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Section* text_section() const noexcept { return _sections[0]; }
+
+ //! Tests whether '.addrtab' section exists.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_address_table_section() const noexcept { return _address_table_section != nullptr; }
+
+ //! Returns '.addrtab' section.
+ //!
+ //! This section is used exclusively by AsmJit to store absolute 64-bit
+ //! addresses that cannot be encoded in instructions like 'jmp' or 'call'.
+ //!
+ //! \note This section is created on demand, the returned pointer can be null.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Section* address_table_section() const noexcept { return _address_table_section; }
+
+ //! Ensures that '.addrtab' section exists (creates it if it doesn't) and
+ //! returns it. Can return `nullptr` on out of memory condition.
+ [[nodiscard]]
+ ASMJIT_API Section* ensure_address_table_section() noexcept;
+
+ //! Used to add an address to an address table.
+ //!
+ //! This implicitly calls `ensure_address_table_section()` and then creates `AddressTableEntry` that is inserted
+ //! to `_address_table_entries`. If the address already exists this operation does nothing as the same addresses
+ //! use the same slot.
+ //!
+ //! This function should be considered internal as it's used by assemblers to insert an absolute address into the
+ //! address table. Inserting address into address table without creating a particular relocation entry makes no sense.
+ ASMJIT_API Error add_address_to_address_table(uint64_t address) noexcept;
+
+ //! \}
+
+ //! \name Labels & Symbols
+ //! \{
+
+ //! Returns array of `LabelEntry` records.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<LabelEntry> label_entries() const noexcept { return _label_entries.as_span(); }
+
+ //! Returns number of labels created.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t label_count() const noexcept { return _label_entries.size(); }
+
+ //! Tests whether the label having `label_id` is valid (i.e. created by `new_label_id()`).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_label_valid(uint32_t label_id) const noexcept {
+ return label_id < _label_entries.size();
+ }
+
+ //! Tests whether the `label` is valid (i.e. created by `new_label_id()`).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_label_valid(const Label& label) const noexcept {
+ return is_label_valid(label.id());
+ }
+
+ //! Tests whether a label having `label_id` is already bound.
+ //!
+ //! Returns `false` if the `label_id` is not valid.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_label_bound(uint32_t label_id) const noexcept {
+ return is_label_valid(label_id) && _label_entries[label_id].is_bound();
+ }
+
+ //! Tests whether the `label` is already bound.
+ //!
+ //! Returns `false` if the `label` is not valid.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_label_bound(const Label& label) const noexcept {
+ return is_label_bound(label.id());
+ }
+
+ //! Returns LabelEntry of the given label identifier `label_id` (or `label` if you are using overloads).
+ //!
+ //! \attention The passed `label_id` must be valid as it's used as an index to `_label_entries[]` array. In debug
+ //! builds the array access uses an assertion, but such assertion is not present in release builds. To get whether
+ //! a label is valid, check out \ref CodeHolder::is_label_valid() function.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG LabelEntry& label_entry_of(uint32_t label_id) noexcept {
+ return _label_entries[label_id];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const LabelEntry& label_entry_of(uint32_t label_id) const noexcept {
+ return _label_entries[label_id];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG LabelEntry& label_entry_of(const Label& label) noexcept {
+ return label_entry_of(label.id());
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const LabelEntry& label_entry_of(const Label& label) const noexcept {
+ return label_entry_of(label.id());
+ }
+
+ //! Returns offset of a `Label` by its `label_id`.
+ //!
+ //! The offset returned is relative to the start of the section where the label is bound. Zero offset is returned
+ //! for unbound labels, which is their initial offset value.
+ //!
+ //! \attention The passed `label_id` must be valid as it's used as an index to `_label_entries[]` array. In debug
+ //! builds the array access uses an assertion, but such assertion is not present in release builds. To get whether
+ //! a label is valid, check out \ref CodeHolder::is_label_valid() function.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t label_offset(uint32_t label_id) const noexcept {
+ ASMJIT_ASSERT(is_label_valid(label_id));
+ return _label_entries[label_id].offset();
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t label_offset(const Label& label) const noexcept {
+ return label_offset(label.id());
+ }
+
+ //! Returns offset of a label by it's `label_id` relative to the base offset.
+ //!
+ //! \attention The passed `label_id` must be valid as it's used as an index to `_label_entries[]` array. In debug
+ //! builds the array access uses an assertion, but such assertion is not present in release builds. To get whether
+ //! a label is valid, check out \ref CodeHolder::is_label_valid() function.
+ //!
+ //! \note The offset of the section where the label is bound must be valid in order to use this function, otherwise
+ //! the value returned will not be reliable. Typically, sections have offsets when they are flattened, see \ref
+ //! CodeHolder::flatten() function for more details.
+ [[nodiscard]]
+ inline uint64_t label_offset_from_base(uint32_t label_id) const noexcept {
+ ASMJIT_ASSERT(is_label_valid(label_id));
+
+ const LabelEntry& le = _label_entries[label_id];
+ return (le.is_bound() ? _sections[le.section_id()]->offset() : uint64_t(0)) + le.offset();
+ }
+
+ //! \overload
+ [[nodiscard]]
+ inline uint64_t label_offset_from_base(const Label& label) const noexcept {
+ return label_offset_from_base(label.id());
+ }
+
+ //! Creates a new anonymous label and return its id in `label_id_out`.
+ //!
+ //! Returns `Error`, does not report error to `ErrorHandler`.
+ [[nodiscard]]
+ ASMJIT_API Error new_label_id(Out<uint32_t> label_id_out) noexcept;
+
+ //! Creates a new named \ref LabelEntry of the given label `type`.
+ //!
+ //! \param label_id_out Where to store the created \ref Label id.
+ //! \param name The name of the label.
+ //! \param name_size The length of `name` argument, or `SIZE_MAX` if `name` is a null terminated string, which
+ //! means that the `CodeHolder` will use `strlen()` to determine the length.
+ //! \param type The type of the label to create, see \ref LabelType.
+ //! \param parent_id Parent id of a local label, otherwise it must be \ref Globals::kInvalidId.
+ //! \retval Always returns \ref Error, does not report a possible error to the attached \ref ErrorHandler.
+ //!
+ //! AsmJit has a support for local labels (\ref LabelType::kLocal) which require a parent label id (parent_id).
+ //! The names of local labels can conflict with names of other local labels that have a different parent. In
+ //! addition, AsmJit supports named anonymous labels, which are useful only for debugging purposes as the
+ //! anonymous name will have a name, which will be formatted, but the label itself cannot be queried by such
+ //! name.
+ [[nodiscard]]
+ ASMJIT_API Error new_named_label_id(Out<uint32_t> label_id_out, const char* name, size_t name_size, LabelType type, uint32_t parent_id = Globals::kInvalidId) noexcept;
+
+ //! Returns a label by name.
+ //!
+ //! \remarks If the named label doesn't exist a default constructed \ref Label is returned, which has its id set
+ //! to \ref Globals::kInvalidId. In other words, this function doesn't create new labels, it can only be used to
+ //! query an existing \ref Label by name.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label label_by_name(const char* name, size_t name_size = SIZE_MAX, uint32_t parent_id = Globals::kInvalidId) noexcept {
+ return Label(label_id_by_name(name, name_size, parent_id));
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_API Label label_by_name(Span<const char> name, uint32_t parent_id = Globals::kInvalidId) noexcept {
+ return label_by_name(name.data(), name.size(), parent_id);
+ }
+
+ //! Returns a label id by name.
+ //!
+ //! \remarks If the named label doesn't exist \ref Globals::kInvalidId is returned. In other words, this function
+ //! doesn't create new labels, it can only be used to query an existing label identifier by name.
+ [[nodiscard]]
+ ASMJIT_API uint32_t label_id_by_name(const char* name, size_t name_size = SIZE_MAX, uint32_t parent_id = Globals::kInvalidId) noexcept;
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_API uint32_t label_id_by_name(Span<const char> name, uint32_t parent_id = Globals::kInvalidId) noexcept {
+ return label_id_by_name(name.data(), name.size(), parent_id);
+ }
+
+ //! Tests whether there are any unresolved fixups related to unbound labels.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_unresolved_fixups() const noexcept { return _unresolved_fixup_count != 0u; }
+
+ //! Returns the number of unresolved fixups.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t unresolved_fixup_count() const noexcept { return _unresolved_fixup_count; }
+
+ //! Creates a new label-link used to store information about yet unbound labels.
+ //!
+ //! Returns `null` if the allocation failed.
+ [[nodiscard]]
+ ASMJIT_API Fixup* new_fixup(LabelEntry& le, uint32_t section_id, size_t offset, intptr_t rel, const OffsetFormat& format) noexcept;
+
+ //! Resolves cross-section fixups associated with each label that was used as a destination in code of a different
+ //! section. It's only useful to people that use multiple sections as it will do nothing if the code only contains
+ //! a single section in which cross-section fixups are not possible.
+ ASMJIT_API Error resolve_cross_section_fixups() noexcept;
+
+ //! Binds a label to a given `section_id` and `offset` (relative to start of the section).
+ //!
+ //! This function is generally used by `BaseAssembler::bind()` to do the heavy lifting.
+ ASMJIT_API Error bind_label(const Label& label, uint32_t section_id, uint64_t offset) noexcept;
+
+ //! \}
+
+ //! \name Relocations
+ //! \{
+
+ //! Tests whether the code contains relocation entries.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_reloc_entries() const noexcept { return !_relocations.is_empty(); }
+
+ //! Returns array of `RelocEntry*` records.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<RelocEntry*> reloc_entries() const noexcept { return _relocations.as_span(); }
+
+ //! Returns a RelocEntry of the given `id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RelocEntry* reloc_entry_of(uint32_t id) const noexcept { return _relocations[id]; }
+
+ //! Creates a new relocation entry of type `reloc_type`.
+ //!
+ //! Additional fields can be set after the relocation entry was created.
+ [[nodiscard]]
+ ASMJIT_API Error new_reloc_entry(Out<RelocEntry*> dst, RelocType reloc_type) noexcept;
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Flattens all sections by recalculating their offsets, starting at 0.
+ //!
+ //! \note This should never be called more than once.
+ ASMJIT_API Error flatten() noexcept;
+
+ //! Returns computed the size of code & data of all sections.
+ //!
+ //! \note All sections will be iterated over and the code size returned would represent the minimum code size of
+ //! all combined sections after applying minimum alignment. Code size may decrease after calling `flatten()` and
+ //! `relocate_to_base()`.
+ [[nodiscard]]
+ ASMJIT_API size_t code_size() const noexcept;
+
+ //! Relocates the code to the given `base_address`.
+ //!
+ //! \param base_address Absolute base address where the code will be relocated to. Please note that nothing is
+ //! copied to such base address, it's just an absolute value used by the relocation code to resolve all stored
+ //! relocations.
+ //!
+ //! \param summary_out Optional argument that can be used to get back information about the relocation.
+ //!
+ //! \note This should never be called more than once.
+ ASMJIT_API Error relocate_to_base(uint64_t base_address, RelocationSummary* summary_out = nullptr) noexcept;
+
+ //! Copies a single section into `dst`.
+ ASMJIT_API Error copy_section_data(void* dst, size_t dst_size, uint32_t section_id, CopySectionFlags copy_flags = CopySectionFlags::kNone) noexcept;
+
+ //! Copies all sections into `dst`.
+ //!
+ //! This should only be used if the data was flattened and there are no gaps between the sections. The `dst_size`
+ //! is always checked and the copy will never write anything outside the provided buffer.
+ ASMJIT_API Error copy_flattened_data(void* dst, size_t dst_size, CopySectionFlags copy_flags = CopySectionFlags::kNone) noexcept;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_CODEHOLDER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/codewriter.cpp b/3rdparty/asmjit/asmjit/core/codewriter.cpp
new file mode 100644
index 00000000000..7befce25d52
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/codewriter.cpp
@@ -0,0 +1,302 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/codewriter_p.h>
+#include <asmjit/core/emitterutils_p.h>
+
+#include <asmjit/arm/armutils.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+bool CodeWriterUtils::encode_offset32(uint32_t* dst, int64_t offset64, const OffsetFormat& format) noexcept {
+ uint32_t bit_count = format.imm_bit_count();
+ uint32_t bit_shift = format.imm_bit_shift();
+ uint32_t discard_lsb = format.imm_discard_lsb();
+
+ // Invalid offset (should not happen).
+ if (!bit_count || bit_count > format.value_size() * 8u) {
+ return false;
+ }
+
+ uint32_t value;
+ uint32_t u = 0;
+ bool unsigned_logic = format.type() == OffsetType::kUnsignedOffset;
+
+ // First handle all offsets that use additional field for their sign and the offset is encoded as its
+ // absolute value.
+ if (format.has_sign_bit()) {
+ u = uint32_t(offset64 >= 0);
+ if (u == 0) {
+ offset64 = -offset64;
+ }
+ unsigned_logic = true;
+ }
+
+ // First handle all unsigned offset types.
+ if (unsigned_logic) {
+ if (discard_lsb) {
+ ASMJIT_ASSERT(discard_lsb <= 32);
+ if ((offset64 & Support::lsb_mask<uint32_t>(discard_lsb)) != 0) {
+ return false;
+ }
+ offset64 = int64_t(uint64_t(offset64) >> discard_lsb);
+ }
+
+ value = uint32_t(offset64 & Support::lsb_mask<uint32_t>(bit_count));
+ if (value != offset64) {
+ return false;
+ }
+ }
+ else {
+ // The rest of OffsetType options are all signed.
+ if (discard_lsb) {
+ ASMJIT_ASSERT(discard_lsb <= 32);
+ if ((offset64 & Support::lsb_mask<uint32_t>(discard_lsb)) != 0) {
+ return false;
+ }
+ offset64 >>= discard_lsb;
+ }
+
+ if (!Support::is_int_n<32>(offset64)) {
+ return false;
+ }
+
+ value = uint32_t(int32_t(offset64));
+ if (!EmitterUtils::is_encodable_offset_32(int32_t(value), bit_count)) {
+ return false;
+ }
+ }
+
+ switch (format.type()) {
+ case OffsetType::kSignedOffset:
+ case OffsetType::kUnsignedOffset: {
+ *dst = (value & Support::lsb_mask<uint32_t>(bit_count)) << bit_shift;
+ return true;
+ }
+
+ // Opcode: {.....|imm:1|..N.N|......|imm:3|....|imm:8}
+ case OffsetType::kThumb32_ADR: {
+ // Sanity checks.
+ if (format.value_size() != 4 || bit_count != 12 || bit_shift != 0) {
+ return false;
+ }
+
+ uint32_t imm8 = (value & 0x00FFu);
+ uint32_t imm3 = (value & 0x0700u) << (12 - 8);
+ uint32_t imm1 = (value & 0x0800u) << (26 - 11);
+ uint32_t n = u ^ 1u;
+
+ *dst = imm8 | imm3 | imm1 | (n << 21) | (n << 23);
+ return true;
+ }
+
+ // Opcode: {....|.|imm[22]|imm[19:10]|..|ja|.|jb|imm[9:0]|.}
+ case OffsetType::kThumb32_BLX:
+ // The calculation is the same as `B`, but the first LSB bit must be zero, so account for that.
+ value <<= 1;
+ [[fallthrough]];
+
+ // Opcode: {....|.|imm[23]|imm[20:11]|..|ja|.|jb|imm[10:0]}
+ case OffsetType::kThumb32_B: {
+ // Sanity checks.
+ if (format.value_size() != 4) {
+ return false;
+ }
+
+ uint32_t ia = (value & 0x0007FFu);
+ uint32_t ib = (value & 0x1FF800u) << (16 - 11);
+ uint32_t ic = (value & 0x800000u) << (26 - 23);
+ uint32_t ja = ((~value >> 23) ^ (value >> 22)) & 1u;
+ uint32_t jb = ((~value >> 23) ^ (value >> 21)) & 1u;
+
+ *dst = ia | ib | ic | (ja << 14) | (jb << 11);
+ return true;
+ }
+
+ // Opcode: {....|.|imm[19]|....|imm[16:11]|..|ja|.|jb|imm[10:0]}
+ case OffsetType::kThumb32_BCond: {
+ // Sanity checks.
+ if (format.value_size() != 4 || bit_count != 20 || bit_shift != 0) {
+ return false;
+ }
+
+ uint32_t ia = (value & 0x0007FFu);
+ uint32_t ib = (value & 0x01F800u) << (16 - 11);
+ uint32_t ic = (value & 0x080000u) << (26 - 19);
+ uint32_t ja = ((~value >> 19) ^ (value >> 22)) & 1u;
+ uint32_t jb = ((~value >> 19) ^ (value >> 21)) & 1u;
+
+ *dst = ia | ib | ic | (ja << 14) | (jb << 11);
+ return true;
+ }
+
+ case OffsetType::kAArch32_ADR: {
+ uint32_t encoded_imm;
+ if (!arm::Utils::encode_aarch32_imm(value, Out(encoded_imm))) {
+ return false;
+ }
+
+ *dst = (Support::bit_mask<uint32_t>(22) << u) | (encoded_imm << bit_shift);
+ return true;
+ }
+
+ case OffsetType::kAArch32_U23_SignedOffset: {
+ *dst = (value << bit_shift) | (u << 23);
+ return true;
+ }
+
+ case OffsetType::kAArch32_U23_0To3At0_4To7At8: {
+ // Sanity checks.
+ if (format.value_size() != 4 || bit_count != 8 || bit_shift != 0) {
+ return false;
+ }
+
+ uint32_t imm_lo = (value & 0x0Fu);
+ uint32_t imm_hi = (value & 0xF0u) << (8 - 4);
+
+ *dst = imm_lo | imm_hi | (u << 23);
+ return true;
+ }
+
+ case OffsetType::kAArch32_1To24At0_0At24: {
+ // Sanity checks.
+ if (format.value_size() != 4 || bit_count != 25 || bit_shift != 0) {
+ return false;
+ }
+
+ uint32_t imm_lo = (value & 0x0000001u) << 24;
+ uint32_t imm_hi = (value & 0x1FFFFFEu) >> 1;
+
+ *dst = imm_lo | imm_hi;
+ return true;
+ }
+
+ case OffsetType::kAArch64_ADR:
+ case OffsetType::kAArch64_ADRP: {
+ // Sanity checks.
+ if (format.value_size() != 4 || bit_count != 21 || bit_shift != 5) {
+ return false;
+ }
+
+ uint32_t imm_lo = value & 0x3u;
+ uint32_t imm_hi = (value >> 2) & Support::lsb_mask<uint32_t>(19);
+
+ *dst = (imm_lo << 29) | (imm_hi << 5);
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+bool CodeWriterUtils::encode_offset64(uint64_t* dst, int64_t offset64, const OffsetFormat& format) noexcept {
+ uint32_t bit_count = format.imm_bit_count();
+ uint32_t discard_lsb = format.imm_discard_lsb();
+
+ if (!bit_count || bit_count > format.value_size() * 8u) {
+ return false;
+ }
+
+ uint64_t value;
+
+ // First handle all unsigned offset types.
+ if (format.type() == OffsetType::kUnsignedOffset) {
+ if (discard_lsb) {
+ ASMJIT_ASSERT(discard_lsb <= 32);
+ if ((offset64 & Support::lsb_mask<uint32_t>(discard_lsb)) != 0) {
+ return false;
+ }
+ offset64 = int64_t(uint64_t(offset64) >> discard_lsb);
+ }
+
+ value = uint64_t(offset64) & Support::lsb_mask<uint64_t>(bit_count);
+ if (value != uint64_t(offset64)) {
+ return false;
+ }
+ }
+ else {
+ // The rest of OffsetType options are all signed.
+ if (discard_lsb) {
+ ASMJIT_ASSERT(discard_lsb <= 32);
+ if ((offset64 & Support::lsb_mask<uint32_t>(discard_lsb)) != 0) {
+ return false;
+ }
+ offset64 >>= discard_lsb;
+ }
+
+ if (!EmitterUtils::is_encodable_offset_64(offset64, bit_count)) {
+ return false;
+ }
+
+ value = uint64_t(offset64);
+ }
+
+ switch (format.type()) {
+ case OffsetType::kSignedOffset:
+ case OffsetType::kUnsignedOffset: {
+ *dst = (value & Support::lsb_mask<uint64_t>(bit_count)) << format.imm_bit_shift();
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+bool CodeWriterUtils::write_offset(void* dst, int64_t offset64, const OffsetFormat& format) noexcept {
+ // Offset the destination by ValueOffset so the `dst` points to the
+ // patched word instead of the beginning of the patched region.
+ dst = static_cast<char*>(dst) + format.value_offset();
+
+ switch (format.value_size()) {
+ case 1: {
+ uint32_t mask;
+ if (!encode_offset32(&mask, offset64, format)) {
+ return false;
+ }
+
+ Support::store_u8(dst, uint8_t(Support::load_u8(dst) | mask));
+ return true;
+ }
+
+ case 2: {
+ uint32_t mask;
+ if (!encode_offset32(&mask, offset64, format)) {
+ return false;
+ }
+
+ Support::storeu_u16_le(dst, uint16_t(Support::loadu_u16_le(dst) | mask));
+ return true;
+ }
+
+ case 4: {
+ uint32_t mask;
+ if (!encode_offset32(&mask, offset64, format)) {
+ return false;
+ }
+
+ Support::storeu_u32_le(dst, Support::loadu_u32_le(dst) | mask);
+ return true;
+ }
+
+ case 8: {
+ uint64_t mask;
+ if (!encode_offset64(&mask, offset64, format)) {
+ return false;
+ }
+
+ Support::storeu_u64_le(dst, Support::loadu_u64_le(dst) | mask);
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/codewriter_p.h b/3rdparty/asmjit/asmjit/core/codewriter_p.h
new file mode 100644
index 00000000000..f05154e0665
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/codewriter_p.h
@@ -0,0 +1,188 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
+#define ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/codebuffer.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_assembler
+//! \{
+
+struct OffsetFormat;
+
+//! Helper that is used to write into a \ref CodeBuffer held by \ref BaseAssembler.
+class CodeWriter {
+public:
+ uint8_t* _cursor;
+
+ ASMJIT_INLINE_NODEBUG explicit CodeWriter(BaseAssembler* a) noexcept
+ : _cursor(a->_buffer_ptr) {}
+
+ [[nodiscard]]
+ ASMJIT_INLINE Error ensure_space(BaseAssembler* a, size_t n) noexcept {
+ size_t remaining_space = (size_t)(a->_buffer_end - _cursor);
+ if (ASMJIT_UNLIKELY(remaining_space < n)) {
+ CodeBuffer& buffer = a->_section->_buffer;
+ Error err = a->_code->grow_buffer(&buffer, n);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return a->report_error(err);
+ }
+ _cursor = a->_buffer_ptr;
+ }
+ return Error::kOk;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* cursor() const noexcept { return _cursor; }
+
+ ASMJIT_INLINE_NODEBUG void set_cursor(uint8_t* cursor) noexcept { _cursor = cursor; }
+ ASMJIT_INLINE_NODEBUG void advance(size_t n) noexcept { _cursor += n; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE size_t offset_from(uint8_t* from) const noexcept {
+ ASMJIT_ASSERT(_cursor >= from);
+ return (size_t)(_cursor - from);
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit8(T val) noexcept {
+ using U = std::make_unsigned_t<T>;
+ _cursor[0] = uint8_t(U(val) & U(0xFF));
+ _cursor++;
+ }
+
+ template<typename T, typename Y>
+ ASMJIT_INLINE void emit8_if(T val, Y cond) noexcept {
+ using U = std::make_unsigned_t<T>;
+ ASMJIT_ASSERT(size_t(cond) <= 1u);
+
+ _cursor[0] = uint8_t(U(val) & U(0xFF));
+ _cursor += size_t(cond);
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit16u_le(T val) noexcept {
+ using U = std::make_unsigned_t<T>;
+ Support::storeu_u16_le(_cursor, uint16_t(U(val) & 0xFFFFu));
+ _cursor += 2;
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit16u_be(T val) noexcept {
+ using U = std::make_unsigned_t<T>;
+ Support::storeu_u16_be(_cursor, uint16_t(U(val) & 0xFFFFu));
+ _cursor += 2;
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit32u_le(T val) noexcept {
+ using U = std::make_unsigned_t<T>;
+ Support::storeu_u32_le(_cursor, uint32_t(U(val) & 0xFFFFFFFFu));
+ _cursor += 4;
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit32u_be(T val) noexcept {
+ using U = std::make_unsigned_t<T>;
+ Support::storeu_u32_be(_cursor, uint32_t(U(val) & 0xFFFFFFFFu));
+ _cursor += 4;
+ }
+
+ ASMJIT_INLINE void emit_data(const void* data, size_t size) noexcept {
+ ASMJIT_ASSERT(size != 0);
+ memcpy(_cursor, data, size);
+ _cursor += size;
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit_value_le(const T& value, size_t size) noexcept {
+ using U = std::make_unsigned_t<T>;
+ ASMJIT_ASSERT(size <= sizeof(T));
+
+ U v = U(value);
+ for (uint32_t i = 0; i < size; i++) {
+ _cursor[i] = uint8_t(v & 0xFFu);
+ v >>= 8;
+ }
+ _cursor += size;
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void emit_value_be(const T& value, size_t size) noexcept {
+ using U = std::make_unsigned_t<T>;
+ ASMJIT_ASSERT(size <= sizeof(T));
+
+ U v = U(value);
+ for (uint32_t i = 0; i < size; i++) {
+ _cursor[i] = uint8_t(v >> (sizeof(T) - 8));
+ v <<= 8;
+ }
+ _cursor += size;
+ }
+
+ ASMJIT_INLINE void emit_zeros(size_t size) noexcept {
+ ASMJIT_ASSERT(size != 0);
+ memset(_cursor, 0, size);
+ _cursor += size;
+ }
+
+ ASMJIT_INLINE void remove8(uint8_t* where) noexcept {
+ ASMJIT_ASSERT(where < _cursor);
+
+ uint8_t* p = where;
+ while (++p != _cursor)
+ p[-1] = p[0];
+ _cursor--;
+ }
+
+ template<typename T>
+ ASMJIT_INLINE void insert8(uint8_t* where, T val) noexcept {
+ uint8_t* p = _cursor;
+
+ while (p != where) {
+ p[0] = p[-1];
+ p--;
+ }
+
+ *p = uint8_t(val & 0xFF);
+ _cursor++;
+ }
+
+ ASMJIT_INLINE void done(BaseAssembler* a) noexcept {
+ CodeBuffer& buffer = a->_section->_buffer;
+ size_t new_size = (size_t)(_cursor - a->_buffer_data);
+ ASMJIT_ASSERT(new_size <= buffer.capacity());
+
+ a->_buffer_ptr = _cursor;
+ buffer._size = Support::max(buffer._size, new_size);
+ }
+};
+
+//! Code writer utilities.
+namespace CodeWriterUtils {
+
+[[nodiscard]]
+bool encode_offset32(uint32_t* dst, int64_t offset64, const OffsetFormat& format) noexcept;
+
+[[nodiscard]]
+bool encode_offset64(uint64_t* dst, int64_t offset64, const OffsetFormat& format) noexcept;
+
+[[nodiscard]]
+bool write_offset(void* dst, int64_t offset64, const OffsetFormat& format) noexcept;
+
+} // {CodeWriterUtils}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/compiler.cpp b/3rdparty/asmjit/asmjit/core/compiler.cpp
new file mode 100644
index 00000000000..eb12a037d4c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/compiler.cpp
@@ -0,0 +1,615 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/builder_p.h>
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/core/rapass_p.h>
+#include <asmjit/core/rastack_p.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// GlobalConstPoolPass
+// ===================
+
+class GlobalConstPoolPass : public Pass {
+ ASMJIT_NONCOPYABLE(GlobalConstPoolPass)
+
+public:
+ using Base = Pass;
+
+ GlobalConstPoolPass(BaseCompiler& cc) noexcept : Pass(cc, "GlobalConstPoolPass") {}
+
+ Error run(Arena& arena, Logger* logger) override {
+ Support::maybe_unused(arena, logger);
+
+ // Flush the global constant pool.
+ BaseCompiler& compiler = static_cast<BaseCompiler&>(_cb);
+ ConstPoolNode* global_const_pool = compiler._const_pools[uint32_t(ConstPoolScope::kGlobal)];
+
+ if (global_const_pool) {
+ compiler.add_after(global_const_pool, compiler.last_node());
+ compiler._const_pools[uint32_t(ConstPoolScope::kGlobal)] = nullptr;
+ }
+
+ return Error::kOk;
+ }
+};
+
+// BaseCompiler - Construction & Destruction
+// =========================================
+
+BaseCompiler::BaseCompiler() noexcept
+ : BaseBuilder(),
+ _func(nullptr),
+ _virt_regs(),
+ _const_pools { nullptr, nullptr } {
+ _emitter_type = EmitterType::kCompiler;
+ _validation_flags = ValidationFlags::kEnableVirtRegs;
+}
+BaseCompiler::~BaseCompiler() noexcept {}
+
+// BaseCompiler - Function Management
+// ==================================
+
+Error BaseCompiler::new_func_node(Out<FuncNode*> out, const FuncSignature& signature) {
+ *out = nullptr;
+
+ // Create FuncNode together with all the required surrounding nodes.
+ FuncNode* func_node = nullptr;
+ ASMJIT_PROPAGATE(new_node_t<FuncNode>(Out(func_node)));
+ ASMJIT_PROPAGATE(new_label_node(Out(func_node->_exit_node)));
+ ASMJIT_PROPAGATE(new_node_t<SentinelNode>(Out(func_node->_end), SentinelType::kFuncEnd));
+
+ // Initialize the function's detail info.
+ Error err = func_node->detail().init(signature, environment());
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ // If the Target guarantees greater stack alignment than required by the calling convention
+ // then override it as we can prevent having to perform dynamic stack alignment
+ uint32_t environment_stack_alignment = _environment.stack_alignment();
+
+ if (func_node->_func_detail._call_conv.natural_stack_alignment() < environment_stack_alignment) {
+ func_node->_func_detail._call_conv.set_natural_stack_alignment(environment_stack_alignment);
+ }
+
+ // Initialize the function frame.
+ err = func_node->_frame.init(func_node->_func_detail);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ // Allocate space for function arguments.
+ func_node->_args = nullptr;
+ if (func_node->arg_count() != 0) {
+ func_node->_args = _builder_arena.alloc_oneshot<FuncNode::ArgPack>(func_node->arg_count() * sizeof(FuncNode::ArgPack));
+ if (ASMJIT_UNLIKELY(!func_node->_args)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+ memset(func_node->_args, 0, func_node->arg_count() * sizeof(FuncNode::ArgPack));
+ }
+
+ ASMJIT_PROPAGATE(register_label_node(func_node));
+
+ out = func_node;
+ return Error::kOk;
+}
+
+Error BaseCompiler::add_func_node(Out<FuncNode*> out, const FuncSignature& signature) {
+ State state = _grab_state();
+
+ ASMJIT_PROPAGATE(new_func_node(out, signature));
+ Builder_assign_inline_comment(this, *out, state.comment);
+
+ add_func(*out);
+ return Error::kOk;
+}
+
+Error BaseCompiler::new_func_ret_node(Out<FuncRetNode*> out, const Operand_& o0, const Operand_& o1) {
+ uint32_t op_count = !o1.is_none() ? 2u : !o0.is_none() ? 1u : 0u;
+ FuncRetNode* node = nullptr;
+
+ ASMJIT_PROPAGATE(new_node_t<FuncRetNode>(Out(node)));
+ ASMJIT_ASSUME(node != nullptr);
+
+ node->set_op_count(op_count);
+ node->set_op(0, o0);
+ node->set_op(1, o1);
+ node->reset_op_range(2, node->op_capacity());
+
+ out = node;
+ return Error::kOk;
+}
+
+Error BaseCompiler::add_func_ret_node(Out<FuncRetNode*> out, const Operand_& o0, const Operand_& o1) {
+ State state = _grab_state();
+
+ ASMJIT_PROPAGATE(new_func_ret_node(out, o0, o1));
+ Builder_assign_inline_comment(this, *out, state.comment);
+
+ add_node(*out);
+ return Error::kOk;
+}
+
+FuncNode* BaseCompiler::add_func(FuncNode* func) {
+ _func = func;
+
+ add_node(func); // Function node.
+ BaseNode* prev = cursor(); // {CURSOR}.
+ add_node(func->exit_node()); // Function exit label.
+ add_node(func->end_node()); // Function end sentinel.
+
+ set_cursor(prev);
+ return func;
+}
+
+Error BaseCompiler::end_func() {
+ FuncNode* func = _func;
+ reset_state();
+
+ if (ASMJIT_UNLIKELY(!func)) {
+ return report_error(make_error(Error::kInvalidState));
+ }
+
+ // Add the local constant pool at the end of the function (if exists).
+ ConstPoolNode* local_const_pool = _const_pools[uint32_t(ConstPoolScope::kLocal)];
+ if (local_const_pool) {
+ set_cursor(func->end_node()->prev());
+ add_node(local_const_pool);
+ _const_pools[uint32_t(ConstPoolScope::kLocal)] = nullptr;
+ }
+
+ // Mark as finished.
+ _func = nullptr;
+
+ SentinelNode* end = func->end_node();
+ set_cursor(end);
+
+ return Error::kOk;
+}
+
+// BaseCompiler - Function Invocation
+// ==================================
+
+Error BaseCompiler::new_invoke_node(Out<InvokeNode*> out, InstId inst_id, const Operand_& o0, const FuncSignature& signature) {
+ InvokeNode* node = nullptr;
+ ASMJIT_PROPAGATE(new_node_t<InvokeNode>(Out(node), inst_id, InstOptions::kNone));
+
+ node->set_op_count(1);
+ node->set_op(0, o0);
+ node->reset_op_range(1, node->op_capacity());
+
+ Error err = node->detail().init(signature, environment());
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ // Skip the allocation if there are no arguments.
+ uint32_t arg_count = signature.arg_count();
+ if (arg_count) {
+ node->_args = _builder_arena.alloc_oneshot<InvokeNode::OperandPack>(arg_count * sizeof(InvokeNode::OperandPack));
+ if (!node->_args) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+ memset(node->_args, 0, arg_count * sizeof(InvokeNode::OperandPack));
+ }
+
+ out = node;
+ return Error::kOk;
+}
+
+Error BaseCompiler::add_invoke_node(Out<InvokeNode*> out, InstId inst_id, const Operand_& o0, const FuncSignature& signature) {
+ State state = _grab_state();
+
+ ASMJIT_PROPAGATE(new_invoke_node(out, inst_id, o0, signature));
+ Builder_assign_inst_state(this, *out, state);
+
+ add_node(*out);
+ return Error::kOk;
+}
+
+// BaseCompiler - Virtual Registers
+// ================================
+
+Error BaseCompiler::new_virt_reg(Out<VirtReg*> out, TypeId type_id, OperandSignature signature, const char* name) {
+ out = nullptr;
+ size_t index = _virt_regs.size();
+
+ if (ASMJIT_UNLIKELY(index >= size_t(Operand::kVirtIdCount))) {
+ return report_error(make_error(Error::kTooManyVirtRegs));
+ }
+
+ if (ASMJIT_UNLIKELY(_virt_regs.reserve_additional(_builder_arena) != Error::kOk)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ void* virt_reg_ptr = _builder_arena.alloc_oneshot(Arena::aligned_size_of<VirtReg>());
+ if (ASMJIT_UNLIKELY(!virt_reg_ptr)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ uint32_t size = TypeUtils::size_of(type_id);
+ uint32_t alignment_log2 = 31 - Support::clz(Support::min<uint32_t>(size, 64) | 1u);
+
+ VirtRegFlags flags = VirtReg::_flags_from_alignment_log2(alignment_log2);
+ VirtReg* virt_reg = new(Support::PlacementNew{virt_reg_ptr}) VirtReg(signature.reg_type(), flags, Operand::virt_index_to_virt_id(uint32_t(index)), size, type_id);
+
+#ifndef ASMJIT_NO_LOGGING
+ if (name && name[0] != '\0') {
+ virt_reg->_name.set_data(_builder_arena, name, SIZE_MAX);
+ }
+#else
+ Support::maybe_unused(name);
+#endif
+
+ _virt_regs.append_unchecked(virt_reg);
+ out = virt_reg;
+
+ return Error::kOk;
+}
+
+Error BaseCompiler::_new_reg_with_name(Out<Reg> out, TypeId type_id, const char* name) {
+ OperandSignature reg_signature;
+ out->reset();
+
+ Error err = ArchUtils::type_id_to_reg_signature(arch(), type_id, Out(type_id), Out(reg_signature));
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ VirtReg* virt_reg;
+ ASMJIT_PROPAGATE(new_virt_reg(Out(virt_reg), type_id, reg_signature, name));
+ ASMJIT_ASSUME(virt_reg != nullptr);
+
+ out->_init_reg(reg_signature, virt_reg->id());
+ return Error::kOk;
+}
+
+Error BaseCompiler::_new_reg_with_name(Out<Reg> out, const Reg& ref, const char* name) {
+ out->reset();
+
+ OperandSignature reg_signature;
+ TypeId type_id;
+
+ if (is_virt_reg_valid(ref)) {
+ VirtReg* v_ref = virt_reg_by_reg(ref);
+ type_id = v_ref->type_id();
+
+ // NOTE: It's possible to cast one register type to another if it's the same register group. However, VirtReg
+ // always contains the TypeId that was used to create the register. This means that in some cases we may end
+ // up having different size of `ref` and `v_ref`. In such case we adjust the TypeId to match the `ref` register
+ // type instead of the original register type, which should be the expected behavior.
+ uint32_t type_size = TypeUtils::size_of(type_id);
+ uint32_t ref_size = ref.size();
+
+ if (type_size != ref_size) {
+ if (TypeUtils::is_int(type_id)) {
+ // GP register - change TypeId to match `ref`, but keep sign of `v_ref`.
+ switch (ref_size) {
+ case 1: type_id = TypeId(uint32_t(TypeId::kInt8 ) | (uint32_t(type_id) & 1)); break;
+ case 2: type_id = TypeId(uint32_t(TypeId::kInt16) | (uint32_t(type_id) & 1)); break;
+ case 4: type_id = TypeId(uint32_t(TypeId::kInt32) | (uint32_t(type_id) & 1)); break;
+ case 8: type_id = TypeId(uint32_t(TypeId::kInt64) | (uint32_t(type_id) & 1)); break;
+ default: type_id = TypeId::kVoid; break;
+ }
+ }
+ else if (TypeUtils::is_mmx(type_id)) {
+ // MMX register - always use 64-bit.
+ type_id = TypeId::kMmx64;
+ }
+ else if (TypeUtils::is_mask(type_id)) {
+ // Mask register - change TypeId to match `ref` size.
+ switch (ref_size) {
+ case 1: type_id = TypeId::kMask8; break;
+ case 2: type_id = TypeId::kMask16; break;
+ case 4: type_id = TypeId::kMask32; break;
+ case 8: type_id = TypeId::kMask64; break;
+ default: type_id = TypeId::kVoid; break;
+ }
+ }
+ else {
+ // Vector register - change TypeId to match `ref` size, keep vector metadata.
+ TypeId scalar_type_id = TypeUtils::scalar_of(type_id);
+ switch (ref_size) {
+ case 16: type_id = TypeUtils::scalar_to_vector(scalar_type_id, TypeId::_kVec128Start); break;
+ case 32: type_id = TypeUtils::scalar_to_vector(scalar_type_id, TypeId::_kVec256Start); break;
+ case 64: type_id = TypeUtils::scalar_to_vector(scalar_type_id, TypeId::_kVec512Start); break;
+ default: type_id = TypeId::kVoid; break;
+ }
+ }
+
+ if (type_id == TypeId::kVoid) {
+ return report_error(make_error(Error::kInvalidState));
+ }
+ }
+ }
+ else {
+ type_id = RegUtils::type_id_of(ref.reg_type());
+ }
+
+ Error err = ArchUtils::type_id_to_reg_signature(arch(), type_id, Out(type_id), Out(reg_signature));
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ VirtReg* virt_reg;
+ ASMJIT_PROPAGATE(new_virt_reg(Out(virt_reg), type_id, reg_signature, name));
+ ASMJIT_ASSUME(virt_reg != nullptr);
+
+ out->_init_reg(reg_signature, virt_reg->id());
+ return Error::kOk;
+}
+
+Error BaseCompiler::_new_reg_with_vfmt(Out<Reg> out, TypeId type_id, const char* fmt, ...) {
+ va_list ap;
+ StringTmp<256> sb;
+
+ va_start(ap, fmt);
+ sb.append_vformat(fmt, ap);
+ va_end(ap);
+
+ return _new_reg(out, type_id, sb.data());
+}
+
+Error BaseCompiler::_new_reg_with_vfmt(Out<Reg> out, const Reg& ref, const char* fmt, ...) {
+ va_list ap;
+ StringTmp<256> sb;
+
+ va_start(ap, fmt);
+ sb.append_vformat(fmt, ap);
+ va_end(ap);
+
+ return _new_reg(out, ref, sb.data());
+}
+
+Error BaseCompiler::_new_stack(Out<BaseMem> out, uint32_t size, uint32_t alignment, const char* name) {
+ out->reset();
+
+ if (ASMJIT_UNLIKELY(Support::bool_or(size == 0, !Support::is_zero_or_power_of_2(alignment)))) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ if (alignment == 0u) {
+ alignment = 1u;
+ }
+
+ if (alignment > 64u) {
+ alignment = 64u;
+ }
+
+ VirtReg* virt_reg;
+ ASMJIT_PROPAGATE(new_virt_reg(Out(virt_reg), TypeId::kVoid, OperandSignature{0}, name));
+ ASMJIT_ASSUME(virt_reg != nullptr);
+
+ virt_reg->_virt_size = size;
+ virt_reg->_reg_flags |= VirtRegFlags::kIsStackArea | VirtReg::_flags_from_alignment_log2(Support::ctz(alignment));
+
+ // Set the memory operand to GPD/GPQ and its id to VirtReg.
+ out = BaseMem(OperandSignature::from_op_type(OperandType::kMem) |
+ OperandSignature::from_mem_base_type(_gp_signature.reg_type()) |
+ OperandSignature::from_bits(OperandSignature::kMemRegHomeFlag),
+ virt_reg->id(), 0, 0);
+ return Error::kOk;
+}
+
+Error BaseCompiler::set_stack_size(uint32_t virt_id, uint32_t new_size, uint32_t new_alignment) {
+ if (!is_virt_id_valid(virt_id)) {
+ return make_error(Error::kInvalidVirtId);
+ }
+
+ if (!Support::is_zero_or_power_of_2(new_alignment)) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ VirtReg* virt_reg = virt_reg_by_id(virt_id);
+
+ if (new_size) {
+ virt_reg->_virt_size = new_size;
+ }
+
+ if (new_alignment) {
+ uint32_t alignment_log2 = Support::ctz(Support::min<uint32_t>(new_alignment, 64u));
+ virt_reg->_reg_flags = (virt_reg->_reg_flags & ~VirtRegFlags::kAlignmentLog2Mask) | VirtReg::_flags_from_alignment_log2(alignment_log2);
+ }
+
+ // This is required if the RAPass is already running. There is a chance that a stack-slot has been already
+ // allocated and in that case it has to be updated as well, otherwise we would allocate wrong amount of memory.
+ RAWorkReg* work_reg = virt_reg->_work_reg;
+ if (work_reg && work_reg->_stack_slot) {
+ work_reg->_stack_slot->_size = virt_reg->virt_size();
+ work_reg->_stack_slot->_alignment = uint8_t(virt_reg->alignment());
+ }
+
+ return Error::kOk;
+}
+
+Error BaseCompiler::_new_const(Out<BaseMem> out, ConstPoolScope scope, const void* data, size_t size) {
+ out->reset();
+
+ if (scope > ConstPoolScope::kMaxValue) {
+ return report_error(make_error(Error::kInvalidArgument));
+ }
+
+ if (!_const_pools[uint32_t(scope)]) {
+ ASMJIT_PROPAGATE(new_const_pool_node(Out(_const_pools[uint32_t(scope)])));
+ }
+
+ ConstPoolNode* pool = _const_pools[uint32_t(scope)];
+ size_t off;
+ Error err = pool->add(data, size, Out(off));
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return report_error(err);
+ }
+
+ out = BaseMem(OperandSignature::from_op_type(OperandType::kMem) |
+ OperandSignature::from_mem_base_type(RegType::kLabelTag) |
+ OperandSignature::from_size(uint32_t(size)),
+ pool->label_id(), 0, int32_t(off));
+ return Error::kOk;
+}
+
+void BaseCompiler::rename(const Reg& reg, const char* fmt, ...) {
+ if (!reg.is_virt_reg()) return;
+
+ VirtReg* virt_reg = virt_reg_by_id(reg.id());
+ if (!virt_reg) {
+ return;
+ }
+
+ if (fmt && fmt[0] != '\0') {
+ char buf[128];
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap);
+ va_end(ap);
+
+ virt_reg->_name.set_data(_builder_arena, buf, SIZE_MAX);
+ }
+}
+
+// BaseCompiler - Jump Annotations
+// ===============================
+
+Error BaseCompiler::new_jump_node(Out<JumpNode*> out, InstId inst_id, InstOptions inst_options, const Operand_& o0, JumpAnnotation* annotation) {
+ JumpNode* node = _builder_arena.alloc_oneshot<JumpNode>();
+
+ *out = node;
+ if (ASMJIT_UNLIKELY(!node)) {
+ return report_error(make_error(Error::kOutOfMemory));
+ }
+
+ uint32_t op_count = 1;
+ node = new(Support::PlacementNew{node}) JumpNode(inst_id, inst_options, op_count, annotation);
+ node->set_op(0, o0);
+ node->reset_op_range(op_count, JumpNode::kBaseOpCapacity);
+
+ return Error::kOk;
+}
+
+Error BaseCompiler::emit_annotated_jump(InstId inst_id, const Operand_& o0, JumpAnnotation* annotation) {
+ State state = _grab_state();
+
+ JumpNode* node;
+ ASMJIT_PROPAGATE(new_jump_node(Out(node), inst_id, state.options, o0, annotation));
+
+ node->set_extra_reg(state.extra_reg);
+ Builder_assign_inline_comment(this, node, state.comment);
+
+ add_node(node);
+ return Error::kOk;
+}
+
+JumpAnnotation* BaseCompiler::new_jump_annotation() {
+ if (_jump_annotations.reserve_additional(_builder_arena, 1) != Error::kOk) {
+ report_error(make_error(Error::kOutOfMemory));
+ return nullptr;
+ }
+
+ uint32_t id = uint32_t(_jump_annotations.size());
+ JumpAnnotation* jump_annotation = _builder_arena.new_oneshot<JumpAnnotation>(this, id);
+
+ if (!jump_annotation) {
+ report_error(make_error(Error::kOutOfMemory));
+ return nullptr;
+ }
+
+ _jump_annotations.append_unchecked(jump_annotation);
+ return jump_annotation;
+}
+
+// BaseCompiler - Events
+// =====================
+
+static ASMJIT_INLINE void BaseCompiler_clear(BaseCompiler* self) noexcept {
+ self->_func = nullptr;
+ self->_const_pools[uint32_t(ConstPoolScope::kLocal)] = nullptr;
+ self->_const_pools[uint32_t(ConstPoolScope::kGlobal)] = nullptr;
+ self->_virt_regs.reset();
+}
+
+static ASMJIT_INLINE Error BaseCompiler_initDefaultPasses(BaseCompiler* self) noexcept {
+ return self->add_pass<GlobalConstPoolPass>();
+}
+
+
+Error BaseCompiler::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ Error err = BaseCompiler_initDefaultPasses(this);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ on_detach(code);
+ return err;
+ }
+ return Error::kOk;
+}
+
+Error BaseCompiler::on_detach(CodeHolder& code) noexcept {
+ BaseCompiler_clear(this);
+ return Base::on_detach(code);
+}
+
+Error BaseCompiler::on_reinit(CodeHolder& code) noexcept {
+ BaseCompiler_clear(this);
+ Error err = Base::on_reinit(code);
+
+ if (ASMJIT_LIKELY(err == Error::kOk)) {
+ err = BaseCompiler_initDefaultPasses(this);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ on_detach(code);
+ return err;
+ }
+ }
+
+ return err;
+}
+
+// FuncPass - Construction & Destruction
+// =====================================
+
+FuncPass::FuncPass(BaseCompiler& cc, const char* name) noexcept
+ : Pass(cc, name) {}
+
+// FuncPass - Run
+// ==============
+
+Error FuncPass::run(Arena& arena, Logger* logger) {
+ BaseNode* node = cc().first_node();
+
+ while (node) {
+ // Find a function by skipping all nodes that are not `NodeType::kFunc`.
+ if (node->type() != NodeType::kFunc) {
+ node = node->next();
+ continue;
+ }
+ else {
+ FuncNode* func = node->as<FuncNode>();
+ node = func->end_node();
+ ASMJIT_PROPAGATE(run_on_function(arena, logger, func));
+ }
+ }
+
+ return Error::kOk;
+}
+
+// [[pure virtual]]
+Error FuncPass::run_on_function(Arena& arena, Logger* logger, FuncNode* func) {
+ Support::maybe_unused(arena, logger, func);
+ return make_error(Error::kInvalidState);
+}
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/core/compiler.h b/3rdparty/asmjit/asmjit/core/compiler.h
new file mode 100644
index 00000000000..6e8a424fd3a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/compiler.h
@@ -0,0 +1,859 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_COMPILER_H_INCLUDED
+#define ASMJIT_CORE_COMPILER_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/builder.h>
+#include <asmjit/core/constpool.h>
+#include <asmjit/core/compilerdefs.h>
+#include <asmjit/core/func.h>
+#include <asmjit/core/inst.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+class JumpAnnotation;
+class JumpNode;
+class FuncNode;
+class FuncRetNode;
+class InvokeNode;
+
+//! \addtogroup asmjit_compiler
+//! \{
+
+//! Code emitter that uses virtual registers and performs register allocation.
+//!
+//! Compiler is a high-level code-generation tool that provides register allocation and automatic handling of function
+//! calling conventions. It was primarily designed for merging multiple parts of code into a function without worrying
+//! about registers and function calling conventions.
+//!
+//! BaseCompiler can be used, with a minimum effort, to handle 32-bit and 64-bit code generation within a single code
+//! base.
+//!
+//! BaseCompiler is based on BaseBuilder and contains all the features it provides. It means that the code it stores
+//! can be modified (removed, added, injected) and analyzed. When the code is finalized the compiler can emit the code
+//! into an Assembler to translate the abstract representation into a machine code.
+//!
+//! Check out architecture specific compilers for more details and examples:
+//!
+//! - \ref x86::Compiler - X86/X64 compiler implementation.
+//! - \ref a64::Compiler - AArch64 compiler implementation.
+class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder {
+public:
+ ASMJIT_NONCOPYABLE(BaseCompiler)
+ using Base = BaseBuilder;
+
+ //! \name Members
+ //! \{
+
+ //! Current function.
+ FuncNode* _func;
+ //! Stores array of `VirtReg` pointers.
+ ArenaVector<VirtReg*> _virt_regs;
+ //! Stores jump annotations.
+ ArenaVector<JumpAnnotation*> _jump_annotations;
+
+ //! Local and global constant pools.
+ //!
+ //! Local constant pool is flushed with each function, global constant pool is flushed only by \ref finalize().
+ ConstPoolNode* _const_pools[2];
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `BaseCompiler` instance.
+ ASMJIT_API BaseCompiler() noexcept;
+ //! Destroys the `BaseCompiler` instance.
+ ASMJIT_API ~BaseCompiler() noexcept override;
+
+ //! \}
+
+ //! \name Passes
+ //! \{
+
+ //! \overload
+ template<typename PassT, typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE PassT* new_pass(Args&&... args) noexcept { return _builder_arena.new_oneshot<PassT>(*this, std::forward<Args>(args)...); }
+
+ template<typename T, typename... Args>
+ ASMJIT_INLINE Error add_pass(Args&&... args) { return _add_pass(new_pass<T, Args...>(std::forward<Args>(args)...)); }
+
+ //! \}
+
+ //! \name Function Management
+ //! \{
+
+ //! Returns the function being generated.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return _func; }
+
+ //! Creates a new \ref FuncNode.
+ ASMJIT_API Error new_func_node(Out<FuncNode*> out, const FuncSignature& signature);
+ //! Creates a new \ref FuncNode adds it to the instruction stream.
+ ASMJIT_API Error add_func_node(Out<FuncNode*> out, const FuncSignature& signature);
+
+ //! Creates a new \ref FuncRetNode.
+ ASMJIT_API Error new_func_ret_node(Out<FuncRetNode*> out, const Operand_& o0, const Operand_& o1);
+ //! Creates a new \ref FuncRetNode and adds it to the instruction stream.
+ ASMJIT_API Error add_func_ret_node(Out<FuncRetNode*> out, const Operand_& o0, const Operand_& o1);
+
+ //! Creates a new \ref FuncNode with the given `signature` and returns it.
+ ASMJIT_INLINE FuncNode* new_func(const FuncSignature& signature) {
+ FuncNode* node;
+ new_func_node(Out(node), signature);
+ return node;
+ }
+
+ //! Creates a new \ref FuncNode with the given `signature`, adds it to the instruction stream by using
+ //! `add_func(FuncNode* func)` overload, and returns the node.
+ ASMJIT_INLINE FuncNode* add_func(const FuncSignature& signature) {
+ FuncNode* node;
+ add_func_node(Out(node), signature);
+ return node;
+ }
+
+ //! Adds a function `node` to the instruction stream.
+ ASMJIT_API FuncNode* add_func(FuncNode* ASMJIT_NONNULL(func));
+
+ //! Ends the current function by emitting a sentinel that marks the end of it.
+ //!
+ //! This would close the context for generating the current function. After calling \ref end_func() the active
+ //! function node is reset and \ref func() would return `nullptr` unless another function is being started via
+ //! \ref add_func().
+ ASMJIT_API Error end_func();
+
+ ASMJIT_INLINE Error add_ret(const Operand_& o0, const Operand_& o1) {
+ FuncRetNode* node;
+ return add_func_ret_node(Out(node), o0, o1);
+ }
+
+ //! \}
+
+ //! \name Function Invocation
+ //! \{
+
+ //! Creates a new \ref InvokeNode.
+ ASMJIT_API Error new_invoke_node(Out<InvokeNode*> out, InstId inst_id, const Operand_& o0, const FuncSignature& signature);
+ //! Creates a new \ref InvokeNode and adds it to the instruction stream.
+ ASMJIT_API Error add_invoke_node(Out<InvokeNode*> out, InstId inst_id, const Operand_& o0, const FuncSignature& signature);
+
+ //! \}
+
+ //! \name Virtual Registers
+ //! \{
+
+ //! Creates a new virtual register representing the given `type_id` and `signature`.
+ //!
+ //! \note This function is public, but it's not generally recommended to be used by AsmJit users, use `new_reg()`,
+ //! `new_similar_reg()`, and architecture specific functions like \ref x86::Compiler::new_gp32(), etc...
+ ASMJIT_API Error new_virt_reg(Out<VirtReg*> out, TypeId type_id, OperandSignature signature, const char* name);
+
+ //! \cond INTERNAL
+
+ //! Creates a new virtual register of the given `type_id` and stores it to `out` operand.
+ ASMJIT_API Error _new_reg_with_name(Out<Reg> out, TypeId type_id, const char* name);
+
+ //! Creates a new virtual register compatible with the provided reference register `ref`.
+ ASMJIT_API Error _new_reg_with_name(Out<Reg> out, const Reg& ref, const char* name);
+
+ //! Creates a new virtual register of the given `type_id` and stores it to `out` operand.
+ //!
+ //! \note This version accepts a snprintf() format `fmt` followed by variadic arguments.
+ ASMJIT_API Error _new_reg_with_vfmt(Out<Reg> out, TypeId type_id, const char* fmt, ...);
+
+ //! Creates a new virtual register compatible with the provided reference register `ref`.
+ //!
+ //! \note This version accepts a snprintf() format `fmt` followed by variadic arguments.
+ ASMJIT_API Error _new_reg_with_vfmt(Out<Reg> out, const Reg& ref, const char* fmt, ...);
+
+ template<typename RegT>
+ ASMJIT_INLINE Error _new_reg(Out<RegT> out, TypeId type_id) {
+ return _new_reg_with_name(Out<Reg>(out.value()), type_id, nullptr);
+ }
+
+ template<typename RegT, typename... Args>
+ ASMJIT_INLINE Error _new_reg(Out<RegT> out, TypeId type_id, const char* name_or_fmt, Args&&... args) {
+#ifndef ASMJIT_NO_LOGGING
+ if constexpr (sizeof...(args) == 0u) {
+ return _new_reg_with_name(Out<Reg>(out.value()), type_id, name_or_fmt);
+ }
+ else {
+ return _new_reg_with_vfmt(Out<Reg>(out.value()), type_id, name_or_fmt, std::forward<Args>(args)...);
+ }
+#else
+ Support::maybe_unused(name_or_fmt, std::forward<Args>(args)...);
+ return _new_reg_with_name(Out<Reg>(out.value()), type_id, nullptr);
+#endif
+ }
+
+ template<typename RegT>
+ ASMJIT_INLINE Error _new_reg(Out<RegT> out, const Reg& ref) {
+ return _new_reg_with_name(Out<Reg>(out.value()), ref, nullptr);
+ }
+
+ template<typename RegT, typename... Args>
+ ASMJIT_INLINE Error _new_reg(Out<RegT> out, const Reg& ref, const char* name_or_fmt, Args&&... args) {
+#ifndef ASMJIT_NO_LOGGING
+ if constexpr (sizeof...(args) == 0u) {
+ return _new_reg_with_name(Out<Reg>(out.value()), ref, name_or_fmt);
+ }
+ else {
+ return _new_reg_with_vfmt(Out<Reg>(out.value()), ref, name_or_fmt, std::forward<Args>(args)...);
+ }
+#else
+ Support::maybe_unused(name_or_fmt, std::forward<Args>(args)...);
+ return _new_reg_with_name(Out<Reg>(out.value()), ref, nullptr);
+#endif
+ }
+
+ //! \endcond
+
+ template<typename RegT, typename... Args>
+ ASMJIT_INLINE_NODEBUG RegT new_reg(TypeId type_id, Args&&... args) {
+ RegT reg(Globals::NoInit);
+ (void)_new_reg<RegT>(Out(reg), type_id, std::forward<Args>(args)...);
+ return reg;
+ }
+
+ //! Creates and returns a new register, which is similar to `ref` in terms of size and type.
+ //!
+ //! \note Optionally you can provide a name and format parameters via `args`.
+ template<typename RegT, typename... Args>
+ ASMJIT_INLINE_NODEBUG RegT new_similar_reg(const RegT& ref, Args&&... args) {
+ RegT reg(Globals::NoInit);
+ (void)_new_reg<RegT>(Out(reg), ref, std::forward<Args>(args)...);
+ return reg;
+ }
+
+ //! Tests whether the given `virt_id` is a valid virtual register id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_virt_id_valid(uint32_t virt_id) const noexcept {
+ uint32_t index = Operand::virt_id_to_index(virt_id);
+ return index < _virt_regs.size();
+ }
+
+ //! Tests whether the given `reg` is a virtual register having a valid id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_virt_reg_valid(const Reg& reg) const noexcept {
+ return is_virt_id_valid(reg.id());
+ }
+
+ //! Returns \ref VirtReg associated with the given `virt_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE VirtReg* virt_reg_by_id(uint32_t virt_id) const noexcept {
+ ASMJIT_ASSERT(is_virt_id_valid(virt_id));
+ return _virt_regs[Operand::virt_id_to_index(virt_id)];
+ }
+
+ //! Returns \ref VirtReg associated with the given `reg`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG VirtReg* virt_reg_by_reg(const Reg& reg) const noexcept { return virt_reg_by_id(reg.id()); }
+
+ //! Returns \ref VirtReg associated with the given virtual register `index`.
+ //!
+ //! \note This is not the same as virtual register id. The conversion between id and its index is implemented
+ //! by \ref Operand_::virt_id_to_index() and \ref Operand_::virt_index_to_virt_id() functions.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG VirtReg* virt_reg_by_index(uint32_t index) const noexcept { return _virt_regs[index]; }
+
+ //! Returns an array of all virtual registers managed by the Compiler.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<VirtReg*> virt_regs() const noexcept { return _virt_regs.as_span(); }
+
+ //! \name Stack
+ //! \{
+
+ //! Creates a new stack of the given `size` and `alignment` and stores it to `out`.
+ //!
+ //! \note `name` can be used to give the stack a name, for debugging purposes.
+ ASMJIT_API Error _new_stack(Out<BaseMem> out, uint32_t size, uint32_t alignment, const char* name = nullptr);
+
+ //! Updates the stack size of a stack created by `_new_stack()` by its `virt_id`.
+ ASMJIT_API Error set_stack_size(uint32_t virt_id, uint32_t new_size, uint32_t new_alignment = 0);
+
+ //! Updates the stack size of a stack created by `_new_stack()`.
+ ASMJIT_INLINE_NODEBUG Error set_stack_size(const BaseMem& mem, uint32_t new_size, uint32_t new_alignment = 0) {
+ return set_stack_size(mem.id(), new_size, new_alignment);
+ }
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ //! Creates a new constant of the given `scope` (see \ref ConstPoolScope).
+ //!
+ //! This function adds a constant of the given `size` to the built-in \ref ConstPool and stores the reference to that
+ //! constant to the `out` operand.
+ ASMJIT_API Error _new_const(Out<BaseMem> out, ConstPoolScope scope, const void* data, size_t size);
+
+ //! \}
+
+ //! \name Miscellaneous
+ //! \{
+
+ //! Rename the given virtual register `reg` to a formatted string `fmt`.
+ ASMJIT_API void rename(const Reg& reg, const char* fmt, ...);
+
+ //! \}
+
+ //! \name Jump Annotations
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<JumpAnnotation*> jump_annotations() const noexcept { return _jump_annotations.as_span(); }
+
+ ASMJIT_API Error new_jump_node(Out<JumpNode*> out, InstId inst_id, InstOptions inst_options, const Operand_& o0, JumpAnnotation* annotation);
+ ASMJIT_API Error emit_annotated_jump(InstId inst_id, const Operand_& o0, JumpAnnotation* annotation);
+
+ //! Returns a new `JumpAnnotation` instance, which can be used to aggregate possible targets of a jump where the
+ //! target is not a label, for example to implement jump tables.
+ [[nodiscard]]
+ ASMJIT_API JumpAnnotation* new_jump_annotation();
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_reinit(CodeHolder& code) noexcept override;
+
+ //! \}
+};
+
+//! Jump annotation used to annotate jumps.
+//!
+//! \ref BaseCompiler allows to emit jumps where the target is either register or memory operand. Such jumps cannot be
+//! trivially inspected, so instead of doing heuristics AsmJit allows to annotate such jumps with possible targets.
+//! Register allocator then uses the annotation to construct control-flow, which is then used by liveness analysis and
+//! other tools to prepare ground for register allocation.
+class JumpAnnotation {
+public:
+ ASMJIT_NONCOPYABLE(JumpAnnotation)
+
+ //! \name Members
+ //! \{
+
+ //! Compiler that owns this JumpAnnotation.
+ BaseCompiler* _compiler;
+ //! Annotation identifier.
+ uint32_t _annotation_id;
+ //! Vector of label identifiers, see \ref label_ids().
+ ArenaVector<uint32_t> _label_ids;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG JumpAnnotation(BaseCompiler* ASMJIT_NONNULL(compiler), uint32_t annotation_id) noexcept
+ : _compiler(compiler),
+ _annotation_id(annotation_id) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the compiler that owns this JumpAnnotation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseCompiler* compiler() const noexcept { return _compiler; }
+
+ //! Returns the annotation id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t annotation_id() const noexcept { return _annotation_id; }
+
+ //! Returns a vector of label identifiers that lists all targets of the jump.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<uint32_t> label_ids() const noexcept { return _label_ids.as_span(); }
+
+ //! Tests whether the given `label` is a target of this JumpAnnotation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_label(const Label& label) const noexcept { return has_label_id(label.id()); }
+
+ //! Tests whether the given `label_id` is a target of this JumpAnnotation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_label_id(uint32_t label_id) const noexcept { return _label_ids.contains(label_id); }
+
+ //! \}
+
+ //! \name Annotation Building API
+ //! \{
+
+ //! Adds the `label` to the list of targets of this JumpAnnotation.
+ ASMJIT_INLINE_NODEBUG Error add_label(const Label& label) noexcept { return add_label_id(label.id()); }
+ //! Adds the `label_id` to the list of targets of this JumpAnnotation.
+ ASMJIT_INLINE_NODEBUG Error add_label_id(uint32_t label_id) noexcept { return _label_ids.append(_compiler->_builder_arena, label_id); }
+
+ //! \}
+};
+
+//! Jump instruction with \ref JumpAnnotation.
+//!
+//! \note This node should be only used to represent jump where the jump target cannot be deduced by examining
+//! instruction operands. For example if the jump target is register or memory location. This pattern is often
+//! used to perform indirect jumps that use jump table, e.g. to implement `switch{}` statement.
+class JumpNode : public InstNodeWithOperands<InstNode::kBaseOpCapacity> {
+public:
+ ASMJIT_NONCOPYABLE(JumpNode)
+
+ //! \name Members
+ //! \{
+
+ JumpAnnotation* _annotation;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline JumpNode(InstId inst_id, InstOptions options, uint32_t op_count, JumpAnnotation* annotation) noexcept
+ : InstNodeWithOperands(inst_id, options, op_count),
+ _annotation(annotation) {
+ _set_type(NodeType::kJump);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether this JumpNode has associated a \ref JumpAnnotation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_annotation() const noexcept { return _annotation != nullptr; }
+
+ //! Returns the \ref JumpAnnotation associated with this jump, or `nullptr`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG JumpAnnotation* annotation() const noexcept { return _annotation; }
+
+ //! Sets the \ref JumpAnnotation associated with this jump to `annotation`.
+ ASMJIT_INLINE_NODEBUG void set_annotation(JumpAnnotation* annotation) noexcept { _annotation = annotation; }
+
+ //! \}
+};
+
+//! Function node represents a function used by \ref BaseCompiler.
+//!
+//! A function is composed of the following:
+//!
+//! - Function entry, \ref FuncNode acts as a label, so the entry is implicit. To get the entry, simply use
+//! \ref FuncNode::label(), which is the same as \ref LabelNode::label().
+//!
+//! - Function exit, which is represented by \ref FuncNode::exit_node(). A helper function
+//! \ref FuncNode::exit_label() exists and returns an exit label instead of node.
+//!
+//! - Function \ref FuncNode::end_node() sentinel. This node marks the end of a function - there should be no
+//! code that belongs to the function after this node, but the Compiler doesn't enforce that at the moment.
+//!
+//! - Function detail, see \ref FuncNode::detail().
+//!
+//! - Function frame, see \ref FuncNode::frame().
+//!
+//! - Function arguments mapped to virtual registers, see \ref FuncNode::arg_packs().
+//!
+//! In a node list, the function and its body looks like the following:
+//!
+//! \code{.unparsed}
+//! [...] - Anything before the function.
+//!
+//! [FuncNode] - Entry point of the function, acts as a label as well.
+//! <Prolog> - Prolog inserted by the register allocator.
+//! {...} - Function body - user code basically.
+//! [ExitLabel] - Exit label
+//! <Epilog> - Epilog inserted by the register allocator.
+//! <Return> - Return inserted by the register allocator.
+//! {...} - Can contain data or user code (error handling, special cases, ...).
+//! [FuncEnd] - End sentinel
+//!
+//! [...] - Anything after the function.
+//! \endcode
+//!
+//! When a function is added to the instruction stream by \ref BaseCompiler::add_func() it actually inserts 3 nodes
+//! (FuncNode, ExitLabel, and FuncEnd) and sets the current cursor to be FuncNode. When \ref BaseCompiler::end_func()
+//! is called the cursor is set to FuncEnd. This guarantees that user can use ExitLabel as a marker after additional
+//! code or data can be placed, which is a common practice.
+class FuncNode : public LabelNode {
+public:
+ ASMJIT_NONCOPYABLE(FuncNode)
+
+ //! Arguments pack.
+ struct ArgPack {
+ RegOnly _data[Globals::kMaxValuePack];
+
+ ASMJIT_INLINE void reset() noexcept {
+ for (RegOnly& v : _data) {
+ v.reset();
+ }
+ }
+
+ ASMJIT_INLINE RegOnly& operator[](size_t value_index) noexcept { return _data[value_index]; }
+ ASMJIT_INLINE const RegOnly& operator[](size_t value_index) const noexcept { return _data[value_index]; }
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Function detail.
+ FuncDetail _func_detail;
+ //! Function frame.
+ FuncFrame _frame;
+ //! Function exit label.
+ LabelNode* _exit_node;
+ //! Function end (sentinel).
+ SentinelNode* _end;
+ //! Argument packs.
+ ArgPack* _args;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `FuncNode` instance.
+ //!
+ //! Always use `BaseCompiler::add_func()` to create a new `FuncNode`.
+ inline explicit FuncNode(uint32_t label_id = Globals::kInvalidId) noexcept
+ : LabelNode(label_id),
+ _func_detail(),
+ _frame(),
+ _exit_node(nullptr),
+ _end(nullptr),
+ _args(nullptr) {
+ _set_type(NodeType::kFunc);
+ }
+
+ //! \}
+
+ //! \{
+ //! \name Accessors
+
+ //! Returns function exit `LabelNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG LabelNode* exit_node() const noexcept { return _exit_node; }
+
+ //! Returns function exit label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label exit_label() const noexcept { return _exit_node->label(); }
+
+ //! Returns "End of Func" sentinel node.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SentinelNode* end_node() const noexcept { return _end; }
+
+ //! Returns function detail.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncDetail& detail() noexcept { return _func_detail; }
+
+ //! Returns function detail.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncDetail& detail() const noexcept { return _func_detail; }
+
+ //! Returns function frame.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncFrame& frame() noexcept { return _frame; }
+
+ //! Returns function frame.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncFrame& frame() const noexcept { return _frame; }
+
+ //! Returns function attributes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncAttributes attributes() const noexcept { return _frame.attributes(); }
+
+ //! Adds `attrs` to the function attributes.
+ ASMJIT_INLINE_NODEBUG void add_attributes(FuncAttributes attrs) noexcept { _frame.add_attributes(attrs); }
+
+ //! Returns arguments count.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t arg_count() const noexcept { return _func_detail.arg_count(); }
+
+ //! Returns argument packs.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArgPack* arg_packs() const noexcept { return _args; }
+
+ //! Tests whether the function has a return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_ret() const noexcept { return _func_detail.has_ret(); }
+
+ //! Returns argument pack at `arg_index`.
+ [[nodiscard]]
+ inline ArgPack& arg_pack(size_t arg_index) const noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ return _args[arg_index];
+ }
+
+ //! Sets argument at `arg_index`.
+ inline void set_arg(size_t arg_index, const Reg& virt_reg) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index][0].init(virt_reg);
+ }
+
+ //! \overload
+ inline void set_arg(size_t arg_index, const RegOnly& virt_reg) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index][0].init(virt_reg);
+ }
+
+ //! Sets argument at `arg_index` and `value_index`.
+ inline void set_arg(size_t arg_index, size_t value_index, const Reg& virt_reg) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index][value_index].init(virt_reg);
+ }
+
+ //! \overload
+ inline void set_arg(size_t arg_index, size_t value_index, const RegOnly& virt_reg) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index][value_index].init(virt_reg);
+ }
+
+ //! Resets argument pack at `arg_index`.
+ inline void reset_arg(size_t arg_index) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index].reset();
+ }
+
+ //! Resets argument pack at `arg_index`.
+ inline void reset_arg(size_t arg_index, size_t value_index) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index][value_index].reset();
+ }
+
+ //! \}
+};
+
+//! Function return, used by \ref BaseCompiler.
+class FuncRetNode : public InstNodeWithOperands<InstNode::kBaseOpCapacity> {
+public:
+ ASMJIT_NONCOPYABLE(FuncRetNode)
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `FuncRetNode` instance.
+ inline FuncRetNode() noexcept
+ : InstNodeWithOperands(BaseInst::kIdAbstract, InstOptions::kNone, 0) {
+ _node_type = NodeType::kFuncRet;
+ }
+
+ //! \}
+};
+
+//! Function invocation, used by \ref BaseCompiler.
+class InvokeNode : public InstNodeWithOperands<InstNode::kBaseOpCapacity> {
+public:
+ ASMJIT_NONCOPYABLE(InvokeNode)
+
+ //! Operand pack provides multiple operands that can be associated with a single return value of function
+ //! argument. Sometimes this is necessary to express an argument or return value that requires multiple
+ //! registers, for example 64-bit value in 32-bit mode or passing / returning homogeneous data structures.
+ struct OperandPack {
+ //! Operands.
+ Operand_ _data[Globals::kMaxValuePack];
+
+ //! Reset the pack by resetting all operands in the pack.
+ ASMJIT_INLINE void reset() noexcept {
+ for (Operand_& op : _data) {
+ op.reset();
+ }
+ }
+
+ //! Returns an operand at the given `value_index`.
+ [[nodiscard]]
+ ASMJIT_INLINE Operand& operator[](size_t value_index) noexcept {
+ ASMJIT_ASSERT(value_index < Globals::kMaxValuePack);
+
+ return _data[value_index].as<Operand>();
+ }
+
+ //! Returns an operand at the given `value_index` (const).
+ [[nodiscard]]
+ ASMJIT_INLINE const Operand& operator[](size_t value_index) const noexcept {
+ ASMJIT_ASSERT(value_index < Globals::kMaxValuePack);
+
+ return _data[value_index].as<Operand>();
+ }
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Function detail.
+ FuncDetail _func_detail;
+ //! Function return value(s).
+ OperandPack _rets;
+ //! Function arguments.
+ OperandPack* _args;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new `InvokeNode` instance.
+ inline InvokeNode(InstId inst_id, InstOptions options) noexcept
+ : InstNodeWithOperands(inst_id, options, 0),
+ _func_detail(),
+ _args(nullptr) {
+ _set_type(NodeType::kInvoke);
+ _reset_ops();
+ _rets.reset();
+ _add_flags(NodeFlags::kIsRemovable);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Sets the function signature.
+ [[nodiscard]]
+ inline Error init(const FuncSignature& signature, const Environment& environment) noexcept {
+ return _func_detail.init(signature, environment);
+ }
+
+ //! Returns the function detail.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncDetail& detail() noexcept { return _func_detail; }
+
+ //! Returns the function detail.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncDetail& detail() const noexcept { return _func_detail; }
+
+ //! Returns the target operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Operand& target() noexcept { return op(0); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Operand& target() const noexcept { return op(0); }
+
+ //! Returns the number of function return values.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_ret() const noexcept { return _func_detail.has_ret(); }
+
+ //! Returns the number of function arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t arg_count() const noexcept { return _func_detail.arg_count(); }
+
+ //! Returns operand pack representing function return value(s).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OperandPack& ret_pack() noexcept { return _rets; }
+
+ //! Returns operand pack representing function return value(s).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const OperandPack& ret_pack() const noexcept { return _rets; }
+
+ //! Returns the return value at the given `value_index`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Operand& ret(size_t value_index = 0) noexcept { return _rets[value_index]; }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Operand& ret(size_t value_index = 0) const noexcept { return _rets[value_index]; }
+
+ //! Returns operand pack representing function return value(s).
+ [[nodiscard]]
+ inline OperandPack& arg_pack(size_t arg_index) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ return _args[arg_index];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ inline const OperandPack& arg_pack(size_t arg_index) const noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ return _args[arg_index];
+ }
+
+ //! Returns a function argument at the given `arg_index`.
+ [[nodiscard]]
+ inline Operand& arg(size_t arg_index, size_t value_index) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ return _args[arg_index][value_index];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ inline const Operand& arg(size_t arg_index, size_t value_index) const noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ return _args[arg_index][value_index];
+ }
+
+ //! Sets the function return value at `i` to `op`.
+ inline void _set_ret(size_t value_index, const Operand_& op) noexcept { _rets[value_index] = op; }
+ //! Sets the function argument at `i` to `op`.
+ inline void _set_arg(size_t arg_index, size_t value_index, const Operand_& op) noexcept {
+ ASMJIT_ASSERT(arg_index < arg_count());
+ _args[arg_index][value_index] = op;
+ }
+
+ //! Sets the function return value at `value_index` to `reg`.
+ ASMJIT_INLINE_NODEBUG void set_ret(size_t value_index, const Reg& reg) noexcept { _set_ret(value_index, reg); }
+
+ //! Sets the first function argument in a value-pack at `arg_index` to `reg`.
+ ASMJIT_INLINE_NODEBUG void set_arg(size_t arg_index, const Reg& reg) noexcept { _set_arg(arg_index, 0, reg); }
+ //! Sets the first function argument in a value-pack at `arg_index` to `imm`.
+ ASMJIT_INLINE_NODEBUG void set_arg(size_t arg_index, const Imm& imm) noexcept { _set_arg(arg_index, 0, imm); }
+
+ //! Sets the function argument at `arg_index` and `value_index` to `reg`.
+ ASMJIT_INLINE_NODEBUG void set_arg(size_t arg_index, size_t value_index, const Reg& reg) noexcept { _set_arg(arg_index, value_index, reg); }
+ //! Sets the function argument at `arg_index` and `value_index` to `imm`.
+ ASMJIT_INLINE_NODEBUG void set_arg(size_t arg_index, size_t value_index, const Imm& imm) noexcept { _set_arg(arg_index, value_index, imm); }
+
+ //! \}
+};
+
+//! Function pass extends \ref Pass with \ref FuncPass::run_on_function().
+class ASMJIT_VIRTAPI FuncPass : public Pass {
+public:
+ ASMJIT_NONCOPYABLE(FuncPass)
+ using Base = Pass;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API FuncPass(BaseCompiler& cc, const char* name) noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the associated `BaseCompiler`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseCompiler& cc() const noexcept { return static_cast<BaseCompiler&>(_cb); }
+
+ //! \}
+
+ //! \name Pass Interface
+ //! \{
+
+ //! Calls `run_on_function()` on each `FuncNode` node found.
+ ASMJIT_API Error run(Arena& arena, Logger* logger) override;
+
+ //! Called once per `FuncNode`.
+ ASMJIT_API virtual Error run_on_function(Arena& arena, Logger* logger, FuncNode* func);
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/compilerdefs.h b/3rdparty/asmjit/asmjit/core/compilerdefs.h
new file mode 100644
index 00000000000..5c41c89963c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/compilerdefs.h
@@ -0,0 +1,247 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
+#define ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/arenastring.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+class RAWorkReg;
+
+//! \addtogroup asmjit_compiler
+//! \{
+
+//! Flags associated with a virtual register \ref VirtReg.
+enum class VirtRegFlags : uint8_t {
+ kNone = 0x00u,
+
+ //! True if this is a fixed register, never reallocated.
+ kIsFixed = 0x01u,
+
+ //! True if the virtual register is only used as a stack area (never accessed as register). Stack area is allocated
+ //! via \ref BaseCompiler::_new_stack() and then architecture dependent compilers like \ref x86::Compiler::new_stack().
+ kIsStackArea = 0x02u,
+
+ //! True if the virtual register has a stack slot.
+ //!
+ //! Stack slots are assigned by the register allocator - so initially when a \ref VirtReg is created this flag would
+ //! not be set. When a virtual register is spilled, stack slot is automatically created for the register and the
+ //! \ref VirtReg::_stack_offset member is updated. Stack areas will always have associated stack slot during register
+ //! allocation.
+ kHasStackSlot = 0x04u,
+
+ //! Virtual register `log2(alignment)` mask (for spilling) (3 bits in flags).
+ //!
+ //! \note For space purposes the alignment is stored as log2(alignment). So the alignment is `1 << log2(alignment)`.
+ kAlignmentLog2Mask = 0xE0u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(VirtRegFlags)
+
+//! Public virtual register interface, managed by \ref BaseCompiler.
+//!
+//! When a virtual register is created by \ref BaseCompiler a `VirtReg` is linked with the register operand id it
+//! returns. This `VirtReg` can be accessed via \ref BaseCompiler::virt_reg_by_reg() function, which returns a pointer
+//! to `VirtReg`.
+//!
+//! In general, `VirtReg` should be only introspected as it contains important variables that are needed and managed
+//! by AsmJit, however, the `VirtReg` API can also be used to influence register allocation. For example there is
+//! a \ref VirtReg::set_weight() function, which could be used to increase a weight of a virtual register (thus make
+//! it hard to spill, for example). In addition, there is a \ref VirtReg::set_home_id_hint() function, which can be used
+//! to do an initial assignment of a physical register of a virtual register. However, AsmJit could still override
+//! the physical register assigned in some special cases.
+class VirtReg {
+public:
+ ASMJIT_NONCOPYABLE(VirtReg)
+
+ //! \name Constants
+ //! \{
+
+ static constexpr inline uint32_t kAlignmentLog2Mask = uint32_t(VirtRegFlags::kAlignmentLog2Mask);
+ static constexpr inline uint32_t kAlignmentLog2Shift = Support::ctz_const<kAlignmentLog2Mask>;
+
+ static ASMJIT_INLINE_CONSTEXPR VirtRegFlags _flags_from_alignment_log2(uint32_t alignment_log2) noexcept {
+ return VirtRegFlags(alignment_log2 << kAlignmentLog2Shift);
+ }
+
+ static ASMJIT_INLINE_CONSTEXPR uint32_t _alignment_log2_from_flags(VirtRegFlags flags) noexcept {
+ return uint32_t(flags) >> kAlignmentLog2Shift;
+ }
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Virtual register id.
+ uint32_t _id = 0;
+ //! Virtual register size (can be smaller than a real register size if only a part of the register is used).
+ uint32_t _virt_size = 0;
+
+ //! Virtual register type.
+ RegType _reg_type = RegType::kNone;
+ //! Virtual register flags.
+ VirtRegFlags _reg_flags = VirtRegFlags::kNone;
+
+ //! Virtual register weight.
+ //!
+ //! Weight is used for alloc/spill decisions. Higher weight means a higher priority to keep the virtual
+ //! register always allocated as a physical register. The default weight is zero, which means standard
+ //! weight (no weight is added to the initial priority, which is calculated based on the number of uses
+ //! divided by the sum of widths of all live spans).
+ uint8_t _weight = 0;
+
+ //! Type id.
+ TypeId _type_id = TypeId::kVoid;
+
+ //! Home register hint for the register allocator (initially unassigned).
+ uint8_t _home_id_hint = Reg::kIdBad;
+
+ //! Stack offset assigned by the register allocator relative to stack pointer (can be negative as well).
+ int32_t _stack_offset = 0;
+
+ //! Virtual register name (either empty or user provided).
+ ArenaString<16> _name {};
+
+ // The following members are used exclusively by RAPass. They are initialized when the VirtReg is created to
+ // null pointers and then changed during RAPass execution. RAPass sets them back to NULL before it returns.
+
+ //! Reference to `RAWorkReg`, used during register allocation.
+ RAWorkReg* _work_reg = nullptr;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG VirtReg(RegType reg_type, VirtRegFlags reg_flags, uint32_t id, uint32_t virt_size, TypeId type_id) noexcept
+ : _id(id),
+ _virt_size(virt_size),
+ _reg_type(reg_type),
+ _reg_flags(reg_flags),
+ _type_id(type_id) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the virtual register id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; }
+
+ //! Returns a virtual register type (maps to the physical register type as well).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegType reg_type() const noexcept { return _reg_type; }
+
+ //! Returns a virtual register flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG VirtRegFlags reg_flags() const noexcept { return _reg_flags; }
+
+ //! Returns the virtual register size.
+ //!
+ //! The virtual register size describes how many bytes the virtual register needs to store its content. It can be
+ //! smaller than the physical register size, see `register_size()`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t virt_size() const noexcept { return _virt_size; }
+
+ //! Returns the virtual register alignment required for memory operations (load/spill).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return 1u << _alignment_log2_from_flags(_reg_flags); }
+
+ //! Returns the virtual register type id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG TypeId type_id() const noexcept { return _type_id; }
+
+ //! Returns the virtual register weight - the register allocator can use it as explicit hint for alloc/spill
+ //! decisions.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t weight() const noexcept { return _weight; }
+
+ //! Sets the virtual register weight (0 to 255) - the register allocator can use it as explicit hint for alloc/spill
+ //! decisions and initial bin-packing.
+ ASMJIT_INLINE_NODEBUG void set_weight(uint32_t weight) noexcept { _weight = uint8_t(weight); }
+
+ //! Returns whether the virtual register is always allocated to a fixed physical register (and never reallocated).
+ //!
+ //! \note This is only used for special purposes and it's mostly internal.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_fixed() const noexcept { return Support::test(_reg_flags, VirtRegFlags::kIsFixed); }
+
+ //! Tests whether the virtual register is in fact a stack that only uses the virtual register id.
+ //!
+ //! \note It's an error if a stack is accessed as a register.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_stack_area() const noexcept { return Support::test(_reg_flags, VirtRegFlags::kIsStackArea); }
+
+ //! Tests whether this virtual register (or stack) has assigned a stack offset.
+ //!
+ //! If this is a virtual register that was never allocated on stack, it would return false, otherwise if
+ //! it's a virtual register that was spilled or explicitly allocated stack, the return value would be true.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_stack_slot() const noexcept { return Support::test(_reg_flags, VirtRegFlags::kHasStackSlot); }
+
+ //! Assigns a stack offset of this virtual register to `stack_offset` and adds `VirtRegFlags::kHasStackSlot` flag.
+ ASMJIT_INLINE_NODEBUG void assign_stack_slot(int32_t stack_offset) noexcept {
+ _reg_flags |= VirtRegFlags::kHasStackSlot;
+ _stack_offset = stack_offset;
+ }
+
+ //! Tests whether this virtual register has assigned a physical register as a hint to the register allocator.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_home_id_hint() const noexcept { return _home_id_hint != Reg::kIdBad; }
+
+ //! Returns a physical register hint, which will be used by the register allocator.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t home_id_hint() const noexcept { return _home_id_hint; }
+
+ //! Assigns a physical register hint, which will be used by the register allocator.
+ ASMJIT_INLINE_NODEBUG void set_home_id_hint(uint32_t home_id) noexcept { _home_id_hint = uint8_t(home_id); }
+ //! Resets a physical register hint.
+ ASMJIT_INLINE_NODEBUG void reset_home_id_hint() noexcept { _home_id_hint = Reg::kIdBad; }
+
+ //! Returns a stack offset associated with a virtual register or explicit stack allocation.
+ //!
+ //! \note Always verify that the stack offset has been assigned by calling \ref has_stack_slot(). The return
+ //! value will be zero when the stack offset was not assigned.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG int32_t stack_offset() const noexcept { return _stack_offset; }
+
+ //! Returns the virtual register name.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.data(); }
+
+ //! Returns the size of the virtual register name.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t name_size() const noexcept { return _name.size(); }
+
+ //! Tests whether the virtual register has an associated `RAWorkReg` at the moment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_work_reg() const noexcept { return _work_reg != nullptr; }
+
+ //! Returns an associated RAWorkReg with this virtual register (only valid during register allocation).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAWorkReg* work_reg() const noexcept { return _work_reg; }
+
+ //! Associates a RAWorkReg with this virtual register (used by register allocator).
+ ASMJIT_INLINE_NODEBUG void set_work_reg(RAWorkReg* work_reg) noexcept { _work_reg = work_reg; }
+
+ //! Reset the RAWorkReg association (used by register allocator).
+ ASMJIT_INLINE_NODEBUG void reset_work_reg() noexcept { _work_reg = nullptr; }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
+
diff --git a/3rdparty/asmjit/asmjit/core/constpool.cpp b/3rdparty/asmjit/asmjit/core/constpool.cpp
new file mode 100644
index 00000000000..c3fe9945348
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/constpool.cpp
@@ -0,0 +1,371 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/constpool.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// ConstPool - Construction & Destruction
+// ======================================
+
+ConstPool::ConstPool(Arena& arena) noexcept : _arena(arena) {
+ reset();
+}
+
+ConstPool::~ConstPool() noexcept {}
+
+// ConstPool - Reset
+// =================
+
+void ConstPool::reset() noexcept {
+ size_t data_size = 1;
+
+ for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_tree); i++) {
+ _tree[i].reset();
+ _tree[i].set_data_size(data_size);
+ _gaps[i] = nullptr;
+ data_size <<= 1;
+ }
+
+ _gap_pool = nullptr;
+ _size = 0;
+ _alignment = 0;
+ _min_item_size = 0;
+}
+
+// ConstPool - Operations
+// ======================
+
+static inline ConstPool::Gap* ConstPool_allocGap(ConstPool* self) noexcept {
+ ConstPool::Gap* gap = self->_gap_pool;
+
+ if (!gap) {
+ return self->_arena.alloc_oneshot<ConstPool::Gap>();
+ }
+
+ self->_gap_pool = gap->_next;
+ return gap;
+}
+
+static inline void ConstPool_freeGap(ConstPool* self, ConstPool::Gap* gap) noexcept {
+ gap->_next = self->_gap_pool;
+ self->_gap_pool = gap;
+}
+
+static void ConstPool_addGap(ConstPool* self, size_t offset, size_t size) noexcept {
+ ASMJIT_ASSERT(size > 0);
+
+ while (size > 0) {
+ size_t gap_index;
+ size_t gap_size;
+
+ if (size >= 32 && Support::is_aligned<size_t>(offset, 32)) {
+ gap_index = ConstPool::kIndex32;
+ gap_size = 32;
+ }
+ else if (size >= 16 && Support::is_aligned<size_t>(offset, 16)) {
+ gap_index = ConstPool::kIndex16;
+ gap_size = 16;
+ }
+ else if (size >= 8 && Support::is_aligned<size_t>(offset, 8)) {
+ gap_index = ConstPool::kIndex8;
+ gap_size = 8;
+ }
+ else if (size >= 4 && Support::is_aligned<size_t>(offset, 4)) {
+ gap_index = ConstPool::kIndex4;
+ gap_size = 4;
+ }
+ else if (size >= 2 && Support::is_aligned<size_t>(offset, 2)) {
+ gap_index = ConstPool::kIndex2;
+ gap_size = 2;
+ }
+ else {
+ gap_index = ConstPool::kIndex1;
+ gap_size = 1;
+ }
+
+ // We don't have to check for errors here, if this failed nothing really happened (just the gap won't be
+ // visible) and it will fail again at place where the same check would generate \ref Error::kOutOfMemory error.
+ ConstPool::Gap* gap = ConstPool_allocGap(self);
+ if (!gap) {
+ return;
+ }
+
+ gap->_next = self->_gaps[gap_index];
+ self->_gaps[gap_index] = gap;
+
+ gap->_offset = offset;
+ gap->_size = gap_size;
+
+ offset += gap_size;
+ size -= gap_size;
+ }
+}
+
+Error ConstPool::add(const void* data, size_t size, Out<size_t> offset_out) noexcept {
+ constexpr size_t kMaxSize = size_t(1) << (kIndexCount - 1);
+
+ // Avoid sizes outside of the supported range.
+ if (ASMJIT_UNLIKELY(size == 0 || size > kMaxSize)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ size_t tree_index = Support::ctz(size);
+
+ // Avoid sizes, which are not aligned to power of 2.
+ if (ASMJIT_UNLIKELY((size_t(1) << tree_index) != size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ ConstPool::Node* node = _tree[tree_index].get(data);
+ if (node) {
+ offset_out = node->_offset;
+ return Error::kOk;
+ }
+
+ // Before incrementing the current offset try if there is a gap that can be used for the requested data.
+ size_t offset = ~size_t(0);
+ size_t gap_index = tree_index;
+
+ while (gap_index != kIndexCount - 1) {
+ ConstPool::Gap* gap = _gaps[tree_index];
+
+ // Check if there is a gap.
+ if (gap) {
+ size_t gap_offset = gap->_offset;
+ size_t gap_size = gap->_size;
+
+ // Destroy the gap for now.
+ _gaps[tree_index] = gap->_next;
+ ConstPool_freeGap(this, gap);
+
+ offset = gap_offset;
+ ASMJIT_ASSERT(Support::is_aligned<size_t>(offset, size));
+
+ gap_size -= size;
+ if (gap_size > 0) {
+ ConstPool_addGap(this, gap_offset, gap_size);
+ }
+ }
+
+ gap_index++;
+ }
+
+ if (offset == ~size_t(0)) {
+ // Get how many bytes have to be skipped so the address is aligned accordingly to the 'size'.
+ size_t diff = Support::align_up_diff<size_t>(_size, size);
+
+ if (diff != 0) {
+ ConstPool_addGap(this, _size, diff);
+ _size += diff;
+ }
+
+ offset = _size;
+ _size += size;
+ }
+
+ // Add the initial node to the right index.
+ node = ConstPool::Tree::new_node_t(_arena, data, size, offset, false);
+ if (ASMJIT_UNLIKELY(!node)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _tree[tree_index].insert(node);
+ _alignment = Support::max<size_t>(_alignment, size);
+
+ offset_out = offset;
+
+ // Now create a bunch of shared constants that are based on the data pattern. We stop at size 4,
+ // it probably doesn't make sense to split constants down to 1 byte.
+ size_t p_count = 1;
+ size_t smaller_size = size;
+
+ while (smaller_size > 4) {
+ p_count <<= 1;
+ smaller_size >>= 1;
+
+ ASMJIT_ASSERT(tree_index != 0);
+ tree_index--;
+
+ const uint8_t* data_ptr = static_cast<const uint8_t*>(data);
+ for (size_t i = 0; i < p_count; i++, data_ptr += smaller_size) {
+ node = _tree[tree_index].get(data_ptr);
+ if (node) {
+ continue;
+ }
+
+ node = ConstPool::Tree::new_node_t(_arena, data_ptr, smaller_size, offset + (i * smaller_size), true);
+ _tree[tree_index].insert(node);
+ }
+ }
+
+ _min_item_size = !_min_item_size ? size : Support::min(_min_item_size, size);
+ return Error::kOk;
+}
+
+// ConstPool - Reset
+// =================
+
+struct ConstPoolFill {
+ inline ConstPoolFill(uint8_t* dst, size_t data_size) noexcept :
+ _dst(dst),
+ _data_size(data_size) {}
+
+ inline void operator()(const ConstPool::Node* node) noexcept {
+ if (!node->_shared) {
+ memcpy(_dst + node->_offset, node->data(), _data_size);
+ }
+ }
+
+ uint8_t* _dst;
+ size_t _data_size;
+};
+
+void ConstPool::fill(void* dst) const noexcept {
+ // Clears possible gaps, asmjit should never emit garbage to the output.
+ memset(dst, 0, _size);
+
+ ConstPoolFill filler(static_cast<uint8_t*>(dst), 1);
+ for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_tree); i++) {
+ _tree[i].for_each(filler);
+ filler._data_size <<= 1;
+ }
+}
+
+// ConstPool - Tests
+// =================
+
+#if defined(ASMJIT_TEST)
+UNIT(const_pool) {
+ Arena arena(32u * 1024u);
+ ConstPool pool(arena);
+
+ uint32_t i;
+ uint32_t kCount = BrokenAPI::has_arg("--quick") ? 1000 : 1000000;
+
+ INFO("Adding %u constants to the pool", kCount);
+ {
+ size_t prev_offset;
+ size_t cur_offset;
+ uint64_t c = 0x0101010101010101u;
+
+ EXPECT_EQ(pool.add(&c, 8, Out(prev_offset)), Error::kOk);
+ EXPECT_EQ(prev_offset, 0u);
+
+ for (i = 1; i < kCount; i++) {
+ c++;
+ EXPECT_EQ(pool.add(&c, 8, Out(cur_offset)), Error::kOk);
+ EXPECT_EQ(prev_offset + 8, cur_offset);
+ EXPECT_EQ(pool.size(), (i + 1) * 8);
+ prev_offset = cur_offset;
+ }
+
+ EXPECT_EQ(pool.alignment(), 8u);
+ }
+
+ INFO("Retrieving %u constants from the pool", kCount);
+ {
+ uint64_t c = 0x0101010101010101u;
+
+ for (i = 0; i < kCount; i++) {
+ size_t offset;
+ EXPECT_EQ(pool.add(&c, 8, Out(offset)), Error::kOk);
+ EXPECT_EQ(offset, i * 8);
+ c++;
+ }
+ }
+
+ INFO("Checking if the constants were split into 4-byte patterns");
+ {
+ uint32_t c = 0x01010101u;
+ size_t offset;
+
+ EXPECT_EQ(pool.add(&c, 4, Out(offset)), Error::kOk);
+ EXPECT_EQ(offset, 0u);
+
+ // NOTE: We have to adjust the offset to successfully test this on big endian architectures.
+ size_t base_offset = size_t(Support::ByteOrder::kNative == Support::ByteOrder::kBE ? 4 : 0);
+
+ for (i = 1; i < kCount; i++) {
+ c++;
+ EXPECT_EQ(pool.add(&c, 4, Out(offset)), Error::kOk);
+ EXPECT_EQ(offset, base_offset + i * 8);
+ }
+ }
+
+ INFO("Adding 2 byte constant to misalign the current offset");
+ {
+ uint16_t c = 0xFFFF;
+ size_t offset;
+
+ EXPECT_EQ(pool.add(&c, 2, Out(offset)), Error::kOk);
+ EXPECT_EQ(offset, kCount * 8);
+ EXPECT_EQ(pool.alignment(), 8u);
+ }
+
+ INFO("Adding 8 byte constant to check if pool gets aligned again");
+ {
+ uint64_t c = 0xFFFFFFFFFFFFFFFFu;
+ size_t offset;
+
+ EXPECT_EQ(pool.add(&c, 8, Out(offset)), Error::kOk);
+ EXPECT_EQ(offset, kCount * 8 + 8u);
+ }
+
+ INFO("Adding 2 byte constant to verify the gap is filled");
+ {
+ uint16_t c = 0xFFFE;
+ size_t offset;
+
+ EXPECT_EQ(pool.add(&c, 2, Out(offset)), Error::kOk);
+ EXPECT_EQ(offset, kCount * 8 + 2);
+ EXPECT_EQ(pool.alignment(), 8u);
+ }
+
+ INFO("Checking reset functionality");
+ {
+ pool.reset();
+ arena.reset();
+
+ EXPECT_EQ(pool.size(), 0u);
+ EXPECT_EQ(pool.alignment(), 0u);
+ }
+
+ INFO("Checking pool alignment when combined constants are added");
+ {
+ uint8_t bytes[32] = { 0 };
+ size_t offset;
+
+ pool.add(bytes, 1, Out(offset));
+ EXPECT_EQ(pool.size(), 1u);
+ EXPECT_EQ(pool.alignment(), 1u);
+ EXPECT_EQ(offset, 0u);
+
+ pool.add(bytes, 2, Out(offset));
+ EXPECT_EQ(pool.size(), 4u);
+ EXPECT_EQ(pool.alignment(), 2u);
+ EXPECT_EQ(offset, 2u);
+
+ pool.add(bytes, 4, Out(offset));
+ EXPECT_EQ(pool.size(), 8u);
+ EXPECT_EQ(pool.alignment(), 4u);
+ EXPECT_EQ(offset, 4u);
+
+ pool.add(bytes, 4, Out(offset));
+ EXPECT_EQ(pool.size(), 8u);
+ EXPECT_EQ(pool.alignment(), 4u);
+ EXPECT_EQ(offset, 4u);
+
+ pool.add(bytes, 32, Out(offset));
+ EXPECT_EQ(pool.size(), 64u);
+ EXPECT_EQ(pool.alignment(), 32u);
+ EXPECT_EQ(offset, 32u);
+ }
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/constpool.h b/3rdparty/asmjit/asmjit/core/constpool.h
new file mode 100644
index 00000000000..3b90941fadf
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/constpool.h
@@ -0,0 +1,280 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_CONSTPOOL_H_INCLUDED
+#define ASMJIT_CORE_CONSTPOOL_H_INCLUDED
+
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenatree.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_utilities
+//! \{
+
+//! Constant pool scope.
+enum class ConstPoolScope : uint32_t {
+ //! Local constant, always embedded right after the current function.
+ kLocal = 0,
+ //! Global constant, embedded at the end of the currently compiled code.
+ kGlobal = 1,
+
+ //! Maximum value of `ConstPoolScope`.
+ kMaxValue = kGlobal
+};
+
+//! Constant pool.
+//!
+//! Constant pool is designed to hold 1, 2, 4, 8, 16, 32, and 64 byte constants. It's not designed to hold constants
+//! having arbitrary length like strings and arrays.
+class ConstPool {
+public:
+ ASMJIT_NONCOPYABLE(ConstPool)
+
+ //! \cond INTERNAL
+
+ //! Index of a given size in const-pool table.
+ enum Index : uint32_t {
+ kIndex1 = 0,
+ kIndex2 = 1,
+ kIndex4 = 2,
+ kIndex8 = 3,
+ kIndex16 = 4,
+ kIndex32 = 5,
+ kIndex64 = 6,
+ kIndexCount = 7
+ };
+
+ //! Arena-allocated const-pool gap created by two differently aligned constants.
+ struct Gap {
+ //! Pointer to the next gap
+ Gap* _next;
+ //! Offset of the gap.
+ size_t _offset;
+ //! Remaining bytes of the gap (basically a gap size).
+ size_t _size;
+ };
+
+ //! Arena-allocated const-pool node.
+ class Node : public ArenaTreeNodeT<Node> {
+ public:
+ ASMJIT_NONCOPYABLE(Node)
+
+ //! If this constant is shared with another.
+ uint32_t _shared : 1;
+ //! Data offset from the beginning of the pool.
+ uint32_t _offset;
+
+ ASMJIT_INLINE_NODEBUG Node(size_t offset, bool shared) noexcept
+ : ArenaTreeNodeT<Node>(),
+ _shared(shared),
+ _offset(uint32_t(offset)) {}
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG void* data() noexcept { return Support::offset_ptr<void>(this, sizeof(*this)); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const void* data() const noexcept { return Support::offset_ptr<void>(this, sizeof(*this)); }
+ };
+
+ //! Data comparer used internally.
+ class Compare {
+ public:
+ size_t _data_size;
+
+ ASMJIT_INLINE_NODEBUG Compare(size_t data_size) noexcept
+ : _data_size(data_size) {}
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG int operator()(const Node& a, const Node& b) const noexcept {
+ return ::memcmp(a.data(), b.data(), _data_size);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG int operator()(const Node& a, const void* data) const noexcept {
+ return ::memcmp(a.data(), data, _data_size);
+ }
+ };
+
+ //! Arena-allocated const-pool tree.
+ struct Tree {
+ //! RB tree.
+ ArenaTree<Node> _tree;
+ //! Size of the tree (number of nodes).
+ size_t _size;
+ //! Size of the data.
+ size_t _data_size;
+
+ ASMJIT_INLINE_NODEBUG explicit Tree(size_t data_size = 0) noexcept
+ : _tree(),
+ _size(0),
+ _data_size(data_size) {}
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _tree.reset();
+ _size = 0;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _size == 0; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ inline void set_data_size(size_t data_size) noexcept {
+ ASMJIT_ASSERT(is_empty());
+ _data_size = data_size;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Node* get(const void* data) noexcept {
+ Compare cmp(_data_size);
+ return _tree.get(data, cmp);
+ }
+
+ ASMJIT_INLINE_NODEBUG void insert(Node* node) noexcept {
+ Compare cmp(_data_size);
+ _tree.insert(node, cmp);
+ _size++;
+ }
+
+ template<typename Visitor>
+ inline void for_each(Visitor& visitor) const noexcept {
+ Node* node = _tree.root();
+ if (!node) return;
+
+ Node* stack[Globals::kMaxTreeHeight];
+ size_t top = 0;
+
+ for (;;) {
+ Node* left = node->left();
+ if (left != nullptr) {
+ ASMJIT_ASSERT(top != Globals::kMaxTreeHeight);
+ stack[top++] = node;
+
+ node = left;
+ continue;
+ }
+
+ for (;;) {
+ visitor(node);
+ node = node->right();
+
+ if (node != nullptr)
+ break;
+
+ if (top == 0)
+ return;
+
+ node = stack[--top];
+ }
+ }
+ }
+
+ [[nodiscard]]
+ static inline Node* new_node_t(Arena& arena, const void* data, size_t size, size_t offset, bool shared) noexcept {
+ Node* node = arena.alloc_oneshot<Node>(Arena::aligned_size(sizeof(Node) + size));
+
+ if (ASMJIT_UNLIKELY(!node)) {
+ return nullptr;
+ }
+
+ node = new(Support::PlacementNew{node}) Node(offset, shared);
+ memcpy(node->data(), data, size);
+ return node;
+ }
+ };
+
+ //! \endcond
+
+ //! \name Members
+ //! \{
+
+ //! Arena.
+ Arena& _arena;
+ //! Tree per size.
+ Tree _tree[kIndexCount];
+ //! Gaps per size.
+ Gap* _gaps[kIndexCount];
+ //! Gaps pool
+ Gap* _gap_pool;
+
+ //! Size of the pool (in bytes).
+ size_t _size;
+ //! Required pool alignment.
+ size_t _alignment;
+ //! Minimum item size in the pool.
+ size_t _min_item_size;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new constant pool that would use `arena` as a memory allocator.
+ ASMJIT_API explicit ConstPool(Arena& arena) noexcept;
+ //! Destroys this constant pool.
+ ASMJIT_API ~ConstPool() noexcept;
+
+ //! \}
+
+ //! \name Reset
+ //! \{
+
+ //! Resets this constant pool.
+ ASMJIT_API void reset() noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the constant-pool is empty.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _size == 0; }
+
+ //! Returns the size of the constant-pool in bytes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ //! Returns minimum alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t alignment() const noexcept { return _alignment; }
+
+ //! Returns the minimum size of all items added to the constant pool.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t min_item_size() const noexcept { return _min_item_size; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Adds a constant to the constant pool.
+ //!
+ //! The constant must have known size, which is 1, 2, 4, 8, 16 or 32 bytes. The constant is added to the pool only
+ //! if it doesn't not exist, otherwise cached value is returned.
+ //!
+ //! AsmJit is able to subdivide added constants, so for example if you add 8-byte constant 0x1122334455667788 it
+ //! will create the following slots:
+ //!
+ //! 8-byte: 0x1122334455667788
+ //! 4-byte: 0x11223344, 0x55667788
+ //!
+ //! The reason is that when combining MMX/SSE/AVX code some patterns are used frequently. However, AsmJit is not
+ //! able to reallocate a constant that has been already added. For example if you try to add 4-byte constant and
+ //! then 8-byte constant having the same 4-byte pattern as the previous one, two independent slots will be used.
+ ASMJIT_API Error add(const void* data, size_t size, Out<size_t> offset_out) noexcept;
+
+ //! Fills the destination with the content of this constant pool.
+ ASMJIT_API void fill(void* dst) const noexcept;
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_CONSTPOOL_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/cpuinfo.cpp b/3rdparty/asmjit/asmjit/core/cpuinfo.cpp
new file mode 100644
index 00000000000..5a9d839faf1
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/cpuinfo.cpp
@@ -0,0 +1,2386 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/support/support.h>
+
+#include <atomic>
+
+// Required by `__cpuidex()` and `_xgetbv()`.
+#if ASMJIT_ARCH_X86
+ #if defined(_MSC_VER)
+ #include <intrin.h>
+ #endif
+#endif // ASMJIT_ARCH_X86
+
+#if ASMJIT_ARCH_ARM
+ // Required by various utilities that are required by features detection.
+ #if !defined(_WIN32)
+ #include <errno.h>
+ #include <sys/utsname.h>
+ #endif
+
+ //! Required to detect CPU and features on Apple platforms.
+ #if defined(__APPLE__)
+ #include <mach/machine.h>
+ #include <sys/types.h>
+ #include <sys/sysctl.h>
+ #endif
+
+ #if (defined(__linux__) || defined(__FreeBSD__))
+ // Required by `getauxval()` on Linux and FreeBSD.
+ #include <sys/auxv.h>
+ #define ASMJIT_ARM_DETECT_VIA_HWCAPS
+ #endif
+
+ #if ASMJIT_ARCH_ARM >= 64 && defined(__GNUC__) && defined(__linux__) && 0
+ // This feature is disabled at the moment - it works, but it seems linux supports ARM features
+ // via HWCAPS pretty well and the most recent features need to access more registers that were
+ // not originally accessible, which would break on some systems.
+ #define ASMJIT_ARM_DETECT_VIA_CPUID
+ #endif
+
+ #if ASMJIT_ARCH_ARM >= 64 && defined(__OpenBSD__)
+ #include <machine/cpu.h>
+ #include <sys/sysctl.h>
+ #endif
+
+ #if ASMJIT_ARCH_ARM >= 64 && defined(__NetBSD__)
+ #include <sys/sysctl.h>
+ #endif
+
+#endif // ASMJIT_ARCH_ARM
+
+#if !defined(_WIN32) && (ASMJIT_ARCH_X86 || ASMJIT_ARCH_ARM)
+ #include <unistd.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+// CpuInfo - Detect - Compatibility
+// ================================
+
+// CPU features detection is a minefield on non-X86 platforms. The following list describes which
+// operating systems and architectures are supported and the status of the implementation:
+//
+// * X86|X86_64:
+// - All OSes supported
+// - Detection is based on using a CPUID instruction, which is a user-space instruction, so there
+// is no need to use any OS specific APIs or syscalls to detect all features provided by the CPU.
+//
+// * ARM32:
+// - Linux - HWCAPS based detection.
+// - FreeBSD - HWCAPS based detection (shared with Linux code).
+// - NetBSD - NOT IMPLEMENTED!
+// - OpenBSD - NOT IMPLEMENTED!
+// - Apple - sysctlbyname() based detection (this architecture is deprecated on Apple HW).
+// - Windows - IsProcessorFeaturePresent() based detection (only detects a subset of features).
+// - Others - NOT IMPLEMENTED!
+//
+// * ARM64:
+// - Linux - HWCAPS and CPUID based detection.
+// - FreeBSD - HWCAPS and CPUID based detection (shared with Linux code).
+// - NetBSD - CPUID based detection (reading CPUID via sysctl's cpu0 info)
+// - OpenBSD - CPUID based detection (reading CPUID via sysctl's CTL_MACHDEP).
+// - Apple - sysctlbyname() based detection with FamilyId matrix (record for each family id).
+// - Windows - IsProcessorFeaturePresent() based detection (only detects a subset of features).
+// - Others - NOT IMPLEMENTED!
+//
+// * Others
+// - NOT IMPLEMENTED!
+
+// CpuInfo - Detect - HW-Thread Count
+// ==================================
+
+#if defined(_WIN32)
+static inline uint32_t detect_hw_thread_count() noexcept {
+ SYSTEM_INFO info;
+ ::GetSystemInfo(&info);
+ return info.dwNumberOfProcessors;
+}
+#elif defined(_SC_NPROCESSORS_ONLN)
+static inline uint32_t detect_hw_thread_count() noexcept {
+ long res = ::sysconf(_SC_NPROCESSORS_ONLN);
+ return res <= 0 ? uint32_t(1) : uint32_t(res);
+}
+#else
+static inline uint32_t detect_hw_thread_count() noexcept {
+ return 1;
+}
+#endif
+
+// CpuInfo - Detect - X86
+// ======================
+
+// X86 and X86_64 detection is based on CPUID.
+
+#if ASMJIT_ARCH_X86
+
+namespace x86 {
+
+using Ext = CpuFeatures::X86;
+
+struct cpuid_t { uint32_t eax, ebx, ecx, edx; };
+struct xgetbv_t { uint32_t eax, edx; };
+
+// Executes `cpuid` instruction.
+static inline void cpuid_query(cpuid_t* out, uint32_t in_eax, uint32_t in_ecx = 0) noexcept {
+#if defined(_MSC_VER)
+ __cpuidex(reinterpret_cast<int*>(out), in_eax, in_ecx);
+#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 32
+ __asm__ __volatile__(
+ "mov %%ebx, %%edi\n"
+ "cpuid\n"
+ "xchg %%edi, %%ebx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(in_eax), "c"(in_ecx));
+#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 64
+ __asm__ __volatile__(
+ "mov %%rbx, %%rdi\n"
+ "cpuid\n"
+ "xchg %%rdi, %%rbx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(in_eax), "c"(in_ecx));
+#else
+ #error "[asmjit] x86::cpuid_query() - Unsupported compiler."
+#endif
+}
+
+// Executes 'xgetbv' instruction.
+static inline void xgetbv_query(xgetbv_t* out, uint32_t in_ecx) noexcept {
+#if defined(_MSC_VER)
+ uint64_t value = _xgetbv(in_ecx);
+ out->eax = uint32_t(value & 0xFFFFFFFFu);
+ out->edx = uint32_t(value >> 32);
+#elif defined(__GNUC__)
+ uint32_t out_eax;
+ uint32_t out_edx;
+
+ // Replaced, because the world is not perfect:
+ // __asm__ __volatile__("xgetbv" : "=a"(out_eax), "=d"(out_edx) : "c"(in_ecx));
+ __asm__ __volatile__(".byte 0x0F, 0x01, 0xD0" : "=a"(out_eax), "=d"(out_edx) : "c"(in_ecx));
+
+ out->eax = out_eax;
+ out->edx = out_edx;
+#else
+ out->eax = 0;
+ out->edx = 0;
+#endif
+}
+
+// Map a 12-byte vendor string returned by `cpuid` into a `CpuInfo::Vendor` ID.
+static inline void simplify_cpu_vendor(CpuInfo& cpu, uint32_t d0, uint32_t d1, uint32_t d2) noexcept {
+ struct Vendor {
+ char normalized[8];
+ union { char text[12]; uint32_t d[3]; };
+ };
+
+ static const Vendor table[] = {
+ { { 'A', 'M', 'D' }, {{ 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' }} },
+ { { 'I', 'N', 'T', 'E', 'L' }, {{ 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' }} },
+ { { 'V', 'I', 'A' }, {{ 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' }} },
+ { { 'V', 'I', 'A' }, {{ 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 }} },
+ { { 'U', 'N', 'K', 'N', 'O', 'W', 'N' }, {{ 0 }} }
+ };
+
+ uint32_t i;
+ for (i = 0; i < ASMJIT_ARRAY_SIZE(table) - 1; i++) {
+ if (table[i].d[0] == d0 && table[i].d[1] == d1 && table[i].d[2] == d2) {
+ break;
+ }
+ }
+ memcpy(cpu._vendor.str, table[i].normalized, 8);
+}
+
+static ASMJIT_FAVOR_SIZE void simplify_cpu_brand(char* s) noexcept {
+ char* d = s;
+
+ char c = s[0];
+ char prev = 0;
+
+ // Used to always clear the current character to ensure that the result
+ // doesn't contain garbage after a new null terminator is placed at the end.
+ s[0] = '\0';
+
+ for (;;) {
+ if (!c) {
+ break;
+ }
+
+ if (!(c == ' ' && (prev == '@' || s[1] == ' ' || s[1] == '@' || s[1] == '\0'))) {
+ *d++ = c;
+ prev = c;
+ }
+
+ c = *++s;
+ s[0] = '\0';
+ }
+
+ d[0] = '\0';
+}
+
+static ASMJIT_FAVOR_SIZE void detect_x86_cpu(CpuInfo& cpu) noexcept {
+ using Support::bit_test;
+
+ cpuid_t regs;
+ xgetbv_t xcr0 { 0, 0 };
+ CpuFeatures::X86& features = cpu.features().x86();
+
+ cpu._was_detected = true;
+ cpu._max_logical_processors = 1;
+
+ // We are gonna execute CPUID, which was introduced by I486, so it's the requirement.
+ features.add(Ext::kI486);
+
+ // CPUID EAX=0x00 (Basic CPUID Information)
+ // ----------------------------------------
+
+ // Get vendor string/id.
+ cpuid_query(&regs, 0x0);
+
+ uint32_t max_id = regs.eax;
+ uint32_t max_sub_leaf_id_0x7 = 0;
+
+ simplify_cpu_vendor(cpu, regs.ebx, regs.edx, regs.ecx);
+
+ // CPUID EAX=0x01 (Basic CPUID Information)
+ // ----------------------------------------
+
+ if (max_id >= 0x01u) {
+ // Get feature flags in ECX/EDX and family/model in EAX.
+ cpuid_query(&regs, 0x1);
+
+ // Fill family and model fields.
+ uint32_t model_id = (regs.eax >> 4) & 0x0F;
+ uint32_t family_id = (regs.eax >> 8) & 0x0F;
+
+ // Use extended family and model fields.
+ if (family_id == 0x06u || family_id == 0x0Fu) {
+ model_id += (((regs.eax >> 16) & 0x0Fu) << 4);
+ }
+
+ if (family_id == 0x0Fu) {
+ family_id += ((regs.eax >> 20) & 0xFFu);
+ }
+
+ cpu._model_id = model_id;
+ cpu._family_id = family_id;
+ cpu._brand_id = (regs.ebx) & 0xFF;
+ cpu._processor_type = (regs.eax >> 12) & 0x03;
+ cpu._max_logical_processors = (regs.ebx >> 16) & 0xFF;
+ cpu._stepping = (regs.eax) & 0x0F;
+ cpu._cache_line_size = ((regs.ebx >> 8) & 0xFF) * 8;
+
+ features.add_if(bit_test(regs.ecx, 0), Ext::kSSE3);
+ features.add_if(bit_test(regs.ecx, 1), Ext::kPCLMULQDQ);
+ features.add_if(bit_test(regs.ecx, 3), Ext::kMONITOR);
+ features.add_if(bit_test(regs.ecx, 5), Ext::kVMX);
+ features.add_if(bit_test(regs.ecx, 6), Ext::kSMX);
+ features.add_if(bit_test(regs.ecx, 9), Ext::kSSSE3);
+ features.add_if(bit_test(regs.ecx, 13), Ext::kCMPXCHG16B);
+ features.add_if(bit_test(regs.ecx, 19), Ext::kSSE4_1);
+ features.add_if(bit_test(regs.ecx, 20), Ext::kSSE4_2);
+ features.add_if(bit_test(regs.ecx, 22), Ext::kMOVBE);
+ features.add_if(bit_test(regs.ecx, 23), Ext::kPOPCNT);
+ features.add_if(bit_test(regs.ecx, 25), Ext::kAESNI);
+ features.add_if(bit_test(regs.ecx, 26), Ext::kXSAVE);
+ features.add_if(bit_test(regs.ecx, 27), Ext::kOSXSAVE);
+ features.add_if(bit_test(regs.ecx, 30), Ext::kRDRAND);
+ features.add_if(bit_test(regs.edx, 0), Ext::kFPU);
+ features.add_if(bit_test(regs.edx, 4), Ext::kRDTSC);
+ features.add_if(bit_test(regs.edx, 5), Ext::kMSR);
+ features.add_if(bit_test(regs.edx, 8), Ext::kCMPXCHG8B);
+ features.add_if(bit_test(regs.edx, 15), Ext::kCMOV);
+ features.add_if(bit_test(regs.edx, 19), Ext::kCLFLUSH);
+ features.add_if(bit_test(regs.edx, 23), Ext::kMMX);
+ features.add_if(bit_test(regs.edx, 24), Ext::kFXSR);
+ features.add_if(bit_test(regs.edx, 25), Ext::kSSE, Ext::kMMX2);
+ features.add_if(bit_test(regs.edx, 26), Ext::kSSE2, Ext::kSSE);
+ features.add_if(bit_test(regs.edx, 28), Ext::kMT);
+
+ // Get the content of XCR0 if supported by the CPU and enabled by the OS.
+ if (features.has_xsave() && features.has_osxsave()) {
+ xgetbv_query(&xcr0, 0);
+ }
+
+ // Detect AVX+.
+ if (bit_test(regs.ecx, 28)) {
+ // - XCR0[2:1] == 11b
+ // XMM & YMM states need to be enabled by OS.
+ if ((xcr0.eax & 0x00000006u) == 0x00000006u) {
+ features.add(Ext::kAVX);
+ features.add_if(bit_test(regs.ecx, 12), Ext::kFMA);
+ features.add_if(bit_test(regs.ecx, 29), Ext::kF16C);
+ }
+ }
+ }
+
+ constexpr uint32_t kXCR0_AMX_Bits = 0x3u << 17;
+ bool amx_enabled = (xcr0.eax & kXCR0_AMX_Bits) == kXCR0_AMX_Bits;
+
+#if defined(__APPLE__)
+ // Apple platform provides on-demand AVX512 support. When an AVX512 instruction is used the first time it results
+ // in #UD, which would cause the thread being promoted to use AVX512 support by the OS in addition to enabling the
+ // necessary bits in XCR0 register.
+ bool avx512_enabled = true;
+#else
+ // - XCR0[2:1] == 11b - XMM/YMM states need to be enabled by OS.
+ // - XCR0[7:5] == 111b - Upper 256-bit of ZMM0-XMM15 and ZMM16-ZMM31 need to be enabled by OS.
+ constexpr uint32_t kXCR0_AVX512_Bits = (0x3u << 1) | (0x7u << 5);
+ bool avx512_enabled = (xcr0.eax & kXCR0_AVX512_Bits) == kXCR0_AVX512_Bits;
+#endif
+
+ bool avx10_enabled = false;
+
+ // CPUID EAX=0x07 ECX=0 (Structured Extended Feature Flags Enumeration Leaf)
+ // -------------------------------------------------------------------------
+
+ if (max_id >= 0x07u) {
+ cpuid_query(&regs, 0x7);
+
+ max_sub_leaf_id_0x7 = regs.eax;
+
+ features.add_if(bit_test(regs.ebx, 0), Ext::kFSGSBASE);
+ features.add_if(bit_test(regs.ebx, 3), Ext::kBMI);
+ features.add_if(bit_test(regs.ebx, 7), Ext::kSMEP);
+ features.add_if(bit_test(regs.ebx, 8), Ext::kBMI2);
+ features.add_if(bit_test(regs.ebx, 9), Ext::kERMS);
+ features.add_if(bit_test(regs.ebx, 18), Ext::kRDSEED);
+ features.add_if(bit_test(regs.ebx, 19), Ext::kADX);
+ features.add_if(bit_test(regs.ebx, 20), Ext::kSMAP);
+ features.add_if(bit_test(regs.ebx, 23), Ext::kCLFLUSHOPT);
+ features.add_if(bit_test(regs.ebx, 24), Ext::kCLWB);
+ features.add_if(bit_test(regs.ebx, 29), Ext::kSHA);
+ features.add_if(bit_test(regs.ecx, 0), Ext::kPREFETCHWT1);
+ features.add_if(bit_test(regs.ecx, 4), Ext::kOSPKE);
+ features.add_if(bit_test(regs.ecx, 5), Ext::kWAITPKG);
+ features.add_if(bit_test(regs.ecx, 7), Ext::kCET_SS);
+ features.add_if(bit_test(regs.ecx, 8), Ext::kGFNI);
+ features.add_if(bit_test(regs.ecx, 9), Ext::kVAES);
+ features.add_if(bit_test(regs.ecx, 10), Ext::kVPCLMULQDQ);
+ features.add_if(bit_test(regs.ecx, 22), Ext::kRDPID);
+ features.add_if(bit_test(regs.ecx, 23), Ext::kKL);
+ features.add_if(bit_test(regs.ecx, 25), Ext::kCLDEMOTE);
+ features.add_if(bit_test(regs.ecx, 27), Ext::kMOVDIRI);
+ features.add_if(bit_test(regs.ecx, 28), Ext::kMOVDIR64B);
+ features.add_if(bit_test(regs.ecx, 29), Ext::kENQCMD);
+ features.add_if(bit_test(regs.edx, 4), Ext::kFSRM);
+ features.add_if(bit_test(regs.edx, 5), Ext::kUINTR);
+ features.add_if(bit_test(regs.edx, 14), Ext::kSERIALIZE);
+ features.add_if(bit_test(regs.edx, 16), Ext::kTSXLDTRK);
+ features.add_if(bit_test(regs.edx, 18), Ext::kPCONFIG);
+ features.add_if(bit_test(regs.edx, 20), Ext::kCET_IBT);
+
+ if (bit_test(regs.ebx, 5) && features.has_avx()) {
+ features.add(Ext::kAVX2);
+ }
+
+ if (avx512_enabled && bit_test(regs.ebx, 16)) {
+ features.add(Ext::kAVX512_F);
+
+ features.add_if(bit_test(regs.ebx, 17), Ext::kAVX512_DQ);
+ features.add_if(bit_test(regs.ebx, 21), Ext::kAVX512_IFMA);
+ features.add_if(bit_test(regs.ebx, 28), Ext::kAVX512_CD);
+ features.add_if(bit_test(regs.ebx, 30), Ext::kAVX512_BW);
+ features.add_if(bit_test(regs.ebx, 31), Ext::kAVX512_VL);
+ features.add_if(bit_test(regs.ecx, 1), Ext::kAVX512_VBMI);
+ features.add_if(bit_test(regs.ecx, 6), Ext::kAVX512_VBMI2);
+ features.add_if(bit_test(regs.ecx, 11), Ext::kAVX512_VNNI);
+ features.add_if(bit_test(regs.ecx, 12), Ext::kAVX512_BITALG);
+ features.add_if(bit_test(regs.ecx, 14), Ext::kAVX512_VPOPCNTDQ);
+ features.add_if(bit_test(regs.edx, 8), Ext::kAVX512_VP2INTERSECT);
+ features.add_if(bit_test(regs.edx, 23), Ext::kAVX512_FP16);
+ }
+
+ if (amx_enabled) {
+ features.add_if(bit_test(regs.edx, 22), Ext::kAMX_BF16);
+ features.add_if(bit_test(regs.edx, 24), Ext::kAMX_TILE);
+ features.add_if(bit_test(regs.edx, 25), Ext::kAMX_INT8);
+ }
+ }
+
+ // CPUID EAX=0x07 ECX=1 (Structured Extended Feature Enumeration Sub-leaf)
+ // -----------------------------------------------------------------------
+
+ if (max_sub_leaf_id_0x7 >= 1) {
+ cpuid_query(&regs, 0x7, 1);
+
+ features.add_if(bit_test(regs.eax, 0), Ext::kSHA512);
+ features.add_if(bit_test(regs.eax, 1), Ext::kSM3);
+ features.add_if(bit_test(regs.eax, 2), Ext::kSM4);
+ features.add_if(bit_test(regs.eax, 3), Ext::kRAO_INT);
+ features.add_if(bit_test(regs.eax, 7), Ext::kCMPCCXADD);
+ features.add_if(bit_test(regs.eax, 10), Ext::kFZRM);
+ features.add_if(bit_test(regs.eax, 11), Ext::kFSRS);
+ features.add_if(bit_test(regs.eax, 12), Ext::kFSRC);
+ features.add_if(bit_test(regs.eax, 19), Ext::kWRMSRNS);
+ features.add_if(bit_test(regs.eax, 22), Ext::kHRESET);
+ features.add_if(bit_test(regs.eax, 26), Ext::kLAM);
+ features.add_if(bit_test(regs.eax, 27), Ext::kMSRLIST);
+ features.add_if(bit_test(regs.eax, 31), Ext::kMOVRS);
+ features.add_if(bit_test(regs.ecx, 5), Ext::kMSR_IMM);
+ features.add_if(bit_test(regs.ebx, 1), Ext::kTSE);
+ features.add_if(bit_test(regs.edx, 14), Ext::kPREFETCHI);
+ features.add_if(bit_test(regs.edx, 18), Ext::kCET_SSS);
+ features.add_if(bit_test(regs.edx, 21), Ext::kAPX_F);
+
+ if (features.has_avx2()) {
+ features.add_if(bit_test(regs.eax, 4), Ext::kAVX_VNNI);
+ features.add_if(bit_test(regs.eax, 23), Ext::kAVX_IFMA);
+ features.add_if(bit_test(regs.edx, 4), Ext::kAVX_VNNI_INT8);
+ features.add_if(bit_test(regs.edx, 5), Ext::kAVX_NE_CONVERT);
+ features.add_if(bit_test(regs.edx, 10), Ext::kAVX_VNNI_INT16);
+ }
+
+ if (features.has_avx512_f()) {
+ features.add_if(bit_test(regs.eax, 5), Ext::kAVX512_BF16);
+ }
+
+ if (features.has_avx512_f()) {
+ avx10_enabled = Support::bit_test(regs.edx, 19);
+ }
+
+ if (amx_enabled) {
+ features.add_if(bit_test(regs.eax, 21), Ext::kAMX_FP16);
+ features.add_if(bit_test(regs.edx, 8), Ext::kAMX_COMPLEX);
+ }
+ }
+
+ // CPUID EAX=0x0D ECX=1 (Processor Extended State Enumeration Sub-leaf)
+ // --------------------------------------------------------------------
+
+ if (max_id >= 0x0Du) {
+ cpuid_query(&regs, 0xD, 1);
+
+ features.add_if(bit_test(regs.eax, 0), Ext::kXSAVEOPT);
+ features.add_if(bit_test(regs.eax, 1), Ext::kXSAVEC);
+ features.add_if(bit_test(regs.eax, 3), Ext::kXSAVES);
+ }
+
+ // CPUID EAX=0x0E ECX=0 (Processor Trace Enumeration Main Leaf)
+ // ------------------------------------------------------------
+
+ if (max_id >= 0x0Eu) {
+ cpuid_query(&regs, 0x0E, 0);
+
+ features.add_if(bit_test(regs.ebx, 4), Ext::kPTWRITE);
+ }
+
+ // CPUID EAX=0x19 ECX=0 (Key Locker Leaf)
+ // --------------------------------------
+
+ if (max_id >= 0x19u && features.has_kl()) {
+ cpuid_query(&regs, 0x19, 0);
+
+ features.add_if(bit_test(regs.ebx, 0), Ext::kAESKLE);
+ features.add_if(bit_test(regs.ebx, 0) && bit_test(regs.ebx, 2), Ext::kAESKLEWIDE_KL);
+ }
+
+ // CPUID EAX=0x1E ECX=1 (TMUL Information Sub-leaf)
+ // ------------------------------------------------
+
+ if (max_id >= 0x1Eu && features.has_amx_tile()) {
+ cpuid_query(&regs, 0x1E, 1);
+
+ // NOTE: Some AMX flags are mirrored here from CPUID[0x07, 0x00].
+ features.add_if(bit_test(regs.eax, 0), Ext::kAMX_INT8);
+ features.add_if(bit_test(regs.eax, 1), Ext::kAMX_BF16);
+ features.add_if(bit_test(regs.eax, 2), Ext::kAMX_COMPLEX);
+ features.add_if(bit_test(regs.eax, 3), Ext::kAMX_FP16);
+ features.add_if(bit_test(regs.eax, 4), Ext::kAMX_FP8);
+ features.add_if(bit_test(regs.eax, 5), Ext::kAMX_TRANSPOSE);
+ features.add_if(bit_test(regs.eax, 6), Ext::kAMX_TF32);
+ features.add_if(bit_test(regs.eax, 7), Ext::kAMX_AVX512);
+ features.add_if(bit_test(regs.eax, 8), Ext::kAMX_MOVRS);
+ }
+
+ // CPUID EAX=0x24 ECX=0 (AVX10 Information)
+ // ----------------------------------------
+
+ if (max_id >= 0x24u && avx10_enabled) {
+ // EAX output is the maximum supported sub-leaf.
+ cpuid_query(&regs, 0x24, 0);
+
+ // AVX10 Converged Vector ISA version.
+ uint32_t ver = regs.ebx & 0xFFu;
+
+ features.add_if(ver >= 1u, Ext::kAVX10_1);
+ features.add_if(ver >= 2u, Ext::kAVX10_2);
+ }
+
+ // CPUID EAX=0x80000000...max_id
+ // ----------------------------
+
+ max_id = 0x80000000u;
+ uint32_t i = max_id;
+
+ // The highest EAX that we understand.
+ constexpr uint32_t kHighestProcessedEAX = 0x8000001Fu;
+
+ // Several CPUID calls are required to get the whole brand string. It's easier
+ // to copy one DWORD at a time instead of copying the string a byte by byte.
+ uint32_t* brand = cpu._brand.u32;
+ do {
+ cpuid_query(&regs, i);
+ switch (i) {
+ case 0x80000000u:
+ max_id = Support::min<uint32_t>(regs.eax, kHighestProcessedEAX);
+ break;
+
+ case 0x80000001u:
+ features.add_if(bit_test(regs.ecx, 0), Ext::kLAHFSAHF);
+ features.add_if(bit_test(regs.ecx, 2), Ext::kSVM);
+ features.add_if(bit_test(regs.ecx, 5), Ext::kLZCNT);
+ features.add_if(bit_test(regs.ecx, 6), Ext::kSSE4A);
+ features.add_if(bit_test(regs.ecx, 7), Ext::kMSSE);
+ features.add_if(bit_test(regs.ecx, 8), Ext::kPREFETCHW);
+ features.add_if(bit_test(regs.ecx, 12), Ext::kSKINIT);
+ features.add_if(bit_test(regs.ecx, 15), Ext::kLWP);
+ features.add_if(bit_test(regs.ecx, 21), Ext::kTBM);
+ features.add_if(bit_test(regs.ecx, 29), Ext::kMONITORX);
+ features.add_if(bit_test(regs.edx, 20), Ext::kNX);
+ features.add_if(bit_test(regs.edx, 21), Ext::kFXSROPT);
+ features.add_if(bit_test(regs.edx, 22), Ext::kMMX2);
+ features.add_if(bit_test(regs.edx, 27), Ext::kRDTSCP);
+ features.add_if(bit_test(regs.edx, 29), Ext::kPREFETCHW);
+ features.add_if(bit_test(regs.edx, 30), Ext::k3DNOW2, Ext::kMMX2);
+ features.add_if(bit_test(regs.edx, 31), Ext::kPREFETCHW);
+
+ if (features.has_avx()) {
+ features.add_if(bit_test(regs.ecx, 11), Ext::kXOP);
+ features.add_if(bit_test(regs.ecx, 16), Ext::kFMA4);
+ }
+
+ // This feature seems to be only supported by AMD.
+ if (cpu.is_vendor("AMD")) {
+ features.add_if(bit_test(regs.ecx, 4), Ext::kALTMOVCR8);
+ }
+ break;
+
+ case 0x80000002u:
+ case 0x80000003u:
+ case 0x80000004u:
+ *brand++ = regs.eax;
+ *brand++ = regs.ebx;
+ *brand++ = regs.ecx;
+ *brand++ = regs.edx;
+
+ // Go directly to the next one we are interested in.
+ if (i == 0x80000004u)
+ i = 0x80000008u - 1;
+ break;
+
+ case 0x80000008u:
+ features.add_if(bit_test(regs.ebx, 0), Ext::kCLZERO);
+ features.add_if(bit_test(regs.ebx, 0), Ext::kRDPRU);
+ features.add_if(bit_test(regs.ebx, 8), Ext::kMCOMMIT);
+ features.add_if(bit_test(regs.ebx, 9), Ext::kWBNOINVD);
+
+ // Go directly to the next one we are interested in.
+ i = 0x8000001Fu - 1;
+ break;
+
+ case 0x8000001Fu:
+ features.add_if(bit_test(regs.eax, 0), Ext::kSME);
+ features.add_if(bit_test(regs.eax, 1), Ext::kSEV);
+ features.add_if(bit_test(regs.eax, 3), Ext::kSEV_ES);
+ features.add_if(bit_test(regs.eax, 4), Ext::kSEV_SNP);
+ features.add_if(bit_test(regs.eax, 6), Ext::kRMPQUERY);
+ break;
+ }
+ } while (++i <= max_id);
+
+ // Simplify CPU brand string a bit by removing some unnecessary spaces.
+ simplify_cpu_brand(cpu._brand.str);
+}
+
+static ASMJIT_FAVOR_SIZE CpuHints recalculate_hints(const CpuInfo& cpu_info, const CpuFeatures::X86& features) noexcept {
+ CpuHints hints {};
+
+ // Vendor Independent CPU Hints
+ // ----------------------------
+
+ if (features.has_avx2()) {
+ hints |= CpuHints::kVecMaskedOps32 | CpuHints::kVecMaskedOps64;
+ }
+
+ if (features.has_avx512_bw()) {
+ hints |= CpuHints::kVecMaskedOps8 | CpuHints::kVecMaskedOps16 | CpuHints::kVecMaskedOps32 | CpuHints::kVecMaskedOps64;
+ }
+
+ // Select optimization flags based on CPU vendor and micro-architecture.
+
+ // AMD Specific CPU Hints
+ // ----------------------
+
+ if (cpu_info.is_vendor("AMD")) {
+ // Zen 3+ has fast gathers, scalar loads and shuffles are faster on Zen 2 and older CPUs.
+ if (cpu_info.family_id() >= 0x19u) {
+ hints |= CpuHints::kVecFastGather;
+ }
+
+ // Zen 1+ provides low-latency VPMULLD instruction.
+ if (features.has_avx2()) {
+ hints |= CpuHints::kVecFastIntMul32;
+ }
+
+ // Zen 4+ provides low-latency VPMULLQ instruction.
+ if (features.has_avx512_dq()) {
+ hints |= CpuHints::kVecFastIntMul64;
+ }
+
+ // Zen 4+ has fast mask operations (starts with AVX-512).
+ if (features.has_avx512_f()) {
+ hints |= CpuHints::kVecMaskedStore;
+ }
+ }
+
+ // Intel Specific CPU Hints
+ // ------------------------
+
+ if (cpu_info.is_vendor("INTEL")) {
+ if (features.has_avx2()) {
+ uint32_t family_id = cpu_info.family_id();
+ uint32_t model_id = cpu_info.model_id();
+
+ // NOTE: We only want to hint fast gathers in cases the CPU is immune to DOWNFALL. The reason is that the
+ // DOWNFALL mitigation delivered via a micro-code update makes gathers almost useless in a way that scalar
+ // loads can beat it significantly (in Blend2D case scalar loads can offer up to 50% more performance).
+ // This table basically picks CPUs that are known to not be affected by DOWNFALL.
+ if (family_id == 0x06u) {
+ switch (model_id) {
+ case 0x8Fu: // Sapphire Rapids.
+ case 0x96u: // Elkhart Lake.
+ case 0x97u: // Alder Lake / Catlow.
+ case 0x9Au: // Alder Lake / Arizona Beach.
+ case 0x9Cu: // Jasper Lake.
+ case 0xAAu: // Meteor Lake.
+ case 0xACu: // Meteor Lake.
+ case 0xADu: // Granite Rapids.
+ case 0xAEu: // Granite Rapids.
+ case 0xAFu: // Sierra Forest.
+ case 0xBAu: // Raptor Lake.
+ case 0xB5u: // Arrow Lake.
+ case 0xB6u: // Grand Ridge.
+ case 0xB7u: // Raptor Lake / Catlow.
+ case 0xBDu: // Lunar Lake.
+ case 0xBEu: // Alder Lake (N).
+ case 0xBFu: // Raptor Lake.
+ case 0xC5u: // Arrow Lake.
+ case 0xC6u: // Arrow Lake.
+ case 0xCFu: // Emerald Rapids.
+ case 0xDDu: // Clearwater Forest.
+ hints |= CpuHints::kVecFastGather;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ // TODO: It seems masked stores are very expensive on consumer INTEL CPUs.
+ // hints |= CpuHints::kVecMaskedStore;
+ }
+
+ return hints;
+}
+
+} // {x86}
+
+#endif // ASMJIT_ARCH_X86
+
+// CpuInfo - Detect - ARM
+// ======================
+
+// Implement the most code outside the platform specific #ifdefs to minimize breaking the detection on
+// platforms that don't run on our CI infrastructure. The problem with the detection is that every OS
+// requires a specific implementation as ARM features cannot be detected in user-mode without OS enablement.
+
+// The most relevant and accurate information can be found here:
+// https://github.com/llvm-project/llvm/blob/master/lib/Target/AArch64/AArch64.td
+// https://github.com/apple/llvm-project/blob/apple/main/llvm/lib/Target/AArch64/AArch64.td (Apple fork)
+//
+// Other resources:
+// https://en.wikipedia.org/wiki/AArch64
+// https://en.wikipedia.org/wiki/Apple_silicon#List_of_Apple_processors
+// https://developer.arm.com/downloads/-/exploration-tools/feature-names-for-a-profile
+// https://developer.arm.com/architectures/learn-the-architecture/understanding-the-armv8-x-extensions/single-page
+
+#if ASMJIT_ARCH_ARM
+
+namespace arm {
+
+// ARM commonly refers to CPU features using FEAT_ prefix, we use Ext:: to make it compatible with other parts.
+using Ext = CpuFeatures::ARM;
+
+// CpuInfo - Detect - ARM - OS Kernel Version
+// ==========================================
+
+#if defined(__linux__)
+struct UNameKernelVersion {
+ int parts[3];
+
+ inline bool at_least(int major, int minor, int patch = 0) const noexcept {
+ if (parts[0] >= major) {
+ if (parts[0] > major) {
+ return true;
+ }
+
+ if (parts[1] >= minor) {
+ return parts[1] > minor ? true : parts[2] >= patch;
+ }
+ }
+
+ return false;
+ }
+};
+
+[[maybe_unused]]
+static UNameKernelVersion get_kernel_version_via_uname() noexcept {
+ UNameKernelVersion ver{};
+ ver.parts[0] = -1;
+
+ utsname buffer;
+ if (uname(&buffer) != 0) {
+ return ver;
+ }
+
+ size_t count = 0;
+ char* p = buffer.release;
+ while (*p) {
+ uint32_t c = uint8_t(*p);
+ if (c >= uint32_t('0') && c <= uint32_t('9')) {
+ ver.parts[count] = int(strtol(p, &p, 10));
+ if (++count == 3) {
+ break;
+ }
+ }
+ else if (c == '.' || c == '-') {
+ p++;
+ }
+ else {
+ break;
+ }
+ }
+
+ return ver;
+}
+#endif // __linux__
+
+// CpuInfo - Detect - ARM - Baseline Features of ARM Architectures
+// ===============================================================
+
+[[maybe_unused]]
+static inline void populate_base_aarch32_features(CpuFeatures::ARM& features) noexcept {
+ // No baseline flags at the moment.
+ Support::maybe_unused(features);
+}
+
+[[maybe_unused]]
+static inline void populate_base_aarch64_features(CpuFeatures::ARM& features) noexcept {
+ // AArch64 is based on ARMv8.0 and later.
+ features.add(Ext::kARMv6);
+ features.add(Ext::kARMv7);
+ features.add(Ext::kARMv8a);
+
+ // AArch64 comes with these features by default.
+ features.add(Ext::kASIMD);
+ features.add(Ext::kFP);
+ features.add(Ext::kIDIVA);
+}
+
+static inline void populate_base_arm_features(CpuInfo& cpu) noexcept {
+#if ASMJIT_ARCH_ARM == 32
+ populate_base_aarch32_features(cpu.features().arm());
+#else
+ populate_base_aarch64_features(cpu.features().arm());
+#endif
+}
+
+// CpuInfo - Detect - ARM - Mandatory Features of ARM Architectures
+// ================================================================
+
+// Populates mandatory ARMv8.[v]A features.
+[[maybe_unused]]
+static ASMJIT_NOINLINE void populate_armv8a_features(CpuFeatures::ARM& features, uint32_t v) noexcept {
+ switch (v) {
+ default:
+ [[fallthrough]];
+ case 9: // ARMv8.9
+ features.add(Ext::kCLRBHB, Ext::kCSSC, Ext::kPRFMSLC, Ext::kSPECRES2, Ext::kRAS2);
+ [[fallthrough]];
+ case 8: // ARMv8.8
+ features.add(Ext::kHBC, Ext::kMOPS, Ext::kNMI);
+ [[fallthrough]];
+ case 7: // ARMv8.7
+ features.add(Ext::kHCX, Ext::kPAN3, Ext::kWFXT, Ext::kXS);
+ [[fallthrough]];
+ case 6: // ARMv8.6
+ features.add(Ext::kAMU1_1, Ext::kBF16, Ext::kECV, Ext::kFGT, Ext::kI8MM);
+ [[fallthrough]];
+ case 5: // ARMv8.5
+ features.add(Ext::kBTI, Ext::kCSV2, Ext::kDPB2, Ext::kFLAGM2, Ext::kFRINTTS, Ext::kSB, Ext::kSPECRES, Ext::kSSBS);
+ [[fallthrough]];
+ case 4: // ARMv8.4
+ features.add(Ext::kAMU1, Ext::kDIT, Ext::kDOTPROD, Ext::kFLAGM,
+ Ext::kLRCPC2, Ext::kLSE2, Ext::kMPAM, Ext::kNV,
+ Ext::kSEL2, Ext::kTLBIOS, Ext::kTLBIRANGE, Ext::kTRF);
+ [[fallthrough]];
+ case 3: // ARMv8.3
+ features.add(Ext::kCCIDX, Ext::kFCMA, Ext::kJSCVT, Ext::kLRCPC, Ext::kPAUTH);
+ [[fallthrough]];
+ case 2: // ARMv8.2
+ features.add(Ext::kDPB, Ext::kPAN2, Ext::kRAS, Ext::kUAO);
+ [[fallthrough]];
+ case 1: // ARMv8.1
+ features.add(Ext::kCRC32, Ext::kLOR, Ext::kLSE, Ext::kPAN, Ext::kRDM, Ext::kVHE);
+ [[fallthrough]];
+ case 0: // ARMv8.0
+ features.add(Ext::kASIMD, Ext::kFP, Ext::kIDIVA, Ext::kVFP_D32);
+ break;
+ }
+}
+
+// Populates mandatory ARMv9.[v] features.
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void populate_armv9a_features(CpuFeatures::ARM& features, uint32_t v) noexcept {
+ populate_armv8a_features(features, v <= 4u ? 5u + v : 9u);
+
+ switch (v) {
+ default:
+ [[fallthrough]];
+ case 4: // ARMv9.4 - based on ARMv8.9.
+ [[fallthrough]];
+ case 3: // ARMv9.3 - based on ARMv8.8.
+ [[fallthrough]];
+ case 2: // ARMv9.2 - based on ARMv8.7.
+ [[fallthrough]];
+ case 1: // ARMv9.1 - based on ARMv8.6.
+ [[fallthrough]];
+ case 0: // ARMv9.0 - based on ARMv8.5.
+ features.add(Ext::kRME, Ext::kSVE, Ext::kSVE2);
+ break;
+ }
+}
+
+// CpuInfo - Detect - ARM - CPUID Based Features
+// =============================================
+
+// This implements detection based on the content of CPUID registers. The following code doesn't actually read any
+// of the registers so it's an implementation that can theoretically be tested / used in mocks.
+
+// Merges a feature that contains 0b1111 when it doesn't exist and starts at 0b0000 when it does.
+[[maybe_unused]]
+static ASMJIT_INLINE void merge_aarch64_cpuid_feature_na(
+ CpuFeatures::ARM& features, uint64_t reg_bits, uint32_t offset,
+ Ext::Id f0,
+ Ext::Id f1 = Ext::kNone,
+ Ext::Id f2 = Ext::kNone,
+ Ext::Id f3 = Ext::kNone) noexcept {
+
+ uint32_t val = uint32_t((reg_bits >> offset) & 0xFu);
+ if (val == 0xFu) {
+ // If val == 0b1111 then the feature is not implemented in this case (some early extensions).
+ return;
+ }
+
+ features.add_if(f0 != Ext::kNone, f0);
+ features.add_if(f1 != Ext::kNone && val >= 1, f1);
+ features.add_if(f2 != Ext::kNone && val >= 2, f2);
+ features.add_if(f3 != Ext::kNone && val >= 3, f3);
+}
+
+// Merges a feature identified by a single bit at `offset`.
+[[maybe_unused]]
+static ASMJIT_INLINE void merge_aarch64_cpuid_feature_1b(CpuFeatures::ARM& features, uint64_t reg_bits, uint32_t offset, Ext::Id f1) noexcept {
+ features.add_if((reg_bits & (uint64_t(1) << offset)) != 0, f1);
+}
+
+// Merges a feature-list starting from 0b01 when it does (0b00 means feature not supported).
+[[maybe_unused]]
+static ASMJIT_INLINE void merge_aarch64_cpuid_feature_2b(CpuFeatures::ARM& features, uint64_t reg_bits, uint32_t offset, Ext::Id f1, Ext::Id f2, Ext::Id f3) noexcept {
+ uint32_t val = uint32_t((reg_bits >> offset) & 0x3u);
+
+ features.add_if(f1 != Ext::kNone && val >= 1, f1);
+ features.add_if(f2 != Ext::kNone && val >= 2, f2);
+ features.add_if(f3 != Ext::kNone && val == 3, f3);
+}
+
+// Merges a feature-list starting from 0b0001 when it does (0b0000 means feature not supported).
+[[maybe_unused]]
+static ASMJIT_INLINE void merge_aarch64_cpuid_feature_4b(CpuFeatures::ARM& features, uint64_t reg_bits, uint32_t offset,
+ Ext::Id f1,
+ Ext::Id f2 = Ext::kNone,
+ Ext::Id f3 = Ext::kNone,
+ Ext::Id f4 = Ext::kNone) noexcept {
+
+ uint32_t val = uint32_t((reg_bits >> offset) & 0xFu);
+
+ // if val == 0 it means that this feature is not supported.
+ features.add_if(f1 != Ext::kNone && val >= 1, f1);
+ features.add_if(f2 != Ext::kNone && val >= 2, f2);
+ features.add_if(f3 != Ext::kNone && val >= 3, f3);
+ features.add_if(f4 != Ext::kNone && val >= 4, f4);
+}
+
+// Merges a feature that is identified by an exact bit-combination of 4 bits.
+[[maybe_unused]]
+static ASMJIT_INLINE void merge_aarch64_cpuid_feature_4s(CpuFeatures::ARM& features, uint64_t reg_bits, uint32_t offset, uint32_t value, Ext::Id f1) noexcept {
+ features.add_if(uint32_t((reg_bits >> offset) & 0xFu) == value, f1);
+}
+
+#define MERGE_FEATURE_NA(identifier, reg, offset, ...) merge_aarch64_cpuid_feature_na(cpu.features().arm(), reg, offset, __VA_ARGS__)
+#define MERGE_FEATURE_1B(identifier, reg, offset, ...) merge_aarch64_cpuid_feature_1b(cpu.features().arm(), reg, offset, __VA_ARGS__)
+#define MERGE_FEATURE_2B(identifier, reg, offset, ...) merge_aarch64_cpuid_feature_2b(cpu.features().arm(), reg, offset, __VA_ARGS__)
+#define MERGE_FEATURE_4B(identifier, reg, offset, ...) merge_aarch64_cpuid_feature_4b(cpu.features().arm(), reg, offset, __VA_ARGS__)
+#define MERGE_FEATURE_4S(identifier, reg, offset, ...) merge_aarch64_cpuid_feature_4s(cpu.features().arm(), reg, offset, __VA_ARGS__)
+
+// Detects features based on the content of ID_AA64PFR0_EL1 and ID_AA64PFR1_EL1 registers.
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64pfr0_aa64pfr1(CpuInfo& cpu, uint64_t fpr0, uint64_t fpr1) noexcept {
+ // ID_AA64PFR0_EL1
+ // ===============
+
+ // FP and AdvSIMD bits should match (i.e. if FP features FP16, ASIMD must feature it too).
+ MERGE_FEATURE_NA("FP bits [19:16]" , fpr0, 16, Ext::kFP, Ext::kFP16);
+ MERGE_FEATURE_NA("AdvSIMD bits [23:20]" , fpr0, 20, Ext::kASIMD, Ext::kFP16);
+ /*
+ MERGE_FEATURE_4B("GIC bits [27:24]" , fpr0, 24, ...);
+ */
+ MERGE_FEATURE_4B("RAS bits [31:28]" , fpr0, 28, Ext::kRAS, Ext::kRAS1_1, Ext::kRAS2);
+ MERGE_FEATURE_4B("SVE bits [35:32]" , fpr0, 32, Ext::kSVE);
+ MERGE_FEATURE_4B("SEL2 bits [39:36]" , fpr0, 36, Ext::kSEL2);
+ MERGE_FEATURE_4B("MPAM bits [43:40]" , fpr0, 40, Ext::kMPAM);
+ MERGE_FEATURE_4B("AMU bits [47:44]" , fpr0, 44, Ext::kAMU1, Ext::kAMU1_1);
+ MERGE_FEATURE_4B("DIT bits [51:48]" , fpr0, 48, Ext::kDIT);
+ MERGE_FEATURE_4B("RME bits [55:52]" , fpr0, 52, Ext::kRME);
+ MERGE_FEATURE_4B("CSV2 bits [59:56]" , fpr0, 56, Ext::kCSV2, Ext::kCSV2, Ext::kCSV2, Ext::kCSV2_3);
+ MERGE_FEATURE_4B("CSV3 bits [63:60]" , fpr0, 60, Ext::kCSV3);
+
+ // ID_AA64PFR1_EL1
+ // ===============
+
+ MERGE_FEATURE_4B("BT bits [3:0]" , fpr1, 0, Ext::kBTI);
+ MERGE_FEATURE_4B("SSBS bits [7:4]" , fpr1, 4, Ext::kSSBS, Ext::kSSBS2);
+ MERGE_FEATURE_4B("MTE bits [11:8]" , fpr1, 8, Ext::kMTE, Ext::kMTE2, Ext::kMTE3);
+ /*
+ MERGE_FEATURE_4B("RAS_frac bits [15:12]" , fpr1, 12, ...);
+ MERGE_FEATURE_4B("MPAM_frac bits [19:16]" , fpr1, 16, ...);
+ */
+ MERGE_FEATURE_4B("SME bits [27:24]" , fpr1, 24, Ext::kSME, Ext::kSME2);
+ MERGE_FEATURE_4B("RNDR_trap bits [31:28]" , fpr1, 28, Ext::kRNG_TRAP);
+ /*
+ MERGE_FEATURE_4B("CSV2_frac bits [35:32]" , fpr1, 32, ...);
+ */
+ MERGE_FEATURE_4B("NMI bits [39:36]" , fpr1, 36, Ext::kNMI);
+ /*
+ MERGE_FEATURE_4B("MTE_frac bits [43:40]" , fpr1, 40, ...);
+ */
+ MERGE_FEATURE_4B("GCS bits [47:44]" , fpr1, 44, Ext::kGCS);
+ MERGE_FEATURE_4B("THE bits [51:48]" , fpr1, 48, Ext::kTHE);
+
+ // MTEX extensions are only available when MTE3 is available.
+ if (cpu.features().arm().has_mte3())
+ MERGE_FEATURE_4B("MTEX bits [55:52]" , fpr1, 52, Ext::kMTE4);
+
+ /*
+ MERGE_FEATURE_4B("DF2 bits [59:56]" , fpr1, 56, ...);
+ */
+ MERGE_FEATURE_4B("PFAR bits [63:60]" , fpr1, 60, Ext::kPFAR);
+
+ // ID_AA64PFR0_EL1 + ID_AA64PFR1_EL1
+ // =================================
+
+ uint32_t ras_main = uint32_t((fpr0 >> 28) & 0xFu);
+ uint32_t ras_frac = uint32_t((fpr1 >> 12) & 0xFu);
+
+ if (ras_main == 1 && ras_frac == 1) {
+ cpu.features().arm().add(Ext::kRAS1_1);
+ }
+
+ uint32_t mpam_main = uint32_t((fpr0 >> 40) & 0xFu);
+ uint32_t mpam_frac = uint32_t((fpr1 >> 16) & 0xFu);
+
+ if (mpam_main || mpam_frac) {
+ cpu.features().arm().add(Ext::kMPAM);
+ }
+}
+
+// Detects features based on the content of ID_AA64ISAR0_EL1 and ID_AA64ISAR1_EL1 registers.
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64isar0_aa64isar1(CpuInfo& cpu, uint64_t isar0, uint64_t isar1) noexcept {
+ // ID_AA64ISAR0_EL1
+ // ================
+
+ MERGE_FEATURE_4B("AES bits [7:4]" , isar0, 4, Ext::kAES, Ext::kPMULL);
+ MERGE_FEATURE_4B("SHA1 bits [11:8]" , isar0, 8, Ext::kSHA1);
+ MERGE_FEATURE_4B("SHA2 bits [15:12]" , isar0, 12, Ext::kSHA256, Ext::kSHA512);
+ MERGE_FEATURE_4B("CRC32 bits [19:16]" , isar0, 16, Ext::kCRC32);
+ MERGE_FEATURE_4B("Atomic bits [23:20]" , isar0, 20, Ext::kNone, Ext::kLSE, Ext::kLSE128);
+ MERGE_FEATURE_4B("TME bits [27:24]" , isar0, 24, Ext::kTME);
+ MERGE_FEATURE_4B("RDM bits [31:28]" , isar0, 28, Ext::kRDM);
+ MERGE_FEATURE_4B("SHA3 bits [35:32]" , isar0, 32, Ext::kSHA3);
+ MERGE_FEATURE_4B("SM3 bits [39:36]" , isar0, 36, Ext::kSM3);
+ MERGE_FEATURE_4B("SM4 bits [43:40]" , isar0, 40, Ext::kSM4);
+ MERGE_FEATURE_4B("DP bits [47:44]" , isar0, 44, Ext::kDOTPROD);
+ MERGE_FEATURE_4B("FHM bits [51:48]" , isar0, 48, Ext::kFHM);
+ MERGE_FEATURE_4B("TS bits [55:52]" , isar0, 52, Ext::kFLAGM, Ext::kFLAGM2);
+ /*
+ MERGE_FEATURE_4B("TLB bits [59:56]" , isar0, 56, ...);
+ */
+ MERGE_FEATURE_4B("RNDR bits [63:60]" , isar0, 60, Ext::kFLAGM, Ext::kRNG);
+
+ // ID_AA64ISAR1_EL1
+ // ================
+
+ MERGE_FEATURE_4B("DPB bits [3:0]" , isar1, 0, Ext::kDPB, Ext::kDPB2);
+ /*
+ MERGE_FEATURE_4B("APA bits [7:4]" , isar1, 4, ...);
+ MERGE_FEATURE_4B("API bits [11:8]" , isar1, 8, ...);
+ */
+ MERGE_FEATURE_4B("JSCVT bits [15:12]" , isar1, 12, Ext::kJSCVT);
+ MERGE_FEATURE_4B("FCMA bits [19:16]" , isar1, 16, Ext::kFCMA);
+ MERGE_FEATURE_4B("LRCPC bits [23:20]" , isar1, 20, Ext::kLRCPC, Ext::kLRCPC2, Ext::kLRCPC3);
+ /*
+ MERGE_FEATURE_4B("GPA bits [27:24]" , isar1, 24, ...);
+ MERGE_FEATURE_4B("GPI bits [31:28]" , isar1, 28, ...);
+ */
+ MERGE_FEATURE_4B("FRINTTS bits [35:32]" , isar1, 32, Ext::kFRINTTS);
+ MERGE_FEATURE_4B("SB bits [39:36]" , isar1, 36, Ext::kSB);
+ MERGE_FEATURE_4B("SPECRES bits [43:40]" , isar1, 40, Ext::kSPECRES, Ext::kSPECRES2);
+ MERGE_FEATURE_4B("BF16 bits [47:44]" , isar1, 44, Ext::kBF16, Ext::kEBF16);
+ MERGE_FEATURE_4B("DGH bits [51:48]" , isar1, 48, Ext::kDGH);
+ MERGE_FEATURE_4B("I8MM bits [55:52]" , isar1, 52, Ext::kI8MM);
+ MERGE_FEATURE_4B("XS bits [59:56]" , isar1, 56, Ext::kXS);
+ MERGE_FEATURE_4B("LS64 bits [63:60]" , isar1, 60, Ext::kLS64, Ext::kLS64_V, Ext::kLS64_ACCDATA);
+}
+
+// Detects features based on the content of ID_AA64ISAR2_EL1 register.
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64isar2(CpuInfo& cpu, uint64_t isar2) noexcept {
+ MERGE_FEATURE_4B("WFxT bits [3:0]" , isar2, 0, Ext::kNone, Ext::kWFXT);
+ MERGE_FEATURE_4B("RPRES bits [7:4]" , isar2, 4, Ext::kRPRES);
+ /*
+ MERGE_FEATURE_4B("GPA3 bits [11:8]" , isar2, 8, ...);
+ MERGE_FEATURE_4B("APA3 bits [15:12]" , isar2, 12, ...);
+ */
+ MERGE_FEATURE_4B("MOPS bits [19:16]" , isar2, 16, Ext::kMOPS);
+ MERGE_FEATURE_4B("BC bits [23:20]" , isar2, 20, Ext::kHBC);
+ MERGE_FEATURE_4B("PAC_frac bits [27:24]" , isar2, 24, Ext::kCONSTPACFIELD);
+ MERGE_FEATURE_4B("CLRBHB bits [31:28]" , isar2, 28, Ext::kCLRBHB);
+ MERGE_FEATURE_4B("SYSREG128 bits [35:32]" , isar2, 32, Ext::kSYSREG128);
+ MERGE_FEATURE_4B("SYSINSTR128 bits [39:36]" , isar2, 36, Ext::kSYSINSTR128);
+ MERGE_FEATURE_4B("PRFMSLC bits [43:40]" , isar2, 40, Ext::kPRFMSLC);
+ MERGE_FEATURE_4B("RPRFM bits [51:48]" , isar2, 48, Ext::kRPRFM);
+ MERGE_FEATURE_4B("CSSC bits [55:52]" , isar2, 52, Ext::kCSSC);
+ MERGE_FEATURE_4B("LUT bits [59:56]" , isar2, 56, Ext::kLUT);
+ /*
+ MERGE_FEATURE_4B("ATS1A bits [63:60]" , isar2, 60, ...);
+ */
+}
+
+// TODO: This register is not accessed at the moment.
+#if 0
+// Detects features based on the content of ID_AA64ISAR3_EL1register.
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64isar3(CpuInfo& cpu, uint64_t isar3) noexcept {
+ // ID_AA64ISAR3_EL1
+ // ================
+
+ MERGE_FEATURE_4B("CPA bits [3:0]" , isar3, 0, Ext::kCPA, Ext::kCPA2);
+ MERGE_FEATURE_4B("FAMINMAX bits [7:4]" , isar3, 4, Ext::kFAMINMAX);
+ MERGE_FEATURE_4B("TLBIW bits [11:8]" , isar3, 8, Ext::kTLBIW);
+ /*
+ MERGE_FEATURE_4B("PACM bits [15:12]" , isar3, 12, ...);
+ */
+ MERGE_FEATURE_4B("LSFE bits [19:16]" , isar3, 16, Ext::kLSFE);
+ MERGE_FEATURE_4B("OCCMO bits [23:20]" , isar3, 20, Ext::kOCCMO);
+ MERGE_FEATURE_4B("LSUI bits [27:24]" , isar3, 24, Ext::kLSUI);
+}
+#endif
+
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64mmfr0(CpuInfo& cpu, uint64_t mmfr0) noexcept {
+ // ID_AA64MMFR0_EL1
+ // ================
+
+ /*
+ MERGE_FEATURE_4B("PARange bits [3:0]" , mmfr0, 0, ...);
+ MERGE_FEATURE_4B("ASIDBits bits [7:4]" , mmfr0, 4, ...);
+ MERGE_FEATURE_4B("BigEnd bits [11:8]" , mmfr0, 8, ...);
+ MERGE_FEATURE_4B("SNSMem bits [15:12]" , mmfr0, 12, ...);
+ MERGE_FEATURE_4B("BigEndEL0 bits [19:16]" , mmfr0, 16, ...);
+ MERGE_FEATURE_4B("TGran16 bits [23:20]" , mmfr0, 20, ...);
+ MERGE_FEATURE_4B("TGran64 bits [27:24]" , mmfr0, 24, ...);
+ MERGE_FEATURE_4B("TGran4 bits [31:28]" , mmfr0, 28, ...);
+ MERGE_FEATURE_4B("TGran16_2 bits [35:32]" , mmfr0, 32, ...);
+ MERGE_FEATURE_4B("TGran64_2 bits [39:36]" , mmfr0, 36, ...);
+ MERGE_FEATURE_4B("TGran4_2 bits [43:40]" , mmfr0, 40, ...);
+ MERGE_FEATURE_4B("ExS bits [47:44]" , mmfr0, 44, ...);
+ */
+ MERGE_FEATURE_4B("FGT bits [59:56]" , mmfr0, 56, Ext::kFGT, Ext::kFGT2);
+ MERGE_FEATURE_4B("ECV bits [63:60]" , mmfr0, 60, Ext::kECV);
+}
+
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64mmfr1(CpuInfo& cpu, uint64_t mmfr1) noexcept {
+ // ID_AA64MMFR1_EL1
+ // ================
+
+ MERGE_FEATURE_4B("HAFDBS bits [3:0]" , mmfr1, 0, Ext::kHAFDBS, Ext::kNone, Ext::kHAFT, Ext::kHDBSS);
+ MERGE_FEATURE_4B("VMIDBits bits [7:4]" , mmfr1, 4, Ext::kVMID16);
+ MERGE_FEATURE_4B("VH bits [11:8]" , mmfr1, 8, Ext::kVHE);
+ MERGE_FEATURE_4B("HPDS bits [15:12]" , mmfr1, 12, Ext::kHPDS, Ext::kHPDS2);
+ MERGE_FEATURE_4B("LO bits [19:16]" , mmfr1, 16, Ext::kLOR);
+ MERGE_FEATURE_4B("PAN bits [23:20]" , mmfr1, 20, Ext::kPAN, Ext::kPAN2, Ext::kPAN3);
+ /*
+ MERGE_FEATURE_4B("SpecSEI bits [27:24]" , mmfr1, 24, ...);
+ */
+ MERGE_FEATURE_4B("XNX bits [31:28]" , mmfr1, 28, Ext::kXNX);
+ /*
+ MERGE_FEATURE_4B("TWED bits [35:32]" , mmfr1, 32, ...);
+ MERGE_FEATURE_4B("ETS bits [39:36]" , mmfr1, 36, ...);
+ */
+ MERGE_FEATURE_4B("HCX bits [43:40]" , mmfr1, 40, Ext::kHCX);
+ MERGE_FEATURE_4B("AFP bits [47:44]" , mmfr1, 44, Ext::kAFP);
+ /*
+ MERGE_FEATURE_4B("nTLBPA bits [51:48]" , mmfr1, 48, ...);
+ MERGE_FEATURE_4B("TIDCP1 bits [55:52]" , mmfr1, 52, ...);
+ */
+ MERGE_FEATURE_4B("CMOW bits [59:56]" , mmfr1, 56, Ext::kCMOW);
+ MERGE_FEATURE_4B("ECBHB bits [63:60]" , mmfr1, 60, Ext::kECBHB);
+}
+
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64mmfr2(CpuInfo& cpu, uint64_t mmfr2) noexcept {
+ // ID_AA64MMFR2_EL1
+ // ================
+
+ /*
+ MERGE_FEATURE_4B("CnP bits [3:0]" , mmfr2, 0, ...);
+ */
+ MERGE_FEATURE_4B("UAO bits [7:4]" , mmfr2, 4, Ext::kUAO);
+ /*
+ MERGE_FEATURE_4B("LSM bits [11:8]" , mmfr2, 8, ...);
+ MERGE_FEATURE_4B("IESB bits [15:12]" , mmfr2, 12, ...);
+ */
+ MERGE_FEATURE_4B("VARange bits [19:16]" , mmfr2, 16, Ext::kLVA, Ext::kLVA3);
+ MERGE_FEATURE_4B("CCIDX bits [23:20]" , mmfr2, 20, Ext::kCCIDX);
+ MERGE_FEATURE_4B("NV bits [27:24]" , mmfr2, 24, Ext::kNV, Ext::kNV2);
+ /*
+ MERGE_FEATURE_4B("ST bits [31:28]" , mmfr2, 28, ...);
+ */
+ MERGE_FEATURE_4B("AT bits [35:32]" , mmfr2, 32, Ext::kLSE2);
+ /*
+ MERGE_FEATURE_4B("IDS bits [39:36]" , mmfr2, 36, ...);
+ MERGE_FEATURE_4B("FWB bits [43:40]" , mmfr2, 40, ...);
+ MERGE_FEATURE_4B("TTL bits [51:48]" , mmfr2, 48, ...);
+ MERGE_FEATURE_4B("BBM bits [55:52]" , mmfr2, 52, ...);
+ MERGE_FEATURE_4B("EVT bits [59:56]" , mmfr2, 56, ...);
+ MERGE_FEATURE_4B("E0PD bits [63:60]" , mmfr2, 60, ...);
+ */
+}
+
+// Detects features based on the content of ID_AA64ZFR0_EL1 (SVE Feature ID register 0).
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64zfr0(CpuInfo& cpu, uint64_t zfr0) noexcept {
+ MERGE_FEATURE_4B("SVEver bits [3:0]" , zfr0, 0, Ext::kSVE2, Ext::kSVE2_1, Ext::kSVE2_2);
+ MERGE_FEATURE_4B("AES bits [7:4]" , zfr0, 4, Ext::kSVE_AES, Ext::kSVE_PMULL128);
+ MERGE_FEATURE_4B("EltPerm bits [15:12]" , zfr0, 12, Ext::kSVE_ELTPERM);
+ MERGE_FEATURE_4B("BitPerm bits [19:16]" , zfr0, 16, Ext::kSVE_BITPERM);
+ MERGE_FEATURE_4B("BF16 bits [23:20]" , zfr0, 20, Ext::kSVE_BF16, Ext::kSVE_EBF16);
+ MERGE_FEATURE_4B("B16B16 bits [27:24]" , zfr0, 24, Ext::kSVE_B16B16);
+ MERGE_FEATURE_4B("SHA3 bits [35:32]" , zfr0, 32, Ext::kSVE_SHA3);
+ MERGE_FEATURE_4B("SM4 bits [43:40]" , zfr0, 40, Ext::kSVE_SM4);
+ MERGE_FEATURE_4B("I8MM bits [47:44]" , zfr0, 44, Ext::kSVE_I8MM);
+ MERGE_FEATURE_4B("F32MM bits [55:52]" , zfr0, 52, Ext::kSVE_F32MM);
+ MERGE_FEATURE_4B("F64MM bits [59:56]" , zfr0, 56, Ext::kSVE_F64MM);
+}
+
+[[maybe_unused]]
+static inline void detect_aarch64_features_via_cpuid_aa64smfr0(CpuInfo& cpu, uint64_t smfr0) noexcept {
+ MERGE_FEATURE_1B("SMOP4 bit [0]" , smfr0, 0, Ext::kSME_MOP4);
+ MERGE_FEATURE_1B("STMOP bit [16]" , smfr0, 16, Ext::kSME_TMOP);
+ MERGE_FEATURE_1B("SFEXPA bit [23]" , smfr0, 23, Ext::kSSVE_FEXPA);
+ MERGE_FEATURE_1B("AES bit [24]" , smfr0, 24, Ext::kSSVE_AES);
+ MERGE_FEATURE_1B("SBitPerm bit [25]" , smfr0, 25, Ext::kSSVE_BITPERM);
+ MERGE_FEATURE_1B("SF8DP2 bit [28]" , smfr0, 28, Ext::kSSVE_FP8DOT2);
+ MERGE_FEATURE_1B("SF8DP4 bit [29]" , smfr0, 29, Ext::kSSVE_FP8DOT4);
+ MERGE_FEATURE_1B("SF8FMA bit [30]" , smfr0, 30, Ext::kSSVE_FP8FMA);
+ MERGE_FEATURE_1B("F32F32 bit [32]" , smfr0, 32, Ext::kSME_F32F32);
+ MERGE_FEATURE_1B("BI32I32 bit [33]" , smfr0, 33, Ext::kSME_BI32I32);
+ MERGE_FEATURE_1B("B16F32 bit [34]" , smfr0, 34, Ext::kSME_B16F32);
+ MERGE_FEATURE_1B("F16F32 bit [35]" , smfr0, 35, Ext::kSME_F16F32);
+ MERGE_FEATURE_4S("I8I32 bits [39:36]" , smfr0, 36, 0xF, Ext::kSME_I8I32);
+ MERGE_FEATURE_1B("F8F32 bit [40]" , smfr0, 40, Ext::kSME_F8F32);
+ MERGE_FEATURE_1B("F8F16 bit [41]" , smfr0, 41, Ext::kSME_F8F16);
+ MERGE_FEATURE_1B("F16F16 bit [42]" , smfr0, 42, Ext::kSME_F16F16);
+ MERGE_FEATURE_1B("B16B16 bit [43]" , smfr0, 43, Ext::kSME_B16B16);
+ MERGE_FEATURE_4S("I16I32 bits [47:44]" , smfr0, 44, 0x5, Ext::kSME_I16I32);
+ MERGE_FEATURE_1B("F64F64 bit [48]" , smfr0, 48, Ext::kSME_F64F64);
+ MERGE_FEATURE_4S("I16I64 bits [55:52]" , smfr0, 52, 0xF, Ext::kSME_I16I64);
+ MERGE_FEATURE_4B("SMEver bits [59:56]" , smfr0, 56, Ext::kSME2, Ext::kSME2_1, Ext::kSME2_2);
+ MERGE_FEATURE_1B("LUTv2 bit [60]" , smfr0, 60, Ext::kSME_LUTv2);
+ MERGE_FEATURE_1B("FA64 bit [63]" , smfr0, 63, Ext::kSME_FA64);
+}
+
+#undef MERGE_FEATURE_4S
+#undef MERGE_FEATURE_4B
+#undef MERGE_FEATURE_2B
+#undef MERGE_FEATURE_1B
+#undef MERGE_FEATURE_NA
+
+// CpuInfo - Detect - ARM - CPU Vendor Features
+// ============================================
+
+// CPU features detection based on Apple family ID.
+enum class AppleFamilyId : uint32_t {
+ // Apple design.
+ kSWIFT = 0x1E2D6381u, // Apple A6/A6X (ARMv7s).
+ kCYCLONE = 0x37A09642u, // Apple A7 (ARMv8.0-A).
+ kTYPHOON = 0x2C91A47Eu, // Apple A8 (ARMv8.0-A).
+ kTWISTER = 0x92FB37C8u, // Apple A9 (ARMv8.0-A).
+ kHURRICANE = 0x67CEEE93u, // Apple A10 (ARMv8.1-A).
+ kMONSOON_MISTRAL = 0xE81E7EF6u, // Apple A11 (ARMv8.2-A).
+ kVORTEX_TEMPEST = 0x07D34B9Fu, // Apple A12 (ARMv8.3-A).
+ kLIGHTNING_THUNDER = 0x462504D2u, // Apple A13 (ARMv8.4-A).
+ kFIRESTORM_ICESTORM = 0x1B588BB3u, // Apple A14/M1 (ARMv8.5-A).
+ kAVALANCHE_BLIZZARD = 0XDA33D83Du, // Apple A15/M2 (ARMv8.6-A).
+ kEVEREST_SAWTOOTH = 0X8765EDEAu, // Apple A16 (ARMv8.6-A).
+ kIBIZA = 0xFA33415Eu, // Apple M3 (ARMv8.6-A).
+ kPALMA = 0x72015832u, // Apple M3 Max (ARMv8.6-A).
+ kLOBOS = 0x5F4DEA93u, // Apple M3 Pro (ARMv8.6-A).
+ kCOLL = 0x2876F5B5u, // Apple A17 Pro (ARMv8.7-A).
+ kDONAN = 0x6F5129ACu, // Apple M4 (ARMv8.7-A).
+ kBRAVA = 0x17D5B93Au, // Apple M4 Max (ARMv8.7-A).
+ kTUPAI = 0x204526D0u, // Apple A18 .
+ kTAHITI = 0x75D4ACB9u // Apple A18 Pro .
+};
+
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE bool detect_aarch64_features_via_apple_family_id(CpuInfo& cpu) noexcept {
+ using Id = AppleFamilyId;
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ switch (cpu.family_id()) {
+ // Apple A7-A9 (ARMv8.0-A).
+ case uint32_t(Id::kCYCLONE):
+ case uint32_t(Id::kTYPHOON):
+ case uint32_t(Id::kTWISTER):
+ populate_armv8a_features(features, 0);
+ features.add(
+ Ext::kPMU,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256
+ );
+ return true;
+
+ // Apple A10 (ARMv8.0-A).
+ case uint32_t(Id::kHURRICANE):
+ populate_armv8a_features(features, 0);
+ features.add(
+ Ext::kLOR, Ext::kPAN, Ext::kPMU, Ext::kVHE,
+ Ext::kAES, Ext::kCRC32, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256, Ext::kRDM
+ );
+ return true;
+
+ // Apple A11 (ARMv8.2-A).
+ case uint32_t(Id::kMONSOON_MISTRAL):
+ populate_armv8a_features(features, 2);
+ features.add(
+ Ext::kPMU,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256,
+ Ext::kFP16, Ext::kFP16CONV
+ );
+ return true;
+
+ // Apple A12 (ARMv8.3-A).
+ case uint32_t(Id::kVORTEX_TEMPEST):
+ populate_armv8a_features(features, 3);
+ features.add(
+ Ext::kPMU,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256,
+ Ext::kFP16, Ext::kFP16CONV
+ );
+ return true;
+
+ // Apple A13 (ARMv8.4-A).
+ case uint32_t(Id::kLIGHTNING_THUNDER):
+ populate_armv8a_features(features, 4);
+ features.add(
+ Ext::kPMU,
+ Ext::kFP16, Ext::kFP16CONV, Ext::kFHM,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512
+ );
+ return true;
+
+ // Apple A14/M1 (ARMv8.5-A).
+ case uint32_t(Id::kFIRESTORM_ICESTORM):
+ populate_armv8a_features(features, 4);
+ features.add(
+ Ext::kCSV2, Ext::kCSV3, Ext::kDPB2, Ext::kECV, Ext::kFLAGM2, Ext::kPMU, Ext::kSB, Ext::kSSBS,
+ Ext::kFP16, Ext::kFP16CONV, Ext::kFHM,
+ Ext::kFRINTTS,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512);
+ return true;
+
+ // Apple A15/M2.
+ case uint32_t(Id::kAVALANCHE_BLIZZARD):
+ populate_armv8a_features(features, 6);
+ features.add(
+ Ext::kPMU,
+ Ext::kFP16, Ext::kFP16CONV, Ext::kFHM,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512);
+ return true;
+
+ // Apple A16/M3.
+ case uint32_t(Id::kEVEREST_SAWTOOTH):
+ case uint32_t(Id::kIBIZA):
+ case uint32_t(Id::kPALMA):
+ case uint32_t(Id::kLOBOS):
+ populate_armv8a_features(features, 6);
+ features.add(
+ Ext::kHCX, Ext::kPMU,
+ Ext::kFP16, Ext::kFP16CONV, Ext::kFHM,
+ Ext::kAES, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512
+ );
+ return true;
+
+ // Apple A17/M4.
+ case uint32_t(Id::kCOLL):
+ case uint32_t(Id::kDONAN):
+ case uint32_t(Id::kBRAVA):
+ populate_armv8a_features(features, 7);
+ features.add(
+ Ext::kPMU,
+ Ext::kFP16, Ext::kFP16CONV, Ext::kFHM,
+ Ext::kAES, Ext::kSHA1, Ext::kSHA3, Ext::kSHA256, Ext::kSHA512,
+ Ext::kSME, Ext::kSME2, Ext::kSME_F64F64, Ext::kSME_I16I64);
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+// CpuInfo - Detect - ARM - Compile Flags Features
+// ===============================================
+
+// Detects ARM version by macros defined at compile time. This means that AsmJit will report features forced at
+// compile time that should always be provided by the target CPU. This also means that if we don't provide any
+// means to detect CPU features the features reported by AsmJit will at least not report less features than the
+// target it was compiled to.
+
+#if ASMJIT_ARCH_ARM == 32
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void detect_aarch32_features_via_compiler_flags(CpuInfo& cpu) noexcept {
+ Support::maybe_unused(cpu);
+
+ // ARM targets have no baseline at the moment.
+#if defined(__ARM_ARCH_7A__)
+ cpu.add_feature(CpuFeatures::ARM::kARMv7);
+#endif
+
+#if defined(__ARM_ARCH_8A__)
+ cpu.add_feature(CpuFeatures::ARM::kARMv8a);
+#endif
+
+#if defined(__TARGET_ARCH_THUMB)
+ cpu.add_feature(CpuFeatures::ARM::kTHUMB);
+#if __TARGET_ARCH_THUMB >= 4
+ cpu.add_feature(CpuFeatures::ARM::kTHUMBv2);
+#endif
+#endif
+
+#if defined(__ARM_FEATURE_FMA)
+ cpu.add_feature(Ext::kFP);
+#endif
+
+#if defined(__ARM_NEON)
+ cpu.add_feature(Ext::kASIMD);
+#endif
+
+#if defined(__ARM_FEATURE_IDIV) && defined(__TARGET_ARCH_THUMB)
+ cpu.add_feature(Ext::kIDIVT);
+#endif
+#if defined(__ARM_FEATURE_IDIV) && !defined(__TARGET_ARCH_THUMB)
+ cpu.add_feature(Ext::kIDIVA);
+#endif
+}
+#endif // ASMJIT_ARCH_ARM == 32
+
+#if ASMJIT_ARCH_ARM == 64
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void detect_aarch64_features_via_compiler_flags(CpuInfo& cpu) noexcept {
+ Support::maybe_unused(cpu);
+
+#if defined(__ARM_ARCH_9_5A__)
+ populate_armv9a_features(cpu.features().arm(), 5);
+#elif defined(__ARM_ARCH_9_4A__)
+ populate_armv9a_features(cpu.features().arm(), 4);
+#elif defined(__ARM_ARCH_9_3A__)
+ populate_armv9a_features(cpu.features().arm(), 3);
+#elif defined(__ARM_ARCH_9_2A__)
+ populate_armv9a_features(cpu.features().arm(), 2);
+#elif defined(__ARM_ARCH_9_1A__)
+ populate_armv9a_features(cpu.features().arm(), 1);
+#elif defined(__ARM_ARCH_9A__)
+ populate_armv9a_features(cpu.features().arm(), 0);
+#elif defined(__ARM_ARCH_8_9A__)
+ populate_armv8a_features(cpu.features().arm(), 9);
+#elif defined(__ARM_ARCH_8_8A__)
+ populate_armv8a_features(cpu.features().arm(), 8);
+#elif defined(__ARM_ARCH_8_7A__)
+ populate_armv8a_features(cpu.features().arm(), 7);
+#elif defined(__ARM_ARCH_8_6A__)
+ populate_armv8a_features(cpu.features().arm(), 6);
+#elif defined(__ARM_ARCH_8_5A__)
+ populate_armv8a_features(cpu.features().arm(), 5);
+#elif defined(__ARM_ARCH_8_4A__)
+ populate_armv8a_features(cpu.features().arm(), 4);
+#elif defined(__ARM_ARCH_8_3A__)
+ populate_armv8a_features(cpu.features().arm(), 3);
+#elif defined(__ARM_ARCH_8_2A__)
+ populate_armv8a_features(cpu.features().arm(), 2);
+#elif defined(__ARM_ARCH_8_1A__)
+ populate_armv8a_features(cpu.features().arm(), 1);
+#else
+ populate_armv8a_features(cpu.features().arm(), 0);
+#endif
+
+#if defined(__ARM_FEATURE_AES)
+ cpu.add_feature(Ext::kAES);
+#endif
+
+#if defined(__ARM_FEATURE_BF16_SCALAR_ARITHMETIC) && defined(__ARM_FEATURE_BF16_VECTOR_ARITHMETIC)
+ cpu.add_feature(Ext::kBF16);
+#endif
+
+#if defined(__ARM_FEATURE_CRC32)
+ cpu.add_feature(Ext::kCRC32);
+#endif
+
+#if defined(__ARM_FEATURE_CRYPTO)
+ cpu.add_feature(Ext::kAES, Ext::kSHA1, Ext::kSHA256);
+#endif
+
+#if defined(__ARM_FEATURE_DOTPROD)
+ cpu.add_feature(Ext::kDOTPROD);
+#endif
+
+#if defined(__ARM_FEATURE_FP16FML) || defined(__ARM_FEATURE_FP16_FML)
+ cpu.add_feature(Ext::kFHM);
+#endif
+
+#if defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC)
+ cpu.add_feature(Ext::kFP16);
+#endif
+
+#if defined(__ARM_FEATURE_FRINT)
+ cpu.add_feature(Ext::kFRINTTS);
+#endif
+
+#if defined(__ARM_FEATURE_JCVT)
+ cpu.add_feature(Ext::kJSCVT);
+#endif
+
+#if defined(__ARM_FEATURE_MATMUL_INT8)
+ cpu.add_feature(Ext::kI8MM);
+#endif
+
+#if defined(__ARM_FEATURE_ATOMICS)
+ cpu.add_feature(Ext::kLSE);
+#endif
+
+#if defined(__ARM_FEATURE_MEMORY_TAGGING)
+ cpu.add_feature(Ext::kMTE);
+#endif
+
+#if defined(__ARM_FEATURE_QRDMX)
+ cpu.add_feature(Ext::kRDM);
+#endif
+
+#if defined(__ARM_FEATURE_RNG)
+ cpu.add_feature(Ext::kRNG);
+#endif
+
+#if defined(__ARM_FEATURE_SHA2)
+ cpu.add_feature(Ext::kSHA256);
+#endif
+
+#if defined(__ARM_FEATURE_SHA3)
+ cpu.add_feature(Ext::kSHA3);
+#endif
+
+#if defined(__ARM_FEATURE_SHA512)
+ cpu.add_feature(Ext::kSHA512);
+#endif
+
+#if defined(__ARM_FEATURE_SM3)
+ cpu.add_feature(Ext::kSM3);
+#endif
+
+#if defined(__ARM_FEATURE_SM4)
+ cpu.add_feature(Ext::kSM4);
+#endif
+
+#if defined(__ARM_FEATURE_SVE) || defined(__ARM_FEATURE_SVE_VECTOR_OPERATORS)
+ cpu.add_feature(Ext::kSVE);
+#endif
+
+#if defined(__ARM_FEATURE_SVE_MATMUL_INT8)
+ cpu.add_feature(Ext::kSVE_I8MM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE_MATMUL_FP32)
+ cpu.add_feature(Ext::kSVE_F32MM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE_MATMUL_FP64)
+ cpu.add_feature(Ext::kSVE_F64MM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2)
+ cpu.add_feature(Ext::kSVE2);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_AES)
+ cpu.add_feature(Ext::kSVE_AES);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_BITPERM)
+ cpu.add_feature(Ext::kSVE_BITPERM);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_SHA3)
+ cpu.add_feature(Ext::kSVE_SHA3);
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_SM4)
+ cpu.add_feature(Ext::kSVE_SM4);
+#endif
+
+#if defined(__ARM_FEATURE_TME)
+ cpu.add_feature(Ext::kTME);
+#endif
+}
+#endif // ASMJIT_ARCH_ARM == 64
+
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void detect_arm_features_via_compiler_flags(CpuInfo& cpu) noexcept {
+#if ASMJIT_ARCH_ARM == 32
+ detect_aarch32_features_via_compiler_flags(cpu);
+#else
+ detect_aarch64_features_via_compiler_flags(cpu);
+#endif // ASMJIT_ARCH_ARM
+}
+
+// CpuInfo - Detect - ARM - Post Processing ARM Features
+// =====================================================
+
+// Postprocesses AArch32 features.
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void post_process_aarch32_features(CpuFeatures::ARM& features) noexcept {
+ Support::maybe_unused(features);
+}
+
+// Postprocesses AArch64 features.
+//
+// The only reason to use this function is to deduce some flags from others.
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void post_process_aarch64_features(CpuFeatures::ARM& features) noexcept {
+ if (features.has_fp16()) {
+ features.add(Ext::kFP16CONV);
+ }
+
+ if (features.has_mte3()) {
+ features.add(Ext::kMTE2);
+ }
+
+ if (features.has_mte2()) {
+ features.add(Ext::kMTE);
+ }
+
+ if (features.has_ssbs2()) {
+ features.add(Ext::kSSBS);
+ }
+}
+
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void post_process_arm_cpu_info(CpuInfo& cpu) noexcept {
+#if ASMJIT_ARCH_ARM == 32
+ post_process_aarch32_features(cpu.features().arm());
+#else
+ post_process_aarch64_features(cpu.features().arm());
+#endif // ASMJIT_ARCH_ARM
+}
+
+// CpuInfo - Detect - ARM - Detect by Reading CPUID Registers
+// ==========================================================
+
+// Support CPUID-based detection on AArch64.
+#if defined(ASMJIT_ARM_DETECT_VIA_CPUID)
+
+// Since the register ID is encoded with the instruction we have to create a function for each register ID to read.
+#define ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(func, reg_id) \
+[[maybe_unused]] \
+static inline uint64_t func() noexcept { \
+ uint64_t output; \
+ __asm__ __volatile__("mrs %0, " #reg_id : "=r"(output)); \
+ return output; \
+}
+
+// NOTE: Older tools don't know the IDs. For example Ubuntu on RPI (GCC 9) won't compile ID_AA64ISAR2_EL1 in 2023.
+ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64_read_pfr0, ID_AA64PFR0_EL1)
+ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64_read_pfr1, ID_AA64PFR1_EL1)
+ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64_read_isar0, ID_AA64ISAR0_EL1)
+ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64_read_isar1, ID_AA64ISAR1_EL1)
+ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64_read_isar2, S3_0_C0_C6_2) // ID_AA64ISAR2_EL1
+ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64_read_zfr0, S3_0_C0_C4_4) // ID_AA64ZFR0_EL1
+
+#undef ASMJIT_AARCH64_DEFINE_CPUID_READ_FN
+
+// Detects AArch64 features by reading CPUID bits directly from CPUID registers. This is the most reliable method
+// as the OS doesn't have to know all supported extensions this way (if there is something missing in HWCAPS then
+// there is no way to detect such feature without reading CPUID bits).
+//
+// This function uses MSR instructions, which means that it reads registers that cannot be read in user-mode. The
+// OS typically implements this feature by handling SIGILL internally and providing a filtered content of these
+// registers back to the user - at least this is what Linux documentation states - everything implementation
+// dependent is zeroed, only the bits that are used for CPU feature identification would be present.
+//
+// References:
+// - https://docs.kernel.org/arch/arm64/cpu-feature-registers.html
+[[maybe_unused]]
+static ASMJIT_FAVOR_SIZE void detect_aarch64_features_via_cpuid(CpuInfo& cpu) noexcept {
+ populate_base_arm_features(cpu);
+
+ detect_aarch64_features_via_cpuid_aa64pfr0_aa64pfr1(cpu, aarch64_read_pfr0(), aarch64_read_pfr1());
+ detect_aarch64_features_via_cpuid_aa64isar0_aa64isar1(cpu, aarch64_read_isar0(), aarch64_read_isar1());
+
+ // TODO: Fix this on FreeBSD - I don't know what kernel version allows to access the registers below...
+
+#if defined(__linux__)
+ UNameKernelVersion kVer = get_kernel_version_via_uname();
+
+ // Introduced in Linux 4.19 by "arm64: add ID_AA64ISAR2_EL1 sys register"), so we want at least 4.20.
+ if (kVer.at_least(4, 20)) {
+ detect_aarch64_features_via_cpuid_aa64isar2(cpu, aarch64_read_isar2());
+ }
+
+ // Introduced in Linux 5.10 by "arm64: Expose SVE2 features for userspace", so we want at least 5.11.
+ if (kVer.at_least(5, 11) && cpu.features().arm().has_any(Ext::kSVE, Ext::kSME)) {
+ // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available.
+ detect_aarch64_features_via_cpuid_aa64zfr0(cpu, aarch64_read_zfr0());
+ }
+#endif
+}
+
+#endif // ASMJIT_ARM_DETECT_VIA_CPUID
+
+// CpuInfo - Detect - ARM - Detect by Windows API
+// ==============================================
+
+#if defined(_WIN32)
+struct WinPFPMapping {
+ uint8_t feature_id;
+ uint8_t pfp_feature_id;
+};
+
+static ASMJIT_FAVOR_SIZE void detect_pfp_features(CpuInfo& cpu, const WinPFPMapping* mapping, size_t size) noexcept {
+ for (size_t i = 0; i < size; i++) {
+ if (::IsProcessorFeaturePresent(mapping[i].pfp_feature_id)) {
+ cpu.add_feature(mapping[i].feature_id);
+ }
+ }
+}
+
+//! Detect ARM CPU features on Windows.
+//!
+//! The detection is based on `IsProcessorFeaturePresent()` API call.
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ cpu._was_detected = true;
+ populate_base_arm_features(cpu);
+
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ // Win32 for ARM requires ARMv7 with DSP extensions, VFPv3 (FP), and uses THUMBv2 by default.
+#if ASMJIT_ARCH_ARM == 32
+ features.add(Ext::kTHUMB);
+ features.add(Ext::kTHUMBv2);
+ features.add(Ext::kARMv6);
+ features.add(Ext::kARMv7);
+ features.add(Ext::kEDSP);
+#endif
+
+ // Windows for ARM requires FP and ASIMD.
+ features.add(Ext::kFP);
+ features.add(Ext::kASIMD);
+
+ // Detect additional CPU features by calling `IsProcessorFeaturePresent()`.
+ static const WinPFPMapping mapping[] = {
+#if ASMJIT_ARCH_ARM == 32
+ { uint8_t(Ext::kVFP_D32) , 18 }, // PF_ARM_VFP_32_REGISTERS_AVAILABLE
+ { uint8_t(Ext::kIDIVT) , 24 }, // PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE
+ { uint8_t(Ext::kFMAC) , 27 }, // PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE
+ { uint8_t(Ext::kARMv8a) , 29 }, // PF_ARM_V8_INSTRUCTIONS_AVAILABLE
+#endif
+ { uint8_t(Ext::kAES) , 30 }, // PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE
+ { uint8_t(Ext::kCRC32) , 31 }, // PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE
+ { uint8_t(Ext::kLSE) , 34 }, // PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE
+ { uint8_t(Ext::kDOTPROD) , 43 }, // PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
+ { uint8_t(Ext::kJSCVT) , 44 }, // PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE
+ { uint8_t(Ext::kLRCPC) , 45 } // PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE
+ };
+ detect_pfp_features(cpu, mapping, ASMJIT_ARRAY_SIZE(mapping));
+
+ // Windows can only report ARMv8A at the moment.
+ if (features.has_armv8a()) {
+ populate_armv8a_features(cpu.features().arm(), 0);
+ }
+
+ // Windows provides several instructions under a single flag:
+ if (features.has_aes()) {
+ features.add(Ext::kPMULL, Ext::kSHA1, Ext::kSHA256);
+ }
+
+ post_process_arm_cpu_info(cpu);
+}
+
+// CpuInfo - Detect - ARM - Detect by Reading HWCAPS
+// =================================================
+
+#elif defined(ASMJIT_ARM_DETECT_VIA_HWCAPS)
+
+#ifndef AT_HWCAP
+ #define AT_HWCAP 16
+#endif // !AT_HWCAP
+
+#ifndef AT_HWCAP2
+ #define AT_HWCAP2 26
+#endif // !AT_HWCAP2
+
+#if defined(__linux__)
+static void get_aux_values(unsigned long* vals, const unsigned long* tags, size_t count) noexcept {
+ for (size_t i = 0; i < count; i++) {
+ vals[i] = getauxval(tags[i]);
+ }
+}
+#elif defined(__FreeBSD__)
+static void get_aux_values(unsigned long* vals, const unsigned long* tags, size_t count) noexcept {
+ for (size_t i = 0; i < count; i++) {
+ unsigned long result = 0;
+ if (elf_aux_info(int(tags[i]), &result, int(sizeof(unsigned long))) != 0)
+ result = 0;
+ vals[i] = result;
+ }
+}
+#else
+#error "[asmjit] get_aux_values() - Unsupported OS."
+#endif
+
+static const unsigned long hw_cap_tags_table[2] = { AT_HWCAP, AT_HWCAP2 };
+
+struct HWCapMapping32 { uint8_t feature_id[32]; };
+struct HWCapMapping64 { uint8_t feature_id[64]; };
+
+template<typename Mask, typename Map>
+static ASMJIT_FAVOR_SIZE void merge_hw_caps(CpuInfo& cpu, const Mask& mask, const Map& map) noexcept {
+ static_assert(sizeof(Mask) * 8u == sizeof(Map));
+
+ Support::BitWordIterator<Mask> it(mask);
+ while (it.has_next()) {
+ uint32_t feature_id = map.feature_id[it.next()];
+ cpu.features().add(feature_id);
+ }
+ cpu.features().remove(0xFFu);
+}
+
+#if ASMJIT_ARCH_ARM == 32
+
+// Reference:
+// - https://github.com/torvalds/linux/blob/master/arch/arm/include/uapi/asm/hwcap.h
+static constexpr HWCapMapping32 hw_cap1_mapping_table = {{
+ uint8_t(0xFF) , // [ 0]
+ uint8_t(0xFF) , // [ 1]
+ uint8_t(0xFF) , // [ 2]
+ uint8_t(0xFF) , // [ 3]
+ uint8_t(0xFF) , // [ 4]
+ uint8_t(0xFF) , // [ 5]
+ uint8_t(0xFF) , // [ 6]
+ uint8_t(Ext::kEDSP) , // [ 7] HWCAP_EDSP
+ uint8_t(0xFF) , // [ 8]
+ uint8_t(0xFF) , // [ 9]
+ uint8_t(0xFF) , // [10]
+ uint8_t(0xFF) , // [11]
+ uint8_t(Ext::kASIMD) , // [12] HWCAP_NEON
+ uint8_t(Ext::kFP) , // [13] HWCAP_VFPv3
+ uint8_t(0xFF) , // [14]
+ uint8_t(0xFF) , // [15]
+ uint8_t(Ext::kFMAC) , // [16] HWCAP_VFPv4
+ uint8_t(Ext::kIDIVA) , // [17] HWCAP_IDIVA
+ uint8_t(Ext::kIDIVT) , // [18] HWCAP_IDIVT
+ uint8_t(Ext::kVFP_D32) , // [19] HWCAP_VFPD32
+ uint8_t(0xFF) , // [20]
+ uint8_t(0xFF) , // [21]
+ uint8_t(Ext::kFP16CONV) , // [22] HWCAP_FPHP
+ uint8_t(Ext::kFP16) , // [23] HWCAP_ASIMDHP
+ uint8_t(Ext::kDOTPROD) , // [24] HWCAP_ASIMDDP
+ uint8_t(Ext::kFHM) , // [25] HWCAP_ASIMDFHM
+ uint8_t(Ext::kBF16) , // [26] HWCAP_ASIMDBF16
+ uint8_t(Ext::kI8MM) , // [27] HWCAP_I8MM
+ uint8_t(0xFF) , // [28]
+ uint8_t(0xFF) , // [29]
+ uint8_t(0xFF) , // [30]
+ uint8_t(0xFF) // [31]
+}};
+
+static constexpr HWCapMapping32 hw_cap2_mapping_table = {{
+ uint8_t(Ext::kAES) , // [ 0] HWCAP2_AES
+ uint8_t(Ext::kPMULL) , // [ 1] HWCAP2_PMULL
+ uint8_t(Ext::kSHA1) , // [ 2] HWCAP2_SHA1
+ uint8_t(Ext::kSHA256) , // [ 3] HWCAP2_SHA2
+ uint8_t(Ext::kCRC32) , // [ 4] HWCAP2_CRC32
+ uint8_t(Ext::kSB) , // [ 5] HWCAP2_SB
+ uint8_t(Ext::kSSBS) , // [ 6] HWCAP2_SSBS
+ uint8_t(0xFF) , // [ 7]
+ uint8_t(0xFF) , // [ 8]
+ uint8_t(0xFF) , // [ 9]
+ uint8_t(0xFF) , // [10]
+ uint8_t(0xFF) , // [11]
+ uint8_t(0xFF) , // [12]
+ uint8_t(0xFF) , // [13]
+ uint8_t(0xFF) , // [14]
+ uint8_t(0xFF) , // [15]
+ uint8_t(0xFF) , // [16]
+ uint8_t(0xFF) , // [17]
+ uint8_t(0xFF) , // [18]
+ uint8_t(0xFF) , // [19]
+ uint8_t(0xFF) , // [20]
+ uint8_t(0xFF) , // [21]
+ uint8_t(0xFF) , // [22]
+ uint8_t(0xFF) , // [23]
+ uint8_t(0xFF) , // [24]
+ uint8_t(0xFF) , // [25]
+ uint8_t(0xFF) , // [26]
+ uint8_t(0xFF) , // [27]
+ uint8_t(0xFF) , // [28]
+ uint8_t(0xFF) , // [29]
+ uint8_t(0xFF) , // [30]
+ uint8_t(0xFF) // [31]
+}};
+
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ cpu._was_detected = true;
+ populate_base_arm_features(cpu);
+
+ unsigned long hw_cap_masks[2] {};
+ get_aux_values(hw_cap_masks, hw_cap_tags_table, 2u);
+
+ merge_hw_caps(cpu, hw_cap_masks[0], hw_cap1_mapping_table);
+ merge_hw_caps(cpu, hw_cap_masks[1], hw_cap2_mapping_table);
+
+ CpuFeatures::ARM& features = cpu.features().arm();
+
+ // ARMv7 provides FP|ASIMD.
+ if (features.has_fp() || features.has_asimd()) {
+ features.add(CpuFeatures::ARM::kARMv7);
+ }
+
+ // ARMv8 provives AES, CRC32, PMULL, SHA1, and SHA256.
+ if (features.has_aes() || features.has_crc32() || features.has_pmull() || features.has_sha1() || features.has_sha256()) {
+ features.add(CpuFeatures::ARM::kARMv8a);
+ }
+
+ post_process_arm_cpu_info(cpu);
+}
+
+#else
+
+// Reference:
+// - https://docs.kernel.org/arch/arm64/elf_hwcaps.html
+// - https://github.com/torvalds/linux/blob/master/arch/arm64/include/uapi/asm/hwcap.h
+static constexpr HWCapMapping64 hw_cap1_mapping_table = {{
+ uint8_t(Ext::kFP) , // [ 0] HWCAP_FP
+ uint8_t(Ext::kASIMD) , // [ 1] HWCAP_ASIMD
+ uint8_t(0xFF) , // [ 2] HWCAP_EVTSTRM
+ uint8_t(Ext::kAES) , // [ 3] HWCAP_AES
+ uint8_t(Ext::kPMULL) , // [ 4] HWCAP_PMULL
+ uint8_t(Ext::kSHA1) , // [ 5] HWCAP_SHA1
+ uint8_t(Ext::kSHA256) , // [ 6] HWCAP_SHA2
+ uint8_t(Ext::kCRC32) , // [ 7] HWCAP_CRC32
+ uint8_t(Ext::kLSE) , // [ 8] HWCAP_ATOMICS
+ uint8_t(Ext::kFP16CONV) , // [ 9] HWCAP_FPHP
+ uint8_t(Ext::kFP16) , // [10] HWCAP_ASIMDHP
+ uint8_t(Ext::kCPUID) , // [11] HWCAP_CPUID
+ uint8_t(Ext::kRDM) , // [12] HWCAP_ASIMDRDM
+ uint8_t(Ext::kJSCVT) , // [13] HWCAP_JSCVT
+ uint8_t(Ext::kFCMA) , // [14] HWCAP_FCMA
+ uint8_t(Ext::kLRCPC) , // [15] HWCAP_LRCPC
+ uint8_t(Ext::kDPB) , // [16] HWCAP_DCPOP
+ uint8_t(Ext::kSHA3) , // [17] HWCAP_SHA3
+ uint8_t(Ext::kSM3) , // [18] HWCAP_SM3
+ uint8_t(Ext::kSM4) , // [19] HWCAP_SM4
+ uint8_t(Ext::kDOTPROD) , // [20] HWCAP_ASIMDDP
+ uint8_t(Ext::kSHA512) , // [21] HWCAP_SHA512
+ uint8_t(Ext::kSVE) , // [22] HWCAP_SVE
+ uint8_t(Ext::kFHM) , // [23] HWCAP_ASIMDFHM
+ uint8_t(Ext::kDIT) , // [24] HWCAP_DIT
+ uint8_t(Ext::kLSE2) , // [25] HWCAP_USCAT
+ uint8_t(Ext::kLRCPC2) , // [26] HWCAP_ILRCPC
+ uint8_t(Ext::kFLAGM) , // [27] HWCAP_FLAGM
+ uint8_t(Ext::kSSBS) , // [28] HWCAP_SSBS
+ uint8_t(Ext::kSB) , // [29] HWCAP_SB
+ uint8_t(0xFF) , // [30] HWCAP_PACA
+ uint8_t(0xFF) , // [31] HWCAP_PACG
+ uint8_t(Ext::kGCS) , // [32] HWCAP_GCS
+ uint8_t(Ext::kCMPBR) , // [33] HWCAP_CMPBR
+ uint8_t(Ext::kFPRCVT) , // [34] HWCAP_FPRCVT
+ uint8_t(Ext::kF8F32MM) , // [35] HWCAP_F8MM8
+ uint8_t(Ext::kF8F16MM) , // [36] HWCAP_F8MM4
+ uint8_t(Ext::kSVE_F16MM) , // [37] HWCAP_SVE_F16MM
+ uint8_t(Ext::kSVE_ELTPERM) , // [38] HWCAP_SVE_ELTPERM
+ uint8_t(Ext::kSVE_AES2) , // [39] HWCAP_SVE_AES2
+ uint8_t(Ext::kSVE_BFSCALE) , // [40] HWCAP_SVE_BFSCALE
+ uint8_t(Ext::kSVE2_2) , // [41] HWCAP_SVE2P2
+ uint8_t(Ext::kSME2_2) , // [42] HWCAP_SME2P2
+ uint8_t(Ext::kSSVE_BITPERM) , // [43] HWCAP_SME_SBITPERM
+ uint8_t(Ext::kSME_AES) , // [44] HWCAP_SME_AES
+ uint8_t(Ext::kSSVE_FEXPA) , // [45] HWCAP_SME_SFEXPA
+ uint8_t(Ext::kSME_TMOP) , // [46] HWCAP_SME_STMOP
+ uint8_t(Ext::kSME_MOP4) , // [47] HWCAP_SME_SMOP4
+ uint8_t(0xFF) , // [48]
+ uint8_t(0xFF) , // [49]
+ uint8_t(0xFF) , // [50]
+ uint8_t(0xFF) , // [51]
+ uint8_t(0xFF) , // [52]
+ uint8_t(0xFF) , // [53]
+ uint8_t(0xFF) , // [54]
+ uint8_t(0xFF) , // [55]
+ uint8_t(0xFF) , // [56]
+ uint8_t(0xFF) , // [57]
+ uint8_t(0xFF) , // [58]
+ uint8_t(0xFF) , // [59]
+ uint8_t(0xFF) , // [60]
+ uint8_t(0xFF) , // [61]
+ uint8_t(0xFF) , // [62]
+ uint8_t(0xFF) // [63]
+}};
+
+static constexpr HWCapMapping64 hw_cap2_mapping_table = {{
+ uint8_t(Ext::kDPB2) , // [ 0] HWCAP2_DCPODP
+ uint8_t(Ext::kSVE2) , // [ 1] HWCAP2_SVE2
+ uint8_t(Ext::kSVE_AES) , // [ 2] HWCAP2_SVEAES
+ uint8_t(Ext::kSVE_PMULL128) , // [ 3] HWCAP2_SVEPMULL
+ uint8_t(Ext::kSVE_BITPERM) , // [ 4] HWCAP2_SVEBITPERM
+ uint8_t(Ext::kSVE_SHA3) , // [ 5] HWCAP2_SVESHA3
+ uint8_t(Ext::kSVE_SM4) , // [ 6] HWCAP2_SVESM4
+ uint8_t(Ext::kFLAGM2) , // [ 7] HWCAP2_FLAGM2
+ uint8_t(Ext::kFRINTTS) , // [ 8] HWCAP2_FRINT
+ uint8_t(Ext::kSVE_I8MM) , // [ 9] HWCAP2_SVEI8MM
+ uint8_t(Ext::kSVE_F32MM) , // [10] HWCAP2_SVEF32MM
+ uint8_t(Ext::kSVE_F64MM) , // [11] HWCAP2_SVEF64MM
+ uint8_t(Ext::kSVE_BF16) , // [12] HWCAP2_SVEBF16
+ uint8_t(Ext::kI8MM) , // [13] HWCAP2_I8MM
+ uint8_t(Ext::kBF16) , // [14] HWCAP2_BF16
+ uint8_t(Ext::kDGH) , // [15] HWCAP2_DGH
+ uint8_t(Ext::kRNG) , // [16] HWCAP2_RNG
+ uint8_t(Ext::kBTI) , // [17] HWCAP2_BTI
+ uint8_t(Ext::kMTE) , // [18] HWCAP2_MTE
+ uint8_t(Ext::kECV) , // [19] HWCAP2_ECV
+ uint8_t(Ext::kAFP) , // [20] HWCAP2_AFP
+ uint8_t(Ext::kRPRES) , // [21] HWCAP2_RPRES
+ uint8_t(Ext::kMTE3) , // [22] HWCAP2_MTE3
+ uint8_t(Ext::kSME) , // [23] HWCAP2_SME
+ uint8_t(Ext::kSME_I16I64) , // [24] HWCAP2_SME_I16I64
+ uint8_t(Ext::kSME_F64F64) , // [25] HWCAP2_SME_F64F64
+ uint8_t(Ext::kSME_I8I32) , // [26] HWCAP2_SME_I8I32
+ uint8_t(Ext::kSME_F16F32) , // [27] HWCAP2_SME_F16F32
+ uint8_t(Ext::kSME_B16F32) , // [28] HWCAP2_SME_B16F32
+ uint8_t(Ext::kSME_F32F32) , // [29] HWCAP2_SME_F32F32
+ uint8_t(Ext::kSME_FA64) , // [30] HWCAP2_SME_FA64
+ uint8_t(Ext::kWFXT) , // [31] HWCAP2_WFXT
+ uint8_t(Ext::kEBF16) , // [32] HWCAP2_EBF16
+ uint8_t(Ext::kSVE_EBF16) , // [33] HWCAP2_SVE_EBF16
+ uint8_t(Ext::kCSSC) , // [34] HWCAP2_CSSC
+ uint8_t(Ext::kRPRFM) , // [35] HWCAP2_RPRFM
+ uint8_t(Ext::kSVE2_1) , // [36] HWCAP2_SVE2P1
+ uint8_t(Ext::kSME2) , // [37] HWCAP2_SME2
+ uint8_t(Ext::kSME2_1) , // [38] HWCAP2_SME2P1
+ uint8_t(Ext::kSME_I16I32) , // [39] HWCAP2_SME_I16I32
+ uint8_t(Ext::kSME_BI32I32) , // [40] HWCAP2_SME_BI32I32
+ uint8_t(Ext::kSME_B16B16) , // [41] HWCAP2_SME_B16B16
+ uint8_t(Ext::kSME_F16F16) , // [42] HWCAP2_SME_F16F16
+ uint8_t(Ext::kMOPS) , // [43] HWCAP2_MOPS
+ uint8_t(Ext::kHBC) , // [44] HWCAP2_HBC
+ uint8_t(Ext::kSVE_B16B16) , // [45] HWCAP2_SVE_B16B16
+ uint8_t(Ext::kLRCPC3) , // [46] HWCAP2_LRCPC3
+ uint8_t(Ext::kLSE128) , // [47] HWCAP2_LSE128
+ uint8_t(Ext::kFPMR) , // [48] HWCAP2_FPMR
+ uint8_t(Ext::kLUT) , // [49] HWCAP2_LUT
+ uint8_t(Ext::kFAMINMAX) , // [50] HWCAP2_FAMINMAX
+ uint8_t(Ext::kFP8) , // [51] HWCAP2_F8CVT
+ uint8_t(Ext::kFP8FMA) , // [52] HWCAP2_F8FMA
+ uint8_t(Ext::kFP8DOT4) , // [53] HWCAP2_F8DP4
+ uint8_t(Ext::kFP8DOT2) , // [54] HWCAP2_F8DP2
+ uint8_t(Ext::kF8E4M3) , // [55] HWCAP2_F8E4M3
+ uint8_t(Ext::kF8E5M2) , // [56] HWCAP2_F8E5M2
+ uint8_t(Ext::kSME_LUTv2) , // [57] HWCAP2_SME_LUTV2
+ uint8_t(Ext::kSME_F8F16) , // [58] HWCAP2_SME_F8F16
+ uint8_t(Ext::kSME_F8F32) , // [59] HWCAP2_SME_F8F32
+ uint8_t(Ext::kSSVE_FP8FMA) , // [60] HWCAP2_SME_SF8FMA
+ uint8_t(Ext::kSSVE_FP8DOT4) , // [61] HWCAP2_SME_SF8DP4
+ uint8_t(Ext::kSSVE_FP8DOT2) , // [62] HWCAP2_SME_SF8DP2
+ uint8_t(0xFF) // [63] HWCAP2_POE
+}};
+
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ cpu._was_detected = true;
+ populate_base_arm_features(cpu);
+
+ unsigned long hw_cap_masks[2] {};
+ get_aux_values(hw_cap_masks, hw_cap_tags_table, 2u);
+
+ merge_hw_caps(cpu, hw_cap_masks[0], hw_cap1_mapping_table);
+ merge_hw_caps(cpu, hw_cap_masks[1], hw_cap2_mapping_table);
+
+#if defined(ASMJIT_ARM_DETECT_VIA_CPUID)
+ if (cpu.features().arm().has_cpuid()) {
+ detect_aarch64_features_via_cpuid(cpu);
+ return;
+ }
+#endif // ASMJIT_ARM_DETECT_VIA_CPUID
+
+ post_process_arm_cpu_info(cpu);
+}
+
+#endif // ASMJIT_ARCH_ARM
+
+// CpuInfo - Detect - ARM - Detect by NetBSD API That Reads CPUID
+// ==============================================================
+
+#elif defined(__NetBSD__) && ASMJIT_ARCH_ARM >= 64
+
+//! Position of AArch64 registers in a`aarch64_sysctl_cpu_id` struct, which is filled by sysctl().
+struct NetBSDAArch64Regs {
+ enum ID : uint32_t {
+ k64_MIDR = 0, //!< Main ID Register.
+ k64_REVIDR = 8, //!< Revision ID Register.
+ k64_MPIDR = 16, //!< Multiprocessor Affinity Register.
+ k64_AA64DFR0 = 24, //!< A64 Debug Feature Register 0.
+ k64_AA64DFR1 = 32, //!< A64 Debug Feature Register 1.
+ k64_AA64ISAR0 = 40, //!< A64 Instruction Set Attribute Register 0.
+ k64_AA64ISAR1 = 48, //!< A64 Instruction Set Attribute Register 1.
+ k64_AA64MMFR0 = 56, //!< A64 Memory Model Feature Register 0.
+ k64_AA64MMFR1 = 64, //!< A64 Memory Model Feature Register 1.
+ k64_AA64MMFR2 = 72, //!< A64 Memory Model Feature Register 2.
+ k64_AA64PFR0 = 80, //!< A64 Processor Feature Register 0.
+ k64_AA64PFR1 = 88, //!< A64 Processor Feature Register 1.
+ k64_AA64ZFR0 = 96, //!< A64 SVE Feature ID Register 0.
+ k32_MVFR0 = 104, //!< Media and VFP Feature Register 0.
+ k32_MVFR1 = 108, //!< Media and VFP Feature Register 1.
+ k32_MVFR2 = 112, //!< Media and VFP Feature Register 2.
+ k32_PAD = 116, //!< Padding (not used).
+ k64_CLIDR = 120, //!< Cache Level ID Register.
+ k64_CTR = 128 //!< Cache Type Register.
+ };
+
+ enum Limits : uint32_t {
+ kBufferSize = 136
+ };
+
+ uint64_t data[kBufferSize / 8u];
+
+ ASMJIT_INLINE_NODEBUG uint64_t r64(uint32_t index) const noexcept {
+ ASMJIT_ASSERT(index % 8u == 0u);
+ return data[index / 8u];
+ }
+
+ ASMJIT_INLINE_NODEBUG uint32_t r32(uint32_t index) const noexcept {
+ ASMJIT_ASSERT(index % 4u == 0u);
+ uint32_t shift = (index % 8) * 8;
+ return uint32_t((r64(index) >> shift) & 0xFFFFFFFFu);
+ }
+};
+
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ using Regs = NetBSDAArch64Regs;
+
+ populate_base_arm_features(cpu);
+
+ Regs regs {};
+ size_t len = sizeof(regs);
+ const char sysctl_cpu_path[] = "machdep.cpu0.cpu_id";
+
+ if (sysctlbyname(sysctl_cpu_path, &regs, &len, nullptr, 0) == 0) {
+ detect_aarch64_features_via_cpuid_aa64pfr0_aa64pfr1(cpu, regs.r64(Regs::k64_AA64PFR0), regs.r64(Regs::k64_AA64PFR1));
+ detect_aarch64_features_via_cpuid_aa64isar0_aa64isar1(cpu, regs.r64(Regs::k64_AA64ISAR0), regs.r64(Regs::k64_AA64ISAR1));
+
+ // TODO: AA64ISAR2 should be added when it's provided by NetBSD.
+ // detect_aarch64_features_via_cpuid_aa64isar2(cpu, regs.r64(k64_AA64ISAR2)));
+
+ detect_aarch64_features_via_cpuid_aa64mmfr0(cpu, regs.r64(Regs::k64_AA64MMFR0));
+ detect_aarch64_features_via_cpuid_aa64mmfr1(cpu, regs.r64(Regs::k64_AA64MMFR1));
+ detect_aarch64_features_via_cpuid_aa64mmfr2(cpu, regs.r64(Regs::k64_AA64MMFR2));
+
+ // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available.
+ if (cpu.features().arm().has_any(Ext::kSVE, Ext::kSME)) {
+ detect_aarch64_features_via_cpuid_aa64zfr0(cpu, regs.r64(Regs::k64_AA64ZFR0));
+
+ // TODO: AA64SMFR0 should be added when it's provided by NetBSD.
+ // if (cpu.features().arm().has_sme()) {
+ // detect_aarch64_features_via_cpuid_aa64smfr0(cpu, regs.r64(Regs::k64_kAA64SMFR0));
+ // }
+ }
+ }
+
+ post_process_arm_cpu_info(cpu);
+}
+
+// CpuInfo - Detect - ARM - Detect by OpenBSD API That Reads CPUID
+// ===============================================================
+
+#elif defined(__OpenBSD__) && ASMJIT_ARCH_ARM >= 64
+
+// Supported CPUID registers on OpenBSD (CTL_MACHDEP definitions):
+// - https://github.com/openbsd/src/blob/master/sys/arch/arm64/include/cpu.h
+enum class OpenBSDAArch64CPUID {
+ kAA64ISAR0 = 2,
+ kAA64ISAR1 = 3,
+ kAA64ISAR2 = 4,
+ kAA64MMFR0 = 5,
+ kAA64MMFR1 = 6,
+ kAA64MMFR2 = 7,
+ kAA64PFR0 = 8,
+ kAA64PFR1 = 9,
+ kAA64SMFR0 = 10,
+ kAA64ZFR0 = 11
+};
+
+static uint64_t openbsd_read_aarch64_cpuid(OpenBSDAArch64CPUID id) noexcept {
+ uint64_t bits = 0;
+ size_t size = sizeof(bits);
+ int name[2] = { CTL_MACHDEP, int(id) };
+
+ return (sysctl(name, 2, &bits, &size, NULL, 0) < 0) ? uint64_t(0) : bits;
+}
+
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ using ID = OpenBSDAArch64CPUID;
+
+ populate_base_arm_features(cpu);
+
+ detect_aarch64_features_via_cpuid_aa64pfr0_aa64pfr1(cpu, openbsd_read_aarch64_cpuid(ID::kAA64PFR0), openbsd_read_aarch64_cpuid(ID::kAA64PFR1));
+ detect_aarch64_features_via_cpuid_aa64isar0_aa64isar1(cpu, openbsd_read_aarch64_cpuid(ID::kAA64ISAR0), openbsd_read_aarch64_cpuid(ID::kAA64ISAR1));
+ detect_aarch64_features_via_cpuid_aa64isar2(cpu, openbsd_read_aarch64_cpuid(ID::kAA64ISAR2));
+ detect_aarch64_features_via_cpuid_aa64mmfr0(cpu, openbsd_read_aarch64_cpuid(ID::kAA64MMFR0));
+ detect_aarch64_features_via_cpuid_aa64mmfr1(cpu, openbsd_read_aarch64_cpuid(ID::kAA64MMFR1));
+ detect_aarch64_features_via_cpuid_aa64mmfr2(cpu, openbsd_read_aarch64_cpuid(ID::kAA64MMFR2));
+
+ // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available.
+ if (cpu.features().arm().has_any(Ext::kSVE, Ext::kSME)) {
+ detect_aarch64_features_via_cpuid_aa64zfr0(cpu, openbsd_read_aarch64_cpuid(ID::kAA64ZFR0));
+
+ if (cpu.features().arm().has_sme()) {
+ detect_aarch64_features_via_cpuid_aa64smfr0(cpu, openbsd_read_aarch64_cpuid(ID::kAA64SMFR0));
+ }
+ }
+
+ post_process_arm_cpu_info(cpu);
+}
+
+// CpuInfo - Detect - ARM - Detect by Apple API (sysctlbyname)
+// ===========================================================
+
+#elif defined(__APPLE__)
+
+enum class AppleFeatureType : uint8_t {
+ kHWOptional,
+ kHWOptionalArmFEAT
+};
+
+struct AppleFeatureMapping {
+ AppleFeatureType type;
+ char name[18];
+ uint8_t feature_id;
+};
+
+template<typename T>
+static inline bool invoke_sysctl_by_name(const char* sysctl_name, T* dst, size_t size = sizeof(T)) noexcept {
+ return sysctlbyname(sysctl_name, dst, &size, nullptr, 0) == 0;
+}
+
+static ASMJIT_FAVOR_SIZE long apple_detect_aarch64_feature_via_sysctl(AppleFeatureType type, const char* feature_name) noexcept {
+ static const char hw_optional_prefix[] = "hw.optional.";
+ static const char hw_optional_arm_feat_prefix[] = "hw.optional.arm.FEAT_";
+
+ char sysctl_name[128];
+
+ const char* prefix = type == AppleFeatureType::kHWOptional ? hw_optional_prefix : hw_optional_arm_feat_prefix;
+ size_t prefix_size = (type == AppleFeatureType::kHWOptional ? sizeof(hw_optional_prefix) : sizeof(hw_optional_arm_feat_prefix)) - 1u;
+ size_t feature_name_size = strlen(feature_name);
+
+ if (feature_name_size < 128 - prefix_size) {
+ memcpy(sysctl_name, prefix, prefix_size);
+ memcpy(sysctl_name + prefix_size, feature_name, feature_name_size + 1u); // Include NULL terminator.
+
+ long val = 0;
+ if (invoke_sysctl_by_name<long>(sysctl_name, &val)) {
+ return val;
+ }
+ }
+
+ return 0;
+}
+
+static ASMJIT_FAVOR_SIZE void apple_detect_aarch64_features_via_sysctl(CpuInfo& cpu) noexcept {
+ using FT = AppleFeatureType;
+
+ // Based on:
+ // - https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
+ static const AppleFeatureMapping mappings[] = {
+ // Determine Advanced SIMD and Floating Point Capabilities:
+ { FT::kHWOptional , "AdvSIMD_HPFPCvt", uint8_t(Ext::kFP16CONV) },
+ { FT::kHWOptional , "neon_hpfp" , uint8_t(Ext::kFP16CONV) },
+ { FT::kHWOptionalArmFEAT, "BF16" , uint8_t(Ext::kBF16) },
+ { FT::kHWOptionalArmFEAT, "DotProd" , uint8_t(Ext::kDOTPROD) },
+ { FT::kHWOptionalArmFEAT, "FCMA" , uint8_t(Ext::kFCMA) },
+ { FT::kHWOptional , "armv8_3_compnum", uint8_t(Ext::kFCMA) },
+ { FT::kHWOptionalArmFEAT, "FHM" , uint8_t(Ext::kFHM) },
+ { FT::kHWOptional , "armv8_2_fhm" , uint8_t(Ext::kFHM) },
+ { FT::kHWOptionalArmFEAT, "FP16" , uint8_t(Ext::kFP16) },
+ { FT::kHWOptional , "neon_fp16" , uint8_t(Ext::kFP16) },
+ { FT::kHWOptionalArmFEAT, "FRINTTS" , uint8_t(Ext::kFRINTTS) },
+ { FT::kHWOptionalArmFEAT, "I8MM" , uint8_t(Ext::kI8MM) },
+ { FT::kHWOptionalArmFEAT, "JSCVT" , uint8_t(Ext::kJSCVT) },
+ { FT::kHWOptionalArmFEAT, "RDM" , uint8_t(Ext::kRDM) },
+
+ // Determine Integer Capabilities:
+ { FT::kHWOptional , "armv8_crc32" , uint8_t(Ext::kCRC32) },
+ { FT::kHWOptionalArmFEAT, "FlagM" , uint8_t(Ext::kFLAGM) },
+ { FT::kHWOptionalArmFEAT, "FlagM2" , uint8_t(Ext::kFLAGM2) },
+
+ // Determine Atomic and Memory Ordering Instruction Capabilities:
+ { FT::kHWOptionalArmFEAT, "LRCPC" , uint8_t(Ext::kLRCPC) },
+ { FT::kHWOptionalArmFEAT, "LRCPC2" , uint8_t(Ext::kLRCPC2) },
+ { FT::kHWOptional , "armv8_1_atomics", uint8_t(Ext::kLSE) },
+ { FT::kHWOptionalArmFEAT, "LSE" , uint8_t(Ext::kLSE) },
+ { FT::kHWOptionalArmFEAT, "LSE2" , uint8_t(Ext::kLSE2) },
+
+ // Determine Encryption Capabilities:
+ { FT::kHWOptionalArmFEAT, "AES" , uint8_t(Ext::kAES) },
+ { FT::kHWOptionalArmFEAT, "PMULL" , uint8_t(Ext::kPMULL) },
+ { FT::kHWOptionalArmFEAT, "SHA1" , uint8_t(Ext::kSHA1) },
+ { FT::kHWOptionalArmFEAT, "SHA256" , uint8_t(Ext::kSHA256) },
+ { FT::kHWOptionalArmFEAT, "SHA512" , uint8_t(Ext::kSHA512) },
+ { FT::kHWOptional , "armv8_2_sha512" , uint8_t(Ext::kSHA512) },
+ { FT::kHWOptionalArmFEAT, "SHA3" , uint8_t(Ext::kSHA3) },
+ { FT::kHWOptional , "armv8_2_sha3" , uint8_t(Ext::kSHA3) },
+
+ // Determine General Capabilities:
+ { FT::kHWOptionalArmFEAT, "BTI" , uint8_t(Ext::kBTI) },
+ { FT::kHWOptionalArmFEAT, "DPB" , uint8_t(Ext::kDPB) },
+ { FT::kHWOptionalArmFEAT, "DPB2" , uint8_t(Ext::kDPB2) },
+ { FT::kHWOptionalArmFEAT, "ECV" , uint8_t(Ext::kECV) },
+ { FT::kHWOptionalArmFEAT, "SB" , uint8_t(Ext::kSB) },
+ { FT::kHWOptionalArmFEAT, "SSBS" , uint8_t(Ext::kSSBS) }
+ };
+
+ for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(mappings); i++) {
+ const AppleFeatureMapping& mapping = mappings[i];
+ if (!cpu.features().arm().has(mapping.feature_id) && apple_detect_aarch64_feature_via_sysctl(mapping.type, mapping.name)) {
+ cpu.features().arm().add(mapping.feature_id);
+ }
+ }
+}
+
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ cpu._was_detected = true;
+ populate_base_arm_features(cpu);
+
+ invoke_sysctl_by_name<uint32_t>("hw.cpufamily", &cpu._family_id);
+ invoke_sysctl_by_name<uint32_t>("hw.cachelinesize", &cpu._cache_line_size);
+ invoke_sysctl_by_name<uint32_t>("machdep.cpu.logical_per_package", &cpu._max_logical_processors);
+ invoke_sysctl_by_name<char>("machdep.cpu.brand_string", cpu._brand.str, sizeof(cpu._brand.str));
+
+ memcpy(cpu._vendor.str, "APPLE", 6);
+
+ bool cpu_features_populated = detect_aarch64_features_via_apple_family_id(cpu);
+ if (!cpu_features_populated) {
+ apple_detect_aarch64_features_via_sysctl(cpu);
+ }
+ post_process_arm_cpu_info(cpu);
+}
+
+// CpuInfo - Detect - ARM - Detect by Fallback (Using Compiler Flags)
+// ==================================================================
+
+#else
+
+#if ASMJIT_ARCH_ARM == 32
+ #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch32 CPU)")
+#else
+ #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch64 CPU)")
+#endif
+
+static ASMJIT_FAVOR_SIZE void detect_arm_cpu(CpuInfo& cpu) noexcept {
+ populate_base_arm_features(cpu);
+ detect_arm_features_via_compiler_flags(cpu);
+ post_process_arm_cpu_info(cpu);
+}
+#endif
+
+static ASMJIT_FAVOR_SIZE CpuHints recalculate_hints(const CpuInfo& cpu_info, const CpuFeatures::ARM& features) noexcept {
+ Support::maybe_unused(cpu_info, features);
+
+ // Assume ARM CPUs have fast 32-bit SIMD integer multiplication.
+ CpuHints hints = CpuHints::kVecFastIntMul32;
+
+ return hints;
+}
+
+} // {arm}
+
+#endif
+
+// CpuInfo - Detect - Host
+// =======================
+
+const CpuInfo& CpuInfo::host() noexcept {
+ static std::atomic<uint32_t> cpu_info_initialized_flag;
+ static CpuInfo cpu_info_global(Globals::NoInit);
+
+ // This should never cause a problem as the resulting information should always
+ // be the same. In the worst case it would just be overwritten non-atomically.
+ if (!cpu_info_initialized_flag.load(std::memory_order_relaxed)) {
+ CpuInfo cpu_info_local;
+
+ cpu_info_local._arch = Arch::kHost;
+ cpu_info_local._sub_arch = SubArch::kHost;
+
+#if ASMJIT_ARCH_X86
+ x86::detect_x86_cpu(cpu_info_local);
+#elif ASMJIT_ARCH_ARM
+ arm::detect_arm_cpu(cpu_info_local);
+#endif
+ cpu_info_local._hw_thread_count = detect_hw_thread_count();
+ cpu_info_local.update_hints();
+
+ cpu_info_global = cpu_info_local;
+ cpu_info_initialized_flag.store(1, std::memory_order_seq_cst);
+ }
+
+ return cpu_info_global;
+}
+
+CpuHints CpuInfo::recalculate_hints(const CpuInfo& info, const CpuFeatures& features) noexcept {
+#if ASMJIT_ARCH_X86
+ return x86::recalculate_hints(info, features.x86());
+#elif ASMJIT_ARCH_ARM
+ return arm::recalculate_hints(info, features.arm());
+#else
+ Support::maybe_unused(info, features);
+ return CpuHints::kNone;
+#endif
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/cpuinfo.h b/3rdparty/asmjit/asmjit/core/cpuinfo.h
new file mode 100644
index 00000000000..921f351f625
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/cpuinfo.h
@@ -0,0 +1,1413 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_CPUINFO_H_INCLUDED
+#define ASMJIT_CORE_CPUINFO_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/environment.h>
+#include <asmjit/core/globals.h>
+#include <asmjit/core/string.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! CPU features information.
+//!
+//! Each feature is represented by a single bit in an embedded bit array.
+class CpuFeatures {
+public:
+ //! \name Constants
+ //! \{
+
+ //! \cond INTERNAL
+ static inline constexpr uint32_t kMaxFeatures = 256;
+ static inline constexpr uint32_t kNumBitWords = kMaxFeatures / Support::bit_size_of<Support::BitWord>;
+ //! \endcond
+
+ //! \}
+
+ //! \name Types
+ //! \{
+
+ //! A word that is used to represents feature bits.
+ using BitWord = Support::BitWord;
+ //! Iterator that can iterate all CPU features set.
+ using Iterator = Support::BitVectorIterator<BitWord>;
+
+ using Bits = Support::Array<BitWord, kNumBitWords>;
+
+ //! \}
+
+ //! \name Data
+ //! \{
+
+ //! CPU features data.
+ struct Data {
+ //! \name Members
+ //! \{
+
+ //! Data bits.
+ Bits _bits;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const Data& other) const noexcept { return equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const Data& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns true if there are no features set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _bits.aggregate<Support::Or>(0) == 0; }
+
+ //! Returns all features as array of bitwords (see \ref Support::BitWord).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BitWord* bits() noexcept { return _bits.data(); }
+
+ //! Returns all features as array of bitwords (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const BitWord* bits() const noexcept { return _bits.data(); }
+
+ //! Returns the number of BitWords returned by \ref bits().
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t bit_word_count() const noexcept { return kNumBitWords; }
+
+ //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Iterator iterator() const noexcept { return Iterator(_bits.as_span()); }
+
+ //! Tests whether the feature `feature_id` is present.
+ template<typename FeatureId>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has(const FeatureId& feature_id) const noexcept {
+ ASMJIT_ASSERT(uint32_t(feature_id) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(feature_id) / Support::bit_size_of<BitWord>;
+ uint32_t bit = uint32_t(feature_id) % Support::bit_size_of<BitWord>;
+
+ return bool((_bits[idx] >> bit) & 0x1);
+ }
+
+ //! \cond NONE
+ template<typename FeatureId>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_any(const FeatureId& feature_id) const noexcept {
+ return has(feature_id);
+ }
+ //! \endcond
+
+ //! Tests whether any feature given is present.
+ //!
+ //! \note This is a variadic function template that can be used with multiple features.
+ template<typename FeatureId, typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_any(const FeatureId& feature_id, Args&&... other_feature_ids) const noexcept {
+ return bool(unsigned(has(feature_id)) | unsigned(has_any(std::forward<Args>(other_feature_ids)...)));
+ }
+
+ //! Tests whether all features as defined by `other` are present.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_all(const Data& other) const noexcept {
+ uint32_t result = 1;
+ for (uint32_t i = 0; i < kNumBitWords; i++)
+ result &= uint32_t((_bits[i] & other._bits[i]) == other._bits[i]);
+ return bool(result);
+ }
+
+ //! \}
+
+ //! \name Manipulation
+ //! \{
+
+ //! Clears all features set.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _bits.fill(0); }
+
+ //! Adds the given CPU `feature_id` to the list of features.
+ template<typename FeatureId>
+ inline void add(const FeatureId& feature_id) noexcept {
+ ASMJIT_ASSERT(uint32_t(feature_id) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(feature_id) / Support::bit_size_of<BitWord>;
+ uint32_t bit = uint32_t(feature_id) % Support::bit_size_of<BitWord>;
+
+ _bits[idx] |= BitWord(1) << bit;
+ }
+
+ template<typename FeatureId, typename... Args>
+ inline void add(const FeatureId& feature_id, Args&&... other_feature_ids) noexcept {
+ add(feature_id);
+ add(std::forward<Args>(other_feature_ids)...);
+ }
+
+ template<typename FeatureId>
+ inline void add_if(bool condition, const FeatureId& feature_id) noexcept {
+ ASMJIT_ASSERT(uint32_t(feature_id) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(feature_id) / Support::bit_size_of<BitWord>;
+ uint32_t bit = uint32_t(feature_id) % Support::bit_size_of<BitWord>;
+
+ _bits[idx] |= BitWord(condition) << bit;
+ }
+
+ template<typename FeatureId, typename... Args>
+ inline void add_if(bool condition, const FeatureId& feature_id, Args&&... other_feature_ids) noexcept {
+ add_if(condition, feature_id);
+ add_if(condition, std::forward<Args>(other_feature_ids)...);
+ }
+
+ //! Removes the given CPU `feature_id` from the list of features.
+ template<typename FeatureId>
+ inline void remove(const FeatureId& feature_id) noexcept {
+ ASMJIT_ASSERT(uint32_t(feature_id) < kMaxFeatures);
+
+ uint32_t idx = uint32_t(feature_id) / Support::bit_size_of<BitWord>;
+ uint32_t bit = uint32_t(feature_id) % Support::bit_size_of<BitWord>;
+
+ _bits[idx] &= ~(BitWord(1) << bit);
+ }
+
+ template<typename FeatureId, typename... Args>
+ inline void remove(const FeatureId& feature_id, Args&&... other_feature_ids) noexcept {
+ remove(feature_id);
+ remove(std::forward<Args>(other_feature_ids)...);
+ }
+
+ //! Tests whether this CPU features data matches `other`.
+ ASMJIT_INLINE_NODEBUG bool equals(const Data& other) const noexcept { return _bits == other._bits; }
+
+ //! \}
+ };
+
+ //! X86 specific features data.
+ struct X86 : public Data {
+ //! X86 CPU feature identifiers.
+ enum Id : uint8_t {
+ // @EnumValuesBegin{"enum": "CpuFeatures::X86"}@
+ kNone, //!< No feature (never set, used internally).
+
+ kMT, //!< CPU has multi-threading capabilities.
+ kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
+ kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
+ kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) {AMD}.
+ kAPX_F, //!< CPU has APX_F (advanced performance extensions - 32 GP registers, REX2 prefix, ...) {X86_64}.
+ kBMI, //!< CPU has BMI (bit manipulation instructions #1).
+ kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
+ kCET_IBT, //!< CPU has CET-IBT (indirect branch tracking).
+ kCET_SS, //!< CPU has CET-SS.
+ kCET_SSS, //!< CPU has CET-SSS.
+ kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
+ kCLFLUSH, //!< CPU has CLFUSH (cache Line flush).
+ kCLFLUSHOPT, //!< CPU has CLFUSHOPT (cache Line flush - optimized).
+ kCLWB, //!< CPU has CLWB.
+ kCLZERO, //!< CPU has CLZERO.
+ kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
+ kCMPCCXADD, //!< CPU has CMPCCXADD.
+ kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) {X86_64}.
+ kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
+ kENCLV, //!< CPU has ENCLV.
+ kENQCMD, //!< CPU has ENQCMD (enqueue stores).
+ kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
+ kFSGSBASE, //!< CPU has FSGSBASE.
+ kFSRM, //!< CPU has FSRM (fast short REP MOVSB).
+ kFSRC, //!< CPU has FSRC (fast short REP CMPSB|SCASB).
+ kFSRS, //!< CPU has FSRS (fast short REP STOSB)
+ kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
+ kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
+ kFZRM, //!< CPU has FZRM (fast zero-length REP MOVSB).
+ kHRESET, //!< CPU has HRESET.
+ kI486, //!< CPU has I486 features (I486+ support).
+ kINVLPGB, //!< CPU has INVLPGB.
+ kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) {X86_64}.
+ kLAM, //!< CPU has LAM (linear address masking) {X86_64}.
+ kLWP, //!< CPU has LWP (lightweight profiling) {AMD}.
+ kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
+ kMCOMMIT, //!< CPU has MCOMMIT (MCOMMIT instruction).
+ kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
+ kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
+ kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
+ kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
+ kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
+ kMOVRS, //!< CPU has MOVRS (move from shared memory).
+ kMPX, //!< CPU has MPX (memory protection extensions).
+ kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
+ kMSRLIST, //!< CPU has MSRLIST.
+ kMSR_IMM, //!< CPU has MSR_IMM (RDMSR/WRMSR immediate encoding).
+ kMSSE, //!< CPU has MSSE (misaligned SSE support).
+ kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
+ kOSPKE, //!< CPU has OSPKE (PKE enabled by OS).
+ kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
+ kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
+ kPREFETCHI, //!< CPU has PREFETCHI.
+ kPREFETCHW, //!< CPU has PREFETCHW.
+ kPREFETCHWT1, //!< CPU has PREFETCHWT1.
+ kPTWRITE, //!< CPU has PTWRITE.
+ kRAO_INT, //!< CPU has RAO_INT (AADD, AAND, AOR, AXOR instructions).
+ kRMPQUERY, //!< CPU has RMPQUERY (RMPQUERY instruction).
+ kRDPID, //!< CPU has RDPID (RDPID instruction).
+ kRDPRU, //!< CPU has RDPRU (RDPRU instruction).
+ kRDRAND, //!< CPU has RDRAND (RDRAND instruction).
+ kRDSEED, //!< CPU has RDSEED (RDSEED instruction).
+ kRDTSC, //!< CPU has RDTSC.
+ kRDTSCP, //!< CPU has RDTSCP.
+ kRTM, //!< CPU has RTM (RTM instructions - deprecated).
+ kSEAM, //!< CPU has SEAM.
+ kSERIALIZE, //!< CPU has SERIALIZE.
+ kSEV, //!< CPU has SEV (secure encrypted virtualization).
+ kSEV_ES, //!< CPU has SEV_ES (SEV encrypted state).
+ kSEV_SNP, //!< CPU has SEV_SNP (SEV secure nested paging).
+ kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) {AMD}.
+ kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
+ kSME, //!< CPU has SME (secure memory encryption).
+ kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
+ kSMX, //!< CPU has SMX (safer mode extensions).
+ kSVM, //!< CPU has SVM (virtualization) {AMD}.
+ kTBM, //!< CPU has TBM (trailing bit manipulation) {AMD}.
+ kTSE, //!< CPU has TSE.
+ kTSXLDTRK, //!< CPU has TSXLDTRK.
+ kUINTR, //!< CPU has UINTR (user interrupts).
+ kVMX, //!< CPU has VMX (virtualization) {INTEL}.
+ kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
+ kWBNOINVD, //!< CPU has WBNOINVD.
+ kWRMSRNS, //!< CPU has WRMSRNS.
+ kXSAVE, //!< CPU has XSAVE.
+ kXSAVEC, //!< CPU has XSAVEC.
+ kXSAVEOPT, //!< CPU has XSAVEOPT.
+ kXSAVES, //!< CPU has XSAVES.
+
+ kFPU, //!< CPU has FPU (FPU support).
+ kMMX, //!< CPU has MMX (MMX base instructions) (deprecated).
+ kMMX2, //!< CPU has MMX2 (MMX2 extensions or initial SSE extensions) (deprecated).
+ k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) {AMD} (deprecated).
+ k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) {AMD} (deprecated).
+ kGEODE, //!< CPU has GEODE extensions (GEODE 3DNOW additions) (deprecated).
+
+ kSSE, //!< CPU has SSE (SSE instructions).
+ kSSE2, //!< CPU has SSE2 (SSE2 instructions).
+ kSSE3, //!< CPU has SSE3 (SSE3 instructions).
+ kSSSE3, //!< CPU has SSSE3 (SSSE3 instructions).
+ kSSE4_1, //!< CPU has SSE4.1 (SSE4.1 instructions).
+ kSSE4_2, //!< CPU has SSE4.2 (SSE4.2 instructions).
+ kSSE4A, //!< CPU has SSE4A (SSE4.A instructions) {AMD} (deprecated).
+ kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
+
+ kAVX, //!< CPU has AVX (advanced vector extensions).
+ kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
+ kAVX_IFMA, //!< CPU has AVX_IFMA (AVX/VEX encoding of vpmadd52huq/vpmadd52luq).
+ kAVX_NE_CONVERT, //!< CPU has AVX_NE_CONVERT.
+ kAVX_VNNI, //!< CPU has AVX_VNNI (AVX/VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds).
+ kAVX_VNNI_INT16, //!< CPU has AVX_VNNI_INT16.
+ kAVX_VNNI_INT8, //!< CPU has AVX_VNNI_INT8.
+ kF16C, //!< CPU has F16C (AVX FP16 conversion instructions).
+ kFMA, //!< CPU has FMA (AVX fused-multiply-add - 3 operand form).
+ kFMA4, //!< CPU has FMA4 (AVX fused-multiply-add - 4 operand form) (deprecated).
+ kXOP, //!< CPU has XOP (XOP instructions) {AMD} (deprecated).
+
+ kAVX512_BF16, //!< CPU has AVX512_BF16 (AVX512 BFLOAT16 support instructions).
+ kAVX512_BITALG, //!< CPU has AVX512_BITALG (AVX512 VPOPCNT[B|W] and VPSHUFBITQMB instructions).
+ kAVX512_BW, //!< CPU has AVX512_BW (AVX512 integer BYTE|WORD instructions).
+ kAVX512_CD, //!< CPU has AVX512_CD (AVX512 conflict detection DWORD|QWORD instructions).
+ kAVX512_DQ, //!< CPU has AVX512_DQ (AVX512 integer DWORD|QWORD instructions).
+ kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
+ kAVX512_FP16, //!< CPU has AVX512_FP16 (AVX512 FP16 instructions).
+ kAVX512_IFMA, //!< CPU has AVX512_IFMA (AVX512 integer fused-multiply-add using 52-bit precision).
+ kAVX512_VBMI, //!< CPU has AVX512_VBMI (AVX512 vector byte manipulation instructions).
+ kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (AVX512 vector byte manipulation instructions v2).
+ kAVX512_VL, //!< CPU has AVX512_VL (AVX512 vector length extensions).
+ kAVX512_VNNI, //!< CPU has AVX512_VNNI (AVX512 vector neural network instructions).
+ kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
+ kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (AVX512 VPOPCNT[D|Q] instructions).
+
+ kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
+ kGFNI, //!< CPU has GFNI (galois field instructions).
+ kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
+ kSHA512, //!< CPU has SHA512 (SHA-512 instructions).
+ kSM3, //!< CPU has SM3 (SM3 hash extensions).
+ kSM4, //!< CPU has SM4 (SM4 cipher extensions).
+ kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
+ kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
+
+ kKL, //!< CPU has KL (Key Locker).
+ kAESKLE, //!< CPU has AESKLE (AESKLE).
+ kAESKLEWIDE_KL, //!< CPU has AESKLE+WIDEKL+KL (AESKLE & WIDEKL instructions and KL enabled)
+
+ kAVX10_1, //!< CPU has AVX10.1/512 (AVX10.1 with 512-bit vectors).
+ kAVX10_2, //!< CPU has AVX10.2/512 (AVX10.2 with 512-bit vectors).
+
+ kAMX_AVX512, //!< CPU has AMX_AVX512 (AMX-AVX512 instructions).
+ kAMX_BF16, //!< CPU has AMX_BF16 (AMX-BF16 instructions).
+ kAMX_COMPLEX, //!< CPU has AMX_COMPLEX (AMX-COMPLEX instructions).
+ kAMX_FP16, //!< CPU has AMX_FP16 (AMX-FP16 instructions).
+ kAMX_FP8, //!< CPU has AMX_FP8 (AMX-FP8 instructions).
+ kAMX_INT8, //!< CPU has AMX_INT8 (AMX-INT8 instructions).
+ kAMX_MOVRS, //!< CPU has AMX_MOVRS (AMX-MOVRS instructions).
+ kAMX_TF32, //!< CPU has AMX_TF32 (AMX-TF32 instructions).
+ kAMX_TILE, //!< CPU has AMX_TILE (advanced matrix extensions).
+ kAMX_TRANSPOSE, //!< CPU has AMX_TRANSPOSE (AMX-TRANSPOSE instructions).
+ // @EnumValuesEnd@
+
+ kMaxValue = kAMX_TILE
+ };
+
+ #define ASMJIT_X86_FEATURE(accessor, feature) \
+ /*! Tests whether feature is present. */ \
+ ASMJIT_INLINE_NODEBUG bool accessor() const noexcept { return has(X86::feature); }
+
+ ASMJIT_X86_FEATURE(has_mt, kMT)
+ ASMJIT_X86_FEATURE(has_nx, kNX)
+ ASMJIT_X86_FEATURE(has_adx, kADX)
+ ASMJIT_X86_FEATURE(has_altmovcr8, kALTMOVCR8)
+ ASMJIT_X86_FEATURE(has_apx_f, kAPX_F)
+ ASMJIT_X86_FEATURE(has_bmi, kBMI)
+ ASMJIT_X86_FEATURE(has_bmi2, kBMI2)
+ ASMJIT_X86_FEATURE(has_cet_ibt, kCET_IBT)
+ ASMJIT_X86_FEATURE(has_cet_ss, kCET_SS)
+ ASMJIT_X86_FEATURE(has_cet_sss, kCET_SSS)
+ ASMJIT_X86_FEATURE(has_cldemote, kCLDEMOTE)
+ ASMJIT_X86_FEATURE(has_clflush, kCLFLUSH)
+ ASMJIT_X86_FEATURE(has_clflushopt, kCLFLUSHOPT)
+ ASMJIT_X86_FEATURE(has_clwb, kCLWB)
+ ASMJIT_X86_FEATURE(has_clzero, kCLZERO)
+ ASMJIT_X86_FEATURE(has_cmov, kCMOV)
+ ASMJIT_X86_FEATURE(has_cmpxchg16b, kCMPXCHG16B)
+ ASMJIT_X86_FEATURE(has_cmpxchg8b, kCMPXCHG8B)
+ ASMJIT_X86_FEATURE(has_enclv, kENCLV)
+ ASMJIT_X86_FEATURE(has_enqcmd, kENQCMD)
+ ASMJIT_X86_FEATURE(has_erms, kERMS)
+ ASMJIT_X86_FEATURE(has_fsgsbase, kFSGSBASE)
+ ASMJIT_X86_FEATURE(has_fsrm, kFSRM)
+ ASMJIT_X86_FEATURE(has_fsrc, kFSRC)
+ ASMJIT_X86_FEATURE(has_fsrs, kFSRS)
+ ASMJIT_X86_FEATURE(has_fxsr, kFXSR)
+ ASMJIT_X86_FEATURE(has_fxsropt, kFXSROPT)
+ ASMJIT_X86_FEATURE(has_fzrm, kFZRM)
+ ASMJIT_X86_FEATURE(has_hreset, kHRESET)
+ ASMJIT_X86_FEATURE(has_i486, kI486)
+ ASMJIT_X86_FEATURE(has_invlpgb, kINVLPGB)
+ ASMJIT_X86_FEATURE(has_lahfsahf, kLAHFSAHF)
+ ASMJIT_X86_FEATURE(has_lam, kLAM)
+ ASMJIT_X86_FEATURE(has_lwp, kLWP)
+ ASMJIT_X86_FEATURE(has_lzcnt, kLZCNT)
+ ASMJIT_X86_FEATURE(has_mcommit, kMCOMMIT)
+ ASMJIT_X86_FEATURE(has_monitor, kMONITOR)
+ ASMJIT_X86_FEATURE(has_monitorx, kMONITORX)
+ ASMJIT_X86_FEATURE(has_movbe, kMOVBE)
+ ASMJIT_X86_FEATURE(has_movdir64b, kMOVDIR64B)
+ ASMJIT_X86_FEATURE(has_movdiri, kMOVDIRI)
+ ASMJIT_X86_FEATURE(has_movrs, kMOVRS)
+ ASMJIT_X86_FEATURE(has_mpx, kMPX)
+ ASMJIT_X86_FEATURE(has_msr, kMSR)
+ ASMJIT_X86_FEATURE(has_msrlist, kMSRLIST)
+ ASMJIT_X86_FEATURE(has_msr_imm, kMSR_IMM)
+ ASMJIT_X86_FEATURE(has_msse, kMSSE)
+ ASMJIT_X86_FEATURE(has_osxsave, kOSXSAVE)
+ ASMJIT_X86_FEATURE(has_ospke, kOSPKE)
+ ASMJIT_X86_FEATURE(has_pconfig, kPCONFIG)
+ ASMJIT_X86_FEATURE(has_popcnt, kPOPCNT)
+ ASMJIT_X86_FEATURE(has_prefetchi, kPREFETCHI)
+ ASMJIT_X86_FEATURE(has_prefetchw, kPREFETCHW)
+ ASMJIT_X86_FEATURE(has_prefetchwt1, kPREFETCHWT1)
+ ASMJIT_X86_FEATURE(has_ptwrite, kPTWRITE)
+ ASMJIT_X86_FEATURE(has_rao_int, kRAO_INT)
+ ASMJIT_X86_FEATURE(has_rmpquery, kRMPQUERY)
+ ASMJIT_X86_FEATURE(has_rdpid, kRDPID)
+ ASMJIT_X86_FEATURE(has_rdpru, kRDPRU)
+ ASMJIT_X86_FEATURE(has_rdrand, kRDRAND)
+ ASMJIT_X86_FEATURE(has_rdseed, kRDSEED)
+ ASMJIT_X86_FEATURE(has_rdtsc, kRDTSC)
+ ASMJIT_X86_FEATURE(has_rdtscp, kRDTSCP)
+ ASMJIT_X86_FEATURE(has_rtm, kRTM)
+ ASMJIT_X86_FEATURE(has_seam, kSEAM)
+ ASMJIT_X86_FEATURE(has_serialize, kSERIALIZE)
+ ASMJIT_X86_FEATURE(has_sev, kSEV)
+ ASMJIT_X86_FEATURE(has_sev_es, kSEV_ES)
+ ASMJIT_X86_FEATURE(has_sev_snp, kSEV_SNP)
+ ASMJIT_X86_FEATURE(has_skinit, kSKINIT)
+ ASMJIT_X86_FEATURE(has_smap, kSMAP)
+ ASMJIT_X86_FEATURE(has_smep, kSMEP)
+ ASMJIT_X86_FEATURE(has_smx, kSMX)
+ ASMJIT_X86_FEATURE(has_svm, kSVM)
+ ASMJIT_X86_FEATURE(has_tbm, kTBM)
+ ASMJIT_X86_FEATURE(has_tse, kTSE)
+ ASMJIT_X86_FEATURE(has_tsxldtrk, kTSXLDTRK)
+ ASMJIT_X86_FEATURE(has_uintr, kUINTR)
+ ASMJIT_X86_FEATURE(has_vmx, kVMX)
+ ASMJIT_X86_FEATURE(has_waitpkg, kWAITPKG)
+ ASMJIT_X86_FEATURE(has_wbnoinvd, kWBNOINVD)
+ ASMJIT_X86_FEATURE(has_wrmsrns, kWRMSRNS)
+ ASMJIT_X86_FEATURE(has_xsave, kXSAVE)
+ ASMJIT_X86_FEATURE(has_xsavec, kXSAVEC)
+ ASMJIT_X86_FEATURE(has_xsaveopt, kXSAVEOPT)
+ ASMJIT_X86_FEATURE(has_xsaves, kXSAVES)
+
+ ASMJIT_X86_FEATURE(has_fpu, kFPU)
+ ASMJIT_X86_FEATURE(has_mmx, kMMX)
+ ASMJIT_X86_FEATURE(has_mmx2, kMMX2)
+ ASMJIT_X86_FEATURE(has_3dnow, k3DNOW)
+ ASMJIT_X86_FEATURE(has_3dnow2, k3DNOW2)
+ ASMJIT_X86_FEATURE(has_geode, kGEODE)
+
+ ASMJIT_X86_FEATURE(has_sse, kSSE)
+ ASMJIT_X86_FEATURE(has_sse2, kSSE2)
+ ASMJIT_X86_FEATURE(has_sse3, kSSE3)
+ ASMJIT_X86_FEATURE(has_ssse3, kSSSE3)
+ ASMJIT_X86_FEATURE(has_sse4_1, kSSE4_1)
+ ASMJIT_X86_FEATURE(has_sse4_2, kSSE4_2)
+ ASMJIT_X86_FEATURE(has_sse4a, kSSE4A)
+ ASMJIT_X86_FEATURE(has_pclmulqdq, kPCLMULQDQ)
+
+ ASMJIT_X86_FEATURE(has_avx, kAVX)
+ ASMJIT_X86_FEATURE(has_avx2, kAVX2)
+ ASMJIT_X86_FEATURE(has_avx_ifma, kAVX_IFMA)
+ ASMJIT_X86_FEATURE(has_avx_ne_convert, kAVX_NE_CONVERT)
+ ASMJIT_X86_FEATURE(has_avx_vnni, kAVX_VNNI)
+ ASMJIT_X86_FEATURE(has_avx_vnni_int16, kAVX_VNNI_INT16)
+ ASMJIT_X86_FEATURE(has_avx_vnni_int8, kAVX_VNNI_INT8)
+ ASMJIT_X86_FEATURE(has_f16c, kF16C)
+ ASMJIT_X86_FEATURE(has_fma, kFMA)
+ ASMJIT_X86_FEATURE(has_fma4, kFMA4)
+ ASMJIT_X86_FEATURE(has_xop, kXOP)
+
+ ASMJIT_X86_FEATURE(has_avx512_bf16, kAVX512_BF16)
+ ASMJIT_X86_FEATURE(has_avx512_bitalg, kAVX512_BITALG)
+ ASMJIT_X86_FEATURE(has_avx512_bw, kAVX512_BW)
+ ASMJIT_X86_FEATURE(has_avx512_cd, kAVX512_CD)
+ ASMJIT_X86_FEATURE(has_avx512_dq, kAVX512_DQ)
+ ASMJIT_X86_FEATURE(has_avx512_f, kAVX512_F)
+ ASMJIT_X86_FEATURE(has_avx512_fp16, kAVX512_FP16)
+ ASMJIT_X86_FEATURE(has_avx512_ifma, kAVX512_IFMA)
+ ASMJIT_X86_FEATURE(has_avx512_vbmi, kAVX512_VBMI)
+ ASMJIT_X86_FEATURE(has_avx512_vbmi2, kAVX512_VBMI2)
+ ASMJIT_X86_FEATURE(has_avx512_vl, kAVX512_VL)
+ ASMJIT_X86_FEATURE(has_avx512_vnni, kAVX512_VNNI)
+ ASMJIT_X86_FEATURE(has_avx512_vp2intersect, kAVX512_VP2INTERSECT)
+ ASMJIT_X86_FEATURE(has_avx512_vpopcntdq, kAVX512_VPOPCNTDQ)
+
+ ASMJIT_X86_FEATURE(has_aesni, kAESNI)
+ ASMJIT_X86_FEATURE(has_gfni, kGFNI)
+ ASMJIT_X86_FEATURE(has_sha, kSHA)
+ ASMJIT_X86_FEATURE(has_sha512, kSHA512)
+ ASMJIT_X86_FEATURE(has_sm3, kSM3)
+ ASMJIT_X86_FEATURE(has_sm4, kSM4)
+ ASMJIT_X86_FEATURE(has_vaes, kVAES)
+ ASMJIT_X86_FEATURE(has_vpclmulqdq, kVPCLMULQDQ)
+
+ ASMJIT_X86_FEATURE(has_kl, kKL)
+ ASMJIT_X86_FEATURE(has_aeskle, kAESKLE)
+ ASMJIT_X86_FEATURE(has_aesklewide_kl, kAESKLEWIDE_KL)
+
+ ASMJIT_X86_FEATURE(has_avx10_1, kAVX10_1)
+ ASMJIT_X86_FEATURE(has_avx10_2, kAVX10_2)
+
+ ASMJIT_X86_FEATURE(has_amx_avx512, kAMX_AVX512)
+ ASMJIT_X86_FEATURE(has_amx_bf16, kAMX_BF16)
+ ASMJIT_X86_FEATURE(has_amx_complex, kAMX_COMPLEX)
+ ASMJIT_X86_FEATURE(has_amx_fp16, kAMX_FP16)
+ ASMJIT_X86_FEATURE(has_amx_fp8, kAMX_FP8)
+ ASMJIT_X86_FEATURE(has_amx_int8, kAMX_INT8)
+ ASMJIT_X86_FEATURE(has_amx_movrs, kAMX_MOVRS)
+ ASMJIT_X86_FEATURE(has_amx_tf32, kAMX_TF32)
+ ASMJIT_X86_FEATURE(has_amx_tile, kAMX_TILE)
+ ASMJIT_X86_FEATURE(has_amx_transpose, kAMX_TRANSPOSE)
+
+ #undef ASMJIT_X86_FEATURE
+
+ ASMJIT_INLINE void remove_avx() noexcept {
+ remove(kAVX ,
+ kAVX2 ,
+ kAVX_IFMA ,
+ kAVX_NE_CONVERT ,
+ kAVX_VNNI ,
+ kAVX_VNNI_INT16 ,
+ kAVX_VNNI_INT8 ,
+ kF16C ,
+ kFMA ,
+ kFMA4 ,
+ kVAES ,
+ kVPCLMULQDQ ,
+ kXOP);
+ remove_avx512();
+ }
+
+ ASMJIT_INLINE void remove_avx512() noexcept {
+ remove(kAVX512_BF16 ,
+ kAVX512_BITALG ,
+ kAVX512_BW ,
+ kAVX512_CD ,
+ kAVX512_DQ ,
+ kAVX512_F ,
+ kAVX512_FP16 ,
+ kAVX512_IFMA ,
+ kAVX512_VBMI ,
+ kAVX512_VBMI2 ,
+ kAVX512_VL ,
+ kAVX512_VNNI ,
+ kAVX512_VP2INTERSECT ,
+ kAVX512_VPOPCNTDQ ,
+ kAMX_AVX512);
+ remove_avx10();
+ }
+
+ ASMJIT_INLINE void remove_avx10() noexcept {
+ remove(kAVX10_1 | kAVX10_2);
+ }
+
+ ASMJIT_INLINE void remove_amx() noexcept {
+ remove(kAMX_AVX512 ,
+ kAMX_BF16 ,
+ kAMX_COMPLEX ,
+ kAMX_FP16 ,
+ kAMX_FP8 ,
+ kAMX_INT8 ,
+ kAMX_MOVRS ,
+ kAMX_TF32 ,
+ kAMX_TILE ,
+ kAMX_TRANSPOSE);
+ }
+ };
+
+ //! ARM specific features data.
+ //!
+ //! Naming reference:
+ //! - https://developer.arm.com/downloads/-/exploration-tools/feature-names-for-a-profile
+ struct ARM : public Data {
+ //! ARM CPU feature identifiers.
+ enum Id : uint8_t {
+ // @EnumValuesBegin{"enum": "CpuFeatures::ARM"}@
+ kNone = 0, //!< No feature (never set, used internally).
+
+ kARMv6, //!< CPU is at least ARMv6 {A32}.
+ kARMv7, //!< CPU is at least ARMv7 {A32}.
+ kARMv8a, //!< CPU is at least ARMv8A.
+ kTHUMB, //!< CPU has THUMB (16-bit THUMB encoding) {A32}.
+ kTHUMBv2, //!< CPU has THUMBv2 (32-bit THUMB encoding) {A32}.
+
+ kABLE, //!< CPU has ABLE (address breakpoint linking extension) {A64}.
+ kADERR, //!< CPU has ADERR (asynchronous device error exceptions) {A64}.
+ kAES, //!< CPU has AES (ASIMD AES instructions).
+ kAFP, //!< CPU has AFP (alternate floating-point behavior) {A64}.
+ kAIE, //!< CPU has AIE (memory attribute index enhancement) {A64}.
+ kAMU1, //!< CPU has AMUv1 (activity monitors extension version 1) {A64}.
+ kAMU1_1, //!< CPU has AMUv1p1 (activity monitors extension version 1.1) {A64}.
+ kANERR, //!< CPU has ANERR (asynchronous normal error exception) {A64}.
+ kASIMD, //!< CPU has ASIMD (NEON on ARM/THUMB).
+ kBF16, //!< CPU has BF16 (BFloat16 instructions) {A64}.
+ kBRBE, //!< CPU has BRBE (branch record buffer extension) {A64}.
+ kBTI, //!< CPU has BTI (branch target identification).
+ kBWE, //!< CPU has BWE (breakpoint mismatch and range extension) {A64}.
+ kCCIDX, //!< CPU has CCIDX (extend of the CCSIDR number of sets).
+ kCHK, //!< CPU has CHK (check feature status - CHKFEAT instruction) {A64}.
+ kCLRBHB, //!< CPU has CLRBHB (clear BHB instruction).
+ kCMOW, //!< CPU has CMOW (control for cache maintenance permission) {A64}.
+ kCMPBR, //!< CPU has CMPBR (Compare and branch instructions) {A64}.
+ kCONSTPACFIELD, //!< CPU has CONSTPACFIELD (PAC algorithm enhancement) {A64}.
+ kCPA, //!< CPU has CPA (instruction-only Checked Pointer Arithmetic) {A64}.
+ kCPA2, //!< CPU has CPA2 (checked Pointer Arithmetic) {A64}.
+ kCPUID, //!< CPU has CPUID (CPUID registers accessible in user-space).
+ kCRC32, //!< CPU has CRC32 (CRC32 instructions).
+ kCSSC, //!< CPU has CSSC (common short sequence compression) {A64}.
+ kCSV2, //!< CPU has CSV2 (cache speculation variant 2 version 2.1) {A64}.
+ kCSV2_3, //!< CPU has CSV2_3 (cache speculation variant 2 version 3) {A64}.
+ kCSV3, //!< CPU has CSV3 (cache speculation Variant 3) {A64}.
+ kD128, //!< CPU has D128 (128-bit translation tables, 56 bit PA) {A64}.
+ kDGH, //!< CPU has DGH (data gathering hint) {A64}.
+ kDIT, //!< CPU has DIT (data independent timing of instructions).
+ kDOTPROD, //!< CPU has DOTPROD (ASIMD Int8 dot product instructions).
+ kDPB, //!< CPU has DPB (DC CVAP instruction) {A64}.
+ kDPB2, //!< CPU has DPB2 (DC CVADP instruction) {A64}.
+ kEBEP, //!< CPU has EBEP (exception-based event profiling) {A64}.
+ kEBF16, //!< CPU has EBF16 (extended BFloat16 mode) {A64}.
+ kECBHB, //!< CPU has ECBHB (exploitative control using branch history information) {A64}.
+ kECV, //!< CPU has ECV (enhanced counter virtualization).
+ kEDHSR, //!< CPU has EDHSR (support for EDHSR) {A64}.
+ kEDSP, //!< CPU has EDSP (ARM/THUMB only).
+ kF8E4M3, //!< CPU has F8E4M3 {A64}.
+ kF8E5M2, //!< CPU has F8E5M2 {A64}.
+ kF8F16MM, //!< CPU has F8F16MM (8-bit floating-point matrix multiply-accumulate to half-precision) {A64}
+ kF8F32MM, //!< CPU has F8F32MM (8-bit floating-point matrix multiply-accumulate to single-precision) {A64}
+ kFAMINMAX, //!< CPU has FAMINMAX (floating-point maximum and minimum absolute value instructions) {A64}.
+ kFCMA, //!< CPU has FCMA (FCADD/FCMLA).
+ kFGT, //!< CPU has FGT (fine-grained traps).
+ kFGT2, //!< CPU has FGT2 (fine-grained traps 2).
+ kFHM, //!< CPU has FHM (half-precision floating-point FMLAL instructions).
+ kFLAGM, //!< CPU has FLAGM (condition flag manipulation) {A64}.
+ kFLAGM2, //!< CPU has FLAGM2 (condition flag manipulation version v2) {A64}.
+ kFMAC, //!< CPU has FMAC (ARM/THUMB only).
+ kFP, //!< CPU has FP (floating-point) (on 32-bit ARM this means VFPv3).
+ kFP16, //!< CPU has FP16 (half-precision floating-point data processing).
+ kFP16CONV, //!< CPU has FP16CONV (half-precision float conversion).
+ kFP8, //!< CPU has FP8 (FP8 convert instructions) {A64}.
+ kFP8DOT2, //!< CPU has FP8DOT2 (FP8 2-way dot product to half-precision instructions) {A64}.
+ kFP8DOT4, //!< CPU has FP8DOT4 (FP8 4-way dot product to single-precision instructions) {A64}.
+ kFP8FMA, //!< CPU has FP8FMA (FP8 multiply-accumulate to half-precision and single-precision instructions) {A64}.
+ kFPMR, //!< CPU has FPMR (floating-point Mode Register) {A64}.
+ kFPRCVT, //!< CPU has FPRCVT (floating-point to/from integer in scalar FP register) {A64}.
+ kFRINTTS, //!< CPU has FRINTTS (FRINT[32|64][X|Z] instructions) {A64}.
+ kGCS, //!< CPU has GCS (guarded control stack extension) {A64}.
+ kHACDBS, //!< CPU has HACDBS (hardware accelerator for cleaning Dirty state) {A64}.
+ kHAFDBS, //!< CPU has HAFDBS (hardware management of the access flag and dirty state) {A64}.
+ kHAFT, //!< CPU has HAFT (hardware managed access flag for table descriptors) {A64}.
+ kHDBSS, //!< CPU has HDBSS (hardware Dirty state tracking Structure) {A64}.
+ kHBC, //!< CPU has HBC (hinted conditional branches) {A64}.
+ kHCX, //!< CPU has HCX (support for the HCRX_EL2 register) {A64}.
+ kHPDS, //!< CPU has HPDS (hierarchical permission disables in translation tables ) {A64}.
+ kHPDS2, //!< CPU has HPDS2 (hierarchical permission disables) {A64}.
+ kI8MM, //!< CPU has I8MM (int8 matrix multiplication) {A64}.
+ kIDIVA, //!< CPU has IDIV (hardware SDIV and UDIV in ARM mode).
+ kIDIVT, //!< CPU has IDIV (hardware SDIV and UDIV in THUMB mode).
+ kITE, //!< CPU has ITE (instrumentation extension) {A64}.
+ kJSCVT, //!< CPU has JSCVT (JavaScript FJCVTS conversion instruction) {A64}.
+ kLOR, //!< CPU has LOR (limited ordering regions extension).
+ kLRCPC, //!< CPU has LRCPC (load-acquire RCpc instructions) {A64}.
+ kLRCPC2, //!< CPU has LRCPC2 (load-acquire RCpc instructions v2) {A64}.
+ kLRCPC3, //!< CPU has LRCPC3 (load-Acquire RCpc instructions v3) {A64}.
+ kLS64, //!< CPU has LS64 (64 byte loads/stores without return) {A64}.
+ kLS64_ACCDATA, //!< CPU has LS64_ACCDATA (64-byte EL0 stores with return) {A64}.
+ kLS64_V, //!< CPU has LS64_V (64-byte stores with return) {A64}.
+ kLS64WB, //!< CPU has LS64WB (LS64 for Write-back cacheable memory) {A64}
+ kLSE, //!< CPU has LSE (large system extensions) {A64}.
+ kLSE128, //!< CPU has LSE128 (128-bit atomics) {A64}.
+ kLSE2, //!< CPU has LSE2 (large system extensions v2) {A64}.
+ kLSFE, //!< CPU has LSFE (large system float extension) {A64}.
+ kLSUI, //!< CPU has LSUI (unprivileged load store) {A64}.
+ kLUT, //!< CPU has LUT (lookup table instructions with 2-bit and 4-bit indices) {A64}.
+ kLVA, //!< CPU has LVA (large VA support) {A64}.
+ kLVA3, //!< CPU has LVA3 (56-bit VA) {A64}.
+ kMEC, //!< CPU has MEC (memory encryption contexts) {A64}.
+ kMOPS, //!< CPU has MOPS (memcpy and memset acceleration instructions) {A64}.
+ kMPAM, //!< CPU has MPAM (memory system partitioning and monitoring extension) {A64}.
+ kMTE, //!< CPU has MTE (instruction-only memory tagging extension) {A64}.
+ kMTE2, //!< CPU has MTE2 (full memory tagging extension) {A64}.
+ kMTE3, //!< CPU has MTE3 (MTE asymmetric fault handling) {A64}.
+ kMTE4, //!< CPU has MTE4 (MTE v4) {A64}.
+ kMTE_ASYM_FAULT, //!< CPU has MTE_ASYM_FAULT (memory tagging asymmetric faults) {A64}.
+ kMTE_ASYNC, //!< CPU has MTE_ASYNC (memory tagging asynchronous faulting) {A64}.
+ kMTE_CANONICAL_TAGS, //!< CPU has MTE_CANONICAL_TAGS (canonical tag checking for untagged memory) {A64}.
+ kMTE_NO_ADDRESS_TAGS, //!< CPU has MTE_NO_ADDRESS_TAGS (memory tagging with address tagging disabled) {A64}.
+ kMTE_PERM_S1, //!< CPU has MTE_PERM_S1 (allocation tag access permission) {A64}.
+ kMTE_STORE_ONLY, //!< CPU has MTE_STORE_ONLY (store-only tag checking) {A64}.
+ kMTE_TAGGED_FAR, //!< CPU has MTE_TAGGED_FAR (FAR_ELx on a tag check fault) {A64}.
+ kMTPMU, //!< CPU has MTPMU (multi-threaded PMU extensions) {A64}.
+ kNMI, //!< CPU has NMI (non-maskable Interrupt) {A64}.
+ kNV, //!< CPU has NV (nested virtualization enchancement) {A64}.
+ kNV2, //!< CPU has NV2 (enhanced support for nested virtualization) {A64}.
+ kOCCMO, //!< CPU has OCCMO (outer cacheable cache maintenance operation) {A64}.
+ kPAN, //!< CPU has PAN (privileged access-never extension) {A64}.
+ kPAN2, //!< CPU has PAN2 (PAN s1e1R and s1e1W variants) {A64}.
+ kPAN3, //!< CPU has PAN3 (support for SCTLR_ELx.EPAN) {A64}.
+ kPAUTH, //!< CPU has PAUTH (pointer authentication extension) {A64}.
+ kPFAR, //!< CPU has PFAR (physical fault address registers) {A64}.
+ kPMU, //!< CPU has PMU {A64}.
+ kPMULL, //!< CPU has PMULL (ASIMD PMULL instructions) {A64}.
+ kPRFMSLC, //!< CPU has PRFMSLC (PRFM instructions support the SLC target) {A64}.
+ kRAS, //!< CPU has RAS (reliability, availability and serviceability extensions).
+ kRAS1_1, //!< CPU has RASv1p1 (RAS v1.1).
+ kRAS2, //!< CPU has RASv2 (RAS v2).
+ kRASSA2, //!< CPU has RASSAv2 (RAS v2 system architecture).
+ kRDM, //!< CPU has RDM (rounding double multiply accumulate) {A64}.
+ kRME, //!< CPU has RME (memory encryption contexts extension) {A64}.
+ kRNG, //!< CPU has RNG (random number generation).
+ kRNG_TRAP, //!< CPU has RNG_TRAP (random number trap to EL3 field) {A64}.
+ kRPRES, //!< CPU has RPRES (increased precision of reciprocal estimate and RSQRT estimate) {A64}.
+ kRPRFM, //!< CPU has RPRFM (range prefetch hint instruction).
+ kS1PIE, //!< CPU has S1PIE (permission model enhancements) {A64}.
+ kS1POE, //!< CPU has S1POE (permission model enhancements) {A64}.
+ kS2PIE, //!< CPU has S2PIE (permission model enhancements) {A64}.
+ kS2POE, //!< CPU has S2POE (permission model enhancements) {A64}.
+ kSB, //!< CPU has SB (speculative barrier).
+ kSCTLR2, //!< CPU has SCTLR2 (extension to SCTLR_ELx) {A64}.
+ kSEBEP, //!< CPU has SEBEP (synchronous exception-based event profiling) {A64}.
+ kSEL2, //!< CPU has SEL2 (secure EL2) {A64}.
+ kSHA1, //!< CPU has SHA1 (ASIMD SHA1 instructions).
+ kSHA256, //!< CPU has SHA256 (ASIMD SHA256 instructions).
+ kSHA3, //!< CPU has SHA3 (ASIMD EOR3, RAX1, XAR, and BCAX instructions).
+ kSHA512, //!< CPU has SHA512 (ASIMD SHA512 instructions).
+ kSM3, //!< CPU has SM3 (ASIMD SM3 instructions).
+ kSM4, //!< CPU has SM4 (ASIMD SM4 instructions).
+ kSME, //!< CPU has SME (SME v1 - scalable matrix extension) {A64}.
+ kSME2, //!< CPU has SME2 (SME v2) {A64}.
+ kSME2_1, //!< CPU has SME2p1 (SME v2.1) {A64}.
+ kSME2_2, //!< CPU has SME2p1 (SME v2.2) {A64}.
+ kSME_AES, //!< CPU has SME_AES {A64}.
+ kSME_B16B16, //!< CPU has SME_B16B16 (SME non-widening BFloat16 to BFloat16 arithmetic) {A64}.
+ kSME_B16F32, //!< CPU has SME_B16F32 (BFMOPA and BFMOPS instructions that accumulate BFloat16 outer products into single-precision tiles) {A64}.
+ kSME_BI32I32, //!< CPU has SME_BI32I32 (BMOPA and BMOPS instructions that accumulate 1-bit binary outer products into 32-bit integer tiles) {A64}.
+ kSME_F16F16, //!< CPU has SME_F16F16 (SME2.1 non-widening half-precision FP16 to FP16 arithmetic) {A64}.
+ kSME_F16F32, //!< CPU has SME_F16F32 {A64}.
+ kSME_F32F32, //!< CPU has SME_F32F32 {A64}.
+ kSME_F64F64, //!< CPU has SME_F64F64 {A64}.
+ kSME_F8F16, //!< CPU has SME_F8F16 (SME2 ZA-targeting FP8 multiply-accumulate, dot product, and outer product to half-precision instructions) {A64}.
+ kSME_F8F32, //!< CPU has SME_F8F32 (SME2 ZA-targeting FP8 multiply-accumulate, dot product, and outer product to single-precision instructions) {A64}.
+ kSME_FA64, //!< CPU has SME_FA64 {A64}.
+ kSME_I16I32, //!< CPU has SME_I16I32 {A64}.
+ kSME_I16I64, //!< CPU has SME_I16I64 {A64}.
+ kSME_I8I32, //!< CPU has SME_I8I32 {A64}.
+ kSME_LUTv2, //!< CPU has SME_LUTv2 (lookup table instructions with 4-bit indices and 8-bit elements) {A64}.
+ kSME_MOP4, //!< CPU has SME_MOP4 (quarter-tile outer product instructions) {A64}.
+ kSME_TMOP, //!< CPU has SME_TMOP {A64}.
+ kSPE, //!< CPU has SPE (statistical profiling extension) {A64}.
+ kSPE1_1, //!< CPU has SPEv1p1 (statistical profiling extensions version 1.1) {A64}.
+ kSPE1_2, //!< CPU has SPEv1p2 (statistical profiling extensions version 1.2) {A64}.
+ kSPE1_3, //!< CPU has SPEv1p3 (statistical profiling extensions version 1.3) {A64}.
+ kSPE1_4, //!< CPU has SPEv1p4 (statistical profiling extensions version 1.4) {A64}.
+ kSPE_ALTCLK, //!< CPU has SPE_ALTCLK (statistical profiling alternate clock domain extension) {A64}.
+ kSPE_CRR, //!< CPU has SPE_CRR (statistical profiling call return branch records) {A64}.
+ kSPE_EFT, //!< CPU has SPE_EFT (statistical profiling extended filtering by type) {A64}.
+ kSPE_FDS, //!< CPU has SPE_FDS (statistical profiling data source filtering) {A64}.
+ kSPE_FPF, //!< CPU has SPE_FPF (statistical profiling floating-point flag extension) {A64}.
+ kSPE_SME, //!< CPU has SPE_SME (statistical profiling extensions for SME) {A64}.
+ kSPECRES, //!< CPU has SPECRES (speculation restriction instructions).
+ kSPECRES2, //!< CPU has SPECRES2 (clear other speculative predictions).
+ kSPMU, //!< CPU has SPMU (system performance monitors extension) {A64}.
+ kSSBS, //!< CPU has SSBS (speculative store bypass safe instruction).
+ kSSBS2, //!< CPU has SSBS2 (MRS and MSR instructions for SSBS).
+ kSSVE_AES, //!< CPU has SSVE_AES {A64}.
+ kSSVE_BITPERM, //!< CPU has SSVE_BITPERM {A64}.
+ kSSVE_FEXPA, //!< CPU has SSVE_FEXPA {A64}.
+ kSSVE_FP8DOT2, //!< CPU has SSVE_FP8DOT2 (SVE2 FP8 2-way dot product to half-precision instructions in Streaming SVE mode) {A64}.
+ kSSVE_FP8DOT4, //!< CPU has SSVE_FP8DOT4 (SVE2 FP8 4-way dot product to single-precision instructions in Streaming SVE mode) {A64}.
+ kSSVE_FP8FMA, //!< CPU has SSVE_FP8FMA (SVE2 FP8 multiply-accumulate to half-precision and single-precision instructions in Streaming SVE mode) {A64}.
+ kSVE, //!< CPU has SVE (SVE v1 - scalable vector extension) {A64}.
+ kSVE2, //!< CPU has SVE2 (SVE v2) {A64}.
+ kSVE2_1, //!< CPU has SVE2p1 (SVE v2.1) {A64}.
+ kSVE2_2, //!< CPU has SVE2p2 (SVE v2.2) {A64}.
+ kSVE_AES, //!< CPU has SVE_AES (SVE AES instructions) {A64}.
+ kSVE_AES2, //!< CPU has SVE_AES2 {A64}.
+ kSVE_B16B16, //!< CPU has SVE_B16B16 (SVE non-widening BFloat16 to BFloat16 arithmetic) {A64}.
+ kSVE_BF16, //!< CPU has SVE_BF16 (SVE BF16 instructions) {A64}.
+ kSVE_BFSCALE, //!< CPU has SVE_BFSCALE {A64}.
+ kSVE_BITPERM, //!< CPU has SVE_BITPERM (SVE bit permute) {A64}.
+ kSVE_EBF16, //!< CPU has SVE_EBF16 (SVE extended BFloat16 mode) {A64}.
+ kSVE_ELTPERM, //!< CPU has SVE_ELTPERM {A64}.
+ kSVE_F16MM, //!< CPU has SVE_F16MM (SVE half-precision floating-point matrix multiply instruction) {A64}.
+ kSVE_F32MM, //!< CPU has SVE_F32MM (SVE single-precision floating-point matrix multiply instruction) {A64}.
+ kSVE_F64MM, //!< CPU has SVE_F64MM (SVE double-precision floating-point matrix multiply instruction) {A64}.
+ kSVE_I8MM, //!< CPU has SVE_I8MM (SVE int8 matrix multiplication) {A64}.
+ kSVE_PMULL128, //!< CPU has SVE_PMULL128 (SVE PMULL instructions) {A64}.
+ kSVE_SHA3, //!< CPU has SVE_SHA3 (SVE SHA-3 instructions) {A64}.
+ kSVE_SM4, //!< CPU has SVE_SM4 (SVE SM4 instructions {A64}.
+ kSYSINSTR128, //!< CPU has SYSINSTR128 (128-bit system instructions) {A64}.
+ kSYSREG128, //!< CPU has SYSREG128 (128-bit system registers) {A64}.
+ kTHE, //!< CPU has THE (translation hardening extension).
+ kTLBIOS, //!< CPU has TLBIOS (TLBI instructions in Outer Shareable domain) {A64}.
+ kTLBIRANGE, //!< CPU has TLBIRANGE (TLBI range instructions) {A64}.
+ kTLBIW, //!< CPU has TLBIW (TLBI VMALL for dirty state) {A64}.
+ kTME, //!< CPU has TME (transactional memory extensions).
+ kTRF, //!< CPU has TRF (self-hosted trace extensions).
+ kUAO, //!< CPU has UAO (AArch64 v8.2 UAO PState) {A64}.
+ kVFP_D32, //!< CPU has VFP_D32 (32 VFP-D registers) (ARM/THUMB only).
+ kVHE, //!< CPU has VHE (virtual host extension).
+ kVMID16, //!< CPU has VMID16 (16-bit VMID) {A64}.
+ kWFXT, //!< CPU has WFxT (WFE and WFI instructions with timeout) {A64}.
+ kXNX, //!< CPU has XNX (translation table stage 2 unprivileged execute-never) {A64}.
+ kXS, //!< CPU has XS (XS attribute in TLBI and DSB instructions) {A64}.
+ // @EnumValuesEnd@
+
+ kMaxValue = kXS
+ };
+
+ #define ASMJIT_ARM_FEATURE(accessor, feature) \
+ /*! Tests whether feature is present. */ \
+ ASMJIT_INLINE_NODEBUG bool accessor() const noexcept { return has(ARM::feature); }
+
+ ASMJIT_ARM_FEATURE(has_thumb, kTHUMB)
+ ASMJIT_ARM_FEATURE(has_thumb_v2, kTHUMBv2)
+
+ ASMJIT_ARM_FEATURE(has_armv6, kARMv6)
+ ASMJIT_ARM_FEATURE(has_armv7, kARMv7)
+ ASMJIT_ARM_FEATURE(has_armv8a, kARMv8a)
+
+ ASMJIT_ARM_FEATURE(has_able, kABLE)
+ ASMJIT_ARM_FEATURE(has_aderr, kADERR)
+ ASMJIT_ARM_FEATURE(has_aes, kAES)
+ ASMJIT_ARM_FEATURE(has_afp, kAFP)
+ ASMJIT_ARM_FEATURE(has_aie, kAIE)
+ ASMJIT_ARM_FEATURE(has_amu1, kAMU1)
+ ASMJIT_ARM_FEATURE(has_amu1_1, kAMU1_1)
+ ASMJIT_ARM_FEATURE(has_anerr, kANERR)
+ ASMJIT_ARM_FEATURE(has_asimd, kASIMD)
+ ASMJIT_ARM_FEATURE(has_bf16, kBF16)
+ ASMJIT_ARM_FEATURE(has_brbe, kBRBE)
+ ASMJIT_ARM_FEATURE(has_bti, kBTI)
+ ASMJIT_ARM_FEATURE(has_bwe, kBWE)
+ ASMJIT_ARM_FEATURE(has_ccidx, kCCIDX)
+ ASMJIT_ARM_FEATURE(has_chk, kCHK)
+ ASMJIT_ARM_FEATURE(has_clrbhb, kCLRBHB)
+ ASMJIT_ARM_FEATURE(has_cmow, kCMOW)
+ ASMJIT_ARM_FEATURE(has_cmpbr, kCMPBR)
+ ASMJIT_ARM_FEATURE(has_constpacfield, kCONSTPACFIELD)
+ ASMJIT_ARM_FEATURE(has_cpa, kCPA)
+ ASMJIT_ARM_FEATURE(has_cpa2, kCPA2)
+ ASMJIT_ARM_FEATURE(has_cpuid, kCPUID)
+ ASMJIT_ARM_FEATURE(has_crc32, kCRC32)
+ ASMJIT_ARM_FEATURE(has_cssc, kCSSC)
+ ASMJIT_ARM_FEATURE(has_csv2, kCSV2)
+ ASMJIT_ARM_FEATURE(has_csv2_3, kCSV2_3)
+ ASMJIT_ARM_FEATURE(has_csv3, kCSV3)
+ ASMJIT_ARM_FEATURE(has_d128, kD128)
+ ASMJIT_ARM_FEATURE(has_dgh, kDGH)
+ ASMJIT_ARM_FEATURE(has_dit, kDIT)
+ ASMJIT_ARM_FEATURE(has_dotprod, kDOTPROD)
+ ASMJIT_ARM_FEATURE(has_dpb, kDPB)
+ ASMJIT_ARM_FEATURE(has_dpb2, kDPB2)
+ ASMJIT_ARM_FEATURE(has_ebep, kEBEP)
+ ASMJIT_ARM_FEATURE(has_ebf16, kEBF16)
+ ASMJIT_ARM_FEATURE(has_ecbhb, kECBHB)
+ ASMJIT_ARM_FEATURE(has_ecv, kECV)
+ ASMJIT_ARM_FEATURE(has_edhsr, kEDHSR)
+ ASMJIT_ARM_FEATURE(has_edsp, kEDSP)
+ ASMJIT_ARM_FEATURE(has_f8e4m3, kF8E4M3)
+ ASMJIT_ARM_FEATURE(has_f8e5m2, kF8E5M2)
+ ASMJIT_ARM_FEATURE(has_f8f16mm, kF8F16MM)
+ ASMJIT_ARM_FEATURE(has_f8f32mm, kF8F32MM)
+ ASMJIT_ARM_FEATURE(has_faminmax, kFAMINMAX)
+ ASMJIT_ARM_FEATURE(has_fcma, kFCMA)
+ ASMJIT_ARM_FEATURE(has_fgt, kFGT)
+ ASMJIT_ARM_FEATURE(has_fgt2, kFGT2)
+ ASMJIT_ARM_FEATURE(has_fhm, kFHM)
+ ASMJIT_ARM_FEATURE(has_flagm, kFLAGM)
+ ASMJIT_ARM_FEATURE(has_flagm2, kFLAGM2)
+ ASMJIT_ARM_FEATURE(has_fmac, kFMAC)
+ ASMJIT_ARM_FEATURE(has_fp, kFP)
+ ASMJIT_ARM_FEATURE(has_fp16, kFP16)
+ ASMJIT_ARM_FEATURE(has_fp16conv, kFP16CONV)
+ ASMJIT_ARM_FEATURE(has_fp8, kFP8)
+ ASMJIT_ARM_FEATURE(has_fp8dot2, kFP8DOT2)
+ ASMJIT_ARM_FEATURE(has_fp8dot4, kFP8DOT4)
+ ASMJIT_ARM_FEATURE(has_fp8fma, kFP8FMA)
+ ASMJIT_ARM_FEATURE(has_fpmr, kFPMR)
+ ASMJIT_ARM_FEATURE(has_fprcvt, kFPRCVT)
+ ASMJIT_ARM_FEATURE(has_frintts, kFRINTTS)
+ ASMJIT_ARM_FEATURE(has_gcs, kGCS)
+ ASMJIT_ARM_FEATURE(has_hacdbs, kHACDBS)
+ ASMJIT_ARM_FEATURE(has_hafdbs, kHAFDBS)
+ ASMJIT_ARM_FEATURE(has_haft, kHAFT)
+ ASMJIT_ARM_FEATURE(has_hdbss, kHDBSS)
+ ASMJIT_ARM_FEATURE(has_hbc, kHBC)
+ ASMJIT_ARM_FEATURE(has_hcx, kHCX)
+ ASMJIT_ARM_FEATURE(has_hpds, kHPDS)
+ ASMJIT_ARM_FEATURE(has_hpds2, kHPDS2)
+ ASMJIT_ARM_FEATURE(has_i8mm, kI8MM)
+ ASMJIT_ARM_FEATURE(has_idiva, kIDIVA)
+ ASMJIT_ARM_FEATURE(has_idivt, kIDIVT)
+ ASMJIT_ARM_FEATURE(has_ite, kITE)
+ ASMJIT_ARM_FEATURE(has_jscvt, kJSCVT)
+ ASMJIT_ARM_FEATURE(has_lor, kLOR)
+ ASMJIT_ARM_FEATURE(has_lrcpc, kLRCPC)
+ ASMJIT_ARM_FEATURE(has_lrcpc2, kLRCPC2)
+ ASMJIT_ARM_FEATURE(has_lrcpc3, kLRCPC3)
+ ASMJIT_ARM_FEATURE(has_ls64, kLS64)
+ ASMJIT_ARM_FEATURE(has_ls64_accdata, kLS64_ACCDATA)
+ ASMJIT_ARM_FEATURE(has_ls64_v, kLS64_V)
+ ASMJIT_ARM_FEATURE(has_ls64wb, kLS64WB)
+ ASMJIT_ARM_FEATURE(has_lse, kLSE)
+ ASMJIT_ARM_FEATURE(has_lse128, kLSE128)
+ ASMJIT_ARM_FEATURE(has_lse2, kLSE2)
+ ASMJIT_ARM_FEATURE(has_lsfe, kLSFE)
+ ASMJIT_ARM_FEATURE(has_lsui, kLSUI)
+ ASMJIT_ARM_FEATURE(has_lut, kLUT)
+ ASMJIT_ARM_FEATURE(has_lva, kLVA)
+ ASMJIT_ARM_FEATURE(has_lva3, kLVA3)
+ ASMJIT_ARM_FEATURE(has_mec, kMEC)
+ ASMJIT_ARM_FEATURE(has_mops, kMOPS)
+ ASMJIT_ARM_FEATURE(has_mpam, kMPAM)
+ ASMJIT_ARM_FEATURE(has_mte, kMTE)
+ ASMJIT_ARM_FEATURE(has_mte2, kMTE2)
+ ASMJIT_ARM_FEATURE(has_mte3, kMTE3)
+ ASMJIT_ARM_FEATURE(has_mte4, kMTE4)
+ ASMJIT_ARM_FEATURE(has_mte_asym_fault, kMTE_ASYM_FAULT)
+ ASMJIT_ARM_FEATURE(has_mte_async, kMTE_ASYNC)
+ ASMJIT_ARM_FEATURE(has_mte_canonical_tags, kMTE_CANONICAL_TAGS)
+ ASMJIT_ARM_FEATURE(has_mte_no_address_tags, kMTE_NO_ADDRESS_TAGS)
+ ASMJIT_ARM_FEATURE(has_mte_perm_s1, kMTE_PERM_S1)
+ ASMJIT_ARM_FEATURE(has_mte_store_only, kMTE_STORE_ONLY)
+ ASMJIT_ARM_FEATURE(has_mte_tagged_far, kMTE_TAGGED_FAR)
+ ASMJIT_ARM_FEATURE(has_mtpmu, kMTPMU)
+ ASMJIT_ARM_FEATURE(has_nmi, kNMI)
+ ASMJIT_ARM_FEATURE(has_nv, kNV)
+ ASMJIT_ARM_FEATURE(has_nv2, kNV2)
+ ASMJIT_ARM_FEATURE(has_occmo, kOCCMO)
+ ASMJIT_ARM_FEATURE(has_pan, kPAN)
+ ASMJIT_ARM_FEATURE(has_pan2, kPAN2)
+ ASMJIT_ARM_FEATURE(has_pan3, kPAN3)
+ ASMJIT_ARM_FEATURE(has_pauth, kPAUTH)
+ ASMJIT_ARM_FEATURE(has_pfar, kPFAR)
+ ASMJIT_ARM_FEATURE(has_pmu, kPMU)
+ ASMJIT_ARM_FEATURE(has_pmull, kPMULL)
+ ASMJIT_ARM_FEATURE(has_prfmslc, kPRFMSLC)
+ ASMJIT_ARM_FEATURE(has_ras, kRAS)
+ ASMJIT_ARM_FEATURE(has_ras1_1, kRAS1_1)
+ ASMJIT_ARM_FEATURE(has_ras2, kRAS2)
+ ASMJIT_ARM_FEATURE(has_rassa2, kRASSA2)
+ ASMJIT_ARM_FEATURE(has_rdm, kRDM)
+ ASMJIT_ARM_FEATURE(has_rme, kRME)
+ ASMJIT_ARM_FEATURE(has_rng, kRNG)
+ ASMJIT_ARM_FEATURE(has_rng_trap, kRNG_TRAP)
+ ASMJIT_ARM_FEATURE(has_rpres, kRPRES)
+ ASMJIT_ARM_FEATURE(has_rprfm, kRPRFM)
+ ASMJIT_ARM_FEATURE(has_s1pie, kS1PIE)
+ ASMJIT_ARM_FEATURE(has_s1poe, kS1POE)
+ ASMJIT_ARM_FEATURE(has_s2pie, kS2PIE)
+ ASMJIT_ARM_FEATURE(has_s2poe, kS2POE)
+ ASMJIT_ARM_FEATURE(has_sb, kSB)
+ ASMJIT_ARM_FEATURE(has_sctlr2, kSCTLR2)
+ ASMJIT_ARM_FEATURE(has_sebep, kSEBEP)
+ ASMJIT_ARM_FEATURE(has_sel2, kSEL2)
+ ASMJIT_ARM_FEATURE(has_sha1, kSHA1)
+ ASMJIT_ARM_FEATURE(has_sha256, kSHA256)
+ ASMJIT_ARM_FEATURE(has_sha3, kSHA3)
+ ASMJIT_ARM_FEATURE(has_sha512, kSHA512)
+ ASMJIT_ARM_FEATURE(has_sm3, kSM3)
+ ASMJIT_ARM_FEATURE(has_sm4, kSM4)
+ ASMJIT_ARM_FEATURE(has_sme, kSME)
+ ASMJIT_ARM_FEATURE(has_sme2, kSME2)
+ ASMJIT_ARM_FEATURE(has_sme2_1, kSME2_1)
+ ASMJIT_ARM_FEATURE(has_sme2_2, kSME2_2)
+ ASMJIT_ARM_FEATURE(has_sme_aes, kSME_AES)
+ ASMJIT_ARM_FEATURE(has_sme_b16b16, kSME_B16B16)
+ ASMJIT_ARM_FEATURE(has_sme_b16f32, kSME_B16F32)
+ ASMJIT_ARM_FEATURE(has_sme_bi32i32, kSME_BI32I32)
+ ASMJIT_ARM_FEATURE(has_sme_f16f16, kSME_F16F16)
+ ASMJIT_ARM_FEATURE(has_sme_f16f32, kSME_F16F32)
+ ASMJIT_ARM_FEATURE(has_sme_f32f32, kSME_F32F32)
+ ASMJIT_ARM_FEATURE(has_sme_f64f64, kSME_F64F64)
+ ASMJIT_ARM_FEATURE(has_sme_f8f16, kSME_F8F16)
+ ASMJIT_ARM_FEATURE(has_sme_f8f32, kSME_F8F32)
+ ASMJIT_ARM_FEATURE(has_sme_fa64, kSME_FA64)
+ ASMJIT_ARM_FEATURE(has_sme_i16i32, kSME_I16I32)
+ ASMJIT_ARM_FEATURE(has_sme_i16i64, kSME_I16I64)
+ ASMJIT_ARM_FEATURE(has_sme_i8i32, kSME_I8I32)
+ ASMJIT_ARM_FEATURE(has_sme_lutv2, kSME_LUTv2)
+ ASMJIT_ARM_FEATURE(has_sme_mop4, kSME_MOP4)
+ ASMJIT_ARM_FEATURE(has_sme_tmop, kSME_TMOP)
+ ASMJIT_ARM_FEATURE(has_spe, kSPE)
+ ASMJIT_ARM_FEATURE(has_spe1_1, kSPE1_1)
+ ASMJIT_ARM_FEATURE(has_spe1_2, kSPE1_2)
+ ASMJIT_ARM_FEATURE(has_spe1_3, kSPE1_3)
+ ASMJIT_ARM_FEATURE(has_spe1_4, kSPE1_4)
+ ASMJIT_ARM_FEATURE(has_spe_altclk, kSPE_ALTCLK)
+ ASMJIT_ARM_FEATURE(has_spe_crr, kSPE_CRR)
+ ASMJIT_ARM_FEATURE(has_spe_eft, kSPE_EFT)
+ ASMJIT_ARM_FEATURE(has_spe_fds, kSPE_FDS)
+ ASMJIT_ARM_FEATURE(has_spe_fpf, kSPE_FPF)
+ ASMJIT_ARM_FEATURE(has_spe_sme, kSPE_SME)
+ ASMJIT_ARM_FEATURE(has_specres, kSPECRES)
+ ASMJIT_ARM_FEATURE(has_specres2, kSPECRES2)
+ ASMJIT_ARM_FEATURE(has_spmu, kSPMU)
+ ASMJIT_ARM_FEATURE(has_ssbs, kSSBS)
+ ASMJIT_ARM_FEATURE(has_ssbs2, kSSBS2)
+ ASMJIT_ARM_FEATURE(has_ssve_aes, kSSVE_AES)
+ ASMJIT_ARM_FEATURE(has_ssve_bitperm, kSSVE_BITPERM)
+ ASMJIT_ARM_FEATURE(has_ssve_fexpa, kSSVE_FEXPA)
+ ASMJIT_ARM_FEATURE(has_ssve_fp8dot2, kSSVE_FP8DOT2)
+ ASMJIT_ARM_FEATURE(has_ssve_fp8dot4, kSSVE_FP8DOT4)
+ ASMJIT_ARM_FEATURE(has_ssve_fp8fma, kSSVE_FP8FMA)
+ ASMJIT_ARM_FEATURE(has_sve, kSVE)
+ ASMJIT_ARM_FEATURE(has_sve2, kSVE2)
+ ASMJIT_ARM_FEATURE(has_sve2_1, kSVE2_1)
+ ASMJIT_ARM_FEATURE(has_sve2_2, kSVE2_2)
+ ASMJIT_ARM_FEATURE(has_sve_aes, kSVE_AES)
+ ASMJIT_ARM_FEATURE(has_sve_aes2, kSVE_AES2)
+ ASMJIT_ARM_FEATURE(has_sve_b16b16, kSVE_B16B16)
+ ASMJIT_ARM_FEATURE(has_sve_bf16, kSVE_BF16)
+ ASMJIT_ARM_FEATURE(has_sve_bfscale, kSVE_BFSCALE)
+ ASMJIT_ARM_FEATURE(has_sve_bitperm, kSVE_BITPERM)
+ ASMJIT_ARM_FEATURE(has_sve_ebf16, kSVE_EBF16)
+ ASMJIT_ARM_FEATURE(has_sve_eltperm, kSVE_ELTPERM)
+ ASMJIT_ARM_FEATURE(has_sve_f16mm, kSVE_F16MM)
+ ASMJIT_ARM_FEATURE(has_sve_f32mm, kSVE_F32MM)
+ ASMJIT_ARM_FEATURE(has_sve_f64mm, kSVE_F64MM)
+ ASMJIT_ARM_FEATURE(has_sve_i8mm, kSVE_I8MM)
+ ASMJIT_ARM_FEATURE(has_sve_pmull128, kSVE_PMULL128)
+ ASMJIT_ARM_FEATURE(has_sve_sha3, kSVE_SHA3)
+ ASMJIT_ARM_FEATURE(has_sve_sm4, kSVE_SM4)
+ ASMJIT_ARM_FEATURE(has_sysinstr128, kSYSINSTR128)
+ ASMJIT_ARM_FEATURE(has_sysreg128, kSYSREG128)
+ ASMJIT_ARM_FEATURE(has_the, kTHE)
+ ASMJIT_ARM_FEATURE(has_tlbios, kTLBIOS)
+ ASMJIT_ARM_FEATURE(has_tlbirange, kTLBIRANGE)
+ ASMJIT_ARM_FEATURE(has_tlbiw, kTLBIW)
+ ASMJIT_ARM_FEATURE(has_tme, kTME)
+ ASMJIT_ARM_FEATURE(has_trf, kTRF)
+ ASMJIT_ARM_FEATURE(has_uao, kUAO)
+ ASMJIT_ARM_FEATURE(has_vfp_d32, kVFP_D32)
+ ASMJIT_ARM_FEATURE(has_vhe, kVHE)
+ ASMJIT_ARM_FEATURE(has_vmid16, kVMID16)
+ ASMJIT_ARM_FEATURE(has_wfxt, kWFXT)
+ ASMJIT_ARM_FEATURE(has_xnx, kXNX)
+ ASMJIT_ARM_FEATURE(has_xs, kXS)
+
+ #undef ASMJIT_ARM_FEATURE
+ };
+
+ static_assert(uint32_t(X86::kMaxValue) < kMaxFeatures, "The number of X86 CPU features cannot exceed CpuFeatures::kMaxFeatures");
+ static_assert(uint32_t(ARM::kMaxValue) < kMaxFeatures, "The number of ARM CPU features cannot exceed CpuFeatures::kMaxFeatures");
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ Data _data {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG CpuFeatures() noexcept {}
+ ASMJIT_INLINE_NODEBUG CpuFeatures(const CpuFeatures& other) noexcept = default;
+ ASMJIT_INLINE_NODEBUG explicit CpuFeatures(const Data& other) noexcept : _data{other._bits} {}
+ ASMJIT_INLINE_NODEBUG explicit CpuFeatures(Globals::NoInit_) noexcept {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG CpuFeatures& operator=(const CpuFeatures& other) noexcept = default;
+
+ ASMJIT_INLINE_NODEBUG bool operator==(const CpuFeatures& other) const noexcept { return equals(other); }
+ ASMJIT_INLINE_NODEBUG bool operator!=(const CpuFeatures& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns true if there are no features set.
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _data.is_empty(); }
+
+ //! Casts this base class into a derived type `T`.
+ template<typename T = Data>
+ ASMJIT_INLINE_NODEBUG T& data() noexcept { return static_cast<T&>(_data); }
+
+ //! Casts this base class into a derived type `T` (const).
+ template<typename T = Data>
+ ASMJIT_INLINE_NODEBUG const T& data() const noexcept { return static_cast<const T&>(_data); }
+
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::X86.
+ ASMJIT_INLINE_NODEBUG X86& x86() noexcept { return data<X86>(); }
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::X86 (const).
+ ASMJIT_INLINE_NODEBUG const X86& x86() const noexcept { return data<X86>(); }
+
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM.
+ ASMJIT_INLINE_NODEBUG ARM& arm() noexcept { return data<ARM>(); }
+ //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM (const).
+ ASMJIT_INLINE_NODEBUG const ARM& arm() const noexcept { return data<ARM>(); }
+
+ //! Returns all features as array of bitwords (see \ref Support::BitWord).
+ ASMJIT_INLINE_NODEBUG BitWord* bits() noexcept { return _data.bits(); }
+ //! Returns all features as array of bitwords (const).
+ ASMJIT_INLINE_NODEBUG const BitWord* bits() const noexcept { return _data.bits(); }
+ //! Returns the number of BitWords returned by \ref bits().
+ ASMJIT_INLINE_NODEBUG size_t bit_word_count() const noexcept { return _data.bit_word_count(); }
+
+ //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently.
+ ASMJIT_INLINE_NODEBUG Iterator iterator() const noexcept { return _data.iterator(); }
+
+ //! Tests whether the feature `feature_id` is present.
+ template<typename FeatureId>
+ ASMJIT_INLINE_NODEBUG bool has(const FeatureId& feature_id) const noexcept { return _data.has(feature_id); }
+
+ //! Tests whether any of the features is present.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG bool has_any(Args&&... args) const noexcept { return _data.has_any(std::forward<Args>(args)...); }
+
+ //! Tests whether all features as defined by `other` are present.
+ ASMJIT_INLINE_NODEBUG bool has_all(const CpuFeatures& other) const noexcept { return _data.has_all(other._data); }
+
+ //! \}
+
+ //! \name Manipulation
+ //! \{
+
+ //! Clears all features set.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _data.reset(); }
+
+ //! Adds the given CPU `feature_id` to the list of features.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG void add(Args&&... args) noexcept { return _data.add(std::forward<Args>(args)...); }
+
+ //! Adds the given CPU `feature_id` to the list of features if `condition` is true.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG void add_if(bool condition, Args&&... args) noexcept { return _data.add_if(condition, std::forward<Args>(args)...); }
+
+ //! Removes the given CPU `feature_id` from the list of features.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG void remove(Args&&... args) noexcept { return _data.remove(std::forward<Args>(args)...); }
+
+ //! Tests whether this CPU features matches `other`.
+ ASMJIT_INLINE_NODEBUG bool equals(const CpuFeatures& other) const noexcept { return _data.equals(other._data); }
+
+ //! \}
+};
+
+//! Describe micro-architectural hints that can be used for optimization purposes and are not part of \ref CpuFeatures.
+enum class CpuHints : uint32_t {
+ //! No honts.
+ kNone = 0x0u,
+
+ //! CPU provides fast 8-bit masked loads and stores.
+ kVecMaskedOps8 = 0x00000001u,
+
+ //! CPU provides fast 16-bit masked loads and stores.
+ kVecMaskedOps16 = 0x00000002u,
+
+ //! CPU provides fast 32-bit masked loads and stores.
+ kVecMaskedOps32 = 0x00000004u,
+
+ //! CPU provides fast 64-bit masked loads and stores.
+ kVecMaskedOps64 = 0x00000008u,
+
+ //! CPU provides low-latency 32-bit multiplication (AMD CPUs).
+ kVecFastIntMul32 = 0x00000010u,
+
+ //! CPU provides low-latency 64-bit multiplication (AMD CPUs).
+ kVecFastIntMul64 = 0x00000020u,
+
+ //! CPU provides fast hardware gathers, which are faster than a sequence of loads and inserts.
+ kVecFastGather = 0x00000040u,
+
+ //! CPU has fast stores with mask.
+ //!
+ //! \note This is a hint to the compiler to emit a masked store instead of a sequence having branches.
+ kVecMaskedStore = 0x00000080u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(CpuHints)
+
+//! CPU information.
+class CpuInfo {
+public:
+ //! \name Members
+ //! \{
+
+ //! Architecture.
+ Arch _arch {};
+ //! Sub-architecture.
+ SubArch _sub_arch {};
+ //! True if the CPU was detected, false if the detection failed or it's not available.
+ bool _was_detected {};
+ //! Reserved for future use.
+ uint8_t _reserved {};
+ //! CPU family ID.
+ uint32_t _family_id {};
+ //! CPU model ID.
+ uint32_t _model_id {};
+ //! CPU brand ID.
+ uint32_t _brand_id {};
+ //! CPU stepping.
+ uint32_t _stepping {};
+ //! Processor type.
+ uint32_t _processor_type {};
+ //! Maximum number of addressable IDs for logical processors.
+ uint32_t _max_logical_processors {};
+ //! Cache line size (in bytes).
+ uint32_t _cache_line_size {};
+ //! Number of hardware threads.
+ uint32_t _hw_thread_count {};
+
+ //! CPU vendor string.
+ FixedString<16> _vendor {};
+ //! CPU brand string.
+ FixedString<64> _brand {};
+ //! CPU features.
+ CpuFeatures _features {};
+
+ //! CPU hints.
+ CpuHints _hints {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new CpuInfo instance.
+ ASMJIT_INLINE_NODEBUG CpuInfo() noexcept {}
+ //! Creates a copy of `other` instance.
+ ASMJIT_INLINE_NODEBUG CpuInfo(const CpuInfo& other) noexcept = default;
+
+ //! Creates an unitialized `CpuInfo` instance.
+ ASMJIT_INLINE_NODEBUG explicit CpuInfo(Globals::NoInit_) noexcept
+ : _features(Globals::NoInit) {};
+
+ //! \}
+
+ //! \name CPU Information Detection
+ //! \{
+
+ //! Returns the host CPU information.
+ //!
+ //! \note The returned reference is global - it's setup only once and then shared.
+ [[nodiscard]]
+ ASMJIT_API static const CpuInfo& host() noexcept;
+
+ //! Updates CPU hints based on the CPU data and features.
+ //!
+ //! \note This function is called automatically by the CPU detection logic. However, if you change the CPU features
+ //! in your own instance of \ref CpuInfo, CPU hints must be updated too, otherwise they would be out of sync.
+ ASMJIT_API static CpuHints recalculate_hints(const CpuInfo& info, const CpuFeatures& features) noexcept;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Copy assignment.
+ ASMJIT_INLINE_NODEBUG CpuInfo& operator=(const CpuInfo& other) noexcept = default;
+
+ //! \}
+
+ //! \name Initialization & Reset
+ //! \{
+
+ //! Initializes CpuInfo architecture and sub-architecture members to `arch` and `sub_arch`, respectively.
+ ASMJIT_INLINE_NODEBUG void init_arch(Arch arch, SubArch sub_arch = SubArch::kUnknown) noexcept {
+ _arch = arch;
+ _sub_arch = sub_arch;
+ }
+
+ //! Resets this \ref CpuInfo to a default constructed state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = CpuInfo{}; }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the CPU architecture this information relates to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
+
+ //! Returns the CPU sub-architecture this information relates to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SubArch sub_arch() const noexcept { return _sub_arch; }
+
+ //! Returns whether the CPU was detected successfully.
+ //!
+ //! If the returned value is false it means that AsmJit either failed to detect the CPU or it doesn't have
+ //! implementation targeting the host architecture and operating system.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool was_detected() const noexcept { return _was_detected; }
+
+ //! Returns the CPU family ID.
+ //!
+ //! The information provided depends on architecture and OS:
+ //! - X86:
+ //! - Family identifier matches the FamilyId read by using CPUID.
+ //! - ARM:
+ //! - Apple - returns Apple Family identifier returned by sysctlbyname("hw.cpufamily").
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t family_id() const noexcept { return _family_id; }
+
+ //! Returns the CPU model ID.
+ //!
+ //! The information provided depends on architecture and OS:
+ //! - X86:
+ //! - Model identifier matches the ModelId read by using CPUID.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t model_id() const noexcept { return _model_id; }
+
+ //! Returns the CPU brand id.
+ //!
+ //! The information provided depends on architecture and OS:
+ //! - X86:
+ //! - Brand identifier matches the BrandId read by using CPUID.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t brand_id() const noexcept { return _brand_id; }
+
+ //! Returns the CPU stepping.
+ //!
+ //! The information provided depends on architecture and OS:
+ //! - X86:
+ //! - Stepping identifier matches the Stepping information read by using CPUID.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t stepping() const noexcept { return _stepping; }
+
+ //! Returns the processor type.
+ //!
+ //! The information provided depends on architecture and OS:
+ //! - X86:
+ //! - Processor type identifier matches the ProcessorType read by using CPUID.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t processor_type() const noexcept { return _processor_type; }
+
+ //! Returns the maximum number of logical processors.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t max_logical_processors() const noexcept { return _max_logical_processors; }
+
+ //! Returns the size of a CPU cache line.
+ //!
+ //! On a multi-architecture system this should return the smallest cache line of all CPUs.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t cache_line_size() const noexcept { return _cache_line_size; }
+
+ //! Returns number of hardware threads available.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t hw_thread_count() const noexcept { return _hw_thread_count; }
+
+ //! Returns a CPU vendor string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* vendor() const noexcept { return _vendor.str; }
+
+ //! Tests whether the CPU vendor string is equal to `s`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vendor(const char* s) const noexcept { return _vendor.equals(s); }
+
+ //! Returns a CPU brand string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* brand() const noexcept { return _brand.str; }
+
+ //! Returns CPU features.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CpuFeatures& features() noexcept { return _features; }
+
+ //! Returns CPU features (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const CpuFeatures& features() const noexcept { return _features; }
+
+ //! Tests whether the CPU has the given `feature`.
+ template<typename FeatureId>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_feature(const FeatureId& feature_id) const noexcept { return _features.has(feature_id); }
+
+ //! Adds the given CPU `feature_id` to the list of features.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG void add_feature(Args&&... args) noexcept { return _features.add(std::forward<Args>(args)...); }
+
+ //! Removes the given CPU `feature_id` from the list of features.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG void remove_feature(Args&&... args) noexcept { return _features.remove(std::forward<Args>(args)...); }
+
+ //! Returns CPU hints.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CpuHints hints() const noexcept { return _hints; }
+
+ //! Updates CPU hints based on the CPU data and features.
+ //!
+ //! \note This function is called automatically by the CPU detection logic. However, if you change the CPU features
+ //! in your own instance of \ref CpuInfo, CPU hints must be updated too, otherwise they would be out of sync.
+ ASMJIT_INLINE void update_hints() noexcept { _hints = recalculate_hints(*this, _features); }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_CPUINFO_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/emithelper.cpp b/3rdparty/asmjit/asmjit/core/emithelper.cpp
new file mode 100644
index 00000000000..8765484c999
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/emithelper.cpp
@@ -0,0 +1,365 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/emithelper_p.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/funcargscontext_p.h>
+#include <asmjit/core/radefs_p.h>
+
+// Can be used for debugging...
+// #define ASMJIT_DUMP_ARGS_ASSIGNMENT
+
+ASMJIT_BEGIN_NAMESPACE
+
+// BaseEmitHelper - Formatting
+// ===========================
+
+#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
+static void dump_func_value(String& sb, Arch arch, const FuncValue& value) noexcept {
+ Formatter::format_type_id(sb, value.type_id());
+ sb.append('@');
+
+ if (value.is_indirect()) {
+ sb.append('[');
+ }
+
+ if (value.is_reg()) {
+ Formatter::format_register(sb, 0, nullptr, arch, value.reg_type(), value.reg_id());
+ }
+ else if (value.is_stack()) {
+ sb.append_format("[%d]", value.stack_offset());
+ }
+ else {
+ sb.append("<none>");
+ }
+
+ if (value.is_indirect()) {
+ sb.append(']');
+ }
+}
+
+static void dump_assignment(String& sb, const FuncArgsContext& ctx) noexcept {
+ using Var = FuncArgsContext::Var;
+
+ Arch arch = ctx.arch();
+ uint32_t var_count = ctx.var_count();
+
+ for (uint32_t i = 0; i < var_count; i++) {
+ const Var& var = ctx.var(i);
+ const FuncValue& dst = var.out;
+ const FuncValue& cur = var.cur;
+
+ sb.append_format("Var%u: ", i);
+ dump_func_value(sb, arch, dst);
+ sb.append(" <- ");
+ dump_func_value(sb, arch, cur);
+
+ if (var.is_done()) {
+ sb.append(" {Done}");
+ }
+
+ sb.append('\n');
+ }
+}
+#endif
+
+// BaseEmitHelper - Abstract
+// =========================
+
+Error BaseEmitHelper::emit_reg_move(const Operand_& dst_, const Operand_& src_, TypeId type_id, const char* comment) {
+ Support::maybe_unused(dst_, src_, type_id, comment);
+ return make_error(Error::kInvalidState);
+}
+
+Error BaseEmitHelper::emit_reg_swap(const Reg& a, const Reg& b, const char* comment) {
+ Support::maybe_unused(a, b, comment);
+ return make_error(Error::kInvalidState);
+}
+
+Error BaseEmitHelper::emit_arg_move(const Reg& dst_, TypeId dst_type_id, const Operand_& src_, TypeId src_type_id, const char* comment) {
+ Support::maybe_unused(dst_, dst_type_id, src_, src_type_id, comment);
+ return make_error(Error::kInvalidState);
+}
+
+// BaseEmitHelper - EmitArgsAssignment
+// ===================================
+
+ASMJIT_FAVOR_SIZE Error BaseEmitHelper::emit_args_assignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
+ using Var = FuncArgsContext::Var;
+ using WorkData = FuncArgsContext::WorkData;
+
+ enum WorkFlags : uint32_t {
+ kWorkNone = 0x00,
+ kWorkDidSome = 0x01,
+ kWorkPending = 0x02,
+ kWorkPostponed = 0x04
+ };
+
+ Arch arch = frame.arch();
+ const ArchTraits& arch_traits = ArchTraits::by_arch(arch);
+
+ RAConstraints constraints;
+ FuncArgsContext ctx;
+
+ ASMJIT_PROPAGATE(constraints.init(arch));
+ ASMJIT_PROPAGATE(ctx.init_work_data(frame, args, &constraints));
+
+#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
+ {
+ String sb;
+ dump_assignment(sb, ctx);
+ printf("%s\n", sb.data());
+ }
+#endif
+
+ auto& work_data = ctx._work_data;
+ uint32_t var_count = ctx._var_count;
+ uint32_t sa_var_id = ctx._sa_var_id;
+
+ Reg sp = Reg(_emitter->_gp_signature, arch_traits.sp_reg_id());
+ Reg sa = sp;
+
+ if (frame.has_dynamic_alignment()) {
+ if (frame.has_preserved_fp()) {
+ sa.set_id(arch_traits.fp_reg_id());
+ }
+ else {
+ sa.set_id(sa_var_id < var_count ? ctx._vars[sa_var_id].cur.reg_id() : frame.sa_reg_id());
+ }
+ }
+
+ // Register to stack and stack to stack moves must be first as now we have
+ // the biggest chance of having as many as possible unassigned registers.
+
+ if (ctx._stack_dst_mask) {
+ // Base address of all arguments passed by stack.
+ BaseMem base_arg_ptr(sa, int32_t(frame.sa_offset(sa.id())));
+ BaseMem base_stack_ptr(sp, 0);
+
+ for (uint32_t var_id = 0; var_id < var_count; var_id++) {
+ Var& var = ctx._vars[var_id];
+
+ if (!var.out.is_stack()) {
+ continue;
+ }
+
+ FuncValue& cur = var.cur;
+ FuncValue& out = var.out;
+
+ ASMJIT_ASSERT(cur.is_reg() || cur.is_stack());
+ Reg reg;
+
+ BaseMem dst_stack_ptr = base_stack_ptr.clone_adjusted(out.stack_offset());
+ BaseMem src_stack_ptr = base_arg_ptr.clone_adjusted(cur.stack_offset());
+
+ if (cur.is_indirect()) {
+ if (cur.is_stack()) {
+ // TODO: Indirect stack.
+ return make_error(Error::kInvalidAssignment);
+ }
+ else {
+ src_stack_ptr.set_base_id(cur.reg_id());
+ }
+ }
+
+ if (cur.is_reg() && !cur.is_indirect()) {
+ WorkData& wd = work_data[RegUtils::group_of(cur.reg_type())];
+ uint32_t reg_id = cur.reg_id();
+
+ reg.set_signature_and_id(RegUtils::signature_of(cur.reg_type()), reg_id);
+ wd.unassign(var_id, reg_id);
+ }
+ else {
+ // Stack to reg move - tricky since we move stack to stack we can decide which register to use. In general
+ // we follow the rule that IntToInt moves will use GP regs with possibility to signature or zero extend,
+ // and all other moves will either use GP or VEC regs depending on the size of the move.
+ OperandSignature signature = get_suitable_reg_for_mem_to_mem_move(arch, out.type_id(), cur.type_id());
+ if (ASMJIT_UNLIKELY(!signature.is_valid())) {
+ return make_error(Error::kInvalidState);
+ }
+
+ WorkData& wd = work_data[signature.reg_group()];
+ RegMask available_regs = wd.available_regs();
+ if (ASMJIT_UNLIKELY(!available_regs)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ uint32_t available_id = Support::ctz(available_regs);
+ reg.set_signature_and_id(signature, available_id);
+
+ ASMJIT_PROPAGATE(emit_arg_move(reg, out.type_id(), src_stack_ptr, cur.type_id()));
+ }
+
+ if (cur.is_indirect() && cur.is_reg()) {
+ work_data[RegGroup::kGp].unassign(var_id, cur.reg_id());
+ }
+
+ // Register to stack move.
+ ASMJIT_PROPAGATE(emit_reg_move(dst_stack_ptr, reg, cur.type_id()));
+ var.mark_done();
+ }
+ }
+
+ // Shuffle all registers that are currently assigned accordingly to target assignment.
+
+ uint32_t work_flags = kWorkNone;
+ for (;;) {
+ for (uint32_t var_id = 0; var_id < var_count; var_id++) {
+ Var& var = ctx._vars[var_id];
+ if (var.is_done() || !var.cur.is_reg()) {
+ continue;
+ }
+
+ FuncValue& cur = var.cur;
+ FuncValue& out = var.out;
+
+ RegGroup cur_group = RegUtils::group_of(cur.reg_type());
+ RegGroup out_group = RegUtils::group_of(out.reg_type());
+
+ uint32_t cur_id = cur.reg_id();
+ uint32_t out_id = out.reg_id();
+
+ if (cur_group != out_group) {
+ // TODO: Conversion is not supported.
+ return make_error(Error::kInvalidAssignment);
+ }
+ else {
+ WorkData& wd = work_data[out_group];
+ if (!wd.is_assigned(out_id) || cur_id == out_id) {
+EmitMove:
+ ASMJIT_PROPAGATE(
+ emit_arg_move(
+ Reg(RegUtils::signature_of(out.reg_type()), out_id), out.type_id(),
+ Reg(RegUtils::signature_of(cur.reg_type()), cur_id), cur.type_id()));
+
+ // Only reassign if this is not a sign/zero extension that happens on the same in/out register.
+ if (cur_id != out_id) {
+ wd.reassign(var_id, out_id, cur_id);
+ }
+
+ cur.init_reg(out.reg_type(), out_id, out.type_id());
+
+ if (out_id == out.reg_id()) {
+ var.mark_done();
+ }
+ work_flags |= kWorkDidSome | kWorkPending;
+ }
+ else {
+ uint32_t alt_id = wd._phys_to_var_id[out_id];
+ Var& alt_var = ctx._vars[alt_id];
+
+ if (!alt_var.out.is_initialized() || (alt_var.out.is_reg() && alt_var.out.reg_id() == cur_id)) {
+ // Only few architectures provide swap operations, and only for few register groups.
+ if (arch_traits.has_inst_reg_swap(cur_group)) {
+ RegType highest_type = Support::max(cur.reg_type(), alt_var.cur.reg_type());
+ if (Support::is_between(highest_type, RegType::kGp8Lo, RegType::kGp16)) {
+ highest_type = RegType::kGp32;
+ }
+
+ OperandSignature signature = RegUtils::signature_of(highest_type);
+ ASMJIT_PROPAGATE(emit_reg_swap(Reg(signature, out_id), Reg(signature, cur_id)));
+
+ wd.swap(var_id, cur_id, alt_id, out_id);
+ cur.set_reg_id(out_id);
+ var.mark_done();
+ alt_var.cur.set_reg_id(cur_id);
+
+ if (alt_var.out.is_initialized()) {
+ alt_var.mark_done();
+ }
+ work_flags |= kWorkDidSome;
+ }
+ else {
+ // If there is a scratch register it can be used to perform the swap.
+ RegMask available_regs = wd.available_regs();
+ if (available_regs) {
+ RegMask in_out_regs = wd.dst_regs();
+ if (available_regs & ~in_out_regs) {
+ available_regs &= ~in_out_regs;
+ }
+ out_id = Support::ctz(available_regs);
+ goto EmitMove;
+ }
+ else {
+ work_flags |= kWorkPending;
+ }
+ }
+ }
+ else {
+ work_flags |= kWorkPending;
+ }
+ }
+ }
+ }
+
+ if (!(work_flags & kWorkPending)) {
+ break;
+ }
+
+ // If we did nothing twice it means that something is really broken.
+ if ((work_flags & (kWorkDidSome | kWorkPostponed)) == kWorkPostponed) {
+ return make_error(Error::kInvalidState);
+ }
+
+ work_flags = (work_flags & kWorkDidSome) ? kWorkNone : kWorkPostponed;
+ }
+
+ // Load arguments passed by stack into registers. This is pretty simple and
+ // it never requires multiple iterations like the previous phase.
+
+ if (ctx._has_stack_src) {
+ uint32_t iter_count = 1;
+ if (frame.has_dynamic_alignment() && !frame.has_preserved_fp()) {
+ sa.set_id(sa_var_id < var_count ? ctx._vars[sa_var_id].cur.reg_id() : frame.sa_reg_id());
+ }
+
+ // Base address of all arguments passed by stack.
+ BaseMem base_arg_ptr(sa, int32_t(frame.sa_offset(sa.id())));
+
+ for (uint32_t iter = 0; iter < iter_count; iter++) {
+ for (uint32_t var_id = 0; var_id < var_count; var_id++) {
+ Var& var = ctx._vars[var_id];
+ if (var.is_done()) {
+ continue;
+ }
+
+ if (var.cur.is_stack()) {
+ ASMJIT_ASSERT(var.out.is_reg());
+
+ uint32_t out_id = var.out.reg_id();
+ RegType out_type = var.out.reg_type();
+
+ RegGroup group = RegUtils::group_of(out_type);
+ WorkData& wd = work_data[group];
+
+ if (out_id == sa.id() && group == RegGroup::kGp) {
+ // This register will be processed last as we still need `sa_reg_id`.
+ if (iter_count == 1) {
+ iter_count++;
+ continue;
+ }
+ wd.unassign(wd._phys_to_var_id[out_id], out_id);
+ }
+
+ Reg dst_reg = Reg(RegUtils::signature_of(out_type), out_id);
+ BaseMem src_mem = base_arg_ptr.clone_adjusted(var.cur.stack_offset());
+
+ ASMJIT_PROPAGATE(emit_arg_move(
+ dst_reg, var.out.type_id(),
+ src_mem, var.cur.type_id()));
+
+ wd.assign(var_id, out_id);
+ var.cur.init_reg(out_type, out_id, var.cur.type_id(), FuncValue::kFlagIsDone);
+ }
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/emithelper_p.h b/3rdparty/asmjit/asmjit/core/emithelper_p.h
new file mode 100644
index 00000000000..2ebaea88f23
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/emithelper_p.h
@@ -0,0 +1,61 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
+#define ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
+
+#include <asmjit/core/emitter.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+//! Helper class that provides utilities for each supported architecture.
+class BaseEmitHelper {
+protected:
+ BaseEmitter* _emitter;
+
+public:
+ ASMJIT_INLINE_NODEBUG explicit BaseEmitHelper(BaseEmitter* emitter = nullptr) noexcept
+ : _emitter(emitter) {}
+
+ ASMJIT_INLINE_NODEBUG virtual ~BaseEmitHelper() noexcept = default;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseEmitter* emitter() const noexcept { return _emitter; }
+
+ //! Emits a pure move operation between two registers or the same type or between a register and its home
+ //! slot. This function does not handle register conversion.
+ virtual Error emit_reg_move(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId type_id, const char* comment = nullptr);
+
+ //! Emits swap between two registers.
+ virtual Error emit_reg_swap(
+ const Reg& a,
+ const Reg& b, const char* comment = nullptr);
+
+ //! Emits move from a function argument (either register or stack) to a register.
+ //!
+ //! This function can handle the necessary conversion from one argument to another, and from one register type
+ //! to another, if it's possible. Any attempt of conversion that requires third register of a different group
+ //! (for example conversion from K to MMX on X86/X64) will fail.
+ virtual Error emit_arg_move(
+ const Reg& dst_, TypeId dst_type_id,
+ const Operand_& src_, TypeId src_type_id, const char* comment = nullptr);
+
+ Error emit_args_assignment(const FuncFrame& frame, const FuncArgsAssignment& args);
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/emitter.cpp b/3rdparty/asmjit/asmjit/core/emitter.cpp
new file mode 100644
index 00000000000..9c708cd0338
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/emitter.cpp
@@ -0,0 +1,443 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/emitterutils_p.h>
+#include <asmjit/core/errorhandler.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// BaseEmitter - Construction & Destruction
+// ========================================
+
+BaseEmitter::BaseEmitter(EmitterType emitter_type) noexcept
+ : _emitter_type(emitter_type) {}
+
+BaseEmitter::~BaseEmitter() noexcept {
+ if (_code) {
+ _add_emitter_flags(EmitterFlags::kDestroyed);
+ _code->detach(this);
+ }
+}
+
+// BaseEmitter - Finalize
+// ======================
+
+Error BaseEmitter::finalize() {
+ // Does nothing by default, overridden by `BaseBuilder` and `BaseCompiler`.
+ return Error::kOk;
+}
+
+// BaseEmitter - Internals
+// =======================
+
+static constexpr EmitterFlags kEmitterPreservedFlags = EmitterFlags::kOwnLogger | EmitterFlags::kOwnErrorHandler;
+
+static ASMJIT_NOINLINE void BaseEmitter_updateForcedOptions(BaseEmitter* self) noexcept {
+ bool emit_comments = false;
+ bool has_diagnostic_options = false;
+
+ if (self->emitter_type() == EmitterType::kAssembler) {
+ // Assembler: Don't emit comments if logger is not attached.
+ emit_comments = self->_code != nullptr && self->_logger != nullptr;
+ has_diagnostic_options = self->has_diagnostic_option(DiagnosticOptions::kValidateAssembler);
+ }
+ else {
+ // Builder/Compiler: Always emit comments, we cannot assume they won't be used.
+ emit_comments = self->_code != nullptr;
+ has_diagnostic_options = self->has_diagnostic_option(DiagnosticOptions::kValidateIntermediate);
+ }
+
+ if (emit_comments) {
+ self->_add_emitter_flags(EmitterFlags::kLogComments);
+ }
+ else {
+ self->_clear_emitter_flags(EmitterFlags::kLogComments);
+ }
+
+ // The reserved option tells emitter (Assembler/Builder/Compiler) that there may be either a border
+ // case (CodeHolder not attached, for example) or that logging or validation is required.
+ if (self->_code == nullptr || self->_logger || has_diagnostic_options) {
+ self->_forced_inst_options |= InstOptions::kReserved;
+ }
+ else {
+ self->_forced_inst_options &= ~InstOptions::kReserved;
+ }
+}
+
+// BaseEmitter - Diagnostic Options
+// ================================
+
+void BaseEmitter::add_diagnostic_options(DiagnosticOptions options) noexcept {
+ _diagnostic_options |= options;
+ BaseEmitter_updateForcedOptions(this);
+}
+
+void BaseEmitter::clear_diagnostic_options(DiagnosticOptions options) noexcept {
+ _diagnostic_options &= ~options;
+ BaseEmitter_updateForcedOptions(this);
+}
+
+// BaseEmitter - Logging
+// =====================
+
+void BaseEmitter::set_logger(Logger* logger) noexcept {
+#ifndef ASMJIT_NO_LOGGING
+ if (logger) {
+ _logger = logger;
+ _add_emitter_flags(EmitterFlags::kOwnLogger);
+ }
+ else {
+ _logger = nullptr;
+ _clear_emitter_flags(EmitterFlags::kOwnLogger);
+ if (_code) {
+ _logger = _code->logger();
+ }
+ }
+ BaseEmitter_updateForcedOptions(this);
+#else
+ Support::maybe_unused(logger);
+#endif
+}
+
+// BaseEmitter - Error Handling
+// ============================
+
+void BaseEmitter::set_error_handler(ErrorHandler* error_handler) noexcept {
+ if (error_handler) {
+ _error_handler = error_handler;
+ _add_emitter_flags(EmitterFlags::kOwnErrorHandler);
+ }
+ else {
+ _error_handler = nullptr;
+ _clear_emitter_flags(EmitterFlags::kOwnErrorHandler);
+ if (_code) {
+ _error_handler = _code->error_handler();
+ }
+ }
+}
+
+Error BaseEmitter::_report_error(Error err, const char* message) {
+ ASMJIT_ASSERT(err != Error::kOk);
+
+ ErrorHandler* eh = _error_handler;
+ if (eh) {
+ if (!message) {
+ message = DebugUtils::error_as_string(err);
+ }
+ eh->handle_error(err, message, this);
+ }
+
+ return err;
+}
+
+// BaseEmitter - Sections
+// ======================
+
+// [[pure virtual]]
+Error BaseEmitter::section(Section* section) {
+ Support::maybe_unused(section);
+ return make_error(Error::kInvalidState);
+}
+
+// BaseEmitter - Labels
+// ====================
+
+// [[pure virtual]]
+Label BaseEmitter::new_label() {
+ return Label(Globals::kInvalidId);
+}
+
+// [[pure virtual]]
+Label BaseEmitter::new_named_label(const char* name, size_t name_size, LabelType type, uint32_t parent_id) {
+ Support::maybe_unused(name, name_size, type, parent_id);
+ return Label(Globals::kInvalidId);
+}
+
+Label BaseEmitter::label_by_name(const char* name, size_t name_size, uint32_t parent_id) noexcept {
+ return Label(_code ? _code->label_id_by_name(name, name_size, parent_id) : Globals::kInvalidId);
+}
+
+// [[pure virtual]]
+Error BaseEmitter::bind(const Label& label) {
+ Support::maybe_unused(label);
+ return make_error(Error::kInvalidState);
+}
+
+bool BaseEmitter::is_label_valid(uint32_t label_id) const noexcept {
+ return _code && label_id < _code->label_count();
+}
+
+// BaseEmitter - Emit (Low-Level)
+// ==============================
+
+using EmitterUtils::no_ext;
+
+Error BaseEmitter::_emitI(InstId inst_id) {
+ return _emit(inst_id, no_ext[0], no_ext[1], no_ext[2], no_ext);
+}
+
+Error BaseEmitter::_emitI(InstId inst_id, const Operand_& o0) {
+ return _emit(inst_id, o0, no_ext[1], no_ext[2], no_ext);
+}
+
+Error BaseEmitter::_emitI(InstId inst_id, const Operand_& o0, const Operand_& o1) {
+ return _emit(inst_id, o0, o1, no_ext[2], no_ext);
+}
+
+Error BaseEmitter::_emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2) {
+ return _emit(inst_id, o0, o1, o2, no_ext);
+}
+
+Error BaseEmitter::_emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) {
+ Operand_ op_ext[3] = { o3 };
+ return _emit(inst_id, o0, o1, o2, op_ext);
+}
+
+Error BaseEmitter::_emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4) {
+ Operand_ op_ext[3] = { o3, o4 };
+ return _emit(inst_id, o0, o1, o2, op_ext);
+}
+
+Error BaseEmitter::_emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5) {
+ Operand_ op_ext[3] = { o3, o4, o5 };
+ return _emit(inst_id, o0, o1, o2, op_ext);
+}
+
+// [[pure virtual]]
+Error BaseEmitter::_emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) {
+ Support::maybe_unused(inst_id, o0, o1, o2, op_ext);
+ return make_error(Error::kInvalidState);
+}
+
+Error BaseEmitter::_emit_op_array(InstId inst_id, const Operand_* operands, size_t op_count) {
+ const Operand_* op = operands;
+ Operand_ op_ext[3];
+
+ switch (op_count) {
+ case 0:
+ return _emit(inst_id, no_ext[0], no_ext[1], no_ext[2], no_ext);
+
+ case 1:
+ return _emit(inst_id, op[0], no_ext[1], no_ext[2], no_ext);
+
+ case 2:
+ return _emit(inst_id, op[0], op[1], no_ext[2], no_ext);
+
+ case 3:
+ return _emit(inst_id, op[0], op[1], op[2], no_ext);
+
+ case 4:
+ op_ext[0] = op[3];
+ op_ext[1].reset();
+ op_ext[2].reset();
+ return _emit(inst_id, op[0], op[1], op[2], op_ext);
+
+ case 5:
+ op_ext[0] = op[3];
+ op_ext[1] = op[4];
+ op_ext[2].reset();
+ return _emit(inst_id, op[0], op[1], op[2], op_ext);
+
+ case 6:
+ return _emit(inst_id, op[0], op[1], op[2], op + 3);
+
+ default:
+ return make_error(Error::kInvalidArgument);
+ }
+}
+
+// BaseEmitter - Emit Utilities
+// ============================
+
+Error BaseEmitter::emit_prolog(const FuncFrame& frame) {
+ if (ASMJIT_UNLIKELY(!_code))
+ return make_error(Error::kNotInitialized);
+
+ return _funcs.emit_prolog(this, frame);
+}
+
+Error BaseEmitter::emit_epilog(const FuncFrame& frame) {
+ if (ASMJIT_UNLIKELY(!_code))
+ return make_error(Error::kNotInitialized);
+
+ return _funcs.emit_epilog(this, frame);
+}
+
+Error BaseEmitter::emit_args_assignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
+ if (ASMJIT_UNLIKELY(!_code))
+ return make_error(Error::kNotInitialized);
+
+ return _funcs.emit_args_assignment(this, frame, args);
+}
+
+// BaseEmitter - Align
+// ===================
+
+// [[pure virtual]]
+Error BaseEmitter::align(AlignMode align_mode, uint32_t alignment) {
+ Support::maybe_unused(align_mode, alignment);
+ return make_error(Error::kInvalidState);
+}
+
+// BaseEmitter - Embed
+// ===================
+
+// [[pure virtual]]
+Error BaseEmitter::embed(const void* data, size_t data_size) {
+ Support::maybe_unused(data, data_size);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseEmitter::embed_data_array(TypeId type_id, const void* data, size_t item_count, size_t repeat_count) {
+ Support::maybe_unused(type_id, data, item_count, repeat_count);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseEmitter::embed_const_pool(const Label& label, const ConstPool& pool) {
+ Support::maybe_unused(label, pool);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseEmitter::embed_label(const Label& label, size_t data_size) {
+ Support::maybe_unused(label, data_size);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseEmitter::embed_label_delta(const Label& label, const Label& base, size_t data_size) {
+ Support::maybe_unused(label, base, data_size);
+ return make_error(Error::kInvalidState);
+}
+
+// BaseEmitter - Comment
+// =====================
+
+// [[pure virtual]]
+Error BaseEmitter::comment(const char* data, size_t size) {
+ Support::maybe_unused(data, size);
+ return make_error(Error::kInvalidState);
+}
+
+Error BaseEmitter::commentf(const char* fmt, ...) {
+ if (!has_emitter_flag(EmitterFlags::kLogComments)) {
+ if (!has_emitter_flag(EmitterFlags::kAttached)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+ return Error::kOk;
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ StringTmp<1024> sb;
+
+ va_list ap;
+ va_start(ap, fmt);
+ Error err = sb.append_vformat(fmt, ap);
+ va_end(ap);
+
+ ASMJIT_PROPAGATE(err);
+ return comment(sb.data(), sb.size());
+#else
+ Support::maybe_unused(fmt);
+ return Error::kOk;
+#endif
+}
+
+Error BaseEmitter::commentv(const char* fmt, va_list ap) {
+ if (!has_emitter_flag(EmitterFlags::kLogComments)) {
+ if (!has_emitter_flag(EmitterFlags::kAttached)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+ return Error::kOk;
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ StringTmp<1024> sb;
+ Error err = sb.append_vformat(fmt, ap);
+
+ ASMJIT_PROPAGATE(err);
+ return comment(sb.data(), sb.size());
+#else
+ Support::maybe_unused(fmt, ap);
+ return Error::kOk;
+#endif
+}
+
+// BaseEmitter - Events
+// ====================
+
+Error BaseEmitter::on_attach(CodeHolder& code) noexcept {
+ _code = &code;
+ _environment = code.environment();
+ _add_emitter_flags(EmitterFlags::kAttached);
+
+ _gp_signature.set_bits(
+ Environment::is_32bit(code.arch())
+ ? RegTraits<RegType::kGp32>::kSignature
+ : RegTraits<RegType::kGp64>::kSignature
+ );
+
+ on_settings_updated();
+ return Error::kOk;
+}
+
+Error BaseEmitter::on_detach(CodeHolder& code) noexcept {
+ Support::maybe_unused(code);
+
+ if (!has_own_logger()) {
+ _logger = nullptr;
+ }
+
+ if (!has_own_error_handler()) {
+ _error_handler = nullptr;
+ }
+
+ _clear_emitter_flags(~kEmitterPreservedFlags);
+ _instruction_alignment = uint8_t(0);
+ _forced_inst_options = InstOptions::kReserved;
+ _private_data = 0;
+
+ _environment.reset();
+ _gp_signature.reset();
+
+ _inst_options = InstOptions::kNone;
+ _extra_reg.reset();
+ _inline_comment = nullptr;
+
+ return Error::kOk;
+}
+
+Error BaseEmitter::on_reinit(CodeHolder& code) noexcept {
+ ASMJIT_ASSERT(_code == &code);
+ Support::maybe_unused(code);
+
+ _inst_options = InstOptions::kNone;
+ _extra_reg.reset();
+ _inline_comment = nullptr;
+
+ return Error::kOk;
+}
+
+void BaseEmitter::on_settings_updated() noexcept {
+ // Only called when attached to CodeHolder by CodeHolder.
+ ASMJIT_ASSERT(_code != nullptr);
+
+ if (!has_own_logger()) {
+ _logger = _code->logger();
+ }
+
+ if (!has_own_error_handler()) {
+ _error_handler = _code->error_handler();
+ }
+
+ BaseEmitter_updateForcedOptions(this);
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/emitter.h b/3rdparty/asmjit/asmjit/core/emitter.h
new file mode 100644
index 00000000000..2c82912d0f9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/emitter.h
@@ -0,0 +1,938 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_EMITTER_H_INCLUDED
+#define ASMJIT_CORE_EMITTER_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/inst.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+class ConstPool;
+class FuncFrame;
+class FuncArgsAssignment;
+
+//! Align mode, used by \ref BaseEmitter::align().
+enum class AlignMode : uint8_t {
+ //! Align executable code.
+ kCode = 0,
+ //! Align non-executable code.
+ kData = 1,
+ //! Align by a sequence of zeros.
+ kZero = 2,
+
+ //! Maximum value of `AlignMode`.
+ kMaxValue = kZero
+};
+
+//! Emitter type used by \ref BaseEmitter.
+enum class EmitterType : uint8_t {
+ //! Unknown or uninitialized.
+ kNone = 0,
+ //! Emitter inherits from \ref BaseAssembler.
+ kAssembler = 1,
+ //! Emitter inherits from \ref BaseBuilder.
+ kBuilder = 2,
+ //! Emitter inherits from \ref BaseCompiler.
+ kCompiler = 3,
+
+ //! Maximum value of `EmitterType`.
+ kMaxValue = kCompiler
+};
+
+//! Emitter flags, used by \ref BaseEmitter.
+enum class EmitterFlags : uint8_t {
+ //! No flags.
+ kNone = 0u,
+ //! Emitter is attached to CodeHolder.
+ kAttached = 0x01u,
+ //! The emitter must emit comments.
+ kLogComments = 0x08u,
+ //! The emitter has its own \ref Logger (not propagated from \ref CodeHolder).
+ kOwnLogger = 0x10u,
+ //! The emitter has its own \ref ErrorHandler (not propagated from \ref CodeHolder).
+ kOwnErrorHandler = 0x20u,
+ //! The emitter was finalized.
+ kFinalized = 0x40u,
+ //! The emitter was destroyed.
+ //!
+ //! This flag is used for a very short time when an emitter is being destroyed by
+ //! CodeHolder.
+ kDestroyed = 0x80u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(EmitterFlags)
+
+//! Encoding options.
+enum class EncodingOptions : uint32_t {
+ //! No encoding options.
+ kNone = 0,
+
+ //! Emit instructions that are optimized for size, if possible.
+ //!
+ //! Default: false.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! When this option is set it the assembler will try to fix instructions if possible into operation equivalent
+ //! instructions that take less bytes by taking advantage of implicit zero extension. For example instruction
+ //! like `mov r64, imm` and `and r64, imm` can be translated to `mov r32, imm` and `and r32, imm` when the
+ //! immediate constant is lesser than `2^31`.
+ kOptimizeForSize = 0x00000001u,
+
+ //! Emit optimized code-alignment sequences.
+ //!
+ //! Default: false.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Default align sequence used by X86 architecture is one-byte (0x90) opcode that is often shown by disassemblers
+ //! as NOP. However there are more optimized align sequences for 2-11 bytes that may execute faster on certain CPUs.
+ //! If this feature is enabled AsmJit will generate specialized sequences for alignment between 2 to 11 bytes.
+ kOptimizedAlign = 0x00000002u,
+
+ //! Emit jump-prediction hints.
+ //!
+ //! Default: false.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Jump prediction is usually based on the direction of the jump. If the jump is backward it is usually predicted as
+ //! taken; and if the jump is forward it is usually predicted as not-taken. The reason is that loops generally use
+ //! backward jumps and conditions usually use forward jumps. However this behavior can be overridden by using
+ //! instruction prefixes. If this option is enabled these hints will be emitted.
+ //!
+ //! This feature is disabled by default, because the only processor that used to take into consideration prediction
+ //! hints was P4. Newer processors implement heuristics for branch prediction and ignore static hints. This means
+ //! that this feature can be only used for annotation purposes.
+ kPredictedJumps = 0x00000010u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(EncodingOptions)
+
+//! Diagnostic options are used to tell emitters and their passes to perform diagnostics when emitting or processing
+//! user code. These options control validation and extra diagnostics that can be performed by higher level emitters.
+//!
+//! Instruction Validation
+//! ----------------------
+//!
+//! \ref BaseAssembler implementation perform by default only basic checks that are necessary to identify all
+//! variations of an instruction so the correct encoding can be selected. This is fine for production-ready code
+//! as the assembler doesn't have to perform checks that would slow it down. However, sometimes these checks are
+//! beneficial especially when the project that uses AsmJit is in a development phase, in which mistakes happen
+//! often. To make the experience of using AsmJit seamless it offers validation features that can be controlled
+//! by \ref DiagnosticOptions.
+//!
+//! Compiler Diagnostics
+//! --------------------
+//!
+//! Diagnostic options work with \ref BaseCompiler passes (precisely with its register allocation pass). These options
+//! can be used to enable logging of all operations that the Compiler does.
+enum class DiagnosticOptions : uint32_t {
+ //! No validation options.
+ kNone = 0,
+
+ //! Perform strict validation in \ref BaseAssembler::emit() implementations.
+ //!
+ //! This flag ensures that each instruction is checked before it's encoded into a binary representation. This flag
+ //! is only relevant for \ref BaseAssembler implementations, but can be set in any other emitter type, in that case
+ //! if that emitter needs to create an assembler on its own, for the purpose of \ref BaseEmitter::finalize() it
+ //! would propagate this flag to such assembler so all instructions passed to it are explicitly validated.
+ //!
+ //! Default: false.
+ kValidateAssembler = 0x00000001u,
+
+ //! Perform strict validation in \ref BaseBuilder::emit() and \ref BaseCompiler::emit() implementations.
+ //!
+ //! This flag ensures that each instruction is checked before an \ref InstNode representing the instruction is
+ //! created by \ref BaseBuilder or \ref BaseCompiler. This option could be more useful than \ref kValidateAssembler
+ //! in cases in which there is an invalid instruction passed to an assembler, which was invalid much earlier, most
+ //! likely when such instruction was passed to Builder/Compiler.
+ //!
+ //! This is a separate option that was introduced, because it's possible to manipulate the instruction stream
+ //! emitted by \ref BaseBuilder and \ref BaseCompiler - this means that it's allowed to emit invalid instructions
+ //! (for example with missing operands) that will be fixed later before finalizing it.
+ //!
+ //! Default: false.
+ kValidateIntermediate = 0x00000002u,
+
+ //! Annotate all nodes processed by register allocator (Compiler/RA).
+ //!
+ //! \note Annotations don't need debug options, however, some debug options like `kRADebugLiveness` may influence
+ //! their output (for example the mentioned option would add liveness information to per-instruction annotation).
+ kRAAnnotate = 0x00000080u,
+
+ //! Debug CFG generation and other related algorithms / operations (Compiler/RA).
+ kRADebugCFG = 0x00000100u,
+
+ //! Debug liveness analysis (Compiler/RA).
+ kRADebugLiveness = 0x00000200u,
+
+ //! Debug register allocation assignment (Compiler/RA).
+ kRADebugAssignment = 0x00000400u,
+
+ //! Debug the removal of code part of unreachable blocks.
+ kRADebugUnreachable = 0x00000800u,
+
+ //! Enable all debug options (Compiler/RA).
+ kRADebugAll = 0x0000FF00u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(DiagnosticOptions)
+
+//! Provides a base foundation to emitting code - specialized by \ref BaseAssembler and \ref BaseBuilder.
+class ASMJIT_VIRTAPI BaseEmitter {
+public:
+ ASMJIT_BASE_CLASS(BaseEmitter)
+ ASMJIT_NONCOPYABLE(BaseEmitter)
+
+ //! \name Types
+ //! \{
+
+ //! Emitter state that can be used to specify options and inline comment of a next node or instruction.
+ struct State {
+ InstOptions options;
+ RegOnly extra_reg;
+ const char* comment;
+ };
+
+ //! Functions used by backend-specific emitter implementation.
+ //!
+ //! These are typically shared between Assembler/Builder/Compiler of a single backend.
+ struct Funcs {
+ using EmitProlog = Error (ASMJIT_CDECL*)(BaseEmitter* emitter, const FuncFrame& frame);
+ using EmitEpilog = Error (ASMJIT_CDECL*)(BaseEmitter* emitter, const FuncFrame& frame);
+ using EmitArgsAssignment = Error (ASMJIT_CDECL*)(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args);
+
+ using FormatInstruction = Error (ASMJIT_CDECL*)(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept;
+
+ using ValidateFunc = Error (ASMJIT_CDECL*)(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept;
+
+ //! Emit prolog implementation.
+ EmitProlog emit_prolog;
+ //! Emit epilog implementation.
+ EmitEpilog emit_epilog;
+ //! Emit arguments assignment implementation.
+ EmitArgsAssignment emit_args_assignment;
+ //! Instruction formatter implementation.
+ FormatInstruction format_instruction;
+ //! Instruction validation implementation.
+ ValidateFunc validate;
+
+ //! Resets all functions to nullptr.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Funcs{}; }
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! See \ref EmitterType.
+ EmitterType _emitter_type = EmitterType::kNone;
+
+ //! See \ref EmitterFlags.
+ EmitterFlags _emitter_flags = EmitterFlags::kNone;
+
+ //! Instruction alignment.
+ uint8_t _instruction_alignment = 0u;
+
+ //! Validation flags in case validation is used.
+ //!
+ //! \note Validation flags are specific to the emitter and they are setup at construction time and then never
+ //! changed.
+ ValidationFlags _validation_flags = ValidationFlags::kNone;
+
+ //! Validation options.
+ DiagnosticOptions _diagnostic_options = DiagnosticOptions::kNone;
+
+ //! Encoding options.
+ EncodingOptions _encoding_options = EncodingOptions::kNone;
+
+ //! Forced instruction options, combined with \ref _inst_options by \ref emit().
+ InstOptions _forced_inst_options = InstOptions::kReserved;
+
+ //! All supported architectures in a bit-mask, where LSB is the bit with a zero index.
+ uint64_t _arch_mask = 0;
+
+ //! CodeHolder the emitter is attached to.
+ CodeHolder* _code = nullptr;
+
+ //! Attached \ref Logger.
+ Logger* _logger = nullptr;
+
+ //! Attached \ref ErrorHandler.
+ ErrorHandler* _error_handler = nullptr;
+
+ //! Describes the target environment, matches \ref CodeHolder::environment().
+ Environment _environment {};
+
+ //! Native GP register signature (either a 32-bit or 64-bit GP register signature).
+ OperandSignature _gp_signature {};
+ //! Internal private data used freely by any emitter.
+ uint32_t _private_data = 0;
+
+ //! Next instruction options (affects the next instruction).
+ InstOptions _inst_options = InstOptions::kNone;
+ //! Extra register (op-mask {k} on AVX-512) (affects the next instruction).
+ RegOnly _extra_reg {};
+ //! Inline comment of the next instruction (affects the next instruction).
+ const char* _inline_comment = nullptr;
+
+ //! Pointer to functions used by backend-specific emitter implementation.
+ Funcs _funcs {};
+
+ //! Emitter attached before this emitter in \ref CodeHolder, otherwise nullptr if there is no emitter before.
+ BaseEmitter* _attached_prev = nullptr;
+ //! Emitter attached after this emitter in \ref CodeHolder, otherwise nullptr if there is no emitter after.
+ BaseEmitter* _attached_next = nullptr;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit BaseEmitter(EmitterType emitter_type) noexcept;
+ ASMJIT_API virtual ~BaseEmitter() noexcept;
+
+ //! \}
+
+ //! \name Cast
+ //! \{
+
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* as() noexcept { return reinterpret_cast<T*>(this); }
+
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const T* as() const noexcept { return reinterpret_cast<const T*>(this); }
+
+ //! \}
+
+ //! \name Emitter Type & Flags
+ //! \{
+
+ //! Returns the type of this emitter, see `EmitterType`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG EmitterType emitter_type() const noexcept { return _emitter_type; }
+
+ //! Returns emitter flags , see `Flags`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG EmitterFlags emitter_flags() const noexcept { return _emitter_flags; }
+
+ //! Tests whether the emitter inherits from `BaseAssembler`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_assembler() const noexcept { return _emitter_type == EmitterType::kAssembler; }
+
+ //! Tests whether the emitter inherits from `BaseBuilder`.
+ //!
+ //! \note Both Builder and Compiler emitters would return `true`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_builder() const noexcept { return uint32_t(_emitter_type) >= uint32_t(EmitterType::kBuilder); }
+
+ //! Tests whether the emitter inherits from `BaseCompiler`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_compiler() const noexcept { return _emitter_type == EmitterType::kCompiler; }
+
+ //! Tests whether the emitter has the given `flag` enabled.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_emitter_flag(EmitterFlags flag) const noexcept { return Support::test(_emitter_flags, flag); }
+
+ //! Tests whether the emitter is finalized.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_finalized() const noexcept { return has_emitter_flag(EmitterFlags::kFinalized); }
+
+ //! Tests whether the emitter is destroyed (only used during destruction).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_destroyed() const noexcept { return has_emitter_flag(EmitterFlags::kDestroyed); }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Internal Functions
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void _add_emitter_flags(EmitterFlags flags) noexcept { _emitter_flags |= flags; }
+ ASMJIT_INLINE_NODEBUG void _clear_emitter_flags(EmitterFlags flags) noexcept { _emitter_flags &= _emitter_flags & ~flags; }
+
+ //! \}
+ //! \endcond
+
+ //! \name Target Information
+ //! \{
+
+ //! Returns the CodeHolder this emitter is attached to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CodeHolder* code() const noexcept { return _code; }
+
+ //! Returns the target environment.
+ //!
+ //! The returned \ref Environment reference matches \ref CodeHolder::environment().
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; }
+
+ //! Tests whether the target architecture is 32-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_32bit() const noexcept { return environment().is_32bit(); }
+
+ //! Tests whether the target architecture is 64-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_64bit() const noexcept { return environment().is_64bit(); }
+
+ //! Returns the target architecture type.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return environment().arch(); }
+
+ //! Returns the target architecture sub-type.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SubArch sub_arch() const noexcept { return environment().sub_arch(); }
+
+ //! Returns the target architecture's GP register size (4 or 8 bytes).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t register_size() const noexcept { return environment().register_size(); }
+
+ //! Returns a signature of a native general purpose register (either 32-bit or 64-bit depending on the architecture).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OperandSignature gp_signature() const noexcept { return _gp_signature; }
+
+ //! Returns instruction alignment.
+ //!
+ //! The following values are returned based on the target architecture:
+ //! - X86 and X86_64 - instruction alignment is 1
+ //! - AArch32 - instruction alignment is 4 in A32 mode and 2 in THUMB mode.
+ //! - AArch64 - instruction alignment is 4
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t instruction_alignment() const noexcept { return _instruction_alignment; }
+
+ //! \}
+
+ //! \name Initialization & Finalization
+ //! \{
+
+ //! Tests whether the emitter is initialized (i.e. attached to \ref CodeHolder).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_initialized() const noexcept { return _code != nullptr; }
+
+ //! Finalizes this emitter.
+ //!
+ //! Materializes the content of the emitter by serializing it to the attached \ref CodeHolder through an architecture
+ //! specific \ref BaseAssembler. This function won't do anything if the emitter inherits from \ref BaseAssembler as
+ //! assemblers emit directly to a \ref CodeBuffer held by \ref CodeHolder. However, if this is an emitter that
+ //! inherits from \ref BaseBuilder or \ref BaseCompiler then these emitters need the materialization phase as they
+ //! store their content in a representation not visible to \ref CodeHolder.
+ ASMJIT_API virtual Error finalize();
+
+ //! \}
+
+ //! \name Logging
+ //! \{
+
+ //! Tests whether the emitter has a logger.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_logger() const noexcept { return _logger != nullptr; }
+
+ //! Tests whether the emitter has its own logger.
+ //!
+ //! Own logger means that it overrides the possible logger that may be used by \ref CodeHolder this emitter is
+ //! attached to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_own_logger() const noexcept { return has_emitter_flag(EmitterFlags::kOwnLogger); }
+
+ //! Returns the logger this emitter uses.
+ //!
+ //! The returned logger is either the emitter's own logger or it's logger used by \ref CodeHolder this emitter
+ //! is attached to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; }
+
+ //! Sets or resets the logger of the emitter.
+ //!
+ //! If the `logger` argument is non-null then the logger will be considered emitter's own logger, see \ref
+ //! has_own_logger() for more details. If the given `logger` is null then the emitter will automatically use logger
+ //! that is attached to the \ref CodeHolder this emitter is attached to.
+ ASMJIT_API void set_logger(Logger* logger) noexcept;
+
+ //! Resets the logger of this emitter.
+ //!
+ //! The emitter will bail to using a logger attached to \ref CodeHolder this emitter is attached to, or no logger
+ //! at all if \ref CodeHolder doesn't have one.
+ ASMJIT_INLINE_NODEBUG void reset_logger() noexcept { return set_logger(nullptr); }
+
+ //! \}
+
+ //! \name Error Handling
+ //! \{
+
+ //! Tests whether the emitter has an error handler attached.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_error_handler() const noexcept { return _error_handler != nullptr; }
+
+ //! Tests whether the emitter has its own error handler.
+ //!
+ //! Own error handler means that it overrides the possible error handler that may be used by \ref CodeHolder this
+ //! emitter is attached to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_own_error_handler() const noexcept { return has_emitter_flag(EmitterFlags::kOwnErrorHandler); }
+
+ //! Returns the error handler this emitter uses.
+ //!
+ //! The returned error handler is either the emitter's own error handler or it's error handler used by
+ //! \ref CodeHolder this emitter is attached to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ErrorHandler* error_handler() const noexcept { return _error_handler; }
+
+ //! Sets or resets the error handler of the emitter.
+ ASMJIT_API void set_error_handler(ErrorHandler* error_handler) noexcept;
+
+ //! Resets the error handler.
+ ASMJIT_INLINE_NODEBUG void reset_error_handler() noexcept { set_error_handler(nullptr); }
+
+ //! \cond INTERNAL
+ ASMJIT_API Error _report_error(Error err, const char* message = nullptr);
+ //! \endcond
+
+ //! Handles the given error in the following way:
+ //! 1. If the emitter has \ref ErrorHandler attached, it calls its \ref ErrorHandler::handle_error() member function
+ //! first, and then returns the error. The `handle_error()` function may throw.
+ //! 2. if the emitter doesn't have \ref ErrorHandler, the error is simply returned.
+ ASMJIT_INLINE Error report_error(Error err, const char* message = nullptr) {
+ Error e = _report_error(err, message);
+
+ // Static analysis is not working properly without these assumptions.
+ ASMJIT_ASSUME(e == err);
+ ASMJIT_ASSUME(e != Error::kOk);
+
+ return e;
+ }
+
+ //! \}
+
+ //! \name Encoding Options
+ //! \{
+
+ //! Returns encoding options.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG EncodingOptions encoding_options() const noexcept { return _encoding_options; }
+
+ //! Tests whether the encoding `option` is set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_encoding_option(EncodingOptions option) const noexcept { return Support::test(_encoding_options, option); }
+
+ //! Enables the given encoding `options`.
+ ASMJIT_INLINE_NODEBUG void add_encoding_options(EncodingOptions options) noexcept { _encoding_options |= options; }
+ //! Disables the given encoding `options`.
+ ASMJIT_INLINE_NODEBUG void clear_encoding_options(EncodingOptions options) noexcept { _encoding_options &= ~options; }
+
+ //! \}
+
+ //! \name Diagnostic Options
+ //! \{
+
+ //! Returns the emitter's diagnostic options.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG DiagnosticOptions diagnostic_options() const noexcept { return _diagnostic_options; }
+
+ //! Tests whether the given `option` is present in the emitter's diagnostic options.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_diagnostic_option(DiagnosticOptions option) const noexcept { return Support::test(_diagnostic_options, option); }
+
+ //! Activates the given diagnostic `options`.
+ //!
+ //! This function is used to activate explicit validation options that will be then used by all emitter
+ //! implementations. There are in general two possibilities:
+ //!
+ //! - Architecture specific assembler is used. In this case a \ref DiagnosticOptions::kValidateAssembler can be
+ //! used to turn on explicit validation that will be used before an instruction is emitted. This means that
+ //! internally an extra step will be performed to make sure that the instruction is correct. This is needed,
+ //! because by default assemblers prefer speed over strictness.
+ //!
+ //! This option should be used in debug builds as it's pretty expensive.
+ //!
+ //! - Architecture specific builder or compiler is used. In this case the user can turn on
+ //! \ref DiagnosticOptions::kValidateIntermediate option that adds explicit validation step before the Builder
+ //! or Compiler creates an \ref InstNode to represent an emitted instruction. Error will be returned if the
+ //! instruction is ill-formed. In addition, also \ref DiagnosticOptions::kValidateAssembler can be used, which
+ //! would not be consumed by Builder / Compiler directly, but it would be propagated to an architecture specific
+ //! \ref BaseAssembler implementation it creates during \ref BaseEmitter::finalize().
+ ASMJIT_API void add_diagnostic_options(DiagnosticOptions options) noexcept;
+
+ //! Deactivates the given validation `options`.
+ //!
+ //! See \ref add_diagnostic_options() and \ref DiagnosticOptions for more details.
+ ASMJIT_API void clear_diagnostic_options(DiagnosticOptions options) noexcept;
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
+
+ //! Returns forced instruction options.
+ //!
+ //! Forced instruction options are merged with next instruction options before the instruction is encoded. These
+ //! options have some bits reserved that are used by error handling, logging, and instruction validation purposes.
+ //! Other options are globals that affect each instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstOptions forced_inst_options() const noexcept { return _forced_inst_options; }
+
+ //! Returns options of the next instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstOptions inst_options() const noexcept { return _inst_options; }
+
+ //! Returns options of the next instruction.
+ ASMJIT_INLINE_NODEBUG void set_inst_options(InstOptions options) noexcept { _inst_options = options; }
+
+ //! Adds options of the next instruction.
+ ASMJIT_INLINE_NODEBUG void add_inst_options(InstOptions options) noexcept { _inst_options |= options; }
+
+ //! Resets options of the next instruction.
+ ASMJIT_INLINE_NODEBUG void reset_inst_options() noexcept { _inst_options = InstOptions::kNone; }
+
+ //! Tests whether the extra register operand is valid.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_extra_reg() const noexcept { return _extra_reg.is_reg(); }
+
+ //! Returns an extra operand that will be used by the next instruction (architecture specific).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RegOnly& extra_reg() const noexcept { return _extra_reg; }
+
+ //! Sets an extra operand that will be used by the next instruction (architecture specific).
+ ASMJIT_INLINE_NODEBUG void set_extra_reg(const Reg& reg) noexcept { _extra_reg.init(reg); }
+
+ //! Sets an extra operand that will be used by the next instruction (architecture specific).
+ ASMJIT_INLINE_NODEBUG void set_extra_reg(const RegOnly& reg) noexcept { _extra_reg.init(reg); }
+
+ //! Resets an extra operand that will be used by the next instruction (architecture specific).
+ ASMJIT_INLINE_NODEBUG void reset_extra_reg() noexcept { _extra_reg.reset(); }
+
+ //! Returns comment/annotation of the next instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* inline_comment() const noexcept { return _inline_comment; }
+
+ //! Sets comment/annotation of the next instruction.
+ //!
+ //! \note This string is set back to null by `_emit()`, but until that it has to remain valid as the Emitter is not
+ //! required to make a copy of it (and it would be slow to do that for each instruction).
+ ASMJIT_INLINE_NODEBUG void set_inline_comment(const char* s) noexcept { _inline_comment = s; }
+
+ //! Resets the comment/annotation to nullptr.
+ ASMJIT_INLINE_NODEBUG void reset_inline_comment() noexcept { _inline_comment = nullptr; }
+
+ //! \}
+
+ //! \name Emitter State
+ //! \{
+
+ //! Resets the emitter state, which contains instruction options, extra register, and inline comment.
+ //!
+ //! Emitter can have a state that describes instruction options and extra register used by the instruction. Most
+ //! instructions don't need nor use the state, however, if an instruction uses a prefix such as REX or REP prefix,
+ //! which is set explicitly, then the state would contain it. This allows to mimic the syntax of assemblers such
+ //! as X86. For example `rep().movs(...)` would map to a `REP MOVS` instuction on X86. The same applies to various
+ //! hints and the use of a mask register in AVX-512 mode.
+ ASMJIT_INLINE_NODEBUG void reset_state() noexcept {
+ reset_inst_options();
+ reset_extra_reg();
+ reset_inline_comment();
+ }
+
+ //! \cond INTERNAL
+
+ //! Grabs the current emitter state and resets the emitter state at the same time, returning the state the emitter
+ //! had before the state was reset.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG State _grab_state() noexcept {
+ State s{_inst_options | _forced_inst_options, _extra_reg, _inline_comment};
+ reset_state();
+ return s;
+ }
+ //! \endcond
+
+ //! \}
+
+ //! \name Sections
+ //! \{
+
+ //! Switches to the given `section`.
+ //!
+ //! Once switched, everything is emitted to `section`.
+ ASMJIT_API virtual Error section(Section* section);
+
+ //! \}
+
+ //! \name Labels
+ //! \{
+
+ //! Creates a new anonymous label.
+ [[nodiscard]]
+ ASMJIT_API virtual Label new_label();
+
+ //! Creates a new named label.
+ [[nodiscard]]
+ ASMJIT_API virtual Label new_named_label(const char* name, size_t name_size = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId);
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_named_label(Span<const char> name, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId) {
+ return new_named_label(name.data(), name.size(), type, parent_id);
+ }
+
+ //! Creates a new anonymous label with a name, which can only be used for debugging purposes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label new_anonymous_label(const char* name, size_t name_size = SIZE_MAX) {
+ return new_named_label(name, name_size, LabelType::kAnonymous);
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_anonymous_label(Span<const char> name) { return new_anonymous_label(name.data(), name.size()); }
+
+ //! Creates a new external label.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label new_external_label(const char* name, size_t name_size = SIZE_MAX) {
+ return new_named_label(name, name_size, LabelType::kExternal);
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_external_label(Span<const char> name) { return new_external_label(name.data(), name.size()); }
+
+ //! Returns `Label` by `name`.
+ //!
+ //! Returns invalid Label in case that the name is invalid or label was not found.
+ //!
+ //! \note This function doesn't trigger ErrorHandler in case the name is invalid or no such label exist. You must
+ //! always check the validity of the `Label` returned.
+ [[nodiscard]]
+ ASMJIT_API Label label_by_name(const char* name, size_t name_size = SIZE_MAX, uint32_t parent_id = Globals::kInvalidId) noexcept;
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_API Label label_by_name(Span<const char> name, uint32_t parent_id = Globals::kInvalidId) noexcept {
+ return label_by_name(name.data(), name.size(), parent_id);
+ }
+
+ //! Binds the `label` to the current position of the current section.
+ //!
+ //! \note Attempt to bind the same label multiple times will return an error.
+ ASMJIT_API virtual Error bind(const Label& label);
+
+ //! Tests whether the label `id` is valid (i.e. registered).
+ [[nodiscard]]
+ ASMJIT_API bool is_label_valid(uint32_t label_id) const noexcept;
+
+ //! Tests whether the `label` is valid (i.e. registered).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_label_valid(const Label& label) const noexcept { return is_label_valid(label.id()); }
+
+ //! \}
+
+ //! \name Emit
+ //! \{
+
+ // NOTE: These `emit()` helpers are designed to address a code-bloat generated by C++ compilers to call a function
+ // having many arguments. Each parameter to `_emit()` requires some code to pass it, which means that if we default
+ // to 5 arguments in `_emit()` and inst_id the C++ compiler would have to generate a virtual function call having 5
+ // parameters and additional `this` argument, which is quite a lot. Since by default most instructions have 2 to 3
+ // operands it's better to introduce helpers that pass from 0 to 6 operands that help to reduce the size of emit(...)
+ // function call.
+
+ //! Emits an instruction (internal).
+ ASMJIT_API Error _emitI(InstId inst_id);
+ //! \overload
+ ASMJIT_API Error _emitI(InstId inst_id, const Operand_& o0);
+ //! \overload
+ ASMJIT_API Error _emitI(InstId inst_id, const Operand_& o0, const Operand_& o1);
+ //! \overload
+ ASMJIT_API Error _emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2);
+ //! \overload
+ ASMJIT_API Error _emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3);
+ //! \overload
+ ASMJIT_API Error _emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4);
+ //! \overload
+ ASMJIT_API Error _emitI(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5);
+
+ //! Emits an instruction `inst_id` with the given `operands`.
+ //!
+ //! This is the most universal way of emitting code, which accepts an instruction identifier and instruction
+ //! operands. This is called an "unchecked" API as emit doesn't provide any type checks at compile-time. This
+ //! allows to emit instruction with just \ref Operand instances, which could be handy in some cases - for
+ //! example emitting generic code where you don't know whether some operand is register, memory, or immediate.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Error emit(InstId inst_id, Args&&... operands) {
+ return _emitI(inst_id, Support::ForwardOp<Args>::forward(operands)...);
+ }
+
+ //! Similar to \ref emit(), but uses array of `operands` instead.
+ ASMJIT_INLINE_NODEBUG Error emit_op_array(InstId inst_id, const Operand_* operands, size_t op_count) {
+ return _emit_op_array(inst_id, operands, op_count);
+ }
+
+ //! Similar to \ref emit(), but emits instruction with both instruction options and extra register, followed
+ //! by an array of `operands`.
+ ASMJIT_INLINE Error emit_inst(const BaseInst& inst, const Operand_* operands, size_t op_count) {
+ set_inst_options(inst.options());
+ set_extra_reg(inst.extra_reg());
+ return _emit_op_array(inst.inst_id(), operands, op_count);
+ }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Emit Internals
+ //! \{
+
+ //! Emits an instruction - all 6 operands must be defined.
+ ASMJIT_API virtual Error _emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext);
+ //! Emits instruction having operands stored in array.
+ ASMJIT_API virtual Error _emit_op_array(InstId inst_id, const Operand_* operands, size_t op_count);
+
+ //! \}
+ //! \endcond
+
+ //! \name Emit Utilities
+ //! \{
+
+ //! Emits a function prolog described by the given function `frame`.
+ ASMJIT_API Error emit_prolog(const FuncFrame& frame);
+ //! Emits a function epilog described by the given function `frame`.
+ ASMJIT_API Error emit_epilog(const FuncFrame& frame);
+ //! Emits code that reassigns function `frame` arguments to the given `args`.
+ ASMJIT_API Error emit_args_assignment(const FuncFrame& frame, const FuncArgsAssignment& args);
+
+ //! \}
+
+ //! \name Align
+ //! \{
+
+ //! Aligns the current CodeBuffer position to the `alignment` specified.
+ //!
+ //! The sequence that is used to fill the gap between the aligned location and the current location depends on the
+ //! align `mode`, see \ref AlignMode. The `alignment` argument specifies alignment in bytes, so for example when
+ //! it's `32` it means that the code buffer will be aligned to `32` bytes.
+ ASMJIT_API virtual Error align(AlignMode align_mode, uint32_t alignment);
+
+ //! \}
+
+ //! \name Embed
+ //! \{
+
+ //! Embeds raw data into the \ref CodeBuffer.
+ ASMJIT_API virtual Error embed(const void* data, size_t data_size);
+
+ //! Embeds a typed data array.
+ //!
+ //! This is the most flexible function for embedding data as it allows to:
+ //!
+ //! - Assign a `type_id` to the data, so the emitter knows the type of items stored in `data`. Binary data should
+ //! use \ref TypeId::kUInt8.
+ //!
+ //! - Repeat the given data `repeat_count` times, so the data can be used as a fill pattern for example, or as a
+ //! pattern used by SIMD instructions.
+ ASMJIT_API virtual Error embed_data_array(TypeId type_id, const void* data, size_t item_count, size_t repeat_count = 1);
+
+ //! Embeds int8_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_int8(int8_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kInt8, &value, 1, repeat_count); }
+ //! Embeds uint8_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_uint8(uint8_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kUInt8, &value, 1, repeat_count); }
+ //! Embeds int16_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_int16(int16_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kInt16, &value, 1, repeat_count); }
+ //! Embeds uint16_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_uint16(uint16_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kUInt16, &value, 1, repeat_count); }
+ //! Embeds int32_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_int32(int32_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kInt32, &value, 1, repeat_count); }
+ //! Embeds uint32_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_uint32(uint32_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kUInt32, &value, 1, repeat_count); }
+ //! Embeds int64_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_int64(int64_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kInt64, &value, 1, repeat_count); }
+ //! Embeds uint64_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_uint64(uint64_t value, size_t repeat_count = 1) { return embed_data_array(TypeId::kUInt64, &value, 1, repeat_count); }
+ //! Embeds a floating point `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_float(float value, size_t repeat_count = 1) { return embed_data_array(TypeId(TypeUtils::TypeIdOfT<float>::kTypeId), &value, 1, repeat_count); }
+ //! Embeds a floating point `value` repeated by `repeat_count`.
+ ASMJIT_INLINE_NODEBUG Error embed_double(double value, size_t repeat_count = 1) { return embed_data_array(TypeId(TypeUtils::TypeIdOfT<double>::kTypeId), &value, 1, repeat_count); }
+
+ //! Embeds a constant pool at the current offset by performing the following:
+ //! 1. Aligns by using AlignMode::kData to the minimum `pool` alignment.
+ //! 2. Binds the ConstPool label so it's bound to an aligned location.
+ //! 3. Emits ConstPool content.
+ ASMJIT_API virtual Error embed_const_pool(const Label& label, const ConstPool& pool);
+
+ //! Embeds an absolute `label` address as data.
+ //!
+ //! The `data_size` is an optional argument that can be used to specify the size of the address data. If it's zero
+ //! (default) the address size is deduced from the target architecture (either 4 or 8 bytes).
+ ASMJIT_API virtual Error embed_label(const Label& label, size_t data_size = 0);
+
+ //! Embeds a delta (distance) between the `label` and `base` calculating it as `label - base`. This function was
+ //! designed to make it easier to embed lookup tables where each index is a relative distance of two labels.
+ ASMJIT_API virtual Error embed_label_delta(const Label& label, const Label& base, size_t data_size = 0);
+
+ //! \}
+
+ //! \name Comment
+ //! \{
+
+ //! Emits a comment stored in `data` with an optional `size` parameter.
+ ASMJIT_API virtual Error comment(const char* data, size_t size = SIZE_MAX);
+
+ //! Emits a comment passed via a `data` span.
+ ASMJIT_INLINE Error comment(Span<const char> data) {
+ return comment(data.data(), data.size());
+ }
+
+ //! Emits a formatted comment specified by `fmt` and variable number of arguments.
+ ASMJIT_API Error commentf(const char* fmt, ...);
+ //! Emits a formatted comment specified by `fmt` and `ap`.
+ ASMJIT_API Error commentv(const char* fmt, va_list ap);
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ //! Called after the emitter was attached to `CodeHolder`.
+ ASMJIT_API virtual Error on_attach(CodeHolder& code) noexcept;
+
+ //! Called after the emitter was detached from `CodeHolder`.
+ ASMJIT_API virtual Error on_detach(CodeHolder& code) noexcept;
+
+ //! Called when CodeHolder is reinitialized when the emitter is attached.
+ ASMJIT_API virtual Error on_reinit(CodeHolder& code) noexcept;
+
+ //! Called when \ref CodeHolder has updated an important setting, which involves the following:
+ //!
+ //! - \ref Logger has been changed (\ref CodeHolder::set_logger() has been called).
+ //!
+ //! - \ref ErrorHandler has been changed (\ref CodeHolder::set_error_handler() has been called).
+ //!
+ //! This function ensures that the settings are properly propagated from \ref CodeHolder to the emitter.
+ //!
+ //! \note This function is virtual and can be overridden, however, if you do so, always call \ref
+ //! BaseEmitter::on_settings_updated() within your own implementation to ensure that the emitter is
+ //! in a consistent state.
+ ASMJIT_API virtual void on_settings_updated() noexcept;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_EMITTER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/emitterutils.cpp b/3rdparty/asmjit/asmjit/core/emitterutils.cpp
new file mode 100644
index 00000000000..85e6945c032
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/emitterutils.cpp
@@ -0,0 +1,129 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/emitterutils_p.h>
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+namespace EmitterUtils {
+
+#ifndef ASMJIT_NO_LOGGING
+
+Error finish_formatted_line(String& sb, const FormatOptions& format_options, const uint8_t* bin_data, size_t bin_size, size_t offset_size, size_t imm_size, const char* comment) noexcept {
+ ASMJIT_ASSERT(bin_size >= offset_size);
+ const size_t kNoBinSize = SIZE_MAX;
+
+ size_t comment_size = comment ? Support::str_nlen(comment, Globals::kMaxCommentSize) : 0;
+
+ if ((bin_size != 0 && bin_size != kNoBinSize) || comment_size) {
+ char sep = ';';
+ size_t padding = Formatter::padding_from_options(format_options, FormatPaddingGroup::kRegularLine);
+
+ for (size_t i = (bin_size == kNoBinSize); i < 2; i++) {
+ ASMJIT_PROPAGATE(sb.pad_end(padding));
+
+ if (sep) {
+ ASMJIT_PROPAGATE(sb.append(sep));
+ ASMJIT_PROPAGATE(sb.append(' '));
+ }
+
+ // Append binary data or comment.
+ if (i == 0) {
+ ASMJIT_PROPAGATE(sb.append_hex(bin_data, bin_size - offset_size - imm_size));
+ ASMJIT_PROPAGATE(sb.append_chars('.', offset_size * 2));
+ ASMJIT_PROPAGATE(sb.append_hex(bin_data + bin_size - imm_size, imm_size));
+ if (comment_size == 0) break;
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append(comment, comment_size));
+ }
+
+ sep = '|';
+ padding += Formatter::padding_from_options(format_options, FormatPaddingGroup::kMachineCode);
+ }
+ }
+
+ return sb.append('\n');
+}
+
+void log_label_bound(BaseAssembler* self, const Label& label) noexcept {
+ Logger* logger = self->logger();
+
+ StringTmp<512> sb;
+ size_t bin_size = logger->has_flag(FormatFlags::kMachineCode) ? size_t(0) : SIZE_MAX;
+
+ sb.append_chars(' ', logger->indentation(FormatIndentationGroup::kLabel));
+ Formatter::format_label(sb, logger->flags(), self, label.id());
+ sb.append(':');
+ finish_formatted_line(sb, logger->options(), nullptr, bin_size, 0, 0, self->_inline_comment);
+ logger->log(sb.data(), sb.size());
+}
+
+void log_instruction_emitted(
+ BaseAssembler* self,
+ InstId inst_id,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext,
+ uint32_t rel_size, uint32_t imm_size, uint8_t* after_cursor) {
+
+ Logger* logger = self->logger();
+ ASMJIT_ASSERT(logger != nullptr);
+
+ StringTmp<256> sb;
+ FormatFlags format_flags = logger->flags();
+
+ uint8_t* before_cursor = self->buffer_ptr();
+ intptr_t emitted_size = (intptr_t)(after_cursor - before_cursor);
+
+ Operand_ op_array[Globals::kMaxOpCount];
+ op_array_from_emit_args(op_array, o0, o1, o2, op_ext);
+
+ sb.append_chars(' ', logger->indentation(FormatIndentationGroup::kCode));
+ self->_funcs.format_instruction(sb, format_flags, self, self->arch(), BaseInst(inst_id, options, self->extra_reg()), Span<Operand_>(op_array, Globals::kMaxOpCount));
+
+ if (Support::test(format_flags, FormatFlags::kMachineCode)) {
+ finish_formatted_line(sb, logger->options(), self->buffer_ptr(), size_t(emitted_size), rel_size, imm_size, self->inline_comment());
+ }
+ else {
+ finish_formatted_line(sb, logger->options(), nullptr, SIZE_MAX, 0, 0, self->inline_comment());
+ }
+ logger->log(sb);
+}
+
+Error log_instruction_failed(
+ BaseEmitter* self,
+ Error err,
+ InstId inst_id,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) {
+
+ StringTmp<256> sb;
+ sb.append(DebugUtils::error_as_string(err));
+ sb.append(": ");
+
+ Operand_ op_array[Globals::kMaxOpCount];
+ op_array_from_emit_args(op_array, o0, o1, o2, op_ext);
+
+ self->_funcs.format_instruction(sb, FormatFlags::kRegType, self, self->arch(), BaseInst(inst_id, options, self->extra_reg()), Span<Operand_>(op_array, Globals::kMaxOpCount));
+
+ if (self->inline_comment()) {
+ sb.append(" ; ");
+ sb.append(self->inline_comment());
+ }
+
+ self->reset_state();
+ return self->report_error(err, sb.data());
+}
+
+#endif
+
+} // {EmitterUtils}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/emitterutils_p.h b/3rdparty/asmjit/asmjit/core/emitterutils_p.h
new file mode 100644
index 00000000000..8386e887349
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/emitterutils_p.h
@@ -0,0 +1,107 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
+#define ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
+
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/emitter.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+class BaseAssembler;
+class FormatOptions;
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+//! Utilities used by various emitters, mostly Assembler implementations.
+namespace EmitterUtils {
+
+static constexpr Operand no_ext[3] = { {}, {}, {} };
+
+enum kOpIndex : uint32_t {
+ kOp3 = 0,
+ kOp4 = 1,
+ kOp5 = 2
+};
+
+[[nodiscard]]
+static ASMJIT_INLINE uint32_t op_count_from_emit_args(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) noexcept {
+ uint32_t op_count = 0;
+
+ if (op_ext[kOp3].is_none()) {
+ if (!o0.is_none()) op_count = 1;
+ if (!o1.is_none()) op_count = 2;
+ if (!o2.is_none()) op_count = 3;
+ }
+ else {
+ op_count = 4;
+ if (!op_ext[kOp4].is_none()) {
+ op_count = 5 + uint32_t(!op_ext[kOp5].is_none());
+ }
+ }
+
+ return op_count;
+}
+
+static ASMJIT_INLINE void op_array_from_emit_args(Operand_ dst[Globals::kMaxOpCount], const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) noexcept {
+ dst[0].copy_from(o0);
+ dst[1].copy_from(o1);
+ dst[2].copy_from(o2);
+ dst[3].copy_from(op_ext[kOp3]);
+ dst[4].copy_from(op_ext[kOp4]);
+ dst[5].copy_from(op_ext[kOp5]);
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG bool is_encodable_offset_32(int32_t offset, uint32_t num_bits) noexcept {
+ uint32_t n_rev = 32 - num_bits;
+ return Support::sar(Support::shl(offset, n_rev), n_rev) == offset;
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG bool is_encodable_offset_64(int64_t offset, uint32_t num_bits) noexcept {
+ uint32_t n_rev = 64 - num_bits;
+ return Support::sar(Support::shl(offset, n_rev), n_rev) == offset;
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG bool is_absolute_location(uint64_t base_address, uint64_t section_offset) noexcept {
+ return base_address != Globals::kNoBaseAddress && section_offset != Globals::kNoSectionOffset;
+}
+
+#ifndef ASMJIT_NO_LOGGING
+Error finish_formatted_line(String& sb, const FormatOptions& format_options, const uint8_t* bin_data, size_t bin_size, size_t offset_size, size_t imm_size, const char* comment) noexcept;
+
+void log_label_bound(BaseAssembler* self, const Label& label) noexcept;
+
+void log_instruction_emitted(
+ BaseAssembler* self,
+ InstId inst_id,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext,
+ uint32_t rel_size, uint32_t imm_size, uint8_t* after_cursor);
+
+Error log_instruction_failed(
+ BaseEmitter* self,
+ Error err,
+ InstId inst_id,
+ InstOptions options,
+ const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext);
+#endif
+
+}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
+
diff --git a/3rdparty/asmjit/asmjit/core/environment.cpp b/3rdparty/asmjit/asmjit/core/environment.cpp
new file mode 100644
index 00000000000..fcc67f45db7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/environment.cpp
@@ -0,0 +1,47 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/environment.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// X86 Target
+// ----------
+//
+// - 32-bit - Linux, OSX, BSD, and apparently also Haiku guarantee 16-byte
+// stack alignment. Other operating systems are assumed to have
+// 4-byte alignment by default for safety reasons.
+// - 64-bit - stack must be aligned to 16 bytes.
+//
+// ARM Target
+// ----------
+//
+// - 32-bit - Stack must be aligned to 8 bytes.
+// - 64-bit - Stack must be aligned to 16 bytes (hardware requirement).
+uint32_t Environment::stack_alignment() const noexcept {
+ if (is_64bit()) {
+ // Assume 16-byte alignment on any 64-bit target.
+ return 16;
+ }
+ else {
+ // The following platforms use 16-byte alignment in 32-bit mode.
+ if (is_platform_linux() ||
+ is_platform_bsd() ||
+ is_platform_apple() ||
+ is_platform_haiku()) {
+ return 16u;
+ }
+
+ if (is_family_arm()) {
+ return 8;
+ }
+
+ // Bail to 4-byte alignment if we don't know.
+ return 4;
+ }
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/environment.h b/3rdparty/asmjit/asmjit/core/environment.h
new file mode 100644
index 00000000000..84d45f6895d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/environment.h
@@ -0,0 +1,622 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
+#define ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+
+#if defined(__APPLE__)
+ #include <TargetConditionals.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Vendor.
+//!
+//! \note AsmJit doesn't use vendor information at the moment. It's provided for future use, if required.
+enum class Vendor : uint8_t {
+ //! Unknown or uninitialized platform vendor.
+ kUnknown = 0,
+
+ //! Maximum value of `Vendor`.
+ kMaxValue = kUnknown,
+
+ //! Platform vendor detected at compile-time.
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#else
+ kUnknown
+#endif
+};
+
+//! Platform - runtime environment or operating system.
+enum class Platform : uint8_t {
+ //! Unknown or uninitialized platform.
+ kUnknown = 0,
+
+ //! Windows OS.
+ kWindows,
+
+ //! Other platform that is not Windows, most likely POSIX based.
+ kOther,
+
+ //! Linux OS.
+ kLinux,
+ //! GNU/Hurd OS.
+ kHurd,
+
+ //! FreeBSD OS.
+ kFreeBSD,
+ //! OpenBSD OS.
+ kOpenBSD,
+ //! NetBSD OS.
+ kNetBSD,
+ //! DragonFly BSD OS.
+ kDragonFlyBSD,
+
+ //! Haiku OS.
+ kHaiku,
+
+ //! Apple OSX.
+ kOSX,
+ //! Apple iOS.
+ kIOS,
+ //! Apple TVOS.
+ kTVOS,
+ //! Apple WatchOS.
+ kWatchOS,
+
+ //! Emscripten platform.
+ kEmscripten,
+
+ //! Maximum value of `Platform`.
+ kMaxValue = kEmscripten,
+
+ //! Platform detected at compile-time (platform of the host).
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#elif defined(__EMSCRIPTEN__)
+ kEmscripten
+#elif defined(_WIN32)
+ kWindows
+#elif defined(__linux__)
+ kLinux
+#elif defined(__gnu_hurd__)
+ kHurd
+#elif defined(__FreeBSD__)
+ kFreeBSD
+#elif defined(__OpenBSD__)
+ kOpenBSD
+#elif defined(__NetBSD__)
+ kNetBSD
+#elif defined(__DragonFly__)
+ kDragonFlyBSD
+#elif defined(__HAIKU__)
+ kHaiku
+#elif defined(__APPLE__) && TARGET_OS_OSX
+ kOSX
+#elif defined(__APPLE__) && TARGET_OS_TV
+ kTVOS
+#elif defined(__APPLE__) && TARGET_OS_WATCH
+ kWatchOS
+#elif defined(__APPLE__) && TARGET_OS_IPHONE
+ kIOS
+#else
+ kOther
+#endif
+};
+
+//! Platform ABI (application binary interface).
+enum class PlatformABI : uint8_t {
+ //! Unknown or uninitialized environment.
+ kUnknown = 0,
+ //! Microsoft ABI.
+ kMSVC,
+ //! GNU ABI.
+ kGNU,
+ //! Android Environment / ABI.
+ kAndroid,
+ //! Cygwin ABI.
+ kCygwin,
+ //! Darwin ABI.
+ kDarwin,
+
+ //! Maximum value of `PlatformABI`.
+ kMaxValue,
+
+ //! Host ABI detected at compile-time.
+ kHost =
+#if defined(_DOXYGEN)
+ DETECTED_AT_COMPILE_TIME
+#elif defined(_MSC_VER)
+ kMSVC
+#elif defined(__CYGWIN__)
+ kCygwin
+#elif defined(__MINGW32__) || defined(__GLIBC__)
+ kGNU
+#elif defined(__ANDROID__)
+ kAndroid
+#elif defined(__APPLE__)
+ kDarwin
+#else
+ kUnknown
+#endif
+};
+
+//! Floating point ABI (ARM).
+enum class FloatABI : uint8_t {
+ kHardFloat = 0,
+ kSoftFloat,
+
+ kHost =
+#if ASMJIT_ARCH_ARM == 32 && defined(__SOFTFP__)
+ kSoftFloat
+#else
+ kHardFloat
+#endif
+};
+
+//! Object format.
+//!
+//! \note AsmJit doesn't really use anything except \ref ObjectFormat::kUnknown and \ref ObjectFormat::kJIT at
+//! the moment. Object file formats are provided for future extensibility and a possibility to generate object
+//! files at some point.
+enum class ObjectFormat : uint8_t {
+ //! Unknown or uninitialized object format.
+ kUnknown = 0,
+
+ //! JIT code generation object, most likely \ref JitRuntime or a custom
+ //! \ref Target implementation.
+ kJIT,
+
+ //! Executable and linkable format (ELF).
+ kELF,
+ //! Common object file format.
+ kCOFF,
+ //! Extended COFF object format.
+ kXCOFF,
+ //! Mach object file format.
+ kMachO,
+
+ //! Maximum value of `ObjectFormat`.
+ kMaxValue
+};
+
+//! Represents an environment, which is usually related to a \ref Target.
+//!
+//! Environment has usually an 'arch-subarch-vendor-os-abi' format, which is sometimes called "Triple" (historically
+//! it used to be 3 only parts) or "Tuple", which is a convention used by Debian Linux.
+//!
+//! AsmJit doesn't support all possible combinations or architectures and ABIs, however, it models the environment
+//! similarly to other compilers for future extensibility.
+class Environment {
+public:
+ //! \name Members
+ //! \{
+
+ //! Architecture.
+ Arch _arch = Arch::kUnknown;
+ //! Sub-architecture type.
+ SubArch _sub_arch = SubArch::kUnknown;
+ //! Vendor type.
+ Vendor _vendor = Vendor::kUnknown;
+ //! Platform.
+ Platform _platform = Platform::kUnknown;
+ //! Platform ABI.
+ PlatformABI _platform_abi = PlatformABI::kUnknown;
+ //! Object format.
+ ObjectFormat _object_format = ObjectFormat::kUnknown;
+ //! Floating point ABI.
+ FloatABI _float_abi = FloatABI::kHardFloat;
+ //! Reserved for future use, must be zero.
+ uint8_t _reserved = 0;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default initialized environment (all values either unknown or set to safe defaults).
+ ASMJIT_INLINE_CONSTEXPR Environment() noexcept = default;
+ //! Creates a copy of `other` instance.
+ ASMJIT_INLINE_CONSTEXPR Environment(const Environment& other) noexcept = default;
+
+ //! Creates \ref Environment initialized to `arch`, `sub_arch`, `vendor`, `platform`, `platform_abi`, `object_format`,
+ //! and `float_abi`.
+ ASMJIT_INLINE_CONSTEXPR explicit Environment(
+ Arch arch,
+ SubArch sub_arch = SubArch::kUnknown,
+ Vendor vendor = Vendor::kUnknown,
+ Platform platform = Platform::kUnknown,
+ PlatformABI platform_abi = PlatformABI::kUnknown,
+ ObjectFormat object_format = ObjectFormat::kUnknown,
+ FloatABI float_abi = FloatABI::kHardFloat) noexcept
+ : _arch(arch),
+ _sub_arch(sub_arch),
+ _vendor(vendor),
+ _platform(platform),
+ _platform_abi(platform_abi),
+ _object_format(object_format),
+ _float_abi(float_abi) {}
+
+ //! Returns the host environment constructed from preprocessor macros defined by the compiler.
+ //!
+ //! The returned environment should precisely match the target host architecture, sub-architecture, platform,
+ //! and ABI.
+ static ASMJIT_INLINE_CONSTEXPR Environment host() noexcept {
+ return Environment(Arch::kHost, SubArch::kHost, Vendor::kHost, Platform::kHost, PlatformABI::kHost, ObjectFormat::kUnknown, FloatABI::kHost);
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG Environment& operator=(const Environment& other) noexcept = default;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const Environment& other) const noexcept { return equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const Environment& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the environment is not set up.
+ //!
+ //! Returns true if all members are zero, and thus unknown.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept {
+ // Unfortunately compilers won't optimize fields are checked one by one...
+ return _packed() == 0;
+ }
+
+ //! Tests whether the environment is initialized, which means it must have
+ //! a valid architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_initialized() const noexcept {
+ return _arch != Arch::kUnknown;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t _packed() const noexcept {
+ uint64_t x;
+ memcpy(&x, this, 8);
+ return x;
+ }
+
+ //! Resets all members of the environment to zero / unknown.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Environment{}; }
+
+ //! Tests whether this environment is equal to `other`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool equals(const Environment& other) const noexcept { return _packed() == other._packed(); }
+
+ //! Returns the architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
+
+ //! Returns the sub-architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SubArch sub_arch() const noexcept { return _sub_arch; }
+
+ //! Returns vendor.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Vendor vendor() const noexcept { return _vendor; }
+
+ //! Returns target's platform or operating system.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Platform platform() const noexcept { return _platform; }
+
+ //! Returns target's ABI.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG PlatformABI platform_abi() const noexcept { return _platform_abi; }
+
+ //! Returns target's object format.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ObjectFormat object_format() const noexcept { return _object_format; }
+
+ //! Returns floating point ABI.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FloatABI float_abi() const noexcept { return _float_abi; }
+
+ //! Initializes \ref Environment to `arch`, `sub_arch`, `vendor`, `platform`, `platform_abi`, `object_format`,
+ //! and `float_abi`.
+ inline void init(
+ Arch arch,
+ SubArch sub_arch = SubArch::kUnknown,
+ Vendor vendor = Vendor::kUnknown,
+ Platform platform = Platform::kUnknown,
+ PlatformABI platform_abi = PlatformABI::kUnknown,
+ ObjectFormat object_format = ObjectFormat::kUnknown,
+ FloatABI float_abi = FloatABI::kHardFloat) noexcept {
+
+ _arch = arch;
+ _sub_arch = sub_arch;
+ _vendor = vendor;
+ _platform = platform;
+ _platform_abi = platform_abi;
+ _object_format = object_format;
+ _float_abi = float_abi;
+ _reserved = 0;
+ }
+
+ //! Tests whether this environment describes a 32-bit X86.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_x86() const noexcept { return _arch == Arch::kX86; }
+
+ //! Tests whether this environment describes a 64-bit X86.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_x64() const noexcept { return _arch == Arch::kX64; }
+
+ //! Tests whether this environment describes a 32-bit ARM.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_arm() const noexcept { return is_arch_arm(_arch); }
+
+ //! Tests whether this environment describes a 32-bit ARM in THUMB mode.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_thumb() const noexcept { return is_arch_thumb(_arch); }
+
+ //! Tests whether this environment describes a 64-bit X86.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_aarch64() const noexcept { return is_arch_aarch64(_arch); }
+
+ //! Tests whether this environment describes a 32-bit MIPS.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_mips32() const noexcept { return is_arch_mips32(_arch); }
+
+ //! Tests whether this environment describes a 64-bit MIPS.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_mips64() const noexcept { return is_arch_mips64(_arch); }
+
+ //! Tests whether this environment describes a 32-bit RISC-V.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_riscv32() const noexcept { return _arch == Arch::kRISCV32; }
+
+ //! Tests whether this environment describes a 64-bit RISC-V.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_arch_riscv64() const noexcept { return _arch == Arch::kRISCV64; }
+
+ //! Tests whether the architecture is 32-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_32bit() const noexcept { return is_32bit(_arch); }
+
+ //! Tests whether the architecture is 64-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_64bit() const noexcept { return is_64bit(_arch); }
+
+ //! Tests whether the architecture is little endian.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_little_endian() const noexcept { return is_little_endian(_arch); }
+
+ //! Tests whether the architecture is big endian.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_big_endian() const noexcept { return is_big_endian(_arch); }
+
+ //! Tests whether this architecture is of X86 family.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_family_x86() const noexcept { return is_family_x86(_arch); }
+
+ //! Tests whether this architecture family is ARM, THUMB, or AArch64.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_family_arm() const noexcept { return is_family_arm(_arch); }
+
+ //! Tests whether this architecture family is AArch32 (ARM or THUMB).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_family_aarch32() const noexcept { return is_family_aarch32(_arch); }
+
+ //! Tests whether this architecture family is AArch64.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_family_aarch64() const noexcept { return is_family_aarch64(_arch); }
+
+ //! Tests whether this architecture family is MISP or MIPS64.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_family_mips() const noexcept { return is_family_mips(_arch); }
+
+ //! Tests whether this architecture family is RISC-V (both 32-bit and 64-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_family_riscv() const noexcept { return is_family_riscv(_arch); }
+
+ //! Tests whether the environment platform is Windows.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_platform_windows() const noexcept { return _platform == Platform::kWindows; }
+
+ //! Tests whether the environment platform is Linux.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_platform_linux() const noexcept { return _platform == Platform::kLinux; }
+
+ //! Tests whether the environment platform is Hurd.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_platform_hurd() const noexcept { return _platform == Platform::kHurd; }
+
+ //! Tests whether the environment platform is Haiku.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_platform_haiku() const noexcept { return _platform == Platform::kHaiku; }
+
+ //! Tests whether the environment platform is any BSD.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_platform_bsd() const noexcept {
+ return _platform == Platform::kFreeBSD ||
+ _platform == Platform::kOpenBSD ||
+ _platform == Platform::kNetBSD ||
+ _platform == Platform::kDragonFlyBSD;
+ }
+
+ //! Tests whether the environment platform is any Apple platform (OSX, iOS, TVOS, WatchOS).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_platform_apple() const noexcept {
+ return _platform == Platform::kOSX ||
+ _platform == Platform::kIOS ||
+ _platform == Platform::kTVOS ||
+ _platform == Platform::kWatchOS;
+ }
+
+ //! Tests whether the ABI is MSVC.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_msvc_abi() const noexcept { return _platform_abi == PlatformABI::kMSVC; }
+
+ //! Tests whether the ABI is GNU.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_gnu_abi() const noexcept { return _platform_abi == PlatformABI::kGNU; }
+
+ //! Tests whether the ABI is GNU.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_darwin_abi() const noexcept { return _platform_abi == PlatformABI::kDarwin; }
+
+ //! Returns a calculated stack alignment for this environment.
+ [[nodiscard]]
+ ASMJIT_API uint32_t stack_alignment() const noexcept;
+
+ //! Returns a native register size of this architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t register_size() const noexcept { return reg_size_of_arch(_arch); }
+
+ //! Sets the architecture to `arch`.
+ ASMJIT_INLINE_NODEBUG void set_arch(Arch arch) noexcept { _arch = arch; }
+ //! Sets the sub-architecture to `sub_arch`.
+ ASMJIT_INLINE_NODEBUG void set_sub_arch(SubArch sub_arch) noexcept { _sub_arch = sub_arch; }
+ //! Sets the vendor to `vendor`.
+ ASMJIT_INLINE_NODEBUG void set_vendor(Vendor vendor) noexcept { _vendor = vendor; }
+ //! Sets the platform to `platform`.
+ ASMJIT_INLINE_NODEBUG void set_platform(Platform platform) noexcept { _platform = platform; }
+ //! Sets the ABI to `platform_abi`.
+ ASMJIT_INLINE_NODEBUG void set_platform_abi(PlatformABI platform_abi) noexcept { _platform_abi = platform_abi; }
+ //! Sets the object format to `object_format`.
+ ASMJIT_INLINE_NODEBUG void set_object_format(ObjectFormat object_format) noexcept { _object_format = object_format; }
+
+ //! Sets floating point ABI to `float_abi`.
+ ASMJIT_INLINE_NODEBUG void set_float_abi(FloatABI float_abi) noexcept { _float_abi = float_abi; }
+
+ //! \}
+
+ //! \name Static Utilities
+ //! \{
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_defined_arch(Arch arch) noexcept {
+ return uint32_t(arch) <= uint32_t(Arch::kMaxValue);
+ }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_valid_arch(Arch arch) noexcept {
+ return arch != Arch::kUnknown && uint32_t(arch) <= uint32_t(Arch::kMaxValue);
+ }
+
+ //! Tests whether the given architecture `arch` is 32-bit.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_32bit(Arch arch) noexcept {
+ return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == uint32_t(Arch::k32BitMask);
+ }
+
+ //! Tests whether the given architecture `arch` is 64-bit.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_64bit(Arch arch) noexcept {
+ return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == 0;
+ }
+
+ //! Tests whether the given architecture `arch` is little endian.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_little_endian(Arch arch) noexcept {
+ return uint32_t(arch) < uint32_t(Arch::kBigEndian);
+ }
+
+ //! Tests whether the given architecture `arch` is big endian.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_big_endian(Arch arch) noexcept {
+ return uint32_t(arch) >= uint32_t(Arch::kBigEndian);
+ }
+
+ //! Tests whether the given architecture is Thumb or Thumb_BE.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_arch_thumb(Arch arch) noexcept {
+ return arch == Arch::kThumb || arch == Arch::kThumb_BE;
+ }
+
+ //! Tests whether the given architecture is ARM or ARM_BE.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_arch_arm(Arch arch) noexcept {
+ return arch == Arch::kARM || arch == Arch::kARM_BE;
+ }
+
+ //! Tests whether the given architecture is AArch64 or AArch64_BE.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_arch_aarch64(Arch arch) noexcept {
+ return arch == Arch::kAArch64 || arch == Arch::kAArch64_BE;
+ }
+
+ //! Tests whether the given architecture is MIPS32_LE or MIPS32_BE.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_arch_mips32(Arch arch) noexcept {
+ return arch == Arch::kMIPS32_LE || arch == Arch::kMIPS32_BE;
+ }
+
+ //! Tests whether the given architecture is MIPS64_LE or MIPS64_BE.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_arch_mips64(Arch arch) noexcept {
+ return arch == Arch::kMIPS64_LE || arch == Arch::kMIPS64_BE;
+ }
+
+ //! Tests whether the given architecture family is X86 or X64.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_family_x86(Arch arch) noexcept {
+ return arch == Arch::kX86 || arch == Arch::kX64;
+ }
+
+ //! Tests whether the given architecture family is AArch32 (ARM or THUMB).
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_family_aarch32(Arch arch) noexcept {
+ return is_arch_arm(arch) || is_arch_thumb(arch);
+ }
+
+ //! Tests whether the given architecture family is AArch64.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_family_aarch64(Arch arch) noexcept {
+ return is_arch_aarch64(arch);
+ }
+
+ //! Tests whether the given architecture family is ARM, THUMB, or AArch64.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_family_arm(Arch arch) noexcept {
+ return is_family_aarch32(arch) || is_family_aarch64(arch);
+ }
+
+ //! Tests whether the given architecture family is MIPS or MIPS64.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_family_mips(Arch arch) noexcept {
+ return is_arch_mips32(arch) || is_arch_mips64(arch);
+ }
+
+ //! Tests whether the given architecture family is RISC-V (both 32-bit and 64-bit).
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_family_riscv(Arch arch) noexcept {
+ return arch == Arch::kRISCV32 || arch == Arch::kRISCV64;
+ }
+
+ //! Returns a native general purpose register size from the given architecture.
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG uint32_t reg_size_of_arch(Arch arch) noexcept {
+ return is_32bit(arch) ? 4u : 8u;
+ }
+
+ //! \}
+};
+
+static_assert(sizeof(Environment) == 8,
+ "Environment must occupy exactly 8 bytes.");
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/errorhandler.cpp b/3rdparty/asmjit/asmjit/core/errorhandler.cpp
new file mode 100644
index 00000000000..1034212a035
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/errorhandler.cpp
@@ -0,0 +1,19 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/errorhandler.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+ErrorHandler::ErrorHandler() noexcept {}
+ErrorHandler::~ErrorHandler() noexcept {}
+
+void ErrorHandler::handle_error(Error err, const char* message, BaseEmitter* origin) {
+ Support::maybe_unused(err, message, origin);
+}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/errorhandler.h b/3rdparty/asmjit/asmjit/core/errorhandler.h
index a1a2dd2d5db..085aa322b1e 100644
--- a/3rdparty/asmjit/src/asmjit/core/errorhandler.h
+++ b/3rdparty/asmjit/asmjit/core/errorhandler.h
@@ -1,12 +1,12 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_ERRORHANDLER_H_INCLUDED
#define ASMJIT_CORE_ERRORHANDLER_H_INCLUDED
-#include "../core/globals.h"
+#include <asmjit/core/globals.h>
ASMJIT_BEGIN_NAMESPACE
@@ -17,7 +17,7 @@ class BaseEmitter;
//! Error handler can be used to override the default behavior of error handling.
//!
-//! It's available to all classes that inherit `BaseEmitter`. Override \ref ErrorHandler::handleError() to implement
+//! It's available to all classes that inherit `BaseEmitter`. Override \ref ErrorHandler::handle_error() to implement
//! your own error handler.
//!
//! The following use-cases are supported:
@@ -27,11 +27,11 @@ class BaseEmitter;
//! - Throw an exception. AsmJit doesn't use exceptions and is completely exception-safe, but it's perfectly legal
//! to throw an exception from the error handler.
//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler, Builder and Compiler to
-//! a consistent state before calling \ref handleError(), so `longjmp()` can be used without issues to cancel the
+//! a consistent state before calling \ref handle_error(), so `longjmp()` can be used without issues to cancel the
//! code generation if an error occurred. This method can be used if exception handling in your project is turned
-//! off and you still want some comfort. In most cases it should be safe as AsmJit uses \ref Zone memory and the
-//! ownership of memory it allocates always ends with the instance that allocated it. If using this approach please
-//! never jump outside the life-time of \ref CodeHolder and \ref BaseEmitter.
+//! off and you still want some comfort. In most cases it should be safe as AsmJit uses \ref Arena allocator and
+//! the ownership of allocated memory it allocates always ends with the instance that allocated it. If using this
+//! approach please never jump outside the life-time of \ref CodeHolder and \ref BaseEmitter.
//!
//! \ref ErrorHandler can be attached to \ref CodeHolder or \ref BaseEmitter, which has a priority. The example below
//! uses error handler that just prints the error, but lets AsmJit continue:
@@ -48,9 +48,9 @@ class BaseEmitter;
//! public:
//! Error err;
//!
-//! inline SimpleErrorHandler() : err(kErrorOk) {}
+//! inline SimpleErrorHandler() : err(Error::kOk) {}
//!
-//! void handleError(Error err, const char* message, BaseEmitter* origin) override {
+//! void handle_error(Error err, const char* message, BaseEmitter* origin) override {
//! this->err = err;
//! fprintf(stderr, "ERROR: %s\n", message);
//! }
@@ -61,8 +61,8 @@ class BaseEmitter;
//! SimpleErrorHandler eh;
//!
//! CodeHolder code;
-//! code.init(rt.environment(), rt.cpuFeatures());
-//! code.setErrorHandler(&eh);
+//! code.init(rt.environment(), rt.cpu_features());
+//! code.set_error_handler(&eh);
//!
//! // Try to emit instruction that doesn't exist.
//! x86::Assembler a(&code);
@@ -107,7 +107,7 @@ class BaseEmitter;
//! class ThrowableErrorHandler : public ErrorHandler {
//! public:
//! // Throw is possible, functions that use ErrorHandler are never 'noexcept'.
-//! void handleError(Error err, const char* message, BaseEmitter* origin) override {
+//! void handle_error(Error err, const char* message, BaseEmitter* origin) override {
//! throw AsmJitException(err, message);
//! }
//! };
@@ -117,8 +117,8 @@ class BaseEmitter;
//! ThrowableErrorHandler eh;
//!
//! CodeHolder code;
-//! code.init(rt.environment(), rt.cpuFeatures());
-//! code.setErrorHandler(&eh);
+//! code.init(rt.environment(), rt.cpu_features());
+//! code.set_error_handler(&eh);
//!
//! x86::Assembler a(&code);
//!
@@ -148,9 +148,9 @@ class BaseEmitter;
//!
//! class LongJmpErrorHandler : public asmjit::ErrorHandler {
//! public:
-//! inline LongJmpErrorHandler() : err(asmjit::kErrorOk) {}
+//! inline LongJmpErrorHandler() : err(asmjit::Error::kOk) {}
//!
-//! void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) override {
+//! void handle_error(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) override {
//! this->err = err;
//! longjmp(state, 1);
//! }
@@ -166,8 +166,8 @@ class BaseEmitter;
//! LongJmpErrorHandler eh;
//!
//! CodeHolder code;
-//! code.init(rt.environment(), rt.cpuFeatures());
-//! code.setErrorHandler(&eh);
+//! code.init(rt.environment(), rt.cpu_features());
+//! code.set_error_handler(&eh);
//!
//! x86::Assembler a(&code);
//!
@@ -177,7 +177,7 @@ class BaseEmitter;
//! }
//! else {
//! Error err = eh.err;
-//! printf("ASMJIT ERROR: 0x%08X [%s]\n", err, DebugUtils::errorAsString(err));
+//! printf("ASMJIT ERROR: 0x%08X [%s]\n", err, DebugUtils::error_as_string(err));
//! }
//!
//! return 0;
@@ -212,10 +212,10 @@ public:
//! exception from your error handler if this way is the preferred way of handling errors in your project.
//!
//! 3. Using plain old C's `setjmp()` and `longjmp()`. Asmjit always puts `BaseEmitter` to a consistent state before
- //! calling `handleError()` so `longjmp()` can be used without any issues to cancel the code generation if an
+ //! calling `handle_error()` so `longjmp()` can be used without any issues to cancel the code generation if an
//! error occurred. There is no difference between exceptions and `longjmp()` from AsmJit's perspective, however,
//! never jump outside of `CodeHolder` and `BaseEmitter` scope as you would leak memory.
- ASMJIT_API virtual void handleError(Error err, const char* message, BaseEmitter* origin);
+ ASMJIT_API virtual void handle_error(Error err, const char* message, BaseEmitter* origin);
//! \}
};
diff --git a/3rdparty/asmjit/asmjit/core/fixup.h b/3rdparty/asmjit/asmjit/core/fixup.h
new file mode 100644
index 00000000000..5533f2a9d91
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/fixup.h
@@ -0,0 +1,282 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FIXUP_H_INCLUDED
+#define ASMJIT_CORE_FIXUP_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Offset format type, used by \ref OffsetFormat.
+enum class OffsetType : uint8_t {
+ // Common Offset Formats
+ // ---------------------
+
+ //! A value having `_imm_bit_count` bits and shifted by `_imm_bit_shift`.
+ //!
+ //! This offset type is sufficient for many targets that store offset as a continuous set bits within an
+ //! instruction word / sequence of bytes.
+ kSignedOffset,
+
+ //! An unsigned value having `_imm_bit_count` bits and shifted by `_imm_bit_shift`.
+ kUnsignedOffset,
+
+ // AArch64 Specific Offset Formats
+ // -------------------------------
+
+ //! AArch64 ADR format of `[.|immlo:2|.....|immhi:19|.....]`.
+ kAArch64_ADR,
+
+ //! AArch64 ADRP format of `[.|immlo:2|.....|immhi:19|.....]` (4kB pages).
+ kAArch64_ADRP,
+
+ // AArch32 Specific Offset Formats (T16 & T32)
+ // -------------------------------------------
+
+ //! AArch32 THUMBv2 immediate encoding of 'ADR' instruction (12-bit payload and sign bit):
+ //!
+ //! `|.....|imm:1|..N.N|......|imm:3|....|imm:8|`
+ //!
+ //! Where `N` is one if the offset is negative. The immediate is encoded as absolute value of the offset if negative.
+ kThumb32_ADR,
+
+ //! AArch32 THUMBv2 immediate encoding of 'BLX' instruction (23-bit immediate payload, multiplied by 4):
+ //!
+ //! `|.....|imm[22]|imm[19:10]|..|ja|1|jb|imm[9:0]|0`
+ //!
+ //! Where:
+ //!
+ //! - `ja` is calculated as imm[22] ^ imm[21] ^ 1.
+ //! - `jb` is calculated as imm[22] ^ imm[20] ^ 1.
+ kThumb32_BLX,
+
+ //! AArch32 THUMBv2 immediate encoding of 'B' instruction without `<cond>` (24-bit immediate payload, multiplied by 2):
+ //!
+ //! `|.....|imm[23]|imm[20:11]|..|ja|1|jb|imm[10:0]`
+ //!
+ //! Where:
+ //!
+ //! - `ja` is calculated as imm[23] ^ imm[22] ^ 1.
+ //! - `jb` is calculated as imm[23] ^ imm[21] ^ 1.
+ kThumb32_B,
+
+ //! AArch32 THUMBv2 immediate encoding of 'B' instruction with `<cond>` (20-bit immediate payload, multiplied by 2).
+ //!
+ //! `|.....|imm[19]|....|imm[16:11]|..|ja|1|jb|imm[10:0]`
+ //!
+ //! Where:
+ //!
+ //! - `ja` is calculated as imm[19] ^ imm[18] ^ 1.
+ //! - `jb` is calculated as imm[19] ^ imm[17] ^ 1.
+ kThumb32_BCond,
+
+ // AArch32 Specific Offset Formats (A32)
+ // -------------------------------------
+
+ //! AArch32 ADR instruction, which uses a standard 12-bit immediate encoding that is used by other ARM instructions.
+ kAArch32_ADR,
+
+ //! AArch32 signed offset that is similar to `kSignedOffset`, however it uses absolute value of the offset and its
+ //! sign is encoded in 23rd bit of the opcode.
+ //!
+ //! `|........|U.......|........|........|`
+ //!
+ kAArch32_U23_SignedOffset,
+
+ //! AArch32 offset format that encodes 8-bit offset as:
+ //!
+ //! `|........|U.......|....|imm[7:4]|....|imm[3:0]|`
+ //!
+ //! in a 32-bit word, where U is a sign of the displacement and the displacement itself is encoded as its absolute
+ //! value.
+ kAArch32_U23_0To3At0_4To7At8,
+
+ //! AArch32 offset format that encodes a signed 25-bit offset as:
+ //!
+ //! `|.......|imm[0]|imm[24:1]|`
+ //!
+ //! in a 32-bit word.
+ kAArch32_1To24At0_0At24,
+
+ //! Maximum value of `OffsetFormatType`.
+ kMaxValue = kAArch32_1To24At0_0At24
+};
+
+//! Provides information about formatting offsets, absolute addresses, or their parts. Offset format is used by both
+//! \ref RelocEntry and \ref Fixup. The illustration below describes the relation of region size and offset size.
+//! Region size is the size of the whole unit whereas offset size is the size of the unit that will be patched.
+//!
+//! ```
+//! +-> Code buffer | The subject of the relocation (region) |
+//! | | (Word-Offset) (Word-Size) |
+//! |xxxxxxxxxxxxxxx|................|*PATCHED*|................|xxxxxxxxxxxx->
+//! | |
+//! [Word Offset points here]----+ +--- [WordOffset + WordSize]
+//! ```
+//!
+//! Once the offset word has been located it can be patched like this:
+//!
+//! ```
+//! |ImmDiscardLSB (discard LSB bits).
+//! |..
+//! [0000000000000iiiiiiiiiiiiiiiiiDD] - Offset value (32-bit)
+//! [000000000000000iiiiiiiiiiiiiiiii] - Offset value after discard LSB.
+//! [00000000000iiiiiiiiiiiiiiiii0000] - Offset value shifted by ImmBitShift.
+//! [xxxxxxxxxxxiiiiiiiiiiiiiiiiixxxx] - Patched word (32-bit)
+//! |...............|
+//! (ImmBitCount) +- ImmBitShift
+//! ```
+struct OffsetFormat {
+ //! \name Members
+ //! \{
+
+ //! Type of the offset.
+ OffsetType _type;
+ //! Encoding flags.
+ uint8_t _flags;
+ //! Size of the region (in bytes) containing the offset value, if the offset value is part of an instruction,
+ //! otherwise it would be the same as `_value_size`.
+ uint8_t _region_size;
+ //! Size of the offset value, in bytes (1, 2, 4, or 8).
+ uint8_t _value_size;
+ //! Offset of the offset value, in bytes, relative to the start of the region or data. Value offset would be
+ //! zero if both region size and value size are equal.
+ uint8_t _value_offset;
+ //! Size of the offset immediate value in bits.
+ uint8_t _imm_bit_count;
+ //! Shift of the offset immediate value in bits in the target word.
+ uint8_t _imm_bit_shift;
+ //! Number of least significant bits to discard before writing the immediate to the destination. All discarded
+ //! bits must be zero otherwise the value is invalid.
+ uint8_t _imm_discard_lsb;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the type of the offset.
+ ASMJIT_INLINE_NODEBUG OffsetType type() const noexcept { return _type; }
+
+ //! Returns whether the offset is encoded as an absolute value of the offset with additional field(s) that represent
+ //! the sign (AArch32 U/N fields in the opcode).
+ //!
+ //! If true, the offset itself is always positive and a separate U/N field is used to indicate the sign of the offset
+ //! (usually `U==1` means ADD, but sometimes `N==1` means negative offset, which implies SUB).
+ ASMJIT_INLINE_NODEBUG bool has_sign_bit() const noexcept {
+ return _type == OffsetType::kThumb32_ADR ||
+ _type == OffsetType::kAArch32_ADR ||
+ _type == OffsetType::kAArch32_U23_SignedOffset ||
+ _type == OffsetType::kAArch32_U23_0To3At0_4To7At8;
+ }
+
+ //! Returns flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t flags() const noexcept { return _flags; }
+
+ //! Returns the size of the region/instruction where the offset is encoded.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t region_size() const noexcept { return _region_size; }
+
+ //! Returns the offset of the word relative to the start of the region where the offset is.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t value_offset() const noexcept { return _value_offset; }
+
+ //! Returns the size of the data-type (word) that contains the offset, in bytes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t value_size() const noexcept { return _value_size; }
+
+ //! Returns the count of bits of the offset value in the data it's stored in.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t imm_bit_count() const noexcept { return _imm_bit_count; }
+
+ //! Returns the bit-shift of the offset value in the data it's stored in.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t imm_bit_shift() const noexcept { return _imm_bit_shift; }
+
+ //! Returns the number of least significant bits of the offset value, that must be zero and that are not part of
+ //! the encoded data.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t imm_discard_lsb() const noexcept { return _imm_discard_lsb; }
+
+ //! Resets this offset format to a simple data value of `data_size` bytes.
+ //!
+ //! The region will be the same size as data and immediate bits would correspond to `data_size * 8`. There will be
+ //! no immediate bit shift or discarded bits.
+ inline void reset_to_simple_value(OffsetType type, size_t value_size) noexcept {
+ ASMJIT_ASSERT(value_size <= 8u);
+
+ _type = type;
+ _flags = uint8_t(0);
+ _region_size = uint8_t(value_size);
+ _value_size = uint8_t(value_size);
+ _value_offset = uint8_t(0);
+ _imm_bit_count = uint8_t(value_size * 8u);
+ _imm_bit_shift = uint8_t(0);
+ _imm_discard_lsb = uint8_t(0);
+ }
+
+ inline void reset_to_imm_value(OffsetType type, size_t value_size, uint32_t imm_bit_shift, uint32_t imm_bit_count, uint32_t imm_discard_lsb) noexcept {
+ ASMJIT_ASSERT(value_size <= 8u);
+ ASMJIT_ASSERT(imm_bit_shift < value_size * 8u);
+ ASMJIT_ASSERT(imm_bit_count <= 64u);
+ ASMJIT_ASSERT(imm_discard_lsb <= 64u);
+
+ _type = type;
+ _flags = uint8_t(0);
+ _region_size = uint8_t(value_size);
+ _value_size = uint8_t(value_size);
+ _value_offset = uint8_t(0);
+ _imm_bit_count = uint8_t(imm_bit_count);
+ _imm_bit_shift = uint8_t(imm_bit_shift);
+ _imm_discard_lsb = uint8_t(imm_discard_lsb);
+ }
+
+ inline void set_region(size_t region_size, size_t value_offset) noexcept {
+ _region_size = uint8_t(region_size);
+ _value_offset = uint8_t(value_offset);
+ }
+
+ inline void set_leading_and_trailing_size(size_t leading_size, size_t trailing_size) noexcept {
+ _region_size = uint8_t(leading_size + trailing_size + _value_size);
+ _value_offset = uint8_t(leading_size);
+ }
+
+ //! \}
+};
+
+//! Data structure used to mark where a fixup in code or data is necessary.
+//!
+//! Fixups are generally resolved during machine code generation. For example if a branch instruction is used to
+//! jump to a label, which hasn't been bound yet, a fixup is created. However, when such label is bound, the fixup
+//! is processed and removed from a list of fixups.
+struct Fixup {
+ //! Next fixup in a single-linked list.
+ Fixup* next;
+ //! Section where the fixup comes from.
+ uint32_t section_id;
+ //! Label id, relocation id, or \ref Globals::kInvalidId.
+ //!
+ //! \note Fixup that is used with a LabelEntry always uses relocation id here, however, when a fixup is turned
+ //! into unresolved and generally detached from LabelEntry, this field becomes a label identifier as unresolved
+ //! fixups won't reference a relocation. This is just a space optimization.
+ uint32_t label_or_reloc_id;
+ //! Label offset relative to the start of the section where the unresolved link comes from.
+ size_t offset;
+ //! Inlined rel8/rel32.
+ intptr_t rel;
+ //! Offset format information.
+ OffsetFormat format;
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FIXUP_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/formatter.cpp b/3rdparty/asmjit/asmjit/core/formatter.cpp
new file mode 100644
index 00000000000..8ad10a20de0
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/formatter.cpp
@@ -0,0 +1,628 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_LOGGING
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/builder.h>
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/emitter.h>
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86/x86formatter_p.h>
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/arm/a64formatter_p.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+#if defined(ASMJIT_NO_COMPILER)
+class VirtReg;
+#endif
+
+namespace Formatter {
+
+Error format_virt_reg_name(String& sb, const VirtReg* virt_reg) noexcept {
+ if (virt_reg->name_size()) {
+ return sb.append(virt_reg->name(), virt_reg->name_size());
+ }
+ else {
+ return sb.append_format("%%%u", unsigned(Operand::virt_id_to_index(virt_reg->id())));
+ }
+}
+
+Error format_virt_reg_name_with_prefix(String& sb, const char* prefix, size_t prefix_size, const VirtReg* v_reg) noexcept {
+ ASMJIT_PROPAGATE(sb.append(prefix, prefix_size));
+
+ if (v_reg->name_size()) {
+ return sb.append(v_reg->name(), v_reg->name_size());
+ }
+ else {
+ return sb.append_format("%%%u", unsigned(Operand::virt_id_to_index(v_reg->id())));
+ }
+}
+
+static const char word_name_table[][8] = {
+ "db",
+ "dw",
+ "dd",
+ "dq",
+ "byte",
+ "half",
+ "word",
+ "hword",
+ "dword",
+ "qword",
+ "xword",
+ "short",
+ "long",
+ "quad"
+};
+
+
+Error format_type_id(String& sb, TypeId type_id) noexcept {
+ if (type_id == TypeId::kVoid) {
+ return sb.append("void");
+ }
+
+ if (!TypeUtils::is_valid(type_id)) {
+ return sb.append("unknown");
+ }
+
+ const char* type_name = nullptr;
+ uint32_t type_size = TypeUtils::size_of(type_id);
+ TypeId scalar_type = TypeUtils::scalar_of(type_id);
+
+ switch (scalar_type) {
+ case TypeId::kIntPtr : type_name = "intptr" ; break;
+ case TypeId::kUIntPtr: type_name = "uintptr"; break;
+ case TypeId::kInt8 : type_name = "int8" ; break;
+ case TypeId::kUInt8 : type_name = "uint8" ; break;
+ case TypeId::kInt16 : type_name = "int16" ; break;
+ case TypeId::kUInt16 : type_name = "uint16" ; break;
+ case TypeId::kInt32 : type_name = "int32" ; break;
+ case TypeId::kUInt32 : type_name = "uint32" ; break;
+ case TypeId::kInt64 : type_name = "int64" ; break;
+ case TypeId::kUInt64 : type_name = "uint64" ; break;
+ case TypeId::kFloat32: type_name = "float32"; break;
+ case TypeId::kFloat64: type_name = "float64"; break;
+ case TypeId::kFloat80: type_name = "float80"; break;
+ case TypeId::kMask8 : type_name = "mask8" ; break;
+ case TypeId::kMask16 : type_name = "mask16" ; break;
+ case TypeId::kMask32 : type_name = "mask32" ; break;
+ case TypeId::kMask64 : type_name = "mask64" ; break;
+ case TypeId::kMmx32 : type_name = "mmx32" ; break;
+ case TypeId::kMmx64 : type_name = "mmx64" ; break;
+
+ default:
+ type_name = "unknown";
+ break;
+ }
+
+ uint32_t base_size = TypeUtils::size_of(scalar_type);
+ if (type_size > base_size) {
+ uint32_t count = type_size / base_size;
+ return sb.append_format("%sx%u", type_name, unsigned(count));
+ }
+ else {
+ return sb.append(type_name);
+ }
+}
+
+Error format_feature(String& sb, Arch arch, uint32_t feature_id) noexcept {
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::FormatterInternal::format_feature(sb, feature_id);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_arm(arch)) {
+ return arm::FormatterInternal::format_feature(sb, feature_id);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+
+Error format_label(String& sb, FormatFlags format_flags, const BaseEmitter* emitter, uint32_t label_id) noexcept {
+ Support::maybe_unused(format_flags);
+
+ if (emitter && emitter->code()) {
+ CodeHolder* code = emitter->code();
+ if (ASMJIT_UNLIKELY(!code->is_label_valid(label_id))) {
+ return sb.append_format("<InvalidLabel:%u>", label_id);
+ }
+
+ const LabelEntry& le = code->label_entry_of(label_id);
+ if (le.has_name()) {
+ if (le.has_parent()) {
+ uint32_t parent_id = le.parent_id();
+ const LabelEntry& pe = code->label_entry_of(parent_id);
+
+ if (pe.has_name()) {
+ ASMJIT_PROPAGATE(sb.append(pe.name()));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append_format("L%u", parent_id));
+ }
+
+ ASMJIT_PROPAGATE(sb.append('.'));
+ }
+
+ if (le.label_type() == LabelType::kAnonymous) {
+ ASMJIT_PROPAGATE(sb.append_format("L%u@", label_id));
+ }
+ return sb.append(le.name());
+ }
+ }
+
+ return sb.append_format("L%u", label_id);
+}
+
+Error format_register(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_id) noexcept {
+
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::FormatterInternal::format_register(sb, format_flags, emitter, arch, reg_type, reg_id);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_arm(arch)) {
+ return arm::FormatterInternal::format_register(sb, format_flags, emitter, arch, reg_type, reg_id);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+
+Error format_operand(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept {
+
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::FormatterInternal::format_operand(sb, format_flags, emitter, arch, op);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_arm(arch)) {
+ return arm::FormatterInternal::format_operand(sb, format_flags, emitter, arch, op);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+
+ASMJIT_API Error format_data_type(
+ String& sb,
+ FormatFlags format_flags,
+ Arch arch,
+ TypeId type_id) noexcept
+{
+ Support::maybe_unused(format_flags);
+
+ if (ASMJIT_UNLIKELY(uint32_t(arch) > uint32_t(Arch::kMaxValue))) {
+ return make_error(Error::kInvalidArch);
+ }
+
+ uint32_t type_size = TypeUtils::size_of(type_id);
+ if (type_size == 0 || type_size > 8) {
+ return make_error(Error::kInvalidState);
+ }
+
+ uint32_t type_size_log2 = Support::ctz(type_size);
+ return sb.append(word_name_table[size_t(ArchTraits::by_arch(arch).type_name_id_by_index(type_size_log2))]);
+}
+
+static Error format_data_helper(String& sb, const char* type_name, uint32_t type_size, const uint8_t* data, size_t item_count) noexcept {
+ sb.append('.');
+ sb.append(type_name);
+ sb.append(' ');
+
+ for (size_t i = 0; i < item_count; i++) {
+ uint64_t v = 0;
+
+ if (i != 0) {
+ ASMJIT_PROPAGATE(sb.append(", ", 2));
+ }
+
+ switch (type_size) {
+ case 1: v = data[0]; break;
+ case 2: v = Support::loadu_u16(data); break;
+ case 4: v = Support::loadu_u32(data); break;
+ case 8: v = Support::loadu_u64(data); break;
+ }
+
+ ASMJIT_PROPAGATE(sb.append_uint(v, 16, type_size * 2, StringFormatFlags::kAlternate));
+ data += type_size;
+ }
+
+ return Error::kOk;
+}
+
+Error format_data(
+ String& sb,
+ FormatFlags format_flags,
+ Arch arch,
+ TypeId type_id, const void* data, size_t item_count, size_t repeat_count
+) noexcept {
+ Support::maybe_unused(format_flags);
+
+ if (ASMJIT_UNLIKELY(!Environment::is_defined_arch(arch))) {
+ return make_error(Error::kInvalidArch);
+ }
+
+ uint32_t type_size = TypeUtils::size_of(type_id);
+ if (type_size == 0) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (!Support::is_power_of_2(type_size)) {
+ item_count *= type_size;
+ type_size = 1;
+ }
+
+ while (type_size > 8u) {
+ type_size >>= 1;
+ item_count <<= 1;
+ }
+
+ uint32_t type_size_log2 = Support::ctz(type_size);
+ const char* word_name = word_name_table[size_t(ArchTraits::by_arch(arch).type_name_id_by_index(type_size_log2))];
+
+ if (repeat_count > 1) {
+ ASMJIT_PROPAGATE(sb.append_format(".repeat %zu ", repeat_count));
+ }
+
+ return format_data_helper(sb, word_name, type_size, static_cast<const uint8_t*>(data), item_count);
+}
+
+Error format_instruction(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept {
+
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::FormatterInternal::format_instruction(sb, format_flags, emitter, arch, inst, operands);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_aarch64(arch)) {
+ return a64::FormatterInternal::format_instruction(sb, format_flags, emitter, arch, inst, operands);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+
+#ifndef ASMJIT_NO_BUILDER
+
+#ifndef ASMJIT_NO_COMPILER
+static Error format_func_value(String& sb, FormatFlags format_flags, const BaseEmitter* emitter, FuncValue value) noexcept {
+ TypeId type_id = value.type_id();
+ ASMJIT_PROPAGATE(format_type_id(sb, type_id));
+
+ if (value.is_assigned()) {
+ ASMJIT_PROPAGATE(sb.append('@'));
+
+ if (value.is_indirect()) {
+ ASMJIT_PROPAGATE(sb.append('['));
+ }
+
+ // NOTE: It should be either reg or stack, but never both. We
+ // use two IFs on purpose so if the FuncValue is both it would
+ // show in logs.
+ if (value.is_reg()) {
+ ASMJIT_PROPAGATE(format_register(sb, format_flags, emitter, emitter->arch(), value.reg_type(), value.reg_id()));
+ }
+
+ if (value.is_stack()) {
+ ASMJIT_PROPAGATE(sb.append_format("[%d]", int(value.stack_offset())));
+ }
+
+ if (value.is_indirect()) {
+ ASMJIT_PROPAGATE(sb.append(']'));
+ }
+ }
+
+ return Error::kOk;
+}
+
+static Error format_func_value_pack(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseCompiler* cc,
+ const FuncValuePack& pack,
+ const RegOnly* virt_regs) noexcept {
+
+ size_t count = pack.count();
+ if (!count) {
+ return sb.append("void");
+ }
+
+ if (count > 1) {
+ ASMJIT_PROPAGATE(sb.append('['));
+ }
+
+ for (uint32_t value_index = 0; value_index < count; value_index++) {
+ const FuncValue& value = pack[value_index];
+ if (!value) {
+ break;
+ }
+
+ if (value_index) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+ }
+
+ ASMJIT_PROPAGATE(format_func_value(sb, format_flags, cc, value));
+
+ if (virt_regs) {
+ const VirtReg* virt_reg = nullptr;
+ static const char null_reg[] = "<none>";
+
+ if (virt_regs[value_index].is_reg() && cc->is_virt_id_valid(virt_regs[value_index].id())) {
+ virt_reg = cc->virt_reg_by_id(virt_regs[value_index].id());
+ }
+
+ ASMJIT_PROPAGATE(sb.append(' '));
+
+ if (virt_reg) {
+ ASMJIT_PROPAGATE(Formatter::format_virt_reg_name(sb, virt_reg));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append(null_reg, sizeof(null_reg) - 1));
+ }
+ }
+ }
+
+ if (count > 1) {
+ ASMJIT_PROPAGATE(sb.append(']'));
+ }
+
+ return Error::kOk;
+}
+
+static Error format_func_rets(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseCompiler* cc,
+ const FuncDetail& fd) noexcept {
+
+ return format_func_value_pack(sb, format_flags, cc, fd.ret_pack(), nullptr);
+}
+
+static Error format_func_args(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseCompiler* cc,
+ const FuncDetail& fd,
+ const FuncNode::ArgPack* arg_packs) noexcept {
+
+ uint32_t arg_count = fd.arg_count();
+ if (!arg_count) {
+ return sb.append("void");
+ }
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ if (arg_index) {
+ ASMJIT_PROPAGATE(sb.append(", "));
+ }
+ ASMJIT_PROPAGATE(format_func_value_pack(sb, format_flags, cc, fd.arg_pack(arg_index), arg_packs[arg_index]._data));
+ }
+
+ return Error::kOk;
+}
+#endif
+
+Error format_node(
+ String& sb,
+ const FormatOptions& format_options,
+ const BaseBuilder* builder,
+ const BaseNode* node) noexcept {
+
+ if (node->has_position() && format_options.has_flag(FormatFlags::kPositions)) {
+ ASMJIT_PROPAGATE(sb.append_format("<%05u> ", uint32_t(node->position())));
+ }
+
+ size_t start_line_index = sb.size();
+
+ switch (node->type()) {
+ case NodeType::kInst:
+ case NodeType::kJump: {
+ const InstNode* inst_node = node->as<InstNode>();
+ ASMJIT_PROPAGATE(builder->_funcs.format_instruction(sb, format_options.flags(), builder, builder->arch(), inst_node->baseInst(), inst_node->operands()));
+ break;
+ }
+
+ case NodeType::kSection: {
+ const SectionNode* section_node = node->as<SectionNode>();
+ if (builder->_code->is_section_valid(section_node->section_id())) {
+ const Section* section = builder->_code->section_by_id(section_node->section_id());
+ ASMJIT_PROPAGATE(sb.append_format(".section %s", section->name()));
+ }
+ break;
+ }
+
+ case NodeType::kLabel: {
+ const LabelNode* label_node = node->as<LabelNode>();
+ ASMJIT_PROPAGATE(format_label(sb, format_options.flags(), builder, label_node->label_id()));
+ ASMJIT_PROPAGATE(sb.append(":"));
+ break;
+ }
+
+ case NodeType::kAlign: {
+ const AlignNode* align_node = node->as<AlignNode>();
+ ASMJIT_PROPAGATE(sb.append_format(".align %u (%s)",
+ align_node->alignment(),
+ align_node->align_mode() == AlignMode::kCode ? "code" : "data"));
+ break;
+ }
+
+ case NodeType::kEmbedData: {
+ const EmbedDataNode* embed_node = node->as<EmbedDataNode>();
+ ASMJIT_PROPAGATE(sb.append('.'));
+ ASMJIT_PROPAGATE(format_data_type(sb, format_options.flags(), builder->arch(), embed_node->type_id()));
+ ASMJIT_PROPAGATE(sb.append_format(" {Count=%zu Repeat=%zu TotalSize=%zu}", embed_node->item_count(), embed_node->repeat_count(), embed_node->data_size()));
+ break;
+ }
+
+ case NodeType::kEmbedLabel: {
+ const EmbedLabelNode* embed_node = node->as<EmbedLabelNode>();
+ ASMJIT_PROPAGATE(sb.append(".label "));
+ ASMJIT_PROPAGATE(format_label(sb, format_options.flags(), builder, embed_node->label_id()));
+ break;
+ }
+
+ case NodeType::kEmbedLabelDelta: {
+ const EmbedLabelDeltaNode* embed_node = node->as<EmbedLabelDeltaNode>();
+ ASMJIT_PROPAGATE(sb.append(".label ("));
+ ASMJIT_PROPAGATE(format_label(sb, format_options.flags(), builder, embed_node->label_id()));
+ ASMJIT_PROPAGATE(sb.append(" - "));
+ ASMJIT_PROPAGATE(format_label(sb, format_options.flags(), builder, embed_node->base_label_id()));
+ ASMJIT_PROPAGATE(sb.append(")"));
+ break;
+ }
+
+ case NodeType::kConstPool: {
+ const ConstPoolNode* const_pool_node = node->as<ConstPoolNode>();
+ ASMJIT_PROPAGATE(sb.append_format("[ConstPool Size=%zu Alignment=%zu]", const_pool_node->size(), const_pool_node->alignment()));
+ break;
+ };
+
+ case NodeType::kComment: {
+ const CommentNode* comment_node = node->as<CommentNode>();
+ return sb.append_format("; %s", comment_node->inline_comment());
+ }
+
+ case NodeType::kSentinel: {
+ const SentinelNode* sentinel_node = node->as<SentinelNode>();
+ const char* sentinel_name = nullptr;
+
+ switch (sentinel_node->sentinel_type()) {
+ case SentinelType::kFuncEnd:
+ sentinel_name = "[FuncEnd]";
+ break;
+
+ default:
+ sentinel_name = "[Sentinel]";
+ break;
+ }
+
+ ASMJIT_PROPAGATE(sb.append(sentinel_name));
+ break;
+ }
+
+#ifndef ASMJIT_NO_COMPILER
+ case NodeType::kFunc: {
+ const FuncNode* func_node = node->as<FuncNode>();
+
+ if (builder->is_compiler()) {
+ ASMJIT_PROPAGATE(format_label(sb, format_options.flags(), builder, func_node->label_id()));
+ ASMJIT_PROPAGATE(sb.append(": "));
+
+ ASMJIT_PROPAGATE(format_func_rets(sb, format_options.flags(), static_cast<const BaseCompiler*>(builder), func_node->detail()));
+ ASMJIT_PROPAGATE(sb.append(" Func("));
+ ASMJIT_PROPAGATE(format_func_args(sb, format_options.flags(), static_cast<const BaseCompiler*>(builder), func_node->detail(), func_node->arg_packs()));
+ ASMJIT_PROPAGATE(sb.append(")"));
+ }
+ break;
+ }
+
+ case NodeType::kFuncRet: {
+ const FuncRetNode* ret_node = node->as<FuncRetNode>();
+ ASMJIT_PROPAGATE(sb.append("[FuncRet]"));
+
+ for (uint32_t i = 0; i < 2; i++) {
+ const Operand_& op = ret_node->op(i);
+ if (!op.is_none()) {
+ ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
+ ASMJIT_PROPAGATE(format_operand(sb, format_options.flags(), builder, builder->arch(), op));
+ }
+ }
+ break;
+ }
+
+ case NodeType::kInvoke: {
+ const InvokeNode* invoke_node = node->as<InvokeNode>();
+ ASMJIT_PROPAGATE(builder->_funcs.format_instruction(sb, format_options.flags(), builder, builder->arch(), invoke_node->baseInst(), invoke_node->operands()));
+ break;
+ }
+#endif
+
+ default: {
+ ASMJIT_PROPAGATE(sb.append_format("[UserNode:%u]", node->type()));
+ break;
+ }
+ }
+
+ if (node->has_inline_comment()) {
+ size_t required_padding = padding_from_options(format_options, FormatPaddingGroup::kRegularLine);
+ size_t current_padding = sb.size() - start_line_index;
+
+ if (current_padding < required_padding) {
+ ASMJIT_PROPAGATE(sb.append_chars(' ', required_padding - current_padding));
+ }
+
+ ASMJIT_PROPAGATE(sb.append("; "));
+ ASMJIT_PROPAGATE(sb.append(node->inline_comment()));
+ }
+
+ return Error::kOk;
+}
+
+Error format_node_list(
+ String& sb,
+ const FormatOptions& format_options,
+ const BaseBuilder* builder) noexcept {
+
+ return format_node_list(sb, format_options, builder, builder->first_node(), nullptr);
+}
+
+Error format_node_list(
+ String& sb,
+ const FormatOptions& format_options,
+ const BaseBuilder* builder,
+ const BaseNode* begin,
+ const BaseNode* end) noexcept {
+
+ const BaseNode* node = begin;
+ while (node != end) {
+ ASMJIT_PROPAGATE(format_node(sb, format_options, builder, node));
+ ASMJIT_PROPAGATE(sb.append('\n'));
+ node = node->next();
+ }
+ return Error::kOk;
+}
+#endif
+
+} // {Formatter}
+
+ASMJIT_END_NAMESPACE
+
+#endif
diff --git a/3rdparty/asmjit/asmjit/core/formatter.h b/3rdparty/asmjit/asmjit/core/formatter.h
new file mode 100644
index 00000000000..3d0dccac06d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/formatter.h
@@ -0,0 +1,266 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FORMATTER_H_INCLUDED
+#define ASMJIT_CORE_FORMATTER_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+#include <asmjit/core/inst.h>
+#include <asmjit/core/string.h>
+#include <asmjit/support/span.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_logging
+//! \{
+
+class BaseBuilder;
+class BaseEmitter;
+class BaseNode;
+struct Operand_;
+
+//! Format flags used by \ref Logger and \ref FormatOptions.
+enum class FormatFlags : uint32_t {
+ //! No formatting flags.
+ kNone = 0u,
+
+ //! Show also a binary representation of each logged instruction (Assembler).
+ kMachineCode = 0x00000001u,
+ //! Show aliases of some instructions that have them.
+ //!
+ //! This option is now mostly for x86/x64 to show aliases of instructions such as `cmov<cc>`, `j<cc>`, `set<cc>`,
+ //! etc...
+ kShowAliases = 0x00000008u,
+ //! Show a text explanation of some immediate values.
+ kExplainImms = 0x00000010u,
+ //! Use hexadecimal notation of immediate values.
+ kHexImms = 0x00000020u,
+ //! Use hexadecimal notation of addresses and offsets in addresses.
+ kHexOffsets = 0x00000040u,
+ //! Show casts between virtual register types (Compiler).
+ kRegCasts = 0x00000100u,
+ //! Show positions associated with nodes (Compiler).
+ kPositions = 0x00000200u,
+ //! Always format a register type (Compiler).
+ kRegType = 0x00000400u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(FormatFlags)
+
+//! Format indentation group, used by \ref FormatOptions.
+enum class FormatIndentationGroup : uint32_t {
+ //! Indentation used for instructions and directives.
+ kCode = 0u,
+ //! Indentation used for labels and function nodes.
+ kLabel = 1u,
+ //! Indentation used for comments (not inline comments).
+ kComment = 2u,
+
+ //! \cond INTERNAL
+ //! Reserved for future use.
+ kReserved = 3u,
+ //! \endcond
+
+ //! Maximum value of `FormatIndentationGroup`.
+ kMaxValue = kReserved
+};
+
+//! Format padding group, used by \ref FormatOptions.
+enum class FormatPaddingGroup : uint32_t {
+ //! Describes padding of a regular line, which can represent instruction, data, or assembler directives.
+ kRegularLine = 0,
+ //! Describes padding of machine code dump that is visible next to the instruction, if enabled.
+ kMachineCode = 1,
+
+ //! Maximum value of `FormatPaddingGroup`.
+ kMaxValue = kMachineCode
+};
+
+//! Formatting options used by \ref Logger and \ref Formatter.
+class FormatOptions {
+public:
+ //! \name Members
+ //! \{
+
+ //! Format flags.
+ FormatFlags _flags = FormatFlags::kNone;
+ //! Indentations for each indentation group.
+ Support::Array<uint8_t, uint32_t(FormatIndentationGroup::kMaxValue) + 1> _indentation {};
+ //! Paddings for each padding group.
+ Support::Array<uint16_t, uint32_t(FormatPaddingGroup::kMaxValue) + 1> _padding {};
+
+ //! \}
+
+ //! \name Reset
+ //! \{
+
+ //! Resets FormatOptions to its default initialized state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _flags = FormatFlags::kNone;
+ _indentation.fill(uint8_t(0));
+ _padding.fill(uint16_t(0));
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns format flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FormatFlags flags() const noexcept { return _flags; }
+
+ //! Tests whether the given `flag` is set in format flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(FormatFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ //! Resets all format flags to `flags`.
+ ASMJIT_INLINE_NODEBUG void set_flags(FormatFlags flags) noexcept { _flags = flags; }
+
+ //! Adds `flags` to format flags.
+ ASMJIT_INLINE_NODEBUG void add_flags(FormatFlags flags) noexcept { _flags |= flags; }
+
+ //! Removes `flags` from format flags.
+ ASMJIT_INLINE_NODEBUG void clear_flags(FormatFlags flags) noexcept { _flags &= ~flags; }
+
+ //! Returns indentation for the given indentation `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t indentation(FormatIndentationGroup group) const noexcept { return _indentation[group]; }
+
+ //! Sets indentation for the given indentation `group`.
+ ASMJIT_INLINE_NODEBUG void set_indentation(FormatIndentationGroup group, uint32_t n) noexcept { _indentation[group] = uint8_t(n); }
+
+ //! Resets indentation for the given indentation `group` to zero.
+ ASMJIT_INLINE_NODEBUG void reset_indentation(FormatIndentationGroup group) noexcept { _indentation[group] = uint8_t(0); }
+
+ //! Returns padding for the given padding `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t padding(FormatPaddingGroup group) const noexcept { return _padding[group]; }
+
+ //! Sets padding for the given padding `group`.
+ ASMJIT_INLINE_NODEBUG void set_padding(FormatPaddingGroup group, size_t n) noexcept { _padding[group] = uint16_t(n); }
+
+ //! Resets padding for the given padding `group` to zero, which means that a default padding will be used
+ //! based on the target architecture properties.
+ ASMJIT_INLINE_NODEBUG void reset_padding(FormatPaddingGroup group) noexcept { _padding[group] = uint16_t(0); }
+
+ //! \}
+};
+
+//! Provides formatting functionality to format operands, instructions, and nodes.
+namespace Formatter {
+
+#ifndef ASMJIT_NO_LOGGING
+
+//! Appends a formatted `type_id` to the output string `sb`.
+ASMJIT_API Error format_type_id(
+ String& sb,
+ TypeId type_id) noexcept;
+
+//! Appends a formatted `feature_id` to the output string `sb`.
+//!
+//! See \ref CpuFeatures.
+ASMJIT_API Error format_feature(
+ String& sb,
+ Arch arch,
+ uint32_t feature_id) noexcept;
+
+//! Appends a formatted register to the output string `sb`.
+//!
+//! \note Emitter is optional, but it's required to format virtual registers, which won't be formatted properly
+//! if the `emitter` is not provided.
+ASMJIT_API Error format_register(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_id) noexcept;
+
+//! Appends a formatted label to the output string `sb`.
+//!
+//! \note Emitter is optional, but it's required to format named labels properly, otherwise the formatted as
+//! it is an anonymous label.
+ASMJIT_API Error format_label(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ uint32_t label_id) noexcept;
+
+//! Appends a formatted operand to the output string `sb`.
+//!
+//! \note Emitter is optional, but it's required to format named labels and virtual registers. See
+//! \ref format_register() and \ref format_label() for more details.
+ASMJIT_API Error format_operand(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept;
+
+//! Appends a formatted data-type to the output string `sb`.
+ASMJIT_API Error format_data_type(
+ String& sb,
+ FormatFlags format_flags,
+ Arch arch,
+ TypeId type_id) noexcept;
+
+//! Appends a formatted data to the output string `sb`.
+ASMJIT_API Error format_data(
+ String& sb,
+ FormatFlags format_flags,
+ Arch arch,
+ TypeId type_id, const void* data, size_t item_count, size_t repeat_count = 1) noexcept;
+
+//! Appends a formatted instruction to the output string `sb`.
+//!
+//! \note Emitter is optional, but it's required to format named labels and virtual registers. See
+//! \ref format_register() and \ref format_label() for more details.
+ASMJIT_API Error format_instruction(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept;
+
+#ifndef ASMJIT_NO_BUILDER
+//! Appends a formatted node to the output string `sb`.
+//!
+//! The `node` must belong to the provided `builder`.
+ASMJIT_API Error format_node(
+ String& sb,
+ const FormatOptions& format_options,
+ const BaseBuilder* builder,
+ const BaseNode* node) noexcept;
+
+//! Appends formatted nodes to the output string `sb`.
+//!
+//! All nodes that are part of the given `builder` will be appended.
+ASMJIT_API Error format_node_list(
+ String& sb,
+ const FormatOptions& format_options,
+ const BaseBuilder* builder) noexcept;
+
+//! Appends formatted nodes to the output string `sb`.
+//!
+//! This function works the same as \ref format_node(), but appends more nodes to the output string,
+//! separating each node with a newline '\n' character.
+ASMJIT_API Error format_node_list(
+ String& sb,
+ const FormatOptions& format_options,
+ const BaseBuilder* builder,
+ const BaseNode* begin,
+ const BaseNode* end) noexcept;
+#endif
+
+#endif
+
+} // {Formatter}
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FORMATTER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/formatter_p.h b/3rdparty/asmjit/asmjit/core/formatter_p.h
new file mode 100644
index 00000000000..495e8f9dfc5
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/formatter_p.h
@@ -0,0 +1,40 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FORMATTER_P_H_INCLUDED
+#define ASMJIT_CORE_FORMATTER_P_H_INCLUDED
+
+#include <asmjit/core/compilerdefs.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/operand.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_logging
+//! \{
+
+namespace Formatter {
+
+[[maybe_unused]]
+static ASMJIT_INLINE size_t padding_from_options(const FormatOptions& format_options, FormatPaddingGroup group) noexcept {
+ static constexpr uint16_t default_padding_table[uint32_t(FormatPaddingGroup::kMaxValue) + 1] = { 44, 26 };
+ static_assert(uint32_t(FormatPaddingGroup::kMaxValue) + 1 == 2, "If a new group is defined it must be added here");
+
+ size_t padding = format_options.padding(group);
+ return padding ? padding : size_t(default_padding_table[uint32_t(group)]);
+}
+
+Error format_virt_reg_name(String& sb, const VirtReg* v_reg) noexcept;
+Error format_virt_reg_name_with_prefix(String& sb, const char* prefix, size_t prefix_size, const VirtReg* v_reg) noexcept;
+
+} // {Formatter}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FORMATTER_H_P_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/func.cpp b/3rdparty/asmjit/asmjit/core/func.cpp
new file mode 100644
index 00000000000..78c0eeb285b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/func.cpp
@@ -0,0 +1,316 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/func.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+#include <asmjit/core/funcargscontext_p.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86/x86func_p.h>
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/arm/a64func_p.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+// CallConv - Initialization & Reset
+// =================================
+
+ASMJIT_FAVOR_SIZE Error CallConv::init(CallConvId call_conv_id, const Environment& environment) noexcept {
+ reset();
+
+#if !defined(ASMJIT_NO_X86)
+ if (environment.is_family_x86()) {
+ return x86::FuncInternal::init_call_conv(*this, call_conv_id, environment);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (environment.is_family_aarch64()) {
+ return a64::FuncInternal::init_call_conv(*this, call_conv_id, environment);
+ }
+#endif
+
+ return make_error(Error::kInvalidArgument);
+}
+
+// FuncDetail - Init / Reset
+// =========================
+
+ASMJIT_FAVOR_SIZE Error FuncDetail::init(const FuncSignature& signature, const Environment& environment) noexcept {
+ CallConvId call_conv_id = signature.call_conv_id();
+ uint32_t arg_count = signature.arg_count();
+
+ if (ASMJIT_UNLIKELY(arg_count > Globals::kMaxFuncArgs)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ CallConv& cc = _call_conv;
+ ASMJIT_PROPAGATE(cc.init(call_conv_id, environment));
+
+ uint32_t register_size = Environment::reg_size_of_arch(cc.arch());
+ uint32_t deabstract_delta = TypeUtils::deabstract_delta_of_size(register_size);
+
+ const TypeId* signature_args = signature.args();
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ FuncValuePack& arg_pack = _args[arg_index];
+ arg_pack[0].init_type_id(TypeUtils::deabstract(signature_args[arg_index], deabstract_delta));
+ }
+
+ _arg_count = uint8_t(arg_count);
+ _va_index = uint8_t(signature.va_index());
+
+ TypeId ret = signature.ret();
+ if (ret != TypeId::kVoid) {
+ _rets[0].init_type_id(TypeUtils::deabstract(ret, deabstract_delta));
+ }
+
+#if !defined(ASMJIT_NO_X86)
+ if (environment.is_family_x86()) {
+ return x86::FuncInternal::init_func_detail(*this, signature, register_size);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (environment.is_family_aarch64()) {
+ return a64::FuncInternal::init_func_detail(*this, signature);
+ }
+#endif
+
+ // We should never bubble here as if `cc.init()` succeeded then there has to be an implementation for the current
+ // architecture. However, stay safe.
+ return make_error(Error::kInvalidArgument);
+}
+
+// FuncFrame - Init
+// ================
+
+ASMJIT_FAVOR_SIZE Error FuncFrame::init(const FuncDetail& func) noexcept {
+ Arch arch = func.call_conv().arch();
+ if (!Environment::is_valid_arch(arch)) {
+ return make_error(Error::kInvalidArch);
+ }
+
+ const ArchTraits& arch_traits = ArchTraits::by_arch(arch);
+
+ // Initializing FuncFrame means making a copy of some properties of `func`. Properties like `_local_stack_size` will
+ // be set by the user before the frame is finalized.
+ reset();
+
+ _arch = arch;
+ _sp_reg_id = uint8_t(arch_traits.sp_reg_id());
+ _sa_reg_id = uint8_t(Reg::kIdBad);
+
+ uint32_t natural_stack_alignment = func.call_conv().natural_stack_alignment();
+ uint32_t min_dynamic_alignment = Support::max<uint32_t>(natural_stack_alignment, 16);
+
+ if (min_dynamic_alignment == natural_stack_alignment) {
+ min_dynamic_alignment <<= 1;
+ }
+
+ _natural_stack_alignment = uint8_t(natural_stack_alignment);
+ _min_dynamic_alignment = uint8_t(min_dynamic_alignment);
+ _red_zone_size = uint8_t(func.red_zone_size());
+ _spill_zone_size = uint8_t(func.spill_zone_size());
+ _final_stack_alignment = uint8_t(_natural_stack_alignment);
+
+ if (func.has_flag(CallConvFlags::kCalleePopsStack)) {
+ _callee_stack_cleanup = uint16_t(func.arg_stack_size());
+ }
+
+ // Initial masks of dirty and preserved registers.
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ _dirty_regs[group] = func.used_regs(group);
+ _preserved_regs[group] = func.preserved_regs(group);
+ }
+
+ // Exclude stack pointer - this register is never included in saved GP regs.
+ _preserved_regs[RegGroup::kGp] &= ~Support::bit_mask<RegMask>(arch_traits.sp_reg_id());
+
+ // The size and alignment of save/restore area of registers for each virtual register group
+ _save_restore_reg_size = func.call_conv()._save_restore_reg_size;
+ _save_restore_alignment = func.call_conv()._save_restore_alignment;
+
+ return Error::kOk;
+}
+
+// FuncFrame - Finalize
+// ====================
+
+ASMJIT_FAVOR_SIZE Error FuncFrame::finalize() noexcept {
+ if (!Environment::is_valid_arch(arch())) {
+ return make_error(Error::kInvalidArch);
+ }
+
+ const ArchTraits& arch_traits = ArchTraits::by_arch(arch());
+
+ uint32_t register_size = _save_restore_reg_size[RegGroup::kGp];
+ uint32_t vector_size = _save_restore_reg_size[RegGroup::kVec];
+ uint32_t return_address_size = arch_traits.has_link_reg() ? 0u : register_size;
+
+ // The final stack alignment must be updated accordingly to call and local stack alignments.
+ uint32_t stack_alignment = _final_stack_alignment;
+ ASMJIT_ASSERT(stack_alignment == Support::max(_natural_stack_alignment, _call_stack_alignment, _local_stack_alignment));
+
+ bool has_fp = has_preserved_fp();
+ bool has_da = has_dynamic_alignment();
+
+ uint32_t kSp = arch_traits.sp_reg_id();
+ uint32_t kFp = arch_traits.fp_reg_id();
+ uint32_t kLr = arch_traits.link_reg_id();
+
+ // Make frame pointer dirty if the function uses it.
+ if (has_fp) {
+ _dirty_regs[RegGroup::kGp] |= Support::bit_mask<RegMask>(kFp);
+
+ // Currently required by ARM, if this works differently across architectures we would have to generalize most
+ // likely in CallConv.
+ if (kLr != Reg::kIdBad) {
+ _dirty_regs[RegGroup::kGp] |= Support::bit_mask<RegMask>(kLr);
+ }
+ }
+
+ // These two are identical if the function doesn't align its stack dynamically.
+ uint32_t sa_reg_id = _sa_reg_id;
+ if (sa_reg_id == Reg::kIdBad) {
+ sa_reg_id = kSp;
+ }
+
+ // Fix stack arguments base-register from SP to FP in case it was not picked before and the function performs
+ // dynamic stack alignment.
+ if (has_da && sa_reg_id == kSp) {
+ sa_reg_id = kFp;
+ }
+
+ // Mark as dirty any register but SP if used as SA pointer.
+ if (sa_reg_id != kSp) {
+ _dirty_regs[RegGroup::kGp] |= Support::bit_mask<RegMask>(sa_reg_id);
+ }
+
+ _sp_reg_id = uint8_t(kSp);
+ _sa_reg_id = uint8_t(sa_reg_id);
+
+ // Setup stack size used to save preserved registers.
+ uint32_t save_restore_sizes[2] {};
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ save_restore_sizes[size_t(!arch_traits.has_inst_push_pop(group))]
+ += Support::align_up(Support::popcnt(saved_regs(group)) * save_restore_reg_size(group), save_restore_alignment(group));
+ }
+
+ _push_pop_save_size = uint16_t(save_restore_sizes[0]);
+ _extra_reg_save_size = uint16_t(save_restore_sizes[1]);
+
+ uint32_t v = 0; // The beginning of the stack frame relative to SP after prolog.
+ v += call_stack_size(); // Count 'call_stack_size' <- This is used to call functions.
+ v = Support::align_up(v, stack_alignment); // Align to function's stack alignment.
+
+ _local_stack_offset = v; // Store 'local_stack_offset' <- Function's local stack starts here.
+ v += local_stack_size(); // Count 'local_stack_size' <- Function's local stack ends here.
+
+ // If the function's stack must be aligned, calculate the alignment necessary to store vector registers, and set
+ // `FuncAttributes::kAlignedVecSR` to inform PEI that it can use instructions that perform aligned stores/loads.
+ if (stack_alignment >= vector_size && _extra_reg_save_size) {
+ add_attributes(FuncAttributes::kAlignedVecSR);
+ v = Support::align_up(v, vector_size); // Align 'extra_reg_save_offset'.
+ }
+
+ _extra_reg_save_offset = v; // Store 'extra_reg_save_offset' <- Non-GP save/restore starts here.
+ v += _extra_reg_save_size; // Count 'extra_reg_save_size' <- Non-GP save/restore ends here.
+
+ // Calculate if dynamic alignment (DA) slot (stored as offset relative to SP) is required and its offset.
+ if (has_da && !has_fp) {
+ _da_offset = v; // Store 'da_offset' <- DA pointer would be stored here.
+ v += register_size; // Count 'da_offset'.
+ }
+ else {
+ _da_offset = FuncFrame::kTagInvalidOffset;
+ }
+
+ // Link Register
+ // -------------
+ //
+ // The stack is aligned after the function call as the return address is stored in a link register. Some
+ // architectures may require to always have aligned stack after PUSH/POP operation, which is represented
+ // by ArchTraits::hw_stack_alignment().
+ //
+ // No Link Register (X86/X64)
+ // --------------------------
+ //
+ // The return address should be stored after GP save/restore regs. It has the same size as `register_size`
+ // (basically the native register/pointer size). We don't adjust it now as `v` now contains the exact size
+ // that the function requires to adjust (call frame + stack frame, vec stack size). The stack (if we consider
+ // this size) is misaligned now, as it's always aligned before the function call - when `call()` is executed
+ // it pushes the current EIP|RIP onto the stack, and unaligns it by 12 or 8 bytes (depending on the
+ // architecture). So count number of bytes needed to align it up to the function's CallFrame (the beginning).
+ if (v || has_func_calls() || !return_address_size) {
+ v += Support::align_up_diff(v + push_pop_save_size() + return_address_size, stack_alignment);
+ }
+
+ _push_pop_save_offset = v; // Store 'push_pop_save_offset' <- Function's push/pop save/restore starts here.
+ _stack_adjustment = v; // Store 'stack_adjustment' <- SA used by 'add SP, SA' and 'sub SP, SA'.
+ v += _push_pop_save_size; // Count 'push_pop_save_size' <- Function's push/pop save/restore ends here.
+ _final_stack_size = v; // Store 'final_stack_size' <- Final stack used by the function.
+
+ if (!arch_traits.has_link_reg()) {
+ v += register_size; // Count 'ReturnAddress' <- As CALL pushes onto stack.
+ }
+
+ // If the function performs dynamic stack alignment then the stack-adjustment must be aligned.
+ if (has_da) {
+ _stack_adjustment = Support::align_up(_stack_adjustment, stack_alignment);
+ }
+
+ // Calculate where the function arguments start relative to SP.
+ _sa_offset_from_sp = has_da ? FuncFrame::kTagInvalidOffset : v;
+
+ // Calculate where the function arguments start relative to FP or user-provided register.
+ _sa_offset_from_sa = has_fp ? return_address_size + register_size // Return address + frame pointer.
+ : return_address_size + _push_pop_save_size; // Return address + all push/pop regs.
+
+ return Error::kOk;
+}
+
+// FuncArgsAssignment - UpdateFuncFrame
+// ====================================
+
+ASMJIT_FAVOR_SIZE Error FuncArgsAssignment::update_func_frame(FuncFrame& frame) const noexcept {
+ Arch arch = frame.arch();
+ const FuncDetail* func = func_detail();
+
+ if (!func) {
+ return make_error(Error::kInvalidState);
+ }
+
+ RAConstraints constraints;
+ ASMJIT_PROPAGATE(constraints.init(arch));
+
+ FuncArgsContext ctx;
+ ASMJIT_PROPAGATE(ctx.init_work_data(frame, *this, &constraints));
+ ASMJIT_PROPAGATE(ctx.mark_dst_regs_dirty(frame));
+ ASMJIT_PROPAGATE(ctx.mark_scratch_regs(frame));
+ ASMJIT_PROPAGATE(ctx.mark_stack_args_reg(frame));
+ return Error::kOk;
+}
+
+// Func API - Tests
+// ================
+
+#if defined(ASMJIT_TEST)
+UNIT(func_signature) {
+ FuncSignature signature;
+ signature.set_ret_t<int8_t>();
+ signature.add_arg_t<int16_t>();
+ signature.add_arg(TypeId::kInt32);
+
+ EXPECT_EQ(signature, FuncSignature::build<int8_t, int16_t, int32_t>());
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/func.h b/3rdparty/asmjit/asmjit/core/func.h
new file mode 100644
index 00000000000..8a954173414
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/func.h
@@ -0,0 +1,1878 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FUNC_H_INCLUDED
+#define ASMJIT_CORE_FUNC_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/environment.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_function
+//! \{
+
+//! Calling convention id.
+//!
+//! Calling conventions can be divided into the following groups:
+//!
+//! - Universal - calling conventions are applicable to any target. They will be converted to a target dependent
+//! calling convention at runtime by \ref CallConv::init() with some help from \ref Environment. The purpose of
+//! these calling conventions is to make using functions less target dependent and closer to C and C++.
+//!
+//! - Target specific - calling conventions that are used by a particular architecture and ABI. For example
+//! Windows 64-bit calling convention and AMD64 SystemV calling convention.
+enum class CallConvId : uint8_t {
+ // Universal Calling Conventions
+ // -----------------------------
+
+ //! Standard function call or explicit `__cdecl` where it can be specified.
+ //!
+ //! This is a universal calling convention, which is used to initialize specific calling conventions based on
+ //! architecture, platform, and its ABI.
+ kCDecl = 0,
+
+ //! `__stdcall` on targets that support this calling convention (X86).
+ //!
+ //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support
+ //! this calling convention it will be replaced by \ref CallConvId::kCDecl.
+ kStdCall = 1,
+
+ //! `__fastcall` on targets that support this calling convention (X86).
+ //!
+ //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support
+ //! this calling convention it will be replaced by \ref CallConvId::kCDecl.
+ kFastCall = 2,
+
+ //! `__vectorcall` on targets that support this calling convention (X86|X86_64).
+ //!
+ //! \note This calling convention is only supported on 32-bit and 64-bit X86 architecture on Windows platform.
+ //! If used on environment that doesn't support this calling it will be replaced by \ref CallConvId::kCDecl.
+ kVectorCall = 3,
+
+ //! `__thiscall` on targets that support this calling convention (X86).
+ //!
+ //! \note This calling convention is only supported on 32-bit X86 Windows platform. If used on environment that
+ //! doesn't support this calling convention it will be replaced by \ref CallConvId::kCDecl.
+ kThisCall = 4,
+
+ //! `__attribute__((regparm(1)))` convention (GCC and Clang).
+ kRegParm1 = 5,
+ //! `__attribute__((regparm(2)))` convention (GCC and Clang).
+ kRegParm2 = 6,
+ //! `__attribute__((regparm(3)))` convention (GCC and Clang).
+ kRegParm3 = 7,
+
+ //! AsmJit specific calling convention designed for calling functions inside a multimedia code that don't use many
+ //! registers internally, but are long enough to be called and not inlined. These functions are usually used to
+ //! calculate trigonometric functions, logarithms, etc...
+ kLightCall2 = 16,
+ kLightCall3 = 17,
+ kLightCall4 = 18,
+
+ // ABI-Specific Calling Conventions
+ // --------------------------------
+
+ //! Soft-float calling convention (AArch32).
+ //!
+ //! Floating point arguments are passed via general purpose registers.
+ kSoftFloat = 30,
+
+ //! Hard-float calling convention (AArch32).
+ //!
+ //! Floating point arguments are passed via SIMD registers.
+ kHardFloat = 31,
+
+ //! X64 System-V calling convention.
+ kX64SystemV = 32,
+ //! X64 Windows calling convention.
+ kX64Windows = 33,
+
+ //! Maximum value of `CallConvId`.
+ kMaxValue = kX64Windows
+};
+
+//! Strategy used by calling conventions to assign registers to function arguments.
+//!
+//! Calling convention strategy describes how AsmJit should convert function arguments used by \ref FuncSignature
+//! into register identifiers and stack offsets. The \ref CallConvStrategy::kDefault strategy assigns registers
+//! and then stack whereas \ref CallConvStrategy::kX64Windows strategy does register shadowing as defined by WIN64
+//! calling convention, which is only used by 64-bit Windows.
+enum class CallConvStrategy : uint8_t {
+ //! Default register assignment strategy.
+ kDefault = 0,
+ //! Windows 64-bit ABI register assignment strategy.
+ kX64Windows = 1,
+ //! Windows 64-bit __vectorcall register assignment strategy.
+ kX64VectorCall = 2,
+ //! Apple's AArch64 calling convention (differs compared to AArch64 calling convention used by Linux).
+ kAArch64Apple = 3,
+
+ //! Maximum value of `CallConvStrategy`.
+ kMaxValue = kX64VectorCall
+};
+
+//! Calling convention flags.
+enum class CallConvFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+ //! Callee is responsible for cleaning up the stack.
+ kCalleePopsStack = 0x0001u,
+ //! Pass vector arguments indirectly (as a pointer).
+ kIndirectVecArgs = 0x0002u,
+ //! Pass F32 and F64 arguments via VEC128 register.
+ kPassFloatsByVec = 0x0004u,
+ //! Pass MMX and vector arguments via stack if the function has variable arguments.
+ kPassVecByStackIfVA = 0x0008u,
+ //! MMX registers are passed and returned via GP registers.
+ kPassMmxByGp = 0x0010u,
+ //! MMX registers are passed and returned via XMM registers.
+ kPassMmxByXmm = 0x0020u,
+ //! Calling convention can be used with variable arguments.
+ kVarArgCompatible = 0x0080u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(CallConvFlags)
+
+//! Function calling convention.
+//!
+//! Function calling convention is a scheme that defines how function parameters are passed and how function
+//! returns its result. AsmJit defines a variety of architecture and OS specific calling conventions and also
+//! provides a compile time detection to make the code-generation easier.
+struct CallConv {
+ //! \name Constants
+ //! \{
+
+ //! Maximum number of register arguments per register group.
+ //!
+ //! \note This is not really AsmJit's limitation, it's just the number that makes sense considering all common
+ //! calling conventions. Usually even conventions that use registers to pass function arguments are limited to 8
+ //! and less arguments passed via registers per group.
+ static inline constexpr uint32_t kMaxRegArgsPerGroup = 16;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Target architecture.
+ Arch _arch;
+ //! Calling convention id.
+ CallConvId _id;
+ //! Register assignment strategy.
+ CallConvStrategy _strategy;
+
+ //! Red zone size (AMD64 == 128 bytes).
+ uint8_t _red_zone_size;
+ //! Spill zone size (WIN-X64 == 32 bytes).
+ uint8_t _spill_zone_size;
+ //! Natural stack alignment as defined by OS/ABI.
+ uint8_t _natural_stack_alignment;
+
+ //! \cond INTERNAL
+ //! Reserved for future use.
+ uint8_t _reserved[2];
+ //! \endcond
+
+ //! Calling convention flags.
+ CallConvFlags _flags;
+
+ //! Size to save/restore per register group.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _save_restore_reg_size;
+ //! Alignment of save/restore groups.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _save_restore_alignment;
+
+ //! Mask of all passed registers, per group.
+ Support::Array<RegMask, Globals::kNumVirtGroups> _passed_regs;
+ //! Mask of all preserved registers, per group.
+ Support::Array<RegMask, Globals::kNumVirtGroups> _preserved_regs;
+
+ //! Passed registers' order.
+ union RegOrder {
+ //! Passed registers, ordered.
+ uint8_t id[kMaxRegArgsPerGroup];
+ //! Packed IDs in `uint32_t` array.
+ uint32_t packed[(kMaxRegArgsPerGroup + 3) / 4];
+ };
+
+ //! Passed registers' order, per register group.
+ Support::Array<RegOrder, Globals::kNumVirtGroups> _passed_order;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Initializes this calling convention to the given `call_conv_id` based on the `environment`.
+ //!
+ //! See \ref CallConvId and \ref Environment for more details.
+ ASMJIT_API Error init(CallConvId call_conv_id, const Environment& environment) noexcept;
+
+ //! Resets this CallConv struct into a defined state.
+ //!
+ //! It's recommended to reset the \ref CallConv struct in case you would like create a custom calling convention
+ //! as it prevents from using an uninitialized data (CallConv doesn't have a constructor that would initialize it,
+ //! it's just a struct).
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ *this = CallConv{};
+ memset(_passed_order.data(), 0xFF, sizeof(_passed_order));
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the target architecture of this calling convention.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
+
+ //! Sets the target architecture of this calling convention.
+ ASMJIT_INLINE_NODEBUG void set_arch(Arch arch) noexcept { _arch = arch; }
+
+ //! Returns the calling convention id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CallConvId id() const noexcept { return _id; }
+
+ //! Sets the calling convention id.
+ ASMJIT_INLINE_NODEBUG void set_id(CallConvId call_conv_id) noexcept { _id = call_conv_id; }
+
+ //! Returns the strategy used to assign registers to arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CallConvStrategy strategy() const noexcept { return _strategy; }
+
+ //! Sets the strategy used to assign registers to arguments.
+ ASMJIT_INLINE_NODEBUG void set_strategy(CallConvStrategy strategy) noexcept { _strategy = strategy; }
+
+ //! Tests whether the calling convention has the given `flag` set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(CallConvFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ //! Returns the calling convention flags, see `Flags`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CallConvFlags flags() const noexcept { return _flags; }
+
+ //! Adds the calling convention flags, see `Flags`.
+ ASMJIT_INLINE_NODEBUG void set_flags(CallConvFlags flag) noexcept { _flags = flag; };
+
+ //! Adds the calling convention flags, see `Flags`.
+ ASMJIT_INLINE_NODEBUG void add_flags(CallConvFlags flags) noexcept { _flags |= flags; };
+
+ //! Tests whether this calling convention specifies 'Red Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_red_zone() const noexcept { return _red_zone_size != 0; }
+
+ //! Tests whether this calling convention specifies 'Spill Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_spill_zone() const noexcept { return _spill_zone_size != 0; }
+
+ //! Returns size of 'Red Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t red_zone_size() const noexcept { return _red_zone_size; }
+
+ //! Sets size of 'Red Zone'.
+ ASMJIT_INLINE_NODEBUG void set_red_zone_size(uint32_t size) noexcept { _red_zone_size = uint8_t(size); }
+
+ //! Returns size of 'Spill Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t spill_zone_size() const noexcept { return _spill_zone_size; }
+
+ //! Sets size of 'Spill Zone'.
+ ASMJIT_INLINE_NODEBUG void set_spill_zone_size(uint32_t size) noexcept { _spill_zone_size = uint8_t(size); }
+
+ //! Returns a natural stack alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t natural_stack_alignment() const noexcept { return _natural_stack_alignment; }
+
+ //! Sets a natural stack alignment.
+ //!
+ //! This function can be used to override the default stack alignment in case that you know that it's alignment is
+ //! different. For example it allows to implement custom calling conventions that guarantee higher stack alignment.
+ ASMJIT_INLINE_NODEBUG void set_natural_stack_alignment(uint32_t value) noexcept { _natural_stack_alignment = uint8_t(value); }
+
+ //! Returns the size of a register (or its part) to be saved and restored of the given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t save_restore_reg_size(RegGroup group) const noexcept { return _save_restore_reg_size[group]; }
+
+ //! Sets the size of a vector register (or its part) to be saved and restored.
+ ASMJIT_INLINE_NODEBUG void set_save_restore_reg_size(RegGroup group, uint32_t size) noexcept { _save_restore_reg_size[group] = uint8_t(size); }
+
+ //! Returns the alignment of a save-restore area of the given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t save_restore_alignment(RegGroup group) const noexcept { return _save_restore_alignment[group]; }
+
+ //! Sets the alignment of a save-restore area of the given `group`.
+ ASMJIT_INLINE_NODEBUG void set_save_restore_alignment(RegGroup group, uint32_t alignment) noexcept { _save_restore_alignment[group] = uint8_t(alignment); }
+
+ //! Returns the order of passed registers of the given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE const uint8_t* passed_order(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _passed_order[size_t(group)].id;
+ }
+
+ //! Returns the mask of passed registers of the given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE RegMask passed_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _passed_regs[size_t(group)];
+ }
+
+ ASMJIT_INLINE void _set_passed_as_packed(RegGroup group, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ _passed_order[group].packed[0] = p0;
+ _passed_order[group].packed[1] = p1;
+ _passed_order[group].packed[2] = p2;
+ _passed_order[group].packed[3] = p3;
+ }
+
+ //! Resets the order and mask of passed registers.
+ ASMJIT_INLINE void set_passed_to_none(RegGroup group) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ _set_passed_as_packed(group, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu);
+ _passed_regs[size_t(group)] = 0u;
+ }
+
+ //! Sets the order and mask of passed registers.
+ ASMJIT_INLINE void set_passed_order(RegGroup group, uint32_t a0, uint32_t a1 = 0xFF, uint32_t a2 = 0xFF, uint32_t a3 = 0xFF, uint32_t a4 = 0xFF, uint32_t a5 = 0xFF, uint32_t a6 = 0xFF, uint32_t a7 = 0xFF) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ // NOTE: This should always be called with all arguments known at compile time, so even if it looks scary it
+ // should be translated into few instructions.
+ _set_passed_as_packed(group, Support::bytepack32_4x8(a0, a1, a2, a3),
+ Support::bytepack32_4x8(a4, a5, a6, a7),
+ 0xFFFFFFFFu,
+ 0xFFFFFFFFu);
+
+ _passed_regs[group] = (a0 != 0xFF ? 1u << a0 : 0u) |
+ (a1 != 0xFF ? 1u << a1 : 0u) |
+ (a2 != 0xFF ? 1u << a2 : 0u) |
+ (a3 != 0xFF ? 1u << a3 : 0u) |
+ (a4 != 0xFF ? 1u << a4 : 0u) |
+ (a5 != 0xFF ? 1u << a5 : 0u) |
+ (a6 != 0xFF ? 1u << a6 : 0u) |
+ (a7 != 0xFF ? 1u << a7 : 0u) ;
+ }
+
+ //! Returns preserved register mask of the given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE RegMask preserved_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _preserved_regs[group];
+ }
+
+ //! Sets preserved register mask of the given `group`.
+ ASMJIT_INLINE void set_preserved_regs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _preserved_regs[group] = regs;
+ }
+
+ //! \}
+};
+
+//! Function signature.
+//!
+//! Contains information about a function return type, count of arguments, and their TypeIds. Function signature
+//! is a low level structure which doesn't contain platform specific or calling convention specific information.
+//! It's typically used to describe function arguments in a C-API like form, which is then used to calculate a
+//! \ref FuncDetail instance, which then maps function signature into a platform and calling convention specific
+//! format.
+//!
+//! Function signature can be built either dynamically by using \ref add_arg() and \ref add_arg_t() functionality,
+//! or dynamically by using a template-based \ref FuncSignature::build() function, which maps template types
+//! into a function signature.
+struct FuncSignature {
+ //! \name Constants
+ //! \{
+
+ //! Doesn't have variable number of arguments (`...`).
+ static inline constexpr uint8_t kNoVarArgs = 0xFFu;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Calling convention id.
+ CallConvId _call_conv_id = CallConvId::kCDecl;
+ //! Count of arguments.
+ uint8_t _arg_count = 0;
+ //! Index of a first VA or `kNoVarArgs`.
+ uint8_t _va_index = kNoVarArgs;
+ //! Return value TypeId.
+ TypeId _ret = TypeId::kVoid;
+ //! Reserved for future use.
+ uint8_t _reserved[4] {};
+ //! Function argument TypeIds.
+ TypeId _args[Globals::kMaxFuncArgs] {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Default constructed function signature, initialized to \ref CallConvId::kCDecl, having no return value and no arguments.
+ ASMJIT_INLINE_CONSTEXPR FuncSignature() = default;
+
+ //! Copy constructor, which is initialized to the same function signature as `other`.
+ ASMJIT_INLINE_CONSTEXPR FuncSignature(const FuncSignature& other) = default;
+
+ //! Initializes the function signature with calling convention id `call_conv_id` and variable argument's index `va_index`.
+ ASMJIT_INLINE_CONSTEXPR FuncSignature(CallConvId call_conv_id, uint32_t va_index = kNoVarArgs) noexcept
+ : _call_conv_id(call_conv_id),
+ _va_index(uint8_t(va_index)) {}
+
+ //! Initializes the function signature with calling convention id `call_conv_id`, `va_index`, return value, and function arguments.
+ template<typename... Args>
+ ASMJIT_INLINE_CONSTEXPR FuncSignature(CallConvId call_conv_id, uint32_t va_index, TypeId ret, Args&&...args) noexcept
+ : _call_conv_id(call_conv_id),
+ _arg_count(uint8_t(sizeof...(args))),
+ _va_index(uint8_t(va_index)),
+ _ret(ret),
+ _args{std::forward<Args>(args)...} {}
+
+ //! Builds a function signature based on `RetValueAndArgs`. The first template argument is a function return type,
+ //! and function arguments follow.
+ //!
+ //! \note This function returns a new function signature, which can be passed to functions where it's required. It's
+ //! a convenience function that allows to build function signature statically based on types known at compile time,
+ //! which is common in JIT code generation.
+ template<typename... RetValueAndArgs>
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR FuncSignature build(CallConvId call_conv_id = CallConvId::kCDecl, uint32_t va_index = kNoVarArgs) noexcept {
+ return FuncSignature(call_conv_id, va_index, (TypeId(TypeUtils::TypeIdOfT<RetValueAndArgs>::kTypeId))... );
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Copy assignment - function signature can be copied by value.
+ ASMJIT_INLINE FuncSignature& operator=(const FuncSignature& other) noexcept = default;
+
+ //! Compares this function signature with `other` for equality..
+ [[nodiscard]]
+ ASMJIT_INLINE bool operator==(const FuncSignature& other) const noexcept { return equals(other); }
+
+ //! Compares this function signature with `other` for inequality..
+ [[nodiscard]]
+ ASMJIT_INLINE bool operator!=(const FuncSignature& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Initialization & Reset
+ //! \{
+
+ //! Resets this function signature to a default constructed state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncSignature{}; }
+
+ //! \}
+
+ //! \name Equality & Comparison
+ //! \{
+
+ //! Compares this function signature with `other` for equality..
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool equals(const FuncSignature& other) const noexcept {
+ return _call_conv_id == other._call_conv_id &&
+ _arg_count == other._arg_count &&
+ _va_index == other._va_index &&
+ _ret == other._ret &&
+ memcmp(_args, other._args, sizeof(_args)) == 0;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the calling convention.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR CallConvId call_conv_id() const noexcept { return _call_conv_id; }
+
+ //! Sets the calling convention to `call_conv_id`;
+ ASMJIT_INLINE_CONSTEXPR void set_call_conv_id(CallConvId call_conv_id) noexcept { _call_conv_id = call_conv_id; }
+
+ //! Tests whether the function signature has a return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_ret() const noexcept { return _ret != TypeId::kVoid; }
+
+ //! Returns the type of the return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR TypeId ret() const noexcept { return _ret; }
+
+ //! Sets the return type to `ret_type`.
+ ASMJIT_INLINE_CONSTEXPR void set_ret(TypeId ret_type) noexcept { _ret = ret_type; }
+
+ //! Sets the return type based on `T`.
+ template<typename T>
+ ASMJIT_INLINE_CONSTEXPR void set_ret_t() noexcept { set_ret(TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
+
+ //! Returns the array of function arguments' types.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR const TypeId* args() const noexcept { return _args; }
+
+ //! Returns the number of function arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t arg_count() const noexcept { return _arg_count; }
+
+ //! Returns the type of the argument at index `i`.
+ [[nodiscard]]
+ ASMJIT_INLINE TypeId arg(uint32_t i) const noexcept {
+ ASMJIT_ASSERT(i < _arg_count);
+ return _args[i];
+ }
+
+ //! Sets the argument at index `index` to `arg_type`.
+ ASMJIT_INLINE void set_arg(uint32_t index, TypeId arg_type) noexcept {
+ ASMJIT_ASSERT(index < _arg_count);
+ _args[index] = arg_type;
+ }
+
+ //! Sets the argument at index `i` to the type based on `T`.
+ template<typename T>
+ ASMJIT_INLINE void set_arg_t(uint32_t index) noexcept { set_arg(index, TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
+
+ //! Tests whether an argument can be added to the signature, use before calling \ref add_arg() and \ref add_arg_t().
+ //!
+ //! \note If you know that you are not adding more arguments than \ref Globals::kMaxFuncArgs then it's not necessary
+ //! to use this function. However, if you are adding arguments based on user input, for example, then either check
+ //! the number of arguments before using function signature or use \ref can_add_arg() before actually adding them to
+ //! the function signature.
+ [[nodiscard]]
+ ASMJIT_INLINE bool can_add_arg() const noexcept { return _arg_count < Globals::kMaxFuncArgs; }
+
+ //! Appends an argument of `type` to the function prototype.
+ ASMJIT_INLINE void add_arg(TypeId type) noexcept {
+ ASMJIT_ASSERT(_arg_count < Globals::kMaxFuncArgs);
+ _args[_arg_count++] = type;
+ }
+
+ //! Appends an argument of type based on `T` to the function prototype.
+ template<typename T>
+ ASMJIT_INLINE void add_arg_t() noexcept { add_arg(TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
+
+ //! Tests whether the function has variable number of arguments (...).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_var_args() const noexcept { return _va_index != kNoVarArgs; }
+
+ //! Returns the variable arguments (...) index, `kNoVarArgs` if none.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t va_index() const noexcept { return _va_index; }
+
+ //! Sets the variable arguments (...) index to `index`.
+ ASMJIT_INLINE_NODEBUG void set_va_index(uint32_t index) noexcept { _va_index = uint8_t(index); }
+
+ //! Resets the variable arguments index (making it a non-va function).
+ ASMJIT_INLINE_NODEBUG void reset_va_index() noexcept { _va_index = kNoVarArgs; }
+
+ //! \}
+};
+
+//! Argument or return value (or its part) as defined by `FuncSignature`, but with register or stack address
+//! (and other metadata) assigned.
+struct FuncValue {
+ //! \name Constants
+ //! \{
+
+ enum Bits : uint32_t {
+ kTypeIdShift = 0, //!< TypeId shift.
+ kTypeIdMask = 0x000000FFu, //!< TypeId mask.
+
+ kFlagIsReg = 0x00000100u, //!< Passed by register.
+ kFlagIsStack = 0x00000200u, //!< Passed by stack.
+ kFlagIsIndirect = 0x00000400u, //!< Passed indirectly by reference (internally a pointer).
+ kFlagIsDone = 0x00000800u, //!< Used internally by arguments allocator.
+
+ kStackOffsetShift = 12, //!< Stack offset shift.
+ kStackOffsetMask = 0xFFFFF000u, //!< Stack offset mask (must occupy MSB bits).
+
+ kRegIdShift = 16, //!< RegId shift.
+ kRegIdMask = 0x00FF0000u, //!< RegId mask.
+
+ kRegTypeShift = 24, //!< RegType shift.
+ kRegTypeMask = 0xFF000000u //!< RegType mask.
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint32_t _data;
+
+ //! \}
+
+ //! \name Initialization & Reset
+ //!
+ //! These initialize the whole `FuncValue` to either register or stack. Useful when you know all of these
+ //! properties and wanna just set it up.
+ //!
+ //! \{
+
+ //! Initializes this `FuncValue` only to the `type_id` provided - the rest of the values will be cleared.
+ ASMJIT_INLINE_NODEBUG void init_type_id(TypeId type_id) noexcept {
+ _data = uint32_t(type_id) << kTypeIdShift;
+ }
+
+ //! Initializes this `FuncValue` to a register of `reg_type`, `reg_id`, and assigns its `type_id` and `flags`.
+ ASMJIT_INLINE_NODEBUG void init_reg(RegType reg_type, uint32_t reg_id, TypeId type_id, uint32_t flags = 0) noexcept {
+ _data = (uint32_t(reg_type) << kRegTypeShift) | (reg_id << kRegIdShift) | (uint32_t(type_id) << kTypeIdShift) | kFlagIsReg | flags;
+ }
+
+ //! Initializes this `FuncValue` to a stack at the given `offset` and assigns its `type_id`.
+ ASMJIT_INLINE_NODEBUG void init_stack(int32_t offset, TypeId type_id) noexcept {
+ _data = (uint32_t(offset) << kStackOffsetShift) | (uint32_t(type_id) << kTypeIdShift) | kFlagIsStack;
+ }
+
+ //! Resets the value to its unassigned state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _data = 0; }
+
+ //! \}
+
+ //! \name Assign
+ //!
+ //! These initialize only part of `FuncValue`, useful when building `FuncValue` incrementally. The caller
+ //! should first init the type-id by calling `init_type_id` and then continue building either register or stack.
+ //!
+ //! \{
+
+ //! Assigns a register of `reg_type` and `reg_id`.
+ ASMJIT_INLINE void assign_reg_data(RegType reg_type, uint32_t reg_id) noexcept {
+ ASMJIT_ASSERT((_data & (kRegTypeMask | kRegIdMask)) == 0);
+ _data |= (uint32_t(reg_type) << kRegTypeShift) | (reg_id << kRegIdShift) | kFlagIsReg;
+ }
+
+ //! Assigns a stack location at `offset`.
+ ASMJIT_INLINE void assign_stack_offset(int32_t offset) noexcept {
+ ASMJIT_ASSERT((_data & kStackOffsetMask) == 0);
+ _data |= (uint32_t(offset) << kStackOffsetShift) | kFlagIsStack;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns true if the value is initialized (explicit bool cast).
+ ASMJIT_INLINE_NODEBUG explicit operator bool() const noexcept { return _data != 0; }
+
+ //! \cond INTERNAL
+ ASMJIT_INLINE_NODEBUG void _replace_value(uint32_t mask, uint32_t value) noexcept { _data = (_data & ~mask) | value; }
+ //! \endcond
+
+ //! Tests whether the `FuncValue` has a flag `flag` set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(uint32_t flag) const noexcept { return Support::test(_data, flag); }
+
+ //! Adds `flags` to `FuncValue`.
+ ASMJIT_INLINE_NODEBUG void add_flags(uint32_t flags) noexcept { _data |= flags; }
+
+ //! Clears `flags` of `FuncValue`.
+ ASMJIT_INLINE_NODEBUG void clear_flags(uint32_t flags) noexcept { _data &= ~flags; }
+
+ //! Tests whether the value is initialized (i.e. contains a valid data).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_initialized() const noexcept { return _data != 0; }
+
+ //! Tests whether the argument is passed by register.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_reg() const noexcept { return has_flag(kFlagIsReg); }
+
+ //! Tests whether the argument is passed by stack.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_stack() const noexcept { return has_flag(kFlagIsStack); }
+
+ //! Tests whether the argument is passed by register.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_assigned() const noexcept { return has_flag(kFlagIsReg | kFlagIsStack); }
+
+ //! Tests whether the argument is passed through a pointer (used by WIN64 to pass XMM|YMM|ZMM).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_indirect() const noexcept { return has_flag(kFlagIsIndirect); }
+
+ //! Tests whether the argument was already processed (used internally).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_done() const noexcept { return has_flag(kFlagIsDone); }
+
+ //! Returns a register type of the register used to pass function argument or return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegType reg_type() const noexcept { return RegType((_data & kRegTypeMask) >> kRegTypeShift); }
+
+ //! Sets a register type of the register used to pass function argument or return value.
+ ASMJIT_INLINE_NODEBUG void set_reg_type(RegType reg_type) noexcept { _replace_value(kRegTypeMask, uint32_t(reg_type) << kRegTypeShift); }
+
+ //! Returns a physical id of the register used to pass function argument or return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t reg_id() const noexcept { return (_data & kRegIdMask) >> kRegIdShift; }
+
+ //! Sets a physical id of the register used to pass function argument or return value.
+ ASMJIT_INLINE_NODEBUG void set_reg_id(uint32_t reg_id) noexcept { _replace_value(kRegIdMask, reg_id << kRegIdShift); }
+
+ //! Returns a stack offset of this argument.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG int32_t stack_offset() const noexcept { return int32_t(_data & kStackOffsetMask) >> kStackOffsetShift; }
+
+ //! Sets a stack offset of this argument.
+ ASMJIT_INLINE_NODEBUG void set_stack_offset(int32_t offset) noexcept { _replace_value(kStackOffsetMask, uint32_t(offset) << kStackOffsetShift); }
+
+ //! Tests whether the argument or return value has associated `TypeId`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_type_id() const noexcept { return Support::test(_data, kTypeIdMask); }
+
+ //! Returns a TypeId of this argument or return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG TypeId type_id() const noexcept { return TypeId((_data & kTypeIdMask) >> kTypeIdShift); }
+
+ //! Sets a TypeId of this argument or return value.
+ ASMJIT_INLINE_NODEBUG void set_type_id(TypeId type_id) noexcept { _replace_value(kTypeIdMask, uint32_t(type_id) << kTypeIdShift); }
+
+ //! \}
+};
+
+//! Contains multiple `FuncValue` instances in an array so functions that use multiple registers for arguments or
+//! return values can represent all inputs and outputs.
+struct FuncValuePack {
+public:
+ //! \name Members
+ //! \{
+
+ //! Values of the pack.
+ FuncValue _values[Globals::kMaxValuePack];
+
+ //! \}
+
+ //! \name Initialization & Reset
+ //! \{
+
+ //! Resets all values in the pack.
+ ASMJIT_INLINE void reset() noexcept {
+ for (FuncValue& value : _values) {
+ value.reset();
+ }
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Calculates how many values are in the pack, checking for non-values from the end.
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t count() const noexcept {
+ uint32_t n = Globals::kMaxValuePack;
+ while (n && !_values[n - 1])
+ n--;
+ return n;
+ }
+
+ //! Returns values in this value in the pack.
+ //!
+ //! \note The returned array has exactly \ref Globals::kMaxValuePack elements.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncValue* values() noexcept { return _values; }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncValue* values() const noexcept { return _values; }
+
+ //! Resets a value at the given `index` in the pack, which makes it unassigned.
+ ASMJIT_INLINE void reset_value(size_t index) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ _values[index].reset();
+ }
+
+ //! Tests whether the value at the given `index` in the pack is assigned.
+ ASMJIT_INLINE bool has_value(size_t index) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ return _values[index].is_initialized();
+ }
+
+ //! Assigns a register at the given `index` to `reg` and an optional `type_id`.
+ ASMJIT_INLINE void assign_reg(size_t index, const Reg& reg, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ ASMJIT_ASSERT(reg.is_phys_reg());
+ _values[index].init_reg(reg.reg_type(), reg.id(), type_id);
+ }
+
+ //! Assigns a register at the given `index` to `reg_type`, `reg_id`, and an optional `type_id`.
+ ASMJIT_INLINE void assign_reg(size_t index, RegType reg_type, uint32_t reg_id, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ _values[index].init_reg(reg_type, reg_id, type_id);
+ }
+
+ //! Assigns a stack location at the given `index` to `offset` and an optional `type_id`.
+ ASMJIT_INLINE void assign_stack(size_t index, int32_t offset, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ _values[index].init_stack(offset, type_id);
+ }
+
+ //! Accesses the value in the pack at the given `index`.
+ //!
+ //! \note The maximum index value is `Globals::kMaxValuePack - 1`.
+ [[nodiscard]]
+ ASMJIT_INLINE FuncValue& operator[](size_t index) {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ return _values[index];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE const FuncValue& operator[](size_t index) const {
+ ASMJIT_ASSERT(index < Globals::kMaxValuePack);
+ return _values[index];
+ }
+
+ //! \}
+};
+
+//! Attributes are designed in a way that all are initially false, and user or \ref FuncFrame finalizer adds
+//! them when necessary.
+enum class FuncAttributes : uint32_t {
+ //! No attributes.
+ kNoAttributes = 0,
+
+ //! Function has variable number of arguments.
+ kHasVarArgs = 0x00000001u,
+ //! Preserve frame pointer (don't omit FP).
+ kHasPreservedFP = 0x00000010u,
+ //! Function calls other functions (is not leaf).
+ kHasFuncCalls = 0x00000020u,
+ //! Function has aligned save/restore of vector registers.
+ kAlignedVecSR = 0x00000040u,
+ //! Function must begin with an instruction that marks a start of a branch or function.
+ //!
+ //! - `ENDBR32/ENDBR64` instruction is inserted at the beginning of the function (X86|X86_64).
+ //! - `BTI` instruction is inserted at the beginning of the function (AArch64).
+ kIndirectBranchProtection = 0x00000080u,
+ //! FuncFrame is finalized and can be used by prolog/epilog inserter (PEI).
+ kIsFinalized = 0x00000800u,
+
+ // X86 Specific Attributes
+ // -----------------------
+
+ //! Enables the use of AVX within the function's body, prolog, and epilog (X86|X86_64).
+ //!
+ //! This flag instructs prolog and epilog emitter to use AVX instead of SSE for manipulating XMM registers.
+ kX86_AVXEnabled = 0x00010000u,
+
+ //! Enables the use of AVX-512 within the function's body, prolog, and epilog (X86|X86_64).
+ //!
+ //! This flag instructs Compiler register allocator to use additional 16 registers introduced by AVX-512.
+ //! Additionally, if the functions saves full width of ZMM registers (custom calling conventions only) then
+ //! the prolog/epilog inserter would use AVX-512 move instructions to emit the save and restore sequence.
+ kX86_AVX512Enabled = 0x00020000u,
+
+ //! This flag instructs the epilog writer to emit EMMS instruction before RET (X86|X86_64).
+ kX86_MMXCleanup = 0x00040000u,
+
+ //! This flag instructs the epilog writer to emit VZEROUPPER instruction before RET (X86|X86_64).
+ kX86_AVXCleanup = 0x00080000u,
+
+ //! This flag instructs the epilog writer to emit VZEROUPPER only if there are dirty vector registers (X86|X86_64).
+ kX86_AVXAutoCleanup = 0x00100000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(FuncAttributes)
+
+//! Function detail - \ref CallConv and expanded \ref FuncSignature.
+//!
+//! Function detail is architecture and OS dependent representation of a function. It contains a materialized
+//! calling convention and expanded function signature so all arguments have assigned either register type/id
+//! or stack address.
+class FuncDetail {
+public:
+ //! \name Constants
+ //! \{
+
+ //! Function doesn't have a variable number of arguments (`...`).
+ static inline constexpr uint8_t kNoVarArgs = 0xFFu;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Calling convention.
+ CallConv _call_conv {};
+ //! Number of function arguments.
+ uint8_t _arg_count = 0;
+ //! Variable arguments index of `kNoVarArgs`.
+ uint8_t _va_index = 0;
+ //! Reserved for future use.
+ uint16_t _reserved = 0;
+ //! Registers that contain arguments.
+ Support::Array<RegMask, Globals::kNumVirtGroups> _used_regs {};
+ //! Size of arguments passed by stack.
+ uint32_t _arg_stack_size = 0;
+ //! Function return value(s).
+ FuncValuePack _rets {};
+ //! Function arguments.
+ FuncValuePack _args[Globals::kMaxFuncArgs] {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default constructed \ref FuncDetail.
+ ASMJIT_INLINE_NODEBUG FuncDetail() noexcept {}
+
+ //! Copy constructor.
+ //!
+ //! Function details are copyable.
+ ASMJIT_INLINE_NODEBUG FuncDetail(const FuncDetail& other) noexcept = default;
+
+ //! Initializes this `FuncDetail` to the given signature.
+ ASMJIT_API Error init(const FuncSignature& signature, const Environment& environment) noexcept;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Assignment operator, copies `other` to this \ref FuncDetail.
+ ASMJIT_INLINE_NODEBUG FuncDetail& operator=(const FuncDetail& other) noexcept = default;
+
+ //! \}
+
+ //! \name Reset
+ //! \{
+
+ //! Resets the function detail to its default constructed state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncDetail{}; }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the function's calling convention, see `CallConv`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const CallConv& call_conv() const noexcept { return _call_conv; }
+
+ //! Returns the associated calling convention flags, see `CallConv::Flags`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CallConvFlags flags() const noexcept { return _call_conv.flags(); }
+
+ //! Checks whether a CallConv `flag` is set, see `CallConv::Flags`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(CallConvFlags flag) const noexcept { return _call_conv.has_flag(flag); }
+
+ //! Tests whether the function has a return value.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_ret() const noexcept { return bool(_rets[0]); }
+
+ //! Returns the number of function arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t arg_count() const noexcept { return _arg_count; }
+
+ //! Returns function return values.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncValuePack& ret_pack() noexcept { return _rets; }
+
+ //! Returns function return values.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncValuePack& ret_pack() const noexcept { return _rets; }
+
+ //! Returns a function return value associated with the given `value_index`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncValue& ret(size_t value_index = 0) noexcept { return _rets[value_index]; }
+
+ //! Returns a function return value associated with the given `value_index` (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncValue& ret(size_t value_index = 0) const noexcept { return _rets[value_index]; }
+
+ //! Returns function argument packs array.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncValuePack* arg_packs() noexcept { return _args; }
+
+ //! Returns function argument packs array (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncValuePack* arg_packs() const noexcept { return _args; }
+
+ //! Returns function argument pack at the given `arg_index`.
+ [[nodiscard]]
+ ASMJIT_INLINE FuncValuePack& arg_pack(size_t arg_index) noexcept {
+ ASMJIT_ASSERT(arg_index < Globals::kMaxFuncArgs);
+ return _args[arg_index];
+ }
+
+ //! Returns function argument pack at the given `arg_index` (const).
+ [[nodiscard]]
+ ASMJIT_INLINE const FuncValuePack& arg_pack(size_t arg_index) const noexcept {
+ ASMJIT_ASSERT(arg_index < Globals::kMaxFuncArgs);
+ return _args[arg_index];
+ }
+
+ //! Returns an argument at `value_index` from the argument pack at the given `arg_index`.
+ [[nodiscard]]
+ ASMJIT_INLINE FuncValue& arg(size_t arg_index, size_t value_index = 0) noexcept {
+ ASMJIT_ASSERT(arg_index < Globals::kMaxFuncArgs);
+ return _args[arg_index][value_index];
+ }
+
+ //! Returns an argument at `value_index` from the argument pack at the given `arg_index` (const).
+ [[nodiscard]]
+ ASMJIT_INLINE const FuncValue& arg(size_t arg_index, size_t value_index = 0) const noexcept {
+ ASMJIT_ASSERT(arg_index < Globals::kMaxFuncArgs);
+ return _args[arg_index][value_index];
+ }
+
+ //! Resets an argument at the given `arg_index`.
+ //!
+ //! If the argument is a parameter pack (has multiple values) all values are reset.
+ ASMJIT_INLINE void reset_arg(size_t arg_index) noexcept {
+ ASMJIT_ASSERT(arg_index < Globals::kMaxFuncArgs);
+ _args[arg_index].reset();
+ }
+
+ //! Tests whether the function has variable arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_var_args() const noexcept { return _va_index != kNoVarArgs; }
+
+ //! Returns an index of a first variable argument.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t va_index() const noexcept { return _va_index; }
+
+ //! Tests whether the function passes one or more argument by stack.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_stack_args() const noexcept { return _arg_stack_size != 0; }
+
+ //! Returns stack size needed for function arguments passed on the stack.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t arg_stack_size() const noexcept { return _arg_stack_size; }
+
+ //! Returns red zone size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t red_zone_size() const noexcept { return _call_conv.red_zone_size(); }
+
+ //! Returns spill zone size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t spill_zone_size() const noexcept { return _call_conv.spill_zone_size(); }
+
+ //! Returns natural stack alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t natural_stack_alignment() const noexcept { return _call_conv.natural_stack_alignment(); }
+
+ //! Returns a mask of all passed registers of the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask passed_regs(RegGroup group) const noexcept { return _call_conv.passed_regs(group); }
+
+ //! Returns a mask of all preserved registers of the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask preserved_regs(RegGroup group) const noexcept { return _call_conv.preserved_regs(group); }
+
+ //! Returns a mask of all used registers of the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE RegMask used_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _used_regs[size_t(group)];
+ }
+
+ //! Adds `regs` to the mask of used registers of the given register `group`.
+ ASMJIT_INLINE void add_used_regs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _used_regs[size_t(group)] |= regs;
+ }
+
+ //! \}
+};
+
+//! Function frame.
+//!
+//! Function frame is used directly by prolog and epilog insertion (PEI) utils. It provides information necessary to
+//! insert a proper and ABI conforming prolog and epilog. Function frame calculation is based on `CallConv` and
+//! other function attributes.
+//!
+//! SSE vs AVX vs AVX-512
+//! ---------------------
+//!
+//! Function frame provides a way to tell prolog/epilog inserter to use AVX instructions instead of SSE. Use
+//! `set_avx_enabled()` and `set_avx512_enabled()` to enable AVX and/or AVX-512, respectively. Enabling AVX-512
+//! is mostly for Compiler as it would use 32 SIMD registers instead of 16 when enabled.
+//!
+//! \note If your code uses AVX instructions and AVX is not enabled there would be a performance hit in case that
+//! some registers had to be saved/restored in function's prolog/epilog, respectively. Thus, it's recommended to
+//! always let the function frame know about the use of AVX.
+//!
+//! Function Frame Structure
+//! ------------------------
+//!
+//! Various properties can contribute to the size and structure of the function frame. The function frame in most
+//! cases won't use all of the properties illustrated (for example Spill Zone and Red Zone are never used together).
+//!
+//! ```
+//! +-----------------------------+
+//! | Arguments Passed by Stack |
+//! +-----------------------------+
+//! | Spill Zone |
+//! +-----------------------------+ <- Stack offset (args) starts from here.
+//! | Return Address, if Pushed |
+//! +-----------------------------+ <- Stack pointer (SP) upon entry.
+//! | Save/Restore Stack. |
+//! +-----------------------------+-----------------------------+
+//! | Local Stack | |
+//! +-----------------------------+ Final Stack |
+//! | Call Stack | |
+//! +-----------------------------+-----------------------------+ <- SP after prolog.
+//! | Red Zone |
+//! +-----------------------------+
+//! ```
+class FuncFrame {
+public:
+ //! \name Constants
+ //! \{
+
+ //! Tag used to inform that some offset is invalid.
+ static inline constexpr uint32_t kTagInvalidOffset = 0xFFFFFFFFu;
+
+ //! \}
+
+ //! \name Types
+ //! \{
+
+ using RegMasks = Support::Array<RegMask, Globals::kNumVirtGroups>;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Function attributes.
+ FuncAttributes _attributes {};
+
+ //! Target architecture.
+ Arch _arch {};
+ //! SP register ID (to access call stack and local stack).
+ uint8_t _sp_reg_id = uint8_t(Reg::kIdBad);
+ //! SA register ID (to access stack arguments).
+ uint8_t _sa_reg_id = uint8_t(Reg::kIdBad);
+
+ //! Red zone size (copied from CallConv).
+ uint8_t _red_zone_size = 0;
+ //! Spill zone size (copied from CallConv).
+ uint8_t _spill_zone_size = 0;
+ //! Natural stack alignment (copied from CallConv).
+ uint8_t _natural_stack_alignment = 0;
+ //! Minimum stack alignment to turn on dynamic alignment.
+ uint8_t _min_dynamic_alignment = 0;
+
+ //! Call stack alignment.
+ uint8_t _call_stack_alignment = 0;
+ //! Local stack alignment.
+ uint8_t _local_stack_alignment = 0;
+ //! Final stack alignment.
+ uint8_t _final_stack_alignment = 0;
+
+ //! Adjustment of the stack before returning (X86-STDCALL).
+ uint16_t _callee_stack_cleanup = 0;
+
+ //! Call stack size.
+ uint32_t _call_stack_size = 0;
+ //! Local stack size.
+ uint32_t _local_stack_size = 0;
+ //! Final stack size (sum of call stack and local stack).
+ uint32_t _final_stack_size = 0;
+
+ //! Local stack offset (non-zero only if call stack is used).
+ uint32_t _local_stack_offset = 0;
+ //! Offset relative to SP that contains previous SP (before alignment).
+ uint32_t _da_offset = 0;
+ //! Offset of the first stack argument relative to SP.
+ uint32_t _sa_offset_from_sp = 0;
+ //! Offset of the first stack argument relative to SA (_sa_reg_id or FP).
+ uint32_t _sa_offset_from_sa = 0;
+
+ //! Local stack adjustment in prolog/epilog.
+ uint32_t _stack_adjustment = 0;
+
+ //! Registers that are dirty.
+ RegMasks _dirty_regs {};
+ //! Registers that must be preserved (copied from CallConv).
+ RegMasks _preserved_regs {};
+ //! Registers that are unavailable.
+ RegMasks _unavailable_regs {};
+ //! Size to save/restore per register group.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _save_restore_reg_size {};
+ //! Alignment of save/restore area per register group.
+ Support::Array<uint8_t, Globals::kNumVirtGroups> _save_restore_alignment {};
+
+ //! Stack size required to save registers with push/pop.
+ uint16_t _push_pop_save_size = 0;
+ //! Stack size required to save extra registers that cannot use push/pop.
+ uint16_t _extra_reg_save_size = 0;
+ //! Offset where registers saved/restored via push/pop are stored
+ uint32_t _push_pop_save_offset = 0;
+ //! Offset where extra registers that cannot use push/pop are stored.
+ uint32_t _extra_reg_save_offset = 0;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default constructed function frame, which has initialized all members to their default values.
+ ASMJIT_INLINE_NODEBUG FuncFrame() noexcept = default;
+ //! Creates a copy of `other` function frame.
+ ASMJIT_INLINE_NODEBUG FuncFrame(const FuncFrame& other) noexcept = default;
+
+ //! \}
+
+ //! \name Initialization & Reset
+ //! \{
+
+ //! Initializes the function frame based on `func` detail.
+ ASMJIT_API Error init(const FuncDetail& func) noexcept;
+ //! Resets the function frame into its default constructed state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncFrame{}; }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Copy assignment - function frame is copy assignable.
+ ASMJIT_INLINE_NODEBUG FuncFrame& operator=(const FuncFrame& other) noexcept = default;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the target architecture of the function frame.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
+
+ //! Returns function frame attributes, see `Attributes`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncAttributes attributes() const noexcept { return _attributes; }
+
+ //! Checks whether the FuncFame contains an attribute `attr`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_attribute(FuncAttributes attr) const noexcept { return Support::test(_attributes, attr); }
+
+ //! Adds attributes `attrs` to the FuncFrame.
+ ASMJIT_INLINE_NODEBUG void add_attributes(FuncAttributes attrs) noexcept { _attributes |= attrs; }
+
+ //! Clears attributes `attrs` from the FrameFrame.
+ ASMJIT_INLINE_NODEBUG void clear_attributes(FuncAttributes attrs) noexcept { _attributes &= ~attrs; }
+
+ //! Tests whether the function has variable number of arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_var_args() const noexcept { return has_attribute(FuncAttributes::kHasVarArgs); }
+
+ //! Sets the variable arguments flag.
+ ASMJIT_INLINE_NODEBUG void set_var_args() noexcept { add_attributes(FuncAttributes::kHasVarArgs); }
+
+ //! Resets variable arguments flag.
+ ASMJIT_INLINE_NODEBUG void reset_var_args() noexcept { clear_attributes(FuncAttributes::kHasVarArgs); }
+
+ //! Tests whether the function preserves frame pointer (EBP|ESP on X86).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_preserved_fp() const noexcept { return has_attribute(FuncAttributes::kHasPreservedFP); }
+
+ //! Enables preserved frame pointer.
+ ASMJIT_INLINE_NODEBUG void set_preserved_fp() noexcept { add_attributes(FuncAttributes::kHasPreservedFP); }
+
+ //! Disables preserved frame pointer.
+ ASMJIT_INLINE_NODEBUG void reset_preserved_fp() noexcept { clear_attributes(FuncAttributes::kHasPreservedFP); }
+
+ //! Tests whether the function calls other functions.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_func_calls() const noexcept { return has_attribute(FuncAttributes::kHasFuncCalls); }
+
+ //! Sets `FuncAttributes::kHasFuncCalls` to true.
+ ASMJIT_INLINE_NODEBUG void set_func_calls() noexcept { add_attributes(FuncAttributes::kHasFuncCalls); }
+
+ //! Sets `FuncAttributes::kHasFuncCalls` to false.
+ ASMJIT_INLINE_NODEBUG void reset_func_calls() noexcept { clear_attributes(FuncAttributes::kHasFuncCalls); }
+
+ //! Tests whether the function uses indirect branch protection, see \ref FuncAttributes::kIndirectBranchProtection.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_indirect_branch_protection() const noexcept { return has_attribute(FuncAttributes::kIndirectBranchProtection); }
+
+ //! Enabled indirect branch protection (sets `FuncAttributes::kIndirectBranchProtection` attribute to true).
+ ASMJIT_INLINE_NODEBUG void set_indirect_branch_protection() noexcept { add_attributes(FuncAttributes::kIndirectBranchProtection); }
+
+ //! Disables indirect branch protection (sets `FuncAttributes::kIndirectBranchProtection` attribute to false).
+ ASMJIT_INLINE_NODEBUG void reset_indirect_branch_protection() noexcept { clear_attributes(FuncAttributes::kIndirectBranchProtection); }
+
+ //! Tests whether the function has AVX enabled.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_avx_enabled() const noexcept { return has_attribute(FuncAttributes::kX86_AVXEnabled); }
+
+ //! Enables AVX use.
+ ASMJIT_INLINE_NODEBUG void set_avx_enabled() noexcept { add_attributes(FuncAttributes::kX86_AVXEnabled); }
+
+ //! Disables AVX use.
+ ASMJIT_INLINE_NODEBUG void reset_avx_enabled() noexcept { clear_attributes(FuncAttributes::kX86_AVXEnabled); }
+
+ //! Tests whether the function has AVX-512 enabled.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_avx512_enabled() const noexcept { return has_attribute(FuncAttributes::kX86_AVX512Enabled); }
+
+ //! Enables AVX-512 use.
+ ASMJIT_INLINE_NODEBUG void set_avx512_enabled() noexcept { add_attributes(FuncAttributes::kX86_AVX512Enabled); }
+
+ //! Disables AVX-512 use.
+ ASMJIT_INLINE_NODEBUG void reset_avx512_enabled() noexcept { clear_attributes(FuncAttributes::kX86_AVX512Enabled); }
+
+ //! Tests whether the function has MMX cleanup - 'emms' instruction in epilog.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_mmx_cleanup() const noexcept { return has_attribute(FuncAttributes::kX86_MMXCleanup); }
+
+ //! Enables MMX cleanup.
+ ASMJIT_INLINE_NODEBUG void set_mmx_cleanup() noexcept { add_attributes(FuncAttributes::kX86_MMXCleanup); }
+
+ //! Disables MMX cleanup.
+ ASMJIT_INLINE_NODEBUG void reset_mmx_cleanup() noexcept { clear_attributes(FuncAttributes::kX86_MMXCleanup); }
+
+ //! Tests whether the function has AVX cleanup - 'vzeroupper' instruction in epilog.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx_cleanup() const noexcept { return has_attribute(FuncAttributes::kX86_AVXCleanup); }
+
+ //! Enables AVX cleanup.
+ ASMJIT_INLINE_NODEBUG void set_avx_cleanup() noexcept { add_attributes(FuncAttributes::kX86_AVXCleanup); }
+
+ //! Disables AVX cleanup.
+ ASMJIT_INLINE_NODEBUG void reset_avx_cleanup() noexcept { clear_attributes(FuncAttributes::kX86_AVXCleanup); }
+
+ //! Tests whether the function has automatic AVX cleanup - 'vzeroupper' instruction in epilog when vector registers are
+ //! used.
+ //!
+ //! \note Automatic cleanup is currently determined via dirty registers, which are provided by \ref FuncFrame.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx_auto_cleanup() const noexcept { return has_attribute(FuncAttributes::kX86_AVXAutoCleanup); }
+
+ //! Enables AVX automatic cleanup.
+ ASMJIT_INLINE_NODEBUG void set_avx_auto_cleanup() noexcept { add_attributes(FuncAttributes::kX86_AVXAutoCleanup); }
+
+ //! Disables AVX automatic cleanup.
+ ASMJIT_INLINE_NODEBUG void reset_avx_auto_cleanup() noexcept { clear_attributes(FuncAttributes::kX86_AVXAutoCleanup); }
+
+ //! Tests whether the function uses call stack.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_call_stack() const noexcept { return _call_stack_size != 0; }
+
+ //! Tests whether the function uses local stack.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_local_stack() const noexcept { return _local_stack_size != 0; }
+
+ //! Tests whether vector registers can be saved and restored by using aligned reads and writes.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_aligned_vec_save_restore() const noexcept { return has_attribute(FuncAttributes::kAlignedVecSR); }
+
+ //! Tests whether the function has to align stack dynamically.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_dynamic_alignment() const noexcept { return _final_stack_alignment >= _min_dynamic_alignment; }
+
+ //! Tests whether the calling convention specifies 'Red Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_red_zone() const noexcept { return _red_zone_size != 0; }
+
+ //! Returns the size of 'Red Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t red_zone_size() const noexcept { return _red_zone_size; }
+
+ //! Tests whether the calling convention specifies 'Spill Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_spill_zone() const noexcept { return _spill_zone_size != 0; }
+
+ //! Returns the size of 'Spill Zone'.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t spill_zone_size() const noexcept { return _spill_zone_size; }
+
+ //! Resets the size of red zone, which would disable it entirely.
+ //!
+ //! \note Red zone is currently only used by an AMD64 SystemV calling convention, which expects 128
+ //! bytes of stack to be accessible below stack pointer. These bytes are then accessible within the
+ //! function and Compiler can use this space as a spill area. However, sometimes it's better to
+ //! disallow the use of red zone in case that a user wants to use this stack for a custom purpose.
+ ASMJIT_INLINE_NODEBUG void reset_red_zone() noexcept { _red_zone_size = 0; }
+
+ //! Returns natural stack alignment (guaranteed stack alignment upon entry).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t natural_stack_alignment() const noexcept { return _natural_stack_alignment; }
+
+ //! Returns natural stack alignment (guaranteed stack alignment upon entry).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t min_dynamic_alignment() const noexcept { return _min_dynamic_alignment; }
+
+ //! Tests whether the callee must adjust SP before returning (X86-STDCALL only)
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_callee_stack_cleanup() const noexcept { return _callee_stack_cleanup != 0; }
+
+ //! Returns home many bytes of the stack the callee must adjust before returning (X86-STDCALL only)
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t callee_stack_cleanup() const noexcept { return _callee_stack_cleanup; }
+
+ //! Returns call stack alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t call_stack_alignment() const noexcept { return _call_stack_alignment; }
+
+ //! Returns local stack alignment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t local_stack_alignment() const noexcept { return _local_stack_alignment; }
+
+ //! Returns final stack alignment (the maximum value of call, local, and natural stack alignments).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t final_stack_alignment() const noexcept { return _final_stack_alignment; }
+
+ //! Sets call stack alignment.
+ //!
+ //! \note This also updates the final stack alignment.
+ ASMJIT_INLINE void set_call_stack_alignment(uint32_t alignment) noexcept {
+ _call_stack_alignment = uint8_t(alignment);
+ _final_stack_alignment = Support::max(_natural_stack_alignment, _call_stack_alignment, _local_stack_alignment);
+ }
+
+ //! Sets local stack alignment.
+ //!
+ //! \note This also updates the final stack alignment.
+ ASMJIT_INLINE void set_local_stack_alignment(uint32_t value) noexcept {
+ _local_stack_alignment = uint8_t(value);
+ _final_stack_alignment = Support::max(_natural_stack_alignment, _call_stack_alignment, _local_stack_alignment);
+ }
+
+ //! Combines call stack alignment with `alignment`, updating it to the greater value.
+ //!
+ //! \note This also updates the final stack alignment.
+ ASMJIT_INLINE void update_call_stack_alignment(uint32_t alignment) noexcept {
+ _call_stack_alignment = uint8_t(Support::max<uint32_t>(_call_stack_alignment, alignment));
+ _final_stack_alignment = Support::max(_final_stack_alignment, _call_stack_alignment);
+ }
+
+ //! Combines local stack alignment with `alignment`, updating it to the greater value.
+ //!
+ //! \note This also updates the final stack alignment.
+ ASMJIT_INLINE void update_local_stack_alignment(uint32_t alignment) noexcept {
+ _local_stack_alignment = uint8_t(Support::max<uint32_t>(_local_stack_alignment, alignment));
+ _final_stack_alignment = Support::max(_final_stack_alignment, _local_stack_alignment);
+ }
+
+ //! Returns call stack size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t call_stack_size() const noexcept { return _call_stack_size; }
+
+ //! Returns local stack size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t local_stack_size() const noexcept { return _local_stack_size; }
+
+ //! Sets call stack size.
+ ASMJIT_INLINE_NODEBUG void set_call_stack_size(uint32_t size) noexcept { _call_stack_size = size; }
+
+ //! Sets local stack size.
+ ASMJIT_INLINE_NODEBUG void set_local_stack_size(uint32_t size) noexcept { _local_stack_size = size; }
+
+ //! Combines call stack size with `size`, updating it to the greater value.
+ ASMJIT_INLINE_NODEBUG void update_call_stack_size(uint32_t size) noexcept { _call_stack_size = Support::max(_call_stack_size, size); }
+
+ //! Combines local stack size with `size`, updating it to the greater value.
+ ASMJIT_INLINE_NODEBUG void update_local_stack_size(uint32_t size) noexcept { _local_stack_size = Support::max(_local_stack_size, size); }
+
+ //! Returns final stack size (only valid after the FuncFrame is finalized).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t final_stack_size() const noexcept { return _final_stack_size; }
+
+ //! Returns an offset to access the local stack (non-zero only if call stack is used).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t local_stack_offset() const noexcept { return _local_stack_offset; }
+
+ //! Tests whether the function prolog/epilog requires a memory slot for storing unaligned SP.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_da_offset() const noexcept { return _da_offset != kTagInvalidOffset; }
+
+ //! Returns a memory offset used to store DA (dynamic alignment) slot (relative to SP).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t da_offset() const noexcept { return _da_offset; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t sa_offset(uint32_t reg_id) const noexcept {
+ return reg_id == _sp_reg_id ? sa_offset_from_sp() : sa_offset_from_sa();
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t sa_offset_from_sp() const noexcept { return _sa_offset_from_sp; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t sa_offset_from_sa() const noexcept { return _sa_offset_from_sa; }
+
+ //! Returns mask of registers of the given register `group` that are modified by the function. The engine would
+ //! then calculate which registers must be saved & restored by the function by using the data provided by the
+ //! calling convention.
+ [[nodiscard]]
+ inline RegMask dirty_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _dirty_regs[group];
+ }
+
+ //! Sets which registers (as a mask) are modified by the function.
+ //!
+ //! \remarks Please note that this will completely overwrite the existing register mask, use `add_dirty_regs()`
+ //! to modify the existing register mask.
+ inline void set_dirty_regs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _dirty_regs[group] = regs;
+ }
+
+ //! Adds which registers (as a mask) are modified by the function.
+ inline void add_dirty_regs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _dirty_regs[group] |= regs;
+ }
+
+ //! \overload
+ inline void add_dirty_regs(const Reg& reg) noexcept {
+ ASMJIT_ASSERT(reg.id() < Globals::kMaxPhysRegs);
+ add_dirty_regs(reg.reg_group(), Support::bit_mask<RegMask>(reg.id()));
+ }
+
+ //! \overload
+ template<typename... Args>
+ inline void add_dirty_regs(const Reg& reg, Args&&... args) noexcept {
+ add_dirty_regs(reg);
+ add_dirty_regs(std::forward<Args>(args)...);
+ }
+
+ //! A helper function to set all registers from all register groups dirty.
+ //!
+ //! \note This should not be used in general as it's the most pessimistic case. However, it can be used for testing
+ //! or in cases in which all registers are considered clobbered.
+ ASMJIT_INLINE_NODEBUG void set_all_dirty() noexcept {
+ for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_dirty_regs); i++) {
+ _dirty_regs[i] = 0xFFFFFFFFu;
+ }
+ }
+
+ //! A helper function to set all registers from the given register `group` dirty.
+ ASMJIT_INLINE void set_all_dirty(RegGroup group) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _dirty_regs[group] = 0xFFFFFFFFu;
+ }
+
+ //! Returns a calculated mask of registers of the given `group` that will be saved and restored in the function's
+ //! prolog and epilog, respectively. The register mask is calculated from both `dirty_regs` (provided by user) and
+ //! `preserved_mask` (provided by the calling convention).
+ [[nodiscard]]
+ ASMJIT_INLINE RegMask saved_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _dirty_regs[group] & _preserved_regs[group];
+ }
+
+ //! Returns all dirty registers as a Support::Array<> type.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RegMasks& dirty_regs() const noexcept { return _dirty_regs; }
+
+ //! Returns all preserved registers as a Support::Array<> type.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RegMasks& preserved_regs() const noexcept { return _preserved_regs; }
+
+ //! Returns the mask of preserved registers of the given register `group`.
+ //!
+ //! Preserved registers are those that must survive the function call unmodified. The function can only modify
+ //! preserved registers it they are saved and restored in function's prolog and epilog, respectively.
+ [[nodiscard]]
+ ASMJIT_INLINE RegMask preserved_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _preserved_regs[group];
+ }
+
+ //! Sets which registers (as a mask) are unavailable for allocation.
+ //!
+ //! \note This completely overwrites the current unavailable mask.
+ ASMJIT_INLINE void set_unavailable_regs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _unavailable_regs[group] = regs;
+ }
+
+ //! Adds registers (as a mask) to the unavailable set.
+ ASMJIT_INLINE void add_unavailable_regs(RegGroup group, RegMask regs) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _unavailable_regs[group] |= regs;
+ }
+
+ //! Adds a single register to the unavailable set.
+ ASMJIT_INLINE void add_unavailable_regs(const Reg& reg) noexcept {
+ ASMJIT_ASSERT(reg.id() < Globals::kMaxPhysRegs);
+ add_unavailable_regs(reg.reg_group(), Support::bit_mask<RegMask>(reg.id()));
+ }
+
+ //! Adds multiple registers to the unavailable set.
+ template<typename... Args>
+ ASMJIT_INLINE void add_unavailable_regs(const Reg& reg, Args&&... args) noexcept {
+ add_unavailable_regs(reg);
+ add_unavailable_regs(std::forward<Args>(args)...);
+ }
+
+ //! Clears all unavailable registers across all register groups (i.e., makes them all available again).
+ ASMJIT_INLINE_NODEBUG void clear_unavailable_regs() noexcept {
+ for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_unavailable_regs); i++)
+ _unavailable_regs[i] = 0;
+ }
+
+ //! Clears all unavailable registers in a specific register group.
+ ASMJIT_INLINE void clear_unavailable_regs(RegGroup group) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ _unavailable_regs[group] = 0;
+ }
+
+ //! Returns the set of unavailable registers for the given group.
+ [[nodiscard]]
+ ASMJIT_INLINE RegMask unavailable_regs(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _unavailable_regs[group];
+ }
+
+ //! Returns all unavailable registers as a Support::Array<>.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RegMasks& unavailable_regs() const noexcept {
+ return _unavailable_regs;
+ }
+
+ //! Returns the size of a save-restore are for the required register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t save_restore_reg_size(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _save_restore_reg_size[group];
+ }
+
+ //! Returns the alignment that must be guaranteed to save/restore the required register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t save_restore_alignment(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ return _save_restore_alignment[group];
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_sa_reg_id() const noexcept { return _sa_reg_id != Reg::kIdBad; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t sa_reg_id() const noexcept { return _sa_reg_id; }
+
+ ASMJIT_INLINE_NODEBUG void set_sa_reg_id(uint32_t reg_id) { _sa_reg_id = uint8_t(reg_id); }
+
+ ASMJIT_INLINE_NODEBUG void reset_sa_reg_id() { set_sa_reg_id(Reg::kIdBad); }
+
+ //! Returns stack size required to save/restore registers via push/pop.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t push_pop_save_size() const noexcept { return _push_pop_save_size; }
+
+ //! Returns an offset to the stack where registers are saved via push/pop.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t push_pop_save_offset() const noexcept { return _push_pop_save_offset; }
+
+ //! Returns stack size required to save/restore extra registers that don't use push/pop/
+ //!
+ //! \note On X86 this covers all registers except GP registers, on other architectures it can be always
+ //! zero (for example AArch64 saves all registers via push/pop like instructions, so this would be zero).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t extra_reg_save_size() const noexcept { return _extra_reg_save_size; }
+
+ //! Returns an offset to the stack where extra registers are saved.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t extra_reg_save_offset() const noexcept { return _extra_reg_save_offset; }
+
+ //! Tests whether the functions contains stack adjustment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_stack_adjustment() const noexcept { return _stack_adjustment != 0; }
+
+ //! Returns function's stack adjustment used in function's prolog and epilog.
+ //!
+ //! If the returned value is zero it means that the stack is not adjusted. This can mean both that the stack
+ //! is not used and/or the stack is only adjusted by instructions that pust/pop registers into/from stack.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t stack_adjustment() const noexcept { return _stack_adjustment; }
+
+ //! \}
+
+ //! \name Finalization
+ //! \{
+
+ ASMJIT_API Error finalize() noexcept;
+
+ //! \}
+};
+
+//! A helper class that can be used to assign a physical register for each function argument. The assignment
+//! is passed to \ref BaseEmitter::emit_args_assignment() function.
+class FuncArgsAssignment {
+public:
+ //! \name Members
+ //! \{
+
+ //! Function detail.
+ const FuncDetail* _func_detail {};
+ //! Register that can be used to access arguments passed by stack.
+ uint8_t _sa_reg_id = uint8_t(Reg::kIdBad);
+ //! Reserved for future use.
+ uint8_t _reserved[3] {};
+ //! Mapping of each function argument.
+ FuncValuePack _arg_packs[Globals::kMaxFuncArgs] {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates either a default initialized `FuncArgsAssignment` or to assignment that links to `fd`, if non-null.
+ ASMJIT_INLINE_NODEBUG explicit FuncArgsAssignment(const FuncDetail* fd = nullptr) noexcept
+ : _func_detail(fd),
+ _sa_reg_id(uint8_t(Reg::kIdBad)) {}
+
+ //! Copy constructor.
+ ASMJIT_INLINE_NODEBUG FuncArgsAssignment(const FuncArgsAssignment& other) noexcept = default;
+
+ //! Resets this `FuncArgsAssignment` to either default constructed state or to assignment that links to `fd`,
+ //! if non-null.
+ ASMJIT_INLINE void reset(const FuncDetail* fd = nullptr) noexcept {
+ _func_detail = fd;
+ _sa_reg_id = uint8_t(Reg::kIdBad);
+ memset(_reserved, 0, sizeof(_reserved));
+ memset(_arg_packs, 0, sizeof(_arg_packs));
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Copy assignment.
+ ASMJIT_INLINE_NODEBUG FuncArgsAssignment& operator=(const FuncArgsAssignment& other) noexcept = default;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the associated \ref FuncDetail of this `FuncArgsAssignment`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const FuncDetail* func_detail() const noexcept { return _func_detail; }
+
+ //! Associates \ref FuncDetail with this `FuncArgsAssignment`.
+ ASMJIT_INLINE_NODEBUG void set_func_detail(const FuncDetail* fd) noexcept { _func_detail = fd; }
+
+ //! Returns whether a register to access stack arguments is available.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_sa_reg_id() const noexcept { return _sa_reg_id != Reg::kIdBad; }
+
+ //! Returns a physical ID of a register that can access stack arguments.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t sa_reg_id() const noexcept { return _sa_reg_id; }
+
+ //! Sets a physical ID of a register that can access stack arguments.
+ ASMJIT_INLINE_NODEBUG void set_sa_reg_id(uint32_t reg_id) { _sa_reg_id = uint8_t(reg_id); }
+
+ //! Resets a physical ID of a register that can access stack arguments.
+ ASMJIT_INLINE_NODEBUG void reset_sa_reg_id() { _sa_reg_id = uint8_t(Reg::kIdBad); }
+
+ //! Returns assigned argument at `arg_index` and `value_index`.
+ //!
+ //! \note `arg_index` refers to he function argument and `value_index` refers to a value pack (in case multiple
+ //! values are passed as a single argument).
+ [[nodiscard]]
+ ASMJIT_INLINE FuncValue& arg(size_t arg_index, size_t value_index) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ return _arg_packs[arg_index][value_index];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE const FuncValue& arg(size_t arg_index, size_t value_index) const noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ return _arg_packs[arg_index][value_index];
+ }
+
+ //! Tests whether argument at `arg_index` and `value_index` has been assigned.
+ [[nodiscard]]
+ ASMJIT_INLINE bool is_assigned(size_t arg_index, size_t value_index) const noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ return _arg_packs[arg_index][value_index].is_assigned();
+ }
+
+ //! Assigns register at `arg_index` and value index of 0 to `reg` and an optional `type_id`.
+ ASMJIT_INLINE void assign_reg(size_t arg_index, const Reg& reg, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ ASMJIT_ASSERT(reg.is_phys_reg());
+ _arg_packs[arg_index][0].init_reg(reg.reg_type(), reg.id(), type_id);
+ }
+
+ //! Assigns register at `arg_index` and value index of 0 to `reg_type`, `reg_id`, and an optional `type_id`.
+ ASMJIT_INLINE void assign_reg(size_t arg_index, RegType reg_type, uint32_t reg_id, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ _arg_packs[arg_index][0].init_reg(reg_type, reg_id, type_id);
+ }
+
+ //! Assigns stack at `arg_index` and value index of 0 to `offset` and an optional `type_id`.
+ ASMJIT_INLINE void assign_stack(size_t arg_index, int32_t offset, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ _arg_packs[arg_index][0].init_stack(offset, type_id);
+ }
+
+ //! Assigns register at `arg_index` and `value_index` to `reg` and an optional `type_id`.
+ ASMJIT_INLINE void assign_reg_in_pack(size_t arg_index, size_t value_index, const Reg& reg, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ ASMJIT_ASSERT(reg.is_phys_reg());
+ _arg_packs[arg_index][value_index].init_reg(reg.reg_type(), reg.id(), type_id);
+ }
+
+ //! Assigns register at `arg_index` and `value_index` to `reg_type`, `reg_id`, and an optional `type_id`.
+ ASMJIT_INLINE void assign_reg_in_pack(size_t arg_index, size_t value_index, RegType reg_type, uint32_t reg_id, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ _arg_packs[arg_index][value_index].init_reg(reg_type, reg_id, type_id);
+ }
+
+ //! Assigns stack at `arg_index` and `value_index` to `offset` and an optional `type_id`.
+ ASMJIT_INLINE void assign_stack_in_pack(size_t arg_index, size_t value_index, int32_t offset, TypeId type_id = TypeId::kVoid) noexcept {
+ ASMJIT_ASSERT(arg_index < ASMJIT_ARRAY_SIZE(_arg_packs));
+ _arg_packs[arg_index][value_index].init_stack(offset, type_id);
+ }
+
+ //! \cond INTERNAL
+ // NOTE: All `assign_all()` methods are shortcuts to assign all arguments at once, however, since registers are
+ // passed all at once these initializers don't provide any way to pass TypeId and/or to keep any argument between
+ // the arguments passed unassigned.
+ ASMJIT_INLINE void _assign_all_internal(size_t arg_index, const Reg& reg) noexcept {
+ assign_reg(arg_index, reg);
+ }
+
+ template<typename... Args>
+ ASMJIT_INLINE void _assign_all_internal(size_t arg_index, const Reg& reg, Args&&... args) noexcept {
+ assign_reg(arg_index, reg);
+ _assign_all_internal(arg_index + 1, std::forward<Args>(args)...);
+ }
+ //! \endcond
+
+ //! Assigns all argument at once.
+ //!
+ //! \note This function can be only used if the arguments don't contain value packs (multiple values per argument).
+ template<typename... Args>
+ ASMJIT_INLINE void assign_all(Args&&... args) noexcept {
+ _assign_all_internal(0, std::forward<Args>(args)...);
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Update `FuncFrame` based on function's arguments assignment.
+ //!
+ //! \note This function must be called in order to use `BaseEmitter::emit_args_assignment()`, otherwise the \ref FuncFrame
+ //! would not contain the information necessary to assign all arguments into the registers and/or stack specified.
+ ASMJIT_API Error update_func_frame(FuncFrame& frame) const noexcept;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FUNC_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/funcargscontext.cpp b/3rdparty/asmjit/asmjit/core/funcargscontext.cpp
new file mode 100644
index 00000000000..c9948bc89e9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/funcargscontext.cpp
@@ -0,0 +1,340 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/funcargscontext_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+FuncArgsContext::FuncArgsContext() noexcept {
+ for (WorkData& wd : _work_data) {
+ wd.reset();
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::init_work_data(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept {
+ Arch arch = frame.arch();
+ const FuncDetail& func = *args.func_detail();
+
+ _arch_traits = &ArchTraits::by_arch(arch);
+ _constraints = constraints;
+ _arch = arch;
+
+ // Initialize `_arch_regs`.
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ _work_data[group]._arch_regs = _constraints->available_regs(group);
+ }
+
+ if (frame.has_preserved_fp()) {
+ _work_data[size_t(RegGroup::kGp)]._arch_regs &= ~Support::bit_mask<RegMask>(arch_traits().fp_reg_id());
+ }
+
+ uint32_t reassignment_flag_mask = 0;
+
+ // Extract information from all function arguments/assignments and build Var[] array.
+ uint32_t var_id = 0;
+ uint32_t arg_count = args.func_detail()->arg_count();
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ const FuncValue& dst_ = args.arg(arg_index, value_index);
+ if (!dst_.is_assigned()) {
+ continue;
+ }
+
+ const FuncValue& src_ = func.arg(arg_index, value_index);
+ if (ASMJIT_UNLIKELY(!src_.is_assigned())) {
+ return make_error(Error::kInvalidState);
+ }
+
+ Var& var = _vars[var_id];
+ var.init(src_, dst_);
+
+ FuncValue& src = var.cur;
+ FuncValue& dst = var.out;
+
+ RegGroup dst_group = RegGroup::kMaxValue;
+ uint32_t dst_id = Reg::kIdBad;
+ WorkData* dst_wd = nullptr;
+
+ // Not supported.
+ if (src.is_indirect()) {
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ if (dst.is_reg()) {
+ RegType dst_type = dst.reg_type();
+ if (ASMJIT_UNLIKELY(!arch_traits().has_reg_type(dst_type))) {
+ return make_error(Error::kInvalidRegType);
+ }
+
+ // Copy TypeId from source if the destination doesn't have it. The RA used by BaseCompiler would never
+ // leave TypeId undefined, but users of FuncAPI can just assign phys regs without specifying their types.
+ if (!dst.has_type_id()) {
+ dst.set_type_id(RegUtils::type_id_of(dst.reg_type()));
+ }
+
+ dst_group = RegUtils::group_of(dst_type);
+ if (ASMJIT_UNLIKELY(dst_group > RegGroup::kMaxVirt)) {
+ return make_error(Error::kInvalidRegGroup);
+ }
+
+ dst_wd = &_work_data[dst_group];
+ dst_id = dst.reg_id();
+
+ if (ASMJIT_UNLIKELY(dst_id >= 32 || !Support::bit_test(dst_wd->arch_regs(), dst_id))) {
+ return make_error(Error::kInvalidPhysId);
+ }
+
+ if (ASMJIT_UNLIKELY(Support::bit_test(dst_wd->dst_regs(), dst_id))) {
+ return make_error(Error::kOverlappedRegs);
+ }
+
+ dst_wd->_dst_regs |= Support::bit_mask<RegMask>(dst_id);
+ dst_wd->_dst_shuf |= Support::bit_mask<RegMask>(dst_id);
+ dst_wd->_used_regs |= Support::bit_mask<RegMask>(dst_id);
+ }
+ else {
+ if (!dst.has_type_id()) {
+ dst.set_type_id(src.type_id());
+ }
+
+ OperandSignature signature = get_suitable_reg_for_mem_to_mem_move(arch, dst.type_id(), src.type_id());
+ if (ASMJIT_UNLIKELY(!signature.is_valid())) {
+ return make_error(Error::kInvalidState);
+ }
+ _stack_dst_mask = uint8_t(_stack_dst_mask | Support::bit_mask<uint32_t>(signature.reg_group()));
+ }
+
+ if (src.is_reg()) {
+ uint32_t src_id = src.reg_id();
+ RegGroup src_group = RegUtils::group_of(src.reg_type());
+
+ if (dst_group == src_group) {
+ ASMJIT_ASSERT(dst_wd != nullptr);
+ dst_wd->assign(var_id, src_id);
+
+ reassignment_flag_mask |= uint32_t(dst_id != src_id) << uint32_t(dst_group);
+
+ if (dst_id == src_id) {
+ // The best case, register is allocated where it is expected to be. However, we should
+ // not mark this as done if both registers are GP and sign or zero extension is required.
+ if (dst_group != RegGroup::kGp) {
+ var.mark_done();
+ }
+ else {
+ TypeId dt = dst.type_id();
+ TypeId st = src.type_id();
+
+ uint32_t dst_size = TypeUtils::size_of(dt);
+ uint32_t src_size = TypeUtils::size_of(st);
+
+ if (dt == TypeId::kVoid || st == TypeId::kVoid || dst_size <= src_size) {
+ var.mark_done();
+ }
+ }
+ }
+ }
+ else {
+ if (ASMJIT_UNLIKELY(src_group > RegGroup::kMaxVirt)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ WorkData& src_data = _work_data[size_t(src_group)];
+ src_data.assign(var_id, src_id);
+ reassignment_flag_mask |= 1u << uint32_t(dst_group);
+ }
+ }
+ else {
+ if (dst_wd)
+ dst_wd->_num_stack_args++;
+ _has_stack_src = true;
+ }
+
+ var_id++;
+ }
+ }
+
+ // Initialize WorkData::work_regs.
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ _work_data[group]._work_regs =
+ (_work_data[group].arch_regs() & (frame.dirty_regs(group) | ~frame.preserved_regs(group))) | _work_data[group].dst_regs() | _work_data[group].assigned_regs();
+ _work_data[group]._needs_scratch = (reassignment_flag_mask >> uint32_t(group)) & 1u;
+ }
+
+ // Create a variable that represents `SARegId` if necessary.
+ bool sa_reg_required = _has_stack_src && frame.has_dynamic_alignment() && !frame.has_preserved_fp();
+
+ WorkData& gp_regs = _work_data[RegGroup::kGp];
+ uint32_t sa_cur_reg_id = frame.sa_reg_id();
+ uint32_t sa_out_reg_id = args.sa_reg_id();
+
+ if (sa_cur_reg_id != Reg::kIdBad) {
+ // Check if the provided `SARegId` doesn't collide with input registers.
+ if (ASMJIT_UNLIKELY(gp_regs.is_assigned(sa_cur_reg_id))) {
+ return make_error(Error::kOverlappedRegs);
+ }
+ }
+
+ if (sa_out_reg_id != Reg::kIdBad) {
+ // Check if the provided `SARegId` doesn't collide with argument assignments.
+ if (ASMJIT_UNLIKELY(Support::bit_test(gp_regs.dst_regs(), sa_out_reg_id))) {
+ return make_error(Error::kOverlappedRegs);
+ }
+ sa_reg_required = true;
+ }
+
+ if (sa_reg_required) {
+ TypeId ptr_type_id = Environment::is_32bit(arch) ? TypeId::kUInt32 : TypeId::kUInt64;
+ RegType ptr_reg_type = Environment::is_32bit(arch) ? RegType::kGp32 : RegType::kGp64;
+
+ _sa_var_id = uint8_t(var_id);
+ _has_preserved_fp = frame.has_preserved_fp();
+
+ Var& var = _vars[var_id];
+ var.reset();
+
+ if (sa_cur_reg_id == Reg::kIdBad) {
+ if (sa_out_reg_id != Reg::kIdBad && !gp_regs.is_assigned(sa_out_reg_id)) {
+ sa_cur_reg_id = sa_out_reg_id;
+ }
+ else {
+ RegMask available_regs = gp_regs.available_regs();
+ if (!available_regs) {
+ available_regs = gp_regs.arch_regs() & ~gp_regs.work_regs();
+ }
+
+ if (ASMJIT_UNLIKELY(!available_regs)) {
+ return make_error(Error::kNoMorePhysRegs);
+ }
+
+ sa_cur_reg_id = Support::ctz(available_regs);
+ }
+ }
+
+ var.cur.init_reg(ptr_reg_type, sa_cur_reg_id, ptr_type_id);
+ gp_regs.assign(var_id, sa_cur_reg_id);
+ gp_regs._work_regs |= Support::bit_mask<RegMask>(sa_cur_reg_id);
+
+ if (sa_out_reg_id != Reg::kIdBad) {
+ var.out.init_reg(ptr_reg_type, sa_out_reg_id, ptr_type_id);
+ gp_regs._dst_regs |= Support::bit_mask<RegMask>(sa_out_reg_id);
+ gp_regs._work_regs |= Support::bit_mask<RegMask>(sa_out_reg_id);
+ }
+ else {
+ var.mark_done();
+ }
+
+ var_id++;
+ }
+
+ _var_count = var_id;
+
+ // Detect register swaps.
+ for (var_id = 0; var_id < _var_count; var_id++) {
+ Var& var = _vars[var_id];
+ if (var.cur.is_reg() && var.out.is_reg()) {
+ uint32_t src_id = var.cur.reg_id();
+ uint32_t dst_id = var.out.reg_id();
+
+ RegGroup group = RegUtils::group_of(var.cur.reg_type());
+ if (group != RegUtils::group_of(var.out.reg_type())) {
+ continue;
+ }
+
+ WorkData& wd = _work_data[group];
+ if (wd.is_assigned(dst_id)) {
+ Var& other = _vars[wd._phys_to_var_id[dst_id]];
+ if (RegUtils::group_of(other.out.reg_type()) == group && other.out.reg_id() == src_id) {
+ wd._num_swaps++;
+ _reg_swaps_mask = uint8_t(_reg_swaps_mask | Support::bit_mask<uint32_t>(group));
+ }
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::mark_dst_regs_dirty(FuncFrame& frame) noexcept {
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ WorkData& wd = _work_data[group];
+ uint32_t regs = wd.used_regs() | wd._dst_shuf;
+
+ wd._work_regs |= regs;
+ frame.add_dirty_regs(group, regs);
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::mark_scratch_regs(FuncFrame& frame) noexcept {
+ uint32_t group_mask = 0;
+
+ // Handle stack to stack moves.
+ group_mask |= _stack_dst_mask;
+
+ // Handle register swaps.
+ group_mask |= _reg_swaps_mask & ~Support::bit_mask<uint32_t>(RegGroup::kGp);
+
+ if (!group_mask)
+ return Error::kOk;
+
+ // Selects one dirty register per affected group that can be used as a scratch register.
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ if (Support::bit_test(group_mask, group)) {
+ WorkData& wd = _work_data[group];
+ if (wd._needs_scratch) {
+ // Initially, pick some clobbered or dirty register.
+ RegMask work_regs = wd.work_regs();
+ RegMask regs = work_regs & ~(wd.used_regs() | wd._dst_shuf);
+
+ // If that didn't work out pick some register which is not in 'used'.
+ if (!regs) {
+ regs = work_regs & ~wd.used_regs();
+ }
+
+ // If that didn't work out pick any other register that is allocable.
+ // This last resort case will, however, result in marking one more
+ // register dirty.
+ if (!regs) {
+ regs = wd.arch_regs() & ~work_regs;
+ }
+
+ // If that didn't work out we will have to use XORs instead of MOVs.
+ if (!regs) {
+ continue;
+ }
+
+ RegMask reg_mask = Support::blsi(regs);
+ wd._work_regs |= reg_mask;
+ frame.add_dirty_regs(group, reg_mask);
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error FuncArgsContext::mark_stack_args_reg(FuncFrame& frame) noexcept {
+ if (_sa_var_id != kVarIdNone) {
+ const Var& var = _vars[_sa_var_id];
+ frame.set_sa_reg_id(var.cur.reg_id());
+ }
+ else if (frame.has_preserved_fp()) {
+ frame.set_sa_reg_id(arch_traits().fp_reg_id());
+ }
+
+ return Error::kOk;
+}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/funcargscontext_p.h b/3rdparty/asmjit/asmjit/core/funcargscontext_p.h
new file mode 100644
index 00000000000..33c35e5e323
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/funcargscontext_p.h
@@ -0,0 +1,226 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
+#define ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/environment.h>
+#include <asmjit/core/func.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/raconstraints_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_core
+//! \{
+
+static inline OperandSignature get_suitable_reg_for_mem_to_mem_move(Arch arch, TypeId dst_type_id, TypeId src_type_id) noexcept {
+ const ArchTraits& arch_traits = ArchTraits::by_arch(arch);
+
+ uint32_t signature = 0u;
+ uint32_t dst_size = TypeUtils::size_of(dst_type_id);
+ uint32_t src_size = TypeUtils::size_of(src_type_id);
+ uint32_t max_size = Support::max<uint32_t>(dst_size, src_size);
+ uint32_t reg_size = Environment::reg_size_of_arch(arch);
+
+ if (max_size <= reg_size || (TypeUtils::is_int(dst_type_id) && TypeUtils::is_int(src_type_id))) {
+ signature = max_size <= 4 ? RegTraits<RegType::kGp32>::kSignature
+ : RegTraits<RegType::kGp64>::kSignature;
+ }
+ else if (max_size <= 8 && arch_traits.has_reg_type(RegType::kVec64)) {
+ signature = RegTraits<RegType::kVec64>::kSignature;
+ }
+ else if (max_size <= 16 && arch_traits.has_reg_type(RegType::kVec128)) {
+ signature = RegTraits<RegType::kVec128>::kSignature;
+ }
+ else if (max_size <= 32 && arch_traits.has_reg_type(RegType::kVec256)) {
+ signature = RegTraits<RegType::kVec256>::kSignature;
+ }
+ else if (max_size <= 64 && arch_traits.has_reg_type(RegType::kVec512)) {
+ signature = RegTraits<RegType::kVec512>::kSignature;
+ }
+
+ return OperandSignature{signature};
+}
+
+class FuncArgsContext {
+public:
+ static inline constexpr uint32_t kVarIdNone = 0xFF;
+
+ //! Contains information about a single argument or SA register that may need shuffling.
+ struct Var {
+ FuncValue cur;
+ FuncValue out;
+
+ inline void init(const FuncValue& cur_, const FuncValue& out_) noexcept {
+ cur = cur_;
+ out = out_;
+ }
+
+ //! Reset the value to its unassigned state.
+ inline void reset() noexcept {
+ cur.reset();
+ out.reset();
+ }
+
+ ASMJIT_INLINE_NODEBUG bool is_done() const noexcept { return cur.is_done(); }
+ ASMJIT_INLINE_NODEBUG void mark_done() noexcept { cur.add_flags(FuncValue::kFlagIsDone); }
+ };
+
+ struct WorkData {
+ //! All allocable registers provided by the architecture.
+ RegMask _arch_regs;
+ //! All registers that can be used by the shuffler.
+ RegMask _work_regs;
+ //! Registers used by the shuffler (all).
+ RegMask _used_regs;
+ //! Assigned registers.
+ RegMask _assigned_regs;
+ //! Destination registers assigned to arguments or SA.
+ RegMask _dst_regs;
+ //! Destination registers that require shuffling.
+ RegMask _dst_shuf;
+ //! Number of register swaps.
+ uint8_t _num_swaps;
+ //! Number of stack loads.
+ uint8_t _num_stack_args;
+ //! Whether this work data would need reassignment.
+ uint8_t _needs_scratch;
+ //! Reserved (only used as padding).
+ uint8_t _reserved[5];
+ //! Physical ID to variable ID mapping.
+ uint8_t _phys_to_var_id[32];
+
+ inline void reset() noexcept {
+ _arch_regs = 0;
+ _work_regs = 0;
+ _used_regs = 0;
+ _assigned_regs = 0;
+ _dst_regs = 0;
+ _dst_shuf = 0;
+ _num_swaps = 0;
+ _num_stack_args = 0;
+ _needs_scratch = 0;
+ memset(_reserved, 0, sizeof(_reserved));
+ memset(_phys_to_var_id, kVarIdNone, 32);
+ }
+
+ [[nodiscard]]
+ inline bool is_assigned(uint32_t reg_id) const noexcept {
+ ASMJIT_ASSERT(reg_id < 32);
+ return Support::bit_test(_assigned_regs, reg_id);
+ }
+
+ inline void assign(uint32_t var_id, uint32_t reg_id) noexcept {
+ ASMJIT_ASSERT(!is_assigned(reg_id));
+ ASMJIT_ASSERT(_phys_to_var_id[reg_id] == kVarIdNone);
+
+ _phys_to_var_id[reg_id] = uint8_t(var_id);
+ _assigned_regs ^= Support::bit_mask<RegMask>(reg_id);
+ }
+
+ inline void reassign(uint32_t var_id, uint32_t new_id, uint32_t old_id) noexcept {
+ ASMJIT_ASSERT( is_assigned(old_id));
+ ASMJIT_ASSERT(!is_assigned(new_id));
+ ASMJIT_ASSERT(_phys_to_var_id[old_id] == var_id);
+ ASMJIT_ASSERT(_phys_to_var_id[new_id] == kVarIdNone);
+
+ _phys_to_var_id[old_id] = uint8_t(kVarIdNone);
+ _phys_to_var_id[new_id] = uint8_t(var_id);
+ _assigned_regs ^= Support::bit_mask<RegMask>(new_id) ^ Support::bit_mask<RegMask>(old_id);
+ }
+
+ inline void swap(uint32_t a_var_id, uint32_t a_reg_id, uint32_t b_var_id, uint32_t b_reg_id) noexcept {
+ ASMJIT_ASSERT(is_assigned(a_reg_id));
+ ASMJIT_ASSERT(is_assigned(b_reg_id));
+ ASMJIT_ASSERT(_phys_to_var_id[a_reg_id] == a_var_id);
+ ASMJIT_ASSERT(_phys_to_var_id[b_reg_id] == b_var_id);
+
+ _phys_to_var_id[a_reg_id] = uint8_t(b_var_id);
+ _phys_to_var_id[b_reg_id] = uint8_t(a_var_id);
+ }
+
+ inline void unassign(uint32_t var_id, uint32_t reg_id) noexcept {
+ ASMJIT_ASSERT(is_assigned(reg_id));
+ ASMJIT_ASSERT(_phys_to_var_id[reg_id] == var_id);
+
+ Support::maybe_unused(var_id);
+ _phys_to_var_id[reg_id] = uint8_t(kVarIdNone);
+ _assigned_regs ^= Support::bit_mask<RegMask>(reg_id);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask arch_regs() const noexcept { return _arch_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask work_regs() const noexcept { return _work_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask used_regs() const noexcept { return _used_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask assigned_regs() const noexcept { return _assigned_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask dst_regs() const noexcept { return _dst_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask available_regs() const noexcept { return _work_regs & ~_assigned_regs; }
+ };
+
+ //! Architecture traits.
+ const ArchTraits* _arch_traits = nullptr;
+ //! Architecture constraints.
+ const RAConstraints* _constraints = nullptr;
+ //! Target architecture.
+ Arch _arch = Arch::kUnknown;
+ //! Has arguments passed via stack (SRC).
+ bool _has_stack_src = false;
+ //! Has preserved frame-pointer (FP).
+ bool _has_preserved_fp = false;
+ //! Has arguments assigned to stack (DST).
+ uint8_t _stack_dst_mask = 0;
+ //! Register swap groups (bit-mask).
+ uint8_t _reg_swaps_mask = 0;
+ uint8_t _sa_var_id = kVarIdNone;
+ uint32_t _var_count = 0;
+ Support::Array<WorkData, Globals::kNumVirtGroups> _work_data;
+ Var _vars[Globals::kMaxFuncArgs * Globals::kMaxValuePack + 1];
+
+ FuncArgsContext() noexcept;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const ArchTraits& arch_traits() const noexcept { return *_arch_traits; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t var_count() const noexcept { return _var_count; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t index_of(const Var* var) const noexcept { return (size_t)(var - _vars); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Var& var(size_t var_id) noexcept { return _vars[var_id]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Var& var(size_t var_id) const noexcept { return _vars[var_id]; }
+
+ Error init_work_data(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept;
+ Error mark_scratch_regs(FuncFrame& frame) noexcept;
+ Error mark_dst_regs_dirty(FuncFrame& frame) noexcept;
+ Error mark_stack_args_reg(FuncFrame& frame) noexcept;
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/globals.cpp b/3rdparty/asmjit/asmjit/core/globals.cpp
index 4a98431b6d5..ab7a4a50d63 100644
--- a/3rdparty/asmjit/src/asmjit/core/globals.cpp
+++ b/3rdparty/asmjit/asmjit/core/globals.cpp
@@ -1,21 +1,21 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
-#include "../core/api-build_p.h"
-#include "../core/globals.h"
-#include "../core/support.h"
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/globals.h>
+#include <asmjit/support/support.h>
ASMJIT_BEGIN_NAMESPACE
// DebugUtils - Error As String
// ============================
-ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
+ASMJIT_FAVOR_SIZE const char* DebugUtils::error_as_string(Error err) noexcept {
#ifndef ASMJIT_NO_TEXT
- // @EnumStringBegin{"enum": "ErrorCode", "output": "sError", "strip": "kError"}@
- static const char sErrorString[] =
+ // @EnumStringBegin{"enum": "Error", "output": "error_string", "strip": "k"}@
+ static const char error_string_data[] =
"Ok\0"
"OutOfMemory\0"
"InvalidArgument\0"
@@ -90,7 +90,7 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
"ProtectionFailure\0"
"<Unknown>\0";
- static const uint16_t sErrorIndex[] = {
+ static const uint16_t error_string_index[] = {
0, 3, 15, 31, 44, 56, 71, 90, 108, 123, 132, 148, 165, 178, 192, 210, 230,
247, 264, 283, 298, 314, 333, 352, 370, 392, 410, 429, 444, 460, 474, 488,
508, 533, 551, 573, 595, 612, 629, 645, 661, 677, 694, 709, 724, 744, 764,
@@ -99,18 +99,18 @@ ASMJIT_FAVOR_SIZE const char* DebugUtils::errorAsString(Error err) noexcept {
};
// @EnumStringEnd@
- return sErrorString + sErrorIndex[Support::min<Error>(err, kErrorCount)];
+ return error_string_data + error_string_index[Support::min(uint32_t(err), uint32_t(Error::kMaxValue) + 1u)];
#else
- DebugUtils::unused(err);
- static const char noMessage[] = "";
- return noMessage;
+ Support::maybe_unused(err);
+ static const char no_message[] = "";
+ return no_message;
#endif
}
// DebugUtils - Debug Output
// =========================
-ASMJIT_FAVOR_SIZE void DebugUtils::debugOutput(const char* str) noexcept {
+ASMJIT_FAVOR_SIZE void DebugUtils::debug_output(const char* str) noexcept {
#if defined(_WIN32)
::OutputDebugStringA(str);
#else
@@ -121,14 +121,14 @@ ASMJIT_FAVOR_SIZE void DebugUtils::debugOutput(const char* str) noexcept {
// DebugUtils - Fatal Errors
// =========================
-ASMJIT_FAVOR_SIZE void DebugUtils::assertionFailed(const char* file, int line, const char* msg) noexcept {
+ASMJIT_FAVOR_SIZE void DebugUtils::assertion_failure(const char* file, int line, const char* msg) noexcept {
char str[1024];
snprintf(str, 1024,
"[asmjit] Assertion failed at %s (line %d):\n"
"[asmjit] %s\n", file, line, msg);
- debugOutput(str);
+ debug_output(str);
::abort();
}
diff --git a/3rdparty/asmjit/asmjit/core/globals.h b/3rdparty/asmjit/asmjit/core/globals.h
new file mode 100644
index 00000000000..056ce889cb7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/globals.h
@@ -0,0 +1,458 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_GLOBALS_H_INCLUDED
+#define ASMJIT_CORE_GLOBALS_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_utilities
+//! \{
+
+namespace Support {
+
+//! Cast designed to cast between function and void* pointers.
+template<typename Dst, typename Src>
+static inline Dst ptr_cast_impl(Src p) noexcept { return (Dst)p; }
+
+//! Helper to implement placement new/delete without relying on `<new>` header.
+struct PlacementNew { void* ptr; };
+
+} // {Support}
+
+#if defined(ASMJIT_NO_STDCXX)
+namespace Support {
+ ASMJIT_INLINE void* operator_new(size_t n) noexcept { return malloc(n); }
+ ASMJIT_INLINE void operator_delete(void* p) noexcept { if (p) free(p); }
+} // {Support}
+
+#define ASMJIT_BASE_CLASS(TYPE) \
+ ASMJIT_INLINE void* operator new(size_t n) noexcept { return Support::operator_new(n); } \
+ ASMJIT_INLINE void operator delete(void* ptr) noexcept { Support::operator_delete(ptr); } \
+ \
+ ASMJIT_INLINE void* operator new(size_t, void* ptr) noexcept { return ptr; } \
+ ASMJIT_INLINE void operator delete(void*, void*) noexcept {} \
+ \
+ ASMJIT_INLINE void* operator new(size_t, Support::PlacementNew ptr) noexcept { return ptr.ptr; } \
+ ASMJIT_INLINE void operator delete(void*, Support::PlacementNew) noexcept {}
+#else
+#define ASMJIT_BASE_CLASS(TYPE)
+#endif
+
+//! \}
+//! \endcond
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! A policy that can be used with some `reset()` member functions.
+enum class ResetPolicy : uint32_t {
+ //! Soft reset, doesn't deallocate memory (default).
+ kSoft = 0,
+ //! Hard reset, releases all memory used, if any.
+ kHard = 1
+};
+
+//! Contains constants and variables used globally across AsmJit.
+namespace Globals {
+
+//! Host memory allocator overhead.
+static constexpr uint32_t kAllocOverhead = uint32_t(sizeof(intptr_t) * 4u);
+
+//! Host memory allocator alignment.
+static constexpr uint32_t kAllocAlignment = 8u;
+
+//! Aggressive growing strategy threshold.
+static constexpr uint32_t kGrowThreshold = 1024u * 1024u * 16u;
+
+//! Maximum depth of RB-Tree is:
+//!
+//! `2 * log2(n + 1)`
+//!
+//! Size of RB node is at least two pointers (without data), so a theoretical architecture limit would be:
+//!
+//! `2 * log2(addressable_memory_size / sizeof(Node) + 1)`
+//!
+//! Which yields 30 on 32-bit arch and 61 on 64-bit arch. The final value was adjusted by +1 for safety reasons.
+static constexpr uint32_t kMaxTreeHeight = (ASMJIT_ARCH_BITS == 32 ? 30 : 61) + 1;
+
+//! Maximum number of operands per a single instruction.
+static constexpr uint32_t kMaxOpCount = 6;
+
+//! Maximum arguments of a function supported by the Compiler / Function API.
+static constexpr uint32_t kMaxFuncArgs = 32;
+
+//! The number of values that can be assigned to a single function argument or return value.
+static constexpr uint32_t kMaxValuePack = 4;
+
+//! Maximum number of physical registers AsmJit can use per register group.
+static constexpr uint32_t kMaxPhysRegs = 32;
+
+//! Maximum alignment.
+static constexpr uint32_t kMaxAlignment = 64;
+
+//! Maximum label or symbol size in bytes.
+static constexpr uint32_t kMaxLabelNameSize = 2048;
+
+//! Maximum section name size.
+static constexpr uint32_t kMaxSectionNameSize = 35;
+
+//! Maximum size of a comment.
+static constexpr uint32_t kMaxCommentSize = 1024;
+
+//! Invalid identifier.
+static constexpr uint32_t kInvalidId = 0xFFFFFFFFu;
+
+//! Invalid base address.
+static constexpr uint64_t kNoBaseAddress = ~uint64_t(0);
+
+//! Invalid section offset.
+static constexpr uint64_t kNoSectionOffset = ~uint64_t(0);
+
+//! Number of virtual register groups.
+static constexpr uint32_t kNumVirtGroups = 4;
+
+struct Init_ {};
+struct NoInit_ {};
+
+//! A decorator used to initialize.
+static const constexpr Init_ Init {};
+//! A decorator used to not initialize.
+static const constexpr NoInit_ NoInit {};
+
+template<typename T>
+static ASMJIT_INLINE_NODEBUG bool is_npos(const T& index) noexcept { return index == T(~T(0)); }
+
+} // {Globals}
+
+//! Casts a `void*` pointer `func` to a function pointer `Func`.
+template<typename Func>
+static ASMJIT_INLINE_NODEBUG Func ptr_as_func(void* p) noexcept {
+ return Support::ptr_cast_impl<Func, void*>(p);
+}
+
+//! Casts a `void*` pointer `func` to a function pointer `Func`.
+template<typename Func>
+static ASMJIT_INLINE_NODEBUG Func ptr_as_func(void* p, size_t offset) noexcept {
+ return Support::ptr_cast_impl<Func, void*>(static_cast<void*>(static_cast<char*>(p) + offset));
+}
+
+//! Casts a function pointer `func` to a void pointer `void*`.
+template<typename Func>
+static ASMJIT_INLINE_NODEBUG void* func_as_ptr(Func func) noexcept {
+ return Support::ptr_cast_impl<void*, Func>(func);
+}
+
+//! \}
+
+//! \addtogroup asmjit_error_handling
+//! \{
+
+//! AsmJit error code.
+enum class Error : uint32_t {
+ // @EnumValuesBegin{"enum": "Error"}@
+
+ //! No error (success).
+ kOk = 0,
+
+ //! Out of memory.
+ kOutOfMemory,
+
+ //! Invalid argument.
+ kInvalidArgument,
+
+ //! Invalid state.
+ //!
+ //! If this error is returned it means that either you are doing something wrong or AsmJit caught itself by
+ //! doing something wrong. This error should never be ignored.
+ kInvalidState,
+
+ //! Invalid or incompatible architecture.
+ kInvalidArch,
+
+ //! The object is not initialized.
+ kNotInitialized,
+ //! The object is already initialized.
+ kAlreadyInitialized,
+
+ //! Either a built-in feature was disabled at compile time and it's not available or the feature is not
+ //! available on the target platform.
+ //!
+ //! For example trying to allocate large pages on unsupported platform would return this error.
+ kFeatureNotEnabled,
+
+ //! Too many handles (Windows) or file descriptors (Unix/Posix).
+ kTooManyHandles,
+ //! Code generated is larger than allowed.
+ kTooLarge,
+
+ //! No code generated.
+ //!
+ //! Returned by runtime if the \ref CodeHolder contains no code.
+ kNoCodeGenerated,
+
+ //! Invalid directive.
+ kInvalidDirective,
+ //! Attempt to use uninitialized label.
+ kInvalidLabel,
+ //! Label index overflow - a single \ref BaseAssembler instance can hold almost 2^32 (4 billion) labels. If
+ //! there is an attempt to create more labels then this error is returned.
+ kTooManyLabels,
+ //! Label is already bound.
+ kLabelAlreadyBound,
+ //! Label is already defined (named labels).
+ kLabelAlreadyDefined,
+ //! Label name is too long.
+ kLabelNameTooLong,
+ //! Label must always be local if it's anonymous (without a name).
+ kInvalidLabelName,
+ //! Parent id passed to \ref CodeHolder::new_named_label_id() was either invalid or parent is not supported by
+ //! the requested `LabelType`.
+ kInvalidParentLabel,
+
+ //! Invalid section.
+ kInvalidSection,
+ //! Too many sections (section index overflow).
+ kTooManySections,
+ //! Invalid section name (most probably too long).
+ kInvalidSectionName,
+
+ //! Relocation index overflow (too many relocations).
+ kTooManyRelocations,
+ //! Invalid relocation entry.
+ kInvalidRelocEntry,
+ //! Reloc entry contains address that is out of range (unencodable).
+ kRelocOffsetOutOfRange,
+
+ //! Invalid assignment to a register, function argument, or function return value.
+ kInvalidAssignment,
+ //! Invalid instruction.
+ kInvalidInstruction,
+ //! Invalid register type.
+ kInvalidRegType,
+ //! Invalid register group.
+ kInvalidRegGroup,
+ //! Invalid physical register id.
+ kInvalidPhysId,
+ //! Invalid virtual register id.
+ kInvalidVirtId,
+ //! Invalid element index (ARM).
+ kInvalidElementIndex,
+ //! Invalid prefix combination (X86|X64).
+ kInvalidPrefixCombination,
+ //! Invalid LOCK prefix (X86|X64).
+ kInvalidLockPrefix,
+ //! Invalid XACQUIRE prefix (X86|X64).
+ kInvalidXAcquirePrefix,
+ //! Invalid XRELEASE prefix (X86|X64).
+ kInvalidXReleasePrefix,
+ //! Invalid REP prefix (X86|X64).
+ kInvalidRepPrefix,
+ //! Invalid REX prefix (X86|X64).
+ kInvalidRexPrefix,
+ //! Invalid {...} register (X86|X64).
+ kInvalidExtraReg,
+ //! Invalid {k} use (not supported by the instruction) (X86|X64).
+ kInvalidKMaskUse,
+ //! Invalid {k}{z} use (not supported by the instruction) (X86|X64).
+ kInvalidKZeroUse,
+ //! Invalid broadcast - Currently only related to invalid use of AVX-512 {1tox} (X86|X64).
+ kInvalidBroadcast,
+ //! Invalid 'embedded-rounding' {er} or 'suppress-all-exceptions' {sae} (AVX-512) (X86|X64).
+ kInvalidEROrSAE,
+ //! Invalid address used (not encodable).
+ kInvalidAddress,
+ //! Invalid index register used in memory address (not encodable).
+ kInvalidAddressIndex,
+ //! Invalid address scale (not encodable).
+ kInvalidAddressScale,
+ //! Invalid use of 64-bit address.
+ kInvalidAddress64Bit,
+ //! Invalid use of 64-bit address that require 32-bit zero-extension (X64).
+ kInvalidAddress64BitZeroExtension,
+ //! Invalid displacement (not encodable).
+ kInvalidDisplacement,
+ //! Invalid segment (X86|X86_64).
+ kInvalidSegment,
+
+ //! Invalid immediate (out of bounds on X86 and invalid pattern on ARM).
+ kInvalidImmediate,
+
+ //! Invalid operand size.
+ kInvalidOperandSize,
+ //! Ambiguous operand size (memory has zero size while it's required to determine the operation type.
+ kAmbiguousOperandSize,
+ //! Mismatching operand size (size of multiple operands doesn't match the operation size).
+ kOperandSizeMismatch,
+
+ //! Invalid option.
+ kInvalidOption,
+ //! Option already defined.
+ kOptionAlreadyDefined,
+
+ //! Invalid TypeId.
+ kInvalidTypeId,
+ //! Invalid use of a 8-bit GPB-HIGH register.
+ kInvalidUseOfGpbHi,
+ //! Invalid use of a 64-bit GPQ register in 32-bit mode.
+ kInvalidUseOfGpq,
+ //! Invalid use of an 80-bit float (\ref TypeId::kFloat80).
+ kInvalidUseOfF80,
+ //! Instruction requires the use of consecutive registers, but registers in operands weren't (AVX512, ASIMD load/store, etc...).
+ kNotConsecutiveRegs,
+ //! Failed to allocate consecutive registers - allocable registers either too restricted or a bug in RW info.
+ kConsecutiveRegsAllocation,
+
+ //! Illegal virtual register - reported by instruction validation.
+ kIllegalVirtReg,
+ //! AsmJit cannot create more virtual registers.
+ kTooManyVirtRegs,
+
+ //! AsmJit requires a physical register, but no one is available.
+ kNoMorePhysRegs,
+ //! A variable has been assigned more than once to a function argument (BaseCompiler).
+ kOverlappedRegs,
+ //! Invalid register to hold stack arguments offset.
+ kOverlappingStackRegWithRegArg,
+
+ //! Unbound label cannot be evaluated by expression.
+ kExpressionLabelNotBound,
+ //! Arithmetic overflow during expression evaluation.
+ kExpressionOverflow,
+
+ //! Failed to open anonymous memory handle or file descriptor.
+ kFailedToOpenAnonymousMemory,
+
+ //! Failed to open a file.
+ //!
+ //! \note This is a generic error that is used by internal filesystem API.
+ kFailedToOpenFile,
+
+ //! Protection failure can be returned from a virtual memory allocator or when trying to change memory access
+ //! permissions.
+ kProtectionFailure,
+
+ // @EnumValuesEnd@
+
+ //! Maximum value of a valid AsmJit `Error` code.
+ kMaxValue = kProtectionFailure,
+
+ //! \cond INTERNAL
+ //! Error code used to inform the caller about an alternative success state.
+ //!
+ //! \remarks This value is only used internally in AsmJit.
+ kByPass = 0xFFFFFFFFu
+ //! \endcond
+};
+
+static inline constexpr Error kErrorOk = Error::kOk;
+
+//! \def ASMJIT_ASSERT(...)
+//!
+//! AsmJit's own assert macro used in AsmJit code-base.
+#if defined(ASMJIT_BUILD_DEBUG)
+ #define ASMJIT_ASSERT(...) \
+ do { \
+ if (ASMJIT_UNLIKELY(!(__VA_ARGS__))) { \
+ ::asmjit::DebugUtils::assertion_failure(__FILE__, __LINE__, #__VA_ARGS__); \
+ } \
+ } while (0)
+#else
+ #define ASMJIT_ASSERT(...) ((void)0)
+#endif
+
+//! \def ASMJIT_NOT_REACHED()
+//!
+//! Run-time assertion used in code that should never be reached.
+#if defined(ASMJIT_BUILD_DEBUG)
+ #define ASMJIT_NOT_REACHED() ::asmjit::DebugUtils::assertion_failure(__FILE__, __LINE__, "ASMJIT_NOT_REACHED()")
+#elif defined(__GNUC__)
+ #define ASMJIT_NOT_REACHED() __builtin_unreachable()
+#else
+ #define ASMJIT_NOT_REACHED() ASMJIT_ASSUME(0)
+#endif
+
+//! \def ASMJIT_PROPAGATE(...)
+//!
+//! Propagates a possible `Error` produced by `...` to the caller by returning the error immediately. Used by AsmJit
+//! internally, but kept public for users that want to use the same technique to propagate errors to the caller.
+#define ASMJIT_PROPAGATE(...) \
+ do { \
+ ::asmjit::Error error_to_propagate = __VA_ARGS__; \
+ if (ASMJIT_UNLIKELY(error_to_propagate != ::asmjit::Error::kOk)) { \
+ return error_to_propagate; \
+ } \
+ } while (0)
+
+//! \}
+
+//! Returns the error `err` passed.
+//!
+//! Provided for debugging purposes. Putting a breakpoint inside `make_error` can help with tracing the origin of any
+//! error reported or returned by AsmJit.
+[[nodiscard]]
+static constexpr Error make_error(Error err) noexcept { return err; }
+
+//! Debugging utilities.
+namespace DebugUtils {
+
+//! Returns a printable version of `asmjit::Error` code.
+[[nodiscard]]
+ASMJIT_API const char* error_as_string(Error err) noexcept;
+
+//! Called to output debugging messages.
+ASMJIT_API void debug_output(const char* str) noexcept;
+
+//! Called on assertion failure.
+//!
+//! \param file Source file name where it happened.
+//! \param line Line in the source file.
+//! \param msg Message to display.
+//!
+//! If you have problems with assertion failures a breakpoint can be put at \ref assertion_failure() function
+//! (asmjit/core/globals.cpp). A call stack will be available when such assertion failure is triggered. AsmJit
+//! always returns errors on failures, assertions are a last resort and usually mean unrecoverable state due to out
+//! of range array access or totally invalid arguments like nullptr where a valid pointer should be provided, etc...
+[[noreturn]]
+ASMJIT_API void assertion_failure(const char* file, int line, const char* msg) noexcept;
+
+} // {DebugUtils}
+
+//! Output parameter.
+template<typename T>
+class Out {
+protected:
+ T& _val;
+
+public:
+ ASMJIT_INLINE_NODEBUG explicit Out(T& val) noexcept
+ : _val(val) {}
+
+ ASMJIT_INLINE_NODEBUG Out& operator=(const T& val) noexcept {
+ _val = val;
+ return *this;
+ }
+
+ ASMJIT_INLINE_NODEBUG T& value() const noexcept { return _val; }
+ ASMJIT_INLINE_NODEBUG T& operator*() const noexcept { return _val; }
+ ASMJIT_INLINE_NODEBUG T* operator->() const noexcept { return &_val; }
+};
+
+ASMJIT_END_NAMESPACE
+
+//! Implementation of a placement new so we don't have to depend on `<new>`.
+ASMJIT_INLINE_NODEBUG void* operator new(size_t, const asmjit::Support::PlacementNew& p) noexcept {
+#if defined(_MSC_VER) && !defined(__clang__)
+ __assume(p.ptr != nullptr); // Otherwise MSVC would emit a nullptr check.
+#endif
+ return p.ptr;
+}
+
+ASMJIT_INLINE_NODEBUG void operator delete(void*, const asmjit::Support::PlacementNew&) noexcept {}
+
+#endif // ASMJIT_CORE_GLOBALS_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/inst.cpp b/3rdparty/asmjit/asmjit/core/inst.cpp
new file mode 100644
index 00000000000..3ed202b883d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/inst.cpp
@@ -0,0 +1,129 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/inst.h>
+
+#if !defined(ASMJIT_NO_X86)
+ #include <asmjit/x86/x86instapi_p.h>
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ #include <asmjit/arm/a64instapi_p.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+// InstAPI - InstId <-> String
+// ===========================
+
+#ifndef ASMJIT_NO_TEXT
+Error InstAPI::inst_id_to_string(Arch arch, InstId inst_id, InstStringifyOptions options, String& output) noexcept {
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::InstInternal::inst_id_to_string(inst_id, options, output);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_aarch64(arch)) {
+ return a64::InstInternal::inst_id_to_string(inst_id, options, output);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+
+InstId InstAPI::string_to_inst_id(Arch arch, const char* s, size_t len) noexcept {
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::InstInternal::string_to_inst_id(s, len);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_aarch64(arch)) {
+ return a64::InstInternal::string_to_inst_id(s, len);
+ }
+#endif
+
+ return 0;
+}
+#endif // !ASMJIT_NO_TEXT
+
+// InstAPI - Validate
+// ==================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error InstAPI::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept {
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ if (arch == Arch::kX86) {
+ return x86::InstInternal::validate_x86(inst, operands, op_count, validation_flags);
+ }
+ else {
+ return x86::InstInternal::validate_x64(inst, operands, op_count, validation_flags);
+ }
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_aarch64(arch)) {
+ return a64::InstInternal::validate(inst, operands, op_count, validation_flags);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// InstAPI - QueryRWInfo
+// =====================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error InstAPI::query_rw_info(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, InstRWInfo* out) noexcept {
+ if (ASMJIT_UNLIKELY(op_count > Globals::kMaxOpCount)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::InstInternal::query_rw_info(arch, inst, operands, op_count, out);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_aarch64(arch)) {
+ return a64::InstInternal::query_rw_info(inst, operands, op_count, out);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// InstAPI - QueryFeatures
+// =======================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error InstAPI::query_features(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, CpuFeatures* out) noexcept {
+#if !defined(ASMJIT_NO_X86)
+ if (Environment::is_family_x86(arch)) {
+ return x86::InstInternal::query_features(arch, inst, operands, op_count, out);
+ }
+#endif
+
+#if !defined(ASMJIT_NO_AARCH64)
+ if (Environment::is_family_aarch64(arch)) {
+ return a64::InstInternal::query_features(inst, operands, op_count, out);
+ }
+#endif
+
+ return make_error(Error::kInvalidArch);
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/inst.h b/3rdparty/asmjit/asmjit/core/inst.h
new file mode 100644
index 00000000000..3968b24319b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/inst.h
@@ -0,0 +1,924 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_INST_H_INCLUDED
+#define ASMJIT_CORE_INST_H_INCLUDED
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/string.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_instruction_db
+//! \{
+
+//! Describes an instruction id and modifiers used together with the id.
+//!
+//! Each architecture has a set of valid instructions indexed from 0. Instruction with 0 id is, however, a special
+//! instruction that describes a "no instruction" or "invalid instruction". Different architectures can assign a.
+//! different instruction to the same id, each architecture typically has its own instructions indexed from 1.
+//!
+//! Instruction identifiers listed by architecture:
+//!
+//! - \ref x86::Inst (X86 and X86_64)
+//! - \ref a64::Inst (AArch64)
+using InstId = uint32_t;
+
+//! Instruction id parts.
+//!
+//! A mask that specifies a bit-layout of \ref InstId.
+enum class InstIdParts : uint32_t {
+ // Common Masks
+ // ------------
+
+ //! Real id without any modifiers (always 16 least significant bits).
+ kRealId = 0x0000FFFFu,
+ //! Instruction is abstract (or virtual, IR, etc...).
+ kAbstract = 0x80000000u,
+
+ // ARM Specific
+ // ------------
+
+ //! AArch32 first data type, used by ASIMD instructions (`inst.dt.dt2`).
+ kA32_DT = 0x000F0000u,
+ //! AArch32 second data type, used by ASIMD instructions (`inst.dt.dt2`).
+ kA32_DT2 = 0x00F00000u,
+ //! AArch32/AArch64 condition code.
+ kARM_Cond = 0x78000000u
+};
+
+//! Instruction options.
+//!
+//! Instruction options complement instruction identifier and attributes.
+enum class InstOptions : uint32_t {
+ //! No options.
+ kNone = 0,
+
+ //! Used internally by emitters for handling errors and rare cases.
+ kReserved = 0x00000001u,
+
+ //! Prevents following a jump during compilation (Compiler).
+ kUnfollow = 0x00000002u,
+
+ //! Overwrite the destination operand(s) (Compiler).
+ //!
+ //! Hint that is important for register liveness analysis. It tells the compiler that the destination operand will
+ //! be overwritten now or by adjacent instructions. Compiler knows when a register is completely overwritten by a
+ //! single instruction, for example you don't have to mark "movaps" or "pxor x, x", however, if a pair of
+ //! instructions is used and the first of them doesn't completely overwrite the content of the destination,
+ //! Compiler fails to mark that register as dead.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! - All instructions that always overwrite at least the size of the register the virtual-register uses, for
+ //! example "mov", "movq", "movaps" don't need the overwrite option to be used - conversion, shuffle, and
+ //! other miscellaneous instructions included.
+ //!
+ //! - All instructions that clear the destination register if all operands are the same, for example "xor x, x",
+ //! "pcmpeqb x x", etc...
+ //!
+ //! - Consecutive instructions that partially overwrite the variable until there is no old content require
+ //! `BaseCompiler::overwrite()` to be used. Some examples (not always the best use cases thought):
+ //!
+ //! - `movlps xmm0, ?` followed by `movhps xmm0, ?` and vice versa
+ //! - `movlpd xmm0, ?` followed by `movhpd xmm0, ?` and vice versa
+ //! - `mov al, ?` followed by `and ax, 0xFF`
+ //! - `mov al, ?` followed by `mov ah, al`
+ //! - `pinsrq xmm0, ?, 0` followed by `pinsrq xmm0, ?, 1`
+ //!
+ //! - If the allocated virtual register is used temporarily for scalar operations. For example if you allocate a
+ //! full vector like `x86::Compiler::new_xmm()` and then use that vector for scalar operations you should use
+ //! `overwrite()` directive:
+ //!
+ //! - `sqrtss x, y` - only LO element of `x` is changed, if you don't
+ //! use HI elements, use `compiler.overwrite().sqrtss(x, y)`.
+ kOverwrite = 0x00000004u,
+
+ //! Emit short-form of the instruction.
+ kShortForm = 0x00000010u,
+ //! Emit long-form of the instruction.
+ kLongForm = 0x00000020u,
+
+ //! Conditional jump is likely to be taken.
+ kTaken = 0x00000040u,
+ //! Conditional jump is unlikely to be taken.
+ kNotTaken = 0x00000080u,
+
+ // X86 & X64 Options
+ // -----------------
+
+ //! Use ModMR instead of ModRM if applicable.
+ kX86_ModMR = 0x00000100u,
+ //! Use ModRM instead of ModMR if applicable.
+ kX86_ModRM = 0x00000200u,
+ //! Use 3-byte VEX prefix if possible (AVX) (must be 0x00000400).
+ kX86_Vex3 = 0x00000400u,
+ //! Use VEX prefix when both VEX|EVEX prefixes are available (HINT: AVX_VNNI).
+ kX86_Vex = 0x00000800u,
+ //! Use 4-byte EVEX prefix if possible (AVX-512) (must be 0x00001000).
+ kX86_Evex = 0x00001000u,
+
+ //! LOCK prefix (lock-enabled instructions only).
+ kX86_Lock = 0x00002000u,
+ //! REP prefix (string instructions only).
+ kX86_Rep = 0x00004000u,
+ //! REPNE prefix (string instructions only).
+ kX86_Repne = 0x00008000u,
+
+ //! XACQUIRE prefix (only allowed instructions).
+ kX86_XAcquire = 0x00010000u,
+ //! XRELEASE prefix (only allowed instructions).
+ kX86_XRelease = 0x00020000u,
+
+ //! AVX-512: embedded-rounding {er} and implicit {sae}.
+ kX86_ER = 0x00040000u,
+ //! AVX-512: suppress-all-exceptions {sae}.
+ kX86_SAE = 0x00080000u,
+ //! AVX-512: round-to-nearest (even) {rn-sae} (bits 00).
+ kX86_RN_SAE = 0x00000000u,
+ //! AVX-512: round-down (toward -inf) {rd-sae} (bits 01).
+ kX86_RD_SAE = 0x00200000u,
+ //! AVX-512: round-up (toward +inf) {ru-sae} (bits 10).
+ kX86_RU_SAE = 0x00400000u,
+ //! AVX-512: round-toward-zero (truncate) {rz-sae} (bits 11).
+ kX86_RZ_SAE = 0x00600000u,
+ //! AVX-512: Use zeroing {k}{z} instead of merging {k}.
+ kX86_ZMask = 0x00800000u,
+
+ //! AVX-512: Mask to get embedded rounding bits (2 bits).
+ kX86_ERMask = kX86_RZ_SAE,
+ //! AVX-512: Mask of all possible AVX-512 options except EVEX prefix flag.
+ kX86_AVX512Mask = 0x00FC0000u,
+
+ //! Force REX.B and/or VEX.B field (X64 only, used internally).
+ kX86_OpCodeB = 0x01000000u,
+ //! Force REX.X and/or VEX.X field (X64 only, used internally).
+ kX86_OpCodeX = 0x02000000u,
+ //! Force REX.R and/or VEX.R field (X64 only, used internally).
+ kX86_OpCodeR = 0x04000000u,
+ //! Force REX.W and/or VEX.W field (X64 only, used internally).
+ kX86_OpCodeW = 0x08000000u,
+ //! Force REX prefix (X64 only).
+ kX86_Rex = 0x40000000u,
+ //! Invalid REX prefix (set by X86 or when AH|BH|CH|DH regs are used on X64).
+ kX86_InvalidRex = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstOptions)
+
+//! Instruction control flow.
+enum class InstControlFlow : uint32_t {
+ //! Regular instruction.
+ kRegular = 0u,
+ //! Unconditional jump.
+ kJump = 1u,
+ //! Conditional jump (branch).
+ kBranch = 2u,
+ //! Function call.
+ kCall = 3u,
+ //! Function return.
+ kReturn = 4u,
+
+ //! Maximum value of `InstType`.
+ kMaxValue = kReturn
+};
+
+//! Hint that is used when both input operands to the instruction are the same.
+//!
+//! Provides hints to the instruction RW query regarding special cases in which two or more operands are the same
+//! registers. This is required by instructions such as XOR, AND, OR, SUB, etc... These hints will influence the
+//! RW operations query.
+enum class InstSameRegHint : uint8_t {
+ //! No special handling.
+ kNone = 0,
+ //! Operands become read-only, the operation doesn't change the content - `X & X` and similar.
+ kRO = 1,
+ //! Operands become write-only, the content of the input(s) don't matter - `X ^ X`, `X - X`, and similar.
+ kWO = 2
+};
+
+//! Options that can be used when converting instruction IDs to strings.
+enum class InstStringifyOptions : uint32_t {
+ //! No options.
+ kNone = 0x00000000u,
+
+ //! Stringify a full instruction name with known aliases.
+ //!
+ //! This option is designed for architectures where instruction aliases are common, for example X86, and where
+ //! multiple aliases can be used in assembly code to distinguish between intention - for example instructions
+ //! such as JZ and JE are the same, but the first is used in a context of equality to zero, and the second is
+ //! used when two values equal (for example JE next to CMP).
+ kAliases = 0x00000001u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstStringifyOptions)
+
+//! Instruction id, options, and extra_reg in a single structure. This structure exists mainly to simplify analysis
+//! and validation API that requires `BaseInst` and `Operand[]` array.
+class BaseInst {
+public:
+ //! \name Members
+ //! \{
+
+ //! Instruction id with modifiers.
+ InstId _inst_id;
+ //! Instruction options.
+ InstOptions _options;
+ //! Extra register used by the instruction (either REP register or AVX-512 selector).
+ RegOnly _extra_reg;
+
+ enum Id : uint32_t {
+ //! Invalid or uninitialized instruction id.
+ kIdNone = 0x00000000u,
+ //! Abstract instruction (BaseBuilder and BaseCompiler).
+ kIdAbstract = 0x80000000u
+ };
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new BaseInst instance with `id` and `options` set.
+ //!
+ //! Default values of `id` and `options` are zero, which means 'none' instruction. Such instruction is guaranteed
+ //! to never exist for any architecture supported by AsmJit.
+ ASMJIT_INLINE_NODEBUG explicit BaseInst(InstId inst_id = 0, InstOptions options = InstOptions::kNone) noexcept
+ : _inst_id(inst_id),
+ _options(options),
+ _extra_reg() {}
+
+ ASMJIT_INLINE_NODEBUG BaseInst(InstId inst_id, InstOptions options, const RegOnly& extra_reg) noexcept
+ : _inst_id(inst_id),
+ _options(options),
+ _extra_reg(extra_reg) {}
+
+ ASMJIT_INLINE_NODEBUG BaseInst(InstId inst_id, InstOptions options, const Reg& extra_reg) noexcept
+ : _inst_id(inst_id),
+ _options(options),
+ _extra_reg{extra_reg.signature(), extra_reg.id()} {}
+
+ //! \}
+
+ //! \name Instruction id and modifiers
+ //! \{
+
+ //! Returns the instruction id with modifiers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstId inst_id() const noexcept { return _inst_id; }
+
+ //! Sets the instruction id and modifiers from `inst_id`.
+ ASMJIT_INLINE_NODEBUG void set_inst_id(InstId inst_id) noexcept { _inst_id = inst_id; }
+
+ //! Resets the instruction id and modifiers to zero, see \ref kIdNone.
+ ASMJIT_INLINE_NODEBUG void reset_inst_id() noexcept { _inst_id = 0; }
+
+ //! Returns a real instruction id that doesn't contain any modifiers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstId real_id() const noexcept { return _inst_id & uint32_t(InstIdParts::kRealId); }
+
+ template<InstIdParts kPart>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t inst_id_part() const noexcept {
+ return (uint32_t(_inst_id) & uint32_t(kPart)) >> Support::ctz_const<kPart>;
+ }
+
+ template<InstIdParts kPart>
+ ASMJIT_INLINE_NODEBUG void set_inst_id_part(uint32_t value) noexcept {
+ _inst_id = (_inst_id & ~uint32_t(kPart)) | (value << Support::ctz_const<kPart>);
+ }
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
+
+ //! Returns instruction options associated with this instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _options; }
+
+ //! Tests whether the given instruction `option` is enabled.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_option(InstOptions option) const noexcept { return Support::test(_options, option); }
+
+ //! Replaces all instruction options by the given `options`.
+ ASMJIT_INLINE_NODEBUG void set_options(InstOptions options) noexcept { _options = options; }
+
+ //! Adds instruction options provided by `options`.
+ ASMJIT_INLINE_NODEBUG void add_options(InstOptions options) noexcept { _options |= options; }
+
+ //! Clears instruction options provided by `options`.
+ ASMJIT_INLINE_NODEBUG void clear_options(InstOptions options) noexcept { _options &= ~options; }
+
+ //! Resets all instruction options to `InstOptions::kNone` (there will be no instruction options active after reset).
+ ASMJIT_INLINE_NODEBUG void reset_options() noexcept { _options = InstOptions::kNone; }
+
+ //! \}
+
+ //! \name Extra Register
+ //! \{
+
+ //! Tests whether the instruction has associated an extra register.
+ //!
+ //! \note Extra registers are currently only used on X86 by AVX-512 masking such as `{k}` and `{k}{z}` and by repeated
+ //! instructions to explicitly assign a virtual register that would be ECX/RCX.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_extra_reg() const noexcept { return _extra_reg.is_reg(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegOnly& extra_reg() noexcept { return _extra_reg; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RegOnly& extra_reg() const noexcept { return _extra_reg; }
+
+ ASMJIT_INLINE_NODEBUG void set_extra_reg(const Reg& reg) noexcept { _extra_reg.init(reg); }
+
+ ASMJIT_INLINE_NODEBUG void set_extra_reg(const RegOnly& reg) noexcept { _extra_reg.init(reg); }
+
+ ASMJIT_INLINE_NODEBUG void reset_extra_reg() noexcept { _extra_reg.reset(); }
+
+ //! \}
+
+ //! \name ARM Specific
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG arm::CondCode arm_cond_code() const noexcept { return (arm::CondCode)inst_id_part<InstIdParts::kARM_Cond>(); }
+
+ ASMJIT_INLINE_NODEBUG void set_arm_cond_code(arm::CondCode cc) noexcept { set_inst_id_part<InstIdParts::kARM_Cond>(uint32_t(cc)); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG a32::DataType arm_dt() const noexcept { return (a32::DataType)inst_id_part<InstIdParts::kA32_DT>(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG a32::DataType arm_dt2() const noexcept { return (a32::DataType)inst_id_part<InstIdParts::kA32_DT2>(); }
+
+ //! \}
+
+ //! \name Statics
+ //! \{
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR InstId compose_arm_inst_id(uint32_t id, arm::CondCode cc) noexcept {
+ return id | (uint32_t(cc) << Support::ctz_const<InstIdParts::kARM_Cond>);
+ }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR InstId compose_arm_inst_id(uint32_t id, a32::DataType dt, arm::CondCode cc = arm::CondCode::kAL) noexcept {
+ return id | (uint32_t(dt) << Support::ctz_const<InstIdParts::kA32_DT>)
+ | (uint32_t(cc) << Support::ctz_const<InstIdParts::kARM_Cond>);
+ }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR InstId compose_arm_inst_id(uint32_t id, a32::DataType dt, a32::DataType dt2, arm::CondCode cc = arm::CondCode::kAL) noexcept {
+ return id | (uint32_t(dt) << Support::ctz_const<InstIdParts::kA32_DT>)
+ | (uint32_t(dt2) << Support::ctz_const<InstIdParts::kA32_DT2>)
+ | (uint32_t(cc) << Support::ctz_const<InstIdParts::kARM_Cond>);
+ }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR InstId extract_real_id(uint32_t id) noexcept {
+ return id & uint32_t(InstIdParts::kRealId);
+ }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR arm::CondCode extract_arm_cond_code(uint32_t id) noexcept {
+ return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ctz_const<InstIdParts::kARM_Cond>);
+ }
+
+ //! \}
+};
+
+//! CPU read/write flags used by \ref InstRWInfo.
+//!
+//! These flags can be used to get a basic overview about CPU specifics flags used by instructions.
+enum class CpuRWFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
+
+ // Common RW Flags (0x000000FF)
+ // ----------------------------
+
+ //! Signed overflow flag.
+ kOF = 0x00000001u,
+ //! Carry flag.
+ kCF = 0x00000002u,
+ //! Zero and/or equality flag (1 if zero/equal).
+ kZF = 0x00000004u,
+ //! Sign flag (negative/sign, if set).
+ kSF = 0x00000008u,
+
+ // X86 Specific RW Flags
+ // ----------------------------------
+
+ //! Carry flag (X86|X86_64).
+ kX86_CF = kCF,
+ //! Overflow flag (X86|X86_64).
+ kX86_OF = kOF,
+ //! Sign flag (X86|X86_64).
+ kX86_SF = kSF,
+ //! Zero flag (X86|X86_64).
+ kX86_ZF = kZF,
+
+ //! Adjust flag (X86|X86_64).
+ kX86_AF = 0x00000100u,
+ //! Parity flag (X86|X86_64).
+ kX86_PF = 0x00000200u,
+ //! Direction flag (X86|X86_64).
+ kX86_DF = 0x00000400u,
+ //! Interrupt enable flag (X86|X86_64).
+ kX86_IF = 0x00000800u,
+
+ //! Alignment check flag (X86|X86_64).
+ kX86_AC = 0x00001000u,
+
+ //! FPU C0 status flag (X86|X86_64).
+ kX86_C0 = 0x00010000u,
+ //! FPU C1 status flag (X86|X86_64).
+ kX86_C1 = 0x00020000u,
+ //! FPU C2 status flag (X86|X86_64).
+ kX86_C2 = 0x00040000u,
+ //! FPU C3 status flag (X86|X86_64).
+ kX86_C3 = 0x00080000u,
+
+ // ARM Specific RW Flags
+ // ----------------------------------
+
+ kARM_V = kOF,
+ kARM_C = kCF,
+ kARM_Z = kZF,
+ kARM_N = kSF,
+ kARM_Q = 0x00000100u,
+ kARM_GE = 0x00000200u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(CpuRWFlags)
+
+//! Operand read/write flags describe how the operand is accessed and some additional features.
+enum class OpRWFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! Operand is read.
+ kRead = 0x00000001u,
+
+ //! Operand is written.
+ kWrite = 0x00000002u,
+
+ //! Operand is both read and written.
+ kRW = 0x00000003u,
+
+ //! Register operand can be replaced by a memory operand.
+ kRegMem = 0x00000004u,
+
+ //! The register must be allocated to the index of the previous register + 1.
+ //!
+ //! This flag is used by all architectures to describe instructions that use consecutive registers, where only the
+ //! first one is encoded in the instruction, and the others are just a sequence that starts with the first one. On
+ //! X86|X86_64 architecture this is used by instructions such as VP2INTERSECTD and VP2INTERSECTQ. On ARM/AArch64
+ //! this is used by vector load and store instructions that can load or store multiple registers at once.
+ kConsecutive = 0x00000008u,
+
+ //! The `extend_byte_mask()` represents a zero extension.
+ kZExt = 0x00000010u,
+
+ //! The register must have assigned a unique physical ID, which cannot be assigned to any other register.
+ kUnique = 0x00000080u,
+
+ //! Register operand must use \ref OpRWInfo::phys_id().
+ kRegPhysId = 0x00000100u,
+ //! Base register of a memory operand must use \ref OpRWInfo::phys_id().
+ kMemPhysId = 0x00000200u,
+
+ //! This memory operand is only used to encode registers and doesn't access memory.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Instructions that use such feature include BNDLDX, BNDSTX, and LEA.
+ kMemFake = 0x000000400u,
+
+ //! Base register of the memory operand will be read.
+ kMemBaseRead = 0x00001000u,
+ //! Base register of the memory operand will be written.
+ kMemBaseWrite = 0x00002000u,
+ //! Base register of the memory operand will be read & written.
+ kMemBaseRW = 0x00003000u,
+
+ //! Index register of the memory operand will be read.
+ kMemIndexRead = 0x00004000u,
+ //! Index register of the memory operand will be written.
+ kMemIndexWrite = 0x00008000u,
+ //! Index register of the memory operand will be read & written.
+ kMemIndexRW = 0x0000C000u,
+
+ //! Base register of the memory operand will be modified before the operation.
+ kMemBasePreModify = 0x00010000u,
+ //! Base register of the memory operand will be modified after the operation.
+ kMemBasePostModify = 0x00020000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(OpRWFlags)
+
+// Don't remove these asserts. Read/Write flags are used extensively
+// by Compiler and they must always be compatible with constants below.
+static_assert(uint32_t(OpRWFlags::kRead) == 0x1, "OpRWFlags::kRead flag must be 0x1");
+static_assert(uint32_t(OpRWFlags::kWrite) == 0x2, "OpRWFlags::kWrite flag must be 0x2");
+static_assert(uint32_t(OpRWFlags::kRegMem) == 0x4, "OpRWFlags::kRegMem flag must be 0x4");
+
+//! Read/Write information related to a single operand, used by \ref InstRWInfo.
+struct OpRWInfo {
+ //! \name Members
+ //! \{
+
+ //! Read/Write flags.
+ OpRWFlags _op_flags;
+ //! Physical register index, if required.
+ uint8_t _phys_id;
+ //! Size of a possible memory operand that can replace a register operand.
+ uint8_t _rm_size;
+ //! If non-zero, then this is a consecutive lead register, and the value describes how many registers follow.
+ uint8_t _consecutive_lead_count;
+ //! Reserved for future use.
+ uint8_t _reserved[1];
+ //! Read bit-mask where each bit represents one byte read from Reg/Mem.
+ uint64_t _read_byte_mask;
+ //! Write bit-mask where each bit represents one byte written to Reg/Mem.
+ uint64_t _write_byte_mask;
+ //! Zero/Sign extend bit-mask where each bit represents one byte written to Reg/Mem.
+ uint64_t _extend_byte_mask;
+
+ //! \}
+
+ //! \name Reset
+ //! \{
+
+ //! Resets this operand information to all zeros.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = OpRWInfo{}; }
+
+ //! Resets this operand info (resets all members) and set common information to the given `op_flags`,
+ //! `register_size`, and possibly `phys_id`.
+ inline void reset(OpRWFlags op_flags, uint32_t register_size, uint32_t phys_id = Reg::kIdBad) noexcept {
+ _op_flags = op_flags;
+ _phys_id = uint8_t(phys_id);
+ _rm_size = Support::test(op_flags, OpRWFlags::kRegMem) ? uint8_t(register_size) : uint8_t(0);
+ _consecutive_lead_count = 0;
+ _reset_reserved();
+
+ uint64_t mask = Support::lsb_mask<uint64_t>(Support::min<uint32_t>(register_size, 64));
+ _read_byte_mask = Support::test(op_flags, OpRWFlags::kRead) ? mask : uint64_t(0);
+ _write_byte_mask = Support::test(op_flags, OpRWFlags::kWrite) ? mask : uint64_t(0);
+ _extend_byte_mask = 0;
+ }
+
+ ASMJIT_INLINE_NODEBUG void _reset_reserved() noexcept {
+ _reserved[0] = uint8_t(0);
+ }
+
+ //! \}
+
+ //! \name Operand Flags
+ //! \{
+
+ //! Returns operand flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpRWFlags op_flags() const noexcept { return _op_flags; }
+
+ //! Tests whether operand flags contain the given `flag`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_op_flag(OpRWFlags flag) const noexcept { return Support::test(_op_flags, flag); }
+
+ //! Adds the given `flags` to operand flags.
+ ASMJIT_INLINE_NODEBUG void add_op_flags(OpRWFlags flags) noexcept { _op_flags |= flags; }
+
+ //! Removes the given `flags` from operand flags.
+ ASMJIT_INLINE_NODEBUG void clear_op_flags(OpRWFlags flags) noexcept { _op_flags &= ~flags; }
+
+ //! Tests whether this operand is read from.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_read() const noexcept { return has_op_flag(OpRWFlags::kRead); }
+
+ //! Tests whether this operand is written to.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_write() const noexcept { return has_op_flag(OpRWFlags::kWrite); }
+
+ //! Tests whether this operand is both read and write.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_read_write() const noexcept { return (_op_flags & OpRWFlags::kRW) == OpRWFlags::kRW; }
+
+ //! Tests whether this operand is read only.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_read_only() const noexcept { return (_op_flags & OpRWFlags::kRW) == OpRWFlags::kRead; }
+
+ //! Tests whether this operand is write only.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_write_only() const noexcept { return (_op_flags & OpRWFlags::kRW) == OpRWFlags::kWrite; }
+
+ //! Returns the type of a lead register, which is followed by consecutive registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t consecutive_lead_count() const noexcept { return _consecutive_lead_count; }
+
+ //! Tests whether this operand is Reg/Mem
+ //!
+ //! Reg/Mem operands can use either register or memory.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_rm() const noexcept { return has_op_flag(OpRWFlags::kRegMem); }
+
+ //! Tests whether the operand will be zero extended.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_zext() const noexcept { return has_op_flag(OpRWFlags::kZExt); }
+
+ //! Tests whether the operand must have allocated a unique physical id that cannot be shared with other register
+ //! operands.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_unique() const noexcept { return has_op_flag(OpRWFlags::kUnique); }
+
+ //! \}
+
+ //! \name Memory Flags
+ //! \{
+
+ //! Tests whether this is a fake memory operand, which is only used, because of encoding. Fake memory operands do
+ //! not access any memory, they are only used to encode registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_fake() const noexcept { return has_op_flag(OpRWFlags::kMemFake); }
+
+ //! Tests whether the instruction's memory BASE register is used.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_used() const noexcept { return has_op_flag(OpRWFlags::kMemBaseRW); }
+
+ //! Tests whether the instruction reads from its BASE registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_read() const noexcept { return has_op_flag(OpRWFlags::kMemBaseRead); }
+
+ //! Tests whether the instruction writes to its BASE registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_write() const noexcept { return has_op_flag(OpRWFlags::kMemBaseWrite); }
+
+ //! Tests whether the instruction reads and writes from/to its BASE registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_read_write() const noexcept { return (_op_flags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRW; }
+
+ //! Tests whether the instruction only reads from its BASE registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_read_only() const noexcept { return (_op_flags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRead; }
+
+ //! Tests whether the instruction only writes to its BASE registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_write_only() const noexcept { return (_op_flags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseWrite; }
+
+ //! Tests whether the instruction modifies the BASE register before it uses it to calculate the target address.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_pre_modify() const noexcept { return has_op_flag(OpRWFlags::kMemBasePreModify); }
+
+ //! Tests whether the instruction modifies the BASE register after it uses it to calculate the target address.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_base_post_modify() const noexcept { return has_op_flag(OpRWFlags::kMemBasePostModify); }
+
+ //! Tests whether the instruction's memory INDEX register is used.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_index_used() const noexcept { return has_op_flag(OpRWFlags::kMemIndexRW); }
+
+ //! Tests whether the instruction reads the INDEX registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_index_read() const noexcept { return has_op_flag(OpRWFlags::kMemIndexRead); }
+
+ //! Tests whether the instruction writes to its INDEX registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_index_write() const noexcept { return has_op_flag(OpRWFlags::kMemIndexWrite); }
+
+ //! Tests whether the instruction reads and writes from/to its INDEX registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_index_read_write() const noexcept { return (_op_flags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRW; }
+
+ //! Tests whether the instruction only reads from its INDEX registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_index_read_only() const noexcept { return (_op_flags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRead; }
+
+ //! Tests whether the instruction only writes to its INDEX registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mem_index_write_only() const noexcept { return (_op_flags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexWrite; }
+
+ //! \}
+
+ //! \name Physical Register ID
+ //! \{
+
+ //! Returns a physical id of the register that is fixed for this operand.
+ //!
+ //! Returns \ref Reg::kIdBad if any register can be used.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t phys_id() const noexcept { return _phys_id; }
+
+ //! Tests whether \ref phys_id() would return a valid physical register id.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_phys_id() const noexcept { return _phys_id != Reg::kIdBad; }
+
+ //! Sets physical register id, which would be fixed for this operand.
+ ASMJIT_INLINE_NODEBUG void set_phys_id(uint32_t phys_id) noexcept { _phys_id = uint8_t(phys_id); }
+
+ //! \}
+
+ //! \name Reg/Mem Information
+ //! \{
+
+ //! Returns Reg/Mem size of the operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t rm_size() const noexcept { return _rm_size; }
+
+ //! Sets Reg/Mem size of the operand.
+ ASMJIT_INLINE_NODEBUG void set_rm_size(uint32_t rm_size) noexcept { _rm_size = uint8_t(rm_size); }
+
+ //! \}
+
+ //! \name Read & Write Masks
+ //! \{
+
+ //! Returns read mask.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t read_byte_mask() const noexcept { return _read_byte_mask; }
+
+ //! Sets read mask.
+ ASMJIT_INLINE_NODEBUG void set_read_byte_mask(uint64_t mask) noexcept { _read_byte_mask = mask; }
+
+ //! Returns write mask.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t write_byte_mask() const noexcept { return _write_byte_mask; }
+
+ //! Sets write mask.
+ ASMJIT_INLINE_NODEBUG void set_write_byte_mask(uint64_t mask) noexcept { _write_byte_mask = mask; }
+
+ //! Returns extend mask.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t extend_byte_mask() const noexcept { return _extend_byte_mask; }
+
+ //! Sets extend mask.
+ ASMJIT_INLINE_NODEBUG void set_extend_byte_mask(uint64_t mask) noexcept { _extend_byte_mask = mask; }
+
+ //! \}
+};
+
+//! Flags used by \ref InstRWInfo.
+enum class InstRWFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
+
+ //! Describes a move operation.
+ //!
+ //! This flag is used by RA to eliminate moves that are guaranteed to be moves only.
+ kMovOp = 0x00000001u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstRWFlags)
+
+//! Read/Write information of an instruction.
+struct InstRWInfo {
+ //! \name Members
+ //! \{
+
+ //! Instruction flags (there are no flags at the moment, this field is reserved).
+ InstRWFlags _inst_flags;
+ //! CPU flags read.
+ CpuRWFlags _read_flags;
+ //! CPU flags written.
+ CpuRWFlags _write_flags;
+ //! Count of operands.
+ uint8_t _op_count;
+ //! CPU feature required for replacing register operand with memory operand.
+ uint8_t _rm_feature;
+ //! Reserved for future use.
+ uint8_t _reserved[18];
+ //! Read/Write info of extra register (rep{} or kz{}).
+ OpRWInfo _extra_reg;
+ //! Read/Write info of instruction operands.
+ OpRWInfo _operands[Globals::kMaxOpCount];
+
+ //! \}
+
+ //! \name Commons
+ //! \{
+
+ //! Resets this RW information to all zeros.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = InstRWInfo{}; }
+
+ //! \}
+
+ //! \name Instruction Flags
+ //! \{
+
+ //! Returns flags associated with the instruction, see \ref InstRWFlags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstRWFlags inst_flags() const noexcept { return _inst_flags; }
+
+ //! Tests whether the instruction flags contain `flag`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inst_flag(InstRWFlags flag) const noexcept { return Support::test(_inst_flags, flag); }
+
+ //! Tests whether the instruction flags contain \ref InstRWFlags::kMovOp.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mov_op() const noexcept { return has_inst_flag(InstRWFlags::kMovOp); }
+
+ //! \}
+
+ //! \name CPU Flags Information
+ //! \{
+
+ //! Returns a mask of CPU flags read.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CpuRWFlags read_flags() const noexcept { return _read_flags; }
+
+ //! Returns a mask of CPU flags written.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG CpuRWFlags write_flags() const noexcept { return _write_flags; }
+
+ //! \}
+
+ //! \name Reg/Mem Information
+ //! \{
+
+ //! Returns the CPU feature required to replace a register operand with memory operand. If the returned feature is
+ //! zero (none) then this instruction either doesn't provide memory operand combination or there is no extra CPU
+ //! feature required.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Some AVX+ instructions may require extra features for replacing registers with memory operands, for example
+ //! VPSLLDQ instruction only supports `vpslldq reg, reg, imm` combination on AVX/AVX2 capable CPUs and requires
+ //! AVX-512 for `vpslldq reg, mem, imm` combination.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t rm_feature() const noexcept { return _rm_feature; }
+
+ //! \}
+
+ //! \name Operand Read/Write Information
+ //! \{
+
+ //! Returns RW information of extra register operand (extra_reg).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const OpRWInfo& extra_reg() const noexcept { return _extra_reg; }
+
+ //! Returns RW information of all instruction's operands.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const OpRWInfo* operands() const noexcept { return _operands; }
+
+ //! Returns RW information of the operand at the given `index`.
+ [[nodiscard]]
+ inline const OpRWInfo& operand(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxOpCount);
+ return _operands[index];
+ }
+
+ //! Returns the number of operands this instruction has.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t op_count() const noexcept { return _op_count; }
+
+ //! \}
+};
+
+//! Validation flags that can be used with \ref InstAPI::validate().
+enum class ValidationFlags : uint8_t {
+ //! No flags.
+ kNone = 0,
+ //! Allow virtual registers in the instruction.
+ kEnableVirtRegs = 0x01u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(ValidationFlags)
+
+//! Instruction API.
+namespace InstAPI {
+
+#ifndef ASMJIT_NO_TEXT
+//! Appends the name of the instruction specified by `inst_id` and `options` into the `output` string.
+//!
+//! \note Instruction options would only affect instruction prefix & suffix, other options would be ignored.
+//! If `inst_options` is zero then only raw instruction name (without any additional text) will be appended.
+ASMJIT_API Error inst_id_to_string(Arch arch, InstId inst_id, InstStringifyOptions options, String& output) noexcept;
+
+//! Parses an instruction name in the given string `s`. Length is specified by `len` argument, which can be
+//! `SIZE_MAX` if `s` is known to be null terminated.
+//!
+//! Returns the parsed instruction id or \ref BaseInst::kIdNone if no such instruction exists.
+[[nodiscard]]
+ASMJIT_API InstId string_to_inst_id(Arch arch, const char* s, size_t len) noexcept;
+#endif // !ASMJIT_NO_TEXT
+
+#ifndef ASMJIT_NO_INTROSPECTION
+//! Validates the given instruction considering the given `validation_flags`.
+[[nodiscard]]
+ASMJIT_API Error validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags = ValidationFlags::kNone) noexcept;
+
+//! Gets Read/Write information of the given instruction.
+ASMJIT_API Error query_rw_info(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, InstRWInfo* out) noexcept;
+
+//! Gets CPU features required by the given instruction.
+ASMJIT_API Error query_features(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, CpuFeatures* out) noexcept;
+#endif // !ASMJIT_NO_INTROSPECTION
+
+} // {InstAPI}
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_INST_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/instdb.cpp b/3rdparty/asmjit/asmjit/core/instdb.cpp
new file mode 100644
index 00000000000..d085bce5934
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/instdb.cpp
@@ -0,0 +1,142 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/instdb_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+namespace InstNameUtils {
+
+static constexpr uint32_t kBufferSize = 32;
+
+static ASMJIT_INLINE_CONSTEXPR char decode_5bit_char(uint32_t c) noexcept {
+ uint32_t base = c <= 26 ? uint32_t('a') - 1u : uint32_t('0') - 27u;
+ return char(base + c);
+}
+
+static ASMJIT_INLINE size_t decode_to_buffer(char name_out[kBufferSize], uint32_t name_value, InstStringifyOptions options, const char* string_table) noexcept {
+ size_t i;
+
+ if (name_value & 0x80000000u) {
+ // Small string of 5-bit characters.
+ //
+ // NOTE: Small string optimization never provides additional
+ // aliases formatting, so we don't have to consider `options`.
+ for (i = 0; i < 6; i++, name_value >>= 5) {
+ uint32_t c = name_value & 0x1F;
+ if (c == 0)
+ break;
+ name_out[i] = decode_5bit_char(c);
+ }
+ return i;
+ }
+ else {
+ size_t prefix_base = name_value & 0xFFFu;
+ size_t prefix_size = (name_value >> 12) & 0xFu;
+
+ size_t suffix_base = (name_value >> 16) & 0xFFFu;
+ size_t suffix_size = (name_value >> 28) & 0x7u;
+
+ if (Support::test(options, InstStringifyOptions::kAliases) && suffix_base == 0xFFFu) {
+ // Alias formatting immediately follows the instruction name in string table.
+ // The first character specifies the length and then string data follows.
+ prefix_base += prefix_size;
+ prefix_size = uint8_t(string_table[prefix_base]);
+ ASMJIT_ASSERT(prefix_size <= kBufferSize);
+
+ prefix_base += 1; // Skip the byte that specifies the length of a formatted alias.
+ }
+
+ for (i = 0; i < prefix_size; i++) {
+ name_out[i] = string_table[prefix_base + i];
+ }
+
+ char* suffix_out = name_out + prefix_size;
+ for (i = 0; i < suffix_size; i++) {
+ suffix_out[i] = string_table[suffix_base + i];
+ }
+
+ return prefix_size + suffix_size;
+ }
+}
+
+Error decode(uint32_t name_value, InstStringifyOptions options, const char* string_table, String& output) noexcept {
+ char name_data[kBufferSize];
+ size_t name_size = decode_to_buffer(name_data, name_value, options, string_table);
+
+ return output.append(name_data, name_size);
+}
+
+InstId find_instruction(const char* s, size_t len, const uint32_t* name_table, const char* string_table, const InstNameIndex& name_index) noexcept {
+ ASMJIT_ASSERT(s != nullptr);
+ ASMJIT_ASSERT(len > 0u);
+
+ uint32_t prefix = uint32_t(s[0]) - uint32_t('a');
+ if (ASMJIT_UNLIKELY(prefix > uint32_t('z') - uint32_t('a'))) {
+ return BaseInst::kIdNone;
+ }
+
+ size_t base = name_index.data[prefix].start;
+ size_t end = name_index.data[prefix].end;
+
+ if (ASMJIT_UNLIKELY(!base)) {
+ return BaseInst::kIdNone;
+ }
+
+ char name_data[kBufferSize];
+ for (size_t lim = end - base; lim != 0; lim >>= 1) {
+ size_t inst_id = base + (lim >> 1);
+ size_t name_size = decode_to_buffer(name_data, name_table[inst_id], InstStringifyOptions::kNone, string_table);
+
+ int result = Support::compare_string_views(s, len, name_data, name_size);
+ if (result < 0) {
+ continue;
+ }
+
+ if (result > 0) {
+ base = inst_id + 1;
+ lim--;
+ continue;
+ }
+
+ return InstId(inst_id);
+ }
+
+ return BaseInst::kIdNone;
+}
+
+
+uint32_t find_alias(const char* s, size_t len, const uint32_t* name_table, const char* string_table, uint32_t alias_name_count) noexcept {
+ ASMJIT_ASSERT(s != nullptr);
+ ASMJIT_ASSERT(len > 0u);
+
+ size_t base = 0;
+ char name_data[kBufferSize];
+
+ for (size_t lim = size_t(alias_name_count) - base; lim != 0; lim >>= 1) {
+ size_t index = base + (lim >> 1);
+ size_t name_size = decode_to_buffer(name_data, name_table[index], InstStringifyOptions::kNone, string_table);
+
+ int result = Support::compare_string_views(s, len, name_data, name_size);
+ if (result < 0) {
+ continue;
+ }
+
+ if (result > 0) {
+ base = index + 1;
+ lim--;
+ continue;
+ }
+
+ return uint32_t(index);
+ }
+
+ return Globals::kInvalidId;
+}
+
+} // {InstNameUtils}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/instdb_p.h b/3rdparty/asmjit/asmjit/core/instdb_p.h
new file mode 100644
index 00000000000..326758fcdc7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/instdb_p.h
@@ -0,0 +1,41 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_INSTDB_P_H_INCLUDED
+#define ASMJIT_CORE_INSTDB_P_H_INCLUDED
+
+#include <asmjit/core/inst.h>
+#include <asmjit/core/string.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_instruction_db
+//! \{
+
+struct InstNameIndex {
+ struct Span {
+ uint16_t start;
+ uint16_t end;
+ };
+
+ Span data[26];
+ uint16_t max_name_length;
+};
+
+namespace InstNameUtils {
+
+Error decode(uint32_t name_value, InstStringifyOptions options, const char* string_table, String& output) noexcept;
+InstId find_instruction(const char* s, size_t len, const uint32_t* name_table, const char* string_table, const InstNameIndex& name_index) noexcept;
+uint32_t find_alias(const char* s, size_t len, const uint32_t* name_table, const char* string_table, uint32_t alias_name_count) noexcept;
+
+} // {InstNameUtils}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_INSTDB_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/jitallocator.cpp b/3rdparty/asmjit/asmjit/core/jitallocator.cpp
new file mode 100644
index 00000000000..ad75ffd5046
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/jitallocator.cpp
@@ -0,0 +1,1646 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_JIT
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/jitallocator.h>
+#include <asmjit/core/osutils_p.h>
+#include <asmjit/core/virtmem.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenalist.h>
+#include <asmjit/support/arenapool.h>
+#include <asmjit/support/arenatree.h>
+#include <asmjit/support/support.h>
+
+#if defined(ASMJIT_TEST)
+#include <asmjit-testing/commons/random.h>
+#endif // ASMJIT_TEST
+
+ASMJIT_BEGIN_NAMESPACE
+
+// JitAllocator - Constants
+// ========================
+
+//! Number of pools to use when `JitAllocatorOptions::kUseMultiplePools` is set.
+//!
+//! Each pool increases granularity twice to make memory management more
+//! efficient. Ideal number of pools appears to be 3 to 4 as it distributes
+//! small and large functions properly.
+static constexpr uint32_t kJitAllocatorMultiPoolCount = 3;
+
+//! Minimum granularity (and the default granularity for pool #0).
+static constexpr uint32_t kJitAllocatorBaseGranularity = 64;
+
+//! Maximum block size (32MB).
+static constexpr uint32_t kJitAllocatorMaxBlockSize = 1024 * 1024 * 64;
+
+// JitAllocator - Fill Pattern
+// ===========================
+
+static inline uint32_t JitAllocator_default_fill_pattern() noexcept {
+#if ASMJIT_ARCH_X86
+ // X86 and X86_64 - 4x 'int3' instruction.
+ return 0xCCCCCCCCu;
+#else
+ // Unknown...
+ return 0u;
+#endif
+}
+
+// JitAllocator - BitVectorRangeIterator
+// =====================================
+
+template<typename T, uint32_t B>
+class BitVectorRangeIterator {
+public:
+ const T* _ptr;
+ size_t _idx;
+ size_t _end;
+ T _bit_word;
+
+ static inline constexpr uint32_t kBitWordSize = Support::bit_size_of<T>;
+ static inline constexpr T kXorMask = B == 0 ? Support::bit_ones<T> : T(0);
+
+ ASMJIT_INLINE BitVectorRangeIterator(const T* data, size_t bit_word_count) noexcept {
+ init(data, bit_word_count);
+ }
+
+ ASMJIT_INLINE BitVectorRangeIterator(const T* data, size_t bit_word_count, size_t start, size_t end) noexcept {
+ init(data, bit_word_count, start, end);
+ }
+
+ ASMJIT_INLINE void init(const T* data, size_t bit_word_count) noexcept {
+ init(data, bit_word_count, 0, bit_word_count * kBitWordSize);
+ }
+
+ ASMJIT_INLINE void init(const T* data, size_t bit_word_count, size_t start, size_t end) noexcept {
+ ASMJIT_ASSERT(bit_word_count >= (end + kBitWordSize - 1) / kBitWordSize);
+ Support::maybe_unused(bit_word_count);
+
+ size_t idx = Support::align_down(start, kBitWordSize);
+ const T* ptr = data + (idx / kBitWordSize);
+
+ T bit_word = 0;
+ if (idx < end) {
+ bit_word = (*ptr ^ kXorMask) & (Support::bit_ones<T> << (start % kBitWordSize));
+ }
+
+ _ptr = ptr;
+ _idx = idx;
+ _end = end;
+ _bit_word = bit_word;
+ }
+
+ ASMJIT_INLINE bool next_range(Out<size_t> range_start, Out<size_t> range_end, size_t range_hint = std::numeric_limits<size_t>::max()) noexcept {
+ // Skip all empty BitWords.
+ while (_bit_word == 0) {
+ _idx += kBitWordSize;
+ if (_idx >= _end) {
+ return false;
+ }
+ _bit_word = (*++_ptr) ^ kXorMask;
+ }
+
+ size_t i = Support::ctz(_bit_word);
+
+ *range_start = _idx + i;
+ _bit_word = ~(_bit_word ^ ~(Support::bit_ones<T> << i));
+
+ if (_bit_word == 0) {
+ *range_end = Support::min(_idx + kBitWordSize, _end);
+ while (*range_end - *range_start < range_hint) {
+ _idx += kBitWordSize;
+ if (_idx >= _end) {
+ break;
+ }
+
+ _bit_word = (*++_ptr) ^ kXorMask;
+ if (_bit_word != Support::bit_ones<T>) {
+ size_t j = Support::ctz(~_bit_word);
+ *range_end = Support::min(_idx + j, _end);
+ _bit_word = _bit_word ^ ~(Support::bit_ones<T> << j);
+ break;
+ }
+
+ *range_end = Support::min(_idx + kBitWordSize, _end);
+ _bit_word = 0;
+ continue;
+ }
+
+ return true;
+ }
+ else {
+ size_t j = Support::ctz(_bit_word);
+ *range_end = Support::min(_idx + j, _end);
+
+ _bit_word = ~(_bit_word ^ ~(Support::bit_ones<T> << j));
+ return true;
+ }
+ }
+};
+
+// JitAllocator - Pool
+// ===================
+
+class JitAllocatorBlock;
+
+class JitAllocatorPool {
+public:
+ ASMJIT_NONCOPYABLE(JitAllocatorPool)
+
+ //! \name Members
+ //! \{
+
+ //! Double linked list of blocks.
+ ArenaList<JitAllocatorBlock> blocks;
+ //! Where to start looking first.
+ JitAllocatorBlock* cursor = nullptr;
+
+ //! Count of blocks.
+ uint32_t block_count = 0;
+ //! Allocation granularity.
+ uint16_t granularity = 0;
+ //! Log2(granularity).
+ uint8_t granularity_log2 = 0;
+ //! Count of empty blocks (either 0 or 1 as we won't keep more blocks empty).
+ uint8_t empty_block_count = 0;
+
+ //! Number of bits reserved across all blocks.
+ size_t total_area_size[2] {};
+ //! Number of bits used across all blocks.
+ size_t total_area_used[2] {};
+ //! Overhead of all blocks (in bytes).
+ size_t total_overhead_bytes = 0;
+
+ //! \}
+
+ ASMJIT_INLINE JitAllocatorPool(uint32_t granularity) noexcept
+ : blocks(),
+ granularity(uint16_t(granularity)),
+ granularity_log2(uint8_t(Support::ctz(granularity))) {}
+
+ ASMJIT_INLINE void reset() noexcept {
+ blocks.reset();
+ cursor = nullptr;
+ block_count = 0u;
+ total_area_size[0] = 0u;
+ total_area_size[1] = 0u;
+ total_area_used[0] = 0u;
+ total_area_used[1] = 0u;
+ total_overhead_bytes = 0u;
+ }
+
+ ASMJIT_INLINE_NODEBUG size_t byte_size_from_area_size(uint32_t area_size) const noexcept { return size_t(area_size) * granularity; }
+ ASMJIT_INLINE_NODEBUG uint32_t area_size_from_byte_size(size_t size) const noexcept { return uint32_t((size + granularity - 1) >> granularity_log2); }
+
+ ASMJIT_INLINE_NODEBUG size_t bit_word_count_from_area_size(uint32_t area_size) const noexcept {
+ static constexpr uint32_t kBitWordSizeInBits = Support::bit_size_of<Support::BitWord>;
+ return Support::align_up<size_t>(area_size, kBitWordSizeInBits) / kBitWordSizeInBits;
+ }
+};
+
+// JitAllocator - Block
+// ====================
+
+class JitAllocatorBlock : public ArenaTreeNodeT<JitAllocatorBlock>,
+ public ArenaListNode<JitAllocatorBlock> {
+public:
+ ASMJIT_NONCOPYABLE(JitAllocatorBlock)
+
+ enum Flags : uint32_t {
+ //! Block has initial padding, see \ref JitAllocatorOptions::kDisableInitialPadding.
+ kFlagInitialPadding = 0x00000001u,
+ //! Block is empty.
+ kFlagEmpty = 0x00000002u,
+ //! Block is dirty (dirty largest_unused_area, search_start, search_end, ...).
+ kFlagDirty = 0x00000004u,
+ //! Block is in incremental mode, which means that there is no memory used after search_start.
+ kFlagIncremental = 0x00000008u,
+ //! Block represents memory that is using large pages.
+ kFlagLargePages = 0x00000010u,
+ //! Block represents memory that is dual-mapped.
+ kFlagDualMapped = 0x00000020u
+ };
+
+ static_assert(kFlagInitialPadding == 1, "JitAllocatorBlock::kFlagInitialPadding must be equal to 1");
+
+ static inline uint32_t initial_area_start_by_flags(uint32_t flags) noexcept {
+ return flags & kFlagInitialPadding;
+ }
+
+ //! Link to the pool that owns this block.
+ JitAllocatorPool* _pool {};
+ //! Virtual memory mapping - either single mapping (both pointers equal) or
+ //! dual mapping, where one pointer is Read+Execute and the second Read+Write.
+ VirtMem::DualMapping _mapping {};
+ //! Virtual memory size (block size) [bytes].
+ size_t _block_size = 0;
+
+ //! Block flags.
+ uint32_t _flags = 0;
+ //! Size of the whole block area (bit-vector size).
+ uint32_t _area_size = 0;
+ //! Used area (number of bits in bit-vector used).
+ uint32_t _area_used = 0;
+ //! The largest unused continuous area in the bit-vector (or `area_size` to initiate rescan).
+ uint32_t _largest_unused_area = 0;
+ //! Start of a search range (for unused bits).
+ uint32_t _search_start = 0;
+ //! End of a search range (for unused bits).
+ uint32_t _search_end = 0;
+
+ //! Used bit-vector (0 = unused, 1 = used).
+ Support::BitWord* _used_bit_vector {};
+ //! Stop bit-vector (0 = don't care, 1 = stop).
+ Support::BitWord* _stop_bit_vector {};
+
+ ASMJIT_INLINE JitAllocatorBlock(
+ JitAllocatorPool* pool,
+ VirtMem::DualMapping mapping,
+ size_t block_size,
+ uint32_t block_flags,
+ Support::BitWord* used_bit_vector,
+ Support::BitWord* stop_bit_vector,
+ uint32_t area_size
+ ) noexcept
+ : ArenaTreeNodeT(),
+ _pool(pool),
+ _mapping(mapping),
+ _block_size(block_size),
+ _flags(block_flags),
+ _area_size(area_size),
+ _used_bit_vector(used_bit_vector),
+ _stop_bit_vector(stop_bit_vector) {
+ clear_block();
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG JitAllocatorPool* pool() const noexcept { return _pool; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* rx_ptr() const noexcept { return static_cast<uint8_t*>(_mapping.rx); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t* rw_ptr() const noexcept { return static_cast<uint8_t*>(_mapping.rw); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(uint32_t f) const noexcept { return (_flags & f) != 0; }
+
+ ASMJIT_INLINE_NODEBUG void add_flags(uint32_t f) noexcept { _flags |= f; }
+ ASMJIT_INLINE_NODEBUG void clear_flags(uint32_t f) noexcept { _flags &= ~f; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return has_flag(kFlagEmpty); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_dirty() const noexcept { return has_flag(kFlagDirty); }
+
+ ASMJIT_INLINE_NODEBUG void make_dirty() noexcept { add_flags(kFlagDirty); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_incremental() const noexcept { return has_flag(kFlagIncremental); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_large_pages() const noexcept { return has_flag(kFlagLargePages); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_initial_padding() const noexcept { return has_flag(kFlagInitialPadding); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t initial_area_start() const noexcept { return initial_area_start_by_flags(_flags); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t block_size() const noexcept { return _block_size; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t area_size() const noexcept { return _area_size; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t area_used() const noexcept { return _area_used; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t area_available() const noexcept { return _area_size - _area_used; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t largest_unused_area() const noexcept { return _largest_unused_area; }
+
+ ASMJIT_INLINE void clear_block() noexcept {
+ bool bit = has_initial_padding();
+ size_t bit_word_count = _pool->bit_word_count_from_area_size(_area_size);
+
+ memset(_used_bit_vector, 0, bit_word_count * sizeof(Support::BitWord));
+ memset(_stop_bit_vector, 0, bit_word_count * sizeof(Support::BitWord));
+
+ Support::bit_vector_set_bit(_used_bit_vector, 0, bit);
+ Support::bit_vector_set_bit(_stop_bit_vector, 0, bit);
+
+ uint32_t start = initial_area_start_by_flags(_flags);
+ _area_used = start;
+ _largest_unused_area = _area_size - start;
+ _search_start = start;
+ _search_end = _area_size;
+
+ add_flags(JitAllocatorBlock::kFlagEmpty | JitAllocatorBlock::kFlagIncremental);
+ clear_flags(JitAllocatorBlock::kFlagDirty);
+ }
+
+ ASMJIT_INLINE void mark_allocated_area(uint32_t allocated_area_start, uint32_t allocated_area_end) noexcept {
+ uint32_t allocated_area_size = allocated_area_end - allocated_area_start;
+
+ // Mark the newly allocated space as occupied and also the sentinel.
+ Support::bit_vector_fill(_used_bit_vector, allocated_area_start, allocated_area_size);
+ Support::bit_vector_set_bit(_stop_bit_vector, allocated_area_end - 1, true);
+
+ // Update search region and statistics.
+ _pool->total_area_used[size_t(has_large_pages())] += allocated_area_size;
+ _area_used += allocated_area_size;
+
+ if (area_available() == 0) {
+ _search_start = _area_size;
+ _search_end = 0;
+ _largest_unused_area = 0;
+
+ clear_flags(kFlagDirty | kFlagEmpty);
+ }
+ else {
+ if (_search_start == allocated_area_start) {
+ _search_start = allocated_area_end;
+ }
+
+ if (_search_end == allocated_area_end) {
+ _search_end = allocated_area_start;
+ }
+
+ add_flags(kFlagDirty);
+ clear_flags(kFlagEmpty);
+ }
+ }
+
+ ASMJIT_INLINE void mark_released_area(uint32_t released_area_start, uint32_t released_area_end) noexcept {
+ uint32_t released_area_size = released_area_end - released_area_start;
+
+ // Update the search region and statistics.
+ _pool->total_area_used[size_t(has_large_pages())] -= released_area_size;
+ _area_used -= released_area_size;
+
+ // Unmark occupied bits and also the sentinel.
+ Support::bit_vector_clear(_used_bit_vector, released_area_start, released_area_size);
+ Support::bit_vector_set_bit(_stop_bit_vector, released_area_end - 1, false);
+
+ if (Support::bool_and(is_incremental(), _search_start == released_area_end)) {
+ // Incremental mode: If the area released is at the end of the fully used area, we would like to
+ // keep the incremental mode of the block. In order to do that, we are going to use a different
+ // approach - decrement `_search_start` and increment `_largest_unused_area`, which are essential
+ // for incremental mode blocks.
+ ASMJIT_ASSERT(_search_start >= released_area_size);
+ _search_start -= released_area_size;
+ _largest_unused_area += released_area_size;
+ }
+ else {
+ _search_start = Support::min(_search_start, released_area_start);
+ _search_end = Support::max(_search_end, released_area_end);
+ clear_flags(kFlagDirty | kFlagIncremental);
+
+ if (area_used() == initial_area_start()) {
+ _search_start = initial_area_start();
+ _search_end = _area_size;
+ _largest_unused_area = _area_size - initial_area_start();
+ add_flags(kFlagEmpty);
+ }
+ else {
+ add_flags(kFlagDirty);
+ }
+ }
+ }
+
+ ASMJIT_INLINE void mark_shrunk_area(uint32_t shrunk_area_start, uint32_t shrunk_area_end) noexcept {
+ uint32_t shrunk_area_size = shrunk_area_end - shrunk_area_start;
+
+ // Shrunk area cannot start at zero as it would mean that we have shrunk the first
+ // block to zero bytes, which is not allowed as such block must be released instead.
+ ASMJIT_ASSERT(shrunk_area_start != 0);
+ ASMJIT_ASSERT(shrunk_area_size != 0);
+
+ // Update the search region and statistics.
+ _pool->total_area_used[size_t(has_large_pages())] -= shrunk_area_size;
+ _area_used -= shrunk_area_size;
+
+ if (Support::bool_and(is_incremental(), _search_start == shrunk_area_end)) {
+ _search_start -= shrunk_area_size;
+ _largest_unused_area += shrunk_area_size;
+ }
+ else {
+ _search_start = Support::min(_search_start, shrunk_area_start);
+ _search_end = Support::max(_search_end, shrunk_area_end);
+
+ clear_flags(kFlagIncremental);
+ add_flags(kFlagDirty);
+ }
+
+ // Unmark the released space and move the sentinel.
+ Support::bit_vector_clear(_used_bit_vector, shrunk_area_start, shrunk_area_size);
+ Support::bit_vector_set_bit(_stop_bit_vector, shrunk_area_end - 1, false);
+ Support::bit_vector_set_bit(_stop_bit_vector, shrunk_area_start - 1, true);
+ }
+
+ // RBTree default CMP uses '<' and '>' operators.
+ ASMJIT_INLINE_NODEBUG bool operator<(const JitAllocatorBlock& other) const noexcept { return rx_ptr() < other.rx_ptr(); }
+ ASMJIT_INLINE_NODEBUG bool operator>(const JitAllocatorBlock& other) const noexcept { return rx_ptr() > other.rx_ptr(); }
+
+ // Special implementation for querying blocks by `key`, which must be in `[BlockPtr, BlockPtr + BlockSize)` range.
+ ASMJIT_INLINE_NODEBUG bool operator<(const uint8_t* key) const noexcept { return rx_ptr() + _block_size <= key; }
+ ASMJIT_INLINE_NODEBUG bool operator>(const uint8_t* key) const noexcept { return rx_ptr() > key; }
+};
+
+// JitAllocator - PrivateImpl
+// ==========================
+
+class JitAllocatorPrivateImpl : public JitAllocator::Impl {
+public:
+ //! \name Members
+ //! \{
+
+ //! Lock for thread safety.
+ mutable Lock lock;
+ //! System page size (also a minimum block size).
+ uint32_t page_size;
+ //! Number of active allocations.
+ size_t allocation_count;
+
+ //! Blocks from all pools in RBTree.
+ ArenaTree<JitAllocatorBlock> tree;
+ //! Allocator pools.
+ JitAllocatorPool* pools;
+ //! Number of allocator pools.
+ size_t pool_count;
+
+ //! \}
+
+ ASMJIT_INLINE JitAllocatorPrivateImpl(JitAllocatorPool* pools, size_t pool_count) noexcept
+ : JitAllocator::Impl {},
+ page_size(0),
+ allocation_count(0),
+ pools(pools),
+ pool_count(pool_count) {}
+ ASMJIT_INLINE ~JitAllocatorPrivateImpl() noexcept {}
+};
+
+static const JitAllocator::Impl JitAllocatorImpl_none {};
+static const JitAllocator::CreateParams JitAllocatorParams_none {};
+
+// JitAllocator - Utilities
+// ========================
+
+static inline JitAllocatorPrivateImpl* JitAllocator_new_impl(const JitAllocator::CreateParams* params) noexcept {
+ VirtMem::Info vm_info = VirtMem::info();
+
+ if (!params) {
+ params = &JitAllocatorParams_none;
+ }
+
+ JitAllocatorOptions options = params->options;
+ uint32_t block_size = params->block_size;
+ uint32_t granularity = params->granularity;
+ uint32_t fill_pattern = params->fill_pattern;
+
+ // Setup pool count to [1..3].
+ size_t pool_count = 1;
+ if (Support::test(options, JitAllocatorOptions::kUseMultiplePools)) {
+ pool_count = kJitAllocatorMultiPoolCount;
+ }
+
+ // Setup block size [64kB..256MB].
+ if (block_size < 64 * 1024 || block_size > 256 * 1024 * 1024 || !Support::is_power_of_2(block_size)) {
+ block_size = vm_info.page_granularity;
+ }
+
+ // Setup granularity [64..256].
+ if (granularity < 64 || granularity > 256 || !Support::is_power_of_2(granularity)) {
+ granularity = kJitAllocatorBaseGranularity;
+ }
+
+ // Setup fill-pattern.
+ if (uint32_t(options & JitAllocatorOptions::kCustomFillPattern) == 0) {
+ fill_pattern = JitAllocator_default_fill_pattern();
+ }
+
+ size_t size = sizeof(JitAllocatorPrivateImpl) + sizeof(JitAllocatorPool) * pool_count;
+ void* p = ::malloc(size);
+
+ if (ASMJIT_UNLIKELY(!p)) {
+ return nullptr;
+ }
+
+ VirtMem::HardenedRuntimeInfo hardened_rt_info = VirtMem::hardened_runtime_info();
+ if (Support::test(hardened_rt_info.flags, VirtMem::HardenedRuntimeFlags::kEnabled)) {
+ // If we are running within a hardened environment (mapping RWX is not allowed) then we have to use dual mapping
+ // or other runtime capabilities like Apple specific MAP_JIT. There is no point in not enabling these as otherwise
+ // the allocation would fail and JitAllocator would not be able to allocate memory.
+ if (!Support::test(hardened_rt_info.flags, VirtMem::HardenedRuntimeFlags::kMapJit)) {
+ options |= JitAllocatorOptions::kUseDualMapping;
+ }
+ }
+
+ JitAllocatorPool* pools = reinterpret_cast<JitAllocatorPool*>((uint8_t*)p + sizeof(JitAllocatorPrivateImpl));
+ JitAllocatorPrivateImpl* impl = new(Support::PlacementNew{p}) JitAllocatorPrivateImpl(pools, pool_count);
+
+ impl->options = options;
+ impl->block_size = block_size;
+ impl->granularity = granularity;
+ impl->fill_pattern = fill_pattern;
+ impl->page_size = vm_info.page_size;
+
+ for (size_t pool_id = 0; pool_id < pool_count; pool_id++) {
+ new(Support::PlacementNew{&pools[pool_id]}) JitAllocatorPool(granularity << pool_id);
+ }
+
+ return impl;
+}
+
+static ASMJIT_INLINE void JitAllocator_destroy_impl(JitAllocatorPrivateImpl* impl) noexcept {
+ impl->~JitAllocatorPrivateImpl();
+ ::free(impl);
+}
+
+static ASMJIT_INLINE size_t JitAllocator_size_to_pool_id(const JitAllocatorPrivateImpl* impl, size_t size) noexcept {
+ size_t pool_id = impl->pool_count - 1;
+ size_t granularity = size_t(impl->granularity) << pool_id;
+
+ while (pool_id) {
+ if (Support::align_up(size, granularity) == size) {
+ break;
+ }
+ pool_id--;
+ granularity >>= 1;
+ }
+
+ return pool_id;
+}
+
+static ASMJIT_INLINE size_t JitAllocator_bit_vector_size_to_byte_size(uint32_t area_size) noexcept {
+ static constexpr uint32_t kBitWordSizeInBits = Support::bit_size_of<Support::BitWord>;
+ return ((area_size + kBitWordSizeInBits - 1u) / kBitWordSizeInBits) * sizeof(Support::BitWord);
+}
+
+static ASMJIT_INLINE size_t JitAllocator_calculate_ideal_block_size(JitAllocatorPrivateImpl* impl, JitAllocatorPool* pool, size_t allocation_size) noexcept {
+ JitAllocatorBlock* last = pool->blocks.last();
+ size_t block_size = last ? last->block_size() : size_t(impl->block_size);
+
+ // We have to increase the allocation_size if we know that the block must provide padding.
+ if (!Support::test(impl->options, JitAllocatorOptions::kDisableInitialPadding)) {
+ size_t granularity = pool->granularity;
+ if (SIZE_MAX - allocation_size < granularity) {
+ return 0; // Overflown
+ }
+ allocation_size += granularity;
+ }
+
+ if (block_size < kJitAllocatorMaxBlockSize) {
+ block_size *= 2u;
+ }
+
+ if (allocation_size > block_size) {
+ block_size = Support::align_up(allocation_size, impl->block_size);
+ if (ASMJIT_UNLIKELY(block_size < allocation_size)) {
+ return 0; // Overflown.
+ }
+ }
+
+ return block_size;
+}
+
+ASMJIT_NOINLINE
+ASMJIT_FAVOR_SPEED static void JitAllocator_fill_pattern(void* mem, uint32_t pattern, size_t byte_size) noexcept {
+ // NOTE: This is always used to fill a pattern in allocated / freed memory. The allocation has always
+ // a granularity that is greater than the pattern, however, when shrink() is used, we may end up having
+ // an unaligned start, so deal with it here and then copy aligned pattern in the loop.
+ if ((uintptr_t(mem) & 0x1u) && byte_size >= 1u) {
+ static_cast<uint8_t*>(mem)[0] = uint8_t(pattern & 0xFF);
+ mem = static_cast<uint8_t*>(mem) + 1;
+ byte_size--;
+ }
+
+ if ((uintptr_t(mem) & 0x2u) && byte_size >= 2u) {
+ static_cast<uint16_t*>(mem)[0] = uint16_t(pattern & 0xFFFF);
+ mem = static_cast<uint16_t*>(mem) + 1;
+ byte_size -= 2;
+ }
+
+ // Something would be seriously broken if we end up with aligned `mem`, but unaligned `byte_size`.
+ ASMJIT_ASSERT((byte_size & 0x3u) == 0u);
+
+ uint32_t* mem32 = static_cast<uint32_t*>(mem);
+ size_t n = byte_size / 4u;
+
+ for (size_t i = 0; i < n; i++) {
+ mem32[i] = pattern;
+ }
+}
+
+// Allocate a new `JitAllocatorBlock` for the given `block_size`.
+//
+// NOTE: The block doesn't have `kFlagEmpty` flag set, because the new block
+// is only allocated when it's actually needed, so it would be cleared anyway.
+static Error JitAllocator_new_block(JitAllocatorPrivateImpl* impl, JitAllocatorBlock** dst, JitAllocatorPool* pool, size_t block_size) noexcept {
+ using Support::BitWord;
+ static constexpr uint32_t kBitWordSizeInBits = Support::bit_size_of<Support::BitWord>;
+
+ uint32_t block_flags = 0;
+ if (!Support::test(impl->options, JitAllocatorOptions::kDisableInitialPadding)) {
+ block_flags |= JitAllocatorBlock::kFlagInitialPadding;
+ }
+
+ VirtMem::DualMapping virt_mem {};
+ VirtMem::MemoryFlags mem_flags = VirtMem::MemoryFlags::kAccessRWX;
+
+ if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) {
+ ASMJIT_PROPAGATE(VirtMem::alloc_dual_mapping(Out(virt_mem), block_size, mem_flags));
+ block_flags |= JitAllocatorBlock::kFlagDualMapped;
+ }
+ else {
+ bool allocate_regular_pages = true;
+ if (Support::test(impl->options, JitAllocatorOptions::kUseLargePages)) {
+ size_t large_page_size = VirtMem::large_page_size();
+ bool try_large_page = block_size >= large_page_size || Support::test(impl->options, JitAllocatorOptions::kAlignBlockSizeToLargePage);
+
+ // Only proceed if we can actually allocate large pages.
+ if (large_page_size && try_large_page) {
+ size_t large_block_size = Support::align_up(block_size, large_page_size);
+ Error err = VirtMem::alloc(&virt_mem.rx, large_block_size, mem_flags | VirtMem::MemoryFlags::kMMapLargePages);
+
+ // Fallback to regular pages if large page(s) allocation failed.
+ if (err == Error::kOk) {
+ allocate_regular_pages = false;
+ block_size = large_block_size;
+ block_flags |= JitAllocatorBlock::kFlagLargePages;
+ }
+ }
+ }
+
+ // Called either if large pages were not requested or large page(s) allocation failed.
+ if (allocate_regular_pages) {
+ ASMJIT_PROPAGATE(VirtMem::alloc(&virt_mem.rx, block_size, mem_flags));
+ }
+
+ virt_mem.rw = virt_mem.rx;
+ }
+
+ uint32_t area_size = uint32_t((block_size + pool->granularity - 1) >> pool->granularity_log2);
+ uint32_t bit_word_count = (area_size + kBitWordSizeInBits - 1u) / kBitWordSizeInBits;
+ uint8_t* block_ptr = static_cast<uint8_t*>(::malloc(sizeof(JitAllocatorBlock) + size_t(bit_word_count) * 2u * sizeof(BitWord)));
+
+ // Out of memory...
+ if (ASMJIT_UNLIKELY(block_ptr == nullptr)) {
+ if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) {
+ (void)VirtMem::release_dual_mapping(virt_mem, block_size);
+ }
+ else {
+ (void)VirtMem::release(virt_mem.rx, block_size);
+ }
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // Fill the allocated virtual memory if secure mode is enabled.
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ VirtMem::ProtectJitReadWriteScope scope(virt_mem.rw, block_size);
+ JitAllocator_fill_pattern(virt_mem.rw, impl->fill_pattern, block_size);
+ }
+
+ BitWord* bit_words = reinterpret_cast<BitWord*>(block_ptr + sizeof(JitAllocatorBlock));
+ *dst = new(Support::PlacementNew{block_ptr}) JitAllocatorBlock(pool, virt_mem, block_size, block_flags, bit_words, bit_words + bit_word_count, area_size);
+ return Error::kOk;
+}
+
+static void JitAllocatorImpl_deleteBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
+ Support::maybe_unused(impl);
+
+ if (block->has_flag(JitAllocatorBlock::kFlagDualMapped)) {
+ (void)VirtMem::release_dual_mapping(block->_mapping, block->block_size());
+ }
+ else {
+ (void)VirtMem::release(block->rx_ptr(), block->block_size());
+ }
+
+ ::free(block);
+}
+
+static void JitAllocatorImpl_insertBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
+ JitAllocatorPool* pool = block->pool();
+
+ if (!pool->cursor) {
+ pool->cursor = block;
+ }
+
+ // Add to RBTree and List.
+ impl->tree.insert(block);
+ pool->blocks.append(block);
+
+ // Update statistics.
+ size_t stat_index = size_t(block->has_large_pages());
+ pool->block_count++;
+ pool->total_area_size[stat_index] += block->area_size();
+ pool->total_area_used[stat_index] += block->area_used();
+ pool->total_overhead_bytes += sizeof(JitAllocatorBlock) + JitAllocator_bit_vector_size_to_byte_size(block->area_size()) * 2u;
+}
+
+static void JitAllocatorImpl_removeBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
+ JitAllocatorPool* pool = block->pool();
+
+ // Remove from RBTree and List.
+ if (pool->cursor == block) {
+ pool->cursor = block->has_prev() ? block->prev() : block->next();
+ }
+
+ impl->tree.remove(block);
+ pool->blocks.unlink(block);
+
+ // Update statistics.
+ size_t stat_index = size_t(block->has_large_pages());
+ pool->block_count--;
+ pool->total_area_size[stat_index] -= block->area_size();
+ pool->total_area_used[stat_index] -= block->area_used();
+ pool->total_overhead_bytes -= sizeof(JitAllocatorBlock) + JitAllocator_bit_vector_size_to_byte_size(block->area_size()) * 2u;
+}
+
+static void JitAllocatorImpl_wipeOutBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
+ if (block->has_flag(JitAllocatorBlock::kFlagEmpty)) {
+ return;
+ }
+
+ JitAllocatorPool* pool = block->pool();
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadWrite);
+
+ uint32_t granularity = pool->granularity;
+ uint8_t* rw_ptr = block->rw_ptr();
+ BitVectorRangeIterator<Support::BitWord, 0> it(block->_used_bit_vector, pool->bit_word_count_from_area_size(block->area_size()));
+
+ size_t range_start;
+ size_t range_end;
+
+ while (it.next_range(Out(range_start), Out(range_end))) {
+ uint8_t* span_ptr = rw_ptr + range_start * granularity;
+ size_t span_size = (range_end - range_start) * granularity;
+
+ JitAllocator_fill_pattern(span_ptr, impl->fill_pattern, span_size);
+ VirtMem::flush_instruction_cache(span_ptr, span_size);
+ }
+ VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadExecute);
+ }
+
+ block->clear_block();
+}
+
+// JitAllocator - Construction & Destruction
+// =========================================
+
+JitAllocator::JitAllocator(const CreateParams* params) noexcept {
+ _impl = JitAllocator_new_impl(params);
+ if (ASMJIT_UNLIKELY(!_impl)) {
+ _impl = const_cast<JitAllocator::Impl*>(&JitAllocatorImpl_none);
+ }
+}
+
+JitAllocator::~JitAllocator() noexcept {
+ if (_impl == &JitAllocatorImpl_none) {
+ return;
+ }
+
+ reset(ResetPolicy::kHard);
+ JitAllocator_destroy_impl(static_cast<JitAllocatorPrivateImpl*>(_impl));
+}
+
+// JitAllocator - Reset
+// ====================
+
+void JitAllocator::reset(ResetPolicy reset_policy) noexcept {
+ if (_impl == &JitAllocatorImpl_none) {
+ return;
+ }
+
+ JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
+ impl->tree.reset();
+ size_t pool_count = impl->pool_count;
+
+ for (size_t pool_id = 0; pool_id < pool_count; pool_id++) {
+ JitAllocatorPool& pool = impl->pools[pool_id];
+ JitAllocatorBlock* block = pool.blocks.first();
+
+ pool.reset();
+
+ if (block) {
+ JitAllocatorBlock* block_to_keep = nullptr;
+ if (reset_policy != ResetPolicy::kHard && uint32_t(impl->options & JitAllocatorOptions::kImmediateRelease) == 0) {
+ block_to_keep = block;
+ block = block->next();
+ }
+
+ while (block) {
+ JitAllocatorBlock* next = block->next();
+ JitAllocatorImpl_deleteBlock(impl, block);
+ block = next;
+ }
+
+ if (block_to_keep) {
+ block_to_keep->_list_nodes[0] = nullptr;
+ block_to_keep->_list_nodes[1] = nullptr;
+ JitAllocatorImpl_wipeOutBlock(impl, block_to_keep);
+ JitAllocatorImpl_insertBlock(impl, block_to_keep);
+ pool.empty_block_count = 1;
+ }
+ }
+ }
+}
+
+// JitAllocator - Statistics
+// =========================
+
+JitAllocator::Statistics JitAllocator::statistics() const noexcept {
+ Statistics statistics;
+ statistics.reset();
+
+ if (ASMJIT_LIKELY(_impl != &JitAllocatorImpl_none)) {
+ JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
+ LockGuard guard(impl->lock);
+
+ size_t pool_count = impl->pool_count;
+ for (size_t pool_id = 0; pool_id < pool_count; pool_id++) {
+ const JitAllocatorPool& pool = impl->pools[pool_id];
+ statistics._block_count += size_t(pool.block_count);
+ statistics._reserved_size += size_t(pool.total_area_size[0] + pool.total_area_size[1]) * pool.granularity;
+ statistics._used_size += size_t(pool.total_area_used[0] + pool.total_area_used[1]) * pool.granularity;
+ statistics._overhead_size += size_t(pool.total_overhead_bytes);
+ }
+
+ statistics._allocation_count = impl->allocation_count;
+ }
+
+ return statistics;
+}
+
+// JitAllocator - Alloc & Release
+// ==============================
+
+Error JitAllocator::alloc(Out<Span> out, size_t size) noexcept {
+ constexpr uint32_t no_index = std::numeric_limits<uint32_t>::max();
+ constexpr size_t max_request_size = std::numeric_limits<uint32_t>::max() / 2u;
+
+ JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
+ bool not_initialized = _impl == &JitAllocatorImpl_none;
+
+ // Align to the minimum granularity by default.
+ size = Support::align_up<size_t>(size, impl->granularity);
+ out = Span{};
+
+ if (ASMJIT_UNLIKELY(Support::bool_or(not_initialized, size - 1u >= max_request_size))) {
+ return make_error(not_initialized ? Error::kNotInitialized :
+ size == 0u ? Error::kInvalidArgument : Error::kTooLarge);
+ }
+
+ LockGuard guard(impl->lock);
+ JitAllocatorPool* pool = &impl->pools[JitAllocator_size_to_pool_id(impl, size)];
+
+ uint32_t area_index = no_index;
+ uint32_t area_size = uint32_t(pool->area_size_from_byte_size(size));
+
+ // Try to find the requested memory area in existing blocks.
+ JitAllocatorBlock* block = pool->cursor;
+
+ if (block) {
+ JitAllocatorBlock* initial = block;
+
+ do {
+ uint32_t largest_unused_area = block->largest_unused_area();
+
+ if (Support::bool_and(block->is_incremental(), largest_unused_area >= area_size)) {
+ // Fast path: If the block is in incremental mode, which means that it's guaranteed it's full before
+ // `search_start` and completely empty after it, we can just quickly increment `search_start` and be
+ // done with the allocation. This is a little bit faster than constructing a BitVectorRangeIterator
+ // and searching for zero bit clusters. When a block is in incremental mode its `largest_unused_area`
+ // is basically the free space after `search_start`, so that's the only thing to check.
+ area_index = block->_search_start;
+ block->_largest_unused_area -= area_size;
+ break;
+ }
+ else if (block->area_available() >= area_size) {
+ // Regular path: Search for a cluster of bits that would mark an empty area we want to allocate.
+ if (Support::bool_or(block->is_dirty(), largest_unused_area >= area_size)) {
+ BitVectorRangeIterator<Support::BitWord, 0> it(block->_used_bit_vector, pool->bit_word_count_from_area_size(block->area_size()), block->_search_start, block->_search_end);
+
+ size_t range_start = 0;
+ size_t range_end = block->area_size();
+
+ size_t search_start = SIZE_MAX;
+ size_t largest_area = 0;
+
+ while (it.next_range(Out(range_start), Out(range_end), area_size)) {
+ size_t range_size = range_end - range_start;
+ if (range_size >= area_size) {
+ area_index = uint32_t(range_start);
+ break;
+ }
+
+ search_start = Support::min(search_start, range_start);
+ largest_area = Support::max(largest_area, range_size);
+ }
+
+ if (area_index != no_index) {
+ break;
+ }
+
+ if (search_start != SIZE_MAX) {
+ // Because we have iterated over the entire block, we can now mark the
+ // largest unused area that can be used to cache the next traversal.
+ size_t search_end = range_end;
+
+ block->_search_start = uint32_t(search_start);
+ block->_search_end = uint32_t(search_end);
+ block->_largest_unused_area = uint32_t(largest_area);
+ block->clear_flags(JitAllocatorBlock::kFlagDirty);
+ }
+ }
+ }
+
+ // The block cursor doesn't have to start with the first block and we want to
+ // iterate all before concluding that there is no free space in any block.
+ block = block->has_next() ? block->next() : pool->blocks.first();
+ } while (block != initial);
+ }
+
+ // Allocate a new block if there is no region of a required size.
+ if (area_index == no_index) {
+ size_t block_size = JitAllocator_calculate_ideal_block_size(impl, pool, size);
+ if (ASMJIT_UNLIKELY(!block_size)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ ASMJIT_PROPAGATE(JitAllocator_new_block(impl, &block, pool, block_size));
+ area_index = block->initial_area_start();
+
+ JitAllocatorImpl_insertBlock(impl, block);
+ block->_search_start += area_size;
+ block->_largest_unused_area -= area_size;
+ }
+ else if (block->has_flag(JitAllocatorBlock::kFlagEmpty)) {
+ pool->empty_block_count--;
+ block->clear_flags(JitAllocatorBlock::kFlagEmpty);
+ }
+
+ // Update statistics.
+ impl->allocation_count++;
+ block->mark_allocated_area(area_index, area_index + area_size);
+
+ // Return a span referencing the allocated memory.
+ size_t offset = pool->byte_size_from_area_size(area_index);
+ ASMJIT_ASSERT(offset <= block->block_size() - size);
+
+ out->_rx = block->rx_ptr() + offset;
+ out->_rw = block->rw_ptr() + offset;
+ out->_size = size;
+ out->_block = static_cast<void*>(block);
+
+ return Error::kOk;
+}
+
+Error JitAllocator::release(void* rx) noexcept {
+ bool not_initialized = _impl == &JitAllocatorImpl_none;
+
+ if (ASMJIT_UNLIKELY(Support::bool_or(not_initialized, !rx))) {
+ return make_error(not_initialized ? Error::kNotInitialized : Error::kInvalidArgument);
+ }
+
+ JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
+ LockGuard guard(impl->lock);
+
+ JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(rx));
+ if (ASMJIT_UNLIKELY(!block)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // Offset relative to the start of the block.
+ JitAllocatorPool* pool = block->pool();
+ size_t offset = (size_t)((uint8_t*)rx - block->rx_ptr());
+
+ // The first bit representing the allocated area and its size.
+ uint32_t area_index = uint32_t(offset >> pool->granularity_log2);
+ uint32_t area_end = uint32_t(Support::bit_vector_index_of(block->_stop_bit_vector, area_index, true)) + 1;
+ uint32_t area_size = area_end - area_index;
+
+ impl->allocation_count--;
+ block->mark_released_area(area_index, area_end);
+
+ // Fill the released memory if the secure mode is enabled.
+ if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ uint8_t* span_ptr = block->rw_ptr() + area_index * pool->granularity;
+ size_t span_size = area_size * pool->granularity;
+
+ VirtMem::ProtectJitReadWriteScope scope(span_ptr, span_size);
+ JitAllocator_fill_pattern(span_ptr, impl->fill_pattern, span_size);
+ }
+
+ // Release the whole block if it became empty.
+ if (block->is_empty()) {
+ if (pool->empty_block_count || Support::test(impl->options, JitAllocatorOptions::kImmediateRelease)) {
+ JitAllocatorImpl_removeBlock(impl, block);
+ JitAllocatorImpl_deleteBlock(impl, block);
+ }
+ else {
+ pool->empty_block_count++;
+ }
+ }
+
+ return Error::kOk;
+}
+
+static Error JitAllocatorImpl_shrink(JitAllocatorPrivateImpl* impl, JitAllocator::Span& span, size_t new_size, bool already_under_write_scope) noexcept {
+ JitAllocatorBlock* block = static_cast<JitAllocatorBlock*>(span._block);
+ if (ASMJIT_UNLIKELY(!block)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ LockGuard guard(impl->lock);
+
+ // Offset relative to the start of the block.
+ JitAllocatorPool* pool = block->pool();
+ size_t offset = (size_t)((uint8_t*)span.rx() - block->rx_ptr());
+
+ // The first bit representing the allocated area and its size.
+ uint32_t area_start = uint32_t(offset >> pool->granularity_log2);
+
+ // Don't trust `span.size()` - if it has been already truncated we would be off...
+ bool is_used = Support::bit_vector_get_bit(block->_used_bit_vector, area_start);
+ if (ASMJIT_UNLIKELY(!is_used)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ uint32_t area_end = uint32_t(Support::bit_vector_index_of(block->_stop_bit_vector, area_start, true)) + 1;
+ uint32_t area_prev_size = area_end - area_start;
+ uint32_t span_prev_size = area_prev_size * pool->granularity;
+ uint32_t area_shrunk_size = pool->area_size_from_byte_size(new_size);
+
+ if (ASMJIT_UNLIKELY(area_shrunk_size > area_prev_size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ uint32_t area_diff = area_prev_size - area_shrunk_size;
+ if (area_diff) {
+ block->mark_shrunk_area(area_start + area_shrunk_size, area_end);
+ span._size = pool->byte_size_from_area_size(area_shrunk_size);
+ }
+
+ // Fill released memory if the secure mode is enabled.
+ if (new_size < span_prev_size && Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
+ uint8_t* span_ptr = block->rw_ptr() + (area_start + area_shrunk_size) * pool->granularity;
+ size_t span_size = area_diff * pool->granularity;
+
+ if (!already_under_write_scope) {
+ VirtMem::ProtectJitReadWriteScope scope(span_ptr, span_size, VirtMem::CachePolicy::kNeverFlush);
+ JitAllocator_fill_pattern(span_ptr, impl->fill_pattern, span_size);
+ }
+ else {
+ JitAllocator_fill_pattern(span_ptr, impl->fill_pattern, span_size);
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error JitAllocator::shrink(Span& span, size_t new_size) noexcept {
+ bool not_initialized = _impl == &JitAllocatorImpl_none;
+
+ if (ASMJIT_UNLIKELY(Support::bool_or(not_initialized, !span.rx()))) {
+ return make_error(not_initialized ? Error::kNotInitialized : Error::kInvalidArgument);
+ }
+
+ if (ASMJIT_UNLIKELY(new_size == 0)) {
+ Error err = release(span.rx());
+ span = Span{};
+ return err;
+ }
+
+ return JitAllocatorImpl_shrink(static_cast<JitAllocatorPrivateImpl*>(_impl), span, new_size, false);
+}
+
+Error JitAllocator::query(Out<Span> out, void* rx) const noexcept {
+ *out = Span{};
+
+ if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none)) {
+ return make_error(Error::kNotInitialized);
+ }
+
+ JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
+ LockGuard guard(impl->lock);
+ JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(rx));
+
+ if (ASMJIT_UNLIKELY(!block)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ // Offset relative to the start of the block.
+ JitAllocatorPool* pool = block->pool();
+ size_t offset = (size_t)((uint8_t*)rx - block->rx_ptr());
+
+ // The first bit representing the allocated area and its size.
+ uint32_t area_start = uint32_t(offset >> pool->granularity_log2);
+
+ bool is_used = Support::bit_vector_get_bit(block->_used_bit_vector, area_start);
+ if (ASMJIT_UNLIKELY(!is_used)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ uint32_t area_end = uint32_t(Support::bit_vector_index_of(block->_stop_bit_vector, area_start, true)) + 1;
+ size_t byte_offset = pool->byte_size_from_area_size(area_start);
+ size_t byte_size = pool->byte_size_from_area_size(area_end - area_start);
+
+ out->_rx = static_cast<uint8_t*>(block->_mapping.rx) + byte_offset;
+ out->_rw = static_cast<uint8_t*>(block->_mapping.rw) + byte_offset;
+ out->_size = byte_size;
+ out->_block = static_cast<void*>(block);
+
+ return Error::kOk;
+}
+
+// JitAllocator - Write
+// ====================
+
+static ASMJIT_INLINE VirtMem::CachePolicy JitAllocator_defaultPolicyForSpan(const JitAllocator::Span& span) noexcept {
+ if (Support::test(span.flags(), JitAllocator::Span::Flags::kInstructionCacheClean)) {
+ return VirtMem::CachePolicy::kNeverFlush;
+ }
+ else {
+ return VirtMem::CachePolicy::kFlushAfterWrite;
+ }
+}
+
+Error JitAllocator::write(Span& span, size_t offset, const void* src, size_t size, VirtMem::CachePolicy policy) noexcept {
+ if (ASMJIT_UNLIKELY(span._block == nullptr || offset > span.size() || span.size() - offset < size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ if (ASMJIT_UNLIKELY(size == 0)) {
+ return Error::kOk;
+ }
+
+ if (policy == VirtMem::CachePolicy::kDefault) {
+ policy = JitAllocator_defaultPolicyForSpan(span);
+ }
+
+ VirtMem::ProtectJitReadWriteScope write_scope(span.rx(), span.size(), policy);
+ memcpy(static_cast<uint8_t*>(span.rw()) + offset, src, size);
+ return Error::kOk;
+}
+
+Error JitAllocator::write(Span& span, WriteFunc write_fn, void* user_data, VirtMem::CachePolicy policy) noexcept {
+ if (ASMJIT_UNLIKELY(span._block == nullptr) || span.size() == 0) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ size_t size = span.size();
+ if (ASMJIT_UNLIKELY(size == 0)) {
+ return Error::kOk;
+ }
+
+ if (policy == VirtMem::CachePolicy::kDefault) {
+ policy = JitAllocator_defaultPolicyForSpan(span);
+ }
+
+ VirtMem::ProtectJitReadWriteScope write_scope(span.rx(), span.size(), policy);
+ ASMJIT_PROPAGATE(write_fn(span, user_data));
+
+ // Check whether span.truncate() has been called.
+ if (span.size() != size) {
+ // OK, this is a bit awkward... However, shrink wants the original span and new_size, so we have to swap.
+ std::swap(span._size, size);
+ return JitAllocatorImpl_shrink(static_cast<JitAllocatorPrivateImpl*>(_impl), span, size, true);
+ }
+
+ return Error::kOk;
+}
+
+// JitAllocator - Write Scope
+// ==========================
+
+Error JitAllocator::begin_write_scope(WriteScopeData& scope, VirtMem::CachePolicy policy) noexcept {
+ scope.policy = policy;
+ scope.flags = 0u;
+ scope.data[0] = 0u;
+ scope.data[1] = 0u;
+ return Error::kOk;
+}
+
+Error JitAllocator::end_write_scope(WriteScopeData& scope) noexcept {
+ Support::maybe_unused(scope);
+ return Error::kOk;
+}
+
+Error JitAllocator::flush_write_scope(WriteScopeData& scope) noexcept {
+ Support::maybe_unused(scope);
+ return Error::kOk;
+}
+
+Error JitAllocator::scoped_write(WriteScopeData& scope, Span& span, size_t offset, const void* src, size_t size) noexcept {
+ return write(span, offset, src, size, scope.policy);
+}
+
+Error JitAllocator::scoped_write(WriteScopeData& scope, Span& span, WriteFunc write_fn, void* user_data) noexcept {
+ return write(span, write_fn, user_data, scope.policy);
+}
+
+// JitAllocator - Tests
+// ====================
+
+#if defined(ASMJIT_TEST)
+namespace JitAllocatorUtils {
+ static void fill_pattern_64(void* p_, uint64_t pattern, size_t size_in_bytes) noexcept {
+ uint64_t* p = static_cast<uint64_t*>(p_);
+ size_t n = size_in_bytes / 8u;
+
+ for (size_t i = 0; i < n; i++) {
+ p[i] = pattern;
+ }
+ }
+
+ static bool verify_pattern_64(const void* p_, uint64_t pattern, size_t size_in_bytes) noexcept {
+ const uint64_t* p = static_cast<const uint64_t*>(p_);
+ size_t n = size_in_bytes / 8u;
+
+ for (size_t i = 0; i < n; i++) {
+ if (p[i] != pattern) {
+ INFO("Pattern verification failed at 0x%p [%zu * 8]: value(0x%016llX) != expected(0x%016llX)",
+ p,
+ i,
+ (unsigned long long)p[i],
+ (unsigned long long)pattern);
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
+
+// Helper class to verify that JitAllocator doesn't return addresses that overlap.
+class JitAllocatorWrapper {
+public:
+ // Address to a memory region of a given size.
+ class Range {
+ public:
+ inline Range(uint8_t* addr, size_t size) noexcept
+ : addr(addr),
+ size(size) {}
+ uint8_t* addr;
+ size_t size;
+ };
+
+ // Based on JitAllocator::Block, serves our purpose well...
+ class Record : public ArenaTreeNodeT<Record>,
+ public Range {
+ public:
+ //! Read/write address, in case this is a dual mapping.
+ void* _rw;
+ //! Describes a pattern used to fill the allocated memory.
+ uint64_t pattern;
+
+ inline Record(void* rx, void* rw, size_t size, uint64_t pattern)
+ : ArenaTreeNodeT<Record>(),
+ Range(static_cast<uint8_t*>(rx), size),
+ _rw(rw),
+ pattern(pattern) {}
+
+ inline void* rx() const noexcept { return addr; }
+ inline void* rw() const noexcept { return _rw; }
+
+ inline bool operator<(const Record& other) const noexcept { return addr < other.addr; }
+ inline bool operator>(const Record& other) const noexcept { return addr > other.addr; }
+
+ inline bool operator<(const uint8_t* key) const noexcept { return addr + size <= key; }
+ inline bool operator>(const uint8_t* key) const noexcept { return addr > key; }
+ };
+
+ Arena _arena;
+ ArenaPool<Record> _record_pool;
+ ArenaTree<Record> _records;
+ JitAllocator _allocator;
+ TestUtils::Random _rng;
+
+ explicit JitAllocatorWrapper(const JitAllocator::CreateParams* params) noexcept
+ : _arena(1024u * 1024u),
+ _allocator(params),
+ _rng(0x123456789u) {}
+
+ void _insert(void* rx_ptr, void* rw_ptr, size_t size) noexcept {
+ uint8_t* ptr = static_cast<uint8_t*>(rx_ptr);
+ uint8_t* end_ptr = ptr + size - 1u;
+
+ Record* record;
+
+ record = _records.get(ptr);
+ EXPECT_NULL(record)
+ .message("Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, ptr, ptr + size);
+
+ record = _records.get(end_ptr);
+ EXPECT_NULL(record)
+ .message("Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, ptr, ptr + size);
+
+ uint64_t pattern = _rng.next_uint64();
+ record = new(Support::PlacementNew{_record_pool.alloc(_arena)}) Record(rx_ptr, rw_ptr, size, pattern);
+ EXPECT_NOT_NULL(record);
+
+ {
+ VirtMem::ProtectJitReadWriteScope scope(rw_ptr, size);
+ JitAllocatorUtils::fill_pattern_64(rw_ptr, pattern, size);
+ }
+
+ VirtMem::flush_instruction_cache(rx_ptr, size);
+ EXPECT_TRUE(JitAllocatorUtils::verify_pattern_64(rx_ptr, pattern, size));
+
+ _records.insert(record);
+ }
+
+ void _remove(void* p) noexcept {
+ Record* record = _records.get(static_cast<uint8_t*>(p));
+ EXPECT_NOT_NULL(record);
+
+ EXPECT_TRUE(JitAllocatorUtils::verify_pattern_64(record->rx(), record->pattern, record->size));
+ EXPECT_TRUE(JitAllocatorUtils::verify_pattern_64(record->rw(), record->pattern, record->size));
+
+ _records.remove(record);
+ _record_pool.release(record);
+ }
+
+ void* alloc(size_t size) noexcept {
+ JitAllocator::Span span;
+ Error err = _allocator.alloc(Out(span), size);
+ EXPECT_EQ(err, Error::kOk)
+ .message("JitAllocator failed to allocate %zu bytes\n", size);
+
+ _insert(span.rx(), span.rw(), size);
+ return span.rx();
+ }
+
+ void release(void* p) noexcept {
+ _remove(p);
+ EXPECT_EQ(_allocator.release(p), Error::kOk)
+ .message("JitAllocator failed to release '%p'\n", p);
+ }
+
+ void shrink(void* p, size_t new_size) noexcept {
+ Record* record = _records.get(static_cast<uint8_t*>(p));
+ EXPECT_NOT_NULL(record);
+
+ if (!new_size) {
+ return release(p);
+ }
+
+ JitAllocator::Span span;
+ EXPECT_EQ(_allocator.query(Out(span), p), Error::kOk);
+ Error err = _allocator.shrink(span, new_size);
+ EXPECT_EQ(err, Error::kOk)
+ .message("JitAllocator failed to shrink %p to %zu bytes\n", p, new_size);
+
+ record->size = new_size;
+ }
+};
+
+static void JitAllocatorTest_shuffle(void** ptr_array, size_t count, TestUtils::Random& prng) noexcept {
+ for (size_t i = 0; i < count; ++i)
+ std::swap(ptr_array[i], ptr_array[size_t(prng.next_uint32() % count)]);
+}
+
+static void JitAllocatorTest_usage(JitAllocator& allocator) noexcept {
+ JitAllocator::Statistics stats = allocator.statistics();
+ INFO(" Block Count : %9llu [Blocks]" , (unsigned long long)(stats.block_count()));
+ INFO(" Reserved (VirtMem): %9llu [Bytes]" , (unsigned long long)(stats.reserved_size()));
+ INFO(" Used (VirtMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.used_size()), stats.used_ratio() * 100.0);
+ INFO(" Overhead (HeapMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.overhead_size()), stats.overhead_ratio() * 100.0);
+}
+
+template<typename T, size_t kPatternSize, bool Bit>
+static void BitVectorRangeIterator_testRandom(TestUtils::Random& rnd, size_t count) noexcept {
+ for (size_t i = 0; i < count; i++) {
+ T in[kPatternSize];
+ T out[kPatternSize];
+
+ for (size_t j = 0; j < kPatternSize; j++) {
+ in[j] = T(uint64_t(rnd.next_uint32() & 0xFFu) * 0x0101010101010101);
+ out[j] = Bit == 0 ? Support::bit_ones<T> : T(0);
+ }
+
+ {
+ BitVectorRangeIterator<T, Bit> it(in, kPatternSize);
+ size_t range_start, range_end;
+ while (it.next_range(Out(range_start), Out(range_end))) {
+ if (Bit) {
+ Support::bit_vector_fill(out, range_start, range_end - range_start);
+ }
+ else {
+ Support::bit_vector_clear(out, range_start, range_end - range_start);
+ }
+ }
+ }
+
+ for (size_t j = 0; j < kPatternSize; j++) {
+ EXPECT_EQ(in[j], out[j])
+ .message("Invalid pattern detected at [%zu] (%llX != %llX)", j, (unsigned long long)in[j], (unsigned long long)out[j]);
+ }
+ }
+}
+
+static void test_jit_allocator_reset_empty() noexcept {
+ JitAllocator allocator;
+ allocator.reset(ResetPolicy::kSoft);
+}
+
+static void test_jit_allocator_alloc_release() noexcept {
+ size_t kCount = BrokenAPI::has_arg("--quick") ? 20000 : 100000;
+
+ struct TestInfo {
+ const char* name;
+ JitAllocatorOptions options;
+ uint32_t block_size;
+ uint32_t granularity;
+ };
+
+ using Opt = JitAllocatorOptions;
+
+ VirtMem::HardenedRuntimeInfo hri = VirtMem::hardened_runtime_info();
+
+ TestInfo test_info_table[] = {
+ { "Default" , Opt::kNone, 0, 0 },
+ { "16MB blocks" , Opt::kNone, 16 * 1024 * 1024, 0 },
+ { "256B granularity" , Opt::kNone, 0, 256 },
+ { "kUseMultiplePools" , Opt::kUseMultiplePools, 0, 0 },
+ { "kFillUnusedMemory" , Opt::kFillUnusedMemory, 0, 0 },
+ { "kImmediateRelease" , Opt::kImmediateRelease, 0, 0 },
+ { "kDisableInitialPadding" , Opt::kDisableInitialPadding, 0, 0 },
+ { "kUseLargePages" , Opt::kUseLargePages, 0, 0 },
+ { "kUseLargePages | kFillUnusedMemory" , Opt::kUseLargePages | Opt::kFillUnusedMemory, 0, 0 },
+ { "kUseLargePages | kAlignBlockSizeToLargePage", Opt::kUseLargePages | Opt::kAlignBlockSizeToLargePage, 0, 0 },
+ { "kUseDualMapping" , Opt::kUseDualMapping , 0, 0 },
+ { "kUseDualMapping | kFillUnusedMemory" , Opt::kUseDualMapping | Opt::kFillUnusedMemory, 0, 0 }
+ };
+
+ INFO("BitVectorRangeIterator<uint32_t>");
+ {
+ TestUtils::Random rnd;
+ BitVectorRangeIterator_testRandom<uint32_t, 64, 0>(rnd, kCount);
+ }
+
+ INFO("BitVectorRangeIterator<uint64_t>");
+ {
+ TestUtils::Random rnd;
+ BitVectorRangeIterator_testRandom<uint64_t, 64, 0>(rnd, kCount);
+ }
+
+ for (const TestInfo& test_info : test_info_table) {
+ // Don't try to allocate dual-mapping if dual mapping is not possible - it would fail the test.
+ if (Support::test(test_info.options, JitAllocatorOptions::kUseDualMapping) &&
+ !Support::test(hri.flags, VirtMem::HardenedRuntimeFlags::kDualMapping)) {
+ continue;
+ }
+
+ INFO("JitAllocator(%s)", test_info.name);
+
+ JitAllocator::CreateParams params {};
+ params.options = test_info.options;
+ params.block_size = test_info.block_size;
+ params.granularity = test_info.granularity;
+
+ size_t fixed_block_size = 256;
+
+ JitAllocatorWrapper wrapper(&params);
+ TestUtils::Random prng(100);
+
+ size_t i;
+
+ INFO(" Memory alloc/release test - %d allocations", kCount);
+
+ void** ptr_array = (void**)::malloc(sizeof(void*) * size_t(kCount));
+ EXPECT_NOT_NULL(ptr_array);
+
+ // Random blocks tests...
+ INFO(" Allocating random blocks...");
+ for (i = 0; i < kCount; i++) {
+ ptr_array[i] = wrapper.alloc((prng.next_uint32() % 1024) + 8);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Releasing all allocated blocks from the beginning...");
+ for (i = 0; i < kCount; i++) {
+ wrapper.release(ptr_array[i]);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating random blocks again...", kCount);
+ for (i = 0; i < kCount; i++) {
+ ptr_array[i] = wrapper.alloc((prng.next_uint32() % 1024) + 8);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Shuffling allocated blocks...");
+ JitAllocatorTest_shuffle(ptr_array, unsigned(kCount), prng);
+
+ INFO(" Releasing 50%% of allocated blocks...");
+ for (i = 0; i < kCount / 2; i++) {
+ wrapper.release(ptr_array[i]);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating 50%% more blocks again...");
+ for (i = 0; i < kCount / 2; i++) {
+ ptr_array[i] = wrapper.alloc((prng.next_uint32() % 1024) + 8);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Releasing all allocated blocks from the end...");
+ for (i = 0; i < kCount; i++) {
+ wrapper.release(ptr_array[kCount - i - 1]);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ // Fixed blocks tests...
+ INFO(" Allocating %zuB blocks...", fixed_block_size);
+ for (i = 0; i < kCount / 2; i++) {
+ ptr_array[i] = wrapper.alloc(fixed_block_size);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Shrinking each %zuB block to 1 byte", fixed_block_size);
+ for (i = 0; i < kCount / 2; i++) {
+ wrapper.shrink(ptr_array[i], 1);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating more 64B blocks...", 64);
+ for (i = kCount / 2; i < kCount; i++) {
+ ptr_array[i] = wrapper.alloc(64);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Releasing all blocks from the beginning...");
+ for (i = 0; i < kCount; i++) {
+ wrapper.release(ptr_array[i]);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating %zuB blocks...", fixed_block_size);
+ for (i = 0; i < kCount; i++) {
+ ptr_array[i] = wrapper.alloc(fixed_block_size);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Shuffling allocated blocks...");
+ JitAllocatorTest_shuffle(ptr_array, unsigned(kCount), prng);
+
+ INFO(" Releasing 50%% of allocated blocks...");
+ for (i = 0; i < kCount / 2; i++) {
+ wrapper.release(ptr_array[i]);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Allocating 50%% more %zuB blocks again...", fixed_block_size);
+ for (i = 0; i < kCount / 2; i++) {
+ ptr_array[i] = wrapper.alloc(fixed_block_size);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ INFO(" Releasing all allocated blocks from the end...");
+ for (i = 0; i < kCount; i++) {
+ wrapper.release(ptr_array[kCount - i - 1]);
+ }
+ JitAllocatorTest_usage(wrapper._allocator);
+
+ ::free(ptr_array);
+ }
+}
+
+static void test_jit_allocator_query() noexcept {
+ JitAllocator allocator;
+ size_t allocated_size = 100;
+
+ JitAllocator::Span allocated_span;
+ EXPECT_EQ(allocator.alloc(Out(allocated_span), allocated_size), Error::kOk);
+ EXPECT_NOT_NULL(allocated_span.rx());
+ EXPECT_GE(allocated_span.size(), allocated_size);
+
+ JitAllocator::Span queried_span;
+ EXPECT_EQ(allocator.query(Out(queried_span), allocated_span.rx()), Error::kOk);
+ EXPECT_EQ(allocated_span.rx(), queried_span.rx());
+ EXPECT_EQ(allocated_span.rw(), queried_span.rw());
+ EXPECT_EQ(allocated_span.size(), queried_span.size());
+}
+
+UNIT(jit_allocator) {
+ test_jit_allocator_reset_empty();
+ test_jit_allocator_alloc_release();
+ test_jit_allocator_query();
+}
+#endif // ASMJIT_TEST
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/asmjit/core/jitallocator.h b/3rdparty/asmjit/asmjit/core/jitallocator.h
new file mode 100644
index 00000000000..d1eb8f6bf64
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/jitallocator.h
@@ -0,0 +1,615 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_JITALLOCATOR_H_INCLUDED
+#define ASMJIT_CORE_JITALLOCATOR_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_JIT
+
+#include <asmjit/core/globals.h>
+#include <asmjit/core/virtmem.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_virtual_memory
+//! \{
+
+//! Options used by \ref JitAllocator.
+enum class JitAllocatorOptions : uint32_t {
+ //! No options.
+ kNone = 0,
+
+ //! Enables the use of an anonymous memory-mapped memory that is mapped into two buffers having a different pointer.
+ //! The first buffer has read and execute permissions and the second buffer has read+write permissions.
+ //!
+ //! See \ref VirtMem::alloc_dual_mapping() for more details about this feature.
+ //!
+ //! \remarks Dual mapping would be automatically turned on by \ref JitAllocator in case of hardened runtime that
+ //! enforces `W^X` policy, so specifying this flag is essentially forcing to use dual mapped pages even when RWX
+ //! pages can be allocated and dual mapping is not necessary.
+ kUseDualMapping = 0x00000001u,
+
+ //! Enables the use of multiple pools with increasing granularity instead of a single pool. This flag would enable
+ //! 3 internal pools in total having 64, 128, and 256 bytes granularity.
+ //!
+ //! This feature is only recommended for users that generate a lot of code and would like to minimize the overhead
+ //! of `JitAllocator` itself by having blocks of different allocation granularities. Using this feature only for
+ //! few allocations won't pay off as the allocator may need to create more blocks initially before it can take the
+ //! advantage of variable block granularity.
+ kUseMultiplePools = 0x00000002u,
+
+ //! Always fill reserved memory by a fill-pattern.
+ //!
+ //! Causes a new block to be cleared by the fill pattern and freshly released memory to be cleared before making
+ //! it ready for another use.
+ kFillUnusedMemory = 0x00000004u,
+
+ //! When this flag is set the allocator would immediately release unused blocks during `release()` or `reset()`.
+ //! When this flag is not set the allocator would keep one empty block in each pool to prevent excessive virtual
+ //! memory allocations and deallocations in border cases, which involve constantly allocating and deallocating a
+ //! single block caused by repetitive calling `alloc()` and `release()` when the allocator has either no blocks
+ //! or have all blocks fully occupied.
+ kImmediateRelease = 0x00000008u,
+
+ //! This flag enables placing functions (or allocating memory) at the very beginning of each memory mapped region.
+ //!
+ //! Initially, this was the default behavior. However, LLVM developers working on undefined behavior sanitizer
+ //! (UBSAN) decided that they want to store metadata before each function and to access such metadata before an
+ //! indirect function call. This means that the instrumented code always reads from `[fn_tr - 8]` to decode whether
+ //! the function has his metadata present. However, reading 8 bytes below a function means that if a function is
+ //! placed at the very beginning of a memory mapped region, it could try to read bytes that are inaccessible. And
+ //! since AsmJit can be compiled as a shared library and used by applications instrumented by UBSAN, it's not
+ //! possible to conditionally compile the support only when necessary.
+ //!
+ //! \remarks This flag controls a workaround to make it possible to use LLVM UBSAN with AsmJit's \ref JitAllocator.
+ //! There is no undefined behavior even when `kDisableInitialPadding` is used, however, that doesn't really matter
+ //! as LLVM's UBSAN introduces one, and according to LLVM developers it's a "trade-off". This flag is safe to use
+ //! when the code is not instrumented with LLVM's UBSAN.
+ kDisableInitialPadding = 0x00000010u,
+
+ //! Enables the use of large pages, if they are supported and the process can actually allocate them.
+ //!
+ //! \remarks This flag is a hint - if large pages can be allocated, JitAllocator would try to allocate them.
+ //! However, if the allocation fails, it will still try to fallback to use regular pages as \ref JitAllocator
+ //! is designed to minimize allocation failures, so a regular page is better than no page at all. Also, if a
+ //! block \ref JitAllocator wants to allocate is too small to consume a whole large page, regular page(s) will
+ //! be allocated as well.
+ kUseLargePages = 0x00000020u,
+
+ //! Forces \ref JitAllocator to always align block size to be at least as big as a large page, if large pages are
+ //! enabled. This option does nothing if large pages are disabled.
+ //!
+ //! \remarks If \ref kUseLargePages option is used, the allocator would prefer large pages only when allocating a
+ //! block that has a sufficient size. Usually the allocator first allocates smaller block and when more requests
+ //! come it will start increasing the block size of next allocations. This option makes it sure that even the first
+ //! allocation would be the same as a minimum large page when large pages are enabled and can be allocated.
+ kAlignBlockSizeToLargePage = 0x00000040u,
+
+ //! Use a custom fill pattern, must be combined with `kFlagFillUnusedMemory`.
+ kCustomFillPattern = 0x10000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(JitAllocatorOptions)
+
+//! A simple implementation of memory manager that uses `asmjit::VirtMem`
+//! functions to manage virtual memory for JIT compiled code.
+//!
+//! Implementation notes:
+//!
+//! - Granularity of allocated blocks is different than granularity for a typical C malloc. In addition, the allocator
+//! can use several memory pools having a different granularity to minimize the maintenance overhead. Multiple pools
+//! feature requires `kFlagUseMultiplePools` flag to be set.
+//!
+//! - The allocator doesn't store any information in executable memory, instead, the implementation uses two
+//! bit-vectors to manage allocated memory of each allocator-block. The first bit-vector called 'used' is used to
+//! track used memory (where each bit represents memory size defined by granularity) and the second bit vector called
+//! 'stop' is used as a sentinel to mark where the allocated area ends.
+//!
+//! - Internally, the allocator also uses RB tree to keep track of all blocks across all pools. Each inserted block is
+//! added to the tree so it can be matched fast during `release()` and `shrink()`.
+class JitAllocator {
+public:
+ ASMJIT_NONCOPYABLE(JitAllocator)
+
+ //! Visible \ref JitAllocator implementation data.
+ struct Impl {
+ //! Allocator options.
+ JitAllocatorOptions options;
+ //! Base block size (0 if the allocator is not initialized).
+ uint32_t block_size;
+ //! Base granularity (0 if the allocator is not initialized).
+ uint32_t granularity;
+ //! A pattern that is used to fill unused memory if secure mode is enabled.
+ uint32_t fill_pattern;
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Allocator implementation (private).
+ Impl* _impl;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Parameters that can be passed to `JitAllocator` constructor.
+ //!
+ //! Use it like this:
+ //!
+ //! ```
+ //! // Zero initialize (zero means the default value) and change what you need.
+ //! JitAllocator::CreateParams params {};
+ //! params.block_size = 1024 * 1024;
+ //!
+ //! // Create the allocator.
+ //! JitAllocator allocator(&params);
+ //! ```
+ struct CreateParams {
+ //! Allocator options.
+ //!
+ //! No options are used by default.
+ JitAllocatorOptions options = JitAllocatorOptions::kNone;
+
+ //! Base size of a single block in bytes (default 64kB).
+ //!
+ //! \remarks Block size must be equal to or greater than page size and must be power of 2. If the input is not
+ //! valid then the default block size will be used instead.
+ uint32_t block_size = 0;
+
+ //! Base granularity (and also natural alignment) of allocations in bytes (default 64).
+ //!
+ //! Since the `JitAllocator` uses bit-arrays to mark used memory the granularity also specifies how many bytes
+ //! correspond to a single bit in such bit-array. Higher granularity means more waste of virtual memory (as it
+ //! increases the natural alignment), but smaller bit-arrays as less bits would be required per a single block.
+ uint32_t granularity = 0;
+
+ //! Patter to use to fill unused memory.
+ //!
+ //! Only used if \ref JitAllocatorOptions::kCustomFillPattern is set.
+ uint32_t fill_pattern = 0;
+
+ // Reset the content of `CreateParams`.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = CreateParams{}; }
+ };
+
+ //! Creates a `JitAllocator` instance.
+ ASMJIT_API explicit JitAllocator(const CreateParams* params = nullptr) noexcept;
+ //! Destroys the `JitAllocator` instance and release all blocks held.
+ ASMJIT_API ~JitAllocator() noexcept;
+
+ //! Tests whether the JitAllocator has been initialized.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_initialized() const noexcept { return _impl->block_size == 0; }
+
+ //! Free all allocated memory - makes all pointers returned by `alloc()` invalid.
+ //!
+ //! \remarks This function is not thread-safe as it's designed to be used when nobody else is using the
+ //! JitAllocator. The reason is that there is no reason to call `reset()` when the allocator is still in use
+ //! by other threads.
+ ASMJIT_API void reset(ResetPolicy reset_policy = ResetPolicy::kSoft) noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns allocator options, see `Flags`.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG JitAllocatorOptions options() const noexcept { return _impl->options; }
+
+ //! Tests whether the allocator has the given `option` set.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_option(JitAllocatorOptions option) const noexcept { return uint32_t(_impl->options & option) != 0; }
+
+ //! Returns a base block size (a minimum size of block that the allocator would allocate).
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t block_size() const noexcept { return _impl->block_size; }
+
+ //! Returns granularity of the allocator.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t granularity() const noexcept { return _impl->granularity; }
+
+ //! Returns pattern that is used to fill unused memory if `kFlagUseFillPattern` is set.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t fill_pattern() const noexcept { return _impl->fill_pattern; }
+
+ //! \}
+
+ //! \name Alloc & Release
+ //! \{
+
+ //! A memory reference returned by \ref JitAllocator::alloc().
+ //!
+ //! Span contains everything needed to actually write new code to the memory chunk it references.
+ class Span {
+ public:
+ //! \name Constants
+ //! \{
+
+ //! Span flags
+ enum class Flags : uint32_t {
+ //! No flags.
+ kNone = 0u,
+
+ //! The process has never executed the region of the span.
+ //!
+ //! If this flag is set on a \ref Span it would mean that the allocator can avoid flushing
+ //! instruction cache after a code has been written to it.
+ kInstructionCacheClean = 0x00000001u
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Address of memory that has Read and Execute permissions.
+ void* _rx = nullptr;
+
+ //! Address of memory that has Read and Write permissions.
+ void* _rw = nullptr;
+
+ //! Size of the span in bytes (rounded up to the allocation granularity).
+ size_t _size = 0;
+
+ //! Pointer that references a memory block maintained by \ref JitAllocator.
+ //!
+ //! This pointer is considered private and should never be used nor inspected outside of AsmJit.
+ void* _block = nullptr;
+
+ //! Span flags.
+ Flags _flags = Flags::kNone;
+
+ //! Reserved for future use.
+ uint32_t _reserved = 0;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns a pointer having Read & Execute permissions (references executable memory).
+ //!
+ //! This pointer is never NULL if the allocation succeeded, it points to an executable memory.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG void* rx() const noexcept { return _rx; }
+
+ //! Returns a pointer having Read & Write permissions (references writable memory).
+ //!
+ //! Depending on the type of the allocation strategy this could either be:
+ //!
+ //! - the same address as returned by `rx()` if the allocator uses RWX mapping (pages have all of Read, Write,
+ //! and Execute permissions) or MAP_JIT, which requires either \ref VirtMem::ProtectJitReadWriteScope or to
+ //! call \ref VirtMem::protect_jit_memory() manually.
+ //! - a valid pointer, but not the same as `rx` - this would be valid if dual mapping is used.
+ //! - NULL pointer, in case that the allocation strategy doesn't use RWX, MAP_JIT, or dual mapping.
+ //! In this case only \ref JitAllocator can copy new code into the executable memory referenced by
+ //! \ref JitAllocator::Span instance.
+ //!
+ //! \note If `rw()` returns a non-null pointer it's important to use either VirtMem::protect_jit_memory() or
+ //! \ref VirtMem::ProtectJitReadWriteScope to guard the write, because in case of `MAP_JIT` it would temporarily
+ //! switch the permissions of the pointer to RW (that's per thread permissions).
+ //!
+ //! If \ref VirtMem::ProtectJitReadWriteScope is not used it's important to clear the instruction cache via
+ //! \ref VirtMem::flush_instruction_cache() after the write is done.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG void* rw() const noexcept { return _rw; }
+
+ //! Returns size of this span, aligned to the allocator granularity.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ //! Returns span flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Flags flags() const noexcept { return _flags; }
+
+ //! Shrinks this span to `new_size`.
+ //!
+ //! \note This is the only function that is able to change the size of a span, and it's only use case is to
+ //! shrink the span size during \ref JitAllocator::write(). When the writer detects that the span size shrunk,
+ //! it will automatically shrink the memory used by the span, and propagate the new aligned size to the caller.
+ ASMJIT_INLINE_NODEBUG void shrink(size_t new_size) noexcept { _size = Support::min(_size, new_size); }
+
+ //! Returns whether \ref rw() returns a non-null pointer.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_directly_writable() const noexcept { return _rw != nullptr; }
+
+ //! \}
+ };
+
+ //! Allocates a new memory span of the requested `size`.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_API Error alloc(Out<Span> out, size_t size) noexcept;
+
+ //! Releases a memory block returned by `alloc()`.
+ //!
+ //! \remarks This function is thread-safe.
+ ASMJIT_API Error release(void* rx) noexcept;
+
+ //! Frees extra memory allocated with `rx` by shrinking it to the given `new_size`.
+ //!
+ //! \remarks This function is thread-safe.
+ ASMJIT_API Error shrink(Span& span, size_t new_size) noexcept;
+
+ //! Queries information about an allocated memory block that contains the given `rx`, and writes it to `out`.
+ //!
+ //! If the pointer is matched, the function returns `Error::kOk` and fills `out` with the corresponding span.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_API Error query(Out<Span> out, void* rx) const noexcept;
+
+ //! \}
+
+ //! \name Write Operations
+ //! \{
+
+ using WriteFunc = Error (ASMJIT_CDECL*)(Span& span, void* user_data) noexcept;
+
+ //! Makes the memory pointed out by `span` writable and writes data to ot at the given `offset`.
+ //!
+ //! This function reads `src` and writes to `span` at `offset` the number of bytes a specified by `size`.
+ //!
+ //! Use `policy` argument to specify an instruction cache flush behavior.
+ ASMJIT_API Error write(
+ Span& span,
+ size_t offset,
+ const void* src,
+ size_t size,
+ VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept;
+
+ //! Makes the memory pointed out by `span` writable and calls the provided callback function `write_fn`
+ //! with `user_data` to perform the write operation.
+ //!
+ //! Use `policy` argument to specify an instruction cache flush behavior.
+ ASMJIT_API Error write(
+ Span& span,
+ WriteFunc write_fn,
+ void* user_data,
+ VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept;
+
+ //! Makes the memory pointed out by `span` writable and calls the provided lambda function `lambda_fn`
+ //! to perform the write operation.
+ //!
+ //! Use `policy` argument to specify an instruction cache flush behavior.
+ template<class Lambda>
+ ASMJIT_INLINE Error write(
+ Span& span,
+ Lambda&& lambda_fn,
+ VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept {
+
+ WriteFunc wrapper_func = [](Span& span, void* user_data) noexcept -> Error {
+ Lambda& lambda_fn = *static_cast<Lambda*>(user_data);
+ return lambda_fn(span);
+ };
+ return write(span, wrapper_func, (void*)(&lambda_fn), policy);
+ }
+
+ //! \}
+
+ //! \name Write Operations with Scope
+ //! \{
+
+ //! \cond INTERNAL
+
+ //! Write scope data.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope instead.
+ struct WriteScopeData {
+ //! \name Members
+ //! \{
+
+ //! Cache policy passed to \ref JitAllocator::begin_write_scope().
+ VirtMem::CachePolicy policy;
+ //! Internal flags used by the implementation.
+ uint32_t flags;
+ //! Internal data that can be used by the implementation.
+ uintptr_t data[2];
+
+ //! \}
+ };
+
+ //! Begins a write `scope`.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope constructor instead.
+ ASMJIT_API Error begin_write_scope(WriteScopeData& scope, VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept;
+
+ //! Ends a write `scope`.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope destructor instead.
+ ASMJIT_API Error end_write_scope(WriteScopeData& scope) noexcept;
+
+ //! Flushes accumulated changes in a write `scope`.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope destructor or \ref WriteScope::flush() instead.
+ ASMJIT_API Error flush_write_scope(WriteScopeData& scope) noexcept;
+
+ //! Alternative to `JitAllocator::write(span, offset, src, size)`, but under a write `scope`.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope::write() instead.
+ ASMJIT_API Error scoped_write(WriteScopeData& scope, Span& span, size_t offset, const void* src, size_t size) noexcept;
+
+ //! Alternative to `JitAllocator::write(span, write_fn, user_data)`, but under a write `scope`.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope::write() instead.
+ ASMJIT_API Error scoped_write(WriteScopeData& scope, Span& span, WriteFunc write_fn, void* user_data) noexcept;
+
+ //! Alternative to `JitAllocator::write(span, [lambda])`, but under a write `scope`.
+ //!
+ //! This is mostly for internal purposes, please use \ref WriteScope::write() instead.
+ template<class Lambda>
+ ASMJIT_INLINE Error scoped_write(WriteScopeData& scope, Span& span, Lambda&& lambda_fn) noexcept {
+ WriteFunc wrapper_func = [](Span& span, void* user_data) noexcept -> Error {
+ Lambda& lambda_fn = *static_cast<Lambda*>(user_data);
+ return lambda_fn(span);
+ };
+ return scoped_write(scope, span, wrapper_func, (void*)(&lambda_fn));
+ }
+
+ //! \endcond
+
+ //! Write scope can be used to create a single scope that is optimized for writing multiple spans.
+ class WriteScope {
+ public:
+ ASMJIT_NONCOPYABLE(WriteScope)
+
+ //! \name Members
+ //! \{
+
+ //! Link to the allocator.
+ JitAllocator& _allocator;
+
+ //! Write scope data.
+ WriteScopeData _scope_data;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ // Begins a write scope.
+ ASMJIT_INLINE explicit WriteScope(JitAllocator& allocator, VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept
+ : _allocator(allocator) { _allocator.begin_write_scope(_scope_data, policy); }
+
+ // Ends a write scope.
+ ASMJIT_INLINE ~WriteScope() noexcept {
+ _allocator.end_write_scope(_scope_data);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns \ref JitAllocator associated with this write scope.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG JitAllocator& allocator() const noexcept { return _allocator; }
+
+ //! Returns cache policy this write scope is using.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG VirtMem::CachePolicy policy() const noexcept { return _scope_data.policy; }
+
+ //! \}
+
+ //! \name Operations
+ //! \{
+
+ //! Similar to `JitAllocator::write(span, offset, src, size)`, but under a write scope.
+ ASMJIT_INLINE_NODEBUG Error write(Span& span, size_t offset, const void* src, size_t size) noexcept {
+ return _allocator.scoped_write(_scope_data, span, offset, src, size);
+ }
+
+ //! Similar to `JitAllocator::write(span, write_fn, user_data)`, but under a write scope.
+ ASMJIT_INLINE_NODEBUG Error write(Span& span, WriteFunc write_fn, void* user_data) noexcept {
+ return _allocator.scoped_write(_scope_data, span, write_fn, user_data);
+ }
+
+ //! Similar to `JitAllocator::write(span, <lambda>)`, but under a write scope.
+ template<class Lambda>
+ ASMJIT_INLINE_NODEBUG Error write(Span& span, Lambda&& lambda_fn) noexcept {
+ return _allocator.scoped_write(_scope_data, span, lambda_fn);
+ }
+
+ //! Flushes accumulated changes in this write scope.
+ ASMJIT_INLINE_NODEBUG Error flush() noexcept {
+ return _allocator.flush_write_scope(_scope_data);
+ }
+
+ //! \}
+ };
+
+ //! \}
+
+ //! \name Statistics
+ //! \{
+
+ //! Statistics provided by `JitAllocator`.
+ struct Statistics {
+ //! Number of blocks `JitAllocator` maintains.
+ size_t _block_count;
+ //! Number of active allocations.
+ size_t _allocation_count;
+ //! How many bytes are currently used / allocated.
+ size_t _used_size;
+ //! How many bytes are currently reserved by the allocator.
+ size_t _reserved_size;
+ //! Allocation overhead (in bytes) required to maintain all blocks.
+ size_t _overhead_size;
+
+ //! Resets the statistics to all zeros.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Statistics{}; }
+
+ //! Returns count of blocks managed by `JitAllocator` at the moment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t block_count() const noexcept { return _block_count; }
+
+ //! Returns the number of active allocations.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t allocation_count() const noexcept { return _allocation_count; }
+
+ //! Returns how many bytes are currently used.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t used_size() const noexcept { return _used_size; }
+
+ //! Returns the number of bytes unused by the allocator at the moment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t unused_size() const noexcept { return _reserved_size - _used_size; }
+
+ //! Returns the total number of bytes reserved by the allocator (sum of sizes of all blocks).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t reserved_size() const noexcept { return _reserved_size; }
+
+ //! Returns the number of bytes the allocator needs to manage the allocated memory.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t overhead_size() const noexcept { return _overhead_size; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG double used_ratio() const noexcept {
+ return (double(used_size()) / (double(reserved_size()) + 1e-16));
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG double unused_ratio() const noexcept {
+ return (double(unused_size()) / (double(reserved_size()) + 1e-16));
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG double overhead_ratio() const noexcept {
+ return (double(overhead_size()) / (double(reserved_size()) + 1e-16));
+ }
+ };
+
+ //! Returns JIT allocator statistics.
+ //!
+ //! \remarks This function is thread-safe.
+ [[nodiscard]]
+ ASMJIT_API Statistics statistics() const noexcept;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif
+#endif
diff --git a/3rdparty/asmjit/asmjit/core/jitruntime.cpp b/3rdparty/asmjit/asmjit/core/jitruntime.cpp
new file mode 100644
index 00000000000..66b35794f90
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/jitruntime.cpp
@@ -0,0 +1,86 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_JIT
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/jitruntime.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+JitRuntime::JitRuntime(const JitAllocator::CreateParams* params) noexcept
+ : _allocator(params) {
+ _environment = Environment::host();
+ _environment.set_object_format(ObjectFormat::kJIT);
+
+ const CpuInfo& host_cpu = CpuInfo::host();
+ _cpu_features = host_cpu.features();
+ _cpu_hints = host_cpu.hints();
+}
+
+JitRuntime::~JitRuntime() noexcept {}
+
+Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept {
+ *dst = nullptr;
+
+ ASMJIT_PROPAGATE(code->flatten());
+ ASMJIT_PROPAGATE(code->resolve_cross_section_fixups());
+
+ size_t estimated_code_size = code->code_size();
+ if (ASMJIT_UNLIKELY(estimated_code_size == 0)) {
+ return make_error(Error::kNoCodeGenerated);
+ }
+
+ JitAllocator::Span span;
+ ASMJIT_PROPAGATE(_allocator.alloc(Out(span), estimated_code_size));
+
+ // Relocate the code.
+ CodeHolder::RelocationSummary relocation_summary;
+ Error err = code->relocate_to_base(uintptr_t(span.rx()), &relocation_summary);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ _allocator.release(span.rx());
+ return err;
+ }
+
+ // Recalculate the final code size and shrink the memory we allocated for it
+ // in case that some relocations didn't require records in an address table.
+ size_t code_size = estimated_code_size - relocation_summary.code_size_reduction;
+
+ // If not true it means that `relocate_to_base()` filled wrong information in `relocation_summary`.
+ ASMJIT_ASSERT(code_size == code->code_size());
+
+ _allocator.write(span, [&](JitAllocator::Span& span) noexcept -> Error {
+ uint8_t* rw = static_cast<uint8_t*>(span.rw());
+
+ for (Section* section : code->_sections) {
+ size_t offset = size_t(section->offset());
+ size_t buffer_size = size_t(section->buffer_size());
+ size_t virtual_size = size_t(section->virtual_size());
+
+ ASMJIT_ASSERT(offset + buffer_size <= span.size());
+ memcpy(rw + offset, section->data(), buffer_size);
+
+ if (virtual_size > buffer_size) {
+ ASMJIT_ASSERT(offset + virtual_size <= span.size());
+ memset(rw + offset + buffer_size, 0, virtual_size - buffer_size);
+ }
+ }
+
+ span.shrink(code_size);
+ return Error::kOk;
+ });
+
+ *dst = span.rx();
+ return Error::kOk;
+}
+
+Error JitRuntime::_release(void* p) noexcept {
+ return _allocator.release(p);
+}
+
+ASMJIT_END_NAMESPACE
+
+#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.h b/3rdparty/asmjit/asmjit/core/jitruntime.h
index 717a6b58d6b..cf401db6f35 100644
--- a/3rdparty/asmjit/src/asmjit/core/jitruntime.h
+++ b/3rdparty/asmjit/asmjit/core/jitruntime.h
@@ -1,17 +1,17 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_JITRUNTIME_H_INCLUDED
#define ASMJIT_CORE_JITRUNTIME_H_INCLUDED
-#include "../core/api-config.h"
+#include <asmjit/core/api-config.h>
#ifndef ASMJIT_NO_JIT
-#include "../core/codeholder.h"
-#include "../core/jitallocator.h"
-#include "../core/target.h"
+#include <asmjit/core/codeholder.h>
+#include <asmjit/core/jitallocator.h>
+#include <asmjit/core/target.h>
ASMJIT_BEGIN_NAMESPACE
@@ -36,6 +36,11 @@ public:
//! Creates a `JitRuntime` instance.
ASMJIT_API explicit JitRuntime(const JitAllocator::CreateParams* params = nullptr) noexcept;
+
+ //! Creates a `JitRuntime` instance.
+ ASMJIT_INLINE explicit JitRuntime(const JitAllocator::CreateParams& params) noexcept
+ : JitRuntime(&params) {}
+
//! Destroys the `JitRuntime` instance.
ASMJIT_API ~JitRuntime() noexcept override;
@@ -46,11 +51,11 @@ public:
//! Resets the \ref JitRuntime, freeing everything that was allocated by it.
//!
- //! Depending on `resetPolicy` the currently held memory can be either freed entirely when ResetPolicy::kHard is used,
+ //! Depending on `reset_policy` the currently held memory can be either freed entirely when ResetPolicy::kHard is used,
//! or the allocator can keep some of it for next allocations when ResetPolicy::kSoft is used, which is the default
//! behavior.
- ASMJIT_INLINE_NODEBUG void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept {
- _allocator.reset(resetPolicy);
+ ASMJIT_INLINE_NODEBUG void reset(ResetPolicy reset_policy = ResetPolicy::kSoft) noexcept {
+ _allocator.reset(reset_policy);
}
//! \}
@@ -59,7 +64,8 @@ public:
//! \{
//! Returns the associated `JitAllocator`.
- ASMJIT_INLINE_NODEBUG JitAllocator* allocator() const noexcept { return const_cast<JitAllocator*>(&_allocator); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG JitAllocator& allocator() const noexcept { return const_cast<JitAllocator&>(_allocator); }
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/logger.cpp b/3rdparty/asmjit/asmjit/core/logger.cpp
index 9bc14bae5fd..df0b435bf90 100644
--- a/3rdparty/asmjit/src/asmjit/core/logger.cpp
+++ b/3rdparty/asmjit/asmjit/core/logger.cpp
@@ -1,14 +1,14 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
-#include "../core/api-build_p.h"
+#include <asmjit/core/api-build_p.h>
#ifndef ASMJIT_NO_LOGGING
-#include "../core/logger.h"
-#include "../core/string.h"
-#include "../core/support.h"
+#include <asmjit/core/logger.h>
+#include <asmjit/core/string.h>
+#include <asmjit/support/support.h>
ASMJIT_BEGIN_NAMESPACE
@@ -21,10 +21,10 @@ Logger::~Logger() noexcept {}
// [[pure virtual]]
Error Logger::_log(const char* data, size_t size) noexcept {
- DebugUtils::unused(data, size);
+ Support::maybe_unused(data, size);
// Do not error in this case - the logger would just sink to /dev/null.
- return kErrorOk;
+ return Error::kOk;
}
Error Logger::logf(const char* fmt, ...) noexcept {
@@ -40,7 +40,7 @@ Error Logger::logf(const char* fmt, ...) noexcept {
Error Logger::logv(const char* fmt, va_list ap) noexcept {
StringTmp<2048> sb;
- ASMJIT_PROPAGATE(sb.appendVFormat(fmt, ap));
+ ASMJIT_PROPAGATE(sb.append_vformat(fmt, ap));
return log(sb);
}
@@ -52,14 +52,16 @@ FileLogger::FileLogger(FILE* file) noexcept
FileLogger::~FileLogger() noexcept {}
Error FileLogger::_log(const char* data, size_t size) noexcept {
- if (!_file)
- return kErrorOk;
+ if (!_file) {
+ return Error::kOk;
+ }
- if (size == SIZE_MAX)
+ if (size == SIZE_MAX) {
size = strlen(data);
+ }
fwrite(data, 1, size, _file);
- return kErrorOk;
+ return Error::kOk;
}
// StringLogger - Implementation
diff --git a/3rdparty/asmjit/src/asmjit/core/logger.h b/3rdparty/asmjit/asmjit/core/logger.h
index 54c169f52fe..0f0e7331b55 100644
--- a/3rdparty/asmjit/src/asmjit/core/logger.h
+++ b/3rdparty/asmjit/asmjit/core/logger.h
@@ -1,14 +1,14 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_LOGGING_H_INCLUDED
#define ASMJIT_CORE_LOGGING_H_INCLUDED
-#include "../core/inst.h"
-#include "../core/string.h"
-#include "../core/formatter.h"
+#include <asmjit/core/inst.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/formatter.h>
#ifndef ASMJIT_NO_LOGGING
@@ -47,38 +47,55 @@ public:
//! \{
//! Returns \ref FormatOptions of this logger.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG FormatOptions& options() noexcept { return _options; }
+
//! \overload
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG const FormatOptions& options() const noexcept { return _options; }
+
//! Sets formatting options of this Logger to `options`.
- ASMJIT_INLINE_NODEBUG void setOptions(const FormatOptions& options) noexcept { _options = options; }
+ ASMJIT_INLINE_NODEBUG void set_options(const FormatOptions& options) noexcept { _options = options; }
+
//! Resets formatting options of this Logger to defaults.
- ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _options.reset(); }
+ ASMJIT_INLINE_NODEBUG void reset_options() noexcept { _options.reset(); }
//! Returns formatting flags.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG FormatFlags flags() const noexcept { return _options.flags(); }
+
//! Tests whether the logger has the given `flag` enabled.
- ASMJIT_INLINE_NODEBUG bool hasFlag(FormatFlags flag) const noexcept { return _options.hasFlag(flag); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(FormatFlags flag) const noexcept { return _options.has_flag(flag); }
+
//! Sets formatting flags to `flags`.
- ASMJIT_INLINE_NODEBUG void setFlags(FormatFlags flags) noexcept { _options.setFlags(flags); }
+ ASMJIT_INLINE_NODEBUG void set_flags(FormatFlags flags) noexcept { _options.set_flags(flags); }
+
//! Enables the given formatting `flags`.
- ASMJIT_INLINE_NODEBUG void addFlags(FormatFlags flags) noexcept { _options.addFlags(flags); }
+ ASMJIT_INLINE_NODEBUG void add_flags(FormatFlags flags) noexcept { _options.add_flags(flags); }
+
//! Disables the given formatting `flags`.
- ASMJIT_INLINE_NODEBUG void clearFlags(FormatFlags flags) noexcept { _options.clearFlags(flags); }
+ ASMJIT_INLINE_NODEBUG void clear_flags(FormatFlags flags) noexcept { _options.clear_flags(flags); }
//! Returns indentation of a given indentation `group`.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG uint32_t indentation(FormatIndentationGroup type) const noexcept { return _options.indentation(type); }
+
//! Sets indentation of the given indentation `group` to `n` spaces.
- ASMJIT_INLINE_NODEBUG void setIndentation(FormatIndentationGroup type, uint32_t n) noexcept { _options.setIndentation(type, n); }
+ ASMJIT_INLINE_NODEBUG void set_indentation(FormatIndentationGroup type, uint32_t n) noexcept { _options.set_indentation(type, n); }
+
//! Resets indentation of the given indentation `group` to 0 spaces.
- ASMJIT_INLINE_NODEBUG void resetIndentation(FormatIndentationGroup type) noexcept { _options.resetIndentation(type); }
+ ASMJIT_INLINE_NODEBUG void reset_indentation(FormatIndentationGroup type) noexcept { _options.reset_indentation(type); }
//! Returns padding of a given padding `group`.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG size_t padding(FormatPaddingGroup type) const noexcept { return _options.padding(type); }
+
//! Sets padding of a given padding `group` to `n`.
- ASMJIT_INLINE_NODEBUG void setPadding(FormatPaddingGroup type, uint32_t n) noexcept { _options.setPadding(type, n); }
+ ASMJIT_INLINE_NODEBUG void set_padding(FormatPaddingGroup type, uint32_t n) noexcept { _options.set_padding(type, n); }
+
//! Resets padding of a given padding `group` to 0, which means that a default will be used.
- ASMJIT_INLINE_NODEBUG void resetPadding(FormatPaddingGroup type) noexcept { _options.resetPadding(type); }
+ ASMJIT_INLINE_NODEBUG void reset_padding(FormatPaddingGroup type) noexcept { _options.reset_padding(type); }
//! \}
@@ -127,6 +144,7 @@ public:
//! \{
//! Returns the logging output stream or null if the logger has no output stream.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG FILE* file() const noexcept { return _file; }
//! Sets the logging output stream to `stream` or null.
@@ -134,7 +152,7 @@ public:
//! \note If the `file` is null the logging will be disabled. When a logger is attached to `CodeHolder` or any
//! emitter the logging API will always be called regardless of the output file. This means that if you really
//! want to disable logging at emitter level you must not attach a logger to it.
- ASMJIT_INLINE_NODEBUG void setFile(FILE* file) noexcept { _file = file; }
+ ASMJIT_INLINE_NODEBUG void set_file(FILE* file) noexcept { _file = file; }
//! \}
@@ -165,16 +183,22 @@ public:
//! Returns the content of the logger as \ref String.
//!
//! It can be moved, if desired.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG String& content() noexcept { return _content; }
+
//! \overload
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG const String& content() const noexcept { return _content; }
//! Returns aggregated logger data as `char*` pointer.
//!
//! The pointer is owned by `StringLogger`, it can't be modified or freed.
+ [[nodiscard]]
ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return _content.data(); }
+
//! Returns size of the data returned by `data()`.
- ASMJIT_INLINE_NODEBUG size_t dataSize() const noexcept { return _content.size(); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t data_size() const noexcept { return _content.size(); }
//! \}
diff --git a/3rdparty/asmjit/src/asmjit/core/misc_p.h b/3rdparty/asmjit/asmjit/core/misc_p.h
index 5cd934e4628..3c27e353f93 100644
--- a/3rdparty/asmjit/src/asmjit/core/misc_p.h
+++ b/3rdparty/asmjit/asmjit/core/misc_p.h
@@ -1,12 +1,12 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_MISC_P_H_INCLUDED
#define ASMJIT_CORE_MISC_P_H_INCLUDED
-#include "../core/api-config.h"
+#include <asmjit/core/api-config.h>
ASMJIT_BEGIN_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/operand.cpp b/3rdparty/asmjit/asmjit/core/operand.cpp
new file mode 100644
index 00000000000..3773f37cd84
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/operand.cpp
@@ -0,0 +1,132 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/operand.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// Operand - Tests
+// ===============
+
+#if defined(ASMJIT_TEST)
+enum class StrongEnumForImmTests : uint32_t {
+ kValue0,
+ kValue0xFFFFFFFF = 0xFFFFFFFFu
+};
+
+UNIT(operand) {
+ INFO("Checking operand sizes");
+ EXPECT_EQ(sizeof(Operand), 16u);
+ EXPECT_EQ(sizeof(Reg), 16u);
+ EXPECT_EQ(sizeof(BaseMem), 16u);
+ EXPECT_EQ(sizeof(Imm), 16u);
+ EXPECT_EQ(sizeof(Label), 16u);
+
+ INFO("Checking basic functionality of Operand");
+ Operand a, b;
+ Operand dummy;
+
+ EXPECT_TRUE(a.is_none());
+ EXPECT_FALSE(a.is_reg());
+ EXPECT_FALSE(a.is_mem());
+ EXPECT_FALSE(a.is_imm());
+ EXPECT_FALSE(a.is_label());
+ EXPECT_EQ(a, b);
+ EXPECT_EQ(a._data[0], 0u);
+ EXPECT_EQ(a._data[1], 0u);
+
+ INFO("Checking basic functionality of Label");
+ Label label;
+ EXPECT_FALSE(label.is_valid());
+ EXPECT_EQ(label.id(), Globals::kInvalidId);
+
+ INFO("Checking basic functionality of Reg");
+ EXPECT_TRUE(Reg().is_reg());
+ EXPECT_FALSE(Reg().is_valid());
+ EXPECT_EQ(Reg()._data[0], 0u);
+ EXPECT_EQ(Reg()._data[1], 0u);
+ EXPECT_FALSE(dummy.as<Reg>().is_valid());
+
+ // Create some register (not specific to any architecture).
+ OperandSignature reg_sig = OperandSignature::from_op_type(OperandType::kReg) |
+ OperandSignature::from_reg_type(RegType::kVec128) |
+ OperandSignature::from_reg_group(RegGroup::kVec) |
+ OperandSignature::from_size(8);
+ Reg r1(reg_sig, 5);
+
+ EXPECT_TRUE(r1.is_valid());
+ EXPECT_TRUE(r1.is_reg());
+ EXPECT_TRUE(r1.is_reg(RegType::kVec128));
+ EXPECT_TRUE(r1.is_phys_reg());
+ EXPECT_FALSE(r1.is_virt_reg());
+ EXPECT_EQ(r1.signature(), reg_sig);
+ EXPECT_EQ(r1.reg_type(), RegType::kVec128);
+ EXPECT_EQ(r1.reg_group(), RegGroup::kVec);
+ EXPECT_EQ(r1.size(), 8u);
+ EXPECT_EQ(r1.id(), 5u);
+ EXPECT_TRUE(r1.is_reg(RegType::kVec128, 5)); // RegType and Id.
+ EXPECT_EQ(r1._data[0], 0u);
+ EXPECT_EQ(r1._data[1], 0u);
+
+ // The same type of register having different id.
+ Reg r2(r1, 6);
+ EXPECT_TRUE(r2.is_valid());
+ EXPECT_TRUE(r2.is_reg());
+ EXPECT_TRUE(r2.is_reg(RegType::kVec128));
+ EXPECT_TRUE(r2.is_phys_reg());
+ EXPECT_FALSE(r2.is_virt_reg());
+ EXPECT_EQ(r2.signature(), reg_sig);
+ EXPECT_EQ(r2.reg_type(), r1.reg_type());
+ EXPECT_EQ(r2.reg_group(), r1.reg_group());
+ EXPECT_EQ(r2.size(), r1.size());
+ EXPECT_EQ(r2.id(), 6u);
+ EXPECT_TRUE(r2.is_reg(RegType::kVec128, 6));
+
+ r1.reset();
+ EXPECT_FALSE(r1.is_reg());
+ EXPECT_FALSE(r1.is_valid());
+
+ INFO("Checking basic functionality of BaseMem");
+ BaseMem m;
+ EXPECT_TRUE(m.is_mem());
+ EXPECT_EQ(m, BaseMem());
+ EXPECT_FALSE(m.has_base());
+ EXPECT_FALSE(m.has_index());
+ EXPECT_FALSE(m.has_offset());
+ EXPECT_TRUE(m.is_offset_64bit());
+ EXPECT_EQ(m.offset(), 0);
+
+ m.set_offset(-1);
+ EXPECT_EQ(m.offset_lo32(), -1);
+ EXPECT_EQ(m.offset(), -1);
+
+ int64_t x = int64_t(0xFF00FF0000000001u);
+ int32_t x_hi = int32_t(0xFF00FF00u);
+
+ m.set_offset(x);
+ EXPECT_EQ(m.offset(), x);
+ EXPECT_EQ(m.offset_lo32(), 1);
+ EXPECT_EQ(m.offset_hi32(), x_hi);
+
+ INFO("Checking basic functionality of Imm");
+ Imm imm_value(-42);
+ EXPECT_EQ(imm_value.type(), ImmType::kInt);
+ EXPECT_EQ(Imm(-1).value(), -1);
+ EXPECT_EQ(imm(-1).value(), -1);
+ EXPECT_EQ(imm_value.value(), -42);
+ EXPECT_EQ(imm(0xFFFFFFFF).value(), int64_t(0xFFFFFFFF));
+
+ Imm imm_double(0.4);
+ EXPECT_EQ(imm_double.type(), ImmType::kDouble);
+ EXPECT_EQ(imm_double.value_as<double>(), 0.4);
+ EXPECT_EQ(imm_double, imm(0.4));
+
+ EXPECT_EQ(Imm(StrongEnumForImmTests::kValue0).value(), 0);
+ EXPECT_EQ(Imm(StrongEnumForImmTests::kValue0xFFFFFFFF).value(), 0xFFFFFFFFu);
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/operand.h b/3rdparty/asmjit/asmjit/core/operand.h
new file mode 100644
index 00000000000..f7e5e2a1314
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/operand.h
@@ -0,0 +1,2690 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_OPERAND_H_INCLUDED
+#define ASMJIT_CORE_OPERAND_H_INCLUDED
+
+#include <asmjit/core/archcommons.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_assembler
+//! \{
+
+//! Operand type used by \ref Operand_.
+enum class OperandType : uint32_t {
+ //! Not an operand or not initialized.
+ kNone = 0,
+ //! Operand is a register.
+ kReg = 1,
+ //! Operand is a memory.
+ kMem = 2,
+ //! Operand is a register-list.
+ kRegList = 3,
+ //! Operand is an immediate value.
+ kImm = 4,
+ //! Operand is a label.
+ kLabel = 5,
+
+ //! Maximum value of `OperandType`.
+ kMaxValue = kRegList
+};
+
+static_assert(uint32_t(OperandType::kMem) == uint32_t(OperandType::kReg) + 1,
+ "AsmJit requires that `OperandType::kMem` equals `OperandType::kReg + 1`");
+
+//! Register mask is a convenience typedef that describes a mask where each bit describes a physical register id
+//! in the same \ref RegGroup. At the moment 32 bits are enough as AsmJit doesn't support any architecture that
+//! would provide more than 32 registers for a register group.
+using RegMask = uint32_t;
+
+//! Register type.
+//!
+//! Provides a unique type that can be used to identify a register or its view.
+enum class RegType : uint8_t {
+ //! No register - unused, invalid, multiple meanings.
+ kNone = 0,
+
+ //! This is not a register type. This value is reserved for a \ref Label that's used in \ref BaseMem as a base.
+ //!
+ //! Label tag is used as a sub-type, forming a unique signature across all operand types as 0x1 is never associated
+ //! with any register type. This means that a memory operand's BASE register can be constructed from virtually any
+ //! operand (register vs. label) by just assigning its type (register type or label-tag) and operand id.
+ kLabelTag = 1,
+
+ //! 8-bit low general purpose register (X86|X86_64).
+ kGp8Lo = 2,
+ //! 8-bit high general purpose register (X86|X86_64).
+ kGp8Hi = 3,
+ //! 16-bit general purpose register (X86|X86_64).
+ kGp16 = 4,
+ //! 32-bit general purpose register (X86|X86_64|AArch32|AArch64).
+ kGp32 = 5,
+ //! 64-bit general purpose register (X86_64|AArch64).
+ kGp64 = 6,
+
+ //! 8-bit view of a vector register (AArch64).
+ kVec8 = 7,
+ //! 16-bit view of a vector register (AArch64).
+ kVec16 = 8,
+ //! 32-bit view of a vector register (AArch32|AArch64).
+ kVec32 = 9,
+ //! 64-bit view of a vector register (AArch32|AArch64).
+ //!
+ //! \note This is never used for MMX registers on X86, MMX registers have its own category.
+ kVec64 = 10,
+ //! 128-bit view of a vector register (X86|X86_64|AArch32|AArch64).
+ kVec128 = 11,
+ //! 256-bit view of a vector register (X86|X86_64).
+ kVec256 = 12,
+ //! 512-bit view of a vector register (X86|X86_64).
+ kVec512 = 13,
+ //! 1024-bit view of a vector register (future).
+ kVec1024 = 14,
+ //! View of a vector register, which width is implementation specific (AArch64).
+ kVecNLen = 15,
+
+ //! Mask register (X86|X86_64|AArch64).
+ kMask = 16,
+ //! Tile register (X86_64: `TMM`).
+ kTile = 17,
+
+ //! Segment register (X86|X86_64: None, ES, CS, SS, DS, FS, GS).
+ kSegment = 25,
+ //! Control register (X86|X86_64: `CR`).
+ kControl = 26,
+ //! Debug register (X86|X86_64: `DR`).
+ kDebug = 27,
+
+ //! MMX register (X86|X86_64: `MM`).
+ kX86_Mm = 28,
+ //! FPU (x87) register (X86|X86_64: `ST`).
+ kX86_St = 29,
+ //! Bound register (X86|X86_64: `BND`).
+ kX86_Bnd = 30,
+
+ //! Universal type describing program counter (PC) or instruction pointer (EIP/RIP) register, if the target
+ //! architecture actually exposes it as a separate register type, which most modern architectures do.
+ //!
+ //! X86 Specific
+ //! ------------
+ //!
+ //! Instruction pointer (RIP), only addressable in \ref x86::Mem in 64-bit targets.
+ kPC = 31,
+
+ //! Maximum value of `RegType`.
+ kMaxValue = 31
+};
+ASMJIT_DEFINE_ENUM_COMPARE(RegType)
+
+//! Register group.
+//!
+//! Provides a unique value that identifies groups of registers and their views.
+enum class RegGroup : uint8_t {
+ //! General purpose register group compatible with all backends.
+ kGp = 0,
+
+ //! Vector register group compatible with all backends.
+ //!
+ //! Describes `XMM|YMM|ZMM` registers on X86|X86_64 targets and `V|Q|D|S|H|B` registers on ARM/AArch64 targets.
+ kVec = 1,
+
+ //! Mask register group compatible with all backends that can use masking.
+ //!
+ //! Describes `K` registers on X86|X86_64 targets (AVX-512) and `P` registers on AArch64 targets (SVE/SVE2).
+ kMask = 2,
+
+ //! Extra virtual group #3 that can be used by Compiler for register allocation.
+ kExtra = 3,
+
+ //! TMM register group (X86|X86_64).
+ kTile = 4,
+
+ //! Segment register group (X86|X86_64).
+ kSegment = 10,
+
+ //! Control register group (X86|X86_64).
+ kControl = 11,
+
+ //! Debug register group (X86|X86_64).
+ kDebug = 12,
+
+ //! MMX register group (MM) - maps to \ref RegGroup::kExtra (X86|X86_64).
+ kX86_MM = kExtra,
+ //! FPU register group (X86|X86_64).
+ kX86_St = 13,
+ //! BND register group (X86|X86_64).
+ kX86_Bnd = 14,
+
+ //! Program counter group (represents also EIP/RIP on X86|X86_64 targets).
+ kPC = 15,
+
+ //! Maximum value of `RegGroup`.
+ kMaxValue = 15,
+
+ //! Last value of a virtual register that is managed by \ref BaseCompiler.
+ kMaxVirt = Globals::kNumVirtGroups - 1
+};
+ASMJIT_DEFINE_ENUM_COMPARE(RegGroup)
+
+//! Operand signature is a 32-bit number describing \ref Operand and some of its payload.
+//!
+//! In AsmJit operand signature is used to store additional payload of register, memory, and immediate operands.
+//! In practice the biggest pressure on OperandSignature is from \ref BaseMem and architecture specific memory
+//! operands that need to store additional payload that cannot be stored elsewhere as values of all other members
+//! are fully specified by \ref BaseMem.
+struct OperandSignature {
+ //! \name Constants
+ //! \{
+
+ // Operand type (3 least significant bits).
+ // |........|........|........|.....XXX|
+ static inline constexpr uint32_t kOpTypeShift = 0;
+ static inline constexpr uint32_t kOpTypeMask = 0x07u << kOpTypeShift;
+
+ // Register type (5 bits).
+ // |........|........|........|XXXXX...|
+ static inline constexpr uint32_t kRegTypeShift = 3;
+ static inline constexpr uint32_t kRegTypeMask = 0x1Fu << kRegTypeShift;
+
+ // Register group (4 bits).
+ // |........|........|....XXXX|........|
+ static inline constexpr uint32_t kRegGroupShift = 8;
+ static inline constexpr uint32_t kRegGroupMask = 0x0Fu << kRegGroupShift;
+
+ // Memory base type (5 bits).
+ // |........|........|........|XXXXX...|
+ static inline constexpr uint32_t kMemBaseTypeShift = 3;
+ static inline constexpr uint32_t kMemBaseTypeMask = 0x1Fu << kMemBaseTypeShift;
+
+ // Memory index type (5 bits).
+ // |........|........|...XXXXX|........|
+ static inline constexpr uint32_t kMemIndexTypeShift = 8;
+ static inline constexpr uint32_t kMemIndexTypeMask = 0x1Fu << kMemIndexTypeShift;
+
+ // Memory base+index combined (10 bits).
+ // |........|........|...XXXXX|XXXXX...|
+ static inline constexpr uint32_t kMemBaseIndexShift = 3;
+ static inline constexpr uint32_t kMemBaseIndexMask = 0x3FFu << kMemBaseIndexShift;
+
+ // This memory operand represents a home-slot or stack (Compiler) (1 bit).
+ // |........|........|..X.....|........|
+ static inline constexpr uint32_t kMemRegHomeShift = 13;
+ static inline constexpr uint32_t kMemRegHomeFlag = 0x01u << kMemRegHomeShift;
+
+ // Immediate type (1 bit).
+ // |........|........|........|....X...|
+ static inline constexpr uint32_t kImmTypeShift = 3;
+ static inline constexpr uint32_t kImmTypeMask = 0x01u << kImmTypeShift;
+
+ // Predicate used by either registers or immediate values (4 bits).
+ // |........|XXXX....|........|........|
+ static inline constexpr uint32_t kPredicateShift = 20;
+ static inline constexpr uint32_t kPredicateMask = 0x0Fu << kPredicateShift;
+
+ // Operand size (8 most significant bits).
+ // |XXXXXXXX|........|........|........|
+ static inline constexpr uint32_t kSizeShift = 24;
+ static inline constexpr uint32_t kSizeMask = 0xFFu << kSizeShift;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint32_t _bits;
+
+ //! \}
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Constructs operand signature from the given `bits`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_bits(uint32_t bits) noexcept {
+ return OperandSignature{bits};
+ }
+
+ //! Constructs operand signature from the given `value`, use `FieldMask` to describe where the value is in the signature.
+ template<uint32_t FieldMask, typename T>
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_value(const T& value) noexcept {
+ return OperandSignature{uint32_t(value) << Support::ctz_const<FieldMask>};
+ }
+
+ //! Constructs operand signature describing the given operand type `op_type`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_op_type(OperandType op_type) noexcept {
+ return OperandSignature{uint32_t(op_type) << kOpTypeShift};
+ }
+
+ //! Constructs operand signature describing the given register type `reg_type`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_reg_type(RegType reg_type) noexcept {
+ return OperandSignature{uint32_t(reg_type) << kRegTypeShift};
+ }
+
+ //! Constructs operand signature describing the given register group `reg_group`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_reg_group(RegGroup reg_group) noexcept {
+ return OperandSignature{uint32_t(reg_group) << kRegGroupShift};
+ }
+
+ //! Constructs operand signature describing both register type `reg_type` and register group `reg_group`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_reg_type_and_group(RegType reg_type, RegGroup reg_group) noexcept {
+ return from_reg_type(reg_type) | from_reg_group(reg_group);
+ }
+
+ //! Constructs operand signature describing a memory base type `base_type`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_mem_base_type(RegType base_type) noexcept {
+ return OperandSignature{uint32_t(base_type) << kMemBaseTypeShift};
+ }
+
+ //! Constructs operand signature describing a memory index type `index_type`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_mem_index_type(RegType index_type) noexcept {
+ return OperandSignature{uint32_t(index_type) << kMemIndexTypeShift};
+ }
+
+ //! Constructs operand signature describing a `predicate`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_predicate(uint32_t predicate) noexcept {
+ return OperandSignature{predicate << kPredicateShift};
+ }
+
+ //! Constructs operand signature describing a `size`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR OperandSignature from_size(uint32_t size) noexcept {
+ return OperandSignature{size << kSizeShift};
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //!
+ //! Overloaded operators make `OperandSignature` behave like regular integer.
+ //!
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR bool operator!() const noexcept { return _bits == 0; }
+ ASMJIT_INLINE_CONSTEXPR explicit operator bool() const noexcept { return _bits != 0; }
+
+ ASMJIT_INLINE_CONSTEXPR OperandSignature& operator|=(uint32_t x) noexcept { _bits |= x; return *this; }
+ ASMJIT_INLINE_CONSTEXPR OperandSignature& operator&=(uint32_t x) noexcept { _bits &= x; return *this; }
+ ASMJIT_INLINE_CONSTEXPR OperandSignature& operator^=(uint32_t x) noexcept { _bits ^= x; return *this; }
+
+ ASMJIT_INLINE_CONSTEXPR OperandSignature& operator|=(const OperandSignature& other) noexcept { return operator|=(other._bits); }
+ ASMJIT_INLINE_CONSTEXPR OperandSignature& operator&=(const OperandSignature& other) noexcept { return operator&=(other._bits); }
+ ASMJIT_INLINE_CONSTEXPR OperandSignature& operator^=(const OperandSignature& other) noexcept { return operator^=(other._bits); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator~() const noexcept { return OperandSignature{~_bits}; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator|(uint32_t x) const noexcept { return OperandSignature{_bits | x}; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator&(uint32_t x) const noexcept { return OperandSignature{_bits & x}; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator^(uint32_t x) const noexcept { return OperandSignature{_bits ^ x}; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator|(const OperandSignature& other) const noexcept { return OperandSignature{_bits | other._bits}; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator&(const OperandSignature& other) const noexcept { return OperandSignature{_bits & other._bits}; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature operator^(const OperandSignature& other) const noexcept { return OperandSignature{_bits ^ other._bits}; }
+
+ ASMJIT_INLINE_CONSTEXPR bool operator==(uint32_t x) const noexcept { return _bits == x; }
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(uint32_t x) const noexcept { return _bits != x; }
+
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const OperandSignature& other) const noexcept { return _bits == other._bits; }
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const OperandSignature& other) const noexcept { return _bits != other._bits; }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR void reset() noexcept { _bits = 0; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t bits() const noexcept { return _bits; }
+
+ ASMJIT_INLINE_CONSTEXPR void set_bits(uint32_t bits) noexcept { _bits = bits; }
+
+ template<uint32_t FieldMask>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_field() const noexcept {
+ return (_bits & FieldMask) != 0;
+ }
+
+ template<uint32_t FieldMask>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_field(uint32_t value) const noexcept {
+ return (_bits & FieldMask) != value << Support::ctz_const<FieldMask>;
+ }
+
+ template<uint32_t FieldMask>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t get_field() const noexcept {
+ return (_bits >> Support::ctz_const<FieldMask>) & (FieldMask >> Support::ctz_const<FieldMask>);
+ }
+
+ template<uint32_t FieldMask>
+ ASMJIT_INLINE_CONSTEXPR void set_field(uint32_t value) noexcept {
+ ASMJIT_ASSERT(((value << Support::ctz_const<FieldMask>) & ~FieldMask) == 0);
+ _bits = (_bits & ~FieldMask) | (value << Support::ctz_const<FieldMask>);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature subset(uint32_t mask) const noexcept { return OperandSignature{_bits & mask}; }
+
+ template<uint32_t FieldMask, uint32_t kFieldShift = Support::ctz_const<FieldMask>>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature replaced_value(uint32_t value) const noexcept { return OperandSignature{(_bits & ~FieldMask) | (value << kFieldShift)}; }
+
+ template<uint32_t FieldMask>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool matches_signature(const OperandSignature& signature) const noexcept {
+ return (_bits & FieldMask) == signature._bits;
+ }
+
+ template<uint32_t FieldMask>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool matches_fields(uint32_t bits) const noexcept {
+ return (_bits & FieldMask) == bits;
+ }
+
+ template<uint32_t FieldMask>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool matches_fields(const OperandSignature& fields) const noexcept {
+ return (_bits & FieldMask) == fields._bits;
+ }
+
+ //! Tests whether the operand signature is valid (describes a valid operand, and not \ref OperandType::kNone.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_valid() const noexcept { return _bits != 0; }
+
+ //! Returns operand type this operand signature describes.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandType op_type() const noexcept { return (OperandType)get_field<kOpTypeMask>(); }
+
+ //! Tests whether the operand type matches op_type
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_op_type(OperandType op_type) const noexcept { return get_field<kOpTypeMask>() == uint32_t(op_type); }
+
+ //! Tests whether the operand signature represents a register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg() const noexcept { return is_op_type(OperandType::kReg); }
+
+ //! Tests whether the operand signature represents a register of the given register type `reg_type`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegType reg_type) const noexcept {
+ constexpr uint32_t kMask = kOpTypeMask | kRegTypeMask;
+ return subset(kMask) == (from_op_type(OperandType::kReg) | from_reg_type(reg_type));
+ }
+
+ //! Tests whether the operand signature represents a register of the given register type `reg_type`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegGroup reg_group) const noexcept {
+ constexpr uint32_t kMask = kOpTypeMask | kRegGroupMask;
+ return subset(kMask) == (from_op_type(OperandType::kReg) | from_reg_group(reg_group));
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType reg_type() const noexcept { return (RegType)get_field<kRegTypeMask>(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegGroup reg_group() const noexcept { return (RegGroup)get_field<kRegGroupMask>(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType mem_base_type() const noexcept { return (RegType)get_field<kMemBaseTypeMask>(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType mem_index_type() const noexcept { return (RegType)get_field<kMemIndexTypeMask>(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t predicate() const noexcept { return get_field<kPredicateMask>(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t size() const noexcept { return get_field<kSizeMask>(); }
+
+ ASMJIT_INLINE_CONSTEXPR void set_op_type(OperandType op_type) noexcept { set_field<kOpTypeMask>(uint32_t(op_type)); }
+ ASMJIT_INLINE_CONSTEXPR void set_reg_type(RegType reg_type) noexcept { set_field<kRegTypeMask>(uint32_t(reg_type)); }
+ ASMJIT_INLINE_CONSTEXPR void set_reg_group(RegGroup reg_group) noexcept { set_field<kRegGroupMask>(uint32_t(reg_group)); }
+
+ ASMJIT_INLINE_CONSTEXPR void set_mem_base_type(RegType base_type) noexcept { set_field<kMemBaseTypeMask>(uint32_t(base_type)); }
+ ASMJIT_INLINE_CONSTEXPR void set_mem_index_type(RegType index_type) noexcept { set_field<kMemIndexTypeMask>(uint32_t(index_type)); }
+
+ ASMJIT_INLINE_CONSTEXPR void set_predicate(uint32_t predicate) noexcept { set_field<kPredicateMask>(predicate); }
+ ASMJIT_INLINE_CONSTEXPR void set_size(uint32_t size) noexcept { set_field<kSizeMask>(size); }
+
+ //! \}
+};
+
+//! Base class representing an operand in AsmJit (non-default constructed version).
+//!
+//! Contains no initialization code and can be used safely to define an array of operands that won't be initialized.
+//! This is a \ref Operand base structure designed to be statically initialized, static const, or to be used by user
+//! code to define an array of operands without having them default initialized at construction time.
+//!
+//! The key difference between \ref Operand and \ref Operand_ is:
+//!
+//! ```
+//! Operand_ x_array[10]; // Not initialized, contains garbage.
+//! Operand_ y_array[10] {}; // All operands initialized to none explicitly (zero initialized).
+//! Operand y_array[10]; // All operands initialized to none implicitly (zero initialized).
+//! ```
+struct Operand_ {
+ //! \name Types
+ //! \{
+
+ using Signature = OperandSignature;
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ //! Memory index offset in a `_data[2]` array.
+ static inline constexpr uint32_t kDataMemIndexId = 0;
+ //! Low 32-bit offset value a `_data[2]` array.
+ static inline constexpr uint32_t kDataMemOffsetLo = 1;
+
+ //! Low 32-bit immediate value in a `_data[2]` array.
+ static inline constexpr uint32_t kDataImmValueLo = Support::ByteOrder::kNative == Support::ByteOrder::kLE ? 0 : 1;
+ //! High 32-bit immediate value in a `_data[2]` array.
+ static inline constexpr uint32_t kDataImmValueHi = Support::ByteOrder::kNative == Support::ByteOrder::kLE ? 1 : 0;
+
+ //! Minimum valid packed-id.
+ static inline constexpr uint32_t kVirtIdMin = 256;
+ //! Maximum valid packed-id, excludes Globals::kInvalidId.
+ static inline constexpr uint32_t kVirtIdMax = Globals::kInvalidId - 1;
+ //! Count of valid packed-ids.
+ static inline constexpr uint32_t kVirtIdCount = uint32_t(kVirtIdMax - kVirtIdMin + 1);
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Provides operand type and additional payload.
+ Signature _signature;
+ //! Either base id as used by memory operand or any id as used by others.
+ uint32_t _base_id;
+
+ //! Data specific to the operand type.
+ //!
+ //! The reason we don't use union is that we have `constexpr` constructors that construct operands and other
+ //! `constexpr` functions that return whether another Operand or something else. These cannot generally work with
+ //! unions so we also cannot use `union` if we want to be standard compliant.
+ uint32_t _data[2];
+
+ //! \}
+
+ //! Tests whether the given `id` is a valid virtual register id. Since AsmJit supports both physical and virtual
+ //! registers it must be able to distinguish between these two. The idea is that physical registers are always
+ //! limited in size, so virtual identifiers start from `kVirtIdMin` and end at `kVirtIdMax`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR bool is_virt_id(uint32_t virt_id) noexcept { return virt_id - kVirtIdMin < uint32_t(kVirtIdCount); }
+
+ //! Converts a real-id into a packed-id that can be stored in Operand.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR uint32_t virt_index_to_virt_id(uint32_t virt_index) noexcept { return virt_index + kVirtIdMin; }
+
+ //! Converts a packed-id back to real-id.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR uint32_t virt_id_to_index(uint32_t virt_id) noexcept { return virt_id - kVirtIdMin; }
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! \cond INTERNAL
+ //! Initializes a `Reg` operand from `signature` and register `id`.
+ ASMJIT_INLINE_CONSTEXPR void _init_reg(const Signature& signature, uint32_t id) noexcept {
+ _signature = signature;
+ _base_id = id;
+ _data[0] = 0;
+ _data[1] = 0;
+ }
+ //! \endcond
+
+ //! Initializes the operand from `other` operand (used by operator overloads).
+ ASMJIT_INLINE_CONSTEXPR void copy_from(const Operand_& other) noexcept {
+ _signature._bits = other._signature._bits;
+ _base_id = other._base_id;
+ _data[0] = other._data[0];
+ _data[1] = other._data[1];
+ }
+
+ //! Resets the `Operand` to none.
+ //!
+ //! None operand is defined the following way:
+ //! - Its signature is zero (OperandType::kNone, and the rest zero as well).
+ //! - Its id is `0`.
+ //! - The reserved8_4 field is set to `0`.
+ //! - The reserved12_4 field is set to zero.
+ //!
+ //! In other words, reset operands have all members set to zero. Reset operand must match the Operand state
+ //! right after its construction. Alternatively, if you have an array of operands, you can simply use `memset()`.
+ //!
+ //! ```
+ //! using namespace asmjit;
+ //!
+ //! Operand a;
+ //! Operand b;
+ //! assert(a == b);
+ //!
+ //! b = x86::eax;
+ //! assert(a != b);
+ //!
+ //! b.reset();
+ //! assert(a == b);
+ //!
+ //! memset(&b, 0, sizeof(Operand));
+ //! assert(a == b);
+ //! ```
+ ASMJIT_INLINE_CONSTEXPR void reset() noexcept {
+ _signature.reset();
+ _base_id = 0;
+ _data[0] = 0;
+ _data[1] = 0;
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Tests whether this operand is the same as `other`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const Operand_& other) const noexcept { return equals(other); }
+
+ //! Tests whether this operand is not the same as `other`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const Operand_& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Cast
+ //! \{
+
+ //! Casts this operand to `T` type.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR T& as() noexcept { return static_cast<T&>(*this); }
+
+ //! Casts this operand to `T` type (const).
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR const T& as() const noexcept { return static_cast<const T&>(*this); }
+
+ //! \}
+
+ //! \name Equality
+ //! \{
+
+ //! Tests whether the operand is 100% equal to `other` operand.
+ //!
+ //! \note This basically performs a binary comparison, if aby bit is
+ //! different the operands are not equal.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool equals(const Operand_& other) const noexcept {
+ return Support::bool_and(
+ _signature == other._signature,
+ _base_id == other._base_id,
+ _data[0] == other._data[0],
+ _data[1] == other._data[1]
+ );
+ }
+
+ //! \}
+
+ //! \name Generic Accessors
+ //! \{
+
+ //! Returns operand signature as unsigned 32-bit integer.
+ //!
+ //! Signature is first 4 bytes of the operand data. It's used mostly for operand checking as it's
+ //! much faster to check packed 4 bytes at once than having to check these bytes individually.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Signature signature() const noexcept { return _signature; }
+
+ //! Tests whether the operand's signature matches the signature of the `other` operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_signature(const Operand_& other) const noexcept { return _signature == other._signature; }
+
+ //! Tests whether the operand's signature matches the given signature `sign`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_signature(Signature sign) const noexcept { return _signature == sign; }
+
+ //! Sets the operand signature, see `signature()`.
+ //!
+ //! \note Improper use of `set_signature()` can lead to hard-to-debug errors.
+ ASMJIT_INLINE_CONSTEXPR void set_signature(const Signature& signature) noexcept { _signature = signature; }
+
+ //! \overload
+ ASMJIT_INLINE_CONSTEXPR void set_signature(uint32_t signature) noexcept { _signature._bits = signature; }
+
+ //! Returns the type of the operand, see `OpType`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandType op_type() const noexcept { return _signature.op_type(); }
+
+ //! Tests whether the operand's type matches the given `type`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_op_type(OperandType op_type) const noexcept { return _signature.is_op_type(op_type); }
+
+ //! Tests whether the operand is none (`OperandType::kNone`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_none() const noexcept { return _signature == Signature::from_bits(0); }
+
+ //! Tests whether the operand is a register (`OperandType::kReg`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg() const noexcept { return is_op_type(OperandType::kReg); }
+
+ //! Tests whether the operand is a register-list.
+ //!
+ //! \note Register-list is currently only used by 32-bit ARM architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg_list() const noexcept { return is_op_type(OperandType::kRegList); }
+
+ //! Tests whether the operand is a memory location (`OperandType::kMem`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mem() const noexcept { return is_op_type(OperandType::kMem); }
+
+ //! Tests whether the operand is an immediate (`OperandType::kImm`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_imm() const noexcept { return is_op_type(OperandType::kImm); }
+
+ //! Tests whether the operand is a label (`OperandType::kLabel`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_label() const noexcept { return is_op_type(OperandType::kLabel); }
+
+ //! Tests whether the operand is a register or memory.
+ //!
+ //! \note This is useful on X86 and X86_64 architectures as many instructions support Reg/Mem operand combination.
+ //! So if the user code works with just \ref Operand, it's possible to check whether the operand is either a register
+ //! or memory location with a single check.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg_or_mem() const noexcept {
+ return Support::is_between(op_type(), OperandType::kReg, OperandType::kMem);
+ }
+
+ //! Tests whether the operand is a register, register-list, or memory.
+ //!
+ //! \note This is useful on 32-bit ARM architecture to check whether an operand references a register. It can be
+ //! used in other architectures too, but it would work identically to \ref is_reg_or_mem() as other architectures
+ //! don't provide register lists.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg_or_reg_list_or_mem() const noexcept {
+ return Support::is_between(op_type(), OperandType::kReg, OperandType::kRegList);
+ }
+
+ //! Returns the operand id.
+ //!
+ //! The value returned should be interpreted accordingly to the operand type:
+ //! * None - Should be `0`.
+ //! * Reg - Physical or virtual register id.
+ //! * Mem - Multiple meanings - BASE address (register or label id), or high value of a 64-bit absolute address.
+ //! * Imm - Should be `0`.
+ //! * Label - Label id if it was created by using `new_label()` or `Globals::kInvalidId` if the label is invalid or
+ //! not initialized.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t id() const noexcept { return _base_id; }
+
+ //! \}
+
+ //! \name Register Accessors
+ //! \{
+
+ //! Tests whether the operand is a physical register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_phys_reg() const noexcept { return is_reg() && _base_id < 0xFFu; }
+
+ //! Tests whether the operand is a virtual register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_virt_reg() const noexcept { return is_reg() && _base_id > 0xFFu; }
+
+ //! Tests whether the operand is a register matching the given register `type`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegType reg_type) const noexcept { return _signature.is_reg(reg_type); }
+
+ //! Tests whether the operand is register and of register type `reg_type` and `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegType reg_type, uint32_t reg_id) const noexcept { return Support::bool_and(is_reg(reg_type), _base_id == reg_id); }
+
+ //! Tests whether the operand is a register of the provided register group `reg_group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegGroup reg_group) const noexcept { return _signature.is_reg(reg_group); }
+
+ //! Tests whether the operand is register and of register group `reg_group` and `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegGroup reg_group, uint32_t reg_id) const noexcept { return Support::bool_and(is_reg(reg_group), _base_id == reg_id); }
+
+ //! Tests whether the operand is a general purpose register of any type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_pc() const noexcept { return is_reg(RegType::kPC); }
+
+ //! Tests whether the operand is a general purpose register of any type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp() const noexcept { return is_reg(RegGroup::kGp); }
+
+ //! Tests whether the operand is a general purpose register of any type having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp(uint32_t reg_id) const noexcept { return is_reg(RegGroup::kGp, reg_id); }
+
+ //! Tests whether the register is an 8-bit low or high general purpose register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8() const noexcept { return Support::bool_or(is_reg(RegType::kGp8Lo), is_reg(RegType::kGp8Hi)); }
+
+ //! Tests whether the register is an 8-bit low or high general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8(uint32_t reg_id) const noexcept { return Support::bool_and(is_gp8(), id() == reg_id); }
+
+ //! Tests whether the register is an 8-bit low general purpose register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_lo() const noexcept { return is_reg(RegType::kGp8Lo); }
+
+ //! Tests whether the register is an 8-bit low general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_lo(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp8Lo, reg_id); }
+
+ //! Tests whether the register is an 8-bit high general purpose register (X86|X86_64 only - AH, BH, CH, DH).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_hi() const noexcept { return is_reg(RegType::kGp8Hi); }
+
+ //! Tests whether the register is an 8-bit high general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_hi(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp8Hi, reg_id); }
+
+ //! Tests whether the register is a 16-bit general purpose register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp16() const noexcept { return is_reg(RegType::kGp16); }
+
+ //! Tests whether the register is a 16-bit general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp16(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp16, reg_id); }
+
+ //! Tests whether the register is a 32-bit general purpose register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp32() const noexcept { return is_reg(RegType::kGp32); }
+
+ //! Tests whether the register is a 32-bit general purpose register having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp32(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp32, reg_id); }
+
+ //! Tests whether the register is a 64-bit general purpose register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp64() const noexcept { return is_reg(RegType::kGp64); }
+
+ //! Tests whether the register is a 64-bit general purpose register having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp64(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp64, reg_id); }
+
+ //! Tests whether the register is a vector register of any size.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec() const noexcept { return is_reg(RegGroup::kVec); }
+
+ //! Tests whether the register is a vector register of any size having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec(uint32_t reg_id) const noexcept { return is_reg(RegGroup::kVec, reg_id); }
+
+ //! Tests whether the register is an 8-bit vector register or view (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec8() const noexcept { return is_reg(RegType::kVec8); }
+
+ //! Tests whether the register is an 8-bit vector register or view having the given id `reg_id` (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec8(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec8, reg_id); }
+
+ //! Tests whether the register is a 16-bit vector register or view (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec16() const noexcept { return is_reg(RegType::kVec16); }
+
+ //! Tests whether the register is a 16-bit vector register or view having the given id `reg_id` (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec16(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec16, reg_id); }
+
+ //! Tests whether the register is a 32-bit vector register or view (AArch32, AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec32() const noexcept { return is_reg(RegType::kVec32); }
+
+ //! Tests whether the register is a 32-bit vector register or view having the given id `reg_id` (AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec32(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec32, reg_id); }
+
+ //! Tests whether the register is a 64-bit vector register or view (AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec64() const noexcept { return is_reg(RegType::kVec64); }
+
+ //! Tests whether the register is a 64-bit vector register or view having the given id `reg_id` (AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec64(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec64, reg_id); }
+
+ //! Tests whether the register is a 128-bit vector register or view (X86|X86_64/AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec128() const noexcept { return is_reg(RegType::kVec128); }
+
+ //! Tests whether the register is a 128-bit vector register or view having the given id `reg_id` (X86|X86_64/AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec128(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec128, reg_id); }
+
+ //! Tests whether the register is a 256-bit vector register or view (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec256() const noexcept { return is_reg(RegType::kVec256); }
+
+ //! Tests whether the register is a 256-bit vector register or view having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec256(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec256, reg_id); }
+
+ //! Tests whether the register is a 512-bit vector register or view (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec512() const noexcept { return is_reg(RegType::kVec512); }
+
+ //! Tests whether the register is a 512-bit vector register or view having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec512(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec512, reg_id); }
+
+ //! Tests whether the register is a mask register of any size.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mask_reg() const noexcept { return is_reg(RegType::kMask); }
+
+ //! Tests whether the register is a mask register of any size having the given id `reg_id` (X86|X86_64/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mask_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kMask, reg_id); }
+
+ //! Tests whether the register is a mask register (`K` register on X86|X86_64) - alias of \ref is_mask_reg().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_kreg() const noexcept { return is_reg(RegType::kMask); }
+
+ //! Tests whether the register is a mask register (`K` register on X86|X86_64) of any size having the given id
+ //! `reg_id` (X86|X86_64/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_kreg(uint32_t reg_id) const noexcept { return is_reg(RegType::kMask, reg_id); }
+
+ //! Tests whether the register is a tile register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tile_reg() const noexcept { return is_reg(RegType::kTile); }
+
+ //! Tests whether the register is a tile register of the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tile_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kTile, reg_id); }
+
+ //! Tests whether the register is a tile register (`TMM` register on X86_64) - alias of \ref is_tile_reg().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tmm_reg() const noexcept { return is_reg(RegType::kTile); }
+
+ //! Tests whether the register is a tile register (`TMM` register on X86_64) of the given id `reg_id` - alias of
+ //! \ref is_tile_reg().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tmm_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kTile, reg_id); }
+
+ //! Tests whether the register is a segment register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_segment_reg() const noexcept { return is_reg(RegType::kSegment); }
+
+ //! Tests whether the register is a segment register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_segment_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kSegment, reg_id); }
+
+ //! Tests whether the register is a control register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_control_reg() const noexcept { return is_reg(RegType::kControl); }
+
+ //! Tests whether the register is a control register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_control_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kControl, reg_id); }
+
+ //! Tests whether the register is a debug register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_debug_reg() const noexcept { return is_reg(RegType::kDebug); }
+
+ //! Tests whether the register is a debug register of the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_debug_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kDebug, reg_id); }
+
+ //! Tests whether the register is an MMX register (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mm_reg() const noexcept { return is_reg(RegType::kX86_Mm); }
+
+ //! Tests whether the register is an MMX register of the given id `reg_id` (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mm_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kX86_Mm, reg_id); }
+
+ //! Tests whether the register is an FPU register (`ST` register on X86|X86_64) (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_st_reg() const noexcept { return is_reg(RegType::kX86_St); }
+
+ //! Tests whether the register is an FPU register (`ST` register on X86|X86_64) of the given id `reg_id` (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_st_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kX86_St, reg_id); }
+
+ //! Tests whether the register is a BND register (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_bnd_reg() const noexcept { return is_reg(RegType::kX86_Bnd); }
+
+ //! Tests whether the register is a BND register of the given id `reg_id` (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_bnd_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kX86_Bnd, reg_id); }
+
+ //! \}
+
+ //! \name Register-List Accessors
+ //! \{
+
+ //! Tests whether the operand is a register matching the given register `type`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg_list(RegType type) const noexcept {
+ return _signature.subset(Signature::kOpTypeMask | Signature::kRegTypeMask) == (Signature::from_op_type(OperandType::kRegList) | Signature::from_reg_type(type));
+ }
+
+ //! \}
+
+ //! \name X86-Specific Accessors
+ //! \{
+
+ //! Returns a size of a register or an X86 memory operand.
+ //!
+ //! \remarks At the moment only X86 and X86_64 memory operands have a size - other memory operands can use bits
+ //! that represent size as an additional payload. This means that memory size is architecture specific and should
+ //! be accessed via \ref x86::Mem::size(). Sometimes when the user knows that the operand is either a register or
+ //! memory operand this function can be helpful as it avoids casting, but it only works when it targets X86 and X86_64.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t x86_rm_size() const noexcept { return _signature.size(); }
+
+ //! \}
+};
+
+//! Base class representing an operand in AsmJit (default constructed version).
+class Operand : public Operand_ {
+public:
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates `kOpNone` operand having all members initialized to zero.
+ ASMJIT_INLINE_CONSTEXPR Operand() noexcept
+ : Operand_{ Signature::from_op_type(OperandType::kNone), 0u, { 0u, 0u }} {}
+
+ //! Creates a cloned `other` operand.
+ ASMJIT_INLINE_CONSTEXPR Operand(const Operand& other) noexcept = default;
+
+ //! Creates a cloned `other` operand.
+ ASMJIT_INLINE_CONSTEXPR explicit Operand(const Operand_& other)
+ : Operand_(other) {}
+
+ //! Creates an operand initialized to raw `[u0, u1, u2, u3]` values.
+ ASMJIT_INLINE_CONSTEXPR Operand(Globals::Init_, const Signature& u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept
+ : Operand_{{u0._bits}, u1, {u2, u3}} {}
+
+ //! Creates an uninitialized operand (dangerous).
+ ASMJIT_INLINE_NODEBUG explicit Operand(Globals::NoInit_) noexcept {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR Operand& operator=(const Operand& other) noexcept {
+ // Defaulted copy operator cannot be marked as constexpr in C++17, thus we have to implement it.
+ copy_from(other);
+ return *this;
+ }
+
+ ASMJIT_INLINE_CONSTEXPR Operand& operator=(const Operand_& other) noexcept {
+ // Defaulted copy operator cannot be marked as constexpr in C++17, thus we have to implement it.
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Clone
+ //! \{
+
+ //! Clones this operand and returns its copy.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Operand clone() const noexcept { return Operand(*this); }
+
+ //! \}
+};
+
+static_assert(sizeof(Operand) == 16, "asmjit::Operand must be exactly 16 bytes long");
+
+//! Label (jump target or data location).
+//!
+//! Label represents a location in code typically used as a jump target, but may be also a reference to some data or
+//! a static variable. Label has to be explicitly created by BaseEmitter.
+//!
+//! Example of using labels:
+//!
+//! ```
+//! // Create some emitter (for example x86::Assembler).
+//! x86::Assembler a;
+//!
+//! // Create Label instance.
+//! Label L1 = a.new_label();
+//!
+//! // ... your code ...
+//!
+//! // Using label.
+//! a.jump(L1);
+//!
+//! // ... your code ...
+//!
+//! // Bind label to the current position, see BaseEmitter::bind().
+//! a.bind(L1);
+//! ```
+class Label : public Operand {
+public:
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a label operand without ID (you must set the ID to make it valid).
+ ASMJIT_INLINE_CONSTEXPR Label() noexcept
+ : Operand(Globals::Init, Signature::from_op_type(OperandType::kLabel), Globals::kInvalidId, 0, 0) {}
+
+ //! Creates a cloned label operand of `other`.
+ ASMJIT_INLINE_CONSTEXPR Label(const Label& other) noexcept
+ : Operand(other) {}
+
+ //! Creates a label operand of the given `id`.
+ ASMJIT_INLINE_CONSTEXPR explicit Label(uint32_t id) noexcept
+ : Operand(Globals::Init, Signature::from_op_type(OperandType::kLabel), id, 0, 0) {}
+
+ ASMJIT_INLINE_NODEBUG explicit Label(Globals::NoInit_) noexcept
+ : Operand(Globals::NoInit) {}
+
+ //! Resets the label, will reset all properties and set its ID to `Globals::kInvalidId`.
+ ASMJIT_INLINE_CONSTEXPR void reset() noexcept {
+ _signature = Signature::from_op_type(OperandType::kLabel);
+ _base_id = Globals::kInvalidId;
+ _data[0] = 0;
+ _data[1] = 0;
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR Label& operator=(const Label& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the label was created by CodeHolder and/or an attached emitter.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_valid() const noexcept { return _base_id != Globals::kInvalidId; }
+
+ //! Sets the label `id`.
+ ASMJIT_INLINE_CONSTEXPR void set_id(uint32_t id) noexcept { _base_id = id; }
+
+ //! \}
+};
+
+//! Register traits.
+//!
+//! Register traits contain metadata about a particular register type. The metadata is used by AsmJit to setup
+//! register information on-the-fly and to populate tables that contain register information (this way it's possible
+//! to change register types and groups without having to reorder these tables).
+template<RegType kRegType>
+struct RegTraits {
+ //! \ref TypeId representing this register type, could be \ref TypeId::kVoid if such type doesn't exist.
+ static inline constexpr TypeId kTypeId = TypeId::kVoid;
+ //! RegType is not valid by default.
+ static inline constexpr uint32_t kValid = 0;
+
+ //! Zero type by default (defaults to None).
+ static inline constexpr RegType kType = RegType::kNone;
+ //! Zero group by default (defaults to GP).
+ static inline constexpr RegGroup kGroup = RegGroup::kGp;
+ //! No size by default.
+ static inline constexpr uint32_t kSize = 0u;
+
+ //! Empty signature by default (not even having operand type set to register).
+ static inline constexpr uint32_t kSignature = 0;
+};
+
+//! \cond
+
+//! Adds a template specialization for `REG_TYPE` into the local `RegTraits`.
+#define ASMJIT_DEFINE_REG_TRAITS(REG_TYPE, GROUP, SIZE, TYPE_ID) \
+template<> \
+struct RegTraits<REG_TYPE> { \
+ static inline constexpr uint32_t kValid = 1; \
+ static inline constexpr RegType kType = REG_TYPE; \
+ static inline constexpr RegGroup kGroup = GROUP; \
+ static inline constexpr uint32_t kSize = SIZE; \
+ static inline constexpr TypeId kTypeId = TYPE_ID; \
+ \
+ static inline constexpr uint32_t kSignature = \
+ (OperandSignature::from_op_type(OperandType::kReg) | \
+ OperandSignature::from_reg_type(kType) | \
+ OperandSignature::from_reg_group(kGroup) | \
+ OperandSignature::from_size(kSize)).bits(); \
+ \
+}
+
+// <--------------------+------------------------+------------------------+----+------------------+ +---+---+---+---+
+// | Reg-Type | Reg-Group |Size| TypeId | |X86|X64|A32|A64|
+// <--------------------+------------------------+------------------------+----+------------------+ +---+---+---+---+
+ASMJIT_DEFINE_REG_TRAITS(RegType::kPC , RegGroup::kPC , 8 , TypeId::kInt64 ); // | x | x | | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kGp8Lo , RegGroup::kGp , 1 , TypeId::kInt8 ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kGp8Hi , RegGroup::kGp , 1 , TypeId::kInt8 ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kGp16 , RegGroup::kGp , 2 , TypeId::kInt16 ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kGp32 , RegGroup::kGp , 4 , TypeId::kInt32 ); // | x | x | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kGp64 , RegGroup::kGp , 8 , TypeId::kInt64 ); // | x | x | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec8 , RegGroup::kVec , 1 , TypeId::kVoid ); // | | | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec16 , RegGroup::kVec , 2 , TypeId::kVoid ); // | | | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec32 , RegGroup::kVec , 4 , TypeId::kInt32x1 ); // | | | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec64 , RegGroup::kVec , 8 , TypeId::kInt32x2 ); // | | | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec128 , RegGroup::kVec , 16 , TypeId::kInt32x4 ); // | x | x | x | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec256 , RegGroup::kVec , 32 , TypeId::kInt32x8 ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVec512 , RegGroup::kVec , 64 , TypeId::kInt32x16); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kVecNLen , RegGroup::kVec , 0 , TypeId::kVoid ); // | | | | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kMask , RegGroup::kMask , 0 , TypeId::kVoid ); // | x | x | | x |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kTile , RegGroup::kTile , 0 , TypeId::kVoid ); // | | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kSegment , RegGroup::kSegment , 2 , TypeId::kVoid ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kControl , RegGroup::kControl , 0 , TypeId::kVoid ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kDebug , RegGroup::kDebug , 0 , TypeId::kVoid ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Mm , RegGroup::kX86_MM , 8 , TypeId::kMmx64 ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_St , RegGroup::kX86_St , 10 , TypeId::kFloat80 ); // | x | x | | |
+ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Bnd , RegGroup::kX86_Bnd , 16 , TypeId::kVoid ); // | x | x | | |
+
+#undef ASMJIT_DEFINE_REG_TRAITS
+
+//! \endcond
+
+namespace RegUtils {
+
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR OperandSignature signature_of(RegType reg_type) noexcept {
+ constexpr uint32_t signature_table[] = {
+ RegTraits<RegType( 0)>::kSignature, RegTraits<RegType( 1)>::kSignature, RegTraits<RegType( 2)>::kSignature, RegTraits<RegType( 3)>::kSignature,
+ RegTraits<RegType( 4)>::kSignature, RegTraits<RegType( 5)>::kSignature, RegTraits<RegType( 6)>::kSignature, RegTraits<RegType( 7)>::kSignature,
+ RegTraits<RegType( 8)>::kSignature, RegTraits<RegType( 9)>::kSignature, RegTraits<RegType(10)>::kSignature, RegTraits<RegType(11)>::kSignature,
+ RegTraits<RegType(12)>::kSignature, RegTraits<RegType(13)>::kSignature, RegTraits<RegType(14)>::kSignature, RegTraits<RegType(15)>::kSignature,
+ RegTraits<RegType(16)>::kSignature, RegTraits<RegType(17)>::kSignature, RegTraits<RegType(18)>::kSignature, RegTraits<RegType(19)>::kSignature,
+ RegTraits<RegType(20)>::kSignature, RegTraits<RegType(21)>::kSignature, RegTraits<RegType(22)>::kSignature, RegTraits<RegType(23)>::kSignature,
+ RegTraits<RegType(24)>::kSignature, RegTraits<RegType(25)>::kSignature, RegTraits<RegType(26)>::kSignature, RegTraits<RegType(27)>::kSignature,
+ RegTraits<RegType(28)>::kSignature, RegTraits<RegType(29)>::kSignature, RegTraits<RegType(30)>::kSignature, RegTraits<RegType(31)>::kSignature
+ };
+ return OperandSignature{signature_table[size_t(reg_type)]};
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG OperandSignature signature_of_vec_by_size(uint32_t size) noexcept {
+ RegType reg_type = RegType(Support::ctz((size | 0x40u) & 0x0Fu) - 4u + uint32_t(RegType::kVec128));
+ return signature_of(reg_type);
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR RegGroup group_of(RegType reg_type) noexcept {
+ constexpr RegGroup reg_group_table[] = {
+ RegTraits<RegType( 0)>::kGroup, RegTraits<RegType( 1)>::kGroup, RegTraits<RegType( 2)>::kGroup, RegTraits<RegType( 3)>::kGroup,
+ RegTraits<RegType( 4)>::kGroup, RegTraits<RegType( 5)>::kGroup, RegTraits<RegType( 6)>::kGroup, RegTraits<RegType( 7)>::kGroup,
+ RegTraits<RegType( 8)>::kGroup, RegTraits<RegType( 9)>::kGroup, RegTraits<RegType(10)>::kGroup, RegTraits<RegType(11)>::kGroup,
+ RegTraits<RegType(12)>::kGroup, RegTraits<RegType(13)>::kGroup, RegTraits<RegType(14)>::kGroup, RegTraits<RegType(15)>::kGroup,
+ RegTraits<RegType(16)>::kGroup, RegTraits<RegType(17)>::kGroup, RegTraits<RegType(18)>::kGroup, RegTraits<RegType(19)>::kGroup,
+ RegTraits<RegType(20)>::kGroup, RegTraits<RegType(21)>::kGroup, RegTraits<RegType(22)>::kGroup, RegTraits<RegType(23)>::kGroup,
+ RegTraits<RegType(24)>::kGroup, RegTraits<RegType(25)>::kGroup, RegTraits<RegType(26)>::kGroup, RegTraits<RegType(27)>::kGroup,
+ RegTraits<RegType(28)>::kGroup, RegTraits<RegType(29)>::kGroup, RegTraits<RegType(30)>::kGroup, RegTraits<RegType(31)>::kGroup
+ };
+ return reg_group_table[size_t(reg_type)];
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR TypeId type_id_of(RegType reg_type) noexcept {
+ constexpr TypeId type_id_table[] = {
+ RegTraits<RegType( 0)>::kTypeId, RegTraits<RegType( 1)>::kTypeId, RegTraits<RegType( 2)>::kTypeId, RegTraits<RegType( 3)>::kTypeId,
+ RegTraits<RegType( 4)>::kTypeId, RegTraits<RegType( 5)>::kTypeId, RegTraits<RegType( 6)>::kTypeId, RegTraits<RegType( 7)>::kTypeId,
+ RegTraits<RegType( 8)>::kTypeId, RegTraits<RegType( 9)>::kTypeId, RegTraits<RegType(10)>::kTypeId, RegTraits<RegType(11)>::kTypeId,
+ RegTraits<RegType(12)>::kTypeId, RegTraits<RegType(13)>::kTypeId, RegTraits<RegType(14)>::kTypeId, RegTraits<RegType(15)>::kTypeId,
+ RegTraits<RegType(16)>::kTypeId, RegTraits<RegType(17)>::kTypeId, RegTraits<RegType(18)>::kTypeId, RegTraits<RegType(19)>::kTypeId,
+ RegTraits<RegType(20)>::kTypeId, RegTraits<RegType(21)>::kTypeId, RegTraits<RegType(22)>::kTypeId, RegTraits<RegType(23)>::kTypeId,
+ RegTraits<RegType(24)>::kTypeId, RegTraits<RegType(25)>::kTypeId, RegTraits<RegType(26)>::kTypeId, RegTraits<RegType(27)>::kTypeId,
+ RegTraits<RegType(28)>::kTypeId, RegTraits<RegType(29)>::kTypeId, RegTraits<RegType(30)>::kTypeId, RegTraits<RegType(31)>::kTypeId
+ };
+ return type_id_table[size_t(reg_type)];
+}
+
+} // {RegUtils}
+
+//! Unified physical or virtual register operand.
+class Reg : public Operand {
+public:
+ //! \name Constants
+ //! \{
+
+ //! None or any register (mostly internal).
+ static inline constexpr uint32_t kIdBad = 0xFFu;
+
+ static inline constexpr uint32_t kBaseSignatureMask =
+ Signature::kOpTypeMask |
+ Signature::kRegTypeMask |
+ Signature::kRegGroupMask |
+ Signature::kSizeMask;
+
+ static inline constexpr uint32_t kTypeNone = uint32_t(RegType::kNone);
+ static inline constexpr uint32_t kSignature = Signature::from_op_type(OperandType::kReg).bits();
+
+ template<RegType kRegType>
+ static ASMJIT_INLINE_CONSTEXPR Signature signature_of_t() noexcept { return Signature{RegTraits<kRegType>::kSignature}; }
+
+ static ASMJIT_INLINE_CONSTEXPR Signature signature_of(RegType reg_type) noexcept { return RegUtils::signature_of(reg_type); }
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a dummy register operand.
+ ASMJIT_INLINE_CONSTEXPR Reg() noexcept
+ : Operand(Globals::Init, Signature::from_op_type(OperandType::kReg), kIdBad, 0u, 0u) {}
+
+ //! Creates a new register operand which is the same as `other` .
+ ASMJIT_INLINE_CONSTEXPR Reg(const Reg& other) noexcept
+ : Operand(other) {}
+
+ //! Creates a new register operand compatible with `other`, but with a different `id`.
+ ASMJIT_INLINE_CONSTEXPR Reg(const Reg& other, uint32_t id) noexcept
+ : Operand(Globals::Init, other._signature, id, 0u, 0u) {}
+
+ //! Creates a register initialized to the given `signature` and `id`.
+ ASMJIT_INLINE_CONSTEXPR Reg(const Signature& signature, uint32_t id) noexcept
+ : Operand(Globals::Init, signature, id, 0u, 0u) {}
+
+ ASMJIT_INLINE_NODEBUG explicit Reg(Globals::NoInit_) noexcept
+ : Operand(Globals::NoInit) {}
+
+ //! Creates a new register from register type and id.
+ static ASMJIT_INLINE_CONSTEXPR Reg from_type_and_id(RegType type, uint32_t id) noexcept { return Reg(signature_of(type), id); }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR Reg& operator=(const Reg& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Signature Accessors
+ //! \{
+
+ //! Returns base signature of the register associated with each register type.
+ //!
+ //! Base signature only contains the operand type, register type, register group, and register size. It doesn't
+ //! contain element type, predicate, or other architecture-specific data. Base signature is a signature that is
+ //! provided by \ref RegTraits.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature base_signature() const noexcept { return _signature & kBaseSignatureMask; }
+
+ //! Tests whether the operand's base signature matches the given signature `signature`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_signature(uint32_t signature) const noexcept { return base_signature() == signature; }
+
+ //! Tests whether the operand's base signature matches the given signature `signature`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_signature(const OperandSignature& signature) const noexcept { return base_signature() == signature; }
+
+ //! Tests whether the operand's base signature matches the base signature of the `other` operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_signature(const Reg& other) const noexcept { return base_signature() == other.base_signature(); }
+
+ //! \}
+
+ //! \name Register Accessors
+ //! \{
+
+ //! Returns the type of the register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType reg_type() const noexcept { return _signature.reg_type(); }
+
+ //! Returns the group this register belongs to.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegGroup reg_group() const noexcept { return _signature.reg_group(); }
+
+ //! Tests whether this register is the same as `other`.
+ //!
+ //! This is just an optimization. Registers by default only use the first 8 bytes of Operand data, so this method
+ //! takes advantage of this knowledge and only compares these 8 bytes. If both operands were created correctly
+ //! both \ref equals() and \ref is_same() should give the same answer, however, if any of these two contains garbage
+ //! or other metadata in the upper 8 bytes then \ref is_same() may return `true` in cases in which \ref equals()
+ //! returns false.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_same(const Reg& other) const noexcept { return (_signature == other._signature) & (_base_id == other._base_id); }
+
+ //! Tests whether the register is valid (either virtual or physical).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_valid() const noexcept { return Support::bool_and(_signature != 0u, _base_id != kIdBad); }
+
+ //! Tests whether this is a physical register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_phys_reg() const noexcept { return _base_id < kIdBad; }
+
+ //! Tests whether this is a virtual register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_virt_reg() const noexcept { return _base_id > kIdBad; }
+
+ // NOTE: A careful reader may wonder why the member functions here are repeated and basically do the same as in
+ // `Operand_`, however, they don't always do the same. In `Operand_` case each test function must check
+ // whether the operand is actually a register, whereas here we don't have to. However, in some cases it's
+ // actually beneficial to do that (if the check is using a constant expression on the input). Since C++
+ // doesn't support mixins the implementation is basically duplicating some of the `Operand_` checks here.
+ using Operand_::is_reg;
+
+ //! Tests whether the register is of the given register type `reg_type`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegType reg_type) const noexcept {
+#if defined(__GNUC__)
+ // At the moment operand type is 3 bits and register type is 5 bits, which form a value that is stored in
+ // the 8 least significant bits of the operand signature. Checking ALL of these 8 bits is much better than
+ // extracting register type at least on X86 and X86_64 targets.
+ if (__builtin_constant_p(reg_type)) {
+ return _signature.is_reg(reg_type);
+ }
+#endif
+
+ return _signature.subset(Signature::kRegTypeMask) == Signature::from_reg_type(reg_type);
+ }
+
+ //! Tests whether the register is of the given register type `reg_type` having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegType reg_type, uint32_t reg_id) const noexcept { return Support::bool_and(is_reg(reg_type), _base_id == reg_id); }
+
+ //! Tests whether the register is of the given register group `reg_group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegGroup reg_group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::from_reg_group(reg_group); }
+
+ //! Tests whether the register is of the given register group `reg_group` having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg(RegGroup reg_group, uint32_t reg_id) const noexcept { return Support::bool_and(is_reg(reg_group), _base_id == reg_id); }
+
+ //! Tests whether the operand is a general purpose register of any type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_pc() const noexcept { return is_reg(RegType::kPC); }
+
+ //! Tests whether the register is a general purpose register of any type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp() const noexcept { return is_reg(RegGroup::kGp); }
+
+ //! Tests whether the register is a general purpose register of any type having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp(uint32_t reg_id) const noexcept { return is_reg(RegGroup::kGp, reg_id); }
+
+ //! Tests whether the register is an 8-bit low or high general purpose register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8() const noexcept { return Support::bool_or(is_reg(RegType::kGp8Lo), is_reg(RegType::kGp8Hi)); }
+
+ //! Tests whether the register is an 8-bit low or high general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8(uint32_t reg_id) const noexcept { return Support::bool_and(is_gp8(), id() == reg_id); }
+
+ //! Tests whether the register is an 8-bit low general purpose register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_lo() const noexcept { return is_reg(RegType::kGp8Lo); }
+
+ //! Tests whether the register is an 8-bit low general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_lo(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp8Lo, reg_id); }
+
+ //! Tests whether the register is an 8-bit high general purpose register (X86|X86_64 only - AH, BH, CH, DH).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_hi() const noexcept { return is_reg(RegType::kGp8Hi); }
+
+ //! Tests whether the register is an 8-bit high general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp8_hi(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp8Hi, reg_id); }
+
+ //! Tests whether the register is a 16-bit general purpose register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp16() const noexcept { return is_reg(RegType::kGp16); }
+
+ //! Tests whether the register is a 16-bit general purpose register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp16(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp16, reg_id); }
+
+ //! Tests whether the register is a 32-bit general purpose register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp32() const noexcept { return is_reg(RegType::kGp32); }
+
+ //! Tests whether the register is a 32-bit general purpose register having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp32(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp32, reg_id); }
+
+ //! Tests whether the register is a 64-bit general purpose register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp64() const noexcept { return is_reg(RegType::kGp64); }
+
+ //! Tests whether the register is a 64-bit general purpose register having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp64(uint32_t reg_id) const noexcept { return is_reg(RegType::kGp64, reg_id); }
+
+ //! Tests whether the register is a vector register of any size.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec() const noexcept { return is_reg(RegGroup::kVec); }
+
+ //! Tests whether the register is a vector register of any size having the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec(uint32_t reg_id) const noexcept { return is_reg(RegGroup::kVec, reg_id); }
+
+ //! Tests whether the register is an 8-bit vector register or view (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec8() const noexcept { return is_reg(RegType::kVec8); }
+
+ //! Tests whether the register is an 8-bit vector register or view having the given id `reg_id` (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec8(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec8, reg_id); }
+
+ //! Tests whether the register is a 16-bit vector register or view (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec16() const noexcept { return is_reg(RegType::kVec16); }
+
+ //! Tests whether the register is a 16-bit vector register or view having the given id `reg_id` (AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec16(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec16, reg_id); }
+
+ //! Tests whether the register is a 32-bit vector register or view (AArch32, AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec32() const noexcept { return is_reg(RegType::kVec32); }
+
+ //! Tests whether the register is a 32-bit vector register or view having the given id `reg_id` (AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec32(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec32, reg_id); }
+
+ //! Tests whether the register is a 64-bit vector register or view (AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec64() const noexcept { return is_reg(RegType::kVec64); }
+
+ //! Tests whether the register is a 64-bit vector register or view having the given id `reg_id` (AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec64(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec64, reg_id); }
+
+ //! Tests whether the register is a 128-bit vector register or view (X86|X86_64/AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec128() const noexcept { return is_reg(RegType::kVec128); }
+
+ //! Tests whether the register is a 128-bit vector register or view having the given id `reg_id` (X86|X86_64/AArch32/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec128(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec128, reg_id); }
+
+ //! Tests whether the register is a 256-bit vector register or view (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec256() const noexcept { return is_reg(RegType::kVec256); }
+
+ //! Tests whether the register is a 256-bit vector register or view having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec256(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec256, reg_id); }
+
+ //! Tests whether the register is a 512-bit vector register or view (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec512() const noexcept { return is_reg(RegType::kVec512); }
+
+ //! Tests whether the register is a 512-bit vector register or view having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec512(uint32_t reg_id) const noexcept { return is_reg(RegType::kVec512, reg_id); }
+
+ //! Tests whether the register is a mask register of any size.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mask_reg() const noexcept { return is_reg(RegType::kMask); }
+
+ //! Tests whether the register is a mask register of any size having the given id `reg_id` (X86|X86_64/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mask_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kMask, reg_id); }
+
+ //! Tests whether the register is a mask register (`K` register on X86|X86_64) - alias of \ref is_mask_reg().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_kreg() const noexcept { return is_reg(RegType::kMask); }
+
+ //! Tests whether the register is a mask register (`K` register on X86|X86_64) of any size having the given id
+ //! `reg_id` (X86|X86_64/AArch64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_kreg(uint32_t reg_id) const noexcept { return is_reg(RegType::kMask, reg_id); }
+
+ //! Tests whether the register is a tile register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tile_reg() const noexcept { return is_reg(RegType::kTile); }
+
+ //! Tests whether the register is a tile register of the given id `reg_id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tile_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kTile, reg_id); }
+
+ //! Tests whether the register is a tile register (`TMM` register on X86_64) - alias of \ref is_tile_reg().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tmm_reg() const noexcept { return is_reg(RegType::kTile); }
+
+ //! Tests whether the register is a tile register (`TMM` register on X86_64) of the given id `reg_id` - alias of
+ //! \ref is_tile_reg().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_tmm_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kTile, reg_id); }
+
+ //! Tests whether the register is a segment register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_segment_reg() const noexcept { return is_reg(RegType::kSegment); }
+
+ //! Tests whether the register is a segment register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_segment_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kSegment, reg_id); }
+
+ //! Tests whether the register is a control register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_control_reg() const noexcept { return is_reg(RegType::kControl); }
+
+ //! Tests whether the register is a control register having the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_control_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kControl, reg_id); }
+
+ //! Tests whether the register is a debug register (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_debug_reg() const noexcept { return is_reg(RegType::kDebug); }
+
+ //! Tests whether the register is a debug register of the given id `reg_id` (X86|X86_64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_debug_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kDebug, reg_id); }
+
+ //! Tests whether the register is an MMX register (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mm_reg() const noexcept { return is_reg(RegType::kX86_Mm); }
+
+ //! Tests whether the register is an MMX register of the given id `reg_id` (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_mm_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kX86_Mm, reg_id); }
+
+ //! Tests whether the register is an FPU register (`ST` register on X86|X86_64) (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_st_reg() const noexcept { return is_reg(RegType::kX86_St); }
+
+ //! Tests whether the register is an FPU register (`ST` register on X86|X86_64) of the given id `reg_id` (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_st_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kX86_St, reg_id); }
+
+ //! Tests whether the register is a BND register (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_bnd_reg() const noexcept { return is_reg(RegType::kX86_Bnd); }
+
+ //! Tests whether the register is a BND register of the given id `reg_id` (X86|X64).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_bnd_reg(uint32_t reg_id) const noexcept { return is_reg(RegType::kX86_Bnd, reg_id); }
+
+ //! Tests whether the register specifies a size (i.e. the size is not zero).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_size() const noexcept { return _signature.has_field<Signature::kSizeMask>(); }
+
+ //! Tests whether the register size matches size `s`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_size(uint32_t s) const noexcept { return size() == s; }
+
+ //! Returns the size of the register in bytes. If the register size depends on architecture (like `x86::CReg` and
+ //! `x86::DReg`) the size returned should be the greatest possible (so it should return 64-bit size in such case).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t size() const noexcept { return _signature.get_field<Signature::kSizeMask>(); }
+
+ //! Returns operation predicate of the register (ARM/AArch64).
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t predicate() const noexcept { return _signature.get_field<Signature::kPredicateMask>(); }
+
+ //! Sets operation predicate of the register to `predicate` (ARM/AArch64).
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the register.
+ ASMJIT_INLINE_CONSTEXPR void set_predicate(uint32_t predicate) noexcept { _signature.set_field<Signature::kPredicateMask>(predicate); }
+
+ //! Resets shift operation type of the register to the default value (ARM/AArch64).
+ ASMJIT_INLINE_CONSTEXPR void reset_predicate() noexcept { _signature.set_field<Signature::kPredicateMask>(0); }
+
+ //! Clones the register operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Reg clone() const noexcept { return Reg(*this); }
+
+ //! Casts this register to `RegT` by also changing its signature.
+ //!
+ //! \note Improper use of `clone_as()` can lead to hard-to-debug errors.
+ template<typename RegT>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegT clone_as() const noexcept { return RegT(Signature(RegT::kSignature), id()); }
+
+ //! Casts this register to `other` by also changing its signature.
+ //!
+ //! \note Improper use of `clone_as()` can lead to hard-to-debug errors.
+ template<typename RegT>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegT clone_as(const RegT& other) const noexcept { return RegT(other.signature(), id()); }
+
+ template<RegType kRegType>
+ ASMJIT_INLINE_CONSTEXPR void set_reg_t(uint32_t id) noexcept {
+ set_signature(RegTraits<kRegType>::kSignature);
+ set_id(id);
+ }
+
+ //! Sets the register id to `id`.
+ ASMJIT_INLINE_CONSTEXPR void set_id(uint32_t id) noexcept { _base_id = id; }
+
+ //! Sets the register `signature` and `id`.
+ ASMJIT_INLINE_CONSTEXPR void set_signature_and_id(const OperandSignature& signature, uint32_t id) noexcept {
+ _signature = signature;
+ _base_id = id;
+ }
+
+ //! \}
+};
+
+//! Adds constructors and member functions to a class that implements abstract register. Abstract register
+//! is a register that doesn't have a base RegType and signature like `x86::Gp`, `x86::Vec`, `a64::Gp`, etc...
+#define ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
+public: \
+ /*! Default constructor that only setups basics. */ \
+ ASMJIT_INLINE_CONSTEXPR REG() noexcept \
+ : BASE(Signature{kSignature}, kIdBad) {} \
+ \
+ /*! Makes a copy of the `other` register operand. */ \
+ ASMJIT_INLINE_CONSTEXPR REG(const REG& other) noexcept \
+ : BASE(other) {} \
+ \
+ /*! Makes a copy of the `other` register having id set to `id` */ \
+ ASMJIT_INLINE_CONSTEXPR REG(const Reg& other, uint32_t id) noexcept \
+ : BASE(other, id) {} \
+ \
+ /*! Creates a register based on `signature` and `id`. */ \
+ ASMJIT_INLINE_CONSTEXPR REG(const OperandSignature& sgn, uint32_t id) noexcept \
+ : BASE(sgn, id) {} \
+ \
+ /*! Creates a completely uninitialized REG register operand (garbage). */ \
+ ASMJIT_INLINE_NODEBUG explicit REG(Globals::NoInit_) noexcept \
+ : BASE(Globals::NoInit) {} \
+ \
+ /*! Creates a new register from register type and id. */ \
+ static ASMJIT_INLINE_NODEBUG REG from_type_and_id(RegType type, uint32_t id) noexcept {\
+ return REG(signature_of(type), id); \
+ } \
+ \
+ /*! Returns a copy of this register operand. */ \
+ [[nodiscard]] \
+ ASMJIT_INLINE_CONSTEXPR REG clone() const noexcept { return REG(*this); } \
+ \
+ /*! Copy assignment operator - copies the content of `other` to this register. */ \
+ ASMJIT_INLINE_CONSTEXPR REG& operator=(const REG& other) noexcept { \
+ copy_from(other); \
+ return *this; \
+ }
+
+//! Adds constructors and member functions to a class that implements final register. Final registers MUST HAVE a valid
+//! signature.
+#define ASMJIT_DEFINE_FINAL_REG(REG, BASE, TRAITS) \
+public: \
+ static inline constexpr RegType kThisType = TRAITS::kType; \
+ static inline constexpr RegGroup kThisGroup = TRAITS::kGroup; \
+ static inline constexpr uint32_t kThisSize = TRAITS::kSize; \
+ static inline constexpr uint32_t kSignature = TRAITS::kSignature; \
+ \
+ ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
+ \
+ /*! Creates a register operand having its id set to `id`. */ \
+ ASMJIT_INLINE_CONSTEXPR explicit REG(uint32_t id) noexcept \
+ : BASE(Signature{kSignature}, id) {}
+
+//! Unified general purpose register (also acts as a base class for architecture specific GP registers).
+class UniGp : public Reg {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(UniGp, Reg)
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Creates a new 32-bit GP register having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR UniGp make_r32(uint32_t reg_id) noexcept { return UniGp(signature_of_t<RegType::kGp32>(), reg_id); }
+
+ //! Creates a new 64-bit GP register having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR UniGp make_r64(uint32_t reg_id) noexcept { return UniGp(signature_of_t<RegType::kGp64>(), reg_id); }
+
+ //! \}
+
+ //! \name Unified Accessors
+ //! \{
+
+ //! Clones and casts this register to a 32-bit GP register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR UniGp r32() const noexcept { return UniGp(signature_of_t<RegType::kGp32>(), id()); }
+
+ //! Clones and casts this register to a 64-bit GP register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR UniGp r64() const noexcept { return UniGp(signature_of_t<RegType::kGp64>(), id()); }
+
+ //! \}
+};
+
+//! Unified vector register (also acts as a base class for architecture specific vector registers).
+class UniVec : public Reg {
+public:
+ ASMJIT_DEFINE_ABSTRACT_REG(UniVec, Reg)
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Creates a new 128-bit vector register having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR UniVec make_v128(uint32_t reg_id) noexcept { return UniVec(signature_of_t<RegType::kVec128>(), reg_id); }
+
+ //! Creates a new 256-bit vector register having the given register id `reg_id`.
+ //!
+ //! \note 256-bit vector registers are only supported by X86|X86_64.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR UniVec make_v256(uint32_t reg_id) noexcept { return UniVec(signature_of_t<RegType::kVec256>(), reg_id); }
+
+ //! Creates a new 512-bit vector register having the given register id `reg_id`.
+ //!
+ //! \note 512-bit vector registers are only supported by X86|X86_64.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR UniVec make_v512(uint32_t reg_id) noexcept { return UniVec(signature_of_t<RegType::kVec512>(), reg_id); }
+
+ //! \}
+
+ //! \name Unified Accessors
+ //! \{
+
+ //! Clones and casts this register to a 128-bit vector register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR UniVec v128() const noexcept { return UniVec(signature_of_t<RegType::kVec128>(), id()); }
+
+ //! Clones and casts this register to a 256-bit vector register.
+ //!
+ //! \note 256-bit vector registers are only supported by X86|X86_64.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR UniVec v256() const noexcept { return UniVec(signature_of_t<RegType::kVec256>(), id()); }
+
+ //! Clones and casts this register to a 512-bit vector register.
+ //!
+ //! \note 512-bit vector registers are only supported by X86|X86_64.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR UniVec v512() const noexcept { return UniVec(signature_of_t<RegType::kVec512>(), id()); }
+
+ //! \}
+};
+//! RegOnly is 8-byte version of `Reg` that allows to store either register or nothing.
+//!
+//! It's designed to decrease the space consumed by an extra "operand" in \ref BaseEmitter and \ref InstNode.
+struct RegOnly {
+ //! \name Types
+ //! \{
+
+ using Signature = OperandSignature;
+
+ //! \}
+
+ //! Operand signature - only \ref OperandType::kNone and \ref OperandType::kReg are supported.
+ Signature _signature;
+ //! Physical or virtual register id.
+ uint32_t _id;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Initializes the `RegOnly` instance to hold register `signature` and `id`.
+ ASMJIT_INLINE_CONSTEXPR void init(const OperandSignature& signature, uint32_t id) noexcept {
+ _signature = signature;
+ _id = id;
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void init(const Reg& reg) noexcept { init(reg.signature(), reg.id()); }
+ ASMJIT_INLINE_CONSTEXPR void init(const RegOnly& reg) noexcept { init(reg.signature(), reg.id()); }
+
+ //! Resets the `RegOnly` members to zeros (none).
+ ASMJIT_INLINE_CONSTEXPR void reset() noexcept { init(Signature::from_bits(0), 0); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether this ExtraReg is none (same as calling `Operand_::is_none()`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_none() const noexcept { return _signature == 0; }
+
+ //! Tests whether the register is valid (either virtual or physical).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg() const noexcept { return _signature != 0; }
+
+ //! Tests whether this is a physical register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_phys_reg() const noexcept { return _id < Reg::kIdBad; }
+
+ //! Tests whether this is a virtual register (used by `BaseCompiler`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_virt_reg() const noexcept { return _id > Reg::kIdBad; }
+
+ //! Returns the register signature or 0 if no register is assigned.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR OperandSignature signature() const noexcept { return _signature; }
+
+ //! Returns the register id.
+ //!
+ //! \note Always check whether the register is assigned before using the returned identifier as
+ //! non-assigned `RegOnly` instance would return zero id, which is still a valid register id.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t id() const noexcept { return _id; }
+
+ //! Sets the register id.
+ ASMJIT_INLINE_CONSTEXPR void set_id(uint32_t id) noexcept { _id = id; }
+
+ //! Returns the register type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType type() const noexcept { return _signature.reg_type(); }
+
+ //! Returns the register group.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegGroup group() const noexcept { return _signature.reg_group(); }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Converts this ExtraReg to a real `RegT` operand.
+ template<typename RegT>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegT to_reg() const noexcept { return RegT(_signature, _id); }
+
+ //! \}
+};
+
+//! List of physical registers (base).
+//!
+//! \note List of registers is only used by some ARM instructions at the moment.
+class BaseRegList : public Operand {
+public:
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kSignature = Signature::from_op_type(OperandType::kRegList).bits();
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a dummy register operand.
+ ASMJIT_INLINE_CONSTEXPR BaseRegList() noexcept
+ : Operand(Globals::Init, Signature::from_op_type(OperandType::kRegList), 0, 0, 0) {}
+
+ //! Creates a new register operand which is the same as `other` .
+ ASMJIT_INLINE_CONSTEXPR BaseRegList(const BaseRegList& other) noexcept
+ : Operand(other) {}
+
+ //! Creates a new register operand compatible with `other`, but with a different `id`.
+ ASMJIT_INLINE_CONSTEXPR BaseRegList(const BaseRegList& other, RegMask reg_mask) noexcept
+ : Operand(Globals::Init, other._signature, reg_mask, 0, 0) {}
+
+ //! Creates a register initialized to the given `signature` and `id`.
+ ASMJIT_INLINE_CONSTEXPR BaseRegList(const Signature& signature, RegMask reg_mask) noexcept
+ : Operand(Globals::Init, signature, reg_mask, 0, 0) {}
+
+ ASMJIT_INLINE_NODEBUG explicit BaseRegList(Globals::NoInit_) noexcept
+ : Operand(Globals::NoInit) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR BaseRegList& operator=(const BaseRegList& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the register-list is valid, which means it has a type and at least a single register in the list.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_valid() const noexcept { return bool(unsigned(_signature != 0u) & unsigned(_base_id != 0u)); }
+
+ //! Tests whether the register type matches `type` - same as `is_reg(type)`, provided for convenience.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_type(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::from_reg_type(type); }
+
+ //! Tests whether the register group matches `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_group(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::from_reg_group(group); }
+
+ //! Tests whether the register is a general purpose register (any size).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_gp() const noexcept { return is_group(RegGroup::kGp); }
+
+ //! Tests whether the register is a vector register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_vec() const noexcept { return is_group(RegGroup::kVec); }
+
+ //! Returns the register type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType reg_type() const noexcept { return _signature.reg_type(); }
+
+ //! Returns the register group.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegGroup reg_group() const noexcept { return _signature.reg_group(); }
+
+ //! Returns the size of a single register in this register-list or 0 if unspecified.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t size() const noexcept { return _signature.get_field<Signature::kSizeMask>(); }
+
+ //! Returns the register list as a mask, where each bit represents one physical register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegMask list() const noexcept { return _base_id; }
+
+ //! Sets the register list to `mask`.
+ ASMJIT_INLINE_CONSTEXPR void set_list(RegMask mask) noexcept { _base_id = mask; }
+
+ //! Remoes all registers from the register-list by making the underlying register-mask zero.
+ ASMJIT_INLINE_CONSTEXPR void reset_list() noexcept { _base_id = 0; }
+
+ //! Adds registers passed by a register `mask` to the register-list.
+ ASMJIT_INLINE_CONSTEXPR void add_list(RegMask mask) noexcept { _base_id |= mask; }
+
+ //! Removes registers passed by a register `mask` to the register-list.
+ ASMJIT_INLINE_CONSTEXPR void clear_list(RegMask mask) noexcept { _base_id &= ~mask; }
+
+ //! Uses AND operator to combine the current register-list with other register `mask`.
+ ASMJIT_INLINE_CONSTEXPR void and_list(RegMask mask) noexcept { _base_id &= mask; }
+
+ //! Uses XOR operator to combine the current register-list with other register `mask`.
+ ASMJIT_INLINE_CONSTEXPR void xor_list(RegMask mask) noexcept { _base_id ^= mask; }
+
+ //! Checks whether a physical register `phys_id` is in the register-list.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_reg(uint32_t phys_id) const noexcept { return phys_id < 32u ? (_base_id & (1u << phys_id)) != 0 : false; }
+
+ //! Adds a physical register `phys_id` to the register-list.
+ ASMJIT_INLINE_CONSTEXPR void add_reg(uint32_t phys_id) noexcept { add_list(1u << phys_id); }
+
+ //! Removes a physical register `phys_id` from the register-list.
+ ASMJIT_INLINE_CONSTEXPR void clear_reg(uint32_t phys_id) noexcept { clear_list(1u << phys_id); }
+
+ //! Clones the register-list operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR BaseRegList clone() const noexcept { return BaseRegList(*this); }
+
+ //! Casts this register to `RegT` by also changing its signature.
+ //!
+ //! \note Improper use of `clone_as()` can lead to hard-to-debug errors.
+ template<typename RegListT>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegListT clone_as() const noexcept { return RegListT(Signature(RegListT::kSignature), list()); }
+
+ //! Casts this register to `other` by also changing its signature.
+ //!
+ //! \note Improper use of `clone_as()` can lead to hard-to-debug errors.
+ template<typename RegListT>
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegListT clone_as(const RegListT& other) const noexcept { return RegListT(other.signature(), list()); }
+
+ //! \}
+};
+
+template<typename RegT>
+class RegListT : public BaseRegList {
+public:
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a dummy register operand.
+ ASMJIT_INLINE_CONSTEXPR RegListT() noexcept
+ : BaseRegList() {}
+
+ //! Creates a new register operand which is the same as `other` .
+ ASMJIT_INLINE_CONSTEXPR RegListT(const RegListT& other) noexcept
+ : BaseRegList(other) {}
+
+ //! Creates a new register operand compatible with `other`, but with a different `id`.
+ ASMJIT_INLINE_CONSTEXPR RegListT(const RegListT& other, RegMask reg_mask) noexcept
+ : BaseRegList(other, reg_mask) {}
+
+ //! Creates a register initialized to the given `signature` and `id`.
+ ASMJIT_INLINE_CONSTEXPR RegListT(const Signature& signature, RegMask reg_mask) noexcept
+ : BaseRegList(signature, reg_mask) {}
+
+ //! Creates a register initialized to the given `signature` and `regs`.
+ ASMJIT_INLINE_NODEBUG RegListT(const Signature& signature, std::initializer_list<RegT> regs) noexcept
+ : BaseRegList(signature, RegMask(0)) { add_regs(regs); }
+
+ ASMJIT_INLINE_NODEBUG explicit RegListT(Globals::NoInit_) noexcept
+ : BaseRegList(Globals::NoInit) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR RegListT& operator=(const RegListT& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ using BaseRegList::add_list;
+ using BaseRegList::clear_list;
+ using BaseRegList::and_list;
+ using BaseRegList::xor_list;
+
+ //! Adds registers to this register-list as provided by `other` register-list.
+ ASMJIT_INLINE_CONSTEXPR void add_list(const RegListT<RegT>& other) noexcept { add_list(other.list()); }
+
+ //! Removes registers contained in `other` register-list.
+ ASMJIT_INLINE_CONSTEXPR void clear_list(const RegListT<RegT>& other) noexcept { clear_list(other.list()); }
+
+ //! Uses AND operator to combine the current register-list with `other` register-list.
+ ASMJIT_INLINE_CONSTEXPR void and_list(const RegListT<RegT>& other) noexcept { and_list(other.list()); }
+
+ //! Uses XOR operator to combine the current register-list with `other` register-list.
+ ASMJIT_INLINE_CONSTEXPR void xor_list(const RegListT<RegT>& other) noexcept { xor_list(other.list()); }
+
+ using BaseRegList::add_reg;
+ using BaseRegList::clear_reg;
+
+ ASMJIT_INLINE_CONSTEXPR void add_reg(const RegT& reg) noexcept {
+ if (reg.id() < 32u) {
+ add_reg(reg.id());
+ }
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void add_regs(std::initializer_list<RegT> regs) noexcept {
+ for (const RegT& reg : regs) {
+ add_reg(reg);
+ }
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void clear_reg(const RegT& reg) noexcept {
+ if (reg.id() < 32u) {
+ clear_reg(reg.id());
+ }
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void clear_regs(std::initializer_list<RegT> regs) noexcept {
+ for (const RegT& reg : regs) {
+ clear_reg(reg);
+ }
+ }
+
+ //! \}
+};
+
+//! Base class for all memory operands.
+//!
+//! The data is split into the following parts:
+//!
+//! - BASE - Base register or label - requires 36 bits total. 4 bits are used to encode the type of the BASE operand
+//! (label vs. register type) and the remaining 32 bits define the BASE id, which can be a physical or virtual
+//! register index. If BASE type is zero, which is never used as a register type and label doesn't use it as well
+//! then BASE field contains a high DWORD of a possible 64-bit absolute address, which is possible on X64.
+//!
+//! - INDEX - Index register (or theoretically Label, which doesn't make sense). Encoding is similar to BASE - it
+//! also requires 36 bits and splits the encoding to INDEX type (4 bits defining the register type) and 32-bit id.
+//!
+//! - OFFSET - A relative offset of the address. Basically if BASE is specified the relative displacement adjusts
+//! BASE and an optional INDEX. if BASE is not specified then the OFFSET should be considered as ABSOLUTE address
+//! (at least on X86). In that case its low 32 bits are stored in DISPLACEMENT field and the remaining high 32
+//! bits are stored in BASE.
+//!
+//! - OTHER - There is rest 8 bits that can be used for whatever purpose. For example \ref x86::Mem operand uses
+//! these bits to store segment override prefix and index shift (or scale).
+class BaseMem : public Operand {
+public:
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default `BaseMem` operand, that points to [0].
+ ASMJIT_INLINE_CONSTEXPR BaseMem() noexcept
+ : Operand(Globals::Init, Signature::from_op_type(OperandType::kMem), 0, 0, 0) {}
+
+ //! Creates a `BaseMem` operand that is a clone of `other`.
+ ASMJIT_INLINE_CONSTEXPR BaseMem(const BaseMem& other) noexcept
+ : Operand(other) {}
+
+ //! Creates a `BaseMem` operand from `base_reg` and `offset`.
+ //!
+ //! \note This is an architecture independent constructor that can be used to create an architecture
+ //! independent memory operand to be used in portable code that can handle multiple architectures.
+ ASMJIT_INLINE_CONSTEXPR explicit BaseMem(const Reg& base_reg, int32_t offset = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::from_op_type(OperandType::kMem) | Signature::from_mem_base_type(base_reg.reg_type()),
+ base_reg.id(),
+ 0,
+ uint32_t(offset)) {}
+
+ //! \cond INTERNAL
+ //! Creates a `BaseMem` operand from 4 integers as used by `Operand_` struct.
+ ASMJIT_INLINE_CONSTEXPR BaseMem(const OperandSignature& u0, uint32_t base_id, uint32_t index_id, int32_t offset) noexcept
+ : Operand(Globals::Init, u0, base_id, index_id, uint32_t(offset)) {}
+ //! \endcond
+
+ //! Creates a completely uninitialized `BaseMem` operand.
+ ASMJIT_INLINE_NODEBUG explicit BaseMem(Globals::NoInit_) noexcept
+ : Operand(Globals::NoInit) {}
+
+ //! Resets the memory operand - after the reset the memory points to [0].
+ ASMJIT_INLINE_CONSTEXPR void reset() noexcept {
+ _signature = Signature::from_op_type(OperandType::kMem);
+ _base_id = 0;
+ _data[0] = 0;
+ _data[1] = 0;
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR BaseMem& operator=(const BaseMem& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Clones the memory operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR BaseMem clone() const noexcept { return BaseMem(*this); }
+
+ //! Creates a new copy of this memory operand adjusted by `off`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR BaseMem clone_adjusted(int64_t off) const noexcept {
+ BaseMem result(*this);
+ result.add_offset(off);
+ return result;
+ }
+
+ //! Tests whether this memory operand is a register home (only used by \ref asmjit_compiler)
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_reg_home() const noexcept { return _signature.has_field<Signature::kMemRegHomeFlag>(); }
+
+ //! Mark this memory operand as register home (only used by \ref asmjit_compiler).
+ ASMJIT_INLINE_CONSTEXPR void set_reg_home() noexcept { _signature |= Signature::kMemRegHomeFlag; }
+
+ //! Marks this operand to not be a register home (only used by \ref asmjit_compiler).
+ ASMJIT_INLINE_CONSTEXPR void clear_reg_home() noexcept { _signature &= ~Signature::kMemRegHomeFlag; }
+
+ //! Tests whether the memory operand has a BASE register or label specified.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base() const noexcept {
+ return (_signature & Signature::kMemBaseTypeMask) != 0;
+ }
+
+ //! Tests whether the memory operand has an INDEX register specified.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_index() const noexcept {
+ return (_signature & Signature::kMemIndexTypeMask) != 0;
+ }
+
+ //! Tests whether the memory operand has BASE or INDEX register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_or_index() const noexcept {
+ return (_signature & Signature::kMemBaseIndexMask) != 0;
+ }
+
+ //! Tests whether the memory operand has BASE and INDEX register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_and_index() const noexcept {
+ return (_signature & Signature::kMemBaseTypeMask) != 0 && (_signature & Signature::kMemIndexTypeMask) != 0;
+ }
+
+ //! Tests whether the BASE operand is a label.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_label() const noexcept {
+ return _signature.subset(Signature::kMemBaseTypeMask) == Signature::from_mem_base_type(RegType::kLabelTag);
+ }
+
+ //! Tests whether the BASE operand is a register (registers start after `RegType::kLabelTag`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_base_reg() const noexcept {
+ return _signature.subset(Signature::kMemBaseTypeMask).bits() > Signature::from_mem_base_type(RegType::kLabelTag).bits();
+ }
+
+ //! Tests whether the INDEX operand is a register (registers start after `RegType::kLabelTag`).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_index_reg() const noexcept {
+ return _signature.subset(Signature::kMemIndexTypeMask).bits() > Signature::from_mem_index_type(RegType::kLabelTag).bits();
+ }
+
+ //! Returns the type of the BASE register (0 if this memory operand doesn't use the BASE register).
+ //!
+ //! \note If the returned type is one (a value never associated to a register type) the BASE is not register, but it
+ //! is a label. One equals to `kLabelTag`. You should always check `has_base_label()` before using `base_id()` result.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType base_type() const noexcept { return _signature.mem_base_type(); }
+
+ //! Returns the type of an INDEX register (0 if this memory operand doesn't
+ //! use the INDEX register).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR RegType index_type() const noexcept { return _signature.mem_index_type(); }
+
+ //! This is used internally for BASE+INDEX validation.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t base_and_index_types() const noexcept { return _signature.get_field<Signature::kMemBaseIndexMask>(); }
+
+ //! Returns both BASE (4:0 bits) and INDEX (9:5 bits) types combined into a single value.
+ //!
+ //! \remarks Returns id of the BASE register or label (if the BASE was specified as label).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t base_id() const noexcept { return _base_id; }
+
+ //! Returns the id of the INDEX register.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t index_id() const noexcept { return _data[kDataMemIndexId]; }
+
+ //! Sets the id of the BASE register (without modifying its type).
+ ASMJIT_INLINE_CONSTEXPR void set_base_id(uint32_t id) noexcept { _base_id = id; }
+
+ //! Sets the register type of the BASE register (without modifying its id).
+ ASMJIT_INLINE_CONSTEXPR void set_base_type(RegType reg_type) noexcept { _signature.set_mem_base_type(reg_type); }
+
+ //! Sets the id of the INDEX register (without modifying its type).
+ ASMJIT_INLINE_CONSTEXPR void set_index_id(uint32_t id) noexcept { _data[kDataMemIndexId] = id; }
+
+ //! Sets the register type of the INDEX register (without modifying its id).
+ ASMJIT_INLINE_CONSTEXPR void set_index_type(RegType reg_type) noexcept { _signature.set_mem_index_type(reg_type); }
+
+ //! Sets the base register to type and id of the given `base` operand.
+ ASMJIT_INLINE_CONSTEXPR void set_base(const Reg& base) noexcept { return _set_base(base.reg_type(), base.id()); }
+
+ //! Sets the index register to type and id of the given `index` operand.
+ ASMJIT_INLINE_CONSTEXPR void set_index(const Reg& index) noexcept { return _set_index(index.reg_type(), index.id()); }
+
+ //! \cond INTERNAL
+ ASMJIT_INLINE_CONSTEXPR void _set_base(RegType type, uint32_t id) noexcept {
+ _signature.set_field<Signature::kMemBaseTypeMask>(uint32_t(type));
+ _base_id = id;
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void _set_index(RegType type, uint32_t id) noexcept {
+ _signature.set_field<Signature::kMemIndexTypeMask>(uint32_t(type));
+ _data[kDataMemIndexId] = id;
+ }
+ //! \endcond
+
+ //! Resets the memory operand's BASE register or label.
+ ASMJIT_INLINE_CONSTEXPR void reset_base() noexcept { _set_base(RegType::kNone, 0); }
+ //! Resets the memory operand's INDEX register.
+ ASMJIT_INLINE_CONSTEXPR void reset_index() noexcept { _set_index(RegType::kNone, 0); }
+
+ //! Tests whether the memory operand has a 64-bit offset or absolute address.
+ //!
+ //! If this is true then `has_base()` must always report false.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_offset_64bit() const noexcept { return base_type() == RegType::kNone; }
+
+ //! Tests whether the memory operand has a non-zero offset or absolute address.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_offset() const noexcept {
+ return (_data[kDataMemOffsetLo] | uint32_t(_base_id & Support::bool_as_mask<uint32_t>(is_offset_64bit()))) != 0;
+ }
+
+ //! Returns either relative offset or absolute address as 64-bit integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR int64_t offset() const noexcept {
+ return is_offset_64bit() ? int64_t(uint64_t(_data[kDataMemOffsetLo]) | (uint64_t(_base_id) << 32))
+ : int64_t(int32_t(_data[kDataMemOffsetLo])); // Sign extend 32-bit offset.
+ }
+
+ //! Returns a 32-bit low part of a 64-bit offset or absolute address.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR int32_t offset_lo32() const noexcept { return int32_t(_data[kDataMemOffsetLo]); }
+
+ //! Returns a 32-bit high part of a 64-bit offset or absolute address.
+ //!
+ //! \note This function is UNSAFE and returns garbage if `is_offset_64bit()`
+ //! returns false. Never use it blindly without checking it first.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR int32_t offset_hi32() const noexcept { return int32_t(_base_id); }
+
+ //! Sets a 64-bit offset or an absolute address to `offset`.
+ //!
+ //! \note This functions attempts to set both high and low parts of a 64-bit offset, however, if the operand has
+ //! a BASE register it will store only the low 32 bits of the offset / address as there is no way to store both
+ //! BASE and 64-bit offset, and there is currently no architecture that has such capability targeted by AsmJit.
+ ASMJIT_INLINE_CONSTEXPR void set_offset(int64_t offset) noexcept {
+ uint32_t lo = uint32_t(uint64_t(offset) & 0xFFFFFFFFu);
+ uint32_t hi = uint32_t(uint64_t(offset) >> 32);
+ uint32_t hi_msk = Support::bool_as_mask<uint32_t>(is_offset_64bit());
+
+ _data[kDataMemOffsetLo] = lo;
+ _base_id = (hi & hi_msk) | (_base_id & ~hi_msk);
+ }
+
+ //! Sets a low 32-bit offset to `offset` (don't use without knowing how BaseMem works).
+ ASMJIT_INLINE_CONSTEXPR void set_offset_lo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] = uint32_t(offset); }
+
+ //! Adjusts the memory operand offset by a `offset`.
+ ASMJIT_INLINE_CONSTEXPR void add_offset(int64_t offset) noexcept {
+ if (is_offset_64bit()) {
+ int64_t result = offset + int64_t(uint64_t(_data[kDataMemOffsetLo]) | (uint64_t(_base_id) << 32));
+ _data[kDataMemOffsetLo] = uint32_t(uint64_t(result) & 0xFFFFFFFFu);
+ _base_id = uint32_t(uint64_t(result) >> 32);
+ }
+ else {
+ _data[kDataMemOffsetLo] += uint32_t(uint64_t(offset) & 0xFFFFFFFFu);
+ }
+ }
+
+ //! Adds `offset` to a low 32-bit offset part (don't use without knowing how BaseMem works).
+ //!
+ //! \note This is a fast function that doesn't use the high 32-bits of a 64-bit offset. Use it only if you know that
+ //! there is a BASE register and the offset is only 32 bits anyway.
+ ASMJIT_INLINE_CONSTEXPR void add_offset_lo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] += uint32_t(offset); }
+
+ //! Resets the memory offset to zero.
+ ASMJIT_INLINE_CONSTEXPR void reset_offset() noexcept { set_offset(0); }
+
+ //! Resets the lo part of the memory offset to zero (don't use without knowing how BaseMem works).
+ ASMJIT_INLINE_CONSTEXPR void reset_offset_lo32() noexcept { set_offset_lo32(0); }
+
+ //! \}
+};
+
+//! Type of the an immediate value.
+enum class ImmType : uint32_t {
+ //! Immediate is integer.
+ kInt = 0,
+ //! Immediate is a floating point stored as double-precision.
+ kDouble = 1
+};
+
+namespace ImmUtils {
+
+template<typename T>
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG int64_t imm_value_from_t(const T& x) noexcept {
+ if constexpr (std::is_floating_point_v<T>) {
+ return int64_t(Support::bit_cast<uint64_t>(double(x)));
+ }
+ else {
+ return int64_t(x);
+ }
+}
+
+template<typename T>
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG T imm_value_to_t(int64_t x) noexcept {
+ if constexpr (std::is_floating_point_v<T>) {
+ return T(Support::bit_cast<double>(x));
+ }
+ else {
+ return T(uint64_t(x) & Support::bit_ones<std::make_unsigned_t<T>>);
+ }
+}
+
+} // {ImmUtils}
+
+//! Immediate operands are encoded with instruction data.
+class Imm : public Operand {
+public:
+ //! \cond INTERNAL
+ template<typename T>
+ struct IsConstexprConstructibleAsImmType
+ : public std::integral_constant<bool, std::is_enum_v<T> || std::is_pointer_v<T> || std::is_integral_v<T> || std::is_function_v<T>> {};
+
+ template<typename T>
+ struct IsConvertibleToImmType
+ : public std::integral_constant<bool, IsConstexprConstructibleAsImmType<T>::value || std::is_floating_point_v<T>> {};
+ //! \endcond
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new immediate value (initial value is 0).
+ ASMJIT_INLINE_CONSTEXPR Imm() noexcept
+ : Operand(Globals::Init, Signature::from_op_type(OperandType::kImm), 0, 0, 0) {}
+
+ //! Creates a new immediate value from `other`.
+ ASMJIT_INLINE_CONSTEXPR Imm(const Imm& other) noexcept
+ : Operand(other) {}
+
+ //! Creates a new immediate value from ARM/AArch64 specific `shift`.
+ ASMJIT_INLINE_CONSTEXPR Imm(const arm::Shift& shift) noexcept
+ : Operand(Globals::Init,
+ Signature::from_op_type(OperandType::kImm) | Signature::from_predicate(uint32_t(shift.op())),
+ 0,
+ Support::unpack_u32_at_0(shift.value()),
+ Support::unpack_u32_at_1(shift.value())) {}
+
+ //! Creates a new signed immediate value, assigning the value to `val` and an architecture-specific predicate
+ //! to `predicate`.
+ //!
+ //! \note Predicate is currently only used by ARM architectures.
+ template<typename T, typename = typename std::enable_if<IsConstexprConstructibleAsImmType<std::decay_t<T>>::value>::type>
+ ASMJIT_INLINE_CONSTEXPR Imm(const T& val, const uint32_t predicate = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::from_op_type(OperandType::kImm) | Signature::from_predicate(predicate),
+ 0,
+ Support::unpack_u32_at_0(int64_t(val)),
+ Support::unpack_u32_at_1(int64_t(val))) {}
+
+ ASMJIT_INLINE_NODEBUG Imm(const float& val, const uint32_t predicate = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::from_op_type(OperandType::kImm) | Signature::from_predicate(predicate),
+ 0,
+ 0,
+ 0) { set_value(val); }
+
+ ASMJIT_INLINE_NODEBUG Imm(const double& val, const uint32_t predicate = 0) noexcept
+ : Operand(Globals::Init,
+ Signature::from_op_type(OperandType::kImm) | Signature::from_predicate(predicate),
+ 0,
+ 0,
+ 0) { set_value(val); }
+
+ ASMJIT_INLINE_NODEBUG explicit Imm(Globals::NoInit_) noexcept
+ : Operand(Globals::NoInit) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Assigns the value of the `other` operand to this immediate.
+ ASMJIT_INLINE_CONSTEXPR Imm& operator=(const Imm& other) noexcept {
+ copy_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns immediate type.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR ImmType type() const noexcept { return (ImmType)_signature.get_field<Signature::kImmTypeMask>(); }
+
+ //! Sets the immediate type to `type`.
+ ASMJIT_INLINE_CONSTEXPR void set_type(ImmType type) noexcept { _signature.set_field<Signature::kImmTypeMask>(uint32_t(type)); }
+
+ //! Resets immediate type to \ref ImmType::kInt.
+ ASMJIT_INLINE_CONSTEXPR void reset_type() noexcept { set_type(ImmType::kInt); }
+
+ //! Returns operation predicate of the immediate.
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the immediate.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t predicate() const noexcept { return _signature.get_field<Signature::kPredicateMask>(); }
+
+ //! Sets operation predicate of the immediate to `predicate`.
+ //!
+ //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
+ //! of the immediate.
+ ASMJIT_INLINE_CONSTEXPR void set_predicate(uint32_t predicate) noexcept { _signature.set_field<Signature::kPredicateMask>(predicate); }
+
+ //! Resets the shift operation type of the immediate to the default value (no operation).
+ ASMJIT_INLINE_CONSTEXPR void reset_predicate() noexcept { _signature.set_field<Signature::kPredicateMask>(0); }
+
+ //! Returns the immediate value as `int64_t`, which is the internal format Imm uses.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR int64_t value() const noexcept {
+ return int64_t((uint64_t(_data[kDataImmValueHi]) << 32) | _data[kDataImmValueLo]);
+ }
+
+ //! Tests whether this immediate value is integer of any size.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_int() const noexcept { return type() == ImmType::kInt; }
+
+ //! Tests whether this immediate value is a double precision floating point value.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_double() const noexcept { return type() == ImmType::kDouble; }
+
+ //! Tests whether the immediate can be casted to 8-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_int8() const noexcept { return type() == ImmType::kInt && Support::is_int_n<8>(value()); }
+
+ //! Tests whether the immediate can be casted to 8-bit unsigned integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_uint8() const noexcept { return type() == ImmType::kInt && Support::is_uint_n<8>(value()); }
+
+ //! Tests whether the immediate can be casted to 16-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_int16() const noexcept { return type() == ImmType::kInt && Support::is_int_n<16>(value()); }
+
+ //! Tests whether the immediate can be casted to 16-bit unsigned integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_uint16() const noexcept { return type() == ImmType::kInt && Support::is_uint_n<16>(value()); }
+
+ //! Tests whether the immediate can be casted to 32-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_int32() const noexcept { return type() == ImmType::kInt && Support::is_int_n<32>(value()); }
+
+ //! Tests whether the immediate can be casted to 32-bit unsigned integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_uint32() const noexcept { return type() == ImmType::kInt && _data[kDataImmValueHi] == 0; }
+
+ //! Returns the immediate value casted to `T`.
+ //!
+ //! The value is masked before it's casted to `T` so the returned value is simply the representation of `T`
+ //! considering the original value's lowest bits.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T value_as() const noexcept { return ImmUtils::imm_value_to_t<T>(value()); }
+
+ //! Returns low 32-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR int32_t int_lo32() const noexcept { return int32_t(_data[kDataImmValueLo]); }
+
+ //! Returns high 32-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR int32_t int_hi32() const noexcept { return int32_t(_data[kDataImmValueHi]); }
+
+ //! Returns low 32-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t uint_lo32() const noexcept { return _data[kDataImmValueLo]; }
+
+ //! Returns high 32-bit signed integer.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t uint_hi32() const noexcept { return _data[kDataImmValueHi]; }
+
+ //! Sets immediate value to `val`, the value is casted to a signed 64-bit integer.
+ template<typename T>
+ ASMJIT_INLINE_NODEBUG void set_value(const T& val) noexcept {
+ _set_value_internal(ImmUtils::imm_value_from_t(val),
+ std::is_floating_point_v<T> ? ImmType::kDouble : ImmType::kInt);
+ }
+
+ ASMJIT_INLINE_CONSTEXPR void _set_value_internal(int64_t val, ImmType type) noexcept {
+ set_type(type);
+ _data[kDataImmValueHi] = uint32_t(uint64_t(val) >> 32);
+ _data[kDataImmValueLo] = uint32_t(uint64_t(val) & 0xFFFFFFFFu);
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Clones the immediate operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Imm clone() const noexcept { return Imm(*this); }
+
+ //! Sign extend the integer immediate value from 8-bit signed integer to 64 bits.
+ ASMJIT_INLINE_NODEBUG void sign_extend_int8() noexcept { set_value(int64_t(value_as<int8_t>())); }
+ //! Sign extend the integer immediate value from 16-bit signed integer to 64 bits.
+ ASMJIT_INLINE_NODEBUG void sign_extend_int16() noexcept { set_value(int64_t(value_as<int16_t>())); }
+ //! Sign extend the integer immediate value from 32-bit signed integer to 64 bits.
+ ASMJIT_INLINE_NODEBUG void sign_extend_int32() noexcept { set_value(int64_t(value_as<int32_t>())); }
+
+ //! Zero extend the integer immediate value from 8-bit unsigned integer to 64 bits.
+ ASMJIT_INLINE_NODEBUG void zero_extend_uint8() noexcept { set_value(value_as<uint8_t>()); }
+ //! Zero extend the integer immediate value from 16-bit unsigned integer to 64 bits.
+ ASMJIT_INLINE_NODEBUG void zero_extend_uint16() noexcept { set_value(value_as<uint16_t>()); }
+ //! Zero extend the integer immediate value from 32-bit unsigned integer to 64 bits.
+ ASMJIT_INLINE_NODEBUG void zero_extend_uint32() noexcept { _data[kDataImmValueHi] = 0u; }
+
+ //! \}
+};
+
+//! Creates a new immediate operand.
+template<typename T>
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Imm imm(const T& val) noexcept { return Imm(val); }
+
+//! \}
+
+namespace Globals {
+ //! \ingroup asmjit_assembler
+ //!
+ //! A default-constructed operand of `Operand_::kOpNone` type.
+ static constexpr const Operand none;
+}
+
+//! \cond INTERNAL
+namespace Support {
+
+template<typename T, bool kIsImm>
+struct ForwardOpImpl {
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG const T& forward(const T& value) noexcept { return value; }
+};
+
+template<typename T>
+struct ForwardOpImpl<T, true> {
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG Imm forward(const T& value) noexcept { return Imm(value); }
+};
+
+//! Either forwards operand T or returns a new operand that wraps it if T is a type convertible to operand.
+//! At the moment this is only used to convert integers, floats, and enumerations to \ref Imm operands.
+template<typename T>
+struct ForwardOp : public ForwardOpImpl<T, Imm::IsConvertibleToImmType<std::decay_t<T>>::value> {};
+
+} // {Support}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/osutils.cpp b/3rdparty/asmjit/asmjit/core/osutils.cpp
new file mode 100644
index 00000000000..68b5891710a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/osutils.cpp
@@ -0,0 +1,41 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/osutils_p.h>
+#include <asmjit/support/support.h>
+
+#if !defined(_WIN32)
+ #include <fcntl.h>
+ #include <unistd.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+#if !defined(_WIN32)
+Error OSUtils::read_file(const char* name, String& dst, size_t max_size) noexcept {
+ char* buffer = dst.prepare(String::ModifyOp::kAssign, max_size);
+ if (ASMJIT_UNLIKELY(!buffer)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ int fd = ASMJIT_FILE64_API(::open)(name, O_RDONLY);
+ if (fd < 0) {
+ dst.clear();
+ return make_error(Error::kFailedToOpenFile);
+ }
+
+ intptr_t len = ::read(fd, buffer, max_size);
+ if (len >= 0) {
+ buffer[len] = '\0';
+ dst._set_size(size_t(len));
+ }
+
+ ::close(fd);
+ return Error::kOk;
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/osutils.h b/3rdparty/asmjit/asmjit/core/osutils.h
index c6588373425..304e6c2152a 100644
--- a/3rdparty/asmjit/src/asmjit/core/osutils.h
+++ b/3rdparty/asmjit/asmjit/core/osutils.h
@@ -1,12 +1,12 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_OSUTILS_H_INCLUDED
#define ASMJIT_CORE_OSUTILS_H_INCLUDED
-#include "../core/globals.h"
+#include <asmjit/core/globals.h>
ASMJIT_BEGIN_NAMESPACE
@@ -35,7 +35,7 @@ public:
Handle _handle;
#pragma pack(pop)
#elif !defined(__EMSCRIPTEN__)
- typedef pthread_mutex_t Handle;
+ using Handle = pthread_mutex_t;
Handle _handle;
#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/osutils_p.h b/3rdparty/asmjit/asmjit/core/osutils_p.h
index 0d9d36909e8..3501b7a0610 100644
--- a/3rdparty/asmjit/src/asmjit/core/osutils_p.h
+++ b/3rdparty/asmjit/asmjit/core/osutils_p.h
@@ -1,13 +1,13 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_OSUTILS_P_H_INCLUDED
#define ASMJIT_CORE_OSUTILS_P_H_INCLUDED
-#include "../core/osutils.h"
-#include "../core/string.h"
+#include <asmjit/core/osutils.h>
+#include <asmjit/core/string.h>
ASMJIT_BEGIN_NAMESPACE
@@ -64,7 +64,7 @@ public:
namespace OSUtils {
//! Reads a file, only used on non-Windows platforms to access /sys or other files when necessary.
-Error readFile(const char* name, String& dst, size_t maxSize) noexcept;
+Error read_file(const char* name, String& dst, size_t max_size) noexcept;
} // {OSUtils}
#endif
diff --git a/3rdparty/asmjit/asmjit/core/raassignment_p.h b/3rdparty/asmjit/asmjit/core/raassignment_p.h
new file mode 100644
index 00000000000..04e330dfa8d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/raassignment_p.h
@@ -0,0 +1,495 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
+#define ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/radefs_p.h>
+#include <asmjit/core/rareg_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Holds the current register assignment.
+//!
+//! Has two purposes:
+//!
+//! 1. Holds register assignment of a local register allocator (see \ref RALocalAllocator).
+//! 2. Holds register assignment of the entry of basic blocks (see \ref RABlock).
+class RAAssignment {
+public:
+ ASMJIT_NONCOPYABLE(RAAssignment)
+
+ static inline constexpr uint32_t kPhysNone = 0xFF;
+
+ enum DirtyBit : uint32_t {
+ kClean = 0,
+ kDirty = 1
+ };
+
+ struct Layout {
+ //! Index of architecture registers per group.
+ RARegIndex phys_index;
+ //! Count of architecture registers per group.
+ RARegCount phys_count;
+ //! Count of physical registers of all groups.
+ uint32_t phys_total;
+ //! Count of work registers.
+ uint32_t work_count;
+ //! WorkRegs data (vector).
+ const ArenaVector<RAWorkReg*>* work_regs;
+
+ inline void reset() noexcept {
+ phys_index.reset();
+ phys_count.reset();
+ phys_total = 0;
+ work_count = 0;
+ work_regs = nullptr;
+ }
+ };
+
+ struct PhysToWorkMap {
+ //! Assigned registers (each bit represents one physical reg).
+ RARegMask assigned;
+ //! Dirty registers (spill slot out of sync or no spill slot).
+ RARegMask dirty;
+ //! PhysReg to WorkReg mapping.
+ RAWorkId work_ids[1 /* ... */];
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG size_t size_of(size_t count) noexcept {
+ return Arena::aligned_size(sizeof(PhysToWorkMap) - sizeof(uint32_t) + count * sizeof(uint32_t));
+ }
+
+ ASMJIT_INLINE void reset(size_t count) noexcept {
+ assigned.reset();
+ dirty.reset();
+
+ for (size_t i = 0; i < count; i++) {
+ work_ids[i] = kBadWorkId;
+ }
+ }
+
+ ASMJIT_INLINE void copy_from(const PhysToWorkMap* other, size_t count) noexcept {
+ size_t size = size_of(count);
+ memcpy(this, other, size);
+ }
+
+ ASMJIT_INLINE void unassign(RegGroup group, uint32_t phys_id, uint32_t index_in_work_ids) noexcept {
+ assigned.clear(group, Support::bit_mask<RegMask>(phys_id));
+ dirty.clear(group, Support::bit_mask<RegMask>(phys_id));
+ work_ids[index_in_work_ids] = kBadWorkId;
+ }
+ };
+
+ struct WorkToPhysMap {
+ //! WorkReg to PhysReg mapping
+ uint8_t phys_ids[1 /* ... */];
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG size_t size_of(size_t count) noexcept {
+ return Arena::aligned_size(size_t(count) * sizeof(uint8_t));
+ }
+
+ ASMJIT_INLINE void reset(size_t count) noexcept {
+ for (size_t i = 0; i < count; i++) {
+ phys_ids[i] = kPhysNone;
+ }
+ }
+
+ ASMJIT_INLINE void copy_from(const WorkToPhysMap* other, size_t count) noexcept {
+ size_t size = size_of(count);
+ if (ASMJIT_LIKELY(size)) {
+ memcpy(this, other, size);
+ }
+ }
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Physical registers layout.
+ Layout _layout;
+ //! WorkReg to PhysReg mapping.
+ WorkToPhysMap* _work_to_phys_map;
+ //! PhysReg to WorkReg mapping and assigned/dirty bits.
+ PhysToWorkMap* _phys_to_work_map;
+ //! Optimization to translate PhysRegs to WorkRegs faster.
+ Support::Array<RAWorkId*, Globals::kNumVirtGroups> _phys_to_work_ids;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline RAAssignment() noexcept {
+ _layout.reset();
+ reset_maps();
+ }
+
+ ASMJIT_INLINE void init_layout(const RARegCount& phys_count, const ArenaVector<RAWorkReg*>& work_regs) noexcept {
+ // Layout must be initialized before data.
+ ASMJIT_ASSERT(_phys_to_work_map == nullptr);
+ ASMJIT_ASSERT(_work_to_phys_map == nullptr);
+
+ _layout.phys_index.build_indexes(phys_count);
+ _layout.phys_count = phys_count;
+ _layout.phys_total = _layout.phys_index.get(RegGroup::kMaxVirt) + _layout.phys_count.get(RegGroup::kMaxVirt);
+ _layout.work_count = uint32_t(work_regs.size());
+ _layout.work_regs = &work_regs;
+ }
+
+ ASMJIT_INLINE void init_maps(PhysToWorkMap* phys_to_work_map, WorkToPhysMap* work_to_phys_map) noexcept {
+ _phys_to_work_map = phys_to_work_map;
+ _work_to_phys_map = work_to_phys_map;
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ _phys_to_work_ids[group] = phys_to_work_map->work_ids + _layout.phys_index.get(group);
+ }
+ }
+
+ ASMJIT_INLINE void reset_maps() noexcept {
+ _phys_to_work_map = nullptr;
+ _work_to_phys_map = nullptr;
+ _phys_to_work_ids.fill(nullptr);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG PhysToWorkMap* phys_to_work_map() const noexcept { return _phys_to_work_map; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG WorkToPhysMap* work_to_phys_map() const noexcept { return _work_to_phys_map; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RARegMask& assigned() noexcept { return _phys_to_work_map->assigned; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RARegMask& assigned() const noexcept { return _phys_to_work_map->assigned; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t assigned(RegGroup group) const noexcept { return _phys_to_work_map->assigned[group]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RARegMask& dirty() noexcept { return _phys_to_work_map->dirty; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RARegMask& dirty() const noexcept { return _phys_to_work_map->dirty; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask dirty(RegGroup group) const noexcept { return _phys_to_work_map->dirty[group]; }
+
+ [[nodiscard]]
+ inline uint32_t work_to_phys_id(RegGroup group, RAWorkId work_id) const noexcept {
+ Support::maybe_unused(group);
+ ASMJIT_ASSERT(work_id != kBadWorkId);
+ ASMJIT_ASSERT(uint32_t(work_id) < _layout.work_count);
+ return _work_to_phys_map->phys_ids[uint32_t(work_id)];
+ }
+
+ [[nodiscard]]
+ inline RAWorkId phys_to_work_id(RegGroup group, uint32_t phys_id) const noexcept {
+ ASMJIT_ASSERT(phys_id < Globals::kMaxPhysRegs);
+ return _phys_to_work_ids[group][phys_id];
+ }
+
+ [[nodiscard]]
+ inline bool is_phys_assigned(RegGroup group, uint32_t phys_id) const noexcept {
+ ASMJIT_ASSERT(phys_id < Globals::kMaxPhysRegs);
+ return Support::bit_test(_phys_to_work_map->assigned[group], phys_id);
+ }
+
+ [[nodiscard]]
+ inline bool is_phys_dirty(RegGroup group, uint32_t phys_id) const noexcept {
+ ASMJIT_ASSERT(phys_id < Globals::kMaxPhysRegs);
+ return Support::bit_test(_phys_to_work_map->dirty[group], phys_id);
+ }
+
+ //! \}
+
+ //! \name Assignment
+ //!
+ //! These are low-level allocation helpers that are used to update the current mappings between physical and
+ //! virt/work registers and also to update masks that represent allocated and dirty registers. These functions
+ //! don't emit any code; they are only used to update and keep all mappings in sync.
+ //!
+ //! \{
+
+ //! Assign [VirtReg/WorkReg] to a physical register.
+ inline void assign(RegGroup group, RAWorkId work_id, uint32_t phys_id, bool dirty) noexcept {
+ ASMJIT_ASSERT(work_to_phys_id(group, work_id) == kPhysNone);
+ ASMJIT_ASSERT(phys_to_work_id(group, phys_id) == kBadWorkId);
+ ASMJIT_ASSERT(!is_phys_assigned(group, phys_id));
+ ASMJIT_ASSERT(!is_phys_dirty(group, phys_id));
+
+ _work_to_phys_map->phys_ids[uint32_t(work_id)] = uint8_t(phys_id);
+ _phys_to_work_ids[group][phys_id] = work_id;
+
+ RegMask reg_mask = Support::bit_mask<RegMask>(phys_id);
+ _phys_to_work_map->assigned[group] |= reg_mask;
+ _phys_to_work_map->dirty[group] |= reg_mask & Support::bool_as_mask<RegMask>(dirty);
+
+ verify();
+ }
+
+ //! Reassign [VirtReg/WorkReg] to `dst_phys_id` from `src_phys_id`.
+ inline void reassign(RegGroup group, RAWorkId work_id, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept {
+ ASMJIT_ASSERT(dst_phys_id != src_phys_id);
+ ASMJIT_ASSERT(work_to_phys_id(group, work_id) == src_phys_id);
+ ASMJIT_ASSERT(phys_to_work_id(group, src_phys_id) == work_id);
+ ASMJIT_ASSERT(is_phys_assigned(group, src_phys_id) == true);
+ ASMJIT_ASSERT(is_phys_assigned(group, dst_phys_id) == false);
+
+ _work_to_phys_map->phys_ids[uint32_t(work_id)] = uint8_t(dst_phys_id);
+ _phys_to_work_ids[group][src_phys_id] = kBadWorkId;
+ _phys_to_work_ids[group][dst_phys_id] = work_id;
+
+ RegMask src_mask = Support::bit_mask<RegMask>(src_phys_id);
+ RegMask dst_mask = Support::bit_mask<RegMask>(dst_phys_id);
+
+ bool dirty = (_phys_to_work_map->dirty[group] & src_mask) != 0;
+ RegMask reg_mask = dst_mask | src_mask;
+
+ _phys_to_work_map->assigned[group] ^= reg_mask;
+ _phys_to_work_map->dirty[group] ^= reg_mask & Support::bool_as_mask<RegMask>(dirty);
+
+ verify();
+ }
+
+ inline void swap(RegGroup group, RAWorkId a_work_id, uint32_t a_phys_id, RAWorkId b_work_id, uint32_t b_phys_id) noexcept {
+ ASMJIT_ASSERT(a_phys_id != b_phys_id);
+
+ ASMJIT_ASSERT(work_to_phys_id(group, a_work_id) == a_phys_id);
+ ASMJIT_ASSERT(work_to_phys_id(group, b_work_id) == b_phys_id);
+ ASMJIT_ASSERT(phys_to_work_id(group, a_phys_id) == a_work_id);
+ ASMJIT_ASSERT(phys_to_work_id(group, b_phys_id) == b_work_id);
+
+ ASMJIT_ASSERT(is_phys_assigned(group, a_phys_id));
+ ASMJIT_ASSERT(is_phys_assigned(group, b_phys_id));
+
+ _work_to_phys_map->phys_ids[uint32_t(a_work_id)] = uint8_t(b_phys_id);
+ _work_to_phys_map->phys_ids[uint32_t(b_work_id)] = uint8_t(a_phys_id);
+ _phys_to_work_ids[group][a_phys_id] = b_work_id;
+ _phys_to_work_ids[group][b_phys_id] = a_work_id;
+
+ RegMask a_mask = Support::bit_mask<RegMask>(a_phys_id);
+ RegMask b_mask = Support::bit_mask<RegMask>(b_phys_id);
+ RegMask flip_mask = Support::bool_as_mask<RegMask>(((_phys_to_work_map->dirty[group] & a_mask) != 0) ^ ((_phys_to_work_map->dirty[group] & b_mask) != 0));
+ RegMask reg_mask = a_mask | b_mask;
+ _phys_to_work_map->dirty[group] ^= reg_mask & flip_mask;
+
+ verify();
+ }
+
+ //! Unassign [VirtReg/WorkReg] from a physical register.
+ inline void unassign(RegGroup group, RAWorkId work_id, uint32_t phys_id) noexcept {
+ ASMJIT_ASSERT(phys_id < Globals::kMaxPhysRegs);
+ ASMJIT_ASSERT(work_to_phys_id(group, work_id) == phys_id);
+ ASMJIT_ASSERT(phys_to_work_id(group, phys_id) == work_id);
+ ASMJIT_ASSERT(is_phys_assigned(group, phys_id));
+
+ _work_to_phys_map->phys_ids[uint32_t(work_id)] = kPhysNone;
+ _phys_to_work_ids[group][phys_id] = kBadWorkId;
+
+ RegMask reg_mask = Support::bit_mask<RegMask>(phys_id);
+ _phys_to_work_map->assigned[group] &= ~reg_mask;
+ _phys_to_work_map->dirty[group] &= ~reg_mask;
+
+ verify();
+ }
+
+ inline void make_clean(RegGroup group, RAWorkId work_id, uint32_t phys_id) noexcept {
+ Support::maybe_unused(work_id);
+ RegMask reg_mask = Support::bit_mask<RegMask>(phys_id);
+ _phys_to_work_map->dirty[group] &= ~reg_mask;
+ }
+
+ inline void make_dirty(RegGroup group, RAWorkId work_id, uint32_t phys_id) noexcept {
+ Support::maybe_unused(work_id);
+ RegMask reg_mask = Support::bit_mask<RegMask>(phys_id);
+ _phys_to_work_map->dirty[group] |= reg_mask;
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ ASMJIT_INLINE void swap(RAAssignment& other) noexcept {
+ std::swap(_work_to_phys_map, other._work_to_phys_map);
+ std::swap(_phys_to_work_map, other._phys_to_work_map);
+ _phys_to_work_ids.swap(other._phys_to_work_ids);
+ }
+
+ inline void assign_work_ids_from_phys_ids() noexcept {
+ memset(_work_to_phys_map, uint8_t(Reg::kIdBad), WorkToPhysMap::size_of(_layout.work_count));
+
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ uint32_t phys_base_index = _layout.phys_index.get(group);
+ Support::BitWordIterator<RegMask> it(_phys_to_work_map->assigned[group]);
+
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ RAWorkId work_id = _phys_to_work_map->work_ids[phys_base_index + phys_id];
+
+ ASMJIT_ASSERT(work_id != kBadWorkId);
+ _work_to_phys_map->phys_ids[uint32_t(work_id)] = uint8_t(phys_id);
+ }
+ }
+ }
+
+ inline void copy_from(const PhysToWorkMap* phys_to_work_map) noexcept {
+ memcpy(_phys_to_work_map, phys_to_work_map, PhysToWorkMap::size_of(_layout.phys_total));
+ assign_work_ids_from_phys_ids();
+ }
+
+ inline void copy_from(const PhysToWorkMap* phys_to_work_map, const WorkToPhysMap* work_to_phys_map) noexcept {
+ memcpy(_phys_to_work_map, phys_to_work_map, PhysToWorkMap::size_of(_layout.phys_total));
+ memcpy(_work_to_phys_map, work_to_phys_map, WorkToPhysMap::size_of(_layout.work_count));
+ }
+
+ inline void copy_from(const RAAssignment& other) noexcept {
+ copy_from(other.phys_to_work_map(), other.work_to_phys_map());
+ }
+
+ // Not really useful outside of debugging.
+ [[nodiscard]]
+ bool equals(const RAAssignment& other) const noexcept {
+ // Layout should always match.
+ if (_layout.phys_index != other._layout.phys_index ||
+ _layout.phys_count != other._layout.phys_count ||
+ _layout.phys_total != other._layout.phys_total ||
+ _layout.work_count != other._layout.work_count ||
+ _layout.work_regs != other._layout.work_regs) {
+ return false;
+ }
+
+ uint32_t phys_total = _layout.phys_total;
+ uint32_t work_count = _layout.work_count;
+
+ for (uint32_t phys_id = 0; phys_id < phys_total; phys_id++) {
+ RAWorkId this_work_id = _phys_to_work_map->work_ids[phys_id];
+ RAWorkId other_work_id = other._phys_to_work_map->work_ids[phys_id];
+ if (this_work_id != other_work_id) {
+ return false;
+ }
+ }
+
+ for (uint32_t work_id = 0; work_id < work_count; work_id++) {
+ uint32_t this_phys_id = _work_to_phys_map->phys_ids[work_id];
+ uint32_t other_phys_id = other._work_to_phys_map->phys_ids[work_id];
+
+ if (this_phys_id != other_phys_id) {
+ return false;
+ }
+ }
+
+ if (_phys_to_work_map->assigned != other._phys_to_work_map->assigned ||
+ _phys_to_work_map->dirty != other._phys_to_work_map->dirty ) {
+ return false;
+ }
+
+ return true;
+ }
+
+#if defined(ASMJIT_BUILD_DEBUG)
+ ASMJIT_NOINLINE void verify() noexcept {
+ // Verify WorkToPhysMap.
+ {
+ for (uint32_t work_id = 0; work_id < _layout.work_count; work_id++) {
+ uint32_t phys_id = _work_to_phys_map->phys_ids[work_id];
+ if (phys_id != kPhysNone) {
+ const RAWorkReg* work_reg = _layout.work_regs->at(work_id);
+ RegGroup group = work_reg->group();
+ ASMJIT_ASSERT(_phys_to_work_ids[group][phys_id] == RAWorkId(work_id));
+ }
+ }
+ }
+
+ // Verify PhysToWorkMap.
+ {
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ uint32_t phys_count = _layout.phys_count.get(group);
+ for (uint32_t phys_id = 0; phys_id < phys_count; phys_id++) {
+ RAWorkId work_id = _phys_to_work_ids[group][phys_id];
+ if (work_id != kBadWorkId) {
+ ASMJIT_ASSERT(_work_to_phys_map->phys_ids[uint32_t(work_id)] == phys_id);
+ }
+ }
+ }
+ }
+ }
+#else
+ inline void verify() noexcept {}
+#endif
+
+ //! \}
+};
+
+//! Intersection of multiple register assignments.
+//!
+//! See \ref RAAssignment for more information about register assignments.
+class RASharedAssignment {
+public:
+ //! \name Types
+ //! \{
+
+ using PhysToWorkMap = RAAssignment::PhysToWorkMap;
+ using WorkToPhysMap = RAAssignment::WorkToPhysMap;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Bit-mask of registers that cannot be used upon a block entry, for each block that has this shared assignment.
+ //! Scratch registers can come from ISA limits (like jecx/loop instructions on x86) or because the registers are
+ //! used by jump/branch instruction that uses registers to perform an indirect jump.
+ RegMask _entry_scratch_gp_regs = 0;
+ //! Union of all live-in registers.
+ ArenaBitSet _live_in {};
+ //! Register assignment (PhysToWork).
+ PhysToWorkMap* _phys_to_work_map = nullptr;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _phys_to_work_map == nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask entry_scratch_gp_regs() const noexcept { return _entry_scratch_gp_regs; }
+
+ ASMJIT_INLINE_NODEBUG void add_entry_scratch_gp_regs(RegMask mask) noexcept { _entry_scratch_gp_regs |= mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const BitWord> live_in() const noexcept { return _live_in.as_span(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG PhysToWorkMap* phys_to_work_map() const noexcept { return _phys_to_work_map; }
+
+ ASMJIT_INLINE_NODEBUG void assign_phys_to_work_map(PhysToWorkMap* phys_to_work_map) noexcept { _phys_to_work_map = phys_to_work_map; }
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/racfgblock_p.h b/3rdparty/asmjit/asmjit/core/racfgblock_p.h
new file mode 100644
index 00000000000..a66ace2180c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/racfgblock_p.h
@@ -0,0 +1,390 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RACFGBLOCK_P_H_INCLUDED
+#define ASMJIT_CORE_RACFGBLOCK_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compilerdefs.h>
+#include <asmjit/core/raassignment_p.h>
+#include <asmjit/support/arenabitset_p.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/support_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Provides a way to mark RABlock instances during processing.
+enum class RABlockTimestamp : uint64_t {};
+
+//! Flags used by \ref RABlock.
+enum class RABlockFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! Block has been constructed from nodes.
+ kIsConstructed = 0x00000001u,
+ //! Block is reachable (set by `build_cfg_views()`).
+ kIsReachable = 0x00000002u,
+ //! Block is a target (has an associated label or multiple labels).
+ kIsTargetable = 0x00000004u,
+ //! Block has been allocated.
+ kIsAllocated = 0x00000008u,
+ //! Block is a function-exit.
+ kIsFuncExit = 0x00000010u,
+
+ //! Block is enqueued in a work queue.
+ //!
+ //! This bit zero between various phases of register allocation, however, some parts can
+ //! use it to mark that a block is in a work queue, so it's not added there multiple times.
+ kIsEnqueued = 0x00000020u,
+
+ //! Block has a terminator (jump, conditional jump, ret).
+ kHasTerminator = 0x00000100u,
+ //! Block naturally flows to the next block.
+ kHasConsecutive = 0x00000200u,
+ //! Block has a jump to a jump-table at the end.
+ kHasJumpTable = 0x00000400u,
+ //! Block contains fixed registers (pre-colored).
+ kHasFixedRegs = 0x00000800u,
+ //! Block contains function calls.
+ kHasFuncCalls = 0x00001000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RABlockFlags)
+
+//! Basic block used by register allocator pass.
+class RABlock {
+public:
+ ASMJIT_NONCOPYABLE(RABlock)
+
+ //! \name Types
+ //! \{
+
+ using PhysToWorkMap = RAAssignment::PhysToWorkMap;
+ using WorkToPhysMap = RAAssignment::WorkToPhysMap;
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kLiveIn = 0;
+ static inline constexpr uint32_t kLiveOut = 1;
+ static inline constexpr uint32_t kLiveKill = 2;
+ static inline constexpr uint32_t kLiveCount = 3;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Block id (indexed from zero).
+ RABlockId _block_id = kBadBlockId;
+ //! Block flags, see `Flags`.
+ RABlockFlags _flags {};
+ //! Timestamp (64-bit) used by block visitors, which can be generated by \ref BaseRAPass::next_timestamp().
+ mutable RABlockTimestamp _timestamp {};
+
+ //! Block predecessors.
+ ArenaVector<RABlock*> _predecessors {};
+ //! Block successors.
+ ArenaVector<RABlock*> _successors {};
+ //! Immediate dominator of this block.
+ RABlock* _idom {};
+
+ //! First `BaseNode` of this block (inclusive).
+ BaseNode* _first {};
+ //! Last `BaseNode` of this block (inclusive).
+ BaseNode* _last {};
+
+ //! Initial position of this block (inclusive).
+ NodePosition _first_position {};
+ //! End position of this block (exclusive).
+ NodePosition _end_position {};
+
+ //! Post-order view order, used during POV construction.
+ uint32_t _pov_index = Globals::kInvalidId;
+ //! Shared assignment identifier or `Globals::kInvalidId` if this block doesn't have shared assignment.
+ //! See \ref RASharedAssignment for more details.
+ uint32_t _shared_assignment_id = Globals::kInvalidId;
+
+ //! Liveness in/out/kill.
+ BitWord* _live_bits {};
+ //! Number of bit-words in each live type (the size of `_live_bits` is then `3 * _live_bits_size`).
+ uint32_t _live_bits_size {};
+
+ //! Basic statistics about registers.
+ RARegsStats _regs_stats = RARegsStats();
+ //! Maximum live-count per register group.
+ RALiveCount _max_live_count = RALiveCount();
+
+ //! Scratch registers that cannot be allocated upon block entry.
+ RegMask _entry_scratch_gp_regs {};
+ //! Scratch registers used at exit, by a terminator instruction.
+ RegMask _exit_scratch_gp_regs {};
+
+ //! Register assignment on entry.
+ PhysToWorkMap* _entry_phys_to_work_map = nullptr;
+
+ //! Register allocator pass.
+ BaseRAPass* _ra = nullptr;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RABlock(BaseRAPass* ra) noexcept
+ : _ra(ra) {}
+
+ //! \}
+
+ //! \name Allocator
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arena& arena() const noexcept;
+
+ //! \}
+
+ //! \name CFG Block Identifier and Flags
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlockId block_id() const noexcept { return _block_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlockFlags flags() const noexcept { return _flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(RABlockFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ ASMJIT_INLINE_NODEBUG void add_flags(RABlockFlags flags) noexcept { _flags |= flags; }
+ ASMJIT_INLINE_NODEBUG void clear_flags(RABlockFlags flags) noexcept { _flags &= ~flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_assigned() const noexcept { return _block_id != kBadBlockId; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_constructed() const noexcept { return has_flag(RABlockFlags::kIsConstructed); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_reachable() const noexcept { return has_flag(RABlockFlags::kIsReachable); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_targetable() const noexcept { return has_flag(RABlockFlags::kIsTargetable); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_allocated() const noexcept { return has_flag(RABlockFlags::kIsAllocated); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_func_exit() const noexcept { return has_flag(RABlockFlags::kIsFuncExit); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_enqueued() const noexcept { return has_flag(RABlockFlags::kIsEnqueued); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_terminator() const noexcept { return has_flag(RABlockFlags::kHasTerminator); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_consecutive() const noexcept { return has_flag(RABlockFlags::kHasConsecutive); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_jump_table() const noexcept { return has_flag(RABlockFlags::kHasJumpTable); }
+
+ ASMJIT_INLINE_NODEBUG void make_constructed(const RARegsStats& reg_stats) noexcept {
+ _flags |= RABlockFlags::kIsConstructed;
+ _regs_stats.combine_with(reg_stats);
+ }
+
+ ASMJIT_INLINE_NODEBUG void make_reachable() noexcept { _flags |= RABlockFlags::kIsReachable; }
+ ASMJIT_INLINE_NODEBUG void make_targetable() noexcept { _flags |= RABlockFlags::kIsTargetable; }
+ ASMJIT_INLINE_NODEBUG void make_allocated() noexcept { _flags |= RABlockFlags::kIsAllocated; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RARegsStats& regs_stats() const noexcept { return _regs_stats; }
+
+ //! \}
+
+ //! \name CFG Block Nodes
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<RABlock*> predecessors() const noexcept { return _predecessors.as_span(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<RABlock*> successors() const noexcept { return _successors.as_span(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_predecessors() const noexcept { return !_predecessors.is_empty(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_successors() const noexcept { return !_successors.is_empty(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_successor(const RABlock* block) const noexcept {
+ Span<RABlock*> span = successors();
+ Span<RABlock*> pred = block->predecessors();
+
+ if (pred.size() < span.size()) {
+ span = pred;
+ block = this;
+ }
+
+ return span.contains(block);
+ }
+
+ //! Adds a successor to this block, and predecessor to `successor`, making connection on both sides.
+ //!
+ //! This API must be used to manage successors and predecessors, never manage it manually.
+ [[nodiscard]]
+ Error append_successor(RABlock* successor) noexcept;
+
+ //! Similar to `append_successor()`, but does a prepend operation instead of append.
+ //!
+ //! This function is used to add a natural flow (always first) to the block.
+ [[nodiscard]]
+ Error prepend_successor(RABlock* successor) noexcept;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlock* consecutive() const noexcept { return has_consecutive() ? _successors[0] : nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlock* idom() noexcept { return _idom; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RABlock* idom() const noexcept { return _idom; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_pov_index() const noexcept { return _pov_index != Globals::kInvalidId; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t pov_index() const noexcept { return _pov_index; }
+
+ //! \}
+
+ //! \name CFG Block Content
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* first() const noexcept { return _first; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* last() const noexcept { return _last; }
+
+ ASMJIT_INLINE_NODEBUG void set_first(BaseNode* node) noexcept { _first = node; }
+ ASMJIT_INLINE_NODEBUG void set_last(BaseNode* node) noexcept { _last = node; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodePosition first_position() const noexcept { return _first_position; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodePosition end_position() const noexcept { return _end_position; }
+
+ ASMJIT_INLINE_NODEBUG void set_first_position(NodePosition position) noexcept { _first_position = position; }
+ ASMJIT_INLINE_NODEBUG void set_end_position(NodePosition position) noexcept { _end_position = position; }
+
+ //! \}
+
+ //! \name CFG Block Timestamp
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlockTimestamp timestamp() const noexcept { return _timestamp; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_timestamp(RABlockTimestamp ts) const noexcept { return _timestamp == ts; }
+
+ ASMJIT_INLINE_NODEBUG void set_timestamp(RABlockTimestamp ts) const noexcept { _timestamp = ts; }
+
+ ASMJIT_INLINE_NODEBUG void reset_timestamp() const noexcept { _timestamp = RABlockTimestamp(0); }
+
+ //! \}
+
+ //! \name Liveness Bits
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE Error alloc_live_bits(size_t size) noexcept {
+ size_t bit_word_count = BitOps::size_in_words<BitWord>(size);
+ _live_bits = arena().alloc_oneshot_zeroed<BitWord>(Arena::aligned_size(bit_word_count * sizeof(BitWord) * kLiveCount));
+
+ if (ASMJIT_UNLIKELY(!_live_bits)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _live_bits_size = uint32_t(bit_word_count);
+ return Error::kOk;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<BitWord> live_bits(uint32_t live_type) noexcept { return Span<BitWord>(_live_bits + live_type * _live_bits_size, _live_bits_size); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const BitWord> live_bits(uint32_t live_type) const noexcept { return Span<const BitWord>(_live_bits + live_type * _live_bits_size, _live_bits_size); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<BitWord> live_in() noexcept { return live_bits(kLiveIn); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const BitWord> live_in() const noexcept { return live_bits(kLiveIn); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<BitWord> live_out() noexcept { return live_bits(kLiveOut); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const BitWord> live_out() const noexcept { return live_bits(kLiveOut); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<BitWord> kill() noexcept { return live_bits(kLiveKill); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const BitWord> kill() const noexcept { return live_bits(kLiveKill); }
+
+ //! \}
+
+ //! \name Register Assignment
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask entry_scratch_gp_regs() const noexcept;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask exit_scratch_gp_regs() const noexcept { return _exit_scratch_gp_regs; }
+
+ ASMJIT_INLINE_NODEBUG void add_entry_scratch_gp_regs(RegMask reg_mask) noexcept { _entry_scratch_gp_regs |= reg_mask; }
+ ASMJIT_INLINE_NODEBUG void add_exit_scratch_gp_regs(RegMask reg_mask) noexcept { _exit_scratch_gp_regs |= reg_mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_entry_assignment() const noexcept { return _entry_phys_to_work_map != nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG PhysToWorkMap* entry_phys_to_work_map() const noexcept { return _entry_phys_to_work_map; }
+
+ ASMJIT_INLINE_NODEBUG void set_entry_assignment(PhysToWorkMap* phys_to_work_map) noexcept { _entry_phys_to_work_map = phys_to_work_map; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_shared_assignment_id() const noexcept { return _shared_assignment_id != Globals::kInvalidId; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t shared_assignment_id() const noexcept { return _shared_assignment_id; }
+
+ ASMJIT_INLINE_NODEBUG void set_shared_assignment_id(uint32_t id) noexcept { _shared_assignment_id = id; }
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RACFGBLOCK_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/racfgbuilder_p.h b/3rdparty/asmjit/asmjit/core/racfgbuilder_p.h
new file mode 100644
index 00000000000..ab6524c7246
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/racfgbuilder_p.h
@@ -0,0 +1,653 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RACFGBUILDER_P_H_INCLUDED
+#define ASMJIT_CORE_RACFGBUILDER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/racfgblock_p.h>
+#include <asmjit/core/rainst_p.h>
+#include <asmjit/core/rapass_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+template<typename This>
+class RACFGBuilderT {
+public:
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kRootIndentation = 2;
+ static inline constexpr uint32_t kCodeIndentation = 4;
+
+ // NOTE: This is a bit hacky. There are some nodes which are processed twice (see `on_before_invoke()` and
+ // `on_before_ret()`) as they can insert some nodes around them. Since we don't have any flags to mark these
+ // we just use their position that is [at that time] unassigned.
+ static inline constexpr NodePosition kNodePositionUnassigned = NodePosition(0u);
+ static inline constexpr NodePosition kNodePositionDidOnBefore = NodePosition(0xFFFFFFFFu);
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ BaseRAPass& _pass;
+ BaseCompiler& _cc;
+ RABlock* _cur_block = nullptr;
+ RABlock* _ret_block = nullptr;
+ FuncNode* _func_node = nullptr;
+ RARegsStats _block_reg_stats {};
+ uint32_t _exit_label_id = Globals::kInvalidId;
+ ArenaVector<uint32_t> _shared_assignments_map {};
+
+ // Only used by logging, it's fine to be here to prevent more #ifdefs...
+ bool _has_code = false;
+ RABlock* _last_logged_block = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ Logger* _logger = nullptr;
+ FormatOptions _format_options {};
+ StringTmp<512> _sb;
+#endif
+
+ //! \}
+
+ inline RACFGBuilderT(BaseRAPass& pass) noexcept
+ : _pass(pass),
+ _cc(pass.cc()) {
+#ifndef ASMJIT_NO_LOGGING
+ _logger = _pass.has_diagnostic_option(DiagnosticOptions::kRADebugCFG) ? _pass.logger() : nullptr;
+ if (_logger) {
+ _format_options = _logger->options();
+ }
+#endif
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseCompiler& cc() const noexcept { return _cc; }
+
+ //! \name Run
+ //! \{
+
+ //! Called per function by an architecture-specific CFG builder.
+ [[nodiscard]]
+ Error run() noexcept {
+ log("[build_cfg_nodes]\n");
+ ASMJIT_PROPAGATE(prepare());
+
+ log_node(_func_node, kRootIndentation);
+ log_block(_cur_block, kRootIndentation);
+
+ RABlock* entry_block = _cur_block;
+ BaseNode* node = _func_node->next();
+
+ if (ASMJIT_UNLIKELY(!node)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ _cur_block->set_first(_func_node);
+ _cur_block->set_last(_func_node);
+
+ RAInstBuilder ib;
+ ArenaVector<RABlock*> blocks_with_unknown_jumps;
+
+ for (;;) {
+ BaseNode* next = node->next();
+ ASMJIT_ASSERT(node->position() == kNodePositionUnassigned || node->position() == kNodePositionDidOnBefore);
+
+ if (node->is_inst()) {
+ // Instruction | Jump | Invoke | Return
+ // ------------------------------------
+
+ // Handle `InstNode`, `InvokeNode`, and `FuncRetNode`. All of them share the same interface that provides
+ // operands that have read/write semantics.
+ if (ASMJIT_UNLIKELY(!_cur_block)) {
+ // Unreachable code has to be removed, we cannot allocate registers in such code as we cannot do proper
+ // liveness analysis in such case.
+ remove_node(node);
+ node = next;
+ continue;
+ }
+
+ _has_code = true;
+
+ if (node->is_invoke() || node->is_func_ret()) {
+ if (node->position() != kNodePositionDidOnBefore) {
+ // Call and Reg are complicated as they may insert some surrounding code around them. The simplest
+ // approach is to get the previous node, call the `on_before_xxx()` handlers and then check whether
+ // anything changed and restart if so. By restart we mean that the current `node` would go back to
+ // the first possible inserted node by `on_before_invoke()` or `on_before_ret()`.
+ BaseNode* prev = node->prev();
+
+ if (node->type() == NodeType::kInvoke) {
+ ASMJIT_PROPAGATE(static_cast<This*>(this)->on_before_invoke(node->as<InvokeNode>()));
+ }
+ else {
+ ASMJIT_PROPAGATE(static_cast<This*>(this)->on_before_ret(node->as<FuncRetNode>()));
+ }
+
+ if (prev != node->prev()) {
+ // If this was the first node in the block and something was
+ // inserted before it then we have to update the first block.
+ if (_cur_block->first() == node) {
+ _cur_block->set_first(prev->next());
+ }
+
+ node->set_position(kNodePositionDidOnBefore);
+ node = prev->next();
+
+ // `on_before_invoke()` and `on_before_ret()` can only insert instructions.
+ ASMJIT_ASSERT(node->is_inst());
+ }
+
+ // Necessary if something was inserted after `node`, but nothing before.
+ next = node->next();
+ }
+ else {
+ // Change the position back to its original value.
+ node->set_position(kNodePositionUnassigned);
+ }
+ }
+
+ InstNode* inst = node->as<InstNode>();
+ log_node(inst, kCodeIndentation);
+
+ InstControlFlow cf = InstControlFlow::kRegular;
+ ib.reset(_cur_block->block_id());
+ ASMJIT_PROPAGATE(static_cast<This*>(this)->on_instruction(inst, cf, ib));
+
+ if (node->is_invoke()) {
+ ASMJIT_PROPAGATE(static_cast<This*>(this)->on_invoke(inst->as<InvokeNode>(), ib));
+ }
+
+ if (node->is_func_ret()) {
+ ASMJIT_PROPAGATE(static_cast<This*>(this)->on_ret(inst->as<FuncRetNode>(), ib));
+ cf = InstControlFlow::kReturn;
+ }
+
+ if (cf == InstControlFlow::kJump) {
+ uint32_t fixed_reg_count = 0;
+ for (RATiedReg& tied_reg : ib) {
+ RAWorkReg* work_reg = tied_reg.work_reg();
+ if (work_reg->group() == RegGroup::kGp) {
+ uint32_t use_id = tied_reg.use_id();
+ if (use_id == Reg::kIdBad) {
+ use_id = _pass._scratch_reg_indexes[fixed_reg_count++];
+ tied_reg.set_use_id(use_id);
+ }
+ _cur_block->add_exit_scratch_gp_regs(Support::bit_mask<RegMask>(use_id));
+ }
+ }
+ }
+
+ ASMJIT_PROPAGATE(_pass.assign_ra_inst(inst, _cur_block, ib));
+ _block_reg_stats.combine_with(ib._stats);
+
+ if (cf != InstControlFlow::kRegular) {
+ // Support for conditional and unconditional jumps.
+ if (cf == InstControlFlow::kJump || cf == InstControlFlow::kBranch) {
+ _cur_block->set_last(node);
+ _cur_block->add_flags(RABlockFlags::kHasTerminator);
+ _cur_block->make_constructed(_block_reg_stats);
+
+ if (!inst->has_option(InstOptions::kUnfollow)) {
+ // Jmp/Jcc/Call/Loop/etc... require at least 1 operand that describes the jump target.
+ Span<const Operand> operands = inst->operands();
+ if (ASMJIT_UNLIKELY(operands.is_empty())) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (operands.last().is_label()) {
+ // Labels are easy for constructing the control flow.
+ LabelNode* label_node;
+ ASMJIT_PROPAGATE(cc().label_node_of(Out(label_node), operands.last().as<Label>()));
+
+ RABlock* target_block = _pass.new_block_or_existing_at(label_node);
+ if (ASMJIT_UNLIKELY(!target_block)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ target_block->make_targetable();
+ ASMJIT_PROPAGATE(_cur_block->append_successor(target_block));
+ }
+ else {
+ // Not a label - could be jump with reg/mem operand, which means that it can go anywhere. Such jumps
+ // must either be annotated so the CFG can be properly constructed, otherwise we assume the worst case
+ // - can jump to any basic block.
+ JumpAnnotation* jump_annotation = nullptr;
+ _cur_block->add_flags(RABlockFlags::kHasJumpTable);
+
+ if (inst->type() == NodeType::kJump) {
+ jump_annotation = inst->as<JumpNode>()->annotation();
+ }
+
+ if (jump_annotation) {
+ RABlockTimestamp timestamp = _pass.next_timestamp();
+ for (uint32_t id : jump_annotation->label_ids()) {
+ LabelNode* label_node;
+ ASMJIT_PROPAGATE(cc().label_node_of(Out(label_node), id));
+
+ RABlock* target_block = _pass.new_block_or_existing_at(label_node);
+ if (ASMJIT_UNLIKELY(!target_block)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // Prevents adding basic-block successors multiple times.
+ if (!target_block->has_timestamp(timestamp)) {
+ target_block->set_timestamp(timestamp);
+ target_block->make_targetable();
+ ASMJIT_PROPAGATE(_cur_block->append_successor(target_block));
+ }
+ }
+ ASMJIT_PROPAGATE(share_assignment_across_successors(_cur_block));
+ }
+ else {
+ ASMJIT_PROPAGATE(blocks_with_unknown_jumps.append(_pass.arena(), _cur_block));
+ }
+ }
+ }
+
+ if (cf == InstControlFlow::kJump) {
+ // Unconditional jump makes the code after the jump unreachable, which will be removed instantly during
+ // the CFG construction; as we cannot allocate registers for instructions that are not part of any block.
+ // Of course we can leave these instructions as they are, however, that would only postpone the problem
+ // as assemblers can't encode instructions that use virtual registers.
+ _cur_block = nullptr;
+ }
+ else {
+ node = next;
+ if (ASMJIT_UNLIKELY(!node)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ RABlock* consecutive_block;
+ if (node->type() == NodeType::kLabel) {
+ if (node->has_pass_data()) {
+ consecutive_block = node->pass_data<RABlock>();
+ }
+ else {
+ consecutive_block = _pass.new_block(node);
+ if (ASMJIT_UNLIKELY(!consecutive_block)) {
+ return make_error(Error::kOutOfMemory);
+ }
+ node->set_pass_data<RABlock>(consecutive_block);
+ }
+ }
+ else {
+ consecutive_block = _pass.new_block(node);
+ if (ASMJIT_UNLIKELY(!consecutive_block)) {
+ return make_error(Error::kOutOfMemory);
+ }
+ }
+
+ _cur_block->add_flags(RABlockFlags::kHasConsecutive);
+ ASMJIT_PROPAGATE(_cur_block->prepend_successor(consecutive_block));
+
+ _cur_block = consecutive_block;
+ _has_code = false;
+ _block_reg_stats.reset();
+
+ if (_cur_block->is_constructed()) {
+ break;
+ }
+ ASMJIT_PROPAGATE(_pass.add_block(consecutive_block));
+
+ log_block(_cur_block, kRootIndentation);
+ continue;
+ }
+ }
+
+ if (cf == InstControlFlow::kReturn) {
+ _cur_block->set_last(node);
+ _cur_block->make_constructed(_block_reg_stats);
+ ASMJIT_PROPAGATE(_cur_block->append_successor(_ret_block));
+
+ _cur_block = nullptr;
+ }
+ }
+ }
+ else if (node->type() == NodeType::kLabel) {
+ // Label - Basic-Block Management
+ // ------------------------------
+
+ if (!_cur_block) {
+ // If the current code is unreachable the label makes it reachable again. We may remove the whole block in
+ // the future if it's not referenced though.
+ _cur_block = node->pass_data<RABlock>();
+
+ if (_cur_block) {
+ // If the label has a block assigned we can either continue with it or skip it if the block has been
+ // constructed already.
+ if (_cur_block->is_constructed()) {
+ break;
+ }
+ }
+ else {
+ // No block assigned - create a new one and assign it.
+ _cur_block = _pass.new_block(node);
+ if (ASMJIT_UNLIKELY(!_cur_block)) {
+ return make_error(Error::kOutOfMemory);
+ }
+ node->set_pass_data<RABlock>(_cur_block);
+ }
+
+ _cur_block->make_targetable();
+ _has_code = false;
+ _block_reg_stats.reset();
+ ASMJIT_PROPAGATE(_pass.add_block(_cur_block));
+ }
+ else {
+ if (node->has_pass_data()) {
+ RABlock* consecutive = node->pass_data<RABlock>();
+ consecutive->make_targetable();
+
+ if (_cur_block == consecutive) {
+ // The label currently processed is part of the current block. This is only possible for multiple labels
+ // that are right next to each other or labels that are separated by non-code nodes like directives and
+ // comments.
+ if (ASMJIT_UNLIKELY(_has_code)) {
+ return make_error(Error::kInvalidState);
+ }
+ }
+ else {
+ // Label makes the current block constructed. There is a chance that the Label is not used, but we don't
+ // know that at this point. In the worst case there would be two blocks next to each other, it's just fine.
+ ASMJIT_ASSERT(_cur_block->last() != node);
+ _cur_block->set_last(node->prev());
+ _cur_block->add_flags(RABlockFlags::kHasConsecutive);
+ _cur_block->make_constructed(_block_reg_stats);
+
+ ASMJIT_PROPAGATE(_cur_block->append_successor(consecutive));
+ ASMJIT_PROPAGATE(_pass.add_block(consecutive));
+
+ _cur_block = consecutive;
+ _has_code = false;
+ _block_reg_stats.reset();
+ }
+ }
+ else {
+ // First time we see this label.
+ if (_has_code || _cur_block == entry_block) {
+ // Cannot continue the current block if it already contains some code or it's a block entry. We need to
+ // create a new block and make it a successor.
+ ASMJIT_ASSERT(_cur_block->last() != node);
+ _cur_block->set_last(node->prev());
+ _cur_block->add_flags(RABlockFlags::kHasConsecutive);
+ _cur_block->make_constructed(_block_reg_stats);
+
+ RABlock* consecutive = _pass.new_block(node);
+ if (ASMJIT_UNLIKELY(!consecutive)) {
+ return make_error(Error::kOutOfMemory);
+ }
+ consecutive->make_targetable();
+
+ ASMJIT_PROPAGATE(_cur_block->append_successor(consecutive));
+ ASMJIT_PROPAGATE(_pass.add_block(consecutive));
+
+ _cur_block = consecutive;
+ _has_code = false;
+ _block_reg_stats.reset();
+ }
+
+ node->set_pass_data<RABlock>(_cur_block);
+ }
+ }
+
+ if (_cur_block && _cur_block != _last_logged_block) {
+ log_block(_cur_block, kRootIndentation);
+ }
+ log_node(node, kRootIndentation);
+
+ // Unlikely: Assume that the exit label is reached only once per function.
+ if (ASMJIT_UNLIKELY(node->as<LabelNode>()->label_id() == _exit_label_id)) {
+ _cur_block->set_last(node);
+ _cur_block->make_constructed(_block_reg_stats);
+ ASMJIT_PROPAGATE(_pass.add_exit_block(_cur_block));
+
+ _cur_block = nullptr;
+ }
+ }
+ else {
+ // Other Nodes | Function Exit
+ // ---------------------------
+
+ log_node(node, kCodeIndentation);
+
+ if (node->type() == NodeType::kSentinel) {
+ if (node == _func_node->end_node()) {
+ // Make sure we didn't flow here if this is the end of the function sentinel.
+ if (ASMJIT_UNLIKELY(_cur_block && _has_code)) {
+ return make_error(Error::kInvalidState);
+ }
+ break;
+ }
+ }
+ else if (node->type() == NodeType::kFunc) {
+ // RAPass can only compile a single function at a time. If we
+ // encountered a function it must be the current one, bail if not.
+ if (ASMJIT_UNLIKELY(node != _func_node)) {
+ return make_error(Error::kInvalidState);
+ }
+ // PASS if this is the first node.
+ }
+ else {
+ // PASS if this is a non-interesting or unknown node.
+ }
+ }
+
+ // Advance to the next node.
+ node = next;
+
+ // NOTE: We cannot encounter a NULL node, because every function must be terminated by a sentinel (`stop`)
+ // node. If we encountered a NULL node it means that something went wrong and this node list is corrupted;
+ // bail in such case.
+ if (ASMJIT_UNLIKELY(!node)) {
+ return make_error(Error::kInvalidState);
+ }
+ }
+
+ if (_pass.has_dangling_blocks()) {
+ return make_error(Error::kInvalidState);
+ }
+
+ for (RABlock* block : blocks_with_unknown_jumps) {
+ ASMJIT_PROPAGATE(handle_block_with_unknown_jump(block));
+ }
+
+ return _pass.init_shared_assignments(_shared_assignments_map);
+ }
+
+ //! \}
+
+ //! \name Prepare
+ //! \{
+
+ //! Prepares the CFG builder of the current function.
+ [[nodiscard]]
+ Error prepare() noexcept {
+ FuncNode* func = _pass.func();
+ BaseNode* node = nullptr;
+
+ // Create entry and exit blocks.
+ _func_node = func;
+ _ret_block = _pass.new_block_or_existing_at(func->exit_node(), &node);
+
+ if (ASMJIT_UNLIKELY(!_ret_block))
+ return make_error(Error::kOutOfMemory);
+
+ _ret_block->make_targetable();
+ ASMJIT_PROPAGATE(_pass.add_exit_block(_ret_block));
+
+ if (node != func) {
+ _cur_block = _pass.new_block();
+ if (ASMJIT_UNLIKELY(!_cur_block))
+ return make_error(Error::kOutOfMemory);
+ }
+ else {
+ // Function that has no code at all.
+ _cur_block = _ret_block;
+ }
+
+ // Reset everything we may need.
+ _block_reg_stats.reset();
+ _exit_label_id = func->exit_node()->label_id();
+
+ // Initially we assume there is no code in the function body.
+ _has_code = false;
+
+ return _pass.add_block(_cur_block);
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Called when a `node` is removed, e.g. because of a dead code elimination.
+ void remove_node(BaseNode* node) noexcept {
+ log_node(node, kRootIndentation, "<Removed>");
+ cc().remove_node(node);
+ }
+
+ //! Handles block with unknown jump, which could be a jump to a jump table.
+ //!
+ //! If we encounter such block we basically insert all existing blocks as successors except the function entry
+ //! block and a natural successor, if such block exists.
+ [[nodiscard]]
+ Error handle_block_with_unknown_jump(RABlock* block) noexcept {
+ // NOTE: Iterate from `1` as the first block is the entry block, we don't allow the entry to be a successor
+ // of any block as it contains a function prolog sequence, which just cannot be re-executed (executed twice).
+ Span blocks = _pass.blocks();
+ RABlock* consecutive = block->consecutive();
+
+ for (size_t i = 1; i < blocks.size(); i++) {
+ RABlock* candidate = blocks[i];
+ if (candidate == consecutive || !candidate->is_targetable()) {
+ continue;
+ }
+ ASMJIT_PROPAGATE(block->append_successor(candidate));
+ }
+
+ return share_assignment_across_successors(block);
+ }
+
+ [[nodiscard]]
+ Error share_assignment_across_successors(RABlock* block) noexcept {
+ if (block->successors().size() <= 1u) {
+ return Error::kOk;
+ }
+
+ RABlock* consecutive = block->consecutive();
+ uint32_t shared_assignment_id = Globals::kInvalidId;
+
+ for (RABlock* successor : block->successors()) {
+ if (successor == consecutive) {
+ continue;
+ }
+
+ if (successor->has_shared_assignment_id()) {
+ if (shared_assignment_id == Globals::kInvalidId) {
+ shared_assignment_id = successor->shared_assignment_id();
+ }
+ else {
+ _shared_assignments_map[successor->shared_assignment_id()] = shared_assignment_id;
+ }
+ }
+ else {
+ if (shared_assignment_id == Globals::kInvalidId) {
+ ASMJIT_PROPAGATE(new_shared_assignment_id(&shared_assignment_id));
+ }
+ successor->set_shared_assignment_id(shared_assignment_id);
+ }
+ }
+ return Error::kOk;
+ }
+
+ [[nodiscard]]
+ Error new_shared_assignment_id(uint32_t* out) noexcept {
+ uint32_t id = uint32_t(_shared_assignments_map.size());
+ ASMJIT_PROPAGATE(_shared_assignments_map.append(_pass.arena(), id));
+
+ *out = id;
+ return Error::kOk;
+ }
+
+ //! \}
+
+ //! \name Logging
+ //! \{
+
+#ifndef ASMJIT_NO_LOGGING
+ template<typename... Args>
+ inline void log(const char* fmt, Args&&... args) noexcept {
+ if (_logger) {
+ _logger->logf(fmt, std::forward<Args>(args)...);
+ }
+ }
+
+ inline void log_block(RABlock* block, uint32_t indentation = 0) noexcept {
+ if (_logger) {
+ _log_block(block, indentation);
+ }
+ }
+
+ inline void log_node(BaseNode* node, uint32_t indentation = 0, const char* action = nullptr) noexcept {
+ if (_logger) {
+ _log_node(node, indentation, action);
+ }
+ }
+
+ void _log_block(RABlock* block, uint32_t indentation) noexcept {
+ _sb.clear();
+ _sb.append_chars(' ', indentation);
+ _sb.append_format("{#%u}\n", block->block_id());
+ _logger->log(_sb);
+ _last_logged_block = block;
+ }
+
+ void _log_node(BaseNode* node, uint32_t indentation, const char* action) noexcept {
+ _sb.clear();
+ _sb.append_chars(' ', indentation);
+ if (action) {
+ _sb.append(action);
+ _sb.append(' ');
+ }
+ Formatter::format_node(_sb, _format_options, &_cc, node);
+ _sb.append('\n');
+ _logger->log(_sb);
+ }
+#else
+ template<typename... Args>
+ inline void log(const char* fmt, Args&&... args) noexcept {
+ Support::maybe_unused(fmt);
+ Support::maybe_unused(std::forward<Args>(args)...);
+ }
+
+ inline void log_block(RABlock* block, uint32_t indentation = 0) noexcept {
+ Support::maybe_unused(block, indentation);
+ }
+
+ inline void log_node(BaseNode* node, uint32_t indentation = 0, const char* action = nullptr) noexcept {
+ Support::maybe_unused(node, indentation, action);
+ }
+#endif
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RACFGBUILDER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/raconstraints_p.h b/3rdparty/asmjit/asmjit/core/raconstraints_p.h
new file mode 100644
index 00000000000..67fd87827d7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/raconstraints_p.h
@@ -0,0 +1,65 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RACONSTRAINTS_P_H_INCLUDED
+#define ASMJIT_CORE_RACONSTRAINTS_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Provides architecture constraints used by register allocator.
+class RAConstraints {
+public:
+ //! \name Members
+ //! \{
+
+ Support::Array<RegMask, Globals::kNumVirtGroups> _available_regs {};
+
+ //! \}
+
+ [[nodiscard]]
+ ASMJIT_NOINLINE Error init(Arch arch) noexcept {
+ switch (arch) {
+ case Arch::kX86:
+ case Arch::kX64: {
+ uint32_t register_count = arch == Arch::kX86 ? 8 : 16;
+ _available_regs[RegGroup::kGp] = Support::lsb_mask<RegMask>(register_count) & ~Support::bit_mask<RegMask>(4u);
+ _available_regs[RegGroup::kVec] = Support::lsb_mask<RegMask>(register_count);
+ _available_regs[RegGroup::kMask] = Support::lsb_mask<RegMask>(8);
+ _available_regs[RegGroup::kX86_MM] = Support::lsb_mask<RegMask>(8);
+ return Error::kOk;
+ }
+
+ case Arch::kAArch64: {
+ _available_regs[RegGroup::kGp] = 0xFFFFFFFFu & ~Support::bit_mask<RegMask>(18, 31u);
+ _available_regs[RegGroup::kVec] = 0xFFFFFFFFu;
+ _available_regs[RegGroup::kMask] = 0;
+ _available_regs[RegGroup::kExtra] = 0;
+ return Error::kOk;
+ }
+
+ default:
+ return make_error(Error::kInvalidArch);
+ }
+ }
+
+ [[nodiscard]]
+ inline RegMask available_regs(RegGroup group) const noexcept { return _available_regs[group]; }
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_RACONSTRAINTS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/radefs_p.h b/3rdparty/asmjit/asmjit/core/radefs_p.h
new file mode 100644
index 00000000000..bcf232b7aab
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/radefs_p.h
@@ -0,0 +1,1038 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RADEFS_P_H_INCLUDED
+#define ASMJIT_CORE_RADEFS_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/builder.h>
+#include <asmjit/core/compilerdefs.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenabitset_p.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+#ifndef ASMJIT_NO_LOGGING
+# define ASMJIT_RA_LOG_FORMAT(...) \
+ do { \
+ if (ASMJIT_UNLIKELY(logger)) \
+ logger->logf(__VA_ARGS__); \
+ } while (0)
+# define ASMJIT_RA_LOG_COMPLEX(...) \
+ do { \
+ if (ASMJIT_UNLIKELY(logger)) { \
+ __VA_ARGS__ \
+ } \
+ } while (0)
+#else
+# define ASMJIT_RA_LOG_FORMAT(...) ((void)0)
+# define ASMJIT_RA_LOG_COMPLEX(...) ((void)0)
+#endif
+
+// Forward declarations.
+struct RATiedReg;
+
+class BaseRAPass;
+class RABlock;
+class BaseNode;
+struct RAStackSlot;
+
+using RAWorkRegVector = ArenaVector<RAWorkReg*>;
+
+//! Work register identifier (RA).
+//!
+//! Work register is an actual virtual register that is used by the function and subject to register allocation.
+enum class RAWorkId : uint32_t {};
+
+//! Basic block identifier (RA).
+enum class RABlockId : uint32_t {};
+
+//! Invalid register identifier or unassigned yet.
+static constexpr RAWorkId kBadWorkId = RAWorkId(Globals::kInvalidId);
+
+//! Invalid block identifier or unassigned yet.
+static constexpr RABlockId kBadBlockId = RABlockId(Globals::kInvalidId);
+
+//! Maximum number of consecutive registers aggregated from all supported backends.
+static constexpr uint32_t kMaxConsecutiveRegs = 4;
+
+enum class RAStrategyType : uint8_t {
+ kSimple = 0,
+ kComplex = 1
+};
+ASMJIT_DEFINE_ENUM_COMPARE(RAStrategyType)
+
+enum class RAStrategyFlags : uint8_t {
+ kNone = 0
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RAStrategyFlags)
+
+//! Register allocation strategy.
+//!
+//! The idea is to select the best register allocation strategy for each virtual register group based on the
+//! complexity of the code.
+struct RAStrategy {
+ //! \name Members
+ //! \{
+
+ RAStrategyType _type = RAStrategyType::kSimple;
+ RAStrategyFlags _flags = RAStrategyFlags::kNone;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _type = RAStrategyType::kSimple;
+ _flags = RAStrategyFlags::kNone;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAStrategyType type() const noexcept { return _type; }
+
+ ASMJIT_INLINE_NODEBUG void set_type(RAStrategyType type) noexcept { _type = type; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_simple() const noexcept { return _type == RAStrategyType::kSimple; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_complex() const noexcept { return _type >= RAStrategyType::kComplex; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAStrategyFlags flags() const noexcept { return _flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(RAStrategyFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ ASMJIT_INLINE_NODEBUG void add_flags(RAStrategyFlags flags) noexcept { _flags |= flags; }
+
+ //! \}
+};
+
+//! Count of virtual or physical registers per group.
+//!
+//! \note This class uses 8-bit integers to represent counters, it's only used in places where this is sufficient,
+//! for example total count of machine's physical registers, count of virtual registers per instruction, etc...
+//! There is also `RALiveCount`, which uses 32-bit integers and is indeed much safer.
+struct RARegCount {
+ //! \name Members
+ //! \{
+
+ uint32_t _counters;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Resets all counters to zero.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _counters = 0; }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const RARegCount& other) const noexcept { return _counters == other._counters; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const RARegCount& other) const noexcept { return _counters != other._counters; }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the count of registers by the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t get(RegGroup group) const noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ uint32_t shift = uint32_t(group) * 8u;
+ return (_counters >> shift) & 0xFFu;
+ }
+
+ //! Sets the register count by a register `group`.
+ ASMJIT_INLINE void set(RegGroup group, uint32_t n) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ ASMJIT_ASSERT(n <= 0xFFu);
+
+ uint32_t shift = uint32_t(group) * 8u;
+ _counters = (_counters & ~uint32_t(0xFFu << shift)) + (n << shift);
+ }
+
+ //! Adds the register count by a register `group`.
+ ASMJIT_INLINE void add(RegGroup group, uint32_t n = 1) noexcept {
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+ ASMJIT_ASSERT(get(group) + n <= 0xFFu);
+
+ uint32_t shift = uint32_t(group) * 8u;
+ _counters += n << shift;
+ }
+
+ //! \}
+};
+
+//! Provides mapping that can be used to fast index architecture register groups.
+struct RARegIndex : public RARegCount {
+ //! Build register indexes based on the given `count` of registers.
+ ASMJIT_INLINE void build_indexes(const RARegCount& count) noexcept {
+ ASMJIT_ASSERT(count.get(RegGroup(0)) + count.get(RegGroup(1)) <= 0xFFu);
+ ASMJIT_ASSERT(count.get(RegGroup(0)) + count.get(RegGroup(1)) + count.get(RegGroup(2)) <= 0xFFu);
+
+ uint32_t i = count._counters;
+ _counters = (i + (i << 8u) + (i << 16)) << 8u;
+ }
+};
+
+//! Registers mask.
+struct RARegMask {
+ //! \name Types
+ //! \{
+
+ using RegMasks = Support::Array<RegMask, Globals::kNumVirtGroups>;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ RegMasks _masks;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Initializes from other `RARegMask`.
+ ASMJIT_INLINE_NODEBUG void init(const RARegMask& other) noexcept { _masks = other._masks; }
+ //! Initializes directly from an array of masks.
+ ASMJIT_INLINE_NODEBUG void init(const RegMasks& masks) noexcept { _masks = masks; }
+
+ //! Resets all register masks to zero.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _masks.fill(0); }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const RARegMask& other) const noexcept { return _masks == other._masks; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const RARegMask& other) const noexcept { return _masks != other._masks; }
+
+ template<typename Index>
+ [[nodiscard]]
+ inline uint32_t& operator[](const Index& index) noexcept { return _masks[index]; }
+
+ template<typename Index>
+ [[nodiscard]]
+ inline const uint32_t& operator[](const Index& index) const noexcept { return _masks[index]; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Tests whether all register masks are zero (empty).
+ [[nodiscard]]
+ inline bool is_empty() const noexcept {
+ return _masks.aggregate<Support::Or>() == 0;
+ }
+
+ [[nodiscard]]
+ inline bool has(RegGroup group, RegMask mask = 0xFFFFFFFFu) const noexcept {
+ return (_masks[group] & mask) != 0;
+ }
+
+ template<class Operator>
+ inline void op(const RARegMask& other) noexcept {
+ _masks.combine<Operator>(other._masks);
+ }
+
+ template<class Operator>
+ inline void op(RegGroup group, RegMask mask) noexcept {
+ _masks[group] = Operator::op(_masks[group], mask);
+ }
+
+ inline void clear(RegGroup group, RegMask mask) noexcept {
+ _masks[group] = _masks[group] & ~mask;
+ }
+
+ inline void clear(const RegMasks& masks) noexcept {
+ _masks.combine<Support::AndNot>(masks);
+ }
+
+ //! \}
+};
+
+//! Information associated with each instruction, propagated to blocks, loops, and the whole function. This
+//! information can be used to do minor decisions before the register allocator tries to do its job. For
+//! example to use fast register allocation inside a block or loop it cannot have clobbered and/or fixed
+//! registers, etc...
+class RARegsStats {
+public:
+ //! \name Constants
+ //! \{
+
+ enum Index : uint32_t {
+ kIndexUsed = 0,
+ kIndexFixed = 8,
+ kIndexClobbered = 16
+ };
+
+ enum Mask : uint32_t {
+ kMaskUsed = 0xFFu << kIndexUsed,
+ kMaskFixed = 0xFFu << kIndexFixed,
+ kMaskClobbered = 0xFFu << kIndexClobbered
+ };
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uint32_t _packed = 0;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _packed = 0; }
+ ASMJIT_INLINE_NODEBUG void combine_with(const RARegsStats& other) noexcept { _packed |= other._packed; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_used() const noexcept { return (_packed & kMaskUsed) != 0u; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_used(RegGroup group) const noexcept { return Support::bit_test(_packed, kIndexUsed + uint32_t(group)); }
+
+ ASMJIT_INLINE_NODEBUG void make_used(RegGroup group) noexcept { _packed |= Support::bit_mask<uint32_t>(kIndexUsed + uint32_t(group)); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_fixed() const noexcept { return (_packed & kMaskFixed) != 0u; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_fixed(RegGroup group) const noexcept { return Support::bit_test(_packed, kIndexFixed + uint32_t(group)); }
+
+ ASMJIT_INLINE_NODEBUG void make_fixed(RegGroup group) noexcept { _packed |= Support::bit_mask<uint32_t>(kIndexFixed + uint32_t(group)); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_clobbered() const noexcept { return (_packed & kMaskClobbered) != 0u; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_clobbered(RegGroup group) const noexcept { return Support::bit_test(_packed, kIndexClobbered + uint32_t(group)); }
+
+ ASMJIT_INLINE_NODEBUG void make_clobbered(RegGroup group) noexcept { _packed |= Support::bit_mask<uint32_t>(kIndexClobbered + uint32_t(group)); }
+
+ //! \}
+};
+
+//! Count of live registers, per group.
+class RALiveCount {
+public:
+ //! \name Members
+ //! \{
+
+ Support::Array<uint32_t, Globals::kNumVirtGroups> n {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RALiveCount() noexcept = default;
+ ASMJIT_INLINE_NODEBUG RALiveCount(const RALiveCount& other) noexcept = default;
+
+ ASMJIT_INLINE_NODEBUG void init(const RALiveCount& other) noexcept { n = other.n; }
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { n.fill(0); }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RALiveCount& operator=(const RALiveCount& other) noexcept = default;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t& operator[](RegGroup group) noexcept { return n[group]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const uint32_t& operator[](RegGroup group) const noexcept { return n[group]; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ template<class Operator>
+ inline void op(const RALiveCount& other) noexcept { n.combine<Operator>(other.n); }
+
+ //! \}
+};
+
+//! Span that contains start (a) and end (b).
+struct RALiveSpan {
+ //! \name Constants
+ //! \{
+
+ static inline constexpr NodePosition kNaN = NodePosition(0);
+ static inline constexpr NodePosition kInf = NodePosition(0xFFFFFFFFu);
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ NodePosition a {};
+ NodePosition b {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RALiveSpan() noexcept = default;
+ ASMJIT_INLINE_NODEBUG RALiveSpan(const RALiveSpan& other) noexcept = default;
+ ASMJIT_INLINE_NODEBUG RALiveSpan(NodePosition a, NodePosition b) noexcept : a(a), b(b) {}
+
+ ASMJIT_INLINE_NODEBUG void init(NodePosition first, NodePosition last) noexcept {
+ a = first;
+ b = last;
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const RALiveSpan& other) noexcept { init(other.a, other.b); }
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { init(NodePosition(0), NodePosition(0)); }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RALiveSpan& operator=(const RALiveSpan& other) = default;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_valid() const noexcept { return a < b; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t width() const noexcept { return uint32_t(b) - uint32_t(a); }
+
+ //! \}
+};
+
+//! Vector of `RALiveSpan` with additional convenience API.
+class RALiveSpans {
+public:
+ ASMJIT_NONCOPYABLE(RALiveSpans)
+
+ //! \name Members
+ //! \{
+
+ ArenaVector<RALiveSpan> _data {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RALiveSpans() noexcept = default;
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _data.reset(); }
+ ASMJIT_INLINE_NODEBUG void release(Arena& arena) noexcept { _data.release(arena); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _data.is_empty(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _data.size(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RALiveSpan* data() noexcept { return _data.data(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RALiveSpan* data() const noexcept { return _data.data(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_open() const noexcept {
+ size_t size = _data.size();
+ return size && _data[size - 1].b == RALiveSpan::kInf;
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void swap(RALiveSpans& other) noexcept { _data.swap(other._data); }
+
+ //! Open the current live span.
+ ASMJIT_INLINE Error open_at(Arena& arena, NodePosition start, NodePosition end) noexcept {
+ bool was_open;
+ return open_at(arena, start, end, was_open);
+ }
+
+ ASMJIT_INLINE Error open_at(Arena& arena, NodePosition start, NodePosition end, bool& was_open) noexcept {
+ size_t size = _data.size();
+ was_open = false;
+
+ if (size > 0) {
+ RALiveSpan& last = _data[size - 1];
+ if (last.b >= start) {
+ was_open = last.b > start;
+ last.b = end;
+ return Error::kOk;
+ }
+ }
+
+ return _data.append(arena, RALiveSpan(start, end));
+ }
+
+ ASMJIT_INLINE void close_at(NodePosition end) noexcept {
+ ASMJIT_ASSERT(!is_empty());
+
+ size_t size = _data.size();
+ _data[size - 1u].b = end;
+ }
+
+ //! Returns the sum of width of all spans.
+ //!
+ //! \note Don't overuse, this iterates over all spans so it's O(N). It should be only called once and then cached.
+ inline uint32_t width() const noexcept {
+ uint32_t width = 0;
+ for (const RALiveSpan& span : _data)
+ width += span.width();
+ return width;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RALiveSpan& operator[](uint32_t index) noexcept { return _data[index]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RALiveSpan& operator[](uint32_t index) const noexcept { return _data[index]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool intersects(const RALiveSpans& other) const noexcept {
+ return intersects(*this, other);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE Error non_overlapping_union_of(Arena& arena, const RALiveSpans& x, const RALiveSpans& y) noexcept {
+ size_t final_size = x.size() + y.size();
+ ASMJIT_PROPAGATE(_data.reserve_grow(arena, final_size));
+
+ RALiveSpan* dst_ptr = _data.data();
+ const RALiveSpan* x_span = x.data();
+ const RALiveSpan* y_span = y.data();
+
+ const RALiveSpan* x_end = x_span + x.size();
+ const RALiveSpan* y_end = y_span + y.size();
+
+ // Loop until we have intersection or either `x_span == x_end` or `y_span == y_end`, which means that there is no
+ // intersection. We advance either `x_span` or `y_span` depending on their ranges.
+ if (x_span != x_end && y_span != y_end) {
+ NodePosition xa, ya;
+ xa = x_span->a;
+ for (;;) {
+ while (y_span->b <= xa) {
+ dst_ptr->init(*y_span);
+ dst_ptr++;
+ if (++y_span == y_end) {
+ goto Done;
+ }
+ }
+
+ ya = y_span->a;
+ while (x_span->b <= ya) {
+ *dst_ptr++ = *x_span;
+ if (++x_span == x_end) {
+ goto Done;
+ }
+ }
+
+ // We know that `x_span->b > y_span->a`, so check if `y_span->b > x_span->a`.
+ xa = x_span->a;
+ if (y_span->b > xa) {
+ return Error::kByPass;
+ }
+ }
+ }
+
+ Done:
+ while (x_span != x_end) {
+ *dst_ptr++ = *x_span++;
+ }
+
+ while (y_span != y_end) {
+ dst_ptr->init(*y_span);
+ dst_ptr++;
+ y_span++;
+ }
+
+ _data._set_end(dst_ptr);
+ return Error::kOk;
+ }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE bool intersects(const RALiveSpans& x, const RALiveSpans& y) noexcept {
+ const RALiveSpan* x_span = x.data();
+ const RALiveSpan* y_span = y.data();
+
+ const RALiveSpan* x_end = x_span + x.size();
+ const RALiveSpan* y_end = y_span + y.size();
+
+ // Loop until we have intersection or either `x_span == x_end` or `y_span == y_end`, which means that there is no
+ // intersection. We advance either `x_span` or `y_span` depending on their end positions.
+ if (x_span == x_end || y_span == y_end) {
+ return false;
+ }
+
+ NodePosition xa, ya;
+ xa = x_span->a;
+
+ for (;;) {
+ while (y_span->b <= xa) {
+ if (++y_span == y_end) {
+ return false;
+ }
+ }
+
+ ya = y_span->a;
+ while (x_span->b <= ya) {
+ if (++x_span == x_end) {
+ return false;
+ }
+ }
+
+ // We know that `x_span->b > y_span->a`, so check if `y_span->b > x_span->a`.
+ xa = x_span->a;
+ if (y_span->b > xa) {
+ return true;
+ }
+ }
+ }
+
+ //! \}
+};
+
+//! Statistics about a register liveness.
+class RALiveStats {
+public:
+ uint32_t _width = 0;
+ float _freq = 0.0f;
+ float _priority = 0.0f;
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t width() const noexcept { return _width; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG float freq() const noexcept { return _freq; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG float priority() const noexcept { return _priority; }
+
+ //! \}
+};
+
+//! Flags used by \ref RATiedReg.
+//!
+//! Register access information is encoded in 4 flags in total:
+//!
+//! - `kRead` - Register is Read (ReadWrite if combined with `kWrite`).
+//! - `kWrite` - Register is Written (ReadWrite if combined with `kRead`).
+//! - `kUse` - Encoded as Read or ReadWrite.
+//! - `kOut` - Encoded as WriteOnly.
+//!
+//! Let's describe all of these on two X86 instructions:
+//!
+//! - ADD x{R|W|Use}, x{R|Use} -> {x:R|W|Use }
+//! - LEA x{ W|Out}, [x{R|Use} + x{R|Out}] -> {x:R|W|Use|Out }
+//! - ADD x{R|W|Use}, y{R|Use} -> {x:R|W|Use y:R|Use}
+//! - LEA x{ W|Out}, [x{R|Use} + y{R|Out}] -> {x:R|W|Use|Out y:R|Use}
+//!
+//! It should be obvious from the example above how these flags get created. Each operand contains READ/WRITE
+//! information, which is then merged to RATiedReg's flags. However, we also need to represent the possibility
+//! to view the operation as two independent operations - USE and OUT, because the register allocator first
+//! allocates USE registers, and then assigns OUT registers independently of USE registers.
+enum class RATiedFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ // Access Flags
+ // ------------
+
+ //! Register is read.
+ kRead = uint32_t(OpRWFlags::kRead),
+ //! Register is written.
+ kWrite = uint32_t(OpRWFlags::kWrite),
+ //! Register both read and written.
+ kRW = uint32_t(OpRWFlags::kRW),
+
+ // Use / Out Flags
+ // ---------------
+
+ //! Register has a USE slot (read/rw).
+ kUse = 0x00000004u,
+ //! Register has an OUT slot (write-only).
+ kOut = 0x00000008u,
+ //! Register in USE slot can be patched to memory.
+ kUseRM = 0x00000010u,
+ //! Register in OUT slot can be patched to memory.
+ kOutRM = 0x00000020u,
+
+ //! Register has a fixed USE slot.
+ kUseFixed = 0x00000040u,
+ //! Register has a fixed OUT slot.
+ kOutFixed = 0x00000080u,
+ //! Register USE slot has been allocated.
+ kUseDone = 0x00000100u,
+ //! Register OUT slot has been allocated.
+ kOutDone = 0x00000200u,
+
+ // Consecutive Flags / Data
+ // ------------------------
+
+ //! Has consecutive registers in USE slots.
+ kUseConsecutive = 0x00000400u,
+ //! Has consecutive registers in OUT slots.
+ kOutConsecutive = 0x00000800u,
+ //! This is a consecutive lead (the first that is consecutive).
+ kLeadConsecutive = 0x00001000u,
+ //! Consecutive data payload.
+ kConsecutiveData = 0x00006000u,
+
+ // Other Constraints
+ // -----------------
+
+ //! This must be allocated to a unique physical register, not shared with other USE slots.
+ kUnique = 0x00008000u,
+
+ // Liveness Flags
+ // --------------
+
+ //! Register must be duplicated (function call only).
+ kDuplicate = 0x00010000u,
+ //! First occurrence of this virtual register in a basic block.
+ kFirst = 0x00020000u,
+ //! Last occurrence of this virtual register in a basic block.
+ kLast = 0x00040000u,
+ //! Kill this VirtReg after use.
+ kKill = 0x00080000u,
+
+ // X86 Specific Flags
+ // ------------------
+
+ // Architecture specific flags are used during RATiedReg building to ensure that architecture-specific constraints
+ // are handled properly. These flags are not really needed after RATiedReg[] is built and copied to `RAInst`.
+
+ //! This RATiedReg references GPB-LO or GPB-HI.
+ kX86_Gpb = 0x01000000u,
+
+ // Instruction Flags (Never used by RATiedReg)
+ // -------------------------------------------
+
+ //! Instruction has been patched to address a memory location instead of a register.
+ //!
+ //! This is currently only possible on X86 or X86_64 targets. It informs rewriter to rewrite the instruction if
+ //! necessary.
+ kInst_RegToMemPatched = 0x40000000u,
+
+ //! Instruction is transformable to another instruction if necessary.
+ //!
+ //! This is flag that is only used by \ref RAInst to inform register allocator that the instruction has some
+ //! constraints that can only be solved by transforming the instruction into another instruction, most likely
+ //! by changing its InstId.
+ kInst_IsTransformable = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RATiedFlags)
+
+static_assert(uint32_t(RATiedFlags::kRead ) == 0x1, "RATiedFlags::kRead must be 0x1");
+static_assert(uint32_t(RATiedFlags::kWrite) == 0x2, "RATiedFlags::kWrite must be 0x2");
+static_assert(uint32_t(RATiedFlags::kRW ) == 0x3, "RATiedFlags::kRW must be 0x3");
+
+//! Tied register merges one ore more register operand into a single entity. It contains information about its access
+//! (Read|Write) and allocation slots (Use|Out) that are used by the register allocator and liveness analysis.
+struct RATiedReg {
+ //! \name Members
+ //! \{
+
+ RAWorkReg* _work_reg;
+ RAWorkReg* _consecutive_parent;
+
+ //! Allocation flags.
+ RATiedFlags _flags;
+
+ union {
+ struct {
+ //! How many times the VirtReg is referenced in all operands.
+ uint8_t _ref_count;
+ //! Size of a memory operand in case that it's use instead of the register.
+ uint8_t _rm_size;
+ //! Physical register for use operation (ReadOnly / ReadWrite).
+ uint8_t _use_id;
+ //! Physical register for out operation (WriteOnly).
+ uint8_t _out_id;
+ };
+ //! Packed data.
+ uint32_t _packed;
+ };
+
+ //! Registers where inputs {R|X} can be allocated to.
+ RegMask _use_reg_mask;
+ //! Registers where outputs {W} can be allocated to.
+ RegMask _out_reg_mask;
+ //! Indexes used to rewrite USE regs.
+ uint32_t _use_rewrite_mask;
+ //! Indexes used to rewrite OUT regs.
+ uint32_t _out_rewrite_mask;
+
+ //! \}
+
+ //! \name Statics
+ //! \{
+
+ static inline RATiedFlags consecutive_data_to_flags(uint32_t offset) noexcept {
+ ASMJIT_ASSERT(offset < 4);
+ constexpr uint32_t kOffsetShift = Support::ctz_const<RATiedFlags::kConsecutiveData>;
+ return (RATiedFlags)(offset << kOffsetShift);
+ }
+
+ static inline uint32_t consecutive_data_from_flags(RATiedFlags flags) noexcept {
+ constexpr uint32_t kOffsetShift = Support::ctz_const<RATiedFlags::kConsecutiveData>;
+ return uint32_t(flags & RATiedFlags::kConsecutiveData) >> kOffsetShift;
+ }
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline void init(RAWorkReg* work_reg, RATiedFlags flags, RegMask use_reg_mask, uint32_t use_id, uint32_t use_rewrite_mask, RegMask out_reg_mask, uint32_t out_id, uint32_t out_rewrite_mask, uint32_t rm_size = 0, RAWorkReg* consecutive_parent = nullptr) noexcept {
+ _work_reg = work_reg;
+ _consecutive_parent = consecutive_parent;
+ _flags = flags;
+ _ref_count = 1;
+ _rm_size = uint8_t(rm_size);
+ _use_id = uint8_t(use_id);
+ _out_id = uint8_t(out_id);
+ _use_reg_mask = use_reg_mask;
+ _out_reg_mask = out_reg_mask;
+ _use_rewrite_mask = use_rewrite_mask;
+ _out_rewrite_mask = out_rewrite_mask;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAWorkReg* work_reg() const noexcept { return _work_reg; }
+
+ //! Returns the associated WorkReg id.
+ //[[nodiscard]]
+ //ASMJIT_INLINE_NODEBUG RAWorkId work_id() const noexcept { return _work_reg->work_id(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_consecutive_parent() const noexcept { return _consecutive_parent != nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAWorkReg* consecutive_parent() const noexcept { return _consecutive_parent; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t consecutive_data() const noexcept { return consecutive_data_from_flags(_flags); }
+
+ //! Returns TiedReg flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedFlags flags() const noexcept { return _flags; }
+
+ //! Checks if the given `flag` is set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ //! Adds tied register flags.
+ ASMJIT_INLINE_NODEBUG void add_flags(RATiedFlags flags) noexcept { _flags |= flags; }
+
+ //! Tests whether the register is read (writes `true` also if it's Read/Write).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_read() const noexcept { return has_flag(RATiedFlags::kRead); }
+
+ //! Tests whether the register is written (writes `true` also if it's Read/Write).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_write() const noexcept { return has_flag(RATiedFlags::kWrite); }
+
+ //! Tests whether the register is read only.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_read_only() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRead; }
+
+ //! Tests whether the register is write only.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_write_only() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kWrite; }
+
+ //! Tests whether the register is read and written.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_read_write() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRW; }
+
+ //! Tests whether the tied register has use operand (Read/ReadWrite).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_use() const noexcept { return has_flag(RATiedFlags::kUse); }
+
+ //! Tests whether the tied register has out operand (Write).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_out() const noexcept { return has_flag(RATiedFlags::kOut); }
+
+ //! Tests whether the tied register has \ref RATiedFlags::kLeadConsecutive flag set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_lead_consecutive() const noexcept { return has_flag(RATiedFlags::kLeadConsecutive); }
+
+ //! Tests whether the tied register has \ref RATiedFlags::kUseConsecutive flag set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_use_consecutive() const noexcept { return has_flag(RATiedFlags::kUseConsecutive); }
+
+ //! Tests whether the tied register has \ref RATiedFlags::kOutConsecutive flag set.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_out_consecutive() const noexcept { return has_flag(RATiedFlags::kOutConsecutive); }
+
+ //! Tests whether the tied register must be unique (cannot be allocated to any other allocated register).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_unique() const noexcept { return has_flag(RATiedFlags::kUnique); }
+
+ //! Tests whether the tied register has any consecutive flag.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_any_consecutive_flag() const noexcept { return has_flag(RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive); }
+
+ //! Tests whether the USE slot can be patched to memory operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_use_rm() const noexcept { return has_flag(RATiedFlags::kUseRM); }
+
+ //! Tests whether the OUT slot can be patched to memory operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_out_rm() const noexcept { return has_flag(RATiedFlags::kOutRM); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t rm_size() const noexcept { return _rm_size; }
+
+ inline void make_read_only() noexcept {
+ _flags = (_flags & ~(RATiedFlags::kOut | RATiedFlags::kWrite)) | RATiedFlags::kUse;
+ _use_rewrite_mask |= _out_rewrite_mask;
+ _out_rewrite_mask = 0;
+ }
+
+ inline void make_write_only() noexcept {
+ _flags = (_flags & ~(RATiedFlags::kUse | RATiedFlags::kRead)) | RATiedFlags::kOut;
+ _out_rewrite_mask |= _use_rewrite_mask;
+ _use_rewrite_mask = 0;
+ }
+
+ //! Tests whether the register would duplicate.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_duplicate() const noexcept { return has_flag(RATiedFlags::kDuplicate); }
+
+ //! Tests whether the register (and the instruction it's part of) appears first in the basic block.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_first() const noexcept { return has_flag(RATiedFlags::kFirst); }
+
+ //! Tests whether the register (and the instruction it's part of) appears last in the basic block.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_last() const noexcept { return has_flag(RATiedFlags::kLast); }
+
+ //! Tests whether the register should be killed after USEd and/or OUTed.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_kill() const noexcept { return has_flag(RATiedFlags::kKill); }
+
+ //! Tests whether the register is OUT or KILL (used internally by local register allocator).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_out_or_kill() const noexcept { return has_flag(RATiedFlags::kOut | RATiedFlags::kKill); }
+
+ //! Returns a register mask that describes allocable USE registers (Read/ReadWrite access).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask use_reg_mask() const noexcept { return _use_reg_mask; }
+
+ //! Returns a register mask that describes allocable OUT registers (WriteOnly access).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask out_reg_mask() const noexcept { return _out_reg_mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t ref_count() const noexcept { return _ref_count; }
+
+ ASMJIT_INLINE_NODEBUG void add_ref_count(uint32_t n = 1) noexcept { _ref_count = uint8_t(_ref_count + n); }
+
+ //! Tests whether the register must be allocated to a fixed physical register before it's used.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_use_id() const noexcept { return _use_id != Reg::kIdBad; }
+
+ //! Tests whether the register must be allocated to a fixed physical register before it's written.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_out_id() const noexcept { return _out_id != Reg::kIdBad; }
+
+ //! Returns a physical register id used for 'use' operation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t use_id() const noexcept { return _use_id; }
+
+ //! Returns a physical register id used for 'out' operation.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t out_id() const noexcept { return _out_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t use_rewrite_mask() const noexcept { return _use_rewrite_mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t out_rewrite_mask() const noexcept { return _out_rewrite_mask; }
+
+ //! Sets a physical register used for 'use' operation.
+ ASMJIT_INLINE_NODEBUG void set_use_id(uint32_t index) noexcept { _use_id = uint8_t(index); }
+
+ //! Sets a physical register used for 'out' operation.
+ ASMJIT_INLINE_NODEBUG void set_out_id(uint32_t index) noexcept { _out_id = uint8_t(index); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_use_done() const noexcept { return has_flag(RATiedFlags::kUseDone); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_out_done() const noexcept { return has_flag(RATiedFlags::kOutDone); }
+
+ ASMJIT_INLINE_NODEBUG void mark_use_done() noexcept { add_flags(RATiedFlags::kUseDone); }
+
+ ASMJIT_INLINE_NODEBUG void mark_out_done() noexcept { add_flags(RATiedFlags::kOutDone); }
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RADEFS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/rainst_p.h b/3rdparty/asmjit/asmjit/core/rainst_p.h
new file mode 100644
index 00000000000..b6f08fd66d2
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/rainst_p.h
@@ -0,0 +1,438 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RAINST_P_H_INCLUDED
+#define ASMJIT_CORE_RAINST_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compilerdefs.h>
+#include <asmjit/core/radefs_p.h>
+#include <asmjit/core/rareg_p.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/support_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Register allocator's data associated with each `InstNode`.
+class RAInst {
+public:
+ ASMJIT_NONCOPYABLE(RAInst)
+
+ //! \name Members
+ //! \{
+
+ //! Instruction RW flags.
+ InstRWFlags _inst_rw_flags;
+ //! Aggregated RATiedFlags from all operands & instruction specific flags.
+ RATiedFlags _flags;
+ //! Total count of RATiedReg's.
+ uint32_t _tied_total;
+ //! Index of RATiedReg's per register group.
+ RARegIndex _tied_index;
+ //! Count of RATiedReg's per register group.
+ RARegCount _tied_count;
+ //! Number of live, and thus interfering VirtReg's at this point.
+ RALiveCount _live_count;
+ //! Fixed physical registers used.
+ RARegMask _used_regs;
+ //! Clobbered registers (by a function call).
+ RARegMask _clobbered_regs;
+ //! Tied registers.
+ RATiedReg _tied_regs[1];
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline RAInst(InstRWFlags inst_rw_flags, RATiedFlags tied_flags, uint32_t tied_total, const RARegMask& clobbered_regs) noexcept {
+ _inst_rw_flags = inst_rw_flags;
+ _flags = tied_flags;
+ _tied_total = tied_total;
+ _tied_index.reset();
+ _tied_count.reset();
+ _live_count.reset();
+ _used_regs.reset();
+ _clobbered_regs = clobbered_regs;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns instruction RW flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstRWFlags inst_rw_flags() const noexcept { return _inst_rw_flags; };
+
+ //! Tests whether the given `flag` is present in instruction RW flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inst_rw_flag(InstRWFlags flag) const noexcept { return Support::test(_inst_rw_flags, flag); }
+
+ //! Adds `flags` to instruction RW flags.
+ ASMJIT_INLINE_NODEBUG void add_inst_rw_flags(InstRWFlags flags) noexcept { _inst_rw_flags |= flags; }
+
+ //! Returns the instruction flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedFlags flags() const noexcept { return _flags; }
+
+ //! Tests whether the instruction has flag `flag`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ //! Replaces the existing instruction flags with `flags`.
+ ASMJIT_INLINE_NODEBUG void set_flags(RATiedFlags flags) noexcept { _flags = flags; }
+
+ //! Adds instruction `flags` to this RAInst.
+ ASMJIT_INLINE_NODEBUG void add_flags(RATiedFlags flags) noexcept { _flags |= flags; }
+
+ //! Clears instruction `flags` from this RAInst.
+ ASMJIT_INLINE_NODEBUG void clear_flags(RATiedFlags flags) noexcept { _flags &= ~flags; }
+
+ //! Tests whether one operand of this instruction has been patched from Reg to Mem.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_reg_to_mem_patched() const noexcept { return has_flag(RATiedFlags::kInst_RegToMemPatched); }
+
+ //! Tests whether this instruction can be transformed to another instruction if necessary.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_transformable() const noexcept { return has_flag(RATiedFlags::kInst_IsTransformable); }
+
+ //! Returns the associated block with this RAInst.
+ // [[nodiscard]]
+ // ASMJIT_INLINE_NODEBUG RABlock* block() const noexcept { return _block; }
+
+ //! Returns tied registers (all).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* tied_regs() const noexcept { return const_cast<RATiedReg*>(_tied_regs); }
+
+ //! Returns tied registers for a given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* tied_regs(RegGroup group) const noexcept { return const_cast<RATiedReg*>(_tied_regs) + _tied_index.get(group); }
+
+ //! Returns count of all tied registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t tied_count() const noexcept { return _tied_total; }
+
+ //! Returns count of tied registers of a given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t tied_count(RegGroup group) const noexcept { return _tied_count.get(group); }
+
+ //! Returns `RATiedReg` at the given `index`.
+ [[nodiscard]]
+ inline RATiedReg* tied_at(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < _tied_total);
+ return tied_regs() + index;
+ }
+
+ //! Returns `RATiedReg` at the given `index` of the given register `group`.
+ [[nodiscard]]
+ inline RATiedReg* tied_of(RegGroup group, size_t index) const noexcept {
+ ASMJIT_ASSERT(index < _tied_count.get(group));
+ return tied_regs(group) + index;
+ }
+
+ [[nodiscard]]
+ inline const RATiedReg* tied_reg_for_work_reg(RegGroup group, RAWorkReg* work_reg) const noexcept {
+ const RATiedReg* array = tied_regs(group);
+ size_t count = tied_count(group);
+
+ for (size_t i = 0; i < count; i++) {
+ const RATiedReg* tied_reg = &array[i];
+ if (tied_reg->work_reg() == work_reg) {
+ return tied_reg;
+ }
+ }
+
+ return nullptr;
+ }
+
+ inline void set_tied_at(size_t index, RATiedReg& tied) noexcept {
+ ASMJIT_ASSERT(index < _tied_total);
+ _tied_regs[index] = tied;
+ }
+
+ //! \name Static Functions
+ //! \{
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG size_t size_of(uint32_t tied_reg_count) noexcept {
+ return Arena::aligned_size_of<RAInst>() - sizeof(RATiedReg) + tied_reg_count * sizeof(RATiedReg);
+ }
+
+ //! \}
+};
+
+//! A helper class that is used to build an array of RATiedReg items that are then copied to `RAInst`.
+class RAInstBuilder {
+public:
+ ASMJIT_NONCOPYABLE(RAInstBuilder)
+
+ //! \name Members
+ //! \{
+
+ //! Basic block id.
+ RABlockId _basic_block_id;
+ //! Instruction RW flags.
+ InstRWFlags _inst_rw_flags;
+
+ //! Flags combined from all RATiedReg's.
+ RATiedFlags _aggregated_flags;
+ //! Flags that will be cleared before storing the aggregated flags to `RAInst`.
+ RATiedFlags _forbidden_flags;
+ RARegCount _count;
+ RARegsStats _stats;
+
+ RARegMask _used;
+ RARegMask _clobbered;
+
+ //! Current tied register in `_tied_regs`.
+ RATiedReg* _cur;
+ //! Array of temporary tied registers.
+ RATiedReg _tied_regs[128];
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG explicit RAInstBuilder(RABlockId block_id = kBadBlockId) noexcept { reset(block_id); }
+
+ ASMJIT_INLINE_NODEBUG void init(RABlockId block_id) noexcept { reset(block_id); }
+ ASMJIT_INLINE_NODEBUG void reset(RABlockId block_id) noexcept {
+ _basic_block_id = block_id;
+ _inst_rw_flags = InstRWFlags::kNone;
+ _aggregated_flags = RATiedFlags::kNone;
+ _forbidden_flags = RATiedFlags::kNone;
+ _count.reset();
+ _stats.reset();
+ _used.reset();
+ _clobbered.reset();
+ _cur = _tied_regs;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstRWFlags inst_rw_flags() const noexcept { return _inst_rw_flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_inst_rw_flag(InstRWFlags flag) const noexcept { return Support::test(_inst_rw_flags, flag); }
+
+ ASMJIT_INLINE_NODEBUG void add_inst_rw_flags(InstRWFlags flags) noexcept { _inst_rw_flags |= flags; }
+
+ ASMJIT_INLINE_NODEBUG void clear_inst_rw_flags(InstRWFlags flags) noexcept { _inst_rw_flags &= ~flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedFlags aggregated_flags() const noexcept { return _aggregated_flags; }
+
+ ASMJIT_INLINE_NODEBUG void add_aggregated_flags(RATiedFlags flags) noexcept { _aggregated_flags |= flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedFlags forbidden_flags() const noexcept { return _forbidden_flags; }
+
+ ASMJIT_INLINE_NODEBUG void add_forbidden_flags(RATiedFlags flags) noexcept { _forbidden_flags |= flags; }
+
+ //! Returns the number of tied registers added to the builder.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t tied_reg_count() const noexcept { return uint32_t((size_t)(_cur - _tied_regs)); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* begin() noexcept { return _tied_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* end() noexcept { return _cur; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RATiedReg* begin() const noexcept { return _tied_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RATiedReg* end() const noexcept { return _cur; }
+
+ //! Returns `RATiedReg` at the given `index`.
+ [[nodiscard]]
+ inline RATiedReg* operator[](size_t index) noexcept {
+ ASMJIT_ASSERT(index < tied_reg_count());
+ return &_tied_regs[index];
+ }
+
+ //! Returns `RATiedReg` at the given `index`. (const).
+ [[nodiscard]]
+ inline const RATiedReg* operator[](size_t index) const noexcept {
+ ASMJIT_ASSERT(index < tied_reg_count());
+ return &_tied_regs[index];
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ [[nodiscard]]
+ Error add(
+ RAWorkReg* work_reg,
+ RATiedFlags flags,
+ RegMask use_reg_mask, uint32_t use_id, uint32_t use_rewrite_mask,
+ RegMask out_reg_mask, uint32_t out_id, uint32_t out_rewrite_mask,
+ uint32_t rm_size = 0,
+ RAWorkReg* consecutive_parent = nullptr
+ ) noexcept {
+ RegGroup group = work_reg->group();
+ RATiedReg* tied_reg = work_reg->tied_reg();
+
+ if (use_id != Reg::kIdBad) {
+ _stats.make_fixed(group);
+ _used[group] |= Support::bit_mask<RegMask>(use_id);
+ flags |= RATiedFlags::kUseFixed;
+ }
+
+ if (out_id != Reg::kIdBad) {
+ _clobbered[group] |= Support::bit_mask<RegMask>(out_id);
+ flags |= RATiedFlags::kOutFixed;
+ }
+
+ _aggregated_flags |= flags;
+ _stats.make_used(group);
+
+ if (!tied_reg) {
+ // Would happen when the builder is not reset properly after each instruction - so catch that!
+ ASMJIT_ASSERT(tied_reg_count() < ASMJIT_ARRAY_SIZE(_tied_regs));
+
+ tied_reg = _cur++;
+ tied_reg->init(work_reg, flags, use_reg_mask, use_id, use_rewrite_mask, out_reg_mask, out_id, out_rewrite_mask, rm_size, consecutive_parent);
+ work_reg->set_tied_reg(tied_reg);
+
+ _count.add(group);
+ return Error::kOk;
+ }
+ else {
+ if (consecutive_parent != tied_reg->consecutive_parent()) {
+ if (tied_reg->has_consecutive_parent()) {
+ return make_error(Error::kInvalidState);
+ }
+ tied_reg->_consecutive_parent = consecutive_parent;
+ }
+
+ if (use_id != Reg::kIdBad) {
+ if (ASMJIT_UNLIKELY(tied_reg->has_use_id())) {
+ return make_error(Error::kOverlappedRegs);
+ }
+ tied_reg->set_use_id(use_id);
+ }
+
+ if (out_id != Reg::kIdBad) {
+ if (ASMJIT_UNLIKELY(tied_reg->has_out_id())) {
+ return make_error(Error::kOverlappedRegs);
+ }
+ tied_reg->set_out_id(out_id);
+ }
+
+ tied_reg->add_ref_count();
+ tied_reg->add_flags(flags);
+ tied_reg->_use_reg_mask &= use_reg_mask;
+ tied_reg->_use_rewrite_mask |= use_rewrite_mask;
+ tied_reg->_out_reg_mask &= out_reg_mask;
+ tied_reg->_out_rewrite_mask |= out_rewrite_mask;
+ tied_reg->_rm_size = uint8_t(Support::max<uint32_t>(tied_reg->rm_size(), rm_size));
+ return Error::kOk;
+ }
+ }
+
+ [[nodiscard]]
+ Error add_call_arg(RAWorkReg* work_reg, uint32_t use_id) noexcept {
+ ASMJIT_ASSERT(use_id != Reg::kIdBad);
+
+ RATiedFlags flags = RATiedFlags::kUse | RATiedFlags::kRead | RATiedFlags::kUseFixed;
+ RegGroup group = work_reg->group();
+ RegMask allocable = Support::bit_mask<RegMask>(use_id);
+
+ _aggregated_flags |= flags;
+ _used[group] |= allocable;
+ _stats.make_fixed(group);
+ _stats.make_used(group);
+
+ RATiedReg* tied_reg = work_reg->tied_reg();
+ if (!tied_reg) {
+ // Could happen when the builder is not reset properly after each instruction.
+ ASMJIT_ASSERT(tied_reg_count() < ASMJIT_ARRAY_SIZE(_tied_regs));
+
+ tied_reg = _cur++;
+ tied_reg->init(work_reg, flags, allocable, use_id, 0, allocable, Reg::kIdBad, 0);
+ work_reg->set_tied_reg(tied_reg);
+
+ _count.add(group);
+ return Error::kOk;
+ }
+ else {
+ if (tied_reg->has_use_id()) {
+ flags |= RATiedFlags::kDuplicate;
+ tied_reg->_use_reg_mask |= allocable;
+ }
+ else {
+ tied_reg->set_use_id(use_id);
+ tied_reg->_use_reg_mask &= allocable;
+ }
+
+ tied_reg->add_ref_count();
+ tied_reg->add_flags(flags);
+ return Error::kOk;
+ }
+ }
+
+ [[nodiscard]]
+ Error add_call_ret(RAWorkReg* work_reg, uint32_t out_id) noexcept {
+ ASMJIT_ASSERT(out_id != Reg::kIdBad);
+
+ RATiedFlags flags = RATiedFlags::kOut | RATiedFlags::kWrite | RATiedFlags::kOutFixed;
+ RegGroup group = work_reg->group();
+ RegMask out_regs = Support::bit_mask<RegMask>(out_id);
+
+ _aggregated_flags |= flags;
+ _used[group] |= out_regs;
+ _stats.make_fixed(group);
+ _stats.make_used(group);
+
+ RATiedReg* tied_reg = work_reg->tied_reg();
+ if (!tied_reg) {
+ // Could happen when the builder is not reset properly after each instruction.
+ ASMJIT_ASSERT(tied_reg_count() < ASMJIT_ARRAY_SIZE(_tied_regs));
+
+ tied_reg = _cur++;
+ tied_reg->init(work_reg, flags, Support::bit_ones<RegMask>, Reg::kIdBad, 0, out_regs, out_id, 0);
+ work_reg->set_tied_reg(tied_reg);
+
+ _count.add(group);
+ return Error::kOk;
+ }
+ else {
+ if (tied_reg->has_out_id()) {
+ return make_error(Error::kOverlappedRegs);
+ }
+
+ tied_reg->add_ref_count();
+ tied_reg->add_flags(flags);
+ tied_reg->set_out_id(out_id);
+ return Error::kOk;
+ }
+ }
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RAINST_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/ralocal.cpp b/3rdparty/asmjit/asmjit/core/ralocal.cpp
new file mode 100644
index 00000000000..180aa5517e2
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/ralocal.cpp
@@ -0,0 +1,1272 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/ralocal_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// RALocalAllocator - Utilities
+// ============================
+
+static ASMJIT_INLINE RATiedReg* RALocal_findTiedReg(RATiedReg* tied_regs, size_t count, RAWorkReg* work_reg) noexcept {
+ for (size_t i = 0; i < count; i++) {
+ if (tied_regs[i].work_reg() == work_reg) {
+ return &tied_regs[i];
+ }
+ }
+ return nullptr;
+}
+
+// RALocalAllocator - Initialization & Reset
+// =========================================
+
+Error RALocalAllocator::init() noexcept {
+ PhysToWorkMap* phys_to_work_map;
+ WorkToPhysMap* work_to_phys_map;
+
+ phys_to_work_map = _pass.new_phys_to_work_map();
+ work_to_phys_map = _pass.new_work_to_phys_map();
+
+ if (!phys_to_work_map || !work_to_phys_map) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _cur_assignment.init_layout(_pass._phys_reg_count, _pass.work_regs());
+ _cur_assignment.init_maps(phys_to_work_map, work_to_phys_map);
+
+ phys_to_work_map = _pass.new_phys_to_work_map();
+ work_to_phys_map = _pass.new_work_to_phys_map();
+ _tmp_work_to_phys_map = _pass.new_work_to_phys_map();
+
+ if (!phys_to_work_map || !work_to_phys_map || !_tmp_work_to_phys_map) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _tmp_assignment.init_layout(_pass._phys_reg_count, _pass.work_regs());
+ _tmp_assignment.init_maps(phys_to_work_map, work_to_phys_map);
+
+ return Error::kOk;
+}
+
+// RALocalAllocator - Assignment
+// =============================
+
+Error RALocalAllocator::make_initial_assignment() noexcept {
+ FuncNode* func = _pass.func();
+ RABlock* entry = _pass.entry_block();
+
+ Span<BitWord> live_in = entry->live_in();
+ uint32_t multi_work_reg_count = _pass._multi_work_reg_count;
+
+ uint32_t arg_count = func->arg_count();
+ uint32_t iter_count = 1;
+
+ for (uint32_t iter = 0; iter < iter_count; iter++) {
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ // Unassigned argument.
+ const RegOnly& reg_arg = func->arg_pack(arg_index)[value_index];
+ if (!reg_arg.is_reg() || !_cc.is_virt_id_valid(reg_arg.id())) {
+ continue;
+ }
+
+ VirtReg* virt_reg = _cc.virt_reg_by_id(reg_arg.id());
+ RAWorkReg* work_reg = virt_reg->work_reg();
+
+ // Unreferenced argument.
+ if (!work_reg) {
+ continue;
+ }
+
+ // Overwritten argument.
+ RAWorkId work_id = work_reg->work_id();
+ if (uint32_t(work_id) >= multi_work_reg_count || !BitOps::bit_at(live_in, work_id)) {
+ continue;
+ }
+
+ RegGroup group = work_reg->group();
+ if (_cur_assignment.work_to_phys_id(group, work_id) != RAAssignment::kPhysNone) {
+ continue;
+ }
+
+ RegMask allocable_regs = _available_regs[group] & ~_cur_assignment.assigned(group);
+ if (iter == 0) {
+ // First iteration: Try to allocate to home RegId.
+ if (work_reg->has_home_reg_id()) {
+ uint32_t phys_id = work_reg->home_reg_id();
+ if (Support::bit_test(allocable_regs, phys_id)) {
+ _cur_assignment.assign(group, work_id, phys_id, true);
+ _pass._args_assignment.assign_reg_in_pack(arg_index, value_index, work_reg->type(), phys_id, work_reg->type_id());
+ continue;
+ }
+ }
+
+ iter_count = 2;
+ }
+ else {
+ // Second iteration: Pick any other register if the is an unassigned one or assign to stack.
+ if (allocable_regs) {
+ uint32_t phys_id = Support::ctz(allocable_regs);
+ _cur_assignment.assign(group, work_id, phys_id, true);
+ _pass._args_assignment.assign_reg_in_pack(arg_index, value_index, work_reg->type(), phys_id, work_reg->type_id());
+ }
+ else {
+ // This register will definitely need stack, create the slot now and assign also `arg_index`
+ // to it. We will patch `_args_assignment` later after RAStackAllocator finishes.
+ RAStackSlot* slot = _pass.get_or_create_stack_slot(work_reg);
+ if (ASMJIT_UNLIKELY(!slot)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // This means STACK_ARG may be moved to STACK.
+ work_reg->add_flags(RAWorkRegFlags::kStackArgToStack);
+ _pass._num_stack_args_to_stack_slots++;
+ }
+ }
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error RALocalAllocator::replace_assignment(const PhysToWorkMap* phys_to_work_map) noexcept {
+ _cur_assignment.copy_from(phys_to_work_map);
+ return Error::kOk;
+}
+
+Error RALocalAllocator::switch_to_assignment(PhysToWorkMap* dst_phys_to_work_map, Span<const BitWord> live_in, bool dst_is_read_only, bool try_mode) noexcept {
+ RAAssignment dst;
+ RAAssignment& cur = _cur_assignment;
+
+ dst.init_layout(_pass._phys_reg_count, _pass.work_regs());
+ dst.init_maps(dst_phys_to_work_map, _tmp_work_to_phys_map);
+ dst.assign_work_ids_from_phys_ids();
+
+ uint32_t multi_work_reg_count = _pass._multi_work_reg_count;
+
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ // STEP 1
+ // ------
+ //
+ // - KILL all registers that are not live at `dst`,
+ // - SPILL all registers that are not assigned at `dst`.
+
+ if (!try_mode) {
+ Support::BitWordIterator<RegMask> it(cur.assigned(group));
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ RAWorkId work_id = cur.phys_to_work_id(group, phys_id);
+
+ // Must be true as we iterate over assigned registers.
+ ASMJIT_ASSERT(work_id != kBadWorkId);
+
+ // KILL if it's not live on entry.
+ if (uint32_t(work_id) >= multi_work_reg_count || !BitOps::bit_at(live_in, work_id)) {
+ _unassign_reg(group, work_id, phys_id);
+ continue;
+ }
+
+ // SPILL if it's not assigned on entry.
+ uint32_t alt_id = dst.work_to_phys_id(group, work_id);
+ if (alt_id == RAAssignment::kPhysNone) {
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg_by_id(work_id), work_id, phys_id));
+ }
+ }
+ }
+
+ // STEP 2
+ // ------
+ //
+ // - MOVE and SWAP registers from their current assignments into their DST assignments.
+ // - Build `will_load_regs` mask of registers scheduled for `on_load_reg()`.
+
+ // Current run-id (1 means more aggressive decisions).
+ int32_t run_id = -1;
+ // Remaining registers scheduled for `on_load_reg()`.
+ RegMask will_load_regs = 0;
+ // Remaining registers to be allocated in this loop.
+ RegMask affected_regs = dst.assigned(group);
+
+ while (affected_regs) {
+ if (++run_id == 2) {
+ if (!try_mode) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // Stop in `try_mode` if we haven't done anything in past two rounds.
+ break;
+ }
+
+ Support::BitWordIterator<RegMask> it(affected_regs);
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ RegMask phys_mask = Support::bit_mask<RegMask>(phys_id);
+
+ RAWorkId cur_work_id = cur.phys_to_work_id(group, phys_id);
+ RAWorkId dst_work_id = dst.phys_to_work_id(group, phys_id);
+
+ // The register must have assigned `dst_work_id` as we only iterate over assigned regs.
+ ASMJIT_ASSERT(dst_work_id != kBadWorkId);
+ // The register must be crossing multiple basic blocks, otherwise it should never be present in the map.
+ ASMJIT_ASSERT(uint32_t(dst_work_id) < multi_work_reg_count);
+
+ RAWorkReg* dst_work_reg = work_reg_by_id(dst_work_id);
+
+ if (cur_work_id != kBadWorkId) {
+ RAWorkReg* cur_work_reg = work_reg_by_id(cur_work_id);
+
+ // Both assigned.
+ if (cur_work_id != dst_work_id) {
+ // Wait a bit if this is the first run, we may avoid this if `cur_work_id` moves out.
+ if (run_id <= 0) {
+ continue;
+ }
+
+ uint32_t alt_phys_id = cur.work_to_phys_id(group, dst_work_id);
+ if (alt_phys_id == RAAssignment::kPhysNone) {
+ continue;
+ }
+
+ // Reset as we will do some changes to the current assignment.
+ run_id = -1;
+
+ if (_arch_traits->has_inst_reg_swap(group)) {
+ ASMJIT_PROPAGATE(on_swap_reg(group, cur_work_reg, cur_work_id, phys_id, dst_work_reg, dst_work_id, alt_phys_id));
+ }
+ else {
+ // SPILL the reg if it's not dirty in DST, otherwise try to MOVE.
+ if (!cur.is_phys_dirty(group, phys_id)) {
+ _unassign_reg(group, cur_work_id, phys_id);
+ }
+ else {
+ RegMask allocable_regs = _pass._available_regs[group] & ~cur.assigned(group);
+
+ // If possible don't conflict with assigned regs at DST.
+ if (allocable_regs & ~dst.assigned(group)) {
+ allocable_regs &= ~dst.assigned(group);
+ }
+
+ if (allocable_regs) {
+ // MOVE is possible, thus preferred.
+ uint32_t tmp_phys_id = Support::ctz(allocable_regs);
+
+ ASMJIT_PROPAGATE(on_move_reg(group, cur_work_reg, cur_work_id, tmp_phys_id, phys_id));
+ _clobbered_regs[group] |= Support::bit_mask<RegMask>(tmp_phys_id);
+ }
+ else {
+ // MOVE is impossible, must SPILL.
+ ASMJIT_PROPAGATE(on_spill_reg(group, cur_work_reg, cur_work_id, phys_id));
+ }
+ }
+
+ goto Cleared;
+ }
+ }
+ }
+ else {
+Cleared:
+ // DST assigned, CUR unassigned.
+ uint32_t alt_phys_id = cur.work_to_phys_id(group, dst_work_id);
+ if (alt_phys_id == RAAssignment::kPhysNone) {
+ if (BitOps::bit_at(live_in, dst_work_id)) {
+ will_load_regs |= phys_mask; // Scheduled for `on_load_reg()`.
+ }
+ affected_regs &= ~phys_mask; // Unaffected from now.
+ continue;
+ }
+ ASMJIT_PROPAGATE(on_move_reg(group, dst_work_reg, dst_work_id, phys_id, alt_phys_id));
+ }
+
+ // Both DST and CUR assigned to the same reg or CUR just moved to DST.
+ if ((dst.dirty(group) & phys_mask) != (cur.dirty(group) & phys_mask)) {
+ if ((dst.dirty(group) & phys_mask) == 0) {
+ // CUR dirty, DST not dirty (the assert is just to visualize the condition).
+ ASMJIT_ASSERT(!dst.is_phys_dirty(group, phys_id) && cur.is_phys_dirty(group, phys_id));
+
+ // If `dst_is_read_only` is true it means that that block was already processed and we cannot change from
+ // CLEAN to DIRTY. In that case the register has to be saved as it cannot enter the block DIRTY.
+ if (dst_is_read_only) {
+ ASMJIT_PROPAGATE(on_save_reg(group, dst_work_reg, dst_work_id, phys_id));
+ }
+ else {
+ dst.make_dirty(group, dst_work_id, phys_id);
+ }
+ }
+ else {
+ // DST dirty, CUR not dirty (the assert is just to visualize the condition).
+ ASMJIT_ASSERT(dst.is_phys_dirty(group, phys_id) && !cur.is_phys_dirty(group, phys_id));
+
+ cur.make_dirty(group, dst_work_id, phys_id);
+ }
+ }
+
+ // Must match now...
+ ASMJIT_ASSERT(dst.phys_to_work_id(group, phys_id) == cur.phys_to_work_id(group, phys_id));
+ ASMJIT_ASSERT(dst.is_phys_dirty(group, phys_id) == cur.is_phys_dirty(group, phys_id));
+
+ run_id = -1;
+ affected_regs &= ~phys_mask;
+ }
+ }
+
+ // STEP 3
+ // ------
+ //
+ // - Load registers specified by `will_load_regs`.
+
+ {
+ Support::BitWordIterator<RegMask> it(will_load_regs);
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+
+ if (!cur.is_phys_assigned(group, phys_id)) {
+ RAWorkId work_id = dst.phys_to_work_id(group, phys_id);
+
+ // The register must be crossing multiple basic blocks otherwise it should not be in the map.
+ ASMJIT_ASSERT(uint32_t(work_id) < multi_work_reg_count);
+ // The algorithm is broken if it tries to load a register that is not in LIVE-IN.
+ ASMJIT_ASSERT(BitOps::bit_at(live_in, work_id) == true);
+
+ RAWorkReg* work_reg = work_reg_by_id(work_id);
+ ASMJIT_PROPAGATE(on_load_reg(group, work_reg, work_id, phys_id));
+ if (dst.is_phys_dirty(group, phys_id)) {
+ cur.make_dirty(group, work_id, phys_id);
+ }
+ ASMJIT_ASSERT(dst.is_phys_dirty(group, phys_id) == cur.is_phys_dirty(group, phys_id));
+ }
+ else {
+ // Not possible otherwise.
+ ASMJIT_ASSERT(try_mode == true);
+ }
+ }
+ }
+ }
+
+ if (!try_mode) {
+ // Here is a code that dumps the conflicting part if something fails here:
+ // if (!dst.equals(cur)) {
+ // uint32_t phys_total = dst._layout.phys_total;
+ // uint32_t work_count = dst._layout.work_count;
+ //
+ // fprintf(stderr, "Dirty DST=0x%08X CUR=0x%08X\n", dst.dirty(RegGroup::kGp), cur.dirty(RegGroup::kGp));
+ // fprintf(stderr, "Assigned DST=0x%08X CUR=0x%08X\n", dst.assigned(RegGroup::kGp), cur.assigned(RegGroup::kGp));
+ //
+ // for (uint32_t phys_id = 0; phys_id < phys_total; phys_id++) {
+ // uint32_t dst_work_id = dst._phys_to_work_map->work_ids[phys_id];
+ // uint32_t cur_work_id = cur._phys_to_work_map->work_ids[phys_id];
+ // if (dst_work_id != cur_work_id)
+ // fprintf(stderr, "[PhysIdWork] PhysId=%u WorkId[DST(%u) != CUR(%u)]\n", phys_id, dst_work_id, cur_work_id);
+ // }
+ //
+ // for (uint32_t work_id = 0; work_id < work_count; work_id++) {
+ // uint32_t dst_phys_id = dst._work_to_phys_map->phys_ids[work_id];
+ // uint32_t cur_phys_id = cur._work_to_phys_map->phys_ids[work_id];
+ // if (dst_phys_id != cur_phys_id)
+ // fprintf(stderr, "[WorkToPhys] WorkId=%u PhysId[DST(%u) != CUR(%u)]\n", work_id, dst_phys_id, cur_phys_id);
+ // }
+ // }
+ ASMJIT_ASSERT(dst.equals(cur));
+ }
+
+ return Error::kOk;
+}
+
+Error RALocalAllocator::spill_scratch_gp_regs_before_entry(RegMask scratch_regs) noexcept {
+ RegGroup group = RegGroup::kGp;
+ Support::BitWordIterator<RegMask> it(scratch_regs);
+
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ if (_cur_assignment.is_phys_assigned(group, phys_id)) {
+ RAWorkId work_id = _cur_assignment.phys_to_work_id(group, phys_id);
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg_by_id(work_id), work_id, phys_id));
+ }
+ }
+
+ return Error::kOk;
+}
+
+// RALocalAllocator - Allocation
+// =============================
+
+Error RALocalAllocator::alloc_instruction(InstNode* node) noexcept {
+ RAInst* ra_inst = node->pass_data<RAInst>();
+
+ RATiedReg* out_tied_regs[Globals::kMaxPhysRegs];
+ RATiedReg* dup_tied_regs[Globals::kMaxPhysRegs];
+ RATiedReg* consecutive_regs[kMaxConsecutiveRegs];
+
+ // The cursor must point to the previous instruction for a possible instruction insertion.
+ _cc.set_cursor(node->prev());
+
+ _node = node;
+ _ra_inst = ra_inst;
+ _tied_total = ra_inst->_tied_total;
+ _tied_count = ra_inst->_tied_count;
+
+ // Whether we already replaced register operand with memory operand.
+ bool rm_allocated = false;
+
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ uint32_t i, count = this->tied_count(group);
+ RATiedReg* tied_regs = this->tied_regs(group);
+
+ RegMask will_use = _ra_inst->_used_regs[group];
+ RegMask will_out = _ra_inst->_clobbered_regs[group];
+ RegMask will_free = 0;
+
+ uint32_t use_pending_count = count;
+ uint32_t out_tied_count = 0;
+ uint32_t dup_tied_count = 0;
+ uint32_t consecutive_mask = 0;
+
+ // STEP 1
+ // ------
+ //
+ // Calculate `will_use` and `will_free` masks based on tied registers we have. In addition, aggregate information
+ // regarding consecutive registers used by this instruction. We need that to make USE/OUT assignments.
+ //
+ // We don't do any assignment decisions at this stage as we just need to collect some information first. Then,
+ // after we populate all masks needed we can finally make some decisions in the second loop. The main reason
+ // for this is that we really need `will_free` to make assignment decisions for `will_use`, because if we mark
+ // some registers that will be freed, we can consider them in decision making afterwards.
+
+ for (i = 0; i < count; i++) {
+ RATiedReg* tied_reg = &tied_regs[i];
+
+ if (tied_reg->has_any_consecutive_flag()) {
+ uint32_t consecutive_offset = tied_reg->is_lead_consecutive() ? uint32_t(0) : tied_reg->consecutive_data();
+
+ if (ASMJIT_UNLIKELY(Support::bit_test(consecutive_mask, consecutive_offset))) {
+ return make_error(Error::kInvalidState);
+ }
+
+ consecutive_mask |= Support::bit_mask<uint32_t>(consecutive_offset);
+ consecutive_regs[consecutive_offset] = tied_reg;
+ }
+
+ // Add OUT and KILL to `out_pending_count` for CLOBBERing and/or OUT assignment.
+ if (tied_reg->is_out_or_kill()) {
+ out_tied_regs[out_tied_count++] = tied_reg;
+ }
+
+ if (tied_reg->is_duplicate()) {
+ dup_tied_regs[dup_tied_count++] = tied_reg;
+ }
+
+ if (!tied_reg->is_use()) {
+ tied_reg->mark_use_done();
+ use_pending_count--;
+ continue;
+ }
+
+ // Don't assign anything here if this is a consecutive USE - we will handle this in STEP 2 instead.
+ if (tied_reg->is_use_consecutive()) {
+ continue;
+ }
+
+ RAWorkReg* work_reg = tied_reg->work_reg();
+ RAWorkId work_id = work_reg->work_id();
+ uint32_t assigned_id = _cur_assignment.work_to_phys_id(group, work_id);
+
+ if (tied_reg->has_use_id()) {
+ // If the register has `use_id` it means it can only be allocated in that register.
+ RegMask use_mask = Support::bit_mask<RegMask>(tied_reg->use_id());
+
+ // RAInstBuilder must have collected `used_regs` on-the-fly.
+ ASMJIT_ASSERT((will_use & use_mask) != 0);
+
+ if (assigned_id == tied_reg->use_id()) {
+ // If the register is already allocated in this one, mark it done and continue.
+ tied_reg->mark_use_done();
+ if (tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, work_id, assigned_id);
+ }
+ use_pending_count--;
+ will_use |= use_mask;
+ }
+ else {
+ will_free |= use_mask & _cur_assignment.assigned(group);
+ }
+ }
+ else {
+ // Check if the register must be moved to `allocable_regs`.
+ RegMask allocable_regs = tied_reg->use_reg_mask();
+ if (assigned_id != RAAssignment::kPhysNone) {
+ RegMask assigned_mask = Support::bit_mask<RegMask>(assigned_id);
+ if ((allocable_regs & ~will_use) & assigned_mask) {
+ tied_reg->set_use_id(assigned_id);
+ tied_reg->mark_use_done();
+ if (tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, work_id, assigned_id);
+ }
+ use_pending_count--;
+ will_use |= assigned_mask;
+ }
+ else {
+ will_free |= assigned_mask;
+ }
+ }
+ }
+ }
+
+ // STEP 2
+ // ------
+ //
+ // Verify that all the consecutive registers are really consecutive. Terminate if there is a gap. In addition,
+ // decide which USE ids will be used in case that this consecutive sequence is USE (OUT registers are allocated
+ // in a different step).
+ uint32_t consecutive_count = 0;
+
+ if (consecutive_mask) {
+ if ((consecutive_mask & (consecutive_mask + 1u)) != 0) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // Count of trailing ones is the count of consecutive registers. There cannot be gap.
+ consecutive_count = Support::ctz(~consecutive_mask);
+
+ // Prioritize allocation that would result in least moves even when moving registers away from their homes.
+ RATiedReg* lead = consecutive_regs[0];
+
+ // Assign the best possible USE Ids to all consecutives.
+ if (lead->is_use_consecutive()) {
+ uint32_t best_score = 0;
+ uint32_t best_lead_reg = 0xFFFFFFFF;
+ RegMask allocable_regs = (_available_regs[group] | will_free) & ~will_use;
+
+ uint32_t assignments[kMaxConsecutiveRegs];
+
+ for (i = 0; i < consecutive_count; i++) {
+ assignments[i] = _cur_assignment.work_to_phys_id(group, consecutive_regs[i]->work_reg()->work_id());
+ }
+
+ Support::BitWordIterator<uint32_t> it(lead->use_reg_mask());
+ while (it.has_next()) {
+ uint32_t reg_index = it.next();
+ if (Support::bit_test(lead->use_reg_mask(), reg_index)) {
+ uint32_t score = 15;
+
+ for (i = 0; i < consecutive_count; i++) {
+ uint32_t consecutive_index = reg_index + i;
+ if (!Support::bit_test(allocable_regs, consecutive_index)) {
+ score = 0;
+ break;
+ }
+
+ RAWorkReg* work_reg = consecutive_regs[i]->work_reg();
+ score += uint32_t(work_reg->home_reg_id() == consecutive_index);
+ score += uint32_t(assignments[i] == consecutive_index) * 2;
+ }
+
+ if (score > best_score) {
+ best_score = score;
+ best_lead_reg = reg_index;
+ }
+ }
+ }
+
+ if (best_lead_reg == 0xFFFFFFFF) {
+ return make_error(Error::kConsecutiveRegsAllocation);
+ }
+
+ for (i = 0; i < consecutive_count; i++) {
+ uint32_t consecutive_index = best_lead_reg + i;
+
+ RATiedReg* tied_reg = consecutive_regs[i];
+ RegMask use_mask = Support::bit_mask<uint32_t>(consecutive_index);
+
+ RAWorkReg* work_reg = tied_reg->work_reg();
+ RAWorkId work_id = work_reg->work_id();
+ uint32_t assigned_id = _cur_assignment.work_to_phys_id(group, work_id);
+
+ tied_reg->set_use_id(consecutive_index);
+
+ if (assigned_id == consecutive_index) {
+ // If the register is already allocated in this one, mark it done and continue.
+ tied_reg->mark_use_done();
+ if (tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, work_id, assigned_id);
+ }
+ use_pending_count--;
+ will_use |= use_mask;
+ }
+ else {
+ will_use |= use_mask;
+ will_free |= use_mask & _cur_assignment.assigned(group);
+ }
+ }
+ }
+ }
+
+ // STEP 3
+ // ------
+ //
+ // Do some decision making to find the best candidates of registers that need to be assigned, moved, and/or
+ // spilled. Only USE registers are considered here, OUT will be decided later after all CLOBBERed and OUT
+ // registers are unassigned.
+
+ if (use_pending_count) {
+ // TODO: Not sure `live_regs` should be used, maybe will_use and will_free would be enough and much more clear.
+
+ // All registers that are currently alive without registers that will be freed.
+ RegMask live_regs = _cur_assignment.assigned(group) & ~will_free;
+
+ for (i = 0; i < count; i++) {
+ RATiedReg* tied_reg = &tied_regs[i];
+ if (tied_reg->is_use_done()) {
+ continue;
+ }
+
+ RAWorkReg* work_reg = tied_reg->work_reg();
+ RAWorkId work_id = work_reg->work_id();
+ uint32_t assigned_id = _cur_assignment.work_to_phys_id(group, work_id);
+
+ // REG/MEM: Patch register operand to memory operand if not allocated.
+ if (!rm_allocated && tied_reg->has_use_rm()) {
+ if (assigned_id == RAAssignment::kPhysNone && Support::is_power_of_2(tied_reg->use_rewrite_mask())) {
+ uint32_t op_index = Support::ctz(tied_reg->use_rewrite_mask()) / uint32_t(sizeof(Operand) / sizeof(uint32_t));
+ uint32_t rm_size = tied_reg->rm_size();
+
+ if (rm_size <= work_reg->virt_reg()->virt_size()) {
+ Operand& op = node->operands()[op_index];
+ op = _pass.work_reg_as_mem(work_reg);
+
+ // NOTE: We cannot use `x86::Mem::set_size()` from here, so let's manipulate the signature directly.
+ op._signature.set_size(rm_size);
+
+ tied_reg->_use_rewrite_mask = 0;
+
+ tied_reg->mark_use_done();
+ ra_inst->add_flags(RATiedFlags::kInst_RegToMemPatched);
+ use_pending_count--;
+
+ rm_allocated = true;
+ continue;
+ }
+ }
+ }
+
+ if (!tied_reg->has_use_id()) {
+ // DECIDE where to assign the USE register.
+ RegMask allocable_regs = tied_reg->use_reg_mask() & ~(will_free | will_use);
+ uint32_t use_id = decide_on_assignment(group, work_reg, assigned_id, allocable_regs);
+
+ RegMask use_mask = Support::bit_mask<RegMask>(use_id);
+ will_use |= use_mask;
+ will_free |= use_mask & live_regs;
+ tied_reg->set_use_id(use_id);
+
+ if (assigned_id != RAAssignment::kPhysNone) {
+ RegMask assigned_mask = Support::bit_mask<RegMask>(assigned_id);
+
+ will_free |= assigned_mask;
+ live_regs &= ~assigned_mask;
+
+ // OPTIMIZATION: Assign the USE register here if it's possible.
+ if (!(live_regs & use_mask)) {
+ ASMJIT_PROPAGATE(on_move_reg(group, work_reg, work_id, use_id, assigned_id));
+ tied_reg->mark_use_done();
+ if (tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, work_id, use_id);
+ }
+ use_pending_count--;
+ }
+ }
+ else {
+ // OPTIMIZATION: Assign the USE register here if it's possible.
+ if (!(live_regs & use_mask)) {
+ ASMJIT_PROPAGATE(on_load_reg(group, work_reg, work_id, use_id));
+ tied_reg->mark_use_done();
+ if (tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, work_id, use_id);
+ }
+ use_pending_count--;
+ }
+ }
+
+ live_regs |= use_mask;
+ }
+ }
+ }
+
+ // Initially all used regs will be marked as clobbered.
+ RegMask clobbered_by_inst = will_use | will_out;
+
+ // STEP 4
+ // ------
+ //
+ // Free all registers that we marked as `will_free`. Only registers that are not USEd by the instruction are
+ // considered as we don't want to free regs we need.
+
+ if (will_free) {
+ RegMask allocable_regs = _available_regs[group] & ~(_cur_assignment.assigned(group) | will_free | will_use | will_out);
+ Support::BitWordIterator<RegMask> it(will_free);
+
+ do {
+ uint32_t assigned_id = it.next();
+ if (_cur_assignment.is_phys_assigned(group, assigned_id)) {
+ RAWorkId work_id = _cur_assignment.phys_to_work_id(group, assigned_id);
+ RAWorkReg* work_reg = work_reg_by_id(work_id);
+
+ // DECIDE whether to MOVE or SPILL.
+ if (allocable_regs) {
+ uint32_t reassigned_id = decide_on_reassignment(group, work_reg, assigned_id, allocable_regs, ra_inst);
+ if (reassigned_id != RAAssignment::kPhysNone) {
+ ASMJIT_PROPAGATE(on_move_reg(group, work_reg, work_id, reassigned_id, assigned_id));
+ allocable_regs ^= Support::bit_mask<RegMask>(reassigned_id);
+ _clobbered_regs[group] |= Support::bit_mask<RegMask>(reassigned_id);
+ continue;
+ }
+ }
+
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg, work_id, assigned_id));
+ }
+ } while (it.has_next());
+ }
+
+ // STEP 5
+ // ------
+ //
+ // ALLOCATE / SHUFFLE all registers that we marked as `will_use` and weren't allocated yet. This is a bit
+ // complicated as the allocation is iterative. In some cases we have to wait before allocating a particular
+ // physical register as it's still occupied by some other one, which we need to move before we can use it.
+ // In this case we skip it and allocate another one instead (making it free for the next iteration).
+ //
+ // NOTE: Iterations are mostly important for complicated allocations like function calls, where there can
+ // be up to N registers used at once. Asm instructions won't run the loop more than once in 99.9% of cases
+ // as they use 2 to 3 registers in average.
+
+ if (use_pending_count) {
+ bool must_swap = false;
+ do {
+ uint32_t old_pending_count = use_pending_count;
+
+ for (i = 0; i < count; i++) {
+ RATiedReg* this_tied_reg = &tied_regs[i];
+ if (this_tied_reg->is_use_done()) {
+ continue;
+ }
+
+ RAWorkReg* this_work_reg = this_tied_reg->work_reg();
+ RAWorkId this_work_id = this_work_reg->work_id();
+ uint32_t this_phys_id = _cur_assignment.work_to_phys_id(group, this_work_id);
+
+ // This would be a bug, fatal one!
+ uint32_t target_phys_id = this_tied_reg->use_id();
+ ASMJIT_ASSERT(target_phys_id != this_phys_id);
+
+ RAWorkId target_work_id = _cur_assignment.phys_to_work_id(group, target_phys_id);
+ if (target_work_id != kBadWorkId) {
+ RAWorkReg* target_work_reg = work_reg_by_id(target_work_id);
+
+ // Swapping two registers can solve two allocation tasks by emitting just a single instruction. However,
+ // swap is only available on few architectures and it's definitely not available for each register group.
+ // Calling `on_swap_reg()` before checking these would be fatal.
+ if (_arch_traits->has_inst_reg_swap(group) && this_phys_id != RAAssignment::kPhysNone) {
+ ASMJIT_PROPAGATE(on_swap_reg(group, this_work_reg, this_work_id, this_phys_id, target_work_reg, target_work_id, target_phys_id));
+
+ this_tied_reg->mark_use_done();
+ if (this_tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, this_work_id, target_phys_id);
+ }
+ use_pending_count--;
+
+ // Double-hit.
+ RATiedReg* target_tied_reg = RALocal_findTiedReg(tied_regs, count, target_work_reg);
+ if (target_tied_reg && target_tied_reg->use_id() == this_phys_id) {
+ target_tied_reg->mark_use_done();
+ if (target_tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, target_work_id, this_phys_id);
+ }
+ use_pending_count--;
+ }
+ continue;
+ }
+
+ if (!must_swap) {
+ continue;
+ }
+
+ // Only branched here if the previous iteration did nothing. This is essentially a SWAP operation without
+ // having a dedicated instruction for that purpose (vector registers, etc...). The simplest way to handle
+ // such case is to SPILL the target register or MOVE it to another register so the loop can continue.
+ RegMask available_regs = _available_regs[group] & ~_cur_assignment.assigned(group);
+ if (available_regs) {
+ uint32_t tmp_reg_id = pick_best_suitable_register(group, available_regs);
+ ASMJIT_ASSERT(tmp_reg_id != RAAssignment::kPhysNone);
+
+ ASMJIT_PROPAGATE(on_move_reg(group, this_work_reg, this_work_id, tmp_reg_id, this_phys_id));
+ _clobbered_regs[group] |= Support::bit_mask<RegMask>(tmp_reg_id);
+
+ // NOTE: This register is not done, we have just moved it to another physical spot, and we will have to
+ // move it again into the correct spot once it's free (since this is essentially doing a swap operation
+ // via moves).
+ break;
+ }
+
+ ASMJIT_PROPAGATE(on_spill_reg(group, target_work_reg, target_work_id, target_phys_id));
+ }
+
+ if (this_phys_id != RAAssignment::kPhysNone) {
+ ASMJIT_PROPAGATE(on_move_reg(group, this_work_reg, this_work_id, target_phys_id, this_phys_id));
+
+ this_tied_reg->mark_use_done();
+ if (this_tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, this_work_id, target_phys_id);
+ }
+ use_pending_count--;
+ }
+ else {
+ ASMJIT_PROPAGATE(on_load_reg(group, this_work_reg, this_work_id, target_phys_id));
+
+ this_tied_reg->mark_use_done();
+ if (this_tied_reg->is_write()) {
+ _cur_assignment.make_dirty(group, this_work_id, target_phys_id);
+ }
+ use_pending_count--;
+ }
+ }
+
+ must_swap = (old_pending_count == use_pending_count);
+ } while (use_pending_count);
+ }
+
+ // STEP 6
+ // ------
+ //
+ // KILL registers marked as KILL/OUT.
+
+ uint32_t out_pending_count = out_tied_count;
+ if (out_tied_count) {
+ for (i = 0; i < out_tied_count; i++) {
+ RATiedReg* tied_reg = out_tied_regs[i];
+
+ RAWorkReg* work_reg = tied_reg->work_reg();
+ RAWorkId work_id = work_reg->work_id();
+ uint32_t phys_id = _cur_assignment.work_to_phys_id(group, work_id);
+
+ // Must check if it's allocated as KILL can be related to OUT (like KILL immediately after OUT, which could
+ // mean the register is not assigned).
+ if (phys_id != RAAssignment::kPhysNone) {
+ _unassign_reg(group, work_id, phys_id);
+ will_out &= ~Support::bit_mask<RegMask>(phys_id);
+ }
+
+ // We still maintain number of pending registers for OUT assignment. So, if this is only KILL, not OUT, we
+ // can safely decrement it.
+ out_pending_count -= !tied_reg->is_out();
+ }
+ }
+
+ // STEP 7
+ // ------
+ //
+ // SPILL registers that will be CLOBBERed. Since OUT and KILL were already processed this is used mostly to
+ // handle function CALLs.
+
+ if (will_out) {
+ Support::BitWordIterator<RegMask> it(will_out);
+ do {
+ uint32_t phys_id = it.next();
+ RAWorkId work_id = _cur_assignment.phys_to_work_id(group, phys_id);
+
+ if (work_id == kBadWorkId) {
+ continue;
+ }
+
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg_by_id(work_id), work_id, phys_id));
+ } while (it.has_next());
+ }
+
+ // STEP 8
+ // ------
+ //
+ // Duplication.
+
+ for (i = 0; i < dup_tied_count; i++) {
+ RATiedReg* tied_reg = dup_tied_regs[i];
+ RAWorkReg* work_reg = tied_reg->work_reg();
+ uint32_t src_id = tied_reg->use_id();
+
+ Support::BitWordIterator<RegMask> it(tied_reg->use_reg_mask());
+ while (it.has_next()) {
+ uint32_t dst_id = it.next();
+ if (dst_id == src_id) {
+ continue;
+ }
+ ASMJIT_PROPAGATE(_pass.emit_move(work_reg, dst_id, src_id));
+ }
+ }
+
+ // STEP 9
+ // ------
+ //
+ // Vector registers can be clobbered partially by invoke - find if that's the case and clobber when necessary.
+
+ if (node->is_invoke() && group == RegGroup::kVec) {
+ const InvokeNode* invoke_node = node->as<InvokeNode>();
+
+ RegMask maybe_clobbered_regs = invoke_node->detail().call_conv().preserved_regs(group) & _cur_assignment.assigned(group);
+ if (maybe_clobbered_regs) {
+ uint32_t save_restore_vec_size = invoke_node->detail().call_conv().save_restore_reg_size(group);
+ Support::BitWordIterator<RegMask> it(maybe_clobbered_regs);
+
+ do {
+ uint32_t phys_id = it.next();
+ RAWorkId work_id = _cur_assignment.phys_to_work_id(group, phys_id);
+
+ RAWorkReg* work_reg = work_reg_by_id(work_id);
+ uint32_t virt_size = work_reg->virt_reg()->virt_size();
+
+ if (virt_size > save_restore_vec_size) {
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg, work_id, phys_id));
+ }
+
+ } while (it.has_next());
+ }
+ }
+
+ // STEP 10
+ // -------
+ //
+ // Assign OUT registers.
+
+ if (out_pending_count) {
+ // Live registers, we need a separate register (outside of `_cur_assignment) to hold these because of KILLed
+ // registers. If we KILL a register here it will go out from `_cur_assignment`, but we cannot assign to it in
+ // here.
+ RegMask live_regs = _cur_assignment.assigned(group);
+
+ // Must avoid as they have been already OUTed (added during the loop).
+ RegMask out_regs = 0;
+
+ // Must avoid as they collide with already allocated ones.
+ RegMask avoid_regs = will_use & ~clobbered_by_inst;
+
+ // Assign the best possible OUT ids of all consecutives.
+ if (consecutive_count) {
+ RATiedReg* lead = consecutive_regs[0];
+ if (lead->is_out_consecutive()) {
+ uint32_t best_score = 0;
+ uint32_t best_lead_reg = 0xFFFFFFFF;
+ RegMask allocable_regs = _available_regs[group] & ~(out_regs | avoid_regs);
+
+ Support::BitWordIterator<uint32_t> it(lead->out_reg_mask());
+ while (it.has_next()) {
+ uint32_t reg_index = it.next();
+ if (Support::bit_test(lead->out_reg_mask(), reg_index)) {
+ uint32_t score = 15;
+
+ for (i = 0; i < consecutive_count; i++) {
+ uint32_t consecutive_index = reg_index + i;
+ if (!Support::bit_test(allocable_regs, consecutive_index)) {
+ score = 0;
+ break;
+ }
+
+ RAWorkReg* work_reg = consecutive_regs[i]->work_reg();
+ score += uint32_t(work_reg->home_reg_id() == consecutive_index);
+ }
+
+ if (score > best_score) {
+ best_score = score;
+ best_lead_reg = reg_index;
+ }
+ }
+ }
+
+ if (best_lead_reg == 0xFFFFFFFF) {
+ return make_error(Error::kConsecutiveRegsAllocation);
+ }
+
+ for (i = 0; i < consecutive_count; i++) {
+ uint32_t consecutive_index = best_lead_reg + i;
+ RATiedReg* tied_reg = consecutive_regs[i];
+ tied_reg->set_out_id(consecutive_index);
+ }
+ }
+ }
+
+ // Allocate OUT registers.
+ for (i = 0; i < out_tied_count; i++) {
+ RATiedReg* tied_reg = out_tied_regs[i];
+ if (!tied_reg->is_out()) {
+ continue;
+ }
+
+ RegMask avoid_out = avoid_regs;
+ if (tied_reg->is_unique()) {
+ avoid_out |= will_use;
+ }
+
+ RAWorkReg* work_reg = tied_reg->work_reg();
+ RAWorkId work_id = work_reg->work_id();
+ uint32_t assigned_id = _cur_assignment.work_to_phys_id(group, work_id);
+
+ if (assigned_id != RAAssignment::kPhysNone) {
+ _unassign_reg(group, work_id, assigned_id);
+ }
+
+ uint32_t phys_id = tied_reg->out_id();
+ if (phys_id == RAAssignment::kPhysNone) {
+ RegMask allocable_regs = tied_reg->out_reg_mask() & ~(out_regs | avoid_out);
+
+ if (!(allocable_regs & ~live_regs)) {
+ // There are no more registers, decide which one to spill.
+ RAWorkId spill_work_id;
+ phys_id = decide_on_spill_for(group, work_reg, allocable_regs & live_regs, &spill_work_id);
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg_by_id(spill_work_id), spill_work_id, phys_id));
+ }
+ else {
+ phys_id = decide_on_assignment(group, work_reg, RAAssignment::kPhysNone, allocable_regs & ~live_regs);
+ }
+ }
+
+ // OUTs are CLOBBERed thus cannot be ASSIGNed right now.
+ ASMJIT_ASSERT(!_cur_assignment.is_phys_assigned(group, phys_id));
+
+ if (!tied_reg->is_kill()) {
+ ASMJIT_PROPAGATE(_assign_reg(group, work_id, phys_id, true));
+ }
+
+ tied_reg->set_out_id(phys_id);
+ tied_reg->mark_out_done();
+
+ out_regs |= Support::bit_mask<RegMask>(phys_id);
+ live_regs &= ~Support::bit_mask<RegMask>(phys_id);
+ out_pending_count--;
+ }
+
+ clobbered_by_inst |= out_regs;
+ ASMJIT_ASSERT(out_pending_count == 0);
+ }
+
+ _clobbered_regs[group] |= clobbered_by_inst;
+ }
+
+ return Error::kOk;
+}
+
+Error RALocalAllocator::spill_after_allocation(InstNode* node) noexcept {
+ // This is experimental feature that would spill registers that don't have home-id and are last in this basic block.
+ // This prevents saving these regs in other basic blocks and then restoring them (mostly relevant for loops).
+ RAInst* ra_inst = node->pass_data<RAInst>();
+ uint32_t count = ra_inst->tied_count();
+
+ for (uint32_t i = 0; i < count; i++) {
+ RATiedReg* tied_reg = ra_inst->tied_at(i);
+
+ if (tied_reg->is_last()) {
+ RAWorkReg* work_reg = tied_reg->work_reg();
+
+ if (!work_reg->has_home_reg_id()) {
+ RAWorkId work_id = work_reg->work_id();
+ RegGroup group = work_reg->group();
+ uint32_t assigned_id = _cur_assignment.work_to_phys_id(group, work_id);
+
+ if (assigned_id != RAAssignment::kPhysNone) {
+ _cc.set_cursor(node);
+ ASMJIT_PROPAGATE(on_spill_reg(group, work_reg, work_id, assigned_id));
+ }
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error RALocalAllocator::alloc_branch(InstNode* node, RABlock* target, RABlock* cont) noexcept {
+ // TODO: This should be used to make the branch allocation better.
+ Support::maybe_unused(cont);
+
+ // The cursor must point to the previous instruction for a possible instruction insertion.
+ _cc.set_cursor(node->prev());
+
+ // Use TryMode of `switch_to_assignment()` if possible.
+ if (target->has_entry_assignment()) {
+ ASMJIT_PROPAGATE(switch_to_assignment(target->entry_phys_to_work_map(), target->live_in(), target->is_allocated(), true));
+ }
+
+ ASMJIT_PROPAGATE(alloc_instruction(node));
+ ASMJIT_PROPAGATE(spill_regs_before_entry(target));
+
+ if (target->has_entry_assignment()) {
+ BaseNode* injection_point = _pass._injection_end->prev();
+ BaseNode* prev_cursor = _cc.set_cursor(injection_point);
+
+ _tmp_assignment.copy_from(_cur_assignment);
+ ASMJIT_PROPAGATE(switch_to_assignment(target->entry_phys_to_work_map(), target->live_in(), target->is_allocated(), false));
+
+ BaseNode* cur_cursor = _cc.cursor();
+ if (cur_cursor != injection_point) {
+ // Additional instructions emitted to switch from the current state to the `target` state. This means
+ // that we have to move these instructions into an independent code block and patch the jump location.
+ Operand& target_op = node->op(node->op_count() - 1);
+ if (ASMJIT_UNLIKELY(!target_op.is_label())) {
+ return make_error(Error::kInvalidState);
+ }
+
+ Label trampoline = _cc.new_label();
+ Label saved_target = target_op.as<Label>();
+
+ // Patch `target` to point to the `trampoline` we just created.
+ target_op = trampoline;
+
+ // Clear a possible SHORT form as we have no clue now if the SHORT form would be encodable after patching
+ // the target to `trampoline` (X86 specific).
+ node->clear_options(InstOptions::kShortForm);
+
+ // Finalize the switch assignment sequence.
+ ASMJIT_PROPAGATE(_pass.emit_jump(saved_target));
+ _cc.set_cursor(injection_point);
+ _cc.bind(trampoline);
+
+ if (_pass._injection_start == nullptr) {
+ _pass._injection_start = injection_point->next();
+ }
+ }
+
+ _cc.set_cursor(prev_cursor);
+ _cur_assignment.swap(_tmp_assignment);
+ }
+ else {
+ ASMJIT_PROPAGATE(_pass.set_block_entry_assignment(target, block(), _cur_assignment));
+ }
+
+ return Error::kOk;
+}
+
+Error RALocalAllocator::alloc_jump_table(InstNode* node, Span<RABlock*> targets, RABlock* cont) noexcept {
+ // TODO: Do we really need to use `cont`?
+ Support::maybe_unused(cont);
+
+ if (targets.is_empty()) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // The cursor must point to the previous instruction for a possible instruction insertion.
+ _cc.set_cursor(node->prev());
+
+ // All `targets` should have the same shared_assignment_id, we just read the first.
+ RABlock* any_target = targets[0];
+ if (!any_target->has_shared_assignment_id()) {
+ return make_error(Error::kInvalidState);
+ }
+
+ RASharedAssignment& shared_assignment = _pass._shared_assignments[any_target->shared_assignment_id()];
+
+ ASMJIT_PROPAGATE(alloc_instruction(node));
+
+ if (!shared_assignment.is_empty()) {
+ ASMJIT_PROPAGATE(switch_to_assignment(
+ shared_assignment.phys_to_work_map(),
+ shared_assignment.live_in(),
+ true, // Read-only.
+ false // Try-mode.
+ ));
+ }
+
+ ASMJIT_PROPAGATE(spill_regs_before_entry(any_target));
+
+ if (shared_assignment.is_empty()) {
+ ASMJIT_PROPAGATE(_pass.set_block_entry_assignment(any_target, block(), _cur_assignment));
+ }
+
+ return Error::kOk;
+}
+
+// RALocalAllocator - Decision Making
+// ==================================
+
+uint32_t RALocalAllocator::decide_on_assignment(RegGroup group, RAWorkReg* work_reg, uint32_t phys_id, RegMask allocable_regs) const noexcept {
+ ASMJIT_ASSERT(allocable_regs != 0);
+ Support::maybe_unused(group, phys_id);
+
+ // Prefer home register id, if possible.
+ if (work_reg->has_home_reg_id()) {
+ uint32_t home_id = work_reg->home_reg_id();
+ if (Support::bit_test(allocable_regs, home_id)) {
+ return home_id;
+ }
+ }
+
+ // Prefer registers used upon block entries.
+ RegMask previously_assigned_regs = work_reg->allocated_mask();
+ if (allocable_regs & previously_assigned_regs) {
+ allocable_regs &= previously_assigned_regs;
+ }
+
+ return pick_best_suitable_register(group, allocable_regs);
+}
+
+uint32_t RALocalAllocator::decide_on_reassignment(RegGroup group, RAWorkReg* work_reg, uint32_t phys_id, RegMask allocable_regs, RAInst* ra_inst) const noexcept {
+ ASMJIT_ASSERT(allocable_regs != 0);
+ Support::maybe_unused(phys_id);
+
+ // Prefer reassignment back to HomeId, if possible.
+ if (work_reg->has_home_reg_id()) {
+ if (Support::bit_test(allocable_regs, work_reg->home_reg_id())) {
+ return work_reg->home_reg_id();
+ }
+ }
+
+ // Prefer assignment to a temporary register in case this register is killed by the instruction (or has an out slot).
+ const RATiedReg* tied_reg = ra_inst->tied_reg_for_work_reg(group, work_reg);
+ if (tied_reg && tied_reg->is_out_or_kill()) {
+ return Support::ctz(allocable_regs);
+ }
+
+ // Prefer reassignment if this register is only used within a single basic block.
+ if (work_reg->is_within_single_basic_block()) {
+ RegMask filtered_regs = allocable_regs & ~work_reg->clobber_survival_mask();
+ if (filtered_regs) {
+ return pick_best_suitable_register(group, filtered_regs);
+ }
+ }
+
+ // TODO: [Register Allocator] This could be improved.
+
+ // Decided to SPILL.
+ return RAAssignment::kPhysNone;
+}
+
+uint32_t RALocalAllocator::decide_on_spill_for(RegGroup group, RAWorkReg* work_reg, RegMask spillable_regs, RAWorkId* spill_work_id) const noexcept {
+ // May be used in the future to decide which register would be best to spill so `work_id` can be assigned.
+ Support::maybe_unused(work_reg);
+ ASMJIT_ASSERT(spillable_regs != 0);
+
+ Support::BitWordIterator<RegMask> it(spillable_regs);
+ uint32_t best_phys_id = it.next();
+ RAWorkId best_work_id = _cur_assignment.phys_to_work_id(group, best_phys_id);
+
+ // Avoid calculating the cost model if there is only one spillable register.
+ if (it.has_next()) {
+ uint32_t best_cost = calc_spill_cost(group, work_reg_by_id(best_work_id), best_phys_id);
+ do {
+ uint32_t local_phys_id = it.next();
+ RAWorkId local_work_id = _cur_assignment.phys_to_work_id(group, local_phys_id);
+ uint32_t local_cost = calc_spill_cost(group, work_reg_by_id(local_work_id), local_phys_id);
+
+ if (local_cost < best_cost) {
+ best_cost = local_cost;
+ best_phys_id = local_phys_id;
+ best_work_id = local_work_id;
+ }
+ } while (it.has_next());
+ }
+
+ *spill_work_id = best_work_id;
+ return best_phys_id;
+}
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/core/ralocal_p.h b/3rdparty/asmjit/asmjit/core/ralocal_p.h
new file mode 100644
index 00000000000..3a8da4db29a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/ralocal_p.h
@@ -0,0 +1,302 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RALOCAL_P_H_INCLUDED
+#define ASMJIT_CORE_RALOCAL_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/raassignment_p.h>
+#include <asmjit/core/radefs_p.h>
+#include <asmjit/core/rainst_p.h>
+#include <asmjit/core/rapass_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Local register allocator.
+class RALocalAllocator {
+public:
+ ASMJIT_NONCOPYABLE(RALocalAllocator)
+
+ using PhysToWorkMap = RAAssignment::PhysToWorkMap;
+ using WorkToPhysMap = RAAssignment::WorkToPhysMap;
+
+ //! Link to `BaseRAPass`.
+ BaseRAPass& _pass;
+ //! Link to `BaseCompiler`.
+ BaseCompiler& _cc;
+
+ //! Architecture traits.
+ const ArchTraits* _arch_traits {};
+ //! Registers available to the allocator.
+ RARegMask _available_regs {};
+ //! Registers clobbered by the allocator.
+ RARegMask _clobbered_regs {};
+ //! Registers that must be preserved by the function (clobbering means saving & restoring in function prolog & epilog).
+ RARegMask _func_preserved_regs {};
+
+ //! Register assignment (current).
+ RAAssignment _cur_assignment {};
+ //! Register assignment used temporarily during assignment switches.
+ RAAssignment _tmp_assignment {};
+
+ //! Link to the current `RABlock`.
+ RABlock* _block {};
+ //! InstNode.
+ InstNode* _node {};
+ //! RA instruction.
+ RAInst* _ra_inst {};
+
+ //! Count of all TiedReg's.
+ uint32_t _tied_total {};
+ //! TiedReg's total counter.
+ RARegCount _tied_count {};
+
+ //! Temporary work_to_phys_map that can be used freely by the allocator.
+ WorkToPhysMap* _tmp_work_to_phys_map {};
+
+ //! \name Construction & Destruction
+ //! \{
+
+ inline explicit RALocalAllocator(BaseRAPass& pass) noexcept
+ : _pass(pass),
+ _cc(pass.cc()),
+ _arch_traits(pass._arch_traits),
+ _available_regs(pass._available_regs) {
+ _func_preserved_regs.init(pass.func()->frame().preserved_regs());
+ }
+
+ Error init() noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAWorkReg* work_reg_by_id(RAWorkId work_id) const noexcept { return _pass.work_reg_by_id(work_id); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG PhysToWorkMap* phys_to_work_map() const noexcept { return _cur_assignment.phys_to_work_map(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG WorkToPhysMap* work_to_phys_map() const noexcept { return _cur_assignment.work_to_phys_map(); }
+
+ //! Returns the currently processed block.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlock* block() const noexcept { return _block; }
+
+ //! Sets the currently processed block.
+ ASMJIT_INLINE_NODEBUG void set_block(RABlock* block) noexcept { _block = block; }
+
+ //! Returns the currently processed `InstNode`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstNode* node() const noexcept { return _node; }
+
+ //! Returns the currently processed `RAInst`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAInst* ra_inst() const noexcept { return _ra_inst; }
+
+ //! Returns all tied regs as `RATiedReg` array.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* tied_regs() const noexcept { return _ra_inst->tied_regs(); }
+
+ //! Returns tied registers grouped by the given `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* tied_regs(RegGroup group) const noexcept { return _ra_inst->tied_regs(group); }
+
+ //! Returns count of all TiedRegs used by the instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t tied_count() const noexcept { return _tied_total; }
+
+ //! Returns count of TiedRegs used by the given register `group`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t tied_count(RegGroup group) const noexcept { return _tied_count.get(group); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_group_used(RegGroup group) const noexcept { return _tied_count.get(group) != 0; }
+
+ //! \}
+
+ //! \name Assignment
+ //! \{
+
+ [[nodiscard]]
+ Error make_initial_assignment() noexcept;
+
+ [[nodiscard]]
+ Error replace_assignment(const PhysToWorkMap* phys_to_work_map) noexcept;
+
+ //! Switch to the given assignment by reassigning all register and emitting code that reassigns them.
+ //! This is always used to switch to a previously stored assignment.
+ //!
+ //! If `try_mode` is true then the final assignment doesn't have to be exactly same as specified by
+ //! `dst_phys_to_work_map`. This mode is only used before conditional jumps that already have assignment
+ //! to generate a code sequence that is always executed regardless of the flow.
+ [[nodiscard]]
+ Error switch_to_assignment(PhysToWorkMap* dst_phys_to_work_map, Span<const BitWord> live_in, bool dst_is_read_only, bool try_mode) noexcept;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Error spill_regs_before_entry(RABlock* block) noexcept {
+ return spill_scratch_gp_regs_before_entry(block->entry_scratch_gp_regs());
+ }
+
+ [[nodiscard]]
+ Error spill_scratch_gp_regs_before_entry(uint32_t scratch_regs) noexcept;
+
+ //! \}
+
+ //! \name Allocation
+ //! \{
+
+ [[nodiscard]]
+ Error alloc_instruction(InstNode* node) noexcept;
+
+ [[nodiscard]]
+ Error spill_after_allocation(InstNode* node) noexcept;
+
+ [[nodiscard]]
+ Error alloc_branch(InstNode* node, RABlock* target, RABlock* cont) noexcept;
+
+ [[nodiscard]]
+ Error alloc_jump_table(InstNode* node, Span<RABlock*> targets, RABlock* cont) noexcept;
+
+ //! \}
+
+ //! \name Decision Making
+ //! \{
+
+ enum CostModel : uint32_t {
+ kCostOfFrequency = 1048576,
+ kCostOfDirtyFlag = kCostOfFrequency / 4
+ };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t cost_by_frequency(float freq) const noexcept {
+ return uint32_t(int32_t(freq * float(kCostOfFrequency)));
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t calc_spill_cost(RegGroup group, RAWorkReg* work_reg, uint32_t assigned_id) const noexcept {
+ uint32_t cost = cost_by_frequency(work_reg->live_stats().freq());
+
+ if (_cur_assignment.is_phys_dirty(group, assigned_id))
+ cost += kCostOfDirtyFlag;
+
+ return cost;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE uint32_t pick_best_suitable_register(RegGroup group, RegMask allocable_regs) const noexcept {
+ // These are registers must be preserved by the function itself.
+ RegMask preserved_regs = _func_preserved_regs[group];
+
+ // Reduce the set by removing preserved registers when possible.
+ if (allocable_regs & ~preserved_regs) {
+ allocable_regs &= ~preserved_regs;
+ }
+
+ return Support::ctz(allocable_regs);
+ }
+
+ //! Decides on register assignment.
+ [[nodiscard]]
+ uint32_t decide_on_assignment(RegGroup group, RAWorkReg* work_reg, uint32_t assigned_id, RegMask allocable_regs) const noexcept;
+
+ //! Decides on whether to MOVE or SPILL the given WorkReg, because it's allocated in a physical register that have
+ //! to be used by another WorkReg.
+ //!
+ //! The function must return either `RAAssignment::kPhysNone`, which means that the WorkReg of `work_id` should be
+ //! spilled, or a valid physical register ID, which means that the register should be moved to that physical register
+ //! instead.
+ [[nodiscard]]
+ uint32_t decide_on_reassignment(RegGroup group, RAWorkReg* work_reg, uint32_t assigned_id, RegMask allocable_regs, RAInst* ra_inst) const noexcept;
+
+ //! Decides on best spill given a register mask `spillable_regs`
+ [[nodiscard]]
+ uint32_t decide_on_spill_for(RegGroup group, RAWorkReg* work_reg, RegMask spillable_regs, RAWorkId* spill_work_id) const noexcept;
+
+ //! \}
+
+ //! \name Emit
+ //! \{
+
+ //! Assigns a register, the content of it is undefined at this point.
+ [[nodiscard]]
+ ASMJIT_INLINE Error _assign_reg(RegGroup rg, RAWorkId work_id, uint32_t phys_id, bool dirty) noexcept {
+ _cur_assignment.assign(rg, work_id, phys_id, dirty);
+ return Error::kOk;
+ }
+
+ ASMJIT_INLINE void _unassign_reg(RegGroup rg, RAWorkId work_id, uint32_t phys_id) noexcept {
+ _cur_assignment.unassign(rg, work_id, phys_id);
+ }
+
+ //! Emits a load from [VirtReg/WorkReg]'s spill slot to a physical register
+ //! and makes it assigned and clean.
+ [[nodiscard]]
+ ASMJIT_INLINE Error on_load_reg(RegGroup rg, RAWorkReg* work_reg, RAWorkId work_id, uint32_t phys_id) noexcept {
+ _cur_assignment.assign(rg, work_id, phys_id, RAAssignment::kClean);
+ return _pass.emit_load(work_reg, phys_id);
+ }
+
+ //! Emits a save a physical register to a [VirtReg/WorkReg]'s spill slot,
+ //! keeps it assigned, and makes it clean.
+ [[nodiscard]]
+ ASMJIT_INLINE Error on_save_reg(RegGroup rg, RAWorkReg* work_reg, RAWorkId work_id, uint32_t phys_id) noexcept {
+ ASMJIT_ASSERT(_cur_assignment.work_to_phys_id(rg, work_id) == phys_id);
+ ASMJIT_ASSERT(_cur_assignment.phys_to_work_id(rg, phys_id) == work_id);
+
+ _cur_assignment.make_clean(rg, work_id, phys_id);
+ return _pass.emit_save(work_reg, phys_id);
+ }
+
+ //! Emits a move between a destination and source register, and fixes the
+ //! register assignment.
+ [[nodiscard]]
+ ASMJIT_INLINE Error on_move_reg(RegGroup rg, RAWorkReg* work_reg, RAWorkId work_id, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept {
+ if (dst_phys_id == src_phys_id) {
+ return Error::kOk;
+ }
+
+ _cur_assignment.reassign(rg, work_id, dst_phys_id, src_phys_id);
+ return _pass.emit_move(work_reg, dst_phys_id, src_phys_id);
+ }
+
+ //! Spills a variable/register, saves the content to the memory-home if modified.
+ [[nodiscard]]
+ ASMJIT_INLINE Error on_spill_reg(RegGroup rg, RAWorkReg* work_reg, RAWorkId work_id, uint32_t phys_id) noexcept {
+ if (_cur_assignment.is_phys_dirty(rg, phys_id)) {
+ ASMJIT_PROPAGATE(on_save_reg(rg, work_reg, work_id, phys_id));
+ }
+ _unassign_reg(rg, work_id, phys_id);
+ return Error::kOk;
+ }
+
+ //! Emits a swap between two physical registers and fixes their assignment.
+ //!
+ //! \note Target must support this operation otherwise this would ASSERT.
+ [[nodiscard]]
+ ASMJIT_INLINE Error on_swap_reg(RegGroup rg, RAWorkReg* a_reg, RAWorkId a_work_id, uint32_t a_phys_id, RAWorkReg* b_reg, RAWorkId b_work_id, uint32_t b_phys_id) noexcept {
+ _cur_assignment.swap(rg, a_work_id, a_phys_id, b_work_id, b_phys_id);
+ return _pass.emit_swap(a_reg, a_phys_id, b_reg, b_phys_id);
+ }
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RALOCAL_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/rapass.cpp b/3rdparty/asmjit/asmjit/core/rapass.cpp
new file mode 100644
index 00000000000..fda14d85972
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/rapass.cpp
@@ -0,0 +1,2352 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/ralocal_p.h>
+#include <asmjit/core/rapass_p.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/arenavector.h>
+#include <asmjit/support/support_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// RABlock - Control Flow
+// ======================
+
+Error RABlock::append_successor(RABlock* successor) noexcept {
+ RABlock* predecessor = this;
+
+ if (predecessor->has_successor(successor)) {
+ return Error::kOk;
+ }
+
+ ASMJIT_PROPAGATE(successor->_predecessors.reserve_additional(arena()));
+ ASMJIT_PROPAGATE(predecessor->_successors.reserve_additional(arena()));
+
+ predecessor->_successors.append_unchecked(successor);
+ successor->_predecessors.append_unchecked(predecessor);
+
+ return Error::kOk;
+}
+
+Error RABlock::prepend_successor(RABlock* successor) noexcept {
+ RABlock* predecessor = this;
+
+ if (predecessor->has_successor(successor)) {
+ return Error::kOk;
+ }
+
+ ASMJIT_PROPAGATE(successor->_predecessors.reserve_additional(arena()));
+ ASMJIT_PROPAGATE(predecessor->_successors.reserve_additional(arena()));
+
+ predecessor->_successors.prepend_unchecked(successor);
+ successor->_predecessors.prepend_unchecked(predecessor);
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Construction & Destruction
+// =======================================
+
+BaseRAPass::BaseRAPass(BaseCompiler& cc) noexcept : Pass(cc, "RAPass") {}
+BaseRAPass::~BaseRAPass() noexcept {}
+
+static void RAPass_reset_virt_reg_data(BaseRAPass* self) noexcept {
+ for (RAWorkReg* work_reg : self->_work_regs) {
+ VirtReg* virt_reg = work_reg->virt_reg();
+
+ // Update the information regarding the stack of the virtual register.
+ if (work_reg->has_stack_slot()) {
+ RAStackSlot* slot = work_reg->stack_slot();
+ virt_reg->assign_stack_slot(slot->offset());
+ }
+
+ // Reset work reg association so it cannot be used by accident (RAWorkReg data will be destroyed).
+ virt_reg->_work_reg = nullptr;
+ }
+}
+
+// BaseRAPass - Run Prepare & Cleanup
+// ==================================
+
+#ifndef ASMJIT_NO_LOGGING
+static ASMJIT_INLINE void RAPass_prepare_logging(BaseRAPass& pass, Logger* logger) noexcept {
+ DiagnosticOptions diag = pass._cb.diagnostic_options();
+
+ pass._logger = logger;
+
+ if (logger) {
+ pass._format_options = logger->options();
+ pass._diagnostic_options = diag;
+ }
+ else {
+ pass._format_options.reset();
+ pass._diagnostic_options = diag & ~(DiagnosticOptions::kRADebugCFG |
+ DiagnosticOptions::kRADebugUnreachable);
+ }
+}
+
+static ASMJIT_INLINE void RAPass_cleanup_logging(BaseRAPass& pass) noexcept {
+ pass._logger = nullptr;
+ pass._format_options.reset();
+ pass._diagnostic_options = DiagnosticOptions::kNone;
+}
+#else
+static ASMJIT_INLINE void RAPass_prepare_logging(BaseRAPass&, Logger*) noexcept {}
+static ASMJIT_INLINE void RAPass_cleanup_logging(BaseRAPass&) noexcept {}
+#endif
+
+static void RAPass_prepare_for_function(BaseRAPass* pass, FuncDetail* func_detail) noexcept {
+ pass->_args_assignment.reset(func_detail);
+ pass->_stack_allocator.reset(pass->_arena);
+}
+
+static void RAPass_cleanup_after_function(BaseRAPass* pass) noexcept {
+ pass->_blocks.reset();
+ pass->_exits.reset();
+ pass->_pov.reset();
+ pass->_instruction_count = 0;
+ pass->_created_block_count = 0;
+
+ pass->_shared_assignments.reset();
+ pass->_last_timestamp = 0;
+
+ pass->_arch_traits = nullptr;
+ pass->_phys_reg_index.reset();
+ pass->_phys_reg_count.reset();
+ pass->_phys_reg_total = 0;
+ pass->_scratch_reg_indexes.fill(Reg::kIdBad);
+
+ pass->_available_regs.reset();
+ pass->_clobbered_regs.reset();
+
+ pass->_work_regs.reset();
+ pass->_work_regs_of_group.for_each([](ArenaVector<RAWorkReg*>& regs) { regs.reset(); });
+ pass->_multi_work_reg_count = 0u;
+ pass->_total_work_reg_count = 0u;
+
+ pass->_strategy.for_each([](RAStrategy& strategy) { strategy.reset(); });
+ pass->_global_live_spans.fill(nullptr);
+ pass->_global_live_max_count.reset();
+ pass->_temporary_mem.reset();
+
+ pass->_stack_allocator.reset(nullptr);
+ pass->_args_assignment.reset(nullptr);
+ pass->_num_stack_args_to_stack_slots = 0;
+ pass->_max_work_reg_name_size = 0;
+}
+
+// BaseRAPass - Run & RunOnFunction
+// ================================
+
+Error BaseRAPass::run(Arena& arena, Logger* logger) {
+ // Find the first function node by skipping all nodes that are not of `NodeType::kFunc` type.
+ // If there is no function in the whole code, we would just return early and not setup anything.
+ BaseNode* node = cc().first_node();
+ for (;;) {
+ if (!node) {
+ // The code has no function.
+ return Error::kOk;
+ }
+
+ if (node->type() == NodeType::kFunc) {
+ break;
+ }
+
+ node = node->next();
+ }
+
+ Error err = Error::kOk;
+ FuncNode* func = node->as<FuncNode>();
+
+ RAPass_prepare_logging(*this, logger);
+ do {
+ // Try to find a second function in the code in order to know whether this function is last. Generally,
+ // there are two use-cases we want to optimize for: The first is generating a function at a time and the
+ // second is generating multiple functions at a time. In the first case we know we can do a little bit
+ // cheaper cleanup at the end as we know we won't be running the register allocator again in this run().
+ node = func->end_node();
+
+ FuncNode* next_func = nullptr;
+ while (node) {
+ if (node->type() == NodeType::kFunc) {
+ next_func = node->as<FuncNode>();
+ break;
+ }
+ node = node->next();
+ }
+
+ err = run_on_function(arena, func, next_func != nullptr);
+ if (err != Error::kOk) {
+ break;
+ }
+
+ func = next_func;
+ } while (func);
+ RAPass_cleanup_logging(*this);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ return _cb.report_error(err);
+ }
+
+ return err;
+}
+
+Error BaseRAPass::run_on_function(Arena& arena, FuncNode* func, [[maybe_unused]] bool last) noexcept {
+ // Initialize all core structures to use `arena` and `func`.
+ BaseNode* end = func->end_node();
+
+ _arena = &arena;
+ _func = func;
+ _stop = end->next();
+ _injection_start = nullptr;
+ _injection_end = end;
+
+ RAPass_prepare_for_function(this, &_func->_func_detail);
+
+ // Initialize architecture-specific members.
+ on_init();
+
+ // Perform all allocation steps required.
+ Error err = on_perform_all_steps();
+
+ // Must be called regardless of the allocation status.
+ on_done();
+
+ // Reset possible connections introduced by the register allocator.
+ RAPass_reset_virt_reg_data(this);
+
+ // Reset all core structures and everything that depends on the passed `Arena`.
+ RAPass_cleanup_after_function(this);
+
+ _arena = nullptr;
+ _func = nullptr;
+ _stop = nullptr;
+ _injection_start = nullptr;
+ _injection_end = nullptr;
+
+ // Reset `Arena` as nothing should persist between `run_on_function()` calls.
+ arena.reset();
+
+ // We alter the compiler cursor, because it doesn't make sense to reference it after the compilation - some nodes
+ // may disappear and the old cursor could be unreachable, so just set the cursor to the last node for better safety.
+ cc().set_cursor(cc().last_node());
+
+ return err;
+}
+
+// BaseRAPass - Perform All Steps
+// ==============================
+
+Error BaseRAPass::on_perform_all_steps() noexcept {
+ ASMJIT_PROPAGATE(build_cfg_nodes());
+ ASMJIT_PROPAGATE(build_cfg_views());
+ ASMJIT_PROPAGATE(remove_unreachable_code());
+ ASMJIT_PROPAGATE(build_cfg_dominators());
+ ASMJIT_PROPAGATE(build_reg_ids());
+ ASMJIT_PROPAGATE(build_liveness());
+ ASMJIT_PROPAGATE(assign_arg_index_to_work_regs());
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ ASMJIT_PROPAGATE(annotate_code());
+ }
+#endif
+
+ ASMJIT_PROPAGATE(run_global_allocator());
+ ASMJIT_PROPAGATE(run_local_allocator());
+
+ ASMJIT_PROPAGATE(update_stack_frame());
+ ASMJIT_PROPAGATE(insert_prolog_epilog());
+
+ ASMJIT_PROPAGATE(rewrite());
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Events
+// ===================
+
+void BaseRAPass::on_init() noexcept {}
+void BaseRAPass::on_done() noexcept {}
+
+// BaseRAPass - CFG - Basic Block Management
+// =========================================
+
+RABlock* BaseRAPass::new_block(BaseNode* initial_node) noexcept {
+ RABlock* block = arena().new_oneshot<RABlock>(this);
+
+ if (ASMJIT_UNLIKELY(!block)) {
+ return nullptr;
+ }
+
+ block->set_first(initial_node);
+ block->set_last(initial_node);
+
+ // Ignore return values here as we don't care if it was successful or not - this is a pre-allocation only
+ // to make the default allocated block close to the block itself. In general, it's very common to have at
+ // least 1 predecessor and successor, and in case of branches it's either 2 successors or predecessors in
+ // case two basic blocks merge.
+ (void)block->_predecessors.reserve_fit(arena(), 2u);
+ (void)block->_successors.reserve_fit(arena(), 2u);
+
+ _created_block_count++;
+ return block;
+}
+
+RABlock* BaseRAPass::new_block_or_existing_at(LabelNode* label_node, BaseNode** stopped_at) noexcept {
+ if (label_node->has_pass_data()) {
+ return label_node->pass_data<RABlock>();
+ }
+
+ FuncNode* func = this->func();
+ BaseNode* node = label_node->prev();
+ RABlock* block = nullptr;
+
+ // Try to find some label, but terminate the loop on any code. We try hard to coalesce code that contains two
+ // consecutive labels or a combination of non-code nodes between 2 or more labels.
+ //
+ // Possible cases that would share the same basic block:
+ //
+ // 1. Two or more consecutive labels:
+ // Label1:
+ // Label2:
+ //
+ // 2. Two or more labels separated by non-code nodes:
+ // Label1:
+ // ; Some comment...
+ // .align 16
+ // Label2:
+ size_t num_pending_labels = 0;
+
+ while (node) {
+ if (node->type() == NodeType::kLabel) {
+ // Function has a different NodeType, just make sure this was not messed up as we must never associate
+ // BasicBlock with a `func` itself.
+ ASMJIT_ASSERT(node != func);
+
+ block = node->pass_data<RABlock>();
+ if (block) {
+ // Exit node has always a block associated with it. If we went here it means that `label_node` passed
+ // here is after the end of the function and cannot be merged with the function exit block.
+ if (node == func->exit_node()) {
+ block = nullptr;
+ }
+ break;
+ }
+
+ num_pending_labels++;
+ }
+ else if (node->type() == NodeType::kAlign) {
+ // Align node is fine.
+ }
+ else {
+ break;
+ }
+
+ node = node->prev();
+ }
+
+ if (stopped_at)
+ *stopped_at = node;
+
+ if (!block) {
+ block = new_block();
+ if (ASMJIT_UNLIKELY(!block)) {
+ return nullptr;
+ }
+ }
+
+ label_node->set_pass_data<RABlock>(block);
+ node = label_node;
+
+ while (num_pending_labels) {
+ node = node->prev();
+ for (;;) {
+ if (node->type() == NodeType::kLabel) {
+ node->set_pass_data<RABlock>(block);
+ num_pending_labels--;
+ break;
+ }
+
+ node = node->prev();
+ ASMJIT_ASSERT(node != nullptr);
+ }
+ }
+
+ if (!block->first()) {
+ block->set_first(node);
+ block->set_last(label_node);
+ }
+
+ return block;
+}
+
+Error BaseRAPass::add_block(RABlock* block) noexcept {
+ ASMJIT_PROPAGATE(_blocks.reserve_additional(arena()));
+
+ block->_block_id = RABlockId(block_count());
+ _blocks.append_unchecked(block);
+ return Error::kOk;
+}
+
+// BaseRAPass - CFG - Build
+// ========================
+
+// [[pure virtual]]
+Error BaseRAPass::build_cfg_nodes() noexcept {
+ return make_error(Error::kInvalidState);
+}
+
+Error BaseRAPass::init_shared_assignments(Span<uint32_t> shared_assignments_map) noexcept {
+ if (shared_assignments_map.is_empty()) {
+ return Error::kOk;
+ }
+
+ uint32_t count = 0;
+ for (RABlock* block : _blocks) {
+ if (block->has_shared_assignment_id()) {
+ uint32_t shared_assignment_id = shared_assignments_map[block->shared_assignment_id()];
+ block->set_shared_assignment_id(shared_assignment_id);
+ count = Support::max(count, shared_assignment_id + 1);
+ }
+ }
+
+ ASMJIT_PROPAGATE(_shared_assignments.resize_fit(arena(), count));
+
+ // Aggregate all entry scratch GP regs from blocks of the same assignment to the assignment itself. It will then be
+ // used instead of RABlock's own scratch regs mask, as shared assignments have precedence.
+ for (RABlock* block : _blocks) {
+ if (block->has_jump_table()) {
+ Span<RABlock*> successors = block->successors();
+ if (!successors.is_empty()) {
+ RABlock* first_successor = successors[0];
+ // NOTE: Shared assignments connect all possible successors so we only need the first to propagate exit scratch
+ // GP registers.
+ if (first_successor->has_shared_assignment_id()) {
+ RASharedAssignment& sa = _shared_assignments[first_successor->shared_assignment_id()];
+ sa.add_entry_scratch_gp_regs(block->exit_scratch_gp_regs());
+ }
+ else {
+ // This is only allowed if there is a single successor - in that case shared assignment is not necessary.
+ ASMJIT_ASSERT(successors.size() == 1u);
+ }
+ }
+ }
+ if (block->has_shared_assignment_id()) {
+ RASharedAssignment& sa = _shared_assignments[block->shared_assignment_id()];
+ sa.add_entry_scratch_gp_regs(block->_entry_scratch_gp_regs);
+ }
+ }
+
+ return Error::kOk;
+}
+
+// BaseRAPass - CFG - Views Order
+// ==============================
+
+// Stack specific to building a post-order-view. It reuses the POV vector in a way that stacked items
+// are added from the end, which would never collide with items already added to the POV vector as
+// they are added from the beginning (and the number of stacked items cannot exceed the number of
+// blocks). Additionally, it needs one vector of uint32_t to store the index of successors where it
+// ended before it was pushed on the stack.
+class RAPOVBuilderStack {
+protected:
+ RABlock** _block_ptr;
+ uint32_t* _index_ptr;
+ uint32_t* _index_begin;
+
+public:
+ ASMJIT_INLINE RAPOVBuilderStack(RABlock** pov_stack, uint32_t* index_stack, size_t block_count) noexcept
+ : _block_ptr(pov_stack + block_count),
+ _index_ptr(index_stack),
+ _index_begin(index_stack) {}
+
+ ASMJIT_INLINE void push(RABlock* block, uint32_t index) noexcept {
+ *--_block_ptr = block;
+ *_index_ptr++ = index;
+ }
+
+ ASMJIT_INLINE void pop(RABlock*& block, uint32_t& index) noexcept {
+ ASMJIT_ASSERT(_index_ptr != _index_begin);
+
+ block = *_block_ptr++;
+ index = *--_index_ptr;
+ }
+
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _index_ptr == _index_begin; }
+};
+
+Error BaseRAPass::build_cfg_views() noexcept {
+#ifndef ASMJIT_NO_LOGGING
+ Logger* logger = logger_if(DiagnosticOptions::kRADebugCFG);
+ ASMJIT_RA_LOG_FORMAT("[build_cfg_views]\n");
+#endif // !ASMJIT_NO_LOGGING
+
+ size_t count = block_count();
+ if (ASMJIT_UNLIKELY(!count)) {
+ return Error::kOk;
+ }
+
+ ArenaVector<uint32_t> indexes;
+
+ ASMJIT_PROPAGATE(_pov.reserve_fit(arena(), count));
+ ASMJIT_PROPAGATE(indexes.reserve_fit(arena(), count));
+
+ RABlock** pov_data = _pov.data();
+ size_t pov_index = 0u;
+
+ RABlock* cur_block = _blocks[0];
+ uint32_t cur_index = 0u;
+
+ RAPOVBuilderStack stack(pov_data, indexes.data(), count);
+
+ // This loop uses reachable bit in a RABlock to mark visited blocks.
+ cur_block->make_reachable();
+ for (;;) {
+ while (cur_index < cur_block->successors().size()) {
+ RABlock* child = cur_block->successors()[cur_index++];
+ if (!child->is_reachable()) {
+ // Mark the block as reachable to prevent visiting the same block again.
+ child->make_reachable();
+
+ // Add the cur_block block to the stack, we will get back to it later.
+ stack.push(cur_block, cur_index);
+
+ // Visit the first successor.
+ cur_block = child;
+ cur_index = 0u;
+ }
+ }
+
+ cur_block->_pov_index = uint32_t(pov_index);
+ pov_data[pov_index++] = cur_block;
+
+ if (stack.is_empty()) {
+ break;
+ }
+
+ stack.pop(cur_block, cur_index);
+ }
+
+ _pov._set_size(pov_index);
+ indexes.release(arena());
+
+ ASMJIT_RA_LOG_COMPLEX({
+ StringTmp<1024> sb;
+ for (RABlock* block : blocks()) {
+ sb.clear();
+ if (block->has_successors()) {
+ sb.append_format(" #%u -> {", block->block_id());
+ dump_block_ids(sb, block->successors());
+ sb.append("}\n");
+ }
+ else {
+ sb.append_format(" #%u -> {Exit}\n", block->block_id());
+ }
+ logger->log(sb);
+ }
+ });
+
+ return Error::kOk;
+}
+
+// BaseRAPass - CFG - Dominators
+// =============================
+
+static ASMJIT_INLINE RABlock* intersect_blocks(RABlock* b1, RABlock* b2) noexcept {
+ while (b1 != b2) {
+ while (b2->pov_index() > b1->pov_index()) b1 = b1->idom();
+ while (b1->pov_index() > b2->pov_index()) b2 = b2->idom();
+ }
+ return b1;
+}
+
+// Based on "A Simple, Fast Dominance Algorithm".
+Error BaseRAPass::build_cfg_dominators() noexcept {
+#ifndef ASMJIT_NO_LOGGING
+ Logger* logger = logger_if(DiagnosticOptions::kRADebugCFG);
+ ASMJIT_RA_LOG_FORMAT("[build_cfg_dominators]\n");
+#endif // !ASMJIT_NO_LOGGING
+
+ if (_blocks.is_empty()) {
+ return Error::kOk;
+ }
+
+ RABlock* entry_block = this->entry_block();
+ entry_block->_idom = entry_block;
+
+ bool changed = true;
+
+#ifndef ASMJIT_NO_LOGGING
+ uint32_t iter_count = 0;
+#endif // !ASMJIT_NO_LOGGING
+
+ while (changed) {
+ changed = false;
+
+#ifndef ASMJIT_NO_LOGGING
+ iter_count++;
+#endif // !ASMJIT_NO_LOGGING
+
+ for (RABlock* block : _pov.iterate_reverse()) {
+ if (block == entry_block) {
+ continue;
+ }
+
+ RABlock* idom = nullptr;
+ Span<RABlock*> predecessors = block->predecessors();
+
+ for (RABlock* p : predecessors.iterate_reverse()) {
+ if (!p->idom()) {
+ continue;
+ }
+ idom = !idom ? p : intersect_blocks(idom, p);
+ }
+
+ if (block->idom() != idom) {
+ ASMJIT_ASSUME(idom != nullptr);
+ ASMJIT_RA_LOG_FORMAT(" idom of #%u -> #%u\n", block->block_id(), idom->block_id());
+ block->_idom = idom;
+ changed = true;
+ }
+ }
+ }
+
+ ASMJIT_RA_LOG_FORMAT(" done (%u iterations)\n", iter_count);
+ return Error::kOk;
+}
+
+bool BaseRAPass::_strictly_dominates(const RABlock* a, const RABlock* b) const noexcept {
+ ASMJIT_ASSERT(a != nullptr); // There must be at least one block if this function is
+ ASMJIT_ASSERT(b != nullptr); // called, as both `a` and `b` must be valid blocks.
+ ASMJIT_ASSERT(a != b); // Checked by `dominates()` and `strictly_dominates()`.
+
+ // Nothing strictly dominates the entry block.
+ const RABlock* entry_block = this->entry_block();
+ if (a == entry_block) {
+ return false;
+ }
+
+ const RABlock* idom = b->idom();
+ while (idom != a && idom != entry_block) {
+ idom = idom->idom();
+ }
+
+ return idom != entry_block;
+}
+
+const RABlock* BaseRAPass::_nearest_common_dominator(const RABlock* a, const RABlock* b) const noexcept {
+ ASMJIT_ASSERT(a != nullptr); // There must be at least one block if this function is
+ ASMJIT_ASSERT(b != nullptr); // called, as both `a` and `b` must be valid blocks.
+ ASMJIT_ASSERT(a != b); // Checked by `dominates()` and `_strictly_dominates()`.
+
+ if (a == b) {
+ return a;
+ }
+
+ // If `a` strictly dominates `b` then `a` is the nearest common dominator.
+ if (_strictly_dominates(a, b)) {
+ return a;
+ }
+
+ // If `b` strictly dominates `a` then `b` is the nearest common dominator.
+ if (_strictly_dominates(b, a)) {
+ return b;
+ }
+
+ const RABlock* entry_block = this->entry_block();
+ RABlockTimestamp timestamp = next_timestamp();
+
+ // Mark all A's dominators.
+ const RABlock* block = a->idom();
+ while (block != entry_block) {
+ block->set_timestamp(timestamp);
+ block = block->idom();
+ }
+
+ // Check all B's dominators against marked dominators of A.
+ block = b->idom();
+ while (block != entry_block) {
+ if (block->has_timestamp(timestamp)) {
+ return block;
+ }
+ block = block->idom();
+ }
+
+ return entry_block;
+}
+
+// BaseRAPass - CFG - Utilities
+// ============================
+
+Error BaseRAPass::remove_unreachable_code() noexcept {
+ size_t num_all_blocks = block_count();
+ size_t num_reachable_blocks = reachable_block_count();
+
+ // All reachable -> nothing to do.
+ if (num_all_blocks == num_reachable_blocks) {
+ return Error::kOk;
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ Logger* logger = logger_if(DiagnosticOptions::kRADebugUnreachable);
+ String& sb = _tmp_string;
+ ASMJIT_RA_LOG_FORMAT("[remove_unreachable_code - detected %zu of %zu unreachable blocks]\n", num_all_blocks - num_reachable_blocks, num_all_blocks);
+#endif
+
+ for (RABlock* block : _blocks.iterate()) {
+ if (block->is_reachable()) {
+ continue;
+ }
+
+ ASMJIT_RA_LOG_FORMAT(" removing code from unreachable block {%u}\n", uint32_t(block->block_id()));
+ BaseNode* first = block->first();
+ BaseNode* last = block->last();
+
+ BaseNode* before_first = first->prev();
+ BaseNode* after_last = last->next();
+
+ BaseNode* node = first;
+ while (node != after_last) {
+ BaseNode* next = node->next();
+
+ if (node->is_code() || node->is_removable()) {
+#ifndef ASMJIT_NO_LOGGING
+ if (logger) {
+ sb.clear();
+ Formatter::format_node(sb, _format_options, &_cb, node);
+ logger->logf(" %s\n", sb.data());
+ }
+#endif
+ cc().remove_node(node);
+ }
+ node = next;
+ }
+
+ if (before_first->next() == after_last) {
+ block->set_first(nullptr);
+ block->set_last(nullptr);
+ }
+ else {
+ block->set_first(before_first->next());
+ block->set_last(after_last->prev());
+ }
+ }
+
+ return Error::kOk;
+}
+
+BaseNode* BaseRAPass::find_successor_starting_at(BaseNode* node) noexcept {
+ while (node && (node->is_informative() || node->has_no_effect())) {
+ node = node->next();
+ }
+ return node;
+}
+
+bool BaseRAPass::is_next_to(BaseNode* node, BaseNode* target) noexcept {
+ for (;;) {
+ node = node->next();
+ if (node == target) {
+ return true;
+ }
+
+ if (!node) {
+ return false;
+ }
+
+ if (node->is_code() || node->is_data()) {
+ return false;
+ }
+ }
+}
+
+// BaseRAPass - Registers - VirtReg / WorkReg Mapping
+// ==================================================
+
+Error BaseRAPass::_as_work_reg(RAWorkReg** out, VirtReg* virt_reg) noexcept {
+ // Checked by `as_work_reg()` - must be true.
+ ASMJIT_ASSERT(virt_reg->_work_reg == nullptr);
+
+ OperandSignature signature = RegUtils::signature_of(virt_reg->reg_type());
+ RegGroup group = signature.reg_group();
+ ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
+
+ ArenaVector<RAWorkReg*>& work_regs_by_group = work_regs(group);
+ ASMJIT_PROPAGATE(work_regs_by_group.reserve_additional(arena()));
+
+ RAWorkReg* work_reg = arena().new_oneshot<RAWorkReg>(virt_reg, signature, kBadWorkId);
+ if (ASMJIT_UNLIKELY(!work_reg)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ virt_reg->set_work_reg(work_reg);
+ if (!virt_reg->is_stack_area()) {
+ work_reg->set_reg_byte_mask(Support::lsb_mask<uint64_t>(virt_reg->virt_size()));
+ }
+
+ work_regs_by_group.append_unchecked(work_reg);
+ _total_work_reg_count++;
+
+ // Only used by RA logging.
+ _max_work_reg_name_size = Support::max(_max_work_reg_name_size, virt_reg->name_size());
+
+ *out = work_reg;
+ return Error::kOk;
+}
+
+RAStackSlot* BaseRAPass::_create_stack_slot(RAWorkReg* work_reg) noexcept {
+ VirtReg* virt_reg = work_reg->virt_reg();
+ RAStackSlot* slot = _stack_allocator.new_slot(_sp.id(), virt_reg->virt_size(), virt_reg->alignment(), RAStackSlot::kFlagRegHome);
+
+ work_reg->_stack_slot = slot;
+ work_reg->mark_stack_used();
+
+ return slot;
+}
+
+RAAssignment::WorkToPhysMap* BaseRAPass::new_work_to_phys_map() noexcept {
+ size_t count = work_reg_count();
+ size_t size = WorkToPhysMap::size_of(count);
+
+ // If no registers are used it could be zero, in that case return a dummy map instead of NULL.
+ if (ASMJIT_UNLIKELY(!size)) {
+ static const RAAssignment::WorkToPhysMap null_map = {{ 0 }};
+ return const_cast<RAAssignment::WorkToPhysMap*>(&null_map);
+ }
+
+ WorkToPhysMap* map = arena().alloc_oneshot<WorkToPhysMap>(size);
+ if (ASMJIT_UNLIKELY(!map)) {
+ return nullptr;
+ }
+
+ map->reset(count);
+ return map;
+}
+
+RAAssignment::PhysToWorkMap* BaseRAPass::new_phys_to_work_map() noexcept {
+ uint32_t count = phys_reg_total();
+ size_t size = PhysToWorkMap::size_of(count);
+
+ PhysToWorkMap* map = arena().alloc_oneshot<PhysToWorkMap>(size);
+ if (ASMJIT_UNLIKELY(!map)) {
+ return nullptr;
+ }
+
+ map->reset(count);
+ return map;
+}
+
+// BaseRAPass - Registers - Liveness Analysis and Statistics
+// =========================================================
+
+ASMJIT_FAVOR_SPEED Error BaseRAPass::build_reg_ids() noexcept {
+ uint32_t count = _total_work_reg_count;
+ ASMJIT_PROPAGATE(_work_regs.reserve_fit(arena(), count));
+
+ RAWorkReg** work_regs = _work_regs.data();
+ _work_regs._set_size(count);
+
+ uint32_t multi_id = 0u;
+ uint32_t single_id = count;
+
+ for (uint32_t rg = 0; rg < Globals::kNumVirtGroups; rg++) {
+ for (RAWorkReg* work_reg : _work_regs_of_group[rg]) {
+ if (work_reg->is_within_single_basic_block()) {
+ work_reg->_work_id = RAWorkId(--single_id);
+ work_regs[single_id] = work_reg;
+ }
+ else {
+ work_reg->_work_id = RAWorkId(multi_id);
+ work_reg->_single_basic_block_id = kBadBlockId;
+ work_regs[multi_id++] = work_reg;
+ }
+ }
+ }
+
+ ASMJIT_ASSERT(single_id == multi_id);
+ _multi_work_reg_count = multi_id;
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Registers - Liveness Analysis and Statistics
+// =========================================================
+
+template<typename BitMutator>
+static ASMJIT_INLINE void BaseRAPass_calculate_initial_in_out(RABlock* block, size_t live_word_count, Support::FixedStack<RABlock*>& queue, uint32_t pov_index) noexcept {
+ using BitWord = Support::BitWord;
+
+ // Calculate LIVE-OUT based on LIVE-IN of all successors and then recalculate LIVE-IN based on LIVE-OUT and KILL bits.
+ Span<RABlock*> successors = block->successors();
+ if (!successors.is_empty()) {
+ BitMutator bm_live_in(block->live_in());
+ BitMutator bm_live_out(block->live_out());
+ BitMutator bm_kill(block->kill());
+
+ for (RABlock* successor : successors.iterate_reverse()) {
+ if (Support::bool_and(successor->pov_index() > pov_index, !successor->is_enqueued())) {
+ successor->add_flags(RABlockFlags::kIsEnqueued);
+ queue.push(successor);
+ continue;
+ }
+
+ BitMutator bm_successor_live_in(successor->live_in());
+ for (uint32_t bw = 0; bw < live_word_count; bw++) {
+ BitWord sc = bm_successor_live_in.bit_word(bw);
+
+ BitWord in = bm_live_in.bit_word(bw) | sc;
+ BitWord out = bm_live_out.bit_word(bw) | sc;
+
+ bm_live_in.set_bit_word(bw, in & ~bm_kill.bit_word(bw));
+ bm_live_out.set_bit_word(bw, out);
+ }
+
+ bm_live_in.commit(block->live_in());
+ bm_live_out.commit(block->live_out());
+ }
+ }
+}
+
+// Calculate LIVE-IN and LIVE-OUT of the given `block` and a single `successor` that has changed its LIVE-IN bits.
+template<typename BitMutator>
+static ASMJIT_INLINE Support::BitWord BaseRAPass_recalculateInOut(RABlock* block, size_t live_word_count, RABlock* successor) noexcept {
+ using BitWord = Support::BitWord;
+
+ BitMutator bm_live_in(block->live_in());
+ BitMutator bm_live_out(block->live_out());
+ BitMutator bm_kill(block->kill());
+
+ BitMutator bm_successor_live_in(successor->live_in());
+ BitWord changed = 0u;
+
+ for (size_t i = 0; i < live_word_count; i++) {
+ BitWord succ_in = bm_successor_live_in.bit_word(i);
+
+ BitWord in = bm_live_in.bit_word(i);
+ BitWord out = bm_live_out.bit_word(i);
+ BitWord kill = bm_kill.bit_word(i);
+
+ BitWord new_in = (in | succ_in) & ~kill;
+ BitWord new_out = (out | succ_in);
+
+ bm_live_in.set_bit_word(i, new_in);
+ bm_live_out.set_bit_word(i, new_out);
+
+ changed |= in ^ new_in;
+ }
+
+ bm_live_in.commit(block->live_in());
+ bm_live_out.commit(block->live_out());
+
+ return changed;
+}
+
+template<typename BitMutator>
+static ASMJIT_INLINE Error BaseRAPass_calculateInOutKill(
+ BaseRAPass* pass,
+ uint32_t* n_uses_per_work_reg,
+ uint32_t* n_outs_per_work_reg,
+ uint32_t* n_insts_per_block,
+ Out<uint32_t> num_visits_out
+) noexcept {
+ Span<RABlock*> pov = pass->_pov.as_span();
+
+ size_t multi_work_reg_count = pass->multi_work_reg_count();
+ size_t multi_work_reg_count_as_bit_words = BitOps::size_in_words<BitWord>(multi_work_reg_count);
+
+ constexpr RAWorkRegFlags kLiveFlag = RAWorkRegFlags::kSingleBlockLiveFlag;
+ constexpr RAWorkRegFlags kVisitedFlag = RAWorkRegFlags::kSingleBlockVisitedFlag;
+
+ // Calculate GEN and KILL and then initial LIVE-IN and LIVE-OUT bits.
+ //
+ // GEN is mapped to LIVE-IN, because it's not needed after LIVE-IN is calculated,
+ // which is essentially `LIVE-IN = GEN & ~KILL` - so once we know GEN and KILL for
+ // each block, calculating LIVE-IN is trivial.
+ for (RABlock* block : pov.iterate()) {
+ ASMJIT_PROPAGATE(block->alloc_live_bits(multi_work_reg_count));
+
+ BaseNode* node = block->last();
+ BaseNode* stop = block->first();
+
+ BitMutator live_in(block->live_in()); // LIVE-IN which maps to GEN as well.
+ BitMutator kill(block->kill()); // KILL only.
+
+ RABlockId block_id = block->block_id();
+ uint32_t inst_count = 0;
+
+ for (;;) {
+ if (node->is_inst()) {
+ InstNode* inst = node->as<InstNode>();
+ RAInst* ra_inst = inst->pass_data<RAInst>();
+ ASMJIT_ASSERT(ra_inst != nullptr);
+
+ RATiedReg* tied_regs = ra_inst->tied_regs();
+ uint32_t count = ra_inst->tied_count();
+
+ for (uint32_t j = 0; j < count; j++) {
+ RATiedReg* tied_reg = &tied_regs[j];
+ RAWorkReg* work_reg = tied_reg->work_reg();
+
+ RAWorkId work_id = work_reg->work_id();
+
+ // Update `n_uses` and `n_outs`.
+ n_uses_per_work_reg[uint32_t(work_id)] += 1u;
+ n_outs_per_work_reg[uint32_t(work_id)] += uint32_t(tied_reg->is_write());
+
+ bool is_kill = tied_reg->is_write_only();
+ RATiedFlags tied_flags = tied_reg->flags();
+
+ // Mark as:
+ // KILL - if this VirtReg is killed afterwards.
+ // LAST - if this VirtReg is last in this basic block.
+ if (work_reg->is_within_single_basic_block()) {
+ bool was_kill = !Support::test(work_reg->flags(), kLiveFlag);
+ bool was_last = !Support::test(work_reg->flags(), kVisitedFlag);
+
+ tied_flags |= Support::bool_as_flag<RATiedFlags::kKill>(was_kill);
+ tied_flags |= Support::bool_as_flag<RATiedFlags::kLast>(was_last);
+
+ work_reg->add_flags(kVisitedFlag);
+ work_reg->xor_flags(Support::bool_as_flag<kLiveFlag>(uint32_t(is_kill ^ was_kill)));
+ }
+ else {
+ bool was_kill = kill.bit_at(work_id);
+ bool was_last = !live_in.bit_at(work_id);
+
+ tied_flags |= Support::bool_as_flag<RATiedFlags::kKill>(was_kill);
+ tied_flags |= Support::bool_as_flag<RATiedFlags::kLast>(was_last);
+
+ // KILL if the register is write only, otherwise GEN.
+ live_in.add_bit(work_id, !is_kill);
+ kill.xor_bit(work_id, bool(is_kill ^ was_kill));
+ }
+
+ tied_reg->_flags = tied_flags;
+
+ if (tied_reg->is_lead_consecutive()) {
+ work_reg->mark_lead_consecutive();
+ }
+
+ if (tied_reg->has_consecutive_parent()) {
+ RAWorkReg* consecutive_parent_reg = tied_reg->consecutive_parent();
+ ASMJIT_PROPAGATE(consecutive_parent_reg->add_immediate_consecutive(pass->arena(), work_id));
+ }
+ }
+
+ inst_count++;
+ }
+
+ if (node == stop) {
+ break;
+ }
+
+ node = node->prev();
+ ASMJIT_ASSERT(node != nullptr);
+ }
+
+ n_insts_per_block[uint32_t(block_id)] = inst_count;
+
+ // Calculate initial LIVE-IN from GEN - LIVE-IN = GEN & ~KILL.
+ live_in.clear_bits(kill);
+
+ live_in.commit(block->live_in());
+ kill.commit(block->kill());
+ }
+
+ // Calculate initial values of LIVE-OUT and update LIVE-IN accordingly to LIVE-OUT.
+ //
+ // This step requires a queue, however, we only add a node's successors to the queue, which post-order-index
+ // is greater than the post-order-index of the block being processed. This makes the next pass much faster to
+ // converge.
+ uint32_t num_visits = 0u;
+ if (multi_work_reg_count_as_bit_words > 0u) {
+ ArenaVector<RABlock*> queue_storage;
+ ASMJIT_PROPAGATE(queue_storage.reserve_fit(pass->arena(), pov.size()));
+ Support::FixedStack<RABlock*> queue(queue_storage.data(), pov.size());
+
+ for (size_t pov_index = 0u; pov_index < pov.size(); pov_index++) {
+ RABlock* block = pov[pov_index];
+ BaseRAPass_calculate_initial_in_out<BitMutator>(block, multi_work_reg_count_as_bit_words, queue, uint32_t(pov_index));
+ }
+
+ // Iteratively keep recalculating LIVE-IN and LIVE-OUT once there are no more changes to the bits. This is
+ // needed as there may be cycles in the CFG, which have to be propagated. This algorithm essentially uses a
+ // work queue where nodes that change are pushed to propagate the changes to all predecessor nodes.
+ while (!queue.is_empty()) {
+ num_visits++;
+
+ RABlock* block = queue.pop();
+ block->clear_flags(RABlockFlags::kIsEnqueued);
+
+ for (RABlock* predecessor : block->predecessors()) {
+ Support::BitWord changed = BaseRAPass_recalculateInOut<BitMutator>(predecessor, multi_work_reg_count_as_bit_words, block);
+ if (Support::bool_and(changed, !predecessor->is_enqueued())) {
+ predecessor->add_flags(RABlockFlags::kIsEnqueued);
+ queue.push(predecessor);
+ }
+ }
+ }
+
+ queue_storage.release(pass->arena());
+ }
+
+ num_visits_out = num_visits;
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SPEED Error BaseRAPass::build_liveness() noexcept {
+#ifndef ASMJIT_NO_LOGGING
+ Logger* logger = logger_if(DiagnosticOptions::kRADebugLiveness);
+#endif
+
+ ASMJIT_RA_LOG_FORMAT("[build_liveness]\n");
+
+ size_t num_all_blocks = block_count();
+ size_t num_work_regs = work_reg_count();
+ size_t multi_work_reg_count = _multi_work_reg_count;
+
+ if (!num_work_regs) {
+ ASMJIT_RA_LOG_FORMAT(" done (no virtual registers)\n");
+ return Error::kOk;
+ }
+
+ ArenaVector<uint32_t> n_uses_per_work_reg; // Number of USEs of each RAWorkReg.
+ ArenaVector<uint32_t> n_outs_per_work_reg; // Number of OUTs of each RAWorkReg.
+ ArenaVector<uint32_t> n_insts_per_block; // Number of instructions of each RABlock.
+
+ ASMJIT_PROPAGATE(n_uses_per_work_reg.resize_fit(arena(), num_work_regs));
+ ASMJIT_PROPAGATE(n_outs_per_work_reg.resize_fit(arena(), num_work_regs));
+ ASMJIT_PROPAGATE(n_insts_per_block.resize_fit(arena(), num_all_blocks));
+
+ // Calculate GEN/KILL and then IN/OUT of Each Block
+ // ------------------------------------------------
+
+ {
+ uint32_t num_visits = 0;
+
+ if (multi_work_reg_count > 0u && multi_work_reg_count <= Support::bit_size_of<BitWord>) {
+ // If the number of work registers as a mask fits into a single BitWord use a separate code-path that optimizes
+ // for such case. This makes faster generating smaller code that doesn't have many virtual registers in use.
+ ASMJIT_PROPAGATE(
+ BaseRAPass_calculateInOutKill<Support::BitWordMutator>(
+ this, n_uses_per_work_reg.data(), n_outs_per_work_reg.data(), n_insts_per_block.data(), Out(num_visits)
+ )
+ );
+ }
+ else {
+ ASMJIT_PROPAGATE(
+ BaseRAPass_calculateInOutKill<Support::BitVectorMutator>(
+ this, n_uses_per_work_reg.data(), n_outs_per_work_reg.data(), n_insts_per_block.data(), Out(num_visits)
+ )
+ );
+ }
+
+ ASMJIT_RA_LOG_COMPLEX({
+ String& sb = _tmp_string;
+ logger->logf(" LiveIn/Out Done (%u visits)\n", num_visits);
+
+ for (uint32_t i = 0; i < num_all_blocks; i++) {
+ RABlock* block = _blocks[i];
+
+ ASMJIT_PROPAGATE(sb.assign_format(" {#%u}\n", block->block_id()));
+ ASMJIT_PROPAGATE(dump_block_liveness(sb, block));
+
+ logger->log(sb);
+ }
+ });
+ }
+
+ // Reserve the space in each `RAWorkReg` for references
+ // ----------------------------------------------------
+
+ for (uint32_t i = 0; i < num_work_regs; i++) {
+ RAWorkReg* work_reg = work_reg_by_id(RAWorkId(i));
+ ASMJIT_PROPAGATE(work_reg->_refs.reserve_fit(arena(), n_uses_per_work_reg[i]));
+ ASMJIT_PROPAGATE(work_reg->_writes.reserve_fit(arena(), n_outs_per_work_reg[i]));
+ }
+
+ // These are not needed anymore, so release the memory now so other allocations can reuse it.
+ n_uses_per_work_reg.release(arena());
+ n_outs_per_work_reg.release(arena());
+
+ // Assign block and instruction positions, build LiveCount and LiveSpans
+ // ---------------------------------------------------------------------
+
+ // This is a starting position, reserving [0, 1] for function arguments.
+ uint32_t position = 2;
+
+ for (uint32_t i = 0; i < num_all_blocks; i++) {
+ RABlock* block = _blocks[i];
+ if (!block->is_reachable()) {
+ continue;
+ }
+
+ BaseNode* node = block->first();
+ BaseNode* stop = block->last();
+
+ Span<const BitWord> live_out = block->live_out();
+
+ uint32_t end_position = position + n_insts_per_block[i] * 2u;
+ block->set_first_position(NodePosition(position));
+ block->set_end_position(NodePosition(end_position));
+
+ RALiveCount cur_live_count;
+ RALiveCount max_live_count;
+
+ // Process LIVE-IN.
+ Support::BitVectorIterator<BitWord> it(block->live_in());
+ while (it.has_next()) {
+ RAWorkReg* work_reg = _work_regs[uint32_t(it.next())];
+ cur_live_count[work_reg->group()]++;
+ ASMJIT_PROPAGATE(work_reg->live_spans().open_at(arena(), NodePosition(position), NodePosition(end_position)));
+ }
+
+ for (;;) {
+ if (node->is_inst()) {
+ InstNode* inst = node->as<InstNode>();
+ RAInst* ra_inst = inst->pass_data<RAInst>();
+
+ // Impossible - each processed instruction node must have an associated RAInst.
+ ASMJIT_ASSERT(ra_inst != nullptr);
+
+ RATiedReg* tied_regs = ra_inst->tied_regs();
+ uint32_t count = ra_inst->tied_count();
+
+ inst->set_position(NodePosition(position));
+ ra_inst->_live_count = cur_live_count;
+
+ for (uint32_t j = 0; j < count; j++) {
+ RATiedReg* tied_reg = &tied_regs[j];
+ RAWorkReg* work_reg = tied_reg->work_reg();
+
+ RAWorkId work_id = work_reg->work_id();
+
+ // Create refs and writes.
+ work_reg->_refs.append_unchecked(node);
+ if (tied_reg->is_write()) {
+ work_reg->_writes.append_unchecked(node);
+ }
+
+ // We couldn't calculate this in previous steps, but since we know all LIVE-OUT at this point it becomes
+ // trivial. If this is the last instruction that uses this `work_reg` and it's not LIVE-OUT then it is a
+ // KILL here.
+ if (tied_reg->is_last() && (size_t(work_id) >= multi_work_reg_count || !BitOps::bit_at(live_out, work_id))) {
+ tied_reg->add_flags(RATiedFlags::kKill);
+ }
+
+ RALiveSpans& live_spans = work_reg->live_spans();
+ bool was_open;
+
+ ASMJIT_PROPAGATE(live_spans.open_at(
+ arena(), NodePosition(position + !tied_reg->is_read()), NodePosition(end_position), was_open));
+
+ RegGroup group = work_reg->group();
+ if (!was_open) {
+ cur_live_count[group]++;
+ ra_inst->_live_count[group]++;
+ }
+
+ if (tied_reg->is_kill()) {
+ live_spans.close_at(NodePosition(position + !tied_reg->is_read() + 1u));
+ cur_live_count[group]--;
+ }
+
+ // Update `RAWorkReg::use_id_mask` and `RAWorkReg::hint_reg_id`.
+ if (tied_reg->has_use_id()) {
+ uint32_t use_id = tied_reg->use_id();
+ work_reg->add_use_id_mask(Support::bit_mask<RegMask>(use_id));
+ if (!work_reg->has_hint_reg_id() && !Support::bit_test(ra_inst->_clobbered_regs[group], use_id)) {
+ work_reg->set_hint_reg_id(use_id);
+ }
+ }
+
+ if (tied_reg->use_reg_mask()) {
+ work_reg->restrict_preferred_mask(tied_reg->use_reg_mask());
+ if (work_reg->is_lead_consecutive()) {
+ work_reg->restrict_consecutive_mask(tied_reg->use_reg_mask());
+ }
+ }
+
+ if (tied_reg->out_reg_mask()) {
+ work_reg->restrict_preferred_mask(tied_reg->out_reg_mask());
+ if (work_reg->is_lead_consecutive()) {
+ work_reg->restrict_consecutive_mask(tied_reg->out_reg_mask());
+ }
+ }
+
+ // Update `RAWorkReg::clobber_survival_mask`.
+ if (ra_inst->_clobbered_regs[group] && !tied_reg->is_out_or_kill()) {
+ work_reg->add_clobber_survival_mask(ra_inst->_clobbered_regs[group]);
+ }
+ }
+
+ if (node->is_invoke()) {
+ func()->frame().update_call_stack_alignment(node->as<InvokeNode>()->detail().natural_stack_alignment());
+ }
+
+ position += 2;
+ max_live_count.op<Support::Max>(ra_inst->_live_count);
+ }
+
+ if (node == stop) {
+ break;
+ }
+
+ node = node->next();
+ ASMJIT_ASSERT(node != nullptr);
+ }
+
+ block->_max_live_count = max_live_count;
+ _global_live_max_count.op<Support::Max>(max_live_count);
+ ASMJIT_ASSERT(NodePosition(position) == block->end_position());
+ }
+
+ // Calculate WorkReg statistics
+ // ----------------------------
+
+ for (uint32_t i = 0; i < num_work_regs; i++) {
+ RAWorkReg* work_reg = _work_regs[i];
+
+ RALiveSpans& spans = work_reg->live_spans();
+ uint32_t width = spans.width();
+ float freq = width ? float(double(work_reg->_refs.size()) / double(width)) : float(0);
+
+ RALiveStats& stats = work_reg->live_stats();
+ stats._width = width;
+ stats._freq = freq;
+ stats._priority = freq + float(int(work_reg->virt_reg()->weight())) * 0.01f;
+ }
+
+ ASMJIT_RA_LOG_COMPLEX({
+ String& sb = _tmp_string;
+ sb.clear();
+ dump_live_spans(sb);
+ logger->log(sb);
+ });
+
+ n_insts_per_block.release(arena());
+ return Error::kOk;
+}
+
+Error BaseRAPass::assign_arg_index_to_work_regs() noexcept {
+ Span<const BitWord> live_in = entry_block()->live_in();
+
+ uint32_t arg_count = func()->arg_count();
+ uint32_t multi_work_reg_count = _multi_work_reg_count;
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ // Unassigned argument.
+ const RegOnly& reg_arg = func()->arg_pack(arg_index)[value_index];
+ if (!reg_arg.is_reg() || !cc().is_virt_id_valid(reg_arg.id())) {
+ continue;
+ }
+
+ VirtReg* virt_reg = cc().virt_reg_by_id(reg_arg.id());
+ if (!virt_reg) {
+ continue;
+ }
+
+ // Unreferenced argument.
+ RAWorkReg* work_reg = virt_reg->work_reg();
+ if (!work_reg) {
+ continue;
+ }
+
+ // Overwritten argument.
+ RAWorkId work_id = work_reg->work_id();
+ if (uint32_t(work_id) >= multi_work_reg_count || !BitOps::bit_at(live_in, work_id)) {
+ continue;
+ }
+
+ work_reg->set_arg_index(arg_index, value_index);
+ const FuncValue& arg = func()->detail().arg(arg_index, value_index);
+
+ if (arg.is_reg() && RegUtils::group_of(arg.reg_type()) == work_reg->group()) {
+ work_reg->set_hint_reg_id(arg.reg_id());
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Allocation - Global
+// ================================
+
+#ifndef ASMJIT_NO_LOGGING
+static void RAPass_dump_spans(String& sb, uint32_t index, const RALiveSpans& live_spans) noexcept {
+ sb.append_format(" %02u: ", index);
+
+ for (uint32_t i = 0; i < live_spans.size(); i++) {
+ const RALiveSpan& live_span = live_spans[i];
+ if (i) {
+ sb.append(", ");
+ }
+ sb.append_format("[%u:%u]", live_span.a, live_span.b);
+ }
+
+ sb.append('\n');
+}
+#endif
+
+Error BaseRAPass::run_global_allocator() noexcept {
+ ASMJIT_PROPAGATE(init_global_live_spans());
+
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ ASMJIT_PROPAGATE(bin_pack(group));
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SPEED Error BaseRAPass::init_global_live_spans() noexcept {
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ size_t phys_count = _phys_reg_count.get(group);
+ RALiveSpans* live_spans = nullptr;
+
+ if (phys_count) {
+ live_spans = arena().alloc_oneshot<RALiveSpans>(phys_count * sizeof(RALiveSpans));
+ if (ASMJIT_UNLIKELY(!live_spans)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ for (size_t phys_id = 0; phys_id < phys_count; phys_id++) {
+ new(Support::PlacementNew{&live_spans[phys_id]}) RALiveSpans();
+ }
+ }
+
+ _global_live_spans[group] = live_spans;
+ }
+
+ return Error::kOk;
+}
+
+struct RAConsecutiveReg {
+ RAWorkReg* work_reg;
+ RAWorkReg* parent_reg;
+};
+
+ASMJIT_FAVOR_SPEED Error BaseRAPass::bin_pack(RegGroup group) noexcept {
+ if (work_reg_count(group) == 0)
+ return Error::kOk;
+
+#ifndef ASMJIT_NO_LOGGING
+ Logger* logger = logger_if(DiagnosticOptions::kRADebugAssignment);
+ String& sb = _tmp_string;
+
+ ASMJIT_RA_LOG_FORMAT("[bin_pack] Available=%u (0x%08X) Count=%u RegGroup=%u\n",
+ Support::popcnt(_available_regs[group]),
+ _available_regs[group],
+ work_reg_count(group),
+ uint32_t(group));
+#endif
+
+ uint32_t phys_count = _phys_reg_count.get(group);
+
+ ArenaVector<RAWorkReg*> work_regs;
+ ArenaVector<RAConsecutiveReg> consecutive_regs;
+ RALiveSpans tmp_spans;
+
+ ArenaVector<RAWorkReg*>& group_regs = this->work_regs(group);
+ ASMJIT_PROPAGATE(work_regs.reserve_fit(arena(), group_regs.size()));
+
+ work_regs.assign_unchecked(group_regs);
+ work_regs.sort([](const RAWorkReg* a, const RAWorkReg* b) noexcept {
+ return b->live_stats().priority() - a->live_stats().priority();
+ });
+
+ size_t num_work_regs = work_regs.size();
+ RegMask available_regs = _available_regs[group];
+ RegMask preserved_regs = func()->frame().preserved_regs(group);
+
+ // First try to pack everything that provides register-id hint as these are most likely function arguments and fixed
+ // (pre-colored) virtual registers.
+ if (!work_regs.is_empty()) {
+ uint32_t dst_index = 0;
+
+ for (uint32_t index = 0; index < num_work_regs; index++) {
+ RAWorkReg* work_reg = work_regs[index];
+
+ if (work_reg->is_lead_consecutive()) {
+ ASMJIT_PROPAGATE(consecutive_regs.append(arena(), RAConsecutiveReg{work_reg, nullptr}));
+ work_reg->mark_processed_consecutive();
+ }
+
+ if (work_reg->has_hint_reg_id()) {
+ uint32_t phys_id = work_reg->hint_reg_id();
+ if (Support::bit_test(available_regs, phys_id)) {
+ RALiveSpans& live = _global_live_spans[group][phys_id];
+ Error err = tmp_spans.non_overlapping_union_of(arena(), live, work_reg->live_spans());
+
+ if (err == Error::kOk) {
+ live.swap(tmp_spans);
+ work_reg->set_home_reg_id(phys_id);
+ work_reg->mark_allocated();
+ continue;
+ }
+
+ if (err != Error::kByPass) {
+ return err;
+ }
+ }
+ }
+
+ work_regs[dst_index++] = work_reg;
+ }
+
+ work_regs._set_size(dst_index);
+ num_work_regs = dst_index;
+ }
+
+ // Allocate consecutive registers - both leads and all consecutives. This is important and prioritized over the rest,
+ // because once a lead is allocated we really need to allocate its consecutives, otherwise we may bin pack other
+ // registers into their places, which would result in wrong hints to the local allocator, and then into many moves
+ // or spills.
+ if (!consecutive_regs.is_empty()) {
+ // This loop appends all other consecutive registers into `consecutive_regs` array. Leads are at the beginning,
+ // non-leads follow.
+ for (size_t i = 0;;) {
+ size_t stop = consecutive_regs.size();
+ if (i == stop) {
+ break;
+ }
+
+ while (i < stop) {
+ RAWorkReg* work_reg = consecutive_regs[i].work_reg;
+ if (work_reg->has_immediate_consecutives()) {
+ ArenaBitSet::ForEachBitSet it(work_reg->immediate_consecutives());
+ while (it.has_next()) {
+ RAWorkId consecutive_work_id = RAWorkId(it.next());
+ RAWorkReg* consecutive_reg = work_reg_by_id(consecutive_work_id);
+ if (!consecutive_reg->is_processed_consecutive()) {
+ ASMJIT_PROPAGATE(consecutive_regs.append(arena(), RAConsecutiveReg{consecutive_reg, work_reg}));
+ consecutive_reg->mark_processed_consecutive();
+ }
+ }
+ }
+ i++;
+ }
+ }
+
+ for (RAConsecutiveReg& consecutive_reg : consecutive_regs) {
+ RAWorkReg* work_reg = consecutive_reg.work_reg;
+ if (work_reg->is_allocated()) {
+ continue;
+ }
+
+ RAWorkReg* parent_reg = consecutive_reg.parent_reg;
+ RegMask phys_regs = 0;
+
+ if (!parent_reg) {
+ phys_regs = available_regs & work_reg->preferred_mask();
+ if (!phys_regs) {
+ phys_regs = available_regs & work_reg->consecutive_mask();
+
+ // NOTE: This should never be true as it would mean we would never allocate this virtual register
+ // (not here, and not later when local register allocator processes RATiedReg sets).
+ if (ASMJIT_UNLIKELY(!phys_regs)) {
+ return make_error(Error::kConsecutiveRegsAllocation);
+ }
+ }
+ }
+ else if (parent_reg->has_home_reg_id()) {
+ uint32_t consecutive_id = parent_reg->home_reg_id() + 1;
+
+ // NOTE: We don't support wrapping. If this goes beyond all allocable registers there is something wrong.
+ if (consecutive_id > 31 || !Support::bit_test(available_regs, consecutive_id)) {
+ return make_error(Error::kConsecutiveRegsAllocation);
+ }
+
+ work_reg->set_hint_reg_id(consecutive_id);
+ phys_regs = Support::bit_mask<uint32_t>(consecutive_id);
+ }
+
+ while (phys_regs) {
+ uint32_t phys_id = Support::bit_size_of<RegMask> - 1 - Support::clz(phys_regs);
+
+ RALiveSpans& live = _global_live_spans[group][phys_id];
+ Error err = tmp_spans.non_overlapping_union_of(arena(), live, work_reg->live_spans());
+
+ if (err == Error::kOk) {
+ work_reg->set_home_reg_id(phys_id);
+ work_reg->mark_allocated();
+ live.swap(tmp_spans);
+ break;
+ }
+
+ if (ASMJIT_UNLIKELY(err != Error::kByPass)) {
+ return err;
+ }
+
+ phys_regs ^= Support::bit_mask<RegMask>(phys_id);
+ }
+ }
+ }
+
+ // Try to pack the rest.
+ if (!work_regs.is_empty()) {
+ size_t dst_index = 0;
+
+ for (size_t index = 0; index < num_work_regs; index++) {
+ RAWorkReg* work_reg = work_regs[index];
+ if (work_reg->is_allocated()) {
+ continue;
+ }
+
+ RegMask remaining_phys_regs = available_regs;
+ if (remaining_phys_regs & work_reg->preferred_mask()) {
+ remaining_phys_regs &= work_reg->preferred_mask();
+ }
+
+ RegMask phys_regs = remaining_phys_regs & ~preserved_regs;
+ remaining_phys_regs &= preserved_regs;
+
+ for (;;) {
+ if (!phys_regs) {
+ if (!remaining_phys_regs) {
+ break;
+ }
+ phys_regs = remaining_phys_regs;
+ remaining_phys_regs = 0;
+ }
+
+ uint32_t phys_id = Support::ctz(phys_regs);
+
+ if (work_reg->clobber_survival_mask()) {
+ RegMask preferred_mask = (phys_regs | remaining_phys_regs) & work_reg->clobber_survival_mask();
+ if (preferred_mask) {
+ if (preferred_mask & ~remaining_phys_regs) {
+ preferred_mask &= ~remaining_phys_regs;
+ }
+ phys_id = Support::ctz(preferred_mask);
+ }
+ }
+
+ RALiveSpans& live = _global_live_spans[group][phys_id];
+ Error err = tmp_spans.non_overlapping_union_of(arena(), live, work_reg->live_spans());
+
+ if (err == Error::kOk) {
+ work_reg->set_home_reg_id(phys_id);
+ work_reg->mark_allocated();
+ live.swap(tmp_spans);
+ break;
+ }
+
+ if (ASMJIT_UNLIKELY(err != Error::kByPass)) {
+ return err;
+ }
+
+ phys_regs &= ~Support::bit_mask<RegMask>(phys_id);
+ remaining_phys_regs &= ~Support::bit_mask<RegMask>(phys_id);
+ }
+
+ // Keep it in `work_regs` if it was not allocated.
+ if (!phys_regs) {
+ work_regs[dst_index++] = work_reg;
+ }
+ }
+
+ work_regs._set_size(dst_index);
+ num_work_regs = dst_index;
+ }
+
+ ASMJIT_RA_LOG_COMPLEX({
+ for (uint32_t phys_id = 0; phys_id < phys_count; phys_id++) {
+ RALiveSpans& live = _global_live_spans[group][phys_id];
+ if (live.is_empty()) {
+ continue;
+ }
+
+ sb.clear();
+ RAPass_dump_spans(sb, phys_id, live);
+ logger->log(sb);
+ }
+ });
+
+ // Maybe unused if logging is disabled.
+ Support::maybe_unused(phys_count);
+
+ if (work_regs.is_empty()) {
+ ASMJIT_RA_LOG_FORMAT(" completed.\n");
+ }
+ else {
+ _strategy[group].set_type(RAStrategyType::kComplex);
+ for (RAWorkReg* work_reg : work_regs) {
+ work_reg->mark_stack_preferred();
+ }
+
+ ASMJIT_RA_LOG_COMPLEX({
+ size_t count = work_regs.size();
+ sb.clear();
+ sb.append_format(" Unassigned (%zu): ", count);
+ for (uint32_t i = 0; i < num_work_regs; i++) {
+ RAWorkReg* work_reg = work_regs[i];
+ if (i) {
+ sb.append(", ");
+ }
+ Formatter::format_virt_reg_name(sb, work_reg->virt_reg());
+ }
+ sb.append('\n');
+ logger->log(sb);
+ });
+ }
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Allocation - Local
+// ===============================
+
+Error BaseRAPass::run_local_allocator() noexcept {
+ RALocalAllocator lra(*this);
+ ASMJIT_PROPAGATE(lra.init());
+
+ if (!block_count()) {
+ return Error::kOk;
+ }
+
+ // The allocation is done when this reaches zero.
+ size_t blocks_remaining = reachable_block_count();
+
+ // Current block.
+ uint32_t block_id = 0;
+ RABlock* block = _blocks[block_id];
+
+ // The first block (entry) must always be reachable.
+ ASMJIT_ASSERT(block->is_reachable());
+
+ // Assign function arguments for the initial block. The `lra` is valid now.
+ ASMJIT_PROPAGATE(lra.make_initial_assignment());
+ ASMJIT_PROPAGATE(set_block_entry_assignment(block, block, lra._cur_assignment));
+
+ // The loop starts from the first block and iterates blocks in order, however, the algorithm also allows to jump to
+ // any other block when finished if it's a jump target. In-order iteration just makes sure that all blocks are visited.
+ for (;;) {
+ BaseNode* first = block->first();
+ BaseNode* last = block->last();
+ BaseNode* terminator = block->has_terminator() ? last : nullptr;
+
+ BaseNode* before_first = first->prev();
+ BaseNode* after_last = last->next();
+
+ bool is_unconditional_jump = false;
+ RABlock* consecutive = block->has_successors() ? block->successors()[0] : nullptr;
+
+ lra.set_block(block);
+ block->make_allocated();
+
+ BaseNode* node = first;
+ while (node != after_last) {
+ BaseNode* next = node->next();
+ if (node->is_inst()) {
+ InstNode* inst = node->as<InstNode>();
+
+ if (ASMJIT_UNLIKELY(inst == terminator)) {
+ Span<RABlock*> successors = block->successors();
+ if (block->has_consecutive()) {
+ ASMJIT_PROPAGATE(lra.alloc_branch(inst, successors.last(), successors.first()));
+
+ node = next;
+ continue;
+ }
+ else if (successors.size() > 1) {
+ RABlock* cont = block->has_consecutive() ? successors.first() : nullptr;
+ ASMJIT_PROPAGATE(lra.alloc_jump_table(inst, successors, cont));
+
+ node = next;
+ continue;
+ }
+ else {
+ // Otherwise this is an unconditional jump, special handling isn't required.
+ is_unconditional_jump = true;
+ }
+ }
+
+ ASMJIT_PROPAGATE(lra.alloc_instruction(inst));
+ if (inst->type() == NodeType::kInvoke) {
+ ASMJIT_PROPAGATE(emit_pre_call(inst->as<InvokeNode>()));
+ }
+ else {
+ ASMJIT_PROPAGATE(lra.spill_after_allocation(inst));
+ }
+ }
+ node = next;
+ }
+
+ if (consecutive) {
+ BaseNode* prev = after_last ? after_last->prev() : cc().last_node();
+ cc().set_cursor(is_unconditional_jump ? prev->prev() : prev);
+
+ if (consecutive->has_entry_assignment()) {
+ ASMJIT_PROPAGATE(lra.switch_to_assignment(consecutive->entry_phys_to_work_map(), consecutive->live_in(), consecutive->is_allocated(), false));
+ }
+ else {
+ ASMJIT_PROPAGATE(lra.spill_regs_before_entry(consecutive));
+ ASMJIT_PROPAGATE(set_block_entry_assignment(consecutive, block, lra._cur_assignment));
+ lra._cur_assignment.copy_from(consecutive->entry_phys_to_work_map());
+ }
+ }
+
+ // Important as the local allocator can insert instructions before
+ // and after any instruction within the basic block.
+ block->set_first(before_first->next());
+ block->set_last(after_last ? after_last->prev() : cc().last_node());
+
+ if (--blocks_remaining == 0) {
+ break;
+ }
+
+ // Switch to the next consecutive block, if any.
+ if (consecutive) {
+ block = consecutive;
+ if (!block->is_allocated()) {
+ continue;
+ }
+ }
+
+ // Get the next block.
+ for (;;) {
+ if (++block_id >= block_count()) {
+ block_id = 0;
+ }
+
+ block = _blocks[block_id];
+ if (!block->is_reachable() || block->is_allocated() || !block->has_entry_assignment()) {
+ continue;
+ }
+
+ break;
+ }
+
+ // If we switched to another block we have to update the local allocator.
+ ASMJIT_PROPAGATE(lra.replace_assignment(block->entry_phys_to_work_map()));
+ }
+
+ _clobbered_regs.op<Support::Or>(lra._clobbered_regs);
+ return Error::kOk;
+}
+
+Error BaseRAPass::set_block_entry_assignment(RABlock* block, const RABlock* from_block, const RAAssignment& from_assignment) noexcept {
+ if (block->has_shared_assignment_id()) {
+ uint32_t shared_assignment_id = block->shared_assignment_id();
+
+ // Shouldn't happen. Entry assignment of a block that has a shared-state will assign to all blocks
+ // with the same shared_assignment_id. It's a bug if the shared state has been already assigned.
+ if (!_shared_assignments[shared_assignment_id].is_empty()) {
+ return make_error(Error::kInvalidState);
+ }
+
+ return set_shared_assignment(shared_assignment_id, from_assignment);
+ }
+
+ PhysToWorkMap* phys_to_work_map = clone_phys_to_work_map(from_assignment.phys_to_work_map());
+ if (ASMJIT_UNLIKELY(!phys_to_work_map)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ block->set_entry_assignment(phys_to_work_map);
+
+ // True if this is the first (entry) block, nothing to do in this case.
+ if (block == from_block) {
+ // Entry block should never have a shared state.
+ if (block->has_shared_assignment_id()) {
+ return make_error(Error::kInvalidState);
+ }
+
+ return Error::kOk;
+ }
+
+ Span<const BitWord> live_out = from_block->live_out();
+ Span<const BitWord> live_in = block->live_in();
+
+ // It's possible that `from_block` has LIVE-OUT regs that `block` doesn't
+ // have in LIVE-IN, these have to be unassigned.
+ {
+ Support::BitVectorOpIterator<BitWord, Support::AndNot> it(live_out, live_in);
+ while (it.has_next()) {
+ RAWorkId work_id = RAWorkId(it.next());
+ RAWorkReg* work_reg = work_reg_by_id(work_id);
+
+ RegGroup group = work_reg->group();
+ uint32_t phys_id = from_assignment.work_to_phys_id(group, work_id);
+
+ if (phys_id != RAAssignment::kPhysNone) {
+ phys_to_work_map->unassign(group, phys_id, _phys_reg_index.get(group) + phys_id);
+ }
+ }
+ }
+
+ return block_entry_assigned(phys_to_work_map);
+}
+
+Error BaseRAPass::set_shared_assignment(uint32_t shared_assignment_id, const RAAssignment& from_assignment) noexcept {
+ ASMJIT_ASSERT(_shared_assignments[shared_assignment_id].is_empty());
+
+ PhysToWorkMap* phys_to_work_map = clone_phys_to_work_map(from_assignment.phys_to_work_map());
+ if (ASMJIT_UNLIKELY(!phys_to_work_map)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _shared_assignments[shared_assignment_id].assign_phys_to_work_map(phys_to_work_map);
+ ASMJIT_PROPAGATE(_shared_assignments[shared_assignment_id]._live_in.resize(arena(), multi_work_reg_count()));
+
+ Span<BitWord> shared_live_in = _shared_assignments[shared_assignment_id]._live_in.as_span();
+ Support::Array<uint32_t, Globals::kNumVirtGroups> shared_assigned {};
+
+ for (RABlock* block : blocks()) {
+ if (block->shared_assignment_id() == shared_assignment_id) {
+ ASMJIT_ASSERT(!block->has_entry_assignment());
+
+ PhysToWorkMap* entry_phys_to_work_map = clone_phys_to_work_map(from_assignment.phys_to_work_map());
+ if (ASMJIT_UNLIKELY(!entry_phys_to_work_map)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ block->set_entry_assignment(entry_phys_to_work_map);
+
+ Span<const BitWord> live_in = block->live_in();
+ BitOps::or_(shared_live_in, shared_live_in, live_in);
+
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ shared_assigned[group] |= entry_phys_to_work_map->assigned[group];
+
+ uint32_t phys_base_index = _phys_reg_index.get(group);
+ Support::BitWordIterator<RegMask> it(entry_phys_to_work_map->assigned[group]);
+
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ RAWorkId work_id = entry_phys_to_work_map->work_ids[phys_base_index + phys_id];
+
+ // Should not happen as a register that only lives in a single basic block should not appear in the map.
+ ASMJIT_ASSERT(uint32_t(work_id) < _multi_work_reg_count);
+
+ if (!BitOps::bit_at(live_in, work_id)) {
+ entry_phys_to_work_map->unassign(group, phys_id, phys_base_index + phys_id);
+ }
+ }
+ }
+ }
+ }
+
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ uint32_t phys_base_index = _phys_reg_index.get(group);
+ Support::BitWordIterator<RegMask> it(_available_regs[group] & ~shared_assigned[group]);
+
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ if (Support::bit_test(phys_to_work_map->assigned[group], phys_id)) {
+ phys_to_work_map->unassign(group, phys_id, phys_base_index + phys_id);
+ }
+ }
+ }
+
+ return block_entry_assigned(phys_to_work_map);
+}
+
+Error BaseRAPass::block_entry_assigned(const PhysToWorkMap* phys_to_work_map) noexcept {
+ // Complex allocation strategy requires to record register assignments upon block entry (or per shared state).
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ if (!_strategy[group].is_complex()) {
+ continue;
+ }
+
+ uint32_t phys_base_index = _phys_reg_index.get(group);
+ Support::BitWordIterator<RegMask> it(phys_to_work_map->assigned[group]);
+
+ while (it.has_next()) {
+ uint32_t phys_id = it.next();
+ RAWorkId work_id = phys_to_work_map->work_ids[phys_base_index + phys_id];
+
+ RAWorkReg* work_reg = work_reg_by_id(work_id);
+ work_reg->add_allocated_mask(Support::bit_mask<RegMask>(phys_id));
+ }
+ }
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Allocation - Utilities
+// ===================================
+
+Error BaseRAPass::use_temporary_mem(BaseMem& out, uint32_t size, uint32_t alignment) noexcept {
+ ASMJIT_ASSERT(alignment <= 64);
+
+ if (_temporary_mem.is_none()) {
+ ASMJIT_PROPAGATE(cc()._new_stack(Out(_temporary_mem.as<BaseMem>()), size, alignment));
+ }
+ else {
+ ASMJIT_ASSERT(_temporary_mem.as<BaseMem>().is_reg_home());
+
+ uint32_t virt_id = _temporary_mem.as<BaseMem>().base_id();
+ VirtReg* virt_reg = cc().virt_reg_by_id(virt_id);
+
+ cc().set_stack_size(virt_id, Support::max(virt_reg->virt_size(), size),
+ Support::max(virt_reg->alignment(), alignment));
+ }
+
+ out = _temporary_mem.as<BaseMem>();
+ return Error::kOk;
+}
+
+// BaseRAPass - Allocation - Prolog & Epilog
+// =========================================
+
+Error BaseRAPass::update_stack_frame() noexcept {
+ // Update some StackFrame information that we updated during allocation. The only information we don't have at the
+ // moment is final local stack size, which is calculated last.
+ FuncFrame& frame = func()->frame();
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ frame.add_dirty_regs(group, _clobbered_regs[group]);
+ }
+ frame.set_local_stack_alignment(_stack_allocator.alignment());
+
+ // If there are stack arguments that are not assigned to registers upon entry and the function doesn't require
+ // dynamic stack alignment we keep these arguments where they are. This will also mark all stack slots that match
+ // these arguments as allocated.
+ if (_num_stack_args_to_stack_slots) {
+ ASMJIT_PROPAGATE(_mark_stack_args_to_keep());
+ }
+
+ // Calculate offsets of all stack slots and update StackSize to reflect the calculated local stack size.
+ ASMJIT_PROPAGATE(_stack_allocator.calculate_stack_frame());
+ frame.set_local_stack_size(_stack_allocator.stack_size());
+
+ // Update the stack frame based on `_args_assignment` and finalize it. Finalization means to apply final calculation
+ // to the stack layout.
+ ASMJIT_PROPAGATE(_args_assignment.update_func_frame(frame));
+ ASMJIT_PROPAGATE(frame.finalize());
+
+ // StackAllocator allocates all stots starting from [0], adjust them when necessary.
+ if (frame.local_stack_offset() != 0) {
+ ASMJIT_PROPAGATE(_stack_allocator.adjust_slot_offsets(int32_t(frame.local_stack_offset())));
+ }
+
+ // Again, if there are stack arguments allocated in function's stack we have to handle them. This handles all cases
+ // (either regular or dynamic stack alignment).
+ if (_num_stack_args_to_stack_slots) {
+ ASMJIT_PROPAGATE(_update_stack_args());
+ }
+
+ return Error::kOk;
+}
+
+Error BaseRAPass::_mark_stack_args_to_keep() noexcept {
+ FuncFrame& frame = func()->frame();
+ bool has_sa_reg = frame.has_preserved_fp() || !frame.has_dynamic_alignment();
+
+ ArenaVector<RAWorkReg*>& work_regs = _work_regs;
+ size_t num_work_regs = work_reg_count();
+
+ for (size_t work_id = 0; work_id < num_work_regs; work_id++) {
+ RAWorkReg* work_reg = work_regs[work_id];
+ if (work_reg->has_flag(RAWorkRegFlags::kStackArgToStack)) {
+ ASMJIT_ASSERT(work_reg->has_arg_index());
+ const FuncValue& src_arg = _func->detail().arg(work_reg->arg_index());
+
+ // If the register doesn't have stack slot then we failed. It doesn't make much sense as it was marked as
+ // `kFlagStackArgToStack`, which requires the WorkReg was live-in upon function entry.
+ RAStackSlot* slot = work_reg->stack_slot();
+ if (ASMJIT_UNLIKELY(!slot)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (has_sa_reg && src_arg.is_stack() && !src_arg.is_indirect()) {
+ uint32_t type_size = TypeUtils::size_of(src_arg.type_id());
+ if (type_size == slot->size()) {
+ slot->add_flags(RAStackSlot::kFlagStackArg);
+ continue;
+ }
+ }
+
+ // NOTE: Update StackOffset here so when `_args_assignment.update_func_frame()` is called it will take into
+ // consideration moving to stack slots. Without this we may miss some scratch registers later.
+ FuncValue& dst_arg = _args_assignment.arg(work_reg->arg_index(), work_reg->arg_value_index());
+ dst_arg.assign_stack_offset(0);
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error BaseRAPass::_update_stack_args() noexcept {
+ FuncFrame& frame = func()->frame();
+
+ ArenaVector<RAWorkReg*>& work_regs = _work_regs;
+ size_t num_work_regs = work_reg_count();
+
+ for (size_t work_id = 0; work_id < num_work_regs; work_id++) {
+ RAWorkReg* work_reg = work_regs[work_id];
+ if (work_reg->has_flag(RAWorkRegFlags::kStackArgToStack)) {
+ ASMJIT_ASSERT(work_reg->has_arg_index());
+ RAStackSlot* slot = work_reg->stack_slot();
+
+ if (ASMJIT_UNLIKELY(!slot)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (slot->is_stack_arg()) {
+ const FuncValue& src_arg = _func->detail().arg(work_reg->arg_index());
+ if (frame.has_preserved_fp()) {
+ slot->set_base_reg_id(_fp.id());
+ slot->set_offset(int32_t(frame.sa_offset_from_sa()) + src_arg.stack_offset());
+ }
+ else {
+ slot->set_offset(int32_t(frame.sa_offset_from_sp()) + src_arg.stack_offset());
+ }
+ }
+ else {
+ FuncValue& dst_arg = _args_assignment.arg(work_reg->arg_index(), work_reg->arg_value_index());
+ dst_arg.set_stack_offset(slot->offset());
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error BaseRAPass::insert_prolog_epilog() noexcept {
+ FuncFrame& frame = _func->frame();
+
+ cc().set_cursor(func());
+ ASMJIT_PROPAGATE(cc().emit_prolog(frame));
+ ASMJIT_PROPAGATE(_emit_helper_ptr->emit_args_assignment(frame, _args_assignment));
+
+ cc().set_cursor(func()->exit_node());
+ ASMJIT_PROPAGATE(cc().emit_epilog(frame));
+
+ return Error::kOk;
+}
+
+// BaseRAPass - Rewriter
+// =====================
+
+// [[pure virtual]]
+Error BaseRAPass::rewrite() noexcept {
+ return make_error(Error::kInvalidState);
+}
+
+// BaseRAPass - Emit
+// =================
+
+// [[pure virtual]]
+Error BaseRAPass::emit_move(RAWorkReg* work_reg, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept {
+ Support::maybe_unused(work_reg, dst_phys_id, src_phys_id);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseRAPass::emit_swap(RAWorkReg* a_reg, uint32_t a_phys_id, RAWorkReg* b_reg, uint32_t b_phys_id) noexcept {
+ Support::maybe_unused(a_reg, a_phys_id, b_reg, b_phys_id);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseRAPass::emit_load(RAWorkReg* work_reg, uint32_t dst_phys_id) noexcept {
+ Support::maybe_unused(work_reg, dst_phys_id);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseRAPass::emit_save(RAWorkReg* work_reg, uint32_t src_phys_id) noexcept {
+ Support::maybe_unused(work_reg, src_phys_id);
+ return make_error(Error::kInvalidState);
+}
+
+// [[pure virtual]]
+Error BaseRAPass::emit_jump(const Label& label) noexcept {
+ Support::maybe_unused(label);
+ return make_error(Error::kInvalidState);
+}
+
+Error BaseRAPass::emit_pre_call(InvokeNode* invoke_node) noexcept {
+ Support::maybe_unused(invoke_node);
+ return make_error(Error::kOk);
+}
+
+// BaseRAPass - Logging
+// ====================
+
+#ifndef ASMJIT_NO_LOGGING
+static void RAPass_formatLiveness(BaseRAPass* pass, String& sb, const RAInst* ra_inst) noexcept {
+ Support::maybe_unused(pass);
+
+ const RATiedReg* tied_regs = ra_inst->tied_regs();
+ uint32_t tied_count = ra_inst->tied_count();
+
+ for (uint32_t i = 0; i < tied_count; i++) {
+ const RATiedReg& tied_reg = tied_regs[i];
+
+ if (i != 0) {
+ sb.append(' ');
+ }
+
+ Formatter::format_virt_reg_name(sb, tied_reg.work_reg()->virt_reg());
+ sb.append('{');
+ sb.append(tied_reg.is_read_write() ? 'X' :
+ tied_reg.is_read() ? 'R' :
+ tied_reg.is_write() ? 'W' : '?');
+
+ if (tied_reg.is_lead_consecutive()) {
+ sb.append_format("|Lead[%u]", tied_reg.consecutive_data() + 1u);
+ }
+
+ if (tied_reg.has_use_id()) {
+ sb.append_format("|Use=%u", tied_reg.use_id());
+ }
+ else if (tied_reg.is_use()) {
+ sb.append("|Use");
+ }
+
+ if (tied_reg.is_use_consecutive() && !tied_reg.is_lead_consecutive()) {
+ sb.append_format("+%u", tied_reg.consecutive_data());
+ }
+
+ if (tied_reg.has_out_id()) {
+ sb.append_format("|Out=%u", tied_reg.out_id());
+ }
+ else if (tied_reg.is_out()) {
+ sb.append("|Out");
+ }
+
+ if (tied_reg.is_out_consecutive() && !tied_reg.is_lead_consecutive()) {
+ sb.append_format("+%u", tied_reg.consecutive_data());
+ }
+
+ if (tied_reg.is_first()) {
+ sb.append("|First");
+ }
+
+ if (tied_reg.is_last()) {
+ sb.append("|Last");
+ }
+
+ if (tied_reg.is_kill()) {
+ sb.append("|Kill");
+ }
+
+ sb.append("}");
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error BaseRAPass::annotate_code() noexcept {
+ StringTmp<1024> sb;
+
+ for (const RABlock* block : _blocks) {
+ BaseNode* node = block->first();
+ if (!node) {
+ continue;
+ }
+
+ BaseNode* last = block->last();
+ for (;;) {
+ sb.clear();
+ Formatter::format_node(sb, _format_options, &_cb, node);
+
+ if (has_diagnostic_option(DiagnosticOptions::kRADebugLiveness) && node->is_inst() && node->has_pass_data()) {
+ const RAInst* ra_inst = node->pass_data<RAInst>();
+ if (ra_inst->tied_count() > 0) {
+ sb.pad_end(40);
+ sb.append(" | ");
+ RAPass_formatLiveness(this, sb, ra_inst);
+ }
+ }
+
+ node->set_inline_comment(static_cast<char*>(cc()._builder_arena.dup(sb.data(), sb.size(), true)));
+ if (node == last) {
+ break;
+ }
+ node = node->next();
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error BaseRAPass::dump_block_ids(String& sb, Span<RABlock*> blocks) noexcept {
+ for (size_t i = 0; i < blocks.size(); i++) {
+ const RABlock* block = blocks[i];
+ ASMJIT_PROPAGATE(sb.append_format(!i ? "#%u" : ", #%u", uint32_t(block->block_id())));
+ }
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error BaseRAPass::dump_block_liveness(String& sb, const RABlock* block) noexcept {
+ for (uint32_t live_type = 0; live_type < RABlock::kLiveCount; live_type++) {
+ const char* info_name = live_type == RABlock::kLiveIn ? "IN " :
+ live_type == RABlock::kLiveOut ? "OUT " : "KILL";
+
+ Support::BitVectorIterator<BitWord> it(block->live_bits(live_type));
+ if (it.has_next()) {
+ bool first = true;
+
+ sb.append_format(" %s [", info_name);
+ do {
+ const RAWorkReg* work_reg = work_reg_by_id(RAWorkId(it.next()));
+ if (!first) {
+ sb.append(", ");
+ }
+
+ Formatter::format_virt_reg_name(sb, work_reg->virt_reg());
+ first = false;
+ } while (it.has_next());
+ sb.append("]\n");
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error BaseRAPass::dump_live_spans(String& sb) noexcept {
+ size_t max_size = _max_work_reg_name_size;
+
+ for (RAWorkReg* work_reg : _work_regs.iterate()) {
+ RALiveStats& stats = work_reg->live_stats();
+
+ sb.append(" ");
+ size_t old_size = sb.size();
+
+ Formatter::format_virt_reg_name(sb, work_reg->virt_reg());
+ sb.pad_end(old_size + max_size);
+
+ sb.append_format(" {ra_id=%-5u virt_id=%-5u width=%-5u freq=%0.5f priority=%0.5f ",
+ uint32_t(work_reg->work_id()),
+ work_reg->virt_id(),
+ stats.width(),
+ double(stats.freq()),
+ double(stats.priority()));
+
+ if (work_reg->is_within_single_basic_block()) {
+ sb.append_format("bb=#%-4u", uint32_t(work_reg->single_basic_block_id()));
+ }
+ else {
+ sb.append("bb=<...>");
+ }
+
+ sb.append_format("}: ");
+
+ RALiveSpans& live_spans = work_reg->live_spans();
+ for (uint32_t x = 0; x < live_spans.size(); x++) {
+ const RALiveSpan& live_span = live_spans[x];
+ if (x) {
+ sb.append(", ");
+ }
+ sb.append_format("[%u:%u]", live_span.a, live_span.b);
+ }
+
+ sb.append('\n');
+ }
+
+ return Error::kOk;
+}
+#endif
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/core/rapass_p.h b/3rdparty/asmjit/asmjit/core/rapass_p.h
new file mode 100644
index 00000000000..3e9e65c02e0
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/rapass_p.h
@@ -0,0 +1,732 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RAPASS_P_H_INCLUDED
+#define ASMJIT_CORE_RAPASS_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/emithelper_p.h>
+#include <asmjit/core/raassignment_p.h>
+#include <asmjit/core/racfgblock_p.h>
+#include <asmjit/core/radefs_p.h>
+#include <asmjit/core/rainst_p.h>
+#include <asmjit/core/rastack_p.h>
+#include <asmjit/support/support_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Register allocation pass used by `BaseCompiler`.
+class BaseRAPass : public Pass {
+public:
+ ASMJIT_NONCOPYABLE(BaseRAPass)
+ using Base = Pass;
+
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kCallArgWeight = 80;
+
+ //! \}
+
+ //! \name Types
+ //! \{
+
+ using PhysToWorkMap = RAAssignment::PhysToWorkMap;
+ using WorkToPhysMap = RAAssignment::WorkToPhysMap;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Allocator that uses arena passed to `run_on_function()`.
+ Arena* _arena {};
+ //! Emit helper.
+ BaseEmitHelper* _emit_helper_ptr = nullptr;
+
+ //! Logger, disabled if null.
+ Logger* _logger = nullptr;
+ //! Format options, copied from Logger, or zeroed if there is no logger.
+ FormatOptions _format_options {};
+ //! Diagnostic options, copied from Emitter, or zeroed if there is no logger.
+ DiagnosticOptions _diagnostic_options {};
+
+ //! Function being processed.
+ FuncNode* _func = nullptr;
+ //! Stop node.
+ BaseNode* _stop = nullptr;
+ //! Start of the code that was injected.
+ BaseNode* _injection_start = nullptr;
+ //! End of the code that was injected.
+ BaseNode* _injection_end = nullptr;
+
+ //! Blocks (first block is the entry, always exists).
+ ArenaVector<RABlock*> _blocks {};
+ //! Function exit blocks (usually one, but can contain more).
+ ArenaVector<RABlock*> _exits {};
+ //! Post order view (POV).
+ ArenaVector<RABlock*> _pov {};
+
+ //! Number of instruction nodes.
+ uint32_t _instruction_count = 0;
+ //! Number of created blocks (internal).
+ uint32_t _created_block_count = 0;
+
+ //! Shared assignment blocks.
+ ArenaVector<RASharedAssignment> _shared_assignments {};
+
+ //! Timestamp generator (incremental).
+ mutable uint64_t _last_timestamp = 0;
+
+ //! Architecture traits.
+ const ArchTraits* _arch_traits = nullptr;
+ //! Index to physical registers in `RAAssignment::PhysToWorkMap`.
+ RARegIndex _phys_reg_index = RARegIndex();
+ //! Count of physical registers in `RAAssignment::PhysToWorkMap`.
+ RARegCount _phys_reg_count = RARegCount();
+ //! Total number of physical registers.
+ uint32_t _phys_reg_total = 0;
+ //! Indexes of a possible scratch registers that can be selected if necessary.
+ Support::Array<uint8_t, 2> _scratch_reg_indexes {};
+
+ //! Registers available for allocation.
+ RARegMask _available_regs = RARegMask();
+ //! Registers clobbered by the function.
+ RARegMask _clobbered_regs = RARegMask();
+
+ //! Work registers (registers used by the function).
+ ArenaVector<RAWorkReg*> _work_regs;
+ //! Work registers per register group.
+ Support::Array<ArenaVector<RAWorkReg*>, Globals::kNumVirtGroups> _work_regs_of_group;
+
+ //! Count of work registers that live across multiple basic blocks.
+ uint32_t _multi_work_reg_count = 0u;
+ //! Count of work registers, incremented before allocating _work_regs array.
+ uint32_t _total_work_reg_count = 0u;
+
+ //! Register allocation strategy per register group.
+ Support::Array<RAStrategy, Globals::kNumVirtGroups> _strategy;
+ //! Global max live-count (from all blocks) per register group.
+ RALiveCount _global_live_max_count = RALiveCount();
+ //! Global live spans per register group.
+ Support::Array<RALiveSpans*, Globals::kNumVirtGroups> _global_live_spans {};
+ //! Temporary stack slot.
+ Operand _temporary_mem = Operand();
+
+ //! Stack pointer.
+ Reg _sp = Reg();
+ //! Frame pointer.
+ Reg _fp = Reg();
+ //! Stack manager.
+ RAStackAllocator _stack_allocator {};
+ //! Function arguments assignment.
+ FuncArgsAssignment _args_assignment {};
+ //! Some StackArgs have to be assigned to StackSlots.
+ uint32_t _num_stack_args_to_stack_slots = 0;
+
+ //! Maximum name-size computed from all WorkRegs.
+ uint32_t _max_work_reg_name_size = 0;
+ //! Temporary string builder used to format comments.
+ StringTmp<192> _tmp_string;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ BaseRAPass(BaseCompiler& cc) noexcept;
+ ~BaseRAPass() noexcept override;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the associated `BaseCompiler`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseCompiler& cc() const noexcept { return static_cast<BaseCompiler&>(_cb); }
+
+ //! Returns \ref Logger passed to \ref run().
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; }
+
+ //! Returns either a valid logger if the given `option` is set and logging is enabled, or nullptr.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Logger* logger_if(DiagnosticOptions option) const noexcept { return Support::test(_diagnostic_options, option) ? _logger : nullptr; }
+
+ //! Returns whether the diagnostic `option` is enabled.
+ //!
+ //! \note Returns false if there is no logger (as diagnostics without logging make no sense).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_diagnostic_option(DiagnosticOptions option) const noexcept { return Support::test(_diagnostic_options, option); }
+
+ //! Returns \ref Arena passed to \ref run().
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arena& arena() const noexcept { return *_arena; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<RASharedAssignment> shared_assignments() const { return _shared_assignments.as_span(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t shared_assignment_count() const noexcept { return _shared_assignments.size(); }
+
+ //! Returns the current function node.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return _func; }
+
+ //! Returns the stop of the current function.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BaseNode* stop() const noexcept { return _stop; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t end_position() const noexcept { return _instruction_count * 2u; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RARegMask& available_regs() const noexcept { return _available_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RARegMask& clobbered_regs() const noexcept { return _clobbered_regs; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ inline void make_unavailable(RegGroup group, uint32_t reg_id) noexcept {
+ _available_regs[group] &= ~Support::bit_mask<RegMask>(reg_id);
+ }
+
+ inline void make_unavailable(const RARegMask::RegMasks& regs) noexcept {
+ _available_regs.clear(regs);
+ }
+
+ //! \}
+
+ //! \name Run
+ //! \{
+
+ Error run(Arena& arena, Logger* logger) override;
+
+ //! Runs the register allocator for the given `func`.
+ Error run_on_function(Arena& arena, FuncNode* func, bool last) noexcept;
+
+ //! Performs all allocation steps sequentially, called by `run_on_function()`.
+ Error on_perform_all_steps() noexcept;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ //! Called by \ref run_on_function() before the register allocation to initialize
+ //! architecture-specific data and constraints.
+ virtual void on_init() noexcept;
+
+ //! Called by \ref run_on_function() after register allocation to clean everything
+ //! up. Called even if the register allocation failed.
+ virtual void on_done() noexcept;
+
+ //! \}
+
+ //! \name CFG - Basic-Block Management
+ //! \{
+
+ //! Returns the function's entry block.
+ [[nodiscard]]
+ inline RABlock* entry_block() noexcept {
+ ASMJIT_ASSERT(!_blocks.is_empty());
+ return _blocks[0];
+ }
+
+ //! \overload
+ [[nodiscard]]
+ inline const RABlock* entry_block() const noexcept {
+ ASMJIT_ASSERT(!_blocks.is_empty());
+ return _blocks[0];
+ }
+
+ //! Returns all basic blocks of this function.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<RABlock*> blocks() noexcept { return _blocks.as_span(); }
+
+ //! Returns the count of basic blocks (returns size of `_blocks` array).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t block_count() const noexcept { return _blocks.size(); }
+
+ //! Returns the count of reachable basic blocks (returns size of `_pov` array).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t reachable_block_count() const noexcept { return _pov.size(); }
+
+ //! Tests whether the CFG has dangling blocks - these were created by `new_block()`, but not added to CFG through
+ //! `add_block()`. If `true` is returned and the CFG is constructed it means that something is missing and it's
+ //! incomplete.
+ //!
+ //! \note This is only used to check if the number of created blocks matches the number of added blocks.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_dangling_blocks() const noexcept { return _created_block_count != block_count(); }
+
+ //! Gest a next timestamp to be used to mark CFG blocks.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlockTimestamp next_timestamp() const noexcept { return RABlockTimestamp(++_last_timestamp); }
+
+ //! Creates a new `RABlock` instance.
+ //!
+ //! \note New blocks don't have ID assigned until they are added to the block array by calling `add_block()`.
+ [[nodiscard]]
+ RABlock* new_block(BaseNode* initial_node = nullptr) noexcept;
+
+ //! Tries to find a neighboring LabelNode (without going through code) that is already connected with `RABlock`.
+ //! If no label is found then a new RABlock is created and assigned to all possible labels in a backward direction.
+ [[nodiscard]]
+ RABlock* new_block_or_existing_at(LabelNode* label_node, BaseNode** stopped_at = nullptr) noexcept;
+
+ //! Adds the given `block` to the block list and assign it a unique block id.
+ [[nodiscard]]
+ Error add_block(RABlock* block) noexcept;
+
+ [[nodiscard]]
+ inline Error add_exit_block(RABlock* block) noexcept {
+ block->add_flags(RABlockFlags::kIsFuncExit);
+ return _exits.append(arena(), block);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE RAInst* new_ra_inst(InstRWFlags inst_rw_flags, RATiedFlags flags, uint32_t tied_reg_count, const RARegMask& clobbered_regs) noexcept {
+ void* p = arena().alloc_oneshot(RAInst::size_of(tied_reg_count));
+ if (ASMJIT_UNLIKELY(!p)) {
+ return nullptr;
+ }
+ return new(Support::PlacementNew{p}) RAInst(inst_rw_flags, flags, tied_reg_count, clobbered_regs);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE Error assign_ra_inst(BaseNode* node, RABlock* block, RAInstBuilder& ib) noexcept {
+ RABlockId block_id = block->block_id();
+ uint32_t tied_reg_count = ib.tied_reg_count();
+ RAInst* ra_inst = new_ra_inst(ib.inst_rw_flags(), ib.aggregated_flags(), tied_reg_count, ib._clobbered);
+
+ if (ASMJIT_UNLIKELY(!ra_inst)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ RARegIndex index;
+ RATiedFlags flags_filter = ~ib.forbidden_flags();
+
+ index.build_indexes(ib._count);
+ ra_inst->_tied_index = index;
+ ra_inst->_tied_count = ib._count;
+
+ for (uint32_t i = 0; i < tied_reg_count; i++) {
+ RATiedReg* tied_reg = ib[i];
+ RAWorkReg* work_reg = tied_reg->work_reg();
+
+ RegGroup group = work_reg->group();
+ work_reg->reset_tied_reg();
+
+ if (work_reg->_single_basic_block_id != block_id) {
+ if (Support::bool_or(work_reg->_single_basic_block_id != kBadBlockId, !tied_reg->is_write_only())) {
+ work_reg->add_flags(RAWorkRegFlags::kMultiBlockUse);
+ }
+
+ work_reg->_single_basic_block_id = block_id;
+ tied_reg->add_flags(RATiedFlags::kFirst);
+ }
+
+ if (tied_reg->has_use_id()) {
+ block->add_flags(RABlockFlags::kHasFixedRegs);
+ ra_inst->_used_regs[group] |= Support::bit_mask<RegMask>(tied_reg->use_id());
+ }
+
+ if (tied_reg->has_out_id()) {
+ block->add_flags(RABlockFlags::kHasFixedRegs);
+ }
+
+ RATiedReg& dst = ra_inst->_tied_regs[index.get(group)];
+ index.add(group);
+
+ dst = *tied_reg;
+ dst._flags &= flags_filter;
+
+ if (!tied_reg->is_duplicate()) {
+ dst._use_reg_mask &= ~ib._used[group];
+ }
+
+ }
+
+ node->set_pass_data<RAInst>(ra_inst);
+ return Error::kOk;
+ }
+
+ //! \}
+
+ //! \name CFG - Build CFG
+ //! \{
+
+ //! Traverse the whole function and do the following:
+ //!
+ //! 1. Construct CFG (represented by `RABlock`) by populating `_blocks` and `_exits`. Blocks describe the control
+ //! flow of the function and contain some additional information that is used by the register allocator.
+ //!
+ //! 2. Remove unreachable code immediately. This is not strictly necessary for BaseCompiler itself as the register
+ //! allocator cannot reach such nodes, but keeping instructions that use virtual registers would fail during
+ //! instruction encoding phase (Assembler).
+ //!
+ //! 3. `RAInst` is created for each `InstNode` or compatible. It contains information that is essential for further
+ //! analysis and register allocation.
+ //!
+ //! Use `RACFGBuilderT` template that provides the necessary boilerplate.
+ [[nodiscard]]
+ virtual Error build_cfg_nodes() noexcept;
+
+ //! Called after the CFG is built.
+ [[nodiscard]]
+ Error init_shared_assignments(Span<uint32_t> shared_assignments_map) noexcept;
+
+ //! \}
+
+ //! \name CFG - Views Order
+ //! \{
+
+ //! Constructs CFG views (only POV at the moment).
+ [[nodiscard]]
+ Error build_cfg_views() noexcept;
+
+ //! \}
+
+ //! \name CFG - Dominators
+ //! \{
+
+ // Terminology:
+ // - A node `X` dominates a node `Z` if any path from the entry point to `Z` has to go through `X`.
+ // - A node `Z` post-dominates a node `X` if any path from `X` to the end of the graph has to go through `Z`.
+
+ //! Constructs a dominator-tree from CFG.
+ [[nodiscard]]
+ Error build_cfg_dominators() noexcept;
+
+ [[nodiscard]]
+ bool _strictly_dominates(const RABlock* a, const RABlock* b) const noexcept;
+
+ [[nodiscard]]
+ const RABlock* _nearest_common_dominator(const RABlock* a, const RABlock* b) const noexcept;
+
+ //! Tests whether the basic block `a` dominates `b` - non-strict, returns true when `a == b`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool dominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? true : _strictly_dominates(a, b); }
+
+ //! Tests whether the basic block `a` dominates `b` - strict dominance check, returns false when `a == b`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool strictly_dominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? false : _strictly_dominates(a, b); }
+
+ //! Returns a nearest common dominator of `a` and `b`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlock* nearest_common_dominator(RABlock* a, RABlock* b) const noexcept { return const_cast<RABlock*>(_nearest_common_dominator(a, b)); }
+
+ //! Returns a nearest common dominator of `a` and `b` (const).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RABlock* nearest_common_dominator(const RABlock* a, const RABlock* b) const noexcept { return _nearest_common_dominator(a, b); }
+
+ //! \}
+
+ //! \name CFG - Utilities
+ //! \{
+
+ [[nodiscard]]
+ Error remove_unreachable_code() noexcept;
+
+ //! Returns `node` or some node after that is ideal for beginning a new block. This function is mostly used after
+ //! a conditional or unconditional jump to select the successor node. In some cases the next node could be a label,
+ //! which means it could have assigned some block already.
+ [[nodiscard]]
+ BaseNode* find_successor_starting_at(BaseNode* node) noexcept;
+
+ //! Returns `true` of the `node` can flow to `target` without reaching code nor data. It's used to eliminate jumps
+ //! to labels that are next right to them.
+ [[nodiscard]]
+ bool is_next_to(BaseNode* node, BaseNode* target) noexcept;
+
+ //! \}
+
+ //! \name Virtual Register Management
+ //! \{
+
+ //! Returns a native size of the general-purpose register of the target architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t register_size() const noexcept { return _sp.size(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAWorkReg* work_reg_by_id(RAWorkId work_id) const noexcept { return _work_regs[uint32_t(work_id)]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArenaVector<RAWorkReg*>& work_regs() noexcept { return _work_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArenaVector<RAWorkReg*>& work_regs(RegGroup group) noexcept { return _work_regs_of_group[group]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const ArenaVector<RAWorkReg*>& work_regs() const noexcept { return _work_regs; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const ArenaVector<RAWorkReg*>& work_regs(RegGroup group) const noexcept { return _work_regs_of_group[group]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t multi_work_reg_count() const noexcept { return _multi_work_reg_count; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t work_reg_count() const noexcept { return _total_work_reg_count; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t work_reg_count(RegGroup group) const noexcept { return _work_regs_of_group[group].size(); }
+
+ inline void _build_phys_index() noexcept {
+ _phys_reg_index.build_indexes(_phys_reg_count);
+ _phys_reg_total = _phys_reg_index.get(RegGroup::kMaxVirt) + _phys_reg_count.get(RegGroup::kMaxVirt);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t phys_reg_index(RegGroup group) const noexcept { return _phys_reg_index.get(group); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t phys_reg_total() const noexcept { return _phys_reg_total; }
+
+ [[nodiscard]]
+ Error _as_work_reg(RAWorkReg** out, VirtReg* virt_reg) noexcept;
+
+ //! Creates `RAWorkReg` data for the given `virt_reg`. The function does nothing if `virt_reg` already contains
+ //! link to `RAWorkReg`.
+ [[nodiscard]]
+ ASMJIT_INLINE Error as_work_reg(RAWorkReg** out, VirtReg* virt_reg) noexcept {
+ RAWorkReg* work_reg = virt_reg->work_reg();
+ if (ASMJIT_LIKELY(work_reg)) {
+ *out = work_reg;
+ return Error::kOk;
+ }
+ else {
+ return _as_work_reg(out, virt_reg);
+ }
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE Error virt_index_as_work_reg(RAWorkReg** out, uint32_t virt_index) noexcept {
+ Span<VirtReg*> virt_regs = cc().virt_regs();
+ if (ASMJIT_UNLIKELY(virt_index >= virt_regs.size()))
+ return make_error(Error::kInvalidVirtId);
+ return as_work_reg(out, virt_regs[virt_index]);
+ }
+
+ [[nodiscard]]
+ RAStackSlot* _create_stack_slot(RAWorkReg* work_reg) noexcept;
+
+ [[nodiscard]]
+ inline RAStackSlot* get_or_create_stack_slot(RAWorkReg* work_reg) noexcept {
+ RAStackSlot* slot = work_reg->stack_slot();
+ return slot ? slot : _create_stack_slot(work_reg);
+ }
+
+ [[nodiscard]]
+ inline BaseMem work_reg_as_mem(RAWorkReg* work_reg) noexcept {
+ (void)get_or_create_stack_slot(work_reg);
+ return BaseMem(OperandSignature::from_op_type(OperandType::kMem) |
+ OperandSignature::from_mem_base_type(_sp.reg_type()) |
+ OperandSignature::from_bits(OperandSignature::kMemRegHomeFlag),
+ work_reg->virt_id(), 0, 0);
+ }
+
+ [[nodiscard]]
+ WorkToPhysMap* new_work_to_phys_map() noexcept;
+
+ [[nodiscard]]
+ PhysToWorkMap* new_phys_to_work_map() noexcept;
+
+ [[nodiscard]]
+ inline PhysToWorkMap* clone_phys_to_work_map(const PhysToWorkMap* map) noexcept {
+ return static_cast<PhysToWorkMap*>(arena().dup(map, PhysToWorkMap::size_of(_phys_reg_total)));
+ }
+
+ [[nodiscard]]
+ Error build_reg_ids() noexcept;
+
+ //! \name Liveness Analysis & Statistics
+ //! \{
+
+ //! 1. Calculates GEN/KILL/IN/OUT of each block.
+ //! 2. Calculates live spans and basic statistics of each work register.
+ [[nodiscard]]
+ Error build_liveness() noexcept;
+
+ //! Assigns arg_index to WorkRegs. Must be called after the liveness analysis
+ //! finishes as it checks whether the argument is live upon entry.
+ [[nodiscard]]
+ Error assign_arg_index_to_work_regs() noexcept;
+
+ //! \}
+
+ //! \name Register Allocation - Global
+ //! \{
+
+ //! Runs a global register allocator.
+ [[nodiscard]]
+ Error run_global_allocator() noexcept;
+
+ //! Initializes data structures used for global live spans.
+ [[nodiscard]]
+ Error init_global_live_spans() noexcept;
+
+ [[nodiscard]]
+ Error bin_pack(RegGroup group) noexcept;
+
+ //! \}
+
+ //! \name Register Allocation - Local
+ //! \{
+
+ //! Runs a local register allocator.
+ [[nodiscard]]
+ Error run_local_allocator() noexcept;
+
+ [[nodiscard]]
+ Error set_block_entry_assignment(RABlock* block, const RABlock* from_block, const RAAssignment& from_assignment) noexcept;
+
+ [[nodiscard]]
+ Error set_shared_assignment(uint32_t shared_assignment_id, const RAAssignment& from_assignment) noexcept;
+
+ //! Called after the RA assignment has been assigned to a block.
+ //!
+ //! This cannot change the assignment, but can examine it.
+ [[nodiscard]]
+ Error block_entry_assigned(const PhysToWorkMap* phys_to_work_map) noexcept;
+
+ //! \}
+
+ //! \name Register Allocation Utilities
+ //! \{
+
+ [[nodiscard]]
+ Error use_temporary_mem(BaseMem& out, uint32_t size, uint32_t alignment) noexcept;
+
+ //! \}
+
+ //! \name Function Prolog & Epilog
+ //! \{
+
+ [[nodiscard]]
+ virtual Error update_stack_frame() noexcept;
+
+ [[nodiscard]]
+ Error _mark_stack_args_to_keep() noexcept;
+
+ [[nodiscard]]
+ Error _update_stack_args() noexcept;
+
+ [[nodiscard]]
+ Error insert_prolog_epilog() noexcept;
+
+ //! \}
+
+ //! \name Instruction Rewriter
+ //! \{
+
+ template<typename Lambda>
+ ASMJIT_INLINE Error rewrite_iterate(Lambda&& fn) noexcept {
+ // First iteration is not a block - it's possible register/stack changes at the end of the function.
+ RABlock* block = nullptr;
+
+ BaseNode* first = _injection_start;
+ BaseNode* stop = _injection_end;
+
+ Span<RABlock*> pov = _pov.as_span();
+ size_t pov_index = pov.size();
+
+ // If no injection happened, just do basic blocks.
+ if (first == nullptr) {
+ // The size of POV is always greater than zero, because there is always at least one basic block.
+ ASMJIT_ASSERT(pov_index > 0u);
+
+ block = pov[--pov_index];
+ first = block->first();
+ stop = block->last()->next();
+ }
+
+ for (;;) {
+ ASMJIT_PROPAGATE(fn(first, stop, block));
+
+ if (!pov_index) {
+ break;
+ }
+
+ block = pov[--pov_index];
+ first = block->first();
+ stop = block->last()->next();
+ }
+
+ return Error::kOk;
+ }
+
+ [[nodiscard]]
+ virtual Error rewrite() noexcept;
+
+ //! \}
+
+#ifndef ASMJIT_NO_LOGGING
+ //! \name Logging
+ //! \{
+
+ Error annotate_code() noexcept;
+ Error dump_block_ids(String& sb, Span<RABlock*> blocks) noexcept;
+ Error dump_block_liveness(String& sb, const RABlock* block) noexcept;
+ Error dump_live_spans(String& sb) noexcept;
+
+ //! \}
+#endif
+
+ //! \name Emit
+ //! \{
+
+ [[nodiscard]]
+ virtual Error emit_move(RAWorkReg* work_reg, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept;
+
+ [[nodiscard]]
+ virtual Error emit_swap(RAWorkReg* a_reg, uint32_t a_phys_id, RAWorkReg* b_reg, uint32_t b_phys_id) noexcept;
+
+ [[nodiscard]]
+ virtual Error emit_load(RAWorkReg* work_reg, uint32_t dst_phys_id) noexcept;
+
+ [[nodiscard]]
+ virtual Error emit_save(RAWorkReg* work_reg, uint32_t src_phys_id) noexcept;
+
+ [[nodiscard]]
+ virtual Error emit_jump(const Label& label) noexcept;
+
+ [[nodiscard]]
+ virtual Error emit_pre_call(InvokeNode* invoke_node) noexcept;
+
+ //! \}
+};
+
+// Late implementation of RABlock member functions:
+inline Arena& RABlock::arena() const noexcept { return _ra->arena(); }
+
+inline RegMask RABlock::entry_scratch_gp_regs() const noexcept {
+ RegMask regs = _entry_scratch_gp_regs;
+ if (has_shared_assignment_id()) {
+ regs = _ra->_shared_assignments[_shared_assignment_id].entry_scratch_gp_regs();
+ }
+ return regs;
+}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/rareg_p.h b/3rdparty/asmjit/asmjit/core/rareg_p.h
new file mode 100644
index 00000000000..1ca95aee4a5
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/rareg_p.h
@@ -0,0 +1,353 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RAREG_P_H_INCLUDED
+#define ASMJIT_CORE_RAREG_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/radefs_p.h>
+#include <asmjit/support/arenavector.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Flags used by \ref RAWorkReg.
+enum class RAWorkRegFlags : uint32_t {
+ //! No flags.
+ kNone = 0,
+
+ //! This register has already been allocated.
+ kAllocated = 0x00000001u,
+
+ //! The register is used across multiple basic blocks.
+ kMultiBlockUse = 0x00000008u,
+
+ //! Stack slot has to be allocated.
+ kStackUsed = 0x00000010u,
+ //! Stack allocation is preferred.
+ kStackPreferred = 0x00000020u,
+ //! Marked for stack argument reassignment.
+ kStackArgToStack = 0x00000040u,
+
+ //! Set when this register is used as a LEAD consecutive register at least once.
+ kLeadConsecutive = 0x00001000u,
+ //! Used to mark consecutive registers during processing.
+ kProcessedConsecutive = 0x00002000u,
+
+ //! Used during liveness analysis to mark registers that were visited (to mark RATiedFlags::kLast).
+ kSingleBlockVisitedFlag = 0x40000000u,
+ //! Used during liveness analysis to mark registers that only live in a single basic block as alive.
+ kSingleBlockLiveFlag = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(RAWorkRegFlags)
+
+//! Work register provides additional data of \ref VirtReg that is used by register allocator.
+//!
+//! In general when a virtual register is found by register allocator it maps it to \ref RAWorkReg
+//! and then only works with it. The reason for such mapping is that users can create many virtual
+//! registers, which are not used inside a register allocation scope (which is currently always a
+//! function). So register allocator basically scans the function for virtual registers and maps
+//! them into WorkRegs, which receive a temporary ID (work_id), which starts from zero. This WorkId
+//! is then used in bit-arrays and other mappings.
+class RAWorkReg {
+public:
+ ASMJIT_NONCOPYABLE(RAWorkReg)
+
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kNoArgIndex = 0xFFu;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! RAPass-specific register identifier used during liveness analysis and register allocation.
+ RAWorkId _work_id = kBadWorkId;
+ //! Copy of virtual register id used by \ref VirtReg.
+ uint32_t _virt_id = 0;
+
+ //! Permanent association with \ref VirtReg.
+ VirtReg* _virt_reg = nullptr;
+ //! Temporary association with \ref RATiedReg.
+ RATiedReg* _tied_reg = nullptr;
+ //! Stack slot associated with the register.
+ RAStackSlot* _stack_slot = nullptr;
+
+ //! Copy of a signature used by \ref VirtReg.
+ OperandSignature _signature {};
+ //! RAPass specific flags used during analysis and allocation.
+ RAWorkRegFlags _flags = RAWorkRegFlags::kNone;
+
+ //! The identifier of a basic block this register lives in.
+ //!
+ //! If this register is used by multiple basic blocks, the id would always be `kBadBlock`.
+ RABlockId _single_basic_block_id = kBadBlockId;
+
+ //! Constains all USE ids collected from all instructions.
+ //!
+ //! If this mask is non-zero and not a power of two, it means that the register is used multiple times in
+ //! instructions where it requires to have a different use ID. This means that in general it's not possible
+ //! to keep this register in a single home.
+ RegMask _use_id_mask = 0;
+ //! Preferred mask of registers (if non-zero) to allocate this register to.
+ //!
+ //! If this mask is zero it means that either there is no intersection of preferred registers collected from all
+ //! TiedRegs or there is no preference at all (the register can be allocated to any register all the time).
+ RegMask _preferred_mask = 0xFFFFFFFFu;
+ //! Consecutive mask, which was collected from all instructions where this register was used as a lead consecutive
+ //! register.
+ RegMask _consecutive_mask = 0xFFFFFFFFu;
+ //! IDs of all physical registers that are clobbered during the lifetime of this WorkReg.
+ //!
+ //! This mask should be updated by `RAPass::build_liveness()`, because it's global and should
+ //! be updated after unreachable code has been removed.
+ RegMask _clobber_survival_mask = 0;
+ //! IDs of all physical registers this WorkReg has been allocated to.
+ RegMask _allocated_mask = 0;
+
+ //! A byte-mask where each bit represents one valid byte of the register.
+ uint64_t _reg_byte_mask = 0;
+
+ //! Argument index (or `kNoArgIndex` if none).
+ uint8_t _arg_index = kNoArgIndex;
+ //! Argument value index in the pack (0 by default).
+ uint8_t _arg_value_index = 0;
+ //! Global home register ID (if any, assigned by RA).
+ uint8_t _home_reg_id = Reg::kIdBad;
+ //! Global hint register ID (provided by RA or user).
+ uint8_t _hint_reg_id = Reg::kIdBad;
+
+ //! Live spans of the `VirtReg`.
+ RALiveSpans _live_spans {};
+ //! Live statistics.
+ RALiveStats _live_stats {};
+
+ //! All nodes that read/write this VirtReg/WorkReg.
+ ArenaVector<BaseNode*> _refs {};
+ //! All nodes that write to this VirtReg/WorkReg.
+ ArenaVector<BaseNode*> _writes {};
+
+ //! Contains work IDs of all immediate consecutive registers of this register.
+ //!
+ //! \note This bit array only contains immediate consecutives. This means that if this is a register that is
+ //! followed by 3 more registers, then it would still have only a single immediate. The rest registers would
+ //! have immediate consecutive registers as well, except the last one.
+ ArenaBitSet _immediate_consecutives {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RAWorkReg(VirtReg* virt_reg, OperandSignature signature, RAWorkId work_id) noexcept
+ : _work_id(work_id),
+ _virt_id(virt_reg->id()),
+ _virt_reg(virt_reg),
+ _signature(signature),
+ _hint_reg_id(uint8_t(virt_reg->home_id_hint())) {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE RAWorkId work_id() const noexcept {
+ ASMJIT_ASSERT(_work_id != kBadWorkId);
+ return _work_id;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t virt_id() const noexcept { return _virt_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG TypeId type_id() const noexcept { return _virt_reg->type_id(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAWorkRegFlags flags() const noexcept { return _flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(RAWorkRegFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ ASMJIT_INLINE_NODEBUG void add_flags(RAWorkRegFlags flags) noexcept { _flags |= flags; }
+ ASMJIT_INLINE_NODEBUG void xor_flags(RAWorkRegFlags flags) noexcept { _flags ^= flags; }
+ ASMJIT_INLINE_NODEBUG void clear_flags(RAWorkRegFlags flags) noexcept { _flags &= ~flags; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_allocated() const noexcept { return has_flag(RAWorkRegFlags::kAllocated); }
+
+ ASMJIT_INLINE_NODEBUG void mark_allocated() noexcept { add_flags(RAWorkRegFlags::kAllocated); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_within_single_basic_block() const noexcept { return !has_flag(RAWorkRegFlags::kMultiBlockUse); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RABlockId single_basic_block_id() const noexcept { return _single_basic_block_id; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_lead_consecutive() const noexcept { return has_flag(RAWorkRegFlags::kLeadConsecutive); }
+
+ ASMJIT_INLINE_NODEBUG void mark_lead_consecutive() noexcept { add_flags(RAWorkRegFlags::kLeadConsecutive); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_processed_consecutive() const noexcept { return has_flag(RAWorkRegFlags::kProcessedConsecutive); }
+
+ ASMJIT_INLINE_NODEBUG void mark_processed_consecutive() noexcept { add_flags(RAWorkRegFlags::kProcessedConsecutive); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_stack_used() const noexcept { return has_flag(RAWorkRegFlags::kStackUsed); }
+
+ ASMJIT_INLINE_NODEBUG void mark_stack_used() noexcept { add_flags(RAWorkRegFlags::kStackUsed); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_stack_preferred() const noexcept { return has_flag(RAWorkRegFlags::kStackPreferred); }
+
+ ASMJIT_INLINE_NODEBUG void mark_stack_preferred() noexcept { add_flags(RAWorkRegFlags::kStackPreferred); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OperandSignature signature() const noexcept { return _signature; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegType type() const noexcept { return _signature.reg_type(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegGroup group() const noexcept { return _signature.reg_group(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG VirtReg* virt_reg() const noexcept { return _virt_reg; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_tied_reg() const noexcept { return _tied_reg != nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RATiedReg* tied_reg() const noexcept { return _tied_reg; }
+
+ ASMJIT_INLINE_NODEBUG void set_tied_reg(RATiedReg* tied_reg) noexcept { _tied_reg = tied_reg; }
+
+ ASMJIT_INLINE_NODEBUG void reset_tied_reg() noexcept { _tied_reg = nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_stack_slot() const noexcept { return _stack_slot != nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RAStackSlot* stack_slot() const noexcept { return _stack_slot; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RALiveSpans& live_spans() noexcept { return _live_spans; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RALiveSpans& live_spans() const noexcept { return _live_spans; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RALiveStats& live_stats() noexcept { return _live_stats; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const RALiveStats& live_stats() const noexcept { return _live_stats; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_arg_index() const noexcept { return _arg_index != kNoArgIndex; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t arg_index() const noexcept { return _arg_index; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t arg_value_index() const noexcept { return _arg_value_index; }
+
+ inline void set_arg_index(uint32_t arg_index, uint32_t value_index) noexcept {
+ _arg_index = uint8_t(arg_index);
+ _arg_value_index = uint8_t(value_index);
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_home_reg_id() const noexcept { return _home_reg_id != Reg::kIdBad; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t home_reg_id() const noexcept { return _home_reg_id; }
+
+ ASMJIT_INLINE_NODEBUG void set_home_reg_id(uint32_t phys_id) noexcept { _home_reg_id = uint8_t(phys_id); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_hint_reg_id() const noexcept { return _hint_reg_id != Reg::kIdBad; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t hint_reg_id() const noexcept { return _hint_reg_id; }
+
+ ASMJIT_INLINE_NODEBUG void set_hint_reg_id(uint32_t phys_id) noexcept { _hint_reg_id = uint8_t(phys_id); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask use_id_mask() const noexcept { return _use_id_mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_use_id_mask() const noexcept { return _use_id_mask != 0u; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_multiple_use_ids() const noexcept { return Support::has_at_least_2_bits_set(_use_id_mask); }
+
+ ASMJIT_INLINE_NODEBUG void add_use_id_mask(RegMask mask) noexcept { _use_id_mask |= mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask preferred_mask() const noexcept { return _preferred_mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_preferred_mask() const noexcept { return _preferred_mask != 0xFFFFFFFFu; }
+
+ ASMJIT_INLINE_NODEBUG void restrict_preferred_mask(RegMask mask) noexcept { _preferred_mask &= mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask consecutive_mask() const noexcept { return _consecutive_mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_consecutive_mask() const noexcept { return _consecutive_mask != 0xFFFFFFFFu; }
+
+ ASMJIT_INLINE_NODEBUG void restrict_consecutive_mask(RegMask mask) noexcept { _consecutive_mask &= mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask clobber_survival_mask() const noexcept { return _clobber_survival_mask; }
+
+ ASMJIT_INLINE_NODEBUG void add_clobber_survival_mask(RegMask mask) noexcept { _clobber_survival_mask |= mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG RegMask allocated_mask() const noexcept { return _allocated_mask; }
+
+ ASMJIT_INLINE_NODEBUG void add_allocated_mask(RegMask mask) noexcept { _allocated_mask |= mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint64_t reg_byte_mask() const noexcept { return _reg_byte_mask; }
+
+ ASMJIT_INLINE_NODEBUG void set_reg_byte_mask(uint64_t mask) noexcept { _reg_byte_mask = mask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_immediate_consecutives() const noexcept { return !_immediate_consecutives.is_empty(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const ArenaBitSet& immediate_consecutives() const noexcept { return _immediate_consecutives; }
+
+ [[nodiscard]]
+ inline Error add_immediate_consecutive(Arena& arena, RAWorkId work_id) noexcept {
+ if (_immediate_consecutives.size() <= uint32_t(work_id)) {
+ ASMJIT_PROPAGATE(_immediate_consecutives.resize(arena, uint32_t(work_id) + 1u));
+ }
+
+ _immediate_consecutives.set_bit(work_id, true);
+ return Error::kOk;
+ }
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RAREG_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/rastack.cpp b/3rdparty/asmjit/asmjit/core/rastack.cpp
new file mode 100644
index 00000000000..da24e7094f1
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/rastack.cpp
@@ -0,0 +1,193 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/rastack_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// RAStackAllocator - Slots
+// ========================
+
+RAStackSlot* RAStackAllocator::new_slot(uint32_t base_reg_id, uint32_t size, uint32_t alignment, uint32_t flags) noexcept {
+ if (ASMJIT_UNLIKELY(_slots.reserve_additional(*arena()) != Error::kOk)) {
+ return nullptr;
+ }
+
+ RAStackSlot* slot = arena()->alloc_oneshot<RAStackSlot>();
+ if (ASMJIT_UNLIKELY(!slot)) {
+ return nullptr;
+ }
+
+ slot->_base_reg_id = uint8_t(base_reg_id);
+ slot->_alignment = uint8_t(Support::max<uint32_t>(alignment, 1));
+ slot->_flags = uint16_t(flags);
+ slot->_size = size;
+
+ slot->_use_count = 0;
+ slot->_weight = 0;
+ slot->_offset = 0;
+
+ _alignment = Support::max<uint32_t>(_alignment, alignment);
+ _slots.append_unchecked(slot);
+ return slot;
+}
+
+// RAStackAllocator - Utilities
+// ============================
+
+struct RAStackGap {
+ inline RAStackGap() noexcept
+ : offset(0),
+ size(0) {}
+
+ inline RAStackGap(uint32_t offset, uint32_t size) noexcept
+ : offset(offset),
+ size(size) {}
+
+ inline RAStackGap(const RAStackGap& other) noexcept
+ : offset(other.offset),
+ size(other.size) {}
+
+ uint32_t offset;
+ uint32_t size;
+};
+
+Error RAStackAllocator::calculate_stack_frame() noexcept {
+ // Base weight added to all registers regardless of their size and alignment.
+ uint32_t kBaseRegWeight = 16;
+
+ // STEP 1:
+ //
+ // Update usage based on the size of the slot. We boost smaller slots in a way that 32-bit register has a higher
+ // priority than a 128-bit register, however, if one 128-bit register is used 4 times more than some other 32-bit
+ // register it will overweight it.
+ for (RAStackSlot* slot : _slots) {
+ uint32_t alignment = slot->alignment();
+ ASMJIT_ASSERT(alignment > 0);
+
+ uint32_t power = Support::min<uint32_t>(Support::ctz(alignment), 6);
+ uint64_t weight;
+
+ if (slot->is_reg_home()) {
+ weight = kBaseRegWeight + (uint64_t(slot->use_count()) * (7 - power));
+ }
+ else {
+ weight = power;
+ }
+
+ // If overflown, which has less chance of winning a lottery, just use max possible weight. In such case it
+ // probably doesn't matter at all.
+ if (weight > 0xFFFFFFFFu) {
+ weight = 0xFFFFFFFFu;
+ }
+
+ slot->set_weight(uint32_t(weight));
+ }
+
+ // STEP 2:
+ //
+ // Sort stack slots based on their newly calculated weight (in descending order).
+ _slots.sort([](const RAStackSlot* a, const RAStackSlot* b) noexcept {
+ return a->weight() > b->weight() ? 1 :
+ a->weight() == b->weight() ? 0 : -1;
+ });
+
+ // STEP 3:
+ //
+ // Calculate offset of each slot. We start from the slot that has the highest weight and advance to slots with
+ // lower weight. It could look that offsets start from the first slot in our list and then simply increase, but
+ // it's not always the case as we also try to fill all gaps introduced by the fact that slots are sorted by
+ // weight and not by size & alignment, so when we need to align some slot we distribute the gap caused by the
+ // alignment to `gaps`.
+ uint32_t offset = 0;
+ ArenaVector<RAStackGap> gaps[kSizeCount - 1];
+
+ for (RAStackSlot* slot : _slots) {
+ if (slot->is_stack_arg()) {
+ continue;
+ }
+
+ uint32_t slot_alignment = slot->alignment();
+ uint32_t aligned_offset = Support::align_up(offset, slot_alignment);
+
+ // Try to find a slot within gaps first, before advancing the `offset`.
+ bool found_gap = false;
+ uint32_t gap_size = 0;
+ uint32_t gap_offset = 0;
+
+ {
+ uint32_t slot_size = slot->size();
+ if (slot_size < (1u << uint32_t(ASMJIT_ARRAY_SIZE(gaps)))) {
+ // Iterate from the lowest to the highest possible.
+ uint32_t index = Support::ctz(slot_size);
+ do {
+ if (!gaps[index].is_empty()) {
+ RAStackGap gap = gaps[index].pop();
+
+ ASMJIT_ASSERT(Support::is_aligned(gap.offset, slot_alignment));
+ slot->set_offset(int32_t(gap.offset));
+
+ gap_size = gap.size - slot_size;
+ gap_offset = gap.offset - slot_size;
+
+ found_gap = true;
+ break;
+ }
+ } while (++index < uint32_t(ASMJIT_ARRAY_SIZE(gaps)));
+ }
+ }
+
+ // No gap found, we may create a new one(s) if the current offset is not aligned.
+ if (!found_gap && offset != aligned_offset) {
+ gap_size = aligned_offset - offset;
+ gap_offset = aligned_offset;
+
+ offset = aligned_offset;
+ }
+
+ // True if we have found a gap and not filled all of it or we aligned the current offset.
+ if (gap_size) {
+ uint32_t gap_end = gap_size + gap_offset;
+ while (gap_offset < gap_end) {
+ uint32_t index = Support::ctz(gap_offset);
+ uint32_t slot_size = 1u << index;
+
+ // Weird case, better to bail...
+ if (gap_end - gap_offset < slot_size) {
+ break;
+ }
+
+ ASMJIT_PROPAGATE(gaps[index].append(*arena(), RAStackGap(gap_offset, slot_size)));
+ gap_offset += slot_size;
+ }
+ }
+
+ if (!found_gap) {
+ ASMJIT_ASSERT(Support::is_aligned(offset, slot_alignment));
+ slot->set_offset(int32_t(offset));
+ offset += slot->size();
+ }
+ }
+
+ _stack_size = Support::align_up(offset, _alignment);
+ return Error::kOk;
+}
+
+Error RAStackAllocator::adjust_slot_offsets(int32_t offset) noexcept {
+ for (RAStackSlot* slot : _slots) {
+ if (!slot->is_stack_arg()) {
+ slot->_offset += offset;
+ }
+ }
+ return Error::kOk;
+}
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/core/rastack_p.h b/3rdparty/asmjit/asmjit/core/rastack_p.h
new file mode 100644
index 00000000000..0e69588443e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/rastack_p.h
@@ -0,0 +1,194 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_RASTACK_P_H_INCLUDED
+#define ASMJIT_CORE_RASTACK_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/radefs_p.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_ra
+//! \{
+
+//! Stack slot.
+struct RAStackSlot {
+ //! Stack slot flags.
+ //!
+ //! TODO: kFlagStackArg is not used by the current implementation, do we need to keep it?
+ enum Flags : uint16_t {
+ //! Stack slot is register home slot.
+ kFlagRegHome = 0x0001u,
+ //! Stack slot position matches argument passed via stack.
+ kFlagStackArg = 0x0002u
+
+ };
+ enum ArgIndex : uint32_t {
+ kNoArgIndex = 0xFF
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Base register used to address the stack.
+ uint8_t _base_reg_id;
+ //! Minimum alignment required by the slot.
+ uint8_t _alignment;
+ //! Reserved for future use.
+ uint16_t _flags;
+ //! Size of memory required by the slot.
+ uint32_t _size;
+
+ //! Usage counter (one unit equals one memory access).
+ uint32_t _use_count;
+ //! Weight of the slot, calculated by \ref RAStackAllocator::calculate_stack_frame().
+ uint32_t _weight;
+ //! Stack offset, calculated by \ref RAStackAllocator::calculate_stack_frame().
+ int32_t _offset;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ inline uint32_t base_reg_id() const noexcept { return _base_reg_id; }
+
+ inline void set_base_reg_id(uint32_t id) noexcept { _base_reg_id = uint8_t(id); }
+
+ [[nodiscard]]
+ inline uint32_t size() const noexcept { return _size; }
+
+ [[nodiscard]]
+ inline uint32_t alignment() const noexcept { return _alignment; }
+
+ [[nodiscard]]
+ inline uint32_t flags() const noexcept { return _flags; }
+
+ [[nodiscard]]
+ inline bool has_flag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
+
+ inline void add_flags(uint32_t flags) noexcept { _flags = uint16_t(_flags | flags); }
+
+ [[nodiscard]]
+ inline bool is_reg_home() const noexcept { return has_flag(kFlagRegHome); }
+
+ [[nodiscard]]
+ inline bool is_stack_arg() const noexcept { return has_flag(kFlagStackArg); }
+
+ [[nodiscard]]
+ inline uint32_t use_count() const noexcept { return _use_count; }
+
+ inline void add_use_count(uint32_t n = 1) noexcept { _use_count += n; }
+
+ [[nodiscard]]
+ inline uint32_t weight() const noexcept { return _weight; }
+
+ inline void set_weight(uint32_t weight) noexcept { _weight = weight; }
+
+ [[nodiscard]]
+ inline int32_t offset() const noexcept { return _offset; }
+
+ inline void set_offset(int32_t offset) noexcept { _offset = offset; }
+
+ //! \}
+};
+
+//! Stack allocator.
+class RAStackAllocator {
+public:
+ ASMJIT_NONCOPYABLE(RAStackAllocator)
+
+ enum Size : uint32_t {
+ kSize1 = 0,
+ kSize2 = 1,
+ kSize4 = 2,
+ kSize8 = 3,
+ kSize16 = 4,
+ kSize32 = 5,
+ kSize64 = 6,
+ kSizeCount = 7
+ };
+
+ //! \name Members
+ //! \{
+
+ //! Arena used to allocate internal data.
+ Arena* _arena {};
+ //! Count of bytes used by all slots.
+ uint32_t _bytes_used {};
+ //! Calculated stack size (can be a bit greater than `_bytes_used`).
+ uint32_t _stack_size {};
+ //! Minimum stack alignment.
+ uint32_t _alignment = 1;
+ //! Stack slots vector.
+ ArenaVector<RAStackSlot*> _slots;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG RAStackAllocator() noexcept {}
+
+ ASMJIT_INLINE_NODEBUG void reset(Arena* arena) noexcept {
+ _arena = arena;
+ _bytes_used = 0;
+ _stack_size = 0;
+ _alignment = 1;
+ _slots.reset();
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arena* arena() const noexcept { return _arena; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t bytes_used() const noexcept { return _bytes_used; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t stack_size() const noexcept { return _stack_size; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<RAStackSlot*> slots() noexcept { return _slots.as_span(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t slot_count() const noexcept { return _slots.size(); }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ [[nodiscard]]
+ RAStackSlot* new_slot(uint32_t base_reg_id, uint32_t size, uint32_t alignment, uint32_t flags = 0) noexcept;
+
+ [[nodiscard]]
+ Error calculate_stack_frame() noexcept;
+
+ [[nodiscard]]
+ Error adjust_slot_offsets(int32_t offset) noexcept;
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_CORE_RASTACK_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/string.cpp b/3rdparty/asmjit/asmjit/core/string.cpp
new file mode 100644
index 00000000000..f5eaaf4b0ac
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/string.cpp
@@ -0,0 +1,666 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/string.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// String - Globals
+// ================
+
+static const char String_base_n[] = "0123456789ABCDEF";
+
+constexpr size_t kMinAllocSize = 128;
+constexpr size_t kMaxAllocSize = SIZE_MAX - Globals::kGrowThreshold;
+
+// Based on ArenaVector_growCapacity().
+//
+// NOTE: The sizes here include null terminators - that way we can have aligned allocations that are power of 2s
+// initially.
+static ASMJIT_INLINE size_t String_grow_capacity(size_t byte_size, size_t min_byte_size) noexcept {
+ static constexpr size_t kGrowThreshold = Globals::kGrowThreshold;
+
+ ASMJIT_ASSERT(min_byte_size < kMaxAllocSize);
+
+ // This is more than exponential growth at the beginning.
+ if (byte_size < kMinAllocSize) {
+ byte_size = kMinAllocSize;
+ }
+ else if (byte_size < 512) {
+ byte_size = 512;
+ }
+
+ if (byte_size < min_byte_size) {
+ // Exponential growth before we reach `kGrowThreshold`.
+ byte_size = Support::align_up_power_of_2(min_byte_size);
+
+ // Bail to `min_byte_size` in case of overflow - most likely whatever that is happening afterwards would just fail.
+ if (byte_size < min_byte_size) {
+ return min_byte_size;
+ }
+
+ // Pretty much chunked growth advancing by `kGrowThreshold` after we exceed it.
+ if (byte_size > kGrowThreshold) {
+ // Align to kGrowThreshold.
+ size_t remainder = min_byte_size % kGrowThreshold;
+
+ byte_size = min_byte_size + remainder;
+
+ // Bail to `min_byte_size` in case of overflow.
+ if (byte_size < min_byte_size) {
+ return min_byte_size;
+ }
+ }
+ }
+
+ return Support::min<size_t>(byte_size, kMaxAllocSize);
+}
+
+// String - Clear & Reset
+// ======================
+
+Error String::reset() noexcept {
+ if (_type == kTypeLarge) {
+ ::free(_large.data);
+ }
+
+ _reset_internal();
+ return Error::kOk;
+}
+
+Error String::clear() noexcept {
+ if (is_large_or_external()) {
+ _large.size = 0;
+ _large.data[0] = '\0';
+ }
+ else {
+ _raw.uptr[0] = 0;
+ }
+
+ return Error::kOk;
+}
+
+// String - Prepare
+// ================
+
+char* String::prepare(ModifyOp op, size_t size) noexcept {
+ uint8_t type = _type;
+
+ char* cur_data;
+ size_t cur_size;
+ size_t cur_capacity;
+
+ if (is_large_or_external(type)) {
+ cur_data = _large.data;
+ cur_size = _large.size;
+ cur_capacity = _large.capacity;
+ }
+ else {
+ // For some reason clang's static analysis flags this function having "use-after-free". The step
+ // to get to that is to execute this branch (`is_large_or_external()` returning false) and then
+ // assuming `type == kTypeLarge` in another condition, which contradicts the first condition.
+ ASMJIT_ASSERT(type < kTypeLarge);
+
+ cur_data = _small.data;
+ cur_size = _small.type;
+ cur_capacity = kSSOCapacity;
+ }
+
+ if (op == ModifyOp::kAssign) {
+ if (size > cur_capacity) {
+ // Prevent arithmetic overflow.
+ if (ASMJIT_UNLIKELY(size >= kMaxAllocSize)) {
+ return nullptr;
+ }
+
+ size_t new_capacity = Support::align_up<size_t>(size + 1, kMinAllocSize);
+ char* new_data = static_cast<char*>(::malloc(new_capacity));
+
+ if (ASMJIT_UNLIKELY(!new_data)) {
+ return nullptr;
+ }
+
+ if (type == kTypeLarge) {
+ ::free(cur_data);
+ }
+
+ _large.type = kTypeLarge;
+ _large.size = size;
+ _large.capacity = new_capacity - 1;
+ _large.data = new_data;
+
+ new_data[size] = '\0';
+ return new_data;
+ }
+ else {
+ _set_size(size);
+ cur_data[size] = '\0';
+ return cur_data;
+ }
+ }
+ else {
+ // Prevent arithmetic overflow.
+ if (ASMJIT_UNLIKELY(size >= kMaxAllocSize - cur_size - 1)) {
+ return nullptr;
+ }
+
+ size_t new_size = size + cur_size;
+ size_t new_size_plus_one = new_size + 1;
+
+ if (new_size > cur_capacity) {
+ size_t new_capacity_plus_one = String_grow_capacity(size + 1u, new_size_plus_one);
+ ASMJIT_ASSERT(new_capacity_plus_one >= new_size_plus_one);
+
+ if (ASMJIT_UNLIKELY(new_capacity_plus_one < new_size_plus_one)) {
+ return nullptr;
+ }
+
+ char* new_data = static_cast<char*>(::malloc(new_capacity_plus_one));
+ if (ASMJIT_UNLIKELY(!new_data)) {
+ return nullptr;
+ }
+
+ memcpy(new_data, cur_data, cur_size);
+
+ if (type == kTypeLarge) {
+ ::free(cur_data);
+ }
+
+ _large.type = kTypeLarge;
+ _large.size = new_size;
+ _large.capacity = new_capacity_plus_one - 1;
+ _large.data = new_data;
+
+ new_data[new_size] = '\0';
+ return new_data + cur_size;
+ }
+ else {
+ _set_size(new_size);
+ cur_data[new_size] = '\0';
+ return cur_data + cur_size;
+ }
+ }
+}
+
+// String - Assign
+// ===============
+
+Error String::assign(const char* data, size_t size) noexcept {
+ uint8_t type = _type;
+ char* dst = nullptr;
+
+ // Null terminated string without `size` specified.
+ if (size == SIZE_MAX) {
+ size = data ? strlen(data) : size_t(0);
+ }
+
+ if (is_large_or_external(type)) {
+ if (size <= _large.capacity) {
+ dst = _large.data;
+ _large.size = size;
+ }
+ else {
+ size_t capacity_plus_one = Support::align_up(size + 1, 32);
+ if (ASMJIT_UNLIKELY(capacity_plus_one < size)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ dst = static_cast<char*>(::malloc(capacity_plus_one));
+ if (ASMJIT_UNLIKELY(!dst)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ if (type == kTypeLarge) {
+ ::free(_large.data);
+ }
+
+ _large.type = kTypeLarge;
+ _large.data = dst;
+ _large.size = size;
+ _large.capacity = capacity_plus_one - 1;
+ }
+ }
+ else {
+ if (size <= kSSOCapacity) {
+ ASMJIT_ASSERT(size < 0xFFu);
+
+ dst = _small.data;
+ _small.type = uint8_t(size);
+ }
+ else {
+ dst = static_cast<char*>(::malloc(size + 1));
+ if (ASMJIT_UNLIKELY(!dst)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ _large.type = kTypeLarge;
+ _large.data = dst;
+ _large.size = size;
+ _large.capacity = size;
+ }
+ }
+
+ // Optionally copy data from `data` and null-terminate.
+ if (data && size) {
+ // NOTE: It's better to use `memmove()`. If, for any reason, somebody uses
+ // this function to substring the same string it would work as expected.
+ ::memmove(dst, data, size);
+ }
+
+ dst[size] = '\0';
+ return Error::kOk;
+}
+
+// String - Operations
+// ===================
+
+Error String::_op_string(ModifyOp op, const char* str, size_t size) noexcept {
+ if (size == SIZE_MAX) {
+ size = str ? strlen(str) : size_t(0);
+ }
+
+ if (!size) {
+ return Error::kOk;
+ }
+
+ char* p = prepare(op, size);
+ if (!p) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ memcpy(p, str, size);
+ return Error::kOk;
+}
+
+Error String::_op_char(ModifyOp op, char c) noexcept {
+ char* p = prepare(op, 1);
+ if (!p) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ *p = c;
+ return Error::kOk;
+}
+
+Error String::_op_chars(ModifyOp op, char c, size_t n) noexcept {
+ if (!n) {
+ return Error::kOk;
+ }
+
+ char* p = prepare(op, n);
+ if (!p) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ memset(p, c, n);
+ return Error::kOk;
+}
+
+Error String::pad_end(size_t n, char c) noexcept {
+ size_t size = this->size();
+ return n > size ? append_chars(c, n - size) : Error::kOk;
+}
+
+Error String::_op_number(ModifyOp op, uint64_t i, uint32_t base, size_t width, StringFormatFlags flags) noexcept {
+ if (base == 0) {
+ base = 10;
+ }
+
+ char buf[128];
+ char* p = buf + ASMJIT_ARRAY_SIZE(buf);
+
+ uint64_t orig = i;
+ char sign = '\0';
+
+ // Format Sign
+ // -----------
+
+ if (Support::test(flags, StringFormatFlags::kSigned) && int64_t(i) < 0) {
+ i = Support::neg(i);
+ sign = '-';
+ }
+ else if (Support::test(flags, StringFormatFlags::kShowSign)) {
+ sign = '+';
+ }
+ else if (Support::test(flags, StringFormatFlags::kShowSpace)) {
+ sign = ' ';
+ }
+
+ // Format Number
+ // -------------
+
+ switch (base) {
+ case 2:
+ case 8:
+ case 16: {
+ uint32_t shift = Support::ctz(base);
+ uint32_t mask = base - 1;
+
+ do {
+ uint64_t d = i >> shift;
+ size_t r = size_t(i & mask);
+
+ *--p = String_base_n[r];
+ i = d;
+ } while (i);
+
+ break;
+ }
+
+ case 10: {
+ do {
+ uint64_t d = i / 10;
+ uint64_t r = i % 10;
+
+ *--p = char(uint32_t('0') + uint32_t(r));
+ i = d;
+ } while (i);
+
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidArgument);
+ }
+
+ size_t number_size = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p);
+
+ // Alternate Form
+ // --------------
+
+ if (Support::test(flags, StringFormatFlags::kAlternate)) {
+ if (base == 8) {
+ if (orig != 0) {
+ *--p = '0';
+ }
+ }
+ if (base == 16) {
+ *--p = 'x';
+ *--p = '0';
+ }
+ }
+
+ // String Width
+ // ------------
+
+ if (sign != 0) {
+ *--p = sign;
+ }
+
+ if (width > 256) {
+ width = 256;
+ }
+
+ if (width <= number_size) {
+ width = 0;
+ }
+ else {
+ width -= number_size;
+ }
+
+ // Finalize
+ // --------
+
+ size_t prefix_size = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p) - number_size;
+ char* data = prepare(op, prefix_size + width + number_size);
+
+ if (!data) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ memcpy(data, p, prefix_size);
+ data += prefix_size;
+
+ memset(data, '0', width);
+ data += width;
+
+ memcpy(data, p + prefix_size, number_size);
+ return Error::kOk;
+}
+
+Error String::_op_hex(ModifyOp op, const void* data, size_t size, char separator) noexcept {
+ char* dst;
+ const uint8_t* src = static_cast<const uint8_t*>(data);
+
+ if (!size) {
+ return Error::kOk;
+ }
+
+ if (separator) {
+ if (ASMJIT_UNLIKELY(size >= SIZE_MAX / 3)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ dst = prepare(op, size * 3 - 1);
+ if (ASMJIT_UNLIKELY(!dst)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ size_t i = 0;
+ for (;;) {
+ dst[0] = String_base_n[(src[0] >> 4) & 0xF];
+ dst[1] = String_base_n[(src[0] ) & 0xF];
+
+ if (++i == size) {
+ break;
+ }
+
+ // This makes sure that the separator is only put between two hexadecimal bytes.
+ dst[2] = separator;
+ dst += 3;
+ src++;
+ }
+ }
+ else {
+ if (ASMJIT_UNLIKELY(size >= SIZE_MAX / 2)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ dst = prepare(op, size * 2);
+ if (ASMJIT_UNLIKELY(!dst)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ for (size_t i = 0; i < size; i++, dst += 2, src++) {
+ dst[0] = String_base_n[(src[0] >> 4) & 0xF];
+ dst[1] = String_base_n[(src[0] ) & 0xF];
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error String::_op_format(ModifyOp op, const char* fmt, ...) noexcept {
+ Error err;
+ va_list ap;
+
+ va_start(ap, fmt);
+ err = _op_vformat(op, fmt, ap);
+ va_end(ap);
+
+ return err;
+}
+
+Error String::_op_vformat(ModifyOp op, const char* fmt, va_list ap) noexcept {
+ size_t start_at = (op == ModifyOp::kAssign) ? size_t(0) : size();
+ size_t remaining_capacity = capacity() - start_at;
+
+ char buf[1024];
+ int fmt_result;
+ size_t output_size;
+
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
+
+ if (remaining_capacity >= 128) {
+ fmt_result = vsnprintf(data() + start_at, remaining_capacity, fmt, ap);
+ output_size = size_t(fmt_result);
+
+ if (ASMJIT_LIKELY(output_size <= remaining_capacity)) {
+ _set_size(start_at + output_size);
+ return Error::kOk;
+ }
+ }
+ else {
+ fmt_result = vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap);
+ output_size = size_t(fmt_result);
+
+ if (ASMJIT_LIKELY(output_size < ASMJIT_ARRAY_SIZE(buf))) {
+ return _op_string(op, buf, output_size);
+ }
+ }
+
+ if (ASMJIT_UNLIKELY(fmt_result < 0)) {
+ return make_error(Error::kInvalidState);
+ }
+
+ char* p = prepare(op, output_size);
+ if (ASMJIT_UNLIKELY(!p)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ fmt_result = vsnprintf(p, output_size + 1, fmt, ap_copy);
+ ASMJIT_ASSERT(size_t(fmt_result) == output_size);
+
+ return Error::kOk;
+}
+
+Error String::truncate(size_t new_size) noexcept {
+ if (is_large_or_external()) {
+ if (new_size < _large.size) {
+ _large.data[new_size] = '\0';
+ _large.size = new_size;
+ }
+ }
+ else {
+ if (new_size < _type) {
+ _small.data[new_size] = '\0';
+ _small.type = uint8_t(new_size);
+ }
+ }
+
+ return Error::kOk;
+}
+
+bool String::equals(const char* other, size_t size) const noexcept {
+ const char* a_data = data();
+ const char* b_data = other;
+
+ size_t a_size = this->size();
+ size_t b_size = size;
+
+ if (b_size == SIZE_MAX) {
+ size_t i;
+ for (i = 0; i < a_size; i++) {
+ if (a_data[i] != b_data[i] || b_data[i] == 0) {
+ return false;
+ }
+ }
+ return b_data[i] == 0;
+ }
+ else {
+ if (a_size != b_size) {
+ return false;
+ }
+ return ::memcmp(a_data, b_data, a_size) == 0;
+ }
+}
+
+// String - Tests
+// ==============
+
+#if defined(ASMJIT_TEST)
+static void test_string_grow() noexcept {
+ String s;
+ size_t c = s.capacity();
+
+ INFO("Testing string grow strategy (SSO capacity: %zu)", c);
+ for (size_t i = 0; i < 1000000; i++) {
+ s.append('x');
+ if (s.capacity() != c) {
+ c = s.capacity();
+ INFO(" String reallocated to new capacity: %zu", c);
+ }
+ }
+
+ // We don't expect a 1 million character string to occupy 4MiB, for example. So verify that!
+ EXPECT_LT(c, size_t(4 * 1024 * 1024));
+}
+
+UNIT(core_string) {
+ String s;
+
+ INFO("Testing string functionality");
+
+ EXPECT_FALSE(s.is_large_or_external());
+ EXPECT_FALSE(s.is_external());
+
+ EXPECT_EQ(s.assign('a'), Error::kOk);
+ EXPECT_EQ(s.size(), 1u);
+ EXPECT_EQ(s.capacity(), String::kSSOCapacity);
+ EXPECT_EQ(s.data()[0], 'a');
+ EXPECT_EQ(s.data()[1], '\0');
+ EXPECT_TRUE(s.equals("a"));
+ EXPECT_TRUE(s.equals("a", 1));
+
+ EXPECT_EQ(s.assign_chars('b', 4), Error::kOk);
+ EXPECT_EQ(s.size(), 4u);
+ EXPECT_EQ(s.capacity(), String::kSSOCapacity);
+ EXPECT_EQ(s.data()[0], 'b');
+ EXPECT_EQ(s.data()[1], 'b');
+ EXPECT_EQ(s.data()[2], 'b');
+ EXPECT_EQ(s.data()[3], 'b');
+ EXPECT_EQ(s.data()[4], '\0');
+ EXPECT_TRUE(s.equals("bbbb"));
+ EXPECT_TRUE(s.equals("bbbb", 4));
+
+ EXPECT_EQ(s.assign("abc"), Error::kOk);
+ EXPECT_EQ(s.size(), 3u);
+ EXPECT_EQ(s.capacity(), String::kSSOCapacity);
+ EXPECT_EQ(s.data()[0], 'a');
+ EXPECT_EQ(s.data()[1], 'b');
+ EXPECT_EQ(s.data()[2], 'c');
+ EXPECT_EQ(s.data()[3], '\0');
+ EXPECT_TRUE(s.equals("abc"));
+ EXPECT_TRUE(s.equals("abc", 3));
+
+ const char* large = "Large string that will not fit into SSO buffer";
+ EXPECT_EQ(s.assign(large), Error::kOk);
+ EXPECT_TRUE(s.is_large_or_external());
+ EXPECT_EQ(s.size(), strlen(large));
+ EXPECT_GT(s.capacity(), String::kSSOCapacity);
+ EXPECT_TRUE(s.equals(large));
+ EXPECT_TRUE(s.equals(large, strlen(large)));
+
+ const char* additional = " (additional content)";
+ EXPECT_TRUE(s.is_large_or_external());
+ EXPECT_EQ(s.append(additional), Error::kOk);
+ EXPECT_EQ(s.size(), strlen(large) + strlen(additional));
+
+ EXPECT_EQ(s.clear(), Error::kOk);
+ EXPECT_EQ(s.size(), 0u);
+ EXPECT_TRUE(s.is_empty());
+ EXPECT_EQ(s.data()[0], '\0');
+ EXPECT_TRUE(s.is_large_or_external()); // Clear should never release the memory.
+
+ EXPECT_EQ(s.append_uint(1234), Error::kOk);
+ EXPECT_TRUE(s.equals("1234"));
+
+ EXPECT_EQ(s.assign_uint(0xFFFF, 16, 0, StringFormatFlags::kAlternate), Error::kOk);
+ EXPECT_TRUE(s.equals("0xFFFF"));
+
+ StringTmp<64> s_tmp;
+ EXPECT_TRUE(s_tmp.is_large_or_external());
+ EXPECT_TRUE(s_tmp.is_external());
+ EXPECT_EQ(s_tmp.append_chars(' ', 1000), Error::kOk);
+ EXPECT_FALSE(s_tmp.is_external());
+
+ test_string_grow();
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/string.h b/3rdparty/asmjit/asmjit/core/string.h
new file mode 100644
index 00000000000..135869a41eb
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/string.h
@@ -0,0 +1,417 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_STRING_H_INCLUDED
+#define ASMJIT_CORE_STRING_H_INCLUDED
+
+#include <asmjit/support/span.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_utilities
+//! \{
+
+//! Format flags used by \ref String API.
+enum class StringFormatFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
+ //! Show sign.
+ kShowSign = 0x00000001u,
+ //! Show space.
+ kShowSpace = 0x00000002u,
+ //! Alternate form (use 0x when formatting HEX number).
+ kAlternate = 0x00000004u,
+ //! The input is signed.
+ kSigned = 0x80000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(StringFormatFlags)
+
+//! Fixed string - only useful for strings that would never exceed `N - 1` characters; always null-terminated.
+template<size_t N>
+union FixedString {
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kNumUInt32Words = uint32_t((N + sizeof(uint32_t) - 1) / sizeof(uint32_t));
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ char str[kNumUInt32Words * sizeof(uint32_t)];
+ uint32_t u32[kNumUInt32Words];
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ [[nodiscard]]
+ inline bool equals(const char* other) const noexcept { return strcmp(str, other) == 0; }
+
+ //! \}
+};
+
+//! A simple non-reference counted string that uses small string optimization (SSO).
+//!
+//! This string has 3 allocation possibilities:
+//!
+//! 1. Small - embedded buffer is used for up to `kSSOCapacity` characters. This should handle most small
+//! strings and thus avoid dynamic memory allocation for most use-cases.
+//!
+//! 2. Large - string that doesn't fit into an embedded buffer (or string that was truncated from a larger
+//! buffer) and is owned by AsmJit. When you destroy the string AsmJit would automatically
+//! release the large buffer.
+//!
+//! 3. External - like Large (2), however, the large buffer is not owned by AsmJit and won't be released when
+//! the string is destroyed or reallocated. This is mostly useful for working with larger temporary
+//! strings allocated on stack or with immutable strings.
+class String {
+public:
+ ASMJIT_NONCOPYABLE(String)
+
+ //! String operation.
+ enum class ModifyOp : uint32_t {
+ //! Assignment - a new content replaces the current one.
+ kAssign = 0,
+ //! Append - a new content is appended to the string.
+ kAppend = 1
+ };
+
+ //! \cond INTERNAL
+ static inline constexpr uint32_t kLayoutSize = 32;
+ static inline constexpr uint32_t kSSOCapacity = kLayoutSize - 2;
+
+ //! Large string (owned by String).
+ static inline constexpr uint8_t kTypeLarge = 0x1Fu;
+ //! External string (arena allocated or not owned by String).
+ static inline constexpr uint8_t kTypeExternal = 0x20u;
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_external(uint8_t type) noexcept { return type == kTypeExternal; }
+
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool is_large_or_external(uint8_t type) noexcept { return type >= kTypeLarge; }
+
+ union Raw {
+ uint8_t u8[kLayoutSize];
+ uint64_t u64[kLayoutSize / sizeof(uint64_t)];
+ uintptr_t uptr[kLayoutSize / sizeof(uintptr_t)];
+ };
+
+ struct Small {
+ uint8_t type;
+ char data[kSSOCapacity + 1u];
+ };
+
+ struct Large {
+ uint8_t type;
+ uint8_t reserved[sizeof(uintptr_t) - 1];
+ size_t size;
+ size_t capacity;
+ char* data;
+ };
+
+ union {
+ uint8_t _type;
+ Raw _raw;
+ Small _small;
+ Large _large;
+ };
+ //! \endcond
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default-initialized string if zero length.
+ ASMJIT_INLINE_NODEBUG String() noexcept
+ : _small {} {}
+
+ //! Creates a string that takes ownership of the content of the `other` string.
+ ASMJIT_INLINE_NODEBUG String(String&& other) noexcept {
+ _raw = other._raw;
+ other._reset_internal();
+ }
+
+ ASMJIT_INLINE_NODEBUG ~String() noexcept {
+ reset();
+ }
+
+ //! Reset the string into a construction state.
+ ASMJIT_API Error reset() noexcept;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ inline String& operator=(String&& other) noexcept {
+ swap(other);
+ other.reset();
+ return *this;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const char* other) const noexcept { return equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const char* other) const noexcept { return !equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const String& other) const noexcept { return equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const String& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_external() const noexcept { return is_external(_type); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_large_or_external() const noexcept { return is_large_or_external(_type); }
+
+ //! Tests whether the string is empty.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return size() == 0; }
+
+ //! Returns the size of the string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return is_large_or_external() ? size_t(_large.size) : size_t(_type); }
+
+ //! Returns the capacity of the string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return is_large_or_external() ? _large.capacity : size_t(kSSOCapacity); }
+
+ //! Returns the data of the string.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG char* data() noexcept { return is_large_or_external() ? _large.data : _small.data; }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return is_large_or_external() ? _large.data : _small.data; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG char* begin() noexcept { return data(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* begin() const noexcept { return data(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG char* end() noexcept { return data() + size(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* end() const noexcept { return data() + size(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<char> as_span() noexcept { return Span<char>(data(), size()); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const char> as_span() const noexcept { return Span<const char>(data(), size()); }
+
+ //! \}
+
+ //! \name String Operations
+ //! \{
+
+ //! Swaps the content of this string with `other`.
+ ASMJIT_INLINE_NODEBUG void swap(String& other) noexcept {
+ std::swap(_raw, other._raw);
+ }
+
+ //! Clears the content of the string.
+ ASMJIT_API Error clear() noexcept;
+
+ [[nodiscard]]
+ ASMJIT_API char* prepare(ModifyOp op, size_t size) noexcept;
+
+ //! \cond INTERNAL
+ ASMJIT_API Error _op_string(ModifyOp op, const char* str, size_t size = SIZE_MAX) noexcept;
+ ASMJIT_API Error _op_char(ModifyOp op, char c) noexcept;
+ ASMJIT_API Error _op_chars(ModifyOp op, char c, size_t n) noexcept;
+ ASMJIT_API Error _op_number(ModifyOp op, uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept;
+ ASMJIT_API Error _op_hex(ModifyOp op, const void* data, size_t size, char separator = '\0') noexcept;
+ ASMJIT_API Error _op_format(ModifyOp op, const char* fmt, ...) noexcept;
+ ASMJIT_API Error _op_vformat(ModifyOp op, const char* fmt, va_list ap) noexcept;
+ //! \endcond
+
+ //! Replaces the current of the string with `data` of the given `size`.
+ //!
+ //! Null terminated strings can set `size` to `SIZE_MAX`.
+ ASMJIT_API Error assign(const char* data, size_t size = SIZE_MAX) noexcept;
+
+ //! Appends the given `span` to the string.
+ ASMJIT_INLINE_NODEBUG Error assign(Span<const char> span) noexcept {
+ return _op_string(ModifyOp::kAssign, span.data(), span.size());
+ }
+
+ //! Replaces the current of the string with `other` string.
+ ASMJIT_INLINE_NODEBUG Error assign(const String& other) noexcept {
+ return assign(other.data(), other.size());
+ }
+
+ //! Replaces the current of the string by a single `c` character.
+ ASMJIT_INLINE_NODEBUG Error assign(char c) noexcept {
+ return _op_char(ModifyOp::kAssign, c);
+ }
+
+ //! Replaces the current of the string by a `c` character, repeated `n` times.
+ ASMJIT_INLINE_NODEBUG Error assign_chars(char c, size_t n) noexcept {
+ return _op_chars(ModifyOp::kAssign, c, n);
+ }
+
+ //! Replaces the current of the string by a formatted integer `i` (signed).
+ ASMJIT_INLINE_NODEBUG Error assign_int(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _op_number(ModifyOp::kAssign, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
+ }
+
+ //! Replaces the current of the string by a formatted integer `i` (unsigned).
+ ASMJIT_INLINE_NODEBUG Error assign_uint(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _op_number(ModifyOp::kAssign, i, base, width, flags);
+ }
+
+ //! Replaces the current of the string by the given `data` converted to a HEX string.
+ ASMJIT_INLINE_NODEBUG Error assign_hex(const void* data, size_t size, char separator = '\0') noexcept {
+ return _op_hex(ModifyOp::kAssign, data, size, separator);
+ }
+
+ //! Replaces the current of the string by a formatted string `fmt`.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Error assign_format(const char* fmt, Args&&... args) noexcept {
+ return _op_format(ModifyOp::kAssign, fmt, std::forward<Args>(args)...);
+ }
+
+ //! Replaces the current of the string by a formatted string `fmt` (va_list version).
+ ASMJIT_INLINE_NODEBUG Error assign_vformat(const char* fmt, va_list ap) noexcept {
+ return _op_vformat(ModifyOp::kAssign, fmt, ap);
+ }
+
+ //! Appends `str` having the given size `size` to the string.
+ //!
+ //! Null terminated strings can set `size` to `SIZE_MAX`.
+ ASMJIT_INLINE_NODEBUG Error append(const char* str, size_t size = SIZE_MAX) noexcept {
+ return _op_string(ModifyOp::kAppend, str, size);
+ }
+
+ //! Appends the given `span` to the string.
+ ASMJIT_INLINE_NODEBUG Error append(Span<const char> span) noexcept {
+ return _op_string(ModifyOp::kAppend, span.data(), span.size());
+ }
+
+ //! Appends `other` string to this string.
+ ASMJIT_INLINE_NODEBUG Error append(const String& other) noexcept {
+ return append(other.data(), other.size());
+ }
+
+ //! Appends a single `c` character.
+ ASMJIT_INLINE_NODEBUG Error append(char c) noexcept {
+ return _op_char(ModifyOp::kAppend, c);
+ }
+
+ //! Appends `c` character repeated `n` times.
+ ASMJIT_INLINE_NODEBUG Error append_chars(char c, size_t n) noexcept {
+ return _op_chars(ModifyOp::kAppend, c, n);
+ }
+
+ //! Appends a formatted integer `i` (signed).
+ ASMJIT_INLINE_NODEBUG Error append_int(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _op_number(ModifyOp::kAppend, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
+ }
+
+ //! Appends a formatted integer `i` (unsigned).
+ ASMJIT_INLINE_NODEBUG Error append_uint(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
+ return _op_number(ModifyOp::kAppend, i, base, width, flags);
+ }
+
+ //! Appends the given `data` converted to a HEX string.
+ ASMJIT_INLINE_NODEBUG Error append_hex(const void* data, size_t size, char separator = '\0') noexcept {
+ return _op_hex(ModifyOp::kAppend, data, size, separator);
+ }
+
+ //! Appends a formatted string `fmt` with `args`.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Error append_format(const char* fmt, Args&&... args) noexcept {
+ return _op_format(ModifyOp::kAppend, fmt, std::forward<Args>(args)...);
+ }
+
+ //! Appends a formatted string `fmt` (va_list version).
+ ASMJIT_INLINE_NODEBUG Error append_vformat(const char* fmt, va_list ap) noexcept {
+ return _op_vformat(ModifyOp::kAppend, fmt, ap);
+ }
+
+ ASMJIT_API Error pad_end(size_t n, char c = ' ') noexcept;
+
+ //! Truncate the string length into `new_size`.
+ ASMJIT_API Error truncate(size_t new_size) noexcept;
+
+ [[nodiscard]]
+ ASMJIT_API bool equals(const char* other, size_t size = SIZE_MAX) const noexcept;
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool equals(const String& other) const noexcept { return equals(other.data(), other.size()); }
+
+ //! \}
+
+ //! \name Internal Functions
+ //! \{
+
+ //! Resets string to embedded and makes it empty (zero length, zero first char)
+ //!
+ //! \note This is always called internally after an external buffer was released as it zeroes all bytes
+ //! used by String's embedded storage.
+ inline void _reset_internal() noexcept {
+ for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_raw.uptr); i++) {
+ _raw.uptr[i] = 0;
+ }
+ }
+
+ inline void _set_size(size_t new_size) noexcept {
+ if (is_large_or_external()) {
+ _large.size = new_size;
+ }
+ else {
+ _small.type = uint8_t(new_size);
+ }
+ }
+
+ //! \}
+};
+
+//! Temporary string builder, has statically allocated `N` bytes.
+template<size_t N>
+class StringTmp : public String {
+public:
+ ASMJIT_NONCOPYABLE(StringTmp)
+
+ //! Embedded data.
+ char _embedded_data[Support::align_up(N + 1, sizeof(size_t))];
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG StringTmp() noexcept {
+ _reset_to_temporary();
+ }
+
+ inline void _reset_to_temporary() noexcept {
+ _large.type = kTypeExternal;
+ _large.capacity = ASMJIT_ARRAY_SIZE(_embedded_data) - 1;
+ _large.data = _embedded_data;
+ _embedded_data[0] = '\0';
+ }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_STRING_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/target.cpp b/3rdparty/asmjit/asmjit/core/target.cpp
new file mode 100644
index 00000000000..d54401cda4e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/target.cpp
@@ -0,0 +1,17 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/target.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+Target::Target() noexcept
+ : _environment{},
+ _cpu_features{},
+ _cpu_hints{} {}
+Target::~Target() noexcept {}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/target.h b/3rdparty/asmjit/asmjit/core/target.h
new file mode 100644
index 00000000000..bb5cbe276e7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/target.h
@@ -0,0 +1,71 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_TARGET_H_INCLUDED
+#define ASMJIT_CORE_TARGET_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/func.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Target is an abstract class that describes a machine code target.
+class ASMJIT_VIRTAPI Target {
+public:
+ ASMJIT_BASE_CLASS(Target)
+ ASMJIT_NONCOPYABLE(Target)
+
+ //! Target environment information.
+ Environment _environment;
+ //! Target CPU features.
+ CpuFeatures _cpu_features;
+ //! Target CPU hints.
+ CpuHints _cpu_hints;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a `Target` instance.
+ ASMJIT_API Target() noexcept;
+ //! Destroys the `Target` instance.
+ ASMJIT_API virtual ~Target() noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns target's environment.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; }
+
+ //! Returns the target architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _environment.arch(); }
+
+ //! Returns the target sub-architecture.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG SubArch sub_arch() const noexcept { return _environment.sub_arch(); }
+
+ [[nodiscard]]
+ //! Returns target CPU features.
+ ASMJIT_INLINE_NODEBUG const CpuFeatures& cpu_features() const noexcept { return _cpu_features; }
+
+ [[nodiscard]]
+ //! Returns target CPU hints.
+ ASMJIT_INLINE_NODEBUG CpuHints cpu_hints() const noexcept { return _cpu_hints; }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_TARGET_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/type.cpp b/3rdparty/asmjit/asmjit/core/type.cpp
new file mode 100644
index 00000000000..6a0b8a4deb9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/type.cpp
@@ -0,0 +1,70 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/core/type.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+namespace TypeUtils {
+
+template<uint32_t Index>
+struct ScalarOfTypeId {
+ static inline constexpr uint32_t kTypeId = uint32_t(
+ is_scalar(TypeId(Index)) ? TypeId(Index) :
+ is_mask8 (TypeId(Index)) ? TypeId::kUInt8 :
+ is_mask16(TypeId(Index)) ? TypeId::kUInt16 :
+ is_mask32(TypeId(Index)) ? TypeId::kUInt32 :
+ is_mask64(TypeId(Index)) ? TypeId::kUInt64 :
+ is_mmx32 (TypeId(Index)) ? TypeId::kUInt32 :
+ is_mmx64 (TypeId(Index)) ? TypeId::kUInt64 :
+ is_vec32 (TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec32Start ) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ is_vec64 (TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec64Start ) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ is_vec128(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec128Start) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ is_vec256(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec256Start) + uint32_t(TypeId::kInt8)) & 0xFF) :
+ is_vec512(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec512Start) + uint32_t(TypeId::kInt8)) & 0xFF) : TypeId::kVoid);
+};
+
+template<uint32_t Index>
+struct SizeOfTypeId {
+ static inline constexpr uint32_t kTypeSize =
+ is_int8 (TypeId(Index)) ? 1 :
+ is_uint8 (TypeId(Index)) ? 1 :
+ is_int16 (TypeId(Index)) ? 2 :
+ is_uint16 (TypeId(Index)) ? 2 :
+ is_int32 (TypeId(Index)) ? 4 :
+ is_uint32 (TypeId(Index)) ? 4 :
+ is_int64 (TypeId(Index)) ? 8 :
+ is_uint64 (TypeId(Index)) ? 8 :
+ is_float32(TypeId(Index)) ? 4 :
+ is_float64(TypeId(Index)) ? 8 :
+ is_float80(TypeId(Index)) ? 10 :
+ is_mask8 (TypeId(Index)) ? 1 :
+ is_mask16 (TypeId(Index)) ? 2 :
+ is_mask32 (TypeId(Index)) ? 4 :
+ is_mask64 (TypeId(Index)) ? 8 :
+ is_mmx32 (TypeId(Index)) ? 4 :
+ is_mmx64 (TypeId(Index)) ? 8 :
+ is_vec32 (TypeId(Index)) ? 4 :
+ is_vec64 (TypeId(Index)) ? 8 :
+ is_vec128 (TypeId(Index)) ? 16 :
+ is_vec256 (TypeId(Index)) ? 32 :
+ is_vec512 (TypeId(Index)) ? 64 : 0;
+};
+
+const TypeData _type_data = {
+ #define VALUE(x) TypeId(ScalarOfTypeId<x>::kTypeId)
+ { ASMJIT_LOOKUP_TABLE_256(VALUE, 0) },
+ #undef VALUE
+
+ #define VALUE(x) SizeOfTypeId<x>::kTypeSize
+ { ASMJIT_LOOKUP_TABLE_256(VALUE, 0) }
+ #undef VALUE
+};
+
+} // {TypeUtils}
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/core/type.h b/3rdparty/asmjit/asmjit/core/type.h
new file mode 100644
index 00000000000..518d9f668e4
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/type.h
@@ -0,0 +1,512 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_CORE_TYPE_H_INCLUDED
+#define ASMJIT_CORE_TYPE_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Type identifier provides a minimalist type system used across AsmJit library.
+//!
+//! This is an additional information that can be used to describe a value-type of physical or virtual register. It's
+//! used mostly by \ref BaseCompiler to describe register representation (the group of data stored in the register and
+//! the width used) and it's also used by APIs that allow to describe and work with function signatures.
+enum class TypeId : uint8_t {
+ //! Void type.
+ kVoid = 0,
+
+ _kBaseStart = 32,
+ _kBaseEnd = 44,
+
+ _kIntStart = 32,
+ _kIntEnd = 41,
+
+ //! Abstract signed integer type that has a native size.
+ kIntPtr = 32,
+ //! Abstract unsigned integer type that has a native size.
+ kUIntPtr = 33,
+
+ //! 8-bit signed integer type.
+ kInt8 = 34,
+ //! 8-bit unsigned integer type.
+ kUInt8 = 35,
+ //! 16-bit signed integer type.
+ kInt16 = 36,
+ //! 16-bit unsigned integer type.
+ kUInt16 = 37,
+ //! 32-bit signed integer type.
+ kInt32 = 38,
+ //! 32-bit unsigned integer type.
+ kUInt32 = 39,
+ //! 64-bit signed integer type.
+ kInt64 = 40,
+ //! 64-bit unsigned integer type.
+ kUInt64 = 41,
+
+ _kFloatStart = 42,
+ _kFloatEnd = 44,
+
+ //! 32-bit floating point type.
+ kFloat32 = 42,
+ //! 64-bit floating point type.
+ kFloat64 = 43,
+ //! 80-bit floating point type.
+ kFloat80 = 44,
+
+ _kMaskStart = 45,
+ _kMaskEnd = 48,
+
+ //! 8-bit opmask register (K).
+ kMask8 = 45,
+ //! 16-bit opmask register (K).
+ kMask16 = 46,
+ //! 32-bit opmask register (K).
+ kMask32 = 47,
+ //! 64-bit opmask register (K).
+ kMask64 = 48,
+
+ _kMmxStart = 49,
+ _kMmxEnd = 50,
+
+ //! 64-bit MMX register only used for 32 bits.
+ kMmx32 = 49,
+ //! 64-bit MMX register.
+ kMmx64 = 50,
+
+ _kVec32Start = 51,
+ _kVec32End = 60,
+
+ kInt8x4 = 51,
+ kUInt8x4 = 52,
+ kInt16x2 = 53,
+ kUInt16x2 = 54,
+ kInt32x1 = 55,
+ kUInt32x1 = 56,
+ kFloat32x1 = 59,
+
+ _kVec64Start = 61,
+ _kVec64End = 70,
+
+ kInt8x8 = 61,
+ kUInt8x8 = 62,
+ kInt16x4 = 63,
+ kUInt16x4 = 64,
+ kInt32x2 = 65,
+ kUInt32x2 = 66,
+ kInt64x1 = 67,
+ kUInt64x1 = 68,
+ kFloat32x2 = 69,
+ kFloat64x1 = 70,
+
+ _kVec128Start = 71,
+ _kVec128End = 80,
+
+ kInt8x16 = 71,
+ kUInt8x16 = 72,
+ kInt16x8 = 73,
+ kUInt16x8 = 74,
+ kInt32x4 = 75,
+ kUInt32x4 = 76,
+ kInt64x2 = 77,
+ kUInt64x2 = 78,
+ kFloat32x4 = 79,
+ kFloat64x2 = 80,
+
+ _kVec256Start = 81,
+ _kVec256End = 90,
+
+ kInt8x32 = 81,
+ kUInt8x32 = 82,
+ kInt16x16 = 83,
+ kUInt16x16 = 84,
+ kInt32x8 = 85,
+ kUInt32x8 = 86,
+ kInt64x4 = 87,
+ kUInt64x4 = 88,
+ kFloat32x8 = 89,
+ kFloat64x4 = 90,
+
+ _kVec512Start = 91,
+ _kVec512End = 100,
+
+ kInt8x64 = 91,
+ kUInt8x64 = 92,
+ kInt16x32 = 93,
+ kUInt16x32 = 94,
+ kInt32x16 = 95,
+ kUInt32x16 = 96,
+ kInt64x8 = 97,
+ kUInt64x8 = 98,
+ kFloat32x16 = 99,
+ kFloat64x8 = 100,
+
+ kLastAssigned = kFloat64x8,
+
+ kMaxValue = 255
+};
+ASMJIT_DEFINE_ENUM_COMPARE(TypeId)
+
+//! Type identifier utilities.
+namespace TypeUtils {
+
+struct TypeData {
+ TypeId scalar_of[uint32_t(TypeId::kMaxValue) + 1];
+ uint8_t size_of[uint32_t(TypeId::kMaxValue) + 1];
+};
+ASMJIT_VARAPI const TypeData _type_data;
+
+//! Returns the scalar type of `type_id`.
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG TypeId scalar_of(TypeId type_id) noexcept { return _type_data.scalar_of[uint32_t(type_id)]; }
+
+//! Returns the size [in bytes] of `type_id`.
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG uint32_t size_of(TypeId type_id) noexcept { return _type_data.size_of[uint32_t(type_id)]; }
+
+//! Tests whether a given type `type_id` is between `a` and `b`.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_between(TypeId type_id, TypeId a, TypeId b) noexcept {
+ return Support::is_between(uint32_t(type_id), uint32_t(a), uint32_t(b));
+}
+
+//! Tests whether a given type `type_id` is \ref TypeId::kVoid.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_void(TypeId type_id) noexcept { return type_id == TypeId::kVoid; }
+
+//! Tests whether a given type `type_id` is a valid non-void type.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_valid(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kIntStart, TypeId::_kVec512End); }
+
+//! Tests whether a given type `type_id` is scalar (has no vector part).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_scalar(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kBaseStart, TypeId::_kBaseEnd); }
+
+//! Tests whether a given type `type_id` is abstract, which means that its size depends on register size.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_abstract(TypeId type_id) noexcept { return is_between(type_id, TypeId::kIntPtr, TypeId::kUIntPtr); }
+
+//! Tests whether a given type is a scalar integer (signed or unsigned) of any size.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_int(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kIntStart, TypeId::_kIntEnd); }
+
+//! Tests whether a given type is a scalar 8-bit integer (signed).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_int8(TypeId type_id) noexcept { return type_id == TypeId::kInt8; }
+
+//! Tests whether a given type is a scalar 8-bit integer (unsigned).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_uint8(TypeId type_id) noexcept { return type_id == TypeId::kUInt8; }
+
+//! Tests whether a given type is a scalar 16-bit integer (signed).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_int16(TypeId type_id) noexcept { return type_id == TypeId::kInt16; }
+
+//! Tests whether a given type is a scalar 16-bit integer (unsigned).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_uint16(TypeId type_id) noexcept { return type_id == TypeId::kUInt16; }
+
+//! Tests whether a given type is a scalar 32-bit integer (signed).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_int32(TypeId type_id) noexcept { return type_id == TypeId::kInt32; }
+
+//! Tests whether a given type is a scalar 32-bit integer (unsigned).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_uint32(TypeId type_id) noexcept { return type_id == TypeId::kUInt32; }
+
+//! Tests whether a given type is a scalar 64-bit integer (signed).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_int64(TypeId type_id) noexcept { return type_id == TypeId::kInt64; }
+
+//! Tests whether a given type is a scalar 64-bit integer (unsigned).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_uint64(TypeId type_id) noexcept { return type_id == TypeId::kUInt64; }
+
+//! Tests whether a given type is an 8-bit general purpose register representing either signed or unsigned 8-bit integer.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_gp8(TypeId type_id) noexcept { return is_between(type_id, TypeId::kInt8, TypeId::kUInt8); }
+
+//! Tests whether a given type is a 16-bit general purpose register representing either signed or unsigned 16-bit integer
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_gp16(TypeId type_id) noexcept { return is_between(type_id, TypeId::kInt16, TypeId::kUInt16); }
+
+//! Tests whether a given type is a 32-bit general purpose register representing either signed or unsigned 32-bit integer
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_gp32(TypeId type_id) noexcept { return is_between(type_id, TypeId::kInt32, TypeId::kUInt32); }
+
+//! Tests whether a given type is a 64-bit general purpose register representing either signed or unsigned 64-bit integer
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_gp64(TypeId type_id) noexcept { return is_between(type_id, TypeId::kInt64, TypeId::kUInt64); }
+
+//! Tests whether a given type is a scalar floating point of any size.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_float(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kFloatStart, TypeId::_kFloatEnd); }
+
+//! Tests whether a given type is a scalar 32-bit float.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_float32(TypeId type_id) noexcept { return type_id == TypeId::kFloat32; }
+
+//! Tests whether a given type is a scalar 64-bit float.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_float64(TypeId type_id) noexcept { return type_id == TypeId::kFloat64; }
+
+//! Tests whether a given type is a scalar 80-bit float.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_float80(TypeId type_id) noexcept { return type_id == TypeId::kFloat80; }
+
+//! Tests whether a given type is a mask register of any size.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mask(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kMaskStart, TypeId::_kMaskEnd); }
+
+//! Tests whether a given type is an 8-bit mask register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mask8(TypeId type_id) noexcept { return type_id == TypeId::kMask8; }
+
+//! Tests whether a given type is an 16-bit mask register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mask16(TypeId type_id) noexcept { return type_id == TypeId::kMask16; }
+
+//! Tests whether a given type is an 32-bit mask register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mask32(TypeId type_id) noexcept { return type_id == TypeId::kMask32; }
+
+//! Tests whether a given type is an 64-bit mask register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mask64(TypeId type_id) noexcept { return type_id == TypeId::kMask64; }
+
+//! Tests whether a given type is an MMX register.
+//!
+//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mmx(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kMmxStart, TypeId::_kMmxEnd); }
+
+//! Tests whether a given type is an MMX register, which only uses the low 32 bits of data (only specific cases).
+//!
+//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mmx32(TypeId type_id) noexcept { return type_id == TypeId::kMmx32; }
+
+//! Tests whether a given type is an MMX register, which uses 64 bits of data (default).
+//!
+//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_mmx64(TypeId type_id) noexcept { return type_id == TypeId::kMmx64; }
+
+//! Tests whether a given type is a vector register of any size.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_vec(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kVec32Start, TypeId::_kVec512End); }
+
+//! Tests whether a given type is a 32-bit or 32-bit view of a vector register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_vec32(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kVec32Start, TypeId::_kVec32End); }
+
+//! Tests whether a given type is a 64-bit or 64-bit view of a vector register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_vec64(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kVec64Start, TypeId::_kVec64End); }
+
+//! Tests whether a given type is a 128-bit or 128-bit view of a vector register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_vec128(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kVec128Start, TypeId::_kVec128End); }
+
+//! Tests whether a given type is a 256-bit or 256-bit view of a vector register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_vec256(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kVec256Start, TypeId::_kVec256End); }
+
+//! Tests whether a given type is a 512-bit or 512-bit view of a vector register.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR bool is_vec512(TypeId type_id) noexcept { return is_between(type_id, TypeId::_kVec512Start, TypeId::_kVec512End); }
+
+//! \cond
+enum TypeCategory : uint32_t {
+ kTypeCategoryUnknown = 0,
+ kTypeCategoryEnum = 1,
+ kTypeCategoryIntegral = 2,
+ kTypeCategoryFloatingPoint = 3,
+ kTypeCategoryFunction = 4
+};
+
+template<typename T, TypeCategory kCategory>
+struct TypeIdOfT_ByCategory {}; // Fails if not specialized.
+
+template<typename T>
+struct TypeIdOfT_ByCategory<T, kTypeCategoryIntegral> {
+ static inline constexpr uint32_t kTypeId = uint32_t(
+ (sizeof(T) == 1 && std::is_signed_v<T>) ? TypeId::kInt8 :
+ (sizeof(T) == 1 && !std::is_signed_v<T>) ? TypeId::kUInt8 :
+ (sizeof(T) == 2 && std::is_signed_v<T>) ? TypeId::kInt16 :
+ (sizeof(T) == 2 && !std::is_signed_v<T>) ? TypeId::kUInt16 :
+ (sizeof(T) == 4 && std::is_signed_v<T>) ? TypeId::kInt32 :
+ (sizeof(T) == 4 && !std::is_signed_v<T>) ? TypeId::kUInt32 :
+ (sizeof(T) == 8 && std::is_signed_v<T>) ? TypeId::kInt64 :
+ (sizeof(T) == 8 && !std::is_signed_v<T>) ? TypeId::kUInt64 : TypeId::kVoid);
+};
+
+template<typename T>
+struct TypeIdOfT_ByCategory<T, kTypeCategoryFloatingPoint> {
+ static inline constexpr uint32_t kTypeId = uint32_t(
+ (sizeof(T) == 4 ) ? TypeId::kFloat32 :
+ (sizeof(T) == 8 ) ? TypeId::kFloat64 :
+ (sizeof(T) >= 10) ? TypeId::kFloat80 : TypeId::kVoid);
+};
+
+template<typename T>
+struct TypeIdOfT_ByCategory<T, kTypeCategoryEnum>
+ : public TypeIdOfT_ByCategory<std::underlying_type_t<T>, kTypeCategoryIntegral> {};
+
+template<typename T>
+struct TypeIdOfT_ByCategory<T, kTypeCategoryFunction> {
+ static inline constexpr uint32_t kTypeId = uint32_t(TypeId::kUIntPtr);
+};
+//! \endcond
+
+//! TypeIdOfT<> template allows to get a TypeId from a C++ type `T`.
+#ifdef _DOXYGEN
+template<typename T>
+struct TypeIdOfT {
+ //! TypeId of C++ type `T`.
+ static inline constexpr TypeId kTypeId = _TypeIdDeducedAtCompileTime_;
+};
+#else
+template<typename T>
+struct TypeIdOfT
+ : public TypeIdOfT_ByCategory<T,
+ std::is_enum_v<T> ? kTypeCategoryEnum :
+ std::is_integral_v<T> ? kTypeCategoryIntegral :
+ std::is_floating_point_v<T> ? kTypeCategoryFloatingPoint :
+ std::is_function_v<T> ? kTypeCategoryFunction : kTypeCategoryUnknown> {};
+#endif
+
+//! \cond
+template<typename T>
+struct TypeIdOfT<T*> {
+ static inline constexpr uint32_t kTypeId = uint32_t(TypeId::kUIntPtr);
+};
+
+template<typename T>
+struct TypeIdOfT<T&> {
+ static inline constexpr uint32_t kTypeId = uint32_t(TypeId::kUIntPtr);
+};
+//! \endcond
+
+//! Returns a corresponding \ref TypeId of `T` type.
+template<typename T>
+static ASMJIT_INLINE_CONSTEXPR TypeId type_id_of_t() noexcept { return TypeId(TypeIdOfT<T>::kTypeId); }
+
+//! Returns offset needed to convert a `kIntPtr` and `kUIntPtr` TypeId into a type that matches `register_size`
+//! (general-purpose register size). If you find such TypeId it's then only about adding the offset to it.
+//!
+//! For example:
+//!
+//! ```
+//! uint32_t register_size = /* 4 or 8 */;
+//! uint32_t deabstract_delta = TypeUtils::deabstract_delta_of_size(register_size);
+//!
+//! TypeId type_id = 'some type-id';
+//!
+//! // Normalize some type_id into a non-abstract type_id.
+//! if (TypeUtils::is_abstract(type_id)) type_id += deabstract_delta;
+//!
+//! // The same, but by using TypeUtils::deabstract() function.
+//! type_id = TypeUtils::deabstract(type_id, deabstract_delta);
+//! ```
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR uint32_t deabstract_delta_of_size(uint32_t register_size) noexcept {
+ return register_size >= 8 ? uint32_t(TypeId::kInt64) - uint32_t(TypeId::kIntPtr)
+ : uint32_t(TypeId::kInt32) - uint32_t(TypeId::kIntPtr);
+}
+
+//! Deabstracts a given `type_id` into a native type by using `deabstract_delta`, which was previously
+//! calculated by calling \ref deabstract_delta_of_size() with a target native register size.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR TypeId deabstract(TypeId type_id, uint32_t deabstract_delta) noexcept {
+ return is_abstract(type_id) ? TypeId(uint32_t(type_id) + deabstract_delta) : type_id;
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR TypeId scalar_to_vector(TypeId scalar_type_id, TypeId vec_start_id) noexcept {
+ return TypeId(uint32_t(vec_start_id) + uint32_t(scalar_type_id) - uint32_t(TypeId::kInt8));
+}
+
+} // {TypeUtils}
+
+//! Provides type identifiers that can be used in templates instead of native types.
+namespace Type {
+
+//! bool as C++ type-name.
+struct Bool {};
+//! int8_t as C++ type-name.
+struct Int8 {};
+//! uint8_t as C++ type-name.
+struct UInt8 {};
+//! int16_t as C++ type-name.
+struct Int16 {};
+//! uint16_t as C++ type-name.
+struct UInt16 {};
+//! int32_t as C++ type-name.
+struct Int32 {};
+//! uint32_t as C++ type-name.
+struct UInt32 {};
+//! int64_t as C++ type-name.
+struct Int64 {};
+//! uint64_t as C++ type-name.
+struct UInt64 {};
+//! intptr_t as C++ type-name.
+struct IntPtr {};
+//! uintptr_t as C++ type-name.
+struct UIntPtr {};
+//! float as C++ type-name.
+struct Float32 {};
+//! double as C++ type-name.
+struct Float64 {};
+
+//! 128-bit vector register as C++ type-name.
+struct Vec128 {};
+//! 256-bit vector register as C++ type-name.
+struct Vec256 {};
+//! 512-bit vector register as C++ type-name.
+struct Vec512 {};
+
+} // {Type}
+
+//! \cond
+#define ASMJIT_DEFINE_TYPE_ID(T, TYPE_ID) \
+namespace TypeUtils { \
+ template<> \
+ struct TypeIdOfT<T> { \
+ static inline constexpr uint32_t kTypeId = uint32_t(TYPE_ID); \
+ }; \
+}
+
+ASMJIT_DEFINE_TYPE_ID(void , TypeId::kVoid)
+ASMJIT_DEFINE_TYPE_ID(Type::Bool , TypeId::kUInt8)
+ASMJIT_DEFINE_TYPE_ID(Type::Int8 , TypeId::kInt8)
+ASMJIT_DEFINE_TYPE_ID(Type::UInt8 , TypeId::kUInt8)
+ASMJIT_DEFINE_TYPE_ID(Type::Int16 , TypeId::kInt16)
+ASMJIT_DEFINE_TYPE_ID(Type::UInt16 , TypeId::kUInt16)
+ASMJIT_DEFINE_TYPE_ID(Type::Int32 , TypeId::kInt32)
+ASMJIT_DEFINE_TYPE_ID(Type::UInt32 , TypeId::kUInt32)
+ASMJIT_DEFINE_TYPE_ID(Type::Int64 , TypeId::kInt64)
+ASMJIT_DEFINE_TYPE_ID(Type::UInt64 , TypeId::kUInt64)
+ASMJIT_DEFINE_TYPE_ID(Type::IntPtr , TypeId::kIntPtr)
+ASMJIT_DEFINE_TYPE_ID(Type::UIntPtr, TypeId::kUIntPtr)
+ASMJIT_DEFINE_TYPE_ID(Type::Float32, TypeId::kFloat32)
+ASMJIT_DEFINE_TYPE_ID(Type::Float64, TypeId::kFloat64)
+ASMJIT_DEFINE_TYPE_ID(Type::Vec128 , TypeId::kInt32x4)
+ASMJIT_DEFINE_TYPE_ID(Type::Vec256 , TypeId::kInt32x8)
+ASMJIT_DEFINE_TYPE_ID(Type::Vec512 , TypeId::kInt32x16)
+
+#undef ASMJIT_DEFINE_TYPE_ID
+//! \endcond
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_CORE_TYPE_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/core/virtmem.cpp b/3rdparty/asmjit/asmjit/core/virtmem.cpp
new file mode 100644
index 00000000000..37c7824edf7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/core/virtmem.cpp
@@ -0,0 +1,1257 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#ifndef ASMJIT_NO_JIT
+
+#include <asmjit/core/osutils_p.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/virtmem.h>
+#include <asmjit/support/support.h>
+
+#if !defined(_WIN32)
+ #include <errno.h>
+ #include <fcntl.h>
+ #include <sys/mman.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+
+ #if !ASMJIT_ARCH_X86
+ #include <sys/time.h> // required by gettimeofday()
+ #endif
+
+ // Linux has a `memfd_create` syscall that we would like to use, if available.
+ #if defined(__linux__)
+ #include <sys/syscall.h>
+ #include <sys/utsname.h>
+
+ #ifndef MAP_HUGETLB
+ #define MAP_HUGETLB 0x40000
+ #endif // MAP_HUGETLB
+
+ #ifndef MAP_HUGE_SHIFT
+ #define MAP_HUGE_SHIFT 26
+ #endif // MAP_HUGE_SHIFT
+
+ #if !defined(MFD_CLOEXEC)
+ #define MFD_CLOEXEC 0x0001u
+ #endif // MFD_CLOEXEC
+
+ #if !defined(MFD_NOEXEC_SEAL)
+ #define MFD_NOEXEC_SEAL 0x0008u
+ #endif // MFD_NOEXEC_SEAL
+
+ #if !defined(MFD_EXEC)
+ #define MFD_EXEC 0x0010u
+ #endif // MFD_EXEC
+
+ #ifndef MFD_HUGETLB
+ #define MFD_HUGETLB 0x0004
+ #endif // MFD_HUGETLB
+
+ #ifndef MFD_HUGE_SHIFT
+ #define MFD_HUGE_SHIFT 26
+ #endif // MFD_HUGE_SHIFT
+ #endif
+
+ // Apple recently introduced MAP_JIT flag, which we want to use.
+ #if defined(__APPLE__)
+ #include <pthread.h>
+ #include <TargetConditionals.h>
+ #if TARGET_OS_OSX
+ #include <sys/utsname.h>
+ #include <libkern/OSCacheControl.h> // sys_icache_invalidate().
+ #endif
+ // Older SDK doesn't define `MAP_JIT`.
+ #ifndef MAP_JIT
+ #define MAP_JIT 0x800
+ #endif
+ #endif
+
+ // BSD/MAC: `MAP_ANONYMOUS` is not defined, `MAP_ANON` is.
+ #if !defined(MAP_ANONYMOUS)
+ #define MAP_ANONYMOUS MAP_ANON
+ #endif
+
+ // Android NDK doesn't provide `shm_open()` and `shm_unlink()`.
+ #if !defined(__BIONIC__) && !defined(ASMJIT_NO_SHM_OPEN)
+ #define ASMJIT_HAS_SHM_OPEN
+ #endif
+
+ #if defined(__APPLE__) || defined(__BIONIC__) || !defined(ASMJIT_HAS_SHM_OPEN)
+ #define ASMJIT_VM_SHM_DETECT 0
+ #else
+ #define ASMJIT_VM_SHM_DETECT 1
+ #endif
+
+ #if defined(__APPLE__) && TARGET_OS_OSX
+ #if ASMJIT_ARCH_X86 != 0
+ #define ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP
+ #endif
+ #if ASMJIT_ARCH_ARM >= 64
+ #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP
+ #endif
+ #endif
+
+ #if defined(__APPLE__) && ASMJIT_ARCH_X86 == 0
+ #define ASMJIT_NO_DUAL_MAPPING
+ #endif
+
+ #if defined(__NetBSD__) && defined(MAP_REMAPDUP) && defined(PROT_MPROTECT)
+ #define ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP
+ #endif
+
+ #if !defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP) && \
+ !defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) && \
+ !defined(ASMJIT_NO_DUAL_MAPPING)
+ #define ASMJIT_ANONYMOUS_MEMORY_USE_FD
+ #endif
+#endif
+
+#include <atomic>
+
+#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+
+extern "C" {
+
+#ifdef mig_external
+mig_external
+#else
+extern
+#endif
+kern_return_t mach_vm_remap(
+ vm_map_t target_task,
+ mach_vm_address_t *target_address,
+ mach_vm_size_t size,
+ mach_vm_offset_t mask,
+ int flags,
+ vm_map_t src_task,
+ mach_vm_address_t src_address,
+ boolean_t copy,
+ vm_prot_t *cur_protection,
+ vm_prot_t *max_protection,
+ vm_inherit_t inheritance
+);
+
+} // {extern "C"}
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(VirtMem)
+
+// Virtual Memory Utilities
+// ========================
+
+[[maybe_unused]]
+static const constexpr MemoryFlags dual_mapping_filter[2] = {
+ MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite,
+ MemoryFlags::kAccessExecute | MemoryFlags::kMMapMaxAccessExecute
+};
+
+// Virtual Memory [Windows]
+// ========================
+
+#if defined(_WIN32)
+
+struct ScopedHandle {
+ inline ScopedHandle() noexcept
+ : value(nullptr) {}
+
+ inline ~ScopedHandle() noexcept {
+ if (value != nullptr) {
+ ::CloseHandle(value);
+ }
+ }
+
+ HANDLE value;
+};
+
+static void detect_vm_info(Info& vm_info) noexcept {
+ SYSTEM_INFO system_info;
+
+ ::GetSystemInfo(&system_info);
+ vm_info.page_size = Support::align_up_power_of_2<uint32_t>(system_info.dwPageSize);
+ vm_info.page_granularity = system_info.dwAllocationGranularity;
+}
+
+static size_t detect_large_page_size() noexcept {
+ return ::GetLargePageMinimum();
+}
+
+static bool has_dual_mapping_support() noexcept {
+ // TODO: This assumption works on X86 platforms, this may not work on AArch64.
+ return true;
+}
+
+// Returns windows-specific protect_flags from \ref MemoryFlags.
+static DWORD protect_flags_from_memory_flags(MemoryFlags memory_flags) noexcept {
+ DWORD protect_flags;
+
+ // READ|WRITE|EXECUTE.
+ if (Support::test(memory_flags, MemoryFlags::kAccessExecute)) {
+ protect_flags = Support::test(memory_flags, MemoryFlags::kAccessWrite) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
+ }
+ else if (Support::test(memory_flags, MemoryFlags::kAccessRW)) {
+ protect_flags = Support::test(memory_flags, MemoryFlags::kAccessWrite) ? PAGE_READWRITE : PAGE_READONLY;
+ }
+ else {
+ protect_flags = PAGE_NOACCESS;
+ }
+
+ // Any other flags to consider?
+ return protect_flags;
+}
+
+static DWORD desired_access_from_memory_flags(MemoryFlags memory_flags) noexcept {
+ DWORD access = Support::test(memory_flags, MemoryFlags::kAccessWrite) ? FILE_MAP_WRITE : FILE_MAP_READ;
+ if (Support::test(memory_flags, MemoryFlags::kAccessExecute)) {
+ access |= FILE_MAP_EXECUTE;
+ }
+ return access;
+}
+
+static HardenedRuntimeFlags get_hardened_runtime_flags() noexcept {
+ HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone;
+
+ if (has_dual_mapping_support()) {
+ flags |= HardenedRuntimeFlags::kDualMapping;
+ }
+
+ return flags;
+}
+
+Error alloc(void** p, size_t size, MemoryFlags memory_flags) noexcept {
+ *p = nullptr;
+
+ if (size == 0) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ DWORD allocation_type = MEM_COMMIT | MEM_RESERVE;
+ DWORD protect_flags = protect_flags_from_memory_flags(memory_flags);
+
+ if (Support::test(memory_flags, MemoryFlags::kMMapLargePages)) {
+ size_t lp_size = large_page_size();
+
+ // Does it make sense to call VirtualAlloc() if we failed to query large page size?
+ if (lp_size == 0) {
+ return make_error(Error::kFeatureNotEnabled);
+ }
+
+ if (!Support::is_aligned(size, lp_size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ allocation_type |= MEM_LARGE_PAGES;
+ }
+
+ void* result = ::VirtualAlloc(nullptr, size, allocation_type, protect_flags);
+ if (!result) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ *p = result;
+ return Error::kOk;
+}
+
+Error release(void* p, size_t size) noexcept {
+ Support::maybe_unused(size);
+
+ // NOTE: If the `dw_free_type` parameter is MEM_RELEASE, `size` parameter must be zero.
+ constexpr DWORD dw_free_type = MEM_RELEASE;
+
+ if (ASMJIT_UNLIKELY(!::VirtualFree(p, 0, dw_free_type))) {
+ return make_error(Error::kInvalidArgument);
+
+ }
+ return Error::kOk;
+}
+
+Error protect(void* p, size_t size, MemoryFlags memory_flags) noexcept {
+ DWORD protect_flags = protect_flags_from_memory_flags(memory_flags);
+ DWORD old_flags;
+
+ if (::VirtualProtect(p, size, protect_flags, &old_flags)) {
+ return Error::kOk;
+ }
+
+ return make_error(Error::kInvalidArgument);
+}
+
+Error alloc_dual_mapping(Out<DualMapping> dm, size_t size, MemoryFlags memory_flags) noexcept {
+ dm->rx = nullptr;
+ dm->rw = nullptr;
+
+ if (size == 0) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ ScopedHandle handle;
+ handle.value = ::CreateFileMappingW(
+ INVALID_HANDLE_VALUE,
+ nullptr,
+ PAGE_EXECUTE_READWRITE,
+ (DWORD)(uint64_t(size) >> 32),
+ (DWORD)(size & 0xFFFFFFFFu),
+ nullptr);
+
+ if (ASMJIT_UNLIKELY(!handle.value)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ void* ptr[2];
+ for (uint32_t i = 0; i < 2; i++) {
+ MemoryFlags access_flags = memory_flags & ~dual_mapping_filter[i];
+ DWORD desired_access = desired_access_from_memory_flags(access_flags);
+ ptr[i] = ::MapViewOfFile(handle.value, desired_access, 0, 0, size);
+
+ if (ptr[i] == nullptr) {
+ if (i == 1u) {
+ ::UnmapViewOfFile(ptr[0]);
+ }
+ return make_error(Error::kOutOfMemory);
+ }
+ }
+
+ dm->rx = ptr[0];
+ dm->rw = ptr[1];
+ return Error::kOk;
+}
+
+Error release_dual_mapping(DualMapping& dm, size_t size) noexcept {
+ Support::maybe_unused(size);
+ bool failed = false;
+
+ if (!::UnmapViewOfFile(dm.rx)) {
+ failed = true;
+ }
+
+ if (dm.rx != dm.rw && !UnmapViewOfFile(dm.rw)) {
+ failed = true;
+ }
+
+ if (failed) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ dm.rx = nullptr;
+ dm.rw = nullptr;
+ return Error::kOk;
+}
+
+#endif
+
+// Virtual Memory [Unix]
+// =====================
+
+#if !defined(_WIN32)
+
+// Virtual Memory [Unix] - Utilities
+// =================================
+
+#if defined(__linux__) || (defined(__APPLE__) && TARGET_OS_OSX)
+struct KernelVersion {
+ long ver[2];
+
+ inline long major() const noexcept { return ver[0]; }
+ inline long minor() const noexcept { return ver[1]; }
+
+ inline bool eq(long major, long minor) const noexcept { return ver[0] == major && ver[1] == minor; }
+ inline bool ge(long major, long minor) const noexcept { return ver[0] > major || (ver[0] == major && ver[1] >= minor); }
+};
+
+[[maybe_unused]]
+static KernelVersion get_kernel_version() noexcept {
+ KernelVersion out {};
+ struct utsname buf {};
+
+ uname(&buf);
+
+ size_t i = 0;
+ char* p = buf.release;
+
+ while (*p && i < 2u) {
+ uint8_t c = uint8_t(*p);
+ if (c >= uint8_t('0') && c <= uint8_t('9')) {
+ out.ver[i] = strtol(p, &p, 10);
+ i++;
+ continue;
+ }
+
+ p++;
+ }
+
+ return out;
+}
+#endif // get_kernel_version
+
+// Translates libc errors specific to VirtualMemory mapping to `asmjit::Error`.
+[[maybe_unused]]
+static Error asmjit_error_from_errno(int e) noexcept {
+ switch (e) {
+ case EACCES:
+ case EAGAIN:
+ case ENODEV:
+ case EPERM:
+ return Error::kInvalidState;
+
+ case EFBIG:
+ case ENOMEM:
+ case EOVERFLOW:
+ return Error::kOutOfMemory;
+
+ case EMFILE:
+ case ENFILE:
+ return Error::kTooManyHandles;
+
+ default:
+ return Error::kInvalidArgument;
+ }
+}
+
+[[maybe_unused]]
+static MemoryFlags max_access_flags_to_regular_access_flags(MemoryFlags memory_flags) noexcept {
+ static constexpr uint32_t kMaxProtShift = Support::ctz_const<MemoryFlags::kMMapMaxAccessRead>;
+ return MemoryFlags(uint32_t(memory_flags & MemoryFlags::kMMapMaxAccessRWX) >> kMaxProtShift);
+}
+
+[[maybe_unused]]
+static MemoryFlags regular_access_flags_to_max_access_flags(MemoryFlags memory_flags) noexcept {
+ static constexpr uint32_t kMaxProtShift = Support::ctz_const<MemoryFlags::kMMapMaxAccessRead>;
+ return MemoryFlags(uint32_t(memory_flags & MemoryFlags::kAccessRWX) << kMaxProtShift);
+}
+
+// Returns `mmap()` protection flags from \ref MemoryFlags.
+[[maybe_unused]]
+static int mm_prot_from_memory_flags(MemoryFlags memory_flags) noexcept {
+ int protection = 0;
+ if (Support::test(memory_flags, MemoryFlags::kAccessRead)) protection |= PROT_READ;
+ if (Support::test(memory_flags, MemoryFlags::kAccessWrite)) protection |= PROT_READ | PROT_WRITE;
+ if (Support::test(memory_flags, MemoryFlags::kAccessExecute)) protection |= PROT_READ | PROT_EXEC;
+ return protection;
+}
+
+// Returns maximum protection flags from `memory_flags`.
+//
+// Uses:
+// - `PROT_MPROTECT()` on NetBSD.
+// - `PROT_MAX()` when available on other BSDs.
+[[maybe_unused]]
+static inline int mm_max_prot_from_memory_flags(MemoryFlags memory_flags) noexcept {
+ MemoryFlags acc = max_access_flags_to_regular_access_flags(memory_flags);
+ if (acc != MemoryFlags::kNone) {
+#if defined(__NetBSD__) && defined(PROT_MPROTECT)
+ return PROT_MPROTECT(mm_prot_from_memory_flags(acc));
+#elif defined(PROT_MAX)
+ return PROT_MAX(mm_prot_from_memory_flags(acc));
+#else
+ return 0;
+#endif
+ }
+
+ return 0;
+}
+
+static void detect_vm_info(Info& vm_info) noexcept {
+ uint32_t page_size = uint32_t(::getpagesize());
+
+ vm_info.page_size = page_size;
+ vm_info.page_granularity = Support::max<uint32_t>(page_size, 65536);
+}
+
+static size_t detect_large_page_size() noexcept {
+#if defined(__APPLE__) && defined(VM_FLAGS_SUPERPAGE_SIZE_2MB) && ASMJIT_ARCH_X86
+ return 2u * 1024u * 1024u;
+#elif defined(__FreeBSD__)
+ Support::Array<size_t, 2> page_size;
+ // TODO: Does it return unsigned?
+ return (getpagesizes(page_size.data(), 2) < 2) ? 0 : uint32_t(page_size[1]);
+#elif defined(__linux__)
+ StringTmp<128> storage;
+
+ if (OSUtils::read_file("/sys/kernel/mm/transparent_hugepage/hpage_pmd_size", storage, 16) != Error::kOk || storage.is_empty()) {
+ return 0u;
+ }
+
+ // The first value should be the size of the page (hpage_pmd_size).
+ size_t large_page_size = 0;
+
+ const char* buf = storage.data();
+ size_t buf_size = storage.size();
+
+ for (size_t i = 0; i < buf_size; i++) {
+ uint32_t digit = uint32_t(uint8_t(buf[i]) - uint8_t('0'));
+ if (digit >= 10u) {
+ break;
+ }
+ large_page_size = large_page_size * 10 + digit;
+ }
+
+ if (Support::is_power_of_2(large_page_size))
+ return large_page_size;
+ else
+ return 0u;
+#else
+ return 0u;
+#endif
+}
+
+// Virtual Memory [Posix] - Anonymous Memory
+// =========================================
+
+#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
+
+// Some operating systems don't allow /dev/shm to be executable. On Linux this happens when /dev/shm is mounted with
+// 'noexec', which is enforced by systemd. Other operating systems like MacOS also restrict executable permissions
+// regarding /dev/shm, so we use a runtime detection before attempting to allocate executable memory. Sometimes we
+// don't need the detection as we know it would always result in `AnonymousMemoryStrategy::kTmpDir`.
+enum class AnonymousMemoryStrategy : uint32_t {
+ kUnknown = 0,
+ kDevShm = 1,
+ kTmpDir = 2
+};
+
+#if !defined(SHM_ANON)
+static const char* get_tmp_dir() noexcept {
+ const char* tmp_dir = getenv("TMPDIR");
+ return tmp_dir ? tmp_dir : "/tmp";
+}
+#endif
+
+#if defined(__linux__) && defined(__NR_memfd_create)
+static uint32_t get_mfd_exec_flag() noexcept {
+ static std::atomic<uint32_t> cached_mfd_exec_supported;
+ uint32_t val = cached_mfd_exec_supported.load();
+
+ if (val == 0u) {
+ KernelVersion ver = get_kernel_version();
+ val = uint32_t(ver.ge(6, 3)) + 1u;
+ cached_mfd_exec_supported.store(val);
+ }
+
+ return val == 2u ? uint32_t(MFD_EXEC) : uint32_t(0u);
+}
+#endif // __linux__ && __NR_memfd_create
+
+
+// It's not fully random, just to avoid collisions when opening TMP or SHM file.
+[[maybe_unused]]
+static uint64_t generate_random_bits(uintptr_t stack_ptr, uint32_t attempt) noexcept {
+ static std::atomic<uint32_t> internal_counter;
+
+#if defined(__GNUC__) && ASMJIT_ARCH_X86
+ // Use RDTSC instruction to avoid gettimeofday() as we just need some "random" bits.
+ uint64_t mix = __builtin_ia32_rdtsc();
+#else
+ struct timeval tm {};
+ uint64_t mix = 1; // only used when gettimeofday() fails, which is unlikely.
+ if (gettimeofday(&tm, nullptr) == 0) {
+ mix = uint64_t(tm.tv_usec) ^ uint64_t(tm.tv_sec);
+ }
+#endif
+
+ uint64_t bits = (uint64_t(stack_ptr) & 0x1010505000055590u) - mix * 773703683;
+ bits = (bits >> 33) ^ (bits << 7) ^ (attempt * 87178291199);
+ return bits + uint64_t(++internal_counter) * 10619863;
+}
+
+class AnonymousMemory {
+public:
+ enum FileType : uint32_t {
+ kFileTypeNone,
+ kFileTypeShm,
+ kFileTypeTmp
+ };
+
+ int _fd;
+ FileType _file_type;
+ StringTmp<128> _tmp_name;
+
+ inline AnonymousMemory() noexcept
+ : _fd(-1),
+ _file_type(kFileTypeNone),
+ _tmp_name() {}
+
+ inline ~AnonymousMemory() noexcept {
+ unlink();
+ close();
+ }
+
+ inline int fd() const noexcept { return _fd; }
+
+ Error open(bool prefer_tmp_over_dev_shm) noexcept {
+#if defined(__linux__) && defined(__NR_memfd_create)
+ // Linux specific 'memfd_create' - if the syscall returns `ENOSYS` it means
+ // it's not available and we will never call it again (would be pointless).
+ //
+ // NOTE: There is also memfd_create() libc function in FreeBSD, but it internally
+ // uses `shm_open(SHM_ANON, ...)` so it's not needed to add support for it (it's
+ // not a syscall as in Linux).
+
+ // Zero initialized, if ever changed to '1' that would mean the syscall is not
+ // available and we must use `shm_open()` and `shm_unlink()` (or regular `open()`).
+ static volatile uint32_t memfd_create_not_supported;
+
+ if (!memfd_create_not_supported) {
+ _fd = (int)syscall(__NR_memfd_create, "vmem", MFD_CLOEXEC | get_mfd_exec_flag());
+ if (ASMJIT_LIKELY(_fd >= 0)) {
+ return Error::kOk;
+ }
+
+ int e = errno;
+ if (e == ENOSYS) {
+ memfd_create_not_supported = 1;
+ }
+ else {
+ return make_error(asmjit_error_from_errno(e));
+ }
+ }
+#endif // __linux__ && __NR_memfd_create
+
+#if defined(ASMJIT_HAS_SHM_OPEN) && defined(SHM_ANON)
+ // Originally FreeBSD extension, apparently works in other BSDs too.
+ Support::maybe_unused(prefer_tmp_over_dev_shm);
+ _fd = ::shm_open(SHM_ANON, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+
+ if (ASMJIT_LIKELY(_fd >= 0)) {
+ return Error::kOk;
+ }
+ else {
+ return make_error(asmjit_error_from_errno(errno));
+ }
+#else
+ // POSIX API. We have to generate somehow a unique name, so use `generate_random_bits()` helper. To prevent
+ // having file collisions we use `shm_open()` with flags that require creation of the file so we never open
+ // an existing shared memory.
+ static const char shm_format_string[] = "/shm-id-%016llX";
+ uint32_t retry_count = 100;
+
+ for (uint32_t i = 0; i < retry_count; i++) {
+ bool use_tmp = !ASMJIT_VM_SHM_DETECT || prefer_tmp_over_dev_shm;
+ uint64_t bits = generate_random_bits((uintptr_t)this, i);
+
+ if (use_tmp) {
+ _tmp_name.assign(get_tmp_dir());
+ _tmp_name.append_format(shm_format_string, (unsigned long long)bits);
+ _fd = ASMJIT_FILE64_API(::open)(_tmp_name.data(), O_RDWR | O_CREAT | O_EXCL, 0);
+ if (ASMJIT_LIKELY(_fd >= 0)) {
+ _file_type = kFileTypeTmp;
+ return Error::kOk;
+ }
+ }
+#if defined(ASMJIT_HAS_SHM_OPEN)
+ else {
+ _tmp_name.assign_format(shm_format_string, (unsigned long long)bits);
+ _fd = ::shm_open(_tmp_name.data(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ if (ASMJIT_LIKELY(_fd >= 0)) {
+ _file_type = kFileTypeShm;
+ return Error::kOk;
+ }
+ }
+#endif
+
+ int e = errno;
+ if (e != EEXIST) {
+ return make_error(asmjit_error_from_errno(e));
+ }
+ }
+
+ return make_error(Error::kFailedToOpenAnonymousMemory);
+#endif
+ }
+
+ void unlink() noexcept {
+ FileType type = _file_type;
+ _file_type = kFileTypeNone;
+
+#ifdef ASMJIT_HAS_SHM_OPEN
+ if (type == kFileTypeShm) {
+ ::shm_unlink(_tmp_name.data());
+ return;
+ }
+#endif
+
+ if (type == kFileTypeTmp) {
+ ::unlink(_tmp_name.data());
+ return;
+ }
+ }
+
+ void close() noexcept {
+ if (_fd >= 0) {
+ ::close(_fd);
+ _fd = -1;
+ }
+ }
+
+ Error allocate(size_t size) noexcept {
+ // TODO: Improve this by using `posix_fallocate()` when available.
+ if (ASMJIT_FILE64_API(ftruncate)(_fd, off_t(size)) != 0) {
+ return make_error(asmjit_error_from_errno(errno));
+ }
+
+ return Error::kOk;
+ }
+};
+
+#if ASMJIT_VM_SHM_DETECT
+static Error detect_anonymous_memory_strategy(Out<AnonymousMemoryStrategy> strategy_out) noexcept {
+ AnonymousMemory anon_mem;
+ Info vm_info = info();
+
+ ASMJIT_PROPAGATE(anon_mem.open(false));
+ ASMJIT_PROPAGATE(anon_mem.allocate(vm_info.page_size));
+
+ void* ptr = mmap(nullptr, vm_info.page_size, PROT_READ | PROT_EXEC, MAP_SHARED, anon_mem.fd(), 0);
+ if (ptr == MAP_FAILED) {
+ int e = errno;
+ if (e == EINVAL) {
+ *strategy_out = AnonymousMemoryStrategy::kTmpDir;
+ return Error::kOk;
+ }
+ return make_error(asmjit_error_from_errno(e));
+ }
+ else {
+ munmap(ptr, vm_info.page_size);
+ *strategy_out = AnonymousMemoryStrategy::kDevShm;
+ return Error::kOk;
+ }
+}
+#endif
+
+static Error get_anonymous_memory_strategy(AnonymousMemoryStrategy* strategy_out) noexcept {
+#if ASMJIT_VM_SHM_DETECT
+ // Initially don't assume anything. It has to be tested whether '/dev/shm' was mounted with 'noexec' flag or not.
+ static std::atomic<uint32_t> cached_strategy;
+
+ AnonymousMemoryStrategy strategy = static_cast<AnonymousMemoryStrategy>(cached_strategy.load());
+ if (strategy == AnonymousMemoryStrategy::kUnknown) {
+ ASMJIT_PROPAGATE(detect_anonymous_memory_strategy(Out(strategy)));
+ cached_strategy.store(static_cast<uint32_t>(strategy));
+ }
+
+ *strategy_out = strategy;
+ return Error::kOk;
+#else
+ *strategy_out = AnonymousMemoryStrategy::kTmpDir;
+ return Error::kOk;
+#endif
+}
+
+#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD
+
+// Virtual Memory [Posix] - Hardened Runtime & MAP_JIT
+// ===================================================
+
+// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags
+// cannot be normally allocated. On OSX + AArch64 such allocation requires MAP_JIT flag, other platforms don't
+// support this combination.
+static bool has_hardened_runtime() noexcept {
+#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64
+ // OSX on AArch64 has always hardened runtime enabled.
+ return true;
+#else
+ static std::atomic<uint32_t> cached_hardened_flag;
+
+ constexpr uint32_t hf_unknown = 0;
+ constexpr uint32_t hf_disabled = 1;
+ constexpr uint32_t hf_enabled = 2;
+
+ uint32_t flag = cached_hardened_flag.load();
+ if (flag == hf_unknown) {
+ size_t page_size = size_t(::getpagesize());
+ void* ptr = mmap(nullptr, page_size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+ if (ptr == MAP_FAILED) {
+ flag = hf_enabled;
+ }
+ else {
+ flag = hf_disabled;
+ munmap(ptr, page_size);
+ }
+
+ cached_hardened_flag.store(flag);
+ }
+
+ return flag == hf_enabled;
+#endif
+}
+
+// Detects whether MAP_JIT is available.
+static inline bool has_mapjit_support() noexcept {
+#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_X86 == 0
+ // Apple platforms always use hardened runtime + MAP_JIT on non-x86 hardware:
+ // - https://developer.apple.com/documentation/apple_silicon/porting_just-in-time_compilers_to_apple_silicon
+ return true;
+#elif defined(__APPLE__) && TARGET_OS_OSX
+ // MAP_JIT flag required to run unsigned JIT code is only supported by kernel version 10.14+ (Mojave).
+ static std::atomic<uint32_t> cached_mapjit_support;
+ uint32_t val = cached_mapjit_support.load();
+
+ if (val == 0u) {
+ KernelVersion ver = get_kernel_version();
+ val = uint32_t(ver.ge(18, 0)) + 1u;
+ cached_mapjit_support.store(val);
+ }
+
+ return val == 2u;
+#else
+ // MAP_JIT is not available (it's only available on OSX).
+ return false;
+#endif
+}
+
+// Returns either MAP_JIT or 0 based on `memory_flags` and the host operating system.
+static inline int mm_mapjit_from_memory_flags(MemoryFlags memory_flags) noexcept {
+#if defined(__APPLE__)
+ // Always use MAP_JIT flag if user asked for it (could be used for testing on non-hardened processes) and detect
+ // whether it must be used when the process is actually hardened (in that case it doesn't make sense to rely on
+ // user `memory_flags`).
+ //
+ // MAP_JIT is not required when dual-mapping memory and is incompatible with MAP_SHARED, so it will not be
+ // added when the latter is enabled.
+ bool use_mapjit = (Support::test(memory_flags, MemoryFlags::kMMapEnableMapJit) || has_hardened_runtime()) &&
+ !Support::test(memory_flags, MemoryFlags::kMapShared);
+ if (use_mapjit) {
+ return has_mapjit_support() ? int(MAP_JIT) : 0;
+ }
+ else {
+ return 0;
+ }
+#else
+ Support::maybe_unused(memory_flags);
+ return 0;
+#endif
+}
+
+static inline bool has_dual_mapping_support() noexcept {
+#if defined(ASMJIT_NO_DUAL_MAPPING)
+ return false;
+#else
+ return true;
+#endif
+}
+
+static HardenedRuntimeFlags get_hardened_runtime_flags() noexcept {
+ HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone;
+
+ if (has_hardened_runtime()) {
+ flags |= HardenedRuntimeFlags::kEnabled;
+ }
+
+ if (has_mapjit_support()) {
+ flags |= HardenedRuntimeFlags::kMapJit;
+ }
+
+ if (has_dual_mapping_support()) {
+ flags |= HardenedRuntimeFlags::kDualMapping;
+ }
+
+ return flags;
+}
+
+static Error map_memory(void** p, size_t size, MemoryFlags memory_flags, int fd = -1, off_t offset = 0) noexcept {
+ *p = nullptr;
+
+ if (size == 0) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ int protection = mm_prot_from_memory_flags(memory_flags) | mm_max_prot_from_memory_flags(memory_flags);
+ int mm_flags = mm_mapjit_from_memory_flags(memory_flags);
+
+ mm_flags |= Support::test(memory_flags, MemoryFlags::kMapShared) ? MAP_SHARED : MAP_PRIVATE;
+ if (fd == -1) {
+ mm_flags |= MAP_ANONYMOUS;
+ }
+
+ bool use_large_pages = Support::test(memory_flags, VirtMem::MemoryFlags::kMMapLargePages);
+
+ if (use_large_pages) {
+#if defined(__linux__)
+ size_t lp_size = large_page_size();
+ if (lp_size == 0) {
+ return make_error(Error::kFeatureNotEnabled);
+ }
+
+ if (!Support::is_aligned(size, lp_size)) {
+ return make_error(Error::kInvalidArgument);
+ }
+
+ unsigned lp_size_log2 = Support::ctz(lp_size);
+ mm_flags |= int(unsigned(MAP_HUGETLB) | (lp_size_log2 << MAP_HUGE_SHIFT));
+#else
+ return make_error(Error::kFeatureNotEnabled);
+#endif // __linux__
+ }
+
+ void* ptr = mmap(nullptr, size, protection, mm_flags, fd, offset);
+ if (ptr == MAP_FAILED) {
+ return make_error(asmjit_error_from_errno(errno));
+ }
+
+#if defined(MADV_HUGEPAGE)
+ if (use_large_pages) {
+ madvise(ptr, size, MADV_HUGEPAGE);
+ }
+#endif
+
+ *p = ptr;
+ return Error::kOk;
+}
+
+static Error unmap_memory(void* p, size_t size) noexcept {
+ if (ASMJIT_UNLIKELY(munmap(p, size) != 0)) {
+ return make_error(asmjit_error_from_errno(errno));
+ }
+
+ return Error::kOk;
+}
+
+Error alloc(void** p, size_t size, MemoryFlags memory_flags) noexcept {
+ return map_memory(p, size, memory_flags);
+}
+
+Error release(void* p, size_t size) noexcept {
+ return unmap_memory(p, size);
+}
+
+Error protect(void* p, size_t size, MemoryFlags memory_flags) noexcept {
+ int protection = mm_prot_from_memory_flags(memory_flags);
+ if (mprotect(p, size, protection) == 0) {
+ return Error::kOk;
+ }
+ return make_error(asmjit_error_from_errno(errno));
+}
+
+// Virtual Memory [Posix] - Dual Mapping
+// =====================================
+
+#if !defined(ASMJIT_NO_DUAL_MAPPING)
+static Error unmap_dual_mapping(DualMapping& dm, size_t size) noexcept {
+ Error err1 = unmap_memory(dm.rx, size);
+ Error err2 = Error::kOk;
+
+ if (dm.rx != dm.rw) {
+ err2 = unmap_memory(dm.rw, size);
+ }
+
+ // We can report only one error, so report the first...
+ if (err1 != Error::kOk || err2 != Error::kOk) {
+ return make_error(err1 != Error::kOk ? err1 : err2);
+ }
+
+ dm.rx = nullptr;
+ dm.rw = nullptr;
+ return Error::kOk;
+}
+#endif // !ASMJIT_NO_DUAL_MAPPING
+
+#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
+static Error alloc_dual_mapping_via_remapdup(Out<DualMapping> dm_out, size_t size, MemoryFlags memory_flags) noexcept {
+ MemoryFlags max_access_flags = regular_access_flags_to_max_access_flags(memory_flags);
+ MemoryFlags final_flags = memory_flags | max_access_flags | MemoryFlags::kMapShared;
+
+ MemoryFlags rx_flags = final_flags & ~(MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite);
+ MemoryFlags rw_flags = final_flags & ~(MemoryFlags::kAccessExecute);
+
+ // Allocate RW mapping.
+ DualMapping dm {};
+ ASMJIT_PROPAGATE(map_memory(&dm.rw, size, rw_flags));
+
+ // Allocate RX mapping.
+ dm.rx = mremap(dm.rw, size, nullptr, size, MAP_REMAPDUP);
+ if (dm.rx == MAP_FAILED) {
+ int e = errno;
+ munmap(dm.rw, size);
+ return make_error(asmjit_error_from_errno(e));
+ }
+
+ if (mprotect(dm.rx, size, mm_prot_from_memory_flags(rx_flags)) != 0) {
+ int e = errno;
+ unmap_dual_mapping(dm, size);
+ return make_error(asmjit_error_from_errno(e));
+ }
+
+ *dm_out = dm;
+ return Error::kOk;
+}
+#endif
+
+#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
+static Error asmjit_error_from_kern_result(kern_return_t result) noexcept {
+ switch (result) {
+ case KERN_PROTECTION_FAILURE:
+ return make_error(Error::kProtectionFailure);
+ case KERN_NO_SPACE:
+ return make_error(Error::kOutOfMemory);
+ case KERN_INVALID_ARGUMENT:
+ return make_error(Error::kInvalidArgument);
+ default:
+ return make_error(Error::kInvalidState);
+ }
+}
+
+static Error alloc_dual_mapping_using_mach_vm_remap(Out<DualMapping> dm_out, size_t size, MemoryFlags memory_flags) noexcept {
+ DualMapping dm {};
+ MemoryFlags mmap_flags = MemoryFlags::kAccessReadWrite | (memory_flags & MemoryFlags::kMapShared);
+
+ ASMJIT_PROPAGATE(map_memory(&dm.rx, size, mmap_flags));
+
+ vm_prot_t cur_prot;
+ vm_prot_t max_prot;
+
+ int rw_protect_flags = VM_PROT_READ | VM_PROT_WRITE;
+ int rx_protect_flags = VM_PROT_READ;
+
+ if (Support::test(memory_flags, MemoryFlags::kAccessExecute)) {
+ rx_protect_flags |= VM_PROT_EXECUTE;
+ }
+
+ kern_return_t result {};
+ do {
+ vm_map_t task = mach_task_self();
+ mach_vm_address_t remapped_addr {};
+
+#if defined(VM_FLAGS_RANDOM_ADDR)
+ int remap_flags = VM_FLAGS_ANYWHERE | VM_FLAGS_RANDOM_ADDR;
+#else
+ int remap_flags = VM_FLAGS_ANYWHERE;
+#endif
+
+ // Try to remap the existing memory into a different address.
+ result = mach_vm_remap(
+ task, // target_task
+ &remapped_addr, // target_address
+ size, // size
+ 0, // mask
+ remap_flags, // flags
+ task, // src_task
+ (mach_vm_address_t)dm.rx, // src_address
+ false, // copy
+ &cur_prot, // cur_protection
+ &max_prot, // max_protection
+ VM_INHERIT_DEFAULT); // inheritance
+
+ if (result != KERN_SUCCESS) {
+ break;
+ }
+
+ dm.rw = (void*)remapped_addr;
+
+ // Now, try to change permissions of both map regions into RW and RX. The vm_protect()
+ // API is used twice as we also want to set maximum permissions, so nobody would be
+ // allowed to change the RX region back to RW or RWX (if RWX is allowed).
+ uint32_t i;
+ for (i = 0; i < 2; i++) {
+ bool set_maximum = (i == 0);
+
+ result = vm_protect(
+ task, // target_task
+ (vm_address_t)dm.rx, // address
+ size, // size
+ set_maximum, // set_maximum
+ rx_protect_flags); // new_protection
+
+ if (result != KERN_SUCCESS) {
+ break;
+ }
+
+ result = vm_protect(task, // target_task
+ (vm_address_t)dm.rw, // address
+ size, // size
+ set_maximum, // set_maximum
+ rw_protect_flags); // new_protection
+
+ if (result != KERN_SUCCESS) {
+ break;
+ }
+ }
+ } while (0);
+
+ if (result != KERN_SUCCESS) {
+ unmap_dual_mapping(dm, size);
+ return make_error(asmjit_error_from_kern_result(result));
+ }
+
+ *dm_out = dm;
+ return Error::kOk;
+}
+#endif // ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP
+
+#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
+static Error alloc_dual_mapping_using_file(Out<DualMapping> dm, size_t size, MemoryFlags memory_flags) noexcept {
+ bool prefer_tmp_over_dev_shm = Support::test(memory_flags, MemoryFlags::kMappingPreferTmp);
+ if (!prefer_tmp_over_dev_shm) {
+ AnonymousMemoryStrategy strategy;
+ ASMJIT_PROPAGATE(get_anonymous_memory_strategy(&strategy));
+ prefer_tmp_over_dev_shm = (strategy == AnonymousMemoryStrategy::kTmpDir);
+ }
+
+ AnonymousMemory anon_mem;
+ ASMJIT_PROPAGATE(anon_mem.open(prefer_tmp_over_dev_shm));
+ ASMJIT_PROPAGATE(anon_mem.allocate(size));
+
+ void* ptr[2];
+ for (uint32_t i = 0; i < 2; i++) {
+ MemoryFlags restricted_memory_flags = memory_flags & ~dual_mapping_filter[i];
+ Error err = map_memory(&ptr[i], size, restricted_memory_flags | MemoryFlags::kMapShared, anon_mem.fd(), 0);
+ if (err != Error::kOk) {
+ if (i == 1) {
+ unmap_memory(ptr[0], size);
+ }
+ return err;
+ }
+ }
+
+ dm->rx = ptr[0];
+ dm->rw = ptr[1];
+ return Error::kOk;
+}
+#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD
+
+Error alloc_dual_mapping(Out<DualMapping> dm, size_t size, MemoryFlags memory_flags) noexcept {
+ dm = DualMapping{};
+
+#if defined(ASMJIT_NO_DUAL_MAPPING)
+ Support::maybe_unused(size, memory_flags);
+ return make_error(Error::kFeatureNotEnabled);
+#else
+ if (off_t(size) <= 0) {
+ return make_error(size == 0 ? Error::kInvalidArgument : Error::kTooLarge);
+ }
+
+#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
+ return alloc_dual_mapping_via_remapdup(dm, size, memory_flags);
+#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
+ return alloc_dual_mapping_using_mach_vm_remap(dm, size, memory_flags);
+#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
+ return alloc_dual_mapping_using_file(dm, size, memory_flags);
+#else
+ #error "[asmjit] VirtMem::alloc_dual_mapping() doesn't have implementation for the target OS or architecture"
+#endif
+#endif // ASMJIT_NO_DUAL_MAPPING
+}
+
+Error release_dual_mapping(DualMapping& dm, size_t size) noexcept {
+#if defined(ASMJIT_NO_DUAL_MAPPING)
+ Support::maybe_unused(dm, size);
+ return make_error(Error::kFeatureNotEnabled);
+#else
+ return unmap_dual_mapping(dm, size);
+#endif // ASMJIT_NO_DUAL_MAPPING
+}
+#endif
+
+// Virtual Memory - Flush Instruction Cache
+// ========================================
+
+void flush_instruction_cache(void* p, size_t size) noexcept {
+#if ASMJIT_ARCH_X86 || defined(__EMSCRIPTEN__)
+ // X86|X86_64 architecture doesn't require to do anything to flush instruction cache.
+ Support::maybe_unused(p, size);
+#elif defined(__APPLE__)
+ sys_icache_invalidate(p, size);
+#elif defined(_WIN32)
+ // Windows has a built-in support in `kernel32.dll`.
+ FlushInstructionCache(GetCurrentProcess(), p, size);
+#elif defined(__GNUC__)
+ char* start = static_cast<char*>(p);
+ char* end = start + size;
+ __builtin___clear_cache(start, end);
+#else
+ #pragma message("[asmjit] VirtMem::flush_instruction_cache() doesn't have implementation for the target OS and compiler")
+ Support::maybe_unused(p, size);
+#endif
+}
+
+// Virtual Memory - Memory Info
+// ============================
+
+Info info() noexcept {
+ static std::atomic<uint32_t> vm_info_initialized;
+ static Info vm_info;
+
+ if (!vm_info_initialized.load()) {
+ Info local_mem_info;
+ detect_vm_info(local_mem_info);
+
+ vm_info = local_mem_info;
+ vm_info_initialized.store(1u);
+ }
+
+ return vm_info;
+}
+
+size_t large_page_size() noexcept {
+ static std::atomic<size_t> large_page_size;
+ static constexpr size_t not_available = 1;
+
+ size_t size = large_page_size.load();
+ if (ASMJIT_LIKELY(size > not_available)) {
+ return size;
+ }
+
+ if (size == not_available) {
+ return 0;
+ }
+
+ size = detect_large_page_size();
+ large_page_size.store(size != 0 ? size : not_available);
+ return size;
+}
+
+// Virtual Memory - Hardened Runtime Info
+// ======================================
+
+HardenedRuntimeInfo hardened_runtime_info() noexcept {
+ return HardenedRuntimeInfo { get_hardened_runtime_flags() };
+}
+
+// Virtual Memory - Project JIT Memory
+// ===================================
+
+void protect_jit_memory(ProtectJitAccess access) noexcept {
+#if defined(ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP)
+ pthread_jit_write_protect_np(static_cast<int>(access));
+#else
+ Support::maybe_unused(access);
+#endif
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+// Virtual Memory - Tests
+// ======================
+
+#if defined(ASMJIT_TEST)
+ASMJIT_BEGIN_NAMESPACE
+
+UNIT(virt_mem) {
+ VirtMem::Info vm_info = VirtMem::info();
+
+ INFO("VirtMem::info():");
+ INFO(" page_size: %zu", size_t(vm_info.page_size));
+ INFO(" page_granularity: %zu", size_t(vm_info.page_granularity));
+
+ INFO("VirtMem::large_page_size():");
+ INFO(" large_page_size: %zu", size_t(VirtMem::large_page_size()));
+
+ VirtMem::HardenedRuntimeInfo hardened_rt_info = VirtMem::hardened_runtime_info();
+ VirtMem::HardenedRuntimeFlags hardened_rt_flags = hardened_rt_info.flags;
+
+ INFO("VirtMem::hardened_runtime_info():");
+ INFO(" flags:");
+ INFO(" kEnabled: %s" , Support::test(hardened_rt_flags, VirtMem::HardenedRuntimeFlags::kEnabled ) ? "true" : "false");
+ INFO(" kMapJit: %s" , Support::test(hardened_rt_flags, VirtMem::HardenedRuntimeFlags::kMapJit ) ? "true" : "false");
+ INFO(" kDualMapping: %s", Support::test(hardened_rt_flags, VirtMem::HardenedRuntimeFlags::kDualMapping) ? "true" : "false");
+}
+
+ASMJIT_END_NAMESPACE
+#endif // ASMJIT_TEST
+
+#endif // !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/src/asmjit/core/virtmem.h b/3rdparty/asmjit/asmjit/core/virtmem.h
index 17996dcb07e..c872bf89c83 100644
--- a/3rdparty/asmjit/src/asmjit/core/virtmem.h
+++ b/3rdparty/asmjit/asmjit/core/virtmem.h
@@ -1,16 +1,16 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_CORE_VIRTMEM_H_INCLUDED
#define ASMJIT_CORE_VIRTMEM_H_INCLUDED
-#include "../core/api-config.h"
+#include <asmjit/core/api-config.h>
#ifndef ASMJIT_NO_JIT
-#include "../core/globals.h"
-#include "../core/support.h"
+#include <asmjit/core/globals.h>
+#include <asmjit/support/support.h>
ASMJIT_BEGIN_NAMESPACE
@@ -39,17 +39,18 @@ enum class CachePolicy : uint32_t {
//!
//! Only useful on non-x86 architectures, however, it's a good practice to call it on any platform to make your
//! code more portable.
-ASMJIT_API void flushInstructionCache(void* p, size_t size) noexcept;
+ASMJIT_API void flush_instruction_cache(void* p, size_t size) noexcept;
//! Virtual memory information.
struct Info {
//! Virtual memory page size.
- uint32_t pageSize;
+ uint32_t page_size;
//! Virtual memory page granularity.
- uint32_t pageGranularity;
+ uint32_t page_granularity;
};
//! Returns virtual memory information, see `VirtMem::Info` for more details.
+[[nodiscard]]
ASMJIT_API Info info() noexcept;
//! Returns the size of the smallest large page supported.
@@ -59,7 +60,8 @@ ASMJIT_API Info info() noexcept;
//!
//! Returns either the detected large page size or 0, if large page support is either not supported by AsmJit
//! or not accessible to the process.
-ASMJIT_API size_t largePageSize() noexcept;
+[[nodiscard]]
+ASMJIT_API size_t large_page_size() noexcept;
//! Virtual memory access and mmap-specific flags.
enum class MemoryFlags : uint32_t {
@@ -101,8 +103,8 @@ enum class MemoryFlags : uint32_t {
//! This flag allows to set a "maximum access" that the memory page can get during its lifetime. Use
//! \ref VirtMem::protect() to change the access flags.
//!
- //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::allocDualMapping().
- //! However \ref VirtMem::allocDualMapping() may automatically use this if \ref kAccessRead is used.
+ //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::alloc_dual_mapping().
+ //! However \ref VirtMem::alloc_dual_mapping() may automatically use this if \ref kAccessRead is used.
kMMapMaxAccessRead = 0x00000020u,
//! Pass `PROT_MAX(PROT_WRITE)` or `PROT_MPROTECT(PROT_WRITE)` to `mmap()` on platforms that support it.
@@ -110,8 +112,8 @@ enum class MemoryFlags : uint32_t {
//! This flag allows to set a "maximum access" that the memory page can get during its lifetime. Use
//! \ref VirtMem::protect() to change the access flags.
//!
- //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::allocDualMapping().
- //! However \ref VirtMem::allocDualMapping() may automatically use this if \ref kAccessWrite is used.
+ //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::alloc_dual_mapping().
+ //! However \ref VirtMem::alloc_dual_mapping() may automatically use this if \ref kAccessWrite is used.
kMMapMaxAccessWrite = 0x00000040u,
//! Pass `PROT_MAX(PROT_EXEC)` or `PROT_MPROTECT(PROT_EXEC)` to `mmap()` on platforms that support it.
@@ -119,8 +121,8 @@ enum class MemoryFlags : uint32_t {
//! This flag allows to set a "maximum access" that the memory page can get during its lifetime. Use
//! \ref VirtMem::protect() to change the access flags.
//!
- //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::allocDualMapping().
- //! However \ref VirtMem::allocDualMapping() may automatically use this if \ref kAccessExecute is used.
+ //! \note This flag can only be used with \ref VirtMem::alloc() and \ref VirtMem::alloc_dual_mapping().
+ //! However \ref VirtMem::alloc_dual_mapping() may automatically use this if \ref kAccessExecute is used.
kMMapMaxAccessExecute = 0x00000080u,
//! A combination of \ref kMMapMaxAccessRead and \ref kMMapMaxAccessWrite.
@@ -149,7 +151,7 @@ enum class MemoryFlags : uint32_t {
//! additional mechanism to allocate regular page(s) when large page(s) allocation fails.
kMMapLargePages = 0x00000200u,
- //! Not an access flag, only used by `allocDualMapping()` to override the default allocation strategy to always use
+ //! Not an access flag, only used by `alloc_dual_mapping()` to override the default allocation strategy to always use
//! a 'tmp' directory instead of "/dev/shm" (on POSIX platforms). Please note that this flag will be ignored if the
//! operating system allows to allocate an executable memory by a different API than `open()` or `shm_open()`. For
//! example on Linux `memfd_create()` is preferred and on BSDs `shm_open(SHM_ANON, ...)` is used if SHM_ANON is
@@ -164,19 +166,22 @@ ASMJIT_DEFINE_ENUM_FLAGS(MemoryFlags)
//!
//! \note `size` should be aligned to page size, use \ref VirtMem::info() to obtain it. Invalid size will not be
//! corrected by the implementation and the allocation would not succeed in such case.
+[[nodiscard]]
ASMJIT_API Error alloc(void** p, size_t size, MemoryFlags flags) noexcept;
//! Releases virtual memory previously allocated by \ref VirtMem::alloc().
//!
//! \note The size must be the same as used by \ref VirtMem::alloc(). If the size is not the same value the call
//! will fail on any POSIX system, but pass on Windows, because it's implemented differently.
+[[nodiscard]]
ASMJIT_API Error release(void* p, size_t size) noexcept;
//! A cross-platform wrapper around `mprotect()` (POSIX) and `VirtualProtect()` (Windows).
+[[nodiscard]]
ASMJIT_API Error protect(void* p, size_t size, MemoryFlags flags) noexcept;
//! Dual memory mapping used to map an anonymous memory into two memory regions where one region is read-only, but
-//! executable, and the second region is read+write, but not executable. See \ref VirtMem::allocDualMapping() for
+//! executable, and the second region is read+write, but not executable. See \ref VirtMem::alloc_dual_mapping() for
//! more details.
struct DualMapping {
//! Pointer to data with 'Read+Execute' access (this memory is not writable).
@@ -191,16 +196,18 @@ struct DualMapping {
//! self-modifying code.
//!
//! The memory returned in the `dm` are two independent mappings of the same shared memory region. You must use
-//! \ref VirtMem::releaseDualMapping() to release it when it's no longer needed. Never use `VirtMem::release()` to
-//! release the memory returned by `allocDualMapping()` as that would fail on Windows.
+//! \ref VirtMem::release_dual_mapping() to release it when it's no longer needed. Never use `VirtMem::release()` to
+//! release the memory returned by `alloc_dual_mapping()` as that would fail on Windows.
//!
//! \remarks Both pointers in `dm` would be set to `nullptr` if the function fails.
-ASMJIT_API Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags flags) noexcept;
+[[nodiscard]]
+ASMJIT_API Error alloc_dual_mapping(Out<DualMapping> dm, size_t size, MemoryFlags flags) noexcept;
-//! Releases virtual memory mapping previously allocated by \ref VirtMem::allocDualMapping().
+//! Releases virtual memory mapping previously allocated by \ref VirtMem::alloc_dual_mapping().
//!
//! \remarks Both pointers in `dm` would be set to `nullptr` if the function succeeds.
-ASMJIT_API Error releaseDualMapping(DualMapping* dm, size_t size) noexcept;
+[[nodiscard]]
+ASMJIT_API Error release_dual_mapping(DualMapping& dm, size_t size) noexcept;
//! Hardened runtime flags.
enum class HardenedRuntimeFlags : uint32_t {
@@ -238,15 +245,17 @@ struct HardenedRuntimeInfo {
//! \{
//! Tests whether the hardened runtime `flag` is set.
- ASMJIT_INLINE_NODEBUG bool hasFlag(HardenedRuntimeFlags flag) const noexcept { return Support::test(flags, flag); }
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(HardenedRuntimeFlags flag) const noexcept { return Support::test(flags, flag); }
//! \}
};
//! Returns runtime features provided by the OS.
-ASMJIT_API HardenedRuntimeInfo hardenedRuntimeInfo() noexcept;
+[[nodiscard]]
+ASMJIT_API HardenedRuntimeInfo hardened_runtime_info() noexcept;
-//! Values that can be used with `protectJitMemory()` function.
+//! Values that can be used with `protect_jit_memory()` function.
enum class ProtectJitAccess : uint32_t {
//! Protect JIT memory with Read+Write permissions.
kReadWrite = 0,
@@ -262,22 +271,22 @@ enum class ProtectJitAccess : uint32_t {
//! This function must be called before and after a memory mapped with MAP_JIT flag is modified. Example:
//!
//! ```
-//! void* codePtr = ...;
-//! size_t codeSize = ...;
+//! void* code_ptr = ...;
+//! size_t code_size = ...;
//!
-//! VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite);
-//! memcpy(codePtr, source, codeSize);
-//! VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute);
-//! VirtMem::flushInstructionCache(codePtr, codeSize);
+//! VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadWrite);
+//! memcpy(code_ptr, source, code_size);
+//! VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadExecute);
+//! VirtMem::flush_instruction_cache(code_ptr, code_size);
//! ```
//!
//! See \ref ProtectJitReadWriteScope, which makes it simpler than the code above.
-ASMJIT_API void protectJitMemory(ProtectJitAccess access) noexcept;
+ASMJIT_API void protect_jit_memory(ProtectJitAccess access) noexcept;
//! JIT protection scope that prepares the given memory block to be written to in the current thread.
//!
-//! It calls `VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite)` at construction time and
-//! `VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute)` combined with `flushInstructionCache()`
+//! It calls `VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadWrite)` at construction time and
+//! `VirtMem::protect_jit_memory(VirtMem::ProtectJitAccess::kReadExecute)` combined with `flush_instruction_cache()`
//! in destructor. The purpose of this class is to make writing to JIT memory easier.
class ProtectJitReadWriteScope {
public:
@@ -286,7 +295,7 @@ public:
//! \name Members
//! \{
- void* _rxPtr;
+ void* _rx_ptr;
size_t _size;
CachePolicy _policy;
@@ -296,22 +305,24 @@ public:
//! \{
//! Makes the given memory block RW protected.
- ASMJIT_FORCE_INLINE ProtectJitReadWriteScope(
- void* rxPtr,
+ ASMJIT_INLINE ProtectJitReadWriteScope(
+ void* rx_ptr,
size_t size,
- CachePolicy policy = CachePolicy::kDefault) noexcept
- : _rxPtr(rxPtr),
+ CachePolicy policy = CachePolicy::kDefault
+ ) noexcept
+ : _rx_ptr(rx_ptr),
_size(size),
_policy(policy) {
- protectJitMemory(ProtectJitAccess::kReadWrite);
+ protect_jit_memory(ProtectJitAccess::kReadWrite);
}
//! Makes the memory block RX protected again and flushes instruction cache.
- ASMJIT_FORCE_INLINE ~ProtectJitReadWriteScope() noexcept {
- protectJitMemory(ProtectJitAccess::kReadExecute);
+ ASMJIT_INLINE ~ProtectJitReadWriteScope() noexcept {
+ protect_jit_memory(ProtectJitAccess::kReadExecute);
- if (_policy != CachePolicy::kNeverFlush)
- flushInstructionCache(_rxPtr, _size);
+ if (_policy != CachePolicy::kNeverFlush) {
+ flush_instruction_cache(_rx_ptr, _size);
+ }
}
//! \}
diff --git a/3rdparty/asmjit/asmjit/host.h b/3rdparty/asmjit/asmjit/host.h
new file mode 100644
index 00000000000..36019795340
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/host.h
@@ -0,0 +1,33 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_HOST_H_INCLUDED
+#define ASMJIT_HOST_H_INCLUDED
+
+#include <asmjit/core.h>
+
+// Detect 'X86' or 'X86_64' host architectures.
+#if ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86)
+
+#include <asmjit/x86.h>
+
+ASMJIT_BEGIN_NAMESPACE
+namespace host { using namespace x86; }
+ASMJIT_END_NAMESPACE
+
+#endif
+
+// Detect 'AArch64' host architecture.
+#if ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)
+
+#include <asmjit/a64.h>
+
+ASMJIT_BEGIN_NAMESPACE
+namespace host { using namespace a64; }
+ASMJIT_END_NAMESPACE
+
+#endif
+
+#endif // ASMJIT_HOST_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arena.cpp b/3rdparty/asmjit/asmjit/support/arena.cpp
new file mode 100644
index 00000000000..c9329cc6bdf
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arena.cpp
@@ -0,0 +1,515 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// Arena - Globals
+// ===============
+
+// Overhead of block alignment (we want to achieve at least Arena::kAlignment).
+static constexpr size_t kArenaAlignmentOverhead =
+ (Arena::kAlignment <= Globals::kAllocAlignment)
+ ? size_t(0)
+ : Arena::kAlignment - Globals::kAllocAlignment;
+
+// Zero size block used by `Arena` that doesn't have any memory allocated. Should be allocated in read-only memory,
+// which would prevent it from being modified.
+static const Arena::ManagedBlock _arena_zero_block {};
+
+static ASMJIT_INLINE Arena::ManagedBlock* Arena_get_zero_block() noexcept {
+ return const_cast<Arena::ManagedBlock*>(&_arena_zero_block);
+}
+
+static ASMJIT_INLINE void* Arena_malloc(size_t size) noexcept {
+ return ::malloc(size);
+}
+
+static ASMJIT_INLINE void Arena_free(void* ptr) noexcept {
+ ::free(ptr);
+}
+
+static ASMJIT_INLINE void Arena_assign_block(Arena& arena, Arena::ManagedBlock* block) noexcept {
+ arena._ptr = Support::align_up(block->data(), Arena::kAlignment);
+ arena._end = block->end();
+ arena._current_block = block;
+ ASMJIT_ASSERT(arena._ptr <= arena._end);
+}
+
+// This is only used in debug mode to verify that the Arena is used properly.
+[[maybe_unused]]
+static bool Arena_has_dynamic_block(Arena& arena, Arena::DynamicBlock* block) noexcept {
+ Arena::DynamicBlock* current = arena._dynamic_blocks;
+ while (current) {
+ if (current == block) {
+ return true;
+ }
+ current = current->next;
+ }
+ return false;
+}
+
+// Arena - Initialization & Reset
+// ==============================
+
+void Arena::_init(size_t min_block_size, Span<uint8_t> static_arena_memory) noexcept {
+ ASMJIT_ASSERT(min_block_size >= kMinManagedBlockSize);
+ ASMJIT_ASSERT(min_block_size <= kMaxManagedBlockSize);
+
+ ManagedBlock* block = Arena_get_zero_block();
+ size_t block_size_shift = Support::bit_size_of<size_t> - Support::clz(min_block_size);
+
+ _current_block_size_shift = uint8_t(block_size_shift);
+ _min_block_size_shift = uint8_t(block_size_shift);
+ _max_block_size_shift = uint8_t(26); // (1 << 26) Equals 64 MiB blocks.
+ _has_static_block = uint8_t(static_arena_memory.size() != 0u);
+ _unused_byte_count = 0u;
+
+ // Setup the first [temporary] block, if necessary.
+ if (static_arena_memory.size()) {
+ block = reinterpret_cast<ManagedBlock*>(static_arena_memory.data());
+ block->next = nullptr;
+
+ ASMJIT_ASSERT(static_arena_memory.size() >= sizeof(ManagedBlock));
+ block->size = static_arena_memory.size() - sizeof(ManagedBlock);
+ }
+
+ _first_block = block;
+ Arena_assign_block(*this, block);
+}
+
+void Arena::reset(ResetPolicy reset_policy) noexcept {
+ ManagedBlock* first = _first_block;
+
+ if (reset_policy == ResetPolicy::kHard) {
+ ManagedBlock* current = first;
+
+ if (first == &_arena_zero_block) {
+ return;
+ }
+
+ if (has_static_block()) {
+ current = current->next;
+ first->next = nullptr;
+ }
+ else {
+ first = Arena_get_zero_block();
+ _first_block = first;
+ }
+
+ if (current) {
+ do {
+ ManagedBlock* next = current->next;
+ Arena_free(current);
+ current = next;
+ } while (current);
+ }
+
+ _current_block_size_shift = _min_block_size_shift;
+ }
+
+ // Free dynamic blocks.
+ {
+ DynamicBlock* current = _dynamic_blocks;
+ while (current) {
+ DynamicBlock* next = current->next;
+ Arena_free(current);
+ current = next;
+ }
+
+ memset(_reusable_slots, 0, sizeof(_reusable_slots));
+ _dynamic_blocks = nullptr;
+ }
+
+ Arena_assign_block(*this, first);
+ _unused_byte_count = 0u;
+}
+
+// Arena - Utilities
+// =================
+
+static ASMJIT_NOINLINE void Arena_make_block_leftover_reusable(Arena& arena, uint8_t* ptr, size_t size) noexcept {
+ while (size >= Arena::kMinReusableSlotSize) {
+ size_t saved_slot {};
+ size_t saved_size {};
+
+ // We would always have a slot if we have obtained a slot `size` as `remain < size`.
+ if (!Arena::_get_reusable_slot_index(size / 2u, Out(saved_slot), Out(saved_size))) {
+ saved_slot = Arena::kReusableSlotCount - 1u;
+ saved_size = Arena::kMaxReusableSlotSize;
+ }
+
+ reinterpret_cast<Arena::ReusableSlot*>(ptr)->next = arena._reusable_slots[saved_slot];
+ arena._reusable_slots[saved_slot] = reinterpret_cast<Arena::ReusableSlot*>(ptr);
+
+ ptr += saved_size;
+ size -= saved_size;
+ }
+
+ arena._ptr = ptr;
+}
+
+// Arena - Allocation (Oneshot)
+// ============================
+
+static ASMJIT_INLINE uint32_t Arena_get_unused_block_byte_count(Arena::ManagedBlock* block, const uint8_t* ptr) noexcept {
+ return uint32_t(size_t(block->end() - ptr));
+}
+
+void* Arena::_alloc_oneshot(size_t size) noexcept {
+ // Must hold otherwise we would end up with an unaligned pointer in the Arena.
+ ASMJIT_ASSERT(Support::is_aligned(size, Arena::kAlignment));
+
+ // Total overhead per a block allocated with malloc - we want to decrease the size of each block by this value to
+ // make sure that malloc is not mmapping() additional page just to hold metadata.
+ constexpr size_t kBlockSizeOverhead = sizeof(ManagedBlock) + Globals::kAllocOverhead + kArenaAlignmentOverhead;
+
+ ManagedBlock* cur_block = _current_block;
+ ManagedBlock* next = cur_block->next;
+ uint32_t unused_byte_count = Arena_get_unused_block_byte_count(cur_block, _ptr);
+
+ // If the `Arena` has been soft-reset the current block doesn't have to be the last one. Check if there is a block
+ // that can be used instead of allocating a new one. If there is a `next` block it's completely unused, we don't
+ // have to check for remaining bytes in that case.
+ while (next) {
+ uint8_t* ptr = Support::align_up(next->data(), Arena::kAlignment);
+ uint8_t* end = next->end();
+
+ if (size <= (size_t)(end - ptr)) {
+ _current_block = next;
+ _ptr = ptr + size;
+ _end = end;
+ _unused_byte_count += unused_byte_count;
+
+ ASMJIT_ASSERT(_ptr <= _end);
+ return static_cast<void*>(ptr);
+ }
+
+ ManagedBlock* block_to_free = next;
+ cur_block->next = next;
+
+ next = next->next;
+ Arena_free(block_to_free);
+ }
+
+ // Calculates the initial size of a next block - in most cases this would be enough for the allocation. In
+ // general we want to gradually increase block size when more and more blocks are allocated until the maximum
+ // block size. Since we use shifts (aka log2(size) sizes) we just need block count and minumum/maximum block
+ // size shift to calculate the final size.
+ uint32_t block_size_shift = uint32_t(_current_block_size_shift);
+ size_t block_size = size_t(1) << block_size_shift;
+
+ // Allocate a new block. We have to accommodate all possible overheads so after the memory is allocated and
+ // then properly aligned there will be size for the requested memory. In 99.9999% cases this is never a problem,
+ // but we must be sure that even rare border cases would allocate properly.
+
+ if (ASMJIT_UNLIKELY(size > block_size - kBlockSizeOverhead)) {
+ // If the requested size is larger than a default calculated block size -> increase block size so the
+ // allocation would be enough to fit the requested size.
+ if (ASMJIT_UNLIKELY(size > SIZE_MAX - kBlockSizeOverhead)) {
+ // This would probably never happen in practice - however, it needs to be done to stop malicious cases like
+ // `alloc(SIZE_MAX)`.
+ return nullptr;
+ }
+ block_size = size + kArenaAlignmentOverhead + sizeof(ManagedBlock);
+ }
+ else {
+ block_size -= Globals::kAllocOverhead;
+ }
+
+ // Allocate new block.
+ ManagedBlock* new_block = static_cast<ManagedBlock*>(Arena_malloc(block_size));
+ if (ASMJIT_UNLIKELY(!new_block)) {
+ return nullptr;
+ }
+
+ // If this doesn't hold the whole code is broken as we would use more space than allocated due to call to align_up().
+ ASMJIT_ASSERT(Support::is_aligned(new_block, Globals::kAllocAlignment));
+
+ // block_size includes the struct size, which must be accounted when assigning size to a newly allocated block.
+ size_t real_block_size = block_size - sizeof(ManagedBlock);
+
+ new_block->next = next;
+ new_block->size = real_block_size;
+
+ if (cur_block == &_arena_zero_block) {
+ _first_block = new_block;
+ }
+ else {
+ cur_block->next = new_block;
+ }
+
+ uint8_t* ptr = Support::align_up(new_block->data(), Arena::kAlignment);
+ uint8_t* end = new_block->data() + real_block_size;
+
+ _ptr = ptr + size;
+ _end = end;
+
+ _current_block = new_block;
+ _current_block_size_shift = uint8_t(Support::min<uint32_t>(uint32_t(block_size_shift) + 1u, _max_block_size_shift));
+ _unused_byte_count += unused_byte_count;
+
+ ASMJIT_ASSERT(_ptr <= _end);
+ return static_cast<void*>(ptr);
+}
+
+void* Arena::_alloc_oneshot_zeroed(size_t size) noexcept {
+ ASMJIT_ASSERT(Support::is_aligned(size, Arena::kAlignment));
+
+ void* p = alloc_oneshot(size);
+ if (ASMJIT_UNLIKELY(!p)) {
+ return p;
+ }
+
+ return memset(p, 0, size);
+}
+
+void* Arena::dup(const void* data, size_t size, bool null_terminate) noexcept {
+ if (ASMJIT_UNLIKELY(!data || !size)) {
+ return nullptr;
+ }
+
+ ASMJIT_ASSERT(size != SIZE_MAX);
+
+ size_t alloc_size = Support::align_up(size + size_t(null_terminate), Arena::kAlignment);
+ uint8_t* m = alloc_oneshot<uint8_t>(alloc_size);
+
+ if (ASMJIT_UNLIKELY(!m)) {
+ return nullptr;
+ }
+
+ // Clear the last 8 bytes, which clears potential padding and null terminates at the same time.
+ static_assert(Arena::kAlignment == 8u, "the code below must be fixed if arena alignment has changed");
+ Support::storeu<uint64_t>(m + alloc_size - sizeof(uint64_t), 0u);
+
+ memcpy(m, data, size);
+ return static_cast<void*>(m);
+}
+
+char* Arena::sformat(const char* fmt, ...) noexcept {
+ if (ASMJIT_UNLIKELY(!fmt)) {
+ return nullptr;
+ }
+
+ char buf[512];
+ size_t size;
+ va_list ap;
+
+ va_start(ap, fmt);
+ size = unsigned(vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf) - 1, fmt, ap));
+ va_end(ap);
+
+ buf[size++] = 0;
+ return static_cast<char*>(dup(buf, size));
+}
+
+// Arena - Allocation (Reusable)
+// =============================
+
+void* Arena::_alloc_reusable(size_t size, Out<size_t> allocated_size) noexcept {
+ // Use the memory pool only if the requested block has a reasonable size.
+ size_t slot;
+ if (_get_reusable_slot_index(size, Out(slot), allocated_size)) {
+ // Slot reuse.
+ uint8_t* p = reinterpret_cast<uint8_t*>(_reusable_slots[slot]);
+ size = *allocated_size;
+
+ if (p) {
+ _reusable_slots[slot] = reinterpret_cast<ReusableSlot*>(p)->next;
+ return p;
+ }
+
+ p = _ptr;
+ size_t remaining_size = (size_t)(_end - p);
+
+ if (ASMJIT_LIKELY(remaining_size >= size)) {
+ _ptr = p + size;
+ return p;
+ }
+
+ // Distribute the remaining memory to reusable slots, if possible.
+ Arena_make_block_leftover_reusable(*this, p, remaining_size);
+
+ p = static_cast<uint8_t*>(_alloc_oneshot(size));
+ if (ASMJIT_UNLIKELY(!p)) {
+ allocated_size = 0;
+ return nullptr;
+ }
+ return p;
+ }
+ else {
+ // Allocate a dynamic block.
+ size_t dynamic_block_overhead = Support::align_up(sizeof(DynamicBlock) + sizeof(DynamicBlock*) + kArenaAlignmentOverhead, kAlignment);
+
+ // Handle a possible overflow.
+ if (ASMJIT_UNLIKELY(size >= SIZE_MAX - dynamic_block_overhead)) {
+ return nullptr;
+ }
+
+ void* p = Arena_malloc(size + dynamic_block_overhead);
+ if (ASMJIT_UNLIKELY(!p)) {
+ allocated_size = 0;
+ return nullptr;
+ }
+
+ // If this doesn't hold the whole code is broken as we would use more space than allocated due to call to align_up().
+ ASMJIT_ASSERT(Support::is_aligned(p, Globals::kAllocAlignment));
+
+ // Link as first in `_dynamic_blocks` double-linked list.
+ DynamicBlock* dynamic_block = static_cast<DynamicBlock*>(p);
+ DynamicBlock* next = _dynamic_blocks;
+
+ if (next) {
+ next->prev = dynamic_block;
+ }
+
+ dynamic_block->prev = nullptr;
+ dynamic_block->next = next;
+ _dynamic_blocks = dynamic_block;
+
+ // Align the pointer to the guaranteed alignment and store `DynamicBlock`
+ // at the beginning of the memory block, so `_release_dynamic()` can find it.
+ p = Support::align_up(static_cast<uint8_t*>(p) + sizeof(DynamicBlock) + sizeof(DynamicBlock*), kAlignment);
+ reinterpret_cast<DynamicBlock**>(p)[-1] = dynamic_block;
+
+ allocated_size = size;
+ return p;
+ }
+}
+
+void* Arena::_alloc_reusable_zeroed(size_t size, Out<size_t> allocated_size) noexcept {
+ void* p = _alloc_reusable(size, allocated_size);
+ if (ASMJIT_UNLIKELY(!p)) {
+ return p;
+ }
+ return memset(p, 0, *allocated_size);
+}
+
+void Arena::_release_dynamic(void* p, size_t size) noexcept {
+ Support::maybe_unused(size);
+
+ // Pointer to `DynamicBlock` is stored at [-1].
+ DynamicBlock* dynamic_block = reinterpret_cast<DynamicBlock**>(p)[-1];
+ ASMJIT_ASSERT(Arena_has_dynamic_block(*this, dynamic_block));
+
+ // Unlink and free.
+ DynamicBlock* prev = dynamic_block->prev;
+ DynamicBlock* next = dynamic_block->next;
+
+ if (prev) {
+ prev->next = next;
+ }
+ else {
+ _dynamic_blocks = next;
+ }
+
+ if (next) {
+ next->prev = prev;
+ }
+
+ Arena_free(dynamic_block);
+}
+
+// Arena - Statistics
+// ==================
+
+ArenaStatistics Arena::statistics() const noexcept {
+ const ManagedBlock* block = _first_block;
+ size_t block_count = 0u;
+ size_t used_size = 0u;
+ size_t reserved_size = 0u;
+
+ while (block) {
+ if (_ptr >= block->data() && _ptr <= block->end()) {
+ size_t offset = size_t(_ptr - block->data());
+ used_size = reserved_size + offset;
+ }
+
+ block_count++;
+ reserved_size += block->size;
+
+ block = block->next;
+ }
+
+ ArenaStatistics stats {};
+ stats._block_count = block_count;
+ stats._used_size = used_size;
+ stats._reserved_size = reserved_size;
+ stats._overhead_size = _unused_byte_count;
+ return stats;
+}
+
+// Arena - Tests
+// =============
+
+#if defined(ASMJIT_TEST)
+UNIT(arena_oneshot) {
+ struct SomeData {
+ size_t _x;
+ size_t _y;
+
+ inline SomeData(size_t x, size_t y) noexcept
+ : _x(x), _y(y) {}
+ };
+
+ constexpr size_t kN = 100000u;
+
+ {
+ Arena arena(1024u * 4u);
+
+ for (size_t r = 0; r < 3u; r++) {
+ for (size_t i = 0; i < kN; i++) {
+ uint8_t* p = arena.alloc_oneshot<uint8_t>(32);
+ EXPECT_NOT_NULL(p);
+ }
+
+ ArenaStatistics stats = arena.statistics();
+ EXPECT_GE(stats.block_count(), 2u);
+ EXPECT_GE(stats.used_size(), kN * 32u);
+ EXPECT_GE(stats.reserved_size(), kN * 32u);
+ EXPECT_GE(stats.reserved_size(), stats.used_size());
+ arena.reset(r == 0 ? ResetPolicy::kSoft : ResetPolicy::kHard);
+ }
+ }
+
+ {
+ Arena arena(1024u * 4u);
+
+ for (size_t r = 0; r < 3u; r++) {
+ for (size_t i = 0; i < kN; i++) {
+ SomeData* p = arena.new_oneshot<SomeData>(r, i);
+ EXPECT_NOT_NULL(p);
+ }
+ arena.reset(r == 0 ? ResetPolicy::kSoft : ResetPolicy::kHard);
+ }
+ }
+}
+
+UNIT(arena_reusable_slots_check) {
+ constexpr size_t kMinReusableSlotSize = Arena::kMinReusableSlotSize;
+ constexpr size_t kMaxReusableSlotSize = Arena::kMaxReusableSlotSize;
+
+ size_t expected_slot = 0;
+ size_t expected_until = kMinReusableSlotSize;
+
+ for (size_t size = 1; size <= kMaxReusableSlotSize; size++) {
+ size_t acquired_slot;
+
+ EXPECT_TRUE(Arena::_get_reusable_slot_index(size, Out(acquired_slot)));
+ EXPECT_EQ(acquired_slot, expected_slot);
+ EXPECT_LT(acquired_slot, Arena::kReusableSlotCount);
+
+ if (size == expected_until) {
+ expected_slot++;
+ expected_until *= 2;
+ }
+ }
+}
+#endif // ASMJIT_TEST
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/arena.h b/3rdparty/asmjit/asmjit/support/arena.h
new file mode 100644
index 00000000000..ec4a63a645a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arena.h
@@ -0,0 +1,498 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENA_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENA_H_INCLUDED
+
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! Arena allocation statistics.
+struct ArenaStatistics {
+ //! \name Members
+ //! \{
+
+ //! Number of blocks maintained.
+ //!
+ //! A block is a bigger chunk of memory that is used by \ref Arena.
+ size_t _block_count;
+ //! Number of bytes allocated and in use.
+ size_t _used_size;
+ //! Number of bytes reserved.
+ size_t _reserved_size;
+ //! Overhead describes
+ size_t _overhead_size;
+ //! Number of bytes pooled by \ref Arena reusable pools and eventually \ref ArenaPool if aggregated.
+ size_t _pooled_size;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the number of blocks maintained by \ref Arena (or multiple Arenas if aggregated).
+ ASMJIT_INLINE_NODEBUG size_t block_count() const noexcept { return _block_count; }
+
+ //! Returns the number or bytes used by \ref Arena (or multiple Arenas if aggregated).
+ //!
+ //! Used bytes represent the number of bytes successfully allocated by \ref Arena regardless of how these bytes
+ //! are actually used. For example if \ref Arena is used with \ref ArenaPool, the number of used bytes pooled
+ //! by \ref ArenaPool is included in used_size, because it was already returned by \ref Arena.
+ ASMJIT_INLINE_NODEBUG size_t used_size() const noexcept { return _used_size; }
+
+ //! Returns the number of bytes reserved by \ref Arena (or multiple Arenas if aggregated).
+ ASMJIT_INLINE_NODEBUG size_t reserved_size() const noexcept { return _reserved_size; }
+
+ //! Returns the number of bytes that were allocated, but couldn't be used by allocations because of size
+ //! requests, alignment, or other reasons. The overhead should be relatively small with \ref Arena, but still
+ //! can be used to find pathological cases if they happen for some reason.
+ ASMJIT_INLINE_NODEBUG size_t overhead_size() const noexcept { return _overhead_size; }
+
+ //! Returns the number of bytes pooled by \ref Arena reusable pools and eventually \ref ArenaPool if aggregated.
+ ASMJIT_INLINE_NODEBUG size_t pooled_size() const noexcept { return _pooled_size; }
+
+ //! \}
+
+ //! \name Aggregation
+ //! \{
+
+ ASMJIT_INLINE void aggregate(const ArenaStatistics& other) noexcept {
+ _block_count += other._block_count;
+ _used_size += other._used_size;
+ _reserved_size += other._reserved_size;
+ _overhead_size += other._overhead_size;
+ _pooled_size += other._pooled_size;
+ }
+
+ ASMJIT_INLINE ArenaStatistics& operator+=(const ArenaStatistics& other) noexcept {
+ aggregate(other);
+ return *this;
+ }
+
+ //! \}
+};
+
+//! Arena allocator is an incremental memory allocator that allocates memory by simply incrementing a pointer. It
+//! allocates blocks of memory by using C's `malloc()`, but divides these blocks into smaller segments requested by
+//! calling `Arena::alloc()` and friends.
+class Arena {
+public:
+ ASMJIT_NONCOPYABLE(Arena)
+
+ //! Default alignment of allocation requests to use when using Arena.
+ static inline constexpr size_t kAlignment = 8u;
+
+ //! \cond INTERNAL
+
+ //! Minimum managed block size.
+ static inline constexpr size_t kMinManagedBlockSize = 1024;
+ //! Maximum managed block size.
+ static inline constexpr size_t kMaxManagedBlockSize = size_t(1) << (sizeof(size_t) * 8 - 2);
+
+ //! Number of slots.
+ static inline constexpr size_t kReusableSlotCount = 8;
+ //! How many bytes are in the first slot.
+ static inline constexpr size_t kMinReusableSlotSize = 16;
+ //! How many bytes are in the last slot.
+ static inline constexpr size_t kMaxReusableSlotSize = kMinReusableSlotSize << (kReusableSlotCount - 1u);
+
+ //! A single block of memory managed by `Arena`.
+ struct alignas(kAlignment) ManagedBlock {
+ //! Link to the next managed block (single-linked list).
+ ManagedBlock* next;
+ //! Size represents the number of bytes that can be allocated (it doesn't include block overhead).
+ size_t size;
+
+ ASMJIT_INLINE_NODEBUG uint8_t* data() const noexcept {
+ return const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(this) + sizeof(*this));
+ }
+
+ ASMJIT_INLINE_NODEBUG uint8_t* end() const noexcept {
+ return data() + size;
+ }
+ };
+
+ //! Single-linked list used to store unused reusable chunks.
+ struct ReusableSlot {
+ //! Link to a next slot in a single-linked list.
+ ReusableSlot* next;
+ };
+
+ //! A large block of memory that has been allocated dynamically and is not part of managed blocks used by the
+ //! allocator. Arena keeps track of these blocks and always releases them when the Arena is destroyed or reset.
+ struct DynamicBlock {
+ DynamicBlock* prev;
+ DynamicBlock* next;
+ };
+
+ //! Returns the slot index to be used for the given `size`. Returns `true` if a valid slot has been written to `slot`.
+ [[nodiscard]]
+ static ASMJIT_INLINE bool _get_reusable_slot_index(size_t size, Out<size_t> slot) noexcept {
+ slot = Support::bit_size_of<size_t> - 4u - Support::clz((size - 1u) | 0xF);
+ return *slot < kReusableSlotCount;
+ }
+
+ //! Returns the slot index to be used for the given `size`. Returns `true` if a valid slot has been written to `slot`
+ //! and `allocated_size` has been filled with slot exact size (`allocated_size` can be equal or slightly greater than
+ //! `size`).
+ [[nodiscard]]
+ static ASMJIT_INLINE bool _get_reusable_slot_index(size_t size, Out<size_t> slot, Out<size_t> allocated_size) noexcept {
+ slot = Support::bit_size_of<size_t> - 4u - Support::clz((size - 1u) | 0xF);
+ allocated_size = kMinReusableSlotSize << *slot;
+ return *slot < kReusableSlotCount;
+ }
+
+ //! \endcond
+
+ template<typename T>
+ static ASMJIT_INLINE_CONSTEXPR size_t aligned_size_of() noexcept { return Support::align_up(sizeof(T), kAlignment); }
+
+ static ASMJIT_INLINE_CONSTEXPR size_t aligned_size(size_t size) noexcept { return Support::align_up(size, kAlignment); }
+
+ //! \name Members
+ //! \{
+
+ //! Pointer in the current block.
+ uint8_t* _ptr {};
+ //! End of the current block.
+ uint8_t* _end {};
+
+ //! Current block.
+ ManagedBlock* _current_block {};
+ //! First block (single-linked list).
+ ManagedBlock* _first_block {};
+
+ //! Current block size shift - reverted to _min_block_size_shift every time the Arena is `reset(ResetPolicy::kHard)`.
+ uint8_t _current_block_size_shift {};
+ //! Minimum log2(block_size) to allocate.
+ uint8_t _min_block_size_shift {};
+ //! Maximum log2(block_size) to allocate.
+ uint8_t _max_block_size_shift {};
+ //! True when the Arena has a static block (static blocks are used by ArenaTmp).
+ uint8_t _has_static_block {};
+ //! Unused bytes (remaining bytes in blocks that couldn't be used because of size requests).
+ uint32_t _unused_byte_count {};
+
+ //! Slots that contain reusable memory chunks.
+ ReusableSlot* _reusable_slots[kReusableSlotCount] {};
+ //! Large blocks for allocations that either couldn't use slots or one-shot allocation.
+ DynamicBlock* _dynamic_blocks {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new Arena.
+ //!
+ //! The `min_block_size` parameter describes the default size of the block. If the `size` parameter passed to
+ //! `alloc()` is greater than the default size `Arena` will allocate and use a larger block, but it will not change
+ //! the default `min_block_size`.
+ //!
+ //! It's not required, but it's good practice to set `min_block_size` to a reasonable value that depends on the
+ //! usage of `Arena`. Greater block sizes are generally safer and perform better than unreasonably low block sizes.
+ ASMJIT_INLINE_NODEBUG explicit Arena(size_t min_block_size) noexcept {
+ _init(min_block_size, Span<uint8_t>{});
+ }
+
+ //! Creates a new Arena with a first block pointing to `static_arena_memory`.
+ ASMJIT_INLINE_NODEBUG Arena(size_t min_block_size, Span<uint8_t> static_arena_memory) noexcept {
+ _init(min_block_size, static_arena_memory);
+ }
+
+ //! Destroys the `Arena` instance.
+ //!
+ //! This will destroy the `Arena` instance and release all blocks of memory allocated by it. It performs implicit
+ //! `reset(ResetPolicy::kHard)`.
+ ASMJIT_INLINE_NODEBUG ~Arena() noexcept { reset(ResetPolicy::kHard); }
+
+ ASMJIT_API void _init(size_t min_block_size, Span<uint8_t> static_arena_memory) noexcept;
+
+ //! Resets the `Arena` invalidating all blocks allocated.
+ //!
+ //! See `ResetPolicy` for more details.
+ ASMJIT_API void reset(ResetPolicy reset_policy = ResetPolicy::kSoft) noexcept;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns a minimum block size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t min_block_size() const noexcept { return size_t(1) << _min_block_size_shift; }
+
+ //! Returns a maximum block size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t max_block_size() const noexcept { return size_t(1) << _max_block_size_shift; }
+
+ //! Tests whether this `Arena` is actually a `ArenaTmp` that uses temporary memory.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint8_t has_static_block() const noexcept { return _has_static_block; }
+
+ //! Returns remaining size of the current block.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t remaining_size() const noexcept { return (size_t)(_end - _ptr); }
+
+ //! Returns the current arena cursor (dangerous).
+ //!
+ //! This is a function that can be used to get exclusive access to the current block's memory buffer.
+ template<typename T = uint8_t>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* ptr() noexcept { return reinterpret_cast<T*>(_ptr); }
+
+ //! Returns the end of the current arena block, only useful if you use `ptr()`.
+ template<typename T = uint8_t>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* end() noexcept { return reinterpret_cast<T*>(_end); }
+
+ //! Sets the current arena pointer to `ptr` (must be within the current block).
+ template<typename T>
+ ASMJIT_INLINE void set_ptr(T* ptr) noexcept {
+ uint8_t* p = reinterpret_cast<uint8_t*>(ptr);
+ ASMJIT_ASSERT(p >= _ptr && p <= _end);
+ _ptr = p;
+ }
+
+ //! Sets the end arena pointer to `end` (must be within the current block).
+ template<typename T>
+ ASMJIT_INLINE void set_end(T* end) noexcept {
+ uint8_t* p = reinterpret_cast<uint8_t*>(end);
+ ASMJIT_ASSERT(p >= _ptr && p <= _end);
+ _end = p;
+ }
+
+ //! \}
+
+ //! \name Oneshot Allocation
+ //! \{
+
+ //! \cond INTERNAL
+
+ //! Internal alloc function used by inline wrappers.
+ [[nodiscard]]
+ ASMJIT_API void* _alloc_oneshot(size_t size) noexcept;
+
+ //! \endcond
+
+ //! Allocates the requested memory specified by `size` and optionally casts the returned value to `T*`.
+ //!
+ //! Pointer returned is valid until the `Arena` instance is destroyed or reset by calling `reset()`. If you plan to
+ //! make an instance of C++ from the given pointer use placement `new` and `delete` operators:
+ //!
+ //! ```
+ //! using namespace asmjit;
+ //!
+ //! class Object { ... };
+ //!
+ //! // Create Arena with default block size of 65536 bytes (the maximum size per alloc() would be slightly less).
+ //! Arena arena(65536);
+ //!
+ //! // Create your objects using arena object allocating, for example:
+ //! Object* obj = static_cast<Object*>( arena.alloc(Arena::aligned_size_of<Object>() );
+ //!
+ //! if (!obj) {
+ //! // Handle out of memory error.
+ //! }
+ //!
+ //! // Placement `new` and `delete` operators can be used to instantiate it.
+ //! new(obj) Object();
+ //!
+ //! // ... lifetime of your objects ...
+ //!
+ //! // To destroy the instance (if required).
+ //! obj->~Object();
+ //!
+ //! // Reset or destroy `Arena`.
+ //! arena.reset();
+ //! ```
+ template<typename T = void>
+ [[nodiscard]]
+ ASMJIT_INLINE T* alloc_oneshot(size_t size) noexcept {
+ ASMJIT_ASSERT(Support::is_aligned(size, kAlignment));
+
+#if defined(__GNUC__)
+ // We can optimize this function a little bit if we know that `size` is relatively small - which would mean
+ // that we cannot possibly overflow `_ptr`. Since most of the time `alloc()` is used for known types (which
+ // implies their size is known as well) this optimization is worth it as it may save us 1 or 2 instructions.
+ if (__builtin_constant_p(size) && size <= 1024u) {
+ uint8_t* after = _ptr + size;
+
+ if (ASMJIT_UNLIKELY(after > _end)) {
+ return static_cast<T*>(_alloc_oneshot(size));
+ }
+
+ void* p = static_cast<void*>(_ptr);
+ _ptr = after;
+ return static_cast<T*>(p);
+ }
+#endif
+
+ if (ASMJIT_UNLIKELY(size > remaining_size())) {
+ return static_cast<T*>(_alloc_oneshot(size));
+ }
+
+ void* p = static_cast<void*>(_ptr);
+ _ptr += size;
+ return static_cast<T*>(p);
+ }
+
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE T* alloc_oneshot() noexcept {
+ return alloc_oneshot<T>(aligned_size_of<T>());
+ }
+
+ //! Allocates `size` bytes of zeroed memory. See `alloc()` for more details.
+ [[nodiscard]]
+ ASMJIT_API void* _alloc_oneshot_zeroed(size_t size) noexcept;
+
+ //! Allocates `size` bytes of zeroed memory. See `alloc()` for more details.
+ template<typename T = void>
+ [[nodiscard]]
+ ASMJIT_INLINE T* alloc_oneshot_zeroed(size_t size) noexcept {
+ return static_cast<T*>(_alloc_oneshot_zeroed(size));
+ }
+
+ //! Like `new(std::nothrow) T(...)`, but allocated by `Arena`.
+ template<typename T>
+ [[nodiscard]]
+ ASMJIT_INLINE T* new_oneshot() noexcept {
+ void* p = alloc_oneshot(aligned_size_of<T>());
+ if (ASMJIT_UNLIKELY(!p)) {
+ return nullptr;
+ }
+ return new(Support::PlacementNew{p}) T();
+ }
+
+ //! Like `new(std::nothrow) T(...)`, but allocated by `Arena`.
+ template<typename T, typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE T* new_oneshot(Args&&... args) noexcept {
+ void* p = alloc_oneshot(aligned_size_of<T>());
+ if (ASMJIT_UNLIKELY(!p)) {
+ return nullptr;
+ }
+ return new(Support::PlacementNew{p}) T(std::forward<Args>(args)...);
+ }
+
+ //! Helper to duplicate data.
+ [[nodiscard]]
+ ASMJIT_API void* dup(const void* data, size_t size, bool null_terminate = false) noexcept;
+
+ //! Helper to duplicate a formatted string, maximum size is 256 bytes.
+ [[nodiscard]]
+ ASMJIT_API char* sformat(const char* str, ...) noexcept;
+
+ //! \}
+
+ //! \name Reusable Allocation
+ //! \{
+
+ //! \cond INTERNAL
+ [[nodiscard]]
+ ASMJIT_API void* _alloc_reusable(size_t size, Out<size_t> allocated_size) noexcept;
+
+ [[nodiscard]]
+ ASMJIT_API void* _alloc_reusable_zeroed(size_t size, Out<size_t> allocated_size) noexcept;
+
+ ASMJIT_API void _release_dynamic(void* p, size_t size) noexcept;
+ //! \endcond
+
+ //! Allocates `size` bytes of memory, ideally from an available pool.
+ //!
+ //! \note `size` can't be zero, it will assert in debug mode in such case.
+ template<typename T = void>
+ [[nodiscard]]
+ inline T* alloc_reusable(size_t size) noexcept {
+ size_t dummy_allocated_size;
+ return static_cast<T*>(_alloc_reusable(size, Out(dummy_allocated_size)));
+ }
+
+ //! Like `alloc(size)`, but provides a second argument `allocated_size` that provides a way to know how big
+ //! the block returned actually is. This is useful for containers to prevent growing too early.
+ template<typename T = void>
+ [[nodiscard]]
+ inline T* alloc_reusable(size_t size, Out<size_t> allocated_size) noexcept {
+ return static_cast<T*>(_alloc_reusable(size, allocated_size));
+ }
+
+ //! Like `alloc(size)`, but returns zeroed memory.
+ template<typename T = void>
+ [[nodiscard]]
+ inline T* alloc_reusable_zeroed(size_t size) noexcept {
+ size_t dummy_allocated_size;
+ return static_cast<T*>(_alloc_reusable_zeroed(size, Out(dummy_allocated_size)));
+ }
+
+ //! Like `alloc(size, allocated_size)`, but returns zeroed memory.
+ template<typename T = void>
+ [[nodiscard]]
+ inline T* alloc_reusable_zeroed(size_t size, Out<size_t> allocated_size) noexcept {
+ return static_cast<T*>(_alloc_reusable_zeroed(size, allocated_size));
+ }
+
+ //! Releases the memory previously allocated by `alloc()`. The `size` argument has to be either the same `size`
+ //! as used to call `alloc()` or `allocated_size` returned by `alloc()`.
+ inline void free_reusable(void* p, size_t size) noexcept {
+ ASMJIT_ASSERT(p != nullptr);
+ ASMJIT_ASSERT(size != 0);
+
+ size_t slot;
+ if (_get_reusable_slot_index(size, Out(slot))) {
+ static_cast<ReusableSlot*>(p)->next = static_cast<ReusableSlot*>(_reusable_slots[slot]);
+ _reusable_slots[slot] = static_cast<ReusableSlot*>(p);
+ }
+ else {
+ _release_dynamic(p, size);
+ }
+ }
+
+ //! \}
+
+ //! \name Statistics
+ //! \{
+
+ //! Calculates and returns statistics related to the current use of this \ref Arena.
+ //!
+ //! \note This function fills all members, but `_pooled_size` member (see \ref ArenaStatistics::pooled_size()
+ //! function) would be assigned to zero as \ref Arena has no clue about the use of the requested memory.
+ //!
+ //! \attention This function could be relatively expensive depending on the number of blocks that is managed by
+ //! the allocator. The primary case of this function is to use it during the development to get an idea about
+ //! the use of \ref Arena (or use of multiple Arenas if the statistics is aggregated).
+ ASMJIT_API ArenaStatistics statistics() const noexcept;
+
+ //! \}
+};
+
+//! \ref Arena with `N` bytes of a static storage, used for the initial block.
+//!
+//! Temporary arenas are used in cases where it's known that some memory will be required, but in many cases it won't
+//! exceed N bytes, so the whole operation can be performed without a dynamic memory allocation.
+template<size_t N>
+class ArenaTmp : public Arena {
+public:
+ ASMJIT_NONCOPYABLE(ArenaTmp)
+
+ //! Temporary storage, embedded after \ref Arena.
+ struct alignas(Arena::kAlignment) Storage {
+ uint8_t data[N];
+ } _storage;
+
+ //! Creates a temporary arena. Dynamic block size is specified by `min_block_size`.
+ ASMJIT_INLINE explicit ArenaTmp(size_t min_block_size) noexcept
+ : Arena(min_block_size, Span<uint8_t>(_storage.data, N)) {}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENA_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenabitset.cpp b/3rdparty/asmjit/asmjit/support/arenabitset.cpp
new file mode 100644
index 00000000000..5bc11c83c10
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenabitset.cpp
@@ -0,0 +1,253 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenabitset_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// ArenaBitSet - Operations
+// ===========================
+
+Error ArenaBitSet::copy_from(Arena& arena, const ArenaBitSet& other) noexcept {
+ BitWord* data = _data;
+ size_t new_size = other.size();
+
+ if (!new_size) {
+ _size = 0;
+ return Error::kOk;
+ }
+
+ if (new_size > _capacity) {
+ // Realloc needed... Calculate the minimum capacity (in bytes) required.
+ size_t minimum_capacity_in_bits = Support::align_up<size_t>(new_size, Support::bit_size_of<BitWord>);
+ if (ASMJIT_UNLIKELY(minimum_capacity_in_bits < new_size)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // Normalize to bytes.
+ size_t minimum_capacity = minimum_capacity_in_bits / 8u;
+ size_t allocated_capacity;
+
+ BitWord* new_data = static_cast<BitWord*>(arena.alloc_reusable(minimum_capacity, Out(allocated_capacity)));
+ if (ASMJIT_UNLIKELY(!new_data)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // `allocated_capacity` now contains number in bytes, we need bits.
+ size_t allocated_capacity_in_bits = allocated_capacity * 8;
+
+ // Arithmetic overflow should normally not happen. If it happens we just
+ // change the `allocated_capacity_in_bits` to the `minimum_capacity_in_bits` as
+ // this value is still safe to be used to call `_allocator->release(...)`.
+ if (ASMJIT_UNLIKELY(allocated_capacity_in_bits < allocated_capacity)) {
+ allocated_capacity_in_bits = minimum_capacity_in_bits;
+ }
+
+ if (data) {
+ arena.free_reusable(data, _capacity / 8);
+ }
+ data = new_data;
+
+ _data = data;
+ _capacity = uint32_t(allocated_capacity_in_bits);
+ }
+
+ _size = uint32_t(new_size);
+ _copy_bits(data, other.data(), _words_per_bits(uint32_t(new_size)));
+
+ return Error::kOk;
+}
+
+Error ArenaBitSet::_resize(Arena& arena, size_t new_size, size_t ideal_capacity, bool new_bits_value) noexcept {
+ ASMJIT_ASSERT(ideal_capacity >= new_size);
+
+ if (new_size <= _size) {
+ // The size after the resize is lesser than or equal to the current size.
+ size_t idx = new_size / Support::bit_size_of<BitWord>;
+ size_t bit = new_size % Support::bit_size_of<BitWord>;
+
+ // Just set all bits outside of the new size in the last word to zero. There is a case that there are not bits
+ // to set if `bit` is zero. This happens when `new_size` is a multiply of `bit_size_of<BitWord>` like 64, 128,
+ // and so on. In that case don't change anything as that would mean settings bits outside of the `_size`.
+ if (bit) {
+ _data[idx] &= (BitWord(1) << bit) - 1u;
+ }
+
+ _size = uint32_t(new_size);
+ return Error::kOk;
+ }
+
+ size_t old_size = _size;
+ BitWord* data = _data;
+
+ if (new_size > _capacity) {
+ // Realloc needed, calculate the minimum capacity (in bytes) required.
+ size_t minimum_capacity_in_bits = Support::align_up(ideal_capacity, Support::bit_size_of<BitWord>);
+
+ if (ASMJIT_UNLIKELY(minimum_capacity_in_bits < new_size)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // Normalize to bytes.
+ size_t minimum_capacity = minimum_capacity_in_bits / 8u;
+ size_t allocated_capacity;
+
+ BitWord* new_data = static_cast<BitWord*>(arena.alloc_reusable(minimum_capacity, Out(allocated_capacity)));
+ if (ASMJIT_UNLIKELY(!new_data)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ // `allocated_capacity` now contains number in bytes, we need bits.
+ size_t allocated_capacity_in_bits = allocated_capacity * 8u;
+
+ // Arithmetic overflow should normally not happen. If it happens we just change the `allocated_capacity_in_bits`
+ // to the `minimum_capacity_in_bits` as this value is still safe to be used to call `_allocator->release(...)`.
+ if (ASMJIT_UNLIKELY(allocated_capacity_in_bits < allocated_capacity)) {
+ allocated_capacity_in_bits = minimum_capacity_in_bits;
+ }
+
+ _copy_bits(new_data, data, _words_per_bits(old_size));
+
+ if (data) {
+ arena.free_reusable(data, _capacity / 8);
+ }
+ data = new_data;
+
+ _data = data;
+ _capacity = uint32_t(allocated_capacity_in_bits);
+ }
+
+ // Start (of the old size) and end (of the new size) bits
+ size_t idx = old_size / Support::bit_size_of<BitWord>;
+ size_t start_bit = old_size % Support::bit_size_of<BitWord>;
+ size_t end_bit = new_size % Support::bit_size_of<BitWord>;
+
+ // Set new bits to either 0 or 1. The `pattern` is used to set multiple
+ // bits per bit-word and contains either all zeros or all ones.
+ BitWord pattern = Support::bool_as_mask<BitWord>(new_bits_value);
+
+ // First initialize the last bit-word of the old size.
+ if (start_bit) {
+ size_t num_bits = 0;
+
+ if (idx == (new_size / Support::bit_size_of<BitWord>)) {
+ // The number of bit-words is the same after the resize. In that case
+ // we need to set only bits necessary in the current last bit-word.
+ ASMJIT_ASSERT(start_bit < end_bit);
+ num_bits = end_bit - start_bit;
+ }
+ else {
+ // There is be more bit-words after the resize. In that case we don't
+ // have to be extra careful about the last bit-word of the old size.
+ num_bits = Support::bit_size_of<BitWord> - start_bit;
+ }
+
+ data[idx++] |= pattern << num_bits;
+ }
+
+ // Initialize all bit-words after the last bit-word of the old size.
+ size_t end_index = _words_per_bits(new_size);
+ while (idx < end_index) {
+ data[idx++] = pattern;
+ }
+
+ // Clear unused bits of the last bit-word.
+ if (end_bit) {
+ data[end_index - 1] = pattern & ((BitWord(1) << end_bit) - 1);
+ }
+
+ _size = uint32_t(new_size);
+ return Error::kOk;
+}
+
+Error ArenaBitSet::_append(Arena& arena, bool value) noexcept {
+ constexpr uint32_t kThreshold = Globals::kGrowThreshold * 8u;
+
+ uint32_t new_size = _size + 1;
+ uint32_t ideal_capacity = _capacity;
+
+ if (ideal_capacity < 128) {
+ ideal_capacity = 128;
+ }
+ else if (ideal_capacity <= kThreshold) {
+ ideal_capacity *= 2;
+ }
+ else {
+ ideal_capacity += kThreshold;
+ }
+
+ if (ASMJIT_UNLIKELY(ideal_capacity < _capacity)) {
+ if (ASMJIT_UNLIKELY(_size == std::numeric_limits<uint32_t>::max())) {
+ return make_error(Error::kOutOfMemory);
+ }
+ ideal_capacity = new_size;
+ }
+
+ return _resize(arena, new_size, ideal_capacity, value);
+}
+
+// ArenaBitSet - Tests
+// ======================
+
+#if defined(ASMJIT_TEST)
+static void test_arena_bitvector(Arena& arena) {
+ uint32_t i, count;
+ uint32_t kMaxCount = 100;
+
+ ArenaBitSet vec;
+ EXPECT_TRUE(vec.is_empty());
+ EXPECT_EQ(vec.size(), 0u);
+
+ INFO("ArenaBitSet::resize()");
+ for (count = 1; count < kMaxCount; count++) {
+ vec.clear();
+ EXPECT_EQ(vec.resize(arena, count, false), Error::kOk);
+ EXPECT_EQ(vec.size(), count);
+
+ for (i = 0; i < count; i++) {
+ EXPECT_FALSE(vec.bit_at(i));
+ }
+
+ vec.clear();
+ EXPECT_EQ(vec.resize(arena, count, true), Error::kOk);
+ EXPECT_EQ(vec.size(), count);
+
+ for (i = 0; i < count; i++) {
+ EXPECT_TRUE(vec.bit_at(i));
+ }
+ }
+
+ INFO("ArenaBitSet::fill_bits() / clear_bits()");
+ for (count = 1; count < kMaxCount; count += 2) {
+ vec.clear();
+ EXPECT_EQ(vec.resize(arena, count), Error::kOk);
+ EXPECT_EQ(vec.size(), count);
+
+ for (i = 0; i < (count + 1) / 2; i++) {
+ bool value = bool(i & 1);
+ if (value) {
+ vec.fill_bits(i, count - i * 2);
+ }
+ else {
+ vec.clear_bits(i, count - i * 2);
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ EXPECT_EQ(vec.bit_at(i), bool(i & 1));
+ }
+ }
+}
+
+UNIT(arena_bitvector, -1) {
+ Arena arena(8192);
+ test_arena_bitvector(arena);
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/arenabitset_p.h b/3rdparty/asmjit/asmjit/support/arenabitset_p.h
new file mode 100644
index 00000000000..9b3dcd7cdd9
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenabitset_p.h
@@ -0,0 +1,436 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENABITSET_P_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENABITSET_P_H_INCLUDED
+
+#include <asmjit/support/arena.h>
+#include <asmjit/support/span.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+using BitWord = Support::BitWord;
+
+namespace BitOps {
+namespace {
+
+template<typename T>
+[[nodiscard]]
+ASMJIT_INLINE_NODEBUG size_t size_in_bits(const Span<T>& span) noexcept { return span.size() * Support::bit_size_of<T>; }
+
+template<typename T>
+[[nodiscard]]
+ASMJIT_INLINE_NODEBUG size_t size_in_words(size_t num_bits) noexcept { return (num_bits + Support::bit_size_of<T> - 1u) / Support::bit_size_of<T>; }
+
+template<typename T, typename Index>
+[[nodiscard]]
+ASMJIT_INLINE bool bit_at(const Span<T>& span, const Index& index) noexcept {
+ size_t i = Support::as_basic_uint(index);
+ size_t word_index = i / Support::bit_size_of<T>;
+ size_t bit_index = i % Support::bit_size_of<T>;
+
+ return bool((span[word_index] >> bit_index) & 0x1u);
+}
+
+template<typename T, typename Index>
+ASMJIT_INLINE void set_bit(const Span<T>& span, const Index& index, bool value) noexcept {
+ size_t i = Support::as_basic_uint(index);
+ size_t word_index = i / Support::bit_size_of<T>;
+ size_t bit_index = i % Support::bit_size_of<T>;
+
+ T and_mask = T(~(T(1u) << bit_index));
+ T bit_mask = T(T(value) << bit_index);
+
+ T& bit_word = span[word_index];
+ bit_word = T((bit_word & and_mask) | bit_mask);
+}
+
+template<typename T, typename Index>
+ASMJIT_INLINE void clear_bit(const Span<T>& span, const Index& index) noexcept {
+ size_t i = Support::as_basic_uint(index);
+
+ size_t word_index = i / Support::bit_size_of<T>;
+ size_t bit_index = i % Support::bit_size_of<T>;
+
+ T and_mask = T(~(T(1u) << bit_index));
+
+ T& bit_word = span[word_index];
+ bit_word = T(bit_word & and_mask);
+}
+
+template<typename T, typename Index>
+ASMJIT_INLINE void or_bit(const Span<T>& span, const Index& index, bool value) noexcept {
+ size_t i = Support::as_basic_uint(index);
+
+ size_t word_index = i / Support::bit_size_of<T>;
+ size_t bit_index = i % Support::bit_size_of<T>;
+
+ T bit_mask = T(T(value) << bit_index);
+
+ T& bit_word = span[word_index];
+ bit_word = T(bit_word | bit_mask);
+}
+
+template<typename T, typename Index>
+ASMJIT_INLINE void xor_bit(const Span<T>& span, const Index& index, bool value) noexcept {
+ size_t i = Support::as_basic_uint(index);
+ size_t word_index = i / Support::bit_size_of<T>;
+ size_t bit_index = i % Support::bit_size_of<T>;
+
+ T bit_mask = T(T(value) << bit_index);
+
+ T& bit_word = span[word_index];
+ bit_word = T(bit_word ^ bit_mask);
+}
+
+template<typename Op, typename T, typename... Args>
+ASMJIT_INLINE void combine_spans(Span<T> dst, Args&&... args) noexcept {
+ size_t size = dst.size();
+
+ for (size_t i = 0u; i < size; i++) {
+ dst[i] = Op::op(args[i]...);
+ }
+}
+
+template<typename T, typename... Args>
+ASMJIT_INLINE void or_(Span<T> dst, Args&&... args) noexcept {
+ return combine_spans<Support::Or>(dst, std::forward<Args>(args)...);
+}
+
+} // {anonymous}
+} // {BitOps}
+
+//! Arena-allocated bit vector.
+class ArenaBitSet {
+public:
+ ASMJIT_NONCOPYABLE(ArenaBitSet)
+
+ //! \name Members
+ //! \{
+
+ //! Bits.
+ BitWord* _data {};
+ //! Size of the bit-vector (in bits).
+ uint32_t _size {};
+ //! Capacity of the bit-vector (in bits).
+ uint32_t _capacity {};
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Internal
+ //! \{
+
+ static ASMJIT_INLINE_NODEBUG size_t _words_per_bits(size_t num_bits) noexcept {
+ return ((num_bits + Support::bit_size_of<BitWord> - 1u) / Support::bit_size_of<BitWord>);
+ }
+
+ static ASMJIT_INLINE_NODEBUG void _zero_bits(BitWord* dst, size_t bit_word_count) noexcept {
+ for (size_t i = 0; i < bit_word_count; i++) {
+ dst[i] = 0;
+ }
+ }
+
+ static ASMJIT_INLINE_NODEBUG void _fill_bits(BitWord* dst, size_t bit_word_count) noexcept {
+ for (size_t i = 0; i < bit_word_count; i++) {
+ dst[i] = ~BitWord(0);
+ }
+ }
+
+ static ASMJIT_INLINE_NODEBUG void _copy_bits(BitWord* dst, const BitWord* src, size_t bit_word_count) noexcept {
+ for (size_t i = 0; i < bit_word_count; i++) {
+ dst[i] = src[i];
+ }
+ }
+
+ //! \}
+ //! \endcond
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaBitSet() noexcept {}
+
+ ASMJIT_INLINE_NODEBUG ArenaBitSet(ArenaBitSet&& other) noexcept
+ : _data(other._data),
+ _size(other._size),
+ _capacity(other._capacity) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const ArenaBitSet& other) const noexcept { return equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const ArenaBitSet& other) const noexcept { return !equals(other); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the bit-vector is empty (has no bits).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _size == 0; }
+
+ //! Returns the size of this bit-vector (in bits).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ //! Returns the capacity of this bit-vector (in bits).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return _capacity; }
+
+ //! Returns the size of the `BitWord[]` array in `BitWord` units.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size_in_bit_words() const noexcept { return _words_per_bits(_size); }
+
+ //! Returns the capacity of the `BitWord[]` array in `BitWord` units.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t capacity_in_bit_words() const noexcept { return _words_per_bits(_capacity); }
+
+ //! Returns bit-vector data as `BitWord[]`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG BitWord* data() noexcept { return _data; }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const BitWord* data() const noexcept { return _data; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<BitWord> as_span() noexcept { return Span<BitWord>(_data, size_in_bit_words()); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const BitWord> as_span() const noexcept { return Span<BitWord>(_data, size_in_bit_words()); }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void swap(ArenaBitSet& other) noexcept {
+ std::swap(_data, other._data);
+ std::swap(_size, other._size);
+ std::swap(_capacity, other._capacity);
+ }
+
+ ASMJIT_INLINE_NODEBUG void clear() noexcept {
+ _size = 0;
+ }
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _data = nullptr;
+ _size = 0u;
+ _capacity = 0u;
+ }
+
+ ASMJIT_INLINE_NODEBUG void truncate(uint32_t new_size) noexcept {
+ _size = Support::min(_size, new_size);
+ _clear_unused_bits();
+ }
+
+ template<typename Index>
+ [[nodiscard]]
+ inline bool bit_at(const Index& index) const noexcept {
+ ASMJIT_ASSERT(Support::as_basic_uint(index) < _size);
+ return Support::bit_vector_get_bit(_data, Support::as_basic_uint(index));
+ }
+
+ template<typename Index>
+ inline void set_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(Support::as_basic_uint(index) < _size);
+ Support::bit_vector_set_bit(_data, Support::as_basic_uint(index), value);
+ }
+
+ template<typename Index>
+ inline void add_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(Support::as_basic_uint(index) < _size);
+ Support::bit_vector_or_bit(_data, Support::as_basic_uint(index), value);
+ }
+
+ template<typename Index>
+ inline void clear_bit(const Index& index) noexcept {
+ ASMJIT_ASSERT(Support::as_basic_uint(index) < _size);
+ Support::bit_vector_set_bit(_data, Support::as_basic_uint(index), false);
+ }
+
+ template<typename Index>
+ inline void xor_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(Support::as_basic_uint(index) < _size);
+ Support::bit_vector_xor_bit(_data, Support::as_basic_uint(index), value);
+ }
+
+ ASMJIT_INLINE Error append(Arena& arena, bool value) noexcept {
+ uint32_t index = _size;
+ if (ASMJIT_UNLIKELY(index >= _capacity))
+ return _append(arena, value);
+
+ uint32_t idx = index / Support::bit_size_of<BitWord>;
+ uint32_t bit = index % Support::bit_size_of<BitWord>;
+
+ if (bit == 0)
+ _data[idx] = BitWord(value) << bit;
+ else
+ _data[idx] |= BitWord(value) << bit;
+
+ _size++;
+ return Error::kOk;
+ }
+
+ Error copy_from(Arena& arena, const ArenaBitSet& other) noexcept;
+
+ ASMJIT_INLINE void clear_all() noexcept {
+ _zero_bits(_data, _words_per_bits(_size));
+ }
+
+ ASMJIT_INLINE void fill_all() noexcept {
+ _fill_bits(_data, _words_per_bits(_size));
+ _clear_unused_bits();
+ }
+
+ ASMJIT_INLINE void clear_bits(size_t start, size_t count) noexcept {
+ ASMJIT_ASSERT(start <= size_t(_size));
+ ASMJIT_ASSERT(size_t(_size) - start >= count);
+
+ Support::bit_vector_clear(_data, start, count);
+ }
+
+ ASMJIT_INLINE void fill_bits(size_t start, size_t count) noexcept {
+ ASMJIT_ASSERT(start <= size_t(_size));
+ ASMJIT_ASSERT(size_t(_size) - start >= count);
+
+ Support::bit_vector_fill(_data, start, count);
+ }
+
+ //! Performs a logical bitwise AND between bits specified in this array and bits in `other`. If `other` has less
+ //! bits than `this` then all remaining bits are set to zero.
+ //!
+ //! \note The size of the BitVector is unaffected by this operation.
+ ASMJIT_INLINE void and_(const ArenaBitSet& other) noexcept {
+ BitWord* dst = _data;
+ const BitWord* src = other._data;
+
+ size_t this_bit_word_count = size_in_bit_words();
+ size_t other_bit_word_count = other.size_in_bit_words();
+ size_t common_bit_word_count = Support::min(this_bit_word_count, other_bit_word_count);
+
+ size_t i = 0;
+ while (i < common_bit_word_count) {
+ dst[i] = dst[i] & src[i];
+ i++;
+ }
+
+ while (i < this_bit_word_count) {
+ dst[i] = 0;
+ i++;
+ }
+ }
+
+ //! Performs a logical bitwise AND between bits specified in this array and negated bits in `other`. If `other`
+ //! has less bits than `this` then all remaining bits are kept intact.
+ //!
+ //! \note The size of the BitVector is unaffected by this operation.
+ ASMJIT_INLINE void and_not(const ArenaBitSet& other) noexcept {
+ BitWord* dst = _data;
+ const BitWord* src = other._data;
+
+ size_t common_bit_word_count = _words_per_bits(Support::min(_size, other._size));
+ for (size_t i = 0; i < common_bit_word_count; i++) {
+ dst[i] = dst[i] & ~src[i];
+ }
+ }
+
+ //! Performs a logical bitwise OP between bits specified in this array and bits in `other`. If `other` has less
+ //! bits than `this` then all remaining bits are kept intact.
+ //!
+ //! \note The size of the BitVector is unaffected by this operation.
+ ASMJIT_INLINE void or_(const ArenaBitSet& other) noexcept {
+ BitWord* dst = _data;
+ const BitWord* src = other._data;
+
+ size_t common_bit_word_count = _words_per_bits(Support::min(_size, other._size));
+ for (size_t i = 0; i < common_bit_word_count; i++) {
+ dst[i] = dst[i] | src[i];
+ }
+ _clear_unused_bits();
+ }
+
+ ASMJIT_INLINE void _clear_unused_bits() noexcept {
+ uint32_t idx = _size / Support::bit_size_of<BitWord>;
+ uint32_t bit = _size % Support::bit_size_of<BitWord>;
+
+ if (!bit) {
+ return;
+ }
+
+ _data[idx] &= (BitWord(1) << bit) - 1u;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE bool equals(const ArenaBitSet& other) const noexcept {
+ if (_size != other._size) {
+ return false;
+ }
+
+ const BitWord* a_data = _data;
+ const BitWord* b_data = other._data;
+ size_t bit_word_count = _words_per_bits(_size);
+
+ for (size_t i = 0; i < bit_word_count; i++) {
+ if (a_data[i] != b_data[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ //! \}
+
+ //! \name Memory Management
+ //! \{
+
+ inline void release(Arena& arena) noexcept {
+ if (!_data) {
+ return;
+ }
+
+ arena.free_reusable(_data, _capacity / 8u);
+ reset();
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Error resize(Arena& arena, size_t new_size, bool new_bits_value = false) noexcept {
+ return _resize(arena, new_size, new_size, new_bits_value);
+ }
+
+ Error _resize(Arena& arena, size_t new_size, size_t ideal_capacity, bool new_bits_value) noexcept;
+ Error _append(Arena& arena, bool value) noexcept;
+
+ //! \}
+
+ //! \name Iterators
+ //! \{
+
+ class ForEachBitSet : public Support::BitVectorIterator<BitWord> {
+ public:
+ inline explicit ForEachBitSet(const ArenaBitSet& bit_vector) noexcept
+ : Support::BitVectorIterator<BitWord>(bit_vector.as_span()) {}
+ };
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENABITSET_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenahash.cpp b/3rdparty/asmjit/asmjit/support/arenahash.cpp
new file mode 100644
index 00000000000..e9c3736359e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenahash.cpp
@@ -0,0 +1,309 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenahash.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// ArenaHashBase - Prime Numbers
+// ============================
+
+#define ASMJIT_POPULATE_PRIMES(ENTRY) \
+ ENTRY(2 , 0x80000000, 32), /* [N * 0x80000000 >> 32] (rcp=2147483648) */ \
+ ENTRY(11 , 0xBA2E8BA3, 35), /* [N * 0xBA2E8BA3 >> 35] (rcp=3123612579) */ \
+ ENTRY(29 , 0x8D3DCB09, 36), /* [N * 0x8D3DCB09 >> 36] (rcp=2369637129) */ \
+ ENTRY(41 , 0xC7CE0C7D, 37), /* [N * 0xC7CE0C7D >> 37] (rcp=3352169597) */ \
+ ENTRY(59 , 0x8AD8F2FC, 37), /* [N * 0x8AD8F2FC >> 37] (rcp=2329473788) */ \
+ ENTRY(83 , 0xC565C87C, 38), /* [N * 0xC565C87C >> 38] (rcp=3311782012) */ \
+ ENTRY(131 , 0xFA232CF3, 39), /* [N * 0xFA232CF3 >> 39] (rcp=4196609267) */ \
+ ENTRY(191 , 0xAB8F69E3, 39), /* [N * 0xAB8F69E3 >> 39] (rcp=2878302691) */ \
+ ENTRY(269 , 0xF3A0D52D, 40), /* [N * 0xF3A0D52D >> 40] (rcp=4087403821) */ \
+ ENTRY(383 , 0xAB1CBDD4, 40), /* [N * 0xAB1CBDD4 >> 40] (rcp=2870787540) */ \
+ ENTRY(541 , 0xF246FACC, 41), /* [N * 0xF246FACC >> 41] (rcp=4064737996) */ \
+ ENTRY(757 , 0xAD2589A4, 41), /* [N * 0xAD2589A4 >> 41] (rcp=2904918436) */ \
+ ENTRY(1061 , 0xF7129426, 42), /* [N * 0xF7129426 >> 42] (rcp=4145189926) */ \
+ ENTRY(1499 , 0xAEE116B7, 42), /* [N * 0xAEE116B7 >> 42] (rcp=2933986999) */ \
+ ENTRY(2099 , 0xF9C7A737, 43), /* [N * 0xF9C7A737 >> 43] (rcp=4190611255) */ \
+ ENTRY(2939 , 0xB263D25C, 43), /* [N * 0xB263D25C >> 43] (rcp=2992886364) */ \
+ ENTRY(4111 , 0xFF10E02E, 44), /* [N * 0xFF10E02E >> 44] (rcp=4279296046) */ \
+ ENTRY(5779 , 0xB5722823, 44), /* [N * 0xB5722823 >> 44] (rcp=3044157475) */ \
+ ENTRY(8087 , 0x81A97405, 44), /* [N * 0x81A97405 >> 44] (rcp=2175366149) */ \
+ ENTRY(11321 , 0xB93E91DB, 45), /* [N * 0xB93E91DB >> 45] (rcp=3107885531) */ \
+ ENTRY(15859 , 0x843CC26B, 45), /* [N * 0x843CC26B >> 45] (rcp=2218574443) */ \
+ ENTRY(22189 , 0xBD06B9EA, 46), /* [N * 0xBD06B9EA >> 46] (rcp=3171334634) */ \
+ ENTRY(31051 , 0x8713F186, 46), /* [N * 0x8713F186 >> 46] (rcp=2266231174) */ \
+ ENTRY(43451 , 0xC10F1CB9, 47), /* [N * 0xC10F1CB9 >> 47] (rcp=3238993081) */ \
+ ENTRY(60869 , 0x89D06A86, 47), /* [N * 0x89D06A86 >> 47] (rcp=2312137350) */ \
+ ENTRY(85159 , 0xC502AF3B, 48), /* [N * 0xC502AF3B >> 48] (rcp=3305287483) */ \
+ ENTRY(102107 , 0xA44F65AE, 48), /* [N * 0xA44F65AE >> 48] (rcp=2756666798) */ \
+ ENTRY(122449 , 0x89038F77, 48), /* [N * 0x89038F77 >> 48] (rcp=2298711927) */ \
+ ENTRY(146819 , 0xE48AF7E9, 49), /* [N * 0xE48AF7E9 >> 49] (rcp=3834312681) */ \
+ ENTRY(176041 , 0xBE9B145B, 49), /* [N * 0xBE9B145B >> 49] (rcp=3197834331) */ \
+ ENTRY(211073 , 0x9EF882BA, 49), /* [N * 0x9EF882BA >> 49] (rcp=2667086522) */ \
+ ENTRY(253081 , 0x849571AB, 49), /* [N * 0x849571AB >> 49] (rcp=2224386475) */ \
+ ENTRY(303469 , 0xDD239C97, 50), /* [N * 0xDD239C97 >> 50] (rcp=3710098583) */ \
+ ENTRY(363887 , 0xB86C196D, 50), /* [N * 0xB86C196D >> 50] (rcp=3094092141) */ \
+ ENTRY(436307 , 0x99CFA4E9, 50), /* [N * 0x99CFA4E9 >> 50] (rcp=2580522217) */ \
+ ENTRY(523177 , 0x804595C0, 50), /* [N * 0x804595C0 >> 50] (rcp=2152043968) */ \
+ ENTRY(627293 , 0xD5F69FCF, 51), /* [N * 0xD5F69FCF >> 51] (rcp=3589709775) */ \
+ ENTRY(752177 , 0xB27063BA, 51), /* [N * 0xB27063BA >> 51] (rcp=2993710010) */ \
+ ENTRY(901891 , 0x94D170AC, 51), /* [N * 0x94D170AC >> 51] (rcp=2496753836) */ \
+ ENTRY(1081369 , 0xF83C9767, 52), /* [N * 0xF83C9767 >> 52] (rcp=4164720487) */ \
+ ENTRY(1296563 , 0xCF09435D, 52), /* [N * 0xCF09435D >> 52] (rcp=3473490781) */ \
+ ENTRY(1554583 , 0xACAC7198, 52), /* [N * 0xACAC7198 >> 52] (rcp=2896982424) */ \
+ ENTRY(1863971 , 0x90033EE3, 52), /* [N * 0x90033EE3 >> 52] (rcp=2416131811) */ \
+ ENTRY(2234923 , 0xF0380EBD, 53), /* [N * 0xF0380EBD >> 53] (rcp=4030205629) */ \
+ ENTRY(2679673 , 0xC859731E, 53), /* [N * 0xC859731E >> 53] (rcp=3361305374) */ \
+ ENTRY(3212927 , 0xA718DE27, 53), /* [N * 0xA718DE27 >> 53] (rcp=2803424807) */ \
+ ENTRY(3852301 , 0x8B5D1B4B, 53), /* [N * 0x8B5D1B4B >> 53] (rcp=2338134859) */ \
+ ENTRY(4618921 , 0xE8774804, 54), /* [N * 0xE8774804 >> 54] (rcp=3900131332) */ \
+ ENTRY(5076199 , 0xD386574E, 54), /* [N * 0xD386574E >> 54] (rcp=3548796750) */ \
+ ENTRY(5578757 , 0xC0783FE1, 54), /* [N * 0xC0783FE1 >> 54] (rcp=3229106145) */ \
+ ENTRY(6131057 , 0xAF21B08F, 54), /* [N * 0xAF21B08F >> 54] (rcp=2938220687) */ \
+ ENTRY(6738031 , 0x9F5AFD6E, 54), /* [N * 0x9F5AFD6E >> 54] (rcp=2673540462) */ \
+ ENTRY(7405163 , 0x90FFC3B9, 54), /* [N * 0x90FFC3B9 >> 54] (rcp=2432680889) */ \
+ ENTRY(8138279 , 0x83EFECFC, 54), /* [N * 0x83EFECFC >> 54] (rcp=2213539068) */ \
+ ENTRY(8943971 , 0xF01AA2EF, 55), /* [N * 0xF01AA2EF >> 55] (rcp=4028277487) */ \
+ ENTRY(9829447 , 0xDA7979B2, 55), /* [N * 0xDA7979B2 >> 55] (rcp=3665394098) */ \
+ ENTRY(10802581 , 0xC6CB2771, 55), /* [N * 0xC6CB2771 >> 55] (rcp=3335202673) */ \
+ ENTRY(11872037 , 0xB4E2C7DD, 55), /* [N * 0xB4E2C7DD >> 55] (rcp=3034761181) */ \
+ ENTRY(13047407 , 0xA4974124, 55), /* [N * 0xA4974124 >> 55] (rcp=2761376036) */ \
+ ENTRY(14339107 , 0x95C39CF1, 55), /* [N * 0x95C39CF1 >> 55] (rcp=2512624881) */ \
+ ENTRY(15758737 , 0x8845C763, 55), /* [N * 0x8845C763 >> 55] (rcp=2286274403) */ \
+ ENTRY(17318867 , 0xF7FE593F, 56), /* [N * 0xF7FE593F >> 56] (rcp=4160641343) */ \
+ ENTRY(19033439 , 0xE1A75D93, 56), /* [N * 0xE1A75D93 >> 56] (rcp=3785842067) */ \
+ ENTRY(20917763 , 0xCD5389B3, 56), /* [N * 0xCD5389B3 >> 56] (rcp=3444804019) */ \
+ ENTRY(22988621 , 0xBAD4841A, 56), /* [N * 0xBAD4841A >> 56] (rcp=3134489626) */ \
+ ENTRY(25264543 , 0xA9FFF2FF, 56), /* [N * 0xA9FFF2FF >> 56] (rcp=2852123391) */ \
+ ENTRY(27765763 , 0x9AAF8BF3, 56), /* [N * 0x9AAF8BF3 >> 56] (rcp=2595195891) */ \
+ ENTRY(30514607 , 0x8CC04E18, 56), /* [N * 0x8CC04E18 >> 56] (rcp=2361413144) */ \
+ ENTRY(33535561 , 0x80127068, 56), /* [N * 0x80127068 >> 56] (rcp=2148692072) */ \
+ ENTRY(36855587 , 0xE911F0BB, 57), /* [N * 0xE911F0BB >> 57] (rcp=3910267067) */ \
+ ENTRY(38661533 , 0xDE2ED7BE, 57), /* [N * 0xDE2ED7BE >> 57] (rcp=3727611838) */ \
+ ENTRY(40555961 , 0xD3CDF2FD, 57), /* [N * 0xD3CDF2FD >> 57] (rcp=3553489661) */ \
+ ENTRY(42543269 , 0xC9E9196C, 57), /* [N * 0xC9E9196C >> 57] (rcp=3387496812) */ \
+ ENTRY(44627909 , 0xC07A9EB6, 57), /* [N * 0xC07A9EB6 >> 57] (rcp=3229261494) */ \
+ ENTRY(46814687 , 0xB77CEF65, 57), /* [N * 0xB77CEF65 >> 57] (rcp=3078418277) */ \
+ ENTRY(49108607 , 0xAEEAC65C, 57), /* [N * 0xAEEAC65C >> 57] (rcp=2934621788) */ \
+ ENTRY(51514987 , 0xA6BF0EF0, 57), /* [N * 0xA6BF0EF0 >> 57] (rcp=2797539056) */ \
+ ENTRY(54039263 , 0x9EF510B5, 57), /* [N * 0x9EF510B5 >> 57] (rcp=2666860725) */ \
+ ENTRY(56687207 , 0x97883B42, 57), /* [N * 0x97883B42 >> 57] (rcp=2542287682) */ \
+ ENTRY(59464897 , 0x907430ED, 57), /* [N * 0x907430ED >> 57] (rcp=2423533805) */ \
+ ENTRY(62378699 , 0x89B4CA91, 57), /* [N * 0x89B4CA91 >> 57] (rcp=2310326929) */ \
+ ENTRY(65435273 , 0x83461568, 57), /* [N * 0x83461568 >> 57] (rcp=2202408296) */ \
+ ENTRY(68641607 , 0xFA489AA8, 58), /* [N * 0xFA489AA8 >> 58] (rcp=4199062184) */ \
+ ENTRY(72005051 , 0xEE97B1C5, 58), /* [N * 0xEE97B1C5 >> 58] (rcp=4002918853) */ \
+ ENTRY(75533323 , 0xE3729293, 58), /* [N * 0xE3729293 >> 58] (rcp=3815936659) */ \
+ ENTRY(79234469 , 0xD8D2BBA3, 58), /* [N * 0xD8D2BBA3 >> 58] (rcp=3637689251) */ \
+ ENTRY(83116967 , 0xCEB1F196, 58), /* [N * 0xCEB1F196 >> 58] (rcp=3467768214) */ \
+ ENTRY(87189709 , 0xC50A4426, 58), /* [N * 0xC50A4426 >> 58] (rcp=3305784358) */ \
+ ENTRY(91462061 , 0xBBD6052B, 58), /* [N * 0xBBD6052B >> 58] (rcp=3151365419) */ \
+ ENTRY(95943737 , 0xB30FD999, 58), /* [N * 0xB30FD999 >> 58] (rcp=3004160409) */ \
+ ENTRY(100644991 , 0xAAB29CED, 58), /* [N * 0xAAB29CED >> 58] (rcp=2863832301) */ \
+ ENTRY(105576619 , 0xA2B96421, 58), /* [N * 0xA2B96421 >> 58] (rcp=2730058785) */ \
+ ENTRY(110749901 , 0x9B1F8434, 58), /* [N * 0x9B1F8434 >> 58] (rcp=2602533940) */ \
+ ENTRY(116176651 , 0x93E08B4A, 58), /* [N * 0x93E08B4A >> 58] (rcp=2480966474) */ \
+ ENTRY(121869317 , 0x8CF837E0, 58), /* [N * 0x8CF837E0 >> 58] (rcp=2365077472) */ \
+ ENTRY(127840913 , 0x86627F01, 58), /* [N * 0x86627F01 >> 58] (rcp=2254601985) */ \
+ ENTRY(134105159 , 0x801B8178, 58), /* [N * 0x801B8178 >> 58] (rcp=2149286264) */ \
+ ENTRY(140676353 , 0xF43F294F, 59), /* [N * 0xF43F294F >> 59] (rcp=4097780047) */ \
+ ENTRY(147569509 , 0xE8D67089, 59), /* [N * 0xE8D67089 >> 59] (rcp=3906367625) */ \
+ ENTRY(154800449 , 0xDDF6243C, 59), /* [N * 0xDDF6243C >> 59] (rcp=3723895868) */ \
+ ENTRY(162385709 , 0xD397E6AE, 59), /* [N * 0xD397E6AE >> 59] (rcp=3549947566) */ \
+ ENTRY(170342629 , 0xC9B5A65A, 59), /* [N * 0xC9B5A65A >> 59] (rcp=3384125018) */ \
+ ENTRY(178689419 , 0xC0499865, 59), /* [N * 0xC0499865 >> 59] (rcp=3226048613) */ \
+ ENTRY(187445201 , 0xB74E35FA, 59), /* [N * 0xB74E35FA >> 59] (rcp=3075356154) */ \
+ ENTRY(196630033 , 0xAEBE3AC1, 59), /* [N * 0xAEBE3AC1 >> 59] (rcp=2931702465) */ \
+ ENTRY(206264921 , 0xA694A37F, 59), /* [N * 0xA694A37F >> 59] (rcp=2794759039) */ \
+ ENTRY(216371963 , 0x9ECCA59F, 59), /* [N * 0x9ECCA59F >> 59] (rcp=2664211871) */ \
+ ENTRY(226974197 , 0x9761B6AE, 59), /* [N * 0x9761B6AE >> 59] (rcp=2539763374) */ \
+ ENTRY(238095983 , 0x904F79A1, 59), /* [N * 0x904F79A1 >> 59] (rcp=2421127585) */ \
+ ENTRY(249762697 , 0x8991CD1F, 59), /* [N * 0x8991CD1F >> 59] (rcp=2308033823) */ \
+ ENTRY(262001071 , 0x8324BCA5, 59), /* [N * 0x8324BCA5 >> 59] (rcp=2200222885) */ \
+ ENTRY(274839137 , 0xFA090732, 60), /* [N * 0xFA090732 >> 60] (rcp=4194895666) */ \
+ ENTRY(288306269 , 0xEE5B16ED, 60), /* [N * 0xEE5B16ED >> 60] (rcp=3998947053) */ \
+ ENTRY(302433337 , 0xE338CE49, 60), /* [N * 0xE338CE49 >> 60] (rcp=3812150857) */ \
+ ENTRY(317252587 , 0xD89BABC0, 60), /* [N * 0xD89BABC0 >> 60] (rcp=3634080704) */ \
+ ENTRY(374358107 , 0xB790EF43, 60), /* [N * 0xB790EF43 >> 60] (rcp=3079728963) */ \
+ ENTRY(441742621 , 0x9B908414, 60), /* [N * 0x9B908414 >> 60] (rcp=2609939476) */ \
+ ENTRY(521256293 , 0x83D596FA, 60), /* [N * 0x83D596FA >> 60] (rcp=2211813114) */ \
+ ENTRY(615082441 , 0xDF72B16E, 61), /* [N * 0xDF72B16E >> 61] (rcp=3748835694) */ \
+ ENTRY(725797313 , 0xBD5CDB3B, 61), /* [N * 0xBD5CDB3B >> 61] (rcp=3176979259) */ \
+ ENTRY(856440829 , 0xA07A14E9, 61), /* [N * 0xA07A14E9 >> 61] (rcp=2692355305) */ \
+ ENTRY(1010600209, 0x87FF5289, 61), /* [N * 0x87FF5289 >> 61] (rcp=2281656969) */ \
+ ENTRY(1192508257, 0xE6810540, 62), /* [N * 0xE6810540 >> 62] (rcp=3867215168) */ \
+ ENTRY(1407159797, 0xC357A480, 62), /* [N * 0xC357A480 >> 62] (rcp=3277300864) */ \
+ ENTRY(1660448617, 0xA58B5B4F, 62), /* [N * 0xA58B5B4F >> 62] (rcp=2777373519) */ \
+ ENTRY(1959329399, 0x8C4AB55F, 62), /* [N * 0x8C4AB55F >> 62] (rcp=2353706335) */ \
+ ENTRY(2312008693, 0xEDC86320, 63), /* [N * 0xEDC86320 >> 63] (rcp=3989332768) */ \
+ ENTRY(2728170257, 0xC982C4D2, 63), /* [N * 0xC982C4D2 >> 63] (rcp=3380790482) */ \
+ ENTRY(3219240923, 0xAAC599B6, 63) /* [N * 0xAAC599B6 >> 63] (rcp=2865076662) */
+
+
+struct HashPrime {
+ //! Prime number
+ uint32_t prime;
+ //! Reciprocal to turn division into multiplication.
+ uint32_t rcp;
+};
+
+static const HashPrime ArenaHash_prime_array[] = {
+ #define E(PRIME, RCP, SHIFT) { PRIME, RCP }
+ ASMJIT_POPULATE_PRIMES(E)
+ #undef E
+};
+
+static const uint8_t ArenaHash_prime_shift[] = {
+ #define E(PRIME, RCP, SHIFT) uint8_t(SHIFT)
+ ASMJIT_POPULATE_PRIMES(E)
+ #undef E
+};
+
+// ArenaHashBase - Rehash
+// =====================
+
+void ArenaHashBase::_rehash(Arena& arena, uint32_t prime_index) noexcept {
+ ASMJIT_ASSERT(prime_index < ASMJIT_ARRAY_SIZE(ArenaHash_prime_array));
+ uint32_t new_count = ArenaHash_prime_array[prime_index].prime;
+
+ ArenaHashNode** old_data = _data;
+ ArenaHashNode** new_data = reinterpret_cast<ArenaHashNode**>(arena.alloc_reusable_zeroed(size_t(new_count) * sizeof(ArenaHashNode*)));
+
+ // We can still store nodes into the table, but it will degrade.
+ if (ASMJIT_UNLIKELY(new_data == nullptr)) {
+ return;
+ }
+
+ uint32_t i;
+ uint32_t old_count = _buckets_count;
+
+ _data = new_data;
+ _buckets_count = new_count;
+ _buckets_grow = uint32_t(new_count * 0.9);
+ _rcp_value = ArenaHash_prime_array[prime_index].rcp;
+ _rcp_shift = ArenaHash_prime_shift[prime_index];
+ _prime_index = uint8_t(prime_index);
+
+ for (i = 0; i < old_count; i++) {
+ ArenaHashNode* node = old_data[i];
+ while (node) {
+ ArenaHashNode* next = node->_hash_next;
+ uint32_t hash_mod = _calc_mod(node->_hash_code);
+
+ node->_hash_next = new_data[hash_mod];
+ new_data[hash_mod] = node;
+ node = next;
+ }
+ }
+
+ if (old_data != _embedded) {
+ arena.free_reusable(old_data, old_count * sizeof(ArenaHashNode*));
+ }
+}
+
+// ArenaHashBase - Operations
+// =========================
+
+ArenaHashNode* ArenaHashBase::_insert(Arena& arena, ArenaHashNode* node) noexcept {
+ uint32_t hash_mod = _calc_mod(node->_hash_code);
+ ArenaHashNode* next = _data[hash_mod];
+
+ node->_hash_next = next;
+ _data[hash_mod] = node;
+
+ if (++_size > _buckets_grow) {
+ uint32_t prime_index = Support::min<uint32_t>(_prime_index + 2, ASMJIT_ARRAY_SIZE(ArenaHash_prime_array) - 1);
+ if (prime_index > _prime_index) {
+ _rehash(arena, prime_index);
+ }
+ }
+
+ return node;
+}
+
+ArenaHashNode* ArenaHashBase::_remove(Arena& arena, ArenaHashNode* node) noexcept {
+ Support::maybe_unused(arena);
+ uint32_t hash_mod = _calc_mod(node->_hash_code);
+
+ ArenaHashNode** prev_ptr = &_data[hash_mod];
+ ArenaHashNode* p = *prev_ptr;
+
+ while (p) {
+ if (p == node) {
+ *prev_ptr = p->_hash_next;
+ _size--;
+ return node;
+ }
+
+ prev_ptr = &p->_hash_next;
+ p = *prev_ptr;
+ }
+
+ return nullptr;
+}
+
+// ArenaHashBase - Tests
+// ====================
+
+#if defined(ASMJIT_TEST)
+struct MyHashNode : public ArenaHashNode {
+ inline MyHashNode(uint32_t key) noexcept
+ : ArenaHashNode(key),
+ _key(key) {}
+
+ uint32_t _key;
+};
+
+struct MyKeyMatcher {
+ inline MyKeyMatcher(uint32_t key) noexcept
+ : _key(key) {}
+
+ inline uint32_t hash_code() const noexcept { return _key; }
+ inline bool matches(const MyHashNode* node) const noexcept { return node->_key == _key; }
+
+ uint32_t _key;
+};
+
+UNIT(arena_hash) {
+ uint32_t kCount = BrokenAPI::has_arg("--quick") ? 1000 : 10000;
+
+ Arena arena(4096);
+ ArenaHash<MyHashNode> hash_table;
+
+ uint32_t key;
+ INFO("Inserting %u elements to HashTable", unsigned(kCount));
+ for (key = 0; key < kCount; key++) {
+ hash_table.insert(arena, arena.new_oneshot<MyHashNode>(key));
+ }
+
+ uint32_t count = kCount;
+ INFO("Removing %u elements from HashTable and validating each operation", unsigned(kCount));
+ do {
+ MyHashNode* node;
+
+ for (key = 0; key < count; key++) {
+ node = hash_table.get(MyKeyMatcher(key));
+ EXPECT_NOT_NULL(node);
+ EXPECT_EQ(node->_key, key);
+ }
+
+ {
+ count--;
+ node = hash_table.get(MyKeyMatcher(count));
+ hash_table.remove(arena, node);
+
+ node = hash_table.get(MyKeyMatcher(count));
+ EXPECT_NULL(node);
+ }
+ } while (count);
+
+ EXPECT_TRUE(hash_table.is_empty());
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/arenahash.h b/3rdparty/asmjit/asmjit/support/arenahash.h
new file mode 100644
index 00000000000..c6481ab0098
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenahash.h
@@ -0,0 +1,198 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENAHASH_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENAHASH_H_INCLUDED
+
+#include <asmjit/support/arena.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! Node used by \ref ArenaHash template.
+//!
+//! You must provide function `bool eq(const Key& key)` in order to make `ArenaHash::get()` working.
+class ArenaHashNode {
+public:
+ ASMJIT_NONCOPYABLE(ArenaHashNode)
+
+ ASMJIT_INLINE_NODEBUG explicit ArenaHashNode(uint32_t hash_code = 0u, uint32_t custom_data = 0u) noexcept
+ : _hash_code(hash_code),
+ _custom_data(custom_data) {}
+
+ //! Next node in the chain, null if it terminates the chain.
+ ArenaHashNode* _hash_next {};
+ //! Precalculated hash-code of key.
+ uint32_t _hash_code {};
+ //! Padding, can be reused by any Node that inherits `ArenaHashNode`.
+ uint32_t _custom_data {};
+};
+
+//! Base class used by \ref ArenaHash template
+class ArenaHashBase {
+public:
+ ASMJIT_NONCOPYABLE(ArenaHashBase)
+
+ //! Buckets data.
+ ArenaHashNode** _data;
+ //! Count of records inserted into the hash table.
+ size_t _size;
+ //! Count of hash buckets.
+ uint32_t _buckets_count;
+ //! When buckets array should grow (only checked after insertion).
+ uint32_t _buckets_grow;
+ //! Reciprocal value of `_buckets_count`.
+ uint32_t _rcp_value;
+ //! How many bits to shift right when hash is multiplied with `_rcp_value`.
+ uint8_t _rcp_shift;
+ //! Prime value index in internal prime array.
+ uint8_t _prime_index;
+
+ //! Embedded data, used by empty hash tables.
+ ArenaHashNode* _embedded[1];
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaHashBase() noexcept {
+ reset();
+ }
+
+ inline ArenaHashBase(ArenaHashBase&& other) noexcept {
+ _data = other._data;
+ _size = other._size;
+ _buckets_count = other._buckets_count;
+ _buckets_grow = other._buckets_grow;
+ _rcp_value = other._rcp_value;
+ _rcp_shift = other._rcp_shift;
+ _prime_index = other._prime_index;
+ _embedded[0] = other._embedded[0];
+
+ if (_data == other._embedded) {
+ _data = _embedded;
+ }
+ }
+
+ inline void reset() noexcept {
+ _data = _embedded;
+ _size = 0;
+ _buckets_count = 1;
+ _buckets_grow = 1;
+ _rcp_value = 1;
+ _rcp_shift = 0;
+ _prime_index = 0;
+ _embedded[0] = nullptr;
+ }
+
+ inline void release(Arena& arena) noexcept {
+ ArenaHashNode** old_data = _data;
+ if (old_data != _embedded) {
+ arena.free_reusable(old_data, _buckets_count * sizeof(ArenaHashNode*));
+ }
+ reset();
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _size == 0; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ inline void _swap(ArenaHashBase& other) noexcept {
+ std::swap(_data, other._data);
+ std::swap(_size, other._size);
+ std::swap(_buckets_count, other._buckets_count);
+ std::swap(_buckets_grow, other._buckets_grow);
+ std::swap(_rcp_value, other._rcp_value);
+ std::swap(_rcp_shift, other._rcp_shift);
+ std::swap(_prime_index, other._prime_index);
+ std::swap(_embedded[0], other._embedded[0]);
+
+ if (_data == other._embedded) {
+ _data = _embedded;
+ }
+
+ if (other._data == _embedded) {
+ other._data = other._embedded;
+ }
+ }
+
+ //! \cond INTERNAL
+ inline uint32_t _calc_mod(uint32_t hash) const noexcept {
+ uint32_t x = uint32_t((uint64_t(hash) * _rcp_value) >> _rcp_shift);
+ return hash - x * _buckets_count;
+ }
+
+ ASMJIT_API void _rehash(Arena& arena, uint32_t prime_index) noexcept;
+ ASMJIT_API ArenaHashNode* _insert(Arena& arena, ArenaHashNode* node) noexcept;
+ ASMJIT_API ArenaHashNode* _remove(Arena& arena, ArenaHashNode* node) noexcept;
+ //! \endcond
+
+ //! \}
+};
+
+//! Low-level hash table specialized for storing string keys and POD values.
+//!
+//! This hash table allows duplicates to be inserted (the API is so low level that it's up to you if you allow it or
+//! not, as you should first `get()` the node and then modify it or insert a new node by using `insert()`, depending
+//! on the intention).
+template<typename NodeT>
+class ArenaHash : public ArenaHashBase {
+public:
+ ASMJIT_NONCOPYABLE(ArenaHash)
+
+ using Node = NodeT;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaHash() noexcept
+ : ArenaHashBase() {}
+
+ ASMJIT_INLINE_NODEBUG ArenaHash(ArenaHash&& other) noexcept
+ : ArenaHash(other) {}
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void swap(ArenaHash& other) noexcept { ArenaHashBase::_swap(other); }
+
+ template<typename KeyT>
+ [[nodiscard]]
+ inline NodeT* get(const KeyT& key) const noexcept {
+ uint32_t hash_mod = _calc_mod(key.hash_code());
+ NodeT* node = static_cast<NodeT*>(_data[hash_mod]);
+
+ while (node && !key.matches(node)) {
+ node = static_cast<NodeT*>(node->_hash_next);
+ }
+ return node;
+ }
+
+ ASMJIT_INLINE_NODEBUG NodeT* insert(Arena& arena, NodeT* node) noexcept { return static_cast<NodeT*>(_insert(arena, node)); }
+ ASMJIT_INLINE_NODEBUG NodeT* remove(Arena& arena, NodeT* node) noexcept { return static_cast<NodeT*>(_remove(arena, node)); }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENAHASH_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenalist.cpp b/3rdparty/asmjit/asmjit/support/arenalist.cpp
new file mode 100644
index 00000000000..2fbed36ce0d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenalist.cpp
@@ -0,0 +1,163 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenalist.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// ArenaList - Tests
+// ================
+
+#if defined(ASMJIT_TEST)
+class MyListNode : public ArenaListNode<MyListNode> {};
+
+UNIT(arena_list) {
+ Arena arena(4096);
+ ArenaList<MyListNode> list;
+
+ MyListNode* a = arena.new_oneshot<MyListNode>();
+ MyListNode* b = arena.new_oneshot<MyListNode>();
+ MyListNode* c = arena.new_oneshot<MyListNode>();
+ MyListNode* d = arena.new_oneshot<MyListNode>();
+
+ INFO("Append / Unlink");
+
+ // []
+ EXPECT_TRUE(list.is_empty());
+
+ // [A]
+ list.append(a);
+ EXPECT_FALSE(list.is_empty());
+ EXPECT_EQ(list.first(), a);
+ EXPECT_EQ(list.last(), a);
+ EXPECT_NULL(a->prev());
+ EXPECT_NULL(a->next());
+
+ // [A, B]
+ list.append(b);
+ EXPECT_EQ(list.first(), a);
+ EXPECT_EQ(list.last(), b);
+ EXPECT_NULL(a->prev());
+ EXPECT_EQ(a->next(), b);
+ EXPECT_EQ(b->prev(), a);
+ EXPECT_NULL(b->next());
+
+ // [A, B, C]
+ list.append(c);
+ EXPECT_EQ(list.first(), a);
+ EXPECT_EQ(list.last(), c);
+ EXPECT_NULL(a->prev());
+ EXPECT_EQ(a->next(), b);
+ EXPECT_EQ(b->prev(), a);
+ EXPECT_EQ(b->next(), c);
+ EXPECT_EQ(c->prev(), b);
+ EXPECT_NULL(c->next());
+
+ // [B, C]
+ list.unlink(a);
+ EXPECT_EQ(list.first(), b);
+ EXPECT_EQ(list.last(), c);
+ EXPECT_NULL(a->prev());
+ EXPECT_NULL(a->next());
+ EXPECT_NULL(b->prev());
+ EXPECT_EQ(b->next(), c);
+ EXPECT_EQ(c->prev(), b);
+ EXPECT_NULL(c->next());
+
+ // [B]
+ list.unlink(c);
+ EXPECT_EQ(list.first(), b);
+ EXPECT_EQ(list.last(), b);
+ EXPECT_NULL(b->prev());
+ EXPECT_NULL(b->next());
+ EXPECT_NULL(c->prev());
+ EXPECT_NULL(c->next());
+
+ // []
+ list.unlink(b);
+ EXPECT_TRUE(list.is_empty());
+ EXPECT_NULL(list.first());
+ EXPECT_NULL(list.last());
+ EXPECT_NULL(b->prev());
+ EXPECT_NULL(b->next());
+
+ INFO("Prepend / Unlink");
+
+ // [A]
+ list.prepend(a);
+ EXPECT_FALSE(list.is_empty());
+ EXPECT_EQ(list.first(), a);
+ EXPECT_EQ(list.last(), a);
+ EXPECT_NULL(a->prev());
+ EXPECT_NULL(a->next());
+
+ // [B, A]
+ list.prepend(b);
+ EXPECT_EQ(list.first(), b);
+ EXPECT_EQ(list.last(), a);
+ EXPECT_NULL(b->prev());
+ EXPECT_EQ(b->next(), a);
+ EXPECT_EQ(a->prev(), b);
+ EXPECT_NULL(a->next());
+
+ INFO("InsertAfter / InsertBefore");
+
+ // [B, A, C]
+ list.insert_after(a, c);
+ EXPECT_EQ(list.first(), b);
+ EXPECT_EQ(list.last(), c);
+ EXPECT_NULL(b->prev());
+ EXPECT_EQ(b->next(), a);
+ EXPECT_EQ(a->prev(), b);
+ EXPECT_EQ(a->next(), c);
+ EXPECT_EQ(c->prev(), a);
+ EXPECT_NULL(c->next());
+
+ // [B, D, A, C]
+ list.insert_before(a, d);
+ EXPECT_EQ(list.first(), b);
+ EXPECT_EQ(list.last(), c);
+ EXPECT_NULL(b->prev());
+ EXPECT_EQ(b->next(), d);
+ EXPECT_EQ(d->prev(), b);
+ EXPECT_EQ(d->next(), a);
+ EXPECT_EQ(a->prev(), d);
+ EXPECT_EQ(a->next(), c);
+ EXPECT_EQ(c->prev(), a);
+ EXPECT_NULL(c->next());
+
+ INFO("PopFirst / Pop");
+
+ // [D, A, C]
+ EXPECT_EQ(list.pop_first(), b);
+ EXPECT_NULL(b->prev());
+ EXPECT_NULL(b->next());
+
+ EXPECT_EQ(list.first(), d);
+ EXPECT_EQ(list.last(), c);
+ EXPECT_NULL(d->prev());
+ EXPECT_EQ(d->next(), a);
+ EXPECT_EQ(a->prev(), d);
+ EXPECT_EQ(a->next(), c);
+ EXPECT_EQ(c->prev(), a);
+ EXPECT_NULL(c->next());
+
+ // [D, A]
+ EXPECT_EQ(list.pop(), c);
+ EXPECT_NULL(c->prev());
+ EXPECT_NULL(c->next());
+
+ EXPECT_EQ(list.first(), d);
+ EXPECT_EQ(list.last(), a);
+ EXPECT_NULL(d->prev());
+ EXPECT_EQ(d->next(), a);
+ EXPECT_EQ(a->prev(), d);
+ EXPECT_NULL(a->next());
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/arenalist.h b/3rdparty/asmjit/asmjit/support/arenalist.h
new file mode 100644
index 00000000000..84d6107a026
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenalist.h
@@ -0,0 +1,221 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENALIST_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENALIST_H_INCLUDED
+
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! Node used by \ref ArenaList template.
+template<typename NodeT>
+class ArenaListNode {
+public:
+ ASMJIT_NONCOPYABLE(ArenaListNode)
+
+ //! \name Constants
+ //! \{
+
+ static inline constexpr size_t kNodeIndexPrev = 0;
+ static inline constexpr size_t kNodeIndexNext = 1;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ NodeT* _list_nodes[2];
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaListNode() noexcept
+ : _list_nodes{nullptr, nullptr} {}
+
+ ASMJIT_INLINE_NODEBUG ArenaListNode(ArenaListNode&& other) noexcept
+ : _list_nodes{other._list_nodes[0], other._list_nodes[1]} {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_prev() const noexcept { return _list_nodes[kNodeIndexPrev] != nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_next() const noexcept { return _list_nodes[kNodeIndexNext] != nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* prev() const noexcept { return _list_nodes[kNodeIndexPrev]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* next() const noexcept { return _list_nodes[kNodeIndexNext]; }
+
+ //! \}
+};
+
+//! Arena-allocated list container that uses nodes of `NodeT` type.
+template <typename NodeT>
+class ArenaList {
+public:
+ ASMJIT_NONCOPYABLE(ArenaList)
+
+ //! \name Constants
+ //! \{
+
+ static inline constexpr size_t kNodeIndexFirst = 0;
+ static inline constexpr size_t kNodeIndexLast = 1;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ NodeT* _nodes[2] {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaList() noexcept {}
+
+ ASMJIT_INLINE_NODEBUG ArenaList(ArenaList&& other) noexcept
+ : _nodes { other._nodes[0], other._nodes[1] } {}
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _nodes[0] = nullptr;
+ _nodes[1] = nullptr;
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _nodes[0] == nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* first() const noexcept { return _nodes[kNodeIndexFirst]; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* last() const noexcept { return _nodes[kNodeIndexLast]; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void swap(ArenaList& other) noexcept {
+ std::swap(_nodes[0], other._nodes[0]);
+ std::swap(_nodes[1], other._nodes[1]);
+ }
+
+ // Can be used to both append and prepend.
+ inline void _add_node(NodeT* node, size_t dir) noexcept {
+ NodeT* prev = _nodes[dir];
+
+ node->_list_nodes[!dir] = prev;
+ _nodes[dir] = node;
+ if (prev) {
+ prev->_list_nodes[dir] = node;
+ }
+ else {
+ _nodes[!dir] = node;
+ }
+ }
+
+ // Can be used to both append and prepend.
+ inline void _insert_node(NodeT* ref, NodeT* node, size_t dir) noexcept {
+ ASMJIT_ASSERT(ref != nullptr);
+
+ NodeT* prev = ref;
+ NodeT* next = ref->_list_nodes[dir];
+
+ prev->_list_nodes[dir] = node;
+ if (next) {
+ next->_list_nodes[!dir] = node;
+ }
+ else {
+ _nodes[dir] = node;
+ }
+
+ node->_list_nodes[!dir] = prev;
+ node->_list_nodes[ dir] = next;
+ }
+
+ ASMJIT_INLINE_NODEBUG void append(NodeT* node) noexcept { _add_node(node, kNodeIndexLast); }
+ ASMJIT_INLINE_NODEBUG void prepend(NodeT* node) noexcept { _add_node(node, kNodeIndexFirst); }
+
+ ASMJIT_INLINE_NODEBUG void insert_after(NodeT* ref, NodeT* node) noexcept { _insert_node(ref, node, NodeT::kNodeIndexNext); }
+ ASMJIT_INLINE_NODEBUG void insert_before(NodeT* ref, NodeT* node) noexcept { _insert_node(ref, node, NodeT::kNodeIndexPrev); }
+
+ inline NodeT* unlink(NodeT* node) noexcept {
+ NodeT* prev = node->prev();
+ NodeT* next = node->next();
+
+ if (prev) { prev->_list_nodes[1] = next; } else { _nodes[0] = next; }
+ if (next) { next->_list_nodes[0] = prev; } else { _nodes[1] = prev; }
+
+ node->_list_nodes[0] = nullptr;
+ node->_list_nodes[1] = nullptr;
+
+ return node;
+ }
+
+ [[nodiscard]]
+ inline NodeT* pop_first() noexcept {
+ NodeT* node = _nodes[0];
+ ASMJIT_ASSERT(node != nullptr);
+
+ NodeT* next = node->next();
+ _nodes[0] = next;
+
+ if (next) {
+ next->_list_nodes[0] = nullptr;
+ node->_list_nodes[1] = nullptr;
+ }
+ else {
+ _nodes[1] = nullptr;
+ }
+
+ return node;
+ }
+
+ [[nodiscard]]
+ inline NodeT* pop() noexcept {
+ NodeT* node = _nodes[1];
+ ASMJIT_ASSERT(node != nullptr);
+
+ NodeT* prev = node->prev();
+ _nodes[1] = prev;
+
+ if (prev) {
+ prev->_list_nodes[1] = nullptr;
+ node->_list_nodes[0] = nullptr;
+ }
+ else {
+ _nodes[0] = nullptr;
+ }
+
+ return node;
+ }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENALIST_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenapool.h b/3rdparty/asmjit/asmjit/support/arenapool.h
new file mode 100644
index 00000000000..398d3f03783
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenapool.h
@@ -0,0 +1,66 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENAPOOL_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENAPOOL_H_INCLUDED
+
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! Helper class for implementing pooling of arena-allocated objects.
+template<typename T, size_t Size = sizeof(T)>
+class ArenaPool {
+public:
+ ASMJIT_NONCOPYABLE(ArenaPool)
+
+ struct Link { Link* next; };
+ Link* _data {};
+
+ ASMJIT_INLINE_NODEBUG ArenaPool() noexcept = default;
+
+ //! Resets the arena pool.
+ //!
+ //! Reset must be called before the associated \ref Arena is reset or destroyed to invalidate all pooled chunks.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _data = nullptr; }
+
+ //! Allocates a memory (or reuses the existing allocation) of `Size` (in bytes).
+ [[nodiscard]]
+ ASMJIT_INLINE T* alloc(Arena& arena) noexcept {
+ Link* p = _data;
+ if (ASMJIT_UNLIKELY(p == nullptr)) {
+ return arena.alloc_oneshot<T>(Arena::aligned_size(Size));
+ }
+ _data = p->next;
+ return static_cast<T*>(static_cast<void*>(p));
+ }
+
+ //! Pools the previously allocated memory.
+ ASMJIT_INLINE void release(T* ptr) noexcept {
+ ASMJIT_ASSERT(ptr != nullptr);
+ Link* p = reinterpret_cast<Link*>(ptr);
+
+ p->next = _data;
+ _data = p;
+ }
+
+ ASMJIT_INLINE size_t pooled_item_count() const noexcept {
+ size_t n = 0;
+ Link* p = _data;
+ while (p) {
+ n++;
+ p = p->next;
+ }
+ return n;
+ }
+};
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENAPOOL_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenastring.h b/3rdparty/asmjit/asmjit/support/arenastring.h
new file mode 100644
index 00000000000..d424eb80e3c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenastring.h
@@ -0,0 +1,123 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENASTRING_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENASTRING_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+#include <asmjit/support/arena.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! A helper class used by \ref ArenaString implementation.
+struct ArenaStringBase {
+ union {
+ struct {
+ uint32_t _size;
+ char _embedded[sizeof(void*) * 2 - 4];
+ };
+ struct {
+ void* _dummy;
+ char* _external;
+ };
+ };
+
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _dummy = nullptr;
+ _external = nullptr;
+ }
+
+ Error set_data(Arena& arena, uint32_t max_embedded_size, const char* str, size_t size) noexcept {
+ if (size == SIZE_MAX)
+ size = strlen(str);
+
+ if (size <= max_embedded_size) {
+ memcpy(_embedded, str, size);
+ _embedded[size] = '\0';
+ }
+ else {
+ char* external = static_cast<char*>(arena.dup(str, size, true));
+ if (ASMJIT_UNLIKELY(!external))
+ return make_error(Error::kOutOfMemory);
+ _external = external;
+ }
+
+ _size = uint32_t(size);
+ return Error::kOk;
+ }
+};
+
+//! A string template that can be arena-allocated.
+//!
+//! Helps with creating strings that can be either statically allocated if they are small, or externally allocated
+//! in case their size exceeds the limit. The `N` represents the size of the whole `ArenaString` structure, based on
+//! that size the maximum size of the internal buffer is determined.
+template<size_t N>
+class ArenaString {
+public:
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uint32_t kWholeSize = (N > sizeof(ArenaStringBase)) ? uint32_t(N) : uint32_t(sizeof(ArenaStringBase));
+ static inline constexpr uint32_t kMaxEmbeddedSize = kWholeSize - 5;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ union {
+ ArenaStringBase _base;
+ char _whole_data[kWholeSize];
+ };
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaString() noexcept { reset(); }
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _base.reset(); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the string is empty.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _base._size == 0; }
+
+ //! Returns the string data.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return _base._size <= kMaxEmbeddedSize ? _base._embedded : _base._external; }
+
+ //! Returns the string size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _base._size; }
+
+ //! Tests whether the string is embedded (e.g. no dynamically allocated).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_embedded() const noexcept { return _base._size <= kMaxEmbeddedSize; }
+
+ //! Copies a new `data` of the given `size` to the string.
+ //!
+ //! If the `size` exceeds the internal buffer the given `arena` will be used to duplicate the data, otherwise
+ //! the internal buffer will be used as a storage.
+ ASMJIT_INLINE_NODEBUG Error set_data(Arena& arena, const char* data, size_t size) noexcept {
+ return _base.set_data(arena, kMaxEmbeddedSize, data, size);
+ }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENASTRING_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenatree.cpp b/3rdparty/asmjit/asmjit/support/arenatree.cpp
new file mode 100644
index 00000000000..90f24ff4b4d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenatree.cpp
@@ -0,0 +1,98 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenatree.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// ArenaTreeBase - Tests
+// ====================
+
+#if defined(ASMJIT_TEST)
+template<typename NodeT>
+struct ArenaRBUnit {
+ using Tree = ArenaTree<NodeT>;
+
+ static void verify_tree(Tree& tree) noexcept {
+ EXPECT_GT(check_height(static_cast<NodeT*>(tree._root)), 0);
+ }
+
+ // Check whether the Red-Black tree is valid.
+ static int check_height(NodeT* node) noexcept {
+ if (!node) return 1;
+
+ NodeT* ln = node->left();
+ NodeT* rn = node->right();
+
+ // Invalid tree.
+ EXPECT_TRUE(ln == nullptr || *ln < *node);
+ EXPECT_TRUE(rn == nullptr || *rn > *node);
+
+ // Red violation.
+ EXPECT_TRUE(!node->is_red() || (!ArenaTreeNode::_is_valid_red(ln) && !ArenaTreeNode::_is_valid_red(rn)));
+
+ // Black violation.
+ int lh = check_height(ln);
+ int rh = check_height(rn);
+ EXPECT_TRUE(!lh || !rh || lh == rh);
+
+ // Only count black links.
+ return (lh && rh) ? lh + !node->is_red() : 0;
+ }
+};
+
+class MyRBNode : public ArenaTreeNodeT<MyRBNode> {
+public:
+ ASMJIT_NONCOPYABLE(MyRBNode)
+
+ inline explicit MyRBNode(uint32_t key) noexcept
+ : _key(key) {}
+
+ inline bool operator<(const MyRBNode& other) const noexcept { return _key < other._key; }
+ inline bool operator>(const MyRBNode& other) const noexcept { return _key > other._key; }
+
+ inline bool operator<(uint32_t query_key) const noexcept { return _key < query_key; }
+ inline bool operator>(uint32_t query_key) const noexcept { return _key > query_key; }
+
+ uint32_t _key;
+};
+
+UNIT(arena_rbtree) {
+ uint32_t kCount = BrokenAPI::has_arg("--quick") ? 1000 : 10000;
+
+ Arena arena(4096);
+ ArenaTree<MyRBNode> rb_tree;
+
+ uint32_t key;
+ INFO("Inserting %u elements to RBTree and validating each operation", unsigned(kCount));
+ for (key = 0; key < kCount; key++) {
+ rb_tree.insert(arena.new_oneshot<MyRBNode>(key));
+ ArenaRBUnit<MyRBNode>::verify_tree(rb_tree);
+ }
+
+ uint32_t count = kCount;
+ INFO("Removing %u elements from RBTree and validating each operation", unsigned(kCount));
+ do {
+ MyRBNode* node;
+
+ for (key = 0; key < count; key++) {
+ node = rb_tree.get(key);
+ EXPECT_NOT_NULL(node);
+ EXPECT_EQ(node->_key, key);
+ }
+
+ node = rb_tree.get(--count);
+ rb_tree.remove(node);
+ ArenaRBUnit<MyRBNode>::verify_tree(rb_tree);
+ } while (count);
+
+ EXPECT_TRUE(rb_tree.is_empty());
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/arenatree.h b/3rdparty/asmjit/asmjit/support/arenatree.h
new file mode 100644
index 00000000000..6cd5dba8423
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenatree.h
@@ -0,0 +1,407 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENATREE_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENATREE_H_INCLUDED
+
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! RB-Tree node.
+//!
+//! The color is stored in a least significant bit of the `left` node.
+//!
+//! WARNING: Always use accessors to access left and right children.
+class ArenaTreeNode {
+public:
+ ASMJIT_NONCOPYABLE(ArenaTreeNode)
+
+ //! \name Constants
+ //! \{
+
+ static inline constexpr uintptr_t kRedMask = 0x1;
+ static inline constexpr uintptr_t kPtrMask = ~kRedMask;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ uintptr_t _tree_nodes[2] {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaTreeNode() noexcept {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_red() const noexcept { return static_cast<bool>(_tree_nodes[0] & kRedMask); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_child(size_t i) const noexcept { return _tree_nodes[i] > kRedMask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_left() const noexcept { return _tree_nodes[0] > kRedMask; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_right() const noexcept { return _tree_nodes[1] != 0; }
+
+ template<typename T = ArenaTreeNode>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* child(size_t i) const noexcept { return static_cast<T*>(_get_child(i)); }
+
+ template<typename T = ArenaTreeNode>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* left() const noexcept { return static_cast<T*>(_get_left()); }
+
+ template<typename T = ArenaTreeNode>
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* right() const noexcept { return static_cast<T*>(_get_right()); }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Internal
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArenaTreeNode* _get_child(size_t i) const noexcept { return (ArenaTreeNode*)(_tree_nodes[i] & kPtrMask); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArenaTreeNode* _get_left() const noexcept { return (ArenaTreeNode*)(_tree_nodes[0] & kPtrMask); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG ArenaTreeNode* _get_right() const noexcept { return (ArenaTreeNode*)(_tree_nodes[1]); }
+
+ ASMJIT_INLINE_NODEBUG void _set_child(size_t i, ArenaTreeNode* node) noexcept { _tree_nodes[i] = (_tree_nodes[i] & kRedMask) | (uintptr_t)node; }
+ ASMJIT_INLINE_NODEBUG void _set_left(ArenaTreeNode* node) noexcept { _tree_nodes[0] = (_tree_nodes[0] & kRedMask) | (uintptr_t)node; }
+ ASMJIT_INLINE_NODEBUG void _set_right(ArenaTreeNode* node) noexcept { _tree_nodes[1] = (uintptr_t)node; }
+
+ ASMJIT_INLINE_NODEBUG void _make_red() noexcept { _tree_nodes[0] |= kRedMask; }
+ ASMJIT_INLINE_NODEBUG void _make_black() noexcept { _tree_nodes[0] &= kPtrMask; }
+
+ //! Tests whether the node is RED (RED node must be non-null and must have RED flag set).
+ [[nodiscard]]
+ static ASMJIT_INLINE_NODEBUG bool _is_valid_red(ArenaTreeNode* node) noexcept { return node && node->is_red(); }
+
+ //! \}
+ //! \endcond
+};
+
+//! RB-Tree node casted to `NodeT`.
+template<typename NodeT>
+class ArenaTreeNodeT : public ArenaTreeNode {
+public:
+ ASMJIT_NONCOPYABLE(ArenaTreeNodeT)
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaTreeNodeT() noexcept
+ : ArenaTreeNode() {}
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* child(size_t i) const noexcept { return static_cast<NodeT*>(_get_child(i)); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* left() const noexcept { return static_cast<NodeT*>(_get_left()); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* right() const noexcept { return static_cast<NodeT*>(_get_right()); }
+
+ //! \}
+};
+
+//! RB-Tree.
+template<typename NodeT>
+class ArenaTree {
+public:
+ ASMJIT_NONCOPYABLE(ArenaTree)
+
+ using Node = NodeT;
+ NodeT* _root {};
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG ArenaTree() noexcept {}
+ ASMJIT_INLINE_NODEBUG ArenaTree(ArenaTree&& other) noexcept
+ : _root(other._root) {}
+ ASMJIT_INLINE_NODEBUG void reset() noexcept { _root = nullptr; }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _root == nullptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG NodeT* root() const noexcept { return static_cast<NodeT*>(_root); }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void swap(ArenaTree& other) noexcept {
+ std::swap(_root, other._root);
+ }
+
+ template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ void insert(NodeT* ASMJIT_NONNULL(node), const CompareT& cmp = CompareT()) noexcept {
+ // Node to insert must not contain garbage.
+ ASMJIT_ASSERT(!node->has_left());
+ ASMJIT_ASSERT(!node->has_right());
+ ASMJIT_ASSERT(!node->is_red());
+
+ if (!_root) {
+ _root = node;
+ return;
+ }
+
+ ArenaTreeNode head; // False root node,
+ head._set_right(_root); // having root on the right.
+
+ ArenaTreeNode* g = nullptr; // Grandparent.
+ ArenaTreeNode* p = nullptr; // Parent.
+ ArenaTreeNode* t = &head; // Iterator.
+ ArenaTreeNode* q = _root; // Query.
+
+ size_t dir = 0; // Direction for accessing child nodes.
+ size_t last = 0; // Not needed to initialize, but makes some tools happy.
+
+ node->_make_red(); // New nodes are always red and violations fixed appropriately.
+
+ // Search down the tree.
+ for (;;) {
+ if (!q) {
+ // Insert new node at the bottom.
+ q = node;
+ p->_set_child(dir, node);
+ }
+ else if (_is_valid_red(q->_get_left()) && _is_valid_red(q->_get_right())) {
+ // Color flip.
+ q->_make_red();
+ q->_get_left()->_make_black();
+ q->_get_right()->_make_black();
+ }
+
+ // Fix red violation.
+ if (_is_valid_red(q) && _is_valid_red(p)) {
+ ASMJIT_ASSUME(g != nullptr);
+ ASMJIT_ASSUME(p != nullptr);
+ t->_set_child(t->_get_right() == g,
+ q == p->_get_child(last) ? _single_rotate(g, !last) : _double_rotate(g, !last));
+ }
+
+ // Stop if found.
+ if (q == node) {
+ break;
+ }
+
+ last = dir;
+ dir = cmp(*static_cast<NodeT*>(q), *static_cast<NodeT*>(node)) < 0;
+
+ // Update helpers.
+ if (g) {
+ t = g;
+ }
+
+ g = p;
+ p = q;
+ q = q->_get_child(dir);
+ }
+
+ // Update root and make it black.
+ _root = static_cast<NodeT*>(head._get_right());
+ _root->_make_black();
+ }
+
+ //! Remove node from RBTree.
+ template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ void remove(ArenaTreeNode* ASMJIT_NONNULL(node), const CompareT& cmp = CompareT()) noexcept {
+ ArenaTreeNode head; // False root node,
+ head._set_right(_root); // having root on the right.
+
+ ArenaTreeNode* g = nullptr; // Grandparent.
+ ArenaTreeNode* p = nullptr; // Parent.
+ ArenaTreeNode* q = &head; // Query.
+
+ ArenaTreeNode* f = nullptr; // Found item.
+ ArenaTreeNode* gf = nullptr; // Found grandparent.
+ size_t dir = 1; // Direction (0 or 1).
+
+ // Search and push a red down.
+ while (q->has_child(dir)) {
+ size_t last = dir;
+
+ // Update helpers.
+ g = p;
+ p = q;
+ q = q->_get_child(dir);
+ dir = cmp(*static_cast<NodeT*>(q), *static_cast<NodeT*>(node)) < 0;
+
+ // Save found node.
+ if (q == node) {
+ f = q;
+ gf = g;
+ }
+
+ // Push the red node down.
+ if (!_is_valid_red(q) && !_is_valid_red(q->_get_child(dir))) {
+ if (_is_valid_red(q->_get_child(!dir))) {
+ ArenaTreeNode* child = _single_rotate(q, dir);
+ p->_set_child(last, child);
+ p = child;
+ }
+ else if (!_is_valid_red(q->_get_child(!dir)) && p->_get_child(!last)) {
+ ArenaTreeNode* s = p->_get_child(!last);
+ if (!_is_valid_red(s->_get_child(!last)) && !_is_valid_red(s->_get_child(last))) {
+ // Color flip.
+ p->_make_black();
+ s->_make_red();
+ q->_make_red();
+ }
+ else {
+ ASMJIT_ASSUME(g != nullptr);
+ ASMJIT_ASSUME(s != nullptr);
+
+ size_t dir2 = g->_get_right() == p;
+ ArenaTreeNode* child = g->_get_child(dir2);
+
+ if (_is_valid_red(s->_get_child(last))) {
+ child = _double_rotate(p, last);
+ g->_set_child(dir2, child);
+ }
+ else if (_is_valid_red(s->_get_child(!last))) {
+ child = _single_rotate(p, last);
+ g->_set_child(dir2, child);
+ }
+
+ // Ensure correct coloring.
+ q->_make_red();
+ child->_make_red();
+ child->_get_left()->_make_black();
+ child->_get_right()->_make_black();
+ }
+ }
+ }
+ }
+
+ // Replace and remove.
+ ASMJIT_ASSERT(f != nullptr);
+ ASMJIT_ASSERT(f != &head);
+ ASMJIT_ASSERT(q != &head);
+
+ p->_set_child(p->_get_right() == q,
+ q->_get_child(q->_get_left() == nullptr));
+
+ // NOTE: The original algorithm used a trick to just copy 'key/value' to `f` and mark `q` for deletion. But this
+ // is unacceptable here as we really want to destroy the passed `node`. So, we have to make sure that we have
+ // really removed `f` and not `q`.
+ if (f != q) {
+ ASMJIT_ASSERT(f != &head);
+ ASMJIT_ASSERT(f != gf);
+
+ ArenaTreeNode* n = gf ? gf : &head;
+ dir = (n == &head) ? 1 : cmp(*static_cast<NodeT*>(n), *static_cast<NodeT*>(node)) < 0;
+
+ for (;;) {
+ if (n->_get_child(dir) == f) {
+ n->_set_child(dir, q);
+ // RAW copy, including the color.
+ q->_tree_nodes[0] = f->_tree_nodes[0];
+ q->_tree_nodes[1] = f->_tree_nodes[1];
+ break;
+ }
+
+ n = n->_get_child(dir);
+
+ // Cannot be true as we know that it must reach `f` in few iterations.
+ ASMJIT_ASSERT(n != nullptr);
+ dir = cmp(*static_cast<NodeT*>(n), *static_cast<NodeT*>(node)) < 0;
+ }
+ }
+
+ // Update root and make it black.
+ _root = static_cast<NodeT*>(head._get_right());
+ if (_root) {
+ _root->_make_black();
+ }
+ }
+
+ template<typename KeyT, typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ [[nodiscard]]
+ inline NodeT* get(const KeyT& key, const CompareT& cmp = CompareT()) const noexcept {
+ ArenaTreeNode* node = _root;
+ while (node) {
+ auto result = cmp(*static_cast<const NodeT*>(node), key);
+ if (result == 0) {
+ break;
+ }
+
+ // Go left or right depending on the `result`.
+ node = node->_get_child(result < 0);
+ }
+ return static_cast<NodeT*>(node);
+ }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Internal
+ //! \{
+
+ static inline bool _is_valid_red(ArenaTreeNode* node) noexcept { return ArenaTreeNode::_is_valid_red(node); }
+
+ //! Single rotation.
+ static inline ArenaTreeNode* _single_rotate(ArenaTreeNode* ASMJIT_NONNULL(root), size_t dir) noexcept {
+ ArenaTreeNode* save = root->_get_child(!dir);
+ ASMJIT_ASSUME(save != nullptr);
+
+ ArenaTreeNode* save_child = save->_get_child(dir);
+ root->_set_child(!dir, save_child);
+ save->_set_child( dir, root);
+ root->_make_red();
+ save->_make_black();
+ return save;
+ }
+
+ //! Double rotation.
+ static inline ArenaTreeNode* _double_rotate(ArenaTreeNode* ASMJIT_NONNULL(root), size_t dir) noexcept {
+ ArenaTreeNode* child = root->_get_child(!dir);
+ ASMJIT_ASSUME(child != nullptr);
+
+ root->_set_child(!dir, _single_rotate(child, !dir));
+ return _single_rotate(root, dir);
+ }
+
+ //! \}
+ //! \endcond
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENATREE_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/arenavector.cpp b/3rdparty/asmjit/asmjit/support/arenavector.cpp
new file mode 100644
index 00000000000..70d02229faf
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenavector.cpp
@@ -0,0 +1,316 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/support/arena.h>
+#include <asmjit/support/arenavector.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// ArenaVector - Item Size Helpers
+// ===============================
+
+template<typename ResultType, bool IsPowerOf2>
+static ASMJIT_INLINE_NODEBUG ResultType byte_size_from_item_count(size_t item_count, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ if constexpr (IsPowerOf2) {
+ return ResultType(item_count) << item_size.n;
+ }
+ else {
+ return ResultType(item_count) * item_size.n;
+ }
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_INLINE_NODEBUG size_t item_count_from_byte_size(size_t byte_size, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ if constexpr (IsPowerOf2) {
+ return byte_size >> item_size.n;
+ }
+ else {
+ return byte_size / item_size.n;
+ }
+}
+
+// ArenaVector - Memory Management
+// ===============================
+
+// Rule based growing strategy - 32 bytes, 128 bytes, 512 bytes, and then grow exponentially until `kGrowThreshold`
+// is reached.
+static constexpr uint8_t ArenaVector_grow_rule(uint8_t log2_size) noexcept {
+ return log2_size < 1u ? uint8_t(0) :
+ log2_size < 2u ? uint8_t(2) :
+ log2_size < 4u ? uint8_t(4) :
+ log2_size < 6u ? uint8_t(6) :
+ log2_size < 8u ? uint8_t(8) : uint8_t(log2_size);
+}
+
+// The table is never used fully, only indexes up to `ctz(Support::kGrowThreshold) + 1`.
+static constexpr uint8_t ArenaVector_grow_table[32] = {
+ ArenaVector_grow_rule( 0), ArenaVector_grow_rule( 1), ArenaVector_grow_rule( 2), ArenaVector_grow_rule( 3),
+ ArenaVector_grow_rule( 4), ArenaVector_grow_rule( 5), ArenaVector_grow_rule( 6), ArenaVector_grow_rule( 7),
+ ArenaVector_grow_rule( 8), ArenaVector_grow_rule( 9), ArenaVector_grow_rule(10), ArenaVector_grow_rule(11),
+ ArenaVector_grow_rule(12), ArenaVector_grow_rule(13), ArenaVector_grow_rule(14), ArenaVector_grow_rule(15),
+ ArenaVector_grow_rule(16), ArenaVector_grow_rule(17), ArenaVector_grow_rule(18), ArenaVector_grow_rule(19),
+ ArenaVector_grow_rule(20), ArenaVector_grow_rule(21), ArenaVector_grow_rule(22), ArenaVector_grow_rule(23),
+ ArenaVector_grow_rule(24), ArenaVector_grow_rule(25), ArenaVector_grow_rule(26), ArenaVector_grow_rule(27),
+ ArenaVector_grow_rule(28), ArenaVector_grow_rule(29), ArenaVector_grow_rule(30), ArenaVector_grow_rule(31)
+};
+
+static ASMJIT_INLINE size_t ArenaVector_expand_byte_size(size_t byte_size) noexcept {
+ ASMJIT_ASSERT(byte_size > 0u);
+
+ if (ASMJIT_LIKELY(byte_size <= Globals::kGrowThreshold)) {
+ uint32_t grow_table_idx = Support::bit_size_of<size_t> - Support::clz((byte_size - 1u) | 1u);
+ uint32_t grow_log2_size = ArenaVector_grow_table[grow_table_idx];
+
+ return size_t(1) << grow_log2_size;
+ }
+ else {
+ return Support::align_up(size_t(byte_size) + 1u, Globals::kGrowThreshold);
+ }
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_NOINLINE Error ArenaVector_reserve_with_byte_size(ArenaVectorBase& self, Arena& arena, size_t byte_size, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ size_t allocated_size;
+ uint8_t* new_data = static_cast<uint8_t*>(arena.alloc_reusable(byte_size, Out(allocated_size)));
+
+ if (ASMJIT_UNLIKELY(!new_data)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ size_t allocated_capacity = item_count_from_byte_size(allocated_size, item_size);
+
+ void* old_data = self._data;
+ uint32_t size = self._size;
+
+ if (old_data) {
+ memcpy(new_data, old_data, byte_size_from_item_count<size_t>(size, item_size));
+ arena.free_reusable(old_data, byte_size_from_item_count<size_t>(self._capacity, item_size));
+ }
+
+ self._data = new_data;
+ self._capacity = uint32_t(allocated_capacity);
+
+ return Error::kOk;
+}
+
+static ASMJIT_INLINE bool ArenaVector_is_valid_size(size_t size) noexcept {
+ if constexpr (sizeof(size_t) < 8u) {
+ // 32-bit machine - `uint32_t` is the same as `size_t` - there is no need to do any checks
+ // as it's impossible to end up having a container, which data uses the whole address space.
+ return true;
+ }
+ else {
+ // 64-bit machine - since we store size and capacity as `uint32_t`, we have to check whether
+ // the `size_t` argument actually fits `uint32_t`.
+ return size < size_t(0xFFFFFFFFu);
+ }
+}
+
+static ASMJIT_INLINE bool ArenaVector_check_byte_size(uint64_t byte_size) noexcept {
+ if constexpr (sizeof(size_t) < 8u) {
+ // 32-bit machine.
+ return byte_size <= 0x80000000u;
+ }
+ else {
+ return true;
+ }
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_INLINE Error ArenaVector_reserve_fit(ArenaVectorBase& self, Arena& arena, size_t item_count, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ size_t capacity = self._capacity;
+ size_t capacity_masked = capacity | Support::bool_as_mask<size_t>(!ArenaVector_is_valid_size(item_count));
+ uint64_t byte_size = byte_size_from_item_count<uint64_t>(item_count, item_size);
+
+ if (ASMJIT_UNLIKELY(Support::bool_or(capacity_masked >= item_count, !ArenaVector_check_byte_size(byte_size)))) {
+ return capacity >= item_count ? Error::kOk : make_error(Error::kOutOfMemory);
+ }
+
+ return ArenaVector_reserve_with_byte_size(self, arena, size_t(byte_size), item_size);
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_INLINE Error ArenaVector_reserve_grow(ArenaVectorBase& self, Arena& arena, size_t item_count, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ size_t capacity = self._capacity;
+ size_t capacity_masked = capacity | Support::bool_as_mask<size_t>(!ArenaVector_is_valid_size(item_count));
+ uint64_t byte_size = byte_size_from_item_count<uint64_t>(item_count, item_size);
+
+ if (ASMJIT_UNLIKELY(Support::bool_or(capacity_masked >= item_count, !ArenaVector_check_byte_size(byte_size)))) {
+ return capacity >= item_count ? Error::kOk : make_error(Error::kOutOfMemory);
+ }
+
+ size_t expanded_byte_size = ArenaVector_expand_byte_size(size_t(byte_size));
+ return ArenaVector_reserve_with_byte_size(self, arena, expanded_byte_size, item_size);
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_INLINE Error ArenaVector_grow(ArenaVectorBase& self, Arena& arena, size_t n, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ Support::FastUInt8 of {};
+ size_t after = Support::add_overflow<size_t>(self._size, n, &of);
+
+ if (ASMJIT_UNLIKELY(of)) {
+ return make_error(Error::kOutOfMemory);
+ }
+
+ return ArenaVector_reserve_grow(self, arena, after, item_size);
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_INLINE Error ArenaVector_resize_fit(ArenaVectorBase& self, Arena& arena, size_t n, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ size_t size = self._size;
+ size_t capacity = self._capacity;
+
+ if (capacity < n) {
+ ASMJIT_PROPAGATE(ArenaVector_reserve_fit(self, arena, n, item_size));
+ }
+
+ if (size < n) {
+ memset(static_cast<uint8_t*>(self._data) + byte_size_from_item_count<size_t>(size, item_size), 0, byte_size_from_item_count<size_t>(n - size, item_size));
+ }
+
+ self._size = uint32_t(n);
+ return Error::kOk;
+}
+
+template<bool IsPowerOf2>
+static ASMJIT_INLINE Error ArenaVector_resize_grow(ArenaVectorBase& self, Arena& arena, size_t n, ArenaVectorBase::ItemSize<IsPowerOf2> item_size) noexcept {
+ size_t size = self._size;
+ size_t capacity = self._capacity;
+
+ if (capacity < n) {
+ ASMJIT_PROPAGATE(ArenaVector_reserve_grow(self, arena, n, item_size));
+ }
+
+ if (size < n) {
+ memset(static_cast<uint8_t*>(self._data) + byte_size_from_item_count<size_t>(size, item_size), 0, byte_size_from_item_count<size_t>(n - size, item_size));
+ }
+
+ self._size = uint32_t(n);
+ return Error::kOk;
+}
+
+// Public API wrappers:
+Error ArenaVectorBase::_reserve_fit(Arena& arena, size_t n, ItemSize<false> item_size) noexcept {
+ return ArenaVector_reserve_fit(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_reserve_fit(Arena& arena, size_t n, ItemSize<true> item_size) noexcept {
+ return ArenaVector_reserve_fit(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_reserve_grow(Arena& arena, size_t n, ItemSize<false> item_size) noexcept {
+ return ArenaVector_reserve_grow(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_reserve_grow(Arena& arena, size_t n, ItemSize<true> item_size) noexcept {
+ return ArenaVector_reserve_grow(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_reserve_additional(Arena& arena, size_t n, ItemSize<false> item_size) noexcept {
+ return ArenaVector_grow(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_reserve_additional(Arena& arena, size_t n, ItemSize<true> item_size) noexcept {
+ return ArenaVector_grow(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_resize_fit(Arena& arena, size_t n, ItemSize<false> item_size) noexcept {
+ return ArenaVector_resize_fit(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_resize_fit(Arena& arena, size_t n, ItemSize<true> item_size) noexcept {
+ return ArenaVector_resize_fit(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_resize_grow(Arena& arena, size_t n, ItemSize<false> item_size) noexcept {
+ return ArenaVector_resize_grow(*this, arena, n, item_size);
+}
+
+Error ArenaVectorBase::_resize_grow(Arena& arena, size_t n, ItemSize<true> item_size) noexcept {
+ return ArenaVector_resize_grow(*this, arena, n, item_size);
+}
+
+// ArenaVector - Tests
+// ===================
+
+#if defined(ASMJIT_TEST)
+template<typename T>
+static void test_arena_vector(Arena& arena, const char* type_name) {
+ constexpr uint32_t kMiB = 1024 * 1024;
+
+ size_t i;
+ size_t kMax = 100000;
+
+ ArenaVector<T> vec;
+
+ INFO("ArenaVector<%s> basic tests", type_name);
+ EXPECT_EQ(vec.append(arena, 0), Error::kOk);
+ EXPECT_FALSE(vec.is_empty());
+ EXPECT_EQ(vec.size(), 1u);
+ EXPECT_GE(vec.capacity(), 1u);
+ EXPECT_EQ(vec.index_of(0), size_t(0));
+ EXPECT_TRUE(Globals::is_npos(vec.index_of(-11)));
+
+ vec.clear();
+ EXPECT_TRUE(vec.is_empty());
+ EXPECT_EQ(vec.size(), 0u);
+ EXPECT_TRUE(Globals::is_npos(vec.index_of(0)));
+
+ for (i = 0; i < kMax; i++) {
+ EXPECT_EQ(vec.append(arena, T(i)), Error::kOk);
+ }
+ EXPECT_FALSE(vec.is_empty());
+ EXPECT_EQ(vec.size(), size_t(kMax));
+ EXPECT_EQ(vec.index_of(T(0)), size_t(0));
+ EXPECT_EQ(vec.index_of(T(kMax - 1)), uint32_t(kMax - 1));
+
+ EXPECT_EQ(vec.begin()[0], 0);
+ EXPECT_EQ(vec.end()[-1], T(kMax - 1));
+
+ INFO("ArenaVector<%s>::operator=(ArenaVector<%s>&&)", type_name, type_name);
+ ArenaVector<T> moved_vec(std::move(vec));
+ EXPECT_EQ(vec.data(), nullptr);
+ EXPECT_EQ(vec.size(), 0u);
+ EXPECT_EQ(vec.capacity(), 0u);
+
+ moved_vec.release(arena);
+
+ INFO("ArenaVector<%s>::reserve_grow()", type_name);
+ for (uint32_t j = 8; j < 40 / sizeof(T); j += 8) {
+ EXPECT_EQ(vec.reserve_grow(arena, j * kMiB), Error::kOk);
+ EXPECT_GE(vec.capacity(), j * kMiB);
+ }
+}
+
+template<typename T>
+static void test_arena_vector_capacity(Arena& arena, const char* type_name) {
+ ArenaVector<T> vec;
+
+ INFO("ArenaVector<%s> capacity (growing) test", type_name);
+
+ for (size_t i = 0; i < 10000000; i++) {
+ size_t old_capacity = vec.capacity();
+ EXPECT_EQ(vec.append(arena, T(i)), Error::kOk);
+
+ if (vec.capacity() != old_capacity) {
+ INFO(" Increasing capacity from %zu to %zu (vector size=%zu)\n", old_capacity, vec.capacity(), vec.size());
+ }
+ }
+}
+
+UNIT(arena_vector, -1) {
+ Arena arena(8192);
+
+ test_arena_vector<int32_t>(arena, "int32_t");
+ test_arena_vector_capacity<int32_t>(arena, "int32_t");
+
+ test_arena_vector<int64_t>(arena, "int64_t");
+ test_arena_vector_capacity<int64_t>(arena, "int64_t");
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/arenavector.h b/3rdparty/asmjit/asmjit/support/arenavector.h
new file mode 100644
index 00000000000..f54269870d7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/arenavector.h
@@ -0,0 +1,641 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_ARENAVECTOR_H_INCLUDED
+#define ASMJIT_SUPPORT_ARENAVECTOR_H_INCLUDED
+
+#include <asmjit/support/arena.h>
+#include <asmjit/support/span.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_support
+//! \{
+
+//! Base class used by \ref ArenaVector template.
+class ArenaVectorBase {
+public:
+ ASMJIT_NONCOPYABLE(ArenaVectorBase)
+
+ //! \name Item Size Detail
+ //! \{
+
+ template<bool IsPowerOf2>
+ struct ItemSize { uint32_t n; };
+
+ //! \}
+
+ //! \name Types (C++ compatibility)
+ //! \{
+
+ using size_type = size_t;
+ using difference_type = ptrdiff_t;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! Vector data (untyped).
+ void* _data {};
+ //! Size of the vector.
+ uint32_t _size {};
+ //! Capacity of the vector.
+ uint32_t _capacity {};
+
+ //! \}
+
+protected:
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a new instance of `ArenaVectorBase`.
+ ASMJIT_INLINE_NODEBUG ArenaVectorBase() noexcept {}
+
+ ASMJIT_INLINE_NODEBUG ArenaVectorBase(ArenaVectorBase&& other) noexcept
+ : _data(other._data),
+ _size(other._size),
+ _capacity(other._capacity) { other.reset(); }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Internal
+ //! \{
+
+ ASMJIT_INLINE void _release(Arena& arena, uint32_t item_byte_size) noexcept {
+ if (_data != nullptr) {
+ arena.free_reusable(_data, _capacity * item_byte_size);
+ reset();
+ }
+ }
+
+ ASMJIT_INLINE_NODEBUG void _move_from(ArenaVectorBase&& other) noexcept {
+ void* data = other._data;
+ uint32_t size = other._size;
+ uint32_t capacity = other._capacity;
+
+ other._data = nullptr;
+ other._size = 0u;
+ other._capacity = 0u;
+
+ _data = data;
+ _size = size;
+ _capacity = capacity;
+ }
+
+ ASMJIT_API Error _reserve_fit(Arena& arena, size_t n, ItemSize<false> byte_size) noexcept;
+ ASMJIT_API Error _reserve_fit(Arena& arena, size_t n, ItemSize<true> log2_size) noexcept;
+
+ ASMJIT_API Error _reserve_grow(Arena& arena, size_t n, ItemSize<false> byte_size) noexcept;
+ ASMJIT_API Error _reserve_grow(Arena& arena, size_t n, ItemSize<true> log2_size) noexcept;
+
+ ASMJIT_API Error _reserve_additional(Arena& arena, size_t n, ItemSize<false> byte_size) noexcept;
+ ASMJIT_API Error _reserve_additional(Arena& arena, size_t n, ItemSize<true> log2_size) noexcept;
+
+ ASMJIT_API Error _resize_fit(Arena& arena, size_t n, ItemSize<false> byte_size) noexcept;
+ ASMJIT_API Error _resize_fit(Arena& arena, size_t n, ItemSize<true> log2_size) noexcept;
+
+ ASMJIT_API Error _resize_grow(Arena& arena, size_t n, ItemSize<false> byte_size) noexcept;
+ ASMJIT_API Error _resize_grow(Arena& arena, size_t n, ItemSize<true> log2_size) noexcept;
+
+ ASMJIT_INLINE_NODEBUG void _swap(ArenaVectorBase& other) noexcept {
+ std::swap(_data, other._data);
+ std::swap(_size, other._size);
+ std::swap(_capacity, other._capacity);
+ }
+
+ //! \}
+ //! \endcond
+
+public:
+ //! \name Accessors
+ //! \{
+
+ //! Tests whether the vector is empty.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _size == 0; }
+
+ //! Returns the vector size.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ //! Returns the vector capacity.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return _capacity; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Makes the vector empty (won't change the capacity or data pointer).
+ ASMJIT_INLINE_NODEBUG void clear() noexcept { _size = 0u; }
+
+ //! Resets the vector data and set its `size` to zero.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _data = nullptr;
+ _size = 0;
+ _capacity = 0;
+ }
+
+ //! Truncates the vector to at most `n` items.
+ ASMJIT_INLINE_NODEBUG void truncate(size_t n) noexcept {
+ _size = uint32_t(Support::min<size_t>(_size, n));
+ }
+
+ //! Sets size of the vector to `n`. Used internally by some algorithms.
+ ASMJIT_INLINE void _set_size(size_t n) noexcept {
+ ASMJIT_ASSERT(n <= _capacity);
+ _size = uint32_t(n);
+ }
+
+ //! \}
+};
+
+//! Template used to store and manage array of \ref Arena allocated data.
+//!
+//! This template has these advantages over other std::vector<>:
+//! - Always non-copyable (designed to be non-copyable, we want it).
+//! - Optimized for working only with POD types.
+//! - Explicit allocation - \ref Arena is not part of the data for improved memory footprint.
+template <typename T>
+class ArenaVector : public ArenaVectorBase {
+public:
+ ASMJIT_NONCOPYABLE(ArenaVector)
+
+ //! \name Item Size Detail
+ //! \{
+
+ static inline constexpr bool ItemSizeIsPowerOf2 = Support::is_power_of_2(sizeof(T));
+ static inline constexpr ItemSize<ItemSizeIsPowerOf2> item_size_ { ItemSizeIsPowerOf2 ? uint32_t(Support::ctz_t(sizeof(T))) : uint32_t(sizeof(T)) };
+
+ //! \}
+
+ //! \name Types (C++ compatibility)
+ //! \{
+
+ using value_type = T;
+ using pointer = T*;
+ using const_pointer = const T*;
+ using reference = T&;
+ using const_reference = const T&;
+
+ using iterator = T*;
+ using const_iterator = const T*;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default constructed ArenaVector (data pointer is null, and both length/capacity is zero).
+ ASMJIT_INLINE_NODEBUG ArenaVector() noexcept : ArenaVectorBase() {}
+
+ //! Moves an existing vector into this instance and resets the `other` instance.
+ ASMJIT_INLINE_NODEBUG ArenaVector(ArenaVector&& other) noexcept : ArenaVectorBase(std::move(other)) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Implements a move assignment operator. The `other` instance is reset before this instance is set.
+ //!
+ //! \note It's recommended to first release the memory of the destination vector as there is no way
+ //! how to do it after the move, unless it's guaranteed that the destination vector is default
+ //! constructed.
+ ASMJIT_INLINE_NODEBUG ArenaVector& operator=(ArenaVector&& other) noexcept {
+ _move_from(other);
+ return *this;
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ //! Returns item at index `i`.
+ [[nodiscard]]
+ ASMJIT_INLINE T& operator[](size_t i) noexcept {
+ ASMJIT_ASSERT(i < _size);
+ return data()[i];
+ }
+
+ //! Returns item at index `i`.
+ [[nodiscard]]
+ ASMJIT_INLINE const T& operator[](size_t i) const noexcept {
+ ASMJIT_ASSERT(i < _size);
+ return data()[i];
+ }
+
+ //! Returns a non-owning span of this vector.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG operator Span<T>() const noexcept { return Span<T>(static_cast<T*>(_data), _size); }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns a non-owning span of this vector.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<T> as_span() const noexcept { return Span<T>(static_cast<T*>(_data), _size); }
+
+ //! Returns vector data (mutable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG T* data() noexcept { return static_cast<T*>(_data); }
+
+ //! Returns vector data (const)
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return static_cast<const T*>(_data); }
+
+ //! Returns vector data (const)
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const T* cdata() const noexcept { return static_cast<const T*>(_data); }
+
+ //! Returns item at the given index `i` (const).
+ [[nodiscard]]
+ ASMJIT_INLINE const T& at(size_t i) const noexcept {
+ ASMJIT_ASSERT(i < _size);
+ return data()[i];
+ }
+
+ ASMJIT_INLINE void _set_end(T* p) noexcept {
+ ASMJIT_ASSERT(p >= data() && p <= data() + _capacity);
+ _set_size(size_t(p - data()));
+ }
+
+ //! Returns a reference to the first element of the vector.
+ //!
+ //! \note The vector must have at least one element. Attempting to use `first()` on empty vector will trigger
+ //! an assertion failure in debug builds.
+ [[nodiscard]]
+ ASMJIT_INLINE T& first() noexcept { return operator[](0); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE const T& first() const noexcept { return operator[](0); }
+
+ //! Returns a reference to the last element of the vector.
+ //!
+ //! \note The vector must have at least one element. Attempting to use `last()` on empty vector will trigger
+ //! an assertion failure in debug builds.
+ [[nodiscard]]
+ ASMJIT_INLINE T& last() noexcept { return operator[](_size - 1); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE const T& last() const noexcept { return operator[](_size - 1); }
+
+ //! \}
+
+ //! \name C++ Compatibility (Iterators)
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG iterator begin() noexcept { return iterator(data()); };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const_iterator begin() const noexcept { return const_iterator(data()); };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG iterator end() noexcept { return iterator(data() + _size); };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const_iterator end() const noexcept { return const_iterator(data() + _size); };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const_iterator cbegin() const noexcept { return const_iterator(data()); };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const_iterator cend() const noexcept { return const_iterator(data() + _size); };
+
+ //! \}
+
+ //! \name Iteration
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG SpanForwardIteratorAdaptor<T> iterate() const noexcept {
+ T* p = static_cast<T*>(_data);
+ return SpanForwardIteratorAdaptor<T>{p, p + _size};
+ }
+
+ ASMJIT_INLINE_NODEBUG SpanReverseIteratorAdaptor<T> iterate_reverse() const noexcept {
+ T* p = static_cast<T*>(_data);
+ return SpanReverseIteratorAdaptor<T>{p, p + _size};
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ //! Swaps this vector with `other`.
+ ASMJIT_INLINE void swap(ArenaVector<T>& other) noexcept { _swap(other); }
+
+ //! Prepends `item` to the vector.
+ ASMJIT_INLINE Error prepend(Arena& arena, const T& item) noexcept {
+ ASMJIT_PROPAGATE(reserve_additional(arena));
+
+ memmove(static_cast<void*>(static_cast<T*>(_data) + 1),
+ static_cast<const void*>(_data),
+ size_t(_size) * sizeof(T));
+
+ memcpy(static_cast<void*>(_data),
+ static_cast<const void*>(&item),
+ sizeof(T));
+
+ _size++;
+ return Error::kOk;
+ }
+
+ //! Inserts an `item` at the specified `index`.
+ ASMJIT_INLINE Error insert(Arena& arena, size_t index, const T& item) noexcept {
+ ASMJIT_ASSERT(index <= _size);
+ ASMJIT_PROPAGATE(reserve_additional(arena));
+
+ T* dst = static_cast<T*>(_data) + index;
+ memmove(static_cast<void*>(dst + 1),
+ static_cast<const void*>(dst),
+ size_t(_size - index) * sizeof(T));
+
+ memcpy(static_cast<void*>(dst),
+ static_cast<const void*>(&item),
+ sizeof(T));
+
+ _size++;
+ return Error::kOk;
+ }
+
+ //! Appends `item` to the vector.
+ ASMJIT_INLINE Error append(Arena& arena, const T& item) noexcept {
+ ASMJIT_PROPAGATE(reserve_additional(arena));
+
+ memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
+ static_cast<const void*>(&item),
+ sizeof(T));
+
+ _size++;
+ return Error::kOk;
+ }
+
+ //! Appends `other` vector at the end of this vector.
+ ASMJIT_INLINE Error concat(Arena& arena, const ArenaVector<T>& other) noexcept {
+ uint32_t size = other._size;
+
+ if (_capacity - _size < size) {
+ ASMJIT_PROPAGATE(reserve_additional(arena, size));
+ }
+
+ if (size) {
+ memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
+ static_cast<const void*>(other._data),
+ size_t(size) * sizeof(T));
+ _size += size;
+ }
+
+ return Error::kOk;
+ }
+
+ ASMJIT_INLINE void assign_unchecked(const ArenaVector<T>& other) noexcept {
+ uint32_t size = other._size;
+ ASMJIT_ASSERT(_capacity >= other._size);
+
+ if (size) {
+ memcpy(_data, other._data, size_t(size) * sizeof(T));
+ }
+
+ _size = size;
+ }
+
+ //! Prepends `item` to the vector (unsafe case).
+ //!
+ //! Can only be used together with `reserve_additional()`. If `reserve_additional(N)` returns `Error::kOk` then N elements
+ //! can be added to the vector without checking if there is a place for them. Used mostly internally.
+ ASMJIT_INLINE void prepend_unchecked(const T& item) noexcept {
+ ASMJIT_ASSERT(_size < _capacity);
+ T* data = static_cast<T*>(_data);
+
+ if (_size) {
+ memmove(static_cast<void*>(data + 1),
+ static_cast<const void*>(data),
+ size_t(_size) * sizeof(T));
+ }
+
+ memcpy(static_cast<void*>(data),
+ static_cast<const void*>(&item),
+ sizeof(T));
+ _size++;
+ }
+
+ //! Append s`item` to the vector (unsafe case).
+ //!
+ //! Can only be used together with `reserve_additional()`. If `reserve_additional(N)` returns `Error::kOk` then N elements
+ //! can be added to the vector without checking if there is a place for them. Used mostly internally.
+ ASMJIT_INLINE void append_unchecked(const T& item) noexcept {
+ ASMJIT_ASSERT(_size < _capacity);
+
+ memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
+ static_cast<const void*>(&item),
+ sizeof(T));
+ _size++;
+ }
+
+ //! Inserts an `item` at the specified `index` (unsafe case).
+ ASMJIT_INLINE void insert_unchecked(size_t index, const T& item) noexcept {
+ ASMJIT_ASSERT(_size < _capacity);
+ ASMJIT_ASSERT(index <= _size);
+
+ T* dst = static_cast<T*>(_data) + index;
+ memmove(static_cast<void*>(dst + 1),
+ static_cast<const void*>(dst),
+ size_t(_size - index) * sizeof(T));
+
+ memcpy(static_cast<void*>(dst),
+ static_cast<const void*>(&item),
+ sizeof(T));
+
+ _size++;
+ }
+
+ //! Concatenates all items of `other` at the end of the vector.
+ ASMJIT_INLINE void concat_unchecked(const ArenaVector<T>& other) noexcept {
+ uint32_t size = other._size;
+ ASMJIT_ASSERT(_capacity - _size >= size);
+
+ if (size) {
+ memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
+ static_cast<const void*>(other._data),
+ size_t(size) * sizeof(T));
+ _size += size;
+ }
+ }
+
+ //! Removes item at index `i`.
+ ASMJIT_INLINE void remove_at(size_t i) noexcept {
+ ASMJIT_ASSERT(i < _size);
+
+ T* data = static_cast<T*>(_data) + i;
+ size_t size = --_size - i;
+
+ if (size) {
+ memmove(static_cast<void*>(data),
+ static_cast<const void*>(data + 1),
+ size_t(size) * sizeof(T));
+ }
+ }
+
+ //! Pops the last element from the vector and returns it.
+ [[nodiscard]]
+ ASMJIT_INLINE T pop() noexcept {
+ ASMJIT_ASSERT(_size > 0);
+
+ uint32_t index = --_size;
+ return data()[index];
+ }
+
+ template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
+ ASMJIT_INLINE void sort(const CompareT& cmp = CompareT()) noexcept {
+ Support::sort<T, CompareT>(data(), size(), cmp);
+ }
+
+ //! \}
+
+ //! \name Utility Functions
+ //! \{
+
+ //! Tests whether the vector contains `value`.
+ template<typename Value>
+ ASMJIT_INLINE bool contains(Value&& value) const noexcept {
+ return as_span().contains(std::forward<Value>(value));
+ }
+
+ //! Returns the first index of the given `value` or `SIZE_MAX` if it wasn't found.
+ template<typename Value>
+ ASMJIT_INLINE size_t index_of(Value&& value) const noexcept {
+ return as_span().index_of(std::forward<Value>(value));
+ }
+
+ //! Returns the last index of the given `value` or `SIZE_MAX` if it wasn't found.
+ template<typename Value>
+ ASMJIT_INLINE size_t last_index_of(Value&& value) const noexcept {
+ return as_span().index_of(std::forward<Value>(value));
+ }
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Memory Management (internal)
+ //! \{
+
+ ASMJIT_INLINE Error _reserve_fit(Arena& arena, size_t n) noexcept {
+ return ArenaVectorBase::_reserve_fit(arena, n, item_size_);
+ }
+
+ ASMJIT_INLINE Error _reserve_grow(Arena& arena, size_t n) noexcept {
+ return ArenaVectorBase::_reserve_grow(arena, n, item_size_);
+ }
+
+ ASMJIT_INLINE Error _resize_fit(Arena& arena, size_t n) noexcept {
+ return ArenaVectorBase::_resize_fit(arena, n, item_size_);
+ }
+
+ ASMJIT_INLINE Error _resize_grow(Arena& arena, size_t n) noexcept {
+ return ArenaVectorBase::_resize_grow(arena, n, item_size_);
+ }
+
+ ASMJIT_INLINE Error _reserve_additional(Arena& arena, size_t n) noexcept {
+ return ArenaVectorBase::_reserve_additional(arena, n, item_size_);
+ }
+
+ //! \}
+ //! \endcond
+
+ //! \name Memory Management
+ //! \{
+
+ //! Releases the memory held by `ArenaVector<T>` back to the `arena`.
+ ASMJIT_INLINE void release(Arena& arena) noexcept {
+ _release(arena, sizeof(T));
+ }
+
+ //! Reallocates the underlying array to fit at least `n` items with fit semantics.
+ //!
+ //! \remarks This function uses a fit policy, which means that when possible the underlying array would be
+ //! allocated to hold at least `n` elements exactly or the resulting capacity would be slightly higher.
+ [[nodiscard]]
+ ASMJIT_INLINE Error reserve_fit(Arena& arena, size_t n) noexcept {
+ if (ASMJIT_UNLIKELY(n > _capacity)) {
+ return _reserve_fit(arena, n);
+ }
+ else {
+ return Error::kOk;
+ }
+ }
+
+ //! Reallocates the underlying array to fit at least `n` items with grow semantics.
+ //!
+ //! If the vector is smaller than `n` the same growing calculations will be used as if `n` items were appended
+ //! to an empty vector, which means reserving additional space for more append operations that could follow.
+ [[nodiscard]]
+ ASMJIT_INLINE Error reserve_grow(Arena& arena, size_t n) noexcept {
+ if (ASMJIT_UNLIKELY(n > _capacity)) {
+ return _reserve_grow(arena, n);
+ }
+ else {
+ return Error::kOk;
+ }
+ }
+
+ //! Called to grow the buffer to fit at least 1 element more.
+ [[nodiscard]]
+ ASMJIT_INLINE Error reserve_additional(Arena& arena) noexcept {
+ if (ASMJIT_UNLIKELY(_size == _capacity)) {
+ return _reserve_additional(arena, 1u);
+ }
+ else {
+ return Error::kOk;
+ }
+ }
+
+ //! Called to grow the buffer to fit at least `n` elements more.
+ [[nodiscard]]
+ ASMJIT_INLINE Error reserve_additional(Arena& arena, size_t n) noexcept {
+ if (ASMJIT_UNLIKELY(_capacity - _size < n)) {
+ return _reserve_additional(arena, n);
+ }
+ else {
+ return Error::kOk;
+ }
+ }
+
+ //! Resizes the vector to hold `n` elements with fit semantics.
+ //!
+ //! If `n` is greater than the current size then the additional elements' content will be initialized to zero.
+ //! If `n` is less than the current size then the vector will be truncated to exactly `n` elements.
+ [[nodiscard]]
+ ASMJIT_INLINE Error resize_fit(Arena& arena, size_t n) noexcept {
+ return _resize_fit(arena, n);
+ }
+
+ //! Resizes the vector to hold `n` elements.
+ //!
+ //! If `n` is greater than the current size then the additional elements' content will be initialized to zero.
+ //! If `n` is less than the current size then the vector will be truncated to exactly `n` elements.
+ [[nodiscard]]
+ ASMJIT_INLINE Error resize_grow(Arena& arena, size_t n) noexcept {
+ return _resize_grow(arena, n);
+ }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_ARENAVECTOR_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/span.h b/3rdparty/asmjit/asmjit/support/span.h
new file mode 100644
index 00000000000..140738a6cb7
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/span.h
@@ -0,0 +1,337 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_SPAN_H_INCLUDED
+#define ASMJIT_SUPPORT_SPAN_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \addtogroup asmjit_core
+//! \{
+
+//! Forward iterator to avoid including `<iterator>` header for iteration over arrays, specialized for AsmJit use.
+template<typename T>
+class SpanForwardIterator {
+public:
+ //! \name Members
+ //! \{
+
+ T* ptr {};
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const T* other) const noexcept { return ptr == other; }
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const SpanForwardIterator& other) const noexcept { return ptr == other.ptr; }
+
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const T* other) const noexcept { return ptr != other; }
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const SpanForwardIterator& other) const noexcept { return ptr != other.ptr; }
+
+ ASMJIT_INLINE_CONSTEXPR SpanForwardIterator& operator++() noexcept { ptr++; return *this; }
+ ASMJIT_INLINE_CONSTEXPR SpanForwardIterator operator++(int) noexcept { SpanForwardIterator prev(*this); ptr++; return prev; }
+
+ ASMJIT_INLINE_CONSTEXPR T& operator*() const noexcept { return *ptr; }
+ ASMJIT_INLINE_CONSTEXPR T* operator->() const noexcept { return ptr; }
+
+ ASMJIT_INLINE_CONSTEXPR operator T*() const noexcept { return ptr; }
+
+ //! \}
+};
+
+//! Reverse iterator to avoid including `<iterator>` header for iteration over arrays, specialized for AsmJit use.
+template<typename T>
+class SpanReverseIterator {
+public:
+ //! \name Members
+ //! \{
+
+ T* ptr {};
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const T* other) const noexcept { return ptr == other; }
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const SpanReverseIterator& other) const noexcept { return ptr == other.ptr; }
+
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const T* other) const noexcept { return ptr != other; }
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const SpanReverseIterator& other) const noexcept { return ptr != other.ptr; }
+
+ ASMJIT_INLINE_CONSTEXPR SpanReverseIterator& operator++() noexcept { ptr--; return *this; }
+ ASMJIT_INLINE_CONSTEXPR SpanReverseIterator operator++(int) noexcept { SpanReverseIterator prev(*this); ptr--; return prev; }
+
+ ASMJIT_INLINE_CONSTEXPR T& operator*() const noexcept { return ptr[-1]; }
+ ASMJIT_INLINE_CONSTEXPR T* operator->() const noexcept { return &ptr[-1]; }
+
+ ASMJIT_INLINE_CONSTEXPR operator T*() const noexcept { return &ptr[-1]; }
+
+ //! \}
+};
+
+template<typename T>
+class SpanForwardIteratorAdaptor {
+public:
+ //! \name Types
+ //! \{
+
+ using iterator = SpanForwardIterator<T>;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ T* _begin {};
+ T* _end {};
+
+ //! \}
+
+ //! \name C++ Compatibility
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR iterator begin() const noexcept { return iterator{_begin}; };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR iterator end() const noexcept { return iterator{_end}; };
+
+ //! \}
+};
+
+template<typename T>
+class SpanReverseIteratorAdaptor {
+public:
+ //! \name Types
+ //! \{
+
+ using iterator = SpanReverseIterator<T>;
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ T* _begin {};
+ T* _end {};
+
+ //! \}
+
+ //! \name C++ Compatibility
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR iterator begin() const noexcept { return iterator{_end}; };
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR iterator end() const noexcept { return iterator{_begin}; };
+
+ //! \}
+};
+
+template<typename T>
+struct Span {
+ //! \name Members
+ //! \{
+
+ T* _data {};
+ size_t _size {};
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_CONSTEXPR Span() noexcept = default;
+
+ template<typename Other>
+ ASMJIT_INLINE_CONSTEXPR Span(Span<Other> other) noexcept
+ : _data(other.data()),
+ _size(other.size()) {}
+
+ ASMJIT_INLINE_CONSTEXPR Span(T* data, size_t size) noexcept
+ : _data(data),
+ _size(size) {}
+
+ template<size_t N>
+ static ASMJIT_INLINE_CONSTEXPR Span<T> from_array(T(&array)[N]) noexcept {
+ return Span<T>(array, N);
+ }
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ template<typename OtherT>
+ ASMJIT_INLINE_CONSTEXPR T& operator=(Span<OtherT> other) noexcept {
+ _data = other._data;
+ _size = other._size;
+ return *this;
+ }
+
+ template<typename OtherT>
+ [[nodiscard]]
+ ASMJIT_INLINE bool operator==(const Span<OtherT>& other) noexcept { return equals(other); }
+
+ template<typename OtherT>
+ [[nodiscard]]
+ ASMJIT_INLINE bool operator!=(const Span<OtherT>& other) noexcept { return !equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE T& operator[](size_t index) noexcept {
+ ASMJIT_ASSERT(index < _size);
+ return _data[index];
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE const T& operator[](size_t index) const noexcept {
+ ASMJIT_ASSERT(index < _size);
+ return _data[index];
+ }
+
+ //! \}
+
+ //! \name Common Functionality
+ //! \{
+
+ template<typename OtherT>
+ [[nodiscard]]
+ ASMJIT_INLINE bool equals(Span<OtherT> other) const noexcept {
+ size_t size = _size;
+
+ if (size != other.size()) {
+ return false;
+ }
+
+ for (size_t i = 0u; i < size; i++) {
+ if (_data[i] != other._data[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ ASMJIT_INLINE void swap(Span<T>& other) noexcept {
+ std::swap(_data, other._data);
+ std::swap(_size, other._size);
+ }
+
+ //! \}
+
+ //! \name Data Accessors
+ //! \{
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR T* data() noexcept { return _data; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR const T* data() const noexcept { return _data; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR const T* cdata() const noexcept { return _data; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR size_t size() const noexcept { return _size; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_empty() const noexcept { return _size == 0u; }
+
+ //! Returns a reference to the first element of the span.
+ //!
+ //! \remarks The span must have at least one element. Attempting to use `first()` on empty span will trigger
+ //! an assertion failure in debug builds.
+ [[nodiscard]]
+ ASMJIT_INLINE T& first() noexcept { return operator[](0u); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE const T& first() const noexcept { return operator[](0u); }
+
+ //! Returns a reference to the last element of the span.
+ //!
+ //! \remarks The span must have at least one element. Attempting to use `last()` on empty span will trigger
+ //! an assertion failure in debug builds.
+ [[nodiscard]]
+ ASMJIT_INLINE T& last() noexcept { return operator[](_size - 1u); }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE const T& last() const noexcept { return operator[](_size - 1u); }
+
+ //! \}
+
+ //! \name Utility Functions
+ //! \{
+
+ //! Tests whether the vector contains `value`.
+ template<typename Value>
+ [[nodiscard]]
+ ASMJIT_INLINE bool contains(Value&& value) const noexcept {
+ size_t size = _size;
+
+ for (size_t i = 0u; i < size; i++) {
+ if (_data[i] == value) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ //! Returns the first index of the given `value` or `SIZE_MAX` if it wasn't found'.
+ template<typename Value>
+ [[nodiscard]]
+ ASMJIT_INLINE size_t index_of(Value&& value) const noexcept {
+ size_t size = _size;
+
+ for (size_t i = 0u; i < size; i++) {
+ if (_data[i] == value) {
+ return i;
+ }
+ }
+
+ return SIZE_MAX;
+ }
+
+ //! Returns the last index of the given `value` or `SIZE_MAX` if it wasn't found.
+ template<typename Value>
+ [[nodiscard]]
+ ASMJIT_INLINE size_t last_index_of(Value&& value) const noexcept {
+ size_t i = _size;
+
+ while (--i != SIZE_MAX) {
+ if (_data[i] == value) {
+ break;
+ }
+ }
+
+ return i;
+ }
+
+ //! \}
+
+ //! \name Iteration
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG T* begin() const noexcept { return _data; }
+ ASMJIT_INLINE_NODEBUG T* end() const noexcept { return _data + _size; }
+
+ ASMJIT_INLINE_NODEBUG SpanForwardIteratorAdaptor<T> iterate() const noexcept { return SpanForwardIteratorAdaptor<T>{begin(), end()}; }
+ ASMJIT_INLINE_NODEBUG SpanReverseIteratorAdaptor<T> iterate_reverse() const noexcept { return SpanReverseIteratorAdaptor<T>{begin(), end()}; }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_SPAN_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/support.cpp b/3rdparty/asmjit/asmjit/support/support.cpp
new file mode 100644
index 00000000000..07ed1e0f26c
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/support.cpp
@@ -0,0 +1,679 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+// Support - Tests
+// ===============
+
+#if defined(ASMJIT_TEST)
+template<typename T>
+static void test_arrays(const T* a, const T* b, size_t size) noexcept {
+ for (size_t i = 0; i < size; i++)
+ EXPECT_EQ(a[i], b[i])
+ .message("Mismatch at %u", unsigned(i));
+}
+
+static void test_alignment() noexcept {
+ INFO("Support::is_aligned()");
+ EXPECT_FALSE(Support::is_aligned<size_t>(0xFFFF, 4u));
+ EXPECT_TRUE(Support::is_aligned<size_t>(0xFFF4, 4u));
+ EXPECT_TRUE(Support::is_aligned<size_t>(0xFFF8, 8u));
+ EXPECT_TRUE(Support::is_aligned<size_t>(0xFFF0, 16u));
+
+ INFO("Support::align_up()");
+ EXPECT_EQ(Support::align_up<size_t>(0xFFFF, 4), 0x10000u);
+ EXPECT_EQ(Support::align_up<size_t>(0xFFF4, 4), 0x0FFF4u);
+ EXPECT_EQ(Support::align_up<size_t>(0xFFF8, 8), 0x0FFF8u);
+ EXPECT_EQ(Support::align_up<size_t>(0xFFF0, 16), 0x0FFF0u);
+ EXPECT_EQ(Support::align_up<size_t>(0xFFF0, 32), 0x10000u);
+
+ INFO("Support::align_up_diff()");
+ EXPECT_EQ(Support::align_up_diff<size_t>(0xFFFF, 4), 1u);
+ EXPECT_EQ(Support::align_up_diff<size_t>(0xFFF4, 4), 0u);
+ EXPECT_EQ(Support::align_up_diff<size_t>(0xFFF8, 8), 0u);
+ EXPECT_EQ(Support::align_up_diff<size_t>(0xFFF0, 16), 0u);
+ EXPECT_EQ(Support::align_up_diff<size_t>(0xFFF0, 32), 16u);
+
+ INFO("Support::align_up_power_of_2()");
+ EXPECT_EQ(Support::align_up_power_of_2<size_t>(0x0000), 0x00000u);
+ EXPECT_EQ(Support::align_up_power_of_2<size_t>(0xFFFF), 0x10000u);
+ EXPECT_EQ(Support::align_up_power_of_2<size_t>(0xF123), 0x10000u);
+ EXPECT_EQ(Support::align_up_power_of_2<size_t>(0x0F00), 0x01000u);
+ EXPECT_EQ(Support::align_up_power_of_2<size_t>(0x0100), 0x00100u);
+ EXPECT_EQ(Support::align_up_power_of_2<size_t>(0x1001), 0x02000u);
+}
+
+static void test_bit_utils() noexcept {
+ INFO("Support::clz()");
+ for (uint32_t i = 0; i < 8; i++) EXPECT_EQ(Support::clz_t(uint8_t (1u << i)), 7 - i);
+ for (uint32_t i = 0; i < 16; i++) EXPECT_EQ(Support::clz_t(uint16_t(1u << i)), 15 - i);
+ for (uint32_t i = 0; i < 32; i++) EXPECT_EQ(Support::clz_t(uint32_t(1u << i)), 31 - i);
+ for (uint32_t i = 0; i < 64; i++) EXPECT_EQ(Support::clz_t(uint64_t(1u) << i), 63 - i);
+
+ for (uint32_t i = 0; i < 8; i++) EXPECT_EQ(Support::clz(uint8_t (1u << i)), 7 - i);
+ for (uint32_t i = 0; i < 16; i++) EXPECT_EQ(Support::clz(uint16_t(1u << i)), 15 - i);
+ for (uint32_t i = 0; i < 32; i++) EXPECT_EQ(Support::clz(uint32_t(1u << i)), 31 - i);
+ for (uint32_t i = 0; i < 64; i++) EXPECT_EQ(Support::clz(uint64_t(1u) << i), 63 - i);
+
+ INFO("Support::ctz()");
+ for (uint32_t i = 0; i < 8; i++) EXPECT_EQ(Support::ctz_t(uint8_t (1u << i)), i);
+ for (uint32_t i = 0; i < 16; i++) EXPECT_EQ(Support::ctz_t(uint16_t(1u << i)), i);
+ for (uint32_t i = 0; i < 32; i++) EXPECT_EQ(Support::ctz_t(uint32_t(1u << i)), i);
+ for (uint32_t i = 0; i < 64; i++) EXPECT_EQ(Support::ctz_t(uint64_t(1u) << i), i);
+
+ for (uint32_t i = 0; i < 32; i++) EXPECT_EQ(Support::ctz(uint32_t(1) << i), i);
+ for (uint32_t i = 0; i < 64; i++) EXPECT_EQ(Support::ctz(uint64_t(1) << i), i);
+
+ INFO("Support::popcnt()");
+ for (uint32_t i = 0; i < 32; i++) EXPECT_EQ(Support::popcnt((uint32_t(1) << i)), 1u);
+ for (uint32_t i = 0; i < 64; i++) EXPECT_EQ(Support::popcnt((uint64_t(1) << i)), 1u);
+ EXPECT_EQ(Support::popcnt(0x000000F0), 4u);
+ EXPECT_EQ(Support::popcnt(0x10101010), 4u);
+ EXPECT_EQ(Support::popcnt(0xFF000000), 8u);
+ EXPECT_EQ(Support::popcnt(0xFFFFFFF7), 31u);
+ EXPECT_EQ(Support::popcnt(0x7FFFFFFF), 31u);
+
+ INFO("Support::shl() / shr()");
+ EXPECT_EQ(Support::shl(int32_t(0x00001111), 16), int32_t(0x11110000u));
+ EXPECT_EQ(Support::shl(uint32_t(0x00001111), 16), uint32_t(0x11110000u));
+ EXPECT_EQ(Support::shr(int32_t(0x11110000u), 16), int32_t(0x00001111u));
+ EXPECT_EQ(Support::shr(uint32_t(0x11110000u), 16), uint32_t(0x00001111u));
+ EXPECT_EQ(Support::sar(int32_t(0xFFFF0000u), 16), int32_t(0xFFFFFFFFu));
+ EXPECT_EQ(Support::sar(uint32_t(0xFFFF0000u), 16), uint32_t(0xFFFFFFFFu));
+
+ INFO("Support::blsi()");
+ for (uint32_t i = 0; i < 32; i++) EXPECT_EQ(Support::blsi(uint32_t(1) << i), uint32_t(1) << i);
+ for (uint32_t i = 0; i < 31; i++) EXPECT_EQ(Support::blsi(uint32_t(3) << i), uint32_t(1) << i);
+ for (uint32_t i = 0; i < 64; i++) EXPECT_EQ(Support::blsi(uint64_t(1) << i), uint64_t(1) << i);
+ for (uint32_t i = 0; i < 63; i++) EXPECT_EQ(Support::blsi(uint64_t(3) << i), uint64_t(1) << i);
+
+ INFO("Support::bit_mask()");
+ EXPECT_EQ(Support::bit_mask<uint32_t>(0, 1, 7), 0x83u);
+ for (uint32_t i = 0; i < 32; i++) {
+ EXPECT_EQ(Support::bit_mask<uint32_t>(i), (1u << i));
+ }
+
+ INFO("Support::bit_test()");
+ for (uint32_t i = 0; i < 32; i++) {
+ EXPECT_TRUE(Support::bit_test((1 << i), i))
+ .message("Support::bit_test(0x%X, %u) should return true", (1u << i), i);
+ }
+
+ INFO("Support::lsb_mask<uint32_t>()");
+ for (uint32_t i = 0; i < 32; i++) {
+ uint32_t expected_bits = 0;
+ for (uint32_t b = 0; b < i; b++)
+ expected_bits |= uint32_t(1) << b;
+ EXPECT_EQ(Support::lsb_mask<uint32_t>(i), expected_bits);
+ }
+
+ INFO("Support::lsb_mask<uint64_t>()");
+ for (uint32_t i = 0; i < 64; i++) {
+ uint64_t expected_bits = 0;
+ for (uint32_t b = 0; b < i; b++)
+ expected_bits |= uint64_t(1) << b;
+ EXPECT_EQ(Support::lsb_mask<uint64_t>(i), expected_bits);
+ }
+
+ INFO("Support::fill_trailing_bits()");
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(0u)), uint8_t(0u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(1u)), uint8_t(1u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(2u)), uint8_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(3u)), uint8_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(4u)), uint8_t(7u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(0x80u)), uint8_t(0xFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(0xFEu)), uint8_t(0xFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint8_t(0xFFu)), uint8_t(0xFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(0u)), uint16_t(0u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(1u)), uint16_t(1u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(2u)), uint16_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(3u)), uint16_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(4u)), uint16_t(7u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(0x8000u)), uint16_t(0xFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(0xFFFEu)), uint16_t(0xFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint16_t(0xFFFFu)), uint16_t(0xFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(0u)), uint32_t(0u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(1u)), uint32_t(1u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(2u)), uint32_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(3u)), uint32_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(4u)), uint32_t(7u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(0x80000000u)), uint32_t(0xFFFFFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(0xFFFFFFFEu)), uint32_t(0xFFFFFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint32_t(0xFFFFFFFFu)), uint32_t(0xFFFFFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(0u)), uint64_t(0u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(1u)), uint64_t(1u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(2u)), uint64_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(3u)), uint64_t(3u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(4u)), uint64_t(7u));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(0x8000000000000000u)), uint64_t(0xFFFFFFFFFFFFFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(0xFFFFFFFFFFFFFFFEu)), uint64_t(0xFFFFFFFFFFFFFFFFu));
+ EXPECT_EQ(Support::fill_trailing_bits(uint64_t(0xFFFFFFFFFFFFFFFFu)), uint64_t(0xFFFFFFFFFFFFFFFFu));
+
+ INFO("Support::is_power_of_2()");
+ EXPECT_FALSE(Support::is_power_of_2(uint8_t(0)));
+ EXPECT_FALSE(Support::is_power_of_2(uint16_t(0)));
+ EXPECT_FALSE(Support::is_power_of_2(uint32_t(0)));
+ EXPECT_FALSE(Support::is_power_of_2(uint64_t(0)));
+
+ EXPECT_FALSE(Support::is_power_of_2(uint8_t(0xFFu)));
+ EXPECT_FALSE(Support::is_power_of_2(uint16_t(0xFFFFu)));
+ EXPECT_FALSE(Support::is_power_of_2(uint32_t(0xFFFFFFFFu)));
+ EXPECT_FALSE(Support::is_power_of_2(uint64_t(0xFFFFFFFFFFFFFFFFu)));
+
+ for (uint32_t i = 0; i < 32; i++) {
+ EXPECT_TRUE(Support::is_power_of_2(uint32_t(1) << i));
+ EXPECT_FALSE(Support::is_power_of_2((uint32_t(1) << i) ^ 0x001101));
+ }
+
+ for (uint32_t i = 0; i < 64; i++) {
+ EXPECT_TRUE(Support::is_power_of_2(uint64_t(1) << i));
+ EXPECT_FALSE(Support::is_power_of_2((uint64_t(1) << i) ^ 0x001101));
+ }
+
+ INFO("Support::is_power_of_2_up_to()");
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint8_t(0), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint16_t(0), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(0), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint64_t(0), 8));
+
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint8_t(0xFFu), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint16_t(0xFFFFu), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(0xFFFFFFFFu), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint64_t(0xFFFFFFFFFFFFFFFFu), 8));
+
+ EXPECT_TRUE(Support::is_power_of_2_up_to(uint32_t(1), 8));
+ EXPECT_TRUE(Support::is_power_of_2_up_to(uint32_t(2), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(3), 8));
+ EXPECT_TRUE(Support::is_power_of_2_up_to(uint32_t(4), 8));
+ EXPECT_TRUE(Support::is_power_of_2_up_to(uint32_t(8), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(9), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(16), 8));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(0xFFFFFFFFu), 8));
+
+ EXPECT_TRUE(Support::is_power_of_2_up_to(uint32_t(16), 16));
+ EXPECT_FALSE(Support::is_power_of_2_up_to(uint32_t(32), 16));
+
+ INFO("Support::is_zero_or_power_of_2()");
+ EXPECT_TRUE(Support::is_zero_or_power_of_2(uint8_t(0)));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2(uint16_t(0)));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2(uint32_t(0)));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2(uint64_t(0)));
+
+ EXPECT_FALSE(Support::is_zero_or_power_of_2(uint8_t(0xFFu)));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2(uint16_t(0xFFFFu)));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2(uint32_t(0xFFFFFFFFu)));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2(uint64_t(0xFFFFFFFFFFFFFFFFu)));
+
+ for (uint32_t i = 0; i < 32; i++) {
+ EXPECT_TRUE(Support::is_zero_or_power_of_2(uint32_t(1) << i));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2((uint32_t(1) << i) ^ 0x001101));
+ }
+
+ for (uint32_t i = 0; i < 64; i++) {
+ EXPECT_TRUE(Support::is_zero_or_power_of_2(uint64_t(1) << i));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2((uint64_t(1) << i) ^ 0x001101));
+ }
+
+ INFO("Support::is_zero_or_power_of_2_up_to()");
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint8_t(0), 8));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint16_t(0), 8));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint32_t(0), 8));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint64_t(0), 8));
+
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint8_t(0xFFu), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint16_t(0xFFFFu), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint32_t(0xFFFFFFFFu), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint64_t(0xFFFFFFFFFFFFFFFFu), 8));
+
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint32_t(1), 8));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint32_t(2), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint32_t(3), 8));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint32_t(4), 8));
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint32_t(8), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint32_t(9), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint32_t(16), 8));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint32_t(0xFFFFFFFFu), 8));
+
+ EXPECT_TRUE(Support::is_zero_or_power_of_2_up_to(uint32_t(16), 16));
+ EXPECT_FALSE(Support::is_zero_or_power_of_2_up_to(uint32_t(32), 16));
+}
+
+static void test_int_utils() noexcept {
+ INFO("Support::byteswap()");
+ EXPECT_EQ(Support::byteswap16(0x0102), 0x0201u);
+ EXPECT_EQ(Support::byteswap32(0x01020304), 0x04030201u);
+ EXPECT_EQ(Support::byteswap32(0x01020304), 0x04030201u);
+ EXPECT_EQ(Support::byteswap64(uint64_t(0x0102030405060708)), uint64_t(0x0807060504030201));
+
+ INFO("Support::bytepack()");
+ union BytePackData {
+ uint8_t bytes[4];
+ uint32_t u32;
+ } bpdata;
+
+ bpdata.u32 = Support::bytepack32_4x8(0x00, 0x11, 0x22, 0x33);
+ EXPECT_EQ(bpdata.bytes[0], 0x00);
+ EXPECT_EQ(bpdata.bytes[1], 0x11);
+ EXPECT_EQ(bpdata.bytes[2], 0x22);
+ EXPECT_EQ(bpdata.bytes[3], 0x33);
+
+ INFO("Support::is_between()");
+ EXPECT_TRUE(Support::is_between<int>(10 , 10, 20));
+ EXPECT_TRUE(Support::is_between<int>(11 , 10, 20));
+ EXPECT_TRUE(Support::is_between<int>(20 , 10, 20));
+ EXPECT_FALSE(Support::is_between<int>(9 , 10, 20));
+ EXPECT_FALSE(Support::is_between<int>(21 , 10, 20));
+ EXPECT_FALSE(Support::is_between<int>(101, 10, 20));
+
+ INFO("Support::is_int_n<8>()");
+ EXPECT_TRUE(Support::is_int_n<8>(-128));
+ EXPECT_TRUE(Support::is_int_n<8>(127));
+ EXPECT_FALSE(Support::is_int_n<8>(-129));
+ EXPECT_FALSE(Support::is_int_n<8>(-1000));
+ EXPECT_FALSE(Support::is_int_n<8>(128));
+ EXPECT_FALSE(Support::is_int_n<8>(1000));
+
+ INFO("Support::is_int_n<9>()");
+ EXPECT_TRUE(Support::is_int_n<9>(-256));
+ EXPECT_TRUE(Support::is_int_n<9>(255));
+ EXPECT_FALSE(Support::is_int_n<9>(-257));
+ EXPECT_FALSE(Support::is_int_n<9>(-1000));
+ EXPECT_FALSE(Support::is_int_n<9>(256));
+ EXPECT_FALSE(Support::is_int_n<9>(1000));
+
+ INFO("Support::is_int_n<10>()");
+ EXPECT_TRUE(Support::is_int_n<10>(-512));
+ EXPECT_TRUE(Support::is_int_n<10>(511));
+ EXPECT_FALSE(Support::is_int_n<10>(-513));
+ EXPECT_FALSE(Support::is_int_n<10>(-1000));
+ EXPECT_FALSE(Support::is_int_n<10>(512));
+ EXPECT_FALSE(Support::is_int_n<10>(1000));
+
+ INFO("Support::is_int_n<16>()");
+ EXPECT_TRUE(Support::is_int_n<16>(-32768));
+ EXPECT_TRUE(Support::is_int_n<16>(32767));
+ EXPECT_FALSE(Support::is_int_n<16>(-32769));
+ EXPECT_FALSE(Support::is_int_n<16>(-100000));
+ EXPECT_FALSE(Support::is_int_n<16>(32768));
+ EXPECT_FALSE(Support::is_int_n<16>(100000));
+
+ INFO("Support::is_int_n<33>()");
+ EXPECT_TRUE(Support::is_int_n<33>(int64_t(4294967295)));
+ EXPECT_TRUE(Support::is_int_n<33>(int64_t(-4294967296)));
+ EXPECT_FALSE(Support::is_int_n<33>(uint64_t(4294967296)));
+ EXPECT_FALSE(Support::is_int_n<33>(uint64_t(0x1FFFFFFFFu)));
+ EXPECT_FALSE(Support::is_int_n<33>(uint64_t(0x1FFFFFFFFu) + 1));
+
+ INFO("Support::is_int_n<33>()");
+ EXPECT_TRUE(Support::is_int_n<32>( 2147483647 ));
+ EXPECT_TRUE(Support::is_int_n<32>(-2147483647 - 1));
+ EXPECT_FALSE(Support::is_int_n<32>(uint64_t(2147483648u)));
+ EXPECT_FALSE(Support::is_int_n<32>(uint64_t(0xFFFFFFFFu)));
+ EXPECT_FALSE(Support::is_int_n<32>(uint64_t(0xFFFFFFFFu) + 1));
+
+ INFO("Support::is_uint_n<8>()");
+ EXPECT_TRUE(Support::is_uint_n<8>(0));
+ EXPECT_TRUE(Support::is_uint_n<8>(255));
+ EXPECT_FALSE(Support::is_uint_n<8>(256));
+ EXPECT_FALSE(Support::is_uint_n<8>(1000));
+ EXPECT_FALSE(Support::is_uint_n<8>(-1));
+ EXPECT_FALSE(Support::is_uint_n<8>(-1000));
+
+ INFO("Support::is_uint_n<9>()");
+ EXPECT_TRUE(Support::is_uint_n<9>(0) );
+ EXPECT_TRUE(Support::is_uint_n<9>(511));
+ EXPECT_FALSE(Support::is_uint_n<9>(512));
+ EXPECT_FALSE(Support::is_uint_n<9>(1000));
+ EXPECT_FALSE(Support::is_uint_n<9>(-1));
+ EXPECT_FALSE(Support::is_uint_n<9>(-1000));
+
+ INFO("Support::is_uint_n<10>()");
+ EXPECT_TRUE(Support::is_uint_n<10>(0) );
+ EXPECT_TRUE(Support::is_uint_n<10>(1023));
+ EXPECT_FALSE(Support::is_uint_n<10>(1024));
+ EXPECT_FALSE(Support::is_uint_n<10>(10000));
+ EXPECT_FALSE(Support::is_uint_n<10>(-1));
+ EXPECT_FALSE(Support::is_uint_n<10>(-10000));
+
+ INFO("Support::is_uint_n<12>()");
+ EXPECT_TRUE(Support::is_uint_n<12>(0));
+ EXPECT_TRUE(Support::is_uint_n<12>(4095));
+ EXPECT_FALSE(Support::is_uint_n<12>(4096));
+ EXPECT_FALSE(Support::is_uint_n<12>(10000));
+ EXPECT_FALSE(Support::is_uint_n<12>(-1));
+ EXPECT_FALSE(Support::is_uint_n<12>(-1000));
+
+ INFO("Support::is_uint_n<16>()");
+ EXPECT_TRUE(Support::is_uint_n<16>(0));
+ EXPECT_TRUE(Support::is_uint_n<16>(65535));
+ EXPECT_FALSE(Support::is_uint_n<16>(65536));
+ EXPECT_FALSE(Support::is_uint_n<16>(100000));
+ EXPECT_FALSE(Support::is_uint_n<16>(-1));
+ EXPECT_FALSE(Support::is_uint_n<16>(-1000));
+
+ INFO("Support::is_uint_n<32>()");
+ EXPECT_TRUE(Support::is_uint_n<32>(uint64_t(0xFFFFFFFF)));
+ EXPECT_FALSE(Support::is_uint_n<32>(uint64_t(0xFFFFFFFF) + 1));
+ EXPECT_FALSE(Support::is_uint_n<32>(-1));
+
+ INFO("Support::is_uint_n<33>()");
+ EXPECT_TRUE(Support::is_uint_n<33>(uint64_t(0x1FFFFFFFF)));
+ EXPECT_FALSE(Support::is_uint_n<33>(uint64_t(0x1FFFFFFFF) + 1));
+ EXPECT_FALSE(Support::is_uint_n<33>(-1));
+}
+
+static void test_memory_access() noexcept {
+ INFO("Support::load() / store()");
+
+ uint8_t arr[32] = { 0 };
+
+ Support::storeu_u16_be(arr + 1, 0x0102u);
+ Support::storeu_u16_be(arr + 3, 0x0304u);
+ EXPECT_EQ(Support::loadu_u32_be(arr + 1), 0x01020304u);
+ EXPECT_EQ(Support::loadu_u32_le(arr + 1), 0x04030201u);
+ EXPECT_EQ(Support::loadu_u32_be(arr + 2), 0x02030400u);
+ EXPECT_EQ(Support::loadu_u32_le(arr + 2), 0x00040302u);
+
+ Support::storeu_u32_le(arr + 5, 0x05060708u);
+ EXPECT_EQ(Support::loadu_u64_be(arr + 1), 0x0102030408070605u);
+ EXPECT_EQ(Support::loadu_u64_le(arr + 1), 0x0506070804030201u);
+
+ Support::storeu_u64_le(arr + 7, 0x1122334455667788u);
+ EXPECT_EQ(Support::loadu_u32_be(arr + 8), 0x77665544u);
+
+ double d = 134.44;
+ Support::storeu(arr, d);
+ EXPECT_EQ(Support::loadu<double>(arr), d);
+}
+
+static void test_bit_vector() noexcept {
+ INFO("Support::bit_vector_op");
+ {
+ uint32_t vec[3] = { 0 };
+ Support::bit_vector_fill(vec, 1, 64);
+ EXPECT_EQ(vec[0], 0xFFFFFFFEu);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0x00000001u);
+
+ Support::bit_vector_clear(vec, 1, 1);
+ EXPECT_EQ(vec[0], 0xFFFFFFFCu);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0x00000001u);
+
+ Support::bit_vector_fill(vec, 0, 32);
+ EXPECT_EQ(vec[0], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0x00000001u);
+
+ Support::bit_vector_clear(vec, 0, 32);
+ EXPECT_EQ(vec[0], 0x00000000u);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0x00000001u);
+
+ Support::bit_vector_fill(vec, 1, 30);
+ EXPECT_EQ(vec[0], 0x7FFFFFFEu);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0x00000001u);
+
+ Support::bit_vector_clear(vec, 1, 95);
+ EXPECT_EQ(vec[0], 0x00000000u);
+ EXPECT_EQ(vec[1], 0x00000000u);
+ EXPECT_EQ(vec[2], 0x00000000u);
+
+ Support::bit_vector_fill(vec, 32, 64);
+ EXPECT_EQ(vec[0], 0x00000000u);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0xFFFFFFFFu);
+
+ Support::bit_vector_set_bit(vec, 1, true);
+ EXPECT_EQ(vec[0], 0x00000002u);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0xFFFFFFFFu);
+
+ Support::bit_vector_set_bit(vec, 95, false);
+ EXPECT_EQ(vec[0], 0x00000002u);
+ EXPECT_EQ(vec[1], 0xFFFFFFFFu);
+ EXPECT_EQ(vec[2], 0x7FFFFFFFu);
+
+ Support::bit_vector_clear(vec, 33, 32);
+ EXPECT_EQ(vec[0], 0x00000002u);
+ EXPECT_EQ(vec[1], 0x00000001u);
+ EXPECT_EQ(vec[2], 0x7FFFFFFEu);
+ }
+
+ INFO("Support::bit_vector_index_of");
+ {
+ uint32_t vec1[1] = { 0x80000000 };
+ EXPECT_EQ(Support::bit_vector_index_of(vec1, 0, true), 31u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec1, 1, true), 31u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec1, 31, true), 31u);
+
+ uint32_t vec2[2] = { 0x00000000, 0x80000000 };
+ EXPECT_EQ(Support::bit_vector_index_of(vec2, 0, true), 63u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec2, 1, true), 63u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec2, 31, true), 63u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec2, 32, true), 63u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec2, 33, true), 63u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec2, 63, true), 63u);
+
+ uint32_t vec3[3] = { 0x00000001, 0x00000000, 0x80000000 };
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 0, true), 0u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 1, true), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 2, true), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 31, true), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 32, true), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 63, true), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 64, true), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec3, 95, true), 95u);
+
+ uint32_t vec4[3] = { ~vec3[0], ~vec3[1], ~vec3[2] };
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 0, false), 0u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 1, false), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 2, false), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 31, false), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 32, false), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 63, false), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 64, false), 95u);
+ EXPECT_EQ(Support::bit_vector_index_of(vec4, 95, false), 95u);
+ }
+
+ INFO("Support::BitWordIterator<uint32_t>");
+ {
+ Support::BitWordIterator<uint32_t> it(0x80000F01u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 0u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 8u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 9u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 10u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 11u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 31u);
+ EXPECT_FALSE(it.has_next());
+
+ // No bits set.
+ it.init(0x00000000u);
+ EXPECT_FALSE(it.has_next());
+
+ // Only first bit set.
+ it.init(0x00000001u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 0u);
+ EXPECT_FALSE(it.has_next());
+
+ // Only last bit set (special case).
+ it.init(0x80000000u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 31u);
+ EXPECT_FALSE(it.has_next());
+ }
+
+ INFO("Support::BitWordIterator<uint64_t>");
+ {
+ Support::BitWordIterator<uint64_t> it(uint64_t(1) << 63);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 63u);
+ EXPECT_FALSE(it.has_next());
+ }
+
+ INFO("Support::BitVectorIterator<uint32_t>");
+ {
+ // Border cases.
+ static const uint32_t bits_none[] = { 0xFFFFFFFFu };
+ Support::BitVectorIterator<uint32_t> it(Span<const uint32_t>(bits_none, 0));
+
+ EXPECT_FALSE(it.has_next());
+ it.init(Span<const uint32_t>(bits_none, 0), 1);
+ EXPECT_FALSE(it.has_next());
+ it.init(Span<const uint32_t>(bits_none, 0), 128);
+ EXPECT_FALSE(it.has_next());
+
+ static const uint32_t bits1[] = { 0x80000008u, 0x80000001u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x00003000u };
+ it.init(Span<const uint32_t>::from_array(bits1));
+
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 3u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 31u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 32u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 63u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 127u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 204u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 205u);
+ EXPECT_FALSE(it.has_next());
+
+ it.init(Span<const uint32_t>::from_array(bits1), 4);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 31u);
+
+ it.init(Span<const uint32_t>::from_array(bits1), 64);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 127u);
+
+ it.init(Span<const uint32_t>::from_array(bits1), 127);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 127u);
+
+ static const uint32_t bits2[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u };
+ it.init(Span<const uint32_t>::from_array(bits2));
+
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 31u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 63u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 127u);
+ EXPECT_FALSE(it.has_next());
+
+ static const uint32_t bits3[] = { 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u };
+ it.init(Span<const uint32_t>::from_array(bits3));
+ EXPECT_FALSE(it.has_next());
+
+ static const uint32_t bits4[] = { 0x00000000u, 0x00000000u, 0x00000000u, 0x80000000u };
+ it.init(Span<const uint32_t>::from_array(bits4));
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 127u);
+ EXPECT_FALSE(it.has_next());
+ }
+
+ INFO("Support::BitVectorIterator<uint64_t>");
+ {
+ static const uint64_t bits1[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u };
+ Support::BitVectorIterator<uint64_t> it(Span<const uint64_t>::from_array(bits1));
+
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 31u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 95u);
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 223u);
+ EXPECT_FALSE(it.has_next());
+
+ static const uint64_t bits2[] = { 0x8000000000000000u, 0, 0, 0 };
+ it.init(Span<const uint64_t>::from_array(bits2));
+
+ EXPECT_TRUE(it.has_next());
+ EXPECT_EQ(it.next(), 63u);
+ EXPECT_FALSE(it.has_next());
+ }
+}
+
+static void test_sorting() noexcept {
+ INFO("Support::sort() - Testing qsort and isort of predefined arrays");
+ {
+ constexpr size_t kArraySize = 11;
+
+ int ref_[kArraySize] = { -4, -2, -1, 0, 1, 9, 12, 13, 14, 19, 22 };
+ int arr1[kArraySize] = { 0, 1, -1, 19, 22, 14, -4, 9, 12, 13, -2 };
+ int arr2[kArraySize];
+
+ memcpy(arr2, arr1, kArraySize * sizeof(int));
+
+ Support::insertion_sort(arr1, kArraySize);
+ Support::sort(arr2, kArraySize);
+ test_arrays(arr1, ref_, kArraySize);
+ test_arrays(arr2, ref_, kArraySize);
+ }
+
+ INFO("Support::sort() - Testing qsort and isort of artificial arrays");
+ {
+ constexpr size_t kArraySize = 200;
+
+ int arr1[kArraySize];
+ int arr2[kArraySize];
+ int ref_[kArraySize];
+
+ for (size_t size = 2; size < kArraySize; size++) {
+ for (size_t i = 0; i < size; i++) {
+ arr1[i] = int(size - 1 - i);
+ arr2[i] = int(size - 1 - i);
+ ref_[i] = int(i);
+ }
+
+ Support::insertion_sort(arr1, size);
+ Support::sort(arr2, size);
+ test_arrays(arr1, ref_, size);
+ test_arrays(arr2, ref_, size);
+ }
+ }
+
+ INFO("Support::sort() - Testing qsort and isort with an unstable compare function");
+ {
+ constexpr size_t kArraySize = 5;
+
+ float arr1[kArraySize] = { 1.0f, 0.0f, 3.0f, -1.0f, std::numeric_limits<float>::quiet_NaN() };
+ float arr2[kArraySize] = { };
+
+ memcpy(arr2, arr1, kArraySize * sizeof(float));
+
+ // We don't test as it's undefined where the NaN would be.
+ Support::insertion_sort(arr1, kArraySize);
+ Support::sort(arr2, kArraySize);
+ }
+}
+
+UNIT(support) {
+ test_alignment();
+ test_bit_utils();
+ test_int_utils();
+ test_memory_access();
+ test_bit_vector();
+ test_sorting();
+}
+#endif
+
+ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/asmjit/support/support.h b/3rdparty/asmjit/asmjit/support/support.h
new file mode 100644
index 00000000000..1fc17119d9f
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/support.h
@@ -0,0 +1,1898 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_SUPPORT_H_INCLUDED
+#define ASMJIT_SUPPORT_SUPPORT_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+#include <asmjit/support/span.h>
+
+#if defined(_MSC_VER)
+ #include <intrin.h>
+#elif defined(__BMI2__)
+ #include <x86intrin.h>
+#endif
+
+ASMJIT_BEGIN_NAMESPACE
+
+// Support - Define Core Macros
+// ============================
+
+// The code below is designed to by shareable between projects, so define the necessary macros here...
+#define SUPPORT_ASSERT ASMJIT_ASSERT
+#define SUPPORT_INLINE ASMJIT_INLINE
+#define SUPPORT_INLINE_NODEBUG ASMJIT_INLINE_NODEBUG
+
+//! \addtogroup asmjit_utilities
+//! \{
+
+//! Contains support classes and functions that may be used by AsmJit source and header files. Anything defined
+//! here is considered internal and should not be used outside of AsmJit and related projects like AsmTK.
+namespace Support {
+
+// Support - Maybe Unused
+// ======================
+
+//! Silences warnings about unused arguments or variables - more variables can be passed to `maybe_unused()` at once.
+template<typename... Args>
+static SUPPORT_INLINE_NODEBUG void maybe_unused(Args&&...) noexcept {}
+
+// Support - Byte Order
+// ====================
+
+//! Byte order.
+enum class ByteOrder {
+ //! Little endian.
+ kLE = 0,
+ //! Big endian.
+ kBE = 1,
+
+ //! Native byte order of the target architecture.
+#if defined(__ARMEB__) || defined(__MIPSEB__) || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
+ kNative = kBE
+#else
+ kNative = kLE
+#endif
+};
+
+// Support - Standard Types
+// ========================
+
+//! std_int<Size, Unsigned> - Makes a signed or unsigned int-type by size that uses internally the same type as
+//! defined by <stdint.h> - thus only `[u]int[8|16|32|64]` types are used here. This is beneficial for creating
+//! abstractions that specialize handling of 32-bit and 64-bit types as only two specializations would be required
+//! to cover them all.
+//!
+//! Additionally, std_int can be used to turn enums into their underlying representations, etc...
+template<size_t Size, bool IsUnsigned>
+struct std_int; // Fail if not specialized.
+
+//! \cond
+template<> struct std_int<1, false> { using type = int8_t; };
+template<> struct std_int<1, true > { using type = uint8_t; };
+template<> struct std_int<2, false> { using type = int16_t; };
+template<> struct std_int<2, true > { using type = uint16_t; };
+template<> struct std_int<4, false> { using type = int32_t; };
+template<> struct std_int<4, true > { using type = uint32_t; };
+template<> struct std_int<8, false> { using type = int64_t; };
+template<> struct std_int<8, true > { using type = uint64_t; };
+//! \endcond
+
+//! std_int_t is a shortcut to `std_int<Size, IsUnsigned>::type`.
+template<size_t Size, bool IsUnsigned>
+using std_int_t = typename std_int<Size, IsUnsigned>::type;
+
+//! std_sint_t is a shortcut to `std_int<Size, false>::type`.
+template<size_t Size>
+using std_sint_t = typename std_int<Size, false>::type;
+
+//! std_uint_t is a shortcut to `std_int<Size, true>::type`.
+template<size_t Size>
+using std_uint_t = typename std_int<Size, true>::type;
+
+//! Storage used to store bits in a single word as a standard type as defined by <stdint.h>.
+using BitWord = std_uint_t<sizeof(uintptr_t)>;
+
+#if defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86) || defined(__X86__) || defined(__i386__)
+using FastUInt8 = uint8_t;
+#else
+using FastUInt8 = uint32_t;
+#endif
+
+// Support - Min & Max
+// ===================
+
+// NOTE: These are constexpr `min()` and `max()` implementations that are not exactly the same as `std::min()`
+// and `std::max()`. The return value is not a reference to `a` or `b` but a new value instead.
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T min(const T& a, const T& b) noexcept { return b < a ? b : a; }
+
+template<typename T, typename... Args>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T min(const T& a, const T& b, Args&&... args) noexcept { return min(min(a, b), std::forward<Args>(args)...); }
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T max(const T& a, const T& b) noexcept { return a < b ? b : a; }
+
+template<typename T, typename... Args>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T max(const T& a, const T& b, Args&&... args) noexcept { return max(max(a, b), std::forward<Args>(args)...); }
+
+// Support - Anonymous
+// ===================
+
+namespace {
+
+// Support - Type Casting
+// ======================
+
+//! Converts a value of type `T` into `[int|uint]_[8|16|32|64]_t` integer of the same size as defined in `<stdint.h>`.
+//!
+//! The signedness of the result depends on the type `T`.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr std_int_t<sizeof(T), std::is_unsigned_v<T>> as_std_int(const T& value) noexcept {
+ return std_int_t<sizeof(T), std::is_unsigned_v<T>>(value);
+}
+
+//! Converts a value of type `T` into `int_[8|16|32|64]_t` integer of the same size as defined in `<stdint.h>`.
+//!
+//! The return type is always signed unlike `as_std_int()`.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr std_sint_t<sizeof(T)> as_std_sint(const T& value) noexcept {
+ return std_sint_t<sizeof(T)>(value);
+}
+
+//! Converts a value of type `T` into `uint_[8|16|32|64]_t` integer of the same size as defined in `<stdint.h>`.
+//!
+//! The return type is always unsigned unlike `as_std_int()`.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr std_uint_t<sizeof(T)> as_std_uint(const T& value) noexcept {
+ return std_uint_t<sizeof(T)>(value);
+}
+
+//! Converts a value of type `T` into `[int|uint]_[32|64]_t` integer as defined in `<stdint.h>`.
+//!
+//! This function is designed to convert the value of `T` into at least 32-bit value of the same signedness.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr std_int_t<sizeof(T) >= 4u ? sizeof(T) : 4u, std::is_unsigned_v<T>> as_basic_int(const T& value) noexcept {
+ return std_int_t<sizeof(T) >= 4u ? sizeof(T) : 4u, std::is_unsigned_v<T>>(value);
+}
+
+//! Converts a value of type `T` into `int_[32|64]_t` integer as defined in `<stdint.h>`.
+//!
+//! The return type is always signed unlike `as_basic_int()`.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr std_sint_t<sizeof(T) >= 4u ? sizeof(T) : 4u> as_basic_sint(const T& value) noexcept {
+ return std_sint_t<sizeof(T) >= 4u ? sizeof(T) : 4u>(value);
+}
+
+//! Converts a value of type `T` into `uint_[32|64]_t` integer as defined in `<stdint.h>`.
+//!
+//! The return type is always unsigned unlike `as_basic_int()`.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr std_uint_t<sizeof(T) >= 4u ? sizeof(T) : 4u> as_basic_uint(const T& value) noexcept {
+ return std_uint_t<sizeof(T) >= 4u ? sizeof(T) : 4u>(value);
+}
+
+// Support - Is Between
+// ====================
+
+//! Checks whether `x` is greater than or equal to `a` and lesser than or equal to `b`.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_between(const T& value, const T& a, const T& b) noexcept {
+ return value >= a && value <= b;
+}
+
+// Support - Pointer Operations
+// ============================
+
+//! Applies a byte offset to the input pointer passed as `Src*` and casts the result to `Dst*`.
+template<typename Dst, typename Src, typename Offset>
+SUPPORT_INLINE_NODEBUG Dst* offset_ptr(Src* ptr, const Offset& n) noexcept {
+ return static_cast<Dst*>(
+ static_cast<void*>(static_cast<char*>(static_cast<void*>(ptr)) + n)
+ );
+}
+
+template<typename Dst, typename Src, typename Offset>
+SUPPORT_INLINE_NODEBUG const Dst* offset_ptr(const Src* ptr, const Offset& n) noexcept {
+ return static_cast<const Dst*>(
+ static_cast<const void*>(static_cast<const char*>(static_cast<const void*>(ptr)) + n)
+ );
+}
+
+// Support - Negate
+// ================
+
+//! Returns `0 - x` in a safe way (no undefined behavior), works for unsigned numbers as well.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG constexpr T neg(const T& value) noexcept { return T(as_std_uint(T(0)) - as_std_uint(value)); }
+
+// Support - Test
+// ==============
+
+//! Tests whether `a & b` is non-zero.
+template<typename A, typename B>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG constexpr bool test(A a, B b) noexcept { return (as_std_uint(a) & as_std_uint(b)) != 0u; }
+
+// Support - Boolean As & As Mask
+// ==============================
+
+//! The purpose of `bool_as<T>()` is to cast a boolean value to any integer or enum value. The reason for having
+//! it is to ensure that the input parameter is actually a boolean, so the compiler may output a warning in case
+//! an implicit narrowing conversion to `bool` happens.
+template<typename T>
+SUPPORT_INLINE_NODEBUG constexpr T bool_as(bool b) noexcept { return T(b); }
+
+//! Converts a boolean value `b` to a mask, which either contains all zeros or all bits set depending on the bool value.
+template<typename Dst, typename Src>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG constexpr Dst bool_as_mask(const Src& b) noexcept { return Dst(neg(as_std_uint(Dst(b)))); }
+
+// Support - Boolean And & Or
+// ==========================
+
+//! Safely ANDs two or more boolean values by using the `&` operator and not `&&`.
+//!
+//! \remarks This function should be uses in cases in which two or more conditions are joined without the intention
+//! to give the compiler hint to do a short circuit (aka branching after evaluating the first expression).
+template<typename... Args>
+SUPPORT_INLINE constexpr bool bool_and(Args&&... args) noexcept { return bool((... & bool_as<unsigned>(args))); }
+
+//! Safely ORs two or more boolean values by using the `&` operator and not `&&`.
+//!
+//! \remarks This function should be uses in cases in which two or more conditions are joined without the intention
+//! to give the compiler hint to do a short circuit (aka branching after evaluating the first expression).
+template<typename... Args>
+SUPPORT_INLINE constexpr bool bool_or(Args&&... args) noexcept { return bool((... | bool_as<unsigned>(args))); }
+
+// Support - Bit Size
+// ==================
+
+template<typename T>
+inline constexpr uint32_t bit_size_of = uint32_t(sizeof(T) * 8u);
+
+// Support - Bit Ones
+// ==================
+
+template<typename T>
+inline constexpr T bit_ones = T(~T(0));
+
+// Support - Bit Cast
+// ==================
+
+//! Bit-casts from `Src` type to `Dst` type.
+//!
+//! Useful to bit-cast between integers and floating points.
+template<typename Dst, typename Src>
+SUPPORT_INLINE_NODEBUG Dst bit_cast(const Src& x) noexcept {
+ static_assert(sizeof(Dst) == sizeof(Src),
+ "bit_cast() can only be used to cast between types of the same size");
+
+ if constexpr ((std::is_integral_v<Dst> || std::is_enum_v<Dst>) &&
+ (std::is_integral_v<Src> || std::is_enum_v<Src>)) {
+ return Dst(x);
+ }
+ else {
+ union { Src src; Dst dst; } v{x};
+ return v.dst;
+ }
+}
+
+// Support - Bit Test
+// ==================
+
+//! Tests whether the given `value` has `n`th bit set.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool bit_test(const T& value, const N& n) noexcept {
+ return (as_std_uint(value) & (as_std_uint(T(1)) << as_std_uint(n))) != 0u;
+}
+
+// Support - Bit Shift and Rotation
+// ================================
+
+//! Returns `x << y` (shift left logical) by explicitly casting `x` to an unsigned type and back.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T shl(const T& value, const N& n) noexcept { return T(as_std_uint(value) << n); }
+
+//! Returns `value >> n` (shift right logical) by explicitly casting `value` to an unsigned type and back.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T shr(const T& value, const N& n) noexcept { return T(as_std_uint(value) >> n); }
+
+//! Returns `value >> n` (shift right arithmetic) by explicitly casting `value` to a signed type and back.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T sar(const T& value, const N& n) noexcept { return T(as_std_sint(value) >> n); }
+
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T ror(const T& value, const N& n) noexcept {
+ uint32_t opposite_n = uint32_t(bit_size_of<T>) - uint32_t(n);
+ return T((as_std_uint(value) >> n) | (as_std_uint(value) << opposite_n));
+}
+
+// Support - CLZ & CTZ
+// ===================
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr uint32_t clz_t(const T& value) noexcept {
+ auto w = as_std_uint(value);
+ uint32_t n = 0;
+
+ if constexpr (sizeof(T) > 4u) {
+ uint32_t m = bool_as_mask<uint32_t>(w <= uint64_t(0xFFFFFFFFu));
+ n += 32u & m;
+ w >>= 32u & ~m;
+ }
+
+ uint32_t v = uint32_t(w & 0xFFFFFFFFu);
+ if constexpr (sizeof(T) > 2u) {
+ uint32_t m = bool_as_mask<uint32_t>(v <= uint32_t(0xFFFFu));
+ n += 16u & m;
+ v >>= 16u & ~m;
+ }
+
+ if constexpr (sizeof(T) > 1u) {
+ uint32_t m = bool_as_mask<uint32_t>(v <= uint32_t(0xFFu));
+ n += 8u & m;
+ v >>= 8u & ~m;
+ }
+
+ {
+ uint32_t m = bool_as_mask<uint32_t>(v <= uint32_t(0xFu));
+ n += 4u & m;
+ v >>= 4u & ~m;
+ }
+
+ constexpr uint32_t predicate =
+ (4u << (0b0000 * 4u)) | (3u << (0b0001 * 4u)) | (2u << (0b0010 * 4u)) | (2u << (0b0011 * 4u)) |
+ (1u << (0b0100 * 4u)) | (1u << (0b0101 * 4u)) | (1u << (0b0110 * 4u)) | (1u << (0b0111 * 4u)) ;
+
+ uint32_t i = v * 4u;
+ if constexpr (sizeof(uintptr_t) > 4u) {
+ n += uint32_t((uint64_t(predicate) >> i) & 0xFu);
+ }
+ else {
+ n += (predicate >> min<uint32_t>(i, 31u)) & 0xFu;
+ }
+
+ return n;
+}
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr uint32_t ctz_t(const T& value) noexcept {
+ auto w = as_std_uint(value);
+ uint32_t n = 0;
+
+ if constexpr (sizeof(T) > 4u) {
+ uint32_t m = bool_as_mask<uint32_t>((w & 0xFFFFFFFFu) == 0u);
+ n += 32u & m;
+ w >>= 32u & m;
+ }
+
+ uint32_t v = uint32_t(w & 0xFFFFFFFFu);
+ if constexpr (sizeof(T) > 2u) {
+ uint32_t m = bool_as_mask<uint32_t>((v & 0xFFFFu) == 0u);
+ n += 16u & m;
+ v >>= 16u & m;
+ }
+
+ if constexpr (sizeof(T) > 1u) {
+ uint32_t m = bool_as_mask<uint32_t>((v & 0xFFu) == 0u);
+ n += 8u & m;
+ v >>= 8u & m;
+ }
+
+ {
+ uint32_t m = bool_as_mask<uint32_t>((v & 0xFu) == 0u);
+ n += 4u & m;
+ v >>= 4u & m;
+ }
+
+ v &= 0xFu;
+
+ if constexpr (sizeof(uintptr_t) > 4u) {
+ constexpr uint64_t predicate =
+ (uint64_t(4u) << (0b0000 * 4u)) | (uint64_t(0u) << (0b0001 * 4u)) | (uint64_t(1u) << (0b0010 * 4u)) | (uint64_t(0u) << (0b0011 * 4u)) |
+ (uint64_t(2u) << (0b0100 * 4u)) | (uint64_t(0u) << (0b0101 * 4u)) | (uint64_t(1u) << (0b0110 * 4u)) | (uint64_t(0u) << (0b0111 * 4u)) |
+ (uint64_t(3u) << (0b1000 * 4u)) | (uint64_t(0u) << (0b1001 * 4u)) | (uint64_t(1u) << (0b1010 * 4u)) | (uint64_t(0u) << (0b1011 * 4u)) |
+ (uint64_t(2u) << (0b1100 * 4u)) | (uint64_t(0u) << (0b1101 * 4u)) | (uint64_t(1u) << (0b1110 * 4u)) | (uint64_t(0u) << (0b1111 * 4u)) ;
+ n += uint32_t((predicate >> (v * 4u)) & 0xFu);
+ }
+ else {
+ constexpr uint32_t predicate =
+ (3u << (0b0000 * 2u)) | (0u << (0b0001 * 2u)) | (1u << (0b0010 * 2u)) | (0u << (0b0011 * 2u)) |
+ (2u << (0b0100 * 2u)) | (0u << (0b0101 * 2u)) | (1u << (0b0110 * 2u)) | (0u << (0b0111 * 2u)) |
+ (3u << (0b1000 * 2u)) | (0u << (0b1001 * 2u)) | (1u << (0b1010 * 2u)) | (0u << (0b1011 * 2u)) |
+ (2u << (0b1100 * 2u)) | (0u << (0b1101 * 2u)) | (1u << (0b1110 * 2u)) | (0u << (0b1111 * 2u)) ;
+ n += uint32_t((predicate >> (v * 2u)) & 0x3u);
+ n += uint32_t(v == 0);
+ }
+
+ return n;
+}
+
+//! \cond
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const T& x) noexcept { return clz_t(as_std_uint(x)); }
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const T& x) noexcept { return ctz_t(as_std_uint(x)); }
+
+#if defined(__GNUC__)
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const uint8_t& x) noexcept { return uint32_t(__builtin_clz(uint32_t(x))) - 24u; }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const uint16_t& x) noexcept { return uint32_t(__builtin_clz(uint32_t(x))) - 16u; }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const uint32_t& x) noexcept { return uint32_t(__builtin_clz(x)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const uint64_t& x) noexcept { return uint32_t(__builtin_clzll(x)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const uint8_t& x) noexcept { return uint32_t(__builtin_ctz(uint32_t(x) | 0x10u)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const uint16_t& x) noexcept { return uint32_t(__builtin_ctz(uint32_t(x) | 0x1000u)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const uint32_t& x) noexcept { return uint32_t(__builtin_ctz(x)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const uint64_t& x) noexcept { return uint32_t(__builtin_ctzll(x)); }
+
+#elif defined(_MSC_VER)
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const uint32_t& x) noexcept { unsigned long i; _BitScanReverse(&i, x); return uint32_t(i ^ 31); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const uint32_t& x) noexcept { unsigned long i; _BitScanForward(&i, x); return uint32_t(i); }
+
+#if defined(_M_X64) || defined(_M_ARM64)
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz_impl(const uint64_t& x) noexcept { unsigned long i; _BitScanReverse64(&i, x); return uint32_t(i ^ 63); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz_impl(const uint64_t& x) noexcept { unsigned long i; _BitScanForward64(&i, x); return uint32_t(i); }
+#endif
+#endif
+//! \endcond
+
+//! Count leading zeros in `x` (returns a position of a first bit set in `x`).
+//!
+//! \note The input MUST NOT be zero, otherwise the result is undefined.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t clz(const T& x) noexcept { return clz_impl(as_std_uint(x)); }
+
+//! Count trailing zeros in `x` (returns a position of a first bit set in `x`).
+//!
+//! \note The input MUST NOT be zero, otherwise the result is undefined.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t ctz(const T& x) noexcept { return ctz_impl(as_std_uint(x)); }
+
+template<auto V>
+inline constexpr uint32_t ctz_const = ctz_t(as_std_uint(V));
+
+// Support - Pop Count & Has At Least 2 Bits Set
+// =============================================
+
+// Based on the following resource:
+// http://graphics.stanford.edu/~seander/bithacks.html
+//
+// Alternatively, for a very small number of bits in `x`:
+//
+// uint32_t n = 0;
+// while (x) {
+// x &= x - 1;
+// n++;
+// }
+// return n;
+
+//! Calculates count of bits set to 1 in the given `value` (useful in constant expressions).
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG constexpr uint32_t popcnt_t(const T& value) noexcept {
+ auto v = as_basic_uint(value);
+
+ if constexpr (sizeof(T) <= 4) {
+ v = v - ((v >> 1) & 0x55555555u);
+ v = (v & 0x33333333u) + ((v >> 2) & 0x33333333u);
+ return (((v + (v >> 4)) & 0x0F0F0F0Fu) * 0x01010101u) >> 24;
+ }
+ else {
+ if constexpr (sizeof(uintptr_t) >= 8) {
+ v = v - ((v >> 1) & 0x5555555555555555u);
+ v = (v & 0x3333333333333333u) + ((v >> 2) & 0x3333333333333333u);
+ return uint32_t((((v + (v >> 4)) & 0x0F0F0F0F0F0F0F0Fu) * 0x0101010101010101u) >> 56);
+ }
+ else {
+ uint32_t lo = uint32_t(v & 0xFFFFFFFFu);
+ uint32_t hi = uint32_t(v >> 32);
+ return popcnt_t(lo) + popcnt_t(hi);
+ }
+ }
+}
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t popcnt_impl(const T& value) noexcept { return popcnt_t(value); }
+
+#if defined(__GNUC__)
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t popcnt_impl(const uint8_t& value) noexcept { return uint32_t(__builtin_popcount(value)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t popcnt_impl(const uint16_t& value) noexcept { return uint32_t(__builtin_popcount(value)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t popcnt_impl(const uint32_t& value) noexcept { return uint32_t(__builtin_popcount(value)); }
+
+template<>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t popcnt_impl(const uint64_t& value) noexcept { return uint32_t(__builtin_popcountll(value)); }
+#endif // __GNUC__
+
+//! Calculates count of bits set to 1 in the given `value`.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t popcnt(const T& value) noexcept { return popcnt_impl(as_std_uint(value)); }
+
+//! Tests whether the given `value` has at least 2 bits set.
+//!
+//! The operation it performs could be rewritten as `popcnt(value) >= 2`, but it's more efficient especially if there
+//! is no native population count support on the target architecture (or it's behind a compiler flag that was not used
+//! during compilation).
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool has_at_least_2_bits_set(const T& value) noexcept {
+ auto v = as_basic_uint(value);
+ return !(v & (v - 1u));
+}
+
+// Support - Bit Utilities
+// =======================
+
+//! Returns `x & -x` - extracts the lowest set isolated bit (like BLSI instruction).
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T blsi(const T& value) noexcept { return T(as_std_uint(value) & neg(as_std_uint(value))); }
+
+//! \cond
+
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG constexpr T lsb_mask_t(const N& n) noexcept {
+ using U = std_uint_t<sizeof(T)>;
+ if constexpr (sizeof(U) < sizeof(uintptr_t)) {
+ // Prevent undefined behavior by using a larger type than T - this is great for creating 32-bit masks when
+ // running on 64-bit as it's both short and safe.
+ return T(U((uintptr_t(1) << n) - uintptr_t(1)));
+ }
+ else {
+ // Prevent undefined behavior by checking `n` before shift.
+ return n ? T(shr(bit_ones<T>, bit_size_of<T> - size_t(n))) : T(0);
+ }
+}
+
+#if defined(__BMI2__)
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T lsb_mask_impl(const N& n) noexcept {
+ if constexpr (sizeof(T) == 4) {
+ return uint32_t(_bzhi_u32(bit_ones<uint32_t>, uint32_t(n)));
+ }
+ else if constexpr (sizeof(T) == 8) {
+ return uint64_t(_bzhi_u64(bit_ones<uint64_t>, uint32_t(n)));
+ }
+ else {
+ return lsb_mask_t<T, N>(n);
+ }
+}
+#else
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T lsb_mask_impl(const N& n) noexcept { return lsb_mask_t<T, N>(n); }
+#endif
+
+//! \endcond
+
+//! Generates a trailing bit-mask that has `n` least significant bits set.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T lsb_mask(const N& n) noexcept { return T(lsb_mask_impl<std_uint_t<sizeof(T)>, N>(n)); }
+
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T constexpr lsb_mask_const(const N& n) noexcept { return T(lsb_mask_t<std_uint_t<sizeof(T)>, N>(n)); }
+
+//! Generates a leading bit-mask that has `n` most significant (leading) bits set.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T msb_mask(const N& n) noexcept {
+ using U = std_uint_t<sizeof(T)>;
+ if constexpr (sizeof(U) < sizeof(uintptr_t)) {
+ // Prevent undefined behavior by using a larger type than T.
+ return T(bit_ones<uintptr_t> >> (bit_size_of<uintptr_t> - n));
+ }
+ else {
+ // Prevent undefined behavior by performing `n & (num_bits - 1)` so it's always within the range.
+ return T(sar(U(n != 0) << (bit_size_of<U> - 1), n ? uint32_t(n - 1) : uint32_t(0)));
+ }
+}
+
+//! Returns a bit-mask that has `x` bit set.
+template<typename T, typename Index>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T bit_mask(const Index& idx) noexcept { return (1u << as_basic_uint(idx)); }
+
+//! Returns a bit-mask that has `x` bit set (multiple arguments).
+template<typename T, typename Index, typename... Args>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T bit_mask(const Index& idx, Args... args) noexcept { return bit_mask<T>(idx) | bit_mask<T>(args...); }
+
+// Fills all trailing bits right of the given `value` from the first most significant bit set.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T fill_trailing_bits(const T& value) noexcept {
+ auto v = as_basic_uint(value);
+
+ uint32_t leading_count = clz(v | 1u);
+ return T(((bit_ones<decltype(v)> >> 1u) >> leading_count) | v);
+}
+
+// Support - Is LSB & Consecutive Mask
+// ===================================
+
+// Tests whether the given `value` is a consecutive mask of bits that starts at the least significant bit.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_lsb_mask(const T& x) noexcept {
+ return x && ((std_uint(x) + 1u) & std_uint(x)) == 0;
+}
+
+// Tests whether the given value contains at least one bit or whether it contains more bits but all consecutive.
+//
+// This function is similar to \ref is_lsb_mask(), but the mask doesn't have to start at the least significant bit.
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_consecutive_mask(const T& value) noexcept {
+ return value && is_lsb_mask((as_std_uint(value) - 1u) | as_std_uint(value));
+}
+
+// Support - Is Power of 2
+// =======================
+
+//! Tests whether `x` is a power of two (only one bit is set).
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_power_of_2(T x) noexcept {
+ using U = std::make_unsigned_t<T>;
+ U x_minus_1 = U(U(x) - U(1));
+ return U(U(x) ^ x_minus_1) > x_minus_1;
+}
+
+//! Tests whether `x` is a power of two up to `n`.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_power_of_2_up_to(T x, N n) noexcept {
+ using U = std::make_unsigned_t<T>;
+ U x_minus_1 = U(U(x) - U(1));
+ return bool_and(x_minus_1 < U(n), !(U(x) & x_minus_1));
+}
+
+//! Tests whether `x` is either zero or a power of two (only one bit is set).
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_zero_or_power_of_2(T x) noexcept {
+ using U = std::make_unsigned_t<T>;
+ return !(U(x) & (U(x) - U(1)));
+}
+
+//! Tests whether `x` is either zero or a power of two up to `n`.
+template<typename T, typename N>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_zero_or_power_of_2_up_to(T x, N n) noexcept {
+ using U = std::make_unsigned_t<T>;
+ return bool_and(U(x) <= U(n), !(U(x) & (U(x) - U(1))));
+}
+
+// Support - Is Int
+// ================
+
+//! Checks whether the given integer `x` can be casted to a signed N-bit integer.
+template<size_t N, typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_int_n(const T& x) noexcept {
+ constexpr size_t bit_size = bit_size_of<T>;
+
+ if constexpr (bit_size < N || (bit_size == N && std::is_signed_v<T>)) {
+ // Always castable to a wider integer or to a signed integer of the same width.
+ return true;
+ }
+ else if constexpr (std::is_signed_v<T>) {
+ // A cast of a signed integer to a smaller signed integer.
+ using U = std_uint_t<sizeof(T)>;
+ T maximum_value = T(lsb_mask_const<U>(N - 1));
+ T minimum_value = T(-maximum_value - 1);
+
+ return bool_and(x >= minimum_value, x <= maximum_value);
+ }
+ else {
+ // A cast of an unsigned integer to a smaller signed integer.
+ T maximum_value = lsb_mask_const<T>(N - 1);
+ return x <= maximum_value;
+ }
+}
+
+//! Checks whether the given integer `x` can be casted to an unsigned N-bit integer.
+template<size_t N, typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_uint_n(const T& x) noexcept {
+ constexpr size_t bit_size = bit_size_of<T>;
+
+ if constexpr (bit_size <= N && std::is_unsigned_v<T>) {
+ // Always castable to a wider integer if T is unsigned.
+ return true;
+ }
+ else if constexpr (bit_size <= N && std::is_signed_v<T>) {
+ return x >= T(0);
+ }
+ else {
+ // A cast of an integer to a smaller unsigned integer.
+ return as_std_uint(x) <= lsb_mask_const<std_uint_t<sizeof(T)>>(N);
+ }
+}
+
+// Support - Alignment
+// ===================
+
+template<typename X, typename Y>
+[[nodiscard]]
+SUPPORT_INLINE constexpr bool is_aligned(X base, Y alignment) noexcept {
+ using U = std_uint_t<sizeof(X)>;
+ return ((U)base % (U)alignment) == 0;
+}
+
+template<typename X, typename Y>
+[[nodiscard]]
+SUPPORT_INLINE constexpr X align_up(X x, Y alignment) noexcept {
+ using U = std_uint_t<sizeof(X)>;
+ return (X)( ((U)x + ((U)(alignment) - 1u)) & ~((U)(alignment) - 1u) );
+}
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE constexpr T align_up_power_of_2(T x) noexcept {
+ using U = std_uint_t<sizeof(T)>;
+ return (T)(fill_trailing_bits(U(x) - 1u) + 1u);
+}
+
+//! Returns either zero or a positive difference between `base` and `base` when aligned to `alignment`.
+template<typename X, typename Y>
+[[nodiscard]]
+SUPPORT_INLINE constexpr std_uint_t<sizeof(X)> align_up_diff(X base, Y alignment) noexcept {
+ using U = std_uint_t<sizeof(X)>;
+ return align_up(U(base), alignment) - U(base);
+}
+
+template<typename X, typename Y>
+[[nodiscard]]
+SUPPORT_INLINE constexpr X align_down(X x, Y alignment) noexcept {
+ using U = std_uint_t<sizeof(X)>;
+ return (X)( (U)x & ~((U)(alignment) - 1u) );
+}
+
+// Support - Boolean Utilities
+// ===========================
+
+template<auto Flag, typename T>
+SUPPORT_INLINE_NODEBUG constexpr decltype(Flag) bool_as_flag(const T& v) noexcept {
+ using FlagType = decltype(Flag);
+ return FlagType(as_std_uint(v) << ctz_const<Flag>);
+}
+
+// Support - ByteSwap
+// ==================
+
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint16_t byteswap16(uint16_t x) noexcept {
+ return uint16_t(((x >> 8) & 0xFFu) | ((x & 0xFFu) << 8));
+}
+
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint32_t byteswap32(uint32_t x) noexcept {
+ return (x << 24) | (x >> 24) | ((x << 8) & 0x00FF0000u) | ((x >> 8) & 0x0000FF00);
+}
+
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG uint64_t byteswap64(uint64_t x) noexcept {
+#if (defined(__GNUC__) || defined(__clang__))
+ return uint64_t(__builtin_bswap64(uint64_t(x)));
+#elif defined(_MSC_VER)
+ return uint64_t(_byteswap_uint64(uint64_t(x)));
+#else
+ return (uint64_t(byteswap32(uint32_t(uint64_t(x) >> 32 ))) ) |
+ (uint64_t(byteswap32(uint32_t(uint64_t(x) & 0xFFFFFFFFu))) << 32) ;
+#endif
+}
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T byteswap(T x) noexcept {
+ static_assert(std::is_integral_v<T>, "byteswap() expects the given type to be integral");
+ if constexpr (sizeof(T) == 8) {
+ return T(byteswap64(uint64_t(x)));
+ }
+ else if constexpr (sizeof(T) == 4) {
+ return T(byteswap32(uint32_t(x)));
+ }
+ else if constexpr (sizeof(T) == 2) {
+ return T(byteswap16(uint16_t(x)));
+ }
+ else {
+ static_assert(sizeof(T) == 1, "byteswap() can be used with a type of size 1, 2, 4, or 8");
+ return x;
+ }
+}
+
+// Support - Overflow Arithmetic
+// =============================
+
+//! \cond
+template<typename T>
+SUPPORT_INLINE T add_overflow_t(T x, T y, FastUInt8* of) noexcept {
+ using U = std::make_unsigned_t<T>;
+
+ U result = U(U(x) + U(y));
+ *of = FastUInt8(*of | FastUInt8(std::is_unsigned_v<T> ? result < U(x) : T((U(x) ^ ~U(y)) & (U(x) ^ result)) < 0));
+ return T(result);
+}
+
+template<typename T>
+SUPPORT_INLINE T sub_overflow_t(T x, T y, FastUInt8* of) noexcept {
+ using U = std::make_unsigned_t<T>;
+
+ U result = U(U(x) - U(y));
+ *of = FastUInt8(*of | FastUInt8(std::is_unsigned_v<T> ? result > U(x) : T((U(x) ^ U(y)) & (U(x) ^ result)) < 0));
+ return T(result);
+}
+
+template<typename T>
+SUPPORT_INLINE T mul_overflow_t(T x, T y, FastUInt8* of) noexcept {
+ using I = std_int_t<sizeof(T) * 2, std::is_unsigned_v<T>>;
+ using U = std::make_unsigned_t<I>;
+
+ U mask = bit_ones<U>;
+ if constexpr (std::is_signed_v<T>) {
+ U prod = U(I(x)) * U(I(y));
+ *of = FastUInt8(*of | FastUInt8(I(prod) < I(std::numeric_limits<T>::lowest()) || I(prod) > I(std::numeric_limits<T>::max())));
+ return T(I(prod & mask));
+ }
+ else {
+ U prod = U(x) * U(y);
+ *of = FastUInt8(*of | FastUInt8((prod & ~mask) != 0));
+ return T(prod & mask);
+ }
+}
+
+template<>
+SUPPORT_INLINE int64_t mul_overflow_t(int64_t x, int64_t y, FastUInt8* of) noexcept {
+ int64_t result = int64_t(uint64_t(x) * uint64_t(y));
+ *of = FastUInt8(*of | FastUInt8(x && (result / x != y)));
+ return result;
+}
+
+template<>
+SUPPORT_INLINE uint64_t mul_overflow_t(uint64_t x, uint64_t y, FastUInt8* of) noexcept {
+ uint64_t result = x * y;
+ *of = FastUInt8(*of | FastUInt8(y != 0 && bit_ones<uint64_t> / y < x));
+ return result;
+}
+
+// These can be specialized.
+template<typename T> SUPPORT_INLINE T add_overflow_impl(const T& x, const T& y, FastUInt8* of) noexcept { return add_overflow_t<T>(x, y, of); }
+template<typename T> SUPPORT_INLINE T sub_overflow_impl(const T& x, const T& y, FastUInt8* of) noexcept { return sub_overflow_t<T>(x, y, of); }
+template<typename T> SUPPORT_INLINE T mul_overflow_impl(const T& x, const T& y, FastUInt8* of) noexcept { return mul_overflow_t<T>(x, y, of); }
+
+#if defined(__GNUC__)
+#define SUPPORT_OVERFLOW_ARITHMETIC(func, T, result_type, builtin_func) \
+template<> \
+SUPPORT_INLINE T func(const T& x, const T& y, FastUInt8* of) noexcept { \
+ result_type result; \
+ *of = FastUInt8(*of | uint8_t(builtin_func((result_type)x, (result_type)y, &result))); \
+ return T(result); \
+}
+SUPPORT_OVERFLOW_ARITHMETIC(add_overflow_impl, int32_t , int , __builtin_sadd_overflow )
+SUPPORT_OVERFLOW_ARITHMETIC(add_overflow_impl, uint32_t, unsigned int , __builtin_uadd_overflow )
+SUPPORT_OVERFLOW_ARITHMETIC(add_overflow_impl, int64_t , long long , __builtin_saddll_overflow)
+SUPPORT_OVERFLOW_ARITHMETIC(add_overflow_impl, uint64_t, unsigned long long, __builtin_uaddll_overflow)
+SUPPORT_OVERFLOW_ARITHMETIC(sub_overflow_impl, int32_t , int , __builtin_ssub_overflow )
+SUPPORT_OVERFLOW_ARITHMETIC(sub_overflow_impl, uint32_t, unsigned int , __builtin_usub_overflow )
+SUPPORT_OVERFLOW_ARITHMETIC(sub_overflow_impl, int64_t , long long , __builtin_ssubll_overflow)
+SUPPORT_OVERFLOW_ARITHMETIC(sub_overflow_impl, uint64_t, unsigned long long, __builtin_usubll_overflow)
+SUPPORT_OVERFLOW_ARITHMETIC(mul_overflow_impl, int32_t , int , __builtin_smul_overflow )
+SUPPORT_OVERFLOW_ARITHMETIC(mul_overflow_impl, uint32_t, unsigned int , __builtin_umul_overflow )
+SUPPORT_OVERFLOW_ARITHMETIC(mul_overflow_impl, int64_t , long long , __builtin_smulll_overflow)
+SUPPORT_OVERFLOW_ARITHMETIC(mul_overflow_impl, uint64_t, unsigned long long, __builtin_umulll_overflow)
+#undef SUPPORT_OVERFLOW_ARITHMETIC
+#endif
+
+//! \endcond
+
+template<typename T>
+SUPPORT_INLINE T add_overflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(add_overflow_impl(as_std_int(x), as_std_int(y), of)); }
+
+template<typename T>
+SUPPORT_INLINE T sub_overflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(sub_overflow_impl(as_std_int(x), as_std_int(y), of)); }
+
+template<typename T>
+SUPPORT_INLINE T mul_overflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(mul_overflow_impl(as_std_int(x), as_std_int(y), of)); }
+
+template<typename T>
+SUPPORT_INLINE T madd_overflow(const T& x, const T& y, const T& addend, FastUInt8* of) noexcept {
+ T v = T(mul_overflow_impl(as_std_int(x), as_std_int(y), of));
+ return T(add_overflow_impl(as_std_int(v), as_std_int(addend), of));
+}
+
+// Support - Aligned / Unaligned Memory Access
+// ===========================================
+
+#if defined(__GNUC__) || defined(_MSC_VER)
+
+template<size_t Size>
+struct unaligned_uint;
+
+template<> struct unaligned_uint<1> { typedef uint8_t type; };
+
+#if defined(_MSC_VER)
+template<> struct unaligned_uint<2> { typedef uint16_t __declspec(align(1)) type; };
+template<> struct unaligned_uint<4> { typedef uint32_t __declspec(align(1)) type; };
+template<> struct unaligned_uint<8> { typedef uint64_t __declspec(align(1)) type; };
+#elif defined(__GNUC__)
+template<> struct unaligned_uint<2> { typedef uint16_t __attribute__((__may_alias__, __aligned__(1))) type; };
+template<> struct unaligned_uint<4> { typedef uint32_t __attribute__((__may_alias__, __aligned__(1))) type; };
+template<> struct unaligned_uint<8> { typedef uint64_t __attribute__((__may_alias__, __aligned__(1))) type; };
+#endif
+
+template<size_t Size>
+using unaligned_uint_t = typename unaligned_uint<Size>::type;
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T loadu(const void* p) noexcept {
+ return bit_cast<T>(std_uint_t<sizeof(T)>(*static_cast<const unaligned_uint_t<sizeof(T)>*>(p)));
+}
+
+template<typename T>
+SUPPORT_INLINE_NODEBUG void storeu(void* p, const T& x) noexcept {
+ *static_cast<unaligned_uint_t<sizeof(T)>*>(p) = bit_cast<std_uint_t<sizeof(T)>>(x);
+}
+
+#else
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T loadu(const void* p) noexcept {
+ T value;
+ memcpy(&value, p, sizeof(T));
+ return value;
+}
+
+template<typename T>
+SUPPORT_INLINE_NODEBUG void storeu(void* p, const T& x) noexcept {
+ T value = x;
+ memcpy(p, &value, sizeof(T));
+}
+
+#endif // __GNUC__ || _MSC_VER
+
+template<typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T loada(const void* p) noexcept {
+ return *static_cast<const T*>(p);
+}
+
+template<ByteOrder BO, typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T loada(const void* p) noexcept {
+ if constexpr (BO == ByteOrder::kNative || sizeof(T) == 1u) {
+ return loada<T>(p);
+ }
+ else {
+ return bit_cast<T>(byteswap(loada<std_uint_t<sizeof(T)>>(p)));
+ }
+}
+
+template<ByteOrder BO, typename T>
+[[nodiscard]]
+SUPPORT_INLINE_NODEBUG T loadu(const void* p) noexcept {
+ if constexpr (BO == ByteOrder::kNative || sizeof(T) == 1u) {
+ return loadu<T>(p);
+ }
+ else {
+ return bit_cast<T>(byteswap(loadu<std_uint_t<sizeof(T)>>(p)));
+ }
+}
+
+template<typename T>
+SUPPORT_INLINE_NODEBUG void storea(void* p, const T& x) noexcept {
+ *static_cast<T*>(p) = x;
+}
+
+template<ByteOrder BO, typename T>
+SUPPORT_INLINE_NODEBUG void storea(void* p, const T& x) noexcept {
+ if constexpr (BO == ByteOrder::kNative || sizeof(T) == 1u) {
+ storea(p, x);
+ }
+ else {
+ storea(p, byteswap(bit_cast<std_uint_t<sizeof(T)>>(x)));
+ }
+}
+
+template<ByteOrder BO, typename T>
+SUPPORT_INLINE_NODEBUG void storeu(void* p, const T& x) noexcept {
+ if constexpr (BO == ByteOrder::kNative || sizeof(T) == 1u) {
+ storeu(p, x);
+ }
+ else {
+ storeu(p, byteswap(bit_cast<std_uint_t<sizeof(T)>>(x)));
+ }
+}
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int8_t load_i8(const void* p) noexcept { return *static_cast<const int8_t*>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint8_t load_u8(const void* p) noexcept { return *static_cast<const uint8_t*>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int16_t loada_i16(const void* p) noexcept { return loada<int16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int16_t loadu_i16(const void* p) noexcept { return loadu<int16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint16_t loada_u16(const void* p) noexcept { return loada<uint16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint16_t loadu_u16(const void* p) noexcept { return loadu<uint16_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int16_t loada_i16_le(const void* p) noexcept { return loada<ByteOrder::kLE, int16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int16_t loadu_i16_le(const void* p) noexcept { return loadu<ByteOrder::kLE, int16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint16_t loada_u16_le(const void* p) noexcept { return loada<ByteOrder::kLE, uint16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint16_t loadu_u16_le(const void* p) noexcept { return loadu<ByteOrder::kLE, uint16_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int16_t loada_i16_be(const void* p) noexcept { return loada<ByteOrder::kBE, int16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int16_t loadu_i16_be(const void* p) noexcept { return loadu<ByteOrder::kBE, int16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint16_t loada_u16_be(const void* p) noexcept { return loada<ByteOrder::kBE, uint16_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint16_t loadu_u16_be(const void* p) noexcept { return loadu<ByteOrder::kBE, uint16_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int32_t loada_i32(const void* p) noexcept { return loada<int32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int32_t loadu_i32(const void* p) noexcept { return loadu<int32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint32_t loada_u32(const void* p) noexcept { return loada<uint32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint32_t loadu_u32(const void* p) noexcept { return loadu<uint32_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int32_t loada_i32_le(const void* p) noexcept { return loada<ByteOrder::kLE, int32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int32_t loadu_i32_le(const void* p) noexcept { return loadu<ByteOrder::kLE, int32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint32_t loada_u32_le(const void* p) noexcept { return loada<ByteOrder::kLE, uint32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint32_t loadu_u32_le(const void* p) noexcept { return loadu<ByteOrder::kLE, uint32_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int32_t loada_i32_be(const void* p) noexcept { return loada<ByteOrder::kBE, int32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int32_t loadu_i32_be(const void* p) noexcept { return loadu<ByteOrder::kBE, int32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint32_t loada_u32_be(const void* p) noexcept { return loada<ByteOrder::kBE, uint32_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint32_t loadu_u32_be(const void* p) noexcept { return loadu<ByteOrder::kBE, uint32_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int64_t loada_i64(const void* p) noexcept { return loada<int64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int64_t loadu_i64(const void* p) noexcept { return loadu<int64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint64_t loada_u64(const void* p) noexcept { return loada<uint64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint64_t loadu_u64(const void* p) noexcept { return loadu<uint64_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int64_t loada_i64_le(const void* p) noexcept { return loada<ByteOrder::kLE, int64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int64_t loadu_i64_le(const void* p) noexcept { return loadu<ByteOrder::kLE, int64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint64_t loada_u64_le(const void* p) noexcept { return loada<ByteOrder::kLE, uint64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint64_t loadu_u64_le(const void* p) noexcept { return loadu<ByteOrder::kLE, uint64_t>(p); }
+
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int64_t loada_i64_be(const void* p) noexcept { return loada<ByteOrder::kBE, int64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG int64_t loadu_i64_be(const void* p) noexcept { return loadu<ByteOrder::kBE, int64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint64_t loada_u64_be(const void* p) noexcept { return loada<ByteOrder::kBE, uint64_t>(p); }
+[[nodiscard]] SUPPORT_INLINE_NODEBUG uint64_t loadu_u64_be(const void* p) noexcept { return loadu<ByteOrder::kBE, uint64_t>(p); }
+
+SUPPORT_INLINE_NODEBUG void store_i8(void* p, int8_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void store_u8(void* p, uint8_t x) noexcept { storea(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i16(void* p, int16_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i16(void* p, int16_t x) noexcept { storeu(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u16(void* p, uint16_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u16(void* p, uint16_t x) noexcept { storeu(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i16_le(void* p, int16_t x) noexcept { storea<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i16_le(void* p, int16_t x) noexcept { storeu<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u16_le(void* p, uint16_t x) noexcept { storea<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u16_le(void* p, uint16_t x) noexcept { storeu<ByteOrder::kLE>(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i16_be(void* p, int16_t x) noexcept { storea<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i16_be(void* p, int16_t x) noexcept { storeu<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u16_be(void* p, uint16_t x) noexcept { storea<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u16_be(void* p, uint16_t x) noexcept { storeu<ByteOrder::kBE>(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i32(void* p, int32_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i32(void* p, int32_t x) noexcept { storeu(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u32(void* p, uint32_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u32(void* p, uint32_t x) noexcept { storeu(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i32_le(void* p, int32_t x) noexcept { storea<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i32_le(void* p, int32_t x) noexcept { storeu<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u32_le(void* p, uint32_t x) noexcept { storea<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u32_le(void* p, uint32_t x) noexcept { storeu<ByteOrder::kLE>(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i32_be(void* p, int32_t x) noexcept { storea<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i32_be(void* p, int32_t x) noexcept { storeu<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u32_be(void* p, uint32_t x) noexcept { storea<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u32_be(void* p, uint32_t x) noexcept { storeu<ByteOrder::kBE>(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i64(void* p, int64_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i64(void* p, int64_t x) noexcept { storeu(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u64(void* p, uint64_t x) noexcept { storea(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u64(void* p, uint64_t x) noexcept { storeu(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i64_le(void* p, int64_t x) noexcept { storea<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i64_le(void* p, int64_t x) noexcept { storeu<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u64_le(void* p, uint64_t x) noexcept { storea<ByteOrder::kLE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u64_le(void* p, uint64_t x) noexcept { storeu<ByteOrder::kLE>(p, x); }
+
+SUPPORT_INLINE_NODEBUG void storea_i64_be(void* p, int64_t x) noexcept { storea<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_i64_be(void* p, int64_t x) noexcept { storeu<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storea_u64_be(void* p, uint64_t x) noexcept { storea<ByteOrder::kBE>(p, x); }
+SUPPORT_INLINE_NODEBUG void storeu_u64_be(void* p, uint64_t x) noexcept { storeu<ByteOrder::kBE>(p, x); }
+
+} // {anonymous}
+
+// Support - Enumerate
+// ===================
+
+//! A helper class that can be used to iterate over enum values.
+template<typename T>
+struct Enumerate {
+ using UnderlyingType = std::underlying_type_t<T>;
+
+ UnderlyingType _begin;
+ UnderlyingType _end;
+
+ struct Iterator {
+ UnderlyingType value;
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG T operator*() const { return T(value); }
+
+ SUPPORT_INLINE_NODEBUG void operator++() { value = UnderlyingType(value + UnderlyingType(1)); }
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG bool operator==(const Iterator& other) const noexcept { return value == other.value; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG bool operator!=(const Iterator& other) const noexcept { return value != other.value; }
+ };
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG Iterator begin() const noexcept { return Iterator{_begin}; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG Iterator end() const noexcept { return Iterator{_end}; }
+};
+
+template<typename T>
+static SUPPORT_INLINE_NODEBUG Enumerate<T> enumerate(T to = T::kMaxValue) {
+ using UnderlyingType = std::underlying_type_t<T>;
+
+ return Enumerate<T>{
+ UnderlyingType(0),
+ UnderlyingType(UnderlyingType(to) + UnderlyingType(1u))
+ };
+}
+
+template<typename T>
+static SUPPORT_INLINE_NODEBUG Enumerate<T> enumerate(T from, T to) {
+ using UnderlyingType = std::underlying_type_t<T>;
+
+ return Enumerate<T>{
+ UnderlyingType(from),
+ UnderlyingType(UnderlyingType(to) + UnderlyingType(1u))
+ };
+}
+
+// Support - String Utilities
+// ==========================
+
+template<typename T>
+[[nodiscard]]
+static SUPPORT_INLINE constexpr T ascii_to_lower(T c) noexcept { return T(c ^ T(T(c >= T('A') && c <= T('Z')) << 5)); }
+
+template<typename T>
+[[nodiscard]]
+static SUPPORT_INLINE constexpr T ascii_to_upper(T c) noexcept { return T(c ^ T(T(c >= T('a') && c <= T('z')) << 5)); }
+
+[[nodiscard]]
+static SUPPORT_INLINE_NODEBUG size_t str_nlen(const char* s, size_t max_size) noexcept {
+ size_t i = 0;
+ while (i < max_size && s[i] != '\0')
+ i++;
+ return i;
+}
+
+[[nodiscard]]
+static SUPPORT_INLINE constexpr uint32_t hash_char(uint32_t existing_hash, uint32_t c) noexcept {
+ return existing_hash * 65599 + c;
+}
+
+// Gets a hash of the given string `data` of size `size`. Size must be valid as this
+// function doesn't check for a null terminator and allows it in the middle of the string.
+[[nodiscard]]
+static SUPPORT_INLINE_NODEBUG uint32_t hash_string(const char* data, size_t size) noexcept {
+ uint32_t hash_code = 0;
+ for (uint32_t i = 0; i < size; i++) {
+ hash_code = hash_char(hash_code, uint8_t(data[i]));
+ }
+ return hash_code;
+}
+
+[[nodiscard]]
+static SUPPORT_INLINE_NODEBUG const char* find_packed_string(const char* p, uint32_t id) noexcept {
+ uint32_t i = 0;
+ while (i < id) {
+ while (p[0]) {
+ p++;
+ }
+ p++;
+ i++;
+ }
+ return p;
+}
+
+//! Compares two string views.
+[[nodiscard]]
+static SUPPORT_INLINE int compare_string_views(const char* a_data, size_t a_size, const char* b_data, size_t b_size) noexcept {
+ size_t size = min(a_size, b_size);
+
+ for (size_t i = 0; i < size; i++) {
+ int c = int(uint8_t(a_data[i])) - int(uint8_t(b_data[i]));
+ if (c != 0)
+ return c;
+ }
+
+ return int(a_size) - int(b_size);
+}
+
+// Support - Operators
+// ===================
+
+//! \cond INTERNAL
+struct Set { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { Support::maybe_unused(x); return y; } };
+struct SetNot { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { Support::maybe_unused(x); return ~y; } };
+struct And { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return x & y; } };
+struct AndNot { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return x & ~y; } };
+struct NotAnd { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return ~x & y; } };
+struct Xor { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return x ^ y; } };
+struct Add { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return x + y; } };
+struct Sub { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return x - y; } };
+struct Min { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return min<T>(x, y); } };
+struct Max { template<typename T> static SUPPORT_INLINE_NODEBUG T op(T x, T y) noexcept { return max<T>(x, y); } };
+
+struct Or {
+ template<typename T> static SUPPORT_INLINE_NODEBUG T op(T a, T b) noexcept { return a | b; }
+ template<typename T> static SUPPORT_INLINE_NODEBUG T op(T a, T b, T c) noexcept { return a | b | c; }
+ template<typename T> static SUPPORT_INLINE_NODEBUG T op(T a, T b, T c, T d) noexcept { return a | b | c | d; }
+};
+//! \endcond
+
+// Support - BytePack & Unpack
+// ===========================
+
+//! Pack four 8-bit integer into a 32-bit integer as it is an array of `{b0,b1,b2,b3}`.
+[[nodiscard]]
+static SUPPORT_INLINE constexpr uint32_t bytepack32_4x8(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
+ return (ByteOrder::kNative == ByteOrder::kLE)
+ ? (a | (b << 8) | (c << 16) | (d << 24))
+ : (d | (c << 8) | (b << 16) | (a << 24));
+}
+
+template<typename T>
+[[nodiscard]]
+static SUPPORT_INLINE constexpr uint32_t unpack_u32_at_0(T x) noexcept {
+ constexpr uint32_t kShift = ByteOrder::kNative == ByteOrder::kLE ? 0 : 32;
+ return uint32_t((uint64_t(x) >> kShift) & 0xFFFFFFFFu);
+}
+
+template<typename T>
+[[nodiscard]]
+static SUPPORT_INLINE constexpr uint32_t unpack_u32_at_1(T x) noexcept {
+ constexpr uint32_t kShift = ByteOrder::kNative == ByteOrder::kLE ? 32 : 0;
+ return uint32_t((uint64_t(x) >> kShift) & 0xFFFFFFFFu);
+}
+
+// Support - BitWordIterator
+// =========================
+
+//! Iterates over each bit in a number which is set to 1.
+//!
+//! Example of use:
+//!
+//! ```
+//! uint32_t bits_to_iterate = 0x110F;
+//! Support::BitWordIterator<uint32_t> it(bits_to_iterate);
+//!
+//! while (it.has_next()) {
+//! uint32_t bit_index = it.next();
+//! std::printf("Bit at %u is set\n", unsigned(bit_index));
+//! }
+//! ```
+template<typename T>
+class BitWordIterator {
+public:
+ SUPPORT_INLINE_NODEBUG explicit BitWordIterator(T bit_word) noexcept
+ : _bit_word(bit_word) {}
+
+ SUPPORT_INLINE_NODEBUG void init(T bit_word) noexcept { _bit_word = bit_word; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG bool has_next() const noexcept { return _bit_word != 0; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE uint32_t next() noexcept {
+ SUPPORT_ASSERT(_bit_word != 0);
+ uint32_t index = ctz(_bit_word);
+ _bit_word &= T(_bit_word - 1);
+ return index;
+ }
+
+ T _bit_word;
+};
+
+// Support - BitVectorOps
+// ======================
+
+//! \cond
+namespace Internal {
+ template<typename T, class OperatorT, class FullWordOpT>
+ static SUPPORT_INLINE void bit_vector_op(T* buf, size_t index, size_t count) noexcept {
+ if (count == 0) {
+ return;
+ }
+
+ size_t word_index = index / bit_size_of<T>; // T[]
+ size_t bit_index = index % bit_size_of<T>; // T[][]
+
+ buf += word_index;
+
+ // The first BitWord requires special handling to preserve bits outside the fill region.
+ constexpr T fill_mask = bit_ones<T>;
+ size_t first_n_bits = min<size_t>(bit_size_of<T> - bit_index, count);
+
+ buf[0] = OperatorT::op(buf[0], (fill_mask >> (bit_size_of<T> - first_n_bits)) << bit_index);
+ buf++;
+ count -= first_n_bits;
+
+ // All bits between the first and last affected BitWords can be just filled.
+ while (count >= bit_size_of<T>) {
+ buf[0] = FullWordOpT::op(buf[0], fill_mask);
+ buf++;
+ count -= bit_size_of<T>;
+ }
+
+ // The last BitWord requires special handling as well
+ if (count) {
+ buf[0] = OperatorT::op(buf[0], fill_mask >> (bit_size_of<T> - count));
+ }
+ }
+}
+//! \endcond
+
+//! Sets bit in a bit-vector `buf` at `index`.
+template<typename T>
+static SUPPORT_INLINE_NODEBUG bool bit_vector_get_bit(T* buf, size_t index) noexcept {
+ size_t word_index = index / bit_size_of<T>;
+ size_t bit_index = index % bit_size_of<T>;
+
+ return bool((buf[word_index] >> bit_index) & 0x1u);
+}
+
+//! Sets bit in a bit-vector `buf` at `index` to `value`.
+template<typename T>
+static SUPPORT_INLINE_NODEBUG void bit_vector_set_bit(T* buf, size_t index, bool value) noexcept {
+ size_t word_index = index / bit_size_of<T>;
+ size_t bit_index = index % bit_size_of<T>;
+
+ T clear_mask = T(1u) << bit_index;
+ T set_mask = T(value) << bit_index;
+
+ buf[word_index] = T((buf[word_index] & ~clear_mask) | set_mask);
+}
+
+//! Sets bit in a bit-vector `buf` at `index` to `value`.
+template<typename T>
+static SUPPORT_INLINE_NODEBUG void bit_vector_or_bit(T* buf, size_t index, bool value) noexcept {
+ size_t word_index = index / bit_size_of<T>;
+ size_t bit_index = index % bit_size_of<T>;
+
+ T bit_mask = T(value) << bit_index;
+ buf[word_index] |= bit_mask;
+}
+
+//! Sets bit in a bit-vector `buf` at `index` to `value`.
+template<typename T>
+static SUPPORT_INLINE_NODEBUG void bit_vector_xor_bit(T* buf, size_t index, bool value) noexcept {
+ size_t word_index = index / bit_size_of<T>;
+ size_t bit_index = index % bit_size_of<T>;
+
+ T bit_mask = T(value) << bit_index;
+ buf[word_index] ^= bit_mask;
+}
+
+//! Fills `count` bits in bit-vector `buf` starting at bit-index `index`.
+template<typename T>
+static SUPPORT_INLINE_NODEBUG void bit_vector_fill(T* buf, size_t index, size_t count) noexcept { Internal::bit_vector_op<T, Or, Set>(buf, index, count); }
+
+//! Clears `count` bits in bit-vector `buf` starting at bit-index `index`.
+template<typename T>
+static SUPPORT_INLINE_NODEBUG void bit_vector_clear(T* buf, size_t index, size_t count) noexcept { Internal::bit_vector_op<T, AndNot, SetNot>(buf, index, count); }
+
+template<typename T>
+static SUPPORT_INLINE size_t bit_vector_index_of(T* buf, size_t start, bool value) noexcept {
+ size_t word_index = start / bit_size_of<T>; // T[]
+ size_t bit_index = start % bit_size_of<T>; // T[][]
+
+ T* p = buf + word_index;
+
+ // We always look for zeros, if value is `true` we have to flip all bits before the search.
+ const T fill_mask = bit_ones<T>;
+ const T flip_mask = value ? T(0) : fill_mask;
+
+ // The first BitWord requires special handling as there are some bits we want to ignore.
+ T bits = (*p ^ flip_mask) & (fill_mask << bit_index);
+ for (;;) {
+ if (bits) {
+ return (size_t)(p - buf) * bit_size_of<T> + ctz(bits);
+ }
+ bits = *++p ^ flip_mask;
+ }
+}
+
+// Support - BitVectorIterator
+// ===========================
+
+template<typename T>
+class BitVectorIterator {
+public:
+ const T* _ptr;
+ size_t _idx;
+ size_t _end;
+ T _current;
+
+ SUPPORT_INLINE_NODEBUG BitVectorIterator(const BitVectorIterator& other) noexcept = default;
+
+ SUPPORT_INLINE_NODEBUG BitVectorIterator(Span<const T> data, size_t start = 0) noexcept {
+ init(data, start);
+ }
+
+ SUPPORT_INLINE void init(Span<const T> data, size_t start = 0) noexcept {
+ const T* ptr = data.data() + (start / bit_size_of<T>);
+ size_t idx = align_down(start, bit_size_of<T>);
+ size_t end = data.size() * bit_size_of<T>;
+
+ T bit_word = T(0);
+ if (idx < end) {
+ bit_word = *ptr++ & (bit_ones<T> << (start % bit_size_of<T>));
+ while (!bit_word && (idx += bit_size_of<T>) < end) {
+ bit_word = *ptr++;
+ }
+ }
+
+ _ptr = ptr;
+ _idx = idx;
+ _end = end;
+ _current = bit_word;
+ }
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG bool has_next() const noexcept {
+ return _current != T(0);
+ }
+
+ [[nodiscard]]
+ SUPPORT_INLINE size_t next() noexcept {
+ T bit_word = _current;
+ SUPPORT_ASSERT(bit_word != T(0));
+
+ uint32_t bit = ctz(bit_word);
+ bit_word &= T(bit_word - 1u);
+
+ size_t n = _idx + bit;
+ while (!bit_word && (_idx += bit_size_of<T>) < _end) {
+ bit_word = *_ptr++;
+ }
+
+ _current = bit_word;
+ return n;
+ }
+
+ [[nodiscard]]
+ SUPPORT_INLINE size_t peek_next() const noexcept {
+ SUPPORT_ASSERT(_current != T(0));
+ return _idx + ctz(_current);
+ }
+};
+
+// Support - BitVectorOpIterator
+// =============================
+
+template<typename T, class OperatorT>
+class BitVectorOpIterator {
+public:
+ const T* _a_ptr;
+ const T* _b_ptr;
+ size_t _idx;
+ size_t _end;
+ T _current;
+
+ SUPPORT_INLINE_NODEBUG BitVectorOpIterator(const T* a_data, const T* b_data, size_t bit_word_count, size_t start = 0) noexcept {
+ init(a_data, b_data, bit_word_count, start);
+ }
+
+ SUPPORT_INLINE_NODEBUG BitVectorOpIterator(Span<const T> a, Span<const T> b, size_t start = 0) noexcept {
+ SUPPORT_ASSERT(a.size() == b.size());
+ init(a.data(), b.data(), a.size(), start);
+ }
+
+ SUPPORT_INLINE void init(const T* a_data, const T* b_data, size_t bit_word_count, size_t start = 0) noexcept {
+ const T* a_ptr = a_data + (start / bit_size_of<T>);
+ const T* b_ptr = b_data + (start / bit_size_of<T>);
+ size_t idx = align_down(start, bit_size_of<T>);
+ size_t end = bit_word_count * bit_size_of<T>;
+
+ T bit_word = T(0);
+ if (idx < end) {
+ bit_word = OperatorT::op(*a_ptr++, *b_ptr++) & (bit_ones<T> << (start % bit_size_of<T>));
+ while (!bit_word && (idx += bit_size_of<T>) < end) {
+ bit_word = OperatorT::op(*a_ptr++, *b_ptr++);
+ }
+ }
+
+ _a_ptr = a_ptr;
+ _b_ptr = b_ptr;
+ _idx = idx;
+ _end = end;
+ _current = bit_word;
+ }
+
+ [[nodiscard]]
+ SUPPORT_INLINE_NODEBUG bool has_next() noexcept {
+ return _current != T(0);
+ }
+
+ [[nodiscard]]
+ SUPPORT_INLINE size_t next() noexcept {
+ T bit_word = _current;
+ SUPPORT_ASSERT(bit_word != T(0));
+
+ uint32_t bit = ctz(bit_word);
+ bit_word &= T(bit_word - 1u);
+
+ size_t n = _idx + bit;
+ while (!bit_word && (_idx += bit_size_of<T>) < _end) {
+ bit_word = OperatorT::op(*_a_ptr++, *_b_ptr++);
+ }
+
+ _current = bit_word;
+ return n;
+ }
+};
+
+// Support - Sorting
+// =================
+
+//! Sort order.
+enum class SortOrder : uint32_t {
+ //!< Ascending order.
+ kAscending = 0,
+ //!< Descending order.
+ kDescending = 1
+};
+
+//! A helper class that provides comparison of any user-defined type that
+//! implements `<` and `>` operators (primitive types are supported as well).
+template<SortOrder kOrder = SortOrder::kAscending>
+struct Compare {
+ template<typename A, typename B>
+ SUPPORT_INLINE_NODEBUG int operator()(const A& a, const B& b) const noexcept {
+ return kOrder == SortOrder::kAscending ? int(a > b) - int(a < b) : int(a < b) - int(a > b);
+ }
+};
+
+//! Insertion sort.
+template<typename T, typename CompareT = Compare<SortOrder::kAscending>>
+static SUPPORT_INLINE void insertion_sort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept {
+ for (T* pm = base + 1; pm < base + size; pm++) {
+ for (T* pl = pm; pl > base && cmp(pl[-1], pl[0]) > 0; pl--) {
+ std::swap(pl[-1], pl[0]);
+ }
+ }
+}
+
+//! \cond
+namespace Internal {
+ //! Quick-sort implementation.
+ template<typename T, class CompareT>
+ struct QSortImpl {
+ static inline constexpr size_t kStackSize = 64u * 2u;
+ static inline constexpr size_t kISortThreshold = 7u;
+
+ // Based on "PDCLib - Public Domain C Library" and rewritten to C++.
+ static void sort(T* base, size_t size, const CompareT& cmp) noexcept {
+ T* end = base + size;
+ T* stack[kStackSize];
+ T** stack_ptr = stack;
+
+ for (;;) {
+ if ((size_t)(end - base) > kISortThreshold) {
+ // We work from second to last - first will be pivot element.
+ T* pi = base + 1;
+ T* pj = end - 1;
+ std::swap(base[(size_t)(end - base) / 2], base[0]);
+
+ if (cmp(*pi , *pj ) > 0) { std::swap(*pi , *pj ); }
+ if (cmp(*base, *pj ) > 0) { std::swap(*base, *pj ); }
+ if (cmp(*pi , *base) > 0) { std::swap(*pi , *base); }
+
+ // Now we have the median for pivot element, entering main loop.
+ for (;;) {
+ while (pi < pj && cmp(*++pi, *base) < 0) continue; // Move `i` right until `*i >= pivot`.
+ while (pj > base && cmp(*--pj, *base) > 0) continue; // Move `j` left until `*j <= pivot`.
+
+ if (pi > pj) {
+ break;
+ }
+ std::swap(*pi, *pj);
+ }
+
+ // Move pivot into correct place.
+ std::swap(*base, *pj);
+
+ // Larger subfile base / end to stack, sort smaller.
+ if (pj - base > end - pi) {
+ // Left is larger.
+ *stack_ptr++ = base;
+ *stack_ptr++ = pj;
+ base = pi;
+ }
+ else {
+ // Right is larger.
+ *stack_ptr++ = pi;
+ *stack_ptr++ = end;
+ end = pj;
+ }
+ SUPPORT_ASSERT(stack_ptr <= stack + kStackSize);
+ }
+ else {
+ // UB sanitizer doesn't like applying offset to a nullptr base.
+ if (base != end) {
+ insertion_sort(base, (size_t)(end - base), cmp);
+ }
+
+ if (stack_ptr == stack) {
+ break;
+ }
+
+ end = *--stack_ptr;
+ base = *--stack_ptr;
+ }
+ }
+ }
+ };
+}
+//! \endcond
+
+//! Quick sort implementation.
+//!
+//! The main reason to provide a custom qsort implementation is that we needed something that will
+//! never throw `bad_alloc` exception. This implementation doesn't use dynamic memory allocation.
+template<typename T, class CompareT = Compare<SortOrder::kAscending>>
+static SUPPORT_INLINE_NODEBUG void sort(T* base, size_t size, const CompareT& cmp = CompareT{}) noexcept {
+ Internal::QSortImpl<T, CompareT>::sort(base, size, cmp);
+}
+
+// Support - Array
+// ===============
+
+//! Array type, similar to std::array<T, N>, with the possibility to use enums in operator[].
+//!
+//! \note The array has C semantics - the elements in the array are not initialized.
+template<typename T, size_t N>
+struct Array {
+ //! \name Members
+ //! \{
+
+ //! The underlying array data, use `data()` to access it.
+ T _data[N];
+
+ //! \}
+
+ //! \cond
+ // std compatibility.
+ using value_type = T;
+ using size_type = size_t;
+ using difference_type = ptrdiff_t;
+
+ using reference = value_type&;
+ using const_reference = const value_type&;
+
+ using pointer = value_type*;
+ using const_pointer = const value_type*;
+
+ using iterator = pointer;
+ using const_iterator = const_pointer;
+ //! \endcond
+
+ //! \name Overloaded Operators
+ //! \{
+
+ template<typename Index>
+ SUPPORT_INLINE T& operator[](const Index& index) noexcept {
+ SUPPORT_ASSERT(as_std_uint(index) < N);
+ return _data[as_std_uint(index)];
+ }
+
+ template<typename Index>
+ SUPPORT_INLINE const T& operator[](const Index& index) const noexcept {
+ SUPPORT_ASSERT(as_std_uint(index) < N);
+ return _data[as_std_uint(index)];
+ }
+
+ SUPPORT_INLINE constexpr bool operator==(const Array& other) const noexcept {
+ for (size_t i = 0; i < N; i++) {
+ if (_data[i] != other._data[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ SUPPORT_INLINE constexpr bool operator!=(const Array& other) const noexcept {
+ return !operator==(other);
+ }
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr bool is_empty() const noexcept { return false; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr size_t size() const noexcept { return N; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr T* data() noexcept { return _data; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T* data() const noexcept { return _data; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr T& front() noexcept { return _data[0]; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T& front() const noexcept { return _data[0]; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr T& back() noexcept { return _data[N - 1]; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T& back() const noexcept { return _data[N - 1]; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr T* begin() noexcept { return _data; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr T* end() noexcept { return _data + N; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T* begin() const noexcept { return _data; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T* end() const noexcept { return _data + N; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T* cbegin() const noexcept { return _data; }
+
+ [[nodiscard]]
+ SUPPORT_INLINE constexpr const T* cend() const noexcept { return _data + N; }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ SUPPORT_INLINE Span<T> as_span() noexcept { return Span<T>(_data, N); }
+ SUPPORT_INLINE Span<const T> as_span() const noexcept { return Span<const T>(_data, N); }
+
+ SUPPORT_INLINE void swap(Array& other) noexcept {
+ for (size_t i = 0; i < N; i++) {
+ std::swap(_data[i], other._data[i]);
+ }
+ }
+
+ SUPPORT_INLINE void fill(const T& value) noexcept {
+ for (size_t i = 0; i < N; i++) {
+ _data[i] = value;
+ }
+ }
+
+ SUPPORT_INLINE void copy_from(const Array& other) noexcept {
+ for (size_t i = 0; i < N; i++) {
+ _data[i] = other._data[i];
+ }
+ }
+
+ template<typename Operator>
+ SUPPORT_INLINE void combine(const Array& other) noexcept {
+ for (size_t i = 0; i < N; i++) {
+ _data[i] = Operator::op(_data[i], other._data[i]);
+ }
+ }
+
+ template<typename Operator>
+ SUPPORT_INLINE T aggregate(T initial_value = T()) const noexcept {
+ T value = initial_value;
+ for (size_t i = 0; i < N; i++) {
+ value = Operator::op(value, _data[i]);
+ }
+ return value;
+ }
+
+ template<typename Fn>
+ SUPPORT_INLINE void for_each(Fn&& fn) noexcept {
+ for (size_t i = 0; i < N; i++) {
+ fn(_data[i]);
+ }
+ }
+ //! \}
+};
+
+// Support - Cleanup Core Macros
+// =============================
+
+#undef SUPPORT_INLINE_NODEBUG
+#undef SUPPORT_INLINE
+#undef SUPPORT_ASSERT
+
+} // {Support}
+
+//! \}
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_SUPPORT_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/support/support_p.h b/3rdparty/asmjit/asmjit/support/support_p.h
new file mode 100644
index 00000000000..6e196d4370b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/support/support_p.h
@@ -0,0 +1,255 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_SUPPORT_SUPPORT_P_H_INCLUDED
+#define ASMJIT_SUPPORT_SUPPORT_P_H_INCLUDED
+
+#include <asmjit/support/arenabitset_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_NAMESPACE
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_utilities
+//! \{
+
+namespace Support {
+
+//! Stack with a fixed storage - cannot hold more items than the initial capacity.
+template<typename T>
+class FixedStack {
+ T* _begin = nullptr;
+ T* _end = nullptr;
+ T* _ptr = nullptr;
+
+public:
+ ASMJIT_INLINE_NODEBUG FixedStack(T* buffer, size_t capacity) noexcept
+ : _begin(buffer),
+ _end(buffer + capacity),
+ _ptr(buffer) {}
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _begin == _ptr; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return (size_t)(_ptr - _begin); }
+
+ //! Pushes an item to the stack.
+ ASMJIT_INLINE void push(T item) noexcept {
+ ASMJIT_ASSERT(_ptr != _end);
+ *_ptr++ = item;
+ }
+
+ //! Pops an item from the stack.
+ [[nodiscard]]
+ ASMJIT_INLINE T pop() noexcept {
+ ASMJIT_ASSERT(_ptr != _begin);
+ return *--_ptr;
+ }
+};
+
+//! Queue with a fixed storage - cannot hold more items than the initial capacity.
+template<typename T>
+struct FixedQueue {
+protected:
+ T* _begin = nullptr;
+ T* _end = nullptr;
+ T* _read_ptr = nullptr;
+ T* _store_ptr = nullptr;
+
+public:
+ ASMJIT_INLINE_NODEBUG FixedQueue(T* buffer, size_t capacity) noexcept
+ : _begin(buffer),
+ _end(buffer + capacity),
+ _read_ptr(buffer),
+ _store_ptr(buffer) {}
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept {
+ return _read_ptr == _store_ptr;
+ }
+
+ //! Gets an item from the queue (the item is removed).
+ [[nodiscard]]
+ ASMJIT_INLINE T get() noexcept {
+ T item = *_read_ptr++;
+ if (ASMJIT_UNLIKELY(_read_ptr == _end)) {
+ _read_ptr = _begin;
+ }
+ return item;
+ }
+
+ //! Puts an item to the queue's back.
+ ASMJIT_INLINE void put_back(T item) noexcept {
+ *_store_ptr++ = item;
+ if (ASMJIT_UNLIKELY(_store_ptr == _end)) {
+ _store_ptr = _begin;
+ }
+ }
+
+ //! Puts an item to the queue's front.
+ ASMJIT_INLINE void put_front(T item) noexcept {
+ if (ASMJIT_UNLIKELY(_read_ptr == _begin)) {
+ _read_ptr = _end;
+ }
+ *--_read_ptr = item;
+ }
+};
+
+class BitWordMutator {
+public:
+ BitWord _bit_word;
+
+ ASMJIT_INLINE explicit BitWordMutator(Span<BitWord> span) noexcept {
+ ASMJIT_ASSERT(span.size() == 1u);
+ _bit_word = span[0];
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE BitWord bit_word([[maybe_unused]] size_t index) const noexcept {
+ ASMJIT_ASSERT(index == 0u);
+ return _bit_word;
+ }
+
+ ASMJIT_INLINE void set_bit_word([[maybe_unused]] size_t index, BitWord bw) noexcept {
+ ASMJIT_ASSERT(index == 0u);
+ _bit_word = bw;
+ }
+
+ template<typename Index>
+ [[nodiscard]]
+ ASMJIT_INLINE bool bit_at(const Index& index) const noexcept {
+ ASMJIT_ASSERT(size_t(index) < bit_size_of<BitWord>);
+ return (_bit_word & (BitWord(1) << size_t(index))) != 0u;
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void set_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(size_t(index) < bit_size_of<BitWord>);
+
+ BitWord clear_mask = BitWord(1u) << size_t(index);
+ BitWord bit_mask = BitWord(value) << size_t(index);
+
+ _bit_word = (_bit_word & ~clear_mask) | bit_mask;
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void add_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(size_t(index) < bit_size_of<BitWord>);
+
+ BitWord bit_mask = BitWord(value) << size_t(index);
+ _bit_word |= bit_mask;
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void clear_bit(const Index& index) noexcept {
+ ASMJIT_ASSERT(size_t(index) < bit_size_of<BitWord>);
+
+ BitWord bit_mask = BitWord(1) << size_t(index);
+ _bit_word &= ~bit_mask;
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void xor_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(size_t(index) < bit_size_of<BitWord>);
+
+ BitWord bit_mask = BitWord(value) << size_t(index);
+ _bit_word ^= bit_mask;
+ }
+
+ ASMJIT_INLINE void clear_bits(const BitWordMutator& other) noexcept {
+ _bit_word &= ~other._bit_word;
+ }
+
+ ASMJIT_INLINE void commit(Span<BitWord> span) const noexcept {
+ span[0] = _bit_word;
+ }
+};
+
+class BitVectorMutator {
+public:
+ template<typename T>
+ static ASMJIT_INLINE T bit_word_count_of(const T& n) noexcept {
+ return T((n + bit_size_of<BitWord> - 1u) / bit_size_of<BitWord>);
+ }
+
+ BitWord* _data;
+ size_t _count;
+
+ ASMJIT_INLINE BitVectorMutator(BitWord* data, size_t count) noexcept
+ : _data(data),
+ _count(count) {}
+
+ ASMJIT_INLINE BitVectorMutator(Span<BitWord> span) noexcept
+ : _data(span.data()),
+ _count(span.size()) {}
+
+ [[nodiscard]]
+ ASMJIT_INLINE BitWord bit_word(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < _count);
+ return _data[index];
+ }
+
+ ASMJIT_INLINE void set_bit_word(size_t index, BitWord bw) noexcept {
+ ASMJIT_ASSERT(index < _count);
+ _data[index] = bw;
+ }
+
+ template<typename Index>
+ [[nodiscard]]
+ ASMJIT_INLINE bool bit_at(const Index& index) const noexcept {
+ ASMJIT_ASSERT(size_t(index) < _count * bit_size_of<BitWord>);
+ return bit_vector_get_bit(_data, size_t(index));
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void set_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(size_t(index) < _count * bit_size_of<BitWord>);
+ bit_vector_set_bit(_data, size_t(index), value);
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void add_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(size_t(index) < _count * bit_size_of<BitWord>);
+ bit_vector_or_bit(_data, size_t(index), value);
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void clear_bit(const Index& index) noexcept {
+ ASMJIT_ASSERT(size_t(index) < _count * bit_size_of<BitWord>);
+ bit_vector_set_bit(_data, size_t(index), false);
+ }
+
+ template<typename Index>
+ ASMJIT_INLINE void xor_bit(const Index& index, bool value) noexcept {
+ ASMJIT_ASSERT(size_t(index) < _count * bit_size_of<BitWord>);
+ bit_vector_xor_bit(_data, size_t(index), value);
+ }
+
+ ASMJIT_INLINE void clear_bits(const BitVectorMutator& other) noexcept {
+ ASMJIT_ASSERT(_count == other._count);
+
+ size_t n = _count;
+ const BitWord* other_data = other._data;
+
+ for (size_t i = 0u; i < n; i++) {
+ _data[i] &= ~other_data[i];
+ }
+ }
+
+ ASMJIT_INLINE void commit(Span<BitWord> span) const noexcept {
+ // Does nothing - each operation is written to memory.
+ Support::maybe_unused(span);
+ }
+};
+
+} // {Support}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_NAMESPACE
+
+#endif // ASMJIT_SUPPORT_SUPPORT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit.h b/3rdparty/asmjit/asmjit/ujit.h
new file mode 100644
index 00000000000..4e972982bef
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit.h
@@ -0,0 +1,17 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_H_INCLUDED
+#define ASMJIT_UJIT_H_INCLUDED
+
+#include <asmjit/asmjit-scope-begin.h>
+#include <asmjit/ujit/ujitbase.h>
+#include <asmjit/ujit/unicompiler.h>
+#include <asmjit/ujit/unicondition.h>
+#include <asmjit/ujit/uniop.h>
+#include <asmjit/ujit/vecconsttable.h>
+#include <asmjit/asmjit-scope-end.h>
+
+#endif // ASMJIT_UJIT_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit/ujitbase.h b/3rdparty/asmjit/asmjit/ujit/ujitbase.h
new file mode 100644
index 00000000000..2bbef3cfa03
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/ujitbase.h
@@ -0,0 +1,734 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_JITBASE_P_H_INCLUDED
+#define ASMJIT_UJIT_JITBASE_P_H_INCLUDED
+
+#include <asmjit/host.h>
+
+#if !defined(ASMJIT_NO_UJIT) && !defined(ASMJIT_HAS_HOST_BACKEND)
+ #pragma message("ASMJIT_NO_UJIT wasn't defined, however, no backends were found! (ASMJIT_HAS_HOST_BACKEND not defined)")
+#endif
+
+#if !defined(ASMJIT_NO_UJIT)
+
+//! \namespace asmjit::ujit
+//! \ingroup asmjit_ujit
+//!
+//! Namespace that provides all UJIT (Universal JIT) functionality.
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+//! \addtogroup asmjit_ujit
+//! \{
+
+//! Backend compiler is simply an alias to a `host::Compiler`, which would be used by \ref UniCompiler.
+using BackendCompiler = host::Compiler;
+//! Condition code is simply an alias to a `host::CondCode`.
+using CondCode = host::CondCode;
+//! Target memory operand.
+using Mem = host::Mem;
+//! Target general-purpose register.
+using Gp = host::Gp;
+//! Target vector register.
+using Vec = host::Vec;
+
+#if defined(ASMJIT_UJIT_X86)
+static ASMJIT_INLINE_NODEBUG Mem mem_ptr(const Label& label, int32_t disp = 0) noexcept { return x86::ptr(label, disp); }
+static ASMJIT_INLINE_NODEBUG Mem mem_ptr(const Gp& base, int32_t disp = 0) noexcept { return x86::ptr(base, disp); }
+static ASMJIT_INLINE_NODEBUG Mem mem_ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t disp = 0) noexcept { return x86::ptr(base, index, shift, disp); }
+#endif
+
+#if defined(ASMJIT_UJIT_AARCH64)
+static ASMJIT_INLINE_NODEBUG Mem mem_ptr(const Label& label, int32_t disp = 0) noexcept { return a64::ptr(label, disp); }
+static ASMJIT_INLINE_NODEBUG Mem mem_ptr(const Gp& base, int32_t disp = 0) noexcept { return a64::ptr(base, disp); }
+static ASMJIT_INLINE_NODEBUG Mem mem_ptr(const Gp& base, const Gp& index, uint32_t shift = 0) noexcept { return a64::ptr(base, index, a64::lsl(shift)); }
+#endif
+
+// Types & Enums
+// -------------
+
+//! Data alignment.
+enum class Alignment : uint32_t {};
+
+//! The behavior of a floating point scalar operation.
+enum class ScalarOpBehavior : uint8_t {
+ //! The rest of the elements are zeroed, only the first element would contain the result (AArch64).
+ kZeroing,
+ //! The rest of the elements are unchanged, elements above 128-bits are zeroed.
+ kPreservingVec128
+};
+
+//! The behavior of floating point to int conversion.
+enum class FloatToIntOutsideRangeBehavior : uint8_t {
+ //! In case that the floating point is outside of the integer range, the value is the smallest integer value,
+ //! which would be `0x80`, `0x8000`, `0x80000000`, or `0x8000000000000000` depending on the target integer width.
+ kSmallestValue,
+ //! In case that the floating point is outside of the integer range, the resulting integer will be saturated. If
+ //! the floating point is NaN, the resulting integer value would be zero.
+ kSaturatedValue
+};
+
+//! The behavior of a floating point min/max instructions when comparing against NaN.
+enum class FMinFMaxOpBehavior : uint8_t {
+ //! Min and max selects a finite value if one of the compared values is NaN.
+ kFiniteValue,
+ //! Min and max is implemented like `if a <|> b ? a : b`.
+ kTernaryLogic
+};
+
+//! The behavior of floating point `madd` instructions.
+enum class FMAddOpBehavior : uint8_t {
+ //! FMA is not available, thus `madd` is translated into two instructions (MUL + ADD).
+ kNoFMA,
+ //! FMA is available, the ISA allows to store the result to any of the inputs (X86|X86_64).
+ kFMAStoreToAny,
+ //! FMA is available, the ISA always uses accumulator register as a destination register (AArch64).
+ kFMAStoreToAccumulator
+};
+
+//! SIMD data width.
+enum class DataWidth : uint8_t {
+ //! 8-bit elements.
+ k8 = 0,
+ //! 16-bit elements.
+ k16 = 1,
+ //! 32-bit elements.
+ k32 = 2,
+ //! 64-bit elements or 64-bit wide data is used.
+ k64 = 3,
+ //! 128-bit elements or 128-bit wide data is used.
+ k128 = 4
+};
+
+//! Vector register width.
+enum class VecWidth : uint8_t {
+ //! 128-bit vector register (baseline, SSE/AVX, NEON, etc...).
+ k128 = 0,
+ //! 256-bit vector register (AVX2+).
+ k256 = 1,
+ //! 512-bit vector register (AVX512_DQ & AVX512_BW & AVX512_VL).
+ k512 = 2,
+ //! 1024-bit vector register (no backend at the moment).
+ k1024 = 3
+};
+
+//! Broadcast width.
+enum class Bcst : uint8_t {
+ //! Broadcast 8-bit elements.
+ k8 = 0,
+ //! Broadcast 16-bit elements.
+ k16 = 1,
+ //! Broadcast 32-bit elements.
+ k32 = 2,
+ //! Broadcast 64-bit elements.
+ k64 = 3,
+
+ kNA = 0xFE,
+ kNA_Unique = 0xFF
+};
+
+namespace VecWidthUtils {
+
+static ASMJIT_INLINE OperandSignature signature_of(VecWidth vw) noexcept {
+ RegType reg_type = RegType(uint32_t(RegType::kVec128) + uint32_t(vw));
+ uint32_t reg_size = 16u << uint32_t(vw);
+
+ return OperandSignature::from_op_type(OperandType::kReg) | OperandSignature::from_reg_type_and_group(reg_type, RegGroup::kVec) | OperandSignature::from_size(reg_size);
+}
+
+static ASMJIT_INLINE TypeId type_id_of(VecWidth vw) noexcept {
+#if defined(ASMJIT_UJIT_X86)
+ static const TypeId table[] = {
+ TypeId::kInt32x4,
+ TypeId::kInt32x8,
+ TypeId::kInt32x16
+ };
+
+ return table[size_t(vw)];
+#endif
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ Support::maybe_unused(vw);
+ return TypeId::kInt32x4;
+#endif
+}
+
+static ASMJIT_INLINE_NODEBUG VecWidth vec_width_of(const Vec& reg) noexcept {
+ return VecWidth(uint32_t(reg.reg_type()) - uint32_t(RegType::kVec128));
+}
+
+static ASMJIT_INLINE_NODEBUG VecWidth vec_width_of(VecWidth vw, DataWidth data_width, uint32_t n) noexcept {
+ return VecWidth(Support::min<uint32_t>((n << uint32_t(data_width)) >> 5, uint32_t(vw)));
+}
+
+static ASMJIT_INLINE Vec clone_vec_as(const Vec& src, VecWidth vw) noexcept {
+ Vec result(src);
+ result.set_signature(signature_of(vw));
+ return result;
+}
+
+} // {VecWidthUtils}
+
+// AsmJit Helpers
+// ==============
+
+//! Operand array, mostly used for code generation that uses SIMD.
+//!
+//! Can hold up to `kMaxSize` registers, however, the number of actual registers is dynamic and depends
+//! on initialization.
+class OpArray {
+public:
+ using Op = Operand_;
+
+ //! Maximum number of active operands `OpArray` can hold.
+ static inline constexpr size_t kMaxSize = 8;
+
+ //! \name Members
+ //! \{
+
+ //! Number of operands in OpArray
+ size_t _size;
+ //! Underlying operand array.
+ Operand_ v[kMaxSize];
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG OpArray() noexcept { reset(); }
+
+ ASMJIT_INLINE_NODEBUG explicit OpArray(const Op& op0) noexcept {
+ init(op0);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1) noexcept {
+ init(op0, op1);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1, const Op& op2) noexcept {
+ init(op0, op1, op2);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1, const Op& op2, const Op& op3) noexcept {
+ init(op0, op1, op2, op3);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4) noexcept {
+ init(op0, op1, op2, op3, op4);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4, const Op& op5) noexcept {
+ init(op0, op1, op2, op3, op4, op5);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4, const Op& op5, const Op& op6) noexcept {
+ init(op0, op1, op2, op3, op4, op5, op6);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4, const Op& op5, const Op& op6, const Op& op7) noexcept {
+ init(op0, op1, op2, op3, op4, op5, op6, op7);
+ }
+
+ ASMJIT_INLINE_NODEBUG OpArray(const OpArray& other) noexcept { init(other); }
+
+protected:
+ // Used internally to implement `low()`, `high()`, `even()`, and `odd()`.
+ ASMJIT_INLINE_NODEBUG OpArray(const OpArray& other, size_t from, size_t inc, size_t limit) noexcept {
+ size_t di = 0;
+ for (size_t si = from; si < limit; si += inc) {
+ v[di++] = other[si];
+ }
+ _size = di;
+ }
+
+ //! \}
+
+protected:
+ ASMJIT_INLINE_NODEBUG OpArray& operator=(const OpArray& other) noexcept {
+ init(other);
+ return *this;
+ }
+
+ //! \name Internal Utilities
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG void _resetFrom(size_t index) noexcept {
+ for (size_t i = index; i < kMaxSize; i++) {
+ v[index].reset();
+ }
+ }
+
+ //! \}
+
+public:
+ //! Resets `OpArray` to a default construction state.
+ ASMJIT_INLINE_NODEBUG void reset() noexcept {
+ _size = 0;
+ for (size_t i = 0; i < kMaxSize; i++) {
+ v[i].reset();
+ }
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op* array, size_t size) noexcept {
+ _size = size;
+ if (size) {
+ memcpy(v, array, size * sizeof(Op));
+ }
+ _resetFrom(size);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const OpArray& other) noexcept {
+ init(other.v, other._size);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0) noexcept {
+ _size = 1;
+ v[0] = op0;
+ _resetFrom(1);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1) noexcept {
+ _size = 2;
+ v[0] = op0;
+ v[1] = op1;
+ _resetFrom(2);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1, const Op& op2) noexcept {
+ _size = 3;
+ v[0] = op0;
+ v[1] = op1;
+ v[2] = op2;
+ _resetFrom(3);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1, const Op& op2, const Op& op3) noexcept {
+ _size = 4;
+ v[0] = op0;
+ v[1] = op1;
+ v[2] = op2;
+ v[3] = op3;
+ _resetFrom(4);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4) noexcept {
+ _size = 5;
+ v[0] = op0;
+ v[1] = op1;
+ v[2] = op2;
+ v[3] = op3;
+ v[4] = op4;
+ _resetFrom(5);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4, const Op& op5) noexcept {
+ _size = 6;
+ v[0] = op0;
+ v[1] = op1;
+ v[2] = op2;
+ v[3] = op3;
+ v[4] = op4;
+ v[5] = op5;
+ _resetFrom(6);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4, const Op& op5, const Op& op6) noexcept {
+ _size = 7;
+ v[0] = op0;
+ v[1] = op1;
+ v[2] = op2;
+ v[3] = op3;
+ v[4] = op4;
+ v[5] = op5;
+ v[6] = op6;
+ _resetFrom(7);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Op& op0, const Op& op1, const Op& op2, const Op& op3, const Op& op4, const Op& op5, const Op& op6, const Op& op7) noexcept {
+ _size = 7;
+ v[0] = op0;
+ v[1] = op1;
+ v[2] = op2;
+ v[3] = op3;
+ v[4] = op4;
+ v[5] = op5;
+ v[6] = op6;
+ v[7] = op7;
+ }
+
+ //! Tests whether the vector is empty (has no elements).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_empty() const noexcept { return _size == 0u; }
+
+ //! Tests whether the vector has only one element, which makes it scalar.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_scalar() const noexcept { return _size == 1u; }
+
+ //! Tests whether the vector has more than 1 element, which means that calling `high()` and `odd()` won't return
+ //! an empty vector.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vector() const noexcept { return _size > 1u; }
+
+ //! Returns the number of vector elements.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
+
+ //! Returns the maximum size of vector elements.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG size_t max_size() const noexcept { return kMaxSize; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE bool equals(const OpArray& other) const noexcept {
+ size_t count = size();
+
+ if (count != other.size()) {
+ return false;
+ }
+
+ for (size_t i = 0; i < count; i++) {
+ if (v[i] != other.v[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator==(const OpArray& other) const noexcept { return equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool operator!=(const OpArray& other) const noexcept { return !equals(other); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE Operand_& operator[](size_t index) noexcept {
+ ASMJIT_ASSERT(index < _size);
+ return v[index];
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE const Operand_& operator[](size_t index) const noexcept {
+ ASMJIT_ASSERT(index < _size);
+ return v[index];
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray lo() const noexcept { return OpArray(*this, 0u, 1u, (_size + 1u) / 2u); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray hi() const noexcept { return OpArray(*this, _size > 1u ? (_size + 1u) / 2u : size_t(0u), 1u, _size); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray even() const noexcept { return OpArray(*this, 0u, 2u, _size); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray odd() const noexcept { return OpArray(*this, _size > 1u, 2u, _size); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray half() const noexcept { return OpArray(*this, 0u, 1u, (_size + 1u) / 2u); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray every_nth(size_t n) const noexcept { return OpArray(*this, 0u, n, _size); }
+
+ //! Returns a new vector consisting of either even (from == 0) or odd (from == 1) elements. It's like
+ //! calling `even()` and `odd()`, but can be used within a loop that performs the same operation for both.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG OpArray even_odd(size_t from) const noexcept { return OpArray(*this, _size > 1u ? from : size_t(0), 2u, _size); }
+};
+
+//! Vector operand array.
+//!
+//! Used to model SIMD code generation where the code generator can use up to \ref OpArray::kMaxSize registers per
+//! `VecArray`. The advantage of `VecArray` is that it allows to parametrize the ideal number of registers at runtime
+//! and to use a single code-path to generate advanced SIMD code.
+//!
+//! In addition, \ref UniCompiler fully understands `VecArray` so it can be passed instead of a regular operand when
+//! emitting code, which greatly simplifies designing high-performance SIMD code.
+//!
+//! \note VecArray is like \ref OpArray, just the whole API works with \ref Vec instead of \ref Operand_.
+class VecArray : public OpArray {
+public:
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG VecArray() noexcept
+ : OpArray() {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const VecArray& other) noexcept
+ : OpArray(other) {}
+
+ ASMJIT_INLINE_NODEBUG explicit VecArray(const Vec& op0) noexcept
+ : OpArray(op0) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1) noexcept
+ : OpArray(op0, op1) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1, const Vec& op2) noexcept
+ : OpArray(op0, op1, op2) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3) noexcept
+ : OpArray(op0, op1, op2, op3) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4) noexcept
+ : OpArray(op0, op1, op2, op3, op4) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4, const Vec& op5) noexcept
+ : OpArray(op0, op1, op2, op3, op4, op5) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4, const Vec& op5, const Vec& op6) noexcept
+ : OpArray(op0, op1, op2, op3, op4, op5, op6) {}
+
+ ASMJIT_INLINE_NODEBUG VecArray(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4, const Vec& op5, const Vec& op6, const Vec& op7) noexcept
+ : OpArray(op0, op1, op2, op3, op4, op5, op6, op7) {}
+
+protected:
+ ASMJIT_INLINE_NODEBUG VecArray(const VecArray& other, size_t from, size_t inc, size_t limit) noexcept
+ : OpArray(other, from, inc, limit) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+public:
+ ASMJIT_INLINE_NODEBUG VecArray& operator=(const VecArray& other) noexcept {
+ init(other);
+ return *this;
+ }
+
+ ASMJIT_INLINE Vec& operator[](size_t index) noexcept {
+ ASMJIT_ASSERT(index < _size);
+ return static_cast<Vec&>(v[index]);
+ }
+
+ ASMJIT_INLINE const Vec& operator[](size_t index) const noexcept {
+ ASMJIT_ASSERT(index < _size);
+ return static_cast<const Vec&>(v[index]);
+ }
+
+ //! \}
+
+public:
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0) noexcept {
+ OpArray::init(op0);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1) noexcept {
+ OpArray::init(op0, op1);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1, const Vec& op2) noexcept {
+ OpArray::init(op0, op1, op2);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3) noexcept {
+ OpArray::init(op0, op1, op2, op3);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4) noexcept {
+ OpArray::init(op0, op1, op2, op3, op4);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4, const Vec& op5) noexcept {
+ OpArray::init(op0, op1, op2, op3, op4, op5);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4, const Vec& op5, const Vec& op6) noexcept {
+ OpArray::init(op0, op1, op2, op3, op4, op5, op6);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec& op0, const Vec& op1, const Vec& op2, const Vec& op3, const Vec& op4, const Vec& op5, const Vec& op6, const Vec& op7) noexcept {
+ OpArray::init(op0, op1, op2, op3, op4, op5, op6, op7);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const Vec* array, size_t size) noexcept {
+ OpArray::init(array, size);
+ }
+
+ ASMJIT_INLINE_NODEBUG void init(const VecArray& other) noexcept {
+ OpArray::init(other);
+ }
+
+ ASMJIT_INLINE Vec& at_unrestricted(size_t index) noexcept {
+ ASMJIT_ASSERT(index < kMaxSize);
+ return static_cast<Vec&>(v[index]);
+ }
+
+ ASMJIT_INLINE const Vec& at_unrestricted(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < kMaxSize);
+ return static_cast<const Vec&>(v[index]);
+ }
+
+ ASMJIT_INLINE void reassign(size_t index, const Vec& new_vec) noexcept {
+ ASMJIT_ASSERT(index < kMaxSize);
+ v[index] = new_vec;
+ }
+
+ ASMJIT_INLINE_NODEBUG VecArray lo() const noexcept { return VecArray(*this, 0, 1, (_size + 1) / 2); }
+ ASMJIT_INLINE_NODEBUG VecArray hi() const noexcept { return VecArray(*this, _size > 1 ? (_size + 1) / 2 : 0, 1, _size); }
+ ASMJIT_INLINE_NODEBUG VecArray even() const noexcept { return VecArray(*this, 0, 2, _size); }
+ ASMJIT_INLINE_NODEBUG VecArray odd() const noexcept { return VecArray(*this, _size > 1, 2, _size); }
+ ASMJIT_INLINE_NODEBUG VecArray even_odd(size_t from) const noexcept { return VecArray(*this, _size > 1 ? from : 0, 2, _size); }
+ ASMJIT_INLINE_NODEBUG VecArray half() const noexcept { return VecArray(*this, 0, 1, (_size + 1) / 2); }
+ ASMJIT_INLINE_NODEBUG VecArray every_nth(size_t n) const noexcept { return VecArray(*this, 0, n, _size); }
+
+ ASMJIT_INLINE_NODEBUG void truncate(size_t new_size) noexcept {
+ _size = Support::min(_size, new_size);
+ }
+
+ ASMJIT_INLINE VecArray clone_as(OperandSignature signature) const noexcept {
+ VecArray out(*this);
+ for (size_t i = 0; i < out.size(); i++) {
+ out.v[i].set_signature(signature);
+ }
+ return out;
+ }
+
+ ASMJIT_INLINE_NODEBUG VecWidth vec_width() const noexcept { return VecWidthUtils::vec_width_of(v[0].as<Vec>()); }
+
+ ASMJIT_INLINE_NODEBUG void set_vec_width(VecWidth vw) noexcept {
+ OperandSignature signature = VecWidthUtils::signature_of(vw);
+ for (size_t i = 0; i < size(); i++) {
+ v[i].set_signature(signature);
+ }
+ }
+
+ ASMJIT_INLINE_NODEBUG VecArray clone_as(VecWidth vw) const noexcept { return clone_as(VecWidthUtils::signature_of(vw)); }
+ ASMJIT_INLINE_NODEBUG VecArray clone_as(const Reg& reg) const noexcept { return clone_as(reg.signature()); }
+
+ ASMJIT_INLINE_NODEBUG bool is_vec128() const noexcept { return v[0].is_vec128(); }
+ ASMJIT_INLINE_NODEBUG bool is_vec256() const noexcept { return v[0].is_vec256(); }
+ ASMJIT_INLINE_NODEBUG bool is_vec512() const noexcept { return v[0].is_vec512(); }
+
+#if defined(ASMJIT_UJIT_X86)
+ ASMJIT_INLINE_NODEBUG VecArray xmm() const noexcept { return clone_as(OperandSignature{RegTraits<RegType::kVec128>::kSignature}); }
+ ASMJIT_INLINE_NODEBUG VecArray ymm() const noexcept { return clone_as(OperandSignature{RegTraits<RegType::kVec256>::kSignature}); }
+ ASMJIT_INLINE_NODEBUG VecArray zmm() const noexcept { return clone_as(OperandSignature{RegTraits<RegType::kVec512>::kSignature}); }
+#endif
+
+ // Iterator compatibility.
+ ASMJIT_INLINE_NODEBUG Vec* begin() noexcept { return reinterpret_cast<Vec*>(v); }
+ ASMJIT_INLINE_NODEBUG Vec* end() noexcept { return reinterpret_cast<Vec*>(v) + _size; }
+
+ ASMJIT_INLINE_NODEBUG const Vec* begin() const noexcept { return reinterpret_cast<const Vec*>(v); }
+ ASMJIT_INLINE_NODEBUG const Vec* end() const noexcept { return reinterpret_cast<const Vec*>(v) + _size; }
+
+ ASMJIT_INLINE_NODEBUG const Vec* cbegin() const noexcept { return reinterpret_cast<const Vec*>(v); }
+ ASMJIT_INLINE_NODEBUG const Vec* cend() const noexcept { return reinterpret_cast<const Vec*>(v) + _size; }
+};
+
+//! JIT Utilities used by UniCompiler and other parts of the library.
+namespace OpUtils {
+
+template<typename T>
+static ASMJIT_INLINE void reset_var_array(T* array, size_t size) noexcept {
+ for (size_t i = 0; i < size; i++)
+ array[i].reset();
+}
+
+template<typename T>
+static ASMJIT_INLINE void reset_var_struct(T* data, size_t size = sizeof(T)) noexcept {
+ reset_var_array(reinterpret_cast<Reg*>(data), size / sizeof(Reg));
+}
+
+static ASMJIT_INLINE_NODEBUG const Operand_& first_op(const Operand_& operand) noexcept { return operand; }
+static ASMJIT_INLINE_NODEBUG const Operand_& first_op(const OpArray& op_array) noexcept { return op_array[0]; }
+
+static ASMJIT_INLINE_NODEBUG size_t count_op(const Operand_&) noexcept { return 1u; }
+static ASMJIT_INLINE_NODEBUG size_t count_op(const OpArray& op_array) noexcept { return op_array.size(); }
+
+} // {OpUtils}
+
+// Swizzle & Permutations
+// ----------------------
+
+struct Swizzle2 {
+ uint32_t value;
+
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const Swizzle2& other) const noexcept { return value == other.value; }
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const Swizzle2& other) const noexcept { return value != other.value; }
+};
+
+struct Swizzle4 {
+ uint32_t value;
+
+ ASMJIT_INLINE_CONSTEXPR bool operator==(const Swizzle4& other) const noexcept { return value == other.value; }
+ ASMJIT_INLINE_CONSTEXPR bool operator!=(const Swizzle4& other) const noexcept { return value != other.value; }
+};
+
+//! Constructs a backend-independent 2-element vector swizzle parameter.
+static ASMJIT_INLINE_CONSTEXPR Swizzle2 swizzle(uint8_t b, uint8_t a) noexcept {
+ return Swizzle2{(uint32_t(b) << 8) | a};
+}
+
+//! Constructs a backend-independent 4-element vector swizzle parameter.
+static ASMJIT_INLINE_CONSTEXPR Swizzle4 swizzle(uint8_t d, uint8_t c, uint8_t b, uint8_t a) noexcept {
+ return Swizzle4{(uint32_t(d) << 24) | (uint32_t(c) << 16) | (uint32_t(b) << 8) | a};
+}
+
+enum class Perm2x128 : uint32_t {
+ kALo = 0,
+ kAHi = 1,
+ kBLo = 2,
+ kBHi = 3,
+ kZero = 8
+};
+
+//! Constructs a backend-independent permutation of 128-bit lanes.
+//!
+//! \note This is currently only used by AVX2 and AVX-512 backends.
+static ASMJIT_INLINE_CONSTEXPR uint8_t perm_2x128_imm(Perm2x128 hi, Perm2x128 lo) noexcept {
+ return uint8_t((uint32_t(hi) << 4) | (uint32_t(lo)));
+}
+
+// Injecting
+// ---------
+
+//! Provides scope-based code injection.
+//!
+//! Scope-based code injection is used in some places to inject code at a specific point in the generated code.
+//! When a pipeline is initialized each part can remember certain place where it could inject code in the future
+//! as at the initialization phase it still doesn't know whether everything required to generate the code in place.
+class ScopedInjector {
+ ASMJIT_NONCOPYABLE(ScopedInjector)
+
+public:
+ //! \name Members
+ //! \{
+
+ BaseCompiler* _cc {};
+ BaseNode** _hook {};
+ BaseNode* _prev {};
+ bool _hook_was_cursor = false;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE ScopedInjector(BaseCompiler* cc, BaseNode** hook) noexcept
+ : _cc(cc),
+ _hook(hook),
+ _prev(cc->set_cursor(*hook)),
+ _hook_was_cursor(*hook == _prev) {}
+
+ ASMJIT_INLINE ~ScopedInjector() noexcept {
+ *_hook = _cc->cursor();
+ if (!_hook_was_cursor) {
+ _cc->set_cursor(_prev);
+ }
+ }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
+#endif // ASMJIT_UJIT_JITBASE_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit/unicompiler.h b/3rdparty/asmjit/asmjit/ujit/unicompiler.h
new file mode 100644
index 00000000000..651e2ac5d89
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/unicompiler.h
@@ -0,0 +1,2097 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_UNICOMPILER_H_INCLUDED
+#define ASMJIT_UJIT_UNICOMPILER_H_INCLUDED
+
+#include <asmjit/ujit/ujitbase.h>
+#include <asmjit/ujit/uniop.h>
+#include <asmjit/ujit/vecconsttable.h>
+
+#if !defined(ASMJIT_NO_UJIT)
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+//! \addtogroup asmjit_ujit
+//! \{
+
+class UniCondition;
+
+//! Universal compiler.
+class UniCompiler {
+public:
+ ASMJIT_NONCOPYABLE(UniCompiler)
+
+ enum : uint32_t { kMaxKRegConstCount = 4 };
+
+ //! \name Constants
+ //! \{
+
+ enum class StackId : uint32_t {
+ kIndex,
+ kCustom,
+ kMaxValue = kCustom
+ };
+
+#if defined(ASMJIT_UJIT_X86)
+ enum class GPExt : uint8_t {
+ kADX,
+ kBMI,
+ kBMI2,
+ kLZCNT,
+ kMOVBE,
+ kPOPCNT,
+
+ kIntrin = 31
+ };
+
+ enum class SSEExt : uint8_t {
+ kSSE2 = 0,
+ kSSE3,
+ kSSSE3,
+ kSSE4_1,
+ kSSE4_2,
+ kPCLMULQDQ,
+
+ //! Just to distinguish between a baseline instruction and intrinsic at operation info level.
+ kIntrin = 7
+ };
+
+ enum class AVXExt : uint8_t {
+ kAVX = 0,
+ kAVX2,
+ kF16C,
+ kFMA,
+ kGFNI,
+ kVAES,
+ kVPCLMULQDQ,
+ kAVX_IFMA,
+ kAVX_NE_CONVERT,
+ kAVX_VNNI,
+ kAVX_VNNI_INT8,
+ kAVX_VNNI_INT16,
+ kAVX512,
+ kAVX512_BF16,
+ kAVX512_BITALG,
+ kAVX512_FP16,
+ kAVX512_IFMA,
+ kAVX512_VBMI,
+ kAVX512_VBMI2,
+ kAVX512_VNNI,
+ kAVX512_VPOPCNTDQ,
+
+ //! Just to distinguish between a baseline instruction and intrinsic at operation info level.
+ kIntrin = 63
+ };
+#endif // ASMJIT_UJIT_X86
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ enum class GPExt : uint8_t {
+ kCSSC,
+ kFLAGM,
+ kFLAGM2,
+ kLS64,
+ kLS64_V,
+ kLSE,
+ kLSE128,
+ kLSE2,
+
+ kIntrin = 31
+ };
+
+ enum class ASIMDExt : uint8_t {
+ kASIMD,
+ kBF16,
+ kDOTPROD,
+ kFCMA,
+ kFHM,
+ kFP16,
+ kFP16CONV,
+ kFP8,
+ kFRINTTS,
+ kI8MM,
+ kJSCVT,
+ kPMULL,
+ kRDM,
+ kSHA1,
+ kSHA256,
+ kSHA3,
+ kSHA512,
+ kSM3,
+ kSM4,
+
+ kIntrin = 63
+ };
+
+#endif // ASMJIT_UJIT_AARCH64
+
+ //! \}
+
+ //! \name Members
+ //! \{
+
+ //! AsmJit compiler.
+ BackendCompiler* cc = nullptr;
+
+ //! Reference to a table that provides global constants.
+ //!
+ //! \note This table can be extended by users so it fits a particular use-case, see \ref UniCompiler constructor.
+ VecConstTableRef _ct_ref;
+
+#if defined(ASMJIT_UJIT_X86)
+ //! General purpose extension mask (X86 and X86_64 only).
+ uint32_t _gp_ext_mask {};
+ //! SSE extension mask (X86 and X86_64 only).
+ uint32_t _sse_ext_mask {};
+ //! AVX extension mask (X86 and X86_64 only).
+ uint64_t _avx_ext_mask {};
+#endif // ASMJIT_UJIT_X86
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ //! General purpose extension mask (AArch64).
+ uint64_t _gp_ext_mask {};
+ //! NEON extensions (AArch64).
+ uint64_t _asimd_ext_mask {};
+#endif // ASMJIT_UJIT_AARCH64
+
+ //! The behavior of scalar operations (mostly floating point).
+ ScalarOpBehavior _scalar_op_behavior {};
+ //! The behavior of floating point min/max operation.
+ FMinFMaxOpBehavior _fmin_fmax_op_behavior {};
+ //! The behavior of floating point `madd` operation.
+ FMAddOpBehavior _fmadd_op_behavior {};
+ //! The behavior of a float-to-int conversion when the float is out of integer range, infinite, or NaN.
+ FloatToIntOutsideRangeBehavior _float_to_int_outside_range_behavior {};
+
+ //! Target CPU features.
+ CpuFeatures _features {};
+ //! Optimization flags.
+ CpuHints _cpu_hints {};
+
+ //! Number of available vector registers.
+ uint32_t _vec_reg_count = 0;
+
+ //! SIMD width.
+ VecWidth _vec_width = VecWidth::k128;
+ //! SIMD multiplier, derived from `_vec_width` (1, 2, 4).
+ uint8_t _vec_multiplier = 0;
+ //! SIMD register type (AsmJit).
+ RegType _vec_reg_type = RegType::kNone;
+ //! SIMD type id (AsmJit).
+ TypeId _vec_type_id = TypeId::kVoid;
+
+ //! Function initialization hook.
+ BaseNode* _func_init_hook = nullptr;
+
+ //! Invalid GP register.
+ Gp _gp_none;
+ //! Temporary stack used to transfer SIMD regs to GP.
+ Mem _tmp_stack[size_t(StackId::kMaxValue) + 1];
+
+ //! Offset to the first constant to the `commonTable` global.
+ int32_t _common_table_offset = 0;
+ //! Pointer to the `commonTable` constant pool (only used in 64-bit mode).
+ Gp _common_table_ptr;
+
+#if defined(ASMJIT_UJIT_X86)
+ x86::KReg _k_reg[kMaxKRegConstCount];
+ uint64_t _k_imm[kMaxKRegConstCount] {};
+#endif // ASMJIT_UJIT_X86
+
+ struct VecConstData {
+ const void* ptr;
+ uint32_t virt_reg_id;
+ };
+
+ struct VecConstDataEx {
+ uint8_t data[16];
+ uint32_t virt_reg_id;
+ };
+
+ ArenaVector<VecConstData> _vec_consts;
+ ArenaVector<VecConstDataEx> _vec_consts_ex;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates `UniCompiler` that would use the existing BackendCompiler (it would keep the pointer to it).
+ ASMJIT_API UniCompiler(BackendCompiler* cc, const CpuFeatures& features, CpuHints cpu_hints, VecConstTableRef ct_ref) noexcept;
+
+ //! Creates `UniCompiler` that would use the existing BackendCompiler (it would keep the pointer to it).
+ ASMJIT_INLINE UniCompiler(BackendCompiler* cc, const CpuFeatures& features, CpuHints cpu_hints) noexcept
+ : UniCompiler(cc, features, cpu_hints, VecConstTableRef{vec_const_table, sizeof(VecConstTable)}) {}
+
+ //! Destroys `UniCompiler` - the existing BackendCompiler would be untouched.
+ ASMJIT_API ~UniCompiler() noexcept;
+
+ //! \}
+
+ //! \name Allocators
+ //! \{
+
+ //! Returns the arena used by `UniCompiler`.
+ ASMJIT_INLINE_NODEBUG Arena& arena() noexcept { return cc->_builder_arena; }
+
+ //! \}
+
+ //! \name Constant Table
+ //! \{
+
+ template<typename T = VecConstTable>
+ ASMJIT_INLINE_NODEBUG const T& ct() const noexcept { return static_cast<const T&>(_ct_ref.table); }
+
+ template<typename T = VecConstTable>
+ ASMJIT_INLINE_NODEBUG const T* ct_ptr() const noexcept { return static_cast<const T*>(&_ct_ref.table); }
+
+ ASMJIT_INLINE_NODEBUG size_t ct_size() const noexcept { return _ct_ref.size; }
+
+ //! \}
+
+ //! \name CPU Architecture, Features and Optimization Options
+ //! \{
+
+ ASMJIT_API void _init_extensions(const CpuFeatures& features) noexcept;
+
+ ASMJIT_INLINE_NODEBUG bool is_32bit() const noexcept { return cc->is_32bit(); }
+ ASMJIT_INLINE_NODEBUG bool is_64bit() const noexcept { return cc->is_64bit(); }
+ ASMJIT_INLINE_NODEBUG uint32_t register_size() const noexcept { return cc->register_size(); }
+
+#if defined(ASMJIT_UJIT_X86)
+ //! Tests whether a general purpose extension `ext` is available.
+ ASMJIT_INLINE_NODEBUG bool has_gp_ext(GPExt ext) const noexcept { return (_gp_ext_mask & (1u << uint32_t(ext))) != 0; }
+ //! Tests whether an SSE extension `ext` is available.
+ ASMJIT_INLINE_NODEBUG bool has_sse_ext(SSEExt ext) const noexcept { return (_sse_ext_mask & (1u << uint32_t(ext))) != 0; }
+ //! Tests whether an AVX or AVX-512 extension `ext` is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx_ext(AVXExt ext) const noexcept { return (_avx_ext_mask & (uint64_t(1) << uint32_t(ext))) != 0; }
+
+ //! Tests whether ADX extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_adx() const noexcept { return has_gp_ext(GPExt::kADX); }
+ //! Tests whether BMI extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_bmi() const noexcept { return has_gp_ext(GPExt::kBMI); }
+ //! Tests whether BMI2 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_bmi2() const noexcept { return has_gp_ext(GPExt::kBMI2); }
+ //! Tests whether LZCNT extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_lzcnt() const noexcept { return has_gp_ext(GPExt::kLZCNT); }
+ //! Tests whether MOVBE extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_movbe() const noexcept { return has_gp_ext(GPExt::kMOVBE); }
+ //! Tests whether POPCNT extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_popcnt() const noexcept { return has_gp_ext(GPExt::kPOPCNT); }
+
+ //! Tests whether SSE2 extensions are available (this should always return true).
+ ASMJIT_INLINE_NODEBUG bool has_sse2() const noexcept { return has_sse_ext(SSEExt::kSSE2); }
+ //! Tests whether SSE3 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sse3() const noexcept { return has_sse_ext(SSEExt::kSSE3); }
+ //! Tests whether SSSE3 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_ssse3() const noexcept { return has_sse_ext(SSEExt::kSSSE3); }
+ //! Tests whether SSE4.1 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sse4_1() const noexcept { return has_sse_ext(SSEExt::kSSE4_1); }
+ //! Tests whether SSE4.2 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sse4_2() const noexcept { return has_sse_ext(SSEExt::kSSE4_2); }
+ //! Tests whether PCLMULQDQ extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_pclmulqdq() const noexcept { return has_sse_ext(SSEExt::kPCLMULQDQ); }
+
+ //! Tests whether AVX extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx() const noexcept { return has_avx_ext(AVXExt::kAVX); }
+ //! Tests whether AVX2 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx2() const noexcept { return has_avx_ext(AVXExt::kAVX2); }
+ //! Tests whether F16C extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_f16c() const noexcept { return has_avx_ext(AVXExt::kF16C); }
+ //! Tests whether FMA extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_fma() const noexcept { return has_avx_ext(AVXExt::kFMA); }
+ //! Tests whether GFNI extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_gfni() const noexcept { return has_avx_ext(AVXExt::kGFNI); }
+ //! Tests whether VPCLMULQDQ extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_vpclmulqdq() const noexcept { return has_avx_ext(AVXExt::kVPCLMULQDQ); }
+
+ //! Tests whether AVX_IFMA extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx_ifma() const noexcept { return has_avx_ext(AVXExt::kAVX_IFMA); }
+ //! Tests whether AVX_NE_CONVERT extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx_ne_convert() const noexcept { return has_avx_ext(AVXExt::kAVX_NE_CONVERT); }
+ //! Tests whether AVX_VNNI extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx_vnni() const noexcept { return has_avx_ext(AVXExt::kAVX_VNNI); }
+ //! Tests whether AVX_VNNI_INT8 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx_vnni_int8() const noexcept { return has_avx_ext(AVXExt::kAVX_VNNI_INT8); }
+ //! Tests whether AVX_VNNI_INT16 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx_vnni_int16() const noexcept { return has_avx_ext(AVXExt::kAVX_VNNI_INT16); }
+
+ //! Tests whether a baseline AVX-512 extensions are available (F, CD, BW, DQ, and VL).
+ ASMJIT_INLINE_NODEBUG bool has_avx512() const noexcept { return has_avx_ext(AVXExt::kAVX512); }
+ //! Tests whether AVX512_BF16 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bf16() const noexcept { return has_avx_ext(AVXExt::kAVX512_BF16); }
+ //! Tests whether AVX512_BITALT extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bitalg() const noexcept { return has_avx_ext(AVXExt::kAVX512_BITALG); }
+ //! Tests whether AVX512_FP16 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_fp16() const noexcept { return has_avx_ext(AVXExt::kAVX512_FP16); }
+ //! Tests whether AVX512_IFMA extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_ifma() const noexcept { return has_avx_ext(AVXExt::kAVX512_IFMA); }
+ //! Tests whether AVX512_VBMI extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_vbmi() const noexcept { return has_avx_ext(AVXExt::kAVX512_VBMI); }
+ //! Tests whether AVX512_VBMI2 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_vbmi2() const noexcept { return has_avx_ext(AVXExt::kAVX512_VBMI2); }
+ //! Tests whether AVX512_VNNI extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_vnni() const noexcept { return has_avx_ext(AVXExt::kAVX512_VNNI); }
+ //! Tests whether AVX512_VPOPCNTDQ extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_avx512_vpopcntdq() const noexcept { return has_avx_ext(AVXExt::kAVX512_VPOPCNTDQ); }
+
+ //! Tests whether the target SIMD ISA provides instructions with non-destructive source operand (AVX+).
+ ASMJIT_INLINE_NODEBUG bool has_non_destructive_src() const noexcept { return has_avx(); }
+
+#endif // ASMJIT_UJIT_X86
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ //! Tests whether a general purpose extension `ext` is available.
+ ASMJIT_INLINE_NODEBUG bool has_gp_ext(GPExt ext) const noexcept { return (_gp_ext_mask & (uint64_t(1) << uint32_t(ext))) != 0; }
+ //! Tests whether an ASIMD extension `ext` is available.
+ ASMJIT_INLINE_NODEBUG bool has_asimd_ext(ASIMDExt ext) const noexcept { return (_asimd_ext_mask & (uint64_t(1) << uint32_t(ext))) != 0; }
+
+ //! Tests whether CSSC extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_cssc() const noexcept { return has_gp_ext(GPExt::kCSSC); }
+ //! Tests whether FLAGM extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_flagm() const noexcept { return has_gp_ext(GPExt::kFLAGM); }
+ //! Tests whether FLAGM2 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_flagm2() const noexcept { return has_gp_ext(GPExt::kFLAGM2); }
+ //! Tests whether LS64 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_ls64() const noexcept { return has_gp_ext(GPExt::kLS64); }
+ //! Tests whether LS64_V extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_ls64_v() const noexcept { return has_gp_ext(GPExt::kLS64_V); }
+ //! Tests whether LSE extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_lse() const noexcept { return has_gp_ext(GPExt::kLSE); }
+ //! Tests whether LSE128 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_lse128() const noexcept { return has_gp_ext(GPExt::kLSE128); }
+ //! Tests whether LSE2 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_lse2() const noexcept { return has_gp_ext(GPExt::kLSE2); }
+
+ //! Tests whether ASIMD extension is available (must always return true).
+ ASMJIT_INLINE_NODEBUG bool has_asimd() const noexcept { return has_asimd_ext(ASIMDExt::kASIMD); }
+ //! Tests whether BF16 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_bf16() const noexcept { return has_asimd_ext(ASIMDExt::kBF16); }
+ //! Tests whether DOTPROD extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_dotprod() const noexcept { return has_asimd_ext(ASIMDExt::kDOTPROD); }
+ //! Tests whether FCMA extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_fcma() const noexcept { return has_asimd_ext(ASIMDExt::kFCMA); }
+ //! Tests whether FHM extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_fhm() const noexcept { return has_asimd_ext(ASIMDExt::kFHM); }
+ //! Tests whether FP16 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_fp16() const noexcept { return has_asimd_ext(ASIMDExt::kFP16); }
+ //! Tests whether FP16CONV extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_fp16conv() const noexcept { return has_asimd_ext(ASIMDExt::kFP16CONV); }
+ //! Tests whether FP8 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_fp8() const noexcept { return has_asimd_ext(ASIMDExt::kFP8); }
+ //! Tests whether FRINTTS extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_frintts() const noexcept { return has_asimd_ext(ASIMDExt::kFRINTTS); }
+ //! Tests whether I8MM extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_i8mm() const noexcept { return has_asimd_ext(ASIMDExt::kI8MM); }
+ //! Tests whether JSCVT extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_jscvt() const noexcept { return has_asimd_ext(ASIMDExt::kJSCVT); }
+ //! Tests whether PMULL extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_pmull() const noexcept { return has_asimd_ext(ASIMDExt::kPMULL); }
+ //! Tests whether RDM extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_rdm() const noexcept { return has_asimd_ext(ASIMDExt::kRDM); }
+ //! Tests whether SHA1 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sha1() const noexcept { return has_asimd_ext(ASIMDExt::kSHA1); }
+ //! Tests whether SHA256 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sha256() const noexcept { return has_asimd_ext(ASIMDExt::kSHA256); }
+ //! Tests whether SHA3 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sha3() const noexcept { return has_asimd_ext(ASIMDExt::kSHA3); }
+ //! Tests whether SHA512 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sha512() const noexcept { return has_asimd_ext(ASIMDExt::kSHA512); }
+ //! Tests whether SM3 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sm3() const noexcept { return has_asimd_ext(ASIMDExt::kSM3); }
+ //! Tests whether SM4 extension is available.
+ ASMJIT_INLINE_NODEBUG bool has_sm4() const noexcept { return has_asimd_ext(ASIMDExt::kSM4); }
+
+ //! Tests whether the target SIMD ISA provides instructions with non-destructive destination (always on AArch64).
+ ASMJIT_INLINE_NODEBUG bool has_non_destructive_src() const noexcept { return true; }
+
+#endif // ASMJIT_UJIT_AARCH64
+
+ //! Returns the behavior of scalar operations (mostly floating point).
+ ASMJIT_INLINE_NODEBUG ScalarOpBehavior scalar_op_behavior() const noexcept { return _scalar_op_behavior; }
+ //! Returns the behavior of floating point min/max operations.
+ ASMJIT_INLINE_NODEBUG FMinFMaxOpBehavior fmin_fmax_op_behavior() const noexcept { return _fmin_fmax_op_behavior; }
+ //! Returns the behavior of floating point mul+add (`madd`) operations.
+ ASMJIT_INLINE_NODEBUG FMAddOpBehavior fmadd_op_behavior() const noexcept { return _fmadd_op_behavior; }
+ //! Returns the behavior of float-to-integer conversion when the floating point is outside of the integer representable
+ //! range, infinite, or NaN.
+ ASMJIT_INLINE_NODEBUG FloatToIntOutsideRangeBehavior float_to_int_outside_range_behavior() const noexcept { return _float_to_int_outside_range_behavior; }
+
+ //! Tests whether a scalar operation is zeroing the rest of the destination register (AArch64).
+ ASMJIT_INLINE_NODEBUG bool is_scalar_op_zeroing() const noexcept { return _scalar_op_behavior == ScalarOpBehavior::kZeroing; }
+ //! Tests whether a scalar operation is preserving the low 128-bit part of the destination register (X86|X86_64).
+ ASMJIT_INLINE_NODEBUG bool is_scalar_op_preserving_vec128() const noexcept { return _scalar_op_behavior == ScalarOpBehavior::kPreservingVec128; }
+
+ //! Tests whether a floating point min/max operation selects a finite value if one of the values is NaN (AArch64).
+ ASMJIT_INLINE_NODEBUG bool is_fmin_fmax_finite() const noexcept { return _fmin_fmax_op_behavior == FMinFMaxOpBehavior::kFiniteValue; }
+ //! Tests whether a floating point min/max operation works as a ternary if - `if a <|> b ? a : b` (X86|X86_64).
+ ASMJIT_INLINE_NODEBUG bool is_fmin_fmax_ternary() const noexcept { return _fmin_fmax_op_behavior == FMinFMaxOpBehavior::kTernaryLogic; }
+
+ //! Tests whether a floating point mul+add operation is fused (uses FMA).
+ ASMJIT_INLINE_NODEBUG bool is_fmadd_fused() const noexcept { return _fmadd_op_behavior != FMAddOpBehavior::kNoFMA; }
+ //! Tests whether a FMA operation is available and that it can store the result to any register (true of X86).
+ ASMJIT_INLINE_NODEBUG bool is_fma_storing_to_any_register() const noexcept { return _fmadd_op_behavior == FMAddOpBehavior::kFMAStoreToAny; }
+ //! Tests whether a FMA operation is available and that it only stores the result to accumulator register.
+ ASMJIT_INLINE_NODEBUG bool is_fma_storing_to_any_accumulator() const noexcept { return _fmadd_op_behavior == FMAddOpBehavior::kFMAStoreToAccumulator; }
+
+ //! Returns CPU hints.
+ ASMJIT_INLINE_NODEBUG CpuHints cpu_hints() const noexcept { return _cpu_hints; }
+ //! Tests whether a CPU hint `hint` is enabled.
+ ASMJIT_INLINE_NODEBUG bool has_cpu_hint(CpuHints hint) const noexcept { return Support::test(_cpu_hints, hint); }
+
+ //! Returns a native register signature, either 32-bit or 64-bit depending on the target architecture).
+ ASMJIT_INLINE_NODEBUG OperandSignature gp_signature() const noexcept { return cc->gp_signature(); }
+ //! Clones the given `reg` register into a native register (either 32-bit or 64-bit depending on the target architecture).
+ ASMJIT_INLINE_NODEBUG Gp gpz(const Gp& reg) const noexcept { return cc->gpz(reg); }
+
+ ASMJIT_INLINE_NODEBUG uint32_t vec_reg_count() const noexcept { return _vec_reg_count; }
+
+ ASMJIT_API VecWidth max_vec_width_from_cpu_features() noexcept;
+ ASMJIT_API void init_vec_width(VecWidth vw) noexcept;
+
+ ASMJIT_API bool has_masked_access_of(uint32_t data_size) const noexcept;
+
+ //! \}
+
+ //! \name CPU SIMD Width and SIMD Width Utilities
+ //! \{
+
+ //! Returns the current SIMD width (in bytes) that this compiler and all its parts must use.
+ //!
+ //! \note The returned width is in bytes and it's calculated from the maximum supported widths of all pipeline parts.
+ //! This means that SIMD width returned could be actually lower than a SIMD width supported by the target CPU.
+ ASMJIT_INLINE_NODEBUG VecWidth vec_width() const noexcept { return _vec_width; }
+
+ //! Returns whether the compiler and all parts use 256-bit SIMD.
+ ASMJIT_INLINE_NODEBUG bool use_256bit_simd() const noexcept { return _vec_width >= VecWidth::k256; }
+ //! Returns whether the compiler and all parts use 512-bit SIMD.
+ ASMJIT_INLINE_NODEBUG bool use_512bit_simd() const noexcept { return _vec_width >= VecWidth::k512; }
+
+ //! Returns a constant that can be used to multiply a baseline SIMD width to get the value returned by `vec_width()`.
+ //!
+ //! \note A baseline SIMD width would be 16 bytes on most platforms.
+ ASMJIT_INLINE_NODEBUG uint32_t vec_multiplier() const noexcept { return _vec_multiplier; }
+
+ ASMJIT_INLINE_NODEBUG VecWidth vec_width_of(DataWidth data_width, uint32_t n) const noexcept { return VecWidthUtils::vec_width_of(vec_width(), data_width, n); }
+
+ //! \}
+
+ //! \name Labels
+ //! \{
+
+ //! Creates a new anonymous label.
+ //!
+ //! See \ref BaseEmitter::new_label() for more details.
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_label() {
+ return cc->new_label();
+ }
+
+ //! Creates a new named label.
+ //!
+ //! See \ref BaseEmitter::new_named_label() for more details.
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_named_label(const char* name, size_t name_size = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId) {
+ return cc->new_named_label(name, name_size, type, parent_id);
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_named_label(Span<const char> name, LabelType type = LabelType::kGlobal, uint32_t parent_id = Globals::kInvalidId) {
+ return cc->new_named_label(name, type, parent_id);
+ }
+
+ //! Creates a new anonymous label with a name, which can only be used for debugging purposes.
+ //!
+ //! See \ref BaseEmitter::new_anonymous_label() for more details.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label new_anonymous_label(const char* name, size_t name_size = SIZE_MAX) {
+ return cc->new_anonymous_label(name, name_size);
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_anonymous_label(Span<const char> name) {
+ return cc->new_anonymous_label(name);
+ }
+
+ //! Creates a new external label.
+ //!
+ //! See \ref BaseEmitter::new_external_label() for more details.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Label new_external_label(const char* name, size_t name_size = SIZE_MAX) {
+ return cc->new_external_label(name, name_size);
+ }
+
+ //! \overload
+ [[nodiscard]]
+ ASMJIT_INLINE Label new_external_label(Span<const char> name) {
+ return cc->new_external_label(name);
+ }
+
+ //! Binds the `label` to the current position of the current section.
+ //!
+ //! See \ref BaseEmitter::bind() for more details.
+ ASMJIT_INLINE Error bind(const Label& label) {
+ return cc->bind(label);
+ }
+
+ //! \}
+
+ //! \name Align
+ //! \{
+
+ //! Aligns the current position to the `alignment` specified.
+ //!
+ //! See \ref BaseEmitter::align() for more details.
+ ASMJIT_INLINE Error align(AlignMode align_mode, uint32_t alignment) {
+ return cc->align(align_mode, alignment);
+ }
+
+ //! \name Embed
+ //! \{
+
+ //! Embeds raw data into the instruction stream.
+ //!
+ //! See \ref BaseEmitter::embed() for more details.
+ ASMJIT_INLINE Error embed(const void* data, size_t data_size) {
+ return cc->embed(data, data_size);
+ }
+
+ //! Embeds a typed data array.
+ //!
+ //! See \ref BaseEmitter::embed_data_array() for more details.
+ ASMJIT_INLINE Error embed_data_array(TypeId type_id, const void* data, size_t item_count, size_t repeat_count = 1) {
+ return cc->embed_data_array(type_id, data, item_count, repeat_count);
+ }
+
+ //! Embeds int8_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_int8(int8_t value, size_t repeat_count = 1) { return cc->embed_int8(value, repeat_count); }
+ //! Embeds uint8_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_uint8(uint8_t value, size_t repeat_count = 1) { return cc->embed_uint8(value, repeat_count); }
+ //! Embeds int16_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_int16(int16_t value, size_t repeat_count = 1) { return cc->embed_int16(value, repeat_count); }
+ //! Embeds uint16_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_uint16(uint16_t value, size_t repeat_count = 1) { return cc->embed_uint16(value, repeat_count); }
+ //! Embeds int32_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_int32(int32_t value, size_t repeat_count = 1) { return cc->embed_int32(value, repeat_count); }
+ //! Embeds uint32_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_uint32(uint32_t value, size_t repeat_count = 1) { return cc->embed_uint32(value, repeat_count); }
+ //! Embeds int64_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_int64(int64_t value, size_t repeat_count = 1) { return cc->embed_int64(value, repeat_count); }
+ //! Embeds uint64_t `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_uint64(uint64_t value, size_t repeat_count = 1) { return cc->embed_uint64(value, repeat_count); }
+ //! Embeds a 32-bit floating point `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_float(float value, size_t repeat_count = 1) { return cc->embed_float(value, repeat_count); }
+ //! Embeds a 64-bit floating point `value` repeated by `repeat_count`.
+ ASMJIT_INLINE Error embed_double(double value, size_t repeat_count = 1) { return cc->embed_double(value, repeat_count); }
+
+ //! Embeds a constant pool at the current offset.
+ //!
+ //! See \ref BaseEmitter::embed_const_pool() for more details.
+ ASMJIT_INLINE Error embed_const_pool(const Label& label, const ConstPool& pool) {
+ return cc->embed_const_pool(label, pool);
+ }
+
+ //! Embeds an absolute `label` address as data.
+ //!
+ //! See \ref BaseEmitter::embed_label() for more details.
+ ASMJIT_INLINE Error embed_label(const Label& label, size_t data_size = 0) {
+ return cc->embed_label(label, data_size);
+ }
+
+ //! Embeds a delta (distance) between the `label` and `base` calculating it as `label - base`.
+ //!
+ //! See \ref BaseEmitter::embed_label_delta() for more details.
+ ASMJIT_INLINE Error embed_label_delta(const Label& label, const Label& base, size_t data_size = 0) {
+ return cc->embed_label_delta(label, base, data_size);
+ }
+
+ ASMJIT_API void embed_jump_table(Span<const Label> jump_table, const Label& jump_table_base, uint32_t entry_size);
+
+ //! \}
+
+ //! \name Comment
+ //! \{
+
+ //! Emits a comment stored in `data` with an optional `size` parameter.
+ ASMJIT_INLINE Error comment(const char* data, size_t size = SIZE_MAX) {
+ return cc->comment(data, size);
+ }
+
+ //! Emits a comment passed via a `data` span.
+ ASMJIT_INLINE Error comment(Span<const char> data) {
+ return cc->comment(data);
+ }
+
+ //! Emits a formatted comment specified by `fmt` and variable number of arguments.
+ template<typename... Args>
+ ASMJIT_INLINE Error commentf(const char* fmt, Args&&... args) {
+ return cc->commentf(fmt, std::forward<Args>(args)...);
+ }
+
+ //! Emits a formatted comment specified by `fmt` and `ap`.
+ ASMJIT_INLINE Error commentv(const char* fmt, va_list ap) {
+ return cc->commentv(fmt, ap);
+ }
+
+ //! \}
+
+ //! \name Function Management
+ //! \{
+
+ //! Returns the function being generated.
+ //!
+ //! This is just a convenience wrapper that calls \ref BaseCompiler::func().
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return cc->func(); }
+
+ //! Hooks a function that is being generated by \ref BaseCompiler.
+ //!
+ //! This function is called automatically by \ref add_func_node() and \ref add_func(). However, if \ref BaseCompiler
+ //! was called instead of \ref UniCompiler to add the function node to the instruction stream, then it has to be
+ //! hooked manually.
+ ASMJIT_API void hook_func() noexcept;
+
+ //! Unhooks a function.
+ //!
+ //! In general this mostly does a cleanup of \ref UniCompiler.
+ ASMJIT_API void unhook_func() noexcept;
+
+ //! Creates a new \ref FuncNode.
+ //!
+ //! This is just a convenience wrapper that calls \ref BaseCompiler::new_func_node().
+ ASMJIT_INLINE Error new_func_node(Out<FuncNode*> out, const FuncSignature& signature) {
+ return cc->new_func_node(out, signature);
+ }
+
+ //! Creates a new \ref FuncNode adds it to the instruction stream.
+ //!
+ //! This is just a convenience wrapper that calls \ref BaseCompiler::add_func_node().
+ ASMJIT_INLINE Error add_func_node(Out<FuncNode*> out, const FuncSignature& signature) {
+ Error err = cc->add_func_node(out, signature);
+ hook_func();
+ return err;
+ }
+
+ //! Creates a new \ref FuncNode with the given `signature`, adds it to the instruction stream by using
+ //! `add_func(FuncNode* func)` overload, and returns the node.
+ ASMJIT_INLINE FuncNode* add_func(const FuncSignature& signature) {
+ FuncNode* node;
+ add_func_node(Out(node), signature);
+ hook_func();
+ return node;
+ }
+
+ //! Adds a function `node` to the instruction stream.
+ ASMJIT_INLINE FuncNode* add_func(FuncNode* ASMJIT_NONNULL(func)) {
+ FuncNode* node = cc->add_func(func);
+ hook_func();
+ return node;
+ }
+
+ //! Creates a new \ref FuncRetNode.
+ //!
+ //! This is just a convenience wrapper that calls \ref BaseCompiler::new_func_ret_node().
+ ASMJIT_INLINE Error new_func_ret_node(Out<FuncRetNode*> out, const Operand_& o0, const Operand_& o1) {
+ return cc->new_func_ret_node(out, o0, o1);
+ }
+
+ //! Creates a new \ref FuncRetNode and adds it to the instruction stream.
+ //!
+ //! This is just a convenience wrapper that calls \ref BaseCompiler::add_func_ret_node().
+ ASMJIT_INLINE Error add_func_ret_node(Out<FuncRetNode*> out, const Operand_& o0, const Operand_& o1) {
+ return cc->add_func_ret_node(out, o0, o1);
+ }
+
+ //! Ends the current function by emitting a sentinel that marks the end of it.
+ ASMJIT_INLINE Error end_func() {
+ unhook_func();
+ return cc->end_func();
+ }
+
+ //! Return from function, a convenience function that calls \ref BaseCompiler::ret().
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE Error ret() { return cc->ret(); }
+
+ //! Return from function - one value.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE Error ret(const Reg& o0) { return cc->ret(o0); }
+
+ //! Return from function - two values / register pair.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE Error ret(const Reg& o0, const Reg& o1) { return cc->ret(o0, o1); }
+
+ //! \}
+
+ //! \name Function Finalization
+ //! \{
+
+ //! Calls \ref BaseCompiler::finalize().
+ ASMJIT_INLINE Error finalize() {
+ return cc->finalize();
+ }
+
+ //! \}
+
+ //! \name Function Invocation
+ //! \{
+
+ //! Creates a new \ref InvokeNode.
+ ASMJIT_INLINE Error new_invoke_node(Out<InvokeNode*> out, InstId inst_id, const Operand_& o0, const FuncSignature& signature) {
+ return cc->new_invoke_node(out, inst_id, o0, signature);
+ }
+
+ //! Creates a new \ref InvokeNode and adds it to the instruction stream.
+ ASMJIT_INLINE Error add_invoke_node(Out<InvokeNode*> out, InstId inst_id, const Operand_& o0, const FuncSignature& signature) {
+ return cc->add_invoke_node(out, inst_id, o0, signature);
+ }
+
+ //! \}
+
+ //! \name Virtual Registers & Memory (Target Independent)
+ //! \{
+
+ //! Wraps `BackendCompiler::new_reg(type_id, args...)`.
+ template<typename RegT, typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE RegT new_reg(TypeId type_id, Args&&... args) noexcept {
+ return cc->new_reg<RegT>(type_id, std::forward<Args>(args)...);
+ }
+
+ //! Wraps `BackendCompiler::new_similar_reg(ref, args...)`.
+ template<typename RegT, typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE RegT new_similar_reg(const RegT& ref, Args&&... args) noexcept {
+ return cc->new_similar_reg(ref, std::forward<Args>(args)...);
+ }
+
+ //! Wraps `BackendCompiler::new_gp32(args...)`.
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Gp new_gp32(Args&&... args) noexcept {
+ return cc->new_gp32(std::forward<Args>(args)...);
+ }
+
+ //! Wraps `BackendCompiler::new_gp64(args...)`.
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Gp new_gp64(Args&&... args) noexcept {
+ return cc->new_gp64(std::forward<Args>(args)...);
+ }
+
+ //! Wraps `BackendCompiler::new_gpz(args...)`.
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Gp new_gpz(Args&&... args) noexcept {
+ return cc->new_gpz(std::forward<Args>(args)...);
+ }
+
+ //! Wraps `BackendCompiler::new_gpz(args...)`.
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Gp new_gp_ptr(Args&&... args) noexcept {
+ return cc->new_gp_ptr(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec(Args&&... args) noexcept {
+ return cc->new_vec(_vec_type_id, std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec_with_width(VecWidth vw, Args&&... args) noexcept {
+ return cc->new_reg<Vec>(VecWidthUtils::type_id_of(vw), std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec128(Args&&... args) noexcept {
+ return cc->new_vec128(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec128_f32x1(Args&&... args) noexcept {
+ return cc->new_vec128_f32x1(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec128_f64x1(Args&&... args) noexcept {
+ return cc->new_vec128_f64x1(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec128_f32x4(Args&&... args) noexcept {
+ return cc->new_vec128_f32x4(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec128_f64x2(Args&&... args) noexcept {
+ return cc->new_vec128_f64x2(std::forward<Args>(args)...);
+ }
+
+#if defined(ASMJIT_UJIT_X86)
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec256(Args&&... args) noexcept {
+ return cc->new_vec256(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ [[nodiscard]]
+ ASMJIT_INLINE Vec new_vec512(Args&&... args) noexcept {
+ return cc->new_vec512(std::forward<Args>(args)...);
+ }
+#endif // ASMJIT_UJIT_X86
+
+ ASMJIT_NOINLINE void new_reg_array(OpArray& dst, size_t n, TypeId type_id, const char* name) noexcept {
+ ASMJIT_ASSERT(n <= OpArray::kMaxSize);
+ dst._size = n;
+ for (size_t i = 0; i < n; i++) {
+ cc->_new_reg(Out(dst[i].as<Reg>()), type_id, "%s%u", name, i);
+ }
+ }
+
+ ASMJIT_NOINLINE void new_reg_array(OpArray& dst, size_t n, TypeId type_id, const char* prefix, const char* name) noexcept {
+ ASMJIT_ASSERT(n <= OpArray::kMaxSize);
+ dst._size = n;
+ for (size_t i = 0; i < n; i++) {
+ cc->_new_reg(Out(dst[i].as<Reg>()), type_id, "%s%s%u", prefix, name, i);
+ }
+ }
+
+ ASMJIT_NOINLINE void new_reg_array(OpArray& dst, size_t n, const Reg& ref, const char* name) noexcept {
+ ASMJIT_ASSERT(n <= OpArray::kMaxSize);
+ dst._size = n;
+ for (size_t i = 0; i < n; i++) {
+ cc->_new_reg(Out(dst[i].as<Reg>()), ref, "%s%u", name, i);
+ }
+ }
+
+ ASMJIT_NOINLINE void new_reg_array(OpArray& dst, size_t n, const Reg& ref, const char* prefix, const char* name) noexcept {
+ ASMJIT_ASSERT(n <= OpArray::kMaxSize);
+ dst._size = n;
+ for (size_t i = 0; i < n; i++) {
+ cc->_new_reg(Out(dst[i].as<Reg>()), ref, "%s%s%u", prefix, name, i);
+ }
+ }
+
+ ASMJIT_INLINE void new_vec_array(OpArray& dst, size_t n, VecWidth vw, const char* name) noexcept {
+ new_reg_array(dst, n, VecWidthUtils::type_id_of(vw), name);
+ }
+
+ ASMJIT_INLINE void new_vec_array(OpArray& dst, size_t n, VecWidth vw, const char* prefix, const char* name) noexcept {
+ new_reg_array(dst, n, VecWidthUtils::type_id_of(vw), prefix, name);
+ }
+
+ ASMJIT_INLINE void new_vec_array(OpArray& dst, size_t n, const Vec& ref, const char* name) noexcept {
+ new_reg_array(dst, n, ref, name);
+ }
+
+ ASMJIT_INLINE void new_vec_array(OpArray& dst, size_t n, const Vec& ref, const char* prefix, const char* name) noexcept {
+ new_reg_array(dst, n, ref, prefix, name);
+ }
+
+ ASMJIT_INLINE void new_vec128_array(OpArray& dst, size_t n, const char* name) noexcept {
+ new_reg_array(dst, n, TypeId::kInt32x4, name);
+ }
+
+ ASMJIT_INLINE void new_vec128_array(OpArray& dst, size_t n, const char* prefix, const char* name) noexcept {
+ new_reg_array(dst, n, TypeId::kInt32x4, prefix, name);
+ }
+
+#if defined(ASMJIT_UJIT_X86)
+ ASMJIT_INLINE void new_vec256_array(OpArray& dst, size_t n, const char* name) noexcept {
+ new_reg_array(dst, n, TypeId::kInt32x8, name);
+ }
+
+ ASMJIT_INLINE void new_vec256_array(OpArray& dst, size_t n, const char* prefix, const char* name) noexcept {
+ new_reg_array(dst, n, TypeId::kInt32x8, prefix, name);
+ }
+
+ ASMJIT_INLINE void new_vec512_array(OpArray& dst, size_t n, const char* name) noexcept {
+ new_reg_array(dst, n, TypeId::kInt32x16, name);
+ }
+
+ ASMJIT_INLINE void new_vec512_array(OpArray& dst, size_t n, const char* prefix, const char* name) noexcept {
+ new_reg_array(dst, n, TypeId::kInt32x16, prefix, name);
+ }
+#endif // ASMJIT_UJIT_X86
+
+ ASMJIT_API Mem tmp_stack(StackId id, uint32_t size);
+
+ //! \}
+
+ ASMJIT_API void _init_vec_const_table_ptr();
+
+ //! \name Miscellaneous Helpers
+ //! \{
+
+ ASMJIT_INLINE void rename(const OpArray& op_array, const char* name) noexcept {
+ for (uint32_t i = 0; i < op_array.size(); i++) {
+ cc->rename(op_array[i].as<Reg>(), "%s%u", name, unsigned(i));
+ }
+ }
+
+ ASMJIT_INLINE void rename(const OpArray& op_array, const char* prefix, const char* name) noexcept {
+ for (uint32_t i = 0; i < op_array.size(); i++) {
+ cc->rename(op_array[i].as<Reg>(), "%s%s%u", prefix, name, unsigned(i));
+ }
+ }
+
+ //! \}
+
+ //! \name Constants (X86|X86_64)
+ //! \{
+
+#if defined(ASMJIT_UJIT_X86)
+ ASMJIT_API x86::KReg k_const(uint64_t value);
+#endif // ASMJIT_UJIT_X86
+
+ ASMJIT_API Operand simd_const(const void* c, Bcst bcst_width, VecWidth const_width);
+ ASMJIT_API Operand simd_const(const void* c, Bcst bcst_width, const Vec& similar_to);
+ ASMJIT_API Operand simd_const(const void* c, Bcst bcst_width, const VecArray& similar_to);
+
+ ASMJIT_API Vec simd_vec_const(const void* c, Bcst bcst_width, VecWidth const_width);
+ ASMJIT_API Vec simd_vec_const(const void* c, Bcst bcst_width, const Vec& similar_to);
+ ASMJIT_API Vec simd_vec_const(const void* c, Bcst bcst_width, const VecArray& similar_to);
+
+ ASMJIT_API Mem simd_mem_const(const void* c, Bcst bcst_width, VecWidth const_width);
+ ASMJIT_API Mem simd_mem_const(const void* c, Bcst bcst_width, const Vec& similar_to);
+ ASMJIT_API Mem simd_mem_const(const void* c, Bcst bcst_width, const VecArray& similar_to);
+
+ ASMJIT_API Mem _get_mem_const(const void* c);
+ ASMJIT_API Vec _new_vec_const(const void* c, bool is_unique_const);
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ ASMJIT_API Vec simd_const_16b(const void* data16);
+#endif // ASMJIT_UJIT_AARCH64
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ inline Vec simd_vec_zero(const Vec& similar_to) { return simd_vec_const(&ct().p_0000000000000000, Bcst::k32, similar_to); }
+#endif // ASMJIT_UJIT_AARCH64
+
+ //! \}
+
+ //! \name Emit - General Purpose Instructions
+ //! \{
+
+ ASMJIT_API void emit_mov(const Gp& dst, const Operand_& src);
+ ASMJIT_API void emit_m(UniOpM op, const Mem& m);
+ ASMJIT_API void emit_rm(UniOpRM op, const Gp& dst, const Mem& src);
+ ASMJIT_API void emit_mr(UniOpMR op, const Mem& dst, const Gp& src);
+ ASMJIT_API void emit_cmov(const Gp& dst, const Operand_& sel, const UniCondition& condition);
+ ASMJIT_API void emit_select(const Gp& dst, const Operand_& sel1_, const Operand_& sel2_, const UniCondition& condition);
+ ASMJIT_API void emit_2i(UniOpRR op, const Gp& dst, const Operand_& src_);
+ ASMJIT_API void emit_3i(UniOpRRR op, const Gp& dst, const Operand_& src1_, const Operand_& src2_);
+ ASMJIT_API void emit_j(const Operand_& target);
+ ASMJIT_API void emit_j_if(const Label& target, const UniCondition& condition);
+
+ ASMJIT_INLINE void mov(const Gp& dst, const Gp& src) { return emit_mov(dst, src); }
+ ASMJIT_INLINE void mov(const Gp& dst, const Imm& src) { return emit_mov(dst, src); }
+
+ ASMJIT_INLINE void load(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadReg, dst, src); }
+ ASMJIT_INLINE void load_i8(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadI8, dst, src); }
+ ASMJIT_INLINE void load_u8(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadU8, dst, src); }
+ ASMJIT_INLINE void load_i16(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadI16, dst, src); }
+ ASMJIT_INLINE void load_u16(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadU16, dst, src); }
+ ASMJIT_INLINE void load_i32(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadI32, dst, src); }
+ ASMJIT_INLINE void load_u32(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadU32, dst, src); }
+ ASMJIT_INLINE void load_i64(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadI64, dst, src); }
+ ASMJIT_INLINE void load_u64(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadU64, dst, src); }
+
+ ASMJIT_INLINE void load_merge_u8(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadMergeU8, dst, src); }
+ ASMJIT_INLINE void load_shift_u8(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadShiftU8, dst, src); }
+ ASMJIT_INLINE void load_merge_u16(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadMergeU16, dst, src); }
+ ASMJIT_INLINE void load_shift_u16(const Gp& dst, const Mem& src) { return emit_rm(UniOpRM::kLoadShiftU16, dst, src); }
+
+ ASMJIT_INLINE void store(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kStoreReg, dst, src); }
+ ASMJIT_INLINE void store_u8(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kStoreU8, dst, src); }
+ ASMJIT_INLINE void store_u16(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kStoreU16, dst, src); }
+ ASMJIT_INLINE void store_u32(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kStoreU32, dst, src); }
+ ASMJIT_INLINE void store_u64(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kStoreU64, dst, src); }
+
+ ASMJIT_INLINE void prefetch(const Mem& mem) { return emit_m(UniOpM::kPrefetch, mem); }
+ ASMJIT_INLINE void store_zero_reg(const Mem& dst) { return emit_m(UniOpM::kStoreZeroReg, dst); }
+ ASMJIT_INLINE void store_zero_u8(const Mem& dst) { return emit_m(UniOpM::kStoreZeroU8, dst); }
+ ASMJIT_INLINE void store_zero_u16(const Mem& dst) { return emit_m(UniOpM::kStoreZeroU16, dst); }
+ ASMJIT_INLINE void store_zero_u32(const Mem& dst) { return emit_m(UniOpM::kStoreZeroU32, dst); }
+ ASMJIT_INLINE void store_zero_u64(const Mem& dst) { return emit_m(UniOpM::kStoreZeroU64, dst); }
+
+ ASMJIT_INLINE void mem_add(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kAddReg, dst, src); }
+ ASMJIT_INLINE void mem_add_u8(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kAddU8, dst, src); }
+ ASMJIT_INLINE void mem_add_u16(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kAddU16, dst, src); }
+ ASMJIT_INLINE void mem_add_u32(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kAddU32, dst, src); }
+ ASMJIT_INLINE void mem_add_u64(const Mem& dst, const Gp& src) { return emit_mr(UniOpMR::kAddU64, dst, src); }
+
+ ASMJIT_INLINE void cmov(const Gp& dst, const Gp& sel, const UniCondition& condition) { emit_cmov(dst, sel, condition); }
+ ASMJIT_INLINE void cmov(const Gp& dst, const Mem& sel, const UniCondition& condition) { emit_cmov(dst, sel, condition); }
+
+ template<typename Sel1, typename Sel2>
+ ASMJIT_INLINE void select(const Gp& dst, const Sel1& sel1, const Sel2& sel2, const UniCondition& condition) { emit_select(dst, sel1, sel2, condition); }
+
+ ASMJIT_INLINE void abs(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kAbs, dst, src); }
+ ASMJIT_INLINE void abs(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kAbs, dst, src); }
+
+ ASMJIT_INLINE void neg(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kNeg, dst, src); }
+ ASMJIT_INLINE void neg(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kNeg, dst, src); }
+
+ ASMJIT_INLINE void not_(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kNot, dst, src); }
+ ASMJIT_INLINE void not_(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kNot, dst, src); }
+
+ ASMJIT_INLINE void bswap(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kBSwap, dst, src); }
+ ASMJIT_INLINE void bswap(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kBSwap, dst, src); }
+
+ ASMJIT_INLINE void clz(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kCLZ, dst, src); }
+ ASMJIT_INLINE void clz(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kCLZ, dst, src); }
+
+ ASMJIT_INLINE void ctz(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kCTZ, dst, src); }
+ ASMJIT_INLINE void ctz(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kCTZ, dst, src); }
+
+ ASMJIT_INLINE void reflect(const Gp& dst, const Gp& src) { emit_2i(UniOpRR::kReflect, dst, src); }
+ ASMJIT_INLINE void reflect(const Gp& dst, const Mem& src) { emit_2i(UniOpRR::kReflect, dst, src); }
+
+ ASMJIT_INLINE void inc(const Gp& dst) { emit_3i(UniOpRRR::kAdd, dst, dst, Imm(1)); }
+ ASMJIT_INLINE void dec(const Gp& dst) { emit_3i(UniOpRRR::kSub, dst, dst, Imm(1)); }
+
+ ASMJIT_INLINE void and_(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kAnd, dst, src1, src2); }
+ ASMJIT_INLINE void and_(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kAnd, dst, src1, src2); }
+ ASMJIT_INLINE void and_(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kAnd, dst, src1, src2); }
+ ASMJIT_INLINE void and_(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kAnd, dst, src1, src2); }
+ ASMJIT_INLINE void and_(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kAnd, dst, src1, src2); }
+
+ ASMJIT_INLINE void or_(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kOr, dst, src1, src2); }
+ ASMJIT_INLINE void or_(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kOr, dst, src1, src2); }
+ ASMJIT_INLINE void or_(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kOr, dst, src1, src2); }
+ ASMJIT_INLINE void or_(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kOr, dst, src1, src2); }
+ ASMJIT_INLINE void or_(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kOr, dst, src1, src2); }
+
+ ASMJIT_INLINE void xor_(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kXor, dst, src1, src2); }
+ ASMJIT_INLINE void xor_(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kXor, dst, src1, src2); }
+ ASMJIT_INLINE void xor_(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kXor, dst, src1, src2); }
+ ASMJIT_INLINE void xor_(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kXor, dst, src1, src2); }
+ ASMJIT_INLINE void xor_(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kXor, dst, src1, src2); }
+
+ ASMJIT_INLINE void bic(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kBic, dst, src1, src2); }
+ ASMJIT_INLINE void bic(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kBic, dst, src1, src2); }
+ ASMJIT_INLINE void bic(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kBic, dst, src1, src2); }
+ ASMJIT_INLINE void bic(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kBic, dst, src1, src2); }
+ ASMJIT_INLINE void bic(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kBic, dst, src1, src2); }
+
+ ASMJIT_INLINE void add(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kAdd, dst, src1, src2); }
+ ASMJIT_INLINE void add(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kAdd, dst, src1, src2); }
+ ASMJIT_INLINE void add(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kAdd, dst, src1, src2); }
+ ASMJIT_INLINE void add(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kAdd, dst, src1, src2); }
+ ASMJIT_INLINE void add(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kAdd, dst, src1, src2); }
+
+ ASMJIT_INLINE void sub(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSub, dst, src1, src2); }
+ ASMJIT_INLINE void sub(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kSub, dst, src1, src2); }
+ ASMJIT_INLINE void sub(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kSub, dst, src1, src2); }
+ ASMJIT_INLINE void sub(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kSub, dst, src1, src2); }
+ ASMJIT_INLINE void sub(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kSub, dst, src1, src2); }
+
+ ASMJIT_INLINE void mul(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kMul, dst, src1, src2); }
+ ASMJIT_INLINE void mul(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kMul, dst, src1, src2); }
+ ASMJIT_INLINE void mul(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kMul, dst, src1, src2); }
+ ASMJIT_INLINE void mul(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kMul, dst, src1, src2); }
+ ASMJIT_INLINE void mul(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kMul, dst, src1, src2); }
+
+ ASMJIT_INLINE void udiv(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kUDiv, dst, src1, src2); }
+ ASMJIT_INLINE void udiv(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kUDiv, dst, src1, src2); }
+ ASMJIT_INLINE void udiv(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kUDiv, dst, src1, src2); }
+ ASMJIT_INLINE void udiv(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kUDiv, dst, src1, src2); }
+ ASMJIT_INLINE void udiv(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kUDiv, dst, src1, src2); }
+
+ ASMJIT_INLINE void umod(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kUMod, dst, src1, src2); }
+ ASMJIT_INLINE void umod(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kUMod, dst, src1, src2); }
+ ASMJIT_INLINE void umod(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kUMod, dst, src1, src2); }
+ ASMJIT_INLINE void umod(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kUMod, dst, src1, src2); }
+ ASMJIT_INLINE void umod(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kUMod, dst, src1, src2); }
+
+ ASMJIT_INLINE void smin(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSMin, dst, src1, src2); }
+ ASMJIT_INLINE void smin(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kSMin, dst, src1, src2); }
+ ASMJIT_INLINE void smin(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kSMin, dst, src1, src2); }
+ ASMJIT_INLINE void smin(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kSMin, dst, src1, src2); }
+ ASMJIT_INLINE void smin(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kSMin, dst, src1, src2); }
+
+ ASMJIT_INLINE void smax(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSMax, dst, src1, src2); }
+ ASMJIT_INLINE void smax(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kSMax, dst, src1, src2); }
+ ASMJIT_INLINE void smax(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kSMax, dst, src1, src2); }
+ ASMJIT_INLINE void smax(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kSMax, dst, src1, src2); }
+ ASMJIT_INLINE void smax(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kSMax, dst, src1, src2); }
+
+ ASMJIT_INLINE void umin(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kUMin, dst, src1, src2); }
+ ASMJIT_INLINE void umin(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kUMin, dst, src1, src2); }
+ ASMJIT_INLINE void umin(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kUMin, dst, src1, src2); }
+ ASMJIT_INLINE void umin(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kUMin, dst, src1, src2); }
+ ASMJIT_INLINE void umin(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kUMin, dst, src1, src2); }
+
+ ASMJIT_INLINE void umax(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kUMax, dst, src1, src2); }
+ ASMJIT_INLINE void umax(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kUMax, dst, src1, src2); }
+ ASMJIT_INLINE void umax(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kUMax, dst, src1, src2); }
+ ASMJIT_INLINE void umax(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kUMax, dst, src1, src2); }
+ ASMJIT_INLINE void umax(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kUMax, dst, src1, src2); }
+
+ ASMJIT_INLINE void shl(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSll, dst, src1, src2); }
+ ASMJIT_INLINE void shl(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kSll, dst, src1, src2); }
+ ASMJIT_INLINE void shl(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kSll, dst, src1, src2); }
+ ASMJIT_INLINE void shl(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kSll, dst, src1, src2); }
+
+ ASMJIT_INLINE void shr(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSrl, dst, src1, src2); }
+ ASMJIT_INLINE void shr(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kSrl, dst, src1, src2); }
+ ASMJIT_INLINE void shr(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kSrl, dst, src1, src2); }
+ ASMJIT_INLINE void shr(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kSrl, dst, src1, src2); }
+
+ ASMJIT_INLINE void sar(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSra, dst, src1, src2); }
+ ASMJIT_INLINE void sar(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kSra, dst, src1, src2); }
+ ASMJIT_INLINE void sar(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kSra, dst, src1, src2); }
+ ASMJIT_INLINE void sar(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kSra, dst, src1, src2); }
+
+ ASMJIT_INLINE void rol(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kRol, dst, src1, src2); }
+ ASMJIT_INLINE void rol(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kRol, dst, src1, src2); }
+ ASMJIT_INLINE void rol(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kRol, dst, src1, src2); }
+ ASMJIT_INLINE void rol(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kRol, dst, src1, src2); }
+
+ ASMJIT_INLINE void ror(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kRor, dst, src1, src2); }
+ ASMJIT_INLINE void ror(const Gp& dst, const Gp& src1, const Imm& src2) { emit_3i(UniOpRRR::kRor, dst, src1, src2); }
+ ASMJIT_INLINE void ror(const Gp& dst, const Mem& src1, const Gp& src2) { emit_3i(UniOpRRR::kRor, dst, src1, src2); }
+ ASMJIT_INLINE void ror(const Gp& dst, const Mem& src1, const Imm& src2) { emit_3i(UniOpRRR::kRor, dst, src1, src2); }
+
+ ASMJIT_INLINE void sbound(const Gp& dst, const Gp& src1, const Gp& src2) { emit_3i(UniOpRRR::kSBound, dst, src1, src2); }
+ ASMJIT_INLINE void sbound(const Gp& dst, const Gp& src1, const Mem& src2) { emit_3i(UniOpRRR::kSBound, dst, src1, src2); }
+
+ ASMJIT_INLINE void j(const Gp& target) { emit_j(target); }
+ ASMJIT_INLINE void j(const Label& target) { emit_j(target); }
+ ASMJIT_INLINE void j(const Label& target, const UniCondition& condition) { emit_j_if(target, condition); }
+
+ ASMJIT_API void adds_u8(const Gp& dst, const Gp& src1, const Gp& src2);
+
+ ASMJIT_API void inv_u8(const Gp& dst, const Gp& src);
+ ASMJIT_API void div_255_u32(const Gp& dst, const Gp& src);
+ ASMJIT_API void mul_257_hu16(const Gp& dst, const Gp& src);
+
+ ASMJIT_API void add_scaled(const Gp& dst, const Gp& a, int b);
+ ASMJIT_API void add_ext(const Gp& dst, const Gp& src_, const Gp& idx_, uint32_t scale, int32_t disp = 0);
+
+ ASMJIT_API void lea(const Gp& dst, const Mem& src);
+
+ //! \}
+
+ //! \name Emit - Vector Instructions
+ //! \{
+
+ ASMJIT_API void emit_2v(UniOpVV op, const Operand_& dst_, const Operand_& src_);
+ ASMJIT_API void emit_2v(UniOpVV op, const OpArray& dst_, const Operand_& src_);
+ ASMJIT_API void emit_2v(UniOpVV op, const OpArray& dst_, const OpArray& src_);
+
+ ASMJIT_API void emit_2vi(UniOpVVI op, const Operand_& dst_, const Operand_& src_, uint32_t imm);
+ ASMJIT_API void emit_2vi(UniOpVVI op, const OpArray& dst_, const Operand_& src_, uint32_t imm);
+ ASMJIT_API void emit_2vi(UniOpVVI op, const OpArray& dst_, const OpArray& src_, uint32_t imm);
+
+ ASMJIT_API void emit_2vs(UniOpVR op, const Operand_& dst_, const Operand_& src_, uint32_t idx = 0);
+
+ ASMJIT_API void emit_vm(UniOpVM op, const Vec& dst_, const Mem& src_, Alignment alignment, uint32_t idx = 0);
+ ASMJIT_API void emit_vm(UniOpVM op, const OpArray& dst_, const Mem& src_, Alignment alignment, uint32_t idx = 0);
+
+ ASMJIT_API void emit_mv(UniOpMV op, const Mem& dst_, const Vec& src_, Alignment alignment, uint32_t idx = 0);
+ ASMJIT_API void emit_mv(UniOpMV op, const Mem& dst_, const OpArray& src_, Alignment alignment, uint32_t idx = 0);
+
+ ASMJIT_API void emit_3v(UniOpVVV op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_);
+ ASMJIT_API void emit_3v(UniOpVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_);
+ ASMJIT_API void emit_3v(UniOpVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_);
+ ASMJIT_API void emit_3v(UniOpVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_);
+
+ ASMJIT_API void emit_3vi(UniOpVVVI op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_, uint32_t imm);
+ ASMJIT_API void emit_3vi(UniOpVVVI op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, uint32_t imm);
+ ASMJIT_API void emit_3vi(UniOpVVVI op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, uint32_t imm);
+ ASMJIT_API void emit_3vi(UniOpVVVI op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, uint32_t imm);
+
+ ASMJIT_API void emit_4v(UniOpVVVV op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_, const Operand_& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const Operand_& src2_, const OpArray& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, const Operand& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, const OpArray& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, const Operand& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, const OpArray& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, const Operand& src3_);
+ ASMJIT_API void emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, const OpArray& src3_);
+
+ #define DEFINE_OP_2V(name, op) \
+ template<typename Dst, typename Src> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src& src) { emit_2v(op, dst, src); }
+
+ #define DEFINE_OP_2VI(name, op) \
+ template<typename Dst, typename Src> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src& src, uint32_t imm) { emit_2vi(op, dst, src, imm); }
+
+ #define DEFINE_OP_2VI_WRAP(name, imm_wrapper, op) \
+ template<typename Dst, typename Src> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src& src, const imm_wrapper& imm) { emit_2vi(op, dst, src, imm.value); }
+
+ #define DEFINE_OP_VM_U(name, op, alignment) \
+ ASMJIT_INLINE void name(const Vec& dst, const Mem& src) { emit_vm(op, dst, src, Alignment(alignment)); } \
+ ASMJIT_INLINE void name(const VecArray& dst, const Mem& src) { emit_vm(op, dst, src, Alignment(alignment)); }
+
+ #define DEFINE_OP_VM_A(name, op, default_alignment) \
+ ASMJIT_INLINE void name(const Vec& dst, const Mem& src, Alignment alignment = Alignment{default_alignment}) { emit_vm(op, dst, src, alignment); } \
+ ASMJIT_INLINE void name(const VecArray& dst, const Mem& src, Alignment alignment = Alignment{default_alignment}) { emit_vm(op, dst, src, alignment); }
+
+ #define DEFINE_OP_VM_I(name, op, default_alignment) \
+ ASMJIT_INLINE void name(const Vec& dst, const Mem& src, uint32_t idx) { emit_vm(op, dst, src, Alignment(default_alignment), idx); } \
+ ASMJIT_INLINE void name(const VecArray& dst, const Mem& src, uint32_t idx) { emit_vm(op, dst, src, Alignment(default_alignment), idx); }
+
+ #define DEFINE_OP_MV_U(name, op, alignment) \
+ ASMJIT_INLINE void name(const Mem& dst, const Vec& src) { emit_mv(op, dst, src, Alignment(alignment)); } \
+ ASMJIT_INLINE void name(const Mem& dst, const VecArray& src) { emit_mv(op, dst, src, Alignment(alignment)); }
+
+ #define DEFINE_OP_MV_A(name, op, default_alignment) \
+ ASMJIT_INLINE void name(const Mem& dst, const Vec& src, Alignment alignment = Alignment(default_alignment)) { emit_mv(op, dst, src, alignment); } \
+ ASMJIT_INLINE void name(const Mem& dst, const VecArray& src, Alignment alignment = Alignment(default_alignment)) { emit_mv(op, dst, src, alignment); }
+
+ #define DEFINE_OP_MV_I(name, op, default_alignment) \
+ ASMJIT_INLINE void name(const Mem& dst, const Vec& src, uint32_t idx) { emit_mv(op, dst, src, Alignment(default_alignment), idx); } \
+ ASMJIT_INLINE void name(const Mem& dst, const VecArray& src, uint32_t idx) { emit_mv(op, dst, src, Alignment(default_alignment), idx); }
+
+ #define DEFINE_OP_3V(name, op) \
+ template<typename Dst, typename Src1, typename Src2> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src1& src1, const Src2& src2) { emit_3v(op, dst, src1, src2); }
+
+ #define DEFINE_OP_3VI(name, op) \
+ template<typename Dst, typename Src1, typename Src2> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src1& src1, const Src2& src2, uint32_t imm) { emit_3vi(op, dst, src1, src2, imm); }
+
+ #define DEFINE_OP_3VI_WRAP(name, imm_wrapper, op) \
+ template<typename Dst, typename Src1, typename Src2> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src1& src1, const Src2& src2, const imm_wrapper& imm) { emit_3vi(op, dst, src1, src2, imm.value); }
+
+ #define DEFINE_OP_4V(name, op) \
+ template<typename Dst, typename Src1, typename Src2, typename Src3> \
+ ASMJIT_INLINE void name(const Dst& dst, const Src1& src1, const Src2& src2, const Src3& src3) { emit_4v(op, dst, src1, src2, src3); }
+
+ ASMJIT_INLINE void s_mov(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kMov, dst, src); }
+ ASMJIT_INLINE void s_mov(const Vec& dst, const Gp& src) { emit_2vs(UniOpVR::kMov, dst, src); }
+
+ ASMJIT_INLINE void s_mov_u32(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kMovU32, dst, src); }
+ ASMJIT_INLINE void s_mov_u32(const Vec& dst, const Gp& src) { emit_2vs(UniOpVR::kMovU32, dst, src); }
+
+ ASMJIT_INLINE void s_mov_u64(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kMovU64, dst, src); }
+ ASMJIT_INLINE void s_mov_u64(const Vec& dst, const Gp& src) { emit_2vs(UniOpVR::kMovU64, dst, src); }
+
+ ASMJIT_INLINE void s_insert_u8(const Vec& dst, const Gp& src, uint32_t idx) { emit_2vs(UniOpVR::kInsertU8, dst, src, idx); }
+ ASMJIT_INLINE void s_insert_u16(const Vec& dst, const Gp& src, uint32_t idx) { emit_2vs(UniOpVR::kInsertU16, dst, src, idx); }
+ ASMJIT_INLINE void s_insert_u32(const Vec& dst, const Gp& src, uint32_t idx) { emit_2vs(UniOpVR::kInsertU32, dst, src, idx); }
+ ASMJIT_INLINE void s_insert_u64(const Vec& dst, const Gp& src, uint32_t idx) { emit_2vs(UniOpVR::kInsertU64, dst, src, idx); }
+
+ ASMJIT_INLINE void s_extract_u8(const Gp& dst, const Vec& src, uint32_t idx) { emit_2vs(UniOpVR::kExtractU8, dst, src, idx); }
+ ASMJIT_INLINE void s_extract_u16(const Gp& dst, const Vec& src, uint32_t idx) { emit_2vs(UniOpVR::kExtractU16, dst, src, idx); }
+ ASMJIT_INLINE void s_extract_u32(const Gp& dst, const Vec& src, uint32_t idx) { emit_2vs(UniOpVR::kExtractU32, dst, src, idx); }
+ ASMJIT_INLINE void s_extract_u64(const Gp& dst, const Vec& src, uint32_t idx) { emit_2vs(UniOpVR::kExtractU64, dst, src, idx); }
+
+ ASMJIT_INLINE void s_cvt_int_to_f32(const Vec& dst, const Gp& src) { emit_2vs(UniOpVR::kCvtIntToF32, dst, src); }
+ ASMJIT_INLINE void s_cvt_int_to_f32(const Vec& dst, const Mem& src) { emit_2vs(UniOpVR::kCvtIntToF32, dst, src); }
+ ASMJIT_INLINE void s_cvt_int_to_f64(const Vec& dst, const Gp& src) { emit_2vs(UniOpVR::kCvtIntToF64, dst, src); }
+ ASMJIT_INLINE void s_cvt_int_to_f64(const Vec& dst, const Mem& src) { emit_2vs(UniOpVR::kCvtIntToF64, dst, src); }
+
+ ASMJIT_INLINE void s_cvt_trunc_f32_to_int(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kCvtTruncF32ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_trunc_f32_to_int(const Gp& dst, const Mem& src) { emit_2vs(UniOpVR::kCvtTruncF32ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_round_f32_to_int(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kCvtRoundF32ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_round_f32_to_int(const Gp& dst, const Mem& src) { emit_2vs(UniOpVR::kCvtRoundF32ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_trunc_f64_to_int(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kCvtTruncF64ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_trunc_f64_to_int(const Gp& dst, const Mem& src) { emit_2vs(UniOpVR::kCvtTruncF64ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_round_f64_to_int(const Gp& dst, const Vec& src) { emit_2vs(UniOpVR::kCvtRoundF64ToInt, dst, src); }
+ ASMJIT_INLINE void s_cvt_round_f64_to_int(const Gp& dst, const Mem& src) { emit_2vs(UniOpVR::kCvtRoundF64ToInt, dst, src); }
+
+ DEFINE_OP_2V(v_mov, UniOpVV::kMov)
+ DEFINE_OP_2V(v_mov_u64, UniOpVV::kMovU64)
+ DEFINE_OP_2V(v_broadcast_u8z, UniOpVV::kBroadcastU8Z)
+ DEFINE_OP_2V(v_broadcast_u16z, UniOpVV::kBroadcastU16Z)
+ DEFINE_OP_2V(v_broadcast_u8, UniOpVV::kBroadcastU8)
+ DEFINE_OP_2V(v_broadcast_u16, UniOpVV::kBroadcastU16)
+ DEFINE_OP_2V(v_broadcast_u32, UniOpVV::kBroadcastU32)
+ DEFINE_OP_2V(v_broadcast_u64, UniOpVV::kBroadcastU64)
+ DEFINE_OP_2V(v_broadcast_f32, UniOpVV::kBroadcastF32)
+ DEFINE_OP_2V(v_broadcast_f64, UniOpVV::kBroadcastF64)
+ DEFINE_OP_2V(v_broadcast_v128_u32, UniOpVV::kBroadcastV128_U32)
+ DEFINE_OP_2V(v_broadcast_v128_u64, UniOpVV::kBroadcastV128_U64)
+ DEFINE_OP_2V(v_broadcast_v128_f32, UniOpVV::kBroadcastV128_F32)
+ DEFINE_OP_2V(v_broadcast_v128_f64, UniOpVV::kBroadcastV128_F64)
+ DEFINE_OP_2V(v_broadcast_v256_u32, UniOpVV::kBroadcastV256_U32)
+ DEFINE_OP_2V(v_broadcast_v256_u64, UniOpVV::kBroadcastV256_U64)
+ DEFINE_OP_2V(v_broadcast_v256_f32, UniOpVV::kBroadcastV256_F32)
+ DEFINE_OP_2V(v_broadcast_v256_f64, UniOpVV::kBroadcastV256_F64)
+ DEFINE_OP_2V(v_abs_i8, UniOpVV::kAbsI8)
+ DEFINE_OP_2V(v_abs_i16, UniOpVV::kAbsI16)
+ DEFINE_OP_2V(v_abs_i32, UniOpVV::kAbsI32)
+ DEFINE_OP_2V(v_abs_i64, UniOpVV::kAbsI64)
+ DEFINE_OP_2V(v_not_u32, UniOpVV::kNotU32)
+ DEFINE_OP_2V(v_not_u64, UniOpVV::kNotU64)
+ DEFINE_OP_2V(v_cvt_i8_lo_to_i16, UniOpVV::kCvtI8LoToI16)
+ DEFINE_OP_2V(v_cvt_i8_hi_to_i16, UniOpVV::kCvtI8HiToI16)
+ DEFINE_OP_2V(v_cvt_u8_lo_to_u16, UniOpVV::kCvtU8LoToU16)
+ DEFINE_OP_2V(v_cvt_u8_hi_to_u16, UniOpVV::kCvtU8HiToU16)
+ DEFINE_OP_2V(v_cvt_i8_to_i32, UniOpVV::kCvtI8ToI32)
+ DEFINE_OP_2V(v_cvt_u8_to_u32, UniOpVV::kCvtU8ToU32)
+ DEFINE_OP_2V(v_cvt_i16_lo_to_i32, UniOpVV::kCvtI16LoToI32)
+ DEFINE_OP_2V(v_cvt_i16_hi_to_i32, UniOpVV::kCvtI16HiToI32)
+ DEFINE_OP_2V(v_cvt_u16_lo_to_u32, UniOpVV::kCvtU16LoToU32)
+ DEFINE_OP_2V(v_cvt_u16_hi_to_u32, UniOpVV::kCvtU16HiToU32)
+ DEFINE_OP_2V(v_cvt_i32_lo_to_i64, UniOpVV::kCvtI32LoToI64)
+ DEFINE_OP_2V(v_cvt_i32_hi_to_i64, UniOpVV::kCvtI32HiToI64)
+ DEFINE_OP_2V(v_cvt_u32_lo_to_u64, UniOpVV::kCvtU32LoToU64)
+ DEFINE_OP_2V(v_cvt_u32_hi_to_u64, UniOpVV::kCvtU32HiToU64)
+ DEFINE_OP_2V(s_abs_f32, UniOpVV::kAbsF32S)
+ DEFINE_OP_2V(s_abs_f64, UniOpVV::kAbsF64S)
+ DEFINE_OP_2V(v_abs_f32, UniOpVV::kAbsF32)
+ DEFINE_OP_2V(v_abs_f64, UniOpVV::kAbsF64)
+ DEFINE_OP_2V(s_neg_f32, UniOpVV::kNegF32S)
+ DEFINE_OP_2V(s_neg_f64, UniOpVV::kNegF64S)
+ DEFINE_OP_2V(v_neg_f32, UniOpVV::kNegF32)
+ DEFINE_OP_2V(v_neg_f64, UniOpVV::kNegF64)
+ DEFINE_OP_2V(v_not_f32, UniOpVV::kNotF32)
+ DEFINE_OP_2V(v_not_f64, UniOpVV::kNotF64)
+ DEFINE_OP_2V(s_trunc_f32, UniOpVV::kTruncF32S)
+ DEFINE_OP_2V(s_trunc_f64, UniOpVV::kTruncF64S)
+ DEFINE_OP_2V(v_trunc_f32, UniOpVV::kTruncF32)
+ DEFINE_OP_2V(v_trunc_f64, UniOpVV::kTruncF64)
+ DEFINE_OP_2V(s_floor_f32, UniOpVV::kFloorF32S)
+ DEFINE_OP_2V(s_floor_f64, UniOpVV::kFloorF64S)
+ DEFINE_OP_2V(v_floor_f32, UniOpVV::kFloorF32)
+ DEFINE_OP_2V(v_floor_f64, UniOpVV::kFloorF64)
+ DEFINE_OP_2V(s_ceil_f32, UniOpVV::kCeilF32S)
+ DEFINE_OP_2V(s_ceil_f64, UniOpVV::kCeilF64S)
+ DEFINE_OP_2V(v_ceil_f32, UniOpVV::kCeilF32)
+ DEFINE_OP_2V(v_ceil_f64, UniOpVV::kCeilF64)
+ DEFINE_OP_2V(s_round_even_f32, UniOpVV::kRoundEvenF32S)
+ DEFINE_OP_2V(s_round_even_f64, UniOpVV::kRoundEvenF64S)
+ DEFINE_OP_2V(v_round_even_f32, UniOpVV::kRoundEvenF32)
+ DEFINE_OP_2V(v_round_even_f64, UniOpVV::kRoundEvenF64)
+ DEFINE_OP_2V(s_round_half_away_f32, UniOpVV::kRoundHalfAwayF32S)
+ DEFINE_OP_2V(s_round_half_away_f64, UniOpVV::kRoundHalfAwayF64S)
+ DEFINE_OP_2V(v_round_half_away_f32, UniOpVV::kRoundHalfAwayF32)
+ DEFINE_OP_2V(v_round_half_away_f64, UniOpVV::kRoundHalfAwayF64)
+ DEFINE_OP_2V(s_round_half_up_f32, UniOpVV::kRoundHalfUpF32S)
+ DEFINE_OP_2V(s_round_half_up_f64, UniOpVV::kRoundHalfUpF64S)
+ DEFINE_OP_2V(v_round_half_up_f32, UniOpVV::kRoundHalfUpF32)
+ DEFINE_OP_2V(v_round_half_up_f64, UniOpVV::kRoundHalfUpF64)
+ DEFINE_OP_2V(v_rcp_f32, UniOpVV::kRcpF32)
+ DEFINE_OP_2V(v_rcp_f64, UniOpVV::kRcpF64)
+ DEFINE_OP_2V(s_sqrt_f32, UniOpVV::kSqrtF32S)
+ DEFINE_OP_2V(s_sqrt_f64, UniOpVV::kSqrtF64S)
+ DEFINE_OP_2V(v_sqrt_f32, UniOpVV::kSqrtF32)
+ DEFINE_OP_2V(v_sqrt_f64, UniOpVV::kSqrtF64)
+ DEFINE_OP_2V(s_cvt_f32_to_f64, UniOpVV::kCvtF32ToF64S)
+ DEFINE_OP_2V(s_cvt_f64_to_f32, UniOpVV::kCvtF64ToF32S)
+ DEFINE_OP_2V(v_cvt_i32_to_f32, UniOpVV::kCvtI32ToF32)
+ DEFINE_OP_2V(v_cvt_f32_lo_to_f64, UniOpVV::kCvtF32LoToF64)
+ DEFINE_OP_2V(v_cvt_f32_hi_to_f64, UniOpVV::kCvtF32HiToF64)
+ DEFINE_OP_2V(v_cvt_f64_to_f32_lo, UniOpVV::kCvtF64ToF32Lo)
+ DEFINE_OP_2V(v_cvt_f64_to_f32_hi, UniOpVV::kCvtF64ToF32Hi)
+ DEFINE_OP_2V(v_cvt_i32_lo_to_f64, UniOpVV::kCvtI32LoToF64)
+ DEFINE_OP_2V(v_cvt_i32_hi_to_f64, UniOpVV::kCvtI32HiToF64)
+ DEFINE_OP_2V(v_cvt_trunc_f32_to_i32, UniOpVV::kCvtTruncF32ToI32)
+ DEFINE_OP_2V(v_cvt_trunc_f64_to_i32_lo, UniOpVV::kCvtTruncF64ToI32Lo)
+ DEFINE_OP_2V(v_cvt_trunc_f64_to_i32_hi, UniOpVV::kCvtTruncF64ToI32Hi)
+ DEFINE_OP_2V(v_cvt_round_f32_to_i32, UniOpVV::kCvtRoundF32ToI32)
+ DEFINE_OP_2V(v_cvt_round_f64_to_i32_lo, UniOpVV::kCvtRoundF64ToI32Lo)
+ DEFINE_OP_2V(v_cvt_round_f64_to_i32_hi, UniOpVV::kCvtRoundF64ToI32Hi)
+
+ DEFINE_OP_2VI(v_slli_i16, UniOpVVI::kSllU16)
+ DEFINE_OP_2VI(v_slli_u16, UniOpVVI::kSllU16)
+ DEFINE_OP_2VI(v_slli_i32, UniOpVVI::kSllU32)
+ DEFINE_OP_2VI(v_slli_u32, UniOpVVI::kSllU32)
+ DEFINE_OP_2VI(v_slli_i64, UniOpVVI::kSllU64)
+ DEFINE_OP_2VI(v_slli_u64, UniOpVVI::kSllU64)
+ DEFINE_OP_2VI(v_srli_u16, UniOpVVI::kSrlU16)
+ DEFINE_OP_2VI(v_srli_u32, UniOpVVI::kSrlU32)
+ DEFINE_OP_2VI(v_srli_u64, UniOpVVI::kSrlU64)
+ DEFINE_OP_2VI(v_srai_i16, UniOpVVI::kSraI16)
+ DEFINE_OP_2VI(v_srai_i32, UniOpVVI::kSraI32)
+ DEFINE_OP_2VI(v_srai_i64, UniOpVVI::kSraI64)
+ DEFINE_OP_2VI(v_sllb_u128, UniOpVVI::kSllbU128)
+ DEFINE_OP_2VI(v_srlb_u128, UniOpVVI::kSrlbU128)
+ DEFINE_OP_2VI_WRAP(v_swizzle_u16x4, Swizzle4, UniOpVVI::kSwizzleU16x4)
+ DEFINE_OP_2VI_WRAP(v_swizzle_lo_u16x4, Swizzle4, UniOpVVI::kSwizzleLoU16x4)
+ DEFINE_OP_2VI_WRAP(v_swizzle_hi_u16x4, Swizzle4, UniOpVVI::kSwizzleHiU16x4)
+ DEFINE_OP_2VI_WRAP(v_swizzle_u32x4, Swizzle4, UniOpVVI::kSwizzleU32x4)
+ DEFINE_OP_2VI_WRAP(v_swizzle_u64x2, Swizzle2, UniOpVVI::kSwizzleU64x2)
+ DEFINE_OP_2VI_WRAP(v_swizzle_f32x4, Swizzle4, UniOpVVI::kSwizzleF32x4)
+ DEFINE_OP_2VI_WRAP(v_swizzle_f64x2, Swizzle2, UniOpVVI::kSwizzleF64x2)
+ DEFINE_OP_2VI_WRAP(v_swizzle_u64x4, Swizzle4, UniOpVVI::kSwizzleU64x4)
+ DEFINE_OP_2VI_WRAP(v_swizzle_f64x4, Swizzle4, UniOpVVI::kSwizzleF64x4)
+ DEFINE_OP_2VI(v_extract_v128, UniOpVVI::kExtractV128_I32)
+ DEFINE_OP_2VI(v_extract_v128_i32, UniOpVVI::kExtractV128_I32)
+ DEFINE_OP_2VI(v_extract_v128_i64, UniOpVVI::kExtractV128_I64)
+ DEFINE_OP_2VI(v_extract_v128_f32, UniOpVVI::kExtractV128_F32)
+ DEFINE_OP_2VI(v_extract_v128_f64, UniOpVVI::kExtractV128_F64)
+ DEFINE_OP_2VI(v_extract_v256, UniOpVVI::kExtractV256_I32)
+ DEFINE_OP_2VI(v_extract_v256_i32, UniOpVVI::kExtractV256_I32)
+ DEFINE_OP_2VI(v_extract_v256_i64, UniOpVVI::kExtractV256_I64)
+ DEFINE_OP_2VI(v_extract_v256_f32, UniOpVVI::kExtractV256_F32)
+ DEFINE_OP_2VI(v_extract_v256_f64, UniOpVVI::kExtractV256_F64)
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ DEFINE_OP_2VI(v_srli_rnd_u16, UniOpVVI::kSrlRndU16)
+ DEFINE_OP_2VI(v_srli_rnd_u32, UniOpVVI::kSrlRndU32)
+ DEFINE_OP_2VI(v_srli_rnd_u64, UniOpVVI::kSrlRndU64)
+ DEFINE_OP_2VI(v_srli_acc_u16, UniOpVVI::kSrlAccU16)
+ DEFINE_OP_2VI(v_srli_acc_u32, UniOpVVI::kSrlAccU32)
+ DEFINE_OP_2VI(v_srli_acc_u64, UniOpVVI::kSrlAccU64)
+ DEFINE_OP_2VI(v_srli_rnd_acc_u16, UniOpVVI::kSrlRndAccU16)
+ DEFINE_OP_2VI(v_srli_rnd_acc_u32, UniOpVVI::kSrlRndAccU32)
+ DEFINE_OP_2VI(v_srli_rnd_acc_u64, UniOpVVI::kSrlRndAccU64)
+
+ DEFINE_OP_2VI(v_srlni_lo_u16, UniOpVVI::kSrlnLoU16)
+ DEFINE_OP_2VI(v_srlni_hi_u16, UniOpVVI::kSrlnHiU16)
+ DEFINE_OP_2VI(v_srlni_lo_u32, UniOpVVI::kSrlnLoU32)
+ DEFINE_OP_2VI(v_srlni_hi_u32, UniOpVVI::kSrlnHiU32)
+ DEFINE_OP_2VI(v_srlni_lo_u64, UniOpVVI::kSrlnLoU64)
+ DEFINE_OP_2VI(v_srlni_hi_u64, UniOpVVI::kSrlnHiU64)
+
+ DEFINE_OP_2VI(v_srlni_rnd_lo_u16, UniOpVVI::kSrlnRndLoU16)
+ DEFINE_OP_2VI(v_srlni_rnd_hi_u16, UniOpVVI::kSrlnRndHiU16)
+ DEFINE_OP_2VI(v_srlni_rnd_lo_u32, UniOpVVI::kSrlnRndLoU32)
+ DEFINE_OP_2VI(v_srlni_rnd_hi_u32, UniOpVVI::kSrlnRndHiU32)
+ DEFINE_OP_2VI(v_srlni_rnd_lo_u64, UniOpVVI::kSrlnRndLoU64)
+ DEFINE_OP_2VI(v_srlni_rnd_hi_u64, UniOpVVI::kSrlnRndHiU64)
+#endif // ASMJIT_UJIT_AARCH64
+
+ DEFINE_OP_VM_U(v_load8, UniOpVM::kLoad8, 1)
+ DEFINE_OP_VM_U(v_loadu16, UniOpVM::kLoad16_U16, 1)
+ DEFINE_OP_VM_A(v_loada16, UniOpVM::kLoad16_U16, 2)
+ DEFINE_OP_VM_U(v_loadu32, UniOpVM::kLoad32_U32, 1)
+ DEFINE_OP_VM_A(v_loada32, UniOpVM::kLoad32_U32, 4)
+ DEFINE_OP_VM_U(v_loadu32_u32, UniOpVM::kLoad32_U32, 1)
+ DEFINE_OP_VM_A(v_loada32_u32, UniOpVM::kLoad32_U32, 4)
+ DEFINE_OP_VM_U(v_loadu32_f32, UniOpVM::kLoad32_F32, 1)
+ DEFINE_OP_VM_A(v_loada32_f32, UniOpVM::kLoad32_F32, 4)
+ DEFINE_OP_VM_U(v_loadu64, UniOpVM::kLoad64_U32, 1)
+ DEFINE_OP_VM_A(v_loada64, UniOpVM::kLoad64_U32, 8)
+ DEFINE_OP_VM_U(v_loadu64_u32, UniOpVM::kLoad64_U32, 1)
+ DEFINE_OP_VM_A(v_loada64_u32, UniOpVM::kLoad64_U32, 8)
+ DEFINE_OP_VM_U(v_loadu64_u64, UniOpVM::kLoad64_U64, 1)
+ DEFINE_OP_VM_A(v_loada64_u64, UniOpVM::kLoad64_U64, 8)
+ DEFINE_OP_VM_U(v_loadu64_f32, UniOpVM::kLoad64_F32, 1)
+ DEFINE_OP_VM_A(v_loada64_f32, UniOpVM::kLoad64_F32, 8)
+ DEFINE_OP_VM_U(v_loadu64_f64, UniOpVM::kLoad64_F64, 1)
+ DEFINE_OP_VM_A(v_loada64_f64, UniOpVM::kLoad64_F64, 8)
+ DEFINE_OP_VM_U(v_loadu128, UniOpVM::kLoad128_U32, 1)
+ DEFINE_OP_VM_A(v_loada128, UniOpVM::kLoad128_U32, 16)
+ DEFINE_OP_VM_U(v_loadu128_u32, UniOpVM::kLoad128_U32, 1)
+ DEFINE_OP_VM_A(v_loada128_u32, UniOpVM::kLoad128_U32, 16)
+ DEFINE_OP_VM_U(v_loadu128_u64, UniOpVM::kLoad128_U64, 1)
+ DEFINE_OP_VM_A(v_loada128_u64, UniOpVM::kLoad128_U64, 16)
+ DEFINE_OP_VM_U(v_loadu128_f32, UniOpVM::kLoad128_F32, 1)
+ DEFINE_OP_VM_A(v_loada128_f32, UniOpVM::kLoad128_F32, 16)
+ DEFINE_OP_VM_U(v_loadu128_f64, UniOpVM::kLoad128_F64, 1)
+ DEFINE_OP_VM_A(v_loada128_f64, UniOpVM::kLoad128_F64, 16)
+ DEFINE_OP_VM_U(v_loadu256, UniOpVM::kLoad256_U32, 1)
+ DEFINE_OP_VM_A(v_loada256, UniOpVM::kLoad256_U32, 32)
+ DEFINE_OP_VM_U(v_loadu256_u32, UniOpVM::kLoad256_U32, 1)
+ DEFINE_OP_VM_A(v_loada256_u32, UniOpVM::kLoad256_U32, 32)
+ DEFINE_OP_VM_U(v_loadu256_u64, UniOpVM::kLoad256_U64, 1)
+ DEFINE_OP_VM_A(v_loada256_u64, UniOpVM::kLoad256_U64, 32)
+ DEFINE_OP_VM_U(v_loadu256_f32, UniOpVM::kLoad256_F32, 1)
+ DEFINE_OP_VM_A(v_loada256_f32, UniOpVM::kLoad256_F32, 32)
+ DEFINE_OP_VM_U(v_loadu256_f64, UniOpVM::kLoad256_F64, 1)
+ DEFINE_OP_VM_A(v_loada256_f64, UniOpVM::kLoad256_F64, 32)
+ DEFINE_OP_VM_U(v_loadu512, UniOpVM::kLoad512_U32, 1)
+ DEFINE_OP_VM_A(v_loada512, UniOpVM::kLoad512_U32, 64)
+ DEFINE_OP_VM_U(v_loadu512_u32, UniOpVM::kLoad512_U32, 1)
+ DEFINE_OP_VM_A(v_loada512_u32, UniOpVM::kLoad512_U32, 64)
+ DEFINE_OP_VM_U(v_loadu512_u64, UniOpVM::kLoad512_U64, 1)
+ DEFINE_OP_VM_A(v_loada512_u64, UniOpVM::kLoad512_U64, 64)
+ DEFINE_OP_VM_U(v_loadu512_f32, UniOpVM::kLoad512_F32, 1)
+ DEFINE_OP_VM_A(v_loada512_f32, UniOpVM::kLoad512_F32, 64)
+ DEFINE_OP_VM_U(v_loadu512_f64, UniOpVM::kLoad512_F64, 1)
+ DEFINE_OP_VM_A(v_loada512_f64, UniOpVM::kLoad512_F64, 64)
+ DEFINE_OP_VM_U(v_loaduvec, UniOpVM::kLoadN_U32, 1)
+ DEFINE_OP_VM_A(v_loadavec, UniOpVM::kLoadN_U32, 0)
+ DEFINE_OP_VM_U(v_loaduvec_u32, UniOpVM::kLoadN_U32, 1)
+ DEFINE_OP_VM_A(v_loadavec_u32, UniOpVM::kLoadN_U32, 0)
+ DEFINE_OP_VM_U(v_loaduvec_u64, UniOpVM::kLoadN_U64, 1)
+ DEFINE_OP_VM_A(v_loadavec_u64, UniOpVM::kLoadN_U64, 0)
+ DEFINE_OP_VM_U(v_loaduvec_f32, UniOpVM::kLoadN_F32, 1)
+ DEFINE_OP_VM_A(v_loadavec_f32, UniOpVM::kLoadN_F32, 0)
+ DEFINE_OP_VM_U(v_loaduvec_f64, UniOpVM::kLoadN_F64, 1)
+ DEFINE_OP_VM_A(v_loadavec_f64, UniOpVM::kLoadN_F64, 0)
+
+ DEFINE_OP_VM_A(v_loadu16_u8_to_u64, UniOpVM::kLoadCvt16_U8ToU64, 1)
+ DEFINE_OP_VM_A(v_loada16_u8_to_u64, UniOpVM::kLoadCvt16_U8ToU64, 2)
+ DEFINE_OP_VM_A(v_loadu32_u8_to_u64, UniOpVM::kLoadCvt32_U8ToU64, 1)
+ DEFINE_OP_VM_A(v_loada32_u8_to_u64, UniOpVM::kLoadCvt32_U8ToU64, 2)
+ DEFINE_OP_VM_A(v_loadu64_u8_to_u64, UniOpVM::kLoadCvt64_U8ToU64, 1)
+ DEFINE_OP_VM_A(v_loada64_u8_to_u64, UniOpVM::kLoadCvt64_U8ToU64, 2)
+
+ DEFINE_OP_VM_A(v_loadu32_i8_to_i16, UniOpVM::kLoadCvt32_I8ToI16, 1)
+ DEFINE_OP_VM_A(v_loada32_i8_to_i16, UniOpVM::kLoadCvt32_I8ToI16, 4)
+ DEFINE_OP_VM_A(v_loadu32_u8_to_u16, UniOpVM::kLoadCvt32_U8ToU16, 1)
+ DEFINE_OP_VM_A(v_loada32_u8_to_u16, UniOpVM::kLoadCvt32_U8ToU16, 4)
+ DEFINE_OP_VM_A(v_loadu32_i8_to_i32, UniOpVM::kLoadCvt32_I8ToI32, 1)
+ DEFINE_OP_VM_A(v_loada32_i8_to_i32, UniOpVM::kLoadCvt32_I8ToI32, 4)
+ DEFINE_OP_VM_A(v_loadu32_u8_to_u32, UniOpVM::kLoadCvt32_U8ToU32, 1)
+ DEFINE_OP_VM_A(v_loada32_u8_to_u32, UniOpVM::kLoadCvt32_U8ToU32, 4)
+ DEFINE_OP_VM_A(v_loadu32_i16_to_i32, UniOpVM::kLoadCvt32_I16ToI32, 1)
+ DEFINE_OP_VM_A(v_loada32_i16_to_i32, UniOpVM::kLoadCvt32_I16ToI32, 4)
+ DEFINE_OP_VM_A(v_loadu32_u16_to_u32, UniOpVM::kLoadCvt32_U16ToU32, 1)
+ DEFINE_OP_VM_A(v_loada32_u16_to_u32, UniOpVM::kLoadCvt32_U16ToU32, 4)
+ DEFINE_OP_VM_A(v_loadu32_i32_to_i64, UniOpVM::kLoadCvt32_I32ToI64, 1)
+ DEFINE_OP_VM_A(v_loada32_i32_to_i64, UniOpVM::kLoadCvt32_I32ToI64, 4)
+ DEFINE_OP_VM_A(v_loadu32_u32_to_u64, UniOpVM::kLoadCvt32_U32ToU64, 1)
+ DEFINE_OP_VM_A(v_loada32_u32_to_u64, UniOpVM::kLoadCvt32_U32ToU64, 4)
+ DEFINE_OP_VM_A(v_loadu64_i8_to_i16, UniOpVM::kLoadCvt64_I8ToI16, 1)
+ DEFINE_OP_VM_A(v_loada64_i8_to_i16, UniOpVM::kLoadCvt64_I8ToI16, 8)
+ DEFINE_OP_VM_A(v_loadu64_u8_to_u16, UniOpVM::kLoadCvt64_U8ToU16, 1)
+ DEFINE_OP_VM_A(v_loada64_u8_to_u16, UniOpVM::kLoadCvt64_U8ToU16, 8)
+ DEFINE_OP_VM_A(v_loadu64_i8_to_i32, UniOpVM::kLoadCvt64_I8ToI32, 1)
+ DEFINE_OP_VM_A(v_loada64_i8_to_i32, UniOpVM::kLoadCvt64_I8ToI32, 8)
+ DEFINE_OP_VM_A(v_loadu64_u8_to_u32, UniOpVM::kLoadCvt64_U8ToU32, 1)
+ DEFINE_OP_VM_A(v_loada64_u8_to_u32, UniOpVM::kLoadCvt64_U8ToU32, 8)
+ DEFINE_OP_VM_A(v_loadu64_i16_to_i32, UniOpVM::kLoadCvt64_I16ToI32, 1)
+ DEFINE_OP_VM_A(v_loada64_i16_to_i32, UniOpVM::kLoadCvt64_I16ToI32, 8)
+ DEFINE_OP_VM_A(v_loadu64_u16_to_u32, UniOpVM::kLoadCvt64_U16ToU32, 1)
+ DEFINE_OP_VM_A(v_loada64_u16_to_u32, UniOpVM::kLoadCvt64_U16ToU32, 8)
+ DEFINE_OP_VM_A(v_loadu64_i32_to_i64, UniOpVM::kLoadCvt64_I32ToI64, 1)
+ DEFINE_OP_VM_A(v_loada64_i32_to_i64, UniOpVM::kLoadCvt64_I32ToI64, 8)
+ DEFINE_OP_VM_A(v_loadu64_u32_to_u64, UniOpVM::kLoadCvt64_U32ToU64, 1)
+ DEFINE_OP_VM_A(v_loada64_u32_to_u64, UniOpVM::kLoadCvt64_U32ToU64, 8)
+ DEFINE_OP_VM_A(v_loadu128_i8_to_i16, UniOpVM::kLoadCvt128_I8ToI16, 1)
+ DEFINE_OP_VM_A(v_loada128_i8_to_i16, UniOpVM::kLoadCvt128_I8ToI16, 16)
+ DEFINE_OP_VM_A(v_loadu128_u8_to_u16, UniOpVM::kLoadCvt128_U8ToU16, 1)
+ DEFINE_OP_VM_A(v_loada128_u8_to_u16, UniOpVM::kLoadCvt128_U8ToU16, 16)
+ DEFINE_OP_VM_A(v_loadu128_i8_to_i32, UniOpVM::kLoadCvt128_I8ToI32, 1)
+ DEFINE_OP_VM_A(v_loada128_i8_to_i32, UniOpVM::kLoadCvt128_I8ToI32, 16)
+ DEFINE_OP_VM_A(v_loadu128_u8_to_u32, UniOpVM::kLoadCvt128_U8ToU32, 1)
+ DEFINE_OP_VM_A(v_loada128_u8_to_u32, UniOpVM::kLoadCvt128_U8ToU32, 16)
+ DEFINE_OP_VM_A(v_loadu128_i16_to_i32, UniOpVM::kLoadCvt128_I16ToI32, 1)
+ DEFINE_OP_VM_A(v_loada128_i16_to_i32, UniOpVM::kLoadCvt128_I16ToI32, 16)
+ DEFINE_OP_VM_A(v_loadu128_u16_to_u32, UniOpVM::kLoadCvt128_U16ToU32, 1)
+ DEFINE_OP_VM_A(v_loada128_u16_to_u32, UniOpVM::kLoadCvt128_U16ToU32, 16)
+ DEFINE_OP_VM_A(v_loadu128_i32_to_i64, UniOpVM::kLoadCvt128_I32ToI64, 1)
+ DEFINE_OP_VM_A(v_loada128_i32_to_i64, UniOpVM::kLoadCvt128_I32ToI64, 16)
+ DEFINE_OP_VM_A(v_loadu128_u32_to_u64, UniOpVM::kLoadCvt128_U32ToU64, 1)
+ DEFINE_OP_VM_A(v_loada128_u32_to_u64, UniOpVM::kLoadCvt128_U32ToU64, 16)
+ DEFINE_OP_VM_A(v_loadu256_i8_to_i16, UniOpVM::kLoadCvt256_I8ToI16, 1)
+ DEFINE_OP_VM_A(v_loada256_i8_to_i16, UniOpVM::kLoadCvt256_I8ToI16, 32)
+ DEFINE_OP_VM_A(v_loadu256_u8_to_u16, UniOpVM::kLoadCvt256_U8ToU16, 1)
+ DEFINE_OP_VM_A(v_loada256_u8_to_u16, UniOpVM::kLoadCvt256_U8ToU16, 32)
+ DEFINE_OP_VM_A(v_loadu256_i16_to_i32, UniOpVM::kLoadCvt256_I16ToI32, 1)
+ DEFINE_OP_VM_A(v_loada256_i16_to_i32, UniOpVM::kLoadCvt256_I16ToI32, 32)
+ DEFINE_OP_VM_A(v_loadu256_u16_to_u32, UniOpVM::kLoadCvt256_U16ToU32, 1)
+ DEFINE_OP_VM_A(v_loada256_u16_to_u32, UniOpVM::kLoadCvt256_U16ToU32, 32)
+ DEFINE_OP_VM_A(v_loadu256_i32_to_i64, UniOpVM::kLoadCvt256_I32ToI64, 1)
+ DEFINE_OP_VM_A(v_loada256_i32_to_i64, UniOpVM::kLoadCvt256_I32ToI64, 32)
+ DEFINE_OP_VM_A(v_loadu256_u32_to_u64, UniOpVM::kLoadCvt256_U32ToU64, 1)
+ DEFINE_OP_VM_A(v_loada256_u32_to_u64, UniOpVM::kLoadCvt256_U32ToU64, 32)
+ DEFINE_OP_VM_A(v_loaduvec_i8_to_i16, UniOpVM::kLoadCvtN_I8ToI16, 1)
+ DEFINE_OP_VM_A(v_loadavec_i8_to_i16, UniOpVM::kLoadCvtN_I8ToI16, 0)
+ DEFINE_OP_VM_A(v_loaduvec_u8_to_u16, UniOpVM::kLoadCvtN_U8ToU16, 1)
+ DEFINE_OP_VM_A(v_loadavec_u8_to_u16, UniOpVM::kLoadCvtN_U8ToU16, 0)
+ DEFINE_OP_VM_A(v_loaduvec_i8_to_i32, UniOpVM::kLoadCvtN_I8ToI32, 1)
+ DEFINE_OP_VM_A(v_loadavec_i8_to_i32, UniOpVM::kLoadCvtN_I8ToI32, 0)
+ DEFINE_OP_VM_A(v_loaduvec_u8_to_u32, UniOpVM::kLoadCvtN_U8ToU32, 1)
+ DEFINE_OP_VM_A(v_loadavec_u8_to_u32, UniOpVM::kLoadCvtN_U8ToU32, 0)
+ DEFINE_OP_VM_A(v_loaduvec_u8_to_u64, UniOpVM::kLoadCvtN_U8ToU64, 1)
+ DEFINE_OP_VM_A(v_loadavec_u8_to_u64, UniOpVM::kLoadCvtN_U8ToU64, 0)
+ DEFINE_OP_VM_A(v_loaduvec_i16_to_i32, UniOpVM::kLoadCvtN_I16ToI32, 1)
+ DEFINE_OP_VM_A(v_loadavec_i16_to_i32, UniOpVM::kLoadCvtN_I16ToI32, 0)
+ DEFINE_OP_VM_A(v_loaduvec_u16_to_u32, UniOpVM::kLoadCvtN_U16ToU32, 1)
+ DEFINE_OP_VM_A(v_loadavec_u16_to_u32, UniOpVM::kLoadCvtN_U16ToU32, 0)
+ DEFINE_OP_VM_A(v_loaduvec_i32_to_i64, UniOpVM::kLoadCvtN_I32ToI64, 1)
+ DEFINE_OP_VM_A(v_loadavec_i32_to_i64, UniOpVM::kLoadCvtN_I32ToI64, 0)
+ DEFINE_OP_VM_A(v_loaduvec_u32_to_u64, UniOpVM::kLoadCvtN_U32ToU64, 1)
+ DEFINE_OP_VM_A(v_loadavec_u32_to_u64, UniOpVM::kLoadCvtN_U32ToU64, 0)
+
+ DEFINE_OP_VM_I(v_insert_u8, UniOpVM::kLoadInsertU8, 1)
+ DEFINE_OP_VM_I(v_insert_u16, UniOpVM::kLoadInsertU16, 1)
+ DEFINE_OP_VM_I(v_insert_u32, UniOpVM::kLoadInsertU32, 1)
+ DEFINE_OP_VM_I(v_insert_u64, UniOpVM::kLoadInsertU64, 1)
+ DEFINE_OP_VM_I(v_insert_f32, UniOpVM::kLoadInsertF32, 1)
+ DEFINE_OP_VM_I(v_insert_f32x2, UniOpVM::kLoadInsertF32x2, 1)
+ DEFINE_OP_VM_I(v_insert_f64, UniOpVM::kLoadInsertF64, 1)
+
+ DEFINE_OP_MV_U(v_store8, UniOpMV::kStore8, 1)
+ DEFINE_OP_MV_U(v_storeu16, UniOpMV::kStore16_U16, 1)
+ DEFINE_OP_MV_A(v_storea16, UniOpMV::kStore16_U16, 2)
+ DEFINE_OP_MV_U(v_storeu32, UniOpMV::kStore32_U32, 1)
+ DEFINE_OP_MV_A(v_storea32, UniOpMV::kStore32_U32, 4)
+ DEFINE_OP_MV_U(v_storeu32_u32, UniOpMV::kStore32_U32, 1)
+ DEFINE_OP_MV_A(v_storea32_u32, UniOpMV::kStore32_U32, 4)
+ DEFINE_OP_MV_U(v_storeu32_f32, UniOpMV::kStore32_F32, 1)
+ DEFINE_OP_MV_A(v_storea32_f32, UniOpMV::kStore32_F32, 4)
+ DEFINE_OP_MV_U(v_storeu64, UniOpMV::kStore64_U32, 1)
+ DEFINE_OP_MV_A(v_storea64, UniOpMV::kStore64_U32, 8)
+ DEFINE_OP_MV_U(v_storeu64_u32, UniOpMV::kStore64_U32, 1)
+ DEFINE_OP_MV_A(v_storea64_u32, UniOpMV::kStore64_U32, 8)
+ DEFINE_OP_MV_U(v_storeu64_u64, UniOpMV::kStore64_U64, 1)
+ DEFINE_OP_MV_A(v_storea64_u64, UniOpMV::kStore64_U64, 8)
+ DEFINE_OP_MV_U(v_storeu64_f32, UniOpMV::kStore64_F32, 1)
+ DEFINE_OP_MV_A(v_storea64_f32, UniOpMV::kStore64_F32, 8)
+ DEFINE_OP_MV_U(v_storeu64_f64, UniOpMV::kStore64_F64, 1)
+ DEFINE_OP_MV_A(v_storea64_f64, UniOpMV::kStore64_F64, 8)
+ DEFINE_OP_MV_U(v_storeu128, UniOpMV::kStore128_U32, 1)
+ DEFINE_OP_MV_A(v_storea128, UniOpMV::kStore128_U32, 16)
+ DEFINE_OP_MV_U(v_storeu128_u32, UniOpMV::kStore128_U32, 1)
+ DEFINE_OP_MV_A(v_storea128_u32, UniOpMV::kStore128_U32, 16)
+ DEFINE_OP_MV_U(v_storeu128_u64, UniOpMV::kStore128_U64, 1)
+ DEFINE_OP_MV_A(v_storea128_u64, UniOpMV::kStore128_U64, 16)
+ DEFINE_OP_MV_U(v_storeu128_f32, UniOpMV::kStore128_F32, 1)
+ DEFINE_OP_MV_A(v_storea128_f32, UniOpMV::kStore128_F32, 16)
+ DEFINE_OP_MV_U(v_storeu128_f64, UniOpMV::kStore128_F64, 1)
+ DEFINE_OP_MV_A(v_storea128_f64, UniOpMV::kStore128_F64, 16)
+ DEFINE_OP_MV_U(v_storeu256, UniOpMV::kStore256_U32, 1)
+ DEFINE_OP_MV_A(v_storea256, UniOpMV::kStore256_U32, 32)
+ DEFINE_OP_MV_U(v_storeu256_u32, UniOpMV::kStore256_U32, 1)
+ DEFINE_OP_MV_A(v_storea256_u32, UniOpMV::kStore256_U32, 32)
+ DEFINE_OP_MV_U(v_storeu256_u64, UniOpMV::kStore256_U64, 1)
+ DEFINE_OP_MV_A(v_storea256_u64, UniOpMV::kStore256_U64, 32)
+ DEFINE_OP_MV_U(v_storeu256_f32, UniOpMV::kStore256_F32, 1)
+ DEFINE_OP_MV_A(v_storea256_f32, UniOpMV::kStore256_F32, 32)
+ DEFINE_OP_MV_U(v_storeu256_f64, UniOpMV::kStore256_F64, 1)
+ DEFINE_OP_MV_A(v_storea256_f64, UniOpMV::kStore256_F64, 32)
+ DEFINE_OP_MV_U(v_storeu512, UniOpMV::kStore512_U32, 1)
+ DEFINE_OP_MV_A(v_storea512, UniOpMV::kStore512_U32, 64)
+ DEFINE_OP_MV_U(v_storeu512_u32, UniOpMV::kStore512_U32, 1)
+ DEFINE_OP_MV_A(v_storea512_u32, UniOpMV::kStore512_U32, 64)
+ DEFINE_OP_MV_U(v_storeu512_u64, UniOpMV::kStore512_U64, 1)
+ DEFINE_OP_MV_A(v_storea512_u64, UniOpMV::kStore512_U64, 64)
+ DEFINE_OP_MV_U(v_storeu512_f32, UniOpMV::kStore512_F32, 1)
+ DEFINE_OP_MV_A(v_storea512_f32, UniOpMV::kStore512_F32, 64)
+ DEFINE_OP_MV_U(v_storeu512_f64, UniOpMV::kStore512_F64, 1)
+ DEFINE_OP_MV_A(v_storea512_f64, UniOpMV::kStore512_F64, 64)
+ DEFINE_OP_MV_U(v_storeuvec, UniOpMV::kStoreN_U32, 1)
+ DEFINE_OP_MV_A(v_storeavec, UniOpMV::kStoreN_U32, 0)
+ DEFINE_OP_MV_U(v_storeuvec_u32, UniOpMV::kStoreN_U32, 1)
+ DEFINE_OP_MV_A(v_storeavec_u32, UniOpMV::kStoreN_U32, 0)
+ DEFINE_OP_MV_U(v_storeuvec_u64, UniOpMV::kStoreN_U64, 1)
+ DEFINE_OP_MV_A(v_storeavec_u64, UniOpMV::kStoreN_U64, 0)
+ DEFINE_OP_MV_U(v_storeuvec_f32, UniOpMV::kStoreN_F32, 1)
+ DEFINE_OP_MV_A(v_storeavec_f32, UniOpMV::kStoreN_F32, 0)
+ DEFINE_OP_MV_U(v_storeuvec_f64, UniOpMV::kStoreN_F64, 1)
+ DEFINE_OP_MV_A(v_storeavec_f64, UniOpMV::kStoreN_F64, 0)
+
+ DEFINE_OP_MV_I(v_store_extract_u16, UniOpMV::kStoreExtractU16, 1)
+ DEFINE_OP_MV_I(v_store_extract_u32, UniOpMV::kStoreExtractU32, 1)
+ DEFINE_OP_MV_I(v_store_extract_u64, UniOpMV::kStoreExtractU64, 1)
+
+ DEFINE_OP_3V(v_and_i32, UniOpVVV::kAndU32)
+ DEFINE_OP_3V(v_and_u32, UniOpVVV::kAndU32)
+ DEFINE_OP_3V(v_and_i64, UniOpVVV::kAndU64)
+ DEFINE_OP_3V(v_and_u64, UniOpVVV::kAndU64)
+ DEFINE_OP_3V(v_or_i32, UniOpVVV::kOrU32)
+ DEFINE_OP_3V(v_or_u32, UniOpVVV::kOrU32)
+ DEFINE_OP_3V(v_or_i64, UniOpVVV::kOrU64)
+ DEFINE_OP_3V(v_or_u64, UniOpVVV::kOrU64)
+ DEFINE_OP_3V(v_xor_i32, UniOpVVV::kXorU32)
+ DEFINE_OP_3V(v_xor_u32, UniOpVVV::kXorU32)
+ DEFINE_OP_3V(v_xor_i64, UniOpVVV::kXorU64)
+ DEFINE_OP_3V(v_xor_u64, UniOpVVV::kXorU64)
+ DEFINE_OP_3V(v_andn_i32, UniOpVVV::kAndnU32)
+ DEFINE_OP_3V(v_andn_u32, UniOpVVV::kAndnU32)
+ DEFINE_OP_3V(v_andn_i64, UniOpVVV::kAndnU64)
+ DEFINE_OP_3V(v_andn_u64, UniOpVVV::kAndnU64)
+ DEFINE_OP_3V(v_bic_i32, UniOpVVV::kBicU32)
+ DEFINE_OP_3V(v_bic_u32, UniOpVVV::kBicU32)
+ DEFINE_OP_3V(v_bic_i64, UniOpVVV::kBicU64)
+ DEFINE_OP_3V(v_bic_u64, UniOpVVV::kBicU64)
+ DEFINE_OP_3V(v_avgr_u8, UniOpVVV::kAvgrU8)
+ DEFINE_OP_3V(v_avgr_u16, UniOpVVV::kAvgrU16)
+ DEFINE_OP_3V(v_add_i8, UniOpVVV::kAddU8)
+ DEFINE_OP_3V(v_add_u8, UniOpVVV::kAddU8)
+ DEFINE_OP_3V(v_add_i16, UniOpVVV::kAddU16)
+ DEFINE_OP_3V(v_add_u16, UniOpVVV::kAddU16)
+ DEFINE_OP_3V(v_add_i32, UniOpVVV::kAddU32)
+ DEFINE_OP_3V(v_add_u32, UniOpVVV::kAddU32)
+ DEFINE_OP_3V(v_add_i64, UniOpVVV::kAddU64)
+ DEFINE_OP_3V(v_add_u64, UniOpVVV::kAddU64)
+ DEFINE_OP_3V(v_sub_i8, UniOpVVV::kSubU8)
+ DEFINE_OP_3V(v_sub_u8, UniOpVVV::kSubU8)
+ DEFINE_OP_3V(v_sub_i16, UniOpVVV::kSubU16)
+ DEFINE_OP_3V(v_sub_u16, UniOpVVV::kSubU16)
+ DEFINE_OP_3V(v_sub_i32, UniOpVVV::kSubU32)
+ DEFINE_OP_3V(v_sub_u32, UniOpVVV::kSubU32)
+ DEFINE_OP_3V(v_sub_i64, UniOpVVV::kSubU64)
+ DEFINE_OP_3V(v_sub_u64, UniOpVVV::kSubU64)
+ DEFINE_OP_3V(v_adds_i8, UniOpVVV::kAddsI8)
+ DEFINE_OP_3V(v_adds_i16, UniOpVVV::kAddsI16)
+ DEFINE_OP_3V(v_adds_u8, UniOpVVV::kAddsU8)
+ DEFINE_OP_3V(v_adds_u16, UniOpVVV::kAddsU16)
+ DEFINE_OP_3V(v_subs_i8, UniOpVVV::kSubsI8)
+ DEFINE_OP_3V(v_subs_i16, UniOpVVV::kSubsI16)
+ DEFINE_OP_3V(v_subs_u8, UniOpVVV::kSubsU8)
+ DEFINE_OP_3V(v_subs_u16, UniOpVVV::kSubsU16)
+ DEFINE_OP_3V(v_mul_i16, UniOpVVV::kMulU16)
+ DEFINE_OP_3V(v_mul_u16, UniOpVVV::kMulU16)
+ DEFINE_OP_3V(v_mul_i32, UniOpVVV::kMulU32)
+ DEFINE_OP_3V(v_mul_u32, UniOpVVV::kMulU32)
+ DEFINE_OP_3V(v_mul_i64, UniOpVVV::kMulU64)
+ DEFINE_OP_3V(v_mul_u64, UniOpVVV::kMulU64)
+ DEFINE_OP_3V(v_mul_u64_lo_u32, UniOpVVV::kMulU64_LoU32)
+ DEFINE_OP_3V(v_mulh_i16, UniOpVVV::kMulhI16)
+ DEFINE_OP_3V(v_mulh_u16, UniOpVVV::kMulhU16)
+ DEFINE_OP_3V(v_mhadd_i16_to_i32, UniOpVVV::kMHAddI16_I32)
+ DEFINE_OP_3V(v_min_i8, UniOpVVV::kMinI8)
+ DEFINE_OP_3V(v_min_i16, UniOpVVV::kMinI16)
+ DEFINE_OP_3V(v_min_i32, UniOpVVV::kMinI32)
+ DEFINE_OP_3V(v_min_i64, UniOpVVV::kMinI64)
+ DEFINE_OP_3V(v_min_u8, UniOpVVV::kMinU8)
+ DEFINE_OP_3V(v_min_u16, UniOpVVV::kMinU16)
+ DEFINE_OP_3V(v_min_u32, UniOpVVV::kMinU32)
+ DEFINE_OP_3V(v_min_u64, UniOpVVV::kMinU64)
+ DEFINE_OP_3V(v_max_i8, UniOpVVV::kMaxI8)
+ DEFINE_OP_3V(v_max_i16, UniOpVVV::kMaxI16)
+ DEFINE_OP_3V(v_max_i32, UniOpVVV::kMaxI32)
+ DEFINE_OP_3V(v_max_i64, UniOpVVV::kMaxI64)
+ DEFINE_OP_3V(v_max_u8, UniOpVVV::kMaxU8)
+ DEFINE_OP_3V(v_max_u16, UniOpVVV::kMaxU16)
+ DEFINE_OP_3V(v_max_u32, UniOpVVV::kMaxU32)
+ DEFINE_OP_3V(v_max_u64, UniOpVVV::kMaxU64)
+ DEFINE_OP_3V(v_cmp_eq_i8, UniOpVVV::kCmpEqU8)
+ DEFINE_OP_3V(v_cmp_eq_u8, UniOpVVV::kCmpEqU8)
+ DEFINE_OP_3V(v_cmp_eq_i16, UniOpVVV::kCmpEqU16)
+ DEFINE_OP_3V(v_cmp_eq_u16, UniOpVVV::kCmpEqU16)
+ DEFINE_OP_3V(v_cmp_eq_i32, UniOpVVV::kCmpEqU32)
+ DEFINE_OP_3V(v_cmp_eq_u32, UniOpVVV::kCmpEqU32)
+ DEFINE_OP_3V(v_cmp_eq_i64, UniOpVVV::kCmpEqU64)
+ DEFINE_OP_3V(v_cmp_eq_u64, UniOpVVV::kCmpEqU64)
+ DEFINE_OP_3V(v_cmp_gt_i8, UniOpVVV::kCmpGtI8)
+ DEFINE_OP_3V(v_cmp_gt_u8, UniOpVVV::kCmpGtU8)
+ DEFINE_OP_3V(v_cmp_gt_i16, UniOpVVV::kCmpGtI16)
+ DEFINE_OP_3V(v_cmp_gt_u16, UniOpVVV::kCmpGtU16)
+ DEFINE_OP_3V(v_cmp_gt_i32, UniOpVVV::kCmpGtI32)
+ DEFINE_OP_3V(v_cmp_gt_u32, UniOpVVV::kCmpGtU32)
+ DEFINE_OP_3V(v_cmp_gt_i64, UniOpVVV::kCmpGtI64)
+ DEFINE_OP_3V(v_cmp_gt_u64, UniOpVVV::kCmpGtU64)
+ DEFINE_OP_3V(v_cmp_ge_i8, UniOpVVV::kCmpGeI8)
+ DEFINE_OP_3V(v_cmp_ge_u8, UniOpVVV::kCmpGeU8)
+ DEFINE_OP_3V(v_cmp_ge_i16, UniOpVVV::kCmpGeI16)
+ DEFINE_OP_3V(v_cmp_ge_u16, UniOpVVV::kCmpGeU16)
+ DEFINE_OP_3V(v_cmp_ge_i32, UniOpVVV::kCmpGeI32)
+ DEFINE_OP_3V(v_cmp_ge_u32, UniOpVVV::kCmpGeU32)
+ DEFINE_OP_3V(v_cmp_ge_i64, UniOpVVV::kCmpGeI64)
+ DEFINE_OP_3V(v_cmp_ge_u64, UniOpVVV::kCmpGeU64)
+ DEFINE_OP_3V(v_cmp_lt_i8, UniOpVVV::kCmpLtI8)
+ DEFINE_OP_3V(v_cmp_lt_u8, UniOpVVV::kCmpLtU8)
+ DEFINE_OP_3V(v_cmp_lt_i16, UniOpVVV::kCmpLtI16)
+ DEFINE_OP_3V(v_cmp_lt_u16, UniOpVVV::kCmpLtU16)
+ DEFINE_OP_3V(v_cmp_lt_i32, UniOpVVV::kCmpLtI32)
+ DEFINE_OP_3V(v_cmp_lt_u32, UniOpVVV::kCmpLtU32)
+ DEFINE_OP_3V(v_cmp_lt_i64, UniOpVVV::kCmpLtI64)
+ DEFINE_OP_3V(v_cmp_lt_u64, UniOpVVV::kCmpLtU64)
+ DEFINE_OP_3V(v_cmp_le_i8, UniOpVVV::kCmpLeI8)
+ DEFINE_OP_3V(v_cmp_le_u8, UniOpVVV::kCmpLeU8)
+ DEFINE_OP_3V(v_cmp_le_i16, UniOpVVV::kCmpLeI16)
+ DEFINE_OP_3V(v_cmp_le_u16, UniOpVVV::kCmpLeU16)
+ DEFINE_OP_3V(v_cmp_le_i32, UniOpVVV::kCmpLeI32)
+ DEFINE_OP_3V(v_cmp_le_u32, UniOpVVV::kCmpLeU32)
+ DEFINE_OP_3V(v_cmp_le_i64, UniOpVVV::kCmpLeI64)
+ DEFINE_OP_3V(v_cmp_le_u64, UniOpVVV::kCmpLeU64)
+ DEFINE_OP_3V(v_and_f32, UniOpVVV::kAndF32)
+ DEFINE_OP_3V(v_and_f64, UniOpVVV::kAndF64)
+ DEFINE_OP_3V(v_or_f32, UniOpVVV::kOrF32)
+ DEFINE_OP_3V(v_or_f64, UniOpVVV::kOrF64)
+ DEFINE_OP_3V(v_xor_f32, UniOpVVV::kXorF32)
+ DEFINE_OP_3V(v_xor_f64, UniOpVVV::kXorF64)
+ DEFINE_OP_3V(v_andn_f32, UniOpVVV::kAndnF32)
+ DEFINE_OP_3V(v_andn_f64, UniOpVVV::kAndnF64)
+ DEFINE_OP_3V(v_bic_f32, UniOpVVV::kBicF32)
+ DEFINE_OP_3V(v_bic_f64, UniOpVVV::kBicF64)
+ DEFINE_OP_3V(s_add_f32, UniOpVVV::kAddF32S)
+ DEFINE_OP_3V(s_add_f64, UniOpVVV::kAddF64S)
+ DEFINE_OP_3V(v_add_f32, UniOpVVV::kAddF32)
+ DEFINE_OP_3V(v_add_f64, UniOpVVV::kAddF64)
+ DEFINE_OP_3V(s_sub_f32, UniOpVVV::kSubF32S)
+ DEFINE_OP_3V(s_sub_f64, UniOpVVV::kSubF64S)
+ DEFINE_OP_3V(v_sub_f32, UniOpVVV::kSubF32)
+ DEFINE_OP_3V(v_sub_f64, UniOpVVV::kSubF64)
+ DEFINE_OP_3V(s_mul_f32, UniOpVVV::kMulF32S)
+ DEFINE_OP_3V(s_mul_f64, UniOpVVV::kMulF64S)
+ DEFINE_OP_3V(v_mul_f32, UniOpVVV::kMulF32)
+ DEFINE_OP_3V(v_mul_f64, UniOpVVV::kMulF64)
+ DEFINE_OP_3V(s_div_f32, UniOpVVV::kDivF32S)
+ DEFINE_OP_3V(s_div_f64, UniOpVVV::kDivF64S)
+ DEFINE_OP_3V(v_div_f32, UniOpVVV::kDivF32)
+ DEFINE_OP_3V(v_div_f64, UniOpVVV::kDivF64)
+ DEFINE_OP_3V(s_mod_f32, UniOpVVV::kModF32S)
+ DEFINE_OP_3V(s_mod_f64, UniOpVVV::kModF64S)
+ DEFINE_OP_3V(v_mod_f32, UniOpVVV::kModF32)
+ DEFINE_OP_3V(v_mod_f64, UniOpVVV::kModF64)
+ DEFINE_OP_3V(s_min_f32, UniOpVVV::kMinF32S)
+ DEFINE_OP_3V(s_min_f64, UniOpVVV::kMinF64S)
+ DEFINE_OP_3V(v_min_f32, UniOpVVV::kMinF32)
+ DEFINE_OP_3V(v_min_f64, UniOpVVV::kMinF64)
+ DEFINE_OP_3V(s_max_f32, UniOpVVV::kMaxF32S)
+ DEFINE_OP_3V(s_max_f64, UniOpVVV::kMaxF64S)
+ DEFINE_OP_3V(v_max_f32, UniOpVVV::kMaxF32)
+ DEFINE_OP_3V(v_max_f64, UniOpVVV::kMaxF64)
+ DEFINE_OP_3V(s_cmp_eq_f32, UniOpVVV::kCmpEqF32S)
+ DEFINE_OP_3V(s_cmp_eq_f64, UniOpVVV::kCmpEqF64S)
+ DEFINE_OP_3V(v_cmp_eq_f32, UniOpVVV::kCmpEqF32)
+ DEFINE_OP_3V(v_cmp_eq_f64, UniOpVVV::kCmpEqF64)
+ DEFINE_OP_3V(s_cmp_ne_f32, UniOpVVV::kCmpNeF32S)
+ DEFINE_OP_3V(s_cmp_ne_f64, UniOpVVV::kCmpNeF64S)
+ DEFINE_OP_3V(v_cmp_ne_f32, UniOpVVV::kCmpNeF32)
+ DEFINE_OP_3V(v_cmp_ne_f64, UniOpVVV::kCmpNeF64)
+ DEFINE_OP_3V(s_cmp_gt_f32, UniOpVVV::kCmpGtF32S)
+ DEFINE_OP_3V(s_cmp_gt_f64, UniOpVVV::kCmpGtF64S)
+ DEFINE_OP_3V(v_cmp_gt_f32, UniOpVVV::kCmpGtF32)
+ DEFINE_OP_3V(v_cmp_gt_f64, UniOpVVV::kCmpGtF64)
+ DEFINE_OP_3V(s_cmp_ge_f32, UniOpVVV::kCmpGeF32S)
+ DEFINE_OP_3V(s_cmp_ge_f64, UniOpVVV::kCmpGeF64S)
+ DEFINE_OP_3V(v_cmp_ge_f32, UniOpVVV::kCmpGeF32)
+ DEFINE_OP_3V(v_cmp_ge_f64, UniOpVVV::kCmpGeF64)
+ DEFINE_OP_3V(s_cmp_lt_f32, UniOpVVV::kCmpLtF32S)
+ DEFINE_OP_3V(s_cmp_lt_f64, UniOpVVV::kCmpLtF64S)
+ DEFINE_OP_3V(v_cmp_lt_f32, UniOpVVV::kCmpLtF32)
+ DEFINE_OP_3V(v_cmp_lt_f64, UniOpVVV::kCmpLtF64)
+ DEFINE_OP_3V(s_cmp_le_f32, UniOpVVV::kCmpLeF32S)
+ DEFINE_OP_3V(s_cmp_le_f64, UniOpVVV::kCmpLeF64S)
+ DEFINE_OP_3V(v_cmp_le_f32, UniOpVVV::kCmpLeF32)
+ DEFINE_OP_3V(v_cmp_le_f64, UniOpVVV::kCmpLeF64)
+ DEFINE_OP_3V(s_cmp_ord_f32, UniOpVVV::kCmpOrdF32S)
+ DEFINE_OP_3V(s_cmp_ord_f64, UniOpVVV::kCmpOrdF64S)
+ DEFINE_OP_3V(v_cmp_ord_f32, UniOpVVV::kCmpOrdF32)
+ DEFINE_OP_3V(v_cmp_ord_f64, UniOpVVV::kCmpOrdF64)
+ DEFINE_OP_3V(s_cmp_unord_f32, UniOpVVV::kCmpUnordF32S)
+ DEFINE_OP_3V(s_cmp_unord_f64, UniOpVVV::kCmpUnordF64S)
+ DEFINE_OP_3V(v_cmp_unord_f32, UniOpVVV::kCmpUnordF32)
+ DEFINE_OP_3V(v_cmp_unord_f64, UniOpVVV::kCmpUnordF64)
+ DEFINE_OP_3V(v_hadd_f64, UniOpVVV::kHAddF64);
+ DEFINE_OP_3V(v_combine_lo_hi_u64, UniOpVVV::kCombineLoHiU64)
+ DEFINE_OP_3V(v_combine_lo_hi_f64, UniOpVVV::kCombineLoHiF64)
+ DEFINE_OP_3V(v_combine_hi_lo_u64, UniOpVVV::kCombineHiLoU64)
+ DEFINE_OP_3V(v_combine_hi_lo_f64, UniOpVVV::kCombineHiLoF64)
+ DEFINE_OP_3V(v_interleave_lo_u8, UniOpVVV::kInterleaveLoU8)
+ DEFINE_OP_3V(v_interleave_hi_u8, UniOpVVV::kInterleaveHiU8)
+ DEFINE_OP_3V(v_interleave_lo_u16, UniOpVVV::kInterleaveLoU16)
+ DEFINE_OP_3V(v_interleave_hi_u16, UniOpVVV::kInterleaveHiU16)
+ DEFINE_OP_3V(v_interleave_lo_u32, UniOpVVV::kInterleaveLoU32)
+ DEFINE_OP_3V(v_interleave_hi_u32, UniOpVVV::kInterleaveHiU32)
+ DEFINE_OP_3V(v_interleave_lo_u64, UniOpVVV::kInterleaveLoU64)
+ DEFINE_OP_3V(v_interleave_hi_u64, UniOpVVV::kInterleaveHiU64)
+ DEFINE_OP_3V(v_interleave_lo_f32, UniOpVVV::kInterleaveLoF32)
+ DEFINE_OP_3V(v_interleave_hi_f32, UniOpVVV::kInterleaveHiF32)
+ DEFINE_OP_3V(v_interleave_lo_f64, UniOpVVV::kInterleaveLoF64)
+ DEFINE_OP_3V(v_interleave_hi_f64, UniOpVVV::kInterleaveHiF64)
+ DEFINE_OP_3V(v_packs_i16_i8, UniOpVVV::kPacksI16_I8)
+ DEFINE_OP_3V(v_packs_i16_u8, UniOpVVV::kPacksI16_U8)
+ DEFINE_OP_3V(v_packs_i32_i16, UniOpVVV::kPacksI32_I16)
+ DEFINE_OP_3V(v_packs_i32_u16, UniOpVVV::kPacksI32_U16)
+ DEFINE_OP_3V(v_swizzlev_u8, UniOpVVV::kSwizzlev_U8)
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ DEFINE_OP_3V(v_mulw_lo_i8, UniOpVVV::kMulwLoI8)
+ DEFINE_OP_3V(v_mulw_lo_u8, UniOpVVV::kMulwLoU8)
+ DEFINE_OP_3V(v_mulw_hi_i8, UniOpVVV::kMulwHiI8)
+ DEFINE_OP_3V(v_mulw_hi_u8, UniOpVVV::kMulwHiU8)
+ DEFINE_OP_3V(v_mulw_lo_i16, UniOpVVV::kMulwLoI16)
+ DEFINE_OP_3V(v_mulw_lo_u16, UniOpVVV::kMulwLoU16)
+ DEFINE_OP_3V(v_mulw_hi_i16, UniOpVVV::kMulwHiI16)
+ DEFINE_OP_3V(v_mulw_hi_u16, UniOpVVV::kMulwHiU16)
+ DEFINE_OP_3V(v_mulw_lo_i32, UniOpVVV::kMulwLoI32)
+ DEFINE_OP_3V(v_mulw_lo_u32, UniOpVVV::kMulwLoU32)
+ DEFINE_OP_3V(v_mulw_hi_i32, UniOpVVV::kMulwHiI32)
+ DEFINE_OP_3V(v_mulw_hi_u32, UniOpVVV::kMulwHiU32)
+ DEFINE_OP_3V(v_maddw_lo_i8, UniOpVVV::kMAddwLoI8)
+ DEFINE_OP_3V(v_maddw_lo_u8, UniOpVVV::kMAddwLoU8)
+ DEFINE_OP_3V(v_maddw_hi_i8, UniOpVVV::kMAddwHiI8)
+ DEFINE_OP_3V(v_maddw_hi_u8, UniOpVVV::kMAddwHiU8)
+ DEFINE_OP_3V(v_maddw_lo_i16, UniOpVVV::kMAddwLoI16)
+ DEFINE_OP_3V(v_maddw_lo_u16, UniOpVVV::kMAddwLoU16)
+ DEFINE_OP_3V(v_maddw_hi_i16, UniOpVVV::kMAddwHiI16)
+ DEFINE_OP_3V(v_maddw_hi_u16, UniOpVVV::kMAddwHiU16)
+ DEFINE_OP_3V(v_maddw_lo_i32, UniOpVVV::kMAddwLoI32)
+ DEFINE_OP_3V(v_maddw_lo_u32, UniOpVVV::kMAddwLoU32)
+ DEFINE_OP_3V(v_maddw_hi_i32, UniOpVVV::kMAddwHiI32)
+ DEFINE_OP_3V(v_maddw_hi_u32, UniOpVVV::kMAddwHiU32)
+#endif // ASMJIT_UJIT_AARCH64
+
+#if defined(ASMJIT_UJIT_X86)
+ DEFINE_OP_3V(v_permute_u8, UniOpVVV::kPermuteU8)
+ DEFINE_OP_3V(v_permute_u16, UniOpVVV::kPermuteU16)
+ DEFINE_OP_3V(v_permute_u32, UniOpVVV::kPermuteU32)
+ DEFINE_OP_3V(v_permute_u64, UniOpVVV::kPermuteU64)
+#endif // ASMJIT_UJIT_X86
+
+ DEFINE_OP_3VI(v_alignr_u128, UniOpVVVI::kAlignr_U128)
+ DEFINE_OP_3VI_WRAP(v_interleave_shuffle_u32x4, Swizzle4, UniOpVVVI::kInterleaveShuffleU32x4)
+ DEFINE_OP_3VI_WRAP(v_interleave_shuffle_u64x2, Swizzle2, UniOpVVVI::kInterleaveShuffleU64x2)
+ DEFINE_OP_3VI_WRAP(v_interleave_shuffle_f32x4, Swizzle4, UniOpVVVI::kInterleaveShuffleF32x4)
+ DEFINE_OP_3VI_WRAP(v_interleave_shuffle_f64x2, Swizzle2, UniOpVVVI::kInterleaveShuffleF64x2)
+ DEFINE_OP_3VI(v_insert_v128, UniOpVVVI::kInsertV128_U32)
+ DEFINE_OP_3VI(v_insert_v128_u32, UniOpVVVI::kInsertV128_U32)
+ DEFINE_OP_3VI(v_insert_v128_f32, UniOpVVVI::kInsertV128_F32)
+ DEFINE_OP_3VI(v_insert_v128_u64, UniOpVVVI::kInsertV128_U64)
+ DEFINE_OP_3VI(v_insert_v128_f64, UniOpVVVI::kInsertV128_F64)
+ DEFINE_OP_3VI(v_insert_v256, UniOpVVVI::kInsertV256_U32)
+ DEFINE_OP_3VI(v_insert_v256_u32, UniOpVVVI::kInsertV256_U32)
+ DEFINE_OP_3VI(v_insert_v256_f32, UniOpVVVI::kInsertV256_F32)
+ DEFINE_OP_3VI(v_insert_v256_u64, UniOpVVVI::kInsertV256_U64)
+ DEFINE_OP_3VI(v_insert_v256_f64, UniOpVVVI::kInsertV256_F64)
+
+ DEFINE_OP_4V(v_blendv_u8, UniOpVVVV::kBlendV_U8)
+ DEFINE_OP_4V(v_madd_i16, UniOpVVVV::kMAddU16)
+ DEFINE_OP_4V(v_madd_u16, UniOpVVVV::kMAddU16)
+ DEFINE_OP_4V(v_madd_i32, UniOpVVVV::kMAddU32)
+ DEFINE_OP_4V(v_madd_u32, UniOpVVVV::kMAddU32)
+ DEFINE_OP_4V(s_madd_f32, UniOpVVVV::kMAddF32S)
+ DEFINE_OP_4V(s_madd_f64, UniOpVVVV::kMAddF64S)
+ DEFINE_OP_4V(v_madd_f32, UniOpVVVV::kMAddF32)
+ DEFINE_OP_4V(v_madd_f64, UniOpVVVV::kMAddF64)
+ DEFINE_OP_4V(s_msub_f32, UniOpVVVV::kMSubF32S)
+ DEFINE_OP_4V(s_msub_f64, UniOpVVVV::kMSubF64S)
+ DEFINE_OP_4V(v_msub_f32, UniOpVVVV::kMSubF32)
+ DEFINE_OP_4V(v_msub_f64, UniOpVVVV::kMSubF64)
+ DEFINE_OP_4V(s_nmadd_f32, UniOpVVVV::kNMAddF32S)
+ DEFINE_OP_4V(s_nmadd_f64, UniOpVVVV::kNMAddF64S)
+ DEFINE_OP_4V(v_nmadd_f32, UniOpVVVV::kNMAddF32)
+ DEFINE_OP_4V(v_nmadd_f64, UniOpVVVV::kNMAddF64)
+ DEFINE_OP_4V(s_nmsub_f32, UniOpVVVV::kNMSubF32S)
+ DEFINE_OP_4V(s_nmsub_f64, UniOpVVVV::kNMSubF64S)
+ DEFINE_OP_4V(v_nmsub_f32, UniOpVVVV::kNMSubF32)
+ DEFINE_OP_4V(v_nmsub_f64, UniOpVVVV::kNMSubF64)
+
+ #undef DEFINE_OP_4V
+ #undef DEFINE_OP_3VI_WRAP
+ #undef DEFINE_OP_3VI
+ #undef DEFINE_OP_3V
+ #undef DEFINE_OP_MV_A
+ #undef DEFINE_OP_MV_U
+ #undef DEFINE_OP_MV_I
+ #undef DEFINE_OP_VM_A
+ #undef DEFINE_OP_VM_U
+ #undef DEFINE_OP_VM_I
+ #undef DEFINE_OP_2VI_WRAP
+ #undef DEFINE_OP_2VI
+ #undef DEFINE_OP_2V
+
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_swap_u32(const DstT& dst, const SrcT& src) { v_swizzle_u32x4(dst, src, swizzle(2, 3, 0, 1)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_swap_u64(const DstT& dst, const SrcT& src) { v_swizzle_u64x2(dst, src, swizzle(0, 1)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_swap_f32(const DstT& dst, const SrcT& src) { v_swizzle_f32x4(dst, src, swizzle(2, 3, 0, 1)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_swap_f64(const DstT& dst, const SrcT& src) { v_swizzle_f64x2(dst, src, swizzle(0, 1)); }
+
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_dup_lo_u32(const DstT& dst, const SrcT& src) { v_swizzle_u32x4(dst, src, swizzle(2, 2, 0, 0)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_dup_hi_u32(const DstT& dst, const SrcT& src) { v_swizzle_u32x4(dst, src, swizzle(3, 3, 1, 1)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_dup_lo_u64(const DstT& dst, const SrcT& src) { v_swizzle_u64x2(dst, src, swizzle(0, 0)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_dup_hi_u64(const DstT& dst, const SrcT& src) { v_swizzle_u64x2(dst, src, swizzle(1, 1)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_dup_lo_f64(const DstT& dst, const SrcT& src) { v_swizzle_f64x2(dst, src, swizzle(0, 0)); }
+ template<typename DstT, typename SrcT> ASMJIT_INLINE void v_dup_hi_f64(const DstT& dst, const SrcT& src) { v_swizzle_f64x2(dst, src, swizzle(1, 1)); }
+
+ template<typename T> ASMJIT_INLINE void v_zero_i(const T& dst) { v_xor_i32(dst, dst, dst); }
+ template<typename T> ASMJIT_INLINE void v_zero_f(const T& dst) { v_xor_f32(dst, dst, dst); }
+ template<typename T> ASMJIT_INLINE void v_zero_d(const T& dst) { v_xor_f64(dst, dst, dst); }
+ template<typename T> ASMJIT_INLINE void v_ones_i(const T& dst) { v_cmp_eq_u8(dst, dst, dst); }
+
+ //! \}
+
+ //! \name Memory Loads & Stores
+ //! \{
+
+ ASMJIT_NOINLINE void v_load_u8_u16_2x(const Vec& dst, const Mem& lo, const Mem& hi) {
+#if defined(ASMJIT_UJIT_X86)
+ Gp reg = new_gp32("@tmp");
+ Mem m_lo(lo);
+ Mem m_hi(hi);
+
+ m_lo.set_size(1);
+ m_hi.set_size(1);
+
+ load_u8(reg, m_hi);
+ shl(reg, reg, 16);
+ cc->mov(reg.r8(), m_lo);
+ s_mov_u32(dst.xmm(), reg);
+#elif defined(ASMJIT_UJIT_AARCH64)
+ Gp tmp_a = new_gp32("@tmp_a");
+ Gp tmp_b = new_gp32("@tmp_b");
+
+ load_u8(tmp_a, lo);
+ load_u8(tmp_b, hi);
+ cc->orr(tmp_a, tmp_a, tmp_b, a64::lsl(16));
+ s_mov_u32(dst, tmp_a);
+#endif
+ }
+
+ //! \}
+
+ //! \name Memory Loads & Stores with Parameterized Size
+ //! \{
+
+ ASMJIT_NOINLINE void v_load_iany(const Vec& dst, const Mem& src, size_t n_bytes, Alignment alignment) {
+ switch (n_bytes) {
+ case 1: v_load8(dst, src); break;
+ case 2: v_loada16(dst, src, alignment); break;
+ case 4: v_loada32(dst, src, alignment); break;
+ case 8: v_loada64(dst, src, alignment); break;
+ case 16: v_loada128(dst, src, alignment); break;
+ case 32: v_loada256(dst, src, alignment); break;
+ case 64: v_loada512(dst, src, alignment); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+
+ ASMJIT_NOINLINE void v_store_iany(const Mem& dst, const Vec& src, size_t n_bytes, Alignment alignment) {
+ switch (n_bytes) {
+ case 1: v_store8(dst, src); break;
+ case 2: v_storea16(dst, src, alignment); break;
+ case 4: v_storea32(dst, src, alignment); break;
+ case 8: v_storea64(dst, src, alignment); break;
+ case 16: v_storea128(dst, src, alignment); break;
+ case 32: v_storea256(dst, src, alignment); break;
+ case 64: v_storea512(dst, src, alignment); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+
+ //! \}
+
+ //! \name Utilities
+ //! \{
+
+ template<typename Dst, typename Src>
+ ASMJIT_INLINE void shift_or_rotate_left(const Dst& dst, const Src& src, uint32_t n) {
+ #if defined(ASMJIT_UJIT_X86)
+ if ((n & 3) == 0)
+ v_alignr_u128(dst, src, src, (16u - n) & 15);
+ else
+ v_sllb_u128(dst, src, n);
+ #else
+ // This doesn't rely on a zero constant on AArch64, which is okay as we don't care what's shifted in.
+ v_alignr_u128(dst, src, src, (16u - n) & 15);
+ #endif
+ }
+
+ template<typename Dst, typename Src>
+ ASMJIT_INLINE void shift_or_rotate_right(const Dst& dst, const Src& src, uint32_t n) {
+ #if defined(ASMJIT_UJIT_X86)
+ if ((n & 3) == 0)
+ v_alignr_u128(dst, src, src, n);
+ else
+ v_srlb_u128(dst, src, n);
+ #else
+ // This doesn't rely on a zero constant on AArch64, which is okay as we don't care what's shifted in.
+ v_alignr_u128(dst, src, src, n);
+ #endif
+ }
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
+#endif // ASMJIT_UJIT_UNICOMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit/unicompiler_a64.cpp b/3rdparty/asmjit/asmjit/ujit/unicompiler_a64.cpp
new file mode 100644
index 00000000000..8411119195a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/unicompiler_a64.cpp
@@ -0,0 +1,4391 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/ujit/ujitbase.h>
+
+#if defined(ASMJIT_UJIT_AARCH64)
+
+#include <asmjit/ujit/unicompiler.h>
+#include <asmjit/ujit/unicompiler_utils_p.h>
+#include <asmjit/ujit/unicondition.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+using GPExt = UniCompiler::GPExt;
+using ASIMDExt = UniCompiler::ASIMDExt;
+namespace Inst { using namespace a64::Inst; }
+
+// ujit::UniCompiler - Construction & Destruction
+// ==============================================
+
+UniCompiler::UniCompiler(BackendCompiler* cc, const CpuFeatures& features, CpuHints cpu_hints, VecConstTableRef ct_ref) noexcept
+ : cc(cc),
+ _ct_ref(ct_ref),
+ _features(features),
+ _cpu_hints(cpu_hints),
+ _vec_reg_count(32),
+ _common_table_offset(0) {
+
+ _scalar_op_behavior = ScalarOpBehavior::kZeroing;
+ _fmin_fmax_op_behavior = FMinFMaxOpBehavior::kFiniteValue;
+ _fmadd_op_behavior = FMAddOpBehavior::kFMAStoreToAccumulator;
+ _float_to_int_outside_range_behavior = FloatToIntOutsideRangeBehavior::kSaturatedValue;
+
+ _init_extensions(features);
+}
+
+UniCompiler::~UniCompiler() noexcept {}
+
+// ujit::UniCompiler - CPU Architecture, Features and Optimization Options
+// =======================================================================
+
+void UniCompiler::_init_extensions(const CpuFeatures& features) noexcept {
+ uint64_t gp_ext_mask = 0;
+ uint64_t asimd_ext_mask = 0;
+
+ if (features.arm().has_cssc() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kCSSC);
+ if (features.arm().has_flagm() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kFLAGM);
+ if (features.arm().has_flagm2() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kFLAGM2);
+ if (features.arm().has_ls64() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kLS64);
+ if (features.arm().has_ls64_v() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kLS64_V);
+ if (features.arm().has_lse() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kLSE);
+ if (features.arm().has_lse128() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kLSE128);
+ if (features.arm().has_lse2() ) gp_ext_mask |= uint64_t(1) << uint32_t(GPExt::kLSE2);
+
+ if (features.arm().has_asimd() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kASIMD);
+ if (features.arm().has_bf16() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kBF16);
+ if (features.arm().has_dotprod() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kDOTPROD);
+ if (features.arm().has_fcma() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kFCMA);
+ if (features.arm().has_fhm() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kFHM);
+ if (features.arm().has_fp16() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kFP16);
+ if (features.arm().has_fp16conv()) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kFP16CONV);
+ if (features.arm().has_fp8() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kFP8);
+ if (features.arm().has_frintts() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kFRINTTS);
+ if (features.arm().has_i8mm() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kI8MM);
+ if (features.arm().has_jscvt() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kJSCVT);
+ if (features.arm().has_pmull() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kPMULL);
+ if (features.arm().has_rdm() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kRDM);
+ if (features.arm().has_sha1() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kSHA1);
+ if (features.arm().has_sha256() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kSHA256);
+ if (features.arm().has_sha3() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kSHA3);
+ if (features.arm().has_sha512() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kSHA512);
+ if (features.arm().has_sm3() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kSM3);
+ if (features.arm().has_sm4() ) asimd_ext_mask |= uint64_t(1) << uint32_t(ASIMDExt::kSM4);
+
+ _gp_ext_mask = gp_ext_mask;
+ _asimd_ext_mask = asimd_ext_mask;
+}
+
+VecWidth UniCompiler::max_vec_width_from_cpu_features() noexcept {
+ return VecWidth::k128;
+}
+
+void UniCompiler::init_vec_width(VecWidth vw) noexcept {
+ ASMJIT_ASSERT(vw == VecWidth::k128);
+ Support::maybe_unused(vw);
+
+ _vec_width = VecWidth::k128;
+ _vec_reg_type = RegType::kVec128;
+ _vec_type_id = TypeId::kInt32x4;
+ _vec_multiplier = 1u;
+}
+
+bool UniCompiler::has_masked_access_of(uint32_t data_size) const noexcept {
+ switch (data_size) {
+ case 1: return has_cpu_hint(CpuHints::kVecMaskedOps8);
+ case 2: return has_cpu_hint(CpuHints::kVecMaskedOps16);
+ case 4: return has_cpu_hint(CpuHints::kVecMaskedOps32);
+ case 8: return has_cpu_hint(CpuHints::kVecMaskedOps64);
+
+ default:
+ return false;
+ }
+}
+
+// ujit::UniCompiler - Embed
+// =========================
+
+void UniCompiler::embed_jump_table(Span<const Label> jump_table, const Label& jump_table_base, uint32_t entry_size) {
+ static const uint8_t zeros[8] {};
+
+ for (const Label& label : jump_table) {
+ if (label.is_valid()) {
+ cc->embed_label_delta(label, jump_table_base, entry_size);
+ }
+ else {
+ cc->embed(zeros, entry_size);
+ }
+ }
+}
+
+// ujit::UniCompiler - Function
+// ============================
+
+void UniCompiler::hook_func() noexcept {
+ FuncNode* func = cc->func();
+ _func_init_hook = func;
+}
+
+void UniCompiler::unhook_func() noexcept {
+ _func_init_hook = nullptr;
+}
+
+// ujit::UniCompiler - Constants
+// =============================
+
+void UniCompiler::_init_vec_const_table_ptr() {
+ const void* global = ct_ptr<void>();
+
+ if (!_common_table_ptr.is_valid()) {
+ ScopedInjector injector(cc, &_func_init_hook);
+ _common_table_ptr = new_gpz("common_table_ptr");
+ cc->mov(_common_table_ptr, (int64_t)global + _common_table_offset);
+ }
+}
+
+Operand UniCompiler::simd_const(const void* c, Bcst bcst_width, VecWidth const_width) {
+ return simd_vec_const(c, bcst_width, const_width);
+}
+
+Operand UniCompiler::simd_const(const void* c, Bcst bcst_width, const Vec& similar_to) {
+ Support::maybe_unused(similar_to);
+ return simd_vec_const(c, bcst_width, VecWidth::k128);
+}
+
+Operand UniCompiler::simd_const(const void* c, Bcst bcst_width, const VecArray& similar_to) {
+ ASMJIT_ASSERT(!similar_to.is_empty());
+ Support::maybe_unused(bcst_width, similar_to);
+
+ return simd_vec_const(c, bcst_width, VecWidth::k128);
+}
+
+Vec UniCompiler::simd_vec_const(const void* c, Bcst bcst_width, VecWidth const_width) {
+ Support::maybe_unused(bcst_width);
+ Support::maybe_unused(const_width);
+
+ size_t n = _vec_consts.size();
+ for (size_t i = 0; i < n; i++) {
+ if (_vec_consts[i].ptr == c) {
+ return Vec(OperandSignature{RegTraits<RegType::kVec128>::kSignature}, _vec_consts[i].virt_reg_id);
+ }
+ }
+
+ return Vec(OperandSignature{RegTraits<RegType::kVec128>::kSignature}, _new_vec_const(c, true).id());
+}
+
+Vec UniCompiler::simd_vec_const(const void* c, Bcst bcst_width, const Vec& similar_to) {
+ Support::maybe_unused(similar_to);
+ return simd_vec_const(c, bcst_width, VecWidth::k128);
+}
+
+Vec UniCompiler::simd_vec_const(const void* c, Bcst bcst_width, const VecArray& similar_to) {
+ Support::maybe_unused(similar_to);
+ return simd_vec_const(c, bcst_width, VecWidth::k128);
+}
+
+Mem UniCompiler::simd_mem_const(const void* c, Bcst bcst_width, VecWidth const_width) {
+ Support::maybe_unused(bcst_width, const_width);
+ return _get_mem_const(c);
+}
+
+Mem UniCompiler::simd_mem_const(const void* c, Bcst bcst_width, const Vec& similar_to) {
+ Support::maybe_unused(bcst_width, similar_to);
+ return _get_mem_const(c);
+}
+
+Mem UniCompiler::simd_mem_const(const void* c, Bcst bcst_width, const VecArray& similar_to) {
+ Support::maybe_unused(bcst_width, similar_to);
+ return _get_mem_const(c);
+}
+
+Mem UniCompiler::_get_mem_const(const void* c) {
+ // Make sure we are addressing a constant from the `ct` constant pool.
+ const void* ct_addr = ct_ptr<void>();
+ ASMJIT_ASSERT((uintptr_t)c >= (uintptr_t)ct_addr &&
+ (uintptr_t)c < (uintptr_t)ct_addr + _ct_ref.size);
+
+ // One GP register is sacrificed to hold the pointer to the `ct`.
+ _init_vec_const_table_ptr();
+
+ int32_t disp = int32_t((intptr_t)c - (intptr_t)ct_addr);
+ return mem_ptr(_common_table_ptr, disp - _common_table_offset);
+}
+
+Vec UniCompiler::_new_vec_const(const void* c, bool is_unique_const) {
+ Support::maybe_unused(is_unique_const);
+
+ Vec vec;
+ const char* special_const_name = nullptr;
+
+ if (special_const_name) {
+ vec = new_vec_with_width(vec_width(), special_const_name);
+ }
+ else {
+ uint64_t u0 = static_cast<const uint64_t*>(c)[0];
+ uint64_t u1 = static_cast<const uint64_t*>(c)[1];
+
+ if (u0 != u1)
+ vec = new_vec_with_width(vec_width(), "c_0x%016llX%016llX", (unsigned long long)u1, (unsigned long long)u0);
+ else if ((u0 >> 32) != (u0 & 0xFFFFFFFFu))
+ vec = new_vec_with_width(vec_width(), "c_0x%016llX", (unsigned long long)u0);
+ else if (((u0 >> 16) & 0xFFFFu) != (u0 & 0xFFFFu))
+ vec = new_vec_with_width(vec_width(), "c_0x%08X", (unsigned)(u0 & 0xFFFFFFFFu));
+ else
+ vec = new_vec_with_width(vec_width(), "c_0x%04X", (unsigned)(u0 & 0xFFFFu));
+ }
+
+ VecConstData const_data;
+ const_data.ptr = c;
+ const_data.virt_reg_id = vec.id();
+ _vec_consts.append(arena(), const_data);
+
+ if (c == &ct().p_0000000000000000) {
+ ScopedInjector inject(cc, &_func_init_hook);
+ v_zero_i(vec.v128());
+ }
+ else {
+ // NOTE: _get_mem_const() must be outside of injected code as it uses injection too.
+ Mem m = _get_mem_const(c);
+
+ ScopedInjector inject(cc, &_func_init_hook);
+ v_loadavec(vec, m);
+ }
+
+ return vec;
+}
+
+Vec UniCompiler::simd_const_16b(const void* data16) {
+ size_t n = _vec_consts_ex.size();
+
+ for (size_t i = 0; i < n; i++) {
+ if (memcmp(_vec_consts_ex[i].data, data16, 16) == 0) {
+ return Vec(OperandSignature{RegTraits<RegType::kVec128>::kSignature}, _vec_consts_ex[i].virt_reg_id);
+ }
+ }
+
+ Vec vec = new_vec128("const");
+ VecConstDataEx entry;
+
+ memcpy(entry.data, data16, 16);
+ entry.virt_reg_id = vec.id();
+ _vec_consts_ex.append(arena(), entry);
+
+ Mem mem = cc->new_const(ConstPoolScope::kLocal, data16, 16);
+ {
+ ScopedInjector inject(cc, &_func_init_hook);
+ v_loadavec(vec, mem);
+ }
+
+ return vec;
+}
+
+// ujit::UniCompiler - Stack
+// =========================
+
+Mem UniCompiler::tmp_stack(StackId id, uint32_t size) {
+ ASMJIT_ASSERT(Support::is_power_of_2(size));
+ ASMJIT_ASSERT(size <= 32);
+
+ // Only used by asserts.
+ Support::maybe_unused(size);
+
+ Mem& stack = _tmp_stack[size_t(id)];
+ if (!stack.base_id()) {
+ stack = cc->new_stack(32, 16, "tmp_stack");
+ }
+ return stack;
+}
+
+// ujit::UniCompiler - General Purpose Instructions - Utilities
+// ============================================================
+
+struct MemInst {
+ uint16_t inst_id;
+ uint16_t mem_size;
+};
+
+static ASMJIT_NOINLINE void gp_emit_mem_op(UniCompiler& uc, Gp r, Mem m, MemInst ii) {
+ BackendCompiler* cc = uc.cc;
+ InstId inst_id = ii.inst_id;
+
+ if (m.has_index() && m.has_shift()) {
+ // AArch64 limitation: shift can be the same size as the size of the read operation - HWord << 1, Word << 2, etc...
+ // Other shift operations are not supported at the architectural level, so we have to perform it explicitly.
+ uint32_t mem_size = ii.mem_size ? uint32_t(ii.mem_size) : r.size();
+ uint32_t shift = m.shift();
+
+ if (mem_size != (1u << shift)) {
+ Gp tmp = uc.new_gpz("@mem_addr");
+ cc->add(tmp, m.base_reg().as<Gp>(), m.index_reg().as<Gp>(), a64::Shift(m.shift_op(), shift));
+ m = a64::ptr(tmp);
+ }
+ }
+
+ cc->emit(inst_id, r, m);
+}
+
+static constexpr Gp gp_zero_regs[2] = { a64::wzr, a64::xzr };
+
+static ASMJIT_INLINE const Gp& gp_zero_as(const Gp& ref) noexcept {
+ return gp_zero_regs[size_t(ref.is_gp64())];
+}
+
+static ASMJIT_NOINLINE Gp gp_force_reg(UniCompiler& uc, const Operand_& op, const Gp& ref) {
+ ASMJIT_ASSERT(op.is_gp() || op.is_mem() || op.is_imm());
+
+ Gp reg;
+
+ if (op.is_gp()) {
+ reg = op.as<Gp>();
+ reg.set_signature(ref.signature());
+ return reg;
+ }
+
+ if (op.is_imm() && op.as<Imm>().value() == 0) {
+ return gp_zero_as(ref);
+ }
+
+ BackendCompiler* cc = uc.cc;
+ reg = uc.new_similar_reg(ref, "@tmp");
+
+ if (op.is_mem()) {
+ gp_emit_mem_op(uc, reg, op.as<Mem>(), MemInst{uint16_t(Inst::kIdLdr), uint16_t(reg.size())});
+ }
+ else {
+ cc->mov(reg, op.as<Imm>());
+ }
+ return reg;
+}
+
+// ujit::UniCompiler - General Purpose Instructions - Conditions
+// =============================================================
+
+struct ConditionOpInfo {
+ uint16_t inst_id;
+ uint16_t reserved;
+};
+
+static constexpr ConditionOpInfo condition_op_info[size_t(UniOpCond::kMaxValue) + 1] = {
+ { Inst::kIdAnds, 0 }, // UniOpCond::kAssignAnd
+ { Inst::kIdOrr , 0 }, // UniOpCond::kAssignOr
+ { Inst::kIdEor , 0 }, // UniOpCond::kAssignXor
+ { Inst::kIdAdds, 0 }, // UniOpCond::kAssignAdd
+ { Inst::kIdSubs, 0 }, // UniOpCond::kAssignSub
+ { Inst::kIdNone, 0 }, // UniOpCond::kAssignShr
+ { Inst::kIdTst , 0 }, // UniOpCond::kTest
+ { Inst::kIdNone, 0 }, // UniOpCond::kBitTest
+ { Inst::kIdCmp , 0 } // UniOpCond::kCompare
+};
+
+class ConditionApplier : public UniCondition {
+public:
+ ASMJIT_INLINE ConditionApplier(const UniCondition& condition) noexcept : UniCondition(condition) {
+ // The first operand must always be a register.
+ ASMJIT_ASSERT(a.is_gp());
+ }
+
+ ASMJIT_NOINLINE void optimize(UniCompiler& uc) noexcept {
+ Support::maybe_unused(uc);
+
+ switch (op) {
+ case UniOpCond::kCompare:
+ if (b.is_imm() && b.as<Imm>().value() == 0 && (cond == CondCode::kEqual || cond == CondCode::kNotEqual)) {
+ op = UniOpCond::kTest;
+ b = a;
+ reverse();
+ }
+ break;
+
+ case UniOpCond::kBitTest: {
+ if (b.is_imm()) {
+ uint64_t bit_index = b.as<Imm>().value_as<uint64_t>();
+ op = UniOpCond::kTest;
+ b = Imm(1u << bit_index);
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ ASMJIT_INLINE void reverse() noexcept {
+ cond = a64::reverse_cond(cond);
+ }
+
+ ASMJIT_NOINLINE void emit(UniCompiler& uc) {
+ BackendCompiler* cc = uc.cc;
+ ConditionOpInfo info = condition_op_info[size_t(op)];
+
+ Gp aGp = a.as<Gp>();
+
+ switch (op) {
+ case UniOpCond::kAssignAnd: {
+ if (b.is_imm() && a64::Utils::is_logical_imm(b.as<Imm>().value_as<uint64_t>(), aGp.size() * 8)) {
+ cc->emit(info.inst_id, aGp, aGp, b.as<Imm>());
+ }
+ else {
+ cc->emit(info.inst_id, aGp, aGp, gp_force_reg(uc, b, aGp));
+ }
+ return;
+ }
+
+ case UniOpCond::kAssignAdd:
+ case UniOpCond::kAssignSub: {
+ if (b.is_imm() && a64::Utils::is_add_sub_imm(b.as<Imm>().value_as<uint64_t>())) {
+ cc->emit(info.inst_id, aGp, aGp, b.as<Imm>());
+ }
+ else {
+ cc->emit(info.inst_id, aGp, aGp, gp_force_reg(uc, b, aGp));
+ }
+ return;
+ }
+
+ case UniOpCond::kAssignXor:
+ if (b.is_imm()) {
+ const Imm& bImm = b.as<Imm>();
+ if (bImm.value() == -1 || (aGp.size() == 4 && bImm.value_as<uint32_t>() == 0xFFFFFFFFu)) {
+ cc->mvn_(aGp, aGp);
+ cc->tst(aGp, aGp);
+ return;
+ }
+ }
+ [[fallthrough]];
+
+ case UniOpCond::kAssignOr: {
+ if (b.is_imm() && a64::Utils::is_logical_imm(b.as<Imm>().value_as<uint64_t>(), aGp.size() * 8)) {
+ cc->emit(info.inst_id, aGp, aGp, b.as<Imm>());
+ cc->tst(aGp, aGp);
+ }
+ else {
+ cc->emit(info.inst_id, aGp, aGp, gp_force_reg(uc, b, aGp));
+ cc->tst(aGp, aGp);
+ }
+ return;
+ }
+
+ case UniOpCond::kAssignShr: {
+ if (b.is_imm()) {
+ cc->adds(aGp, gp_zero_as(aGp), aGp, a64::lsr(b.as<Imm>().value_as<uint32_t>()));
+ }
+ else {
+ cc->lsr(aGp, aGp, gp_force_reg(uc, b, aGp));
+ cc->tst(aGp, aGp);
+ }
+ return;
+ }
+
+ case UniOpCond::kTest: {
+ if (b.is_imm() && a64::Utils::is_logical_imm(b.as<Imm>().value_as<uint64_t>(), aGp.size() * 8)) {
+ cc->emit(info.inst_id, aGp, b.as<Imm>());
+ }
+ else {
+ cc->emit(info.inst_id, aGp, gp_force_reg(uc, b, aGp));
+ }
+ return;
+ }
+
+ case UniOpCond::kCompare: {
+ if (b.is_imm() && a64::Utils::is_add_sub_imm(b.as<Imm>().value_as<uint64_t>())) {
+ cc->emit(info.inst_id, aGp, b.as<Imm>());
+ }
+ else {
+ cc->emit(info.inst_id, aGp, gp_force_reg(uc, b, aGp));
+ }
+ return;
+ }
+
+ case UniOpCond::kBitTest: {
+ Gp tmp = uc.new_similar_reg(aGp);
+ cc->lsr(tmp, aGp, gp_force_reg(uc, b, aGp));
+ cc->tst(tmp, Imm(1));
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+};
+
+// ujit::UniCompiler - General Purpose Instructions - Emit
+// =======================================================
+
+void UniCompiler::emit_mov(const Gp& dst, const Operand_& src) {
+ if (src.is_mem()) {
+ gp_emit_mem_op(*this, dst, src.as<Mem>(), MemInst{uint16_t(Inst::kIdLdr), uint16_t(dst.size())});
+ }
+ else {
+ cc->emit(Inst::kIdMov, dst, src);
+ }
+}
+
+void UniCompiler::emit_m(UniOpM op, const Mem& m_) {
+ static constexpr MemInst st_inst[] = {
+ { Inst::kIdNone, 0 }, // kPrefetch
+ { Inst::kIdStr , 0 }, // kStoreZeroReg
+ { Inst::kIdStrb, 1 }, // kStoreZeroU8
+ { Inst::kIdStrh, 2 }, // kStoreZeroU16
+ { Inst::kIdStr , 4 }, // kStoreZeroU32
+ { Inst::kIdStr , 8 } // kStoreZeroU64
+ };
+
+ Gp zero = gp_zero_regs[size_t(op == UniOpM::kStoreZeroReg || op == UniOpM::kStoreZeroU64)];
+ MemInst ii = st_inst[size_t(op)];
+
+ if (!ii.inst_id) {
+ return;
+ }
+
+ gp_emit_mem_op(*this, zero, m_, ii);
+}
+
+void UniCompiler::emit_rm(UniOpRM op, const Gp& dst, const Mem& src) {
+ static constexpr MemInst ld_inst[] = {
+ { Inst::kIdLdr , 0 }, // kLoadReg
+ { Inst::kIdLdrsb, 1 }, // kLoadI8
+ { Inst::kIdLdrb , 1 }, // kLoadU8
+ { Inst::kIdLdrsh, 2 }, // kLoadI16
+ { Inst::kIdLdrh , 2 }, // kLoadU16
+ { Inst::kIdLdr , 4 }, // kLoadI32
+ { Inst::kIdLdr , 4 }, // kLoadU32
+ { Inst::kIdLdr , 8 }, // kLoadI64
+ { Inst::kIdLdr , 8 }, // kLoadU64
+ { Inst::kIdLdrb , 1 }, // kLoadMergeU8
+ { Inst::kIdLdrb , 1 }, // kLoadShiftU8
+ { Inst::kIdLdrh , 2 }, // kLoadMergeU16
+ { Inst::kIdLdrh , 2 } // kLoadShiftU16
+ };
+
+ static constexpr uint32_t ld_32_mask =
+ (1u << uint32_t(uint32_t(UniOpRM::kLoadU8 ))) |
+ (1u << uint32_t(uint32_t(UniOpRM::kLoadU16))) |
+ (1u << uint32_t(uint32_t(UniOpRM::kLoadU32))) ;
+
+ Gp r(dst);
+ Mem m(src);
+ MemInst ii = ld_inst[size_t(op)];
+
+ switch (op) {
+ case UniOpRM::kLoadReg:
+ case UniOpRM::kLoadI8:
+ case UniOpRM::kLoadU8:
+ case UniOpRM::kLoadI16:
+ case UniOpRM::kLoadU16:
+ case UniOpRM::kLoadI32:
+ case UniOpRM::kLoadU32:
+ case UniOpRM::kLoadI64:
+ case UniOpRM::kLoadU64: {
+ if (op == UniOpRM::kLoadI32 && dst.is_gp64()) {
+ ii.inst_id = uint16_t(Inst::kIdLdrsw);
+ }
+
+ if ((ld_32_mask >> uint32_t(op)) & 1u) {
+ r = r.w();
+ }
+
+ gp_emit_mem_op(*this, r, m, ii);
+ return;
+ }
+
+ case UniOpRM::kLoadShiftU8:
+ case UniOpRM::kLoadShiftU16: {
+ Gp tmp = new_similar_reg(r);
+ gp_emit_mem_op(*this, tmp.r32(), m, ii);
+ cc->orr(r, tmp, r, a64::lsl(ii.mem_size * 8));
+ return;
+ }
+
+ case UniOpRM::kLoadMergeU8:
+ case UniOpRM::kLoadMergeU16: {
+ Gp tmp = new_similar_reg(r);
+ gp_emit_mem_op(*this, tmp.r32(), m, ii);
+ cc->orr(r, r, tmp);
+ return;
+ }
+
+ default: {
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+struct UniOpMRInfo {
+ uint32_t op_inst : 14;
+ uint32_t store_inst : 14;
+ uint32_t size : 4;
+};
+
+void UniCompiler::emit_mr(UniOpMR op, const Mem& dst, const Gp& src) {
+ static constexpr UniOpMRInfo op_info_table[] = {
+ { Inst::kIdNone, Inst::kIdStr , 0 }, // kStoreReg
+ { Inst::kIdNone, Inst::kIdStrb, 1 }, // kStoreU8
+ { Inst::kIdNone, Inst::kIdStrh, 2 }, // kStoreU16
+ { Inst::kIdNone, Inst::kIdStr , 4 }, // kStoreU32
+ { Inst::kIdNone, Inst::kIdStr , 8 }, // kStoreU64
+ { Inst::kIdAdd , Inst::kIdStr , 0 }, // kAddReg
+ { Inst::kIdAdd , Inst::kIdStrb, 1 }, // kAddU8
+ { Inst::kIdAdd , Inst::kIdStrh, 2 }, // kAddU16
+ { Inst::kIdAdd , Inst::kIdStr , 4 }, // kAddU32
+ { Inst::kIdAdd , Inst::kIdStr , 8 } // kAddU64
+ };
+
+ Mem m(dst);
+ Gp r(src);
+ const UniOpMRInfo& op_info = op_info_table[size_t(op)];
+
+ if (op_info.size >= 1u && op_info.size <= 4) {
+ r = r.w();
+ }
+
+ if (op_info.op_inst == Inst::kIdNone) {
+ cc->emit(op_info.store_inst, r, m);
+ }
+ else {
+ Gp tmp = new_similar_reg(r, "@tmp");
+ switch (op_info.size) {
+ case 0: load(tmp, m); break;
+ case 1: load_u8(tmp, m); break;
+ case 2: load_u16(tmp, m); break;
+ case 4: load_u32(tmp, m); break;
+ case 8: load_u64(tmp, m); break;
+ }
+ cc->emit(op_info.op_inst, tmp, tmp, r);
+ cc->emit(op_info.store_inst, tmp, m);
+ }
+}
+
+void UniCompiler::emit_cmov(const Gp& dst, const Operand_& sel, const UniCondition& condition) {
+ ConditionApplier ca(condition);
+ ca.optimize(*this);
+ ca.emit(*this);
+ cc->csel(dst, gp_force_reg(*this, sel, dst), dst, condition.cond);
+}
+
+void UniCompiler::emit_select(const Gp& dst, const Operand_& sel1_, const Operand_& sel2_, const UniCondition& condition) {
+ ConditionApplier ca(condition);
+ ca.optimize(*this);
+ ca.emit(*this);
+
+ Gp sel1 = gp_force_reg(*this, sel1_, dst);
+ Gp sel2 = gp_force_reg(*this, sel2_, dst);
+ cc->csel(dst, sel1, sel2, condition.cond);
+}
+
+void UniCompiler::emit_2i(UniOpRR op, const Gp& dst, const Operand_& src_) {
+ // ArithOp Reg, Any
+ // ----------------
+
+ if (src_.is_reg_or_mem()) {
+ Gp src = gp_force_reg(*this, src_, dst);
+
+ switch (op) {
+ case UniOpRR::kAbs: {
+ if (has_cssc()) {
+ cc->abs(dst, src);
+ }
+ else {
+ cc->cmp(src, 0);
+ cc->cneg(dst, src, CondCode::kMI);
+ }
+ return;
+ }
+
+ case UniOpRR::kNeg: {
+ cc->neg(dst, src);
+ return;
+ }
+
+ case UniOpRR::kNot: {
+ cc->mvn_(dst, src);
+ return;
+ }
+
+ case UniOpRR::kBSwap: {
+ cc->rev(dst, src);
+ return;
+ }
+
+ case UniOpRR::kCLZ: {
+ cc->clz(dst, src);
+ return;
+ }
+
+ case UniOpRR::kCTZ: {
+ if (has_cssc()) {
+ cc->ctz(dst, src);
+ }
+ else {
+ cc->rbit(dst, src);
+ cc->clz(dst, dst);
+ }
+ return;
+ }
+
+ case UniOpRR::kReflect: {
+ cc->eor(dst, src, src, a64::asr(dst.size() * 8u - 1));
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+
+ // Everything should be handled, so this should never be reached!
+ ASMJIT_NOT_REACHED();
+}
+
+static constexpr uint64_t kOp3ICommutativeMask =
+ (uint64_t(1) << unsigned(UniOpRRR::kAnd )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kOr )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kXor )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kAdd )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kMul )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kSMin)) |
+ (uint64_t(1) << unsigned(UniOpRRR::kSMax)) |
+ (uint64_t(1) << unsigned(UniOpRRR::kUMin)) |
+ (uint64_t(1) << unsigned(UniOpRRR::kUMax)) ;
+
+static ASMJIT_INLINE_NODEBUG bool is_op_3i_commutative(UniOpRRR op) noexcept {
+ return (kOp3ICommutativeMask & (uint64_t(1) << unsigned(op))) != 0;
+}
+
+void UniCompiler::emit_3i(UniOpRRR op, const Gp& dst, const Operand_& src1_, const Operand_& src2_) {
+ Operand src1(src1_);
+ Operand src2(src2_);
+
+ if (!src1.is_reg()) {
+ if (src2.is_reg() && is_op_3i_commutative(op)) {
+ ASMJIT_ASSERT(src2.is_gp());
+ std::swap(src1, src2);
+ }
+ else {
+ src1 = gp_force_reg(*this, src1, dst);
+ }
+ }
+
+ static constexpr uint16_t addsub_inst[2] = { Inst::kIdAdd, Inst::kIdSub };
+ static constexpr uint16_t sminmax_inst[2] = { Inst::kIdSmin, Inst::kIdSmax };
+ static constexpr uint16_t uminmax_inst[2] = { Inst::kIdUmin, Inst::kIdUmax };
+ static constexpr uint16_t logical_inst[4] = { Inst::kIdAnd, Inst::kIdOrr, Inst::kIdEor, Inst::kIdBic };
+ static constexpr uint16_t shift_inst[3] = { Inst::kIdLsl, Inst::kIdLsr, Inst::kIdAsr };
+
+ // ArithOp Reg, Reg, Imm
+ // ---------------------
+
+ if (src2.is_imm()) {
+ Gp a = src1.as<Gp>().clone_as(dst);
+ Imm b = src2.as<Imm>();
+
+ switch (op) {
+ case UniOpRRR::kXor:
+ if (b.value() == -1 || (b.value_as<uint32_t>() == 0xFFFFFFFFu && dst.size() == 4)) {
+ cc->mvn_(dst, a);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpRRR::kAnd:
+ case UniOpRRR::kOr:
+ case UniOpRRR::kBic: {
+ if (a64::Utils::is_logical_imm(b.value_as<uint64_t>(), a.size() * 8u)) {
+ cc->emit(logical_inst[size_t(op) - size_t(UniOpRRR::kAnd)], dst, a, b);
+ return;
+ }
+
+ // If the immediate value is not encodable, we have to use a register.
+ break;
+ }
+
+ case UniOpRRR::kAdd:
+ case UniOpRRR::kSub: {
+ uint64_t value = b.value_as<uint64_t>();
+ unsigned reverse = int64_t(value) < 0;
+
+ if (reverse)
+ value = uint64_t(0) - value;
+
+ if (op == UniOpRRR::kSub)
+ reverse = reverse ^ 1u;
+
+ // TODO: [JIT] Just testing the idea of patching the previous instruction to have a post-index addressing.
+ if (!reverse && uint64_t(value) < 256 && dst.id() == a.id()) {
+ if (cc->cursor()->type() == NodeType::kInst) {
+ InstNode* prev_inst = cc->cursor()->as<InstNode>();
+ if (prev_inst->inst_id() == Inst::kIdLdr || prev_inst->inst_id() == Inst::kIdStr ||
+ prev_inst->inst_id() == Inst::kIdLdr_v || prev_inst->inst_id() == Inst::kIdStr_v) {
+ Mem& mem_op = prev_inst->op(prev_inst->op_count() - 1).as<Mem>();
+ if (mem_op.base_reg() == a && !mem_op.has_index() && !mem_op.has_offset()) {
+ mem_op.set_offset_mode(arm::OffsetMode::kPostIndex);
+ mem_op.add_offset(int64_t(value));
+ return;
+ }
+ }
+ }
+ }
+
+ if (Support::is_uint_n<12>(value)) {
+ cc->emit(addsub_inst[reverse], dst, a, Imm(value));
+ return;
+ }
+
+ // If the immediate value is not encodable, we have to use a register.
+ break;
+ }
+
+ case UniOpRRR::kMul: {
+ uint64_t value = b.value_as<uint64_t>();
+ if (value > 0u) {
+ if (Support::is_power_of_2(value)) {
+ uint32_t shift = Support::ctz(value);
+ cc->lsl(dst, a, Imm(shift));
+ return;
+ }
+
+ // We can still support multiplication with `power_of_2 + 1`
+ if (Support::is_power_of_2(--value)) {
+ uint32_t shift = Support::ctz(value);
+ cc->add(dst, a, a, a64::lsl(shift));
+ return;
+ }
+ }
+ break;
+ }
+
+ case UniOpRRR::kSMin:
+ case UniOpRRR::kSMax: {
+ int64_t value = b.value_as<int64_t>();
+
+ if (value == 0 || value == -1) {
+ uint32_t shift = dst.size() * 8u - 1u;
+
+ // Signed min/max against -1 and 0 can be implemented by using a variation of bitwise instructions
+ // with the input value combined with its signs (that's why arithmetic shift right is used).
+ static constexpr uint16_t inst_table[4] = {
+ Inst::kIdAnd, // smin(a, 0) == and(a, expand_msb(a))
+ Inst::kIdOrr, // smin(a, -1) == orr(a, expand_msb(a))
+ Inst::kIdBic, // smax(a, 0) == bic(a, expand_msb(a))
+ Inst::kIdOrn // smax(a, -1) == orn(a, expand_msb(a))
+ };
+
+ InstId inst_id = inst_table[(size_t(op) - size_t(UniOpRRR::kSMin)) * 2u + size_t(value == -1)];
+ cc->emit(inst_id, dst, a, a, Imm(a64::asr(shift)));
+ return;
+ }
+
+ if (has_cssc() && Support::is_int_n<8>(value)) {
+ cc->emit(sminmax_inst[size_t(op) - size_t(UniOpRRR::kSMin)], dst, a, b);
+ return;
+ }
+ break;
+ }
+
+ case UniOpRRR::kUMin:
+ case UniOpRRR::kUMax: {
+ uint64_t value = b.value_as<uint64_t>();
+ if (has_cssc() && Support::is_uint_n<8>(value)) {
+ cc->emit(uminmax_inst[size_t(op) - size_t(UniOpRRR::kUMin)], dst, a, b);
+ return;
+ }
+ break;
+ }
+
+ case UniOpRRR::kSll:
+ case UniOpRRR::kSrl:
+ case UniOpRRR::kSra: {
+ cc->emit(shift_inst[size_t(op) - size_t(UniOpRRR::kSll)], dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kRol:
+ case UniOpRRR::kRor: {
+ uint32_t width = dst.size() * 8u;
+ uint32_t value = b.value_as<uint32_t>() & (width - 1);
+
+ if (op == UniOpRRR::kRol)
+ value = width - value;
+
+ cc->ror(dst, a, Imm(value));
+ return;
+ }
+
+ case UniOpRRR::kSBound: {
+ // TODO: CSSC
+ // if (has_cssc() && Support::is_uint8(value)) {
+ // }
+ break;
+ }
+
+ default:
+ // Unhandled instruction means to use a register instead of immediate.
+ break;
+ }
+ }
+
+ // ArithOp Reg, Reg, Reg
+ // ---------------------
+
+ {
+ src2 = gp_force_reg(*this, src2, dst);
+
+ Gp a = src1.as<Gp>();
+ Gp b = src2.as<Gp>();
+
+ switch (op) {
+ case UniOpRRR::kAnd:
+ case UniOpRRR::kOr:
+ case UniOpRRR::kXor:
+ case UniOpRRR::kBic: {
+ cc->emit(logical_inst[size_t(op) - size_t(UniOpRRR::kAnd)], dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kAdd:
+ case UniOpRRR::kSub: {
+ cc->emit(addsub_inst[size_t(op) - size_t(UniOpRRR::kAdd)], dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kMul: {
+ cc->mul(dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kUDiv: {
+ cc->udiv(dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kUMod: {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->udiv(tmp, a, b);
+ cc->mul(tmp, tmp, b);
+ cc->sub(dst, a, tmp);
+ return;
+ }
+
+ case UniOpRRR::kSMin:
+ case UniOpRRR::kSMax: {
+ if (has_cssc()) {
+ cc->emit(sminmax_inst[size_t(op) - size_t(UniOpRRR::kSMin)], dst, a, b);
+ }
+ else {
+ cc->cmp(a, b);
+ cc->csel(dst, a, b, op == UniOpRRR::kSMin ? CondCode::kLT : CondCode::kGT);
+ }
+ return;
+ }
+
+ case UniOpRRR::kUMin:
+ case UniOpRRR::kUMax: {
+ if (has_cssc()) {
+ cc->emit(uminmax_inst[size_t(op) - size_t(UniOpRRR::kUMin)], dst, a, b);
+ }
+ else {
+ cc->cmp(a, b);
+ cc->csel(dst, a, b, op == UniOpRRR::kUMin ? CondCode::kLO : CondCode::kHI);
+ }
+ return;
+ }
+
+ case UniOpRRR::kSll:
+ case UniOpRRR::kSrl:
+ case UniOpRRR::kSra: {
+ cc->emit(shift_inst[size_t(op) - size_t(UniOpRRR::kSll)], dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kRol: {
+ Gp tmp = new_similar_reg(dst, "@rol_rev");
+ cc->neg(tmp, b);
+ cc->ror(dst, a, tmp);
+ return;
+ }
+
+ case UniOpRRR::kRor: {
+ cc->ror(dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kSBound: {
+ cc->cmp(a, b);
+ cc->bic(dst, a, a, a64::asr(dst.size() * 8u - 1));
+ cc->csel(dst, dst, b, CondCode::kSignedLT);
+ return;
+ }
+
+ default:
+ // Everything should be handled, so this should never be reached!
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_j(const Operand_& target) {
+ cc->emit(Inst::kIdB, target);
+}
+
+void UniCompiler::emit_j_if(const Label& target, const UniCondition& condition) {
+ ConditionApplier ca(condition);
+ ca.optimize(*this);
+ ca.emit(*this);
+ cc->b(ca.cond, target);
+}
+
+void UniCompiler::adds_u8(const Gp& dst, const Gp& src1, const Gp& src2) {
+ ASMJIT_ASSERT(dst.size() == src1.size());
+ ASMJIT_ASSERT(dst.size() == src2.size());
+
+ cc->add(dst, src1, src2);
+ if (has_cssc()) {
+ cc->umin(dst, dst, 255);
+ return;
+ }
+
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->cmp(dst, 255);
+ cc->mov(tmp, 255);
+ cc->csel(dst, dst, tmp, CondCode::kLO);
+}
+
+void UniCompiler::inv_u8(const Gp& dst, const Gp& src) {
+ cc->eor(dst, src, 0xFF);
+}
+
+void UniCompiler::div_255_u32(const Gp& dst, const Gp& src) {
+ ASMJIT_ASSERT(dst.size() == src.size());
+
+ // dst = src + 128;
+ // dst = (dst + (dst >> 8)) >> 8
+ cc->add(dst, src, 128);
+ cc->add(dst, dst, dst, a64::lsr(8));
+ cc->lsr(dst, dst, 8);
+}
+
+void UniCompiler::mul_257_hu16(const Gp& dst, const Gp& src) {
+ ASMJIT_ASSERT(dst.size() == src.size());
+ cc->add(dst, src, src, a64::lsl(8));
+ cc->lsr(dst, dst, 16);
+}
+
+void UniCompiler::add_scaled(const Gp& dst, const Gp& a_, int b) {
+ Gp a = a_.clone_as(dst);
+
+ if (Support::is_power_of_2(b)) {
+ uint32_t shift = Support::ctz(b);
+ cc->add(dst, dst, a, a64::lsl(shift));
+ }
+ else if (b == 3 && dst.id() == a.id()) {
+ cc->add(dst, dst, dst, a64::lsl(1));
+ }
+ else {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->mov(tmp, b);
+ cc->madd(dst, a, tmp, dst);
+ }
+}
+
+void UniCompiler::add_ext(const Gp& dst, const Gp& src_, const Gp& idx_, uint32_t scale, int32_t disp) {
+ ASMJIT_ASSERT(scale != 0);
+
+ Gp src = src_.clone_as(dst);
+ Gp idx = idx_.clone_as(dst);
+
+ if (Support::is_power_of_2(scale)) {
+ cc->add(dst, src, idx, a64::lsl(Support::ctz(scale)));
+ }
+ else {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+
+ if (scale == 3) {
+ cc->add(tmp, src, idx, a64::lsl(1));
+ cc->add(dst, tmp, idx);
+ }
+ else {
+ cc->mov(tmp, scale);
+ cc->mul(tmp, tmp, idx);
+ cc->add(dst, src, tmp);
+ }
+ }
+
+ if (disp) {
+ if (disp > 0)
+ cc->add(dst, dst, disp);
+ else
+ cc->sub(dst, dst, -disp);
+ }
+}
+
+void UniCompiler::lea(const Gp& dst, const Mem& src) {
+ Gp base = src.base_reg().as<Gp>();
+
+ if (src.has_index()) {
+ add_ext(dst, base, src.index_reg().as<Gp>(), 1u << src.shift(), src.offset_lo32());
+ }
+ else if (src.offset_lo32()) {
+ cc->add(dst, base, src.offset_lo32());
+ }
+ else {
+ cc->mov(dst, base);
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Constants
+// ===================================================
+
+//! Floating point mode is used in places that are generic and implement various functionality that needs more
+//! than a single instruction. Typically implementing either higher level concepts or missing functionality.
+enum FloatMode : uint32_t {
+ //! Used by non-floating point instructions.
+ kNone = 0,
+
+ kF32S = 1,
+ kF64S = 2,
+ kF32V = 3,
+ kF64V = 4
+};
+
+enum class ElementSize : uint32_t {
+ kNA = 0,
+ k8 = 0,
+ k16 = 1,
+ k32 = 2,
+ k64 = 3
+};
+
+enum class SameVecOp : uint32_t {
+ kNone = 0,
+ kZero = 1,
+ kOnes = 2,
+ kSrc = 3
+};
+
+enum class VecPart : uint32_t {
+ kNA = 0,
+ kLo = 1,
+ kHi = 2
+};
+
+enum class NarrowingOp : uint32_t {
+ kNone,
+ kI16ToI8,
+ kI16ToU8,
+ kU16ToU8,
+ kI32ToI16,
+ kI32ToU16,
+ kU32ToU16,
+ kI64ToI32,
+ kI64ToU32,
+ kU64ToU32
+};
+
+enum class NarrowingMode : uint32_t {
+ kTruncate,
+ kSaturateSToU,
+ kSaturateSToS,
+ kSaturateUToU
+};
+
+// ujit::UniCompiler - Vector Instructions - UniOp Information
+// ============================================================
+
+struct UniOpVInfo {
+ //! \name Members
+ //! \{
+
+ uint32_t inst_id : 13;
+ ASIMDExt asimd_ext : 6;
+ uint32_t commutative : 1;
+ uint32_t comparison : 1;
+ uint32_t reverse : 1;
+ SameVecOp same_vec_op : 2;
+ FloatMode float_mode : 3;
+ ElementSize dst_element : 3;
+ VecPart dst_part : 2;
+ ElementSize src_element : 3;
+ VecPart src_part : 2;
+ uint32_t imm : 8;
+ uint32_t reserved2 : 19;
+
+ //! \}
+};
+
+#define DEFINE_OP(inst_id, ext, commutative, comparison, reverse, same_vec_op, float_mode, dst_element, dst_part, src_element, src_part, imm) \
+ UniOpVInfo { \
+ inst_id, \
+ ASIMDExt::ext, \
+ commutative, \
+ comparison, \
+ reverse, \
+ SameVecOp::same_vec_op, \
+ FloatMode::float_mode, \
+ ElementSize::dst_element, \
+ VecPart::dst_part, \
+ ElementSize::src_element, \
+ VecPart::src_part, \
+ imm, \
+ 0 \
+ }
+
+static constexpr UniOpVInfo opcode_info_2v[size_t(UniOpVV::kMaxValue) + 1] = {
+ DEFINE_OP(Inst::kIdMov_v , kIntrin, 0, 0, 0, kNone, kNone, kNA, kNA, kNA, kNA, 0x00u), // kMov.
+ DEFINE_OP(Inst::kIdMov_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kLo, k64, kLo, 0x00u), // kMovU64.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kBroadcastU8Z.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kBroadcastU16Z.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kBroadcastU8.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kBroadcastU16.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kBroadcastU32.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kBroadcastU64.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kBroadcastF32.
+ DEFINE_OP(Inst::kIdDup_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kBroadcastF64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kBroadcastV128_U32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kBroadcastV128_U64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kBroadcastV128_F32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kBroadcastV128_F64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kBroadcastV256_U32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kBroadcastV256_U64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kBroadcastV256_F32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kBroadcastV256_F64.
+ DEFINE_OP(Inst::kIdAbs_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAbsI8.
+ DEFINE_OP(Inst::kIdAbs_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kAbsI16.
+ DEFINE_OP(Inst::kIdAbs_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kAbsI32.
+ DEFINE_OP(Inst::kIdAbs_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kAbsI64.
+ DEFINE_OP(Inst::kIdMvn_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kNotU32.
+ DEFINE_OP(Inst::kIdMvn_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kNotU64.
+ DEFINE_OP(Inst::kIdSshll_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k8 , kLo, 0x00u), // kCvtI8LoToI16
+ DEFINE_OP(Inst::kIdSshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k8 , kHi, 0x00u), // kCvtI8HiToI16
+ DEFINE_OP(Inst::kIdUshll_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k8 , kLo, 0x00u), // kCvtU8LoToU16
+ DEFINE_OP(Inst::kIdUshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k8 , kHi, 0x00u), // kCvtU8HiToU16
+ DEFINE_OP(Inst::kIdSshll_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k8 , kLo, 0x00u), // kCvtI8ToI32
+ DEFINE_OP(Inst::kIdUshll_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k8 , kLo, 0x00u), // kCvtU8ToU32
+ DEFINE_OP(Inst::kIdSshll_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k16, kLo, 0x00u), // kCvtI16LoToI32
+ DEFINE_OP(Inst::kIdSshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k16, kHi, 0x00u), // kCvtI16HiToI32
+ DEFINE_OP(Inst::kIdUshll_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k16, kLo, 0x00u), // kCvtU16LoToU32
+ DEFINE_OP(Inst::kIdUshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k16, kHi, 0x00u), // kCvtU16HiToU32
+ DEFINE_OP(Inst::kIdSshll_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kCvtI32LoToI64
+ DEFINE_OP(Inst::kIdSshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u), // kCvtI32HiToI64
+ DEFINE_OP(Inst::kIdUshll_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kCvtU32LoToU64
+ DEFINE_OP(Inst::kIdUshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u), // kCvtU32HiToU64
+ DEFINE_OP(Inst::kIdFabs_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kAbsF32S.
+ DEFINE_OP(Inst::kIdFabs_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kAbsF64S.
+ DEFINE_OP(Inst::kIdFabs_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kAbsF32.
+ DEFINE_OP(Inst::kIdFabs_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kAbsF64.
+ DEFINE_OP(Inst::kIdFneg_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kNegF32S.
+ DEFINE_OP(Inst::kIdFneg_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kNegF64S.
+ DEFINE_OP(Inst::kIdFneg_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kNegF32.
+ DEFINE_OP(Inst::kIdFneg_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kNegF64.
+ DEFINE_OP(Inst::kIdMvn_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kNotF32.
+ DEFINE_OP(Inst::kIdMvn_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kNotF64.
+ DEFINE_OP(Inst::kIdFrintz_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kTruncF32S.
+ DEFINE_OP(Inst::kIdFrintz_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kTruncF64S.
+ DEFINE_OP(Inst::kIdFrintz_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kTruncF32.
+ DEFINE_OP(Inst::kIdFrintz_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kTruncF64.
+ DEFINE_OP(Inst::kIdFrintm_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kFloorF32S.
+ DEFINE_OP(Inst::kIdFrintm_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kFloorF64S.
+ DEFINE_OP(Inst::kIdFrintm_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kFloorF32.
+ DEFINE_OP(Inst::kIdFrintm_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kFloorF64.
+ DEFINE_OP(Inst::kIdFrintp_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCeilF32S.
+ DEFINE_OP(Inst::kIdFrintp_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCeilF64S.
+ DEFINE_OP(Inst::kIdFrintp_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCeilF32.
+ DEFINE_OP(Inst::kIdFrintp_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCeilF64.
+ DEFINE_OP(Inst::kIdFrintn_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kRoundEvenF32S.
+ DEFINE_OP(Inst::kIdFrintn_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kRoundEvenF64S.
+ DEFINE_OP(Inst::kIdFrintn_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kRoundEvenF32.
+ DEFINE_OP(Inst::kIdFrintn_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kRoundEvenF64.
+ DEFINE_OP(Inst::kIdFrinta_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kRoundHalfAwayF32S.
+ DEFINE_OP(Inst::kIdFrinta_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kRoundHalfAwayF64S.
+ DEFINE_OP(Inst::kIdFrinta_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kRoundHalfAwayF32.
+ DEFINE_OP(Inst::kIdFrinta_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kRoundHalfAwayF64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kRoundHalfUpF32S.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kRoundHalfUpF64S.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kRoundHalfUpF32.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kRoundHalfUpF64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kRcpF32.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kRcpF64.
+ DEFINE_OP(Inst::kIdFsqrt_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kSqrtF32S.
+ DEFINE_OP(Inst::kIdFsqrt_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kSqrtF64S.
+ DEFINE_OP(Inst::kIdFsqrt_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kSqrtF32.
+ DEFINE_OP(Inst::kIdFsqrt_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kSqrtF64.
+ DEFINE_OP(Inst::kIdFcvt_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k32, kNA, 0x00u), // kCvtF32ToF64S.
+ DEFINE_OP(Inst::kIdFcvt_v , kASIMD , 0, 0, 0, kNone, kF64S, k32, kNA, k64, kNA, 0x00u), // kCvtF64ToF32S.
+ DEFINE_OP(Inst::kIdScvtf_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCvtI32ToF32.
+ DEFINE_OP(Inst::kIdFcvtl_v , kASIMD , 0, 0, 0, kNone, kF32V, k64, kNA, k32, kLo, 0x00u), // kCvtF32LoToF64.
+ DEFINE_OP(Inst::kIdFcvtl2_v , kASIMD , 0, 0, 0, kNone, kF32V, k64, kNA, k32, kHi, 0x00u), // kCvtF32HiToF64.
+ DEFINE_OP(Inst::kIdFcvtn_v , kASIMD , 0, 0, 0, kNone, kF64V, k32, kLo, k64, kNA, 0x00u), // kCvtF64ToF32Lo.
+ DEFINE_OP(Inst::kIdFcvtn2_v , kASIMD , 0, 0, 0, kNone, kF64V, k32, kHi, k64, kNA, 0x00u), // kCvtF64ToF32Hi.
+ DEFINE_OP(Inst::kIdSshll_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kCvtI32LoToF64.
+ DEFINE_OP(Inst::kIdSshll2_v , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u), // kCvtI32HiToF64.
+ DEFINE_OP(Inst::kIdFcvtzs_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCvtTruncF32ToI32.
+ DEFINE_OP(Inst::kIdFcvtzs_v , kIntrin, 0, 0, 0, kNone, kF64V, k32, kLo, k64, kLo, 0x00u), // kCvtTruncF64ToI32Lo.
+ DEFINE_OP(Inst::kIdFcvtzs_v , kIntrin, 0, 0, 0, kNone, kF64V, k32, kHi, k64, kHi, 0x00u), // kCvtTruncF64ToI32Hi.
+ DEFINE_OP(Inst::kIdFcvtns_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCvtRoundF32ToI32.
+ DEFINE_OP(Inst::kIdFcvtns_v , kIntrin, 0, 0, 0, kNone, kF64V, k32, kLo, k64, kLo, 0x00u), // kCvtRoundF64ToI32Lo.
+ DEFINE_OP(Inst::kIdFcvtns_v , kIntrin, 0, 0, 0, kNone, kF64V, k32, kHi, k64, kHi, 0x00u) // kCvtRoundF64ToI32Hi.
+};
+
+static constexpr UniOpVInfo opcode_info_2vs[size_t(UniOpVR::kMaxValue) + 1] = {
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kMov.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kMovU32.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kMovU64.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kInsertU8.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kInsertU16.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInsertU32.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInsertU64.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kExtractU8.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kExtractU16.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kExtractU32.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kExtractU64.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, kNA, kNA, 0x00u), // kCvtIntToF32.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, kNA, kNA, 0x00u), // kCvtIntToF64.
+ DEFINE_OP(Inst::kIdFcvtzs_v , kASIMD , 0, 0, 0, kNone, kF32S, kNA, kNA, k32, kNA, 0x00u), // kCvtTruncF32ToInt.
+ DEFINE_OP(Inst::kIdFcvtns_v , kASIMD , 0, 0, 0, kNone, kF32S, kNA, kNA, k32, kNA, 0x00u), // kCvtRoundF32ToInt.
+ DEFINE_OP(Inst::kIdFcvtzs_v , kASIMD , 0, 0, 0, kNone, kF64S, kNA, kNA, k64, kNA, 0x00u), // kCvtTruncF64ToInt.
+ DEFINE_OP(Inst::kIdFcvtns_v , kASIMD , 0, 0, 0, kNone, kF64S, kNA, kNA, k64, kNA, 0x00u) // kCvtRoundF64ToInt.
+};
+
+static constexpr UniOpVInfo opcode_info_2vi[size_t(UniOpVVI::kMaxValue) + 1] = {
+ DEFINE_OP(Inst::kIdShl_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSllU16.
+ DEFINE_OP(Inst::kIdShl_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSllU32.
+ DEFINE_OP(Inst::kIdShl_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSllU64.
+ DEFINE_OP(Inst::kIdUshr_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSrlU16.
+ DEFINE_OP(Inst::kIdUshr_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSrlU32.
+ DEFINE_OP(Inst::kIdUshr_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSrlU64.
+ DEFINE_OP(Inst::kIdSshr_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSraI16.
+ DEFINE_OP(Inst::kIdSshr_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSraI32.
+ DEFINE_OP(Inst::kIdSshr_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSraI64.
+ DEFINE_OP(Inst::kIdExt_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kSllbU128.
+ DEFINE_OP(Inst::kIdExt_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kSrlbU128.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSwizzleU16x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSwizzleLoU16x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSwizzleHiU16x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSwizzleU32x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSwizzleU64x2.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kSwizzleF32x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kSwizzleF64x2.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSwizzleU64x4.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kSwizzleF64x4.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kExtractV128_I32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kExtractV128_I64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kExtractV128_F32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kExtractV128_F64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kExtractV256_I32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kExtractV256_I64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kExtractV256_F32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kExtractV256_F64.
+ DEFINE_OP(Inst::kIdUrshr_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSrlRndU16.
+ DEFINE_OP(Inst::kIdUrshr_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSrlRndU32.
+ DEFINE_OP(Inst::kIdUrshr_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSrlRndU64.
+ DEFINE_OP(Inst::kIdUsra_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSrlAccU16.
+ DEFINE_OP(Inst::kIdUsra_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSrlAccU32.
+ DEFINE_OP(Inst::kIdUsra_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSrlAccU64.
+ DEFINE_OP(Inst::kIdUrsra_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSrlRndAccU16.
+ DEFINE_OP(Inst::kIdUrsra_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kSrlRndAccU32.
+ DEFINE_OP(Inst::kIdUrsra_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kSrlRndAccU64.
+ DEFINE_OP(Inst::kIdShrn_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k16, kLo, 0x00u), // kSrlnLoU16.
+ DEFINE_OP(Inst::kIdShrn2_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k16, kHi, 0x00u), // kSrlnHiU16.
+ DEFINE_OP(Inst::kIdShrn_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k32, kLo, 0x00u), // kSrlnLoU32.
+ DEFINE_OP(Inst::kIdShrn2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k32, kHi, 0x00u), // kSrlnHiU32.
+ DEFINE_OP(Inst::kIdShrn_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k64, kLo, 0x00u), // kSrlnLoU64.
+ DEFINE_OP(Inst::kIdShrn2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k64, kHi, 0x00u), // kSrlnHiU64.
+ DEFINE_OP(Inst::kIdRshrn_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kLo, k16, kNA, 0x00u), // kSrlnRndLoU16.
+ DEFINE_OP(Inst::kIdRshrn2_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kHi, k16, kNA, 0x00u), // kSrlnRndHiU16.
+ DEFINE_OP(Inst::kIdRshrn_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kLo, k32, kNA, 0x00u), // kSrlnRndLoU32.
+ DEFINE_OP(Inst::kIdRshrn2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kHi, k32, kNA, 0x00u), // kSrlnRndHiU32.
+ DEFINE_OP(Inst::kIdRshrn_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kLo, k64, kNA, 0x00u), // kSrlnRndLoU64.
+ DEFINE_OP(Inst::kIdRshrn2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kHi, k64, kNA, 0x00u), // kSrlnRndHiU64.
+};
+
+static constexpr UniOpVInfo opcode_info_3v[size_t(UniOpVVV::kMaxValue) + 1] = {
+ DEFINE_OP(Inst::kIdAnd_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kAndU32.
+ DEFINE_OP(Inst::kIdAnd_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kAndU64.
+ DEFINE_OP(Inst::kIdOrr_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kOrU32.
+ DEFINE_OP(Inst::kIdOrr_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kOrU64.
+ DEFINE_OP(Inst::kIdEor_v , kASIMD , 1, 0, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kXorU32.
+ DEFINE_OP(Inst::kIdEor_v , kASIMD , 1, 0, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kXorU64.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 1, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAndnU32.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 1, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAndnU64.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kBicU32.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kBicU64.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kAvgrU8.
+ DEFINE_OP(Inst::kIdNone , kASIMD , 1, 0, 0, kSrc , kNone, k16, kNA, k16, kNA, 0x00u), // kAvgrU16.
+ DEFINE_OP(Inst::kIdAdd_v , kASIMD , 1, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAddU8.
+ DEFINE_OP(Inst::kIdAdd_v , kASIMD , 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kAddU16.
+ DEFINE_OP(Inst::kIdAdd_v , kASIMD , 1, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kAddU32.
+ DEFINE_OP(Inst::kIdAdd_v , kASIMD , 1, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kAddU64.
+ DEFINE_OP(Inst::kIdSub_v , kASIMD , 0, 0, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kSubU8.
+ DEFINE_OP(Inst::kIdSub_v , kASIMD , 0, 0, 0, kZero, kNone, k16, kNA, k16, kNA, 0x00u), // kSubU16.
+ DEFINE_OP(Inst::kIdSub_v , kASIMD , 0, 0, 0, kZero, kNone, k32, kNA, k32, kNA, 0x00u), // kSubU32.
+ DEFINE_OP(Inst::kIdSub_v , kASIMD , 0, 0, 0, kZero, kNone, k64, kNA, k64, kNA, 0x00u), // kSubU64.
+ DEFINE_OP(Inst::kIdSqadd_v , kASIMD , 1, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAddsI8.
+ DEFINE_OP(Inst::kIdUqadd_v , kASIMD , 1, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAddsU8.
+ DEFINE_OP(Inst::kIdSqadd_v , kASIMD , 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kAddsI16.
+ DEFINE_OP(Inst::kIdUqadd_v , kASIMD , 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kAddsU16.
+ DEFINE_OP(Inst::kIdSqsub_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kSubsI8.
+ DEFINE_OP(Inst::kIdUqsub_v , kASIMD , 0, 0, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kSubsU8.
+ DEFINE_OP(Inst::kIdSqsub_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kSubsI16.
+ DEFINE_OP(Inst::kIdUqsub_v , kASIMD , 0, 0, 0, kZero, kNone, k16, kNA, k16, kNA, 0x00u), // kSubsU16.
+ DEFINE_OP(Inst::kIdMul_v , kASIMD , 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kMulU16.
+ DEFINE_OP(Inst::kIdMul_v , kASIMD , 1, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kMulU32.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 1, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kMulU64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kMulhI16.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kMulhU16.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 1, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kMulU64_LoU32.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 1, 0, 0, kNone, kNone, k32, kNA, k16, kNA, 0x00u), // kMHAddI16_I32.
+ DEFINE_OP(Inst::kIdSmin_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kMinI8.
+ DEFINE_OP(Inst::kIdUmin_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kMinU8.
+ DEFINE_OP(Inst::kIdSmin_v , kASIMD , 1, 0, 0, kSrc , kNone, k16, kNA, k16, kNA, 0x00u), // kMinI16.
+ DEFINE_OP(Inst::kIdUmin_v , kASIMD , 1, 0, 0, kSrc , kNone, k16, kNA, k16, kNA, 0x00u), // kMinU16.
+ DEFINE_OP(Inst::kIdSmin_v , kASIMD , 1, 0, 0, kSrc , kNone, k32, kNA, k32, kNA, 0x00u), // kMinI32.
+ DEFINE_OP(Inst::kIdUmin_v , kASIMD , 1, 0, 0, kSrc , kNone, k32, kNA, k32, kNA, 0x00u), // kMinU32.
+ DEFINE_OP(Inst::kIdCmgt_v , kIntrin, 1, 0, 0, kSrc , kNone, k64, kNA, k64, kNA, 0x00u), // kMinI64.
+ DEFINE_OP(Inst::kIdCmhi_v , kIntrin, 1, 0, 0, kSrc , kNone, k64, kNA, k64, kNA, 0x00u), // kMinU64.
+ DEFINE_OP(Inst::kIdSmax_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kMaxI8.
+ DEFINE_OP(Inst::kIdUmax_v , kASIMD , 1, 0, 0, kSrc , kNone, k8 , kNA, k8 , kNA, 0x00u), // kMaxU8.
+ DEFINE_OP(Inst::kIdSmax_v , kASIMD , 1, 0, 0, kSrc , kNone, k16, kNA, k16, kNA, 0x00u), // kMaxI16.
+ DEFINE_OP(Inst::kIdUmax_v , kASIMD , 1, 0, 0, kSrc , kNone, k16, kNA, k16, kNA, 0x00u), // kMaxU16.
+ DEFINE_OP(Inst::kIdSmax_v , kASIMD , 1, 0, 0, kSrc , kNone, k32, kNA, k32, kNA, 0x00u), // kMaxI32.
+ DEFINE_OP(Inst::kIdUmax_v , kASIMD , 1, 0, 0, kSrc , kNone, k32, kNA, k32, kNA, 0x00u), // kMaxU32.
+ DEFINE_OP(Inst::kIdCmgt_v , kIntrin, 1, 0, 0, kSrc , kNone, k64, kNA, k64, kNA, 0x01u), // kMaxI64.
+ DEFINE_OP(Inst::kIdCmhi_v , kIntrin, 1, 0, 0, kSrc , kNone, k64, kNA, k64, kNA, 0x01u), // kMaxU64.
+ DEFINE_OP(Inst::kIdCmeq_v , kASIMD , 1, 1, 0, kOnes, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpEqU8.
+ DEFINE_OP(Inst::kIdCmeq_v , kASIMD , 1, 1, 0, kOnes, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpEqU16.
+ DEFINE_OP(Inst::kIdCmeq_v , kASIMD , 1, 1, 0, kOnes, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpEqU32.
+ DEFINE_OP(Inst::kIdCmeq_v , kASIMD , 1, 1, 0, kOnes, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpEqU64.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpGtI8.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 0, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpGtU8.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 0, kZero, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpGtI16.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 0, kZero, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpGtU16.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 0, kZero, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpGtI32.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 0, kZero, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpGtU32.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 0, kZero, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpGtI64.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 0, kZero, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpGtU64.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 0, kOnes, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpGeI8.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 0, kOnes, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpGeU8.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 0, kOnes, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpGeI16.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 0, kOnes, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpGeU16.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 0, kOnes, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpGeI32.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 0, kOnes, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpGeU32.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 0, kOnes, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpGeI64.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 0, kOnes, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpGeU64.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 1, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpLtI8.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 1, kZero, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpLtU8.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 1, kZero, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpLtI16.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 1, kZero, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpLtU16.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 1, kZero, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpLtI32.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 1, kZero, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpLtU32.
+ DEFINE_OP(Inst::kIdCmgt_v , kASIMD , 0, 1, 1, kZero, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpLtI64.
+ DEFINE_OP(Inst::kIdCmhi_v , kASIMD , 0, 1, 1, kZero, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpLtU64.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 1, kOnes, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpLeI8.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 1, kOnes, kNone, k8 , kNA, k8 , kNA, 0x00u), // kCmpLeU8.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 1, kOnes, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpLeI16.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 1, kOnes, kNone, k16, kNA, k16, kNA, 0x00u), // kCmpLeU16.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 1, kOnes, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpLeI32.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 1, kOnes, kNone, k32, kNA, k32, kNA, 0x00u), // kCmpLeU32.
+ DEFINE_OP(Inst::kIdCmge_v , kASIMD , 0, 1, 1, kOnes, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpLeI64.
+ DEFINE_OP(Inst::kIdCmhs_v , kASIMD , 0, 1, 1, kOnes, kNone, k64, kNA, k64, kNA, 0x00u), // kCmpLeU64.
+ DEFINE_OP(Inst::kIdAnd_v , kASIMD , 1, 0, 0, kSrc , kF32V, k8 , kNA, k8 , kNA, 0x00u), // kAndF32.
+ DEFINE_OP(Inst::kIdAnd_v , kASIMD , 1, 0, 0, kSrc , kF64V, k8 , kNA, k8 , kNA, 0x00u), // kAndF64.
+ DEFINE_OP(Inst::kIdOrr_v , kASIMD , 1, 0, 0, kSrc , kF32V, k8 , kNA, k8 , kNA, 0x00u), // kOrF32.
+ DEFINE_OP(Inst::kIdOrr_v , kASIMD , 1, 0, 0, kSrc , kF64V, k8 , kNA, k8 , kNA, 0x00u), // kOrF64.
+ DEFINE_OP(Inst::kIdEor_v , kASIMD , 1, 0, 0, kZero, kF32V, k8 , kNA, k8 , kNA, 0x00u), // kXorF32.
+ DEFINE_OP(Inst::kIdEor_v , kASIMD , 1, 0, 0, kZero, kF64V, k8 , kNA, k8 , kNA, 0x00u), // kXorF64.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 1, kZero, kF32V, k8 , kNA, k8 , kNA, 0x00u), // kAndnF32.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 1, kZero, kF64V, k8 , kNA, k8 , kNA, 0x00u), // kAndnF64.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 0, kZero, kF32V, k8 , kNA, k8 , kNA, 0x00u), // kBicF32.
+ DEFINE_OP(Inst::kIdBic_v , kASIMD , 0, 0, 0, kZero, kF64V, k8 , kNA, k8 , kNA, 0x00u), // kBicF64.
+ DEFINE_OP(Inst::kIdFadd_v , kASIMD , 1, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kAddF32S.
+ DEFINE_OP(Inst::kIdFadd_v , kASIMD , 1, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kAddF64S.
+ DEFINE_OP(Inst::kIdFadd_v , kASIMD , 1, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kAddF32.
+ DEFINE_OP(Inst::kIdFadd_v , kASIMD , 1, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kAddF64.
+ DEFINE_OP(Inst::kIdFsub_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kSubF32S.
+ DEFINE_OP(Inst::kIdFsub_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kSubF64S.
+ DEFINE_OP(Inst::kIdFsub_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kSubF32.
+ DEFINE_OP(Inst::kIdFsub_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kSubF64.
+ DEFINE_OP(Inst::kIdFmul_v , kASIMD , 1, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kMulF32S.
+ DEFINE_OP(Inst::kIdFmul_v , kASIMD , 1, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kMulF64S.
+ DEFINE_OP(Inst::kIdFmul_v , kASIMD , 1, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kMulF32.
+ DEFINE_OP(Inst::kIdFmul_v , kASIMD , 1, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kMulF64.
+ DEFINE_OP(Inst::kIdFdiv_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kDivF32S.
+ DEFINE_OP(Inst::kIdFdiv_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kDivF64S.
+ DEFINE_OP(Inst::kIdFdiv_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kDivF32.
+ DEFINE_OP(Inst::kIdFdiv_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kDivF64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kModF32S.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kModF64S.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kModF32.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kModF64.
+ DEFINE_OP(Inst::kIdFminnm_v , kASIMD , 1, 0, 0, kSrc , kF32S, k32, kNA, k32, kNA, 0x00u), // kMinF32S.
+ DEFINE_OP(Inst::kIdFminnm_v , kASIMD , 1, 0, 0, kSrc , kF64S, k64, kNA, k64, kNA, 0x00u), // kMinF64S.
+ DEFINE_OP(Inst::kIdFminnm_v , kASIMD , 1, 0, 0, kSrc , kF32V, k32, kNA, k32, kNA, 0x00u), // kMinF32.
+ DEFINE_OP(Inst::kIdFminnm_v , kASIMD , 1, 0, 0, kSrc , kF64V, k64, kNA, k64, kNA, 0x00u), // kMinF64.
+ DEFINE_OP(Inst::kIdFmaxnm_v , kASIMD , 1, 0, 0, kSrc , kF32S, k32, kNA, k32, kNA, 0x00u), // kMaxF32S.
+ DEFINE_OP(Inst::kIdFmaxnm_v , kASIMD , 1, 0, 0, kSrc , kF64S, k64, kNA, k64, kNA, 0x00u), // kMaxF64S.
+ DEFINE_OP(Inst::kIdFmaxnm_v , kASIMD , 1, 0, 0, kSrc , kF32V, k32, kNA, k32, kNA, 0x00u), // kMaxF32.
+ DEFINE_OP(Inst::kIdFmaxnm_v , kASIMD , 1, 0, 0, kSrc , kF64V, k64, kNA, k64, kNA, 0x00u), // kMaxF64.
+ DEFINE_OP(Inst::kIdFcmeq_v , kASIMD , 1, 1, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpEqF32S (eq ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kASIMD , 1, 1, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpEqF64S (eq ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kASIMD , 1, 1, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpEqF32 (eq ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kASIMD , 1, 1, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpEqF64 (eq ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpNeF32S (ne ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpNeF64S (ne ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpNeF32 (ne ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpNeF64 (ne ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpGtF32S (gt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpGtF64S (gt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpGtF32 (gt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpGtF64 (gt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpGeF32S (ge ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpGeF64S (ge ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpGeF32 (ge ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpGeF64 (ge ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 1, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpLtF32S (lt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 1, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpLtF64S (lt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 1, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpLtF32 (lt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmgt_v , kASIMD , 0, 1, 1, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpLtF64 (lt ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 1, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpLeF32S (le ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 1, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpLeF64S (le ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 1, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpLeF32 (le ordered quiet).
+ DEFINE_OP(Inst::kIdFcmge_v , kASIMD , 0, 1, 1, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpLeF64 (le ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kCmpOrdF32S (ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kCmpOrdF64S (ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kCmpOrdF32 (ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kCmpOrdF64 (ordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x01u), // kCmpUnordF32S (unordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x01u), // kCmpUnordF64S (unordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x01u), // kCmpUnordF32 (unordered quiet).
+ DEFINE_OP(Inst::kIdFcmeq_v , kIntrin, 1, 1, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x01u), // kCmpUnordF64 (unordered quiet).
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kHAddF64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kCombineLoHiU64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kCombineLoHiF64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kSrc , kNone, k64, kNA, k64, kNA, 0x00u), // kCombineHiLoU64.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kSrc , kNone, k64, kNA, k64, kNA, 0x00u), // kCombineHiLoF64.
+ DEFINE_OP(Inst::kIdZip1_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kInterleaveLoU8.
+ DEFINE_OP(Inst::kIdZip2_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kInterleaveHiU8.
+ DEFINE_OP(Inst::kIdZip1_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kInterleaveLoU16.
+ DEFINE_OP(Inst::kIdZip2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kInterleaveHiU16.
+ DEFINE_OP(Inst::kIdZip1_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInterleaveLoU32.
+ DEFINE_OP(Inst::kIdZip2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInterleaveHiU32.
+ DEFINE_OP(Inst::kIdZip1_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInterleaveLoU64.
+ DEFINE_OP(Inst::kIdZip2_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInterleaveHiU64.
+ DEFINE_OP(Inst::kIdZip1_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInterleaveLoF32.
+ DEFINE_OP(Inst::kIdZip2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInterleaveHiF32.
+ DEFINE_OP(Inst::kIdZip1_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInterleaveLoF64.
+ DEFINE_OP(Inst::kIdZip2_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInterleaveHiF64.
+ DEFINE_OP(Inst::kIdSqxtn_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k16, kNA, 0x00u), // kPacksI16_I8.
+ DEFINE_OP(Inst::kIdSqxtun_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k16, kNA, 0x00u), // kPacksI16_U8.
+ DEFINE_OP(Inst::kIdSqxtn_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k32, kNA, 0x00u), // kPacksI32_I16.
+ DEFINE_OP(Inst::kIdSqxtun_v , kIntrin, 0, 0, 0, kNone, kNone, k16, kNA, k32, kNA, 0x00u), // kPacksI32_U16.
+ DEFINE_OP(Inst::kIdTbl_v , kASIMD , 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kSwizzlev_U8.
+ DEFINE_OP(Inst::kIdSmull_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kLo, 0x00u), // kMulwLoI8.
+ DEFINE_OP(Inst::kIdUmull_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kLo, 0x00u), // kMulwLoU8.
+ DEFINE_OP(Inst::kIdSmull2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kHi, 0x00u), // kMulwHiI8.
+ DEFINE_OP(Inst::kIdUmull2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kHi, 0x00u), // kMulwHiU8.
+ DEFINE_OP(Inst::kIdSmull_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kLo, 0x00u), // kMulwLoI16.
+ DEFINE_OP(Inst::kIdUmull_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kLo, 0x00u), // kMulwLoU16.
+ DEFINE_OP(Inst::kIdSmull2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kHi, 0x00u), // kMulwHiI16.
+ DEFINE_OP(Inst::kIdUmull2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kHi, 0x00u), // kMulwHiU16.
+ DEFINE_OP(Inst::kIdSmull_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kMulwLoI32.
+ DEFINE_OP(Inst::kIdUmull_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kMulwLoU32.
+ DEFINE_OP(Inst::kIdSmull2_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u), // kMulwHiI32.
+ DEFINE_OP(Inst::kIdUmull2_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u), // kMulwHiU32.
+ DEFINE_OP(Inst::kIdSmlal_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kLo, 0x00u), // kMAddwLoI8.
+ DEFINE_OP(Inst::kIdUmlal_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kLo, 0x00u), // kMAddwLoU8.
+ DEFINE_OP(Inst::kIdSmlal2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kHi, 0x00u), // kMAddwHiI8.
+ DEFINE_OP(Inst::kIdUmlal2_v , kASIMD , 0, 0, 0, kNone, kNone, k16, kNA, k8 , kHi, 0x00u), // kMAddwHiU8.
+ DEFINE_OP(Inst::kIdSmlal_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kLo, 0x00u), // kMAddwLoI16.
+ DEFINE_OP(Inst::kIdUmlal_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kLo, 0x00u), // kMAddwLoU16.
+ DEFINE_OP(Inst::kIdSmlal2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kHi, 0x00u), // kMAddwHiI16.
+ DEFINE_OP(Inst::kIdUmlal2_v , kASIMD , 0, 0, 0, kNone, kNone, k32, kNA, k16, kHi, 0x00u), // kMAddwHiU16.
+ DEFINE_OP(Inst::kIdSmlal_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kMAddwLoI32.
+ DEFINE_OP(Inst::kIdUmlal_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kLo, 0x00u), // kMAddwLoU32.
+ DEFINE_OP(Inst::kIdSmlal2_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u), // kMAddwHiI32.
+ DEFINE_OP(Inst::kIdUmlal2_v , kASIMD , 0, 0, 0, kNone, kNone, k64, kNA, k32, kHi, 0x00u) // kMAddwHiU32.
+};
+
+static constexpr UniOpVInfo opcode_info_3vi[size_t(UniOpVVVI::kMaxValue) + 1] = {
+ DEFINE_OP(Inst::kIdExt_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kAlignr_U128.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInterleaveShuffleU32x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInterleaveShuffleU64x2.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInterleaveShuffleF32x4.
+ DEFINE_OP(Inst::kIdNone , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInterleaveShuffleF64x2.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInsertV128_U32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInsertV128_F32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInsertV128_U64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInsertV128_F64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInsertV256_U32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kInsertV256_F32.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u), // kInsertV256_U64.
+ DEFINE_OP(0 , kIntrin, 0, 0, 0, kNone, kNone, k64, kNA, k64, kNA, 0x00u) // kInsertV256_F64.
+};
+
+static constexpr UniOpVInfo opcode_info_4v[size_t(UniOpVVV::kMaxValue) + 1] = {
+ DEFINE_OP(Inst::kIdBsl_v , kIntrin, 0, 0, 0, kNone, kNone, k8 , kNA, k8 , kNA, 0x00u), // kBlendV_U8.
+ DEFINE_OP(Inst::kIdMla_v , kIntrin, 1, 0, 0, kNone, kNone, k16, kNA, k16, kNA, 0x00u), // kMAddU16.
+ DEFINE_OP(Inst::kIdMla_v , kIntrin, 1, 0, 0, kNone, kNone, k32, kNA, k32, kNA, 0x00u), // kMAddU32.
+ DEFINE_OP(Inst::kIdFmadd_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kMAddF32S.
+ DEFINE_OP(Inst::kIdFmadd_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kMAddF64S.
+ DEFINE_OP(Inst::kIdFmla_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kMAddF32.
+ DEFINE_OP(Inst::kIdFmla_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kMAddF64.
+ DEFINE_OP(Inst::kIdFnmsub_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kMSubF32S.
+ DEFINE_OP(Inst::kIdFnmsub_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kMSubF64S.
+ DEFINE_OP(Inst::kIdFmla_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x01u), // kMSubF32.
+ DEFINE_OP(Inst::kIdFmla_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x01u), // kMSubF64.
+ DEFINE_OP(Inst::kIdFmsub_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kNMAddF32S.
+ DEFINE_OP(Inst::kIdFmsub_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kNMAddF64S.
+ DEFINE_OP(Inst::kIdFmls_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x00u), // kNMAddF32.
+ DEFINE_OP(Inst::kIdFmls_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x00u), // kNMAddF64.
+ DEFINE_OP(Inst::kIdFnmadd_v , kASIMD , 0, 0, 0, kNone, kF32S, k32, kNA, k32, kNA, 0x00u), // kNMSubF32S.
+ DEFINE_OP(Inst::kIdFnmadd_v , kASIMD , 0, 0, 0, kNone, kF64S, k64, kNA, k64, kNA, 0x00u), // kNMSubF64S.
+ DEFINE_OP(Inst::kIdFmls_v , kASIMD , 0, 0, 0, kNone, kF32V, k32, kNA, k32, kNA, 0x01u), // kNMSubF32.
+ DEFINE_OP(Inst::kIdFmls_v , kASIMD , 0, 0, 0, kNone, kF64V, k64, kNA, k64, kNA, 0x01u) // kNMSubF64.
+};
+
+#undef DEFINE_OP
+
+struct UniOpVMInfo {
+ //! \name Members
+ //! \{
+
+ uint32_t cvt_op : 16;
+ uint32_t mem_size : 8;
+ ElementSize element : 3;
+
+ //! \}
+};
+
+#define DEFINE_OP(cvt_op, size, element) UniOpVMInfo { uint32_t(cvt_op), size, ElementSize::element }
+
+static constexpr UniOpVMInfo opcode_info_2vm[size_t(UniOpVM::kMaxValue) + 1] = {
+ DEFINE_OP(0 , 1, k8 ), // kLoad8.
+ DEFINE_OP(0 , 2, k16), // kLoad16_U16.
+ DEFINE_OP(0 , 4, k32), // kLoad32_U32.
+ DEFINE_OP(0 , 4, k32), // kLoad32_F32.
+ DEFINE_OP(0 , 8, k32), // kLoad64_U32.
+ DEFINE_OP(0 , 8, k64), // kLoad64_U64.
+ DEFINE_OP(0 , 8, k32), // kLoad64_F32.
+ DEFINE_OP(0 , 8, k64), // kLoad64_F64.
+ DEFINE_OP(0 , 16, k32), // kLoad128_U32.
+ DEFINE_OP(0 , 16, k64), // kLoad128_U64.
+ DEFINE_OP(0 , 16, k32), // kLoad128_F32.
+ DEFINE_OP(0 , 16, k64), // kLoad128_F64.
+ DEFINE_OP(0 , 32, k32), // kLoad256_U32.
+ DEFINE_OP(0 , 32, k64), // kLoad256_U64.
+ DEFINE_OP(0 , 32, k32), // kLoad256_F32.
+ DEFINE_OP(0 , 32, k64), // kLoad256_F64.
+ DEFINE_OP(0 , 64, k32), // kLoad512_U32.
+ DEFINE_OP(0 , 64, k64), // kLoad512_U64.
+ DEFINE_OP(0 , 64, k32), // kLoad512_F32.
+ DEFINE_OP(0 , 64, k64), // kLoad512_F64.
+ DEFINE_OP(0 , 0, k32), // kLoadN_U32.
+ DEFINE_OP(0 , 0, k64), // kLoadN_U64.
+ DEFINE_OP(0 , 0, k32), // kLoadN_F32.
+ DEFINE_OP(0 , 0, k64), // kLoadN_F64.
+ DEFINE_OP(1 , 2, kNA), // kLoadCvt16_U8ToU64.
+ DEFINE_OP(1 , 4, kNA), // kLoadCvt32_U8ToU64.
+ DEFINE_OP(1 , 8, kNA), // kLoadCvt64_U8ToU64.
+ DEFINE_OP(UniOpVV::kCvtI8LoToI16 , 4, kNA), // kLoadCvt32_I8ToI16.
+ DEFINE_OP(UniOpVV::kCvtU8LoToU16 , 4, kNA), // kLoadCvt32_U8ToU16.
+ DEFINE_OP(UniOpVV::kCvtI8ToI32 , 4, kNA), // kLoadCvt32_I8ToI32.
+ DEFINE_OP(UniOpVV::kCvtU8ToU32 , 4, kNA), // kLoadCvt32_U8ToU32.
+ DEFINE_OP(UniOpVV::kCvtI16LoToI32, 4, kNA), // kLoadCvt32_I16ToI32.
+ DEFINE_OP(UniOpVV::kCvtU16LoToU32, 4, kNA), // kLoadCvt32_U16ToU32.
+ DEFINE_OP(UniOpVV::kCvtI32LoToI64, 4, kNA), // kLoadCvt32_I32ToI64.
+ DEFINE_OP(UniOpVV::kCvtU32LoToU64, 4, kNA), // kLoadCvt32_U32ToU64.
+ DEFINE_OP(UniOpVV::kCvtI8LoToI16 , 8, kNA), // kLoadCvt64_I8ToI16.
+ DEFINE_OP(UniOpVV::kCvtU8LoToU16 , 8, kNA), // kLoadCvt64_U8ToU16.
+ DEFINE_OP(UniOpVV::kCvtI8ToI32 , 8, kNA), // kLoadCvt64_I8ToI32.
+ DEFINE_OP(UniOpVV::kCvtU8ToU32 , 8, kNA), // kLoadCvt64_U8ToU32.
+ DEFINE_OP(UniOpVV::kCvtI16LoToI32, 8, kNA), // kLoadCvt64_I16ToI32.
+ DEFINE_OP(UniOpVV::kCvtU16LoToU32, 8, kNA), // kLoadCvt64_U16ToU32.
+ DEFINE_OP(UniOpVV::kCvtI32LoToI64, 8, kNA), // kLoadCvt64_I32ToI64.
+ DEFINE_OP(UniOpVV::kCvtU32LoToU64, 8, kNA), // kLoadCvt64_U32ToU64.
+ DEFINE_OP(UniOpVV::kCvtI8LoToI16 , 16, kNA), // kLoadCvt128_I8ToI16.
+ DEFINE_OP(UniOpVV::kCvtU8LoToU16 , 16, kNA), // kLoadCvt128_U8ToU16.
+ DEFINE_OP(UniOpVV::kCvtI8ToI32 , 16, kNA), // kLoadCvt128_I8ToI32.
+ DEFINE_OP(UniOpVV::kCvtU8ToU32 , 16, kNA), // kLoadCvt128_U8ToU32.
+ DEFINE_OP(UniOpVV::kCvtI16LoToI32, 16, kNA), // kLoadCvt128_I16ToI32.
+ DEFINE_OP(UniOpVV::kCvtU16LoToU32, 16, kNA), // kLoadCvt128_U16ToU32.
+ DEFINE_OP(UniOpVV::kCvtI32LoToI64, 16, kNA), // kLoadCvt128_I32ToI64.
+ DEFINE_OP(UniOpVV::kCvtU32LoToU64, 16, kNA), // kLoadCvt128_U32ToU64.
+ DEFINE_OP(UniOpVV::kCvtI8LoToI16 , 32, kNA), // kLoadCvt256_I8ToI16.
+ DEFINE_OP(UniOpVV::kCvtU8LoToU16 , 32, kNA), // kLoadCvt256_U8ToU16.
+ DEFINE_OP(UniOpVV::kCvtI16LoToI32, 32, kNA), // kLoadCvt256_I16ToI32.
+ DEFINE_OP(UniOpVV::kCvtU16LoToU32, 32, kNA), // kLoadCvt256_U16ToU32.
+ DEFINE_OP(UniOpVV::kCvtI32LoToI64, 32, kNA), // kLoadCvt256_I32ToI64.
+ DEFINE_OP(UniOpVV::kCvtU32LoToU64, 32, kNA), // kLoadCvt256_U32ToU64.
+ DEFINE_OP(1 , 0, kNA), // kLoadCvtN_U8ToU64.
+ DEFINE_OP(UniOpVV::kCvtI8LoToI16 , 0, kNA), // kLoadCvtN_I8ToI16.
+ DEFINE_OP(UniOpVV::kCvtU8LoToU16 , 0, kNA), // kLoadCvtN_U8ToU16.
+ DEFINE_OP(UniOpVV::kCvtI8ToI32 , 0, kNA), // kLoadCvtN_I8ToI32.
+ DEFINE_OP(UniOpVV::kCvtU8ToU32 , 0, kNA), // kLoadCvtN_U8ToU32.
+ DEFINE_OP(UniOpVV::kCvtI16LoToI32, 0, kNA), // kLoadCvtN_I16ToI32.
+ DEFINE_OP(UniOpVV::kCvtU16LoToU32, 0, kNA), // kLoadCvtN_U16ToU32.
+ DEFINE_OP(UniOpVV::kCvtI32LoToI64, 0, kNA), // kLoadCvtN_I32ToI64.
+ DEFINE_OP(UniOpVV::kCvtU32LoToU64, 0, kNA), // kLoadCvtN_U32ToU64.
+ DEFINE_OP(0 , 1, k8 ), // kLoadInsertU8.
+ DEFINE_OP(0 , 2, k16), // kLoadInsertU16.
+ DEFINE_OP(0 , 4, k32), // kLoadInsertU32.
+ DEFINE_OP(0 , 8, k64), // kLoadInsertU64.
+ DEFINE_OP(0 , 4, k32), // kLoadInsertF32.
+ DEFINE_OP(0 , 8, k64), // kLoadInsertF32x2.
+ DEFINE_OP(0 , 8, k64) // kLoadInsertF64.
+};
+
+static constexpr UniOpVMInfo opcode_info_2mv[size_t(UniOpMV::kMaxValue) + 1] = {
+ DEFINE_OP(NarrowingOp::kNone , 1, k8 ), // kStore8.
+ DEFINE_OP(NarrowingOp::kNone , 2, k16), // kStore16_U16.
+ DEFINE_OP(NarrowingOp::kNone , 4, k32), // kStore32_U32.
+ DEFINE_OP(NarrowingOp::kNone , 4, k32), // kStore32_F32.
+ DEFINE_OP(NarrowingOp::kNone , 8, k32), // kStore64_U32.
+ DEFINE_OP(NarrowingOp::kNone , 8, k64), // kStore64_U64.
+ DEFINE_OP(NarrowingOp::kNone , 8, k32), // kStore64_F32.
+ DEFINE_OP(NarrowingOp::kNone , 8, k64), // kStore64_F64.
+ DEFINE_OP(NarrowingOp::kNone , 16, k32), // kStore128_U32.
+ DEFINE_OP(NarrowingOp::kNone , 16, k64), // kStore128_U64.
+ DEFINE_OP(NarrowingOp::kNone , 16, k32), // kStore128_F32.
+ DEFINE_OP(NarrowingOp::kNone , 16, k64), // kStore128_F64.
+ DEFINE_OP(NarrowingOp::kNone , 32, k32), // kStore256_U32.
+ DEFINE_OP(NarrowingOp::kNone , 32, k64), // kStore256_U64.
+ DEFINE_OP(NarrowingOp::kNone , 32, k32), // kStore256_F32.
+ DEFINE_OP(NarrowingOp::kNone , 32, k64), // kStore256_F64.
+ DEFINE_OP(NarrowingOp::kNone , 64, k32), // kStore512_U32.
+ DEFINE_OP(NarrowingOp::kNone , 64, k64), // kStore512_U64.
+ DEFINE_OP(NarrowingOp::kNone , 64, k32), // kStore512_F32.
+ DEFINE_OP(NarrowingOp::kNone , 64, k64), // kStore512_F64.
+ DEFINE_OP(NarrowingOp::kNone , 0, k32), // kStoreN_U32.
+ DEFINE_OP(NarrowingOp::kNone , 0, k64), // kStoreN_U64.
+ DEFINE_OP(NarrowingOp::kNone , 0, k32), // kStoreN_F32.
+ DEFINE_OP(NarrowingOp::kNone , 0, k64) // kStoreN_F64.
+ /*
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 8, kNA), // kStoreCvtz64_U16ToU8.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 8, kNA), // kStoreCvtz64_U32ToU16.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 8, kNA), // kStoreCvtz64_U64ToU32.
+ DEFINE_OP(NarrowingOp::kI16ToI8 , 8, kNA), // kStoreCvts64_I16ToI8.
+ DEFINE_OP(NarrowingOp::kI16ToU8 , 8, kNA), // kStoreCvts64_I16ToU8.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 8, kNA), // kStoreCvts64_U16ToU8.
+ DEFINE_OP(NarrowingOp::kI32ToI16 , 8, kNA), // kStoreCvts64_I32ToI16.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 8, kNA), // kStoreCvts64_U32ToU16.
+ DEFINE_OP(NarrowingOp::kI64ToI32 , 8, kNA), // kStoreCvts64_I64ToI32.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 8, kNA), // kStoreCvts64_U64ToU32.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 16, kNA), // kStoreCvtz128_U16ToU8.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 16, kNA), // kStoreCvtz128_U32ToU16.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 16, kNA), // kStoreCvtz128_U64ToU32.
+ DEFINE_OP(NarrowingOp::kI16ToI8 , 16, kNA), // kStoreCvts128_I16ToI8.
+ DEFINE_OP(NarrowingOp::kI16ToU8 , 16, kNA), // kStoreCvts128_I16ToU8.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 16, kNA), // kStoreCvts128_U16ToU8.
+ DEFINE_OP(NarrowingOp::kI32ToI16 , 16, kNA), // kStoreCvts128_I32ToI16.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 16, kNA), // kStoreCvts128_U32ToU16.
+ DEFINE_OP(NarrowingOp::kI64ToI32 , 16, kNA), // kStoreCvts128_I64ToI32.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 16, kNA), // kStoreCvts128_U64ToU32.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 32, kNA), // kStoreCvtz256_U16ToU8.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 32, kNA), // kStoreCvtz256_U32ToU16.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 32, kNA), // kStoreCvtz256_U64ToU32.
+ DEFINE_OP(NarrowingOp::kI16ToI8 , 32, kNA), // kStoreCvts256_I16ToI8.
+ DEFINE_OP(NarrowingOp::kI16ToU8 , 32, kNA), // kStoreCvts256_I16ToU8.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 32, kNA), // kStoreCvts256_U16ToU8.
+ DEFINE_OP(NarrowingOp::kI32ToI16 , 32, kNA), // kStoreCvts256_I32ToI16.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 32, kNA), // kStoreCvts256_U32ToU16.
+ DEFINE_OP(NarrowingOp::kI64ToI32 , 32, kNA), // kStoreCvts256_I64ToI32.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 32, kNA), // kStoreCvts256_U64ToU32.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 0, kNA), // kStoreCvtzN_U16ToU8.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 0, kNA), // kStoreCvtzN_U32ToU16.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 0, kNA), // kStoreCvtzN_U64ToU32.
+ DEFINE_OP(NarrowingOp::kI16ToI8 , 0, kNA), // kStoreCvtsN_I16ToI8.
+ DEFINE_OP(NarrowingOp::kI16ToU8 , 0, kNA), // kStoreCvtsN_I16ToU8.
+ DEFINE_OP(NarrowingOp::kU16ToU8 , 0, kNA), // kStoreCvtsN_U16ToU8.
+ DEFINE_OP(NarrowingOp::kI32ToI16 , 0, kNA), // kStoreCvtsN_I32ToI16.
+ DEFINE_OP(NarrowingOp::kU32ToU16 , 0, kNA), // kStoreCvtsN_U32ToU16.
+ DEFINE_OP(NarrowingOp::kI64ToI32 , 0, kNA), // kStoreCvtsN_I64ToI32.
+ DEFINE_OP(NarrowingOp::kU64ToU32 , 0, kNA) // kStoreCvtsN_U64ToU32.
+ */
+};
+
+#undef DEFINE_OP
+
+// ujit::UniCompiler - Vector Instructions - Utility Functions
+// ===========================================================
+
+static constexpr uint32_t float_mode_mem_size_table[5] = { 0, 4, 8, 0, 0 };
+
+static ASMJIT_INLINE bool is_same_vec(const Vec& a, const Operand_& b) noexcept {
+ return b.is_vec() && a.id() == b.id();
+}
+
+static ASMJIT_INLINE void vec_set_vec_type(Vec& vec, ElementSize sz) noexcept {
+ static constexpr uint32_t signatures[5] = {
+ RegTraits<RegType::kVec8>::kSignature,
+ RegTraits<RegType::kVec16>::kSignature,
+ RegTraits<RegType::kVec32>::kSignature,
+ RegTraits<RegType::kVec64>::kSignature,
+ RegTraits<RegType::kVec128>::kSignature
+ };
+ vec.set_signature(OperandSignature{signatures[size_t(sz)]});
+}
+
+static ASMJIT_INLINE void vec_set_type(Vec& vec, ElementSize sz) noexcept {
+ vec.set_element_type(a64::VecElementType(uint32_t(sz) + 1));
+}
+
+static ASMJIT_INLINE void vec_set_type_and_index(Vec& vec, ElementSize sz, uint32_t idx) noexcept {
+ vec.set_element_type(a64::VecElementType(uint32_t(sz) + 1));
+ vec.set_element_index(idx);
+}
+
+static ASMJIT_NOINLINE void vec_load_mem(UniCompiler& uc, const Vec& dst, Mem src, uint32_t mem_size) {
+ BackendCompiler* cc = uc.cc;
+
+ if (src.has_index() && src.has_shift()) {
+ // AArch64 limitation: index shift can be the same size as the size of the read operation, so H << 1, S << 2,
+ // etc... Other shift values are not supported at the architectural level, so we have to precalculate the address.
+ uint32_t shift = src.shift();
+ if (mem_size != (1u << shift) || src.has_offset()) {
+ Gp base = src.base_reg().as<Gp>();
+ Gp index = src.index_reg().as<Gp>();
+
+ if (src.is_pre_index()) {
+ cc->add(base, base, index, a64::Shift(src.shift_op(), shift));
+ src = a64::ptr(base, src.offset_lo32());
+ }
+ else {
+ Gp tmp = uc.new_gpz("@mem_addr");
+ cc->add(tmp, base, index, a64::Shift(src.shift_op(), shift));
+ src = a64::ptr(tmp, src.offset_lo32());
+ }
+ }
+ }
+
+ switch (mem_size) {
+ case 1: cc->ldr(dst.b(), src); break;
+ case 2: cc->ldr(dst.h(), src); break;
+ case 4: cc->ldr(dst.s(), src); break;
+ case 8: cc->ldr(dst.d(), src); break;
+ case 16: cc->ldr(dst.q(), src); break;
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+static ASMJIT_NOINLINE Vec vec_from_mem(UniCompiler& uc, const Mem& op, const Vec& ref, uint32_t mem_size = 0) {
+ Vec vec = uc.new_vec128("@tmp");
+ if (mem_size == 0)
+ mem_size = ref.size();
+ vec_load_mem(uc, vec, op, mem_size);
+ return vec.clone_as(ref);
+}
+
+static ASMJIT_INLINE Vec as_vec(UniCompiler& uc, const Operand_& op, const Vec& ref, uint32_t mem_size = 0) {
+ if (op.is_vec())
+ return op.as<Vec>().clone_as(ref);
+ else
+ return vec_from_mem(uc, op.as<Mem>(), ref, mem_size);
+}
+
+static ASMJIT_INLINE Vec as_vec(UniCompiler& uc, const Operand_& op, const Vec& ref, FloatMode fm) {
+ if (op.is_vec())
+ return op.as<Vec>().clone_as(ref);
+ else
+ return vec_from_mem(uc, op.as<Mem>(), ref, float_mode_mem_size_table[size_t(fm)]);
+}
+
+static ASMJIT_NOINLINE Vec vec_mov(UniCompiler& uc, const Vec& dst_, const Operand_& src_) {
+ BackendCompiler* cc = uc.cc;
+
+ Vec dst(dst_);
+ vec_set_type(dst, ElementSize::k8);
+
+ if (src_.is_vec()) {
+ if (dst.id() != src_.id()) {
+ Vec src = src_.as<Vec>();
+ vec_set_type(src, ElementSize::k8);
+ cc->mov(dst, src.as<Vec>());
+ }
+ return dst;
+ }
+
+ if (src_.is_mem()) {
+ vec_load_mem(uc, dst, src_.as<Mem>(), dst.size());
+ return dst;
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static ASMJIT_NOINLINE void vec_neg(UniCompiler& uc, const Vec& dst, const Vec& src, FloatMode fm) {
+ BackendCompiler* cc = uc.cc;
+
+ if (fm == FloatMode::kF32S)
+ cc->mvn_(dst.s(), src.s());
+ else if (fm == FloatMode::kF64S)
+ cc->mvn_(dst.d(), src.d());
+ else
+ cc->mvn_(dst.q(), src.q());
+}
+
+// ujit::UniCompiler - Vector Instructions - Swizzle 32 Impl
+// =========================================================
+
+// [DCBA] <- Mov (DCBA, dcba)
+// [AAAA] <- Dup0 (DCBA, dcba)
+// [BBBB] <- Dup1 (DCBA, dcba)
+// [CCCC] <- Dup2 (DCBA, dcba)
+// [DDDD] <- Dup3 (DCBA, dcba)
+// [CDAB] <- Rev64 (DCBA, dcba)
+// [aDCB] <- Ext4 (DCBA, dcba) [dcb|aDCB|A ]
+// [baDC] <- Ext8 (DCBA, dcba) [ dc|baDC|BA ]
+// [cbaD] <- Ext12 (DCBA, dcba) [ d|cbaD|CBA]
+// [bBaA] <- Zip1_4S(DCBA, dcba)
+// [baBA] <- Zip1_2D(DCBA, dcba)
+// [dDcC] <- Zip2_4S(DCBA, dcba)
+// [dcDC] <- Zip2_2D(DCBA, dcba)
+// [caCA] <- Uzp1_4S(DCBA, dcba)
+// [baBA] <- Uzp1_2D(DCBA, dcba)
+// [dbDB] <- Uzp2_4S(DCBA, dcba)
+// [dcDC] <- Uzp2_2D(DCBA, dcba)
+// [cCaA] <- Trn1_4S(DCBA, dcba)
+// [dDbB] <- Trn2_4S(DCBA, dcba)
+struct Swizzle32Data {
+ enum class OpTarget : uint8_t {
+ kDst = 0,
+ k1 = 1,
+ k2 = 2,
+ kA = 3,
+
+ k_ = kDst
+ };
+
+ struct Op {
+ //! Swizzle operation does nothing - 'mov' (this can be only the first operation).
+ static constexpr uint8_t kMov = 1;
+ //! Swizzle operation performs an insert - moves a value from one lane to another.
+ static constexpr uint8_t kIns = 2;
+ //! Swizzle operation duplicates a lane across all others - 'dup'.
+ static constexpr uint8_t kDup = 3;
+ //! Swizzle operation rotates a vector - 'ext'.
+ static constexpr uint8_t kExt = 4;
+ //! Swizzle operation swaps lo/hi elements of 64-bit lanes - 'rev64'.
+ static constexpr uint8_t kRev64 = 5;
+ //! Swizzle operation can be implemented as a single zip[1|2], uzp[1|2], or trn[1|2] instruction with 32-bit or 64-bit elements.
+ static constexpr uint8_t kZipUnzip = 7;
+
+ static constexpr uint8_t kIns0To1 = uint8_t(kIns ) | (0 << 4) | (1 << 6);
+ static constexpr uint8_t kIns0To2 = uint8_t(kIns ) | (0 << 4) | (2 << 6);
+ static constexpr uint8_t kIns0To3 = uint8_t(kIns ) | (0 << 4) | (3 << 6);
+ static constexpr uint8_t kIns1To0 = uint8_t(kIns ) | (1 << 4) | (0 << 6);
+ static constexpr uint8_t kIns1To2 = uint8_t(kIns ) | (1 << 4) | (2 << 6);
+ static constexpr uint8_t kIns1To3 = uint8_t(kIns ) | (1 << 4) | (3 << 6);
+ static constexpr uint8_t kIns2To0 = uint8_t(kIns ) | (2 << 4) | (0 << 6);
+ static constexpr uint8_t kIns2To1 = uint8_t(kIns ) | (2 << 4) | (1 << 6);
+ static constexpr uint8_t kIns2To3 = uint8_t(kIns ) | (2 << 4) | (3 << 6);
+ static constexpr uint8_t kIns3To0 = uint8_t(kIns ) | (3 << 4) | (0 << 6);
+ static constexpr uint8_t kIns3To1 = uint8_t(kIns ) | (3 << 4) | (1 << 6);
+ static constexpr uint8_t kIns3To2 = uint8_t(kIns ) | (3 << 4) | (2 << 6);
+ static constexpr uint8_t kDup0 = uint8_t(kDup ) | (0 << 4);
+ static constexpr uint8_t kDup1 = uint8_t(kDup ) | (1 << 4);
+ static constexpr uint8_t kDup2 = uint8_t(kDup ) | (2 << 4);
+ static constexpr uint8_t kDup3 = uint8_t(kDup ) | (3 << 4);
+ static constexpr uint8_t kExt4 = uint8_t(kExt ) | (1 << 4);
+ static constexpr uint8_t kExt8 = uint8_t(kExt ) | (2 << 4);
+ static constexpr uint8_t kExt12 = uint8_t(kExt ) | (3 << 4);
+ static constexpr uint8_t kZip1_4S = uint8_t(kZipUnzip) | (0 << 4) | (0 << 7);
+ static constexpr uint8_t kZip1_2D = uint8_t(kZipUnzip) | (0 << 4) | (1 << 7);
+ static constexpr uint8_t kZip2_4S = uint8_t(kZipUnzip) | (1 << 4) | (0 << 7);
+ static constexpr uint8_t kZip2_2D = uint8_t(kZipUnzip) | (1 << 4) | (1 << 7);
+ static constexpr uint8_t kUzp1_4S = uint8_t(kZipUnzip) | (2 << 4) | (0 << 7);
+ static constexpr uint8_t kUzp1_2D = uint8_t(kZipUnzip) | (2 << 4) | (1 << 7);
+ static constexpr uint8_t kUzp2_4S = uint8_t(kZipUnzip) | (3 << 4) | (0 << 7);
+ static constexpr uint8_t kUzp2_2D = uint8_t(kZipUnzip) | (3 << 4) | (1 << 7);
+ static constexpr uint8_t kTrn1_4S = uint8_t(kZipUnzip) | (4 << 4);
+ static constexpr uint8_t kTrn2_4S = uint8_t(kZipUnzip) | (5 << 4);
+
+ // Alias to nothing to make the table easier to read.
+ static constexpr uint8_t k_ = 0;
+
+ uint8_t data;
+
+ ASMJIT_INLINE_NODEBUG bool is_valid() const noexcept { return data != 0; }
+ ASMJIT_INLINE_NODEBUG uint32_t type() const noexcept { return data & 0xF; }
+
+ ASMJIT_INLINE_NODEBUG uint32_t dup_idx() const noexcept { return (data >> 4) & 0x3; }
+ ASMJIT_INLINE_NODEBUG uint32_t ext_imm() const noexcept { return (data >> 2) & (0x3 << 2); }
+
+ ASMJIT_INLINE_NODEBUG uint32_t zip_op() const noexcept { return (data >> 4) & 0x7; }
+ ASMJIT_INLINE_NODEBUG bool zip_s4() const noexcept { return (data & (1 << 7)) == 0; }
+
+ ASMJIT_INLINE_NODEBUG uint32_t ins_src() const noexcept { return (data >> 4) & 0x3; }
+ ASMJIT_INLINE_NODEBUG uint32_t ins_dst() const noexcept { return (data >> 6) & 0x3; }
+ };
+
+ //! \name Members
+ //! \{
+
+ Op ops[3];
+ uint8_t flags;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG bool is_defined() const noexcept { return ops[0].data != 0; }
+ ASMJIT_INLINE_NODEBUG Op op(uint32_t index) const noexcept { return ops[index]; }
+ ASMJIT_INLINE_NODEBUG OpTarget op_target(uint32_t index) const noexcept { return OpTarget((flags >> (index * 2)) & 0x3); }
+
+ //! \}
+};
+
+// This table provides all combinations for all possible 32-bit swizzles (there is 256 combinations in total).
+// It prioritizes lane moves, and then operations that can have either one or two inputs. Each operation has
+// a target, which specifies whether it replaces the destination or one or both sources that are then passed
+// to a next operation. The last operation must always be `OpTarget::kDst` so the result ends up in the right
+// register.
+//
+// In general the decomposition of operations needed for all swizzles is as follows:
+//
+// - 1 Op Swizzles: 17
+// - 2 Op Swizzles: 156
+// - 3 Op Swizzles: 83
+//
+// Which means that luckily most used swizzles would fall into 1 or 2 operations.
+//
+// NOTE: Moves (InsXToY) operations only happen on the destination as they are destructive, which is perfectly
+// okay as moving them into earlier steps didn't really improve anything.
+#define OP(swiz, op0, target0, op1, target1, op2, target2) { \
+ { \
+ {Swizzle32Data::Op::k##op0}, \
+ {Swizzle32Data::Op::k##op1}, \
+ {Swizzle32Data::Op::k##op2} \
+ }, \
+ ( \
+ (uint16_t(Swizzle32Data::OpTarget::k##target0) << 0) | \
+ (uint16_t(Swizzle32Data::OpTarget::k##target1) << 2) | \
+ (uint16_t(Swizzle32Data::OpTarget::k##target2) << 4) \
+ ) \
+}
+
+static constexpr Swizzle32Data swizzle_32_data[256] = {
+ OP(0000, Dup0 , _, _ , _, _ , _), OP(0001, Rev64 , _, Ins1To2, _, Ins1To3, _), OP(0002, Ext8 , _, Ins2To1, _, Ins2To3, _), OP(0003, Dup0 , 2, Ext12 , _, _ , _),
+ OP(0010, Zip1_2D, _, Ins0To3, _, _ , _), OP(0011, Rev64 , A, Zip1_4S, _, _ , _), OP(0012, Ext8 , _, Ins3To1, _, Ins2To3, _), OP(0013, Rev64 , 2, Ext12 , _, Ins2To3, _),
+ OP(0020, Uzp1_4S, _, Ins0To3, _, _ , _), OP(0021, Ext4 , _, Ins3To2, _, _ , _), OP(0022, Ext4 , A, Trn2_4S, _, _ , _), OP(0023, Ext4 , _, Ins2To0, _, Ins3To2, _),
+ OP(0030, Ext8 , _, Ins2To0, _, Ins2To3, _), OP(0031, Dup0 , 2, Uzp2_4S, _, _ , _), OP(0032, Ext8 , _, Ins2To3, _, _ , _), OP(0033, Ext4 , A, Zip2_4S, _, _ , _),
+ OP(0100, Zip1_4S, _, Ins0To3, _, _ , _), OP(0101, Rev64 , A, Zip1_2D, _, _ , _), OP(0102, Ext12 , _, Ins3To0, _, Ins1To3, _), OP(0103, Ext12 , _, Ins1To3, _, _ , _),
+ OP(0110, Rev64 , 2, Zip1_4S, _, _ , _), OP(0111, Dup1 , 1, Ext4 , _, _ , _), OP(0112, Rev64 , 2, Ext8 , _, Ins2To1, _), OP(0113, Ext12 , _, Ins1To3, _, Ins2To1, _),
+ OP(0120, Ext4 , _, Ins0To2, _, Ins3To0, _), OP(0121, Ext4 , _, Ins0To2, _, _ , _), OP(0122, Ext4 , _, Ins0To2, _, Ins1To0, _), OP(0123, Rev64 , A, Ext8 , _, _ , _),
+ OP(0130, Ext12 , 2, Zip1_4S, _, _ , _), OP(0131, Ext4 , _, Ins2To1, _, Ins0To2, _), OP(0132, Rev64 , 2, Ext8 , _, _ , _), OP(0133, Ext12 , _, Ins1To3, _, Ins0To1, _),
+ OP(0200, Trn1_4S, _, Ins0To3, _, _ , _), OP(0201, Rev64 , _, Ins3To2, _, Ins1To3, _), OP(0202, Ext4 , A, Uzp2_4S, _, _ , _), OP(0203, Uzp1_4S, 2, Ext12 , _, _ , _),
+ OP(0210, Mov , _, Ins0To3, _, _ , _), OP(0211, Mov , _, Ins0To3, _, Ins1To0, _), OP(0212, Mov , _, Ins0To3, _, Ins2To0, _), OP(0213, Rev64 , A, Ext8 , 1, Zip1_4S, _),
+ OP(0220, Ext8 , 2, Uzp1_4S, _, _ , _), OP(0221, Ext4 , _, Ins1To2, _, _ , _), OP(0222, Dup2 , 1, Ext4 , _, _ , _), OP(0223, Ext4 , _, Ins2To0, _, Ins1To2, _),
+ OP(0230, Rev64 , 1, Ext4 , _, _ , _), OP(0231, Ext4 , 2, Uzp2_4S, _, _ , _), OP(0232, Ext8 , _, Ins2To3, _, Ins0To2, _), OP(0233, Rev64 , 1, Ext4 , _, Ins1To0, _),
+ OP(0300, Rev64 , _, Ins1To0, _, Ins1To3, _), OP(0301, Rev64 , _, Ins1To3, _, _ , _), OP(0302, Dup0 , 2, Zip2_4S, _, _ , _), OP(0303, Ext4 , A, Zip2_2D, _, _ , _),
+ OP(0310, Ext12 , 2, Zip1_2D, _, _ , _), OP(0311, Ext4 , _, Ins0To1, _, _ , _), OP(0312, Dup0 , 2, Zip1_4S, 2, Zip2_4S, _), OP(0313, Uzp2_4S, 1, Ext4 , _, _ , _),
+ OP(0320, Ext4 , _, Ins3To0, _, _ , _), OP(0321, Ext4 , _, _ , _, _ , _), OP(0322, Ext4 , _, Ins1To0, _, _ , _), OP(0323, Ext4 , _, Ins2To0, _, _ , _),
+ OP(0330, Ext4 , _, Ins2To1, _, Ins3To0, _), OP(0331, Ext4 , _, Ins2To1, _, _ , _), OP(0332, Ext4 , 2, Zip2_4S, _, _ , _), OP(0333, Dup3 , 1, Ext4 , _, _ , _),
+ OP(1000, Zip1_4S, _, Ins0To2, _, _ , _), OP(1001, Rev64 , 1, Zip1_4S, _, _ , _), OP(1002, Ext8 , _, Ins2To1, _, _ , _), OP(1003, Ext4 , 1, Ext8 , _, _ , _),
+ OP(1010, Zip1_2D, _, _ , _, _ , _), OP(1011, Zip1_2D, _, Ins1To0, _, _ , _), OP(1012, Ext8 , _, Ins3To1, _, _ , _), OP(1013, Ext8 , _, Ins1To0, _, Ins3To1, _),
+ OP(1020, Zip1_4S, 2, Uzp1_4S, _, _ , _), OP(1021, Ext4 , 1, Zip1_2D, _, _ , _), OP(1022, Ext8 , _, Ins0To1, _, _ , _), OP(1023, Rev64 , 1, Ext8 , _, _ , _),
+ OP(1030, Ext8 , _, Ins2To0, _, _ , _), OP(1031, Ext8 , _, Ins3To0, _, _ , _), OP(1032, Ext8 , _, _ , _, _ , _), OP(1033, Ext8 , _, Ins1To0, _, _ , _),
+ OP(1100, Zip1_4S, _, _ , _, _ , _), OP(1101, Zip1_4S, _, Ins2To0, _, _ , _), OP(1102, Ext8 , _, Ins2To1, _, Ins3To2, _), OP(1103, Ext12 , _, Ins2To3, _, _ , _),
+ OP(1110, Zip1_4S, _, Ins2To1, _, _ , _), OP(1111, Dup1 , _, _ , _, _ , _), OP(1112, Ext8 , _, Ins3To1, _, Ins3To2, _), OP(1113, Dup1 , 2, Ext12 , _, _ , _),
+ OP(1120, Dup1 , 2, Uzp1_4S, _, _ , _), OP(1121, Ext4 , _, Ins0To2, _, Ins0To3, _), OP(1122, Ext8 , _, Ins0To1, _, Ins3To2, _), OP(1123, Ext12 , _, Ins3To1, _, Ins2To3, _),
+ OP(1130, Ext8 , _, Ins2To0, _, Ins3To2, _), OP(1131, Uzp2_4S, _, Ins0To3, _, _ , _), OP(1132, Ext8 , _, Ins3To2, _, _ , _), OP(1133, Ext8 , A, Trn2_4S, _, _ , _),
+ OP(1200, Zip1_4S, 2, Trn1_4S, _, _ , _), OP(1201, Ext4 , 1, Zip1_4S, _, _ , _), OP(1202, Dup2 , 1, Zip1_4S, _, _ , _), OP(1203, Dup1 , 2, Uzp1_4S, 2, Ext12 , _),
+ OP(1210, Mov , _, Ins1To3, _, _ , _), OP(1211, Mov , _, Ins1To0, _, Ins1To3, _), OP(1212, Mov , _, Ins1To3, _, Ins2To0, _), OP(1213, Mov , _, Ins3To0, _, Ins1To3, _),
+ OP(1220, Mov , _, Ins1To3, _, Ins2To1, _), OP(1221, Ext4 , _, Ins0To3, _, Ins1To2, _), OP(1222, Ext8 , _, Ins0To1, _, Ins0To2, _), OP(1223, Rev64 , 1, Ext8 , _, Ins1To2, _),
+ OP(1230, Rev64 , A, Ext4 , _, _ , _), OP(1231, Ext8 , _, Ins0To2, _, Ins3To0, _), OP(1232, Ext8 , _, Ins0To2, _, _ , _), OP(1233, Ext8 , _, Ins0To2, _, Ins1To0, _),
+ OP(1300, Rev64 , _, Ins0To3, _, Ins1To0, _), OP(1301, Rev64 , _, Ins0To3, _, _ , _), OP(1302, Ext8 , 1, Zip1_4S, _, _ , _), OP(1303, Dup3 , 1, Zip1_4S, _, _ , _),
+ OP(1310, Mov , _, Ins3To2, _, Ins1To3, _), OP(1311, Trn2_4S, _, Ins0To3, _, _ , _), OP(1312, Dup1 , 2, Zip2_4S, _, _ , _), OP(1313, Ext8 , A, Uzp2_4S, _, _ , _),
+ OP(1320, Ext12 , 2, Uzp1_4S, _, _ , _), OP(1321, Ext4 , _, Ins0To3, _, _ , _), OP(1322, Ext4 , _, Ins0To3, _, Ins1To0, _), OP(1323, Ext4 , _, Ins0To3, _, Ins2To0, _),
+ OP(1330, Ext8 , _, Ins2To0, _, Ins1To2, _), OP(1331, Ext8 , 2, Uzp2_4S, _, _ , _), OP(1332, Ext8 , _, Ins1To2, _, _ , _), OP(1333, Ext8 , _, Ins1To0, _, Ins1To2, _),
+ OP(2000, Uzp1_4S, _, Ins0To1, _, _ , _), OP(2001, Rev64 , _, Ins1To2, _, _ , _), OP(2002, Ext8 , 1, Uzp1_4S, _, _ , _), OP(2003, Ext12 , _, Ins1To2, _, _ , _),
+ OP(2010, Zip1_4S, 1, Uzp1_4S, _, _ , _), OP(2011, Dup1 , 1, Uzp1_4S, _, _ , _), OP(2012, Ext8 , _, Ins3To1, _, Ins0To3, _), OP(2013, Ext12 , 1, Uzp1_4S, _, _ , _),
+ OP(2020, Uzp1_4S, _, _ , _, _ , _), OP(2021, Rev64 , _, Ins1To2, _, Ins3To1, _), OP(2022, Uzp1_4S, _, Ins1To0, _, _ , _), OP(2023, Ext12 , _, Ins1To2, _, Ins3To1, _),
+ OP(2030, Ext8 , _, Ins0To3, _, Ins2To0, _), OP(2031, Rev64 , 1, Uzp1_4S, _, _ , _), OP(2032, Ext8 , _, Ins0To3, _, _ , _), OP(2033, Dup3 , 1, Uzp1_4S, _, _ , _),
+ OP(2100, Ext12 , _, Ins1To0, _, _ , _), OP(2101, Rev64 , _, Ins0To2, _, _ , _), OP(2102, Ext12 , _, Ins3To0, _, _ , _), OP(2103, Ext12 , _, _ , _, _ , _),
+ OP(2110, Ext4 , 2, Zip1_4S, _, _ , _), OP(2111, Rev64 , _, Ins0To1, _, Ins0To2, _), OP(2112, Ext12 , _, Ins2To1, _, Ins3To0, _), OP(2113, Ext12 , _, Ins2To1, _, _ , _),
+ OP(2120, Dup2 , 2, Zip1_4S, _, _ , _), OP(2121, Ext4 , A, Zip1_2D, _, _ , _), OP(2122, Ext12 , _, Ins3To0, _, Ins3To1, _), OP(2123, Ext12 , _, Ins3To1, _, _ , _),
+ OP(2130, Dup2 , 2, Ext12 , 2, Zip1_4S, _), OP(2131, Rev64 , _, Ins2To1, _, Ins0To2, _), OP(2132, Ext4 , 2, Ext8 , _, _ , _), OP(2133, Ext12 , _, Ins0To1, _, _ , _),
+ OP(2200, Trn1_4S, _, _ , _, _ , _), OP(2201, Rev64 , _, Ins3To2, _, _ , _), OP(2202, Trn1_4S, _, Ins2To0, _, _ , _), OP(2203, Ext12 , _, Ins3To2, _, _ , _),
+ OP(2210, Mov , _, Ins2To3, _, _ , _), OP(2211, Ext4 , A, Zip1_4S, _, _ , _), OP(2212, Mov , _, Ins2To0, _, Ins2To3, _), OP(2213, Mov , _, Ins3To0, _, Ins2To3, _),
+ OP(2220, Uzp1_4S, _, Ins1To2, _, _ , _), OP(2221, Rev64 , _, Ins3To1, _, Ins3To2, _), OP(2222, Dup2 , _, _ , _, _ , _), OP(2223, Dup2 , 2, Ext12 , _, _ , _),
+ OP(2230, Mov , _, Ins3To1, _, Ins2To3, _), OP(2231, Dup2 , 2, Uzp2_4S, _, _ , _), OP(2232, Zip2_2D, _, Ins0To3, _, _ , _), OP(2233, Rev64 , A, Zip2_4S, _, _ , _),
+ OP(2300, Rev64 , _, Ins1To0, _, _ , _), OP(2301, Rev64 , _, _ , _, _ , _), OP(2302, Rev64 , _, Ins3To0, _, _ , _), OP(2303, Rev64 , _, Ins2To0, _, _ , _),
+ OP(2310, Dup2 , 2, Ext12 , 2, Zip1_2D, _), OP(2311, Rev64 , _, Ins0To1, _, _ , _), OP(2312, Ext12 , 2, Zip2_4S, _, _ , _), OP(2313, Rev64 , _, Ins0To1, _, Ins2To0, _),
+ OP(2320, Rev64 , _, Ins1To0, _, Ins3To1, _), OP(2321, Rev64 , _, Ins3To1, _, _ , _), OP(2322, Zip2_4S, _, Ins0To3, _, _ , _), OP(2323, Rev64 , A, Zip2_2D, _, _ , _),
+ OP(2330, Rev64 , _, Ins1To0, _, Ins2To1, _), OP(2331, Rev64 , _, Ins2To1, _, _ , _), OP(2332, Rev64 , 2, Zip2_4S, _, _ , _), OP(2333, Rev64 , _, Ins2To0, _, Ins2To1, _),
+ OP(3000, Mov , _, Ins0To1, _, Ins0To2, _), OP(3001, Rev64 , _, Ins2To3, _, Ins1To2, _), OP(3002, Ext8 , _, Ins1To3, _, Ins2To1, _), OP(3003, Ext12 , _, Ins0To3, _, Ins1To2, _),
+ OP(3010, Mov , _, Ins0To2, _, _ , _), OP(3011, Mov , _, Ins0To2, _, Ins1To0, _), OP(3012, Rev64 , A, Ext12 , _, _ , _), OP(3013, Rev64 , 2, Ext12 , _, _ , _),
+ OP(3020, Dup0 , 1, Zip2_4S, _, _ , _), OP(3021, Dup1 , 1, Ext4 , 1, Zip2_4S, _), OP(3022, Ext8 , _, Ins1To3, _, Ins0To1, _), OP(3023, Ext4 , 1, Zip2_4S, _, _ , _),
+ OP(3030, Mov , _, Ins0To2, _, Ins3To1, _), OP(3031, Ext8 , _, Ins3To0, _, Ins1To3, _), OP(3032, Ext8 , _, Ins1To3, _, _ , _), OP(3033, Ext8 , _, Ins1To0, _, Ins1To3, _),
+ OP(3100, Dup0 , 1, Uzp2_4S, _, _ , _), OP(3101, Rev64 , _, Ins2To3, _, Ins0To2, _), OP(3102, Ext4 , 1, Uzp2_4S, _, _ , _), OP(3103, Ext12 , _, Ins0To3, _, _ , _),
+ OP(3110, Mov , _, Ins1To2, _, _ , _), OP(3111, Uzp2_4S, _, Ins0To1, _, _ , _), OP(3112, Mov , _, Ins2To0, _, Ins1To2, _), OP(3113, Ext8 , 1, Uzp2_4S, _, _ , _),
+ OP(3120, Rev64 , 2, Uzp1_4S, _, _ , _), OP(3121, Dup1 , 1, Zip2_4S, _, _ , _), OP(3122, Dup2 , 1, Uzp2_4S, _, _ , _), OP(3123, Ext12 , _, Ins3To1, _, Ins0To3, _),
+ OP(3130, Dup3 , 2, Zip1_4S, _, _ , _), OP(3131, Uzp2_4S, _, _ , _, _ , _), OP(3132, Zip2_4S, 1, Uzp2_4S, _, _ , _), OP(3133, Uzp2_4S, _, Ins1To0, _, _ , _),
+ OP(3200, Mov , _, Ins0To1, _, _ , _), OP(3201, Dup1 , 1, Ext4 , 1, Zip2_2D, _), OP(3202, Mov , _, Ins0To1, _, Ins2To0, _), OP(3203, Ext4 , 1, Zip2_2D, _, _ , _),
+ OP(3210, Mov , _, _ , _, _ , _), OP(3211, Mov , _, Ins1To0, _, _ , _), OP(3212, Mov , _, Ins2To0, _, _ , _), OP(3213, Mov , _, Ins3To0, _, _ , _),
+ OP(3220, Mov , _, Ins2To1, _, _ , _), OP(3221, Ext12 , 1, Zip2_4S, _, _ , _), OP(3222, Zip2_4S, _, Ins0To2, _, _ , _), OP(3223, Rev64 , 1, Zip2_4S, _, _ , _),
+ OP(3230, Mov , _, Ins3To1, _, _ , _), OP(3231, Zip2_4S, 2, Uzp2_4S, _, _ , _), OP(3232, Zip2_2D, _, _ , _, _ , _), OP(3233, Zip2_2D, _, Ins1To0, _, _ , _),
+ OP(3300, Mov , _, Ins0To1, _, Ins3To2, _), OP(3301, Rev64 , _, Ins2To3, _, _ , _), OP(3302, Rev64 , _, Ins3To0, _, Ins2To3, _), OP(3303, Rev64 , _, Ins2To0, _, Ins2To3, _),
+ OP(3310, Mov , _, Ins3To2, _, _ , _), OP(3311, Trn2_4S, _, _ , _, _ , _), OP(3312, Zip2_4S, 1, Trn2_4S, _, _ , _), OP(3313, Trn2_4S, _, Ins2To0, _, _ , _),
+ OP(3320, Dup3 , 2, Uzp1_4S, _, _ , _), OP(3321, Ext4 , _, Ins2To3, _, _ , _), OP(3322, Zip2_4S, _, _ , _, _ , _), OP(3323, Zip2_4S, _, Ins2To0, _, _ , _),
+ OP(3330, Mov , _, Ins3To1, _, Ins3To2, _), OP(3331, Uzp2_4S, _, Ins1To2, _, _ , _), OP(3332, Zip2_4S, _, Ins2To1, _, _ , _), OP(3333, Dup3 , _, _ , _, _ , _)
+};
+
+#undef OP
+
+static void emit_swizzle32_impl(UniCompiler& uc, const Vec& dst, const Vec& src, uint32_t imm) {
+ ASMJIT_ASSERT((imm & 0xFCFCFCFC) == 0);
+
+ BackendCompiler* cc = uc.cc;
+
+ uint32_t table_index = ((imm & 0x03000000) >> (24 - 6)) |
+ ((imm & 0x00030000) >> (16 - 4)) |
+ ((imm & 0x00000300) >> (8 - 2)) | (imm & 0x00000003);
+ Swizzle32Data swiz = swizzle_32_data[table_index];
+
+ if (swiz.is_defined()) {
+ Vec op_src[2] = { src, src };
+ Vec op_dst;
+
+ for (uint32_t i = 0; i < 3; i++) {
+ Swizzle32Data::Op op = swiz.op(i);
+ Swizzle32Data::OpTarget target = swiz.op_target(i);
+
+ if (!op.is_valid())
+ break;
+
+ if (target == Swizzle32Data::OpTarget::kDst) {
+ op_dst = dst;
+ }
+ else {
+ op_dst = uc.new_similar_reg(dst, "@tmp");
+ }
+
+ switch (op.type()) {
+ case Swizzle32Data::Op::kMov: {
+ vec_mov(uc, op_dst, op_src[0]);
+ break;
+ }
+
+ case Swizzle32Data::Op::kIns: {
+ uint32_t src_lane = op.ins_src();
+ uint32_t dst_lane = op.ins_dst();
+ // Insert is always the last operation that only uses the destination register.
+ cc->mov(op_dst.s(dst_lane), op_dst.s(src_lane));
+ break;
+ }
+
+ case Swizzle32Data::Op::kDup: {
+ // Use `dup` if the swizzle is actually a broadcast of a single element.
+ uint32_t idx = op.dup_idx();
+ cc->dup(op_dst.s4(), op_src[0].s(idx));
+ break;
+ }
+
+ case Swizzle32Data::Op::kExt: {
+ // Use `ext` if the swizzle is rotating the vector.
+ uint32_t n = op.ext_imm();
+ cc->ext(op_dst.b16(), op_src[0].b16(), op_src[1].b16(), n);
+ break;
+ }
+
+ case Swizzle32Data::Op::kRev64: {
+ // Use `rev64` to swap lo/hi elements of 64-bit lanes.
+ cc->rev64(op_dst.s4(), op_src[0].s4());
+ break;
+ }
+
+ case Swizzle32Data::Op::kZipUnzip: {
+ // Use `zip[1|2]`, 'uzp[1|2]', or 'trn[1|2]` if the swizzle can be implemented this way.
+ static constexpr uint16_t zip_unzip_inst[8] = {
+ Inst::kIdZip1_v,
+ Inst::kIdZip2_v,
+ Inst::kIdUzp1_v,
+ Inst::kIdUzp2_v,
+ Inst::kIdTrn1_v,
+ Inst::kIdTrn2_v
+ };
+
+ InstId inst_id = zip_unzip_inst[op.zip_op()];
+ if (op.zip_s4())
+ cc->emit(inst_id, op_dst.s4(), op_src[0].s4(), op_src[1].s4());
+ else
+ cc->emit(inst_id, op_dst.d2(), op_src[0].d2(), op_src[1].d2());
+ break;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ if (uint32_t(target) & uint32_t(Swizzle32Data::OpTarget::k1)) op_src[0] = op_dst;
+ if (uint32_t(target) & uint32_t(Swizzle32Data::OpTarget::k2)) op_src[1] = op_dst;
+ }
+ }
+ else {
+ // NOTE: This code is never used at the moment. It's kept if for some reason we would want to avoid using
+ // more than 1 or 2 instructions to perform the swizzle. For example on hardware where TBL is faster than
+ // other operations combined.
+ uint8_t pred_data[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
+
+ uint32_t d = (imm >> 22) & (0x3 << 2);
+ uint32_t c = (imm >> 14) & (0x3 << 2);
+ uint32_t b = (imm >> 6) & (0x3 << 2);
+ uint32_t a = (imm << 2) & (0x3 << 2);
+
+ pred_data[ 0] = uint8_t(a);
+ pred_data[ 1] = uint8_t(a + 1u);
+ pred_data[ 2] = uint8_t(a + 2u);
+ pred_data[ 3] = uint8_t(a + 3u);
+ pred_data[ 4] = uint8_t(b);
+ pred_data[ 5] = uint8_t(b + 1u);
+ pred_data[ 6] = uint8_t(b + 2u);
+ pred_data[ 7] = uint8_t(b + 3u);
+ pred_data[ 8] = uint8_t(c);
+ pred_data[ 9] = uint8_t(c + 1u);
+ pred_data[10] = uint8_t(c + 2u);
+ pred_data[11] = uint8_t(c + 3u);
+ pred_data[12] = uint8_t(d);
+ pred_data[13] = uint8_t(d + 1u);
+ pred_data[14] = uint8_t(d + 2u);
+ pred_data[15] = uint8_t(d + 3u);
+
+ Vec pred = uc.simd_const_16b(pred_data);
+ cc->tbl(dst.b16(), src.b16(), pred.b16());
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Interleaved Shuffle 32 Impl
+// =====================================================================
+
+struct InterleavedShuffle32Ops {
+ struct Op {
+ //! Operation swaps lo/hi elements of 64-bit lanes - 'rev64'.
+ static constexpr uint32_t kOpRev64 = 0;
+ //! Operation performs a 32-bit insert - moves a value from a source lane to a destination lane.
+ static constexpr uint32_t kOpInsS = 1;
+ //! Operation performs a 64-bit insert - moves a value from a source lane to a destination lane.
+ static constexpr uint32_t kOpInsD = 2;
+ //! Operation can be implemented as a single zip[1|2], uzp[1|2], trn[1|2], or ext instruction with 32-bit or 64-bit elements.
+ static constexpr uint32_t kOpPerm = 3;
+ //! Operation duplicates a lane across all others - 'dup'.
+ static constexpr uint32_t kOpDup = 4;
+
+ static constexpr uint32_t kInsS_0To0 = (kOpInsS << 8) | (0 << 0) | (0 << 2);
+ static constexpr uint32_t kInsS_0To1 = (kOpInsS << 8) | (0 << 0) | (1 << 2);
+ static constexpr uint32_t kInsS_0To2 = (kOpInsS << 8) | (0 << 0) | (2 << 2);
+ static constexpr uint32_t kInsS_0To3 = (kOpInsS << 8) | (0 << 0) | (3 << 2);
+ static constexpr uint32_t kInsS_1To0 = (kOpInsS << 8) | (1 << 0) | (0 << 2);
+ static constexpr uint32_t kInsS_1To1 = (kOpInsS << 8) | (1 << 0) | (1 << 2);
+ static constexpr uint32_t kInsS_1To2 = (kOpInsS << 8) | (1 << 0) | (2 << 2);
+ static constexpr uint32_t kInsS_1To3 = (kOpInsS << 8) | (1 << 0) | (3 << 2);
+ static constexpr uint32_t kInsS_2To0 = (kOpInsS << 8) | (2 << 0) | (0 << 2);
+ static constexpr uint32_t kInsS_2To1 = (kOpInsS << 8) | (2 << 0) | (1 << 2);
+ static constexpr uint32_t kInsS_2To2 = (kOpInsS << 8) | (2 << 0) | (2 << 2);
+ static constexpr uint32_t kInsS_2To3 = (kOpInsS << 8) | (2 << 0) | (3 << 2);
+ static constexpr uint32_t kInsS_3To0 = (kOpInsS << 8) | (3 << 0) | (0 << 2);
+ static constexpr uint32_t kInsS_3To1 = (kOpInsS << 8) | (3 << 0) | (1 << 2);
+ static constexpr uint32_t kInsS_3To2 = (kOpInsS << 8) | (3 << 0) | (2 << 2);
+ static constexpr uint32_t kInsS_3To3 = (kOpInsS << 8) | (3 << 0) | (3 << 2);
+ static constexpr uint32_t kInsD_0To0 = (kOpInsD << 8) | (0 << 0) | (0 << 2);
+ static constexpr uint32_t kInsD_0To1 = (kOpInsD << 8) | (0 << 0) | (1 << 2);
+ static constexpr uint32_t kInsD_1To0 = (kOpInsD << 8) | (1 << 0) | (0 << 2);
+ static constexpr uint32_t kInsD_1To1 = (kOpInsD << 8) | (1 << 0) | (1 << 2);
+
+ static constexpr uint32_t kZip1_4S = (kOpPerm << 8) | (0 << 0) | (0 << 3);
+ static constexpr uint32_t kZip1_2D = (kOpPerm << 8) | (0 << 0) | (1 << 3);
+ static constexpr uint32_t kZip2_4S = (kOpPerm << 8) | (1 << 0) | (0 << 3);
+ static constexpr uint32_t kZip2_2D = (kOpPerm << 8) | (1 << 0) | (1 << 3);
+ static constexpr uint32_t kUzp1_4S = (kOpPerm << 8) | (2 << 0) | (0 << 3);
+ static constexpr uint32_t kUzp1_2D = (kOpPerm << 8) | (2 << 0) | (1 << 3);
+ static constexpr uint32_t kUzp2_4S = (kOpPerm << 8) | (3 << 0) | (0 << 3);
+ static constexpr uint32_t kUzp2_2D = (kOpPerm << 8) | (3 << 0) | (1 << 3);
+ static constexpr uint32_t kTrn1_4S = (kOpPerm << 8) | (4 << 0);
+ static constexpr uint32_t kTrn2_4S = (kOpPerm << 8) | (5 << 0);
+ static constexpr uint32_t kExt4 = (kOpPerm << 8) | (7 << 0) | (0 << 3);
+ static constexpr uint32_t kExt8 = (kOpPerm << 8) | (6 << 0) | (1 << 3);
+ static constexpr uint32_t kExt12 = (kOpPerm << 8) | (7 << 0) | (1 << 3);
+
+ static constexpr uint32_t kRev64 = (kOpRev64 << 8) | (1 << 0); // Dummy bit so we don't end up having all zeros.
+
+ static constexpr uint32_t kDup0 = (kOpDup << 8) | (0 << 0);
+ static constexpr uint32_t kDup1 = (kOpDup << 8) | (1 << 0);
+ static constexpr uint32_t kDup2 = (kOpDup << 8) | (2 << 0);
+ static constexpr uint32_t kDup3 = (kOpDup << 8) | (3 << 0);
+
+ static constexpr uint32_t kSrcAA = (0 << 4) | (0 << 6);
+ static constexpr uint32_t kSrcAB = (0 << 4) | (1 << 6);
+ static constexpr uint32_t kSrcAC = (0 << 4) | (2 << 6);
+ static constexpr uint32_t kSrcAD = (0 << 4) | (3 << 6);
+ static constexpr uint32_t kSrcBA = (1 << 4) | (0 << 6);
+ static constexpr uint32_t kSrcBB = (1 << 4) | (1 << 6);
+ static constexpr uint32_t kSrcBC = (1 << 4) | (2 << 6);
+ static constexpr uint32_t kSrcBD = (1 << 4) | (3 << 6);
+ static constexpr uint32_t kSrcCA = (2 << 4) | (0 << 6);
+ static constexpr uint32_t kSrcCB = (2 << 4) | (1 << 6);
+ static constexpr uint32_t kSrcCC = (2 << 4) | (2 << 6);
+ static constexpr uint32_t kSrcCD = (2 << 4) | (3 << 6);
+ static constexpr uint32_t kSrcDA = (3 << 4) | (0 << 6);
+ static constexpr uint32_t kSrcDB = (3 << 4) | (1 << 6);
+ static constexpr uint32_t kSrcDC = (3 << 4) | (2 << 6);
+ static constexpr uint32_t kSrcDD = (3 << 4) | (3 << 6);
+
+ static constexpr uint32_t kSrcA = kSrcAA;
+ static constexpr uint32_t kSrcB = kSrcBB;
+ static constexpr uint32_t kSrcC = kSrcCC;
+ static constexpr uint32_t kSrcD = kSrcDD;
+
+ // Alias to nothing to make the table easier to read.
+ static constexpr uint32_t k_ = 0;
+ static constexpr uint32_t kSrc_ = 0;
+
+ uint32_t data;
+
+ ASMJIT_INLINE_NODEBUG bool is_valid() const noexcept { return data != 0u; }
+ ASMJIT_INLINE_NODEBUG uint32_t op() const noexcept { return data >> 8; }
+ ASMJIT_INLINE_NODEBUG uint32_t is_ins_op() const noexcept { return op() == kOpInsS || op() == kOpInsD; }
+
+ ASMJIT_INLINE_NODEBUG uint32_t dup_idx() const noexcept { return data & 0x3u; }
+
+ ASMJIT_INLINE_NODEBUG uint32_t perm_op() const noexcept { return data & 0x7u; }
+ ASMJIT_INLINE_NODEBUG bool perm_s4() const noexcept { return (data & (1u << 3)) == 0u; }
+ ASMJIT_INLINE_NODEBUG uint32_t perm_ext_imm() const noexcept { return ((data & 0x1) << 2) + (data & 0x8); }
+
+ ASMJIT_INLINE_NODEBUG uint32_t ins_src() const noexcept { return (data >> 0) & 0x3u; }
+ ASMJIT_INLINE_NODEBUG uint32_t ins_dst() const noexcept { return (data >> 2) & 0x3u; }
+
+ ASMJIT_INLINE_NODEBUG uint32_t src_a() const noexcept { return (data >> 4) & 0x3u; }
+ ASMJIT_INLINE_NODEBUG uint32_t src_b() const noexcept { return (data >> 6) & 0x3u; }
+ };
+
+ //! \name Members
+ //! \{
+
+ uint32_t combined;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG uint32_t count() const noexcept {
+ return 1u + uint32_t(((combined >> 11) & 0x7FFu) != 0u) + uint32_t((combined >> 22) != 0u);
+ }
+
+ ASMJIT_INLINE_NODEBUG Op op(uint32_t index) const noexcept {
+ return Op{(combined >> (index * 11u)) & 0x7FFu};
+ }
+
+ //! \}
+};
+
+// These tables provide all combinations for all possible 32-bit interleaved shuffles (there is 256 combinations
+// in total). It prioritizes lane moves, and then operations that can have either one or two inputs. Initially,
+// there are two sources (A, B), which can be used by any shuffle operation, which result is then referred as C.
+// Then, all consecutive shuffles can use any of A, B, and C as their operands. The last operation is the result.
+//
+// Statistics:
+//
+// - 1 Instruction: 5
+// - 2 Instructions: 113
+// - 3 Instructions: 138
+
+#define OP(swiz, op0, src0, op1, src1, op2, src2) { \
+ ((InterleavedShuffle32Ops::Op::k##op0) << 0) | ((InterleavedShuffle32Ops::Op::kSrc##src0) << 0) | \
+ ((InterleavedShuffle32Ops::Op::k##op1) << 11) | ((InterleavedShuffle32Ops::Op::kSrc##src1) << 11) | \
+ ((InterleavedShuffle32Ops::Op::k##op2) << 22) | ((InterleavedShuffle32Ops::Op::kSrc##src2) << 22) \
+}
+
+static constexpr InterleavedShuffle32Ops interleaved_shuffle32_ops[256] = {
+ OP(4400, Trn1_4S , AB, Zip1_4S , CC, _ , _ ), OP(4401, Rev64 , A , Dup0 , B , Zip1_2D , CD), OP(4402, Ext8 , AA, Dup0 , B , Uzp1_4S , CD), OP(4403, Ext12 , AA, Dup0 , B , Zip1_2D , CD),
+ OP(4410, Dup0 , B , Zip1_2D , AC, _ , _ ), OP(4411, Dup1 , A , Dup0 , B , Uzp2_4S , CD), OP(4412, Ext4 , AB, InsS_3To2, C , Rev64 , C ), OP(4413, Ext12 , AA, Dup0 , B , Uzp1_4S , CD),
+ OP(4420, Dup0 , B , Uzp1_4S , AC, _ , _ ), OP(4421, Ext4 , AB, InsS_3To2, C , _ , _ ), OP(4422, Ext8 , AB, Trn1_4S , CC, _ , _ ), OP(4423, Rev64 , A , Dup0 , B , Zip2_2D , CD),
+ OP(4430, Trn1_4S , AB, Ext12 , AB, Zip1_4S , CD), OP(4431, Dup0 , B , Uzp2_4S , AC, _ , _ ), OP(4432, Dup0 , B , Zip2_2D , AC, _ , _ ), OP(4433, Ext12 , AB, Zip1_4S , CC, _ , _ ),
+ OP(4500, Rev64 , B , Dup0 , A , Zip1_2D , DC), OP(4501, Zip1_2D , AB, Rev64 , C , _ , _ ), OP(4502, Uzp1_4S , BA, Ext8 , CB, Rev64 , D ), OP(4503, Ext12 , AA, Rev64 , B , Zip1_2D , CD),
+ OP(4510, Rev64 , B , Zip1_2D , AC, _ , _ ), OP(4511, Rev64 , B , Dup1 , A , Zip1_2D , DC), OP(4512, Uzp2_4S , AB, Uzp1_4S , AC, Ext4 , DB), OP(4513, Trn2_4S , AB, Zip1_2D , CB, Ext12 , AD),
+ OP(4520, Dup1 , B , Uzp1_4S , CB, Uzp1_4S , AD), OP(4521, Ext4 , AB, InsS_1To2, B , _ , _ ), OP(4522, Rev64 , B , Dup2 , A , Zip1_2D , DC), OP(4523, Ext8 , AB, Rev64 , C , _ , _ ),
+ OP(4530, Ext12 , AA, Zip1_2D , CB, Rev64 , D ), OP(4531, Uzp2_4S , AB, InsS_0To3, B , _ , _ ), OP(4532, Rev64 , B , Ext8 , AC, _ , _ ), OP(4533, Rev64 , B , Dup3 , A , Zip1_2D , DC),
+ OP(4600, Ext8 , BB, Dup0 , A , Uzp1_4S , DC), OP(4601, Uzp1_4S , BB, Zip1_2D , AC, Rev64 , D ), OP(4602, Uzp1_4S , AB, Rev64 , C , _ , _ ), OP(4603, Uzp1_4S , AB, InsS_3To1, C , Ext12 , AC),
+ OP(4610, Dup2 , B , Trn1_4S , CB, Zip1_2D , AD), OP(4611, Ext8 , BB, Dup1 , A , Uzp1_4S , DC), OP(4612, Trn1_4S , AB, Zip1_4S , AC, Zip2_4S , CD), OP(4613, Rev64 , B , Uzp2_4S , AC, Rev64 , D ),
+ OP(4620, Ext8 , BB, Uzp1_4S , AC, _ , _ ), OP(4621, Ext4 , AB, InsS_2To2, B , _ , _ ), OP(4622, Ext8 , BB, Dup2 , A , Uzp1_4S , DC), OP(4623, Trn1_4S , AB, Zip2_2D , AC, Ext4 , DB),
+ OP(4630, Ext12 , AB, Zip1_4S , AC, InsS_3To2, C ), OP(4631, Ext4 , BB, Uzp2_4S , AC, _ , _ ), OP(4632, Zip2_2D , AB, InsS_0To3, B , _ , _ ), OP(4633, Ext8 , BB, Dup3 , A , Uzp1_4S , DC),
+ OP(4700, Ext12 , BB, Dup0 , A , Zip1_2D , DC), OP(4701, Ext12 , BB, Rev64 , A , Zip1_2D , DC), OP(4702, Uzp1_4S , AB, InsS_3To3, B , Rev64 , C ), OP(4703, Ext12 , BB, Ext12 , AA, Zip1_2D , DC),
+ OP(4710, Ext12 , BB, Zip1_2D , AC, _ , _ ), OP(4711, Ext12 , BB, Dup1 , A , Zip1_2D , DC), OP(4712, Trn2_4S , BA, InsS_2To0, A , InsS_0To3, B ), OP(4713, Uzp2_4S , AB, InsS_0To2, C , Ext4 , CB),
+ OP(4720, Dup3 , B , Uzp1_4S , CB, Uzp1_4S , AD), OP(4721, Ext4 , AB, InsS_3To2, B , _ , _ ), OP(4722, Ext12 , BB, Dup2 , A , Zip1_2D , DC), OP(4723, Ext12 , BB, Rev64 , A , Ext8 , DC),
+ OP(4730, Rev64 , A , InsS_3To3, B , Ext4 , CB), OP(4731, Dup3 , B , Ext4 , CB, Uzp2_4S , AD), OP(4732, Ext12 , BB, Ext8 , AC, _ , _ ), OP(4733, Ext12 , BB, Dup3 , A , Zip1_2D , DC),
+ OP(5400, Dup0 , A , Zip1_2D , CB, _ , _ ), OP(5401, Rev64 , A , Zip1_2D , CB, _ , _ ), OP(5402, Ext8 , AB, InsS_0To1, A , _ , _ ), OP(5403, Ext12 , AA, Zip1_2D , CB, _ , _ ),
+ OP(5410, Zip1_2D , AB, _ , _ , _ , _ ), OP(5411, Dup1 , A , Zip1_2D , CB, _ , _ ), OP(5412, Zip1_2D , AB, InsS_2To0, A , _ , _ ), OP(5413, Zip1_2D , AB, InsS_3To0, A , _ , _ ),
+ OP(5420, Uzp1_4S , BA, Ext8 , CB, _ , _ ), OP(5421, Ext12 , BA, Ext8 , CB, _ , _ ), OP(5422, Dup2 , A , Zip1_2D , CB, _ , _ ), OP(5423, Rev64 , A , Ext8 , CB, _ , _ ),
+ OP(5430, Zip1_2D , AB, InsS_3To1, A , _ , _ ), OP(5431, Uzp2_4S , BA, Ext8 , CB, _ , _ ), OP(5432, Ext8 , AB, _ , _ , _ , _ ), OP(5433, Dup3 , A , Zip1_2D , CB, _ , _ ),
+ OP(5500, Dup1 , B , Dup0 , A , Uzp2_4S , DC), OP(5501, Rev64 , A , Dup1 , B , Zip1_2D , CD), OP(5502, Ext8 , AA, Dup1 , B , Uzp1_4S , CD), OP(5503, Ext12 , AA, Dup1 , B , Zip1_2D , CD),
+ OP(5510, Dup1 , B , Zip1_2D , AC, _ , _ ), OP(5511, Trn2_4S , AB, Zip1_4S , CC, _ , _ ), OP(5512, Uzp2_4S , AB, Zip2_2D , AC, Trn1_4S , DC), OP(5513, Ext12 , AA, Dup1 , B , Uzp1_4S , CD),
+ OP(5520, Dup1 , B , Uzp1_4S , AC, _ , _ ), OP(5521, Ext12 , BA, Dup1 , B , Zip2_2D , CD), OP(5522, Dup2 , A , Dup1 , B , Uzp2_4S , CD), OP(5523, Rev64 , A , Dup1 , B , Zip2_2D , CD),
+ OP(5530, Ext12 , AB, Trn1_4S , AC, InsS_3To2, D ), OP(5531, Dup1 , B , Uzp2_4S , AC, _ , _ ), OP(5532, Dup1 , B , Zip2_2D , AC, _ , _ ), OP(5533, Ext12 , AB, Trn1_4S , CC, _ , _ ),
+ OP(5600, Trn1_4S , BA, InsS_1To3, B , InsS_1To0, C ), OP(5601, Ext4 , BB, Zip1_2D , AC, Rev64 , D ), OP(5602, Uzp1_4S , AB, InsS_1To2, B , Rev64 , C ), OP(5603, Ext12 , AA, Zip1_2D , CB, InsS_2To2, B ),
+ OP(5610, Zip1_2D , AB, InsS_2To2, B , _ , _ ), OP(5611, Zip1_4S , AB, Trn1_4S , CB, Zip2_4S , DC), OP(5612, Trn2_4S , AB, Zip2_4S , AB, Zip1_4S , DC), OP(5613, Trn2_4S , AB, Zip2_4S , CB, Zip1_4S , DC),
+ OP(5620, Dup2 , B , Uzp2_4S , CB, Uzp1_4S , AD), OP(5621, Rev64 , B , Ext4 , AC, InsS_3To2, C ), OP(5622, Uzp1_4S , AB, Zip1_2D , CB, Trn2_4S , CD), OP(5623, Uzp1_4S , AB, Uzp2_4S , CB, Ext12 , AD),
+ OP(5630, Ext12 , AB, Trn1_4S , AC, InsS_3To2, C ), OP(5631, Dup2 , B , Zip1_2D , CB, Uzp2_4S , AD), OP(5632, Zip2_2D , AB, InsS_1To3, B , _ , _ ), OP(5633, Ext12 , AB, InsS_3To1, C , Ext12 , AC),
+ OP(5700, Ext12 , BB, Dup0 , A , Uzp1_4S , DC), OP(5701, Uzp2_4S , BB, Zip1_2D , AC, Rev64 , D ), OP(5702, Rev64 , B , Uzp1_4S , AC, Rev64 , D ), OP(5703, Uzp2_4S , BB, InsS_0To0, A , Ext12 , AC),
+ OP(5710, Zip1_2D , AB, InsS_3To2, B , _ , _ ), OP(5711, Ext12 , BB, Dup1 , A , Uzp1_4S , DC), OP(5712, Uzp2_4S , AB, InsS_2To1, A , Rev64 , C ), OP(5713, Uzp2_4S , AB, Rev64 , C , _ , _ ),
+ OP(5720, Ext12 , BB, Uzp1_4S , AC, _ , _ ), OP(5721, Rev64 , B , Ext4 , AC, InsS_2To2, C ), OP(5722, Ext12 , BB, Dup2 , A , Uzp1_4S , DC), OP(5723, Uzp2_4S , BB, Zip2_2D , AC, Rev64 , D ),
+ OP(5730, Ext12 , AB, Trn1_4S , AC, InsS_3To2, B ), OP(5731, Ext8 , BB, Uzp2_4S , AC, _ , _ ), OP(5732, Ext8 , AB, InsS_3To2, B , _ , _ ), OP(5733, Ext12 , BB, Dup3 , A , Uzp1_4S , DC),
+ OP(6400, Dup0 , A , Uzp1_4S , CB, _ , _ ), OP(6401, Dup1 , A , Uzp1_4S , CA, Uzp1_4S , DB), OP(6402, Ext8 , AA, Uzp1_4S , CB, _ , _ ), OP(6403, Dup3 , A , Uzp1_4S , CA, Uzp1_4S , DB),
+ OP(6410, Uzp1_4S , BB, Zip1_2D , AC, _ , _ ), OP(6411, Dup1 , A , Uzp1_4S , CB, _ , _ ), OP(6412, Dup2 , A , Uzp2_4S , CA, Uzp1_4S , DB), OP(6413, Ext12 , AA, Uzp1_4S , CB, _ , _ ),
+ OP(6420, Uzp1_4S , AB, _ , _ , _ , _ ), OP(6421, Uzp1_4S , AB, InsS_1To0, A , _ , _ ), OP(6422, Dup2 , A , Uzp1_4S , CB, _ , _ ), OP(6423, Uzp1_4S , AB, InsS_3To0, A , _ , _ ),
+ OP(6430, Uzp1_4S , AB, InsS_3To1, A , _ , _ ), OP(6431, Rev64 , B , Uzp2_4S , AC, _ , _ ), OP(6432, Uzp1_4S , BB, Zip2_2D , AC, _ , _ ), OP(6433, Dup3 , A , Uzp1_4S , CB, _ , _ ),
+ OP(6500, Ext12 , BB, Dup0 , A , Zip2_2D , DC), OP(6501, Ext4 , BB, Rev64 , A , Zip1_2D , DC), OP(6502, Rev64 , A , Ext12 , CB, InsS_1To1, C ), OP(6503, Ext12 , AB, InsS_0To1, A , _ , _ ),
+ OP(6510, Ext4 , BB, Zip1_2D , AC, _ , _ ), OP(6511, Ext12 , BB, Dup1 , A , Zip2_2D , DC), OP(6512, Rev64 , A , Ext12 , CB, InsS_0To1, C ), OP(6513, Ext12 , AB, InsS_1To1, A , _ , _ ),
+ OP(6520, Uzp1_4S , AB, InsS_1To2, B , _ , _ ), OP(6521, Trn2_4S , AB, Zip2_4S , AB, Zip1_4S , CD), OP(6522, Ext12 , BB, Dup2 , A , Zip2_2D , DC), OP(6523, Ext12 , AB, InsS_2To1, A , _ , _ ),
+ OP(6530, Ext4 , BA, Trn2_4S , CA, Ext8 , DC), OP(6531, Uzp2_4S , AB, InsS_2To3, B , _ , _ ), OP(6532, Ext12 , BB, Zip2_2D , AC, _ , _ ), OP(6533, Ext12 , AB, InsS_0To1, C , _ , _ ),
+ OP(6600, Dup2 , B , Dup0 , A , Uzp2_4S , DC), OP(6601, Rev64 , A , Dup2 , B , Zip1_2D , CD), OP(6602, Ext8 , AA, Dup2 , B , Uzp1_4S , CD), OP(6603, Ext12 , AA, Dup2 , B , Zip1_2D , CD),
+ OP(6610, Dup2 , B , Zip1_2D , AC, _ , _ ), OP(6611, Dup2 , B , Dup1 , A , Uzp2_4S , DC), OP(6612, Zip2_4S , AB, Trn2_4S , AC, Zip1_4S , CD), OP(6613, Ext12 , AA, Dup2 , B , Uzp1_4S , CD),
+ OP(6620, Dup2 , B , Uzp1_4S , AC, _ , _ ), OP(6621, Ext12 , BA, Dup2 , B , Zip2_2D , CD), OP(6622, Trn1_4S , AB, Zip2_4S , CC, _ , _ ), OP(6623, Rev64 , A , Dup2 , B , Zip2_2D , CD),
+ OP(6630, Trn1_4S , AB, InsS_3To1, A , InsS_3To2, C ), OP(6631, Dup2 , B , Uzp2_4S , AC, _ , _ ), OP(6632, Dup2 , B , Zip2_2D , AC, _ , _ ), OP(6633, Dup3 , A , Dup2 , B , Uzp2_4S , CD),
+ OP(6700, Rev64 , B , Dup0 , A , Zip2_2D , DC), OP(6701, Ext8 , BA, Rev64 , C , Ext8 , DD), OP(6702, Uzp1_4S , BA, Zip2_2D , CB, Rev64 , D ), OP(6703, Ext4 , AA, Rev64 , B , Zip2_2D , CD),
+ OP(6710, Rev64 , B , InsD_0To0, A , _ , _ ), OP(6711, Rev64 , B , Dup1 , A , Zip2_2D , DC), OP(6712, Ext12 , BA, Zip2_2D , CB, Rev64 , D ), OP(6713, Uzp2_4S , BA, Zip2_2D , CB, Rev64 , D ),
+ OP(6720, Uzp1_4S , AB, InsS_3To2, B , _ , _ ), OP(6721, Ext12 , BA, Rev64 , B , Zip2_2D , CD), OP(6722, Rev64 , B , Dup2 , A , Zip2_2D , DC), OP(6723, Zip2_2D , AB, Rev64 , C , _ , _ ),
+ OP(6730, Ext4 , AA, Zip2_2D , CB, Rev64 , D ), OP(6731, Dup3 , B , Uzp1_4S , CB, Uzp2_4S , AD), OP(6732, Rev64 , B , Zip2_2D , AC, _ , _ ), OP(6733, Rev64 , B , Dup3 , A , Zip2_2D , DC),
+ OP(7400, Uzp1_4S , AB, InsS_3To3, B , InsS_0To1, C ), OP(7401, Ext12 , BB, Zip1_2D , AC, Rev64 , D ), OP(7402, Ext8 , AB, Trn1_4S , CA, InsS_3To3, B ), OP(7403, Rev64 , B , InsS_0To0, A , Ext12 , AC),
+ OP(7410, Zip1_2D , AB, InsS_3To3, B , _ , _ ), OP(7411, Trn2_4S , AB, InsS_0To2, B , InsS_0To1, C ), OP(7412, Ext4 , AB, Trn2_4S , CB, InsS_0To1, C ), OP(7413, Ext4 , AB, Zip2_4S , CB, InsS_0To1, C ),
+ OP(7420, Uzp1_4S , AB, InsS_3To3, B , _ , _ ), OP(7421, Ext12 , BA, Trn1_4S , BC, Ext8 , CD), OP(7422, Ext4 , AB, Trn2_4S , CB, InsS_0To1, D ), OP(7423, Ext12 , BB, Ext8 , AC, Rev64 , D ),
+ OP(7430, Uzp2_4S , AB, InsS_0To0, A , InsS_0To2, B ), OP(7431, Uzp2_4S , AB, InsS_0To2, B , _ , _ ), OP(7432, Zip2_2D , AB, InsS_0To2, B , _ , _ ), OP(7433, Trn2_4S , AB, Ext4 , AB, Zip2_4S , DC),
+ OP(7500, Dup0 , A , Uzp2_4S , CB, _ , _ ), OP(7501, Uzp2_4S , AB, InsS_0To1, A , _ , _ ), OP(7502, Ext4 , AA, Uzp2_4S , CB, _ , _ ), OP(7503, Dup3 , A , Ext4 , CA, Uzp2_4S , DB),
+ OP(7510, Uzp2_4S , BB, Zip1_2D , AC, _ , _ ), OP(7511, Dup1 , A , Uzp2_4S , CB, _ , _ ), OP(7512, Dup2 , A , Zip1_2D , CA, Uzp2_4S , DB), OP(7513, Ext8 , AA, Uzp2_4S , CB, _ , _ ),
+ OP(7520, Rev64 , B , Uzp1_4S , AC, _ , _ ), OP(7521, Uzp2_4S , AB, InsS_2To1, A , _ , _ ), OP(7522, Dup2 , A , Uzp2_4S , CB, _ , _ ), OP(7523, Dup3 , A , Uzp1_4S , CA, Uzp2_4S , DB),
+ OP(7530, Uzp2_4S , AB, InsS_0To0, A , _ , _ ), OP(7531, Uzp2_4S , AB, _ , _ , _ , _ ), OP(7532, Uzp2_4S , BB, Zip2_2D , AC, _ , _ ), OP(7533, Dup3 , A , Uzp2_4S , CB, _ , _ ),
+ OP(7600, Dup0 , A , Zip2_2D , CB, _ , _ ), OP(7601, Rev64 , A , InsD_1To1, B , _ , _ ), OP(7602, Zip2_2D , AB, InsS_0To1, A , _ , _ ), OP(7603, Ext4 , AA, Zip2_2D , CB, _ , _ ),
+ OP(7610, Zip2_2D , BB, Zip1_2D , AC, _ , _ ), OP(7611, Dup1 , A , Zip2_2D , CB, _ , _ ), OP(7612, Zip2_2D , AB, InsS_1To1, A , _ , _ ), OP(7613, Dup3 , A , Zip1_4S , CA, Zip2_2D , DB),
+ OP(7620, Uzp1_4S , BA, Zip2_2D , CB, _ , _ ), OP(7621, Ext12 , BA, Zip2_2D , CB, _ , _ ), OP(7622, Dup2 , A , Zip2_2D , CB, _ , _ ), OP(7623, Rev64 , A , Zip2_2D , CB, _ , _ ),
+ OP(7630, Zip2_2D , AB, InsS_0To0, A , _ , _ ), OP(7631, Uzp2_4S , BA, Zip2_2D , CB, _ , _ ), OP(7632, Zip2_2D , AB, _ , _ , _ , _ ), OP(7633, Dup3 , A , Zip2_2D , CB, _ , _ ),
+ OP(7700, Dup3 , B , Dup0 , A , Uzp2_4S , DC), OP(7701, Rev64 , A , Dup3 , B , Zip1_2D , CD), OP(7702, Ext8 , AA, Dup3 , B , Uzp1_4S , CD), OP(7703, Ext12 , AA, Dup3 , B , Zip1_2D , CD),
+ OP(7710, Dup3 , B , Zip1_2D , AC, _ , _ ), OP(7711, Dup3 , B , Dup1 , A , Uzp2_4S , DC), OP(7712, Trn2_4S , BA, InsS_2To0, A , InsS_2To3, C ), OP(7713, Ext12 , AA, Dup3 , B , Uzp1_4S , CD),
+ OP(7720, Dup3 , B , Uzp1_4S , AC, _ , _ ), OP(7721, Ext12 , BA, Dup3 , B , Zip2_2D , CD), OP(7722, Dup3 , B , Dup2 , A , Uzp2_4S , DC), OP(7723, Rev64 , A , Dup3 , B , Zip2_2D , CD),
+ OP(7730, Uzp2_4S , AB, InsS_0To0, A , InsS_3To2, C ), OP(7731, Dup3 , B , Uzp2_4S , AC, _ , _ ), OP(7732, Dup3 , B , Zip2_2D , AC, _ , _ ), OP(7733, Trn2_4S , AB, Zip2_4S , CC, _ , _ )
+};
+
+static constexpr InterleavedShuffle32Ops interleaved_shuffle32_ops_dst_same_as_b[256] = {
+ OP(4400, Trn1_4S , AB, Zip1_4S , CC, _ , _ ), OP(4401, Rev64 , A , Dup0 , B , Zip1_2D , CD), OP(4402, Ext8 , AA, Dup0 , B , Uzp1_4S , CD), OP(4403, Ext12 , AA, Dup0 , B , Zip1_2D , CD),
+ OP(4410, Dup0 , B , Zip1_2D , AC, _ , _ ), OP(4411, Dup1 , A , Dup0 , B , Uzp2_4S , CD), OP(4412, Ext4 , AB, InsS_3To2, C , Rev64 , C ), OP(4413, Ext12 , AA, Dup0 , B , Uzp1_4S , CD),
+ OP(4420, Dup0 , B , Uzp1_4S , AC, _ , _ ), OP(4421, Ext4 , AB, InsS_3To2, C , _ , _ ), OP(4422, Ext8 , AB, Trn1_4S , CC, _ , _ ), OP(4423, Rev64 , A , Dup0 , B , Zip2_2D , CD),
+ OP(4430, Trn1_4S , AB, Ext12 , AB, Zip1_4S , CD), OP(4431, Dup0 , B , Uzp2_4S , AC, _ , _ ), OP(4432, Dup0 , B , Zip2_2D , AC, _ , _ ), OP(4433, Ext12 , AB, Zip1_4S , CC, _ , _ ),
+ OP(4500, Rev64 , B , Dup0 , A , Zip1_2D , DC), OP(4501, Zip1_2D , AB, Rev64 , C , _ , _ ), OP(4502, Uzp1_4S , BA, Ext8 , CB, Rev64 , D ), OP(4503, Ext12 , AA, Rev64 , B , Zip1_2D , CD),
+ OP(4510, Rev64 , B , Zip1_2D , AC, _ , _ ), OP(4511, Rev64 , B , Dup1 , A , Zip1_2D , DC), OP(4512, Uzp2_4S , AB, Uzp1_4S , AC, Ext4 , DB), OP(4513, Trn2_4S , AB, Zip1_2D , CB, Ext12 , AD),
+ OP(4520, Dup1 , B , Uzp1_4S , CB, Uzp1_4S , AD), OP(4521, Ext4 , AB, InsS_1To2, B , _ , _ ), OP(4522, Rev64 , B , Dup2 , A , Zip1_2D , DC), OP(4523, Ext8 , AB, Rev64 , C , _ , _ ),
+ OP(4530, Ext12 , AA, Zip1_2D , CB, Rev64 , D ), OP(4531, Uzp2_4S , AB, InsS_0To3, B , _ , _ ), OP(4532, Rev64 , B , Ext8 , AC, _ , _ ), OP(4533, Rev64 , B , Dup3 , A , Zip1_2D , DC),
+ OP(4600, Ext8 , BB, Dup0 , A , Uzp1_4S , DC), OP(4601, Uzp1_4S , BB, Zip1_2D , AC, Rev64 , D ), OP(4602, Uzp1_4S , AB, Rev64 , C , _ , _ ), OP(4603, Uzp1_4S , AB, InsS_3To1, C , Ext12 , AC),
+ OP(4610, Dup2 , B , Trn1_4S , CB, Zip1_2D , AD), OP(4611, Ext8 , BB, Dup1 , A , Uzp1_4S , DC), OP(4612, Trn1_4S , AB, Zip1_4S , AC, Zip2_4S , CD), OP(4613, Rev64 , B , Uzp2_4S , AC, Rev64 , D ),
+ OP(4620, Ext8 , BB, Uzp1_4S , AC, _ , _ ), OP(4621, Ext4 , AB, InsS_2To2, B , _ , _ ), OP(4622, Ext8 , BB, Dup2 , A , Uzp1_4S , DC), OP(4623, Trn1_4S , AB, Zip2_2D , AC, Ext4 , DB),
+ OP(4630, Ext12 , AB, Zip1_4S , AC, InsS_3To2, C ), OP(4631, Ext4 , BB, Uzp2_4S , AC, _ , _ ), OP(4632, Zip2_2D , AB, InsS_0To3, B , _ , _ ), OP(4633, Ext8 , BB, Dup3 , A , Uzp1_4S , DC),
+ OP(4700, Ext12 , BB, Dup0 , A , Zip1_2D , DC), OP(4701, Ext12 , BB, Rev64 , A , Zip1_2D , DC), OP(4702, Uzp1_4S , AB, InsS_3To3, B , Rev64 , C ), OP(4703, Ext12 , BB, Ext12 , AA, Zip1_2D , DC),
+ OP(4710, Ext12 , BB, Zip1_2D , AC, _ , _ ), OP(4711, Ext12 , BB, Dup1 , A , Zip1_2D , DC), OP(4712, Ext12 , BB, Zip1_2D , AC, InsS_2To0, A ), OP(4713, Uzp2_4S , AB, InsS_0To2, C , Ext4 , CB),
+ OP(4720, Dup3 , B , Uzp1_4S , CB, Uzp1_4S , AD), OP(4721, Ext4 , AB, InsS_3To2, B , _ , _ ), OP(4722, Ext12 , BB, Dup2 , A , Zip1_2D , DC), OP(4723, Ext12 , BB, Rev64 , A , Ext8 , DC),
+ OP(4730, Rev64 , A , InsS_3To3, B , Ext4 , CB), OP(4731, Dup3 , B , Ext4 , CB, Uzp2_4S , AD), OP(4732, Ext12 , BB, Ext8 , AC, _ , _ ), OP(4733, Ext12 , BB, Dup3 , A , Zip1_2D , DC),
+ OP(5400, Dup0 , A , Zip1_2D , CB, _ , _ ), OP(5401, Rev64 , A , Zip1_2D , CB, _ , _ ), OP(5402, Ext8 , AB, InsS_0To1, A , _ , _ ), OP(5403, Ext12 , AA, Zip1_2D , CB, _ , _ ),
+ OP(5410, Zip1_2D , AB, _ , _ , _ , _ ), OP(5411, Dup1 , A , Zip1_2D , CB, _ , _ ), OP(5412, Zip1_2D , AB, InsS_2To0, A , _ , _ ), OP(5413, Zip1_2D , AB, InsS_3To0, A , _ , _ ),
+ OP(5420, Uzp1_4S , BA, Ext8 , CB, _ , _ ), OP(5421, Ext12 , BA, Ext8 , CB, _ , _ ), OP(5422, Dup2 , A , Zip1_2D , CB, _ , _ ), OP(5423, Rev64 , A , Ext8 , CB, _ , _ ),
+ OP(5430, Zip1_2D , AB, InsS_3To1, A , _ , _ ), OP(5431, Uzp2_4S , BA, Ext8 , CB, _ , _ ), OP(5432, Ext8 , AB, _ , _ , _ , _ ), OP(5433, Dup3 , A , Zip1_2D , CB, _ , _ ),
+ OP(5500, Dup1 , B , Dup0 , A , Uzp2_4S , DC), OP(5501, Rev64 , A , Dup1 , B , Zip1_2D , CD), OP(5502, Ext8 , AA, Dup1 , B , Uzp1_4S , CD), OP(5503, Ext12 , AA, Dup1 , B , Zip1_2D , CD),
+ OP(5510, Dup1 , B , Zip1_2D , AC, _ , _ ), OP(5511, Trn2_4S , AB, Zip1_4S , CC, _ , _ ), OP(5512, Uzp2_4S , AB, Zip2_2D , AC, Trn1_4S , DC), OP(5513, Ext12 , AA, Dup1 , B , Uzp1_4S , CD),
+ OP(5520, Dup1 , B , Uzp1_4S , AC, _ , _ ), OP(5521, Ext12 , BA, Dup1 , B , Zip2_2D , CD), OP(5522, Dup2 , A , Dup1 , B , Uzp2_4S , CD), OP(5523, Rev64 , A , Dup1 , B , Zip2_2D , CD),
+ OP(5530, Ext12 , AB, Trn1_4S , AC, InsS_3To2, D ), OP(5531, Dup1 , B , Uzp2_4S , AC, _ , _ ), OP(5532, Dup1 , B , Zip2_2D , AC, _ , _ ), OP(5533, Ext12 , AB, Trn1_4S , CC, _ , _ ),
+ OP(5600, Trn1_4S , BA, InsS_1To3, B , InsS_1To0, C ), OP(5601, Ext4 , BB, Zip1_2D , AC, Rev64 , D ), OP(5602, Uzp1_4S , AB, InsS_1To2, B , Rev64 , C ), OP(5603, Trn1_4S , BA, InsS_1To3, B , InsS_3To0, A ),
+ OP(5610, Zip1_2D , AB, InsS_2To2, B , _ , _ ), OP(5611, Zip1_4S , AB, Trn1_4S , CB, Zip2_4S , DC), OP(5612, Trn2_4S , AB, Zip2_4S , AB, Zip1_4S , DC), OP(5613, Trn2_4S , AB, Zip2_4S , CB, Zip1_4S , DC),
+ OP(5620, Dup2 , B , Uzp2_4S , CB, Uzp1_4S , AD), OP(5621, Rev64 , B , Ext4 , AC, InsS_3To2, C ), OP(5622, Uzp1_4S , AB, Zip1_2D , CB, Trn2_4S , CD), OP(5623, Uzp1_4S , AB, Uzp2_4S , CB, Ext12 , AD),
+ OP(5630, Ext12 , AB, Trn1_4S , AC, InsS_3To2, C ), OP(5631, Dup2 , B , Zip1_2D , CB, Uzp2_4S , AD), OP(5632, Zip2_2D , AB, InsS_1To3, B , _ , _ ), OP(5633, Ext12 , AB, InsS_3To1, C , Ext12 , AC),
+ OP(5700, Ext12 , BB, Dup0 , A , Uzp1_4S , DC), OP(5701, Uzp2_4S , BB, Zip1_2D , AC, Rev64 , D ), OP(5702, Rev64 , B , Uzp1_4S , AC, Rev64 , D ), OP(5703, Uzp2_4S , BB, InsS_0To0, A , Ext12 , AC),
+ OP(5710, Zip1_2D , AB, InsS_3To2, B , _ , _ ), OP(5711, Ext12 , BB, Dup1 , A , Uzp1_4S , DC), OP(5712, Uzp2_4S , AB, InsS_2To1, A , Rev64 , C ), OP(5713, Uzp2_4S , AB, Rev64 , C , _ , _ ),
+ OP(5720, Ext12 , BB, Uzp1_4S , AC, _ , _ ), OP(5721, Rev64 , B , Ext4 , AC, InsS_2To2, C ), OP(5722, Ext12 , BB, Dup2 , A , Uzp1_4S , DC), OP(5723, Uzp2_4S , BB, Zip2_2D , AC, Rev64 , D ),
+ OP(5730, Ext12 , BB, Uzp1_4S , AC, InsS_3To1, A ), OP(5731, Ext8 , BB, Uzp2_4S , AC, _ , _ ), OP(5732, Ext8 , AB, InsS_3To2, B , _ , _ ), OP(5733, Ext12 , BB, Dup3 , A , Uzp1_4S , DC),
+ OP(6400, Dup0 , A , Uzp1_4S , CB, _ , _ ), OP(6401, Dup1 , A , Uzp1_4S , CA, Uzp1_4S , DB), OP(6402, Ext8 , AA, Uzp1_4S , CB, _ , _ ), OP(6403, Dup3 , A , Uzp1_4S , CA, Uzp1_4S , DB),
+ OP(6410, Uzp1_4S , BB, Zip1_2D , AC, _ , _ ), OP(6411, Dup1 , A , Uzp1_4S , CB, _ , _ ), OP(6412, Dup2 , A , Uzp2_4S , CA, Uzp1_4S , DB), OP(6413, Ext12 , AA, Uzp1_4S , CB, _ , _ ),
+ OP(6420, Uzp1_4S , AB, _ , _ , _ , _ ), OP(6421, Uzp1_4S , AB, InsS_1To0, A , _ , _ ), OP(6422, Dup2 , A , Uzp1_4S , CB, _ , _ ), OP(6423, Uzp1_4S , AB, InsS_3To0, A , _ , _ ),
+ OP(6430, Uzp1_4S , AB, InsS_3To1, A , _ , _ ), OP(6431, Rev64 , B , Uzp2_4S , AC, _ , _ ), OP(6432, Uzp1_4S , BB, Zip2_2D , AC, _ , _ ), OP(6433, Dup3 , A , Uzp1_4S , CB, _ , _ ),
+ OP(6500, Ext12 , BB, Dup0 , A , Zip2_2D , DC), OP(6501, Ext4 , BB, Rev64 , A , Zip1_2D , DC), OP(6502, Rev64 , A , Ext12 , CB, InsS_1To1, C ), OP(6503, Ext12 , AB, InsS_0To1, A , _ , _ ),
+ OP(6510, Ext4 , BB, Zip1_2D , AC, _ , _ ), OP(6511, Ext12 , BB, Dup1 , A , Zip2_2D , DC), OP(6512, Rev64 , A , Ext12 , CB, InsS_0To1, C ), OP(6513, Ext12 , AB, InsS_1To1, A , _ , _ ),
+ OP(6520, Uzp1_4S , AB, InsS_1To2, B , _ , _ ), OP(6521, Trn2_4S , AB, Zip2_4S , AB, Zip1_4S , CD), OP(6522, Ext12 , BB, Dup2 , A , Zip2_2D , DC), OP(6523, Ext12 , AB, InsS_2To1, A , _ , _ ),
+ OP(6530, Ext4 , BA, Trn2_4S , CA, Ext8 , DC), OP(6531, Uzp2_4S , AB, InsS_2To3, B , _ , _ ), OP(6532, Ext12 , BB, Zip2_2D , AC, _ , _ ), OP(6533, Ext12 , AB, InsS_0To1, C , _ , _ ),
+ OP(6600, Dup2 , B , Dup0 , A , Uzp2_4S , DC), OP(6601, Rev64 , A , Dup2 , B , Zip1_2D , CD), OP(6602, Ext8 , AA, Dup2 , B , Uzp1_4S , CD), OP(6603, Ext12 , AA, Dup2 , B , Zip1_2D , CD),
+ OP(6610, Dup2 , B , Zip1_2D , AC, _ , _ ), OP(6611, Dup2 , B , Dup1 , A , Uzp2_4S , DC), OP(6612, Zip2_4S , AB, Trn2_4S , AC, Zip1_4S , CD), OP(6613, Ext12 , AA, Dup2 , B , Uzp1_4S , CD),
+ OP(6620, Dup2 , B , Uzp1_4S , AC, _ , _ ), OP(6621, Ext12 , BA, Dup2 , B , Zip2_2D , CD), OP(6622, Trn1_4S , AB, Zip2_4S , CC, _ , _ ), OP(6623, Rev64 , A , Dup2 , B , Zip2_2D , CD),
+ OP(6630, Trn1_4S , AB, InsS_3To1, A , InsS_3To2, C ), OP(6631, Dup2 , B , Uzp2_4S , AC, _ , _ ), OP(6632, Dup2 , B , Zip2_2D , AC, _ , _ ), OP(6633, Dup3 , A , Dup2 , B , Uzp2_4S , CD),
+ OP(6700, Rev64 , B , Dup0 , A , Zip2_2D , DC), OP(6701, Ext8 , BA, Rev64 , C , Ext8 , DD), OP(6702, Uzp1_4S , BA, Zip2_2D , CB, Rev64 , D ), OP(6703, Ext4 , AA, Rev64 , B , Zip2_2D , CD),
+ OP(6710, Rev64 , B , InsD_0To0, A , _ , _ ), OP(6711, Rev64 , B , Dup1 , A , Zip2_2D , DC), OP(6712, Ext12 , BA, Zip2_2D , CB, Rev64 , D ), OP(6713, Uzp2_4S , BA, Zip2_2D , CB, Rev64 , D ),
+ OP(6720, Uzp1_4S , AB, InsS_3To2, B , _ , _ ), OP(6721, Ext12 , BA, Rev64 , B , Zip2_2D , CD), OP(6722, Rev64 , B , Dup2 , A , Zip2_2D , DC), OP(6723, Zip2_2D , AB, Rev64 , C , _ , _ ),
+ OP(6730, Ext4 , AA, Zip2_2D , CB, Rev64 , D ), OP(6731, Dup3 , B , Uzp1_4S , CB, Uzp2_4S , AD), OP(6732, Rev64 , B , Zip2_2D , AC, _ , _ ), OP(6733, Rev64 , B , Dup3 , A , Zip2_2D , DC),
+ OP(7400, Uzp1_4S , AB, InsS_3To3, B , InsS_0To1, C ), OP(7401, Ext12 , BB, Zip1_2D , AC, Rev64 , D ), OP(7402, Ext4 , AB, Trn2_4S , CB, InsS_0To1, A ), OP(7403, Rev64 , B , InsS_0To0, A , Ext12 , AC),
+ OP(7410, Zip1_2D , AB, InsS_3To3, B , _ , _ ), OP(7411, Trn2_4S , AB, InsS_0To2, B , InsS_0To1, C ), OP(7412, Ext4 , AB, Trn2_4S , CB, InsS_0To1, C ), OP(7413, Ext4 , AB, Zip2_4S , CB, InsS_0To1, C ),
+ OP(7420, Uzp1_4S , AB, InsS_3To3, B , _ , _ ), OP(7421, Ext12 , BA, Trn1_4S , BC, Ext8 , CD), OP(7422, Ext4 , AB, Trn2_4S , CB, InsS_0To1, D ), OP(7423, Ext12 , BB, Ext8 , AC, Rev64 , D ),
+ OP(7430, Uzp2_4S , AB, InsS_0To2, B , InsS_0To0, A ), OP(7431, Uzp2_4S , AB, InsS_0To2, B , _ , _ ), OP(7432, Zip2_2D , AB, InsS_0To2, B , _ , _ ), OP(7433, Trn2_4S , AB, Ext4 , AB, Zip2_4S , DC),
+ OP(7500, Dup0 , A , Uzp2_4S , CB, _ , _ ), OP(7501, Uzp2_4S , AB, InsS_0To1, A , _ , _ ), OP(7502, Ext4 , AA, Uzp2_4S , CB, _ , _ ), OP(7503, Dup3 , A , Ext4 , CA, Uzp2_4S , DB),
+ OP(7510, Uzp2_4S , BB, Zip1_2D , AC, _ , _ ), OP(7511, Dup1 , A , Uzp2_4S , CB, _ , _ ), OP(7512, Dup2 , A , Zip1_2D , CA, Uzp2_4S , DB), OP(7513, Ext8 , AA, Uzp2_4S , CB, _ , _ ),
+ OP(7520, Rev64 , B , Uzp1_4S , AC, _ , _ ), OP(7521, Uzp2_4S , AB, InsS_2To1, A , _ , _ ), OP(7522, Dup2 , A , Uzp2_4S , CB, _ , _ ), OP(7523, Dup3 , A , Uzp1_4S , CA, Uzp2_4S , DB),
+ OP(7530, Uzp2_4S , AB, InsS_0To0, A , _ , _ ), OP(7531, Uzp2_4S , AB, _ , _ , _ , _ ), OP(7532, Uzp2_4S , BB, Zip2_2D , AC, _ , _ ), OP(7533, Dup3 , A , Uzp2_4S , CB, _ , _ ),
+ OP(7600, Dup0 , A , Zip2_2D , CB, _ , _ ), OP(7601, Rev64 , A , InsD_1To1, B , _ , _ ), OP(7602, Zip2_2D , AB, InsS_0To1, A , _ , _ ), OP(7603, Ext4 , AA, Zip2_2D , CB, _ , _ ),
+ OP(7610, Zip2_2D , BB, Zip1_2D , AC, _ , _ ), OP(7611, Dup1 , A , Zip2_2D , CB, _ , _ ), OP(7612, Zip2_2D , AB, InsS_1To1, A , _ , _ ), OP(7613, Dup3 , A , Zip1_4S , CA, Zip2_2D , DB),
+ OP(7620, Uzp1_4S , BA, Zip2_2D , CB, _ , _ ), OP(7621, Ext12 , BA, Zip2_2D , CB, _ , _ ), OP(7622, Dup2 , A , Zip2_2D , CB, _ , _ ), OP(7623, Rev64 , A , Zip2_2D , CB, _ , _ ),
+ OP(7630, Zip2_2D , AB, InsS_0To0, A , _ , _ ), OP(7631, Uzp2_4S , BA, Zip2_2D , CB, _ , _ ), OP(7632, Zip2_2D , AB, _ , _ , _ , _ ), OP(7633, Dup3 , A , Zip2_2D , CB, _ , _ ),
+ OP(7700, Dup3 , B , Dup0 , A , Uzp2_4S , DC), OP(7701, Rev64 , A , Dup3 , B , Zip1_2D , CD), OP(7702, Ext8 , AA, Dup3 , B , Uzp1_4S , CD), OP(7703, Ext12 , AA, Dup3 , B , Zip1_2D , CD),
+ OP(7710, Dup3 , B , Zip1_2D , AC, _ , _ ), OP(7711, Dup3 , B , Dup1 , A , Uzp2_4S , DC), OP(7712, Trn2_4S , BA, InsS_2To0, A , InsS_2To3, C ), OP(7713, Ext12 , AA, Dup3 , B , Uzp1_4S , CD),
+ OP(7720, Dup3 , B , Uzp1_4S , AC, _ , _ ), OP(7721, Ext12 , BA, Dup3 , B , Zip2_2D , CD), OP(7722, Dup3 , B , Dup2 , A , Uzp2_4S , DC), OP(7723, Rev64 , A , Dup3 , B , Zip2_2D , CD),
+ OP(7730, Uzp2_4S , AB, InsS_0To0, A , InsS_3To2, C ), OP(7731, Dup3 , B , Uzp2_4S , AC, _ , _ ), OP(7732, Dup3 , B , Zip2_2D , AC, _ , _ ), OP(7733, Trn2_4S , AB, Zip2_4S , CC, _ , _ )
+};
+
+#undef OP
+
+static void emit_interleaved_shuffle32_impl(UniCompiler& uc, const Vec& dst, const Vec& src1, const Vec& src2, uint32_t imm) {
+ ASMJIT_ASSERT((imm & 0xFCFCFCFC) == 0);
+
+ if (src1.id() == src2.id())
+ return emit_swizzle32_impl(uc, dst, src1, imm);
+
+ BackendCompiler* cc = uc.cc;
+
+ uint32_t table_index = ((imm & 0x03000000) >> (24 - 6)) |
+ ((imm & 0x00030000) >> (16 - 4)) |
+ ((imm & 0x00000300) >> (8 - 2)) | (imm & 0x00000003);
+
+ // By default the cost matrix tries to avoid inserting A to DST to minimize the number of instructions
+ // in case that `dst == a`, which is common. However, we have a also a table that penalizes inserting B
+ // to DST, so select the best version.
+ InterleavedShuffle32Ops ops;
+ if (dst.id() != src2.id())
+ ops = interleaved_shuffle32_ops[table_index];
+ else
+ ops = interleaved_shuffle32_ops_dst_same_as_b[table_index];
+
+ Vec regs[5] = { src1, src2, Vec(), Vec(), Vec() };
+
+ uint32_t count = ops.count();
+ uint32_t src_use_mask[4] {};
+ uint32_t dst_index = count - 1;
+
+ {
+ uint32_t i = count;
+ uint32_t all_use_mask = 0;
+
+ while (i != 0) {
+ i--;
+ InterleavedShuffle32Ops::Op op = ops.op(i);
+
+ // Calculate masks that follow.
+ all_use_mask |= 1u << op.src_a();
+ all_use_mask |= 1u << op.src_b();
+ src_use_mask[i] = all_use_mask;
+
+ // Calculate the last operation where we need a new destination (inserts insert to the last).
+ if (op.is_ins_op()) {
+ // The last destination would be the previous operation (if not another insert).
+ dst_index = i - 1;
+ }
+ }
+ }
+
+ uint32_t op_index = 2;
+ Vec final_dst;
+
+ for (uint32_t i = 0; i < count; i++) {
+ InterleavedShuffle32Ops::Op op = ops.op(i);
+
+ if (i > 0 && !op.is_ins_op()) {
+ op_index++;
+ }
+
+ // Should not be counted if it's invalid - so let's verify it here...
+ ASMJIT_ASSERT(op.is_valid());
+
+ Vec op_dst;
+ if (i < dst_index) {
+ if (regs[op_index].is_valid()) {
+ op_dst = regs[op_index];
+ }
+ else {
+ op_dst = uc.new_similar_reg(dst, "@shuf_tmp_%u", op_index - 2);
+ }
+ }
+ else {
+ if (!final_dst.is_valid()) {
+ uint32_t msk = 0;
+ if (dst.id() == src1.id()) {
+ msk = 0x1u;
+ }
+ else if (dst.id() == src2.id()) {
+ msk = 0x2u;
+ }
+
+ if (src_use_mask[i + 1] & msk) {
+ // In this case the destination is in conflict with one of the source registers. We have to
+ // create a new virtual register and then move it to the real `dst` to not mess up the shuffle.
+ ASMJIT_ASSERT(!regs[op_index].is_valid());
+ final_dst = uc.new_similar_reg(dst, "@shuf_dst");
+ }
+ else {
+ // Perfect - the destination is not in conflict with any source register.
+ final_dst = dst;
+ }
+ }
+ op_dst = final_dst;
+ }
+
+ uint32_t a_index = op.src_a();
+ uint32_t b_index = op.src_b();
+
+ switch (op.op()) {
+ case InterleavedShuffle32Ops::Op::kOpInsS: {
+ uint32_t src_lane = op.ins_src();
+ uint32_t dst_lane = op.ins_dst();
+ cc->mov(op_dst.s(dst_lane), regs[a_index].s(src_lane));
+ break;
+ }
+
+ case InterleavedShuffle32Ops::Op::kOpInsD: {
+ uint32_t src_lane = op.ins_src();
+ uint32_t dst_lane = op.ins_dst();
+ cc->mov(op_dst.d(dst_lane), regs[a_index].d(src_lane));
+ break;
+ }
+
+ case InterleavedShuffle32Ops::Op::kOpPerm: {
+ static constexpr uint16_t perm_inst[8] = {
+ Inst::kIdZip1_v,
+ Inst::kIdZip2_v,
+ Inst::kIdUzp1_v,
+ Inst::kIdUzp2_v,
+ Inst::kIdTrn1_v,
+ Inst::kIdTrn2_v,
+ Inst::kIdExt_v,
+ Inst::kIdExt_v
+ };
+
+ InstId inst_id = perm_inst[op.perm_op()];
+
+ if (inst_id == Inst::kIdExt_v)
+ cc->ext(op_dst.b16(), regs[a_index].b16(), regs[b_index].b16(), op.perm_ext_imm());
+ else if (op.perm_s4())
+ cc->emit(inst_id, op_dst.s4(), regs[a_index].s4(), regs[b_index].s4());
+ else
+ cc->emit(inst_id, op_dst.d2(), regs[a_index].d2(), regs[b_index].d2());
+ break;
+ }
+
+ case InterleavedShuffle32Ops::Op::kOpRev64: {
+ cc->rev64(op_dst.s4(), regs[a_index].s4());
+ break;
+ }
+
+ case InterleavedShuffle32Ops::Op::kOpDup: {
+ uint32_t idx = op.dup_idx();
+ cc->dup(op_dst.s4(), regs[a_index].s(idx));
+ break;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ regs[op_index] = op_dst;
+ }
+
+ vec_mov(uc, dst, final_dst);
+}
+
+// ujit::UniCompiler - Vector Instructions - OpArray Iterator
+// ==========================================================
+
+template<typename T>
+class OpArrayIter {
+public:
+ const T& _op;
+
+ ASMJIT_INLINE_NODEBUG OpArrayIter(const T& op) noexcept : _op(op) {}
+ ASMJIT_INLINE_NODEBUG const T& op() const noexcept { return _op; }
+ ASMJIT_INLINE_NODEBUG void next() noexcept {}
+};
+
+template<>
+class OpArrayIter<OpArray> {
+public:
+ const OpArray& _opArray;
+ size_t _i {};
+ size_t _n {};
+
+ ASMJIT_INLINE_NODEBUG OpArrayIter(const OpArray& op_array) noexcept : _opArray(op_array), _i(0), _n(op_array.size()) {}
+ ASMJIT_INLINE_NODEBUG const Operand_& op() const noexcept { return _opArray[_i]; }
+ ASMJIT_INLINE_NODEBUG void next() noexcept { if (++_i >= _n) _i = 0; }
+};
+
+template<typename Src>
+static ASMJIT_INLINE void emit_2v_t(UniCompiler& uc, UniOpVV op, const OpArray& dst_, const Src& src_) {
+ size_t n = dst_.size();
+ OpArrayIter<Src> src(src_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_2v(op, dst_[i], src.op());
+ src.next();
+ }
+}
+
+template<typename Src>
+static ASMJIT_INLINE void emit_2vi_t(UniCompiler& uc, UniOpVVI op, const OpArray& dst_, const Src& src_, uint32_t imm) {
+ size_t n = dst_.size();
+ OpArrayIter<Src> src(src_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_2vi(op, dst_[i], src.op(), imm);
+ src.next();
+ }
+}
+
+template<typename Src1, typename Src2>
+static ASMJIT_INLINE void emit_3v_t(UniCompiler& uc, UniOpVVV op, const OpArray& dst_, const Src1& src1_, const Src2& src2_) {
+ size_t n = dst_.size();
+ OpArrayIter<Src1> src1(src1_);
+ OpArrayIter<Src2> src2(src2_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_3v(op, dst_[i], src1.op(), src2.op());
+ src1.next();
+ src2.next();
+ }
+}
+
+template<typename Src1, typename Src2>
+static ASMJIT_INLINE void emit_3vi_t(UniCompiler& uc, UniOpVVVI op, const OpArray& dst_, const Src1& src1_, const Src2& src2_, uint32_t imm) {
+ size_t n = dst_.size();
+ OpArrayIter<Src1> src1(src1_);
+ OpArrayIter<Src2> src2(src2_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_3vi(op, dst_[i], src1.op(), src2.op(), imm);
+ src1.next();
+ src2.next();
+ }
+}
+
+template<typename Src1, typename Src2, typename Src3>
+static ASMJIT_INLINE void emit_4v_t(UniCompiler& uc, UniOpVVVV op, const OpArray& dst_, const Src1& src1_, const Src2& src2_, const Src3& src3_) {
+ size_t n = dst_.size();
+ OpArrayIter<Src1> src1(src1_);
+ OpArrayIter<Src2> src2(src2_);
+ OpArrayIter<Src3> src3(src3_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_4v(op, dst_[i], src1.op(), src2.op(), src3.op());
+ src1.next();
+ src2.next();
+ src3.next();
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Emit 2V
+// =================================================
+
+void UniCompiler::emit_2v(UniOpVV op, const Operand_& dst_, const Operand_& src_) {
+ ASMJIT_ASSERT(dst_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+
+ UniOpVInfo op_info = opcode_info_2v[size_t(op)];
+ InstId inst_id = op_info.inst_id;
+
+ switch (op) {
+ case UniOpVV::kMov: {
+ if (src_.is_vec()) {
+ Vec src = src_.as<Vec>();
+ if (dst.size() < 16 || src.size() < 16)
+ cc->mov(dst.b8(), src.b8());
+ else
+ cc->mov(dst.b16(), src.b16());
+ return;
+ }
+
+ vec_mov(*this, dst, src_);
+ return;
+ }
+
+ case UniOpVV::kMovU64: {
+ dst = dst.d();
+ Vec src = as_vec(*this, src_, dst);
+
+ cc->mov(dst.b8(), src.b8());
+ return;
+ }
+
+ case UniOpVV::kBroadcastU8Z:
+ case UniOpVV::kBroadcastU16Z:
+ case UniOpVV::kBroadcastU8:
+ case UniOpVV::kBroadcastU16:
+ case UniOpVV::kBroadcastU32:
+ case UniOpVV::kBroadcastF32:
+ case UniOpVV::kBroadcastU64:
+ case UniOpVV::kBroadcastF64: {
+ ElementSize element_size = ElementSize(op_info.dst_element);
+ vec_set_type(dst, element_size);
+
+ Operand src(src_);
+
+ if (src.is_mem()) {
+ // NOTE: ld1r instruction is pretty limited - it offers only `[base]` or `[base + offset|index]@` (post-index)
+ // addressing. This means that it's sometimes just better to emit a regular load folowed by dup than to actually
+ // use ld1r.
+ Mem& m = src.as<Mem>();
+ if (!m.has_index() && !m.has_offset()) {
+ cc->ld1r(dst, m);
+ return;
+ }
+
+ v_load_iany(dst, src.as<Mem>(), size_t(1) << uint32_t(op_info.src_element), Alignment(1));
+ src = dst;
+ }
+
+ if (src.is_vec()) {
+ Vec& src_vec = src.as<Vec>();
+ vec_set_type_and_index(src_vec, element_size, 0);
+ cc->dup(dst, src_vec);
+ return;
+ }
+ else if (src.is_gp()) {
+ Gp& src_gp = src.as<Gp>();
+ if (element_size <= ElementSize::k32)
+ src_gp = src_gp.r32();
+ else
+ src_gp = src_gp.r64();
+ cc->dup(dst, src_gp);
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVV::kBroadcastV128_U32:
+ case UniOpVV::kBroadcastV128_U64:
+ case UniOpVV::kBroadcastV128_F32:
+ case UniOpVV::kBroadcastV128_F64:
+ // 128-bit broadcast is an alias of mov as we have only 128-bit vectors...
+ v_mov(dst, src_);
+ return;
+
+ case UniOpVV::kBroadcastV256_U32:
+ case UniOpVV::kBroadcastV256_U64:
+ case UniOpVV::kBroadcastV256_F32:
+ case UniOpVV::kBroadcastV256_F64:
+ // Unsupported as NEON has only 128-bit vectors.
+ ASMJIT_NOT_REACHED();
+
+ case UniOpVV::kAbsI8:
+ case UniOpVV::kAbsI16:
+ case UniOpVV::kAbsI32:
+ case UniOpVV::kAbsI64:
+ case UniOpVV::kNotU32:
+ case UniOpVV::kNotU64:
+ case UniOpVV::kNotF32:
+ case UniOpVV::kNotF64: {
+ Vec src = as_vec(*this, src_, dst);
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtI8ToI32:
+ case UniOpVV::kCvtU8ToU32: {
+ Vec src = as_vec(*this, src_, dst);
+ cc->emit(inst_id, dst.h8(), src.b8(), 0);
+ cc->emit(inst_id, dst.s4(), dst.h4(), 0);
+ return;
+ }
+
+ case UniOpVV::kCvtI8LoToI16:
+ case UniOpVV::kCvtI8HiToI16:
+ case UniOpVV::kCvtU8LoToU16:
+ case UniOpVV::kCvtU8HiToU16:
+ case UniOpVV::kCvtI16LoToI32:
+ case UniOpVV::kCvtI16HiToI32:
+ case UniOpVV::kCvtU16LoToU32:
+ case UniOpVV::kCvtU16HiToU32:
+ case UniOpVV::kCvtI32LoToI64:
+ case UniOpVV::kCvtI32HiToI64:
+ case UniOpVV::kCvtU32LoToU64:
+ case UniOpVV::kCvtU32HiToU64: {
+ vec_set_type(dst, op_info.dst_element);
+
+ Vec src;
+
+ if (op_info.src_part == VecPart::kLo) {
+ src = as_vec(*this, src_, dst, 8);
+ src = src.v64();
+ }
+ else if (src_.is_vec()) {
+ src = src_.as<Vec>();
+ }
+ else {
+ Mem m(src_.as<Mem>());
+ m.add_offset(8);
+ src = vec_from_mem(*this, m, dst, 8);
+ src = src.v64();
+
+ // Since we have loaded from memory, we want to use the low-part variant of the instruction.
+ inst_id = opcode_info_2v[size_t(op) - 1u].inst_id;
+ }
+
+ vec_set_type(src, op_info.src_element);
+ cc->emit(inst_id, dst, src, 0);
+ return;
+ }
+
+ case UniOpVV::kRcpF32:
+ case UniOpVV::kRcpF64: {
+ // Intrinsic.
+ const void* one_ptr = op_info.src_element == ElementSize::k32 ? static_cast<const void*>(&ct().f32_1) : static_cast<const void*>(&ct().f64_1);
+
+ Vec one = simd_vec_const(one_ptr, Bcst::kNA, dst);
+ Vec src = as_vec(*this, src_, dst);
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(one, op_info.dst_element);
+ vec_set_type(src, op_info.dst_element);
+
+ cc->fdiv(dst, one, src);
+ return;
+ }
+
+ case UniOpVV::kAbsF32S:
+ case UniOpVV::kNegF32S:
+ case UniOpVV::kTruncF32S:
+ case UniOpVV::kFloorF32S:
+ case UniOpVV::kCeilF32S:
+ case UniOpVV::kRoundEvenF32S:
+ case UniOpVV::kRoundHalfAwayF32S:
+ case UniOpVV::kSqrtF32S: {
+ dst.set_signature(RegTraits<RegType::kVec32>::kSignature);
+ Vec src = as_vec(*this, src_, dst);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kAbsF64S:
+ case UniOpVV::kNegF64S:
+ case UniOpVV::kTruncF64S:
+ case UniOpVV::kFloorF64S:
+ case UniOpVV::kCeilF64S:
+ case UniOpVV::kRoundEvenF64S:
+ case UniOpVV::kRoundHalfAwayF64S:
+ case UniOpVV::kSqrtF64S: {
+ dst.set_signature(RegTraits<RegType::kVec64>::kSignature);
+ Vec src = as_vec(*this, src_, dst);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kRoundHalfUpF32S:
+ case UniOpVV::kRoundHalfUpF64S:
+ case UniOpVV::kRoundHalfUpF32:
+ case UniOpVV::kRoundHalfUpF64: {
+ // Intrinsic.
+ const void* one_ptr =
+ op_info.src_element == ElementSize::k32
+ ? static_cast<const void*>(&ct().f32_0_5_minus_1ulp)
+ : static_cast<const void*>(&ct().f64_0_5_minus_1ulp);
+
+ Vec one = simd_vec_const(one_ptr, Bcst::kNA, dst);
+ Vec src = as_vec(*this, src_, dst);
+
+ if (op == UniOpVV::kRoundHalfUpF32S) {
+ dst.set_signature(RegTraits<RegType::kVec32>::kSignature);
+ src.set_signature(RegTraits<RegType::kVec32>::kSignature);
+ one.set_signature(RegTraits<RegType::kVec32>::kSignature);
+ }
+ else if (op == UniOpVV::kRoundHalfUpF64S) {
+ dst.set_signature(RegTraits<RegType::kVec64>::kSignature);
+ src.set_signature(RegTraits<RegType::kVec64>::kSignature);
+ one.set_signature(RegTraits<RegType::kVec64>::kSignature);
+ }
+ else {
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(one, op_info.src_element);
+ vec_set_type(src, op_info.src_element);
+ }
+
+ cc->fadd(dst, src, one);
+ cc->frintm(dst, dst);
+
+ return;
+ }
+
+ case UniOpVV::kAbsF32:
+ case UniOpVV::kAbsF64:
+ case UniOpVV::kNegF32:
+ case UniOpVV::kNegF64:
+ case UniOpVV::kTruncF32:
+ case UniOpVV::kTruncF64:
+ case UniOpVV::kFloorF32:
+ case UniOpVV::kFloorF64:
+ case UniOpVV::kCeilF32:
+ case UniOpVV::kCeilF64:
+ case UniOpVV::kRoundEvenF32:
+ case UniOpVV::kRoundEvenF64:
+ case UniOpVV::kRoundHalfAwayF32:
+ case UniOpVV::kRoundHalfAwayF64:
+ case UniOpVV::kSqrtF32:
+ case UniOpVV::kSqrtF64:
+ case UniOpVV::kCvtI32ToF32:
+ case UniOpVV::kCvtRoundF32ToI32:
+ case UniOpVV::kCvtTruncF32ToI32: {
+ Vec src = as_vec(*this, src_, dst);
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtF32ToF64S:
+ case UniOpVV::kCvtF64ToF32S: {
+ Vec src = as_vec(*this, src_, dst);
+
+ vec_set_vec_type(dst, op_info.dst_element);
+ vec_set_vec_type(src, op_info.src_element);
+
+ cc->fcvt(dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtF32HiToF64:
+ if (src_.is_mem()) {
+ Vec src = as_vec(*this, src_.as<Mem>().clone_adjusted(8), dst, 8).v64();
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(opcode_info_2v[size_t(op) - 1u].inst_id, dst, src);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVV::kCvtF32LoToF64: {
+ Vec src = as_vec(*this, src_, dst, 8);
+
+ if (op_info.src_part == VecPart::kLo) {
+ src = src.v64();
+ }
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtI32HiToF64:
+ if (src_.is_mem()) {
+ Vec src = as_vec(*this, src_.as<Mem>().clone_adjusted(8), dst, 8).v64();
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(opcode_info_2v[size_t(op) - 1u].inst_id, dst, src, 0);
+ cc->scvtf(dst.d2(), dst.d2());
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVV::kCvtI32LoToF64: {
+ Vec src = as_vec(*this, src_, dst, 8);
+
+ if (op_info.src_part == VecPart::kLo) {
+ src = src.v64();
+ }
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(inst_id, dst, src, 0);
+ cc->scvtf(dst.d2(), dst.d2());
+ return;
+ }
+
+ case UniOpVV::kCvtF64ToF32Lo:
+ case UniOpVV::kCvtF64ToF32Hi: {
+ dst = dst.q();
+ Vec src = as_vec(*this, src_, dst);
+
+ if (op_info.dst_part == VecPart::kLo) {
+ dst = dst.d();
+ }
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtTruncF64ToI32Lo:
+ case UniOpVV::kCvtRoundF64ToI32Lo:
+ case UniOpVV::kCvtTruncF64ToI32Hi:
+ case UniOpVV::kCvtRoundF64ToI32Hi: {
+ dst = dst.q();
+
+ Vec src = as_vec(*this, src_, dst);
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ cc->emit(inst_id, tmp.d2(), src.d2());
+
+ if (op_info.dst_part == VecPart::kLo) {
+ cc->sqxtn(dst.s2(), tmp.d2());
+ }
+ else {
+ cc->sqxtn2(dst.s4(), tmp.d2());
+ }
+
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+void UniCompiler::emit_2v(UniOpVV op, const OpArray& dst_, const Operand_& src_) { emit_2v_t(*this, op, dst_, src_); }
+void UniCompiler::emit_2v(UniOpVV op, const OpArray& dst_, const OpArray& src_) { emit_2v_t(*this, op, dst_, src_); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 2VI
+// ==================================================
+
+void UniCompiler::emit_2vi(UniOpVVI op, const Operand_& dst_, const Operand_& src_, uint32_t imm) {
+ ASMJIT_ASSERT(dst_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+
+ UniOpVInfo op_info = opcode_info_2vi[size_t(op)];
+ InstId inst_id = op_info.inst_id;
+
+ switch (op) {
+ case UniOpVVI::kSllbU128:
+ case UniOpVVI::kSrlbU128: {
+ ASMJIT_ASSERT(imm < 16);
+
+ Vec src = as_vec(*this, src_, dst);
+
+ // If the shift is used to extract a high 64-bit element and zero the rest of the register.
+ if (op == UniOpVVI::kSrlbU128 && imm == 8) {
+ cc->dup(dst.d(), src.d(1));
+ return;
+ }
+
+ // If the shift is used to extract the last 32-bit element and zero the rest of the register.
+ if (op == UniOpVVI::kSrlbU128 && imm == 12) {
+ cc->dup(dst.s(), src.s(3));
+ return;
+ }
+
+ Vec zero = simd_vec_zero(dst);
+ vec_set_type(dst, ElementSize::k8);
+ vec_set_type(src, ElementSize::k8);
+ vec_set_type(zero, ElementSize::k8);
+
+ if (op == UniOpVVI::kSllbU128)
+ cc->ext(dst, zero, src, 16u - imm);
+ else
+ cc->ext(dst, src, zero, imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU16x4:
+ case UniOpVVI::kSwizzleLoU16x4:
+ case UniOpVVI::kSwizzleHiU16x4: {
+ Vec src = as_vec(*this, src_, dst);
+
+ uint8_t pred_data[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
+
+ uint32_t d = (imm >> 23) & (0x3 << 1);
+ uint32_t c = (imm >> 15) & (0x3 << 1);
+ uint32_t b = (imm >> 7) & (0x3 << 1);
+ uint32_t a = (imm << 1) & (0x3 << 1);
+
+ if (op != UniOpVVI::kSwizzleHiU16x4) {
+ pred_data[ 0] = uint8_t(a);
+ pred_data[ 1] = uint8_t(a + 1u);
+ pred_data[ 2] = uint8_t(b);
+ pred_data[ 3] = uint8_t(b + 1u);
+ pred_data[ 4] = uint8_t(c);
+ pred_data[ 5] = uint8_t(c + 1u);
+ pred_data[ 6] = uint8_t(d);
+ pred_data[ 7] = uint8_t(d + 1u);
+ }
+
+ if (op != UniOpVVI::kSwizzleLoU16x4) {
+ pred_data[ 8] = uint8_t(a + 8u);
+ pred_data[ 9] = uint8_t(a + 9u);
+ pred_data[10] = uint8_t(b + 8u);
+ pred_data[11] = uint8_t(b + 9u);
+ pred_data[12] = uint8_t(c + 8u);
+ pred_data[13] = uint8_t(c + 9u);
+ pred_data[14] = uint8_t(d + 8u);
+ pred_data[15] = uint8_t(d + 9u);
+ }
+
+ Vec pred = simd_const_16b(pred_data);
+ cc->tbl(dst.b16(), src.b16(), pred.b16());
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU32x4:
+ case UniOpVVI::kSwizzleF32x4: {
+ Vec src = as_vec(*this, src_, dst);
+ emit_swizzle32_impl(*this, dst, src, imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU64x2:
+ case UniOpVVI::kSwizzleF64x2: {
+ Vec src = as_vec(*this, src_, dst);
+
+ // Use `dup` to broadcast one 64-bit elements.
+ if (Swizzle2{imm} == swizzle(0, 0) ||
+ Swizzle2{imm} == swizzle(1, 1)) {
+ uint32_t idx = imm & 0x1;
+ cc->dup(dst.d2(), src.d(idx));
+ return;
+ }
+
+ // Use `ext` to swap two 64-bit elements.
+ if (Swizzle2{imm} == swizzle(0, 1)) {
+ cc->ext(dst.b16(), src.b16(), src.b16(), 8);
+ return;
+ }
+
+ // NOP...
+ if (Swizzle2{imm} == swizzle(1, 0)) {
+ cc->mov(dst.b16(), src.b16());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVVI::kSwizzleF64x4:
+ case UniOpVVI::kSwizzleU64x4:
+ case UniOpVVI::kExtractV128_I32:
+ case UniOpVVI::kExtractV128_I64:
+ case UniOpVVI::kExtractV128_F32:
+ case UniOpVVI::kExtractV128_F64:
+ case UniOpVVI::kExtractV256_I32:
+ case UniOpVVI::kExtractV256_I64:
+ case UniOpVVI::kExtractV256_F32:
+ case UniOpVVI::kExtractV256_F64:
+ // Unsupported as NEON has only 128-bit vectors.
+ ASMJIT_NOT_REACHED();
+
+ default: {
+ Vec src = as_vec(*this, src_, dst);
+
+ if (op_info.dst_part == VecPart::kLo) dst = dst.d();
+ if (op_info.src_part == VecPart::kLo) src = src.d();
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src, op_info.src_element);
+
+ cc->emit(inst_id, dst, src, imm);
+ return;
+ }
+ }
+}
+
+void UniCompiler::emit_2vi(UniOpVVI op, const OpArray& dst_, const Operand_& src_, uint32_t imm) { emit_2vi_t(*this, op, dst_, src_, imm); }
+void UniCompiler::emit_2vi(UniOpVVI op, const OpArray& dst_, const OpArray& src_, uint32_t imm) { emit_2vi_t(*this, op, dst_, src_, imm); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 2VS
+// ==================================================
+
+void UniCompiler::emit_2vs(UniOpVR op, const Operand_& dst_, const Operand_& src_, uint32_t idx) {
+ UniOpVInfo op_info = opcode_info_2vs[size_t(op)];
+
+ switch (op) {
+ case UniOpVR::kMov: {
+ ASMJIT_ASSERT(dst_.is_reg());
+ ASMJIT_ASSERT(src_.is_reg());
+
+ if (dst_.is_gp() && src_.is_vec()) {
+ if (dst_.as<Reg>().size() == 4)
+ cc->mov(dst_.as<Gp>(), src_.as<Vec>().s(0));
+ else
+ cc->mov(dst_.as<Gp>(), src_.as<Vec>().d(0));
+ return;
+ }
+
+ if (dst_.is_vec() && src_.is_gp()) {
+ if (src_.as<Reg>().size() == 4)
+ cc->fmov(dst_.as<Vec>().s(), src_.as<Gp>());
+ else
+ cc->fmov(dst_.as<Vec>().d(), src_.as<Gp>());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVR::kMovU32:
+ case UniOpVR::kMovU64: {
+ ASMJIT_ASSERT(dst_.is_reg());
+ ASMJIT_ASSERT(src_.is_reg());
+
+ if (dst_.is_gp() && src_.is_vec()) {
+ if (op == UniOpVR::kMovU32)
+ cc->mov(dst_.as<Gp>().r32(), src_.as<Vec>().s(0));
+ else
+ cc->mov(dst_.as<Gp>().r64(), src_.as<Vec>().d(0));
+ return;
+ }
+
+ if (dst_.is_vec() && src_.is_gp()) {
+ if (op == UniOpVR::kMovU32)
+ cc->fmov(dst_.as<Vec>().s(), src_.as<Gp>().r32());
+ else
+ cc->fmov(dst_.as<Vec>().d(), src_.as<Gp>().r64());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVR::kInsertU8:
+ case UniOpVR::kInsertU16:
+ case UniOpVR::kInsertU32:
+ case UniOpVR::kInsertU64: {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src_.is_gp());
+
+ Vec dst(dst_.as<Vec>());
+ Gp src(src_.as<Gp>());
+
+ vec_set_type_and_index(dst, op_info.dst_element, idx);
+ src.set_signature(op == UniOpVR::kInsertU64 ? RegTraits<RegType::kGp64>::kSignature : RegTraits<RegType::kGp32>::kSignature);
+
+ cc->mov(dst, src);
+ return;
+ }
+
+ case UniOpVR::kExtractU8:
+ case UniOpVR::kExtractU16:
+ case UniOpVR::kExtractU32:
+ case UniOpVR::kExtractU64: {
+ ASMJIT_ASSERT(dst_.is_gp());
+ ASMJIT_ASSERT(src_.is_vec());
+
+ Gp dst(dst_.as<Gp>());
+ Vec src(src_.as<Vec>());
+
+ dst.set_signature(op == UniOpVR::kExtractU64 ? RegTraits<RegType::kGp64>::kSignature : RegTraits<RegType::kGp32>::kSignature);
+ vec_set_type_and_index(src, op_info.dst_element, idx);
+
+ cc->mov(dst, src);
+ return;
+ }
+
+ case UniOpVR::kCvtIntToF32:
+ case UniOpVR::kCvtIntToF64: {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src_.is_gp());
+
+ Vec dst(dst_.as<Vec>());
+ vec_set_vec_type(dst, op_info.dst_element);
+ cc->scvtf(dst, src_.as<Gp>());
+ return;
+ }
+
+ case UniOpVR::kCvtTruncF32ToInt:
+ case UniOpVR::kCvtRoundF32ToInt:
+ case UniOpVR::kCvtTruncF64ToInt:
+ case UniOpVR::kCvtRoundF64ToInt: {
+ ASMJIT_ASSERT(dst_.is_gp());
+ ASMJIT_ASSERT(src_.is_vec());
+
+ Vec src(src_.as<Vec>());
+ vec_set_vec_type(src, op_info.src_element);
+ cc->emit(op_info.inst_id, dst_, src);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Emit 2VM
+// ==================================================
+
+void UniCompiler::emit_vm(UniOpVM op, const Vec& dst_, const Mem& src_, Alignment alignment, uint32_t idx) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src_.is_mem());
+
+ Support::maybe_unused(alignment);
+
+ Vec dst(dst_);
+ Mem src(src_);
+ UniOpVMInfo op_info = opcode_info_2vm[size_t(op)];
+
+ switch (op) {
+ case UniOpVM::kLoad8:
+ case UniOpVM::kLoad16_U16:
+ case UniOpVM::kLoad32_U32:
+ case UniOpVM::kLoad32_F32:
+ case UniOpVM::kLoad64_U32:
+ case UniOpVM::kLoad64_U64:
+ case UniOpVM::kLoad64_F32:
+ case UniOpVM::kLoad64_F64:
+ case UniOpVM::kLoad128_U32:
+ case UniOpVM::kLoad128_U64:
+ case UniOpVM::kLoad128_F32:
+ case UniOpVM::kLoad128_F64: {
+ vec_load_mem(*this, dst, src, op_info.mem_size);
+ return;
+ }
+
+ case UniOpVM::kLoadN_U32:
+ case UniOpVM::kLoadN_U64:
+ case UniOpVM::kLoadN_F32:
+ case UniOpVM::kLoadN_F64: {
+ vec_load_mem(*this, dst.q(), src, 16);
+ return;
+ }
+
+ case UniOpVM::kLoadCvtN_U8ToU64:
+ case UniOpVM::kLoadCvt16_U8ToU64: {
+ Gp tmp = new_gp32("@tmp");
+ cc->ldrh(tmp, src);
+ cc->mov(dst.b(), tmp);
+ cc->lsr(tmp, tmp, 8);
+ cc->mov(dst.b(8), tmp);
+ return;
+ }
+
+ case UniOpVM::kLoadCvt32_I8ToI16:
+ case UniOpVM::kLoadCvt32_U8ToU16:
+ case UniOpVM::kLoadCvt32_I8ToI32:
+ case UniOpVM::kLoadCvt32_U8ToU32:
+ case UniOpVM::kLoadCvt32_I16ToI32:
+ case UniOpVM::kLoadCvt32_U16ToU32:
+ case UniOpVM::kLoadCvt32_I32ToI64:
+ case UniOpVM::kLoadCvt32_U32ToU64:
+ case UniOpVM::kLoadCvt64_I8ToI16:
+ case UniOpVM::kLoadCvt64_U8ToU16:
+ case UniOpVM::kLoadCvt64_I16ToI32:
+ case UniOpVM::kLoadCvt64_U16ToU32:
+ case UniOpVM::kLoadCvt64_I32ToI64:
+ case UniOpVM::kLoadCvt64_U32ToU64: {
+ vec_load_mem(*this, dst, src, op_info.mem_size);
+ emit_2v(UniOpVV(op_info.cvt_op), dst, dst);
+ return;
+ }
+
+ case UniOpVM::kLoadCvtN_I8ToI16:
+ case UniOpVM::kLoadCvtN_I8ToI32:
+ case UniOpVM::kLoadCvtN_U8ToU16:
+ case UniOpVM::kLoadCvtN_U8ToU32:
+ case UniOpVM::kLoadCvtN_I16ToI32:
+ case UniOpVM::kLoadCvtN_U16ToU32:
+ case UniOpVM::kLoadCvtN_I32ToI64:
+ case UniOpVM::kLoadCvtN_U32ToU64: {
+ vec_load_mem(*this, dst, src, dst.size() / 2u);
+ emit_2v(UniOpVV(op_info.cvt_op), dst, dst);
+ return;
+ }
+
+ case UniOpVM::kLoadInsertU8:
+ case UniOpVM::kLoadInsertU16:
+ case UniOpVM::kLoadInsertU32:
+ case UniOpVM::kLoadInsertF32:
+ case UniOpVM::kLoadInsertU64:
+ case UniOpVM::kLoadInsertF32x2:
+ case UniOpVM::kLoadInsertF64: {
+ if (!src.has_index() && !src.has_offset()) {
+ vec_set_type_and_index(dst, op_info.element, idx);
+ cc->ld1(dst, src);
+ }
+ else {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ v_load_iany(tmp, src, op_info.mem_size, Alignment(1));
+
+ vec_set_type_and_index(dst, op_info.element, idx);
+ vec_set_type_and_index(tmp, op_info.element, 0);
+ cc->mov(dst, tmp);
+ }
+ return;
+ }
+
+ case UniOpVM::kLoad256_U32:
+ case UniOpVM::kLoad256_U64:
+ case UniOpVM::kLoad256_F32:
+ case UniOpVM::kLoad256_F64:
+ case UniOpVM::kLoad512_U32:
+ case UniOpVM::kLoad512_U64:
+ case UniOpVM::kLoad512_F32:
+ case UniOpVM::kLoad512_F64:
+ case UniOpVM::kLoadCvt32_U8ToU64:
+ case UniOpVM::kLoadCvt64_U8ToU64:
+ case UniOpVM::kLoadCvt64_I8ToI32:
+ case UniOpVM::kLoadCvt64_U8ToU32:
+ case UniOpVM::kLoadCvt128_I8ToI32:
+ case UniOpVM::kLoadCvt128_U8ToU32:
+ case UniOpVM::kLoadCvt128_I8ToI16:
+ case UniOpVM::kLoadCvt128_U8ToU16:
+ case UniOpVM::kLoadCvt128_I16ToI32:
+ case UniOpVM::kLoadCvt128_U16ToU32:
+ case UniOpVM::kLoadCvt128_I32ToI64:
+ case UniOpVM::kLoadCvt128_U32ToU64:
+ case UniOpVM::kLoadCvt256_I8ToI16:
+ case UniOpVM::kLoadCvt256_U8ToU16:
+ case UniOpVM::kLoadCvt256_I16ToI32:
+ case UniOpVM::kLoadCvt256_U16ToU32:
+ case UniOpVM::kLoadCvt256_I32ToI64:
+ case UniOpVM::kLoadCvt256_U32ToU64:
+ // Unsupported as NEON has only 128-bit vectors.
+ ASMJIT_NOT_REACHED();
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+void UniCompiler::emit_vm(UniOpVM op, const OpArray& dst_, const Mem& src_, Alignment alignment, uint32_t idx) {
+ Support::maybe_unused(alignment);
+
+ size_t i = 0;
+ size_t n = dst_.size();
+
+ if (!n)
+ return;
+
+ Mem src(src_);
+ UniOpVMInfo op_info = opcode_info_2vm[size_t(op)];
+
+ uint32_t overridden_mem_size = op_info.mem_size;
+ uint32_t mem_size = overridden_mem_size ? overridden_mem_size : dst_[0].as<Vec>().size();
+
+ if (op <= UniOpVM::kLoadN_F64 && !src.has_index() && !src.has_offset() && mem_size >= 4) {
+ while (i + 2 <= n) {
+ const Vec& dst0 = dst_[i + 0].as<Vec>();
+ const Vec& dst1 = dst_[i + 1].as<Vec>();
+
+ if (mem_size == 4)
+ cc->ldp(dst0.s(), dst1.s(), src);
+ else if (mem_size == 8)
+ cc->ldp(dst0.d(), dst1.d(), src);
+ else
+ cc->ldp(dst0.q(), dst1.q(), src);
+
+ src.add_offset_lo32(int32_t(mem_size * 2));
+
+ i += 2;
+ }
+ }
+
+ while (i < n) {
+ ASMJIT_ASSERT(dst_[i].is_vec());
+
+ const Vec& dst = dst_[i].as<Vec>();
+ mem_size = dst.size();
+
+ emit_vm(op, dst, src, Alignment(1), idx);
+
+ src.add_offset_lo32(int32_t(mem_size));
+ i++;
+ }
+}
+
+void UniCompiler::emit_mv(UniOpMV op, const Mem& dst_, const Vec& src_, Alignment alignment, uint32_t idx) {
+ ASMJIT_ASSERT(dst_.is_mem());
+ ASMJIT_ASSERT(src_.is_vec());
+
+ Support::maybe_unused(alignment);
+
+ Mem dst(dst_);
+ Vec src(src_);
+
+ switch (op) {
+ case UniOpMV::kStore8: {
+ cc->str(src.b(), dst);
+ return;
+ }
+
+ case UniOpMV::kStore16_U16: {
+ cc->str(src.h(), dst);
+ return;
+ }
+
+ case UniOpMV::kStore32_U32:
+ case UniOpMV::kStore32_F32: {
+ cc->str(src.s(), dst);
+ return;
+ }
+
+ case UniOpMV::kStore64_U32:
+ case UniOpMV::kStore64_U64:
+ case UniOpMV::kStore64_F32:
+ case UniOpMV::kStore64_F64: {
+ cc->str(src.d(), dst);
+ return;
+ }
+
+ case UniOpMV::kStore128_U32:
+ case UniOpMV::kStore128_U64:
+ case UniOpMV::kStore128_F32:
+ case UniOpMV::kStore128_F64: {
+ cc->str(src.q(), dst);
+ return;
+ }
+
+ case UniOpMV::kStoreN_U32:
+ case UniOpMV::kStoreN_U64:
+ case UniOpMV::kStoreN_F32:
+ case UniOpMV::kStoreN_F64: {
+ cc->str(src, dst);
+ return;
+ }
+
+ /*
+ case UniOpMV::kStoreCvtz64_U16ToU8:
+ case UniOpMV::kStoreCvtz64_U32ToU16:
+ case UniOpMV::kStoreCvtz64_U64ToU32:
+ case UniOpMV::kStoreCvts64_I16ToI8:
+ case UniOpMV::kStoreCvts64_I16ToU8:
+ case UniOpMV::kStoreCvts64_U16ToU8:
+ case UniOpMV::kStoreCvts64_I32ToI16:
+ case UniOpMV::kStoreCvts64_U32ToU16:
+ case UniOpMV::kStoreCvts64_I64ToI32:
+ case UniOpMV::kStoreCvts64_U64ToU32:
+ case UniOpMV::kStoreCvtzN_U16ToU8:
+ case UniOpMV::kStoreCvtzN_U32ToU16:
+ case UniOpMV::kStoreCvtzN_U64ToU32:
+ case UniOpMV::kStoreCvtsN_I16ToI8:
+ case UniOpMV::kStoreCvtsN_I16ToU8:
+ case UniOpMV::kStoreCvtsN_U16ToU8:
+ case UniOpMV::kStoreCvtsN_I32ToI16:
+ case UniOpMV::kStoreCvtsN_U32ToU16:
+ case UniOpMV::kStoreCvtsN_I64ToI32:
+ case UniOpMV::kStoreCvtsN_U64ToU32:
+ UNIMPLEMENTED();
+ return;
+ */
+
+ case UniOpMV::kStore256_U32:
+ case UniOpMV::kStore256_U64:
+ case UniOpMV::kStore256_F32:
+ case UniOpMV::kStore256_F64:
+ case UniOpMV::kStore512_U32:
+ case UniOpMV::kStore512_U64:
+ case UniOpMV::kStore512_F32:
+ case UniOpMV::kStore512_F64:
+ /*
+ case UniOpMV::kStoreCvtz128_U16ToU8:
+ case UniOpMV::kStoreCvtz128_U32ToU16:
+ case UniOpMV::kStoreCvtz128_U64ToU32:
+ case UniOpMV::kStoreCvts128_I16ToI8:
+ case UniOpMV::kStoreCvts128_I16ToU8:
+ case UniOpMV::kStoreCvts128_U16ToU8:
+ case UniOpMV::kStoreCvts128_I32ToI16:
+ case UniOpMV::kStoreCvts128_U32ToU16:
+ case UniOpMV::kStoreCvts128_I64ToI32:
+ case UniOpMV::kStoreCvts128_U64ToU32:
+ case UniOpMV::kStoreCvtz256_U16ToU8:
+ case UniOpMV::kStoreCvtz256_U32ToU16:
+ case UniOpMV::kStoreCvtz256_U64ToU32:
+ case UniOpMV::kStoreCvts256_I16ToI8:
+ case UniOpMV::kStoreCvts256_I16ToU8:
+ case UniOpMV::kStoreCvts256_U16ToU8:
+ case UniOpMV::kStoreCvts256_I32ToI16:
+ case UniOpMV::kStoreCvts256_U32ToU16:
+ case UniOpMV::kStoreCvts256_I64ToI32:
+ case UniOpMV::kStoreCvts256_U64ToU32:
+ */
+ // Unsupported as NEON has only 128-bit vectors.
+ ASMJIT_NOT_REACHED();
+
+ case UniOpMV::kStoreExtractU16: {
+ if (idx == 0) {
+ cc->str(src.h(), dst);
+ }
+ else {
+ cc->st1(src.h(idx), dst);
+ }
+ return;
+ }
+
+ case UniOpMV::kStoreExtractU32: {
+ if (idx == 0) {
+ cc->str(src.s(), dst);
+ }
+ else {
+ cc->st1(src.s(idx), dst);
+ }
+ return;
+ }
+
+ case UniOpMV::kStoreExtractU64: {
+ if (idx == 0) {
+ cc->str(src.d(), dst);
+ }
+ else {
+ cc->st1(src.d(idx), dst);
+ }
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+void UniCompiler::emit_mv(UniOpMV op, const Mem& dst_, const OpArray& src_, Alignment alignment, uint32_t idx) {
+ Support::maybe_unused(alignment);
+
+ size_t i = 0;
+ size_t n = src_.size();
+
+ if (!n)
+ return;
+
+ Mem dst(dst_);
+ UniOpVMInfo op_info = opcode_info_2mv[size_t(op)];
+
+ uint32_t overridden_mem_size = op_info.mem_size;
+ uint32_t mem_size = overridden_mem_size ? overridden_mem_size : src_[0].as<Vec>().size();
+
+ if (op <= UniOpMV::kStoreN_F64 && mem_size >= 4) {
+ bool good_offset = (uint32_t(dst.offset_lo32()) & (mem_size - 1)) == 0u;
+
+ if (good_offset) {
+ while (i + 2 <= n) {
+ const Vec& src0 = src_[i + 0].as<Vec>();
+ const Vec& src1 = src_[i + 1].as<Vec>();
+
+ if (mem_size == 4)
+ cc->stp(src0.s(), src1.s(), dst);
+ else if (mem_size == 8)
+ cc->stp(src0.d(), src1.d(), dst);
+ else
+ cc->stp(src0.q(), src1.q(), dst);
+
+ dst.add_offset_lo32(int32_t(mem_size * 2));
+
+ i += 2;
+ }
+ }
+ }
+
+ while (i < n) {
+ ASMJIT_ASSERT(src_[i].is_vec());
+
+ const Vec& src = src_[i].as<Vec>();
+ emit_mv(op, dst, src, Alignment(1), idx);
+
+ dst.add_offset_lo32(int32_t(mem_size));
+ i++;
+ }}
+
+// ujit::UniCompiler - Vector Instructions - Emit 3V
+// =================================================
+
+static void emit_3v_op(
+ UniCompiler& uc,
+ InstId inst_id,
+ Vec dst, Vec src1, Operand_ src2_,
+ FloatMode float_mode,
+ ElementSize dst_element, VecPart dst_part,
+ ElementSize src_element, VecPart src_part,
+ uint32_t reversed) {
+
+ Vec src2;
+
+ switch (float_mode) {
+ case FloatMode::kF32S: {
+ dst = dst.s();
+ src1 = src1.s();
+ src2 = as_vec(uc, src2_, dst, 4);
+ break;
+ }
+
+ case FloatMode::kF64S: {
+ dst = dst.d();
+ src1 = src1.d();
+ src2 = as_vec(uc, src2_, dst, 8);
+ break;
+ }
+
+ default: {
+ src2 = as_vec(uc, src2_, dst);
+
+ if (dst_part == VecPart::kLo) {
+ dst = dst.d();
+ }
+
+ if (src_part == VecPart::kLo) {
+ src1 = src1.d();
+ src2 = src2.d();
+ }
+
+ vec_set_type(dst, dst_element);
+ vec_set_type(src1, src_element);
+ vec_set_type(src2, src_element);
+ break;
+ }
+ }
+
+ BackendCompiler* cc = uc.cc;
+ if (reversed)
+ cc->emit(inst_id, dst, src2, src1);
+ else
+ cc->emit(inst_id, dst, src1, src2);
+}
+
+void UniCompiler::emit_3v(UniOpVVV op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src1_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Vec src1(src1_.as<Vec>().clone_as(dst));
+
+ UniOpVInfo op_info = opcode_info_3v[size_t(op)];
+ InstId inst_id = op_info.inst_id;
+
+ if (is_same_vec(src1, src2_)) {
+ switch (op_info.same_vec_op) {
+ case SameVecOp::kZero: {
+ cc->movi(dst.b16(), 0);
+ return;
+ }
+
+ case SameVecOp::kOnes: {
+ cc->movi(dst.b16(), 0xFF);
+ return;
+ }
+
+ case SameVecOp::kSrc: {
+ vec_mov(*this, dst, src1);
+ return;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ switch (op) {
+ // dst = a - (floor(a / b) * b).
+ case UniOpVVV::kModF32S:
+ case UniOpVVV::kModF64S:
+ case UniOpVVV::kModF32:
+ case UniOpVVV::kModF64: {
+ Vec src2 = as_vec(*this, src2_, dst, op_info.float_mode);
+ Vec tmp = new_similar_reg(dst, "@tmp1");
+
+ UniOpVVV sub_op = translate_op(op, UniOpVVV::kModF32S, UniOpVVV::kSubF32S);
+ UniOpVVV mul_op = translate_op(op, UniOpVVV::kModF32S, UniOpVVV::kMulF32S);
+ UniOpVVV div_op = translate_op(op, UniOpVVV::kModF32S, UniOpVVV::kDivF32S);
+ UniOpVV trunc_op = translate_op(op, UniOpVVV::kModF32S, UniOpVV::kTruncF32S);
+
+ emit_3v(div_op, tmp, src1, src2);
+ emit_2v(trunc_op, tmp, tmp);
+ emit_3v(mul_op, tmp, tmp, src2);
+ emit_3v(sub_op, dst, src1, tmp);
+
+ return;
+ }
+
+ case UniOpVVV::kMulU64: {
+ Vec src2 = as_vec(*this, src2_, dst);
+ Vec tmp1 = new_similar_reg(dst, "@tmp1");
+ Vec tmp2 = new_similar_reg(dst, "@tmp2");
+ Vec tmp3 = new_similar_reg(dst, "@tmp3");
+
+ cc->rev64(tmp1.s4(), src1.s4());
+ cc->xtn(tmp2.s2(), src1.d2());
+ cc->mul(tmp1.s4(), tmp1.s4(), src2.s4());
+ cc->xtn(tmp3.s2(), src2.d2());
+ cc->uaddlp(tmp1.d2(), tmp1.s4());
+ cc->shl(dst.d2(), tmp1.d2(), 32);
+ cc->umlal(dst.d2(), tmp2.s2(), tmp3.s2());
+
+ return;
+ }
+
+ case UniOpVVV::kMulhI16: {
+ Vec src2 = as_vec(*this, src2_, dst);
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ cc->smull(tmp.s4(), src1.h4(), src2.h4());
+ cc->smull2(dst.s4(), src1.h8(), src2.h8());
+ cc->uzp2(dst.h8(), tmp.h8(), dst.h8());
+ return;
+ }
+
+ case UniOpVVV::kMulhU16: {
+ Vec src2 = as_vec(*this, src2_, dst);
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ cc->umull(tmp.s4(), src1.h4(), src2.h4());
+ cc->umull2(dst.s4(), src1.h8(), src2.h8());
+ cc->uzp2(dst.h8(), tmp.h8(), dst.h8());
+ return;
+ }
+
+ case UniOpVVV::kMulU64_LoU32: {
+ Vec src2 = as_vec(*this, src2_, dst);
+ Vec tmp1 = new_similar_reg(dst, "@tmp1");
+ Vec tmp2 = new_similar_reg(dst, "@tmp2");
+ Vec tmp3 = dst;
+
+ if (dst.id() == src1.id() || dst.id() == src2.id())
+ tmp3 = new_similar_reg(dst, "@tmp3");
+
+ cc->xtn(tmp1.s2(), src1.d2());
+ cc->shl(tmp3.d2(), src2.d2(), 32);
+ cc->xtn(tmp2.s2(), src2.d2());
+ cc->mul(dst.s4(), tmp3.s4(), src1.s4());
+ cc->umlal(dst.d2(), tmp1.s2(), tmp2.s2());
+
+ return;
+ }
+
+ case UniOpVVV::kMHAddI16_I32: {
+ Vec src2 = as_vec(*this, src2_, dst);
+
+ Vec al = new_similar_reg(dst, "@al");
+ Vec ah = new_similar_reg(dst, "@ah");
+ Vec bl = new_similar_reg(dst, "@bl");
+ Vec bh = new_similar_reg(dst, "@bh");
+
+ cc->xtn(al.h4(), src1.s4());
+ cc->xtn(bl.h4(), src2.s4());
+
+ cc->shrn(ah.h4(), src1.s4(), 16);
+ cc->shrn(bh.h4(), src2.s4(), 16);
+
+ cc->smull(dst.s4(), al.h4(), bl.h4());
+ cc->smlal(dst.s4(), ah.h4(), bh.h4());
+
+ return;
+ }
+
+ case UniOpVVV::kMinI64:
+ case UniOpVVV::kMinU64:
+ case UniOpVVV::kMaxI64:
+ case UniOpVVV::kMaxU64: {
+ Vec src2 = as_vec(*this, src2_, dst);
+
+ // Min/Max is commutative, so let's make dst only overlap src1.
+ if (dst.id() == src2.id()) {
+ std::swap(src1, src2);
+ }
+
+ bool dst_overlaps_src = dst.id() == src1.id();
+
+ Vec tmp = dst;
+ if (dst_overlaps_src) {
+ tmp = new_similar_reg(dst, "@tmp");
+ }
+
+ // Let's emit a nicer sequence for u64 maximum.
+ if (op == UniOpVVV::kMaxU64) {
+ cc->uqsub(tmp.d2(), src1.d2(), src2.d2());
+ cc->add(dst.d2(), tmp.d2(), src2.d2());
+ return;
+ }
+
+ cc->emit(inst_id, tmp.d2(), src1.d2(), src2.d2());
+
+ if (op_info.imm)
+ v_blendv_u8(dst, src2, src1, tmp);
+ else
+ v_blendv_u8(dst, src1, src2, tmp);
+
+ return;
+ }
+
+ case UniOpVVV::kCmpNeF32S:
+ case UniOpVVV::kCmpNeF64S:
+ case UniOpVVV::kCmpNeF32:
+ case UniOpVVV::kCmpNeF64: {
+ emit_3v_op(*this, inst_id, dst, src1, src2_, op_info.float_mode, op_info.dst_element, op_info.dst_part, op_info.src_element, op_info.src_part, 0);
+ vec_neg(*this, dst, dst, op_info.float_mode);
+ return;
+ }
+
+ case UniOpVVV::kCmpOrdF32S:
+ case UniOpVVV::kCmpOrdF64S:
+ case UniOpVVV::kCmpOrdF32:
+ case UniOpVVV::kCmpOrdF64:
+ case UniOpVVV::kCmpUnordF32S:
+ case UniOpVVV::kCmpUnordF64S:
+ case UniOpVVV::kCmpUnordF32:
+ case UniOpVVV::kCmpUnordF64: {
+ if (is_same_vec(src1, src2_)) {
+ emit_3v_op(*this, Inst::kIdFcmeq_v, dst, src1, src1, op_info.float_mode, op_info.dst_element, op_info.dst_part, op_info.src_element, op_info.src_part, 0);
+ }
+ else {
+ // This takes advantage of the following:
+ //
+ // When FPCR.AH is 0, the behavior is as follows (ASSUMED):
+ //
+ // - Negative zero compares less than positive zero.
+ // - When FPCR.DN is 0, if either element is a NaN, the result is a quiet NaN.
+ // - When FPCR.DN is 1, if either element is a NaN, the result is Default NaN.
+ //
+ // When FPCR.AH is 1, the behavior is as follows (USED FOR X86 EMULATION - NOT ASSUMED):
+ //
+ // - If both elements are zeros, regardless of the sign of either zero, the result is the second element.
+ // - If either element is a NaN, regardless of the value of FPCR.DN, the result is the second element.
+ Vec src2 = as_vec(*this, src2_, dst, op_info.float_mode);
+ emit_3v_op(*this, Inst::kIdFmin_v, dst, src1, src2, op_info.float_mode, op_info.dst_element, op_info.dst_part, op_info.src_element, op_info.src_part, 0);
+ emit_3v_op(*this, Inst::kIdFcmeq_v, dst, dst, dst, op_info.float_mode, op_info.dst_element, op_info.dst_part, op_info.src_element, op_info.src_part, 0);
+ }
+
+ if (op_info.imm)
+ vec_neg(*this, dst, dst, op_info.float_mode);
+
+ return;
+ }
+
+ case UniOpVVV::kHAddF64: {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ Vec src2 = as_vec(*this, src2_, dst);
+
+ if (src1.id() == src2.id()) {
+ cc->ext(tmp.b16(), src1.b16(), src1.b16(), 8);
+ cc->fadd(dst.d2(), src1.d2(), tmp.d2());
+ }
+ else {
+ cc->zip1(tmp.d2(), src1.d2(), src2.d2());
+ cc->zip2(dst.d2(), src1.d2(), src2.d2());
+ cc->fadd(dst.d2(), dst.d2(), tmp.d2());
+ }
+ return;
+ }
+
+ case UniOpVVV::kCombineLoHiU64:
+ case UniOpVVV::kCombineLoHiF64: {
+ // Intrinsic - dst = {src1.u64[0], src2.64[1]} - combining low part of src1 and high part of src1.
+ Vec src2 = as_vec(*this, src2_, dst);
+
+ vec_set_type(dst, ElementSize::k8);
+ vec_set_type(src1, ElementSize::k8);
+ vec_set_type(src2, ElementSize::k8);
+
+ // `EXT dst, a, b, #n` -> `dst = b:a >> #n*8`
+ cc->ext(dst, src2, src1, 8);
+ return;
+ }
+
+ case UniOpVVV::kCombineHiLoU64:
+ case UniOpVVV::kCombineHiLoF64: {
+ // Intrinsic - dst = {src1.u64[1], src2.64[0]} - combining high part of src1 and low part of src2.
+ Vec src2 = as_vec(*this, src2_, dst);
+
+ if (is_same_vec(dst, src1)) {
+ if (is_same_vec(dst, src2))
+ return;
+ cc->mov(dst.d(0), src2.d(0));
+ }
+ else if (is_same_vec(dst, src2)) {
+ cc->mov(dst.d(1), src1.d(1));
+ }
+ else {
+ cc->mov(dst.b16(), src1.b16());
+ cc->mov(dst.d(0), src2.d(0));
+ }
+
+ return;
+ }
+
+ case UniOpVVV::kPacksI16_I8:
+ case UniOpVVV::kPacksI16_U8:
+ case UniOpVVV::kPacksI32_I16:
+ case UniOpVVV::kPacksI32_U16: {
+ static constexpr uint16_t pack_lo_inst[4] = { Inst::kIdSqxtn_v , Inst::kIdSqxtun_v , Inst::kIdSqxtn_v , Inst::kIdSqxtun_v };
+ static constexpr uint16_t pack_hi_inst[4] = { Inst::kIdSqxtn2_v, Inst::kIdSqxtun2_v, Inst::kIdSqxtn2_v, Inst::kIdSqxtun2_v };
+
+ size_t id = size_t(op) - size_t(UniOpVVV::kPacksI16_I8);
+
+ Vec src2 = as_vec(*this, src2_, dst);
+ vec_set_type(src1, op_info.src_element);
+ vec_set_type(src2, op_info.src_element);
+
+ if (src1.id() == src2.id()) {
+ Vec dst_d = dst.d();
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(dst_d, op_info.dst_element);
+
+ cc->emit(pack_lo_inst[id], dst_d, src1);
+ cc->mov(dst.d(1), dst.d(0));
+ }
+ else {
+ Vec tmp = dst;
+ if (dst.id() == src1.id() || dst.id() == src2.id()) {
+ tmp = new_similar_reg(dst, "@tmp");
+ }
+
+ a64::Vec tmp_d = tmp.d();
+
+ vec_set_type(tmp, op_info.dst_element);
+ vec_set_type(tmp_d, op_info.dst_element);
+
+ cc->emit(pack_lo_inst[id], tmp_d, src1);
+ cc->emit(pack_hi_inst[id], tmp, src2);
+
+ if (dst.id() != tmp.id()) {
+ cc->mov(dst.b16(), tmp.b16());
+ }
+ }
+ return;
+ }
+
+ default: {
+ emit_3v_op(*this, inst_id, dst, src1, src2_, op_info.float_mode, op_info.dst_element, op_info.dst_part, op_info.src_element, op_info.src_part, op_info.reverse);
+ return;
+ }
+ }
+}
+
+void UniCompiler::emit_3v(UniOpVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_) { emit_3v_t(*this, op, dst_, src1_, src2_); }
+void UniCompiler::emit_3v(UniOpVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_) { emit_3v_t(*this, op, dst_, src1_, src2_); }
+void UniCompiler::emit_3v(UniOpVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_) { emit_3v_t(*this, op, dst_, src1_, src2_); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 3VI
+// ==================================================
+
+void UniCompiler::emit_3vi(UniOpVVVI op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_, uint32_t imm) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src1_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Vec src1(src1_.as<Vec>().clone_as(dst));
+
+ // Not used at the moment - maybe the info is not needed in this case.
+ UniOpVInfo op_info = opcode_info_3vi[size_t(op)];
+ Support::maybe_unused(op_info);
+
+ switch (op) {
+ case UniOpVVVI::kAlignr_U128: {
+ ASMJIT_ASSERT(imm < 16);
+
+ if (imm == 0) {
+ vec_mov(*this, dst, src2_);
+ return;
+ }
+
+ Vec src2 = as_vec(*this, src2_, dst);
+ vec_set_type(dst, ElementSize::k8);
+ vec_set_type(src1, ElementSize::k8);
+ vec_set_type(src2, ElementSize::k8);
+ cc->ext(dst, src2, src1, imm);
+ return;
+ }
+
+ case UniOpVVVI::kInterleaveShuffleU32x4:
+ case UniOpVVVI::kInterleaveShuffleF32x4: {
+ ASMJIT_ASSERT((imm & 0xFCFCFCFC) == 0);
+
+ Vec src2 = as_vec(*this, src2_, dst);
+ emit_interleaved_shuffle32_impl(*this, dst, src1, src2, imm);
+ return;
+ }
+
+ case UniOpVVVI::kInterleaveShuffleU64x2:
+ case UniOpVVVI::kInterleaveShuffleF64x2: {
+ ASMJIT_ASSERT((imm & 0xFFFCFEFE) == 0);
+
+ Vec src2 = as_vec(*this, src2_, dst);
+
+ if (src1.id() == src2.id()) {
+ v_swizzle_u64x2(dst, src1, Swizzle2{imm});
+ return;
+ }
+
+ if (Swizzle2{imm} == swizzle(0, 0))
+ cc->zip1(dst.d2(), src1.d2(), src2.d2());
+ else if (Swizzle2{imm} == swizzle(1, 1))
+ cc->zip2(dst.d2(), src1.d2(), src2.d2());
+ else if (Swizzle2{imm} == swizzle(1, 0))
+ v_combine_hi_lo_u64(dst, src2, src1);
+ else
+ v_combine_lo_hi_u64(dst, src2, src1);
+
+ return;
+ }
+
+ case UniOpVVVI::kInsertV128_U32:
+ case UniOpVVVI::kInsertV128_F32:
+ case UniOpVVVI::kInsertV128_U64:
+ case UniOpVVVI::kInsertV128_F64:
+ case UniOpVVVI::kInsertV256_U32:
+ case UniOpVVVI::kInsertV256_F32:
+ case UniOpVVVI::kInsertV256_U64:
+ case UniOpVVVI::kInsertV256_F64:
+ // Unsupported as NEON has only 128-bit vectors.
+ ASMJIT_NOT_REACHED();
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+void UniCompiler::emit_3vi(UniOpVVVI op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, uint32_t imm) { emit_3vi_t(*this, op, dst_, src1_, src2_, imm); }
+void UniCompiler::emit_3vi(UniOpVVVI op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, uint32_t imm) { emit_3vi_t(*this, op, dst_, src1_, src2_, imm); }
+void UniCompiler::emit_3vi(UniOpVVVI op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, uint32_t imm) { emit_3vi_t(*this, op, dst_, src1_, src2_, imm); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 4V
+// =================================================
+
+void UniCompiler::emit_4v(UniOpVVVV op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_, const Operand_& src3_) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src1_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Vec src1(src1_.as<Vec>().clone_as(dst));
+
+ UniOpVInfo op_info = opcode_info_4v[size_t(op)];
+ InstId inst_id = op_info.inst_id;
+
+ switch (op) {
+ case UniOpVVVV::kBlendV_U8: {
+ Vec src2 = as_vec(*this, src2_, dst);
+ Vec src3 = as_vec(*this, src3_, dst);
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src1, op_info.src_element);
+ vec_set_type(src2, op_info.src_element);
+ vec_set_type(src3, op_info.src_element);
+
+ // We can pick between these depending on register arrangement:
+ // - BSL (bitwise select)
+ // - BIT (bitwise insert if true)
+ // - BIF (bitwise insert if false)
+
+ if (dst.id() == src1.id()) {
+ cc->bit(dst, src2, src3);
+ return;
+ }
+
+ if (dst.id() == src2.id()) {
+ cc->bif(dst, src1, src3);
+ return;
+ }
+
+ vec_mov(*this, dst, src3);
+ cc->bsl(dst, src2, src1);
+ return;
+ }
+
+ case UniOpVVVV::kMAddF32S:
+ case UniOpVVVV::kMAddF64S:
+ case UniOpVVVV::kMSubF32S:
+ case UniOpVVVV::kMSubF64S:
+ case UniOpVVVV::kNMAddF32S:
+ case UniOpVVVV::kNMAddF64S:
+ case UniOpVVVV::kNMSubF32S:
+ case UniOpVVVV::kNMSubF64S: {
+ Vec src2;
+ Vec src3;
+
+ if (op_info.float_mode == FloatMode::kF32S) {
+ dst = dst.s();
+ src1 = src1.s();
+ src2 = as_vec(*this, src2_, dst, 4);
+ src3 = as_vec(*this, src3_, dst, 4);
+ }
+ else {
+ dst = dst.d();
+ src1 = src1.d();
+ src2 = as_vec(*this, src2_, dst, 8);
+ src3 = as_vec(*this, src3_, dst, 8);
+ }
+
+ cc->emit(inst_id, dst, src1, src2, src3);
+ return;
+ }
+
+ case UniOpVVVV::kMAddU16:
+ case UniOpVVVV::kMAddU32:
+ case UniOpVVVV::kMAddF32:
+ case UniOpVVVV::kMAddF64:
+ case UniOpVVVV::kMSubF32:
+ case UniOpVVVV::kMSubF64:
+ case UniOpVVVV::kNMAddF32:
+ case UniOpVVVV::kNMAddF64:
+ case UniOpVVVV::kNMSubF32:
+ case UniOpVVVV::kNMSubF64: {
+ Vec src2 = as_vec(*this, src2_, dst);
+ Vec src3;
+
+ bool negate_acc = op_info.imm != 0;
+ bool dst_overlaps = dst.id() == src1.id() || dst.id() == src2.id();
+ bool destructible = is_same_vec(dst, src3_) || !src3_.is_reg();
+
+ if (!dst_overlaps && src3_.is_mem()) {
+ vec_load_mem(*this, dst, src3_.as<Mem>(), dst.size());
+ src3 = dst;
+ }
+ else {
+ src3 = as_vec(*this, src3_, dst);
+ }
+
+ vec_set_type(dst, op_info.dst_element);
+ vec_set_type(src1, op_info.src_element);
+ vec_set_type(src2, op_info.src_element);
+ vec_set_type(src3, op_info.src_element);
+
+ if (destructible) {
+ if (negate_acc)
+ cc->fneg(src3, src3);
+
+ cc->emit(inst_id, src3, src1, src2);
+
+ if (dst.id() != src3.id())
+ cc->mov(dst, src3);
+ return;
+ }
+
+ Vec tmp = dst;
+
+ if (dst_overlaps) {
+ tmp = new_similar_reg(dst, "@tmp");
+ vec_set_type(tmp, op_info.dst_element);
+ }
+
+ if (negate_acc)
+ cc->fneg(tmp, src3);
+ else
+ cc->mov(tmp, src3);
+
+ cc->emit(inst_id, tmp, src1, src2);
+
+ if (dst.id() != tmp.id())
+ cc->mov(dst, tmp);
+ return;
+ }
+
+ default: {
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const Operand_& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, const Operand& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, const Operand& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, const Operand& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif
diff --git a/3rdparty/asmjit/asmjit/ujit/unicompiler_utils_p.h b/3rdparty/asmjit/asmjit/ujit/unicompiler_utils_p.h
new file mode 100644
index 00000000000..01fe3cbb1ff
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/unicompiler_utils_p.h
@@ -0,0 +1,32 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_UNICOMPILER_UTILS_P_H_INCLUDED
+#define ASMJIT_UJIT_UNICOMPILER_UTILS_P_H_INCLUDED
+
+#include <asmjit/ujit/ujitbase.h>
+
+#if !defined(ASMJIT_NO_UJIT)
+
+#include <asmjit/ujit/uniop.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+//! \addtogroup asmjit_ujit
+//! \{
+
+template<typename UniOpDst, typename UniOpSrc>
+static ASMJIT_INLINE UniOpDst translate_op(UniOpSrc op, UniOpSrc begin, UniOpDst target) noexcept {
+ ASMJIT_ASSERT(begin <= op);
+ uint32_t offset = uint32_t(op) - uint32_t(begin);
+ return UniOpDst(uint32_t(target) + offset);
+}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
+#endif // ASMJIT_UJIT_UNICOMPILER_UTILS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit/unicompiler_x86.cpp b/3rdparty/asmjit/asmjit/ujit/unicompiler_x86.cpp
new file mode 100644
index 00000000000..18556062a7e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/unicompiler_x86.cpp
@@ -0,0 +1,7591 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/ujit/ujitbase.h>
+
+#if defined(ASMJIT_UJIT_X86)
+
+#include <asmjit/ujit/unicompiler.h>
+#include <asmjit/ujit/unicompiler_utils_p.h>
+#include <asmjit/ujit/unicondition.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+using GPExt = UniCompiler::GPExt;
+using SSEExt = UniCompiler::SSEExt;
+using AVXExt = UniCompiler::AVXExt;
+namespace Inst { using namespace x86::Inst; }
+
+// ujit::UniCompiler - Constants
+// =============================
+
+static constexpr OperandSignature signature_of_xmm_ymm_zmm[] = {
+ OperandSignature{RegTraits<RegType::kVec128>::kSignature},
+ OperandSignature{RegTraits<RegType::kVec256>::kSignature},
+ OperandSignature{RegTraits<RegType::kVec512>::kSignature}
+};
+
+static ASMJIT_INLINE RegType vec_reg_type_from_width(VecWidth vw) noexcept {
+ return RegType(uint32_t(RegType::kVec128) + uint32_t(vw));
+}
+
+// ujit::UniCompiler - Construction & Destruction
+// ==============================================
+
+UniCompiler::UniCompiler(BackendCompiler* cc, const CpuFeatures& features, CpuHints cpu_hints, VecConstTableRef ct_ref) noexcept
+ : cc(cc),
+ _ct_ref(ct_ref),
+ _features(features),
+ _cpu_hints(cpu_hints),
+ _vec_reg_count(16),
+ _common_table_offset(128) {
+
+ _scalar_op_behavior = ScalarOpBehavior::kPreservingVec128;
+ _fmin_fmax_op_behavior = FMinFMaxOpBehavior::kTernaryLogic;
+ _fmadd_op_behavior = FMAddOpBehavior::kNoFMA; // Will be changed by _init_extensions() if supported.
+ _float_to_int_outside_range_behavior = FloatToIntOutsideRangeBehavior::kSmallestValue;
+
+ _init_extensions(features);
+}
+
+UniCompiler::~UniCompiler() noexcept {}
+
+// ujit::UniCompiler - CPU Architecture, Features and Optimization Options
+// =======================================================================
+
+void UniCompiler::_init_extensions(const CpuFeatures& features) noexcept {
+ uint32_t gp_ext_mask = 0;
+ uint32_t sse_ext_mask = 0;
+ uint64_t avx_ext_mask = 0;
+
+ if (features.x86().has_adx()) gp_ext_mask |= 1u << uint32_t(GPExt::kADX);
+ if (features.x86().has_bmi()) gp_ext_mask |= 1u << uint32_t(GPExt::kBMI);
+ if (features.x86().has_bmi2()) gp_ext_mask |= 1u << uint32_t(GPExt::kBMI2);
+ if (features.x86().has_lzcnt()) gp_ext_mask |= 1u << uint32_t(GPExt::kLZCNT);
+ if (features.x86().has_movbe()) gp_ext_mask |= 1u << uint32_t(GPExt::kMOVBE);
+ if (features.x86().has_popcnt()) gp_ext_mask |= 1u << uint32_t(GPExt::kPOPCNT);
+
+ sse_ext_mask |= 1u << uint32_t(SSEExt::kSSE2);
+ if (features.x86().has_sse3()) sse_ext_mask |= 1u << uint32_t(SSEExt::kSSE3);
+ if (features.x86().has_ssse3()) sse_ext_mask |= 1u << uint32_t(SSEExt::kSSSE3);
+ if (features.x86().has_sse4_1()) sse_ext_mask |= 1u << uint32_t(SSEExt::kSSE4_1);
+ if (features.x86().has_sse4_2()) sse_ext_mask |= 1u << uint32_t(SSEExt::kSSE4_2);
+ if (features.x86().has_pclmulqdq()) sse_ext_mask |= 1u << uint32_t(SSEExt::kPCLMULQDQ);
+
+ if (features.x86().has_avx()) {
+ avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX);
+ if (features.x86().has_avx2() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX2);
+ if (features.x86().has_f16c() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kF16C);
+ if (features.x86().has_fma() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kFMA);
+ if (features.x86().has_gfni() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kGFNI);
+ if (features.x86().has_vaes() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kVAES);
+ if (features.x86().has_vpclmulqdq() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kVPCLMULQDQ);
+ if (features.x86().has_avx_ifma() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX_IFMA);
+ if (features.x86().has_avx_ne_convert() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX_NE_CONVERT);
+ if (features.x86().has_avx_vnni() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX_VNNI);
+ if (features.x86().has_avx_vnni_int8() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX_VNNI_INT8);
+ if (features.x86().has_avx_vnni_int16() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX_VNNI_INT16);
+ }
+
+ if (features.x86().has_avx2() && features.x86().has_avx512_f() &&
+ features.x86().has_avx512_cd() && features.x86().has_avx512_bw() &&
+ features.x86().has_avx512_dq() && features.x86().has_avx512_vl()) {
+ _vec_reg_count = 32;
+ avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512);
+ if (features.x86().has_avx512_bf16() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_BF16);
+ if (features.x86().has_avx512_bitalg() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_BITALG);
+ if (features.x86().has_avx512_fp16() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_FP16);
+ if (features.x86().has_avx512_ifma() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_IFMA);
+ if (features.x86().has_avx512_vbmi() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_VBMI);
+ if (features.x86().has_avx512_vbmi2() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_VBMI2);
+ if (features.x86().has_avx512_vnni() ) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_VNNI);
+ if (features.x86().has_avx512_vpopcntdq()) avx_ext_mask |= uint64_t(1) << uint32_t(AVXExt::kAVX512_VPOPCNTDQ);
+ }
+
+ _gp_ext_mask = gp_ext_mask;
+ _sse_ext_mask = sse_ext_mask;
+ _avx_ext_mask = avx_ext_mask;
+
+ if (has_fma()) {
+ _fmadd_op_behavior = FMAddOpBehavior::kFMAStoreToAny;
+ }
+}
+
+VecWidth UniCompiler::max_vec_width_from_cpu_features() noexcept {
+ // Use 512-bit SIMD width if AVX512 is available and the target is 64-bit. We never use 512-bit SIMD in 32-bit mode
+ // as it doesn't have enough registers to hold 512-bit constants and we don't store 512-bit constants in memory
+ // (they must be broadcasted to full width).
+ if (has_avx512() && is_64bit())
+ return VecWidth::k512;
+
+ // Use 256-bit SIMD width if AVX2 is available.
+ if (has_avx2())
+ return VecWidth::k256;
+
+ return VecWidth::k128;
+}
+
+void UniCompiler::init_vec_width(VecWidth vw) noexcept {
+ _vec_width = vw;
+ _vec_reg_type = vec_reg_type_from_width(vw);
+ _vec_type_id = RegUtils::type_id_of(_vec_reg_type);
+ _vec_multiplier = uint8_t(1u << (uint32_t(_vec_reg_type) - uint32_t(RegType::kVec128)));
+}
+
+bool UniCompiler::has_masked_access_of(uint32_t data_size) const noexcept {
+ switch (data_size) {
+ case 1: return has_cpu_hint(CpuHints::kVecMaskedOps8);
+ case 2: return has_cpu_hint(CpuHints::kVecMaskedOps16);
+ case 4: return has_cpu_hint(CpuHints::kVecMaskedOps32);
+ case 8: return has_cpu_hint(CpuHints::kVecMaskedOps64);
+
+ default:
+ return false;
+ }
+}
+
+// ujit::UniCompiler - Embed
+// =========================
+
+void UniCompiler::embed_jump_table(Span<const Label> jump_table, const Label& jump_table_base, uint32_t entry_size) {
+ static const uint8_t zeros[8] {};
+
+ for (const Label& label : jump_table) {
+ if (label.is_valid()) {
+ cc->embed_label_delta(label, jump_table_base, entry_size);
+ }
+ else {
+ cc->embed(zeros, entry_size);
+ }
+ }
+}
+
+// ujit::UniCompiler - Function
+// ============================
+
+void UniCompiler::hook_func() noexcept {
+ FuncNode* func = cc->func();
+ _func_init_hook = func;
+
+ if (func && has_avx()) {
+ func->frame().set_avx_enabled();
+ func->frame().set_avx_auto_cleanup();
+
+ if (has_avx512()) {
+ func->frame().set_avx512_enabled();
+ }
+ }
+}
+
+void UniCompiler::unhook_func() noexcept {
+ _func_init_hook = nullptr;
+}
+
+// ujit::UniCompiler - Constants
+// =============================
+
+void UniCompiler::_init_vec_const_table_ptr() {
+ const void* ct_addr = ct_ptr<void>();
+
+ if (!_common_table_ptr.is_valid()) {
+ ScopedInjector injector(cc, &_func_init_hook);
+ _common_table_ptr = new_gpz("common_table_ptr");
+ cc->mov(_common_table_ptr, (int64_t)ct_addr + _common_table_offset);
+ }
+}
+
+x86::KReg UniCompiler::k_const(uint64_t value) {
+ uint32_t slot;
+ for (slot = 0; slot < kMaxKRegConstCount; slot++)
+ if (_k_reg[slot].is_valid() && _k_imm[slot] == value)
+ return _k_reg[slot];
+
+ BaseNode* prev_node = nullptr;
+ Gp tmp;
+ x86::KReg kReg;
+
+ if (slot < kMaxKRegConstCount) {
+ prev_node = cc->set_cursor(_func_init_hook);
+ }
+
+ if (value & 0xFFFFFFFF00000000u) {
+ tmp = new_gp64("kTmp");
+ kReg = cc->new_kq("k0x%016llX", (unsigned long long)value);
+ cc->mov(tmp, value);
+ cc->kmovq(kReg, tmp);
+ }
+ else {
+ tmp = new_gp32("kTmp");
+ kReg = cc->new_kd("k0x%08llX", (unsigned long long)value);
+ cc->mov(tmp, value);
+ cc->kmovd(kReg, tmp);
+ }
+
+ if (slot < kMaxKRegConstCount) {
+ _k_reg[slot] = kReg;
+ _func_init_hook = cc->set_cursor(prev_node);
+ }
+
+ return kReg;
+}
+
+Operand UniCompiler::simd_const(const void* c, Bcst bcst_width, VecWidth const_width) {
+ size_t const_count = _vec_consts.size();
+
+ for (size_t i = 0; i < const_count; i++) {
+ if (_vec_consts[i].ptr == c) {
+ return Vec(signature_of_xmm_ymm_zmm[size_t(const_width)], _vec_consts[i].virt_reg_id);
+ }
+ }
+
+ // We don't use memory constants when compiling for AVX-512, because we don't store 64-byte constants and AVX-512
+ // has enough registers to hold all the constants that we need. However, in SSE/AVX2 case, we don't want so many
+ // constants in registers as that could limit registers that we need during fetching and composition.
+ if (!has_avx512()) {
+ bool use_vreg = (c == &ct().p_0000000000000000); // Required if the CPU doesn't have SSE4.1.
+ if (!use_vreg) {
+ return simd_mem_const(c, bcst_width, const_width);
+ }
+ }
+
+ return Vec(signature_of_xmm_ymm_zmm[size_t(const_width)], _new_vec_const(c, bcst_width == Bcst::kNA_Unique).id());
+}
+
+Operand UniCompiler::simd_const(const void* c, Bcst bcst_width, const Vec& similar_to) {
+ VecWidth const_width = VecWidth(uint32_t(similar_to.reg_type()) - uint32_t(RegType::kVec128));
+ return simd_const(c, bcst_width, const_width);
+}
+
+Operand UniCompiler::simd_const(const void* c, Bcst bcst_width, const VecArray& similar_to) {
+ ASMJIT_ASSERT(!similar_to.is_empty());
+
+ VecWidth const_width = VecWidth(uint32_t(similar_to[0].reg_type()) - uint32_t(RegType::kVec128));
+ return simd_const(c, bcst_width, const_width);
+}
+
+Vec UniCompiler::simd_vec_const(const void* c, Bcst bcst_width, VecWidth const_width) {
+ size_t const_count = _vec_consts.size();
+
+ for (size_t i = 0; i < const_count; i++)
+ if (_vec_consts[i].ptr == c)
+ return Vec(signature_of_xmm_ymm_zmm[size_t(const_width)], _vec_consts[i].virt_reg_id);
+
+ return Vec(signature_of_xmm_ymm_zmm[size_t(const_width)], _new_vec_const(c, bcst_width == Bcst::kNA_Unique).id());
+}
+
+Vec UniCompiler::simd_vec_const(const void* c, Bcst bcst_width, const Vec& similar_to) {
+ VecWidth const_width = VecWidth(uint32_t(similar_to.reg_type()) - uint32_t(RegType::kVec128));
+ return simd_vec_const(c, bcst_width, const_width);
+}
+
+Vec UniCompiler::simd_vec_const(const void* c, Bcst bcst_width, const VecArray& similar_to) {
+ ASMJIT_ASSERT(!similar_to.is_empty());
+
+ VecWidth const_width = VecWidth(uint32_t(similar_to[0].reg_type()) - uint32_t(RegType::kVec128));
+ return simd_vec_const(c, bcst_width, const_width);
+}
+
+x86::Mem UniCompiler::simd_mem_const(const void* c, Bcst bcst_width, VecWidth const_width) {
+ x86::Mem m = _get_mem_const(c);
+ if (const_width != VecWidth::k512)
+ return m;
+
+ x86::Mem::Broadcast bcst = x86::Mem::Broadcast::kNone;
+ switch (bcst_width) {
+ case Bcst::k8: bcst = x86::Mem::Broadcast::k1To64; break;
+ case Bcst::k16: bcst = x86::Mem::Broadcast::k1To32; break;
+ case Bcst::k32: bcst = x86::Mem::Broadcast::k1To16; break;
+ case Bcst::k64: bcst = x86::Mem::Broadcast::k1To8; break;
+ default: bcst = x86::Mem::Broadcast::kNone; break;
+ }
+
+ m.set_broadcast(bcst);
+ return m;
+}
+
+x86::Mem UniCompiler::simd_mem_const(const void* c, Bcst bcst_width, const Vec& similar_to) {
+ VecWidth const_width = VecWidth(uint32_t(similar_to.reg_type()) - uint32_t(RegType::kVec128));
+ return simd_mem_const(c, bcst_width, const_width);
+}
+
+x86::Mem UniCompiler::simd_mem_const(const void* c, Bcst bcst_width, const VecArray& similar_to) {
+ ASMJIT_ASSERT(!similar_to.is_empty());
+
+ VecWidth const_width = VecWidth(uint32_t(similar_to[0].reg_type()) - uint32_t(RegType::kVec128));
+ return simd_mem_const(c, bcst_width, const_width);
+}
+
+x86::Mem UniCompiler::_get_mem_const(const void* c) {
+ // Make sure we are addressing a constant from the `commonTable` constant pool.
+ const void* ct_addr = ct_ptr<void>();
+ ASMJIT_ASSERT((uintptr_t)c >= (uintptr_t)ct_addr &&
+ (uintptr_t)c < (uintptr_t)ct_addr + _ct_ref.size);
+
+ if (is_32bit()) {
+ // 32-bit mode - These constants will never move in memory so the absolute addressing is a win/win as we can save
+ // one GP register that can be used for something else.
+ return x86::ptr((uint64_t)c);
+ }
+ else {
+ // 64-bit mode - One GP register is sacrificed to hold the pointer to the `ct`. This is probably the safest
+ // approach as relying on absolute addressing or anything else could lead to problems or performance issues.
+ _init_vec_const_table_ptr();
+
+ int32_t disp = int32_t((intptr_t)c - (intptr_t)ct_addr);
+ return x86::ptr(_common_table_ptr, disp - _common_table_offset);
+ }
+}
+
+Vec UniCompiler::_new_vec_const(const void* c, bool is_unique_const) {
+ Vec vec;
+ const char* special_const_name = nullptr;
+
+ if (special_const_name) {
+ vec = new_vec_with_width(vec_width(), special_const_name);
+ }
+ else {
+ uint64_t u0 = static_cast<const uint64_t*>(c)[0];
+ uint64_t u1 = static_cast<const uint64_t*>(c)[1];
+
+ if (u0 != u1)
+ vec = new_vec_with_width(vec_width(), "c_0x%016llX%016llX", (unsigned long long)u1, (unsigned long long)u0);
+ else if ((u0 >> 32) != (u0 & 0xFFFFFFFFu))
+ vec = new_vec_with_width(vec_width(), "c_0x%016llX", (unsigned long long)u0);
+ else if (((u0 >> 16) & 0xFFFFu) != (u0 & 0xFFFFu))
+ vec = new_vec_with_width(vec_width(), "c_0x%08X", (unsigned)(u0 & 0xFFFFFFFFu));
+ else
+ vec = new_vec_with_width(vec_width(), "c_0x%04X", (unsigned)(u0 & 0xFFFFu));
+ }
+
+ VecConstData const_data;
+ const_data.ptr = c;
+ const_data.virt_reg_id = vec.id();
+ _vec_consts.append(arena(), const_data);
+
+ if (c == &ct().p_0000000000000000) {
+ ScopedInjector inject(cc, &_func_init_hook);
+ v_zero_i(vec.xmm());
+ }
+ else {
+ // NOTE: _get_mem_const() must be outside of injected code as it uses injection too.
+ Mem m = _get_mem_const(c);
+
+ ScopedInjector inject(cc, &_func_init_hook);
+ if (has_avx512() && !vec.is_vec128() && !is_unique_const)
+ cc->vbroadcasti32x4(vec, m);
+ else if (has_avx2() && vec.is_vec256() && !is_unique_const)
+ cc->vbroadcasti128(vec, m);
+ else if (has_avx512())
+ cc->vmovdqa32(vec, m); // EVEX prefix has a compressed displacement, which is smaller.
+ else
+ v_loadavec(vec, m);
+ }
+ return vec;
+}
+
+// ujit::UniCompiler - Stack
+// =========================
+
+x86::Mem UniCompiler::tmp_stack(StackId id, uint32_t size) {
+ ASMJIT_ASSERT(Support::is_power_of_2(size));
+ ASMJIT_ASSERT(size <= 64);
+
+ // Only used by asserts.
+ Support::maybe_unused(size);
+
+ Mem& stack = _tmp_stack[size_t(id)];
+ if (!stack.base_id())
+ stack = cc->new_stack(64, 16, "tmp_stack");
+ return stack;
+}
+
+// ujit::UniCompiler - General Purpose Instructions - Conditions
+// =============================================================
+
+static constexpr InstId condition_to_inst_id[size_t(UniOpCond::kMaxValue) + 1] = {
+ Inst::kIdAnd, // UniOpCond::kAssignAnd
+ Inst::kIdOr, // UniOpCond::kAssignOr
+ Inst::kIdXor, // UniOpCond::kAssignXor
+ Inst::kIdAdd, // UniOpCond::kAssignAdd
+ Inst::kIdSub, // UniOpCond::kAssignSub
+ Inst::kIdShr, // UniOpCond::kAssignShr
+ Inst::kIdTest, // UniOpCond::kTest
+ Inst::kIdBt, // UniOpCond::kBitTest
+ Inst::kIdCmp // UniOpCond::kCompare
+};
+
+class ConditionApplier : public UniCondition {
+public:
+ ASMJIT_INLINE ConditionApplier(const UniCondition& condition) noexcept : UniCondition(condition) {
+ // The first operand must always be a register.
+ ASMJIT_ASSERT(a.is_gp());
+ }
+
+ ASMJIT_NOINLINE void optimize(UniCompiler& uc) noexcept {
+ switch (op) {
+ case UniOpCond::kAssignShr:
+ if (b.is_imm() && b.as<Imm>().value() == 0) {
+ if (a.is_gp32()) {
+ // Shifting by 0 would not set the flags...
+ op = UniOpCond::kAssignAnd;
+ b = a;
+ }
+ else {
+ op = UniOpCond::kTest;
+ b = a;
+ }
+ }
+ break;
+
+ case UniOpCond::kCompare:
+ if (b.is_imm() && b.as<Imm>().value() == 0 && (cond == CondCode::kEqual || cond == CondCode::kNotEqual)) {
+ op = UniOpCond::kTest;
+ b = a;
+ reverse();
+ }
+ break;
+
+ case UniOpCond::kBitTest: {
+ if (b.is_imm()) {
+ uint64_t bit_index = b.as<Imm>().value_as<uint64_t>();
+
+ // NOTE: AMD has no performance difference between 'test' and 'bt' instructions, however, Intel can execute less
+ // 'bt' instructions per cycle than 'test's, so we prefer 'test' if bit_index is low. Additionally, we only use
+ // test on 64-bit hardware as it's guaranteed that any register index is encodable. On 32-bit hardware only the
+ // first 4 registers can be used, which could mean that the register would have to be moved just to be tested,
+ // which is something we would like to avoid.
+ if (uc.is_64bit() && bit_index < 8) {
+ op = UniOpCond::kTest;
+ b = Imm(1u << bit_index);
+ cond = cond == CondCode::kC ? CondCode::kNZ : CondCode::kZ;
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ ASMJIT_INLINE void reverse() noexcept {
+ cond = x86::reverse_cond(cond);
+ }
+
+ ASMJIT_NOINLINE void emit(UniCompiler& uc) {
+ BackendCompiler* cc = uc.cc;
+ InstId inst_id = condition_to_inst_id[size_t(op)];
+
+ if (inst_id == Inst::kIdTest && cc->is_64bit()) {
+ if (b.is_imm() && b.as<Imm>().value_as<uint64_t>() <= 255u) {
+ // Emit 8-bit operation if targeting 64-bit mode and the immediate fits 8 bits.
+ cc->test(a.as<Gp>().r8(), b.as<Imm>());
+ return;
+ }
+ else if (a.as<Gp>().size() > 4 && b.is_imm() && uint64_t(b.as<Imm>().value()) <= 0xFFFFFFFFu) {
+ // Emit 32-bit operation if targeting 64-bit mode and the immediate is lesser than UINT32_MAX.
+ // This possibly saves a REX prefix required to promote the instruction to a 64-bit operation.
+ cc->test(a.as<Gp>().r32(), b.as<Imm>());
+ return;
+ }
+ }
+
+ if (inst_id == Inst::kIdShr && b.is_reg()) {
+ cc->emit(inst_id, a, b.as<Gp>().r8());
+ return;
+ }
+
+
+ cc->emit(inst_id, a, b);
+ }
+};
+
+// ujit::UniCompiler - General Purpose Instructions - Emit
+// =======================================================
+
+void UniCompiler::emit_mov(const Gp& dst, const Operand_& src) {
+ if (src.is_imm() && src.as<Imm>().value() == 0) {
+ Gp r(dst);
+ if (r.is_gp64())
+ r = r.r32();
+ cc->xor_(r, r);
+ }
+ else {
+ cc->emit(Inst::kIdMov, dst, src);
+ }
+}
+
+void UniCompiler::emit_m(UniOpM op, const Mem& m_) {
+ static constexpr uint8_t size_table[] = {
+ 1, // Prefetch
+ 0, // kStoreZeroReg
+ 1, // kStoreZeroU8
+ 2, // kStoreZeroU16
+ 4, // kStoreZeroU32
+ 8 // kStoreZeroU64
+ };
+
+ if (op == UniOpM::kPrefetch) {
+ cc->prefetcht0(m_);
+ }
+ else {
+ Mem m(m_);
+ uint32_t size = size_table[size_t(op)];
+ if (size == 0)
+ size = cc->register_size();
+
+ m.set_size(size);
+ cc->mov(m, 0);
+ }
+}
+
+void UniCompiler::emit_rm(UniOpRM op, const Gp& dst, const Mem& src) {
+ static constexpr uint8_t size_table[] = {
+ 0, // kLoadReg
+ 1, // kLoadI8
+ 1, // kLoadU8
+ 2, // kLoadI16
+ 2, // kLoadU16
+ 4, // kLoadI32
+ 4, // kLoadU32
+ 8, // kLoadI64
+ 8, // kLoadU64
+ 1, // kLoadMergeU8
+ 1, // kLoadShiftU8
+ 2, // kLoadMergeU16
+ 2 // kLoadShiftU16
+ };
+
+ Gp r(dst);
+ Mem m(src);
+
+ InstId inst_id = Inst::kIdMov;
+ uint32_t size = size_table[size_t(op)];
+
+ switch (op) {
+ case UniOpRM::kLoadReg:
+ size = dst.size();
+ break;
+
+ case UniOpRM::kLoadU8:
+ case UniOpRM::kLoadU16:
+ case UniOpRM::kLoadU32:
+ r.set_signature(RegTraits<RegType::kGp32>::kSignature);
+ if (size < 4)
+ inst_id = Inst::kIdMovzx;
+ break;
+
+ case UniOpRM::kLoadI8:
+ case UniOpRM::kLoadI16:
+ inst_id = Inst::kIdMovsx;
+ break;
+
+ case UniOpRM::kLoadI32:
+ inst_id = dst.is_gp64() ? Inst::kIdMovsxd : Inst::kIdMov;
+ break;
+
+ case UniOpRM::kLoadI64:
+ case UniOpRM::kLoadU64:
+ ASMJIT_ASSERT(dst.is_gp64());
+ m.set_size(8);
+ break;
+
+ case UniOpRM::kLoadShiftU8:
+ cc->shl(r, 8);
+ [[fallthrough]];
+
+ case UniOpRM::kLoadMergeU8:
+ r = r.r8();
+ break;
+
+ case UniOpRM::kLoadShiftU16:
+ cc->shl(r, 16);
+ [[fallthrough]];
+
+ case UniOpRM::kLoadMergeU16:
+ r = r.r16();
+ break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ m.set_size(size);
+ cc->emit(inst_id, r, m);
+}
+
+struct UniOpMRInfo {
+ uint16_t inst_id;
+ uint16_t size;
+};
+
+void UniCompiler::emit_mr(UniOpMR op, const Mem& dst, const Gp& src) {
+ static constexpr UniOpMRInfo op_info_table[] = {
+ { Inst::kIdMov, 0 }, // kStoreReg
+ { Inst::kIdMov, 1 }, // kStoreU8
+ { Inst::kIdMov, 2 }, // kStoreU16
+ { Inst::kIdMov, 4 }, // kStoreU32
+ { Inst::kIdMov, 8 }, // kStoreU64
+ { Inst::kIdAdd, 0 }, // kAddReg,
+ { Inst::kIdAdd, 1 }, // kAddU8,
+ { Inst::kIdAdd, 2 }, // kAddU16,
+ { Inst::kIdAdd, 4 }, // kAddU32,
+ { Inst::kIdAdd, 8 } // kAddU64
+ };
+
+ Mem m(dst);
+ Gp r = src;
+
+ const UniOpMRInfo& op_info = op_info_table[size_t(op)];
+
+ uint32_t size = op_info.size;
+ switch (size) {
+ case 0: size = src.size(); break;
+ case 1: r = src.r8(); break;
+ case 2: r = src.r16(); break;
+ case 4: r = src.r32(); break;
+ case 8: r = src.r64(); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ m.set_size(size);
+ cc->emit(op_info.inst_id, m, r);
+}
+
+void UniCompiler::emit_cmov(const Gp& dst, const Operand_& sel, const UniCondition& condition) {
+ ConditionApplier ca(condition);
+ ca.optimize(*this);
+ ca.emit(*this);
+ cc->emit(Inst::cmovcc_from_cond(ca.cond), dst, sel);
+}
+
+void UniCompiler::emit_select(const Gp& dst, const Operand_& sel1_, const Operand_& sel2_, const UniCondition& condition) {
+ ConditionApplier ca(condition);
+ ca.optimize(*this);
+
+ bool dst_is_a = ca.a.is_reg() && dst.id() == ca.a.as<Reg>().id();
+ bool dst_is_b = ca.b.is_reg() && dst.id() == ca.b.as<Reg>().id();
+
+ Operand sel1(sel1_);
+ Operand sel2(sel2_);
+
+ // Reverse the condition if we can place the immediate value first or if `dst == sel2`.
+ if ((!sel1.is_imm() && sel2.is_imm()) || (sel2.is_reg() && dst.id() == sel2.id())) {
+ ca.reverse();
+ std::swap(sel1, sel2);
+ }
+
+ bool dst_is_sel = sel1.is_reg() && dst.id() == sel1.id();
+ if (sel1 == sel2) {
+ if (!dst_is_sel)
+ cc->emit(Inst::kIdMov, dst, sel1);
+ return;
+ }
+
+ if (sel1.is_imm() && sel1.as<Imm>().value() == 0 && !dst_is_a && !dst_is_b && !dst_is_sel) {
+ cc->xor_(dst, dst);
+ ca.emit(*this);
+ }
+ else {
+ ca.emit(*this);
+ if (!dst_is_sel)
+ cc->emit(Inst::kIdMov, dst, sel1);
+ }
+
+ if (sel2.is_imm()) {
+ int64_t value = sel2.as<Imm>().value();
+ Mem sel2_mem = cc->new_const(ConstPoolScope::kLocal, &value, dst.size());
+ sel2 = sel2_mem;
+ }
+
+ cc->emit(Inst::cmovcc_from_cond(x86::negate_cond(ca.cond)), dst, sel2);
+}
+
+void UniCompiler::emit_2i(UniOpRR op, const Gp& dst, const Operand_& src_) {
+ Operand src(src_);
+
+ // Notes
+ //
+ // - CTZ:
+ // - INTEL - No difference, `bsf` and `tzcnt` both have latency ~2.5 cycles.
+ // - AMD - Big difference, `tzcnt` has only ~1.5 cycle latency while `bsf` has ~2.5 cycles.
+
+ // ArithOp Reg, Any
+ // ----------------
+
+ if (src.is_reg_or_mem()) {
+ switch (op) {
+ case UniOpRR::kCLZ: {
+ if (has_lzcnt()) {
+ cc->emit(Inst::kIdLzcnt, dst, src);
+ }
+ else {
+ uint32_t msk = (dst.size() * 8u) - 1u;
+ cc->emit(Inst::kIdBsr, dst, src);
+ cc->xor_(dst, msk);
+ }
+ return;
+ }
+
+ case UniOpRR::kCTZ: {
+ cc->emit(has_bmi() ? Inst::kIdTzcnt : Inst::kIdBsf, dst, src);
+ return;
+ }
+
+ case UniOpRR::kReflect: {
+ int nBits = int(dst.size()) * 8 - 1;
+
+ if (src.is_reg() && dst.id() == src.as<Reg>().id()) {
+ ASMJIT_ASSERT(dst.size() == src.as<Reg>().size());
+ Gp copy = new_similar_reg(dst, "@copy");
+
+ cc->mov(copy, dst);
+ cc->sar(copy, nBits);
+ cc->xor_(dst, copy);
+ }
+ else {
+ cc->emit(Inst::kIdMov, dst, src);
+ cc->sar(dst, nBits);
+ cc->emit(Inst::kIdXor, dst, src);
+ }
+ return;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ // ArithOp Reg, Mem
+ // ----------------
+
+ if (src.is_mem()) {
+ switch (op) {
+ case UniOpRR::kBSwap: {
+ if (has_movbe()) {
+ cc->movbe(dst, src.as<Mem>());
+ }
+ else {
+ cc->mov(dst, src.as<Mem>());
+ cc->bswap(dst);
+ }
+ return;
+ }
+
+ default:
+ break;
+ }
+
+ Gp src_gp = new_similar_reg(dst, "@src");
+ cc->mov(src_gp, src.as<Mem>());
+ src = src_gp;
+ }
+
+ // ArithOp Reg, Reg
+ // ----------------
+
+ if (src.is_reg()) {
+ const Gp& src_gp = src.as<Gp>();
+ bool dst_is_src = dst.id() == src_gp.id();
+
+ switch (op) {
+ case UniOpRR::kAbs: {
+ if (dst_is_src) {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->mov(tmp, dst);
+ cc->neg(dst);
+ cc->cmovs(dst, tmp);
+ }
+ else {
+ cc->mov(dst, src_gp);
+ cc->neg(dst);
+ cc->cmovs(dst, src_gp);
+ }
+ return;
+ }
+
+ case UniOpRR::kBSwap: {
+ if (!dst_is_src)
+ cc->mov(dst, src_gp);
+ cc->bswap(dst);
+ return;
+ }
+
+ case UniOpRR::kNeg:
+ case UniOpRR::kNot: {
+ if (!dst_is_src)
+ cc->mov(dst, src_gp);
+ cc->emit(op == UniOpRR::kNeg ? Inst::kIdNeg : Inst::kIdNot, dst);
+ return;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ // Everything should be handled, so this should never be reached!
+ ASMJIT_NOT_REACHED();
+}
+
+static constexpr uint64_t kOp3ICommutativeMask =
+ (uint64_t(1) << unsigned(UniOpRRR::kAnd )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kOr )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kXor )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kAdd )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kMul )) |
+ (uint64_t(1) << unsigned(UniOpRRR::kSMin)) |
+ (uint64_t(1) << unsigned(UniOpRRR::kSMax)) |
+ (uint64_t(1) << unsigned(UniOpRRR::kUMin)) |
+ (uint64_t(1) << unsigned(UniOpRRR::kUMax)) ;
+
+static ASMJIT_INLINE_NODEBUG bool is_op3i_commutative(UniOpRRR op) {
+ return (kOp3ICommutativeMask & (uint64_t(1) << unsigned(op))) != 0;
+}
+
+struct UniOpRRRMinMaxCMovInst { InstId a, b; };
+
+void UniCompiler::emit_3i(UniOpRRR op, const Gp& dst, const Operand_& src1_, const Operand_& src2_) {
+ Operand src1(src1_);
+ Operand src2(src2_);
+
+ static constexpr UniOpRRRMinMaxCMovInst arith_min_max_cmov_inst_table[4] = {
+ { Inst::kIdCmovl, Inst::kIdCmovg }, // MinI
+ { Inst::kIdCmovg, Inst::kIdCmovl }, // MaxI
+ { Inst::kIdCmovb, Inst::kIdCmova }, // MinU
+ { Inst::kIdCmova, Inst::kIdCmovb } // MaxU
+ };
+
+ static constexpr InstId legacy_shift_inst_table[5] = {
+ Inst::kIdShl, // SHL
+ Inst::kIdShr, // SHR
+ Inst::kIdSar, // SAR
+ Inst::kIdRol, // ROL
+ Inst::kIdRor // ROR
+ };
+
+ static constexpr InstId legacy_logical_inst_table[3] = {
+ Inst::kIdAnd, // AND
+ Inst::kIdOr, // OR
+ Inst::kIdXor // XOR
+ };
+
+ static constexpr InstId bmi2_shift_inst_table[5] = {
+ Inst::kIdShlx, // SHL
+ Inst::kIdShrx, // SHR
+ Inst::kIdSarx, // SAR
+ Inst::kIdNone, // ROL (doesn't exist).
+ Inst::kIdNone // ROR (can only be used with immediate, special handling).
+ };
+
+ // ArithOp Reg, Mem, Imm
+ // ---------------------
+
+ if (src1.is_mem() && src2.is_imm()) {
+ const Mem& a = src1.as<Mem>();
+ const Imm& b = src2.as<Imm>();
+
+ switch (op) {
+ case UniOpRRR::kMul:
+ cc->imul(dst, a, b);
+ return;
+
+ default:
+ break;
+ }
+
+ cc->mov(dst, a);
+ src1 = dst;
+ }
+
+ if (!src1.is_reg() && is_op3i_commutative(op)) {
+ std::swap(src1, src2);
+ }
+
+ // ArithOp Reg, Reg, Imm
+ // ---------------------
+
+ if (src1.is_reg() && src2.is_imm()) {
+ const Gp& a = src1.as<Gp>();
+ const Imm& b = src2.as<Imm>();
+
+ bool dst_is_a = dst.id() == a.id();
+ ASMJIT_ASSERT(dst.size() == a.size());
+
+ switch (op) {
+ case UniOpRRR::kAnd:
+ case UniOpRRR::kOr:
+ case UniOpRRR::kXor: {
+ InstId inst_id = legacy_logical_inst_table[size_t(op) - size_t(UniOpRRR::kAnd)];
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->emit(inst_id, dst, b);
+ return;
+ }
+
+ case UniOpRRR::kBic: {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+
+ Imm nImm(~b.value());
+ if (dst.size() <= 4)
+ nImm.sign_extend_int32();
+ cc->and_(dst, nImm);
+ return;
+ }
+
+ case UniOpRRR::kAdd: {
+ if (!dst_is_a && b.is_int32()) {
+ lea(dst, x86::ptr(a, b.value_as<int32_t>()));
+ }
+ else {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+
+ if (b.value() == 128) {
+ cc->sub(dst, -128);
+ }
+ else {
+ cc->add(dst, b);
+ }
+ }
+ return;
+ }
+
+ case UniOpRRR::kSub: {
+ if (!dst_is_a) {
+ lea(dst, x86::ptr(a, int32_t(0u - b.value_as<uint32_t>())));
+ }
+ else {
+ cc->sub(dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kMul: {
+ int64_t val = b.value();
+ if (dst_is_a && Support::is_power_of_2(uint64_t(val))) {
+ cc->shl(dst, Support::ctz(val));
+ return;
+ }
+
+ switch (b.value()) {
+ case 0:
+ cc->xor_(dst, dst);
+ return;
+
+ case 1:
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ return;
+
+ case 2:
+ lea(dst, x86::ptr(a, a));
+ return;
+
+ case 3:
+ lea(dst, x86::ptr(a, a, 1));
+ return;
+
+ case 5:
+ lea(dst, x86::ptr(a, a, 2));
+ return;
+
+ case 9:
+ lea(dst, x86::ptr(a, a, 3));
+ return;
+
+ default:
+ break;
+ }
+
+ cc->imul(dst, a, b);
+ return;
+ }
+
+ case UniOpRRR::kSMin:
+ case UniOpRRR::kSMax:
+ case UniOpRRR::kUMin:
+ case UniOpRRR::kUMax: {
+ const UniOpRRRMinMaxCMovInst& cmov_inst = arith_min_max_cmov_inst_table[size_t(op) - size_t(UniOpRRR::kSMin)];
+
+ if (dst_is_a) {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->mov(tmp, b);
+ cc->cmp(dst, tmp);
+ cc->emit(cmov_inst.b, dst, tmp);
+ }
+ else {
+ cc->mov(dst, b);
+ cc->cmp(dst, a);
+ cc->emit(cmov_inst.b, dst, a); // cmov_inst.b is correct, we have reversed the comparison in this case.
+ }
+ return;
+ }
+
+ case UniOpRRR::kSll:
+ // Optimize `dst = dst << 1`.
+ if (b.value() == 1) {
+ if (dst_is_a) {
+ // `dst = dst + dst`.
+ cc->add(dst, dst);
+ }
+ else if (is_64bit()) {
+ // `dst = a + a` (using a 64-bit address saves address-override prefix).
+ cc->lea(dst, x86::ptr(a.r64(), a.r64()));
+ }
+ else {
+ // `dst = a + a`.
+ cc->lea(dst, x86::ptr(a, a));
+ }
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpRRR::kSrl:
+ case UniOpRRR::kSra: {
+ InstId legacy_inst_id = legacy_shift_inst_table[size_t(op) - size_t(UniOpRRR::kSll)];
+
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->emit(legacy_inst_id, dst, b);
+ return;
+ }
+
+ case UniOpRRR::kRol: {
+ if (has_bmi2()) {
+ uint32_t reg_size = dst.size() * 8u;
+ uint32_t imm = (reg_size - b.value_as<uint32_t>()) & Support::lsb_mask<uint32_t>(reg_size);
+ cc->rorx(dst, a, imm);
+ }
+ else {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->rol(dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kRor: {
+ if (has_bmi2()) {
+ cc->rorx(dst, a, b);
+ }
+ else {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->ror(dst, b);
+ }
+ return;
+ }
+
+ default:
+ break;
+ }
+
+ Gp bTmp = new_similar_reg(dst, "@bImm");
+ cc->mov(bTmp, b);
+ src2 = bTmp;
+ }
+
+ // ArithOp Reg, Mem, Reg
+ // ---------------------
+
+ if (src1.is_mem() && src2.is_reg()) {
+ const Mem& a = src1.as<Mem>();
+ const Gp& b = src2.as<Gp>();
+
+ bool dst_is_b = dst.id() == b.id();
+
+ switch (op) {
+ case UniOpRRR::kAnd:
+ case UniOpRRR::kOr:
+ case UniOpRRR::kXor:
+ case UniOpRRR::kAdd:
+ case UniOpRRR::kMul:
+ case UniOpRRR::kSMin:
+ case UniOpRRR::kSMax:
+ case UniOpRRR::kUMin:
+ case UniOpRRR::kUMax:
+ // These are commutative, so this should never happen as these should have been corrected to `Reg, Reg, Mem`.
+ ASMJIT_NOT_REACHED();
+
+ case UniOpRRR::kSub: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ if (dst_is_b) {
+ cc->neg(dst);
+ cc->add(dst, a);
+ return;
+ }
+
+ // Bail to `Reg, Reg, Reg` form.
+ break;
+ }
+
+ case UniOpRRR::kSll:
+ case UniOpRRR::kSrl:
+ case UniOpRRR::kSra: {
+ // Prefer BMI2 variants: SHLX, SHRX, SARX, and RORX.
+ if (has_bmi2()) {
+ InstId bmi2_inst_id = bmi2_shift_inst_table[size_t(op) - size_t(UniOpRRR::kSll)];
+ cc->emit(bmi2_inst_id, dst, a, b.clone_as(dst));
+ return;
+ }
+
+ // Bail to `Reg, Reg, Reg` form if BMI2 is not available.
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ if (!dst_is_b) {
+ cc->mov(dst, a);
+ src1 = dst;
+ }
+ else {
+ Gp aTmp = new_similar_reg(dst, "@aTmp");
+ cc->mov(aTmp, a);
+ src1 = aTmp;
+ }
+ }
+
+ // ArithOp Reg, Reg, Mem
+ // ---------------------
+
+ if (src1.is_reg() && src2.is_mem()) {
+ const Gp& a = src1.as<Gp>();
+ const Mem& b = src2.as<Mem>();
+
+ bool dst_is_a = dst.id() == a.id();
+ ASMJIT_ASSERT(dst.size() == a.size());
+
+ switch (op) {
+ case UniOpRRR::kAnd:
+ case UniOpRRR::kOr:
+ case UniOpRRR::kXor: {
+ InstId inst_id = legacy_logical_inst_table[size_t(op) - size_t(UniOpRRR::kAnd)];
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->emit(inst_id, dst, b);
+ return;
+ }
+
+ case UniOpRRR::kBic: {
+ Gp tmp = new_similar_reg(dst);
+ cc->mov(tmp, b);
+ cc->not_(tmp);
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->and_(dst, tmp);
+ return;
+ }
+
+ case UniOpRRR::kAdd: {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->add(dst, b);
+ return;
+ }
+
+ case UniOpRRR::kSub: {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->sub(dst, b);
+ return;
+ }
+
+ case UniOpRRR::kMul: {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->imul(dst, b);
+ return;
+ }
+
+ case UniOpRRR::kUDiv: {
+ Gp tmp1 = new_similar_reg(dst, "@tmp1");
+ cc->xor_(tmp1, tmp1);
+
+ if (dst_is_a) {
+ cc->div(tmp1, dst, b);
+ }
+ else {
+ cc->mov(dst, a);
+ cc->div(tmp1, dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kUMod: {
+ Gp tmp1 = new_similar_reg(dst, "@tmp1");
+ cc->xor_(tmp1, tmp1);
+
+ if (dst_is_a) {
+ cc->div(tmp1, dst, b);
+ cc->mov(dst, tmp1);
+ }
+ else {
+ Gp tmp2 = new_similar_reg(dst, "@tmp2");
+ cc->mov(tmp2, a);
+ cc->div(tmp1, tmp2, b);
+ cc->mov(dst, tmp1);
+ }
+ return;
+ }
+
+ case UniOpRRR::kSMin:
+ case UniOpRRR::kSMax:
+ case UniOpRRR::kUMin:
+ case UniOpRRR::kUMax: {
+ const UniOpRRRMinMaxCMovInst& cmov_inst = arith_min_max_cmov_inst_table[size_t(op) - size_t(UniOpRRR::kSMin)];
+
+ if (dst_is_a) {
+ cc->cmp(dst, b);
+ cc->emit(cmov_inst.b, dst, b);
+ }
+ else {
+ cc->mov(dst, b);
+ cc->cmp(dst, a);
+ cc->emit(cmov_inst.b, dst, a); // cmov_inst.b is correct, we have reversed the comparison in this case.
+ }
+ return;
+ }
+
+ case UniOpRRR::kSBound: {
+ cc->xor_(dst, dst);
+ cc->cmp(a, b);
+ cc->cmovbe(dst, a);
+ cc->cmovg(dst, b);
+ return;
+ }
+
+ default:
+ break;
+ }
+
+ Gp bTmp = new_similar_reg(dst, "@bTmp");
+ cc->mov(bTmp, b);
+ src2 = bTmp;
+ }
+
+ // ArithOp Reg, Reg, Reg
+ // ---------------------
+
+ if (src1.is_reg() && src2.is_reg()) {
+ const Gp& a = src1.as<Gp>();
+ const Gp& b = src2.as<Gp>();
+
+ bool aIsB = a.id() == b.id();
+ bool dst_is_a = dst.id() == a.id();
+ bool dst_is_b = dst.id() == b.id();
+
+ ASMJIT_ASSERT(dst.size() == a.size());
+
+ switch (op) {
+ case UniOpRRR::kAnd:
+ case UniOpRRR::kOr:
+ case UniOpRRR::kXor: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ InstId inst_id = legacy_logical_inst_table[size_t(op) - size_t(UniOpRRR::kAnd)];
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->emit(inst_id, dst, b);
+ return;
+ }
+
+ case UniOpRRR::kBic: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ if (has_bmi()) {
+ cc->andn(dst, b, a);
+ }
+ else if (dst_is_b) {
+ if (dst_is_a) {
+ cc->mov(dst, 0);
+ return;
+ }
+ cc->not_(dst);
+ cc->and_(dst, a);
+ }
+ else {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->mov(tmp, b);
+ cc->not_(tmp);
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->and_(dst, tmp);
+ }
+ return;
+ }
+
+ case UniOpRRR::kAdd: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ if (dst_is_a || dst_is_b) {
+ cc->add(dst, dst_is_b ? a : b);
+ }
+ else if (dst.size() >= 4) {
+ if (is_64bit())
+ lea(dst, x86::ptr(a.r64(), b.r64()));
+ else
+ lea(dst, x86::ptr(a, b));
+ }
+ else {
+ cc->mov(dst, a);
+ cc->add(dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kSub: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ if (aIsB) {
+ cc->xor_(dst, dst);
+ }
+ else if (dst_is_a) {
+ cc->sub(dst, b);
+ }
+ else if (dst_is_b) {
+ cc->neg(dst);
+ cc->add(dst, a);
+ }
+ else {
+ cc->mov(dst, a);
+ cc->sub(dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kMul: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ if (!dst_is_a && !dst_is_b)
+ cc->mov(dst, a);
+ cc->imul(dst, dst_is_b ? a : b);
+ return;
+ }
+
+ case UniOpRRR::kUDiv: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ Gp tmp1 = new_similar_reg(dst, "@tmp1");
+ cc->xor_(tmp1, tmp1);
+
+ if (dst_is_a) {
+ cc->div(tmp1, dst, b);
+ }
+ else if (dst_is_b) {
+ Gp tmp2 = new_similar_reg(dst, "@tmp2");
+ cc->mov(tmp2, a);
+ cc->div(tmp1, tmp2, b);
+ cc->mov(dst, tmp2);
+ }
+ else {
+ cc->mov(dst, a);
+ cc->div(tmp1, dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kUMod: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+
+ Gp tmp1 = new_similar_reg(dst, "@tmp1");
+ cc->xor_(tmp1, tmp1);
+
+ if (dst_is_a) {
+ cc->div(tmp1, dst, b);
+ cc->mov(dst, tmp1);
+ }
+ else {
+ Gp tmp2 = new_similar_reg(dst, "@tmp2");
+ cc->mov(tmp2, a);
+ cc->div(tmp1, tmp2, b);
+ cc->mov(dst, tmp1);
+ }
+ return;
+ }
+
+ case UniOpRRR::kSMin:
+ case UniOpRRR::kSMax:
+ case UniOpRRR::kUMin:
+ case UniOpRRR::kUMax: {
+ ASMJIT_ASSERT(dst.size() == b.size());
+ const UniOpRRRMinMaxCMovInst& cmov_inst = arith_min_max_cmov_inst_table[size_t(op) - size_t(UniOpRRR::kSMin)];
+
+ cc->cmp(a, b);
+ if (dst_is_b) {
+ cc->emit(cmov_inst.a, dst, a);
+ }
+ else {
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->emit(cmov_inst.b, dst, b);
+ }
+ return;
+ }
+
+ case UniOpRRR::kSll:
+ case UniOpRRR::kSrl:
+ case UniOpRRR::kSra:
+ case UniOpRRR::kRol:
+ case UniOpRRR::kRor: {
+ // Prefer BMI2 variants: SHLX, SHRX, SARX, and RORX.
+ if (has_bmi2()) {
+ InstId bmi2_inst_id = bmi2_shift_inst_table[size_t(op) - size_t(UniOpRRR::kSll)];
+ if (bmi2_inst_id != Inst::kIdNone) {
+ cc->emit(bmi2_inst_id, dst, a, b.clone_as(dst));
+ return;
+ }
+ }
+
+ InstId legacy_inst_id = legacy_shift_inst_table[size_t(op) - size_t(UniOpRRR::kSll)];
+ if (dst_is_a) {
+ cc->emit(legacy_inst_id, dst, b.r8());
+ return;
+ }
+ else if (dst_is_b) {
+ Gp tmp = new_gp32("@tmp");
+ if (!dst_is_a)
+ cc->mov(dst, a);
+ cc->mov(tmp, b.r32());
+ cc->emit(legacy_inst_id, dst, tmp.r8());
+ }
+ else {
+ cc->mov(dst, a);
+ cc->emit(legacy_inst_id, dst, b.r8());
+ }
+ return;
+ }
+
+ case UniOpRRR::kSBound: {
+ if (dst.id() == a.id()) {
+ Gp zero = new_similar_reg(dst, "@zero");
+
+ cc->xor_(zero, zero);
+ cc->cmp(dst, b);
+ cc->cmova(dst, zero);
+ cc->cmovg(dst, b);
+ }
+ else {
+ cc->xor_(dst, dst);
+ cc->cmp(a, b);
+ cc->cmovbe(dst, a);
+ cc->cmovg(dst, b);
+ }
+ return;
+ }
+ }
+ }
+
+ // Everything should be handled, so this should never be reached!
+ ASMJIT_NOT_REACHED();
+}
+
+void UniCompiler::emit_j(const Operand_& target) {
+ cc->emit(Inst::kIdJmp, target);
+}
+
+void UniCompiler::emit_j_if(const Label& target, const UniCondition& condition) {
+ ConditionApplier ca(condition);
+ ca.optimize(*this);
+ ca.emit(*this);
+ cc->j(ca.cond, target);
+}
+
+void UniCompiler::adds_u8(const Gp& dst, const Gp& src1, const Gp& src2) {
+ ASMJIT_ASSERT(dst.size() == src1.size());
+ ASMJIT_ASSERT(dst.size() == src2.size());
+
+ if (dst.id() == src1.id()) {
+ cc->add(dst.r8(), src2.r8());
+ }
+ else if (dst.id() == src2.id()) {
+ cc->add(dst.r8(), src1.r8());
+ }
+ else {
+ cc->mov(dst, src1);
+ cc->add(dst, src2);
+ }
+
+ Gp u8_msk = new_gp32("@u8_msk");
+ cc->sbb(u8_msk, u8_msk);
+ cc->or_(dst.r8(), u8_msk.r8());
+}
+
+void UniCompiler::inv_u8(const Gp& dst, const Gp& src) {
+ if (dst.id() != src.id())
+ cc->mov(dst, src);
+ cc->xor_(dst.r8(), 0xFF);
+}
+
+void UniCompiler::div_255_u32(const Gp& dst, const Gp& src) {
+ ASMJIT_ASSERT(dst.size() == src.size());
+
+ if (dst.id() == src.id()) {
+ // tmp = src + 128;
+ // dst = (tmp + (tmp >> 8)) >> 8
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->sub(dst, -128);
+ cc->mov(tmp, dst);
+ cc->shr(tmp, 8);
+ cc->add(dst, tmp);
+ cc->shr(dst, 8);
+ }
+ else {
+ // dst = (src + 128 + ((src + 128) >> 8)) >> 8
+ lea(dst, x86::ptr(src, 128));
+ cc->shr(dst, 8);
+ lea(dst, x86::ptr(dst, src, 0, 128));
+ cc->shr(dst, 8);
+ }
+}
+
+void UniCompiler::mul_257_hu16(const Gp& dst, const Gp& src) {
+ ASMJIT_ASSERT(dst.size() == src.size());
+ cc->imul(dst, src, 257);
+ cc->shr(dst, 16);
+}
+
+void UniCompiler::add_scaled(const Gp& dst, const Gp& a, int b) {
+ switch (b) {
+ case 1:
+ cc->add(dst, a);
+ return;
+
+ case 2:
+ case 4:
+ case 8: {
+ uint32_t shift = b == 2 ? 1 :
+ b == 4 ? 2 : 3;
+ lea(dst, x86::ptr(dst, a, shift));
+ return;
+ }
+
+ default: {
+ Gp tmp = new_similar_reg(dst, "@tmp");
+ cc->imul(tmp, a, b);
+ cc->add(dst, tmp);
+ return;
+ }
+ }
+}
+
+void UniCompiler::add_ext(const Gp& dst, const Gp& src_, const Gp& idx_, uint32_t scale, int32_t disp) {
+ ASMJIT_ASSERT(scale != 0u);
+
+ Gp src = src_.clone_as(dst);
+ Gp idx = idx_.clone_as(dst);
+
+ switch (scale) {
+ case 1:
+ if (dst.id() == src.id() && disp == 0) {
+ cc->add(dst, idx);
+ return;
+ }
+ [[fallthrough]];
+
+ case 2:
+ case 4:
+ case 8:
+ lea(dst, x86::ptr(src, idx, Support::ctz(scale), disp));
+ return;
+
+ default:
+ break;
+ }
+
+ if (src.id() == idx.id()) {
+ cc->imul(dst, src, scale + 1);
+ return;
+ }
+
+ if (dst.id() != idx.id() && scale == 3) {
+ lea(dst, x86::ptr(src, idx, 1, disp));
+ cc->add(dst, idx);
+ return;
+ }
+
+ Gp tmp = new_similar_reg(dst);
+ cc->imul(tmp, idx, scale);
+ cc->lea(dst, x86::ptr(src, tmp));
+}
+
+void UniCompiler::lea(const Gp& dst, const Mem& src) {
+ Mem m(src);
+
+ if (is_64bit() && dst.size() == 4) {
+ if (m.base_type() == RegType::kGp32) {
+ m.set_base_type(RegType::kGp64);
+ }
+
+ if (m.index_type() == RegType::kGp32) {
+ m.set_index_type(RegType::kGp64);
+ }
+ }
+
+ cc->lea(dst, m);
+}
+
+// ujit::UniCompiler - Vector Instructions - Constants
+// ===================================================
+
+//! Floating point mode is used in places that are generic and implement various functionality that needs more
+//! than a single instruction. Typically implementing either higher level concepts or missing functionality.
+enum FloatMode : uint8_t {
+ //! Scalar 32-bit floating point operation.
+ kF32S = 0,
+ //! Scalar 64-bit floating point operation.
+ kF64S = 1,
+ //! Vector 32-bit floating point operation.
+ kF32V = 2,
+ //! Vector 64-bit floating point operation.
+ kF64V = 3,
+
+ //! Used by non-floating point instructions.
+ kNone = 4
+};
+
+enum class ElementSize : uint8_t {
+ k8,
+ k16,
+ k32,
+ k64
+};
+
+enum class SameVecOp : uint8_t {
+ kNone = 0,
+ kZero = 1,
+ kOnes = 2,
+ kSrc = 3
+};
+
+enum class VecPart : uint8_t {
+ kNA = 0,
+ kLo = 0,
+ kHi = 1
+};
+
+enum class WideningOp : uint32_t {
+ kNone,
+ kI8ToI16,
+ kU8ToU16,
+ kI8ToI32,
+ kU8ToU32,
+ kU8ToU64,
+ kI16ToI32,
+ kU16ToU32,
+ kI32ToI64,
+ kU32ToU64
+};
+
+enum class NarrowingOp : uint32_t {
+ kNone,
+ kI16ToI8,
+ kI16ToU8,
+ kU16ToU8,
+ kI32ToI16,
+ kI32ToU16,
+ kU32ToU16,
+ kI64ToI32,
+ kI64ToU32,
+ kU64ToU32
+};
+
+enum class NarrowingMode : uint32_t {
+ kTruncate,
+ kSaturateSToU,
+ kSaturateSToS,
+ kSaturateUToU
+};
+
+[[maybe_unused]]
+static ASMJIT_INLINE bool is_scalar_fp_op(FloatMode fm) noexcept { return fm <= kF64S; }
+
+[[maybe_unused]]
+static ASMJIT_INLINE bool is_f32_op(FloatMode fm) noexcept { return fm == kF32S || fm == kF32V; }
+
+[[maybe_unused]]
+static ASMJIT_INLINE bool is_f64_op(FloatMode fm) noexcept { return fm == kF64S || fm == kF64V; }
+
+// ujit::UniCompiler - Vector Instructions - Broadcast / Shuffle Data
+// ==================================================================
+
+static constexpr uint16_t avx512_vinsert_128[] = {
+ Inst::kIdVinserti32x4,
+ Inst::kIdVinserti64x2,
+ Inst::kIdVinsertf32x4,
+ Inst::kIdVinsertf64x2
+};
+
+static constexpr uint16_t avx512_vshuf_128[] = {
+ Inst::kIdVshufi32x4,
+ Inst::kIdVshufi64x2,
+ Inst::kIdVshuff32x4,
+ Inst::kIdVshuff64x2
+};
+
+// ujit::UniCompiler - Vector Instructions - Integer Cmp/Min/Max Data
+// ==================================================================
+
+struct CmpMinMaxInst {
+ uint16_t peq;
+ uint16_t pgt;
+ uint16_t pmin;
+ uint16_t pmax;
+};
+
+static constexpr CmpMinMaxInst sse_cmp_min_max[] = {
+ { Inst::kIdPcmpeqb, Inst::kIdPcmpgtb, Inst::kIdPminsb, Inst::kIdPmaxsb },
+ { Inst::kIdPcmpeqb, Inst::kIdPcmpgtb, Inst::kIdPminub, Inst::kIdPmaxub },
+ { Inst::kIdPcmpeqw, Inst::kIdPcmpgtw, Inst::kIdPminsw, Inst::kIdPmaxsw },
+ { Inst::kIdPcmpeqw, Inst::kIdPcmpgtw, Inst::kIdPminuw, Inst::kIdPmaxuw },
+ { Inst::kIdPcmpeqd, Inst::kIdPcmpgtd, Inst::kIdPminsd, Inst::kIdPmaxsd },
+ { Inst::kIdPcmpeqd, Inst::kIdPcmpgtd, Inst::kIdPminud, Inst::kIdPmaxud },
+ { Inst::kIdPcmpeqq, Inst::kIdPcmpgtq, Inst::kIdNone , Inst::kIdNone },
+ { Inst::kIdPcmpeqq, Inst::kIdPcmpgtq, Inst::kIdNone , Inst::kIdNone },
+};
+
+static constexpr CmpMinMaxInst avx_cmp_min_max[] = {
+ { Inst::kIdVpcmpeqb, Inst::kIdVpcmpgtb, Inst::kIdVpminsb, Inst::kIdVpmaxsb },
+ { Inst::kIdVpcmpeqb, Inst::kIdVpcmpgtb, Inst::kIdVpminub, Inst::kIdVpmaxub },
+ { Inst::kIdVpcmpeqw, Inst::kIdVpcmpgtw, Inst::kIdVpminsw, Inst::kIdVpmaxsw },
+ { Inst::kIdVpcmpeqw, Inst::kIdVpcmpgtw, Inst::kIdVpminuw, Inst::kIdVpmaxuw },
+ { Inst::kIdVpcmpeqd, Inst::kIdVpcmpgtd, Inst::kIdVpminsd, Inst::kIdVpmaxsd },
+ { Inst::kIdVpcmpeqd, Inst::kIdVpcmpgtd, Inst::kIdVpminud, Inst::kIdVpmaxud },
+ { Inst::kIdVpcmpeqq, Inst::kIdVpcmpgtq, Inst::kIdVpminsq, Inst::kIdVpmaxsq },
+ { Inst::kIdVpcmpeqq, Inst::kIdVpcmpgtq, Inst::kIdVpminuq, Inst::kIdVpmaxuq },
+};
+
+// ujit::UniCompiler - Vector Instructions - Integer Conversion Data
+// =================================================================
+
+struct WideningOpInfo {
+ uint32_t mov : 16;
+ uint32_t unpack_lo : 16;
+ uint32_t unpack_hi : 13;
+ uint32_t sign_extends : 1;
+ uint32_t reserved : 5;
+};
+
+struct NarrowingOpInfo {
+ uint32_t mov : 13;
+ uint32_t pack : 13;
+ uint32_t sign : 1;
+ uint32_t mode : 2;
+ uint32_t reserved : 19;
+};
+
+static constexpr WideningOpInfo sse_int_widening_op_info[] = {
+ { Inst::kIdNone , Inst::kIdNone , Inst::kIdNone , 0, 0 }, // kNone.
+ { Inst::kIdPmovsxbw , Inst::kIdPunpcklbw , Inst::kIdPunpckhbw , 1, 0 }, // kI8ToI16.
+ { Inst::kIdPmovzxbw , Inst::kIdPunpcklbw , Inst::kIdPunpckhbw , 0, 0 }, // kU8ToU16.
+ { Inst::kIdPmovsxbd , Inst::kIdNone , Inst::kIdNone , 1, 0 }, // kI8ToI32.
+ { Inst::kIdPmovzxbd , Inst::kIdNone , Inst::kIdNone , 0, 0 }, // kU8ToU32.
+ { Inst::kIdPmovzxbq , Inst::kIdNone , Inst::kIdNone , 0, 0 }, // kU8ToU64.
+ { Inst::kIdPmovsxwd , Inst::kIdPunpcklwd , Inst::kIdPunpckhwd , 1, 0 }, // kI16ToI32.
+ { Inst::kIdPmovzxwd , Inst::kIdPunpcklwd , Inst::kIdPunpckhwd , 0, 0 }, // kU16ToU32.
+ { Inst::kIdPmovsxdq , Inst::kIdPunpckldq , Inst::kIdPunpckhdq , 1, 0 }, // kI32ToI64.
+ { Inst::kIdPmovzxdq , Inst::kIdPunpckldq , Inst::kIdPunpckhdq , 0, 0 } // kU32ToU64.
+};
+
+// ujit::UniCompiler - Vector Instructions - Float Instruction Data
+// ================================================================
+
+struct FloatInst {
+ uint16_t fmovs;
+ uint16_t fmova;
+ uint16_t fmovu;
+ uint16_t fand;
+ uint16_t for_;
+ uint16_t fxor;
+ uint16_t fandn;
+ uint16_t fadd;
+ uint16_t fsub;
+ uint16_t fmul;
+ uint16_t fdiv;
+ uint16_t fmin;
+ uint16_t fmax;
+ uint16_t fcmp;
+ uint16_t fround;
+ uint16_t frndscale;
+ uint16_t psrl;
+ uint16_t psll;
+};
+
+static constexpr FloatInst sse_float_inst[4] = {
+ {
+ Inst::kIdMovss,
+ Inst::kIdMovaps,
+ Inst::kIdMovups,
+ Inst::kIdAndps,
+ Inst::kIdOrps,
+ Inst::kIdXorps,
+ Inst::kIdAndnps,
+ Inst::kIdAddss,
+ Inst::kIdSubss,
+ Inst::kIdMulss,
+ Inst::kIdDivss,
+ Inst::kIdMinss,
+ Inst::kIdMaxss,
+ Inst::kIdCmpss,
+ Inst::kIdRoundss,
+ Inst::kIdNone,
+ Inst::kIdPsrld,
+ Inst::kIdPslld
+ },
+ {
+ Inst::kIdMovsd,
+ Inst::kIdMovaps,
+ Inst::kIdMovups,
+ Inst::kIdAndpd,
+ Inst::kIdOrpd,
+ Inst::kIdXorpd,
+ Inst::kIdAndnpd,
+ Inst::kIdAddsd,
+ Inst::kIdSubsd,
+ Inst::kIdMulsd,
+ Inst::kIdDivsd,
+ Inst::kIdMinsd,
+ Inst::kIdMaxsd,
+ Inst::kIdCmpsd,
+ Inst::kIdRoundsd,
+ Inst::kIdNone,
+ Inst::kIdPsrlq,
+ Inst::kIdPsllq
+ },
+ {
+ Inst::kIdMovaps,
+ Inst::kIdMovaps,
+ Inst::kIdMovups,
+ Inst::kIdAndps,
+ Inst::kIdOrps,
+ Inst::kIdXorps,
+ Inst::kIdAndnps,
+ Inst::kIdAddps,
+ Inst::kIdSubps,
+ Inst::kIdMulps,
+ Inst::kIdDivps,
+ Inst::kIdMinps,
+ Inst::kIdMaxps,
+ Inst::kIdCmpps,
+ Inst::kIdRoundps,
+ Inst::kIdNone,
+ Inst::kIdPsrld,
+ Inst::kIdPslld
+ },
+ {
+ Inst::kIdMovaps,
+ Inst::kIdMovaps,
+ Inst::kIdMovups,
+ Inst::kIdAndpd,
+ Inst::kIdOrpd,
+ Inst::kIdXorpd,
+ Inst::kIdAndnpd,
+ Inst::kIdAddpd,
+ Inst::kIdSubpd,
+ Inst::kIdMulpd,
+ Inst::kIdDivpd,
+ Inst::kIdMinpd,
+ Inst::kIdMaxpd,
+ Inst::kIdCmppd,
+ Inst::kIdRoundpd,
+ Inst::kIdNone,
+ Inst::kIdPsrlq,
+ Inst::kIdPsllq
+ }
+};
+
+static constexpr FloatInst avx_float_inst[4] = {
+ {
+ Inst::kIdVmovss,
+ Inst::kIdVmovaps,
+ Inst::kIdVmovups,
+ Inst::kIdVandps,
+ Inst::kIdVorps,
+ Inst::kIdVxorps,
+ Inst::kIdVandnps,
+ Inst::kIdVaddss,
+ Inst::kIdVsubss,
+ Inst::kIdVmulss,
+ Inst::kIdVdivss,
+ Inst::kIdVminss,
+ Inst::kIdVmaxss,
+ Inst::kIdVcmpss,
+ Inst::kIdVroundss,
+ Inst::kIdVrndscaless,
+ Inst::kIdVpsrld,
+ Inst::kIdVpslld
+ },
+ {
+ Inst::kIdVmovsd,
+ Inst::kIdVmovaps,
+ Inst::kIdVmovups,
+ Inst::kIdVandpd,
+ Inst::kIdVorpd,
+ Inst::kIdVxorpd,
+ Inst::kIdVandnpd,
+ Inst::kIdVaddsd,
+ Inst::kIdVsubsd,
+ Inst::kIdVmulsd,
+ Inst::kIdVdivsd,
+ Inst::kIdVminsd,
+ Inst::kIdVmaxsd,
+ Inst::kIdVcmpsd,
+ Inst::kIdVroundsd,
+ Inst::kIdVrndscalesd,
+ Inst::kIdVpsrlq,
+ Inst::kIdVpsllq
+ },
+ {
+ Inst::kIdVmovaps,
+ Inst::kIdVmovaps,
+ Inst::kIdVmovups,
+ Inst::kIdVandps,
+ Inst::kIdVorps,
+ Inst::kIdVxorps,
+ Inst::kIdVandnps,
+ Inst::kIdVaddps,
+ Inst::kIdVsubps,
+ Inst::kIdVmulps,
+ Inst::kIdVdivps,
+ Inst::kIdVminps,
+ Inst::kIdVmaxps,
+ Inst::kIdVcmpps,
+ Inst::kIdVroundps,
+ Inst::kIdVrndscaleps,
+ Inst::kIdVpsrld,
+ Inst::kIdVpslld
+ },
+ {
+ Inst::kIdVmovaps,
+ Inst::kIdVmovaps,
+ Inst::kIdVmovups,
+ Inst::kIdVandpd,
+ Inst::kIdVorpd,
+ Inst::kIdVxorpd,
+ Inst::kIdVandnpd,
+ Inst::kIdVaddpd,
+ Inst::kIdVsubpd,
+ Inst::kIdVmulpd,
+ Inst::kIdVdivpd,
+ Inst::kIdVminpd,
+ Inst::kIdVmaxpd,
+ Inst::kIdVcmppd,
+ Inst::kIdVroundpd,
+ Inst::kIdVrndscalepd,
+ Inst::kIdVpsrlq,
+ Inst::kIdVpsllq
+ }
+};
+
+// ujit::UniCompiler - Vector Instructions - UniOp Information
+// ===========================================================
+
+struct UniOpVInfo {
+ //! \name Members
+ //! \{
+
+ uint32_t sse_inst_id : 13;
+ uint32_t sse_op_count : 3;
+ uint32_t sse_ext : 3;
+ uint32_t avx_inst_id : 13;
+ uint32_t avx_ext : 6;
+ uint32_t commutative : 1;
+ uint32_t comparison : 1;
+ uint32_t same_vec_op : 3;
+ uint32_t use_imm : 1;
+ uint32_t imm : 8;
+ uint32_t float_mode : 3;
+ uint32_t element_size : 2;
+ uint32_t broadcast_size : 4;
+ uint32_t hi : 1;
+ uint32_t reserved : 3;
+
+ //! \}
+};
+
+#define DEFINE_OP(sse_inst_id, sse_op_count, sse_ext, avx_inst_id, avx_ext, commutative, comparison, same_vec_op, use_imm, imm, float_mode, element_size, broadcast_size, vec_part) \
+ UniOpVInfo { \
+ Inst::sse_inst_id, \
+ sse_op_count, \
+ uint8_t(SSEExt::sse_ext), \
+ Inst::avx_inst_id, \
+ uint8_t(AVXExt::avx_ext), \
+ commutative, \
+ comparison, \
+ uint8_t(SameVecOp::same_vec_op), \
+ use_imm, \
+ imm, \
+ uint8_t(FloatMode::float_mode), \
+ uint8_t(ElementSize::element_size), \
+ broadcast_size, \
+ uint8_t(VecPart::vec_part), \
+ 0 \
+ }
+
+static constexpr UniOpVInfo opcode_info_2v[size_t(UniOpVV::kMaxValue) + 1] = {
+ DEFINE_OP(kIdMovaps , 0, kIntrin, kIdVmovaps , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kMov.
+ DEFINE_OP(kIdMovq , 0, kIntrin, kIdVmovq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kMovU64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpbroadcastb , kIntrin , 0, 0, kNone, 0, 0x01u, kNone, k8 , 0, kNA), // kBroadcastU8Z.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpbroadcastw , kIntrin , 0, 0, kNone, 0, 0x01u, kNone, k16, 0, kNA), // kBroadcastU16Z.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpbroadcastb , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kBroadcastU8.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpbroadcastw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kBroadcastU16.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpbroadcastd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kBroadcastU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpbroadcastq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kBroadcastU64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcastss , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kBroadcastF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcastsd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kBroadcastF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcasti32x4, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kBroadcastV128_U32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcasti64x2, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kBroadcastV128_U64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcastf32x4, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kBroadcastV128_F32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcastf64x2, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kBroadcastV128_F64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcasti32x8, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kBroadcastV256_U32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcasti64x4, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kBroadcastV256_U64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcasti32x8, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kBroadcastV256_F32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVbroadcasti64x4, kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kBroadcastV256_F64.
+ DEFINE_OP(kIdPabsb , 2, kSSSE3 , kIdVpabsb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kAbsI8.
+ DEFINE_OP(kIdPabsw , 2, kSSSE3 , kIdVpabsw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kAbsI16.
+ DEFINE_OP(kIdPabsd , 2, kSSSE3 , kIdVpabsd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kAbsI32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpabsq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kAbsI64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kNotU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kNotU64.
+ DEFINE_OP(kIdPmovsxbw , 0, kIntrin, kIdVpmovsxbw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kCvtI8LoToI16.
+ DEFINE_OP(kIdPmovsxbw , 0, kIntrin, kIdVpmovsxbw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kCvtI8HiToI16.
+ DEFINE_OP(kIdPmovzxbw , 0, kIntrin, kIdVpmovzxbw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kCvtU8LoToU16.
+ DEFINE_OP(kIdPmovzxbw , 0, kIntrin, kIdVpmovzxbw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kCvtU8HiToU16.
+ DEFINE_OP(kIdPmovsxbd , 0, kIntrin, kIdVpmovsxbd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtI8ToI32.
+ DEFINE_OP(kIdPmovzxbd , 0, kIntrin, kIdVpmovzxbd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtU8ToU32.
+ DEFINE_OP(kIdPmovsxwd , 0, kIntrin, kIdVpmovsxwd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtI16LoToI32.
+ DEFINE_OP(kIdPmovsxwd , 0, kIntrin, kIdVpmovsxwd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtI16HiToI32.
+ DEFINE_OP(kIdPmovzxwd , 0, kIntrin, kIdVpmovzxwd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtU16LoToU32.
+ DEFINE_OP(kIdPmovzxwd , 0, kIntrin, kIdVpmovzxwd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtU16HiToU32.
+ DEFINE_OP(kIdPmovsxdq , 0, kIntrin, kIdVpmovsxdq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCvtI32LoToI64.
+ DEFINE_OP(kIdPmovsxdq , 0, kIntrin, kIdVpmovsxdq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCvtI32HiToI64.
+ DEFINE_OP(kIdPmovzxdq , 0, kIntrin, kIdVpmovzxdq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCvtU32LoToU64.
+ DEFINE_OP(kIdPmovzxdq , 0, kIntrin, kIdVpmovzxdq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCvtU32HiToU64.
+ DEFINE_OP(kIdAndps , 0, kIntrin, kIdVandps , kIntrin , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kAbsF32S.
+ DEFINE_OP(kIdAndpd , 0, kIntrin, kIdVandpd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kAbsF64S.
+ DEFINE_OP(kIdAndps , 0, kIntrin, kIdVandps , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kAbsF32.
+ DEFINE_OP(kIdAndpd , 0, kIntrin, kIdVandpd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kAbsF64.
+ DEFINE_OP(kIdXorps , 0, kIntrin, kIdVxorps , kIntrin , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kNegF32S.
+ DEFINE_OP(kIdXorpd , 0, kIntrin, kIdVxorpd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kNegF64S.
+ DEFINE_OP(kIdXorps , 0, kIntrin, kIdVxorps , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kNegF32.
+ DEFINE_OP(kIdXorpd , 0, kIntrin, kIdVxorpd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kNegF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kAbsU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kAbsU64.
+ DEFINE_OP(kIdRoundss , 2, kIntrin, kIdVroundss , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF32S, k32, 4, kNA), // kTruncF32S.
+ DEFINE_OP(kIdRoundsd , 2, kIntrin, kIdVroundsd , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF64S, k64, 8, kNA), // kTruncF64S.
+ DEFINE_OP(kIdRoundps , 2, kIntrin, kIdVroundps , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF32V, k32, 4, kNA), // kTruncF32.
+ DEFINE_OP(kIdRoundpd , 2, kIntrin, kIdVroundpd , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF64V, k64, 8, kNA), // kTruncF64.
+ DEFINE_OP(kIdRoundss , 2, kIntrin, kIdVroundss , kIntrin , 0, 0, kNone, 1, 0x09u, kF32S, k32, 4, kNA), // kFloorF32S.
+ DEFINE_OP(kIdRoundsd , 2, kIntrin, kIdVroundsd , kIntrin , 0, 0, kNone, 1, 0x09u, kF64S, k64, 8, kNA), // kFloorF64S.
+ DEFINE_OP(kIdRoundps , 2, kIntrin, kIdVroundps , kIntrin , 0, 0, kNone, 1, 0x09u, kF32V, k32, 4, kNA), // kFloorF32.
+ DEFINE_OP(kIdRoundpd , 2, kIntrin, kIdVroundpd , kIntrin , 0, 0, kNone, 1, 0x09u, kF64V, k64, 8, kNA), // kFloorF64.
+ DEFINE_OP(kIdRoundss , 2, kIntrin, kIdVroundss , kIntrin , 0, 0, kNone, 1, 0x0Au, kF32S, k32, 4, kNA), // kCeilF32S.
+ DEFINE_OP(kIdRoundsd , 2, kIntrin, kIdVroundsd , kIntrin , 0, 0, kNone, 1, 0x0Au, kF64S, k64, 8, kNA), // kCeilF64S.
+ DEFINE_OP(kIdRoundps , 2, kIntrin, kIdVroundps , kIntrin , 0, 0, kNone, 1, 0x0Au, kF32V, k32, 4, kNA), // kCeilF32.
+ DEFINE_OP(kIdRoundpd , 2, kIntrin, kIdVroundpd , kIntrin , 0, 0, kNone, 1, 0x0Au, kF64V, k64, 8, kNA), // kCeilF64.
+ DEFINE_OP(kIdRoundss , 2, kIntrin, kIdVroundss , kIntrin , 0, 0, kNone, 1, 0x08u, kF32S, k32, 4, kNA), // kRoundEvenF32S.
+ DEFINE_OP(kIdRoundsd , 2, kIntrin, kIdVroundsd , kIntrin , 0, 0, kNone, 1, 0x08u, kF64S, k64, 8, kNA), // kRoundEvenF64S.
+ DEFINE_OP(kIdRoundps , 2, kIntrin, kIdVroundps , kIntrin , 0, 0, kNone, 1, 0x08u, kF32V, k32, 4, kNA), // kRoundEvenF32.
+ DEFINE_OP(kIdRoundpd , 2, kIntrin, kIdVroundpd , kIntrin , 0, 0, kNone, 1, 0x08u, kF64V, k64, 8, kNA), // kRoundEvenF64.
+ DEFINE_OP(kIdRoundss , 2, kIntrin, kIdVroundss , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF32S, k32, 4, kNA), // kRoundHalfAwayF32S.
+ DEFINE_OP(kIdRoundsd , 2, kIntrin, kIdVroundsd , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF64S, k64, 8, kNA), // kRoundHalfAwayF64S.
+ DEFINE_OP(kIdRoundps , 2, kIntrin, kIdVroundps , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF32V, k32, 4, kNA), // kRoundHalfAwayF32.
+ DEFINE_OP(kIdRoundpd , 2, kIntrin, kIdVroundpd , kIntrin , 0, 0, kNone, 1, 0x0Bu, kF64V, k64, 8, kNA), // kRoundHalfAwayF64.
+ DEFINE_OP(kIdRoundss , 2, kIntrin, kIdVroundss , kIntrin , 0, 0, kNone, 1, 0x09u, kF32S, k32, 4, kNA), // kRoundHalfUpF32S.
+ DEFINE_OP(kIdRoundsd , 2, kIntrin, kIdVroundsd , kIntrin , 0, 0, kNone, 1, 0x09u, kF64S, k64, 8, kNA), // kRoundHalfUpF64S.
+ DEFINE_OP(kIdRoundps , 2, kIntrin, kIdVroundps , kIntrin , 0, 0, kNone, 1, 0x09u, kF32V, k32, 4, kNA), // kRoundHalfUpF32.
+ DEFINE_OP(kIdRoundpd , 2, kIntrin, kIdVroundpd , kIntrin , 0, 0, kNone, 1, 0x09u, kF64V, k64, 8, kNA), // kRoundHalfUpF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kRcpF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kRcpF64.
+ DEFINE_OP(kIdSqrtss , 2, kIntrin, kIdVsqrtss , kIntrin , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kSqrtF32S.
+ DEFINE_OP(kIdSqrtsd , 2, kIntrin, kIdVsqrtsd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kSqrtF64S.
+ DEFINE_OP(kIdSqrtps , 2, kSSE2 , kIdVsqrtps , kAVX , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kSqrtF32.
+ DEFINE_OP(kIdSqrtpd , 2, kSSE2 , kIdVsqrtpd , kAVX , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kSqrtF64.
+ DEFINE_OP(kIdCvtss2sd , 2, kIntrin, kIdVcvtss2sd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k64, 0, kNA), // kCvtF32ToF64S.
+ DEFINE_OP(kIdCvtsd2ss , 2, kIntrin, kIdVcvtsd2ss , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k32, 0, kNA), // kCvtF64ToF32S.
+ DEFINE_OP(kIdCvtdq2ps , 2, kSSE2 , kIdVcvtdq2ps , kAVX , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kCvtI32ToF32.
+ DEFINE_OP(kIdCvtps2pd , 2, kSSE2 , kIdVcvtps2pd , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k64, 4, kLo), // kCvtF32LoToF64.
+ DEFINE_OP(kIdCvtps2pd , 2, kIntrin, kIdVcvtps2pd , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k64, 4, kHi), // kCvtF32HiToF64.
+ DEFINE_OP(kIdCvtpd2ps , 2, kSSE2 , kIdVcvtpd2ps , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k32, 4, kLo), // kCvtF64ToF32Lo.
+ DEFINE_OP(kIdCvtpd2ps , 2, kIntrin, kIdVcvtpd2ps , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k32, 4, kHi), // kCvtF64ToF32Hi.
+ DEFINE_OP(kIdCvtdq2pd , 2, kSSE2 , kIdVcvtdq2pd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 4, kLo), // kCvtI32LoToF64.
+ DEFINE_OP(kIdCvtdq2pd , 2, kIntrin, kIdVcvtdq2pd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 4, kHi), // kCvtI32HiToF64.
+ DEFINE_OP(kIdCvttps2dq , 2, kSSE2 , kIdVcvttps2dq , kAVX , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kCvtTruncF32ToI32.
+ DEFINE_OP(kIdCvttpd2dq , 2, kSSE2 , kIdVcvttpd2dq , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k32, 4, kLo), // kCvtTruncF64ToI32Lo.
+ DEFINE_OP(kIdCvttpd2dq , 2, kIntrin, kIdVcvttpd2dq , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k32, 4, kHi), // kCvtTruncF64ToI32Hi.
+ DEFINE_OP(kIdCvtps2dq , 2, kSSE2 , kIdVcvtps2dq , kAVX , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kCvtRoundF32ToI32.
+ DEFINE_OP(kIdCvtpd2dq , 2, kSSE2 , kIdVcvtpd2dq , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k32, 4, kLo), // kCvtRoundF64ToI32Lo.
+ DEFINE_OP(kIdCvtpd2dq , 2, kIntrin, kIdVcvtpd2dq , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k32, 4, kHi) // kCvtRoundF64ToI32Hi.
+};
+
+static constexpr UniOpVInfo opcode_info_2vs[size_t(UniOpVR::kMaxValue) + 1] = {
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kMov.
+ DEFINE_OP(kIdMovd , 0, kSSE2 , kIdVmovd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kMovU32.
+ DEFINE_OP(kIdMovq , 0, kSSE2 , kIdVmovq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kMovU64.
+ DEFINE_OP(kIdPinsrb , 0, kSSE4_1, kIdVpinsrb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertU8.
+ DEFINE_OP(kIdPinsrw , 0, kSSE2 , kIdVpinsrw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kInsertU16.
+ DEFINE_OP(kIdPinsrd , 0, kSSE4_1, kIdVpinsrd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kInsertU32.
+ DEFINE_OP(kIdPinsrq , 0, kSSE4_1, kIdVpinsrq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kInsertU64.
+ DEFINE_OP(kIdPextrb , 0, kSSE4_1, kIdVpextrb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kExtractU8.
+ DEFINE_OP(kIdPextrw , 0, kSSE2 , kIdVpextrw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kExtractU16.
+ DEFINE_OP(kIdPextrd , 0, kSSE4_1, kIdVpextrd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kExtractU32.
+ DEFINE_OP(kIdPextrq , 0, kSSE4_1, kIdVpextrq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kExtractU64.
+ DEFINE_OP(kIdCvtsi2ss , 0, kSSE2 , kIdVcvtsi2ss , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtIntToF32.
+ DEFINE_OP(kIdCvtsi2sd , 0, kSSE2 , kIdVcvtsi2sd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCvtIntToF64.
+ DEFINE_OP(kIdCvttss2si , 0, kSSE2 , kIdVcvttss2si , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtTruncF32ToInt.
+ DEFINE_OP(kIdCvtss2si , 0, kSSE2 , kIdVcvtss2si , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kCvtRoundF32ToInt.
+ DEFINE_OP(kIdCvttsd2si , 0, kSSE2 , kIdVcvttsd2si , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCvtTruncF64ToInt.
+ DEFINE_OP(kIdCvtsd2si , 0, kSSE2 , kIdVcvtsd2si , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA) // kCvtRoundF64ToInt.
+};
+
+static constexpr UniOpVInfo opcode_info_2vi[size_t(UniOpVVI::kMaxValue) + 1] = {
+ DEFINE_OP(kIdPsllw , 2, kSSE2 , kIdVpsllw , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSllU16.
+ DEFINE_OP(kIdPslld , 2, kSSE2 , kIdVpslld , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kSllU32.
+ DEFINE_OP(kIdPsllq , 2, kSSE2 , kIdVpsllq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kSllU64.
+ DEFINE_OP(kIdPsrlw , 2, kSSE2 , kIdVpsrlw , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSrlU16.
+ DEFINE_OP(kIdPsrld , 2, kSSE2 , kIdVpsrld , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kSrlU32.
+ DEFINE_OP(kIdPsrlq , 2, kSSE2 , kIdVpsrlq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kSrlU64.
+ DEFINE_OP(kIdPsraw , 2, kSSE2 , kIdVpsraw , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSraI16.
+ DEFINE_OP(kIdPsrad , 2, kSSE2 , kIdVpsrad , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kSraI32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpsraq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kSraI64.
+ DEFINE_OP(kIdPslldq , 2, kSSE2 , kIdVpslldq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kSllbU128.
+ DEFINE_OP(kIdPsrldq , 2, kSSE2 , kIdVpsrldq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kSrlbU128.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSwizzleU16x4 (intrin).
+ DEFINE_OP(kIdPshuflw , 3, kIntrin, kIdVpshuflw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSwizzleLoU16x4.
+ DEFINE_OP(kIdPshufhw , 3, kIntrin, kIdVpshufhw , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSwizzleHiU16x4.
+ DEFINE_OP(kIdPshufd , 3, kIntrin, kIdVpshufd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kSwizzleU32x4.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kSwizzleU64x2 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k32, 0, kNA), // kSwizzleF32x4 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 0, kNA), // kSwizzleF64x2 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpermq , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kSwizzleU64x4 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpermq , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 0, kNA), // kSwizzleF64x4 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kExtractV128_I32 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kExtractV128_I64 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k64, 0, kNA), // kExtractV128_F32 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 0, kNA), // kExtractV128_F64 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kExtractV256_I32 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kExtractV256_I64 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k64, 0, kNA), // kExtractV256_F32 (intrin).
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 0, kNA) // kExtractV256_F64 (intrin).
+};
+
+static constexpr UniOpVInfo opcode_info_3v[size_t(UniOpVVV::kMaxValue) + 1] = {
+ DEFINE_OP(kIdPand , 2, kSSE2 , kIdVpandd , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k32, 4, kNA), // kAndU32.
+ DEFINE_OP(kIdPand , 2, kSSE2 , kIdVpandq , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k64, 8, kNA), // kAndU64.
+ DEFINE_OP(kIdPor , 2, kSSE2 , kIdVpord , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k32, 4, kNA), // kOrU32.
+ DEFINE_OP(kIdPor , 2, kSSE2 , kIdVporq , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k64, 8, kNA), // kOrU64.
+ DEFINE_OP(kIdPxor , 2, kSSE2 , kIdVpxord , kAVX , 1, 0, kZero, 0, 0x00u, kNone, k32, 4, kNA), // kXorU32.
+ DEFINE_OP(kIdPxor , 2, kSSE2 , kIdVpxorq , kAVX , 1, 0, kZero, 0, 0x00u, kNone, k64, 8, kNA), // kXorU64.
+ DEFINE_OP(kIdPandn , 2, kSSE2 , kIdVpandnd , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k32, 4, kNA), // kAndnU32.
+ DEFINE_OP(kIdPandn , 2, kSSE2 , kIdVpandnq , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k64, 8, kNA), // kAndnU64.
+ DEFINE_OP(kIdPandn , 0, kIntrin, kIdVpandnd , kIntrin , 0, 0, kZero, 0, 0x00u, kNone, k32, 4, kNA), // kBicU32.
+ DEFINE_OP(kIdPandn , 0, kIntrin, kIdVpandnq , kIntrin , 0, 0, kZero, 0, 0x00u, kNone, k64, 8, kNA), // kBicU64.
+ DEFINE_OP(kIdPavgb , 2, kSSE2 , kIdVpavgb , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k8 , 0, kNA), // kAvgrU8.
+ DEFINE_OP(kIdPavgw , 2, kSSE2 , kIdVpavgw , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k16, 0, kNA), // kAvgrU16.
+ DEFINE_OP(kIdPaddb , 2, kSSE2 , kIdVpaddb , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kAddU8.
+ DEFINE_OP(kIdPaddw , 2, kSSE2 , kIdVpaddw , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kAddU16.
+ DEFINE_OP(kIdPaddd , 2, kSSE2 , kIdVpaddd , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kAddU32.
+ DEFINE_OP(kIdPaddq , 2, kSSE2 , kIdVpaddq , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kAddU64.
+ DEFINE_OP(kIdPsubb , 2, kSSE2 , kIdVpsubb , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k8 , 0, kNA), // kSubU8.
+ DEFINE_OP(kIdPsubw , 2, kSSE2 , kIdVpsubw , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k16, 0, kNA), // kSubU16.
+ DEFINE_OP(kIdPsubd , 2, kSSE2 , kIdVpsubd , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k32, 4, kNA), // kSubU32.
+ DEFINE_OP(kIdPsubq , 2, kSSE2 , kIdVpsubq , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k64, 8, kNA), // kSubU64.
+ DEFINE_OP(kIdPaddsb , 2, kSSE2 , kIdVpaddsb , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kAddsI8.
+ DEFINE_OP(kIdPaddusb , 2, kSSE2 , kIdVpaddusb , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kAddsU8.
+ DEFINE_OP(kIdPaddsw , 2, kSSE2 , kIdVpaddsw , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kAddsI16.
+ DEFINE_OP(kIdPaddusw , 2, kSSE2 , kIdVpaddusw , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kAddsU16.
+ DEFINE_OP(kIdPsubsb , 2, kSSE2 , kIdVpsubsb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kSubsI8.
+ DEFINE_OP(kIdPsubusb , 2, kSSE2 , kIdVpsubusb , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k8 , 0, kNA), // kSubsU8.
+ DEFINE_OP(kIdPsubsw , 2, kSSE2 , kIdVpsubsw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kSubsI16.
+ DEFINE_OP(kIdPsubusw , 2, kSSE2 , kIdVpsubusw , kAVX , 0, 0, kZero, 0, 0x00u, kNone, k16, 0, kNA), // kSubsU16.
+ DEFINE_OP(kIdPmullw , 2, kSSE2 , kIdVpmullw , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kMulU16.
+ DEFINE_OP(kIdPmulld , 2, kSSE4_1, kIdVpmulld , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kMulU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpmullq , kAVX512 , 1, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kMulU64.
+ DEFINE_OP(kIdPmulhw , 2, kSSE2 , kIdVpmulhw , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kMulhI16.
+ DEFINE_OP(kIdPmulhuw , 2, kSSE2 , kIdVpmulhuw , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kMulhU16.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kMulU64_LoU32.
+ DEFINE_OP(kIdPmaddwd , 2, kSSE2 , kIdVpmaddwd , kAVX , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kMHAddI16_I32.
+ DEFINE_OP(kIdPminsb , 2, kSSE4_1, kIdVpminsb , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k8 , 0, kNA), // kMinI8.
+ DEFINE_OP(kIdPminub , 2, kSSE2 , kIdVpminub , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k8 , 0, kNA), // kMinU8.
+ DEFINE_OP(kIdPminsw , 2, kSSE2 , kIdVpminsw , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k16, 0, kNA), // kMinI16.
+ DEFINE_OP(kIdPminuw , 2, kSSE4_1, kIdVpminuw , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k16, 0, kNA), // kMinU16.
+ DEFINE_OP(kIdPminsd , 2, kSSE4_1, kIdVpminsd , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k32, 4, kNA), // kMinI32.
+ DEFINE_OP(kIdPminud , 2, kSSE4_1, kIdVpminud , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k32, 4, kNA), // kMinU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpminsq , kAVX512 , 1, 0, kSrc , 0, 0x00u, kNone, k64, 8, kNA), // kMinI64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpminuq , kAVX512 , 1, 0, kSrc , 0, 0x00u, kNone, k64, 8, kNA), // kMinU64.
+ DEFINE_OP(kIdPmaxsb , 2, kSSE4_1, kIdVpmaxsb , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k8 , 0, kNA), // kMaxI8.
+ DEFINE_OP(kIdPmaxub , 2, kSSE2 , kIdVpmaxub , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k8 , 0, kNA), // kMaxU8.
+ DEFINE_OP(kIdPmaxsw , 2, kSSE2 , kIdVpmaxsw , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k16, 0, kNA), // kMaxI16.
+ DEFINE_OP(kIdPmaxuw , 2, kSSE4_1, kIdVpmaxuw , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k16, 0, kNA), // kMaxU16.
+ DEFINE_OP(kIdPmaxsd , 2, kSSE4_1, kIdVpmaxsd , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k32, 4, kNA), // kMaxI32.
+ DEFINE_OP(kIdPmaxud , 2, kSSE4_1, kIdVpmaxud , kAVX , 1, 0, kSrc , 0, 0x00u, kNone, k32, 4, kNA), // kMaxU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpmaxsq , kAVX512 , 1, 0, kSrc , 0, 0x00u, kNone, k64, 8, kNA), // kMaxI64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpmaxuq , kAVX512 , 1, 0, kSrc , 0, 0x00u, kNone, k64, 8, kNA), // kMaxU64.
+ DEFINE_OP(kIdPcmpeqb , 2, kSSE2 , kIdVpcmpeqb , kAVX , 1, 1, kOnes, 0, 0x00u, kNone, k8 , 0, kNA), // kCmpEqU8.
+ DEFINE_OP(kIdPcmpeqw , 2, kSSE2 , kIdVpcmpeqw , kAVX , 1, 1, kOnes, 0, 0x00u, kNone, k16, 0, kNA), // kCmpEqU16.
+ DEFINE_OP(kIdPcmpeqd , 2, kSSE2 , kIdVpcmpeqd , kAVX , 1, 1, kOnes, 0, 0x00u, kNone, k32, 4, kNA), // kCmpEqU32.
+ DEFINE_OP(kIdPcmpeqq , 2, kSSE4_1, kIdVpcmpeqq , kAVX , 1, 1, kOnes, 0, 0x00u, kNone, k64, 8, kNA), // kCmpEqU64.
+ DEFINE_OP(kIdPcmpgtb , 2, kSSE2 , kIdVpcmpgtb , kAVX , 0, 1, kZero, 0, 0x00u, kNone, k8 , 0, kNA), // kCmpGtI8.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpub , kAVX512 , 0, 1, kZero, 1, 0x06u, kNone, k8 , 0, kNA), // kCmpGtU8.
+ DEFINE_OP(kIdPcmpgtw , 2, kSSE2 , kIdVpcmpgtw , kAVX , 0, 1, kZero, 0, 0x00u, kNone, k16, 0, kNA), // kCmpGtI16.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpuw , kAVX512 , 0, 1, kZero, 1, 0x06u, kNone, k16, 0, kNA), // kCmpGtU16.
+ DEFINE_OP(kIdPcmpgtd , 2, kSSE2 , kIdVpcmpgtd , kAVX , 0, 1, kZero, 0, 0x00u, kNone, k32, 4, kNA), // kCmpGtI32.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpud , kAVX512 , 0, 1, kZero, 1, 0x06u, kNone, k32, 4, kNA), // kCmpGtU32.
+ DEFINE_OP(kIdPcmpgtq , 2, kSSE4_2, kIdVpcmpgtq , kAVX , 0, 1, kZero, 0, 0x00u, kNone, k64, 8, kNA), // kCmpGtI64.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpuq , kAVX512 , 0, 1, kZero, 1, 0x06u, kNone, k64, 8, kNA), // kCmpGtU64.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpb , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k8 , 0, kNA), // kCmpGeI8.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpub , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k8 , 0, kNA), // kCmpGeU8.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpw , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k16, 0, kNA), // kCmpGeI16.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpuw , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k16, 0, kNA), // kCmpGeU16.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpd , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k32, 4, kNA), // kCmpGeI32.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpud , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k32, 4, kNA), // kCmpGeU32.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpq , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k64, 8, kNA), // kCmpGeI64.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpuq , kAVX512 , 0, 1, kOnes, 1, 0x05u, kNone, k64, 8, kNA), // kCmpGeU64.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpb , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k8 , 0, kNA), // kCmpLtI8.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpub , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k8 , 0, kNA), // kCmpLtU8.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpw , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k16, 0, kNA), // kCmpLtI16.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpuw , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k16, 0, kNA), // kCmpLtU16.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpd , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k32, 4, kNA), // kCmpLtI32.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpud , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k32, 4, kNA), // kCmpLtU32.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpq , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k64, 8, kNA), // kCmpLtI64.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpuq , kAVX512 , 0, 1, kZero, 1, 0x01u, kNone, k64, 8, kNA), // kCmpLtU64.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpb , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k8 , 0, kNA), // kCmpLeI8.
+ DEFINE_OP(kIdPcmpgtb , 0, kIntrin, kIdVpcmpub , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k8 , 0, kNA), // kCmpLeU8.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpw , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k16, 0, kNA), // kCmpLeI16.
+ DEFINE_OP(kIdPcmpgtw , 0, kIntrin, kIdVpcmpuw , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k16, 0, kNA), // kCmpLeU16.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpd , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k32, 4, kNA), // kCmpLeI32.
+ DEFINE_OP(kIdPcmpgtd , 0, kIntrin, kIdVpcmpud , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k32, 4, kNA), // kCmpLeU32.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpq , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k64, 8, kNA), // kCmpLeI64.
+ DEFINE_OP(kIdPcmpgtq , 0, kIntrin, kIdVpcmpuq , kAVX512 , 0, 1, kOnes, 1, 0x02u, kNone, k64, 8, kNA), // kCmpLeU64.
+ DEFINE_OP(kIdAndps , 2, kSSE2 , kIdVandps , kAVX , 1, 0, kSrc , 0, 0x00u, kF32V, k32, 4, kNA), // kAndF32.
+ DEFINE_OP(kIdAndpd , 2, kSSE2 , kIdVandpd , kAVX , 1, 0, kSrc , 0, 0x00u, kF64V, k64, 8, kNA), // kAndF64.
+ DEFINE_OP(kIdOrps , 2, kSSE2 , kIdVorps , kAVX , 1, 0, kSrc , 0, 0x00u, kF32V, k32, 4, kNA), // kOrF32.
+ DEFINE_OP(kIdOrpd , 2, kSSE2 , kIdVorpd , kAVX , 1, 0, kSrc , 0, 0x00u, kF64V, k64, 8, kNA), // kOrF64.
+ DEFINE_OP(kIdXorps , 2, kSSE2 , kIdVxorps , kAVX , 1, 0, kZero, 0, 0x00u, kF32V, k32, 4, kNA), // kXorF32.
+ DEFINE_OP(kIdXorpd , 2, kSSE2 , kIdVxorpd , kAVX , 1, 0, kZero, 0, 0x00u, kF64V, k64, 8, kNA), // kXorF64.
+ DEFINE_OP(kIdAndnps , 2, kSSE2 , kIdVandnps , kAVX , 0, 0, kZero, 0, 0x00u, kF32V, k32, 4, kNA), // kAndnF32.
+ DEFINE_OP(kIdAndnpd , 2, kSSE2 , kIdVandnpd , kAVX , 0, 0, kZero, 0, 0x00u, kF64V, k64, 8, kNA), // kAndnF64.
+ DEFINE_OP(kIdAndnps , 0, kIntrin, kIdVandnps , kIntrin , 0, 0, kZero, 0, 0x00u, kF32V, k32, 4, kNA), // kBicF32.
+ DEFINE_OP(kIdAndnpd , 0, kIntrin, kIdVandnpd , kIntrin , 0, 0, kZero, 0, 0x00u, kF64V, k64, 8, kNA), // kBicF64.
+ DEFINE_OP(kIdAddss , 2, kSSE2 , kIdVaddss , kAVX , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kAddF32S.
+ DEFINE_OP(kIdAddsd , 2, kSSE2 , kIdVaddsd , kAVX , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kAddF64S.
+ DEFINE_OP(kIdAddps , 2, kSSE2 , kIdVaddps , kAVX , 1, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kAddF32.
+ DEFINE_OP(kIdAddpd , 2, kSSE2 , kIdVaddpd , kAVX , 1, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kAddF64.
+ DEFINE_OP(kIdSubss , 2, kSSE2 , kIdVsubss , kAVX , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kSubF32S.
+ DEFINE_OP(kIdSubsd , 2, kSSE2 , kIdVsubsd , kAVX , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kSubF64S.
+ DEFINE_OP(kIdSubps , 2, kSSE2 , kIdVsubps , kAVX , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kSubF32.
+ DEFINE_OP(kIdSubpd , 2, kSSE2 , kIdVsubpd , kAVX , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kSubF64.
+ DEFINE_OP(kIdMulss , 2, kSSE2 , kIdVmulss , kAVX , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kMulF32S.
+ DEFINE_OP(kIdMulsd , 2, kSSE2 , kIdVmulsd , kAVX , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kMulF64S.
+ DEFINE_OP(kIdMulps , 2, kSSE2 , kIdVmulps , kAVX , 1, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kMulF32.
+ DEFINE_OP(kIdMulpd , 2, kSSE2 , kIdVmulpd , kAVX , 1, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kMulF64.
+ DEFINE_OP(kIdDivss , 2, kSSE2 , kIdVdivss , kAVX , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kDivF32S.
+ DEFINE_OP(kIdDivsd , 2, kSSE2 , kIdVdivsd , kAVX , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kDivF64S.
+ DEFINE_OP(kIdDivps , 2, kSSE2 , kIdVdivps , kAVX , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kDivF32.
+ DEFINE_OP(kIdDivpd , 2, kSSE2 , kIdVdivpd , kAVX , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kDivF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kModF32S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kModF64S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kModF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kModF64.
+ DEFINE_OP(kIdMinss , 2, kSSE2 , kIdVminss , kAVX , 0, 0, kSrc , 0, 0x00u, kF32S, k32, 4, kNA), // kMinF32S.
+ DEFINE_OP(kIdMinsd , 2, kSSE2 , kIdVminsd , kAVX , 0, 0, kSrc , 0, 0x00u, kF64S, k64, 8, kNA), // kMinF64S.
+ DEFINE_OP(kIdMinps , 2, kSSE2 , kIdVminps , kAVX , 0, 0, kSrc , 0, 0x00u, kF32V, k32, 4, kNA), // kMinF32.
+ DEFINE_OP(kIdMinpd , 2, kSSE2 , kIdVminpd , kAVX , 0, 0, kSrc , 0, 0x00u, kF64V, k64, 8, kNA), // kMinF64.
+ DEFINE_OP(kIdMaxss , 2, kSSE2 , kIdVmaxss , kAVX , 0, 0, kSrc , 0, 0x00u, kF32S, k32, 4, kNA), // kMaxF32S.
+ DEFINE_OP(kIdMaxsd , 2, kSSE2 , kIdVmaxsd , kAVX , 0, 0, kSrc , 0, 0x00u, kF64S, k64, 8, kNA), // kMaxF64S.
+ DEFINE_OP(kIdMaxps , 2, kSSE2 , kIdVmaxps , kAVX , 0, 0, kSrc , 0, 0x00u, kF32V, k32, 4, kNA), // kMaxF32.
+ DEFINE_OP(kIdMaxpd , 2, kSSE2 , kIdVmaxpd , kAVX , 0, 0, kSrc , 0, 0x00u, kF64V, k64, 8, kNA), // kMaxF64.
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 1, 1, kNone, 1, 0x00u, kF32S, k32, 4, kNA), // kCmpEqF32S (eq ordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 1, 1, kNone, 1, 0x00u, kF64S, k64, 8, kNA), // kCmpEqF64S (eq ordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 1, 1, kNone, 1, 0x00u, kF32V, k32, 4, kNA), // kCmpEqF32 (eq ordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 1, 1, kNone, 1, 0x00u, kF64V, k64, 8, kNA), // kCmpEqF64 (eq ordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 1, 1, kNone, 1, 0x04u, kF32S, k32, 4, kNA), // kCmpNeF32S (ne unordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 1, 1, kNone, 1, 0x04u, kF64S, k64, 8, kNA), // kCmpNeF64S (ne unordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 1, 1, kNone, 1, 0x04u, kF32V, k32, 4, kNA), // kCmpNeF32 (ne unordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 1, 1, kNone, 1, 0x04u, kF64V, k64, 8, kNA), // kCmpNeF64 (ne unordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 0, 1, kNone, 1, 0x1Eu, kF32S, k32, 4, kNA), // kCmpGtF32S (gt ordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 0, 1, kNone, 1, 0x1Eu, kF64S, k64, 8, kNA), // kCmpGtF64S (gt ordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 0, 1, kNone, 1, 0x1Eu, kF32V, k32, 4, kNA), // kCmpGtF32 (gt ordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 0, 1, kNone, 1, 0x1Eu, kF64V, k64, 8, kNA), // kCmpGtF64 (gt ordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 0, 1, kNone, 1, 0x1Du, kF32S, k32, 4, kNA), // kCmpGeF32S (ge ordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 0, 1, kNone, 1, 0x1Du, kF64S, k64, 8, kNA), // kCmpGeF64S (ge ordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 0, 1, kNone, 1, 0x1Du, kF32V, k32, 4, kNA), // kCmpGeF32 (ge ordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 0, 1, kNone, 1, 0x1Du, kF64V, k64, 8, kNA), // kCmpGeF64 (ge ordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 0, 1, kNone, 1, 0x11u, kF32S, k32, 4, kNA), // kCmpLtF32S (lt ordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 0, 1, kNone, 1, 0x11u, kF64S, k64, 8, kNA), // kCmpLtF64S (lt ordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 0, 1, kNone, 1, 0x11u, kF32V, k32, 4, kNA), // kCmpLtF32 (lt ordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 0, 1, kNone, 1, 0x11u, kF64V, k64, 8, kNA), // kCmpLtF64 (lt ordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 0, 1, kNone, 1, 0x12u, kF32S, k32, 4, kNA), // kCmpLeF32S (le ordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 0, 1, kNone, 1, 0x12u, kF64S, k64, 8, kNA), // kCmpLeF64S (le ordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 0, 1, kNone, 1, 0x12u, kF32V, k32, 4, kNA), // kCmpLeF32 (le ordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 0, 1, kNone, 1, 0x12u, kF64V, k64, 8, kNA), // kCmpLeF64 (le ordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 1, 1, kNone, 1, 0x07u, kF32S, k32, 4, kNA), // kCmpOrdF32S (ordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 1, 1, kNone, 1, 0x07u, kF64S, k64, 8, kNA), // kCmpOrdF64S (ordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 1, 1, kNone, 1, 0x07u, kF32V, k32, 4, kNA), // kCmpOrdF32 (ordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 1, 1, kNone, 1, 0x07u, kF64V, k64, 8, kNA), // kCmpOrdF64 (ordered quiet).
+ DEFINE_OP(kIdCmpss , 2, kIntrin, kIdVcmpss , kAVX , 1, 1, kNone, 1, 0x03u, kF32S, k32, 4, kNA), // kCmpUnordF32S (unordered quiet).
+ DEFINE_OP(kIdCmpsd , 2, kIntrin, kIdVcmpsd , kAVX , 1, 1, kNone, 1, 0x03u, kF64S, k64, 8, kNA), // kCmpUnordF64S (unordered quiet).
+ DEFINE_OP(kIdCmpps , 2, kIntrin, kIdVcmpps , kAVX , 1, 1, kNone, 1, 0x03u, kF32V, k32, 4, kNA), // kCmpUnordF32 (unordered quiet).
+ DEFINE_OP(kIdCmppd , 2, kIntrin, kIdVcmppd , kAVX , 1, 1, kNone, 1, 0x03u, kF64V, k64, 8, kNA), // kCmpUnordF64 (unordered quiet).
+ DEFINE_OP(kIdHaddpd , 2, kSSE3 , kIdVhaddpd , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 0, kNA), // kHAddF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCombineLoHiU64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA), // kCombineLoHiF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kSrc , 0, 0x00u, kNone, k64, 0, kNA), // kCombineHiLoU64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kSrc , 0, 0x00u, kNone, k64, 0, kNA), // kCombineHiLoF64.
+ DEFINE_OP(kIdPunpcklbw , 2, kSSE2 , kIdVpunpcklbw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kLo), // kInterleaveLoU8.
+ DEFINE_OP(kIdPunpckhbw , 2, kSSE2 , kIdVpunpckhbw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kHi), // kInterleaveHiU8.
+ DEFINE_OP(kIdPunpcklwd , 2, kSSE2 , kIdVpunpcklwd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kLo), // kInterleaveLoU16.
+ DEFINE_OP(kIdPunpckhwd , 2, kSSE2 , kIdVpunpckhwd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kHi), // kInterleaveHiU16.
+ DEFINE_OP(kIdPunpckldq , 2, kSSE2 , kIdVpunpckldq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kLo), // kInterleaveLoU32.
+ DEFINE_OP(kIdPunpckhdq , 2, kSSE2 , kIdVpunpckhdq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kHi), // kInterleaveHiU32.
+ DEFINE_OP(kIdPunpcklqdq , 2, kSSE2 , kIdVpunpcklqdq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kLo), // kInterleaveLoU64.
+ DEFINE_OP(kIdPunpckhqdq , 2, kSSE2 , kIdVpunpckhqdq , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kHi), // kInterleaveHiU64.
+ DEFINE_OP(kIdUnpcklps , 2, kSSE2 , kIdVunpcklps , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kLo), // kInterleaveLoF32.
+ DEFINE_OP(kIdUnpckhps , 2, kSSE2 , kIdVunpckhps , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kHi), // kInterleaveHiF32.
+ DEFINE_OP(kIdUnpcklpd , 2, kSSE2 , kIdVunpcklpd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kLo), // kInterleaveLoF64.
+ DEFINE_OP(kIdUnpckhpd , 2, kSSE2 , kIdVunpckhpd , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kHi), // kInterleaveHiF64.
+ DEFINE_OP(kIdPacksswb , 2, kSSE2 , kIdVpacksswb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kPacksI16_I8.
+ DEFINE_OP(kIdPackuswb , 2, kSSE2 , kIdVpackuswb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kPacksI16_U8.
+ DEFINE_OP(kIdPackssdw , 2, kSSE2 , kIdVpackssdw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kPacksI32_I16.
+ DEFINE_OP(kIdPackusdw , 2, kSSE4_1, kIdVpackusdw , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kPacksI32_U16.
+ DEFINE_OP(kIdPshufb , 2, kSSSE3 , kIdVpshufb , kAVX , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kSwizzlev_U8.
+
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpermb , kAVX512_VBMI, 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kPermuteU8.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpermw , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kPermuteU16.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpermd , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k32, 0, kNA), // kPermuteU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVpermq , kAVX512 , 0, 0, kNone, 0, 0x00u, kNone, k64, 0, kNA) // kPermuteU64.
+};
+
+static constexpr UniOpVInfo opcode_info_3vi[size_t(UniOpVVVI::kMaxValue) + 1] = {
+ DEFINE_OP(kIdPalignr , 2, kIntrin, kIdVpalignr , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kAlignr_U128.
+ DEFINE_OP(kIdShufps , 2, kIntrin, kIdVshufps , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kInterleaveShuffleU32x4.
+ DEFINE_OP(kIdShufpd , 2, kIntrin, kIdVshufpd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kInterleaveShuffleU64x2.
+ DEFINE_OP(kIdShufps , 2, kIntrin, kIdVshufps , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kInterleaveShuffleF32x4.
+ DEFINE_OP(kIdShufpd , 2, kIntrin, kIdVshufpd , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k64, 8, kNA), // kInterleaveShuffleF64x2.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinserti32x4 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV128_U32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinserti64x2 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV128_F32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinsertf32x4 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV128_U64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinsertf64x2 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV128_F64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinserti32x8 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV256_U32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinsertf32x8 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV256_F32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinserti64x4 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kInsertV256_U64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdVinsertf64x4 , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA) // kInsertV256_F64.
+};
+
+static constexpr UniOpVInfo opcode_info_4v[size_t(UniOpVVV::kMaxValue) + 1] = {
+ DEFINE_OP(kIdPblendvb , 0, kIntrin, kIdVpblendvb , kIntrin , 0, 0, kNone, 0, 0x00u, kNone, k8 , 0, kNA), // kBlendV_U8.
+ DEFINE_OP(kIdPmullw , 0, kIntrin, kIdVpmullw , kIntrin , 1, 0, kNone, 0, 0x00u, kNone, k16, 0, kNA), // kMAddU16.
+ DEFINE_OP(kIdPmulld , 0, kIntrin, kIdVpmulld , kIntrin , 1, 0, kNone, 0, 0x00u, kNone, k32, 4, kNA), // kMAddU32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32S, k32, 4, kNA), // kMAddF32S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64S, k64, 8, kNA), // kMAddF64S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF32V, k32, 4, kNA), // kMAddF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x00u, kF64V, k64, 8, kNA), // kMAddF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x01u, kF32S, k32, 4, kNA), // kMSubF32S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x01u, kF64S, k64, 8, kNA), // kMSubF64S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x01u, kF32V, k32, 4, kNA), // kMSubF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x01u, kF64V, k64, 8, kNA), // kMSubF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x02u, kF32S, k32, 4, kNA), // kNMAddF32S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x02u, kF64S, k64, 8, kNA), // kNMAddF64S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x02u, kF32V, k32, 4, kNA), // kNMAddF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x02u, kF64V, k64, 8, kNA), // kNMAddF64.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x03u, kF32S, k32, 4, kNA), // kNMSubF32S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x03u, kF64S, k64, 8, kNA), // kNMSubF64S.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x03u, kF32V, k32, 4, kNA), // kNMSubF32.
+ DEFINE_OP(kIdNone , 0, kIntrin, kIdNone , kIntrin , 0, 0, kNone, 0, 0x03u, kF64V, k64, 8, kNA) // kNMSubF64.
+};
+
+#undef DEFINE_OP
+
+struct UniOpVMInfo {
+ //! \name Members
+ //! \{
+
+ uint32_t sse_inst_id : 13;
+ uint32_t avx_inst_id : 13;
+ uint32_t reserved1 : 6;
+ uint32_t cvt : 5;
+ uint32_t mem_size : 8;
+ uint32_t mem_size_shift : 3;
+ uint32_t reserved2 : 3;
+
+ //! \}
+};
+
+#define DEFINE_OP(sse_inst_id, avx_inst_id, cvt, mem_size, mem_size_shift) \
+ UniOpVMInfo { \
+ Inst::sse_inst_id, \
+ Inst::avx_inst_id, \
+ 0, \
+ uint8_t(WideningOp::cvt), \
+ mem_size, \
+ mem_size_shift, \
+ 0 \
+ }
+
+static constexpr UniOpVMInfo opcode_info_2vm[size_t(UniOpVM::kMaxValue) + 1] = {
+ DEFINE_OP(kIdNone , kIdNone , kNone , 1, 0), // kLoad8.
+ DEFINE_OP(kIdNone , kIdVmovsh , kNone , 2, 0), // kLoad16_U16.
+ DEFINE_OP(kIdMovd , kIdVmovd , kNone , 4, 0), // kLoad32_U32.
+ DEFINE_OP(kIdMovss , kIdVmovss , kNone , 4, 0), // kLoad32_F32.
+ DEFINE_OP(kIdMovq , kIdVmovq , kNone , 8, 0), // kLoad64_U32.
+ DEFINE_OP(kIdMovq , kIdVmovq , kNone , 8, 0), // kLoad64_U64.
+ DEFINE_OP(kIdMovq , kIdVmovq , kNone , 8, 0), // kLoad64_F32.
+ DEFINE_OP(kIdMovsd , kIdVmovsd , kNone , 8, 0), // kLoad64_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kLoad128_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kLoad128_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kLoad128_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kLoad128_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kLoad256_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kLoad256_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kLoad256_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kLoad256_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kLoad512_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kLoad512_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kLoad512_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kLoad512_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kLoadN_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kLoadN_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kLoadN_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kLoadN_F64.
+ DEFINE_OP(kIdPmovzxbq , kIdVpmovzxbq , kU8ToU64 , 2, 3), // kLoadCvt16_U8ToU64.
+ DEFINE_OP(kIdPmovzxbq , kIdVpmovzxbq , kU8ToU64 , 4, 3), // kLoadCvt32_U8ToU64.
+ DEFINE_OP(kIdPmovzxbq , kIdVpmovzxbq , kU8ToU64 , 8, 3), // kLoadCvt64_U8ToU64.
+ DEFINE_OP(kIdPmovsxbw , kIdVpmovsxbw , kI8ToI16 , 4, 1), // kLoadCvt32_I8ToI16.
+ DEFINE_OP(kIdPmovzxbw , kIdVpmovzxbw , kU8ToU16 , 4, 1), // kLoadCvt32_U8ToU16.
+ DEFINE_OP(kIdPmovsxbd , kIdVpmovsxbd , kI8ToI32 , 4, 2), // kLoadCvt32_I8ToI32.
+ DEFINE_OP(kIdPmovzxbd , kIdVpmovzxbd , kU8ToU32 , 4, 2), // kLoadCvt32_U8ToU32.
+ DEFINE_OP(kIdPmovsxwd , kIdVpmovsxwd , kI16ToI32, 4, 1), // kLoadCvt32_I16ToI32.
+ DEFINE_OP(kIdPmovzxwd , kIdVpmovzxwd , kU16ToU32, 4, 1), // kLoadCvt32_U16ToU32.
+ DEFINE_OP(kIdPmovsxdq , kIdVpmovsxdq , kI32ToI64, 4, 1), // kLoadCvt32_I32ToI64.
+ DEFINE_OP(kIdPmovzxdq , kIdVpmovzxdq , kU32ToU64, 4, 1), // kLoadCvt32_U32ToU64.
+ DEFINE_OP(kIdPmovsxbw , kIdVpmovsxbw , kI8ToI16 , 8, 1), // kLoadCvt64_I8ToI16.
+ DEFINE_OP(kIdPmovzxbw , kIdVpmovzxbw , kU8ToU16 , 8, 1), // kLoadCvt64_U8ToU16.
+ DEFINE_OP(kIdPmovsxbd , kIdVpmovsxbd , kI8ToI32 , 8, 2), // kLoadCvt64_I8ToI32.
+ DEFINE_OP(kIdPmovzxbd , kIdVpmovzxbd , kU8ToU32 , 8, 2), // kLoadCvt64_U8ToU32.
+ DEFINE_OP(kIdPmovsxwd , kIdVpmovsxwd , kI16ToI32, 8, 1), // kLoadCvt64_I16ToI32.
+ DEFINE_OP(kIdPmovzxwd , kIdVpmovzxwd , kU16ToU32, 8, 1), // kLoadCvt64_U16ToU32.
+ DEFINE_OP(kIdPmovsxdq , kIdVpmovsxdq , kI32ToI64, 8, 1), // kLoadCvt64_I32ToI64.
+ DEFINE_OP(kIdPmovzxdq , kIdVpmovzxdq , kU32ToU64, 8, 1), // kLoadCvt64_U32ToU64.
+ DEFINE_OP(kIdNone , kIdVpmovsxbw , kI8ToI16 , 16, 3), // kLoadCvt128_I8ToI16.
+ DEFINE_OP(kIdNone , kIdVpmovzxbw , kU8ToU16 , 16, 3), // kLoadCvt128_U8ToU16.
+ DEFINE_OP(kIdNone , kIdVpmovsxbd , kI8ToI32 , 16, 2), // kLoadCvt128_I8ToI32.
+ DEFINE_OP(kIdNone , kIdVpmovzxbd , kU8ToU32 , 16, 2), // kLoadCvt128_U8ToU32.
+ DEFINE_OP(kIdNone , kIdVpmovsxwd , kI16ToI32, 16, 1), // kLoadCvt128_I16ToI32.
+ DEFINE_OP(kIdNone , kIdVpmovzxwd , kU16ToU32, 16, 1), // kLoadCvt128_U16ToU32.
+ DEFINE_OP(kIdNone , kIdVpmovsxdq , kI32ToI64, 16, 1), // kLoadCvt128_I32ToI64.
+ DEFINE_OP(kIdNone , kIdVpmovzxdq , kU32ToU64, 16, 1), // kLoadCvt128_U32ToU64.
+ DEFINE_OP(kIdNone , kIdVpmovsxbw , kI8ToI16 , 32, 1), // kLoadCvt256_I8ToI16.
+ DEFINE_OP(kIdNone , kIdVpmovzxbw , kU8ToU16 , 32, 1), // kLoadCvt256_U8ToU16.
+ DEFINE_OP(kIdNone , kIdVpmovsxwd , kI16ToI32, 32, 1), // kLoadCvt256_I16ToI32.
+ DEFINE_OP(kIdNone , kIdVpmovzxwd , kU16ToU32, 32, 1), // kLoadCvt256_U16ToU32.
+ DEFINE_OP(kIdNone , kIdVpmovsxdq , kI32ToI64, 32, 1), // kLoadCvt256_I32ToI64.
+ DEFINE_OP(kIdNone , kIdVpmovzxdq , kU32ToU64, 32, 1), // kLoadCvt256_U32ToU64.
+ DEFINE_OP(kIdPmovzxbq , kIdVpmovzxbq , kU8ToU64 , 0, 3), // kLoadCvtN_U8ToU64.
+ DEFINE_OP(kIdPmovsxbw , kIdVpmovsxbw , kI8ToI16 , 0, 1), // kLoadCvtN_I8ToI16.
+ DEFINE_OP(kIdPmovzxbw , kIdVpmovzxbw , kU8ToU16 , 0, 1), // kLoadCvtN_U8ToU16.
+ DEFINE_OP(kIdPmovsxbd , kIdVpmovsxbd , kI8ToI32 , 0, 2), // kLoadCvtN_I8ToI32.
+ DEFINE_OP(kIdPmovzxbd , kIdVpmovzxbd , kU8ToU32 , 0, 2), // kLoadCvtN_U8ToU32.
+ DEFINE_OP(kIdPmovsxwd , kIdVpmovsxwd , kI16ToI32, 0, 1), // kLoadCvtN_I16ToI32.
+ DEFINE_OP(kIdPmovzxwd , kIdVpmovzxwd , kU16ToU32, 0, 1), // kLoadCvtN_U16ToU32.
+ DEFINE_OP(kIdPmovsxdq , kIdVpmovsxdq , kI32ToI64, 0, 1), // kLoadCvtN_I32ToI64.
+ DEFINE_OP(kIdPmovzxdq , kIdVpmovzxdq , kU32ToU64, 0, 1), // kLoadCvtN_U32ToU64.
+ DEFINE_OP(kIdPinsrb , kIdVpinsrb , kNone , 1, 0), // kLoadInsertU8.
+ DEFINE_OP(kIdPinsrw , kIdVpinsrw , kNone , 2, 0), // kLoadInsertU16.
+ DEFINE_OP(kIdPinsrd , kIdVpinsrd , kNone , 4, 0), // kLoadInsertU32.
+ DEFINE_OP(kIdPinsrq , kIdVpinsrq , kNone , 8, 0), // kLoadInsertU64.
+ DEFINE_OP(kIdInsertps , kIdVinsertps , kNone , 4, 0), // kLoadInsertF32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 8, 0), // kLoadInsertF32x2.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 8, 0) // kLoadInsertF64.
+};
+
+#undef DEFINE_OP
+
+#define DEFINE_OP(sse_inst_id, avx_inst_id, cvt, mem_size, mem_size_shift) \
+ UniOpVMInfo { \
+ Inst::sse_inst_id, \
+ Inst::avx_inst_id, \
+ 0, \
+ uint8_t(NarrowingOp::cvt), \
+ mem_size, \
+ mem_size_shift, \
+ 0 \
+ }
+
+static constexpr UniOpVMInfo opcode_info_2mv[size_t(UniOpMV::kMaxValue) + 1] = {
+ DEFINE_OP(kIdNone , kIdNone , kNone , 1, 0), // kStore8.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 2, 0), // kStore16_U16.
+ DEFINE_OP(kIdMovd , kIdVmovd , kNone , 4, 0), // kStore32_U32.
+ DEFINE_OP(kIdMovss , kIdVmovss , kNone , 4, 0), // kStore32_F32.
+ DEFINE_OP(kIdMovq , kIdVmovq , kNone , 8, 0), // kStore64_U32.
+ DEFINE_OP(kIdMovq , kIdVmovq , kNone , 8, 0), // kStore64_U64.
+ DEFINE_OP(kIdMovq , kIdVmovq , kNone , 8, 0), // kStore64_F32.
+ DEFINE_OP(kIdMovsd , kIdVmovsd , kNone , 8, 0), // kStore64_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kStore128_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kStore128_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kStore128_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 16, 0), // kStore128_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kStore256_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kStore256_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kStore256_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 32, 0), // kStore256_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kStore512_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kStore512_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kStore512_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 64, 0), // kStore512_F64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kStoreN_U32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kStoreN_U64.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kStoreN_F32.
+ DEFINE_OP(kIdNone , kIdNone , kNone , 0, 0), // kStoreN_F64.
+ /*
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 8, 1), // kStoreCvtz64_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 8, 1), // kStoreCvtz64_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 8, 1), // kStoreCvtz64_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToI8 , 8, 1), // kStoreCvts64_I16ToI8.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToU8 , 8, 1), // kStoreCvts64_I16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 8, 1), // kStoreCvts64_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kI32ToI16, 8, 1), // kStoreCvts64_I32ToI16.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 8, 1), // kStoreCvts64_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kI64ToI32, 8, 1), // kStoreCvts64_I64ToI32.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 8, 1), // kStoreCvts64_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 16, 1), // kStoreCvtz128_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 16, 1), // kStoreCvtz128_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 16, 1), // kStoreCvtz128_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToI8 , 16, 1), // kStoreCvts128_I16ToI8.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToU8 , 16, 1), // kStoreCvts128_I16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 16, 1), // kStoreCvts128_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kI32ToI16, 16, 1), // kStoreCvts128_I32ToI16.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 16, 1), // kStoreCvts128_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kI64ToI32, 16, 1), // kStoreCvts128_I64ToI32.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 16, 1), // kStoreCvts128_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 32, 1), // kStoreCvtz256_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 32, 1), // kStoreCvtz256_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 32, 1), // kStoreCvtz256_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToI8 , 32, 1), // kStoreCvts256_I16ToI8.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToU8 , 32, 1), // kStoreCvts256_I16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 32, 1), // kStoreCvts256_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kI32ToI16, 32, 1), // kStoreCvts256_I32ToI16.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 32, 1), // kStoreCvts256_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kI64ToI32, 32, 1), // kStoreCvts256_I64ToI32.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 32, 1), // kStoreCvts256_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 0, 1), // kStoreCvtzN_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 0, 1), // kStoreCvtzN_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 0, 1), // kStoreCvtzN_U64ToU32.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToI8 , 0, 1), // kStoreCvtsN_I16ToI8.
+ DEFINE_OP(kIdNone , kIdNone , kI16ToU8 , 0, 1), // kStoreCvtsN_I16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kU16ToU8 , 0, 1), // kStoreCvtsN_U16ToU8.
+ DEFINE_OP(kIdNone , kIdNone , kI32ToI16, 0, 1), // kStoreCvtsN_I32ToI16.
+ DEFINE_OP(kIdNone , kIdNone , kU32ToU16, 0, 1), // kStoreCvtsN_U32ToU16.
+ DEFINE_OP(kIdNone , kIdNone , kI64ToI32, 0, 1), // kStoreCvtsN_I64ToI32.
+ DEFINE_OP(kIdNone , kIdNone , kU64ToU32, 0, 1) // kStoreCvtsN_U64ToU32.
+ */
+ DEFINE_OP(kIdPextrw , kIdVpextrw , kNone , 2, 0), // kStoreExtractU16.
+ DEFINE_OP(kIdPextrd , kIdVpextrd , kNone , 4, 0), // kStoreExtractU32.
+ DEFINE_OP(kIdPextrq , kIdVpextrq , kNone , 8, 0) // kStoreExtractU64.
+};
+
+#undef DEFINE_OP
+
+// ujit::UniCompiler - Vector Instructions - Utility Functions
+// ===========================================================
+
+static ASMJIT_NOINLINE void UniCompiler_load_into(UniCompiler& uc, const Vec& vec, const Mem& mem, uint32_t broadcast_size = 0) {
+ BackendCompiler* cc = uc.cc;
+ Mem m(mem);
+
+ if (mem.has_broadcast() && broadcast_size) {
+ m.reset_broadcast();
+ switch (broadcast_size) {
+ case 1: cc->vpbroadcastb(vec, m); break;
+ case 2: cc->vpbroadcastw(vec, m); break;
+ case 4: cc->vpbroadcastd(vec, m); break;
+ case 8: cc->vpbroadcastq(vec, m); break;
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ m.set_size(vec.size());
+ if (vec.is_vec512())
+ cc->vmovdqu32(vec, m);
+ else if (uc.has_avx())
+ cc->vmovdqu(vec, m);
+ else
+ cc->movdqu(vec, m);
+ }
+}
+
+// TODO: Unused for now...
+[[maybe_unused]]
+static ASMJIT_NOINLINE void UniCompiler_move_to_dst(UniCompiler& uc, const Vec& dst, const Operand_& src, uint32_t broadcast_size = 0) {
+ if (src.is_reg()) {
+ ASMJIT_ASSERT(src.is_vec());
+ if (dst.id() != src.as<Reg>().id()) {
+ uc.v_mov(dst, src);
+ }
+ }
+ else if (src.is_mem()) {
+ UniCompiler_load_into(uc, dst, src.as<Mem>(), broadcast_size);
+ }
+ else {
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+static ASMJIT_NOINLINE Vec UniCompiler_load_new(UniCompiler& uc, const Vec& ref, const Mem& mem, uint32_t broadcast_size = 0) {
+ Vec vec = uc.new_similar_reg(ref, "@vec_m");
+ UniCompiler_load_into(uc, vec, mem, broadcast_size);
+ return vec;
+}
+
+static ASMJIT_INLINE bool is_same_vec(const Vec& a, const Operand_& b) noexcept {
+ return b.is_reg() && a.id() == b.as<Reg>().id();
+}
+
+static ASMJIT_INLINE Operand get_fop_one(UniCompiler& uc, const Vec& dst, FloatMode fm) {
+ Operand op;
+ if (is_f32_op(fm))
+ op = uc.simd_const(&uc.ct().f32_1, Bcst::k32, dst);
+ else
+ op = uc.simd_const(&uc.ct().f64_1, Bcst::k64, dst);
+ return op;
+}
+
+static ASMJIT_INLINE Operand get_fop_half_minus_1ulp(UniCompiler& uc, const Vec& dst, FloatMode fm) {
+ Operand op;
+ if (is_f32_op(fm))
+ op = uc.simd_const(&uc.ct().f32_0_5_minus_1ulp, Bcst::k32, dst);
+ else
+ op = uc.simd_const(&uc.ct().f64_0_5_minus_1ulp, Bcst::k64, dst);
+ return op;
+}
+
+static ASMJIT_INLINE Operand get_fop_round_magic(UniCompiler& uc, const Vec& dst, FloatMode fm) {
+ Operand op;
+ if (is_f32_op(fm))
+ op = uc.simd_const(&uc.ct().f32_round_magic, Bcst::k32, dst);
+ else
+ op = uc.simd_const(&uc.ct().f64_round_magic, Bcst::k64, dst);
+ return op;
+}
+
+static ASMJIT_INLINE Operand get_fop_msb_bit(UniCompiler& uc, const Vec& dst, FloatMode fm) {
+ Operand op;
+ if (is_f32_op(fm))
+ op = uc.simd_const(&uc.ct().p_8000000080000000, Bcst::k32, dst);
+ else
+ op = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst);
+ return op;
+}
+
+static ASMJIT_NOINLINE void sse_mov(UniCompiler& uc, const Vec& dst, const Operand_& src) {
+ BackendCompiler* cc = uc.cc;
+ if (src.is_mem())
+ cc->emit(Inst::kIdMovups, dst, src);
+ else if (dst.id() != src.id())
+ cc->emit(Inst::kIdMovaps, dst, src);
+}
+
+static ASMJIT_NOINLINE void sse_fmov(UniCompiler& uc, const Vec& dst, const Operand_& src, FloatMode fm) {
+ BackendCompiler* cc = uc.cc;
+ if (src.is_reg()) {
+ if (dst.id() != src.id()) {
+ cc->emit(Inst::kIdMovaps, dst, src);
+ }
+ }
+ else if (is_scalar_fp_op(fm)) {
+ cc->emit(sse_float_inst[size_t(fm)].fmovs, dst, src);
+ }
+ else {
+ cc->emit(sse_float_inst[size_t(fm)].fmovu, dst, src);
+ }
+}
+
+static ASMJIT_NOINLINE Vec sse_copy(UniCompiler& uc, const Vec& vec, const char* name) {
+ Vec copy = uc.new_similar_reg(vec, name);
+ uc.cc->emit(Inst::kIdMovaps, copy, vec);
+ return copy;
+}
+
+static ASMJIT_NOINLINE void sse_make_vec(UniCompiler& uc, Operand_& op, const char* name) {
+ if (op.is_mem()) {
+ Vec tmp = uc.new_vec128(name);
+ sse_mov(uc, tmp, op);
+ op = tmp;
+ }
+}
+
+static ASMJIT_INLINE uint32_t shuf_imm2_from_swizzle(Swizzle2 s) noexcept {
+ return x86::shuffle_imm((s.value >> 8) & 0x1, s.value & 0x1);
+}
+
+static ASMJIT_INLINE uint32_t shuf_imm2_from_swizzle_with_width(Swizzle2 s, VecWidth w) noexcept {
+ static constexpr uint32_t multipliers[] = { 0x1, 0x5, 0x55 };
+ return shuf_imm2_from_swizzle(s) * multipliers[size_t(w)];
+}
+
+static ASMJIT_INLINE uint32_t shuf_imm4_from_swizzle(Swizzle4 s) noexcept {
+ return x86::shuffle_imm((s.value >> 24 & 0x3), (s.value >> 16) & 0x3, (s.value >> 8) & 0x3, s.value & 0x3);
+}
+
+static ASMJIT_INLINE uint32_t shuf_imm4_from_swizzle(Swizzle2 s) noexcept {
+ uint32_t imm0 = uint32_t(s.value ) & 1u;
+ uint32_t imm1 = uint32_t(s.value >> 8) & 1u;
+ return x86::shuffle_imm(imm1 * 2u + 1u, imm1 * 2u, imm0 * 2u + 1u, imm0 * 2u);
+}
+
+static ASMJIT_NOINLINE void sse_bit_not(UniCompiler& uc, const Vec& dst, const Operand_& src) {
+ BackendCompiler* cc = uc.cc;
+
+ sse_mov(uc, dst, src);
+ Operand ones = uc.simd_const(&uc.ct().p_FFFFFFFFFFFFFFFF, Bcst::k32, dst);
+ cc->emit(Inst::kIdPxor, dst, ones);
+}
+
+static ASMJIT_NOINLINE void sse_msb_flip(UniCompiler& uc, const Vec& dst, const Operand_& src, ElementSize sz) {
+ BackendCompiler* cc = uc.cc;
+ const void* msk_data {};
+
+ switch (sz) {
+ case ElementSize::k8 : msk_data = &uc.ct().p_8080808080808080; break;
+ case ElementSize::k16: msk_data = &uc.ct().p_8000800080008000; break;
+ case ElementSize::k32: msk_data = &uc.ct().p_8000000080000000; break;
+ case ElementSize::k64: msk_data = &uc.ct().p_8000000000000000; break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ Operand msk = uc.simd_const(msk_data, Bcst::kNA, dst);
+ sse_mov(uc, dst, src);
+ cc->emit(Inst::kIdPxor, dst, msk);
+}
+
+static ASMJIT_NOINLINE void sse_fsign_flip(UniCompiler& uc, const Vec& dst, const Operand_& src, FloatMode fm) {
+ BackendCompiler* cc = uc.cc;
+
+ const FloatInst& fi = sse_float_inst[size_t(fm)];
+ Operand msk;
+
+ switch (fm) {
+ case FloatMode::kF32S: msk = uc.simd_const(&uc.ct().sign32_scalar, Bcst::k32, dst); break;
+ case FloatMode::kF64S: msk = uc.simd_const(&uc.ct().sign64_scalar, Bcst::k64, dst); break;
+ case FloatMode::kF32V: msk = uc.simd_const(&uc.ct().p_8000000080000000, Bcst::k32, dst); break;
+ case FloatMode::kF64V: msk = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ sse_fmov(uc, dst, src, fm);
+ cc->emit(fi.fxor, dst, msk);
+}
+
+// Possibly the best solution:
+// https://stackoverflow.com/questions/65166174/how-to-simulate-pcmpgtq-on-sse2
+static ASMJIT_NOINLINE void sse_cmp_gt_i64(UniCompiler& uc, const Vec& dst, const Operand_& a, const Operand_& b) {
+ BackendCompiler* cc = uc.cc;
+
+ if (uc.has_sse4_2()) {
+ if (is_same_vec(dst, a)) {
+ cc->emit(Inst::kIdPcmpgtq, dst, b);
+ }
+ else {
+ Operand_ second = b;
+ if (is_same_vec(dst, b)) {
+ second = cc->new_similar_reg(dst, "@tmp");
+ sse_mov(uc, second.as<Vec>(), b);
+ }
+ sse_mov(uc, dst, a);
+ cc->emit(Inst::kIdPcmpgtq, dst, second);
+ }
+ }
+ else {
+ Vec tmp1 = cc->new_similar_reg(dst, "@tmp1");
+ Vec tmp2 = cc->new_similar_reg(dst, "@tmp2");
+
+ cc->emit(Inst::kIdMovdqa, tmp1, a);
+ cc->emit(Inst::kIdMovdqa, tmp2, b);
+ cc->emit(Inst::kIdPcmpeqd, tmp1, tmp2);
+ cc->emit(Inst::kIdPsubq, tmp2, a);
+ cc->emit(Inst::kIdPand, tmp1, tmp2);
+
+ if (!is_same_vec(dst, b)) {
+ sse_mov(uc, dst, a);
+ cc->emit(Inst::kIdPcmpgtd, dst, b);
+ cc->emit(Inst::kIdPor, dst, tmp1);
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(3, 3, 1, 1));
+ }
+ else {
+ sse_mov(uc, tmp2, a);
+ cc->emit(Inst::kIdPcmpgtd, tmp2, b);
+ cc->emit(Inst::kIdPor, tmp2, tmp1);
+ cc->emit(Inst::kIdPshufd, dst, tmp2, x86::shuffle_imm(3, 3, 1, 1));
+ }
+ }
+}
+
+// Possibly the best solution:
+// https://stackoverflow.com/questions/65441496/what-is-the-most-efficient-way-to-do-unsigned-64-bit-comparison-on-sse2
+static ASMJIT_NOINLINE void sse_cmp_gt_u64(UniCompiler& uc, const Vec& dst, const Operand_& a, const Operand_& b) {
+ BackendCompiler* cc = uc.cc;
+
+ if (uc.has_sse4_2()) {
+ Operand msk = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst);
+ Vec tmp = cc->new_similar_reg(dst, "@tmp");
+
+ if (is_same_vec(dst, a)) {
+ sse_mov(uc, tmp, msk);
+ cc->emit(Inst::kIdPxor, dst, tmp);
+ cc->emit(Inst::kIdPxor, tmp, b);
+ cc->emit(Inst::kIdPcmpgtq, dst, tmp);
+ }
+ else {
+ sse_mov(uc, tmp, b);
+ sse_mov(uc, dst, a);
+ cc->emit(Inst::kIdPxor, dst, msk);
+ cc->emit(Inst::kIdPxor, tmp, msk);
+ cc->emit(Inst::kIdPcmpgtq, dst, tmp);
+ }
+ }
+ else {
+ Vec tmp1 = cc->new_similar_reg(dst, "@tmp1");
+ Vec tmp2 = cc->new_similar_reg(dst, "@tmp2");
+ Vec tmp3 = cc->new_similar_reg(dst, "@tmp3");
+
+ sse_mov(uc, tmp1, b); // tmp1 = b;
+ sse_mov(uc, tmp2, a); // tmp2 = a;
+ cc->emit(Inst::kIdMovaps, tmp3, tmp1); // tmp3 = b;
+ cc->emit(Inst::kIdPsubq, tmp3, tmp2); // tmp3 = b - a
+ cc->emit(Inst::kIdPxor, tmp2, tmp1); // tmp2 = b ^ a
+ cc->emit(Inst::kIdPandn, tmp1, a); // tmp1 =~b & a
+ cc->emit(Inst::kIdPandn, tmp2, tmp3); // tmp2 =~(b ^ a) & (b - a)
+ cc->emit(Inst::kIdPor, tmp1, tmp2); // tmp2 =~(b ^ a) & (b - a) | (~b & a)
+ cc->emit(Inst::kIdPsrad, tmp1, 31); // tmp1 =~(b ^ a) & (b - a) | (~b & a) - repeated MSB bits in 32-bit lanes
+ cc->emit(Inst::kIdPshufd, dst, tmp1, x86::shuffle_imm(3, 3, 1, 1));
+ }
+}
+
+static ASMJIT_NOINLINE void sse_select(UniCompiler& uc, const Vec& dst, const Vec& a, const Operand_& b, const Vec& msk) {
+ BackendCompiler* cc = uc.cc;
+ sse_mov(uc, dst, a);
+ cc->emit(Inst::kIdPand, dst, msk);
+ cc->emit(Inst::kIdPandn, msk, b);
+ cc->emit(Inst::kIdPor, dst, msk);
+}
+
+static ASMJIT_NOINLINE void sse_int_widen(UniCompiler& uc, const Vec& dst, const Vec& src, WideningOp cvt) {
+ BackendCompiler* cc = uc.cc;
+ WideningOpInfo cvt_info = sse_int_widening_op_info[size_t(cvt)];
+
+ if (uc.has_sse4_1()) {
+ cc->emit(cvt_info.mov, dst, src);
+ return;
+ }
+
+ if (!cvt_info.sign_extends && cvt_info.unpack_lo != Inst::kIdNone) {
+ Operand zero = uc.simd_const(&uc.ct().p_0000000000000000, Bcst::kNA, dst);
+ sse_mov(uc, dst, src);
+ cc->emit(cvt_info.unpack_lo, dst, zero);
+ return;
+ }
+
+ switch (cvt) {
+ case WideningOp::kI8ToI16: {
+ cc->overwrite().emit(cvt_info.unpack_lo, dst, src);
+ cc->psraw(dst, 8);
+ return;
+ }
+
+ case WideningOp::kI8ToI32: {
+ cc->overwrite().emit(Inst::kIdPunpcklbw, dst, src);
+ cc->punpcklwd(dst, dst);
+ cc->psrad(dst, 24);
+ return;
+ }
+
+ case WideningOp::kU8ToU32: {
+ Operand zero = uc.simd_const(&uc.ct().p_0000000000000000, Bcst::kNA, dst);
+ sse_mov(uc, dst, src);
+
+ cc->emit(Inst::kIdPunpcklbw, dst, zero);
+ cc->emit(Inst::kIdPunpcklwd, dst, zero);
+ return;
+ }
+
+ case WideningOp::kU8ToU64: {
+ Operand zero = uc.simd_const(&uc.ct().p_0000000000000000, Bcst::kNA, dst);
+ sse_mov(uc, dst, src);
+
+ cc->emit(Inst::kIdPunpcklbw, dst, zero);
+ cc->emit(Inst::kIdPunpcklwd, dst, zero);
+ cc->emit(Inst::kIdPunpckldq, dst, zero);
+ return;
+ }
+
+ case WideningOp::kI16ToI32: {
+ cc->overwrite().emit(cvt_info.unpack_lo, dst, src);
+ cc->psrad(dst, 16);
+ return;
+ }
+
+ case WideningOp::kI32ToI64: {
+ Vec tmp = uc.new_similar_reg(dst, "@tmp");
+ sse_mov(uc, tmp, src);
+ sse_mov(uc, dst, src);
+ cc->psrad(tmp, 31);
+ cc->punpckldq(dst, tmp);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+}
+
+static ASMJIT_NOINLINE void sse_round(UniCompiler& uc, const Vec& dst, const Operand& src, FloatMode fm, x86::RoundImm round_mode) {
+ BackendCompiler* cc = uc.cc;
+
+ uint32_t is_f32 = fm == FloatMode::kF32S || fm == FloatMode::kF32V;
+ const FloatInst& fi = sse_float_inst[size_t(fm)];
+
+ // NOTE: This may be dead code as the compiler handles this case well, however, if this function is
+ // called as a helper we don't want to emit a longer sequence if we can just use a single instruction.
+ if (uc.has_sse4_1()) {
+ cc->emit(fi.fround, dst, src, round_mode | x86::RoundImm::kSuppress);
+ return;
+ }
+
+ // round_max (f32) == 0x4B000000
+ // round_max (f64) == 0x4330000000000000
+ Operand maxn = get_fop_round_magic(uc, dst, fm);
+
+ Vec t1 = uc.new_similar_reg(dst, "@t1");
+ Vec t2 = uc.new_similar_reg(dst, "@t2");
+ Vec t3 = uc.new_similar_reg(dst, "@t3");
+
+ if (round_mode == x86::RoundImm::kTrunc) {
+ if (fm == FloatMode::kF32S || (fm == FloatMode::kF64S && cc->is_64bit())) {
+ Gp r;
+ Operand msb;
+
+ if (fm == FloatMode::kF32S) {
+ r = uc.new_gp32("@gp_tmp");
+ msb = uc.simd_const(&uc.ct().p_8000000080000000, Bcst::k32, dst);
+ }
+ else {
+ r = uc.new_gp64("@gp_tmp");
+ msb = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst);
+ }
+
+ sse_fmov(uc, dst, src, fm);
+
+ if (fm == FloatMode::kF32S)
+ cc->cvttss2si(r, dst);
+ else
+ cc->cvttsd2si(r, dst);
+
+ cc->emit(fi.fmova, t2, msb);
+ cc->emit(fi.fandn, t2, dst);
+ cc->emit(fi.fxor, t1, t1);
+
+ if (fm == FloatMode::kF32S)
+ cc->cvtsi2ss(t1, r);
+ else
+ cc->cvtsi2sd(t1, r);
+
+ cc->emit(fi.fcmp, t2, maxn, x86::CmpImm::kLT);
+ cc->emit(fi.fand, t1, t2);
+ cc->emit(fi.fandn, t2, dst);
+ cc->emit(fi.for_, t2, t1);
+ cc->emit(fi.fmovs, dst, t2);
+ return;
+ }
+ }
+
+ if (round_mode == x86::RoundImm::kNearest) {
+ // Pure SSE2 round-to-even implementation:
+ //
+ // float round_even(float x) {
+ // float magic = x >= 0 ? pow(2, 22) : pow(2, 22) + pow(2, 21);
+ // return x >= magic ? x : x + magic - magic;
+ // }
+ //
+ // double round_even(double x) {
+ // double magic = x >= 0 ? pow(2, 52) : pow(2, 52) + pow(2, 51);
+ // return x >= magic ? x : x + magic - magic;
+ // }
+ sse_fmov(uc, dst, src, fm);
+ cc->emit(fi.fmova, t3, dst);
+ // cc->emit(fi.psrl, t3, Imm(is_f32 ? 31 : 63));
+ // cc->emit(fi.psll, t3, Imm(is_f32 ? 23 : 51));
+ // cc->emit(fi.for_, t3, maxn);
+
+ cc->emit(fi.psrl, t3, Imm(is_f32 ? 31 : 63));
+ cc->emit(fi.psll, t3, Imm(is_f32 ? 23 : 52));
+ cc->emit(is_f32 ? Inst::kIdPaddd : Inst::kIdPaddq, t3, maxn);
+
+ cc->emit(fi.fmova, t1, dst);
+ cc->emit(fi.fcmp, t1, t3, x86::CmpImm::kLT);
+ cc->emit(fi.fand, t1, t3);
+
+ cc->emit(fi.fadd, dst, t1);
+ cc->emit(fi.fsub, dst, t1);
+ return;
+ }
+
+ Operand one = get_fop_one(uc, dst, fm);
+
+ if (round_mode == x86::RoundImm::kTrunc) {
+ // Should be handled earlier.
+ ASMJIT_ASSERT(fm != FloatMode::kF32S);
+
+ Operand msb;
+
+ if (fm == FloatMode::kF32V) {
+ msb = uc.simd_const(&uc.ct().p_8000000080000000, Bcst::k32, dst);
+ sse_fmov(uc, dst, src, fm);
+
+ cc->cvttps2dq(t1, dst);
+ cc->emit(fi.fmova, t2, msb);
+ cc->emit(fi.fandn, t2, dst);
+ cc->cvtdq2ps(t1, t1);
+
+ cc->emit(fi.fcmp, t2, maxn, x86::CmpImm::kLT);
+ cc->emit(fi.fand, t1, t2);
+ cc->emit(fi.fandn, t2, dst);
+ cc->emit(fi.for_, t2, t1);
+ cc->emit(fi.fmova, dst, t2);
+ }
+ else {
+ msb = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst);
+
+ sse_fmov(uc, dst, src, fm);
+ cc->emit(fi.fmova, t3, msb);
+ cc->emit(fi.fandn, t3, dst);
+ cc->emit(fi.fmova, t2, t3);
+ cc->emit(fi.fcmp, t2, maxn, x86::CmpImm::kLT);
+ cc->emit(fi.fand, t2, maxn);
+ cc->emit(fi.fmova, t1, t3);
+ cc->emit(fi.fadd, t1, t2);
+ cc->emit(fi.fsub, t1, t2);
+ cc->emit(fi.fcmp, t3, t1, x86::CmpImm::kLT);
+ cc->emit(fi.fand, t3, one);
+ cc->emit(fi.fsub, t1, t3);
+
+ cc->emit(fi.fand, dst, msb);
+ cc->emit(fi.for_, dst, t1);
+ return;
+ }
+ return;
+ }
+
+ // Round up & down needs a correction as adding and subtracting magic number rounds to nearest.
+ if (round_mode == x86::RoundImm::kDown || round_mode == x86::RoundImm::kUp) {
+ InstId correction_inst_id = round_mode == x86::RoundImm::kDown ? fi.fsub : fi.fadd;
+ x86::CmpImm correction_predicate = round_mode == x86::RoundImm::kDown ? x86::CmpImm::kLT : x86::CmpImm::kNLE;
+
+ sse_fmov(uc, dst, src, fm);
+
+ // maxn (f32) == 0x4B000000 (f64) == 0x4330000000000000
+ // t3 (f32) == 0x00800000 (f64) == 0x0008000000000000
+
+ cc->emit(fi.fmova, t3, dst);
+ cc->emit(fi.psrl, t3, Imm(is_f32 ? 31 : 63));
+ cc->emit(fi.psll, t3, Imm(is_f32 ? 23 : 52));
+ cc->emit(is_f32 ? Inst::kIdPaddd : Inst::kIdPaddq, t3, maxn);
+
+ cc->emit(fi.fmova, t1, dst);
+ cc->emit(fi.fmova, t2, dst);
+ cc->emit(fi.fadd, t2, t3);
+ cc->emit(fi.fsub, t2, t3);
+
+ cc->emit(fi.fcmp, t1, t3, x86::CmpImm::kNLT);
+ cc->emit(fi.fmova, t3, dst);
+ cc->emit(fi.fcmp, t3, t2, correction_predicate);
+ cc->emit(fi.fand, t3, one);
+
+ cc->emit(fi.fand, dst, t1);
+ cc->emit(correction_inst_id, t2, t3);
+
+ cc->emit(fi.fandn, t1, t2);
+ cc->emit(fi.for_, dst, t1);
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+}
+
+static ASMJIT_NOINLINE void avx_mov(UniCompiler& uc, const Vec& dst, const Operand_& src) {
+ BackendCompiler* cc = uc.cc;
+ InstId inst_id = 0;
+
+ if (dst.is_vec512()) {
+ inst_id = src.is_mem() ? Inst::kIdVmovdqu32 : Inst::kIdVmovdqa32;
+ }
+ else {
+ inst_id = src.is_mem() ? Inst::kIdVmovdqu : Inst::kIdVmovdqa;
+ }
+
+ cc->emit(inst_id, dst, src);
+}
+
+static ASMJIT_NOINLINE void avx_fmov(UniCompiler& uc, const Vec& dst, const Operand_& src, FloatMode fm) {
+ BackendCompiler* cc = uc.cc;
+ if (src.is_reg()) {
+ if (dst.id() != src.id()) {
+ if (fm <= FloatMode::kF64S)
+ cc->emit(Inst::kIdVmovaps, dst.xmm(), src);
+ else
+ cc->emit(Inst::kIdVmovaps, dst, src);
+ }
+ }
+ else if (is_scalar_fp_op(fm)) {
+ cc->emit(avx_float_inst[size_t(fm)].fmovs, dst, src);
+ }
+ else {
+ cc->emit(avx_float_inst[size_t(fm)].fmovu, dst, src);
+ }
+}
+
+static ASMJIT_NOINLINE void avx_make_vec(UniCompiler& uc, Operand_& op, const Vec& ref, const char* name) {
+ if (op.is_mem()) {
+ Vec tmp = uc.new_similar_reg(ref, name);
+ avx_mov(uc, tmp, op);
+ op = tmp;
+ }
+}
+
+static ASMJIT_NOINLINE void avx_zero(UniCompiler& uc, const Vec& dst) {
+ BackendCompiler* cc = uc.cc;
+ Vec x = dst.xmm();
+ cc->vpxor(x, x, x);
+ return;
+}
+
+static ASMJIT_NOINLINE void avx_ones(UniCompiler& uc, const Vec& dst) {
+ BackendCompiler* cc = uc.cc;
+ if (uc.has_avx512())
+ cc->emit(Inst::kIdVpternlogd, dst, dst, dst, 0xFF);
+ else
+ cc->emit(Inst::kIdVpcmpeqb, dst, dst, dst);
+}
+
+static ASMJIT_NOINLINE void avx_bit_not(UniCompiler& uc, const Vec& dst, const Operand_& src) {
+ BackendCompiler* cc = uc.cc;
+
+ if (uc.has_avx512()) {
+ if (src.is_reg())
+ cc->overwrite().emit(Inst::kIdVpternlogd, dst, src, src, 0x55);
+ else
+ cc->overwrite().emit(Inst::kIdVpternlogd, dst, dst, src, 0x55);
+ return;
+ }
+
+ Operand ones = uc.simd_const(&uc.ct().p_FFFFFFFFFFFFFFFF, Bcst::k32, dst);
+ if (!src.is_reg()) {
+ if (ones.is_reg()) {
+ cc->emit(Inst::kIdVpxor, dst, ones, src);
+ }
+ else {
+ avx_mov(uc, dst, src);
+ cc->emit(Inst::kIdVpxor, dst, dst, ones);
+ }
+ }
+ else {
+ cc->emit(Inst::kIdVpxor, dst, src, ones);
+ }
+}
+
+static ASMJIT_NOINLINE void avx_isign_flip(UniCompiler& uc, const Vec& dst, const Operand_& src, ElementSize sz) {
+ BackendCompiler* cc = uc.cc;
+ Operand msk;
+
+ InstId xor_ = (uc.has_avx512() && dst.is_vec512()) ? Inst::kIdVpxord : Inst::kIdVpxor;
+
+ switch (sz) {
+ case ElementSize::k8: msk = uc.simd_const(&uc.ct().p_8080808080808080, Bcst::kNA, dst); break;
+ case ElementSize::k16: msk = uc.simd_const(&uc.ct().p_8000800080008000, Bcst::kNA, dst); break;
+ case ElementSize::k32: msk = uc.simd_const(&uc.ct().p_8000000080000000, Bcst::k32, dst); break;
+ case ElementSize::k64: msk = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst); break;
+ }
+
+ if (src.is_reg()) {
+ cc->emit(xor_, dst, src, msk);
+ }
+ else if (msk.is_reg()) {
+ cc->emit(xor_, dst, msk, src);
+ }
+ else {
+ avx_mov(uc, dst, src);
+ cc->emit(xor_, dst, dst, msk);
+ }
+}
+
+static ASMJIT_NOINLINE void avx_fsign_flip(UniCompiler& uc, const Vec& dst, const Operand_& src, FloatMode fm) {
+ BackendCompiler* cc = uc.cc;
+
+ const FloatInst& fi = avx_float_inst[size_t(fm)];
+ Operand msk;
+
+ switch (fm) {
+ case FloatMode::kF32S: msk = uc.simd_const(&uc.ct().sign32_scalar, Bcst::kNA, dst); break;
+ case FloatMode::kF64S: msk = uc.simd_const(&uc.ct().sign64_scalar, Bcst::kNA, dst); break;
+ case FloatMode::kF32V: msk = uc.simd_const(&uc.ct().p_8000000080000000, Bcst::k32, dst); break;
+ case FloatMode::kF64V: msk = uc.simd_const(&uc.ct().p_8000000000000000, Bcst::k64, dst); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ if (src.is_reg()) {
+ cc->emit(fi.fxor, dst, src, msk);
+ }
+ else if (msk.is_reg() && fm >= FloatMode::kF32V) {
+ cc->emit(fi.fxor, dst, msk, src);
+ }
+ else {
+ avx_fmov(uc, dst, src, fm);
+ cc->emit(fi.fxor, dst, dst, msk);
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - OpArray Iterator
+// ==========================================================
+
+template<typename T>
+class OpArrayIter {
+public:
+ const T& _op;
+
+ ASMJIT_INLINE_NODEBUG OpArrayIter(const T& op) noexcept : _op(op) {}
+ ASMJIT_INLINE_NODEBUG const T& op() const noexcept { return _op; }
+ ASMJIT_INLINE_NODEBUG void next() noexcept {}
+};
+
+template<>
+class OpArrayIter<OpArray> {
+public:
+ const OpArray& _opArray;
+ size_t _i {};
+ size_t _n {};
+
+ ASMJIT_INLINE_NODEBUG OpArrayIter(const OpArray& op_array) noexcept : _opArray(op_array), _i(0), _n(op_array.size()) {}
+ ASMJIT_INLINE_NODEBUG const Operand_& op() const noexcept { return _opArray[_i]; }
+ ASMJIT_INLINE_NODEBUG void next() noexcept { if (++_i >= _n) _i = 0; }
+};
+
+template<typename Src>
+static ASMJIT_INLINE void emit_2v_t(UniCompiler& uc, UniOpVV op, const OpArray& dst_, const Src& src_) {
+ size_t n = dst_.size();
+ OpArrayIter<Src> src(src_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_2v(op, dst_[i], src.op());
+ src.next();
+ }
+}
+
+template<typename Src>
+static ASMJIT_INLINE void emit_2vi_t(UniCompiler& uc, UniOpVVI op, const OpArray& dst_, const Src& src_, uint32_t imm) {
+ size_t n = dst_.size();
+ OpArrayIter<Src> src(src_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_2vi(op, dst_[i], src.op(), imm);
+ src.next();
+ }
+}
+
+template<typename Src1, typename Src2>
+static ASMJIT_INLINE void emit_3v_t(UniCompiler& uc, UniOpVVV op, const OpArray& dst_, const Src1& src1_, const Src2& src2_) {
+ size_t n = dst_.size();
+ OpArrayIter<Src1> src1(src1_);
+ OpArrayIter<Src2> src2(src2_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_3v(op, dst_[i], src1.op(), src2.op());
+ src1.next();
+ src2.next();
+ }
+}
+
+template<typename Src1, typename Src2>
+static ASMJIT_INLINE void emit_3vi_t(UniCompiler& uc, UniOpVVVI op, const OpArray& dst_, const Src1& src1_, const Src2& src2_, uint32_t imm) {
+ size_t n = dst_.size();
+ OpArrayIter<Src1> src1(src1_);
+ OpArrayIter<Src2> src2(src2_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_3vi(op, dst_[i], src1.op(), src2.op(), imm);
+ src1.next();
+ src2.next();
+ }
+}
+
+template<typename Src1, typename Src2, typename Src3>
+static ASMJIT_INLINE void emit_4v_t(UniCompiler& uc, UniOpVVVV op, const OpArray& dst_, const Src1& src1_, const Src2& src2_, const Src3& src3_) {
+ size_t n = dst_.size();
+ OpArrayIter<Src1> src1(src1_);
+ OpArrayIter<Src2> src2(src2_);
+ OpArrayIter<Src3> src3(src3_);
+
+ for (size_t i = 0; i < n; i++) {
+ uc.emit_4v(op, dst_[i], src1.op(), src2.op(), src3.op());
+ src1.next();
+ src2.next();
+ src3.next();
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Emit 2V
+// =================================================
+
+void UniCompiler::emit_2v(UniOpVV op, const Operand_& dst_, const Operand_& src_) {
+ ASMJIT_ASSERT(dst_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Operand src(src_);
+ UniOpVInfo op_info = opcode_info_2v[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ InstId inst_id = op_info.avx_inst_id;
+
+ if (has_avx_ext(AVXExt(op_info.avx_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ if (op_info.use_imm)
+ cc->emit(inst_id, dst, src, Imm(op_info.imm));
+ else
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ switch (op) {
+ case UniOpVV::kMov: {
+ cc->emit(Inst::kIdVmovaps, dst, src);
+ return;
+ }
+
+ case UniOpVV::kMovU64: {
+ if (src.is_vec())
+ src = src.as<Vec>().xmm();
+ cc->emit(Inst::kIdVmovq, dst.xmm(), src);
+ return;
+ }
+
+ case UniOpVV::kBroadcastU8Z:
+ case UniOpVV::kBroadcastU16Z:
+ case UniOpVV::kBroadcastU8:
+ case UniOpVV::kBroadcastU16:
+ case UniOpVV::kBroadcastU32:
+ case UniOpVV::kBroadcastU64:
+ case UniOpVV::kBroadcastF32:
+ case UniOpVV::kBroadcastF64: {
+ // Intrinsic - 32/64-bit broadcasts require AVX, 8/16-bit broadcasts require AVX2/AVX512.
+ ASMJIT_ASSERT(src.is_reg() || src.is_mem());
+ ElementSize element_size = ElementSize(op_info.element_size);
+
+ if (src.is_gp()) {
+ Gp src_gp = src.as<Gp>();
+ if (element_size <= ElementSize::k32)
+ src_gp = src_gp.r32();
+ else
+ src_gp = src_gp.r64();
+
+ // AVX512 provides broadcast instructions for both GP, XMM, and memory sources, however, from GP register
+ // only VP instructions are available, so we have to convert VBROADCAST[SS|SD] to VPBROADCAST[D|Q].
+ if (has_avx512()) {
+ if (op == UniOpVV::kBroadcastF32) inst_id = Inst::kIdVpbroadcastd;
+ if (op == UniOpVV::kBroadcastF64) inst_id = Inst::kIdVpbroadcastq;
+ cc->emit(inst_id, dst, src_gp);
+ return;
+ }
+
+ // We can handle BroadcastU[8|16]Z differently when AVX2 is not present. Since the opcode has guaranteed
+ // source, which has zerod the rest of the register, we are going to multiply with a constant to extend
+ // the data into 32 bits, and then we can just use VBROADCASTSS, which would do the rest.
+ if (!has_avx2() && element_size <= ElementSize::k16 && op_info.imm == 0x01u) {
+ Gp expanded = new_gp32("@expanded");
+ cc->imul(expanded, src_gp, element_size == ElementSize::k8 ? 0x01010101u : 0x00010001u);
+ cc->vmovd(dst.xmm(), expanded);
+ cc->vpshufd(dst.xmm(), dst.xmm(), x86::shuffle_imm(0, 0, 0, 0));
+
+ if (!dst.is_vec128())
+ cc->emit(Inst::kIdVinsertf128, dst, dst, dst.xmm(), 0);
+ return;
+ }
+
+ // AVX/AVX2 doesn't provide broadcast from GP to XMM, we have to move to XMM first.
+ InstId mov = element_size <= ElementSize::k32 ? Inst::kIdVmovd : Inst::kIdVmovq;
+ cc->emit(mov, dst.xmm(), src_gp);
+ src = dst.xmm();
+ }
+
+ // We have ether a broadcast from memory or an XMM register - AVX2 requires special handling from here...
+ if (!has_avx2()) {
+ Vec dst_xmm = dst.xmm();
+
+ if (element_size <= ElementSize::k16) {
+ // AVX doesn't provide 8-bit and 16-bit broadcasts - the simplest way is to just use VPSHUFB to repeat the byte.
+ InstId insert_inst_id = element_size == ElementSize::k8 ? Inst::kIdVpinsrb : Inst::kIdVpinsrw;
+
+ const void* pred_data = element_size == ElementSize::k8 ? static_cast<const void*>(&ct().p_0000000000000000)
+ : static_cast<const void*>(&ct().p_0100010001000100);
+ Vec pred = simd_vec_const(pred_data, Bcst::k32, dst_xmm);
+
+ if (src.is_mem()) {
+ cc->emit(insert_inst_id, dst_xmm, pred, src, 0);
+ cc->vpshufb(dst_xmm, dst_xmm, pred);
+ }
+ else {
+ cc->vpshufb(dst_xmm, src.as<Vec>().xmm(), pred);
+ }
+ }
+ else {
+ // AVX doesn't have VPBROADCAST[D|Q], but it has VBROADCAST[SS|SD], which do the same. However,
+ // these cannot be used when the source is a register - initially these instructions only allowed
+ // broadcasting from memory, then with AVX2 a version that broadcasts from a register was added.
+ if (src.is_mem()) {
+ InstId bcst_inst_id = (element_size == ElementSize::k32) ? Inst::kIdVbroadcastss : Inst::kIdVbroadcastsd;
+ if (dst.is_vec128() && bcst_inst_id == Inst::kIdVbroadcastsd)
+ bcst_inst_id = Inst::kIdVmovddup;
+ cc->emit(bcst_inst_id, dst, src.as<Mem>());
+ return;
+ }
+
+ Vec src_xmm = src.as<Vec>().xmm();
+ if (element_size == ElementSize::k32)
+ cc->vpshufd(dst_xmm, src_xmm, x86::shuffle_imm(0, 0, 0, 0));
+ else
+ cc->vmovddup(dst_xmm, src_xmm);
+ }
+
+ if (!dst.is_vec128())
+ cc->emit(Inst::kIdVinsertf128, dst, dst, dst_xmm, 0);
+ return;
+ }
+
+ // VBROADCASTSD cannot be used when XMM is a destination, in that case we must use VMOVDDUP.
+ if (dst.is_vec128() && inst_id == Inst::kIdVbroadcastsd)
+ inst_id = Inst::kIdVmovddup;
+
+ if (src.is_mem()) {
+ Mem m = src.as<Mem>();
+ m.set_size(1u << op_info.element_size);
+ cc->emit(inst_id, dst, m);
+ }
+ else {
+ cc->emit(inst_id, dst, src.as<Vec>().xmm());
+ }
+ return;
+ }
+
+ case UniOpVV::kBroadcastV128_U32:
+ case UniOpVV::kBroadcastV128_U64:
+ case UniOpVV::kBroadcastV128_F32:
+ case UniOpVV::kBroadcastV128_F64: {
+ if (src.is_reg()) {
+ ASMJIT_ASSERT(src.is_vec());
+ src = src.as<Vec>().xmm();
+ }
+
+ // 128-bit broadcast is like 128-bit mov in this case as we don't have a wider destination.
+ if (dst.is_vec128()) {
+ avx_mov(*this, dst, src);
+ return;
+ }
+
+ // Broadcast instructions only work when the source is a memory operand.
+ if (src.is_mem()) {
+ if (!has_avx512()) {
+ ASMJIT_ASSERT(dst.is_vec256());
+ inst_id = (op >= UniOpVV::kBroadcastV128_F32 || !has_avx2()) ? Inst::kIdVbroadcastf128 : Inst::kIdVbroadcasti128;
+ }
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ // Broadcast with a register source operand is implemented via insert in AVX/AVX2 case.
+ if (dst.is_vec256()) {
+ if (!has_avx512())
+ inst_id = (op >= UniOpVV::kBroadcastV128_F32 || !has_avx2()) ? Inst::kIdVinsertf128 : Inst::kIdVinserti128;
+ else
+ inst_id = avx512_vinsert_128[size_t(op) - size_t(UniOpVV::kBroadcastV128_U32)];
+
+ cc->emit(inst_id, dst, src.as<Vec>().ymm(), src, 1);
+ return;
+ }
+
+ // Broadcast with a register to 512-bits is implemented via 128-bit shuffle.
+ ASMJIT_ASSERT(dst.is_vec512());
+
+ inst_id = avx512_vshuf_128[size_t(op) - size_t(UniOpVV::kBroadcastV128_U32)];
+ src = src.as<Vec>().zmm();
+ cc->emit(inst_id, dst, src, src, x86::shuffle_imm(0, 0, 0, 0));
+ return;
+ }
+
+ case UniOpVV::kBroadcastV256_U32:
+ case UniOpVV::kBroadcastV256_U64:
+ case UniOpVV::kBroadcastV256_F32:
+ case UniOpVV::kBroadcastV256_F64: {
+ if (src.is_reg()) {
+ ASMJIT_ASSERT(src.is_vec());
+ src = src.as<Vec>().ymm();
+ }
+
+ // Cannot broadcast 256-bit vector to a 128-bit or 256-bit vector...
+ if (!dst.is_vec512()) {
+ avx_mov(*this, dst.ymm(), src);
+ return;
+ }
+
+ if (src.is_mem()) {
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ inst_id = avx512_vshuf_128[size_t(op) - size_t(UniOpVV::kBroadcastV256_U32)];
+ src = src.as<Vec>().zmm();
+ cc->emit(inst_id, dst, src, src, x86::shuffle_imm(1, 0, 1, 0));
+ return;
+ }
+
+ case UniOpVV::kAbsI64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->vpxor(tmp, tmp, tmp);
+ cc->emit(Inst::kIdVpsubq, tmp, tmp, src);
+ cc->emit(Inst::kIdVblendvpd, dst, tmp, src, tmp);
+ return;
+ }
+
+ case UniOpVV::kNotU32:
+ case UniOpVV::kNotU64:
+ case UniOpVV::kNotF32:
+ case UniOpVV::kNotF64: {
+ avx_bit_not(*this, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtI8ToI32:
+ case UniOpVV::kCvtU8ToU32: {
+ if (src.is_reg())
+ src.as<Vec>().set_signature(signature_of_xmm_ymm_zmm[0]);
+ else
+ src.as<Mem>().set_size(dst.size() / 4u);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtI8HiToI16:
+ case UniOpVV::kCvtU8HiToU16:
+ case UniOpVV::kCvtI16HiToI32:
+ case UniOpVV::kCvtU16HiToU32:
+ case UniOpVV::kCvtI32HiToI64:
+ case UniOpVV::kCvtU32HiToU64:
+ if (src.is_vec()) {
+ if (dst.is_vec128()) {
+ Vec tmp = new_vec128("@tmp");
+ cc->vpshufd(tmp, src.as<Vec>(), x86::shuffle_imm(3, 2, 3, 2));
+ src = tmp;
+ }
+ else if (dst.is_vec256()) {
+ Vec tmp = new_vec128("@tmp");
+ cc->vextractf128(tmp, src.as<Vec>().ymm(), 1u);
+ src = tmp;
+ }
+ else if (dst.is_vec512()) {
+ Vec tmp = new_vec256("@tmp");
+ cc->vextracti32x8(tmp, src.as<Vec>().zmm(), 1u);
+ src = tmp;
+ }
+ else {
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else if (src.is_mem()) {
+ src.as<Mem>().add_offset(dst.size() / 2u);
+ }
+ else {
+ ASMJIT_NOT_REACHED();
+ }
+ [[fallthrough]];
+
+ case UniOpVV::kCvtI8LoToI16:
+ case UniOpVV::kCvtU8LoToU16:
+ case UniOpVV::kCvtI16LoToI32:
+ case UniOpVV::kCvtU16LoToU32:
+ case UniOpVV::kCvtI32LoToI64:
+ case UniOpVV::kCvtU32LoToU64: {
+ if (src.is_reg())
+ src.as<Vec>().set_signature(signature_of_xmm_ymm_zmm[dst.size() >> 6]);
+ else
+ src.as<Mem>().set_size(dst.size() / 2u);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kAbsF32S:
+ case UniOpVV::kAbsF64S:
+ case UniOpVV::kAbsF32:
+ case UniOpVV::kAbsF64:
+ case UniOpVV::kNegF32S:
+ case UniOpVV::kNegF64S:
+ case UniOpVV::kNegF32:
+ case UniOpVV::kNegF64: {
+ // Intrinsic.
+ FloatMode fm = FloatMode(op_info.float_mode);
+
+ const void* msk_data =
+ op == UniOpVV::kAbsF32 || op == UniOpVV::kAbsF32S ? static_cast<const void*>(&ct().p_7FFFFFFF7FFFFFFF) :
+ op == UniOpVV::kAbsF64 || op == UniOpVV::kAbsF64S ? static_cast<const void*>(&ct().p_7FFFFFFFFFFFFFFF) :
+ op == UniOpVV::kNegF32 || op == UniOpVV::kNegF32S ? static_cast<const void*>(&ct().p_8000000080000000) :
+ static_cast<const void*>(&ct().p_8000000000000000);
+ Operand msk = simd_const(msk_data, Bcst(op_info.broadcast_size), dst);
+
+ if (src.is_mem() && is_scalar_fp_op(fm)) {
+ avx_fmov(*this, dst, src, fm);
+ cc->emit(inst_id, dst, dst, msk);
+ }
+ else if (src.is_mem() && msk.is_mem()) {
+ avx_fmov(*this, dst, msk, fm);
+ cc->emit(inst_id, dst, dst, src);
+ }
+ else if (src.is_mem()) {
+ cc->emit(inst_id, dst, msk, src);
+ }
+ else {
+ cc->emit(inst_id, dst, src, msk);
+ }
+ return;
+ }
+
+ case UniOpVV::kRcpF32: {
+ // Intrinsic.
+ Vec one = simd_vec_const(&ct().f32_1, Bcst::k32, dst);
+ cc->emit(Inst::kIdVdivps, dst, one, src);
+ return;
+ }
+
+ case UniOpVV::kRcpF64: {
+ // Intrinsic.
+ Vec one = simd_vec_const(&ct().f64_1, Bcst::k32, dst);
+ cc->emit(Inst::kIdVdivpd, dst, one, src);
+ return;
+ }
+
+ case UniOpVV::kTruncF32S:
+ case UniOpVV::kTruncF64S:
+ case UniOpVV::kTruncF32:
+ case UniOpVV::kTruncF64:
+ case UniOpVV::kFloorF32S:
+ case UniOpVV::kFloorF64S:
+ case UniOpVV::kFloorF32:
+ case UniOpVV::kFloorF64:
+ case UniOpVV::kCeilF32S:
+ case UniOpVV::kCeilF64S:
+ case UniOpVV::kCeilF32:
+ case UniOpVV::kCeilF64:
+ case UniOpVV::kRoundEvenF32S:
+ case UniOpVV::kRoundEvenF64S:
+ case UniOpVV::kRoundEvenF32:
+ case UniOpVV::kRoundEvenF64: {
+ FloatMode fm = FloatMode(op_info.float_mode);
+
+ if (is_scalar_fp_op(fm)) {
+ dst = dst.xmm();
+ }
+
+ if (has_avx512() && dst.is_vec512()) {
+ // AVX512 uses a different name.
+ constexpr uint16_t avx512_rndscale[4] = {
+ Inst::kIdVrndscaless,
+ Inst::kIdVrndscalesd,
+ Inst::kIdVrndscaleps,
+ Inst::kIdVrndscalepd
+ };
+ inst_id = avx512_rndscale[(size_t(op) - size_t(UniOpVV::kTruncF32S)) & 0x3];
+ }
+
+ if (is_scalar_fp_op(fm)) {
+ // These instructions use 3 operand form for historical reasons.
+ if (src.is_mem()) {
+ cc->emit(avx_float_inst[size_t(op_info.float_mode)].fmovs, dst, src);
+ cc->emit(inst_id, dst, dst, dst, uint32_t(op_info.imm));
+ }
+ else {
+ src = src.as<Vec>().xmm();
+ cc->emit(inst_id, dst, src, src, uint32_t(op_info.imm));
+ }
+ }
+ else {
+ cc->emit(inst_id, dst, src, uint32_t(op_info.imm));
+ }
+ return;
+ }
+
+ case UniOpVV::kRoundHalfAwayF32S:
+ case UniOpVV::kRoundHalfAwayF64S:
+ case UniOpVV::kRoundHalfAwayF32:
+ case UniOpVV::kRoundHalfAwayF64: {
+ // Intrinsic.
+ FloatMode fm = FloatMode(op_info.float_mode);
+ const FloatInst& fi = avx_float_inst[fm];
+
+ if (is_scalar_fp_op(fm)) {
+ dst = dst.xmm();
+ if (src.is_vec()) {
+ src = src.as<Vec>().clone_as(dst);
+ }
+ }
+
+ if (src.is_mem()) {
+ avx_fmov(*this, dst, src, fm);
+ src = dst;
+ }
+
+ Operand half = get_fop_half_minus_1ulp(*this, dst, fm);
+ Operand msb = get_fop_msb_bit(*this, dst, fm);
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ if (has_avx512()) {
+ cc->emit(fi.fmova, tmp, msb);
+ cc->emit(Inst::kIdVpternlogd, tmp, src, half, 0xEAu); // tmp = (msb & src) | half
+ }
+ else {
+ cc->emit(fi.fand, tmp, src, msb);
+ cc->emit(fi.for_, tmp, tmp, half);
+ }
+
+ cc->emit(fi.fadd, dst, src, tmp);
+
+ if (is_scalar_fp_op(fm)) {
+ cc->emit(fi.fround, dst, dst, dst, x86::RoundImm::kTrunc | x86::RoundImm::kSuppress);
+ }
+ else {
+ InstId round_inst = dst.is_vec512() ? fi.frndscale : fi.fround;
+ cc->emit(round_inst, dst, dst, x86::RoundImm::kTrunc | x86::RoundImm::kSuppress);
+ }
+ return;
+ }
+
+ case UniOpVV::kRoundHalfUpF32S:
+ case UniOpVV::kRoundHalfUpF64S:
+ case UniOpVV::kRoundHalfUpF32:
+ case UniOpVV::kRoundHalfUpF64: {
+ // Intrinsic.
+ FloatMode fm = FloatMode(op_info.float_mode);
+
+ if (is_scalar_fp_op(fm)) {
+ dst = dst.xmm();
+ }
+
+ Operand half = get_fop_half_minus_1ulp(*this, dst, fm);
+ UniOpVVV add_op = translate_op(op, UniOpVV::kRoundHalfUpF32S, UniOpVVV::kAddF32S);
+ UniOpVV floor_op = translate_op(op, UniOpVV::kRoundHalfUpF32S, UniOpVV::kFloorF32S);
+
+ if (src.is_mem()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_fmov(*this, tmp, src, fm);
+ emit_3v(add_op, tmp, tmp, half);
+ emit_2v(floor_op, dst, tmp);
+ }
+ else {
+ emit_3v(add_op, dst, src.as<Vec>().clone_as(dst), half);
+ emit_2v(floor_op, dst, dst);
+ }
+ return;
+ }
+
+ case UniOpVV::kSqrtF32S:
+ case UniOpVV::kSqrtF64S: {
+ dst = dst.xmm();
+
+ // Intrinsic - these instructions use 3 operand form for historical reasons.
+ if (src.is_mem()) {
+ avx_fmov(*this, dst, src, FloatMode(op_info.float_mode));
+ cc->emit(inst_id, dst, dst, dst);
+ }
+ else {
+ src = src.as<Vec>().xmm();
+ cc->emit(inst_id, dst, src, src);
+ }
+ return;
+ }
+
+ case UniOpVV::kCvtF32ToF64S:
+ case UniOpVV::kCvtF64ToF32S: {
+ dst = dst.xmm();
+ if (src.is_vec())
+ src = src.as<Vec>().xmm();
+
+ // Intrinsic - these instructions use 3 operand form for historical reasons.
+ Vec zeros = simd_vec_const(&ct().p_0000000000000000, Bcst::k32, dst);
+ cc->emit(inst_id, dst, zeros, src);
+ return;
+ }
+
+ case UniOpVV::kCvtF32LoToF64:
+ case UniOpVV::kCvtI32LoToF64: {
+ // Intrinsic - widening conversion - low part conversions are native, high part emulated.
+ if (src.is_reg()) {
+ uint32_t w = dst.size() >> 6;
+ src.set_signature(signature_of_xmm_ymm_zmm[w]);
+ }
+ else {
+ uint32_t w = dst.size() >> 4;
+ src.as<Mem>().set_size(w * 8u);
+ }
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtF32HiToF64:
+ case UniOpVV::kCvtI32HiToF64: {
+ if (src.is_reg()) {
+ uint32_t w = dst.size() >> 6;
+ Vec tmp = new_vec_with_width(VecWidth(w), "@tmp");
+
+ src.set_signature(signature_of_xmm_ymm_zmm[w]);
+ if (dst.is_vec512()) {
+ cc->vextracti32x8(tmp, src.as<Vec>().zmm(), 1u);
+ cc->emit(inst_id, dst, tmp);
+ }
+ else if (dst.is_vec256()) {
+ if (has_avx512())
+ cc->vextracti32x4(tmp, src.as<Vec>().ymm(), 1u);
+ else
+ cc->vextracti128(tmp, src.as<Vec>().ymm(), 1u);
+ cc->emit(inst_id, dst, tmp);
+ }
+ else {
+ cc->vpshufd(tmp, src.as<Vec>(), x86::shuffle_imm(3, 2, 3, 2));
+ cc->emit(inst_id, dst, tmp);
+ }
+ }
+ else {
+ uint32_t w = dst.size() >> 4;
+ src.as<Mem>().set_size(w * 8u);
+ src.as<Mem>().add_offset(w * 8u);
+ cc->emit(inst_id, dst, src);
+ }
+
+ return;
+ }
+
+ case UniOpVV::kCvtF64ToF32Lo:
+ case UniOpVV::kCvtTruncF64ToI32Lo:
+ case UniOpVV::kCvtRoundF64ToI32Lo: {
+ // Intrinsic - narrowing conversion - low part conversions are native, high part emulated.
+ uint32_t dst_size = Support::max(dst.size() / 2u, src.x86_rm_size());
+ uint32_t w = dst_size >> 5;
+
+ dst.set_signature(signature_of_xmm_ymm_zmm[w ? w - 1u : 0u]);
+
+ if (src.is_reg())
+ src.set_signature(signature_of_xmm_ymm_zmm[w]);
+ else if (src.x86_rm_size() == 0)
+ src.as<Mem>().set_size(w * 32u);
+
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtF64ToF32Hi:
+ case UniOpVV::kCvtTruncF64ToI32Hi:
+ case UniOpVV::kCvtRoundF64ToI32Hi: {
+ uint32_t w = dst.size() >> 6;
+ Vec tmp = new_vec_with_width(VecWidth(w), "@tmp");
+
+ if (src.is_mem())
+ src.as<Mem>().set_size(dst.size());
+
+ cc->emit(inst_id, tmp, src);
+
+ if (dst.is_vec512())
+ cc->vinserti32x8(dst, dst, tmp.ymm(), 1);
+ else if (dst.is_vec256())
+ cc->vinserti128(dst, dst, tmp.xmm(), 1);
+ else
+ cc->vunpcklpd(dst, dst, tmp);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ InstId inst_id = op_info.sse_inst_id;
+
+ if (has_sse_ext(SSEExt(op_info.sse_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ if (op_info.use_imm)
+ cc->emit(inst_id, dst, src, Imm(op_info.imm));
+ else
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ switch (op) {
+ case UniOpVV::kMov: {
+ cc->emit(Inst::kIdMovaps, dst, src);
+ return;
+ }
+
+ case UniOpVV::kMovU64: {
+ cc->emit(Inst::kIdMovq, dst, src);
+ return;
+ }
+
+ case UniOpVV::kBroadcastU8Z:
+ case UniOpVV::kBroadcastU16Z:
+ case UniOpVV::kBroadcastU8:
+ case UniOpVV::kBroadcastU16: {
+ // Intrinsic - 8/16-bit broadcasts are generally not available in SSE mode - we have to emulate.
+ ASMJIT_ASSERT(src.is_reg() || src.is_mem());
+ ElementSize element_size = ElementSize(op_info.element_size);
+
+ if (src.is_mem() || src.is_gp()) {
+ Gp tmp = new_gp32("@tmp");
+ uint32_t mul_by = element_size == ElementSize::k8 ? 0x01010101u : 0x00010001u;
+
+ if (src.is_mem()) {
+ src.as<Mem>().set_size(element_size == ElementSize::k8 ? 1 : 2);
+ cc->movzx(tmp, src.as<Mem>());
+ cc->imul(tmp, tmp, mul_by);
+ }
+ else if (op_info.imm == 0x01) {
+ // OPTIMIZATION: If it's guaranteed that the unused part of the register is zero, we can imul without zero extending.
+ cc->imul(tmp, src.as<Gp>().r32(), mul_by);
+ }
+ else {
+ OperandSignature src_signature = OperandSignature{
+ element_size == ElementSize::k8 ? RegTraits<RegType::kGp8Lo>::kSignature : RegTraits<RegType::kGp16>::kSignature};
+ src.as<Gp>().set_signature(src_signature);
+ cc->movzx(tmp, src.as<Gp>());
+ cc->imul(tmp, tmp, mul_by);
+ }
+
+ cc->emit(Inst::kIdMovd, dst, tmp);
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(0, 0, 0, 0));
+ return;
+ }
+
+ ASMJIT_ASSERT(src.is_vec());
+
+ if (has_ssse3()) {
+ if (element_size == ElementSize::k8 || (element_size == ElementSize::k16 && is_same_vec(dst, src))) {
+ Operand predicate = element_size == ElementSize::k8 ? simd_const(&ct().p_0000000000000000, Bcst::kNA, dst.as<Vec>())
+ : simd_const(&ct().p_0100010001000100, Bcst::kNA, dst.as<Vec>());
+ sse_mov(*this, dst, src);
+ cc->emit(Inst::kIdPshufb, dst, predicate);
+ return;
+ }
+ }
+
+ if (element_size == ElementSize::k8) {
+ sse_mov(*this, dst, src);
+ cc->emit(Inst::kIdPunpcklbw, dst, dst);
+ src = dst;
+ }
+
+ cc->emit(Inst::kIdPshuflw, dst, src, x86::shuffle_imm(0, 0, 0, 0));
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(0, 0, 0, 0));
+ return;
+ }
+
+ case UniOpVV::kBroadcastU32:
+ case UniOpVV::kBroadcastF32: {
+ // Intrinsic - 32-bit broadcast is generally not available in SSE mode - we have to emulate.
+ ASMJIT_ASSERT(src.is_reg() || src.is_mem());
+
+ if (src.is_gp()) {
+ cc->emit(Inst::kIdMovd, dst, src.as<Gp>().r32());
+ src = dst;
+ }
+
+ if (src.is_reg()) {
+ cc->emit(Inst::kIdPshufd, dst, src, x86::shuffle_imm(0, 0, 0, 0));
+ }
+ else {
+ cc->emit(Inst::kIdMovd, dst, src);
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(0, 0, 0, 0));
+ }
+
+ return;
+ }
+
+ case UniOpVV::kBroadcastU64:
+ case UniOpVV::kBroadcastF64: {
+ // Intrinsic - 64-bit broadcast is generally not available in SSE mode - we have to emulate.
+ ASMJIT_ASSERT(src.is_reg() || src.is_mem());
+
+ if (src.is_gp()) {
+ cc->emit(Inst::kIdMovq, dst, src.as<Gp>().r64());
+ src = dst;
+ }
+
+ if (has_sse3()) {
+ cc->emit(Inst::kIdMovddup, dst, src);
+ }
+ else if (src.is_reg()) {
+ cc->emit(Inst::kIdPshufd, dst, src, x86::shuffle_imm(1, 0, 1, 0));
+ }
+ else {
+ cc->emit(Inst::kIdMovq, dst, src);
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(1, 0, 1, 0));
+ }
+
+ return;
+ }
+
+ case UniOpVV::kBroadcastV128_U32:
+ case UniOpVV::kBroadcastV128_U64:
+ case UniOpVV::kBroadcastV128_F32:
+ case UniOpVV::kBroadcastV128_F64: {
+ // 128-bit broadcast is like 128-bit mov in this case as we don't have wider vectors.
+ sse_mov(*this, dst, src);
+ return;
+ }
+
+ case UniOpVV::kAbsI8: {
+ // Native operation requires SSSE3, which is not supported by the target.
+ if (is_same_vec(dst, src)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdPxor, tmp, tmp);
+ cc->emit(Inst::kIdPsubb, tmp, dst);
+ cc->emit(Inst::kIdPminub, dst, tmp);
+ }
+ else {
+ cc->emit(Inst::kIdPxor, dst, dst);
+ cc->emit(Inst::kIdPsubb, dst, src);
+ cc->emit(Inst::kIdPminub, dst, src);
+ }
+ return;
+ }
+
+ case UniOpVV::kAbsI16: {
+ // Native operation requires SSSE3, which is not supported by the target.
+ if (is_same_vec(dst, src)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdPxor, tmp, tmp);
+ cc->emit(Inst::kIdPsubw, tmp, dst);
+ cc->emit(Inst::kIdPmaxsw, dst, tmp);
+ }
+ else {
+ cc->emit(Inst::kIdPxor, dst, dst);
+ cc->emit(Inst::kIdPsubw, dst, src);
+ cc->emit(Inst::kIdPmaxsw, dst, src);
+ }
+ return;
+ }
+
+ case UniOpVV::kAbsI32: {
+ // Native operation requires SSSE3, which is not supported by the target.
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdMovaps, tmp, src);
+ cc->emit(Inst::kIdPsrad, tmp, 31);
+ sse_mov(*this, dst, src);
+ cc->emit(Inst::kIdPxor, dst, tmp);
+ cc->emit(Inst::kIdPsubd, dst, tmp);
+ return;
+ }
+
+ case UniOpVV::kAbsI64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdPshufd, tmp, src, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdPsrad, tmp, 31);
+ sse_mov(*this, dst, src);
+ cc->emit(Inst::kIdPxor, dst, tmp);
+ cc->emit(Inst::kIdPsubq, dst, tmp);
+ return;
+ }
+
+ case UniOpVV::kNotU32:
+ case UniOpVV::kNotU64:
+ case UniOpVV::kNotF32:
+ case UniOpVV::kNotF64: {
+ sse_bit_not(*this, dst, src);
+ return;
+ }
+
+ case UniOpVV::kCvtI8ToI32:
+ case UniOpVV::kCvtU8ToU32: {
+ if (src.is_mem())
+ src.as<Mem>().set_size(4u);
+
+ if (has_sse4_1()) {
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ if (src.is_mem()) {
+ cc->movd(dst, src.as<x86::Mem>());
+ src = dst;
+ }
+
+ WideningOp cvt = (op == UniOpVV::kCvtI8ToI32) ? WideningOp::kI8ToI32 : WideningOp::kU8ToU32;
+ sse_int_widen(*this, dst, src.as<Vec>(), cvt);
+ return;
+ }
+
+ case UniOpVV::kCvtU8HiToU16:
+ case UniOpVV::kCvtU16HiToU32:
+ case UniOpVV::kCvtU32HiToU64:
+ if (src.is_vec() && dst.id() != src.id() && has_sse4_1()) {
+ cc->pshufd(dst, src.as<Vec>(), x86::shuffle_imm(3, 2, 3, 2));
+ cc->emit(inst_id, dst, dst);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVV::kCvtI8HiToI16:
+ case UniOpVV::kCvtI16HiToI32:
+ case UniOpVV::kCvtI32HiToI64:
+ if (src.is_vec()) {
+ sse_mov(*this, dst, src);
+
+ switch (op) {
+ case UniOpVV::kCvtI8HiToI16: {
+ cc->punpckhbw(dst, dst);
+ cc->psraw(dst, 8);
+ break;
+ }
+
+ case UniOpVV::kCvtU8HiToU16: {
+ cc->emit(Inst::kIdPunpckhbw, dst, simd_const(&ct().p_0000000000000000, Bcst::kNA, dst));
+ break;
+ }
+
+ case UniOpVV::kCvtI16HiToI32: {
+ cc->punpckhwd(dst, dst);
+ cc->psrad(dst, 16);
+ break;
+ }
+
+ case UniOpVV::kCvtU16HiToU32: {
+ cc->emit(Inst::kIdPunpckhwd, dst, simd_const(&ct().p_0000000000000000, Bcst::kNA, dst));
+ break;
+ }
+
+ case UniOpVV::kCvtI32HiToI64: {
+ Vec tmp = new_vec128("@tmp");
+ sse_mov(*this, tmp, dst);
+ cc->psrad(tmp, 31);
+ cc->punpckhdq(dst, tmp);
+ break;
+ }
+
+ case UniOpVV::kCvtU32HiToU64: {
+ cc->emit(Inst::kIdPunpckhdq, dst, simd_const(&ct().p_0000000000000000, Bcst::kNA, dst));
+ break;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ return;
+ }
+ else if (src.is_mem()) {
+ src.as<Mem>().add_offset(8u);
+ op = UniOpVV(uint32_t(op) - 1);
+ }
+ else {
+ ASMJIT_NOT_REACHED();
+ }
+ [[fallthrough]];
+
+ case UniOpVV::kCvtI8LoToI16:
+ case UniOpVV::kCvtU8LoToU16:
+ case UniOpVV::kCvtI16LoToI32:
+ case UniOpVV::kCvtU16LoToU32:
+ case UniOpVV::kCvtI32LoToI64:
+ case UniOpVV::kCvtU32LoToU64: {
+ if (src.is_mem())
+ src.as<Mem>().set_size(8u);
+
+ if (has_sse4_1()) {
+ cc->emit(inst_id, dst, src);
+ return;
+ }
+
+ if (src.is_mem()) {
+ cc->movq(dst, src.as<x86::Mem>());
+ src = dst;
+ }
+
+ WideningOp cvt {};
+ switch (op) {
+ case UniOpVV::kCvtI8LoToI16 : cvt = WideningOp::kI8ToI16; break;
+ case UniOpVV::kCvtU8LoToU16 : cvt = WideningOp::kU8ToU16; break;
+ case UniOpVV::kCvtI16LoToI32: cvt = WideningOp::kI16ToI32; break;
+ case UniOpVV::kCvtU16LoToU32: cvt = WideningOp::kU16ToU32; break;
+ case UniOpVV::kCvtI32LoToI64: cvt = WideningOp::kI32ToI64; break;
+ case UniOpVV::kCvtU32LoToU64: cvt = WideningOp::kU32ToU64; break;
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ sse_int_widen(*this, dst, src.as<Vec>(), cvt);
+ return;
+ }
+
+ case UniOpVV::kTruncF32:
+ case UniOpVV::kTruncF64:
+ case UniOpVV::kFloorF32:
+ case UniOpVV::kFloorF64:
+ case UniOpVV::kCeilF32:
+ case UniOpVV::kCeilF64:
+ case UniOpVV::kRoundEvenF32:
+ case UniOpVV::kRoundEvenF64:
+ // Native operation requires SSE4.1.
+ if (has_sse4_1()) {
+ cc->emit(inst_id, dst, src, Imm(op_info.imm));
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVV::kTruncF32S:
+ case UniOpVV::kTruncF64S:
+ case UniOpVV::kFloorF32S:
+ case UniOpVV::kFloorF64S:
+ case UniOpVV::kCeilF32S:
+ case UniOpVV::kCeilF64S:
+ case UniOpVV::kRoundEvenF32S:
+ case UniOpVV::kRoundEvenF64S: {
+ // Native operation requires SSE4.1.
+ if (has_sse4_1()) {
+ sse_fmov(*this, dst, src, FloatMode(op_info.float_mode));
+ cc->emit(inst_id, dst, dst, Imm(op_info.imm));
+ return;
+ }
+
+ sse_round(*this, dst, src, FloatMode(op_info.float_mode), x86::RoundImm(op_info.imm & 0x7));
+ return;
+ }
+
+ case UniOpVV::kRoundHalfAwayF32S:
+ case UniOpVV::kRoundHalfAwayF64S:
+ case UniOpVV::kRoundHalfAwayF32:
+ case UniOpVV::kRoundHalfAwayF64: {
+ // Intrinsic.
+ FloatMode fm = FloatMode(op_info.float_mode);
+ const FloatInst& fi = sse_float_inst[fm];
+
+ Operand half = get_fop_half_minus_1ulp(*this, dst, fm);
+ Operand msb = get_fop_msb_bit(*this, dst, fm);
+
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ sse_fmov(*this, dst, src, fm);
+ sse_mov(*this, tmp, msb);
+ cc->emit(fi.fand, tmp, dst);
+ cc->emit(fi.for_, tmp, half);
+ cc->emit(fi.fadd, dst, tmp);
+
+ sse_round(*this, dst, dst, fm, x86::RoundImm(op_info.imm & 0x7));
+ return;
+ }
+
+ case UniOpVV::kRoundHalfUpF32S:
+ case UniOpVV::kRoundHalfUpF64S:
+ case UniOpVV::kRoundHalfUpF32:
+ case UniOpVV::kRoundHalfUpF64: {
+ // Intrinsic.
+ FloatMode fm = FloatMode(op_info.float_mode);
+ const FloatInst& fi = sse_float_inst[fm];
+
+ Operand half = get_fop_half_minus_1ulp(*this, dst, fm);
+ sse_fmov(*this, dst, src, fm);
+ cc->emit(fi.fadd, dst, half);
+ sse_round(*this, dst, dst, fm, x86::RoundImm(op_info.imm & 0x7));
+ return;
+ }
+
+ case UniOpVV::kAbsF32S:
+ case UniOpVV::kAbsF64S:
+ case UniOpVV::kAbsF32:
+ case UniOpVV::kAbsF64:
+ case UniOpVV::kNegF32S:
+ case UniOpVV::kNegF64S:
+ case UniOpVV::kNegF32:
+ case UniOpVV::kNegF64: {
+ // Intrinsic.
+ FloatMode fm = FloatMode(op_info.float_mode);
+
+ const void* msk_data =
+ op == UniOpVV::kAbsF32 || op == UniOpVV::kAbsF32S ? static_cast<const void*>(&ct().p_7FFFFFFF7FFFFFFF) :
+ op == UniOpVV::kAbsF64 || op == UniOpVV::kAbsF64S ? static_cast<const void*>(&ct().p_7FFFFFFFFFFFFFFF) :
+ op == UniOpVV::kNegF32 || op == UniOpVV::kNegF32S ? static_cast<const void*>(&ct().p_8000000080000000) :
+ static_cast<const void*>(&ct().p_8000000000000000);
+ Operand msk = simd_const(msk_data, Bcst(op_info.broadcast_size), dst);
+
+ sse_fmov(*this, dst, src, fm);
+ cc->emit(inst_id, dst, msk);
+ return;
+ }
+
+ case UniOpVV::kRcpF32: {
+ Operand one = simd_const(&ct().f32_1, Bcst::k32, dst);
+ if (is_same_vec(dst, src)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, one);
+ cc->emit(Inst::kIdDivps, tmp, src);
+ sse_mov(*this, dst, tmp);
+ }
+ else {
+ sse_mov(*this, dst, one);
+ cc->emit(Inst::kIdDivps, dst, src);
+ }
+ return;
+ }
+
+ case UniOpVV::kRcpF64: {
+ Operand one = simd_const(&ct().f64_1, Bcst::k64, dst);
+ if (is_same_vec(dst, src)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, one);
+ cc->emit(Inst::kIdDivpd, tmp, src);
+ sse_mov(*this, dst, tmp);
+ }
+ else {
+ sse_mov(*this, dst, one);
+ cc->emit(Inst::kIdDivpd, dst, src);
+ }
+ return;
+ }
+
+ case UniOpVV::kSqrtF32S:
+ case UniOpVV::kSqrtF64S: {
+ sse_mov(*this, dst, src);
+ cc->emit(inst_id, dst, dst);
+ return;
+ }
+
+ case UniOpVV::kCvtF32ToF64S:
+ case UniOpVV::kCvtF64ToF32S: {
+ if (is_same_vec(dst, src)) {
+ cc->emit(inst_id, dst, src);
+ }
+ else {
+ cc->emit(Inst::kIdXorps, dst, dst);
+ cc->emit(inst_id, dst, src);
+ }
+ return;
+ }
+
+ case UniOpVV::kCvtF32HiToF64:
+ case UniOpVV::kCvtI32HiToF64: {
+ if (src.is_mem()) {
+ Mem mem(src.as<Mem>());
+ mem.add_offset(8);
+ cc->emit(inst_id, dst, mem);
+ }
+ else {
+ if (is_same_vec(dst, src))
+ cc->emit(Inst::kIdMovhlps, dst, src);
+ else
+ cc->emit(Inst::kIdPshufd, dst, src, x86::shuffle_imm(3, 2, 3, 2));
+ cc->emit(inst_id, dst, dst);
+ }
+ return;
+ }
+
+ case UniOpVV::kCvtF64ToF32Hi:
+ case UniOpVV::kCvtTruncF64ToI32Hi:
+ case UniOpVV::kCvtRoundF64ToI32Hi: {
+ Vec tmp = new_vec128("@tmp");
+
+ if (src.is_mem())
+ src.as<Mem>().set_size(dst.size());
+
+ cc->emit(inst_id, tmp, src);
+ cc->emit(Inst::kIdUnpcklpd, dst, tmp);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_2v(UniOpVV op, const OpArray& dst_, const Operand_& src_) { emit_2v_t(*this, op, dst_, src_); }
+void UniCompiler::emit_2v(UniOpVV op, const OpArray& dst_, const OpArray& src_) { emit_2v_t(*this, op, dst_, src_); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 2VI
+// ==================================================
+
+void UniCompiler::emit_2vi(UniOpVVI op, const Operand_& dst_, const Operand_& src_, uint32_t imm) {
+ ASMJIT_ASSERT(dst_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Operand src(src_);
+ UniOpVInfo op_info = opcode_info_2vi[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ InstId inst_id = op_info.avx_inst_id;
+
+ if (has_avx_ext(AVXExt(op_info.avx_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ cc->emit(inst_id, dst, src, Imm(imm));
+ return;
+ }
+
+ switch (op) {
+ case UniOpVVI::kSllU16:
+ case UniOpVVI::kSllU32:
+ case UniOpVVI::kSllU64:
+ case UniOpVVI::kSrlU16:
+ case UniOpVVI::kSrlU32:
+ case UniOpVVI::kSrlU64:
+ case UniOpVVI::kSraI16:
+ case UniOpVVI::kSraI32:
+ case UniOpVVI::kSllbU128:
+ case UniOpVVI::kSrlbU128: {
+ // This instruction requires AVX-512 if the source is a memory operand.
+ if (src.is_mem()) {
+ avx_mov(*this, dst, src);
+ cc->emit(inst_id, dst, dst, imm);
+ }
+ else {
+ cc->emit(inst_id, dst, src, imm);
+ }
+ return;
+ }
+
+ case UniOpVVI::kSraI64: {
+ // Native operation requires AVX-512, which is not supported by the target.
+ if (imm == 0) {
+ avx_mov(*this, dst, src);
+ return;
+ }
+
+ if (imm == 63) {
+ cc->emit(Inst::kIdVpshufd, dst, src, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdVpsrad, dst, dst, 31);
+ return;
+ }
+
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ if (src.is_mem()) {
+ avx_mov(*this, dst, src);
+ src = dst;
+ }
+
+ if (imm <= 32) {
+ cc->emit(Inst::kIdVpsrad, tmp, src, Support::min<uint32_t>(imm, 31u));
+ cc->emit(Inst::kIdVpsrlq, dst, src, imm);
+ cc->emit(Inst::kIdVpblendw, dst, dst, tmp, 0xCC);
+ return;
+ }
+
+ cc->emit(Inst::kIdVpshufd, tmp, src, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdVpsrad, tmp, tmp, 31);
+ cc->emit(Inst::kIdVpsrlq, dst, src, imm);
+ cc->emit(Inst::kIdVpsllq, tmp, tmp, 64u - imm);
+ cc->emit(Inst::kIdVpor, dst, dst, tmp);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU16x4: {
+ // Intrinsic.
+
+ // TODO: [JIT] OPTIMIZATION: Use VPSHUFB instead where appropriate.
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ cc->emit(Inst::kIdVpshuflw, dst, src, shuf_imm);
+ cc->emit(Inst::kIdVpshufhw, dst, dst, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleLoU16x4:
+ case UniOpVVI::kSwizzleHiU16x4:
+ case UniOpVVI::kSwizzleU32x4: {
+ // Intrinsic (AVX | AVX512).
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ cc->emit(inst_id, dst, src, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU64x2: {
+ // Intrinsic (AVX | AVX512).
+ if (Swizzle2{imm} == swizzle(0, 0)) {
+ cc->emit(Inst::kIdVmovddup, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(0, 0) && src.is_reg()) {
+ cc->emit(Inst::kIdVpunpcklqdq, dst, src, src);
+ }
+ else if (Swizzle2{imm} == swizzle(1, 1) && src.is_reg()) {
+ cc->emit(Inst::kIdVpunpckhqdq, dst, src, src);
+ }
+ else {
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle2{imm});
+ cc->emit(Inst::kIdVpshufd, dst, src, shuf_imm);
+ }
+ return;
+ }
+
+ case UniOpVVI::kSwizzleF32x4: {
+ // Intrinsic (AVX | AVX512).
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ if (src.is_reg())
+ cc->emit(Inst::kIdVshufps, dst, src, src, shuf_imm);
+ else
+ cc->emit(Inst::kIdVpshufd, dst, src, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleF64x2: {
+ // Intrinsic (AVX | AVX512).
+ if (Swizzle2{imm} == swizzle(0, 0) && !dst.is_vec512()) {
+ cc->emit(Inst::kIdVmovddup, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(0, 0) && src.is_reg()) {
+ cc->emit(Inst::kIdVunpcklpd, dst, src, src);
+ }
+ else if (Swizzle2{imm} == swizzle(1, 1) && src.is_reg()) {
+ cc->emit(Inst::kIdVunpckhpd, dst, src, src);
+ }
+ else if (src.is_reg()) {
+ uint32_t shuf_imm = shuf_imm2_from_swizzle_with_width(Swizzle2{imm}, VecWidthUtils::vec_width_of(dst));
+ cc->emit(Inst::kIdVshufpd, dst, src, src, shuf_imm);
+ }
+ else {
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle2{imm});
+ cc->emit(Inst::kIdVpshufd, dst, src, shuf_imm);
+ }
+ return;
+ }
+
+ case UniOpVVI::kSwizzleF64x4:
+ case UniOpVVI::kSwizzleU64x4: {
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ cc->emit(op_info.avx_inst_id, dst, src, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kExtractV128_I32:
+ case UniOpVVI::kExtractV128_I64:
+ case UniOpVVI::kExtractV128_F32:
+ case UniOpVVI::kExtractV128_F64: {
+ // Intrinsic (AVX | AVX512).
+ ASMJIT_ASSERT(imm < 4);
+ dst.set_signature(signature_of_xmm_ymm_zmm[0]);
+
+ if (src.is_mem()) {
+ src.as<Mem>().add_offset(imm * 16u);
+ v_loadu128(dst, src.as<x86::Mem>());
+ return;
+ }
+
+ if (src.as<Vec>().is_vec512()) {
+ ASMJIT_ASSERT(imm < 4);
+ cc->vextracti32x4(dst, src.as<Vec>(), imm);
+ }
+ else if (src.as<Vec>().is_vec256()) {
+ ASMJIT_ASSERT(imm < 2);
+ cc->vextractf128(dst, src.as<Vec>(), imm);
+ }
+ else {
+ ASMJIT_NOT_REACHED();
+ }
+
+ return;
+ }
+
+ case UniOpVVI::kExtractV256_I32:
+ case UniOpVVI::kExtractV256_I64:
+ case UniOpVVI::kExtractV256_F32:
+ case UniOpVVI::kExtractV256_F64: {
+ // Intrinsic (AVX | AVX512).
+ ASMJIT_ASSERT(imm < 2);
+ dst.set_signature(signature_of_xmm_ymm_zmm[1]);
+
+ if (src.is_mem()) {
+ src.as<Mem>().add_offset(imm * 32u);
+ v_loadu256(dst, src.as<Mem>());
+ return;
+ }
+
+ ASMJIT_ASSERT(src.as<Vec>().is_vec512());
+ cc->vextracti32x8(dst, src.as<Vec>(), imm);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ InstId inst_id = op_info.sse_inst_id;
+
+ if (has_sse_ext(SSEExt(op_info.sse_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ if (op_info.sse_op_count == 2) {
+ sse_mov(*this, dst, src);
+ cc->emit(inst_id, dst, imm);
+ return;
+ }
+ else if (op_info.sse_op_count == 3) {
+ cc->emit(inst_id, dst, src, imm);
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ switch (op) {
+ case UniOpVVI::kSraI64: {
+ // Intrinsic (SSE2).
+ if (imm == 0) {
+ sse_mov(*this, dst, src);
+ return;
+ }
+
+ if (imm == 63) {
+ cc->emit(Inst::kIdPshufd, dst, src, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdPsrad, dst, 31);
+ return;
+ }
+
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ if (imm <= 32 && has_sse4_1()) {
+ sse_mov(*this, dst, src);
+ sse_mov(*this, tmp, src.is_reg() ? src.as<Vec>() : dst);
+ cc->emit(Inst::kIdPsrad, tmp, Support::min<uint32_t>(imm, 31u));
+ cc->emit(Inst::kIdPsrlq, dst, imm);
+ cc->emit(Inst::kIdPblendw, dst, tmp, 0xCC);
+ return;
+ }
+
+ sse_mov(*this, dst, src);
+ cc->emit(Inst::kIdPshufd, tmp, src.is_reg() ? src.as<Vec>() : dst, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdPsrad, tmp, 31);
+ cc->emit(Inst::kIdPsrlq, dst, imm);
+ cc->emit(Inst::kIdPsllq, tmp, 64u - imm);
+ cc->emit(Inst::kIdPor, dst, tmp);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU16x4: {
+ // Intrinsic (SSE2).
+
+ // TODO: [JIT] OPTIMIZATION: Use VPSHUFB instead where appropriate.
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ cc->emit(Inst::kIdPshuflw, dst, src, shuf_imm);
+ cc->emit(Inst::kIdPshufhw, dst, dst, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleLoU16x4:
+ case UniOpVVI::kSwizzleHiU16x4:
+ case UniOpVVI::kSwizzleU32x4: {
+ // Intrinsic (SSE2).
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ cc->emit(inst_id, dst, src, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleU64x2: {
+ // Intrinsic (SSE2 | SSE3).
+ if (Swizzle2{imm} == swizzle(1, 0)) {
+ sse_mov(*this, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(0, 0) && has_sse3()) {
+ cc->emit(Inst::kIdMovddup, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(0, 0) && is_same_vec(dst, src)) {
+ cc->emit(Inst::kIdPunpcklqdq, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(1, 1) && is_same_vec(dst, src)) {
+ cc->emit(Inst::kIdPunpckhqdq, dst, src);
+ }
+ else {
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle2{imm});
+ cc->emit(Inst::kIdPshufd, dst, src, shuf_imm);
+ }
+ return;
+ }
+
+ case UniOpVVI::kSwizzleF32x4: {
+ // Intrinsic (SSE2).
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ if (is_same_vec(dst, src))
+ cc->emit(Inst::kIdShufps, dst, dst, shuf_imm);
+ else
+ cc->emit(Inst::kIdPshufd, dst, src, shuf_imm);
+ return;
+ }
+
+ case UniOpVVI::kSwizzleF64x2: {
+ // Intrinsic (SSE2 | SSE3).
+ if (Swizzle2{imm} == swizzle(1, 0)) {
+ sse_mov(*this, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(0, 0) && has_sse3()) {
+ cc->emit(Inst::kIdMovddup, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(0, 0) && is_same_vec(dst, src)) {
+ cc->emit(Inst::kIdUnpcklpd, dst, src);
+ }
+ else if (Swizzle2{imm} == swizzle(1, 1) && is_same_vec(dst, src)) {
+ cc->emit(Inst::kIdUnpckhpd, dst, src);
+ }
+ else if (is_same_vec(dst, src)) {
+ uint32_t shuf_imm = shuf_imm2_from_swizzle(Swizzle2{imm});
+ cc->emit(Inst::kIdShufpd, dst, dst, shuf_imm);
+ }
+ else {
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle2{imm});
+ cc->emit(Inst::kIdPshufd, dst, src, shuf_imm);
+ }
+ return;
+ }
+
+ case UniOpVVI::kSwizzleF64x4:
+ case UniOpVVI::kSwizzleU64x4:
+ case UniOpVVI::kExtractV128_I32:
+ case UniOpVVI::kExtractV128_I64:
+ case UniOpVVI::kExtractV128_F32:
+ case UniOpVVI::kExtractV128_F64:
+ case UniOpVVI::kExtractV256_I32:
+ case UniOpVVI::kExtractV256_I64:
+ case UniOpVVI::kExtractV256_F32:
+ case UniOpVVI::kExtractV256_F64:
+ // Not supported in SSE mode.
+ ASMJIT_NOT_REACHED();
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_2vi(UniOpVVI op, const OpArray& dst_, const Operand_& src_, uint32_t imm) { emit_2vi_t(*this, op, dst_, src_, imm); }
+void UniCompiler::emit_2vi(UniOpVVI op, const OpArray& dst_, const OpArray& src_, uint32_t imm) { emit_2vi_t(*this, op, dst_, src_, imm); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 2VS
+// ==================================================
+
+void UniCompiler::emit_2vs(UniOpVR op, const Operand_& dst_, const Operand_& src_, uint32_t idx) {
+ UniOpVInfo op_info = opcode_info_2vs[size_t(op)];
+
+ Operand src(src_);
+ Operand dst(dst_);
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ switch (op) {
+ case UniOpVR::kMov: {
+ ASMJIT_ASSERT(dst.is_reg());
+ ASMJIT_ASSERT(src.is_reg());
+
+ if (dst.is_gp() && src.is_vec()) {
+ if (dst.as<Reg>().size() <= 4)
+ cc->emit(Inst::kIdVmovd, dst.as<Gp>().r32(), src.as<Vec>().xmm());
+ else
+ cc->emit(Inst::kIdVmovq, dst.as<Gp>().r64(), src.as<Vec>().xmm());
+ return;
+ }
+
+ if (dst.is_vec() && src.is_gp()) {
+ if (src.as<Reg>().size() <= 4)
+ cc->emit(Inst::kIdVmovd, dst.as<Vec>().xmm(), src.as<Gp>().r32());
+ else
+ cc->emit(Inst::kIdVmovq, dst.as<Vec>().xmm(), src.as<Gp>().r64());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVR::kMovU32:
+ case UniOpVR::kMovU64: {
+ ASMJIT_ASSERT(dst.is_reg());
+ ASMJIT_ASSERT(src.is_reg());
+
+ if (dst.is_gp() && src.is_vec()) {
+ if (op == UniOpVR::kMovU32)
+ cc->emit(Inst::kIdVmovd, dst.as<Gp>().r32(), src.as<Vec>().xmm());
+ else
+ cc->emit(Inst::kIdVmovq, dst.as<Gp>().r64(), src.as<Vec>().xmm());
+ return;
+ }
+
+ if (dst.is_vec() && src.is_gp()) {
+ if (op == UniOpVR::kMovU32)
+ cc->emit(Inst::kIdVmovd, dst.as<Vec>().xmm(), src.as<Gp>().r32());
+ else
+ cc->emit(Inst::kIdVmovq, dst.as<Vec>().xmm(), src.as<Gp>().r64());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVR::kInsertU8:
+ case UniOpVR::kInsertU16:
+ case UniOpVR::kInsertU32:
+ case UniOpVR::kInsertU64: {
+ ASMJIT_ASSERT(dst.is_vec());
+ ASMJIT_ASSERT(src.is_gp());
+
+ dst = dst.as<Vec>().xmm();
+
+ if (op != UniOpVR::kInsertU64)
+ src = src.as<Gp>().r32();
+
+ cc->emit(op_info.avx_inst_id, dst, dst, src, idx);
+ return;
+ }
+
+ case UniOpVR::kExtractU8:
+ case UniOpVR::kExtractU16:
+ case UniOpVR::kExtractU32:
+ case UniOpVR::kExtractU64: {
+ ASMJIT_ASSERT(dst.is_gp());
+ ASMJIT_ASSERT(src.is_vec());
+
+ src = src.as<Vec>().xmm();
+
+ if (op != UniOpVR::kExtractU64)
+ dst = dst.as<Gp>().r32();
+
+ if (op == UniOpVR::kExtractU32 && idx == 0) {
+ cc->vmovd(dst.as<Gp>(), src.as<Vec>());
+ return;
+ }
+
+ if (op == UniOpVR::kExtractU64) {
+ cc->vmovq(dst.as<Gp>(), src.as<Vec>());
+ return;
+ }
+
+ cc->emit(op_info.avx_inst_id, dst, src, idx);
+ return;
+ }
+
+ case UniOpVR::kCvtIntToF32:
+ case UniOpVR::kCvtIntToF64: {
+ dst = dst.as<Vec>().xmm();
+ cc->emit(Inst::kIdVpxor, dst, dst, dst);
+ cc->emit(op_info.avx_inst_id, dst, dst, src);
+ return;
+ }
+
+ case UniOpVR::kCvtTruncF32ToInt:
+ case UniOpVR::kCvtRoundF32ToInt:
+ case UniOpVR::kCvtTruncF64ToInt:
+ case UniOpVR::kCvtRoundF64ToInt: {
+ if (src.is_vec())
+ src = src.as<Vec>().xmm();
+
+ cc->emit(op_info.avx_inst_id, dst, src);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ switch (op) {
+ case UniOpVR::kMov: {
+ ASMJIT_ASSERT(dst.is_reg());
+ ASMJIT_ASSERT(src.is_reg());
+
+ if (dst.is_gp() && src.is_vec()) {
+ if (dst.as<Reg>().size() <= 4)
+ cc->emit(Inst::kIdMovd, dst.as<Gp>().r32(), src.as<Vec>().xmm());
+ else
+ cc->emit(Inst::kIdMovq, dst.as<Gp>().r64(), src.as<Vec>().xmm());
+ return;
+ }
+
+ if (dst.is_vec() && src.is_gp()) {
+ if (src.as<Reg>().size() <= 4)
+ cc->emit(Inst::kIdMovd, dst.as<Vec>().xmm(), src.as<Gp>().r32());
+ else
+ cc->emit(Inst::kIdMovq, dst.as<Vec>().xmm(), src.as<Gp>().r64());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVR::kMovU32:
+ case UniOpVR::kMovU64: {
+ ASMJIT_ASSERT(dst.is_reg());
+ ASMJIT_ASSERT(src.is_reg());
+
+ if (dst.is_gp() && src.is_vec()) {
+ if (op == UniOpVR::kMovU32)
+ cc->emit(Inst::kIdMovd, dst.as<Gp>().r32(), src.as<Vec>().xmm());
+ else
+ cc->emit(Inst::kIdMovq, dst.as<Gp>().r64(), src.as<Vec>().xmm());
+ return;
+ }
+
+ if (dst.is_vec() && src.is_gp()) {
+ if (op == UniOpVR::kMovU32)
+ cc->emit(Inst::kIdMovd, dst.as<Vec>().xmm(), src.as<Gp>().r32());
+ else
+ cc->emit(Inst::kIdMovq, dst.as<Vec>().xmm(), src.as<Gp>().r64());
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ case UniOpVR::kInsertU8:
+ case UniOpVR::kInsertU16:
+ case UniOpVR::kInsertU32:
+ case UniOpVR::kInsertU64: {
+ ASMJIT_ASSERT(dst.is_vec());
+ ASMJIT_ASSERT(src.is_gp());
+
+ if (op != UniOpVR::kInsertU64)
+ src = src.as<Gp>().r32();
+
+ if (has_sse_ext(SSEExt(op_info.sse_ext))) {
+ cc->emit(op_info.sse_inst_id, dst, src, idx);
+ }
+ else if (op == UniOpVR::kInsertU8) {
+ Gp tmp = new_gp32("@tmp");
+ cc->pextrw(tmp, dst.as<Vec>(), idx / 2u);
+ if (idx & 1)
+ cc->mov(tmp.r8_hi(), src.as<Gp>().r8());
+ else
+ cc->mov(tmp.r8(), src.as<Gp>().r8());
+ cc->pinsrw(dst.as<Vec>(), tmp, idx / 2u);
+ }
+ else if (op == UniOpVR::kInsertU32) {
+ if (idx == 0) {
+ Vec tmp = new_vec128("@tmp");
+ cc->movd(tmp, src.as<Gp>());
+ cc->movss(dst.as<Vec>(), tmp);
+ }
+ else {
+ Gp tmp = new_gp32("@tmp");
+ cc->pinsrw(dst.as<Vec>(), src.as<Gp>(), idx * 2u);
+ cc->mov(tmp.as<Gp>(), src.as<Gp>());
+ cc->shr(tmp.as<Gp>(), 16);
+ cc->pinsrw(dst.as<Vec>(), tmp, idx * 2u + 1u);
+ }
+ }
+ else {
+ Vec tmp = new_vec128("@tmp");
+ cc->movq(tmp, src.as<Gp>());
+
+ if (idx == 0)
+ cc->movsd(dst.as<Vec>(), tmp);
+ else
+ cc->punpcklqdq(dst.as<Vec>(), tmp);
+ }
+
+ return;
+ }
+
+ case UniOpVR::kExtractU8:
+ case UniOpVR::kExtractU16:
+ case UniOpVR::kExtractU32:
+ case UniOpVR::kExtractU64: {
+ ASMJIT_ASSERT(dst.is_gp());
+ ASMJIT_ASSERT(src.is_vec());
+
+ if (op != UniOpVR::kExtractU64)
+ dst = dst.as<Gp>().r32();
+
+ if (op == UniOpVR::kExtractU32 && idx == 0) {
+ cc->movd(dst.as<Gp>(), src.as<Vec>());
+ }
+ else if (op == UniOpVR::kExtractU64 && idx == 0) {
+ cc->movq(dst.as<Gp>(), src.as<Vec>());
+ }
+ else if (has_sse_ext(SSEExt(op_info.sse_ext))) {
+ cc->emit(op_info.sse_inst_id, dst, src, idx);
+ }
+ else if (op == UniOpVR::kExtractU8) {
+ cc->pextrw(dst.as<Gp>(), src.as<Vec>(), idx / 2u);
+ if (idx & 1)
+ cc->shr(dst.as<Gp>(), 8);
+ else
+ cc->and_(dst.as<Gp>(), 0xFF);
+ }
+ else if (op == UniOpVR::kExtractU32) {
+ Vec tmp = new_similar_reg(dst.as<Vec>(), "@tmp");
+ cc->pshufd(tmp, src.as<Vec>(), x86::shuffle_imm(idx, idx, idx, idx));
+ cc->movd(dst.as<Gp>(), tmp);
+ }
+ else {
+ Vec tmp = new_similar_reg(dst.as<Vec>(), "@tmp");
+ cc->pshufd(tmp, src.as<Vec>(), x86::shuffle_imm(3, 2, 3, 2));
+ cc->movq(dst.as<Gp>(), tmp);
+ }
+
+ return;
+ }
+
+ case UniOpVR::kCvtIntToF32:
+ case UniOpVR::kCvtIntToF64: {
+ dst = dst.as<Vec>().xmm();
+ cc->pxor(dst.as<Vec>(), dst.as<Vec>());
+ cc->emit(op_info.sse_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVR::kCvtTruncF32ToInt:
+ case UniOpVR::kCvtRoundF32ToInt:
+ case UniOpVR::kCvtTruncF64ToInt:
+ case UniOpVR::kCvtRoundF64ToInt: {
+ cc->emit(op_info.sse_inst_id, dst, src);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Emit 2VM
+// ==================================================
+
+void UniCompiler::emit_vm(UniOpVM op, const Vec& dst_, const Mem& src_, Alignment alignment, uint32_t idx) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src_.is_mem());
+
+ Vec dst(dst_);
+ Mem src(src_);
+ UniOpVMInfo op_info = opcode_info_2vm[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ switch (op) {
+ case UniOpVM::kLoad8: {
+ dst = dst.xmm();
+ src.set_size(1);
+ avx_zero(*this, dst);
+ cc->vpinsrb(dst, dst, src, 0);
+ return;
+ }
+
+ case UniOpVM::kLoad16_U16:
+ if (!has_avx512_fp16()) {
+ dst = dst.xmm();
+ src.set_size(1);
+ avx_zero(*this, dst);
+ cc->vpinsrw(dst, dst, src, 0);
+ }
+ [[fallthrough]];
+
+ case UniOpVM::kLoad32_U32:
+ case UniOpVM::kLoad32_F32:
+ case UniOpVM::kLoad64_U32:
+ case UniOpVM::kLoad64_U64:
+ case UniOpVM::kLoad64_F32:
+ case UniOpVM::kLoad64_F64: {
+ dst.set_signature(signature_of_xmm_ymm_zmm[0]);
+ src.set_size(op_info.mem_size);
+ cc->emit(op_info.avx_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoad128_U32:
+ case UniOpVM::kLoad128_U64:
+ case UniOpVM::kLoad128_F32:
+ case UniOpVM::kLoad128_F64:
+ case UniOpVM::kLoad256_U32:
+ case UniOpVM::kLoad256_U64:
+ case UniOpVM::kLoad256_F32:
+ case UniOpVM::kLoad256_F64:
+ case UniOpVM::kLoad512_U32:
+ case UniOpVM::kLoad512_U64:
+ case UniOpVM::kLoad512_F32:
+ case UniOpVM::kLoad512_F64:
+ ASMJIT_ASSERT(dst.size() >= op_info.mem_size);
+ dst.set_signature(signature_of_xmm_ymm_zmm[op_info.mem_size >> 5]);
+ [[fallthrough]];
+
+ case UniOpVM::kLoadN_U32:
+ case UniOpVM::kLoadN_U64:
+ case UniOpVM::kLoadN_F32:
+ case UniOpVM::kLoadN_F64: {
+ src.set_size(dst.size());
+ cc->emit((uint32_t(alignment) == 0u || uint32_t(alignment) >= dst.size()) ? Inst::kIdVmovaps : Inst::kIdVmovups, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadCvt16_U8ToU64:
+ case UniOpVM::kLoadCvt32_U8ToU64:
+ case UniOpVM::kLoadCvt64_U8ToU64:
+ dst.set_signature(signature_of_xmm_ymm_zmm[op_info.mem_size >> 2]);
+ [[fallthrough]];
+
+ case UniOpVM::kLoadCvtN_U8ToU64: {
+ ASMJIT_ASSERT(dst.size() >= op_info.mem_size * 8u);
+ src.set_size(dst.size() / 8u);
+ cc->emit(op_info.avx_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadCvt32_I8ToI32:
+ case UniOpVM::kLoadCvt32_U8ToU32:
+ case UniOpVM::kLoadCvt64_I8ToI32:
+ case UniOpVM::kLoadCvt64_U8ToU32:
+ case UniOpVM::kLoadCvt128_I8ToI32:
+ case UniOpVM::kLoadCvt128_U8ToU32:
+ dst.set_signature(signature_of_xmm_ymm_zmm[op_info.mem_size >> 3]);
+ [[fallthrough]];
+
+ case UniOpVM::kLoadCvtN_I8ToI32:
+ case UniOpVM::kLoadCvtN_U8ToU32: {
+ ASMJIT_ASSERT(dst.size() >= op_info.mem_size * 4u);
+ src.set_size(dst.size() / 4u);
+ cc->emit(op_info.avx_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadCvt32_I8ToI16:
+ case UniOpVM::kLoadCvt32_U8ToU16:
+ case UniOpVM::kLoadCvt32_I16ToI32:
+ case UniOpVM::kLoadCvt32_U16ToU32:
+ case UniOpVM::kLoadCvt32_I32ToI64:
+ case UniOpVM::kLoadCvt32_U32ToU64: {
+ dst.set_signature(signature_of_xmm_ymm_zmm[0]);
+ src.set_size(4);
+ cc->vmovd(dst, src);
+ cc->emit(op_info.avx_inst_id, dst, dst);
+ return;
+ }
+
+ case UniOpVM::kLoadCvt64_I8ToI16:
+ case UniOpVM::kLoadCvt64_U8ToU16:
+ case UniOpVM::kLoadCvt64_I16ToI32:
+ case UniOpVM::kLoadCvt64_U16ToU32:
+ case UniOpVM::kLoadCvt64_I32ToI64:
+ case UniOpVM::kLoadCvt64_U32ToU64:
+ case UniOpVM::kLoadCvt128_I8ToI16:
+ case UniOpVM::kLoadCvt128_U8ToU16:
+ case UniOpVM::kLoadCvt128_I16ToI32:
+ case UniOpVM::kLoadCvt128_U16ToU32:
+ case UniOpVM::kLoadCvt128_I32ToI64:
+ case UniOpVM::kLoadCvt128_U32ToU64:
+ case UniOpVM::kLoadCvt256_I8ToI16:
+ case UniOpVM::kLoadCvt256_U8ToU16:
+ case UniOpVM::kLoadCvt256_I16ToI32:
+ case UniOpVM::kLoadCvt256_U16ToU32:
+ case UniOpVM::kLoadCvt256_I32ToI64:
+ case UniOpVM::kLoadCvt256_U32ToU64:
+ ASMJIT_ASSERT(dst.size() >= op_info.mem_size * 2u);
+ dst.set_signature(signature_of_xmm_ymm_zmm[op_info.mem_size >> 4]);
+ [[fallthrough]];
+
+ case UniOpVM::kLoadCvtN_I8ToI16:
+ case UniOpVM::kLoadCvtN_U8ToU16:
+ case UniOpVM::kLoadCvtN_I16ToI32:
+ case UniOpVM::kLoadCvtN_U16ToU32:
+ case UniOpVM::kLoadCvtN_I32ToI64:
+ case UniOpVM::kLoadCvtN_U32ToU64: {
+ src.set_size(dst.size() / 2u);
+ cc->emit(op_info.avx_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadInsertU8:
+ case UniOpVM::kLoadInsertU16:
+ case UniOpVM::kLoadInsertU32:
+ case UniOpVM::kLoadInsertF32: {
+ dst = dst.as<Vec>().xmm();
+ cc->emit(op_info.avx_inst_id, dst, dst, src, idx);
+ return;
+ }
+
+ case UniOpVM::kLoadInsertU64: {
+ dst = dst.as<Vec>().xmm();
+ if (is_64bit()) {
+ cc->emit(op_info.avx_inst_id, dst, dst, src, idx);
+ }
+ else {
+ if (idx == 0)
+ cc->vmovlpd(dst, dst, src);
+ else
+ cc->vmovhpd(dst, dst, src);
+ }
+ return;
+ }
+
+ case UniOpVM::kLoadInsertF32x2: {
+ if (idx == 0)
+ cc->emit(Inst::kIdVmovlps, dst, dst, src);
+ else
+ cc->emit(Inst::kIdVmovhps, dst, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadInsertF64: {
+ if (idx == 0)
+ cc->emit(Inst::kIdVmovlpd, dst, dst, src);
+ else
+ cc->emit(Inst::kIdVmovhpd, dst, dst, src);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ ASMJIT_ASSERT(dst.is_vec128());
+
+ switch (op) {
+ case UniOpVM::kLoad8: {
+ src.set_size(1);
+
+ if (has_sse4_1()) {
+ cc->xorps(dst, dst);
+ cc->pinsrb(dst, src, 0);
+ }
+ else {
+ Gp tmp = new_gp32("@tmp");
+ cc->movzx(tmp, src);
+ cc->movd(dst, tmp);
+ }
+ return;
+ }
+
+ case UniOpVM::kLoad16_U16: {
+ src.set_size(2);
+ cc->xorps(dst, dst);
+ cc->pinsrw(dst, src, 0);
+ return;
+ }
+
+ case UniOpVM::kLoad32_U32:
+ case UniOpVM::kLoad32_F32:
+ case UniOpVM::kLoad64_U32:
+ case UniOpVM::kLoad64_U64:
+ case UniOpVM::kLoad64_F32:
+ case UniOpVM::kLoad64_F64: {
+ src.set_size(op_info.mem_size);
+ cc->emit(op_info.sse_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoad128_U32:
+ case UniOpVM::kLoad128_U64:
+ case UniOpVM::kLoad128_F32:
+ case UniOpVM::kLoad128_F64:
+ case UniOpVM::kLoadN_U32:
+ case UniOpVM::kLoadN_U64:
+ case UniOpVM::kLoadN_F32:
+ case UniOpVM::kLoadN_F64: {
+ src.set_size(16);
+ cc->emit((uint32_t(alignment) == 0u || uint32_t(alignment) >= 16u) ? Inst::kIdMovaps : Inst::kIdMovups, dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadCvt16_U8ToU64:
+ case UniOpVM::kLoadCvtN_U8ToU64: {
+ if (has_sse4_1()) {
+ src.set_size(2);
+ cc->emit(op_info.avx_inst_id, dst, src);
+ }
+ else {
+ src.set_size(1);
+ Gp tmp = new_gp32("@tmp");
+ cc->movzx(tmp, src);
+ cc->movd(dst, tmp);
+
+ src.add_offset(1);
+ cc->movzx(tmp, src);
+ cc->pinsrw(dst, src, 4);
+ }
+ return;
+ }
+
+ case UniOpVM::kLoadCvt32_I8ToI32:
+ case UniOpVM::kLoadCvt32_U8ToU32:
+ case UniOpVM::kLoadCvtN_I8ToI32:
+ case UniOpVM::kLoadCvtN_U8ToU32:
+ if (has_sse4_1()) {
+ src.set_size(4);
+ cc->emit(op_info.sse_inst_id, dst, src);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVM::kLoadCvt32_I8ToI16:
+ case UniOpVM::kLoadCvt32_U8ToU16:
+ case UniOpVM::kLoadCvt32_I16ToI32:
+ case UniOpVM::kLoadCvt32_U16ToU32:
+ case UniOpVM::kLoadCvt32_I32ToI64:
+ case UniOpVM::kLoadCvt32_U32ToU64: {
+ src.set_size(4);
+ cc->vmovd(dst, src);
+ sse_int_widen(*this, dst, dst, WideningOp(op_info.cvt));
+ return;
+ }
+
+ case UniOpVM::kLoadCvt64_I8ToI16:
+ case UniOpVM::kLoadCvt64_U8ToU16:
+ case UniOpVM::kLoadCvt64_I16ToI32:
+ case UniOpVM::kLoadCvt64_U16ToU32:
+ case UniOpVM::kLoadCvt64_I32ToI64:
+ case UniOpVM::kLoadCvt64_U32ToU64:
+ case UniOpVM::kLoadCvtN_I8ToI16:
+ case UniOpVM::kLoadCvtN_U8ToU16:
+ case UniOpVM::kLoadCvtN_I16ToI32:
+ case UniOpVM::kLoadCvtN_U16ToU32:
+ case UniOpVM::kLoadCvtN_I32ToI64:
+ case UniOpVM::kLoadCvtN_U32ToU64: {
+ src.set_size(8);
+ if (has_sse4_1()) {
+ InstId inst = op_info.sse_inst_id;
+ cc->emit(inst, dst, src);
+ }
+ else {
+ cc->movq(dst, src);
+ sse_int_widen(*this, dst, dst, WideningOp(op_info.cvt));
+ }
+ return;
+ }
+
+ case UniOpVM::kLoadInsertU16: {
+ cc->emit(op_info.sse_inst_id, dst, dst, idx);
+ return;
+ }
+
+ case UniOpVM::kLoadInsertF32:
+ op = UniOpVM::kLoadInsertU32;
+ [[fallthrough]];
+
+ case UniOpVM::kLoadInsertU8:
+ case UniOpVM::kLoadInsertU32:
+ case UniOpVM::kLoadInsertU64: {
+ if (has_sse4_1() && (op != UniOpVM::kLoadInsertU64 || is_64bit())) {
+ cc->emit(op_info.sse_inst_id, dst, src, idx);
+ return;
+ }
+
+ if (op == UniOpVM::kLoadInsertU8) {
+ Gp tmp = new_gp32("@tmp");
+ src.set_size(1);
+ cc->pextrw(tmp, dst, idx / 2u);
+ if (idx & 1)
+ cc->mov(tmp.r8_hi(), src);
+ else
+ cc->mov(tmp.r8(), src);
+ cc->pinsrw(dst, tmp, idx / 2u);
+ return;
+ }
+
+ if (op == UniOpVM::kLoadInsertU32) {
+ if (idx == 0) {
+ Vec tmp = new_vec128("@tmp");
+ cc->movd(tmp, src);
+ cc->movss(dst, tmp);
+ }
+ else {
+ cc->pinsrw(dst, src, idx * 2u);
+ src.add_offset(2);
+ cc->pinsrw(dst, src, idx * 2u + 1);
+ }
+ return;
+ }
+
+ ASMJIT_ASSERT(op == UniOpVM::kLoadInsertU64);
+ if (idx == 0)
+ cc->movlpd(dst, src);
+ else
+ cc->movhpd(dst, src);
+
+ return;
+ }
+
+ case UniOpVM::kLoadInsertF32x2: {
+ if (idx == 0)
+ cc->movlps(dst, src);
+ else
+ cc->movhps(dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoadInsertF64: {
+ if (idx == 0)
+ cc->movlpd(dst, src);
+ else
+ cc->movhpd(dst, src);
+ return;
+ }
+
+ case UniOpVM::kLoad256_U32:
+ case UniOpVM::kLoad256_U64:
+ case UniOpVM::kLoad256_F32:
+ case UniOpVM::kLoad256_F64:
+ case UniOpVM::kLoad512_U32:
+ case UniOpVM::kLoad512_U64:
+ case UniOpVM::kLoad512_F32:
+ case UniOpVM::kLoad512_F64:
+ case UniOpVM::kLoadCvt32_U8ToU64:
+ case UniOpVM::kLoadCvt64_U8ToU64:
+ case UniOpVM::kLoadCvt64_I8ToI32:
+ case UniOpVM::kLoadCvt64_U8ToU32:
+ case UniOpVM::kLoadCvt128_I8ToI16:
+ case UniOpVM::kLoadCvt128_U8ToU16:
+ case UniOpVM::kLoadCvt128_I8ToI32:
+ case UniOpVM::kLoadCvt128_U8ToU32:
+ case UniOpVM::kLoadCvt128_I16ToI32:
+ case UniOpVM::kLoadCvt128_U16ToU32:
+ case UniOpVM::kLoadCvt128_I32ToI64:
+ case UniOpVM::kLoadCvt128_U32ToU64:
+ case UniOpVM::kLoadCvt256_I8ToI16:
+ case UniOpVM::kLoadCvt256_U8ToU16:
+ case UniOpVM::kLoadCvt256_I16ToI32:
+ case UniOpVM::kLoadCvt256_U16ToU32:
+ case UniOpVM::kLoadCvt256_I32ToI64:
+ case UniOpVM::kLoadCvt256_U32ToU64:
+ ASMJIT_NOT_REACHED();
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_vm(UniOpVM op, const OpArray& dst_, const Mem& src_, Alignment alignment, uint32_t idx) {
+ Mem src(src_);
+
+ UniOpVMInfo op_info = opcode_info_2vm[size_t(op)];
+ uint32_t mem_size = op_info.mem_size;
+
+ if (mem_size == 0) {
+ uint32_t mem_size_shift = op_info.mem_size_shift;
+ for (size_t i = 0, n = dst_.size(); i < n; i++) {
+ ASMJIT_ASSERT(dst_[i].is_reg() && dst_[i].is_vec());
+
+ const Vec& dst = dst_[i].as<Vec>();
+ mem_size = dst.size() >> mem_size_shift;
+
+ emit_vm(op, dst, src, uint32_t(alignment) > 0u ? alignment : Alignment(mem_size), idx);
+ src.add_offset_lo32(int32_t(mem_size));
+ }
+ }
+ else {
+ if (uint32_t(alignment) == 0u) {
+ alignment = Alignment(mem_size);
+ }
+
+ for (size_t i = 0, n = dst_.size(); i < n; i++) {
+ ASMJIT_ASSERT(dst_[i].is_reg() && dst_[i].is_vec());
+
+ const Vec& dst = dst_[i].as<Vec>();
+ emit_vm(op, dst, src, alignment, idx);
+ src.add_offset_lo32(int32_t(mem_size));
+ }
+ }
+}
+
+void UniCompiler::emit_mv(UniOpMV op, const Mem& dst_, const Vec& src_, Alignment alignment, uint32_t idx) {
+ ASMJIT_ASSERT(dst_.is_mem());
+ ASMJIT_ASSERT(src_.is_reg() && src_.is_vec());
+
+ Mem dst(dst_);
+ Vec src(src_);
+ UniOpVMInfo op_info = opcode_info_2mv[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ switch (op) {
+ case UniOpMV::kStore8: {
+ dst.set_size(1);
+ cc->vpextrb(dst, src.xmm(), 0);
+ return;
+ }
+
+ case UniOpMV::kStore16_U16: {
+ dst.set_size(2);
+ cc->vpextrw(dst, src.xmm(), 0);
+ return;
+ }
+
+ case UniOpMV::kStore32_U32:
+ case UniOpMV::kStore32_F32:
+ case UniOpMV::kStore64_U32:
+ case UniOpMV::kStore64_U64:
+ case UniOpMV::kStore64_F32:
+ case UniOpMV::kStore64_F64: {
+ dst.set_size(op_info.mem_size);
+ cc->emit(op_info.avx_inst_id, dst, src.xmm());
+ return;
+ }
+
+ case UniOpMV::kStore128_U32:
+ case UniOpMV::kStore128_U64:
+ case UniOpMV::kStore128_F32:
+ case UniOpMV::kStore128_F64:
+ case UniOpMV::kStore256_U32:
+ case UniOpMV::kStore256_U64:
+ case UniOpMV::kStore256_F32:
+ case UniOpMV::kStore256_F64:
+ case UniOpMV::kStore512_U32:
+ case UniOpMV::kStore512_U64:
+ case UniOpMV::kStore512_F32:
+ case UniOpMV::kStore512_F64:
+ ASMJIT_ASSERT(src.size() >= op_info.mem_size);
+ src.set_signature(signature_of_xmm_ymm_zmm[op_info.mem_size >> 5]);
+ [[fallthrough]];
+
+ case UniOpMV::kStoreN_U32:
+ case UniOpMV::kStoreN_U64:
+ case UniOpMV::kStoreN_F32:
+ case UniOpMV::kStoreN_F64: {
+ InstId inst = (uint32_t(alignment) == 0 || uint32_t(alignment) >= src.size()) ? Inst::kIdVmovaps : Inst::kIdVmovups;
+ dst.set_size(src.size());
+ cc->emit(inst, dst, src);
+ return;
+ }
+
+ /*
+ case UniOpMV::kStoreCvtz64_U16ToU8:
+ case UniOpMV::kStoreCvtz64_U32ToU16:
+ case UniOpMV::kStoreCvtz64_U64ToU32:
+ case UniOpMV::kStoreCvts64_I16ToI8:
+ case UniOpMV::kStoreCvts64_I16ToU8:
+ case UniOpMV::kStoreCvts64_U16ToU8:
+ case UniOpMV::kStoreCvts64_I32ToI16:
+ case UniOpMV::kStoreCvts64_U32ToU16:
+ case UniOpMV::kStoreCvts64_I64ToI32:
+ case UniOpMV::kStoreCvts64_U64ToU32:
+ case UniOpMV::kStoreCvtz128_U16ToU8:
+ case UniOpMV::kStoreCvtz128_U32ToU16:
+ case UniOpMV::kStoreCvtz128_U64ToU32:
+ case UniOpMV::kStoreCvts128_I16ToI8:
+ case UniOpMV::kStoreCvts128_I16ToU8:
+ case UniOpMV::kStoreCvts128_U16ToU8:
+ case UniOpMV::kStoreCvts128_I32ToI16:
+ case UniOpMV::kStoreCvts128_U32ToU16:
+ case UniOpMV::kStoreCvts128_I64ToI32:
+ case UniOpMV::kStoreCvts128_U64ToU32:
+ case UniOpMV::kStoreCvtz256_U16ToU8:
+ case UniOpMV::kStoreCvtz256_U32ToU16:
+ case UniOpMV::kStoreCvtz256_U64ToU32:
+ case UniOpMV::kStoreCvts256_I16ToI8:
+ case UniOpMV::kStoreCvts256_I16ToU8:
+ case UniOpMV::kStoreCvts256_U16ToU8:
+ case UniOpMV::kStoreCvts256_I32ToI16:
+ case UniOpMV::kStoreCvts256_U32ToU16:
+ case UniOpMV::kStoreCvts256_I64ToI32:
+ case UniOpMV::kStoreCvts256_U64ToU32:
+ case UniOpMV::kStoreCvtzN_U16ToU8:
+ case UniOpMV::kStoreCvtzN_U32ToU16:
+ case UniOpMV::kStoreCvtzN_U64ToU32:
+ case UniOpMV::kStoreCvtsN_I16ToI8:
+ case UniOpMV::kStoreCvtsN_I16ToU8:
+ case UniOpMV::kStoreCvtsN_U16ToU8:
+ case UniOpMV::kStoreCvtsN_I32ToI16:
+ case UniOpMV::kStoreCvtsN_U32ToU16:
+ case UniOpMV::kStoreCvtsN_I64ToI32:
+ case UniOpMV::kStoreCvtsN_U64ToU32:
+ */
+
+ case UniOpMV::kStoreExtractU16:
+ case UniOpMV::kStoreExtractU32:
+ case UniOpMV::kStoreExtractU64: {
+ src = src.xmm();
+
+ if (op == UniOpMV::kStoreExtractU32) {
+ if (idx == 0) {
+ cc->vmovd(dst, src);
+ return;
+ }
+ }
+
+ if (op == UniOpMV::kStoreExtractU64) {
+ if (idx == 0) {
+ cc->vmovq(dst, src);
+ return;
+ }
+ else if (!is_64bit()) {
+ cc->vmovhpd(dst, src);
+ return;
+ }
+ }
+
+ cc->emit(op_info.avx_inst_id, dst, src, idx);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ ASMJIT_ASSERT(src.is_vec128());
+
+ switch (op) {
+ case UniOpMV::kStore8: {
+ dst.set_size(1);
+
+ if (has_sse4_1()) {
+ cc->pextrb(dst, src, 0);
+ }
+ else {
+ Gp tmp = new_gp32("@tmp");
+ cc->movd(tmp, src);
+ cc->mov(dst, tmp.r8());
+ }
+ return;
+ }
+
+ case UniOpMV::kStore16_U16: {
+ dst.set_size(2);
+ if (has_sse4_1()) {
+ cc->pextrw(dst, src, 0);
+ }
+ else {
+ Gp tmp = new_gp32("@tmp");
+ cc->movd(tmp, src);
+ cc->mov(dst, tmp.r16());
+ }
+ return;
+ }
+
+ case UniOpMV::kStore32_U32:
+ case UniOpMV::kStore32_F32:
+ case UniOpMV::kStore64_U32:
+ case UniOpMV::kStore64_U64:
+ case UniOpMV::kStore64_F32:
+ case UniOpMV::kStore64_F64: {
+ dst.set_size(op_info.mem_size);
+ cc->emit(op_info.sse_inst_id, dst, src);
+ return;
+ }
+
+ case UniOpMV::kStore128_U32:
+ case UniOpMV::kStore128_U64:
+ case UniOpMV::kStore128_F32:
+ case UniOpMV::kStore128_F64:
+ case UniOpMV::kStoreN_U32:
+ case UniOpMV::kStoreN_U64:
+ case UniOpMV::kStoreN_F32:
+ case UniOpMV::kStoreN_F64: {
+ InstId inst = (uint32_t(alignment) == 0u || uint32_t(alignment) >= 16u) ? Inst::kIdMovaps : Inst::kIdMovups;
+ dst.set_size(16);
+ cc->emit(inst, dst, src);
+ return;
+
+ }
+
+ /*
+ case UniOpMV::kStoreCvtz64_U16ToU8:
+ case UniOpMV::kStoreCvtz64_U32ToU16:
+ case UniOpMV::kStoreCvtz64_U64ToU32:
+ case UniOpMV::kStoreCvts64_I16ToI8:
+ case UniOpMV::kStoreCvts64_I16ToU8:
+ case UniOpMV::kStoreCvts64_U16ToU8:
+ case UniOpMV::kStoreCvts64_I32ToI16:
+ case UniOpMV::kStoreCvts64_U32ToU16:
+ case UniOpMV::kStoreCvts64_I64ToI32:
+ case UniOpMV::kStoreCvts64_U64ToU32:
+ case UniOpMV::kStoreCvtzN_U16ToU8:
+ case UniOpMV::kStoreCvtzN_U32ToU16:
+ case UniOpMV::kStoreCvtzN_U64ToU32:
+ case UniOpMV::kStoreCvtsN_I16ToI8:
+ case UniOpMV::kStoreCvtsN_I16ToU8:
+ case UniOpMV::kStoreCvtsN_U16ToU8:
+ case UniOpMV::kStoreCvtsN_I32ToI16:
+ case UniOpMV::kStoreCvtsN_U32ToU16:
+ case UniOpMV::kStoreCvtsN_I64ToI32:
+ case UniOpMV::kStoreCvtsN_U64ToU32: {
+ UNIMPLEMENTED();
+ return;
+ }
+ */
+
+ case UniOpMV::kStore256_U32:
+ case UniOpMV::kStore256_U64:
+ case UniOpMV::kStore256_F32:
+ case UniOpMV::kStore256_F64:
+ case UniOpMV::kStore512_U32:
+ case UniOpMV::kStore512_U64:
+ case UniOpMV::kStore512_F32:
+ case UniOpMV::kStore512_F64:
+ /*
+ case UniOpMV::kStoreCvtz128_U16ToU8:
+ case UniOpMV::kStoreCvtz128_U32ToU16:
+ case UniOpMV::kStoreCvtz128_U64ToU32:
+ case UniOpMV::kStoreCvts128_I16ToI8:
+ case UniOpMV::kStoreCvts128_I16ToU8:
+ case UniOpMV::kStoreCvts128_U16ToU8:
+ case UniOpMV::kStoreCvts128_I32ToI16:
+ case UniOpMV::kStoreCvts128_U32ToU16:
+ case UniOpMV::kStoreCvts128_I64ToI32:
+ case UniOpMV::kStoreCvts128_U64ToU32:
+ case UniOpMV::kStoreCvtz256_U16ToU8:
+ case UniOpMV::kStoreCvtz256_U32ToU16:
+ case UniOpMV::kStoreCvtz256_U64ToU32:
+ case UniOpMV::kStoreCvts256_I16ToI8:
+ case UniOpMV::kStoreCvts256_I16ToU8:
+ case UniOpMV::kStoreCvts256_U16ToU8:
+ case UniOpMV::kStoreCvts256_I32ToI16:
+ case UniOpMV::kStoreCvts256_U32ToU16:
+ case UniOpMV::kStoreCvts256_I64ToI32:
+ case UniOpMV::kStoreCvts256_U64ToU32:
+ */
+ ASMJIT_NOT_REACHED();
+
+ case UniOpMV::kStoreExtractU16:
+ case UniOpMV::kStoreExtractU32:
+ case UniOpMV::kStoreExtractU64: {
+ if (op == UniOpMV::kStoreExtractU32) {
+ if (idx == 0) {
+ cc->movd(dst, src);
+ return;
+ }
+ }
+
+ if (op == UniOpMV::kStoreExtractU64) {
+ if (idx == 0) {
+ cc->movq(dst, src);
+ return;
+ }
+
+ if (idx == 1) {
+ cc->movhps(dst, src);
+ return;
+ }
+ }
+
+ if (has_sse4_1()) {
+ cc->emit(op_info.sse_inst_id, dst, src, idx);
+ return;
+ }
+
+ // SSE4.1 not available - only required when extracting 16-bit and 32-bit quantities as 64-bit quantities
+ // were already handled. Additionally, there is no PEXTRW instruction in SSE2 that would extract to memory,
+ // this instruction was added by SSE4.1 as well (there are actually two forms of PEXTRW).
+ if (op == UniOpMV::kStoreExtractU16) {
+ Gp tmp = new_gp32("@pextrw_tmp");
+ cc->pextrw(tmp, src, idx);
+ cc->mov(dst, tmp);
+ return;
+ }
+
+ if (op == UniOpMV::kStoreExtractU32) {
+ Vec tmp = new_vec128("@pextrd_tmp");
+ cc->pshufd(tmp, src, x86::shuffle_imm(idx, idx, idx, idx));
+ cc->movd(dst, tmp);
+ return;
+ }
+
+ ASMJIT_NOT_REACHED();
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_mv(UniOpMV op, const Mem& dst_, const OpArray& src_, Alignment alignment, uint32_t idx) {
+ Support::maybe_unused(idx);
+
+ Mem dst(dst_);
+
+ UniOpVMInfo op_info = opcode_info_2mv[size_t(op)];
+ uint32_t mem_size = op_info.mem_size;
+
+ if (mem_size == 0) {
+ for (size_t i = 0, n = src_.size(); i < n; i++) {
+ ASMJIT_ASSERT(src_[i].is_reg() && src_[i].is_vec());
+
+ const Vec& src = src_[i].as<Vec>();
+ mem_size = src.size();
+
+ emit_mv(op, dst, src, uint32_t(alignment) > 0u ? alignment : Alignment(mem_size));
+ dst.add_offset_lo32(int32_t(mem_size));
+ }
+ }
+ else {
+ if (uint32_t(alignment) == 0) {
+ alignment = Alignment(mem_size);
+ }
+
+ for (size_t i = 0, n = src_.size(); i < n; i++) {
+ ASMJIT_ASSERT(src_[i].is_reg() && src_[i].is_vec());
+
+ const Vec& src = src_[i].as<Vec>();
+ emit_mv(op, dst, src, alignment);
+ dst.add_offset_lo32(int32_t(mem_size));
+ }
+ }
+}
+
+// ujit::UniCompiler - Vector Instructions - Emit 3V
+// =================================================
+
+void UniCompiler::emit_3v(UniOpVVV op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src1_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Vec src1v(src1_.as<Vec>().clone_as(dst));
+ Operand src2(src2_);
+ UniOpVInfo op_info = opcode_info_3v[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ InstId inst_id = op_info.avx_inst_id;
+
+ static constexpr InstId avx_vpmovm2v_table[] = {
+ Inst::kIdVpmovm2b,
+ Inst::kIdVpmovm2w,
+ Inst::kIdVpmovm2d,
+ Inst::kIdVpmovm2q
+ };
+
+ if (is_same_vec(src1v, src2)) {
+ switch (SameVecOp(op_info.same_vec_op)) {
+ case SameVecOp::kZero: avx_zero(*this, dst); return;
+ case SameVecOp::kOnes: avx_ones(*this, dst); return;
+ case SameVecOp::kSrc: avx_mov(*this, dst, src1v); return;
+
+ default:
+ break;
+ }
+ }
+
+ if (has_avx_ext(AVXExt(op_info.avx_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ FloatMode fm = FloatMode(op_info.float_mode);
+ if (is_scalar_fp_op(fm)) {
+ dst.set_signature(signature_of_xmm_ymm_zmm[0]);
+ src1v.set_signature(signature_of_xmm_ymm_zmm[0]);
+
+ if (src2.is_vec())
+ src2.as<Vec>().set_signature(signature_of_xmm_ymm_zmm[0]);
+ }
+
+ if (op >= UniOpVVV::kAndU32 && op <= UniOpVVV::kAndnU64 && !has_avx512()) {
+ static constexpr uint16_t avx512_to_avx_bitwise_map[] = {
+ Inst::kIdVpand , Inst::kIdVpand ,
+ Inst::kIdVpor , Inst::kIdVpor ,
+ Inst::kIdVpxor , Inst::kIdVpxor ,
+ Inst::kIdVpandn, Inst::kIdVpandn
+ };
+ inst_id = avx512_to_avx_bitwise_map[size_t(op) - size_t(UniOpVVV::kAndU32)];
+ }
+
+ if (op_info.comparison && ((dst.is_vec512()) ||
+ (src2.is_mem() && src2.as<Mem>().has_broadcast()) ||
+ (AVXExt(op_info.avx_ext) == AVXExt::kAVX512))) {
+ // AVX-512 instructions change semantics when it comes to comparisons. Instead of having a VEC destination
+ // we need a K destination. To not change semantics to our users we just convert the predicate to a VEC mask.
+ x86::KReg kTmp = cc->new_kq("@kTmp");
+ InstId kMovM = avx_vpmovm2v_table[op_info.element_size];
+
+ if (op_info.use_imm)
+ cc->emit(inst_id, kTmp, src1v, src2, Imm(op_info.imm));
+ else
+ cc->emit(inst_id, kTmp, src1v, src2);
+
+ cc->emit(kMovM, dst, kTmp);
+ return;
+ }
+
+ if (op_info.use_imm)
+ cc->emit(inst_id, dst, src1v, src2, Imm(op_info.imm));
+ else
+ cc->emit(inst_id, dst, src1v, src2);
+ return;
+ }
+
+ switch (op) {
+ case UniOpVVV::kBicU32:
+ case UniOpVVV::kBicU64:
+ case UniOpVVV::kBicF32:
+ case UniOpVVV::kBicF64: {
+ if (has_avx512()) {
+ uint32_t ternlog_inst = ElementSize(op_info.element_size) == ElementSize::k32 ? Inst::kIdVpternlogd : Inst::kIdVpternlogq;
+ if (src2.is_mem())
+ cc->emit(ternlog_inst, dst, src1v, src2.as<Mem>(), 0x44);
+ else
+ cc->emit(inst_id, dst, src2, src1v);
+ return;
+ }
+
+ if (op <= UniOpVVV::kBicU64)
+ inst_id = Inst::kIdVpandn;
+
+ if (src2.is_mem()) {
+ src2 = UniCompiler_load_new(*this, dst, src2.as<Mem>(), op_info.broadcast_size);
+ }
+
+ cc->emit(inst_id, dst, src2, src1v);
+ return;
+ }
+
+ // dst = a - (floor(a / b) * b).
+ case UniOpVVV::kModF32S:
+ case UniOpVVV::kModF64S:
+ case UniOpVVV::kModF32:
+ case UniOpVVV::kModF64: {
+ FloatMode fm = FloatMode(op_info.float_mode);
+ UniOpVV trunc_op = translate_op(op, UniOpVVV::kModF32S, UniOpVV::kTruncF32);
+ const FloatInst& fi = avx_float_inst[fm];
+
+ x86::Vec tmp = new_similar_reg(dst, "@mod_tmp");
+ cc->emit(fi.fdiv, tmp, src1v, src2);
+ emit_2v(trunc_op, tmp, tmp);
+ cc->emit(fi.fmul, tmp, tmp, src2);
+ cc->emit(fi.fsub, dst, src1v, tmp);
+
+ return;
+ }
+
+ case UniOpVVV::kMulU64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ if (src2.is_mem()) {
+ src2 = UniCompiler_load_new(*this, dst, src2.as<Mem>(), op_info.broadcast_size);
+ }
+
+ Vec src2v = src2.as<Vec>().clone_as(dst);
+ Vec al_bh = new_similar_reg(dst, "@al_bh");
+ Vec ah_bl = new_similar_reg(dst, "@ah_bl");
+ Vec hi_part = new_similar_reg(dst, "@hi_part");
+
+ cc->vpsrlq(al_bh, src2v, 32);
+ cc->vpsrlq(ah_bl, src1v, 32);
+
+ cc->vpmuludq(al_bh, al_bh, src1v);
+ cc->vpmuludq(ah_bl, ah_bl, src2v);
+ cc->vpmuludq(dst, src1v, src2v);
+
+ cc->vpaddq(hi_part, al_bh, ah_bl);
+ cc->vpsllq(hi_part, hi_part, 32);
+ cc->vpaddq(dst, dst, hi_part);
+
+ return;
+ }
+
+ case UniOpVVV::kMulU64_LoU32: {
+ // Intrinsic.
+ Vec tmp = new_similar_reg(dst.as<Vec>(), "@tmp");
+
+ if (has_avx512()) {
+ Vec msk = simd_vec_const(&ct().p_FFFFFFFF00000000, Bcst::k64, dst);
+ cc->emit(Inst::kIdVpandnq, tmp, msk, src2);
+ cc->emit(Inst::kIdVpmullq, dst, src1v, tmp);
+ }
+ else {
+ cc->emit(Inst::kIdVpshufd, tmp, src1v, x86::shuffle_imm(2, 3, 0, 1));
+ cc->emit(Inst::kIdVpmuludq, tmp, tmp, src2);
+ cc->emit(Inst::kIdVpmuludq, dst, src1v, src2);
+ cc->emit(Inst::kIdVpsllq, tmp, tmp, 32);
+ cc->emit(Inst::kIdVpaddq, dst, dst, tmp);
+ }
+ return;
+ }
+
+ case UniOpVVV::kMinI64:
+ case UniOpVVV::kMaxI64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ if (src2.is_mem()) {
+ src2 = UniCompiler_load_new(*this, dst, src2.as<Mem>(), op_info.broadcast_size);
+ }
+
+ ASMJIT_ASSERT(src2.is_vec());
+ Vec src2v = src2.as<Vec>().clone_as(dst);
+
+ Vec msk = dst;
+ if (dst.id() == src1v.id() || dst.id() == src2v.id()) {
+ msk = new_similar_reg(dst, "@msk");
+ }
+
+ cc->vpcmpgtq(msk, src1v, src2v); // msk = src1 > src2
+ if (op == UniOpVVV::kMinI64)
+ cc->vblendvpd(dst, src1v, src2v, msk); // dst = msk == 0 ? src1 : src2;
+ else
+ cc->vblendvpd(dst, src2v, src1v, msk); // dst = msk == 0 ? src2 : src1;
+ return;
+ }
+
+ case UniOpVVV::kMinU64:
+ case UniOpVVV::kMaxU64: {
+ if (src2.is_mem()) {
+ src2 = UniCompiler_load_new(*this, dst, src2.as<Mem>(), op_info.broadcast_size);
+ }
+
+ ASMJIT_ASSERT(src2.is_vec());
+ Vec src2v = src2.as<Vec>().clone_as(dst);
+
+ Vec tmp1 = dst;
+ Vec tmp2 = new_similar_reg(dst, "@tmp2");
+
+ if (dst.id() == src1v.id() || dst.id() == src2v.id()) {
+ tmp1 = new_similar_reg(dst, "@tmp1");
+ }
+
+ avx_isign_flip(*this, tmp1, src1v, ElementSize::k64);
+ avx_isign_flip(*this, tmp2, src2v, ElementSize::k64);
+
+ cc->vpcmpgtq(tmp1, tmp1, tmp2); // tmp1 = src1 > src2
+ if (op == UniOpVVV::kMinU64)
+ cc->vblendvpd(dst, src1v, src2v, tmp1); // dst = tmp1 == 0 ? src1 : src2;
+ else
+ cc->vblendvpd(dst, src2v, src1v, tmp1); // dst = tmp1 == 0 ? src2 : src1;
+ return;
+ }
+
+ case UniOpVVV::kCmpGtU8:
+ case UniOpVVV::kCmpGtU16:
+ case UniOpVVV::kCmpGtU32: {
+ // Native operation requires AVX512, which is not supported by the target.
+ CmpMinMaxInst inst = avx_cmp_min_max[(size_t(op) - size_t(UniOpVVV::kCmpGtI8)) & 0x7u];
+ if (is_same_vec(dst, src1v)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(inst.pmin, tmp, src1v, src2);
+ cc->emit(inst.peq, dst, dst, tmp);
+ }
+ else {
+ cc->emit(inst.pmin, dst, src1v, src2);
+ cc->emit(inst.peq, dst, dst, src1v);
+ }
+ avx_bit_not(*this, dst, dst);
+ return;
+ }
+
+ case UniOpVVV::kCmpGtU64:
+ case UniOpVVV::kCmpLeU64: {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_isign_flip(*this, tmp, src2, ElementSize::k64);
+ avx_isign_flip(*this, dst, src1v, ElementSize::k64);
+ cc->emit(Inst::kIdVpcmpgtq, dst, dst, tmp);
+
+ if (op == UniOpVVV::kCmpLeU64) {
+ avx_bit_not(*this, dst, dst);
+ }
+ return;
+ }
+
+ case UniOpVVV::kCmpGeI8:
+ case UniOpVVV::kCmpGeU8:
+ case UniOpVVV::kCmpGeI16:
+ case UniOpVVV::kCmpGeU16:
+ case UniOpVVV::kCmpGeI32:
+ case UniOpVVV::kCmpGeU32: {
+ CmpMinMaxInst inst = avx_cmp_min_max[(size_t(op) - size_t(UniOpVVV::kCmpGeI8)) & 0x7u];
+
+ if (dst.id() == src1v.id()) {
+ if (!src2.is_reg()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(inst.pmax, tmp, src1v, src2);
+ cc->emit(inst.peq, dst, tmp, src1v);
+ }
+ else {
+ cc->emit(inst.pmin, dst, src1v, src2);
+ cc->emit(inst.peq, dst, dst, src2);
+ }
+ }
+ else {
+ cc->emit(inst.pmax, dst, src1v, src2);
+ cc->emit(inst.peq, dst, dst, src1v);
+ }
+
+ return;
+ }
+
+ case UniOpVVV::kCmpLtI8:
+ case UniOpVVV::kCmpLtI16:
+ case UniOpVVV::kCmpLtI32:
+ case UniOpVVV::kCmpLtI64:
+ case UniOpVVV::kCmpGeI64: {
+ if (!src2.is_reg()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ CmpMinMaxInst inst = avx_cmp_min_max[(size_t(op) - size_t(UniOpVVV::kCmpLtI8)) & 0x7u];
+ cc->emit(inst.pgt, dst, src2, src1v);
+
+ if (op == UniOpVVV::kCmpGeI64) {
+ avx_bit_not(*this, dst, dst);
+ }
+ return;
+ }
+
+ case UniOpVVV::kCmpLtU8:
+ case UniOpVVV::kCmpLtU16:
+ case UniOpVVV::kCmpLtU32:
+ case UniOpVVV::kCmpLtU64:
+ case UniOpVVV::kCmpGeU64: {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_isign_flip(*this, tmp, src2, ElementSize(op_info.element_size));
+ avx_isign_flip(*this, dst, src1v, ElementSize(op_info.element_size));
+
+ CmpMinMaxInst inst = avx_cmp_min_max[(size_t(op) - size_t(UniOpVVV::kCmpLtI8)) & 0x7u];
+ cc->emit(inst.pgt, dst, tmp, dst);
+
+ if (op == UniOpVVV::kCmpGeU64) {
+ avx_bit_not(*this, dst, dst);
+ }
+ return;
+ }
+
+ case UniOpVVV::kCmpLeI8:
+ case UniOpVVV::kCmpLeU8:
+ case UniOpVVV::kCmpLeI16:
+ case UniOpVVV::kCmpLeU16:
+ case UniOpVVV::kCmpLeI32:
+ case UniOpVVV::kCmpLeU32: {
+ CmpMinMaxInst inst = avx_cmp_min_max[(size_t(op) - size_t(UniOpVVV::kCmpLeI8)) & 0x7u];
+
+ if (dst.id() == src1v.id()) {
+ if (!src2.is_reg()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(inst.pmin, tmp, src1v, src2);
+ cc->emit(inst.peq, dst, tmp, src1v);
+ }
+ else {
+ cc->emit(inst.pmax, dst, src1v, src2);
+ cc->emit(inst.peq, dst, dst, src2);
+ }
+ }
+ else {
+ cc->emit(inst.pmin, dst, src1v, src2);
+ cc->emit(inst.peq, dst, dst, src1v);
+ }
+
+ return;
+ }
+
+ case UniOpVVV::kCmpLeI64: {
+ cc->emit(Inst::kIdVpcmpgtq, dst, src1v, src2);
+
+ avx_bit_not(*this, dst, dst);
+ return;
+ }
+
+ case UniOpVVV::kHAddF64: {
+ if (has_avx512() && dst.is_vec512()) {
+ // [B A] [C A]
+ // [D C] -> [D B]
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ cc->emit(Inst::kIdVunpckhpd, tmp, src1v, src2);
+ cc->emit(Inst::kIdVunpcklpd, dst, src1v, src2);
+ cc->vaddpd(dst, dst, tmp);
+ }
+ else {
+ cc->emit(inst_id, dst, src1v, src2);
+ }
+ return;
+ }
+
+ case UniOpVVV::kCombineLoHiU64:
+ case UniOpVVV::kCombineLoHiF64: {
+ // Intrinsic - dst = {src1.u64[0], src2.64[1]} - combining low part of src1 and high part of src1.
+ if (!src2.is_reg()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ uint32_t shuf_imm = shuf_imm2_from_swizzle_with_width(swizzle(0, 1), VecWidthUtils::vec_width_of(dst));
+ cc->emit(Inst::kIdVshufpd, dst, src2, src1v, shuf_imm);
+ return;
+ }
+
+ case UniOpVVV::kCombineHiLoU64:
+ case UniOpVVV::kCombineHiLoF64: {
+ // Intrinsic - dst = {src1.u64[1], src2.u64[0]} - combining high part of src1 and low part of src2.
+ if (dst.is_vec128()) {
+ if (src2.is_vec())
+ cc->emit(Inst::kIdVmovsd, dst, src1v.xmm(), src2.as<Vec>().xmm());
+ else
+ cc->emit(Inst::kIdVmovlpd, dst, src1v.xmm(), src2);
+ return;
+ }
+
+ if (!src2.is_reg()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ uint32_t shuf_imm = shuf_imm2_from_swizzle_with_width(swizzle(1, 0), VecWidthUtils::vec_width_of(dst));
+ cc->emit(Inst::kIdVshufpd, dst, src2, src1v, shuf_imm);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ InstId inst_id = op_info.sse_inst_id;
+
+ // SSE floating point comparison cannot use the extended predicates as introduced by AVX.
+ static constexpr uint8_t sse_fcmp_imm_table[] = {
+ 0x00u, // kCmpEq (eq ordered quiet).
+ 0x04u, // kCmpNe (ne ordered quiet).
+ 0x01u, // kCmpGt (lt ordered quiet <reversed>).
+ 0x02u, // kCmpGe (le ordered quiet <reversed>).
+ 0x01u, // kCmpLt (lt ordered quiet).
+ 0x02u, // kCmpLe (le ordered quiet).
+ 0x07u, // kCmpOrd (ordered quiet).
+ 0x03u // kCmpUnord (unordered quiet).
+ };
+
+ if (is_same_vec(dst, src2) && op_info.commutative) {
+ std::swap(src1v, src2.as<Vec>());
+ }
+
+ if (is_same_vec(src1v, src2)) {
+ switch (SameVecOp(op_info.same_vec_op)) {
+ case SameVecOp::kZero:
+ cc->emit(Inst::kIdPxor, dst, dst);
+ return;
+
+ case SameVecOp::kOnes:
+ cc->emit(Inst::kIdPcmpeqb, dst, dst);
+ return;
+
+ case SameVecOp::kSrc:
+ sse_mov(*this, dst, src1v);
+ return;
+
+ default:
+ break;
+ }
+ }
+
+ if (has_sse_ext(SSEExt(op_info.sse_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ if (!is_same_vec(dst, src1v)) {
+ if (is_same_vec(dst, src2)) {
+ Vec tmp = new_similar_reg(dst, "tmp");
+ sse_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ sse_mov(*this, dst, src1v);
+ }
+
+ if (op_info.use_imm)
+ cc->emit(inst_id, dst, src2, Imm(op_info.imm));
+ else
+ cc->emit(inst_id, dst, src2);
+ return;
+ }
+
+ switch (op) {
+ case UniOpVVV::kBicU32:
+ case UniOpVVV::kBicU64:
+ case UniOpVVV::kBicF32:
+ case UniOpVVV::kBicF64: {
+ if (is_same_vec(dst, src2)) {
+ cc->emit(inst_id, dst, src1v);
+ return;
+ }
+
+ if (is_same_vec(dst, src1v)) {
+ Vec tmp = new_similar_reg(dst);
+ sse_mov(*this, tmp, src1v);
+ src1v = tmp;
+ }
+
+ sse_mov(*this, dst, src2);
+ cc->emit(inst_id, dst, src1v);
+ return;
+ }
+
+ // dst = a - (floor(a / b) * b).
+ case UniOpVVV::kModF32S:
+ case UniOpVVV::kModF64S:
+ case UniOpVVV::kModF32:
+ case UniOpVVV::kModF64: {
+ FloatMode fm = FloatMode(op_info.float_mode);
+ UniOpVV trunc_op = translate_op(op, UniOpVVV::kModF32S, UniOpVV::kTruncF32);
+ const FloatInst& fi = sse_float_inst[fm];
+
+ x86::Vec tmp = new_similar_reg(dst, "@mod_tmp");
+
+ cc->emit(fi.fmova, tmp, src1v);
+ cc->emit(fi.fdiv, tmp, src2);
+
+ emit_2v(trunc_op, tmp, tmp);
+ cc->emit(fi.fmul, tmp, src2);
+
+ sse_fmov(*this, dst, src1v, fm);
+ cc->emit(fi.fsub, dst, tmp);
+ return;
+ }
+
+ case UniOpVVV::kMulU32: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ Vec tmp1 = new_similar_reg(dst, "tmp1");
+ Vec tmp2 = new_similar_reg(dst, "tmp2");
+
+ cc->emit(Inst::kIdPshufd, tmp1, src1v, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdPshufd, tmp2, src2, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdPmuludq, tmp1, tmp2);
+
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPmuludq, dst, src2);
+ cc->emit(Inst::kIdShufps, dst, tmp1, x86::shuffle_imm(2, 0, 2, 0));
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(3, 1, 2, 0));
+ return;
+ }
+
+ case UniOpVVV::kMulU64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ Vec al_bh = new_similar_reg(dst, "@al_bh");
+ Vec ah_bl = new_similar_reg(dst, "@ah_bl");
+
+ cc->emit(Inst::kIdPshufd, al_bh, src2, x86::shuffle_imm(3, 3, 1, 1));
+ cc->emit(Inst::kIdPshufd, ah_bl, src1v, x86::shuffle_imm(3, 3, 1, 1));
+
+ cc->emit(Inst::kIdPmuludq, al_bh, src1v);
+ cc->emit(Inst::kIdPmuludq, ah_bl, src2);
+ cc->emit(Inst::kIdPaddq, al_bh, ah_bl);
+
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPmuludq, dst, src2);
+ cc->emit(Inst::kIdPsllq, al_bh, 32);
+ cc->emit(Inst::kIdPaddq, dst, al_bh);
+ return;
+ }
+
+ case UniOpVVV::kMulU64_LoU32: {
+ Vec tmp = new_similar_reg(dst.as<Vec>(), "@tmp");
+
+ cc->emit(Inst::kIdPshufd, tmp, src1v, x86::shuffle_imm(2, 3, 0, 1));
+ cc->emit(Inst::kIdPmuludq, tmp, src2);
+
+ if (dst.id() == src2.id()) {
+ cc->emit(Inst::kIdPmuludq, dst, src1v);
+ }
+ else {
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPmuludq, dst, src2);
+ }
+ cc->emit(Inst::kIdPsllq, tmp, 32);
+ cc->emit(Inst::kIdPaddq, dst, tmp);
+
+ return;
+ }
+
+ // Native operation requires AVX512, which is not supported by the target.
+ case UniOpVVV::kMinI64:
+ if (!has_sse4_2()) {
+ Vec msk = new_vec128("@msk");
+ sse_cmp_gt_i64(*this, msk, src2, src1v);
+ sse_select(*this, dst, src1v, src2, msk);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVVV::kMinI8:
+ case UniOpVVV::kMinI32: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ InstId cmp_inst_id = op == UniOpVVV::kMinI8 ? Inst::kIdPcmpgtb :
+ op == UniOpVVV::kMinI32 ? Inst::kIdPcmpgtd : Inst::kIdPcmpgtq;
+ Vec msk = new_vec128("@msk");
+ cc->emit(Inst::kIdMovaps, msk, src2);
+ cc->emit(cmp_inst_id, msk, src1v);
+ sse_select(*this, dst, src1v, src2, msk);
+ return;
+ }
+
+ case UniOpVVV::kMaxI64:
+ // Native operation requires AVX512, which is not supported by the target.
+ if (!has_sse4_2()) {
+ Vec msk = new_vec128("@msk");
+ sse_cmp_gt_i64(*this, msk, src1v, src2);
+ sse_select(*this, dst, src1v, src2, msk);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVVV::kMaxI8:
+ case UniOpVVV::kMaxI32: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ InstId cmp_inst_id = op == UniOpVVV::kMaxI8 ? Inst::kIdPcmpgtb :
+ op == UniOpVVV::kMaxI32 ? Inst::kIdPcmpgtd : Inst::kIdPcmpgtq;
+ Vec msk = new_vec128("@msk");
+ cc->emit(Inst::kIdMovaps, msk, src1v);
+ cc->emit(cmp_inst_id, msk, src2);
+ sse_select(*this, dst, src1v, src2, msk);
+ return;
+ }
+
+ case UniOpVVV::kMinU16: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ Vec tmp = new_vec128("@tmp");
+ cc->emit(Inst::kIdMovaps, tmp, src1v);
+ cc->emit(Inst::kIdPsubusw, tmp, src2);
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPsubw, dst, tmp);
+ return;
+ }
+
+ case UniOpVVV::kMaxU16: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPsubusw, dst, src2);
+ cc->emit(Inst::kIdPaddw, dst, src2);
+ return;
+ }
+
+ case UniOpVVV::kMinU32:
+ case UniOpVVV::kMaxU32: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ Operand flip_mask = simd_const(&ct().p_8000000080000000, Bcst::kNA, dst);
+ Vec tmp1 = new_similar_reg(dst, "@tmp1");
+ Vec tmp2 = new_similar_reg(dst, "@tmp2");
+
+ if (op == UniOpVVV::kMinU32) {
+ sse_mov(*this, tmp1, src2);
+ sse_mov(*this, tmp2, src1v);
+ }
+ else {
+ sse_mov(*this, tmp1, src1v);
+ sse_mov(*this, tmp2, src2);
+ }
+
+ cc->emit(Inst::kIdPxor, tmp1, flip_mask);
+ cc->emit(Inst::kIdPxor, tmp2, flip_mask);
+ cc->emit(Inst::kIdPcmpgtd, tmp1, tmp2);
+
+ sse_select(*this, dst, src1v, src2, tmp1);
+ return;
+ }
+
+ case UniOpVVV::kMinU64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ Vec msk = new_similar_reg(dst, "@tmp1");
+ sse_cmp_gt_u64(*this, msk, src2, src1v);
+ sse_select(*this, dst, src1v, src2, msk);
+ return;
+ }
+
+ case UniOpVVV::kMaxU64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ Vec msk = new_similar_reg(dst, "@tmp1");
+ sse_cmp_gt_u64(*this, msk, src1v, src2);
+ sse_select(*this, dst, src1v, src2, msk);
+ return;
+ }
+
+ case UniOpVVV::kCmpEqU64: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPcmpeqd, dst, src2);
+ cc->emit(Inst::kIdPshufd, tmp, dst, x86::shuffle_imm(2, 3, 0, 1));
+ cc->emit(Inst::kIdPand, dst, tmp);
+ return;
+ }
+
+ case UniOpVVV::kCmpGtI64: {
+ // Native operation requires SSE4.2, which is not supported by the target.
+ sse_cmp_gt_i64(*this, dst, src1v, src2);
+ return;
+ }
+
+ case UniOpVVV::kCmpGtU8:
+ case UniOpVVV::kCmpGtU16:
+ case UniOpVVV::kCmpGtU32: {
+ CmpMinMaxInst inst = sse_cmp_min_max[size_t(op) - size_t(UniOpVVV::kCmpGtI8)];
+
+ if (has_sse4_1() || op == UniOpVVV::kCmpGtU8) {
+ if (dst.id() == src1v.id()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdMovaps, tmp, src1v);
+ cc->emit(inst.pmin, tmp, src2);
+ cc->emit(inst.peq, dst, tmp);
+ }
+ else if (is_same_vec(dst, src2)) {
+ cc->emit(inst.pmin, dst, src1v);
+ cc->emit(inst.peq, dst, src1v);
+ }
+ else {
+ cc->emit(Inst::kIdMovaps, dst, src1v);
+ cc->emit(inst.pmin, dst, src2);
+ cc->emit(inst.peq, dst, src1v);
+ }
+
+ sse_bit_not(*this, dst, dst);
+ return;
+ }
+
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_msb_flip(*this, tmp, src2, ElementSize(op_info.element_size));
+ sse_msb_flip(*this, dst, src1v, ElementSize(op_info.element_size));
+ cc->emit(inst.pgt, dst, tmp);
+ return;
+ }
+
+ case UniOpVVV::kCmpGtU64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ sse_cmp_gt_u64(*this, dst, src1v, src2);
+ return;
+ }
+
+ case UniOpVVV::kCmpGeI8:
+ case UniOpVVV::kCmpGeU8:
+ case UniOpVVV::kCmpGeI16:
+ case UniOpVVV::kCmpGeU16:
+ case UniOpVVV::kCmpGeI32:
+ case UniOpVVV::kCmpGeU32:
+ // Native operation requires AVX512, which is not supported by the target.
+ if (has_sse4_1() || op == UniOpVVV::kCmpGeU8 || op == UniOpVVV::kCmpGeI16) {
+ CmpMinMaxInst inst = sse_cmp_min_max[size_t(op) - size_t(UniOpVVV::kCmpGeI8)];
+
+ if (dst.id() == src1v.id()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdMovaps, tmp, src1v);
+ cc->emit(inst.pmax, tmp, src2);
+ cc->emit(inst.peq, dst, tmp);
+ }
+ else if (is_same_vec(dst, src2)) {
+ cc->emit(inst.pmax, dst, src1v);
+ cc->emit(inst.peq, dst, src1v);
+ }
+ else {
+ cc->emit(Inst::kIdMovaps, dst, src1v);
+ cc->emit(inst.pmax, dst, src2);
+ cc->emit(inst.peq, dst, src1v);
+ }
+ return;
+ }
+
+ if (op == UniOpVVV::kCmpGeU16) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+
+ sse_mov(*this, tmp, src1v);
+ cc->emit(Inst::kIdPsubusw, tmp, src2);
+ cc->emit(Inst::kIdPaddw, tmp, src2);
+
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPcmpeqw, dst, tmp);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVVV::kCmpGeI64:
+ case UniOpVVV::kCmpGeU64:
+ // Native operation requires AVX512, which is not supported by the target.
+ if (src2.is_mem()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ switch (op) {
+ case UniOpVVV::kCmpGeI8: v_cmp_gt_i8(dst, src2, src1v); break;
+ case UniOpVVV::kCmpGeI32: v_cmp_gt_i32(dst, src2, src1v); break;
+ case UniOpVVV::kCmpGeU32: v_cmp_gt_u32(dst, src2, src1v); break;
+ case UniOpVVV::kCmpGeI64: v_cmp_gt_i64(dst, src2, src1v); break;
+ case UniOpVVV::kCmpGeU64: v_cmp_gt_u64(dst, src2, src1v); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ sse_bit_not(*this, dst, dst);
+ return;
+
+ case UniOpVVV::kCmpLtI8:
+ case UniOpVVV::kCmpLtI16:
+ case UniOpVVV::kCmpLtI32: {
+ if (is_same_vec(dst, src1v)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src1v);
+ src1v = tmp;
+ }
+
+ sse_mov(*this, dst, src2);
+ cc->emit(inst_id, dst, src1v);
+ return;
+ }
+
+ case UniOpVVV::kCmpLtU8:
+ case UniOpVVV::kCmpLtU16:
+ case UniOpVVV::kCmpLtU32: {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src1v);
+ sse_msb_flip(*this, tmp, src1v, ElementSize(op_info.element_size));
+ sse_msb_flip(*this, dst, src2, ElementSize(op_info.element_size));
+ cc->emit(inst_id, dst, tmp);
+ return;
+ }
+
+ case UniOpVVV::kCmpLtI64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ sse_cmp_gt_i64(*this, dst, src2, src1v);
+ return;
+ }
+
+ case UniOpVVV::kCmpLtU64: {
+ // Native operation requires AVX512, which is not supported by the target.
+ sse_cmp_gt_u64(*this, dst, src2, src1v);
+ return;
+ }
+
+ case UniOpVVV::kCmpLeU8: {
+ if (is_same_vec(dst, src2)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPsubusb, dst, src2);
+
+ Vec zeros = simd_vec_const(&ct().p_0000000000000000, Bcst::k32, dst);
+ cc->emit(Inst::kIdPcmpeqb, dst, zeros);
+ return;
+ }
+
+ case UniOpVVV::kCmpLeI8:
+ case UniOpVVV::kCmpLeI16:
+ case UniOpVVV::kCmpLeU16:
+ case UniOpVVV::kCmpLeI32:
+ case UniOpVVV::kCmpLeU32:
+ if (has_sse4_1() || op == UniOpVVV::kCmpLeU8 || op == UniOpVVV::kCmpLeI16) {
+ CmpMinMaxInst inst = sse_cmp_min_max[size_t(op) - size_t(UniOpVVV::kCmpLeI8)];
+
+ if (dst.id() == src1v.id()) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(Inst::kIdMovaps, tmp, src1v);
+ cc->emit(inst.pmin, tmp, src2);
+ cc->emit(inst.peq, dst, tmp);
+ }
+ else if (is_same_vec(dst, src2)) {
+ cc->emit(inst.pmin, dst, src1v);
+ cc->emit(inst.peq, dst, src1v);
+ }
+ else {
+ cc->emit(Inst::kIdMovaps, dst, src1v);
+ cc->emit(inst.pmin, dst, src2);
+ cc->emit(inst.peq, dst, src1v);
+ }
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVVV::kCmpLeI64:
+ case UniOpVVV::kCmpLeU64:
+ switch (op) {
+ case UniOpVVV::kCmpLeI8: v_cmp_gt_i8(dst, src1v, src2); break;
+ case UniOpVVV::kCmpLeU16: v_cmp_gt_u16(dst, src1v, src2); break;
+ case UniOpVVV::kCmpLeI32: v_cmp_gt_i32(dst, src1v, src2); break;
+ case UniOpVVV::kCmpLeU32: v_cmp_gt_u32(dst, src1v, src2); break;
+ case UniOpVVV::kCmpLeI64: v_cmp_gt_i64(dst, src1v, src2); break;
+ case UniOpVVV::kCmpLeU64: v_cmp_gt_u64(dst, src1v, src2); break;
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+
+ sse_bit_not(*this, dst, dst);
+ return;
+
+ case UniOpVVV::kCmpLtF32S:
+ case UniOpVVV::kCmpLtF64S:
+ case UniOpVVV::kCmpLtF32:
+ case UniOpVVV::kCmpLtF64:
+ case UniOpVVV::kCmpLeF32S:
+ case UniOpVVV::kCmpLeF64S:
+ case UniOpVVV::kCmpLeF32:
+ case UniOpVVV::kCmpLeF64:
+ if (is_same_vec(dst, src2)) {
+ uint8_t pred = sse_fcmp_imm_table[(size_t(op) - size_t(UniOpVVV::kCmpEqF32S)) / 4u];
+
+ // Unfortunately we have to do two moves, because there are no predicates that
+ // we could use in case of reversed operands (AVX is much better in this regard).
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src2);
+ sse_mov(*this, dst, src1v);
+ cc->emit(inst_id, dst, tmp, pred);
+ return;
+ }
+ [[fallthrough]];
+
+ case UniOpVVV::kCmpEqF32S:
+ case UniOpVVV::kCmpEqF64S:
+ case UniOpVVV::kCmpEqF32:
+ case UniOpVVV::kCmpEqF64:
+ case UniOpVVV::kCmpNeF32S:
+ case UniOpVVV::kCmpNeF64S:
+ case UniOpVVV::kCmpNeF32:
+ case UniOpVVV::kCmpNeF64:
+ case UniOpVVV::kCmpOrdF32S:
+ case UniOpVVV::kCmpOrdF64S:
+ case UniOpVVV::kCmpOrdF32:
+ case UniOpVVV::kCmpOrdF64:
+ case UniOpVVV::kCmpUnordF32S:
+ case UniOpVVV::kCmpUnordF64S:
+ case UniOpVVV::kCmpUnordF32:
+ case UniOpVVV::kCmpUnordF64: {
+ uint8_t pred = sse_fcmp_imm_table[(size_t(op) - size_t(UniOpVVV::kCmpEqF32S)) / 4u];
+ sse_mov(*this, dst, src1v);
+ cc->emit(inst_id, dst, src2, pred);
+ return;
+ }
+
+ case UniOpVVV::kCmpGtF32S:
+ case UniOpVVV::kCmpGtF64S:
+ case UniOpVVV::kCmpGtF32:
+ case UniOpVVV::kCmpGtF64:
+ case UniOpVVV::kCmpGeF32S:
+ case UniOpVVV::kCmpGeF64S:
+ case UniOpVVV::kCmpGeF32:
+ case UniOpVVV::kCmpGeF64: {
+ // Since SSE compare doesn't provide these modes natively, we have to reverse the operands.
+ uint8_t pred = sse_fcmp_imm_table[(size_t(op) - size_t(UniOpVVV::kCmpEqF32S)) / 4u];
+
+ if (dst.id() != src1v.id()) {
+ sse_mov(*this, dst, src2);
+ cc->emit(inst_id, dst, src1v, pred);
+ }
+ else {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src2);
+ cc->emit(inst_id, tmp, src1v, pred);
+ sse_mov(*this, dst, tmp);
+ }
+ return;
+ }
+
+ case UniOpVVV::kHAddF64: {
+ // Native operation requires SSE3, which is not supported by the target.
+ if (is_same_vec(src1v, src2)) {
+ if (is_same_vec(dst, src1v)) {
+ Vec tmp = cc->new_similar_reg(dst, "@tmp");
+ v_swap_f64(tmp, dst);
+ cc->addpd(dst, tmp);
+ }
+ else {
+ v_swap_f64(dst, src1v);
+ cc->addpd(dst, src1v);
+ }
+ }
+ else {
+ // [B A] [C A]
+ // [D C] -> [D B]
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ if (src2.is_mem()) {
+ Mem m(src2.as<Mem>());
+
+ sse_mov(*this, dst, src1v);
+ v_swap_f64(tmp, dst);
+ cc->movhpd(dst, m);
+
+ m.add_offset(8);
+ cc->movhpd(tmp, m);
+ cc->addpd(dst, tmp);
+ }
+ else if (is_same_vec(dst, src2)) {
+ sse_mov(*this, tmp, src1v);
+ cc->unpcklpd(tmp, src2.as<Vec>());
+ cc->movhlps(dst, src1v);
+ cc->addpd(dst, tmp);
+ }
+ else {
+ sse_mov(*this, tmp, src1v);
+ cc->unpckhpd(tmp, src2.as<Vec>());
+
+ sse_mov(*this, dst, src1v);
+ cc->unpcklpd(dst, src2.as<Vec>());
+
+ cc->addpd(dst, tmp.as<Vec>());
+ }
+ }
+ return;
+ }
+
+ case UniOpVVV::kCombineLoHiU64:
+ case UniOpVVV::kCombineLoHiF64: {
+ // Intrinsic - dst = {src1.u64[0], src2.64[1]} - combining low part of src1 and high part of src1.
+ if (src2.is_mem()) {
+ Mem m = src2.as<Mem>().clone_adjusted(8);
+ cc->emit(Inst::kIdPshufd, dst, src1v, x86::shuffle_imm(1, 0, 1, 0));
+ cc->emit(Inst::kIdMovlpd, dst, m);
+ return;
+ }
+
+ if (is_same_vec(dst, src2)) {
+ // dst = {src1.u64[0], dst.u64[1]}
+ cc->emit(Inst::kIdShufpd, dst, src1v, x86::shuffle_imm(0, 1));
+ return;
+ }
+ else if (is_same_vec(dst, src1v)) {
+ // dst = {dst.u64[0], src2.u64[1]}
+ if (has_ssse3()) {
+ cc->emit(Inst::kIdPalignr, dst, src2, 8);
+ return;
+ }
+ }
+
+ if (has_sse3())
+ cc->emit(Inst::kIdMovddup, dst, src1v);
+ else
+ cc->emit(Inst::kIdPshufd, dst, src1v, x86::shuffle_imm(1, 0, 1, 0));
+
+ cc->emit(Inst::kIdMovhlps, dst, src2);
+ return;
+ }
+
+ case UniOpVVV::kCombineHiLoU64:
+ case UniOpVVV::kCombineHiLoF64: {
+ // Intrinsic - dst = {src1.u64[1], src2.64[0]} - combining high part of src1 and low part of src2.
+ if (src2.is_mem()) {
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdMovlpd, dst, src2);
+ }
+ else if (is_same_vec(dst, src2)) {
+ // dst = {src1.u64[1], dst.u64[0]}
+ cc->emit(Inst::kIdShufpd, dst, src1v, 0x2);
+ }
+ else {
+ // dst = {src1.u64[1], src2.u64[0]}
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdMovsd, dst, src2);
+ }
+ return;
+ }
+
+ case UniOpVVV::kPacksI32_U16: {
+ // Native operation requires SSE4.1, which is not supported by the target.
+
+ // NOTE: This one is generally tricky and involves a lot of operations. There are hacks available to shorten the
+ // sequence, but then it would not cover all the inputs, so this is essentially a code necessary to handle all of
+ // them. The trick here is to perform unsigned saturation first (that's why we fill one reg with MSB bits of the
+ // input and then use ANDN), and then to bias the input in a way to make the result use signed saturation. The
+ // last step is to convert the biased value back.
+ //
+ // In general, if you hit this code-path (not having SSE4.1 and still needing exactly this instruction) I would
+ // recommend using a different strategy in this case, completely avoiding this code path. Usually, inputs are not
+ // arbitrary and knowing the range could help a lot to reduce the approach to use a native 'packssdw' instruction.
+ Operand bias = simd_const(&ct().p_0000800000008000, Bcst::kNA, dst);
+ Operand unbias = simd_const(&ct().p_8000800080008000, Bcst::kNA, dst);
+
+ if (is_same_vec(src1v, src2)) {
+ Vec tmp = dst;
+ if (is_same_vec(dst, src1v))
+ tmp = new_similar_reg(dst, "@tmp1");
+
+ sse_mov(*this, tmp, src1v);
+
+ cc->emit(Inst::kIdPsrad, tmp, 31);
+ cc->emit(Inst::kIdPandn, tmp, src1v);
+ cc->emit(Inst::kIdPsubd, tmp, bias);
+ cc->emit(Inst::kIdPackssdw, tmp, tmp);
+ cc->emit(Inst::kIdPaddw, tmp, unbias);
+
+ sse_mov(*this, dst, tmp);
+ }
+ else {
+ Vec tmp1 = new_similar_reg(dst, "@tmp1");
+ Vec tmp2 = new_similar_reg(dst, "@tmp2");
+
+ sse_mov(*this, tmp1, src1v);
+ sse_mov(*this, tmp2, src2);
+
+ cc->emit(Inst::kIdPsrad, tmp1, 31);
+ cc->emit(Inst::kIdPsrad, tmp2, 31);
+ cc->emit(Inst::kIdPandn, tmp1, src1v);
+ cc->emit(Inst::kIdPandn, tmp2, src2);
+ cc->emit(Inst::kIdPsubd, tmp1, bias);
+ cc->emit(Inst::kIdPsubd, tmp2, bias);
+ cc->emit(Inst::kIdPackssdw, tmp1, tmp2);
+ cc->emit(Inst::kIdPaddw, tmp1, unbias);
+
+ sse_mov(*this, dst, tmp1);
+ }
+ return;
+ }
+
+ case UniOpVVV::kSwizzlev_U8: {
+ // Native operation requires SSSE3, which is not supported by the target.
+ //
+ // NOTE: This is basically a very slow emulation as there is no way how to implement this operation with SSE2 SIMD.
+ Mem m_data = tmp_stack(StackId::kCustom, 64);
+ Mem m_pred = m_data.clone_adjusted(32);
+
+ m_data.set_size(1);
+ m_pred.set_size(1);
+
+ cc->movaps(m_data, src1v);
+
+ // The trick is to AND all indexes by 0x0F and then to do unsigned minimum so all indexes are in [0, 17) range,
+ // where index 16 maps to zero.
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->vmovaps(tmp, simd_mem_const(&ct().p_0F0F0F0F0F0F0F0F, Bcst::kNA, tmp));
+ cc->pand(tmp, src2.as<Vec>());
+ cc->pminub(tmp, simd_mem_const(&ct().p_1010101010101010, Bcst::kNA, tmp));
+ cc->movaps(m_pred, tmp);
+ cc->mov(m_data.clone_adjusted(16), 0);
+
+ Gp acc = new_gpz("@acc");
+ Gp idx = new_gpz("@idx");
+
+ // Process 2 bytes at a time, then use PINSRW to merge them with the destination.
+ for (uint32_t i = 0; i < 8; i++) {
+ cc->movzx(acc.r32(), m_pred); m_pred.add_offset(1);
+ cc->movzx(idx.r32(), m_pred); m_pred.add_offset(1);
+
+ m_data.set_index(acc);
+ cc->movzx(acc, m_data);
+
+ m_data.set_index(idx);
+ cc->mov(acc.r8_hi(), m_data);
+
+ if (i == 0)
+ cc->movd(dst, acc.r32());
+ else
+ cc->pinsrw(dst, acc.r32(), i);
+ }
+
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_3v(UniOpVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_) { emit_3v_t(*this, op, dst_, src1_, src2_); }
+void UniCompiler::emit_3v(UniOpVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_) { emit_3v_t(*this, op, dst_, src1_, src2_); }
+void UniCompiler::emit_3v(UniOpVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_) { emit_3v_t(*this, op, dst_, src1_, src2_); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 3VI
+// ==================================================
+
+void UniCompiler::emit_3vi(UniOpVVVI op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_, uint32_t imm) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src1_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Vec src1v(src1_.as<Vec>().clone_as(dst));
+ Operand src2(src2_);
+ UniOpVInfo op_info = opcode_info_3vi[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ InstId inst_id = op_info.avx_inst_id;
+
+ if (has_avx_ext(AVXExt(op_info.avx_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ cc->emit(inst_id, dst, src1v, src2, imm);
+ return;
+ }
+
+ switch (op) {
+ // Intrin - short-circuit if possible based on the predicate.
+ case UniOpVVVI::kAlignr_U128: {
+ if (imm == 0) {
+ avx_mov(*this, dst, src2);
+ return;
+ }
+
+ if (is_same_vec(src1v, src2)) {
+ if (imm == 4 || imm == 8 || imm == 12) {
+ uint32_t pred = imm == 4 ? x86::shuffle_imm(0, 3, 2, 1) :
+ imm == 8 ? x86::shuffle_imm(1, 0, 3, 2) :
+ imm == 12 ? x86::shuffle_imm(2, 1, 0, 3) : 0;
+ cc->vpshufd(dst, src1v, pred);
+ return;
+ }
+ }
+
+ cc->emit(Inst::kIdVpalignr, dst, src1v, src2, imm);
+ return;
+ }
+
+ // Intrin - maps directly to the corresponding instruction, but imm must be converted.
+ case UniOpVVVI::kInterleaveShuffleU32x4:
+ case UniOpVVVI::kInterleaveShuffleF32x4: {
+ if (is_same_vec(src1v, src2)) {
+ UniOpVVI simplified_op = (op == UniOpVVVI::kInterleaveShuffleU32x4) ? UniOpVVI::kSwizzleU32x4 : UniOpVVI::kSwizzleF32x4;
+ emit_2vi(simplified_op, dst, src1v, imm);
+ }
+ else {
+ uint32_t shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ cc->emit(inst_id, dst, src1v, src2, shuf_imm);
+ }
+ return;
+ }
+
+ // Intrin - maps directly to the corresponding instruction, but imm must be converted.
+ case UniOpVVVI::kInterleaveShuffleU64x2:
+ case UniOpVVVI::kInterleaveShuffleF64x2: {
+ if (is_same_vec(src1v, src2)) {
+ UniOpVVI simplified_op = (op == UniOpVVVI::kInterleaveShuffleU64x2) ? UniOpVVI::kSwizzleU64x2 : UniOpVVI::kSwizzleF64x2;
+ emit_2vi(simplified_op, dst, src1v, imm);
+ }
+ else {
+ uint32_t shuf_imm = shuf_imm2_from_swizzle_with_width(Swizzle2{imm}, VecWidthUtils::vec_width_of(dst));
+ cc->emit(inst_id, dst, src1v, src2, shuf_imm);
+ }
+ return;
+ }
+
+ case UniOpVVVI::kInsertV128_U32:
+ case UniOpVVVI::kInsertV128_F32:
+ case UniOpVVVI::kInsertV128_U64:
+ case UniOpVVVI::kInsertV128_F64: {
+ src1v.set_signature(dst.signature());
+
+ if (src2.is_mem())
+ src2.as<Mem>().set_size(16);
+ else
+ src2.set_signature(signature_of_xmm_ymm_zmm[0]);
+
+ if (!has_avx512()) {
+ if (has_avx2() && (op == UniOpVVVI::kInsertV128_U32 || op == UniOpVVVI::kInsertV128_U64))
+ inst_id = Inst::kIdVinserti128;
+ else
+ inst_id = Inst::kIdVinsertf128;
+ }
+
+ cc->emit(inst_id, dst, src1v, src2, imm);
+ return;
+ }
+
+ case UniOpVVVI::kInsertV256_U32:
+ case UniOpVVVI::kInsertV256_F32:
+ case UniOpVVVI::kInsertV256_U64:
+ case UniOpVVVI::kInsertV256_F64: {
+ ASMJIT_ASSERT(has_avx512());
+ src1v.set_signature(dst.signature());
+
+ if (src2.is_mem())
+ src2.as<Mem>().set_size(32);
+ else
+ src2.set_signature(signature_of_xmm_ymm_zmm[1]);
+
+ cc->emit(inst_id, dst, src1v, src2, imm);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ InstId inst_id = op_info.sse_inst_id;
+
+ if (is_same_vec(dst, src2) && op_info.commutative) {
+ std::swap(src1v, src2.as<Vec>());
+ }
+
+ // All operations are intrinsics in this case - no direct mapping to instructions without an additional logic.
+ ASMJIT_ASSERT(!has_sse_ext(SSEExt(op_info.sse_ext)));
+
+ switch (op) {
+ // Intrin - short-circuit if possible based on the predicate.
+ case UniOpVVVI::kAlignr_U128: {
+ if (imm == 0) {
+ sse_mov(*this, dst, src2);
+ return;
+ }
+
+ if (is_same_vec(src1v, src2)) {
+ if (imm == 4 || imm == 8 || imm == 12) {
+ uint32_t pred = imm == 4 ? x86::shuffle_imm(0, 3, 2, 1) :
+ imm == 8 ? x86::shuffle_imm(1, 0, 3, 2) :
+ imm == 12 ? x86::shuffle_imm(2, 1, 0, 3) : 0;
+ cc->emit(Inst::kIdPshufd, dst, src1v, pred);
+ return;
+ }
+ }
+
+ if (has_ssse3()) {
+ if (is_same_vec(dst, src2) && !is_same_vec(dst, src1v)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src2);
+ src2 = tmp;
+ }
+
+ sse_mov(*this, dst, src1v);
+ cc->emit(Inst::kIdPalignr, dst, src2, imm);
+ return;
+ }
+
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ uint32_t src1_shift = (16u - imm) & 15;
+ uint32_t src2_shift = imm;
+
+ if (is_same_vec(dst, src1v)) {
+ sse_mov(*this, tmp, src2);
+ cc->emit(Inst::kIdPsrldq, tmp, src2_shift);
+ cc->emit(Inst::kIdPslldq, dst, src1_shift);
+ }
+ else {
+ sse_mov(*this, tmp, src1v);
+ sse_mov(*this, dst, src2);
+ cc->emit(Inst::kIdPslldq, tmp, src1_shift);
+ cc->emit(Inst::kIdPsrldq, dst, src2_shift);
+ }
+
+ cc->emit(Inst::kIdPor, dst, tmp);
+ return;
+ }
+
+ // Intrin - maps directly to the corresponding instruction, but imm must be converted.
+ case UniOpVVVI::kInterleaveShuffleU32x4:
+ case UniOpVVVI::kInterleaveShuffleU64x2:
+ case UniOpVVVI::kInterleaveShuffleF32x4:
+ case UniOpVVVI::kInterleaveShuffleF64x2: {
+ uint32_t shuf_imm;
+ ElementSize element_size = ElementSize(op_info.element_size);
+
+ if (element_size == ElementSize::k32)
+ shuf_imm = shuf_imm4_from_swizzle(Swizzle4{imm});
+ else
+ shuf_imm = shuf_imm2_from_swizzle(Swizzle2{imm});
+
+ if (is_same_vec(src1v, src2)) {
+ UniOpVVI vvi_op = translate_op(op, UniOpVVVI::kInterleaveShuffleU32x4, UniOpVVI::kSwizzleU32x4);
+ emit_2vi(vvi_op, dst, src1v, imm);
+ return;
+ }
+
+ else if (is_same_vec(dst, src1v)) {
+ cc->emit(inst_id, dst, src2, shuf_imm);
+ }
+ else if (is_same_vec(dst, src2)) {
+ // The predicate has to be reversed as we want to swap low/high 64-bit lanes afterwards.
+ if (element_size == ElementSize::k32)
+ shuf_imm = (shuf_imm >> 4) | ((shuf_imm & 0xF) << 4);
+ else
+ shuf_imm = (shuf_imm >> 1) | ((shuf_imm & 0x1) << 1);
+
+ cc->emit(inst_id, dst, src1v, shuf_imm);
+ cc->emit(Inst::kIdPshufd, dst, dst, x86::shuffle_imm(1, 0, 3, 2));
+ }
+ else {
+ sse_mov(*this, dst, src1v);
+ cc->emit(inst_id, dst, src2, shuf_imm);
+ }
+ return;
+ }
+
+ case UniOpVVVI::kInsertV128_U32:
+ case UniOpVVVI::kInsertV128_F32:
+ case UniOpVVVI::kInsertV128_U64:
+ case UniOpVVVI::kInsertV128_F64:
+ case UniOpVVVI::kInsertV256_U32:
+ case UniOpVVVI::kInsertV256_F32:
+ case UniOpVVVI::kInsertV256_U64:
+ case UniOpVVVI::kInsertV256_F64:
+ // These are not available in SSE mode (256-bit vectors require AVX)
+ ASMJIT_NOT_REACHED();
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_3vi(UniOpVVVI op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, uint32_t imm) { emit_3vi_t(*this, op, dst_, src1_, src2_, imm); }
+void UniCompiler::emit_3vi(UniOpVVVI op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, uint32_t imm) { emit_3vi_t(*this, op, dst_, src1_, src2_, imm); }
+void UniCompiler::emit_3vi(UniOpVVVI op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, uint32_t imm) { emit_3vi_t(*this, op, dst_, src1_, src2_, imm); }
+
+// ujit::UniCompiler - Vector Instructions - Emit 4V
+// =================================================
+
+void UniCompiler::emit_4v(UniOpVVVV op, const Operand_& dst_, const Operand_& src1_, const Operand_& src2_, const Operand_& src3_) {
+ ASMJIT_ASSERT(dst_.is_vec());
+ ASMJIT_ASSERT(src1_.is_vec());
+
+ Vec dst(dst_.as<Vec>());
+ Vec src1(src1_.as<Vec>().clone_as(dst));
+ Operand src2(src2_);
+ Operand src3(src3_);
+ UniOpVInfo op_info = opcode_info_4v[size_t(op)];
+
+ if (has_avx()) {
+ // AVX Implementation
+ // ------------------
+
+ InstId inst_id = op_info.avx_inst_id;
+
+ if (is_same_vec(dst, src2) && op_info.commutative) {
+ std::swap(src1, src2.as<Vec>());
+ }
+
+ if (has_avx_ext(AVXExt(op_info.avx_ext))) {
+ ASMJIT_ASSERT(inst_id != Inst::kIdNone);
+
+ cc->emit(inst_id, dst, src1, src2, src3);
+ return;
+ }
+
+ switch (op) {
+ case UniOpVVVV::kBlendV_U8: {
+ // Blend(a, b, cond) == (a & ~cond) | (b & cond)
+ avx_make_vec(*this, src3, dst, "msk");
+ cc->emit(op_info.avx_inst_id, dst, src1, src2, src3);
+ return;
+ }
+
+ case UniOpVVVV::kMAddU16:
+ case UniOpVVVV::kMAddU32: {
+ static constexpr uint16_t add_inst_table[2] = {
+ Inst::kIdVpaddw,
+ Inst::kIdVpaddd
+ };
+
+ Vec tmp = dst;
+ if (is_same_vec(dst, src3)) {
+ tmp = new_similar_reg(dst, "@tmp");
+ }
+
+ InstId add_inst_id = add_inst_table[size_t(op) - size_t(UniOpVVVV::kMAddU16)];
+
+ cc->emit(inst_id, tmp, src1, src2);
+ cc->emit(add_inst_id, dst, tmp, src3);
+
+ return;
+ }
+
+ case UniOpVVVV::kMAddF32S:
+ case UniOpVVVV::kMAddF64S:
+ case UniOpVVVV::kMAddF32:
+ case UniOpVVVV::kMAddF64:
+ case UniOpVVVV::kMSubF32S:
+ case UniOpVVVV::kMSubF64S:
+ case UniOpVVVV::kMSubF32:
+ case UniOpVVVV::kMSubF64:
+ case UniOpVVVV::kNMAddF32S:
+ case UniOpVVVV::kNMAddF64S:
+ case UniOpVVVV::kNMAddF32:
+ case UniOpVVVV::kNMAddF64:
+ case UniOpVVVV::kNMSubF32S:
+ case UniOpVVVV::kNMSubF64S:
+ case UniOpVVVV::kNMSubF32:
+ case UniOpVVVV::kNMSubF64: {
+ // 4 operand operation:
+ //
+ // madd(dst, a, b, c) -> dst = a * b + c
+ // msub(dst, a, b, c) -> dst = a * b - c
+ // nmadd(dst, a, b, c) -> dst = -a * b + c
+ // nmsub(dst, a, b, c) -> dst = -a * b - c
+ //
+ // 3 operand operation (FMA):
+ //
+ // vfmadd213 a, b, c -> a = a * b + c
+ // vfmadd132 a, b, c -> a = a * c + b
+ // vfmadd231 a, b, c -> a = b * c + a
+ // vfnmadd213 a, b, c -> a = -a * b + c
+ // vfnmadd132 a, b, c -> a = -a * c + b
+ // vfnmadd231 a, b, c -> a = -b * c + a
+ // vfsubd213 a, b, c -> a = a * b - c
+ // vfsubd132 a, b, c -> a = a * c - b
+ // vfsubd231 a, b, c -> a = b * c - a
+ // vfnsubd213 a, b, c -> a = -a * b - c
+ // vfnsubd132 a, b, c -> a = -a * c - b
+ // vfnsubd231 a, b, c -> a = -b * c - a
+ size_t fma_id = size_t(op) - size_t(UniOpVVVV::kMAddF32S);
+ FloatMode fm = FloatMode(op_info.float_mode);
+
+ if (is_scalar_fp_op(fm)) {
+ dst.set_signature(signature_of_xmm_ymm_zmm[0]);
+ src1.set_signature(signature_of_xmm_ymm_zmm[0]);
+
+ if (src2.is_vec())
+ src2.set_signature(signature_of_xmm_ymm_zmm[0]);
+
+ if (src3.is_vec())
+ src3.set_signature(signature_of_xmm_ymm_zmm[0]);
+ }
+
+ if (has_fma()) {
+ // There is a variation of instructions, which can be used, but each has only 3 operands. Since we
+ // allow 4 operands (having a separate desgination) we have to map our 4 operand representation to
+ // 3 operand representation as used by FMA.
+
+ static constexpr uint16_t fma_ab_add_c[16] = {
+ Inst::kIdVfmadd213ss , Inst::kIdVfmadd213sd , Inst::kIdVfmadd213ps , Inst::kIdVfmadd213pd ,
+ Inst::kIdVfmsub213ss , Inst::kIdVfmsub213sd , Inst::kIdVfmsub213ps , Inst::kIdVfmsub213pd ,
+ Inst::kIdVfnmadd213ss, Inst::kIdVfnmadd213sd, Inst::kIdVfnmadd213ps, Inst::kIdVfnmadd213pd,
+ Inst::kIdVfnmsub213ss, Inst::kIdVfnmsub213sd, Inst::kIdVfnmsub213ps, Inst::kIdVfnmsub213pd
+ };
+
+ static constexpr uint16_t fma_ac_add_b[16] = {
+ Inst::kIdVfmadd132ss , Inst::kIdVfmadd132sd , Inst::kIdVfmadd132ps , Inst::kIdVfmadd132pd ,
+ Inst::kIdVfmsub132ss , Inst::kIdVfmsub132sd , Inst::kIdVfmsub132ps , Inst::kIdVfmsub132pd ,
+ Inst::kIdVfnmadd132ss, Inst::kIdVfnmadd132sd, Inst::kIdVfnmadd132ps, Inst::kIdVfnmadd132pd,
+ Inst::kIdVfnmsub132ss, Inst::kIdVfnmsub132sd, Inst::kIdVfnmsub132ps, Inst::kIdVfnmsub132pd
+ };
+
+ static constexpr uint16_t fma_bc_add_a[16] = {
+ Inst::kIdVfmadd231ss , Inst::kIdVfmadd231sd , Inst::kIdVfmadd231ps , Inst::kIdVfmadd231pd ,
+ Inst::kIdVfmsub231ss , Inst::kIdVfmsub231sd , Inst::kIdVfmsub231ps , Inst::kIdVfmsub231pd ,
+ Inst::kIdVfnmadd231ss, Inst::kIdVfnmadd231sd, Inst::kIdVfnmadd231ps, Inst::kIdVfnmadd231pd,
+ Inst::kIdVfnmsub231ss, Inst::kIdVfnmsub231sd, Inst::kIdVfnmsub231ps, Inst::kIdVfnmsub231pd
+ };
+
+ if (is_same_vec(dst, src1)) {
+ if (src2.is_reg())
+ cc->emit(fma_ab_add_c[fma_id], dst, src2, src3);
+ else
+ cc->emit(fma_ac_add_b[fma_id], dst, src3, src2);
+ }
+ else if (is_same_vec(dst, src2)) {
+ cc->emit(fma_ab_add_c[fma_id], dst, src1, src3);
+ }
+ else if (is_same_vec(dst, src3)) {
+ cc->emit(fma_bc_add_a[fma_id], dst, src1, src2);
+ }
+ else {
+ avx_mov(*this, dst, src1);
+ if (!src2.is_reg())
+ cc->emit(fma_ac_add_b[fma_id], dst, src3, src2);
+ else if (!src3.is_reg())
+ cc->emit(fma_ab_add_c[fma_id], dst, src1, src3);
+ else
+ cc->emit(fma_ab_add_c[fma_id], dst, src2, src3);
+ }
+ return;
+ }
+ else {
+ // MAdd/MSub - native FMA not available so we have to do MUL followed by either ADD or SUB.
+ const FloatInst& fi = avx_float_inst[size_t(fm)];
+
+ bool mul_add = (op_info.imm & 0x01u) == 0u;
+ bool neg_mul = (op_info.imm & 0x02u) != 0u;
+ InstId fi_facc = mul_add ? fi.fadd : fi.fsub;
+
+ if (!neg_mul) {
+ // MAdd or MSub Operation.
+ if (is_same_vec(dst, src3)) {
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ cc->emit(fi.fmul, tmp, src1, src2);
+ cc->emit(fi_facc, dst, tmp, src3);
+ }
+ else {
+ cc->emit(fi.fmul, dst, src1, src2);
+ cc->emit(fi_facc, dst, dst, src3);
+ }
+ }
+ else {
+ // NMAdd or NMSub Operation.
+ Vec tmp = new_similar_reg(dst, "@tmp");
+ avx_fsign_flip(*this, tmp, src1, fm);
+
+ cc->emit(fi.fmul, tmp, tmp, src2);
+ cc->emit(fi_facc, dst, tmp, src3);
+ }
+ return;
+ }
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+ else {
+ // SSE Implementation
+ // ------------------
+
+ switch (op) {
+ case UniOpVVVV::kBlendV_U8: {
+ // Blend(a, b, cond) == (a & ~cond) | (b & cond)
+ if (has_sse4_1()) {
+ if (is_same_vec(dst, src1) || (!is_same_vec(dst, src2) && !is_same_vec(dst, src3))) {
+ sse_make_vec(*this, src3, "tmp");
+ sse_mov(*this, dst, src1);
+ cc->emit(op_info.sse_inst_id, dst, src2, src3);
+ return;
+ }
+ }
+
+ // Blend(a, b, cond) == a ^ ((a ^ b) & cond)
+ // == b ^ ((a ^ b) & ~cond)
+ if (is_same_vec(dst, src1)) {
+ Vec tmp = new_vec128("@tmp");
+ v_xor_i32(tmp, dst, src2);
+ v_and_i32(tmp, tmp, src3);
+ v_xor_i32(dst, dst, tmp);
+ }
+ else if (is_same_vec(dst, src3)) {
+ Vec tmp = new_vec128("@tmp");
+ v_xor_i32(tmp, src1, src2);
+ v_andn_i32(dst, dst, tmp);
+ v_xor_i32(dst, dst, src2);
+ }
+ else {
+ v_xor_i32(dst, src2, src1);
+ v_and_i32(dst, dst, src3);
+ v_xor_i32(dst, dst, src1);
+ }
+ return;
+ }
+
+ case UniOpVVVV::kMAddU16:
+ case UniOpVVVV::kMAddU32: {
+ Vec tmp = dst;
+ if (is_same_vec(dst, src3)) {
+ tmp = new_similar_reg(dst, "@tmp");
+ }
+
+ if (op == UniOpVVVV::kMAddU16) {
+ v_mul_u16(tmp, src1, src2);
+ v_add_u16(dst, tmp, src3);
+ }
+ else {
+ v_mul_u32(tmp, src1, src2);
+ v_add_u32(dst, tmp, src3);
+ }
+
+ return;
+ }
+
+ case UniOpVVVV::kMAddF32S:
+ case UniOpVVVV::kMAddF64S:
+ case UniOpVVVV::kMSubF32S:
+ case UniOpVVVV::kMSubF64S:
+ case UniOpVVVV::kMAddF32:
+ case UniOpVVVV::kMAddF64:
+ case UniOpVVVV::kMSubF32:
+ case UniOpVVVV::kMSubF64:
+ case UniOpVVVV::kNMAddF32S:
+ case UniOpVVVV::kNMAddF64S:
+ case UniOpVVVV::kNMSubF32S:
+ case UniOpVVVV::kNMSubF64S:
+ case UniOpVVVV::kNMAddF32:
+ case UniOpVVVV::kNMAddF64:
+ case UniOpVVVV::kNMSubF32:
+ case UniOpVVVV::kNMSubF64: {
+ FloatMode fm = FloatMode(op_info.float_mode);
+
+ bool mul_add = (op_info.imm & 0x01u) == 0u;
+ bool neg_mul = (op_info.imm & 0x02u) != 0u;
+
+ if (is_same_vec(dst, src2)) {
+ // Unfortunately, to follow the FMA behavior in scalar case, we have to copy.
+ if (fm <= FloatMode::kF64S)
+ src2 = sse_copy(*this, src2.as<Vec>(), "@copy_src2");
+ else
+ std::swap(src1, src2.as<Vec>());
+ }
+
+ const FloatInst& fi = sse_float_inst[size_t(fm)];
+ InstId fi_facc = mul_add ? fi.fadd : fi.fsub;
+
+ if (is_same_vec(dst, src3)) {
+ if (fm <= FloatMode::kF64S || !mul_add) {
+ // Copy if we couldn't avoid the extra move.
+ src3 = sse_copy(*this, src3.as<Vec>(), "@copy_src3");
+ }
+ else {
+ Vec tmp = cc->new_similar_reg(dst, "@tmp");
+ sse_mov(*this, tmp, src1);
+ cc->emit(fi.fmul, tmp, src2);
+ cc->emit(neg_mul ? fi.fsub : fi.fadd, dst, tmp);
+ return;
+ }
+ }
+
+ if (neg_mul)
+ sse_fsign_flip(*this, dst, src1, fm);
+ else
+ sse_mov(*this, dst, src1);
+
+ cc->emit(fi.fmul, dst, src2);
+ cc->emit(fi_facc, dst, src3);
+ return;
+ }
+
+ default:
+ ASMJIT_NOT_REACHED();
+ }
+ }
+}
+
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const Operand_& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, const Operand& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const Operand_& src1_, const OpArray& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, const Operand& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const Operand_& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, const Operand& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+void UniCompiler::emit_4v(UniOpVVVV op, const OpArray& dst_, const OpArray& src1_, const OpArray& src2_, const OpArray& src3_) { emit_4v_t(*this, op, dst_, src1_, src2_, src3_); }
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif
diff --git a/3rdparty/asmjit/asmjit/ujit/unicondition.h b/3rdparty/asmjit/asmjit/ujit/unicondition.h
new file mode 100644
index 00000000000..f110b3a4260
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/unicondition.h
@@ -0,0 +1,293 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_UNICONDITION_H_INCLUDED
+#define ASMJIT_UJIT_UNICONDITION_H_INCLUDED
+
+#include <asmjit/ujit/ujitbase.h>
+#include <asmjit/ujit/uniop.h>
+
+#if !defined(ASMJIT_NO_UJIT)
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+//! \addtogroup asmjit_ujit
+//! \{
+
+//! Condition represents either a condition or an assignment operation that can be checked.
+class UniCondition {
+public:
+ //! \name Members
+ //! \{
+
+ UniOpCond op;
+ CondCode cond;
+ Operand a;
+ Operand b;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG UniCondition(UniOpCond op, CondCode cond, const Operand& a, const Operand& b) noexcept
+ : op(op),
+ cond(cond),
+ a(a),
+ b(b) {}
+
+ ASMJIT_INLINE_NODEBUG UniCondition(const UniCondition& other) noexcept = default;
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG UniCondition& operator=(const UniCondition& other) noexcept = default;
+
+ //! \}
+};
+
+//! Constructs a condition that would be `true` when `a = (a & b)` becomes zero.
+static ASMJIT_INLINE UniCondition and_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAnd, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a & b)` becomes zero.
+static ASMJIT_INLINE UniCondition and_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAnd, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a & b)` becomes zero.
+static ASMJIT_INLINE UniCondition and_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAnd, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a & b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition and_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAnd, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a & b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition and_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAnd, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a & b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition and_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAnd, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a | b)` becomes zero.
+static ASMJIT_INLINE UniCondition or_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignOr, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a | b)` becomes zero.
+static ASMJIT_INLINE UniCondition or_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignOr, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a | b)` becomes zero.
+static ASMJIT_INLINE UniCondition or_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignOr, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a | b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition or_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignOr, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a | b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition or_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignOr, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a | b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition or_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignOr, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a ^ b)` becomes zero.
+static ASMJIT_INLINE UniCondition xor_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignXor, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a ^ b)` becomes zero.
+static ASMJIT_INLINE UniCondition xor_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignXor, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a ^ b)` becomes zero.
+static ASMJIT_INLINE UniCondition xor_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignXor, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a ^ b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition xor_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignXor, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a ^ b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition xor_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignXor, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a ^ b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition xor_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignXor, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a + b)` becomes zero.
+static ASMJIT_INLINE UniCondition add_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` becomes zero.
+static ASMJIT_INLINE UniCondition add_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` becomes zero.
+static ASMJIT_INLINE UniCondition add_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition add_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition add_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition add_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a + b)` wraps (sets carry flag).
+static ASMJIT_INLINE UniCondition add_c(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kCarry, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` wraps (sets carry flag).
+static ASMJIT_INLINE UniCondition add_c(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kCarry, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` wraps (sets carry flag).
+static ASMJIT_INLINE UniCondition add_c(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kCarry, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` doesn't wrap (doesn't set carry flag).
+static ASMJIT_INLINE UniCondition add_nc(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotCarry, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` doesn't wrap (doesn't set carry flag).
+static ASMJIT_INLINE UniCondition add_nc(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotCarry, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` doesn't wrap (doesn't set carry flag).
+static ASMJIT_INLINE UniCondition add_nc(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotCarry, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a + b)` ends with the msb/sign bit set.
+static ASMJIT_INLINE UniCondition add_s(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` ends with the msb/sign bit set.
+static ASMJIT_INLINE UniCondition add_s(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` ends with the msb/sign bit set.
+static ASMJIT_INLINE UniCondition add_s(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` ends with the msb/sign bit unset.
+static ASMJIT_INLINE UniCondition add_ns(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` ends with the msb/sign bit unset.
+static ASMJIT_INLINE UniCondition add_ns(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a + b)` ends with the msb/sign bit unset.
+static ASMJIT_INLINE UniCondition add_ns(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignAdd, CondCode::kNotSign, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a - b)` becomes zero.
+static ASMJIT_INLINE UniCondition sub_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` becomes zero.
+static ASMJIT_INLINE UniCondition sub_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` becomes zero.
+static ASMJIT_INLINE UniCondition sub_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition sub_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition sub_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition sub_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a - b)` wraps.
+static ASMJIT_INLINE UniCondition sub_c(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` wraps.
+static ASMJIT_INLINE UniCondition sub_c(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` wraps.
+static ASMJIT_INLINE UniCondition sub_c(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` doesn't wrap.
+static ASMJIT_INLINE UniCondition sub_nc(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedGE, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` doesn't wrap.
+static ASMJIT_INLINE UniCondition sub_nc(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedGE, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` doesn't wrap.
+static ASMJIT_INLINE UniCondition sub_nc(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedGE, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a - b)` ends with the msb/sign bit set.
+static ASMJIT_INLINE UniCondition sub_s(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` ends with the msb/sign bit set.
+static ASMJIT_INLINE UniCondition sub_s(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` ends with the msb/sign bit set.
+static ASMJIT_INLINE UniCondition sub_s(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` ends with the msb/sign bit unset.
+static ASMJIT_INLINE UniCondition sub_ns(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kNotSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` ends with the msb/sign bit unset.
+static ASMJIT_INLINE UniCondition sub_ns(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kNotSign, a, b); }
+//! Constructs a condition that would be `true` when `a = (a - b)` ends with the msb/sign bit unset.
+static ASMJIT_INLINE UniCondition sub_ns(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kNotSign, a, b); }
+
+static ASMJIT_INLINE UniCondition sub_ugt(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedGT, a, b); }
+static ASMJIT_INLINE UniCondition sub_ugt(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedGT, a, b); }
+static ASMJIT_INLINE UniCondition sub_ugt(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignSub, CondCode::kUnsignedGT, a, b); }
+
+//! Constructs a condition that would be `true` when `a = (a << b)` becomes zero.
+static ASMJIT_INLINE UniCondition shr_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignShr, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a << b)` becomes zero.
+static ASMJIT_INLINE UniCondition shr_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignShr, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a << b)` becomes zero.
+static ASMJIT_INLINE UniCondition shr_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignShr, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a << b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition shr_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kAssignShr, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a << b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition shr_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kAssignShr, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a = (a << b)` becomes non-zero.
+static ASMJIT_INLINE UniCondition shr_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kAssignShr, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when `a == b)`.
+static ASMJIT_INLINE UniCondition cmp_eq(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kEqual, a, b); }
+//! Constructs a condition that would be `true` when `a == b)`.
+static ASMJIT_INLINE UniCondition cmp_eq(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kEqual, a, b); }
+//! Constructs a condition that would be `true` when `a == b)`.
+static ASMJIT_INLINE UniCondition cmp_eq(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kEqual, a, b); }
+
+//! Constructs a condition that would be `true` when `a != b)`.
+static ASMJIT_INLINE UniCondition cmp_ne(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kNotEqual, a, b); }
+//! Constructs a condition that would be `true` when `a != b)`.
+static ASMJIT_INLINE UniCondition cmp_ne(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kNotEqual, a, b); }
+//! Constructs a condition that would be `true` when `a != b)`.
+static ASMJIT_INLINE UniCondition cmp_ne(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kNotEqual, a, b); }
+
+//! Constructs a condition that would be `true` when `a < b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_lt(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a < b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_lt(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a < b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_lt(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedLT, a, b); }
+
+//! Constructs a condition that would be `true` when `a <= b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_le(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedLE, a, b); }
+//! Constructs a condition that would be `true` when `a <= b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_le(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedLE, a, b); }
+//! Constructs a condition that would be `true` when `a <= b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_le(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedLE, a, b); }
+
+//! Constructs a condition that would be `true` when `a > b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_gt(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedGT, a, b); }
+//! Constructs a condition that would be `true` when `a > b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_gt(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedGT, a, b); }
+//! Constructs a condition that would be `true` when `a > b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_gt(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedGT, a, b); }
+
+//! Constructs a condition that would be `true` when `a >= b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_ge(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedGE, a, b); }
+//! Constructs a condition that would be `true` when `a >= b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_ge(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedGE, a, b); }
+//! Constructs a condition that would be `true` when `a >= b` (signed comparison).
+static ASMJIT_INLINE UniCondition scmp_ge(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kSignedGE, a, b); }
+
+//! Constructs a condition that would be `true` when `a < b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_lt(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a < b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_lt(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedLT, a, b); }
+//! Constructs a condition that would be `true` when `a < b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_lt(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedLT, a, b); }
+
+//! Constructs a condition that would be `true` when `a <= b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_le(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedLE, a, b); }
+//! Constructs a condition that would be `true` when `a <= b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_le(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedLE, a, b); }
+//! Constructs a condition that would be `true` when `a <= b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_le(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedLE, a, b); }
+
+//! Constructs a condition that would be `true` when `a > b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_gt(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedGT, a, b); }
+//! Constructs a condition that would be `true` when `a > b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_gt(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedGT, a, b); }
+//! Constructs a condition that would be `true` when `a > b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_gt(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedGT, a, b); }
+
+//! Constructs a condition that would be `true` when `a >= b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_ge(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedGE, a, b); }
+//! Constructs a condition that would be `true` when `a >= b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_ge(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedGE, a, b); }
+//! Constructs a condition that would be `true` when `a >= b` (unsigned comparison).
+static ASMJIT_INLINE UniCondition ucmp_ge(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kUnsignedGE, a, b); }
+
+//! Constructs a condition that would be `true` when `a` is zero.
+static ASMJIT_INLINE UniCondition test_z(const Gp& a) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kEqual, a, Imm(0)); }
+//! Constructs a condition that would be `true` when `a` is non-zero.
+static ASMJIT_INLINE UniCondition test_nz(const Gp& a) noexcept { return UniCondition(UniOpCond::kCompare, CondCode::kNotEqual, a, Imm(0)); }
+
+//! Constructs a condition that would be `true` when `a & b` is zero.
+static ASMJIT_INLINE UniCondition test_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kTest, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a & b` is zero.
+static ASMJIT_INLINE UniCondition test_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kTest, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a & b` is zero.
+static ASMJIT_INLINE UniCondition test_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kTest, CondCode::kZero, a, b); }
+//! Constructs a condition that would be `true` when `a & b` is non-zero.
+static ASMJIT_INLINE UniCondition test_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kTest, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a & b` is non-zero.
+static ASMJIT_INLINE UniCondition test_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kTest, CondCode::kNotZero, a, b); }
+//! Constructs a condition that would be `true` when `a & b` is non-zero.
+static ASMJIT_INLINE UniCondition test_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kTest, CondCode::kNotZero, a, b); }
+
+//! Constructs a condition that would be `true` when a bit in `a` at `b` is zero (`((a >> b) & 1) == 0`).
+static ASMJIT_INLINE UniCondition bt_z(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kBitTest, CondCode::kBTZero, a, b); }
+//! Constructs a condition that would be `true` when a bit in `a` at `b` is zero (`((a >> b) & 1) == 0`).
+static ASMJIT_INLINE UniCondition bt_z(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kBitTest, CondCode::kBTZero, a, b); }
+//! Constructs a condition that would be `true` when a bit in `a` at `b` is zero (`((a >> b) & 1) == 0`).
+static ASMJIT_INLINE UniCondition bt_z(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kBitTest, CondCode::kBTZero, a, b); }
+//! Constructs a condition that would be `true` when a bit in `a` at `b` is non-zero (`((a >> b) & 1) == 1`).
+static ASMJIT_INLINE UniCondition bt_nz(const Gp& a, const Gp& b) noexcept { return UniCondition(UniOpCond::kBitTest, CondCode::kBTNotZero, a, b); }
+//! Constructs a condition that would be `true` when a bit in `a` at `b` is non-zero (`((a >> b) & 1) == 1`).
+static ASMJIT_INLINE UniCondition bt_nz(const Gp& a, const Mem& b) noexcept { return UniCondition(UniOpCond::kBitTest, CondCode::kBTNotZero, a, b); }
+//! Constructs a condition that would be `true` when a bit in `a` at `b` is non-zero (`((a >> b) & 1) == 1`).
+static ASMJIT_INLINE UniCondition bt_nz(const Gp& a, const Imm& b) noexcept { return UniCondition(UniOpCond::kBitTest, CondCode::kBTNotZero, a, b); }
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
+#endif // ASMJIT_UJIT_UNICONDITION_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit/uniop.h b/3rdparty/asmjit/asmjit/ujit/uniop.h
new file mode 100644
index 00000000000..af27583c78e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/uniop.h
@@ -0,0 +1,819 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_UNIOP_H_INCLUDED
+#define ASMJIT_UJIT_UNIOP_H_INCLUDED
+
+#include <asmjit/ujit/ujitbase.h>
+
+#if !defined(ASMJIT_NO_UJIT)
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+//! \addtogroup asmjit_ujit
+//! \{
+
+//! Instruction that can be used by \ref UniCondition.
+enum class UniOpCond : uint32_t {
+ kAssignAnd, //!< Assign-and `a &= b`.
+ kAssignOr, //!< Assign-or `a |= b`.
+ kAssignXor, //!< Assign-xor `a ^= b`.
+ kAssignAdd, //!< Assign-add `a += b`.
+ kAssignSub, //!< Assign-sub `a -= b`.
+ kAssignShr, //!< Assign-shr `a >>= b`.
+ kTest, //!< Test `a & b`.
+ kBitTest, //!< Bit-test `a & (1 << b)`.
+ kCompare, //!< Compare `a <=> b`.
+
+ kMaxValue = kCompare
+};
+
+//! Instruction with a single memory operand.
+enum class UniOpM : uint32_t {
+ kPrefetch, //!< Explicitly prefetch memory for reading (can be implemented as NOP).
+ kStoreZeroReg, //!< Store zero (data-width depends on register size).
+ kStoreZeroU8, //!< Store zero (8-bit).
+ kStoreZeroU16, //!< Store zero (16-bit).
+ kStoreZeroU32, //!< Store zero (32-bit).
+ kStoreZeroU64 //!< Store zero (64-bit).
+};
+
+//! Instruction with `[reg, mem]` operands.
+enum class UniOpRM : uint32_t {
+ kLoadReg, //!< N-bit load (the size depends on the register size).
+ kLoadI8, //!< 8-bit load, sign extended.
+ kLoadU8, //!< 8-bit load, zero extended.
+ kLoadI16, //!< 16-bit load, sign extended.
+ kLoadU16, //!< 16-bit load, zero extended.
+ kLoadI32, //!< 32-bit load, sign extended.
+ kLoadU32, //!< 32-bit load, zero extended.
+ kLoadI64, //!< 64-bit load.
+ kLoadU64, //!< 64-bit load.
+ kLoadMergeU8, //!< 8-bit load and merge.
+ kLoadShiftU8, //!< 8-bit load, shift, and merge.
+ kLoadMergeU16, //!< 16-bit load and merge.
+ kLoadShiftU16 //!< 16-bit load, shift, and merge.
+};
+
+//! Instruction with `[mem, reg]` operands.
+enum class UniOpMR : uint32_t {
+ kStoreReg, //!< N-bit store (the size depends on the register size).
+ kStoreU8, //!< 8-bit store.
+ kStoreU16, //!< 16-bit store.
+ kStoreU32, //!< 32-bit store.
+ kStoreU64, //!< 64-bit store.
+ kAddReg, //!< N-bit load+add+store (the size depends on the register size).
+ kAddU8, //!< 8-bit load+add+store.
+ kAddU16, //!< 16-bit load+add+store.
+ kAddU32, //!< 32-bit load+add+store.
+ kAddU64 //!< 64-bit load+add+store.
+};
+
+//! Instruction with `[reg, reg]` operands.
+//!
+//! Arithmetic operations having 2 operands (dst, src).
+//!
+//! \note For convenience, the second operand can be register, memory, or immediate value.
+enum class UniOpRR : uint32_t {
+ kAbs, //!< Absolute value of a signed integer - `dst = abs(src)`.
+ kNeg, //!< Arithmetic negation - `dst = -src` (`dst = ~src + 1`).
+ kNot, //!< Bitwise-not - `dst = ~src`.
+ kBSwap, //!< Byteswap - `dst = bswap(src)`.
+ kCLZ, //!< Count leading zeros - `dst = clz(src)`.
+ kCTZ, //!< Count trailing zeros - `dst = ctz(src)`.
+ kReflect, //!< Integer reflection.
+
+ kMaxValue = kReflect
+};
+
+//! Instruction with `[reg, reg, reg]` operands.
+//!
+//! Arithmetic operation having 3 operands (dst, src1, src2).
+//!
+//! \note For convenience, the third operand can be register, memory, or immediate value.
+enum class UniOpRRR : uint32_t {
+ kAnd, //!< Bitwise AND `dst = src1 & src2`.
+ kOr, //!< Bitwise OR `dst = src1 | src2`.
+ kXor, //!< Bitwise XOR `dst = src1 ^ src2`.
+ kBic, //!< Bitwise BIC `dst = src1 & ~src2`.
+ kAdd, //!< Add `dst = src1 + src2`.
+ kSub, //!< Subtract `dst = src1 - src2`.
+ kMul, //!< Multiply `dst = src1 * src2`.
+ kUDiv, //!< Unsigned divide `dst = src1 / src2`.
+ kUMod, //!< Unsigned modulo `dst = src1 & src2`.
+ kSMin, //!< Signed minimum `dst = smin(src1, src2)`.
+ kSMax, //!< Signed maximum `dst = smax(src1, src2)`.
+ kUMin, //!< Unsigned minimum `dst = umin(src1, src2)`.
+ kUMax, //!< Unsigned maximum `dst = umax(src1, src2)`.
+ kSll, //!< Shift left logical `dst = src1 << src2`.
+ kSrl, //!< Shift left logical `dst = src1 >> src2`.
+ kSra, //!< Shift left logical `dst = sra(src1, src2)`.
+ kRol, //!< Rotate left `dst = (src1 << src2) | (src1 >> (N_BITS - src2))`.
+ kRor, //!< Rotate right `dst = (src1 >> src2) | (src1 << (N_BITS - src2))`.
+ kSBound, //!< Signed bounds.
+
+ kMaxValue = kSBound
+};
+
+//! Instruction with `[vec, reg]` operands.
+//!
+//! Describes instructions where general-purpose is either moved, converted, or inserted to
+//! a vector register.
+enum class UniOpVR : uint32_t {
+ kMov, //!< N-bit move into a vector register (the size depends on source register width).
+ kMovU32, //!< 32-bit move into a vector register.
+ kMovU64, //!< 64-bit move into a vector register.
+ kInsertU8, //!< 8-bit insertion into a vector register.
+ kInsertU16, //!< 16-bit insertion into a vector register.
+ kInsertU32, //!< 32-bit insertion into a vector register.
+ kInsertU64, //!< 64-bit insertion into a vector register.
+ kExtractU8, //!< 8-bit extraction from a vector register.
+ kExtractU16, //!< 16-bit extraction from a vector register.
+ kExtractU32, //!< 32-bit extraction from a vector register.
+ kExtractU64, //!< 64-bit extraction from a vector register.
+ kCvtIntToF32, //!< Int to float32 conversion.
+ kCvtIntToF64, //!< Int to float64 conversion.
+ kCvtTruncF32ToInt, //!< Float32 to int conversion with truncation semantics.
+ kCvtRoundF32ToInt, //!< Float64 to int conversion with round-to-even semantics.
+ kCvtTruncF64ToInt, //!< Float32 to int conversion with truncation semantics.
+ kCvtRoundF64ToInt, //!< Float64 to int conversion with round-to-even semantics.
+
+ kMaxValue = kCvtRoundF64ToInt
+};
+
+//! Instruction with `[vec, mem]` operands.
+//!
+//! Describes load, convert, and insert instructions.
+enum class UniOpVM : uint32_t {
+ kLoad8, //!< 8-bit load into a vector register (the rest is cleared).
+ kLoad16_U16, //!< 16-bit load into a vector register (the rest is cleared).
+ kLoad32_U32, //!< 32-bit load (int) into a vector register (the rest is cleared).
+ kLoad32_F32, //!< 32-bit load (f32) into a vector register (the rest is cleared).
+
+ kLoad64_U32, //!< 32-bit load (int) into a vector register (the rest is cleared).
+ kLoad64_U64, //!< 64-bit load (int) into a vector register (the rest is cleared).
+ kLoad64_F32, //!< 32-bit load (f32) into a vector register (the rest is cleared).
+ kLoad64_F64, //!< 64-bit load (f64) into a vector register (the rest is cleared).
+
+ kLoad128_U32, //!< 128-bit load (int) into a vector register (the rest is cleared).
+ kLoad128_U64, //!< 128-bit load (int) into a vector register (the rest is cleared).
+ kLoad128_F32, //!< 128-bit load (f32) into a vector register (the rest is cleared).
+ kLoad128_F64, //!< 128-bit load (f64) into a vector register (the rest is cleared).
+
+ kLoad256_U32, //!< 256-bit load (int) into a vector register (the rest is cleared).
+ kLoad256_U64, //!< 256-bit load (int) into a vector register (the rest is cleared).
+ kLoad256_F32, //!< 256-bit load (f32) into a vector register (the rest is cleared).
+ kLoad256_F64, //!< 256-bit load (f64) into a vector register (the rest is cleared).
+
+ kLoad512_U32, //!< 512-bit load (int) into a vector register (the rest is cleared).
+ kLoad512_U64, //!< 512-bit load (int) into a vector register (the rest is cleared).
+ kLoad512_F32, //!< 512-bit load (f32) into a vector register (the rest is cleared).
+ kLoad512_F64, //!< 512-bit load (f64) into a vector register (the rest is cleared).
+
+ kLoadN_U32, //!< N-bit load (int) into a vector register (the size depends on the vector width).
+ kLoadN_U64, //!< N-bit load (int) into a vector register (the size depends on the vector width).
+ kLoadN_F32, //!< N-bit load (f32) into a vector register (the size depends on the vector width).
+ kLoadN_F64, //!< N-bit load (f64) into a vector register (the size depends on the vector width).
+
+ kLoadCvt16_U8ToU64, //!< 16-bit load into a vector register with 8-bit to 64-bit zero extension (128-bit result).
+ kLoadCvt32_U8ToU64, //!< 32-bit load into a vector register with 8-bit to 64-bit zero extension (256-bit result).
+ kLoadCvt64_U8ToU64, //!< 64-bit load into a vector register with 8-bit to 64-bit zero extension (512-bit result).
+
+ kLoadCvt32_I8ToI16, //!< 32-bit load into a vector register with 8-bit to 16-bit sign extension (64-bit result).
+ kLoadCvt32_U8ToU16, //!< 32-bit load into a vector register with 8-bit to 16-bit zero extension (64-bit result).
+ kLoadCvt32_I8ToI32, //!< 32-bit load into a vector register with 8-bit to 32-bit sign extension (128-bit result).
+ kLoadCvt32_U8ToU32, //!< 32-bit load into a vector register with 8-bit to 32-bit zero extension (128-bit result).
+ kLoadCvt32_I16ToI32, //!< 32-bit load into a vector register with 16-bit to 32-bit sign extension (64-bit result).
+ kLoadCvt32_U16ToU32, //!< 32-bit load into a vector register with 16-bit to 32-bit zero extension (64-bit result).
+ kLoadCvt32_I32ToI64, //!< 32-bit load into a vector register with 32-bit to 64-bit sign extension (64-bit result).
+ kLoadCvt32_U32ToU64, //!< 32-bit load into a vector register with 32-bit to 64-bit zero extension (64-bit result).
+
+ kLoadCvt64_I8ToI16, //!< 64-bit load into a vector register with 8-bit to 16-bit sign extension (128-bit result).
+ kLoadCvt64_U8ToU16, //!< 64-bit load into a vector register with 8-bit to 16-bit zero extension (128-bit result).
+ kLoadCvt64_I8ToI32, //!< 64-bit load into a vector register with 8-bit to 32-bit sign extension (256-bit result).
+ kLoadCvt64_U8ToU32, //!< 64-bit load into a vector register with 8-bit to 32-bit zero extension (256-bit result).
+ kLoadCvt64_I16ToI32, //!< 64-bit load into a vector register with 16-bit to 32-bit sign extension (128-bit result).
+ kLoadCvt64_U16ToU32, //!< 64-bit load into a vector register with 16-bit to 32-bit zero extension (128-bit result).
+ kLoadCvt64_I32ToI64, //!< 64-bit load into a vector register with 32-bit to 64-bit sign extension (128-bit result).
+ kLoadCvt64_U32ToU64, //!< 64-bit load into a vector register with 32-bit to 64-bit zero extension (128-bit result).
+
+ kLoadCvt128_I8ToI16, //!< 128-bit load into a vector register with 8-bit to 16-bit sign extension (256-bit result).
+ kLoadCvt128_U8ToU16, //!< 128-bit load into a vector register with 8-bit to 16-bit zero extension (256-bit result).
+ kLoadCvt128_I8ToI32, //!< 128-bit load into a vector register with 8-bit to 32-bit sign extension (512-bit result).
+ kLoadCvt128_U8ToU32, //!< 128-bit load into a vector register with 8-bit to 32-bit zero extension (512-bit result).
+ kLoadCvt128_I16ToI32, //!< 128-bit load into a vector register with 16-bit to 32-bit sign extension (256-bit result).
+ kLoadCvt128_U16ToU32, //!< 128-bit load into a vector register with 16-bit to 32-bit zero extension (256-bit result).
+ kLoadCvt128_I32ToI64, //!< 128-bit load into a vector register with 32-bit to 64-bit sign extension (256-bit result).
+ kLoadCvt128_U32ToU64, //!< 128-bit load into a vector register with 32-bit to 64-bit zero extension (256-bit result).
+
+ kLoadCvt256_I8ToI16, //!< 256-bit load into a vector register with 8-bit to 16-bit sign extension (512-bit result).
+ kLoadCvt256_U8ToU16, //!< 256-bit load into a vector register with 8-bit to 16-bit zero extension (512-bit result).
+ kLoadCvt256_I16ToI32, //!< 256-bit load into a vector register with 16-bit to 32-bit sign extension (512-bit result).
+ kLoadCvt256_U16ToU32, //!< 256-bit load into a vector register with 16-bit to 32-bit zero extension (512-bit result).
+ kLoadCvt256_I32ToI64, //!< 256-bit load into a vector register with 32-bit to 64-bit sign extension (512-bit result).
+ kLoadCvt256_U32ToU64, //!< 256-bit load into a vector register with 32-bit to 64-bit zero extension (512-bit result).
+
+ kLoadCvtN_U8ToU64, //!< N-bit load with 8-bit to 64-bit zero extension (the size depends on the vector width).
+
+ kLoadCvtN_I8ToI16, //!< N-bit load with 8-bit to 16-bit sign extension (the size depends on the vector width).
+ kLoadCvtN_U8ToU16, //!< N-bit load with 8-bit to 16-bit zero extension (the size depends on the vector width).
+ kLoadCvtN_I8ToI32, //!< N-bit load with 8-bit to 32-bit sign extension (the size depends on the vector width).
+ kLoadCvtN_U8ToU32, //!< N-bit load with 8-bit to 32-bit zero extension (the size depends on the vector width).
+ kLoadCvtN_I16ToI32, //!< N-bit load with 16-bit to 32-bit sign extension (the size depends on the vector width).
+ kLoadCvtN_U16ToU32, //!< N-bit load with 16-bit to 32-bit zero extension (the size depends on the vector width).
+ kLoadCvtN_I32ToI64, //!< N-bit load with 32-bit to 64-bit sign extension (the size depends on the vector width).
+ kLoadCvtN_U32ToU64, //!< N-bit load with 32-bit to 64-bit zero extension (the size depends on the vector width).
+
+ kLoadInsertU8, //!< 8-bit insert (int) into a vector register from memory.
+ kLoadInsertU16, //!< 16-bit insert (int) into a vector register from memory.
+ kLoadInsertU32, //!< 32-bit insert (int) into a vector register from memory.
+ kLoadInsertU64, //!< 64-bit insert (int) into a vector register from memory.
+ kLoadInsertF32, //!< 32-bit insert (f32) into a vector register from memory.
+ kLoadInsertF32x2, //!< 64-bit insert (f32x2) into a vector register from memory.
+ kLoadInsertF64, //!< 64-bit insert (f64) into a vector register from memory.
+
+ kMaxValue = kLoadInsertF64
+};
+
+//! Instruction with `[mem, vec]` operands.
+//!
+//! Describes store and extract instructions.
+enum class UniOpMV : uint32_t {
+ kStore8, //!< 8-bit store (int) of a vector register.
+ kStore16_U16, //!< 16-bit store (int) of a vector register.
+ kStore32_U32, //!< 16-bit store (int) of a vector register.
+ kStore32_F32, //!< 16-bit store (f32) of a vector register.
+
+ kStore64_U32, //!< 64-bit store (int) of a vector register.
+ kStore64_U64, //!< 64-bit store (int) of a vector register.
+ kStore64_F32, //!< 64-bit store (f32) of a vector register.
+ kStore64_F64, //!< 64-bit store (f64) of a vector register.
+
+ kStore128_U32, //!< 128-bit store (int) of a vector register.
+ kStore128_U64, //!< 128-bit store (int) of a vector register.
+ kStore128_F32, //!< 128-bit store (f32) of a vector register.
+ kStore128_F64, //!< 128-bit store (f64) of a vector register.
+
+ kStore256_U32, //!< 256-bit store (int) of a vector register.
+ kStore256_U64, //!< 256-bit store (int) of a vector register.
+ kStore256_F32, //!< 256-bit store (f32) of a vector register.
+ kStore256_F64, //!< 256-bit store (f64) of a vector register.
+
+ kStore512_U32, //!< 512-bit store (int) of a vector register.
+ kStore512_U64, //!< 512-bit store (int) of a vector register.
+ kStore512_F32, //!< 512-bit store (f32) of a vector register.
+ kStore512_F64, //!< 512-bit store (f64) of a vector register.
+
+ kStoreN_U32, //!< N-bit store (int) of a vector register (the size depends on the vector width).
+ kStoreN_U64, //!< N-bit store (int) of a vector register (the size depends on the vector width).
+ kStoreN_F32, //!< N-bit store (f32) of a vector register (the size depends on the vector width).
+ kStoreN_F64, //!< N-bit store (f64) of a vector register (the size depends on the vector width).
+
+ kStoreExtractU16, //!< 16-bit extract from lane and store.
+ kStoreExtractU32, //!< 32-bit extract from lane and store.
+ kStoreExtractU64, //!< 64-bit extract from lane and store.
+
+ /*
+ kStoreCvtz64_U16ToU8,
+ kStoreCvtz64_U32ToU16,
+ kStoreCvtz64_U64ToU32,
+ kStoreCvts64_I16ToI8,
+ kStoreCvts64_I16ToU8,
+ kStoreCvts64_U16ToU8,
+ kStoreCvts64_I32ToI16,
+ kStoreCvts64_U32ToU16,
+ kStoreCvts64_I64ToI32,
+ kStoreCvts64_U64ToU32,
+
+ kStoreCvtz128_U16ToU8,
+ kStoreCvtz128_U32ToU16,
+ kStoreCvtz128_U64ToU32,
+ kStoreCvts128_I16ToI8,
+ kStoreCvts128_I16ToU8,
+ kStoreCvts128_U16ToU8,
+ kStoreCvts128_I32ToI16,
+ kStoreCvts128_U32ToU16,
+ kStoreCvts128_I64ToI32,
+ kStoreCvts128_U64ToU32,
+
+ kStoreCvtz256_U16ToU8,
+ kStoreCvtz256_U32ToU16,
+ kStoreCvtz256_U64ToU32,
+ kStoreCvts256_I16ToI8,
+ kStoreCvts256_I16ToU8,
+ kStoreCvts256_U16ToU8,
+ kStoreCvts256_I32ToI16,
+ kStoreCvts256_U32ToU16,
+ kStoreCvts256_I64ToI32,
+ kStoreCvts256_U64ToU32,
+
+ kStoreCvtzN_U16ToU8,
+ kStoreCvtzN_U32ToU16,
+ kStoreCvtzN_U64ToU32,
+ kStoreCvtsN_I16ToI8,
+ kStoreCvtsN_I16ToU8,
+ kStoreCvtsN_U16ToU8,
+ kStoreCvtsN_I32ToI16,
+ kStoreCvtsN_U32ToU16,
+ kStoreCvtsN_I64ToI32,
+ kStoreCvtsN_U64ToU32,
+ */
+
+ kMaxValue = kStoreExtractU64
+};
+
+//! Instruction with `[vec, vec]` operands.
+//!
+//! Describes vector arithmetic that has one destination and one source.
+//!
+//! \note For convenience, the second operand can be register, memory, or immediate value.
+enum class UniOpVV : uint32_t {
+ kMov, //!< Vector move.
+ kMovU64, //!< Vector move of the low 64-bit data, the rest is set to zero.
+
+ kBroadcastU8Z, //!< Vector u8 broadcast with an assumption that the rest of the source vector is zero.
+ kBroadcastU16Z, //!< Vector u16 broadcast with an assumption that the rest of the source vector is zero.
+ kBroadcastU8, //!< Vector u8 broadcast to all lanes.
+ kBroadcastU16, //!< Vector u16 broadcast to all lanes.
+ kBroadcastU32, //!< Vector u32 broadcast to all lanes.
+ kBroadcastU64, //!< Vector u64 broadcast to all lanes.
+ kBroadcastF32, //!< Vector f32 broadcast to all lanes.
+ kBroadcastF64, //!< Vector f64 broadcast to all lanes.
+ kBroadcastV128_U32, //!< Vector broadcast of 128-bit lanes.
+ kBroadcastV128_U64, //!< Vector broadcast of 128-bit lanes.
+ kBroadcastV128_F32, //!< Vector broadcast of 128-bit lanes.
+ kBroadcastV128_F64, //!< Vector broadcast of 128-bit lanes.
+ kBroadcastV256_U32, //!< Vector broadcast of 256-bit lanes.
+ kBroadcastV256_U64, //!< Vector broadcast of 256-bit lanes.
+ kBroadcastV256_F32, //!< Vector broadcast of 256-bit lanes.
+ kBroadcastV256_F64, //!< Vector broadcast of 256-bit lanes.
+
+ kAbsI8, //!< Vector i8 absolute value - `dst = abs(src)`.
+ kAbsI16, //!< Vector i16 absolute value - `dst = abs(src)`.
+ kAbsI32, //!< Vector i32 absolute value - `dst = abs(src)`.
+ kAbsI64, //!< Vector i64 absolute value - `dst = abs(src)`.
+
+ kNotU32, //!< Vector u32 bitwise NOT - `dst = ~src`.
+ kNotU64, //!< Vector u64 bitwise NOT - `dst = ~src`.
+
+ kCvtI8LoToI16, //!< Vector sign extend low i8 to i16.
+ kCvtI8HiToI16, //!< Vector sign extend high i8 to i16.
+ kCvtU8LoToU16, //!< Vector zero extend low u8 to u16.
+ kCvtU8HiToU16, //!< Vector zero extend high u8 to u16.
+ kCvtI8ToI32, //!< Vector zero extend low i8 to i32.
+ kCvtU8ToU32, //!< Vector zero extend high u8 to u32.
+ kCvtI16LoToI32, //!< Vector sign extend low i16 to i32.
+ kCvtI16HiToI32, //!< Vector sign extend high i16 to i32.
+ kCvtU16LoToU32, //!< Vector zero extend low u16 to u32.
+ kCvtU16HiToU32, //!< Vector zero extend high u16 to u32.
+ kCvtI32LoToI64, //!< Vector sign extend low i32 to i64.
+ kCvtI32HiToI64, //!< Vector sign extend high i32 to i64.
+ kCvtU32LoToU64, //!< Vector zero extend low u32 to u64.
+ kCvtU32HiToU64, //!< Vector zero extend high u32 to u64.
+
+ kAbsF32S, //!< Scalar f32 absolute value.
+ kAbsF64S, //!< Scalar f64 absolute value.
+ kAbsF32, //!< Vector f32 absolute value.
+ kAbsF64, //!< Vector f64 absolute value.
+
+ kNegF32S, //!< Scalar f32 negate.
+ kNegF64S, //!< Scalar f64 negate.
+ kNegF32, //!< Vector f32 negate.
+ kNegF64, //!< Vector f64 negate.
+
+ kNotF32, //!< Vector f32 bitwise NOT.
+ kNotF64, //!< Vector f64 bitwise NOT.
+
+ kTruncF32S, //!< Scalar f32 truncate.
+ kTruncF64S, //!< Scalar f64 truncate.
+ kTruncF32, //!< Vector f32 truncate.
+ kTruncF64, //!< Vector f64 truncate.
+
+ kFloorF32S, //!< Scalar f32 floor.
+ kFloorF64S, //!< Scalar f64 floor.
+ kFloorF32, //!< Vector f32 floor.
+ kFloorF64, //!< Vector f64 floor.
+
+ kCeilF32S, //!< Scalar f32 ceil.
+ kCeilF64S, //!< Scalar f64 ceil.
+ kCeilF32, //!< Vector f32 ceil.
+ kCeilF64, //!< Vector f64 ceil.
+
+ kRoundEvenF32S, //!< Scalar f32 round-even.
+ kRoundEvenF64S, //!< Scalar f64 round-even.
+ kRoundEvenF32, //!< Vector f32 round-even.
+ kRoundEvenF64, //!< Vector f64 round-even.
+
+ kRoundHalfAwayF32S, //!< Scalar f32 round-half-away (0.5 and greater fraction rounds away from zero).
+ kRoundHalfAwayF64S, //!< Scalar f64 round-half-away (0.5 and greater fraction rounds away from zero).
+ kRoundHalfAwayF32, //!< Vector f32 round-half-away (0.5 and greater fraction rounds away from zero).
+ kRoundHalfAwayF64, //!< Vector f64 round-half-away (0.5 and greater fraction rounds away from zero).
+
+ kRoundHalfUpF32S, //!< Scalar f32 round-half-up (0.5 and greater fraction rounds up).
+ kRoundHalfUpF64S, //!< Scalar f64 round-half-up (0.5 and greater fraction rounds up).
+ kRoundHalfUpF32, //!< Vector f32 round-half-up (0.5 and greater fraction rounds up).
+ kRoundHalfUpF64, //!< Vector f64 round-half-up (0.5 and greater fraction rounds up).
+
+ kRcpF32, //!< Vector f32 reciprocal - `dst = 1.0 / src`.
+ kRcpF64, //!< Vector f64 reciprocal - `dst = 1.0 / src`.
+
+ kSqrtF32S, //!< Scalar f32 square root.
+ kSqrtF64S, //!< Scalar f64 square root.
+ kSqrtF32, //!< Vector f32 square root.
+ kSqrtF64, //!< Vector f64 square root.
+
+ kCvtF32ToF64S,
+ kCvtF64ToF32S,
+ kCvtI32ToF32,
+ kCvtF32LoToF64,
+ kCvtF32HiToF64,
+ kCvtF64ToF32Lo,
+ kCvtF64ToF32Hi,
+ kCvtI32LoToF64,
+ kCvtI32HiToF64,
+ kCvtTruncF32ToI32,
+ kCvtTruncF64ToI32Lo,
+ kCvtTruncF64ToI32Hi,
+ kCvtRoundF32ToI32,
+ kCvtRoundF64ToI32Lo,
+ kCvtRoundF64ToI32Hi,
+
+ kMaxValue = kCvtRoundF64ToI32Hi
+};
+
+//! Instruction with `[vec, vec, imm]` operands.
+//!
+//! Describes vector arithmetic that has one destination, one source, and one immediate.
+//!
+//! \note For convenience, the second operand can be register, memory, or immediate value.
+enum class UniOpVVI : uint32_t {
+ kSllU16, //!< Vector u16 shift left logical.
+ kSllU32, //!< Vector u32 shift left logical.
+ kSllU64, //!< Vector u64 shift left logical.
+ kSrlU16, //!< Vector u16 shift right logical.
+ kSrlU32, //!< Vector u32 shift right logical.
+ kSrlU64, //!< Vector u64 shift right logical.
+ kSraI16, //!< Vector u16 shift right arithmetic.
+ kSraI32, //!< Vector u32 shift right arithmetic.
+ kSraI64, //!< Vector u64 shift right arithmetic.
+ kSllbU128, //!< Vector shift bytes (128-bit lanes).
+ kSrlbU128, //!< Vector shift bytes (128-bit lanes).
+ kSwizzleU16x4, //!< Vector swizzle u16x4 (128-bit lanes).
+ kSwizzleLoU16x4, //!< Vector swizzle u16x4 (low 64-bit lanes).
+ kSwizzleHiU16x4, //!< Vector swizzle u16x4 (high 64-bit lanes)
+ kSwizzleU32x4, //!< Vector swizzle u32x4 (128-bit lanes).
+ kSwizzleU64x2, //!< Vector swizzle u64x2 (128-bit lanes).
+ kSwizzleF32x4, //!< Vector swizzle f32x4 (128-bit lanes).
+ kSwizzleF64x2, //!< Vector swizzle f64x2 (128-bit lanes).
+ kSwizzleU64x4, //!< Vector swizzle u64x4 (256-bit lanes).
+ kSwizzleF64x4, //!< Vector swizzle f64x4 (256-bit lanes).
+ kExtractV128_I32, //!< Vector extract 128-bit lane from 256-bit or 512-bit vector.
+ kExtractV128_I64, //!< Vector extract 128-bit lane from 256-bit or 512-bit vector.
+ kExtractV128_F32, //!< Vector extract 128-bit lane from 256-bit or 512-bit vector.
+ kExtractV128_F64, //!< Vector extract 128-bit lane from 256-bit or 512-bit vector.
+ kExtractV256_I32, //!< Vector extract 256-bit lane from 512-bit vector.
+ kExtractV256_I64, //!< Vector extract 256-bit lane from 512-bit vector.
+ kExtractV256_F32, //!< Vector extract 256-bit lane from 512-bit vector.
+ kExtractV256_F64, //!< Vector extract 256-bit lane from 512-bit vector.
+
+#if defined(ASMJIT_UJIT_AARCH64)
+ kSrlRndU16,
+ kSrlRndU32,
+ kSrlRndU64,
+ kSrlAccU16,
+ kSrlAccU32,
+ kSrlAccU64,
+ kSrlRndAccU16,
+ kSrlRndAccU32,
+ kSrlRndAccU64,
+ kSrlnLoU16,
+ kSrlnHiU16,
+ kSrlnLoU32,
+ kSrlnHiU32,
+ kSrlnLoU64,
+ kSrlnHiU64,
+ kSrlnRndLoU16,
+ kSrlnRndHiU16,
+ kSrlnRndLoU32,
+ kSrlnRndHiU32,
+ kSrlnRndLoU64,
+ kSrlnRndHiU64,
+
+ kMaxValue = kSrlnRndHiU64
+
+#elif defined(ASMJIT_UJIT_X86)
+
+ kMaxValue = kExtractV256_F64
+
+#else
+
+ kMaxValue = kExtractV256_F64
+
+#endif // ASMJIT_UJIT_AARCH64
+};
+
+//! Instruction with `[vec, vec, vec]` operands.
+//!
+//! Describes vector arithmetic that has one destination and two sources.
+//!
+//! \note For convenience, the third operand can be register, memory, or immediate value.
+enum class UniOpVVV : uint32_t {
+ kAndU32, //!< Vector u32 bitwise AND - `dst = src1 & src2`.
+ kAndU64, //!< Vector u64 bitwise AND - `dst = src1 & src2`.
+ kOrU32, //!< Vector u32 bitwise OR - `dst = src1 | src2`.
+ kOrU64, //!< Vector u64 bitwise OR - `dst = src1 | src2`.
+ kXorU32, //!< Vector u32 bitwise XOR - `dst = src1 ^ src2`.
+ kXorU64, //!< Vector u64 bitwise XOR - `dst = src1 ^ src2`.
+ kAndnU32, //!< Vector u32 bitwise ANDN - `dst = ~src1 & src2`.
+ kAndnU64, //!< Vector u64 bitwise ANDN - `dst = ~src1 & src2`.
+ kBicU32, //!< Vector u32 bitwise BIC - `dst = src1 & ~src2`.
+ kBicU64, //!< Vector u64 bitwise BIC - `dst = src1 & ~src2`.
+ kAvgrU8, //!< Vector u8 average rounded half up `dst = (src1 + src2 + 1) >> 1`.
+ kAvgrU16, //!< Vector u16 average rounded half up `dst = (src1 + src2 + 1) >> 1`.
+ kAddU8, //!< Vector u8 add.
+ kAddU16, //!< Vector u16 add.
+ kAddU32, //!< Vector u32 add.
+ kAddU64, //!< Vector u64 add.
+ kSubU8, //!< Vector u8 sub.
+ kSubU16, //!< Vector u16 sub.
+ kSubU32, //!< Vector u32 sub.
+ kSubU64, //!< Vector u64 sub.
+ kAddsI8, //!< Vector i8 add with saturation (signed).
+ kAddsU8, //!< Vector u8 add with saturation (unsigned).
+ kAddsI16, //!< Vector i16 add with saturation (signed).
+ kAddsU16, //!< Vector u16 add with saturation (unsigned).
+ kSubsI8, //!< Vector i8 sub with saturation (signed).
+ kSubsU8, //!< Vector u8 sub with saturation (unsigned).
+ kSubsI16, //!< Vector i16 sub with saturation (signed).
+ kSubsU16, //!< Vector u16 sub with saturation (unsigned).
+ kMulU16, //!< Vector u16 multiply.
+ kMulU32, //!< Vector u32 multiply.
+ kMulU64, //!< Vector u64 multiply.
+ kMulhI16, //!< Vector i16 multiply high - `dst = (src1 * src2) >> 16`.
+ kMulhU16, //!< Vector u16 multiply high - `dst = (src1 * src2) >> 16`.
+ kMulU64_LoU32, //!< Vector u64xu32 multiply.
+ kMHAddI16_I32, //!< Vector i16 multiply with horizontal widening add to form a 32-bit result.
+ kMinI8, //!< Vector i8 minimum.
+ kMinU8, //!< Vector u8 minimum.
+ kMinI16, //!< Vector i16 minimum.
+ kMinU16, //!< Vector u16 minimum.
+ kMinI32, //!< Vector i32 minimum.
+ kMinU32, //!< Vector u32 minimum.
+ kMinI64, //!< Vector i64 minimum.
+ kMinU64, //!< Vector u64 minimum.
+ kMaxI8, //!< Vector i8 maximum.
+ kMaxU8, //!< Vector u8 maximum.
+ kMaxI16, //!< Vector i16 maximum.
+ kMaxU16, //!< Vector u16 maximum.
+ kMaxI32, //!< Vector i32 maximum.
+ kMaxU32, //!< Vector u32 maximum.
+ kMaxI64, //!< Vector i64 maximum.
+ kMaxU64, //!< Vector u64 maximum.
+ kCmpEqU8, //!< Vector u8 compare equal.
+ kCmpEqU16, //!< Vector u16 compare equal.
+ kCmpEqU32, //!< Vector u32 compare equal.
+ kCmpEqU64, //!< Vector u64 compare equal.
+ kCmpGtI8, //!< Vector i8 compare greater-than.
+ kCmpGtU8, //!< Vector u8 compare greater-than.
+ kCmpGtI16, //!< Vector i16 compare greater-than.
+ kCmpGtU16, //!< Vector u16 compare greater-than.
+ kCmpGtI32, //!< Vector i32 compare greater-than.
+ kCmpGtU32, //!< Vector u32 compare greater-than.
+ kCmpGtI64, //!< Vector i64 compare greater-than.
+ kCmpGtU64, //!< Vector u64 compare greater-than.
+ kCmpGeI8, //!< Vector i8 compare greater-or-equal.
+ kCmpGeU8, //!< Vector u8 compare greater-or-equal.
+ kCmpGeI16, //!< Vector i16 compare greater-or-equal.
+ kCmpGeU16, //!< Vector u16 compare greater-or-equal.
+ kCmpGeI32, //!< Vector i32 compare greater-or-equal.
+ kCmpGeU32, //!< Vector u32 compare greater-or-equal.
+ kCmpGeI64, //!< Vector i64 compare greater-or-equal.
+ kCmpGeU64, //!< Vector u64 compare greater-or-equal.
+ kCmpLtI8, //!< Vector i8 compare lesser-than.
+ kCmpLtU8, //!< Vector u8 compare lesser-than.
+ kCmpLtI16, //!< Vector i16 compare lesser-than.
+ kCmpLtU16, //!< Vector u16 compare lesser-than.
+ kCmpLtI32, //!< Vector i32 compare lesser-than.
+ kCmpLtU32, //!< Vector u32 compare lesser-than.
+ kCmpLtI64, //!< Vector i64 compare lesser-than.
+ kCmpLtU64, //!< Vector u64 compare lesser-than.
+ kCmpLeI8, //!< Vector i8 compare lesser-or-equal.
+ kCmpLeU8, //!< Vector u8 compare lesser-or-equal.
+ kCmpLeI16, //!< Vector i16 compare lesser-or-equal.
+ kCmpLeU16, //!< Vector u16 compare lesser-or-equal.
+ kCmpLeI32, //!< Vector i32 compare lesser-or-equal.
+ kCmpLeU32, //!< Vector u32 compare lesser-or-equal.
+ kCmpLeI64, //!< Vector i64 compare lesser-or-equal.
+ kCmpLeU64, //!< Vector u64 compare lesser-or-equal.
+
+ kAndF32, //!< Vector f32 bitwise AND - `dst = src1 & src2`.
+ kAndF64, //!< Vector f64 bitwise AND - `dst = src1 & src2`.
+ kOrF32, //!< Vector f32 bitwise OR - `dst = src1 | src2`.
+ kOrF64, //!< Vector f64 bitwise OR - `dst = src1 | src2`.
+ kXorF32, //!< Vector f32 bitwise XOR - `dst = src1 ^ src2`.
+ kXorF64, //!< Vector f64 bitwise XOR - `dst = src1 ^ src2`.
+ kAndnF32, //!< Vector f32 bitwise ANDN - `dst = ~src1 & src2`.
+ kAndnF64, //!< Vector f64 bitwise ANDN - `dst = ~src1 & src2`.
+ kBicF32, //!< Vector f32 bitwise BIC - `dst = src1 & ~src2`.
+ kBicF64, //!< Vector f64 bitwise BIC - `dst = src1 & ~src2`.
+ kAddF32S, //!< Scalar f32 add.
+ kAddF64S, //!< Scalar f64 add.
+ kAddF32, //!< Vector f32 add.
+ kAddF64, //!< Vector f64 add.
+ kSubF32S, //!< Scalar f32 sub.
+ kSubF64S, //!< Scalar f64 sub.
+ kSubF32, //!< Vector f32 sub.
+ kSubF64, //!< Vector f64 sub.
+ kMulF32S, //!< Scalar f32 mul.
+ kMulF64S, //!< Scalar f64 mul.
+ kMulF32, //!< Vector f32 mul.
+ kMulF64, //!< Vector f64 mul.
+ kDivF32S, //!< Scalar f32 div.
+ kDivF64S, //!< Scalar f64 div.
+ kDivF32, //!< Vector f32 div.
+ kDivF64, //!< Vector f64 div.
+ kModF32S, //!< Scalar f32 modulo.
+ kModF64S, //!< Scalar f64 modulo.
+ kModF32, //!< Vector f32 modulo.
+ kModF64, //!< Vector f64 modulo.
+ kMinF32S, //!< Scalar f32 minimum.
+ kMinF64S, //!< Scalar f64 minimum.
+ kMinF32, //!< Vector f32 minimum.
+ kMinF64, //!< Vector f64 minimum.
+ kMaxF32S, //!< Scalar f32 maximum.
+ kMaxF64S, //!< Scalar f64 maximum.
+ kMaxF32, //!< Vector f32 maximum.
+ kMaxF64, //!< Vector f64 maximum.
+ kCmpEqF32S, //!< Scalar f32 compare equal (ordered).
+ kCmpEqF64S, //!< Scalar f64 compare equal (ordered).
+ kCmpEqF32, //!< Vector f32 compare equal (ordered).
+ kCmpEqF64, //!< Vector f64 compare equal (ordered).
+ kCmpNeF32S, //!< Scalar f32 compare not-equal (ordered)
+ kCmpNeF64S, //!< Scalar f64 compare not-equal (ordered)
+ kCmpNeF32, //!< Vector f32 compare not-equal (ordered)
+ kCmpNeF64, //!< Vector f64 compare not-equal (ordered)
+ kCmpGtF32S, //!< Scalar f32 compare greater-than (ordered)
+ kCmpGtF64S, //!< Scalar f64 compare greater-than (ordered)
+ kCmpGtF32, //!< Vector f32 compare greater-than (ordered)
+ kCmpGtF64, //!< Vector f64 compare greater-than (ordered)
+ kCmpGeF32S, //!< Scalar f32 compare greater-or-equal (ordered)
+ kCmpGeF64S, //!< Scalar f64 compare greater-or-equal (ordered)
+ kCmpGeF32, //!< Vector f32 compare greater-or-equal (ordered)
+ kCmpGeF64, //!< Vector f64 compare greater-or-equal (ordered)
+ kCmpLtF32S, //!< Scalar f32 compare lesser-than (ordered)
+ kCmpLtF64S, //!< Scalar f64 compare lesser-than (ordered)
+ kCmpLtF32, //!< Vector f32 compare lesser-than (ordered)
+ kCmpLtF64, //!< Vector f64 compare lesser-than (ordered)
+ kCmpLeF32S, //!< Scalar f32 compare lesser-or-equal (ordered)
+ kCmpLeF64S, //!< Scalar f64 compare lesser-or-equal (ordered)
+ kCmpLeF32, //!< Vector f32 compare lesser-or-equal (ordered)
+ kCmpLeF64, //!< Vector f64 compare lesser-or-equal (ordered)
+ kCmpOrdF32S, //!< Scalar f32 compare ordered.
+ kCmpOrdF64S, //!< Scalar f64 compare ordered.
+ kCmpOrdF32, //!< Vector f32 compare ordered.
+ kCmpOrdF64, //!< Vector f64 compare ordered.
+ kCmpUnordF32S, //!< Scalar f32 compare unordered.
+ kCmpUnordF64S, //!< Scalar f64 compare unordered.
+ kCmpUnordF32, //!< Vector f32 compare unordered.
+ kCmpUnordF64, //!< Vector f64 compare unordered.
+
+ kHAddF64, //!< Vector f64 horizontal-add.
+
+ kCombineLoHiU64, //!< Combine low and high u64 lanes.
+ kCombineLoHiF64, //!< Combine low and high f64 lanes.
+ kCombineHiLoU64, //!< Combine low and high u64 lanes.
+ kCombineHiLoF64, //!< Combine low and high f64 lanes.
+
+ kInterleaveLoU8, //!< Interleave low u8 lanes.
+ kInterleaveHiU8, //!< Interleave high u8 lanes.
+ kInterleaveLoU16, //!< Interleave low u16 lanes.
+ kInterleaveHiU16, //!< Interleave high u16 lanes.
+ kInterleaveLoU32, //!< Interleave low u32 lanes.
+ kInterleaveHiU32, //!< Interleave high u32 lanes.
+ kInterleaveLoU64, //!< Interleave low u64 lanes.
+ kInterleaveHiU64, //!< Interleave high u64 lanes.
+ kInterleaveLoF32, //!< Interleave low f32 lanes.
+ kInterleaveHiF32, //!< Interleave high f32 lanes.
+ kInterleaveLoF64, //!< Interleave low f64 lanes.
+ kInterleaveHiF64, //!< Interleave high f64 lanes.
+
+ kPacksI16_I8, //!< Pack i16 to i8 with saturation.
+ kPacksI16_U8, //!< Pack i16 to u8 with saturation.
+ kPacksI32_I16, //!< Pack i32 to i16 with saturation.
+ kPacksI32_U16, //!< Pack i32 to u16 with saturation.
+
+ kSwizzlev_U8, //!< Swizzle 16xu8 elements in each 128-bit lane.
+
+#if defined(ASMJIT_UJIT_AARCH64)
+
+ kMulwLoI8,
+ kMulwLoU8,
+ kMulwHiI8,
+ kMulwHiU8,
+ kMulwLoI16,
+ kMulwLoU16,
+ kMulwHiI16,
+ kMulwHiU16,
+ kMulwLoI32,
+ kMulwLoU32,
+ kMulwHiI32,
+ kMulwHiU32,
+
+ kMAddwLoI8,
+ kMAddwLoU8,
+ kMAddwHiI8,
+ kMAddwHiU8,
+ kMAddwLoI16,
+ kMAddwLoU16,
+ kMAddwHiI16,
+ kMAddwHiU16,
+ kMAddwLoI32,
+ kMAddwLoU32,
+ kMAddwHiI32,
+ kMAddwHiU32,
+
+ kMaxValue = kMAddwHiU32
+
+#elif defined(ASMJIT_UJIT_X86)
+
+ kPermuteU8, //!< Permute u8 elements across the vector.
+ kPermuteU16, //!< Permute u16 elements across the vector.
+ kPermuteU32, //!< Permute u32 elements across the vector.
+ kPermuteU64, //!< Permute u64 elements across the vector.
+
+ kMaxValue = kPermuteU64
+
+#else
+
+ kMaxValue = kSwizzlev_U8
+
+#endif // ASMJIT_UJIT_AARCH64
+};
+
+//! Instruction with `[vec, vec, vec, imm]` operands.
+//!
+//! Describes vector arithmetic that has one destination, two sources, and immediate.
+//!
+//! \note For convenience, the third operand can be register, memory, or immediate value.
+enum class UniOpVVVI : uint32_t {
+ kAlignr_U128, //!< Align-right 8-bit elements in 128-bit.
+ kInterleaveShuffleU32x4, //!< Interleaved u32x4 shuffle.
+ kInterleaveShuffleU64x2, //!< Interleaved u64x2 shuffle.
+ kInterleaveShuffleF32x4, //!< Interleaved f32x4 shuffle.
+ kInterleaveShuffleF64x2, //!< Interleaved f64x2 shuffle.
+ kInsertV128_U32, //!< Insert a 128-bit lane (u32) into 256-bit or 512-bit vector.
+ kInsertV128_F32, //!< Insert a 128-bit lane (f32) into 256-bit or 512-bit vector.
+ kInsertV128_U64, //!< Insert a 128-bit lane (u64) into 256-bit or 512-bit vector.
+ kInsertV128_F64, //!< Insert a 128-bit lane (f64) into 256-bit or 512-bit vector.
+ kInsertV256_U32, //!< Insert a 256-bit lane (u32) into 512-bit vector.
+ kInsertV256_F32, //!< Insert a 256-bit lane (f32) into 512-bit vector.
+ kInsertV256_U64, //!< Insert a 256-bit lane (u64) into 512-bit vector.
+ kInsertV256_F64, //!< Insert a 256-bit lane (f64) into 512-bit vector.
+
+ kMaxValue = kInsertV256_F64
+};
+
+//! Instruction with `[vec, vec, vec, vec]` operands.
+//!
+//! Describes vector arithmetic that has one destination and three sources.
+//!
+//! \note For convenience, the fourth operand can be register, memory, or immediate value.
+//!
+//! \remarks For FMA functionality, check also \ref FMAddOpBehavior.
+enum class UniOpVVVV : uint32_t {
+ kBlendV_U8,
+
+ kMAddU16, //!< Vector u16 multiply-add.
+ kMAddU32, //!< Vector u32 multiply-add.
+
+ kMAddF32S, //!< Scalar f32 multiply-add (FMA if available, or separate MUL+ADD if not).
+ kMAddF64S, //!< Scalar f64 multiply-add (FMA if available, or separate MUL+ADD if not).
+ kMAddF32, //!< Vector f32 multiply-add (FMA if available, or separate MUL+ADD if not).
+ kMAddF64, //!< Vector f64 multiply-add (FMA if available, or separate MUL+ADD if not).
+
+ kMSubF32S, //!< Scalar f32 multiply-sub (FMA if available, or separate MUL+ADD if not).
+ kMSubF64S, //!< Scalar f64 multiply-sub (FMA if available, or separate MUL+ADD if not).
+ kMSubF32, //!< Vector f32 multiply-sub (FMA if available, or separate MUL+ADD if not).
+ kMSubF64, //!< Vector f64 multiply-sub (FMA if available, or separate MUL+ADD if not).
+
+ kNMAddF32S, //!< Scalar f32 negated-multiply-add (FMA if available, or separate MUL+ADD if not)
+ kNMAddF64S, //!< Scalar f64 negated-multiply-add (FMA if available, or separate MUL+ADD if not)
+ kNMAddF32, //!< Vector f32 negated-multiply-add (FMA if available, or separate MUL+ADD if not).
+ kNMAddF64, //!< Vector f64 negated-multiply-add (FMA if available, or separate MUL+ADD if not).
+
+ kNMSubF32S, //!< Scalar f32 negated-multiply-sub (FMA if available, or separate MUL+ADD if not).
+ kNMSubF64S, //!< Scalar f64 negated-multiply-sub (FMA if available, or separate MUL+ADD if not).
+ kNMSubF32, //!< Vector f32 negated-multiply-sub (FMA if available, or separate MUL+ADD if not).
+ kNMSubF64, //!< Vector f64 negated-multiply-sub (FMA if available, or separate MUL+ADD if not).
+
+ kMaxValue = kNMSubF64
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
+#endif // ASMJIT_UJIT_UNIOP_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/ujit/vecconsttable.cpp b/3rdparty/asmjit/asmjit/ujit/vecconsttable.cpp
new file mode 100644
index 00000000000..1bfe508ea63
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/vecconsttable.cpp
@@ -0,0 +1,20 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#include <asmjit/ujit/vecconsttable.h>
+
+#if !defined(ASMJIT_NO_UJIT)
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+// REFACTOR [C++20]: Use 'constinit' to make sure the constant is initialized at compile-time.
+static constexpr VecConstTable vec_const_table_;
+
+const VecConstTable vec_const_table = vec_const_table_;
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
diff --git a/3rdparty/asmjit/asmjit/ujit/vecconsttable.h b/3rdparty/asmjit/asmjit/ujit/vecconsttable.h
new file mode 100644
index 00000000000..76682761b6d
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/ujit/vecconsttable.h
@@ -0,0 +1,454 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_UJIT_VECCONSTTABLE_H_INCLUDED
+#define ASMJIT_UJIT_VECCONSTTABLE_H_INCLUDED
+
+#include <asmjit/core/globals.h>
+
+#if !defined(ASMJIT_NO_UJIT)
+
+ASMJIT_BEGIN_SUB_NAMESPACE(ujit)
+
+//! \addtogroup asmjit_ujit
+//! \{
+
+template<typename T, size_t W>
+struct VecConst;
+
+//! \cond
+
+//! A 64-bit vector constant of type `T` aligned to 64 bits.
+template<typename T>
+struct ASMJIT_MAY_ALIAS ASMJIT_ALIGNAS(8) VecConst<T, 8> {
+ using ElementType = T;
+
+ static inline constexpr size_t kVectorWidth = 8;
+ static inline constexpr size_t kElementSize = sizeof(ElementType);
+ static inline constexpr size_t kElementCount = kVectorWidth / kElementSize;
+
+ static_assert(kElementCount > 0u, "Vector constant must have at least one element");
+
+ ElementType data[kElementCount];
+
+ template<typename DstT>
+ ASMJIT_INLINE_NODEBUG const DstT& as() const noexcept {
+ static_assert(sizeof(DstT) <= sizeof(*this), "Size of the destination type DstT must be <= 8");
+ return *static_cast<const DstT*>(static_cast<const void*>(this));
+ }
+};
+
+//! A 128-bit vector constant of type `T` aligned to 128 bits.
+template<typename T>
+struct ASMJIT_MAY_ALIAS ASMJIT_ALIGNAS(16) VecConst<T, 16> {
+ using ElementType = T;
+
+ static inline constexpr size_t kVectorWidth = 16;
+ static inline constexpr size_t kElementSize = sizeof(ElementType);
+ static inline constexpr size_t kElementCount = kVectorWidth / kElementSize;
+
+ static_assert(kElementCount > 0u, "Vector constant must have at least one element");
+
+ ElementType data[kElementCount];
+
+ template<typename DstT>
+ ASMJIT_INLINE_NODEBUG const DstT& as() const noexcept {
+ static_assert(sizeof(DstT) <= sizeof(*this), "Size of the destination type DstT must be <= 16");
+ return *static_cast<const DstT*>(static_cast<const void*>(this));
+ }
+};
+
+//! A 256-bit vector constant of type `T` aligned to 256 bits.
+template<typename T>
+struct ASMJIT_MAY_ALIAS ASMJIT_ALIGNAS(32) VecConst<T, 32> {
+ using ElementType = T;
+
+ static inline constexpr size_t kVectorWidth = 32;
+ static inline constexpr size_t kElementSize = sizeof(ElementType);
+ static inline constexpr size_t kElementCount = kVectorWidth / kElementSize;
+
+ static_assert(kElementCount > 0u, "Vector constant must have at least one element");
+
+ ElementType data[kElementCount];
+
+ template<typename DstT>
+ ASMJIT_INLINE_NODEBUG const DstT& as() const noexcept {
+ static_assert(sizeof(DstT) <= sizeof(*this), "Size of the destination type DstT must be <= 32");
+ return *static_cast<const DstT*>(static_cast<const void*>(this));
+ }
+};
+
+//! A 512-bit vector constant of type `T` aligned to 512 bits.
+template<typename T>
+struct ASMJIT_MAY_ALIAS ASMJIT_ALIGNAS(64) VecConst<T, 64> {
+ using ElementType = T;
+
+ static inline constexpr size_t kVectorWidth = 64;
+ static inline constexpr size_t kElementSize = sizeof(ElementType);
+ static inline constexpr size_t kElementCount = kVectorWidth / kElementSize;
+
+ static_assert(kElementCount > 0u, "Vector constant must have at least one element");
+
+ ElementType data[kElementCount];
+
+ template<typename DstT>
+ ASMJIT_INLINE_NODEBUG const DstT& as() const noexcept {
+ static_assert(sizeof(DstT) <= sizeof(*this), "Size of the destination type DstT must be <= 64");
+ return *static_cast<const DstT*>(static_cast<const void*>(this));
+ }
+};
+
+//! \endcond
+
+template<typename T> using VecConst64 = VecConst<T, 8>;
+template<typename T> using VecConst128 = VecConst<T, 16>;
+template<typename T> using VecConst256 = VecConst<T, 32>;
+template<typename T> using VecConst512 = VecConst<T, 64>;
+
+#if ASMJIT_ARCH_X86
+// The maximum native constants we want to use in X86 case is 256-bit ones, because in AVX-512 case
+// we want to just broadcast the constant to all lanes. The reason is to not end up with a huge table.
+template<typename T> using VecConstNative = VecConst256<T>;
+#else
+// At the moment all non-x86 platforms support at most 128-bit vectors, thus the maximum width of each
+// constant is limited to 128 bits as well. Future additions could include LoongArch, which supports
+// 256-bit SIMD vectors natively.
+template<typename T> using VecConstNative = VecConst128<T>;
+#endif
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(T v) noexcept {
+ static_assert(V::kElementCount == 1u ||
+ V::kElementCount == 2u ||
+ V::kElementCount == 4u ||
+ V::kElementCount == 8u ||
+ V::kElementCount == 16u ||
+ V::kElementCount == 32u ||
+ V::kElementCount == 64u);
+
+ if constexpr (V::kElementCount == 1u) {
+ return V{{
+ v
+ }};
+ }
+ else if constexpr (V::kElementCount == 2u) {
+ return V{{
+ v, v
+ }};
+ }
+ else if constexpr (V::kElementCount == 4u) {
+ return V{{
+ v, v, v, v
+ }};
+ }
+ else if constexpr (V::kElementCount == 8u) {
+ return V{{
+ v, v, v, v, v, v, v, v
+ }};
+ }
+ else if constexpr (V::kElementCount == 16u) {
+ return V{{
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v
+ }};
+ }
+ else if constexpr (V::kElementCount == 32u) {
+ return V{{
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v
+ }};
+ }
+ else {
+ return V{{
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v,
+ v, v, v, v, v, v, v, v
+ }};
+ }
+}
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(T h, T l) noexcept {
+ static_assert(V::kElementCount == 2u ||
+ V::kElementCount == 4u ||
+ V::kElementCount == 8u ||
+ V::kElementCount == 16u ||
+ V::kElementCount == 32u ||
+ V::kElementCount == 64u);
+
+ if constexpr (V::kElementCount == 2u) {
+ return V{{
+ l, h
+ }};
+ }
+ else if constexpr (V::kElementCount == 4u) {
+ return V{{
+ l, h, l, h
+ }};
+ }
+ else if constexpr (V::kElementCount == 8u) {
+ return V{{
+ l, h, l, h, l, h, l, h
+ }};
+ }
+ else if constexpr (V::kElementCount == 16u) {
+ return V{{
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h
+ }};
+ }
+ else if constexpr (V::kElementCount == 32u) {
+ return V{{
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h
+ }};
+ }
+ else {
+ return V{{
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h,
+ l, h, l, h, l, h, l, h
+ }};
+ }
+}
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(T d, T c, T b, T a) noexcept {
+ static_assert(V::kElementCount == 4u ||
+ V::kElementCount == 8u ||
+ V::kElementCount == 16u ||
+ V::kElementCount == 32u ||
+ V::kElementCount == 64u);
+
+ if constexpr (V::kElementCount == 4u) {
+ return V{{
+ a, b, c, d
+ }};
+ }
+ else if constexpr (V::kElementCount == 8u) {
+ return V{{
+ a, b, c, d, a, b, c, d
+ }};
+ }
+ else if constexpr (V::kElementCount == 16u) {
+ return V{{
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d
+ }};
+ }
+ else if constexpr (V::kElementCount == 32u) {
+ return V{{
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d
+ }};
+ }
+ else {
+ return V{{
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d,
+ a, b, c, d, a, b, c, d
+ }};
+ }
+}
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(T h, T g, T f, T e, T d, T c, T b, T a) noexcept {
+ static_assert(V::kElementCount == 8u ||
+ V::kElementCount == 16u ||
+ V::kElementCount == 32u ||
+ V::kElementCount == 64u);
+
+ if constexpr (V::kElementCount == 8u) {
+ return V{{
+ a, b, c, d, e, f, g, h
+ }};
+ }
+ else if constexpr (V::kElementCount == 16u) {
+ return V{{
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h
+ }};
+ }
+ else if constexpr (V::kElementCount == 32u) {
+ return V{{
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h
+ }};
+ }
+ else {
+ return V{{
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h,
+ a, b, c, d, e, f, g, h
+ }};
+ }
+}
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(
+ T p, T o, T n, T m, T l, T k, T j, T i, T h, T g, T f, T e, T d, T c, T b, T a
+) noexcept {
+ static_assert(V::kElementCount == 16u ||
+ V::kElementCount == 32u ||
+ V::kElementCount == 64u);
+
+ if constexpr (V::kElementCount == 16u) {
+ return V{{
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p
+ }};
+ }
+ else if constexpr (V::kElementCount == 32u) {
+ return V{{
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p,
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p
+ }};
+ }
+ else {
+ return V{{
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p,
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p,
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p,
+ a, b, c, d, e, f, g, h,
+ i, j, k, l, m, n, o, p
+ }};
+ }
+}
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(
+ T p1, T o1, T n1, T m1, T l1, T k1, T j1, T i1, T h1, T g1, T f1, T e1, T d1, T c1, T b1, T a1,
+ T p0, T o0, T n0, T m0, T l0, T k0, T j0, T i0, T h0, T g0, T f0, T e0, T d0, T c0, T b0, T a0
+) noexcept {
+ static_assert(V::kElementCount == 32u ||
+ V::kElementCount == 64u);
+
+ if constexpr (V::kElementCount == 32u) {
+ return V{{
+ a0, b0, c0, d0, e0, f0, g0, h0,
+ i0, j0, k0, l0, m0, n0, o0, p0,
+ a1, b1, c1, d1, e1, f1, g1, h1,
+ i1, j1, k1, l1, m1, n1, o1, p1
+ }};
+ }
+ else {
+ return V{{
+ a0, b0, c0, d0, e0, f0, g0, h0,
+ i0, j0, k0, l0, m0, n0, o0, p0,
+ a1, b1, c1, d1, e1, f1, g1, h1,
+ i1, j1, k1, l1, m1, n1, o1, p1,
+ a0, b0, c0, d0, e0, f0, g0, h0,
+ i0, j0, k0, l0, m0, n0, o0, p0,
+ a1, b1, c1, d1, e1, f1, g1, h1,
+ i1, j1, k1, l1, m1, n1, o1, p1
+ }};
+ }
+}
+
+template<typename V, typename T = typename V::ElementType>
+static ASMJIT_INLINE_CONSTEXPR V make_const(
+ T p3, T o3, T n3, T m3, T l3, T k3, T j3, T i3, T h3, T g3, T f3, T e3, T d3, T c3, T b3, T a3,
+ T p2, T o2, T n2, T m2, T l2, T k2, T j2, T i2, T h2, T g2, T f2, T e2, T d2, T c2, T b2, T a2,
+ T p1, T o1, T n1, T m1, T l1, T k1, T j1, T i1, T h1, T g1, T f1, T e1, T d1, T c1, T b1, T a1,
+ T p0, T o0, T n0, T m0, T l0, T k0, T j0, T i0, T h0, T g0, T f0, T e0, T d0, T c0, T b0, T a0
+) noexcept {
+ static_assert(V::kElementCount == 64u);
+
+ return V{{
+ a0, b0, c0, d0, e0, f0, g0, h0,
+ i0, j0, k0, l0, m0, n0, o0, p0,
+ a1, b1, c1, d1, e1, f1, g1, h1,
+ i1, j1, k1, l1, m1, n1, o1, p1,
+ a2, b2, c2, d2, e2, f2, g2, h2,
+ i2, j2, k2, l2, m2, n2, o2, p2,
+ a3, b3, c3, d3, e3, f3, g3, h3,
+ i3, j3, k3, l3, m3, n3, o3, p3
+ }};
+}
+
+struct VecConstTable {
+ VecConstNative<uint64_t> p_0000000000000000 = make_const<VecConstNative<uint64_t>>(uint64_t(0x0000000000000000u));
+ VecConstNative<uint64_t> p_FFFFFFFFFFFFFFFF = make_const<VecConstNative<uint64_t>>(uint64_t(0xFFFFFFFFFFFFFFFFu));
+
+ VecConstNative<uint64_t> p_8080808080808080 = make_const<VecConstNative<uint64_t>>(uint64_t(0x8080808080808080u));
+ VecConstNative<uint64_t> p_8000800080008000 = make_const<VecConstNative<uint64_t>>(uint64_t(0x8000800080008000u));
+ VecConstNative<uint64_t> p_8000000080000000 = make_const<VecConstNative<uint64_t>>(uint64_t(0x8000000080000000u));
+ VecConstNative<uint64_t> p_8000000000000000 = make_const<VecConstNative<uint64_t>>(uint64_t(0x8000000000000000u));
+
+ VecConstNative<uint64_t> p_7F7F7F7F7F7F7F7F = make_const<VecConstNative<uint64_t>>(uint64_t(0x7F7F7F7F7F7F7F7Fu));
+ VecConstNative<uint64_t> p_7FFF7FFF7FFF7FFF = make_const<VecConstNative<uint64_t>>(uint64_t(0x7FFF7FFF7FFF7FFFu));
+ VecConstNative<uint64_t> p_7FFFFFFF7FFFFFFF = make_const<VecConstNative<uint64_t>>(uint64_t(0x7FFFFFFF7FFFFFFFu));
+ VecConstNative<uint64_t> p_7FFFFFFFFFFFFFFF = make_const<VecConstNative<uint64_t>>(uint64_t(0x7FFFFFFFFFFFFFFFu));
+
+ VecConstNative<uint64_t> p_0100010001000100 = make_const<VecConstNative<uint64_t>>(uint64_t(0x0100010001000100u));
+ VecConstNative<uint64_t> p_00FF00FF00FF00FF = make_const<VecConstNative<uint64_t>>(uint64_t(0x00FF00FF00FF00FFu));
+ VecConstNative<uint64_t> p_0F0F0F0F0F0F0F0F = make_const<VecConstNative<uint64_t>>(uint64_t(0x0F0F0F0F0F0F0F0Fu));
+
+ VecConstNative<uint64_t> p_1010101010101010 = make_const<VecConstNative<uint64_t>>(uint64_t(0x1010101010101010u));
+
+ VecConstNative<uint64_t> p_FFFFFFFF00000000 = make_const<VecConstNative<uint64_t>>(uint64_t(0xFFFFFFFF00000000u));
+
+ VecConstNative<uint64_t> p_0000800000008000 = make_const<VecConstNative<uint64_t>>(uint64_t(0x0000800000008000u));
+
+ VecConst128<uint32_t> sign32_scalar = make_const<VecConst128<uint32_t>>(0u, 0u, 0u, uint32_t(0x80000000u));
+ VecConst128<uint64_t> sign64_scalar = make_const<VecConst128<uint64_t>>(uint64_t(0u), uint64_t(0x8000000000000000u));
+
+ VecConstNative<uint64_t> f32_0_5_minus_1ulp = make_const<VecConstNative<uint64_t>>(0x3EFFFFFF3EFFFFFFu); // 0.49999997 (0.5f - 1ulp)
+ VecConstNative<float> f32_0_5 = make_const<VecConstNative<float>>(0.5f);
+ VecConstNative<float> f32_1 = make_const<VecConstNative<float>>(1.0f);
+ VecConstNative<float> f32_round_magic = make_const<VecConstNative<float>>(8388608.0f);
+
+ VecConstNative<uint64_t> f64_0_5_minus_1ulp = make_const<VecConstNative<uint64_t>>(0x3FDFFFFFFFFFFFFFu); // 0.49999999999999994 (0.5 - 1ulp).
+ VecConstNative<double> f64_0_5 = make_const<VecConstNative<double>>(0.5);
+ VecConstNative<double> f64_1 = make_const<VecConstNative<double>>(1.0);
+ VecConstNative<double> f64_round_magic = make_const<VecConstNative<double>>(4503599627370496.0);
+};
+
+ASMJIT_VARAPI const VecConstTable vec_const_table;
+
+struct VecConstTableRef {
+ const VecConstTable& table;
+ size_t size;
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_UJIT
+#endif // ASMJIT_UJIT_VECCONSTTABLE_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86.h b/3rdparty/asmjit/asmjit/x86.h
new file mode 100644
index 00000000000..db6c46bc717
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86.h
@@ -0,0 +1,84 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_H_INCLUDED
+#define ASMJIT_X86_H_INCLUDED
+
+//! \addtogroup asmjit_x86
+//!
+//! ### Namespace
+//!
+//! - \ref x86 - x86 namespace provides support for X86/X64 code generation.
+//!
+//! ### Emitters
+//!
+//! - \ref x86::Assembler - X86/X64 assembler (must read, provides examples).
+//! - \ref x86::Builder - X86/X64 builder.
+//! - \ref x86::Compiler - X86/X64 compiler.
+//! - \ref x86::Emitter - X86/X64 emitter (abstract).
+//!
+//! ### Supported Instructions
+//!
+//! - Emitters:
+//! - \ref x86::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility
+//! functions. The member functions provided are part of all X86 emitters.
+//! - \ref x86::EmitterImplicitT - Provides all instructions that use implicit operands, these cannot be used
+//! with \ref x86::Compiler.
+//!
+//! - Instruction representation:
+//! - \ref x86::Inst::Id - Provides instruction identifiers of X86|X86_64 architecture.
+//! - \ref InstOptions - Provides generic and X86|X86_64 specific options.
+//!
+//! ### Register Operands
+//!
+//! - \ref x86::Gp - General purpose register (abstracts 8-bit, 16-bit, 32-bit, and 64-bit GP registers).
+//! - \ref x86::Vec - Vector (SIMD) register (abstracts XMM, YMM, and ZMM registers).
+//! - \ref x86::Mm - 64-bit MMX register.
+//! - \ref x86::St - 80-bit FPU register.
+//! - \ref x86::KReg - opmask registers (AVX512+).
+//! - \ref x86::SReg - segment register.
+//! - \ref x86::CReg - control register.
+//! - \ref x86::DReg - debug register.
+//! - \ref x86::Bnd - bound register (discontinued).
+//! - \ref x86::Rip - relative instruction pointer.
+//!
+//! ### Memory Operands
+//!
+//! - \ref x86::Mem - X86/X64 memory operand that provides support for all X86 and X64 addressing features
+//! including absolute addresses, index scales, and segment override prefixes.
+//!
+//! ### Status and Control Words
+//!
+//! - \ref x86::FpuStatusWord - FPU status word bits / decomposition.
+//! - \ref x86::FpuControlWord - FPU control word bits / decomposition.
+//!
+//! ### Predicates (immediate values)
+//!
+//! - \ref x86::CmpImm - `CMP[PD|PS|SD|SS]` predicate (SSE+).
+//! - \ref x86::PCmpStrImm - `[V]PCMP[I|E]STR[I|M]` predicate (SSE4.1+, AVX+).
+//! - \ref x86::RoundImm - `[V]ROUND[PD|PS|SD|SS]` predicate (SSE+, AVX+).
+//! - \ref x86::VCmpImm - `VCMP[PD|PS|SD|SS]` predicate (AVX+).
+//! - \ref x86::VFixupImm - `VFIXUPIMM[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VFPClassImm - `VFPCLASS[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VGetMantImm - `VGETMANT[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VPCmpImm - `VPCMP[U][B|W|D|Q]` predicate (AVX512+).
+//! - \ref x86::VPComImm - `VPCOM[U][B|W|D|Q]` predicate (XOP).
+//! - \ref x86::VRangeImm - `VRANGE[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::VReduceImm - `REDUCE[PD|PS|SD|SS]` predicate (AVX512+).
+//! - \ref x86::TLogImm - `VPTERNLOG[D|Q]` predicate and operations (AVX512+).
+
+#include <asmjit/core.h>
+
+#include <asmjit/asmjit-scope-begin.h>
+#include <asmjit/x86/x86assembler.h>
+#include <asmjit/x86/x86builder.h>
+#include <asmjit/x86/x86compiler.h>
+#include <asmjit/x86/x86emitter.h>
+#include <asmjit/x86/x86globals.h>
+#include <asmjit/x86/x86instdb.h>
+#include <asmjit/x86/x86operand.h>
+#include <asmjit/asmjit-scope-end.h>
+
+#endif // ASMJIT_X86_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86archtraits_p.h b/3rdparty/asmjit/asmjit/x86/x86archtraits_p.h
new file mode 100644
index 00000000000..80d00c28531
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86archtraits_p.h
@@ -0,0 +1,165 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
+#define ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86 architecture traits (internal).
+static const constexpr ArchTraits x86_arch_traits = {
+ // SP/FP/LR/PC.
+ Gp::kIdSp, Gp::kIdBp, 0xFF, 0xFF,
+
+ // Reserved.
+ { 0, 0, 0 },
+
+ // HW stack alignment.
+ 1,
+
+ // Min/Max stack offset
+ 0x7FFFFFFFu, 0x7FFFFFFFu,
+
+ // Supported register types.
+ 0u | (1u << uint32_t(RegType::kGp8Lo ))
+ | (1u << uint32_t(RegType::kGp8Hi ))
+ | (1u << uint32_t(RegType::kGp16 ))
+ | (1u << uint32_t(RegType::kGp32 ))
+ | (1u << uint32_t(RegType::kGp64 ))
+ | (1u << uint32_t(RegType::kVec128 ))
+ | (1u << uint32_t(RegType::kVec256 ))
+ | (1u << uint32_t(RegType::kVec512 ))
+ | (1u << uint32_t(RegType::kMask ))
+ | (1u << uint32_t(RegType::kSegment))
+ | (1u << uint32_t(RegType::kControl))
+ | (1u << uint32_t(RegType::kDebug ))
+ | (1u << uint32_t(RegType::kX86_Mm ))
+ | (1u << uint32_t(RegType::kX86_St ))
+ | (1u << uint32_t(RegType::kX86_Bnd))
+ | (1u << uint32_t(RegType::kPC )),
+
+ // ISA features [Gp, Vec, Other0, Other1].
+ {{
+ InstHints::kRegSwap | InstHints::kPushPop,
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // TypeIdToRegType.
+ #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kGp8Lo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kGp8Lo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kGp16 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kGp16 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kVec128 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kVec128 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask8) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask16) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask32) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask64) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx32) ? RegType::kX86_Mm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx64) ? RegType::kX86_Mm : RegType::kNone)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kDB,
+ ArchTypeNameId::kDW,
+ ArchTypeNameId::kDD,
+ ArchTypeNameId::kDQ
+ }
+};
+
+//! X64 architecture traits (internal).
+static const constexpr ArchTraits x64_arch_traits = {
+ // SP/FP/LR/PC.
+ Gp::kIdSp, Gp::kIdBp, 0xFF, 0xFF,
+
+ // Reserved.
+ { 0, 0, 0 },
+
+ // HW stack alignment.
+ 1,
+
+ // Min/Max stack offset
+ 0x7FFFFFFFu, 0x7FFFFFFFu,
+
+ // Supported register types.
+ 0u | (1u << uint32_t(RegType::kGp8Lo ))
+ | (1u << uint32_t(RegType::kGp8Hi ))
+ | (1u << uint32_t(RegType::kGp16 ))
+ | (1u << uint32_t(RegType::kGp32 ))
+ | (1u << uint32_t(RegType::kGp64 ))
+ | (1u << uint32_t(RegType::kVec128 ))
+ | (1u << uint32_t(RegType::kVec256 ))
+ | (1u << uint32_t(RegType::kVec512 ))
+ | (1u << uint32_t(RegType::kMask ))
+ | (1u << uint32_t(RegType::kTile ))
+ | (1u << uint32_t(RegType::kSegment))
+ | (1u << uint32_t(RegType::kControl))
+ | (1u << uint32_t(RegType::kDebug ))
+ | (1u << uint32_t(RegType::kX86_Mm ))
+ | (1u << uint32_t(RegType::kX86_St ))
+ | (1u << uint32_t(RegType::kX86_Bnd))
+ | (1u << uint32_t(RegType::kPC )),
+
+ // ISA features [Gp, Vec, Mask, Extra].
+ {{
+ InstHints::kRegSwap | InstHints::kPushPop,
+ InstHints::kNoHints,
+ InstHints::kNoHints,
+ InstHints::kNoHints
+ }},
+
+ // TypeIdToRegType.
+ #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kGp8Lo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kGp8Lo : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kGp16 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kGp16 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kGp32 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt64) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt64) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kGp64 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kVec128 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kVec128 : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask8) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask16) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask32) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask64) ? RegType::kMask : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx32) ? RegType::kX86_Mm : \
+ index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx64) ? RegType::kX86_Mm : RegType::kNone)
+ {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
+ #undef V
+
+ // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
+ {
+ ArchTypeNameId::kDB,
+ ArchTypeNameId::kDW,
+ ArchTypeNameId::kDD,
+ ArchTypeNameId::kDQ
+ }
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86assembler.cpp b/3rdparty/asmjit/asmjit/x86/x86assembler.cpp
new file mode 100644
index 00000000000..6b9c1a4a183
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86assembler.cpp
@@ -0,0 +1,5141 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/core/codewriter_p.h>
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/emitterutils_p.h>
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/logger.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/x86/x86assembler.h>
+#include <asmjit/x86/x86emithelper_p.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/x86/x86instdb_p.h>
+#include <asmjit/x86/x86formatter_p.h>
+#include <asmjit/x86/x86opcode_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+using FastUInt8 = Support::FastUInt8;
+
+// x86::Assembler - Constants
+// ==========================
+
+//! X86 bytes used to encode important prefixes.
+enum X86Byte : uint32_t {
+ //! 1-byte REX prefix mask.
+ kX86ByteRex = 0x40,
+
+ //! 1-byte REX.W component.
+ kX86ByteRexW = 0x08,
+
+ kX86ByteInvalidRex = 0x80,
+
+ //! 2-byte VEX prefix:
+ //! - `[0]` - `0xC5`.
+ //! - `[1]` - `RvvvvLpp`.
+ kX86ByteVex2 = 0xC5,
+
+ //! 3-byte VEX prefix:
+ //! - `[0]` - `0xC4`.
+ //! - `[1]` - `RXBmmmmm`.
+ //! - `[2]` - `WvvvvLpp`.
+ kX86ByteVex3 = 0xC4,
+
+ //! 3-byte XOP prefix:
+ //! - `[0]` - `0x8F`.
+ //! - `[1]` - `RXBmmmmm`.
+ //! - `[2]` - `WvvvvLpp`.
+ kX86ByteXop3 = 0x8F,
+
+ //! 4-byte EVEX prefix:
+ //! - `[0]` - `0x62`.
+ //! - `[1]` - Payload0 or `P[ 7: 0]` - `[R X B R' 0 m m m]`.
+ //! - `[2]` - Payload1 or `P[15: 8]` - `[W v v v v 1 p p]`.
+ //! - `[3]` - Payload2 or `P[23:16]` - `[z L' L b V' a a a]`.
+ //!
+ //! Payload:
+ //! - `P[ 2: 0]` - OPCODE: EVEX.mmmmm, only lowest 3 bits [2:0] used.
+ //! - `P[ 3]` - ______: Must be 0.
+ //! - `P[ 4]` - REG-ID: EVEX.R' - 5th bit of 'RRRRR'.
+ //! - `P[ 5]` - REG-ID: EVEX.B - 4th bit of 'BBBBB'.
+ //! - `P[ 6]` - REG-ID: EVEX.X - 5th bit of 'BBBBB' or 4th bit of 'XXXX' (with SIB).
+ //! - `P[ 7]` - REG-ID: EVEX.R - 4th bit of 'RRRRR'.
+ //! - `P[ 9: 8]` - OPCODE: EVEX.pp.
+ //! - `P[ 10]` - ______: Must be 1.
+ //! - `P[14:11]` - REG-ID: 4 bits of 'VVVV'.
+ //! - `P[ 15]` - OPCODE: EVEX.W.
+ //! - `P[18:16]` - REG-ID: K register k0...k7 (Merging/Zeroing Vector Ops).
+ //! - `P[ 19]` - REG-ID: 5th bit of 'VVVVV'.
+ //! - `P[ 20]` - OPCODE: Broadcast/Rounding Control/SAE bit.
+ //! - `P[22.21]` - OPCODE: Vector Length (L' and L) / Rounding Control.
+ //! - `P[ 23]` - OPCODE: Zeroing/Merging.
+ kX86ByteEvex = 0x62
+};
+
+// AsmJit specific (used to encode VVVVV field in XOP/VEX/EVEX).
+enum VexVVVVV : uint32_t {
+ kVexVVVVVShift = 7,
+ kVexVVVVVMask = 0x1F << kVexVVVVVShift
+};
+
+//! Instruction 2-byte/3-byte opcode prefix definition.
+struct X86OpcodeMM {
+ uint8_t size;
+ uint8_t data[3];
+};
+
+//! Mandatory prefixes used to encode legacy [66, F3, F2] or [9B] byte.
+static const uint8_t opcode_pp_table[8] = { 0x00, 0x66, 0xF3, 0xF2, 0x00, 0x00, 0x00, 0x9B };
+
+//! Instruction 2-byte/3-byte opcode prefix data.
+static const X86OpcodeMM opcode_mm_table[] = {
+ { 0, { 0x00, 0x00, 0 } }, // #00 (0b0000).
+ { 1, { 0x0F, 0x00, 0 } }, // #01 (0b0001).
+ { 2, { 0x0F, 0x38, 0 } }, // #02 (0b0010).
+ { 2, { 0x0F, 0x3A, 0 } }, // #03 (0b0011).
+ { 2, { 0x0F, 0x01, 0 } }, // #04 (0b0100).
+ { 0, { 0x00, 0x00, 0 } }, // #05 (0b0101).
+ { 0, { 0x00, 0x00, 0 } }, // #06 (0b0110).
+ { 0, { 0x00, 0x00, 0 } }, // #07 (0b0111).
+ { 0, { 0x00, 0x00, 0 } }, // #08 (0b1000).
+ { 0, { 0x00, 0x00, 0 } }, // #09 (0b1001).
+ { 0, { 0x00, 0x00, 0 } }, // #0A (0b1010).
+ { 0, { 0x00, 0x00, 0 } }, // #0B (0b1011).
+ { 0, { 0x00, 0x00, 0 } }, // #0C (0b1100).
+ { 0, { 0x00, 0x00, 0 } }, // #0D (0b1101).
+ { 0, { 0x00, 0x00, 0 } }, // #0E (0b1110).
+ { 0, { 0x00, 0x00, 0 } } // #0F (0b1111).
+};
+
+static const uint8_t segment_prefix_table[8] = {
+ 0x00, // None.
+ 0x26, // ES.
+ 0x2E, // CS.
+ 0x36, // SS.
+ 0x3E, // DS.
+ 0x64, // FS.
+ 0x65 // GS.
+};
+
+static const uint32_t opcode_push_sreg_table[8] = {
+ Opcode::k000000 | 0x00, // None.
+ Opcode::k000000 | 0x06, // Push ES.
+ Opcode::k000000 | 0x0E, // Push CS.
+ Opcode::k000000 | 0x16, // Push SS.
+ Opcode::k000000 | 0x1E, // Push DS.
+ Opcode::k000F00 | 0xA0, // Push FS.
+ Opcode::k000F00 | 0xA8 // Push GS.
+};
+
+static const uint32_t opcode_pop_sreg_table[8] = {
+ Opcode::k000000 | 0x00, // None.
+ Opcode::k000000 | 0x07, // Pop ES.
+ Opcode::k000000 | 0x00, // Pop CS.
+ Opcode::k000000 | 0x17, // Pop SS.
+ Opcode::k000000 | 0x1F, // Pop DS.
+ Opcode::k000F00 | 0xA1, // Pop FS.
+ Opcode::k000F00 | 0xA9 // Pop GS.
+};
+
+// x86::Assembler - X86MemInfo | X86VEXPrefix | X86LLByRegType | X86CDisp8Table
+// ============================================================================
+
+//! Memory operand's info bits.
+//!
+//! A lookup table that contains various information based on the BASE and INDEX information of a memory operand. This
+//! is much better and safer than playing with IFs in the code and can check for errors must faster and better.
+enum X86MemInfo_Enum {
+ kX86MemInfo_0 = 0x00,
+
+ kX86MemInfo_BaseGp = 0x01, //!< Has BASE reg, REX.B can be 1, compatible with REX.B byte.
+ kX86MemInfo_Index = 0x02, //!< Has INDEX reg, REX.X can be 1, compatible with REX.X byte.
+
+ kX86MemInfo_BaseLabel = 0x10, //!< Base is Label.
+ kX86MemInfo_BaseRip = 0x20, //!< Base is RIP.
+
+ kX86MemInfo_67H_X86 = 0x40, //!< Address-size override in 32-bit mode.
+ kX86MemInfo_67H_X64 = 0x80, //!< Address-size override in 64-bit mode.
+ kX86MemInfo_67H_Mask = 0xC0 //!< Contains all address-size override bits.
+};
+
+template<uint32_t X>
+struct X86MemInfo_T {
+ static inline constexpr uint32_t B = (X ) & 0x1F;
+ static inline constexpr uint32_t I = (X >> 5) & 0x1F;
+
+ static inline constexpr uint32_t kBase =
+ (B >= uint32_t(RegType::kGp16) && B <= uint32_t(RegType::kGp64) ) ? kX86MemInfo_BaseGp :
+ (B == uint32_t(RegType::kPC) ) ? kX86MemInfo_BaseRip :
+ (B == uint32_t(RegType::kLabelTag) ) ? kX86MemInfo_BaseLabel : 0;
+
+ static inline constexpr uint32_t kIndex =
+ (I >= uint32_t(RegType::kGp16) && I <= uint32_t(RegType::kGp64) ) ? kX86MemInfo_Index :
+ (I >= uint32_t(RegType::kVec128) && I <= uint32_t(RegType::kVec512) ) ? kX86MemInfo_Index : 0;
+
+ static inline constexpr uint32_t k67H =
+ (B == uint32_t(RegType::kGp16) && I == uint32_t(RegType::kNone) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kGp32) && I == uint32_t(RegType::kNone) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kNone) && I == uint32_t(RegType::kGp16) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kNone) && I == uint32_t(RegType::kGp32) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kGp16) && I == uint32_t(RegType::kGp16) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kGp32) && I == uint32_t(RegType::kGp32) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kGp16) && I == uint32_t(RegType::kVec128) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kGp32) && I == uint32_t(RegType::kVec128) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kGp16) && I == uint32_t(RegType::kVec256) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kGp32) && I == uint32_t(RegType::kVec256) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kGp16) && I == uint32_t(RegType::kVec512) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kGp32) && I == uint32_t(RegType::kVec512) ) ? kX86MemInfo_67H_X64 :
+ (B == uint32_t(RegType::kLabelTag) && I == uint32_t(RegType::kGp16) ) ? kX86MemInfo_67H_X86 :
+ (B == uint32_t(RegType::kLabelTag) && I == uint32_t(RegType::kGp32) ) ? kX86MemInfo_67H_X64 : 0;
+
+ static inline constexpr uint32_t kValue = kBase | kIndex | k67H | 0x04u | 0x08u;
+};
+
+// The result stored in the LUT is a combination of
+// - 67H - Address override prefix - depends on BASE+INDEX register types and the target architecture.
+// - REX - A possible combination of REX.[B|X|R|W] bits in REX prefix where REX.B and REX.X are possibly
+// masked out, but REX.R and REX.W are kept as is.
+#define VALUE(x) X86MemInfo_T<x>::kValue
+static const uint8_t mem_info_table[] = { ASMJIT_LOOKUP_TABLE_1024(VALUE, 0) };
+#undef VALUE
+
+// VEX3 or XOP xor bits applied to the opcode before emitted. The index to this table is 'mmmmm' value, which
+// contains all we need. This is only used by a 3 BYTE VEX and XOP prefixes, 2 BYTE VEX prefix is handled differently.
+// The idea is to minimize the difference between VEX3 vs XOP when encoding VEX or XOP instruction. This should
+// minimize the code required to emit such instructions and should also make it faster as we don't need any branch to
+// decide between VEX3 vs XOP.
+// ____ ___
+// [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP]
+#define VALUE(x) ((x & 0x08) ? kX86ByteXop3 : kX86ByteVex3) | (0xF << 19) | (0x7 << 13)
+static const uint32_t vex_prefix_table[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
+#undef VALUE
+
+// Table that contains LL opcode field addressed by a register size / 16. It's used to propagate L.256 or L.512 when
+// YMM or ZMM registers are used, respectively.
+#define VALUE(x) (x & (64 >> 4)) ? Opcode::kLL_2 : \
+ (x & (32 >> 4)) ? Opcode::kLL_1 : Opcode::kLL_0
+static const uint32_t ll_by_size_div_16_table[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
+#undef VALUE
+
+// Table that contains LL opcode field addressed by a register size / 16. It's used to propagate L.256 or L.512 when
+// YMM or ZMM registers are used, respectively.
+#define VALUE(x) x == uint32_t(RegType::kVec512) ? Opcode::kLL_2 : \
+ x == uint32_t(RegType::kVec256) ? Opcode::kLL_1 : Opcode::kLL_0
+static const uint32_t ll_by_reg_type_table[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
+#undef VALUE
+
+// Table that contains a scale (shift left) based on 'TTWLL' field and the instruction's tuple-type (TT) field. The
+// scale is then applied to the BASE-N stored in each opcode to calculate the final compressed displacement used by
+// all EVEX encoded instructions.
+template<uint32_t X>
+struct X86CDisp8SHL_T {
+ static inline constexpr uint32_t TT = (X >> 3) << Opcode::kCDTT_Shift;
+ static inline constexpr uint32_t LL = (X >> 0) & 0x3;
+ static inline constexpr uint32_t W = (X >> 2) & 0x1;
+
+ static inline constexpr uint32_t kValue = (
+ TT == Opcode::kCDTT_None ? 0u :
+ TT == Opcode::kCDTT_ByLL ? ((LL==0) ? 0 : (LL==1) ? 1u : 2u ) :
+ TT == Opcode::kCDTT_T1W ? ((LL==0) ? W : (LL==1) ? 1u + W : 2u + W) :
+ TT == Opcode::kCDTT_DUP ? ((LL==0) ? 0 : (LL==1) ? 2u : 3u ) : 0) << Opcode::kCDSHL_Shift;
+};
+
+#define VALUE(x) X86CDisp8SHL_T<x>::kValue
+static const uint32_t cdisp8_shl_table[] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
+#undef VALUE
+
+// Table that contains MOD byte of a 16-bit [BASE + disp] address.
+// 0xFF == Invalid.
+static const uint8_t mod16_base_table[8] = {
+ 0xFF, // AX -> N/A.
+ 0xFF, // CX -> N/A.
+ 0xFF, // DX -> N/A.
+ 0x07, // BX -> 111.
+ 0xFF, // SP -> N/A.
+ 0x06, // BP -> 110.
+ 0x04, // SI -> 100.
+ 0x05 // DI -> 101.
+};
+
+// Table that contains MOD byte of a 16-bit [BASE + INDEX + disp] combination.
+// 0xFF == Invalid.
+template<uint32_t X>
+struct X86Mod16BaseIndexTable_T {
+ static inline constexpr uint32_t B = X >> 3;
+ static inline constexpr uint32_t I = X & 0x7u;
+
+ static inline constexpr uint32_t kValue =
+ ((B == Gp::kIdBx && I == Gp::kIdSi) || (B == Gp::kIdSi && I == Gp::kIdBx)) ? 0x00u :
+ ((B == Gp::kIdBx && I == Gp::kIdDi) || (B == Gp::kIdDi && I == Gp::kIdBx)) ? 0x01u :
+ ((B == Gp::kIdBp && I == Gp::kIdSi) || (B == Gp::kIdSi && I == Gp::kIdBp)) ? 0x02u :
+ ((B == Gp::kIdBp && I == Gp::kIdDi) || (B == Gp::kIdDi && I == Gp::kIdBp)) ? 0x03u : 0xFFu;
+};
+
+#define VALUE(x) X86Mod16BaseIndexTable_T<x>::kValue
+static const uint8_t mod16_base_index_table[] = { ASMJIT_LOOKUP_TABLE_64(VALUE, 0) };
+#undef VALUE
+
+// x86::Assembler - Helpers
+// ========================
+
+static ASMJIT_INLINE bool is_jmp_or_call(InstId inst_id) noexcept {
+ return inst_id == Inst::kIdJmp || inst_id == Inst::kIdCall;
+}
+
+static ASMJIT_INLINE bool is_implicit_mem(const Operand_& op, uint32_t base) noexcept {
+ return op.is_mem() && op.as<Mem>().base_id() == base && !op.as<Mem>().has_offset();
+}
+
+//! Combine `reg_id` and `vvvvv_id` into a single value (used by AVX and AVX-512).
+static ASMJIT_INLINE uint32_t pack_reg_and_vvvvv(uint32_t reg_id, uint32_t vvvvv_id) noexcept {
+ return reg_id + (vvvvv_id << kVexVVVVVShift);
+}
+
+static ASMJIT_INLINE uint32_t opcode_l_by_vmem(const Operand_& op) noexcept {
+ return ll_by_reg_type_table[size_t(op.as<Mem>().index_type())];
+}
+
+static ASMJIT_INLINE uint32_t opcode_l_by_size(uint32_t size) noexcept {
+ return ll_by_size_div_16_table[size / 16];
+}
+
+//! Encode MOD byte.
+static ASMJIT_INLINE uint32_t encode_mod(uint32_t m, uint32_t o, uint32_t rm) noexcept {
+ ASMJIT_ASSERT(m <= 3);
+ ASMJIT_ASSERT(o <= 7);
+ ASMJIT_ASSERT(rm <= 7);
+ return (m << 6) + (o << 3) + rm;
+}
+
+//! Encode SIB byte.
+static ASMJIT_INLINE uint32_t encode_sib(uint32_t s, uint32_t i, uint32_t b) noexcept {
+ ASMJIT_ASSERT(s <= 3);
+ ASMJIT_ASSERT(i <= 7);
+ ASMJIT_ASSERT(b <= 7);
+ return (s << 6) + (i << 3) + b;
+}
+
+static ASMJIT_INLINE bool is_rex_invalid(uint32_t rex) noexcept {
+ // Validates the following possibilities:
+ // REX == 0x00 -> OKAY (X86_32 / X86_64).
+ // REX == 0x40-0x4F -> OKAY (X86_64).
+ // REX == 0x80 -> OKAY (X86_32 mode, rex prefix not used).
+ // REX == 0x81-0xCF -> BAD (X86_32 mode, rex prefix used).
+ return rex > kX86ByteInvalidRex;
+}
+
+static ASMJIT_INLINE uint32_t x86_get_force_evex3_mask_in_last_bit(InstOptions options) noexcept {
+ constexpr uint32_t kVex3Bit = Support::ctz_const<InstOptions::kX86_Vex3>;
+ return uint32_t(options & InstOptions::kX86_Vex3) << (31 - kVex3Bit);
+}
+
+template<typename T>
+static ASMJIT_INLINE_CONSTEXPR T sign_extend_int32(T imm) noexcept { return T(int64_t(int32_t(imm & T(0xFFFFFFFF)))); }
+
+static ASMJIT_INLINE uint32_t alt_opcode_of(const InstDB::InstInfo* info) noexcept {
+ return InstDB::alt_opcode_table[info->_alt_opcode_index];
+}
+
+static ASMJIT_INLINE bool is_mmx_or_xmm(const Reg& reg) noexcept {
+ return Support::bool_or(reg.reg_type() == RegType::kX86_Mm, reg.reg_type() == RegType::kVec128);
+}
+
+// x86::Assembler - X86BufferWriter
+// ================================
+
+class X86BufferWriter : public CodeWriter {
+public:
+ ASMJIT_INLINE explicit X86BufferWriter(Assembler* a) noexcept
+ : CodeWriter(a) {}
+
+ ASMJIT_INLINE void emit_pp(uint32_t opcode) noexcept {
+ uint32_t pp_index = (opcode >> Opcode::kPP_Shift) &
+ (Opcode::kPP_FPUMask >> Opcode::kPP_Shift) ;
+ emit8_if(opcode_pp_table[pp_index], pp_index != 0);
+ }
+
+ ASMJIT_INLINE void emit_mm_and_opcode(uint32_t opcode) noexcept {
+ uint32_t mm_index = (opcode & Opcode::kMM_Mask) >> Opcode::kMM_Shift;
+ const X86OpcodeMM& mm_code = opcode_mm_table[mm_index];
+
+ emit8_if(mm_code.data[0], mm_code.size > 0);
+ emit8_if(mm_code.data[1], mm_code.size > 1);
+ emit8(opcode);
+ }
+
+ ASMJIT_INLINE void emit_segment_override(uint32_t segment_id) noexcept {
+ ASMJIT_ASSERT(segment_id < ASMJIT_ARRAY_SIZE(segment_prefix_table));
+
+ FastUInt8 prefix = segment_prefix_table[segment_id];
+ emit8_if(prefix, prefix != 0);
+ }
+
+ template<typename CondT>
+ ASMJIT_INLINE void emit_address_override(CondT condition) noexcept {
+ emit8_if(0x67, condition);
+ }
+
+ ASMJIT_INLINE void emit_imm_byte_or_dword(uint64_t imm_value, FastUInt8 imm_size) noexcept {
+ if (!imm_size) {
+ return;
+ }
+
+ ASMJIT_ASSERT(imm_size == 1 || imm_size == 4);
+
+#if ASMJIT_ARCH_BITS >= 64
+ uint64_t imm = uint64_t(imm_value);
+#else
+ uint32_t imm = uint32_t(imm_value & 0xFFFFFFFFu);
+#endif
+
+ // Many instructions just use a single byte immediate, so make it fast.
+ emit8(imm & 0xFFu);
+ if (imm_size == 1) return;
+
+ imm >>= 8;
+ emit8(imm & 0xFFu);
+ imm >>= 8;
+ emit8(imm & 0xFFu);
+ imm >>= 8;
+ emit8(imm & 0xFFu);
+ }
+
+ ASMJIT_INLINE void emit_immediate(uint64_t imm_value, FastUInt8 imm_size) noexcept {
+#if ASMJIT_ARCH_BITS >= 64
+ uint64_t imm = imm_value;
+ if (imm_size >= 4) {
+ emit32u_le(imm & 0xFFFFFFFFu);
+ imm >>= 32;
+ imm_size = FastUInt8(imm_size - 4u);
+ }
+#else
+ uint32_t imm = uint32_t(imm_value & 0xFFFFFFFFu);
+ if (imm_size >= 4) {
+ emit32u_le(imm);
+ imm = uint32_t(imm_value >> 32);
+ imm_size = FastUInt8(imm_size - 4u);
+ }
+#endif
+
+ if (!imm_size) {
+ return;
+ }
+ emit8(imm & 0xFFu);
+ imm >>= 8;
+
+ if (--imm_size == 0) {
+ return;
+ }
+ emit8(imm & 0xFFu);
+ imm >>= 8;
+
+ if (--imm_size == 0) {
+ return;
+ }
+ emit8(imm & 0xFFu);
+ imm >>= 8;
+
+ if (--imm_size == 0) {
+ return;
+ }
+ emit8(imm & 0xFFu);
+ }
+};
+
+// If the operand is BPL|SPL|SIL|DIL|R8B-15B
+// - Force REX prefix
+// If the operand is AH|BH|CH|DH
+// - patch its index from 0..3 to 4..7 as encoded by X86.
+// - Disallow REX prefix.
+#define FIXUP_GPB(REG_OP, REG_ID) \
+ do { \
+ if (!static_cast<const Gp&>(REG_OP).is_gp8_hi()) { \
+ options |= (REG_ID) >= 4 ? InstOptions::kX86_Rex \
+ : InstOptions::kNone; \
+ } \
+ else { \
+ options |= InstOptions::kX86_InvalidRex; \
+ REG_ID += 4; \
+ } \
+ } while (0)
+
+#define ENC_OPS1(OP0) \
+ (uint32_t(OperandType::k##OP0))
+
+#define ENC_OPS2(OP0, OP1) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3))
+
+#define ENC_OPS3(OP0, OP1, OP2) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6))
+
+#define ENC_OPS4(OP0, OP1, OP2, OP3) \
+ (uint32_t(OperandType::k##OP0) + \
+ (uint32_t(OperandType::k##OP1) << 3) + \
+ (uint32_t(OperandType::k##OP2) << 6) + \
+ (uint32_t(OperandType::k##OP3) << 9))
+
+// x86::Assembler - Movabs Heuristics
+// ==================================
+
+static ASMJIT_INLINE uint32_t x86_get_movabs_inst_size_64bit(uint32_t register_size, InstOptions options, const Mem& rm_rel) noexcept {
+ uint32_t segment_prefix_size = rm_rel.segment_id() != 0;
+ uint32_t _66h_prefix_size = register_size == 2;
+ uint32_t rex_prefix_size = register_size == 8 || Support::test(options, InstOptions::kX86_Rex);
+ uint32_t opcode_byte_size = 1;
+ uint32_t immediate_size = 8;
+
+ return segment_prefix_size + _66h_prefix_size + rex_prefix_size + opcode_byte_size + immediate_size;
+}
+
+static ASMJIT_INLINE bool x86_should_use_movabs(Assembler* self, X86BufferWriter& writer, uint32_t register_size, InstOptions options, const Mem& rm_rel) noexcept {
+ if (self->is_32bit()) {
+ // There is no relative addressing, just decide whether to use MOV encoded with MOD R/M or absolute.
+ return !Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModRM);
+ }
+ else {
+ // If the addressing type is REL or MOD R/M was specified then absolute mov won't be used.
+ if (rm_rel.addr_type() == Mem::AddrType::kRel || Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModRM)) {
+ return false;
+ }
+
+ int64_t addr_value = rm_rel.offset();
+ uint64_t base_address = self->code()->base_address();
+ uint64_t section_offset = self->_section->offset();
+
+ // If the address type is default, it means to basically check whether relative addressing is possible. However,
+ // this is only possible when the base address is known as relative encoding uses RIP+N.
+ if (rm_rel.addr_type() == Mem::AddrType::kDefault && !rm_rel.has_segment() &&
+ EmitterUtils::is_absolute_location(base_address, section_offset)) {
+ uint32_t instruction_size = x86_get_movabs_inst_size_64bit(register_size, options, rm_rel);
+ uint64_t virtual_offset = uint64_t(writer.offset_from(self->_buffer_data));
+ uint64_t rip64 = base_address + section_offset + virtual_offset + instruction_size;
+ uint64_t rel64 = uint64_t(addr_value) - rip64;
+
+ if (Support::is_int_n<32>(int64_t(rel64))) {
+ return false;
+ }
+ }
+ else {
+ if (Support::is_int_n<32>(addr_value)) {
+ return false;
+ }
+ }
+
+ return uint64_t(addr_value) > 0xFFFFFFFFu;
+ }
+}
+
+// x86::Assembler - Construction & Destruction
+// ===========================================
+
+Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
+ _arch_mask = (uint64_t(1) << uint32_t(Arch::kX86)) |
+ (uint64_t(1) << uint32_t(Arch::kX64)) ;
+ init_emitter_funcs(this);
+
+ if (code) {
+ code->attach(this);
+ }
+}
+Assembler::~Assembler() noexcept {}
+
+// x86::Assembler - Emit (Low-Level)
+// =================================
+
+ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) {
+ constexpr uint32_t kVSHR_W = Opcode::kW_Shift - 23;
+ constexpr uint32_t kVSHR_PP = Opcode::kPP_Shift - 16;
+ constexpr uint32_t kVSHR_PP_EW = Opcode::kPP_Shift - 16;
+
+ constexpr InstOptions kRequiresSpecialHandling =
+ InstOptions::kReserved | // Logging/Validation/Error.
+ InstOptions::kX86_Rep | // REP/REPE prefix.
+ InstOptions::kX86_Repne | // REPNE prefix.
+ InstOptions::kX86_Lock | // LOCK prefix.
+ InstOptions::kX86_XAcquire | // XACQUIRE prefix.
+ InstOptions::kX86_XRelease ; // XRELEASE prefix.
+
+ Error err;
+
+ Opcode opcode; // Instruction opcode.
+ InstOptions options; // Instruction options.
+ uint32_t isign3; // A combined signature of first 3 operands.
+
+ const Operand_* rm_rel; // Memory operand or operand that holds Label|Imm.
+ uint32_t rm_info; // Memory operand's info based on mem_info_table.
+ uint32_t rb_reg = 0; // Memory base or modRM register.
+ uint32_t rx_reg; // Memory index register.
+ uint32_t op_reg; // ModR/M opcode or register id.
+
+ LabelEntry* label; // Label entry.
+ RelocEntry* re = nullptr; // Relocation entry.
+ int32_t rel_offset; // Relative offset
+ FastUInt8 rel_size = 0; // Relative size.
+ uint8_t* mem_op_ao_mark = nullptr; // Marker that points before 'address-override prefix' is emitted.
+
+ int64_t imm_value = 0; // Immediate value (must be 64-bit).
+ FastUInt8 imm_size = 0; // Immediate size.
+
+ X86BufferWriter writer(this);
+
+ if (inst_id >= Inst::_kIdCount) {
+ inst_id = 0;
+ }
+
+ const InstDB::InstInfo* inst_info = &InstDB::_inst_info_table[inst_id];
+ const InstDB::CommonInfo* common_info = &inst_info->common_info();
+
+ // Signature of the first 3 operands.
+ isign3 = (uint32_t(o0.op_type()) ) +
+ (uint32_t(o1.op_type()) << 3) +
+ (uint32_t(o2.op_type()) << 6);
+
+ // Combine all instruction options and also check whether the instruction is valid. All options
+ // that require special handling (including invalid instruction) are handled by the next branch.
+ options = InstOptions((inst_id == 0) | ((size_t)(_buffer_end - writer.cursor()) < 16)) | inst_options() | forced_inst_options();
+
+ // Handle failure and rare cases first.
+ if (ASMJIT_UNLIKELY(Support::test(options, kRequiresSpecialHandling))) {
+ if (ASMJIT_UNLIKELY(!_code)) {
+ return report_error(make_error(Error::kNotInitialized));
+ }
+
+ // Unknown instruction.
+ if (ASMJIT_UNLIKELY(inst_id == 0)) {
+ goto InvalidInstruction;
+ }
+
+ // Grow request, happens rarely.
+ err = writer.ensure_space(this, 16);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+
+#ifndef ASMJIT_NO_INTROSPECTION
+ // Strict validation.
+ if (has_diagnostic_option(DiagnosticOptions::kValidateAssembler)) {
+ Operand_ op_array[Globals::kMaxOpCount];
+ EmitterUtils::op_array_from_emit_args(op_array, o0, o1, o2, op_ext);
+
+ err = _funcs.validate(BaseInst(inst_id, options, _extra_reg), op_array, Globals::kMaxOpCount, ValidationFlags::kNone);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+ }
+#endif
+
+ InstDB::InstFlags inst_flags = inst_info->flags();
+
+ // LOCK, XACQUIRE, and XRELEASE prefixes.
+ if (Support::test(options, InstOptions::kX86_Lock)) {
+ bool is_xacq_xrel = Support::test(options, InstOptions::kX86_XAcquire | InstOptions::kX86_XRelease);
+
+ if (ASMJIT_UNLIKELY(!Support::test(inst_flags, InstDB::InstFlags::kLock) && !is_xacq_xrel)) {
+ goto InvalidLockPrefix;
+ }
+
+ if (is_xacq_xrel) {
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XAcquire) && !Support::test(inst_flags, InstDB::InstFlags::kXAcquire))) {
+ goto InvalidXAcquirePrefix;
+ }
+
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XRelease) && !Support::test(inst_flags, InstDB::InstFlags::kXRelease))) {
+ goto InvalidXReleasePrefix;
+ }
+
+ writer.emit8(Support::test(options, InstOptions::kX86_XAcquire) ? 0xF2u : 0xF3u);
+ }
+
+ writer.emit8(0xF0);
+ }
+
+ // REP and REPNE prefixes.
+ if (Support::test(options, InstOptions::kX86_Rep | InstOptions::kX86_Repne)) {
+ if (ASMJIT_UNLIKELY(!Support::test(inst_flags, InstDB::InstFlags::kRep))) {
+ goto InvalidRepPrefix;
+ }
+
+ if (ASMJIT_UNLIKELY(_extra_reg.is_reg() && (_extra_reg.group() != RegGroup::kGp || _extra_reg.id() != Gp::kIdCx))) {
+ goto InvalidRepPrefix;
+ }
+
+ writer.emit8(Support::test(options, InstOptions::kX86_Repne) ? 0xF2 : 0xF3);
+ }
+ }
+
+ // This sequence seems to be the fastest.
+ opcode = InstDB::main_opcode_table[inst_info->_main_opcode_index];
+ op_reg = opcode.extract_mod_o();
+ opcode |= inst_info->_main_opcode_value;
+
+ // Encoding Scope
+ // --------------
+
+ // How it works? Each case here represents a unique encoding of a group of instructions, which is handled
+ // separately. The handlers check instruction signature, possibly register types, etc, and process this
+ // information by writing some bits to opcode, op_reg/rb_reg, imm_value/imm_size, etc, and then at the end of
+ // the sequence it uses goto to jump into a lower level handler, that actually encodes the instruction.
+
+ switch (inst_info->_encoding) {
+ case InstDB::kEncodingNone:
+ goto EmitDone;
+
+ // Base Instructions
+ // -----------------
+
+ case InstDB::kEncodingX86Op:
+ goto EmitX86Op;
+
+ case InstDB::kEncodingX86Op_Mod11RM:
+ rb_reg = opcode.extract_mod_rm();
+ goto EmitX86R;
+
+ case InstDB::kEncodingX86Op_Mod11RM_I8:
+ // The first operand must be immediate, we don't care of other operands as they could be implicit.
+ if (!o0.is_imm())
+ goto InvalidInstruction;
+
+ rb_reg = opcode.extract_mod_rm();
+ imm_value = o0.as<Imm>().value_as<uint8_t>();
+ imm_size = 1;
+ goto EmitX86R;
+
+ case InstDB::kEncodingX86Op_xAddr:
+ if (ASMJIT_UNLIKELY(!o0.is_reg()))
+ goto InvalidInstruction;
+
+ rm_info = mem_info_table[size_t(o0.as<Reg>().reg_type())];
+ writer.emit_address_override((rm_info & _address_override_mask()) != 0);
+ goto EmitX86Op;
+
+ case InstDB::kEncodingX86Op_xAX:
+ if (isign3 == 0)
+ goto EmitX86Op;
+
+ if (isign3 == ENC_OPS1(Reg) && o0.id() == Gp::kIdAx)
+ goto EmitX86Op;
+ break;
+
+ case InstDB::kEncodingX86Op_xDX_xAX:
+ if (isign3 == 0)
+ goto EmitX86Op;
+
+ if (isign3 == ENC_OPS2(Reg, Reg) && o0.id() == Gp::kIdDx && o1.id() == Gp::kIdAx)
+ goto EmitX86Op;
+ break;
+
+ case InstDB::kEncodingX86Op_MemZAX:
+ if (isign3 == 0)
+ goto EmitX86Op;
+
+ rm_rel = &o0;
+ if (isign3 == ENC_OPS1(Mem) && is_implicit_mem(o0, Gp::kIdAx))
+ goto EmitX86OpImplicitMem;
+
+ break;
+
+ case InstDB::kEncodingX86I_xAX:
+ // Implicit form.
+ if (isign3 == ENC_OPS1(Imm)) {
+ imm_value = o0.as<Imm>().value_as<uint8_t>();
+ imm_size = 1;
+ goto EmitX86Op;
+ }
+
+ // Explicit form.
+ if (isign3 == ENC_OPS2(Reg, Imm) && o0.id() == Gp::kIdAx) {
+ imm_value = o1.as<Imm>().value_as<uint8_t>();
+ imm_size = 1;
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86M_NoMemSize:
+ if (o0.is_reg())
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ goto CaseX86M_NoSize;
+
+ case InstDB::kEncodingX86M:
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86M_NoSize:
+CaseX86M_NoSize:
+ rb_reg = o0.id();
+ if (isign3 == ENC_OPS1(Reg))
+ goto EmitX86R;
+
+ rm_rel = &o0;
+ if (isign3 == ENC_OPS1(Mem))
+ goto EmitX86M;
+ break;
+
+ case InstDB::kEncodingX86M_GPB_MulDiv:
+CaseX86M_GPB_MulDiv:
+ // Explicit form?
+ if (isign3 > 0x7) {
+ // [AX] <- [AX] div|mul r8.
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(!o0.is_gp16(Gp::kIdAx) || !o1.is_gp8()))
+ goto InvalidInstruction;
+
+ rb_reg = o1.id();
+ FIXUP_GPB(o1, rb_reg);
+ goto EmitX86R;
+ }
+
+ // [AX] <- [AX] div|mul m8.
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ if (ASMJIT_UNLIKELY(!o0.is_gp16(Gp::kIdAx)))
+ goto InvalidInstruction;
+
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+
+ // [?DX:?AX] <- [?DX:?AX] div|mul r16|r32|r64
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() != o1.x86_rm_size()))
+ goto InvalidInstruction;
+
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rb_reg = o2.id();
+ goto EmitX86R;
+ }
+
+ // [?DX:?AX] <- [?DX:?AX] div|mul m16|m32|m64
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() != o1.x86_rm_size()))
+ goto InvalidInstruction;
+
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rm_rel = &o2;
+ goto EmitX86M;
+ }
+
+ goto InvalidInstruction;
+ }
+
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86M_GPB:
+ if (isign3 == ENC_OPS1(Reg)) {
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rb_reg = o0.id();
+
+ if (o0.x86_rm_size() != 1)
+ goto EmitX86R;
+
+ FIXUP_GPB(o0, rb_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() == 0))
+ goto AmbiguousOperandSize;
+
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86M_Only_EDX_EAX:
+ if (isign3 == ENC_OPS3(Mem, Reg, Reg) && o1.is_gp32(Gp::kIdDx) && o2.is_gp32(Gp::kIdAx)) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86M_Only:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86M_Nop:
+ if (isign3 == ENC_OPS1(None))
+ goto EmitX86Op;
+
+ // Single operand NOP instruction "0F 1F /0".
+ opcode = Opcode::k000F00 | 0x1F;
+ op_reg = 0;
+
+ if (isign3 == ENC_OPS1(Reg)) {
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+
+ // Two operand NOP instruction "0F 1F /r".
+ op_reg = o1.id();
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86R_FromM:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ rb_reg = o0.id();
+ goto EmitX86RFromM;
+ }
+ break;
+
+ case InstDB::kEncodingX86R32_EDX_EAX:
+ // Explicit form: R32, EDX, EAX.
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (!o1.is_gp32(Gp::kIdDx) || !o2.is_gp32(Gp::kIdAx))
+ goto InvalidInstruction;
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ // Implicit form: R32.
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (!o0.is_gp32())
+ goto InvalidInstruction;
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+ break;
+
+ case InstDB::kEncodingX86R_Native:
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+ break;
+
+ case InstDB::kEncodingX86Rm:
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86Rm_NoSize:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Rm_Raw66H:
+ // We normally emit either [66|F2|F3], this instruction requires 66+[F2|F3].
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ if (o0.x86_rm_size() == 2)
+ writer.emit8(0x66);
+ else
+ opcode.add_w_by_size(o0.x86_rm_size());
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ if (o0.x86_rm_size() == 2)
+ writer.emit8(0x66);
+ else
+ opcode.add_w_by_size(o0.x86_rm_size());
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Mr:
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86Mr_NoSize:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ rb_reg = o0.id();
+ op_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ rm_rel = &o0;
+ op_reg = o1.id();
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Arith:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ opcode.add_arith_by_size(o0.x86_rm_size());
+
+ if (o0.x86_rm_size() != o1.x86_rm_size())
+ goto OperandSizeMismatch;
+
+ rb_reg = o0.id();
+ op_reg = o1.id();
+
+ if (o0.x86_rm_size() == 1) {
+ FIXUP_GPB(o0, rb_reg);
+ FIXUP_GPB(o1, op_reg);
+ }
+
+ // MOD/MR: The default encoding used if not instructed otherwise..
+ if (!Support::test(options, InstOptions::kX86_ModRM))
+ goto EmitX86R;
+
+ // MOD/RM: Alternative encoding selected via instruction options.
+ opcode += 2u;
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode += 2u;
+ opcode.add_arith_by_size(o0.x86_rm_size());
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ if (o0.x86_rm_size() != 1)
+ goto EmitX86M;
+
+ FIXUP_GPB(o0, op_reg);
+ goto EmitX86M;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add_arith_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ if (o1.x86_rm_size() != 1)
+ goto EmitX86M;
+
+ FIXUP_GPB(o1, op_reg);
+ goto EmitX86M;
+ }
+
+ // The remaining instructions use 0x80 opcode.
+ opcode = 0x80;
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ uint32_t size = o0.x86_rm_size();
+
+ rb_reg = o0.id();
+ imm_value = o1.as<Imm>().value();
+
+ if (size == 1) {
+ FIXUP_GPB(o0, rb_reg);
+ imm_size = 1;
+ }
+ else {
+ if (size == 2) {
+ opcode |= Opcode::kPP_66;
+ }
+ else if (size == 4) {
+ // Sign extend so is_int_n<8> returns the right result.
+ imm_value = sign_extend_int32<int64_t>(imm_value);
+ }
+ else if (size == 8) {
+ bool can_transform_to_32bit = inst_id == Inst::kIdAnd && Support::is_uint_n<32>(imm_value);
+
+ if (!Support::is_int_n<32>(imm_value)) {
+ // We would do this by default when `kOptionOptimizedForSize` is
+ // enabled, however, in this case we just force this as otherwise
+ // we would have to fail.
+ if (can_transform_to_32bit)
+ size = 4;
+ else
+ goto InvalidImmediate;
+ }
+ else if (can_transform_to_32bit && has_encoding_option(EncodingOptions::kOptimizeForSize)) {
+ size = 4;
+ }
+
+ opcode.add_w_by_size(size);
+ }
+
+ imm_size = FastUInt8(Support::min<uint32_t>(size, 4));
+ if (Support::is_int_n<8>(imm_value) && !Support::test(options, InstOptions::kLongForm))
+ imm_size = 1;
+ }
+
+ // Short form - AL, AX, EAX, RAX.
+ if (rb_reg == 0 && (size == 1 || imm_size != 1) && !Support::test(options, InstOptions::kLongForm)) {
+ opcode &= Opcode::kPP_66 | Opcode::kW;
+ opcode |= ((op_reg << 3) | (0x04 + (size != 1)));
+ imm_size = FastUInt8(Support::min<uint32_t>(size, 4));
+ goto EmitX86Op;
+ }
+
+ opcode += size != 1 ? (imm_size != 1 ? 1u : 3u) : 0u;
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Imm)) {
+ uint32_t mem_size = o0.x86_rm_size();
+
+ if (ASMJIT_UNLIKELY(mem_size == 0))
+ goto AmbiguousOperandSize;
+
+ imm_value = o1.as<Imm>().value();
+ imm_size = FastUInt8(Support::min<uint32_t>(mem_size, 4));
+
+ // Sign extend so is_int_n<8> returns the right result.
+ if (mem_size == 4)
+ imm_value = sign_extend_int32<int64_t>(imm_value);
+
+ if (Support::is_int_n<8>(imm_value) && !Support::test(options, InstOptions::kLongForm))
+ imm_size = 1;
+
+ opcode += mem_size != 1 ? (imm_size != 1 ? 1u : 3u) : 0u;
+ opcode.add_prefix_by_size(mem_size);
+
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Bswap:
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() == 1))
+ goto InvalidInstruction;
+
+ op_reg = o0.id();
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ goto EmitX86OpReg;
+ }
+ break;
+
+ case InstDB::kEncodingX86Bt:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+
+ // The remaining instructions use the secondary opcode/r.
+ imm_value = o1.as<Imm>().value();
+ imm_size = 1;
+
+ opcode = alt_opcode_of(inst_info);
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg = opcode.extract_mod_o();
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Imm)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() == 0))
+ goto AmbiguousOperandSize;
+
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Call:
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ rm_rel = &o0;
+ if (isign3 == ENC_OPS1(Mem))
+ goto EmitX86M;
+
+ // Call with 32-bit displacement use 0xE8 opcode. Call with 8-bit displacement is not encodable so the
+ // alternative opcode field in X86DB must be zero.
+ opcode = 0xE8;
+ op_reg = 0;
+ goto EmitJmpCall;
+
+ case InstDB::kEncodingX86Cmpxchg: {
+ // Convert explicit to implicit.
+ if (isign3 & (0x7 << 6)) {
+ if (!o2.is_gp() || o2.id() != Gp::kIdAx) {
+ goto InvalidInstruction;
+ }
+ isign3 &= 0x3F;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (o0.x86_rm_size() != o1.x86_rm_size())
+ goto OperandSizeMismatch;
+
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rb_reg = o0.id();
+ op_reg = o1.id();
+
+ if (o0.x86_rm_size() != 1)
+ goto EmitX86R;
+
+ FIXUP_GPB(o0, rb_reg);
+ FIXUP_GPB(o1, op_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add_arith_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ if (o1.x86_rm_size() != 1)
+ goto EmitX86M;
+
+ FIXUP_GPB(o1, op_reg);
+ goto EmitX86M;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingX86Cmpxchg8b_16b: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const Operand_& o4 = op_ext[EmitterUtils::kOp4];
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
+ if (o3.is_reg() && o4.is_reg()) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingX86Crc:
+ op_reg = o0.id();
+ opcode.add_w_by_size(o0.x86_rm_size());
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ rb_reg = o1.id();
+
+ if (o1.x86_rm_size() == 1) {
+ FIXUP_GPB(o1, rb_reg);
+ goto EmitX86R;
+ }
+ else {
+ // This seems to be the only exception of encoding '66F2' prefix.
+ if (o1.x86_rm_size() == 2) writer.emit8(0x66);
+
+ opcode.add(1);
+ goto EmitX86R;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ rm_rel = &o1;
+ if (o1.x86_rm_size() == 0)
+ goto AmbiguousOperandSize;
+
+ // This seems to be the only exception of encoding '66F2' prefix.
+ if (o1.x86_rm_size() == 2) writer.emit8(0x66);
+
+ opcode += uint32_t(o1.x86_rm_size() != 1u);
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Enter:
+ if (isign3 == ENC_OPS2(Imm, Imm)) {
+ uint32_t iw = o0.as<Imm>().value_as<uint16_t>();
+ uint32_t ib = o1.as<Imm>().value_as<uint8_t>();
+
+ imm_value = iw | (ib << 16);
+ imm_size = 3;
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86Imul:
+ // First process all forms distinct of `kEncodingX86M_OptB_MulDiv`.
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode = 0x6B;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (!Support::is_int_n<8>(imm_value) || Support::test(options, InstOptions::kLongForm)) {
+ opcode -= 2;
+ imm_size = o0.x86_rm_size() == 2 ? 2 : 4;
+ }
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ opcode = 0x6B;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ // Sign extend so is_int_n<8> returns the right result.
+ if (o0.x86_rm_size() == 4)
+ imm_value = sign_extend_int32<int64_t>(imm_value);
+
+ if (!Support::is_int_n<8>(imm_value) || Support::test(options, InstOptions::kLongForm)) {
+ opcode -= 2;
+ imm_size = o0.x86_rm_size() == 2 ? 2 : 4;
+ }
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ goto EmitX86M;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ // Must be explicit 'ax, r8' form.
+ if (o1.x86_rm_size() == 1)
+ goto CaseX86M_GPB_MulDiv;
+
+ if (o0.x86_rm_size() != o1.x86_rm_size())
+ goto OperandSizeMismatch;
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ opcode = Opcode::k000F00 | 0xAF;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ // Must be explicit 'ax, m8' form.
+ if (o1.x86_rm_size() == 1)
+ goto CaseX86M_GPB_MulDiv;
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ opcode = Opcode::k000F00 | 0xAF;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ goto EmitX86M;
+ }
+
+ // Shorthand to imul 'reg, reg, imm'.
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ opcode = 0x6B;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+
+ imm_value = o1.as<Imm>().value();
+ imm_size = 1;
+
+ // Sign extend so is_int_n<8> returns the right result.
+ if (o0.x86_rm_size() == 4)
+ imm_value = sign_extend_int32<int64_t>(imm_value);
+
+ if (!Support::is_int_n<8>(imm_value) || Support::test(options, InstOptions::kLongForm)) {
+ opcode -= 2;
+ imm_size = o0.x86_rm_size() == 2 ? 2 : 4;
+ }
+
+ op_reg = rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ // Try implicit form.
+ goto CaseX86M_GPB_MulDiv;
+
+ case InstDB::kEncodingX86In:
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx))
+ goto InvalidInstruction;
+
+ imm_value = o1.as<Imm>().value_as<uint8_t>();
+ imm_size = 1;
+
+ opcode = alt_opcode_of(inst_info) + (o0.x86_rm_size() != 1);
+ opcode.add_66h_by_size(o0.x86_rm_size());
+ goto EmitX86Op;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx || o1.id() != Gp::kIdDx))
+ goto InvalidInstruction;
+
+ opcode += uint32_t(o0.x86_rm_size() != 1u);
+ opcode.add_66h_by_size(o0.x86_rm_size());
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86Ins:
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ if (ASMJIT_UNLIKELY(!is_implicit_mem(o0, Gp::kIdDi) || o1.id() != Gp::kIdDx))
+ goto InvalidInstruction;
+
+ uint32_t size = o0.x86_rm_size();
+ if (ASMJIT_UNLIKELY(size == 0))
+ goto AmbiguousOperandSize;
+
+ rm_rel = &o0;
+ opcode += uint32_t(size != 1u);
+
+ opcode.add_66h_by_size(size);
+ goto EmitX86OpImplicitMem;
+ }
+ break;
+
+ case InstDB::kEncodingX86IncDec:
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+
+ if (o0.x86_rm_size() == 1) {
+ FIXUP_GPB(o0, rb_reg);
+ goto EmitX86R;
+ }
+
+ if (is_32bit()) {
+ // INC r16|r32 is only encodable in 32-bit mode (collides with REX).
+ opcode = alt_opcode_of(inst_info) + (rb_reg & 0x07);
+ opcode.add_66h_by_size(o0.x86_rm_size());
+ goto EmitX86Op;
+ }
+ else {
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ goto EmitX86R;
+ }
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ if (!o0.x86_rm_size())
+ goto AmbiguousOperandSize;
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Int:
+ if (isign3 == ENC_OPS1(Imm)) {
+ imm_value = o0.as<Imm>().value();
+ imm_size = 1;
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86Jcc:
+ if (Support::test(options, InstOptions::kTaken | InstOptions::kNotTaken) && has_encoding_option(EncodingOptions::kPredictedJumps)) {
+ uint8_t prefix = Support::test(options, InstOptions::kTaken) ? uint8_t(0x3E) : uint8_t(0x2E);
+ writer.emit8(prefix);
+ }
+
+ rm_rel = &o0;
+ op_reg = 0;
+ goto EmitJmpCall;
+
+ case InstDB::kEncodingX86JecxzLoop:
+ rm_rel = &o0;
+ // Explicit jecxz|loop [r|e]cx, dst
+ if (o0.is_reg()) {
+ if (ASMJIT_UNLIKELY(!o0.is_gp(Gp::kIdCx))) {
+ goto InvalidInstruction;
+ }
+
+ writer.emit_address_override((is_32bit() && o0.x86_rm_size() == 2) || (is_64bit() && o0.x86_rm_size() == 4));
+ rm_rel = &o1;
+ }
+
+ op_reg = 0;
+ goto EmitJmpCall;
+
+ case InstDB::kEncodingX86Jmp:
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ rm_rel = &o0;
+ if (isign3 == ENC_OPS1(Mem))
+ goto EmitX86M;
+
+ // Jump encoded with 32-bit displacement use 0xE9 opcode. Jump encoded with 8-bit displacement's opcode is
+ // stored as an alternative opcode.
+ opcode = 0xE9;
+ op_reg = 0;
+ goto EmitJmpCall;
+
+ case InstDB::kEncodingX86JmpRel:
+ rm_rel = &o0;
+ goto EmitJmpCall;
+
+ case InstDB::kEncodingX86LcallLjmp:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ uint32_t mem_size = rm_rel->as<Mem>().size();
+ if (mem_size == 0) {
+ mem_size = register_size();
+ }
+ else {
+ mem_size -= 2;
+ if (mem_size != 2 && mem_size != 4 && mem_size != register_size())
+ goto InvalidAddress;
+ }
+ opcode.add_prefix_by_size(mem_size);
+ goto EmitX86M;
+ }
+
+ if (isign3 == ENC_OPS2(Imm, Imm)) {
+ if (!is_32bit())
+ goto InvalidInstruction;
+
+ const Imm& imm0 = o0.as<Imm>();
+ const Imm& imm1 = o1.as<Imm>();
+
+ if (imm0.value() > 0xFFFFu || imm1.value() > 0xFFFFFFFFu)
+ goto InvalidImmediate;
+
+ opcode = alt_opcode_of(inst_info);
+ imm_value = imm1.value() | (imm0.value() << 32);
+ imm_size = 6;
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86Lea:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Mov:
+ // Reg <- Reg
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ // Asmjit uses segment registers indexed from 1 to 6, leaving zero as "no segment register used". We have to
+ // fix this (decrement the index of the register) when emitting MOV instructions which move to/from a segment
+ // register. The segment register is always `op_reg`, because the MOV instruction uses either RM or MR encoding.
+
+ // GP <- ??
+ if (o0.as<Reg>().is_gp()) {
+ rb_reg = o0.id();
+ op_reg = o1.id();
+
+ // GP <- GP
+ if (o1.as<Reg>().is_gp()) {
+ uint32_t op_size = o0.x86_rm_size();
+ if (op_size != o1.x86_rm_size())
+ goto InvalidInstruction;
+
+ if (op_size == 1) {
+ FIXUP_GPB(o0, rb_reg);
+ FIXUP_GPB(o1, op_reg);
+ opcode = 0x88;
+
+ if (!Support::test(options, InstOptions::kX86_ModRM))
+ goto EmitX86R;
+
+ opcode += 2u;
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+ else {
+ opcode = 0x89;
+ opcode.add_prefix_by_size(op_size);
+
+ if (!Support::test(options, InstOptions::kX86_ModRM))
+ goto EmitX86R;
+
+ opcode += 2u;
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+ }
+
+ // GP <- SReg
+ if (o1.is_segment_reg()) {
+ opcode = 0x8C;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg--;
+ goto EmitX86R;
+ }
+
+ // GP <- CReg
+ if (o1.is_control_reg()) {
+ opcode = Opcode::k000F00 | 0x20;
+
+ // Use `LOCK MOV` in 32-bit mode if CR8+ register is accessed (AMD extension).
+ if ((op_reg & 0x8) && is_32bit()) {
+ writer.emit8(0xF0);
+ op_reg &= 0x7;
+ }
+ goto EmitX86R;
+ }
+
+ // GP <- DReg
+ if (o1.is_debug_reg()) {
+ opcode = Opcode::k000F00 | 0x21;
+ goto EmitX86R;
+ }
+ }
+ else {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ // ?? <- GP
+ if (!o1.as<Reg>().is_gp())
+ goto InvalidInstruction;
+
+ // SReg <- GP
+ if (o0.is_segment_reg()) {
+ opcode = 0x8E;
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg--;
+ goto EmitX86R;
+ }
+
+ // CReg <- GP
+ if (o0.is_control_reg()) {
+ opcode = Opcode::k000F00 | 0x22;
+
+ // Use `LOCK MOV` in 32-bit mode if CR8+ register is accessed (AMD extension).
+ if ((op_reg & 0x8) && is_32bit()) {
+ writer.emit8(0xF0);
+ op_reg &= 0x7;
+ }
+ goto EmitX86R;
+ }
+
+ // DReg <- GP
+ if (o0.is_debug_reg()) {
+ opcode = Opcode::k000F00 | 0x23;
+ goto EmitX86R;
+ }
+ }
+
+ goto InvalidInstruction;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ // SReg <- Mem
+ if (o0.is_segment_reg()) {
+ opcode = 0x8E;
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg--;
+ goto EmitX86M;
+ }
+ // Reg <- Mem
+ else {
+ opcode = 0;
+ opcode.add_arith_by_size(o0.x86_rm_size());
+
+ // Handle a special form of `mov al|ax|eax|rax, [ptr64]` that doesn't use MOD.
+ if (op_reg == Gp::kIdAx && !rm_rel->as<Mem>().has_base_or_index()) {
+ if (x86_should_use_movabs(this, writer, o0.x86_rm_size(), options, rm_rel->as<Mem>())) {
+ opcode += 0xA0u;
+ imm_value = rm_rel->as<Mem>().offset();
+ goto EmitX86OpMovAbs;
+ }
+ }
+
+ if (o0.x86_rm_size() == 1)
+ FIXUP_GPB(o0, op_reg);
+
+ opcode += 0x8Au;
+ goto EmitX86M;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ // Mem <- SReg
+ if (o1.is_segment_reg()) {
+ opcode = 0x8C;
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg--;
+ goto EmitX86M;
+ }
+ // Mem <- Reg
+ else {
+ opcode = 0;
+ opcode.add_arith_by_size(o1.x86_rm_size());
+
+ // Handle a special form of `mov [ptr64], al|ax|eax|rax` that doesn't use MOD.
+ if (op_reg == Gp::kIdAx && !rm_rel->as<Mem>().has_base_or_index()) {
+ if (x86_should_use_movabs(this, writer, o1.x86_rm_size(), options, rm_rel->as<Mem>())) {
+ opcode += 0xA2u;
+ imm_value = rm_rel->as<Mem>().offset();
+ goto EmitX86OpMovAbs;
+ }
+ }
+
+ if (o1.x86_rm_size() == 1)
+ FIXUP_GPB(o1, op_reg);
+
+ opcode += 0x88u;
+ goto EmitX86M;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ op_reg = o0.id();
+ imm_size = FastUInt8(o0.x86_rm_size());
+
+ if (imm_size == 1) {
+ FIXUP_GPB(o0, op_reg);
+
+ opcode = 0xB0;
+ imm_value = o1.as<Imm>().value_as<uint8_t>();
+ goto EmitX86OpReg;
+ }
+ else {
+ // 64-bit immediate in 64-bit mode is allowed.
+ imm_value = o1.as<Imm>().value();
+
+ // Optimize the instruction size by using a 32-bit immediate if possible.
+ if (imm_size == 8 && !Support::test(options, InstOptions::kLongForm)) {
+ if (Support::is_uint_n<32>(imm_value) && has_encoding_option(EncodingOptions::kOptimizeForSize)) {
+ // Zero-extend by using a 32-bit GPD destination instead of a 64-bit GPQ.
+ imm_size = 4;
+ }
+ else if (Support::is_int_n<32>(imm_value)) {
+ // Sign-extend, uses 'C7 /0' opcode.
+ rb_reg = op_reg;
+
+ opcode = Opcode::kW | 0xC7;
+ op_reg = 0;
+
+ imm_size = 4;
+ goto EmitX86R;
+ }
+ }
+
+ opcode = 0xB8;
+ opcode.add_prefix_by_size(imm_size);
+ goto EmitX86OpReg;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Imm)) {
+ uint32_t mem_size = o0.x86_rm_size();
+ if (ASMJIT_UNLIKELY(mem_size == 0))
+ goto AmbiguousOperandSize;
+
+ opcode = 0xC6 + (mem_size != 1);
+ opcode.add_prefix_by_size(mem_size);
+ op_reg = 0;
+ rm_rel = &o0;
+
+ imm_value = o1.as<Imm>().value();
+ imm_size = FastUInt8(Support::min<uint32_t>(mem_size, 4));
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Movabs:
+ // Reg <- Mem
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ opcode = 0xA0;
+ opcode.add_arith_by_size(o0.x86_rm_size());
+
+ if (ASMJIT_UNLIKELY(!o0.as<Reg>().is_gp()) || op_reg != Gp::kIdAx)
+ goto InvalidInstruction;
+
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().has_base_or_index()))
+ goto InvalidAddress;
+
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().addr_type() == Mem::AddrType::kRel))
+ goto InvalidAddress;
+
+ imm_value = rm_rel->as<Mem>().offset();
+ goto EmitX86OpMovAbs;
+ }
+
+ // Mem <- Reg
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ opcode = 0xA2;
+ opcode.add_arith_by_size(o1.x86_rm_size());
+
+ if (ASMJIT_UNLIKELY(!o1.as<Reg>().is_gp()) || op_reg != Gp::kIdAx)
+ goto InvalidInstruction;
+
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().has_base_or_index()))
+ goto InvalidAddress;
+
+ imm_value = rm_rel->as<Mem>().offset();
+ goto EmitX86OpMovAbs;
+ }
+
+ // Reg <- Imm.
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ if (ASMJIT_UNLIKELY(!o0.is_gp64()))
+ goto InvalidInstruction;
+
+ op_reg = o0.id();
+ opcode = 0xB8;
+
+ imm_size = 8;
+ imm_value = o1.as<Imm>().value();
+
+ opcode.add_prefix_by_size(8);
+ goto EmitX86OpReg;
+ }
+ break;
+
+ case InstDB::kEncodingX86MovsxMovzx:
+ opcode.add(o1.x86_rm_size() != 1);
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ if (o1.x86_rm_size() != 1)
+ goto EmitX86R;
+
+ FIXUP_GPB(o1, rb_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86MovntiMovdiri:
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add_w_if(o1.is_gp64());
+
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86EnqcmdMovdir64b:
+ if (isign3 == ENC_OPS2(Mem, Mem)) {
+ const Mem& m0 = o0.as<Mem>();
+ // This is the only required validation, the rest is handled afterwards.
+ if (ASMJIT_UNLIKELY(m0.base_type() != o1.as<Mem>().base_type() ||
+ m0.has_index() ||
+ m0.has_offset() ||
+ (m0.has_segment() && m0.segment_id() != SReg::kIdEs)))
+ goto InvalidInstruction;
+
+ // The first memory operand is passed via register, the second memory operand is RM.
+ op_reg = o0.as<Mem>().base_id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Out:
+ if (isign3 == ENC_OPS2(Imm, Reg)) {
+ if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdAx))
+ goto InvalidInstruction;
+
+ opcode = alt_opcode_of(inst_info) + (o1.x86_rm_size() != 1);
+ opcode.add_66h_by_size(o1.x86_rm_size());
+
+ imm_value = o0.as<Imm>().value_as<uint8_t>();
+ imm_size = 1;
+ goto EmitX86Op;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdDx || o1.id() != Gp::kIdAx))
+ goto InvalidInstruction;
+
+ opcode.add(o1.x86_rm_size() != 1);
+ opcode.add_66h_by_size(o1.x86_rm_size());
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86Outs:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdDx || !is_implicit_mem(o1, Gp::kIdSi)))
+ goto InvalidInstruction;
+
+ uint32_t size = o1.x86_rm_size();
+ if (ASMJIT_UNLIKELY(size == 0))
+ goto AmbiguousOperandSize;
+
+ rm_rel = &o1;
+ opcode.add(size != 1);
+ opcode.add_66h_by_size(size);
+ goto EmitX86OpImplicitMem;
+ }
+ break;
+
+ case InstDB::kEncodingX86Pushw:
+ if (isign3 == ENC_OPS1(Imm)) {
+ imm_value = o0.as<Imm>().value();
+ imm_size = 2;
+ opcode = 0x68u | Opcode::kPP_66;
+ goto EmitX86Op;
+ }
+ break;
+
+ case InstDB::kEncodingX86Push:
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (o0.is_segment_reg()) {
+ uint32_t segment = o0.id();
+ if (ASMJIT_UNLIKELY(segment >= SReg::kIdCount))
+ goto InvalidSegment;
+
+ opcode = opcode_push_sreg_table[segment];
+ goto EmitX86Op;
+ }
+ else {
+ goto CaseX86PushPop_Gp;
+ }
+ }
+
+ if (isign3 == ENC_OPS1(Imm)) {
+ imm_value = o0.as<Imm>().value();
+ imm_size = 4;
+
+ if (Support::is_int_n<8>(imm_value) && !Support::test(options, InstOptions::kLongForm))
+ imm_size = 1;
+
+ opcode = imm_size == 1 ? 0x6A : 0x68;
+ goto EmitX86Op;
+ }
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86Pop:
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (o0.is_segment_reg()) {
+ uint32_t segment = o0.id();
+ if (ASMJIT_UNLIKELY(segment == SReg::kIdCs || segment >= SReg::kIdCount))
+ goto InvalidSegment;
+
+ opcode = opcode_pop_sreg_table[segment];
+ goto EmitX86Op;
+ }
+ else {
+CaseX86PushPop_Gp:
+ // We allow 2 byte, 4 byte, and 8 byte register sizes, although PUSH and POP only allow 2 bytes or
+ // native size. On 64-bit we simply PUSH/POP 64-bit register even if 32-bit register was given.
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() < 2))
+ goto InvalidInstruction;
+
+ opcode = alt_opcode_of(inst_info);
+ opcode.add_66h_by_size(o0.x86_rm_size());
+ op_reg = o0.id();
+ goto EmitX86OpReg;
+ }
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() == 0))
+ goto AmbiguousOperandSize;
+
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() != 2 && o0.x86_rm_size() != register_size()))
+ goto InvalidInstruction;
+
+ opcode.add_66h_by_size(o0.x86_rm_size());
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Ret:
+ if (isign3 == 0) {
+ // 'ret' without immediate, change C2 to C3.
+ opcode.add(1);
+ goto EmitX86Op;
+ }
+
+ if (isign3 == ENC_OPS1(Imm)) {
+ imm_value = o0.as<Imm>().value();
+ if (imm_value == 0 && !Support::test(options, InstOptions::kLongForm)) {
+ // 'ret' without immediate, change C2 to C3.
+ opcode.add(1);
+ goto EmitX86Op;
+ }
+ else {
+ imm_size = 2;
+ goto EmitX86Op;
+ }
+ }
+ break;
+
+ case InstDB::kEncodingX86Rot:
+ if (o0.is_reg()) {
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rb_reg = o0.id();
+
+ if (o0.x86_rm_size() == 1)
+ FIXUP_GPB(o0, rb_reg);
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdCx))
+ goto InvalidInstruction;
+
+ opcode += 2u;
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ imm_value = o1.as<Imm>().value() & 0xFF;
+ imm_size = 0;
+
+ if (imm_value == 1 && !Support::test(options, InstOptions::kLongForm))
+ goto EmitX86R;
+
+ opcode -= 0x10;
+ imm_size = 1;
+ goto EmitX86R;
+ }
+ }
+ else {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() == 0))
+ goto AmbiguousOperandSize;
+ opcode.add_arith_by_size(o0.x86_rm_size());
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdCx))
+ goto InvalidInstruction;
+
+ opcode += 2u;
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Imm)) {
+ rm_rel = &o0;
+ imm_value = o1.as<Imm>().value() & 0xFF;
+ imm_size = 0;
+
+ if (imm_value == 1 && !Support::test(options, InstOptions::kLongForm))
+ goto EmitX86M;
+
+ opcode -= 0x10;
+ imm_size = 1;
+ goto EmitX86M;
+ }
+ }
+ break;
+
+ case InstDB::kEncodingX86Set:
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+ FIXUP_GPB(o0, rb_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86ShldShrd:
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg = o1.id();
+ rb_reg = o0.id();
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+ goto EmitX86M;
+ }
+
+ // The following instructions use opcode + 1.
+ opcode.add(1);
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(o2.id() != Gp::kIdCx))
+ goto InvalidInstruction;
+
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
+ if (ASMJIT_UNLIKELY(o2.id() != Gp::kIdCx))
+ goto InvalidInstruction;
+
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86StrRm:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ rm_rel = &o1;
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().offset_lo32() || !o0.as<Reg>().is_gp(Gp::kIdAx)))
+ goto InvalidInstruction;
+
+ uint32_t size = o0.x86_rm_size();
+ if (o1.x86_rm_size() != 0u && ASMJIT_UNLIKELY(o1.x86_rm_size() != size))
+ goto OperandSizeMismatch;
+
+ opcode.add_arith_by_size(size);
+ goto EmitX86OpImplicitMem;
+ }
+ break;
+
+ case InstDB::kEncodingX86StrMr:
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ rm_rel = &o0;
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().offset_lo32() || !o1.is_gp(Gp::kIdAx)))
+ goto InvalidInstruction;
+
+ uint32_t size = o1.x86_rm_size();
+ if (o0.x86_rm_size() != 0u && ASMJIT_UNLIKELY(o0.x86_rm_size() != size))
+ goto OperandSizeMismatch;
+
+ opcode.add_arith_by_size(size);
+ goto EmitX86OpImplicitMem;
+ }
+ break;
+
+ case InstDB::kEncodingX86StrMm:
+ if (isign3 == ENC_OPS2(Mem, Mem)) {
+ if (ASMJIT_UNLIKELY(o0.as<Mem>().base_and_index_types() !=
+ o1.as<Mem>().base_and_index_types()))
+ goto InvalidInstruction;
+
+ rm_rel = &o1;
+ if (ASMJIT_UNLIKELY(o0.as<Mem>().has_offset()))
+ goto InvalidInstruction;
+
+ uint32_t size = o1.x86_rm_size();
+ if (ASMJIT_UNLIKELY(size == 0))
+ goto AmbiguousOperandSize;
+
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() != size))
+ goto OperandSizeMismatch;
+
+ opcode.add_arith_by_size(size);
+ goto EmitX86OpImplicitMem;
+ }
+ break;
+
+ case InstDB::kEncodingX86Test:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (o0.x86_rm_size() != o1.x86_rm_size())
+ goto OperandSizeMismatch;
+
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rb_reg = o0.id();
+ op_reg = o1.id();
+
+ if (o0.x86_rm_size() != 1)
+ goto EmitX86R;
+
+ FIXUP_GPB(o0, rb_reg);
+ FIXUP_GPB(o1, op_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add_arith_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ if (o1.x86_rm_size() != 1)
+ goto EmitX86M;
+
+ FIXUP_GPB(o1, op_reg);
+ goto EmitX86M;
+ }
+
+ // The following instructions use the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+ op_reg = opcode.extract_mod_o();
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rb_reg = o0.id();
+
+ if (o0.x86_rm_size() == 1) {
+ FIXUP_GPB(o0, rb_reg);
+ imm_value = o1.as<Imm>().value_as<uint8_t>();
+ imm_size = 1;
+ }
+ else {
+ imm_value = o1.as<Imm>().value();
+ imm_size = FastUInt8(Support::min<uint32_t>(o0.x86_rm_size(), 4));
+ }
+
+ // Short form - AL, AX, EAX, RAX.
+ if (rb_reg == 0 && !Support::test(options, InstOptions::kLongForm)) {
+ opcode &= Opcode::kPP_66 | Opcode::kW;
+ opcode |= 0xA8 + (o0.x86_rm_size() != 1);
+ goto EmitX86Op;
+ }
+
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Imm)) {
+ if (ASMJIT_UNLIKELY(o0.x86_rm_size() == 0))
+ goto AmbiguousOperandSize;
+
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ rm_rel = &o0;
+
+ imm_value = o1.as<Imm>().value();
+ imm_size = FastUInt8(Support::min<uint32_t>(o0.x86_rm_size(), 4));
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Xchg:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode.add_arith_by_size(o0.x86_rm_size());
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ if (o0.x86_rm_size() != 1)
+ goto EmitX86M;
+
+ FIXUP_GPB(o0, op_reg);
+ goto EmitX86M;
+ }
+ [[fallthrough]];
+
+ case InstDB::kEncodingX86Xadd:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ rb_reg = o0.id();
+ op_reg = o1.id();
+
+ uint32_t op_size = o0.x86_rm_size();
+ if (op_size != o1.x86_rm_size())
+ goto OperandSizeMismatch;
+
+ if (op_size == 1) {
+ FIXUP_GPB(o0, rb_reg);
+ FIXUP_GPB(o1, op_reg);
+ goto EmitX86R;
+ }
+
+ // Special cases for 'xchg ?ax, reg'.
+ if (inst_id == Inst::kIdXchg && (op_reg == 0 || rb_reg == 0)) {
+ if (is_64bit() && op_reg == rb_reg && op_size >= 4) {
+ if (op_size == 8) {
+ // Encode 'xchg rax, rax' as '90' (REX and other prefixes are optional).
+ opcode &= Opcode::kW;
+ opcode |= 0x90;
+ goto EmitX86OpReg;
+ }
+ else {
+ // Encode 'xchg eax, eax' by using a generic path.
+ }
+ }
+ else if (!Support::test(options, InstOptions::kLongForm)) {
+ // The special encoding encodes only one register, which is non-zero.
+ op_reg += rb_reg;
+
+ opcode.add_arith_by_size(op_size);
+ opcode &= Opcode::kW | Opcode::kPP_66;
+ opcode |= 0x90;
+ goto EmitX86OpReg;
+ }
+ }
+
+ opcode.add_arith_by_size(op_size);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add_arith_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ if (o1.x86_rm_size() == 1) {
+ FIXUP_GPB(o1, op_reg);
+ }
+
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingX86Fence:
+ rb_reg = 0;
+ goto EmitX86R;
+
+ case InstDB::kEncodingX86Bndmov:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ // ModRM encoding:
+ if (!Support::test(options, InstOptions::kX86_ModMR))
+ goto EmitX86R;
+
+ // ModMR encoding:
+ opcode = alt_opcode_of(inst_info);
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode = alt_opcode_of(inst_info);
+
+ rm_rel = &o0;
+ op_reg = o1.id();
+ goto EmitX86M;
+ }
+ break;
+
+ // FPU Instructions
+ // ----------------
+
+ case InstDB::kEncodingFpuOp:
+ goto EmitFpuOp;
+
+ case InstDB::kEncodingFpuArith:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ // We switch to the alternative opcode if the first operand is zero.
+ if (op_reg == 0) {
+CaseFpuArith_Reg:
+ opcode = ((0xD8 << Opcode::kFPU_2B_Shift) ) +
+ ((opcode >> Opcode::kFPU_2B_Shift) & 0xFF) + rb_reg;
+ goto EmitFpuOp;
+ }
+ else if (rb_reg == 0) {
+ rb_reg = op_reg;
+ opcode = ((0xDC << Opcode::kFPU_2B_Shift) ) +
+ ((opcode ) & 0xFF) + rb_reg;
+ goto EmitFpuOp;
+ }
+ else {
+ goto InvalidInstruction;
+ }
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+CaseFpuArith_Mem:
+ // 0xD8/0xDC, depends on the size of the memory operand; op_reg is valid.
+ opcode = (o0.x86_rm_size() == 4) ? 0xD8 : 0xDC;
+ // Clear compressed displacement before going to EmitX86M.
+ opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
+
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingFpuCom:
+ if (isign3 == 0) {
+ rb_reg = 1;
+ goto CaseFpuArith_Reg;
+ }
+
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+ goto CaseFpuArith_Reg;
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ goto CaseFpuArith_Mem;
+ }
+ break;
+
+ case InstDB::kEncodingFpuFldFst:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+
+ if (o0.x86_rm_size() == 4 && common_info->has_flag(InstDB::InstFlags::kFpuM32)) {
+ goto EmitX86M;
+ }
+
+ if (o0.x86_rm_size() == 8 && common_info->has_flag(InstDB::InstFlags::kFpuM64)) {
+ opcode += 4u;
+ goto EmitX86M;
+ }
+
+ if (o0.x86_rm_size() == 10 && common_info->has_flag(InstDB::InstFlags::kFpuM80)) {
+ opcode = alt_opcode_of(inst_info);
+ op_reg = opcode.extract_mod_o();
+ goto EmitX86M;
+ }
+ }
+
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (inst_id == Inst::kIdFld ) { opcode = (0xD9 << Opcode::kFPU_2B_Shift) + 0xC0 + o0.id(); goto EmitFpuOp; }
+ if (inst_id == Inst::kIdFst ) { opcode = (0xDD << Opcode::kFPU_2B_Shift) + 0xD0 + o0.id(); goto EmitFpuOp; }
+ if (inst_id == Inst::kIdFstp) { opcode = (0xDD << Opcode::kFPU_2B_Shift) + 0xD8 + o0.id(); goto EmitFpuOp; }
+ }
+ break;
+
+ case InstDB::kEncodingFpuM:
+ if (isign3 == ENC_OPS1(Mem)) {
+ // Clear compressed displacement before going to EmitX86M.
+ opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
+
+ rm_rel = &o0;
+ if (o0.x86_rm_size() == 2 && common_info->has_flag(InstDB::InstFlags::kFpuM16)) {
+ opcode += 4u;
+ goto EmitX86M;
+ }
+
+ if (o0.x86_rm_size() == 4 && common_info->has_flag(InstDB::InstFlags::kFpuM32)) {
+ goto EmitX86M;
+ }
+
+ if (o0.x86_rm_size() == 8 && common_info->has_flag(InstDB::InstFlags::kFpuM64)) {
+ opcode = alt_opcode_of(inst_info) & ~uint32_t(Opcode::kCDSHL_Mask);
+ op_reg = opcode.extract_mod_o();
+ goto EmitX86M;
+ }
+ }
+ break;
+
+ case InstDB::kEncodingFpuRDef:
+ if (isign3 == 0) {
+ opcode += 1u;
+ goto EmitFpuOp;
+ }
+ [[fallthrough]];
+
+ case InstDB::kEncodingFpuR:
+ if (isign3 == ENC_OPS1(Reg)) {
+ opcode += o0.id();
+ goto EmitFpuOp;
+ }
+ break;
+
+ case InstDB::kEncodingFpuStsw:
+ if (isign3 == ENC_OPS1(Reg)) {
+ if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx))
+ goto InvalidInstruction;
+
+ opcode = alt_opcode_of(inst_info);
+ goto EmitFpuOp;
+ }
+
+ if (isign3 == ENC_OPS1(Mem)) {
+ // Clear compressed displacement before going to EmitX86M.
+ opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
+
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ // Ext Instructions (Legacy Extensions)
+ // ------------------------------------
+
+ case InstDB::kEncodingExtPextrw:
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode.add_66h_if(o1.is_vec128());
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
+ // Secondary opcode of 'pextrw' instruction (SSE4.1).
+ opcode = alt_opcode_of(inst_info);
+ opcode.add_66h_if(o1.is_vec128());
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtExtract:
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode.add_66h_if(o1.is_vec128());
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
+ opcode.add_66h_if(o1.is_vec128());
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtMov:
+ // GP|MM|XMM <- GP|MM|XMM
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ if (!Support::test(options, InstOptions::kX86_ModMR) || !inst_info->_alt_opcode_index)
+ goto EmitX86R;
+
+ opcode = alt_opcode_of(inst_info);
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+
+ // GP|MM|XMM <- Mem
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+
+ // The following instruction uses opcode[1].
+ opcode = alt_opcode_of(inst_info);
+
+ // Mem <- GP|MM|XMM
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtMovbe:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ if (o0.x86_rm_size() == 1)
+ goto InvalidInstruction;
+
+ opcode.add_prefix_by_size(o0.x86_rm_size());
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ if (o1.x86_rm_size() == 1)
+ goto InvalidInstruction;
+
+ opcode.add_prefix_by_size(o1.x86_rm_size());
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtMovd:
+CaseExtMovd:
+ if (is_mmx_or_xmm(o0.as<Reg>())) {
+ op_reg = o0.id();
+ opcode.add_66h_if(o0.is_vec128());
+
+ // MM/XMM <- Gp
+ if (isign3 == ENC_OPS2(Reg, Reg) && o1.as<Reg>().is_gp()) {
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ // MM/XMM <- Mem
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ }
+
+ // The following instructions use the secondary opcode.
+ if (is_mmx_or_xmm(o1.as<Reg>())) {
+ opcode &= Opcode::kW;
+ opcode |= alt_opcode_of(inst_info);
+ op_reg = o1.id();
+ opcode.add_66h_if(o1.is_vec128());
+
+ // GP <- MM/XMM
+ if (isign3 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().is_gp()) {
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+
+ // Mem <- MM/XMM
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ rm_rel = &o0;
+ goto EmitX86M;
+ }
+ }
+ break;
+
+ case InstDB::kEncodingExtMovq:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ // MM <- MM
+ if (o0.is_mm_reg() && o1.is_mm_reg()) {
+ opcode = Opcode::k000F00 | 0x6F;
+
+ if (!Support::test(options, InstOptions::kX86_ModMR))
+ goto EmitX86R;
+
+ opcode += 0x10u;
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+
+ // XMM <- XMM
+ if (o0.is_vec128() && o1.is_vec128()) {
+ opcode = Opcode::kF30F00 | 0x7E;
+
+ if (!Support::test(options, InstOptions::kX86_ModMR))
+ goto EmitX86R;
+
+ opcode = Opcode::k660F00 | 0xD6;
+ std::swap(op_reg, rb_reg);
+ goto EmitX86R;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ // MM <- Mem
+ if (o0.is_mm_reg()) {
+ opcode = Opcode::k000F00 | 0x6F;
+ goto EmitX86M;
+ }
+
+ // XMM <- Mem
+ if (o0.is_vec128()) {
+ opcode = Opcode::kF30F00 | 0x7E;
+ goto EmitX86M;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+
+ // Mem <- MM
+ if (o1.is_mm_reg()) {
+ opcode = Opcode::k000F00 | 0x7F;
+ goto EmitX86M;
+ }
+
+ // Mem <- XMM
+ if (o1.is_vec128()) {
+ opcode = Opcode::k660F00 | 0xD6;
+ goto EmitX86M;
+ }
+ }
+
+ // MOVQ in other case is simply a MOVD instruction promoted to 64-bit.
+ opcode |= Opcode::kW;
+ goto CaseExtMovd;
+
+ case InstDB::kEncodingExtRm_XMM0:
+ if (ASMJIT_UNLIKELY(!o2.is_none() && !o2.is_vec128(0)))
+ goto InvalidInstruction;
+
+ isign3 &= 0x3F;
+ goto CaseExtRm;
+
+ case InstDB::kEncodingExtRm_ZDI:
+ if (ASMJIT_UNLIKELY(!o2.is_none() && !is_implicit_mem(o2, Gp::kIdDi)))
+ goto InvalidInstruction;
+
+ isign3 &= 0x3F;
+ goto CaseExtRm;
+
+ case InstDB::kEncodingExtRm_Wx:
+ opcode.add_w_if(o1.x86_rm_size() == 8);
+ [[fallthrough]];
+
+ case InstDB::kEncodingExtRm_Wx_GpqOnly:
+ opcode.add_w_if(o0.is_gp64());
+ [[fallthrough]];
+
+ case InstDB::kEncodingExtRm:
+CaseExtRm:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtRm_P:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ opcode.add_66h_if(Support::bool_or(o0.is_vec128(), o1.is_vec128()));
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode.add_66h_if(o0.is_vec128());
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtRmRi:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+ op_reg = opcode.extract_mod_o();
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ imm_value = o1.as<Imm>().value();
+ imm_size = 1;
+
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+ break;
+
+ case InstDB::kEncodingExtRmRi_P:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ opcode.add_66h_if(Support::bool_or(o0.is_vec128(), o1.is_vec128()));
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode.add_66h_if(o0.is_vec128());
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+ op_reg = opcode.extract_mod_o();
+
+ if (isign3 == ENC_OPS2(Reg, Imm)) {
+ opcode.add_66h_if(o0.is_vec128());
+
+ imm_value = o1.as<Imm>().value();
+ imm_size = 1;
+
+ rb_reg = o0.id();
+ goto EmitX86R;
+ }
+ break;
+
+ case InstDB::kEncodingExtRmi:
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ case InstDB::kEncodingExtRmi_P:
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode.add_66h_if(Support::bool_or(o0.is_vec128(), o1.is_vec128()));
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ opcode.add_66h_if(o0.is_vec128());
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ // Extrq & Insertq (SSE4A)
+ // -----------------------
+
+ case InstDB::kEncodingExtExtrq:
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ if (isign3 == ENC_OPS2(Reg, Reg))
+ goto EmitX86R;
+
+ if (isign3 == ENC_OPS3(Reg, Imm, Imm)) {
+ // This variant of the instruction uses the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+ rb_reg = op_reg;
+ op_reg = opcode.extract_mod_o();
+
+ imm_value = (uint32_t(o1.as<Imm>().value_as<uint8_t>()) ) +
+ (uint32_t(o2.as<Imm>().value_as<uint8_t>()) << 8) ;
+ imm_size = 2;
+ goto EmitX86R;
+ }
+ break;
+
+ case InstDB::kEncodingExtInsertq: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ if (isign4 == ENC_OPS2(Reg, Reg))
+ goto EmitX86R;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
+ // This variant of the instruction uses the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+
+ imm_value = (uint32_t(o2.as<Imm>().value_as<uint8_t>()) ) +
+ (uint32_t(o3.as<Imm>().value_as<uint8_t>()) << 8) ;
+ imm_size = 2;
+ goto EmitX86R;
+ }
+ break;
+ }
+
+ // 3DNOW Instructions
+ // ------------------
+
+ case InstDB::kEncodingExt3dNow:
+ // Every 3dNow instruction starts with 0x0F0F and the actual opcode is
+ // stored as 8-bit immediate.
+ imm_value = opcode.v & 0xFFu;
+ imm_size = 1;
+
+ opcode = Opcode::k000F00 | 0x0F;
+ op_reg = o0.id();
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ rb_reg = o1.id();
+ goto EmitX86R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ rm_rel = &o1;
+ goto EmitX86M;
+ }
+ break;
+
+ // VEX/EVEX Instructions
+ // ---------------------
+
+ case InstDB::kEncodingVexOp:
+ goto EmitVexOp;
+
+ case InstDB::kEncodingVexOpMod:
+ rb_reg = 0;
+ goto EmitVexEvexR;
+
+ case InstDB::kEncodingVexKmov:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ // Form 'k, reg'.
+ if (o1.as<Reg>().is_gp()) {
+ opcode = alt_opcode_of(inst_info);
+ goto EmitVexEvexR;
+ }
+
+ // Form 'reg, k'.
+ if (o0.as<Reg>().is_gp()) {
+ opcode = alt_opcode_of(inst_info) + 1;
+ goto EmitVexEvexR;
+ }
+
+ // Form 'k, k'.
+ if (!Support::test(options, InstOptions::kX86_ModMR))
+ goto EmitVexEvexR;
+
+ opcode.add(1);
+ std::swap(op_reg, rb_reg);
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+
+ goto EmitVexEvexM;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode.add(1);
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexR_Wx:
+ if (isign3 == ENC_OPS1(Reg)) {
+ rb_reg = o0.id();
+ opcode.add_w_if(o0.is_gp64());
+ goto EmitVexEvexR;
+ }
+ break;
+
+ case InstDB::kEncodingVexM:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexMr_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexMr_VM:
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode |= Support::max(opcode_l_by_vmem(o0), opcode_l_by_size(o1.x86_rm_size()));
+
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexMri_Vpextrw:
+ // Use 'vpextrw reg, xmm1, i8' when possible.
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ opcode = Opcode::k660F00 | 0xC5;
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+ goto EmitVexEvexR;
+ }
+
+ goto CaseVexMri;
+
+ case InstDB::kEncodingVexMvr_Wx:
+ if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
+ opcode.add_w_if(o1.is_gp64());
+ op_reg = pack_reg_and_vvvvv(o1.id(), o2.id());
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexMri_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexMri:
+CaseVexMri:
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRm_ZDI:
+ if (ASMJIT_UNLIKELY(!o2.is_none() && !is_implicit_mem(o2, Gp::kIdDi)))
+ goto InvalidInstruction;
+
+ isign3 &= 0x3F;
+ goto CaseVexRm;
+
+ case InstDB::kEncodingVexRm_Wx:
+ opcode.add_w_if(Support::bool_or(o0.is_gp64(), o1.is_gp64()));
+ goto CaseVexRm;
+
+ case InstDB::kEncodingVexRm_Lx_Narrow:
+ if (o1.x86_rm_size())
+ opcode |= opcode_l_by_size(o1.x86_rm_size());
+ else if (o0.x86_rm_size() == 32)
+ opcode |= Opcode::kLL_2;
+ goto CaseVexRm;
+
+ case InstDB::kEncodingVexRm_Lx_Bcst:
+ if (isign3 == ENC_OPS2(Reg, Reg) && o1.as<Reg>().is_gp()) {
+ opcode = alt_opcode_of(inst_info) | opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRm_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRm:
+CaseVexRm:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRm_VM:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode |= Support::max(opcode_l_by_vmem(o1), opcode_l_by_size(o0.x86_rm_size()));
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRmi_Wx:
+ opcode.add_w_if(Support::bool_or(o0.is_gp64(), o1.is_gp64()));
+ goto CaseVexRmi;
+
+ case InstDB::kEncodingVexRmi_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRmi:
+CaseVexRmi:
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvm:
+CaseVexRvm:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+CaseVexRvm_R:
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvm_ZDX_Wx: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ if (ASMJIT_UNLIKELY(!o3.is_none() && !o3.is_gp(Gp::kIdDx)))
+ goto InvalidInstruction;
+ [[fallthrough]];
+ }
+
+ case InstDB::kEncodingVexRvm_Wx: {
+ opcode.add_w_if(Support::bool_or(o0.is_gp64(), o2.x86_rm_size() == 8));
+ goto CaseVexRvm;
+ }
+
+ case InstDB::kEncodingVexRvm_Lx_KEvex: {
+ opcode.force_evex_if(o0.is_mask_reg());
+ [[fallthrough]];
+ }
+
+ case InstDB::kEncodingVexRvm_Lx: {
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ goto CaseVexRvm;
+ }
+
+ case InstDB::kEncodingVexRvm_Lx_2xK: {
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ // Two registers are encoded as a single register.
+ // - First K register must be even.
+ // - Second K register must be first+1.
+ if ((o0.id() & 1) != 0 || o0.id() + 1 != o1.id())
+ goto InvalidPhysId;
+
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+
+ opcode |= opcode_l_by_size(o2.x86_rm_size());
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+
+ if (o3.is_reg()) {
+ rb_reg = o3.id();
+ goto EmitVexEvexR;
+ }
+
+ if (o3.is_mem()) {
+ rm_rel = &o3;
+ goto EmitVexEvexM;
+ }
+ }
+ break;
+ }
+
+ case InstDB::kEncodingVexRvmr_Lx: {
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+ }
+
+ case InstDB::kEncodingVexRvmr: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+
+ imm_value = o3.id() << 4;
+ imm_size = 1;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingVexRvmi_KEvex:
+ opcode.force_evex_if(o0.is_mask_reg());
+ goto VexRvmi;
+
+ case InstDB::kEncodingVexRvmi_Lx_KEvex:
+ opcode.force_evex_if(o0.is_mask_reg());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvmi_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvmi:
+VexRvmi:
+ {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+
+ imm_value = o3.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Mem, Imm)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingVexRmv_Wx:
+ opcode.add_w_if(Support::bool_or(o0.is_gp64(), o2.is_gp64()));
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRmv:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRmvRm_VM:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ opcode = alt_opcode_of(inst_info);
+ opcode |= Support::max(opcode_l_by_vmem(o1), opcode_l_by_size(o0.x86_rm_size()));
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRmv_VM:
+ if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
+ opcode |= Support::max(opcode_l_by_vmem(o1), opcode_l_by_size(o0.x86_rm_size() | o2.x86_rm_size()));
+
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+
+ case InstDB::kEncodingVexRmvi: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+
+ imm_value = o3.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Mem, Reg, Imm)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingVexMovdMovq:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ if (o0.as<Reg>().is_gp()) {
+ opcode = alt_opcode_of(inst_info);
+ opcode.add_w_by_size(o0.x86_rm_size());
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitVexEvexR;
+ }
+
+ if (o1.as<Reg>().is_gp()) {
+ opcode.add_w_by_size(o1.x86_rm_size());
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ // If this is a 'W' version (movq) then allow also vmovq 'xmm|xmm' form.
+ if (opcode & Opcode::kEvex_W_1) {
+ opcode &= ~(Opcode::kPP_VEXMask | Opcode::kMM_Mask | 0xFF);
+ opcode |= (Opcode::kF30F00 | 0x7E);
+
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ if (opcode & Opcode::kEvex_W_1) {
+ opcode &= ~(Opcode::kPP_VEXMask | Opcode::kMM_Mask | 0xFF);
+ opcode |= (Opcode::kF30F00 | 0x7E);
+ }
+
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ if (opcode & Opcode::kEvex_W_1) {
+ opcode &= ~(Opcode::kPP_VEXMask | Opcode::kMM_Mask | 0xFF);
+ opcode |= (Opcode::k660F00 | 0xD6);
+ }
+
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRmMr_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRmMr:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode &= Opcode::kLL_Mask;
+ opcode |= alt_opcode_of(inst_info);
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvmRmv:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rb_reg = o1.id();
+
+ if (!Support::test(options, InstOptions::kX86_ModMR))
+ goto EmitVexEvexR;
+
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvmRmi_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvmRmi:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+
+ // The following instructions use the secondary opcode.
+ opcode &= Opcode::kLL_Mask;
+ opcode |= alt_opcode_of(inst_info);
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvmRmvRmi:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rb_reg = o1.id();
+
+ if (!Support::test(options, InstOptions::kX86_ModMR))
+ goto EmitVexEvexR;
+
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+
+ // The following instructions use the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = o0.id();
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvmMr:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+
+ // The following instructions use the secondary opcode.
+ opcode = alt_opcode_of(inst_info);
+
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = o1.id();
+ rb_reg = o0.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvmMvr_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvmMvr:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode &= Opcode::kLL_Mask;
+ opcode |= alt_opcode_of(inst_info);
+
+ if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o2.id(), o1.id());
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexRvmVmi_Lx_MEvex:
+ opcode.force_evex_if(o1.is_mem());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvmVmi_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvmVmi:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+ goto EmitVexEvexM;
+ }
+
+ // The following instruction uses the secondary opcode.
+ opcode &= Opcode::kLL_Mask | Opcode::kMM_ForceEvex;
+ opcode |= alt_opcode_of(inst_info);
+ op_reg = opcode.extract_mod_o();
+
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = pack_reg_and_vvvvv(op_reg, o0.id());
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ op_reg = pack_reg_and_vvvvv(op_reg, o0.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexVm_Wx:
+ opcode.add_w_if(Support::bool_or(o0.is_gp64(), o1.is_gp64()));
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexVm:
+ if (isign3 == ENC_OPS2(Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(op_reg, o0.id());
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = pack_reg_and_vvvvv(op_reg, o0.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexVmi_Lx_MEvex:
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm))
+ opcode.force_evex();
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexVmi_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexVmi:
+ imm_value = o2.as<Imm>().value();
+ imm_size = 1;
+
+CaseVexVmi_AfterImm:
+ if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
+ op_reg = pack_reg_and_vvvvv(op_reg, o0.id());
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+
+ if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
+ op_reg = pack_reg_and_vvvvv(op_reg, o0.id());
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingVexVmi4_Wx:
+ opcode.add_w_if(Support::bool_or(o0.is_gp64(), o1.x86_rm_size() == 8));
+ imm_value = o2.as<Imm>().value();
+ imm_size = 4;
+ goto CaseVexVmi_AfterImm;
+
+ case InstDB::kEncodingVexRvrmRvmr_Lx:
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingVexRvrmRvmr: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+
+ imm_value = o3.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexR;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o3;
+
+ imm_value = o2.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexM;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+
+ imm_value = o3.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexM;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingVexRvrmiRvmri_Lx: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const Operand_& o4 = op_ext[EmitterUtils::kOp4];
+
+ if (ASMJIT_UNLIKELY(!o4.is_imm()))
+ goto InvalidInstruction;
+
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size() | o2.x86_rm_size() | o3.x86_rm_size());
+
+ imm_value = o4.as<Imm>().value_as<uint8_t>() & 0x0F;
+ imm_size = 1;
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rb_reg = o2.id();
+
+ imm_value |= o3.id() << 4;
+ goto EmitVexEvexR;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o3;
+
+ imm_value |= o2.id() << 4;
+ goto EmitVexEvexM;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+
+ imm_value |= o3.id() << 4;
+ goto EmitVexEvexM;
+ }
+ break;
+ }
+
+ case InstDB::kEncodingVexMovssMovsd:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ goto CaseVexRvm_R;
+ }
+
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ opcode = alt_opcode_of(inst_info);
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ // FMA4 Instructions
+ // -----------------
+
+ case InstDB::kEncodingFma4_Lx:
+ // It's fine to just check the first operand, second is just for sanity.
+ opcode |= opcode_l_by_size(o0.x86_rm_size() | o1.x86_rm_size());
+ [[fallthrough]];
+
+ case InstDB::kEncodingFma4: {
+ const Operand_& o3 = op_ext[EmitterUtils::kOp3];
+ const uint32_t isign4 = isign3 + (uint32_t(o3.op_type()) << 9);
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+
+ if (!Support::test(options, InstOptions::kX86_ModMR)) {
+ // MOD/RM - Encoding preferred by LLVM.
+ opcode.add_w();
+ rb_reg = o3.id();
+
+ imm_value = o2.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexR;
+ }
+ else {
+ // MOD/MR - Alternative encoding.
+ rb_reg = o2.id();
+
+ imm_value = o3.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexR;
+ }
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
+ opcode.add_w();
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o3;
+
+ imm_value = o2.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexM;
+ }
+
+ if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o1.id());
+ rm_rel = &o2;
+
+ imm_value = o3.id() << 4;
+ imm_size = 1;
+ goto EmitVexEvexM;
+ }
+ break;
+ }
+
+ // AMX Instructions
+ // ----------------
+
+ case InstDB::kEncodingAmxCfg:
+ if (isign3 == ENC_OPS1(Mem)) {
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingAmxR:
+ if (isign3 == ENC_OPS1(Reg)) {
+ op_reg = o0.id();
+ rb_reg = 0;
+ goto EmitVexEvexR;
+ }
+ break;
+
+ case InstDB::kEncodingAmxRm:
+ if (isign3 == ENC_OPS2(Reg, Mem)) {
+ op_reg = o0.id();
+ rm_rel = &o1;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingAmxMr:
+ if (isign3 == ENC_OPS2(Mem, Reg)) {
+ op_reg = o1.id();
+ rm_rel = &o0;
+ goto EmitVexEvexM;
+ }
+ break;
+
+ case InstDB::kEncodingAmxRmv:
+ if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
+ op_reg = pack_reg_and_vvvvv(o0.id(), o2.id());
+ rb_reg = o1.id();
+ goto EmitVexEvexR;
+ }
+ break;
+ }
+
+ goto InvalidInstruction;
+
+ // Emit - X86 Opcode
+ // -----------------
+
+EmitX86OpMovAbs:
+ imm_size = FastUInt8(register_size());
+ writer.emit_segment_override(rm_rel->as<Mem>().segment_id());
+
+EmitX86Op:
+ // Emit mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // Emit REX prefix (64-bit only).
+ {
+ uint32_t rex = opcode.extract_rex(options);
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+ }
+
+ // Emit instruction opcodes.
+ writer.emit_mm_and_opcode(opcode.v);
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+
+ // Emit - X86 - Opcode + Reg
+ // -------------------------
+
+EmitX86OpReg:
+ // Emit mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // Emit REX prefix (64-bit only).
+ {
+ uint32_t rex = opcode.extract_rex(options) | (op_reg >> 3); // Rex.B (0x01).
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+
+ op_reg &= 0x7;
+ }
+
+ // Emit instruction opcodes.
+ opcode += op_reg;
+ writer.emit_mm_and_opcode(opcode.v);
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+
+ // Emit - X86 - Opcode with Implicit <mem> Operand
+ // -----------------------------------------------
+
+EmitX86OpImplicitMem:
+ rm_info = mem_info_table[rm_rel->as<Mem>().base_and_index_types()];
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().has_offset() || (rm_info & kX86MemInfo_Index)))
+ goto InvalidInstruction;
+
+ // Emit mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // Emit REX prefix (64-bit only).
+ {
+ uint32_t rex = opcode.extract_rex(options);
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+ }
+
+ // Emit override prefixes.
+ writer.emit_segment_override(rm_rel->as<Mem>().segment_id());
+ writer.emit_address_override((rm_info & _address_override_mask()) != 0);
+
+ // Emit instruction opcodes.
+ writer.emit_mm_and_opcode(opcode.v);
+
+ // Emit immediate value.
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+
+ // Emit - X86 - Opcode /r - Register
+ // ---------------------------------
+
+EmitX86R:
+ // Mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // Emit REX prefix (64-bit only).
+ {
+ uint32_t rex = opcode.extract_rex(options) |
+ ((op_reg & 0x08) >> 1) | // REX.R (0x04).
+ ((rb_reg & 0x08) >> 3) ; // REX.B (0x01).
+
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+
+ op_reg &= 0x07;
+ rb_reg &= 0x07;
+ }
+
+ // Emit instruction opcodes.
+ writer.emit_mm_and_opcode(opcode.v);
+
+ // Emit ModR.
+ writer.emit8(encode_mod(3, op_reg, rb_reg));
+
+ // Emit immediate value.
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+
+ // Emit - X86 - Opcode /r - Memory Base
+ // ------------------------------------
+
+EmitX86RFromM:
+ rm_info = mem_info_table[rm_rel->as<Mem>().base_and_index_types()];
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().has_offset() || (rm_info & kX86MemInfo_Index)))
+ goto InvalidInstruction;
+
+ // Emit mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // Emit REX prefix (64-bit only).
+ {
+ uint32_t rex = opcode.extract_rex(options) |
+ ((op_reg & 0x08) >> 1) | // REX.R (0x04).
+ ((rb_reg ) >> 3) ; // REX.B (0x01).
+
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+
+ op_reg &= 0x07;
+ rb_reg &= 0x07;
+ }
+
+ // Emit override prefixes.
+ writer.emit_segment_override(rm_rel->as<Mem>().segment_id());
+ writer.emit_address_override((rm_info & _address_override_mask()) != 0);
+
+ // Emit instruction opcodes.
+ writer.emit_mm_and_opcode(opcode.v);
+
+ // Emit ModR/M.
+ writer.emit8(encode_mod(3, op_reg, rb_reg));
+
+ // Emit immediate value.
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+
+ // Emit - X86 - Opcode /r - memory Operand
+ // ---------------------------------------
+
+EmitX86M:
+ // `rm_rel` operand must be memory.
+ ASMJIT_ASSERT(rm_rel != nullptr);
+ ASMJIT_ASSERT(rm_rel->op_type() == OperandType::kMem);
+ ASMJIT_ASSERT((opcode & Opcode::kCDSHL_Mask) == 0);
+
+ // Emit override prefixes.
+ rm_info = mem_info_table[rm_rel->as<Mem>().base_and_index_types()];
+ writer.emit_segment_override(rm_rel->as<Mem>().segment_id());
+
+ mem_op_ao_mark = writer.cursor();
+ writer.emit_address_override((rm_info & _address_override_mask()) != 0);
+
+ // Emit mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // Emit REX prefix (64-bit only).
+ rb_reg = rm_rel->as<Mem>().base_id();
+ rx_reg = rm_rel->as<Mem>().index_id();
+ {
+ uint32_t rex;
+
+ rex = (rb_reg >> 3) & 0x01; // REX.B (0x01).
+ rex |= (rx_reg >> 2) & 0x02; // REX.X (0x02).
+ rex |= (op_reg >> 1) & 0x04; // REX.R (0x04).
+
+ rex &= rm_info;
+ rex |= opcode.extract_rex(options);
+
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+
+ op_reg &= 0x07;
+ }
+
+ // Emit instruction opcodes.
+ writer.emit_mm_and_opcode(opcode.v);
+
+ // ... Fall through ...
+
+ // Emit - MOD/SIB
+ // --------------
+
+EmitModSib:
+ if (!(rm_info & (kX86MemInfo_Index | kX86MemInfo_67H_X86))) {
+ // ==========|> [BASE + DISP8|DISP32].
+ if (rm_info & kX86MemInfo_BaseGp) {
+ rb_reg &= 0x7;
+ rel_offset = rm_rel->as<Mem>().offset_lo32();
+
+ uint32_t mod = encode_mod(0, op_reg, rb_reg);
+ bool force_sib = common_info->is_tsib_op();
+
+ if (rb_reg == Gp::kIdSp || force_sib) {
+ // TSIB or [XSP|R12].
+ mod = (mod & 0xF8u) | 0x04u;
+ if (rb_reg != Gp::kIdBp && rel_offset == 0) {
+ writer.emit8(mod);
+ writer.emit8(encode_sib(0, 4, rb_reg));
+ }
+ // TSIB or [XSP|R12 + DISP8|DISP32].
+ else {
+ uint32_t cd_shift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
+ int32_t cd_offset = rel_offset >> cd_shift;
+
+ if (Support::is_int_n<8>(cd_offset) && rel_offset == int32_t(uint32_t(cd_offset) << cd_shift)) {
+ writer.emit8(mod + 0x40); // <- MOD(1, op_reg, rb_reg).
+ writer.emit8(encode_sib(0, 4, rb_reg));
+ writer.emit8(cd_offset & 0xFF);
+ }
+ else {
+ writer.emit8(mod + 0x80); // <- MOD(2, op_reg, rb_reg).
+ writer.emit8(encode_sib(0, 4, rb_reg));
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ }
+ }
+ else if (rb_reg != Gp::kIdBp && rel_offset == 0) {
+ // [BASE].
+ writer.emit8(mod);
+ }
+ else {
+ // [BASE + DISP8|DISP32].
+ uint32_t cd_shift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
+ int32_t cd_offset = rel_offset >> cd_shift;
+
+ if (Support::is_int_n<8>(cd_offset) && rel_offset == int32_t(uint32_t(cd_offset) << cd_shift)) {
+ writer.emit8(mod + 0x40);
+ writer.emit8(cd_offset & 0xFF);
+ }
+ else {
+ writer.emit8(mod + 0x80);
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ }
+ }
+ // ==========|> [ABSOLUTE | DISP32].
+ else if (!(rm_info & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
+ Mem::AddrType addr_type = rm_rel->as<Mem>().addr_type();
+ rel_offset = rm_rel->as<Mem>().offset_lo32();
+
+ if (is_32bit()) {
+ // Explicit relative addressing doesn't work in 32-bit mode.
+ if (ASMJIT_UNLIKELY(addr_type == Mem::AddrType::kRel))
+ goto InvalidAddress;
+
+ writer.emit8(encode_mod(0, op_reg, 5));
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ else {
+ bool is_offset_int32 = rm_rel->as<Mem>().offset_hi32() == (rel_offset >> 31);
+ bool is_offset_uint32 = rm_rel->as<Mem>().offset_hi32() == 0;
+
+ uint64_t base_address = code()->base_address();
+ uint64_t section_offset = _section->offset();
+
+ // If relative addressing was not explicitly set then we can try to guess. By guessing we check some
+ // properties of the memory operand and try to base the decision on the segment prefix and the address type.
+ if (addr_type == Mem::AddrType::kDefault) {
+ if (EmitterUtils::is_absolute_location(base_address, section_offset)) {
+ // Prefer absolute addressing mode if the offset is 32-bit.
+ addr_type = is_offset_int32 || is_offset_uint32 ? Mem::AddrType::kAbs : Mem::AddrType::kRel;
+ }
+ else {
+ // Prefer absolute addressing mode if FS|GS segment override is present.
+ bool has_fs_gs = rm_rel->as<Mem>().segment_id() >= SReg::kIdFs;
+ // Prefer absolute addressing mode if this is LEA with 32-bit immediate.
+ bool is_lea_32 = (inst_id == Inst::kIdLea) && (is_offset_int32 || is_offset_uint32);
+
+ addr_type = has_fs_gs || is_lea_32 ? Mem::AddrType::kAbs : Mem::AddrType::kRel;
+ }
+ }
+
+ if (addr_type == Mem::AddrType::kRel) {
+ uint32_t kModRel32Size = 5;
+ uint64_t virtual_offset = uint64_t(writer.offset_from(_buffer_data)) + imm_size + kModRel32Size;
+
+ if (!EmitterUtils::is_absolute_location(base_address, section_offset)) {
+ // Create a new RelocEntry as we cannot calculate the offset right now.
+ err = _code->new_reloc_entry(Out(re), RelocType::kAbsToRel);
+ if (ASMJIT_UNLIKELY(err != Error::kOk))
+ goto Failed;
+
+ writer.emit8(encode_mod(0, op_reg, 5));
+
+ re->_source_section_id = _section->section_id();
+ re->_source_offset = offset();
+ re->_format.reset_to_simple_value(OffsetType::kSignedOffset, 4);
+ re->_format.set_leading_and_trailing_size(writer.offset_from(_buffer_ptr), imm_size);
+ re->_payload = uint64_t(rm_rel->as<Mem>().offset());
+
+ writer.emit32u_le(0);
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+ }
+ else {
+ uint64_t rip64 = base_address + section_offset + virtual_offset;
+ uint64_t rel64 = uint64_t(rm_rel->as<Mem>().offset()) - rip64;
+
+ if (Support::is_int_n<32>(int64_t(rel64))) {
+ writer.emit8(encode_mod(0, op_reg, 5));
+ writer.emit32u_le(uint32_t(rel64 & 0xFFFFFFFFu));
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+ }
+ else {
+ // We must check the original address type as we have modified
+ // `addr_type`. We failed if the original address type is 'rel'.
+ if (ASMJIT_UNLIKELY(rm_rel->as<Mem>().is_addr_rel()))
+ goto InvalidAddress;
+ }
+ }
+ }
+
+ // Handle unsigned 32-bit address that doesn't work with sign extension. Consider the following instructions:
+ //
+ // 1. lea rax, [-1] - Sign extended to 0xFFFFFFFFFFFFFFFF
+ // 2. lea rax, [0xFFFFFFFF] - Zero extended to 0x00000000FFFFFFFF
+ // 3. add rax, [-1] - Sign extended to 0xFFFFFFFFFFFFFFFF
+ // 4. add rax, [0xFFFFFFFF] - Zero extended to 0x00000000FFFFFFFF
+ //
+ // Sign extension is naturally performed by the CPU so we don't have to bother, however, zero extension
+ // requires address-size override prefix, which we probably don't have at this moment. So to make the address
+ // valid we need to insert it at `mem_op_ao_mark` if it's not already there.
+ //
+ // If this is 'lea' instruction then it's possible to remove REX.W part from REX prefix (if it's there), which
+ // would be one-byte shorter than inserting address-size override.
+ //
+ // NOTE: If we don't do this then these instructions are unencodable.
+ if (!is_offset_int32) {
+ // 64-bit absolute address is unencodable.
+ if (ASMJIT_UNLIKELY(!is_offset_uint32))
+ goto InvalidAddress64Bit;
+
+ // We only patch the existing code if we don't have address-size override.
+ if (*mem_op_ao_mark != 0x67) {
+ if (inst_id == Inst::kIdLea) {
+ // LEA: Remove REX.W, if present. This is easy as we know that 'lea' doesn't use any PP prefix so if REX
+ // prefix was emitted it would be at `mem_op_ao_mark`.
+ uint32_t rex = *mem_op_ao_mark;
+ if (rex & kX86ByteRex) {
+ rex &= (~kX86ByteRexW) & 0xFF;
+ *mem_op_ao_mark = uint8_t(rex);
+
+ // We can remove the REX prefix completely if it was not forced.
+ if (rex == kX86ByteRex && !Support::test(options, InstOptions::kX86_Rex))
+ writer.remove8(mem_op_ao_mark);
+ }
+ }
+ else {
+ // Any other instruction: Insert address-size override prefix.
+ writer.insert8(mem_op_ao_mark, 0x67);
+ }
+ }
+ }
+
+ // Emit 32-bit absolute address.
+ writer.emit8(encode_mod(0, op_reg, 4));
+ writer.emit8(encode_sib(0, 4, 5));
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ }
+ // ==========|> [LABEL|RIP + DISP32]
+ else {
+ writer.emit8(encode_mod(0, op_reg, 5));
+
+ if (is_32bit()) {
+EmitModSib_LabelRip_X86:
+ if (ASMJIT_UNLIKELY(_code->_relocations.reserve_additional(_code->arena()) != Error::kOk))
+ goto OutOfMemory;
+
+ rel_offset = rm_rel->as<Mem>().offset_lo32();
+ if (rm_info & kX86MemInfo_BaseLabel) {
+ // [LABEL->ABS].
+ uint32_t base_label_id = rm_rel->as<Mem>().base_id();
+ if (ASMJIT_UNLIKELY(!_code->is_label_valid(base_label_id))) {
+ }
+
+ label = &_code->label_entry_of(base_label_id);
+ err = _code->new_reloc_entry(Out(re), RelocType::kRelToAbs);
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+
+ re->_source_section_id = _section->section_id();
+ re->_source_offset = offset();
+ re->_format.reset_to_simple_value(OffsetType::kUnsignedOffset, 4);
+ re->_format.set_leading_and_trailing_size(writer.offset_from(_buffer_ptr), imm_size);
+ re->_payload = uint64_t(int64_t(rel_offset));
+
+ if (label->is_bound()) {
+ // Label bound to the current section.
+ re->_payload += label->offset();
+ re->_target_section_id = label->section_id();
+ writer.emit32u_le(0);
+ }
+ else {
+ // Non-bound label or label bound to a different section.
+ rel_offset = -4 - int32_t(imm_size);
+ rel_size = 4;
+ goto EmitRel;
+ }
+ }
+ else {
+ // [RIP->ABS].
+ err = _code->new_reloc_entry(Out(re), RelocType::kRelToAbs);
+ if (ASMJIT_UNLIKELY(err != Error::kOk))
+ goto Failed;
+
+ re->_source_section_id = _section->section_id();
+ re->_target_section_id = _section->section_id();
+ re->_format.reset_to_simple_value(OffsetType::kUnsignedOffset, 4);
+ re->_format.set_leading_and_trailing_size(writer.offset_from(_buffer_ptr), imm_size);
+ re->_source_offset = offset();
+ re->_payload = re->_source_offset + re->_format.region_size() + uint64_t(int64_t(rel_offset));
+
+ writer.emit32u_le(0);
+ }
+ }
+ else {
+ rel_offset = rm_rel->as<Mem>().offset_lo32();
+ if (rm_info & kX86MemInfo_BaseLabel) {
+ // [RIP].
+ uint32_t base_label_id = rm_rel->as<Mem>().base_id();
+ if (ASMJIT_UNLIKELY(!_code->is_label_valid(base_label_id))) {
+ goto InvalidLabel;
+ }
+
+ label = &_code->label_entry_of(base_label_id);
+ rel_offset -= (4 + imm_size);
+
+ if (label->is_bound_to(_section)) {
+ // Label bound to the current section.
+ rel_offset += int32_t(label->offset() - writer.offset_from(_buffer_data));
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ else {
+ // Non-bound label or label bound to a different section.
+ rel_size = 4;
+ goto EmitRel;
+ }
+ }
+ else {
+ // [RIP].
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ }
+ }
+ }
+ else if (!(rm_info & kX86MemInfo_67H_X86)) {
+ // ESP|RSP can't be used as INDEX in pure SIB mode, however, VSIB mode allows XMM4|YMM4|ZMM4 (that's why the
+ // check is before the label).
+ if (ASMJIT_UNLIKELY(rx_reg == Gp::kIdSp))
+ goto InvalidAddressIndex;
+
+EmitModVSib:
+ rx_reg &= 0x7;
+
+ // ==========|> [BASE + INDEX + DISP8|DISP32].
+ if (rm_info & kX86MemInfo_BaseGp) {
+ rb_reg &= 0x7;
+ rel_offset = rm_rel->as<Mem>().offset_lo32();
+
+ uint32_t mod = encode_mod(0, op_reg, 4);
+ uint32_t sib = encode_sib(rm_rel->as<Mem>().shift(), rx_reg, rb_reg);
+
+ if (rel_offset == 0 && rb_reg != Gp::kIdBp) {
+ // [BASE + INDEX << SHIFT].
+ writer.emit8(mod);
+ writer.emit8(sib);
+ }
+ else {
+ uint32_t cd_shift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
+ int32_t cd_offset = rel_offset >> cd_shift;
+
+ if (Support::is_int_n<8>(cd_offset) && rel_offset == int32_t(uint32_t(cd_offset) << cd_shift)) {
+ // [BASE + INDEX << SHIFT + DISP8].
+ writer.emit8(mod + 0x40); // <- MOD(1, op_reg, 4).
+ writer.emit8(sib);
+ writer.emit8(uint32_t(cd_offset));
+ }
+ else {
+ // [BASE + INDEX << SHIFT + DISP32].
+ writer.emit8(mod + 0x80); // <- MOD(2, op_reg, 4).
+ writer.emit8(sib);
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ }
+ }
+ // ==========|> [INDEX + DISP32].
+ else if (!(rm_info & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
+ // [INDEX << SHIFT + DISP32].
+ writer.emit8(encode_mod(0, op_reg, 4));
+ writer.emit8(encode_sib(rm_rel->as<Mem>().shift(), rx_reg, 5));
+
+ rel_offset = rm_rel->as<Mem>().offset_lo32();
+ writer.emit32u_le(uint32_t(rel_offset));
+ }
+ // ==========|> [LABEL|RIP + INDEX + DISP32].
+ else {
+ if (is_32bit()) {
+ writer.emit8(encode_mod(0, op_reg, 4));
+ writer.emit8(encode_sib(rm_rel->as<Mem>().shift(), rx_reg, 5));
+ goto EmitModSib_LabelRip_X86;
+ }
+ else {
+ // NOTE: This also handles VSIB+RIP, which is not allowed in 64-bit mode.
+ goto InvalidAddress;
+ }
+ }
+ }
+ else {
+ // 16-bit address mode (32-bit mode with 67 override prefix).
+ rel_offset = (int32_t(rm_rel->as<Mem>().offset_lo32()) << 16) >> 16;
+
+ // NOTE: 16-bit addresses don't use SIB byte and their encoding differs. We use a table-based approach to
+ // calculate the proper MOD byte as it's easier. Also, not all BASE [+ INDEX] combinations are supported
+ // in 16-bit mode, so this may fail.
+ const uint32_t kBaseGpIdx = (kX86MemInfo_BaseGp | kX86MemInfo_Index);
+
+ if (rm_info & kBaseGpIdx) {
+ // ==========|> [BASE + INDEX + DISP16].
+ uint32_t mod;
+
+ rb_reg &= 0x7;
+ rx_reg &= 0x7;
+
+ if ((rm_info & kBaseGpIdx) == kBaseGpIdx) {
+ uint32_t shf = rm_rel->as<Mem>().shift();
+ if (ASMJIT_UNLIKELY(shf != 0))
+ goto InvalidAddress;
+ mod = mod16_base_index_table[(rb_reg << 3) + rx_reg];
+ }
+ else {
+ if (rm_info & kX86MemInfo_Index)
+ rb_reg = rx_reg;
+ mod = mod16_base_table[rb_reg];
+ }
+
+ if (ASMJIT_UNLIKELY(mod == 0xFF))
+ goto InvalidAddress;
+
+ mod += op_reg << 3;
+ if (rel_offset == 0 && mod != 0x06) {
+ writer.emit8(mod);
+ }
+ else if (Support::is_int_n<8>(rel_offset)) {
+ writer.emit8(mod + 0x40);
+ writer.emit8(uint32_t(rel_offset));
+ }
+ else {
+ writer.emit8(mod + 0x80);
+ writer.emit16u_le(uint32_t(rel_offset));
+ }
+ }
+ else {
+ // Not supported in 16-bit addresses.
+ if (rm_info & (kX86MemInfo_BaseRip | kX86MemInfo_BaseLabel))
+ goto InvalidAddress;
+
+ // ==========|> [DISP16].
+ writer.emit8(op_reg | 0x06);
+ writer.emit16u_le(uint32_t(rel_offset));
+ }
+ }
+
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+
+ // Emit - FPU
+ // ----------
+
+EmitFpuOp:
+ // Mandatory instruction prefix.
+ writer.emit_pp(opcode.v);
+
+ // FPU instructions consist of two opcodes.
+ writer.emit8(opcode.v >> Opcode::kFPU_2B_Shift);
+ writer.emit8(opcode.v);
+ goto EmitDone;
+
+ // Emit - VEX Opcode
+ // -----------------
+
+EmitVexOp:
+ {
+ // These don't use immediate.
+ ASMJIT_ASSERT(imm_size == 0);
+
+ // Only 'vzeroall' and 'vzeroupper' instructions use this encoding, they don't define 'W' to be '1' so we can
+ // just check the 'mmmmm' field. Both functions can encode by using VEX2 prefix so VEX3 is basically only used
+ // when specified as instruction option.
+ ASMJIT_ASSERT((opcode & Opcode::kW) == 0);
+
+ uint32_t x = (uint32_t(opcode & Opcode::kMM_Mask ) >> (Opcode::kMM_Shift )) |
+ (uint32_t(opcode & Opcode::kLL_Mask ) >> (Opcode::kLL_Shift - 10)) |
+ (uint32_t(opcode & Opcode::kPP_VEXMask ) >> (Opcode::kPP_Shift - 8)) ;
+
+ if (Support::test(options, InstOptions::kX86_Vex3)) {
+ x = (x & 0xFFFF) << 8; // [00000000|00000Lpp|000mmmmm|00000000].
+ x ^= (kX86ByteVex3) | // [........|00000Lpp|000mmmmm|__VEX3__].
+ (0x07u << 13) | // [........|00000Lpp|111mmmmm|__VEX3__].
+ (0x0Fu << 19) | // [........|01111Lpp|111mmmmm|__VEX3__].
+ (opcode << 24) ; // [_OPCODE_|01111Lpp|111mmmmm|__VEX3__].
+
+ writer.emit32u_le(x);
+ goto EmitDone;
+ }
+ else {
+ x = ((x >> 8) ^ x) ^ 0xF9;
+ writer.emit8(kX86ByteVex2);
+ writer.emit8(x);
+ writer.emit8(opcode.v);
+ goto EmitDone;
+ }
+ }
+
+ // Emit - VEX|EVEX - /r - Register
+ // -------------------------------
+
+EmitVexEvexR:
+ {
+ // Construct `x` - a complete EVEX|VEX prefix.
+ uint32_t x = ((op_reg << 4) & 0xF980u) | // [........|........|Vvvvv..R|R.......].
+ ((rb_reg << 2) & 0x0060u) | // [........|........|........|.BB.....].
+ (opcode.extract_ll_mmmmm(options)) | // [........|.LL.....|Vvvvv..R|RBBmmmmm].
+ (_extra_reg.id() << 16); // [........|.LL..aaa|Vvvvv..R|RBBmmmmm].
+ op_reg &= 0x7;
+
+ // Handle AVX512 options by a single branch.
+ const InstOptions kAvx512Options = InstOptions::kX86_ZMask | InstOptions::kX86_ER | InstOptions::kX86_SAE;
+ if (Support::test(options, kAvx512Options)) {
+ static constexpr uint32_t kBcstMask = 0x1 << 20;
+ static constexpr uint32_t kLLMask10 = 0x2 << 21;
+ static constexpr uint32_t kLLMask11 = 0x3 << 21;
+
+ // Designed to be easily encodable so the position must be exact. The {rz-sae} is encoded as {11},
+ // so it should match the mask.
+ static_assert(uint32_t(InstOptions::kX86_RZ_SAE) == kLLMask11,
+ "This code requires InstOptions::X86_RZ_SAE to match kLLMask11 to work properly");
+
+ x |= uint32_t(options & InstOptions::kX86_ZMask); // [........|zLLb.aaa|Vvvvv..R|RBBmmmmm].
+
+ // Support embedded-rounding {er} and suppress-all-exceptions {sae}.
+ if (Support::test(options, InstOptions::kX86_ER | InstOptions::kX86_SAE)) {
+ // Embedded rounding is only encodable if the instruction is either scalar or it's a 512-bit
+ // operation as the {er} rounding predicate collides with LL part of the instruction.
+ if ((x & kLLMask11) != kLLMask10) {
+ // Ok, so LL is not 10, thus the instruction must be scalar. Scalar instructions don't
+ // support broadcast so if this instruction supports it {er} nor {sae} would be encodable.
+ if (ASMJIT_UNLIKELY(common_info->has_avx512_bcst()))
+ goto InvalidEROrSAE;
+ }
+
+ if (Support::test(options, InstOptions::kX86_ER)) {
+ if (ASMJIT_UNLIKELY(!common_info->has_avx512_er()))
+ goto InvalidEROrSAE;
+
+ x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
+ x |= kBcstMask | (uint32_t(options) & kLLMask11); // [........|.LLb.aaa|Vvvvv..R|RBBmmmmm].
+ }
+ else {
+ if (ASMJIT_UNLIKELY(!common_info->has_avx512_sae()))
+ goto InvalidEROrSAE;
+
+ x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
+ x |= kBcstMask; // [........|.00b.aaa|Vvvvv..R|RBBmmmmm].
+ }
+ }
+ }
+
+ // These bits would force EVEX prefix.
+ constexpr uint32_t kEvexForce = 0x00000010u; // [........|........|........|...x....].
+ constexpr uint32_t kEvexBits = 0x00D78150u; // [........|xx.x.xxx|x......x|.x.x....].
+
+ // Force EVEX prefix even in case the instruction has VEX encoding, because EVEX encoding is preferred. At the
+ // moment this is only required by AVX_VNNI instructions, which were added after AVX512_VNNI instructions. If
+ // such instruction doesn't specify prefix, EVEX (AVX512_VNNI) is selected by default.
+ if (common_info->prefer_evex()) {
+ if ((x & kEvexBits) == 0 && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) {
+ x |= kEvexForce;
+ }
+ }
+
+ // Check if EVEX is required by checking bits in `x` : [........|xx.x.xxx|x......x|.x.x....].
+ if (x & kEvexBits) {
+ uint32_t y = ((x << 4) & 0x00080000u) | // [........|...bV...|........|........].
+ ((x >> 4) & 0x00000010u) ; // [........|...bV...|........|...R....].
+ x = (x & 0x00FF78EFu) | y; // [........|zLLbVaaa|0vvvv000|RBBRmmmm].
+ x = x << 8; // [zLLbVaaa|0vvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBRmmmm|00000000] (added PP and EVEX.W).
+ // _ ____ ____
+ x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBRmmmm|01100010].
+
+ writer.emit32u_le(x);
+ writer.emit8(opcode.v);
+
+ rb_reg &= 0x7;
+ writer.emit8(encode_mod(3, op_reg, rb_reg));
+ writer.emit_imm_byte_or_dword(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+ }
+
+ // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|R0Bmmmmm].
+ x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|R0Bmmmmm].
+ ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|0vvvv0pp|R0Bmmmmm].
+ ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|R0Bmmmmm].
+ x |= x86_get_force_evex3_mask_in_last_bit(options); // [x0000000|00L00000|WvvvvLpp|R0Bmmmmm].
+
+ // Check if VEX3 is required / forced: [x.......|........|x.......|..xxxxx.].
+ if (x & 0x8000803Eu) {
+ uint32_t xor_mask = vex_prefix_table[x & 0xF] | (opcode << 24);
+
+ // Clear all high bits.
+ x = (x & 0xFFFF) << 8; // [00000000|WvvvvLpp|R0Bmmmmm|00000000].
+ // ____ _ _
+ x ^= xor_mask; // [_OPCODE_|WvvvvLpp|R1Bmmmmm|VEX3|XOP].
+ writer.emit32u_le(x);
+
+ rb_reg &= 0x7;
+ writer.emit8(encode_mod(3, op_reg, rb_reg));
+ writer.emit_imm_byte_or_dword(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+ }
+ else {
+ // 'mmmmm' must be '00001'.
+ ASMJIT_ASSERT((x & 0x1F) == 0x01);
+
+ x = ((x >> 8) ^ x) ^ 0xF9;
+ writer.emit8(kX86ByteVex2);
+ writer.emit8(x);
+ writer.emit8(opcode.v);
+
+ rb_reg &= 0x7;
+ writer.emit8(encode_mod(3, op_reg, rb_reg));
+ writer.emit_imm_byte_or_dword(uint64_t(imm_value), imm_size);
+ goto EmitDone;
+ }
+ }
+
+ // Emit - VEX|EVEX - /r - Memory
+ // -----------------------------
+
+EmitVexEvexM:
+ ASMJIT_ASSERT(rm_rel != nullptr);
+ ASMJIT_ASSERT(rm_rel->op_type() == OperandType::kMem);
+
+ rm_info = mem_info_table[rm_rel->as<Mem>().base_and_index_types()];
+ writer.emit_segment_override(rm_rel->as<Mem>().segment_id());
+
+ mem_op_ao_mark = writer.cursor();
+ writer.emit_address_override((rm_info & _address_override_mask()) != 0);
+
+ rb_reg = rm_rel->as<Mem>().has_base_reg() ? rm_rel->as<Mem>().base_id() : uint32_t(0);
+ rx_reg = rm_rel->as<Mem>().has_index_reg() ? rm_rel->as<Mem>().index_id() : uint32_t(0);
+
+ {
+ uint32_t broadcast_bit = uint32_t(rm_rel->as<Mem>().has_broadcast());
+
+ // Construct `x` - a complete EVEX|VEX prefix.
+ uint32_t x = ((op_reg << 4) & 0x0000F980u) | // [........|........|Vvvvv..R|R.......].
+ ((rx_reg << 3) & 0x00000040u) | // [........|........|........|.X......].
+ ((rx_reg << 15) & 0x00080000u) | // [........|....X...|........|........].
+ ((rb_reg << 2) & 0x00000020u) | // [........|........|........|..B.....].
+ opcode.extract_ll_mmmmm(options) | // [........|.LL.X...|Vvvvv..R|RXBmmmmm].
+ (_extra_reg.id() << 16) | // [........|.LL.Xaaa|Vvvvv..R|RXBmmmmm].
+ (broadcast_bit << 20) ; // [........|.LLbXaaa|Vvvvv..R|RXBmmmmm].
+ op_reg &= 0x07u;
+
+ // Mark invalid VEX (force EVEX) case: // [@.......|.LLbXaaa|Vvvvv..R|RXBmmmmm].
+ x |= uint32_t(~common_info->flags() & InstDB::InstFlags::kVex) << (31 - Support::ctz_const<InstDB::InstFlags::kVex>);
+
+ // Handle AVX512 options by a single branch.
+ const InstOptions kAvx512Options = InstOptions::kX86_ZMask |
+ InstOptions::kX86_ER |
+ InstOptions::kX86_SAE ;
+ if (Support::test(options, kAvx512Options)) {
+ // {er} and {sae} are both invalid if memory operand is used.
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_ER | InstOptions::kX86_SAE)))
+ goto InvalidEROrSAE;
+
+ x |= uint32_t(options & InstOptions::kX86_ZMask); // [@.......|zLLbXaaa|Vvvvv..R|RXBmmmmm].
+ }
+
+ // If these bits are used then EVEX prefix is required.
+ constexpr uint32_t kEvexForce = 0x00000010u; // [........|........|........|...x....].
+ constexpr uint32_t kEvexBits = 0x80DF8110u; // [@.......|xx.xxxxx|x......x|...x....].
+
+ // Force EVEX prefix even in case the instruction has VEX encoding, because EVEX encoding is preferred. At the
+ // moment this is only required for AVX_VNNI instructions, which were added after AVX512_VNNI instructions. If
+ // such instruction doesn't specify prefix, EVEX (AVX512_VNNI) would be used by default,
+ if (common_info->prefer_evex()) {
+ if ((x & kEvexBits) == 0 && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) {
+ x |= kEvexForce;
+ }
+ }
+
+ // Check if EVEX is required by checking bits in `x` : [@.......|xx.xxxxx|x......x|...x....].
+ if (x & kEvexBits) {
+ uint32_t y = ((x << 4) & 0x00080000u) | // [@.......|....V...|........|........].
+ ((x >> 4) & 0x00000010u) ; // [@.......|....V...|........|...R....].
+ x = (x & 0x00FF78EFu) | y; // [........|zLLbVaaa|0vvvv000|RXBRmmmm].
+ x = x << 8; // [zLLbVaaa|0vvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBRmmmm|00000000].
+ x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBRmmmm|00000000] (added PP and EVEX.W).
+ // _ ____ ____
+ x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBRmmmm|01100010].
+
+ if (x & 0x10000000u) {
+ // Broadcast support.
+ //
+ // 1. Verify our LL field is correct as broadcast changes the "size" of the source operand. For example if
+ // a broadcasted operand is qword_ptr[X] {1to8} the source size becomes 64 and not 8 as the memory operand
+ // would report.
+ //
+ // 2. Change the compressed displacement scale to either x2 (SHL1), x4 (SHL 2), or x8 (SHL 3) depending on
+ // the broadcast unit/element size.
+ uint32_t broadcast_unit_size = common_info->broadcast_size();
+ uint32_t broadcast_vector_size = broadcast_unit_size << uint32_t(rm_rel->as<Mem>().get_broadcast());
+
+ if (ASMJIT_UNLIKELY(broadcast_unit_size == 0))
+ goto InvalidBroadcast;
+
+ // LL was already shifted 8 bits right.
+ constexpr uint32_t kLLShift = 21 + 8;
+
+ uint32_t current_ll = x & (0x3u << kLLShift);
+ uint32_t broadcast_ll = (Support::max<uint32_t>(Support::ctz(broadcast_vector_size), 4) - 4) << kLLShift;
+
+ if (broadcast_ll > (2u << kLLShift))
+ goto InvalidBroadcast;
+
+ uint32_t new_ll = Support::max(current_ll, broadcast_ll);
+ x = (x & ~(uint32_t(0x3) << kLLShift)) | new_ll;
+
+ opcode &=~uint32_t(Opcode::kCDSHL_Mask);
+ opcode |= Support::ctz(broadcast_unit_size) << Opcode::kCDSHL_Shift;
+ }
+ else {
+ // Add the compressed displacement 'SHF' to the opcode based on 'TTWLL'.
+ // The index to `cdisp8_shl_table` is composed as `CDTT[4:3] | W[2] | LL[1:0]`.
+ uint32_t TTWLL = ((opcode >> (Opcode::kCDTT_Shift - 3)) & 0x18) +
+ ((opcode >> (Opcode::kW_Shift - 2)) & 0x04) +
+ ((x >> 29) & 0x3);
+ opcode += cdisp8_shl_table[TTWLL];
+ }
+
+ writer.emit32u_le(x);
+ writer.emit8(opcode.v);
+ }
+ else {
+ // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|RXBmmmmm].
+ x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|RXBmmmmm].
+ ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|Wvvvv0pp|RXBmmmmm].
+ ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|RXBmmmmm].
+ x |= x86_get_force_evex3_mask_in_last_bit(options); // [x0000000|00L00000|WvvvvLpp|RXBmmmmm].
+
+ // Clear a possible CDisp specified by EVEX.
+ opcode &= ~Opcode::kCDSHL_Mask;
+
+ // Check if VEX3 is required / forced: [x.......|........|x.......|.xxxxxx.].
+ if (x & 0x8000807Eu) {
+ uint32_t xor_mask = vex_prefix_table[x & 0xF] | (opcode << 24);
+
+ // Clear all high bits.
+ x = (x & 0xFFFF) << 8; // [00000000|WvvvvLpp|RXBmmmmm|00000000].
+ // ____ ___
+ x ^= xor_mask; // [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP].
+ writer.emit32u_le(x);
+ }
+ else {
+ // 'mmmmm' must be '00001'.
+ ASMJIT_ASSERT((x & 0x1F) == 0x01);
+
+ x = ((x >> 8) ^ x) ^ 0xF9;
+ writer.emit8(kX86ByteVex2);
+ writer.emit8(x);
+ writer.emit8(opcode.v);
+ }
+ }
+ }
+
+ // MOD|SIB address.
+ if (!common_info->has_flag(InstDB::InstFlags::kVsib))
+ goto EmitModSib;
+
+ // MOD|VSIB address without INDEX is invalid.
+ if (rm_info & kX86MemInfo_Index)
+ goto EmitModVSib;
+ goto InvalidInstruction;
+
+ // Emit - Jmp/Jcc/Call
+ // -------------------
+
+EmitJmpCall:
+ {
+ // Emit REX prefix if asked for (64-bit only).
+ uint32_t rex = opcode.extract_rex(options);
+ if (ASMJIT_UNLIKELY(is_rex_invalid(rex)))
+ goto InvalidRexPrefix;
+ rex &= ~kX86ByteInvalidRex & 0xFF;
+ writer.emit8_if(rex | kX86ByteRex, rex != 0);
+
+ uint64_t ip = uint64_t(writer.offset_from(_buffer_data));
+ uint32_t rel32 = 0;
+ uint32_t opcode8 = alt_opcode_of(inst_info);
+
+ uint32_t inst8_size = 1 + 1; // OPCODE + REL8 .
+ uint32_t inst32_size = 1 + 4; // [PREFIX] OPCODE + REL32.
+
+ // Jcc instructions with 32-bit displacement use 0x0F prefix,
+ // other instructions don't. No other prefixes are used by X86.
+ ASMJIT_ASSERT((opcode8 & Opcode::kMM_Mask) == 0);
+ ASMJIT_ASSERT((opcode & Opcode::kMM_Mask) == 0 ||
+ (opcode & Opcode::kMM_Mask) == Opcode::kMM_0F);
+
+ // Only one of these should be used at the same time.
+ inst32_size += uint32_t(op_reg != 0);
+ inst32_size += uint32_t((opcode & Opcode::kMM_Mask) == Opcode::kMM_0F);
+
+ if (rm_rel->is_label()) {
+ uint32_t label_id = rm_rel->as<Label>().id();
+ if (ASMJIT_UNLIKELY(!_code->is_label_valid(label_id))) {
+ goto InvalidLabel;
+ }
+
+ label = &_code->label_entry_of(label_id);
+ if (label->is_bound_to(_section)) {
+ // Label bound to the current section.
+ rel32 = uint32_t((label->offset() - ip - inst32_size) & 0xFFFFFFFFu);
+ goto EmitJmpCallRel;
+ }
+ else {
+ // Non-bound label or label bound to a different section.
+ if (opcode8 && (!opcode.v || Support::test(options, InstOptions::kShortForm))) {
+ writer.emit8(opcode8);
+
+ // Record DISP8 (non-bound label).
+ rel_offset = -1;
+ rel_size = 1;
+ goto EmitRel;
+ }
+ else {
+ // Refuse also 'short' prefix, if specified.
+ if (ASMJIT_UNLIKELY(!opcode.v || Support::test(options, InstOptions::kShortForm)))
+ goto InvalidDisplacement;
+
+ writer.emit8_if(0x0F, (opcode & Opcode::kMM_Mask) != 0);// Emit 0F prefix.
+ writer.emit8(opcode.v); // Emit opcode.
+ writer.emit8_if(encode_mod(3, op_reg, 0), op_reg != 0); // Emit MOD.
+
+ // Record DISP32 (non-bound label).
+ rel_offset = -4;
+ rel_size = 4;
+ goto EmitRel;
+ }
+ }
+ }
+
+ if (rm_rel->is_imm()) {
+ uint64_t base_address = code()->base_address();
+ uint64_t section_offset = _section->offset();
+ uint64_t jump_address = rm_rel->as<Imm>().value_as<uint64_t>();
+
+ // If the base-address is known calculate a relative displacement and check if it fits in 32 bits (which is
+ // always true in 32-bit mode). Emit relative displacement as it was a bound label if all checks are ok.
+ if (EmitterUtils::is_absolute_location(base_address, section_offset)) {
+ uint64_t rel64 = jump_address - (ip + base_address + section_offset) - inst32_size;
+ if (Environment::is_32bit(arch()) || Support::is_int_n<32>(int64_t(rel64))) {
+ rel32 = uint32_t(rel64 & 0xFFFFFFFFu);
+ goto EmitJmpCallRel;
+ }
+ else {
+ // Relative displacement exceeds 32-bits - relocator can only insert trampoline for jmp/call, but not
+ // for jcc/jecxz.
+ if (ASMJIT_UNLIKELY(!is_jmp_or_call(inst_id))) {
+ goto InvalidDisplacement;
+ }
+ }
+ }
+
+ err = _code->new_reloc_entry(Out(re), RelocType::kAbsToRel);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+
+ re->_source_offset = offset();
+ re->_source_section_id = _section->section_id();
+ re->_payload = jump_address;
+
+ if (ASMJIT_LIKELY(opcode.v)) {
+ // 64-bit: Emit REX prefix so the instruction can be patched later. REX prefix does nothing if not patched,
+ // but allows to patch the instruction to use MOD/M and to point to a memory where the final 64-bit address
+ // is stored.
+ if (Environment::is_64bit(arch()) && is_jmp_or_call(inst_id)) {
+ if (!rex) {
+ writer.emit8(kX86ByteRex);
+ }
+
+ err = _code->add_address_to_address_table(jump_address);
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ goto Failed;
+ }
+
+ re->_reloc_type = RelocType::kX64AddressEntry;
+ }
+
+ writer.emit8_if(0x0F, (opcode & Opcode::kMM_Mask) != 0); // Emit 0F prefix.
+ writer.emit8(opcode.v); // Emit opcode.
+ writer.emit8_if(encode_mod(3, op_reg, 0), op_reg != 0); // Emit MOD.
+ re->_format.reset_to_simple_value(OffsetType::kSignedOffset, 4);
+ re->_format.set_leading_and_trailing_size(writer.offset_from(_buffer_ptr), imm_size);
+ writer.emit32u_le(0); // Emit DISP32.
+ }
+ else {
+ writer.emit8(opcode8); // Emit opcode.
+ re->_format.reset_to_simple_value(OffsetType::kSignedOffset, 1);
+ re->_format.set_leading_and_trailing_size(writer.offset_from(_buffer_ptr), imm_size);
+ writer.emit8(0); // Emit DISP8 (zero).
+ }
+ goto EmitDone;
+ }
+
+ // Not Label|Imm -> Invalid.
+ goto InvalidInstruction;
+
+ // Emit jmp/call with relative displacement known at assembly-time. Decide between 8-bit and 32-bit displacement
+ // encoding. Some instructions only allow either 8-bit or 32-bit encoding, others allow both encodings.
+EmitJmpCallRel:
+ if (Support::is_int_n<8>(int32_t(rel32 + inst32_size - inst8_size)) && opcode8 && !Support::test(options, InstOptions::kLongForm)) {
+ options |= InstOptions::kShortForm;
+ writer.emit8(opcode8); // Emit opcode
+ writer.emit8(rel32 + inst32_size - inst8_size); // Emit DISP8.
+ goto EmitDone;
+ }
+ else {
+ if (ASMJIT_UNLIKELY(!opcode.v || Support::test(options, InstOptions::kShortForm))) {
+ goto InvalidDisplacement;
+ }
+
+ options &= ~InstOptions::kShortForm;
+ writer.emit8_if(0x0F, (opcode & Opcode::kMM_Mask) != 0); // Emit 0x0F prefix.
+ writer.emit8(opcode.v); // Emit Opcode.
+ writer.emit8_if(encode_mod(3, op_reg, 0), op_reg != 0); // Emit MOD.
+ writer.emit32u_le(rel32); // Emit DISP32.
+ goto EmitDone;
+ }
+ }
+
+ // Emit - Relative
+ // ---------------
+
+EmitRel:
+ {
+ ASMJIT_ASSERT(rel_size == 1 || rel_size == 4);
+
+ // Chain with label.
+ size_t offset = size_t(writer.offset_from(_buffer_data));
+ OffsetFormat of;
+ of.reset_to_simple_value(OffsetType::kSignedOffset, rel_size);
+
+ Fixup* fixup = _code->new_fixup(*label, _section->section_id(), offset, rel_offset, of);
+ if (ASMJIT_UNLIKELY(!fixup)) {
+ goto OutOfMemory;
+ }
+
+ if (re) {
+ fixup->label_or_reloc_id = re->id();
+ }
+
+ // Emit dummy zeros, must be patched later when the reference becomes known.
+ writer.emit_zeros(rel_size);
+ }
+ writer.emit_immediate(uint64_t(imm_value), imm_size);
+
+ // Emit - Done
+ // -----------
+
+EmitDone:
+ if (Support::test(options, InstOptions::kReserved)) {
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger)
+ EmitterUtils::log_instruction_emitted(this, inst_id, options, o0, o1, o2, op_ext, rel_size, imm_size, writer.cursor());
+#endif
+ }
+
+ reset_state();
+ writer.done(this);
+ return Error::kOk;
+
+ // Error Handler
+ // -------------
+
+#define ERROR_HANDLER(ERR) ERR: err = make_error(Error::k##ERR); goto Failed;
+ ERROR_HANDLER(OutOfMemory)
+ ERROR_HANDLER(InvalidLabel)
+ ERROR_HANDLER(InvalidInstruction)
+ ERROR_HANDLER(InvalidLockPrefix)
+ ERROR_HANDLER(InvalidXAcquirePrefix)
+ ERROR_HANDLER(InvalidXReleasePrefix)
+ ERROR_HANDLER(InvalidRepPrefix)
+ ERROR_HANDLER(InvalidRexPrefix)
+ ERROR_HANDLER(InvalidEROrSAE)
+ ERROR_HANDLER(InvalidAddress)
+ ERROR_HANDLER(InvalidAddressIndex)
+ ERROR_HANDLER(InvalidAddress64Bit)
+ ERROR_HANDLER(InvalidDisplacement)
+ ERROR_HANDLER(InvalidPhysId)
+ ERROR_HANDLER(InvalidSegment)
+ ERROR_HANDLER(InvalidImmediate)
+ ERROR_HANDLER(InvalidBroadcast)
+ ERROR_HANDLER(OperandSizeMismatch)
+ ERROR_HANDLER(AmbiguousOperandSize)
+#undef ERROR_HANDLER
+
+Failed:
+#ifndef ASMJIT_NO_LOGGING
+ return EmitterUtils::log_instruction_failed(this, err, inst_id, options, o0, o1, o2, op_ext);
+#else
+ reset_state();
+ return report_error(err);
+#endif
+}
+
+//x86::Assembler - Align
+// =====================
+
+Error Assembler::align(AlignMode align_mode, uint32_t alignment) {
+ if (ASMJIT_UNLIKELY(!_code))
+ return report_error(make_error(Error::kNotInitialized));
+
+ if (ASMJIT_UNLIKELY(uint32_t(align_mode) > uint32_t(AlignMode::kMaxValue)))
+ return report_error(make_error(Error::kInvalidArgument));
+
+ if (alignment <= 1)
+ return Error::kOk;
+
+ if (ASMJIT_UNLIKELY(!Support::is_power_of_2_up_to(alignment, Globals::kMaxAlignment)))
+ return report_error(make_error(Error::kInvalidArgument));
+
+ uint32_t i = uint32_t(Support::align_up_diff<size_t>(offset(), alignment));
+ if (i > 0) {
+ CodeWriter writer(this);
+ ASMJIT_PROPAGATE(writer.ensure_space(this, i));
+
+ uint8_t pattern = 0x00;
+ switch (align_mode) {
+ case AlignMode::kCode: {
+ if (has_encoding_option(EncodingOptions::kOptimizedAlign)) {
+ // Intel 64 and IA-32 Architectures Software Developer's Manual - Volume 2B (NOP).
+ static constexpr uint32_t kMaxNop_size = 9;
+
+ static const uint8_t nop_table[kMaxNop_size][kMaxNop_size] = {
+ { 0x90 },
+ { 0x66, 0x90 },
+ { 0x0F, 0x1F, 0x00 },
+ { 0x0F, 0x1F, 0x40, 0x00 },
+ { 0x0F, 0x1F, 0x44, 0x00, 0x00 },
+ { 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00 },
+ { 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00 },
+ { 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }
+ };
+
+ do {
+ uint32_t n = Support::min<uint32_t>(i, kMaxNop_size);
+ const uint8_t* src = nop_table[n - 1];
+
+ i -= n;
+ do {
+ writer.emit8(*src++);
+ } while (--n);
+ } while (i);
+ }
+
+ pattern = 0x90;
+ break;
+ }
+
+ case AlignMode::kData:
+ pattern = 0xCC;
+ break;
+
+ case AlignMode::kZero:
+ // Pattern already set to zero.
+ break;
+ }
+
+ while (i) {
+ writer.emit8(pattern);
+ i--;
+ }
+
+ writer.done(this);
+ }
+
+#ifndef ASMJIT_NO_LOGGING
+ if (_logger) {
+ StringTmp<128> sb;
+ sb.append_chars(' ', _logger->indentation(FormatIndentationGroup::kCode));
+ sb.append_format("align %u\n", alignment);
+ _logger->log(sb);
+ }
+#endif
+
+ return Error::kOk;
+}
+
+// x86::Assembler - Events
+// =======================
+
+Error Assembler::on_attach(CodeHolder& code) noexcept {
+ Arch arch = code.arch();
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ _instruction_alignment = uint8_t(1);
+ update_emitter_funcs(this);
+
+ if (Environment::is_32bit(arch)) {
+ // 32 bit architecture - X86.
+ _forced_inst_options |= InstOptions::kX86_InvalidRex;
+ _set_address_override_mask(kX86MemInfo_67H_X86);
+ }
+ else {
+ // 64 bit architecture - X64.
+ _forced_inst_options &= ~InstOptions::kX86_InvalidRex;
+ _set_address_override_mask(kX86MemInfo_67H_X64);
+ }
+
+ return Error::kOk;
+}
+
+Error Assembler::on_detach(CodeHolder& code) noexcept {
+ _forced_inst_options &= ~InstOptions::kX86_InvalidRex;
+ _set_address_override_mask(0);
+ return Base::on_detach(code);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit/x86/x86assembler.h b/3rdparty/asmjit/asmjit/x86/x86assembler.h
new file mode 100644
index 00000000000..98e0862fa9f
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86assembler.h
@@ -0,0 +1,706 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
+#define ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
+
+#include <asmjit/core/assembler.h>
+#include <asmjit/x86/x86emitter.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86/X64 assembler implementation.
+//!
+//! x86::Assembler is a code emitter that emits machine code directly into the \ref CodeBuffer. The assembler is capable
+//! of targeting both 32-bit and 64-bit instruction sets, the instruction set can be configured through \ref CodeHolder.
+//!
+//! ### Basics
+//!
+//! The following example shows a basic use of `x86::Assembler`, how to generate a function that works in both 32-bit
+//! and 64-bit modes, and how to connect \ref JitRuntime, \ref CodeHolder, and `x86::Assembler`.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! // Signature of the generated function.
+//! using SumFunc = int (*)(const int* arr, size_t count);
+//!
+//! int main() {
+//! JitRuntime rt; // Create a runtime specialized for JIT.
+//! CodeHolder code; // Create a CodeHolder.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
+//!
+//! // Decide between 32-bit CDECL, WIN64, and SysV64 calling conventions:
+//! // 32-BIT - passed all arguments by stack.
+//! // WIN64 - passes first 4 arguments by RCX, RDX, R8, and R9.
+//! // UNIX64 - passes first 6 arguments by RDI, RSI, RDX, RCX, R8, and R9.
+//! x86::Gp arr, cnt;
+//! x86::Gp sum = x86::eax; // Use EAX as 'sum' as it's a return register.
+//!
+//! if (ASMJIT_ARCH_BITS == 64) {
+//! #if defined(_WIN32)
+//! arr = x86::rcx; // First argument (array ptr).
+//! cnt = x86::rdx; // Second argument (number of elements)
+//! #else
+//! arr = x86::rdi; // First argument (array ptr).
+//! cnt = x86::rsi; // Second argument (number of elements)
+//! #endif
+//! }
+//! else {
+//! arr = x86::edx; // Use EDX to hold the array pointer.
+//! cnt = x86::ecx; // Use ECX to hold the counter.
+//! // Fetch first and second arguments from [ESP + 4] and [ESP + 8].
+//! a.mov(arr, x86::ptr(x86::esp, 4));
+//! a.mov(cnt, x86::ptr(x86::esp, 8));
+//! }
+//!
+//! Label Loop = a.new_label(); // To construct the loop, we need some labels.
+//! Label Exit = a.new_label();
+//!
+//! a.xor_(sum, sum); // Clear 'sum' register (shorter than 'mov').
+//! a.test(cnt, cnt); // Border case:
+//! a.jz(Exit); // If 'cnt' is zero jump to 'Exit' now.
+//!
+//! a.bind(Loop); // Start of a loop iteration.
+//! a.add(sum, x86::dword_ptr(arr)); // Add int at [arr] to 'sum'.
+//! a.add(arr, 4); // Increment 'arr' pointer.
+//! a.dec(cnt); // Decrease 'cnt'.
+//! a.jnz(Loop); // If not zero jump to 'Loop'.
+//!
+//! a.bind(Exit); // Exit to handle the border case.
+//! a.ret(); // Return from function ('sum' == 'eax').
+//! // ----> x86::Assembler is no longer needed from here and can be destroyed <----
+//!
+//! SumFunc fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! static const int array[6] = { 4, 8, 15, 16, 23, 42 };
+//!
+//! int result = fn(array, 6); // Execute the generated code.
+//! printf("%d\n", result); // Print sum of array (108).
+//!
+//! rt.release(fn); // Explicitly remove the function from the runtime
+//! return 0; // Everything successful...
+//! }
+//! ```
+//!
+//! The example should be self-explanatory. It shows how to work with labels, how to use operands, and how to emit
+//! instructions that can use different registers based on runtime selection. It implements 32-bit CDECL, WIN64,
+//! and SysV64 calling conventions and will work on most X86/X64 environments.
+//!
+//! Although functions prologs / epilogs can be implemented manually, AsmJit provides utilities that can be used
+//! to create function prologs and epilogs automatically, see \ref asmjit_function for more details.
+//!
+//! ### Instruction Validation
+//!
+//! Assembler prefers speed over strictness by default. The implementation checks the type of operands and fails
+//! if the signature of types is invalid, however, it does only basic checks regarding registers and their groups
+//! used in instructions. It's possible to pass operands that don't form any valid signature to the implementation
+//! and succeed. This is usually not a problem as Assembler provides typed API so operand types are normally checked
+//! by C++ compiler at compile time, however, Assembler is fully dynamic and its \ref emit() function can be called
+//! with any instruction id, options, and operands. Moreover, it's also possible to form instructions that will be
+//! accepted by the typed API, for example by calling `mov(x86::eax, x86::al)` - the C++ compiler won't see a problem
+//! as both EAX and AL are \ref Gp registers.
+//!
+//! To help with common mistakes AsmJit allows to activate instruction validation. This feature instruments
+//! the Assembler to call \ref InstAPI::validate() before it attempts to encode any instruction.
+//!
+//! The example below illustrates how validation can be turned on:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main(int argc, char* argv[]) {
+//! JitRuntime rt; // Create a runtime specialized for JIT.
+//! CodeHolder code; // Create a CodeHolder.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
+//!
+//! // Enable strict validation.
+//! a.add_diagnostic_options(DiagnosticOptions::kValidateAssembler);
+//!
+//! // Try to encode invalid or ill-formed instructions.
+//! Error err;
+//!
+//! // Invalid instruction.
+//! err = a.mov(x86::eax, x86::al);
+//! printf("Status: %s\n", DebugUtils::error_as_string(err));
+//!
+//! // Invalid instruction.
+//! err = a.emit(x86::Inst::kIdMovss, x86::eax, x86::xmm0);
+//! printf("Status: %s\n", DebugUtils::error_as_string(err));
+//!
+//! // Ambiguous operand size - the pointer requires size.
+//! err = a.inc(x86::ptr(x86::rax));
+//! printf("Status: %s\n", DebugUtils::error_as_string(err));
+//!
+//! return 0;
+//! }
+//! ```
+//!
+//! ### Native Registers
+//!
+//! All emitters provide functions to construct machine-size registers depending on the target. This feature is
+//! for users that want to write code targeting both 32-bit and 64-bit architectures at the same time. In AsmJit
+//! terminology such registers have prefix `z`, so for example on X86 architecture the following native registers
+//! are provided:
+//!
+//! - `zax` - mapped to either `eax` or `rax`
+//! - `zbx` - mapped to either `ebx` or `rbx`
+//! - `zcx` - mapped to either `ecx` or `rcx`
+//! - `zdx` - mapped to either `edx` or `rdx`
+//! - `zsp` - mapped to either `esp` or `rsp`
+//! - `zbp` - mapped to either `ebp` or `rbp`
+//! - `zsi` - mapped to either `esi` or `rsi`
+//! - `zdi` - mapped to either `edi` or `rdi`
+//!
+//! They are accessible through \ref x86::Assembler, \ref x86::Builder, and \ref x86::Compiler. The example below
+//! illustrates how to use this feature:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! using Func = int (*)(void);
+//!
+//! int main(int argc, char* argv[]) {
+//! JitRuntime rt; // Create a runtime specialized for JIT.
+//! CodeHolder code; // Create a CodeHolder.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
+//!
+//! // Let's get these registers from x86::Assembler.
+//! x86::Gp zbp = a.zbp();
+//! x86::Gp zsp = a.zsp();
+//!
+//! int stack_size = 32;
+//!
+//! // Function prolog.
+//! a.push(zbp);
+//! a.mov(zbp, zsp);
+//! a.sub(zsp, stack_size);
+//!
+//! // ... emit some code (this just sets return value to zero) ...
+//! a.xor_(x86::eax, x86::eax);
+//!
+//! // Function epilog and return.
+//! a.mov(zsp, zbp);
+//! a.pop(zbp);
+//! a.ret();
+//!
+//! // To make the example complete let's call it.
+//! Func fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//!
+//! int result = fn(); // Execute the generated code.
+//! printf("%d\n", result); // Print the resulting "0".
+//!
+//! rt.release(fn); // Remove the function from the runtime.
+//! return 0;
+//! }
+//! ```
+//!
+//! The example just returns `0`, but the function generated contains a standard prolog and epilog sequence and the
+//! function itself reserves 32 bytes of local stack. The advantage is clear - a single code-base can handle multiple
+//! targets easily. If you want to create a register of native size dynamically by specifying its id it's also possible:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! using namespace asmjit;
+//!
+//! void example(x86::Assembler& a) {
+//! x86::Gp zax = a.gpz(x86::Gp::kIdAx);
+//! x86::Gp zbx = a.gpz(x86::Gp::kIdBx);
+//! x86::Gp zcx = a.gpz(x86::Gp::kIdCx);
+//! x86::Gp zdx = a.gpz(x86::Gp::kIdDx);
+//!
+//! // You can also change register's id easily.
+//! x86::Gp zsp = zax;
+//! zsp.set_id(4); // or x86::Gp::kIdSp.
+//! }
+//! ```
+//!
+//! ### Data Embedding
+//!
+//! x86::Assembler extends the standard \ref BaseAssembler with X86/X64 specific conventions that are often used by
+//! assemblers to embed data next to the code. The following functions can be used to embed data:
+//!
+//! - \ref BaseAssembler::embed_int8() - embeds int8_t (portable naming).
+//! - \ref BaseAssembler::embed_uint8() - embeds uint8_t (portable naming).
+//! - \ref BaseAssembler::embed_int16() - embeds int16_t (portable naming).
+//! - \ref BaseAssembler::embed_uint16() - embeds uint16_t (portable naming).
+//! - \ref BaseAssembler::embed_int32() - embeds int32_t (portable naming).
+//! - \ref BaseAssembler::embed_uint32() - embeds uint32_t (portable naming).
+//! - \ref BaseAssembler::embed_int64() - embeds int64_t (portable naming).
+//! - \ref BaseAssembler::embed_uint64() - embeds uint64_t (portable naming).
+//! - \ref BaseAssembler::embed_float() - embeds float (portable naming).
+//! - \ref BaseAssembler::embed_double() - embeds double (portable naming).
+//!
+//! - \ref x86::Assembler::db() - embeds byte (8 bits) (x86 naming).
+//! - \ref x86::Assembler::dw() - embeds word (16 bits) (x86 naming).
+//! - \ref x86::Assembler::dd() - embeds dword (32 bits) (x86 naming).
+//! - \ref x86::Assembler::dq() - embeds qword (64 bits) (x86 naming).
+//!
+//! The following example illustrates how embed works:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! using namespace asmjit;
+//!
+//! void embed_data(x86::Assembler& a) {
+//! a.db(0xFF); // Embeds 0xFF byte.
+//! a.dw(0xFF00); // Embeds 0xFF00 word (little-endian).
+//! a.dd(0xFF000000) ; // Embeds 0xFF000000 dword (little-endian).
+//! a.embed_float(0.4f); // Embeds 0.4f (32-bit float, little-endian).
+//! }
+//! ```
+//!
+//! Sometimes it's required to read the data that is embedded after code, for example. This can be done through
+//! \ref Label as shown below:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! using namespace asmjit;
+//!
+//! void process_data(x86::Assembler& a, const Label& L_Data) {
+//! x86::Gp addr = a.zax(); // EAX or RAX.
+//! x86::Gp val = x86::edi; // Where to store some value...
+//!
+//! // Approach 1 - Load the address to register through LEA. This approach
+//! // is flexible as the address can be then manipulated, for
+//! // example if you have a data array, which would need index.
+//! a.lea(addr, x86::ptr(L_Data));
+//! a.mov(val, x86::dword_ptr(addr));
+//!
+//! // Approach 2 - Load the data directly by using L_Data in address. It's
+//! // worth noting that this doesn't work with indexes in X64
+//! // mode. It will use absolute address in 32-bit mode and
+//! // relative address (RIP) in 64-bit mode.
+//! a.mov(val, x86::dword_ptr(L_Data));
+//! }
+//! ```
+//!
+//! ### Label Embedding
+//!
+//! It's also possible to embed labels. In general AsmJit provides the following options:
+//!
+//! - \ref BaseEmitter::embed_label() - Embeds absolute address of a label. This is target dependent and would
+//! embed either 32-bit or 64-bit data that embeds absolute label address. This kind of embedding cannot be
+//! used in a position independent code.
+//!
+//! - \ref BaseEmitter::embed_label_delta() - Embeds a difference between two labels. The size of the difference
+//! can be specified so it's possible to embed 8-bit, 16-bit, 32-bit, and 64-bit difference, which is sufficient
+//! for most purposes.
+//!
+//! The following example demonstrates how to embed labels and their differences:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! using namespace asmjit;
+//!
+//! void embed_label(x86::Assembler& a, const Label& L_Data) {
+//! // [1] Embed L_Data - the size of the data will be dependent on the target.
+//! a.embed_label(L_Data);
+//!
+//! // [2] Embed a 32-bit difference of two labels.
+//! Label L_Here = a.new_label();
+//! a.bind(L_Here);
+//! // Embeds int32_t(L_Data - L_Here).
+//! a.embed_label_delta(L_Data, L_Here, 4);
+//! }
+//! ```
+//!
+//! ### Using FuncFrame and FuncDetail with x86::Assembler
+//!
+//! The example below demonstrates how \ref FuncFrame and \ref FuncDetail can be used together with \ref x86::Assembler
+//! to generate a function that will use platform dependent calling conventions automatically depending on the target:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! using SumIntsFunc = void (*)(int* dst, const int* a, const int* b);
+//!
+//! int main(int argc, char* argv[]) {
+//! JitRuntime rt; // Create JIT Runtime.
+//! CodeHolder code; // Create a CodeHolder.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
+//!
+//! // Decide which registers will be mapped to function arguments. Try changing
+//! // registers of dst, src_a, and src_b and see what happens in function's
+//! // prolog and epilog.
+//! x86::Gp dst = a.zax();
+//! x86::Gp src_a = a.zcx();
+//! x86::Gp src_b = a.zdx();
+//!
+//! x86::Vec vec0 = x86::xmm0;
+//! x86::Vec vec1 = x86::xmm1;
+//!
+//! // Create/initialize FuncDetail and FuncFrame.
+//! FuncDetail func;
+//! func.init(FuncSignature::build<void, int*, const int*, const int*>(),
+//! rt.environment());
+//!
+//! FuncFrame frame;
+//! frame.init(func);
+//!
+//! // Make XMM0 and XMM1 dirty - RegGroup::kVec describes XMM|YMM|ZMM registers.
+//! frame.set_dirty_regs(RegGroup::kVec, Support::bit_mask<RegMask>(0, 1));
+//!
+//! // Alternatively, if you don't want to use register masks you can pass Reg
+//! // to add_dirty_regs(). The following code would add both xmm0 and xmm1.
+//! frame.add_dirty_regs(x86::xmm0, x86::xmm1);
+//!
+//! FuncArgsAssignment args(&func); // Create arguments assignment context.
+//! args.assign_all(dst, src_a, src_b); // Assign our registers to arguments.
+//! args.update_func_frame(frame); // Reflect our args in FuncFrame.
+//! frame.finalize(); // Finalize the FuncFrame (updates it).
+//!
+//! a.emit_prolog(frame); // Emit function prolog.
+//! a.emit_args_assignment(frame, args);// Assign arguments to registers.
+//! a.movdqu(vec0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
+//! a.movdqu(vec1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
+//! a.paddd(vec0, vec1); // Add 4 ints in XMM1 to XMM0.
+//! a.movdqu(x86::ptr(dst), vec0); // Store the result to [dst].
+//! a.emit_epilog(frame); // Emit function epilog and return.
+//!
+//! SumIntsFunc fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error case.
+//! }
+//!
+//! // Execute the generated function.
+//! int in_a[4] = { 4, 3, 2, 1 };
+//! int in_b[4] = { 1, 5, 2, 8 };
+//! int out[4];
+//! fn(out, in_a, in_b);
+//!
+//! // Prints {5 8 4 9}
+//! printf("{%d %d %d %d}\n", out[0], out[1], out[2], out[3]);
+//!
+//! rt.release(fn);
+//! return 0;
+//! }
+//! ```
+//!
+//! ### Using x86::Assembler as Code-Patcher
+//!
+//! This is an advanced topic that is sometimes unavoidable. AsmJit by default appends machine code it generates
+//! into a \ref CodeBuffer, however, it also allows to set the offset in \ref CodeBuffer explicitly and to overwrite
+//! its content. This technique is extremely dangerous as X86 instructions have variable length (see below), so you
+//! should in general only patch code to change instruction's immediate values or some other details not known the
+//! at a time the instruction was emitted. A typical scenario that requires code-patching is when you start emitting
+//! function and you don't know how much stack you want to reserve for it.
+//!
+//! Before we go further it's important to introduce instruction options, because they can help with code-patching
+//! (and not only patching, but that will be explained in AVX-512 section):
+//!
+//! - Many general-purpose instructions (especially arithmetic ones) on X86 have multiple encodings - in AsmJit
+//! this is usually called 'short form' and 'long form'.
+//!
+//! - AsmJit always tries to use 'short form' as it makes the resulting machine-code smaller, which is always
+//! good - this decision is used by majority of assemblers out there.
+//!
+//! - AsmJit allows to override the default decision by using `short_()` and `long_()` instruction options to force
+//! short or long form, respectively. The most useful is `long_()` as it basically forces AsmJit to always emit
+//! the longest form. The `short_()` is not that useful as it's automatic (except jumps to non-bound labels). Note
+//! that the underscore after each function name avoids collision with built-in C++ types.
+//!
+//! To illustrate what short form and long form means in binary let's assume we want to emit "add esp, 16" instruction,
+//! which has two possible binary encodings:
+//!
+//! - `83C410` - This is a short form aka `short add esp, 16` - You can see opcode byte (0x8C), MOD/RM byte (0xC4)
+//! and an 8-bit immediate value representing `16`.
+//!
+//! - `81C410000000` - This is a long form aka `long add esp, 16` - You can see a different opcode byte (0x81), the
+//! same Mod/RM byte (0xC4) and a 32-bit immediate in little-endian representing `16`.
+//!
+//! It should be obvious that patching an existing instruction into an instruction having a different size may create
+//! various problems. So it's recommended to be careful and to only patch instructions into instructions having the
+//! same size. The example below demonstrates how instruction options can be used to guarantee the size of an
+//! instruction by forcing the assembler to use long-form encoding:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main(int argc, char* argv[]) {
+//! using Func = int (*)(void);
+//!
+//! JitRuntime rt; // Create a runtime specialized for JIT.
+//! CodeHolder code; // Create a CodeHolder.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
+//!
+//! // Let's get these registers from x86::Assembler.
+//! x86::Gp zbp = a.zbp();
+//! x86::Gp zsp = a.zsp();
+//!
+//! // Function prolog.
+//! a.push(zbp);
+//! a.mov(zbp, zsp);
+//!
+//! // This is where we are gonna patch the code later, so let's get the offset
+//! // (the current location) from the beginning of the code-buffer.
+//! size_t patch_offset = a.offset();
+//! // Let's just emit 'sub zsp, 0' for now, but don't forget to use LONG form.
+//! a.long_().sub(zsp, 0);
+//!
+//! // ... emit some code (this just sets return value to zero) ...
+//! a.xor_(x86::eax, x86::eax);
+//!
+//! // Function epilog and return.
+//! a.mov(zsp, zbp);
+//! a.pop(zbp);
+//! a.ret();
+//!
+//! // Now we know how much stack size we want to reserve. I have chosen 128
+//! // bytes on purpose as it's encodable only in long form that we have used.
+//!
+//! int stack_size = 128; // Number of bytes to reserve on the stack.
+//! a.set_offset(patch_offset); // Move the current cursor to `patch_offset`.
+//! a.long_().sub(zsp, stack_size); // Patch the code; don't forget to use LONG form.
+//!
+//! // Now the code is ready to be called
+//! Func fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//!
+//! int result = fn(); // Execute the generated code.
+//! printf("%d\n", result); // Print the resulting "0".
+//!
+//! rt.release(fn); // Remove the function from the runtime.
+//! return 0;
+//! }
+//! ```
+//!
+//! If you run the example it will just work, because both instructions have the same size. As an experiment you can
+//! try removing `long_()` form to see what happens when wrong code is generated.
+//!
+//! ### Code Patching and REX Prefix
+//!
+//! In 64-bit mode there is one more thing to worry about when patching code: REX prefix. It's a single byte prefix
+//! designed to address registers with ids from 9 to 15 and to override the default width of operation from 32 to 64
+//! bits. AsmJit, like other assemblers, only emits REX prefix when it's necessary. If the patched code only changes
+//! the immediate value as shown in the previous example then there is nothing to worry about as it doesn't change
+//! the logic behind emitting REX prefix, however, if the patched code changes register id or overrides the operation
+//! width then it's important to take care of REX prefix as well.
+//!
+//! AsmJit contains another instruction option that controls (forces) REX prefix - `rex()`. If you use it the
+//! instruction emitted will always use REX prefix even when it's encodable without it. The following list contains
+//! some instructions and their binary representations to illustrate when it's emitted:
+//!
+//! - `__83C410` - `add esp, 16` - 32-bit operation in 64-bit mode doesn't require REX prefix.
+//! - `4083C410` - `rex add esp, 16` - 32-bit operation in 64-bit mode with forced REX prefix (0x40).
+//! - `4883C410` - `add rsp, 16` - 64-bit operation in 64-bit mode requires REX prefix (0x48).
+//! - `4183C410` - `add r12d, 16` - 32-bit operation in 64-bit mode using R12D requires REX prefix (0x41).
+//! - `4983C410` - `add r12, 16` - 64-bit operation in 64-bit mode using R12 requires REX prefix (0x49).
+//!
+//! ### More Prefixes
+//!
+//! X86 architecture is known for its prefixes. AsmJit supports all prefixes
+//! that can affect how the instruction is encoded:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! void prefixes_example(x86::Assembler& a) {
+//! // Lock prefix for implementing atomics:
+//! // lock add dword ptr [rdi], 1
+//! a.lock().add(x86::dword_ptr(x86::rdi), 1);
+//!
+//! // Similarly, XAcquire/XRelease prefixes are also available:
+//! // xacquire add dword ptr [rdi], 1
+//! a.xacquire().add(x86::dword_ptr(x86::rdi), 1);
+//!
+//! // Rep prefix (see also repe/repz and repne/repnz):
+//! // rep movs byte ptr [rdi], byte ptr [rsi]
+//! a.rep().movs(x86::byte_ptr(x86::rdi), x86::byte_ptr(x86::rsi));
+//!
+//! // Forcing REX prefix in 64-bit mode.
+//! // rex mov eax, 1
+//! a.rex().mov(x86::eax, 1);
+//!
+//! // AVX instruction without forced prefix uses the shortest encoding:
+//! // vaddpd xmm0, xmm1, xmm2 -> [C5|F1|58|C2]
+//! a.vaddpd(x86::xmm0, x86::xmm1, x86::xmm2);
+//!
+//! // Forcing VEX3 prefix (AVX):
+//! // vex3 vaddpd xmm0, xmm1, xmm2 -> [C4|E1|71|58|C2]
+//! a.vex3().vaddpd(x86::xmm0, x86::xmm1, x86::xmm2);
+//!
+//! // Forcing EVEX prefix (AVX512):
+//! // evex vaddpd xmm0, xmm1, xmm2 -> [62|F1|F5|08|58|C2]
+//! a.evex().vaddpd(x86::xmm0, x86::xmm1, x86::xmm2);
+//!
+//! // Some instructions accept prefixes not originally intended to:
+//! // rep ret
+//! a.rep().ret();
+//! }
+//! ```
+//!
+//! It's important to understand that prefixes are part of instruction options. When a member function that involves
+//! adding a prefix is called the prefix is combined with existing instruction options, which will affect the next
+//! instruction generated.
+//!
+//! ### Generating AVX512 Code
+//!
+//! x86::Assembler can generate AVX512+ code including the use of opmask registers. Opmask can be specified through
+//! \ref x86::Assembler::k() function, which stores it as an extra register, which will be used by the next
+//! instruction. AsmJit uses such concept for manipulating instruction options as well.
+//!
+//! The following AVX512 features are supported:
+//!
+//! - Opmask selector {k} and zeroing {z}.
+//! - Rounding modes {rn|rd|ru|rz} and suppress-all-exceptions {sae} option.
+//! - AVX512 broadcasts {1toN}.
+//!
+//! The following example demonstrates how AVX512 features can be used:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! void generate_avx512_code(x86::Assembler& a) {
+//! using namespace x86;
+//!
+//! // Opmask Selectors
+//! // ----------------
+//! //
+//! // - Opmask / zeroing is part of the instruction options / extra_reg.
+//! // - k(reg) is like {kreg} in Intel syntax.
+//! // - z() is like {z} in Intel syntax.
+//!
+//! // vaddpd zmm {k1} {z}, zmm1, zmm2
+//! a.k(k1).z().vaddpd(zmm0, zmm1, zmm2);
+//!
+//! // Memory Broadcasts
+//! // -----------------
+//! //
+//! // - Broadcast data is part of memory operand.
+//! // - Use x86::Mem::_1to2(), x86::Mem::_1to4(), etc..., which returns a new x86::Mem operand with broadcast.
+//!
+//! // vaddpd zmm0 {k1} {z}, zmm1, [rcx] {1to8}
+//! a.k(k1).z().vaddpd(zmm0, zmm1, x86::ptr(rcx)._1to8());
+//!
+//! // Embedded Rounding & Suppress-All-Exceptions
+//! // -------------------------------------------
+//! //
+//! // - Rounding mode and {sae} are part of instruction options.
+//! // - Use sae() to enable exception suppression.
+//! // - Use rn_sae(), rd_sae(), ru_sae(), and rz_sae() - to enable rounding.
+//! // - Embedded rounding implicitly sets {sae} as well, that's why the API
+//! // also has sae() suffix, to make it clear.
+//!
+//! // vcmppd k1, zmm1, zmm2, 0x00 {sae}
+//! a.sae().vcmppd(k1, zmm1, zmm2, 0);
+//!
+//! // vaddpd zmm0, zmm1, zmm2 {rz}
+//! a.rz_sae().vaddpd(zmm0, zmm1, zmm2);
+//! }
+//! ```
+class ASMJIT_VIRTAPI Assembler
+ : public BaseAssembler,
+ public EmitterImplicitT<Assembler> {
+public:
+ ASMJIT_NONCOPYABLE(Assembler)
+ using Base = BaseAssembler;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Assembler(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API ~Assembler() noexcept override;
+
+ //! \}
+
+ //! \cond INTERNAL
+ //! \name Internal
+ //! \{
+
+ // NOTE: x86::Assembler uses _private_data to store 'address-override' bit that is used to decide whether to emit
+ // address-override (67H) prefix based on the memory BASE+INDEX registers. It's either `kX86MemInfo_67H_X86` or
+ // `kX86MemInfo_67H_X64`.
+ ASMJIT_INLINE_NODEBUG uint32_t _address_override_mask() const noexcept { return _private_data; }
+ ASMJIT_INLINE_NODEBUG void _set_address_override_mask(uint32_t m) noexcept { _private_data = m; }
+
+ //! \}
+ //! \endcond
+
+ //! \cond INTERNAL
+ //! \name Emit
+ //! \{
+
+ ASMJIT_API Error _emit(InstId inst_id, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* op_ext) override;
+
+ //! \}
+ //! \endcond
+
+ //! \name Align
+ //! \{
+
+ ASMJIT_API Error align(AlignMode align_mode, uint32_t alignment) override;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86builder.cpp b/3rdparty/asmjit/asmjit/x86/x86builder.cpp
new file mode 100644
index 00000000000..d7df46593ec
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86builder.cpp
@@ -0,0 +1,58 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_BUILDER)
+
+#include <asmjit/x86/x86assembler.h>
+#include <asmjit/x86/x86builder.h>
+#include <asmjit/x86/x86emithelper_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::Builder - Construction & Destruction
+// =========================================
+
+Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
+ _arch_mask = (uint64_t(1) << uint32_t(Arch::kX86)) |
+ (uint64_t(1) << uint32_t(Arch::kX64)) ;
+ init_emitter_funcs(this);
+
+ if (code) {
+ code->attach(this);
+ }
+}
+Builder::~Builder() noexcept {}
+
+// x86::Builder - Events
+// =====================
+
+Error Builder::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+
+ _instruction_alignment = uint8_t(1);
+ update_emitter_funcs(this);
+
+ return Error::kOk;
+}
+
+Error Builder::on_detach(CodeHolder& code) noexcept {
+ return Base::on_detach(code);
+}
+
+// x86::Builder - Finalize
+// =======================
+
+Error Builder::finalize() {
+ ASMJIT_PROPAGATE(run_passes());
+ Assembler a(_code);
+ a.add_encoding_options(encoding_options());
+ a.add_diagnostic_options(diagnostic_options());
+ return serialize_to(&a);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/asmjit/x86/x86builder.h b/3rdparty/asmjit/asmjit/x86/x86builder.h
new file mode 100644
index 00000000000..985e3a116f6
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86builder.h
@@ -0,0 +1,354 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86BUILDER_H_INCLUDED
+#define ASMJIT_X86_X86BUILDER_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_BUILDER
+
+#include <asmjit/core/builder.h>
+#include <asmjit/x86/x86emitter.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86/X64 builder implementation.
+//!
+//! The code representation used by \ref BaseBuilder is compatible with everything AsmJit provides. Each instruction
+//! is stored as \ref InstNode, which contains instruction id, options, and operands. Each instruction emitted will
+//! create a new \ref InstNode instance and add it to the current cursor in the double-linked list of nodes. Since
+//! the instruction stream used by \ref BaseBuilder can be manipulated, we can rewrite the SumInts example from
+//! \ref asmjit_assembler into the following:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! // Small helper function to print the current content of `cb`.
+//! static void dump_code(BaseBuilder& builder, const char* phase) {
+//! String sb;
+//! format_options format_options {};
+//!
+//! Formatter::format_node_list(sb, format_options, &builder);
+//! printf("%s:\n%s\n", phase, sb.data());
+//! }
+//!
+//! int main() {
+//! using SumIntsFunc = void (*)(int* dst, const int* a, const int* b);
+//!
+//! JitRuntime rt; // Create JIT Runtime.
+//! CodeHolder code; // Create a CodeHolder.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Builder cb(&code); // Create and attach x86::Builder to `code`.
+//!
+//! // Decide which registers will be mapped to function arguments. Try changing registers
+//! // of `dst`, `src_a`, and `src_b` and see what happens in function's prolog and epilog.
+//! x86::Gp dst = cb.zax();
+//! x86::Gp src_a = cb.zcx();
+//! x86::Gp src_b = cb.zdx();
+//!
+//! X86::Vec vec0 = x86::xmm0;
+//! X86::Vec vec1 = x86::xmm1;
+//!
+//! // Create and initialize `FuncDetail`.
+//! FuncDetail func;
+//! func.init(FuncSignature::build<void, int*, const int*, const int*>());
+//!
+//! // Remember prolog insertion point.
+//! BaseNode* prolog_insertion_point = cb.cursor();
+//!
+//! // Emit function body:
+//! cb.movdqu(vec0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
+//! cb.movdqu(vec1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
+//! cb.paddd(vec0, vec1); // Add 4 ints in XMM1 to XMM0.
+//! cb.movdqu(x86::ptr(dst), vec0); // Store the result to [dst].
+//!
+//! // Remember epilog insertion point.
+//! BaseNode* epilog_insertion_point = cb.cursor();
+//!
+//! // Let's see what we have now.
+//! dump_code(cb, "Raw Function");
+//!
+//! // Now, after we emitted the function body, we can insert the prolog, arguments
+//! // allocation, and epilog. This is not possible with using pure x86::Assembler.
+//! FuncFrame frame;
+//! frame.init(func);
+//!
+//! // Make XMM0 and XMM1 dirty; RegGroup::kVec describes XMM|YMM|ZMM registers.
+//! frame.set_dirty_regs(RegGroup::kVec, IntUtils::mask(0, 1));
+//!
+//! FuncArgsAssignment args(&func); // Create arguments assignment context.
+//! args.assign_all(dst, src_a, src_b); // Assign our registers to arguments.
+//! args.update_func_frame(frame); // Reflect our args in FuncFrame.
+//! frame.finalize(); // Finalize the FuncFrame (updates it).
+//!
+//! // Insert function prolog and allocate arguments to registers.
+//! cb.set_cursor(prolog_insertion_point);
+//! cb.emit_prolog(frame);
+//! cb.emit_args_assignment(frame, args);
+//!
+//! // Insert function epilog.
+//! cb.set_cursor(epilog_insertion_point);
+//! cb.emit_epilog(frame);
+//!
+//! // Let's see how the function's prolog and epilog looks.
+//! dump_code(cb, "Prolog & Epilog");
+//!
+//! // IMPORTANT: Builder requires finalize() to be called to serialize its
+//! // code to the Assembler (it automatically creates one if not attached).
+//! cb.finalize();
+//!
+//! SumIntsFunc fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error case.
+//! }
+//!
+//! // Execute the generated function.
+//! int in_a[4] = { 4, 3, 2, 1 };
+//! int in_b[4] = { 1, 5, 2, 8 };
+//! int out[4];
+//! fn(out, in_a, in_b);
+//!
+//! // Prints {5 8 4 9}
+//! printf("{%d %d %d %d}\n", out[0], out[1], out[2], out[3]);
+//!
+//! rt.release(fn); // Explicitly remove the function from the runtime.
+//! return 0;
+//! }
+//! ```
+//!
+//! When the example is executed it should output the following (this one using AMD64-SystemV ABI):
+//!
+//! ```
+//! Raw Function:
+//! movdqu xmm0, [rcx]
+//! movdqu xmm1, [rdx]
+//! paddd xmm0, xmm1
+//! movdqu [rax], xmm0
+//!
+//! Prolog & Epilog:
+//! mov rax, rdi
+//! mov rcx, rsi
+//! movdqu xmm0, [rcx]
+//! movdqu xmm1, [rdx]
+//! paddd xmm0, xmm1
+//! movdqu [rax], xmm0
+//! ret
+//!
+//! {5 8 4 9}
+//! ```
+//!
+//! The number of use-cases of \ref BaseBuilder is not limited and highly depends on your creativity and experience.
+//! The previous example can be easily improved to collect all dirty registers inside the function programmatically
+//! and to pass them to \ref FuncFrame::set_dirty_regs().
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! // NOTE: This function doesn't cover all possible constructs. It ignores instructions that write
+//! // to implicit registers that are not part of the operand list. It also counts read-only registers.
+//! // Real implementation would be a bit more complicated, but still relatively easy to implement.
+//! static void collect_dirty_regs(const BaseNode* first,
+//! const BaseNode* last,
+//! Support::Array<RegMask, Globals::kNumVirtGroups>& reg_mask) {
+//! const BaseNode* node = first;
+//! while (node) {
+//! if (node->is_inst()) {
+//! for (Operand& op : node->as<InstNode>()->operands()) {
+//! if (op.is_reg()) {
+//! const Reg& reg = op.as<Reg>();
+//! if (reg.group() <= RegGroup::kMaxVirt) {
+//! reg_mask[reg.group()] |= 1u << reg.id();
+//! }
+//! }
+//! }
+//! }
+//!
+//! if (node == last) {
+//! break;
+//! }
+//! node = node->next();
+//! }
+//! }
+//!
+//! static void set_dirty_regs_of_func_frame(const x86::Builder& builder, FuncFrame& frame) {
+//! Support::Array<RegMask, Globals::kNumVirtGroups> reg_mask {};
+//! collect_dirty_regs(builder.first_node(), builder.last_node(), reg_mask);
+//!
+//! // X86/X64 ABIs only require to save GP/XMM registers:
+//! frame.set_dirty_regs(RegGroup::kGp, reg_mask[RegGroup::kGp]);
+//! frame.set_dirty_regs(RegGroup::kVec, reg_mask[RegGroup::kVec]);
+//! }
+//! ```
+//!
+//! ### Casting Between Various Emitters
+//!
+//! Even when \ref BaseAssembler and \ref BaseBuilder provide the same interface as defined by \ref BaseEmitter their
+//! platform dependent variants like \ref x86::Assembler and \ref x86::Builder cannot be interchanged or casted to each
+//! other by using a C++ `static_cast<>`. The main reason is the inheritance graph of these classes is different and
+//! cast-incompatible, as illustrated below:
+//!
+//! ```
+//! +--------------+ +=========================+
+//! +----------------------->| x86::Emitter |<--+--# x86::EmitterImplicitT<> #<--+
+//! | +--------------+ | +=========================+ |
+//! | (abstract) | (mixin) |
+//! | +--------------+ +~~~~~~~~~~~~~~+ | |
+//! +-->| BaseAssembler|---->|x86::Assembler|<--+ |
+//! | +--------------+ +~~~~~~~~~~~~~~+ | |
+//! | (abstract) (final) | |
+//! +===============+ | +--------------+ +~~~~~~~~~~~~~~+ | |
+//! # BaseEmitter #--+-->| BaseBuilder |--+->| x86::Builder |<--+ |
+//! +===============+ +--------------+ | +~~~~~~~~~~~~~~+ |
+//! (abstract) (abstract) | (final) |
+//! +---------------------+ |
+//! | |
+//! | +--------------+ +~~~~~~~~~~~~~~+ +=========================+ |
+//! +-->| BaseCompiler |---->| x86::Compiler|<-----# x86::EmitterExplicitT<> #---+
+//! +--------------+ +~~~~~~~~~~~~~~+ +=========================+
+//! (abstract) (final) (mixin)
+//! ```
+//!
+//! The graph basically shows that it's not possible to cast between \ref x86::Assembler and \ref x86::Builder.
+//! However, since both share the base interface (\ref BaseEmitter) it's possible to cast them to a class that
+//! cannot be instantiated, but defines the same interface - the class is called \ref x86::Emitter and was
+//! introduced to make it possible to write a function that can emit to both \ref x86::Assembler and \ref
+//! x86::Builder. Note that \ref x86::Emitter cannot be created, it's abstract and has private constructors and
+//! destructors; it was only designed to be casted to and used as an interface.
+//!
+//! Each architecture-specific emitter implements a member function called
+//! `as<arch::Emitter>()`, which casts the instance to the architecture
+//! specific emitter as illustrated below:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! static void emit_something(x86::Emitter* e) {
+//! e->mov(x86::eax, x86::ebx);
+//! }
+//!
+//! static void assemble(CodeHolder& code, bool use_asm) {
+//! if (use_asm) {
+//! x86::Assembler assembler(&code);
+//! emit_something(assembler.as<x86::Emitter>());
+//! }
+//! else {
+//! x86::Builder builder(&code);
+//! emit_something(builder.as<x86::Emitter>());
+//!
+//! // NOTE: Builder requires `finalize()` to be called to serialize its
+//! // content to Assembler (it automatically creates one if not attached).
+//! builder.finalize();
+//! }
+//! }
+//! ```
+//!
+//! The example above shows how to create a function that can emit code to either \ref x86::Assembler or \ref
+//! x86::Builder through \ref x86::Emitter, which provides emitter-neutral functionality. \ref x86::Emitter,
+//! however, doesn't provide any emitter-specific functionality like `set_cursor()`.
+//!
+//! ### Code Injection and Manipulation
+//!
+//! \ref BaseBuilder emitter stores its nodes in a double-linked list, which makes it easy to manipulate that
+//! list during the code generation or afterwards. Each node is always emitted next to the current cursor and
+//! the cursor is advanced to that newly emitted node. The cursor can be retrieved and changed by \ref
+//! BaseBuilder::cursor() and \ref BaseBuilder::set_cursor(), respectively.
+//!
+//! The example below demonstrates how to remember a node and inject something
+//! next to it.
+//!
+//! ```
+//! static void example(x86::Builder& builder) {
+//! // Emit something, after it returns the cursor would point at the last
+//! // emitted node.
+//! builder.mov(x86::rax, x86::rdx); // [1]
+//!
+//! // We can retrieve the node.
+//! BaseNode* node = builder.cursor();
+//!
+//! // Change the instruction we just emitted, just for fun...
+//! if (node->is_inst()) {
+//! InstNode* inst = node->as<InstNode>();
+//! // Changes the operands at index [1] to RCX.
+//! inst->set_op(1, x86::rcx);
+//! }
+//!
+//! // ------------------------- Generate Some Code -------------------------
+//! builder.add(x86::rax, x86::rdx); // [2]
+//! builder.shr(x86::rax, 3); // [3]
+//! // ----------------------------------------------------------------------
+//!
+//! // Now, we know where our node is, and we can simply change the cursor
+//! // and start emitting something after it. The set_cursor() function
+//! // returns the previous cursor, and it's always a good practice to remember
+//! // it, because you never know if you are not already injecting the code
+//! // somewhere else...
+//! BaseNode* old_cursor = builder.set_cursor(node);
+//!
+//! builder.mul(x86::rax, 8); // [4]
+//!
+//! // Restore the cursor
+//! builder.set_cursor(old_cursor);
+//! }
+//! ```
+//!
+//! The function above would actually emit the following:
+//!
+//! ```
+//! mov rax, rcx ; [1] Patched at the beginning.
+//! mul rax, 8 ; [4] Injected.
+//! add rax, rdx ; [2] Followed [1] initially.
+//! shr rax, 3 ; [3] Follows [2].
+//! ```
+class ASMJIT_VIRTAPI Builder
+ : public BaseBuilder,
+ public EmitterImplicitT<Builder> {
+public:
+ ASMJIT_NONCOPYABLE(Builder)
+ using Base = BaseBuilder;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API ~Builder() noexcept override;
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+
+ //! \}
+
+ //! \name Finalize
+ //! \{
+
+ ASMJIT_API Error finalize() override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_BUILDER
+#endif // ASMJIT_X86_X86BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86compiler.cpp b/3rdparty/asmjit/asmjit/x86/x86compiler.cpp
new file mode 100644
index 00000000000..bf8fb54ff57
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86compiler.cpp
@@ -0,0 +1,73 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
+
+#include <asmjit/x86/x86assembler.h>
+#include <asmjit/x86/x86compiler.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/x86/x86rapass_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::Compiler - Construction & Destruction
+// ==========================================
+
+Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
+ _arch_mask = (uint64_t(1) << uint32_t(Arch::kX86)) |
+ (uint64_t(1) << uint32_t(Arch::kX64)) ;
+ init_emitter_funcs(this);
+
+ if (code) {
+ code->attach(this);
+ }
+}
+Compiler::~Compiler() noexcept {}
+
+// x86::Compiler - Events
+// ======================
+
+Error Compiler::on_attach(CodeHolder& code) noexcept {
+ ASMJIT_PROPAGATE(Base::on_attach(code));
+ Error err = add_pass<X86RAPass>();
+
+ if (ASMJIT_UNLIKELY(err != Error::kOk)) {
+ on_detach(code);
+ return err;
+ }
+
+ _instruction_alignment = uint8_t(1);
+ update_emitter_funcs(this);
+
+ return Error::kOk;
+}
+
+Error Compiler::on_detach(CodeHolder& code) noexcept {
+ return Base::on_detach(code);
+}
+
+Error Compiler::on_reinit(CodeHolder& code) noexcept {
+ Error err = Base::on_reinit(code);
+ if (err == Error::kOk) {
+ err = add_pass<X86RAPass>();
+ }
+ return err;
+}
+
+// x86::Compiler - Finalize
+// ========================
+
+Error Compiler::finalize() {
+ ASMJIT_PROPAGATE(run_passes());
+ Assembler a(_code);
+ a.add_encoding_options(encoding_options());
+ a.add_diagnostic_options(diagnostic_options());
+ return serialize_to(&a);
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/x86/x86compiler.h b/3rdparty/asmjit/asmjit/x86/x86compiler.h
new file mode 100644
index 00000000000..c65f785da95
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86compiler.h
@@ -0,0 +1,828 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86COMPILER_H_INCLUDED
+#define ASMJIT_X86_X86COMPILER_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/type.h>
+#include <asmjit/x86/x86emitter.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86/X64 compiler implementation.
+//!
+//! ### Compiler Basics
+//!
+//! The first \ref x86::Compiler example shows how to generate a function that simply returns an integer value. It's
+//! an analogy to the first Assembler example:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! using Func = int (*)(void); // Signature of the generated function.
+//!
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! CodeHolder code; // Holds code and relocation information.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
+//!
+//! cc.add_func(FuncSignature::build<int>());// Begin a function of `int fn(void)` signature.
+//!
+//! x86::Gp virt_reg = cc.new_gp32(); // Create a 32-bit general purpose register.
+//! cc.mov(virt_reg, 1); // Move one to our virtual register `virt_reg`.
+//! cc.ret(virt_reg); // Return `virt_reg` from the function.
+//!
+//! cc.end_func(); // End of the function body.
+//! cc.finalize(); // Translate and assemble the whole 'cc' content.
+//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
+//!
+//! Func fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! int result = fn(); // Execute the generated code.
+//! printf("%d\n", result); // Print the resulting "1".
+//!
+//! rt.release(fn); // Explicitly remove the function from the runtime.
+//! return 0;
+//! }
+//! ```
+//!
+//! The \ref BaseCompiler::add_func() and \ref BaseCompiler::end_func() functions are used to define the function and
+//! its end. Both must be called per function, but the body doesn't have to be generated in sequence. An example of
+//! generating two functions will be shown later. The next example shows more complicated code that contain a loop
+//! and generates a simple memory copy function that uses `uint32_t` items:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! // Signature of the generated function.
+//! using MemCpy32 = void (*)(uint32_t* dst, const uint32_t* src, size_t count);
+//!
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! CodeHolder code; // Holds code and relocation information.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
+//!
+//! FuncNode* func_node = cc.add_func( // Begin the function of the following signature:
+//! FuncSignature::build<void, // Return value - void (no return value).
+//! uint32_t*, // 1st argument - uint32_t* (machine reg-size).
+//! const uint32_t*, // 2nd argument - uint32_t* (machine reg-size).
+//! size_t>()); // 3rd argument - size_t (machine reg-size).
+//!
+//! Label L_Loop = cc.new_label(); // Start of the loop.
+//! Label L_Exit = cc.new_label(); // Used to exit early.
+//!
+//! x86::Gp dst = cc.new_gp_ptr("dst"); // Create `dst` register (destination pointer).
+//! x86::Gp src = cc.new_gp_ptr("src"); // Create `src` register (source pointer).
+//! x86::Gp i = cc.new_gp_ptr("i"); // Create `i` register (loop counter).
+//!
+//! func_node->set_arg(0, dst); // Assign `dst` argument.
+//! func_node->set_arg(1, src); // Assign `src` argument.
+//! func_node->set_arg(2, i); // Assign `i` argument.
+//!
+//! cc.test(i, i); // Early exit if length is zero.
+//! cc.jz(L_Exit);
+//!
+//! cc.bind(L_Loop); // Bind the beginning of the loop here.
+//!
+//! x86::Gp tmp = cc.new_gp32("tmp"); // Copy a single dword (4 bytes).
+//! cc.mov(tmp, x86::dword_ptr(src)); // Load DWORD from [src] address.
+//! cc.mov(x86::dword_ptr(dst), tmp); // Store DWORD to [dst] address.
+//!
+//! cc.add(src, 4); // Increment `src`.
+//! cc.add(dst, 4); // Increment `dst`.
+//!
+//! cc.dec(i); // Loop until `i` is non-zero.
+//! cc.jnz(L_Loop);
+//!
+//! cc.bind(L_Exit); // Label used by early exit.
+//! cc.end_func(); // End of the function body.
+//!
+//! cc.finalize(); // Translate and assemble the whole 'cc' content.
+//!
+//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
+//!
+//! // Add the generated code to the runtime.
+//! MemCpy32 memcpy32;
+//! Error err = rt.add(&memcpy32, &code);
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//!
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! // Test the generated code.
+//! uint32_t input[6] = { 1, 2, 3, 5, 8, 13 };
+//! uint32_t output[6];
+//! memcpy32(output, input, 6);
+//!
+//! for (uint32_t i = 0; i < 6; i++) {
+//! printf("%d\n", output[i]);
+//! }
+//!
+//! rt.release(memcpy32);
+//! return 0;
+//! }
+//! ```
+//!
+//! ### AVX and AVX-512
+//!
+//! AVX and AVX-512 code generation must be explicitly enabled via \ref FuncFrame to work properly. If it's not setup
+//! correctly then Prolog & Epilog would use SSE instead of AVX instructions to work with SIMD registers. In addition,
+//! Compiler requires explicitly enable AVX-512 via \ref FuncFrame in order to use all 32 SIMD registers.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! using Func = void (*)(void*); // Signature of the generated function.
+//!
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! CodeHolder code; // Holds code and relocation information.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
+//!
+//! FuncNode* func_node = cc.add_func(FuncSignature::build<void, void*>());
+//!
+//! // Use the following to enable AVX and/or AVX-512.
+//! func_node->frame().set_avx_enabled();
+//! func_node->frame().set_avx512_enabled();
+//!
+//! // Do something with the input pointer.
+//! x86::Gp addr = cc.new_gp_ptr("addr");
+//! x86::Vec vreg = cc.new_zmm("vreg");
+//!
+//! func_node->set_arg(0, addr);
+//!
+//! cc.vmovdqu32(vreg, x86::ptr(addr));
+//! cc.vpaddq(vreg, vreg, vreg);
+//! cc.vmovdqu32(x86::ptr(addr), vreg);
+//!
+//! cc.end_func(); // End of the function body.
+//! cc.finalize(); // Translate and assemble the whole 'cc' content.
+//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
+//!
+//! Func fn;
+//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! // Execute the generated code and print some output.
+//! uint64_t data[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+//! fn(data);
+//! printf("%llu\n", (unsigned long long)data[0]);
+//!
+//! rt.release(fn); // Explicitly remove the function from the runtime.
+//! return 0;
+//! }
+//! ```
+//!
+//! ### Recursive Functions
+//!
+//! It's possible to create more functions by using the same \ref x86::Compiler instance and make links between them.
+//! In such case it's important to keep the pointer to \ref FuncNode.
+//!
+//! The example below creates a simple Fibonacci function that calls itself recursively:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! using FibFn = uint32_t (*)(uint32_t x); // Signature of the generated function.
+//!
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! CodeHolder code; // Holds code and relocation information.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
+//!
+//! FuncNode* func_node = cc.add_func( // Begin of the Fibonacci function, add_func()
+//! FuncSignature::build<int, int>()); // Returns a pointer to the FuncNode node.
+//!
+//! Label L_Exit = cc.new_label(); // Exit label.
+//! x86::Gp x = cc.new_gp32(); // Function x argument.
+//! x86::Gp y = cc.new_gp32(); // Temporary.
+//!
+//! func_node->set_arg(0, x);
+//!
+//! cc.cmp(x, 3); // Return x if less than 3.
+//! cc.jb(L_Exit);
+//!
+//! cc.mov(y, x); // Make copy of the original x.
+//! cc.dec(x); // Decrease x.
+//!
+//! InvokeNode* invoke_node; // Function invocation:
+//! cc.invoke(Out(invoke_node), // - InvokeNode (output).
+//! func_node->label(), // - Function address or Label.
+//! FuncSignature::build<int, int>()); // - Function signature.
+//!
+//! invoke_node->set_arg(0, x); // Assign x as the first argument.
+//! invoke_node->set_ret(0, x); // Assign x as a return value as well.
+//!
+//! cc.add(x, y); // Combine the return value with y.
+//!
+//! cc.bind(L_Exit);
+//! cc.ret(x); // Return x.
+//! cc.end_func(); // End of the function body.
+//!
+//! cc.finalize(); // Translate and assemble the whole 'cc' content.
+//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
+//!
+//! FibFn fib;
+//! Error err = rt.add(&fib, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! // Test the generated code.
+//! printf("Fib(%u) -> %u\n", 8, fib(8));
+//!
+//! rt.release(fib);
+//! return 0;
+//! }
+//! ```
+//!
+//! ### Stack Management
+//!
+//! Function's stack-frame is managed automatically, which is used by the register allocator to spill virtual
+//! registers. It also provides an interface to allocate user-defined block of the stack, which can be used as
+//! a temporary storage by the generated function. In the following example a stack of 256 bytes size is allocated,
+//! filled by bytes starting from 0 to 255 and then iterated again to sum all the values.
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//! #include <stdio.h>
+//!
+//! using namespace asmjit;
+//!
+//! int main() {
+//! using Func = int (*)(void); // Signature of the generated function.
+//!
+//! JitRuntime rt; // Runtime specialized for JIT code execution.
+//! CodeHolder code; // Holds code and relocation information.
+//!
+//! code.init(rt.environment(), // Initialize code to match the JIT environment.
+//! rt.cpu_features());
+//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
+//!
+//! cc.add_func(FuncSignature::build<int>()); // Create a function that returns int.
+//!
+//! x86::Gp p = cc.new_gp_ptr("p");
+//! x86::Gp i = cc.new_gp_ptr("i");
+//!
+//! // Allocate 256 bytes on the stack aligned to 4 bytes.
+//! x86::Mem stack = cc.new_stack(256, 4);
+//!
+//! x86::Mem stack_idx(stack); // Copy of stack with i added.
+//! stack_idx.set_index(i); // stack_idx <- stack[i].
+//! stack_idx.set_size(1); // stack_idx <- byte ptr stack[i].
+//!
+//! // Load a stack address to `p`. This step is purely optional and shows
+//! // that `lea` is useful to load a memory operands address (even absolute)
+//! // to a general purpose register.
+//! cc.lea(p, stack);
+//!
+//! // Clear i (xor is a C++ keyword, hence 'xor_' is used instead).
+//! cc.xor_(i, i);
+//!
+//! Label L1 = cc.new_label();
+//! Label L2 = cc.new_label();
+//!
+//! cc.bind(L1); // First loop, fill the stack.
+//! cc.mov(stack_idx, i.r8()); // stack[i] = uint8_t(i).
+//!
+//! cc.inc(i); // i++;
+//! cc.cmp(i, 256); // if (i < 256)
+//! cc.jb(L1); // goto L1;
+//!
+//! // Second loop, sum all bytes stored in `stack`.
+//! x86::Gp sum = cc.new_gp32("sum");
+//! x86::Gp val = cc.new_gp32("val");
+//!
+//! cc.xor_(i, i);
+//! cc.xor_(sum, sum);
+//!
+//! cc.bind(L2);
+//!
+//! cc.movzx(val, stack_idx); // val = uint32_t(stack[i]);
+//! cc.add(sum, val); // sum += val;
+//!
+//! cc.inc(i); // i++;
+//! cc.cmp(i, 256); // if (i < 256)
+//! cc.jb(L2); // goto L2;
+//!
+//! cc.ret(sum); // Return the `sum` of all values.
+//! cc.end_func(); // End of the function body.
+//!
+//! cc.finalize(); // Translate and assemble the whole 'cc' content.
+//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
+//!
+//! Func func;
+//! Error err = rt.add(&func, &code); // Add the generated code to the runtime.
+//!
+//! if (err != Error::kOk) {
+//! return 1; // Handle a possible error returned by AsmJit.
+//! }
+//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
+//!
+//! printf("Func() -> %d\n", func()); // Test the generated code.
+//!
+//! rt.release(func);
+//! return 0;
+//! }
+//! ```
+//!
+//! ### Constant Pool
+//!
+//! Compiler provides two constant pools for a general purpose code generation:
+//!
+//! - Local constant pool - Part of \ref FuncNode, can be only used by a single function and added after the
+//! function epilog sequence (after `ret` instruction).
+//!
+//! - Global constant pool - Part of \ref BaseCompiler, flushed at the end of the generated code by \ref
+//! BaseEmitter::finalize().
+//!
+//! The example below illustrates how a built-in constant pool can be used:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! static void example_use_of_const_pool(x86::Compiler& cc) {
+//! cc.add_func(FuncSignature::build<int>());
+//!
+//! x86::Gp v0 = cc.new_gp32("v0");
+//! x86::Gp v1 = cc.new_gp32("v1");
+//!
+//! x86::Mem c0 = cc.new_int32_const(ConstPoolScope::kLocal, 200);
+//! x86::Mem c1 = cc.new_int32_const(ConstPoolScope::kLocal, 33);
+//!
+//! cc.mov(v0, c0);
+//! cc.mov(v1, c1);
+//! cc.add(v0, v1);
+//!
+//! cc.ret(v0);
+//! cc.end_func();
+//! }
+//! ```
+//!
+//! ### Jump Tables
+//!
+//! x86::Compiler supports `jmp` instruction with reg/mem operand, which is a commonly used pattern to implement
+//! indirect jumps within a function, for example to implement `switch()` statement in a programming languages.
+//! By default AsmJit assumes that every basic block can be a possible jump target as it's unable to deduce targets
+//! from instruction's operands. This is a very pessimistic default that should be avoided if possible as it's costly
+//! and very unfriendly to liveness analysis and register allocation.
+//!
+//! Instead of relying on such pessimistic default behavior, let's use \ref JumpAnnotation to annotate a jump where
+//! all targets are known:
+//!
+//! ```
+//! #include <asmjit/x86.h>
+//!
+//! using namespace asmjit;
+//!
+//! static void example_use_of_indirect_jump(x86::Compiler& cc) {
+//! FuncNode* func_node = cc.add_func(FuncSignature::build<float, float, float, uint32_t>());
+//!
+//! // Function arguments
+//! x86::Vec a = cc.new_xmm_ss("a");
+//! x86::Vec b = cc.new_xmm_ss("b");
+//! x86::Gp op = cc.new_gp32("op");
+//!
+//! x86::Gp target = cc.new_gp_ptr("target");
+//! x86::Gp offset = cc.new_gp_ptr("offset");
+//!
+//! Label L_Table = cc.new_label();
+//! Label L_Add = cc.new_label();
+//! Label L_Sub = cc.new_label();
+//! Label L_Mul = cc.new_label();
+//! Label L_Div = cc.new_label();
+//! Label L_End = cc.new_label();
+//!
+//! func_node->set_arg(0, a);
+//! func_node->set_arg(1, b);
+//! func_node->set_arg(2, op);
+//!
+//! // Jump annotation is a building block that allows to annotate all possible targets where `jmp()` can
+//! // jump. It then drives the CFG construction and liveness analysis, which impacts register allocation.
+//! JumpAnnotation* annotation = cc.new_jump_annotation();
+//! annotation->add_label(L_Add);
+//! annotation->add_label(L_Sub);
+//! annotation->add_label(L_Mul);
+//! annotation->add_label(L_Div);
+//!
+//! // Most likely not the common indirect jump approach, but it
+//! // doesn't really matter how final address is calculated. The
+//! // most important path using JumpAnnotation with `jmp()`.
+//! cc.lea(offset, x86::ptr(L_Table));
+//! if (cc.is_64bit())
+//! cc.movsxd(target, x86::dword_ptr(offset, op.clone_as(offset), 2));
+//! else
+//! cc.mov(target, x86::dword_ptr(offset, op.clone_as(offset), 2));
+//! cc.add(target, offset);
+//! cc.jmp(target, annotation);
+//!
+//! // Acts like a switch() statement in C.
+//! cc.bind(L_Add);
+//! cc.addss(a, b);
+//! cc.jmp(L_End);
+//!
+//! cc.bind(L_Sub);
+//! cc.subss(a, b);
+//! cc.jmp(L_End);
+//!
+//! cc.bind(L_Mul);
+//! cc.mulss(a, b);
+//! cc.jmp(L_End);
+//!
+//! cc.bind(L_Div);
+//! cc.divss(a, b);
+//!
+//! cc.bind(L_End);
+//! cc.ret(a);
+//!
+//! cc.end_func();
+//!
+//! // Relative int32_t offsets of `L_XXX - L_Table`.
+//! cc.bind(L_Table);
+//! cc.embed_label_delta(L_Add, L_Table, 4);
+//! cc.embed_label_delta(L_Sub, L_Table, 4);
+//! cc.embed_label_delta(L_Mul, L_Table, 4);
+//! cc.embed_label_delta(L_Div, L_Table, 4);
+//! }
+//! ```
+class ASMJIT_VIRTAPI Compiler
+ : public BaseCompiler,
+ public EmitterExplicitT<Compiler> {
+public:
+ ASMJIT_NONCOPYABLE(Compiler)
+ using Base = BaseCompiler;
+
+ //! \name Construction & Destruction
+ //! \{
+
+ ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept;
+ ASMJIT_API ~Compiler() noexcept override;
+
+ //! \}
+
+ //! \name Virtual Registers
+ //! \{
+
+ //! Creates a new general-purpose register with `type_id` type and optional name passed via `args`.
+ //!
+ //! \note Using \ref TypeId is too generic. In general it's recommended to use \ref new_gp8(),
+ //! \ref new_gp16(), \ref new_gp32(), \ref new_gp64(), and \ref new_gpz() or \ref new_gp_ptr().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp(TypeId type_id, Args&&... args) { return new_reg<Gp>(type_id, std::forward<Args>(args)...); }
+
+ //! Creates a new vector register with `type_id` type and optional name passed via `args`.
+ //!
+ //! \note Using \ref TypeId is too generic. In general it's recommended to use \ref new_vec128(),
+ //! \ref new_vec256(), \ref new_vec512(), or alternatively \ref new_xmm(), \ref new_ymm(), and \ref new_zmm().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec(TypeId type_id, Args&&... args) { return new_reg<Vec>(type_id, std::forward<Args>(args)...); }
+
+ //! Creates a new mask register with `type_id` type and optional name passed via `args`.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_k(TypeId type_id, Args&&... args) { return new_reg<KReg>(type_id, std::forward<Args>(args)...); }
+
+ //! Creates a new 8-bit general purpose register mapped to low 8 bits of a full register.
+ //!
+ //! \note Using 8-bit registers is not recommended, use at least 32-bit registers in portable code.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp8(Args&&... args) { return new_reg<Gp>(TypeId::kUInt8, std::forward<Args>(args)...); }
+
+ //! Creates a new 16-bit general purpose register mapped to low 16 bits of a full register.
+ //!
+ //! \note Using 16-bit registers is not recommended, use at least 32-bit registers in portable code.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp16(Args&&... args) { return new_reg<Gp>(TypeId::kUInt16, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit general purpose register mapped to low 32 bits of a full register (on 64-bit targets).
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp32(Args&&... args) { return new_reg<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
+
+ //! Creates a new 64-bit general purpose register.
+ //!
+ //! \warning The target must be 64-bit in order to create 64-bit registers.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp64(Args&&... args) { return new_reg<Gp>(TypeId::kUInt64, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit or 64-bit general purpose register depending on the target register width.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gpz(Args&&... args) { return new_reg<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit or 64-bit general purpose register depending on the target register width.
+ //!
+ //! \note This is just an alternative name that maps more closely to C's `uintptr_t`, it's the same function as
+ //! \ref new_gpz().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Gp new_gp_ptr(Args&&... args) { return new_reg<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register (XMM).
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x4, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register (XMM) that will be used for scalar 32-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f32x1(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x1, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register (XMM) that will be used for scalar 64-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f64x1(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x1, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register (XMM) that will be used for packed 32-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f32x4(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x4, std::forward<Args>(args)...); }
+
+ //! Creates a new 128-bit vector register (XMM) that will be used for packed 64-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec128_f64x2(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x2, std::forward<Args>(args)...); }
+
+ //! Creates a new 256-bit vector register (YMM).
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec256(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x8, std::forward<Args>(args)...); }
+
+ //! Creates a new 256-bit vector register (YMM) that will be used for packed 32-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec256_f32x8(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x8, std::forward<Args>(args)...); }
+
+ //! Creates a new 256-bit vector register (YMM) that will be used for packed 64-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec256_f64x4(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x4, std::forward<Args>(args)...); }
+
+ //! Creates a new 512-bit vector register (ZMM).
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec512(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x16, std::forward<Args>(args)...); }
+
+ //! Creates a new 512-bit vector register (ZMM) that will be used for packed 32-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec512_f32x16(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x16, std::forward<Args>(args)...); }
+
+ //! Creates a new 512-bit vector register (ZMM) that will be used for packed 64-bit floating point operation.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_vec512_f64x8(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x8, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_xmm(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x4, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128_f32x1() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_xmm_ss(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x1, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128_f64x1() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_xmm_sd(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x1, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128_f32x4() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_xmm_ps(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x4, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec128_f64x2() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_xmm_pd(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x2, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec256() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_ymm(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x8, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec256_f32x8() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_ymm_ps(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x8, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec256_f64x4() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_ymm_pd(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x4, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec512() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_zmm(Args&&... args) { return new_reg<Vec>(TypeId::kInt32x16, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec512_f32x16() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_zmm_ps(Args&&... args) { return new_reg<Vec>(TypeId::kFloat32x16, std::forward<Args>(args)...); }
+
+ //! Alias of \ref new_vec512_f64x8() that matches x86 architecture terminology.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Vec new_zmm_pd(Args&&... args) { return new_reg<Vec>(TypeId::kFloat64x8, std::forward<Args>(args)...); }
+
+ //! Creates a new 64-bit MMX register.
+ //!
+ //! \note MMX ISA is generally deprecated by the X86 architecture.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG Mm new_mm(Args&&... args) { return new_reg<Mm>(TypeId::kMmx64, std::forward<Args>(args)...); }
+
+ //! Creates a new 8-bit mask (K) register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_k8(Args&&... args) { return new_reg<KReg>(TypeId::kMask8, std::forward<Args>(args)...); }
+
+ //! Creates a new 16-bit mask (K) register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_k16(Args&&... args) { return new_reg<KReg>(TypeId::kMask16, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit mask (K) register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_k32(Args&&... args) { return new_reg<KReg>(TypeId::kMask32, std::forward<Args>(args)...); }
+
+ //! Creates a new 64-bit mask (K) register.
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_k64(Args&&... args) { return new_reg<KReg>(TypeId::kMask64, std::forward<Args>(args)...); }
+
+ //! Creates a new 8-bit mask (K) register, alias of \ref new_k8().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_kb(Args&&... args) { return new_reg<KReg>(TypeId::kMask8, std::forward<Args>(args)...); }
+
+ //! Creates a new 16-bit mask (K) register, alias of \ref new_k16().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_kw(Args&&... args) { return new_reg<KReg>(TypeId::kMask16, std::forward<Args>(args)...); }
+
+ //! Creates a new 32-bit mask (K) register, alias of \ref new_k32().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_kd(Args&&... args) { return new_reg<KReg>(TypeId::kMask32, std::forward<Args>(args)...); }
+
+ //! Creates a new 64-bit mask (K) register, alias of \ref new_k64().
+ template<typename... Args>
+ ASMJIT_INLINE_NODEBUG KReg new_kq(Args&&... args) { return new_reg<KReg>(TypeId::kMask64, std::forward<Args>(args)...); }
+
+ //! \}
+
+ //! \name Stack
+ //! \{
+
+ //! Creates a new stack and returns a \ref Mem operand that can be used to address it.
+ ASMJIT_INLINE_NODEBUG Mem new_stack(uint32_t size, uint32_t alignment, const char* name = nullptr) {
+ Mem m(Globals::NoInit);
+ _new_stack(Out<BaseMem>{m}, size, alignment, name);
+ return m;
+ }
+
+ //! \}
+
+ //! \name Constants
+ //! \{
+
+ //! Put data to a constant-pool and get a memory reference to it.
+ ASMJIT_INLINE_NODEBUG Mem new_const(ConstPoolScope scope, const void* data, size_t size) {
+ Mem m(Globals::NoInit);
+ _new_const(Out<BaseMem>(m), scope, data, size);
+ return m;
+ }
+
+ //! Put a BYTE `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_byte_const(ConstPoolScope scope, uint8_t val) noexcept { return new_const(scope, &val, 1); }
+ //! Put a WORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_word_const(ConstPoolScope scope, uint16_t val) noexcept { return new_const(scope, &val, 2); }
+ //! Put a DWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_dword_const(ConstPoolScope scope, uint32_t val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a QWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_qword_const(ConstPoolScope scope, uint64_t val) noexcept { return new_const(scope, &val, 8); }
+
+ //! Put a WORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_int16_const(ConstPoolScope scope, int16_t val) noexcept { return new_const(scope, &val, 2); }
+ //! Put a WORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_uint16_const(ConstPoolScope scope, uint16_t val) noexcept { return new_const(scope, &val, 2); }
+ //! Put a DWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_int32_const(ConstPoolScope scope, int32_t val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a DWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_uint32_const(ConstPoolScope scope, uint32_t val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a QWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_int64_const(ConstPoolScope scope, int64_t val) noexcept { return new_const(scope, &val, 8); }
+ //! Put a QWORD `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_uint64_const(ConstPoolScope scope, uint64_t val) noexcept { return new_const(scope, &val, 8); }
+
+ //! Put a SP-FP `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_float_const(ConstPoolScope scope, float val) noexcept { return new_const(scope, &val, 4); }
+ //! Put a DP-FP `val` to a constant-pool.
+ ASMJIT_INLINE_NODEBUG Mem new_double_const(ConstPoolScope scope, double val) noexcept { return new_const(scope, &val, 8); }
+
+ //! \}
+
+ //! \name Instruction Options
+ //! \{
+
+ //! Force the compiler to not follow the conditional or unconditional jump.
+ ASMJIT_INLINE_NODEBUG Compiler& unfollow() noexcept { add_inst_options(InstOptions::kUnfollow); return *this; }
+ //! Tell the compiler that the destination variable will be overwritten.
+ ASMJIT_INLINE_NODEBUG Compiler& overwrite() noexcept { add_inst_options(InstOptions::kOverwrite); return *this; }
+
+ //! \}
+
+ //! \name Function Call & Ret Intrinsics
+ //! \{
+
+ //! Invoke a function call without `target` type enforcement.
+ ASMJIT_INLINE_NODEBUG Error invoke_(Out<InvokeNode*> out, const Operand_& target, const FuncSignature& signature) {
+ return add_invoke_node(out, Inst::kIdCall, target, signature);
+ }
+
+ //! Invoke a function call of the given `target` and `signature` and store the added node to `out`.
+ //!
+ //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`,
+ //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails
+ //! nullptr is stored in `out` and error code is returned.
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error invoke(Out<InvokeNode*> out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); }
+
+ //! Return from function.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE_NODEBUG Error ret() { return add_ret(Operand(), Operand()); }
+
+ //! Return from function - one value.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE_NODEBUG Error ret(const Reg& o0) { return add_ret(o0, Operand()); }
+
+ //! Return from function - two values / register pair.
+ //!
+ //! \note This doesn't end the function - it just emits a return.
+ ASMJIT_INLINE_NODEBUG Error ret(const Reg& o0, const Reg& o1) { return add_ret(o0, o1); }
+
+ //! \}
+
+ //! \name Jump Tables Support
+ //! \{
+
+ using EmitterExplicitT<Compiler>::jmp;
+
+ //! Adds a jump to the given `target` with the provided jump `annotation`.
+ ASMJIT_INLINE_NODEBUG Error jmp(const Reg& target, JumpAnnotation* annotation) { return emit_annotated_jump(Inst::kIdJmp, target, annotation); }
+ //! \overload
+ ASMJIT_INLINE_NODEBUG Error jmp(const BaseMem& target, JumpAnnotation* annotation) { return emit_annotated_jump(Inst::kIdJmp, target, annotation); }
+
+ //! \}
+
+ //! \name Events
+ //! \{
+
+ ASMJIT_API Error on_attach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_detach(CodeHolder& code) noexcept override;
+ ASMJIT_API Error on_reinit(CodeHolder& code) noexcept override;
+
+ //! \}
+
+ //! \name Finalize
+ //! \{
+
+ ASMJIT_API Error finalize() override;
+
+ //! \}
+};
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_X86_X86COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86emithelper.cpp b/3rdparty/asmjit/asmjit/x86/x86emithelper.cpp
new file mode 100644
index 00000000000..bb22fa41f79
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86emithelper.cpp
@@ -0,0 +1,708 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/funcargscontext_p.h>
+#include <asmjit/core/string.h>
+#include <asmjit/core/type.h>
+#include <asmjit/core/radefs_p.h>
+#include <asmjit/x86/x86emithelper_p.h>
+#include <asmjit/x86/x86emitter.h>
+#include <asmjit/x86/x86formatter_p.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/support/support.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::EmitHelper - Utilities
+// ===========================
+
+static constexpr OperandSignature reg_size_to_gp_signature_table[8 + 1] = {
+ OperandSignature{0},
+ OperandSignature{RegTraits<RegType::kGp8Lo>::kSignature},
+ OperandSignature{RegTraits<RegType::kGp16>::kSignature},
+ OperandSignature{0},
+ OperandSignature{RegTraits<RegType::kGp32>::kSignature},
+ OperandSignature{0},
+ OperandSignature{0},
+ OperandSignature{0},
+ OperandSignature{RegTraits<RegType::kGp64>::kSignature}
+};
+
+[[nodiscard]]
+static inline uint32_t get_xmm_mov_inst(const FuncFrame& frame) {
+ bool avx = frame.is_avx_enabled();
+ bool aligned = frame.has_aligned_vec_save_restore();
+
+ return aligned ? (avx ? Inst::kIdVmovaps : Inst::kIdMovaps)
+ : (avx ? Inst::kIdVmovups : Inst::kIdMovups);
+}
+
+//! Converts `size` to a 'kmov?' instruction.
+[[nodiscard]]
+static inline uint32_t kmovInstFromSize(uint32_t size) noexcept {
+ switch (size) {
+ case 1: return Inst::kIdKmovb;
+ case 2: return Inst::kIdKmovw;
+ case 4: return Inst::kIdKmovd;
+ case 8: return Inst::kIdKmovq;
+ default: return Inst::kIdNone;
+ }
+}
+
+[[nodiscard]]
+static inline uint32_t make_cast_op(TypeId dst, TypeId src) noexcept {
+ return (uint32_t(dst) << 8) | uint32_t(src);
+}
+
+// x86::EmitHelper - Instruction Data
+// ==================================
+
+const EmitHelperInstructionIds _emit_helper_instruction_ids[2] = {
+ // SSE/SSE2
+ {
+ // [movd, movss]
+ { Inst::kIdMovd, Inst::kIdMovss },
+ // [movq, movsd]
+ { Inst::kIdMovq, Inst::kIdMovsd },
+ // [movups, movaps]
+ { Inst::kIdMovups, Inst::kIdMovaps },
+ // [movupd, movapd]
+ { Inst::kIdMovupd, Inst::kIdMovapd },
+ // [movdqu, movdqa]
+ { Inst::kIdMovdqu, Inst::kIdMovdqa },
+ // [movlps]
+ { Inst::kIdMovlps },
+ // [cvtss2sd, cvtsd2ss]
+ { Inst::kIdCvtss2sd, Inst::kIdCvtsd2ss },
+ // [cvtps2pd, cvtpd2ps]
+ { Inst::kIdCvtps2pd, Inst::kIdCvtpd2ps }
+ },
+
+ // AVX/AVX-512
+ {
+ // [movd, movss]
+ { Inst::kIdVmovd, Inst::kIdVmovss },
+ // [movq, movsd]
+ { Inst::kIdVmovq, Inst::kIdVmovsd },
+ // [movups movaps]
+ { Inst::kIdVmovups, Inst::kIdVmovaps },
+ // [movupd movapd]
+ { Inst::kIdVmovupd, Inst::kIdVmovapd },
+ // [movdqu movdqa]
+ { Inst::kIdVmovdqu, Inst::kIdVmovdqa },
+ // [movlps]
+ { Inst::kIdVmovlps },
+ // [cvtss2sd, cvtsd2ss]
+ { Inst::kIdVcvtss2sd, Inst::kIdVcvtsd2ss },
+ // [cvtps2pd, cvtpd2ps]
+ { Inst::kIdVcvtps2pd, Inst::kIdVcvtpd2ps }
+ }
+};
+
+// x86::EmitHelper - Emit Reg Move
+// ===============================
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_reg_move(
+ const Operand_& dst_,
+ const Operand_& src_, TypeId type_id, const char* comment) {
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::is_valid(type_id) && !TypeUtils::is_abstract(type_id));
+
+ Operand dst(dst_);
+ Operand src(src_);
+
+ InstId inst_id = Inst::kIdNone;
+ uint32_t mem_flags = 0;
+ uint32_t override_mem_size = 0;
+
+ enum MemFlags : uint32_t {
+ kDstMem = 0x1,
+ kSrcMem = 0x2
+ };
+
+ // Detect memory operands and patch them to have the same size as the register. BaseCompiler always sets memory size
+ // of allocs and spills, so it shouldn't be really necessary, however, after this function was separated from Compiler
+ // it's better to make sure that the size is always specified, as we can use 'movzx' and 'movsx' that rely on it.
+ if (dst.is_mem()) { mem_flags |= kDstMem; dst.as<Mem>().set_size(src.as<Mem>().size()); }
+ if (src.is_mem()) { mem_flags |= kSrcMem; src.as<Mem>().set_size(dst.as<Mem>().size()); }
+
+ switch (type_id) {
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ // Special case - 'movzx' load.
+ if (mem_flags & kSrcMem) {
+ inst_id = Inst::kIdMovzx;
+ dst.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ break;
+ }
+
+ if (!mem_flags) {
+ // Change both destination and source registers to GPD (safer, no dependencies).
+ dst.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ src.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ }
+ [[fallthrough]];
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ inst_id = Inst::kIdMov;
+ break;
+
+ case TypeId::kMmx32:
+ inst_id = Inst::kIdMovd;
+ if (mem_flags) break;
+ [[fallthrough]];
+
+ case TypeId::kMmx64 : inst_id = Inst::kIdMovq ; break;
+ case TypeId::kMask8 : inst_id = Inst::kIdKmovb; break;
+ case TypeId::kMask16: inst_id = Inst::kIdKmovw; break;
+ case TypeId::kMask32: inst_id = Inst::kIdKmovd; break;
+ case TypeId::kMask64: inst_id = Inst::kIdKmovq; break;
+
+ default: {
+ TypeId scalar_type_id = TypeUtils::scalar_of(type_id);
+ if (TypeUtils::is_vec32(type_id) && mem_flags) {
+ inst_id = ids().movd_or_movss(scalar_type_id == TypeId::kFloat32);
+ override_mem_size = 4;
+ break;
+ }
+
+ if (TypeUtils::is_vec64(type_id) && mem_flags) {
+ inst_id = ids().movq_or_movsd(scalar_type_id == TypeId::kFloat64);
+ override_mem_size = 8;
+ break;
+ }
+
+ if (scalar_type_id == TypeId::kFloat32) {
+ inst_id = ids().movaps();
+ }
+ else if (scalar_type_id == TypeId::kFloat64) {
+ inst_id = ids().movapd();
+ }
+ else if (!_avx512_enabled) {
+ inst_id = ids().movdqa();
+ }
+ else {
+ inst_id = Inst::kIdVmovdqa32;
+ }
+ break;
+ }
+ }
+
+ if (!inst_id) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (override_mem_size) {
+ if (dst.is_mem()) {
+ dst.as<Mem>().set_size(override_mem_size);
+ }
+
+ if (src.is_mem()) {
+ src.as<Mem>().set_size(override_mem_size);
+ }
+ }
+
+ _emitter->set_inline_comment(comment);
+ return _emitter->emit(inst_id, dst, src);
+}
+
+// x86::EmitHelper - Emit Arg Move
+// ===============================
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_arg_move(
+ const Reg& dst_, TypeId dst_type_id,
+ const Operand_& src_, TypeId src_type_id, const char* comment) {
+
+ // Deduce optional `dst_type_id`, which may be `TypeId::kVoid` in some cases.
+ if (dst_type_id == TypeId::kVoid) {
+ dst_type_id = RegUtils::type_id_of(dst_.reg_type());
+ }
+
+ // Invalid or abstract TypeIds are not allowed.
+ ASMJIT_ASSERT(TypeUtils::is_valid(dst_type_id) && !TypeUtils::is_abstract(dst_type_id));
+ ASMJIT_ASSERT(TypeUtils::is_valid(src_type_id) && !TypeUtils::is_abstract(src_type_id));
+
+ Reg dst(dst_.as<Reg>());
+ Operand src(src_);
+
+ uint32_t dst_size = TypeUtils::size_of(dst_type_id);
+ uint32_t src_size = TypeUtils::size_of(src_type_id);
+
+ InstId inst_id = Inst::kIdNone;
+
+ // Not a real loop, just 'break' is nicer than 'goto'.
+ for (;;) {
+ if (TypeUtils::is_int(dst_type_id)) {
+ // Sign extend.
+ if (TypeUtils::is_int(src_type_id)) {
+ uint32_t cast_op = make_cast_op(dst_type_id, src_type_id);
+
+ if (cast_op == make_cast_op(TypeId::kInt16, TypeId::kInt8 ) ||
+ cast_op == make_cast_op(TypeId::kInt32, TypeId::kInt8 ) ||
+ cast_op == make_cast_op(TypeId::kInt64, TypeId::kInt8 ) ||
+ cast_op == make_cast_op(TypeId::kInt32, TypeId::kInt16) ||
+ cast_op == make_cast_op(TypeId::kInt64, TypeId::kInt16) ||
+ cast_op == make_cast_op(TypeId::kInt64, TypeId::kInt32)) {
+ // Sign extend by using 'movsx' or 'movsxd'.
+ inst_id = (cast_op == make_cast_op(TypeId::kInt64, TypeId::kInt32)) ? Inst::kIdMovsxd : Inst::kIdMovsx;
+
+ dst.set_signature(reg_size_to_gp_signature_table[dst_size]);
+ if (src.is_reg()) {
+ src.set_signature(reg_size_to_gp_signature_table[src_size]);
+ }
+ break;
+ }
+ }
+
+ // Zero extend.
+ if (TypeUtils::is_int(src_type_id) || src_.is_mem()) {
+ uint32_t mov_size = Support::min(src_size, dst_size);
+ if (mov_size <= 4) {
+ dst_size = 4;
+ }
+
+ // Zero extend by using 'movzx' or 'mov'.
+ inst_id = mov_size < 4 ? Inst::kIdMovzx : Inst::kIdMov;
+ src_size = Support::min(src_size, mov_size);
+
+ dst.set_signature(reg_size_to_gp_signature_table[dst_size]);
+ if (src.is_reg()) {
+ src.set_signature(reg_size_to_gp_signature_table[src_size]);
+ }
+ break;
+ }
+
+ // NOTE: The previous branch caught all memory sources, from here it's always register to register conversion,
+ // so catch the remaining cases.
+ src_size = Support::min(src_size, dst_size);
+
+ if (TypeUtils::is_mmx(src_type_id)) {
+ // 64-bit move.
+ inst_id = Inst::kIdMovq;
+ if (src_size == 8) {
+ break;
+ }
+
+ // 32-bit move.
+ inst_id = Inst::kIdMovd;
+ dst.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ break;
+ }
+
+ if (TypeUtils::is_mask(src_type_id)) {
+ inst_id = kmovInstFromSize(src_size);
+ dst.set_signature(src_size <= 4 ? Reg::signature_of_t<RegType::kGp32>()
+ : Reg::signature_of_t<RegType::kGp64>());
+ break;
+ }
+
+ if (TypeUtils::is_vec(src_type_id)) {
+ // 64-bit move.
+ inst_id = ids().movq();
+ if (src_size == 8) {
+ break;
+ }
+
+ // 32-bit move.
+ inst_id = ids().movd();
+ dst.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ break;
+ }
+ }
+
+ if (TypeUtils::is_mmx(dst_type_id)) {
+ inst_id = Inst::kIdMovq;
+ src_size = Support::min(src_size, dst_size);
+
+ if (TypeUtils::is_int(src_type_id) || src.is_mem()) {
+ // 64-bit move.
+ if (src_size == 8) {
+ break;
+ }
+
+ // 32-bit move.
+ inst_id = Inst::kIdMovd;
+ if (src.is_reg()) {
+ src.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ }
+ break;
+ }
+
+ if (TypeUtils::is_mmx(src_type_id)) {
+ break;
+ }
+
+ // This will hurt if AVX is enabled.
+ inst_id = Inst::kIdMovdq2q;
+ if (TypeUtils::is_vec(src_type_id)) {
+ break;
+ }
+ }
+
+ if (TypeUtils::is_mask(dst_type_id)) {
+ src_size = Support::min(src_size, dst_size);
+
+ if (TypeUtils::is_int(src_type_id) || TypeUtils::is_mask(src_type_id) || src.is_mem()) {
+ inst_id = kmovInstFromSize(src_size);
+ if (src.is_gp() && src_size <= 4) {
+ src.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ }
+ break;
+ }
+ }
+
+ if (TypeUtils::is_vec(dst_type_id)) {
+ // By default set destination to XMM, will be set to YMM|ZMM if needed.
+ dst.set_signature(Reg::signature_of_t<RegType::kVec128>());
+
+ // This will hurt if AVX is enabled.
+ if (src.is_mm_reg()) {
+ // 64-bit move.
+ inst_id = Inst::kIdMovq2dq;
+ break;
+ }
+
+ // Argument conversion.
+ TypeId dst_scalar_id = TypeUtils::scalar_of(dst_type_id);
+ TypeId src_scalar_id = TypeUtils::scalar_of(src_type_id);
+
+ if (dst_scalar_id == TypeId::kFloat32 && src_scalar_id == TypeId::kFloat64) {
+ src_size = Support::min(dst_size * 2, src_size);
+ dst_size = src_size / 2;
+ inst_id = (src_size <= 8) ? ids().cvtss2sd() : ids().cvtps2pd();
+
+ if (dst_size == 32) {
+ dst.set_signature(Reg::signature_of_t<RegType::kVec256>());
+ }
+ if (src.is_reg()) {
+ src.set_signature(RegUtils::signature_of_vec_by_size(src_size));
+ }
+ break;
+ }
+
+ if (dst_scalar_id == TypeId::kFloat64 && src_scalar_id == TypeId::kFloat32) {
+ src_size = Support::min(dst_size, src_size * 2) / 2;
+ dst_size = src_size * 2;
+ inst_id = (src_size <= 4) ? ids().cvtsd2ss() : ids().cvtpd2ps();
+
+ dst.set_signature(RegUtils::signature_of_vec_by_size(dst_size));
+ if (src.is_reg() && src_size >= 32) {
+ src.set_signature(Reg::signature_of_t<RegType::kVec256>());
+ }
+ break;
+ }
+
+ src_size = Support::min(src_size, dst_size);
+ if (src.is_gp() || src.is_mem()) {
+ // 32-bit move.
+ if (src_size <= 4) {
+ inst_id = ids().movd();
+ if (src.is_reg()) {
+ src.set_signature(Reg::signature_of_t<RegType::kGp32>());
+ }
+ break;
+ }
+
+ // 64-bit move.
+ if (src_size == 8) {
+ inst_id = ids().movq();
+ break;
+ }
+ }
+
+ if (src.is_vec() || src.is_mem()) {
+ inst_id = ids().movups_or_movaps(!Support::bool_and(src.is_mem(), src_size < _emitter->environment().stack_alignment()));
+
+ OperandSignature signature = RegUtils::signature_of_vec_by_size(src_size);
+ dst.set_signature(signature);
+
+ if (src.is_reg()) {
+ src.set_signature(signature);
+ }
+ break;
+ }
+ }
+
+ return make_error(Error::kInvalidState);
+ }
+
+ if (src.is_mem())
+ src.as<Mem>().set_size(src_size);
+
+ _emitter->set_inline_comment(comment);
+ return _emitter->emit(inst_id, dst, src);
+}
+
+Error EmitHelper::emit_reg_swap(
+ const Reg& a,
+ const Reg& b, const char* comment) {
+
+ if (a.is_gp() && b.is_gp()) {
+ _emitter->set_inline_comment(comment);
+ return _emitter->emit(Inst::kIdXchg, a, b);
+ }
+ else {
+ return make_error(Error::kInvalidState);
+ }
+}
+
+// x86::EmitHelper - Emit Prolog & Epilog
+// ======================================
+
+static inline Error X86Internal_setup_save_restore_info(RegGroup group, const FuncFrame& frame, Out<Reg> reg_out, Out<uint32_t> inst_out, Out<uint32_t> size_out) noexcept {
+ switch (group) {
+ case RegGroup::kVec:
+ reg_out = xmm(0);
+ inst_out = get_xmm_mov_inst(frame);
+ size_out = reg_out->size();
+ return Error::kOk;
+
+ case RegGroup::kMask:
+ reg_out = k(0);
+ inst_out = Inst::kIdKmovq;
+ size_out = reg_out->size();
+ return Error::kOk;
+
+ case RegGroup::kX86_MM:
+ reg_out = mm(0);
+ inst_out = Inst::kIdMovq;
+ size_out = reg_out->size();
+ return Error::kOk;
+
+ default:
+ // This would be a bug in AsmJit if hit.
+ return make_error(Error::kInvalidState);
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_prolog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+ uint32_t gp_saved = frame.saved_regs(RegGroup::kGp);
+
+ Gp zsp = emitter->zsp(); // ESP|RSP register.
+ Gp zbp = emitter->zbp(); // EBP|RBP register.
+ Gp gp_reg = zsp; // General purpose register (temporary).
+ Gp sa_reg = zsp; // Stack-arguments base pointer.
+
+ // Emit: 'endbr32' or 'endbr64' (indirect branch protection).
+ if (frame.has_indirect_branch_protection()) {
+ InstId inst_id = emitter->is_32bit() ? Inst::kIdEndbr32 : Inst::kIdEndbr64;
+ ASMJIT_PROPAGATE(emitter->emit(inst_id));
+ }
+
+ // Emit: 'push zbp'
+ // 'mov zbp, zsp'.
+ if (frame.has_preserved_fp()) {
+ gp_saved &= ~Support::bit_mask<RegMask>(Gp::kIdBp);
+ ASMJIT_PROPAGATE(emitter->push(zbp));
+ ASMJIT_PROPAGATE(emitter->mov(zbp, zsp));
+ }
+
+ // Emit: 'push gp' sequence.
+ {
+ Support::BitWordIterator<RegMask> it(gp_saved);
+ while (it.has_next()) {
+ gp_reg.set_id(it.next());
+ ASMJIT_PROPAGATE(emitter->push(gp_reg));
+ }
+ }
+
+ // Emit: 'mov sa_reg, zsp'.
+ uint32_t sa_reg_id = frame.sa_reg_id();
+ if (sa_reg_id != Reg::kIdBad && sa_reg_id != Gp::kIdSp) {
+ sa_reg.set_id(sa_reg_id);
+ if (frame.has_preserved_fp()) {
+ if (sa_reg_id != Gp::kIdBp) {
+ ASMJIT_PROPAGATE(emitter->mov(sa_reg, zbp));
+ }
+ }
+ else {
+ ASMJIT_PROPAGATE(emitter->mov(sa_reg, zsp));
+ }
+ }
+
+ // Emit: 'and zsp, StackAlignment'.
+ if (frame.has_dynamic_alignment()) {
+ ASMJIT_PROPAGATE(emitter->and_(zsp, -int32_t(frame.final_stack_alignment())));
+ }
+
+ // Emit: 'sub zsp, StackAdjustment'.
+ if (frame.has_stack_adjustment()) {
+ ASMJIT_PROPAGATE(emitter->sub(zsp, frame.stack_adjustment()));
+ }
+
+ // Emit: 'mov [zsp + DAOffset], sa_reg'.
+ if (frame.has_dynamic_alignment() && frame.has_da_offset()) {
+ Mem sa_mem = ptr(zsp, int32_t(frame.da_offset()));
+ ASMJIT_PROPAGATE(emitter->mov(sa_mem, sa_reg));
+ }
+
+ // Emit 'movxxx [zsp + X], {[x|y|z]mm, k}'.
+ {
+ Mem x_base = ptr(zsp, int32_t(frame.extra_reg_save_offset()));
+
+ for (RegGroup group : Support::enumerate(RegGroup(1), RegGroup::kMaxVirt)) {
+ Support::BitWordIterator<RegMask> it(frame.saved_regs(group));
+ if (it.has_next()) {
+ Reg x_reg;
+ uint32_t x_inst_id = 0;
+ uint32_t x_size = 0;
+ ASMJIT_PROPAGATE(X86Internal_setup_save_restore_info(group, frame, Out(x_reg), Out(x_inst_id), Out(x_size)));
+ do {
+ x_reg.set_id(it.next());
+ ASMJIT_PROPAGATE(emitter->emit(x_inst_id, x_base, x_reg));
+ x_base.add_offset_lo32(int32_t(x_size));
+ } while (it.has_next());
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE Error EmitHelper::emit_epilog(const FuncFrame& frame) {
+ Emitter* emitter = _emitter->as<Emitter>();
+
+ uint32_t register_size = emitter->register_size();
+ uint32_t gp_saved = frame.saved_regs(RegGroup::kGp);
+
+ Gp zsp = emitter->zsp(); // ESP|RSP register.
+ Gp zbp = emitter->zbp(); // EBP|RBP register.
+ Gp gp_reg = emitter->zsp(); // General purpose register (temporary).
+
+ // Don't emit 'pop zbp' in the pop sequence, this case is handled separately.
+ if (frame.has_preserved_fp()) {
+ gp_saved &= ~Support::bit_mask<RegMask>(Gp::kIdBp);
+ }
+
+ // Emit 'movxxx {[x|y|z]mm, k}, [zsp + X]'.
+ {
+ Mem x_base = ptr(zsp, int32_t(frame.extra_reg_save_offset()));
+
+ for (RegGroup group : Support::enumerate(RegGroup(1), RegGroup::kMaxVirt)) {
+ Support::BitWordIterator<RegMask> it(frame.saved_regs(group));
+ if (it.has_next()) {
+ Reg x_reg;
+ uint32_t x_inst_id;
+ uint32_t x_size;
+ ASMJIT_PROPAGATE(X86Internal_setup_save_restore_info(group, frame, Out(x_reg), Out(x_inst_id), Out(x_size)));
+ do {
+ x_reg.set_id(it.next());
+ ASMJIT_PROPAGATE(emitter->emit(x_inst_id, x_reg, x_base));
+ x_base.add_offset_lo32(int32_t(x_size));
+ } while (it.has_next());
+ }
+ }
+ }
+
+ bool do_mmx_cleanup = frame.has_mmx_cleanup();
+ bool do_avx_cleanup = frame.has_avx_cleanup();
+
+ // Perform automatic AVX cleanup (VZEROUPPER) if there are dirty vector registers.
+ if (frame.has_avx_auto_cleanup() && frame.dirty_regs(RegGroup::kVec) != 0u) {
+ do_avx_cleanup = true;
+ }
+
+ // Emit 'EMMS' if MMX cleanup is enabled.
+ if (do_mmx_cleanup) {
+ ASMJIT_PROPAGATE(emitter->emms());
+ }
+
+ // Emit 'VZEROUPPER' if AVX cleanup is enabled.
+ if (do_avx_cleanup) {
+ ASMJIT_PROPAGATE(emitter->vzeroupper());
+ }
+
+ if (frame.has_preserved_fp()) {
+ // Emit 'mov zsp, zbp' or 'lea zsp, [zbp - x]'
+ int32_t count = int32_t(frame.push_pop_save_size() - register_size);
+ if (!count) {
+ ASMJIT_PROPAGATE(emitter->mov(zsp, zbp));
+ }
+ else {
+ ASMJIT_PROPAGATE(emitter->lea(zsp, ptr(zbp, -count)));
+ }
+ }
+ else {
+ if (frame.has_dynamic_alignment() && frame.has_da_offset()) {
+ // Emit 'mov zsp, [zsp + DsaSlot]'.
+ Mem sa_mem = ptr(zsp, int32_t(frame.da_offset()));
+ ASMJIT_PROPAGATE(emitter->mov(zsp, sa_mem));
+ }
+ else if (frame.has_stack_adjustment()) {
+ // Emit 'add zsp, StackAdjustment'.
+ ASMJIT_PROPAGATE(emitter->add(zsp, int32_t(frame.stack_adjustment())));
+ }
+ }
+
+ // Emit 'pop gp' sequence.
+ if (gp_saved) {
+ uint32_t i = gp_saved;
+ uint32_t reg_id = 16;
+
+ do {
+ reg_id--;
+ if (i & 0x8000) {
+ gp_reg.set_id(reg_id);
+ ASMJIT_PROPAGATE(emitter->pop(gp_reg));
+ }
+ i <<= 1;
+ } while (reg_id != 0);
+ }
+
+ // Emit 'pop zbp'.
+ if (frame.has_preserved_fp()) {
+ ASMJIT_PROPAGATE(emitter->pop(zbp));
+ }
+
+ // Emit 'ret' or 'ret x'.
+ if (frame.has_callee_stack_cleanup()) {
+ ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet, int(frame.callee_stack_cleanup())));
+ }
+ else {
+ ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet));
+ }
+
+ return Error::kOk;
+}
+
+static Error ASMJIT_CDECL Emitter_emitProlog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emit_helper(emitter, frame.is_avx_enabled(), frame.is_avx512_enabled());
+ return emit_helper.emit_prolog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitEpilog(BaseEmitter* emitter, const FuncFrame& frame) {
+ EmitHelper emit_helper(emitter, frame.is_avx_enabled(), frame.is_avx512_enabled());
+ return emit_helper.emit_epilog(frame);
+}
+
+static Error ASMJIT_CDECL Emitter_emitArgsAssignment(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
+ EmitHelper emit_helper(emitter, frame.is_avx_enabled(), frame.is_avx512_enabled());
+ return emit_helper.emit_args_assignment(frame, args);
+}
+
+void init_emitter_funcs(BaseEmitter* emitter) noexcept {
+ emitter->_funcs.emit_prolog = Emitter_emitProlog;
+ emitter->_funcs.emit_epilog = Emitter_emitEpilog;
+ emitter->_funcs.emit_args_assignment = Emitter_emitArgsAssignment;
+
+#ifndef ASMJIT_NO_LOGGING
+ emitter->_funcs.format_instruction = FormatterInternal::format_instruction;
+#endif
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit/x86/x86emithelper_p.h b/3rdparty/asmjit/asmjit/x86/x86emithelper_p.h
new file mode 100644
index 00000000000..ac3f1b7ebc4
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86emithelper_p.h
@@ -0,0 +1,121 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
+#define ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+
+#include <asmjit/core/emithelper_p.h>
+#include <asmjit/core/func.h>
+#include <asmjit/x86/x86emitter.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+[[nodiscard]]
+static ASMJIT_INLINE_NODEBUG RegType vec_type_id_to_reg_type(TypeId type_id) noexcept {
+ return uint32_t(type_id) <= uint32_t(TypeId::_kVec128End) ? RegType::kVec128 :
+ uint32_t(type_id) <= uint32_t(TypeId::_kVec256End) ? RegType::kVec256 : RegType::kVec512;
+}
+
+//! Instruction identifiers for targeting SSE and AVX backends.
+struct EmitHelperInstructionIds {
+ //! 16-bit identifier is enough for us here as X86|X86_64 doesn't have more than 65536 instructions.
+ using IId = uint16_t;
+
+ IId _movd_movss[2];
+ IId _movq_movsd[2];
+ IId _movups_movaps[2];
+ IId _movupd_movapd[2];
+ IId _movdqu_movdqa[2];
+ IId _movlps[1];
+ IId _cvtss2sd_cvtsd2ss[2];
+ IId _cvtps2pd_cvtpd2ps[2];
+
+ ASMJIT_INLINE_NODEBUG InstId movd() const noexcept { return _movd_movss[0]; }
+ ASMJIT_INLINE_NODEBUG InstId movss() const noexcept { return _movd_movss[1]; }
+ ASMJIT_INLINE_NODEBUG InstId movd_or_movss(size_t idx) const noexcept { return _movd_movss[idx]; }
+
+ ASMJIT_INLINE_NODEBUG InstId movq() const noexcept { return _movq_movsd[0]; }
+ ASMJIT_INLINE_NODEBUG InstId movsd() const noexcept { return _movq_movsd[1]; }
+ ASMJIT_INLINE_NODEBUG InstId movq_or_movsd(size_t idx) const noexcept { return _movq_movsd[idx]; }
+
+ ASMJIT_INLINE_NODEBUG InstId movups() const noexcept { return _movups_movaps[0]; }
+ ASMJIT_INLINE_NODEBUG InstId movaps() const noexcept { return _movups_movaps[1]; }
+ ASMJIT_INLINE_NODEBUG InstId movups_or_movaps(size_t idx) const noexcept { return _movups_movaps[idx]; }
+
+ ASMJIT_INLINE_NODEBUG InstId movupd() const noexcept { return _movupd_movapd[0]; }
+ ASMJIT_INLINE_NODEBUG InstId movapd() const noexcept { return _movupd_movapd[1]; }
+ ASMJIT_INLINE_NODEBUG InstId movupd_or_movapd(size_t idx) const noexcept { return _movupd_movapd[idx]; }
+
+ ASMJIT_INLINE_NODEBUG InstId movdqu() const noexcept { return _movdqu_movdqa[0]; }
+ ASMJIT_INLINE_NODEBUG InstId movdqa() const noexcept { return _movdqu_movdqa[1]; }
+ ASMJIT_INLINE_NODEBUG InstId movdqu_or_movdqa(size_t idx) const noexcept { return _movdqu_movdqa[idx]; }
+
+ ASMJIT_INLINE_NODEBUG InstId movlps() const noexcept { return _movlps[0]; }
+
+ ASMJIT_INLINE_NODEBUG InstId cvtss2sd() const noexcept { return _cvtss2sd_cvtsd2ss[0]; }
+ ASMJIT_INLINE_NODEBUG InstId cvtsd2ss() const noexcept { return _cvtss2sd_cvtsd2ss[1]; }
+
+ ASMJIT_INLINE_NODEBUG InstId cvtps2pd() const noexcept { return _cvtps2pd_cvtpd2ps[0]; }
+ ASMJIT_INLINE_NODEBUG InstId cvtpd2ps() const noexcept { return _cvtps2pd_cvtpd2ps[1]; }
+};
+
+//! Emit helper data for SSE at [0] and AVX/AVX-512 at [1].
+extern const EmitHelperInstructionIds _emit_helper_instruction_ids[2];
+
+class EmitHelper : public BaseEmitHelper {
+protected:
+ bool _avx_enabled;
+ bool _avx512_enabled;
+ const EmitHelperInstructionIds* _ids;
+
+public:
+ ASMJIT_INLINE_NODEBUG explicit EmitHelper(BaseEmitter* emitter = nullptr, bool avx_enabled = false, bool avx512_enabled = false) noexcept
+ : BaseEmitHelper(emitter) { reset(emitter, avx_enabled, avx512_enabled); }
+
+ ASMJIT_INLINE_NODEBUG ~EmitHelper() noexcept override = default;
+
+ ASMJIT_INLINE_NODEBUG bool is_avx_enabled() const noexcept { return _avx_enabled; }
+ ASMJIT_INLINE_NODEBUG bool is_avx512_enabled() const noexcept { return _avx512_enabled; }
+ ASMJIT_INLINE_NODEBUG const EmitHelperInstructionIds& ids() const noexcept { return *_ids; }
+
+ ASMJIT_INLINE void reset(BaseEmitter* emitter, bool avx_enabled, bool avx512_enabled) noexcept {
+ _emitter = emitter;
+ _avx_enabled = avx_enabled || avx512_enabled;
+ _avx512_enabled = avx512_enabled;
+ _ids = &_emit_helper_instruction_ids[size_t(_avx_enabled)];
+ }
+
+ Error emit_reg_move(const Operand_& dst_, const Operand_& src_, TypeId type_id, const char* comment = nullptr) override;
+ Error emit_arg_move(const Reg& dst_, TypeId dst_type_id, const Operand_& src_, TypeId src_type_id, const char* comment = nullptr) override;
+ Error emit_reg_swap(const Reg& a, const Reg& b, const char* comment = nullptr) override;
+
+ Error emit_prolog(const FuncFrame& frame);
+ Error emit_epilog(const FuncFrame& frame);
+};
+
+void init_emitter_funcs(BaseEmitter* emitter) noexcept;
+
+static ASMJIT_INLINE void update_emitter_funcs(BaseEmitter* emitter) noexcept {
+#ifndef ASMJIT_NO_INTROSPECTION
+ emitter->_funcs.validate = emitter->is_32bit() ? InstInternal::validate_x86 : InstInternal::validate_x64;
+#else
+ Support::maybe_unused(emitter);
+#endif
+}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emitter.h b/3rdparty/asmjit/asmjit/x86/x86emitter.h
index 4855e9957c3..dafc961e5f1 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86emitter.h
+++ b/3rdparty/asmjit/asmjit/x86/x86emitter.h
@@ -1,15 +1,15 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86EMITTER_H_INCLUDED
#define ASMJIT_X86_X86EMITTER_H_INCLUDED
-#include "../core/emitter.h"
-#include "../core/support.h"
-#include "../x86/x86globals.h"
-#include "../x86/x86operand.h"
+#include <asmjit/core/emitter.h>
+#include <asmjit/support/support.h>
+#include <asmjit/x86/x86globals.h>
+#include <asmjit/x86/x86operand.h>
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
@@ -108,34 +108,34 @@ template<typename This>
struct EmitterExplicitT {
//! \cond
- // These typedefs are used to describe implicit operands passed explicitly.
- typedef Gp Gp_AL;
- typedef Gp Gp_AH;
- typedef Gp Gp_CL;
- typedef Gp Gp_AX;
- typedef Gp Gp_DX;
+ // These types are used to describe implicit operands passed explicitly.
+ using Gp_AL = Gp;
+ using Gp_AH = Gp;
+ using Gp_CL = Gp;
+ using Gp_AX = Gp;
+ using Gp_DX = Gp;
- typedef Gp Gp_EAX;
- typedef Gp Gp_EBX;
- typedef Gp Gp_ECX;
- typedef Gp Gp_EDX;
+ using Gp_EAX = Gp;
+ using Gp_EBX = Gp;
+ using Gp_ECX = Gp;
+ using Gp_EDX = Gp;
- typedef Gp Gp_RAX;
- typedef Gp Gp_RBX;
- typedef Gp Gp_RCX;
- typedef Gp Gp_RDX;
+ using Gp_RAX = Gp;
+ using Gp_RBX = Gp;
+ using Gp_RCX = Gp;
+ using Gp_RDX = Gp;
- typedef Gp Gp_ZAX;
- typedef Gp Gp_ZBX;
- typedef Gp Gp_ZCX;
- typedef Gp Gp_ZDX;
+ using Gp_ZAX = Gp;
+ using Gp_ZBX = Gp;
+ using Gp_ZCX = Gp;
+ using Gp_ZDX = Gp;
- typedef Mem DS_ZAX; // ds:[zax]
- typedef Mem DS_ZDI; // ds:[zdi]
- typedef Mem ES_ZDI; // es:[zdi]
- typedef Mem DS_ZSI; // ds:[zsi]
+ using DS_ZAX = Mem; // ds:[zax]
+ using DS_ZDI = Mem; // ds:[zdi]
+ using ES_ZDI = Mem; // es:[zdi]
+ using DS_ZSI = Mem; // ds:[zsi]
- typedef Xmm XMM0;
+ using XMM0 = Vec;
// These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
// I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
@@ -147,29 +147,31 @@ struct EmitterExplicitT {
//! \name Native Registers
//! \{
- //! Returns either GPD or GPQ register of the given `id` depending on the emitter's architecture.
- inline Gp gpz(uint32_t id) const noexcept { return Gp(_emitter()->_gpSignature, id); }
+ //! Returns either 32-bit or 64-bit GP register of the given `id` depending on the emitter's architecture.
+ inline Gp gpz(uint32_t id) const noexcept { return Gp(_emitter()->_gp_signature, id); }
+ //! Clones the given `reg` to either 32-bit or 64-bit GP register depending on the emitter's architecture.
+ inline Gp gpz(const Gp& reg) const noexcept { return Gp(_emitter()->_gp_signature, reg.id()); }
- inline Gp zax() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdAx); }
- inline Gp zcx() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdCx); }
- inline Gp zdx() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdDx); }
- inline Gp zbx() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdBx); }
- inline Gp zsp() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdSp); }
- inline Gp zbp() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdBp); }
- inline Gp zsi() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdSi); }
- inline Gp zdi() const noexcept { return Gp(_emitter()->_gpSignature, Gp::kIdDi); }
+ inline Gp zax() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdAx); }
+ inline Gp zcx() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdCx); }
+ inline Gp zdx() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdDx); }
+ inline Gp zbx() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdBx); }
+ inline Gp zsp() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdSp); }
+ inline Gp zbp() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdBp); }
+ inline Gp zsi() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdSi); }
+ inline Gp zdi() const noexcept { return Gp(_emitter()->_gp_signature, Gp::kIdDi); }
//! \}
//! \name Native Pointers
//! \{
- //! Creates a target dependent pointer of which base register's id is `baseId`.
- inline Mem ptr_base(uint32_t baseId, int32_t off = 0, uint32_t size = 0) const noexcept {
- return Mem(OperandSignature::fromOpType(OperandType::kMem) |
- OperandSignature::fromMemBaseType(_emitter()->_gpSignature.regType()) |
- OperandSignature::fromSize(size),
- baseId, 0, off);
+ //! Creates a target dependent pointer of which base register's id is `base_id`.
+ inline Mem ptr_base(uint32_t base_id, int32_t off = 0, uint32_t size = 0) const noexcept {
+ return Mem(OperandSignature::from_op_type(OperandType::kMem) |
+ OperandSignature::from_mem_base_type(_emitter()->_gp_signature.reg_type()) |
+ OperandSignature::from_size(size),
+ base_id, 0, off);
}
inline Mem ptr_zax(int32_t off = 0, uint32_t size = 0) const noexcept { return ptr_base(Gp::kIdAx, off, size); }
@@ -183,58 +185,58 @@ struct EmitterExplicitT {
//! Creates an `intptr_t` memory operand depending on the current architecture.
inline Mem intptr_ptr(const Gp& base, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, index, shift, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, index, shift, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(const Label& base, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(const Label& base, const Gp& index, uint32_t shift, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, index, shift, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(const Label& base, const Vec& index, uint32_t shift, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, index, shift, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(const Rip& rip, int32_t offset = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(rip, offset, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(rip, offset, reg_size);
}
//! \overload
inline Mem intptr_ptr(uint64_t base) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, reg_size);
}
//! \overload
inline Mem intptr_ptr(uint64_t base, const Gp& index, uint32_t shift = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, nativeGpSize);
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, index, shift, reg_size);
}
//! \overload
inline Mem intptr_ptr_abs(uint64_t base) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, nativeGpSize, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, reg_size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
}
//! \overload
inline Mem intptr_ptr_abs(uint64_t base, const Gp& index, uint32_t shift = 0) const noexcept {
- uint32_t nativeGpSize = _emitter()->registerSize();
- return Mem(base, index, shift, nativeGpSize, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
+ uint32_t reg_size = _emitter()->register_size();
+ return Mem(base, index, shift, reg_size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
}
//! \}
@@ -243,13 +245,13 @@ struct EmitterExplicitT {
//! \{
//! Embeds 8-bit integer data.
- inline Error db(uint8_t x, size_t repeatCount = 1) { return _emitter()->embedUInt8(x, repeatCount); }
+ inline Error db(uint8_t x, size_t repeat_count = 1) { return _emitter()->embed_uint8(x, repeat_count); }
//! Embeds 16-bit integer data.
- inline Error dw(uint16_t x, size_t repeatCount = 1) { return _emitter()->embedUInt16(x, repeatCount); }
+ inline Error dw(uint16_t x, size_t repeat_count = 1) { return _emitter()->embed_uint16(x, repeat_count); }
//! Embeds 32-bit integer data.
- inline Error dd(uint32_t x, size_t repeatCount = 1) { return _emitter()->embedUInt32(x, repeatCount); }
+ inline Error dd(uint32_t x, size_t repeat_count = 1) { return _emitter()->embed_uint32(x, repeat_count); }
//! Embeds 64-bit integer data.
- inline Error dq(uint64_t x, size_t repeatCount = 1) { return _emitter()->embedUInt64(x, repeatCount); }
+ inline Error dq(uint64_t x, size_t repeat_count = 1) { return _emitter()->embed_uint64(x, repeat_count); }
//! Adds data in a given structure instance to the CodeBuffer.
template<typename T>
@@ -259,8 +261,8 @@ struct EmitterExplicitT {
protected:
//! \cond
- inline This& _addInstOptions(InstOptions options) noexcept {
- _emitter()->addInstOptions(options);
+ inline This& _add_inst_options(InstOptions options) noexcept {
+ _emitter()->add_inst_options(options);
return *_emitter();
}
//! \endcond
@@ -270,9 +272,9 @@ public:
//! \{
//! Force short form of jmp/jcc instruction.
- inline This& short_() noexcept { return _addInstOptions(InstOptions::kShortForm); }
+ inline This& short_() noexcept { return _add_inst_options(InstOptions::kShortForm); }
//! Force long form of jmp/jcc instruction.
- inline This& long_() noexcept { return _addInstOptions(InstOptions::kLongForm); }
+ inline This& long_() noexcept { return _add_inst_options(InstOptions::kLongForm); }
//! \}
@@ -280,10 +282,10 @@ public:
//! \{
//! Prefer MOD/RM encoding when both MOD/RM and MOD/MR forms are applicable.
- inline This& mod_rm() noexcept { return _addInstOptions(InstOptions::kX86_ModRM); }
+ inline This& mod_rm() noexcept { return _add_inst_options(InstOptions::kX86_ModRM); }
//! Prefer MOD/MR encoding when both MOD/RM and MOD/MR forms are applicable.
- inline This& mod_mr() noexcept { return _addInstOptions(InstOptions::kX86_ModMR); }
+ inline This& mod_mr() noexcept { return _add_inst_options(InstOptions::kX86_ModMR); }
//! \}
@@ -291,28 +293,28 @@ public:
//! \{
//! Condition is likely to be taken (has only benefit on P4).
- inline This& taken() noexcept { return _addInstOptions(InstOptions::kTaken); }
+ inline This& taken() noexcept { return _add_inst_options(InstOptions::kTaken); }
//! Condition is unlikely to be taken (has only benefit on P4).
- inline This& notTaken() noexcept { return _addInstOptions(InstOptions::kNotTaken); }
+ inline This& not_taken() noexcept { return _add_inst_options(InstOptions::kNotTaken); }
//! Use LOCK prefix.
- inline This& lock() noexcept { return _addInstOptions(InstOptions::kX86_Lock); }
+ inline This& lock() noexcept { return _add_inst_options(InstOptions::kX86_Lock); }
//! Use XACQUIRE prefix.
- inline This& xacquire() noexcept { return _addInstOptions(InstOptions::kX86_XAcquire); }
+ inline This& xacquire() noexcept { return _add_inst_options(InstOptions::kX86_XAcquire); }
//! Use XRELEASE prefix.
- inline This& xrelease() noexcept { return _addInstOptions(InstOptions::kX86_XRelease); }
+ inline This& xrelease() noexcept { return _add_inst_options(InstOptions::kX86_XRelease); }
//! Use BND/REPNE prefix.
//!
//! \note This is the same as using `repne()` or `repnz()` prefix.
- inline This& bnd() noexcept { return _addInstOptions(InstOptions::kX86_Repne); }
+ inline This& bnd() noexcept { return _add_inst_options(InstOptions::kX86_Repne); }
//! Use REP/REPZ prefix.
//!
//! \note This is the same as using `repe()` or `repz()` prefix.
inline This& rep(const Gp& zcx) noexcept {
- _emitter()->_extraReg.init(zcx);
- return _addInstOptions(InstOptions::kX86_Rep);
+ _emitter()->_extra_reg.init(zcx);
+ return _add_inst_options(InstOptions::kX86_Rep);
}
//! Use REP/REPE prefix.
@@ -329,8 +331,8 @@ public:
//!
//! \note This is the same as using `bnd()` or `repnz()` prefix.
inline This& repne(const Gp& zcx) noexcept {
- _emitter()->_extraReg.init(zcx);
- return _addInstOptions(InstOptions::kX86_Repne);
+ _emitter()->_extra_reg.init(zcx);
+ return _add_inst_options(InstOptions::kX86_Repne);
}
//! Use REPNE prefix.
@@ -347,16 +349,7 @@ public:
//!
//! \note Don't use when using high 8-bit registers as REX prefix makes them inaccessible and `x86::Assembler`
//! would fail to encode such instruction.
- inline This& rex() noexcept { return _addInstOptions(InstOptions::kX86_Rex); }
-
- //! Force REX.B prefix (X64) [It exists for special purposes only].
- inline This& rex_b() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeB); }
- //! Force REX.X prefix (X64) [It exists for special purposes only].
- inline This& rex_x() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeX); }
- //! Force REX.R prefix (X64) [It exists for special purposes only].
- inline This& rex_r() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeR); }
- //! Force REX.W prefix (X64) [It exists for special purposes only].
- inline This& rex_w() noexcept { return _addInstOptions(InstOptions::kX86_OpCodeW); }
+ inline This& rex() noexcept { return _add_inst_options(InstOptions::kX86_Rex); }
//! \}
@@ -364,11 +357,11 @@ public:
//! \{
//! Use VEX prefix instead of EVEX prefix (useful to select AVX_VNNI instruction instead of AVX512_VNNI).
- inline This& vex() noexcept { return _addInstOptions(InstOptions::kX86_Vex); }
+ inline This& vex() noexcept { return _add_inst_options(InstOptions::kX86_Vex); }
//! Force 3-byte VEX prefix (AVX+).
- inline This& vex3() noexcept { return _addInstOptions(InstOptions::kX86_Vex3); }
+ inline This& vex3() noexcept { return _add_inst_options(InstOptions::kX86_Vex3); }
//! Force 4-byte EVEX prefix (AVX512+).
- inline This& evex() noexcept { return _addInstOptions(InstOptions::kX86_Evex); }
+ inline This& evex() noexcept { return _add_inst_options(InstOptions::kX86_Evex); }
//! \}
@@ -377,23 +370,23 @@ public:
//! Use masking {k} (AVX512+).
inline This& k(const KReg& kreg) noexcept {
- _emitter()->_extraReg.init(kreg);
+ _emitter()->_extra_reg.init(kreg);
return *_emitter();
}
//! Use zeroing instead of merging (AVX512+).
- inline This& z() noexcept { return _addInstOptions(InstOptions::kX86_ZMask); }
+ inline This& z() noexcept { return _add_inst_options(InstOptions::kX86_ZMask); }
//! Suppress all exceptions (AVX512+).
- inline This& sae() noexcept { return _addInstOptions(InstOptions::kX86_SAE); }
+ inline This& sae() noexcept { return _add_inst_options(InstOptions::kX86_SAE); }
//! Static rounding mode {rn} (round-to-nearest even) and {sae} (AVX512+).
- inline This& rn_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RN_SAE); }
+ inline This& rn_sae() noexcept { return _add_inst_options(InstOptions::kX86_ER | InstOptions::kX86_RN_SAE); }
//! Static rounding mode {rd} (round-down, toward -inf) and {sae} (AVX512+).
- inline This& rd_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RD_SAE); }
+ inline This& rd_sae() noexcept { return _add_inst_options(InstOptions::kX86_ER | InstOptions::kX86_RD_SAE); }
//! Static rounding mode {ru} (round-up, toward +inf) and {sae} (AVX512+).
- inline This& ru_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RU_SAE); }
+ inline This& ru_sae() noexcept { return _add_inst_options(InstOptions::kX86_ER | InstOptions::kX86_RU_SAE); }
//! Static rounding mode {rz} (round-toward-zero, truncate) and {sae} (AVX512+).
- inline This& rz_sae() noexcept { return _addInstOptions(InstOptions::kX86_ER | InstOptions::kX86_RZ_SAE); }
+ inline This& rz_sae() noexcept { return _add_inst_options(InstOptions::kX86_ER | InstOptions::kX86_RZ_SAE); }
//! \}
@@ -447,8 +440,8 @@ public:
ASMJIT_INST_1x(call, Call, Mem) // ANY
ASMJIT_INST_1x(call, Call, Label) // ANY
ASMJIT_INST_1x(call, Call, Imm) // ANY
- ASMJIT_INST_2c(cmov, Cmov, Inst::cmovccFromCond, Gp, Gp) // CMOV
- ASMJIT_INST_2c(cmov, Cmov, Inst::cmovccFromCond, Gp, Mem) // CMOV
+ ASMJIT_INST_2c(cmov, Cmov, Inst::cmovcc_from_cond, Gp, Gp) // CMOV
+ ASMJIT_INST_2c(cmov, Cmov, Inst::cmovcc_from_cond, Gp, Mem) // CMOV
ASMJIT_INST_2x(cmp, Cmp, Gp, Gp) // ANY
ASMJIT_INST_2x(cmp, Cmp, Gp, Mem) // ANY
ASMJIT_INST_2x(cmp, Cmp, Gp, Imm) // ANY
@@ -457,8 +450,8 @@ public:
ASMJIT_INST_2x(cmps, Cmps, DS_ZSI, ES_ZDI) // ANY [EXPLICIT]
ASMJIT_INST_3x(cmpxchg, Cmpxchg, Gp, Gp, Gp_ZAX) // I486 [EXPLICIT]
ASMJIT_INST_3x(cmpxchg, Cmpxchg, Mem, Gp, Gp_ZAX) // I486 [EXPLICIT]
- ASMJIT_INST_5x(cmpxchg16b, Cmpxchg16b, Mem, Gp_RDX, Gp_RAX, Gp_RCX, Gp_RBX); // CMPXCHG16B [EXPLICIT] m == EDX:EAX ? m <- ECX:EBX
- ASMJIT_INST_5x(cmpxchg8b, Cmpxchg8b, Mem, Gp_EDX, Gp_EAX, Gp_ECX, Gp_EBX); // CMPXCHG8B [EXPLICIT] m == RDX:RAX ? m <- RCX:RBX
+ ASMJIT_INST_5x(cmpxchg16b, Cmpxchg16b, Mem, Gp_RDX, Gp_RAX, Gp_RCX, Gp_RBX) // CMPXCHG16B [EXPLICIT] m == EDX:EAX ? m <- ECX:EBX
+ ASMJIT_INST_5x(cmpxchg8b, Cmpxchg8b, Mem, Gp_EDX, Gp_EAX, Gp_ECX, Gp_EBX) // CMPXCHG8B [EXPLICIT] m == RDX:RAX ? m <- RCX:RBX
ASMJIT_INST_1x(dec, Dec, Gp) // ANY
ASMJIT_INST_1x(dec, Dec, Mem) // ANY
ASMJIT_INST_2x(div, Div, Gp, Gp) // ANY [EXPLICIT] AH[Rem]: AL[Quot] <- AX / r8
@@ -477,8 +470,8 @@ public:
ASMJIT_INST_3x(imul, Imul, Gp, Gp, Mem) // ANY [EXPLICIT] xDX:xAX <- xAX * m16|m32|m64
ASMJIT_INST_1x(inc, Inc, Gp) // ANY
ASMJIT_INST_1x(inc, Inc, Mem) // ANY
- ASMJIT_INST_1c(j, J, Inst::jccFromCond, Label) // ANY
- ASMJIT_INST_1c(j, J, Inst::jccFromCond, Imm) // ANY
+ ASMJIT_INST_1c(j, J, Inst::jcc_from_cond, Label) // ANY
+ ASMJIT_INST_1c(j, J, Inst::jcc_from_cond, Imm) // ANY
ASMJIT_INST_2x(jecxz, Jecxz, Gp, Label) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
ASMJIT_INST_2x(jecxz, Jecxz, Gp, Imm) // ANY [EXPLICIT] Short jump if CX/ECX/RCX is zero.
ASMJIT_INST_1x(jmp, Jmp, Gp) // ANY
@@ -541,7 +534,7 @@ public:
ASMJIT_INST_2x(or_, Or, Mem, Imm) // ANY
ASMJIT_INST_1x(pop, Pop, Gp) // ANY
ASMJIT_INST_1x(pop, Pop, Mem) // ANY
- ASMJIT_INST_1x(pop, Pop, SReg); // ANY
+ ASMJIT_INST_1x(pop, Pop, SReg) // ANY
ASMJIT_INST_0x(popa, Popa) // X86
ASMJIT_INST_0x(popad, Popad) // X86
ASMJIT_INST_0x(popf, Popf) // ANY
@@ -556,6 +549,7 @@ public:
ASMJIT_INST_0x(pushf, Pushf) // ANY
ASMJIT_INST_0x(pushfd, Pushfd) // X86
ASMJIT_INST_0x(pushfq, Pushfq) // X64
+ ASMJIT_INST_1x(pushw, Pushw, Imm) // ANY
ASMJIT_INST_2x(rcl, Rcl, Gp, Gp_CL) // ANY
ASMJIT_INST_2x(rcl, Rcl, Mem, Gp_CL) // ANY
ASMJIT_INST_2x(rcl, Rcl, Gp, Imm) // ANY
@@ -577,17 +571,17 @@ public:
ASMJIT_INST_2x(sbb, Sbb, Gp, Imm) // ANY
ASMJIT_INST_2x(sbb, Sbb, Mem, Gp) // ANY
ASMJIT_INST_2x(sbb, Sbb, Mem, Imm) // ANY
- ASMJIT_INST_2x(sal, Sal, Gp, Gp_CL) // ANY
- ASMJIT_INST_2x(sal, Sal, Mem, Gp_CL) // ANY
- ASMJIT_INST_2x(sal, Sal, Gp, Imm) // ANY
- ASMJIT_INST_2x(sal, Sal, Mem, Imm) // ANY
+ ASMJIT_INST_2x(sal, Shl, Gp, Gp_CL) // ANY
+ ASMJIT_INST_2x(sal, Shl, Mem, Gp_CL) // ANY
+ ASMJIT_INST_2x(sal, Shl, Gp, Imm) // ANY
+ ASMJIT_INST_2x(sal, Shl, Mem, Imm) // ANY
ASMJIT_INST_2x(sar, Sar, Gp, Gp_CL) // ANY
ASMJIT_INST_2x(sar, Sar, Mem, Gp_CL) // ANY
ASMJIT_INST_2x(sar, Sar, Gp, Imm) // ANY
ASMJIT_INST_2x(sar, Sar, Mem, Imm) // ANY
ASMJIT_INST_2x(scas, Scas, Gp_ZAX, ES_ZDI) // ANY [EXPLICIT]
- ASMJIT_INST_1c(set, Set, Inst::setccFromCond, Gp) // ANY
- ASMJIT_INST_1c(set, Set, Inst::setccFromCond, Mem) // ANY
+ ASMJIT_INST_1c(set, Set, Inst::setcc_from_cond, Gp) // ANY
+ ASMJIT_INST_1c(set, Set, Inst::setcc_from_cond, Mem) // ANY
ASMJIT_INST_2x(shl, Shl, Gp, Gp_CL) // ANY
ASMJIT_INST_2x(shl, Shl, Mem, Gp_CL) // ANY
ASMJIT_INST_2x(shl, Shl, Gp, Imm) // ANY
@@ -1381,675 +1375,675 @@ public:
//! \name MMX & SSE+ Instructions
//! \{
- ASMJIT_INST_2x(addpd, Addpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(addpd, Addpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(addps, Addps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(addps, Addps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(addsd, Addsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(addsd, Addsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(addss, Addss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(addss, Addss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(addsubpd, Addsubpd, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(addsubpd, Addsubpd, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(addsubps, Addsubps, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(addsubps, Addsubps, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(andnpd, Andnpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(andnpd, Andnpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(andnps, Andnps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(andnps, Andnps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(andpd, Andpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(andpd, Andpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(andps, Andps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(andps, Andps, Xmm, Mem) // SSE
- ASMJIT_INST_3x(blendpd, Blendpd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(blendpd, Blendpd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(blendps, Blendps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(blendps, Blendps, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(blendvpd, Blendvpd, Xmm, Xmm, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3x(blendvpd, Blendvpd, Xmm, Mem, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3x(blendvps, Blendvps, Xmm, Xmm, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3x(blendvps, Blendvps, Xmm, Mem, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3x(cmppd, Cmppd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(cmppd, Cmppd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3x(cmpps, Cmpps, Xmm, Xmm, Imm) // SSE
- ASMJIT_INST_3x(cmpps, Cmpps, Xmm, Mem, Imm) // SSE
- ASMJIT_INST_3x(cmpsd, Cmpsd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(cmpsd, Cmpsd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3x(cmpss, Cmpss, Xmm, Xmm, Imm) // SSE
- ASMJIT_INST_3x(cmpss, Cmpss, Xmm, Mem, Imm) // SSE
- ASMJIT_INST_2x(comisd, Comisd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(comisd, Comisd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(comiss, Comiss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(comiss, Comiss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(cvtdq2pd, Cvtdq2pd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtdq2pd, Cvtdq2pd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtdq2ps, Cvtdq2ps, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtdq2ps, Cvtdq2ps, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtpd2dq, Cvtpd2dq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtpd2dq, Cvtpd2dq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtpd2pi, Cvtpd2pi, Mm, Xmm) // SSE2
+ ASMJIT_INST_2x(addpd, Addpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(addpd, Addpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(addps, Addps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(addps, Addps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(addsd, Addsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(addsd, Addsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(addss, Addss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(addss, Addss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(addsubpd, Addsubpd, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(addsubpd, Addsubpd, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(addsubps, Addsubps, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(addsubps, Addsubps, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(andnpd, Andnpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(andnpd, Andnpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(andnps, Andnps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(andnps, Andnps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(andpd, Andpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(andpd, Andpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(andps, Andps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(andps, Andps, Vec, Mem) // SSE
+ ASMJIT_INST_3x(blendpd, Blendpd, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendpd, Blendpd, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendps, Blendps, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendps, Blendps, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(blendvpd, Blendvpd, Vec, Vec, XMM0) // SSE4_1 [EXPLICIT]
+ ASMJIT_INST_3x(blendvpd, Blendvpd, Vec, Mem, XMM0) // SSE4_1 [EXPLICIT]
+ ASMJIT_INST_3x(blendvps, Blendvps, Vec, Vec, XMM0) // SSE4_1 [EXPLICIT]
+ ASMJIT_INST_3x(blendvps, Blendvps, Vec, Mem, XMM0) // SSE4_1 [EXPLICIT]
+ ASMJIT_INST_3x(cmppd, Cmppd, Vec, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(cmppd, Cmppd, Vec, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(cmpps, Cmpps, Vec, Vec, Imm) // SSE
+ ASMJIT_INST_3x(cmpps, Cmpps, Vec, Mem, Imm) // SSE
+ ASMJIT_INST_3x(cmpsd, Cmpsd, Vec, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(cmpsd, Cmpsd, Vec, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(cmpss, Cmpss, Vec, Vec, Imm) // SSE
+ ASMJIT_INST_3x(cmpss, Cmpss, Vec, Mem, Imm) // SSE
+ ASMJIT_INST_2x(comisd, Comisd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(comisd, Comisd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(comiss, Comiss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(comiss, Comiss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(cvtdq2pd, Cvtdq2pd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtdq2pd, Cvtdq2pd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtdq2ps, Cvtdq2ps, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtdq2ps, Cvtdq2ps, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtpd2dq, Cvtpd2dq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtpd2dq, Cvtpd2dq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtpd2pi, Cvtpd2pi, Mm, Vec) // SSE2
ASMJIT_INST_2x(cvtpd2pi, Cvtpd2pi, Mm, Mem) // SSE2
- ASMJIT_INST_2x(cvtpd2ps, Cvtpd2ps, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtpd2ps, Cvtpd2ps, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtpi2pd, Cvtpi2pd, Xmm, Mm) // SSE2
- ASMJIT_INST_2x(cvtpi2pd, Cvtpi2pd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtpi2ps, Cvtpi2ps, Xmm, Mm) // SSE
- ASMJIT_INST_2x(cvtpi2ps, Cvtpi2ps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(cvtps2dq, Cvtps2dq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtps2dq, Cvtps2dq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtps2pd, Cvtps2pd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtps2pd, Cvtps2pd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtps2pi, Cvtps2pi, Mm, Xmm) // SSE
+ ASMJIT_INST_2x(cvtpd2ps, Cvtpd2ps, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtpd2ps, Cvtpd2ps, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtpi2pd, Cvtpi2pd, Vec, Mm) // SSE2
+ ASMJIT_INST_2x(cvtpi2pd, Cvtpi2pd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtpi2ps, Cvtpi2ps, Vec, Mm) // SSE
+ ASMJIT_INST_2x(cvtpi2ps, Cvtpi2ps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(cvtps2dq, Cvtps2dq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtps2dq, Cvtps2dq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtps2pd, Cvtps2pd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtps2pd, Cvtps2pd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtps2pi, Cvtps2pi, Mm, Vec) // SSE
ASMJIT_INST_2x(cvtps2pi, Cvtps2pi, Mm, Mem) // SSE
- ASMJIT_INST_2x(cvtsd2si, Cvtsd2si, Gp, Xmm) // SSE2
+ ASMJIT_INST_2x(cvtsd2si, Cvtsd2si, Gp, Vec) // SSE2
ASMJIT_INST_2x(cvtsd2si, Cvtsd2si, Gp, Mem) // SSE2
- ASMJIT_INST_2x(cvtsd2ss, Cvtsd2ss, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtsd2ss, Cvtsd2ss, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtsi2sd, Cvtsi2sd, Xmm, Gp) // SSE2
- ASMJIT_INST_2x(cvtsi2sd, Cvtsi2sd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtsi2ss, Cvtsi2ss, Xmm, Gp) // SSE
- ASMJIT_INST_2x(cvtsi2ss, Cvtsi2ss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(cvtss2sd, Cvtss2sd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvtss2sd, Cvtss2sd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvtss2si, Cvtss2si, Gp, Xmm) // SSE
+ ASMJIT_INST_2x(cvtsd2ss, Cvtsd2ss, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtsd2ss, Cvtsd2ss, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtsi2sd, Cvtsi2sd, Vec, Gp) // SSE2
+ ASMJIT_INST_2x(cvtsi2sd, Cvtsi2sd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtsi2ss, Cvtsi2ss, Vec, Gp) // SSE
+ ASMJIT_INST_2x(cvtsi2ss, Cvtsi2ss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(cvtss2sd, Cvtss2sd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvtss2sd, Cvtss2sd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvtss2si, Cvtss2si, Gp, Vec) // SSE
ASMJIT_INST_2x(cvtss2si, Cvtss2si, Gp, Mem) // SSE
- ASMJIT_INST_2x(cvttpd2pi, Cvttpd2pi, Mm, Xmm) // SSE2
+ ASMJIT_INST_2x(cvttpd2pi, Cvttpd2pi, Mm, Vec) // SSE2
ASMJIT_INST_2x(cvttpd2pi, Cvttpd2pi, Mm, Mem) // SSE2
- ASMJIT_INST_2x(cvttpd2dq, Cvttpd2dq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvttpd2dq, Cvttpd2dq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvttps2dq, Cvttps2dq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(cvttps2dq, Cvttps2dq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(cvttps2pi, Cvttps2pi, Mm, Xmm) // SSE
+ ASMJIT_INST_2x(cvttpd2dq, Cvttpd2dq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvttpd2dq, Cvttpd2dq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvttps2dq, Cvttps2dq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(cvttps2dq, Cvttps2dq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(cvttps2pi, Cvttps2pi, Mm, Vec) // SSE
ASMJIT_INST_2x(cvttps2pi, Cvttps2pi, Mm, Mem) // SSE
- ASMJIT_INST_2x(cvttsd2si, Cvttsd2si, Gp, Xmm) // SSE2
+ ASMJIT_INST_2x(cvttsd2si, Cvttsd2si, Gp, Vec) // SSE2
ASMJIT_INST_2x(cvttsd2si, Cvttsd2si, Gp, Mem) // SSE2
- ASMJIT_INST_2x(cvttss2si, Cvttss2si, Gp, Xmm) // SSE
+ ASMJIT_INST_2x(cvttss2si, Cvttss2si, Gp, Vec) // SSE
ASMJIT_INST_2x(cvttss2si, Cvttss2si, Gp, Mem) // SSE
- ASMJIT_INST_2x(divpd, Divpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(divpd, Divpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(divps, Divps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(divps, Divps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(divsd, Divsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(divsd, Divsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(divss, Divss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(divss, Divss, Xmm, Mem) // SSE
- ASMJIT_INST_3x(dppd, Dppd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(dppd, Dppd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(dpps, Dpps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(dpps, Dpps, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(extractps, Extractps, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(extractps, Extractps, Mem, Xmm, Imm) // SSE4_1
- ASMJIT_INST_2x(extrq, Extrq, Xmm, Xmm) // SSE4A
- ASMJIT_INST_3x(extrq, Extrq, Xmm, Imm, Imm) // SSE4A
- ASMJIT_INST_2x(haddpd, Haddpd, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(haddpd, Haddpd, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(haddps, Haddps, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(haddps, Haddps, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(hsubpd, Hsubpd, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(hsubpd, Hsubpd, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(hsubps, Hsubps, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(hsubps, Hsubps, Xmm, Mem) // SSE3
- ASMJIT_INST_3x(insertps, Insertps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(insertps, Insertps, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_2x(insertq, Insertq, Xmm, Xmm) // SSE4A
- ASMJIT_INST_4x(insertq, Insertq, Xmm, Xmm, Imm, Imm) // SSE4A
- ASMJIT_INST_2x(lddqu, Lddqu, Xmm, Mem) // SSE3
+ ASMJIT_INST_2x(divpd, Divpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(divpd, Divpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(divps, Divps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(divps, Divps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(divsd, Divsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(divsd, Divsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(divss, Divss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(divss, Divss, Vec, Mem) // SSE
+ ASMJIT_INST_3x(dppd, Dppd, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(dppd, Dppd, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(dpps, Dpps, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(dpps, Dpps, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(extractps, Extractps, Gp, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(extractps, Extractps, Mem, Vec, Imm) // SSE4_1
+ ASMJIT_INST_2x(extrq, Extrq, Vec, Vec) // SSE4A
+ ASMJIT_INST_3x(extrq, Extrq, Vec, Imm, Imm) // SSE4A
+ ASMJIT_INST_2x(haddpd, Haddpd, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(haddpd, Haddpd, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(haddps, Haddps, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(haddps, Haddps, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(hsubpd, Hsubpd, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(hsubpd, Hsubpd, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(hsubps, Hsubps, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(hsubps, Hsubps, Vec, Mem) // SSE3
+ ASMJIT_INST_3x(insertps, Insertps, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(insertps, Insertps, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_2x(insertq, Insertq, Vec, Vec) // SSE4A
+ ASMJIT_INST_4x(insertq, Insertq, Vec, Vec, Imm, Imm) // SSE4A
+ ASMJIT_INST_2x(lddqu, Lddqu, Vec, Mem) // SSE3
ASMJIT_INST_3x(maskmovq, Maskmovq, Mm, Mm, DS_ZDI) // SSE [EXPLICIT]
- ASMJIT_INST_3x(maskmovdqu, Maskmovdqu, Xmm, Xmm, DS_ZDI) // SSE2 [EXPLICIT]
- ASMJIT_INST_2x(maxpd, Maxpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(maxpd, Maxpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(maxps, Maxps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(maxps, Maxps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(maxsd, Maxsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(maxsd, Maxsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(maxss, Maxss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(maxss, Maxss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(minpd, Minpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(minpd, Minpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(minps, Minps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(minps, Minps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(minsd, Minsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(minsd, Minsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(minss, Minss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(minss, Minss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(movapd, Movapd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(movapd, Movapd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movapd, Movapd, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movaps, Movaps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(movaps, Movaps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(movaps, Movaps, Mem, Xmm) // SSE
+ ASMJIT_INST_3x(maskmovdqu, Maskmovdqu, Vec, Vec, DS_ZDI) // SSE2 [EXPLICIT]
+ ASMJIT_INST_2x(maxpd, Maxpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(maxpd, Maxpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(maxps, Maxps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(maxps, Maxps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(maxsd, Maxsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(maxsd, Maxsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(maxss, Maxss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(maxss, Maxss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(minpd, Minpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(minpd, Minpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(minps, Minps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(minps, Minps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(minsd, Minsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(minsd, Minsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(minss, Minss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(minss, Minss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(movapd, Movapd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(movapd, Movapd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movapd, Movapd, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movaps, Movaps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(movaps, Movaps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(movaps, Movaps, Mem, Vec) // SSE
ASMJIT_INST_2x(movd, Movd, Mem, Mm) // MMX
- ASMJIT_INST_2x(movd, Movd, Mem, Xmm) // SSE
+ ASMJIT_INST_2x(movd, Movd, Mem, Vec) // SSE
ASMJIT_INST_2x(movd, Movd, Gp, Mm) // MMX
- ASMJIT_INST_2x(movd, Movd, Gp, Xmm) // SSE
+ ASMJIT_INST_2x(movd, Movd, Gp, Vec) // SSE
ASMJIT_INST_2x(movd, Movd, Mm, Mem) // MMX
- ASMJIT_INST_2x(movd, Movd, Xmm, Mem) // SSE
+ ASMJIT_INST_2x(movd, Movd, Vec, Mem) // SSE
ASMJIT_INST_2x(movd, Movd, Mm, Gp) // MMX
- ASMJIT_INST_2x(movd, Movd, Xmm, Gp) // SSE
- ASMJIT_INST_2x(movddup, Movddup, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(movddup, Movddup, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(movdq2q, Movdq2q, Mm, Xmm) // SSE2
- ASMJIT_INST_2x(movdqa, Movdqa, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(movdqa, Movdqa, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movdqa, Movdqa, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movdqu, Movdqu, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(movdqu, Movdqu, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movdqu, Movdqu, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movhlps, Movhlps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(movhpd, Movhpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movhpd, Movhpd, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movhps, Movhps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(movhps, Movhps, Mem, Xmm) // SSE
- ASMJIT_INST_2x(movlhps, Movlhps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(movlpd, Movlpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movlpd, Movlpd, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movlps, Movlps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(movlps, Movlps, Mem, Xmm) // SSE
- ASMJIT_INST_2x(movmskps, Movmskps, Gp, Xmm) // SSE2
- ASMJIT_INST_2x(movmskpd, Movmskpd, Gp, Xmm) // SSE2
- ASMJIT_INST_2x(movntdq, Movntdq, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movntdqa, Movntdqa, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(movntpd, Movntpd, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movntps, Movntps, Mem, Xmm) // SSE
- ASMJIT_INST_2x(movntsd, Movntsd, Mem, Xmm) // SSE4A
- ASMJIT_INST_2x(movntss, Movntss, Mem, Xmm) // SSE4A
+ ASMJIT_INST_2x(movd, Movd, Vec, Gp) // SSE
+ ASMJIT_INST_2x(movddup, Movddup, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(movddup, Movddup, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(movdq2q, Movdq2q, Mm, Vec) // SSE2
+ ASMJIT_INST_2x(movdqa, Movdqa, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(movdqa, Movdqa, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movdqa, Movdqa, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movdqu, Movdqu, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(movdqu, Movdqu, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movdqu, Movdqu, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movhlps, Movhlps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(movhpd, Movhpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movhpd, Movhpd, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movhps, Movhps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(movhps, Movhps, Mem, Vec) // SSE
+ ASMJIT_INST_2x(movlhps, Movlhps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(movlpd, Movlpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movlpd, Movlpd, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movlps, Movlps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(movlps, Movlps, Mem, Vec) // SSE
+ ASMJIT_INST_2x(movmskps, Movmskps, Gp, Vec) // SSE2
+ ASMJIT_INST_2x(movmskpd, Movmskpd, Gp, Vec) // SSE2
+ ASMJIT_INST_2x(movntdq, Movntdq, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movntdqa, Movntdqa, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(movntpd, Movntpd, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movntps, Movntps, Mem, Vec) // SSE
+ ASMJIT_INST_2x(movntsd, Movntsd, Mem, Vec) // SSE4A
+ ASMJIT_INST_2x(movntss, Movntss, Mem, Vec) // SSE4A
ASMJIT_INST_2x(movntq, Movntq, Mem, Mm) // SSE
ASMJIT_INST_2x(movq, Movq, Mm, Mm) // MMX
- ASMJIT_INST_2x(movq, Movq, Xmm, Xmm) // SSE
+ ASMJIT_INST_2x(movq, Movq, Vec, Vec) // SSE
ASMJIT_INST_2x(movq, Movq, Mem, Mm) // MMX
- ASMJIT_INST_2x(movq, Movq, Mem, Xmm) // SSE
+ ASMJIT_INST_2x(movq, Movq, Mem, Vec) // SSE
ASMJIT_INST_2x(movq, Movq, Mm, Mem) // MMX
- ASMJIT_INST_2x(movq, Movq, Xmm, Mem) // SSE
+ ASMJIT_INST_2x(movq, Movq, Vec, Mem) // SSE
ASMJIT_INST_2x(movq, Movq, Gp, Mm) // MMX
- ASMJIT_INST_2x(movq, Movq, Gp, Xmm) // SSE+X64.
+ ASMJIT_INST_2x(movq, Movq, Gp, Vec) // SSE+X64.
ASMJIT_INST_2x(movq, Movq, Mm, Gp) // MMX
- ASMJIT_INST_2x(movq, Movq, Xmm, Gp) // SSE+X64.
- ASMJIT_INST_2x(movq2dq, Movq2dq, Xmm, Mm) // SSE2
- ASMJIT_INST_2x(movsd, Movsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(movsd, Movsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movsd, Movsd, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movshdup, Movshdup, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(movshdup, Movshdup, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(movsldup, Movsldup, Xmm, Xmm) // SSE3
- ASMJIT_INST_2x(movsldup, Movsldup, Xmm, Mem) // SSE3
- ASMJIT_INST_2x(movss, Movss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(movss, Movss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(movss, Movss, Mem, Xmm) // SSE
- ASMJIT_INST_2x(movupd, Movupd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(movupd, Movupd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(movupd, Movupd, Mem, Xmm) // SSE2
- ASMJIT_INST_2x(movups, Movups, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(movups, Movups, Xmm, Mem) // SSE
- ASMJIT_INST_2x(movups, Movups, Mem, Xmm) // SSE
- ASMJIT_INST_3x(mpsadbw, Mpsadbw, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(mpsadbw, Mpsadbw, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_2x(mulpd, Mulpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(mulpd, Mulpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(mulps, Mulps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(mulps, Mulps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(mulsd, Mulsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(mulsd, Mulsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(mulss, Mulss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(mulss, Mulss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(orpd, Orpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(orpd, Orpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(orps, Orps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(orps, Orps, Xmm, Mem) // SSE
+ ASMJIT_INST_2x(movq, Movq, Vec, Gp) // SSE+X64.
+ ASMJIT_INST_2x(movq2dq, Movq2dq, Vec, Mm) // SSE2
+ ASMJIT_INST_2x(movsd, Movsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(movsd, Movsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movsd, Movsd, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movshdup, Movshdup, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(movshdup, Movshdup, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(movsldup, Movsldup, Vec, Vec) // SSE3
+ ASMJIT_INST_2x(movsldup, Movsldup, Vec, Mem) // SSE3
+ ASMJIT_INST_2x(movss, Movss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(movss, Movss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(movss, Movss, Mem, Vec) // SSE
+ ASMJIT_INST_2x(movupd, Movupd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(movupd, Movupd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(movupd, Movupd, Mem, Vec) // SSE2
+ ASMJIT_INST_2x(movups, Movups, Vec, Vec) // SSE
+ ASMJIT_INST_2x(movups, Movups, Vec, Mem) // SSE
+ ASMJIT_INST_2x(movups, Movups, Mem, Vec) // SSE
+ ASMJIT_INST_3x(mpsadbw, Mpsadbw, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(mpsadbw, Mpsadbw, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_2x(mulpd, Mulpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(mulpd, Mulpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(mulps, Mulps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(mulps, Mulps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(mulsd, Mulsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(mulsd, Mulsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(mulss, Mulss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(mulss, Mulss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(orpd, Orpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(orpd, Orpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(orps, Orps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(orps, Orps, Vec, Mem) // SSE
ASMJIT_INST_2x(packssdw, Packssdw, Mm, Mm) // MMX
ASMJIT_INST_2x(packssdw, Packssdw, Mm, Mem) // MMX
- ASMJIT_INST_2x(packssdw, Packssdw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(packssdw, Packssdw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(packssdw, Packssdw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(packssdw, Packssdw, Vec, Mem) // SSE2
ASMJIT_INST_2x(packsswb, Packsswb, Mm, Mm) // MMX
ASMJIT_INST_2x(packsswb, Packsswb, Mm, Mem) // MMX
- ASMJIT_INST_2x(packsswb, Packsswb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(packsswb, Packsswb, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(packusdw, Packusdw, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(packusdw, Packusdw, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(packsswb, Packsswb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(packsswb, Packsswb, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(packusdw, Packusdw, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(packusdw, Packusdw, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(packuswb, Packuswb, Mm, Mm) // MMX
ASMJIT_INST_2x(packuswb, Packuswb, Mm, Mem) // MMX
- ASMJIT_INST_2x(packuswb, Packuswb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(packuswb, Packuswb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(packuswb, Packuswb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(packuswb, Packuswb, Vec, Mem) // SSE2
ASMJIT_INST_2x(pabsb, Pabsb, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pabsb, Pabsb, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(pabsb, Pabsb, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(pabsb, Pabsb, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(pabsb, Pabsb, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(pabsb, Pabsb, Vec, Mem) // SSSE3
ASMJIT_INST_2x(pabsd, Pabsd, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pabsd, Pabsd, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(pabsd, Pabsd, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(pabsd, Pabsd, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(pabsd, Pabsd, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(pabsd, Pabsd, Vec, Mem) // SSSE3
ASMJIT_INST_2x(pabsw, Pabsw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pabsw, Pabsw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(pabsw, Pabsw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(pabsw, Pabsw, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(pabsw, Pabsw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(pabsw, Pabsw, Vec, Mem) // SSSE3
ASMJIT_INST_2x(paddb, Paddb, Mm, Mm) // MMX
ASMJIT_INST_2x(paddb, Paddb, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddb, Paddb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddb, Paddb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddb, Paddb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddb, Paddb, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddd, Paddd, Mm, Mm) // MMX
ASMJIT_INST_2x(paddd, Paddd, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddd, Paddd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddd, Paddd, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddd, Paddd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddd, Paddd, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddq, Paddq, Mm, Mm) // SSE2
ASMJIT_INST_2x(paddq, Paddq, Mm, Mem) // SSE2
- ASMJIT_INST_2x(paddq, Paddq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddq, Paddq, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddq, Paddq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddq, Paddq, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddsb, Paddsb, Mm, Mm) // MMX
ASMJIT_INST_2x(paddsb, Paddsb, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddsb, Paddsb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddsb, Paddsb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddsb, Paddsb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddsb, Paddsb, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddsw, Paddsw, Mm, Mm) // MMX
ASMJIT_INST_2x(paddsw, Paddsw, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddsw, Paddsw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddsw, Paddsw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddsw, Paddsw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddsw, Paddsw, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddusb, Paddusb, Mm, Mm) // MMX
ASMJIT_INST_2x(paddusb, Paddusb, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddusb, Paddusb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddusb, Paddusb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddusb, Paddusb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddusb, Paddusb, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddusw, Paddusw, Mm, Mm) // MMX
ASMJIT_INST_2x(paddusw, Paddusw, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddusw, Paddusw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddusw, Paddusw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddusw, Paddusw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddusw, Paddusw, Vec, Mem) // SSE2
ASMJIT_INST_2x(paddw, Paddw, Mm, Mm) // MMX
ASMJIT_INST_2x(paddw, Paddw, Mm, Mem) // MMX
- ASMJIT_INST_2x(paddw, Paddw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(paddw, Paddw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(paddw, Paddw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(paddw, Paddw, Vec, Mem) // SSE2
ASMJIT_INST_3x(palignr, Palignr, Mm, Mm, Imm) // SSSE3
ASMJIT_INST_3x(palignr, Palignr, Mm, Mem, Imm) // SSSE3
- ASMJIT_INST_3x(palignr, Palignr, Xmm, Xmm, Imm) // SSSE3
- ASMJIT_INST_3x(palignr, Palignr, Xmm, Mem, Imm) // SSSE3
+ ASMJIT_INST_3x(palignr, Palignr, Vec, Vec, Imm) // SSSE3
+ ASMJIT_INST_3x(palignr, Palignr, Vec, Mem, Imm) // SSSE3
ASMJIT_INST_2x(pand, Pand, Mm, Mm) // MMX
ASMJIT_INST_2x(pand, Pand, Mm, Mem) // MMX
- ASMJIT_INST_2x(pand, Pand, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pand, Pand, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pand, Pand, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pand, Pand, Vec, Mem) // SSE2
ASMJIT_INST_2x(pandn, Pandn, Mm, Mm) // MMX
ASMJIT_INST_2x(pandn, Pandn, Mm, Mem) // MMX
- ASMJIT_INST_2x(pandn, Pandn, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pandn, Pandn, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pandn, Pandn, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pandn, Pandn, Vec, Mem) // SSE2
ASMJIT_INST_2x(pavgb, Pavgb, Mm, Mm) // SSE
ASMJIT_INST_2x(pavgb, Pavgb, Mm, Mem) // SSE
- ASMJIT_INST_2x(pavgb, Pavgb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pavgb, Pavgb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pavgb, Pavgb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pavgb, Pavgb, Vec, Mem) // SSE2
ASMJIT_INST_2x(pavgw, Pavgw, Mm, Mm) // SSE
ASMJIT_INST_2x(pavgw, Pavgw, Mm, Mem) // SSE
- ASMJIT_INST_2x(pavgw, Pavgw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pavgw, Pavgw, Xmm, Mem) // SSE2
- ASMJIT_INST_3x(pblendvb, Pblendvb, Xmm, Xmm, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3x(pblendvb, Pblendvb, Xmm, Mem, XMM0) // SSE4_1 [EXPLICIT]
- ASMJIT_INST_3x(pblendw, Pblendw, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(pblendw, Pblendw, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(pclmulqdq, Pclmulqdq, Xmm, Xmm, Imm) // PCLMULQDQ.
- ASMJIT_INST_3x(pclmulqdq, Pclmulqdq, Xmm, Mem, Imm) // PCLMULQDQ.
- ASMJIT_INST_6x(pcmpestri, Pcmpestri, Xmm, Xmm, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_6x(pcmpestri, Pcmpestri, Xmm, Mem, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Xmm, Xmm, Imm, XMM0, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Xmm, Mem, Imm, XMM0, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_2x(pavgw, Pavgw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pavgw, Pavgw, Vec, Mem) // SSE2
+ ASMJIT_INST_3x(pblendvb, Pblendvb, Vec, Vec, XMM0) // SSE4_1 [EXPLICIT]
+ ASMJIT_INST_3x(pblendvb, Pblendvb, Vec, Mem, XMM0) // SSE4_1 [EXPLICIT]
+ ASMJIT_INST_3x(pblendw, Pblendw, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(pblendw, Pblendw, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pclmulqdq, Pclmulqdq, Vec, Vec, Imm) // PCLMULQDQ.
+ ASMJIT_INST_3x(pclmulqdq, Pclmulqdq, Vec, Mem, Imm) // PCLMULQDQ.
+ ASMJIT_INST_6x(pcmpestri, Pcmpestri, Vec, Vec, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_6x(pcmpestri, Pcmpestri, Vec, Mem, Imm, Gp_ECX, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Vec, Vec, Imm, XMM0, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_6x(pcmpestrm, Pcmpestrm, Vec, Mem, Imm, XMM0, Gp_EAX, Gp_EDX) // SSE4_2 [EXPLICIT]
ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Mm, Mem) // MMX
- ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pcmpeqb, Pcmpeqb, Vec, Mem) // SSE2
ASMJIT_INST_2x(pcmpeqd, Pcmpeqd, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpeqd, Pcmpeqd, Mm, Mem) // MMX
- ASMJIT_INST_2x(pcmpeqd, Pcmpeqd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pcmpeqd, Pcmpeqd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pcmpeqq, Pcmpeqq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pcmpeqq, Pcmpeqq, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(pcmpeqd, Pcmpeqd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pcmpeqd, Pcmpeqd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pcmpeqq, Pcmpeqq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pcmpeqq, Pcmpeqq, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(pcmpeqw, Pcmpeqw, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpeqw, Pcmpeqw, Mm, Mem) // MMX
- ASMJIT_INST_2x(pcmpeqw, Pcmpeqw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pcmpeqw, Pcmpeqw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pcmpeqw, Pcmpeqw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pcmpeqw, Pcmpeqw, Vec, Mem) // SSE2
ASMJIT_INST_2x(pcmpgtb, Pcmpgtb, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpgtb, Pcmpgtb, Mm, Mem) // MMX
- ASMJIT_INST_2x(pcmpgtb, Pcmpgtb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pcmpgtb, Pcmpgtb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pcmpgtb, Pcmpgtb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pcmpgtb, Pcmpgtb, Vec, Mem) // SSE2
ASMJIT_INST_2x(pcmpgtd, Pcmpgtd, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpgtd, Pcmpgtd, Mm, Mem) // MMX
- ASMJIT_INST_2x(pcmpgtd, Pcmpgtd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pcmpgtd, Pcmpgtd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pcmpgtq, Pcmpgtq, Xmm, Xmm) // SSE4_2.
- ASMJIT_INST_2x(pcmpgtq, Pcmpgtq, Xmm, Mem) // SSE4_2.
+ ASMJIT_INST_2x(pcmpgtd, Pcmpgtd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pcmpgtd, Pcmpgtd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pcmpgtq, Pcmpgtq, Vec, Vec) // SSE4_2.
+ ASMJIT_INST_2x(pcmpgtq, Pcmpgtq, Vec, Mem) // SSE4_2.
ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Mm, Mm) // MMX
ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Mm, Mem) // MMX
- ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Xmm, Mem) // SSE2
- ASMJIT_INST_4x(pcmpistri, Pcmpistri, Xmm, Xmm, Imm, Gp_ECX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_4x(pcmpistri, Pcmpistri, Xmm, Mem, Imm, Gp_ECX) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_4x(pcmpistrm, Pcmpistrm, Xmm, Xmm, Imm, XMM0) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_4x(pcmpistrm, Pcmpistrm, Xmm, Mem, Imm, XMM0) // SSE4_2 [EXPLICIT]
- ASMJIT_INST_3x(pextrb, Pextrb, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(pextrb, Pextrb, Mem, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(pextrd, Pextrd, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(pextrd, Pextrd, Mem, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(pextrq, Pextrq, Gp, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(pextrq, Pextrq, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pcmpgtw, Pcmpgtw, Vec, Mem) // SSE2
+ ASMJIT_INST_4x(pcmpistri, Pcmpistri, Vec, Vec, Imm, Gp_ECX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_4x(pcmpistri, Pcmpistri, Vec, Mem, Imm, Gp_ECX) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_4x(pcmpistrm, Pcmpistrm, Vec, Vec, Imm, XMM0) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_4x(pcmpistrm, Pcmpistrm, Vec, Mem, Imm, XMM0) // SSE4_2 [EXPLICIT]
+ ASMJIT_INST_3x(pextrb, Pextrb, Gp, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrb, Pextrb, Mem, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrd, Pextrd, Gp, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrd, Pextrd, Mem, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrq, Pextrq, Gp, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrq, Pextrq, Mem, Vec, Imm) // SSE4_1
ASMJIT_INST_3x(pextrw, Pextrw, Gp, Mm, Imm) // SSE
- ASMJIT_INST_3x(pextrw, Pextrw, Gp, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(pextrw, Pextrw, Mem, Xmm, Imm) // SSE4_1
+ ASMJIT_INST_3x(pextrw, Pextrw, Gp, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(pextrw, Pextrw, Mem, Vec, Imm) // SSE4_1
ASMJIT_INST_2x(phaddd, Phaddd, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phaddd, Phaddd, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(phaddd, Phaddd, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(phaddd, Phaddd, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(phaddd, Phaddd, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(phaddd, Phaddd, Vec, Mem) // SSSE3
ASMJIT_INST_2x(phaddsw, Phaddsw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phaddsw, Phaddsw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(phaddsw, Phaddsw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(phaddsw, Phaddsw, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(phaddsw, Phaddsw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(phaddsw, Phaddsw, Vec, Mem) // SSSE3
ASMJIT_INST_2x(phaddw, Phaddw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phaddw, Phaddw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(phaddw, Phaddw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(phaddw, Phaddw, Xmm, Mem) // SSSE3
- ASMJIT_INST_2x(phminposuw, Phminposuw, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(phminposuw, Phminposuw, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(phaddw, Phaddw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(phaddw, Phaddw, Vec, Mem) // SSSE3
+ ASMJIT_INST_2x(phminposuw, Phminposuw, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(phminposuw, Phminposuw, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(phsubd, Phsubd, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phsubd, Phsubd, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(phsubd, Phsubd, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(phsubd, Phsubd, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(phsubd, Phsubd, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(phsubd, Phsubd, Vec, Mem) // SSSE3
ASMJIT_INST_2x(phsubsw, Phsubsw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phsubsw, Phsubsw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(phsubsw, Phsubsw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(phsubsw, Phsubsw, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(phsubsw, Phsubsw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(phsubsw, Phsubsw, Vec, Mem) // SSSE3
ASMJIT_INST_2x(phsubw, Phsubw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(phsubw, Phsubw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(phsubw, Phsubw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(phsubw, Phsubw, Xmm, Mem) // SSSE3
- ASMJIT_INST_3x(pinsrb, Pinsrb, Xmm, Gp, Imm) // SSE4_1
- ASMJIT_INST_3x(pinsrb, Pinsrb, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(pinsrd, Pinsrd, Xmm, Gp, Imm) // SSE4_1
- ASMJIT_INST_3x(pinsrd, Pinsrd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(pinsrq, Pinsrq, Xmm, Gp, Imm) // SSE4_1
- ASMJIT_INST_3x(pinsrq, Pinsrq, Xmm, Mem, Imm) // SSE4_1
+ ASMJIT_INST_2x(phsubw, Phsubw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(phsubw, Phsubw, Vec, Mem) // SSSE3
+ ASMJIT_INST_3x(pinsrb, Pinsrb, Vec, Gp, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrb, Pinsrb, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrd, Pinsrd, Vec, Gp, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrd, Pinsrd, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrq, Pinsrq, Vec, Gp, Imm) // SSE4_1
+ ASMJIT_INST_3x(pinsrq, Pinsrq, Vec, Mem, Imm) // SSE4_1
ASMJIT_INST_3x(pinsrw, Pinsrw, Mm, Gp, Imm) // SSE
ASMJIT_INST_3x(pinsrw, Pinsrw, Mm, Mem, Imm) // SSE
- ASMJIT_INST_3x(pinsrw, Pinsrw, Xmm, Gp, Imm) // SSE2
- ASMJIT_INST_3x(pinsrw, Pinsrw, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pinsrw, Pinsrw, Vec, Gp, Imm) // SSE2
+ ASMJIT_INST_3x(pinsrw, Pinsrw, Vec, Mem, Imm) // SSE2
ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(pmaddubsw, Pmaddubsw, Vec, Mem) // SSSE3
ASMJIT_INST_2x(pmaddwd, Pmaddwd, Mm, Mm) // MMX
ASMJIT_INST_2x(pmaddwd, Pmaddwd, Mm, Mem) // MMX
- ASMJIT_INST_2x(pmaddwd, Pmaddwd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmaddwd, Pmaddwd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pmaxsb, Pmaxsb, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmaxsb, Pmaxsb, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmaxsd, Pmaxsd, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmaxsd, Pmaxsd, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmaddwd, Pmaddwd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmaddwd, Pmaddwd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pmaxsb, Pmaxsb, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmaxsb, Pmaxsb, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmaxsd, Pmaxsd, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmaxsd, Pmaxsd, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(pmaxsw, Pmaxsw, Mm, Mm) // SSE
ASMJIT_INST_2x(pmaxsw, Pmaxsw, Mm, Mem) // SSE
- ASMJIT_INST_2x(pmaxsw, Pmaxsw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmaxsw, Pmaxsw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pmaxsw, Pmaxsw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmaxsw, Pmaxsw, Vec, Mem) // SSE2
ASMJIT_INST_2x(pmaxub, Pmaxub, Mm, Mm) // SSE
ASMJIT_INST_2x(pmaxub, Pmaxub, Mm, Mem) // SSE
- ASMJIT_INST_2x(pmaxub, Pmaxub, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmaxub, Pmaxub, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pmaxud, Pmaxud, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmaxud, Pmaxud, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmaxuw, Pmaxuw, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmaxuw, Pmaxuw, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pminsb, Pminsb, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pminsb, Pminsb, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pminsd, Pminsd, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pminsd, Pminsd, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmaxub, Pmaxub, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmaxub, Pmaxub, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pmaxud, Pmaxud, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmaxud, Pmaxud, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmaxuw, Pmaxuw, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmaxuw, Pmaxuw, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pminsb, Pminsb, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pminsb, Pminsb, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pminsd, Pminsd, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pminsd, Pminsd, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(pminsw, Pminsw, Mm, Mm) // SSE
ASMJIT_INST_2x(pminsw, Pminsw, Mm, Mem) // SSE
- ASMJIT_INST_2x(pminsw, Pminsw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pminsw, Pminsw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pminsw, Pminsw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pminsw, Pminsw, Vec, Mem) // SSE2
ASMJIT_INST_2x(pminub, Pminub, Mm, Mm) // SSE
ASMJIT_INST_2x(pminub, Pminub, Mm, Mem) // SSE
- ASMJIT_INST_2x(pminub, Pminub, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pminub, Pminub, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pminud, Pminud, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pminud, Pminud, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pminuw, Pminuw, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pminuw, Pminuw, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(pminub, Pminub, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pminub, Pminub, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pminud, Pminud, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pminud, Pminud, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pminuw, Pminuw, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pminuw, Pminuw, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(pmovmskb, Pmovmskb, Gp, Mm) // SSE
- ASMJIT_INST_2x(pmovmskb, Pmovmskb, Gp, Xmm) // SSE2
- ASMJIT_INST_2x(pmovsxbd, Pmovsxbd, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovsxbd, Pmovsxbd, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovsxbq, Pmovsxbq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovsxbq, Pmovsxbq, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovsxbw, Pmovsxbw, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovsxbw, Pmovsxbw, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovsxdq, Pmovsxdq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovsxdq, Pmovsxdq, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovsxwd, Pmovsxwd, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovsxwd, Pmovsxwd, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovsxwq, Pmovsxwq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovsxwq, Pmovsxwq, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovzxbd, Pmovzxbd, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovzxbd, Pmovzxbd, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovzxbq, Pmovzxbq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovzxbq, Pmovzxbq, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovzxbw, Pmovzxbw, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovzxbw, Pmovzxbw, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovzxdq, Pmovzxdq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovzxdq, Pmovzxdq, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovzxwd, Pmovzxwd, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovzxwd, Pmovzxwd, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmovzxwq, Pmovzxwq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmovzxwq, Pmovzxwq, Xmm, Mem) // SSE4_1
- ASMJIT_INST_2x(pmuldq, Pmuldq, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmuldq, Pmuldq, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovmskb, Pmovmskb, Gp, Vec) // SSE2
+ ASMJIT_INST_2x(pmovsxbd, Pmovsxbd, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovsxbd, Pmovsxbd, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovsxbq, Pmovsxbq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovsxbq, Pmovsxbq, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovsxbw, Pmovsxbw, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovsxbw, Pmovsxbw, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovsxdq, Pmovsxdq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovsxdq, Pmovsxdq, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovsxwd, Pmovsxwd, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovsxwd, Pmovsxwd, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovsxwq, Pmovsxwq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovsxwq, Pmovsxwq, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovzxbd, Pmovzxbd, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovzxbd, Pmovzxbd, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovzxbq, Pmovzxbq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovzxbq, Pmovzxbq, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovzxbw, Pmovzxbw, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovzxbw, Pmovzxbw, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovzxdq, Pmovzxdq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovzxdq, Pmovzxdq, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovzxwd, Pmovzxwd, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovzxwd, Pmovzxwd, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmovzxwq, Pmovzxwq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmovzxwq, Pmovzxwq, Vec, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmuldq, Pmuldq, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmuldq, Pmuldq, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(pmulhrsw, Pmulhrsw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pmulhrsw, Pmulhrsw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(pmulhrsw, Pmulhrsw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(pmulhrsw, Pmulhrsw, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(pmulhrsw, Pmulhrsw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(pmulhrsw, Pmulhrsw, Vec, Mem) // SSSE3
ASMJIT_INST_2x(pmulhw, Pmulhw, Mm, Mm) // MMX
ASMJIT_INST_2x(pmulhw, Pmulhw, Mm, Mem) // MMX
- ASMJIT_INST_2x(pmulhw, Pmulhw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmulhw, Pmulhw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pmulhw, Pmulhw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmulhw, Pmulhw, Vec, Mem) // SSE2
ASMJIT_INST_2x(pmulhuw, Pmulhuw, Mm, Mm) // SSE
ASMJIT_INST_2x(pmulhuw, Pmulhuw, Mm, Mem) // SSE
- ASMJIT_INST_2x(pmulhuw, Pmulhuw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmulhuw, Pmulhuw, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pmulld, Pmulld, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(pmulld, Pmulld, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(pmulhuw, Pmulhuw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmulhuw, Pmulhuw, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pmulld, Pmulld, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(pmulld, Pmulld, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(pmullw, Pmullw, Mm, Mm) // MMX
ASMJIT_INST_2x(pmullw, Pmullw, Mm, Mem) // MMX
- ASMJIT_INST_2x(pmullw, Pmullw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmullw, Pmullw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pmullw, Pmullw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmullw, Pmullw, Vec, Mem) // SSE2
ASMJIT_INST_2x(pmuludq, Pmuludq, Mm, Mm) // SSE2
ASMJIT_INST_2x(pmuludq, Pmuludq, Mm, Mem) // SSE2
- ASMJIT_INST_2x(pmuludq, Pmuludq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pmuludq, Pmuludq, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(pmuludq, Pmuludq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pmuludq, Pmuludq, Vec, Mem) // SSE2
ASMJIT_INST_2x(por, Por, Mm, Mm) // MMX
ASMJIT_INST_2x(por, Por, Mm, Mem) // MMX
- ASMJIT_INST_2x(por, Por, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(por, Por, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(por, Por, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(por, Por, Vec, Mem) // SSE2
ASMJIT_INST_2x(psadbw, Psadbw, Mm, Mm) // SSE
ASMJIT_INST_2x(psadbw, Psadbw, Mm, Mem) // SSE
- ASMJIT_INST_2x(psadbw, Psadbw, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(psadbw, Psadbw, Xmm, Mem) // SSE
+ ASMJIT_INST_2x(psadbw, Psadbw, Vec, Vec) // SSE
+ ASMJIT_INST_2x(psadbw, Psadbw, Vec, Mem) // SSE
ASMJIT_INST_2x(pslld, Pslld, Mm, Mm) // MMX
ASMJIT_INST_2x(pslld, Pslld, Mm, Mem) // MMX
ASMJIT_INST_2x(pslld, Pslld, Mm, Imm) // MMX
- ASMJIT_INST_2x(pslld, Pslld, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pslld, Pslld, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(pslld, Pslld, Xmm, Imm) // SSE2
- ASMJIT_INST_2x(pslldq, Pslldq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(pslld, Pslld, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pslld, Pslld, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(pslld, Pslld, Vec, Imm) // SSE2
+ ASMJIT_INST_2x(pslldq, Pslldq, Vec, Imm) // SSE2
ASMJIT_INST_2x(psllq, Psllq, Mm, Mm) // MMX
ASMJIT_INST_2x(psllq, Psllq, Mm, Mem) // MMX
ASMJIT_INST_2x(psllq, Psllq, Mm, Imm) // MMX
- ASMJIT_INST_2x(psllq, Psllq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psllq, Psllq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psllq, Psllq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psllq, Psllq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psllq, Psllq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psllq, Psllq, Vec, Imm) // SSE2
ASMJIT_INST_2x(psllw, Psllw, Mm, Mm) // MMX
ASMJIT_INST_2x(psllw, Psllw, Mm, Mem) // MMX
ASMJIT_INST_2x(psllw, Psllw, Mm, Imm) // MMX
- ASMJIT_INST_2x(psllw, Psllw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psllw, Psllw, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psllw, Psllw, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psllw, Psllw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psllw, Psllw, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psllw, Psllw, Vec, Imm) // SSE2
ASMJIT_INST_2x(psrad, Psrad, Mm, Mm) // MMX
ASMJIT_INST_2x(psrad, Psrad, Mm, Mem) // MMX
ASMJIT_INST_2x(psrad, Psrad, Mm, Imm) // MMX
- ASMJIT_INST_2x(psrad, Psrad, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psrad, Psrad, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psrad, Psrad, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrad, Psrad, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psrad, Psrad, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psrad, Psrad, Vec, Imm) // SSE2
ASMJIT_INST_2x(psraw, Psraw, Mm, Mm) // MMX
ASMJIT_INST_2x(psraw, Psraw, Mm, Mem) // MMX
ASMJIT_INST_2x(psraw, Psraw, Mm, Imm) // MMX
- ASMJIT_INST_2x(psraw, Psraw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psraw, Psraw, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psraw, Psraw, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psraw, Psraw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psraw, Psraw, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psraw, Psraw, Vec, Imm) // SSE2
ASMJIT_INST_2x(pshufb, Pshufb, Mm, Mm) // SSSE3
ASMJIT_INST_2x(pshufb, Pshufb, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(pshufb, Pshufb, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(pshufb, Pshufb, Xmm, Mem) // SSSE3
- ASMJIT_INST_3x(pshufd, Pshufd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(pshufd, Pshufd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3x(pshufhw, Pshufhw, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(pshufhw, Pshufhw, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3x(pshuflw, Pshuflw, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(pshuflw, Pshuflw, Xmm, Mem, Imm) // SSE2
+ ASMJIT_INST_2x(pshufb, Pshufb, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(pshufb, Pshufb, Vec, Mem) // SSSE3
+ ASMJIT_INST_3x(pshufd, Pshufd, Vec, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(pshufd, Pshufd, Vec, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pshufhw, Pshufhw, Vec, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(pshufhw, Pshufhw, Vec, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(pshuflw, Pshuflw, Vec, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(pshuflw, Pshuflw, Vec, Mem, Imm) // SSE2
ASMJIT_INST_3x(pshufw, Pshufw, Mm, Mm, Imm) // SSE
ASMJIT_INST_3x(pshufw, Pshufw, Mm, Mem, Imm) // SSE
ASMJIT_INST_2x(psignb, Psignb, Mm, Mm) // SSSE3
ASMJIT_INST_2x(psignb, Psignb, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(psignb, Psignb, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(psignb, Psignb, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(psignb, Psignb, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(psignb, Psignb, Vec, Mem) // SSSE3
ASMJIT_INST_2x(psignd, Psignd, Mm, Mm) // SSSE3
ASMJIT_INST_2x(psignd, Psignd, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(psignd, Psignd, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(psignd, Psignd, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(psignd, Psignd, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(psignd, Psignd, Vec, Mem) // SSSE3
ASMJIT_INST_2x(psignw, Psignw, Mm, Mm) // SSSE3
ASMJIT_INST_2x(psignw, Psignw, Mm, Mem) // SSSE3
- ASMJIT_INST_2x(psignw, Psignw, Xmm, Xmm) // SSSE3
- ASMJIT_INST_2x(psignw, Psignw, Xmm, Mem) // SSSE3
+ ASMJIT_INST_2x(psignw, Psignw, Vec, Vec) // SSSE3
+ ASMJIT_INST_2x(psignw, Psignw, Vec, Mem) // SSSE3
ASMJIT_INST_2x(psrld, Psrld, Mm, Mm) // MMX
ASMJIT_INST_2x(psrld, Psrld, Mm, Mem) // MMX
ASMJIT_INST_2x(psrld, Psrld, Mm, Imm) // MMX
- ASMJIT_INST_2x(psrld, Psrld, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psrld, Psrld, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psrld, Psrld, Xmm, Imm) // SSE2
- ASMJIT_INST_2x(psrldq, Psrldq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrld, Psrld, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psrld, Psrld, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psrld, Psrld, Vec, Imm) // SSE2
+ ASMJIT_INST_2x(psrldq, Psrldq, Vec, Imm) // SSE2
ASMJIT_INST_2x(psrlq, Psrlq, Mm, Mm) // MMX
ASMJIT_INST_2x(psrlq, Psrlq, Mm, Mem) // MMX
ASMJIT_INST_2x(psrlq, Psrlq, Mm, Imm) // MMX
- ASMJIT_INST_2x(psrlq, Psrlq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psrlq, Psrlq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psrlq, Psrlq, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrlq, Psrlq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psrlq, Psrlq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psrlq, Psrlq, Vec, Imm) // SSE2
ASMJIT_INST_2x(psrlw, Psrlw, Mm, Mm) // MMX
ASMJIT_INST_2x(psrlw, Psrlw, Mm, Mem) // MMX
ASMJIT_INST_2x(psrlw, Psrlw, Mm, Imm) // MMX
- ASMJIT_INST_2x(psrlw, Psrlw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psrlw, Psrlw, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(psrlw, Psrlw, Xmm, Imm) // SSE2
+ ASMJIT_INST_2x(psrlw, Psrlw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psrlw, Psrlw, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(psrlw, Psrlw, Vec, Imm) // SSE2
ASMJIT_INST_2x(psubb, Psubb, Mm, Mm) // MMX
ASMJIT_INST_2x(psubb, Psubb, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubb, Psubb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubb, Psubb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubb, Psubb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubb, Psubb, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubd, Psubd, Mm, Mm) // MMX
ASMJIT_INST_2x(psubd, Psubd, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubd, Psubd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubd, Psubd, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubd, Psubd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubd, Psubd, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubq, Psubq, Mm, Mm) // SSE2
ASMJIT_INST_2x(psubq, Psubq, Mm, Mem) // SSE2
- ASMJIT_INST_2x(psubq, Psubq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubq, Psubq, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubq, Psubq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubq, Psubq, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubsb, Psubsb, Mm, Mm) // MMX
ASMJIT_INST_2x(psubsb, Psubsb, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubsb, Psubsb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubsb, Psubsb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubsb, Psubsb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubsb, Psubsb, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubsw, Psubsw, Mm, Mm) // MMX
ASMJIT_INST_2x(psubsw, Psubsw, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubsw, Psubsw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubsw, Psubsw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubsw, Psubsw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubsw, Psubsw, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubusb, Psubusb, Mm, Mm) // MMX
ASMJIT_INST_2x(psubusb, Psubusb, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubusb, Psubusb, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubusb, Psubusb, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubusb, Psubusb, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubusb, Psubusb, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubusw, Psubusw, Mm, Mm) // MMX
ASMJIT_INST_2x(psubusw, Psubusw, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubusw, Psubusw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubusw, Psubusw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(psubusw, Psubusw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubusw, Psubusw, Vec, Mem) // SSE2
ASMJIT_INST_2x(psubw, Psubw, Mm, Mm) // MMX
ASMJIT_INST_2x(psubw, Psubw, Mm, Mem) // MMX
- ASMJIT_INST_2x(psubw, Psubw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(psubw, Psubw, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(ptest, Ptest, Xmm, Xmm) // SSE4_1
- ASMJIT_INST_2x(ptest, Ptest, Xmm, Mem) // SSE4_1
+ ASMJIT_INST_2x(psubw, Psubw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(psubw, Psubw, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(ptest, Ptest, Vec, Vec) // SSE4_1
+ ASMJIT_INST_2x(ptest, Ptest, Vec, Mem) // SSE4_1
ASMJIT_INST_2x(punpckhbw, Punpckhbw, Mm, Mm) // MMX
ASMJIT_INST_2x(punpckhbw, Punpckhbw, Mm, Mem) // MMX
- ASMJIT_INST_2x(punpckhbw, Punpckhbw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpckhbw, Punpckhbw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(punpckhbw, Punpckhbw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpckhbw, Punpckhbw, Vec, Mem) // SSE2
ASMJIT_INST_2x(punpckhdq, Punpckhdq, Mm, Mm) // MMX
ASMJIT_INST_2x(punpckhdq, Punpckhdq, Mm, Mem) // MMX
- ASMJIT_INST_2x(punpckhdq, Punpckhdq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpckhdq, Punpckhdq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(punpckhqdq, Punpckhqdq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpckhqdq, Punpckhqdq, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(punpckhdq, Punpckhdq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpckhdq, Punpckhdq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(punpckhqdq, Punpckhqdq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpckhqdq, Punpckhqdq, Vec, Mem) // SSE2
ASMJIT_INST_2x(punpckhwd, Punpckhwd, Mm, Mm) // MMX
ASMJIT_INST_2x(punpckhwd, Punpckhwd, Mm, Mem) // MMX
- ASMJIT_INST_2x(punpckhwd, Punpckhwd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpckhwd, Punpckhwd, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(punpckhwd, Punpckhwd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpckhwd, Punpckhwd, Vec, Mem) // SSE2
ASMJIT_INST_2x(punpcklbw, Punpcklbw, Mm, Mm) // MMX
ASMJIT_INST_2x(punpcklbw, Punpcklbw, Mm, Mem) // MMX
- ASMJIT_INST_2x(punpcklbw, Punpcklbw, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpcklbw, Punpcklbw, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(punpcklbw, Punpcklbw, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpcklbw, Punpcklbw, Vec, Mem) // SSE2
ASMJIT_INST_2x(punpckldq, Punpckldq, Mm, Mm) // MMX
ASMJIT_INST_2x(punpckldq, Punpckldq, Mm, Mem) // MMX
- ASMJIT_INST_2x(punpckldq, Punpckldq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpckldq, Punpckldq, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(punpcklqdq, Punpcklqdq, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpcklqdq, Punpcklqdq, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(punpckldq, Punpckldq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpckldq, Punpckldq, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(punpcklqdq, Punpcklqdq, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpcklqdq, Punpcklqdq, Vec, Mem) // SSE2
ASMJIT_INST_2x(punpcklwd, Punpcklwd, Mm, Mm) // MMX
ASMJIT_INST_2x(punpcklwd, Punpcklwd, Mm, Mem) // MMX
- ASMJIT_INST_2x(punpcklwd, Punpcklwd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(punpcklwd, Punpcklwd, Xmm, Mem) // SSE2
+ ASMJIT_INST_2x(punpcklwd, Punpcklwd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(punpcklwd, Punpcklwd, Vec, Mem) // SSE2
ASMJIT_INST_2x(pxor, Pxor, Mm, Mm) // MMX
ASMJIT_INST_2x(pxor, Pxor, Mm, Mem) // MMX
- ASMJIT_INST_2x(pxor, Pxor, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(pxor, Pxor, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(rcpps, Rcpps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(rcpps, Rcpps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(rcpss, Rcpss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(rcpss, Rcpss, Xmm, Mem) // SSE
- ASMJIT_INST_3x(roundpd, Roundpd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(roundpd, Roundpd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(roundps, Roundps, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(roundps, Roundps, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(roundsd, Roundsd, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(roundsd, Roundsd, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_3x(roundss, Roundss, Xmm, Xmm, Imm) // SSE4_1
- ASMJIT_INST_3x(roundss, Roundss, Xmm, Mem, Imm) // SSE4_1
- ASMJIT_INST_2x(rsqrtps, Rsqrtps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(rsqrtps, Rsqrtps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(rsqrtss, Rsqrtss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(rsqrtss, Rsqrtss, Xmm, Mem) // SSE
- ASMJIT_INST_3x(shufpd, Shufpd, Xmm, Xmm, Imm) // SSE2
- ASMJIT_INST_3x(shufpd, Shufpd, Xmm, Mem, Imm) // SSE2
- ASMJIT_INST_3x(shufps, Shufps, Xmm, Xmm, Imm) // SSE
- ASMJIT_INST_3x(shufps, Shufps, Xmm, Mem, Imm) // SSE
- ASMJIT_INST_2x(sqrtpd, Sqrtpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(sqrtpd, Sqrtpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(sqrtps, Sqrtps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(sqrtps, Sqrtps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(sqrtsd, Sqrtsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(sqrtsd, Sqrtsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(sqrtss, Sqrtss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(sqrtss, Sqrtss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(subpd, Subpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(subpd, Subpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(subps, Subps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(subps, Subps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(subsd, Subsd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(subsd, Subsd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(subss, Subss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(subss, Subss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(ucomisd, Ucomisd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(ucomisd, Ucomisd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(ucomiss, Ucomiss, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(ucomiss, Ucomiss, Xmm, Mem) // SSE
- ASMJIT_INST_2x(unpckhpd, Unpckhpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(unpckhpd, Unpckhpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(unpckhps, Unpckhps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(unpckhps, Unpckhps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(unpcklpd, Unpcklpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(unpcklpd, Unpcklpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(unpcklps, Unpcklps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(unpcklps, Unpcklps, Xmm, Mem) // SSE
- ASMJIT_INST_2x(xorpd, Xorpd, Xmm, Xmm) // SSE2
- ASMJIT_INST_2x(xorpd, Xorpd, Xmm, Mem) // SSE2
- ASMJIT_INST_2x(xorps, Xorps, Xmm, Xmm) // SSE
- ASMJIT_INST_2x(xorps, Xorps, Xmm, Mem) // SSE
+ ASMJIT_INST_2x(pxor, Pxor, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(pxor, Pxor, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(rcpps, Rcpps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(rcpps, Rcpps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(rcpss, Rcpss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(rcpss, Rcpss, Vec, Mem) // SSE
+ ASMJIT_INST_3x(roundpd, Roundpd, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundpd, Roundpd, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundps, Roundps, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundps, Roundps, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundsd, Roundsd, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundsd, Roundsd, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundss, Roundss, Vec, Vec, Imm) // SSE4_1
+ ASMJIT_INST_3x(roundss, Roundss, Vec, Mem, Imm) // SSE4_1
+ ASMJIT_INST_2x(rsqrtps, Rsqrtps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(rsqrtps, Rsqrtps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(rsqrtss, Rsqrtss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(rsqrtss, Rsqrtss, Vec, Mem) // SSE
+ ASMJIT_INST_3x(shufpd, Shufpd, Vec, Vec, Imm) // SSE2
+ ASMJIT_INST_3x(shufpd, Shufpd, Vec, Mem, Imm) // SSE2
+ ASMJIT_INST_3x(shufps, Shufps, Vec, Vec, Imm) // SSE
+ ASMJIT_INST_3x(shufps, Shufps, Vec, Mem, Imm) // SSE
+ ASMJIT_INST_2x(sqrtpd, Sqrtpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(sqrtpd, Sqrtpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(sqrtps, Sqrtps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(sqrtps, Sqrtps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(sqrtsd, Sqrtsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(sqrtsd, Sqrtsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(sqrtss, Sqrtss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(sqrtss, Sqrtss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(subpd, Subpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(subpd, Subpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(subps, Subps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(subps, Subps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(subsd, Subsd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(subsd, Subsd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(subss, Subss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(subss, Subss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(ucomisd, Ucomisd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(ucomisd, Ucomisd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(ucomiss, Ucomiss, Vec, Vec) // SSE
+ ASMJIT_INST_2x(ucomiss, Ucomiss, Vec, Mem) // SSE
+ ASMJIT_INST_2x(unpckhpd, Unpckhpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(unpckhpd, Unpckhpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(unpckhps, Unpckhps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(unpckhps, Unpckhps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(unpcklpd, Unpcklpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(unpcklpd, Unpcklpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(unpcklps, Unpcklps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(unpcklps, Unpcklps, Vec, Mem) // SSE
+ ASMJIT_INST_2x(xorpd, Xorpd, Vec, Vec) // SSE2
+ ASMJIT_INST_2x(xorpd, Xorpd, Vec, Mem) // SSE2
+ ASMJIT_INST_2x(xorps, Xorps, Vec, Vec) // SSE
+ ASMJIT_INST_2x(xorps, Xorps, Vec, Mem) // SSE
//! \}
@@ -2122,50 +2116,50 @@ public:
//! \name AESNI Instructions
//! \{
- ASMJIT_INST_2x(aesdec, Aesdec, Xmm, Xmm) // AESNI
- ASMJIT_INST_2x(aesdec, Aesdec, Xmm, Mem) // AESNI
- ASMJIT_INST_2x(aesdeclast, Aesdeclast, Xmm, Xmm) // AESNI
- ASMJIT_INST_2x(aesdeclast, Aesdeclast, Xmm, Mem) // AESNI
- ASMJIT_INST_2x(aesenc, Aesenc, Xmm, Xmm) // AESNI
- ASMJIT_INST_2x(aesenc, Aesenc, Xmm, Mem) // AESNI
- ASMJIT_INST_2x(aesenclast, Aesenclast, Xmm, Xmm) // AESNI
- ASMJIT_INST_2x(aesenclast, Aesenclast, Xmm, Mem) // AESNI
- ASMJIT_INST_2x(aesimc, Aesimc, Xmm, Xmm) // AESNI
- ASMJIT_INST_2x(aesimc, Aesimc, Xmm, Mem) // AESNI
- ASMJIT_INST_3x(aeskeygenassist, Aeskeygenassist, Xmm, Xmm, Imm) // AESNI
- ASMJIT_INST_3x(aeskeygenassist, Aeskeygenassist, Xmm, Mem, Imm) // AESNI
+ ASMJIT_INST_2x(aesdec, Aesdec, Vec, Vec) // AESNI
+ ASMJIT_INST_2x(aesdec, Aesdec, Vec, Mem) // AESNI
+ ASMJIT_INST_2x(aesdeclast, Aesdeclast, Vec, Vec) // AESNI
+ ASMJIT_INST_2x(aesdeclast, Aesdeclast, Vec, Mem) // AESNI
+ ASMJIT_INST_2x(aesenc, Aesenc, Vec, Vec) // AESNI
+ ASMJIT_INST_2x(aesenc, Aesenc, Vec, Mem) // AESNI
+ ASMJIT_INST_2x(aesenclast, Aesenclast, Vec, Vec) // AESNI
+ ASMJIT_INST_2x(aesenclast, Aesenclast, Vec, Mem) // AESNI
+ ASMJIT_INST_2x(aesimc, Aesimc, Vec, Vec) // AESNI
+ ASMJIT_INST_2x(aesimc, Aesimc, Vec, Mem) // AESNI
+ ASMJIT_INST_3x(aeskeygenassist, Aeskeygenassist, Vec, Vec, Imm) // AESNI
+ ASMJIT_INST_3x(aeskeygenassist, Aeskeygenassist, Vec, Mem, Imm) // AESNI
//! \}
//! \name SHA Instructions
//! \{
- ASMJIT_INST_2x(sha1msg1, Sha1msg1, Xmm, Xmm) // SHA
- ASMJIT_INST_2x(sha1msg1, Sha1msg1, Xmm, Mem) // SHA
- ASMJIT_INST_2x(sha1msg2, Sha1msg2, Xmm, Xmm) // SHA
- ASMJIT_INST_2x(sha1msg2, Sha1msg2, Xmm, Mem) // SHA
- ASMJIT_INST_2x(sha1nexte, Sha1nexte, Xmm, Xmm) // SHA
- ASMJIT_INST_2x(sha1nexte, Sha1nexte, Xmm, Mem) // SHA
- ASMJIT_INST_3x(sha1rnds4, Sha1rnds4, Xmm, Xmm, Imm) // SHA
- ASMJIT_INST_3x(sha1rnds4, Sha1rnds4, Xmm, Mem, Imm) // SHA
- ASMJIT_INST_2x(sha256msg1, Sha256msg1, Xmm, Xmm) // SHA
- ASMJIT_INST_2x(sha256msg1, Sha256msg1, Xmm, Mem) // SHA
- ASMJIT_INST_2x(sha256msg2, Sha256msg2, Xmm, Xmm) // SHA
- ASMJIT_INST_2x(sha256msg2, Sha256msg2, Xmm, Mem) // SHA
- ASMJIT_INST_3x(sha256rnds2, Sha256rnds2, Xmm, Xmm, XMM0) // SHA [EXPLICIT]
- ASMJIT_INST_3x(sha256rnds2, Sha256rnds2, Xmm, Mem, XMM0) // SHA [EXPLICIT]
+ ASMJIT_INST_2x(sha1msg1, Sha1msg1, Vec, Vec) // SHA
+ ASMJIT_INST_2x(sha1msg1, Sha1msg1, Vec, Mem) // SHA
+ ASMJIT_INST_2x(sha1msg2, Sha1msg2, Vec, Vec) // SHA
+ ASMJIT_INST_2x(sha1msg2, Sha1msg2, Vec, Mem) // SHA
+ ASMJIT_INST_2x(sha1nexte, Sha1nexte, Vec, Vec) // SHA
+ ASMJIT_INST_2x(sha1nexte, Sha1nexte, Vec, Mem) // SHA
+ ASMJIT_INST_3x(sha1rnds4, Sha1rnds4, Vec, Vec, Imm) // SHA
+ ASMJIT_INST_3x(sha1rnds4, Sha1rnds4, Vec, Mem, Imm) // SHA
+ ASMJIT_INST_2x(sha256msg1, Sha256msg1, Vec, Vec) // SHA
+ ASMJIT_INST_2x(sha256msg1, Sha256msg1, Vec, Mem) // SHA
+ ASMJIT_INST_2x(sha256msg2, Sha256msg2, Vec, Vec) // SHA
+ ASMJIT_INST_2x(sha256msg2, Sha256msg2, Vec, Mem) // SHA
+ ASMJIT_INST_3x(sha256rnds2, Sha256rnds2, Vec, Vec, XMM0) // SHA [EXPLICIT]
+ ASMJIT_INST_3x(sha256rnds2, Sha256rnds2, Vec, Mem, XMM0) // SHA [EXPLICIT]
//! \}
//! \name GFNI Instructions
//! \{
- ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Xmm, Imm) // GFNI
- ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Xmm, Mem, Imm) // GFNI
- ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Xmm, Xmm, Imm) // GFNI
- ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Xmm, Mem, Imm) // GFNI
- ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Xmm, Xmm) // GFNI
- ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Xmm, Mem) // GFNI
+ ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Vec, Vec, Imm) // GFNI
+ ASMJIT_INST_3x(gf2p8affineinvqb, Gf2p8affineinvqb, Vec, Mem, Imm) // GFNI
+ ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Vec, Vec, Imm) // GFNI
+ ASMJIT_INST_3x(gf2p8affineqb, Gf2p8affineqb, Vec, Mem, Imm) // GFNI
+ ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Vec, Vec) // GFNI
+ ASMJIT_INST_2x(gf2p8mulb, Gf2p8mulb, Vec, Mem) // GFNI
//! \}
@@ -2239,18 +2233,14 @@ public:
ASMJIT_INST_3x(kxord, Kxord, KReg, KReg, KReg) // AVX512_BW
ASMJIT_INST_3x(kxorq, Kxorq, KReg, KReg, KReg) // AVX512_BW
ASMJIT_INST_3x(kxorw, Kxorw, KReg, KReg, KReg) // AVX512_F
- ASMJIT_INST_6x(v4fmaddps, V4fmaddps, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
- ASMJIT_INST_6x(v4fmaddss, V4fmaddss, Xmm, Xmm, Xmm, Xmm, Xmm, Mem) // AVX512_4FMAPS{kz}
- ASMJIT_INST_6x(v4fnmaddps, V4fnmaddps, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
- ASMJIT_INST_6x(v4fnmaddss, V4fnmaddss, Xmm, Xmm, Xmm, Xmm, Xmm, Mem) // AVX512_4FMAPS{kz}
ASMJIT_INST_3x(vaddpd, Vaddpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vaddpd, Vaddpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vaddps, Vaddps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vaddps, Vaddps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vaddsd, Vaddsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vaddsd, Vaddsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vaddss, Vaddss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vaddss, Vaddss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vaddsd, Vaddsd, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vaddsd, Vaddsd, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vaddss, Vaddss, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vaddss, Vaddss, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
ASMJIT_INST_3x(vaddsubpd, Vaddsubpd, Vec, Vec, Vec) // AVX
ASMJIT_INST_3x(vaddsubpd, Vaddsubpd, Vec, Vec, Mem) // AVX
ASMJIT_INST_3x(vaddsubps, Vaddsubps, Vec, Vec, Vec) // AVX
@@ -2263,10 +2253,10 @@ public:
ASMJIT_INST_3x(vaesenc, Vaesenc, Vec, Vec, Mem) // AVX+AESNI VAES
ASMJIT_INST_3x(vaesenclast, Vaesenclast, Vec, Vec, Vec) // AVX+AESNI VAES
ASMJIT_INST_3x(vaesenclast, Vaesenclast, Vec, Vec, Mem) // AVX+AESNI VAES
- ASMJIT_INST_2x(vaesimc, Vaesimc, Xmm, Xmm) // AVX+AESNI
- ASMJIT_INST_2x(vaesimc, Vaesimc, Xmm, Mem) // AVX+AESNI
- ASMJIT_INST_3x(vaeskeygenassist, Vaeskeygenassist, Xmm, Xmm, Imm) // AVX+AESNI
- ASMJIT_INST_3x(vaeskeygenassist, Vaeskeygenassist, Xmm, Mem, Imm) // AVX+AESNI
+ ASMJIT_INST_2x(vaesimc, Vaesimc, Vec, Vec) // AVX+AESNI
+ ASMJIT_INST_2x(vaesimc, Vaesimc, Vec, Mem) // AVX+AESNI
+ ASMJIT_INST_3x(vaeskeygenassist, Vaeskeygenassist, Vec, Vec, Imm) // AVX+AESNI
+ ASMJIT_INST_3x(vaeskeygenassist, Vaeskeygenassist, Vec, Mem, Imm) // AVX+AESNI
ASMJIT_INST_4x(valignd, Valignd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_4x(valignd, Valignd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_4x(valignq, Valignq, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
@@ -2308,9 +2298,9 @@ public:
ASMJIT_INST_2x(vbroadcasti64x4, Vbroadcasti64x4, Vec, Vec) // AVX512_F{kz}
ASMJIT_INST_2x(vbroadcasti64x4, Vbroadcasti64x4, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vbroadcastsd, Vbroadcastsd, Vec, Mem) // AVX AVX512_F{kz}
- ASMJIT_INST_2x(vbroadcastsd, Vbroadcastsd, Vec, Xmm) // AVX2 AVX512_F{kz}
+ ASMJIT_INST_2x(vbroadcastsd, Vbroadcastsd, Vec, Vec) // AVX2 AVX512_F{kz}
ASMJIT_INST_2x(vbroadcastss, Vbroadcastss, Vec, Mem) // AVX AVX512_F{kz}
- ASMJIT_INST_2x(vbroadcastss, Vbroadcastss, Vec, Xmm) // AVX2 AVX512_F{kz}
+ ASMJIT_INST_2x(vbroadcastss, Vbroadcastss, Vec, Vec) // AVX2 AVX512_F{kz}
ASMJIT_INST_4x(vcmppd, Vcmppd, Vec, Vec, Vec, Imm) // AVX
ASMJIT_INST_4x(vcmppd, Vcmppd, Vec, Vec, Mem, Imm) // AVX
ASMJIT_INST_4x(vcmppd, Vcmppd, KReg, Vec, Vec, Imm) // AVX512_F{kz|b64}
@@ -2319,18 +2309,18 @@ public:
ASMJIT_INST_4x(vcmpps, Vcmpps, Vec, Vec, Mem, Imm) // AVX
ASMJIT_INST_4x(vcmpps, Vcmpps, KReg, Vec, Vec, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_4x(vcmpps, Vcmpps, KReg, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4x(vcmpsd, Vcmpsd, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4x(vcmpsd, Vcmpsd, Xmm, Xmm, Mem, Imm) // AVX
- ASMJIT_INST_4x(vcmpsd, Vcmpsd, KReg, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vcmpsd, Vcmpsd, KReg, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vcmpss, Vcmpss, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4x(vcmpss, Vcmpss, Xmm, Xmm, Mem, Imm) // AVX
- ASMJIT_INST_4x(vcmpss, Vcmpss, KReg, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vcmpss, Vcmpss, KReg, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_2x(vcomisd, Vcomisd, Xmm, Xmm) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vcomisd, Vcomisd, Xmm, Mem) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vcomiss, Vcomiss, Xmm, Xmm) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vcomiss, Vcomiss, Xmm, Mem) // AVX AVX512_F{sae}
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, KReg, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmpsd, Vcmpsd, KReg, Vec, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmpss, Vcmpss, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vcmpss, Vcmpss, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vcmpss, Vcmpss, KReg, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vcmpss, Vcmpss, KReg, Vec, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_2x(vcomisd, Vcomisd, Vec, Vec) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vcomisd, Vcomisd, Vec, Mem) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vcomiss, Vcomiss, Vec, Vec) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vcomiss, Vcomiss, Vec, Mem) // AVX AVX512_F{sae}
ASMJIT_INST_2x(vcompresspd, Vcompresspd, Vec, Vec) // AVX512_F{kz}
ASMJIT_INST_2x(vcompresspd, Vcompresspd, Mem, Vec) // AVX512_F{kz}
ASMJIT_INST_2x(vcompressps, Vcompressps, Vec, Vec) // AVX512_F{kz}
@@ -2371,21 +2361,21 @@ public:
ASMJIT_INST_2x(vcvtqq2pd, Vcvtqq2pd, Vec, Mem) // AVX512_DQ{kz|b64}
ASMJIT_INST_2x(vcvtqq2ps, Vcvtqq2ps, Vec, Vec) // AVX512_DQ{kz|b64}
ASMJIT_INST_2x(vcvtqq2ps, Vcvtqq2ps, Vec, Mem) // AVX512_DQ{kz|b64}
- ASMJIT_INST_2x(vcvtsd2si, Vcvtsd2si, Gp, Xmm) // AVX AVX512_F{er}
+ ASMJIT_INST_2x(vcvtsd2si, Vcvtsd2si, Gp, Vec) // AVX AVX512_F{er}
ASMJIT_INST_2x(vcvtsd2si, Vcvtsd2si, Gp, Mem) // AVX AVX512_F{er}
- ASMJIT_INST_3x(vcvtsd2ss, Vcvtsd2ss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vcvtsd2ss, Vcvtsd2ss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
- ASMJIT_INST_2x(vcvtsd2usi, Vcvtsd2usi, Gp, Xmm) // AVX512_F{er}
+ ASMJIT_INST_3x(vcvtsd2ss, Vcvtsd2ss, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vcvtsd2ss, Vcvtsd2ss, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_2x(vcvtsd2usi, Vcvtsd2usi, Gp, Vec) // AVX512_F{er}
ASMJIT_INST_2x(vcvtsd2usi, Vcvtsd2usi, Gp, Mem) // AVX512_F{er}
- ASMJIT_INST_3x(vcvtsi2sd, Vcvtsi2sd, Xmm, Xmm, Gp) // AVX AVX512_F{er}
- ASMJIT_INST_3x(vcvtsi2sd, Vcvtsi2sd, Xmm, Xmm, Mem) // AVX AVX512_F{er}
- ASMJIT_INST_3x(vcvtsi2ss, Vcvtsi2ss, Xmm, Xmm, Gp) // AVX AVX512_F{er}
- ASMJIT_INST_3x(vcvtsi2ss, Vcvtsi2ss, Xmm, Xmm, Mem) // AVX AVX512_F{er}
- ASMJIT_INST_3x(vcvtss2sd, Vcvtss2sd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vcvtss2sd, Vcvtss2sd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_2x(vcvtss2si, Vcvtss2si, Gp, Xmm) // AVX AVX512_F{er}
+ ASMJIT_INST_3x(vcvtsi2sd, Vcvtsi2sd, Vec, Vec, Gp) // AVX AVX512_F{er}
+ ASMJIT_INST_3x(vcvtsi2sd, Vcvtsi2sd, Vec, Vec, Mem) // AVX AVX512_F{er}
+ ASMJIT_INST_3x(vcvtsi2ss, Vcvtsi2ss, Vec, Vec, Gp) // AVX AVX512_F{er}
+ ASMJIT_INST_3x(vcvtsi2ss, Vcvtsi2ss, Vec, Vec, Mem) // AVX AVX512_F{er}
+ ASMJIT_INST_3x(vcvtss2sd, Vcvtss2sd, Vec, Vec, Vec) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vcvtss2sd, Vcvtss2sd, Vec, Vec, Mem) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_2x(vcvtss2si, Vcvtss2si, Gp, Vec) // AVX AVX512_F{er}
ASMJIT_INST_2x(vcvtss2si, Vcvtss2si, Gp, Mem) // AVX AVX512_F{er}
- ASMJIT_INST_2x(vcvtss2usi, Vcvtss2usi, Gp, Xmm) // AVX512_F{er}
+ ASMJIT_INST_2x(vcvtss2usi, Vcvtss2usi, Gp, Vec) // AVX512_F{er}
ASMJIT_INST_2x(vcvtss2usi, Vcvtss2usi, Gp, Mem) // AVX512_F{er}
ASMJIT_INST_2x(vcvttpd2dq, Vcvttpd2dq, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_2x(vcvttpd2dq, Vcvttpd2dq, Vec, Mem) // AVX AVX512_F{kz|b64}
@@ -2403,13 +2393,13 @@ public:
ASMJIT_INST_2x(vcvttps2udq, Vcvttps2udq, Vec, Mem) // AVX512_F{kz|b32}
ASMJIT_INST_2x(vcvttps2uqq, Vcvttps2uqq, Vec, Vec) // AVX512_DQ{kz|b32}
ASMJIT_INST_2x(vcvttps2uqq, Vcvttps2uqq, Vec, Mem) // AVX512_DQ{kz|b32}
- ASMJIT_INST_2x(vcvttsd2si, Vcvttsd2si, Gp, Xmm) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vcvttsd2si, Vcvttsd2si, Gp, Vec) // AVX AVX512_F{sae}
ASMJIT_INST_2x(vcvttsd2si, Vcvttsd2si, Gp, Mem) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vcvttsd2usi, Vcvttsd2usi, Gp, Xmm) // AVX512_F{sae}
+ ASMJIT_INST_2x(vcvttsd2usi, Vcvttsd2usi, Gp, Vec) // AVX512_F{sae}
ASMJIT_INST_2x(vcvttsd2usi, Vcvttsd2usi, Gp, Mem) // AVX512_F{sae}
- ASMJIT_INST_2x(vcvttss2si, Vcvttss2si, Gp, Xmm) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vcvttss2si, Vcvttss2si, Gp, Vec) // AVX AVX512_F{sae}
ASMJIT_INST_2x(vcvttss2si, Vcvttss2si, Gp, Mem) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vcvttss2usi, Vcvttss2usi, Gp, Xmm) // AVX512_F{sae}
+ ASMJIT_INST_2x(vcvttss2usi, Vcvttss2usi, Gp, Vec) // AVX512_F{sae}
ASMJIT_INST_2x(vcvttss2usi, Vcvttss2usi, Gp, Mem) // AVX512_F{sae}
ASMJIT_INST_2x(vcvtudq2pd, Vcvtudq2pd, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_2x(vcvtudq2pd, Vcvtudq2pd, Vec, Mem) // AVX512_F{kz|b32}
@@ -2419,30 +2409,26 @@ public:
ASMJIT_INST_2x(vcvtuqq2pd, Vcvtuqq2pd, Vec, Mem) // AVX512_DQ{kz|b64}
ASMJIT_INST_2x(vcvtuqq2ps, Vcvtuqq2ps, Vec, Vec) // AVX512_DQ{kz|b64}
ASMJIT_INST_2x(vcvtuqq2ps, Vcvtuqq2ps, Vec, Mem) // AVX512_DQ{kz|b64}
- ASMJIT_INST_3x(vcvtusi2sd, Vcvtusi2sd, Xmm, Xmm, Gp) // AVX512_F{er}
- ASMJIT_INST_3x(vcvtusi2sd, Vcvtusi2sd, Xmm, Xmm, Mem) // AVX512_F{er}
- ASMJIT_INST_3x(vcvtusi2ss, Vcvtusi2ss, Xmm, Xmm, Gp) // AVX512_F{er}
- ASMJIT_INST_3x(vcvtusi2ss, Vcvtusi2ss, Xmm, Xmm, Mem) // AVX512_F{er}
+ ASMJIT_INST_3x(vcvtusi2sd, Vcvtusi2sd, Vec, Vec, Gp) // AVX512_F{er}
+ ASMJIT_INST_3x(vcvtusi2sd, Vcvtusi2sd, Vec, Vec, Mem) // AVX512_F{er}
+ ASMJIT_INST_3x(vcvtusi2ss, Vcvtusi2ss, Vec, Vec, Gp) // AVX512_F{er}
+ ASMJIT_INST_3x(vcvtusi2ss, Vcvtusi2ss, Vec, Vec, Mem) // AVX512_F{er}
ASMJIT_INST_4x(vdbpsadbw, Vdbpsadbw, Vec, Vec, Vec, Imm) // AVX512_BW{kz}
ASMJIT_INST_4x(vdbpsadbw, Vdbpsadbw, Vec, Vec, Mem, Imm) // AVX512_BW{kz}
ASMJIT_INST_3x(vdivpd, Vdivpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vdivpd, Vdivpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vdivps, Vdivps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vdivps, Vdivps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vdivsd, Vdivsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vdivsd, Vdivsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vdivss, Vdivss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vdivss, Vdivss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vdivsd, Vdivsd, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vdivsd, Vdivsd, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vdivss, Vdivss, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vdivss, Vdivss, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
ASMJIT_INST_3x(vdpbf16ps, Vdpbf16ps, Vec, Vec, Vec) // AVX512_BF16{kz|b32}
ASMJIT_INST_3x(vdpbf16ps, Vdpbf16ps, Vec, Vec, Mem) // AVX512_BF16{kz|b32}
ASMJIT_INST_4x(vdppd, Vdppd, Vec, Vec, Vec, Imm) // AVX
ASMJIT_INST_4x(vdppd, Vdppd, Vec, Vec, Mem, Imm) // AVX
ASMJIT_INST_4x(vdpps, Vdpps, Vec, Vec, Vec, Imm) // AVX
ASMJIT_INST_4x(vdpps, Vdpps, Vec, Vec, Mem, Imm) // AVX
- ASMJIT_INST_2x(vexp2pd, Vexp2pd, Vec, Vec) // AVX512_ER{kz|sae|b64}
- ASMJIT_INST_2x(vexp2pd, Vexp2pd, Vec, Mem) // AVX512_ER{kz|sae|b64}
- ASMJIT_INST_2x(vexp2ps, Vexp2ps, Vec, Vec) // AVX512_ER{kz|sae|b32}
- ASMJIT_INST_2x(vexp2ps, Vexp2ps, Vec, Mem) // AVX512_ER{kz|sae|b32}
ASMJIT_INST_2x(vexpandpd, Vexpandpd, Vec, Vec) // AVX512_F{kz}
ASMJIT_INST_2x(vexpandpd, Vexpandpd, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vexpandps, Vexpandps, Vec, Vec) // AVX512_F{kz}
@@ -2467,40 +2453,40 @@ public:
ASMJIT_INST_3x(vextracti64x2, Vextracti64x2, Mem, Vec, Imm) // AVX512_DQ{kz}
ASMJIT_INST_3x(vextracti64x4, Vextracti64x4, Vec, Vec, Imm) // AVX512_F{kz}
ASMJIT_INST_3x(vextracti64x4, Vextracti64x4, Mem, Vec, Imm) // AVX512_F{kz}
- ASMJIT_INST_3x(vextractps, Vextractps, Gp, Xmm, Imm) // AVX AVX512_F
- ASMJIT_INST_3x(vextractps, Vextractps, Mem, Xmm, Imm) // AVX AVX512_F
+ ASMJIT_INST_3x(vextractps, Vextractps, Gp, Vec, Imm) // AVX AVX512_F
+ ASMJIT_INST_3x(vextractps, Vextractps, Mem, Vec, Imm) // AVX AVX512_F
ASMJIT_INST_4x(vfixupimmpd, Vfixupimmpd, Vec, Vec, Vec, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_4x(vfixupimmpd, Vfixupimmpd, Vec, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_4x(vfixupimmps, Vfixupimmps, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_4x(vfixupimmps, Vfixupimmps, Vec, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4x(vfixupimmsd, Vfixupimmsd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vfixupimmsd, Vfixupimmsd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vfixupimmss, Vfixupimmss, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vfixupimmss, Vfixupimmss, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmsd, Vfixupimmsd, Vec, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmsd, Vfixupimmsd, Vec, Vec, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmss, Vfixupimmss, Vec, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vfixupimmss, Vfixupimmss, Vec, Vec, Mem, Imm) // AVX512_F{kz|sae}
ASMJIT_INST_3x(vfmadd132pd, Vfmadd132pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd132pd, Vfmadd132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd132ps, Vfmadd132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfmadd132ps, Vfmadd132ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfmadd132sd, Vfmadd132sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd132sd, Vfmadd132sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd132ss, Vfmadd132ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd132ss, Vfmadd132ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd132sd, Vfmadd132sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd132sd, Vfmadd132sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd132ss, Vfmadd132ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd132ss, Vfmadd132ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfmadd213pd, Vfmadd213pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd213pd, Vfmadd213pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd213ps, Vfmadd213ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfmadd213ps, Vfmadd213ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfmadd213sd, Vfmadd213sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd213sd, Vfmadd213sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd213ss, Vfmadd213ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd213ss, Vfmadd213ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd213sd, Vfmadd213sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd213sd, Vfmadd213sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd213ss, Vfmadd213ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd213ss, Vfmadd213ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfmadd231pd, Vfmadd231pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd231pd, Vfmadd231pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmadd231ps, Vfmadd231ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfmadd231ps, Vfmadd231ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfmadd231sd, Vfmadd231sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd231sd, Vfmadd231sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd231ss, Vfmadd231ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmadd231ss, Vfmadd231ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd231sd, Vfmadd231sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd231sd, Vfmadd231sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd231ss, Vfmadd231ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmadd231ss, Vfmadd231ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfmaddsub132pd, Vfmaddsub132pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmaddsub132pd, Vfmaddsub132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmaddsub132ps, Vfmaddsub132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
@@ -2517,26 +2503,26 @@ public:
ASMJIT_INST_3x(vfmsub132pd, Vfmsub132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsub132ps, Vfmsub132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfmsub132ps, Vfmsub132ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfmsub132sd, Vfmsub132sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub132sd, Vfmsub132sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub132ss, Vfmsub132ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub132ss, Vfmsub132ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub132sd, Vfmsub132sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub132sd, Vfmsub132sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub132ss, Vfmsub132ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub132ss, Vfmsub132ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfmsub213pd, Vfmsub213pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsub213pd, Vfmsub213pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsub213ps, Vfmsub213ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfmsub213ps, Vfmsub213ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfmsub213sd, Vfmsub213sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub213sd, Vfmsub213sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub213ss, Vfmsub213ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub213ss, Vfmsub213ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub213sd, Vfmsub213sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub213sd, Vfmsub213sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub213ss, Vfmsub213ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub213ss, Vfmsub213ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfmsub231pd, Vfmsub231pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsub231pd, Vfmsub231pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsub231ps, Vfmsub231ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfmsub231ps, Vfmsub231ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfmsub231sd, Vfmsub231sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub231sd, Vfmsub231sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub231ss, Vfmsub231ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfmsub231ss, Vfmsub231ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub231sd, Vfmsub231sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub231sd, Vfmsub231sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub231ss, Vfmsub231ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfmsub231ss, Vfmsub231ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfmsubadd132pd, Vfmsubadd132pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsubadd132pd, Vfmsubadd132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfmsubadd132ps, Vfmsubadd132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
@@ -2553,70 +2539,62 @@ public:
ASMJIT_INST_3x(vfnmadd132pd, Vfnmadd132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmadd132ps, Vfnmadd132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfnmadd132ps, Vfnmadd132ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfnmadd132sd, Vfnmadd132sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd132sd, Vfnmadd132sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd132ss, Vfnmadd132ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd132ss, Vfnmadd132ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd132sd, Vfnmadd132sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd132sd, Vfnmadd132sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd132ss, Vfnmadd132ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd132ss, Vfnmadd132ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmadd213pd, Vfnmadd213pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmadd213pd, Vfnmadd213pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmadd213ps, Vfnmadd213ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfnmadd213ps, Vfnmadd213ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfnmadd213sd, Vfnmadd213sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd213sd, Vfnmadd213sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd213ss, Vfnmadd213ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd213ss, Vfnmadd213ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd213sd, Vfnmadd213sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd213sd, Vfnmadd213sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd213ss, Vfnmadd213ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd213ss, Vfnmadd213ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmadd231pd, Vfnmadd231pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmadd231pd, Vfnmadd231pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmadd231ps, Vfnmadd231ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfnmadd231ps, Vfnmadd231ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfnmadd231sd, Vfnmadd231sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd231sd, Vfnmadd231sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd231ss, Vfnmadd231ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmadd231ss, Vfnmadd231ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd231sd, Vfnmadd231sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd231sd, Vfnmadd231sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd231ss, Vfnmadd231ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmadd231ss, Vfnmadd231ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmsub132pd, Vfnmsub132pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmsub132pd, Vfnmsub132pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmsub132ps, Vfnmsub132ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfnmsub132ps, Vfnmsub132ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfnmsub132sd, Vfnmsub132sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub132sd, Vfnmsub132sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub132ss, Vfnmsub132ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub132ss, Vfnmsub132ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub132sd, Vfnmsub132sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub132sd, Vfnmsub132sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub132ss, Vfnmsub132ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub132ss, Vfnmsub132ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmsub213pd, Vfnmsub213pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmsub213pd, Vfnmsub213pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmsub213ps, Vfnmsub213ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfnmsub213ps, Vfnmsub213ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfnmsub213sd, Vfnmsub213sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub213sd, Vfnmsub213sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub213ss, Vfnmsub213ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub213ss, Vfnmsub213ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub213sd, Vfnmsub213sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub213sd, Vfnmsub213sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub213ss, Vfnmsub213ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub213ss, Vfnmsub213ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfnmsub231pd, Vfnmsub231pd, Vec, Vec, Vec) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmsub231pd, Vfnmsub231pd, Vec, Vec, Mem) // FMA AVX512_F{kz|b64}
ASMJIT_INST_3x(vfnmsub231ps, Vfnmsub231ps, Vec, Vec, Vec) // FMA AVX512_F{kz|b32}
ASMJIT_INST_3x(vfnmsub231ps, Vfnmsub231ps, Vec, Vec, Mem) // FMA AVX512_F{kz|b32}
- ASMJIT_INST_3x(vfnmsub231sd, Vfnmsub231sd, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub231sd, Vfnmsub231sd, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub231ss, Vfnmsub231ss, Xmm, Xmm, Xmm) // FMA AVX512_F{kz|er}
- ASMJIT_INST_3x(vfnmsub231ss, Vfnmsub231ss, Xmm, Xmm, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub231sd, Vfnmsub231sd, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub231sd, Vfnmsub231sd, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub231ss, Vfnmsub231ss, Vec, Vec, Vec) // FMA AVX512_F{kz|er}
+ ASMJIT_INST_3x(vfnmsub231ss, Vfnmsub231ss, Vec, Vec, Mem) // FMA AVX512_F{kz|er}
ASMJIT_INST_3x(vfpclasspd, Vfpclasspd, KReg, Vec, Imm) // AVX512_DQ{k|b64}
ASMJIT_INST_3x(vfpclasspd, Vfpclasspd, KReg, Mem, Imm) // AVX512_DQ{k|b64}
ASMJIT_INST_3x(vfpclassps, Vfpclassps, KReg, Vec, Imm) // AVX512_DQ{k|b32}
ASMJIT_INST_3x(vfpclassps, Vfpclassps, KReg, Mem, Imm) // AVX512_DQ{k|b32}
- ASMJIT_INST_3x(vfpclasssd, Vfpclasssd, KReg, Xmm, Imm) // AVX512_DQ{k}
+ ASMJIT_INST_3x(vfpclasssd, Vfpclasssd, KReg, Vec, Imm) // AVX512_DQ{k}
ASMJIT_INST_3x(vfpclasssd, Vfpclasssd, KReg, Mem, Imm) // AVX512_DQ{k}
- ASMJIT_INST_3x(vfpclassss, Vfpclassss, KReg, Xmm, Imm) // AVX512_DQ{k}
+ ASMJIT_INST_3x(vfpclassss, Vfpclassss, KReg, Vec, Imm) // AVX512_DQ{k}
ASMJIT_INST_3x(vfpclassss, Vfpclassss, KReg, Mem, Imm) // AVX512_DQ{k}
ASMJIT_INST_2x(vgatherdpd, Vgatherdpd, Vec, Mem) // AVX512_F{k}
ASMJIT_INST_3x(vgatherdpd, Vgatherdpd, Vec, Mem, Vec) // AVX2
ASMJIT_INST_2x(vgatherdps, Vgatherdps, Vec, Mem) // AVX512_F{k}
ASMJIT_INST_3x(vgatherdps, Vgatherdps, Vec, Mem, Vec) // AVX2
- ASMJIT_INST_1x(vgatherpf0dpd, Vgatherpf0dpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf0dps, Vgatherpf0dps, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf0qpd, Vgatherpf0qpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf0qps, Vgatherpf0qps, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf1dpd, Vgatherpf1dpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf1dps, Vgatherpf1dps, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf1qpd, Vgatherpf1qpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vgatherpf1qps, Vgatherpf1qps, Mem) // AVX512_PF{k}
ASMJIT_INST_2x(vgatherqpd, Vgatherqpd, Vec, Mem) // AVX512_F{k}
ASMJIT_INST_3x(vgatherqpd, Vgatherqpd, Vec, Mem, Vec) // AVX2
ASMJIT_INST_2x(vgatherqps, Vgatherqps, Vec, Mem) // AVX512_F{k}
@@ -2625,18 +2603,18 @@ public:
ASMJIT_INST_2x(vgetexppd, Vgetexppd, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vgetexpps, Vgetexpps, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_2x(vgetexpps, Vgetexpps, Vec, Mem) // AVX512_F{kz|b32}
- ASMJIT_INST_3x(vgetexpsd, Vgetexpsd, Xmm, Xmm, Xmm) // AVX512_F{kz|sae}
- ASMJIT_INST_3x(vgetexpsd, Vgetexpsd, Xmm, Xmm, Mem) // AVX512_F{kz|sae}
- ASMJIT_INST_3x(vgetexpss, Vgetexpss, Xmm, Xmm, Xmm) // AVX512_F{kz|sae}
- ASMJIT_INST_3x(vgetexpss, Vgetexpss, Xmm, Xmm, Mem) // AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vgetexpsd, Vgetexpsd, Vec, Vec, Vec) // AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vgetexpsd, Vgetexpsd, Vec, Vec, Mem) // AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vgetexpss, Vgetexpss, Vec, Vec, Vec) // AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vgetexpss, Vgetexpss, Vec, Vec, Mem) // AVX512_F{kz|sae}
ASMJIT_INST_3x(vgetmantpd, Vgetmantpd, Vec, Vec, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vgetmantpd, Vgetmantpd, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vgetmantps, Vgetmantps, Vec, Vec, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vgetmantps, Vgetmantps, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4x(vgetmantsd, Vgetmantsd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vgetmantsd, Vgetmantsd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vgetmantss, Vgetmantss, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vgetmantss, Vgetmantss, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantsd, Vgetmantsd, Vec, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantsd, Vgetmantsd, Vec, Vec, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantss, Vgetmantss, Vec, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vgetmantss, Vgetmantss, Vec, Vec, Mem, Imm) // AVX512_F{kz|sae}
ASMJIT_INST_4x(vgf2p8affineinvqb, Vgf2p8affineinvqb,Vec,Vec,Vec,Imm) // AVX AVX512_VL{kz} GFNI
ASMJIT_INST_4x(vgf2p8affineinvqb, Vgf2p8affineinvqb,Vec,Vec,Mem,Imm) // AVX AVX512_VL{kz} GFNI
ASMJIT_INST_4x(vgf2p8affineqb, Vgf2p8affineqb, Vec, Vec, Vec, Imm) // AVX AVX512_VL{kz} GFNI
@@ -2671,8 +2649,8 @@ public:
ASMJIT_INST_4x(vinserti64x2, Vinserti64x2, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
ASMJIT_INST_4x(vinserti64x4, Vinserti64x4, Vec, Vec, Vec, Imm) // AVX512_F{kz}
ASMJIT_INST_4x(vinserti64x4, Vinserti64x4, Vec, Vec, Mem, Imm) // AVX512_F{kz}
- ASMJIT_INST_4x(vinsertps, Vinsertps, Xmm, Xmm, Xmm, Imm) // AVX AVX512_F
- ASMJIT_INST_4x(vinsertps, Vinsertps, Xmm, Xmm, Mem, Imm) // AVX AVX512_F
+ ASMJIT_INST_4x(vinsertps, Vinsertps, Vec, Vec, Vec, Imm) // AVX AVX512_F
+ ASMJIT_INST_4x(vinsertps, Vinsertps, Vec, Vec, Mem, Imm) // AVX AVX512_F
ASMJIT_INST_2x(vlddqu, Vlddqu, Vec, Mem) // AVX
ASMJIT_INST_1x(vldmxcsr, Vldmxcsr, Mem) // AVX
ASMJIT_INST_3x(vmaskmovdqu, Vmaskmovdqu, Vec, Vec, DS_ZDI) // AVX [EXPLICIT]
@@ -2684,28 +2662,28 @@ public:
ASMJIT_INST_3x(vmaxpd, Vmaxpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vmaxps, Vmaxps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vmaxps, Vmaxps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vmaxsd, Vmaxsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vmaxsd, Vmaxsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vmaxss, Vmaxss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vmaxss, Vmaxss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vmaxsd, Vmaxsd, Vec, Vec, Vec) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vmaxsd, Vmaxsd, Vec, Vec, Mem) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vmaxss, Vmaxss, Vec, Vec, Vec) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vmaxss, Vmaxss, Vec, Vec, Mem) // AVX AVX512_F{kz|sae}
ASMJIT_INST_3x(vminpd, Vminpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vminpd, Vminpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vminps, Vminps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vminps, Vminps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vminsd, Vminsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vminsd, Vminsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vminss, Vminss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|sae}
- ASMJIT_INST_3x(vminss, Vminss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vminsd, Vminsd, Vec, Vec, Vec) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vminsd, Vminsd, Vec, Vec, Mem) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vminss, Vminss, Vec, Vec, Vec) // AVX AVX512_F{kz|sae}
+ ASMJIT_INST_3x(vminss, Vminss, Vec, Vec, Mem) // AVX AVX512_F{kz|sae}
ASMJIT_INST_2x(vmovapd, Vmovapd, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovapd, Vmovapd, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovapd, Vmovapd, Mem, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovaps, Vmovaps, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovaps, Vmovaps, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovaps, Vmovaps, Mem, Vec) // AVX AVX512_F{kz}
- ASMJIT_INST_2x(vmovd, Vmovd, Gp, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovd, Vmovd, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovd, Vmovd, Xmm, Gp) // AVX AVX512_F
- ASMJIT_INST_2x(vmovd, Vmovd, Xmm, Mem) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovd, Vmovd, Gp, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovd, Vmovd, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovd, Vmovd, Vec, Gp) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovd, Vmovd, Vec, Mem) // AVX AVX512_F
ASMJIT_INST_2x(vmovddup, Vmovddup, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovddup, Vmovddup, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovdqa, Vmovdqa, Vec, Vec) // AVX
@@ -2732,37 +2710,37 @@ public:
ASMJIT_INST_2x(vmovdqu8, Vmovdqu8, Vec, Vec) // AVX512_BW{kz}
ASMJIT_INST_2x(vmovdqu8, Vmovdqu8, Vec, Mem) // AVX512_BW{kz}
ASMJIT_INST_2x(vmovdqu8, Vmovdqu8, Mem, Vec) // AVX512_BW{kz}
- ASMJIT_INST_3x(vmovhlps, Vmovhlps, Xmm, Xmm, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovhpd, Vmovhpd, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_3x(vmovhpd, Vmovhpd, Xmm, Xmm, Mem) // AVX AVX512_F
- ASMJIT_INST_2x(vmovhps, Vmovhps, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_3x(vmovhps, Vmovhps, Xmm, Xmm, Mem) // AVX AVX512_F
- ASMJIT_INST_3x(vmovlhps, Vmovlhps, Xmm, Xmm, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovlpd, Vmovlpd, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_3x(vmovlpd, Vmovlpd, Xmm, Xmm, Mem) // AVX AVX512_F
- ASMJIT_INST_2x(vmovlps, Vmovlps, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_3x(vmovlps, Vmovlps, Xmm, Xmm, Mem) // AVX AVX512_F
+ ASMJIT_INST_3x(vmovhlps, Vmovhlps, Vec, Vec, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovhpd, Vmovhpd, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_3x(vmovhpd, Vmovhpd, Vec, Vec, Mem) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovhps, Vmovhps, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_3x(vmovhps, Vmovhps, Vec, Vec, Mem) // AVX AVX512_F
+ ASMJIT_INST_3x(vmovlhps, Vmovlhps, Vec, Vec, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovlpd, Vmovlpd, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_3x(vmovlpd, Vmovlpd, Vec, Vec, Mem) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovlps, Vmovlps, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_3x(vmovlps, Vmovlps, Vec, Vec, Mem) // AVX AVX512_F
ASMJIT_INST_2x(vmovmskpd, Vmovmskpd, Gp, Vec) // AVX
ASMJIT_INST_2x(vmovmskps, Vmovmskps, Gp, Vec) // AVX
ASMJIT_INST_2x(vmovntdq, Vmovntdq, Mem, Vec) // AVX+ AVX512_F
ASMJIT_INST_2x(vmovntdqa, Vmovntdqa, Vec, Mem) // AVX+ AVX512_F
ASMJIT_INST_2x(vmovntpd, Vmovntpd, Mem, Vec) // AVX AVX512_F
ASMJIT_INST_2x(vmovntps, Vmovntps, Mem, Vec) // AVX AVX512_F
- ASMJIT_INST_2x(vmovq, Vmovq, Gp, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovq, Vmovq, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovq, Vmovq, Xmm, Mem) // AVX AVX512_F
- ASMJIT_INST_2x(vmovq, Vmovq, Xmm, Gp) // AVX AVX512_F
- ASMJIT_INST_2x(vmovq, Vmovq, Xmm, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovsd, Vmovsd, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovsd, Vmovsd, Xmm, Mem) // AVX AVX512_F{kz}
- ASMJIT_INST_3x(vmovsd, Vmovsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz}
+ ASMJIT_INST_2x(vmovq, Vmovq, Gp, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovq, Vmovq, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovq, Vmovq, Vec, Mem) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovq, Vmovq, Vec, Gp) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovq, Vmovq, Vec, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovsd, Vmovsd, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovsd, Vmovsd, Vec, Mem) // AVX AVX512_F{kz}
+ ASMJIT_INST_3x(vmovsd, Vmovsd, Vec, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovshdup, Vmovshdup, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovshdup, Vmovshdup, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovsldup, Vmovsldup, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovsldup, Vmovsldup, Vec, Mem) // AVX AVX512_F{kz}
- ASMJIT_INST_2x(vmovss, Vmovss, Mem, Xmm) // AVX AVX512_F
- ASMJIT_INST_2x(vmovss, Vmovss, Xmm, Mem) // AVX AVX512_F{kz}
- ASMJIT_INST_3x(vmovss, Vmovss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz}
+ ASMJIT_INST_2x(vmovss, Vmovss, Mem, Vec) // AVX AVX512_F
+ ASMJIT_INST_2x(vmovss, Vmovss, Vec, Mem) // AVX AVX512_F{kz}
+ ASMJIT_INST_3x(vmovss, Vmovss, Vec, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovupd, Vmovupd, Vec, Vec) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovupd, Vmovupd, Vec, Mem) // AVX AVX512_F{kz}
ASMJIT_INST_2x(vmovupd, Vmovupd, Mem, Vec) // AVX AVX512_F{kz}
@@ -2775,10 +2753,10 @@ public:
ASMJIT_INST_3x(vmulpd, Vmulpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vmulps, Vmulps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vmulps, Vmulps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vmulsd, Vmulsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vmulsd, Vmulsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vmulss, Vmulss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vmulss, Vmulss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vmulsd, Vmulsd, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vmulsd, Vmulsd, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vmulss, Vmulss, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vmulss, Vmulss, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
ASMJIT_INST_3x(vorpd, Vorpd, Vec, Vec, Vec) // AVX AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vorpd, Vorpd, Vec, Vec, Mem) // AVX AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vorps, Vorps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
@@ -2787,8 +2765,6 @@ public:
ASMJIT_INST_4x(vp2intersectd, Vp2intersectd, KReg, KReg, Vec, Mem) // AVX512_VP2INTERSECT{kz}
ASMJIT_INST_4x(vp2intersectq, Vp2intersectq, KReg, KReg, Vec, Vec) // AVX512_VP2INTERSECT{kz}
ASMJIT_INST_4x(vp2intersectq, Vp2intersectq, KReg, KReg, Vec, Mem) // AVX512_VP2INTERSECT{kz}
- ASMJIT_INST_6x(vp4dpwssd, Vp4dpwssd, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
- ASMJIT_INST_6x(vp4dpwssds, Vp4dpwssds, Zmm, Zmm, Zmm, Zmm, Zmm, Mem) // AVX512_4FMAPS{kz}
ASMJIT_INST_2x(vpabsb, Vpabsb, Vec, Vec) // AVX+ AVX512_BW{kz}
ASMJIT_INST_2x(vpabsb, Vpabsb, Vec, Mem) // AVX+ AVX512_BW{kz}
ASMJIT_INST_2x(vpabsd, Vpabsd, Vec, Vec) // AVX+ AVX512_F{kz}
@@ -3005,14 +2981,14 @@ public:
ASMJIT_INST_2x(vpexpandq, Vpexpandq, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vpexpandw, Vpexpandw, Vec, Vec) // AVX512_VBMI2{kz}
ASMJIT_INST_2x(vpexpandw, Vpexpandw, Vec, Mem) // AVX512_VBMI2{kz}
- ASMJIT_INST_3x(vpextrb, Vpextrb, Gp, Xmm, Imm) // AVX AVX512_BW
- ASMJIT_INST_3x(vpextrb, Vpextrb, Mem, Xmm, Imm) // AVX AVX512_BW
- ASMJIT_INST_3x(vpextrd, Vpextrd, Gp, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3x(vpextrd, Vpextrd, Mem, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3x(vpextrq, Vpextrq, Gp, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3x(vpextrq, Vpextrq, Mem, Xmm, Imm) // AVX AVX512_DQ
- ASMJIT_INST_3x(vpextrw, Vpextrw, Gp, Xmm, Imm) // AVX AVX512_BW
- ASMJIT_INST_3x(vpextrw, Vpextrw, Mem, Xmm, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrb, Vpextrb, Gp, Vec, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrb, Vpextrb, Mem, Vec, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrd, Vpextrd, Gp, Vec, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrd, Vpextrd, Mem, Vec, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrq, Vpextrq, Gp, Vec, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrq, Vpextrq, Mem, Vec, Imm) // AVX AVX512_DQ
+ ASMJIT_INST_3x(vpextrw, Vpextrw, Gp, Vec, Imm) // AVX AVX512_BW
+ ASMJIT_INST_3x(vpextrw, Vpextrw, Mem, Vec, Imm) // AVX AVX512_BW
ASMJIT_INST_2x(vpgatherdd, Vpgatherdd, Vec, Mem) // AVX512_F{k}
ASMJIT_INST_3x(vpgatherdd, Vpgatherdd, Vec, Mem, Vec) // AVX2
ASMJIT_INST_2x(vpgatherdq, Vpgatherdq, Vec, Mem) // AVX512_F{k}
@@ -3035,14 +3011,14 @@ public:
ASMJIT_INST_3x(vphsubsw, Vphsubsw, Vec, Vec, Mem) // AVX+
ASMJIT_INST_3x(vphsubw, Vphsubw, Vec, Vec, Vec) // AVX+
ASMJIT_INST_3x(vphsubw, Vphsubw, Vec, Vec, Mem) // AVX+
- ASMJIT_INST_4x(vpinsrb, Vpinsrb, Xmm, Xmm, Gp, Imm) // AVX AVX512_BW{kz}
- ASMJIT_INST_4x(vpinsrb, Vpinsrb, Xmm, Xmm, Mem, Imm) // AVX AVX512_BW{kz}
- ASMJIT_INST_4x(vpinsrd, Vpinsrd, Xmm, Xmm, Gp, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4x(vpinsrd, Vpinsrd, Xmm, Xmm, Mem, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4x(vpinsrq, Vpinsrq, Xmm, Xmm, Gp, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4x(vpinsrq, Vpinsrq, Xmm, Xmm, Mem, Imm) // AVX AVX512_DQ{kz}
- ASMJIT_INST_4x(vpinsrw, Vpinsrw, Xmm, Xmm, Gp, Imm) // AVX AVX512_BW{kz}
- ASMJIT_INST_4x(vpinsrw, Vpinsrw, Xmm, Xmm, Mem, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrb, Vpinsrb, Vec, Vec, Gp, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrb, Vpinsrb, Vec, Vec, Mem, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrd, Vpinsrd, Vec, Vec, Gp, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrd, Vpinsrd, Vec, Vec, Mem, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrq, Vpinsrq, Vec, Vec, Gp, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrq, Vpinsrq, Vec, Vec, Mem, Imm) // AVX AVX512_DQ{kz}
+ ASMJIT_INST_4x(vpinsrw, Vpinsrw, Vec, Vec, Gp, Imm) // AVX AVX512_BW{kz}
+ ASMJIT_INST_4x(vpinsrw, Vpinsrw, Vec, Vec, Mem, Imm) // AVX AVX512_BW{kz}
ASMJIT_INST_2x(vplzcntd, Vplzcntd, Vec, Vec) // AVX512_CD{kz|b32}
ASMJIT_INST_2x(vplzcntd, Vplzcntd, Vec, Mem) // AVX512_CD{kz|b32}
ASMJIT_INST_2x(vplzcntq, Vplzcntq, Vec, Vec) // AVX512_CD{kz|b64}
@@ -3376,92 +3352,68 @@ public:
ASMJIT_INST_4x(vrangepd, Vrangepd, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|b64}
ASMJIT_INST_4x(vrangeps, Vrangeps, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|b32}
ASMJIT_INST_4x(vrangeps, Vrangeps, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|b32}
- ASMJIT_INST_4x(vrangesd, Vrangesd, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz|sae}
- ASMJIT_INST_4x(vrangesd, Vrangesd, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz|sae}
- ASMJIT_INST_4x(vrangess, Vrangess, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz|sae}
- ASMJIT_INST_4x(vrangess, Vrangess, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangesd, Vrangesd, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangesd, Vrangesd, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangess, Vrangess, Vec, Vec, Vec, Imm) // AVX512_DQ{kz|sae}
+ ASMJIT_INST_4x(vrangess, Vrangess, Vec, Vec, Mem, Imm) // AVX512_DQ{kz|sae}
ASMJIT_INST_2x(vrcp14pd, Vrcp14pd, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrcp14pd, Vrcp14pd, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrcp14ps, Vrcp14ps, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_2x(vrcp14ps, Vrcp14ps, Vec, Mem) // AVX512_F{kz|b32}
- ASMJIT_INST_3x(vrcp14sd, Vrcp14sd, Xmm, Xmm, Xmm) // AVX512_F{kz}
- ASMJIT_INST_3x(vrcp14sd, Vrcp14sd, Xmm, Xmm, Mem) // AVX512_F{kz}
- ASMJIT_INST_3x(vrcp14ss, Vrcp14ss, Xmm, Xmm, Xmm) // AVX512_F{kz}
- ASMJIT_INST_3x(vrcp14ss, Vrcp14ss, Xmm, Xmm, Mem) // AVX512_F{kz}
- ASMJIT_INST_2x(vrcp28pd, Vrcp28pd, Vec, Vec) // AVX512_ER{kz|sae|b64}
- ASMJIT_INST_2x(vrcp28pd, Vrcp28pd, Vec, Mem) // AVX512_ER{kz|sae|b64}
- ASMJIT_INST_2x(vrcp28ps, Vrcp28ps, Vec, Vec) // AVX512_ER{kz|sae|b32}
- ASMJIT_INST_2x(vrcp28ps, Vrcp28ps, Vec, Mem) // AVX512_ER{kz|sae|b32}
- ASMJIT_INST_3x(vrcp28sd, Vrcp28sd, Xmm, Xmm, Xmm) // AVX512_ER{kz|sae}
- ASMJIT_INST_3x(vrcp28sd, Vrcp28sd, Xmm, Xmm, Mem) // AVX512_ER{kz|sae}
- ASMJIT_INST_3x(vrcp28ss, Vrcp28ss, Xmm, Xmm, Xmm) // AVX512_ER{kz|sae}
- ASMJIT_INST_3x(vrcp28ss, Vrcp28ss, Xmm, Xmm, Mem) // AVX512_ER{kz|sae}
+ ASMJIT_INST_3x(vrcp14sd, Vrcp14sd, Vec, Vec, Vec) // AVX512_F{kz}
+ ASMJIT_INST_3x(vrcp14sd, Vrcp14sd, Vec, Vec, Mem) // AVX512_F{kz}
+ ASMJIT_INST_3x(vrcp14ss, Vrcp14ss, Vec, Vec, Vec) // AVX512_F{kz}
+ ASMJIT_INST_3x(vrcp14ss, Vrcp14ss, Vec, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vrcpps, Vrcpps, Vec, Vec) // AVX
ASMJIT_INST_2x(vrcpps, Vrcpps, Vec, Mem) // AVX
- ASMJIT_INST_3x(vrcpss, Vrcpss, Xmm, Xmm, Xmm) // AVX
- ASMJIT_INST_3x(vrcpss, Vrcpss, Xmm, Xmm, Mem) // AVX
+ ASMJIT_INST_3x(vrcpss, Vrcpss, Vec, Vec, Vec) // AVX
+ ASMJIT_INST_3x(vrcpss, Vrcpss, Vec, Vec, Mem) // AVX
ASMJIT_INST_3x(vreducepd, Vreducepd, Vec, Vec, Imm) // AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vreducepd, Vreducepd, Vec, Mem, Imm) // AVX512_DQ{kz|b64}
ASMJIT_INST_3x(vreduceps, Vreduceps, Vec, Vec, Imm) // AVX512_DQ{kz|b32}
ASMJIT_INST_3x(vreduceps, Vreduceps, Vec, Mem, Imm) // AVX512_DQ{kz|b32}
- ASMJIT_INST_4x(vreducesd, Vreducesd, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4x(vreducesd, Vreducesd, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4x(vreducess, Vreducess, Xmm, Xmm, Xmm, Imm) // AVX512_DQ{kz}
- ASMJIT_INST_4x(vreducess, Vreducess, Xmm, Xmm, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducesd, Vreducesd, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducesd, Vreducesd, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducess, Vreducess, Vec, Vec, Vec, Imm) // AVX512_DQ{kz}
+ ASMJIT_INST_4x(vreducess, Vreducess, Vec, Vec, Mem, Imm) // AVX512_DQ{kz}
ASMJIT_INST_3x(vrndscalepd, Vrndscalepd, Vec, Vec, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vrndscalepd, Vrndscalepd, Vec, Mem, Imm) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vrndscaleps, Vrndscaleps, Vec, Vec, Imm) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vrndscaleps, Vrndscaleps, Vec, Mem, Imm) // AVX512_F{kz|b32}
- ASMJIT_INST_4x(vrndscalesd, Vrndscalesd, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vrndscalesd, Vrndscalesd, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vrndscaless, Vrndscaless, Xmm, Xmm, Xmm, Imm) // AVX512_F{kz|sae}
- ASMJIT_INST_4x(vrndscaless, Vrndscaless, Xmm, Xmm, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscalesd, Vrndscalesd, Vec, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscalesd, Vrndscalesd, Vec, Vec, Mem, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscaless, Vrndscaless, Vec, Vec, Vec, Imm) // AVX512_F{kz|sae}
+ ASMJIT_INST_4x(vrndscaless, Vrndscaless, Vec, Vec, Mem, Imm) // AVX512_F{kz|sae}
ASMJIT_INST_3x(vroundpd, Vroundpd, Vec, Vec, Imm) // AVX
ASMJIT_INST_3x(vroundpd, Vroundpd, Vec, Mem, Imm) // AVX
ASMJIT_INST_3x(vroundps, Vroundps, Vec, Vec, Imm) // AVX
ASMJIT_INST_3x(vroundps, Vroundps, Vec, Mem, Imm) // AVX
- ASMJIT_INST_4x(vroundsd, Vroundsd, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4x(vroundsd, Vroundsd, Xmm, Xmm, Mem, Imm) // AVX
- ASMJIT_INST_4x(vroundss, Vroundss, Xmm, Xmm, Xmm, Imm) // AVX
- ASMJIT_INST_4x(vroundss, Vroundss, Xmm, Xmm, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vroundsd, Vroundsd, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vroundsd, Vroundsd, Vec, Vec, Mem, Imm) // AVX
+ ASMJIT_INST_4x(vroundss, Vroundss, Vec, Vec, Vec, Imm) // AVX
+ ASMJIT_INST_4x(vroundss, Vroundss, Vec, Vec, Mem, Imm) // AVX
ASMJIT_INST_2x(vrsqrt14pd, Vrsqrt14pd, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrsqrt14pd, Vrsqrt14pd, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_2x(vrsqrt14ps, Vrsqrt14ps, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_2x(vrsqrt14ps, Vrsqrt14ps, Vec, Mem) // AVX512_F{kz|b32}
- ASMJIT_INST_3x(vrsqrt14sd, Vrsqrt14sd, Xmm, Xmm, Xmm) // AVX512_F{kz}
- ASMJIT_INST_3x(vrsqrt14sd, Vrsqrt14sd, Xmm, Xmm, Mem) // AVX512_F{kz}
- ASMJIT_INST_3x(vrsqrt14ss, Vrsqrt14ss, Xmm, Xmm, Xmm) // AVX512_F{kz}
- ASMJIT_INST_3x(vrsqrt14ss, Vrsqrt14ss, Xmm, Xmm, Mem) // AVX512_F{kz}
- ASMJIT_INST_2x(vrsqrt28pd, Vrsqrt28pd, Vec, Vec) // AVX512_ER{kz|sae|b64}
- ASMJIT_INST_2x(vrsqrt28pd, Vrsqrt28pd, Vec, Mem) // AVX512_ER{kz|sae|b64}
- ASMJIT_INST_2x(vrsqrt28ps, Vrsqrt28ps, Vec, Vec) // AVX512_ER{kz|sae|b32}
- ASMJIT_INST_2x(vrsqrt28ps, Vrsqrt28ps, Vec, Mem) // AVX512_ER{kz|sae|b32}
- ASMJIT_INST_3x(vrsqrt28sd, Vrsqrt28sd, Xmm, Xmm, Xmm) // AVX512_ER{kz|sae}
- ASMJIT_INST_3x(vrsqrt28sd, Vrsqrt28sd, Xmm, Xmm, Mem) // AVX512_ER{kz|sae}
- ASMJIT_INST_3x(vrsqrt28ss, Vrsqrt28ss, Xmm, Xmm, Xmm) // AVX512_ER{kz|sae}
- ASMJIT_INST_3x(vrsqrt28ss, Vrsqrt28ss, Xmm, Xmm, Mem) // AVX512_ER{kz|sae}
+ ASMJIT_INST_3x(vrsqrt14sd, Vrsqrt14sd, Vec, Vec, Vec) // AVX512_F{kz}
+ ASMJIT_INST_3x(vrsqrt14sd, Vrsqrt14sd, Vec, Vec, Mem) // AVX512_F{kz}
+ ASMJIT_INST_3x(vrsqrt14ss, Vrsqrt14ss, Vec, Vec, Vec) // AVX512_F{kz}
+ ASMJIT_INST_3x(vrsqrt14ss, Vrsqrt14ss, Vec, Vec, Mem) // AVX512_F{kz}
ASMJIT_INST_2x(vrsqrtps, Vrsqrtps, Vec, Vec) // AVX
ASMJIT_INST_2x(vrsqrtps, Vrsqrtps, Vec, Mem) // AVX
- ASMJIT_INST_3x(vrsqrtss, Vrsqrtss, Xmm, Xmm, Xmm) // AVX
- ASMJIT_INST_3x(vrsqrtss, Vrsqrtss, Xmm, Xmm, Mem) // AVX
+ ASMJIT_INST_3x(vrsqrtss, Vrsqrtss, Vec, Vec, Vec) // AVX
+ ASMJIT_INST_3x(vrsqrtss, Vrsqrtss, Vec, Vec, Mem) // AVX
ASMJIT_INST_3x(vscalefpd, Vscalefpd, Vec, Vec, Vec) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vscalefpd, Vscalefpd, Vec, Vec, Mem) // AVX512_F{kz|b64}
ASMJIT_INST_3x(vscalefps, Vscalefps, Vec, Vec, Vec) // AVX512_F{kz|b32}
ASMJIT_INST_3x(vscalefps, Vscalefps, Vec, Vec, Mem) // AVX512_F{kz|b32}
- ASMJIT_INST_3x(vscalefsd, Vscalefsd, Xmm, Xmm, Xmm) // AVX512_F{kz|er}
- ASMJIT_INST_3x(vscalefsd, Vscalefsd, Xmm, Xmm, Mem) // AVX512_F{kz|er}
- ASMJIT_INST_3x(vscalefss, Vscalefss, Xmm, Xmm, Xmm) // AVX512_F{kz|er}
- ASMJIT_INST_3x(vscalefss, Vscalefss, Xmm, Xmm, Mem) // AVX512_F{kz|er}
+ ASMJIT_INST_3x(vscalefsd, Vscalefsd, Vec, Vec, Vec) // AVX512_F{kz|er}
+ ASMJIT_INST_3x(vscalefsd, Vscalefsd, Vec, Vec, Mem) // AVX512_F{kz|er}
+ ASMJIT_INST_3x(vscalefss, Vscalefss, Vec, Vec, Vec) // AVX512_F{kz|er}
+ ASMJIT_INST_3x(vscalefss, Vscalefss, Vec, Vec, Mem) // AVX512_F{kz|er}
ASMJIT_INST_2x(vscatterdpd, Vscatterdpd, Mem, Vec) // AVX512_F{k}
ASMJIT_INST_2x(vscatterdps, Vscatterdps, Mem, Vec) // AVX512_F{k}
- ASMJIT_INST_1x(vscatterpf0dpd, Vscatterpf0dpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf0dps, Vscatterpf0dps, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf0qpd, Vscatterpf0qpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf0qps, Vscatterpf0qps, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf1dpd, Vscatterpf1dpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf1dps, Vscatterpf1dps, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf1qpd, Vscatterpf1qpd, Mem) // AVX512_PF{k}
- ASMJIT_INST_1x(vscatterpf1qps, Vscatterpf1qps, Mem) // AVX512_PF{k}
ASMJIT_INST_2x(vscatterqpd, Vscatterqpd, Mem, Vec) // AVX512_F{k}
ASMJIT_INST_2x(vscatterqps, Vscatterqps, Mem, Vec) // AVX512_F{k}
ASMJIT_INST_4x(vshuff32x4, Vshuff32x4, Vec, Vec, Vec, Imm) // AVX512_F{kz|b32}
@@ -3480,27 +3432,27 @@ public:
ASMJIT_INST_2x(vsqrtpd, Vsqrtpd, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_2x(vsqrtps, Vsqrtps, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_2x(vsqrtps, Vsqrtps, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vsqrtsd, Vsqrtsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vsqrtsd, Vsqrtsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vsqrtss, Vsqrtss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vsqrtss, Vsqrtss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsqrtsd, Vsqrtsd, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsqrtsd, Vsqrtsd, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsqrtss, Vsqrtss, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsqrtss, Vsqrtss, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
ASMJIT_INST_1x(vstmxcsr, Vstmxcsr, Mem) // AVX
ASMJIT_INST_3x(vsubpd, Vsubpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vsubpd, Vsubpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vsubps, Vsubps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
ASMJIT_INST_3x(vsubps, Vsubps, Vec, Vec, Mem) // AVX AVX512_F{kz|b32}
- ASMJIT_INST_3x(vsubsd, Vsubsd, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vsubsd, Vsubsd, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vsubss, Vsubss, Xmm, Xmm, Xmm) // AVX AVX512_F{kz|er}
- ASMJIT_INST_3x(vsubss, Vsubss, Xmm, Xmm, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsubsd, Vsubsd, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsubsd, Vsubsd, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsubss, Vsubss, Vec, Vec, Vec) // AVX AVX512_F{kz|er}
+ ASMJIT_INST_3x(vsubss, Vsubss, Vec, Vec, Mem) // AVX AVX512_F{kz|er}
ASMJIT_INST_2x(vtestpd, Vtestpd, Vec, Vec) // AVX
ASMJIT_INST_2x(vtestpd, Vtestpd, Vec, Mem) // AVX
ASMJIT_INST_2x(vtestps, Vtestps, Vec, Vec) // AVX
ASMJIT_INST_2x(vtestps, Vtestps, Vec, Mem) // AVX
- ASMJIT_INST_2x(vucomisd, Vucomisd, Xmm, Xmm) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vucomisd, Vucomisd, Xmm, Mem) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vucomiss, Vucomiss, Xmm, Xmm) // AVX AVX512_F{sae}
- ASMJIT_INST_2x(vucomiss, Vucomiss, Xmm, Mem) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vucomisd, Vucomisd, Vec, Vec) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vucomisd, Vucomisd, Vec, Mem) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vucomiss, Vucomiss, Vec, Vec) // AVX AVX512_F{sae}
+ ASMJIT_INST_2x(vucomiss, Vucomiss, Vec, Mem) // AVX AVX512_F{sae}
ASMJIT_INST_3x(vunpckhpd, Vunpckhpd, Vec, Vec, Vec) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vunpckhpd, Vunpckhpd, Vec, Vec, Mem) // AVX AVX512_F{kz|b64}
ASMJIT_INST_3x(vunpckhps, Vunpckhps, Vec, Vec, Vec) // AVX AVX512_F{kz|b32}
@@ -3527,12 +3479,12 @@ public:
ASMJIT_INST_4x(vfmaddps, Vfmaddps, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfmaddps, Vfmaddps, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfmaddps, Vfmaddps, Vec, Vec, Vec, Mem) // FMA4
- ASMJIT_INST_4x(vfmaddsd, Vfmaddsd, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfmaddsd, Vfmaddsd, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfmaddsd, Vfmaddsd, Xmm, Xmm, Xmm, Mem) // FMA4
- ASMJIT_INST_4x(vfmaddss, Vfmaddss, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfmaddss, Vfmaddss, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfmaddss, Vfmaddss, Xmm, Xmm, Xmm, Mem) // FMA4
+ ASMJIT_INST_4x(vfmaddsd, Vfmaddsd, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfmaddsd, Vfmaddsd, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfmaddsd, Vfmaddsd, Vec, Vec, Vec, Mem) // FMA4
+ ASMJIT_INST_4x(vfmaddss, Vfmaddss, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfmaddss, Vfmaddss, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfmaddss, Vfmaddss, Vec, Vec, Vec, Mem) // FMA4
ASMJIT_INST_4x(vfmaddsubpd, Vfmaddsubpd, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfmaddsubpd, Vfmaddsubpd, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfmaddsubpd, Vfmaddsubpd, Vec, Vec, Vec, Mem) // FMA4
@@ -3551,36 +3503,36 @@ public:
ASMJIT_INST_4x(vfmsubps, Vfmsubps, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfmsubps, Vfmsubps, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfmsubps, Vfmsubps, Vec, Vec, Vec, Mem) // FMA4
- ASMJIT_INST_4x(vfmsubsd, Vfmsubsd, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfmsubsd, Vfmsubsd, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfmsubsd, Vfmsubsd, Xmm, Xmm, Xmm, Mem) // FMA4
- ASMJIT_INST_4x(vfmsubss, Vfmsubss, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfmsubss, Vfmsubss, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfmsubss, Vfmsubss, Xmm, Xmm, Xmm, Mem) // FMA4
+ ASMJIT_INST_4x(vfmsubsd, Vfmsubsd, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfmsubsd, Vfmsubsd, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfmsubsd, Vfmsubsd, Vec, Vec, Vec, Mem) // FMA4
+ ASMJIT_INST_4x(vfmsubss, Vfmsubss, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfmsubss, Vfmsubss, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfmsubss, Vfmsubss, Vec, Vec, Vec, Mem) // FMA4
ASMJIT_INST_4x(vfnmaddpd, Vfnmaddpd, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfnmaddpd, Vfnmaddpd, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfnmaddpd, Vfnmaddpd, Vec, Vec, Vec, Mem) // FMA4
ASMJIT_INST_4x(vfnmaddps, Vfnmaddps, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfnmaddps, Vfnmaddps, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfnmaddps, Vfnmaddps, Vec, Vec, Vec, Mem) // FMA4
- ASMJIT_INST_4x(vfnmaddsd, Vfnmaddsd, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmaddsd, Vfnmaddsd, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmaddsd, Vfnmaddsd, Xmm, Xmm, Xmm, Mem) // FMA4
- ASMJIT_INST_4x(vfnmaddss, Vfnmaddss, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmaddss, Vfnmaddss, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmaddss, Vfnmaddss, Xmm, Xmm, Xmm, Mem) // FMA4
+ ASMJIT_INST_4x(vfnmaddsd, Vfnmaddsd, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmaddsd, Vfnmaddsd, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmaddsd, Vfnmaddsd, Vec, Vec, Vec, Mem) // FMA4
+ ASMJIT_INST_4x(vfnmaddss, Vfnmaddss, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmaddss, Vfnmaddss, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmaddss, Vfnmaddss, Vec, Vec, Vec, Mem) // FMA4
ASMJIT_INST_4x(vfnmsubpd, Vfnmsubpd, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfnmsubpd, Vfnmsubpd, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfnmsubpd, Vfnmsubpd, Vec, Vec, Vec, Mem) // FMA4
ASMJIT_INST_4x(vfnmsubps, Vfnmsubps, Vec, Vec, Vec, Vec) // FMA4
ASMJIT_INST_4x(vfnmsubps, Vfnmsubps, Vec, Vec, Mem, Vec) // FMA4
ASMJIT_INST_4x(vfnmsubps, Vfnmsubps, Vec, Vec, Vec, Mem) // FMA4
- ASMJIT_INST_4x(vfnmsubsd, Vfnmsubsd, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmsubsd, Vfnmsubsd, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmsubsd, Vfnmsubsd, Xmm, Xmm, Xmm, Mem) // FMA4
- ASMJIT_INST_4x(vfnmsubss, Vfnmsubss, Xmm, Xmm, Xmm, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmsubss, Vfnmsubss, Xmm, Xmm, Mem, Xmm) // FMA4
- ASMJIT_INST_4x(vfnmsubss, Vfnmsubss, Xmm, Xmm, Xmm, Mem) // FMA4
+ ASMJIT_INST_4x(vfnmsubsd, Vfnmsubsd, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmsubsd, Vfnmsubsd, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmsubsd, Vfnmsubsd, Vec, Vec, Vec, Mem) // FMA4
+ ASMJIT_INST_4x(vfnmsubss, Vfnmsubss, Vec, Vec, Vec, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmsubss, Vfnmsubss, Vec, Vec, Mem, Vec) // FMA4
+ ASMJIT_INST_4x(vfnmsubss, Vfnmsubss, Vec, Vec, Vec, Mem) // FMA4
//! \}
@@ -3591,136 +3543,136 @@ public:
ASMJIT_INST_2x(vfrczpd, Vfrczpd, Vec, Mem) // XOP
ASMJIT_INST_2x(vfrczps, Vfrczps, Vec, Vec) // XOP
ASMJIT_INST_2x(vfrczps, Vfrczps, Vec, Mem) // XOP
- ASMJIT_INST_2x(vfrczsd, Vfrczsd, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vfrczsd, Vfrczsd, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vfrczss, Vfrczss, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vfrczss, Vfrczss, Xmm, Mem) // XOP
+ ASMJIT_INST_2x(vfrczsd, Vfrczsd, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vfrczsd, Vfrczsd, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vfrczss, Vfrczss, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vfrczss, Vfrczss, Vec, Mem) // XOP
ASMJIT_INST_4x(vpcmov, Vpcmov, Vec, Vec, Vec, Vec) // XOP
ASMJIT_INST_4x(vpcmov, Vpcmov, Vec, Vec, Mem, Vec) // XOP
ASMJIT_INST_4x(vpcmov, Vpcmov, Vec, Vec, Vec, Mem) // XOP
- ASMJIT_INST_4x(vpcomb, Vpcomb, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomb, Vpcomb, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomd, Vpcomd, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomd, Vpcomd, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomq, Vpcomq, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomq, Vpcomq, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomw, Vpcomw, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomw, Vpcomw, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomub, Vpcomub, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomub, Vpcomub, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomud, Vpcomud, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomud, Vpcomud, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomuq, Vpcomuq, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomuq, Vpcomuq, Xmm, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_4x(vpcomuw, Vpcomuw, Xmm, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_4x(vpcomuw, Vpcomuw, Xmm, Xmm, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomb, Vpcomb, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomb, Vpcomb, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomd, Vpcomd, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomd, Vpcomd, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomq, Vpcomq, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomq, Vpcomq, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomw, Vpcomw, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomw, Vpcomw, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomub, Vpcomub, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomub, Vpcomub, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomud, Vpcomud, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomud, Vpcomud, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuq, Vpcomuq, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuq, Vpcomuq, Vec, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuw, Vpcomuw, Vec, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_4x(vpcomuw, Vpcomuw, Vec, Vec, Mem, Imm) // XOP
ASMJIT_INST_5x(vpermil2pd, Vpermil2pd, Vec, Vec, Vec, Vec, Imm) // XOP
ASMJIT_INST_5x(vpermil2pd, Vpermil2pd, Vec, Vec, Mem, Vec, Imm) // XOP
ASMJIT_INST_5x(vpermil2pd, Vpermil2pd, Vec, Vec, Vec, Mem, Imm) // XOP
ASMJIT_INST_5x(vpermil2ps, Vpermil2ps, Vec, Vec, Vec, Vec, Imm) // XOP
ASMJIT_INST_5x(vpermil2ps, Vpermil2ps, Vec, Vec, Mem, Vec, Imm) // XOP
ASMJIT_INST_5x(vpermil2ps, Vpermil2ps, Vec, Vec, Vec, Mem, Imm) // XOP
- ASMJIT_INST_2x(vphaddbd, Vphaddbd, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddbd, Vphaddbd, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddbq, Vphaddbq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddbq, Vphaddbq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddbw, Vphaddbw, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddbw, Vphaddbw, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphadddq, Vphadddq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphadddq, Vphadddq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddwd, Vphaddwd, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddwd, Vphaddwd, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddwq, Vphaddwq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddwq, Vphaddwq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddubd, Vphaddubd, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddubd, Vphaddubd, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddubq, Vphaddubq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddubq, Vphaddubq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddubw, Vphaddubw, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddubw, Vphaddubw, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphaddudq, Vphaddudq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphaddudq, Vphaddudq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphadduwd, Vphadduwd, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphadduwd, Vphadduwd, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphadduwq, Vphadduwq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphadduwq, Vphadduwq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphsubbw, Vphsubbw, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphsubbw, Vphsubbw, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphsubdq, Vphsubdq, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphsubdq, Vphsubdq, Xmm, Mem) // XOP
- ASMJIT_INST_2x(vphsubwd, Vphsubwd, Xmm, Xmm) // XOP
- ASMJIT_INST_2x(vphsubwd, Vphsubwd, Xmm, Mem) // XOP
- ASMJIT_INST_4x(vpmacsdd, Vpmacsdd, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsdd, Vpmacsdd, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsdqh, Vpmacsdqh, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsdqh, Vpmacsdqh, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsdql, Vpmacsdql, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsdql, Vpmacsdql, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacswd, Vpmacswd, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacswd, Vpmacswd, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsww, Vpmacsww, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsww, Vpmacsww, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssdd, Vpmacssdd, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssdd, Vpmacssdd, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssdqh, Vpmacssdqh, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssdqh, Vpmacssdqh, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssdql, Vpmacssdql, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssdql, Vpmacssdql, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsswd, Vpmacsswd, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacsswd, Vpmacsswd, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssww, Vpmacssww, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmacssww, Vpmacssww, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmadcsswd, Vpmadcsswd, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmadcsswd, Vpmadcsswd, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpmadcswd, Vpmadcswd, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpmadcswd, Vpmadcswd, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpperm, Vpperm, Xmm, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_4x(vpperm, Vpperm, Xmm, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_4x(vpperm, Vpperm, Xmm, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3x(vprotb, Vprotb, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3x(vprotd, Vprotd, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3x(vprotq, Vprotq, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Xmm, Imm) // XOP
- ASMJIT_INST_3x(vprotw, Vprotw, Xmm, Mem, Imm) // XOP
- ASMJIT_INST_3x(vpshab, Vpshab, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshab, Vpshab, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshab, Vpshab, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshad, Vpshad, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshad, Vpshad, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshad, Vpshad, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshaq, Vpshaq, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshaq, Vpshaq, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshaq, Vpshaq, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshaw, Vpshaw, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshaw, Vpshaw, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshaw, Vpshaw, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshlb, Vpshlb, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshlb, Vpshlb, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshlb, Vpshlb, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshld, Vpshld, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshld, Vpshld, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshld, Vpshld, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshlq, Vpshlq, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshlq, Vpshlq, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshlq, Vpshlq, Xmm, Xmm, Mem) // XOP
- ASMJIT_INST_3x(vpshlw, Vpshlw, Xmm, Xmm, Xmm) // XOP
- ASMJIT_INST_3x(vpshlw, Vpshlw, Xmm, Mem, Xmm) // XOP
- ASMJIT_INST_3x(vpshlw, Vpshlw, Xmm, Xmm, Mem) // XOP
+ ASMJIT_INST_2x(vphaddbd, Vphaddbd, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddbd, Vphaddbd, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddbq, Vphaddbq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddbq, Vphaddbq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddbw, Vphaddbw, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddbw, Vphaddbw, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphadddq, Vphadddq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphadddq, Vphadddq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddwd, Vphaddwd, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddwd, Vphaddwd, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddwq, Vphaddwq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddwq, Vphaddwq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddubd, Vphaddubd, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddubd, Vphaddubd, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddubq, Vphaddubq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddubq, Vphaddubq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddubw, Vphaddubw, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddubw, Vphaddubw, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphaddudq, Vphaddudq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphaddudq, Vphaddudq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphadduwd, Vphadduwd, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphadduwd, Vphadduwd, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphadduwq, Vphadduwq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphadduwq, Vphadduwq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphsubbw, Vphsubbw, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphsubbw, Vphsubbw, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphsubdq, Vphsubdq, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphsubdq, Vphsubdq, Vec, Mem) // XOP
+ ASMJIT_INST_2x(vphsubwd, Vphsubwd, Vec, Vec) // XOP
+ ASMJIT_INST_2x(vphsubwd, Vphsubwd, Vec, Mem) // XOP
+ ASMJIT_INST_4x(vpmacsdd, Vpmacsdd, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsdd, Vpmacsdd, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsdqh, Vpmacsdqh, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsdqh, Vpmacsdqh, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsdql, Vpmacsdql, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsdql, Vpmacsdql, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacswd, Vpmacswd, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacswd, Vpmacswd, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsww, Vpmacsww, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsww, Vpmacsww, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssdd, Vpmacssdd, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssdd, Vpmacssdd, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssdqh, Vpmacssdqh, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssdqh, Vpmacssdqh, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssdql, Vpmacssdql, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssdql, Vpmacssdql, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsswd, Vpmacsswd, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacsswd, Vpmacsswd, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssww, Vpmacssww, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmacssww, Vpmacssww, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmadcsswd, Vpmadcsswd, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmadcsswd, Vpmadcsswd, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpmadcswd, Vpmadcswd, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpmadcswd, Vpmadcswd, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpperm, Vpperm, Vec, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_4x(vpperm, Vpperm, Vec, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_4x(vpperm, Vpperm, Vec, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_3x(vprotb, Vprotb, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_3x(vprotd, Vprotd, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_3x(vprotq, Vprotq, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Vec, Vec, Imm) // XOP
+ ASMJIT_INST_3x(vprotw, Vprotw, Vec, Mem, Imm) // XOP
+ ASMJIT_INST_3x(vpshab, Vpshab, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshab, Vpshab, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshab, Vpshab, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshad, Vpshad, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshad, Vpshad, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshad, Vpshad, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshaq, Vpshaq, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshaq, Vpshaq, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshaq, Vpshaq, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshaw, Vpshaw, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshaw, Vpshaw, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshaw, Vpshaw, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshlb, Vpshlb, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshlb, Vpshlb, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshlb, Vpshlb, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshld, Vpshld, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshld, Vpshld, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshld, Vpshld, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshlq, Vpshlq, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshlq, Vpshlq, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshlq, Vpshlq, Vec, Vec, Mem) // XOP
+ ASMJIT_INST_3x(vpshlw, Vpshlw, Vec, Vec, Vec) // XOP
+ ASMJIT_INST_3x(vpshlw, Vpshlw, Vec, Mem, Vec) // XOP
+ ASMJIT_INST_3x(vpshlw, Vpshlw, Vec, Vec, Mem) // XOP
//! \}
@@ -3978,13 +3930,13 @@ public:
ASMJIT_INST_3x(vminph, Vminph, Vec, Vec, Mem)
ASMJIT_INST_3x(vminsh, Vminsh, Vec, Vec, Vec)
ASMJIT_INST_3x(vminsh, Vminsh, Vec, Vec, Mem)
- ASMJIT_INST_2x(vmovsh, Vmovsh, Mem, Xmm)
- ASMJIT_INST_2x(vmovsh, Vmovsh, Xmm, Mem)
- ASMJIT_INST_3x(vmovsh, Vmovsh, Xmm, Xmm, Xmm)
- ASMJIT_INST_2x(vmovw, Vmovw, Gp, Xmm)
- ASMJIT_INST_2x(vmovw, Vmovw, Mem, Xmm)
- ASMJIT_INST_2x(vmovw, Vmovw, Xmm, Gp)
- ASMJIT_INST_2x(vmovw, Vmovw, Xmm, Mem)
+ ASMJIT_INST_2x(vmovsh, Vmovsh, Mem, Vec)
+ ASMJIT_INST_2x(vmovsh, Vmovsh, Vec, Mem)
+ ASMJIT_INST_3x(vmovsh, Vmovsh, Vec, Vec, Vec)
+ ASMJIT_INST_2x(vmovw, Vmovw, Gp, Vec)
+ ASMJIT_INST_2x(vmovw, Vmovw, Mem, Vec)
+ ASMJIT_INST_2x(vmovw, Vmovw, Vec, Gp)
+ ASMJIT_INST_2x(vmovw, Vmovw, Vec, Mem)
ASMJIT_INST_3x(vmulph, Vmulph, Vec, Vec, Vec)
ASMJIT_INST_3x(vmulph, Vmulph, Vec, Vec, Mem)
ASMJIT_INST_3x(vmulsh, Vmulsh, Vec, Vec, Vec)
@@ -4079,14 +4031,14 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
//! \{
//! Use REP/REPE prefix.
- inline This& rep() noexcept { return EmitterExplicitT<This>::_addInstOptions(InstOptions::kX86_Rep); }
+ inline This& rep() noexcept { return EmitterExplicitT<This>::_add_inst_options(InstOptions::kX86_Rep); }
//! Use REP/REPE prefix.
inline This& repe() noexcept { return rep(); }
//! Use REP/REPE prefix.
inline This& repz() noexcept { return rep(); }
//! Use REPNE prefix.
- inline This& repne() noexcept { return EmitterExplicitT<This>::_addInstOptions(InstOptions::kX86_Repne); }
+ inline This& repne() noexcept { return EmitterExplicitT<This>::_add_inst_options(InstOptions::kX86_Repne); }
//! Use REPNE prefix.
inline This& repnz() noexcept { return repne(); }
@@ -4412,22 +4364,22 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
using EmitterExplicitT<This>::pcmpistrm;
//! \endcond
- ASMJIT_INST_2x(blendvpd, Blendvpd, Xmm, Xmm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_2x(blendvpd, Blendvpd, Xmm, Mem) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_2x(blendvps, Blendvps, Xmm, Xmm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_2x(blendvps, Blendvps, Xmm, Mem) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_2x(pblendvb, Pblendvb, Xmm, Xmm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_2x(pblendvb, Pblendvb, Xmm, Mem) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(blendvpd, Blendvpd, Vec, Vec) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(blendvpd, Blendvpd, Vec, Mem) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(blendvps, Blendvps, Vec, Vec) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(blendvps, Blendvps, Vec, Mem) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(pblendvb, Pblendvb, Vec, Vec) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(pblendvb, Pblendvb, Vec, Mem) // SSE4_1 [IMPLICIT]
ASMJIT_INST_2x(maskmovq, Maskmovq, Mm, Mm) // SSE [IMPLICIT]
- ASMJIT_INST_2x(maskmovdqu, Maskmovdqu, Xmm, Xmm) // SSE2 [IMPLICIT]
- ASMJIT_INST_3x(pcmpestri, Pcmpestri, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpestri, Pcmpestri, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpestrm, Pcmpestrm, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpestrm, Pcmpestrm, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpistri, Pcmpistri, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpistri, Pcmpistri, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpistrm, Pcmpistrm, Xmm, Xmm, Imm) // SSE4_1 [IMPLICIT]
- ASMJIT_INST_3x(pcmpistrm, Pcmpistrm, Xmm, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_2x(maskmovdqu, Maskmovdqu, Vec, Vec) // SSE2 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestri, Pcmpestri, Vec, Vec, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestri, Pcmpestri, Vec, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestrm, Pcmpestrm, Vec, Vec, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpestrm, Pcmpestrm, Vec, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistri, Pcmpistri, Vec, Vec, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistri, Pcmpistri, Vec, Mem, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistrm, Pcmpistrm, Vec, Vec, Imm) // SSE4_1 [IMPLICIT]
+ ASMJIT_INST_3x(pcmpistrm, Pcmpistrm, Vec, Mem, Imm) // SSE4_1 [IMPLICIT]
//! \}
@@ -4438,8 +4390,8 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
using EmitterExplicitT<This>::sha256rnds2;
//! \endcond
- ASMJIT_INST_2x(sha256rnds2, Sha256rnds2, Xmm, Xmm) // SHA [IMPLICIT]
- ASMJIT_INST_2x(sha256rnds2, Sha256rnds2, Xmm, Mem) // SHA [IMPLICIT]
+ ASMJIT_INST_2x(sha256rnds2, Sha256rnds2, Vec, Vec) // SHA [IMPLICIT]
+ ASMJIT_INST_2x(sha256rnds2, Sha256rnds2, Vec, Mem) // SHA [IMPLICIT]
//! \}
@@ -4454,20 +4406,20 @@ struct EmitterImplicitT : public EmitterExplicitT<This> {
using EmitterExplicitT<This>::vpcmpistrm;
//! \endcond
- ASMJIT_INST_2x(vmaskmovdqu, Vmaskmovdqu, Xmm, Xmm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpestri, Vpcmpestri, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpestri, Vpcmpestri, Xmm, Mem, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpestrm, Vpcmpestrm, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpestrm, Vpcmpestrm, Xmm, Mem, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpistri, Vpcmpistri, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpistri, Vpcmpistri, Xmm, Mem, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpistrm, Vpcmpistrm, Xmm, Xmm, Imm) // AVX [IMPLICIT]
- ASMJIT_INST_3x(vpcmpistrm, Vpcmpistrm, Xmm, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_2x(vmaskmovdqu, Vmaskmovdqu, Vec, Vec) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestri, Vpcmpestri, Vec, Vec, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestri, Vpcmpestri, Vec, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestrm, Vpcmpestrm, Vec, Vec, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpestrm, Vpcmpestrm, Vec, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistri, Vpcmpistri, Vec, Vec, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistri, Vpcmpistri, Vec, Mem, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistrm, Vpcmpistrm, Vec, Vec, Imm) // AVX [IMPLICIT]
+ ASMJIT_INST_3x(vpcmpistrm, Vpcmpistrm, Vec, Mem, Imm) // AVX [IMPLICIT]
//! \}
};
-//! Emitter (X86).
+//! Emitter (X86|X86_64).
//!
//! \note This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
//! `x86::Assembler`, `x86::Builder`, or `x86::Compiler` (use with caution with `x86::Compiler` as it requires
diff --git a/3rdparty/asmjit/asmjit/x86/x86formatter.cpp b/3rdparty/asmjit/asmjit/x86/x86formatter.cpp
new file mode 100644
index 00000000000..eeb13f8e605
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86formatter.cpp
@@ -0,0 +1,1015 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_LOGGING)
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/x86/x86formatter_p.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/x86/x86instdb_p.h>
+#include <asmjit/x86/x86operand.h>
+
+#ifndef ASMJIT_NO_COMPILER
+ #include <asmjit/core/compiler.h>
+#endif
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::FormatterInternal - Constants
+// ==================================
+
+struct RegFormatInfo {
+ struct TypeEntry {
+ uint8_t index;
+ };
+
+ struct NameEntry {
+ uint8_t count;
+ uint8_t format_index;
+ uint8_t special_index;
+ uint8_t special_count;
+ };
+
+ TypeEntry type_entries[uint32_t(RegType::kMaxValue) + 1];
+ char type_strings[128 - 32];
+
+ NameEntry name_entries[uint32_t(RegType::kMaxValue) + 1];
+ char name_strings[280];
+};
+
+template<uint32_t X>
+struct RegFormatInfo_T {
+ static inline constexpr uint32_t kTypeIndex =
+ X == uint32_t(RegType::kPC ) ? 39 :
+ X == uint32_t(RegType::kGp8Lo ) ? 1 :
+ X == uint32_t(RegType::kGp8Hi ) ? 8 :
+ X == uint32_t(RegType::kGp16 ) ? 15 :
+ X == uint32_t(RegType::kGp32 ) ? 19 :
+ X == uint32_t(RegType::kGp64 ) ? 23 :
+ X == uint32_t(RegType::kVec128 ) ? 27 :
+ X == uint32_t(RegType::kVec256 ) ? 31 :
+ X == uint32_t(RegType::kVec512 ) ? 35 :
+ X == uint32_t(RegType::kMask ) ? 53 :
+ X == uint32_t(RegType::kX86_Mm ) ? 50 :
+ X == uint32_t(RegType::kSegment ) ? 43 :
+ X == uint32_t(RegType::kControl ) ? 59 :
+ X == uint32_t(RegType::kDebug ) ? 62 :
+ X == uint32_t(RegType::kX86_St ) ? 47 :
+ X == uint32_t(RegType::kX86_Bnd ) ? 55 :
+ X == uint32_t(RegType::kTile ) ? 65 : 0;
+
+ static inline constexpr uint32_t kFormatIndex =
+ X == uint32_t(RegType::kPC ) ? 43 :
+ X == uint32_t(RegType::kGp8Lo ) ? 1 :
+ X == uint32_t(RegType::kGp8Hi ) ? 6 :
+ X == uint32_t(RegType::kGp16 ) ? 11 :
+ X == uint32_t(RegType::kGp32 ) ? 16 :
+ X == uint32_t(RegType::kGp64 ) ? 21 :
+ X == uint32_t(RegType::kVec128 ) ? 25 :
+ X == uint32_t(RegType::kVec256 ) ? 31 :
+ X == uint32_t(RegType::kVec512 ) ? 37 :
+ X == uint32_t(RegType::kMask ) ? 65 :
+ X == uint32_t(RegType::kX86_Mm ) ? 60 :
+ X == uint32_t(RegType::kSegment ) ? 49 :
+ X == uint32_t(RegType::kControl ) ? 75 :
+ X == uint32_t(RegType::kDebug ) ? 80 :
+ X == uint32_t(RegType::kX86_St ) ? 55 :
+ X == uint32_t(RegType::kX86_Bnd ) ? 69 :
+ X == uint32_t(RegType::kTile ) ? 89 : 0;
+
+ static inline constexpr uint32_t kSpecialIndex =
+ X == uint32_t(RegType::kPC ) ? 85 :
+ X == uint32_t(RegType::kGp8Lo ) ? 96 :
+ X == uint32_t(RegType::kGp8Hi ) ? 128 :
+ X == uint32_t(RegType::kGp16 ) ? 161 :
+ X == uint32_t(RegType::kGp32 ) ? 160 :
+ X == uint32_t(RegType::kGp64 ) ? 192 :
+ X == uint32_t(RegType::kSegment ) ? 224 : 0;
+
+ static inline constexpr uint32_t kSpecialCount =
+ X == uint32_t(RegType::kPC ) ? 1 :
+ X == uint32_t(RegType::kGp8Lo ) ? 8 :
+ X == uint32_t(RegType::kGp8Hi ) ? 4 :
+ X == uint32_t(RegType::kGp16 ) ? 8 :
+ X == uint32_t(RegType::kGp32 ) ? 8 :
+ X == uint32_t(RegType::kGp64 ) ? 8 :
+ X == uint32_t(RegType::kSegment ) ? 7 : 0;
+
+ static inline constexpr uint32_t kRegCount =
+ X == uint32_t(RegType::kPC ) ? 1 :
+ X == uint32_t(RegType::kGp8Lo ) ? 32 :
+ X == uint32_t(RegType::kGp8Hi ) ? 4 :
+ X == uint32_t(RegType::kGp16 ) ? 32 :
+ X == uint32_t(RegType::kGp32 ) ? 32 :
+ X == uint32_t(RegType::kGp64 ) ? 32 :
+ X == uint32_t(RegType::kVec128 ) ? 32 :
+ X == uint32_t(RegType::kVec256 ) ? 32 :
+ X == uint32_t(RegType::kVec512 ) ? 32 :
+ X == uint32_t(RegType::kMask ) ? 8 :
+ X == uint32_t(RegType::kX86_Mm ) ? 8 :
+ X == uint32_t(RegType::kSegment ) ? 7 :
+ X == uint32_t(RegType::kControl ) ? 16 :
+ X == uint32_t(RegType::kDebug ) ? 16 :
+ X == uint32_t(RegType::kX86_St ) ? 8 :
+ X == uint32_t(RegType::kX86_Bnd ) ? 4 :
+ X == uint32_t(RegType::kTile ) ? 8 : 0;
+};
+
+#define ASMJIT_REG_TYPE_ENTRY(TYPE) { \
+ RegFormatInfo_T<TYPE>::kTypeIndex \
+}
+
+#define ASMJIT_REG_NAME_ENTRY(TYPE) { \
+ RegFormatInfo_T<TYPE>::kRegCount, \
+ RegFormatInfo_T<TYPE>::kFormatIndex, \
+ RegFormatInfo_T<TYPE>::kSpecialIndex, \
+ RegFormatInfo_T<TYPE>::kSpecialCount \
+}
+
+static const RegFormatInfo reg_format_info = {
+ // Register type entries and strings.
+ { ASMJIT_LOOKUP_TABLE_32(ASMJIT_REG_TYPE_ENTRY, 0) },
+
+ "\0" // #0
+ "gpb\0\0\0\0" // #1
+ "gpb.hi\0" // #8
+ "gpw\0" // #15
+ "gpd\0" // #19
+ "gpq\0" // #23
+ "xmm\0" // #27
+ "ymm\0" // #31
+ "zmm\0" // #35
+ "rip\0" // #39
+ "seg\0" // #43
+ "st\0" // #47
+ "mm\0" // #50
+ "k\0" // #53
+ "bnd\0" // #55
+ "cr\0" // #59
+ "dr\0" // #62
+ "tmm\0" // #65
+ ,
+
+ // Register name entries and strings.
+ { ASMJIT_LOOKUP_TABLE_32(ASMJIT_REG_NAME_ENTRY, 0) },
+
+ "\0"
+ "r%ub\0" // #1
+ "r%uh\0" // #6
+ "r%uw\0" // #11
+ "r%ud\0" // #16
+ "r%u\0" // #21
+ "xmm%u\0" // #25
+ "ymm%u\0" // #31
+ "zmm%u\0" // #37
+ "rip%u\0" // #43
+ "seg%u\0" // #49
+ "st%u\0" // #55
+ "mm%u\0" // #60
+ "k%u\0" // #65
+ "bnd%u\0" // #69
+ "cr%u\0" // #75
+ "dr%u\0" // #80
+
+ "rip\0" // #85
+ "tmm%u\0" // #89
+ "\0" // #95
+
+ "al\0\0" "cl\0\0" "dl\0\0" "bl\0\0" "spl\0" "bpl\0" "sil\0" "dil\0" // #96
+ "ah\0\0" "ch\0\0" "dh\0\0" "bh\0\0" "n/a\0" "n/a\0" "n/a\0" "n/a\0" // #128
+ "eax\0" "ecx\0" "edx\0" "ebx\0" "esp\0" "ebp\0" "esi\0" "edi\0" // #160
+ "rax\0" "rcx\0" "rdx\0" "rbx\0" "rsp\0" "rbp\0" "rsi\0" "rdi\0" // #192
+ "n/a\0" "es\0\0" "cs\0\0" "ss\0\0" "ds\0\0" "fs\0\0" "gs\0\0" "n/a\0" // #224
+};
+#undef ASMJIT_REG_NAME_ENTRY
+#undef ASMJIT_REG_TYPE_ENTRY
+
+static const char* get_address_size_string(uint32_t size) noexcept {
+ switch (size) {
+ case 1 : return "byte ptr ";
+ case 2 : return "word ptr ";
+ case 4 : return "dword ptr ";
+ case 6 : return "fword ptr ";
+ case 8 : return "qword ptr ";
+ case 10: return "tbyte ptr ";
+ case 16: return "xmmword ptr ";
+ case 32: return "ymmword ptr ";
+ case 64: return "zmmword ptr ";
+ default: return "";
+ }
+}
+
+// x86::FormatterInternal - Format FeatureId
+// =========================================
+
+Error FormatterInternal::format_feature(String& sb, uint32_t feature_id) noexcept {
+ // @EnumStringBegin{"enum": "CpuFeatures::X86", "output": "feature_string", "strip": "k"}@
+ static const char feature_string_data[] =
+ "None\0"
+ "MT\0"
+ "NX\0"
+ "ADX\0"
+ "ALTMOVCR8\0"
+ "APX_F\0"
+ "BMI\0"
+ "BMI2\0"
+ "CET_IBT\0"
+ "CET_SS\0"
+ "CET_SSS\0"
+ "CLDEMOTE\0"
+ "CLFLUSH\0"
+ "CLFLUSHOPT\0"
+ "CLWB\0"
+ "CLZERO\0"
+ "CMOV\0"
+ "CMPCCXADD\0"
+ "CMPXCHG16B\0"
+ "CMPXCHG8B\0"
+ "ENCLV\0"
+ "ENQCMD\0"
+ "ERMS\0"
+ "FSGSBASE\0"
+ "FSRM\0"
+ "FSRC\0"
+ "FSRS\0"
+ "FXSR\0"
+ "FXSROPT\0"
+ "FZRM\0"
+ "HRESET\0"
+ "I486\0"
+ "INVLPGB\0"
+ "LAHFSAHF\0"
+ "LAM\0"
+ "LWP\0"
+ "LZCNT\0"
+ "MCOMMIT\0"
+ "MONITOR\0"
+ "MONITORX\0"
+ "MOVBE\0"
+ "MOVDIR64B\0"
+ "MOVDIRI\0"
+ "MOVRS\0"
+ "MPX\0"
+ "MSR\0"
+ "MSRLIST\0"
+ "MSR_IMM\0"
+ "MSSE\0"
+ "OSXSAVE\0"
+ "OSPKE\0"
+ "PCONFIG\0"
+ "POPCNT\0"
+ "PREFETCHI\0"
+ "PREFETCHW\0"
+ "PREFETCHWT1\0"
+ "PTWRITE\0"
+ "RAO_INT\0"
+ "RMPQUERY\0"
+ "RDPID\0"
+ "RDPRU\0"
+ "RDRAND\0"
+ "RDSEED\0"
+ "RDTSC\0"
+ "RDTSCP\0"
+ "RTM\0"
+ "SEAM\0"
+ "SERIALIZE\0"
+ "SEV\0"
+ "SEV_ES\0"
+ "SEV_SNP\0"
+ "SKINIT\0"
+ "SMAP\0"
+ "SME\0"
+ "SMEP\0"
+ "SMX\0"
+ "SVM\0"
+ "TBM\0"
+ "TSE\0"
+ "TSXLDTRK\0"
+ "UINTR\0"
+ "VMX\0"
+ "WAITPKG\0"
+ "WBNOINVD\0"
+ "WRMSRNS\0"
+ "XSAVE\0"
+ "XSAVEC\0"
+ "XSAVEOPT\0"
+ "XSAVES\0"
+ "FPU\0"
+ "MMX\0"
+ "MMX2\0"
+ "3DNOW\0"
+ "3DNOW2\0"
+ "GEODE\0"
+ "SSE\0"
+ "SSE2\0"
+ "SSE3\0"
+ "SSSE3\0"
+ "SSE4_1\0"
+ "SSE4_2\0"
+ "SSE4A\0"
+ "PCLMULQDQ\0"
+ "AVX\0"
+ "AVX2\0"
+ "AVX_IFMA\0"
+ "AVX_NE_CONVERT\0"
+ "AVX_VNNI\0"
+ "AVX_VNNI_INT16\0"
+ "AVX_VNNI_INT8\0"
+ "F16C\0"
+ "FMA\0"
+ "FMA4\0"
+ "XOP\0"
+ "AVX512_BF16\0"
+ "AVX512_BITALG\0"
+ "AVX512_BW\0"
+ "AVX512_CD\0"
+ "AVX512_DQ\0"
+ "AVX512_F\0"
+ "AVX512_FP16\0"
+ "AVX512_IFMA\0"
+ "AVX512_VBMI\0"
+ "AVX512_VBMI2\0"
+ "AVX512_VL\0"
+ "AVX512_VNNI\0"
+ "AVX512_VP2INTERSECT\0"
+ "AVX512_VPOPCNTDQ\0"
+ "AESNI\0"
+ "GFNI\0"
+ "SHA\0"
+ "SHA512\0"
+ "SM3\0"
+ "SM4\0"
+ "VAES\0"
+ "VPCLMULQDQ\0"
+ "KL\0"
+ "AESKLE\0"
+ "AESKLEWIDE_KL\0"
+ "AVX10_1\0"
+ "AVX10_2\0"
+ "AMX_AVX512\0"
+ "AMX_BF16\0"
+ "AMX_COMPLEX\0"
+ "AMX_FP16\0"
+ "AMX_FP8\0"
+ "AMX_INT8\0"
+ "AMX_MOVRS\0"
+ "AMX_TF32\0"
+ "AMX_TILE\0"
+ "AMX_TRANSPOSE\0"
+ "<Unknown>\0";
+
+ static const uint16_t feature_string_index[] = {
+ 0, 5, 8, 11, 15, 25, 31, 35, 40, 48, 55, 63, 72, 80, 91, 96, 103, 108, 118,
+ 129, 139, 145, 152, 157, 166, 171, 176, 181, 186, 194, 199, 206, 211, 219,
+ 228, 232, 236, 242, 250, 258, 267, 273, 283, 291, 297, 301, 305, 313, 321,
+ 326, 334, 340, 348, 355, 365, 375, 387, 395, 403, 412, 418, 424, 431, 438,
+ 444, 451, 455, 460, 470, 474, 481, 489, 496, 501, 505, 510, 514, 518, 522,
+ 526, 535, 541, 545, 553, 562, 570, 576, 583, 592, 599, 603, 607, 612, 618,
+ 625, 631, 635, 640, 645, 651, 658, 665, 671, 681, 685, 690, 699, 714, 723,
+ 738, 752, 757, 761, 766, 770, 782, 796, 806, 816, 826, 835, 847, 859, 871,
+ 884, 894, 906, 926, 943, 949, 954, 958, 965, 969, 973, 978, 989, 992, 999,
+ 1013, 1021, 1029, 1040, 1049, 1061, 1070, 1078, 1087, 1097, 1106, 1115, 1129
+ };
+ // @EnumStringEnd@
+
+ return sb.append(feature_string_data + feature_string_index[Support::min(feature_id, uint32_t(CpuFeatures::X86::kMaxValue) + 1u)]);
+}
+
+// x86::FormatterInternal - Format Register
+// ========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_register(String& sb, FormatFlags format_flags, const BaseEmitter* emitter, Arch arch, RegType type, uint32_t id) noexcept {
+ Support::maybe_unused(arch);
+ const RegFormatInfo& info = reg_format_info;
+
+#ifndef ASMJIT_NO_COMPILER
+ if (Operand::is_virt_id(id)) {
+ if (emitter && emitter->emitter_type() == EmitterType::kCompiler) {
+ const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
+ if (cc->is_virt_id_valid(id)) {
+ VirtReg* virt_reg = cc->virt_reg_by_id(id);
+ ASMJIT_ASSERT(virt_reg != nullptr);
+
+ ASMJIT_PROPAGATE(Formatter::format_virt_reg_name(sb, virt_reg));
+
+ bool format_type = (Support::test(format_flags, FormatFlags::kRegType)) ||
+ (Support::test(format_flags, FormatFlags::kRegCasts) && virt_reg->reg_type() != type);
+
+ if (format_type && uint32_t(type) <= uint32_t(RegType::kMaxValue)) {
+ const RegFormatInfo::TypeEntry& type_entry = info.type_entries[size_t(type)];
+ if (type_entry.index) {
+ ASMJIT_PROPAGATE(sb.append_format("@%s", info.type_strings + type_entry.index));
+ }
+ }
+
+ return Error::kOk;
+ }
+ }
+ }
+#else
+ Support::maybe_unused(emitter, format_flags);
+#endif
+
+ if (uint32_t(type) <= uint32_t(RegType::kMaxValue)) {
+ const RegFormatInfo::NameEntry& name_entry = info.name_entries[size_t(type)];
+
+ if (id < name_entry.special_count) {
+ return sb.append(info.name_strings + name_entry.special_index + id * 4);
+ }
+
+ if (id < name_entry.count) {
+ return sb.append_format(info.name_strings + name_entry.format_index, unsigned(id));
+ }
+
+ const RegFormatInfo::TypeEntry& type_entry = info.type_entries[size_t(type)];
+ if (type_entry.index) {
+ return sb.append_format("%s@%u", info.type_strings + type_entry.index, id);
+ }
+ }
+
+ return sb.append_format("<Reg-%u>?%u", uint32_t(type), id);
+}
+
+// x86::FormatterInternal - Format Operand
+// =======================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_operand(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept {
+
+ if (op.is_reg()) {
+ return format_register(sb, format_flags, emitter, arch, op.as<Reg>().reg_type(), op.as<Reg>().id());
+ }
+
+ if (op.is_mem()) {
+ const Mem& m = op.as<Mem>();
+ ASMJIT_PROPAGATE(sb.append(get_address_size_string(m.size())));
+
+ // Segment override prefix.
+ uint32_t seg = m.segment_id();
+ if (seg != SReg::kIdNone && seg < SReg::kIdCount) {
+ ASMJIT_PROPAGATE(sb.append_format("%s:", reg_format_info.name_strings + 224 + size_t(seg) * 4));
+ }
+
+ ASMJIT_PROPAGATE(sb.append('['));
+ switch (m.addr_type()) {
+ case Mem::AddrType::kDefault:
+ break;
+ case Mem::AddrType::kAbs:
+ ASMJIT_PROPAGATE(sb.append("abs "));
+ break;
+ case Mem::AddrType::kRel:
+ ASMJIT_PROPAGATE(sb.append("rel "));
+ break;
+ }
+
+ char op_sign = '\0';
+ if (m.has_base()) {
+ op_sign = '+';
+ if (m.has_base_label()) {
+ ASMJIT_PROPAGATE(Formatter::format_label(sb, format_flags, emitter, m.base_id()));
+ }
+ else {
+ FormatFlags modified_flags = format_flags;
+ if (m.is_reg_home()) {
+ ASMJIT_PROPAGATE(sb.append("&"));
+ modified_flags &= ~FormatFlags::kRegCasts;
+ }
+ ASMJIT_PROPAGATE(format_register(sb, modified_flags, emitter, arch, m.base_type(), m.base_id()));
+ }
+ }
+
+ if (m.has_index()) {
+ if (op_sign) {
+ ASMJIT_PROPAGATE(sb.append(op_sign));
+ }
+
+ op_sign = '+';
+ ASMJIT_PROPAGATE(format_register(sb, format_flags, emitter, arch, m.index_type(), m.index_id()));
+ if (m.has_shift())
+ ASMJIT_PROPAGATE(sb.append_format("*%u", 1 << m.shift()));
+ }
+
+ uint64_t off = uint64_t(m.offset());
+ if (off || !m.has_base_or_index()) {
+ if (int64_t(off) < 0) {
+ op_sign = '-';
+ off = ~off + 1;
+ }
+
+ if (op_sign) {
+ ASMJIT_PROPAGATE(sb.append(op_sign));
+ }
+
+ uint32_t base = 10;
+ if (Support::test(format_flags, FormatFlags::kHexOffsets) && off > 9) {
+ ASMJIT_PROPAGATE(sb.append("0x", 2));
+ base = 16;
+ }
+
+ ASMJIT_PROPAGATE(sb.append_uint(off, base));
+ }
+
+ return sb.append(']');
+ }
+
+ if (op.is_imm()) {
+ const Imm& i = op.as<Imm>();
+ int64_t val = i.value();
+
+ if (Support::test(format_flags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
+ ASMJIT_PROPAGATE(sb.append("0x", 2));
+ return sb.append_uint(uint64_t(val), 16);
+ }
+ else {
+ return sb.append_int(val, 10);
+ }
+ }
+
+ if (op.is_label()) {
+ return Formatter::format_label(sb, format_flags, emitter, op.id());
+ }
+
+ return sb.append("<None>");
+}
+
+// x86::FormatterInternal - Format Immediate (Extension)
+// =====================================================
+
+static constexpr char kImmCharStart = '{';
+static constexpr char kImmCharEnd = '}';
+static constexpr char kImmCharOr = '|';
+
+struct ImmBits {
+ enum Mode : uint32_t {
+ kModeLookup = 0,
+ kModeFormat = 1
+ };
+
+ uint8_t mask;
+ uint8_t shift;
+ uint8_t mode;
+ char text[48 - 3];
+};
+
+ASMJIT_FAVOR_SIZE static Error FormatterInternal_format_imm_shuf(String& sb, uint32_t imm8, uint32_t bits, uint32_t count) noexcept {
+ uint32_t mask = (1 << bits) - 1;
+ uint32_t last_predicate_shift = bits * (count - 1u);
+
+ for (uint32_t i = 0; i < count; i++, imm8 <<= bits) {
+ uint32_t index = (imm8 >> last_predicate_shift) & mask;
+ ASMJIT_PROPAGATE(sb.append(i == 0 ? kImmCharStart : kImmCharOr));
+ ASMJIT_PROPAGATE(sb.append_uint(index));
+ }
+
+ ASMJIT_PROPAGATE(sb.append(kImmCharEnd));
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE static Error FormatterInternal_format_imm_bits(String& sb, uint32_t imm8, const ImmBits* bits, uint32_t count) noexcept {
+ uint32_t n = 0;
+ char buf[64];
+
+ for (uint32_t i = 0; i < count; i++) {
+ const ImmBits& spec = bits[i];
+
+ uint32_t value = (imm8 & uint32_t(spec.mask)) >> spec.shift;
+ const char* str = nullptr;
+
+ switch (spec.mode) {
+ case ImmBits::kModeLookup:
+ str = Support::find_packed_string(spec.text, value);
+ break;
+
+ case ImmBits::kModeFormat:
+ snprintf(buf, sizeof(buf), spec.text, unsigned(value));
+ str = buf;
+ break;
+
+ default:
+ return make_error(Error::kInvalidState);
+ }
+
+ if (!str[0]) {
+ continue;
+ }
+
+ ASMJIT_PROPAGATE(sb.append(++n == 1 ? kImmCharStart : kImmCharOr));
+ ASMJIT_PROPAGATE(sb.append(str));
+ }
+
+ if (n) {
+ ASMJIT_PROPAGATE(sb.append(kImmCharEnd));
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE static Error FormatterInternal_format_imm_text(String& sb, uint32_t imm8, uint32_t bits, uint32_t advance, const char* text, uint32_t count = 1) noexcept {
+ uint32_t mask = (1u << bits) - 1;
+ uint32_t pos = 0;
+
+ for (uint32_t i = 0; i < count; i++, imm8 >>= bits, pos += advance) {
+ uint32_t value = (imm8 & mask) + pos;
+ ASMJIT_PROPAGATE(sb.append(i == 0 ? kImmCharStart : kImmCharOr));
+ ASMJIT_PROPAGATE(sb.append(Support::find_packed_string(text, value)));
+ }
+
+ return sb.append(kImmCharEnd);
+}
+
+ASMJIT_FAVOR_SIZE static Error FormatterInternal_explain_const(
+ String& sb,
+ FormatFlags format_flags,
+ InstId inst_id,
+ uint32_t vec_size,
+ const Imm& imm
+) noexcept {
+ Support::maybe_unused(format_flags);
+
+ static const char vcmpx[] =
+ "EQ_OQ\0" "LT_OS\0" "LE_OS\0" "UNORD_Q\0" "NEQ_UQ\0" "NLT_US\0" "NLE_US\0" "ORD_Q\0"
+ "EQ_UQ\0" "NGE_US\0" "NGT_US\0" "FALSE_OQ\0" "NEQ_OQ\0" "GE_OS\0" "GT_OS\0" "TRUE_UQ\0"
+ "EQ_OS\0" "LT_OQ\0" "LE_OQ\0" "UNORD_S\0" "NEQ_US\0" "NLT_UQ\0" "NLE_UQ\0" "ORD_S\0"
+ "EQ_US\0" "NGE_UQ\0" "NGT_UQ\0" "FALSE_OS\0" "NEQ_OS\0" "GE_OQ\0" "GT_OQ\0" "TRUE_US\0";
+
+ // Why to make it compatible...
+ static const char vpcmpx[] = "EQ\0" "LT\0" "LE\0" "FALSE\0" "NEQ\0" "GE\0" "GT\0" "TRUE\0";
+ static const char vpcomx[] = "LT\0" "LE\0" "GT\0" "GE\0" "EQ\0" "NEQ\0" "FALSE\0" "TRUE\0";
+
+ static const char vshufpd[] = "A0\0" "A1\0" "B0\0" "B1\0" "A2\0" "A3\0" "B2\0" "B3\0" "A4\0" "A5\0" "B4\0" "B5\0" "A6\0" "A7\0" "B6\0" "B7\0";
+ static const char vshufps[] = "A0\0" "A1\0" "A2\0" "A3\0" "A0\0" "A1\0" "A2\0" "A3\0" "B0\0" "B1\0" "B2\0" "B3\0" "B0\0" "B1\0" "B2\0" "B3\0";
+
+ static const ImmBits vfpclassxx[] = {
+ { 0x07u, 0, ImmBits::kModeLookup, "QNAN\0" "+0\0" "-0\0" "+INF\0" "-INF\0" "DENORMAL\0" "-FINITE\0" "SNAN\0" }
+ };
+
+ static const ImmBits vfixupimmxx[] = {
+ { 0x01u, 0, ImmBits::kModeLookup, "\0" "+INF_IE\0" },
+ { 0x02u, 1, ImmBits::kModeLookup, "\0" "-VE_IE\0" },
+ { 0x04u, 2, ImmBits::kModeLookup, "\0" "-INF_IE\0" },
+ { 0x08u, 3, ImmBits::kModeLookup, "\0" "SNAN_IE\0" },
+ { 0x10u, 4, ImmBits::kModeLookup, "\0" "ONE_IE\0" },
+ { 0x20u, 5, ImmBits::kModeLookup, "\0" "ONE_ZE\0" },
+ { 0x40u, 6, ImmBits::kModeLookup, "\0" "ZERO_IE\0" },
+ { 0x80u, 7, ImmBits::kModeLookup, "\0" "ZERO_ZE\0" }
+ };
+
+ static const ImmBits vgetmantxx[] = {
+ { 0x03u, 0, ImmBits::kModeLookup, "[1, 2)\0" "[.5, 2)\0" "[.5, 1)\0" "[.75, 1.5)\0" },
+ { 0x04u, 2, ImmBits::kModeLookup, "\0" "NO_SIGN\0" },
+ { 0x08u, 3, ImmBits::kModeLookup, "\0" "QNAN_IF_SIGN\0" }
+ };
+
+ static const ImmBits vmpsadbw[] = {
+ { 0x40u, 6, ImmBits::kModeLookup, "BLK1[4]\0" "BLK1[5]\0" },
+ { 0x30u, 4, ImmBits::kModeLookup, "BLK2[4]\0" "BLK2[5]\0" "BLK2[6]\0" "BLK2[7]\0" },
+ { 0x04u, 2, ImmBits::kModeLookup, "BLK1[0]\0" "BLK1[1]\0" },
+ { 0x03u, 0, ImmBits::kModeLookup, "BLK2[0]\0" "BLK2[1]\0" "BLK2[2]\0" "BLK2[3]\0" }
+ };
+
+ static const ImmBits vpclmulqdq[] = {
+ { 0x10u, 4, ImmBits::kModeLookup, "LQ\0" "HQ\0" },
+ { 0x01u, 0, ImmBits::kModeLookup, "LQ\0" "HQ\0" }
+ };
+
+ static const ImmBits vperm2x128[] = {
+ { 0xB0u, 4, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" },
+ { 0x0Bu, 0, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" }
+ };
+
+ static const ImmBits vrangexx[] = {
+ { 0x0Cu, 2, ImmBits::kModeLookup, "SIGN_A\0" "SIGN_B\0" "SIGN_0\0" "SIGN_1\0" },
+ { 0x03u, 0, ImmBits::kModeLookup, "MIN\0" "MAX\0" "MIN_ABS\0" "MAX_ABS\0" }
+ };
+
+ static const ImmBits vreducexx_vrndscalexx[] = {
+ { 0x07u, 0, ImmBits::kModeLookup, "\0" "\0" "\0" "\0" "ROUND\0" "FLOOR\0" "CEIL\0" "TRUNC\0" },
+ { 0x08u, 3, ImmBits::kModeLookup, "\0" "SAE\0" },
+ { 0xF0u, 4, ImmBits::kModeFormat, "LEN=%d" }
+ };
+
+ static const ImmBits vroundxx[] = {
+ { 0x07u, 0, ImmBits::kModeLookup, "ROUND\0" "FLOOR\0" "CEIL\0" "TRUNC\0" "CURRENT\0" "\0" "\0" "\0" },
+ { 0x08u, 3, ImmBits::kModeLookup, "\0" "SUPPRESS\0" }
+ };
+
+ uint32_t u8 = imm.value_as<uint8_t>();
+ switch (inst_id) {
+ case Inst::kIdVblendpd:
+ case Inst::kIdBlendpd:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, vec_size / 8);
+
+ case Inst::kIdVblendps:
+ case Inst::kIdBlendps:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, vec_size / 4);
+
+ case Inst::kIdVcmppd:
+ case Inst::kIdVcmpps:
+ case Inst::kIdVcmpsd:
+ case Inst::kIdVcmpss:
+ return FormatterInternal_format_imm_text(sb, u8, 5, 0, vcmpx);
+
+ case Inst::kIdCmppd:
+ case Inst::kIdCmpps:
+ case Inst::kIdCmpsd:
+ case Inst::kIdCmpss:
+ return FormatterInternal_format_imm_text(sb, u8, 3, 0, vcmpx);
+
+ case Inst::kIdVdbpsadbw:
+ return FormatterInternal_format_imm_shuf(sb, u8, 2, 4);
+
+ case Inst::kIdVdppd:
+ case Inst::kIdVdpps:
+ case Inst::kIdDppd:
+ case Inst::kIdDpps:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, 8);
+
+ case Inst::kIdVmpsadbw:
+ case Inst::kIdMpsadbw:
+ return FormatterInternal_format_imm_bits(sb, u8, vmpsadbw, Support::min<uint32_t>(vec_size / 8, 4));
+
+ case Inst::kIdVpblendw:
+ case Inst::kIdPblendw:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, 8);
+
+ case Inst::kIdVpblendd:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, Support::min<uint32_t>(vec_size / 4, 8));
+
+ case Inst::kIdVpclmulqdq:
+ case Inst::kIdPclmulqdq:
+ return FormatterInternal_format_imm_bits(sb, u8, vpclmulqdq, ASMJIT_ARRAY_SIZE(vpclmulqdq));
+
+ case Inst::kIdVroundpd:
+ case Inst::kIdVroundps:
+ case Inst::kIdVroundsd:
+ case Inst::kIdVroundss:
+ case Inst::kIdRoundpd:
+ case Inst::kIdRoundps:
+ case Inst::kIdRoundsd:
+ case Inst::kIdRoundss:
+ return FormatterInternal_format_imm_bits(sb, u8, vroundxx, ASMJIT_ARRAY_SIZE(vroundxx));
+
+ case Inst::kIdVshufpd:
+ case Inst::kIdShufpd:
+ return FormatterInternal_format_imm_text(sb, u8, 1, 2, vshufpd, Support::min<uint32_t>(vec_size / 8, 8));
+
+ case Inst::kIdVshufps:
+ case Inst::kIdShufps:
+ return FormatterInternal_format_imm_text(sb, u8, 2, 4, vshufps, 4);
+
+ case Inst::kIdVcvtps2ph:
+ return FormatterInternal_format_imm_bits(sb, u8, vroundxx, 1);
+
+ case Inst::kIdVperm2f128:
+ case Inst::kIdVperm2i128:
+ return FormatterInternal_format_imm_bits(sb, u8, vperm2x128, ASMJIT_ARRAY_SIZE(vperm2x128));
+
+ case Inst::kIdVpermilpd:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, vec_size / 8);
+
+ case Inst::kIdVpermilps:
+ return FormatterInternal_format_imm_shuf(sb, u8, 2, 4);
+
+ case Inst::kIdVpshufd:
+ case Inst::kIdPshufd:
+ return FormatterInternal_format_imm_shuf(sb, u8, 2, 4);
+
+ case Inst::kIdVpshufhw:
+ case Inst::kIdVpshuflw:
+ case Inst::kIdPshufhw:
+ case Inst::kIdPshuflw:
+ case Inst::kIdPshufw:
+ return FormatterInternal_format_imm_shuf(sb, u8, 2, 4);
+
+ case Inst::kIdVfixupimmpd:
+ case Inst::kIdVfixupimmps:
+ case Inst::kIdVfixupimmsd:
+ case Inst::kIdVfixupimmss:
+ return FormatterInternal_format_imm_bits(sb, u8, vfixupimmxx, ASMJIT_ARRAY_SIZE(vfixupimmxx));
+
+ case Inst::kIdVfpclasspd:
+ case Inst::kIdVfpclassps:
+ case Inst::kIdVfpclasssd:
+ case Inst::kIdVfpclassss:
+ return FormatterInternal_format_imm_bits(sb, u8, vfpclassxx, ASMJIT_ARRAY_SIZE(vfpclassxx));
+
+ case Inst::kIdVgetmantpd:
+ case Inst::kIdVgetmantps:
+ case Inst::kIdVgetmantsd:
+ case Inst::kIdVgetmantss:
+ return FormatterInternal_format_imm_bits(sb, u8, vgetmantxx, ASMJIT_ARRAY_SIZE(vgetmantxx));
+
+ case Inst::kIdVpcmpb:
+ case Inst::kIdVpcmpd:
+ case Inst::kIdVpcmpq:
+ case Inst::kIdVpcmpw:
+ case Inst::kIdVpcmpub:
+ case Inst::kIdVpcmpud:
+ case Inst::kIdVpcmpuq:
+ case Inst::kIdVpcmpuw:
+ return FormatterInternal_format_imm_text(sb, u8, 3, 0, vpcmpx);
+
+ case Inst::kIdVpcomb:
+ case Inst::kIdVpcomd:
+ case Inst::kIdVpcomq:
+ case Inst::kIdVpcomw:
+ case Inst::kIdVpcomub:
+ case Inst::kIdVpcomud:
+ case Inst::kIdVpcomuq:
+ case Inst::kIdVpcomuw:
+ return FormatterInternal_format_imm_text(sb, u8, 3, 0, vpcomx);
+
+ case Inst::kIdVpermq:
+ case Inst::kIdVpermpd:
+ return FormatterInternal_format_imm_shuf(sb, u8, 2, 4);
+
+ case Inst::kIdVpternlogd:
+ case Inst::kIdVpternlogq:
+ return FormatterInternal_format_imm_shuf(sb, u8, 1, 8);
+
+ case Inst::kIdVrangepd:
+ case Inst::kIdVrangeps:
+ case Inst::kIdVrangesd:
+ case Inst::kIdVrangess:
+ return FormatterInternal_format_imm_bits(sb, u8, vrangexx, ASMJIT_ARRAY_SIZE(vrangexx));
+
+ case Inst::kIdVreducepd:
+ case Inst::kIdVreduceps:
+ case Inst::kIdVreducesd:
+ case Inst::kIdVreducess:
+ case Inst::kIdVrndscalepd:
+ case Inst::kIdVrndscaleps:
+ case Inst::kIdVrndscalesd:
+ case Inst::kIdVrndscaless:
+ return FormatterInternal_format_imm_bits(sb, u8, vreducexx_vrndscalexx, ASMJIT_ARRAY_SIZE(vreducexx_vrndscalexx));
+
+ case Inst::kIdVshuff32x4:
+ case Inst::kIdVshuff64x2:
+ case Inst::kIdVshufi32x4:
+ case Inst::kIdVshufi64x2: {
+ uint32_t count = Support::max<uint32_t>(vec_size / 16, 2u);
+ uint32_t bits = count <= 2 ? 1u : 2u;
+ return FormatterInternal_format_imm_shuf(sb, u8, bits, count);
+ }
+
+ default:
+ return Error::kOk;
+ }
+}
+
+// x86::FormatterInternal - Format Instruction
+// ===========================================
+
+ASMJIT_FAVOR_SIZE Error FormatterInternal::format_instruction(
+ String& sb,
+ FormatFlags format_flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept {
+
+ InstId inst_id = inst.inst_id();
+ InstOptions options = inst.options();
+
+ // Format instruction options and instruction mnemonic.
+ if (inst_id < Inst::_kIdCount) {
+ // VEX|EVEX options.
+ if (Support::test(options, InstOptions::kX86_Vex)) {
+ ASMJIT_PROPAGATE(sb.append("{vex} "));
+ }
+
+ if (Support::test(options, InstOptions::kX86_Vex3)) {
+ ASMJIT_PROPAGATE(sb.append("{vex3} "));
+ }
+
+ if (Support::test(options, InstOptions::kX86_Evex)) {
+ ASMJIT_PROPAGATE(sb.append("{evex} "));
+ }
+
+ // MOD/RM and MOD/MR options
+ if (Support::test(options, InstOptions::kX86_ModRM)) {
+ ASMJIT_PROPAGATE(sb.append("{modrm} "));
+ }
+ else if (Support::test(options, InstOptions::kX86_ModMR)) {
+ ASMJIT_PROPAGATE(sb.append("{modmr} "));
+ }
+
+ // SHORT|LONG options.
+ if (Support::test(options, InstOptions::kShortForm)) {
+ ASMJIT_PROPAGATE(sb.append("short "));
+ }
+
+ if (Support::test(options, InstOptions::kLongForm)) {
+ ASMJIT_PROPAGATE(sb.append("long "));
+ }
+
+ // LOCK|XACQUIRE|XRELEASE options.
+ if (Support::test(options, InstOptions::kX86_XAcquire)) {
+ ASMJIT_PROPAGATE(sb.append("xacquire "));
+ }
+
+ if (Support::test(options, InstOptions::kX86_XRelease)) {
+ ASMJIT_PROPAGATE(sb.append("xrelease "));
+ }
+
+ if (Support::test(options, InstOptions::kX86_Lock)) {
+ ASMJIT_PROPAGATE(sb.append("lock "));
+ }
+
+ // REP|REPNE options.
+ if (Support::test(options, InstOptions::kX86_Rep | InstOptions::kX86_Repne)) {
+ ASMJIT_PROPAGATE(sb.append(Support::test(options, InstOptions::kX86_Rep) ? "rep " : "repnz "));
+ if (inst.has_extra_reg()) {
+ ASMJIT_PROPAGATE(sb.append("{"));
+ ASMJIT_PROPAGATE(format_operand(sb, format_flags, emitter, arch, inst.extra_reg().to_reg<Reg>()));
+ ASMJIT_PROPAGATE(sb.append("} "));
+ }
+ }
+
+ // REX options.
+ if (Support::test(options, InstOptions::kX86_Rex)) {
+ ASMJIT_PROPAGATE(sb.append("rex "));
+ }
+
+ InstStringifyOptions stringify_options =
+ Support::test(format_flags, FormatFlags::kShowAliases)
+ ? InstStringifyOptions::kAliases
+ : InstStringifyOptions::kNone;
+
+ ASMJIT_PROPAGATE(InstInternal::inst_id_to_string(inst_id, stringify_options, sb));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append_format("[InstId=#%u]", unsigned(inst_id)));
+ }
+
+ for (size_t i = 0u; i < operands.size(); i++) {
+ const Operand_& op = operands[i];
+
+ if (op.is_none()) {
+ break;
+ }
+
+ ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
+ ASMJIT_PROPAGATE(format_operand(sb, format_flags, emitter, arch, op));
+
+ if (op.is_imm() && uint32_t(format_flags & FormatFlags::kExplainImms)) {
+ uint32_t vec_size = 16;
+ for (size_t j = 0u; j < operands.size(); j++) {
+ if (operands[j].is_reg()) {
+ vec_size = Support::max<uint32_t>(vec_size, operands[j].as<Reg>().size());
+ }
+ }
+ ASMJIT_PROPAGATE(FormatterInternal_explain_const(sb, format_flags, inst_id, vec_size, op.as<Imm>()));
+ }
+
+ // Support AVX-512 masking - {k}{z}.
+ if (i == 0) {
+ if (inst.extra_reg().group() == RegGroup::kMask) {
+ ASMJIT_PROPAGATE(sb.append(" {"));
+ ASMJIT_PROPAGATE(format_register(sb, format_flags, emitter, arch, inst.extra_reg().type(), inst.extra_reg().id()));
+ ASMJIT_PROPAGATE(sb.append('}'));
+
+ if (Support::test(options, InstOptions::kX86_ZMask)) {
+ ASMJIT_PROPAGATE(sb.append("{z}"));
+ }
+ }
+ else if (Support::test(options, InstOptions::kX86_ZMask)) {
+ ASMJIT_PROPAGATE(sb.append(" {z}"));
+ }
+ }
+
+ // Support AVX-512 broadcast - {1tox}.
+ if (op.is_mem() && op.as<Mem>().has_broadcast()) {
+ ASMJIT_PROPAGATE(sb.append_format(" {1to%u}", Support::bit_mask<uint32_t>(uint32_t(op.as<Mem>().get_broadcast()))));
+ }
+ }
+
+ // Support AVX-512 embedded rounding and suppress-all-exceptions {sae}.
+ if (inst.has_option(InstOptions::kX86_ER | InstOptions::kX86_SAE)) {
+ if (inst.has_option(InstOptions::kX86_ER)) {
+ uint32_t bits = uint32_t(inst.options() & InstOptions::kX86_ERMask) >> Support::ctz_const<InstOptions::kX86_ERMask>;
+
+ const char rounding_modes[] = "rn\0rd\0ru\0rz";
+ ASMJIT_PROPAGATE(sb.append_format(", {%s-sae}", rounding_modes + bits * 3));
+ }
+ else {
+ ASMJIT_PROPAGATE(sb.append(", {sae}"));
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/asmjit/x86/x86formatter_p.h b/3rdparty/asmjit/asmjit/x86/x86formatter_p.h
new file mode 100644
index 00000000000..b014ea3202a
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86formatter_p.h
@@ -0,0 +1,58 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
+#define ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_LOGGING
+
+#include <asmjit/core/formatter.h>
+#include <asmjit/core/string.h>
+#include <asmjit/x86/x86globals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+namespace FormatterInternal {
+
+Error ASMJIT_CDECL format_feature(
+ String& sb,
+ uint32_t feature_id) noexcept;
+
+Error ASMJIT_CDECL format_register(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ RegType reg_type,
+ uint32_t reg_id) noexcept;
+
+Error ASMJIT_CDECL format_operand(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const Operand_& op) noexcept;
+
+Error ASMJIT_CDECL format_instruction(
+ String& sb,
+ FormatFlags flags,
+ const BaseEmitter* emitter,
+ Arch arch,
+ const BaseInst& inst, Span<const Operand_> operands) noexcept;
+
+} // {FormatterInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_LOGGING
+#endif // ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86func.cpp b/3rdparty/asmjit/asmjit/x86/x86func.cpp
new file mode 100644
index 00000000000..8de3f861cf8
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86func.cpp
@@ -0,0 +1,523 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/x86/x86func_p.h>
+#include <asmjit/x86/x86emithelper_p.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+namespace FuncInternal {
+
+[[nodiscard]]
+static inline bool should_treat_as_cdeclIn64BitMode(CallConvId call_conv_id) noexcept {
+ return call_conv_id == CallConvId::kCDecl ||
+ call_conv_id == CallConvId::kStdCall ||
+ call_conv_id == CallConvId::kThisCall ||
+ call_conv_id == CallConvId::kFastCall ||
+ call_conv_id == CallConvId::kRegParm1 ||
+ call_conv_id == CallConvId::kRegParm2 ||
+ call_conv_id == CallConvId::kRegParm3;
+}
+
+ASMJIT_FAVOR_SIZE Error init_call_conv(CallConv& cc, CallConvId call_conv_id, const Environment& environment) noexcept {
+ constexpr uint32_t kZax = Gp::kIdAx;
+ constexpr uint32_t kZbx = Gp::kIdBx;
+ constexpr uint32_t kZcx = Gp::kIdCx;
+ constexpr uint32_t kZdx = Gp::kIdDx;
+ constexpr uint32_t kZsp = Gp::kIdSp;
+ constexpr uint32_t kZbp = Gp::kIdBp;
+ constexpr uint32_t kZsi = Gp::kIdSi;
+ constexpr uint32_t kZdi = Gp::kIdDi;
+
+ bool win_abi = environment.is_platform_windows() || environment.is_msvc_abi();
+
+ cc.set_arch(environment.arch());
+ cc.set_save_restore_reg_size(RegGroup::kVec, 16);
+ cc.set_save_restore_reg_size(RegGroup::kMask, 8);
+ cc.set_save_restore_reg_size(RegGroup::kX86_MM, 8);
+ cc.set_save_restore_alignment(RegGroup::kVec, 16);
+ cc.set_save_restore_alignment(RegGroup::kMask, 8);
+ cc.set_save_restore_alignment(RegGroup::kX86_MM, 8);
+
+ if (environment.is_32bit()) {
+ bool is_standard_call_conv = true;
+
+ cc.set_save_restore_reg_size(RegGroup::kGp, 4);
+ cc.set_save_restore_alignment(RegGroup::kGp, 4);
+
+ cc.set_preserved_regs(RegGroup::kGp, Support::bit_mask<RegMask>(Gp::kIdBx, Gp::kIdSp, Gp::kIdBp, Gp::kIdSi, Gp::kIdDi));
+ cc.set_natural_stack_alignment(4);
+
+ switch (call_conv_id) {
+ case CallConvId::kCDecl:
+ break;
+
+ case CallConvId::kStdCall:
+ cc.set_flags(CallConvFlags::kCalleePopsStack);
+ break;
+
+ case CallConvId::kFastCall:
+ cc.set_flags(CallConvFlags::kCalleePopsStack);
+ cc.set_passed_order(RegGroup::kGp, kZcx, kZdx);
+ break;
+
+ case CallConvId::kVectorCall:
+ cc.set_flags(CallConvFlags::kCalleePopsStack);
+ cc.set_passed_order(RegGroup::kGp, kZcx, kZdx);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3, 4, 5);
+ break;
+
+ case CallConvId::kThisCall:
+ // NOTE: Even MINGW (starting with GCC 4.7.0) now uses __thiscall on MS Windows, so we won't bail to any
+ // other calling convention if __thiscall was specified.
+ if (win_abi) {
+ cc.set_flags(CallConvFlags::kCalleePopsStack);
+ cc.set_passed_order(RegGroup::kGp, kZcx);
+ }
+ else {
+ call_conv_id = CallConvId::kCDecl;
+ }
+ break;
+
+ case CallConvId::kRegParm1:
+ cc.set_passed_order(RegGroup::kGp, kZax);
+ break;
+
+ case CallConvId::kRegParm2:
+ cc.set_passed_order(RegGroup::kGp, kZax, kZdx);
+ break;
+
+ case CallConvId::kRegParm3:
+ cc.set_passed_order(RegGroup::kGp, kZax, kZdx, kZcx);
+ break;
+
+ case CallConvId::kLightCall2:
+ case CallConvId::kLightCall3:
+ case CallConvId::kLightCall4: {
+ uint32_t n = uint32_t(call_conv_id) - uint32_t(CallConvId::kLightCall2) + 2;
+
+ cc.set_flags(CallConvFlags::kPassFloatsByVec);
+ cc.set_passed_order(RegGroup::kGp, kZax, kZdx, kZcx, kZsi, kZdi);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_passed_order(RegGroup::kMask, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_passed_order(RegGroup::kX86_MM, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_preserved_regs(RegGroup::kGp, Support::lsb_mask<uint32_t>(8));
+ cc.set_preserved_regs(RegGroup::kVec, Support::lsb_mask<uint32_t>(8) & ~Support::lsb_mask<uint32_t>(n));
+
+ cc.set_natural_stack_alignment(16);
+ is_standard_call_conv = false;
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidArgument);
+ }
+
+ if (is_standard_call_conv) {
+ // MMX arguments is something where compiler vendors disagree. For example GCC and MSVC would pass first three
+ // via registers and the rest via stack, however Clang passes all via stack. Returning MMX registers is even
+ // more fun, where GCC uses MM0, but Clang uses EAX:EDX pair. I'm not sure it's something we should be worried
+ // about as MMX is deprecated anyway.
+ cc.set_passed_order(RegGroup::kX86_MM, 0, 1, 2);
+
+ // Vector arguments (XMM|YMM|ZMM) are passed via registers. However, if the function is variadic then they have
+ // to be passed via stack.
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2);
+
+ // Functions with variable arguments always use stack for MM and vector arguments.
+ cc.add_flags(CallConvFlags::kPassVecByStackIfVA);
+ }
+
+ if (call_conv_id == CallConvId::kCDecl) {
+ cc.add_flags(CallConvFlags::kVarArgCompatible);
+ }
+ }
+ else {
+ cc.set_save_restore_reg_size(RegGroup::kGp, 8);
+ cc.set_save_restore_alignment(RegGroup::kGp, 8);
+
+ // Preprocess the calling convention into a common id as many conventions are normally ignored even by C/C++
+ // compilers and treated as `__cdecl`.
+ if (should_treat_as_cdeclIn64BitMode(call_conv_id))
+ call_conv_id = win_abi ? CallConvId::kX64Windows : CallConvId::kX64SystemV;
+
+ switch (call_conv_id) {
+ case CallConvId::kX64SystemV: {
+ cc.set_flags(CallConvFlags::kPassFloatsByVec |
+ CallConvFlags::kPassMmxByXmm |
+ CallConvFlags::kVarArgCompatible);
+ cc.set_natural_stack_alignment(16);
+ cc.set_red_zone_size(128);
+ cc.set_passed_order(RegGroup::kGp, kZdi, kZsi, kZdx, kZcx, 8, 9);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_preserved_regs(RegGroup::kGp, Support::bit_mask<RegMask>(kZbx, kZsp, kZbp, 12, 13, 14, 15));
+ break;
+ }
+
+ case CallConvId::kX64Windows: {
+ cc.set_strategy(CallConvStrategy::kX64Windows);
+ cc.set_flags(CallConvFlags::kPassFloatsByVec |
+ CallConvFlags::kIndirectVecArgs |
+ CallConvFlags::kPassMmxByGp |
+ CallConvFlags::kVarArgCompatible);
+ cc.set_natural_stack_alignment(16);
+ // Maximum 4 arguments in registers, each adds 8 bytes to the spill zone.
+ cc.set_spill_zone_size(4 * 8);
+ cc.set_passed_order(RegGroup::kGp, kZcx, kZdx, 8, 9);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3);
+ cc.set_preserved_regs(RegGroup::kGp, Support::bit_mask<RegMask>(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
+ cc.set_preserved_regs(RegGroup::kVec, Support::bit_mask<RegMask>(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
+ break;
+ }
+
+ case CallConvId::kVectorCall: {
+ cc.set_strategy(CallConvStrategy::kX64VectorCall);
+ cc.set_flags(CallConvFlags::kPassFloatsByVec |
+ CallConvFlags::kPassMmxByGp );
+ cc.set_natural_stack_alignment(16);
+ // Maximum 6 arguments in registers, each adds 8 bytes to the spill zone.
+ cc.set_spill_zone_size(6 * 8);
+ cc.set_passed_order(RegGroup::kGp, kZcx, kZdx, 8, 9);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3, 4, 5);
+ cc.set_preserved_regs(RegGroup::kGp, Support::bit_mask<RegMask>(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
+ cc.set_preserved_regs(RegGroup::kVec, Support::bit_mask<RegMask>(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
+ break;
+ }
+
+ case CallConvId::kLightCall2:
+ case CallConvId::kLightCall3:
+ case CallConvId::kLightCall4: {
+ uint32_t n = uint32_t(call_conv_id) - uint32_t(CallConvId::kLightCall2) + 2;
+
+ cc.set_flags(CallConvFlags::kPassFloatsByVec);
+ cc.set_natural_stack_alignment(16);
+ cc.set_passed_order(RegGroup::kGp, kZax, kZdx, kZcx, kZsi, kZdi);
+ cc.set_passed_order(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_passed_order(RegGroup::kMask, 0, 1, 2, 3, 4, 5, 6, 7);
+ cc.set_passed_order(RegGroup::kX86_MM, 0, 1, 2, 3, 4, 5, 6, 7);
+
+ cc.set_preserved_regs(RegGroup::kGp, Support::lsb_mask<uint32_t>(16));
+ cc.set_preserved_regs(RegGroup::kVec, ~Support::lsb_mask<uint32_t>(n));
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidArgument);
+ }
+ }
+
+ cc.set_id(call_conv_id);
+ return Error::kOk;
+}
+
+ASMJIT_FAVOR_SIZE void unpack_values(FuncDetail& func, FuncValuePack& pack) noexcept {
+ TypeId type_id = pack[0].type_id();
+ switch (type_id) {
+ case TypeId::kInt64:
+ case TypeId::kUInt64: {
+ if (Environment::is_32bit(func.call_conv().arch())) {
+ // Convert a 64-bit return value to two 32-bit return values.
+ pack[0].init_type_id(TypeId::kUInt32);
+ pack[1].init_type_id(TypeId(uint32_t(type_id) - 2));
+ break;
+ }
+ break;
+ }
+
+ default: {
+ break;
+ }
+ }
+}
+
+ASMJIT_FAVOR_SIZE Error init_func_detail(FuncDetail& func, const FuncSignature& signature, uint32_t register_size) noexcept {
+ const CallConv& cc = func.call_conv();
+ Arch arch = cc.arch();
+ uint32_t stack_offset = cc._spill_zone_size;
+ uint32_t arg_count = func.arg_count();
+
+ // Up to two return values can be returned in GP registers.
+ static const uint8_t gp_return_indexes[4] = {
+ uint8_t(Gp::kIdAx),
+ uint8_t(Gp::kIdDx),
+ uint8_t(Reg::kIdBad),
+ uint8_t(Reg::kIdBad)
+ };
+
+ if (func.has_ret()) {
+ unpack_values(func, func._rets);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ TypeId type_id = func._rets[value_index].type_id();
+
+ // Terminate at the first void type (end of the pack).
+ if (type_id == TypeId::kVoid) {
+ break;
+ }
+
+ switch (type_id) {
+ case TypeId::kInt64:
+ case TypeId::kUInt64: {
+ if (gp_return_indexes[value_index] != Reg::kIdBad) {
+ func._rets[value_index].init_reg(RegType::kGp64, gp_return_indexes[value_index], type_id);
+ }
+ else {
+ return make_error(Error::kInvalidState);
+ }
+ break;
+ }
+
+ case TypeId::kInt8:
+ case TypeId::kInt16:
+ case TypeId::kInt32: {
+ if (gp_return_indexes[value_index] != Reg::kIdBad) {
+ func._rets[value_index].init_reg(RegType::kGp32, gp_return_indexes[value_index], TypeId::kInt32);
+ }
+ else {
+ return make_error(Error::kInvalidState);
+ }
+ break;
+ }
+
+ case TypeId::kUInt8:
+ case TypeId::kUInt16:
+ case TypeId::kUInt32: {
+ if (gp_return_indexes[value_index] != Reg::kIdBad) {
+ func._rets[value_index].init_reg(RegType::kGp32, gp_return_indexes[value_index], TypeId::kUInt32);
+ }
+ else {
+ return make_error(Error::kInvalidState);
+ }
+ break;
+ }
+
+ case TypeId::kFloat32:
+ case TypeId::kFloat64: {
+ RegType reg_type = Environment::is_32bit(arch) ? RegType::kX86_St : RegType::kVec128;
+ func._rets[value_index].init_reg(reg_type, value_index, type_id);
+ break;
+ }
+
+ case TypeId::kFloat80: {
+ // 80-bit floats are always returned by FP0.
+ func._rets[value_index].init_reg(RegType::kX86_St, value_index, type_id);
+ break;
+ }
+
+ case TypeId::kMmx32:
+ case TypeId::kMmx64: {
+ // MM registers are returned through XMM (SystemV) or GPQ (Win64).
+ RegType reg_type = RegType::kX86_Mm;
+ uint32_t reg_index = value_index;
+ if (Environment::is_64bit(arch)) {
+ reg_type = cc.strategy() == CallConvStrategy::kDefault ? RegType::kVec128 : RegType::kGp64;
+ reg_index = cc.strategy() == CallConvStrategy::kDefault ? value_index : gp_return_indexes[value_index];
+
+ if (reg_index == Reg::kIdBad) {
+ return make_error(Error::kInvalidState);
+ }
+ }
+
+ func._rets[value_index].init_reg(reg_type, reg_index, type_id);
+ break;
+ }
+
+ default: {
+ func._rets[value_index].init_reg(vec_type_id_to_reg_type(type_id), value_index, type_id);
+ break;
+ }
+ }
+ }
+ }
+
+ switch (cc.strategy()) {
+ case CallConvStrategy::kDefault:
+ default: {
+ uint32_t gpz_pos = 0;
+ uint32_t vec_pos = 0;
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ unpack_values(func, func._args[arg_index]);
+
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ FuncValue& arg = func._args[arg_index][value_index];
+
+ // Terminate if there are no more arguments in the pack.
+ if (!arg) {
+ break;
+ }
+
+ TypeId type_id = arg.type_id();
+
+ if (TypeUtils::is_int(type_id)) {
+ uint32_t reg_id = Reg::kIdBad;
+
+ if (gpz_pos < CallConv::kMaxRegArgsPerGroup) {
+ reg_id = cc._passed_order[RegGroup::kGp].id[gpz_pos];
+ }
+
+ if (reg_id != Reg::kIdBad) {
+ RegType reg_type = type_id <= TypeId::kUInt32 ? RegType::kGp32 : RegType::kGp64;
+ arg.assign_reg_data(reg_type, reg_id);
+ func.add_used_regs(RegGroup::kGp, Support::bit_mask<RegMask>(reg_id));
+ gpz_pos++;
+ }
+ else {
+ uint32_t size = Support::max<uint32_t>(TypeUtils::size_of(type_id), register_size);
+ arg.assign_stack_offset(int32_t(stack_offset));
+ stack_offset += size;
+ }
+ continue;
+ }
+
+ if (TypeUtils::is_float(type_id) || TypeUtils::is_vec(type_id)) {
+ uint32_t reg_id = Reg::kIdBad;
+
+ if (vec_pos < CallConv::kMaxRegArgsPerGroup) {
+ reg_id = cc._passed_order[RegGroup::kVec].id[vec_pos];
+ }
+
+ if (TypeUtils::is_float(type_id)) {
+ // If this is a float, but `kFlagPassFloatsByVec` is false, we have to use stack instead. This should
+ // be only used by 32-bit calling conventions.
+ if (!cc.has_flag(CallConvFlags::kPassFloatsByVec)) {
+ reg_id = Reg::kIdBad;
+ }
+ }
+ else {
+ // Pass vector registers via stack if this is a variable arguments function. This should be only used
+ // by 32-bit calling conventions.
+ if (signature.has_var_args() && cc.has_flag(CallConvFlags::kPassVecByStackIfVA)) {
+ reg_id = Reg::kIdBad;
+ }
+ }
+
+ if (reg_id != Reg::kIdBad) {
+ arg.init_type_id(type_id);
+ arg.assign_reg_data(vec_type_id_to_reg_type(type_id), reg_id);
+ func.add_used_regs(RegGroup::kVec, Support::bit_mask<RegMask>(reg_id));
+ vec_pos++;
+ }
+ else {
+ uint32_t size = TypeUtils::size_of(type_id);
+ arg.assign_stack_offset(int32_t(stack_offset));
+ stack_offset += size;
+ }
+ continue;
+ }
+ }
+ }
+ break;
+ }
+
+ case CallConvStrategy::kX64Windows:
+ case CallConvStrategy::kX64VectorCall: {
+ // Both X64 and VectorCall behave similarly - arguments are indexed from left to right. The position of the
+ // argument determines in which register the argument is allocated, so it's either GP or one of XMM/YMM/ZMM
+ // registers.
+ //
+ // [ X64 ] [VecCall]
+ // Index: #0 #1 #2 #3 #4 #5
+ //
+ // GP : RCX RDX R8 R9
+ // VEC : XMM0 XMM1 XMM2 XMM3 XMM4 XMM5
+ //
+ // For example function `f(int a, double b, int c, double d)` will be:
+ //
+ // (a) (b) (c) (d)
+ // RCX XMM1 R8 XMM3
+ //
+ // Unused vector registers are used by HVA.
+ bool is_vector_call = (cc.strategy() == CallConvStrategy::kX64VectorCall);
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ unpack_values(func, func._args[arg_index]);
+
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ FuncValue& arg = func._args[arg_index][value_index];
+
+ // Terminate if there are no more arguments in the pack.
+ if (!arg) {
+ break;
+ }
+
+ TypeId type_id = arg.type_id();
+ uint32_t size = TypeUtils::size_of(type_id);
+
+ if (TypeUtils::is_int(type_id) || TypeUtils::is_mmx(type_id)) {
+ uint32_t reg_id = Reg::kIdBad;
+
+ if (arg_index < CallConv::kMaxRegArgsPerGroup) {
+ reg_id = cc._passed_order[RegGroup::kGp].id[arg_index];
+ }
+
+ if (reg_id != Reg::kIdBad) {
+ RegType reg_type = size <= 4 && !TypeUtils::is_mmx(type_id) ? RegType::kGp32 : RegType::kGp64;
+ arg.assign_reg_data(reg_type, reg_id);
+ func.add_used_regs(RegGroup::kGp, Support::bit_mask<RegMask>(reg_id));
+ }
+ else {
+ arg.assign_stack_offset(int32_t(stack_offset));
+ stack_offset += 8;
+ }
+ continue;
+ }
+
+ if (TypeUtils::is_float(type_id) || TypeUtils::is_vec(type_id)) {
+ uint32_t reg_id = Reg::kIdBad;
+
+ if (arg_index < CallConv::kMaxRegArgsPerGroup) {
+ reg_id = cc._passed_order[RegGroup::kVec].id[arg_index];
+ }
+
+ if (reg_id != Reg::kIdBad) {
+ // X64-ABI doesn't allow vector types (XMM|YMM|ZMM) to be passed via registers, however, VectorCall
+ // was designed for that purpose.
+ if (TypeUtils::is_float(type_id) || is_vector_call) {
+ RegType reg_type = vec_type_id_to_reg_type(type_id);
+ arg.assign_reg_data(reg_type, reg_id);
+ func.add_used_regs(RegGroup::kVec, Support::bit_mask<RegMask>(reg_id));
+ continue;
+ }
+ }
+
+ // Passed via stack if the argument is float/double or indirectly. The trap is - if the argument is
+ // passed indirectly, the address can be passed via register, if the argument's index has GP one.
+ if (TypeUtils::is_float(type_id)) {
+ arg.assign_stack_offset(int32_t(stack_offset));
+ }
+ else {
+ uint32_t gp_reg_id = cc._passed_order[RegGroup::kGp].id[arg_index];
+ if (gp_reg_id != Reg::kIdBad) {
+ arg.assign_reg_data(RegType::kGp64, gp_reg_id);
+ }
+ else {
+ arg.assign_stack_offset(int32_t(stack_offset));
+ }
+ arg.add_flags(FuncValue::kFlagIsIndirect);
+ }
+
+ // Always 8 bytes (float/double/pointer).
+ stack_offset += 8;
+ continue;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ func._arg_stack_size = stack_offset;
+ return Error::kOk;
+}
+
+} // {FuncInternal}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit/x86/x86func_p.h b/3rdparty/asmjit/asmjit/x86/x86func_p.h
new file mode 100644
index 00000000000..1249dafe55b
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86func_p.h
@@ -0,0 +1,33 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86FUNC_P_H_INCLUDED
+#define ASMJIT_X86_X86FUNC_P_H_INCLUDED
+
+#include <asmjit/core/func.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86-specific function API (calling conventions and other utilities).
+namespace FuncInternal {
+
+//! Initialize `CallConv` structure (X86 specific).
+Error init_call_conv(CallConv& cc, CallConvId call_conv_id, const Environment& environment) noexcept;
+
+//! Initialize `FuncDetail` (X86 specific).
+Error init_func_detail(FuncDetail& func, const FuncSignature& signature, uint32_t register_size) noexcept;
+
+} // {FuncInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86FUNC_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86globals.h b/3rdparty/asmjit/asmjit/x86/x86globals.h
index 21ed41e87d1..07c459f872c 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86globals.h
+++ b/3rdparty/asmjit/asmjit/x86/x86globals.h
@@ -1,13 +1,13 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86GLOBALS_H_INCLUDED
#define ASMJIT_X86_X86GLOBALS_H_INCLUDED
-#include "../core/archtraits.h"
-#include "../core/inst.h"
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/inst.h>
//! \namespace asmjit::x86
//! \ingroup asmjit_x86
@@ -90,7 +90,7 @@ enum class CondCode : uint8_t {
};
//! \cond
-static constexpr CondCode _reverseCondTable[] = {
+static constexpr CondCode _reverse_cond_table[] = {
CondCode::kO, // O <- O
CondCode::kNO, // NO <- NO
CondCode::kA , // A <- B
@@ -111,9 +111,9 @@ static constexpr CondCode _reverseCondTable[] = {
//! \endcond
//! Reverses a condition code (reverses the corresponding operands of a comparison).
-static ASMJIT_INLINE_NODEBUG constexpr CondCode reverseCond(CondCode cond) noexcept { return _reverseCondTable[uint8_t(cond)]; }
+static ASMJIT_INLINE_CONSTEXPR CondCode reverse_cond(CondCode cond) noexcept { return _reverse_cond_table[uint8_t(cond)]; }
//! Negates a condition code.
-static ASMJIT_INLINE_NODEBUG constexpr CondCode negateCond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ 1u); }
+static ASMJIT_INLINE_CONSTEXPR CondCode negate_cond(CondCode cond) noexcept { return CondCode(uint8_t(cond) ^ 1u); }
//! Instruction.
//!
@@ -203,24 +203,12 @@ namespace Inst {
kIdClwb, //!< Instruction 'clwb' {CLWB}.
kIdClzero, //!< Instruction 'clzero' {CLZERO}.
kIdCmc, //!< Instruction 'cmc'.
- kIdCmova, //!< Instruction 'cmova' {CMOV}.
- kIdCmovae, //!< Instruction 'cmovae' {CMOV}.
kIdCmovb, //!< Instruction 'cmovb' {CMOV}.
kIdCmovbe, //!< Instruction 'cmovbe' {CMOV}.
- kIdCmovc, //!< Instruction 'cmovc' {CMOV}.
- kIdCmove, //!< Instruction 'cmove' {CMOV}.
- kIdCmovg, //!< Instruction 'cmovg' {CMOV}.
- kIdCmovge, //!< Instruction 'cmovge' {CMOV}.
kIdCmovl, //!< Instruction 'cmovl' {CMOV}.
kIdCmovle, //!< Instruction 'cmovle' {CMOV}.
- kIdCmovna, //!< Instruction 'cmovna' {CMOV}.
- kIdCmovnae, //!< Instruction 'cmovnae' {CMOV}.
kIdCmovnb, //!< Instruction 'cmovnb' {CMOV}.
kIdCmovnbe, //!< Instruction 'cmovnbe' {CMOV}.
- kIdCmovnc, //!< Instruction 'cmovnc' {CMOV}.
- kIdCmovne, //!< Instruction 'cmovne' {CMOV}.
- kIdCmovng, //!< Instruction 'cmovng' {CMOV}.
- kIdCmovnge, //!< Instruction 'cmovnge' {CMOV}.
kIdCmovnl, //!< Instruction 'cmovnl' {CMOV}.
kIdCmovnle, //!< Instruction 'cmovnle' {CMOV}.
kIdCmovno, //!< Instruction 'cmovno' {CMOV}.
@@ -229,8 +217,6 @@ namespace Inst {
kIdCmovnz, //!< Instruction 'cmovnz' {CMOV}.
kIdCmovo, //!< Instruction 'cmovo' {CMOV}.
kIdCmovp, //!< Instruction 'cmovp' {CMOV}.
- kIdCmovpe, //!< Instruction 'cmovpe' {CMOV}.
- kIdCmovpo, //!< Instruction 'cmovpo' {CMOV}.
kIdCmovs, //!< Instruction 'cmovs' {CMOV}.
kIdCmovz, //!< Instruction 'cmovz' {CMOV}.
kIdCmp, //!< Instruction 'cmp'.
@@ -435,26 +421,14 @@ namespace Inst {
kIdIret, //!< Instruction 'iret'.
kIdIretd, //!< Instruction 'iretd'.
kIdIretq, //!< Instruction 'iretq' (X64).
- kIdJa, //!< Instruction 'ja'.
- kIdJae, //!< Instruction 'jae'.
kIdJb, //!< Instruction 'jb'.
kIdJbe, //!< Instruction 'jbe'.
- kIdJc, //!< Instruction 'jc'.
- kIdJe, //!< Instruction 'je'.
kIdJecxz, //!< Instruction 'jecxz'.
- kIdJg, //!< Instruction 'jg'.
- kIdJge, //!< Instruction 'jge'.
kIdJl, //!< Instruction 'jl'.
kIdJle, //!< Instruction 'jle'.
kIdJmp, //!< Instruction 'jmp'.
- kIdJna, //!< Instruction 'jna'.
- kIdJnae, //!< Instruction 'jnae'.
kIdJnb, //!< Instruction 'jnb'.
kIdJnbe, //!< Instruction 'jnbe'.
- kIdJnc, //!< Instruction 'jnc'.
- kIdJne, //!< Instruction 'jne'.
- kIdJng, //!< Instruction 'jng'.
- kIdJnge, //!< Instruction 'jnge'.
kIdJnl, //!< Instruction 'jnl'.
kIdJnle, //!< Instruction 'jnle'.
kIdJno, //!< Instruction 'jno'.
@@ -463,8 +437,6 @@ namespace Inst {
kIdJnz, //!< Instruction 'jnz'.
kIdJo, //!< Instruction 'jo'.
kIdJp, //!< Instruction 'jp'.
- kIdJpe, //!< Instruction 'jpe'.
- kIdJpo, //!< Instruction 'jpo'.
kIdJs, //!< Instruction 'js'.
kIdJz, //!< Instruction 'jz'.
kIdKaddb, //!< Instruction 'kaddb' {AVX512_DQ}.
@@ -793,6 +765,7 @@ namespace Inst {
kIdPushf, //!< Instruction 'pushf'.
kIdPushfd, //!< Instruction 'pushfd' (X86).
kIdPushfq, //!< Instruction 'pushfq' (X64).
+ kIdPushw, //!< Instruction 'pushw'.
kIdPvalidate, //!< Instruction 'pvalidate' {SEV_SNP}.
kIdPxor, //!< Instruction 'pxor' {MMX|SSE2}.
kIdRcl, //!< Instruction 'rcl'.
@@ -801,7 +774,7 @@ namespace Inst {
kIdRcr, //!< Instruction 'rcr'.
kIdRdfsbase, //!< Instruction 'rdfsbase' {FSGSBASE} (X64).
kIdRdgsbase, //!< Instruction 'rdgsbase' {FSGSBASE} (X64).
- kIdRdmsr, //!< Instruction 'rdmsr' {MSR}.
+ kIdRdmsr, //!< Instruction 'rdmsr' {MSR|MSR_IMM}.
kIdRdpid, //!< Instruction 'rdpid' {RDPID}.
kIdRdpkru, //!< Instruction 'rdpkru' {OSPKE}.
kIdRdpmc, //!< Instruction 'rdpmc'.
@@ -828,7 +801,6 @@ namespace Inst {
kIdRsqrtss, //!< Instruction 'rsqrtss' {SSE}.
kIdRstorssp, //!< Instruction 'rstorssp' {CET_SS}.
kIdSahf, //!< Instruction 'sahf' {LAHFSAHF}.
- kIdSal, //!< Instruction 'sal'.
kIdSar, //!< Instruction 'sar'.
kIdSarx, //!< Instruction 'sarx' {BMI2}.
kIdSaveprevssp, //!< Instruction 'saveprevssp' {CET_SS}.
@@ -839,24 +811,12 @@ namespace Inst {
kIdSeamret, //!< Instruction 'seamret' {SEAM}.
kIdSenduipi, //!< Instruction 'senduipi' {UINTR} (X64).
kIdSerialize, //!< Instruction 'serialize' {SERIALIZE}.
- kIdSeta, //!< Instruction 'seta'.
- kIdSetae, //!< Instruction 'setae'.
kIdSetb, //!< Instruction 'setb'.
kIdSetbe, //!< Instruction 'setbe'.
- kIdSetc, //!< Instruction 'setc'.
- kIdSete, //!< Instruction 'sete'.
- kIdSetg, //!< Instruction 'setg'.
- kIdSetge, //!< Instruction 'setge'.
kIdSetl, //!< Instruction 'setl'.
kIdSetle, //!< Instruction 'setle'.
- kIdSetna, //!< Instruction 'setna'.
- kIdSetnae, //!< Instruction 'setnae'.
kIdSetnb, //!< Instruction 'setnb'.
kIdSetnbe, //!< Instruction 'setnbe'.
- kIdSetnc, //!< Instruction 'setnc'.
- kIdSetne, //!< Instruction 'setne'.
- kIdSetng, //!< Instruction 'setng'.
- kIdSetnge, //!< Instruction 'setnge'.
kIdSetnl, //!< Instruction 'setnl'.
kIdSetnle, //!< Instruction 'setnle'.
kIdSetno, //!< Instruction 'setno'.
@@ -865,8 +825,6 @@ namespace Inst {
kIdSetnz, //!< Instruction 'setnz'.
kIdSeto, //!< Instruction 'seto'.
kIdSetp, //!< Instruction 'setp'.
- kIdSetpe, //!< Instruction 'setpe'.
- kIdSetpo, //!< Instruction 'setpo'.
kIdSets, //!< Instruction 'sets'.
kIdSetssbsy, //!< Instruction 'setssbsy' {CET_SS}.
kIdSetz, //!< Instruction 'setz'.
@@ -951,16 +909,12 @@ namespace Inst {
kIdUnpckhps, //!< Instruction 'unpckhps' {SSE}.
kIdUnpcklpd, //!< Instruction 'unpcklpd' {SSE2}.
kIdUnpcklps, //!< Instruction 'unpcklps' {SSE}.
- kIdV4fmaddps, //!< Instruction 'v4fmaddps' {AVX512_4FMAPS}.
- kIdV4fmaddss, //!< Instruction 'v4fmaddss' {AVX512_4FMAPS}.
- kIdV4fnmaddps, //!< Instruction 'v4fnmaddps' {AVX512_4FMAPS}.
- kIdV4fnmaddss, //!< Instruction 'v4fnmaddss' {AVX512_4FMAPS}.
kIdVaddpd, //!< Instruction 'vaddpd' {AVX|AVX512_F+VL}.
kIdVaddph, //!< Instruction 'vaddph' {AVX512_FP16+VL}.
kIdVaddps, //!< Instruction 'vaddps' {AVX|AVX512_F+VL}.
- kIdVaddsd, //!< Instruction 'vaddsd' {AVX|AVX512_F}.
- kIdVaddsh, //!< Instruction 'vaddsh' {AVX512_FP16}.
- kIdVaddss, //!< Instruction 'vaddss' {AVX|AVX512_F}.
+ kIdVaddsd, //!< Instruction 'vaddsd' {AVX|AVX512_F+VL}.
+ kIdVaddsh, //!< Instruction 'vaddsh' {AVX512_FP16+VL}.
+ kIdVaddss, //!< Instruction 'vaddss' {AVX|AVX512_F+VL}.
kIdVaddsubpd, //!< Instruction 'vaddsubpd' {AVX}.
kIdVaddsubps, //!< Instruction 'vaddsubps' {AVX}.
kIdVaesdec, //!< Instruction 'vaesdec' {AVX|AVX512_F+VL & AESNI|VAES}.
@@ -985,27 +939,27 @@ namespace Inst {
kIdVblendvps, //!< Instruction 'vblendvps' {AVX}.
kIdVbroadcastf128, //!< Instruction 'vbroadcastf128' {AVX}.
kIdVbroadcastf32x2, //!< Instruction 'vbroadcastf32x2' {AVX512_DQ+VL}.
- kIdVbroadcastf32x4, //!< Instruction 'vbroadcastf32x4' {AVX512_F}.
- kIdVbroadcastf32x8, //!< Instruction 'vbroadcastf32x8' {AVX512_DQ}.
+ kIdVbroadcastf32x4, //!< Instruction 'vbroadcastf32x4' {AVX512_F+VL}.
+ kIdVbroadcastf32x8, //!< Instruction 'vbroadcastf32x8' {AVX512_DQ+VL}.
kIdVbroadcastf64x2, //!< Instruction 'vbroadcastf64x2' {AVX512_DQ+VL}.
- kIdVbroadcastf64x4, //!< Instruction 'vbroadcastf64x4' {AVX512_F}.
+ kIdVbroadcastf64x4, //!< Instruction 'vbroadcastf64x4' {AVX512_F+VL}.
kIdVbroadcasti128, //!< Instruction 'vbroadcasti128' {AVX2}.
kIdVbroadcasti32x2, //!< Instruction 'vbroadcasti32x2' {AVX512_DQ+VL}.
kIdVbroadcasti32x4, //!< Instruction 'vbroadcasti32x4' {AVX512_F+VL}.
- kIdVbroadcasti32x8, //!< Instruction 'vbroadcasti32x8' {AVX512_DQ}.
+ kIdVbroadcasti32x8, //!< Instruction 'vbroadcasti32x8' {AVX512_DQ+VL}.
kIdVbroadcasti64x2, //!< Instruction 'vbroadcasti64x2' {AVX512_DQ+VL}.
- kIdVbroadcasti64x4, //!< Instruction 'vbroadcasti64x4' {AVX512_F}.
+ kIdVbroadcasti64x4, //!< Instruction 'vbroadcasti64x4' {AVX512_F+VL}.
kIdVbroadcastsd, //!< Instruction 'vbroadcastsd' {AVX|AVX2|AVX512_F+VL}.
kIdVbroadcastss, //!< Instruction 'vbroadcastss' {AVX|AVX2|AVX512_F+VL}.
kIdVcmppd, //!< Instruction 'vcmppd' {AVX|AVX512_F+VL}.
kIdVcmpph, //!< Instruction 'vcmpph' {AVX512_FP16+VL}.
kIdVcmpps, //!< Instruction 'vcmpps' {AVX|AVX512_F+VL}.
- kIdVcmpsd, //!< Instruction 'vcmpsd' {AVX|AVX512_F}.
- kIdVcmpsh, //!< Instruction 'vcmpsh' {AVX512_FP16}.
- kIdVcmpss, //!< Instruction 'vcmpss' {AVX|AVX512_F}.
- kIdVcomisd, //!< Instruction 'vcomisd' {AVX|AVX512_F}.
- kIdVcomish, //!< Instruction 'vcomish' {AVX512_FP16}.
- kIdVcomiss, //!< Instruction 'vcomiss' {AVX|AVX512_F}.
+ kIdVcmpsd, //!< Instruction 'vcmpsd' {AVX|AVX512_F+VL}.
+ kIdVcmpsh, //!< Instruction 'vcmpsh' {AVX512_FP16+VL}.
+ kIdVcmpss, //!< Instruction 'vcmpss' {AVX|AVX512_F+VL}.
+ kIdVcomisd, //!< Instruction 'vcomisd' {AVX|AVX512_F+VL}.
+ kIdVcomish, //!< Instruction 'vcomish' {AVX512_FP16+VL}.
+ kIdVcomiss, //!< Instruction 'vcomiss' {AVX|AVX512_F+VL}.
kIdVcompresspd, //!< Instruction 'vcompresspd' {AVX512_F+VL}.
kIdVcompressps, //!< Instruction 'vcompressps' {AVX512_F+VL}.
kIdVcvtdq2pd, //!< Instruction 'vcvtdq2pd' {AVX|AVX512_F+VL}.
@@ -1042,21 +996,21 @@ namespace Inst {
kIdVcvtqq2pd, //!< Instruction 'vcvtqq2pd' {AVX512_DQ+VL}.
kIdVcvtqq2ph, //!< Instruction 'vcvtqq2ph' {AVX512_FP16+VL}.
kIdVcvtqq2ps, //!< Instruction 'vcvtqq2ps' {AVX512_DQ+VL}.
- kIdVcvtsd2sh, //!< Instruction 'vcvtsd2sh' {AVX512_FP16}.
- kIdVcvtsd2si, //!< Instruction 'vcvtsd2si' {AVX|AVX512_F}.
- kIdVcvtsd2ss, //!< Instruction 'vcvtsd2ss' {AVX|AVX512_F}.
- kIdVcvtsd2usi, //!< Instruction 'vcvtsd2usi' {AVX512_F}.
- kIdVcvtsh2sd, //!< Instruction 'vcvtsh2sd' {AVX512_FP16}.
- kIdVcvtsh2si, //!< Instruction 'vcvtsh2si' {AVX512_FP16}.
- kIdVcvtsh2ss, //!< Instruction 'vcvtsh2ss' {AVX512_FP16}.
- kIdVcvtsh2usi, //!< Instruction 'vcvtsh2usi' {AVX512_FP16}.
- kIdVcvtsi2sd, //!< Instruction 'vcvtsi2sd' {AVX|AVX512_F}.
- kIdVcvtsi2sh, //!< Instruction 'vcvtsi2sh' {AVX512_FP16}.
- kIdVcvtsi2ss, //!< Instruction 'vcvtsi2ss' {AVX|AVX512_F}.
- kIdVcvtss2sd, //!< Instruction 'vcvtss2sd' {AVX|AVX512_F}.
- kIdVcvtss2sh, //!< Instruction 'vcvtss2sh' {AVX512_FP16}.
- kIdVcvtss2si, //!< Instruction 'vcvtss2si' {AVX|AVX512_F}.
- kIdVcvtss2usi, //!< Instruction 'vcvtss2usi' {AVX512_F}.
+ kIdVcvtsd2sh, //!< Instruction 'vcvtsd2sh' {AVX512_FP16+VL}.
+ kIdVcvtsd2si, //!< Instruction 'vcvtsd2si' {AVX|AVX512_F+VL}.
+ kIdVcvtsd2ss, //!< Instruction 'vcvtsd2ss' {AVX|AVX512_F+VL}.
+ kIdVcvtsd2usi, //!< Instruction 'vcvtsd2usi' {AVX512_F+VL}.
+ kIdVcvtsh2sd, //!< Instruction 'vcvtsh2sd' {AVX512_FP16+VL}.
+ kIdVcvtsh2si, //!< Instruction 'vcvtsh2si' {AVX512_FP16+VL}.
+ kIdVcvtsh2ss, //!< Instruction 'vcvtsh2ss' {AVX512_FP16+VL}.
+ kIdVcvtsh2usi, //!< Instruction 'vcvtsh2usi' {AVX512_FP16+VL}.
+ kIdVcvtsi2sd, //!< Instruction 'vcvtsi2sd' {AVX|AVX512_F+VL}.
+ kIdVcvtsi2sh, //!< Instruction 'vcvtsi2sh' {AVX512_FP16+VL}.
+ kIdVcvtsi2ss, //!< Instruction 'vcvtsi2ss' {AVX|AVX512_F+VL}.
+ kIdVcvtss2sd, //!< Instruction 'vcvtss2sd' {AVX|AVX512_F+VL}.
+ kIdVcvtss2sh, //!< Instruction 'vcvtss2sh' {AVX512_FP16+VL}.
+ kIdVcvtss2si, //!< Instruction 'vcvtss2si' {AVX|AVX512_F+VL}.
+ kIdVcvtss2usi, //!< Instruction 'vcvtss2usi' {AVX512_F+VL}.
kIdVcvttpd2dq, //!< Instruction 'vcvttpd2dq' {AVX|AVX512_F+VL}.
kIdVcvttpd2qq, //!< Instruction 'vcvttpd2qq' {AVX512_F+VL}.
kIdVcvttpd2udq, //!< Instruction 'vcvttpd2udq' {AVX512_F+VL}.
@@ -1071,78 +1025,76 @@ namespace Inst {
kIdVcvttps2qq, //!< Instruction 'vcvttps2qq' {AVX512_DQ+VL}.
kIdVcvttps2udq, //!< Instruction 'vcvttps2udq' {AVX512_F+VL}.
kIdVcvttps2uqq, //!< Instruction 'vcvttps2uqq' {AVX512_DQ+VL}.
- kIdVcvttsd2si, //!< Instruction 'vcvttsd2si' {AVX|AVX512_F}.
- kIdVcvttsd2usi, //!< Instruction 'vcvttsd2usi' {AVX512_F}.
- kIdVcvttsh2si, //!< Instruction 'vcvttsh2si' {AVX512_FP16}.
- kIdVcvttsh2usi, //!< Instruction 'vcvttsh2usi' {AVX512_FP16}.
- kIdVcvttss2si, //!< Instruction 'vcvttss2si' {AVX|AVX512_F}.
- kIdVcvttss2usi, //!< Instruction 'vcvttss2usi' {AVX512_F}.
+ kIdVcvttsd2si, //!< Instruction 'vcvttsd2si' {AVX|AVX512_F+VL}.
+ kIdVcvttsd2usi, //!< Instruction 'vcvttsd2usi' {AVX512_F+VL}.
+ kIdVcvttsh2si, //!< Instruction 'vcvttsh2si' {AVX512_FP16+VL}.
+ kIdVcvttsh2usi, //!< Instruction 'vcvttsh2usi' {AVX512_FP16+VL}.
+ kIdVcvttss2si, //!< Instruction 'vcvttss2si' {AVX|AVX512_F+VL}.
+ kIdVcvttss2usi, //!< Instruction 'vcvttss2usi' {AVX512_F+VL}.
kIdVcvtudq2pd, //!< Instruction 'vcvtudq2pd' {AVX512_F+VL}.
kIdVcvtudq2ph, //!< Instruction 'vcvtudq2ph' {AVX512_FP16+VL}.
kIdVcvtudq2ps, //!< Instruction 'vcvtudq2ps' {AVX512_F+VL}.
kIdVcvtuqq2pd, //!< Instruction 'vcvtuqq2pd' {AVX512_DQ+VL}.
kIdVcvtuqq2ph, //!< Instruction 'vcvtuqq2ph' {AVX512_FP16+VL}.
kIdVcvtuqq2ps, //!< Instruction 'vcvtuqq2ps' {AVX512_DQ+VL}.
- kIdVcvtusi2sd, //!< Instruction 'vcvtusi2sd' {AVX512_F}.
- kIdVcvtusi2sh, //!< Instruction 'vcvtusi2sh' {AVX512_FP16}.
- kIdVcvtusi2ss, //!< Instruction 'vcvtusi2ss' {AVX512_F}.
+ kIdVcvtusi2sd, //!< Instruction 'vcvtusi2sd' {AVX512_F+VL}.
+ kIdVcvtusi2sh, //!< Instruction 'vcvtusi2sh' {AVX512_FP16+VL}.
+ kIdVcvtusi2ss, //!< Instruction 'vcvtusi2ss' {AVX512_F+VL}.
kIdVcvtuw2ph, //!< Instruction 'vcvtuw2ph' {AVX512_FP16+VL}.
kIdVcvtw2ph, //!< Instruction 'vcvtw2ph' {AVX512_FP16+VL}.
kIdVdbpsadbw, //!< Instruction 'vdbpsadbw' {AVX512_BW+VL}.
kIdVdivpd, //!< Instruction 'vdivpd' {AVX|AVX512_F+VL}.
kIdVdivph, //!< Instruction 'vdivph' {AVX512_FP16+VL}.
kIdVdivps, //!< Instruction 'vdivps' {AVX|AVX512_F+VL}.
- kIdVdivsd, //!< Instruction 'vdivsd' {AVX|AVX512_F}.
- kIdVdivsh, //!< Instruction 'vdivsh' {AVX512_FP16}.
- kIdVdivss, //!< Instruction 'vdivss' {AVX|AVX512_F}.
+ kIdVdivsd, //!< Instruction 'vdivsd' {AVX|AVX512_F+VL}.
+ kIdVdivsh, //!< Instruction 'vdivsh' {AVX512_FP16+VL}.
+ kIdVdivss, //!< Instruction 'vdivss' {AVX|AVX512_F+VL}.
kIdVdpbf16ps, //!< Instruction 'vdpbf16ps' {AVX512_BF16+VL}.
kIdVdppd, //!< Instruction 'vdppd' {AVX}.
kIdVdpps, //!< Instruction 'vdpps' {AVX}.
kIdVerr, //!< Instruction 'verr'.
kIdVerw, //!< Instruction 'verw'.
- kIdVexp2pd, //!< Instruction 'vexp2pd' {AVX512_ER}.
- kIdVexp2ps, //!< Instruction 'vexp2ps' {AVX512_ER}.
kIdVexpandpd, //!< Instruction 'vexpandpd' {AVX512_F+VL}.
kIdVexpandps, //!< Instruction 'vexpandps' {AVX512_F+VL}.
kIdVextractf128, //!< Instruction 'vextractf128' {AVX}.
kIdVextractf32x4, //!< Instruction 'vextractf32x4' {AVX512_F+VL}.
- kIdVextractf32x8, //!< Instruction 'vextractf32x8' {AVX512_DQ}.
+ kIdVextractf32x8, //!< Instruction 'vextractf32x8' {AVX512_DQ+VL}.
kIdVextractf64x2, //!< Instruction 'vextractf64x2' {AVX512_DQ+VL}.
- kIdVextractf64x4, //!< Instruction 'vextractf64x4' {AVX512_F}.
+ kIdVextractf64x4, //!< Instruction 'vextractf64x4' {AVX512_F+VL}.
kIdVextracti128, //!< Instruction 'vextracti128' {AVX2}.
kIdVextracti32x4, //!< Instruction 'vextracti32x4' {AVX512_F+VL}.
- kIdVextracti32x8, //!< Instruction 'vextracti32x8' {AVX512_DQ}.
+ kIdVextracti32x8, //!< Instruction 'vextracti32x8' {AVX512_DQ+VL}.
kIdVextracti64x2, //!< Instruction 'vextracti64x2' {AVX512_DQ+VL}.
- kIdVextracti64x4, //!< Instruction 'vextracti64x4' {AVX512_F}.
- kIdVextractps, //!< Instruction 'vextractps' {AVX|AVX512_F}.
+ kIdVextracti64x4, //!< Instruction 'vextracti64x4' {AVX512_F+VL}.
+ kIdVextractps, //!< Instruction 'vextractps' {AVX|AVX512_F+VL}.
kIdVfcmaddcph, //!< Instruction 'vfcmaddcph' {AVX512_FP16+VL}.
- kIdVfcmaddcsh, //!< Instruction 'vfcmaddcsh' {AVX512_FP16}.
+ kIdVfcmaddcsh, //!< Instruction 'vfcmaddcsh' {AVX512_FP16+VL}.
kIdVfcmulcph, //!< Instruction 'vfcmulcph' {AVX512_FP16+VL}.
- kIdVfcmulcsh, //!< Instruction 'vfcmulcsh' {AVX512_FP16}.
+ kIdVfcmulcsh, //!< Instruction 'vfcmulcsh' {AVX512_FP16+VL}.
kIdVfixupimmpd, //!< Instruction 'vfixupimmpd' {AVX512_F+VL}.
kIdVfixupimmps, //!< Instruction 'vfixupimmps' {AVX512_F+VL}.
- kIdVfixupimmsd, //!< Instruction 'vfixupimmsd' {AVX512_F}.
- kIdVfixupimmss, //!< Instruction 'vfixupimmss' {AVX512_F}.
+ kIdVfixupimmsd, //!< Instruction 'vfixupimmsd' {AVX512_F+VL}.
+ kIdVfixupimmss, //!< Instruction 'vfixupimmss' {AVX512_F+VL}.
kIdVfmadd132pd, //!< Instruction 'vfmadd132pd' {FMA|AVX512_F+VL}.
kIdVfmadd132ph, //!< Instruction 'vfmadd132ph' {AVX512_FP16+VL}.
kIdVfmadd132ps, //!< Instruction 'vfmadd132ps' {FMA|AVX512_F+VL}.
- kIdVfmadd132sd, //!< Instruction 'vfmadd132sd' {FMA|AVX512_F}.
- kIdVfmadd132sh, //!< Instruction 'vfmadd132sh' {AVX512_FP16}.
- kIdVfmadd132ss, //!< Instruction 'vfmadd132ss' {FMA|AVX512_F}.
+ kIdVfmadd132sd, //!< Instruction 'vfmadd132sd' {FMA|AVX512_F+VL}.
+ kIdVfmadd132sh, //!< Instruction 'vfmadd132sh' {AVX512_FP16+VL}.
+ kIdVfmadd132ss, //!< Instruction 'vfmadd132ss' {FMA|AVX512_F+VL}.
kIdVfmadd213pd, //!< Instruction 'vfmadd213pd' {FMA|AVX512_F+VL}.
kIdVfmadd213ph, //!< Instruction 'vfmadd213ph' {AVX512_FP16+VL}.
kIdVfmadd213ps, //!< Instruction 'vfmadd213ps' {FMA|AVX512_F+VL}.
- kIdVfmadd213sd, //!< Instruction 'vfmadd213sd' {FMA|AVX512_F}.
- kIdVfmadd213sh, //!< Instruction 'vfmadd213sh' {AVX512_FP16}.
- kIdVfmadd213ss, //!< Instruction 'vfmadd213ss' {FMA|AVX512_F}.
+ kIdVfmadd213sd, //!< Instruction 'vfmadd213sd' {FMA|AVX512_F+VL}.
+ kIdVfmadd213sh, //!< Instruction 'vfmadd213sh' {AVX512_FP16+VL}.
+ kIdVfmadd213ss, //!< Instruction 'vfmadd213ss' {FMA|AVX512_F+VL}.
kIdVfmadd231pd, //!< Instruction 'vfmadd231pd' {FMA|AVX512_F+VL}.
kIdVfmadd231ph, //!< Instruction 'vfmadd231ph' {AVX512_FP16+VL}.
kIdVfmadd231ps, //!< Instruction 'vfmadd231ps' {FMA|AVX512_F+VL}.
- kIdVfmadd231sd, //!< Instruction 'vfmadd231sd' {FMA|AVX512_F}.
- kIdVfmadd231sh, //!< Instruction 'vfmadd231sh' {AVX512_FP16}.
- kIdVfmadd231ss, //!< Instruction 'vfmadd231ss' {FMA|AVX512_F}.
+ kIdVfmadd231sd, //!< Instruction 'vfmadd231sd' {FMA|AVX512_F+VL}.
+ kIdVfmadd231sh, //!< Instruction 'vfmadd231sh' {AVX512_FP16+VL}.
+ kIdVfmadd231ss, //!< Instruction 'vfmadd231ss' {FMA|AVX512_F+VL}.
kIdVfmaddcph, //!< Instruction 'vfmaddcph' {AVX512_FP16+VL}.
- kIdVfmaddcsh, //!< Instruction 'vfmaddcsh' {AVX512_FP16}.
+ kIdVfmaddcsh, //!< Instruction 'vfmaddcsh' {AVX512_FP16+VL}.
kIdVfmaddpd, //!< Instruction 'vfmaddpd' {FMA4}.
kIdVfmaddps, //!< Instruction 'vfmaddps' {FMA4}.
kIdVfmaddsd, //!< Instruction 'vfmaddsd' {FMA4}.
@@ -1161,21 +1113,21 @@ namespace Inst {
kIdVfmsub132pd, //!< Instruction 'vfmsub132pd' {FMA|AVX512_F+VL}.
kIdVfmsub132ph, //!< Instruction 'vfmsub132ph' {AVX512_FP16+VL}.
kIdVfmsub132ps, //!< Instruction 'vfmsub132ps' {FMA|AVX512_F+VL}.
- kIdVfmsub132sd, //!< Instruction 'vfmsub132sd' {FMA|AVX512_F}.
- kIdVfmsub132sh, //!< Instruction 'vfmsub132sh' {AVX512_FP16}.
- kIdVfmsub132ss, //!< Instruction 'vfmsub132ss' {FMA|AVX512_F}.
+ kIdVfmsub132sd, //!< Instruction 'vfmsub132sd' {FMA|AVX512_F+VL}.
+ kIdVfmsub132sh, //!< Instruction 'vfmsub132sh' {AVX512_FP16+VL}.
+ kIdVfmsub132ss, //!< Instruction 'vfmsub132ss' {FMA|AVX512_F+VL}.
kIdVfmsub213pd, //!< Instruction 'vfmsub213pd' {FMA|AVX512_F+VL}.
kIdVfmsub213ph, //!< Instruction 'vfmsub213ph' {AVX512_FP16+VL}.
kIdVfmsub213ps, //!< Instruction 'vfmsub213ps' {FMA|AVX512_F+VL}.
- kIdVfmsub213sd, //!< Instruction 'vfmsub213sd' {FMA|AVX512_F}.
- kIdVfmsub213sh, //!< Instruction 'vfmsub213sh' {AVX512_FP16}.
- kIdVfmsub213ss, //!< Instruction 'vfmsub213ss' {FMA|AVX512_F}.
+ kIdVfmsub213sd, //!< Instruction 'vfmsub213sd' {FMA|AVX512_F+VL}.
+ kIdVfmsub213sh, //!< Instruction 'vfmsub213sh' {AVX512_FP16+VL}.
+ kIdVfmsub213ss, //!< Instruction 'vfmsub213ss' {FMA|AVX512_F+VL}.
kIdVfmsub231pd, //!< Instruction 'vfmsub231pd' {FMA|AVX512_F+VL}.
kIdVfmsub231ph, //!< Instruction 'vfmsub231ph' {AVX512_FP16+VL}.
kIdVfmsub231ps, //!< Instruction 'vfmsub231ps' {FMA|AVX512_F+VL}.
- kIdVfmsub231sd, //!< Instruction 'vfmsub231sd' {FMA|AVX512_F}.
- kIdVfmsub231sh, //!< Instruction 'vfmsub231sh' {AVX512_FP16}.
- kIdVfmsub231ss, //!< Instruction 'vfmsub231ss' {FMA|AVX512_F}.
+ kIdVfmsub231sd, //!< Instruction 'vfmsub231sd' {FMA|AVX512_F+VL}.
+ kIdVfmsub231sh, //!< Instruction 'vfmsub231sh' {AVX512_FP16+VL}.
+ kIdVfmsub231ss, //!< Instruction 'vfmsub231ss' {FMA|AVX512_F+VL}.
kIdVfmsubadd132pd, //!< Instruction 'vfmsubadd132pd' {FMA|AVX512_F+VL}.
kIdVfmsubadd132ph, //!< Instruction 'vfmsubadd132ph' {AVX512_FP16+VL}.
kIdVfmsubadd132ps, //!< Instruction 'vfmsubadd132ps' {FMA|AVX512_F+VL}.
@@ -1196,21 +1148,21 @@ namespace Inst {
kIdVfnmadd132pd, //!< Instruction 'vfnmadd132pd' {FMA|AVX512_F+VL}.
kIdVfnmadd132ph, //!< Instruction 'vfnmadd132ph' {AVX512_FP16+VL}.
kIdVfnmadd132ps, //!< Instruction 'vfnmadd132ps' {FMA|AVX512_F+VL}.
- kIdVfnmadd132sd, //!< Instruction 'vfnmadd132sd' {FMA|AVX512_F}.
- kIdVfnmadd132sh, //!< Instruction 'vfnmadd132sh' {AVX512_FP16}.
- kIdVfnmadd132ss, //!< Instruction 'vfnmadd132ss' {FMA|AVX512_F}.
+ kIdVfnmadd132sd, //!< Instruction 'vfnmadd132sd' {FMA|AVX512_F+VL}.
+ kIdVfnmadd132sh, //!< Instruction 'vfnmadd132sh' {AVX512_FP16+VL}.
+ kIdVfnmadd132ss, //!< Instruction 'vfnmadd132ss' {FMA|AVX512_F+VL}.
kIdVfnmadd213pd, //!< Instruction 'vfnmadd213pd' {FMA|AVX512_F+VL}.
kIdVfnmadd213ph, //!< Instruction 'vfnmadd213ph' {AVX512_FP16+VL}.
kIdVfnmadd213ps, //!< Instruction 'vfnmadd213ps' {FMA|AVX512_F+VL}.
- kIdVfnmadd213sd, //!< Instruction 'vfnmadd213sd' {FMA|AVX512_F}.
- kIdVfnmadd213sh, //!< Instruction 'vfnmadd213sh' {AVX512_FP16}.
- kIdVfnmadd213ss, //!< Instruction 'vfnmadd213ss' {FMA|AVX512_F}.
+ kIdVfnmadd213sd, //!< Instruction 'vfnmadd213sd' {FMA|AVX512_F+VL}.
+ kIdVfnmadd213sh, //!< Instruction 'vfnmadd213sh' {AVX512_FP16+VL}.
+ kIdVfnmadd213ss, //!< Instruction 'vfnmadd213ss' {FMA|AVX512_F+VL}.
kIdVfnmadd231pd, //!< Instruction 'vfnmadd231pd' {FMA|AVX512_F+VL}.
kIdVfnmadd231ph, //!< Instruction 'vfnmadd231ph' {AVX512_FP16+VL}.
kIdVfnmadd231ps, //!< Instruction 'vfnmadd231ps' {FMA|AVX512_F+VL}.
- kIdVfnmadd231sd, //!< Instruction 'vfnmadd231sd' {FMA|AVX512_F}.
- kIdVfnmadd231sh, //!< Instruction 'vfnmadd231sh' {AVX512_FP16}.
- kIdVfnmadd231ss, //!< Instruction 'vfnmadd231ss' {FMA|AVX512_F}.
+ kIdVfnmadd231sd, //!< Instruction 'vfnmadd231sd' {FMA|AVX512_F+VL}.
+ kIdVfnmadd231sh, //!< Instruction 'vfnmadd231sh' {AVX512_FP16+VL}.
+ kIdVfnmadd231ss, //!< Instruction 'vfnmadd231ss' {FMA|AVX512_F+VL}.
kIdVfnmaddpd, //!< Instruction 'vfnmaddpd' {FMA4}.
kIdVfnmaddps, //!< Instruction 'vfnmaddps' {FMA4}.
kIdVfnmaddsd, //!< Instruction 'vfnmaddsd' {FMA4}.
@@ -1218,21 +1170,21 @@ namespace Inst {
kIdVfnmsub132pd, //!< Instruction 'vfnmsub132pd' {FMA|AVX512_F+VL}.
kIdVfnmsub132ph, //!< Instruction 'vfnmsub132ph' {AVX512_FP16+VL}.
kIdVfnmsub132ps, //!< Instruction 'vfnmsub132ps' {FMA|AVX512_F+VL}.
- kIdVfnmsub132sd, //!< Instruction 'vfnmsub132sd' {FMA|AVX512_F}.
- kIdVfnmsub132sh, //!< Instruction 'vfnmsub132sh' {AVX512_FP16}.
- kIdVfnmsub132ss, //!< Instruction 'vfnmsub132ss' {FMA|AVX512_F}.
+ kIdVfnmsub132sd, //!< Instruction 'vfnmsub132sd' {FMA|AVX512_F+VL}.
+ kIdVfnmsub132sh, //!< Instruction 'vfnmsub132sh' {AVX512_FP16+VL}.
+ kIdVfnmsub132ss, //!< Instruction 'vfnmsub132ss' {FMA|AVX512_F+VL}.
kIdVfnmsub213pd, //!< Instruction 'vfnmsub213pd' {FMA|AVX512_F+VL}.
kIdVfnmsub213ph, //!< Instruction 'vfnmsub213ph' {AVX512_FP16+VL}.
kIdVfnmsub213ps, //!< Instruction 'vfnmsub213ps' {FMA|AVX512_F+VL}.
- kIdVfnmsub213sd, //!< Instruction 'vfnmsub213sd' {FMA|AVX512_F}.
- kIdVfnmsub213sh, //!< Instruction 'vfnmsub213sh' {AVX512_FP16}.
- kIdVfnmsub213ss, //!< Instruction 'vfnmsub213ss' {FMA|AVX512_F}.
+ kIdVfnmsub213sd, //!< Instruction 'vfnmsub213sd' {FMA|AVX512_F+VL}.
+ kIdVfnmsub213sh, //!< Instruction 'vfnmsub213sh' {AVX512_FP16+VL}.
+ kIdVfnmsub213ss, //!< Instruction 'vfnmsub213ss' {FMA|AVX512_F+VL}.
kIdVfnmsub231pd, //!< Instruction 'vfnmsub231pd' {FMA|AVX512_F+VL}.
kIdVfnmsub231ph, //!< Instruction 'vfnmsub231ph' {AVX512_FP16+VL}.
kIdVfnmsub231ps, //!< Instruction 'vfnmsub231ps' {FMA|AVX512_F+VL}.
- kIdVfnmsub231sd, //!< Instruction 'vfnmsub231sd' {FMA|AVX512_F}.
- kIdVfnmsub231sh, //!< Instruction 'vfnmsub231sh' {AVX512_FP16}.
- kIdVfnmsub231ss, //!< Instruction 'vfnmsub231ss' {FMA|AVX512_F}.
+ kIdVfnmsub231sd, //!< Instruction 'vfnmsub231sd' {FMA|AVX512_F+VL}.
+ kIdVfnmsub231sh, //!< Instruction 'vfnmsub231sh' {AVX512_FP16+VL}.
+ kIdVfnmsub231ss, //!< Instruction 'vfnmsub231ss' {FMA|AVX512_F+VL}.
kIdVfnmsubpd, //!< Instruction 'vfnmsubpd' {FMA4}.
kIdVfnmsubps, //!< Instruction 'vfnmsubps' {FMA4}.
kIdVfnmsubsd, //!< Instruction 'vfnmsubsd' {FMA4}.
@@ -1240,37 +1192,29 @@ namespace Inst {
kIdVfpclasspd, //!< Instruction 'vfpclasspd' {AVX512_DQ+VL}.
kIdVfpclassph, //!< Instruction 'vfpclassph' {AVX512_FP16+VL}.
kIdVfpclassps, //!< Instruction 'vfpclassps' {AVX512_DQ+VL}.
- kIdVfpclasssd, //!< Instruction 'vfpclasssd' {AVX512_DQ}.
- kIdVfpclasssh, //!< Instruction 'vfpclasssh' {AVX512_FP16}.
- kIdVfpclassss, //!< Instruction 'vfpclassss' {AVX512_DQ}.
+ kIdVfpclasssd, //!< Instruction 'vfpclasssd' {AVX512_DQ+VL}.
+ kIdVfpclasssh, //!< Instruction 'vfpclasssh' {AVX512_FP16+VL}.
+ kIdVfpclassss, //!< Instruction 'vfpclassss' {AVX512_DQ+VL}.
kIdVfrczpd, //!< Instruction 'vfrczpd' {XOP}.
kIdVfrczps, //!< Instruction 'vfrczps' {XOP}.
kIdVfrczsd, //!< Instruction 'vfrczsd' {XOP}.
kIdVfrczss, //!< Instruction 'vfrczss' {XOP}.
kIdVgatherdpd, //!< Instruction 'vgatherdpd' {AVX2|AVX512_F+VL}.
kIdVgatherdps, //!< Instruction 'vgatherdps' {AVX2|AVX512_F+VL}.
- kIdVgatherpf0dpd, //!< Instruction 'vgatherpf0dpd' {AVX512_PF}.
- kIdVgatherpf0dps, //!< Instruction 'vgatherpf0dps' {AVX512_PF}.
- kIdVgatherpf0qpd, //!< Instruction 'vgatherpf0qpd' {AVX512_PF}.
- kIdVgatherpf0qps, //!< Instruction 'vgatherpf0qps' {AVX512_PF}.
- kIdVgatherpf1dpd, //!< Instruction 'vgatherpf1dpd' {AVX512_PF}.
- kIdVgatherpf1dps, //!< Instruction 'vgatherpf1dps' {AVX512_PF}.
- kIdVgatherpf1qpd, //!< Instruction 'vgatherpf1qpd' {AVX512_PF}.
- kIdVgatherpf1qps, //!< Instruction 'vgatherpf1qps' {AVX512_PF}.
kIdVgatherqpd, //!< Instruction 'vgatherqpd' {AVX2|AVX512_F+VL}.
kIdVgatherqps, //!< Instruction 'vgatherqps' {AVX2|AVX512_F+VL}.
kIdVgetexppd, //!< Instruction 'vgetexppd' {AVX512_F+VL}.
kIdVgetexpph, //!< Instruction 'vgetexpph' {AVX512_FP16+VL}.
kIdVgetexpps, //!< Instruction 'vgetexpps' {AVX512_F+VL}.
- kIdVgetexpsd, //!< Instruction 'vgetexpsd' {AVX512_F}.
- kIdVgetexpsh, //!< Instruction 'vgetexpsh' {AVX512_FP16}.
- kIdVgetexpss, //!< Instruction 'vgetexpss' {AVX512_F}.
+ kIdVgetexpsd, //!< Instruction 'vgetexpsd' {AVX512_F+VL}.
+ kIdVgetexpsh, //!< Instruction 'vgetexpsh' {AVX512_FP16+VL}.
+ kIdVgetexpss, //!< Instruction 'vgetexpss' {AVX512_F+VL}.
kIdVgetmantpd, //!< Instruction 'vgetmantpd' {AVX512_F+VL}.
kIdVgetmantph, //!< Instruction 'vgetmantph' {AVX512_FP16+VL}.
kIdVgetmantps, //!< Instruction 'vgetmantps' {AVX512_F+VL}.
- kIdVgetmantsd, //!< Instruction 'vgetmantsd' {AVX512_F}.
- kIdVgetmantsh, //!< Instruction 'vgetmantsh' {AVX512_FP16}.
- kIdVgetmantss, //!< Instruction 'vgetmantss' {AVX512_F}.
+ kIdVgetmantsd, //!< Instruction 'vgetmantsd' {AVX512_F+VL}.
+ kIdVgetmantsh, //!< Instruction 'vgetmantsh' {AVX512_FP16+VL}.
+ kIdVgetmantss, //!< Instruction 'vgetmantss' {AVX512_F+VL}.
kIdVgf2p8affineinvqb, //!< Instruction 'vgf2p8affineinvqb' {AVX|AVX512_F+VL & GFNI}.
kIdVgf2p8affineqb, //!< Instruction 'vgf2p8affineqb' {AVX|AVX512_F+VL & GFNI}.
kIdVgf2p8mulb, //!< Instruction 'vgf2p8mulb' {AVX|AVX512_F+VL & GFNI}.
@@ -1280,15 +1224,15 @@ namespace Inst {
kIdVhsubps, //!< Instruction 'vhsubps' {AVX}.
kIdVinsertf128, //!< Instruction 'vinsertf128' {AVX}.
kIdVinsertf32x4, //!< Instruction 'vinsertf32x4' {AVX512_F+VL}.
- kIdVinsertf32x8, //!< Instruction 'vinsertf32x8' {AVX512_DQ}.
+ kIdVinsertf32x8, //!< Instruction 'vinsertf32x8' {AVX512_DQ+VL}.
kIdVinsertf64x2, //!< Instruction 'vinsertf64x2' {AVX512_DQ+VL}.
- kIdVinsertf64x4, //!< Instruction 'vinsertf64x4' {AVX512_F}.
+ kIdVinsertf64x4, //!< Instruction 'vinsertf64x4' {AVX512_F+VL}.
kIdVinserti128, //!< Instruction 'vinserti128' {AVX2}.
kIdVinserti32x4, //!< Instruction 'vinserti32x4' {AVX512_F+VL}.
- kIdVinserti32x8, //!< Instruction 'vinserti32x8' {AVX512_DQ}.
+ kIdVinserti32x8, //!< Instruction 'vinserti32x8' {AVX512_DQ+VL}.
kIdVinserti64x2, //!< Instruction 'vinserti64x2' {AVX512_DQ+VL}.
- kIdVinserti64x4, //!< Instruction 'vinserti64x4' {AVX512_F}.
- kIdVinsertps, //!< Instruction 'vinsertps' {AVX|AVX512_F}.
+ kIdVinserti64x4, //!< Instruction 'vinserti64x4' {AVX512_F+VL}.
+ kIdVinsertps, //!< Instruction 'vinsertps' {AVX|AVX512_F+VL}.
kIdVlddqu, //!< Instruction 'vlddqu' {AVX}.
kIdVldmxcsr, //!< Instruction 'vldmxcsr' {AVX}.
kIdVmaskmovdqu, //!< Instruction 'vmaskmovdqu' {AVX}.
@@ -1297,9 +1241,9 @@ namespace Inst {
kIdVmaxpd, //!< Instruction 'vmaxpd' {AVX|AVX512_F+VL}.
kIdVmaxph, //!< Instruction 'vmaxph' {AVX512_FP16+VL}.
kIdVmaxps, //!< Instruction 'vmaxps' {AVX|AVX512_F+VL}.
- kIdVmaxsd, //!< Instruction 'vmaxsd' {AVX|AVX512_F}.
- kIdVmaxsh, //!< Instruction 'vmaxsh' {AVX512_FP16}.
- kIdVmaxss, //!< Instruction 'vmaxss' {AVX|AVX512_F}.
+ kIdVmaxsd, //!< Instruction 'vmaxsd' {AVX|AVX512_F+VL}.
+ kIdVmaxsh, //!< Instruction 'vmaxsh' {AVX512_FP16+VL}.
+ kIdVmaxss, //!< Instruction 'vmaxss' {AVX|AVX512_F+VL}.
kIdVmcall, //!< Instruction 'vmcall' {VMX}.
kIdVmclear, //!< Instruction 'vmclear' {VMX}.
kIdVmfunc, //!< Instruction 'vmfunc' {VMX}.
@@ -1307,15 +1251,15 @@ namespace Inst {
kIdVminpd, //!< Instruction 'vminpd' {AVX|AVX512_F+VL}.
kIdVminph, //!< Instruction 'vminph' {AVX512_FP16+VL}.
kIdVminps, //!< Instruction 'vminps' {AVX|AVX512_F+VL}.
- kIdVminsd, //!< Instruction 'vminsd' {AVX|AVX512_F}.
- kIdVminsh, //!< Instruction 'vminsh' {AVX512_FP16}.
- kIdVminss, //!< Instruction 'vminss' {AVX|AVX512_F}.
+ kIdVminsd, //!< Instruction 'vminsd' {AVX|AVX512_F+VL}.
+ kIdVminsh, //!< Instruction 'vminsh' {AVX512_FP16+VL}.
+ kIdVminss, //!< Instruction 'vminss' {AVX|AVX512_F+VL}.
kIdVmlaunch, //!< Instruction 'vmlaunch' {VMX}.
kIdVmload, //!< Instruction 'vmload' {SVM}.
kIdVmmcall, //!< Instruction 'vmmcall' {SVM}.
kIdVmovapd, //!< Instruction 'vmovapd' {AVX|AVX512_F+VL}.
kIdVmovaps, //!< Instruction 'vmovaps' {AVX|AVX512_F+VL}.
- kIdVmovd, //!< Instruction 'vmovd' {AVX|AVX512_F}.
+ kIdVmovd, //!< Instruction 'vmovd' {AVX|AVX512_F+VL}.
kIdVmovddup, //!< Instruction 'vmovddup' {AVX|AVX512_F+VL}.
kIdVmovdqa, //!< Instruction 'vmovdqa' {AVX}.
kIdVmovdqa32, //!< Instruction 'vmovdqa32' {AVX512_F+VL}.
@@ -1325,27 +1269,27 @@ namespace Inst {
kIdVmovdqu32, //!< Instruction 'vmovdqu32' {AVX512_F+VL}.
kIdVmovdqu64, //!< Instruction 'vmovdqu64' {AVX512_F+VL}.
kIdVmovdqu8, //!< Instruction 'vmovdqu8' {AVX512_BW+VL}.
- kIdVmovhlps, //!< Instruction 'vmovhlps' {AVX|AVX512_F}.
- kIdVmovhpd, //!< Instruction 'vmovhpd' {AVX|AVX512_F}.
- kIdVmovhps, //!< Instruction 'vmovhps' {AVX|AVX512_F}.
- kIdVmovlhps, //!< Instruction 'vmovlhps' {AVX|AVX512_F}.
- kIdVmovlpd, //!< Instruction 'vmovlpd' {AVX|AVX512_F}.
- kIdVmovlps, //!< Instruction 'vmovlps' {AVX|AVX512_F}.
+ kIdVmovhlps, //!< Instruction 'vmovhlps' {AVX|AVX512_F+VL}.
+ kIdVmovhpd, //!< Instruction 'vmovhpd' {AVX|AVX512_F+VL}.
+ kIdVmovhps, //!< Instruction 'vmovhps' {AVX|AVX512_F+VL}.
+ kIdVmovlhps, //!< Instruction 'vmovlhps' {AVX|AVX512_F+VL}.
+ kIdVmovlpd, //!< Instruction 'vmovlpd' {AVX|AVX512_F+VL}.
+ kIdVmovlps, //!< Instruction 'vmovlps' {AVX|AVX512_F+VL}.
kIdVmovmskpd, //!< Instruction 'vmovmskpd' {AVX}.
kIdVmovmskps, //!< Instruction 'vmovmskps' {AVX}.
kIdVmovntdq, //!< Instruction 'vmovntdq' {AVX|AVX512_F+VL}.
kIdVmovntdqa, //!< Instruction 'vmovntdqa' {AVX|AVX2|AVX512_F+VL}.
kIdVmovntpd, //!< Instruction 'vmovntpd' {AVX|AVX512_F+VL}.
kIdVmovntps, //!< Instruction 'vmovntps' {AVX|AVX512_F+VL}.
- kIdVmovq, //!< Instruction 'vmovq' {AVX|AVX512_F}.
- kIdVmovsd, //!< Instruction 'vmovsd' {AVX|AVX512_F}.
- kIdVmovsh, //!< Instruction 'vmovsh' {AVX512_FP16}.
+ kIdVmovq, //!< Instruction 'vmovq' {AVX|AVX512_F+VL}.
+ kIdVmovsd, //!< Instruction 'vmovsd' {AVX|AVX512_F+VL}.
+ kIdVmovsh, //!< Instruction 'vmovsh' {AVX512_FP16+VL}.
kIdVmovshdup, //!< Instruction 'vmovshdup' {AVX|AVX512_F+VL}.
kIdVmovsldup, //!< Instruction 'vmovsldup' {AVX|AVX512_F+VL}.
- kIdVmovss, //!< Instruction 'vmovss' {AVX|AVX512_F}.
+ kIdVmovss, //!< Instruction 'vmovss' {AVX|AVX512_F+VL}.
kIdVmovupd, //!< Instruction 'vmovupd' {AVX|AVX512_F+VL}.
kIdVmovups, //!< Instruction 'vmovups' {AVX|AVX512_F+VL}.
- kIdVmovw, //!< Instruction 'vmovw' {AVX512_FP16}.
+ kIdVmovw, //!< Instruction 'vmovw' {AVX512_FP16+VL}.
kIdVmpsadbw, //!< Instruction 'vmpsadbw' {AVX|AVX2}.
kIdVmptrld, //!< Instruction 'vmptrld' {VMX}.
kIdVmptrst, //!< Instruction 'vmptrst' {VMX}.
@@ -1356,9 +1300,9 @@ namespace Inst {
kIdVmulpd, //!< Instruction 'vmulpd' {AVX|AVX512_F+VL}.
kIdVmulph, //!< Instruction 'vmulph' {AVX512_FP16+VL}.
kIdVmulps, //!< Instruction 'vmulps' {AVX|AVX512_F+VL}.
- kIdVmulsd, //!< Instruction 'vmulsd' {AVX|AVX512_F}.
- kIdVmulsh, //!< Instruction 'vmulsh' {AVX512_FP16}.
- kIdVmulss, //!< Instruction 'vmulss' {AVX|AVX512_F}.
+ kIdVmulsd, //!< Instruction 'vmulsd' {AVX|AVX512_F+VL}.
+ kIdVmulsh, //!< Instruction 'vmulsh' {AVX512_FP16+VL}.
+ kIdVmulss, //!< Instruction 'vmulss' {AVX|AVX512_F+VL}.
kIdVmwrite, //!< Instruction 'vmwrite' {VMX}.
kIdVmxoff, //!< Instruction 'vmxoff' {VMX}.
kIdVmxon, //!< Instruction 'vmxon' {VMX}.
@@ -1366,8 +1310,6 @@ namespace Inst {
kIdVorps, //!< Instruction 'vorps' {AVX|AVX512_DQ+VL}.
kIdVp2intersectd, //!< Instruction 'vp2intersectd' {AVX512_VP2INTERSECT+VL}.
kIdVp2intersectq, //!< Instruction 'vp2intersectq' {AVX512_VP2INTERSECT+VL}.
- kIdVp4dpwssd, //!< Instruction 'vp4dpwssd' {AVX512_4VNNIW}.
- kIdVp4dpwssds, //!< Instruction 'vp4dpwssds' {AVX512_4VNNIW}.
kIdVpabsb, //!< Instruction 'vpabsb' {AVX|AVX2|AVX512_BW+VL}.
kIdVpabsd, //!< Instruction 'vpabsd' {AVX|AVX2|AVX512_F+VL}.
kIdVpabsq, //!< Instruction 'vpabsq' {AVX512_F+VL}.
@@ -1486,10 +1428,10 @@ namespace Inst {
kIdVpexpandd, //!< Instruction 'vpexpandd' {AVX512_F+VL}.
kIdVpexpandq, //!< Instruction 'vpexpandq' {AVX512_F+VL}.
kIdVpexpandw, //!< Instruction 'vpexpandw' {AVX512_VBMI2+VL}.
- kIdVpextrb, //!< Instruction 'vpextrb' {AVX|AVX512_BW}.
- kIdVpextrd, //!< Instruction 'vpextrd' {AVX|AVX512_DQ}.
- kIdVpextrq, //!< Instruction 'vpextrq' {AVX|AVX512_DQ} (X64).
- kIdVpextrw, //!< Instruction 'vpextrw' {AVX|AVX512_BW}.
+ kIdVpextrb, //!< Instruction 'vpextrb' {AVX|AVX512_BW+VL}.
+ kIdVpextrd, //!< Instruction 'vpextrd' {AVX|AVX512_DQ+VL}.
+ kIdVpextrq, //!< Instruction 'vpextrq' {AVX|AVX512_DQ+VL} (X64).
+ kIdVpextrw, //!< Instruction 'vpextrw' {AVX|AVX512_BW+VL}.
kIdVpgatherdd, //!< Instruction 'vpgatherdd' {AVX2|AVX512_F+VL}.
kIdVpgatherdq, //!< Instruction 'vpgatherdq' {AVX2|AVX512_F+VL}.
kIdVpgatherqd, //!< Instruction 'vpgatherqd' {AVX2|AVX512_F+VL}.
@@ -1516,10 +1458,10 @@ namespace Inst {
kIdVphsubsw, //!< Instruction 'vphsubsw' {AVX|AVX2}.
kIdVphsubw, //!< Instruction 'vphsubw' {AVX|AVX2}.
kIdVphsubwd, //!< Instruction 'vphsubwd' {XOP}.
- kIdVpinsrb, //!< Instruction 'vpinsrb' {AVX|AVX512_BW}.
- kIdVpinsrd, //!< Instruction 'vpinsrd' {AVX|AVX512_DQ}.
- kIdVpinsrq, //!< Instruction 'vpinsrq' {AVX|AVX512_DQ} (X64).
- kIdVpinsrw, //!< Instruction 'vpinsrw' {AVX|AVX512_BW}.
+ kIdVpinsrb, //!< Instruction 'vpinsrb' {AVX|AVX512_BW+VL}.
+ kIdVpinsrd, //!< Instruction 'vpinsrd' {AVX|AVX512_DQ+VL}.
+ kIdVpinsrq, //!< Instruction 'vpinsrq' {AVX|AVX512_DQ+VL} (X64).
+ kIdVpinsrw, //!< Instruction 'vpinsrw' {AVX|AVX512_BW+VL}.
kIdVplzcntd, //!< Instruction 'vplzcntd' {AVX512_CD+VL}.
kIdVplzcntq, //!< Instruction 'vplzcntq' {AVX512_CD+VL}.
kIdVpmacsdd, //!< Instruction 'vpmacsdd' {XOP}.
@@ -1709,64 +1651,48 @@ namespace Inst {
kIdVpxorq, //!< Instruction 'vpxorq' {AVX512_F+VL}.
kIdVrangepd, //!< Instruction 'vrangepd' {AVX512_DQ+VL}.
kIdVrangeps, //!< Instruction 'vrangeps' {AVX512_DQ+VL}.
- kIdVrangesd, //!< Instruction 'vrangesd' {AVX512_DQ}.
- kIdVrangess, //!< Instruction 'vrangess' {AVX512_DQ}.
+ kIdVrangesd, //!< Instruction 'vrangesd' {AVX512_DQ+VL}.
+ kIdVrangess, //!< Instruction 'vrangess' {AVX512_DQ+VL}.
kIdVrcp14pd, //!< Instruction 'vrcp14pd' {AVX512_F+VL}.
kIdVrcp14ps, //!< Instruction 'vrcp14ps' {AVX512_F+VL}.
- kIdVrcp14sd, //!< Instruction 'vrcp14sd' {AVX512_F}.
- kIdVrcp14ss, //!< Instruction 'vrcp14ss' {AVX512_F}.
- kIdVrcp28pd, //!< Instruction 'vrcp28pd' {AVX512_ER}.
- kIdVrcp28ps, //!< Instruction 'vrcp28ps' {AVX512_ER}.
- kIdVrcp28sd, //!< Instruction 'vrcp28sd' {AVX512_ER}.
- kIdVrcp28ss, //!< Instruction 'vrcp28ss' {AVX512_ER}.
- kIdVrcpph, //!< Instruction 'vrcpph' {AVX512_FP16}.
+ kIdVrcp14sd, //!< Instruction 'vrcp14sd' {AVX512_F+VL}.
+ kIdVrcp14ss, //!< Instruction 'vrcp14ss' {AVX512_F+VL}.
+ kIdVrcpph, //!< Instruction 'vrcpph' {AVX512_FP16+VL}.
kIdVrcpps, //!< Instruction 'vrcpps' {AVX}.
- kIdVrcpsh, //!< Instruction 'vrcpsh' {AVX512_FP16}.
+ kIdVrcpsh, //!< Instruction 'vrcpsh' {AVX512_FP16+VL}.
kIdVrcpss, //!< Instruction 'vrcpss' {AVX}.
kIdVreducepd, //!< Instruction 'vreducepd' {AVX512_DQ+VL}.
kIdVreduceph, //!< Instruction 'vreduceph' {AVX512_FP16+VL}.
kIdVreduceps, //!< Instruction 'vreduceps' {AVX512_DQ+VL}.
- kIdVreducesd, //!< Instruction 'vreducesd' {AVX512_DQ}.
- kIdVreducesh, //!< Instruction 'vreducesh' {AVX512_FP16}.
- kIdVreducess, //!< Instruction 'vreducess' {AVX512_DQ}.
+ kIdVreducesd, //!< Instruction 'vreducesd' {AVX512_DQ+VL}.
+ kIdVreducesh, //!< Instruction 'vreducesh' {AVX512_FP16+VL}.
+ kIdVreducess, //!< Instruction 'vreducess' {AVX512_DQ+VL}.
kIdVrndscalepd, //!< Instruction 'vrndscalepd' {AVX512_F+VL}.
kIdVrndscaleph, //!< Instruction 'vrndscaleph' {AVX512_FP16+VL}.
kIdVrndscaleps, //!< Instruction 'vrndscaleps' {AVX512_F+VL}.
- kIdVrndscalesd, //!< Instruction 'vrndscalesd' {AVX512_F}.
- kIdVrndscalesh, //!< Instruction 'vrndscalesh' {AVX512_FP16}.
- kIdVrndscaless, //!< Instruction 'vrndscaless' {AVX512_F}.
+ kIdVrndscalesd, //!< Instruction 'vrndscalesd' {AVX512_F+VL}.
+ kIdVrndscalesh, //!< Instruction 'vrndscalesh' {AVX512_FP16+VL}.
+ kIdVrndscaless, //!< Instruction 'vrndscaless' {AVX512_F+VL}.
kIdVroundpd, //!< Instruction 'vroundpd' {AVX}.
kIdVroundps, //!< Instruction 'vroundps' {AVX}.
kIdVroundsd, //!< Instruction 'vroundsd' {AVX}.
kIdVroundss, //!< Instruction 'vroundss' {AVX}.
kIdVrsqrt14pd, //!< Instruction 'vrsqrt14pd' {AVX512_F+VL}.
kIdVrsqrt14ps, //!< Instruction 'vrsqrt14ps' {AVX512_F+VL}.
- kIdVrsqrt14sd, //!< Instruction 'vrsqrt14sd' {AVX512_F}.
- kIdVrsqrt14ss, //!< Instruction 'vrsqrt14ss' {AVX512_F}.
- kIdVrsqrt28pd, //!< Instruction 'vrsqrt28pd' {AVX512_ER}.
- kIdVrsqrt28ps, //!< Instruction 'vrsqrt28ps' {AVX512_ER}.
- kIdVrsqrt28sd, //!< Instruction 'vrsqrt28sd' {AVX512_ER}.
- kIdVrsqrt28ss, //!< Instruction 'vrsqrt28ss' {AVX512_ER}.
+ kIdVrsqrt14sd, //!< Instruction 'vrsqrt14sd' {AVX512_F+VL}.
+ kIdVrsqrt14ss, //!< Instruction 'vrsqrt14ss' {AVX512_F+VL}.
kIdVrsqrtph, //!< Instruction 'vrsqrtph' {AVX512_FP16+VL}.
kIdVrsqrtps, //!< Instruction 'vrsqrtps' {AVX}.
- kIdVrsqrtsh, //!< Instruction 'vrsqrtsh' {AVX512_FP16}.
+ kIdVrsqrtsh, //!< Instruction 'vrsqrtsh' {AVX512_FP16+VL}.
kIdVrsqrtss, //!< Instruction 'vrsqrtss' {AVX}.
kIdVscalefpd, //!< Instruction 'vscalefpd' {AVX512_F+VL}.
kIdVscalefph, //!< Instruction 'vscalefph' {AVX512_FP16+VL}.
kIdVscalefps, //!< Instruction 'vscalefps' {AVX512_F+VL}.
- kIdVscalefsd, //!< Instruction 'vscalefsd' {AVX512_F}.
- kIdVscalefsh, //!< Instruction 'vscalefsh' {AVX512_FP16}.
- kIdVscalefss, //!< Instruction 'vscalefss' {AVX512_F}.
+ kIdVscalefsd, //!< Instruction 'vscalefsd' {AVX512_F+VL}.
+ kIdVscalefsh, //!< Instruction 'vscalefsh' {AVX512_FP16+VL}.
+ kIdVscalefss, //!< Instruction 'vscalefss' {AVX512_F+VL}.
kIdVscatterdpd, //!< Instruction 'vscatterdpd' {AVX512_F+VL}.
kIdVscatterdps, //!< Instruction 'vscatterdps' {AVX512_F+VL}.
- kIdVscatterpf0dpd, //!< Instruction 'vscatterpf0dpd' {AVX512_PF}.
- kIdVscatterpf0dps, //!< Instruction 'vscatterpf0dps' {AVX512_PF}.
- kIdVscatterpf0qpd, //!< Instruction 'vscatterpf0qpd' {AVX512_PF}.
- kIdVscatterpf0qps, //!< Instruction 'vscatterpf0qps' {AVX512_PF}.
- kIdVscatterpf1dpd, //!< Instruction 'vscatterpf1dpd' {AVX512_PF}.
- kIdVscatterpf1dps, //!< Instruction 'vscatterpf1dps' {AVX512_PF}.
- kIdVscatterpf1qpd, //!< Instruction 'vscatterpf1qpd' {AVX512_PF}.
- kIdVscatterpf1qps, //!< Instruction 'vscatterpf1qps' {AVX512_PF}.
kIdVscatterqpd, //!< Instruction 'vscatterqpd' {AVX512_F+VL}.
kIdVscatterqps, //!< Instruction 'vscatterqps' {AVX512_F+VL}.
kIdVsha512msg1, //!< Instruction 'vsha512msg1' {AVX & SHA512}.
@@ -1786,21 +1712,21 @@ namespace Inst {
kIdVsqrtpd, //!< Instruction 'vsqrtpd' {AVX|AVX512_F+VL}.
kIdVsqrtph, //!< Instruction 'vsqrtph' {AVX512_FP16+VL}.
kIdVsqrtps, //!< Instruction 'vsqrtps' {AVX|AVX512_F+VL}.
- kIdVsqrtsd, //!< Instruction 'vsqrtsd' {AVX|AVX512_F}.
- kIdVsqrtsh, //!< Instruction 'vsqrtsh' {AVX512_FP16}.
- kIdVsqrtss, //!< Instruction 'vsqrtss' {AVX|AVX512_F}.
+ kIdVsqrtsd, //!< Instruction 'vsqrtsd' {AVX|AVX512_F+VL}.
+ kIdVsqrtsh, //!< Instruction 'vsqrtsh' {AVX512_FP16+VL}.
+ kIdVsqrtss, //!< Instruction 'vsqrtss' {AVX|AVX512_F+VL}.
kIdVstmxcsr, //!< Instruction 'vstmxcsr' {AVX}.
kIdVsubpd, //!< Instruction 'vsubpd' {AVX|AVX512_F+VL}.
kIdVsubph, //!< Instruction 'vsubph' {AVX512_FP16+VL}.
kIdVsubps, //!< Instruction 'vsubps' {AVX|AVX512_F+VL}.
- kIdVsubsd, //!< Instruction 'vsubsd' {AVX|AVX512_F}.
- kIdVsubsh, //!< Instruction 'vsubsh' {AVX512_FP16}.
- kIdVsubss, //!< Instruction 'vsubss' {AVX|AVX512_F}.
+ kIdVsubsd, //!< Instruction 'vsubsd' {AVX|AVX512_F+VL}.
+ kIdVsubsh, //!< Instruction 'vsubsh' {AVX512_FP16+VL}.
+ kIdVsubss, //!< Instruction 'vsubss' {AVX|AVX512_F+VL}.
kIdVtestpd, //!< Instruction 'vtestpd' {AVX}.
kIdVtestps, //!< Instruction 'vtestps' {AVX}.
- kIdVucomisd, //!< Instruction 'vucomisd' {AVX|AVX512_F}.
- kIdVucomish, //!< Instruction 'vucomish' {AVX512_FP16}.
- kIdVucomiss, //!< Instruction 'vucomiss' {AVX|AVX512_F}.
+ kIdVucomisd, //!< Instruction 'vucomisd' {AVX|AVX512_F+VL}.
+ kIdVucomish, //!< Instruction 'vucomish' {AVX512_FP16+VL}.
+ kIdVucomiss, //!< Instruction 'vucomiss' {AVX|AVX512_F+VL}.
kIdVunpckhpd, //!< Instruction 'vunpckhpd' {AVX|AVX512_F+VL}.
kIdVunpckhps, //!< Instruction 'vunpckhps' {AVX|AVX512_F+VL}.
kIdVunpcklpd, //!< Instruction 'vunpcklpd' {AVX|AVX512_F+VL}.
@@ -1843,34 +1769,80 @@ namespace Inst {
kIdXsaves64, //!< Instruction 'xsaves64' {XSAVES} (X64).
kIdXsetbv, //!< Instruction 'xsetbv' {XSAVE}.
kIdXsusldtrk, //!< Instruction 'xsusldtrk' {TSXLDTRK}.
- kIdXtest, //!< Instruction 'xtest' {TSX}.
- _kIdCount
+ kIdXtest, //!< Instruction 'xtest' {RTM}.
+ _kIdCount,
+
+ // Aliases.
+ kIdCmovnae = kIdCmovb,
+ kIdCmovc = kIdCmovb,
+ kIdCmovna = kIdCmovbe,
+ kIdCmovnge = kIdCmovl,
+ kIdCmovng = kIdCmovle,
+ kIdCmovae = kIdCmovnb,
+ kIdCmovnc = kIdCmovnb,
+ kIdCmova = kIdCmovnbe,
+ kIdCmovge = kIdCmovnl,
+ kIdCmovg = kIdCmovnle,
+ kIdCmovpo = kIdCmovnp,
+ kIdCmovne = kIdCmovnz,
+ kIdCmovpe = kIdCmovp,
+ kIdCmove = kIdCmovz,
+ kIdWait = kIdFwait,
+ kIdJnae = kIdJb,
+ kIdJc = kIdJb,
+ kIdJna = kIdJbe,
+ kIdJnge = kIdJl,
+ kIdJng = kIdJle,
+ kIdJae = kIdJnb,
+ kIdJnc = kIdJnb,
+ kIdJa = kIdJnbe,
+ kIdJge = kIdJnl,
+ kIdJg = kIdJnle,
+ kIdJpo = kIdJnp,
+ kIdJne = kIdJnz,
+ kIdJpe = kIdJp,
+ kIdJe = kIdJz,
+ kIdSetnae = kIdSetb,
+ kIdSetc = kIdSetb,
+ kIdSetna = kIdSetbe,
+ kIdSetnge = kIdSetl,
+ kIdSetng = kIdSetle,
+ kIdSetae = kIdSetnb,
+ kIdSetnc = kIdSetnb,
+ kIdSeta = kIdSetnbe,
+ kIdSetge = kIdSetnl,
+ kIdSetg = kIdSetnle,
+ kIdSetpo = kIdSetnp,
+ kIdSetne = kIdSetnz,
+ kIdSetpe = kIdSetp,
+ kIdSete = kIdSetz,
+ kIdSal = kIdShl
// ${InstId:End}
};
- //! Tests whether the `instId` is defined.
- static ASMJIT_INLINE_NODEBUG constexpr bool isDefinedId(InstId instId) noexcept { return instId < _kIdCount; }
+ //! Tests whether the `inst_id` is defined.
+ static ASMJIT_INLINE_CONSTEXPR bool is_defined_id(InstId inst_id) noexcept { return inst_id < _kIdCount; }
//! \cond
#define ASMJIT_INST_FROM_COND(ID) \
- ID##o, ID##no, ID##b , ID##ae, \
- ID##e, ID##ne, ID##be, ID##a , \
- ID##s, ID##ns, ID##pe, ID##po, \
- ID##l, ID##ge, ID##le, ID##g
+ ID##o, ID##no, ID##b , ID##nb , \
+ ID##z, ID##nz, ID##be, ID##nbe, \
+ ID##s, ID##ns, ID##p , ID##np , \
+ ID##l, ID##nl, ID##le, ID##nle
- static constexpr uint16_t _jccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdJ) };
- static constexpr uint16_t _setccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdSet) };
- static constexpr uint16_t _cmovccTable[] = { ASMJIT_INST_FROM_COND(Inst::kIdCmov) };
+ static constexpr uint16_t _jcc_from_cond_table[] = { ASMJIT_INST_FROM_COND(Inst::kIdJ) };
+ static constexpr uint16_t _setcc_from_cond_table[] = { ASMJIT_INST_FROM_COND(Inst::kIdSet) };
+ static constexpr uint16_t _cmovcc_from_cond_table[] = { ASMJIT_INST_FROM_COND(Inst::kIdCmov) };
#undef ASMJIT_INST_FROM_COND
//! \endcond
//! Translates a condition code `cond` to a `jcc` instruction id.
- static ASMJIT_INLINE_NODEBUG constexpr InstId jccFromCond(CondCode cond) noexcept { return _jccTable[uint8_t(cond)]; }
+ static ASMJIT_INLINE_CONSTEXPR InstId jcc_from_cond(CondCode cond) noexcept { return _jcc_from_cond_table[uint8_t(cond)]; }
//! Translates a condition code `cond` to a `setcc` instruction id.
- static ASMJIT_INLINE_NODEBUG constexpr InstId setccFromCond(CondCode cond) noexcept { return _setccTable[uint8_t(cond)]; }
+ static ASMJIT_INLINE_CONSTEXPR InstId setcc_from_cond(CondCode cond) noexcept { return _setcc_from_cond_table[uint8_t(cond)]; }
//! Translates a condition code `cond` to a `cmovcc` instruction id.
- static ASMJIT_INLINE_NODEBUG constexpr InstId cmovccFromCond(CondCode cond) noexcept { return _cmovccTable[uint8_t(cond)]; }
+ static ASMJIT_INLINE_CONSTEXPR InstId cmovcc_from_cond(CondCode cond) noexcept { return _cmovcc_from_cond_table[uint8_t(cond)]; }
} // {Inst}
//! FPU status word bits.
@@ -2149,9 +2121,9 @@ enum class VReduceImm : uint8_t {
};
ASMJIT_DEFINE_ENUM_FLAGS(VReduceImm)
-//! Creates a \ref VReduceImm from a combination of `flags` and `fixedPointLength`.
-static ASMJIT_INLINE_NODEBUG constexpr VReduceImm vReduceImm(VReduceImm flags, uint32_t fixedPointLength) noexcept {
- return flags | VReduceImm(fixedPointLength << 4);
+//! Creates a \ref VReduceImm from a combination of `flags` and `fixed_point_length`.
+static ASMJIT_INLINE_CONSTEXPR VReduceImm vreduce_imm(VReduceImm flags, uint32_t fixed_point_length) noexcept {
+ return flags | VReduceImm(fixed_point_length << 4);
}
//! A predicate that can be used as an immediate value with VPTERNLOG[D|Q] instruction.
@@ -2160,7 +2132,7 @@ static ASMJIT_INLINE_NODEBUG constexpr VReduceImm vReduceImm(VReduceImm flags, u
//! that would be performed on these 3 inputs to get the desired output - any combination of AND, OR, XOR, NOT
//! is possible.
//!
-//! \sa \ref tLogFromBits and \ref fLogIfElse
+//! \sa \ref tlog_from_bits and \ref tlog_if_else
enum class TLogImm : uint8_t {
k0 = 0x00u, //!< 0 value.
k1 = 0xFFu, //!< 1 value.
@@ -2185,7 +2157,7 @@ enum class TLogImm : uint8_t {
ASMJIT_DEFINE_ENUM_FLAGS(TLogImm)
//! Creates an immediate that can be used by VPTERNLOG[D|Q] instructions.
-static ASMJIT_INLINE_NODEBUG constexpr TLogImm tLogFromBits(uint8_t b000, uint8_t b001, uint8_t b010, uint8_t b011, uint8_t b100, uint8_t b101, uint8_t b110, uint8_t b111) noexcept {
+static ASMJIT_INLINE_CONSTEXPR TLogImm tlog_from_bits(uint8_t b000, uint8_t b001, uint8_t b010, uint8_t b011, uint8_t b100, uint8_t b101, uint8_t b110, uint8_t b111) noexcept {
return TLogImm(uint8_t(b000 << 0) |
uint8_t(b001 << 1) |
uint8_t(b010 << 2) |
@@ -2197,7 +2169,7 @@ static ASMJIT_INLINE_NODEBUG constexpr TLogImm tLogFromBits(uint8_t b000, uint8_
}
//! Creates an if/else logic that can be used by VPTERNLOG[D|Q] instructions.
-static ASMJIT_INLINE_NODEBUG constexpr TLogImm fLogIfElse(TLogImm condition, TLogImm a, TLogImm b) noexcept { return (condition & a) | (~condition & b); }
+static ASMJIT_INLINE_CONSTEXPR TLogImm tlog_if_else(TLogImm condition, TLogImm a, TLogImm b) noexcept { return (condition & a) | (~condition & b); }
//! Creates a shuffle immediate value that be used with SSE/AVX/AVX-512 instructions to shuffle 2 elements in a vector.
//!
@@ -2206,7 +2178,7 @@ static ASMJIT_INLINE_NODEBUG constexpr TLogImm fLogIfElse(TLogImm condition, TLo
//!
//! Shuffle constants can be used to encode an immediate for these instructions:
//! - `shufpd|vshufpd`
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t shuffleImm(uint32_t a, uint32_t b) noexcept {
+static ASMJIT_INLINE_CONSTEXPR uint32_t shuffle_imm(uint32_t a, uint32_t b) noexcept {
return (a << 1) | b;
}
@@ -2223,7 +2195,7 @@ static ASMJIT_INLINE_NODEBUG constexpr uint32_t shuffleImm(uint32_t a, uint32_t
//! - `pshufhw|vpshufhw`
//! - `pshufd|vpshufd`
//! - `shufps|vshufps`
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t shuffleImm(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
+static ASMJIT_INLINE_CONSTEXPR uint32_t shuffle_imm(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
return (a << 6) | (b << 4) | (c << 2) | d;
}
diff --git a/3rdparty/asmjit/asmjit/x86/x86instapi.cpp b/3rdparty/asmjit/asmjit/x86/x86instapi.cpp
new file mode 100644
index 00000000000..29757bcc556
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86instapi.cpp
@@ -0,0 +1,1938 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/instdb_p.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/x86/x86instdb_p.h>
+#include <asmjit/x86/x86opcode_p.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+namespace InstInternal {
+
+// x86::InstInternal - Text
+// ========================
+
+#ifndef ASMJIT_NO_TEXT
+Error inst_id_to_string(InstId inst_id, InstStringifyOptions options, String& output) noexcept {
+ if (ASMJIT_UNLIKELY(!Inst::is_defined_id(inst_id)))
+ return make_error(Error::kInvalidInstruction);
+
+ return InstNameUtils::decode(InstDB::_inst_name_index_table[inst_id], options, InstDB::_inst_name_string_table, output);
+}
+
+InstId string_to_inst_id(const char* s, size_t len) noexcept {
+ if (ASMJIT_UNLIKELY(!s)) {
+ return BaseInst::kIdNone;
+ }
+
+ if (len == SIZE_MAX) {
+ len = strlen(s);
+ }
+
+ if (len == 0u || len > InstDB::_inst_name_index.max_name_length) {
+ return BaseInst::kIdNone;
+ }
+
+ InstId inst_id = InstNameUtils::find_instruction(s, len, InstDB::_inst_name_index_table, InstDB::_inst_name_string_table, InstDB::_inst_name_index);
+ if (inst_id != BaseInst::kIdNone) {
+ return inst_id;
+ }
+
+ uint32_t alias_index = InstNameUtils::find_alias(s, len, InstDB::alias_name_index_table, InstDB::alias_name_string_table, InstDB::kAliasTableSize);
+ if (alias_index != Globals::kInvalidId) {
+ return InstDB::alias_index_to_inst_id_table[alias_index];
+ }
+
+ return BaseInst::kIdNone;
+}
+#endif // !ASMJIT_NO_TEXT
+
+// x86::InstInternal - Validate
+// ============================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+struct X86ValidationData {
+ //! Allowed registers by \ref RegType.
+ RegMask allowed_reg_mask[uint32_t(RegType::kMaxValue) + 1];
+ uint32_t allowed_mem_base_regs;
+ uint32_t allowed_mem_index_regs;
+};
+
+#define VALUE(x) \
+ (x == uint32_t(RegType::kPC )) ? InstDB::OpFlags::kNone : \
+ (x == uint32_t(RegType::kGp8Lo )) ? InstDB::OpFlags::kRegGpbLo : \
+ (x == uint32_t(RegType::kGp8Hi )) ? InstDB::OpFlags::kRegGpbHi : \
+ (x == uint32_t(RegType::kGp16 )) ? InstDB::OpFlags::kRegGpw : \
+ (x == uint32_t(RegType::kGp32 )) ? InstDB::OpFlags::kRegGpd : \
+ (x == uint32_t(RegType::kGp64 )) ? InstDB::OpFlags::kRegGpq : \
+ (x == uint32_t(RegType::kVec128 )) ? InstDB::OpFlags::kRegXmm : \
+ (x == uint32_t(RegType::kVec256 )) ? InstDB::OpFlags::kRegYmm : \
+ (x == uint32_t(RegType::kVec512 )) ? InstDB::OpFlags::kRegZmm : \
+ (x == uint32_t(RegType::kMask )) ? InstDB::OpFlags::kRegKReg : \
+ (x == uint32_t(RegType::kX86_Mm )) ? InstDB::OpFlags::kRegMm : \
+ (x == uint32_t(RegType::kSegment )) ? InstDB::OpFlags::kRegSReg : \
+ (x == uint32_t(RegType::kControl )) ? InstDB::OpFlags::kRegCReg : \
+ (x == uint32_t(RegType::kDebug )) ? InstDB::OpFlags::kRegDReg : \
+ (x == uint32_t(RegType::kX86_St )) ? InstDB::OpFlags::kRegSt : \
+ (x == uint32_t(RegType::kX86_Bnd )) ? InstDB::OpFlags::kRegBnd : \
+ (x == uint32_t(RegType::kTile )) ? InstDB::OpFlags::kRegTmm : InstDB::OpFlags::kNone
+static const InstDB::OpFlags op_flag_from_reg_type_table[uint32_t(RegType::kMaxValue) + 1] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
+#undef VALUE
+
+#define REG_MASK_FROM_REG_TYPE_X86(x) \
+ (x == uint32_t(RegType::kPC )) ? 0x00000001u : \
+ (x == uint32_t(RegType::kGp8Lo )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kGp8Hi )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kGp16 )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kGp32 )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kGp64 )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kVec128 )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kVec256 )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kVec512 )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kMask )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Mm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kSegment )) ? 0x0000007Eu : \
+ (x == uint32_t(RegType::kControl )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kDebug )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_St )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Bnd )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kTile )) ? 0x000000FFu : 0u
+
+#define REG_MASK_FROM_REG_TYPE_X64(x) \
+ (x == uint32_t(RegType::kPC )) ? 0x00000001u : \
+ (x == uint32_t(RegType::kGp8Lo )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kGp8Hi )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kGp16 )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kGp32 )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kGp64 )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kVec128 )) ? 0xFFFFFFFFu : \
+ (x == uint32_t(RegType::kVec256 )) ? 0xFFFFFFFFu : \
+ (x == uint32_t(RegType::kVec512 )) ? 0xFFFFFFFFu : \
+ (x == uint32_t(RegType::kMask )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Mm )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kSegment )) ? 0x0000007Eu : \
+ (x == uint32_t(RegType::kControl )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kDebug )) ? 0x0000FFFFu : \
+ (x == uint32_t(RegType::kX86_St )) ? 0x000000FFu : \
+ (x == uint32_t(RegType::kX86_Bnd )) ? 0x0000000Fu : \
+ (x == uint32_t(RegType::kTile )) ? 0x000000FFu : 0u
+
+#define B(RegType) (uint32_t(1) << uint32_t(RegType))
+
+static const X86ValidationData x86_validation_data = {
+ { ASMJIT_LOOKUP_TABLE_32(REG_MASK_FROM_REG_TYPE_X86, 0) },
+ B(RegType::kGp16) | B(RegType::kGp32) | B(RegType::kPC) | B(RegType::kLabelTag),
+ B(RegType::kGp16) | B(RegType::kGp32) | B(RegType::kVec128) | B(RegType::kVec256) | B(RegType::kVec512)
+};
+
+static const X86ValidationData x64_validation_data = {
+ { ASMJIT_LOOKUP_TABLE_32(REG_MASK_FROM_REG_TYPE_X64, 0) },
+ B(RegType::kGp32) | B(RegType::kGp64) | B(RegType::kPC) | B(RegType::kLabelTag),
+ B(RegType::kGp32) | B(RegType::kGp64) | B(RegType::kVec128) | B(RegType::kVec256) | B(RegType::kVec512)
+};
+
+#undef B
+
+#undef REG_MASK_FROM_REG_TYPE_X64
+#undef REG_MASK_FROM_REG_TYPE_X86
+
+static ASMJIT_INLINE bool is_zmm_or_m512(const Operand_& op) noexcept {
+ return op.is_vec512() || (op.is_mem() && op.as<Mem>().size() == 64);
+}
+
+static ASMJIT_INLINE bool check_op_sig(const InstDB::OpSignature& op, const InstDB::OpSignature& ref, bool& imm_out_of_range) noexcept {
+ // Fail if operand types are incompatible.
+ InstDB::OpFlags common_flags = op.flags() & ref.flags();
+
+ if (!Support::test(common_flags, InstDB::OpFlags::kOpMask)) {
+ // Mark temporarily `imm_out_of_range` so we can return a more descriptive error later.
+ if (op.has_imm() && ref.has_imm()) {
+ imm_out_of_range = true;
+ return true;
+ }
+
+ return false;
+ }
+
+ // Fail if some memory specific flags do not match.
+ if (Support::test(common_flags, InstDB::OpFlags::kMemMask)) {
+ if (ref.has_flag(InstDB::OpFlags::kFlagMemBase) && !op.has_flag(InstDB::OpFlags::kFlagMemBase)) {
+ return false;
+ }
+ }
+
+ // Fail if register indexes do not match.
+ if (Support::test(common_flags, InstDB::OpFlags::kRegMask)) {
+ if (ref.reg_mask() && !Support::test(op.reg_mask(), ref.reg_mask())) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static ASMJIT_FAVOR_SIZE Error validate(InstDB::Mode mode, const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept {
+ uint32_t i;
+
+ // Get the instruction data.
+ const X86ValidationData* vd = (mode == InstDB::Mode::kX86) ? &x86_validation_data : &x64_validation_data;
+ InstId inst_id = inst.inst_id();
+ InstOptions options = inst.options();
+
+ if (ASMJIT_UNLIKELY(!Inst::is_defined_id(inst_id))) {
+ return make_error(Error::kInvalidInstruction);
+ }
+
+ const InstDB::InstInfo& inst_info = InstDB::inst_info_by_id(inst_id);
+ const InstDB::CommonInfo& common_info = inst_info.common_info();
+
+ InstDB::InstFlags inst_flags = inst_info.flags();
+
+ constexpr InstOptions kRepAny = InstOptions::kX86_Rep | InstOptions::kX86_Repne;
+ constexpr InstOptions kXAcqXRel = InstOptions::kX86_XAcquire | InstOptions::kX86_XRelease;
+ constexpr InstOptions kAvx512Options = InstOptions::kX86_ZMask | InstOptions::kX86_ER | InstOptions::kX86_SAE;
+
+ // Validate LOCK|XACQUIRE|XRELEASE Prefixes
+ // ----------------------------------------
+
+ if (Support::test(options, InstOptions::kX86_Lock | kXAcqXRel)) {
+ if (Support::test(options, InstOptions::kX86_Lock)) {
+ if (ASMJIT_UNLIKELY(!Support::test(inst_flags, InstDB::InstFlags::kLock) && !Support::test(options, kXAcqXRel))) {
+ return make_error(Error::kInvalidLockPrefix);
+ }
+
+ if (ASMJIT_UNLIKELY(op_count < 1 || !operands[0].is_mem())) {
+ return make_error(Error::kInvalidLockPrefix);
+ }
+ }
+
+ if (Support::test(options, kXAcqXRel)) {
+ if (ASMJIT_UNLIKELY(!Support::test(options, InstOptions::kX86_Lock) || (options & kXAcqXRel) == kXAcqXRel)) {
+ return make_error(Error::kInvalidPrefixCombination);
+ }
+
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XAcquire) && !Support::test(inst_flags, InstDB::InstFlags::kXAcquire))) {
+ return make_error(Error::kInvalidXAcquirePrefix);
+ }
+
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XRelease) && !Support::test(inst_flags, InstDB::InstFlags::kXRelease))) {
+ return make_error(Error::kInvalidXReleasePrefix);
+ }
+ }
+ }
+
+ // Validate REP and REPNE Prefixes
+ // -------------------------------
+
+ if (Support::test(options, kRepAny)) {
+ if (ASMJIT_UNLIKELY((options & kRepAny) == kRepAny)) {
+ return make_error(Error::kInvalidPrefixCombination);
+ }
+
+ if (ASMJIT_UNLIKELY(!Support::test(inst_flags, InstDB::InstFlags::kRep))) {
+ return make_error(Error::kInvalidRepPrefix);
+ }
+ }
+
+ // Translate Each Operand to the Corresponding OpSignature
+ // -------------------------------------------------------
+
+ InstDB::OpSignature op_sig_translated[Globals::kMaxOpCount];
+ InstDB::OpFlags combined_op_flags = InstDB::OpFlags::kNone;
+ RegMask combined_reg_mask = 0;
+ const Mem* mem_op = nullptr;
+
+ for (i = 0; i < op_count; i++) {
+ const Operand_& op = operands[i];
+ if (op.op_type() == OperandType::kNone) {
+ break;
+ }
+
+ InstDB::OpFlags op_flags = InstDB::OpFlags::kNone;
+ RegMask reg_mask = 0;
+
+ switch (op.op_type()) {
+ case OperandType::kReg: {
+ RegType reg_type = op.as<Reg>().reg_type();
+ op_flags = op_flag_from_reg_type_table[size_t(reg_type)];
+
+ if (ASMJIT_UNLIKELY(op_flags == InstDB::OpFlags::kNone)) {
+ return make_error(Error::kInvalidRegType);
+ }
+
+ // If `reg_id` is equal or greater than Operand::kVirtIdMin it means that the register is virtual and its
+ // index will be assigned later by the register allocator. We must pass unless asked to disallow virtual
+ // registers.
+ uint32_t reg_id = op.id();
+ if (reg_id < Operand::kVirtIdMin) {
+ if (ASMJIT_UNLIKELY(reg_id >= 32)) {
+ return make_error(Error::kInvalidPhysId);
+ }
+
+ if (ASMJIT_UNLIKELY(Support::bit_test(vd->allowed_reg_mask[size_t(reg_type)], reg_id) == 0)) {
+ return make_error(Error::kInvalidPhysId);
+ }
+
+ reg_mask = Support::bit_mask<RegMask>(reg_id);
+ combined_reg_mask |= reg_mask;
+ }
+ else {
+ if (uint32_t(validation_flags & ValidationFlags::kEnableVirtRegs) == 0) {
+ return make_error(Error::kIllegalVirtReg);
+ }
+ reg_mask = 0xFFFFFFFFu;
+ }
+ break;
+ }
+
+ // TODO: Validate base and index and combine these with `combined_reg_mask`.
+ case OperandType::kMem: {
+ const Mem& m = op.as<Mem>();
+ mem_op = &m;
+
+ uint32_t mem_size = m.size();
+ RegType base_type = m.base_type();
+ RegType index_type = m.index_type();
+
+ if (m.segment_id() > 6) {
+ return make_error(Error::kInvalidSegment);
+ }
+
+ // Validate AVX-512 broadcast {1tox}.
+ if (m.has_broadcast()) {
+ if (mem_size != 0) {
+ // If the size is specified it has to match the broadcast size.
+ if (ASMJIT_UNLIKELY(common_info.has_avx512_bcst32() && mem_size != 4)) {
+ return make_error(Error::kInvalidBroadcast);
+ }
+
+ if (ASMJIT_UNLIKELY(common_info.has_avx512_bcst64() && mem_size != 8)) {
+ return make_error(Error::kInvalidBroadcast);
+ }
+ }
+ else {
+ // If there is no size we implicitly calculate it so we can validate N in {1toN} properly.
+ mem_size = common_info.has_avx512_bcst64() ? 8 :
+ common_info.has_avx512_bcst32() ? 4 : 2;
+ }
+
+ mem_size <<= uint32_t(m.get_broadcast());
+ }
+
+ if (base_type != RegType::kNone && base_type > RegType::kLabelTag) {
+ uint32_t base_id = m.base_id();
+
+ if (m.is_reg_home()) {
+ // Home address of a virtual register. In such case we don't want to validate the type of the
+ // base register as it will always be patched to ESP|RSP.
+ }
+ else if (ASMJIT_UNLIKELY(!Support::bit_test(vd->allowed_mem_base_regs, base_type))) {
+ return make_error(Error::kInvalidAddress);
+ }
+
+ // Create information that will be validated only if this is an implicit memory operand. Basically
+ // only usable for string instructions and other instructions where memory operand is implicit and
+ // has 'seg:[reg]' form.
+ if (base_id < Operand::kVirtIdMin) {
+ if (ASMJIT_UNLIKELY(base_id >= 32)) {
+ return make_error(Error::kInvalidPhysId);
+ }
+
+ // Physical base id.
+ reg_mask = Support::bit_mask<RegMask>(base_id);
+ combined_reg_mask |= reg_mask;
+ }
+ else {
+ // Virtual base id - fill the whole mask for implicit mem validation. The register is not assigned
+ // yet, so we cannot predict the phys id.
+ if (uint32_t(validation_flags & ValidationFlags::kEnableVirtRegs) == 0) {
+ return make_error(Error::kIllegalVirtReg);
+ }
+ reg_mask = 0xFFFFFFFFu;
+ }
+
+ if (index_type == RegType::kNone && !m.offset_lo32()) {
+ op_flags |= InstDB::OpFlags::kFlagMemBase;
+ }
+ }
+ else if (base_type == RegType::kLabelTag) {
+ // [Label] - there is no need to validate the base as it's label.
+ }
+ else {
+ // Base is a 64-bit address.
+ int64_t offset = m.offset();
+ if (!Support::is_int_n<32>(offset)) {
+ if (mode == InstDB::Mode::kX86) {
+ // 32-bit mode: Make sure that the address is either `int32_t` or `uint32_t`.
+ if (!Support::is_uint_n<32>(offset)) {
+ return make_error(Error::kInvalidAddress64Bit);
+ }
+ }
+ else {
+ // 64-bit mode: Zero extension is allowed if the address has 32-bit index register or the address
+ // has no index register (it's still encodable).
+ if (index_type != RegType::kNone) {
+ if (!Support::is_uint_n<32>(offset)) {
+ return make_error(Error::kInvalidAddress64Bit);
+ }
+
+ if (index_type != RegType::kGp32) {
+ return make_error(Error::kInvalidAddress64BitZeroExtension);
+ }
+ }
+ else {
+ // We don't validate absolute 64-bit addresses without an index register as this also depends
+ // on the target's base address. We don't have the information to do it at this moment.
+ }
+ }
+ }
+ }
+
+ if (index_type != RegType::kNone) {
+ if (ASMJIT_UNLIKELY(!Support::bit_test(vd->allowed_mem_index_regs, index_type))) {
+ return make_error(Error::kInvalidAddress);
+ }
+
+ if (index_type == RegType::kVec128) {
+ op_flags |= InstDB::OpFlags::kVm32x | InstDB::OpFlags::kVm64x;
+ }
+ else if (index_type == RegType::kVec256) {
+ op_flags |= InstDB::OpFlags::kVm32y | InstDB::OpFlags::kVm64y;
+ }
+ else if (index_type == RegType::kVec512) {
+ op_flags |= InstDB::OpFlags::kVm32z | InstDB::OpFlags::kVm64z;
+ }
+ else {
+ if (base_type != RegType::kNone)
+ op_flags |= InstDB::OpFlags::kFlagMib;
+ }
+
+ // [RIP + {XMM|YMM|ZMM}] is not allowed.
+ if (base_type == RegType::kPC && Support::test(op_flags, InstDB::OpFlags::kVmMask)) {
+ return make_error(Error::kInvalidAddress);
+ }
+
+ uint32_t index_id = m.index_id();
+ if (index_id < Operand::kVirtIdMin) {
+ if (ASMJIT_UNLIKELY(index_id >= 32)) {
+ return make_error(Error::kInvalidPhysId);
+ }
+
+ combined_reg_mask |= Support::bit_mask<RegMask>(index_id);
+ }
+ else if (uint32_t(validation_flags & ValidationFlags::kEnableVirtRegs) == 0) {
+ return make_error(Error::kIllegalVirtReg);
+ }
+
+ // Only used for implicit memory operands having 'seg:[reg]' form, so clear it.
+ reg_mask = 0;
+ }
+
+ switch (mem_size) {
+ case 0: op_flags |= InstDB::OpFlags::kMemUnspecified; break;
+ case 1: op_flags |= InstDB::OpFlags::kMem8; break;
+ case 2: op_flags |= InstDB::OpFlags::kMem16; break;
+ case 4: op_flags |= InstDB::OpFlags::kMem32; break;
+ case 6: op_flags |= InstDB::OpFlags::kMem48; break;
+ case 8: op_flags |= InstDB::OpFlags::kMem64; break;
+ case 10: op_flags |= InstDB::OpFlags::kMem80; break;
+ case 16: op_flags |= InstDB::OpFlags::kMem128; break;
+ case 32: op_flags |= InstDB::OpFlags::kMem256; break;
+ case 64: op_flags |= InstDB::OpFlags::kMem512; break;
+
+ default:
+ return make_error(Error::kInvalidOperandSize);
+ }
+
+ break;
+ }
+
+ case OperandType::kImm: {
+ uint64_t imm_value = op.as<Imm>().value_as<uint64_t>();
+
+ if (int64_t(imm_value) >= 0) {
+ if (imm_value <= 0x7u) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 |
+ InstDB::OpFlags::kImmI4 | InstDB::OpFlags::kImmU4 ;
+ }
+ else if (imm_value <= 0xFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 |
+ InstDB::OpFlags::kImmU4 ;
+ }
+ else if (imm_value <= 0x7Fu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 ;
+ }
+ else if (imm_value <= 0xFFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmU8 ;
+ }
+ else if (imm_value <= 0x7FFFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 ;
+ }
+ else if (imm_value <= 0xFFFFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
+ InstDB::OpFlags::kImmU16 ;
+ }
+ else if (imm_value <= 0x7FFFFFFFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32;
+ }
+ else if (imm_value <= 0xFFFFFFFFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmU32;
+ }
+ else if (imm_value <= 0x7FFFFFFFFFFFFFFFu) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64;
+ }
+ else {
+ op_flags = InstDB::OpFlags::kImmU64;
+ }
+ }
+ else {
+ imm_value = Support::neg(imm_value);
+ if (imm_value <= 0x8u) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmI4;
+ }
+ else if (imm_value <= 0x80u) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmI8;
+ }
+ else if (imm_value <= 0x8000u) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16;
+ }
+ else if (imm_value <= 0x80000000u) {
+ op_flags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32;
+ }
+ else {
+ op_flags = InstDB::OpFlags::kImmI64;
+ }
+ }
+ break;
+ }
+
+ case OperandType::kLabel: {
+ op_flags |= InstDB::OpFlags::kRel8 | InstDB::OpFlags::kRel32;
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidState);
+ }
+
+ InstDB::OpSignature& op_sig_dst = op_sig_translated[i];
+ op_sig_dst._flags = uint64_t(op_flags) & 0x00FFFFFFFFFFFFFFu;
+ op_sig_dst._reg_mask = uint8_t(reg_mask & 0xFFu);
+ combined_op_flags |= op_flags;
+ }
+
+ // Decrease the number of operands of those that are none. This is important as Assembler and Compiler may just pass
+ // more operands padded with none (which means that no operand is given at that index). However, validate that there
+ // are no gaps (like [reg, none, reg] or [none, reg]).
+ if (i < op_count) {
+ while (--op_count > i) {
+ if (ASMJIT_UNLIKELY(!operands[op_count].is_none())) {
+ return make_error(Error::kInvalidInstruction);
+ }
+ }
+ }
+
+ // Validate X86 and X64 specific cases.
+ if (mode == InstDB::Mode::kX86) {
+ // Illegal use of 64-bit register in 32-bit mode.
+ if (ASMJIT_UNLIKELY(Support::test(combined_op_flags, InstDB::OpFlags::kRegGpq))) {
+ return make_error(Error::kInvalidUseOfGpq);
+ }
+ }
+ else {
+ // Illegal use of a high 8-bit register with REX prefix.
+ bool has_rex = inst.has_option(InstOptions::kX86_Rex) || (combined_reg_mask & 0xFFFFFF00u) != 0;
+ if (ASMJIT_UNLIKELY(has_rex && Support::test(combined_op_flags, InstDB::OpFlags::kRegGpbHi))) {
+ return make_error(Error::kInvalidUseOfGpbHi);
+ }
+ }
+
+ // Validate Instruction Signature by Comparing Against All Signature Records
+ // -------------------------------------------------------------------------
+
+ bool inst_signature_matched = false;
+ Span<const InstDB::InstSignature> inst_signatures = common_info.inst_signatures();
+
+ if (!inst_signatures.is_empty()) {
+ const InstDB::OpSignature* op_signature_table = InstDB::_op_signature_table;
+
+ // If set it means that we matched a signature where only immediate value
+ // was out of bounds. We can return a more descriptive error if we know this.
+ bool global_imm_out_of_range = false;
+
+ for (const InstDB::InstSignature& inst_signature : inst_signatures) {
+ // Only match signatures that are compatible with the requested mode.
+ if (!inst_signature.supports_mode(mode)) {
+ continue;
+ }
+
+ // Compare the operands table with reference operands.
+ uint32_t j = 0;
+ uint32_t inst_op_count = inst_signature.op_count();
+ bool local_imm_out_of_range = false;
+
+ if (inst_op_count == op_count) {
+ for (j = 0; j < op_count; j++) {
+ if (!check_op_sig(op_sig_translated[j], inst_signature.op_signature(j), local_imm_out_of_range)) {
+ break;
+ }
+ }
+ }
+ else if (inst_op_count - inst_signature.implicit_op_count() == op_count) {
+ uint32_t r = 0;
+ for (j = 0; j < op_count && r < inst_op_count; j++, r++) {
+ const InstDB::OpSignature* op_chk = op_sig_translated + j;
+ const InstDB::OpSignature* op_ref;
+Next:
+ op_ref = op_signature_table + inst_signature.op_signature_index(r);
+ // Skip implicit operands.
+ if (op_ref->is_implicit()) {
+ if (++r >= inst_op_count) {
+ break;
+ }
+ else {
+ goto Next;
+ }
+ }
+
+ if (!check_op_sig(*op_chk, *op_ref, local_imm_out_of_range)) {
+ break;
+ }
+ }
+ }
+
+ if (j == op_count) {
+ if (!local_imm_out_of_range) {
+ // The match must clear `global_imm_out_of_range` as we have matched all operands.
+ global_imm_out_of_range = false;
+ inst_signature_matched = true;
+ break;
+ }
+ global_imm_out_of_range = local_imm_out_of_range;
+ }
+ }
+
+ if (!inst_signature_matched) {
+ return make_error(global_imm_out_of_range ? Error::kInvalidImmediate : Error::kInvalidInstruction);
+ }
+ }
+
+ // Validate AVX512 Options
+ // -----------------------
+
+ const RegOnly& extra_reg = inst.extra_reg();
+
+ if (Support::test(options, kAvx512Options)) {
+ if (common_info.has_flag(InstDB::InstFlags::kEvex)) {
+ // Validate AVX-512 {z}.
+ if (Support::test(options, InstOptions::kX86_ZMask)) {
+ if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_ZMask) && !common_info.has_avx512_z())) {
+ return make_error(Error::kInvalidKZeroUse);
+ }
+ }
+
+ // Validate AVX-512 {sae} and {er}.
+ if (Support::test(options, InstOptions::kX86_SAE | InstOptions::kX86_ER)) {
+ // Rounding control is impossible if the instruction is not reg-to-reg.
+ if (ASMJIT_UNLIKELY(mem_op)) {
+ return make_error(Error::kInvalidEROrSAE);
+ }
+
+ // Check if {sae} or {er} is supported by the instruction.
+ if (Support::test(options, InstOptions::kX86_ER)) {
+ // NOTE: if both {sae} and {er} are set, we don't care, as {sae} is implied.
+ if (ASMJIT_UNLIKELY(!common_info.has_avx512_er())) {
+ return make_error(Error::kInvalidEROrSAE);
+ }
+ }
+ else {
+ if (ASMJIT_UNLIKELY(!common_info.has_avx512_sae())) {
+ return make_error(Error::kInvalidEROrSAE);
+ }
+ }
+
+ // {sae} and {er} are defined for either scalar ops or vector ops that require LL to be 10 (512-bit vector
+ // operations). We don't need any more bits in the instruction database to be able to validate this, as
+ // each AVX512 instruction that has broadcast is vector instruction (in this case we require zmm registers),
+ // otherwise it's a scalar instruction, which is valid.
+ if (common_info.has_avx512_bcst()) {
+ // Supports broadcast, thus we require LL to be '10', which means there have to be ZMM registers used. We
+ // don't calculate LL here, but we know that it would be '10' if there is at least one ZMM register used.
+
+ // There is no {er}/{sae}-enabled instruction with less than two operands.
+ ASMJIT_ASSERT(op_count >= 2);
+ if (ASMJIT_UNLIKELY(!is_zmm_or_m512(operands[0]) && !is_zmm_or_m512(operands[1]))) {
+ return make_error(Error::kInvalidEROrSAE);
+ }
+ }
+ }
+ }
+ else {
+ // Not an AVX512 instruction - maybe OpExtra is xCX register used by REP/REPNE prefix.
+ if (Support::test(options, kAvx512Options) || !Support::test(options, kRepAny)) {
+ return make_error(Error::kInvalidInstruction);
+ }
+ }
+ }
+
+ // Validate {Extra} Register
+ // -------------------------
+
+ if (extra_reg.is_reg()) {
+ if (Support::test(options, kRepAny)) {
+ // Validate REP|REPNE {cx|ecx|rcx}.
+ if (ASMJIT_UNLIKELY(Support::test(inst_flags, InstDB::InstFlags::kRepIgnored))) {
+ return make_error(Error::kInvalidExtraReg);
+ }
+
+ if (extra_reg.is_phys_reg()) {
+ if (ASMJIT_UNLIKELY(extra_reg.id() != Gp::kIdCx)) {
+ return make_error(Error::kInvalidExtraReg);
+ }
+ }
+
+ // The type of the {...} register must match the type of the base register
+ // of memory operand. So if the memory operand uses 32-bit register the
+ // count register must also be 32-bit, etc...
+ if (ASMJIT_UNLIKELY(!mem_op || extra_reg.type() != mem_op->base_type())) {
+ return make_error(Error::kInvalidExtraReg);
+ }
+ }
+ else if (common_info.has_flag(InstDB::InstFlags::kEvex)) {
+ // Validate AVX-512 {k}.
+ if (ASMJIT_UNLIKELY(extra_reg.type() != RegType::kMask)) {
+ return make_error(Error::kInvalidExtraReg);
+ }
+
+ if (ASMJIT_UNLIKELY(extra_reg.id() == 0 || !common_info.has_avx512_k())) {
+ return make_error(Error::kInvalidKMaskUse);
+ }
+ }
+ else {
+ return make_error(Error::kInvalidExtraReg);
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error validate_x86(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept {
+ return validate(InstDB::Mode::kX86, inst, operands, op_count, validation_flags);
+}
+
+Error validate_x64(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept {
+ return validate(InstDB::Mode::kX64, inst, operands, op_count, validation_flags);
+}
+
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// x86::InstInternal - QueryRWInfo
+// ===============================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+static const Support::Array<uint64_t, uint32_t(RegGroup::kMaxValue) + 1> rw_reg_group_byte_mask_table = {{
+ 0x00000000000000FFu, // GP.
+ 0xFFFFFFFFFFFFFFFFu, // XMM|YMM|ZMM.
+ 0x00000000000000FFu, // MM.
+ 0x00000000000000FFu, // KReg.
+ 0x0000000000000003u, // SReg.
+ 0x00000000000000FFu, // CReg.
+ 0x00000000000000FFu, // DReg.
+ 0x00000000000003FFu, // St().
+ 0x000000000000FFFFu, // BND.
+ 0x00000000000000FFu // RIP.
+}};
+
+static ASMJIT_INLINE void rw_zero_extend_gp(OpRWInfo& op_rw_info, const Gp& reg, uint32_t native_gp_size) noexcept {
+ if (reg.size() + 4 == native_gp_size) {
+ op_rw_info.add_op_flags(OpRWFlags::kZExt);
+ op_rw_info.set_extend_byte_mask(~op_rw_info.write_byte_mask() & 0xFFu);
+ }
+}
+
+static ASMJIT_INLINE void rw_zero_extend_avx_vec(OpRWInfo& op_rw_info, const Vec& reg) noexcept {
+ Support::maybe_unused(reg);
+
+ uint64_t msk = ~Support::fill_trailing_bits(op_rw_info.write_byte_mask());
+ if (msk) {
+ op_rw_info.add_op_flags(OpRWFlags::kZExt);
+ op_rw_info.set_extend_byte_mask(msk);
+ }
+}
+
+static ASMJIT_INLINE void rw_zero_extend_non_vec(OpRWInfo& op_rw_info, const Reg& reg) noexcept {
+ uint64_t msk = ~Support::fill_trailing_bits(op_rw_info.write_byte_mask()) & rw_reg_group_byte_mask_table[reg.reg_group()];
+ if (msk) {
+ op_rw_info.add_op_flags(OpRWFlags::kZExt);
+ op_rw_info.set_extend_byte_mask(msk);
+ }
+}
+
+static ASMJIT_INLINE Error rw_handle_avx512(const BaseInst& inst, const InstDB::CommonInfo& common_info, InstRWInfo* out) noexcept {
+ if (inst.has_extra_reg() && inst.extra_reg().type() == RegType::kMask && out->op_count() > 0) {
+ // AVX-512 instruction that uses a destination with {k} register (zeroing vs masking).
+ out->_extra_reg.add_op_flags(OpRWFlags::kRead);
+ out->_extra_reg.set_read_byte_mask(0xFF);
+ if (!inst.has_option(InstOptions::kX86_ZMask) && !common_info.has_avx512_flag(InstDB::Avx512Flags::kImplicitZ)) {
+ out->_operands[0].add_op_flags(OpRWFlags::kRead);
+ out->_operands[0]._read_byte_mask |= out->_operands[0]._write_byte_mask;
+ }
+ }
+
+ return Error::kOk;
+}
+
+static ASMJIT_INLINE bool has_same_reg_type(const Reg* regs, size_t op_count) noexcept {
+ ASMJIT_ASSERT(op_count > 0);
+ RegType reg_type = regs[0].reg_type();
+ for (size_t i = 1; i < op_count; i++) {
+ if (regs[i].reg_type() != reg_type) {
+ return false;
+ }
+ }
+ return true;
+}
+
+Error query_rw_info(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, InstRWInfo* out) noexcept {
+ // Only called when `arch` matches X86 family.
+ ASMJIT_ASSERT(Environment::is_family_x86(arch));
+
+ // Get the instruction data.
+ InstId inst_id = inst.inst_id();
+ if (ASMJIT_UNLIKELY(!Inst::is_defined_id(inst_id))) {
+ return make_error(Error::kInvalidInstruction);
+ }
+
+ // Read/Write flags.
+ const InstDB::InstInfo& inst_info = InstDB::_inst_info_table[inst_id];
+ const InstDB::CommonInfo& common_info = InstDB::_inst_common_info_table[inst_info._common_info_index];
+ const InstDB::AdditionalInfo& additional_info = InstDB::additional_info_table[inst_info._additional_info_index];
+ const InstDB::RWFlagsInfoTable& rw_flags = InstDB::rw_flags_info_table[additional_info._rw_flags_index];
+
+ // There are two data tables, one for `op_count == 2` and the second for
+ // `op_count != 2`. There are two reasons for that:
+ // - There are instructions that share the same name that have both 2 or 3 operands, which have different
+ // RW information / semantics.
+ // - There must be 2 tables otherwise the lookup index won't fit into 8 bits (there is more than 256 records
+ // of combined rw_info A and B).
+ const InstDB::RWInfo& inst_rw_info = op_count == 2 ? InstDB::rw_info_a_table[InstDB::rw_info_index_a_table[inst_id]]
+ : InstDB::rw_info_b_table[InstDB::rw_info_index_b_table[inst_id]];
+ const InstDB::RWInfoRm& inst_rm_info = InstDB::rw_info_rm_table[inst_rw_info.rm_info];
+
+ out->_inst_flags = InstDB::inst_flags_table[additional_info._inst_flags_index];
+ out->_op_count = uint8_t(op_count);
+ out->_rm_feature = inst_rm_info.rm_feature;
+ out->_extra_reg.reset();
+ out->_read_flags = CpuRWFlags(rw_flags.read_flags);
+ out->_write_flags = CpuRWFlags(rw_flags.write_flags);
+
+ uint32_t op_type_mask = 0u;
+ uint32_t native_gp_size = Environment::reg_size_of_arch(arch);
+
+ constexpr OpRWFlags R = OpRWFlags::kRead;
+ constexpr OpRWFlags W = OpRWFlags::kWrite;
+ constexpr OpRWFlags X = OpRWFlags::kRW;
+ constexpr OpRWFlags RegM = OpRWFlags::kRegMem;
+ constexpr OpRWFlags RegPhys = OpRWFlags::kRegPhysId;
+ constexpr OpRWFlags MibRead = OpRWFlags::kMemBaseRead | OpRWFlags::kMemIndexRead;
+
+ if (inst_rw_info.category <= uint32_t(InstDB::RWInfo::kCategoryGenericEx)) {
+ uint32_t i;
+ uint32_t rm_ops_mask = 0;
+ uint32_t rm_max_size = 0;
+
+ for (i = 0; i < op_count; i++) {
+ OpRWInfo& op = out->_operands[i];
+ const Operand_& src_op = operands[i];
+ const InstDB::RWInfoOp& rw_op_data = InstDB::rw_info_op_table[inst_rw_info.op_info_index[i]];
+
+ op_type_mask |= Support::bit_mask<uint32_t>(src_op.op_type());
+
+ if (!src_op.is_reg_or_mem()) {
+ op.reset();
+ continue;
+ }
+
+ op._op_flags = rw_op_data.flags & ~OpRWFlags::kZExt;
+ op._phys_id = rw_op_data.phys_id;
+ op._rm_size = 0;
+ op._reset_reserved();
+
+ uint64_t r_byte_mask = rw_op_data.r_byte_mask;
+ uint64_t w_byte_mask = rw_op_data.w_byte_mask;
+
+ if (op.is_read() && !r_byte_mask) {
+ r_byte_mask = Support::lsb_mask<uint64_t>(src_op.x86_rm_size());
+ }
+
+ if (op.is_write() && !w_byte_mask) {
+ w_byte_mask = Support::lsb_mask<uint64_t>(src_op.x86_rm_size());
+ }
+
+ op._read_byte_mask = r_byte_mask;
+ op._write_byte_mask = w_byte_mask;
+ op._extend_byte_mask = 0;
+ op._consecutive_lead_count = rw_op_data.consecutive_lead_count;
+
+ if (src_op.is_reg()) {
+ // Zero extension.
+ if (op.is_write()) {
+ if (src_op.as<Reg>().is_gp()) {
+ // GP registers on X64 are special:
+ // - 8-bit and 16-bit writes aren't zero extended.
+ // - 32-bit writes ARE zero extended.
+ rw_zero_extend_gp(op, src_op.as<Gp>(), native_gp_size);
+ }
+ else if (Support::test(rw_op_data.flags, OpRWFlags::kZExt)) {
+ // Otherwise follow ZExt.
+ rw_zero_extend_non_vec(op, src_op.as<Gp>());
+ }
+ }
+
+ // Aggregate values required to calculate valid Reg/M info.
+ rm_max_size = Support::max(rm_max_size, src_op.x86_rm_size());
+ rm_ops_mask |= Support::bit_mask<uint32_t>(i);
+ }
+ else {
+ const x86::Mem& mem_op = src_op.as<x86::Mem>();
+ // The RW flags of BASE+INDEX are either provided by the data, which means
+ // that the instruction is border-case, or they are deduced from the operand.
+ if (mem_op.has_base_reg() && !op.has_op_flag(OpRWFlags::kMemBaseRW)) {
+ op.add_op_flags(OpRWFlags::kMemBaseRead);
+ }
+ if (mem_op.has_index_reg() && !op.has_op_flag(OpRWFlags::kMemIndexRW)) {
+ op.add_op_flags(OpRWFlags::kMemIndexRead);
+ }
+ }
+ }
+
+ // Only keep kMovOp if the instruction is actually register to register move of the same kind.
+ if (out->has_inst_flag(InstRWFlags::kMovOp)) {
+ if (!(op_count >= 2 && op_type_mask == Support::bit_mask<uint32_t>(OperandType::kReg) && has_same_reg_type(reinterpret_cast<const Reg*>(operands), op_count))) {
+ out->_inst_flags &= ~InstRWFlags::kMovOp;
+ }
+ }
+
+ // Special cases require more logic.
+ if (inst_rm_info.flags & (InstDB::RWInfoRm::kFlagMovssMovsd | InstDB::RWInfoRm::kFlagPextrw | InstDB::RWInfoRm::kFlagFeatureIfRMI)) {
+ if (inst_rm_info.flags & InstDB::RWInfoRm::kFlagMovssMovsd) {
+ if (op_count == 2) {
+ if (operands[0].is_reg() && operands[1].is_reg()) {
+ // Doesn't zero extend the destination.
+ out->_operands[0]._extend_byte_mask = 0;
+ }
+ }
+ }
+ else if (inst_rm_info.flags & InstDB::RWInfoRm::kFlagPextrw) {
+ if (op_count == 3 && operands[1].is_mm_reg()) {
+ out->_rm_feature = 0;
+ rm_ops_mask = 0;
+ }
+ }
+ else if (inst_rm_info.flags & InstDB::RWInfoRm::kFlagFeatureIfRMI) {
+ if (op_count != 3 || !operands[2].is_imm()) {
+ out->_rm_feature = 0;
+ }
+ }
+ }
+
+ rm_ops_mask &= uint32_t(inst_rm_info.rm_ops_mask);
+ if (rm_ops_mask && !inst.has_option(InstOptions::kX86_ER)) {
+ Support::BitWordIterator<uint32_t> it(rm_ops_mask);
+ do {
+ i = it.next();
+
+ OpRWInfo& op = out->_operands[i];
+ op.add_op_flags(RegM);
+
+ switch (inst_rm_info.category) {
+ case InstDB::RWInfoRm::kCategoryFixed:
+ op.set_rm_size(inst_rm_info.fixed_size);
+ break;
+ case InstDB::RWInfoRm::kCategoryConsistent:
+ op.set_rm_size(operands[i].x86_rm_size());
+ break;
+ case InstDB::RWInfoRm::kCategoryHalf:
+ op.set_rm_size(rm_max_size / 2u);
+ break;
+ case InstDB::RWInfoRm::kCategoryQuarter:
+ op.set_rm_size(rm_max_size / 4u);
+ break;
+ case InstDB::RWInfoRm::kCategoryEighth:
+ op.set_rm_size(rm_max_size / 8u);
+ break;
+ }
+ } while (it.has_next());
+ }
+
+ // Special cases per instruction.
+ if (inst_rw_info.category == InstDB::RWInfo::kCategoryGenericEx) {
+ switch (inst.inst_id()) {
+ case Inst::kIdVpternlogd:
+ case Inst::kIdVpternlogq: {
+ if (op_count == 4 && operands[3].is_imm()) {
+ uint32_t predicate = operands[3].as<Imm>().value_as<uint8_t>();
+
+ if ((predicate >> 4) == (predicate & 0xF)) {
+ out->_operands[0].clear_op_flags(OpRWFlags::kRead);
+ out->_operands[0].set_read_byte_mask(0);
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ return rw_handle_avx512(inst, common_info, out);
+ }
+
+ switch (inst_rw_info.category) {
+ case InstDB::RWInfo::kCategoryMov: {
+ // Special case for 'mov' instruction. Here there are some variants that we have to handle as 'mov' can be
+ // used to move between GP, segment, control and debug registers. Moving between GP registers also allow to
+ // use memory operand.
+
+ // We will again set the flag if it's actually a move from GP to GP register, otherwise this flag cannot be set.
+ out->_inst_flags &= ~InstRWFlags::kMovOp;
+
+ if (op_count == 2) {
+ if (operands[0].is_reg() && operands[1].is_reg()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ const Reg& o1 = operands[1].as<Reg>();
+
+ if (o0.is_gp() && o1.is_gp()) {
+ out->_operands[0].reset(W | RegM, operands[0].x86_rm_size());
+ out->_operands[1].reset(R | RegM, operands[1].x86_rm_size());
+
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ out->_inst_flags |= InstRWFlags::kMovOp;
+ return Error::kOk;
+ }
+
+ if (o0.is_gp() && o1.is_segment_reg()) {
+ out->_operands[0].reset(W | RegM, native_gp_size);
+ out->_operands[0].set_rm_size(2);
+ out->_operands[1].reset(R, 2);
+ return Error::kOk;
+ }
+
+ if (o0.is_segment_reg() && o1.is_gp()) {
+ out->_operands[0].reset(W, 2);
+ out->_operands[1].reset(R | RegM, 2);
+ out->_operands[1].set_rm_size(2);
+ return Error::kOk;
+ }
+
+ if (o0.is_gp() && (o1.is_control_reg() || o1.is_debug_reg())) {
+ out->_operands[0].reset(W, native_gp_size);
+ out->_operands[1].reset(R, native_gp_size);
+ out->_write_flags = CpuRWFlags::kX86_OF |
+ CpuRWFlags::kX86_SF |
+ CpuRWFlags::kX86_ZF |
+ CpuRWFlags::kX86_AF |
+ CpuRWFlags::kX86_PF |
+ CpuRWFlags::kX86_CF;
+ return Error::kOk;
+ }
+
+ if ((o0.is_control_reg() || o0.is_debug_reg()) && o1.is_gp()) {
+ out->_operands[0].reset(W, native_gp_size);
+ out->_operands[1].reset(R, native_gp_size);
+ out->_write_flags = CpuRWFlags::kX86_OF |
+ CpuRWFlags::kX86_SF |
+ CpuRWFlags::kX86_ZF |
+ CpuRWFlags::kX86_AF |
+ CpuRWFlags::kX86_PF |
+ CpuRWFlags::kX86_CF;
+ return Error::kOk;
+ }
+ }
+
+ if (operands[0].is_reg() && operands[1].is_mem()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ const Mem& o1 = operands[1].as<Mem>();
+
+ if (o0.is_gp()) {
+ if (!o1.is_offset_64bit()) {
+ out->_operands[0].reset(W, o0.size());
+ }
+ else {
+ out->_operands[0].reset(W | RegPhys, o0.size(), Gp::kIdAx);
+ }
+
+ out->_operands[1].reset(R | MibRead, o0.size());
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ return Error::kOk;
+ }
+
+ if (o0.is_segment_reg()) {
+ out->_operands[0].reset(W, 2);
+ out->_operands[1].reset(R, 2);
+ return Error::kOk;
+ }
+ }
+
+ if (operands[0].is_mem() && operands[1].is_reg()) {
+ const Mem& o0 = operands[0].as<Mem>();
+ const Reg& o1 = operands[1].as<Reg>();
+
+ if (o1.is_gp()) {
+ out->_operands[0].reset(W | MibRead, o1.size());
+ if (!o0.is_offset_64bit()) {
+ out->_operands[1].reset(R, o1.size());
+ }
+ else {
+ out->_operands[1].reset(R | RegPhys, o1.size(), Gp::kIdAx);
+ }
+ return Error::kOk;
+ }
+
+ if (o1.is_segment_reg()) {
+ out->_operands[0].reset(W | MibRead, 2);
+ out->_operands[1].reset(R, 2);
+ return Error::kOk;
+ }
+ }
+
+ if (operands[0].is_gp() && operands[1].is_imm()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ out->_operands[0].reset(W | RegM, o0.size());
+ out->_operands[1].reset();
+
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ return Error::kOk;
+ }
+
+ if (operands[0].is_mem() && operands[1].is_imm()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ out->_operands[0].reset(W | MibRead, o0.size());
+ out->_operands[1].reset();
+ return Error::kOk;
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryMovabs: {
+ if (op_count == 2) {
+ if (operands[0].is_gp() && operands[1].is_mem()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ out->_operands[0].reset(W | RegPhys, o0.size(), Gp::kIdAx);
+ out->_operands[1].reset(R | MibRead, o0.size());
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ return Error::kOk;
+ }
+
+ if (operands[0].is_mem() && operands[1].is_gp()) {
+ const Reg& o1 = operands[1].as<Reg>();
+ out->_operands[0].reset(W | MibRead, o1.size());
+ out->_operands[1].reset(R | RegPhys, o1.size(), Gp::kIdAx);
+ return Error::kOk;
+ }
+
+ if (operands[0].is_gp() && operands[1].is_imm()) {
+ const Reg& o0 = operands[0].as<Reg>();
+ out->_operands[0].reset(W, o0.size());
+ out->_operands[1].reset();
+
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ return Error::kOk;
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryImul: {
+ // Special case for 'imul' instruction.
+ //
+ // There are 3 variants in general:
+ //
+ // 1. Standard multiplication: 'A = A * B'.
+ // 2. Multiplication with imm: 'A = B * C'.
+ // 3. Extended multiplication: 'A:B = B * C'.
+
+ if (op_count == 2) {
+ if (operands[0].is_reg() && operands[1].is_imm()) {
+ out->_operands[0].reset(X, operands[0].as<Reg>().size());
+ out->_operands[1].reset();
+
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ return Error::kOk;
+ }
+
+ if (operands[0].is_gp16() && operands[1].x86_rm_size() == 1) {
+ // imul ax, r8/m8 <- AX = AL * r8/m8
+ out->_operands[0].reset(X | RegPhys, 2, Gp::kIdAx);
+ out->_operands[0].set_read_byte_mask(Support::lsb_mask<uint64_t>(1));
+ out->_operands[1].reset(R | RegM, 1);
+ }
+ else {
+ // imul r?, r?/m?
+ out->_operands[0].reset(X, operands[0].as<Gp>().size());
+ out->_operands[1].reset(R | RegM, operands[0].as<Gp>().size());
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ }
+
+ if (operands[1].is_mem()) {
+ out->_operands[1].add_op_flags(MibRead);
+ }
+ return Error::kOk;
+ }
+
+ if (op_count == 3) {
+ if (operands[2].is_imm()) {
+ out->_operands[0].reset(W, operands[0].x86_rm_size());
+ out->_operands[1].reset(R | RegM, operands[1].x86_rm_size());
+ out->_operands[2].reset();
+
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ if (operands[1].is_mem()) {
+ out->_operands[1].add_op_flags(MibRead);
+ }
+ return Error::kOk;
+ }
+ else {
+ out->_operands[0].reset(W | RegPhys, operands[0].x86_rm_size(), Gp::kIdDx);
+ out->_operands[1].reset(X | RegPhys, operands[1].x86_rm_size(), Gp::kIdAx);
+ out->_operands[2].reset(R | RegM, operands[2].x86_rm_size());
+
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ rw_zero_extend_gp(out->_operands[1], operands[1].as<Gp>(), native_gp_size);
+ if (operands[2].is_mem()) {
+ out->_operands[2].add_op_flags(MibRead);
+ }
+ return Error::kOk;
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryMovh64: {
+ // Special case for 'movhpd|movhps' instructions. Note that this is only required for legacy (non-AVX)
+ // variants as AVX instructions use either 2 or 3 operands that are in `kCategoryGeneric` category.
+ if (op_count == 2) {
+ if (operands[0].is_vec() && operands[1].is_mem()) {
+ out->_operands[0].reset(W, 8);
+ out->_operands[0].set_write_byte_mask(Support::lsb_mask<uint64_t>(8) << 8);
+ out->_operands[1].reset(R | MibRead, 8);
+ return Error::kOk;
+ }
+
+ if (operands[0].is_mem() && operands[1].is_vec()) {
+ out->_operands[0].reset(W | MibRead, 8);
+ out->_operands[1].reset(R, 8);
+ out->_operands[1].set_read_byte_mask(Support::lsb_mask<uint64_t>(8) << 8);
+ return Error::kOk;
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryPunpcklxx: {
+ // Special case for 'punpcklbw|punpckldq|punpcklwd' instructions.
+ if (op_count == 2) {
+ if (operands[0].is_vec128()) {
+ out->_operands[0].reset(X, 16);
+ out->_operands[0].set_read_byte_mask(0x0F0Fu);
+ out->_operands[0].set_write_byte_mask(0xFFFFu);
+ out->_operands[1].reset(R, 16);
+ out->_operands[1].set_write_byte_mask(0x0F0Fu);
+
+ if (operands[1].is_vec128()) {
+ return Error::kOk;
+ }
+
+ if (operands[1].is_mem()) {
+ out->_operands[1].add_op_flags(MibRead);
+ return Error::kOk;
+ }
+ }
+
+ if (operands[0].is_mm_reg()) {
+ out->_operands[0].reset(X, 8);
+ out->_operands[0].set_read_byte_mask(0x0Fu);
+ out->_operands[0].set_write_byte_mask(0xFFu);
+ out->_operands[1].reset(R, 4);
+ out->_operands[1].set_read_byte_mask(0x0Fu);
+
+ if (operands[1].is_mm_reg()) {
+ return Error::kOk;
+ }
+
+ if (operands[1].is_mem()) {
+ out->_operands[1].add_op_flags(MibRead);
+ return Error::kOk;
+ }
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryVmaskmov: {
+ // Special case for 'vmaskmovpd|vmaskmovps|vpmaskmovd|vpmaskmovq' instructions.
+ if (op_count == 3) {
+ if (operands[0].is_vec() && operands[1].is_vec() && operands[2].is_mem()) {
+ out->_operands[0].reset(W, operands[0].x86_rm_size());
+ out->_operands[1].reset(R, operands[1].x86_rm_size());
+ out->_operands[2].reset(R | MibRead, operands[1].x86_rm_size());
+
+ rw_zero_extend_avx_vec(out->_operands[0], operands[0].as<Vec>());
+ return Error::kOk;
+ }
+
+ if (operands[0].is_mem() && operands[1].is_vec() && operands[2].is_vec()) {
+ out->_operands[0].reset(X | MibRead, operands[1].x86_rm_size());
+ out->_operands[1].reset(R, operands[1].x86_rm_size());
+ out->_operands[2].reset(R, operands[2].x86_rm_size());
+ return Error::kOk;
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryVmovddup: {
+ // Special case for 'vmovddup' instruction. This instruction has an interesting semantic as 128-bit XMM
+ // version only uses 64-bit memory operand (m64), however, 256/512-bit versions use 256/512-bit memory
+ // operand, respectively.
+ if (op_count == 2) {
+ if (operands[0].is_vec() && operands[1].is_vec()) {
+ uint32_t o0_size = operands[0].x86_rm_size();
+ uint32_t o1_size = o0_size == 16 ? 8 : o0_size;
+
+ out->_operands[0].reset(W, o0_size);
+ out->_operands[1].reset(R | RegM, o1_size);
+ out->_operands[1]._read_byte_mask &= 0x00FF00FF00FF00FFu;
+
+ rw_zero_extend_avx_vec(out->_operands[0], operands[0].as<Vec>());
+ return rw_handle_avx512(inst, common_info, out);
+ }
+
+ if (operands[0].is_vec() && operands[1].is_mem()) {
+ uint32_t o0_size = operands[0].x86_rm_size();
+ uint32_t o1_size = o0_size == 16 ? 8 : o0_size;
+
+ out->_operands[0].reset(W, o0_size);
+ out->_operands[1].reset(R | MibRead, o1_size);
+
+ rw_zero_extend_avx_vec(out->_operands[0], operands[0].as<Vec>());
+ return rw_handle_avx512(inst, common_info, out);
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryVmovmskpd:
+ case InstDB::RWInfo::kCategoryVmovmskps: {
+ // Special case for 'vmovmskpd|vmovmskps' instructions.
+ if (op_count == 2) {
+ if (operands[0].is_gp() && operands[1].is_vec()) {
+ out->_operands[0].reset(W, 1);
+ out->_operands[0].set_extend_byte_mask(Support::lsb_mask<uint32_t>(native_gp_size - 1) << 1);
+ out->_operands[1].reset(R, operands[1].x86_rm_size());
+ return Error::kOk;
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryVmov1_2:
+ case InstDB::RWInfo::kCategoryVmov1_4:
+ case InstDB::RWInfo::kCategoryVmov1_8: {
+ // Special case for instructions where the destination is 1:N (narrowing).
+ //
+ // Vmov1_2:
+ // vcvtpd2dq|vcvttpd2dq
+ // vcvtpd2udq|vcvttpd2udq
+ // vcvtpd2ps|vcvtps2ph
+ // vcvtqq2ps|vcvtuqq2ps
+ // vpmovwb|vpmovswb|vpmovuswb
+ // vpmovdw|vpmovsdw|vpmovusdw
+ // vpmovqd|vpmovsqd|vpmovusqd
+ //
+ // Vmov1_4:
+ // vpmovdb|vpmovsdb|vpmovusdb
+ // vpmovqw|vpmovsqw|vpmovusqw
+ //
+ // Vmov1_8:
+ // pmovmskb|vpmovmskb
+ // vpmovqb|vpmovsqb|vpmovusqb
+ uint32_t shift = inst_rw_info.category - InstDB::RWInfo::kCategoryVmov1_2 + 1;
+
+ if (op_count >= 2) {
+ if (op_count >= 3) {
+ if (op_count > 3) {
+ return make_error(Error::kInvalidInstruction);
+ }
+ out->_operands[2].reset();
+ }
+
+ if (operands[0].is_reg() && operands[1].is_reg()) {
+ uint32_t size1 = operands[1].x86_rm_size();
+ uint32_t size0 = size1 >> shift;
+
+ out->_operands[0].reset(W, size0);
+ out->_operands[1].reset(R, size1);
+
+ if (inst_rm_info.rm_ops_mask & 0x1) {
+ out->_operands[0].add_op_flags(RegM);
+ out->_operands[0].set_rm_size(size0);
+ }
+
+ if (inst_rm_info.rm_ops_mask & 0x2) {
+ out->_operands[1].add_op_flags(RegM);
+ out->_operands[1].set_rm_size(size1);
+ }
+
+ // Handle 'pmovmskb|vpmovmskb'.
+ if (operands[0].is_gp()) {
+ rw_zero_extend_gp(out->_operands[0], operands[0].as<Gp>(), native_gp_size);
+ }
+
+ if (operands[0].is_vec()) {
+ rw_zero_extend_avx_vec(out->_operands[0], operands[0].as<Vec>());
+ }
+
+ return rw_handle_avx512(inst, common_info, out);
+ }
+
+ if (operands[0].is_reg() && operands[1].is_mem()) {
+ uint32_t size1 = operands[1].x86_rm_size() ? operands[1].x86_rm_size() : uint32_t(16);
+ uint32_t size0 = size1 >> shift;
+
+ out->_operands[0].reset(W, size0);
+ out->_operands[1].reset(R | MibRead, size1);
+
+ if (operands[0].is_vec()) {
+ rw_zero_extend_avx_vec(out->_operands[0], operands[0].as<Vec>());
+ }
+
+ return Error::kOk;
+ }
+
+ if (operands[0].is_mem() && operands[1].is_reg()) {
+ uint32_t size1 = operands[1].x86_rm_size();
+ uint32_t size0 = size1 >> shift;
+
+ out->_operands[0].reset(W | MibRead, size0);
+ out->_operands[1].reset(R, size1);
+
+ return rw_handle_avx512(inst, common_info, out);
+ }
+ }
+ break;
+ }
+
+ case InstDB::RWInfo::kCategoryVmov2_1:
+ case InstDB::RWInfo::kCategoryVmov4_1:
+ case InstDB::RWInfo::kCategoryVmov8_1: {
+ // Special case for instructions where the destination is N:1 (widening).
+ //
+ // Vmov2_1:
+ // vcvtdq2pd|vcvtudq2pd
+ // vcvtps2pd|vcvtph2ps
+ // vcvtps2qq|vcvtps2uqq
+ // vcvttps2qq|vcvttps2uqq
+ // vpmovsxbw|vpmovzxbw
+ // vpmovsxwd|vpmovzxwd
+ // vpmovsxdq|vpmovzxdq
+ //
+ // Vmov4_1:
+ // vpmovsxbd|vpmovzxbd
+ // vpmovsxwq|vpmovzxwq
+ //
+ // Vmov8_1:
+ // vpmovsxbq|vpmovzxbq
+ uint32_t shift = inst_rw_info.category - InstDB::RWInfo::kCategoryVmov2_1 + 1;
+
+ if (op_count >= 2) {
+ if (op_count >= 3) {
+ if (op_count > 3) {
+ return make_error(Error::kInvalidInstruction);
+ }
+ out->_operands[2].reset();
+ }
+
+ uint32_t size0 = operands[0].x86_rm_size();
+ uint32_t size1 = size0 >> shift;
+
+ out->_operands[0].reset(W, size0);
+ out->_operands[1].reset(R, size1);
+
+ if (operands[0].is_vec()) {
+ rw_zero_extend_avx_vec(out->_operands[0], operands[0].as<Vec>());
+ }
+
+ if (operands[0].is_reg() && operands[1].is_reg()) {
+ if (inst_rm_info.rm_ops_mask & 0x1) {
+ out->_operands[0].add_op_flags(RegM);
+ out->_operands[0].set_rm_size(size0);
+ }
+
+ if (inst_rm_info.rm_ops_mask & 0x2) {
+ out->_operands[1].add_op_flags(RegM);
+ out->_operands[1].set_rm_size(size1);
+ }
+
+ return rw_handle_avx512(inst, common_info, out);
+ }
+
+ if (operands[0].is_reg() && operands[1].is_mem()) {
+ out->_operands[1].add_op_flags(MibRead);
+
+ return rw_handle_avx512(inst, common_info, out);
+ }
+ }
+ break;
+ }
+ }
+
+ return make_error(Error::kInvalidInstruction);
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// x86::InstInternal - QueryFeatures
+// =================================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+struct RegAnalysis {
+ uint32_t reg_type_mask;
+ uint32_t high_vec_used;
+
+ inline bool has_reg_type(RegType reg_type) const noexcept {
+ return Support::bit_test(reg_type_mask, reg_type);
+ }
+};
+
+static RegAnalysis InstInternal_reg_analysis(const Operand_* operands, size_t op_count) noexcept {
+ uint32_t mask = 0;
+ uint32_t high_vec_used = 0;
+
+ for (uint32_t i = 0; i < op_count; i++) {
+ const Operand_& op = operands[i];
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ mask |= Support::bit_mask<uint32_t>(reg.reg_type());
+ if (reg.is_vec()) {
+ high_vec_used |= uint32_t(reg.id() >= 16 && reg.id() < 32);
+ }
+ }
+ else if (op.is_mem()) {
+ const BaseMem& mem = op.as<BaseMem>();
+ if (mem.has_base_reg()) {
+ mask |= Support::bit_mask<uint32_t>(mem.base_type());
+ }
+ if (mem.has_index_reg()) {
+ mask |= Support::bit_mask<uint32_t>(mem.index_type());
+ high_vec_used |= uint32_t(mem.index_id() >= 16 && mem.index_id() < 32);
+ }
+ }
+ }
+
+ return RegAnalysis { mask, high_vec_used };
+}
+
+static inline uint32_t InstInternal_usesAvx512(InstOptions inst_options, const RegOnly& extra_reg, const RegAnalysis& reg_analysis) noexcept {
+ uint32_t has_evex = uint32_t(inst_options & (InstOptions::kX86_Evex | InstOptions::kX86_AVX512Mask));
+ uint32_t has_kmask = extra_reg.type() == RegType::kMask;
+ uint32_t has_k_or_zmm = reg_analysis.reg_type_mask & Support::bit_mask<uint32_t>(RegType::kVec512, RegType::kMask);
+
+ return has_evex | has_kmask | has_k_or_zmm;
+}
+
+Error query_features(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, CpuFeatures* out) noexcept {
+ using Ext = CpuFeatures::X86;
+
+ // Only called when `arch` matches X86 family.
+ Support::maybe_unused(arch);
+ ASMJIT_ASSERT(Environment::is_family_x86(arch));
+
+ // Get the instruction data.
+ InstId inst_id = inst.inst_id();
+ InstOptions options = inst.options();
+
+ if (ASMJIT_UNLIKELY(!Inst::is_defined_id(inst_id))) {
+ return make_error(Error::kInvalidInstruction);
+ }
+
+ const InstDB::InstInfo& inst_info = InstDB::inst_info_by_id(inst_id);
+ const InstDB::AdditionalInfo& additional_info = InstDB::additional_info_table[inst_info._additional_info_index];
+
+ const uint8_t* feature_data = additional_info.features_begin();
+ const uint8_t* feature_data_end = additional_info.features_end();
+
+ // Copy all features to `out`.
+ out->reset();
+ do {
+ uint32_t feature = feature_data[0];
+ if (!feature) {
+ break;
+ }
+ out->add(feature);
+ } while (++feature_data != feature_data_end);
+
+ // Since AsmJit aggregates instructions that share the same name we have to
+ // deal with some special cases and also with MMX/SSE and AVX/AVX2 overlaps.
+ if (feature_data != additional_info.features_begin()) {
+ RegAnalysis reg_analysis = InstInternal_reg_analysis(operands, op_count);
+
+ // Handle MMX vs SSE overlap.
+ if (out->has(Ext::kMMX) || out->has(Ext::kMMX2)) {
+ // Only instructions defined by SSE and SSE2 overlap. Instructions introduced by newer instruction sets like
+ // SSE3+ don't state MMX as they require SSE3+.
+ if (out->has(Ext::kSSE) || out->has(Ext::kSSE2)) {
+ if (!reg_analysis.has_reg_type(RegType::kVec128)) {
+ // The instruction doesn't use XMM register(s), thus it's MMX/MMX2 only.
+ out->remove(Ext::kSSE);
+ out->remove(Ext::kSSE2);
+ out->remove(Ext::kSSE4_1);
+ }
+ else {
+ out->remove(Ext::kMMX);
+ out->remove(Ext::kMMX2);
+ }
+
+ // Special case: PEXTRW instruction is MMX/SSE2 instruction. However, MMX/SSE version cannot access memory
+ // (only register to register extract) so when SSE4.1 introduced the whole family of PEXTR/PINSR instructions
+ // they also introduced PEXTRW with a new opcode 0x15 that can extract directly to memory. This instruction
+ // is, of course, not compatible with MMX/SSE2 and would #UD if SSE4.1 is not supported.
+ if (inst_id == Inst::kIdPextrw) {
+ if (op_count >= 1 && operands[0].is_mem())
+ out->remove(Ext::kSSE2);
+ else
+ out->remove(Ext::kSSE4_1);
+ }
+ }
+ }
+
+ // Handle PCLMULQDQ vs VPCLMULQDQ.
+ if (out->has(Ext::kVPCLMULQDQ)) {
+ if (reg_analysis.has_reg_type(RegType::kVec512) || Support::test(options, InstOptions::kX86_Evex)) {
+ // AVX512_F & VPCLMULQDQ.
+ out->remove(Ext::kAVX, Ext::kPCLMULQDQ);
+ }
+ else if (reg_analysis.has_reg_type(RegType::kVec256)) {
+ out->remove(Ext::kAVX512_F, Ext::kAVX512_VL);
+ }
+ else {
+ // AVX & PCLMULQDQ.
+ out->remove(Ext::kAVX512_F, Ext::kAVX512_VL, Ext::kVPCLMULQDQ);
+ }
+ }
+
+ // Handle AVX vs AVX2 overlap.
+ if (out->has(Ext::kAVX) && out->has(Ext::kAVX2)) {
+ bool is_avx2 = true;
+ // Special case: VBROADCASTSS and VBROADCASTSD were introduced in AVX, but only version that uses memory as a
+ // source operand. AVX2 then added support for register source operand.
+ if (inst_id == Inst::kIdVbroadcastss || inst_id == Inst::kIdVbroadcastsd) {
+ if (op_count > 1 && operands[1].is_mem()) {
+ is_avx2 = false;
+ }
+ }
+ else {
+ // AVX instruction set doesn't support integer operations on YMM registers as these were later introcuced by
+ // AVX2. In our case we have to check if YMM register(s) are in use and if that is the case this is an AVX2
+ // instruction.
+ if (!(reg_analysis.reg_type_mask & Support::bit_mask<uint32_t>(RegType::kVec256, RegType::kVec512))) {
+ is_avx2 = false;
+ }
+ }
+ out->remove(is_avx2 ? Ext::kAVX : Ext::kAVX2);
+ }
+
+ // Handle AVX vs AVX512 overlap.
+ //
+ // In general, non-AVX encoding is preferred, however, AVX encoded instructions that were initially provided
+ // as AVX-512 instructions must naturally prefer AVX-512 encoding, as that was the first one provided.
+ if (out->has_any(Ext::kAVX,
+ Ext::kAVX_IFMA,
+ Ext::kAVX_NE_CONVERT,
+ Ext::kAVX_VNNI,
+ Ext::kAVX2,
+ Ext::kF16C,
+ Ext::kFMA) &&
+ out->has_any(Ext::kAVX512_BF16,
+ Ext::kAVX512_BW,
+ Ext::kAVX512_DQ,
+ Ext::kAVX512_F,
+ Ext::kAVX512_IFMA,
+ Ext::kAVX512_VNNI)) {
+ uint32_t use_evex = InstInternal_usesAvx512(options, inst.extra_reg(), reg_analysis) | reg_analysis.high_vec_used;
+ switch (inst_id) {
+ // Special case: VPBROADCAST[B|D|Q|W] only supports r32/r64 with EVEX prefix.
+ case Inst::kIdVpbroadcastb:
+ case Inst::kIdVpbroadcastd:
+ case Inst::kIdVpbroadcastq:
+ case Inst::kIdVpbroadcastw:
+ use_evex |= uint32_t(op_count >= 2 && operands[1].is_gp());
+ break;
+
+ case Inst::kIdVcvtpd2dq:
+ case Inst::kIdVcvtpd2ps:
+ case Inst::kIdVcvttpd2dq:
+ use_evex |= uint32_t(op_count >= 2 && operands[0].is_vec256());
+ break;
+
+ case Inst::kIdVgatherdpd:
+ case Inst::kIdVgatherdps:
+ case Inst::kIdVgatherqpd:
+ case Inst::kIdVgatherqps:
+ case Inst::kIdVpgatherdd:
+ case Inst::kIdVpgatherdq:
+ case Inst::kIdVpgatherqd:
+ case Inst::kIdVpgatherqq:
+ use_evex |= uint32_t(op_count == 2);
+ break;
+
+ // Special case: These instructions only allow `reg, reg. imm` combination in AVX|AVX2 mode, then
+ // AVX-512 introduced `reg, reg/mem, imm` combination that uses EVEX prefix. This means that if
+ // the second operand is memory then this is AVX-512_BW instruction and not AVX/AVX2 instruction.
+ case Inst::kIdVpslldq:
+ case Inst::kIdVpslld:
+ case Inst::kIdVpsllq:
+ case Inst::kIdVpsllw:
+ case Inst::kIdVpsrad:
+ case Inst::kIdVpsraq:
+ case Inst::kIdVpsraw:
+ case Inst::kIdVpsrld:
+ case Inst::kIdVpsrldq:
+ case Inst::kIdVpsrlq:
+ case Inst::kIdVpsrlw:
+ use_evex |= uint32_t(op_count >= 2 && operands[1].is_mem());
+ break;
+
+ // Special case: VPERMPD - AVX2 vs AVX512-F case.
+ case Inst::kIdVpermpd:
+ use_evex |= uint32_t(op_count >= 3 && !operands[2].is_imm());
+ break;
+
+ // Special case: VPERMQ - AVX2 vs AVX512-F case.
+ case Inst::kIdVpermq:
+ use_evex |= uint32_t(op_count >= 3 && (operands[1].is_mem() || !operands[2].is_imm()));
+ break;
+ }
+
+ if (inst_info.common_info().prefer_evex() && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3))
+ use_evex = 1;
+
+ if (use_evex) {
+ out->remove(Ext::kAVX,
+ Ext::kAVX_IFMA,
+ Ext::kAVX_NE_CONVERT,
+ Ext::kAVX_VNNI,
+ Ext::kAVX2,
+ Ext::kF16C,
+ Ext::kFMA);
+ }
+ else {
+ out->remove(Ext::kAVX512_BF16,
+ Ext::kAVX512_BW,
+ Ext::kAVX512_DQ,
+ Ext::kAVX512_F,
+ Ext::kAVX512_IFMA,
+ Ext::kAVX512_VL,
+ Ext::kAVX512_VNNI);
+ }
+ }
+
+ // Clear AVX512_VL if ZMM register is used.
+ if (reg_analysis.has_reg_type(RegType::kVec512)) {
+ out->remove(Ext::kAVX512_VL);
+ }
+ }
+
+ return Error::kOk;
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+} // {InstInternal}
+
+// x86::InstInternal - Tests
+// =========================
+
+#if defined(ASMJIT_TEST)
+#ifndef ASMJIT_NO_TEXT
+UNIT(x86_inst_api_text) {
+ // All known instructions should be matched.
+ INFO("Matching all X86 instructions");
+ for (uint32_t a = 1; a < Inst::_kIdCount; a++) {
+ StringTmp<128> a_name;
+ EXPECT_EQ(InstInternal::inst_id_to_string(a, InstStringifyOptions::kNone, a_name), Error::kOk)
+ .message("Failed to get the name of instruction #%u", a);
+
+ uint32_t b = InstInternal::string_to_inst_id(a_name.data(), a_name.size());
+ StringTmp<128> b_name;
+ InstInternal::inst_id_to_string(b, InstStringifyOptions::kNone, b_name);
+ EXPECT_EQ(a, b)
+ .message("Instructions do not match \"%s\" (#%u) != \"%s\" (#%u)", a_name.data(), a, b_name.data(), b);
+ }
+}
+#endif // !ASMJIT_NO_TEXT
+
+#ifndef ASMJIT_NO_INTROSPECTION
+template<typename... Args>
+static Error query_features_inline(CpuFeatures* out, Arch arch, BaseInst inst, Args&&... args) {
+ Operand_ op_array[] = { std::forward<Args>(args)... };
+ return InstInternal::query_features(arch, inst, op_array, sizeof...(args), out);
+}
+
+UNIT(x86_inst_api_cpu_features) {
+ INFO("Verifying whether SSE2+ features are reported correctly for legacy instructions");
+ {
+ CpuFeatures f;
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdPaddd), xmm1, xmm2);
+ EXPECT_TRUE(f.x86().has_sse2());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdAddsubpd), xmm1, xmm2);
+ EXPECT_TRUE(f.x86().has_sse3());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdPshufb), xmm1, xmm2);
+ EXPECT_TRUE(f.x86().has_ssse3());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdBlendpd), xmm1, xmm2, Imm(1));
+ EXPECT_TRUE(f.x86().has_sse4_1());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdCrc32), eax, al);
+ EXPECT_TRUE(f.x86().has_sse4_2());
+ }
+
+ INFO("Verifying whether AVX+ features are reported correctly for AVX instructions");
+ {
+ CpuFeatures f;
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpaddd), xmm1, xmm2, xmm3);
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpaddd), ymm1, ymm2, ymm3);
+ EXPECT_TRUE(f.x86().has_avx2());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVaddsubpd), xmm1, xmm2, xmm3);
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVaddsubpd), ymm1, ymm2, ymm3);
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpshufb), xmm1, xmm2, xmm3);
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpshufb), ymm1, ymm2, ymm3);
+ EXPECT_TRUE(f.x86().has_avx2());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVblendpd), xmm1, xmm2, xmm3, Imm(1));
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVblendpd), ymm1, ymm2, ymm3, Imm(1));
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpunpcklbw), xmm1, xmm2, xmm3);
+ EXPECT_TRUE(f.x86().has_avx());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpunpcklbw), ymm1, ymm2, ymm3);
+ EXPECT_TRUE(f.x86().has_avx2());
+ }
+
+ INFO("Verifying whether AVX2 / AVX512 features are reported correctly for vpgatherxx instructions");
+ {
+ CpuFeatures f;
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd), xmm1, ptr(rax, xmm2), xmm3);
+ EXPECT_TRUE(f.x86().has_avx2());
+ EXPECT_FALSE(f.x86().has_avx512_f());
+
+ // NOTE: This instruction is unencodable, but sometimes this signature is used to check the support (without the {k}).
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd), xmm1, ptr(rax, xmm2));
+ EXPECT_FALSE(f.x86().has_avx2());
+ EXPECT_TRUE(f.x86().has_avx512_f());
+
+ query_features_inline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd, InstOptions::kNone, k1), xmm1, ptr(rax, xmm2));
+ EXPECT_FALSE(f.x86().has_avx2());
+ EXPECT_TRUE(f.x86().has_avx512_f());
+ }
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+#ifndef ASMJIT_NO_INTROSPECTION
+template<typename... Args>
+static Error query_rw_info_inline(InstRWInfo* out, Arch arch, BaseInst inst, Args&&... args) {
+ Operand_ op_array[] = { std::forward<Args>(args)... };
+ return InstInternal::query_rw_info(arch, inst, op_array, sizeof...(args), out);
+}
+
+UNIT(x86_inst_api_rm_features) {
+ INFO("Verifying whether RM/feature is reported correctly for PEXTRW instruction");
+ {
+ InstRWInfo rwi;
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdPextrw), eax, mm1, imm(1));
+ EXPECT_EQ(rwi.rm_feature(), 0u);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdPextrw), eax, xmm1, imm(1));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kSSE4_1);
+ }
+
+ INFO("Verifying whether RM/feature is reported correctly for AVX512 shift instructions");
+ {
+ InstRWInfo rwi;
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslld), xmm1, xmm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_F);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllq), ymm1, ymm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_F);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrad), xmm1, xmm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_F);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrld), ymm1, ymm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_F);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrlq), xmm1, xmm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_F);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslldq), xmm1, xmm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_BW);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllw), ymm1, ymm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_BW);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsraw), xmm1, xmm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_BW);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrldq), ymm1, ymm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_BW);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrlw), xmm1, xmm2, imm(8));
+ EXPECT_EQ(rwi.rm_feature(), CpuFeatures::X86::kAVX512_BW);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslld), xmm1, xmm2, xmm3);
+ EXPECT_EQ(rwi.rm_feature(), 0u);
+
+ query_rw_info_inline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllw), xmm1, xmm2, xmm3);
+ EXPECT_EQ(rwi.rm_feature(), 0u);
+ }
+}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+#endif // ASMJIT_TEST
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit/x86/x86instapi_p.h b/3rdparty/asmjit/asmjit/x86/x86instapi_p.h
new file mode 100644
index 00000000000..6c1d072952e
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86instapi_p.h
@@ -0,0 +1,39 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
+#define ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
+
+#include <asmjit/core/inst.h>
+#include <asmjit/core/operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+namespace InstInternal {
+
+#ifndef ASMJIT_NO_TEXT
+Error ASMJIT_CDECL inst_id_to_string(InstId inst_id, InstStringifyOptions options, String& output) noexcept;
+InstId ASMJIT_CDECL string_to_inst_id(const char* s, size_t len) noexcept;
+#endif // !ASMJIT_NO_TEXT
+
+#ifndef ASMJIT_NO_INTROSPECTION
+Error ASMJIT_CDECL validate_x86(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept;
+Error ASMJIT_CDECL validate_x64(const BaseInst& inst, const Operand_* operands, size_t op_count, ValidationFlags validation_flags) noexcept;
+Error ASMJIT_CDECL query_rw_info(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, InstRWInfo* out) noexcept;
+Error ASMJIT_CDECL query_features(Arch arch, const BaseInst& inst, const Operand_* operands, size_t op_count, CpuFeatures* out) noexcept;
+#endif // !ASMJIT_NO_INTROSPECTION
+
+} // {InstInternal}
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86instdb.cpp b/3rdparty/asmjit/asmjit/x86/x86instdb.cpp
new file mode 100644
index 00000000000..238d6f6edc6
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86instdb.cpp
@@ -0,0 +1,6182 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/misc_p.h>
+#include <asmjit/support/support.h>
+#include <asmjit/x86/x86instdb_p.h>
+#include <asmjit/x86/x86opcode_p.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::InstDB - InstInfo
+// ======================
+
+// Instruction opcode definitions:
+// - `O` encodes X86|MMX|SSE instructions.
+// - `V` encodes VEX|XOP|EVEX instructions.
+// - `E` encodes EVEX instructions only.
+#define O_ENCODE(PREFIX, OPCODE, O, L, W, EvexW, N, TT) ((PREFIX) | (OPCODE) | (O) | (L) | (W) | (EvexW) | (N) | (TT))
+
+#define O(PREFIX, OPCODE, ModO, LL, W, EvexW, N, ModRM) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kModRM_##ModRM))
+#define V(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT))
+#define E(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT) | Opcode::kMM_ForceEvex)
+#define O_FPU(PREFIX, OPCODE, ModO) (Opcode::kFPU_##PREFIX | (0x##OPCODE & 0xFFu) | ((0x##OPCODE >> 8) << Opcode::kFPU_2B_Shift) | Opcode::kModO_##ModO)
+
+// Defines an X86 instruction.
+#define INST(id, encoding, opcode0, opcode1, main_opcode_index, alt_opcode_index, common_info_index, additional_info_index) { \
+ uint32_t(0), \
+ uint32_t(common_info_index), \
+ uint32_t(additional_info_index), \
+ uint8_t(InstDB::kEncoding##encoding), \
+ uint8_t((opcode0) & 0xFFu), \
+ uint8_t(main_opcode_index), \
+ uint8_t(alt_opcode_index) \
+}
+
+const InstDB::InstInfo InstDB::_inst_info_table[] = {
+ /*--------------------+--------------------+------------------+--------+------------------+--------+----+----+----+----+
+ | Instruction | Instruction | Main Opcode | EVEX |Alternative Opcode| EVEX |Op0X|Op1X|IdxA|IdxB|
+ | Id & Name | Encoding | (pp+mmm|op/o|L|w|W|N|TT.)|--(pp+mmm|op/o|L|w|W|N|TT.)| (auto-generated) |
+ +---------------------+--------------------+---------+----+-+-+-+-+----+---------+----+-+-+-+-+----+----+----+----+---*/
+ // ${InstInfo:Begin}
+ INST(None , None , 0 , 0 , 0 , 0 , 0 , 0 ), // #0
+ INST(Aaa , X86Op_xAX , O(000000,37,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #1
+ INST(Aad , X86I_xAX , O(000000,D5,_,_,_,_,_,_ ), 0 , 0 , 0 , 2 , 1 ), // #2
+ INST(Aadd , X86Mr , O(000F38,FC,_,_,_,_,_,_ ), 0 , 1 , 0 , 3 , 2 ), // #3
+ INST(Aam , X86I_xAX , O(000000,D4,_,_,_,_,_,_ ), 0 , 0 , 0 , 2 , 1 ), // #4
+ INST(Aand , X86Mr , O(660F38,FC,_,_,_,_,_,_ ), 0 , 2 , 0 , 3 , 2 ), // #5
+ INST(Aas , X86Op_xAX , O(000000,3F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #6
+ INST(Adc , X86Arith , O(000000,10,2,_,x,_,_,_ ), 0 , 3 , 0 , 4 , 3 ), // #7
+ INST(Adcx , X86Rm , O(660F38,F6,_,_,x,_,_,_ ), 0 , 2 , 0 , 5 , 4 ), // #8
+ INST(Add , X86Arith , O(000000,00,0,_,x,_,_,_ ), 0 , 0 , 0 , 4 , 1 ), // #9
+ INST(Addpd , ExtRm , O(660F00,58,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #10
+ INST(Addps , ExtRm , O(000F00,58,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #11
+ INST(Addsd , ExtRm , O(F20F00,58,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #12
+ INST(Addss , ExtRm , O(F30F00,58,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #13
+ INST(Addsubpd , ExtRm , O(660F00,D0,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #14
+ INST(Addsubps , ExtRm , O(F20F00,D0,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #15
+ INST(Adox , X86Rm , O(F30F38,F6,_,_,x,_,_,_ ), 0 , 8 , 0 , 5 , 8 ), // #16
+ INST(Aesdec , ExtRm , O(660F38,DE,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #17
+ INST(Aesdeclast , ExtRm , O(660F38,DF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #18
+ INST(Aesenc , ExtRm , O(660F38,DC,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #19
+ INST(Aesenclast , ExtRm , O(660F38,DD,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #20
+ INST(Aesimc , ExtRm , O(660F38,DB,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #21
+ INST(Aeskeygenassist , ExtRmi , O(660F3A,DF,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 9 ), // #22
+ INST(And , X86Arith , O(000000,20,4,_,x,_,_,_ ), 0 , 10 , 0 , 10 , 1 ), // #23
+ INST(Andn , VexRvm_Wx , V(000F38,F2,_,0,x,_,_,_ ), 0 , 11 , 0 , 11 , 10 ), // #24
+ INST(Andnpd , ExtRm , O(660F00,55,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #25
+ INST(Andnps , ExtRm , O(000F00,55,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #26
+ INST(Andpd , ExtRm , O(660F00,54,_,_,_,_,_,_ ), 0 , 4 , 0 , 12 , 5 ), // #27
+ INST(Andps , ExtRm , O(000F00,54,_,_,_,_,_,_ ), 0 , 5 , 0 , 12 , 6 ), // #28
+ INST(Aor , X86Mr , O(F20F38,FC,_,_,_,_,_,_ ), 0 , 12 , 0 , 3 , 2 ), // #29
+ INST(Arpl , X86Mr_NoSize , O(000000,63,_,_,_,_,_,_ ), 0 , 0 , 0 , 13 , 11 ), // #30
+ INST(Axor , X86Mr , O(F30F38,FC,_,_,_,_,_,_ ), 0 , 8 , 0 , 3 , 2 ), // #31
+ INST(Bextr , VexRmv_Wx , V(000F38,F7,_,0,x,_,_,_ ), 0 , 11 , 0 , 14 , 10 ), // #32
+ INST(Blcfill , VexVm_Wx , V(XOP_M9,01,1,0,x,_,_,_ ), 0 , 13 , 0 , 15 , 12 ), // #33
+ INST(Blci , VexVm_Wx , V(XOP_M9,02,6,0,x,_,_,_ ), 0 , 14 , 0 , 15 , 12 ), // #34
+ INST(Blcic , VexVm_Wx , V(XOP_M9,01,5,0,x,_,_,_ ), 0 , 15 , 0 , 15 , 12 ), // #35
+ INST(Blcmsk , VexVm_Wx , V(XOP_M9,02,1,0,x,_,_,_ ), 0 , 13 , 0 , 15 , 12 ), // #36
+ INST(Blcs , VexVm_Wx , V(XOP_M9,01,3,0,x,_,_,_ ), 0 , 16 , 0 , 15 , 12 ), // #37
+ INST(Blendpd , ExtRmi , O(660F3A,0D,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #38
+ INST(Blendps , ExtRmi , O(660F3A,0C,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #39
+ INST(Blendvpd , ExtRm_XMM0 , O(660F38,15,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #40
+ INST(Blendvps , ExtRm_XMM0 , O(660F38,14,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #41
+ INST(Blsfill , VexVm_Wx , V(XOP_M9,01,2,0,x,_,_,_ ), 0 , 17 , 0 , 15 , 12 ), // #42
+ INST(Blsi , VexVm_Wx , V(000F38,F3,3,0,x,_,_,_ ), 0 , 18 , 0 , 15 , 10 ), // #43
+ INST(Blsic , VexVm_Wx , V(XOP_M9,01,6,0,x,_,_,_ ), 0 , 14 , 0 , 15 , 12 ), // #44
+ INST(Blsmsk , VexVm_Wx , V(000F38,F3,2,0,x,_,_,_ ), 0 , 19 , 0 , 15 , 10 ), // #45
+ INST(Blsr , VexVm_Wx , V(000F38,F3,1,0,x,_,_,_ ), 0 , 20 , 0 , 15 , 10 ), // #46
+ INST(Bndcl , X86Rm , O(F30F00,1A,_,_,_,_,_,_ ), 0 , 7 , 0 , 17 , 14 ), // #47
+ INST(Bndcn , X86Rm , O(F20F00,1B,_,_,_,_,_,_ ), 0 , 6 , 0 , 17 , 14 ), // #48
+ INST(Bndcu , X86Rm , O(F20F00,1A,_,_,_,_,_,_ ), 0 , 6 , 0 , 17 , 14 ), // #49
+ INST(Bndldx , X86Rm , O(000F00,1A,_,_,_,_,_,_ ), 0 , 5 , 0 , 18 , 14 ), // #50
+ INST(Bndmk , X86Rm , O(F30F00,1B,_,_,_,_,_,_ ), 0 , 7 , 0 , 19 , 14 ), // #51
+ INST(Bndmov , X86Bndmov , O(660F00,1A,_,_,_,_,_,_ ), O(660F00,1B,_,_,_,_,_,_ ), 4 , 1 , 20 , 14 ), // #52
+ INST(Bndstx , X86Mr , O(000F00,1B,_,_,_,_,_,_ ), 0 , 5 , 0 , 21 , 14 ), // #53
+ INST(Bound , X86Rm , O(000000,62,_,_,_,_,_,_ ), 0 , 0 , 0 , 22 , 0 ), // #54
+ INST(Bsf , X86Rm , O(000F00,BC,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 1 ), // #55
+ INST(Bsr , X86Rm , O(000F00,BD,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 1 ), // #56
+ INST(Bswap , X86Bswap , O(000F00,C8,_,_,x,_,_,_ ), 0 , 5 , 0 , 24 , 0 ), // #57
+ INST(Bt , X86Bt , O(000F00,A3,_,_,x,_,_,_ ), O(000F00,BA,4,_,x,_,_,_ ), 5 , 2 , 25 , 15 ), // #58
+ INST(Btc , X86Bt , O(000F00,BB,_,_,x,_,_,_ ), O(000F00,BA,7,_,x,_,_,_ ), 5 , 3 , 26 , 15 ), // #59
+ INST(Btr , X86Bt , O(000F00,B3,_,_,x,_,_,_ ), O(000F00,BA,6,_,x,_,_,_ ), 5 , 4 , 26 , 15 ), // #60
+ INST(Bts , X86Bt , O(000F00,AB,_,_,x,_,_,_ ), O(000F00,BA,5,_,x,_,_,_ ), 5 , 5 , 26 , 15 ), // #61
+ INST(Bzhi , VexRmv_Wx , V(000F38,F5,_,0,x,_,_,_ ), 0 , 11 , 0 , 14 , 16 ), // #62
+ INST(Call , X86Call , O(000000,FF,2,_,_,_,_,_ ), 0 , 3 , 0 , 27 , 1 ), // #63
+ INST(Cbw , X86Op_xAX , O(660000,98,_,_,_,_,_,_ ), 0 , 21 , 0 , 28 , 0 ), // #64
+ INST(Cdq , X86Op_xDX_xAX , O(000000,99,_,_,_,_,_,_ ), 0 , 0 , 0 , 29 , 0 ), // #65
+ INST(Cdqe , X86Op_xAX , O(000000,98,_,_,1,_,_,_ ), 0 , 22 , 0 , 30 , 0 ), // #66
+ INST(Clac , X86Op , O(000F01,CA,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 17 ), // #67
+ INST(Clc , X86Op , O(000000,F8,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 18 ), // #68
+ INST(Cld , X86Op , O(000000,FC,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 19 ), // #69
+ INST(Cldemote , X86M_Only , O(000F00,1C,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 20 ), // #70
+ INST(Clflush , X86M_Only , O(000F00,AE,7,_,_,_,_,_ ), 0 , 24 , 0 , 32 , 21 ), // #71
+ INST(Clflushopt , X86M_Only , O(660F00,AE,7,_,_,_,_,_ ), 0 , 25 , 0 , 32 , 22 ), // #72
+ INST(Clgi , X86Op , O(000F01,DD,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 23 ), // #73
+ INST(Cli , X86Op , O(000000,FA,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 24 ), // #74
+ INST(Clrssbsy , X86M_Only , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 33 , 25 ), // #75
+ INST(Clts , X86Op , O(000F00,06,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #76
+ INST(Clui , X86Op , O(F30F01,EE,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #77
+ INST(Clwb , X86M_Only , O(660F00,AE,6,_,_,_,_,_ ), 0 , 28 , 0 , 32 , 27 ), // #78
+ INST(Clzero , X86Op_MemZAX , O(000F01,FC,_,_,_,_,_,_ ), 0 , 23 , 0 , 35 , 28 ), // #79
+ INST(Cmc , X86Op , O(000000,F5,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 29 ), // #80
+ INST(Cmovb , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #81
+ INST(Cmovbe , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #82
+ INST(Cmovl , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #83
+ INST(Cmovle , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #84
+ INST(Cmovnb , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #85
+ INST(Cmovnbe , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #86
+ INST(Cmovnl , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #87
+ INST(Cmovnle , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #88
+ INST(Cmovno , X86Rm , O(000F00,41,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #89
+ INST(Cmovnp , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 35 ), // #90
+ INST(Cmovns , X86Rm , O(000F00,49,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #91
+ INST(Cmovnz , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 37 ), // #92
+ INST(Cmovo , X86Rm , O(000F00,40,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #93
+ INST(Cmovp , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 35 ), // #94
+ INST(Cmovs , X86Rm , O(000F00,48,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #95
+ INST(Cmovz , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 37 ), // #96
+ INST(Cmp , X86Arith , O(000000,38,7,_,x,_,_,_ ), 0 , 29 , 0 , 36 , 1 ), // #97
+ INST(Cmpbexadd , VexMvr_Wx , V(660F38,E6,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #98
+ INST(Cmpbxadd , VexMvr_Wx , V(660F38,E2,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #99
+ INST(Cmplexadd , VexMvr_Wx , V(660F38,EE,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #100
+ INST(Cmplxadd , VexMvr_Wx , V(660F38,EC,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #101
+ INST(Cmpnbexadd , VexMvr_Wx , V(660F38,E7,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #102
+ INST(Cmpnbxadd , VexMvr_Wx , V(660F38,E3,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #103
+ INST(Cmpnlexadd , VexMvr_Wx , V(660F38,EF,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #104
+ INST(Cmpnlxadd , VexMvr_Wx , V(660F38,ED,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #105
+ INST(Cmpnoxadd , VexMvr_Wx , V(660F38,E1,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #106
+ INST(Cmpnpxadd , VexMvr_Wx , V(660F38,EB,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #107
+ INST(Cmpnsxadd , VexMvr_Wx , V(660F38,E9,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #108
+ INST(Cmpnzxadd , VexMvr_Wx , V(660F38,E5,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #109
+ INST(Cmpoxadd , VexMvr_Wx , V(660F38,E0,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #110
+ INST(Cmppd , ExtRmi , O(660F00,C2,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #111
+ INST(Cmpps , ExtRmi , O(000F00,C2,_,_,_,_,_,_ ), 0 , 5 , 0 , 9 , 6 ), // #112
+ INST(Cmppxadd , VexMvr_Wx , V(660F38,EA,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #113
+ INST(Cmps , X86StrMm , O(000000,A6,_,_,_,_,_,_ ), 0 , 0 , 0 , 38 , 39 ), // #114
+ INST(Cmpsd , ExtRmi , O(F20F00,C2,_,_,_,_,_,_ ), 0 , 6 , 0 , 39 , 5 ), // #115
+ INST(Cmpss , ExtRmi , O(F30F00,C2,_,_,_,_,_,_ ), 0 , 7 , 0 , 40 , 6 ), // #116
+ INST(Cmpsxadd , VexMvr_Wx , V(660F38,E8,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #117
+ INST(Cmpxchg , X86Cmpxchg , O(000F00,B0,_,_,x,_,_,_ ), 0 , 5 , 0 , 41 , 40 ), // #118
+ INST(Cmpxchg16b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,1,_,_,_ ), 0 , 31 , 0 , 42 , 41 ), // #119
+ INST(Cmpxchg8b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,_,_,_,_ ), 0 , 32 , 0 , 43 , 42 ), // #120
+ INST(Cmpzxadd , VexMvr_Wx , V(660F38,E4,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #121
+ INST(Comisd , ExtRm , O(660F00,2F,_,_,_,_,_,_ ), 0 , 4 , 0 , 7 , 43 ), // #122
+ INST(Comiss , ExtRm , O(000F00,2F,_,_,_,_,_,_ ), 0 , 5 , 0 , 8 , 44 ), // #123
+ INST(Cpuid , X86Op , O(000F00,A2,_,_,_,_,_,_ ), 0 , 5 , 0 , 44 , 45 ), // #124
+ INST(Cqo , X86Op_xDX_xAX , O(000000,99,_,_,1,_,_,_ ), 0 , 22 , 0 , 45 , 0 ), // #125
+ INST(Crc32 , X86Crc , O(F20F38,F0,_,_,x,_,_,_ ), 0 , 12 , 0 , 46 , 46 ), // #126
+ INST(Cvtdq2pd , ExtRm , O(F30F00,E6,_,_,_,_,_,_ ), 0 , 7 , 0 , 7 , 5 ), // #127
+ INST(Cvtdq2ps , ExtRm , O(000F00,5B,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 5 ), // #128
+ INST(Cvtpd2dq , ExtRm , O(F20F00,E6,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 5 ), // #129
+ INST(Cvtpd2pi , ExtRm , O(660F00,2D,_,_,_,_,_,_ ), 0 , 4 , 0 , 47 , 5 ), // #130
+ INST(Cvtpd2ps , ExtRm , O(660F00,5A,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #131
+ INST(Cvtpi2pd , ExtRm , O(660F00,2A,_,_,_,_,_,_ ), 0 , 4 , 0 , 48 , 5 ), // #132
+ INST(Cvtpi2ps , ExtRm , O(000F00,2A,_,_,_,_,_,_ ), 0 , 5 , 0 , 48 , 6 ), // #133
+ INST(Cvtps2dq , ExtRm , O(660F00,5B,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #134
+ INST(Cvtps2pd , ExtRm , O(000F00,5A,_,_,_,_,_,_ ), 0 , 5 , 0 , 7 , 5 ), // #135
+ INST(Cvtps2pi , ExtRm , O(000F00,2D,_,_,_,_,_,_ ), 0 , 5 , 0 , 49 , 6 ), // #136
+ INST(Cvtsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2D,_,_,x,_,_,_ ), 0 , 6 , 0 , 50 , 5 ), // #137
+ INST(Cvtsd2ss , ExtRm , O(F20F00,5A,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #138
+ INST(Cvtsi2sd , ExtRm_Wx , O(F20F00,2A,_,_,x,_,_,_ ), 0 , 6 , 0 , 51 , 5 ), // #139
+ INST(Cvtsi2ss , ExtRm_Wx , O(F30F00,2A,_,_,x,_,_,_ ), 0 , 7 , 0 , 51 , 6 ), // #140
+ INST(Cvtss2sd , ExtRm , O(F30F00,5A,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 5 ), // #141
+ INST(Cvtss2si , ExtRm_Wx_GpqOnly , O(F30F00,2D,_,_,x,_,_,_ ), 0 , 7 , 0 , 52 , 6 ), // #142
+ INST(Cvttpd2dq , ExtRm , O(660F00,E6,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #143
+ INST(Cvttpd2pi , ExtRm , O(660F00,2C,_,_,_,_,_,_ ), 0 , 4 , 0 , 47 , 5 ), // #144
+ INST(Cvttps2dq , ExtRm , O(F30F00,5B,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 5 ), // #145
+ INST(Cvttps2pi , ExtRm , O(000F00,2C,_,_,_,_,_,_ ), 0 , 5 , 0 , 49 , 6 ), // #146
+ INST(Cvttsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2C,_,_,x,_,_,_ ), 0 , 6 , 0 , 50 , 5 ), // #147
+ INST(Cvttss2si , ExtRm_Wx_GpqOnly , O(F30F00,2C,_,_,x,_,_,_ ), 0 , 7 , 0 , 52 , 6 ), // #148
+ INST(Cwd , X86Op_xDX_xAX , O(660000,99,_,_,_,_,_,_ ), 0 , 21 , 0 , 53 , 0 ), // #149
+ INST(Cwde , X86Op_xAX , O(000000,98,_,_,_,_,_,_ ), 0 , 0 , 0 , 54 , 0 ), // #150
+ INST(Daa , X86Op , O(000000,27,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #151
+ INST(Das , X86Op , O(000000,2F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #152
+ INST(Dec , X86IncDec , O(000000,FE,1,_,x,_,_,_ ), O(000000,48,_,_,x,_,_,_ ), 33 , 6 , 55 , 47 ), // #153
+ INST(Div , X86M_GPB_MulDiv , O(000000,F6,6,_,x,_,_,_ ), 0 , 34 , 0 , 56 , 1 ), // #154
+ INST(Divpd , ExtRm , O(660F00,5E,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #155
+ INST(Divps , ExtRm , O(000F00,5E,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #156
+ INST(Divsd , ExtRm , O(F20F00,5E,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #157
+ INST(Divss , ExtRm , O(F30F00,5E,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #158
+ INST(Dppd , ExtRmi , O(660F3A,41,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #159
+ INST(Dpps , ExtRmi , O(660F3A,40,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #160
+ INST(Emms , X86Op , O(000F00,77,_,_,_,_,_,_ ), 0 , 5 , 0 , 57 , 48 ), // #161
+ INST(Endbr32 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,3 ), 0 , 35 , 0 , 31 , 49 ), // #162
+ INST(Endbr64 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,2 ), 0 , 36 , 0 , 31 , 49 ), // #163
+ INST(Enqcmd , X86EnqcmdMovdir64b , O(F20F38,F8,_,_,_,_,_,_ ), 0 , 12 , 0 , 58 , 50 ), // #164
+ INST(Enqcmds , X86EnqcmdMovdir64b , O(F30F38,F8,_,_,_,_,_,_ ), 0 , 8 , 0 , 58 , 50 ), // #165
+ INST(Enter , X86Enter , O(000000,C8,_,_,_,_,_,_ ), 0 , 0 , 0 , 59 , 0 ), // #166
+ INST(Extractps , ExtExtract , O(660F3A,17,_,_,_,_,_,_ ), 0 , 9 , 0 , 60 , 13 ), // #167
+ INST(Extrq , ExtExtrq , O(660F00,79,_,_,_,_,_,_ ), O(660F00,78,0,_,_,_,_,_ ), 4 , 7 , 61 , 51 ), // #168
+ INST(F2xm1 , FpuOp , O_FPU(00,D9F0,_) , 0 , 37 , 0 , 31 , 52 ), // #169
+ INST(Fabs , FpuOp , O_FPU(00,D9E1,_) , 0 , 37 , 0 , 31 , 52 ), // #170
+ INST(Fadd , FpuArith , O_FPU(00,C0C0,0) , 0 , 38 , 0 , 62 , 52 ), // #171
+ INST(Faddp , FpuRDef , O_FPU(00,DEC0,_) , 0 , 39 , 0 , 63 , 52 ), // #172
+ INST(Fbld , X86M_Only , O_FPU(00,00DF,4) , 0 , 40 , 0 , 64 , 52 ), // #173
+ INST(Fbstp , X86M_Only , O_FPU(00,00DF,6) , 0 , 41 , 0 , 64 , 52 ), // #174
+ INST(Fchs , FpuOp , O_FPU(00,D9E0,_) , 0 , 37 , 0 , 31 , 52 ), // #175
+ INST(Fclex , FpuOp , O_FPU(9B,DBE2,_) , 0 , 42 , 0 , 31 , 52 ), // #176
+ INST(Fcmovb , FpuR , O_FPU(00,DAC0,_) , 0 , 43 , 0 , 65 , 53 ), // #177
+ INST(Fcmovbe , FpuR , O_FPU(00,DAD0,_) , 0 , 43 , 0 , 65 , 54 ), // #178
+ INST(Fcmove , FpuR , O_FPU(00,DAC8,_) , 0 , 43 , 0 , 65 , 55 ), // #179
+ INST(Fcmovnb , FpuR , O_FPU(00,DBC0,_) , 0 , 44 , 0 , 65 , 53 ), // #180
+ INST(Fcmovnbe , FpuR , O_FPU(00,DBD0,_) , 0 , 44 , 0 , 65 , 54 ), // #181
+ INST(Fcmovne , FpuR , O_FPU(00,DBC8,_) , 0 , 44 , 0 , 65 , 55 ), // #182
+ INST(Fcmovnu , FpuR , O_FPU(00,DBD8,_) , 0 , 44 , 0 , 65 , 56 ), // #183
+ INST(Fcmovu , FpuR , O_FPU(00,DAD8,_) , 0 , 43 , 0 , 65 , 56 ), // #184
+ INST(Fcom , FpuCom , O_FPU(00,D0D0,2) , 0 , 45 , 0 , 66 , 52 ), // #185
+ INST(Fcomi , FpuR , O_FPU(00,DBF0,_) , 0 , 44 , 0 , 65 , 57 ), // #186
+ INST(Fcomip , FpuR , O_FPU(00,DFF0,_) , 0 , 46 , 0 , 65 , 57 ), // #187
+ INST(Fcomp , FpuCom , O_FPU(00,D8D8,3) , 0 , 47 , 0 , 66 , 52 ), // #188
+ INST(Fcompp , FpuOp , O_FPU(00,DED9,_) , 0 , 39 , 0 , 31 , 52 ), // #189
+ INST(Fcos , FpuOp , O_FPU(00,D9FF,_) , 0 , 37 , 0 , 31 , 52 ), // #190
+ INST(Fdecstp , FpuOp , O_FPU(00,D9F6,_) , 0 , 37 , 0 , 31 , 52 ), // #191
+ INST(Fdiv , FpuArith , O_FPU(00,F0F8,6) , 0 , 48 , 0 , 62 , 52 ), // #192
+ INST(Fdivp , FpuRDef , O_FPU(00,DEF8,_) , 0 , 39 , 0 , 63 , 52 ), // #193
+ INST(Fdivr , FpuArith , O_FPU(00,F8F0,7) , 0 , 49 , 0 , 62 , 52 ), // #194
+ INST(Fdivrp , FpuRDef , O_FPU(00,DEF0,_) , 0 , 39 , 0 , 63 , 52 ), // #195
+ INST(Femms , X86Op , O(000F00,0E,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 58 ), // #196
+ INST(Ffree , FpuR , O_FPU(00,DDC0,_) , 0 , 50 , 0 , 65 , 52 ), // #197
+ INST(Fiadd , FpuM , O_FPU(00,00DA,0) , 0 , 51 , 0 , 67 , 52 ), // #198
+ INST(Ficom , FpuM , O_FPU(00,00DA,2) , 0 , 52 , 0 , 67 , 52 ), // #199
+ INST(Ficomp , FpuM , O_FPU(00,00DA,3) , 0 , 53 , 0 , 67 , 52 ), // #200
+ INST(Fidiv , FpuM , O_FPU(00,00DA,6) , 0 , 41 , 0 , 67 , 52 ), // #201
+ INST(Fidivr , FpuM , O_FPU(00,00DA,7) , 0 , 54 , 0 , 67 , 52 ), // #202
+ INST(Fild , FpuM , O_FPU(00,00DB,0) , O_FPU(00,00DF,5) , 51 , 8 , 68 , 52 ), // #203
+ INST(Fimul , FpuM , O_FPU(00,00DA,1) , 0 , 55 , 0 , 67 , 52 ), // #204
+ INST(Fincstp , FpuOp , O_FPU(00,D9F7,_) , 0 , 37 , 0 , 31 , 52 ), // #205
+ INST(Finit , FpuOp , O_FPU(9B,DBE3,_) , 0 , 42 , 0 , 31 , 52 ), // #206
+ INST(Fist , FpuM , O_FPU(00,00DB,2) , 0 , 52 , 0 , 67 , 52 ), // #207
+ INST(Fistp , FpuM , O_FPU(00,00DB,3) , O_FPU(00,00DF,7) , 53 , 9 , 68 , 52 ), // #208
+ INST(Fisttp , FpuM , O_FPU(00,00DB,1) , O_FPU(00,00DD,1) , 55 , 10 , 68 , 59 ), // #209
+ INST(Fisub , FpuM , O_FPU(00,00DA,4) , 0 , 40 , 0 , 67 , 52 ), // #210
+ INST(Fisubr , FpuM , O_FPU(00,00DA,5) , 0 , 56 , 0 , 67 , 52 ), // #211
+ INST(Fld , FpuFldFst , O_FPU(00,00D9,0) , O_FPU(00,00DB,5) , 51 , 11 , 69 , 52 ), // #212
+ INST(Fld1 , FpuOp , O_FPU(00,D9E8,_) , 0 , 37 , 0 , 31 , 52 ), // #213
+ INST(Fldcw , X86M_Only , O_FPU(00,00D9,5) , 0 , 56 , 0 , 70 , 52 ), // #214
+ INST(Fldenv , X86M_Only , O_FPU(00,00D9,4) , 0 , 40 , 0 , 32 , 52 ), // #215
+ INST(Fldl2e , FpuOp , O_FPU(00,D9EA,_) , 0 , 37 , 0 , 31 , 52 ), // #216
+ INST(Fldl2t , FpuOp , O_FPU(00,D9E9,_) , 0 , 37 , 0 , 31 , 52 ), // #217
+ INST(Fldlg2 , FpuOp , O_FPU(00,D9EC,_) , 0 , 37 , 0 , 31 , 52 ), // #218
+ INST(Fldln2 , FpuOp , O_FPU(00,D9ED,_) , 0 , 37 , 0 , 31 , 52 ), // #219
+ INST(Fldpi , FpuOp , O_FPU(00,D9EB,_) , 0 , 37 , 0 , 31 , 52 ), // #220
+ INST(Fldz , FpuOp , O_FPU(00,D9EE,_) , 0 , 37 , 0 , 31 , 52 ), // #221
+ INST(Fmul , FpuArith , O_FPU(00,C8C8,1) , 0 , 57 , 0 , 62 , 52 ), // #222
+ INST(Fmulp , FpuRDef , O_FPU(00,DEC8,_) , 0 , 39 , 0 , 63 , 52 ), // #223
+ INST(Fnclex , FpuOp , O_FPU(00,DBE2,_) , 0 , 44 , 0 , 31 , 52 ), // #224
+ INST(Fninit , FpuOp , O_FPU(00,DBE3,_) , 0 , 44 , 0 , 31 , 52 ), // #225
+ INST(Fnop , FpuOp , O_FPU(00,D9D0,_) , 0 , 37 , 0 , 31 , 52 ), // #226
+ INST(Fnsave , X86M_Only , O_FPU(00,00DD,6) , 0 , 41 , 0 , 32 , 52 ), // #227
+ INST(Fnstcw , X86M_Only , O_FPU(00,00D9,7) , 0 , 54 , 0 , 70 , 52 ), // #228
+ INST(Fnstenv , X86M_Only , O_FPU(00,00D9,6) , 0 , 41 , 0 , 32 , 52 ), // #229
+ INST(Fnstsw , FpuStsw , O_FPU(00,00DD,7) , O_FPU(00,DFE0,_) , 54 , 12 , 71 , 52 ), // #230
+ INST(Fpatan , FpuOp , O_FPU(00,D9F3,_) , 0 , 37 , 0 , 31 , 52 ), // #231
+ INST(Fprem , FpuOp , O_FPU(00,D9F8,_) , 0 , 37 , 0 , 31 , 52 ), // #232
+ INST(Fprem1 , FpuOp , O_FPU(00,D9F5,_) , 0 , 37 , 0 , 31 , 52 ), // #233
+ INST(Fptan , FpuOp , O_FPU(00,D9F2,_) , 0 , 37 , 0 , 31 , 52 ), // #234
+ INST(Frndint , FpuOp , O_FPU(00,D9FC,_) , 0 , 37 , 0 , 31 , 52 ), // #235
+ INST(Frstor , X86M_Only , O_FPU(00,00DD,4) , 0 , 40 , 0 , 32 , 52 ), // #236
+ INST(Fsave , X86M_Only , O_FPU(9B,00DD,6) , 0 , 58 , 0 , 32 , 52 ), // #237
+ INST(Fscale , FpuOp , O_FPU(00,D9FD,_) , 0 , 37 , 0 , 31 , 52 ), // #238
+ INST(Fsin , FpuOp , O_FPU(00,D9FE,_) , 0 , 37 , 0 , 31 , 52 ), // #239
+ INST(Fsincos , FpuOp , O_FPU(00,D9FB,_) , 0 , 37 , 0 , 31 , 52 ), // #240
+ INST(Fsqrt , FpuOp , O_FPU(00,D9FA,_) , 0 , 37 , 0 , 31 , 52 ), // #241
+ INST(Fst , FpuFldFst , O_FPU(00,00D9,2) , 0 , 52 , 0 , 72 , 52 ), // #242
+ INST(Fstcw , X86M_Only , O_FPU(9B,00D9,7) , 0 , 59 , 0 , 70 , 52 ), // #243
+ INST(Fstenv , X86M_Only , O_FPU(9B,00D9,6) , 0 , 58 , 0 , 32 , 52 ), // #244
+ INST(Fstp , FpuFldFst , O_FPU(00,00D9,3) , O(000000,DB,7,_,_,_,_,_ ), 53 , 13 , 69 , 52 ), // #245
+ INST(Fstsw , FpuStsw , O_FPU(9B,00DD,7) , O_FPU(9B,DFE0,_) , 59 , 14 , 71 , 52 ), // #246
+ INST(Fsub , FpuArith , O_FPU(00,E0E8,4) , 0 , 60 , 0 , 62 , 52 ), // #247
+ INST(Fsubp , FpuRDef , O_FPU(00,DEE8,_) , 0 , 39 , 0 , 63 , 52 ), // #248
+ INST(Fsubr , FpuArith , O_FPU(00,E8E0,5) , 0 , 61 , 0 , 62 , 52 ), // #249
+ INST(Fsubrp , FpuRDef , O_FPU(00,DEE0,_) , 0 , 39 , 0 , 63 , 52 ), // #250
+ INST(Ftst , FpuOp , O_FPU(00,D9E4,_) , 0 , 37 , 0 , 31 , 52 ), // #251
+ INST(Fucom , FpuRDef , O_FPU(00,DDE0,_) , 0 , 50 , 0 , 63 , 52 ), // #252
+ INST(Fucomi , FpuR , O_FPU(00,DBE8,_) , 0 , 44 , 0 , 65 , 57 ), // #253
+ INST(Fucomip , FpuR , O_FPU(00,DFE8,_) , 0 , 46 , 0 , 65 , 57 ), // #254
+ INST(Fucomp , FpuRDef , O_FPU(00,DDE8,_) , 0 , 50 , 0 , 63 , 52 ), // #255
+ INST(Fucompp , FpuOp , O_FPU(00,DAE9,_) , 0 , 43 , 0 , 31 , 52 ), // #256
+ INST(Fwait , X86Op , O_FPU(00,009B,_) , 0 , 51 , 0 , 31 , 52 ), // #257
+ INST(Fxam , FpuOp , O_FPU(00,D9E5,_) , 0 , 37 , 0 , 31 , 52 ), // #258
+ INST(Fxch , FpuR , O_FPU(00,D9C8,_) , 0 , 37 , 0 , 63 , 52 ), // #259
+ INST(Fxrstor , X86M_Only , O(000F00,AE,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 60 ), // #260
+ INST(Fxrstor64 , X86M_Only , O(000F00,AE,1,_,1,_,_,_ ), 0 , 31 , 0 , 73 , 60 ), // #261
+ INST(Fxsave , X86M_Only , O(000F00,AE,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 61 ), // #262
+ INST(Fxsave64 , X86M_Only , O(000F00,AE,0,_,1,_,_,_ ), 0 , 62 , 0 , 73 , 61 ), // #263
+ INST(Fxtract , FpuOp , O_FPU(00,D9F4,_) , 0 , 37 , 0 , 31 , 52 ), // #264
+ INST(Fyl2x , FpuOp , O_FPU(00,D9F1,_) , 0 , 37 , 0 , 31 , 52 ), // #265
+ INST(Fyl2xp1 , FpuOp , O_FPU(00,D9F9,_) , 0 , 37 , 0 , 31 , 52 ), // #266
+ INST(Getsec , X86Op , O(000F00,37,_,_,_,_,_,_ ), 0 , 5 , 0 , 74 , 62 ), // #267
+ INST(Gf2p8affineinvqb , ExtRmi , O(660F3A,CF,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 63 ), // #268
+ INST(Gf2p8affineqb , ExtRmi , O(660F3A,CE,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 63 ), // #269
+ INST(Gf2p8mulb , ExtRm , O(660F38,CF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 63 ), // #270
+ INST(Haddpd , ExtRm , O(660F00,7C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #271
+ INST(Haddps , ExtRm , O(F20F00,7C,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #272
+ INST(Hlt , X86Op , O(000000,F4,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #273
+ INST(Hreset , X86Op_Mod11RM_I8 , O(F30F3A,F0,0,_,_,_,_,_ ), 0 , 63 , 0 , 75 , 64 ), // #274
+ INST(Hsubpd , ExtRm , O(660F00,7D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #275
+ INST(Hsubps , ExtRm , O(F20F00,7D,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #276
+ INST(Idiv , X86M_GPB_MulDiv , O(000000,F6,7,_,x,_,_,_ ), 0 , 29 , 0 , 56 , 1 ), // #277
+ INST(Imul , X86Imul , O(000000,F6,5,_,x,_,_,_ ), 0 , 64 , 0 , 76 , 1 ), // #278
+ INST(In , X86In , O(000000,EC,_,_,_,_,_,_ ), O(000000,E4,_,_,_,_,_,_ ), 0 , 15 , 77 , 0 ), // #279
+ INST(Inc , X86IncDec , O(000000,FE,0,_,x,_,_,_ ), O(000000,40,_,_,x,_,_,_ ), 0 , 16 , 78 , 47 ), // #280
+ INST(Incsspd , X86M , O(F30F00,AE,5,_,0,_,_,_ ), 0 , 65 , 0 , 79 , 65 ), // #281
+ INST(Incsspq , X86M , O(F30F00,AE,5,_,1,_,_,_ ), 0 , 66 , 0 , 80 , 65 ), // #282
+ INST(Ins , X86Ins , O(000000,6C,_,_,_,_,_,_ ), 0 , 0 , 0 , 81 , 0 ), // #283
+ INST(Insertps , ExtRmi , O(660F3A,21,_,_,_,_,_,_ ), 0 , 9 , 0 , 40 , 13 ), // #284
+ INST(Insertq , ExtInsertq , O(F20F00,79,_,_,_,_,_,_ ), O(F20F00,78,_,_,_,_,_,_ ), 6 , 17 , 82 , 51 ), // #285
+ INST(Int , X86Int , O(000000,CD,_,_,_,_,_,_ ), 0 , 0 , 0 , 83 , 0 ), // #286
+ INST(Int3 , X86Op , O(000000,CC,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #287
+ INST(Into , X86Op , O(000000,CE,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 66 ), // #288
+ INST(Invd , X86Op , O(000F00,08,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 45 ), // #289
+ INST(Invept , X86Rm_NoSize , O(660F38,80,_,_,_,_,_,_ ), 0 , 2 , 0 , 85 , 67 ), // #290
+ INST(Invlpg , X86M_Only , O(000F00,01,7,_,_,_,_,_ ), 0 , 24 , 0 , 32 , 45 ), // #291
+ INST(Invlpga , X86Op_xAddr , O(000F01,DF,_,_,_,_,_,_ ), 0 , 23 , 0 , 86 , 23 ), // #292
+ INST(Invlpgb , X86Op , O(000F01,FE,_,_,_,_,_,_ ), 0 , 23 , 0 , 87 , 68 ), // #293
+ INST(Invpcid , X86Rm_NoSize , O(660F38,82,_,_,_,_,_,_ ), 0 , 2 , 0 , 85 , 45 ), // #294
+ INST(Invvpid , X86Rm_NoSize , O(660F38,81,_,_,_,_,_,_ ), 0 , 2 , 0 , 85 , 67 ), // #295
+ INST(Iret , X86Op , O(660000,CF,_,_,_,_,_,_ ), 0 , 21 , 0 , 88 , 1 ), // #296
+ INST(Iretd , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 88 , 1 ), // #297
+ INST(Iretq , X86Op , O(000000,CF,_,_,1,_,_,_ ), 0 , 22 , 0 , 89 , 1 ), // #298
+ INST(Jb , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 18 , 90 , 69 ), // #299
+ INST(Jbe , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 5 , 19 , 90 , 70 ), // #300
+ INST(Jecxz , X86JecxzLoop , 0 , O(000000,E3,_,_,_,_,_,_ ), 0 , 20 , 91 , 0 ), // #301
+ INST(Jl , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 5 , 21 , 90 , 71 ), // #302
+ INST(Jle , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 5 , 22 , 90 , 72 ), // #303
+ INST(Jmp , X86Jmp , O(000000,FF,4,_,_,_,_,_ ), O(000000,EB,_,_,_,_,_,_ ), 10 , 23 , 92 , 0 ), // #304
+ INST(Jnb , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 24 , 90 , 69 ), // #305
+ INST(Jnbe , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 5 , 25 , 90 , 70 ), // #306
+ INST(Jnl , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 5 , 26 , 90 , 71 ), // #307
+ INST(Jnle , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 5 , 27 , 90 , 72 ), // #308
+ INST(Jno , X86Jcc , O(000F00,81,_,_,_,_,_,_ ), O(000000,71,_,_,_,_,_,_ ), 5 , 28 , 90 , 66 ), // #309
+ INST(Jnp , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 5 , 29 , 90 , 73 ), // #310
+ INST(Jns , X86Jcc , O(000F00,89,_,_,_,_,_,_ ), O(000000,79,_,_,_,_,_,_ ), 5 , 30 , 90 , 74 ), // #311
+ INST(Jnz , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 5 , 31 , 90 , 75 ), // #312
+ INST(Jo , X86Jcc , O(000F00,80,_,_,_,_,_,_ ), O(000000,70,_,_,_,_,_,_ ), 5 , 32 , 90 , 66 ), // #313
+ INST(Jp , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 5 , 33 , 90 , 73 ), // #314
+ INST(Js , X86Jcc , O(000F00,88,_,_,_,_,_,_ ), O(000000,78,_,_,_,_,_,_ ), 5 , 34 , 90 , 74 ), // #315
+ INST(Jz , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 5 , 35 , 90 , 75 ), // #316
+ INST(Kaddb , VexRvm , V(660F00,4A,_,1,0,_,_,_ ), 0 , 67 , 0 , 93 , 76 ), // #317
+ INST(Kaddd , VexRvm , V(660F00,4A,_,1,1,_,_,_ ), 0 , 68 , 0 , 93 , 77 ), // #318
+ INST(Kaddq , VexRvm , V(000F00,4A,_,1,1,_,_,_ ), 0 , 69 , 0 , 93 , 77 ), // #319
+ INST(Kaddw , VexRvm , V(000F00,4A,_,1,0,_,_,_ ), 0 , 70 , 0 , 93 , 76 ), // #320
+ INST(Kandb , VexRvm , V(660F00,41,_,1,0,_,_,_ ), 0 , 67 , 0 , 93 , 76 ), // #321
+ INST(Kandd , VexRvm , V(660F00,41,_,1,1,_,_,_ ), 0 , 68 , 0 , 93 , 77 ), // #322
+ INST(Kandnb , VexRvm , V(660F00,42,_,1,0,_,_,_ ), 0 , 67 , 0 , 93 , 76 ), // #323
+ INST(Kandnd , VexRvm , V(660F00,42,_,1,1,_,_,_ ), 0 , 68 , 0 , 93 , 77 ), // #324
+ INST(Kandnq , VexRvm , V(000F00,42,_,1,1,_,_,_ ), 0 , 69 , 0 , 93 , 77 ), // #325
+ INST(Kandnw , VexRvm , V(000F00,42,_,1,0,_,_,_ ), 0 , 70 , 0 , 93 , 78 ), // #326
+ INST(Kandq , VexRvm , V(000F00,41,_,1,1,_,_,_ ), 0 , 69 , 0 , 93 , 77 ), // #327
+ INST(Kandw , VexRvm , V(000F00,41,_,1,0,_,_,_ ), 0 , 70 , 0 , 93 , 78 ), // #328
+ INST(Kmovb , VexKmov , V(660F00,90,_,0,0,_,_,_ ), V(660F00,92,_,0,0,_,_,_ ), 71 , 36 , 94 , 79 ), // #329
+ INST(Kmovd , VexKmov , V(660F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,0,_,_,_ ), 72 , 37 , 95 , 80 ), // #330
+ INST(Kmovq , VexKmov , V(000F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,1,_,_,_ ), 73 , 38 , 96 , 80 ), // #331
+ INST(Kmovw , VexKmov , V(000F00,90,_,0,0,_,_,_ ), V(000F00,92,_,0,0,_,_,_ ), 74 , 39 , 97 , 81 ), // #332
+ INST(Knotb , VexRm , V(660F00,44,_,0,0,_,_,_ ), 0 , 71 , 0 , 98 , 76 ), // #333
+ INST(Knotd , VexRm , V(660F00,44,_,0,1,_,_,_ ), 0 , 72 , 0 , 98 , 77 ), // #334
+ INST(Knotq , VexRm , V(000F00,44,_,0,1,_,_,_ ), 0 , 73 , 0 , 98 , 77 ), // #335
+ INST(Knotw , VexRm , V(000F00,44,_,0,0,_,_,_ ), 0 , 74 , 0 , 98 , 78 ), // #336
+ INST(Korb , VexRvm , V(660F00,45,_,1,0,_,_,_ ), 0 , 67 , 0 , 93 , 76 ), // #337
+ INST(Kord , VexRvm , V(660F00,45,_,1,1,_,_,_ ), 0 , 68 , 0 , 93 , 77 ), // #338
+ INST(Korq , VexRvm , V(000F00,45,_,1,1,_,_,_ ), 0 , 69 , 0 , 93 , 77 ), // #339
+ INST(Kortestb , VexRm , V(660F00,98,_,0,0,_,_,_ ), 0 , 71 , 0 , 98 , 82 ), // #340
+ INST(Kortestd , VexRm , V(660F00,98,_,0,1,_,_,_ ), 0 , 72 , 0 , 98 , 83 ), // #341
+ INST(Kortestq , VexRm , V(000F00,98,_,0,1,_,_,_ ), 0 , 73 , 0 , 98 , 83 ), // #342
+ INST(Kortestw , VexRm , V(000F00,98,_,0,0,_,_,_ ), 0 , 74 , 0 , 98 , 84 ), // #343
+ INST(Korw , VexRvm , V(000F00,45,_,1,0,_,_,_ ), 0 , 70 , 0 , 93 , 78 ), // #344
+ INST(Kshiftlb , VexRmi , V(660F3A,32,_,0,0,_,_,_ ), 0 , 75 , 0 , 99 , 76 ), // #345
+ INST(Kshiftld , VexRmi , V(660F3A,33,_,0,0,_,_,_ ), 0 , 75 , 0 , 99 , 77 ), // #346
+ INST(Kshiftlq , VexRmi , V(660F3A,33,_,0,1,_,_,_ ), 0 , 76 , 0 , 99 , 77 ), // #347
+ INST(Kshiftlw , VexRmi , V(660F3A,32,_,0,1,_,_,_ ), 0 , 76 , 0 , 99 , 78 ), // #348
+ INST(Kshiftrb , VexRmi , V(660F3A,30,_,0,0,_,_,_ ), 0 , 75 , 0 , 99 , 76 ), // #349
+ INST(Kshiftrd , VexRmi , V(660F3A,31,_,0,0,_,_,_ ), 0 , 75 , 0 , 99 , 77 ), // #350
+ INST(Kshiftrq , VexRmi , V(660F3A,31,_,0,1,_,_,_ ), 0 , 76 , 0 , 99 , 77 ), // #351
+ INST(Kshiftrw , VexRmi , V(660F3A,30,_,0,1,_,_,_ ), 0 , 76 , 0 , 99 , 78 ), // #352
+ INST(Ktestb , VexRm , V(660F00,99,_,0,0,_,_,_ ), 0 , 71 , 0 , 98 , 82 ), // #353
+ INST(Ktestd , VexRm , V(660F00,99,_,0,1,_,_,_ ), 0 , 72 , 0 , 98 , 83 ), // #354
+ INST(Ktestq , VexRm , V(000F00,99,_,0,1,_,_,_ ), 0 , 73 , 0 , 98 , 83 ), // #355
+ INST(Ktestw , VexRm , V(000F00,99,_,0,0,_,_,_ ), 0 , 74 , 0 , 98 , 82 ), // #356
+ INST(Kunpckbw , VexRvm , V(660F00,4B,_,1,0,_,_,_ ), 0 , 67 , 0 , 93 , 78 ), // #357
+ INST(Kunpckdq , VexRvm , V(000F00,4B,_,1,1,_,_,_ ), 0 , 69 , 0 , 93 , 77 ), // #358
+ INST(Kunpckwd , VexRvm , V(000F00,4B,_,1,0,_,_,_ ), 0 , 70 , 0 , 93 , 77 ), // #359
+ INST(Kxnorb , VexRvm , V(660F00,46,_,1,0,_,_,_ ), 0 , 67 , 0 , 100, 76 ), // #360
+ INST(Kxnord , VexRvm , V(660F00,46,_,1,1,_,_,_ ), 0 , 68 , 0 , 100, 77 ), // #361
+ INST(Kxnorq , VexRvm , V(000F00,46,_,1,1,_,_,_ ), 0 , 69 , 0 , 100, 77 ), // #362
+ INST(Kxnorw , VexRvm , V(000F00,46,_,1,0,_,_,_ ), 0 , 70 , 0 , 100, 78 ), // #363
+ INST(Kxorb , VexRvm , V(660F00,47,_,1,0,_,_,_ ), 0 , 67 , 0 , 100, 76 ), // #364
+ INST(Kxord , VexRvm , V(660F00,47,_,1,1,_,_,_ ), 0 , 68 , 0 , 100, 77 ), // #365
+ INST(Kxorq , VexRvm , V(000F00,47,_,1,1,_,_,_ ), 0 , 69 , 0 , 100, 77 ), // #366
+ INST(Kxorw , VexRvm , V(000F00,47,_,1,0,_,_,_ ), 0 , 70 , 0 , 100, 78 ), // #367
+ INST(Lahf , X86Op , O(000000,9F,_,_,_,_,_,_ ), 0 , 0 , 0 , 101, 85 ), // #368
+ INST(Lar , X86Rm , O(000F00,02,_,_,_,_,_,_ ), 0 , 5 , 0 , 102, 11 ), // #369
+ INST(Lcall , X86LcallLjmp , O(000000,FF,3,_,_,_,_,_ ), O(000000,9A,_,_,_,_,_,_ ), 77 , 40 , 103, 1 ), // #370
+ INST(Lddqu , ExtRm , O(F20F00,F0,_,_,_,_,_,_ ), 0 , 6 , 0 , 104, 7 ), // #371
+ INST(Ldmxcsr , X86M_Only , O(000F00,AE,2,_,_,_,_,_ ), 0 , 78 , 0 , 105, 6 ), // #372
+ INST(Lds , X86Rm , O(000000,C5,_,_,_,_,_,_ ), 0 , 0 , 0 , 106, 0 ), // #373
+ INST(Ldtilecfg , AmxCfg , V(000F38,49,_,0,0,_,_,_ ), 0 , 11 , 0 , 107, 86 ), // #374
+ INST(Lea , X86Lea , O(000000,8D,_,_,x,_,_,_ ), 0 , 0 , 0 , 108, 0 ), // #375
+ INST(Leave , X86Op , O(000000,C9,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #376
+ INST(Les , X86Rm , O(000000,C4,_,_,_,_,_,_ ), 0 , 0 , 0 , 106, 0 ), // #377
+ INST(Lfence , X86Fence , O(000F00,AE,5,_,_,_,_,_ ), 0 , 79 , 0 , 31 , 5 ), // #378
+ INST(Lfs , X86Rm , O(000F00,B4,_,_,_,_,_,_ ), 0 , 5 , 0 , 109, 0 ), // #379
+ INST(Lgdt , X86M_Only , O(000F00,01,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 0 ), // #380
+ INST(Lgs , X86Rm , O(000F00,B5,_,_,_,_,_,_ ), 0 , 5 , 0 , 109, 0 ), // #381
+ INST(Lidt , X86M_Only , O(000F00,01,3,_,_,_,_,_ ), 0 , 80 , 0 , 32 , 0 ), // #382
+ INST(Ljmp , X86LcallLjmp , O(000000,FF,5,_,_,_,_,_ ), O(000000,EA,_,_,_,_,_,_ ), 64 , 41 , 110, 0 ), // #383
+ INST(Lldt , X86M_NoSize , O(000F00,00,2,_,_,_,_,_ ), 0 , 78 , 0 , 111, 0 ), // #384
+ INST(Llwpcb , VexR_Wx , V(XOP_M9,12,0,0,x,_,_,_ ), 0 , 81 , 0 , 112, 87 ), // #385
+ INST(Lmsw , X86M_NoSize , O(000F00,01,6,_,_,_,_,_ ), 0 , 82 , 0 , 111, 0 ), // #386
+ INST(Lods , X86StrRm , O(000000,AC,_,_,_,_,_,_ ), 0 , 0 , 0 , 113, 88 ), // #387
+ INST(Loop , X86JecxzLoop , 0 , O(000000,E2,_,_,_,_,_,_ ), 0 , 42 , 114, 0 ), // #388
+ INST(Loope , X86JecxzLoop , 0 , O(000000,E1,_,_,_,_,_,_ ), 0 , 43 , 114, 75 ), // #389
+ INST(Loopne , X86JecxzLoop , 0 , O(000000,E0,_,_,_,_,_,_ ), 0 , 44 , 114, 75 ), // #390
+ INST(Lsl , X86Rm , O(000F00,03,_,_,_,_,_,_ ), 0 , 5 , 0 , 115, 11 ), // #391
+ INST(Lss , X86Rm , O(000F00,B2,_,_,_,_,_,_ ), 0 , 5 , 0 , 109, 0 ), // #392
+ INST(Ltr , X86M_NoSize , O(000F00,00,3,_,_,_,_,_ ), 0 , 80 , 0 , 111, 0 ), // #393
+ INST(Lwpins , VexVmi4_Wx , V(XOP_MA,12,0,0,x,_,_,_ ), 0 , 83 , 0 , 116, 87 ), // #394
+ INST(Lwpval , VexVmi4_Wx , V(XOP_MA,12,1,0,x,_,_,_ ), 0 , 84 , 0 , 116, 87 ), // #395
+ INST(Lzcnt , X86Rm_Raw66H , O(F30F00,BD,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 89 ), // #396
+ INST(Maskmovdqu , ExtRm_ZDI , O(660F00,F7,_,_,_,_,_,_ ), 0 , 4 , 0 , 117, 5 ), // #397
+ INST(Maskmovq , ExtRm_ZDI , O(000F00,F7,_,_,_,_,_,_ ), 0 , 5 , 0 , 118, 90 ), // #398
+ INST(Maxpd , ExtRm , O(660F00,5F,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #399
+ INST(Maxps , ExtRm , O(000F00,5F,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #400
+ INST(Maxsd , ExtRm , O(F20F00,5F,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #401
+ INST(Maxss , ExtRm , O(F30F00,5F,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #402
+ INST(Mcommit , X86Op , O(F30F01,FA,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 91 ), // #403
+ INST(Mfence , X86Fence , O(000F00,AE,6,_,_,_,_,_ ), 0 , 82 , 0 , 31 , 5 ), // #404
+ INST(Minpd , ExtRm , O(660F00,5D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #405
+ INST(Minps , ExtRm , O(000F00,5D,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #406
+ INST(Minsd , ExtRm , O(F20F00,5D,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #407
+ INST(Minss , ExtRm , O(F30F00,5D,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #408
+ INST(Monitor , X86Op , O(000F01,C8,_,_,_,_,_,_ ), 0 , 23 , 0 , 119, 92 ), // #409
+ INST(Monitorx , X86Op , O(000F01,FA,_,_,_,_,_,_ ), 0 , 23 , 0 , 119, 93 ), // #410
+ INST(Mov , X86Mov , 0 , 0 , 0 , 0 , 120, 94 ), // #411
+ INST(Movabs , X86Movabs , 0 , 0 , 0 , 0 , 121, 0 ), // #412
+ INST(Movapd , ExtMov , O(660F00,28,_,_,_,_,_,_ ), O(660F00,29,_,_,_,_,_,_ ), 4 , 45 , 122, 95 ), // #413
+ INST(Movaps , ExtMov , O(000F00,28,_,_,_,_,_,_ ), O(000F00,29,_,_,_,_,_,_ ), 5 , 46 , 122, 96 ), // #414
+ INST(Movbe , ExtMovbe , O(000F38,F0,_,_,x,_,_,_ ), O(000F38,F1,_,_,x,_,_,_ ), 1 , 47 , 123, 97 ), // #415
+ INST(Movd , ExtMovd , O(000F00,6E,_,_,_,_,_,_ ), O(000F00,7E,_,_,_,_,_,_ ), 5 , 48 , 124, 98 ), // #416
+ INST(Movddup , ExtMov , O(F20F00,12,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 7 ), // #417
+ INST(Movdir64b , X86EnqcmdMovdir64b , O(660F38,F8,_,_,_,_,_,_ ), 0 , 2 , 0 , 125, 99 ), // #418
+ INST(Movdiri , X86MovntiMovdiri , O(000F38,F9,_,_,_,_,_,_ ), 0 , 1 , 0 , 3 , 100), // #419
+ INST(Movdq2q , ExtMov , O(F20F00,D6,_,_,_,_,_,_ ), 0 , 6 , 0 , 126, 5 ), // #420
+ INST(Movdqa , ExtMov , O(660F00,6F,_,_,_,_,_,_ ), O(660F00,7F,_,_,_,_,_,_ ), 4 , 49 , 122, 95 ), // #421
+ INST(Movdqu , ExtMov , O(F30F00,6F,_,_,_,_,_,_ ), O(F30F00,7F,_,_,_,_,_,_ ), 7 , 50 , 122, 95 ), // #422
+ INST(Movhlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), 0 , 5 , 0 , 127, 6 ), // #423
+ INST(Movhpd , ExtMov , O(660F00,16,_,_,_,_,_,_ ), O(660F00,17,_,_,_,_,_,_ ), 4 , 51 , 128, 5 ), // #424
+ INST(Movhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), O(000F00,17,_,_,_,_,_,_ ), 5 , 52 , 128, 6 ), // #425
+ INST(Movlhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), 0 , 5 , 0 , 127, 6 ), // #426
+ INST(Movlpd , ExtMov , O(660F00,12,_,_,_,_,_,_ ), O(660F00,13,_,_,_,_,_,_ ), 4 , 53 , 128, 5 ), // #427
+ INST(Movlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), O(000F00,13,_,_,_,_,_,_ ), 5 , 54 , 128, 6 ), // #428
+ INST(Movmskpd , ExtMov , O(660F00,50,_,_,_,_,_,_ ), 0 , 4 , 0 , 129, 5 ), // #429
+ INST(Movmskps , ExtMov , O(000F00,50,_,_,_,_,_,_ ), 0 , 5 , 0 , 129, 6 ), // #430
+ INST(Movntdq , ExtMov , 0 , O(660F00,E7,_,_,_,_,_,_ ), 0 , 55 , 130, 5 ), // #431
+ INST(Movntdqa , ExtMov , O(660F38,2A,_,_,_,_,_,_ ), 0 , 2 , 0 , 104, 13 ), // #432
+ INST(Movnti , X86MovntiMovdiri , O(000F00,C3,_,_,x,_,_,_ ), 0 , 5 , 0 , 3 , 5 ), // #433
+ INST(Movntpd , ExtMov , 0 , O(660F00,2B,_,_,_,_,_,_ ), 0 , 56 , 130, 5 ), // #434
+ INST(Movntps , ExtMov , 0 , O(000F00,2B,_,_,_,_,_,_ ), 0 , 57 , 130, 6 ), // #435
+ INST(Movntq , ExtMov , 0 , O(000F00,E7,_,_,_,_,_,_ ), 0 , 58 , 131, 90 ), // #436
+ INST(Movntsd , ExtMov , 0 , O(F20F00,2B,_,_,_,_,_,_ ), 0 , 59 , 132, 51 ), // #437
+ INST(Movntss , ExtMov , 0 , O(F30F00,2B,_,_,_,_,_,_ ), 0 , 60 , 133, 51 ), // #438
+ INST(Movq , ExtMovq , O(000F00,6E,_,_,x,_,_,_ ), O(000F00,7E,_,_,x,_,_,_ ), 5 , 48 , 134, 101), // #439
+ INST(Movq2dq , ExtRm , O(F30F00,D6,_,_,_,_,_,_ ), 0 , 7 , 0 , 135, 5 ), // #440
+ INST(Movs , X86StrMm , O(000000,A4,_,_,_,_,_,_ ), 0 , 0 , 0 , 136, 88 ), // #441
+ INST(Movsd , ExtMov , O(F20F00,10,_,_,_,_,_,_ ), O(F20F00,11,_,_,_,_,_,_ ), 6 , 61 , 137, 95 ), // #442
+ INST(Movshdup , ExtRm , O(F30F00,16,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 7 ), // #443
+ INST(Movsldup , ExtRm , O(F30F00,12,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 7 ), // #444
+ INST(Movss , ExtMov , O(F30F00,10,_,_,_,_,_,_ ), O(F30F00,11,_,_,_,_,_,_ ), 7 , 62 , 138, 96 ), // #445
+ INST(Movsx , X86MovsxMovzx , O(000F00,BE,_,_,x,_,_,_ ), 0 , 5 , 0 , 139, 0 ), // #446
+ INST(Movsxd , X86Rm , O(000000,63,_,_,x,_,_,_ ), 0 , 0 , 0 , 140, 0 ), // #447
+ INST(Movupd , ExtMov , O(660F00,10,_,_,_,_,_,_ ), O(660F00,11,_,_,_,_,_,_ ), 4 , 63 , 122, 95 ), // #448
+ INST(Movups , ExtMov , O(000F00,10,_,_,_,_,_,_ ), O(000F00,11,_,_,_,_,_,_ ), 5 , 64 , 122, 96 ), // #449
+ INST(Movzx , X86MovsxMovzx , O(000F00,B6,_,_,x,_,_,_ ), 0 , 5 , 0 , 139, 0 ), // #450
+ INST(Mpsadbw , ExtRmi , O(660F3A,42,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #451
+ INST(Mul , X86M_GPB_MulDiv , O(000000,F6,4,_,x,_,_,_ ), 0 , 10 , 0 , 56 , 1 ), // #452
+ INST(Mulpd , ExtRm , O(660F00,59,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #453
+ INST(Mulps , ExtRm , O(000F00,59,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #454
+ INST(Mulsd , ExtRm , O(F20F00,59,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #455
+ INST(Mulss , ExtRm , O(F30F00,59,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #456
+ INST(Mulx , VexRvm_ZDX_Wx , V(F20F38,F6,_,0,x,_,_,_ ), 0 , 85 , 0 , 141, 102), // #457
+ INST(Mwait , X86Op , O(000F01,C9,_,_,_,_,_,_ ), 0 , 23 , 0 , 142, 92 ), // #458
+ INST(Mwaitx , X86Op , O(000F01,FB,_,_,_,_,_,_ ), 0 , 23 , 0 , 143, 93 ), // #459
+ INST(Neg , X86M_GPB , O(000000,F6,3,_,x,_,_,_ ), 0 , 77 , 0 , 144, 1 ), // #460
+ INST(Nop , X86M_Nop , O(000000,90,_,_,_,_,_,_ ), 0 , 0 , 0 , 145, 0 ), // #461
+ INST(Not , X86M_GPB , O(000000,F6,2,_,x,_,_,_ ), 0 , 3 , 0 , 144, 0 ), // #462
+ INST(Or , X86Arith , O(000000,08,1,_,x,_,_,_ ), 0 , 33 , 0 , 146, 1 ), // #463
+ INST(Orpd , ExtRm , O(660F00,56,_,_,_,_,_,_ ), 0 , 4 , 0 , 12 , 5 ), // #464
+ INST(Orps , ExtRm , O(000F00,56,_,_,_,_,_,_ ), 0 , 5 , 0 , 12 , 6 ), // #465
+ INST(Out , X86Out , O(000000,EE,_,_,_,_,_,_ ), O(000000,E6,_,_,_,_,_,_ ), 0 , 65 , 147, 0 ), // #466
+ INST(Outs , X86Outs , O(000000,6E,_,_,_,_,_,_ ), 0 , 0 , 0 , 148, 0 ), // #467
+ INST(Pabsb , ExtRm_P , O(000F38,1C,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #468
+ INST(Pabsd , ExtRm_P , O(000F38,1E,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #469
+ INST(Pabsw , ExtRm_P , O(000F38,1D,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #470
+ INST(Packssdw , ExtRm_P , O(000F00,6B,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #471
+ INST(Packsswb , ExtRm_P , O(000F00,63,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #472
+ INST(Packusdw , ExtRm , O(660F38,2B,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #473
+ INST(Packuswb , ExtRm_P , O(000F00,67,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #474
+ INST(Paddb , ExtRm_P , O(000F00,FC,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #475
+ INST(Paddd , ExtRm_P , O(000F00,FE,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #476
+ INST(Paddq , ExtRm_P , O(000F00,D4,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 5 ), // #477
+ INST(Paddsb , ExtRm_P , O(000F00,EC,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #478
+ INST(Paddsw , ExtRm_P , O(000F00,ED,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #479
+ INST(Paddusb , ExtRm_P , O(000F00,DC,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #480
+ INST(Paddusw , ExtRm_P , O(000F00,DD,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #481
+ INST(Paddw , ExtRm_P , O(000F00,FD,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #482
+ INST(Palignr , ExtRmi_P , O(000F3A,0F,_,_,_,_,_,_ ), 0 , 86 , 0 , 150, 103), // #483
+ INST(Pand , ExtRm_P , O(000F00,DB,_,_,_,_,_,_ ), 0 , 5 , 0 , 151, 98 ), // #484
+ INST(Pandn , ExtRm_P , O(000F00,DF,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #485
+ INST(Pause , X86Op , O(F30000,90,_,_,_,_,_,_ ), 0 , 87 , 0 , 31 , 0 ), // #486
+ INST(Pavgb , ExtRm_P , O(000F00,E0,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 104), // #487
+ INST(Pavgusb , Ext3dNow , O(000F0F,BF,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #488
+ INST(Pavgw , ExtRm_P , O(000F00,E3,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 104), // #489
+ INST(Pblendvb , ExtRm_XMM0 , O(660F38,10,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #490
+ INST(Pblendw , ExtRmi , O(660F3A,0E,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #491
+ INST(Pclmulqdq , ExtRmi , O(660F3A,44,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 105), // #492
+ INST(Pcmpeqb , ExtRm_P , O(000F00,74,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #493
+ INST(Pcmpeqd , ExtRm_P , O(000F00,76,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #494
+ INST(Pcmpeqq , ExtRm , O(660F38,29,_,_,_,_,_,_ ), 0 , 2 , 0 , 154, 13 ), // #495
+ INST(Pcmpeqw , ExtRm_P , O(000F00,75,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #496
+ INST(Pcmpestri , ExtRmi , O(660F3A,61,_,_,_,_,_,_ ), 0 , 9 , 0 , 155, 106), // #497
+ INST(Pcmpestrm , ExtRmi , O(660F3A,60,_,_,_,_,_,_ ), 0 , 9 , 0 , 156, 106), // #498
+ INST(Pcmpgtb , ExtRm_P , O(000F00,64,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #499
+ INST(Pcmpgtd , ExtRm_P , O(000F00,66,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #500
+ INST(Pcmpgtq , ExtRm , O(660F38,37,_,_,_,_,_,_ ), 0 , 2 , 0 , 154, 46 ), // #501
+ INST(Pcmpgtw , ExtRm_P , O(000F00,65,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #502
+ INST(Pcmpistri , ExtRmi , O(660F3A,63,_,_,_,_,_,_ ), 0 , 9 , 0 , 157, 106), // #503
+ INST(Pcmpistrm , ExtRmi , O(660F3A,62,_,_,_,_,_,_ ), 0 , 9 , 0 , 158, 106), // #504
+ INST(Pconfig , X86Op , O(000F01,C5,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 107), // #505
+ INST(Pdep , VexRvm_Wx , V(F20F38,F5,_,0,x,_,_,_ ), 0 , 85 , 0 , 11 , 102), // #506
+ INST(Pext , VexRvm_Wx , V(F30F38,F5,_,0,x,_,_,_ ), 0 , 89 , 0 , 11 , 102), // #507
+ INST(Pextrb , ExtExtract , O(000F3A,14,_,_,_,_,_,_ ), 0 , 86 , 0 , 159, 13 ), // #508
+ INST(Pextrd , ExtExtract , O(000F3A,16,_,_,_,_,_,_ ), 0 , 86 , 0 , 60 , 13 ), // #509
+ INST(Pextrq , ExtExtract , O(000F3A,16,_,_,1,_,_,_ ), 0 , 90 , 0 , 160, 13 ), // #510
+ INST(Pextrw , ExtPextrw , O(000F00,C5,_,_,_,_,_,_ ), O(000F3A,15,_,_,_,_,_,_ ), 5 , 66 , 161, 108), // #511
+ INST(Pf2id , Ext3dNow , O(000F0F,1D,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #512
+ INST(Pf2iw , Ext3dNow , O(000F0F,1C,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 109), // #513
+ INST(Pfacc , Ext3dNow , O(000F0F,AE,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #514
+ INST(Pfadd , Ext3dNow , O(000F0F,9E,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #515
+ INST(Pfcmpeq , Ext3dNow , O(000F0F,B0,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #516
+ INST(Pfcmpge , Ext3dNow , O(000F0F,90,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #517
+ INST(Pfcmpgt , Ext3dNow , O(000F0F,A0,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #518
+ INST(Pfmax , Ext3dNow , O(000F0F,A4,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #519
+ INST(Pfmin , Ext3dNow , O(000F0F,94,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #520
+ INST(Pfmul , Ext3dNow , O(000F0F,B4,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #521
+ INST(Pfnacc , Ext3dNow , O(000F0F,8A,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 109), // #522
+ INST(Pfpnacc , Ext3dNow , O(000F0F,8E,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 109), // #523
+ INST(Pfrcp , Ext3dNow , O(000F0F,96,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #524
+ INST(Pfrcpit1 , Ext3dNow , O(000F0F,A6,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #525
+ INST(Pfrcpit2 , Ext3dNow , O(000F0F,B6,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #526
+ INST(Pfrcpv , Ext3dNow , O(000F0F,86,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 110), // #527
+ INST(Pfrsqit1 , Ext3dNow , O(000F0F,A7,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #528
+ INST(Pfrsqrt , Ext3dNow , O(000F0F,97,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #529
+ INST(Pfrsqrtv , Ext3dNow , O(000F0F,87,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 110), // #530
+ INST(Pfsub , Ext3dNow , O(000F0F,9A,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #531
+ INST(Pfsubr , Ext3dNow , O(000F0F,AA,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #532
+ INST(Phaddd , ExtRm_P , O(000F38,02,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #533
+ INST(Phaddsw , ExtRm_P , O(000F38,03,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #534
+ INST(Phaddw , ExtRm_P , O(000F38,01,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #535
+ INST(Phminposuw , ExtRm , O(660F38,41,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #536
+ INST(Phsubd , ExtRm_P , O(000F38,06,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #537
+ INST(Phsubsw , ExtRm_P , O(000F38,07,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #538
+ INST(Phsubw , ExtRm_P , O(000F38,05,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #539
+ INST(Pi2fd , Ext3dNow , O(000F0F,0D,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #540
+ INST(Pi2fw , Ext3dNow , O(000F0F,0C,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 109), // #541
+ INST(Pinsrb , ExtRmi , O(660F3A,20,_,_,_,_,_,_ ), 0 , 9 , 0 , 162, 13 ), // #542
+ INST(Pinsrd , ExtRmi , O(660F3A,22,_,_,_,_,_,_ ), 0 , 9 , 0 , 163, 13 ), // #543
+ INST(Pinsrq , ExtRmi , O(660F3A,22,_,_,1,_,_,_ ), 0 , 91 , 0 , 164, 13 ), // #544
+ INST(Pinsrw , ExtRmi_P , O(000F00,C4,_,_,_,_,_,_ ), 0 , 5 , 0 , 165, 104), // #545
+ INST(Pmaddubsw , ExtRm_P , O(000F38,04,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #546
+ INST(Pmaddwd , ExtRm_P , O(000F00,F5,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #547
+ INST(Pmaxsb , ExtRm , O(660F38,3C,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #548
+ INST(Pmaxsd , ExtRm , O(660F38,3D,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #549
+ INST(Pmaxsw , ExtRm_P , O(000F00,EE,_,_,_,_,_,_ ), 0 , 5 , 0 , 151, 104), // #550
+ INST(Pmaxub , ExtRm_P , O(000F00,DE,_,_,_,_,_,_ ), 0 , 5 , 0 , 151, 104), // #551
+ INST(Pmaxud , ExtRm , O(660F38,3F,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #552
+ INST(Pmaxuw , ExtRm , O(660F38,3E,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #553
+ INST(Pminsb , ExtRm , O(660F38,38,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #554
+ INST(Pminsd , ExtRm , O(660F38,39,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #555
+ INST(Pminsw , ExtRm_P , O(000F00,EA,_,_,_,_,_,_ ), 0 , 5 , 0 , 151, 104), // #556
+ INST(Pminub , ExtRm_P , O(000F00,DA,_,_,_,_,_,_ ), 0 , 5 , 0 , 151, 104), // #557
+ INST(Pminud , ExtRm , O(660F38,3B,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #558
+ INST(Pminuw , ExtRm , O(660F38,3A,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #559
+ INST(Pmovmskb , ExtRm_P , O(000F00,D7,_,_,_,_,_,_ ), 0 , 5 , 0 , 166, 104), // #560
+ INST(Pmovsxbd , ExtRm , O(660F38,21,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #561
+ INST(Pmovsxbq , ExtRm , O(660F38,22,_,_,_,_,_,_ ), 0 , 2 , 0 , 167, 13 ), // #562
+ INST(Pmovsxbw , ExtRm , O(660F38,20,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #563
+ INST(Pmovsxdq , ExtRm , O(660F38,25,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #564
+ INST(Pmovsxwd , ExtRm , O(660F38,23,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #565
+ INST(Pmovsxwq , ExtRm , O(660F38,24,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #566
+ INST(Pmovzxbd , ExtRm , O(660F38,31,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #567
+ INST(Pmovzxbq , ExtRm , O(660F38,32,_,_,_,_,_,_ ), 0 , 2 , 0 , 167, 13 ), // #568
+ INST(Pmovzxbw , ExtRm , O(660F38,30,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #569
+ INST(Pmovzxdq , ExtRm , O(660F38,35,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #570
+ INST(Pmovzxwd , ExtRm , O(660F38,33,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #571
+ INST(Pmovzxwq , ExtRm , O(660F38,34,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #572
+ INST(Pmuldq , ExtRm , O(660F38,28,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #573
+ INST(Pmulhrsw , ExtRm_P , O(000F38,0B,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #574
+ INST(Pmulhrw , Ext3dNow , O(000F0F,B7,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 58 ), // #575
+ INST(Pmulhuw , ExtRm_P , O(000F00,E4,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 104), // #576
+ INST(Pmulhw , ExtRm_P , O(000F00,E5,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #577
+ INST(Pmulld , ExtRm , O(660F38,40,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #578
+ INST(Pmullw , ExtRm_P , O(000F00,D5,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #579
+ INST(Pmuludq , ExtRm_P , O(000F00,F4,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 5 ), // #580
+ INST(Pop , X86Pop , O(000000,8F,0,_,_,_,_,_ ), O(000000,58,_,_,_,_,_,_ ), 0 , 67 , 168, 0 ), // #581
+ INST(Popa , X86Op , O(660000,61,_,_,_,_,_,_ ), 0 , 21 , 0 , 84 , 0 ), // #582
+ INST(Popad , X86Op , O(000000,61,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 0 ), // #583
+ INST(Popcnt , X86Rm_Raw66H , O(F30F00,B8,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 111), // #584
+ INST(Popf , X86Op , O(660000,9D,_,_,_,_,_,_ ), 0 , 21 , 0 , 31 , 112), // #585
+ INST(Popfd , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 112), // #586
+ INST(Popfq , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 34 , 112), // #587
+ INST(Por , ExtRm_P , O(000F00,EB,_,_,_,_,_,_ ), 0 , 5 , 0 , 151, 98 ), // #588
+ INST(Prefetch , X86M_Only , O(000F00,0D,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 58 ), // #589
+ INST(Prefetchit0 , X86M_Only , O(000F00,18,7,_,_,_,_,_ ), 0 , 24 , 0 , 73 , 113), // #590
+ INST(Prefetchit1 , X86M_Only , O(000F00,18,6,_,_,_,_,_ ), 0 , 82 , 0 , 73 , 113), // #591
+ INST(Prefetchnta , X86M_Only , O(000F00,18,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 6 ), // #592
+ INST(Prefetcht0 , X86M_Only , O(000F00,18,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 6 ), // #593
+ INST(Prefetcht1 , X86M_Only , O(000F00,18,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 6 ), // #594
+ INST(Prefetcht2 , X86M_Only , O(000F00,18,3,_,_,_,_,_ ), 0 , 80 , 0 , 32 , 6 ), // #595
+ INST(Prefetchw , X86M_Only , O(000F00,0D,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 114), // #596
+ INST(Prefetchwt1 , X86M_Only , O(000F00,0D,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 115), // #597
+ INST(Psadbw , ExtRm_P , O(000F00,F6,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 104), // #598
+ INST(Pshufb , ExtRm_P , O(000F38,00,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #599
+ INST(Pshufd , ExtRmi , O(660F00,70,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #600
+ INST(Pshufhw , ExtRmi , O(F30F00,70,_,_,_,_,_,_ ), 0 , 7 , 0 , 9 , 5 ), // #601
+ INST(Pshuflw , ExtRmi , O(F20F00,70,_,_,_,_,_,_ ), 0 , 6 , 0 , 9 , 5 ), // #602
+ INST(Pshufw , ExtRmi_P , O(000F00,70,_,_,_,_,_,_ ), 0 , 5 , 0 , 169, 90 ), // #603
+ INST(Psignb , ExtRm_P , O(000F38,08,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #604
+ INST(Psignd , ExtRm_P , O(000F38,0A,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #605
+ INST(Psignw , ExtRm_P , O(000F38,09,_,_,_,_,_,_ ), 0 , 1 , 0 , 149, 103), // #606
+ INST(Pslld , ExtRmRi_P , O(000F00,F2,_,_,_,_,_,_ ), O(000F00,72,6,_,_,_,_,_ ), 5 , 68 , 170, 98 ), // #607
+ INST(Pslldq , ExtRmRi , 0 , O(660F00,73,7,_,_,_,_,_ ), 0 , 69 , 171, 5 ), // #608
+ INST(Psllq , ExtRmRi_P , O(000F00,F3,_,_,_,_,_,_ ), O(000F00,73,6,_,_,_,_,_ ), 5 , 70 , 170, 98 ), // #609
+ INST(Psllw , ExtRmRi_P , O(000F00,F1,_,_,_,_,_,_ ), O(000F00,71,6,_,_,_,_,_ ), 5 , 71 , 170, 98 ), // #610
+ INST(Psmash , X86Op , O(F30F01,FF,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 116), // #611
+ INST(Psrad , ExtRmRi_P , O(000F00,E2,_,_,_,_,_,_ ), O(000F00,72,4,_,_,_,_,_ ), 5 , 72 , 170, 98 ), // #612
+ INST(Psraw , ExtRmRi_P , O(000F00,E1,_,_,_,_,_,_ ), O(000F00,71,4,_,_,_,_,_ ), 5 , 73 , 170, 98 ), // #613
+ INST(Psrld , ExtRmRi_P , O(000F00,D2,_,_,_,_,_,_ ), O(000F00,72,2,_,_,_,_,_ ), 5 , 74 , 170, 98 ), // #614
+ INST(Psrldq , ExtRmRi , 0 , O(660F00,73,3,_,_,_,_,_ ), 0 , 75 , 171, 5 ), // #615
+ INST(Psrlq , ExtRmRi_P , O(000F00,D3,_,_,_,_,_,_ ), O(000F00,73,2,_,_,_,_,_ ), 5 , 76 , 170, 98 ), // #616
+ INST(Psrlw , ExtRmRi_P , O(000F00,D1,_,_,_,_,_,_ ), O(000F00,71,2,_,_,_,_,_ ), 5 , 77 , 170, 98 ), // #617
+ INST(Psubb , ExtRm_P , O(000F00,F8,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #618
+ INST(Psubd , ExtRm_P , O(000F00,FA,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #619
+ INST(Psubq , ExtRm_P , O(000F00,FB,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 5 ), // #620
+ INST(Psubsb , ExtRm_P , O(000F00,E8,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #621
+ INST(Psubsw , ExtRm_P , O(000F00,E9,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #622
+ INST(Psubusb , ExtRm_P , O(000F00,D8,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #623
+ INST(Psubusw , ExtRm_P , O(000F00,D9,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #624
+ INST(Psubw , ExtRm_P , O(000F00,F9,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #625
+ INST(Pswapd , Ext3dNow , O(000F0F,BB,_,_,_,_,_,_ ), 0 , 88 , 0 , 153, 109), // #626
+ INST(Ptest , ExtRm , O(660F38,17,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 117), // #627
+ INST(Ptwrite , X86M , O(F30F00,AE,4,_,_,_,_,_ ), 0 , 92 , 0 , 172, 118), // #628
+ INST(Punpckhbw , ExtRm_P , O(000F00,68,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #629
+ INST(Punpckhdq , ExtRm_P , O(000F00,6A,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #630
+ INST(Punpckhqdq , ExtRm , O(660F00,6D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #631
+ INST(Punpckhwd , ExtRm_P , O(000F00,69,_,_,_,_,_,_ ), 0 , 5 , 0 , 149, 98 ), // #632
+ INST(Punpcklbw , ExtRm_P , O(000F00,60,_,_,_,_,_,_ ), 0 , 5 , 0 , 173, 98 ), // #633
+ INST(Punpckldq , ExtRm_P , O(000F00,62,_,_,_,_,_,_ ), 0 , 5 , 0 , 173, 98 ), // #634
+ INST(Punpcklqdq , ExtRm , O(660F00,6C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #635
+ INST(Punpcklwd , ExtRm_P , O(000F00,61,_,_,_,_,_,_ ), 0 , 5 , 0 , 173, 98 ), // #636
+ INST(Push , X86Push , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 34 , 78 , 174, 0 ), // #637
+ INST(Pusha , X86Op , O(660000,60,_,_,_,_,_,_ ), 0 , 21 , 0 , 84 , 0 ), // #638
+ INST(Pushad , X86Op , O(000000,60,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 0 ), // #639
+ INST(Pushf , X86Op , O(660000,9C,_,_,_,_,_,_ ), 0 , 21 , 0 , 31 , 119), // #640
+ INST(Pushfd , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 119), // #641
+ INST(Pushfq , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 34 , 119), // #642
+ INST(Pushw , X86Pushw , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 34 , 78 , 175, 0 ), // #643
+ INST(Pvalidate , X86Op , O(F20F01,FF,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 120), // #644
+ INST(Pxor , ExtRm_P , O(000F00,EF,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #645
+ INST(Rcl , X86Rot , O(000000,D0,2,_,x,_,_,_ ), 0 , 3 , 0 , 176, 121), // #646
+ INST(Rcpps , ExtRm , O(000F00,53,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #647
+ INST(Rcpss , ExtRm , O(F30F00,53,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #648
+ INST(Rcr , X86Rot , O(000000,D0,3,_,x,_,_,_ ), 0 , 77 , 0 , 176, 121), // #649
+ INST(Rdfsbase , X86M , O(F30F00,AE,0,_,x,_,_,_ ), 0 , 7 , 0 , 177, 122), // #650
+ INST(Rdgsbase , X86M , O(F30F00,AE,1,_,x,_,_,_ ), 0 , 94 , 0 , 177, 122), // #651
+ INST(Rdmsr , X86Op , O(000F00,32,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 123), // #652
+ INST(Rdpid , X86R_Native , O(F30F00,C7,7,_,_,_,_,_ ), 0 , 95 , 0 , 179, 124), // #653
+ INST(Rdpkru , X86Op , O(000F01,EE,_,_,_,_,_,_ ), 0 , 23 , 0 , 180, 125), // #654
+ INST(Rdpmc , X86Op , O(000F00,33,_,_,_,_,_,_ ), 0 , 5 , 0 , 180, 0 ), // #655
+ INST(Rdpru , X86Op , O(000F01,FD,_,_,_,_,_,_ ), 0 , 23 , 0 , 180, 126), // #656
+ INST(Rdrand , X86M , O(000F00,C7,6,_,x,_,_,_ ), 0 , 82 , 0 , 24 , 127), // #657
+ INST(Rdseed , X86M , O(000F00,C7,7,_,x,_,_,_ ), 0 , 24 , 0 , 24 , 128), // #658
+ INST(Rdsspd , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 94 , 0 , 79 , 65 ), // #659
+ INST(Rdsspq , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 94 , 0 , 80 , 65 ), // #660
+ INST(Rdtsc , X86Op , O(000F00,31,_,_,_,_,_,_ ), 0 , 5 , 0 , 29 , 129), // #661
+ INST(Rdtscp , X86Op , O(000F01,F9,_,_,_,_,_,_ ), 0 , 23 , 0 , 180, 130), // #662
+ INST(Ret , X86Ret , O(000000,C2,_,_,_,_,_,_ ), 0 , 0 , 0 , 181, 0 ), // #663
+ INST(Retf , X86Ret , O(000000,CA,_,_,x,_,_,_ ), 0 , 0 , 0 , 182, 0 ), // #664
+ INST(Rmpadjust , X86Op , O(F30F01,FE,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 116), // #665
+ INST(Rmpupdate , X86Op , O(F20F01,FE,_,_,_,_,_,_ ), 0 , 93 , 0 , 34 , 116), // #666
+ INST(Rol , X86Rot , O(000000,D0,0,_,x,_,_,_ ), 0 , 0 , 0 , 176, 131), // #667
+ INST(Ror , X86Rot , O(000000,D0,1,_,x,_,_,_ ), 0 , 33 , 0 , 176, 131), // #668
+ INST(Rorx , VexRmi_Wx , V(F20F3A,F0,_,0,x,_,_,_ ), 0 , 96 , 0 , 183, 102), // #669
+ INST(Roundpd , ExtRmi , O(660F3A,09,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #670
+ INST(Roundps , ExtRmi , O(660F3A,08,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #671
+ INST(Roundsd , ExtRmi , O(660F3A,0B,_,_,_,_,_,_ ), 0 , 9 , 0 , 39 , 13 ), // #672
+ INST(Roundss , ExtRmi , O(660F3A,0A,_,_,_,_,_,_ ), 0 , 9 , 0 , 40 , 13 ), // #673
+ INST(Rsm , X86Op , O(000F00,AA,_,_,_,_,_,_ ), 0 , 5 , 0 , 84 , 1 ), // #674
+ INST(Rsqrtps , ExtRm , O(000F00,52,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #675
+ INST(Rsqrtss , ExtRm , O(F30F00,52,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #676
+ INST(Rstorssp , X86M_Only , O(F30F00,01,5,_,_,_,_,_ ), 0 , 65 , 0 , 33 , 25 ), // #677
+ INST(Sahf , X86Op , O(000000,9E,_,_,_,_,_,_ ), 0 , 0 , 0 , 101, 132), // #678
+ INST(Sar , X86Rot , O(000000,D0,7,_,x,_,_,_ ), 0 , 29 , 0 , 176, 1 ), // #679
+ INST(Sarx , VexRmv_Wx , V(F30F38,F7,_,0,x,_,_,_ ), 0 , 89 , 0 , 14 , 102), // #680
+ INST(Saveprevssp , X86Op , O(F30F01,EA,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 25 ), // #681
+ INST(Sbb , X86Arith , O(000000,18,3,_,x,_,_,_ ), 0 , 77 , 0 , 184, 3 ), // #682
+ INST(Scas , X86StrRm , O(000000,AE,_,_,_,_,_,_ ), 0 , 0 , 0 , 185, 39 ), // #683
+ INST(Seamcall , X86Op , O(660F01,CF,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #684
+ INST(Seamops , X86Op , O(660F01,CE,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #685
+ INST(Seamret , X86Op , O(660F01,CD,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #686
+ INST(Senduipi , X86M_NoSize , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 80 , 26 ), // #687
+ INST(Serialize , X86Op , O(000F01,E8,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 134), // #688
+ INST(Setb , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 69 ), // #689
+ INST(Setbe , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 70 ), // #690
+ INST(Setl , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 71 ), // #691
+ INST(Setle , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 72 ), // #692
+ INST(Setnb , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 69 ), // #693
+ INST(Setnbe , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 70 ), // #694
+ INST(Setnl , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 71 ), // #695
+ INST(Setnle , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 72 ), // #696
+ INST(Setno , X86Set , O(000F00,91,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 66 ), // #697
+ INST(Setnp , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 73 ), // #698
+ INST(Setns , X86Set , O(000F00,99,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 74 ), // #699
+ INST(Setnz , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 75 ), // #700
+ INST(Seto , X86Set , O(000F00,90,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 66 ), // #701
+ INST(Setp , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 73 ), // #702
+ INST(Sets , X86Set , O(000F00,98,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 74 ), // #703
+ INST(Setssbsy , X86Op , O(F30F01,E8,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 65 ), // #704
+ INST(Setz , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 5 , 0 , 186, 75 ), // #705
+ INST(Sfence , X86Fence , O(000F00,AE,7,_,_,_,_,_ ), 0 , 24 , 0 , 31 , 6 ), // #706
+ INST(Sgdt , X86M_Only , O(000F00,01,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 0 ), // #707
+ INST(Sha1msg1 , ExtRm , O(000F38,C9,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #708
+ INST(Sha1msg2 , ExtRm , O(000F38,CA,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #709
+ INST(Sha1nexte , ExtRm , O(000F38,C8,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #710
+ INST(Sha1rnds4 , ExtRmi , O(000F3A,CC,_,_,_,_,_,_ ), 0 , 86 , 0 , 9 , 135), // #711
+ INST(Sha256msg1 , ExtRm , O(000F38,CC,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #712
+ INST(Sha256msg2 , ExtRm , O(000F38,CD,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #713
+ INST(Sha256rnds2 , ExtRm_XMM0 , O(000F38,CB,_,_,_,_,_,_ ), 0 , 1 , 0 , 16 , 135), // #714
+ INST(Shl , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 10 , 0 , 176, 1 ), // #715
+ INST(Shld , X86ShldShrd , O(000F00,A4,_,_,x,_,_,_ ), 0 , 5 , 0 , 187, 1 ), // #716
+ INST(Shlx , VexRmv_Wx , V(660F38,F7,_,0,x,_,_,_ ), 0 , 30 , 0 , 14 , 102), // #717
+ INST(Shr , X86Rot , O(000000,D0,5,_,x,_,_,_ ), 0 , 64 , 0 , 176, 1 ), // #718
+ INST(Shrd , X86ShldShrd , O(000F00,AC,_,_,x,_,_,_ ), 0 , 5 , 0 , 187, 1 ), // #719
+ INST(Shrx , VexRmv_Wx , V(F20F38,F7,_,0,x,_,_,_ ), 0 , 85 , 0 , 14 , 102), // #720
+ INST(Shufpd , ExtRmi , O(660F00,C6,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #721
+ INST(Shufps , ExtRmi , O(000F00,C6,_,_,_,_,_,_ ), 0 , 5 , 0 , 9 , 6 ), // #722
+ INST(Sidt , X86M_Only , O(000F00,01,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 0 ), // #723
+ INST(Skinit , X86Op_xAX , O(000F01,DE,_,_,_,_,_,_ ), 0 , 23 , 0 , 54 , 136), // #724
+ INST(Sldt , X86M_NoMemSize , O(000F00,00,0,_,_,_,_,_ ), 0 , 5 , 0 , 188, 0 ), // #725
+ INST(Slwpcb , VexR_Wx , V(XOP_M9,12,1,0,x,_,_,_ ), 0 , 13 , 0 , 112, 87 ), // #726
+ INST(Smsw , X86M_NoMemSize , O(000F00,01,4,_,_,_,_,_ ), 0 , 98 , 0 , 188, 0 ), // #727
+ INST(Sqrtpd , ExtRm , O(660F00,51,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #728
+ INST(Sqrtps , ExtRm , O(000F00,51,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #729
+ INST(Sqrtsd , ExtRm , O(F20F00,51,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #730
+ INST(Sqrtss , ExtRm , O(F30F00,51,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #731
+ INST(Stac , X86Op , O(000F01,CB,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 17 ), // #732
+ INST(Stc , X86Op , O(000000,F9,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 18 ), // #733
+ INST(Std , X86Op , O(000000,FD,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 19 ), // #734
+ INST(Stgi , X86Op , O(000F01,DC,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 136), // #735
+ INST(Sti , X86Op , O(000000,FB,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 24 ), // #736
+ INST(Stmxcsr , X86M_Only , O(000F00,AE,3,_,_,_,_,_ ), 0 , 80 , 0 , 105, 6 ), // #737
+ INST(Stos , X86StrMr , O(000000,AA,_,_,_,_,_,_ ), 0 , 0 , 0 , 189, 88 ), // #738
+ INST(Str , X86M_NoMemSize , O(000F00,00,1,_,_,_,_,_ ), 0 , 32 , 0 , 188, 0 ), // #739
+ INST(Sttilecfg , AmxCfg , V(660F38,49,_,0,0,_,_,_ ), 0 , 30 , 0 , 107, 86 ), // #740
+ INST(Stui , X86Op , O(F30F01,EF,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #741
+ INST(Sub , X86Arith , O(000000,28,5,_,x,_,_,_ ), 0 , 64 , 0 , 184, 1 ), // #742
+ INST(Subpd , ExtRm , O(660F00,5C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #743
+ INST(Subps , ExtRm , O(000F00,5C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #744
+ INST(Subsd , ExtRm , O(F20F00,5C,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #745
+ INST(Subss , ExtRm , O(F30F00,5C,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #746
+ INST(Swapgs , X86Op , O(000F01,F8,_,_,_,_,_,_ ), 0 , 23 , 0 , 34 , 0 ), // #747
+ INST(Syscall , X86Op , O(000F00,05,_,_,_,_,_,_ ), 0 , 5 , 0 , 34 , 0 ), // #748
+ INST(Sysenter , X86Op , O(000F00,34,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #749
+ INST(Sysexit , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #750
+ INST(Sysexitq , X86Op , O(000F00,35,_,_,1,_,_,_ ), 0 , 62 , 0 , 34 , 0 ), // #751
+ INST(Sysret , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 5 , 0 , 34 , 0 ), // #752
+ INST(Sysretq , X86Op , O(000F00,07,_,_,1,_,_,_ ), 0 , 62 , 0 , 34 , 0 ), // #753
+ INST(T1mskc , VexVm_Wx , V(XOP_M9,01,7,0,x,_,_,_ ), 0 , 99 , 0 , 15 , 12 ), // #754
+ INST(Tcmmimfp16ps , AmxRmv , V(660F38,6C,_,0,0,_,_,_ ), 0 , 30 , 0 , 190, 137), // #755
+ INST(Tcmmrlfp16ps , AmxRmv , V(000F38,6C,_,0,0,_,_,_ ), 0 , 11 , 0 , 190, 137), // #756
+ INST(Tdcall , X86Op , O(660F01,CC,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #757
+ INST(Tdpbf16ps , AmxRmv , V(F30F38,5C,_,0,0,_,_,_ ), 0 , 89 , 0 , 190, 138), // #758
+ INST(Tdpbssd , AmxRmv , V(F20F38,5E,_,0,0,_,_,_ ), 0 , 85 , 0 , 190, 139), // #759
+ INST(Tdpbsud , AmxRmv , V(F30F38,5E,_,0,0,_,_,_ ), 0 , 89 , 0 , 190, 139), // #760
+ INST(Tdpbusd , AmxRmv , V(660F38,5E,_,0,0,_,_,_ ), 0 , 30 , 0 , 190, 139), // #761
+ INST(Tdpbuud , AmxRmv , V(000F38,5E,_,0,0,_,_,_ ), 0 , 11 , 0 , 190, 139), // #762
+ INST(Tdpfp16ps , AmxRmv , V(F20F38,5C,_,0,0,_,_,_ ), 0 , 85 , 0 , 190, 140), // #763
+ INST(Test , X86Test , O(000000,84,_,_,x,_,_,_ ), O(000000,F6,_,_,x,_,_,_ ), 0 , 79 , 191, 1 ), // #764
+ INST(Testui , X86Op , O(F30F01,ED,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 141), // #765
+ INST(Tileloadd , AmxRm , V(F20F38,4B,_,0,0,_,_,_ ), 0 , 85 , 0 , 192, 86 ), // #766
+ INST(Tileloaddt1 , AmxRm , V(660F38,4B,_,0,0,_,_,_ ), 0 , 30 , 0 , 192, 86 ), // #767
+ INST(Tilerelease , VexOpMod , V(000F38,49,0,0,0,_,_,_ ), 0 , 11 , 0 , 193, 86 ), // #768
+ INST(Tilestored , AmxMr , V(F30F38,4B,_,0,0,_,_,_ ), 0 , 89 , 0 , 194, 86 ), // #769
+ INST(Tilezero , AmxR , V(F20F38,49,_,0,0,_,_,_ ), 0 , 85 , 0 , 195, 86 ), // #770
+ INST(Tlbsync , X86Op , O(000F01,FF,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 68 ), // #771
+ INST(Tpause , X86R32_EDX_EAX , O(660F00,AE,6,_,_,_,_,_ ), 0 , 28 , 0 , 196, 142), // #772
+ INST(Tzcnt , X86Rm_Raw66H , O(F30F00,BC,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 10 ), // #773
+ INST(Tzmsk , VexVm_Wx , V(XOP_M9,01,4,0,x,_,_,_ ), 0 , 100, 0 , 15 , 12 ), // #774
+ INST(Ucomisd , ExtRm , O(660F00,2E,_,_,_,_,_,_ ), 0 , 4 , 0 , 7 , 43 ), // #775
+ INST(Ucomiss , ExtRm , O(000F00,2E,_,_,_,_,_,_ ), 0 , 5 , 0 , 8 , 44 ), // #776
+ INST(Ud0 , X86Rm , O(000F00,FF,_,_,_,_,_,_ ), 0 , 5 , 0 , 197, 0 ), // #777
+ INST(Ud1 , X86Rm , O(000F00,B9,_,_,_,_,_,_ ), 0 , 5 , 0 , 197, 0 ), // #778
+ INST(Ud2 , X86Op , O(000F00,0B,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #779
+ INST(Uiret , X86Op , O(F30F01,EC,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #780
+ INST(Umonitor , X86R_FromM , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 198, 143), // #781
+ INST(Umwait , X86R32_EDX_EAX , O(F20F00,AE,6,_,_,_,_,_ ), 0 , 101, 0 , 196, 142), // #782
+ INST(Unpckhpd , ExtRm , O(660F00,15,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #783
+ INST(Unpckhps , ExtRm , O(000F00,15,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #784
+ INST(Unpcklpd , ExtRm , O(660F00,14,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #785
+ INST(Unpcklps , ExtRm , O(000F00,14,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #786
+ INST(Vaddpd , VexRvm_Lx , V(660F00,58,_,x,I,1,4,FV ), 0 , 102, 0 , 199, 144), // #787
+ INST(Vaddph , VexRvm_Lx , E(00MAP5,58,_,_,_,0,4,FV ), 0 , 103, 0 , 200, 145), // #788
+ INST(Vaddps , VexRvm_Lx , V(000F00,58,_,x,I,0,4,FV ), 0 , 104, 0 , 201, 144), // #789
+ INST(Vaddsd , VexRvm , V(F20F00,58,_,I,I,1,3,T1S), 0 , 105, 0 , 202, 144), // #790
+ INST(Vaddsh , VexRvm , E(F3MAP5,58,_,_,_,0,1,T1S), 0 , 106, 0 , 203, 145), // #791
+ INST(Vaddss , VexRvm , V(F30F00,58,_,I,I,0,2,T1S), 0 , 107, 0 , 204, 144), // #792
+ INST(Vaddsubpd , VexRvm_Lx , V(660F00,D0,_,x,I,_,_,_ ), 0 , 71 , 0 , 205, 146), // #793
+ INST(Vaddsubps , VexRvm_Lx , V(F20F00,D0,_,x,I,_,_,_ ), 0 , 108, 0 , 205, 146), // #794
+ INST(Vaesdec , VexRvm_Lx , V(660F38,DE,_,x,I,_,4,FVM), 0 , 109, 0 , 206, 147), // #795
+ INST(Vaesdeclast , VexRvm_Lx , V(660F38,DF,_,x,I,_,4,FVM), 0 , 109, 0 , 206, 147), // #796
+ INST(Vaesenc , VexRvm_Lx , V(660F38,DC,_,x,I,_,4,FVM), 0 , 109, 0 , 206, 147), // #797
+ INST(Vaesenclast , VexRvm_Lx , V(660F38,DD,_,x,I,_,4,FVM), 0 , 109, 0 , 206, 147), // #798
+ INST(Vaesimc , VexRm , V(660F38,DB,_,0,I,_,_,_ ), 0 , 30 , 0 , 207, 148), // #799
+ INST(Vaeskeygenassist , VexRmi , V(660F3A,DF,_,0,I,_,_,_ ), 0 , 75 , 0 , 208, 148), // #800
+ INST(Valignd , VexRvmi_Lx , E(660F3A,03,_,x,_,0,4,FV ), 0 , 110, 0 , 209, 149), // #801
+ INST(Valignq , VexRvmi_Lx , E(660F3A,03,_,x,_,1,4,FV ), 0 , 111, 0 , 210, 149), // #802
+ INST(Vandnpd , VexRvm_Lx , V(660F00,55,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 150), // #803
+ INST(Vandnps , VexRvm_Lx , V(000F00,55,_,x,I,0,4,FV ), 0 , 104, 0 , 212, 150), // #804
+ INST(Vandpd , VexRvm_Lx , V(660F00,54,_,x,I,1,4,FV ), 0 , 102, 0 , 213, 150), // #805
+ INST(Vandps , VexRvm_Lx , V(000F00,54,_,x,I,0,4,FV ), 0 , 104, 0 , 214, 150), // #806
+ INST(Vbcstnebf162ps , VexRm_Lx , V(F30F38,B1,_,x,0,_,_,_ ), 0 , 89 , 0 , 215, 151), // #807
+ INST(Vbcstnesh2ps , VexRm_Lx , V(660F38,B1,_,x,0,_,_,_ ), 0 , 30 , 0 , 215, 151), // #808
+ INST(Vblendmpd , VexRvm_Lx , E(660F38,65,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #809
+ INST(Vblendmps , VexRvm_Lx , E(660F38,65,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #810
+ INST(Vblendpd , VexRvmi_Lx , V(660F3A,0D,_,x,I,_,_,_ ), 0 , 75 , 0 , 218, 146), // #811
+ INST(Vblendps , VexRvmi_Lx , V(660F3A,0C,_,x,I,_,_,_ ), 0 , 75 , 0 , 218, 146), // #812
+ INST(Vblendvpd , VexRvmr_Lx , V(660F3A,4B,_,x,0,_,_,_ ), 0 , 75 , 0 , 219, 146), // #813
+ INST(Vblendvps , VexRvmr_Lx , V(660F3A,4A,_,x,0,_,_,_ ), 0 , 75 , 0 , 219, 146), // #814
+ INST(Vbroadcastf128 , VexRm , V(660F38,1A,_,1,0,_,_,_ ), 0 , 114, 0 , 220, 146), // #815
+ INST(Vbroadcastf32x2 , VexRm_Lx , E(660F38,19,_,x,_,0,3,T2 ), 0 , 115, 0 , 221, 152), // #816
+ INST(Vbroadcastf32x4 , VexRm_Lx , E(660F38,1A,_,x,_,0,4,T4 ), 0 , 116, 0 , 222, 149), // #817
+ INST(Vbroadcastf32x8 , VexRm , E(660F38,1B,_,2,_,0,5,T8 ), 0 , 117, 0 , 223, 152), // #818
+ INST(Vbroadcastf64x2 , VexRm_Lx , E(660F38,1A,_,x,_,1,4,T2 ), 0 , 118, 0 , 222, 152), // #819
+ INST(Vbroadcastf64x4 , VexRm , E(660F38,1B,_,2,_,1,5,T4 ), 0 , 119, 0 , 223, 149), // #820
+ INST(Vbroadcasti128 , VexRm , V(660F38,5A,_,1,0,_,_,_ ), 0 , 114, 0 , 220, 153), // #821
+ INST(Vbroadcasti32x2 , VexRm_Lx , E(660F38,59,_,x,_,0,3,T2 ), 0 , 115, 0 , 224, 152), // #822
+ INST(Vbroadcasti32x4 , VexRm_Lx , E(660F38,5A,_,x,_,0,4,T4 ), 0 , 116, 0 , 222, 149), // #823
+ INST(Vbroadcasti32x8 , VexRm , E(660F38,5B,_,2,_,0,5,T8 ), 0 , 117, 0 , 223, 152), // #824
+ INST(Vbroadcasti64x2 , VexRm_Lx , E(660F38,5A,_,x,_,1,4,T2 ), 0 , 118, 0 , 222, 152), // #825
+ INST(Vbroadcasti64x4 , VexRm , E(660F38,5B,_,2,_,1,5,T4 ), 0 , 119, 0 , 223, 149), // #826
+ INST(Vbroadcastsd , VexRm_Lx , V(660F38,19,_,x,0,1,3,T1S), 0 , 120, 0 , 225, 154), // #827
+ INST(Vbroadcastss , VexRm_Lx , V(660F38,18,_,x,0,0,2,T1S), 0 , 121, 0 , 226, 154), // #828
+ INST(Vcmppd , VexRvmi_Lx_KEvex , V(660F00,C2,_,x,I,1,4,FV ), 0 , 102, 0 , 227, 144), // #829
+ INST(Vcmpph , VexRvmi_Lx_KEvex , E(000F3A,C2,_,_,_,0,4,FV ), 0 , 122, 0 , 228, 145), // #830
+ INST(Vcmpps , VexRvmi_Lx_KEvex , V(000F00,C2,_,x,I,0,4,FV ), 0 , 104, 0 , 229, 144), // #831
+ INST(Vcmpsd , VexRvmi_KEvex , V(F20F00,C2,_,I,I,1,3,T1S), 0 , 105, 0 , 230, 144), // #832
+ INST(Vcmpsh , VexRvmi_KEvex , E(F30F3A,C2,_,_,_,0,1,T1S), 0 , 123, 0 , 231, 145), // #833
+ INST(Vcmpss , VexRvmi_KEvex , V(F30F00,C2,_,I,I,0,2,T1S), 0 , 107, 0 , 232, 144), // #834
+ INST(Vcomisd , VexRm , V(660F00,2F,_,I,I,1,3,T1S), 0 , 124, 0 , 233, 155), // #835
+ INST(Vcomish , VexRm , E(00MAP5,2F,_,_,_,0,1,T1S), 0 , 125, 0 , 234, 156), // #836
+ INST(Vcomiss , VexRm , V(000F00,2F,_,I,I,0,2,T1S), 0 , 126, 0 , 235, 155), // #837
+ INST(Vcompresspd , VexMr_Lx , E(660F38,8A,_,x,_,1,3,T1S), 0 , 127, 0 , 236, 149), // #838
+ INST(Vcompressps , VexMr_Lx , E(660F38,8A,_,x,_,0,2,T1S), 0 , 128, 0 , 236, 149), // #839
+ INST(Vcvtdq2pd , VexRm_Lx , V(F30F00,E6,_,x,I,0,3,HV ), 0 , 129, 0 , 237, 144), // #840
+ INST(Vcvtdq2ph , VexRm_Lx_Narrow , E(00MAP5,5B,_,x,0,0,4,FV ), 0 , 103, 0 , 238, 145), // #841
+ INST(Vcvtdq2ps , VexRm_Lx , V(000F00,5B,_,x,I,0,4,FV ), 0 , 104, 0 , 239, 144), // #842
+ INST(Vcvtne2ps2bf16 , VexRvm_Lx , E(F20F38,72,_,_,_,0,4,FV ), 0 , 130, 0 , 217, 157), // #843
+ INST(Vcvtneebf162ps , VexRm_Lx , V(F30F38,B0,_,x,0,_,_,_ ), 0 , 89 , 0 , 240, 151), // #844
+ INST(Vcvtneeph2ps , VexRm_Lx , V(660F38,B0,_,x,0,_,_,_ ), 0 , 30 , 0 , 240, 151), // #845
+ INST(Vcvtneobf162ps , VexRm_Lx , V(F20F38,B0,_,x,0,_,_,_ ), 0 , 85 , 0 , 240, 151), // #846
+ INST(Vcvtneoph2ps , VexRm_Lx , V(000F38,B0,_,x,0,_,_,_ ), 0 , 11 , 0 , 240, 151), // #847
+ INST(Vcvtneps2bf16 , VexRm_Lx_Narrow , V(F30F38,72,_,_,_,0,4,FV ), 0 , 131, 0 , 241, 158), // #848
+ INST(Vcvtpd2dq , VexRm_Lx_Narrow , V(F20F00,E6,_,x,I,1,4,FV ), 0 , 132, 0 , 242, 144), // #849
+ INST(Vcvtpd2ph , VexRm_Lx , E(66MAP5,5A,_,_,_,1,4,FV ), 0 , 133, 0 , 243, 145), // #850
+ INST(Vcvtpd2ps , VexRm_Lx_Narrow , V(660F00,5A,_,x,I,1,4,FV ), 0 , 102, 0 , 242, 144), // #851
+ INST(Vcvtpd2qq , VexRm_Lx , E(660F00,7B,_,x,_,1,4,FV ), 0 , 134, 0 , 244, 152), // #852
+ INST(Vcvtpd2udq , VexRm_Lx_Narrow , E(000F00,79,_,x,_,1,4,FV ), 0 , 135, 0 , 245, 149), // #853
+ INST(Vcvtpd2uqq , VexRm_Lx , E(660F00,79,_,x,_,1,4,FV ), 0 , 134, 0 , 244, 152), // #854
+ INST(Vcvtph2dq , VexRm_Lx , E(66MAP5,5B,_,_,_,0,3,HV ), 0 , 136, 0 , 246, 145), // #855
+ INST(Vcvtph2pd , VexRm_Lx , E(00MAP5,5A,_,_,_,0,2,QV ), 0 , 137, 0 , 247, 145), // #856
+ INST(Vcvtph2ps , VexRm_Lx , V(660F38,13,_,x,0,0,3,HVM), 0 , 138, 0 , 248, 159), // #857
+ INST(Vcvtph2psx , VexRm_Lx , E(66MAP6,13,_,_,_,0,3,HV ), 0 , 139, 0 , 249, 145), // #858
+ INST(Vcvtph2qq , VexRm_Lx , E(66MAP5,7B,_,_,_,0,2,QV ), 0 , 140, 0 , 250, 145), // #859
+ INST(Vcvtph2udq , VexRm_Lx , E(00MAP5,79,_,_,_,0,3,HV ), 0 , 141, 0 , 246, 145), // #860
+ INST(Vcvtph2uqq , VexRm_Lx , E(66MAP5,79,_,_,_,0,2,QV ), 0 , 140, 0 , 250, 145), // #861
+ INST(Vcvtph2uw , VexRm_Lx , E(00MAP5,7D,_,_,_,0,4,FV ), 0 , 103, 0 , 251, 145), // #862
+ INST(Vcvtph2w , VexRm_Lx , E(66MAP5,7D,_,_,_,0,4,FV ), 0 , 142, 0 , 251, 145), // #863
+ INST(Vcvtps2dq , VexRm_Lx , V(660F00,5B,_,x,I,0,4,FV ), 0 , 143, 0 , 239, 144), // #864
+ INST(Vcvtps2pd , VexRm_Lx , V(000F00,5A,_,x,I,0,3,HV ), 0 , 144, 0 , 252, 144), // #865
+ INST(Vcvtps2ph , VexMri_Lx , V(660F3A,1D,_,x,0,0,3,HVM), 0 , 145, 0 , 253, 159), // #866
+ INST(Vcvtps2phx , VexRm_Lx_Narrow , E(66MAP5,1D,_,_,_,0,4,FV ), 0 , 142, 0 , 238, 145), // #867
+ INST(Vcvtps2qq , VexRm_Lx , E(660F00,7B,_,x,_,0,3,HV ), 0 , 146, 0 , 254, 152), // #868
+ INST(Vcvtps2udq , VexRm_Lx , E(000F00,79,_,x,_,0,4,FV ), 0 , 147, 0 , 255, 149), // #869
+ INST(Vcvtps2uqq , VexRm_Lx , E(660F00,79,_,x,_,0,3,HV ), 0 , 146, 0 , 254, 152), // #870
+ INST(Vcvtqq2pd , VexRm_Lx , E(F30F00,E6,_,x,_,1,4,FV ), 0 , 148, 0 , 244, 152), // #871
+ INST(Vcvtqq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,1,4,FV ), 0 , 149, 0 , 243, 145), // #872
+ INST(Vcvtqq2ps , VexRm_Lx_Narrow , E(000F00,5B,_,x,_,1,4,FV ), 0 , 135, 0 , 245, 152), // #873
+ INST(Vcvtsd2sh , VexRvm , E(F2MAP5,5A,_,_,_,1,3,T1S), 0 , 150, 0 , 256, 145), // #874
+ INST(Vcvtsd2si , VexRm_Wx , V(F20F00,2D,_,I,x,x,3,T1F), 0 , 151, 0 , 257, 144), // #875
+ INST(Vcvtsd2ss , VexRvm , V(F20F00,5A,_,I,I,1,3,T1S), 0 , 105, 0 , 202, 144), // #876
+ INST(Vcvtsd2usi , VexRm_Wx , E(F20F00,79,_,I,_,x,3,T1F), 0 , 152, 0 , 258, 149), // #877
+ INST(Vcvtsh2sd , VexRvm , E(F3MAP5,5A,_,_,_,0,1,T1S), 0 , 106, 0 , 259, 145), // #878
+ INST(Vcvtsh2si , VexRm_Wx , E(F3MAP5,2D,_,_,_,x,1,T1S), 0 , 106, 0 , 260, 145), // #879
+ INST(Vcvtsh2ss , VexRvm , E(00MAP6,13,_,_,_,0,1,T1S), 0 , 153, 0 , 259, 145), // #880
+ INST(Vcvtsh2usi , VexRm_Wx , E(F3MAP5,79,_,_,_,x,1,T1S), 0 , 106, 0 , 260, 145), // #881
+ INST(Vcvtsi2sd , VexRvm_Wx , V(F20F00,2A,_,I,x,x,2,T1W), 0 , 154, 0 , 261, 144), // #882
+ INST(Vcvtsi2sh , VexRvm_Wx , E(F3MAP5,2A,_,_,_,x,2,T1W), 0 , 155, 0 , 262, 145), // #883
+ INST(Vcvtsi2ss , VexRvm_Wx , V(F30F00,2A,_,I,x,x,2,T1W), 0 , 156, 0 , 261, 144), // #884
+ INST(Vcvtss2sd , VexRvm , V(F30F00,5A,_,I,I,0,2,T1S), 0 , 107, 0 , 263, 144), // #885
+ INST(Vcvtss2sh , VexRvm , E(00MAP5,1D,_,_,_,0,2,T1S), 0 , 157, 0 , 264, 145), // #886
+ INST(Vcvtss2si , VexRm_Wx , V(F30F00,2D,_,I,x,x,2,T1F), 0 , 107, 0 , 265, 144), // #887
+ INST(Vcvtss2usi , VexRm_Wx , E(F30F00,79,_,I,_,x,2,T1F), 0 , 158, 0 , 266, 149), // #888
+ INST(Vcvttpd2dq , VexRm_Lx_Narrow , V(660F00,E6,_,x,I,1,4,FV ), 0 , 102, 0 , 267, 144), // #889
+ INST(Vcvttpd2qq , VexRm_Lx , E(660F00,7A,_,x,_,1,4,FV ), 0 , 134, 0 , 268, 149), // #890
+ INST(Vcvttpd2udq , VexRm_Lx_Narrow , E(000F00,78,_,x,_,1,4,FV ), 0 , 135, 0 , 269, 149), // #891
+ INST(Vcvttpd2uqq , VexRm_Lx , E(660F00,78,_,x,_,1,4,FV ), 0 , 134, 0 , 268, 152), // #892
+ INST(Vcvttph2dq , VexRm_Lx , E(F3MAP5,5B,_,_,_,0,3,HV ), 0 , 159, 0 , 249, 145), // #893
+ INST(Vcvttph2qq , VexRm_Lx , E(66MAP5,7A,_,_,_,0,2,QV ), 0 , 140, 0 , 247, 145), // #894
+ INST(Vcvttph2udq , VexRm_Lx , E(00MAP5,78,_,_,_,0,3,HV ), 0 , 141, 0 , 249, 145), // #895
+ INST(Vcvttph2uqq , VexRm_Lx , E(66MAP5,78,_,_,_,0,2,QV ), 0 , 140, 0 , 247, 145), // #896
+ INST(Vcvttph2uw , VexRm_Lx , E(00MAP5,7C,_,_,_,0,4,FV ), 0 , 103, 0 , 270, 145), // #897
+ INST(Vcvttph2w , VexRm_Lx , E(66MAP5,7C,_,_,_,0,4,FV ), 0 , 142, 0 , 270, 145), // #898
+ INST(Vcvttps2dq , VexRm_Lx , V(F30F00,5B,_,x,I,0,4,FV ), 0 , 160, 0 , 271, 144), // #899
+ INST(Vcvttps2qq , VexRm_Lx , E(660F00,7A,_,x,_,0,3,HV ), 0 , 146, 0 , 272, 152), // #900
+ INST(Vcvttps2udq , VexRm_Lx , E(000F00,78,_,x,_,0,4,FV ), 0 , 147, 0 , 273, 149), // #901
+ INST(Vcvttps2uqq , VexRm_Lx , E(660F00,78,_,x,_,0,3,HV ), 0 , 146, 0 , 272, 152), // #902
+ INST(Vcvttsd2si , VexRm_Wx , V(F20F00,2C,_,I,x,x,3,T1F), 0 , 151, 0 , 274, 144), // #903
+ INST(Vcvttsd2usi , VexRm_Wx , E(F20F00,78,_,I,_,x,3,T1F), 0 , 152, 0 , 275, 149), // #904
+ INST(Vcvttsh2si , VexRm_Wx , E(F3MAP5,2C,_,_,_,x,1,T1S), 0 , 106, 0 , 276, 145), // #905
+ INST(Vcvttsh2usi , VexRm_Wx , E(F3MAP5,78,_,_,_,x,1,T1S), 0 , 106, 0 , 276, 145), // #906
+ INST(Vcvttss2si , VexRm_Wx , V(F30F00,2C,_,I,x,x,2,T1F), 0 , 107, 0 , 277, 144), // #907
+ INST(Vcvttss2usi , VexRm_Wx , E(F30F00,78,_,I,_,x,2,T1F), 0 , 158, 0 , 278, 149), // #908
+ INST(Vcvtudq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,0,3,HV ), 0 , 161, 0 , 254, 149), // #909
+ INST(Vcvtudq2ph , VexRm_Lx_Narrow , E(F2MAP5,7A,_,_,_,0,4,FV ), 0 , 162, 0 , 238, 145), // #910
+ INST(Vcvtudq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,0,4,FV ), 0 , 163, 0 , 255, 149), // #911
+ INST(Vcvtuqq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,1,4,FV ), 0 , 148, 0 , 244, 152), // #912
+ INST(Vcvtuqq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,1,4,FV ), 0 , 164, 0 , 243, 145), // #913
+ INST(Vcvtuqq2ps , VexRm_Lx_Narrow , E(F20F00,7A,_,x,_,1,4,FV ), 0 , 165, 0 , 245, 152), // #914
+ INST(Vcvtusi2sd , VexRvm_Wx , E(F20F00,7B,_,I,_,x,2,T1W), 0 , 166, 0 , 279, 149), // #915
+ INST(Vcvtusi2sh , VexRvm_Wx , E(F3MAP5,7B,_,_,_,x,2,T1W), 0 , 155, 0 , 262, 145), // #916
+ INST(Vcvtusi2ss , VexRvm_Wx , E(F30F00,7B,_,I,_,x,2,T1W), 0 , 167, 0 , 279, 149), // #917
+ INST(Vcvtuw2ph , VexRm_Lx , E(F2MAP5,7D,_,_,_,0,4,FV ), 0 , 162, 0 , 251, 145), // #918
+ INST(Vcvtw2ph , VexRm_Lx , E(F3MAP5,7D,_,_,_,0,4,FV ), 0 , 168, 0 , 251, 145), // #919
+ INST(Vdbpsadbw , VexRvmi_Lx , E(660F3A,42,_,x,_,0,4,FVM), 0 , 110, 0 , 280, 160), // #920
+ INST(Vdivpd , VexRvm_Lx , V(660F00,5E,_,x,I,1,4,FV ), 0 , 102, 0 , 199, 144), // #921
+ INST(Vdivph , VexRvm_Lx , E(00MAP5,5E,_,_,_,0,4,FV ), 0 , 103, 0 , 200, 145), // #922
+ INST(Vdivps , VexRvm_Lx , V(000F00,5E,_,x,I,0,4,FV ), 0 , 104, 0 , 201, 144), // #923
+ INST(Vdivsd , VexRvm , V(F20F00,5E,_,I,I,1,3,T1S), 0 , 105, 0 , 202, 144), // #924
+ INST(Vdivsh , VexRvm , E(F3MAP5,5E,_,_,_,0,1,T1S), 0 , 106, 0 , 203, 145), // #925
+ INST(Vdivss , VexRvm , V(F30F00,5E,_,I,I,0,2,T1S), 0 , 107, 0 , 204, 144), // #926
+ INST(Vdpbf16ps , VexRvm_Lx , E(F30F38,52,_,_,_,0,4,FV ), 0 , 169, 0 , 217, 157), // #927
+ INST(Vdppd , VexRvmi_Lx , V(660F3A,41,_,x,I,_,_,_ ), 0 , 75 , 0 , 281, 146), // #928
+ INST(Vdpps , VexRvmi_Lx , V(660F3A,40,_,x,I,_,_,_ ), 0 , 75 , 0 , 218, 146), // #929
+ INST(Verr , X86M_NoSize , O(000F00,00,4,_,_,_,_,_ ), 0 , 98 , 0 , 111, 11 ), // #930
+ INST(Verw , X86M_NoSize , O(000F00,00,5,_,_,_,_,_ ), 0 , 79 , 0 , 111, 11 ), // #931
+ INST(Vexpandpd , VexRm_Lx , E(660F38,88,_,x,_,1,3,T1S), 0 , 127, 0 , 282, 149), // #932
+ INST(Vexpandps , VexRm_Lx , E(660F38,88,_,x,_,0,2,T1S), 0 , 128, 0 , 282, 149), // #933
+ INST(Vextractf128 , VexMri , V(660F3A,19,_,1,0,_,_,_ ), 0 , 170, 0 , 283, 146), // #934
+ INST(Vextractf32x4 , VexMri_Lx , E(660F3A,19,_,x,_,0,4,T4 ), 0 , 171, 0 , 284, 149), // #935
+ INST(Vextractf32x8 , VexMri , E(660F3A,1B,_,2,_,0,5,T8 ), 0 , 172, 0 , 285, 152), // #936
+ INST(Vextractf64x2 , VexMri_Lx , E(660F3A,19,_,x,_,1,4,T2 ), 0 , 173, 0 , 284, 152), // #937
+ INST(Vextractf64x4 , VexMri , E(660F3A,1B,_,2,_,1,5,T4 ), 0 , 174, 0 , 285, 149), // #938
+ INST(Vextracti128 , VexMri , V(660F3A,39,_,1,0,_,_,_ ), 0 , 170, 0 , 283, 153), // #939
+ INST(Vextracti32x4 , VexMri_Lx , E(660F3A,39,_,x,_,0,4,T4 ), 0 , 171, 0 , 284, 149), // #940
+ INST(Vextracti32x8 , VexMri , E(660F3A,3B,_,2,_,0,5,T8 ), 0 , 172, 0 , 285, 152), // #941
+ INST(Vextracti64x2 , VexMri_Lx , E(660F3A,39,_,x,_,1,4,T2 ), 0 , 173, 0 , 284, 152), // #942
+ INST(Vextracti64x4 , VexMri , E(660F3A,3B,_,2,_,1,5,T4 ), 0 , 174, 0 , 285, 149), // #943
+ INST(Vextractps , VexMri , V(660F3A,17,_,0,I,I,2,T1S), 0 , 175, 0 , 286, 144), // #944
+ INST(Vfcmaddcph , VexRvm_Lx , E(F2MAP6,56,_,_,_,0,4,FV ), 0 , 176, 0 , 287, 145), // #945
+ INST(Vfcmaddcsh , VexRvm , E(F2MAP6,57,_,_,_,0,2,T1S), 0 , 177, 0 , 264, 145), // #946
+ INST(Vfcmulcph , VexRvm_Lx , E(F2MAP6,D6,_,_,_,0,4,FV ), 0 , 176, 0 , 287, 145), // #947
+ INST(Vfcmulcsh , VexRvm , E(F2MAP6,D7,_,_,_,0,2,T1S), 0 , 177, 0 , 264, 145), // #948
+ INST(Vfixupimmpd , VexRvmi_Lx , E(660F3A,54,_,x,_,1,4,FV ), 0 , 111, 0 , 288, 149), // #949
+ INST(Vfixupimmps , VexRvmi_Lx , E(660F3A,54,_,x,_,0,4,FV ), 0 , 110, 0 , 289, 149), // #950
+ INST(Vfixupimmsd , VexRvmi , E(660F3A,55,_,I,_,1,3,T1S), 0 , 178, 0 , 290, 149), // #951
+ INST(Vfixupimmss , VexRvmi , E(660F3A,55,_,I,_,0,2,T1S), 0 , 179, 0 , 291, 149), // #952
+ INST(Vfmadd132pd , VexRvm_Lx , V(660F38,98,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #953
+ INST(Vfmadd132ph , VexRvm_Lx , E(66MAP6,98,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #954
+ INST(Vfmadd132ps , VexRvm_Lx , V(660F38,98,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #955
+ INST(Vfmadd132sd , VexRvm , V(660F38,99,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #956
+ INST(Vfmadd132sh , VexRvm , E(66MAP6,99,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #957
+ INST(Vfmadd132ss , VexRvm , V(660F38,99,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #958
+ INST(Vfmadd213pd , VexRvm_Lx , V(660F38,A8,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #959
+ INST(Vfmadd213ph , VexRvm_Lx , E(66MAP6,A8,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #960
+ INST(Vfmadd213ps , VexRvm_Lx , V(660F38,A8,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #961
+ INST(Vfmadd213sd , VexRvm , V(660F38,A9,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #962
+ INST(Vfmadd213sh , VexRvm , E(66MAP6,A9,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #963
+ INST(Vfmadd213ss , VexRvm , V(660F38,A9,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #964
+ INST(Vfmadd231pd , VexRvm_Lx , V(660F38,B8,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #965
+ INST(Vfmadd231ph , VexRvm_Lx , E(66MAP6,B8,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #966
+ INST(Vfmadd231ps , VexRvm_Lx , V(660F38,B8,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #967
+ INST(Vfmadd231sd , VexRvm , V(660F38,B9,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #968
+ INST(Vfmadd231sh , VexRvm , E(66MAP6,B9,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #969
+ INST(Vfmadd231ss , VexRvm , V(660F38,B9,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #970
+ INST(Vfmaddcph , VexRvm_Lx , E(F3MAP6,56,_,_,_,0,4,FV ), 0 , 184, 0 , 287, 145), // #971
+ INST(Vfmaddcsh , VexRvm , E(F3MAP6,57,_,_,_,0,2,T1S), 0 , 185, 0 , 264, 145), // #972
+ INST(Vfmaddpd , Fma4_Lx , V(660F3A,69,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #973
+ INST(Vfmaddps , Fma4_Lx , V(660F3A,68,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #974
+ INST(Vfmaddsd , Fma4 , V(660F3A,6B,_,0,x,_,_,_ ), 0 , 75 , 0 , 293, 162), // #975
+ INST(Vfmaddss , Fma4 , V(660F3A,6A,_,0,x,_,_,_ ), 0 , 75 , 0 , 294, 162), // #976
+ INST(Vfmaddsub132pd , VexRvm_Lx , V(660F38,96,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #977
+ INST(Vfmaddsub132ph , VexRvm_Lx , E(66MAP6,96,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #978
+ INST(Vfmaddsub132ps , VexRvm_Lx , V(660F38,96,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #979
+ INST(Vfmaddsub213pd , VexRvm_Lx , V(660F38,A6,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #980
+ INST(Vfmaddsub213ph , VexRvm_Lx , E(66MAP6,A6,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #981
+ INST(Vfmaddsub213ps , VexRvm_Lx , V(660F38,A6,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #982
+ INST(Vfmaddsub231pd , VexRvm_Lx , V(660F38,B6,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #983
+ INST(Vfmaddsub231ph , VexRvm_Lx , E(66MAP6,B6,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #984
+ INST(Vfmaddsub231ps , VexRvm_Lx , V(660F38,B6,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #985
+ INST(Vfmaddsubpd , Fma4_Lx , V(660F3A,5D,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #986
+ INST(Vfmaddsubps , Fma4_Lx , V(660F3A,5C,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #987
+ INST(Vfmsub132pd , VexRvm_Lx , V(660F38,9A,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #988
+ INST(Vfmsub132ph , VexRvm_Lx , E(66MAP6,9A,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #989
+ INST(Vfmsub132ps , VexRvm_Lx , V(660F38,9A,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #990
+ INST(Vfmsub132sd , VexRvm , V(660F38,9B,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #991
+ INST(Vfmsub132sh , VexRvm , E(66MAP6,9B,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #992
+ INST(Vfmsub132ss , VexRvm , V(660F38,9B,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #993
+ INST(Vfmsub213pd , VexRvm_Lx , V(660F38,AA,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #994
+ INST(Vfmsub213ph , VexRvm_Lx , E(66MAP6,AA,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #995
+ INST(Vfmsub213ps , VexRvm_Lx , V(660F38,AA,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #996
+ INST(Vfmsub213sd , VexRvm , V(660F38,AB,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #997
+ INST(Vfmsub213sh , VexRvm , E(66MAP6,AB,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #998
+ INST(Vfmsub213ss , VexRvm , V(660F38,AB,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #999
+ INST(Vfmsub231pd , VexRvm_Lx , V(660F38,BA,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1000
+ INST(Vfmsub231ph , VexRvm_Lx , E(66MAP6,BA,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1001
+ INST(Vfmsub231ps , VexRvm_Lx , V(660F38,BA,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1002
+ INST(Vfmsub231sd , VexRvm , V(660F38,BB,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1003
+ INST(Vfmsub231sh , VexRvm , E(66MAP6,BB,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1004
+ INST(Vfmsub231ss , VexRvm , V(660F38,BB,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1005
+ INST(Vfmsubadd132pd , VexRvm_Lx , V(660F38,97,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1006
+ INST(Vfmsubadd132ph , VexRvm_Lx , E(66MAP6,97,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1007
+ INST(Vfmsubadd132ps , VexRvm_Lx , V(660F38,97,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1008
+ INST(Vfmsubadd213pd , VexRvm_Lx , V(660F38,A7,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1009
+ INST(Vfmsubadd213ph , VexRvm_Lx , E(66MAP6,A7,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1010
+ INST(Vfmsubadd213ps , VexRvm_Lx , V(660F38,A7,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1011
+ INST(Vfmsubadd231pd , VexRvm_Lx , V(660F38,B7,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1012
+ INST(Vfmsubadd231ph , VexRvm_Lx , E(66MAP6,B7,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1013
+ INST(Vfmsubadd231ps , VexRvm_Lx , V(660F38,B7,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1014
+ INST(Vfmsubaddpd , Fma4_Lx , V(660F3A,5F,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1015
+ INST(Vfmsubaddps , Fma4_Lx , V(660F3A,5E,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1016
+ INST(Vfmsubpd , Fma4_Lx , V(660F3A,6D,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1017
+ INST(Vfmsubps , Fma4_Lx , V(660F3A,6C,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1018
+ INST(Vfmsubsd , Fma4 , V(660F3A,6F,_,0,x,_,_,_ ), 0 , 75 , 0 , 293, 162), // #1019
+ INST(Vfmsubss , Fma4 , V(660F3A,6E,_,0,x,_,_,_ ), 0 , 75 , 0 , 294, 162), // #1020
+ INST(Vfmulcph , VexRvm_Lx , E(F3MAP6,D6,_,_,_,0,4,FV ), 0 , 184, 0 , 287, 145), // #1021
+ INST(Vfmulcsh , VexRvm , E(F3MAP6,D7,_,_,_,0,2,T1S), 0 , 185, 0 , 264, 145), // #1022
+ INST(Vfnmadd132pd , VexRvm_Lx , V(660F38,9C,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1023
+ INST(Vfnmadd132ph , VexRvm_Lx , E(66MAP6,9C,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1024
+ INST(Vfnmadd132ps , VexRvm_Lx , V(660F38,9C,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1025
+ INST(Vfnmadd132sd , VexRvm , V(660F38,9D,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1026
+ INST(Vfnmadd132sh , VexRvm , E(66MAP6,9D,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1027
+ INST(Vfnmadd132ss , VexRvm , V(660F38,9D,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1028
+ INST(Vfnmadd213pd , VexRvm_Lx , V(660F38,AC,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1029
+ INST(Vfnmadd213ph , VexRvm_Lx , E(66MAP6,AC,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1030
+ INST(Vfnmadd213ps , VexRvm_Lx , V(660F38,AC,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1031
+ INST(Vfnmadd213sd , VexRvm , V(660F38,AD,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1032
+ INST(Vfnmadd213sh , VexRvm , E(66MAP6,AD,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1033
+ INST(Vfnmadd213ss , VexRvm , V(660F38,AD,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1034
+ INST(Vfnmadd231pd , VexRvm_Lx , V(660F38,BC,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1035
+ INST(Vfnmadd231ph , VexRvm_Lx , E(66MAP6,BC,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1036
+ INST(Vfnmadd231ps , VexRvm_Lx , V(660F38,BC,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1037
+ INST(Vfnmadd231sd , VexRvm , V(660F38,BD,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1038
+ INST(Vfnmadd231sh , VexRvm , E(66MAP6,BD,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1039
+ INST(Vfnmadd231ss , VexRvm , V(660F38,BD,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1040
+ INST(Vfnmaddpd , Fma4_Lx , V(660F3A,79,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1041
+ INST(Vfnmaddps , Fma4_Lx , V(660F3A,78,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1042
+ INST(Vfnmaddsd , Fma4 , V(660F3A,7B,_,0,x,_,_,_ ), 0 , 75 , 0 , 293, 162), // #1043
+ INST(Vfnmaddss , Fma4 , V(660F3A,7A,_,0,x,_,_,_ ), 0 , 75 , 0 , 294, 162), // #1044
+ INST(Vfnmsub132pd , VexRvm_Lx , V(660F38,9E,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1045
+ INST(Vfnmsub132ph , VexRvm_Lx , E(66MAP6,9E,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1046
+ INST(Vfnmsub132ps , VexRvm_Lx , V(660F38,9E,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1047
+ INST(Vfnmsub132sd , VexRvm , V(660F38,9F,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1048
+ INST(Vfnmsub132sh , VexRvm , E(66MAP6,9F,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1049
+ INST(Vfnmsub132ss , VexRvm , V(660F38,9F,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1050
+ INST(Vfnmsub213pd , VexRvm_Lx , V(660F38,AE,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1051
+ INST(Vfnmsub213ph , VexRvm_Lx , E(66MAP6,AE,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1052
+ INST(Vfnmsub213ps , VexRvm_Lx , V(660F38,AE,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1053
+ INST(Vfnmsub213sd , VexRvm , V(660F38,AF,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1054
+ INST(Vfnmsub213sh , VexRvm , E(66MAP6,AF,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1055
+ INST(Vfnmsub213ss , VexRvm , V(660F38,AF,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1056
+ INST(Vfnmsub231pd , VexRvm_Lx , V(660F38,BE,_,x,1,1,4,FV ), 0 , 180, 0 , 199, 161), // #1057
+ INST(Vfnmsub231ph , VexRvm_Lx , E(66MAP6,BE,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1058
+ INST(Vfnmsub231ps , VexRvm_Lx , V(660F38,BE,_,x,0,0,4,FV ), 0 , 109, 0 , 201, 161), // #1059
+ INST(Vfnmsub231sd , VexRvm , V(660F38,BF,_,I,1,1,3,T1S), 0 , 182, 0 , 202, 161), // #1060
+ INST(Vfnmsub231sh , VexRvm , E(66MAP6,BF,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1061
+ INST(Vfnmsub231ss , VexRvm , V(660F38,BF,_,I,0,0,2,T1S), 0 , 121, 0 , 204, 161), // #1062
+ INST(Vfnmsubpd , Fma4_Lx , V(660F3A,7D,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1063
+ INST(Vfnmsubps , Fma4_Lx , V(660F3A,7C,_,x,x,_,_,_ ), 0 , 75 , 0 , 292, 162), // #1064
+ INST(Vfnmsubsd , Fma4 , V(660F3A,7F,_,0,x,_,_,_ ), 0 , 75 , 0 , 293, 162), // #1065
+ INST(Vfnmsubss , Fma4 , V(660F3A,7E,_,0,x,_,_,_ ), 0 , 75 , 0 , 294, 162), // #1066
+ INST(Vfpclasspd , VexRmi_Lx , E(660F3A,66,_,x,_,1,4,FV ), 0 , 111, 0 , 295, 152), // #1067
+ INST(Vfpclassph , VexRmi_Lx , E(000F3A,66,_,_,_,0,4,FV ), 0 , 122, 0 , 296, 145), // #1068
+ INST(Vfpclassps , VexRmi_Lx , E(660F3A,66,_,x,_,0,4,FV ), 0 , 110, 0 , 297, 152), // #1069
+ INST(Vfpclasssd , VexRmi , E(660F3A,67,_,I,_,1,3,T1S), 0 , 178, 0 , 298, 152), // #1070
+ INST(Vfpclasssh , VexRmi , E(000F3A,67,_,_,_,0,1,T1S), 0 , 186, 0 , 299, 145), // #1071
+ INST(Vfpclassss , VexRmi , E(660F3A,67,_,I,_,0,2,T1S), 0 , 179, 0 , 300, 152), // #1072
+ INST(Vfrczpd , VexRm_Lx , V(XOP_M9,81,_,x,0,_,_,_ ), 0 , 81 , 0 , 301, 163), // #1073
+ INST(Vfrczps , VexRm_Lx , V(XOP_M9,80,_,x,0,_,_,_ ), 0 , 81 , 0 , 301, 163), // #1074
+ INST(Vfrczsd , VexRm , V(XOP_M9,83,_,0,0,_,_,_ ), 0 , 81 , 0 , 302, 163), // #1075
+ INST(Vfrczss , VexRm , V(XOP_M9,82,_,0,0,_,_,_ ), 0 , 81 , 0 , 303, 163), // #1076
+ INST(Vgatherdpd , VexRmvRm_VM , V(660F38,92,_,x,1,_,_,_ ), E(660F38,92,_,x,_,1,3,T1S), 187, 80 , 304, 164), // #1077
+ INST(Vgatherdps , VexRmvRm_VM , V(660F38,92,_,x,0,_,_,_ ), E(660F38,92,_,x,_,0,2,T1S), 30 , 81 , 305, 164), // #1078
+ INST(Vgatherqpd , VexRmvRm_VM , V(660F38,93,_,x,1,_,_,_ ), E(660F38,93,_,x,_,1,3,T1S), 187, 82 , 306, 164), // #1079
+ INST(Vgatherqps , VexRmvRm_VM , V(660F38,93,_,x,0,_,_,_ ), E(660F38,93,_,x,_,0,2,T1S), 30 , 83 , 307, 164), // #1080
+ INST(Vgetexppd , VexRm_Lx , E(660F38,42,_,x,_,1,4,FV ), 0 , 112, 0 , 268, 149), // #1081
+ INST(Vgetexpph , VexRm_Lx , E(66MAP6,42,_,_,_,0,4,FV ), 0 , 181, 0 , 270, 145), // #1082
+ INST(Vgetexpps , VexRm_Lx , E(660F38,42,_,x,_,0,4,FV ), 0 , 113, 0 , 273, 149), // #1083
+ INST(Vgetexpsd , VexRvm , E(660F38,43,_,I,_,1,3,T1S), 0 , 127, 0 , 308, 149), // #1084
+ INST(Vgetexpsh , VexRvm , E(66MAP6,43,_,_,_,0,1,T1S), 0 , 183, 0 , 259, 145), // #1085
+ INST(Vgetexpss , VexRvm , E(660F38,43,_,I,_,0,2,T1S), 0 , 128, 0 , 309, 149), // #1086
+ INST(Vgetmantpd , VexRmi_Lx , E(660F3A,26,_,x,_,1,4,FV ), 0 , 111, 0 , 310, 149), // #1087
+ INST(Vgetmantph , VexRmi_Lx , E(000F3A,26,_,_,_,0,4,FV ), 0 , 122, 0 , 311, 145), // #1088
+ INST(Vgetmantps , VexRmi_Lx , E(660F3A,26,_,x,_,0,4,FV ), 0 , 110, 0 , 312, 149), // #1089
+ INST(Vgetmantsd , VexRvmi , E(660F3A,27,_,I,_,1,3,T1S), 0 , 178, 0 , 290, 149), // #1090
+ INST(Vgetmantsh , VexRvmi , E(000F3A,27,_,_,_,0,1,T1S), 0 , 186, 0 , 313, 145), // #1091
+ INST(Vgetmantss , VexRvmi , E(660F3A,27,_,I,_,0,2,T1S), 0 , 179, 0 , 291, 149), // #1092
+ INST(Vgf2p8affineinvqb, VexRvmi_Lx , V(660F3A,CF,_,x,1,1,4,FV ), 0 , 188, 0 , 314, 165), // #1093
+ INST(Vgf2p8affineqb , VexRvmi_Lx , V(660F3A,CE,_,x,1,1,4,FV ), 0 , 188, 0 , 314, 165), // #1094
+ INST(Vgf2p8mulb , VexRvm_Lx , V(660F38,CF,_,x,0,0,4,FV ), 0 , 109, 0 , 315, 165), // #1095
+ INST(Vhaddpd , VexRvm_Lx , V(660F00,7C,_,x,I,_,_,_ ), 0 , 71 , 0 , 205, 146), // #1096
+ INST(Vhaddps , VexRvm_Lx , V(F20F00,7C,_,x,I,_,_,_ ), 0 , 108, 0 , 205, 146), // #1097
+ INST(Vhsubpd , VexRvm_Lx , V(660F00,7D,_,x,I,_,_,_ ), 0 , 71 , 0 , 205, 146), // #1098
+ INST(Vhsubps , VexRvm_Lx , V(F20F00,7D,_,x,I,_,_,_ ), 0 , 108, 0 , 205, 146), // #1099
+ INST(Vinsertf128 , VexRvmi , V(660F3A,18,_,1,0,_,_,_ ), 0 , 170, 0 , 316, 146), // #1100
+ INST(Vinsertf32x4 , VexRvmi_Lx , E(660F3A,18,_,x,_,0,4,T4 ), 0 , 171, 0 , 317, 149), // #1101
+ INST(Vinsertf32x8 , VexRvmi , E(660F3A,1A,_,2,_,0,5,T8 ), 0 , 172, 0 , 318, 152), // #1102
+ INST(Vinsertf64x2 , VexRvmi_Lx , E(660F3A,18,_,x,_,1,4,T2 ), 0 , 173, 0 , 317, 152), // #1103
+ INST(Vinsertf64x4 , VexRvmi , E(660F3A,1A,_,2,_,1,5,T4 ), 0 , 174, 0 , 318, 149), // #1104
+ INST(Vinserti128 , VexRvmi , V(660F3A,38,_,1,0,_,_,_ ), 0 , 170, 0 , 316, 153), // #1105
+ INST(Vinserti32x4 , VexRvmi_Lx , E(660F3A,38,_,x,_,0,4,T4 ), 0 , 171, 0 , 317, 149), // #1106
+ INST(Vinserti32x8 , VexRvmi , E(660F3A,3A,_,2,_,0,5,T8 ), 0 , 172, 0 , 318, 152), // #1107
+ INST(Vinserti64x2 , VexRvmi_Lx , E(660F3A,38,_,x,_,1,4,T2 ), 0 , 173, 0 , 317, 152), // #1108
+ INST(Vinserti64x4 , VexRvmi , E(660F3A,3A,_,2,_,1,5,T4 ), 0 , 174, 0 , 318, 149), // #1109
+ INST(Vinsertps , VexRvmi , V(660F3A,21,_,0,I,0,2,T1S), 0 , 175, 0 , 319, 144), // #1110
+ INST(Vlddqu , VexRm_Lx , V(F20F00,F0,_,x,I,_,_,_ ), 0 , 108, 0 , 240, 146), // #1111
+ INST(Vldmxcsr , VexM , V(000F00,AE,2,0,I,_,_,_ ), 0 , 189, 0 , 320, 146), // #1112
+ INST(Vmaskmovdqu , VexRm_ZDI , V(660F00,F7,_,0,I,_,_,_ ), 0 , 71 , 0 , 321, 146), // #1113
+ INST(Vmaskmovpd , VexRvmMvr_Lx , V(660F38,2D,_,x,0,_,_,_ ), V(660F38,2F,_,x,0,_,_,_ ), 30 , 84 , 322, 146), // #1114
+ INST(Vmaskmovps , VexRvmMvr_Lx , V(660F38,2C,_,x,0,_,_,_ ), V(660F38,2E,_,x,0,_,_,_ ), 30 , 85 , 322, 146), // #1115
+ INST(Vmaxpd , VexRvm_Lx , V(660F00,5F,_,x,I,1,4,FV ), 0 , 102, 0 , 323, 144), // #1116
+ INST(Vmaxph , VexRvm_Lx , E(00MAP5,5F,_,_,_,0,4,FV ), 0 , 103, 0 , 324, 145), // #1117
+ INST(Vmaxps , VexRvm_Lx , V(000F00,5F,_,x,I,0,4,FV ), 0 , 104, 0 , 325, 144), // #1118
+ INST(Vmaxsd , VexRvm , V(F20F00,5F,_,I,I,1,3,T1S), 0 , 105, 0 , 326, 144), // #1119
+ INST(Vmaxsh , VexRvm , E(F3MAP5,5F,_,_,_,0,1,T1S), 0 , 106, 0 , 259, 145), // #1120
+ INST(Vmaxss , VexRvm , V(F30F00,5F,_,I,I,0,2,T1S), 0 , 107, 0 , 263, 144), // #1121
+ INST(Vmcall , X86Op , O(000F01,C1,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1122
+ INST(Vmclear , X86M_Only , O(660F00,C7,6,_,_,_,_,_ ), 0 , 28 , 0 , 33 , 67 ), // #1123
+ INST(Vmfunc , X86Op , O(000F01,D4,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1124
+ INST(Vmgexit , X86Op , O(F20F01,D9,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 166), // #1125
+ INST(Vminpd , VexRvm_Lx , V(660F00,5D,_,x,I,1,4,FV ), 0 , 102, 0 , 323, 144), // #1126
+ INST(Vminph , VexRvm_Lx , E(00MAP5,5D,_,_,_,0,4,FV ), 0 , 103, 0 , 324, 145), // #1127
+ INST(Vminps , VexRvm_Lx , V(000F00,5D,_,x,I,0,4,FV ), 0 , 104, 0 , 325, 144), // #1128
+ INST(Vminsd , VexRvm , V(F20F00,5D,_,I,I,1,3,T1S), 0 , 105, 0 , 326, 144), // #1129
+ INST(Vminsh , VexRvm , E(F3MAP5,5D,_,_,_,0,1,T1S), 0 , 106, 0 , 259, 145), // #1130
+ INST(Vminss , VexRvm , V(F30F00,5D,_,I,I,0,2,T1S), 0 , 107, 0 , 263, 144), // #1131
+ INST(Vmlaunch , X86Op , O(000F01,C2,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1132
+ INST(Vmload , X86Op_xAX , O(000F01,DA,_,_,_,_,_,_ ), 0 , 23 , 0 , 327, 23 ), // #1133
+ INST(Vmmcall , X86Op , O(000F01,D9,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 23 ), // #1134
+ INST(Vmovapd , VexRmMr_Lx , V(660F00,28,_,x,I,1,4,FVM), V(660F00,29,_,x,I,1,4,FVM), 102, 86 , 328, 167), // #1135
+ INST(Vmovaps , VexRmMr_Lx , V(000F00,28,_,x,I,0,4,FVM), V(000F00,29,_,x,I,0,4,FVM), 104, 87 , 328, 167), // #1136
+ INST(Vmovd , VexMovdMovq , V(660F00,6E,_,0,0,0,2,T1S), V(660F00,7E,_,0,0,0,2,T1S), 190, 88 , 329, 144), // #1137
+ INST(Vmovddup , VexRm_Lx , V(F20F00,12,_,x,I,1,3,DUP), 0 , 191, 0 , 330, 144), // #1138
+ INST(Vmovdqa , VexRmMr_Lx , V(660F00,6F,_,x,I,_,_,_ ), V(660F00,7F,_,x,I,_,_,_ ), 71 , 89 , 331, 168), // #1139
+ INST(Vmovdqa32 , VexRmMr_Lx , E(660F00,6F,_,x,_,0,4,FVM), E(660F00,7F,_,x,_,0,4,FVM), 192, 90 , 332, 169), // #1140
+ INST(Vmovdqa64 , VexRmMr_Lx , E(660F00,6F,_,x,_,1,4,FVM), E(660F00,7F,_,x,_,1,4,FVM), 134, 91 , 332, 169), // #1141
+ INST(Vmovdqu , VexRmMr_Lx , V(F30F00,6F,_,x,I,_,_,_ ), V(F30F00,7F,_,x,I,_,_,_ ), 193, 92 , 331, 168), // #1142
+ INST(Vmovdqu16 , VexRmMr_Lx , E(F20F00,6F,_,x,_,1,4,FVM), E(F20F00,7F,_,x,_,1,4,FVM), 165, 93 , 332, 170), // #1143
+ INST(Vmovdqu32 , VexRmMr_Lx , E(F30F00,6F,_,x,_,0,4,FVM), E(F30F00,7F,_,x,_,0,4,FVM), 194, 94 , 332, 169), // #1144
+ INST(Vmovdqu64 , VexRmMr_Lx , E(F30F00,6F,_,x,_,1,4,FVM), E(F30F00,7F,_,x,_,1,4,FVM), 148, 95 , 332, 169), // #1145
+ INST(Vmovdqu8 , VexRmMr_Lx , E(F20F00,6F,_,x,_,0,4,FVM), E(F20F00,7F,_,x,_,0,4,FVM), 163, 96 , 332, 170), // #1146
+ INST(Vmovhlps , VexRvm , V(000F00,12,_,0,I,0,_,_ ), 0 , 74 , 0 , 333, 144), // #1147
+ INST(Vmovhpd , VexRvmMr , V(660F00,16,_,0,I,1,3,T1S), V(660F00,17,_,0,I,1,3,T1S), 124, 97 , 334, 144), // #1148
+ INST(Vmovhps , VexRvmMr , V(000F00,16,_,0,I,0,3,T2 ), V(000F00,17,_,0,I,0,3,T2 ), 195, 98 , 334, 144), // #1149
+ INST(Vmovlhps , VexRvm , V(000F00,16,_,0,I,0,_,_ ), 0 , 74 , 0 , 333, 144), // #1150
+ INST(Vmovlpd , VexRvmMr , V(660F00,12,_,0,I,1,3,T1S), V(660F00,13,_,0,I,1,3,T1S), 124, 99 , 334, 144), // #1151
+ INST(Vmovlps , VexRvmMr , V(000F00,12,_,0,I,0,3,T2 ), V(000F00,13,_,0,I,0,3,T2 ), 195, 100, 334, 144), // #1152
+ INST(Vmovmskpd , VexRm_Lx , V(660F00,50,_,x,I,_,_,_ ), 0 , 71 , 0 , 335, 146), // #1153
+ INST(Vmovmskps , VexRm_Lx , V(000F00,50,_,x,I,_,_,_ ), 0 , 74 , 0 , 335, 146), // #1154
+ INST(Vmovntdq , VexMr_Lx , V(660F00,E7,_,x,I,0,4,FVM), 0 , 143, 0 , 336, 144), // #1155
+ INST(Vmovntdqa , VexRm_Lx , V(660F38,2A,_,x,I,0,4,FVM), 0 , 109, 0 , 337, 154), // #1156
+ INST(Vmovntpd , VexMr_Lx , V(660F00,2B,_,x,I,1,4,FVM), 0 , 102, 0 , 336, 144), // #1157
+ INST(Vmovntps , VexMr_Lx , V(000F00,2B,_,x,I,0,4,FVM), 0 , 104, 0 , 336, 144), // #1158
+ INST(Vmovq , VexMovdMovq , V(660F00,6E,_,0,I,1,3,T1S), V(660F00,7E,_,0,I,1,3,T1S), 124, 101, 338, 167), // #1159
+ INST(Vmovsd , VexMovssMovsd , V(F20F00,10,_,I,I,1,3,T1S), V(F20F00,11,_,I,I,1,3,T1S), 105, 102, 339, 167), // #1160
+ INST(Vmovsh , VexMovssMovsd , E(F3MAP5,10,_,I,_,0,1,T1S), E(F3MAP5,11,_,I,_,0,1,T1S), 106, 103, 340, 145), // #1161
+ INST(Vmovshdup , VexRm_Lx , V(F30F00,16,_,x,I,0,4,FVM), 0 , 160, 0 , 341, 144), // #1162
+ INST(Vmovsldup , VexRm_Lx , V(F30F00,12,_,x,I,0,4,FVM), 0 , 160, 0 , 341, 144), // #1163
+ INST(Vmovss , VexMovssMovsd , V(F30F00,10,_,I,I,0,2,T1S), V(F30F00,11,_,I,I,0,2,T1S), 107, 104, 342, 167), // #1164
+ INST(Vmovupd , VexRmMr_Lx , V(660F00,10,_,x,I,1,4,FVM), V(660F00,11,_,x,I,1,4,FVM), 102, 105, 328, 167), // #1165
+ INST(Vmovups , VexRmMr_Lx , V(000F00,10,_,x,I,0,4,FVM), V(000F00,11,_,x,I,0,4,FVM), 104, 106, 328, 167), // #1166
+ INST(Vmovw , VexMovdMovq , E(66MAP5,6E,_,0,_,I,1,T1S), E(66MAP5,7E,_,0,_,I,1,T1S), 196, 107, 343, 145), // #1167
+ INST(Vmpsadbw , VexRvmi_Lx , V(660F3A,42,_,x,I,_,_,_ ), 0 , 75 , 0 , 218, 171), // #1168
+ INST(Vmptrld , X86M_Only , O(000F00,C7,6,_,_,_,_,_ ), 0 , 82 , 0 , 33 , 67 ), // #1169
+ INST(Vmptrst , X86M_Only , O(000F00,C7,7,_,_,_,_,_ ), 0 , 24 , 0 , 33 , 67 ), // #1170
+ INST(Vmread , X86Mr_NoSize , O(000F00,78,_,_,_,_,_,_ ), 0 , 5 , 0 , 344, 67 ), // #1171
+ INST(Vmresume , X86Op , O(000F01,C3,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1172
+ INST(Vmrun , X86Op_xAX , O(000F01,D8,_,_,_,_,_,_ ), 0 , 23 , 0 , 327, 23 ), // #1173
+ INST(Vmsave , X86Op_xAX , O(000F01,DB,_,_,_,_,_,_ ), 0 , 23 , 0 , 327, 23 ), // #1174
+ INST(Vmulpd , VexRvm_Lx , V(660F00,59,_,x,I,1,4,FV ), 0 , 102, 0 , 199, 144), // #1175
+ INST(Vmulph , VexRvm_Lx , E(00MAP5,59,_,_,_,0,4,FV ), 0 , 103, 0 , 200, 145), // #1176
+ INST(Vmulps , VexRvm_Lx , V(000F00,59,_,x,I,0,4,FV ), 0 , 104, 0 , 201, 144), // #1177
+ INST(Vmulsd , VexRvm , V(F20F00,59,_,I,I,1,3,T1S), 0 , 105, 0 , 202, 144), // #1178
+ INST(Vmulsh , VexRvm , E(F3MAP5,59,_,_,_,0,1,T1S), 0 , 106, 0 , 203, 145), // #1179
+ INST(Vmulss , VexRvm , V(F30F00,59,_,I,I,0,2,T1S), 0 , 107, 0 , 204, 144), // #1180
+ INST(Vmwrite , X86Rm_NoSize , O(000F00,79,_,_,_,_,_,_ ), 0 , 5 , 0 , 345, 67 ), // #1181
+ INST(Vmxoff , X86Op , O(000F01,C4,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1182
+ INST(Vmxon , X86M_Only , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 33 , 67 ), // #1183
+ INST(Vorpd , VexRvm_Lx , V(660F00,56,_,x,I,1,4,FV ), 0 , 102, 0 , 213, 150), // #1184
+ INST(Vorps , VexRvm_Lx , V(000F00,56,_,x,I,0,4,FV ), 0 , 104, 0 , 214, 150), // #1185
+ INST(Vp2intersectd , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,0,4,FV ), 0 , 130, 0 , 346, 172), // #1186
+ INST(Vp2intersectq , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,1,4,FV ), 0 , 197, 0 , 347, 172), // #1187
+ INST(Vpabsb , VexRm_Lx , V(660F38,1C,_,x,I,_,4,FVM), 0 , 109, 0 , 341, 173), // #1188
+ INST(Vpabsd , VexRm_Lx , V(660F38,1E,_,x,I,0,4,FV ), 0 , 109, 0 , 348, 154), // #1189
+ INST(Vpabsq , VexRm_Lx , E(660F38,1F,_,x,_,1,4,FV ), 0 , 112, 0 , 349, 149), // #1190
+ INST(Vpabsw , VexRm_Lx , V(660F38,1D,_,x,I,_,4,FVM), 0 , 109, 0 , 341, 173), // #1191
+ INST(Vpackssdw , VexRvm_Lx , V(660F00,6B,_,x,I,0,4,FV ), 0 , 143, 0 , 212, 173), // #1192
+ INST(Vpacksswb , VexRvm_Lx , V(660F00,63,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1193
+ INST(Vpackusdw , VexRvm_Lx , V(660F38,2B,_,x,I,0,4,FV ), 0 , 109, 0 , 212, 173), // #1194
+ INST(Vpackuswb , VexRvm_Lx , V(660F00,67,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1195
+ INST(Vpaddb , VexRvm_Lx , V(660F00,FC,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1196
+ INST(Vpaddd , VexRvm_Lx , V(660F00,FE,_,x,I,0,4,FV ), 0 , 143, 0 , 212, 154), // #1197
+ INST(Vpaddq , VexRvm_Lx , V(660F00,D4,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 154), // #1198
+ INST(Vpaddsb , VexRvm_Lx , V(660F00,EC,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1199
+ INST(Vpaddsw , VexRvm_Lx , V(660F00,ED,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1200
+ INST(Vpaddusb , VexRvm_Lx , V(660F00,DC,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1201
+ INST(Vpaddusw , VexRvm_Lx , V(660F00,DD,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1202
+ INST(Vpaddw , VexRvm_Lx , V(660F00,FD,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1203
+ INST(Vpalignr , VexRvmi_Lx , V(660F3A,0F,_,x,I,I,4,FVM), 0 , 198, 0 , 314, 173), // #1204
+ INST(Vpand , VexRvm_Lx , V(660F00,DB,_,x,I,_,_,_ ), 0 , 71 , 0 , 350, 171), // #1205
+ INST(Vpandd , VexRvm_Lx , E(660F00,DB,_,x,_,0,4,FV ), 0 , 192, 0 , 351, 149), // #1206
+ INST(Vpandn , VexRvm_Lx , V(660F00,DF,_,x,I,_,_,_ ), 0 , 71 , 0 , 352, 171), // #1207
+ INST(Vpandnd , VexRvm_Lx , E(660F00,DF,_,x,_,0,4,FV ), 0 , 192, 0 , 353, 149), // #1208
+ INST(Vpandnq , VexRvm_Lx , E(660F00,DF,_,x,_,1,4,FV ), 0 , 134, 0 , 354, 149), // #1209
+ INST(Vpandq , VexRvm_Lx , E(660F00,DB,_,x,_,1,4,FV ), 0 , 134, 0 , 355, 149), // #1210
+ INST(Vpavgb , VexRvm_Lx , V(660F00,E0,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1211
+ INST(Vpavgw , VexRvm_Lx , V(660F00,E3,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1212
+ INST(Vpblendd , VexRvmi_Lx , V(660F3A,02,_,x,0,_,_,_ ), 0 , 75 , 0 , 218, 153), // #1213
+ INST(Vpblendmb , VexRvm_Lx , E(660F38,66,_,x,_,0,4,FVM), 0 , 113, 0 , 356, 160), // #1214
+ INST(Vpblendmd , VexRvm_Lx , E(660F38,64,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1215
+ INST(Vpblendmq , VexRvm_Lx , E(660F38,64,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1216
+ INST(Vpblendmw , VexRvm_Lx , E(660F38,66,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1217
+ INST(Vpblendvb , VexRvmr_Lx , V(660F3A,4C,_,x,0,_,_,_ ), 0 , 75 , 0 , 219, 171), // #1218
+ INST(Vpblendw , VexRvmi_Lx , V(660F3A,0E,_,x,I,_,_,_ ), 0 , 75 , 0 , 218, 171), // #1219
+ INST(Vpbroadcastb , VexRm_Lx_Bcst , V(660F38,78,_,x,0,0,0,T1S), E(660F38,7A,_,x,0,0,0,T1S), 30 , 108, 357, 174), // #1220
+ INST(Vpbroadcastd , VexRm_Lx_Bcst , V(660F38,58,_,x,0,0,2,T1S), E(660F38,7C,_,x,0,0,0,T1S), 121, 109, 358, 164), // #1221
+ INST(Vpbroadcastmb2q , VexRm_Lx , E(F30F38,2A,_,x,_,1,_,_ ), 0 , 199, 0 , 359, 175), // #1222
+ INST(Vpbroadcastmw2d , VexRm_Lx , E(F30F38,3A,_,x,_,0,_,_ ), 0 , 200, 0 , 359, 175), // #1223
+ INST(Vpbroadcastq , VexRm_Lx_Bcst , V(660F38,59,_,x,0,1,3,T1S), E(660F38,7C,_,x,0,1,0,T1S), 120, 110, 360, 164), // #1224
+ INST(Vpbroadcastw , VexRm_Lx_Bcst , V(660F38,79,_,x,0,0,1,T1S), E(660F38,7B,_,x,0,0,0,T1S), 201, 111, 361, 174), // #1225
+ INST(Vpclmulqdq , VexRvmi_Lx , V(660F3A,44,_,x,I,_,4,FVM), 0 , 198, 0 , 362, 176), // #1226
+ INST(Vpcmov , VexRvrmRvmr_Lx , V(XOP_M8,A2,_,x,x,_,_,_ ), 0 , 202, 0 , 363, 163), // #1227
+ INST(Vpcmpb , VexRvmi_Lx , E(660F3A,3F,_,x,_,0,4,FVM), 0 , 110, 0 , 364, 160), // #1228
+ INST(Vpcmpd , VexRvmi_Lx , E(660F3A,1F,_,x,_,0,4,FV ), 0 , 110, 0 , 365, 149), // #1229
+ INST(Vpcmpeqb , VexRvm_Lx_KEvex , V(660F00,74,_,x,I,I,4,FV ), 0 , 143, 0 , 366, 173), // #1230
+ INST(Vpcmpeqd , VexRvm_Lx_KEvex , V(660F00,76,_,x,I,0,4,FVM), 0 , 143, 0 , 367, 154), // #1231
+ INST(Vpcmpeqq , VexRvm_Lx_KEvex , V(660F38,29,_,x,I,1,4,FVM), 0 , 203, 0 , 368, 154), // #1232
+ INST(Vpcmpeqw , VexRvm_Lx_KEvex , V(660F00,75,_,x,I,I,4,FV ), 0 , 143, 0 , 366, 173), // #1233
+ INST(Vpcmpestri , VexRmi , V(660F3A,61,_,0,I,_,_,_ ), 0 , 75 , 0 , 369, 177), // #1234
+ INST(Vpcmpestrm , VexRmi , V(660F3A,60,_,0,I,_,_,_ ), 0 , 75 , 0 , 370, 177), // #1235
+ INST(Vpcmpgtb , VexRvm_Lx_KEvex , V(660F00,64,_,x,I,I,4,FV ), 0 , 143, 0 , 366, 173), // #1236
+ INST(Vpcmpgtd , VexRvm_Lx_KEvex , V(660F00,66,_,x,I,0,4,FVM), 0 , 143, 0 , 367, 154), // #1237
+ INST(Vpcmpgtq , VexRvm_Lx_KEvex , V(660F38,37,_,x,I,1,4,FVM), 0 , 203, 0 , 368, 154), // #1238
+ INST(Vpcmpgtw , VexRvm_Lx_KEvex , V(660F00,65,_,x,I,I,4,FV ), 0 , 143, 0 , 366, 173), // #1239
+ INST(Vpcmpistri , VexRmi , V(660F3A,63,_,0,I,_,_,_ ), 0 , 75 , 0 , 371, 177), // #1240
+ INST(Vpcmpistrm , VexRmi , V(660F3A,62,_,0,I,_,_,_ ), 0 , 75 , 0 , 372, 177), // #1241
+ INST(Vpcmpq , VexRvmi_Lx , E(660F3A,1F,_,x,_,1,4,FV ), 0 , 111, 0 , 373, 149), // #1242
+ INST(Vpcmpub , VexRvmi_Lx , E(660F3A,3E,_,x,_,0,4,FVM), 0 , 110, 0 , 364, 160), // #1243
+ INST(Vpcmpud , VexRvmi_Lx , E(660F3A,1E,_,x,_,0,4,FV ), 0 , 110, 0 , 365, 149), // #1244
+ INST(Vpcmpuq , VexRvmi_Lx , E(660F3A,1E,_,x,_,1,4,FV ), 0 , 111, 0 , 373, 149), // #1245
+ INST(Vpcmpuw , VexRvmi_Lx , E(660F3A,3E,_,x,_,1,4,FVM), 0 , 111, 0 , 364, 160), // #1246
+ INST(Vpcmpw , VexRvmi_Lx , E(660F3A,3F,_,x,_,1,4,FVM), 0 , 111, 0 , 364, 160), // #1247
+ INST(Vpcomb , VexRvmi , V(XOP_M8,CC,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1248
+ INST(Vpcomd , VexRvmi , V(XOP_M8,CE,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1249
+ INST(Vpcompressb , VexMr_Lx , E(660F38,63,_,x,_,0,0,T1S), 0 , 204, 0 , 236, 178), // #1250
+ INST(Vpcompressd , VexMr_Lx , E(660F38,8B,_,x,_,0,2,T1S), 0 , 128, 0 , 236, 149), // #1251
+ INST(Vpcompressq , VexMr_Lx , E(660F38,8B,_,x,_,1,3,T1S), 0 , 127, 0 , 236, 149), // #1252
+ INST(Vpcompressw , VexMr_Lx , E(660F38,63,_,x,_,1,1,T1S), 0 , 205, 0 , 236, 178), // #1253
+ INST(Vpcomq , VexRvmi , V(XOP_M8,CF,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1254
+ INST(Vpcomub , VexRvmi , V(XOP_M8,EC,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1255
+ INST(Vpcomud , VexRvmi , V(XOP_M8,EE,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1256
+ INST(Vpcomuq , VexRvmi , V(XOP_M8,EF,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1257
+ INST(Vpcomuw , VexRvmi , V(XOP_M8,ED,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1258
+ INST(Vpcomw , VexRvmi , V(XOP_M8,CD,_,0,0,_,_,_ ), 0 , 202, 0 , 281, 163), // #1259
+ INST(Vpconflictd , VexRm_Lx , E(660F38,C4,_,x,_,0,4,FV ), 0 , 113, 0 , 374, 175), // #1260
+ INST(Vpconflictq , VexRm_Lx , E(660F38,C4,_,x,_,1,4,FV ), 0 , 112, 0 , 374, 175), // #1261
+ INST(Vpdpbssd , VexRvm_Lx , V(F20F38,50,_,x,0,_,_,_ ), 0 , 85 , 0 , 205, 179), // #1262
+ INST(Vpdpbssds , VexRvm_Lx , V(F20F38,51,_,x,0,_,_,_ ), 0 , 85 , 0 , 205, 179), // #1263
+ INST(Vpdpbsud , VexRvm_Lx , V(F30F38,50,_,x,0,_,_,_ ), 0 , 89 , 0 , 205, 179), // #1264
+ INST(Vpdpbsuds , VexRvm_Lx , V(F30F38,51,_,x,0,_,_,_ ), 0 , 89 , 0 , 205, 179), // #1265
+ INST(Vpdpbusd , VexRvm_Lx , V(660F38,50,_,x,_,0,4,FV ), 0 , 109, 0 , 375, 180), // #1266
+ INST(Vpdpbusds , VexRvm_Lx , V(660F38,51,_,x,_,0,4,FV ), 0 , 109, 0 , 375, 180), // #1267
+ INST(Vpdpbuud , VexRvm_Lx , V(000F38,50,_,x,0,_,_,_ ), 0 , 11 , 0 , 205, 179), // #1268
+ INST(Vpdpbuuds , VexRvm_Lx , V(000F38,51,_,x,0,_,_,_ ), 0 , 11 , 0 , 205, 179), // #1269
+ INST(Vpdpwssd , VexRvm_Lx , V(660F38,52,_,x,_,0,4,FV ), 0 , 109, 0 , 375, 180), // #1270
+ INST(Vpdpwssds , VexRvm_Lx , V(660F38,53,_,x,_,0,4,FV ), 0 , 109, 0 , 375, 180), // #1271
+ INST(Vpdpwsud , VexRvm_Lx , V(F30F38,D2,_,x,0,_,_,_ ), 0 , 89 , 0 , 205, 181), // #1272
+ INST(Vpdpwsuds , VexRvm_Lx , V(F30F38,D3,_,x,0,_,_,_ ), 0 , 89 , 0 , 205, 181), // #1273
+ INST(Vpdpwusd , VexRvm_Lx , V(660F38,D2,_,x,0,_,_,_ ), 0 , 30 , 0 , 205, 181), // #1274
+ INST(Vpdpwusds , VexRvm_Lx , V(660F38,D3,_,x,0,_,_,_ ), 0 , 30 , 0 , 205, 181), // #1275
+ INST(Vpdpwuud , VexRvm_Lx , V(000F38,D2,_,x,0,_,_,_ ), 0 , 11 , 0 , 205, 181), // #1276
+ INST(Vpdpwuuds , VexRvm_Lx , V(000F38,D3,_,x,0,_,_,_ ), 0 , 11 , 0 , 205, 181), // #1277
+ INST(Vperm2f128 , VexRvmi , V(660F3A,06,_,1,0,_,_,_ ), 0 , 170, 0 , 376, 146), // #1278
+ INST(Vperm2i128 , VexRvmi , V(660F3A,46,_,1,0,_,_,_ ), 0 , 170, 0 , 376, 153), // #1279
+ INST(Vpermb , VexRvm_Lx , E(660F38,8D,_,x,_,0,4,FVM), 0 , 113, 0 , 356, 182), // #1280
+ INST(Vpermd , VexRvm_Lx , V(660F38,36,_,x,0,0,4,FV ), 0 , 109, 0 , 377, 164), // #1281
+ INST(Vpermi2b , VexRvm_Lx , E(660F38,75,_,x,_,0,4,FVM), 0 , 113, 0 , 356, 182), // #1282
+ INST(Vpermi2d , VexRvm_Lx , E(660F38,76,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1283
+ INST(Vpermi2pd , VexRvm_Lx , E(660F38,77,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1284
+ INST(Vpermi2ps , VexRvm_Lx , E(660F38,77,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1285
+ INST(Vpermi2q , VexRvm_Lx , E(660F38,76,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1286
+ INST(Vpermi2w , VexRvm_Lx , E(660F38,75,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1287
+ INST(Vpermil2pd , VexRvrmiRvmri_Lx , V(660F3A,49,_,x,x,_,_,_ ), 0 , 75 , 0 , 378, 163), // #1288
+ INST(Vpermil2ps , VexRvrmiRvmri_Lx , V(660F3A,48,_,x,x,_,_,_ ), 0 , 75 , 0 , 378, 163), // #1289
+ INST(Vpermilpd , VexRvmRmi_Lx , V(660F38,0D,_,x,0,1,4,FV ), V(660F3A,05,_,x,0,1,4,FV ), 203, 112, 379, 144), // #1290
+ INST(Vpermilps , VexRvmRmi_Lx , V(660F38,0C,_,x,0,0,4,FV ), V(660F3A,04,_,x,0,0,4,FV ), 109, 113, 380, 144), // #1291
+ INST(Vpermpd , VexRvmRmi_Lx , E(660F38,16,_,x,1,1,4,FV ), V(660F3A,01,_,x,1,1,4,FV ), 206, 114, 381, 164), // #1292
+ INST(Vpermps , VexRvm_Lx , V(660F38,16,_,x,0,0,4,FV ), 0 , 109, 0 , 377, 164), // #1293
+ INST(Vpermq , VexRvmRmi_Lx , E(660F38,36,_,x,_,1,4,FV ), V(660F3A,00,_,x,1,1,4,FV ), 112, 115, 381, 164), // #1294
+ INST(Vpermt2b , VexRvm_Lx , E(660F38,7D,_,x,_,0,4,FVM), 0 , 113, 0 , 356, 182), // #1295
+ INST(Vpermt2d , VexRvm_Lx , E(660F38,7E,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1296
+ INST(Vpermt2pd , VexRvm_Lx , E(660F38,7F,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1297
+ INST(Vpermt2ps , VexRvm_Lx , E(660F38,7F,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1298
+ INST(Vpermt2q , VexRvm_Lx , E(660F38,7E,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1299
+ INST(Vpermt2w , VexRvm_Lx , E(660F38,7D,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1300
+ INST(Vpermw , VexRvm_Lx , E(660F38,8D,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1301
+ INST(Vpexpandb , VexRm_Lx , E(660F38,62,_,x,_,0,0,T1S), 0 , 204, 0 , 282, 178), // #1302
+ INST(Vpexpandd , VexRm_Lx , E(660F38,89,_,x,_,0,2,T1S), 0 , 128, 0 , 282, 149), // #1303
+ INST(Vpexpandq , VexRm_Lx , E(660F38,89,_,x,_,1,3,T1S), 0 , 127, 0 , 282, 149), // #1304
+ INST(Vpexpandw , VexRm_Lx , E(660F38,62,_,x,_,1,1,T1S), 0 , 205, 0 , 282, 178), // #1305
+ INST(Vpextrb , VexMri , V(660F3A,14,_,0,0,I,0,T1S), 0 , 75 , 0 , 382, 183), // #1306
+ INST(Vpextrd , VexMri , V(660F3A,16,_,0,0,0,2,T1S), 0 , 175, 0 , 286, 150), // #1307
+ INST(Vpextrq , VexMri , V(660F3A,16,_,0,1,1,3,T1S), 0 , 207, 0 , 383, 150), // #1308
+ INST(Vpextrw , VexMri_Vpextrw , V(660F3A,15,_,0,0,I,1,T1S), 0 , 208, 0 , 384, 183), // #1309
+ INST(Vpgatherdd , VexRmvRm_VM , V(660F38,90,_,x,0,_,_,_ ), E(660F38,90,_,x,_,0,2,T1S), 30 , 116, 305, 164), // #1310
+ INST(Vpgatherdq , VexRmvRm_VM , V(660F38,90,_,x,1,_,_,_ ), E(660F38,90,_,x,_,1,3,T1S), 187, 117, 304, 164), // #1311
+ INST(Vpgatherqd , VexRmvRm_VM , V(660F38,91,_,x,0,_,_,_ ), E(660F38,91,_,x,_,0,2,T1S), 30 , 118, 307, 164), // #1312
+ INST(Vpgatherqq , VexRmvRm_VM , V(660F38,91,_,x,1,_,_,_ ), E(660F38,91,_,x,_,1,3,T1S), 187, 119, 306, 164), // #1313
+ INST(Vphaddbd , VexRm , V(XOP_M9,C2,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1314
+ INST(Vphaddbq , VexRm , V(XOP_M9,C3,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1315
+ INST(Vphaddbw , VexRm , V(XOP_M9,C1,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1316
+ INST(Vphaddd , VexRvm_Lx , V(660F38,02,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1317
+ INST(Vphadddq , VexRm , V(XOP_M9,CB,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1318
+ INST(Vphaddsw , VexRvm_Lx , V(660F38,03,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1319
+ INST(Vphaddubd , VexRm , V(XOP_M9,D2,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1320
+ INST(Vphaddubq , VexRm , V(XOP_M9,D3,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1321
+ INST(Vphaddubw , VexRm , V(XOP_M9,D1,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1322
+ INST(Vphaddudq , VexRm , V(XOP_M9,DB,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1323
+ INST(Vphadduwd , VexRm , V(XOP_M9,D6,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1324
+ INST(Vphadduwq , VexRm , V(XOP_M9,D7,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1325
+ INST(Vphaddw , VexRvm_Lx , V(660F38,01,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1326
+ INST(Vphaddwd , VexRm , V(XOP_M9,C6,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1327
+ INST(Vphaddwq , VexRm , V(XOP_M9,C7,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1328
+ INST(Vphminposuw , VexRm , V(660F38,41,_,0,I,_,_,_ ), 0 , 30 , 0 , 207, 146), // #1329
+ INST(Vphsubbw , VexRm , V(XOP_M9,E1,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1330
+ INST(Vphsubd , VexRvm_Lx , V(660F38,06,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1331
+ INST(Vphsubdq , VexRm , V(XOP_M9,E3,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1332
+ INST(Vphsubsw , VexRvm_Lx , V(660F38,07,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1333
+ INST(Vphsubw , VexRvm_Lx , V(660F38,05,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1334
+ INST(Vphsubwd , VexRm , V(XOP_M9,E2,_,0,0,_,_,_ ), 0 , 81 , 0 , 207, 163), // #1335
+ INST(Vpinsrb , VexRvmi , V(660F3A,20,_,0,0,I,0,T1S), 0 , 75 , 0 , 385, 183), // #1336
+ INST(Vpinsrd , VexRvmi , V(660F3A,22,_,0,0,0,2,T1S), 0 , 175, 0 , 386, 150), // #1337
+ INST(Vpinsrq , VexRvmi , V(660F3A,22,_,0,1,1,3,T1S), 0 , 207, 0 , 387, 150), // #1338
+ INST(Vpinsrw , VexRvmi , V(660F00,C4,_,0,0,I,1,T1S), 0 , 209, 0 , 388, 183), // #1339
+ INST(Vplzcntd , VexRm_Lx , E(660F38,44,_,x,_,0,4,FV ), 0 , 113, 0 , 374, 175), // #1340
+ INST(Vplzcntq , VexRm_Lx , E(660F38,44,_,x,_,1,4,FV ), 0 , 112, 0 , 349, 175), // #1341
+ INST(Vpmacsdd , VexRvmr , V(XOP_M8,9E,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1342
+ INST(Vpmacsdqh , VexRvmr , V(XOP_M8,9F,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1343
+ INST(Vpmacsdql , VexRvmr , V(XOP_M8,97,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1344
+ INST(Vpmacssdd , VexRvmr , V(XOP_M8,8E,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1345
+ INST(Vpmacssdqh , VexRvmr , V(XOP_M8,8F,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1346
+ INST(Vpmacssdql , VexRvmr , V(XOP_M8,87,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1347
+ INST(Vpmacsswd , VexRvmr , V(XOP_M8,86,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1348
+ INST(Vpmacssww , VexRvmr , V(XOP_M8,85,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1349
+ INST(Vpmacswd , VexRvmr , V(XOP_M8,96,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1350
+ INST(Vpmacsww , VexRvmr , V(XOP_M8,95,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1351
+ INST(Vpmadcsswd , VexRvmr , V(XOP_M8,A6,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1352
+ INST(Vpmadcswd , VexRvmr , V(XOP_M8,B6,_,0,0,_,_,_ ), 0 , 202, 0 , 389, 163), // #1353
+ INST(Vpmadd52huq , VexRvm_Lx , V(660F38,B5,_,x,1,1,4,FV ), 0 , 180, 0 , 390, 184), // #1354
+ INST(Vpmadd52luq , VexRvm_Lx , V(660F38,B4,_,x,1,1,4,FV ), 0 , 180, 0 , 390, 184), // #1355
+ INST(Vpmaddubsw , VexRvm_Lx , V(660F38,04,_,x,I,I,4,FVM), 0 , 109, 0 , 315, 173), // #1356
+ INST(Vpmaddwd , VexRvm_Lx , V(660F00,F5,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1357
+ INST(Vpmaskmovd , VexRvmMvr_Lx , V(660F38,8C,_,x,0,_,_,_ ), V(660F38,8E,_,x,0,_,_,_ ), 30 , 120, 322, 153), // #1358
+ INST(Vpmaskmovq , VexRvmMvr_Lx , V(660F38,8C,_,x,1,_,_,_ ), V(660F38,8E,_,x,1,_,_,_ ), 187, 121, 322, 153), // #1359
+ INST(Vpmaxsb , VexRvm_Lx , V(660F38,3C,_,x,I,I,4,FVM), 0 , 109, 0 , 391, 173), // #1360
+ INST(Vpmaxsd , VexRvm_Lx , V(660F38,3D,_,x,I,0,4,FV ), 0 , 109, 0 , 214, 154), // #1361
+ INST(Vpmaxsq , VexRvm_Lx , E(660F38,3D,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1362
+ INST(Vpmaxsw , VexRvm_Lx , V(660F00,EE,_,x,I,I,4,FVM), 0 , 143, 0 , 391, 173), // #1363
+ INST(Vpmaxub , VexRvm_Lx , V(660F00,DE,_,x,I,I,4,FVM), 0 , 143, 0 , 391, 173), // #1364
+ INST(Vpmaxud , VexRvm_Lx , V(660F38,3F,_,x,I,0,4,FV ), 0 , 109, 0 , 214, 154), // #1365
+ INST(Vpmaxuq , VexRvm_Lx , E(660F38,3F,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1366
+ INST(Vpmaxuw , VexRvm_Lx , V(660F38,3E,_,x,I,I,4,FVM), 0 , 109, 0 , 391, 173), // #1367
+ INST(Vpminsb , VexRvm_Lx , V(660F38,38,_,x,I,I,4,FVM), 0 , 109, 0 , 391, 173), // #1368
+ INST(Vpminsd , VexRvm_Lx , V(660F38,39,_,x,I,0,4,FV ), 0 , 109, 0 , 214, 154), // #1369
+ INST(Vpminsq , VexRvm_Lx , E(660F38,39,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1370
+ INST(Vpminsw , VexRvm_Lx , V(660F00,EA,_,x,I,I,4,FVM), 0 , 143, 0 , 391, 173), // #1371
+ INST(Vpminub , VexRvm_Lx , V(660F00,DA,_,x,I,_,4,FVM), 0 , 143, 0 , 391, 173), // #1372
+ INST(Vpminud , VexRvm_Lx , V(660F38,3B,_,x,I,0,4,FV ), 0 , 109, 0 , 214, 154), // #1373
+ INST(Vpminuq , VexRvm_Lx , E(660F38,3B,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1374
+ INST(Vpminuw , VexRvm_Lx , V(660F38,3A,_,x,I,_,4,FVM), 0 , 109, 0 , 391, 173), // #1375
+ INST(Vpmovb2m , VexRm_Lx , E(F30F38,29,_,x,_,0,_,_ ), 0 , 200, 0 , 392, 160), // #1376
+ INST(Vpmovd2m , VexRm_Lx , E(F30F38,39,_,x,_,0,_,_ ), 0 , 200, 0 , 392, 152), // #1377
+ INST(Vpmovdb , VexMr_Lx , E(F30F38,31,_,x,_,0,2,QVM), 0 , 210, 0 , 393, 149), // #1378
+ INST(Vpmovdw , VexMr_Lx , E(F30F38,33,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 149), // #1379
+ INST(Vpmovm2b , VexRm_Lx , E(F30F38,28,_,x,_,0,_,_ ), 0 , 200, 0 , 359, 160), // #1380
+ INST(Vpmovm2d , VexRm_Lx , E(F30F38,38,_,x,_,0,_,_ ), 0 , 200, 0 , 359, 152), // #1381
+ INST(Vpmovm2q , VexRm_Lx , E(F30F38,38,_,x,_,1,_,_ ), 0 , 199, 0 , 359, 152), // #1382
+ INST(Vpmovm2w , VexRm_Lx , E(F30F38,28,_,x,_,1,_,_ ), 0 , 199, 0 , 359, 160), // #1383
+ INST(Vpmovmskb , VexRm_Lx , V(660F00,D7,_,x,I,_,_,_ ), 0 , 71 , 0 , 335, 171), // #1384
+ INST(Vpmovq2m , VexRm_Lx , E(F30F38,39,_,x,_,1,_,_ ), 0 , 199, 0 , 392, 152), // #1385
+ INST(Vpmovqb , VexMr_Lx , E(F30F38,32,_,x,_,0,1,OVM), 0 , 212, 0 , 395, 149), // #1386
+ INST(Vpmovqd , VexMr_Lx , E(F30F38,35,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 149), // #1387
+ INST(Vpmovqw , VexMr_Lx , E(F30F38,34,_,x,_,0,2,QVM), 0 , 210, 0 , 393, 149), // #1388
+ INST(Vpmovsdb , VexMr_Lx , E(F30F38,21,_,x,_,0,2,QVM), 0 , 210, 0 , 393, 149), // #1389
+ INST(Vpmovsdw , VexMr_Lx , E(F30F38,23,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 149), // #1390
+ INST(Vpmovsqb , VexMr_Lx , E(F30F38,22,_,x,_,0,1,OVM), 0 , 212, 0 , 395, 149), // #1391
+ INST(Vpmovsqd , VexMr_Lx , E(F30F38,25,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 149), // #1392
+ INST(Vpmovsqw , VexMr_Lx , E(F30F38,24,_,x,_,0,2,QVM), 0 , 210, 0 , 393, 149), // #1393
+ INST(Vpmovswb , VexMr_Lx , E(F30F38,20,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 160), // #1394
+ INST(Vpmovsxbd , VexRm_Lx , V(660F38,21,_,x,I,I,2,QVM), 0 , 213, 0 , 396, 154), // #1395
+ INST(Vpmovsxbq , VexRm_Lx , V(660F38,22,_,x,I,I,1,OVM), 0 , 214, 0 , 397, 154), // #1396
+ INST(Vpmovsxbw , VexRm_Lx , V(660F38,20,_,x,I,I,3,HVM), 0 , 138, 0 , 398, 173), // #1397
+ INST(Vpmovsxdq , VexRm_Lx , V(660F38,25,_,x,I,0,3,HVM), 0 , 138, 0 , 398, 154), // #1398
+ INST(Vpmovsxwd , VexRm_Lx , V(660F38,23,_,x,I,I,3,HVM), 0 , 138, 0 , 398, 154), // #1399
+ INST(Vpmovsxwq , VexRm_Lx , V(660F38,24,_,x,I,I,2,QVM), 0 , 213, 0 , 396, 154), // #1400
+ INST(Vpmovusdb , VexMr_Lx , E(F30F38,11,_,x,_,0,2,QVM), 0 , 210, 0 , 393, 149), // #1401
+ INST(Vpmovusdw , VexMr_Lx , E(F30F38,13,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 149), // #1402
+ INST(Vpmovusqb , VexMr_Lx , E(F30F38,12,_,x,_,0,1,OVM), 0 , 212, 0 , 395, 149), // #1403
+ INST(Vpmovusqd , VexMr_Lx , E(F30F38,15,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 149), // #1404
+ INST(Vpmovusqw , VexMr_Lx , E(F30F38,14,_,x,_,0,2,QVM), 0 , 210, 0 , 393, 149), // #1405
+ INST(Vpmovuswb , VexMr_Lx , E(F30F38,10,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 160), // #1406
+ INST(Vpmovw2m , VexRm_Lx , E(F30F38,29,_,x,_,1,_,_ ), 0 , 199, 0 , 392, 160), // #1407
+ INST(Vpmovwb , VexMr_Lx , E(F30F38,30,_,x,_,0,3,HVM), 0 , 211, 0 , 394, 160), // #1408
+ INST(Vpmovzxbd , VexRm_Lx , V(660F38,31,_,x,I,I,2,QVM), 0 , 213, 0 , 396, 154), // #1409
+ INST(Vpmovzxbq , VexRm_Lx , V(660F38,32,_,x,I,I,1,OVM), 0 , 214, 0 , 397, 154), // #1410
+ INST(Vpmovzxbw , VexRm_Lx , V(660F38,30,_,x,I,I,3,HVM), 0 , 138, 0 , 398, 173), // #1411
+ INST(Vpmovzxdq , VexRm_Lx , V(660F38,35,_,x,I,0,3,HVM), 0 , 138, 0 , 398, 154), // #1412
+ INST(Vpmovzxwd , VexRm_Lx , V(660F38,33,_,x,I,I,3,HVM), 0 , 138, 0 , 398, 154), // #1413
+ INST(Vpmovzxwq , VexRm_Lx , V(660F38,34,_,x,I,I,2,QVM), 0 , 213, 0 , 396, 154), // #1414
+ INST(Vpmuldq , VexRvm_Lx , V(660F38,28,_,x,I,1,4,FV ), 0 , 203, 0 , 211, 154), // #1415
+ INST(Vpmulhrsw , VexRvm_Lx , V(660F38,0B,_,x,I,I,4,FVM), 0 , 109, 0 , 315, 173), // #1416
+ INST(Vpmulhuw , VexRvm_Lx , V(660F00,E4,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1417
+ INST(Vpmulhw , VexRvm_Lx , V(660F00,E5,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1418
+ INST(Vpmulld , VexRvm_Lx , V(660F38,40,_,x,I,0,4,FV ), 0 , 109, 0 , 212, 154), // #1419
+ INST(Vpmullq , VexRvm_Lx , E(660F38,40,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 152), // #1420
+ INST(Vpmullw , VexRvm_Lx , V(660F00,D5,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1421
+ INST(Vpmultishiftqb , VexRvm_Lx , E(660F38,83,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 182), // #1422
+ INST(Vpmuludq , VexRvm_Lx , V(660F00,F4,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 154), // #1423
+ INST(Vpopcntb , VexRm_Lx , E(660F38,54,_,x,_,0,4,FV ), 0 , 113, 0 , 282, 185), // #1424
+ INST(Vpopcntd , VexRm_Lx , E(660F38,55,_,x,_,0,4,FVM), 0 , 113, 0 , 374, 186), // #1425
+ INST(Vpopcntq , VexRm_Lx , E(660F38,55,_,x,_,1,4,FVM), 0 , 112, 0 , 349, 186), // #1426
+ INST(Vpopcntw , VexRm_Lx , E(660F38,54,_,x,_,1,4,FV ), 0 , 112, 0 , 282, 185), // #1427
+ INST(Vpor , VexRvm_Lx , V(660F00,EB,_,x,I,_,_,_ ), 0 , 71 , 0 , 350, 171), // #1428
+ INST(Vpord , VexRvm_Lx , E(660F00,EB,_,x,_,0,4,FV ), 0 , 192, 0 , 351, 149), // #1429
+ INST(Vporq , VexRvm_Lx , E(660F00,EB,_,x,_,1,4,FV ), 0 , 134, 0 , 355, 149), // #1430
+ INST(Vpperm , VexRvrmRvmr , V(XOP_M8,A3,_,0,x,_,_,_ ), 0 , 202, 0 , 399, 163), // #1431
+ INST(Vprold , VexVmi_Lx , E(660F00,72,1,x,_,0,4,FV ), 0 , 215, 0 , 400, 149), // #1432
+ INST(Vprolq , VexVmi_Lx , E(660F00,72,1,x,_,1,4,FV ), 0 , 216, 0 , 401, 149), // #1433
+ INST(Vprolvd , VexRvm_Lx , E(660F38,15,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1434
+ INST(Vprolvq , VexRvm_Lx , E(660F38,15,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1435
+ INST(Vprord , VexVmi_Lx , E(660F00,72,0,x,_,0,4,FV ), 0 , 192, 0 , 400, 149), // #1436
+ INST(Vprorq , VexVmi_Lx , E(660F00,72,0,x,_,1,4,FV ), 0 , 134, 0 , 401, 149), // #1437
+ INST(Vprorvd , VexRvm_Lx , E(660F38,14,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 149), // #1438
+ INST(Vprorvq , VexRvm_Lx , E(660F38,14,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1439
+ INST(Vprotb , VexRvmRmvRmi , V(XOP_M9,90,_,0,x,_,_,_ ), V(XOP_M8,C0,_,0,x,_,_,_ ), 81 , 122, 402, 163), // #1440
+ INST(Vprotd , VexRvmRmvRmi , V(XOP_M9,92,_,0,x,_,_,_ ), V(XOP_M8,C2,_,0,x,_,_,_ ), 81 , 123, 402, 163), // #1441
+ INST(Vprotq , VexRvmRmvRmi , V(XOP_M9,93,_,0,x,_,_,_ ), V(XOP_M8,C3,_,0,x,_,_,_ ), 81 , 124, 402, 163), // #1442
+ INST(Vprotw , VexRvmRmvRmi , V(XOP_M9,91,_,0,x,_,_,_ ), V(XOP_M8,C1,_,0,x,_,_,_ ), 81 , 125, 402, 163), // #1443
+ INST(Vpsadbw , VexRvm_Lx , V(660F00,F6,_,x,I,I,4,FVM), 0 , 143, 0 , 206, 173), // #1444
+ INST(Vpscatterdd , VexMr_VM , E(660F38,A0,_,x,_,0,2,T1S), 0 , 128, 0 , 403, 149), // #1445
+ INST(Vpscatterdq , VexMr_VM , E(660F38,A0,_,x,_,1,3,T1S), 0 , 127, 0 , 404, 149), // #1446
+ INST(Vpscatterqd , VexMr_VM , E(660F38,A1,_,x,_,0,2,T1S), 0 , 128, 0 , 405, 149), // #1447
+ INST(Vpscatterqq , VexMr_VM , E(660F38,A1,_,x,_,1,3,T1S), 0 , 127, 0 , 406, 149), // #1448
+ INST(Vpshab , VexRvmRmv , V(XOP_M9,98,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1449
+ INST(Vpshad , VexRvmRmv , V(XOP_M9,9A,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1450
+ INST(Vpshaq , VexRvmRmv , V(XOP_M9,9B,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1451
+ INST(Vpshaw , VexRvmRmv , V(XOP_M9,99,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1452
+ INST(Vpshlb , VexRvmRmv , V(XOP_M9,94,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1453
+ INST(Vpshld , VexRvmRmv , V(XOP_M9,96,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1454
+ INST(Vpshldd , VexRvmi_Lx , E(660F3A,71,_,x,_,0,4,FV ), 0 , 110, 0 , 209, 178), // #1455
+ INST(Vpshldq , VexRvmi_Lx , E(660F3A,71,_,x,_,1,4,FV ), 0 , 111, 0 , 210, 178), // #1456
+ INST(Vpshldvd , VexRvm_Lx , E(660F38,71,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 178), // #1457
+ INST(Vpshldvq , VexRvm_Lx , E(660F38,71,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 178), // #1458
+ INST(Vpshldvw , VexRvm_Lx , E(660F38,70,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 178), // #1459
+ INST(Vpshldw , VexRvmi_Lx , E(660F3A,70,_,x,_,1,4,FVM), 0 , 111, 0 , 280, 178), // #1460
+ INST(Vpshlq , VexRvmRmv , V(XOP_M9,97,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1461
+ INST(Vpshlw , VexRvmRmv , V(XOP_M9,95,_,0,x,_,_,_ ), 0 , 81 , 0 , 407, 163), // #1462
+ INST(Vpshrdd , VexRvmi_Lx , E(660F3A,73,_,x,_,0,4,FV ), 0 , 110, 0 , 209, 178), // #1463
+ INST(Vpshrdq , VexRvmi_Lx , E(660F3A,73,_,x,_,1,4,FV ), 0 , 111, 0 , 210, 178), // #1464
+ INST(Vpshrdvd , VexRvm_Lx , E(660F38,73,_,x,_,0,4,FV ), 0 , 113, 0 , 217, 178), // #1465
+ INST(Vpshrdvq , VexRvm_Lx , E(660F38,73,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 178), // #1466
+ INST(Vpshrdvw , VexRvm_Lx , E(660F38,72,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 178), // #1467
+ INST(Vpshrdw , VexRvmi_Lx , E(660F3A,72,_,x,_,1,4,FVM), 0 , 111, 0 , 280, 178), // #1468
+ INST(Vpshufb , VexRvm_Lx , V(660F38,00,_,x,I,I,4,FVM), 0 , 109, 0 , 315, 173), // #1469
+ INST(Vpshufbitqmb , VexRvm_Lx , E(660F38,8F,_,x,0,0,4,FVM), 0 , 113, 0 , 408, 185), // #1470
+ INST(Vpshufd , VexRmi_Lx , V(660F00,70,_,x,I,0,4,FV ), 0 , 143, 0 , 409, 154), // #1471
+ INST(Vpshufhw , VexRmi_Lx , V(F30F00,70,_,x,I,I,4,FVM), 0 , 160, 0 , 410, 173), // #1472
+ INST(Vpshuflw , VexRmi_Lx , V(F20F00,70,_,x,I,I,4,FVM), 0 , 217, 0 , 410, 173), // #1473
+ INST(Vpsignb , VexRvm_Lx , V(660F38,08,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1474
+ INST(Vpsignd , VexRvm_Lx , V(660F38,0A,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1475
+ INST(Vpsignw , VexRvm_Lx , V(660F38,09,_,x,I,_,_,_ ), 0 , 30 , 0 , 205, 171), // #1476
+ INST(Vpslld , VexRvmVmi_Lx_MEvex , V(660F00,F2,_,x,I,0,4,128), V(660F00,72,6,x,I,0,4,FV ), 218, 126, 411, 154), // #1477
+ INST(Vpslldq , VexVmi_Lx_MEvex , V(660F00,73,7,x,I,I,4,FVM), 0 , 219, 0 , 412, 173), // #1478
+ INST(Vpsllq , VexRvmVmi_Lx_MEvex , V(660F00,F3,_,x,I,1,4,128), V(660F00,73,6,x,I,1,4,FV ), 220, 127, 413, 154), // #1479
+ INST(Vpsllvd , VexRvm_Lx , V(660F38,47,_,x,0,0,4,FV ), 0 , 109, 0 , 212, 164), // #1480
+ INST(Vpsllvq , VexRvm_Lx , V(660F38,47,_,x,1,1,4,FV ), 0 , 180, 0 , 211, 164), // #1481
+ INST(Vpsllvw , VexRvm_Lx , E(660F38,12,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1482
+ INST(Vpsllw , VexRvmVmi_Lx_MEvex , V(660F00,F1,_,x,I,I,4,128), V(660F00,71,6,x,I,I,4,FVM), 218, 128, 414, 173), // #1483
+ INST(Vpsrad , VexRvmVmi_Lx_MEvex , V(660F00,E2,_,x,I,0,4,128), V(660F00,72,4,x,I,0,4,FV ), 218, 129, 411, 154), // #1484
+ INST(Vpsraq , VexRvmVmi_Lx_MEvex , E(660F00,E2,_,x,_,1,4,128), E(660F00,72,4,x,_,1,4,FV ), 221, 130, 415, 149), // #1485
+ INST(Vpsravd , VexRvm_Lx , V(660F38,46,_,x,0,0,4,FV ), 0 , 109, 0 , 212, 164), // #1486
+ INST(Vpsravq , VexRvm_Lx , E(660F38,46,_,x,_,1,4,FV ), 0 , 112, 0 , 216, 149), // #1487
+ INST(Vpsravw , VexRvm_Lx , E(660F38,11,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1488
+ INST(Vpsraw , VexRvmVmi_Lx_MEvex , V(660F00,E1,_,x,I,I,4,128), V(660F00,71,4,x,I,I,4,FVM), 218, 131, 414, 173), // #1489
+ INST(Vpsrld , VexRvmVmi_Lx_MEvex , V(660F00,D2,_,x,I,0,4,128), V(660F00,72,2,x,I,0,4,FV ), 218, 132, 411, 154), // #1490
+ INST(Vpsrldq , VexVmi_Lx_MEvex , V(660F00,73,3,x,I,I,4,FVM), 0 , 222, 0 , 412, 173), // #1491
+ INST(Vpsrlq , VexRvmVmi_Lx_MEvex , V(660F00,D3,_,x,I,1,4,128), V(660F00,73,2,x,I,1,4,FV ), 220, 133, 413, 154), // #1492
+ INST(Vpsrlvd , VexRvm_Lx , V(660F38,45,_,x,0,0,4,FV ), 0 , 109, 0 , 212, 164), // #1493
+ INST(Vpsrlvq , VexRvm_Lx , V(660F38,45,_,x,1,1,4,FV ), 0 , 180, 0 , 211, 164), // #1494
+ INST(Vpsrlvw , VexRvm_Lx , E(660F38,10,_,x,_,1,4,FVM), 0 , 112, 0 , 356, 160), // #1495
+ INST(Vpsrlw , VexRvmVmi_Lx_MEvex , V(660F00,D1,_,x,I,I,4,128), V(660F00,71,2,x,I,I,4,FVM), 218, 134, 414, 173), // #1496
+ INST(Vpsubb , VexRvm_Lx , V(660F00,F8,_,x,I,I,4,FVM), 0 , 143, 0 , 416, 173), // #1497
+ INST(Vpsubd , VexRvm_Lx , V(660F00,FA,_,x,I,0,4,FV ), 0 , 143, 0 , 417, 154), // #1498
+ INST(Vpsubq , VexRvm_Lx , V(660F00,FB,_,x,I,1,4,FV ), 0 , 102, 0 , 418, 154), // #1499
+ INST(Vpsubsb , VexRvm_Lx , V(660F00,E8,_,x,I,I,4,FVM), 0 , 143, 0 , 416, 173), // #1500
+ INST(Vpsubsw , VexRvm_Lx , V(660F00,E9,_,x,I,I,4,FVM), 0 , 143, 0 , 416, 173), // #1501
+ INST(Vpsubusb , VexRvm_Lx , V(660F00,D8,_,x,I,I,4,FVM), 0 , 143, 0 , 416, 173), // #1502
+ INST(Vpsubusw , VexRvm_Lx , V(660F00,D9,_,x,I,I,4,FVM), 0 , 143, 0 , 416, 173), // #1503
+ INST(Vpsubw , VexRvm_Lx , V(660F00,F9,_,x,I,I,4,FVM), 0 , 143, 0 , 416, 173), // #1504
+ INST(Vpternlogd , VexRvmi_Lx , E(660F3A,25,_,x,_,0,4,FV ), 0 , 110, 0 , 209, 149), // #1505
+ INST(Vpternlogq , VexRvmi_Lx , E(660F3A,25,_,x,_,1,4,FV ), 0 , 111, 0 , 210, 149), // #1506
+ INST(Vptest , VexRm_Lx , V(660F38,17,_,x,I,_,_,_ ), 0 , 30 , 0 , 301, 177), // #1507
+ INST(Vptestmb , VexRvm_Lx , E(660F38,26,_,x,_,0,4,FVM), 0 , 113, 0 , 408, 160), // #1508
+ INST(Vptestmd , VexRvm_Lx , E(660F38,27,_,x,_,0,4,FV ), 0 , 113, 0 , 419, 149), // #1509
+ INST(Vptestmq , VexRvm_Lx , E(660F38,27,_,x,_,1,4,FV ), 0 , 112, 0 , 420, 149), // #1510
+ INST(Vptestmw , VexRvm_Lx , E(660F38,26,_,x,_,1,4,FVM), 0 , 112, 0 , 408, 160), // #1511
+ INST(Vptestnmb , VexRvm_Lx , E(F30F38,26,_,x,_,0,4,FVM), 0 , 169, 0 , 408, 160), // #1512
+ INST(Vptestnmd , VexRvm_Lx , E(F30F38,27,_,x,_,0,4,FV ), 0 , 169, 0 , 419, 149), // #1513
+ INST(Vptestnmq , VexRvm_Lx , E(F30F38,27,_,x,_,1,4,FV ), 0 , 223, 0 , 420, 149), // #1514
+ INST(Vptestnmw , VexRvm_Lx , E(F30F38,26,_,x,_,1,4,FVM), 0 , 223, 0 , 408, 160), // #1515
+ INST(Vpunpckhbw , VexRvm_Lx , V(660F00,68,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1516
+ INST(Vpunpckhdq , VexRvm_Lx , V(660F00,6A,_,x,I,0,4,FV ), 0 , 143, 0 , 212, 154), // #1517
+ INST(Vpunpckhqdq , VexRvm_Lx , V(660F00,6D,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 154), // #1518
+ INST(Vpunpckhwd , VexRvm_Lx , V(660F00,69,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1519
+ INST(Vpunpcklbw , VexRvm_Lx , V(660F00,60,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1520
+ INST(Vpunpckldq , VexRvm_Lx , V(660F00,62,_,x,I,0,4,FV ), 0 , 143, 0 , 212, 154), // #1521
+ INST(Vpunpcklqdq , VexRvm_Lx , V(660F00,6C,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 154), // #1522
+ INST(Vpunpcklwd , VexRvm_Lx , V(660F00,61,_,x,I,I,4,FVM), 0 , 143, 0 , 315, 173), // #1523
+ INST(Vpxor , VexRvm_Lx , V(660F00,EF,_,x,I,_,_,_ ), 0 , 71 , 0 , 352, 171), // #1524
+ INST(Vpxord , VexRvm_Lx , E(660F00,EF,_,x,_,0,4,FV ), 0 , 192, 0 , 353, 149), // #1525
+ INST(Vpxorq , VexRvm_Lx , E(660F00,EF,_,x,_,1,4,FV ), 0 , 134, 0 , 354, 149), // #1526
+ INST(Vrangepd , VexRvmi_Lx , E(660F3A,50,_,x,_,1,4,FV ), 0 , 111, 0 , 288, 152), // #1527
+ INST(Vrangeps , VexRvmi_Lx , E(660F3A,50,_,x,_,0,4,FV ), 0 , 110, 0 , 289, 152), // #1528
+ INST(Vrangesd , VexRvmi , E(660F3A,51,_,I,_,1,3,T1S), 0 , 178, 0 , 290, 152), // #1529
+ INST(Vrangess , VexRvmi , E(660F3A,51,_,I,_,0,2,T1S), 0 , 179, 0 , 291, 152), // #1530
+ INST(Vrcp14pd , VexRm_Lx , E(660F38,4C,_,x,_,1,4,FV ), 0 , 112, 0 , 349, 149), // #1531
+ INST(Vrcp14ps , VexRm_Lx , E(660F38,4C,_,x,_,0,4,FV ), 0 , 113, 0 , 374, 149), // #1532
+ INST(Vrcp14sd , VexRvm , E(660F38,4D,_,I,_,1,3,T1S), 0 , 127, 0 , 421, 149), // #1533
+ INST(Vrcp14ss , VexRvm , E(660F38,4D,_,I,_,0,2,T1S), 0 , 128, 0 , 422, 149), // #1534
+ INST(Vrcpph , VexRm_Lx , E(66MAP6,4C,_,_,_,0,4,FV ), 0 , 181, 0 , 423, 145), // #1535
+ INST(Vrcpps , VexRm_Lx , V(000F00,53,_,x,I,_,_,_ ), 0 , 74 , 0 , 301, 146), // #1536
+ INST(Vrcpsh , VexRvm , E(66MAP6,4D,_,_,_,0,1,T1S), 0 , 183, 0 , 424, 145), // #1537
+ INST(Vrcpss , VexRvm , V(F30F00,53,_,I,I,_,_,_ ), 0 , 193, 0 , 425, 146), // #1538
+ INST(Vreducepd , VexRmi_Lx , E(660F3A,56,_,x,_,1,4,FV ), 0 , 111, 0 , 401, 152), // #1539
+ INST(Vreduceph , VexRmi_Lx , E(000F3A,56,_,_,_,0,4,FV ), 0 , 122, 0 , 311, 145), // #1540
+ INST(Vreduceps , VexRmi_Lx , E(660F3A,56,_,x,_,0,4,FV ), 0 , 110, 0 , 400, 152), // #1541
+ INST(Vreducesd , VexRvmi , E(660F3A,57,_,I,_,1,3,T1S), 0 , 178, 0 , 426, 152), // #1542
+ INST(Vreducesh , VexRvmi , E(000F3A,57,_,_,_,0,1,T1S), 0 , 186, 0 , 313, 145), // #1543
+ INST(Vreducess , VexRvmi , E(660F3A,57,_,I,_,0,2,T1S), 0 , 179, 0 , 427, 152), // #1544
+ INST(Vrndscalepd , VexRmi_Lx , E(660F3A,09,_,x,_,1,4,FV ), 0 , 111, 0 , 310, 149), // #1545
+ INST(Vrndscaleph , VexRmi_Lx , E(000F3A,08,_,_,_,0,4,FV ), 0 , 122, 0 , 311, 145), // #1546
+ INST(Vrndscaleps , VexRmi_Lx , E(660F3A,08,_,x,_,0,4,FV ), 0 , 110, 0 , 312, 149), // #1547
+ INST(Vrndscalesd , VexRvmi , E(660F3A,0B,_,I,_,1,3,T1S), 0 , 178, 0 , 290, 149), // #1548
+ INST(Vrndscalesh , VexRvmi , E(000F3A,0A,_,_,_,0,1,T1S), 0 , 186, 0 , 313, 145), // #1549
+ INST(Vrndscaless , VexRvmi , E(660F3A,0A,_,I,_,0,2,T1S), 0 , 179, 0 , 291, 149), // #1550
+ INST(Vroundpd , VexRmi_Lx , V(660F3A,09,_,x,I,_,_,_ ), 0 , 75 , 0 , 428, 146), // #1551
+ INST(Vroundps , VexRmi_Lx , V(660F3A,08,_,x,I,_,_,_ ), 0 , 75 , 0 , 428, 146), // #1552
+ INST(Vroundsd , VexRvmi , V(660F3A,0B,_,I,I,_,_,_ ), 0 , 75 , 0 , 429, 146), // #1553
+ INST(Vroundss , VexRvmi , V(660F3A,0A,_,I,I,_,_,_ ), 0 , 75 , 0 , 430, 146), // #1554
+ INST(Vrsqrt14pd , VexRm_Lx , E(660F38,4E,_,x,_,1,4,FV ), 0 , 112, 0 , 349, 149), // #1555
+ INST(Vrsqrt14ps , VexRm_Lx , E(660F38,4E,_,x,_,0,4,FV ), 0 , 113, 0 , 374, 149), // #1556
+ INST(Vrsqrt14sd , VexRvm , E(660F38,4F,_,I,_,1,3,T1S), 0 , 127, 0 , 421, 149), // #1557
+ INST(Vrsqrt14ss , VexRvm , E(660F38,4F,_,I,_,0,2,T1S), 0 , 128, 0 , 422, 149), // #1558
+ INST(Vrsqrtph , VexRm_Lx , E(66MAP6,4E,_,_,_,0,4,FV ), 0 , 181, 0 , 423, 145), // #1559
+ INST(Vrsqrtps , VexRm_Lx , V(000F00,52,_,x,I,_,_,_ ), 0 , 74 , 0 , 301, 146), // #1560
+ INST(Vrsqrtsh , VexRvm , E(66MAP6,4F,_,_,_,0,1,T1S), 0 , 183, 0 , 424, 145), // #1561
+ INST(Vrsqrtss , VexRvm , V(F30F00,52,_,I,I,_,_,_ ), 0 , 193, 0 , 425, 146), // #1562
+ INST(Vscalefpd , VexRvm_Lx , E(660F38,2C,_,x,_,1,4,FV ), 0 , 112, 0 , 431, 149), // #1563
+ INST(Vscalefph , VexRvm_Lx , E(66MAP6,2C,_,_,_,0,4,FV ), 0 , 181, 0 , 200, 145), // #1564
+ INST(Vscalefps , VexRvm_Lx , E(660F38,2C,_,x,_,0,4,FV ), 0 , 113, 0 , 287, 149), // #1565
+ INST(Vscalefsd , VexRvm , E(660F38,2D,_,I,_,1,3,T1S), 0 , 127, 0 , 256, 149), // #1566
+ INST(Vscalefsh , VexRvm , E(66MAP6,2D,_,_,_,0,1,T1S), 0 , 183, 0 , 203, 145), // #1567
+ INST(Vscalefss , VexRvm , E(660F38,2D,_,I,_,0,2,T1S), 0 , 128, 0 , 264, 149), // #1568
+ INST(Vscatterdpd , VexMr_VM , E(660F38,A2,_,x,_,1,3,T1S), 0 , 127, 0 , 404, 149), // #1569
+ INST(Vscatterdps , VexMr_VM , E(660F38,A2,_,x,_,0,2,T1S), 0 , 128, 0 , 403, 149), // #1570
+ INST(Vscatterqpd , VexMr_VM , E(660F38,A3,_,x,_,1,3,T1S), 0 , 127, 0 , 406, 149), // #1571
+ INST(Vscatterqps , VexMr_VM , E(660F38,A3,_,x,_,0,2,T1S), 0 , 128, 0 , 405, 149), // #1572
+ INST(Vsha512msg1 , VexRm , V(F20F38,CC,_,1,0,_,_,_ ), 0 , 224, 0 , 432, 187), // #1573
+ INST(Vsha512msg2 , VexRm , V(F20F38,CD,_,1,0,_,_,_ ), 0 , 224, 0 , 433, 187), // #1574
+ INST(Vsha512rnds2 , VexRvm , V(F20F38,CB,_,1,0,_,_,_ ), 0 , 224, 0 , 434, 187), // #1575
+ INST(Vshuff32x4 , VexRvmi_Lx , E(660F3A,23,_,x,_,0,4,FV ), 0 , 110, 0 , 435, 149), // #1576
+ INST(Vshuff64x2 , VexRvmi_Lx , E(660F3A,23,_,x,_,1,4,FV ), 0 , 111, 0 , 436, 149), // #1577
+ INST(Vshufi32x4 , VexRvmi_Lx , E(660F3A,43,_,x,_,0,4,FV ), 0 , 110, 0 , 435, 149), // #1578
+ INST(Vshufi64x2 , VexRvmi_Lx , E(660F3A,43,_,x,_,1,4,FV ), 0 , 111, 0 , 436, 149), // #1579
+ INST(Vshufpd , VexRvmi_Lx , V(660F00,C6,_,x,I,1,4,FV ), 0 , 102, 0 , 437, 144), // #1580
+ INST(Vshufps , VexRvmi_Lx , V(000F00,C6,_,x,I,0,4,FV ), 0 , 104, 0 , 438, 144), // #1581
+ INST(Vsm3msg1 , VexRvm , V(000F38,DA,_,0,0,_,_,_ ), 0 , 11 , 0 , 439, 188), // #1582
+ INST(Vsm3msg2 , VexRvm , V(660F38,DA,_,0,0,_,_,_ ), 0 , 30 , 0 , 439, 188), // #1583
+ INST(Vsm3rnds2 , VexRvmi , V(660F3A,DE,_,0,0,_,_,_ ), 0 , 75 , 0 , 281, 188), // #1584
+ INST(Vsm4key4 , VexRvm_Lx , V(F30F38,DA,_,x,0,_,_,_ ), 0 , 89 , 0 , 205, 189), // #1585
+ INST(Vsm4rnds4 , VexRvm_Lx , V(F20F38,DA,_,x,0,_,_,_ ), 0 , 85 , 0 , 205, 189), // #1586
+ INST(Vsqrtpd , VexRm_Lx , V(660F00,51,_,x,I,1,4,FV ), 0 , 102, 0 , 440, 144), // #1587
+ INST(Vsqrtph , VexRm_Lx , E(00MAP5,51,_,_,_,0,4,FV ), 0 , 103, 0 , 251, 145), // #1588
+ INST(Vsqrtps , VexRm_Lx , V(000F00,51,_,x,I,0,4,FV ), 0 , 104, 0 , 239, 144), // #1589
+ INST(Vsqrtsd , VexRvm , V(F20F00,51,_,I,I,1,3,T1S), 0 , 105, 0 , 202, 144), // #1590
+ INST(Vsqrtsh , VexRvm , E(F3MAP5,51,_,_,_,0,1,T1S), 0 , 106, 0 , 203, 145), // #1591
+ INST(Vsqrtss , VexRvm , V(F30F00,51,_,I,I,0,2,T1S), 0 , 107, 0 , 204, 144), // #1592
+ INST(Vstmxcsr , VexM , V(000F00,AE,3,0,I,_,_,_ ), 0 , 225, 0 , 320, 146), // #1593
+ INST(Vsubpd , VexRvm_Lx , V(660F00,5C,_,x,I,1,4,FV ), 0 , 102, 0 , 199, 144), // #1594
+ INST(Vsubph , VexRvm_Lx , E(00MAP5,5C,_,_,_,0,4,FV ), 0 , 103, 0 , 200, 145), // #1595
+ INST(Vsubps , VexRvm_Lx , V(000F00,5C,_,x,I,0,4,FV ), 0 , 104, 0 , 201, 144), // #1596
+ INST(Vsubsd , VexRvm , V(F20F00,5C,_,I,I,1,3,T1S), 0 , 105, 0 , 202, 144), // #1597
+ INST(Vsubsh , VexRvm , E(F3MAP5,5C,_,_,_,0,1,T1S), 0 , 106, 0 , 203, 145), // #1598
+ INST(Vsubss , VexRvm , V(F30F00,5C,_,I,I,0,2,T1S), 0 , 107, 0 , 204, 144), // #1599
+ INST(Vtestpd , VexRm_Lx , V(660F38,0F,_,x,0,_,_,_ ), 0 , 30 , 0 , 301, 177), // #1600
+ INST(Vtestps , VexRm_Lx , V(660F38,0E,_,x,0,_,_,_ ), 0 , 30 , 0 , 301, 177), // #1601
+ INST(Vucomisd , VexRm , V(660F00,2E,_,I,I,1,3,T1S), 0 , 124, 0 , 233, 155), // #1602
+ INST(Vucomish , VexRm , E(00MAP5,2E,_,_,_,0,1,T1S), 0 , 125, 0 , 234, 156), // #1603
+ INST(Vucomiss , VexRm , V(000F00,2E,_,I,I,0,2,T1S), 0 , 126, 0 , 235, 155), // #1604
+ INST(Vunpckhpd , VexRvm_Lx , V(660F00,15,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 144), // #1605
+ INST(Vunpckhps , VexRvm_Lx , V(000F00,15,_,x,I,0,4,FV ), 0 , 104, 0 , 212, 144), // #1606
+ INST(Vunpcklpd , VexRvm_Lx , V(660F00,14,_,x,I,1,4,FV ), 0 , 102, 0 , 211, 144), // #1607
+ INST(Vunpcklps , VexRvm_Lx , V(000F00,14,_,x,I,0,4,FV ), 0 , 104, 0 , 212, 144), // #1608
+ INST(Vxorpd , VexRvm_Lx , V(660F00,57,_,x,I,1,4,FV ), 0 , 102, 0 , 418, 150), // #1609
+ INST(Vxorps , VexRvm_Lx , V(000F00,57,_,x,I,0,4,FV ), 0 , 104, 0 , 417, 150), // #1610
+ INST(Vzeroall , VexOp , V(000F00,77,_,1,I,_,_,_ ), 0 , 70 , 0 , 441, 146), // #1611
+ INST(Vzeroupper , VexOp , V(000F00,77,_,0,I,_,_,_ ), 0 , 74 , 0 , 441, 146), // #1612
+ INST(Wbinvd , X86Op , O(000F00,09,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 45 ), // #1613
+ INST(Wbnoinvd , X86Op , O(F30F00,09,_,_,_,_,_,_ ), 0 , 7 , 0 , 31 , 190), // #1614
+ INST(Wrfsbase , X86M , O(F30F00,AE,2,_,x,_,_,_ ), 0 , 226, 0 , 177, 122), // #1615
+ INST(Wrgsbase , X86M , O(F30F00,AE,3,_,x,_,_,_ ), 0 , 227, 0 , 177, 122), // #1616
+ INST(Wrmsr , X86Op , O(000F00,30,_,_,_,_,_,_ ), 0 , 5 , 0 , 180, 191), // #1617
+ INST(Wrssd , X86Mr , O(000F38,F6,_,_,_,_,_,_ ), 0 , 1 , 0 , 442, 65 ), // #1618
+ INST(Wrssq , X86Mr , O(000F38,F6,_,_,1,_,_,_ ), 0 , 228, 0 , 443, 65 ), // #1619
+ INST(Wrussd , X86Mr , O(660F38,F5,_,_,_,_,_,_ ), 0 , 2 , 0 , 442, 65 ), // #1620
+ INST(Wrussq , X86Mr , O(660F38,F5,_,_,1,_,_,_ ), 0 , 229, 0 , 443, 65 ), // #1621
+ INST(Xabort , X86Op_Mod11RM_I8 , O(000000,C6,7,_,_,_,_,_ ), 0 , 29 , 0 , 83 , 192), // #1622
+ INST(Xadd , X86Xadd , O(000F00,C0,_,_,x,_,_,_ ), 0 , 5 , 0 , 444, 40 ), // #1623
+ INST(Xbegin , X86JmpRel , O(000000,C7,7,_,_,_,_,_ ), 0 , 29 , 0 , 445, 192), // #1624
+ INST(Xchg , X86Xchg , O(000000,86,_,_,x,_,_,_ ), 0 , 0 , 0 , 446, 0 ), // #1625
+ INST(Xend , X86Op , O(000F01,D5,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 192), // #1626
+ INST(Xgetbv , X86Op , O(000F01,D0,_,_,_,_,_,_ ), 0 , 23 , 0 , 180, 193), // #1627
+ INST(Xlatb , X86Op , O(000000,D7,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #1628
+ INST(Xor , X86Arith , O(000000,30,6,_,x,_,_,_ ), 0 , 34 , 0 , 184, 1 ), // #1629
+ INST(Xorpd , ExtRm , O(660F00,57,_,_,_,_,_,_ ), 0 , 4 , 0 , 154, 5 ), // #1630
+ INST(Xorps , ExtRm , O(000F00,57,_,_,_,_,_,_ ), 0 , 5 , 0 , 154, 6 ), // #1631
+ INST(Xresldtrk , X86Op , O(F20F01,E9,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 194), // #1632
+ INST(Xrstor , X86M_Only_EDX_EAX , O(000F00,AE,5,_,_,_,_,_ ), 0 , 79 , 0 , 447, 193), // #1633
+ INST(Xrstor64 , X86M_Only_EDX_EAX , O(000F00,AE,5,_,1,_,_,_ ), 0 , 230, 0 , 448, 193), // #1634
+ INST(Xrstors , X86M_Only_EDX_EAX , O(000F00,C7,3,_,_,_,_,_ ), 0 , 80 , 0 , 447, 195), // #1635
+ INST(Xrstors64 , X86M_Only_EDX_EAX , O(000F00,C7,3,_,1,_,_,_ ), 0 , 231, 0 , 448, 195), // #1636
+ INST(Xsave , X86M_Only_EDX_EAX , O(000F00,AE,4,_,_,_,_,_ ), 0 , 98 , 0 , 447, 193), // #1637
+ INST(Xsave64 , X86M_Only_EDX_EAX , O(000F00,AE,4,_,1,_,_,_ ), 0 , 232, 0 , 448, 193), // #1638
+ INST(Xsavec , X86M_Only_EDX_EAX , O(000F00,C7,4,_,_,_,_,_ ), 0 , 98 , 0 , 447, 196), // #1639
+ INST(Xsavec64 , X86M_Only_EDX_EAX , O(000F00,C7,4,_,1,_,_,_ ), 0 , 232, 0 , 448, 196), // #1640
+ INST(Xsaveopt , X86M_Only_EDX_EAX , O(000F00,AE,6,_,_,_,_,_ ), 0 , 82 , 0 , 447, 197), // #1641
+ INST(Xsaveopt64 , X86M_Only_EDX_EAX , O(000F00,AE,6,_,1,_,_,_ ), 0 , 233, 0 , 448, 197), // #1642
+ INST(Xsaves , X86M_Only_EDX_EAX , O(000F00,C7,5,_,_,_,_,_ ), 0 , 79 , 0 , 447, 195), // #1643
+ INST(Xsaves64 , X86M_Only_EDX_EAX , O(000F00,C7,5,_,1,_,_,_ ), 0 , 230, 0 , 448, 195), // #1644
+ INST(Xsetbv , X86Op , O(000F01,D1,_,_,_,_,_,_ ), 0 , 23 , 0 , 180, 193), // #1645
+ INST(Xsusldtrk , X86Op , O(F20F01,E8,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 194), // #1646
+ INST(Xtest , X86Op , O(000F01,D6,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 198) // #1647
+ // ${InstInfo:End}
+};
+#undef NAME_DATA_INDEX
+#undef INST
+
+// x86::InstDB - Opcode Tables
+// ===========================
+
+// ${MainOpcodeTable:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const uint32_t InstDB::main_opcode_table[] = {
+ O(000000,00,0,0,0,0,0,0 ), // #0 [ref=56x]
+ O(000F38,00,0,0,0,0,0,0 ), // #1 [ref=25x]
+ O(660F38,00,0,0,0,0,0,0 ), // #2 [ref=44x]
+ O(000000,00,2,0,0,0,0,0 ), // #3 [ref=4x]
+ O(660F00,00,0,0,0,0,0,0 ), // #4 [ref=38x]
+ O(000F00,00,0,0,0,0,0,0 ), // #5 [ref=189x]
+ O(F20F00,00,0,0,0,0,0,0 ), // #6 [ref=24x]
+ O(F30F00,00,0,0,0,0,0,0 ), // #7 [ref=29x]
+ O(F30F38,00,0,0,0,0,0,0 ), // #8 [ref=3x]
+ O(660F3A,00,0,0,0,0,0,0 ), // #9 [ref=22x]
+ O(000000,00,4,0,0,0,0,0 ), // #10 [ref=4x]
+ V(000F38,00,0,0,0,0,0,None), // #11 [ref=13x]
+ O(F20F38,00,0,0,0,0,0,0 ), // #12 [ref=3x]
+ V(XOP_M9,00,1,0,0,0,0,None), // #13 [ref=3x]
+ V(XOP_M9,00,6,0,0,0,0,None), // #14 [ref=2x]
+ V(XOP_M9,00,5,0,0,0,0,None), // #15 [ref=1x]
+ V(XOP_M9,00,3,0,0,0,0,None), // #16 [ref=1x]
+ V(XOP_M9,00,2,0,0,0,0,None), // #17 [ref=1x]
+ V(000F38,00,3,0,0,0,0,None), // #18 [ref=1x]
+ V(000F38,00,2,0,0,0,0,None), // #19 [ref=1x]
+ V(000F38,00,1,0,0,0,0,None), // #20 [ref=1x]
+ O(660000,00,0,0,0,0,0,0 ), // #21 [ref=7x]
+ O(000000,00,0,0,1,0,0,0 ), // #22 [ref=3x]
+ O(000F01,00,0,0,0,0,0,0 ), // #23 [ref=32x]
+ O(000F00,00,7,0,0,0,0,0 ), // #24 [ref=6x]
+ O(660F00,00,7,0,0,0,0,0 ), // #25 [ref=1x]
+ O(F30F00,00,6,0,0,0,0,0 ), // #26 [ref=4x]
+ O(F30F01,00,0,0,0,0,0,0 ), // #27 [ref=9x]
+ O(660F00,00,6,0,0,0,0,0 ), // #28 [ref=3x]
+ O(000000,00,7,0,0,0,0,0 ), // #29 [ref=5x]
+ V(660F38,00,0,0,0,0,0,None), // #30 [ref=48x]
+ O(000F00,00,1,0,1,0,0,0 ), // #31 [ref=2x]
+ O(000F00,00,1,0,0,0,0,0 ), // #32 [ref=6x]
+ O(000000,00,1,0,0,0,0,0 ), // #33 [ref=3x]
+ O(000000,00,6,0,0,0,0,0 ), // #34 [ref=4x]
+ O(F30F00,00,7,0,0,0,0,3 ), // #35 [ref=1x]
+ O(F30F00,00,7,0,0,0,0,2 ), // #36 [ref=1x]
+ O_FPU(00,D900,0) , // #37 [ref=29x]
+ O_FPU(00,C000,0) , // #38 [ref=1x]
+ O_FPU(00,DE00,0) , // #39 [ref=7x]
+ O_FPU(00,0000,4) , // #40 [ref=4x]
+ O_FPU(00,0000,6) , // #41 [ref=4x]
+ O_FPU(9B,DB00,0) , // #42 [ref=2x]
+ O_FPU(00,DA00,0) , // #43 [ref=5x]
+ O_FPU(00,DB00,0) , // #44 [ref=8x]
+ O_FPU(00,D000,2) , // #45 [ref=1x]
+ O_FPU(00,DF00,0) , // #46 [ref=2x]
+ O_FPU(00,D800,3) , // #47 [ref=1x]
+ O_FPU(00,F000,6) , // #48 [ref=1x]
+ O_FPU(00,F800,7) , // #49 [ref=1x]
+ O_FPU(00,DD00,0) , // #50 [ref=3x]
+ O_FPU(00,0000,0) , // #51 [ref=4x]
+ O_FPU(00,0000,2) , // #52 [ref=3x]
+ O_FPU(00,0000,3) , // #53 [ref=3x]
+ O_FPU(00,0000,7) , // #54 [ref=3x]
+ O_FPU(00,0000,1) , // #55 [ref=2x]
+ O_FPU(00,0000,5) , // #56 [ref=2x]
+ O_FPU(00,C800,1) , // #57 [ref=1x]
+ O_FPU(9B,0000,6) , // #58 [ref=2x]
+ O_FPU(9B,0000,7) , // #59 [ref=2x]
+ O_FPU(00,E000,4) , // #60 [ref=1x]
+ O_FPU(00,E800,5) , // #61 [ref=1x]
+ O(000F00,00,0,0,1,0,0,0 ), // #62 [ref=3x]
+ O(F30F3A,00,0,0,0,0,0,0 ), // #63 [ref=1x]
+ O(000000,00,5,0,0,0,0,0 ), // #64 [ref=4x]
+ O(F30F00,00,5,0,0,0,0,0 ), // #65 [ref=2x]
+ O(F30F00,00,5,0,1,0,0,0 ), // #66 [ref=1x]
+ V(660F00,00,0,1,0,0,0,None), // #67 [ref=7x]
+ V(660F00,00,0,1,1,0,0,None), // #68 [ref=6x]
+ V(000F00,00,0,1,1,0,0,None), // #69 [ref=7x]
+ V(000F00,00,0,1,0,0,0,None), // #70 [ref=8x]
+ V(660F00,00,0,0,0,0,0,None), // #71 [ref=15x]
+ V(660F00,00,0,0,1,0,0,None), // #72 [ref=4x]
+ V(000F00,00,0,0,1,0,0,None), // #73 [ref=4x]
+ V(000F00,00,0,0,0,0,0,None), // #74 [ref=10x]
+ V(660F3A,00,0,0,0,0,0,None), // #75 [ref=48x]
+ V(660F3A,00,0,0,1,0,0,None), // #76 [ref=4x]
+ O(000000,00,3,0,0,0,0,0 ), // #77 [ref=4x]
+ O(000F00,00,2,0,0,0,0,0 ), // #78 [ref=5x]
+ O(000F00,00,5,0,0,0,0,0 ), // #79 [ref=4x]
+ O(000F00,00,3,0,0,0,0,0 ), // #80 [ref=5x]
+ V(XOP_M9,00,0,0,0,0,0,None), // #81 [ref=32x]
+ O(000F00,00,6,0,0,0,0,0 ), // #82 [ref=6x]
+ V(XOP_MA,00,0,0,0,0,0,None), // #83 [ref=1x]
+ V(XOP_MA,00,1,0,0,0,0,None), // #84 [ref=1x]
+ V(F20F38,00,0,0,0,0,0,None), // #85 [ref=11x]
+ O(000F3A,00,0,0,0,0,0,0 ), // #86 [ref=4x]
+ O(F30000,00,0,0,0,0,0,0 ), // #87 [ref=1x]
+ O(000F0F,00,0,0,0,0,0,0 ), // #88 [ref=26x]
+ V(F30F38,00,0,0,0,0,0,None), // #89 [ref=12x]
+ O(000F3A,00,0,0,1,0,0,0 ), // #90 [ref=1x]
+ O(660F3A,00,0,0,1,0,0,0 ), // #91 [ref=1x]
+ O(F30F00,00,4,0,0,0,0,0 ), // #92 [ref=1x]
+ O(F20F01,00,0,0,0,0,0,0 ), // #93 [ref=5x]
+ O(F30F00,00,1,0,0,0,0,0 ), // #94 [ref=3x]
+ O(F30F00,00,7,0,0,0,0,0 ), // #95 [ref=1x]
+ V(F20F3A,00,0,0,0,0,0,None), // #96 [ref=1x]
+ O(660F01,00,0,0,0,0,0,0 ), // #97 [ref=4x]
+ O(000F00,00,4,0,0,0,0,0 ), // #98 [ref=4x]
+ V(XOP_M9,00,7,0,0,0,0,None), // #99 [ref=1x]
+ V(XOP_M9,00,4,0,0,0,0,None), // #100 [ref=1x]
+ O(F20F00,00,6,0,0,0,0,0 ), // #101 [ref=1x]
+ V(660F00,00,0,0,0,1,4,ByLL), // #102 [ref=25x]
+ E(00MAP5,00,0,0,0,0,4,ByLL), // #103 [ref=10x]
+ V(000F00,00,0,0,0,0,4,ByLL), // #104 [ref=19x]
+ V(F20F00,00,0,0,0,1,3,None), // #105 [ref=10x]
+ E(F3MAP5,00,0,0,0,0,1,None), // #106 [ref=13x]
+ V(F30F00,00,0,0,0,0,2,None), // #107 [ref=12x]
+ V(F20F00,00,0,0,0,0,0,None), // #108 [ref=4x]
+ V(660F38,00,0,0,0,0,4,ByLL), // #109 [ref=50x]
+ E(660F3A,00,0,0,0,0,4,ByLL), // #110 [ref=17x]
+ E(660F3A,00,0,0,0,1,4,ByLL), // #111 [ref=18x]
+ E(660F38,00,0,0,0,1,4,ByLL), // #112 [ref=38x]
+ E(660F38,00,0,0,0,0,4,ByLL), // #113 [ref=25x]
+ V(660F38,00,0,1,0,0,0,None), // #114 [ref=2x]
+ E(660F38,00,0,0,0,0,3,None), // #115 [ref=2x]
+ E(660F38,00,0,0,0,0,4,None), // #116 [ref=2x]
+ E(660F38,00,0,2,0,0,5,None), // #117 [ref=2x]
+ E(660F38,00,0,0,0,1,4,None), // #118 [ref=2x]
+ E(660F38,00,0,2,0,1,5,None), // #119 [ref=2x]
+ V(660F38,00,0,0,0,1,3,None), // #120 [ref=2x]
+ V(660F38,00,0,0,0,0,2,None), // #121 [ref=14x]
+ E(000F3A,00,0,0,0,0,4,ByLL), // #122 [ref=5x]
+ E(F30F3A,00,0,0,0,0,1,None), // #123 [ref=1x]
+ V(660F00,00,0,0,0,1,3,None), // #124 [ref=5x]
+ E(00MAP5,00,0,0,0,0,1,None), // #125 [ref=2x]
+ V(000F00,00,0,0,0,0,2,None), // #126 [ref=2x]
+ E(660F38,00,0,0,0,1,3,None), // #127 [ref=12x]
+ E(660F38,00,0,0,0,0,2,None), // #128 [ref=12x]
+ V(F30F00,00,0,0,0,0,3,ByLL), // #129 [ref=1x]
+ E(F20F38,00,0,0,0,0,4,ByLL), // #130 [ref=2x]
+ V(F30F38,00,0,0,0,0,4,ByLL), // #131 [ref=1x]
+ V(F20F00,00,0,0,0,1,4,ByLL), // #132 [ref=1x]
+ E(66MAP5,00,0,0,0,1,4,ByLL), // #133 [ref=1x]
+ E(660F00,00,0,0,0,1,4,ByLL), // #134 [ref=10x]
+ E(000F00,00,0,0,0,1,4,ByLL), // #135 [ref=3x]
+ E(66MAP5,00,0,0,0,0,3,ByLL), // #136 [ref=1x]
+ E(00MAP5,00,0,0,0,0,2,ByLL), // #137 [ref=1x]
+ V(660F38,00,0,0,0,0,3,ByLL), // #138 [ref=7x]
+ E(66MAP6,00,0,0,0,0,3,ByLL), // #139 [ref=1x]
+ E(66MAP5,00,0,0,0,0,2,ByLL), // #140 [ref=4x]
+ E(00MAP5,00,0,0,0,0,3,ByLL), // #141 [ref=2x]
+ E(66MAP5,00,0,0,0,0,4,ByLL), // #142 [ref=3x]
+ V(660F00,00,0,0,0,0,4,ByLL), // #143 [ref=43x]
+ V(000F00,00,0,0,0,0,3,ByLL), // #144 [ref=1x]
+ V(660F3A,00,0,0,0,0,3,ByLL), // #145 [ref=1x]
+ E(660F00,00,0,0,0,0,3,ByLL), // #146 [ref=4x]
+ E(000F00,00,0,0,0,0,4,ByLL), // #147 [ref=2x]
+ E(F30F00,00,0,0,0,1,4,ByLL), // #148 [ref=3x]
+ E(00MAP5,00,0,0,0,1,4,ByLL), // #149 [ref=1x]
+ E(F2MAP5,00,0,0,0,1,3,None), // #150 [ref=1x]
+ V(F20F00,00,0,0,0,0,3,None), // #151 [ref=2x]
+ E(F20F00,00,0,0,0,0,3,None), // #152 [ref=2x]
+ E(00MAP6,00,0,0,0,0,1,None), // #153 [ref=1x]
+ V(F20F00,00,0,0,0,0,2,T1W ), // #154 [ref=1x]
+ E(F3MAP5,00,0,0,0,0,2,T1W ), // #155 [ref=2x]
+ V(F30F00,00,0,0,0,0,2,T1W ), // #156 [ref=1x]
+ E(00MAP5,00,0,0,0,0,2,None), // #157 [ref=1x]
+ E(F30F00,00,0,0,0,0,2,None), // #158 [ref=2x]
+ E(F3MAP5,00,0,0,0,0,3,ByLL), // #159 [ref=1x]
+ V(F30F00,00,0,0,0,0,4,ByLL), // #160 [ref=4x]
+ E(F30F00,00,0,0,0,0,3,ByLL), // #161 [ref=1x]
+ E(F2MAP5,00,0,0,0,0,4,ByLL), // #162 [ref=2x]
+ E(F20F00,00,0,0,0,0,4,ByLL), // #163 [ref=2x]
+ E(F2MAP5,00,0,0,0,1,4,ByLL), // #164 [ref=1x]
+ E(F20F00,00,0,0,0,1,4,ByLL), // #165 [ref=2x]
+ E(F20F00,00,0,0,0,0,2,T1W ), // #166 [ref=1x]
+ E(F30F00,00,0,0,0,0,2,T1W ), // #167 [ref=1x]
+ E(F3MAP5,00,0,0,0,0,4,ByLL), // #168 [ref=1x]
+ E(F30F38,00,0,0,0,0,4,ByLL), // #169 [ref=3x]
+ V(660F3A,00,0,1,0,0,0,None), // #170 [ref=6x]
+ E(660F3A,00,0,0,0,0,4,None), // #171 [ref=4x]
+ E(660F3A,00,0,2,0,0,5,None), // #172 [ref=4x]
+ E(660F3A,00,0,0,0,1,4,None), // #173 [ref=4x]
+ E(660F3A,00,0,2,0,1,5,None), // #174 [ref=4x]
+ V(660F3A,00,0,0,0,0,2,None), // #175 [ref=4x]
+ E(F2MAP6,00,0,0,0,0,4,ByLL), // #176 [ref=2x]
+ E(F2MAP6,00,0,0,0,0,2,None), // #177 [ref=2x]
+ E(660F3A,00,0,0,0,1,3,None), // #178 [ref=6x]
+ E(660F3A,00,0,0,0,0,2,None), // #179 [ref=6x]
+ V(660F38,00,0,0,1,1,4,ByLL), // #180 [ref=22x]
+ E(66MAP6,00,0,0,0,0,4,ByLL), // #181 [ref=22x]
+ V(660F38,00,0,0,1,1,3,None), // #182 [ref=12x]
+ E(66MAP6,00,0,0,0,0,1,None), // #183 [ref=16x]
+ E(F3MAP6,00,0,0,0,0,4,ByLL), // #184 [ref=2x]
+ E(F3MAP6,00,0,0,0,0,2,None), // #185 [ref=2x]
+ E(000F3A,00,0,0,0,0,1,None), // #186 [ref=4x]
+ V(660F38,00,0,0,1,0,0,None), // #187 [ref=5x]
+ V(660F3A,00,0,0,1,1,4,ByLL), // #188 [ref=2x]
+ V(000F00,00,2,0,0,0,0,None), // #189 [ref=1x]
+ V(660F00,00,0,0,0,0,2,None), // #190 [ref=1x]
+ V(F20F00,00,0,0,0,1,3,DUP ), // #191 [ref=1x]
+ E(660F00,00,0,0,0,0,4,ByLL), // #192 [ref=6x]
+ V(F30F00,00,0,0,0,0,0,None), // #193 [ref=3x]
+ E(F30F00,00,0,0,0,0,4,ByLL), // #194 [ref=1x]
+ V(000F00,00,0,0,0,0,3,None), // #195 [ref=2x]
+ E(66MAP5,00,0,0,0,0,1,None), // #196 [ref=1x]
+ E(F20F38,00,0,0,0,1,4,ByLL), // #197 [ref=1x]
+ V(660F3A,00,0,0,0,0,4,ByLL), // #198 [ref=2x]
+ E(F30F38,00,0,0,0,1,0,None), // #199 [ref=5x]
+ E(F30F38,00,0,0,0,0,0,None), // #200 [ref=5x]
+ V(660F38,00,0,0,0,0,1,None), // #201 [ref=1x]
+ V(XOP_M8,00,0,0,0,0,0,None), // #202 [ref=22x]
+ V(660F38,00,0,0,0,1,4,ByLL), // #203 [ref=4x]
+ E(660F38,00,0,0,0,0,0,None), // #204 [ref=2x]
+ E(660F38,00,0,0,0,1,1,None), // #205 [ref=2x]
+ E(660F38,00,0,0,1,1,4,ByLL), // #206 [ref=1x]
+ V(660F3A,00,0,0,1,1,3,None), // #207 [ref=2x]
+ V(660F3A,00,0,0,0,0,1,None), // #208 [ref=1x]
+ V(660F00,00,0,0,0,0,1,None), // #209 [ref=1x]
+ E(F30F38,00,0,0,0,0,2,ByLL), // #210 [ref=6x]
+ E(F30F38,00,0,0,0,0,3,ByLL), // #211 [ref=9x]
+ E(F30F38,00,0,0,0,0,1,ByLL), // #212 [ref=3x]
+ V(660F38,00,0,0,0,0,2,ByLL), // #213 [ref=4x]
+ V(660F38,00,0,0,0,0,1,ByLL), // #214 [ref=2x]
+ E(660F00,00,1,0,0,0,4,ByLL), // #215 [ref=1x]
+ E(660F00,00,1,0,0,1,4,ByLL), // #216 [ref=1x]
+ V(F20F00,00,0,0,0,0,4,ByLL), // #217 [ref=1x]
+ V(660F00,00,0,0,0,0,4,None), // #218 [ref=6x]
+ V(660F00,00,7,0,0,0,4,ByLL), // #219 [ref=1x]
+ V(660F00,00,0,0,0,1,4,None), // #220 [ref=2x]
+ E(660F00,00,0,0,0,1,4,None), // #221 [ref=1x]
+ V(660F00,00,3,0,0,0,4,ByLL), // #222 [ref=1x]
+ E(F30F38,00,0,0,0,1,4,ByLL), // #223 [ref=2x]
+ V(F20F38,00,0,1,0,0,0,None), // #224 [ref=3x]
+ V(000F00,00,3,0,0,0,0,None), // #225 [ref=1x]
+ O(F30F00,00,2,0,0,0,0,0 ), // #226 [ref=1x]
+ O(F30F00,00,3,0,0,0,0,0 ), // #227 [ref=1x]
+ O(000F38,00,0,0,1,0,0,0 ), // #228 [ref=1x]
+ O(660F38,00,0,0,1,0,0,0 ), // #229 [ref=1x]
+ O(000F00,00,5,0,1,0,0,0 ), // #230 [ref=2x]
+ O(000F00,00,3,0,1,0,0,0 ), // #231 [ref=1x]
+ O(000F00,00,4,0,1,0,0,0 ), // #232 [ref=2x]
+ O(000F00,00,6,0,1,0,0,0 ) // #233 [ref=1x]
+};
+// ----------------------------------------------------------------------------
+// ${MainOpcodeTable:End}
+
+// ${AltOpcodeTable:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const uint32_t InstDB::alt_opcode_table[] = {
+ O(000000,00,0,0,0,0,0,0 ), // #0 [ref=1512x]
+ O(660F00,1B,0,0,0,0,0,0 ), // #1 [ref=1x]
+ O(000F00,BA,4,0,0,0,0,0 ), // #2 [ref=1x]
+ O(000F00,BA,7,0,0,0,0,0 ), // #3 [ref=1x]
+ O(000F00,BA,6,0,0,0,0,0 ), // #4 [ref=1x]
+ O(000F00,BA,5,0,0,0,0,0 ), // #5 [ref=1x]
+ O(000000,48,0,0,0,0,0,0 ), // #6 [ref=1x]
+ O(660F00,78,0,0,0,0,0,0 ), // #7 [ref=1x]
+ O_FPU(00,00DF,5) , // #8 [ref=1x]
+ O_FPU(00,00DF,7) , // #9 [ref=1x]
+ O_FPU(00,00DD,1) , // #10 [ref=1x]
+ O_FPU(00,00DB,5) , // #11 [ref=1x]
+ O_FPU(00,DFE0,0) , // #12 [ref=1x]
+ O(000000,DB,7,0,0,0,0,0 ), // #13 [ref=1x]
+ O_FPU(9B,DFE0,0) , // #14 [ref=1x]
+ O(000000,E4,0,0,0,0,0,0 ), // #15 [ref=1x]
+ O(000000,40,0,0,0,0,0,0 ), // #16 [ref=1x]
+ O(F20F00,78,0,0,0,0,0,0 ), // #17 [ref=1x]
+ O(000000,72,0,0,0,0,0,0 ), // #18 [ref=1x]
+ O(000000,76,0,0,0,0,0,0 ), // #19 [ref=1x]
+ O(000000,E3,0,0,0,0,0,0 ), // #20 [ref=1x]
+ O(000000,7C,0,0,0,0,0,0 ), // #21 [ref=1x]
+ O(000000,7E,0,0,0,0,0,0 ), // #22 [ref=1x]
+ O(000000,EB,0,0,0,0,0,0 ), // #23 [ref=1x]
+ O(000000,73,0,0,0,0,0,0 ), // #24 [ref=1x]
+ O(000000,77,0,0,0,0,0,0 ), // #25 [ref=1x]
+ O(000000,7D,0,0,0,0,0,0 ), // #26 [ref=1x]
+ O(000000,7F,0,0,0,0,0,0 ), // #27 [ref=1x]
+ O(000000,71,0,0,0,0,0,0 ), // #28 [ref=1x]
+ O(000000,7B,0,0,0,0,0,0 ), // #29 [ref=1x]
+ O(000000,79,0,0,0,0,0,0 ), // #30 [ref=1x]
+ O(000000,75,0,0,0,0,0,0 ), // #31 [ref=1x]
+ O(000000,70,0,0,0,0,0,0 ), // #32 [ref=1x]
+ O(000000,7A,0,0,0,0,0,0 ), // #33 [ref=1x]
+ O(000000,78,0,0,0,0,0,0 ), // #34 [ref=1x]
+ O(000000,74,0,0,0,0,0,0 ), // #35 [ref=1x]
+ V(660F00,92,0,0,0,0,0,None), // #36 [ref=1x]
+ V(F20F00,92,0,0,0,0,0,None), // #37 [ref=1x]
+ V(F20F00,92,0,0,1,0,0,None), // #38 [ref=1x]
+ V(000F00,92,0,0,0,0,0,None), // #39 [ref=1x]
+ O(000000,9A,0,0,0,0,0,0 ), // #40 [ref=1x]
+ O(000000,EA,0,0,0,0,0,0 ), // #41 [ref=1x]
+ O(000000,E2,0,0,0,0,0,0 ), // #42 [ref=1x]
+ O(000000,E1,0,0,0,0,0,0 ), // #43 [ref=1x]
+ O(000000,E0,0,0,0,0,0,0 ), // #44 [ref=1x]
+ O(660F00,29,0,0,0,0,0,0 ), // #45 [ref=1x]
+ O(000F00,29,0,0,0,0,0,0 ), // #46 [ref=1x]
+ O(000F38,F1,0,0,0,0,0,0 ), // #47 [ref=1x]
+ O(000F00,7E,0,0,0,0,0,0 ), // #48 [ref=2x]
+ O(660F00,7F,0,0,0,0,0,0 ), // #49 [ref=1x]
+ O(F30F00,7F,0,0,0,0,0,0 ), // #50 [ref=1x]
+ O(660F00,17,0,0,0,0,0,0 ), // #51 [ref=1x]
+ O(000F00,17,0,0,0,0,0,0 ), // #52 [ref=1x]
+ O(660F00,13,0,0,0,0,0,0 ), // #53 [ref=1x]
+ O(000F00,13,0,0,0,0,0,0 ), // #54 [ref=1x]
+ O(660F00,E7,0,0,0,0,0,0 ), // #55 [ref=1x]
+ O(660F00,2B,0,0,0,0,0,0 ), // #56 [ref=1x]
+ O(000F00,2B,0,0,0,0,0,0 ), // #57 [ref=1x]
+ O(000F00,E7,0,0,0,0,0,0 ), // #58 [ref=1x]
+ O(F20F00,2B,0,0,0,0,0,0 ), // #59 [ref=1x]
+ O(F30F00,2B,0,0,0,0,0,0 ), // #60 [ref=1x]
+ O(F20F00,11,0,0,0,0,0,0 ), // #61 [ref=1x]
+ O(F30F00,11,0,0,0,0,0,0 ), // #62 [ref=1x]
+ O(660F00,11,0,0,0,0,0,0 ), // #63 [ref=1x]
+ O(000F00,11,0,0,0,0,0,0 ), // #64 [ref=1x]
+ O(000000,E6,0,0,0,0,0,0 ), // #65 [ref=1x]
+ O(000F3A,15,0,0,0,0,0,0 ), // #66 [ref=1x]
+ O(000000,58,0,0,0,0,0,0 ), // #67 [ref=1x]
+ O(000F00,72,6,0,0,0,0,0 ), // #68 [ref=1x]
+ O(660F00,73,7,0,0,0,0,0 ), // #69 [ref=1x]
+ O(000F00,73,6,0,0,0,0,0 ), // #70 [ref=1x]
+ O(000F00,71,6,0,0,0,0,0 ), // #71 [ref=1x]
+ O(000F00,72,4,0,0,0,0,0 ), // #72 [ref=1x]
+ O(000F00,71,4,0,0,0,0,0 ), // #73 [ref=1x]
+ O(000F00,72,2,0,0,0,0,0 ), // #74 [ref=1x]
+ O(660F00,73,3,0,0,0,0,0 ), // #75 [ref=1x]
+ O(000F00,73,2,0,0,0,0,0 ), // #76 [ref=1x]
+ O(000F00,71,2,0,0,0,0,0 ), // #77 [ref=1x]
+ O(000000,50,0,0,0,0,0,0 ), // #78 [ref=2x]
+ O(000000,F6,0,0,0,0,0,0 ), // #79 [ref=1x]
+ E(660F38,92,0,0,0,1,3,None), // #80 [ref=1x]
+ E(660F38,92,0,0,0,0,2,None), // #81 [ref=1x]
+ E(660F38,93,0,0,0,1,3,None), // #82 [ref=1x]
+ E(660F38,93,0,0,0,0,2,None), // #83 [ref=1x]
+ V(660F38,2F,0,0,0,0,0,None), // #84 [ref=1x]
+ V(660F38,2E,0,0,0,0,0,None), // #85 [ref=1x]
+ V(660F00,29,0,0,0,1,4,ByLL), // #86 [ref=1x]
+ V(000F00,29,0,0,0,0,4,ByLL), // #87 [ref=1x]
+ V(660F00,7E,0,0,0,0,2,None), // #88 [ref=1x]
+ V(660F00,7F,0,0,0,0,0,None), // #89 [ref=1x]
+ E(660F00,7F,0,0,0,0,4,ByLL), // #90 [ref=1x]
+ E(660F00,7F,0,0,0,1,4,ByLL), // #91 [ref=1x]
+ V(F30F00,7F,0,0,0,0,0,None), // #92 [ref=1x]
+ E(F20F00,7F,0,0,0,1,4,ByLL), // #93 [ref=1x]
+ E(F30F00,7F,0,0,0,0,4,ByLL), // #94 [ref=1x]
+ E(F30F00,7F,0,0,0,1,4,ByLL), // #95 [ref=1x]
+ E(F20F00,7F,0,0,0,0,4,ByLL), // #96 [ref=1x]
+ V(660F00,17,0,0,0,1,3,None), // #97 [ref=1x]
+ V(000F00,17,0,0,0,0,3,None), // #98 [ref=1x]
+ V(660F00,13,0,0,0,1,3,None), // #99 [ref=1x]
+ V(000F00,13,0,0,0,0,3,None), // #100 [ref=1x]
+ V(660F00,7E,0,0,0,1,3,None), // #101 [ref=1x]
+ V(F20F00,11,0,0,0,1,3,None), // #102 [ref=1x]
+ E(F3MAP5,11,0,0,0,0,1,None), // #103 [ref=1x]
+ V(F30F00,11,0,0,0,0,2,None), // #104 [ref=1x]
+ V(660F00,11,0,0,0,1,4,ByLL), // #105 [ref=1x]
+ V(000F00,11,0,0,0,0,4,ByLL), // #106 [ref=1x]
+ E(66MAP5,7E,0,0,0,0,1,None), // #107 [ref=1x]
+ E(660F38,7A,0,0,0,0,0,None), // #108 [ref=1x]
+ E(660F38,7C,0,0,0,0,0,None), // #109 [ref=1x]
+ E(660F38,7C,0,0,0,1,0,None), // #110 [ref=1x]
+ E(660F38,7B,0,0,0,0,0,None), // #111 [ref=1x]
+ V(660F3A,05,0,0,0,1,4,ByLL), // #112 [ref=1x]
+ V(660F3A,04,0,0,0,0,4,ByLL), // #113 [ref=1x]
+ V(660F3A,01,0,0,1,1,4,ByLL), // #114 [ref=1x]
+ V(660F3A,00,0,0,1,1,4,ByLL), // #115 [ref=1x]
+ E(660F38,90,0,0,0,0,2,None), // #116 [ref=1x]
+ E(660F38,90,0,0,0,1,3,None), // #117 [ref=1x]
+ E(660F38,91,0,0,0,0,2,None), // #118 [ref=1x]
+ E(660F38,91,0,0,0,1,3,None), // #119 [ref=1x]
+ V(660F38,8E,0,0,0,0,0,None), // #120 [ref=1x]
+ V(660F38,8E,0,0,1,0,0,None), // #121 [ref=1x]
+ V(XOP_M8,C0,0,0,0,0,0,None), // #122 [ref=1x]
+ V(XOP_M8,C2,0,0,0,0,0,None), // #123 [ref=1x]
+ V(XOP_M8,C3,0,0,0,0,0,None), // #124 [ref=1x]
+ V(XOP_M8,C1,0,0,0,0,0,None), // #125 [ref=1x]
+ V(660F00,72,6,0,0,0,4,ByLL), // #126 [ref=1x]
+ V(660F00,73,6,0,0,1,4,ByLL), // #127 [ref=1x]
+ V(660F00,71,6,0,0,0,4,ByLL), // #128 [ref=1x]
+ V(660F00,72,4,0,0,0,4,ByLL), // #129 [ref=1x]
+ E(660F00,72,4,0,0,1,4,ByLL), // #130 [ref=1x]
+ V(660F00,71,4,0,0,0,4,ByLL), // #131 [ref=1x]
+ V(660F00,72,2,0,0,0,4,ByLL), // #132 [ref=1x]
+ V(660F00,73,2,0,0,1,4,ByLL), // #133 [ref=1x]
+ V(660F00,71,2,0,0,0,4,ByLL) // #134 [ref=1x]
+};
+// ----------------------------------------------------------------------------
+// ${AltOpcodeTable:End}
+
+#undef O
+#undef V
+#undef E
+#undef O_FPU
+
+// x86::InstDB - CommonInfoTable
+// =============================
+
+// ${InstCommonTable:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+#define F(VAL) uint32_t(InstDB::InstFlags::k##VAL)
+#define X(VAL) uint32_t(InstDB::Avx512Flags::k##VAL)
+#define CONTROL_FLOW(VAL) uint8_t(InstControlFlow::k##VAL)
+#define SAME_REG_HINT(VAL) uint8_t(InstSameRegHint::k##VAL)
+const InstDB::CommonInfo InstDB::_inst_common_info_table[] = {
+ { 0 , 0 , 0 , 0 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #0 [ref=1x]
+ { 0 , 0 , 487, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #1 [ref=4x]
+ { 0 , 0 , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #2 [ref=2x]
+ { 0 , 0 , 143, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #3 [ref=6x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #4 [ref=2x]
+ { 0 , 0 , 77 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #5 [ref=2x]
+ { F(Vec) , 0 , 99 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #6 [ref=54x]
+ { F(Vec) , 0 , 172, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #7 [ref=19x]
+ { F(Vec) , 0 , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #8 [ref=16x]
+ { F(Vec) , 0 , 322, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #9 [ref=20x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 33 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #10 [ref=1x]
+ { F(Vex) , 0 , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #11 [ref=3x]
+ { F(Vec) , 0 , 99 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #12 [ref=12x]
+ { 0 , 0 , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #13 [ref=1x]
+ { F(Vex) , 0 , 357, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #14 [ref=5x]
+ { F(Vex) , 0 , 77 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #15 [ref=12x]
+ { F(Vec) , 0 , 490, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #16 [ref=4x]
+ { 0 , 0 , 359, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #17 [ref=3x]
+ { F(Mib) , 0 , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #18 [ref=1x]
+ { 0 , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #19 [ref=1x]
+ { 0 , 0 , 361, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #20 [ref=1x]
+ { F(Mib) , 0 , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #21 [ref=1x]
+ { 0 , 0 , 363, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #22 [ref=1x]
+ { 0 , 0 , 76 , 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #23 [ref=21x]
+ { 0 , 0 , 365, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #24 [ref=3x]
+ { 0 , 0 , 163, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #25 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 163, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #26 [ref=3x]
+ { F(Rep)|F(RepIgnored) , 0 , 268, 3 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #27 [ref=1x]
+ { 0 , 0 , 494, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #28 [ref=1x]
+ { 0 , 0 , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #29 [ref=2x]
+ { 0 , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #30 [ref=1x]
+ { 0 , 0 , 145, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #31 [ref=88x]
+ { 0 , 0 , 496, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #32 [ref=24x]
+ { 0 , 0 , 497, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #33 [ref=6x]
+ { 0 , 0 , 498, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #34 [ref=14x]
+ { 0 , 0 , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #35 [ref=1x]
+ { 0 , 0 , 46 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #36 [ref=1x]
+ { F(Vex) , 0 , 367, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #37 [ref=16x]
+ { F(Rep) , 0 , 208, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #38 [ref=1x]
+ { F(Vec) , 0 , 500, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #39 [ref=2x]
+ { F(Vec) , 0 , 501, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #40 [ref=3x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 212, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #41 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #42 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 503, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #43 [ref=1x]
+ { 0 , 0 , 504, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #44 [ref=1x]
+ { 0 , 0 , 505, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #45 [ref=1x]
+ { 0 , 0 , 369, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #46 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 506, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #47 [ref=2x]
+ { F(Mmx)|F(Vec) , 0 , 507, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #48 [ref=2x]
+ { F(Mmx)|F(Vec) , 0 , 508, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #49 [ref=2x]
+ { F(Vec) , 0 , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #50 [ref=2x]
+ { F(Vec) , 0 , 373, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #51 [ref=2x]
+ { F(Vec) , 0 , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #52 [ref=2x]
+ { 0 , 0 , 509, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #53 [ref=1x]
+ { 0 , 0 , 510, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #54 [ref=2x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #55 [ref=1x]
+ { 0 , 0 , 72 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #56 [ref=3x]
+ { F(Mmx) , 0 , 145, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #57 [ref=1x]
+ { 0 , 0 , 377, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #58 [ref=2x]
+ { 0 , 0 , 511, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #59 [ref=1x]
+ { F(Vec) , 0 , 512, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #60 [ref=2x]
+ { F(Vec) , 0 , 379, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #61 [ref=1x]
+ { F(FpuM32)|F(FpuM64) , 0 , 274, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #62 [ref=6x]
+ { 0 , 0 , 381, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #63 [ref=9x]
+ { F(FpuM80) , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #64 [ref=2x]
+ { 0 , 0 , 382, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #65 [ref=13x]
+ { F(FpuM32)|F(FpuM64) , 0 , 383, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #66 [ref=2x]
+ { F(FpuM16)|F(FpuM32) , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #67 [ref=9x]
+ { F(FpuM16)|F(FpuM32)|F(FpuM64) , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #68 [ref=3x]
+ { F(FpuM32)|F(FpuM64)|F(FpuM80) , 0 , 516, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #69 [ref=2x]
+ { F(FpuM16) , 0 , 517, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #70 [ref=3x]
+ { F(FpuM16) , 0 , 518, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #71 [ref=2x]
+ { F(FpuM32)|F(FpuM64) , 0 , 384, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #72 [ref=1x]
+ { 0 , 0 , 519, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #73 [ref=4x]
+ { 0 , 0 , 520, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #74 [ref=1x]
+ { 0 , 0 , 521, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #75 [ref=1x]
+ { 0 , 0 , 72 , 10, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #76 [ref=1x]
+ { 0 , 0 , 522, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #77 [ref=1x]
+ { F(Lock) , 0 , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #78 [ref=1x]
+ { 0 , 0 , 407, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #79 [ref=2x]
+ { 0 , 0 , 366, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #80 [ref=3x]
+ { F(Rep) , 0 , 523, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #81 [ref=1x]
+ { F(Vec) , 0 , 385, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #82 [ref=1x]
+ { 0 , 0 , 524, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #83 [ref=2x]
+ { 0 , 0 , 525, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #84 [ref=8x]
+ { 0 , 0 , 387, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #85 [ref=3x]
+ { 0 , 0 , 389, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #86 [ref=1x]
+ { 0 , 0 , 391, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #87 [ref=1x]
+ { 0 , 0 , 145, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #88 [ref=2x]
+ { 0 , 0 , 498, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #89 [ref=1x]
+ { F(Rep) , 0 , 393, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #90 [ref=16x]
+ { F(Rep) , 0 , 395, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #91 [ref=1x]
+ { F(Rep) , 0 , 277, 3 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #92 [ref=1x]
+ { F(Vex) , 0 , 526, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #93 [ref=19x]
+ { F(Vex) , 0 , 397, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #94 [ref=1x]
+ { F(Vex) , 0 , 399, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #95 [ref=1x]
+ { F(Vex) , 0 , 216, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #96 [ref=1x]
+ { F(Vex) , 0 , 401, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #97 [ref=1x]
+ { F(Vex) , 0 , 527, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #98 [ref=12x]
+ { F(Vex) , 0 , 528, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #99 [ref=8x]
+ { F(Vex) , 0 , 526, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #100 [ref=8x]
+ { 0 , 0 , 529, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #101 [ref=2x]
+ { 0 , 0 , 286, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #102 [ref=1x]
+ { 0 , 0 , 280, 3 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #103 [ref=1x]
+ { F(Vec) , 0 , 198, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #104 [ref=2x]
+ { 0 , 0 , 530, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #105 [ref=2x]
+ { 0 , 0 , 403, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #106 [ref=2x]
+ { F(Vex) , 0 , 531, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #107 [ref=2x]
+ { 0 , 0 , 405, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #108 [ref=1x]
+ { 0 , 0 , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #109 [ref=3x]
+ { 0 , 0 , 280, 3 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #110 [ref=1x]
+ { 0 , 0 , 532, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #111 [ref=5x]
+ { F(Vex) , 0 , 407, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #112 [ref=2x]
+ { F(Rep) , 0 , 220, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #113 [ref=1x]
+ { 0 , 0 , 395, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #114 [ref=3x]
+ { 0 , 0 , 286, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #115 [ref=1x]
+ { F(Vex) , 0 , 409, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #116 [ref=2x]
+ { F(Vec) , 0 , 533, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #117 [ref=1x]
+ { F(Mmx) , 0 , 534, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #118 [ref=1x]
+ { 0 , 0 , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #119 [ref=2x]
+ { F(XRelease) , 0 , 0 , 20, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #120 [ref=1x]
+ { 0 , 0 , 82 , 9 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #121 [ref=1x]
+ { F(Vec) , 0 , 411, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #122 [ref=6x]
+ { 0 , 0 , 139, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #123 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 413, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #124 [ref=1x]
+ { 0 , 0 , 415, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #125 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #126 [ref=1x]
+ { F(Vec) , 0 , 380, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #127 [ref=2x]
+ { F(Vec) , 0 , 107, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #128 [ref=4x]
+ { F(Vec) , 0 , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #129 [ref=2x]
+ { F(Vec) , 0 , 101, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #130 [ref=3x]
+ { F(Mmx) , 0 , 538, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #131 [ref=1x]
+ { F(Vec) , 0 , 107, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #132 [ref=1x]
+ { F(Vec) , 0 , 115, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #133 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 168, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #134 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 539, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #135 [ref=1x]
+ { F(Rep) , 0 , 224, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #136 [ref=1x]
+ { F(Vec) , 0 , 417, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #137 [ref=1x]
+ { F(Vec) , 0 , 419, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #138 [ref=1x]
+ { 0 , 0 , 289, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #139 [ref=2x]
+ { 0 , 0 , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #140 [ref=1x]
+ { F(Vex) , 0 , 423, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #141 [ref=1x]
+ { 0 , 0 , 540, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #142 [ref=1x]
+ { 0 , 0 , 541, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #143 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 272, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #144 [ref=2x]
+ { 0 , 0 , 145, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #145 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 59 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #146 [ref=1x]
+ { 0 , 0 , 542, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #147 [ref=1x]
+ { F(Rep) , 0 , 543, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #148 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #149 [ref=37x]
+ { F(Mmx)|F(Vec) , 0 , 427, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #150 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #151 [ref=6x]
+ { F(Mmx)|F(Vec) , 0 , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #152 [ref=16x]
+ { F(Mmx) , 0 , 168, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #153 [ref=26x]
+ { F(Vec) , 0 , 99 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #154 [ref=4x]
+ { F(Vec) , 0 , 544, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #155 [ref=1x]
+ { F(Vec) , 0 , 545, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #156 [ref=1x]
+ { F(Vec) , 0 , 546, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #157 [ref=1x]
+ { F(Vec) , 0 , 547, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #158 [ref=1x]
+ { F(Vec) , 0 , 548, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #159 [ref=1x]
+ { F(Vec) , 0 , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #160 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 429, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #161 [ref=1x]
+ { F(Vec) , 0 , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #162 [ref=1x]
+ { F(Vec) , 0 , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #163 [ref=1x]
+ { F(Vec) , 0 , 552, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #164 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 553, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #165 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 554, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #166 [ref=1x]
+ { F(Vec) , 0 , 343, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #167 [ref=2x]
+ { 0 , 0 , 173, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #168 [ref=1x]
+ { F(Mmx) , 0 , 427, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #169 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 431, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #170 [ref=8x]
+ { F(Vec) , 0 , 555, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #171 [ref=2x]
+ { 0 , 0 , 433, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #172 [ref=1x]
+ { F(Mmx)|F(Vec) , 0 , 435, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #173 [ref=3x]
+ { 0 , 0 , 178, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #174 [ref=1x]
+ { 0 , 0 , 556, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #175 [ref=1x]
+ { 0 , 0 , 437, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #176 [ref=7x]
+ { 0 , 0 , 557, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #177 [ref=4x]
+ { F(Vex) , 0 , 439, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #178 [ref=1x]
+ { 0 , 0 , 441, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #179 [ref=1x]
+ { 0 , 0 , 439, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #180 [ref=7x]
+ { F(Rep)|F(RepIgnored) , 0 , 443, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #181 [ref=1x]
+ { 0 , 0 , 443, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #182 [ref=1x]
+ { F(Vex) , 0 , 445, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #183 [ref=1x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #184 [ref=3x]
+ { F(Rep) , 0 , 228, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #185 [ref=1x]
+ { 0 , 0 , 558, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #186 [ref=16x]
+ { 0 , 0 , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #187 [ref=2x]
+ { 0 , 0 , 447, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #188 [ref=3x]
+ { F(Rep) , 0 , 232, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #189 [ref=1x]
+ { F(Vex) , 0 , 559, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #190 [ref=8x]
+ { 0 , 0 , 91 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #191 [ref=1x]
+ { F(Tsib)|F(Vex) , 0 , 560, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #192 [ref=2x]
+ { F(Vex) , 0 , 498, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #193 [ref=1x]
+ { F(Tsib)|F(Vex) , 0 , 561, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #194 [ref=1x]
+ { F(Vex) , 0 , 562, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #195 [ref=1x]
+ { 0 , 0 , 563, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #196 [ref=2x]
+ { 0 , 0 , 77 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #197 [ref=2x]
+ { 0 , 0 , 449, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #198 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #199 [ref=22x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #200 [ref=23x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #201 [ref=22x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #202 [ref=18x]
+ { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 565, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #203 [ref=18x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #204 [ref=17x]
+ { F(Vec)|F(Vex) , 0 , 295, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #205 [ref=29x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #206 [ref=5x]
+ { F(Vec)|F(Vex) , 0 , 99 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #207 [ref=17x]
+ { F(Vec)|F(Vex) , 0 , 322, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #208 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #209 [ref=4x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #210 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #211 [ref=10x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #212 [ref=12x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #213 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #214 [ref=6x]
+ { F(Vec)|F(Vex) , 0 , 567, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #215 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #216 [ref=17x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #217 [ref=12x]
+ { F(Vec)|F(Vex) , 0 , 298, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #218 [ref=6x]
+ { F(Vec)|F(Vex) , 0 , 451, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #219 [ref=3x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 568, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #220 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 569, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #221 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 570, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #222 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 571, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #223 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #224 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 569, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #225 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 572, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #226 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(ImplicitZ)|X(K)|X(SAE), 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #227 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(ImplicitZ)|X(K)|X(SAE), 304, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #228 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(ImplicitZ)|X(K)|X(SAE), 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #229 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(ImplicitZ)|X(K)|X(SAE) , 573, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #230 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K)|X(SAE) , 574, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #231 [ref=1x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(ImplicitZ)|X(K)|X(SAE) , 575, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #232 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 172, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #233 [ref=2x]
+ { F(Evex)|F(Vec) , X(SAE) , 343, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #234 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #235 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 307, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #236 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #237 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #238 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #239 [ref=3x]
+ { F(Vec)|F(Vex) , 0 , 198, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #240 [ref=5x]
+ { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #241 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #242 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 576, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #243 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #244 [ref=4x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #245 [ref=3x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #246 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 313, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #247 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #248 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #249 [ref=3x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 313, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #250 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #251 [ref=5x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #252 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 316, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #253 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #254 [ref=3x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #255 [ref=2x]
+ { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #256 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #257 [ref=1x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #258 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 565, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #259 [ref=5x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 455, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #260 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 457, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #261 [ref=2x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 459, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #262 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #263 [ref=3x]
+ { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #264 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #265 [ref=1x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #266 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #267 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #268 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #269 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #270 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #271 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #272 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #273 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #274 [ref=1x]
+ { F(Evex)|F(Vec) , X(SAE) , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #275 [ref=1x]
+ { F(Evex)|F(Vec) , X(SAE) , 455, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #276 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #277 [ref=1x]
+ { F(Evex)|F(Vec) , X(SAE) , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #278 [ref=1x]
+ { F(Evex)|F(Vec) , X(ER)|X(SAE) , 457, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #279 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #280 [ref=3x]
+ { F(Vec)|F(Vex) , 0 , 298, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #281 [ref=10x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #282 [ref=8x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 317, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #283 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 577, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #284 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 318, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #285 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 512, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #286 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #287 [ref=5x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #288 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #289 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 578, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #290 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 579, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #291 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 236, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #292 [ref=12x]
+ { F(Vec)|F(Vex) , 0 , 461, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #293 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 463, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #294 [ref=4x]
+ { F(Evex)|F(Vec) , X(B64)|X(ImplicitZ)|X(K) , 580, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #295 [ref=1x]
+ { F(Evex)|F(Vec) , X(B16)|X(ImplicitZ)|X(K) , 580, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #296 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(ImplicitZ)|X(K) , 580, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #297 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 581, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #298 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 582, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #299 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 583, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #300 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 99 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #301 [ref=7x]
+ { F(Vec)|F(Vex) , 0 , 172, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #302 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #303 [ref=1x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 240, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #304 [ref=2x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 183, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #305 [ref=2x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 188, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #306 [ref=2x]
+ { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 319, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #307 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #308 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #309 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #310 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #311 [ref=3x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #312 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 584, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #313 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #314 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #315 [ref=22x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 465, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #316 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 465, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #317 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 585, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #318 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 579, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #319 [ref=1x]
+ { F(Vex) , 0 , 530, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #320 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 533, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #321 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 244, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #322 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #323 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #324 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #325 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #326 [ref=2x]
+ { 0 , 0 , 467, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #327 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 99 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #328 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 469, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #329 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 325, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #330 [ref=1x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 99 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #331 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 151, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #332 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 109, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #333 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 248, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #334 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 586, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #335 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 193, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #336 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 198, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #337 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 203, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #338 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 107, 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #339 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 252, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #340 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #341 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 115, 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #342 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 471, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #343 [ref=1x]
+ { 0 , 0 , 473, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #344 [ref=1x]
+ { 0 , 0 , 475, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #345 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32) , 328, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #346 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64) , 328, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #347 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #348 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #349 [ref=5x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 295, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #350 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #351 [ref=2x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 295, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #352 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #353 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #354 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #355 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #356 [ref=13x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 587, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #357 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 588, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #358 [ref=1x]
+ { F(Evex)|F(Vec) , 0 , 589, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #359 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 477, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #360 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 590, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #361 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #362 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 256, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #363 [ref=1x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 304, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #364 [ref=4x]
+ { F(Evex)|F(Vec) , X(B32)|X(ImplicitZ)|X(K) , 304, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #365 [ref=2x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(ImplicitZ)|X(K) , 331, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #366 [ref=4x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(ImplicitZ)|X(K) , 331, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #367 [ref=2x]
+ { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(ImplicitZ)|X(K) , 331, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #368 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 544, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #369 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 545, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #370 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 546, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #371 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 547, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #372 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(ImplicitZ)|X(K) , 304, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #373 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #374 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #375 [ref=4x]
+ { F(Vec)|F(Vex) , 0 , 299, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #376 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 296, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #377 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 260, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #378 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 123, 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #379 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 123, 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #380 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 264, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #381 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 548, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #382 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #383 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 591, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #384 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 592, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #385 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 593, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #386 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 594, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #387 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 595, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #388 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 451, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #389 [ref=12x]
+ { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #390 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #391 [ref=8x]
+ { F(Evex)|F(Vec) , 0 , 596, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #392 [ref=4x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 334, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #393 [ref=6x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 337, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #394 [ref=9x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 340, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #395 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 313, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #396 [ref=4x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 343, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #397 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #398 [ref=6x]
+ { F(Vec)|F(Vex) , 0 , 256, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #399 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #400 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #401 [ref=3x]
+ { F(Vec)|F(Vex) , 0 , 479, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #402 [ref=4x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 346, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #403 [ref=2x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 481, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #404 [ref=2x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 483, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #405 [ref=2x]
+ { F(Evex)|F(Vec)|F(Vsib) , X(K) , 349, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #406 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 485, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #407 [ref=8x]
+ { F(Evex)|F(Vec) , X(ImplicitZ)|X(K) , 352, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #408 [ref=5x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #409 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #410 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 157, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #411 [ref=3x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #412 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 157, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #413 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 157, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #414 [ref=3x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 157, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #415 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #416 [ref=6x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #417 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #418 [ref=2x]
+ { F(Evex)|F(Vec) , X(B32)|X(ImplicitZ)|X(K) , 352, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #419 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(ImplicitZ)|X(K) , 352, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #420 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #421 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #422 [ref=2x]
+ { F(Evex)|F(Vec) , X(B16)|X(K)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #423 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 565, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #424 [ref=2x]
+ { F(Vec)|F(Vex) , 0 , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #425 [ref=2x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 578, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #426 [ref=1x]
+ { F(Evex)|F(Vec) , X(K)|X(Z) , 579, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #427 [ref=1x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 322, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #428 [ref=2x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 578, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #429 [ref=1x]
+ { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 579, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #430 [ref=1x]
+ { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #431 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 597, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #432 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 598, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #433 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 599, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #434 [ref=1x]
+ { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 299, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #435 [ref=2x]
+ { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 299, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #436 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #437 [ref=1x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #438 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 295, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #439 [ref=2x]
+ { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 151, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #440 [ref=1x]
+ { F(Vec)|F(Vex) , 0 , 145, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #441 [ref=2x]
+ { 0 , 0 , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #442 [ref=2x]
+ { 0 , 0 , 42 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #443 [ref=2x]
+ { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #444 [ref=1x]
+ { 0 , 0 , 269, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #445 [ref=1x]
+ { F(XAcquire) , 0 , 131, 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #446 [ref=1x]
+ { 0 , 0 , 600, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #447 [ref=6x]
+ { 0 , 0 , 601, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)} // #448 [ref=6x]
+};
+#undef SAME_REG_HINT
+#undef CONTROL_FLOW
+#undef X
+#undef F
+// ----------------------------------------------------------------------------
+// ${InstCommonTable:End}
+
+// x86::InstDB - AdditionalInfoTable
+// =================================
+
+// ${AdditionalInfoTable:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)
+const InstDB::AdditionalInfo InstDB::additional_info_table[] = {
+ { 0, 0, { 0 } }, // #0 [ref=68x]
+ { 0, 1, { 0 } }, // #1 [ref=31x]
+ { 0, 0, { EXT(RAO_INT) } }, // #2 [ref=4x]
+ { 0, 2, { 0 } }, // #3 [ref=2x]
+ { 0, 3, { EXT(ADX) } }, // #4 [ref=1x]
+ { 0, 0, { EXT(SSE2) } }, // #5 [ref=60x]
+ { 0, 0, { EXT(SSE) } }, // #6 [ref=46x]
+ { 0, 0, { EXT(SSE3) } }, // #7 [ref=10x]
+ { 0, 4, { EXT(ADX) } }, // #8 [ref=1x]
+ { 0, 0, { EXT(AESNI) } }, // #9 [ref=6x]
+ { 0, 1, { EXT(BMI) } }, // #10 [ref=6x]
+ { 0, 5, { 0 } }, // #11 [ref=5x]
+ { 0, 0, { EXT(TBM) } }, // #12 [ref=9x]
+ { 0, 0, { EXT(SSE4_1) } }, // #13 [ref=47x]
+ { 0, 0, { EXT(MPX) } }, // #14 [ref=7x]
+ { 0, 6, { 0 } }, // #15 [ref=4x]
+ { 0, 1, { EXT(BMI2) } }, // #16 [ref=1x]
+ { 0, 7, { EXT(SMAP) } }, // #17 [ref=2x]
+ { 0, 8, { 0 } }, // #18 [ref=2x]
+ { 0, 9, { 0 } }, // #19 [ref=2x]
+ { 0, 0, { EXT(CLDEMOTE) } }, // #20 [ref=1x]
+ { 0, 0, { EXT(CLFLUSH) } }, // #21 [ref=1x]
+ { 0, 0, { EXT(CLFLUSHOPT) } }, // #22 [ref=1x]
+ { 0, 0, { EXT(SVM) } }, // #23 [ref=6x]
+ { 0, 10, { 0 } }, // #24 [ref=2x]
+ { 0, 1, { EXT(CET_SS) } }, // #25 [ref=3x]
+ { 0, 0, { EXT(UINTR) } }, // #26 [ref=4x]
+ { 0, 0, { EXT(CLWB) } }, // #27 [ref=1x]
+ { 0, 0, { EXT(CLZERO) } }, // #28 [ref=1x]
+ { 0, 3, { 0 } }, // #29 [ref=1x]
+ { 0, 11, { EXT(CMOV) } }, // #30 [ref=2x]
+ { 0, 12, { EXT(CMOV) } }, // #31 [ref=2x]
+ { 0, 13, { EXT(CMOV) } }, // #32 [ref=2x]
+ { 0, 14, { EXT(CMOV) } }, // #33 [ref=2x]
+ { 0, 15, { EXT(CMOV) } }, // #34 [ref=2x]
+ { 0, 16, { EXT(CMOV) } }, // #35 [ref=2x]
+ { 0, 17, { EXT(CMOV) } }, // #36 [ref=2x]
+ { 0, 18, { EXT(CMOV) } }, // #37 [ref=2x]
+ { 0, 1, { EXT(CMPCCXADD) } }, // #38 [ref=16x]
+ { 0, 19, { 0 } }, // #39 [ref=2x]
+ { 0, 1, { EXT(I486) } }, // #40 [ref=2x]
+ { 0, 5, { EXT(CMPXCHG16B) } }, // #41 [ref=1x]
+ { 0, 5, { EXT(CMPXCHG8B) } }, // #42 [ref=1x]
+ { 0, 1, { EXT(SSE2) } }, // #43 [ref=2x]
+ { 0, 1, { EXT(SSE) } }, // #44 [ref=2x]
+ { 0, 0, { EXT(I486) } }, // #45 [ref=5x]
+ { 0, 0, { EXT(SSE4_2) } }, // #46 [ref=2x]
+ { 0, 20, { 0 } }, // #47 [ref=2x]
+ { 0, 0, { EXT(MMX) } }, // #48 [ref=1x]
+ { 0, 0, { EXT(CET_IBT) } }, // #49 [ref=2x]
+ { 0, 1, { EXT(ENQCMD) } }, // #50 [ref=2x]
+ { 0, 0, { EXT(SSE4A) } }, // #51 [ref=4x]
+ { 0, 21, { EXT(FPU) } }, // #52 [ref=80x]
+ { 0, 22, { EXT(CMOV), EXT(FPU) } }, // #53 [ref=2x]
+ { 0, 23, { EXT(CMOV), EXT(FPU) } }, // #54 [ref=2x]
+ { 0, 24, { EXT(CMOV), EXT(FPU) } }, // #55 [ref=2x]
+ { 0, 25, { EXT(CMOV), EXT(FPU) } }, // #56 [ref=2x]
+ { 0, 26, { EXT(FPU) } }, // #57 [ref=4x]
+ { 0, 0, { EXT(3DNOW) } }, // #58 [ref=21x]
+ { 0, 21, { EXT(SSE3), EXT(FPU) } }, // #59 [ref=1x]
+ { 0, 21, { EXT(FXSR) } }, // #60 [ref=2x]
+ { 0, 27, { EXT(FXSR) } }, // #61 [ref=2x]
+ { 0, 0, { EXT(SMX) } }, // #62 [ref=1x]
+ { 0, 0, { EXT(GFNI) } }, // #63 [ref=3x]
+ { 0, 0, { EXT(HRESET) } }, // #64 [ref=1x]
+ { 0, 0, { EXT(CET_SS) } }, // #65 [ref=9x]
+ { 0, 15, { 0 } }, // #66 [ref=5x]
+ { 0, 0, { EXT(VMX) } }, // #67 [ref=13x]
+ { 0, 0, { EXT(INVLPGB) } }, // #68 [ref=2x]
+ { 0, 11, { 0 } }, // #69 [ref=4x]
+ { 0, 12, { 0 } }, // #70 [ref=4x]
+ { 0, 13, { 0 } }, // #71 [ref=4x]
+ { 0, 14, { 0 } }, // #72 [ref=4x]
+ { 0, 16, { 0 } }, // #73 [ref=4x]
+ { 0, 17, { 0 } }, // #74 [ref=4x]
+ { 0, 18, { 0 } }, // #75 [ref=6x]
+ { 0, 0, { EXT(AVX512_DQ) } }, // #76 [ref=10x]
+ { 0, 0, { EXT(AVX512_BW) } }, // #77 [ref=20x]
+ { 0, 0, { EXT(AVX512_F) } }, // #78 [ref=9x]
+ { 1, 0, { EXT(AVX512_DQ) } }, // #79 [ref=1x]
+ { 1, 0, { EXT(AVX512_BW) } }, // #80 [ref=2x]
+ { 1, 0, { EXT(AVX512_F) } }, // #81 [ref=1x]
+ { 0, 1, { EXT(AVX512_DQ) } }, // #82 [ref=3x]
+ { 0, 1, { EXT(AVX512_BW) } }, // #83 [ref=4x]
+ { 0, 1, { EXT(AVX512_F) } }, // #84 [ref=1x]
+ { 0, 28, { EXT(LAHFSAHF) } }, // #85 [ref=1x]
+ { 0, 0, { EXT(AMX_TILE) } }, // #86 [ref=7x]
+ { 0, 0, { EXT(LWP) } }, // #87 [ref=4x]
+ { 0, 29, { 0 } }, // #88 [ref=3x]
+ { 0, 1, { EXT(LZCNT) } }, // #89 [ref=1x]
+ { 0, 0, { EXT(MMX2) } }, // #90 [ref=3x]
+ { 0, 1, { EXT(MCOMMIT) } }, // #91 [ref=1x]
+ { 0, 0, { EXT(MONITOR) } }, // #92 [ref=2x]
+ { 0, 0, { EXT(MONITORX) } }, // #93 [ref=2x]
+ { 1, 0, { 0 } }, // #94 [ref=1x]
+ { 1, 0, { EXT(SSE2) } }, // #95 [ref=5x]
+ { 1, 0, { EXT(SSE) } }, // #96 [ref=3x]
+ { 0, 0, { EXT(MOVBE) } }, // #97 [ref=1x]
+ { 0, 0, { EXT(MMX), EXT(SSE2) } }, // #98 [ref=45x]
+ { 0, 0, { EXT(MOVDIR64B) } }, // #99 [ref=1x]
+ { 0, 0, { EXT(MOVDIRI) } }, // #100 [ref=1x]
+ { 1, 0, { EXT(MMX), EXT(SSE2) } }, // #101 [ref=1x]
+ { 0, 0, { EXT(BMI2) } }, // #102 [ref=7x]
+ { 0, 0, { EXT(SSSE3) } }, // #103 [ref=16x]
+ { 0, 0, { EXT(MMX2), EXT(SSE2) } }, // #104 [ref=10x]
+ { 0, 0, { EXT(PCLMULQDQ) } }, // #105 [ref=1x]
+ { 0, 1, { EXT(SSE4_2) } }, // #106 [ref=4x]
+ { 0, 0, { EXT(PCONFIG) } }, // #107 [ref=1x]
+ { 0, 0, { EXT(MMX2), EXT(SSE2), EXT(SSE4_1) } }, // #108 [ref=1x]
+ { 0, 0, { EXT(3DNOW2) } }, // #109 [ref=5x]
+ { 0, 0, { EXT(GEODE) } }, // #110 [ref=2x]
+ { 0, 1, { EXT(POPCNT) } }, // #111 [ref=1x]
+ { 0, 30, { 0 } }, // #112 [ref=3x]
+ { 0, 0, { EXT(PREFETCHI) } }, // #113 [ref=2x]
+ { 0, 1, { EXT(PREFETCHW) } }, // #114 [ref=1x]
+ { 0, 1, { EXT(PREFETCHWT1) } }, // #115 [ref=1x]
+ { 0, 20, { EXT(SEV_SNP) } }, // #116 [ref=3x]
+ { 0, 1, { EXT(SSE4_1) } }, // #117 [ref=1x]
+ { 0, 0, { EXT(PTWRITE) } }, // #118 [ref=1x]
+ { 0, 31, { 0 } }, // #119 [ref=3x]
+ { 0, 1, { EXT(SEV_SNP) } }, // #120 [ref=1x]
+ { 0, 32, { 0 } }, // #121 [ref=2x]
+ { 0, 0, { EXT(FSGSBASE) } }, // #122 [ref=4x]
+ { 0, 0, { EXT(MSR), EXT(MSR_IMM) } }, // #123 [ref=1x]
+ { 0, 0, { EXT(RDPID) } }, // #124 [ref=1x]
+ { 0, 0, { EXT(OSPKE) } }, // #125 [ref=1x]
+ { 0, 0, { EXT(RDPRU) } }, // #126 [ref=1x]
+ { 0, 1, { EXT(RDRAND) } }, // #127 [ref=1x]
+ { 0, 1, { EXT(RDSEED) } }, // #128 [ref=1x]
+ { 0, 0, { EXT(RDTSC) } }, // #129 [ref=1x]
+ { 0, 0, { EXT(RDTSCP) } }, // #130 [ref=1x]
+ { 0, 33, { 0 } }, // #131 [ref=2x]
+ { 0, 34, { EXT(LAHFSAHF) } }, // #132 [ref=1x]
+ { 0, 0, { EXT(SEAM) } }, // #133 [ref=4x]
+ { 0, 0, { EXT(SERIALIZE) } }, // #134 [ref=1x]
+ { 0, 0, { EXT(SHA) } }, // #135 [ref=7x]
+ { 0, 0, { EXT(SKINIT) } }, // #136 [ref=2x]
+ { 0, 0, { EXT(AMX_COMPLEX) } }, // #137 [ref=2x]
+ { 0, 0, { EXT(AMX_BF16) } }, // #138 [ref=1x]
+ { 0, 0, { EXT(AMX_INT8) } }, // #139 [ref=4x]
+ { 0, 0, { EXT(AMX_FP16) } }, // #140 [ref=1x]
+ { 0, 1, { EXT(UINTR) } }, // #141 [ref=1x]
+ { 0, 1, { EXT(WAITPKG) } }, // #142 [ref=2x]
+ { 0, 0, { EXT(WAITPKG) } }, // #143 [ref=1x]
+ { 0, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #144 [ref=71x]
+ { 0, 0, { EXT(AVX512_FP16), EXT(AVX512_VL) } }, // #145 [ref=104x]
+ { 0, 0, { EXT(AVX) } }, // #146 [ref=35x]
+ { 0, 0, { EXT(AESNI), EXT(VAES), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #147 [ref=4x]
+ { 0, 0, { EXT(AESNI), EXT(AVX) } }, // #148 [ref=2x]
+ { 0, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #149 [ref=135x]
+ { 0, 0, { EXT(AVX), EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #150 [ref=12x]
+ { 0, 0, { EXT(AVX_NE_CONVERT) } }, // #151 [ref=6x]
+ { 0, 0, { EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #152 [ref=42x]
+ { 0, 0, { EXT(AVX2) } }, // #153 [ref=7x]
+ { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #154 [ref=39x]
+ { 0, 1, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #155 [ref=4x]
+ { 0, 1, { EXT(AVX512_FP16), EXT(AVX512_VL) } }, // #156 [ref=2x]
+ { 0, 0, { EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #157 [ref=2x]
+ { 0, 0, { EXT(AVX_NE_CONVERT), EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #158 [ref=1x]
+ { 0, 0, { EXT(F16C), EXT(AVX512_F), EXT(AVX512_VL) } }, // #159 [ref=2x]
+ { 0, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #160 [ref=24x]
+ { 0, 0, { EXT(FMA), EXT(AVX512_F), EXT(AVX512_VL) } }, // #161 [ref=60x]
+ { 0, 0, { EXT(FMA4) } }, // #162 [ref=20x]
+ { 0, 0, { EXT(XOP) } }, // #163 [ref=55x]
+ { 0, 0, { EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #164 [ref=19x]
+ { 0, 0, { EXT(GFNI), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #165 [ref=3x]
+ { 0, 0, { EXT(SEV_ES) } }, // #166 [ref=1x]
+ { 1, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #167 [ref=7x]
+ { 1, 0, { EXT(AVX) } }, // #168 [ref=2x]
+ { 1, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #169 [ref=4x]
+ { 1, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #170 [ref=2x]
+ { 0, 0, { EXT(AVX), EXT(AVX2) } }, // #171 [ref=17x]
+ { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VP2INTERSECT) } }, // #172 [ref=2x]
+ { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #173 [ref=54x]
+ { 0, 0, { EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #174 [ref=2x]
+ { 0, 0, { EXT(AVX512_CD), EXT(AVX512_VL) } }, // #175 [ref=6x]
+ { 0, 0, { EXT(PCLMULQDQ), EXT(VPCLMULQDQ), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #176 [ref=1x]
+ { 0, 1, { EXT(AVX) } }, // #177 [ref=7x]
+ { 0, 0, { EXT(AVX512_VBMI2), EXT(AVX512_VL) } }, // #178 [ref=16x]
+ { 0, 0, { EXT(AVX_VNNI_INT8) } }, // #179 [ref=6x]
+ { 0, 0, { EXT(AVX_VNNI), EXT(AVX512_VL), EXT(AVX512_VNNI) } }, // #180 [ref=4x]
+ { 0, 0, { EXT(AVX_VNNI_INT16) } }, // #181 [ref=6x]
+ { 0, 0, { EXT(AVX512_VBMI), EXT(AVX512_VL) } }, // #182 [ref=4x]
+ { 0, 0, { EXT(AVX), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #183 [ref=4x]
+ { 0, 0, { EXT(AVX_IFMA), EXT(AVX512_IFMA), EXT(AVX512_VL) } }, // #184 [ref=2x]
+ { 0, 0, { EXT(AVX512_BITALG), EXT(AVX512_VL) } }, // #185 [ref=3x]
+ { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VPOPCNTDQ) } }, // #186 [ref=2x]
+ { 0, 0, { EXT(SHA512), EXT(AVX) } }, // #187 [ref=3x]
+ { 0, 0, { EXT(SM3), EXT(AVX) } }, // #188 [ref=3x]
+ { 0, 0, { EXT(SM4), EXT(AVX) } }, // #189 [ref=2x]
+ { 0, 0, { EXT(WBNOINVD) } }, // #190 [ref=1x]
+ { 0, 0, { EXT(MSR) } }, // #191 [ref=1x]
+ { 0, 0, { EXT(RTM) } }, // #192 [ref=3x]
+ { 0, 0, { EXT(XSAVE) } }, // #193 [ref=6x]
+ { 0, 0, { EXT(TSXLDTRK) } }, // #194 [ref=2x]
+ { 0, 0, { EXT(XSAVES) } }, // #195 [ref=4x]
+ { 0, 0, { EXT(XSAVEC) } }, // #196 [ref=2x]
+ { 0, 0, { EXT(XSAVEOPT) } }, // #197 [ref=2x]
+ { 0, 1, { EXT(RTM) } } // #198 [ref=1x]
+};
+#undef EXT
+
+#define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL)
+const InstDB::RWFlagsInfoTable InstDB::rw_flags_info_table[] = {
+ { 0, 0 }, // #0 [ref=1352x]
+ { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #1 [ref=103x]
+ { FLAG(CF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #2 [ref=2x]
+ { FLAG(CF), FLAG(CF) }, // #3 [ref=2x]
+ { FLAG(OF), FLAG(OF) }, // #4 [ref=1x]
+ { 0, FLAG(ZF) }, // #5 [ref=7x]
+ { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) }, // #6 [ref=4x]
+ { 0, FLAG(AC) }, // #7 [ref=2x]
+ { 0, FLAG(CF) }, // #8 [ref=2x]
+ { 0, FLAG(DF) }, // #9 [ref=2x]
+ { 0, FLAG(IF) }, // #10 [ref=2x]
+ { FLAG(CF), 0 }, // #11 [ref=6x]
+ { FLAG(CF) | FLAG(ZF), 0 }, // #12 [ref=6x]
+ { FLAG(OF) | FLAG(SF), 0 }, // #13 [ref=6x]
+ { FLAG(OF) | FLAG(SF) | FLAG(ZF), 0 }, // #14 [ref=6x]
+ { FLAG(OF), 0 }, // #15 [ref=7x]
+ { FLAG(PF), 0 }, // #16 [ref=6x]
+ { FLAG(SF), 0 }, // #17 [ref=6x]
+ { FLAG(ZF), 0 }, // #18 [ref=8x]
+ { FLAG(DF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #19 [ref=2x]
+ { 0, FLAG(AF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #20 [ref=5x]
+ { 0, FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #21 [ref=83x]
+ { FLAG(CF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #22 [ref=2x]
+ { FLAG(CF) | FLAG(ZF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #23 [ref=2x]
+ { FLAG(ZF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #24 [ref=2x]
+ { FLAG(PF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #25 [ref=2x]
+ { 0, FLAG(C1) | FLAG(CF) | FLAG(PF) | FLAG(ZF) }, // #26 [ref=4x]
+ { FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3), 0 }, // #27 [ref=2x]
+ { FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #28 [ref=1x]
+ { FLAG(DF), 0 }, // #29 [ref=3x]
+ { 0, FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #30 [ref=3x]
+ { FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #31 [ref=3x]
+ { FLAG(CF) | FLAG(OF), FLAG(CF) | FLAG(OF) }, // #32 [ref=2x]
+ { 0, FLAG(CF) | FLAG(OF) }, // #33 [ref=2x]
+ { 0, FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) } // #34 [ref=1x]
+};
+#undef FLAG
+
+#define FLAG(VAL) uint32_t(InstRWFlags::k##VAL)
+const InstRWFlags InstDB::inst_flags_table[] = {
+ InstRWFlags(FLAG(None)), // #0 [ref=1619x]
+ InstRWFlags(FLAG(MovOp)) // #1 [ref=29x]
+};
+#undef FLAG
+// ----------------------------------------------------------------------------
+// ${AdditionalInfoTable:End}
+
+// Inst - NameData
+// ===============
+
+#ifndef ASMJIT_NO_TEXT
+// ${NameData:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const InstNameIndex InstDB::_inst_name_index = {{
+ { Inst::kIdAaa , Inst::kIdAxor + 1 },
+ { Inst::kIdBextr , Inst::kIdBzhi + 1 },
+ { Inst::kIdCall , Inst::kIdCwde + 1 },
+ { Inst::kIdDaa , Inst::kIdDpps + 1 },
+ { Inst::kIdEmms , Inst::kIdExtrq + 1 },
+ { Inst::kIdF2xm1 , Inst::kIdFyl2xp1 + 1 },
+ { Inst::kIdGetsec , Inst::kIdGf2p8mulb + 1 },
+ { Inst::kIdHaddpd , Inst::kIdHsubps + 1 },
+ { Inst::kIdIdiv , Inst::kIdIretq + 1 },
+ { Inst::kIdJb , Inst::kIdJz + 1 },
+ { Inst::kIdKaddb , Inst::kIdKxorw + 1 },
+ { Inst::kIdLahf , Inst::kIdLzcnt + 1 },
+ { Inst::kIdMaskmovdqu , Inst::kIdMwaitx + 1 },
+ { Inst::kIdNeg , Inst::kIdNot + 1 },
+ { Inst::kIdOr , Inst::kIdOuts + 1 },
+ { Inst::kIdPabsb , Inst::kIdPxor + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 },
+ { Inst::kIdRcl , Inst::kIdRstorssp + 1 },
+ { Inst::kIdSahf , Inst::kIdSysretq + 1 },
+ { Inst::kIdT1mskc , Inst::kIdTzmsk + 1 },
+ { Inst::kIdUcomisd , Inst::kIdUnpcklps + 1 },
+ { Inst::kIdVaddpd , Inst::kIdVzeroupper + 1 },
+ { Inst::kIdWbinvd , Inst::kIdWrussq + 1 },
+ { Inst::kIdXabort , Inst::kIdXtest + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 },
+ { Inst::kIdNone , Inst::kIdNone + 1 }
+}, uint16_t(17)};
+
+const char InstDB::_inst_name_string_table[] =
+ "\x63\x6D\x6F\x76\x62\x0C\x63\x6D\x6F\x76\x2E\x62\x7C\x6E\x61\x65\x7C\x63\x63\x6D\x6F\x76\x62\x65\x0A\x63\x6D\x6F\x76"
+ "\x2E\x62\x65\x7C\x6E\x61\x63\x6D\x6F\x76\x6C\x0A\x63\x6D\x6F\x76\x2E\x6C\x7C\x6E\x67\x65\x63\x6D\x6F\x76\x6C\x65\x0A"
+ "\x63\x6D\x6F\x76\x2E\x6C\x65\x7C\x6E\x67\x63\x6D\x6F\x76\x6E\x62\x0D\x63\x6D\x6F\x76\x2E\x6E\x62\x7C\x61\x65\x7C\x6E"
+ "\x63\x63\x6D\x6F\x76\x6E\x62\x65\x0A\x63\x6D\x6F\x76\x2E\x6E\x62\x65\x7C\x61\x63\x6D\x6F\x76\x6E\x6C\x0A\x63\x6D\x6F"
+ "\x76\x2E\x6E\x6C\x7C\x67\x65\x63\x6D\x6F\x76\x6E\x6C\x65\x0A\x63\x6D\x6F\x76\x2E\x6E\x6C\x65\x7C\x67\x63\x6D\x6F\x76"
+ "\x6E\x70\x0A\x63\x6D\x6F\x76\x2E\x6E\x70\x7C\x70\x6F\x63\x6D\x6F\x76\x6E\x7A\x0A\x63\x6D\x6F\x76\x2E\x6E\x7A\x7C\x6E"
+ "\x65\x63\x6D\x6F\x76\x70\x09\x63\x6D\x6F\x76\x2E\x70\x7C\x70\x65\x63\x6D\x6F\x76\x7A\x08\x63\x6D\x6F\x76\x2E\x7A\x7C"
+ "\x65\x6A\x62\x0A\x6A\x62\x7C\x6A\x6E\x61\x65\x7C\x6A\x63\x6A\x62\x65\x07\x6A\x62\x65\x7C\x6A\x6E\x61\x6A\x6C\x07\x6A"
+ "\x6C\x7C\x6A\x6E\x67\x65\x6A\x6C\x65\x07\x6A\x6C\x65\x7C\x6A\x6E\x67\x6A\x6E\x62\x0B\x6A\x6E\x62\x7C\x6A\x61\x65\x7C"
+ "\x6A\x6E\x63\x6A\x6E\x62\x65\x07\x6A\x6E\x62\x65\x7C\x6A\x61\x6A\x6E\x6C\x07\x6A\x6E\x6C\x7C\x6A\x67\x65\x6A\x6E\x6C"
+ "\x65\x07\x6A\x6E\x6C\x65\x7C\x6A\x67\x6A\x6E\x70\x07\x6A\x6E\x70\x7C\x6A\x70\x6F\x6A\x6E\x7A\x07\x6A\x6E\x7A\x7C\x6A"
+ "\x6E\x65\x6A\x70\x06\x6A\x70\x7C\x6A\x70\x65\x6A\x7A\x05\x6A\x7A\x7C\x6A\x65\x73\x65\x74\x62\x0B\x73\x65\x74\x2E\x62"
+ "\x7C\x6E\x61\x65\x7C\x63\x73\x65\x74\x62\x65\x09\x73\x65\x74\x2E\x62\x65\x7C\x6E\x61\x73\x65\x74\x6C\x09\x73\x65\x74"
+ "\x2E\x6C\x7C\x6E\x67\x65\x73\x65\x74\x6C\x65\x09\x73\x65\x74\x2E\x6C\x65\x7C\x6E\x67\x73\x65\x74\x6E\x62\x0C\x73\x65"
+ "\x74\x2E\x6E\x62\x7C\x61\x65\x7C\x6E\x63\x73\x65\x74\x6E\x62\x65\x09\x73\x65\x74\x2E\x6E\x62\x65\x7C\x61\x73\x65\x74"
+ "\x6E\x6C\x09\x73\x65\x74\x2E\x6E\x6C\x7C\x67\x65\x73\x65\x74\x6E\x6C\x65\x09\x73\x65\x74\x2E\x6E\x6C\x65\x7C\x67\x73"
+ "\x65\x74\x6E\x70\x09\x73\x65\x74\x2E\x6E\x70\x7C\x70\x6F\x73\x65\x74\x6E\x7A\x09\x73\x65\x74\x2E\x6E\x7A\x7C\x6E\x65"
+ "\x73\x65\x74\x70\x08\x73\x65\x74\x2E\x70\x7C\x70\x65\x73\x65\x74\x7A\x07\x73\x65\x74\x2E\x7A\x7C\x65\x76\x67\x66\x32"
+ "\x70\x38\x61\x66\x66\x69\x6E\x65\x69\x6E\x76\x71\x62\x76\x61\x65\x73\x6B\x65\x79\x67\x65\x6E\x61\x73\x73\x69\x73\x76"
+ "\x62\x72\x6F\x61\x64\x63\x61\x73\x74\x66\x33\x32\x78\x34\x36\x34\x78\x32\x36\x34\x78\x34\x69\x33\x32\x78\x32\x69\x33"
+ "\x32\x78\x34\x69\x33\x32\x78\x38\x69\x36\x34\x78\x32\x69\x36\x34\x78\x34\x76\x70\x62\x72\x6F\x61\x64\x63\x61\x73\x74"
+ "\x6D\x62\x32\x77\x32\x64\x76\x62\x63\x73\x74\x6E\x65\x62\x66\x31\x36\x32\x70\x31\x32\x38\x69\x31\x32\x38\x76\x63\x76"
+ "\x74\x6E\x65\x32\x70\x73\x32\x76\x63\x76\x74\x6E\x65\x65\x62\x66\x31\x36\x76\x63\x76\x74\x6E\x65\x6F\x62\x66\x31\x36"
+ "\x76\x66\x6D\x61\x64\x64\x73\x75\x62\x31\x33\x32\x70\x68\x32\x31\x33\x70\x64\x32\x31\x33\x70\x68\x32\x31\x33\x70\x73"
+ "\x32\x33\x31\x70\x64\x32\x33\x31\x70\x68\x32\x33\x31\x70\x73\x76\x66\x6D\x73\x75\x62\x61\x64\x64\x31\x33\x32\x76\x70"
+ "\x6D\x75\x6C\x74\x69\x73\x68\x69\x66\x74\x76\x63\x76\x74\x6E\x65\x70\x73\x32\x76\x65\x78\x74\x72\x61\x63\x76\x65\x78"
+ "\x74\x72\x61\x63\x74\x66\x76\x70\x32\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x74\x63\x6D\x6D\x69\x6D\x66\x70\x31\x36\x74"
+ "\x63\x6D\x6D\x72\x6C\x66\x70\x31\x36\x73\x68\x32\x70\x73\x73\x64\x70\x68\x32\x70\x73\x76\x66\x6E\x6D\x61\x64\x64\x31"
+ "\x33\x32\x32\x31\x33\x73\x64\x32\x31\x33\x73\x68\x32\x31\x33\x73\x73\x32\x33\x31\x73\x64\x32\x33\x31\x73\x68\x32\x33"
+ "\x31\x73\x73\x76\x66\x6E\x6D\x73\x75\x62\x31\x33\x32\x76\x69\x6E\x73\x65\x72\x76\x69\x6E\x73\x65\x72\x74\x66\x76\x70"
+ "\x73\x68\x75\x66\x62\x69\x74\x71\x76\x73\x68\x61\x35\x31\x32\x72\x6E\x64\x70\x72\x65\x66\x65\x74\x63\x68\x69\x74\x30"
+ "\x6E\x74\x61\x77\x74\x31\x73\x61\x76\x65\x70\x72\x65\x76\x73\x73\x73\x68\x61\x32\x35\x36\x72\x6E\x64\x74\x69\x6C\x65"
+ "\x6C\x6F\x61\x64\x64\x74\x69\x6C\x65\x72\x65\x6C\x65\x76\x61\x65\x73\x64\x65\x63\x6C\x76\x61\x65\x73\x65\x6E\x63\x6C"
+ "\x76\x63\x6F\x6D\x70\x72\x65\x73\x73\x76\x63\x76\x74\x74\x70\x64\x32\x75\x64\x71\x71\x76\x63\x76\x74\x74\x70\x68\x32"
+ "\x75\x71\x71\x76\x63\x76\x74\x74\x70\x73\x76\x63\x76\x74\x74\x73\x64\x32\x75\x76\x63\x76\x74\x74\x73\x68\x32\x75\x76"
+ "\x63\x76\x74\x74\x73\x73\x32\x75\x76\x66\x69\x78\x75\x70\x69\x6D\x6D\x76\x66\x6D\x61\x64\x64\x31\x33\x32\x76\x66\x6D"
+ "\x73\x75\x62\x31\x33\x32\x76\x6D\x61\x73\x6B\x6D\x6F\x76\x64\x71\x76\x70\x63\x6F\x6D\x70\x72\x65\x73\x73\x76\x70\x63"
+ "\x6F\x6E\x66\x6C\x69\x63\x74\x76\x70\x68\x6D\x69\x6E\x70\x6F\x73\x75\x76\x70\x6D\x61\x64\x64\x35\x32\x68\x6C\x75\x71"
+ "\x76\x70\x73\x63\x61\x74\x74\x65\x72\x71\x64\x76\x70\x75\x6E\x70\x63\x6B\x68\x71\x6C\x71\x64\x71\x76\x72\x6E\x64\x73"
+ "\x63\x61\x6C\x65\x76\x73\x63\x61\x74\x74\x65\x72\x64\x71\x70\x64\x71\x70\x73\x6D\x73\x67\x31\x6D\x73\x67\x32\x63\x6C"
+ "\x66\x6C\x75\x73\x68\x6F\x70\x63\x6D\x70\x6E\x62\x65\x78\x63\x6D\x70\x6E\x6C\x65\x78\x63\x6D\x70\x78\x63\x68\x67\x31"
+ "\x36\x74\x32\x74\x69\x6C\x65\x73\x74\x6F\x72\x65\x76\x63\x76\x74\x70\x64\x76\x63\x76\x74\x70\x68\x32\x70\x73\x76\x63"
+ "\x76\x74\x70\x73\x32\x70\x68\x76\x63\x76\x74\x73\x64\x32\x75\x76\x63\x76\x74\x73\x68\x32\x75\x76\x63\x76\x74\x73\x73"
+ "\x32\x75\x32\x64\x71\x32\x71\x71\x76\x63\x76\x74\x75\x64\x71\x32\x76\x63\x76\x74\x75\x71\x71\x32\x76\x63\x76\x74\x75"
+ "\x73\x69\x32\x76\x66\x63\x6D\x61\x64\x64\x63\x76\x66\x70\x63\x6C\x61\x73\x73\x76\x67\x61\x74\x68\x65\x72\x64\x76\x67"
+ "\x65\x74\x6D\x61\x6E\x6D\x75\x6C\x62\x76\x70\x63\x6C\x6D\x75\x76\x70\x63\x6D\x70\x65\x73\x74\x72\x76\x70\x63\x6D\x70"
+ "\x69\x73\x74\x72\x76\x70\x65\x72\x6D\x32\x66\x76\x70\x65\x72\x6D\x69\x6C\x32\x76\x70\x67\x61\x74\x68\x65\x72\x76\x70"
+ "\x6D\x61\x63\x73\x73\x64\x71\x76\x70\x6D\x61\x64\x63\x73\x73\x77\x75\x62\x73\x77\x76\x70\x6D\x61\x73\x6B\x6D\x6F\x76"
+ "\x70\x74\x65\x72\x6E\x6C\x6F\x67\x62\x77\x77\x64\x6C\x62\x77\x6C\x64\x71\x6C\x77\x64\x76\x72\x73\x71\x72\x74\x31\x34"
+ "\x76\x73\x68\x75\x66\x76\x73\x68\x75\x66\x66\x76\x7A\x65\x72\x6F\x75\x70\x78\x73\x61\x76\x65\x6F\x70\x74\x63\x6D\x70"
+ "\x62\x65\x78\x63\x6D\x70\x6C\x65\x78\x63\x6D\x70\x6E\x62\x78\x63\x6D\x70\x6E\x6C\x78\x63\x6D\x70\x6E\x6F\x78\x63\x6D"
+ "\x70\x6E\x70\x78\x63\x6D\x70\x6E\x73\x78\x63\x6D\x70\x6E\x7A\x78\x38\x62\x32\x70\x69\x66\x78\x72\x73\x74\x6F\x72\x6C"
+ "\x64\x74\x69\x6C\x65\x63\x66\x6D\x6F\x76\x64\x69\x72\x36\x34\x70\x76\x61\x6C\x69\x64\x61\x72\x6D\x70\x61\x64\x6A\x75"
+ "\x72\x6D\x70\x75\x70\x64\x61\x73\x65\x72\x69\x61\x6C\x69\x73\x68\x61\x31\x6E\x65\x78\x73\x68\x61\x31\x72\x6E\x64\x73"
+ "\x73\x74\x74\x69\x6C\x65\x63\x66\x74\x64\x70\x62\x66\x31\x36\x74\x64\x70\x66\x70\x31\x36\x76\x61\x64\x64\x73\x75\x62"
+ "\x76\x62\x6C\x65\x6E\x64\x6D\x76\x70\x64\x76\x63\x76\x74\x64\x71\x32\x75\x77\x76\x63\x76\x74\x71\x71\x32\x76\x63\x76"
+ "\x74\x73\x69\x32\x76\x63\x76\x74\x75\x77\x76\x64\x62\x70\x73\x61\x64\x76\x64\x70\x62\x66\x31\x36\x76\x65\x78\x70\x61"
+ "\x6E\x64\x76\x66\x63\x6D\x75\x6C\x63\x63\x70\x68\x63\x73\x68\x76\x67\x65\x74\x65\x78\x70\x76\x6D\x6F\x76\x64\x71\x61"
+ "\x75\x31\x36\x75\x33\x32\x75\x36\x34\x76\x6D\x6F\x76\x6D\x73\x6B\x76\x6D\x6F\x76\x6E\x74\x76\x6D\x6F\x76\x73\x68\x64"
+ "\x76\x6D\x6F\x76\x73\x6C\x64\x76\x70\x61\x63\x6B\x73\x73\x64\x77\x62\x76\x70\x61\x63\x6B\x75\x73\x77\x62\x76\x70\x62"
+ "\x6C\x65\x6E\x64\x6D\x64\x76\x70\x64\x70\x62\x73\x73\x75\x64\x73\x76\x70\x64\x70\x62\x75\x73\x76\x70\x64\x70\x77\x73"
+ "\x73\x76\x70\x64\x70\x77\x75\x73\x32\x70\x64\x76\x70\x65\x72\x6D\x74\x76\x70\x65\x78\x70\x61\x6E\x76\x70\x68\x61\x64"
+ "\x64\x75\x62\x77\x71\x64\x71\x68\x76\x70\x6D\x6F\x76\x6D\x73\x6B\x76\x70\x6D\x6F\x76\x73\x78\x62\x76\x70\x6D\x6F\x76"
+ "\x75\x73\x71\x77\x76\x70\x6D\x6F\x76\x7A\x78\x62\x76\x70\x6D\x75\x6C\x68\x72\x76\x70\x74\x65\x73\x74\x6E\x6D\x71\x76"
+ "\x72\x65\x64\x75\x63\x65\x76\x73\x63\x61\x6C\x65\x66\x76\x73\x6D\x33\x72\x6E\x64\x76\x73\x6D\x34\x72\x6E\x64\x73\x76"
+ "\x75\x6E\x70\x63\x6B\x68\x6C\x70\x64\x6C\x70\x73\x78\x72\x65\x73\x6C\x64\x74\x72\x73\x36\x34\x78\x73\x75\x73\x6C\x64"
+ "\x74\x72\x63\x6C\x64\x65\x6D\x6F\x63\x6C\x72\x73\x73\x62\x73\x63\x6D\x70\x62\x78\x63\x6D\x70\x6C\x78\x63\x6D\x70\x6F"
+ "\x78\x63\x6D\x70\x70\x78\x63\x6D\x70\x73\x78\x63\x6D\x70\x7A\x78\x63\x76\x74\x70\x69\x66\x78\x73\x61\x76\x65\x6B\x6F"
+ "\x72\x74\x65\x73\x74\x77\x6B\x73\x68\x69\x66\x74\x72\x62\x6B\x75\x6E\x70\x63\x6B\x6D\x6F\x6E\x69\x74\x6F\x72\x70\x66"
+ "\x72\x63\x70\x69\x70\x66\x72\x73\x71\x69\x72\x74\x76\x72\x64\x66\x73\x62\x72\x64\x67\x73\x62\x73\x73\x70\x73\x65\x61"
+ "\x6D\x63\x61\x6C\x73\x65\x6E\x64\x75\x69\x73\x65\x74\x73\x73\x62\x73\x73\x79\x73\x65\x73\x79\x73\x65\x78\x75\x6D\x76"
+ "\x63\x76\x74\x77\x76\x66\x6D\x75\x6C\x76\x6C\x64\x6D\x78\x63\x73\x76\x6D\x6C\x61\x75\x6E\x64\x75\x70\x75\x38\x76\x6D"
+ "\x6F\x76\x68\x76\x6D\x6F\x76\x6C\x68\x76\x6D\x70\x73\x61\x64\x76\x6D\x72\x65\x73\x75\x6D\x76\x70\x61\x64\x64\x75\x76"
+ "\x70\x61\x6C\x69\x67\x6E\x67\x74\x62\x67\x74\x64\x67\x74\x71\x67\x74\x77\x32\x62\x62\x64\x62\x71\x76\x70\x68\x73\x75"
+ "\x62\x76\x70\x6C\x7A\x63\x6E\x62\x32\x6D\x64\x32\x6D\x71\x32\x6D\x77\x32\x6D\x76\x70\x6F\x70\x63\x6E\x76\x70\x73\x68"
+ "\x6C\x64\x76\x71\x76\x70\x73\x68\x72\x64\x76\x77\x68\x77\x76\x70\x73\x75\x62\x75\x76\x72\x61\x6E\x67\x65\x76\x72\x63"
+ "\x70\x31\x34\x76\x72\x6F\x75\x6E\x64\x76\x73\x6D\x34\x6B\x65\x79\x76\x73\x74\x6D\x78\x63\x73\x76\x75\x63\x6F\x6D\x69"
+ "\x61\x6C\x6C\x77\x62\x6E\x6F\x69\x6E\x77\x72\x66\x73\x62\x77\x72\x67\x73\x62\x63\x36\x34\x62\x6C\x63\x66\x69\x62\x6C"
+ "\x73\x66\x69\x65\x6E\x64\x62\x72\x65\x6E\x71\x63\x6D\x66\x63\x6D\x6F\x76\x6E\x75\x66\x64\x65\x63\x73\x66\x69\x6E\x63"
+ "\x73\x66\x6E\x73\x74\x65\x66\x72\x6E\x64\x66\x73\x69\x6E\x63\x66\x75\x63\x6F\x6D\x66\x79\x6C\x32\x78\x69\x6E\x63\x73"
+ "\x73\x70\x71\x69\x6E\x76\x6C\x69\x6E\x76\x6C\x70\x69\x6E\x76\x70\x63\x69\x6E\x76\x76\x70\x6D\x63\x6F\x6D\x6D\x6D\x6F"
+ "\x76\x71\x70\x61\x76\x67\x75\x70\x66\x63\x6D\x70\x65\x70\x66\x70\x6E\x61\x70\x74\x77\x72\x69\x73\x65\x61\x6D\x6F\x73"
+ "\x65\x61\x6D\x72\x73\x79\x73\x63\x73\x79\x73\x72\x65\x74\x64\x70\x62\x75\x74\x6C\x62\x73\x79\x76\x61\x65\x73\x69\x76"
+ "\x61\x6C\x69\x67\x76\x61\x6E\x64\x6E\x76\x63\x6F\x6D\x69\x76\x66\x72\x63\x7A\x76\x68\x61\x64\x64\x76\x68\x73\x75\x62"
+ "\x76\x6D\x63\x6C\x65\x76\x6D\x67\x65\x78\x76\x6D\x6D\x63\x76\x6D\x6F\x76\x61\x76\x6D\x6F\x76\x75\x76\x6D\x70\x74\x76"
+ "\x6D\x77\x72\x69\x76\x70\x61\x6E\x64\x76\x70\x65\x78\x74\x72\x77\x76\x70\x69\x6E\x73\x76\x70\x6D\x61\x78\x76\x70\x6D"
+ "\x69\x6E\x76\x70\x72\x6F\x6C\x76\x70\x72\x6F\x72\x76\x70\x73\x61\x64\x76\x70\x73\x69\x67\x76\x70\x73\x6C\x76\x70\x73"
+ "\x6C\x6C\x76\x70\x73\x72\x61\x76\x70\x73\x72\x6C\x76\x73\x71\x72\x76\x74\x65\x73";
+
+
+const uint32_t InstDB::_inst_name_index_table[] = {
+ 0x80000000, // Small ''.
+ 0x80000421, // Small 'aaa'.
+ 0x80001021, // Small 'aad'.
+ 0x80021021, // Small 'aadd'.
+ 0x80003421, // Small 'aam'.
+ 0x80023821, // Small 'aand'.
+ 0x80004C21, // Small 'aas'.
+ 0x80000C81, // Small 'adc'.
+ 0x800C0C81, // Small 'adcx'.
+ 0x80001081, // Small 'add'.
+ 0x80481081, // Small 'addpd'.
+ 0x81381081, // Small 'addps'.
+ 0x80499081, // Small 'addsd'.
+ 0x81399081, // Small 'addss'.
+ 0x22AC629E, // Large 'addsub|pd'.
+ 0x2282629E, // Large 'addsub|ps'.
+ 0x800C3C81, // Small 'adox'.
+ 0x86524CA1, // Small 'aesdec'.
+ 0x322D73AE, // Large 'aesdecl|ast'.
+ 0x86E2CCA1, // Small 'aesenc'.
+ 0x322D73B6, // Large 'aesencl|ast'.
+ 0x86D4CCA1, // Small 'aesimc'.
+ 0x1154E218, // Large 'aeskeygenassis|t'.
+ 0x800011C1, // Small 'and'.
+ 0x800711C1, // Small 'andn'.
+ 0x890711C1, // Small 'andnpd'.
+ 0xA70711C1, // Small 'andnps'.
+ 0x804811C1, // Small 'andpd'.
+ 0x813811C1, // Small 'andps'.
+ 0x800049E1, // Small 'aor'.
+ 0x80064241, // Small 'arpl'.
+ 0x80093F01, // Small 'axor'.
+ 0x812A60A2, // Small 'bextr'.
+ 0x28BA58CF, // Large 'blcfi|ll'.
+ 0x80048D82, // Small 'blci'.
+ 0x80348D82, // Small 'blcic'.
+ 0x97368D82, // Small 'blcmsk'.
+ 0x80098D82, // Small 'blcs'.
+ 0x22AC563C, // Large 'blend|pd'.
+ 0x2282563C, // Large 'blend|ps'.
+ 0x3642563C, // Large 'blend|vpd'.
+ 0x3364563C, // Large 'blend|vps'.
+ 0x28BA58D4, // Large 'blsfi|ll'.
+ 0x8004CD82, // Small 'blsi'.
+ 0x8034CD82, // Small 'blsic'.
+ 0x9736CD82, // Small 'blsmsk'.
+ 0x80094D82, // Small 'blsr'.
+ 0x80C191C2, // Small 'bndcl'.
+ 0x80E191C2, // Small 'bndcn'.
+ 0x815191C2, // Small 'bndcu'.
+ 0xB04611C2, // Small 'bndldx'.
+ 0x80B691C2, // Small 'bndmk'.
+ 0xACF691C2, // Small 'bndmov'.
+ 0xB14991C2, // Small 'bndstx'.
+ 0x804755E2, // Small 'bound'.
+ 0x80001A62, // Small 'bsf'.
+ 0x80004A62, // Small 'bsr'.
+ 0x8100DE62, // Small 'bswap'.
+ 0x80000282, // Small 'bt'.
+ 0x80000E82, // Small 'btc'.
+ 0x80004A82, // Small 'btr'.
+ 0x80004E82, // Small 'bts'.
+ 0x8004A342, // Small 'bzhi'.
+ 0x80063023, // Small 'call'.
+ 0x80005C43, // Small 'cbw'.
+ 0x80004483, // Small 'cdq'.
+ 0x8002C483, // Small 'cdqe'.
+ 0x80018583, // Small 'clac'.
+ 0x80000D83, // Small 'clc'.
+ 0x80001183, // Small 'cld'.
+ 0x22FD677C, // Large 'cldemo|te'.
+ 0x00007486, // Large 'clflush'.
+ 0x11549486, // Large 'clflushop|t'.
+ 0x80049D83, // Small 'clgi'.
+ 0x80002583, // Small 'cli'.
+ 0x121D7782, // Large 'clrssbs|y'.
+ 0x8009D183, // Small 'clts'.
+ 0x8004D583, // Small 'clui'.
+ 0x80015D83, // Small 'clwb'.
+ 0x9F22E983, // Small 'clzero'.
+ 0x80000DA3, // Small 'cmc'.
+ 0x0FFF5000, // Large 'cmovb' + 'cmov.b|nae|c'
+ 0x0FFF6012, // Large 'cmovbe' + 'cmov.be|na'
+ 0x0FFF5023, // Large 'cmovl' + 'cmov.l|nge'
+ 0x0FFF6033, // Large 'cmovle' + 'cmov.le|ng'
+ 0x0FFF6044, // Large 'cmovnb' + 'cmov.nb|ae|nc'
+ 0x0FFF7058, // Large 'cmovnbe' + 'cmov.nbe|a'
+ 0x0FFF606A, // Large 'cmovnl' + 'cmov.nl|ge'
+ 0x0FFF707B, // Large 'cmovnle' + 'cmov.nle|g'
+ 0x9EEB3DA3, // Small 'cmovno'.
+ 0x0FFF608D, // Large 'cmovnp' + 'cmov.np|po'
+ 0xA6EB3DA3, // Small 'cmovns'.
+ 0x0FFF609E, // Large 'cmovnz' + 'cmov.nz|ne'
+ 0x80FB3DA3, // Small 'cmovo'.
+ 0x0FFF50AF, // Large 'cmovp' + 'cmov.p|pe'
+ 0x813B3DA3, // Small 'cmovs'.
+ 0x0FFF50BE, // Large 'cmovz' + 'cmov.z|e'
+ 0x800041A3, // Small 'cmp'.
+ 0x329E65A7, // Large 'cmpbex|add'.
+ 0x329E5789, // Large 'cmpbx|add'.
+ 0x329E65AD, // Large 'cmplex|add'.
+ 0x329E578E, // Large 'cmplx|add'.
+ 0x329E748F, // Large 'cmpnbex|add'.
+ 0x329E65B3, // Large 'cmpnbx|add'.
+ 0x329E7496, // Large 'cmpnlex|add'.
+ 0x329E65B9, // Large 'cmpnlx|add'.
+ 0x329E65BF, // Large 'cmpnox|add'.
+ 0x329E65C5, // Large 'cmpnpx|add'.
+ 0x329E65CB, // Large 'cmpnsx|add'.
+ 0x329E65D1, // Large 'cmpnzx|add'.
+ 0x329E5793, // Large 'cmpox|add'.
+ 0x804841A3, // Small 'cmppd'.
+ 0x813841A3, // Small 'cmpps'.
+ 0x329E5798, // Large 'cmppx|add'.
+ 0x8009C1A3, // Small 'cmps'.
+ 0x8049C1A3, // Small 'cmpsd'.
+ 0x8139C1A3, // Small 'cmpss'.
+ 0x329E579D, // Large 'cmpsx|add'.
+ 0x0000749D, // Large 'cmpxchg'.
+ 0x1004949D, // Large 'cmpxchg16|b'.
+ 0x25D7749D, // Large 'cmpxchg|8b'.
+ 0x329E57A2, // Large 'cmpzx|add'.
+ 0x8934B5E3, // Small 'comisd'.
+ 0xA734B5E3, // Small 'comiss'.
+ 0x8044D603, // Small 'cpuid'.
+ 0x80003E23, // Small 'cqo'.
+ 0x81DF0E43, // Small 'crc32'.
+ 0x22AC6646, // Large 'cvtdq2|pd'.
+ 0x22826646, // Large 'cvtdq2|ps'.
+ 0x34E154B2, // Large 'cvtpd|2dq'.
+ 0x35D954B2, // Large 'cvtpd|2pi'.
+ 0x328154B2, // Large 'cvtpd|2ps'.
+ 0x36F157A7, // Large 'cvtpi|2pd'.
+ 0x328157A7, // Large 'cvtpi|2ps'.
+ 0x23CF64C1, // Large 'cvtps2|dq'.
+ 0x122B74C1, // Large 'cvtps2p|d'.
+ 0x120F74C1, // Large 'cvtps2p|i'.
+ 0x222364CA, // Large 'cvtsd2|si'.
+ 0x222264CA, // Large 'cvtsd2|ss'.
+ 0x231D6656, // Large 'cvtsi2|sd'.
+ 0x22226656, // Large 'cvtsi2|ss'.
+ 0x231D64DA, // Large 'cvtss2|sd'.
+ 0x222364DA, // Large 'cvtss2|si'.
+ 0x23CF73C7, // Large 'cvttpd2|dq'.
+ 0x240473C7, // Large 'cvttpd2|pi'.
+ 0x34E163DE, // Large 'cvttps|2dq'.
+ 0x35D963DE, // Large 'cvttps|2pi'.
+ 0x222373E5, // Large 'cvttsd2|si'.
+ 0x222373F7, // Large 'cvttss2|si'.
+ 0x800012E3, // Small 'cwd'.
+ 0x800292E3, // Small 'cwde'.
+ 0x80000424, // Small 'daa'.
+ 0x80004C24, // Small 'das'.
+ 0x80000CA4, // Small 'dec'.
+ 0x80005924, // Small 'div'.
+ 0x80485924, // Small 'divpd'.
+ 0x81385924, // Small 'divps'.
+ 0x8049D924, // Small 'divsd'.
+ 0x8139D924, // Small 'divss'.
+ 0x80024204, // Small 'dppd'.
+ 0x8009C204, // Small 'dpps'.
+ 0x8009B5A5, // Small 'emms'.
+ 0x223158D9, // Large 'endbr|32'.
+ 0x223558D9, // Large 'endbr|64'.
+ 0x88D1C5C5, // Small 'enqcmd'.
+ 0x22A058DE, // Large 'enqcm|ds'.
+ 0x8122D1C5, // Small 'enter'.
+ 0x228272F0, // Large 'extract|ps'.
+ 0x81195305, // Small 'extrq'.
+ 0x81C6E3A6, // Small 'f2xm1'.
+ 0x80098826, // Small 'fabs'.
+ 0x80021026, // Small 'fadd'.
+ 0x81021026, // Small 'faddp'.
+ 0x80023046, // Small 'fbld'.
+ 0x810A4C46, // Small 'fbstp'.
+ 0x8009A066, // Small 'fchs'.
+ 0x8182B066, // Small 'fclex'.
+ 0x8567B466, // Small 'fcmovb'.
+ 0x40143500, // Large 'fcm|ovbe'.
+ 0x8B67B466, // Small 'fcmove'.
+ 0x40463500, // Large 'fcm|ovnb'.
+ 0x505A3500, // Large 'fcm|ovnbe'.
+ 0x20AD58E3, // Large 'fcmov|ne'.
+ 0x28E858E3, // Large 'fcmov|nu'.
+ 0xAB67B466, // Small 'fcmovu'.
+ 0x8006BC66, // Small 'fcom'.
+ 0x8096BC66, // Small 'fcomi'.
+ 0xA096BC66, // Small 'fcomip'.
+ 0x8106BC66, // Small 'fcomp'.
+ 0xA106BC66, // Small 'fcompp'.
+ 0x8009BC66, // Small 'fcos'.
+ 0x21EF58EA, // Large 'fdecs|tp'.
+ 0x800B2486, // Small 'fdiv'.
+ 0x810B2486, // Small 'fdivp'.
+ 0x812B2486, // Small 'fdivr'.
+ 0xA12B2486, // Small 'fdivrp'.
+ 0x8136B4A6, // Small 'femms'.
+ 0x8052C8C6, // Small 'ffree'.
+ 0x80420526, // Small 'fiadd'.
+ 0x80D78D26, // Small 'ficom'.
+ 0xA0D78D26, // Small 'ficomp'.
+ 0x81649126, // Small 'fidiv'.
+ 0xA5649126, // Small 'fidivr'.
+ 0x80023126, // Small 'fild'.
+ 0x80CAB526, // Small 'fimul'.
+ 0x21EF58EF, // Large 'fincs|tp'.
+ 0x8144B926, // Small 'finit'.
+ 0x800A4D26, // Small 'fist'.
+ 0x810A4D26, // Small 'fistp'.
+ 0xA14A4D26, // Small 'fisttp'.
+ 0x802ACD26, // Small 'fisub'.
+ 0xA42ACD26, // Small 'fisubr'.
+ 0x80001186, // Small 'fld'.
+ 0x800E1186, // Small 'fld1'.
+ 0x81719186, // Small 'fldcw'.
+ 0xACE29186, // Small 'fldenv'.
+ 0x8BD61186, // Small 'fldl2e'.
+ 0xA9D61186, // Small 'fldl2t'.
+ 0xBA761186, // Small 'fldlg2'.
+ 0xBAE61186, // Small 'fldln2'.
+ 0x80981186, // Small 'fldpi'.
+ 0x800D1186, // Small 'fldz'.
+ 0x800655A6, // Small 'fmul'.
+ 0x810655A6, // Small 'fmulp'.
+ 0xB0560DC6, // Small 'fnclex'.
+ 0xA89725C6, // Small 'fninit'.
+ 0x80083DC6, // Small 'fnop'.
+ 0x8B60CDC6, // Small 'fnsave'.
+ 0xAE3A4DC6, // Small 'fnstcw'.
+ 0x221358F4, // Large 'fnste|nv'.
+ 0xAF3A4DC6, // Small 'fnstsw'.
+ 0x9C1A0606, // Small 'fpatan'.
+ 0x80D2CA06, // Small 'fprem'.
+ 0xB8D2CA06, // Small 'fprem1'.
+ 0x80E0D206, // Small 'fptan'.
+ 0x32FB48F9, // Large 'frnd|int'.
+ 0xA4FA4E46, // Small 'frstor'.
+ 0x805B0666, // Small 'fsave'.
+ 0x8AC08E66, // Small 'fscale'.
+ 0x80072666, // Small 'fsin'.
+ 0x21DD58FD, // Large 'fsinc|os'.
+ 0x81494666, // Small 'fsqrt'.
+ 0x80005266, // Small 'fst'.
+ 0x8171D266, // Small 'fstcw'.
+ 0xACE2D266, // Small 'fstenv'.
+ 0x80085266, // Small 'fstp'.
+ 0x8179D266, // Small 'fstsw'.
+ 0x80015666, // Small 'fsub'.
+ 0x81015666, // Small 'fsubp'.
+ 0x81215666, // Small 'fsubr'.
+ 0xA1215666, // Small 'fsubrp'.
+ 0x800A4E86, // Small 'ftst'.
+ 0x80D78EA6, // Small 'fucom'.
+ 0x92D78EA6, // Small 'fucomi'.
+ 0x27D45902, // Large 'fucom|ip'.
+ 0xA0D78EA6, // Small 'fucomp'.
+ 0x279A5902, // Large 'fucom|pp'.
+ 0x814486E6, // Small 'fwait'.
+ 0x80068706, // Small 'fxam'.
+ 0x80040F06, // Small 'fxch'.
+ 0x000075DC, // Large 'fxrstor'.
+ 0x223575DC, // Large 'fxrstor|64'.
+ 0x8B60CF06, // Small 'fxsave'.
+ 0x223567AC, // Large 'fxsave|64'.
+ 0x52F225DC, // Large 'fx|tract'.
+ 0x818EB326, // Small 'fyl2x'.
+ 0x22735907, // Large 'fyl2x|p1'.
+ 0x8659D0A7, // Small 'getsec'.
+ 0x1004F207, // Large 'gf2p8affineinvq|b'.
+ 0x2215B207, // Large 'gf2p8affine|qb'.
+ 0x451E5207, // Large 'gf2p8|mulb'.
+ 0x89021028, // Small 'haddpd'.
+ 0xA7021028, // Small 'haddps'.
+ 0x80005188, // Small 'hlt'.
+ 0xA8599648, // Small 'hreset'.
+ 0x89015668, // Small 'hsubpd'.
+ 0xA7015668, // Small 'hsubps'.
+ 0x800B2489, // Small 'idiv'.
+ 0x800655A9, // Small 'imul'.
+ 0x800001C9, // Small 'in'.
+ 0x80000DC9, // Small 'inc'.
+ 0x22AC590C, // Large 'incss|pd'.
+ 0x2911590C, // Large 'incss|pq'.
+ 0x80004DC9, // Small 'ins'.
+ 0x2282635D, // Large 'insert|ps'.
+ 0x1215635D, // Large 'insert|q'.
+ 0x800051C9, // Small 'int'.
+ 0x800F51C9, // Small 'int3'.
+ 0x8007D1C9, // Small 'into'.
+ 0x800259C9, // Small 'invd'.
+ 0xA902D9C9, // Small 'invept'.
+ 0x8F0659C9, // Small 'invlpg'.
+ 0x354A4913, // Large 'invl|pga'.
+ 0x25775917, // Large 'invlp|gb'.
+ 0x25F7591C, // Large 'invpc|id'.
+ 0x25F75921, // Large 'invvp|id'.
+ 0x800A1649, // Small 'iret'.
+ 0x804A1649, // Small 'iretd'.
+ 0x811A1649, // Small 'iretq'.
+ 0x0FFF20CC, // Large 'jb' + 'jb|jnae|jc'
+ 0x0FFF30D9, // Large 'jbe' + 'jbe|jna'
+ 0x81AC0CAA, // Small 'jecxz'.
+ 0x0FFF20E4, // Large 'jl' + 'jl|jnge'
+ 0x0FFF30EE, // Large 'jle' + 'jle|jng'
+ 0x800041AA, // Small 'jmp'.
+ 0x0FFF30F9, // Large 'jnb' + 'jnb|jae|jnc'
+ 0x0FFF4108, // Large 'jnbe' + 'jnbe|ja'
+ 0x0FFF3114, // Large 'jnl' + 'jnl|jge'
+ 0x0FFF411F, // Large 'jnle' + 'jnle|jg'
+ 0x80003DCA, // Small 'jno'.
+ 0x0FFF312B, // Large 'jnp' + 'jnp|jpo'
+ 0x80004DCA, // Small 'jns'.
+ 0x0FFF3136, // Large 'jnz' + 'jnz|jne'
+ 0x800001EA, // Small 'jo'.
+ 0x0FFF2141, // Large 'jp' + 'jp|jpe'
+ 0x8000026A, // Small 'js'.
+ 0x0FFF214A, // Large 'jz' + 'jz|je'
+ 0x8022102B, // Small 'kaddb'.
+ 0x8042102B, // Small 'kaddd'.
+ 0x8112102B, // Small 'kaddq'.
+ 0x8172102B, // Small 'kaddw'.
+ 0x8022382B, // Small 'kandb'.
+ 0x8042382B, // Small 'kandd'.
+ 0x84E2382B, // Small 'kandnb'.
+ 0x88E2382B, // Small 'kandnd'.
+ 0xA2E2382B, // Small 'kandnq'.
+ 0xAEE2382B, // Small 'kandnw'.
+ 0x8112382B, // Small 'kandq'.
+ 0x8172382B, // Small 'kandw'.
+ 0x802B3DAB, // Small 'kmovb'.
+ 0x804B3DAB, // Small 'kmovd'.
+ 0x811B3DAB, // Small 'kmovq'.
+ 0x817B3DAB, // Small 'kmovw'.
+ 0x802A3DCB, // Small 'knotb'.
+ 0x804A3DCB, // Small 'knotd'.
+ 0x811A3DCB, // Small 'knotq'.
+ 0x817A3DCB, // Small 'knotw'.
+ 0x800149EB, // Small 'korb'.
+ 0x800249EB, // Small 'kord'.
+ 0x8008C9EB, // Small 'korq'.
+ 0x215467B2, // Large 'kortes|tb'.
+ 0x262667B2, // Large 'kortes|td'.
+ 0x236C67B2, // Large 'kortes|tq'.
+ 0x27B867B2, // Large 'kortes|tw'.
+ 0x800BC9EB, // Small 'korw'.
+ 0x252067BA, // Large 'kshift|lb'.
+ 0x257F67BA, // Large 'kshift|ld'.
+ 0x246267BA, // Large 'kshift|lq'.
+ 0x258267BA, // Large 'kshift|lw'.
+ 0x27C067BA, // Large 'kshift|rb'.
+ 0x122B77BA, // Large 'kshiftr|d'.
+ 0x121577BA, // Large 'kshiftr|q'.
+ 0x126477BA, // Large 'kshiftr|w'.
+ 0x8549968B, // Small 'ktestb'.
+ 0x8949968B, // Small 'ktestd'.
+ 0xA349968B, // Small 'ktestq'.
+ 0xAF49968B, // Small 'ktestw'.
+ 0x257867C2, // Large 'kunpck|bw'.
+ 0x23CF67C2, // Large 'kunpck|dq'.
+ 0x257A67C2, // Large 'kunpck|wd'.
+ 0x8527BB0B, // Small 'kxnorb'.
+ 0x8927BB0B, // Small 'kxnord'.
+ 0xA327BB0B, // Small 'kxnorq'.
+ 0xAF27BB0B, // Small 'kxnorw'.
+ 0x80293F0B, // Small 'kxorb'.
+ 0x80493F0B, // Small 'kxord'.
+ 0x81193F0B, // Small 'kxorq'.
+ 0x81793F0B, // Small 'kxorw'.
+ 0x8003202C, // Small 'lahf'.
+ 0x8000482C, // Small 'lar'.
+ 0x80C6046C, // Small 'lcall'.
+ 0x8158908C, // Small 'lddqu'.
+ 0x12286815, // Large 'ldmxcs|r'.
+ 0x80004C8C, // Small 'lds'.
+ 0x103185E3, // Large 'ldtilecf|g'.
+ 0x800004AC, // Small 'lea'.
+ 0x805B04AC, // Small 'leave'.
+ 0x80004CAC, // Small 'les'.
+ 0x8A3714CC, // Small 'lfence'.
+ 0x80004CCC, // Small 'lfs'.
+ 0x800A10EC, // Small 'lgdt'.
+ 0x80004CEC, // Small 'lgs'.
+ 0x800A112C, // Small 'lidt'.
+ 0x8008354C, // Small 'ljmp'.
+ 0x800A118C, // Small 'lldt'.
+ 0x84385D8C, // Small 'llwpcb'.
+ 0x800BCDAC, // Small 'lmsw'.
+ 0x800991EC, // Small 'lods'.
+ 0x80083DEC, // Small 'loop'.
+ 0x80583DEC, // Small 'loope'.
+ 0x8AE83DEC, // Small 'loopne'.
+ 0x8000326C, // Small 'lsl'.
+ 0x80004E6C, // Small 'lss'.
+ 0x80004A8C, // Small 'ltr'.
+ 0xA6E4C2EC, // Small 'lwpins'.
+ 0x981B42EC, // Small 'lwpval'.
+ 0x81470F4C, // Small 'lzcnt'.
+ 0x12A2941B, // Large 'maskmovdq|u'.
+ 0x1215741B, // Large 'maskmov|q'.
+ 0x8048602D, // Small 'maxpd'.
+ 0x8138602D, // Small 'maxps'.
+ 0x8049E02D, // Small 'maxsd'.
+ 0x8139E02D, // Small 'maxss'.
+ 0x236B5926, // Large 'mcomm|it'.
+ 0x8A3714CD, // Small 'mfence'.
+ 0x8048392D, // Small 'minpd'.
+ 0x8138392D, // Small 'minps'.
+ 0x8049B92D, // Small 'minsd'.
+ 0x8139B92D, // Small 'minss'.
+ 0x000077C8, // Large 'monitor'.
+ 0x123377C8, // Large 'monitor|x'.
+ 0x800059ED, // Small 'mov'.
+ 0xA620D9ED, // Small 'movabs'.
+ 0x8900D9ED, // Small 'movapd'.
+ 0xA700D9ED, // Small 'movaps'.
+ 0x805159ED, // Small 'movbe'.
+ 0x800259ED, // Small 'movd'.
+ 0x3821441F, // Large 'movd|dup'.
+ 0x100485EB, // Large 'movdir64|b'.
+ 0x120F65EB, // Large 'movdir|i'.
+ 0x24E4541F, // Large 'movdq|2q'.
+ 0x831259ED, // Small 'movdqa'.
+ 0xAB1259ED, // Small 'movdqu'.
+ 0x37664827, // Large 'movh|lps'.
+ 0x890459ED, // Small 'movhpd'.
+ 0xA70459ED, // Small 'movhps'.
+ 0x2282582C, // Large 'movlh|ps'.
+ 0x890659ED, // Small 'movlpd'.
+ 0xA70659ED, // Small 'movlps'.
+ 0x22AC669C, // Large 'movmsk|pd'.
+ 0x2282669C, // Large 'movmsk|ps'.
+ 0x23CF56A3, // Large 'movnt|dq'.
+ 0x368F56A3, // Large 'movnt|dqa'.
+ 0x934759ED, // Small 'movnti'.
+ 0x22AC56A3, // Large 'movnt|pd'.
+ 0x228256A3, // Large 'movnt|ps'.
+ 0xA34759ED, // Small 'movntq'.
+ 0x231D56A3, // Large 'movnt|sd'.
+ 0x222256A3, // Large 'movnt|ss'.
+ 0x8008D9ED, // Small 'movq'.
+ 0x34E1492B, // Large 'movq|2dq'.
+ 0x8009D9ED, // Small 'movs'.
+ 0x8049D9ED, // Small 'movsd'.
+ 0x240366A9, // Large 'movshd|up'.
+ 0x240366B0, // Large 'movsld|up'.
+ 0x8139D9ED, // Small 'movss'.
+ 0x8189D9ED, // Small 'movsx'.
+ 0x8989D9ED, // Small 'movsxd'.
+ 0x890AD9ED, // Small 'movupd'.
+ 0xA70AD9ED, // Small 'movups'.
+ 0x818D59ED, // Small 'movzx'.
+ 0x25785832, // Large 'mpsad|bw'.
+ 0x800032AD, // Small 'mul'.
+ 0x804832AD, // Small 'mulpd'.
+ 0x813832AD, // Small 'mulps'.
+ 0x8049B2AD, // Small 'mulsd'.
+ 0x8139B2AD, // Small 'mulss'.
+ 0x800C32AD, // Small 'mulx'.
+ 0x814486ED, // Small 'mwait'.
+ 0xB14486ED, // Small 'mwaitx'.
+ 0x80001CAE, // Small 'neg'.
+ 0x800041EE, // Small 'nop'.
+ 0x800051EE, // Small 'not'.
+ 0x8000024F, // Small 'or'.
+ 0x8002424F, // Small 'orpd'.
+ 0x8009C24F, // Small 'orps'.
+ 0x800052AF, // Small 'out'.
+ 0x8009D2AF, // Small 'outs'.
+ 0x80298830, // Small 'pabsb'.
+ 0x80498830, // Small 'pabsd'.
+ 0x81798830, // Small 'pabsw'.
+ 0x000086B7, // Large 'packssdw'.
+ 0x26BE66B7, // Large 'packss|wb'.
+ 0x26BD66C1, // Large 'packus|dw'.
+ 0x000086C1, // Large 'packuswb'.
+ 0x80221030, // Small 'paddb'.
+ 0x80421030, // Small 'paddd'.
+ 0x81121030, // Small 'paddq'.
+ 0x85321030, // Small 'paddsb'.
+ 0xAF321030, // Small 'paddsw'.
+ 0x2786583F, // Large 'paddu|sb'.
+ 0x2561583F, // Large 'paddu|sw'.
+ 0x81721030, // Small 'paddw'.
+ 0x12286845, // Large 'palign|r'.
+ 0x80023830, // Small 'pand'.
+ 0x80E23830, // Small 'pandn'.
+ 0x8059D430, // Small 'pause'.
+ 0x8023D830, // Small 'pavgb'.
+ 0x2786592F, // Large 'pavgu|sb'.
+ 0x8173D830, // Small 'pavgw'.
+ 0x200366CA, // Large 'pblend|vb'.
+ 0x126466CA, // Large 'pblend|w'.
+ 0x44625523, // Large 'pclmu|lqdq'.
+ 0x22155529, // Large 'pcmpe|qb'.
+ 0x24575529, // Large 'pcmpe|qd'.
+ 0x23D05529, // Large 'pcmpe|qq'.
+ 0x27255529, // Large 'pcmpe|qw'.
+ 0x120F8529, // Large 'pcmpestr|i'.
+ 0x10018529, // Large 'pcmpestr|m'.
+ 0x384B448E, // Large 'pcmp|gtb'.
+ 0x384E448E, // Large 'pcmp|gtd'.
+ 0x3851448E, // Large 'pcmp|gtq'.
+ 0x3854448E, // Large 'pcmp|gtw'.
+ 0x120F8532, // Large 'pcmpistr|i'.
+ 0x10018532, // Large 'pcmpistr|m'.
+ 0x2848542F, // Large 'pconf|ig'.
+ 0x80081490, // Small 'pdep'.
+ 0x800A60B0, // Small 'pext'.
+ 0x852A60B0, // Small 'pextrb'.
+ 0x892A60B0, // Small 'pextrd'.
+ 0xA32A60B0, // Small 'pextrq'.
+ 0xAF2A60B0, // Small 'pextrw'.
+ 0x8044F4D0, // Small 'pf2id'.
+ 0x8174F4D0, // Small 'pf2iw'.
+ 0x803184D0, // Small 'pfacc'.
+ 0x804204D0, // Small 'pfadd'.
+ 0x12156934, // Large 'pfcmpe|q'.
+ 0x20315934, // Large 'pfcmp|ge'.
+ 0x284B5934, // Large 'pfcmp|gt'.
+ 0x8180B4D0, // Small 'pfmax'.
+ 0x80E4B4D0, // Small 'pfmin'.
+ 0x80CAB4D0, // Small 'pfmul'.
+ 0x8630B8D0, // Small 'pfnacc'.
+ 0x2011593A, // Large 'pfpna|cc'.
+ 0x8101C8D0, // Small 'pfrcp'.
+ 0x238767CF, // Large 'pfrcpi|t1'.
+ 0x24A667CF, // Large 'pfrcpi|t2'.
+ 0xAD01C8D0, // Small 'pfrcpv'.
+ 0x238767D5, // Large 'pfrsqi|t1'.
+ 0x236157D5, // Large 'pfrsq|rt'.
+ 0x37DB57D5, // Large 'pfrsq|rtv'.
+ 0x802ACCD0, // Small 'pfsub'.
+ 0xA42ACCD0, // Small 'pfsubr'.
+ 0x88420510, // Small 'phaddd'.
+ 0x25615702, // Large 'phadd|sw'.
+ 0xAE420510, // Small 'phaddw'.
+ 0x12649439, // Large 'phminposu|w'.
+ 0x882ACD10, // Small 'phsubd'.
+ 0x2561585E, // Large 'phsub|sw'.
+ 0xAE2ACD10, // Small 'phsubw'.
+ 0x80437530, // Small 'pi2fd'.
+ 0x81737530, // Small 'pi2fw'.
+ 0x8529B930, // Small 'pinsrb'.
+ 0x8929B930, // Small 'pinsrd'.
+ 0xA329B930, // Small 'pinsrq'.
+ 0xAF29B930, // Small 'pinsrw'.
+ 0x45635443, // Large 'pmadd|ubsw'.
+ 0x257A5443, // Large 'pmadd|wd'.
+ 0x853C05B0, // Small 'pmaxsb'.
+ 0x893C05B0, // Small 'pmaxsd'.
+ 0xAF3C05B0, // Small 'pmaxsw'.
+ 0x855C05B0, // Small 'pmaxub'.
+ 0x895C05B0, // Small 'pmaxud'.
+ 0xAF5C05B0, // Small 'pmaxuw'.
+ 0x853725B0, // Small 'pminsb'.
+ 0x893725B0, // Small 'pminsd'.
+ 0xAF3725B0, // Small 'pminsw'.
+ 0x855725B0, // Small 'pminub'.
+ 0x895725B0, // Small 'pminud'.
+ 0xAF5725B0, // Small 'pminuw'.
+ 0x1004770F, // Large 'pmovmsk|b'.
+ 0x122B7717, // Large 'pmovsxb|d'.
+ 0x12157717, // Large 'pmovsxb|q'.
+ 0x12647717, // Large 'pmovsxb|w'.
+ 0x23CF6717, // Large 'pmovsx|dq'.
+ 0x257A6717, // Large 'pmovsx|wd'.
+ 0x27096717, // Large 'pmovsx|wq'.
+ 0x122B7728, // Large 'pmovzxb|d'.
+ 0x12157728, // Large 'pmovzxb|q'.
+ 0x12647728, // Large 'pmovzxb|w'.
+ 0x23CF6728, // Large 'pmovzx|dq'.
+ 0x257A6728, // Large 'pmovzx|wd'.
+ 0x27096728, // Large 'pmovzx|wq'.
+ 0xA24655B0, // Small 'pmuldq'.
+ 0x25616730, // Large 'pmulhr|sw'.
+ 0x12646730, // Large 'pmulhr|w'.
+ 0x264C5730, // Large 'pmulh|uw'.
+ 0xAE8655B0, // Small 'pmulhw'.
+ 0x88C655B0, // Small 'pmulld'.
+ 0xAEC655B0, // Small 'pmullw'.
+ 0x33CE42D4, // Large 'pmul|udq'.
+ 0x800041F0, // Small 'pop'.
+ 0x8000C1F0, // Small 'popa'.
+ 0x8040C1F0, // Small 'popad'.
+ 0xA8E1C1F0, // Small 'popcnt'.
+ 0x800341F0, // Small 'popf'.
+ 0x804341F0, // Small 'popfd'.
+ 0x811341F0, // Small 'popfq'.
+ 0x800049F0, // Small 'por'.
+ 0x00008378, // Large 'prefetch'.
+ 0x0000B378, // Large 'prefetchit0'.
+ 0x1270A378, // Large 'prefetchit|1'.
+ 0x33838378, // Large 'prefetch|nta'.
+ 0x23818378, // Large 'prefetch|t0'.
+ 0x23878378, // Large 'prefetch|t1'.
+ 0x24A68378, // Large 'prefetch|t2'.
+ 0x12648378, // Large 'prefetch|w'.
+ 0x33868378, // Large 'prefetch|wt1'.
+ 0xAE220670, // Small 'psadbw'.
+ 0x846AA270, // Small 'pshufb'.
+ 0x886AA270, // Small 'pshufd'.
+ 0x288B5365, // Large 'pshuf|hw'.
+ 0x25825365, // Large 'pshuf|lw'.
+ 0xAE6AA270, // Small 'pshufw'.
+ 0x84E3A670, // Small 'psignb'.
+ 0x88E3A670, // Small 'psignd'.
+ 0xAEE3A670, // Small 'psignw'.
+ 0x80463270, // Small 'pslld'.
+ 0xA2463270, // Small 'pslldq'.
+ 0x81163270, // Small 'psllq'.
+ 0x81763270, // Small 'psllw'.
+ 0x9130B670, // Small 'psmash'.
+ 0x8040CA70, // Small 'psrad'.
+ 0x8170CA70, // Small 'psraw'.
+ 0x80464A70, // Small 'psrld'.
+ 0xA2464A70, // Small 'psrldq'.
+ 0x81164A70, // Small 'psrlq'.
+ 0x81764A70, // Small 'psrlw'.
+ 0x80215670, // Small 'psubb'.
+ 0x80415670, // Small 'psubd'.
+ 0x81115670, // Small 'psubq'.
+ 0x85315670, // Small 'psubsb'.
+ 0xAF315670, // Small 'psubsw'.
+ 0x2786588E, // Large 'psubu|sb'.
+ 0x2561588E, // Large 'psubu|sw'.
+ 0x81715670, // Small 'psubw'.
+ 0x8900DE70, // Small 'pswapd'.
+ 0x81499690, // Small 'ptest'.
+ 0x22FD593F, // Large 'ptwri|te'.
+ 0x2578745A, // Large 'punpckh|bw'.
+ 0x23CF745A, // Large 'punpckh|dq'.
+ 0x23CF845A, // Large 'punpckhq|dq'.
+ 0x257A745A, // Large 'punpckh|wd'.
+ 0x357C645A, // Large 'punpck|lbw'.
+ 0x357F645A, // Large 'punpck|ldq'.
+ 0x4462645A, // Large 'punpck|lqdq'.
+ 0x3582645A, // Large 'punpck|lwd'.
+ 0x80044EB0, // Small 'push'.
+ 0x80144EB0, // Small 'pusha'.
+ 0x88144EB0, // Small 'pushad'.
+ 0x80644EB0, // Small 'pushf'.
+ 0x88644EB0, // Small 'pushfd'.
+ 0xA2644EB0, // Small 'pushfq'.
+ 0x81744EB0, // Small 'pushw'.
+ 0x22FD75F3, // Large 'pvalida|te'.
+ 0x80093F10, // Small 'pxor'.
+ 0x80003072, // Small 'rcl'.
+ 0x81384072, // Small 'rcpps'.
+ 0x8139C072, // Small 'rcpss'.
+ 0x80004872, // Small 'rcr'.
+ 0x317057DE, // Large 'rdfsb|ase'.
+ 0x317057E3, // Large 'rdgsb|ase'.
+ 0x8129B492, // Small 'rdmsr'.
+ 0x8044C092, // Small 'rdpid'.
+ 0xAB25C092, // Small 'rdpkru'.
+ 0x8036C092, // Small 'rdpmc'.
+ 0x81594092, // Small 'rdpru'.
+ 0x88E0C892, // Small 'rdrand'.
+ 0x8852CC92, // Small 'rdseed'.
+ 0x8909CC92, // Small 'rdsspd'.
+ 0xA309CC92, // Small 'rdsspq'.
+ 0x8039D092, // Small 'rdtsc'.
+ 0xA039D092, // Small 'rdtscp'.
+ 0x800050B2, // Small 'ret'.
+ 0x800350B2, // Small 'retf'.
+ 0x222E75FA, // Large 'rmpadju|st'.
+ 0x22FD7601, // Large 'rmpupda|te'.
+ 0x800031F2, // Small 'rol'.
+ 0x800049F2, // Small 'ror'.
+ 0x800C49F2, // Small 'rorx'.
+ 0x22AC58A0, // Large 'round|pd'.
+ 0x228258A0, // Large 'round|ps'.
+ 0x231D58A0, // Large 'round|sd'.
+ 0x222258A0, // Large 'round|ss'.
+ 0x80003672, // Small 'rsm'.
+ 0x22825586, // Large 'rsqrt|ps'.
+ 0x22225586, // Large 'rsqrt|ss'.
+ 0x37E855DE, // Large 'rstor|ssp'.
+ 0x80032033, // Small 'sahf'.
+ 0x80004833, // Small 'sar'.
+ 0x800C4833, // Small 'sarx'.
+ 0x1092A389, // Large 'saveprevss|p'.
+ 0x80000853, // Small 'sbb'.
+ 0x80098473, // Small 'scas'.
+ 0x102777EB, // Large 'seamcal|l'.
+ 0x22825944, // Large 'seamo|ps'.
+ 0x21535949, // Large 'seamr|et'.
+ 0x240467F2, // Large 'sendui|pi'.
+ 0x25997608, // Large 'seriali|ze'.
+ 0x0FFF4152, // Large 'setb' + 'set.b|nae|c'
+ 0x0FFF5162, // Large 'setbe' + 'set.be|na'
+ 0x0FFF4171, // Large 'setl' + 'set.l|nge'
+ 0x0FFF517F, // Large 'setle' + 'set.le|ng'
+ 0x0FFF518E, // Large 'setnb' + 'set.nb|ae|nc'
+ 0x0FFF61A0, // Large 'setnbe' + 'set.nbe|a'
+ 0x0FFF51B0, // Large 'setnl' + 'set.nl|ge'
+ 0x0FFF61BF, // Large 'setnle' + 'set.nle|g'
+ 0x80F750B3, // Small 'setno'.
+ 0x0FFF51CF, // Large 'setnp' + 'set.np|po'
+ 0x813750B3, // Small 'setns'.
+ 0x0FFF51DE, // Large 'setnz' + 'set.nz|ne'
+ 0x8007D0B3, // Small 'seto'.
+ 0x0FFF41ED, // Large 'setp' + 'set.p|pe'
+ 0x8009D0B3, // Small 'sets'.
+ 0x121D77F8, // Large 'setssbs|y'.
+ 0x0FFF41FA, // Large 'setz' + 'set.z|e'
+ 0x8A3714D3, // Small 'sfence'.
+ 0x800A10F3, // Small 'sgdt'.
+ 0x447E460F, // Large 'sha1|msg1'.
+ 0x4482460F, // Large 'sha1|msg2'.
+ 0x22FD760F, // Large 'sha1nex|te'.
+ 0x12348616, // Large 'sha1rnds|4'.
+ 0x447E6393, // Large 'sha256|msg1'.
+ 0x44826393, // Large 'sha256|msg2'.
+ 0x22839393, // Large 'sha256rnd|s2'.
+ 0x80003113, // Small 'shl'.
+ 0x80023113, // Small 'shld'.
+ 0x800C3113, // Small 'shlx'.
+ 0x80004913, // Small 'shr'.
+ 0x80024913, // Small 'shrd'.
+ 0x800C4913, // Small 'shrx'.
+ 0x89035513, // Small 'shufpd'.
+ 0xA7035513, // Small 'shufps'.
+ 0x800A1133, // Small 'sidt'.
+ 0xA8972573, // Small 'skinit'.
+ 0x800A1193, // Small 'sldt'.
+ 0x84385D93, // Small 'slwpcb'.
+ 0x800BCDB3, // Small 'smsw'.
+ 0x890A4A33, // Small 'sqrtpd'.
+ 0xA70A4A33, // Small 'sqrtps'.
+ 0x893A4A33, // Small 'sqrtsd'.
+ 0xA73A4A33, // Small 'sqrtss'.
+ 0x80018693, // Small 'stac'.
+ 0x80000E93, // Small 'stc'.
+ 0x80001293, // Small 'std'.
+ 0x80049E93, // Small 'stgi'.
+ 0x80002693, // Small 'sti'.
+ 0x122868AD, // Large 'stmxcs|r'.
+ 0x8009BE93, // Small 'stos'.
+ 0x80004A93, // Small 'str'.
+ 0x1031861E, // Large 'sttilecf|g'.
+ 0x8004D693, // Small 'stui'.
+ 0x80000AB3, // Small 'sub'.
+ 0x80480AB3, // Small 'subpd'.
+ 0x81380AB3, // Small 'subps'.
+ 0x80498AB3, // Small 'subsd'.
+ 0x81398AB3, // Small 'subss'.
+ 0xA67806F3, // Small 'swapgs'.
+ 0x38B9494E, // Large 'sysc|all'.
+ 0x42FC47FF, // Large 'syse|nter'.
+ 0x236B5803, // Large 'sysex|it'.
+ 0x336B5803, // Large 'sysex|itq'.
+ 0xA8594F33, // Small 'sysret'.
+ 0x236C5952, // Large 'sysre|tq'.
+ 0x86B9B794, // Small 't1mskc'.
+ 0x2282A304, // Large 'tcmmimfp16|ps'.
+ 0x2282A30E, // Large 'tcmmrlfp16|ps'.
+ 0x98C08C94, // Small 'tdcall'.
+ 0x22827626, // Large 'tdpbf16|ps'.
+ 0x331C4626, // Large 'tdpb|ssd'.
+ 0x36D84626, // Large 'tdpb|sud'.
+ 0x231D5957, // Large 'tdpbu|sd'.
+ 0x23CE5957, // Large 'tdpbu|ud'.
+ 0x2282762D, // Large 'tdpfp16|ps'.
+ 0x800A4CB4, // Small 'test'.
+ 0x935A4CB4, // Small 'testui'.
+ 0x0000939C, // Large 'tileloadd'.
+ 0x2387939C, // Large 'tileloadd|t1'.
+ 0x317083A5, // Large 'tilerele|ase'.
+ 0x122B94A8, // Large 'tilestore|d'.
+ 0x4599439C, // Large 'tile|zero'.
+ 0x2056595C, // Large 'tlbsy|nc'.
+ 0x8B3A8614, // Small 'tpause'.
+ 0x81470F54, // Small 'tzcnt'.
+ 0x80B9B754, // Small 'tzmsk'.
+ 0x231D58B4, // Large 'ucomi|sd'.
+ 0x222258B4, // Large 'ucomi|ss'.
+ 0x80006C95, // Small 'ud0'.
+ 0x80007095, // Small 'ud1'.
+ 0x80007495, // Small 'ud2'.
+ 0x8142C935, // Small 'uiret'.
+ 0x67C92808, // Large 'um|onitor'.
+ 0xA890DDB5, // Small 'umwait'.
+ 0x22AC645B, // Large 'unpckh|pd'.
+ 0x2282645B, // Large 'unpckh|ps'.
+ 0x3763545B, // Large 'unpck|lpd'.
+ 0x3766545B, // Large 'unpck|lps'.
+ 0x89021036, // Small 'vaddpd'.
+ 0x91021036, // Small 'vaddph'.
+ 0xA7021036, // Small 'vaddps'.
+ 0x89321036, // Small 'vaddsd'.
+ 0x91321036, // Small 'vaddsh'.
+ 0xA7321036, // Small 'vaddss'.
+ 0x22AC7634, // Large 'vaddsub|pd'.
+ 0x22827634, // Large 'vaddsub|ps'.
+ 0x000073AD, // Large 'vaesdec'.
+ 0x322D83AD, // Large 'vaesdecl|ast'.
+ 0x000073B5, // Large 'vaesenc'.
+ 0x322D83B5, // Large 'vaesencl|ast'.
+ 0x27EE5961, // Large 'vaesi|mc'.
+ 0x1154F217, // Large 'vaeskeygenassis|t'.
+ 0x23765966, // Large 'valig|nd'.
+ 0x28DF5966, // Large 'valig|nq'.
+ 0x22AC596B, // Large 'vandn|pd'.
+ 0x2282596B, // Large 'vandn|ps'.
+ 0x89023836, // Small 'vandpd'.
+ 0xA7023836, // Small 'vandps'.
+ 0x1152D267, // Large 'vbcstnebf162p|s'.
+ 0x53187267, // Large 'vbcstne|sh2ps'.
+ 0x22AC763B, // Large 'vblendm|pd'.
+ 0x2282763B, // Large 'vblendm|ps'.
+ 0x22AC663B, // Large 'vblend|pd'.
+ 0x2282663B, // Large 'vblend|ps'.
+ 0x3642663B, // Large 'vblend|vpd'.
+ 0x3364663B, // Large 'vblend|vps'.
+ 0x3274B226, // Large 'vbroadcastf|128'.
+ 0x1209E226, // Large 'vbroadcastf32x|2'.
+ 0x1234E226, // Large 'vbroadcastf32x|4'.
+ 0x120BE226, // Large 'vbroadcastf32x|8'.
+ 0x4235B226, // Large 'vbroadcastf|64x2'.
+ 0x4239B226, // Large 'vbroadcastf|64x4'.
+ 0x4277A226, // Large 'vbroadcast|i128'.
+ 0x523DA226, // Large 'vbroadcast|i32x2'.
+ 0x5242A226, // Large 'vbroadcast|i32x4'.
+ 0x5247A226, // Large 'vbroadcast|i32x8'.
+ 0x524CA226, // Large 'vbroadcast|i64x2'.
+ 0x5251A226, // Large 'vbroadcast|i64x4'.
+ 0x231DA226, // Large 'vbroadcast|sd'.
+ 0x2222A226, // Large 'vbroadcast|ss'.
+ 0x89083476, // Small 'vcmppd'.
+ 0x91083476, // Small 'vcmpph'.
+ 0xA7083476, // Small 'vcmpps'.
+ 0x89383476, // Small 'vcmpsd'.
+ 0x91383476, // Small 'vcmpsh'.
+ 0xA7383476, // Small 'vcmpss'.
+ 0x231D5970, // Large 'vcomi|sd'.
+ 0x22DA5970, // Large 'vcomi|sh'.
+ 0x22225970, // Large 'vcomi|ss'.
+ 0x22AC93BD, // Large 'vcompress|pd'.
+ 0x228293BD, // Large 'vcompress|ps'.
+ 0x22AC7645, // Large 'vcvtdq2|pd'.
+ 0x22A77645, // Large 'vcvtdq2|ph'.
+ 0x22827645, // Large 'vcvtdq2|ps'.
+ 0x426EA27B, // Large 'vcvtne2ps2|bf16'.
+ 0x3281B285, // Large 'vcvtneebf16|2ps'.
+ 0x531F7285, // Large 'vcvtnee|ph2ps'.
+ 0x3281B290, // Large 'vcvtneobf16|2ps'.
+ 0x531F7290, // Large 'vcvtneo|ph2ps'.
+ 0x426E92DF, // Large 'vcvtneps2|bf16'.
+ 0x34E164B1, // Large 'vcvtpd|2dq'.
+ 0x32A664B1, // Large 'vcvtpd|2ph'.
+ 0x328164B1, // Large 'vcvtpd|2ps'.
+ 0x34E464B1, // Large 'vcvtpd|2qq'.
+ 0x63CB427B, // Large 'vcvt|pd2udq'.
+ 0x43D964B1, // Large 'vcvtpd|2uqq'.
+ 0x23CF74B7, // Large 'vcvtph2|dq'.
+ 0x122B84B7, // Large 'vcvtph2p|d'.
+ 0x000094B7, // Large 'vcvtph2ps'.
+ 0x123394B7, // Large 'vcvtph2ps|x'.
+ 0x23D074B7, // Large 'vcvtph2|qq'.
+ 0x33CE74B7, // Large 'vcvtph2|udq'.
+ 0x33DA74B7, // Large 'vcvtph2|uqq'.
+ 0x264C74B7, // Large 'vcvtph2|uw'.
+ 0x126474B7, // Large 'vcvtph2|w'.
+ 0x23CF74C0, // Large 'vcvtps2|dq'.
+ 0x122B84C0, // Large 'vcvtps2p|d'.
+ 0x000094C0, // Large 'vcvtps2ph'.
+ 0x123394C0, // Large 'vcvtps2ph|x'.
+ 0x23D074C0, // Large 'vcvtps2|qq'.
+ 0x33CE74C0, // Large 'vcvtps2|udq'.
+ 0x33DA74C0, // Large 'vcvtps2|uqq'.
+ 0x22AC764E, // Large 'vcvtqq2|pd'.
+ 0x22A7764E, // Large 'vcvtqq2|ph'.
+ 0x2282764E, // Large 'vcvtqq2|ps'.
+ 0x22DA74C9, // Large 'vcvtsd2|sh'.
+ 0x222374C9, // Large 'vcvtsd2|si'.
+ 0x222274C9, // Large 'vcvtsd2|ss'.
+ 0x222384C9, // Large 'vcvtsd2u|si'.
+ 0x231D74D1, // Large 'vcvtsh2|sd'.
+ 0x222374D1, // Large 'vcvtsh2|si'.
+ 0x222274D1, // Large 'vcvtsh2|ss'.
+ 0x222384D1, // Large 'vcvtsh2u|si'.
+ 0x231D7655, // Large 'vcvtsi2|sd'.
+ 0x22DA7655, // Large 'vcvtsi2|sh'.
+ 0x22227655, // Large 'vcvtsi2|ss'.
+ 0x231D74D9, // Large 'vcvtss2|sd'.
+ 0x22DA74D9, // Large 'vcvtss2|sh'.
+ 0x222374D9, // Large 'vcvtss2|si'.
+ 0x222384D9, // Large 'vcvtss2u|si'.
+ 0x23CF83C6, // Large 'vcvttpd2|dq'.
+ 0x23D083C6, // Large 'vcvttpd2|qq'.
+ 0x1215A3C6, // Large 'vcvttpd2ud|q'.
+ 0x23D093C6, // Large 'vcvttpd2u|qq'.
+ 0x23CF83D2, // Large 'vcvttph2|dq'.
+ 0x23D083D2, // Large 'vcvttph2|qq'.
+ 0x43CD73D2, // Large 'vcvttph|2udq'.
+ 0x43D973D2, // Large 'vcvttph|2uqq'.
+ 0x126493D2, // Large 'vcvttph2u|w'.
+ 0x126483D2, // Large 'vcvttph2|w'.
+ 0x34E173DD, // Large 'vcvttps|2dq'.
+ 0x34E473DD, // Large 'vcvttps|2qq'.
+ 0x43CD73DD, // Large 'vcvttps|2udq'.
+ 0x43D973DD, // Large 'vcvttps|2uqq'.
+ 0x222383E4, // Large 'vcvttsd2|si'.
+ 0x222393E4, // Large 'vcvttsd2u|si'.
+ 0x222383ED, // Large 'vcvttsh2|si'.
+ 0x222393ED, // Large 'vcvttsh2u|si'.
+ 0x222383F6, // Large 'vcvttss2|si'.
+ 0x222393F6, // Large 'vcvttss2u|si'.
+ 0x22AC84E7, // Large 'vcvtudq2|pd'.
+ 0x22A784E7, // Large 'vcvtudq2|ph'.
+ 0x228284E7, // Large 'vcvtudq2|ps'.
+ 0x22AC84EF, // Large 'vcvtuqq2|pd'.
+ 0x22A784EF, // Large 'vcvtuqq2|ph'.
+ 0x228284EF, // Large 'vcvtuqq2|ps'.
+ 0x231D84F7, // Large 'vcvtusi2|sd'.
+ 0x22DA84F7, // Large 'vcvtusi2|sh'.
+ 0x222284F7, // Large 'vcvtusi2|ss'.
+ 0x32A6665C, // Large 'vcvtuw|2ph'.
+ 0x32A6580A, // Large 'vcvtw|2ph'.
+ 0x25787662, // Large 'vdbpsad|bw'.
+ 0x890B2496, // Small 'vdivpd'.
+ 0x910B2496, // Small 'vdivph'.
+ 0xA70B2496, // Small 'vdivps'.
+ 0x893B2496, // Small 'vdivsd'.
+ 0x913B2496, // Small 'vdivsh'.
+ 0xA73B2496, // Small 'vdivss'.
+ 0x22827669, // Large 'vdpbf16|ps'.
+ 0x80484096, // Small 'vdppd'.
+ 0x81384096, // Small 'vdpps'.
+ 0x800948B6, // Small 'verr'.
+ 0x800BC8B6, // Small 'verw'.
+ 0x22AC7670, // Large 'vexpand|pd'.
+ 0x22827670, // Large 'vexpand|ps'.
+ 0x327492EF, // Large 'vextractf|128'.
+ 0x622F72E8, // Large 'vextrac|tf32x4'.
+ 0x424892EF, // Large 'vextractf|32x8'.
+ 0x423592EF, // Large 'vextractf|64x2'.
+ 0x423992EF, // Large 'vextractf|64x4'.
+ 0x427782EF, // Large 'vextract|i128'.
+ 0x524282EF, // Large 'vextract|i32x4'.
+ 0x524782EF, // Large 'vextract|i32x8'.
+ 0x524C82EF, // Large 'vextract|i64x2'.
+ 0x525182EF, // Large 'vextract|i64x4'.
+ 0x228282EF, // Large 'vextract|ps'.
+ 0x22A784FF, // Large 'vfcmaddc|ph'.
+ 0x22DA84FF, // Large 'vfcmaddc|sh'.
+ 0x22A77677, // Large 'vfcmulc|ph'.
+ 0x22DA7677, // Large 'vfcmulc|sh'.
+ 0x22AC93FF, // Large 'vfixupimm|pd'.
+ 0x228293FF, // Large 'vfixupimm|ps'.
+ 0x231D93FF, // Large 'vfixupimm|sd'.
+ 0x222293FF, // Large 'vfixupimm|ss'.
+ 0x22AC9408, // Large 'vfmadd132|pd'.
+ 0x22A79408, // Large 'vfmadd132|ph'.
+ 0x22829408, // Large 'vfmadd132|ps'.
+ 0x231D9408, // Large 'vfmadd132|sd'.
+ 0x22DA9408, // Large 'vfmadd132|sh'.
+ 0x22229408, // Large 'vfmadd132|ss'.
+ 0x52A9629B, // Large 'vfmadd|213pd'.
+ 0x52AE629B, // Large 'vfmadd|213ph'.
+ 0x52B3629B, // Large 'vfmadd|213ps'.
+ 0x532E629B, // Large 'vfmadd|213sd'.
+ 0x5333629B, // Large 'vfmadd|213sh'.
+ 0x5338629B, // Large 'vfmadd|213ss'.
+ 0x52B8629B, // Large 'vfmadd|231pd'.
+ 0x52BD629B, // Large 'vfmadd|231ph'.
+ 0x52C2629B, // Large 'vfmadd|231ps'.
+ 0x533D629B, // Large 'vfmadd|231sd'.
+ 0x5342629B, // Large 'vfmadd|231sh'.
+ 0x5347629B, // Large 'vfmadd|231ss'.
+ 0x367E629B, // Large 'vfmadd|cph'.
+ 0x3681629B, // Large 'vfmadd|csh'.
+ 0x22AC629B, // Large 'vfmadd|pd'.
+ 0x2282629B, // Large 'vfmadd|ps'.
+ 0x122B729B, // Large 'vfmadds|d'.
+ 0x1152729B, // Large 'vfmadds|s'.
+ 0x122BD29B, // Large 'vfmaddsub132p|d'.
+ 0x12A8D29B, // Large 'vfmaddsub132p|h'.
+ 0x1152D29B, // Large 'vfmaddsub132p|s'.
+ 0x52A9929B, // Large 'vfmaddsub|213pd'.
+ 0x52AE929B, // Large 'vfmaddsub|213ph'.
+ 0x52B3929B, // Large 'vfmaddsub|213ps'.
+ 0x52B8929B, // Large 'vfmaddsub|231pd'.
+ 0x52BD929B, // Large 'vfmaddsub|231ph'.
+ 0x52C2929B, // Large 'vfmaddsub|231ps'.
+ 0x22AC929B, // Large 'vfmaddsub|pd'.
+ 0x2282929B, // Large 'vfmaddsub|ps'.
+ 0x22AC9411, // Large 'vfmsub132|pd'.
+ 0x22A79411, // Large 'vfmsub132|ph'.
+ 0x22829411, // Large 'vfmsub132|ps'.
+ 0x231D9411, // Large 'vfmsub132|sd'.
+ 0x22DA9411, // Large 'vfmsub132|sh'.
+ 0x22229411, // Large 'vfmsub132|ss'.
+ 0x52A962C7, // Large 'vfmsub|213pd'.
+ 0x52AE62C7, // Large 'vfmsub|213ph'.
+ 0x52B362C7, // Large 'vfmsub|213ps'.
+ 0x532E62C7, // Large 'vfmsub|213sd'.
+ 0x533362C7, // Large 'vfmsub|213sh'.
+ 0x533862C7, // Large 'vfmsub|213ss'.
+ 0x52B862C7, // Large 'vfmsub|231pd'.
+ 0x52BD62C7, // Large 'vfmsub|231ph'.
+ 0x52C262C7, // Large 'vfmsub|231ps'.
+ 0x533D62C7, // Large 'vfmsub|231sd'.
+ 0x534262C7, // Large 'vfmsub|231sh'.
+ 0x534762C7, // Large 'vfmsub|231ss'.
+ 0x22ACC2C7, // Large 'vfmsubadd132|pd'.
+ 0x22A7C2C7, // Large 'vfmsubadd132|ph'.
+ 0x2282C2C7, // Large 'vfmsubadd132|ps'.
+ 0x52A992C7, // Large 'vfmsubadd|213pd'.
+ 0x52AE92C7, // Large 'vfmsubadd|213ph'.
+ 0x52B392C7, // Large 'vfmsubadd|213ps'.
+ 0x52B892C7, // Large 'vfmsubadd|231pd'.
+ 0x52BD92C7, // Large 'vfmsubadd|231ph'.
+ 0x52C292C7, // Large 'vfmsubadd|231ps'.
+ 0x22AC92C7, // Large 'vfmsubadd|pd'.
+ 0x228292C7, // Large 'vfmsubadd|ps'.
+ 0x22AC62C7, // Large 'vfmsub|pd'.
+ 0x228262C7, // Large 'vfmsub|ps'.
+ 0x231D62C7, // Large 'vfmsub|sd'.
+ 0x222262C7, // Large 'vfmsub|ss'.
+ 0x367E580F, // Large 'vfmul|cph'.
+ 0x3681580F, // Large 'vfmul|csh'.
+ 0x22ACA324, // Large 'vfnmadd132|pd'.
+ 0x22A7A324, // Large 'vfnmadd132|ph'.
+ 0x2282A324, // Large 'vfnmadd132|ps'.
+ 0x231DA324, // Large 'vfnmadd132|sd'.
+ 0x22DAA324, // Large 'vfnmadd132|sh'.
+ 0x2222A324, // Large 'vfnmadd132|ss'.
+ 0x52A97324, // Large 'vfnmadd|213pd'.
+ 0x52AE7324, // Large 'vfnmadd|213ph'.
+ 0x52B37324, // Large 'vfnmadd|213ps'.
+ 0x532E7324, // Large 'vfnmadd|213sd'.
+ 0x53337324, // Large 'vfnmadd|213sh'.
+ 0x53387324, // Large 'vfnmadd|213ss'.
+ 0x52B87324, // Large 'vfnmadd|231pd'.
+ 0x52BD7324, // Large 'vfnmadd|231ph'.
+ 0x52C27324, // Large 'vfnmadd|231ps'.
+ 0x533D7324, // Large 'vfnmadd|231sd'.
+ 0x53427324, // Large 'vfnmadd|231sh'.
+ 0x53477324, // Large 'vfnmadd|231ss'.
+ 0x22AC7324, // Large 'vfnmadd|pd'.
+ 0x22827324, // Large 'vfnmadd|ps'.
+ 0x231D7324, // Large 'vfnmadd|sd'.
+ 0x22227324, // Large 'vfnmadd|ss'.
+ 0x22ACA34C, // Large 'vfnmsub132|pd'.
+ 0x22A7A34C, // Large 'vfnmsub132|ph'.
+ 0x2282A34C, // Large 'vfnmsub132|ps'.
+ 0x231DA34C, // Large 'vfnmsub132|sd'.
+ 0x22DAA34C, // Large 'vfnmsub132|sh'.
+ 0x2222A34C, // Large 'vfnmsub132|ss'.
+ 0x52A9734C, // Large 'vfnmsub|213pd'.
+ 0x52AE734C, // Large 'vfnmsub|213ph'.
+ 0x52B3734C, // Large 'vfnmsub|213ps'.
+ 0x532E734C, // Large 'vfnmsub|213sd'.
+ 0x5333734C, // Large 'vfnmsub|213sh'.
+ 0x5338734C, // Large 'vfnmsub|213ss'.
+ 0x52B8734C, // Large 'vfnmsub|231pd'.
+ 0x52BD734C, // Large 'vfnmsub|231ph'.
+ 0x52C2734C, // Large 'vfnmsub|231ps'.
+ 0x533D734C, // Large 'vfnmsub|231sd'.
+ 0x5342734C, // Large 'vfnmsub|231sh'.
+ 0x5347734C, // Large 'vfnmsub|231ss'.
+ 0x22AC734C, // Large 'vfnmsub|pd'.
+ 0x2282734C, // Large 'vfnmsub|ps'.
+ 0x231D734C, // Large 'vfnmsub|sd'.
+ 0x2222734C, // Large 'vfnmsub|ss'.
+ 0x22AC8507, // Large 'vfpclass|pd'.
+ 0x22A78507, // Large 'vfpclass|ph'.
+ 0x22828507, // Large 'vfpclass|ps'.
+ 0x231D8507, // Large 'vfpclass|sd'.
+ 0x22DA8507, // Large 'vfpclass|sh'.
+ 0x22228507, // Large 'vfpclass|ss'.
+ 0x22AC5975, // Large 'vfrcz|pd'.
+ 0x22825975, // Large 'vfrcz|ps'.
+ 0x231D5975, // Large 'vfrcz|sd'.
+ 0x22225975, // Large 'vfrcz|ss'.
+ 0x22AC850F, // Large 'vgatherd|pd'.
+ 0x2282850F, // Large 'vgatherd|ps'.
+ 0x3478750F, // Large 'vgather|qpd'.
+ 0x347B750F, // Large 'vgather|qps'.
+ 0x22AC7684, // Large 'vgetexp|pd'.
+ 0x22A77684, // Large 'vgetexp|ph'.
+ 0x22827684, // Large 'vgetexp|ps'.
+ 0x231D7684, // Large 'vgetexp|sd'.
+ 0x22DA7684, // Large 'vgetexp|sh'.
+ 0x22227684, // Large 'vgetexp|ss'.
+ 0x33CA7517, // Large 'vgetman|tpd'.
+ 0x33D67517, // Large 'vgetman|tph'.
+ 0x33E17517, // Large 'vgetman|tps'.
+ 0x33E87517, // Large 'vgetman|tsd'.
+ 0x33F17517, // Large 'vgetman|tsh'.
+ 0x33FA7517, // Large 'vgetman|tss'.
+ 0x2215F206, // Large 'vgf2p8affineinv|qb'.
+ 0x2215C206, // Large 'vgf2p8affine|qb'.
+ 0x451E6206, // Large 'vgf2p8|mulb'.
+ 0x22AC597A, // Large 'vhadd|pd'.
+ 0x2282597A, // Large 'vhadd|ps'.
+ 0x22AC597F, // Large 'vhsub|pd'.
+ 0x2282597F, // Large 'vhsub|ps'.
+ 0x3274835C, // Large 'vinsertf|128'.
+ 0x622F6356, // Large 'vinser|tf32x4'.
+ 0x4248835C, // Large 'vinsertf|32x8'.
+ 0x4235835C, // Large 'vinsertf|64x2'.
+ 0x4239835C, // Large 'vinsertf|64x4'.
+ 0x4277735C, // Large 'vinsert|i128'.
+ 0x5242735C, // Large 'vinsert|i32x4'.
+ 0x5247735C, // Large 'vinsert|i32x8'.
+ 0x524C735C, // Large 'vinsert|i64x2'.
+ 0x5251735C, // Large 'vinsert|i64x4'.
+ 0x2282735C, // Large 'vinsert|ps'.
+ 0xAB121196, // Small 'vlddqu'.
+ 0x12287814, // Large 'vldmxcs|r'.
+ 0x12A2A41A, // Large 'vmaskmovdq|u'.
+ 0x22AC841A, // Large 'vmaskmov|pd'.
+ 0x2282841A, // Large 'vmaskmov|ps'.
+ 0x890C05B6, // Small 'vmaxpd'.
+ 0x910C05B6, // Small 'vmaxph'.
+ 0xA70C05B6, // Small 'vmaxps'.
+ 0x893C05B6, // Small 'vmaxsd'.
+ 0x913C05B6, // Small 'vmaxsh'.
+ 0xA73C05B6, // Small 'vmaxss'.
+ 0x98C08DB6, // Small 'vmcall'.
+ 0x25F95984, // Large 'vmcle|ar'.
+ 0x86EA99B6, // Small 'vmfunc'.
+ 0x236B5989, // Large 'vmgex|it'.
+ 0x890725B6, // Small 'vminpd'.
+ 0x910725B6, // Small 'vminph'.
+ 0xA70725B6, // Small 'vminps'.
+ 0x893725B6, // Small 'vminsd'.
+ 0x913725B6, // Small 'vminsh'.
+ 0xA73725B6, // Small 'vminss'.
+ 0x237E681B, // Large 'vmlaun|ch'.
+ 0x8817B1B6, // Small 'vmload'.
+ 0x38B9498E, // Large 'vmmc|all'.
+ 0x22AC5992, // Large 'vmova|pd'.
+ 0x22825992, // Large 'vmova|ps'.
+ 0x804B3DB6, // Small 'vmovd'.
+ 0x3821568B, // Large 'vmovd|dup'.
+ 0x0000768B, // Large 'vmovdqa'.
+ 0x2231768B, // Large 'vmovdqa|32'.
+ 0x2235768B, // Large 'vmovdqa|64'.
+ 0x12A2668B, // Large 'vmovdq|u'.
+ 0x3692668B, // Large 'vmovdq|u16'.
+ 0x3695668B, // Large 'vmovdq|u32'.
+ 0x3698668B, // Large 'vmovdq|u64'.
+ 0x2824668B, // Large 'vmovdq|u8'.
+ 0x37665826, // Large 'vmovh|lps'.
+ 0x22AC5826, // Large 'vmovh|pd'.
+ 0x22825826, // Large 'vmovh|ps'.
+ 0x2282682B, // Large 'vmovlh|ps'.
+ 0x22AC582B, // Large 'vmovl|pd'.
+ 0x2282582B, // Large 'vmovl|ps'.
+ 0x22AC769B, // Large 'vmovmsk|pd'.
+ 0x2282769B, // Large 'vmovmsk|ps'.
+ 0x23CF66A2, // Large 'vmovnt|dq'.
+ 0x368F66A2, // Large 'vmovnt|dqa'.
+ 0x22AC66A2, // Large 'vmovnt|pd'.
+ 0x228266A2, // Large 'vmovnt|ps'.
+ 0x811B3DB6, // Small 'vmovq'.
+ 0x893B3DB6, // Small 'vmovsd'.
+ 0x913B3DB6, // Small 'vmovsh'.
+ 0x240376A8, // Large 'vmovshd|up'.
+ 0x240376AF, // Large 'vmovsld|up'.
+ 0xA73B3DB6, // Small 'vmovss'.
+ 0x3604468B, // Large 'vmov|upd'.
+ 0x22825997, // Large 'vmovu|ps'.
+ 0x817B3DB6, // Small 'vmovw'.
+ 0x25786831, // Large 'vmpsad|bw'.
+ 0x35E2499C, // Large 'vmpt|rld'.
+ 0x35DE499C, // Large 'vmpt|rst'.
+ 0x8812C9B6, // Small 'vmread'.
+ 0x100F7837, // Large 'vmresum|e'.
+ 0x80EAC9B6, // Small 'vmrun'.
+ 0x8B60CDB6, // Small 'vmsave'.
+ 0x890655B6, // Small 'vmulpd'.
+ 0x910655B6, // Small 'vmulph'.
+ 0xA70655B6, // Small 'vmulps'.
+ 0x893655B6, // Small 'vmulsd'.
+ 0x913655B6, // Small 'vmulsh'.
+ 0xA73655B6, // Small 'vmulss'.
+ 0x22FD59A0, // Large 'vmwri|te'.
+ 0x8C67E1B6, // Small 'vmxoff'.
+ 0x80E7E1B6, // Small 'vmxon'.
+ 0x804849F6, // Small 'vorpd'.
+ 0x813849F6, // Small 'vorps'.
+ 0x122BC2F8, // Large 'vp2intersect|d'.
+ 0x1215C2F8, // Large 'vp2intersect|q'.
+ 0x85310616, // Small 'vpabsb'.
+ 0x89310616, // Small 'vpabsd'.
+ 0xA3310616, // Small 'vpabsq'.
+ 0xAF310616, // Small 'vpabsw'.
+ 0x126486B6, // Large 'vpackssd|w'.
+ 0x26BE76B6, // Large 'vpackss|wb'.
+ 0x36BC66C0, // Large 'vpacku|sdw'.
+ 0x36C666C0, // Large 'vpacku|swb'.
+ 0x84420616, // Small 'vpaddb'.
+ 0x88420616, // Small 'vpaddd'.
+ 0xA2420616, // Small 'vpaddq'.
+ 0x2786583E, // Large 'vpadd|sb'.
+ 0x2561583E, // Large 'vpadd|sw'.
+ 0x2786683E, // Large 'vpaddu|sb'.
+ 0x2561683E, // Large 'vpaddu|sw'.
+ 0xAE420616, // Small 'vpaddw'.
+ 0x12287844, // Large 'vpalign|r'.
+ 0x80470616, // Small 'vpand'.
+ 0x88470616, // Small 'vpandd'.
+ 0x9C470616, // Small 'vpandn'.
+ 0x237659A5, // Large 'vpand|nd'.
+ 0x28DF59A5, // Large 'vpand|nq'.
+ 0xA2470616, // Small 'vpandq'.
+ 0x847B0616, // Small 'vpavgb'.
+ 0xAE7B0616, // Small 'vpavgw'.
+ 0x122B76C9, // Large 'vpblend|d'.
+ 0x226176C9, // Large 'vpblend|mb'.
+ 0x26D076C9, // Large 'vpblend|md'.
+ 0x121586C9, // Large 'vpblendm|q'.
+ 0x126486C9, // Large 'vpblendm|w'.
+ 0x200376C9, // Large 'vpblend|vb'.
+ 0x126476C9, // Large 'vpblend|w'.
+ 0x1004B256, // Large 'vpbroadcast|b'.
+ 0x122BB256, // Large 'vpbroadcast|d'.
+ 0x1215E256, // Large 'vpbroadcastmb2|q'.
+ 0x3264C256, // Large 'vpbroadcastm|w2d'.
+ 0x1215B256, // Large 'vpbroadcast|q'.
+ 0x1264B256, // Large 'vpbroadcast|w'.
+ 0x44626522, // Large 'vpclmu|lqdq'.
+ 0xACF68E16, // Small 'vpcmov'.
+ 0x85068E16, // Small 'vpcmpb'.
+ 0x89068E16, // Small 'vpcmpd'.
+ 0x22156528, // Large 'vpcmpe|qb'.
+ 0x24576528, // Large 'vpcmpe|qd'.
+ 0x23D06528, // Large 'vpcmpe|qq'.
+ 0x27256528, // Large 'vpcmpe|qw'.
+ 0x120F9528, // Large 'vpcmpestr|i'.
+ 0x10019528, // Large 'vpcmpestr|m'.
+ 0x384B5528, // Large 'vpcmp|gtb'.
+ 0x384E5528, // Large 'vpcmp|gtd'.
+ 0x38515528, // Large 'vpcmp|gtq'.
+ 0x38545528, // Large 'vpcmp|gtw'.
+ 0x120F9531, // Large 'vpcmpistr|i'.
+ 0x10019531, // Large 'vpcmpistr|m'.
+ 0xA3068E16, // Small 'vpcmpq'.
+ 0x22A25528, // Large 'vpcmp|ub'.
+ 0x23CE5528, // Large 'vpcmp|ud'.
+ 0x23DA5528, // Large 'vpcmp|uq'.
+ 0x264C5528, // Large 'vpcmp|uw'.
+ 0xAF068E16, // Small 'vpcmpw'.
+ 0x84D78E16, // Small 'vpcomb'.
+ 0x88D78E16, // Small 'vpcomd'.
+ 0x1004A424, // Large 'vpcompress|b'.
+ 0x122BA424, // Large 'vpcompress|d'.
+ 0x1215A424, // Large 'vpcompress|q'.
+ 0x1264A424, // Large 'vpcompress|w'.
+ 0xA2D78E16, // Small 'vpcomq'.
+ 0x22A25424, // Large 'vpcom|ub'.
+ 0x23CE5424, // Large 'vpcom|ud'.
+ 0x23DA5424, // Large 'vpcom|uq'.
+ 0x264C5424, // Large 'vpcom|uw'.
+ 0xAED78E16, // Small 'vpcomw'.
+ 0x122BA42E, // Large 'vpconflict|d'.
+ 0x1215A42E, // Large 'vpconflict|q'.
+ 0x122B76D2, // Large 'vpdpbss|d'.
+ 0x22A076D2, // Large 'vpdpbss|ds'.
+ 0x23CE66D2, // Large 'vpdpbs|ud'.
+ 0x36D966D2, // Large 'vpdpbs|uds'.
+ 0x122B76DC, // Large 'vpdpbus|d'.
+ 0x22A076DC, // Large 'vpdpbus|ds'.
+ 0x23CE66DC, // Large 'vpdpbu|ud'.
+ 0x36D966DC, // Large 'vpdpbu|uds'.
+ 0x122B76E3, // Large 'vpdpwss|d'.
+ 0x22A076E3, // Large 'vpdpwss|ds'.
+ 0x23CE66E3, // Large 'vpdpws|ud'.
+ 0x36D966E3, // Large 'vpdpws|uds'.
+ 0x122B76EA, // Large 'vpdpwus|d'.
+ 0x22A076EA, // Large 'vpdpwus|ds'.
+ 0x23CE66EA, // Large 'vpdpwu|ud'.
+ 0x36D966EA, // Large 'vpdpwu|uds'.
+ 0x3274753A, // Large 'vperm2f|128'.
+ 0x4277653A, // Large 'vperm2|i128'.
+ 0x84D91616, // Small 'vpermb'.
+ 0x88D91616, // Small 'vpermd'.
+ 0x28576541, // Large 'vpermi|2b'.
+ 0x22656541, // Large 'vpermi|2d'.
+ 0x36F16541, // Large 'vpermi|2pd'.
+ 0x32816541, // Large 'vpermi|2ps'.
+ 0x24E46541, // Large 'vpermi|2q'.
+ 0x22636541, // Large 'vpermi|2w'.
+ 0x22AC8541, // Large 'vpermil2|pd'.
+ 0x22828541, // Large 'vpermil2|ps'.
+ 0x22AC7541, // Large 'vpermil|pd'.
+ 0x22827541, // Large 'vpermil|ps'.
+ 0x22AC553A, // Large 'vperm|pd'.
+ 0x2282553A, // Large 'vperm|ps'.
+ 0xA2D91616, // Small 'vpermq'.
+ 0x285766F4, // Large 'vpermt|2b'.
+ 0x226566F4, // Large 'vpermt|2d'.
+ 0x36F166F4, // Large 'vpermt|2pd'.
+ 0x328166F4, // Large 'vpermt|2ps'.
+ 0x24E466F4, // Large 'vpermt|2q'.
+ 0x226366F4, // Large 'vpermt|2w'.
+ 0xAED91616, // Small 'vpermw'.
+ 0x266376FA, // Large 'vpexpan|db'.
+ 0x229F76FA, // Large 'vpexpan|dd'.
+ 0x23CF76FA, // Large 'vpexpan|dq'.
+ 0x26BD76FA, // Large 'vpexpan|dw'.
+ 0x37BF46FA, // Large 'vpex|trb'.
+ 0x247659AA, // Large 'vpext|rd'.
+ 0x245659AA, // Large 'vpext|rq'.
+ 0x29AF59AA, // Large 'vpext|rw'.
+ 0x229F8549, // Large 'vpgather|dd'.
+ 0x23CF8549, // Large 'vpgather|dq'.
+ 0x24578549, // Large 'vpgather|qd'.
+ 0x23D08549, // Large 'vpgather|qq'.
+ 0x28596701, // Large 'vphadd|bd'.
+ 0x285B6701, // Large 'vphadd|bq'.
+ 0x25786701, // Large 'vphadd|bw'.
+ 0x122B6701, // Large 'vphadd|d'.
+ 0x23CF6701, // Large 'vphadd|dq'.
+ 0x25616701, // Large 'vphadd|sw'.
+ 0x122B8701, // Large 'vphaddub|d'.
+ 0x12158701, // Large 'vphaddub|q'.
+ 0x12648701, // Large 'vphaddub|w'.
+ 0x23CF7701, // Large 'vphaddu|dq'.
+ 0x257A7701, // Large 'vphaddu|wd'.
+ 0x27097701, // Large 'vphaddu|wq'.
+ 0x12646701, // Large 'vphadd|w'.
+ 0x257A6701, // Large 'vphadd|wd'.
+ 0x27096701, // Large 'vphadd|wq'.
+ 0x1264A438, // Large 'vphminposu|w'.
+ 0x2578685D, // Large 'vphsub|bw'.
+ 0x122B685D, // Large 'vphsub|d'.
+ 0x23CF685D, // Large 'vphsub|dq'.
+ 0x2561685D, // Large 'vphsub|sw'.
+ 0x1264685D, // Large 'vphsub|w'.
+ 0x257A685D, // Large 'vphsub|wd'.
+ 0x27C059B1, // Large 'vpins|rb'.
+ 0x247659B1, // Large 'vpins|rd'.
+ 0x245659B1, // Large 'vpins|rq'.
+ 0x29AF59B1, // Large 'vpins|rw'.
+ 0x26266863, // Large 'vplzcn|td'.
+ 0x236C6863, // Large 'vplzcn|tq'.
+ 0x229F6551, // Large 'vpmacs|dd'.
+ 0x370B6551, // Large 'vpmacs|dqh'.
+ 0x35806551, // Large 'vpmacs|dql'.
+ 0x122B8551, // Large 'vpmacssd|d'.
+ 0x12A89551, // Large 'vpmacssdq|h'.
+ 0x10279551, // Large 'vpmacssdq|l'.
+ 0x257A7551, // Large 'vpmacss|wd'.
+ 0x25797551, // Large 'vpmacss|ww'.
+ 0x257A6551, // Large 'vpmacs|wd'.
+ 0x25796551, // Large 'vpmacs|ww'.
+ 0x122B955A, // Large 'vpmadcssw|d'.
+ 0x257A755A, // Large 'vpmadcs|wd'.
+ 0x23DA9442, // Large 'vpmadd52h|uq'.
+ 0x344B8442, // Large 'vpmadd52|luq'.
+ 0x45636442, // Large 'vpmadd|ubsw'.
+ 0x257A6442, // Large 'vpmadd|wd'.
+ 0x641D4442, // Large 'vpma|skmovd'.
+ 0x22148567, // Large 'vpmaskmo|vq'.
+ 0x278659B6, // Large 'vpmax|sb'.
+ 0x231D59B6, // Large 'vpmax|sd'.
+ 0x258759B6, // Large 'vpmax|sq'.
+ 0x256159B6, // Large 'vpmax|sw'.
+ 0x22A259B6, // Large 'vpmax|ub'.
+ 0x23CE59B6, // Large 'vpmax|ud'.
+ 0x23DA59B6, // Large 'vpmax|uq'.
+ 0x264C59B6, // Large 'vpmax|uw'.
+ 0x278659BB, // Large 'vpmin|sb'.
+ 0x231D59BB, // Large 'vpmin|sd'.
+ 0x258759BB, // Large 'vpmin|sq'.
+ 0x256159BB, // Large 'vpmin|sw'.
+ 0x22A259BB, // Large 'vpmin|ub'.
+ 0x23CE59BB, // Large 'vpmin|ud'.
+ 0x23DA59BB, // Large 'vpmin|uq'.
+ 0x264C59BB, // Large 'vpmin|uw'.
+ 0x3869570E, // Large 'vpmov|b2m'.
+ 0x386C570E, // Large 'vpmov|d2m'.
+ 0x2663570E, // Large 'vpmov|db'.
+ 0x26BD570E, // Large 'vpmov|dw'.
+ 0x2857670E, // Large 'vpmovm|2b'.
+ 0x2265670E, // Large 'vpmovm|2d'.
+ 0x24E4670E, // Large 'vpmovm|2q'.
+ 0x2263670E, // Large 'vpmovm|2w'.
+ 0x1004870E, // Large 'vpmovmsk|b'.
+ 0x386F570E, // Large 'vpmov|q2m'.
+ 0x2215570E, // Large 'vpmov|qb'.
+ 0x2457570E, // Large 'vpmov|qd'.
+ 0x2725570E, // Large 'vpmov|qw'.
+ 0x26636716, // Large 'vpmovs|db'.
+ 0x26BD6716, // Large 'vpmovs|dw'.
+ 0x22156716, // Large 'vpmovs|qb'.
+ 0x24576716, // Large 'vpmovs|qd'.
+ 0x27256716, // Large 'vpmovs|qw'.
+ 0x26BE6716, // Large 'vpmovs|wb'.
+ 0x122B8716, // Large 'vpmovsxb|d'.
+ 0x12158716, // Large 'vpmovsxb|q'.
+ 0x12648716, // Large 'vpmovsxb|w'.
+ 0x23CF7716, // Large 'vpmovsx|dq'.
+ 0x257A7716, // Large 'vpmovsx|wd'.
+ 0x27097716, // Large 'vpmovsx|wq'.
+ 0x2663771E, // Large 'vpmovus|db'.
+ 0x26BD771E, // Large 'vpmovus|dw'.
+ 0x2215771E, // Large 'vpmovus|qb'.
+ 0x2457771E, // Large 'vpmovus|qd'.
+ 0x2725771E, // Large 'vpmovus|qw'.
+ 0x26BE771E, // Large 'vpmovus|wb'.
+ 0x3872570E, // Large 'vpmov|w2m'.
+ 0x26BE570E, // Large 'vpmov|wb'.
+ 0x122B8727, // Large 'vpmovzxb|d'.
+ 0x12158727, // Large 'vpmovzxb|q'.
+ 0x12648727, // Large 'vpmovzxb|w'.
+ 0x23CF7727, // Large 'vpmovzx|dq'.
+ 0x257A7727, // Large 'vpmovzx|wd'.
+ 0x27097727, // Large 'vpmovzx|wq'.
+ 0x23CF52D3, // Large 'vpmul|dq'.
+ 0x2561772F, // Large 'vpmulhr|sw'.
+ 0x264C672F, // Large 'vpmulh|uw'.
+ 0x1264672F, // Large 'vpmulh|w'.
+ 0x257F52D3, // Large 'vpmul|ld'.
+ 0x246252D3, // Large 'vpmul|lq'.
+ 0x258252D3, // Large 'vpmul|lw'.
+ 0x2215C2D3, // Large 'vpmultishift|qb'.
+ 0x33CE52D3, // Large 'vpmul|udq'.
+ 0x21546875, // Large 'vpopcn|tb'.
+ 0x26266875, // Large 'vpopcn|td'.
+ 0x236C6875, // Large 'vpopcn|tq'.
+ 0x27B86875, // Large 'vpopcn|tw'.
+ 0x80093E16, // Small 'vpor'.
+ 0x80493E16, // Small 'vpord'.
+ 0x81193E16, // Small 'vporq'.
+ 0x9B22C216, // Small 'vpperm'.
+ 0x88C7CA16, // Small 'vprold'.
+ 0xA2C7CA16, // Small 'vprolq'.
+ 0x242159C0, // Large 'vprol|vd'.
+ 0x221459C0, // Large 'vprol|vq'.
+ 0x8927CA16, // Small 'vprord'.
+ 0xA327CA16, // Small 'vprorq'.
+ 0x242159C5, // Large 'vpror|vd'.
+ 0x221459C5, // Large 'vpror|vq'.
+ 0x8547CA16, // Small 'vprotb'.
+ 0x8947CA16, // Small 'vprotd'.
+ 0xA347CA16, // Small 'vprotq'.
+ 0xAF47CA16, // Small 'vprotw'.
+ 0x257859CA, // Large 'vpsad|bw'.
+ 0x229F944E, // Large 'vpscatter|dd'.
+ 0x23CF944E, // Large 'vpscatter|dq'.
+ 0x2457944E, // Large 'vpscatter|qd'.
+ 0x1215A44E, // Large 'vpscatterq|q'.
+ 0x84144E16, // Small 'vpshab'.
+ 0x88144E16, // Small 'vpshad'.
+ 0xA2144E16, // Small 'vpshaq'.
+ 0xAE144E16, // Small 'vpshaw'.
+ 0x84C44E16, // Small 'vpshlb'.
+ 0x88C44E16, // Small 'vpshld'.
+ 0x122B687B, // Large 'vpshld|d'.
+ 0x1215687B, // Large 'vpshld|q'.
+ 0x3668587B, // Large 'vpshl|dvd'.
+ 0x3880587B, // Large 'vpshl|dvq'.
+ 0x1264787B, // Large 'vpshldv|w'.
+ 0x1264687B, // Large 'vpshld|w'.
+ 0xA2C44E16, // Small 'vpshlq'.
+ 0xAEC44E16, // Small 'vpshlw'.
+ 0x122B6883, // Large 'vpshrd|d'.
+ 0x12156883, // Large 'vpshrd|q'.
+ 0x36685883, // Large 'vpshr|dvd'.
+ 0x38805883, // Large 'vpshr|dvq'.
+ 0x38885883, // Large 'vpshr|dvw'.
+ 0x12646883, // Large 'vpshrd|w'.
+ 0x00007364, // Large 'vpshufb'.
+ 0x2261A364, // Large 'vpshufbitq|mb'.
+ 0x122B6364, // Large 'vpshuf|d'.
+ 0x288B6364, // Large 'vpshuf|hw'.
+ 0x25826364, // Large 'vpshuf|lw'.
+ 0x204859CF, // Large 'vpsig|nb'.
+ 0x237659CF, // Large 'vpsig|nd'.
+ 0x28C159CF, // Large 'vpsig|nw'.
+ 0x88C64E16, // Small 'vpslld'.
+ 0x357F49D4, // Large 'vpsl|ldq'.
+ 0xA2C64E16, // Small 'vpsllq'.
+ 0x242159D8, // Large 'vpsll|vd'.
+ 0x221459D8, // Large 'vpsll|vq'.
+ 0x288959D8, // Large 'vpsll|vw'.
+ 0xAEC64E16, // Small 'vpsllw'.
+ 0x88194E16, // Small 'vpsrad'.
+ 0xA2194E16, // Small 'vpsraq'.
+ 0x242159DD, // Large 'vpsra|vd'.
+ 0x221459DD, // Large 'vpsra|vq'.
+ 0x288959DD, // Large 'vpsra|vw'.
+ 0xAE194E16, // Small 'vpsraw'.
+ 0x88C94E16, // Small 'vpsrld'.
+ 0x357F49DD, // Large 'vpsr|ldq'.
+ 0xA2C94E16, // Small 'vpsrlq'.
+ 0x242159E2, // Large 'vpsrl|vd'.
+ 0x221459E2, // Large 'vpsrl|vq'.
+ 0x288959E2, // Large 'vpsrl|vw'.
+ 0xAEC94E16, // Small 'vpsrlw'.
+ 0x842ACE16, // Small 'vpsubb'.
+ 0x882ACE16, // Small 'vpsubd'.
+ 0xA22ACE16, // Small 'vpsubq'.
+ 0x2786588D, // Large 'vpsub|sb'.
+ 0x2561588D, // Large 'vpsub|sw'.
+ 0x2786688D, // Large 'vpsubu|sb'.
+ 0x2561688D, // Large 'vpsubu|sw'.
+ 0xAE2ACE16, // Small 'vpsubw'.
+ 0x122B956F, // Large 'vpternlog|d'.
+ 0x1215956F, // Large 'vpternlog|q'.
+ 0xA932D216, // Small 'vptest'.
+ 0x22616736, // Large 'vptest|mb'.
+ 0x26D06736, // Large 'vptest|md'.
+ 0x273D6736, // Large 'vptest|mq'.
+ 0x28716736, // Large 'vptest|mw'.
+ 0x22617736, // Large 'vptestn|mb'.
+ 0x26D07736, // Large 'vptestn|md'.
+ 0x273D7736, // Large 'vptestn|mq'.
+ 0x12648736, // Large 'vptestnm|w'.
+ 0x25788459, // Large 'vpunpckh|bw'.
+ 0x23CF8459, // Large 'vpunpckh|dq'.
+ 0x23CF9459, // Large 'vpunpckhq|dq'.
+ 0x257A8459, // Large 'vpunpckh|wd'.
+ 0x357C7459, // Large 'vpunpck|lbw'.
+ 0x357F7459, // Large 'vpunpck|ldq'.
+ 0x44627459, // Large 'vpunpck|lqdq'.
+ 0x35827459, // Large 'vpunpck|lwd'.
+ 0x8127E216, // Small 'vpxor'.
+ 0x8927E216, // Small 'vpxord'.
+ 0xA327E216, // Small 'vpxorq'.
+ 0x22AC6893, // Large 'vrange|pd'.
+ 0x22826893, // Large 'vrange|ps'.
+ 0x231D6893, // Large 'vrange|sd'.
+ 0x22226893, // Large 'vrange|ss'.
+ 0x22AC6899, // Large 'vrcp14|pd'.
+ 0x22826899, // Large 'vrcp14|ps'.
+ 0x231D6899, // Large 'vrcp14|sd'.
+ 0x22226899, // Large 'vrcp14|ss'.
+ 0x91080E56, // Small 'vrcpph'.
+ 0xA7080E56, // Small 'vrcpps'.
+ 0x91380E56, // Small 'vrcpsh'.
+ 0xA7380E56, // Small 'vrcpss'.
+ 0x22AC773F, // Large 'vreduce|pd'.
+ 0x22A7773F, // Large 'vreduce|ph'.
+ 0x2282773F, // Large 'vreduce|ps'.
+ 0x231D773F, // Large 'vreduce|sd'.
+ 0x22DA773F, // Large 'vreduce|sh'.
+ 0x2222773F, // Large 'vreduce|ss'.
+ 0x22AC9466, // Large 'vrndscale|pd'.
+ 0x22A79466, // Large 'vrndscale|ph'.
+ 0x22829466, // Large 'vrndscale|ps'.
+ 0x231D9466, // Large 'vrndscale|sd'.
+ 0x22DA9466, // Large 'vrndscale|sh'.
+ 0x22229466, // Large 'vrndscale|ss'.
+ 0x22AC689F, // Large 'vround|pd'.
+ 0x2282689F, // Large 'vround|ps'.
+ 0x231D689F, // Large 'vround|sd'.
+ 0x2222689F, // Large 'vround|ss'.
+ 0x22AC8585, // Large 'vrsqrt14|pd'.
+ 0x22828585, // Large 'vrsqrt14|ps'.
+ 0x231D8585, // Large 'vrsqrt14|sd'.
+ 0x22228585, // Large 'vrsqrt14|ss'.
+ 0x22A76585, // Large 'vrsqrt|ph'.
+ 0x22826585, // Large 'vrsqrt|ps'.
+ 0x22DA6585, // Large 'vrsqrt|sh'.
+ 0x22226585, // Large 'vrsqrt|ss'.
+ 0x22AC7746, // Large 'vscalef|pd'.
+ 0x22A77746, // Large 'vscalef|ph'.
+ 0x22827746, // Large 'vscalef|ps'.
+ 0x231D7746, // Large 'vscalef|sd'.
+ 0x22DA7746, // Large 'vscalef|sh'.
+ 0x22227746, // Large 'vscalef|ss'.
+ 0x22AC946F, // Large 'vscatterd|pd'.
+ 0x2282946F, // Large 'vscatterd|ps'.
+ 0x3478846F, // Large 'vscatter|qpd'.
+ 0x347B846F, // Large 'vscatter|qps'.
+ 0x447E736E, // Large 'vsha512|msg1'.
+ 0x4482736E, // Large 'vsha512|msg2'.
+ 0x2283A36E, // Large 'vsha512rnd|s2'.
+ 0x5230558D, // Large 'vshuf|f32x4'.
+ 0x42356592, // Large 'vshuff|64x2'.
+ 0x5242558D, // Large 'vshuf|i32x4'.
+ 0x524C558D, // Large 'vshuf|i64x2'.
+ 0x22AC558D, // Large 'vshuf|pd'.
+ 0x2282558D, // Large 'vshuf|ps'.
+ 0x447E474D, // Large 'vsm3|msg1'.
+ 0x4482474D, // Large 'vsm3|msg2'.
+ 0x2283774D, // Large 'vsm3rnd|s2'.
+ 0x123478A5, // Large 'vsm4key|4'.
+ 0x12348754, // Large 'vsm4rnds|4'.
+ 0x33CA49E7, // Large 'vsqr|tpd'.
+ 0x33D649E7, // Large 'vsqr|tph'.
+ 0x33E149E7, // Large 'vsqr|tps'.
+ 0x33E849E7, // Large 'vsqr|tsd'.
+ 0x33F149E7, // Large 'vsqr|tsh'.
+ 0x33FA49E7, // Large 'vsqr|tss'.
+ 0x122878AC, // Large 'vstmxcs|r'.
+ 0x89015676, // Small 'vsubpd'.
+ 0x91015676, // Small 'vsubph'.
+ 0xA7015676, // Small 'vsubps'.
+ 0x89315676, // Small 'vsubsd'.
+ 0x91315676, // Small 'vsubsh'.
+ 0xA7315676, // Small 'vsubss'.
+ 0x33CA49EB, // Large 'vtes|tpd'.
+ 0x33E149EB, // Large 'vtes|tps'.
+ 0x231D68B3, // Large 'vucomi|sd'.
+ 0x22DA68B3, // Large 'vucomi|sh'.
+ 0x222268B3, // Large 'vucomi|ss'.
+ 0x22AC775C, // Large 'vunpckh|pd'.
+ 0x2282775C, // Large 'vunpckh|ps'.
+ 0x3763675C, // Large 'vunpck|lpd'.
+ 0x3766675C, // Large 'vunpck|lps'.
+ 0x89093F16, // Small 'vxorpd'.
+ 0xA7093F16, // Small 'vxorps'.
+ 0x38B95598, // Large 'vzero|all'.
+ 0x353B7598, // Large 'vzeroup|per'.
+ 0x89672457, // Small 'wbinvd'.
+ 0x242168BC, // Large 'wbnoin|vd'.
+ 0x317058C2, // Large 'wrfsb|ase'.
+ 0x317058C7, // Large 'wrgsb|ase'.
+ 0x8129B657, // Small 'wrmsr'.
+ 0x8049CE57, // Small 'wrssd'.
+ 0x8119CE57, // Small 'wrssq'.
+ 0x8939D657, // Small 'wrussd'.
+ 0xA339D657, // Small 'wrussq'.
+ 0xA9278838, // Small 'xabort'.
+ 0x80021038, // Small 'xadd'.
+ 0x9C939458, // Small 'xbegin'.
+ 0x8003A078, // Small 'xchg'.
+ 0x800238B8, // Small 'xend'.
+ 0xAC2A14F8, // Small 'xgetbv'.
+ 0x802A0598, // Small 'xlatb'.
+ 0x800049F8, // Small 'xor'.
+ 0x804849F8, // Small 'xorpd'.
+ 0x813849F8, // Small 'xorps'.
+ 0x121B8769, // Large 'xresldtr|k'.
+ 0xA4FA4E58, // Small 'xrstor'.
+ 0x223565DD, // Large 'xrstor|64'.
+ 0x115265DD, // Large 'xrstor|s'.
+ 0x377165DD, // Large 'xrstor|s64'.
+ 0x805B0678, // Small 'xsave'.
+ 0x2235559F, // Large 'xsave|64'.
+ 0x865B0678, // Small 'xsavec'.
+ 0x38CC559F, // Large 'xsave|c64'.
+ 0x0000859F, // Large 'xsaveopt'.
+ 0x2235859F, // Large 'xsaveopt|64'.
+ 0xA65B0678, // Small 'xsaves'.
+ 0x3771559F, // Large 'xsave|s64'.
+ 0xAC2A1678, // Small 'xsetbv'.
+ 0x121B8774, // Large 'xsusldtr|k'.
+ 0x81499698 // Small 'xtest'.
+};
+
+const char InstDB::alias_name_string_table[] =
+ "\x63\x6D\x6F\x76\x6E\x61\x65\x67\x65";
+
+
+const uint32_t InstDB::alias_name_index_table[] = {
+ 0x801B3DA3, // Small 'cmova'.
+ 0x8A1B3DA3, // Small 'cmovae'.
+ 0x803B3DA3, // Small 'cmovc'.
+ 0x805B3DA3, // Small 'cmove'.
+ 0x807B3DA3, // Small 'cmovg'.
+ 0x8A7B3DA3, // Small 'cmovge'.
+ 0x82EB3DA3, // Small 'cmovna'.
+ 0x00007000, // Large 'cmovnae'.
+ 0x86EB3DA3, // Small 'cmovnc'.
+ 0x8AEB3DA3, // Small 'cmovne'.
+ 0x8EEB3DA3, // Small 'cmovng'.
+ 0x20075000, // Large 'cmovn|ge'.
+ 0x8B0B3DA3, // Small 'cmovpe'.
+ 0x9F0B3DA3, // Small 'cmovpo'.
+ 0x8000002A, // Small 'ja'.
+ 0x8000142A, // Small 'jae'.
+ 0x8000006A, // Small 'jc'.
+ 0x800000AA, // Small 'je'.
+ 0x800000EA, // Small 'jg'.
+ 0x800014EA, // Small 'jge'.
+ 0x800005CA, // Small 'jna'.
+ 0x800285CA, // Small 'jnae'.
+ 0x80000DCA, // Small 'jnc'.
+ 0x800015CA, // Small 'jne'.
+ 0x80001DCA, // Small 'jng'.
+ 0x80029DCA, // Small 'jnge'.
+ 0x8000160A, // Small 'jpe'.
+ 0x80003E0A, // Small 'jpo'.
+ 0x80003033, // Small 'sal'.
+ 0x8000D0B3, // Small 'seta'.
+ 0x8050D0B3, // Small 'setae'.
+ 0x8001D0B3, // Small 'setc'.
+ 0x8002D0B3, // Small 'sete'.
+ 0x8003D0B3, // Small 'setg'.
+ 0x8053D0B3, // Small 'setge'.
+ 0x801750B3, // Small 'setna'.
+ 0x8A1750B3, // Small 'setnae'.
+ 0x803750B3, // Small 'setnc'.
+ 0x805750B3, // Small 'setne'.
+ 0x807750B3, // Small 'setng'.
+ 0x8A7750B3, // Small 'setnge'.
+ 0x805850B3, // Small 'setpe'.
+ 0x80F850B3, // Small 'setpo'.
+ 0x800A2437 // Small 'wait'.
+};
+
+const uint32_t InstDB::alias_index_to_inst_id_table[] = {
+ Inst::kIdCmovnbe, // #0
+ Inst::kIdCmovnb, // #1
+ Inst::kIdCmovb, // #2
+ Inst::kIdCmovz, // #3
+ Inst::kIdCmovnle, // #4
+ Inst::kIdCmovnl, // #5
+ Inst::kIdCmovbe, // #6
+ Inst::kIdCmovb, // #7
+ Inst::kIdCmovnb, // #8
+ Inst::kIdCmovnz, // #9
+ Inst::kIdCmovle, // #10
+ Inst::kIdCmovl, // #11
+ Inst::kIdCmovp, // #12
+ Inst::kIdCmovnp, // #13
+ Inst::kIdJnbe, // #14
+ Inst::kIdJnb, // #15
+ Inst::kIdJb, // #16
+ Inst::kIdJz, // #17
+ Inst::kIdJnle, // #18
+ Inst::kIdJnl, // #19
+ Inst::kIdJbe, // #20
+ Inst::kIdJb, // #21
+ Inst::kIdJnb, // #22
+ Inst::kIdJnz, // #23
+ Inst::kIdJle, // #24
+ Inst::kIdJl, // #25
+ Inst::kIdJp, // #26
+ Inst::kIdJnp, // #27
+ Inst::kIdShl, // #28
+ Inst::kIdSetnbe, // #29
+ Inst::kIdSetnb, // #30
+ Inst::kIdSetb, // #31
+ Inst::kIdSetz, // #32
+ Inst::kIdSetnle, // #33
+ Inst::kIdSetnl, // #34
+ Inst::kIdSetbe, // #35
+ Inst::kIdSetb, // #36
+ Inst::kIdSetnb, // #37
+ Inst::kIdSetnz, // #38
+ Inst::kIdSetle, // #39
+ Inst::kIdSetl, // #40
+ Inst::kIdSetp, // #41
+ Inst::kIdSetnp, // #42
+ Inst::kIdFwait // #43
+};
+// ----------------------------------------------------------------------------
+// ${NameData:End}
+#endif // !ASMJIT_NO_TEXT
+
+// x86::InstDB - InstSignature & OpSignature
+// =========================================
+
+#ifndef ASMJIT_NO_INTROSPECTION
+// ${InstSignatureTable:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \
+ { count, uint8_t(x86 ? uint8_t(InstDB::Mode::kX86) : uint8_t(0)) | \
+ (x64 ? uint8_t(InstDB::Mode::kX64) : uint8_t(0)) , \
+ implicit, \
+ 0, \
+ { o0, o1, o2, o3, o4, o5 } \
+ }
+const InstDB::InstSignature InstDB::_inst_signature_table[] = {
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #0 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 3 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem|sreg, r16}
+ ROW(2, 1, 1, 0, 5 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem|sreg, r32}
+ ROW(2, 0, 1, 0, 7 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem|sreg|creg|dreg, r64}
+ ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8, i8|u8}
+ ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
+ ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
+ ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64, i32}
+ ROW(2, 1, 1, 0, 2 , 17 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
+ ROW(2, 1, 1, 0, 4 , 18 , 0 , 0 , 0 , 0 ), // {r16, m16|mem|sreg}
+ ROW(2, 1, 1, 0, 6 , 19 , 0 , 0 , 0 , 0 ), // {r32, m32|mem|sreg}
+ ROW(2, 0, 1, 0, 8 , 20 , 0 , 0 , 0 , 0 ), // {r64, m64|mem|i64|u64|sreg|creg|dreg}
+ ROW(2, 1, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg}
+ ROW(2, 1, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg}
+ ROW(2, 0, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg}
+ ROW(2, 1, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem}
+ ROW(2, 1, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem}
+ ROW(2, 0, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem}
+ ROW(2, 1, 0, 0, 6 , 23 , 0 , 0 , 0 , 0 ), // {r32, creg|dreg}
+ ROW(2, 1, 0, 0, 23 , 6 , 0 , 0 , 0 , 0 ), // {creg|dreg, r32}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #20 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8, i8|u8}
+ ROW(2, 1, 1, 0, 27 , 28 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32, i8}
+ ROW(2, 0, 1, 0, 15 , 29 , 0 , 0 , 0 , 0 ), // {r64|m64, i8|i32}
+ ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
+ ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
+ ROW(2, 1, 1, 0, 2 , 17 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
+ ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
+ ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
+ ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
+ ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #33 {r8lo|r8hi|m8, i8|u8}
+ ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
+ ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
+ ROW(2, 0, 1, 0, 8 , 32 , 0 , 0 , 0 , 0 ), // {r64, u32|i32|i8|r64|m64|mem}
+ ROW(2, 0, 1, 0, 33 , 29 , 0 , 0 , 0 , 0 ), // {m64, i32|i8}
+ ROW(2, 1, 1, 0, 27 , 28 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32, i8}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 31 , 8 , 0 , 0 , 0 , 0 ), // #42 {m64|mem, r64}
+ ROW(2, 1, 1, 0, 2 , 17 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
+ ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
+ ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #46 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 2 , 34 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem|i8|u8}
+ ROW(2, 1, 1, 0, 4 , 35 , 0 , 0 , 0 , 0 ), // {r16, m16|mem|i8|i16|u16}
+ ROW(2, 1, 1, 0, 6 , 36 , 0 , 0 , 0 , 0 ), // {r32, m32|mem|i8|i32|u32}
+ ROW(2, 0, 1, 0, 8 , 37 , 0 , 0 , 0 , 0 ), // {r64, m64|mem|i8|i32}
+ ROW(2, 1, 1, 0, 38 , 10 , 0 , 0 , 0 , 0 ), // {m8, i8|u8}
+ ROW(2, 1, 1, 0, 39 , 28 , 0 , 0 , 0 , 0 ), // {m16|m32, i8}
+ ROW(2, 0, 1, 0, 33 , 29 , 0 , 0 , 0 , 0 ), // {m64, i8|i32}
+ ROW(2, 1, 1, 0, 40 , 12 , 0 , 0 , 0 , 0 ), // {m16, i16|u16}
+ ROW(2, 1, 1, 0, 41 , 14 , 0 , 0 , 0 , 0 ), // {m32, i32|u32}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #59 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8, i8|u8}
+ ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
+ ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
+ ROW(2, 0, 1, 0, 15 , 29 , 0 , 0 , 0 , 0 ), // {r64|m64, i32|i8}
+ ROW(2, 1, 1, 0, 27 , 28 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32, i8}
+ ROW(2, 1, 1, 0, 2 , 17 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
+ ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
+ ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
+ ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
+ ROW(2, 1, 1, 1, 42 , 1 , 0 , 0 , 0 , 0 ), // #72 {<ax>, r8lo|r8hi|m8|mem}
+ ROW(3, 1, 1, 2, 43 , 42 , 24 , 0 , 0 , 0 ), // {<dx>, <ax>, r16|m16|mem}
+ ROW(3, 1, 1, 2, 44 , 45 , 25 , 0 , 0 , 0 ), // {<edx>, <eax>, r32|m32|mem}
+ ROW(3, 0, 1, 2, 46 , 47 , 26 , 0 , 0 , 0 ), // {<rdx>, <rax>, r64|m64|mem}
+ ROW(2, 1, 1, 0, 4 , 24 , 0 , 0 , 0 , 0 ), // #76 {r16, r16|m16|mem}
+ ROW(2, 1, 1, 0, 6 , 25 , 0 , 0 , 0 , 0 ), // #77 {r32, r32|m32|mem}
+ ROW(2, 0, 1, 0, 8 , 26 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem}
+ ROW(3, 1, 1, 0, 4 , 24 , 48 , 0 , 0 , 0 ), // {r16, r16|m16|mem, i8|i16|u16}
+ ROW(3, 1, 1, 0, 6 , 25 , 49 , 0 , 0 , 0 ), // {r32, r32|m32|mem, i8|i32|u32}
+ ROW(3, 0, 1, 0, 8 , 26 , 29 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|i32}
+ ROW(2, 0, 1, 0, 8 , 50 , 0 , 0 , 0 , 0 ), // #82 {r64, i64|u64}
+ ROW(2, 1, 1, 0, 51 , 17 , 0 , 0 , 0 , 0 ), // {al, m8|mem}
+ ROW(2, 1, 1, 0, 52 , 21 , 0 , 0 , 0 , 0 ), // {ax, m16|mem}
+ ROW(2, 1, 1, 0, 53 , 30 , 0 , 0 , 0 , 0 ), // {eax, m32|mem}
+ ROW(2, 0, 1, 0, 54 , 31 , 0 , 0 , 0 , 0 ), // {rax, m64|mem}
+ ROW(2, 1, 1, 0, 17 , 51 , 0 , 0 , 0 , 0 ), // {m8|mem, al}
+ ROW(2, 1, 1, 0, 21 , 52 , 0 , 0 , 0 , 0 ), // {m16|mem, ax}
+ ROW(2, 1, 1, 0, 30 , 53 , 0 , 0 , 0 , 0 ), // {m32|mem, eax}
+ ROW(2, 0, 1, 0, 31 , 54 , 0 , 0 , 0 , 0 ), // {m64|mem, rax}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #91 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8, i8|u8}
+ ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
+ ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
+ ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64, i32}
+ ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // #99 {xmm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 57 , 58 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 59 , 55 , 0 , 0 , 0 , 0 ), // #101 {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 60 , 57 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 59 , 55 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 60 , 57 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 63 , 61 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // #107 {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 31 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // #109 {xmm, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 31 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(2, 1, 1, 0, 30 , 55 , 0 , 0 , 0 , 0 ), // #115 {m32|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(2, 1, 1, 0, 30 , 55 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 64 , 0 , 0 , 0 ), // #123 {xmm, xmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 55 , 59 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 57 , 57 , 65 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem|i8|u8}
+ ROW(3, 1, 1, 0, 57 , 60 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 61 , 61 , 66 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
+ ROW(3, 1, 1, 0, 55 , 59 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 57 , 60 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 61 , 63 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #131 {r8lo|r8hi|m8|mem, r8lo|r8hi}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 2 , 17 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
+ ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
+ ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
+ ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
+ ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // #139 {r16, m16|mem}
+ ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
+ ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
+ ROW(2, 1, 1, 0, 21 , 4 , 0 , 0 , 0 , 0 ), // {m16|mem, r16}
+ ROW(2, 1, 1, 0, 30 , 6 , 0 , 0 , 0 , 0 ), // #143 {m32|mem, r32}
+ ROW(2, 0, 1, 0, 31 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #145 {}
+ ROW(1, 1, 1, 0, 27 , 0 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32}
+ ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // #151 {xmm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 57 , 58 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 59 , 55 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 60 , 57 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 63 , 61 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 64 , 0 , 0 , 0 ), // #157 {xmm, xmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 57 , 57 , 64 , 0 , 0 , 0 ), // {ymm, ymm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 61 , 61 , 64 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 55 , 59 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 57 , 60 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 61 , 63 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // #163 {r16|m16|mem, r16}
+ ROW(2, 1, 1, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 1, 0, 27 , 10 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32, i8|u8}
+ ROW(2, 0, 1, 0, 15 , 10 , 0 , 0 , 0 , 0 ), // {r64|m64, i8|u8}
+ ROW(2, 1, 1, 0, 67 , 68 , 0 , 0 , 0 , 0 ), // #168 {mm, mm|m64|mem}
+ ROW(2, 0, 1, 0, 69 , 26 , 0 , 0 , 0 , 0 ), // {mm|xmm, r64|m64|mem}
+ ROW(2, 1, 1, 0, 31 , 69 , 0 , 0 , 0 , 0 ), // {m64|mem, mm|xmm}
+ ROW(2, 0, 1, 0, 26 , 69 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, mm|xmm}
+ ROW(2, 1, 1, 0, 55 , 70 , 0 , 0 , 0 , 0 ), // #172 {xmm, xmm|m64|mem}
+ ROW(1, 1, 1, 0, 11 , 0 , 0 , 0 , 0 , 0 ), // #173 {r16|m16}
+ ROW(1, 1, 0, 0, 13 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32}
+ ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
+ ROW(1, 1, 0, 0, 71 , 0 , 0 , 0 , 0 , 0 ), // {ds|es|ss}
+ ROW(1, 1, 1, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
+ ROW(1, 1, 1, 0, 73 , 0 , 0 , 0 , 0 , 0 ), // #178 {r16|m16|i8|u8|i16|u16}
+ ROW(1, 1, 0, 0, 74 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32|i32|u32}
+ ROW(1, 0, 1, 0, 75 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|i32}
+ ROW(1, 1, 0, 0, 76 , 0 , 0 , 0 , 0 , 0 ), // {cs|ss|ds|es}
+ ROW(1, 1, 1, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
+ ROW(3, 1, 1, 0, 55 , 77 , 55 , 0 , 0 , 0 ), // #183 {xmm, vm32x, xmm}
+ ROW(3, 1, 1, 0, 57 , 78 , 57 , 0 , 0 , 0 ), // {ymm, vm32y, ymm}
+ ROW(2, 1, 1, 0, 55 , 77 , 0 , 0 , 0 , 0 ), // {xmm, vm32x}
+ ROW(2, 1, 1, 0, 57 , 78 , 0 , 0 , 0 , 0 ), // {ymm, vm32y}
+ ROW(2, 1, 1, 0, 61 , 79 , 0 , 0 , 0 , 0 ), // {zmm, vm32z}
+ ROW(3, 1, 1, 0, 55 , 80 , 55 , 0 , 0 , 0 ), // #188 {xmm, vm64x, xmm}
+ ROW(3, 1, 1, 0, 57 , 81 , 57 , 0 , 0 , 0 ), // {ymm, vm64y, ymm}
+ ROW(2, 1, 1, 0, 55 , 80 , 0 , 0 , 0 , 0 ), // {xmm, vm64x}
+ ROW(2, 1, 1, 0, 57 , 81 , 0 , 0 , 0 , 0 ), // {ymm, vm64y}
+ ROW(2, 1, 1, 0, 61 , 82 , 0 , 0 , 0 , 0 ), // {zmm, vm64z}
+ ROW(2, 1, 1, 0, 59 , 55 , 0 , 0 , 0 , 0 ), // #193 {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 60 , 57 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 59 , 55 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 60 , 57 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
+ ROW(2, 1, 1, 0, 63 , 61 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
+ ROW(2, 1, 1, 0, 55 , 59 , 0 , 0 , 0 , 0 ), // #198 {xmm, m128|mem}
+ ROW(2, 1, 1, 0, 57 , 60 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem}
+ ROW(2, 1, 1, 0, 55 , 59 , 0 , 0 , 0 , 0 ), // {xmm, m128|mem}
+ ROW(2, 1, 1, 0, 57 , 60 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem}
+ ROW(2, 1, 1, 0, 61 , 63 , 0 , 0 , 0 , 0 ), // {zmm, m512|mem}
+ ROW(2, 0, 1, 0, 26 , 55 , 0 , 0 , 0 , 0 ), // #203 {r64|m64|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 70 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m64|mem}
+ ROW(2, 0, 1, 0, 55 , 26 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 83 , 84 , 0 , 0 , 0 , 0 ), // #208 {ds:[memBase|zsi|m8], es:[memBase|zdi|m8]}
+ ROW(2, 1, 1, 0, 85 , 86 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m16], es:[memBase|zdi|m16]}
+ ROW(2, 1, 1, 0, 87 , 88 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m32], es:[memBase|zdi|m32]}
+ ROW(2, 0, 1, 0, 89 , 90 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m64], es:[memBase|zdi|m64]}
+ ROW(3, 1, 1, 1, 1 , 2 , 91 , 0 , 0 , 0 ), // #212 {r8lo|r8hi|m8|mem, r8lo|r8hi, <al>}
+ ROW(3, 1, 1, 1, 24 , 4 , 42 , 0 , 0 , 0 ), // {r16|m16|mem, r16, <ax>}
+ ROW(3, 1, 1, 1, 25 , 6 , 45 , 0 , 0 , 0 ), // {r32|m32|mem, r32, <eax>}
+ ROW(3, 0, 1, 1, 26 , 8 , 47 , 0 , 0 , 0 ), // {r64|m64|mem, r64, <rax>}
+ ROW(2, 1, 1, 0, 92 , 93 , 0 , 0 , 0 , 0 ), // #216 {k, k|m64|mem}
+ ROW(2, 0, 1, 0, 92 , 8 , 0 , 0 , 0 , 0 ), // {k, r64}
+ ROW(2, 1, 1, 0, 31 , 92 , 0 , 0 , 0 , 0 ), // {m64|mem, k}
+ ROW(2, 0, 1, 0, 8 , 92 , 0 , 0 , 0 , 0 ), // {r64, k}
+ ROW(2, 1, 1, 0, 51 , 94 , 0 , 0 , 0 , 0 ), // #220 {al, ds:[memBase|zsi|m8|mem]}
+ ROW(2, 1, 1, 0, 52 , 95 , 0 , 0 , 0 , 0 ), // {ax, ds:[memBase|zsi|m16|mem]}
+ ROW(2, 1, 1, 0, 53 , 96 , 0 , 0 , 0 , 0 ), // {eax, ds:[memBase|zsi|m32|mem]}
+ ROW(2, 0, 1, 0, 54 , 97 , 0 , 0 , 0 , 0 ), // {rax, ds:[memBase|zsi|m64|mem]}
+ ROW(2, 1, 1, 0, 84 , 83 , 0 , 0 , 0 , 0 ), // #224 {es:[memBase|zdi|m8], ds:[memBase|zsi|m8]}
+ ROW(2, 1, 1, 0, 86 , 85 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m16], ds:[memBase|zsi|m16]}
+ ROW(2, 1, 1, 0, 88 , 87 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m32], ds:[memBase|zsi|m32]}
+ ROW(2, 0, 1, 0, 90 , 89 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m64], ds:[memBase|zsi|m64]}
+ ROW(2, 1, 1, 0, 51 , 98 , 0 , 0 , 0 , 0 ), // #228 {al, es:[memBase|zdi|m8|mem]}
+ ROW(2, 1, 1, 0, 52 , 99 , 0 , 0 , 0 , 0 ), // {ax, es:[memBase|zdi|m16|mem]}
+ ROW(2, 1, 1, 0, 53 , 100, 0 , 0 , 0 , 0 ), // {eax, es:[memBase|zdi|m32|mem]}
+ ROW(2, 0, 1, 0, 54 , 101, 0 , 0 , 0 , 0 ), // {rax, es:[memBase|zdi|m64|mem]}
+ ROW(2, 1, 1, 0, 98 , 51 , 0 , 0 , 0 , 0 ), // #232 {es:[memBase|zdi|m8|mem], al}
+ ROW(2, 1, 1, 0, 99 , 52 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m16|mem], ax}
+ ROW(2, 1, 1, 0, 100, 53 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m32|mem], eax}
+ ROW(2, 0, 1, 0, 101, 54 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m64|mem], rax}
+ ROW(4, 1, 1, 0, 55 , 55 , 55 , 56 , 0 , 0 ), // #236 {xmm, xmm, xmm, xmm|m128|mem}
+ ROW(4, 1, 1, 0, 57 , 57 , 57 , 58 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem}
+ ROW(4, 1, 1, 0, 55 , 55 , 59 , 55 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm}
+ ROW(4, 1, 1, 0, 57 , 57 , 60 , 57 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm}
+ ROW(3, 1, 1, 0, 55 , 77 , 55 , 0 , 0 , 0 ), // #240 {xmm, vm32x, xmm}
+ ROW(3, 1, 1, 0, 57 , 77 , 57 , 0 , 0 , 0 ), // {ymm, vm32x, ymm}
+ ROW(2, 1, 1, 0, 102, 77 , 0 , 0 , 0 , 0 ), // {xmm|ymm, vm32x}
+ ROW(2, 1, 1, 0, 61 , 78 , 0 , 0 , 0 , 0 ), // {zmm, vm32y}
+ ROW(3, 1, 1, 0, 59 , 55 , 55 , 0 , 0 , 0 ), // #244 {m128|mem, xmm, xmm}
+ ROW(3, 1, 1, 0, 60 , 57 , 57 , 0 , 0 , 0 ), // {m256|mem, ymm, ymm}
+ ROW(3, 1, 1, 0, 55 , 55 , 59 , 0 , 0 , 0 ), // {xmm, xmm, m128|mem}
+ ROW(3, 1, 1, 0, 57 , 57 , 60 , 0 , 0 , 0 ), // {ymm, ymm, m256|mem}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // #248 {m64|mem, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 31 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 31 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem}
+ ROW(2, 1, 1, 0, 21 , 55 , 0 , 0 , 0 , 0 ), // #252 {m16|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 21 , 0 , 0 , 0 , 0 ), // {xmm, m16|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(3, 1, 1, 0, 55 , 55 , 55 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
+ ROW(4, 1, 1, 0, 55 , 55 , 55 , 56 , 0 , 0 ), // #256 {xmm, xmm, xmm, xmm|m128|mem}
+ ROW(4, 1, 1, 0, 55 , 55 , 59 , 55 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm}
+ ROW(4, 1, 1, 0, 57 , 57 , 57 , 58 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem}
+ ROW(4, 1, 1, 0, 57 , 57 , 60 , 57 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm}
+ ROW(5, 1, 1, 0, 55 , 55 , 56 , 55 , 103, 0 ), // #260 {xmm, xmm, xmm|m128|mem, xmm, i4|u4}
+ ROW(5, 1, 1, 0, 55 , 55 , 55 , 59 , 103, 0 ), // {xmm, xmm, xmm, m128|mem, i4|u4}
+ ROW(5, 1, 1, 0, 57 , 57 , 58 , 57 , 103, 0 ), // {ymm, ymm, ymm|m256|mem, ymm, i4|u4}
+ ROW(5, 1, 1, 0, 57 , 57 , 57 , 60 , 103, 0 ), // {ymm, ymm, ymm, m256|mem, i4|u4}
+ ROW(3, 1, 1, 0, 57 , 58 , 10 , 0 , 0 , 0 ), // #264 {ymm, ymm|m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 57 , 57 , 58 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 61 , 61 , 66 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
+ ROW(3, 1, 1, 0, 61 , 63 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
+ ROW(1, 1, 0, 0, 104, 0 , 0 , 0 , 0 , 0 ), // #268 {rel16|r16|m16|mem|r32|m32}
+ ROW(1, 1, 1, 0, 105, 0 , 0 , 0 , 0 , 0 ), // #269 {rel32}
+ ROW(1, 0, 1, 0, 26 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|mem}
+ ROW(1, 1, 0, 0, 106, 0 , 0 , 0 , 0 , 0 ), // #271 {r16|r32}
+ ROW(1, 1, 1, 0, 107, 0 , 0 , 0 , 0 , 0 ), // #272 {r8lo|r8hi|m8|r16|m16|r32|m32}
+ ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
+ ROW(1, 1, 1, 0, 108, 0 , 0 , 0 , 0 , 0 ), // #274 {m32|m64}
+ ROW(2, 1, 1, 0, 109, 110, 0 , 0 , 0 , 0 ), // {st0, st}
+ ROW(2, 1, 1, 0, 110, 109, 0 , 0 , 0 , 0 ), // {st, st0}
+ ROW(1, 1, 1, 0, 111, 0 , 0 , 0 , 0 , 0 ), // #277 {rel8|rel32}
+ ROW(1, 1, 0, 0, 112, 0 , 0 , 0 , 0 , 0 ), // {rel16|r32|m32}
+ ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
+ ROW(2, 1, 0, 0, 12 , 113, 0 , 0 , 0 , 0 ), // #280 {i16|u16, i16|u16|i32|u32}
+ ROW(1, 1, 1, 0, 114, 0 , 0 , 0 , 0 , 0 ), // {m32|mem|m48}
+ ROW(1, 0, 1, 0, 115, 0 , 0 , 0 , 0 , 0 ), // {m80|mem}
+ ROW(2, 1, 1, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #283 {r16, m32|mem}
+ ROW(2, 1, 1, 0, 6 , 116, 0 , 0 , 0 , 0 ), // {r32, m48|mem}
+ ROW(2, 0, 1, 0, 8 , 115, 0 , 0 , 0 , 0 ), // {r64, m80|mem}
+ ROW(2, 1, 1, 0, 4 , 24 , 0 , 0 , 0 , 0 ), // #286 {r16, r16|m16|mem}
+ ROW(2, 1, 1, 0, 6 , 117, 0 , 0 , 0 , 0 ), // {r32, r32|m16|mem}
+ ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // {r64, r32|m16|mem}
+ ROW(2, 1, 1, 0, 4 , 9 , 0 , 0 , 0 , 0 ), // #289 {r16, r8lo|r8hi|m8}
+ ROW(2, 1, 1, 0, 6 , 118, 0 , 0 , 0 , 0 ), // {r32, r8lo|r8hi|m8|r16|m16}
+ ROW(2, 0, 1, 0, 8 , 118, 0 , 0 , 0 , 0 ), // {r64, r8lo|r8hi|m8|r16|m16}
+ ROW(3, 1, 1, 0, 24 , 4 , 119, 0 , 0 , 0 ), // #292 {r16|m16|mem, r16, cl|i8|u8}
+ ROW(3, 1, 1, 0, 25 , 6 , 119, 0 , 0 , 0 ), // {r32|m32|mem, r32, cl|i8|u8}
+ ROW(3, 0, 1, 0, 26 , 8 , 119, 0 , 0 , 0 ), // {r64|m64|mem, r64, cl|i8|u8}
+ ROW(3, 1, 1, 0, 55 , 55 , 56 , 0 , 0 , 0 ), // #295 {xmm, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 57 , 57 , 58 , 0 , 0 , 0 ), // #296 {ymm, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 61 , 61 , 62 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem}
+ ROW(4, 1, 1, 0, 55 , 55 , 56 , 10 , 0 , 0 ), // #298 {xmm, xmm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 57 , 57 , 58 , 10 , 0 , 0 ), // #299 {ymm, ymm, ymm|m256|mem, i8|u8}
+ ROW(4, 1, 1, 0, 61 , 61 , 62 , 10 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem, i8|u8}
+ ROW(4, 1, 1, 0, 120, 55 , 56 , 10 , 0 , 0 ), // #301 {xmm|k, xmm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 121, 57 , 58 , 10 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem, i8|u8}
+ ROW(4, 1, 1, 0, 92 , 61 , 62 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
+ ROW(4, 1, 1, 0, 92 , 55 , 56 , 10 , 0 , 0 ), // #304 {k, xmm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 92 , 57 , 58 , 10 , 0 , 0 ), // {k, ymm, ymm|m256|mem, i8|u8}
+ ROW(4, 1, 1, 0, 92 , 61 , 62 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 56 , 55 , 0 , 0 , 0 , 0 ), // #307 {xmm|m128|mem, xmm}
+ ROW(2, 1, 1, 0, 58 , 57 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, ymm}
+ ROW(2, 1, 1, 0, 62 , 61 , 0 , 0 , 0 , 0 ), // {zmm|m512|mem, zmm}
+ ROW(2, 1, 1, 0, 55 , 70 , 0 , 0 , 0 , 0 ), // #310 {xmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 57 , 56 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 61 , 58 , 0 , 0 , 0 , 0 ), // {zmm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 55 , 122, 0 , 0 , 0 , 0 ), // #313 {xmm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 57 , 70 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 61 , 56 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 70 , 55 , 10 , 0 , 0 , 0 ), // #316 {xmm|m64|mem, xmm, i8|u8}
+ ROW(3, 1, 1, 0, 56 , 57 , 10 , 0 , 0 , 0 ), // #317 {xmm|m128|mem, ymm, i8|u8}
+ ROW(3, 1, 1, 0, 58 , 61 , 10 , 0 , 0 , 0 ), // #318 {ymm|m256|mem, zmm, i8|u8}
+ ROW(3, 1, 1, 0, 55 , 123, 55 , 0 , 0 , 0 ), // #319 {xmm, vm64x|vm64y, xmm}
+ ROW(2, 1, 1, 0, 55 , 123, 0 , 0 , 0 , 0 ), // {xmm, vm64x|vm64y}
+ ROW(2, 1, 1, 0, 57 , 82 , 0 , 0 , 0 , 0 ), // {ymm, vm64z}
+ ROW(3, 1, 1, 0, 55 , 56 , 10 , 0 , 0 , 0 ), // #322 {xmm, xmm|m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 57 , 58 , 10 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem, i8|u8}
+ ROW(3, 1, 1, 0, 61 , 62 , 10 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem, i8|u8}
+ ROW(2, 1, 1, 0, 55 , 70 , 0 , 0 , 0 , 0 ), // #325 {xmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 57 , 58 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
+ ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
+ ROW(4, 1, 1, 0, 92 , 92 , 55 , 56 , 0 , 0 ), // #328 {k, k, xmm, xmm|m128|mem}
+ ROW(4, 1, 1, 0, 92 , 92 , 57 , 58 , 0 , 0 ), // {k, k, ymm, ymm|m256|mem}
+ ROW(4, 1, 1, 0, 92 , 92 , 61 , 62 , 0 , 0 ), // {k, k, zmm, zmm|m512|mem}
+ ROW(3, 1, 1, 0, 120, 55 , 56 , 0 , 0 , 0 ), // #331 {xmm|k, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 121, 57 , 58 , 0 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 92 , 61 , 62 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 122, 55 , 0 , 0 , 0 , 0 ), // #334 {xmm|m32|mem, xmm}
+ ROW(2, 1, 1, 0, 70 , 57 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, ymm}
+ ROW(2, 1, 1, 0, 56 , 61 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, zmm}
+ ROW(2, 1, 1, 0, 70 , 55 , 0 , 0 , 0 , 0 ), // #337 {xmm|m64|mem, xmm}
+ ROW(2, 1, 1, 0, 56 , 57 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, ymm}
+ ROW(2, 1, 1, 0, 58 , 61 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, zmm}
+ ROW(2, 1, 1, 0, 124, 55 , 0 , 0 , 0 , 0 ), // #340 {xmm|m16|mem, xmm}
+ ROW(2, 1, 1, 0, 122, 57 , 0 , 0 , 0 , 0 ), // {xmm|m32|mem, ymm}
+ ROW(2, 1, 1, 0, 70 , 61 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, zmm}
+ ROW(2, 1, 1, 0, 55 , 124, 0 , 0 , 0 , 0 ), // #343 {xmm, xmm|m16|mem}
+ ROW(2, 1, 1, 0, 57 , 122, 0 , 0 , 0 , 0 ), // {ymm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 61 , 70 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 77 , 55 , 0 , 0 , 0 , 0 ), // #346 {vm32x, xmm}
+ ROW(2, 1, 1, 0, 78 , 57 , 0 , 0 , 0 , 0 ), // {vm32y, ymm}
+ ROW(2, 1, 1, 0, 79 , 61 , 0 , 0 , 0 , 0 ), // {vm32z, zmm}
+ ROW(2, 1, 1, 0, 80 , 55 , 0 , 0 , 0 , 0 ), // #349 {vm64x, xmm}
+ ROW(2, 1, 1, 0, 81 , 57 , 0 , 0 , 0 , 0 ), // {vm64y, ymm}
+ ROW(2, 1, 1, 0, 82 , 61 , 0 , 0 , 0 , 0 ), // {vm64z, zmm}
+ ROW(3, 1, 1, 0, 92 , 55 , 56 , 0 , 0 , 0 ), // #352 {k, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 92 , 57 , 58 , 0 , 0 , 0 ), // {k, ymm, ymm|m256|mem}
+ ROW(3, 1, 1, 0, 92 , 61 , 62 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
+ ROW(3, 1, 1, 0, 6 , 6 , 25 , 0 , 0 , 0 ), // #355 {r32, r32, r32|m32|mem}
+ ROW(3, 0, 1, 0, 8 , 8 , 26 , 0 , 0 , 0 ), // {r64, r64, r64|m64|mem}
+ ROW(3, 1, 1, 0, 6 , 25 , 6 , 0 , 0 , 0 ), // #357 {r32, r32|m32|mem, r32}
+ ROW(3, 0, 1, 0, 8 , 26 , 8 , 0 , 0 , 0 ), // {r64, r64|m64|mem, r64}
+ ROW(2, 1, 0, 0, 125, 25 , 0 , 0 , 0 , 0 ), // #359 {bnd, r32|m32|mem}
+ ROW(2, 0, 1, 0, 125, 26 , 0 , 0 , 0 , 0 ), // {bnd, r64|m64|mem}
+ ROW(2, 1, 1, 0, 125, 126, 0 , 0 , 0 , 0 ), // #361 {bnd, bnd|mem}
+ ROW(2, 1, 1, 0, 127, 125, 0 , 0 , 0 , 0 ), // {mem, bnd}
+ ROW(2, 1, 0, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #363 {r16, m32|mem}
+ ROW(2, 1, 0, 0, 6 , 31 , 0 , 0 , 0 , 0 ), // {r32, m64|mem}
+ ROW(1, 1, 1, 0, 106, 0 , 0 , 0 , 0 , 0 ), // #365 {r16|r32}
+ ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // #366 {r64}
+ ROW(3, 1, 1, 0, 30 , 6 , 6 , 0 , 0 , 0 ), // #367 {m32|mem, r32, r32}
+ ROW(3, 0, 1, 0, 31 , 8 , 8 , 0 , 0 , 0 ), // {m64|mem, r64, r64}
+ ROW(2, 1, 1, 0, 6 , 107, 0 , 0 , 0 , 0 ), // #369 {r32, r8lo|r8hi|m8|r16|m16|r32|m32}
+ ROW(2, 0, 1, 0, 8 , 128, 0 , 0 , 0 , 0 ), // {r64, r8lo|r8hi|m8|r64|m64}
+ ROW(2, 1, 1, 0, 6 , 70 , 0 , 0 , 0 , 0 ), // #371 {r32, xmm|m64|mem}
+ ROW(2, 0, 1, 0, 8 , 70 , 0 , 0 , 0 , 0 ), // {r64, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 55 , 25 , 0 , 0 , 0 , 0 ), // #373 {xmm, r32|m32|mem}
+ ROW(2, 0, 1, 0, 55 , 26 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem}
+ ROW(2, 1, 1, 0, 6 , 122, 0 , 0 , 0 , 0 ), // #375 {r32, xmm|m32|mem}
+ ROW(2, 0, 1, 0, 8 , 122, 0 , 0 , 0 , 0 ), // {r64, xmm|m32|mem}
+ ROW(2, 1, 0, 0, 129, 63 , 0 , 0 , 0 , 0 ), // #377 {es:[mem|m512|memBase], m512|mem}
+ ROW(2, 0, 1, 0, 129, 63 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem}
+ ROW(3, 1, 1, 0, 55 , 10 , 10 , 0 , 0 , 0 ), // #379 {xmm, i8|u8, i8|u8}
+ ROW(2, 1, 1, 0, 55 , 55 , 0 , 0 , 0 , 0 ), // #380 {xmm, xmm}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #381 {}
+ ROW(1, 1, 1, 0, 110, 0 , 0 , 0 , 0 , 0 ), // #382 {st}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #383 {}
+ ROW(1, 1, 1, 0, 130, 0 , 0 , 0 , 0 , 0 ), // #384 {m32|m64|st}
+ ROW(2, 1, 1, 0, 55 , 55 , 0 , 0 , 0 , 0 ), // #385 {xmm, xmm}
+ ROW(4, 1, 1, 0, 55 , 55 , 10 , 10 , 0 , 0 ), // {xmm, xmm, i8|u8, i8|u8}
+ ROW(2, 1, 0, 0, 6 , 59 , 0 , 0 , 0 , 0 ), // #387 {r32, m128|mem}
+ ROW(2, 0, 1, 0, 8 , 59 , 0 , 0 , 0 , 0 ), // {r64, m128|mem}
+ ROW(2, 1, 0, 2, 45 , 131, 0 , 0 , 0 , 0 ), // #389 {<eax>, <ecx>}
+ ROW(2, 0, 1, 2, 132, 131, 0 , 0 , 0 , 0 ), // {<eax|rax>, <ecx>}
+ ROW(3, 1, 0, 3, 45 , 44 , 131, 0 , 0 , 0 ), // #391 {<eax>, <edx>, <ecx>}
+ ROW(3, 0, 1, 3, 132, 44 , 131, 0 , 0 , 0 ), // {<eax|rax>, <edx>, <ecx>}
+ ROW(1, 1, 1, 0, 111, 0 , 0 , 0 , 0 , 0 ), // #393 {rel8|rel32}
+ ROW(1, 1, 0, 0, 105, 0 , 0 , 0 , 0 , 0 ), // {rel16}
+ ROW(2, 1, 0, 1, 133, 134, 0 , 0 , 0 , 0 ), // #395 {<cx|ecx>, rel8}
+ ROW(2, 0, 1, 1, 135, 134, 0 , 0 , 0 , 0 ), // {<ecx|rcx>, rel8}
+ ROW(2, 1, 1, 0, 92 , 136, 0 , 0 , 0 , 0 ), // #397 {k, k|m8|mem|r32}
+ ROW(2, 1, 1, 0, 137, 92 , 0 , 0 , 0 , 0 ), // {m8|mem|r32, k}
+ ROW(2, 1, 1, 0, 92 , 138, 0 , 0 , 0 , 0 ), // #399 {k, k|m32|mem|r32}
+ ROW(2, 1, 1, 0, 25 , 92 , 0 , 0 , 0 , 0 ), // {m32|mem|r32, k}
+ ROW(2, 1, 1, 0, 92 , 139, 0 , 0 , 0 , 0 ), // #401 {k, k|m16|mem|r32}
+ ROW(2, 1, 1, 0, 117, 92 , 0 , 0 , 0 , 0 ), // {m16|mem|r32, k}
+ ROW(2, 1, 0, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #403 {r16, m32|mem}
+ ROW(2, 1, 0, 0, 6 , 116, 0 , 0 , 0 , 0 ), // {r32, m48|mem}
+ ROW(2, 1, 1, 0, 106, 140, 0 , 0 , 0 , 0 ), // #405 {r16|r32, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
+ ROW(2, 0, 1, 0, 8 , 140, 0 , 0 , 0 , 0 ), // {r64, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
+ ROW(1, 1, 1, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #407 {r32}
+ ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64}
+ ROW(3, 1, 1, 0, 6 , 25 , 14 , 0 , 0 , 0 ), // #409 {r32, r32|m32|mem, i32|u32}
+ ROW(3, 0, 1, 0, 8 , 25 , 14 , 0 , 0 , 0 ), // {r64, r32|m32|mem, i32|u32}
+ ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // #411 {xmm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 59 , 55 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
+ ROW(2, 1, 1, 0, 69 , 25 , 0 , 0 , 0 , 0 ), // #413 {mm|xmm, r32|m32|mem}
+ ROW(2, 1, 1, 0, 25 , 69 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, mm|xmm}
+ ROW(2, 1, 1, 0, 129, 63 , 0 , 0 , 0 , 0 ), // #415 {es:[mem|m512|memBase], m512|mem}
+ ROW(2, 1, 1, 0, 129, 63 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem}
+ ROW(2, 1, 1, 0, 55 , 70 , 0 , 0 , 0 , 0 ), // #417 {xmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 31 , 55 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 122, 0 , 0 , 0 , 0 ), // #419 {xmm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 30 , 55 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm}
+ ROW(2, 0, 1, 0, 4 , 24 , 0 , 0 , 0 , 0 ), // #421 {r16, r16|m16|mem}
+ ROW(2, 0, 1, 0, 141, 25 , 0 , 0 , 0 , 0 ), // {r32|r64, r32|m32|mem}
+ ROW(4, 1, 1, 1, 6 , 6 , 25 , 44 , 0 , 0 ), // #423 {r32, r32, r32|m32|mem, <edx>}
+ ROW(4, 0, 1, 1, 8 , 8 , 26 , 46 , 0 , 0 ), // {r64, r64, r64|m64|mem, <rdx>}
+ ROW(2, 1, 1, 0, 67 , 68 , 0 , 0 , 0 , 0 ), // #425 {mm, mm|m64|mem}
+ ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 67 , 68 , 10 , 0 , 0 , 0 ), // #427 {mm, mm|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 55 , 56 , 10 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem, i8|u8}
+ ROW(3, 1, 1, 0, 6 , 69 , 10 , 0 , 0 , 0 ), // #429 {r32, mm|xmm, i8|u8}
+ ROW(3, 1, 1, 0, 21 , 55 , 10 , 0 , 0 , 0 ), // {m16|mem, xmm, i8|u8}
+ ROW(2, 1, 1, 0, 67 , 142, 0 , 0 , 0 , 0 ), // #431 {mm, mm|m64|mem|i8|u8}
+ ROW(2, 1, 1, 0, 55 , 64 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem|i8|u8}
+ ROW(1, 1, 1, 0, 25 , 0 , 0 , 0 , 0 , 0 ), // #433 {r32|m32|mem}
+ ROW(1, 0, 1, 0, 26 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|mem}
+ ROW(2, 1, 1, 0, 67 , 143, 0 , 0 , 0 , 0 ), // #435 {mm, mm|m32|mem}
+ ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 107, 119, 0 , 0 , 0 , 0 ), // #437 {r8lo|r8hi|m8|r16|m16|r32|m32, cl|i8|u8}
+ ROW(2, 0, 1, 0, 15 , 119, 0 , 0 , 0 , 0 ), // {r64|m64, cl|i8|u8}
+ ROW(3, 1, 1, 3, 44 , 45 , 131, 0 , 0 , 0 ), // #439 {<edx>, <eax>, <ecx>}
+ ROW(2, 0, 1, 0, 8 , 14 , 0 , 0 , 0 , 0 ), // {r64, i32|u32}
+ ROW(1, 1, 0, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #441 {r32}
+ ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64}
+ ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #443 {}
+ ROW(1, 1, 1, 0, 144, 0 , 0 , 0 , 0 , 0 ), // {u16}
+ ROW(3, 1, 1, 0, 6 , 25 , 10 , 0 , 0 , 0 ), // #445 {r32, r32|m32|mem, i8|u8}
+ ROW(3, 0, 1, 0, 8 , 26 , 10 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|u8}
+ ROW(1, 1, 1, 0, 145, 0 , 0 , 0 , 0 , 0 ), // #447 {r16|m16|mem|r32}
+ ROW(1, 0, 1, 0, 146, 0 , 0 , 0 , 0 , 0 ), // {r64|m16|mem}
+ ROW(1, 1, 0, 0, 147, 0 , 0 , 0 , 0 , 0 ), // #449 {ds:[mem|memBase]}
+ ROW(1, 0, 1, 0, 147, 0 , 0 , 0 , 0 , 0 ), // {ds:[mem|memBase]}
+ ROW(4, 1, 1, 0, 55 , 55 , 56 , 55 , 0 , 0 ), // #451 {xmm, xmm, xmm|m128|mem, xmm}
+ ROW(4, 1, 1, 0, 57 , 57 , 58 , 57 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm}
+ ROW(2, 1, 1, 0, 55 , 148, 0 , 0 , 0 , 0 ), // #453 {xmm, xmm|m128|ymm|m256}
+ ROW(2, 1, 1, 0, 57 , 62 , 0 , 0 , 0 , 0 ), // {ymm, zmm|m512|mem}
+ ROW(2, 1, 1, 0, 6 , 124, 0 , 0 , 0 , 0 ), // #455 {r32, xmm|m16|mem}
+ ROW(2, 0, 1, 0, 8 , 124, 0 , 0 , 0 , 0 ), // {r64, xmm|m16|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 25 , 0 , 0 , 0 ), // #457 {xmm, xmm, r32|m32|mem}
+ ROW(3, 0, 1, 0, 55 , 55 , 26 , 0 , 0 , 0 ), // {xmm, xmm, r64|m64|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 13 , 0 , 0 , 0 ), // #459 {xmm, xmm, r32|m32}
+ ROW(3, 0, 1, 0, 55 , 55 , 15 , 0 , 0 , 0 ), // {xmm, xmm, r64|m64}
+ ROW(4, 1, 1, 0, 55 , 55 , 55 , 70 , 0 , 0 ), // #461 {xmm, xmm, xmm, xmm|m64|mem}
+ ROW(4, 1, 1, 0, 55 , 55 , 31 , 55 , 0 , 0 ), // {xmm, xmm, m64|mem, xmm}
+ ROW(4, 1, 1, 0, 55 , 55 , 55 , 122, 0 , 0 ), // #463 {xmm, xmm, xmm, xmm|m32|mem}
+ ROW(4, 1, 1, 0, 55 , 55 , 30 , 55 , 0 , 0 ), // {xmm, xmm, m32|mem, xmm}
+ ROW(4, 1, 1, 0, 57 , 57 , 56 , 10 , 0 , 0 ), // #465 {ymm, ymm, xmm|m128|mem, i8|u8}
+ ROW(4, 1, 1, 0, 61 , 61 , 56 , 10 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem, i8|u8}
+ ROW(1, 1, 0, 1, 45 , 0 , 0 , 0 , 0 , 0 ), // #467 {<eax>}
+ ROW(1, 0, 1, 1, 47 , 0 , 0 , 0 , 0 , 0 ), // #468 {<rax>}
+ ROW(2, 1, 1, 0, 25 , 55 , 0 , 0 , 0 , 0 ), // #469 {r32|m32|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 25 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem}
+ ROW(2, 1, 1, 0, 117, 55 , 0 , 0 , 0 , 0 ), // #471 {r32|m16|mem, xmm}
+ ROW(2, 1, 1, 0, 55 , 117, 0 , 0 , 0 , 0 ), // {xmm, r32|m16|mem}
+ ROW(2, 1, 0, 0, 25 , 6 , 0 , 0 , 0 , 0 ), // #473 {r32|m32|mem, r32}
+ ROW(2, 0, 1, 0, 26 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
+ ROW(2, 1, 0, 0, 6 , 25 , 0 , 0 , 0 , 0 ), // #475 {r32, r32|m32|mem}
+ ROW(2, 0, 1, 0, 8 , 26 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem}
+ ROW(2, 1, 1, 0, 149, 70 , 0 , 0 , 0 , 0 ), // #477 {xmm|ymm|zmm, xmm|m64|mem}
+ ROW(2, 0, 1, 0, 149, 8 , 0 , 0 , 0 , 0 ), // {xmm|ymm|zmm, r64}
+ ROW(3, 1, 1, 0, 55 , 55 , 64 , 0 , 0 , 0 ), // #479 {xmm, xmm, xmm|m128|mem|i8|u8}
+ ROW(3, 1, 1, 0, 55 , 59 , 150, 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8|xmm}
+ ROW(2, 1, 1, 0, 77 , 102, 0 , 0 , 0 , 0 ), // #481 {vm32x, xmm|ymm}
+ ROW(2, 1, 1, 0, 78 , 61 , 0 , 0 , 0 , 0 ), // {vm32y, zmm}
+ ROW(2, 1, 1, 0, 123, 55 , 0 , 0 , 0 , 0 ), // #483 {vm64x|vm64y, xmm}
+ ROW(2, 1, 1, 0, 82 , 57 , 0 , 0 , 0 , 0 ), // {vm64z, ymm}
+ ROW(3, 1, 1, 0, 55 , 55 , 56 , 0 , 0 , 0 ), // #485 {xmm, xmm, xmm|m128|mem}
+ ROW(3, 1, 1, 0, 55 , 59 , 55 , 0 , 0 , 0 ), // {xmm, m128|mem, xmm}
+ ROW(1, 1, 0, 1, 42 , 0 , 0 , 0 , 0 , 0 ), // #487 {<ax>}
+ ROW(2, 1, 0, 1, 42 , 10 , 0 , 0 , 0 , 0 ), // #488 {<ax>, i8|u8}
+ ROW(2, 1, 0, 0, 24 , 4 , 0 , 0 , 0 , 0 ), // #489 {r16|m16|mem, r16}
+ ROW(3, 1, 1, 1, 55 , 56 , 151, 0 , 0 , 0 ), // #490 {xmm, xmm|m128|mem, <xmm0>}
+ ROW(2, 1, 1, 0, 125, 152, 0 , 0 , 0 , 0 ), // #491 {bnd, mib}
+ ROW(2, 1, 1, 0, 125, 127, 0 , 0 , 0 , 0 ), // #492 {bnd, mem}
+ ROW(2, 1, 1, 0, 152, 125, 0 , 0 , 0 , 0 ), // #493 {mib, bnd}
+ ROW(1, 1, 1, 1, 42 , 0 , 0 , 0 , 0 , 0 ), // #494 {<ax>}
+ ROW(2, 1, 1, 2, 44 , 45 , 0 , 0 , 0 , 0 ), // #495 {<edx>, <eax>}
+ ROW(1, 1, 1, 0, 127, 0 , 0 , 0 , 0 , 0 ), // #496 {mem}
+ ROW(1, 1, 1, 0, 31 , 0 , 0 , 0 , 0 , 0 ), // #497 {m64|mem}
+ ROW(0, 0, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #498 {}
+ ROW(1, 1, 1, 1, 153, 0 , 0 , 0 , 0 , 0 ), // #499 {<ds:[mem|m512|memBase|zax]>}
+ ROW(3, 1, 1, 0, 55 , 70 , 10 , 0 , 0 , 0 ), // #500 {xmm, xmm|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 55 , 122, 10 , 0 , 0 , 0 ), // #501 {xmm, xmm|m32|mem, i8|u8}
+ ROW(5, 0, 1, 4, 59 , 46 , 47 , 154, 155, 0 ), // #502 {m128|mem, <rdx>, <rax>, <rcx>, <rbx>}
+ ROW(5, 1, 1, 4, 31 , 44 , 45 , 131, 156, 0 ), // #503 {m64|mem, <edx>, <eax>, <ecx>, <ebx>}
+ ROW(4, 1, 1, 4, 45 , 156, 131, 44 , 0 , 0 ), // #504 {<eax>, <ebx>, <ecx>, <edx>}
+ ROW(2, 0, 1, 2, 46 , 47 , 0 , 0 , 0 , 0 ), // #505 {<rdx>, <rax>}
+ ROW(2, 1, 1, 0, 67 , 56 , 0 , 0 , 0 , 0 ), // #506 {mm, xmm|m128|mem}
+ ROW(2, 1, 1, 0, 55 , 68 , 0 , 0 , 0 , 0 ), // #507 {xmm, mm|m64|mem}
+ ROW(2, 1, 1, 0, 67 , 70 , 0 , 0 , 0 , 0 ), // #508 {mm, xmm|m64|mem}
+ ROW(2, 1, 1, 2, 43 , 42 , 0 , 0 , 0 , 0 ), // #509 {<dx>, <ax>}
+ ROW(1, 1, 1, 1, 45 , 0 , 0 , 0 , 0 , 0 ), // #510 {<eax>}
+ ROW(2, 1, 1, 0, 12 , 10 , 0 , 0 , 0 , 0 ), // #511 {i16|u16, i8|u8}
+ ROW(3, 1, 1, 0, 25 , 55 , 10 , 0 , 0 , 0 ), // #512 {r32|m32|mem, xmm, i8|u8}
+ ROW(1, 1, 1, 0, 115, 0 , 0 , 0 , 0 , 0 ), // #513 {m80|mem}
+ ROW(1, 1, 1, 0, 39 , 0 , 0 , 0 , 0 , 0 ), // #514 {m16|m32}
+ ROW(1, 1, 1, 0, 157, 0 , 0 , 0 , 0 , 0 ), // #515 {m16|m32|m64}
+ ROW(1, 1, 1, 0, 158, 0 , 0 , 0 , 0 , 0 ), // #516 {m32|m64|m80|st}
+ ROW(1, 1, 1, 0, 21 , 0 , 0 , 0 , 0 , 0 ), // #517 {m16|mem}
+ ROW(1, 1, 1, 0, 159, 0 , 0 , 0 , 0 , 0 ), // #518 {ax|m16|mem}
+ ROW(1, 0, 1, 0, 127, 0 , 0 , 0 , 0 , 0 ), // #519 {mem}
+ ROW(2, 1, 1, 2, 45 , 156, 0 , 0 , 0 , 0 ), // #520 {<eax>, <ebx>}
+ ROW(2, 1, 1, 1, 10 , 45 , 0 , 0 , 0 , 0 ), // #521 {i8|u8, <eax>}
+ ROW(2, 1, 1, 0, 160, 161, 0 , 0 , 0 , 0 ), // #522 {al|ax|eax, i8|u8|dx}
+ ROW(2, 1, 1, 0, 162, 163, 0 , 0 , 0 , 0 ), // #523 {es:[memBase|zdi|m8|m16|m32], dx}
+ ROW(1, 1, 1, 0, 10 , 0 , 0 , 0 , 0 , 0 ), // #524 {i8|u8}
+ ROW(0, 1, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #525 {}
+ ROW(3, 1, 1, 0, 92 , 92 , 92 , 0 , 0 , 0 ), // #526 {k, k, k}
+ ROW(2, 1, 1, 0, 92 , 92 , 0 , 0 , 0 , 0 ), // #527 {k, k}
+ ROW(3, 1, 1, 0, 92 , 92 , 10 , 0 , 0 , 0 ), // #528 {k, k, i8|u8}
+ ROW(1, 1, 1, 1, 164, 0 , 0 , 0 , 0 , 0 ), // #529 {<ah>}
+ ROW(1, 1, 1, 0, 30 , 0 , 0 , 0 , 0 , 0 ), // #530 {m32|mem}
+ ROW(1, 0, 1, 0, 63 , 0 , 0 , 0 , 0 , 0 ), // #531 {m512|mem}
+ ROW(1, 1, 1, 0, 24 , 0 , 0 , 0 , 0 , 0 ), // #532 {r16|m16|mem}
+ ROW(3, 1, 1, 1, 55 , 55 , 165, 0 , 0 , 0 ), // #533 {xmm, xmm, <ds:[mem|m128|memBase|zdi]>}
+ ROW(3, 1, 1, 1, 67 , 67 , 166, 0 , 0 , 0 ), // #534 {mm, mm, <ds:[mem|m64|memBase|zdi]>}
+ ROW(3, 1, 1, 3, 167, 131, 44 , 0 , 0 , 0 ), // #535 {<ds:[mem|memBase|zax]>, <ecx>, <edx>}
+ ROW(2, 1, 1, 0, 67 , 55 , 0 , 0 , 0 , 0 ), // #536 {mm, xmm}
+ ROW(2, 1, 1, 0, 6 , 55 , 0 , 0 , 0 , 0 ), // #537 {r32, xmm}
+ ROW(2, 1, 1, 0, 31 , 67 , 0 , 0 , 0 , 0 ), // #538 {m64|mem, mm}
+ ROW(2, 1, 1, 0, 55 , 67 , 0 , 0 , 0 , 0 ), // #539 {xmm, mm}
+ ROW(2, 1, 1, 2, 45 , 131, 0 , 0 , 0 , 0 ), // #540 {<eax>, <ecx>}
+ ROW(3, 1, 1, 3, 45 , 131, 156, 0 , 0 , 0 ), // #541 {<eax>, <ecx>, <ebx>}
+ ROW(2, 1, 1, 0, 161, 160, 0 , 0 , 0 , 0 ), // #542 {i8|u8|dx, al|ax|eax}
+ ROW(2, 1, 1, 0, 163, 168, 0 , 0 , 0 , 0 ), // #543 {dx, ds:[memBase|zsi|m8|m16|m32]}
+ ROW(6, 1, 1, 3, 55 , 56 , 10 , 131, 45 , 44 ), // #544 {xmm, xmm|m128|mem, i8|u8, <ecx>, <eax>, <edx>}
+ ROW(6, 1, 1, 3, 55 , 56 , 10 , 151, 45 , 44 ), // #545 {xmm, xmm|m128|mem, i8|u8, <xmm0>, <eax>, <edx>}
+ ROW(4, 1, 1, 1, 55 , 56 , 10 , 131, 0 , 0 ), // #546 {xmm, xmm|m128|mem, i8|u8, <ecx>}
+ ROW(4, 1, 1, 1, 55 , 56 , 10 , 151, 0 , 0 ), // #547 {xmm, xmm|m128|mem, i8|u8, <xmm0>}
+ ROW(3, 1, 1, 0, 137, 55 , 10 , 0 , 0 , 0 ), // #548 {r32|m8|mem, xmm, i8|u8}
+ ROW(3, 0, 1, 0, 26 , 55 , 10 , 0 , 0 , 0 ), // #549 {r64|m64|mem, xmm, i8|u8}
+ ROW(3, 1, 1, 0, 55 , 137, 10 , 0 , 0 , 0 ), // #550 {xmm, r32|m8|mem, i8|u8}
+ ROW(3, 1, 1, 0, 55 , 25 , 10 , 0 , 0 , 0 ), // #551 {xmm, r32|m32|mem, i8|u8}
+ ROW(3, 0, 1, 0, 55 , 26 , 10 , 0 , 0 , 0 ), // #552 {xmm, r64|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 69 , 117, 10 , 0 , 0 , 0 ), // #553 {mm|xmm, r32|m16|mem, i8|u8}
+ ROW(2, 1, 1, 0, 6 , 69 , 0 , 0 , 0 , 0 ), // #554 {r32, mm|xmm}
+ ROW(2, 1, 1, 0, 55 , 10 , 0 , 0 , 0 , 0 ), // #555 {xmm, i8|u8}
+ ROW(1, 1, 1, 0, 12 , 0 , 0 , 0 , 0 , 0 ), // #556 {i16|u16}
+ ROW(1, 0, 1, 0, 141, 0 , 0 , 0 , 0 , 0 ), // #557 {r32|r64}
+ ROW(1, 1, 1, 0, 1 , 0 , 0 , 0 , 0 , 0 ), // #558 {r8lo|r8hi|m8|mem}
+ ROW(3, 0, 1, 0, 169, 169, 169, 0 , 0 , 0 ), // #559 {tmm, tmm, tmm}
+ ROW(2, 0, 1, 0, 169, 170, 0 , 0 , 0 , 0 ), // #560 {tmm, tmem}
+ ROW(2, 0, 1, 0, 170, 169, 0 , 0 , 0 , 0 ), // #561 {tmem, tmm}
+ ROW(1, 0, 1, 0, 169, 0 , 0 , 0 , 0 , 0 ), // #562 {tmm}
+ ROW(3, 1, 1, 2, 6 , 44 , 45 , 0 , 0 , 0 ), // #563 {r32, <edx>, <eax>}
+ ROW(3, 1, 1, 0, 55 , 55 , 70 , 0 , 0 , 0 ), // #564 {xmm, xmm, xmm|m64|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 124, 0 , 0 , 0 ), // #565 {xmm, xmm, xmm|m16|mem}
+ ROW(3, 1, 1, 0, 55 , 55 , 122, 0 , 0 , 0 ), // #566 {xmm, xmm, xmm|m32|mem}
+ ROW(2, 1, 1, 0, 102, 21 , 0 , 0 , 0 , 0 ), // #567 {xmm|ymm, m16|mem}
+ ROW(2, 1, 1, 0, 57 , 59 , 0 , 0 , 0 , 0 ), // #568 {ymm, m128|mem}
+ ROW(2, 1, 1, 0, 171, 70 , 0 , 0 , 0 , 0 ), // #569 {ymm|zmm, xmm|m64|mem}
+ ROW(2, 1, 1, 0, 171, 59 , 0 , 0 , 0 , 0 ), // #570 {ymm|zmm, m128|mem}
+ ROW(2, 1, 1, 0, 61 , 60 , 0 , 0 , 0 , 0 ), // #571 {zmm, m256|mem}
+ ROW(2, 1, 1, 0, 149, 122, 0 , 0 , 0 , 0 ), // #572 {xmm|ymm|zmm, m32|mem|xmm}
+ ROW(4, 1, 1, 0, 120, 55 , 70 , 10 , 0 , 0 ), // #573 {xmm|k, xmm, xmm|m64|mem, i8|u8}
+ ROW(4, 1, 1, 0, 92 , 55 , 124, 10 , 0 , 0 ), // #574 {k, xmm, xmm|m16|mem, i8|u8}
+ ROW(4, 1, 1, 0, 120, 55 , 122, 10 , 0 , 0 ), // #575 {xmm|k, xmm, xmm|m32|mem, i8|u8}
+ ROW(2, 1, 1, 0, 55 , 172, 0 , 0 , 0 , 0 ), // #576 {xmm, xmm|m128|ymm|m256|zmm|m512}
+ ROW(3, 1, 1, 0, 56 , 171, 10 , 0 , 0 , 0 ), // #577 {xmm|m128|mem, ymm|zmm, i8|u8}
+ ROW(4, 1, 1, 0, 55 , 55 , 70 , 10 , 0 , 0 ), // #578 {xmm, xmm, xmm|m64|mem, i8|u8}
+ ROW(4, 1, 1, 0, 55 , 55 , 122, 10 , 0 , 0 ), // #579 {xmm, xmm, xmm|m32|mem, i8|u8}
+ ROW(3, 1, 1, 0, 92 , 172, 10 , 0 , 0 , 0 ), // #580 {k, xmm|m128|ymm|m256|zmm|m512, i8|u8}
+ ROW(3, 1, 1, 0, 92 , 70 , 10 , 0 , 0 , 0 ), // #581 {k, xmm|m64|mem, i8|u8}
+ ROW(3, 1, 1, 0, 92 , 124, 10 , 0 , 0 , 0 ), // #582 {k, xmm|m16|mem, i8|u8}
+ ROW(3, 1, 1, 0, 92 , 122, 10 , 0 , 0 , 0 ), // #583 {k, xmm|m32|mem, i8|u8}
+ ROW(4, 1, 1, 0, 55 , 55 , 124, 10 , 0 , 0 ), // #584 {xmm, xmm, xmm|m16|mem, i8|u8}
+ ROW(4, 1, 1, 0, 61 , 61 , 58 , 10 , 0 , 0 ), // #585 {zmm, zmm, ymm|m256|mem, i8|u8}
+ ROW(2, 1, 1, 0, 6 , 102, 0 , 0 , 0 , 0 ), // #586 {r32, xmm|ymm}
+ ROW(2, 1, 1, 0, 149, 173, 0 , 0 , 0 , 0 ), // #587 {xmm|ymm|zmm, xmm|m8|mem|r32}
+ ROW(2, 1, 1, 0, 149, 174, 0 , 0 , 0 , 0 ), // #588 {xmm|ymm|zmm, xmm|m32|mem|r32}
+ ROW(2, 1, 1, 0, 149, 92 , 0 , 0 , 0 , 0 ), // #589 {xmm|ymm|zmm, k}
+ ROW(2, 1, 1, 0, 149, 175, 0 , 0 , 0 , 0 ), // #590 {xmm|ymm|zmm, xmm|m16|mem|r32}
+ ROW(3, 1, 1, 0, 117, 55 , 10 , 0 , 0 , 0 ), // #591 {r32|m16|mem, xmm, i8|u8}
+ ROW(4, 1, 1, 0, 55 , 55 , 137, 10 , 0 , 0 ), // #592 {xmm, xmm, r32|m8|mem, i8|u8}
+ ROW(4, 1, 1, 0, 55 , 55 , 25 , 10 , 0 , 0 ), // #593 {xmm, xmm, r32|m32|mem, i8|u8}
+ ROW(4, 0, 1, 0, 55 , 55 , 26 , 10 , 0 , 0 ), // #594 {xmm, xmm, r64|m64|mem, i8|u8}
+ ROW(4, 1, 1, 0, 55 , 55 , 117, 10 , 0 , 0 ), // #595 {xmm, xmm, r32|m16|mem, i8|u8}
+ ROW(2, 1, 1, 0, 92 , 149, 0 , 0 , 0 , 0 ), // #596 {k, xmm|ymm|zmm}
+ ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // #597 {ymm, xmm}
+ ROW(2, 1, 1, 0, 57 , 57 , 0 , 0 , 0 , 0 ), // #598 {ymm, ymm}
+ ROW(3, 1, 1, 0, 57 , 57 , 55 , 0 , 0 , 0 ), // #599 {ymm, ymm, xmm}
+ ROW(3, 1, 1, 2, 127, 44 , 45 , 0 , 0 , 0 ), // #600 {mem, <edx>, <eax>}
+ ROW(3, 0, 1, 2, 127, 44 , 45 , 0 , 0 , 0 ) // #601 {mem, <edx>, <eax>}
+};
+#undef ROW
+
+#define ROW(op_flags, reg_id) { op_flags, uint8_t(reg_id) }
+#define F(VAL) uint64_t(InstDB::OpFlags::k##VAL)
+const InstDB::OpSignature InstDB::_op_signature_table[] = {
+ ROW(0, 0xFF),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi), 0x00),
+ ROW(F(RegGpw) | F(RegSReg) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpw), 0x00),
+ ROW(F(RegGpd) | F(RegSReg) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpd), 0x00),
+ ROW(F(RegGpq) | F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpq), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(Mem8), 0x00),
+ ROW(F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegGpw) | F(Mem16), 0x00),
+ ROW(F(ImmI16) | F(ImmU16), 0x00),
+ ROW(F(RegGpd) | F(Mem32), 0x00),
+ ROW(F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(RegGpq) | F(Mem64), 0x00),
+ ROW(F(ImmI32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegSReg) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegSReg) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64) | F(ImmI64) | F(ImmU64), 0x00),
+ ROW(F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegSReg), 0x00),
+ ROW(F(RegCReg) | F(RegDReg), 0x00),
+ ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(Mem16) | F(Mem32), 0x00),
+ ROW(F(ImmI8), 0x00),
+ ROW(F(ImmI8) | F(ImmI32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(Mem64), 0x00),
+ ROW(F(MemUnspecified) | F(Mem8) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(MemUnspecified) | F(Mem16) | F(ImmI8) | F(ImmI16) | F(ImmU16), 0x00),
+ ROW(F(MemUnspecified) | F(Mem32) | F(ImmI8) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmI32), 0x00),
+ ROW(F(Mem8), 0x00),
+ ROW(F(Mem16) | F(Mem32), 0x00),
+ ROW(F(Mem16), 0x00),
+ ROW(F(Mem32), 0x00),
+ ROW(F(RegGpw) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpw) | F(FlagImplicit), 0x04),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x04),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x04),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x01),
+ ROW(F(ImmI8) | F(ImmI16) | F(ImmU16), 0x00),
+ ROW(F(ImmI8) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(ImmI64) | F(ImmU64), 0x00),
+ ROW(F(RegGpbLo), 0x01),
+ ROW(F(RegGpw), 0x01),
+ ROW(F(RegGpd), 0x01),
+ ROW(F(RegGpq), 0x01),
+ ROW(F(RegXmm), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem128), 0x00),
+ ROW(F(RegYmm), 0x00),
+ ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256), 0x00),
+ ROW(F(MemUnspecified) | F(Mem128), 0x00),
+ ROW(F(MemUnspecified) | F(Mem256), 0x00),
+ ROW(F(RegZmm), 0x00),
+ ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512), 0x00),
+ ROW(F(MemUnspecified) | F(Mem512), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem128) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegMm), 0x00),
+ ROW(F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegXmm) | F(RegMm), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(RegSReg), 0x1A),
+ ROW(F(RegSReg), 0x60),
+ ROW(F(RegGpw) | F(Mem16) | F(ImmI8) | F(ImmU8) | F(ImmI16) | F(ImmU16), 0x00),
+ ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(RegGpq) | F(Mem64) | F(ImmI32), 0x00),
+ ROW(F(RegSReg), 0x1E),
+ ROW(F(Vm32x), 0x00),
+ ROW(F(Vm32y), 0x00),
+ ROW(F(Vm32z), 0x00),
+ ROW(F(Vm64x), 0x00),
+ ROW(F(Vm64y), 0x00),
+ ROW(F(Vm64z), 0x00),
+ ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(RegGpbLo) | F(FlagImplicit), 0x01),
+ ROW(F(RegKReg), 0x00),
+ ROW(F(RegKReg) | F(MemUnspecified) | F(Mem64), 0x00),
+ ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(RegXmm) | F(RegYmm), 0x00),
+ ROW(F(ImmI4) | F(ImmU4), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(MemUnspecified) | F(Mem16) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(RegGpw) | F(RegGpd), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(Mem8) | F(Mem16) | F(Mem32), 0x00),
+ ROW(F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegSt), 0x01),
+ ROW(F(RegSt), 0x00),
+ ROW(F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00),
+ ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
+ ROW(F(ImmI16) | F(ImmU16) | F(ImmI32) | F(ImmU32), 0x00),
+ ROW(F(MemUnspecified) | F(Mem32) | F(Mem48), 0x00),
+ ROW(F(MemUnspecified) | F(Mem80), 0x00),
+ ROW(F(MemUnspecified) | F(Mem48), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00),
+ ROW(F(RegGpbLo) | F(ImmI8) | F(ImmU8), 0x02),
+ ROW(F(RegXmm) | F(RegKReg), 0x00),
+ ROW(F(RegYmm) | F(RegKReg), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(Vm64x) | F(Vm64y), 0x00),
+ ROW(F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegBnd), 0x00),
+ ROW(F(RegBnd) | F(MemUnspecified), 0x00),
+ ROW(F(MemUnspecified), 0x00),
+ ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpq) | F(Mem8) | F(Mem64), 0x00),
+ ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemEs), 0x00),
+ ROW(F(RegSt) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x02),
+ ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpw) | F(RegGpd) | F(FlagImplicit), 0x02),
+ ROW(F(ImmI32) | F(ImmI64) | F(Rel8), 0x00),
+ ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x02),
+ ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpd) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem48) | F(Mem64) | F(Mem80) | F(Mem128) | F(Mem256) | F(Mem512) | F(Mem1024), 0x00),
+ ROW(F(RegGpd) | F(RegGpq), 0x00),
+ ROW(F(RegMm) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegMm) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(ImmU16), 0x00),
+ ROW(F(RegGpw) | F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(RegGpq) | F(MemUnspecified) | F(Mem16), 0x00),
+ ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs), 0x00),
+ ROW(F(RegXmm) | F(RegYmm) | F(Mem128) | F(Mem256), 0x00),
+ ROW(F(RegXmm) | F(RegYmm) | F(RegZmm), 0x00),
+ ROW(F(RegXmm) | F(ImmI8) | F(ImmU8), 0x00),
+ ROW(F(RegXmm) | F(FlagImplicit), 0x01),
+ ROW(F(MemUnspecified) | F(FlagMib), 0x00),
+ ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x02),
+ ROW(F(RegGpq) | F(FlagImplicit), 0x08),
+ ROW(F(RegGpd) | F(FlagImplicit), 0x08),
+ ROW(F(Mem16) | F(Mem32) | F(Mem64), 0x00),
+ ROW(F(RegSt) | F(Mem32) | F(Mem64) | F(Mem80), 0x00),
+ ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x01),
+ ROW(F(RegGpbLo) | F(RegGpw) | F(RegGpd), 0x01),
+ ROW(F(RegGpw) | F(ImmI8) | F(ImmU8), 0x04),
+ ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
+ ROW(F(RegGpw), 0x04),
+ ROW(F(RegGpbHi) | F(FlagImplicit), 0x01),
+ ROW(F(MemUnspecified) | F(Mem128) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x80),
+ ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01),
+ ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
+ ROW(F(RegTmm), 0x00),
+ ROW(F(MemUnspecified) | F(FlagTMem), 0x00),
+ ROW(F(RegYmm) | F(RegZmm), 0x00),
+ ROW(F(RegXmm) | F(RegYmm) | F(RegZmm) | F(Mem128) | F(Mem256) | F(Mem512), 0x00),
+ ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem8), 0x00),
+ ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00),
+ ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00)
+};
+#undef F
+#undef ROW
+// ----------------------------------------------------------------------------
+// ${InstSignatureTable:End}
+#endif // !ASMJIT_NO_INTROSPECTION
+
+// x86::InstInternal - QueryRWInfo
+// ===============================
+
+// ${InstRWInfoTable:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+const uint8_t InstDB::rw_info_index_a_table[Inst::_kIdCount] = {
+ 0, 0, 1, 2, 1, 2, 0, 3, 4, 3, 5, 5, 6, 7, 5, 5, 4, 5, 5, 5, 5, 8, 0, 3, 0, 5,
+ 5, 5, 5, 2, 9, 2, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, 11, 11,
+ 11, 12, 12, 13, 14, 15, 10, 10, 0, 16, 17, 17, 17, 0, 0, 0, 18, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0,
+ 0, 21, 22, 0, 23, 24, 25, 8, 26, 26, 26, 25, 27, 8, 25, 28, 29, 30, 31, 32, 33,
+ 34, 26, 26, 8, 28, 29, 34, 35, 0, 0, 0, 0, 36, 5, 5, 6, 7, 0, 0, 0, 0, 0, 37,
+ 37, 0, 0, 38, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 39, 0, 39, 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, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 39, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 40, 0, 0, 5, 5, 5, 0, 41, 5, 5, 36, 42, 43, 0, 0, 0, 44, 0, 38, 0, 0, 0, 0,
+ 45, 0, 46, 0, 45, 45, 0, 0, 0, 0, 0, 47, 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, 48, 49, 50, 51, 52, 53, 54, 55,
+ 0, 0, 0, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, 58, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 61, 0, 2, 0, 62, 0, 2, 0, 2, 0, 2, 0, 0, 0, 0,
+ 0, 63, 64, 64, 64, 60, 2, 0, 0, 0, 10, 0, 0, 5, 5, 6, 7, 0, 0, 5, 5, 6, 7, 0,
+ 0, 65, 66, 67, 67, 68, 49, 25, 37, 68, 54, 67, 67, 69, 70, 70, 71, 72, 72, 73,
+ 73, 61, 61, 68, 61, 61, 72, 72, 74, 50, 54, 75, 76, 8, 8, 77, 78, 10, 67, 67,
+ 78, 0, 36, 5, 5, 6, 7, 0, 79, 0, 0, 80, 0, 3, 5, 5, 81, 82, 10, 10, 10, 4,
+ 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4, 83, 4, 0, 0, 0, 4, 4, 5, 4, 0,
+ 0, 4, 4, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 84, 28, 28, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 28, 83, 83, 83, 28, 28, 83, 83, 83, 4, 4, 4, 85, 4, 4, 4, 28, 28,
+ 0, 0, 0, 0, 4, 4, 5, 5, 4, 4, 5, 5, 5, 5, 4, 4, 5, 5, 86, 87, 88, 25, 25, 25,
+ 87, 87, 88, 25, 25, 25, 87, 5, 4, 83, 4, 4, 5, 4, 4, 0, 0, 0, 10, 0, 0, 0, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 89, 4, 4, 0, 4, 4,
+ 4, 89, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 28, 90, 0, 4, 4, 5, 4, 91, 91, 5, 91, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4, 92, 8, 93, 92, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0,
+ 0, 0, 0, 0, 92, 92, 0, 0, 0, 0, 0, 0, 8, 93, 0, 0, 92, 0, 0, 3, 96, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5,
+ 5, 0, 92, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 27, 93, 0, 0, 0, 0, 0, 0,
+ 97, 0, 0, 0, 3, 5, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 16, 0, 98, 98, 0, 99, 0, 0, 0, 10, 10, 21, 22, 100, 100, 0, 0, 0, 0, 5, 5,
+ 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 101, 101, 0,
+ 0, 0, 0, 0, 0, 102, 29, 103, 104, 103, 104, 102, 29, 103, 104, 103, 104, 105,
+ 106, 0, 0, 0, 0, 0, 0, 21, 107, 22, 108, 108, 109, 110, 10, 0, 68, 68, 68, 68,
+ 110, 110, 111, 110, 10, 110, 10, 109, 112, 109, 109, 112, 109, 112, 10, 10,
+ 10, 109, 0, 110, 109, 10, 109, 10, 113, 110, 0, 29, 0, 29, 0, 114, 0, 114, 0,
+ 0, 0, 0, 0, 34, 34, 110, 10, 110, 10, 109, 112, 109, 112, 10, 10, 10, 109, 10,
+ 109, 29, 29, 114, 114, 34, 34, 109, 110, 10, 10, 111, 110, 0, 0, 0, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 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, 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,
+ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10,
+ 28, 115, 2, 2, 2, 116, 10, 10, 10, 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, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 117, 49, 118, 117, 117, 117, 117, 117,
+ 117, 117, 117, 0, 119, 119, 0, 72, 72, 120, 121, 68, 68, 68, 68, 122, 72, 123,
+ 10, 10, 74, 117, 117, 51, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0,
+ 0, 0, 0, 0, 10, 10, 10, 10, 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, 125, 34, 126, 126, 29, 114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 0,
+ 0, 0, 0, 0, 0, 10, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10,
+ 10, 0, 0, 0, 0, 2, 2, 116, 2, 8, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8, 8, 0, 8, 8, 85,
+ 8, 0, 8, 0, 0, 8, 0, 0, 0, 0, 10, 10, 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, 0, 0, 127, 127, 128,
+ 129, 126, 126, 126, 126, 86, 127, 130, 129, 128, 128, 129, 130, 129, 128, 129,
+ 112, 131, 109, 109, 109, 112, 128, 129, 130, 129, 128, 129, 127, 129, 112, 131,
+ 109, 109, 109, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 68, 132, 68, 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, 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, 124,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10,
+ 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0,
+ 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 68, 68, 132, 133, 134, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 124, 21,
+ 107, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 72, 74, 72, 0, 135, 0, 136,
+ 0, 0, 0, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+const uint8_t InstDB::rw_info_index_b_table[Inst::_kIdCount] = {
+ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0,
+ 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 4, 8, 1, 0, 9, 0, 0, 0, 10, 10, 10, 0, 0, 11, 0,
+ 0, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, 13, 0, 14, 15, 13, 16, 17, 18, 13,
+ 0, 0, 19, 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, 20, 1, 1, 21, 22, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0,
+ 25, 26, 27, 28, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 29, 30, 30, 29, 0, 0, 0,
+ 25, 26, 25, 26, 0, 26, 25, 25, 25, 25, 25, 25, 25, 0, 0, 31, 31, 31, 25, 25,
+ 29, 0, 32, 10, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 33, 34, 33, 35, 0, 0, 0, 0,
+ 0, 10, 33, 0, 0, 0, 0, 36, 34, 33, 36, 35, 25, 26, 25, 26, 0, 30, 30, 30, 30,
+ 0, 0, 0, 26, 10, 10, 33, 33, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 22, 37, 0,
+ 21, 38, 38, 0, 39, 40, 0, 0, 0, 0, 0, 10, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 44, 45, 42, 43, 42, 43, 44, 45,
+ 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 44, 0, 0, 0, 0, 45, 46, 47, 48, 49,
+ 46, 47, 48, 49, 0, 0, 0, 0, 50, 51, 52, 42, 43, 44, 45, 42, 43, 44, 45, 53, 0,
+ 25, 0, 54, 0, 55, 0, 0, 0, 0, 0, 10, 0, 10, 25, 56, 57, 56, 0, 0, 0, 0, 0, 0,
+ 56, 58, 58, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 61, 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,
+ 62, 0, 0, 62, 0, 0, 0, 0, 0, 5, 63, 0, 0, 0, 0, 64, 0, 65, 21, 66, 21, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 6,
+ 5, 5, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 70, 71, 0, 3, 3, 72, 23, 73, 74, 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, 75, 39, 76, 77, 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, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 0, 0, 2, 2, 2, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 81, 80, 81, 81, 81, 80, 80, 82, 83,
+ 0, 84, 0, 0, 0, 0, 0, 0, 85, 2, 2, 86, 87, 0, 0, 0, 11, 88, 0, 4, 0, 0, 0, 0,
+ 0, 0, 89, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 90,
+ 0, 33, 0, 0, 0, 5, 0, 0, 6, 0, 91, 4, 0, 91, 4, 5, 5, 33, 20, 92, 80, 92, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 92, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 95, 95, 0, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 96, 0, 97, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 97, 0, 0, 0, 0, 3, 3, 3, 98, 99, 100, 3, 3, 3, 3, 3, 3, 0, 2,
+ 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 101, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 102, 3, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0,
+ 98, 0, 107, 0, 99, 0, 108, 0, 109, 110, 111, 112, 113, 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, 109, 110, 111, 0,
+ 0, 3, 3, 3, 3, 98, 99, 100, 3, 114, 3, 56, 56, 0, 0, 115, 116, 117, 116, 117,
+ 115, 116, 117, 116, 117, 23, 118, 119, 118, 119, 120, 120, 121, 122, 120, 120,
+ 120, 123, 124, 125, 120, 120, 120, 123, 124, 125, 120, 120, 120, 123, 124,
+ 125, 118, 119, 126, 126, 127, 128, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 126, 126, 120, 120, 120, 123, 129, 125, 120, 120, 120, 123, 129, 125, 120, 120,
+ 120, 123, 129, 125, 120, 120, 120, 120, 120, 120, 120, 120, 120, 126, 126,
+ 126, 126, 127, 128, 118, 130, 120, 120, 120, 123, 124, 125, 120, 120, 120, 123,
+ 124, 125, 120, 120, 120, 123, 124, 125, 126, 126, 127, 128, 120, 120, 120,
+ 123, 129, 125, 120, 120, 120, 123, 129, 125, 120, 120, 120, 131, 129, 132, 126,
+ 126, 127, 128, 133, 133, 133, 79, 134, 135, 0, 0, 0, 0, 136, 137, 137, 138,
+ 0, 0, 0, 139, 140, 141, 85, 85, 85, 139, 140, 141, 3, 3, 3, 3, 3, 3, 3, 142, 143,
+ 144, 143, 144, 142, 143, 144, 143, 144, 100, 0, 54, 59, 145, 145, 3, 3, 3,
+ 98, 99, 100, 0, 11, 0, 0, 3, 3, 3, 98, 99, 100, 0, 146, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 147, 148, 148, 149, 150, 150, 0, 0, 0, 0, 0, 0, 0, 151, 152,
+ 0, 0, 153, 0, 0, 0, 3, 11, 154, 0, 0, 155, 146, 3, 3, 3, 98, 99, 100, 0, 0, 11,
+ 3, 3, 156, 156, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 101, 3, 0, 0, 0, 0, 0, 0, 3, 126, 102, 102, 3,
+ 3, 3, 3, 68, 69, 3, 3, 3, 3, 70, 71, 102, 102, 102, 102, 102, 102, 114, 114, 0,
+ 0, 0, 0, 114, 114, 114, 114, 114, 114, 0, 0, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 157, 157, 3, 3, 120, 120, 3,
+ 3, 120, 120, 126, 126, 158, 158, 158, 3, 158, 120, 120, 120, 120, 120, 120, 3,
+ 0, 0, 0, 0, 72, 23, 73, 159, 137, 136, 138, 137, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0,
+ 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 3, 0, 160, 100, 98, 99, 0, 0, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161, 120, 120, 3, 3, 145, 145, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 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, 0, 0, 0, 0, 0, 0, 0,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 162, 85, 85, 3, 3, 85, 85, 3,
+ 3, 163, 163, 163, 163, 3, 0, 0, 0, 0, 163, 163, 163, 163, 163, 163, 3, 3, 120,
+ 120, 120, 3, 163, 163, 3, 3, 120, 120, 120, 3, 3, 102, 85, 85, 85, 3, 3, 3,
+ 164, 165, 164, 3, 3, 3, 166, 164, 167, 3, 3, 3, 166, 164, 165, 164, 3, 3, 3, 166,
+ 3, 3, 3, 3, 3, 3, 3, 3, 168, 168, 0, 102, 102, 102, 102, 102, 102, 102, 102,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 139, 141, 0, 0, 139, 141, 0, 0, 140,
+ 141, 85, 85, 85, 139, 140, 141, 85, 85, 85, 139, 140, 141, 85, 85, 139, 141,
+ 0, 0, 139, 141, 0, 0, 140, 141, 3, 3, 3, 98, 99, 100, 0, 0, 0, 0, 0, 0, 169, 3,
+ 3, 3, 3, 3, 3, 170, 170, 170, 3, 3, 0, 0, 0, 139, 140, 141, 93, 3, 3, 3, 98,
+ 99, 100, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 57, 57, 171, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 172, 172, 172, 172, 173, 173, 173, 173, 173,
+ 173, 173, 173, 171, 0, 0
+};
+
+const InstDB::RWInfo InstDB::rw_info_a_table[] = {
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=999x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #2 [ref=15x]
+ { InstDB::RWInfo::kCategoryGeneric , 1 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #3 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #4 [ref=82x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=55x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #6 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #7 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #8 [ref=26x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 12, 13, 0 , 0 , 0 , 0 } }, // #9 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #10 [ref=75x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 5 , 3 , 0 , 0 , 0 , 0 } }, // #11 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 10, 3 , 0 , 0 , 0 , 0 } }, // #12 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 9 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 15, 5 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #16 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #17 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 17, 0 , 0 , 0 , 0 } }, // #18 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 1 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #19 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 20, 21, 0 , 0 , 0 , 0 } }, // #20 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #22 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 33, 34, 0 , 0 , 0 , 0 } }, // #23 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #24 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 10, 7 , 0 , 0 , 0 , 0 } }, // #25 [ref=10x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 35, 5 , 0 , 0 , 0 , 0 } }, // #26 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #27 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #28 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #29 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 37, 7 , 0 , 0 , 0 , 0 } }, // #30 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 36, 3 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 37, 3 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 36, 9 , 0 , 0 , 0 , 0 } }, // #33 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 11, 9 , 0 , 0 , 0 , 0 } }, // #34 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 38, 39, 0 , 0 , 0 , 0 } }, // #35 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 17, { 1 , 40, 0 , 0 , 0 , 0 } }, // #36 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 43, 44, 0 , 0 , 0 , 0 } }, // #37 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #38 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 47, 0 , 0 , 0 , 0 } }, // #39 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 51, 30, 0 , 0 , 0 , 0 } }, // #40 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 51, 0 , 0 , 0 , 0 } }, // #41 [ref=1x]
+ { InstDB::RWInfo::kCategoryImul , 2 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #42 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 53, 0 , 0 , 0 , 0 } }, // #43 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 54, 53, 0 , 0 , 0 , 0 } }, // #44 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 3 , 5 , 0 , 0 , 0 , 0 } }, // #45 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 29, 0 , 0 , 0 , 0 } }, // #46 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 0 , 0 , 0 , 0 , 0 } }, // #47 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 23, { 57, 40, 0 , 0 , 0 , 0 } }, // #48 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 24, { 45, 9 , 0 , 0 , 0 , 0 } }, // #49 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 25, { 35, 7 , 0 , 0 , 0 , 0 } }, // #50 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 26, { 49, 13, 0 , 0 , 0 , 0 } }, // #51 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 40, 0 , 0 , 0 , 0 } }, // #52 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #53 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #54 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 0 , 0 , 0 , 0 } }, // #55 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 40, 40, 0 , 0 , 0 , 0 } }, // #56 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #57 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #58 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 13, 13, 0 , 0 , 0 , 0 } }, // #59 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 3 , 0 , 0 , 0 , 0 } }, // #60 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 10, 5 , 0 , 0 , 0 , 0 } }, // #61 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #62 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 20, 0 , 0 , 0 , 0 } }, // #63 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 59, 0 , 0 , 0 , 0 , 0 } }, // #64 [ref=3x]
+ { InstDB::RWInfo::kCategoryMov , 29, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #65 [ref=1x]
+ { InstDB::RWInfo::kCategoryMovabs , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #66 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 30, { 10, 5 , 0 , 0 , 0 , 0 } }, // #67 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #68 [ref=18x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 36, 63, 0 , 0 , 0 , 0 } }, // #69 [ref=1x]
+ { InstDB::RWInfo::kCategoryMovh64 , 12, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #70 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 64, 7 , 0 , 0 , 0 , 0 } }, // #71 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 7 , 0 , 0 , 0 , 0 } }, // #72 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 5 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 28, { 45, 9 , 0 , 0 , 0 , 0 } }, // #74 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 65, 20, 0 , 0 , 0 , 0 } }, // #75 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 31, { 35, 7 , 0 , 0 , 0 , 0 } }, // #76 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 33, { 45, 9 , 0 , 0 , 0 , 0 } }, // #77 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 11, 3 , 0 , 0 , 0 , 0 } }, // #78 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 0 , 0 , 0 , 0 } }, // #79 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #80 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 22, 0 , 0 , 0 , 0 } }, // #81 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 53, 68, 0 , 0 , 0 , 0 } }, // #82 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 26, 7 , 0 , 0 , 0 , 0 } }, // #83 [ref=18x]
+ { InstDB::RWInfo::kCategoryGeneric , 36, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #84 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 71, 5 , 0 , 0 , 0 , 0 } }, // #85 [ref=2x]
+ { InstDB::RWInfo::kCategoryVmov1_8 , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #86 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 10, 9 , 0 , 0 , 0 , 0 } }, // #87 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 10, 13, 0 , 0 , 0 , 0 } }, // #88 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #89 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 0 , 0 , 0 } }, // #90 [ref=1x]
+ { InstDB::RWInfo::kCategoryPunpcklxx , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #91 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 72, 0 , 0 , 0 , 0 } }, // #92 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #93 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 0 , 0 , 0 , 0 , 0 } }, // #94 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 0 , 0 , 0 , 0 } }, // #95 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 21, 0 , 0 , 0 , 0 } }, // #96 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 65, 22, 0 , 0 , 0 , 0 } }, // #97 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 43, 3 , 0 , 0 , 0 , 0 } }, // #98 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 44, 0 , 0 , 0 , 0 } }, // #99 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 76, 9 , 0 , 0 , 0 , 0 } }, // #100 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 11, 13, 0 , 0 , 0 , 0 } }, // #101 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 77, 5 , 0 , 0 , 0 , 0 } }, // #102 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 11, 5 , 0 , 0 , 0 , 0 } }, // #103 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 43, { 43, 78, 0 , 0 , 0 , 0 } }, // #104 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 44, { 11, 7 , 0 , 0 , 0 , 0 } }, // #105 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 45, { 11, 9 , 0 , 0 , 0 , 0 } }, // #106 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 13, 13, 0 , 0 , 0 , 0 } }, // #107 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 11, 3 , 0 , 0 , 0 , 0 } }, // #108 [ref=7x]
+ { InstDB::RWInfo::kCategoryVmov2_1 , 46, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #109 [ref=19x]
+ { InstDB::RWInfo::kCategoryVmov1_2 , 16, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #110 [ref=11x]
+ { InstDB::RWInfo::kCategoryVmov1_4 , 16, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #111 [ref=2x]
+ { InstDB::RWInfo::kCategoryVmov4_1 , 47, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #112 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 10, 3 , 0 , 0 , 0 , 0 } }, // #113 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 13, 0 , 0 , 0 , 0 } }, // #114 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #115 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #116 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 57, { 11, 3 , 0 , 0 , 0 , 0 } }, // #117 [ref=12x]
+ { InstDB::RWInfo::kCategoryVmovddup , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #118 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 63, 0 , 0 , 0 , 0 } }, // #119 [ref=2x]
+ { InstDB::RWInfo::kCategoryVmovmskpd , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #120 [ref=1x]
+ { InstDB::RWInfo::kCategoryVmovmskps , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #121 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 58, { 35, 7 , 0 , 0 , 0 , 0 } }, // #122 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 49, 13, 0 , 0 , 0 , 0 } }, // #123 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #124 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 17, { 11, 40, 0 , 0 , 0 , 0 } }, // #125 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #126 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 3 , 0 , 0 , 0 , 0 } }, // #127 [ref=4x]
+ { InstDB::RWInfo::kCategoryVmov1_4 , 61, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #128 [ref=6x]
+ { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #129 [ref=9x]
+ { InstDB::RWInfo::kCategoryVmov1_8 , 62, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #130 [ref=3x]
+ { InstDB::RWInfo::kCategoryVmov8_1 , 63, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #131 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 3 , 0 , 0 , 0 , 0 } }, // #132 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 87, 5 , 0 , 0 , 0 , 0 } }, // #133 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 87, 78, 0 , 0 , 0 , 0 } }, // #134 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #135 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 57, { 2 , 2 , 0 , 0 , 0 , 0 } } // #136 [ref=1x]
+};
+
+const InstDB::RWInfo InstDB::rw_info_b_table[] = {
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=758x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #2 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #3 [ref=193x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #4 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=14x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 14, 0 , 0 , 0 } }, // #6 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 0 , 0 , 0 , 0 , 0 } }, // #7 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #8 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 18, 0 , 0 , 0 , 0 , 0 } }, // #9 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #10 [ref=21x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 0 , 0 , 0 , 0 , 0 } }, // #11 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 19, 0 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 2 , 3 , 0 , 0 , 0 } }, // #13 [ref=16x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 22, 0 , 0 , 0 } }, // #16 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 23, 18, 24, 25, 0 } }, // #17 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 26, 27, 28, 29, 30, 0 } }, // #18 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 31, 32, 16, 0 , 0 } }, // #19 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 0 , 0 , 0 , 0 , 0 } }, // #20 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 0 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 41, 42, 3 , 0 , 0 , 0 } }, // #22 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 18, { 45, 5 , 0 , 0 , 0 , 0 } }, // #23 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #24 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #25 [ref=17x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 0 , 0 , 0 , 0 , 0 } }, // #26 [ref=16x]
+ { InstDB::RWInfo::kCategoryGeneric , 19, { 47, 0 , 0 , 0 , 0 , 0 } }, // #27 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 19, { 48, 0 , 0 , 0 , 0 , 0 } }, // #28 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 20, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #29 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 47, 0 , 0 , 0 , 0 , 0 } }, // #30 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 0 , 0 , 0 , 0 , 0 } }, // #31 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 13, 0 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #33 [ref=8x]
+ { InstDB::RWInfo::kCategoryGeneric , 21, { 49, 0 , 0 , 0 , 0 , 0 } }, // #34 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 50, 0 , 0 , 0 , 0 , 0 } }, // #35 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 20, { 11, 0 , 0 , 0 , 0 , 0 } }, // #36 [ref=2x]
+ { InstDB::RWInfo::kCategoryImul , 22, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #37 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 40, 0 , 0 , 0 , 0 , 0 } }, // #38 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 4 , 9 , 0 , 0 , 0 , 0 } }, // #39 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #40 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 55, 56, 0 , 0 , 0 } }, // #41 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 40, 40, 0 , 0 , 0 } }, // #42 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 9 , 0 , 0 , 0 } }, // #43 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 7 , 0 , 0 , 0 } }, // #44 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 13, 0 , 0 , 0 } }, // #45 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 40, 0 , 0 , 0 , 0 } }, // #46 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #47 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #48 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 0 , 0 , 0 , 0 } }, // #49 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 40, 40, 0 , 0 , 0 } }, // #50 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 9 , 9 , 0 , 0 , 0 } }, // #51 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 13, 13, 0 , 0 , 0 } }, // #52 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 0 , 0 , 0 , 0 , 0 } }, // #53 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 28, { 9 , 0 , 0 , 0 , 0 , 0 } }, // #54 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 44, 0 , 0 , 0 , 0 , 0 } }, // #55 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 13, 0 , 0 , 0 , 0 , 0 } }, // #56 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #57 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 3 , 9 , 0 , 0 , 0 , 0 } }, // #58 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 15, { 5 , 5 , 60, 0 , 0 , 0 } }, // #59 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 7 , 61, 0 , 0 , 0 } }, // #60 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 62, 29, 55, 0 , 0 , 0 } }, // #61 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 32, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #62 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 66, 42, 3 , 0 , 0 , 0 } }, // #63 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 11, 3 , 67, 0 , 0 } }, // #64 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 30, 0 , 0 , 0 } }, // #65 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #66 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #67 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 69, 17, 55 } }, // #68 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 70, 17, 55 } }, // #69 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 69, 0 , 0 } }, // #70 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 70, 0 , 0 } }, // #71 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 34, { 57, 5 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 5 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 37, { 49, 3 , 0 , 0 , 0 , 0 } }, // #74 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 17, { 4 , 40, 0 , 0 , 0 , 0 } }, // #75 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 4 , 7 , 0 , 0 , 0 , 0 } }, // #76 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 2 , 13, 0 , 0 , 0 , 0 } }, // #77 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 10, { 11, 0 , 0 , 0 , 0 , 0 } }, // #78 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #79 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #80 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 29, 0 , 0 , 0 } }, // #81 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 0 , 0 , 0 , 0 , 0 } }, // #82 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 0 , 0 , 0 , 0 , 0 } }, // #83 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 69, 0 , 0 , 0 } }, // #84 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #85 [ref=19x]
+ { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #86 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #87 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 73, 0 , 0 , 0 , 0 , 0 } }, // #88 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 0 , 0 , 0 , 0 , 0 } }, // #89 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 34, { 74, 0 , 0 , 0 , 0 , 0 } }, // #90 [ref=16x]
+ { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 72, 0 , 0 , 0 } }, // #91 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 39, { 11, 0 , 0 , 0 , 0 , 0 } }, // #92 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 28, { 45, 0 , 0 , 0 , 0 , 0 } }, // #93 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 13, { 43, 0 , 0 , 0 , 0 , 0 } }, // #94 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 75, 44, 44, 0 , 0 , 0 } }, // #95 [ref=8x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 43, 0 , 0 , 0 , 0 , 0 } }, // #96 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 55, 17, 0 , 0 , 0 } }, // #97 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 7 , 0 , 0 , 0 } }, // #98 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 13, 0 , 0 , 0 } }, // #99 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 9 , 0 , 0 , 0 } }, // #100 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 3 , 0 , 0 } }, // #101 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 35, 3 , 3 , 0 , 0 , 0 } }, // #102 [ref=18x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 11, 5 , 7 , 0 , 0 , 0 } }, // #103 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 35, 13, 13, 0 , 0 , 0 } }, // #104 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 11, 5 , 9 , 0 , 0 , 0 } }, // #105 [ref=1x]
+ { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #106 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 79, 7 , 0 , 0 , 0 } }, // #107 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 5 , 0 , 0 , 0 } }, // #108 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 63, 3 , 0 , 0 , 0 } }, // #109 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 3 , 3 , 0 , 0 , 0 } }, // #110 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 79, 3 , 0 , 0 , 0 } }, // #111 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 63, 9 , 0 , 0 , 0 } }, // #112 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 5 , 0 , 0 , 0 } }, // #113 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 0 , 0 , 0 } }, // #114 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 51, { 10, 78, 0 , 0 , 0 , 0 } }, // #115 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 51, { 10, 3 , 0 , 0 , 0 , 0 } }, // #116 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 52, { 77, 44, 0 , 0 , 0 , 0 } }, // #117 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 80, 3 , 3 , 0 , 0 , 0 } }, // #118 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 81, 5 , 5 , 0 , 0 , 0 } }, // #119 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #120 [ref=90x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 4 , 63, 7 , 0 , 0 , 0 } }, // #121 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 79, 9 , 0 , 0 , 0 } }, // #122 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 6 , 7 , 7 , 0 , 0 , 0 } }, // #123 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 82, 5 , 5 , 0 , 0 , 0 } }, // #124 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 8 , 9 , 9 , 0 , 0 , 0 } }, // #125 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 53, { 11, 3 , 3 , 3 , 0 , 0 } }, // #126 [ref=15x]
+ { InstDB::RWInfo::kCategoryGeneric , 54, { 35, 7 , 7 , 7 , 0 , 0 } }, // #127 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 55, { 45, 9 , 9 , 9 , 0 , 0 } }, // #128 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 82, 5 , 13, 0 , 0 , 0 } }, // #129 [ref=6x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 83, 5 , 5 , 0 , 0 , 0 } }, // #130 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 26, 7 , 7 , 0 , 0 , 0 } }, // #131 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 76, 9 , 9 , 0 , 0 , 0 } }, // #132 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 16, { 35, 3 , 0 , 0 , 0 , 0 } }, // #133 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 27, { 35, 13, 0 , 0 , 0 , 0 } }, // #134 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 5 , { 35, 9 , 0 , 0 , 0 , 0 } }, // #135 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #136 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #137 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 14, { 4 , 3 , 4 , 0 , 0 , 0 } }, // #138 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 63, 7 , 0 , 0 , 0 } }, // #139 [ref=9x]
+ { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 84, 13, 0 , 0 , 0 } }, // #140 [ref=7x]
+ { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 79, 9 , 0 , 0 , 0 } }, // #141 [ref=11x]
+ { InstDB::RWInfo::kCategoryGeneric , 50, { 77, 78, 5 , 0 , 0 , 0 } }, // #142 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 50, { 11, 3 , 5 , 0 , 0 , 0 } }, // #143 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 56, { 43, 44, 78, 0 , 0 , 0 } }, // #144 [ref=4x]
+ { InstDB::RWInfo::kCategoryVmaskmov , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #145 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 0 , 0 , 0 , 0 , 0 } }, // #146 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 63, 63, 0 , 0 , 0 } }, // #147 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 7 , 7 , 0 , 0 , 0 } }, // #148 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 7 , 7 , 0 , 0 , 0 } }, // #149 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 63, 7 , 0 , 0 , 0 } }, // #150 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 63, 7 , 0 , 0 , 0 } }, // #151 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 84, 13, 0 , 0 , 0 } }, // #152 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 79, 9 , 0 , 0 , 0 } }, // #153 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 0 , 0 , 0 , 0 , 0 } }, // #154 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 85, 0 , 0 , 0 , 0 , 0 } }, // #155 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 59, { 35, 86, 3 , 3 , 0 , 0 } }, // #156 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 56, { 77, 78, 78, 0 , 0 , 0 } }, // #157 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 3 , 0 , 0 , 0 } }, // #158 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 7 , { 49, 5 , 0 , 0 , 0 , 0 } }, // #159 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 60, { 10, 5 , 40, 0 , 0 , 0 } }, // #160 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 5 , 0 , 0 } }, // #161 [ref=12x]
+ { InstDB::RWInfo::kCategoryGeneric , 64, { 10, 5 , 5 , 5 , 0 , 0 } }, // #162 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 65, { 10, 5 , 5 , 0 , 0 , 0 } }, // #163 [ref=12x]
+ { InstDB::RWInfo::kCategoryGeneric , 66, { 11, 3 , 5 , 0 , 0 , 0 } }, // #164 [ref=5x]
+ { InstDB::RWInfo::kCategoryGeneric , 67, { 11, 3 , 0 , 0 , 0 , 0 } }, // #165 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 68, { 11, 3 , 5 , 0 , 0 , 0 } }, // #166 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #167 [ref=1x]
+ { InstDB::RWInfo::kCategoryGenericEx , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #168 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 87, 78, 5 , 0 , 0 , 0 } }, // #169 [ref=1x]
+ { InstDB::RWInfo::kCategoryGeneric , 50, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #170 [ref=3x]
+ { InstDB::RWInfo::kCategoryGeneric , 0 , { 55, 17, 29, 0 , 0 , 0 } }, // #171 [ref=2x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 55, 17, 0 , 0 , 0 } }, // #172 [ref=4x]
+ { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 55, 17, 0 , 0 , 0 } } // #173 [ref=8x]
+};
+
+const InstDB::RWInfoOp InstDB::rw_info_op_table[] = {
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kNone }, // #0 [ref=16348x]
+ { 0x0000000000000003u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId }, // #1 [ref=10x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #2 [ref=267x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #3 [ref=1091x]
+ { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #4 [ref=93x]
+ { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #5 [ref=338x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #6 [ref=18x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #7 [ref=186x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #8 [ref=18x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #9 [ref=133x]
+ { 0x0000000000000000u, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #10 [ref=178x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #11 [ref=445x]
+ { 0x0000000000000003u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #12 [ref=1x]
+ { 0x0000000000000003u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #13 [ref=71x]
+ { 0x000000000000FFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #14 [ref=4x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseWrite | OpRWFlags::kMemIndexWrite }, // #15 [ref=1x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #16 [ref=9x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #17 [ref=23x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #18 [ref=2x]
+ { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #19 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #20 [ref=3x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #21 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #22 [ref=8x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #23 [ref=1x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #24 [ref=1x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #25 [ref=1x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #26 [ref=20x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #27 [ref=1x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #28 [ref=4x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #29 [ref=13x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #30 [ref=3x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x03, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #31 [ref=1x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #32 [ref=1x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #33 [ref=1x]
+ { 0x00000000000000FFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #34 [ref=1x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #35 [ref=84x]
+ { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #36 [ref=6x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #37 [ref=6x]
+ { 0x0000000000000000u, 0x0000000000000003u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #38 [ref=1x]
+ { 0x0000000000000003u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #39 [ref=1x]
+ { 0x0000000000000001u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #40 [ref=30x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #41 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #42 [ref=3x]
+ { 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #43 [ref=15x]
+ { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #44 [ref=29x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #45 [ref=30x]
+ { 0x00000000000003FFu, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #46 [ref=22x]
+ { 0x00000000000003FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #47 [ref=13x]
+ { 0x0000000000000000u, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #48 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #49 [ref=17x]
+ { 0x0000000000000000u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #50 [ref=2x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #51 [ref=9x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #52 [ref=2x]
+ { 0x0000000000000003u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #53 [ref=4x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #54 [ref=1x]
+ { 0x000000000000000Fu, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #55 [ref=23x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #56 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #57 [ref=14x]
+ { 0x0000000000000000u, 0x0000000000000001u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #58 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #59 [ref=3x]
+ { 0x000000000000FFFFu, 0x000000000000FFFFu, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #60 [ref=2x]
+ { 0x00000000000000FFu, 0x00000000000000FFu, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #61 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #62 [ref=2x]
+ { 0x000000000000FF00u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #63 [ref=21x]
+ { 0x0000000000000000u, 0x000000000000FF00u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #64 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #65 [ref=2x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #66 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #67 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #68 [ref=1x]
+ { 0x0000000000000000u, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #69 [ref=5x]
+ { 0x0000000000000000u, 0x000000000000FFFFu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #70 [ref=4x]
+ { 0x0000000000000000u, 0x0000000000000007u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #71 [ref=2x]
+ { 0x0000000000000001u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #72 [ref=9x]
+ { 0x0000000000000001u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #73 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #74 [ref=16x]
+ { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #75 [ref=8x]
+ { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #76 [ref=3x]
+ { 0x0000000000000000u, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #77 [ref=10x]
+ { 0x00000000FFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #78 [ref=18x]
+ { 0x000000000000FFF0u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #79 [ref=16x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique | OpRWFlags::kZExt }, // #80 [ref=4x]
+ { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique }, // #81 [ref=3x]
+ { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #82 [ref=12x]
+ { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique | OpRWFlags::kZExt }, // #83 [ref=1x]
+ { 0x000000000000FFFCu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #84 [ref=8x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #85 [ref=1x]
+ { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kConsecutive }, // #86 [ref=2x]
+ { 0x00000000FFFFFFFFu, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt } // #87 [ref=3x]
+};
+
+const InstDB::RWInfoRm InstDB::rw_info_rm_table[] = {
+ { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , 0, 0 }, // #0 [ref=1996x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #1 [ref=8x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, 0 }, // #2 [ref=190x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 16, 0, 0 }, // #3 [ref=122x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , 0, 0 }, // #4 [ref=66x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , 0, 0 }, // #5 [ref=35x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , 0, 0 }, // #6 [ref=314x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , 0, 0 }, // #7 [ref=9x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 0 , 0, 0 }, // #8 [ref=52x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 0 , 0, 0 }, // #9 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #10 [ref=20x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , 0, 0 }, // #11 [ref=14x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 8 , 0, 0 }, // #12 [ref=25x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 64, 0, 0 }, // #13 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #14 [ref=30x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 16, 0, 0 }, // #15 [ref=17x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #16 [ref=22x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 1 , 0, 0 }, // #17 [ref=5x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 4 , 0, 0 }, // #18 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 10, 0, 0 }, // #19 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #20 [ref=5x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 2 , 0, 0 }, // #21 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , 0, 0 }, // #22 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 1 , 0, 0 }, // #23 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 4 , 0, 0 }, // #24 [ref=3x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , 0, 0 }, // #25 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 2 , 0, 0 }, // #26 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 2 , 0, 0 }, // #27 [ref=13x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 4 , 0, 0 }, // #28 [ref=8x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #29 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 16, 0, 0 }, // #30 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , InstDB::RWInfoRm::kFlagMovssMovsd, 0 }, // #31 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagMovssMovsd, 0 }, // #32 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 4 , InstDB::RWInfoRm::kFlagMovssMovsd, 0 }, // #33 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 1 , 0, 0 }, // #34 [ref=18x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 8 , 0, 0 }, // #35 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagPextrw, 0 }, // #36 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , InstDB::RWInfoRm::kFlagPextrw, uint32_t(CpuFeatures::X86::kSSE4_1) }, // #37 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryNone , 0x02, 0 , 0, 0 }, // #38 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #39 [ref=3x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 8 , 0, 0 }, // #40 [ref=33x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 2 , 0, 0 }, // #41 [ref=30x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 4 , 0, 0 }, // #42 [ref=40x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x00, 32, 0, 0 }, // #43 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #44 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #45 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryHalf , 0x02, 0 , 0, 0 }, // #46 [ref=19x]
+ { InstDB::RWInfoRm::kCategoryQuarter , 0x02, 0 , 0, 0 }, // #47 [ref=9x]
+ { InstDB::RWInfoRm::kCategoryHalf , 0x01, 0 , 0, 0 }, // #48 [ref=10x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #49 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 16, 0, 0 }, // #50 [ref=30x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 16, 0, 0 }, // #51 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x01, 32, 0, 0 }, // #52 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x0C, 0 , 0, 0 }, // #53 [ref=15x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 8 , 0, 0 }, // #54 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 4 , 0, 0 }, // #55 [ref=4x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 32, 0, 0 }, // #56 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , 0, 0 }, // #57 [ref=13x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #58 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x08, 0 , 0, 0 }, // #59 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x04, 1 , 0, 0 }, // #60 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryQuarter , 0x01, 0 , 0, 0 }, // #61 [ref=6x]
+ { InstDB::RWInfoRm::kCategoryEighth , 0x01, 0 , 0, 0 }, // #62 [ref=3x]
+ { InstDB::RWInfoRm::kCategoryEighth , 0x02, 0 , 0, 0 }, // #63 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 16, 0, 0 }, // #64 [ref=1x]
+ { InstDB::RWInfoRm::kCategoryFixed , 0x06, 16, 0, 0 }, // #65 [ref=12x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , InstDB::RWInfoRm::kFlagFeatureIfRMI, uint32_t(CpuFeatures::X86::kAVX512_F) }, // #66 [ref=5x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagFeatureIfRMI, uint32_t(CpuFeatures::X86::kAVX512_BW) }, // #67 [ref=2x]
+ { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , InstDB::RWInfoRm::kFlagFeatureIfRMI, uint32_t(CpuFeatures::X86::kAVX512_BW) } // #68 [ref=3x]
+};
+// ----------------------------------------------------------------------------
+// ${InstRWInfoTable:End}
+
+// x86::InstDB - Tests
+// ===================
+
+#if defined(ASMJIT_TEST)
+UNIT(x86_inst_db) {
+ INFO("Checking validity of Inst enums");
+
+ // Cross-validate prefixes.
+ EXPECT_EQ(uint32_t(InstOptions::kX86_Rex ), 0x40000000u)
+ .message("REX prefix must be at 0x40000000");
+
+ EXPECT_EQ(uint32_t(InstOptions::kX86_Evex), 0x00001000u)
+ .message("EVEX prefix must be at 0x00001000");
+
+ // These could be combined together to form a valid REX prefix, they must match.
+ EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeB), uint32_t(Opcode::kB))
+ .message("Opcode::kB must match InstOptions::kX86_OpCodeB");
+
+ EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeX), uint32_t(Opcode::kX))
+ .message("Opcode::kX must match InstOptions::kX86_OpCodeX");
+
+ EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeR), uint32_t(Opcode::kR))
+ .message("Opcode::kR must match InstOptions::kX86_OpCodeR");
+
+ EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeW), uint32_t(Opcode::kW))
+ .message("Opcode::kW must match InstOptions::kX86_OpCodeW");
+
+ uint32_t rex_rb = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kB >> Opcode::kREX_Shift) | 0x40;
+ uint32_t rex_rw = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kW >> Opcode::kREX_Shift) | 0x40;
+
+ EXPECT_EQ(rex_rb, 0x45u)
+ .message("Opcode::kR|B must form a valid REX prefix (0x45) if combined with 0x40");
+
+ EXPECT_EQ(rex_rw, 0x4Cu)
+ .message("Opcode::kR|W must form a valid REX prefix (0x4C) if combined with 0x40");
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit/x86/x86instdb.h b/3rdparty/asmjit/asmjit/x86/x86instdb.h
new file mode 100644
index 00000000000..34f51a12186
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86instdb.h
@@ -0,0 +1,704 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86INSTDB_H_INCLUDED
+#define ASMJIT_X86_X86INSTDB_H_INCLUDED
+
+#include <asmjit/support/span.h>
+#include <asmjit/x86/x86globals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \addtogroup asmjit_x86
+//! \{
+
+//! Instruction database (X86|X86_64).
+namespace InstDB {
+
+//! Describes which operation mode is supported by an instruction.
+enum class Mode : uint8_t {
+ //! Invalid mode.
+ kNone = 0x00u,
+ //! X86 mode supported.
+ kX86 = 0x01u,
+ //! X64 mode supported.
+ kX64 = 0x02u,
+ //! Both X86 and X64 modes supported.
+ kAny = 0x03u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(Mode)
+
+//! Converts architecture to operation mode, see \ref Mode.
+static ASMJIT_INLINE_CONSTEXPR Mode mode_from_arch(Arch arch) noexcept {
+ return arch == Arch::kX86 ? Mode::kX86 :
+ arch == Arch::kX64 ? Mode::kX64 : Mode::kNone;
+}
+
+//! Operand signature flags used by \ref OpSignature.
+enum class OpFlags : uint64_t {
+ //! No operand flags.
+ kNone = 0u,
+
+ kRegGpbLo = 0x0000000000000001u, //!< Operand can be low 8-bit GPB register.
+ kRegGpbHi = 0x0000000000000002u, //!< Operand can be high 8-bit GPB register.
+ kRegGpw = 0x0000000000000004u, //!< Operand can be 16-bit GPW register.
+ kRegGpd = 0x0000000000000008u, //!< Operand can be 32-bit GPD register.
+ kRegGpq = 0x0000000000000010u, //!< Operand can be 64-bit GPQ register.
+ kRegXmm = 0x0000000000000020u, //!< Operand can be 128-bit XMM register.
+ kRegYmm = 0x0000000000000040u, //!< Operand can be 256-bit YMM register.
+ kRegZmm = 0x0000000000000080u, //!< Operand can be 512-bit ZMM register.
+ kRegMm = 0x0000000000000100u, //!< Operand can be 64-bit MM register.
+ kRegKReg = 0x0000000000000200u, //!< Operand can be 64-bit K register.
+ kRegSReg = 0x0000000000000400u, //!< Operand can be SReg (segment register).
+ kRegCReg = 0x0000000000000800u, //!< Operand can be CReg (control register).
+ kRegDReg = 0x0000000000001000u, //!< Operand can be DReg (debug register).
+ kRegSt = 0x0000000000002000u, //!< Operand can be 80-bit ST register (X87).
+ kRegBnd = 0x0000000000004000u, //!< Operand can be 128-bit BND register.
+ kRegTmm = 0x0000000000008000u, //!< Operand can be 0..8192-bit TMM register.
+ kRegMask = 0x000000000000FFFFu, //!< Mask of all possible register types.
+
+ kMemUnspecified = 0x0000000000040000u, //!< Operand can be a scalar memory pointer without size.
+ kMem8 = 0x0000000000080000u, //!< Operand can be an 8-bit memory pointer.
+ kMem16 = 0x0000000000100000u, //!< Operand can be a 16-bit memory pointer.
+ kMem32 = 0x0000000000200000u, //!< Operand can be a 32-bit memory pointer.
+ kMem48 = 0x0000000000400000u, //!< Operand can be a 48-bit memory pointer (FAR pointers only).
+ kMem64 = 0x0000000000800000u, //!< Operand can be a 64-bit memory pointer.
+ kMem80 = 0x0000000001000000u, //!< Operand can be an 80-bit memory pointer.
+ kMem128 = 0x0000000002000000u, //!< Operand can be a 128-bit memory pointer.
+ kMem256 = 0x0000000004000000u, //!< Operand can be a 256-bit memory pointer.
+ kMem512 = 0x0000000008000000u, //!< Operand can be a 512-bit memory pointer.
+ kMem1024 = 0x0000000010000000u, //!< Operand can be a 1024-bit memory pointer.
+ kMemMask = 0x000000001FFC0000u, //!< Mask of all possible scalar memory types.
+
+ kVm32x = 0x0000000040000000u, //!< Operand can be a vm32x (vector) pointer.
+ kVm32y = 0x0000000080000000u, //!< Operand can be a vm32y (vector) pointer.
+ kVm32z = 0x0000000100000000u, //!< Operand can be a vm32z (vector) pointer.
+ kVm64x = 0x0000000200000000u, //!< Operand can be a vm64x (vector) pointer.
+ kVm64y = 0x0000000400000000u, //!< Operand can be a vm64y (vector) pointer.
+ kVm64z = 0x0000000800000000u, //!< Operand can be a vm64z (vector) pointer.
+ kVmMask = 0x0000000FC0000000u, //!< Mask of all possible vector memory types.
+
+ kImmI4 = 0x0000001000000000u, //!< Operand can be signed 4-bit immediate.
+ kImmU4 = 0x0000002000000000u, //!< Operand can be unsigned 4-bit immediate.
+ kImmI8 = 0x0000004000000000u, //!< Operand can be signed 8-bit immediate.
+ kImmU8 = 0x0000008000000000u, //!< Operand can be unsigned 8-bit immediate.
+ kImmI16 = 0x0000010000000000u, //!< Operand can be signed 16-bit immediate.
+ kImmU16 = 0x0000020000000000u, //!< Operand can be unsigned 16-bit immediate.
+ kImmI32 = 0x0000040000000000u, //!< Operand can be signed 32-bit immediate.
+ kImmU32 = 0x0000080000000000u, //!< Operand can be unsigned 32-bit immediate.
+ kImmI64 = 0x0000100000000000u, //!< Operand can be signed 64-bit immediate.
+ kImmU64 = 0x0000200000000000u, //!< Operand can be unsigned 64-bit immediate.
+ kImmMask = 0x00003FF000000000u, //!< Mask of all immediate types.
+
+ kRel8 = 0x0000400000000000u, //!< Operand can be relative 8-bit displacement.
+ kRel32 = 0x0000800000000000u, //!< Operand can be relative 32-bit displacement.
+ kRelMask = 0x0000C00000000000u, //!< Mask of all relative displacement types.
+
+ kFlagMemBase = 0x0001000000000000u, //!< Flag: Only memory base is allowed (no index, no offset).
+ kFlagMemDs = 0x0002000000000000u, //!< Flag: Implicit memory operand's DS segment.
+ kFlagMemEs = 0x0004000000000000u, //!< Flag: Implicit memory operand's ES segment.
+
+ kFlagMib = 0x0008000000000000u, //!< Flag: Operand is MIB (base+index) pointer.
+ kFlagTMem = 0x0010000000000000u, //!< Flag: Operand is TMEM (sib_mem), AMX memory pointer.
+
+ kFlagImplicit = 0x0080000000000000u, //!< Flag: Operand is implicit.
+ kFlagMask = 0x009F000000000000u, //!< Mask of all flags.
+
+ //! Contains mask of all registers, memory operands, immediate operands, and displacement operands.
+ kOpMask = kRegMask | kMemMask | kVmMask | kImmMask | kRelMask
+};
+ASMJIT_DEFINE_ENUM_FLAGS(OpFlags)
+
+//! Operand signature.
+//!
+//! Contains all possible operand combinations, memory size information, and a fixed register id (or `Reg::kIdBad`
+//! if fixed id isn't required).
+struct OpSignature {
+ //! \name Members
+ //! \{
+
+ uint64_t _flags : 56;
+ uint64_t _reg_mask : 8;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns operand signature flags.
+ [[nodiscard]]
+ inline OpFlags flags() const noexcept { return (OpFlags)_flags; }
+
+ //! Tests whether the given `flag` is set.
+ [[nodiscard]]
+ inline bool has_flag(OpFlags flag) const noexcept { return (_flags & uint64_t(flag)) != 0; }
+
+ //! Tests whether this signature contains at least one register operand of any type.
+ [[nodiscard]]
+ inline bool has_reg() const noexcept { return has_flag(OpFlags::kRegMask); }
+
+ //! Tests whether this signature contains at least one scalar memory operand of any type.
+ [[nodiscard]]
+ inline bool has_mem() const noexcept { return has_flag(OpFlags::kMemMask); }
+
+ //! Tests whether this signature contains at least one vector memory operand of any type.
+ [[nodiscard]]
+ inline bool has_vm() const noexcept { return has_flag(OpFlags::kVmMask); }
+
+ //! Tests whether this signature contains at least one immediate operand of any type.
+ [[nodiscard]]
+ inline bool has_imm() const noexcept { return has_flag(OpFlags::kImmMask); }
+
+ //! Tests whether this signature contains at least one relative displacement operand of any type.
+ [[nodiscard]]
+ inline bool has_rel() const noexcept { return has_flag(OpFlags::kRelMask); }
+
+ //! Tests whether the operand is implicit.
+ [[nodiscard]]
+ inline bool is_implicit() const noexcept { return has_flag(OpFlags::kFlagImplicit); }
+
+ //! Returns a physical register mask.
+ [[nodiscard]]
+ inline RegMask reg_mask() const noexcept { return _reg_mask; }
+
+ //! \}
+};
+
+//! Operand signature table, used by \ref InstSignature.
+ASMJIT_VARAPI const OpSignature _op_signature_table[];
+
+//! Instruction signature.
+//!
+//! Contains a sequence of operands' combinations and other metadata that defines a single instruction. This data is
+//! used by instruction validator.
+struct InstSignature {
+ //! \name Members
+ //! \{
+
+ //! Count of operands in `op_index` (0..6).
+ uint8_t _op_count : 3;
+ //! Architecture modes supported (X86 / X64).
+ uint8_t _mode : 2;
+ //! Number of implicit operands.
+ uint8_t _implicit_op_count : 3;
+ //! Reserved for future use.
+ uint8_t _reserved;
+ //! Indexes to `OpSignature` table.
+ uint8_t _op_signature_indexes[Globals::kMaxOpCount];
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns instruction operation mode.
+ [[nodiscard]]
+ inline Mode mode() const noexcept { return (Mode)_mode; }
+
+ //! Tests whether the instruction supports the given operating mode.
+ [[nodiscard]]
+ inline bool supports_mode(Mode mode) const noexcept { return (uint8_t(_mode) & uint8_t(mode)) != 0; }
+
+ //! Returns the number of operands of this signature.
+ [[nodiscard]]
+ inline uint32_t op_count() const noexcept { return _op_count; }
+
+ //! Returns the number of implicit operands this signature has.
+ [[nodiscard]]
+ inline uint32_t implicit_op_count() const noexcept { return _implicit_op_count; }
+
+ //! Tests whether this instruction signature has at least one implicit operand.
+ [[nodiscard]]
+ inline bool has_implicit_operands() const noexcept { return _implicit_op_count != 0; }
+
+ //! Returns indexes to \ref _op_signature_table for each operand of the instruction.
+ //!
+ //! \note The returned array always provides indexes for all operands (see \ref Globals::kMaxOpCount) even if the
+ //! instruction provides less operands. Undefined operands have always index of zero.
+ [[nodiscard]]
+ inline const uint8_t* op_signature_indexes() const noexcept { return _op_signature_indexes; }
+
+ //! Returns index to \ref _op_signature_table, corresponding to the requested operand `index` of the instruction.
+ [[nodiscard]]
+ inline uint8_t op_signature_index(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxOpCount);
+ return _op_signature_indexes[index];
+ }
+
+ //! Returns \ref OpSignature corresponding to the requested operand `index` of the instruction.
+ [[nodiscard]]
+ inline const OpSignature& op_signature(size_t index) const noexcept {
+ ASMJIT_ASSERT(index < Globals::kMaxOpCount);
+ return _op_signature_table[_op_signature_indexes[index]];
+ }
+
+ //! \}
+};
+
+//! Instruction signature table.
+ASMJIT_VARAPI const InstSignature _inst_signature_table[];
+
+//! Instruction flags.
+//!
+//! Details about instruction encoding, operation, features, and some limitations.
+enum class InstFlags : uint32_t {
+ //! No flags.
+ kNone = 0x00000000u,
+
+ // Instruction Family
+ // ------------------
+ //
+ // Instruction family information.
+
+ //! Instruction that accesses FPU registers.
+ kFpu = 0x00000100u,
+ //! Instruction that accesses MMX registers (including 3DNOW and GEODE) and EMMS.
+ kMmx = 0x00000200u,
+ //! Instruction that accesses XMM registers (SSE, AVX, AVX512).
+ kVec = 0x00000400u,
+
+ // FPU Flags
+ // ---------
+ //
+ // Used to tell the encoder which memory operand sizes are encodable.
+
+ //! FPU instruction can address `word_ptr` (shared with M80).
+ kFpuM16 = 0x00000800u,
+ //! FPU instruction can address `dword_ptr`.
+ kFpuM32 = 0x00001000u,
+ //! FPU instruction can address `qword_ptr`.
+ kFpuM64 = 0x00002000u,
+ //! FPU instruction can address `tword_ptr` (shared with M16).
+ kFpuM80 = 0x00000800u,
+
+ // Prefixes and Encoding Flags
+ // ---------------------------
+ //
+ // These describe optional X86 prefixes that can be used to change the instruction's operation.
+
+ //! Instruction can be prefixed with using the REP(REPE) or REPNE prefix.
+ kRep = 0x00004000u,
+ //! Rep prefix is accepted, but it has no effect other than being emitted with the instruction (as an extra byte).
+ kRepIgnored = 0x00008000u,
+ //! Instruction can be prefixed with using the LOCK prefix.
+ kLock = 0x00010000u,
+ //! Instruction can be prefixed with using the XACQUIRE prefix.
+ kXAcquire = 0x00020000u,
+ //! Instruction can be prefixed with using the XRELEASE prefix.
+ kXRelease = 0x00040000u,
+ //! Instruction uses MIB (BNDLDX|BNDSTX) to encode two registers.
+ kMib = 0x00080000u,
+ //! Instruction uses VSIB instead of legacy SIB.
+ kVsib = 0x00100000u,
+ //! Instruction uses TSIB (or SIB_MEM) encoding (MODRM followed by SIB).
+ kTsib = 0x00200000u,
+
+ // If both `kPrefixVex` and `kPrefixEvex` flags are specified it means that the instructions can be encoded
+ // by either VEX or EVEX prefix. In that case AsmJit checks global options and also instruction options to decide
+ // whether to emit VEX or EVEX prefix.
+
+ //! Instruction can be encoded by VEX|XOP (AVX|AVX2|BMI|XOP|...).
+ kVex = 0x00400000u,
+ //! Instruction can be encoded by EVEX (AVX512).
+ kEvex = 0x00800000u,
+ //! EVEX encoding is preferred over VEX encoding (AVX515_VNNI vs AVX_VNNI).
+ kPreferEvex = 0x01000000u,
+ //! EVEX and VEX signatures are compatible.
+ kEvexCompat = 0x02000000u,
+ //! EVEX instruction requires K register in the first operand (compare instructions).
+ kEvexKReg = 0x04000000u,
+ //! EVEX instruction requires two operands and K register as a selector (gather instructions).
+ kEvexTwoOp = 0x08000000u,
+ //! VEX instruction that can be transformed to a compatible EVEX instruction.
+ kEvexTransformable = 0x10000000u,
+
+ // Other Flags
+ // -----------
+
+ //! Instruction uses consecutive registers.
+ //!
+ //! Used by VP2INTERSECTD and VP2INTERSECTQ instructions.
+ kConsecutiveRegs = 0x20000000u
+};
+ASMJIT_DEFINE_ENUM_FLAGS(InstFlags)
+
+//! AVX-512 flags.
+enum class Avx512Flags : uint32_t {
+ //! No AVX-512 flags.
+ kNone = 0,
+
+ //! Internally used in tables, has no meaning.
+ k_ = 0x00000000u,
+ //! Supports masking {k1..k7}.
+ kK = 0x00000001u,
+ //! Supports zeroing {z}, must be used together with `kAvx512k`.
+ kZ = 0x00000002u,
+ //! Supports 'embedded-rounding' {er} with implicit {sae},
+ kER = 0x00000004u,
+ //! Supports 'suppress-all-exceptions' {sae}.
+ kSAE = 0x00000008u,
+ //! Supports 16-bit broadcast 'b16'.
+ kB16 = 0x00000010u,
+ //! Supports 32-bit broadcast 'b32'.
+ kB32 = 0x00000020u,
+ //! Supports 64-bit broadcast 'b64'.
+ kB64 = 0x00000040u,
+
+ //! Implicit zeroing if {k} masking is used. Using {z} is not valid in this case as it's implicit.
+ kImplicitZ = 0x00000100,
+};
+ASMJIT_DEFINE_ENUM_FLAGS(Avx512Flags)
+
+//! Instruction common information.
+//!
+//! Aggregated information shared across one or more instruction.
+struct CommonInfo {
+ //! Instruction flags.
+ uint32_t _flags;
+ //! Reserved for future use.
+ uint32_t _avx512_flags : 11;
+ //! First `InstSignature` entry in the database.
+ uint32_t _inst_signature_index : 11;
+ //! Number of relevant `ISignature` entries.
+ uint32_t _inst_signature_count : 5;
+ //! Instruction control flow category, see \ref InstControlFlow.
+ uint32_t _control_flow : 3;
+ //! Specifies what happens if all source operands share the same register.
+ uint32_t _same_reg_hint : 2;
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns instruction flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return (InstFlags)_flags; }
+
+ //! Tests whether the instruction has a `flag`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(InstFlags flag) const noexcept { return Support::test(_flags, flag); }
+
+ //! Returns instruction AVX-512 flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Avx512Flags avx512_flags() const noexcept { return (Avx512Flags)_avx512_flags; }
+
+ //! Tests whether the instruction has an AVX-512 `flag`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_flag(Avx512Flags flag) const noexcept { return Support::test(_avx512_flags, flag); }
+
+ //! Tests whether the instruction is FPU instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_fpu() const noexcept { return has_flag(InstFlags::kFpu); }
+
+ //! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mmx() const noexcept { return has_flag(InstFlags::kMmx); }
+
+ //! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vec() const noexcept { return has_flag(InstFlags::kVec); }
+
+ //! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_sse() const noexcept { return (flags() & (InstFlags::kVec | InstFlags::kVex | InstFlags::kEvex)) == InstFlags::kVec; }
+
+ //! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_avx() const noexcept { return is_vec() && is_vex_or_evex(); }
+
+ //! Tests whether the instruction can be prefixed with LOCK prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_lock_prefix() const noexcept { return has_flag(InstFlags::kLock); }
+
+ //! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_rep_prefix() const noexcept { return has_flag(InstFlags::kRep); }
+
+ //! Tests whether the instruction can be prefixed with XACQUIRE prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_xacquire_prefix() const noexcept { return has_flag(InstFlags::kXAcquire); }
+
+ //! Tests whether the instruction can be prefixed with XRELEASE prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_xrelease_prefix() const noexcept { return has_flag(InstFlags::kXRelease); }
+
+ //! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_rep_ignored() const noexcept { return has_flag(InstFlags::kRepIgnored); }
+
+ //! Tests whether the instruction uses MIB.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mib_op() const noexcept { return has_flag(InstFlags::kMib); }
+
+ //! Tests whether the instruction uses VSIB.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vsib_op() const noexcept { return has_flag(InstFlags::kVsib); }
+
+ //! Tests whether the instruction uses TSIB (AMX, instruction requires MOD+SIB).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_tsib_op() const noexcept { return has_flag(InstFlags::kTsib); }
+
+ //! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vex() const noexcept { return has_flag(InstFlags::kVex); }
+
+ //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex() const noexcept { return has_flag(InstFlags::kEvex); }
+
+ //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vex_or_evex() const noexcept { return has_flag(InstFlags::kVex | InstFlags::kEvex); }
+
+ //! Tests whether the instruction should prefer EVEX prefix instead of VEX prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool prefer_evex() const noexcept { return has_flag(InstFlags::kPreferEvex); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_compatible() const noexcept { return has_flag(InstFlags::kEvexCompat); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_kreg_only() const noexcept { return has_flag(InstFlags::kEvexKReg); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_two_op_only() const noexcept { return has_flag(InstFlags::kEvexTwoOp); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_transformable() const noexcept { return has_flag(InstFlags::kEvexTransformable); }
+
+ //! Tests whether the instruction supports AVX512 masking {k}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_k() const noexcept { return has_avx512_flag(Avx512Flags::kK); }
+
+ //! Tests whether the instruction supports AVX512 zeroing {k}{z}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_z() const noexcept { return has_avx512_flag(Avx512Flags::kZ); }
+
+ //! Tests whether the instruction supports AVX512 embedded-rounding {er}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_er() const noexcept { return has_avx512_flag(Avx512Flags::kER); }
+
+ //! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_sae() const noexcept { return has_avx512_flag(Avx512Flags::kSAE); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst() const noexcept { return has_avx512_flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (16-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst16() const noexcept { return has_avx512_flag(Avx512Flags::kB16); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (32-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst32() const noexcept { return has_avx512_flag(Avx512Flags::kB32); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (64-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst64() const noexcept { return has_avx512_flag(Avx512Flags::kB64); }
+
+ // Returns the size of the broadcast - either 2, 4, or 8, or 0 if broadcast is not supported.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG uint32_t broadcast_size() const noexcept {
+ constexpr uint32_t kShift = Support::ctz_const<Avx512Flags::kB16>;
+ return (uint32_t(_avx512_flags) & uint32_t(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64)) >> (kShift - 1);
+ }
+
+ ASMJIT_INLINE_NODEBUG Span<const InstSignature> inst_signatures() const noexcept {
+ return Span<const InstSignature>(_inst_signature_table + _inst_signature_index, _inst_signature_count);
+ }
+
+ //! Returns a control flow category of the instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstControlFlow control_flow() const noexcept { return (InstControlFlow)_control_flow; }
+
+ //! Returns a hint that can be used when both inputs are the same register.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstSameRegHint same_reg_hint() const noexcept { return (InstSameRegHint)_same_reg_hint; }
+
+ //! \}
+};
+
+ASMJIT_VARAPI const CommonInfo _inst_common_info_table[];
+
+//! Instruction information.
+struct InstInfo {
+ //! Reserved for future use.
+ uint32_t _reserved : 14;
+ //! Index to `_inst_common_info_table`.
+ uint32_t _common_info_index : 10;
+ //! Index to `additional_info_table`.
+ uint32_t _additional_info_index : 8;
+
+ //! Instruction encoding (internal encoding identifier used by \ref Assembler).
+ uint8_t _encoding;
+ //! Main opcode value (0..255).
+ uint8_t _main_opcode_value;
+ //! Index to `InstDB::main_opcode_table` that is combined with `InstDB::_main_opcode_value` to form the final opcode.
+ uint8_t _main_opcode_index;
+ //! Index to `InstDB::alt_opcode_table` that contains a full alternative opcode.
+ uint8_t _alt_opcode_index;
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns common information, see \ref CommonInfo.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const CommonInfo& common_info() const noexcept { return _inst_common_info_table[_common_info_index]; }
+
+ //! Returns instruction flags, see \ref InstFlags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return common_info().flags(); }
+
+ //! Tests whether the instruction has flag `flag`, see \ref InstFlags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_flag(InstFlags flag) const noexcept { return common_info().has_flag(flag); }
+
+ //! Returns instruction AVX-512 flags, see \ref Avx512Flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Avx512Flags avx512_flags() const noexcept { return common_info().avx512_flags(); }
+
+ //! Tests whether the instruction has an AVX-512 `flag`, see \ref Avx512Flags.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_flag(Avx512Flags flag) const noexcept { return common_info().has_avx512_flag(flag); }
+
+ //! Tests whether the instruction is FPU instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_fpu() const noexcept { return common_info().is_fpu(); }
+
+ //! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mmx() const noexcept { return common_info().is_mmx(); }
+
+ //! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vec() const noexcept { return common_info().is_vec(); }
+
+ //! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_sse() const noexcept { return common_info().is_sse(); }
+
+ //! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_avx() const noexcept { return common_info().is_avx(); }
+
+ //! Tests whether the instruction can be prefixed with LOCK prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_lock_prefix() const noexcept { return common_info().has_lock_prefix(); }
+
+ //! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_rep_prefix() const noexcept { return common_info().has_rep_prefix(); }
+
+ //! Tests whether the instruction can be prefixed with XACQUIRE prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_xacquire_prefix() const noexcept { return common_info().has_xacquire_prefix(); }
+
+ //! Tests whether the instruction can be prefixed with XRELEASE prefix.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_xrelease_prefix() const noexcept { return common_info().has_xrelease_prefix(); }
+
+ //! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_rep_ignored() const noexcept { return common_info().is_rep_ignored(); }
+
+ //! Tests whether the instruction uses MIB.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_mib_op() const noexcept { return has_flag(InstFlags::kMib); }
+
+ //! Tests whether the instruction uses VSIB.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vsib_op() const noexcept { return has_flag(InstFlags::kVsib); }
+
+ //! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vex() const noexcept { return has_flag(InstFlags::kVex); }
+
+ //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex() const noexcept { return has_flag(InstFlags::kEvex); }
+
+ //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_vex_or_evex() const noexcept { return has_flag(InstFlags::kVex | InstFlags::kEvex); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_compatible() const noexcept { return has_flag(InstFlags::kEvexCompat); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_kreg_only() const noexcept { return has_flag(InstFlags::kEvexKReg); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_two_op_only() const noexcept { return has_flag(InstFlags::kEvexTwoOp); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_evex_transformable() const noexcept { return has_flag(InstFlags::kEvexTransformable); }
+
+ //! Tests whether the instruction supports AVX512 masking {k}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_k() const noexcept { return has_avx512_flag(Avx512Flags::kK); }
+
+ //! Tests whether the instruction supports AVX512 zeroing {k}{z}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_z() const noexcept { return has_avx512_flag(Avx512Flags::kZ); }
+
+ //! Tests whether the instruction supports AVX512 embedded-rounding {er}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_er() const noexcept { return has_avx512_flag(Avx512Flags::kER); }
+
+ //! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_sae() const noexcept { return has_avx512_flag(Avx512Flags::kSAE); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst() const noexcept { return has_avx512_flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (16-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst16() const noexcept { return has_avx512_flag(Avx512Flags::kB16); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (32-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst32() const noexcept { return has_avx512_flag(Avx512Flags::kB32); }
+
+ //! Tests whether the instruction supports AVX512 broadcast (64-bit).
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool has_avx512_bcst64() const noexcept { return has_avx512_flag(Avx512Flags::kB64); }
+
+ //! Returns a control flow category of the instruction.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstControlFlow control_flow() const noexcept { return common_info().control_flow(); }
+
+ //! Returns a hint that can be used when both inputs are the same register.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG InstSameRegHint same_reg_hint() const noexcept { return common_info().same_reg_hint(); }
+
+ //! Returns all possible instruction signatures in a read-only span.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Span<const InstSignature> inst_signatures() const noexcept { return common_info().inst_signatures(); }
+
+ //! \}
+};
+
+ASMJIT_VARAPI const InstInfo _inst_info_table[];
+
+[[nodiscard]]
+static inline const InstInfo& inst_info_by_id(InstId inst_id) noexcept {
+ ASMJIT_ASSERT(Inst::is_defined_id(inst_id));
+ return _inst_info_table[inst_id];
+}
+
+//! \cond INTERNAL
+static_assert(sizeof(OpSignature) == 8, "InstDB::OpSignature must be 8 bytes long");
+//! \endcond
+
+} // {InstDB}
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86INSTDB_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h b/3rdparty/asmjit/asmjit/x86/x86instdb_p.h
index cb006060832..43aa4523e9b 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86instdb_p.h
+++ b/3rdparty/asmjit/asmjit/x86/x86instdb_p.h
@@ -1,13 +1,13 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86INSTDB_P_H_INCLUDED
#define ASMJIT_X86_X86INSTDB_P_H_INCLUDED
-#include "../core/instdb_p.h"
-#include "../x86/x86instdb.h"
+#include <asmjit/core/instdb_p.h>
+#include <asmjit/x86/x86instdb.h>
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
@@ -17,7 +17,7 @@ ASMJIT_BEGIN_SUB_NAMESPACE(x86)
namespace InstDB {
-//! Instruction encoding (X86).
+//! Instruction encoding (X86|X86_64).
//!
//! This is a specific identifier that is used by AsmJit to describe the way each instruction is encoded. Some
//! encodings are special only for a single instruction as X86 instruction set contains a lot of legacy encodings,
@@ -76,6 +76,7 @@ enum EncodingId : uint32_t {
kEncodingX86Out, //!< X86 out.
kEncodingX86Outs, //!< X86 out[b|w|d].
kEncodingX86Push, //!< X86 push.
+ kEncodingX86Pushw, //!< X86 pushw.
kEncodingX86Pop, //!< X86 pop.
kEncodingX86Ret, //!< X86 ret.
kEncodingX86Rot, //!< X86 rcl, rcr, rol, ror, sal, sar, shl, shr.
@@ -121,7 +122,6 @@ enum EncodingId : uint32_t {
kEncodingVexKmov, //!< VEX [RM|MR] (used by kmov[b|w|d|q]).
kEncodingVexR_Wx, //!< VEX|EVEX [R] (propagatex VEX.W if GPQ used).
kEncodingVexM, //!< VEX|EVEX [M].
- kEncodingVexM_VM, //!< VEX|EVEX [M] (propagates VEX|EVEX.L, VSIB support).
kEncodingVexMr_Lx, //!< VEX|EVEX [MR] (propagates VEX|EVEX.L if YMM used).
kEncodingVexMr_VM, //!< VEX|EVEX [MR] (VSIB support).
kEncodingVexMri, //!< VEX|EVEX [MRI].
@@ -135,7 +135,6 @@ enum EncodingId : uint32_t {
kEncodingVexRm_Lx_Narrow, //!< VEX|EVEX [RM] (the destination vector size is narrowed).
kEncodingVexRm_Lx_Bcst, //!< VEX|EVEX [RM] (can handle broadcast r32/r64).
kEncodingVexRm_VM, //!< VEX|EVEX [RM] (propagates VEX|EVEX.L, VSIB support).
- kEncodingVexRm_T1_4X, //!< EVEX [RM] (used by NN instructions that use RM-T1_4X encoding).
kEncodingVexRmi, //!< VEX|EVEX [RMI].
kEncodingVexRmi_Wx, //!< VEX|EVEX [RMI] (propagates VEX|EVEX.W if GPQ used).
kEncodingVexRmi_Lx, //!< VEX|EVEX [RMI] (propagates VEX|EVEX.L if YMM used).
@@ -191,15 +190,15 @@ enum EncodingId : uint32_t {
//! Additional information table, provides CPU extensions required to execute an instruction and RW flags.
struct AdditionalInfo {
- //! Index to `_instFlagsTable`.
- uint8_t _instFlagsIndex;
- //! Index to `_rwFlagsTable`.
- uint8_t _rwFlagsIndex;
+ //! Index to `inst_flags_table`.
+ uint8_t _inst_flags_index;
+ //! Index to `rw_flags_info_table`.
+ uint8_t _rw_flags_index;
//! Features vector.
uint8_t _features[6];
- inline const uint8_t* featuresBegin() const noexcept { return _features; }
- inline const uint8_t* featuresEnd() const noexcept { return _features + ASMJIT_ARRAY_SIZE(_features); }
+ inline const uint8_t* features_begin() const noexcept { return _features; }
+ inline const uint8_t* features_end() const noexcept { return _features + ASMJIT_ARRAY_SIZE(_features); }
};
struct RWInfo {
@@ -224,15 +223,15 @@ struct RWInfo {
};
uint8_t category;
- uint8_t rmInfo;
- uint8_t opInfoIndex[6];
+ uint8_t rm_info;
+ uint8_t op_info_index[6];
};
struct RWInfoOp {
- uint64_t rByteMask;
- uint64_t wByteMask;
- uint8_t physId;
- uint8_t consecutiveLeadCount;
+ uint64_t r_byte_mask;
+ uint64_t w_byte_mask;
+ uint8_t phys_id;
+ uint8_t consecutive_lead_count;
uint8_t reserved[2];
OpRWFlags flags;
};
@@ -261,38 +260,50 @@ struct RWInfoRm {
};
uint8_t category;
- uint8_t rmOpsMask;
- uint8_t fixedSize;
+ uint8_t rm_ops_mask;
+ uint8_t fixed_size;
uint8_t flags;
- uint8_t rmFeature;
+ uint8_t rm_feature;
};
struct RWFlagsInfoTable {
//! CPU/FPU flags read.
- uint32_t readFlags;
+ uint32_t read_flags;
//! CPU/FPU flags written or undefined.
- uint32_t writeFlags;
+ uint32_t write_flags;
};
-extern const uint8_t rwInfoIndexA[Inst::_kIdCount];
-extern const uint8_t rwInfoIndexB[Inst::_kIdCount];
-extern const RWInfo rwInfoA[];
-extern const RWInfo rwInfoB[];
-extern const RWInfoOp rwInfoOp[];
-extern const RWInfoRm rwInfoRm[];
-extern const RWFlagsInfoTable _rwFlagsInfoTable[];
-extern const InstRWFlags _instFlagsTable[];
+extern const uint8_t rw_info_index_a_table[Inst::_kIdCount];
+extern const uint8_t rw_info_index_b_table[Inst::_kIdCount];
+extern const RWInfo rw_info_a_table[];
+extern const RWInfo rw_info_b_table[];
+extern const RWInfoOp rw_info_op_table[];
+extern const RWInfoRm rw_info_rm_table[];
+extern const RWFlagsInfoTable rw_flags_info_table[];
+extern const InstRWFlags inst_flags_table[];
-extern const uint32_t _mainOpcodeTable[];
-extern const uint32_t _altOpcodeTable[];
+extern const uint32_t main_opcode_table[];
+extern const uint32_t alt_opcode_table[];
#ifndef ASMJIT_NO_TEXT
-extern const InstNameIndex instNameIndex;
-extern const char _instNameStringTable[];
-extern const uint32_t _instNameIndexTable[];
+
+extern const InstNameIndex _inst_name_index;
+extern const char _inst_name_string_table[];
+extern const uint32_t _inst_name_index_table[];
+
+extern const char alias_name_string_table[];
+extern const uint32_t alias_name_index_table[];
+extern const uint32_t alias_index_to_inst_id_table[];
+
+// ${NameDataInfo:Begin}
+// ------------------- Automatically generated, do not edit -------------------
+static constexpr uint32_t kAliasTableSize = 44;
+// ----------------------------------------------------------------------------
+// ${NameDataInfo:End}
+
#endif // !ASMJIT_NO_TEXT
-extern const AdditionalInfo _additionalInfoTable[];
+extern const AdditionalInfo additional_info_table[];
} // {InstDB}
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h b/3rdparty/asmjit/asmjit/x86/x86opcode_p.h
index ab0b13e1a50..511f70271b4 100644
--- a/3rdparty/asmjit/src/asmjit/x86/x86opcode_p.h
+++ b/3rdparty/asmjit/asmjit/x86/x86opcode_p.h
@@ -1,12 +1,12 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
#ifndef ASMJIT_X86_X86OPCODE_P_H_INCLUDED
#define ASMJIT_X86_X86OPCODE_P_H_INCLUDED
-#include "../x86/x86globals.h"
+#include <asmjit/x86/x86globals.h>
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
@@ -104,7 +104,7 @@ struct Opcode {
// `XOP` field is only used to force XOP prefix instead of VEX3 prefix. We know XOP encodings always use 0b1000
// bit of MM field and that no VEX and EVEX instruction use such bit yet, so we can use this bit to force XOP
- // prefix to be emitted instead of VEX3 prefix. See `x86VEXPrefix` defined in `x86assembler.cpp`.
+ // prefix to be emitted instead of VEX3 prefix.
kMM_XOP08 = 0x08u << kMM_Shift, // XOP.M8.
kMM_XOP09 = 0x09u << kMM_Shift, // XOP.M9.
kMM_XOP0A = 0x0Au << kMM_Shift, // XOP.MA.
@@ -173,8 +173,6 @@ struct Opcode {
kCDTT_FVM = kCDTT_ByLL,
kCDTT_T1S = kCDTT_None,
kCDTT_T1F = kCDTT_None,
- kCDTT_T1_4X = kCDTT_None,
- kCDTT_T4X = kCDTT_None, // Alias to have only 3 letters.
kCDTT_T2 = kCDTT_None,
kCDTT_T4 = kCDTT_None,
kCDTT_T8 = kCDTT_None,
@@ -338,26 +336,26 @@ struct Opcode {
ASMJIT_INLINE_NODEBUG uint32_t get() const noexcept { return v; }
- ASMJIT_INLINE_NODEBUG bool hasW() const noexcept { return (v & kW) != 0; }
- ASMJIT_INLINE_NODEBUG bool has66h() const noexcept { return (v & kPP_66) != 0; }
+ ASMJIT_INLINE_NODEBUG bool has_w() const noexcept { return (v & kW) != 0; }
+ ASMJIT_INLINE_NODEBUG bool has_66h() const noexcept { return (v & kPP_66) != 0; }
ASMJIT_INLINE_NODEBUG Opcode& add(uint32_t x) noexcept { return operator+=(x); }
- ASMJIT_INLINE_NODEBUG Opcode& add66h() noexcept { return operator|=(kPP_66); }
+ ASMJIT_INLINE_NODEBUG Opcode& add_66h() noexcept { return operator|=(kPP_66); }
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& add66hIf(T exp) noexcept { return operator|=(uint32_t(exp) << kPP_Shift); }
+ ASMJIT_INLINE_NODEBUG Opcode& add_66h_if(T exp) noexcept { return operator|=(uint32_t(exp) << kPP_Shift); }
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& add66hBySize(T size) noexcept { return add66hIf(size == 2); }
+ ASMJIT_INLINE_NODEBUG Opcode& add_66h_by_size(T size) noexcept { return add_66h_if(size == 2); }
- ASMJIT_INLINE_NODEBUG Opcode& addW() noexcept { return operator|=(kW); }
+ ASMJIT_INLINE_NODEBUG Opcode& add_w() noexcept { return operator|=(kW); }
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& addWIf(T exp) noexcept { return operator|=(uint32_t(exp) << kW_Shift); }
+ ASMJIT_INLINE_NODEBUG Opcode& add_w_if(T exp) noexcept { return operator|=(uint32_t(exp) << kW_Shift); }
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& addWBySize(T size) noexcept { return addWIf(size == 8); }
+ ASMJIT_INLINE_NODEBUG Opcode& add_w_by_size(T size) noexcept { return add_w_if(size == 8); }
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& addPrefixBySize(T size) noexcept {
- static const uint32_t mask[16] = {
+ ASMJIT_INLINE_NODEBUG Opcode& add_prefix_by_size(T size) noexcept {
+ static constexpr uint32_t mask[16] = {
0, // #0
0, // #1 -> nothing (already handled or not possible)
kPP_66, // #2 -> 66H
@@ -372,7 +370,7 @@ struct Opcode {
}
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& addArithBySize(T size) noexcept {
+ ASMJIT_INLINE_NODEBUG Opcode& add_arith_by_size(T size) noexcept {
static const uint32_t mask[16] = {
0, // #0
0, // #1 -> nothing
@@ -387,31 +385,31 @@ struct Opcode {
return operator|=(mask[size & 0xF]);
}
- ASMJIT_INLINE_NODEBUG Opcode& forceEvex() noexcept { return operator|=(kMM_ForceEvex); }
+ ASMJIT_INLINE_NODEBUG Opcode& force_evex() noexcept { return operator|=(kMM_ForceEvex); }
template<typename T>
- ASMJIT_INLINE_NODEBUG Opcode& forceEvexIf(T exp) noexcept { return operator|=(uint32_t(exp) << Support::ConstCTZ<uint32_t(kMM_ForceEvex)>::value); }
+ ASMJIT_INLINE_NODEBUG Opcode& force_evex_if(T exp) noexcept { return operator|=(uint32_t(exp) << Support::ctz_const<uint32_t(kMM_ForceEvex)>); }
//! Extract `O` field (R) from the opcode (specified as /0..7 in instruction manuals).
- ASMJIT_INLINE_NODEBUG uint32_t extractModO() const noexcept {
+ ASMJIT_INLINE_NODEBUG uint32_t extract_mod_o() const noexcept {
return (v >> kModO_Shift) & 0x07;
}
//! Extract `RM` field (RM) from the opcode (usually specified as another opcode value).
- ASMJIT_INLINE_NODEBUG uint32_t extractModRM() const noexcept {
+ ASMJIT_INLINE_NODEBUG uint32_t extract_mod_rm() const noexcept {
return (v >> kModRM_Shift) & 0x07;
}
//! Extract `REX` prefix from opcode combined with `options`.
- ASMJIT_INLINE_NODEBUG uint32_t extractRex(InstOptions options) const noexcept {
+ ASMJIT_INLINE_NODEBUG uint32_t extract_rex(InstOptions options) const noexcept {
// kREX was designed in a way that when shifted there will be no bytes set except REX.[B|X|R|W].
// The returned value forms a real REX prefix byte. This case should be unit-tested as well.
return (v | uint32_t(options)) >> kREX_Shift;
}
- ASMJIT_INLINE_NODEBUG uint32_t extractLLMMMMM(InstOptions options) const noexcept {
- uint32_t llMmmmm = uint32_t(v & (kLL_Mask | kMM_Mask));
- uint32_t vexEvex = uint32_t(options & InstOptions::kX86_Evex);
- return (llMmmmm | vexEvex) >> kMM_Shift;
+ ASMJIT_INLINE_NODEBUG uint32_t extract_ll_mmmmm(InstOptions options) const noexcept {
+ uint32_t ll_mmmmm = uint32_t(v & (kLL_Mask | kMM_Mask));
+ uint32_t vex_evex = uint32_t(options & InstOptions::kX86_Evex);
+ return (ll_mmmmm | vex_evex) >> kMM_Shift;
}
ASMJIT_INLINE_NODEBUG Opcode& operator=(uint32_t x) noexcept { v = x; return *this; }
diff --git a/3rdparty/asmjit/asmjit/x86/x86operand.cpp b/3rdparty/asmjit/asmjit/x86/x86operand.cpp
new file mode 100644
index 00000000000..9a29406ad62
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86operand.cpp
@@ -0,0 +1,249 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86)
+
+#include <asmjit/core/misc_p.h>
+#include <asmjit/x86/x86operand.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::Operand - Tests
+// ====================
+
+#if defined(ASMJIT_TEST)
+UNIT(x86_operand) {
+ Label L(1000); // Label with some ID.
+
+ INFO("Checking basic properties of built-in X86 registers");
+ EXPECT_EQ(gpb(Gp::kIdAx), al);
+ EXPECT_EQ(gpb(Gp::kIdBx), bl);
+ EXPECT_EQ(gpb(Gp::kIdCx), cl);
+ EXPECT_EQ(gpb(Gp::kIdDx), dl);
+
+ EXPECT_EQ(gpb_lo(Gp::kIdAx), al);
+ EXPECT_EQ(gpb_lo(Gp::kIdBx), bl);
+ EXPECT_EQ(gpb_lo(Gp::kIdCx), cl);
+ EXPECT_EQ(gpb_lo(Gp::kIdDx), dl);
+
+ EXPECT_EQ(gpb_hi(Gp::kIdAx), ah);
+ EXPECT_EQ(gpb_hi(Gp::kIdBx), bh);
+ EXPECT_EQ(gpb_hi(Gp::kIdCx), ch);
+ EXPECT_EQ(gpb_hi(Gp::kIdDx), dh);
+
+ EXPECT_EQ(gpw(Gp::kIdAx), ax);
+ EXPECT_EQ(gpw(Gp::kIdBx), bx);
+ EXPECT_EQ(gpw(Gp::kIdCx), cx);
+ EXPECT_EQ(gpw(Gp::kIdDx), dx);
+
+ EXPECT_EQ(gpd(Gp::kIdAx), eax);
+ EXPECT_EQ(gpd(Gp::kIdBx), ebx);
+ EXPECT_EQ(gpd(Gp::kIdCx), ecx);
+ EXPECT_EQ(gpd(Gp::kIdDx), edx);
+
+ EXPECT_EQ(gpq(Gp::kIdAx), rax);
+ EXPECT_EQ(gpq(Gp::kIdBx), rbx);
+ EXPECT_EQ(gpq(Gp::kIdCx), rcx);
+ EXPECT_EQ(gpq(Gp::kIdDx), rdx);
+
+ EXPECT_NE(gpb(Gp::kIdAx), dl);
+ EXPECT_NE(gpw(Gp::kIdBx), cx);
+ EXPECT_NE(gpd(Gp::kIdCx), ebx);
+ EXPECT_NE(gpq(Gp::kIdDx), rax);
+
+ INFO("Checking if x86::reg(...) matches built-in IDs");
+ EXPECT_EQ(gpb(5), bpl);
+ EXPECT_EQ(gpw(5), bp);
+ EXPECT_EQ(gpd(5), ebp);
+ EXPECT_EQ(gpq(5), rbp);
+ EXPECT_EQ(st(5) , st5);
+ EXPECT_EQ(mm(5) , mm5);
+ EXPECT_EQ(k(5) , k5);
+ EXPECT_EQ(cr(5) , cr5);
+ EXPECT_EQ(dr(5) , dr5);
+ EXPECT_EQ(xmm(5), xmm5);
+ EXPECT_EQ(ymm(5), ymm5);
+ EXPECT_EQ(zmm(5), zmm5);
+
+ INFO("Checking x86::Gp register properties");
+ EXPECT_TRUE(Gp::make_r32(0).is_reg());
+ EXPECT_TRUE(Gp::make_r32(0).is_gp());
+ EXPECT_TRUE(Gp::make_r32(0).is_gp32());
+ EXPECT_TRUE(eax.is_reg());
+ EXPECT_TRUE(eax.is_gp());
+ EXPECT_TRUE(eax.is_gp32());
+ EXPECT_EQ(eax.id(), 0u);
+ EXPECT_EQ(eax.size(), 4u);
+ EXPECT_EQ(eax.reg_type(), RegType::kGp32);
+ EXPECT_EQ(eax.reg_group(), RegGroup::kGp);
+
+ EXPECT_TRUE(Gp::make_r64(0).is_reg());
+ EXPECT_TRUE(Gp::make_r64(0).is_gp());
+ EXPECT_TRUE(Gp::make_r64(0).is_gp64());
+ EXPECT_TRUE(rax.is_reg());
+ EXPECT_TRUE(rax.is_gp());
+ EXPECT_TRUE(rax.is_gp64());
+ EXPECT_EQ(rax.id(), 0u);
+ EXPECT_EQ(rax.size(), 8u);
+ EXPECT_EQ(rax.reg_type(), RegType::kGp64);
+ EXPECT_EQ(rax.reg_group(), RegGroup::kGp);
+
+ INFO("Checking x86::Vec register properties");
+ EXPECT_TRUE(Vec().is_reg());
+
+ EXPECT_TRUE(Vec::make_xmm(0).is_reg());
+ EXPECT_TRUE(Vec::make_xmm(0).is_vec128());
+ EXPECT_TRUE(xmm4.is_reg());
+ EXPECT_TRUE(xmm4.is_vec());
+ EXPECT_EQ(xmm4.id(), 4u);
+ EXPECT_EQ(xmm4.size(), 16u);
+ EXPECT_EQ(xmm4.reg_type(), RegType::kVec128);
+ EXPECT_EQ(xmm4.reg_group(), RegGroup::kVec);
+
+ EXPECT_TRUE(Vec::make_ymm(0).is_reg());
+ EXPECT_TRUE(Vec::make_ymm(0).is_vec256());
+ EXPECT_TRUE(ymm5.is_reg());
+ EXPECT_TRUE(ymm5.is_vec());
+ EXPECT_EQ(ymm5.id(), 5u);
+ EXPECT_EQ(ymm5.size(), 32u);
+ EXPECT_EQ(ymm5.reg_type(), RegType::kVec256);
+ EXPECT_EQ(ymm5.reg_group(), RegGroup::kVec);
+
+ EXPECT_TRUE(Vec::make_zmm(0).is_reg());
+ EXPECT_TRUE(Vec::make_zmm(0).is_vec512());
+ EXPECT_TRUE(zmm6.is_reg());
+ EXPECT_TRUE(zmm6.is_vec());
+ EXPECT_EQ(zmm6.id(), 6u);
+ EXPECT_EQ(zmm6.size(), 64u);
+ EXPECT_EQ(zmm6.reg_type(), RegType::kVec512);
+ EXPECT_EQ(zmm6.reg_group(), RegGroup::kVec);
+
+ // Converts a VEC register to a type of the passed register, but keeps the ID.
+ EXPECT_EQ(xmm4.clone_as(ymm10), ymm4);
+ EXPECT_EQ(xmm4.clone_as(zmm11), zmm4);
+ EXPECT_EQ(ymm5.clone_as(xmm12), xmm5);
+ EXPECT_EQ(ymm5.clone_as(zmm13), zmm5);
+ EXPECT_EQ(zmm6.clone_as(xmm14), xmm6);
+ EXPECT_EQ(zmm6.clone_as(ymm15), ymm6);
+
+ EXPECT_EQ(xmm7.xmm(), xmm7);
+ EXPECT_EQ(xmm7.ymm(), ymm7);
+ EXPECT_EQ(xmm7.zmm(), zmm7);
+
+ EXPECT_EQ(ymm7.xmm(), xmm7);
+ EXPECT_EQ(ymm7.ymm(), ymm7);
+ EXPECT_EQ(ymm7.zmm(), zmm7);
+
+ EXPECT_EQ(zmm7.xmm(), xmm7);
+ EXPECT_EQ(zmm7.ymm(), ymm7);
+ EXPECT_EQ(zmm7.zmm(), zmm7);
+
+ EXPECT_EQ(xmm4.half(), xmm4);
+ EXPECT_EQ(ymm4.half(), xmm4);
+ EXPECT_EQ(zmm4.half(), ymm4);
+
+ INFO("Checking x86::Mm register properties");
+ EXPECT_TRUE(Mm().is_reg());
+ EXPECT_TRUE(mm2.is_reg());
+ EXPECT_EQ(mm2.id(), 2u);
+ EXPECT_EQ(mm2.size(), 8u);
+ EXPECT_EQ(mm2.reg_type(), RegType::kX86_Mm);
+ EXPECT_EQ(mm2.reg_group(), RegGroup::kX86_MM);
+
+ INFO("Checking x86::KReg register properties");
+ EXPECT_TRUE(KReg().is_reg());
+ EXPECT_TRUE(k3.is_reg());
+ EXPECT_EQ(k3.id(), 3u);
+ EXPECT_EQ(k3.size(), 0u);
+ EXPECT_EQ(k3.reg_type(), RegType::kMask);
+ EXPECT_EQ(k3.reg_group(), RegGroup::kMask);
+
+ INFO("Checking x86::St register properties");
+ EXPECT_TRUE(St().is_reg());
+ EXPECT_TRUE(st1.is_reg());
+ EXPECT_EQ(st1.id(), 1u);
+ EXPECT_EQ(st1.size(), 10u);
+ EXPECT_EQ(st1.reg_type(), RegType::kX86_St);
+ EXPECT_EQ(st1.reg_group(), RegGroup::kX86_St);
+
+ INFO("Checking if default constructed regs behave as expected");
+ EXPECT_FALSE(Reg().is_valid());
+ EXPECT_FALSE(Gp().is_valid());
+ EXPECT_FALSE(Vec().is_valid());
+ EXPECT_FALSE(Mm().is_valid());
+ EXPECT_FALSE(KReg().is_valid());
+ EXPECT_FALSE(SReg().is_valid());
+ EXPECT_FALSE(CReg().is_valid());
+ EXPECT_FALSE(DReg().is_valid());
+ EXPECT_FALSE(St().is_valid());
+ EXPECT_FALSE(Bnd().is_valid());
+
+ INFO("Checking x86::Mem operand");
+ Mem m;
+ EXPECT_EQ(m, Mem());
+
+ m = ptr(L);
+ EXPECT_TRUE(m.has_base());
+ EXPECT_FALSE(m.has_base_reg());
+ EXPECT_TRUE(m.has_base_label());
+ EXPECT_FALSE(m.has_offset());
+ EXPECT_FALSE(m.is_offset_64bit());
+ EXPECT_EQ(m.offset(), 0);
+ EXPECT_EQ(m.offset_lo32(), 0);
+
+ m = ptr(0x0123456789ABCDEFu);
+ EXPECT_FALSE(m.has_base());
+ EXPECT_FALSE(m.has_base_reg());
+ EXPECT_FALSE(m.has_index());
+ EXPECT_FALSE(m.has_index_reg());
+ EXPECT_TRUE(m.has_offset());
+ EXPECT_TRUE(m.is_offset_64bit());
+ EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDEFu));
+ EXPECT_EQ(m.offset_lo32(), int32_t(0x89ABCDEFu));
+ m.add_offset(1);
+ EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDF0u));
+
+ m = ptr(0x0123456789ABCDEFu, rdi, 3);
+ EXPECT_FALSE(m.has_segment());
+ EXPECT_FALSE(m.has_base());
+ EXPECT_FALSE(m.has_base_reg());
+ EXPECT_TRUE(m.has_index());
+ EXPECT_TRUE(m.has_index_reg());
+ EXPECT_EQ(m.index_type(), rdi.reg_type());
+ EXPECT_EQ(m.index_id(), rdi.id());
+ EXPECT_EQ(m.shift(), 3u);
+ EXPECT_TRUE(m.has_offset());
+ EXPECT_TRUE(m.is_offset_64bit());
+ EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDEFu));
+ EXPECT_EQ(m.offset_lo32(), int32_t(0x89ABCDEFu));
+ m.reset_index();
+ EXPECT_FALSE(m.has_index());
+ EXPECT_FALSE(m.has_index_reg());
+
+ m = ptr(rax);
+ EXPECT_TRUE(m.has_base());
+ EXPECT_TRUE(m.has_base_reg());
+ EXPECT_EQ(m.base_type(), rax.reg_type());
+ EXPECT_EQ(m.base_id(), rax.id());
+ EXPECT_FALSE(m.has_index());
+ EXPECT_FALSE(m.has_index_reg());
+ EXPECT_EQ(m.index_type(), RegType::kNone);
+ EXPECT_EQ(m.index_id(), 0u);
+ EXPECT_FALSE(m.has_offset());
+ EXPECT_FALSE(m.is_offset_64bit());
+ EXPECT_EQ(m.offset(), 0);
+ EXPECT_EQ(m.offset_lo32(), 0);
+ m.set_index(rsi);
+ EXPECT_TRUE(m.has_index());
+ EXPECT_TRUE(m.has_index_reg());
+ EXPECT_EQ(m.index_type(), rsi.reg_type());
+ EXPECT_EQ(m.index_id(), rsi.id());
+}
+#endif
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/asmjit/x86/x86operand.h b/3rdparty/asmjit/asmjit/x86/x86operand.h
new file mode 100644
index 00000000000..8725d8b7476
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86operand.h
@@ -0,0 +1,1195 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86OPERAND_H_INCLUDED
+#define ASMJIT_X86_X86OPERAND_H_INCLUDED
+
+#include <asmjit/core/archtraits.h>
+#include <asmjit/core/operand.h>
+#include <asmjit/core/type.h>
+#include <asmjit/x86/x86globals.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \addtogroup asmjit_x86
+//! \{
+
+class Mem;
+class Gp;
+class Vec;
+class Mm;
+class KReg;
+class SReg;
+class CReg;
+class DReg;
+class St;
+class Bnd;
+class Tmm;
+class Rip;
+
+//! General purpose register (X86|X86_64).
+//!
+//! To get a specific register you can use:
+//! - specific registers directly, like `x86::eax` or `x86::rbx`, etc...
+//! - construct a register operand dynamically, like `x86::gp8(id)`, `x86::gp64(id)`, etc...
+//! - use `Gp::make_r[8|8lo|8hi|16|32|64](id)` API for convenience
+//!
+//! To cast a register to a specific type, use \ref Gp::r8(), \ref Gp::r8_lo(), \ref Gp::r8_hi(), \ref Gp::r16(),
+//! \ref Gp::r32(), and \ref Gp::r64() member functions. Each cast first clones the register and then changes
+//! its signature to match the register it has been casted to.
+class Gp : public UniGp {
+public:
+ //! \name Constants
+ //! \{
+
+ //! Physical id (X86|X86_64).
+ //!
+ //! \note Register indexes have been reduced to only support general purpose registers. There is no need to
+ //! have enumerations with number suffix that expands to the exactly same value as the suffix value itself.
+ enum Id : uint32_t {
+ kIdAx = 0, //!< Physical id of AL|AH|AX|EAX|RAX registers.
+ kIdCx = 1, //!< Physical id of CL|CH|CX|ECX|RCX registers.
+ kIdDx = 2, //!< Physical id of DL|DH|DX|EDX|RDX registers.
+ kIdBx = 3, //!< Physical id of BL|BH|BX|EBX|RBX registers.
+ kIdSp = 4, //!< Physical id of SPL|SP|ESP|RSP registers.
+ kIdBp = 5, //!< Physical id of BPL|BP|EBP|RBP registers.
+ kIdSi = 6, //!< Physical id of SIL|SI|ESI|RSI registers.
+ kIdDi = 7, //!< Physical id of DIL|DI|EDI|RDI registers.
+ kIdR8 = 8, //!< Physical id of R8B|R8W|R8D|R8 registers (X86_64).
+ kIdR9 = 9, //!< Physical id of R9B|R9W|R9D|R9 registers (X86_64).
+ kIdR10 = 10, //!< Physical id of R10B|R10W|R10D|R10 registers (X86_64).
+ kIdR11 = 11, //!< Physical id of R11B|R11W|R11D|R11 registers (X86_64).
+ kIdR12 = 12, //!< Physical id of R12B|R12W|R12D|R12 registers (X86_64).
+ kIdR13 = 13, //!< Physical id of R13B|R13W|R13D|R13 registers (X86_64).
+ kIdR14 = 14, //!< Physical id of R14B|R14W|R14D|R14 registers (X86_64).
+ kIdR15 = 15 //!< Physical id of R15B|R15W|R15D|R15 registers (X86_64).
+ };
+
+ //! \}
+
+ ASMJIT_DEFINE_ABSTRACT_REG(Gp, UniGp)
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Creates a new 8-bit low general purpose register (GPB) having the given register id `reg_id`.
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r8(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp8Lo>(), reg_id); }
+ [[nodiscard]]
+
+ //! Creates a new 8-bit low general purpose register (GPB) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r8_lo(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp8Lo>(), reg_id); }
+
+ //! Creates a new 8-bit high general purpose register (GPB) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r8_hi(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp8Hi>(), reg_id); }
+
+ //! Creates a new 16-bit low general purpose register (GPB) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r16(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp16>(), reg_id); }
+
+ //! Creates a new 32-bit low general purpose register (GPB) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r32(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp32>(), reg_id); }
+
+ //! Creates a new 64-bit low general purpose register (GPB) having the given register id `reg_id` (X86_64).
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Gp make_r64(uint32_t reg_id) noexcept { return Gp(signature_of_t<RegType::kGp64>(), reg_id); }
+
+ //! \}
+
+ //! \name Gp Register Accessors
+ //! \{
+
+ //! Clones and casts this register to 8-bit (LO) part.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r8() const noexcept { return make_r8(id()); }
+
+ //! Clones and casts this register to 8-bit (LO) part.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r8_lo() const noexcept { return make_r8_lo(id()); }
+
+ //! Clones and casts this register to 8-bit (HI) part.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r8_hi() const noexcept { return make_r8_hi(id()); }
+
+ //! Clones and casts this register to 16-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r16() const noexcept { return make_r16(id()); }
+
+ //! Clones and casts this register to 32-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r32() const noexcept { return make_r32(id()); }
+
+ //! Clones and casts this register to 64-bit.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Gp r64() const noexcept { return make_r64(id()); }
+
+ //! \}
+};
+
+//! Vector register (XMM|YMM|ZMM) (X86|X86_64).
+//!
+//! To get a specific register you can use:
+//! - specific registers directly, like `x86::xmm0` or `x86::ymm1`, `x86::zmm2`, etc...
+//! - construct a register operand dynamically, like `x86::xmm(id)`, `x86::ymm(id)`, and `x86::zmm(id)`
+//! - use `Vec::make_v[128|256|512](id)` or `Vec::make_[xmm|ymm|zmm](id)` API for convenience
+//!
+//! To cast a register to a specific type, use \ref Vec::v128(), \ref Vec::v256(), \ref Vec::v512(), \ref Vec::xmm(),
+//! \ref Vec::ymm(), and \ref Vec::zmm() member functions. Each cast first clones the register and then changes its
+//! signature to match the register it has been casted to.
+class Vec : public UniVec {
+ ASMJIT_DEFINE_ABSTRACT_REG(Vec, UniVec)
+
+ //! \name Static Constructors
+ //! \{
+
+ //! Creates a new 128-bit vector register (XMM) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v128(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec128>(), reg_id); }
+
+ //! Creates a new 256-bit vector register (YMM) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v256(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec256>(), reg_id); }
+
+ //! Creates a new 512-bit vector register (ZMM) having the given register id `reg_id`.
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_v512(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec512>(), reg_id); }
+
+ //! Creates a new 128-bit vector register (XMM) having the given register id `reg_id`.
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref make_v128().
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_xmm(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec128>(), reg_id); }
+
+ //! Creates a new 256-bit vector register (YMM) having the given register id `reg_id`.
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref make_v256().
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_ymm(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec256>(), reg_id); }
+
+ //! Creates a new 512-bit vector register (ZMM) having the given register id `reg_id`.
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref make_v512().
+ [[nodiscard]]
+ static ASMJIT_INLINE_CONSTEXPR Vec make_zmm(uint32_t reg_id) noexcept { return Vec(signature_of_t<RegType::kVec512>(), reg_id); }
+
+ //! \}
+
+ //! \name Vec Register Accessors
+ //! \{
+
+ //! Tests whether the register is a 128-bit vector (XMM).
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref Reg::is_vec128().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_xmm() const noexcept { return is_vec128(); }
+
+ //! Tests whether the register is a 256-bit vector (YMM).
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref Reg::is_vec256().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_ymm() const noexcept { return is_vec256(); }
+
+ //! Tests whether the register is a 512-bit vector (ZMM).
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref Reg::is_vec512().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_zmm() const noexcept { return is_vec512(); }
+
+ //! Clones and casts this register to XMM (Vec128).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v128() const noexcept { return make_v128(id()); }
+
+ //! Clones and casts this register to YMM (Vec256).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v256() const noexcept { return make_v256(id()); }
+
+ //! Clones and casts this register to ZMM (Vec512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec v512() const noexcept { return make_v512(id()); }
+
+ //! Clones and casts this register to XMM (Vec128).
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref v128().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec xmm() const noexcept { return make_v128(id()); }
+
+ //! Clones and casts this register to YMM (Vec256).
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref v256().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec ymm() const noexcept { return make_v256(id()); }
+
+ //! Clones and casts this register to ZMM (Vec512).
+ //!
+ //! \note This is an architecture-specific naming that does the same as \ref v512().
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec zmm() const noexcept { return make_v512(id()); }
+
+ //! Clones and casts this register to a register that has half the size (or XMM if it's already XMM).
+ //!
+ //! \note AsmJit defines vector registers of various sizes to target multiple architectures, however, this
+ //! function never returns a vector register that would have less than 128 bits as X86|X86_64 architecture
+ //! doesn't provide such registers. So, effectively this function returns either YMM register if the input
+ //! was ZMM, or XMM for whatever else input.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Vec half() const noexcept {
+ return Vec(is_vec512() ? signature_of_t<RegType::kVec256>() : signature_of_t<RegType::kVec128>(), id());
+ }
+
+ //! \}
+};
+
+//! Segment register (X86|X86_64).
+class SReg : public Reg {
+ ASMJIT_DEFINE_FINAL_REG(SReg, Reg, RegTraits<RegType::kSegment>)
+
+ //! X86 segment id.
+ enum Id : uint32_t {
+ //! No segment (default).
+ kIdNone = 0,
+ //! ES segment.
+ kIdEs = 1,
+ //! CS segment.
+ kIdCs = 2,
+ //! SS segment.
+ kIdSs = 3,
+ //! DS segment.
+ kIdDs = 4,
+ //! FS segment.
+ kIdFs = 5,
+ //! GS segment.
+ kIdGs = 6,
+
+ //! Count of X86 segment registers supported by AsmJit.
+ //!
+ //! \note X86 architecture has 6 segment registers - ES, CS, SS, DS, FS, GS. X64 architecture lowers them down to
+ //! just FS and GS. AsmJit supports 7 segment registers - all addressable in both X86 and X64 modes and one extra
+ //! called `SReg::kIdNone`, which is AsmJit specific and means that there is no segment register specified.
+ kIdCount = 7
+ };
+};
+
+//! 64-bit K register (AVX512+).
+class KReg : public Reg { ASMJIT_DEFINE_FINAL_REG(KReg, Reg, RegTraits<RegType::kMask>) };
+//! 64-bit MMX register (MMX+).
+class Mm : public Reg { ASMJIT_DEFINE_FINAL_REG(Mm, Reg, RegTraits<RegType::kX86_Mm>) };
+//! 32-bit or 64-bit control register (X86).
+class CReg : public Reg { ASMJIT_DEFINE_FINAL_REG(CReg, Reg, RegTraits<RegType::kControl>) };
+//! 32-bit or 64-bit debug register (X86).
+class DReg : public Reg { ASMJIT_DEFINE_FINAL_REG(DReg, Reg, RegTraits<RegType::kDebug>) };
+//! 80-bit FPU register (X86).
+class St : public Reg { ASMJIT_DEFINE_FINAL_REG(St, Reg, RegTraits<RegType::kX86_St>) };
+//! 128-bit BND register (BND+).
+class Bnd : public Reg { ASMJIT_DEFINE_FINAL_REG(Bnd, Reg, RegTraits<RegType::kX86_Bnd>) };
+//! 8192-bit TMM register (AMX).
+class Tmm : public Reg { ASMJIT_DEFINE_FINAL_REG(Tmm, Reg, RegTraits<RegType::kTile>) };
+//! RIP register (X86).
+class Rip : public Reg { ASMJIT_DEFINE_FINAL_REG(Rip, Reg, RegTraits<RegType::kPC>) };
+
+//! \namespace asmjit::x86::regs
+//!
+//! Registers provided by X86 and X64 ISAs are in both `asmjit::x86` and `asmjit::x86::regs` namespaces so they can
+//! be included with using directive. For example `using namespace asmjit::x86::regs` would include all registers,
+//! but not other X86-specific API, whereas `using namespace asmjit::x86` would include everything X86-specific.
+#ifndef _DOXYGEN
+namespace regs {
+#endif
+
+//! Creates an 8-bit low GPB register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gpb(uint32_t reg_id) noexcept { return Gp::make_r8(reg_id); }
+
+//! Creates an 8-bit low GPB register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp8(uint32_t reg_id) noexcept { return Gp::make_r8(reg_id); }
+
+//! Creates an 8-bit low GPB register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gpb_lo(uint32_t reg_id) noexcept { return Gp::make_r8_lo(reg_id); }
+
+//! Creates an 8-bit low GPB register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp8_lo(uint32_t reg_id) noexcept { return Gp::make_r8_lo(reg_id); }
+
+//! Creates an 8-bit high GPB register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gpb_hi(uint32_t reg_id) noexcept { return Gp::make_r8_hi(reg_id); }
+
+//! Creates an 8-bit high GPB register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp8_hi(uint32_t reg_id) noexcept { return Gp::make_r8_hi(reg_id); }
+
+//! Creates a 16-bit GPW register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gpw(uint32_t reg_id) noexcept { return Gp::make_r16(reg_id); }
+
+//! Creates a 16-bit GPW register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp16(uint32_t reg_id) noexcept { return Gp::make_r16(reg_id); }
+
+//! Creates a 32-bit GPD register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gpd(uint32_t reg_id) noexcept { return Gp::make_r32(reg_id); }
+
+//! Creates a 32-bit GPD register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp32(uint32_t reg_id) noexcept { return Gp::make_r32(reg_id); }
+
+//! Creates a 64-bit GPQ register operand (64-bit).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gpq(uint32_t reg_id) noexcept { return Gp::make_r64(reg_id); }
+
+//! Creates a 64-bit GPQ register operand (64-bit).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Gp gp64(uint32_t reg_id) noexcept { return Gp::make_r64(reg_id); }
+
+//! Creates a 128-bit XMM register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec xmm(uint32_t reg_id) noexcept { return Vec::make_v128(reg_id); }
+
+//! Creates a 256-bit YMM register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec ymm(uint32_t reg_id) noexcept { return Vec::make_v256(reg_id); }
+
+//! Creates a 512-bit ZMM register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Vec zmm(uint32_t reg_id) noexcept { return Vec::make_v512(reg_id); }
+
+//! Creates a 64-bit K register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR KReg k(uint32_t reg_id) noexcept { return KReg(reg_id); }
+
+//! Creates a 64-bit MM register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mm mm(uint32_t reg_id) noexcept { return Mm(reg_id); }
+
+//! Creates a 32-bit or 64-bit control register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR CReg cr(uint32_t reg_id) noexcept { return CReg(reg_id); }
+
+//! Creates a 32-bit or 64-bit debug register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR DReg dr(uint32_t reg_id) noexcept { return DReg(reg_id); }
+
+//! Creates an 80-bit st register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR St st(uint32_t reg_id) noexcept { return St(reg_id); }
+
+//! Creates a 128-bit bound register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Bnd bnd(uint32_t reg_id) noexcept { return Bnd(reg_id); }
+
+//! Creates a TMM register operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Tmm tmm(uint32_t reg_id) noexcept { return Tmm(reg_id); }
+
+static constexpr Gp al = Gp::make_r8(Gp::kIdAx);
+static constexpr Gp bl = Gp::make_r8(Gp::kIdBx);
+static constexpr Gp cl = Gp::make_r8(Gp::kIdCx);
+static constexpr Gp dl = Gp::make_r8(Gp::kIdDx);
+static constexpr Gp spl = Gp::make_r8(Gp::kIdSp);
+static constexpr Gp bpl = Gp::make_r8(Gp::kIdBp);
+static constexpr Gp sil = Gp::make_r8(Gp::kIdSi);
+static constexpr Gp dil = Gp::make_r8(Gp::kIdDi);
+static constexpr Gp r8b = Gp::make_r8(Gp::kIdR8);
+static constexpr Gp r9b = Gp::make_r8(Gp::kIdR9);
+static constexpr Gp r10b = Gp::make_r8(Gp::kIdR10);
+static constexpr Gp r11b = Gp::make_r8(Gp::kIdR11);
+static constexpr Gp r12b = Gp::make_r8(Gp::kIdR12);
+static constexpr Gp r13b = Gp::make_r8(Gp::kIdR13);
+static constexpr Gp r14b = Gp::make_r8(Gp::kIdR14);
+static constexpr Gp r15b = Gp::make_r8(Gp::kIdR15);
+
+static constexpr Gp ah = Gp::make_r8_hi(Gp::kIdAx);
+static constexpr Gp bh = Gp::make_r8_hi(Gp::kIdBx);
+static constexpr Gp ch = Gp::make_r8_hi(Gp::kIdCx);
+static constexpr Gp dh = Gp::make_r8_hi(Gp::kIdDx);
+
+static constexpr Gp ax = Gp::make_r16(Gp::kIdAx);
+static constexpr Gp bx = Gp::make_r16(Gp::kIdBx);
+static constexpr Gp cx = Gp::make_r16(Gp::kIdCx);
+static constexpr Gp dx = Gp::make_r16(Gp::kIdDx);
+static constexpr Gp sp = Gp::make_r16(Gp::kIdSp);
+static constexpr Gp bp = Gp::make_r16(Gp::kIdBp);
+static constexpr Gp si = Gp::make_r16(Gp::kIdSi);
+static constexpr Gp di = Gp::make_r16(Gp::kIdDi);
+static constexpr Gp r8w = Gp::make_r16(Gp::kIdR8);
+static constexpr Gp r9w = Gp::make_r16(Gp::kIdR9);
+static constexpr Gp r10w = Gp::make_r16(Gp::kIdR10);
+static constexpr Gp r11w = Gp::make_r16(Gp::kIdR11);
+static constexpr Gp r12w = Gp::make_r16(Gp::kIdR12);
+static constexpr Gp r13w = Gp::make_r16(Gp::kIdR13);
+static constexpr Gp r14w = Gp::make_r16(Gp::kIdR14);
+static constexpr Gp r15w = Gp::make_r16(Gp::kIdR15);
+
+static constexpr Gp eax = Gp::make_r32(Gp::kIdAx);
+static constexpr Gp ebx = Gp::make_r32(Gp::kIdBx);
+static constexpr Gp ecx = Gp::make_r32(Gp::kIdCx);
+static constexpr Gp edx = Gp::make_r32(Gp::kIdDx);
+static constexpr Gp esp = Gp::make_r32(Gp::kIdSp);
+static constexpr Gp ebp = Gp::make_r32(Gp::kIdBp);
+static constexpr Gp esi = Gp::make_r32(Gp::kIdSi);
+static constexpr Gp edi = Gp::make_r32(Gp::kIdDi);
+static constexpr Gp r8d = Gp::make_r32(Gp::kIdR8);
+static constexpr Gp r9d = Gp::make_r32(Gp::kIdR9);
+static constexpr Gp r10d = Gp::make_r32(Gp::kIdR10);
+static constexpr Gp r11d = Gp::make_r32(Gp::kIdR11);
+static constexpr Gp r12d = Gp::make_r32(Gp::kIdR12);
+static constexpr Gp r13d = Gp::make_r32(Gp::kIdR13);
+static constexpr Gp r14d = Gp::make_r32(Gp::kIdR14);
+static constexpr Gp r15d = Gp::make_r32(Gp::kIdR15);
+
+static constexpr Gp rax = Gp::make_r64(Gp::kIdAx);
+static constexpr Gp rbx = Gp::make_r64(Gp::kIdBx);
+static constexpr Gp rcx = Gp::make_r64(Gp::kIdCx);
+static constexpr Gp rdx = Gp::make_r64(Gp::kIdDx);
+static constexpr Gp rsp = Gp::make_r64(Gp::kIdSp);
+static constexpr Gp rbp = Gp::make_r64(Gp::kIdBp);
+static constexpr Gp rsi = Gp::make_r64(Gp::kIdSi);
+static constexpr Gp rdi = Gp::make_r64(Gp::kIdDi);
+static constexpr Gp r8 = Gp::make_r64(Gp::kIdR8);
+static constexpr Gp r9 = Gp::make_r64(Gp::kIdR9);
+static constexpr Gp r10 = Gp::make_r64(Gp::kIdR10);
+static constexpr Gp r11 = Gp::make_r64(Gp::kIdR11);
+static constexpr Gp r12 = Gp::make_r64(Gp::kIdR12);
+static constexpr Gp r13 = Gp::make_r64(Gp::kIdR13);
+static constexpr Gp r14 = Gp::make_r64(Gp::kIdR14);
+static constexpr Gp r15 = Gp::make_r64(Gp::kIdR15);
+
+static constexpr Vec xmm0 = Vec::make_v128(0);
+static constexpr Vec xmm1 = Vec::make_v128(1);
+static constexpr Vec xmm2 = Vec::make_v128(2);
+static constexpr Vec xmm3 = Vec::make_v128(3);
+static constexpr Vec xmm4 = Vec::make_v128(4);
+static constexpr Vec xmm5 = Vec::make_v128(5);
+static constexpr Vec xmm6 = Vec::make_v128(6);
+static constexpr Vec xmm7 = Vec::make_v128(7);
+static constexpr Vec xmm8 = Vec::make_v128(8);
+static constexpr Vec xmm9 = Vec::make_v128(9);
+static constexpr Vec xmm10 = Vec::make_v128(10);
+static constexpr Vec xmm11 = Vec::make_v128(11);
+static constexpr Vec xmm12 = Vec::make_v128(12);
+static constexpr Vec xmm13 = Vec::make_v128(13);
+static constexpr Vec xmm14 = Vec::make_v128(14);
+static constexpr Vec xmm15 = Vec::make_v128(15);
+static constexpr Vec xmm16 = Vec::make_v128(16);
+static constexpr Vec xmm17 = Vec::make_v128(17);
+static constexpr Vec xmm18 = Vec::make_v128(18);
+static constexpr Vec xmm19 = Vec::make_v128(19);
+static constexpr Vec xmm20 = Vec::make_v128(20);
+static constexpr Vec xmm21 = Vec::make_v128(21);
+static constexpr Vec xmm22 = Vec::make_v128(22);
+static constexpr Vec xmm23 = Vec::make_v128(23);
+static constexpr Vec xmm24 = Vec::make_v128(24);
+static constexpr Vec xmm25 = Vec::make_v128(25);
+static constexpr Vec xmm26 = Vec::make_v128(26);
+static constexpr Vec xmm27 = Vec::make_v128(27);
+static constexpr Vec xmm28 = Vec::make_v128(28);
+static constexpr Vec xmm29 = Vec::make_v128(29);
+static constexpr Vec xmm30 = Vec::make_v128(30);
+static constexpr Vec xmm31 = Vec::make_v128(31);
+
+static constexpr Vec ymm0 = Vec::make_v256(0);
+static constexpr Vec ymm1 = Vec::make_v256(1);
+static constexpr Vec ymm2 = Vec::make_v256(2);
+static constexpr Vec ymm3 = Vec::make_v256(3);
+static constexpr Vec ymm4 = Vec::make_v256(4);
+static constexpr Vec ymm5 = Vec::make_v256(5);
+static constexpr Vec ymm6 = Vec::make_v256(6);
+static constexpr Vec ymm7 = Vec::make_v256(7);
+static constexpr Vec ymm8 = Vec::make_v256(8);
+static constexpr Vec ymm9 = Vec::make_v256(9);
+static constexpr Vec ymm10 = Vec::make_v256(10);
+static constexpr Vec ymm11 = Vec::make_v256(11);
+static constexpr Vec ymm12 = Vec::make_v256(12);
+static constexpr Vec ymm13 = Vec::make_v256(13);
+static constexpr Vec ymm14 = Vec::make_v256(14);
+static constexpr Vec ymm15 = Vec::make_v256(15);
+static constexpr Vec ymm16 = Vec::make_v256(16);
+static constexpr Vec ymm17 = Vec::make_v256(17);
+static constexpr Vec ymm18 = Vec::make_v256(18);
+static constexpr Vec ymm19 = Vec::make_v256(19);
+static constexpr Vec ymm20 = Vec::make_v256(20);
+static constexpr Vec ymm21 = Vec::make_v256(21);
+static constexpr Vec ymm22 = Vec::make_v256(22);
+static constexpr Vec ymm23 = Vec::make_v256(23);
+static constexpr Vec ymm24 = Vec::make_v256(24);
+static constexpr Vec ymm25 = Vec::make_v256(25);
+static constexpr Vec ymm26 = Vec::make_v256(26);
+static constexpr Vec ymm27 = Vec::make_v256(27);
+static constexpr Vec ymm28 = Vec::make_v256(28);
+static constexpr Vec ymm29 = Vec::make_v256(29);
+static constexpr Vec ymm30 = Vec::make_v256(30);
+static constexpr Vec ymm31 = Vec::make_v256(31);
+
+static constexpr Vec zmm0 = Vec::make_v512(0);
+static constexpr Vec zmm1 = Vec::make_v512(1);
+static constexpr Vec zmm2 = Vec::make_v512(2);
+static constexpr Vec zmm3 = Vec::make_v512(3);
+static constexpr Vec zmm4 = Vec::make_v512(4);
+static constexpr Vec zmm5 = Vec::make_v512(5);
+static constexpr Vec zmm6 = Vec::make_v512(6);
+static constexpr Vec zmm7 = Vec::make_v512(7);
+static constexpr Vec zmm8 = Vec::make_v512(8);
+static constexpr Vec zmm9 = Vec::make_v512(9);
+static constexpr Vec zmm10 = Vec::make_v512(10);
+static constexpr Vec zmm11 = Vec::make_v512(11);
+static constexpr Vec zmm12 = Vec::make_v512(12);
+static constexpr Vec zmm13 = Vec::make_v512(13);
+static constexpr Vec zmm14 = Vec::make_v512(14);
+static constexpr Vec zmm15 = Vec::make_v512(15);
+static constexpr Vec zmm16 = Vec::make_v512(16);
+static constexpr Vec zmm17 = Vec::make_v512(17);
+static constexpr Vec zmm18 = Vec::make_v512(18);
+static constexpr Vec zmm19 = Vec::make_v512(19);
+static constexpr Vec zmm20 = Vec::make_v512(20);
+static constexpr Vec zmm21 = Vec::make_v512(21);
+static constexpr Vec zmm22 = Vec::make_v512(22);
+static constexpr Vec zmm23 = Vec::make_v512(23);
+static constexpr Vec zmm24 = Vec::make_v512(24);
+static constexpr Vec zmm25 = Vec::make_v512(25);
+static constexpr Vec zmm26 = Vec::make_v512(26);
+static constexpr Vec zmm27 = Vec::make_v512(27);
+static constexpr Vec zmm28 = Vec::make_v512(28);
+static constexpr Vec zmm29 = Vec::make_v512(29);
+static constexpr Vec zmm30 = Vec::make_v512(30);
+static constexpr Vec zmm31 = Vec::make_v512(31);
+
+static constexpr Mm mm0 = Mm(0);
+static constexpr Mm mm1 = Mm(1);
+static constexpr Mm mm2 = Mm(2);
+static constexpr Mm mm3 = Mm(3);
+static constexpr Mm mm4 = Mm(4);
+static constexpr Mm mm5 = Mm(5);
+static constexpr Mm mm6 = Mm(6);
+static constexpr Mm mm7 = Mm(7);
+
+static constexpr KReg k0 = KReg(0);
+static constexpr KReg k1 = KReg(1);
+static constexpr KReg k2 = KReg(2);
+static constexpr KReg k3 = KReg(3);
+static constexpr KReg k4 = KReg(4);
+static constexpr KReg k5 = KReg(5);
+static constexpr KReg k6 = KReg(6);
+static constexpr KReg k7 = KReg(7);
+
+static constexpr SReg no_seg = SReg(SReg::kIdNone);
+static constexpr SReg es = SReg(SReg::kIdEs);
+static constexpr SReg cs = SReg(SReg::kIdCs);
+static constexpr SReg ss = SReg(SReg::kIdSs);
+static constexpr SReg ds = SReg(SReg::kIdDs);
+static constexpr SReg fs = SReg(SReg::kIdFs);
+static constexpr SReg gs = SReg(SReg::kIdGs);
+
+static constexpr CReg cr0 = CReg(0);
+static constexpr CReg cr1 = CReg(1);
+static constexpr CReg cr2 = CReg(2);
+static constexpr CReg cr3 = CReg(3);
+static constexpr CReg cr4 = CReg(4);
+static constexpr CReg cr5 = CReg(5);
+static constexpr CReg cr6 = CReg(6);
+static constexpr CReg cr7 = CReg(7);
+static constexpr CReg cr8 = CReg(8);
+static constexpr CReg cr9 = CReg(9);
+static constexpr CReg cr10 = CReg(10);
+static constexpr CReg cr11 = CReg(11);
+static constexpr CReg cr12 = CReg(12);
+static constexpr CReg cr13 = CReg(13);
+static constexpr CReg cr14 = CReg(14);
+static constexpr CReg cr15 = CReg(15);
+
+static constexpr DReg dr0 = DReg(0);
+static constexpr DReg dr1 = DReg(1);
+static constexpr DReg dr2 = DReg(2);
+static constexpr DReg dr3 = DReg(3);
+static constexpr DReg dr4 = DReg(4);
+static constexpr DReg dr5 = DReg(5);
+static constexpr DReg dr6 = DReg(6);
+static constexpr DReg dr7 = DReg(7);
+static constexpr DReg dr8 = DReg(8);
+static constexpr DReg dr9 = DReg(9);
+static constexpr DReg dr10 = DReg(10);
+static constexpr DReg dr11 = DReg(11);
+static constexpr DReg dr12 = DReg(12);
+static constexpr DReg dr13 = DReg(13);
+static constexpr DReg dr14 = DReg(14);
+static constexpr DReg dr15 = DReg(15);
+
+static constexpr St st0 = St(0);
+static constexpr St st1 = St(1);
+static constexpr St st2 = St(2);
+static constexpr St st3 = St(3);
+static constexpr St st4 = St(4);
+static constexpr St st5 = St(5);
+static constexpr St st6 = St(6);
+static constexpr St st7 = St(7);
+
+static constexpr Bnd bnd0 = Bnd(0);
+static constexpr Bnd bnd1 = Bnd(1);
+static constexpr Bnd bnd2 = Bnd(2);
+static constexpr Bnd bnd3 = Bnd(3);
+
+static constexpr Tmm tmm0 = Tmm(0);
+static constexpr Tmm tmm1 = Tmm(1);
+static constexpr Tmm tmm2 = Tmm(2);
+static constexpr Tmm tmm3 = Tmm(3);
+static constexpr Tmm tmm4 = Tmm(4);
+static constexpr Tmm tmm5 = Tmm(5);
+static constexpr Tmm tmm6 = Tmm(6);
+static constexpr Tmm tmm7 = Tmm(7);
+
+static constexpr Rip rip = Rip(0);
+
+#ifndef _DOXYGEN
+} // {regs}
+
+// Make `x86::regs` accessible through `x86` namespace as well.
+using namespace regs;
+#endif
+
+//! Memory operand specific to X86 and X86_64 architecture.
+class Mem : public BaseMem {
+public:
+ //! \name Constants
+ //! \{
+
+ // Memory address type (2 bits).
+ // |........|........|XX......|........|
+ static inline constexpr uint32_t kSignatureMemAddrTypeShift = 14;
+ static inline constexpr uint32_t kSignatureMemAddrTypeMask = 0x03u << kSignatureMemAddrTypeShift;
+
+ // Memory shift amount (2 bits).
+ // |........|......XX|........|........|
+ static inline constexpr uint32_t kSignatureMemShiftValueShift = 16;
+ static inline constexpr uint32_t kSignatureMemShiftValueMask = 0x03u << kSignatureMemShiftValueShift;
+
+ // Memory segment reg (3 bits).
+ // |........|...XXX..|........|........|
+ static inline constexpr uint32_t kSignatureMemSegmentShift = 18;
+ static inline constexpr uint32_t kSignatureMemSegmentMask = 0x07u << kSignatureMemSegmentShift;
+
+ // Memory broadcast type (3 bits).
+ // |........|XXX.....|........|........|
+ static inline constexpr uint32_t kSignatureMemBroadcastShift = 21;
+ static inline constexpr uint32_t kSignatureMemBroadcastMask = 0x7u << kSignatureMemBroadcastShift;
+
+ //! Address type.
+ enum class AddrType : uint32_t {
+ //! Default address type, Assembler will select the best type when necessary.
+ kDefault = 0,
+ //! Absolute address type.
+ kAbs = 1,
+ //! Relative address type.
+ kRel = 2,
+
+ //! Maximum value of `AddrType`.
+ kMaxValue = kRel
+ };
+
+ //! Memory broadcast type.
+ enum class Broadcast : uint32_t {
+ //! No broadcast (regular memory operand).
+ kNone = 0,
+ //! Broadcast {1to2}.
+ k1To2 = 1,
+ //! Broadcast {1to4}.
+ k1To4 = 2,
+ //! Broadcast {1to8}.
+ k1To8 = 3,
+ //! Broadcast {1to16}.
+ k1To16 = 4,
+ //! Broadcast {1to32}.
+ k1To32 = 5,
+ //! Broadcast {1to64}.
+ k1To64 = 6,
+
+ //! Maximum value of `Broadcast`.
+ kMaxValue = k1To64
+ };
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ //! Creates a default `Mem` operand that points to [0].
+ ASMJIT_INLINE_CONSTEXPR Mem() noexcept
+ : BaseMem() {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Mem& other) noexcept
+ : BaseMem(other) {}
+
+ ASMJIT_INLINE_NODEBUG explicit Mem(Globals::NoInit_) noexcept
+ : BaseMem(Globals::NoInit) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Signature& signature, uint32_t base_id, uint32_t index_id, int32_t offset) noexcept
+ : BaseMem(signature, base_id, index_id, offset) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Label& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(RegType::kLabelTag) |
+ Signature::from_size(size) |
+ signature, base.id(), 0, off) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Label& base, const Reg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(RegType::kLabelTag) |
+ Signature::from_mem_index_type(index.reg_type()) |
+ Signature::from_value<kSignatureMemShiftValueMask>(shift) |
+ Signature::from_size(size) |
+ signature, base.id(), index.id(), off) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Reg& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(base.reg_type()) |
+ Signature::from_size(size) |
+ signature, base.id(), 0, off) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(const Reg& base, const Reg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_base_type(base.reg_type()) |
+ Signature::from_mem_index_type(index.reg_type()) |
+ Signature::from_value<kSignatureMemShiftValueMask>(shift) |
+ Signature::from_size(size) |
+ signature, base.id(), index.id(), off) {}
+
+ ASMJIT_INLINE_CONSTEXPR explicit Mem(uint64_t base, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_size(size) |
+ signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
+
+ ASMJIT_INLINE_CONSTEXPR Mem(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
+ : BaseMem(Signature::from_op_type(OperandType::kMem) |
+ Signature::from_mem_index_type(index.reg_type()) |
+ Signature::from_value<kSignatureMemShiftValueMask>(shift) |
+ Signature::from_size(size) |
+ signature, uint32_t(base >> 32), index.id(), int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
+
+ //! \}
+
+ //! \name Overloaded Operators
+ //! \{
+
+ ASMJIT_INLINE_NODEBUG Mem& operator=(const Mem& other) noexcept = default;
+
+ //! \}
+
+ //! \name Clone
+ //! \{
+
+ //! Clones the memory operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem clone() const noexcept { return Mem(*this); }
+
+ //! Creates a copy of this memory operand adjusted by `off`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem clone_adjusted(int64_t off) const noexcept {
+ Mem result(*this);
+ result.add_offset(off);
+ return result;
+ }
+
+ //! Creates a copy of this memory operand resized to `size`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem clone_resized(uint32_t size) const noexcept {
+ Mem result(*this);
+ result.set_size(size);
+ return result;
+ }
+
+ //! Creates a copy of this memory operand with a broadcast `bcst`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem clone_broadcasted(Broadcast bcst) const noexcept {
+ return Mem((_signature & ~Signature{kSignatureMemBroadcastMask}) | Signature::from_value<kSignatureMemBroadcastMask>(bcst), _base_id, _data[0], int32_t(_data[1]));
+ }
+
+ //! \}
+
+ //! \name Base & Index
+ //! \{
+
+ //! Converts memory `base_type` and `base_id` to `Reg` instance.
+ //!
+ //! The memory must have a valid base register otherwise the result will be wrong.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Reg base_reg() const noexcept { return Reg::from_type_and_id(base_type(), base_id()); }
+
+ //! Converts memory `index_type` and `index_id` to `Reg` instance.
+ //!
+ //! The memory must have a valid index register otherwise the result will be wrong.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Reg index_reg() const noexcept { return Reg::from_type_and_id(index_type(), index_id()); }
+
+ using BaseMem::set_index;
+
+ ASMJIT_INLINE_CONSTEXPR void set_index(const Reg& index, uint32_t shift) noexcept {
+ set_index(index);
+ set_shift(shift);
+ }
+
+ //! \}
+
+ //! \name Memory Size
+ //! \{
+
+ //! Tests whether the memory operand specifies a size (i.e. the size is not zero).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_size() const noexcept { return _signature.has_field<Signature::kSizeMask>(); }
+
+ //! Tests whether the memory operand size matches size `s`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_size(uint32_t s) const noexcept { return size() == s; }
+
+ //! Returns the size of the memory operand in bytes.
+ //!
+ //! \note Most instructions would deduce the size of the memory operand, so in most cases it's expected that the
+ //! returned value would be zero. However, some instruction require the size to select between multiple variations,
+ //! so in some cases size is required would be non-zero (for example `inc [mem], immediate` requires size to
+ //! distinguish between 8-bit, 16-bit, 32-bit, and 64-bit increments.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t size() const noexcept { return _signature.get_field<Signature::kSizeMask>(); }
+
+ //! Sets the memory operand size (in bytes).
+ ASMJIT_INLINE_CONSTEXPR void set_size(uint32_t size) noexcept { _signature.set_field<Signature::kSizeMask>(size); }
+
+ //! \}
+
+ //! \name Address Type
+ //! \{
+
+ //! Returns the address type of the memory operand.
+ //!
+ //! By default, address type of newly created memory operands is always \ref AddrType::kDefault.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR AddrType addr_type() const noexcept { return (AddrType)_signature.get_field<kSignatureMemAddrTypeMask>(); }
+
+ //! Sets the address type to `addr_type`.
+ ASMJIT_INLINE_CONSTEXPR void set_addr_type(AddrType addr_type) noexcept { _signature.set_field<kSignatureMemAddrTypeMask>(uint32_t(addr_type)); }
+
+ //! Resets the address type to \ref AddrType::kDefault.
+ ASMJIT_INLINE_CONSTEXPR void reset_addr_type() noexcept { _signature.set_field<kSignatureMemAddrTypeMask>(uint32_t(AddrType::kDefault)); }
+
+ //! Tests whether the address type is \ref AddrType::kAbs.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_addr_abs() const noexcept { return addr_type() == AddrType::kAbs; }
+
+ //! Sets the address type to \ref AddrType::kAbs.
+ ASMJIT_INLINE_CONSTEXPR void set_addr_abs() noexcept { set_addr_type(AddrType::kAbs); }
+
+ //! Tests whether the address type is \ref AddrType::kRel.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool is_addr_rel() const noexcept { return addr_type() == AddrType::kRel; }
+
+ //! Sets the address type to \ref AddrType::kRel.
+ ASMJIT_INLINE_CONSTEXPR void set_addr_rel() noexcept { set_addr_type(AddrType::kRel); }
+
+ //! \}
+
+ //! \name Segment
+ //! \{
+
+ //! Tests whether the memory operand has a segment override.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_segment() const noexcept { return _signature.has_field<kSignatureMemSegmentMask>(); }
+
+ //! Returns the associated segment override as `SReg` operand.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR SReg segment() const noexcept { return SReg(segment_id()); }
+
+ //! Returns segment override register id, see `SReg::Id`.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t segment_id() const noexcept { return _signature.get_field<kSignatureMemSegmentMask>(); }
+
+ //! Sets the segment override to `seg`.
+ ASMJIT_INLINE_CONSTEXPR void set_segment(const SReg& seg) noexcept { set_segment(seg.id()); }
+
+ //! Sets the segment override to `id`.
+ ASMJIT_INLINE_CONSTEXPR void set_segment(uint32_t reg_id) noexcept { _signature.set_field<kSignatureMemSegmentMask>(reg_id); }
+
+ //! Resets the segment override.
+ ASMJIT_INLINE_CONSTEXPR void reset_segment() noexcept { _signature.set_field<kSignatureMemSegmentMask>(0); }
+
+ //! \}
+
+ //! \name Shift
+ //! \{
+
+ //! Tests whether the memory operand has shift (aka scale) value.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_shift() const noexcept { return _signature.has_field<kSignatureMemShiftValueMask>(); }
+
+ //! Returns the memory operand's shift (aka scale) value.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR uint32_t shift() const noexcept { return _signature.get_field<kSignatureMemShiftValueMask>(); }
+
+ //! Sets the memory operand's shift (aka scale) value.
+ ASMJIT_INLINE_CONSTEXPR void set_shift(uint32_t shift) noexcept { _signature.set_field<kSignatureMemShiftValueMask>(shift); }
+
+ //! Resets the memory operand's shift (aka scale) value to zero.
+ ASMJIT_INLINE_CONSTEXPR void reset_shift() noexcept { _signature.set_field<kSignatureMemShiftValueMask>(0); }
+
+ //! \}
+
+ //! \name Broadcast
+ //! \{
+
+ //! Tests whether the memory operand has broadcast {1tox}.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR bool has_broadcast() const noexcept { return _signature.has_field<kSignatureMemBroadcastMask>(); }
+
+ //! Returns the memory operand's broadcast.
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Broadcast get_broadcast() const noexcept { return (Broadcast)_signature.get_field<kSignatureMemBroadcastMask>(); }
+
+ //! Sets the memory operand's broadcast.
+ ASMJIT_INLINE_CONSTEXPR void set_broadcast(Broadcast b) noexcept { _signature.set_field<kSignatureMemBroadcastMask>(uint32_t(b)); }
+
+ //! Resets the memory operand's broadcast to none.
+ ASMJIT_INLINE_CONSTEXPR void reset_broadcast() noexcept { _signature.set_field<kSignatureMemBroadcastMask>(0); }
+
+ //! Returns a new `Mem` without a broadcast (the possible broadcast is cleared).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to1() const noexcept { return clone_broadcasted(Broadcast::kNone); }
+
+ //! Returns a new `Mem` with {1to2} broadcast (AVX-512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to2() const noexcept { return clone_broadcasted(Broadcast::k1To2); }
+
+ //! Returns a new `Mem` with {1to4} broadcast (AVX-512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to4() const noexcept { return clone_broadcasted(Broadcast::k1To4); }
+
+ //! Returns a new `Mem` with {1to8} broadcast (AVX-512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to8() const noexcept { return clone_broadcasted(Broadcast::k1To8); }
+
+ //! Returns a new `Mem` with {1to16} broadcast (AVX-512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to16() const noexcept { return clone_broadcasted(Broadcast::k1To16); }
+
+ //! Returns a new `Mem` with {1to32} broadcast (AVX-512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to32() const noexcept { return clone_broadcasted(Broadcast::k1To32); }
+
+ //! Returns a new `Mem` with {1to64} broadcast (AVX-512).
+ [[nodiscard]]
+ ASMJIT_INLINE_CONSTEXPR Mem _1to64() const noexcept { return clone_broadcasted(Broadcast::k1To64); }
+
+ //! \}
+};
+
+//! Creates `[base.reg + offset]` memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Gp& base, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(base, offset, size);
+}
+
+//! Creates `[base.reg + (index << shift) + offset]` memory operand (scalar index).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, offset, size);
+}
+
+//! Creates `[base.reg + (index << shift) + offset]` memory operand (vector index).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, offset, size);
+}
+
+//! Creates `[base + offset]` memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Label& base, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(base, offset, size);
+}
+
+//! Creates `[base + (index << shift) + offset]` memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, offset, size);
+}
+
+//! Creates `[base + (index << shift) + offset]` memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Label& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, offset, size);
+}
+
+//! Creates `[rip + offset]` memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(const Rip& rip_, int32_t offset = 0, uint32_t size = 0) noexcept {
+ return Mem(rip_, offset, size);
+}
+
+//! Creates `[base]` absolute memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(uint64_t base, uint32_t size = 0) noexcept {
+ return Mem(base, size);
+}
+
+//! Creates `[base + (index.reg << shift)]` absolute memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size);
+}
+
+//! Creates `[base + (index.reg << shift)]` absolute memory operand.
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size);
+}
+
+//! Creates `[base]` absolute memory operand (absolute).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_abs(uint64_t base, uint32_t size = 0) noexcept {
+ return Mem(base, size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
+}
+
+//! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_abs(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
+}
+
+//! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_abs(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
+}
+
+//! Creates `[base]` relative memory operand (relative).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_rel(uint64_t base, uint32_t size = 0) noexcept {
+ return Mem(base, size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
+}
+
+//! Creates `[base + (index.reg << shift)]` relative memory operand (relative).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_rel(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
+}
+
+//! Creates `[base + (index.reg << shift)]` relative memory operand (relative).
+[[nodiscard]]
+static ASMJIT_INLINE_CONSTEXPR Mem ptr_rel(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
+ return Mem(base, index, shift, size, OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
+}
+
+#define ASMJIT_MEM_PTR(func, size) \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ const Gp& base, int32_t offset = 0) noexcept \
+ { return Mem(base, offset, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept \
+ { return Mem(base, index, shift, offset, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) noexcept \
+ { return Mem(base, index, shift, offset, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ const Label& base, int32_t offset = 0) noexcept \
+ { return Mem(base, offset, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept \
+ { return Mem(base, index, shift, offset, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ const Rip& rip_, int32_t offset = 0) noexcept \
+ { return Mem(rip_, offset, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ uint64_t base) noexcept \
+ { return Mem(base, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \
+ { return Mem(base, index, shift, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func( \
+ uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \
+ { return Mem(base, index, shift, size); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func##_abs( \
+ uint64_t base) noexcept \
+ { return Mem(base, size, \
+ OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func##_abs( \
+ uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \
+ { return Mem(base, index, shift, size, \
+ OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func##_abs( \
+ uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \
+ { return Mem(base, index, shift, size, \
+ OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func##_rel( \
+ uint64_t base) noexcept \
+ { return Mem(base, size, \
+ OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func##_rel( \
+ uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \
+ { return Mem(base, index, shift, size, \
+ OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); } \
+ \
+ [[nodiscard]] \
+ static ASMJIT_INLINE_CONSTEXPR Mem func##_rel( \
+ uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \
+ { return Mem(base, index, shift, size, \
+ OperandSignature::from_value<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); }
+
+// Definition of memory operand constructors that use platform independent naming.
+ASMJIT_MEM_PTR(ptr_8, 1)
+ASMJIT_MEM_PTR(ptr_16, 2)
+ASMJIT_MEM_PTR(ptr_32, 4)
+ASMJIT_MEM_PTR(ptr_48, 6)
+ASMJIT_MEM_PTR(ptr_64, 8)
+ASMJIT_MEM_PTR(ptr_80, 10)
+ASMJIT_MEM_PTR(ptr_128, 16)
+ASMJIT_MEM_PTR(ptr_256, 32)
+ASMJIT_MEM_PTR(ptr_512, 64)
+
+// Definition of memory operand constructors that use X86-specific convention.
+ASMJIT_MEM_PTR(byte_ptr, 1)
+ASMJIT_MEM_PTR(word_ptr, 2)
+ASMJIT_MEM_PTR(dword_ptr, 4)
+ASMJIT_MEM_PTR(fword_ptr, 6)
+ASMJIT_MEM_PTR(qword_ptr, 8)
+ASMJIT_MEM_PTR(tbyte_ptr, 10)
+ASMJIT_MEM_PTR(tword_ptr, 10)
+ASMJIT_MEM_PTR(oword_ptr, 16)
+ASMJIT_MEM_PTR(dqword_ptr, 16)
+ASMJIT_MEM_PTR(qqword_ptr, 32)
+ASMJIT_MEM_PTR(xmmword_ptr, 16)
+ASMJIT_MEM_PTR(ymmword_ptr, 32)
+ASMJIT_MEM_PTR(zmmword_ptr, 64)
+
+#undef ASMJIT_MEM_PTR
+
+//! \}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // ASMJIT_X86_X86OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/asmjit/x86/x86rapass.cpp b/3rdparty/asmjit/asmjit/x86/x86rapass.cpp
new file mode 100644
index 00000000000..7110b45bbb6
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86rapass.cpp
@@ -0,0 +1,1653 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#include <asmjit/core/api-build_p.h>
+#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
+
+#include <asmjit/core/cpuinfo.h>
+#include <asmjit/core/formatter_p.h>
+#include <asmjit/core/type.h>
+#include <asmjit/support/support.h>
+#include <asmjit/x86/x86assembler.h>
+#include <asmjit/x86/x86compiler.h>
+#include <asmjit/x86/x86instapi_p.h>
+#include <asmjit/x86/x86instdb_p.h>
+#include <asmjit/x86/x86emithelper_p.h>
+#include <asmjit/x86/x86rapass_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+// x86::X86RAPass - Utilities
+// ==========================
+
+[[nodiscard]]
+static ASMJIT_INLINE uint64_t ra_imm_mask_from_size(uint32_t size) noexcept {
+ ASMJIT_ASSERT(size > 0 && size < 256);
+ static constexpr uint64_t masks[] = {
+ 0x00000000000000FFu, // 1
+ 0x000000000000FFFFu, // 2
+ 0x00000000FFFFFFFFu, // 4
+ 0xFFFFFFFFFFFFFFFFu, // 8
+ 0x0000000000000000u, // 16
+ 0x0000000000000000u, // 32
+ 0x0000000000000000u, // 64
+ 0x0000000000000000u, // 128
+ 0x0000000000000000u // 256
+ };
+ return masks[Support::ctz(size)];
+}
+
+static const RegMask ra_consecutive_lead_count_to_reg_mask_filter[5] = {
+ 0xFFFFFFFFu, // [0] No consecutive.
+ 0x00000000u, // [1] Invalid, never used.
+ 0x55555555u, // [2] Even registers.
+ 0x00000000u, // [3] Invalid, never used.
+ 0x11111111u // [4] Every fourth register.
+};
+
+[[nodiscard]]
+static ASMJIT_INLINE RATiedFlags ra_use_out_flags_from_rw_flags(OpRWFlags rw_flags) noexcept {
+ static constexpr RATiedFlags map[] = {
+ RATiedFlags::kNone,
+ RATiedFlags::kRead | RATiedFlags::kUse, // kRead
+ RATiedFlags::kWrite | RATiedFlags::kOut, // kWrite
+ RATiedFlags::kRW | RATiedFlags::kUse, // kRW
+ RATiedFlags::kNone,
+ RATiedFlags::kRead | RATiedFlags::kUse | RATiedFlags::kUseRM, // kRead | kRegMem
+ RATiedFlags::kWrite | RATiedFlags::kOut | RATiedFlags::kOutRM, // kWrite | kRegMem
+ RATiedFlags::kRW | RATiedFlags::kUse | RATiedFlags::kUseRM // kRW | kRegMem
+ };
+
+ return map[uint32_t(rw_flags & (OpRWFlags::kRW | OpRWFlags::kRegMem))];
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE RATiedFlags ra_reg_rw_flags(OpRWFlags flags) noexcept {
+ return (RATiedFlags)ra_use_out_flags_from_rw_flags(flags);
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE RATiedFlags ra_mem_base_rw_flags(OpRWFlags flags) noexcept {
+ constexpr uint32_t kShift = Support::ctz_const<OpRWFlags::kMemBaseRW>;
+ return (RATiedFlags)ra_use_out_flags_from_rw_flags(OpRWFlags(uint32_t(flags) >> kShift) & OpRWFlags::kRW);
+}
+
+[[nodiscard]]
+static ASMJIT_INLINE RATiedFlags ra_mem_index_rw_flags(OpRWFlags flags) noexcept {
+ constexpr uint32_t kShift = Support::ctz_const<OpRWFlags::kMemIndexRW>;
+ return (RATiedFlags)ra_use_out_flags_from_rw_flags(OpRWFlags(uint32_t(flags) >> kShift) & OpRWFlags::kRW);
+}
+
+// x86::RACFGBuilder
+// =================
+
+class RACFGBuilder : public RACFGBuilderT<RACFGBuilder> {
+public:
+ Arch _arch;
+ bool _is_64bit;
+ const EmitHelperInstructionIds& _ids;
+
+ ASMJIT_INLINE_NODEBUG RACFGBuilder(X86RAPass& pass) noexcept
+ : RACFGBuilderT<RACFGBuilder>(pass),
+ _arch(pass.cc().arch()),
+ _is_64bit(pass.register_size() == 8),
+ _ids(pass._emit_helper.ids()) {
+ }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG X86RAPass& pass() const noexcept { return static_cast<X86RAPass&>(_pass); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Compiler& cc() const noexcept { return static_cast<Compiler&>(_cc); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG const EmitHelperInstructionIds& ids() const noexcept { return _ids; }
+
+ [[nodiscard]]
+ Error on_instruction(InstNode* inst, InstControlFlow& cf, RAInstBuilder& ib) noexcept;
+
+ [[nodiscard]]
+ Error on_before_invoke(InvokeNode* invoke_node) noexcept;
+
+ [[nodiscard]]
+ Error on_invoke(InvokeNode* invoke_node, RAInstBuilder& ib) noexcept;
+
+ [[nodiscard]]
+ Error move_vec_to_ptr(InvokeNode* invoke_node, const FuncValue& arg, const Vec& src, Out<Reg> out) noexcept;
+
+ [[nodiscard]]
+ Error move_imm_to_reg_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_, Out<Reg> out) noexcept;
+
+ [[nodiscard]]
+ Error move_imm_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_) noexcept;
+
+ [[nodiscard]]
+ Error move_reg_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Reg& reg) noexcept;
+
+ [[nodiscard]]
+ Error on_before_ret(FuncRetNode* func_ret) noexcept;
+
+ [[nodiscard]]
+ Error on_ret(FuncRetNode* func_ret, RAInstBuilder& ib) noexcept;
+};
+
+// x86::RACFGBuilder - OnInst
+// ==========================
+
+Error RACFGBuilder::on_instruction(InstNode* inst, InstControlFlow& cf, RAInstBuilder& ib) noexcept {
+ InstId inst_id = inst->inst_id();
+ InstRWInfo rw_info;
+
+ if (Inst::is_defined_id(inst_id)) {
+ Span<const Operand> operands = inst->operands();
+ ASMJIT_PROPAGATE(InstInternal::query_rw_info(_arch, inst->baseInst(), operands.data(), operands.size(), &rw_info));
+
+ const InstDB::InstInfo& inst_info = InstDB::inst_info_by_id(inst_id);
+ bool has_gpb_hi_constraint = false;
+ size_t single_reg_ops = 0;
+
+ // Copy instruction RW flags to instruction builder except kMovOp, which is propagated manually later.
+ ib.add_inst_rw_flags(rw_info.inst_flags() & ~InstRWFlags::kMovOp);
+
+ // Mask of all operand types used by the instruction - can be used as an optimization later.
+ uint32_t op_types_mask = 0u;
+
+ if (!operands.is_empty()) {
+ // The mask is for all registers, but we are mostly interested in AVX-512 registers at the moment. The mask
+ // will be combined with all available registers of the Compiler at the end so we it never use more registers
+ // than available.
+ RegMask instruction_allowed_regs = 0xFFFFFFFFu;
+
+ uint32_t consecutive_offset = 0;
+ RAWorkId consecutive_lead_id = kBadWorkId;
+ RAWorkReg* consecutive_parent = nullptr;
+
+ if (inst_info.is_evex()) {
+ // EVEX instruction and VEX instructions that can be encoded with EVEX have the possibility to use 32 SIMD
+ // registers (XMM/YMM/ZMM).
+ if (inst_info.is_vex() && !inst_info.is_evex_compatible()) {
+ if (inst_info.is_evex_kreg_only()) {
+ // EVEX encodable only if the first operand is K register (compare instructions).
+ if (!operands[0].is_mask_reg()) {
+ instruction_allowed_regs = 0xFFFFu;
+ }
+ }
+ else if (inst_info.is_evex_two_op_only()) {
+ // EVEX encodable only if the instruction has two operands (gather instructions).
+ if (operands.size() != 2u) {
+ instruction_allowed_regs = 0xFFFFu;
+ }
+ }
+ else {
+ instruction_allowed_regs = 0xFFFFu;
+ }
+ }
+ }
+ else if (inst_info.is_evex_transformable()) {
+ ib.add_aggregated_flags(RATiedFlags::kInst_IsTransformable);
+ }
+ else {
+ // Not EVEX, restrict everything to [0-15] registers.
+ instruction_allowed_regs = 0xFFFFu;
+ }
+
+ for (size_t i = 0u; i < operands.size(); i++) {
+ const Operand& op = operands[i];
+ const OpRWInfo& op_rw_info = rw_info.operand(i);
+
+ op_types_mask |= 1u << uint32_t(op.op_type());
+
+ if (op.is_reg()) {
+ // Register Operand
+ // ----------------
+ const Reg& reg = op.as<Reg>();
+
+ RATiedFlags flags = ra_reg_rw_flags(op_rw_info.op_flags());
+ RegMask allowed_regs = instruction_allowed_regs;
+
+ if (op_rw_info.is_unique()) {
+ flags |= RATiedFlags::kUnique;
+ }
+
+ // X86-specific constraints related to LO|HI general purpose registers. This is only required when the
+ // register is part of the encoding. If the register is fixed we won't restrict anything as it doesn't
+ // restrict encoding of other registers.
+ if (reg.is_gp8() && !op_rw_info.has_op_flag(OpRWFlags::kRegPhysId)) {
+ flags |= RATiedFlags::kX86_Gpb;
+ if (!_is_64bit) {
+ // Restrict to first four - AL|AH|BL|BH|CL|CH|DL|DH. In 32-bit mode it's not possible to access
+ // SIL|DIL, etc, so this is just enough.
+ allowed_regs = 0x0Fu;
+ }
+ else {
+ // If we encountered GPB-HI register the situation is much more complicated than in 32-bit mode.
+ // We need to patch all registers to not use ID higher than 7 and all GPB-LO registers to not use
+ // index higher than 3. Instead of doing the patching here we just set a flag and will do it later,
+ // to not complicate this loop.
+ if (reg.is_gp8_hi()) {
+ has_gpb_hi_constraint = true;
+ allowed_regs = 0x0Fu;
+ }
+ }
+ }
+
+ uint32_t virt_index = Operand::virt_id_to_index(reg.id());
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ // Use RW instead of Write in case that not the whole register is overwritten. This is important
+ // for liveness as we cannot kill a register that will be used. For example `mov al, 0xFF` is not
+ // a write-only operation if user allocated the whole `rax` register.
+ if ((flags & RATiedFlags::kRW) == RATiedFlags::kWrite) {
+ if (work_reg->reg_byte_mask() & ~(op_rw_info.write_byte_mask() | op_rw_info.extend_byte_mask())) {
+ // Not write-only operation.
+ flags = (flags & ~RATiedFlags::kOut) | (RATiedFlags::kRead | RATiedFlags::kUse);
+ }
+ }
+
+ // Do not use RegMem flag if changing Reg to Mem requires a CPU feature that is not available.
+ if (rw_info.rm_feature() && Support::test(flags, RATiedFlags::kUseRM | RATiedFlags::kOutRM)) {
+ if (!cc().code()->cpu_features().has(rw_info.rm_feature())) {
+ flags &= ~(RATiedFlags::kUseRM | RATiedFlags::kOutRM);
+ }
+ }
+
+ RegGroup group = work_reg->group();
+ RegMask use_regs = _pass._available_regs[group] & allowed_regs;
+ RegMask out_regs = use_regs;
+
+ uint32_t use_id = Reg::kIdBad;
+ uint32_t out_id = Reg::kIdBad;
+
+ uint32_t use_rewrite_mask = 0;
+ uint32_t out_rewrite_mask = 0;
+
+ if (op_rw_info.consecutive_lead_count()) {
+ // There must be a single consecutive register lead, otherwise the RW data is invalid.
+ if (consecutive_lead_id != kBadWorkId) {
+ return make_error(Error::kInvalidState);
+ }
+
+ // A consecutive lead register cannot be used as a consecutive +1/+2/+3 register, the registers must be distinct.
+ if (RATiedReg::consecutive_data_from_flags(flags) != 0) {
+ return make_error(Error::kNotConsecutiveRegs);
+ }
+
+ flags |= RATiedFlags::kLeadConsecutive | RATiedReg::consecutive_data_to_flags(op_rw_info.consecutive_lead_count() - 1);
+ consecutive_lead_id = work_reg->work_id();
+
+ RegMask filter = ra_consecutive_lead_count_to_reg_mask_filter[op_rw_info.consecutive_lead_count()];
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ flags |= RATiedFlags::kUseConsecutive;
+ use_regs &= filter;
+ }
+ else {
+ flags |= RATiedFlags::kOutConsecutive;
+ out_regs &= filter;
+ }
+ }
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&reg._base_id));
+ if (op_rw_info.has_op_flag(OpRWFlags::kRegPhysId)) {
+ use_id = op_rw_info.phys_id();
+ flags |= RATiedFlags::kUseFixed;
+ }
+ else if (op_rw_info.has_op_flag(OpRWFlags::kConsecutive)) {
+ if (consecutive_lead_id == kBadWorkId) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (consecutive_lead_id == work_reg->work_id()) {
+ return make_error(Error::kOverlappedRegs);
+ }
+
+ flags |= RATiedFlags::kUseConsecutive | RATiedReg::consecutive_data_to_flags(++consecutive_offset);
+ }
+ }
+ else {
+ out_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&reg._base_id));
+ if (op_rw_info.has_op_flag(OpRWFlags::kRegPhysId)) {
+ out_id = op_rw_info.phys_id();
+ flags |= RATiedFlags::kOutFixed;
+ }
+ else if (op_rw_info.has_op_flag(OpRWFlags::kConsecutive)) {
+ if (consecutive_lead_id == kBadWorkId) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (consecutive_lead_id == work_reg->work_id()) {
+ return make_error(Error::kOverlappedRegs);
+ }
+
+ flags |= RATiedFlags::kOutConsecutive | RATiedReg::consecutive_data_to_flags(++consecutive_offset);
+ }
+ }
+
+ ASMJIT_PROPAGATE(ib.add(work_reg, flags, use_regs, use_id, use_rewrite_mask, out_regs, out_id, out_rewrite_mask, op_rw_info.rm_size(), consecutive_parent));
+ if (single_reg_ops == i) {
+ single_reg_ops++;
+ }
+
+ if (Support::test(flags, RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive)) {
+ consecutive_parent = work_reg;
+ }
+ }
+ }
+ else if (op.is_mem()) {
+ // Memory Operand
+ // --------------
+ const Mem& mem = op.as<Mem>();
+ ib.add_forbidden_flags(RATiedFlags::kUseRM | RATiedFlags::kOutRM);
+
+ if (mem.is_reg_home()) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(mem.base_id())));
+ if (ASMJIT_UNLIKELY(!_pass.get_or_create_stack_slot(work_reg))) {
+ return make_error(Error::kOutOfMemory);
+ }
+ }
+ else if (mem.has_base_reg()) {
+ uint32_t virt_index = Operand::virt_id_to_index(mem.base_id());
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RATiedFlags flags = ra_mem_base_rw_flags(op_rw_info.op_flags());
+ RegGroup group = work_reg->group();
+ RegMask in_out_regs = _pass._available_regs[group];
+
+ uint32_t use_id = Reg::kIdBad;
+ uint32_t out_id = Reg::kIdBad;
+
+ uint32_t use_rewrite_mask = 0;
+ uint32_t out_rewrite_mask = 0;
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._base_id));
+ if (op_rw_info.has_op_flag(OpRWFlags::kMemPhysId)) {
+ use_id = op_rw_info.phys_id();
+ flags |= RATiedFlags::kUseFixed;
+ }
+ }
+ else {
+ out_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._base_id));
+ if (op_rw_info.has_op_flag(OpRWFlags::kMemPhysId)) {
+ out_id = op_rw_info.phys_id();
+ flags |= RATiedFlags::kOutFixed;
+ }
+ }
+
+ ASMJIT_PROPAGATE(ib.add(work_reg, flags, in_out_regs, use_id, use_rewrite_mask, in_out_regs, out_id, out_rewrite_mask));
+ }
+ }
+
+ if (mem.has_index_reg()) {
+ uint32_t virt_index = Operand::virt_id_to_index(mem.index_id());
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RATiedFlags flags = ra_mem_index_rw_flags(op_rw_info.op_flags());
+ RegGroup group = work_reg->group();
+ RegMask in_out_regs = _pass._available_regs[group] & instruction_allowed_regs;
+
+ // Index registers have never fixed id on X86/x64.
+ const uint32_t use_id = Reg::kIdBad;
+ const uint32_t out_id = Reg::kIdBad;
+
+ uint32_t use_rewrite_mask = 0;
+ uint32_t out_rewrite_mask = 0;
+
+ if (Support::test(flags, RATiedFlags::kUse)) {
+ use_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._data[Operand::kDataMemIndexId]));
+ }
+ else {
+ out_rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&mem._data[Operand::kDataMemIndexId]));
+ }
+
+ ASMJIT_PROPAGATE(ib.add(work_reg, RATiedFlags::kUse | RATiedFlags::kRead, in_out_regs, use_id, use_rewrite_mask, in_out_regs, out_id, out_rewrite_mask));
+ }
+ }
+ }
+ }
+ }
+
+ // Handle extra operand (either REP {cx|ecx|rcx} or AVX-512 {k} selector).
+ if (inst->has_extra_reg()) {
+ uint32_t virt_index = Operand::virt_id_to_index(inst->extra_reg().id());
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RegGroup group = work_reg->group();
+ RegMask in_out_regs = _pass._available_regs[group];
+ uint32_t rewrite_mask = Support::bit_mask<uint32_t>(inst->_get_rewrite_index(&inst->extra_reg()._id));
+
+ if (group == RegGroup::kMask) {
+ // AVX-512 mask selector {k} register - read-only, allocable to any register except {k0}.
+ ASMJIT_PROPAGATE(ib.add(work_reg, RATiedFlags::kUse | RATiedFlags::kRead, in_out_regs, Reg::kIdBad, rewrite_mask, in_out_regs, Reg::kIdBad, 0));
+ single_reg_ops = 0u;
+ }
+ else {
+ // REP {cx|ecx|rcx} register - read & write, allocable to {cx|ecx|rcx} only.
+ ASMJIT_PROPAGATE(ib.add(work_reg, RATiedFlags::kUse | RATiedFlags::kRW, in_out_regs, Gp::kIdCx, rewrite_mask, in_out_regs, Gp::kIdBad, 0));
+ }
+ }
+ else {
+ RegGroup group = inst->extra_reg().group();
+ if (group == RegGroup::kMask && inst->extra_reg().id() != 0) {
+ single_reg_ops = 0u;
+ }
+ }
+ }
+
+ // If this instruction has move semantics then check whether it could be eliminated if all virtual registers
+ // are allocated into the same register. Take into account the virtual size of the destination register as that's
+ // more important than a physical register size in this case.
+ if (rw_info.has_inst_flag(InstRWFlags::kMovOp) && !inst->has_extra_reg() && Support::bit_test(op_types_mask, uint32_t(OperandType::kReg))) {
+ // AVX+ move instructions have 3 operand form - the first two operands must be the same to guarantee move semantics.
+ if (operands.size() == 2 || (operands.size() == 3 && operands[0] == operands[1])) {
+ uint32_t virt_index = Operand::virt_id_to_index(operands.first().as<Reg>().id());
+ if (virt_index < Operand::kVirtIdCount) {
+ const VirtReg* virt_reg = _cc.virt_reg_by_index(virt_index);
+ const OpRWInfo& op_rw_info = rw_info.operand(0);
+
+ uint64_t remaining_byte_mask = virt_reg->work_reg()->reg_byte_mask() & ~op_rw_info.write_byte_mask();
+ if (remaining_byte_mask == 0u || (remaining_byte_mask & op_rw_info.extend_byte_mask()) == 0) {
+ ib.add_inst_rw_flags(InstRWFlags::kMovOp);
+ }
+ }
+ }
+ }
+
+ // Handle X86 constraints.
+ if (has_gpb_hi_constraint) {
+ for (RATiedReg& tied_reg : ib) {
+ RegMask filter = tied_reg.has_flag(RATiedFlags::kX86_Gpb) ? 0x0Fu : 0xFFu;
+ tied_reg._use_reg_mask &= filter;
+ tied_reg._out_reg_mask &= filter;
+ }
+ }
+
+ if (ib.tied_reg_count() == 1) {
+ // Handle special cases of some instructions where all operands share the same
+ // register. In such case the single operand becomes read-only or write-only.
+ InstSameRegHint same_reg_hint = InstSameRegHint::kNone;
+ if (single_reg_ops == operands.size()) {
+ same_reg_hint = inst_info.same_reg_hint();
+ }
+ else if (operands.size() == 2 && operands[1].is_imm()) {
+ // Handle some tricks used by X86 asm.
+ const Reg& reg = operands[0].as<Reg>();
+ const Imm& imm = operands[1].as<Imm>();
+
+ const RAWorkReg* work_reg = ib[0]->work_reg();
+ uint32_t work_reg_size = work_reg->signature().size();
+
+ switch (inst->inst_id()) {
+ case Inst::kIdOr: {
+ // Sets the value of the destination register to -1, previous content unused.
+ if (reg.size() >= 4 || reg.size() >= work_reg_size) {
+ if (imm.value() == -1 || imm.value_as<uint64_t>() == ra_imm_mask_from_size(reg.size())) {
+ same_reg_hint = InstSameRegHint::kWO;
+ }
+ }
+ [[fallthrough]];
+ }
+
+ case Inst::kIdAdd:
+ case Inst::kIdAnd:
+ case Inst::kIdRol:
+ case Inst::kIdRor:
+ case Inst::kIdSar:
+ case Inst::kIdShl:
+ case Inst::kIdShr:
+ case Inst::kIdSub:
+ case Inst::kIdXor: {
+ // Updates [E|R]FLAGS without changing the content.
+ if (reg.size() != 4 || reg.size() >= work_reg_size) {
+ if (imm.value() == 0) {
+ same_reg_hint = InstSameRegHint::kRO;
+ }
+ }
+ break;
+ }
+ }
+ }
+ else if (operands.size() == 4u && operands[3].is_imm()) {
+ const Imm& imm = operands[3].as<Imm>();
+
+ switch (inst->inst_id()) {
+ case Inst::kIdVpternlogd:
+ case Inst::kIdVpternlogq: {
+ uint32_t predicate = uint32_t(imm.value() & 0xFFu);
+ if (predicate == 0x00u || predicate == 0xFFu) {
+ ib[0]->make_write_only();
+ }
+ break;
+ }
+ }
+ }
+
+ switch (same_reg_hint) {
+ case InstSameRegHint::kNone:
+ break;
+ case InstSameRegHint::kRO:
+ ib[0]->make_read_only();
+ break;
+ case InstSameRegHint::kWO:
+ ib[0]->make_write_only();
+ break;
+ }
+ }
+
+ cf = inst_info.control_flow();
+ }
+
+ return Error::kOk;
+}
+
+// x86::RACFGBuilder - OnInvoke
+// ============================
+
+Error RACFGBuilder::on_before_invoke(InvokeNode* invoke_node) noexcept {
+ const FuncDetail& fd = invoke_node->detail();
+ uint32_t arg_count = invoke_node->arg_count();
+
+ cc().set_cursor(invoke_node->prev());
+ RegType native_reg_type = cc()._gp_signature.reg_type();
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ const FuncValuePack& arg_pack = fd.arg_pack(arg_index);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ if (!arg_pack[value_index]) {
+ break;
+ }
+
+ const FuncValue& arg = arg_pack[value_index];
+ const Operand& op = invoke_node->arg(arg_index, value_index);
+
+ if (op.is_none()) {
+ continue;
+ }
+
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (arg.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup arg_group = RegUtils::group_of(arg.reg_type());
+
+ if (arg.is_indirect()) {
+ if (reg.is_gp()) {
+ if (reg.reg_type() != native_reg_type) {
+ return make_error(Error::kInvalidAssignment);
+ }
+ // It's considered allocated if this is an indirect argument and the user used GP.
+ continue;
+ }
+
+ Reg indirect_reg;
+ ASMJIT_PROPAGATE(move_vec_to_ptr(invoke_node, arg, reg.as<Vec>(), Out(indirect_reg)));
+ invoke_node->_args[arg_index][value_index] = indirect_reg;
+ }
+ else {
+ if (reg_group != arg_group) {
+ // TODO: Conversion is not supported.
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ }
+ else {
+ if (arg.is_indirect()) {
+ if (reg.is_gp()) {
+ if (reg.reg_type() != native_reg_type) {
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ ASMJIT_PROPAGATE(move_reg_to_stack_arg(invoke_node, arg, reg));
+ continue;
+ }
+
+ Reg indirect_reg;
+ ASMJIT_PROPAGATE(move_vec_to_ptr(invoke_node, arg, reg.as<Vec>(), Out(indirect_reg)));
+ ASMJIT_PROPAGATE(move_reg_to_stack_arg(invoke_node, arg, indirect_reg));
+ }
+ else {
+ ASMJIT_PROPAGATE(move_reg_to_stack_arg(invoke_node, arg, reg));
+ }
+ }
+ }
+ else if (op.is_imm()) {
+ if (arg.is_reg()) {
+ Reg reg;
+ ASMJIT_PROPAGATE(move_imm_to_reg_arg(invoke_node, arg, op.as<Imm>(), Out(reg)));
+ invoke_node->_args[arg_index][value_index] = reg;
+ }
+ else {
+ ASMJIT_PROPAGATE(move_imm_to_stack_arg(invoke_node, arg, op.as<Imm>()));
+ }
+ }
+ }
+ }
+
+ cc().set_cursor(invoke_node);
+ if (fd.has_flag(CallConvFlags::kCalleePopsStack) && fd.arg_stack_size() != 0) {
+ ASMJIT_PROPAGATE(cc().sub(cc().zsp(), fd.arg_stack_size()));
+ }
+
+ if (fd.has_ret()) {
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ const FuncValue& ret = fd.ret(value_index);
+ if (!ret) {
+ break;
+ }
+
+ const Operand& op = invoke_node->ret(value_index);
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (ret.is_reg()) {
+ if (ret.reg_type() == RegType::kX86_St) {
+ if (work_reg->group() != RegGroup::kVec) {
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ Reg dst(work_reg->signature(), work_reg->virt_id());
+ Mem mem;
+
+ TypeId type_id = TypeUtils::scalar_of(work_reg->type_id());
+ if (ret.has_type_id()) {
+ type_id = ret.type_id();
+ }
+
+ switch (type_id) {
+ case TypeId::kFloat32:
+ ASMJIT_PROPAGATE(_pass.use_temporary_mem(mem, 4, 4));
+ mem.set_size(4);
+ ASMJIT_PROPAGATE(cc().fstp(mem));
+ ASMJIT_PROPAGATE(cc().emit(ids().movss(), dst.as<Vec>(), mem));
+ break;
+
+ case TypeId::kFloat64:
+ ASMJIT_PROPAGATE(_pass.use_temporary_mem(mem, 8, 4));
+ mem.set_size(8);
+ ASMJIT_PROPAGATE(cc().fstp(mem));
+ ASMJIT_PROPAGATE(cc().emit(ids().movsd(), dst.as<Vec>(), mem));
+ break;
+
+ default:
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ else {
+ RegGroup reg_group = work_reg->group();
+ RegGroup ret_group = RegUtils::group_of(ret.reg_type());
+
+ if (reg_group != ret_group) {
+ // TODO: Conversion is not supported.
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // This block has function call(s).
+ _cur_block->add_flags(RABlockFlags::kHasFuncCalls);
+ _pass.func()->frame().add_attributes(FuncAttributes::kHasFuncCalls);
+ _pass.func()->frame().update_call_stack_size(fd.arg_stack_size());
+
+ return Error::kOk;
+}
+
+Error RACFGBuilder::on_invoke(InvokeNode* invoke_node, RAInstBuilder& ib) noexcept {
+ uint32_t arg_count = invoke_node->arg_count();
+ const FuncDetail& fd = invoke_node->detail();
+
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ const FuncValuePack& arg_pack = fd.arg_pack(arg_index);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ if (!arg_pack[value_index]) {
+ continue;
+ }
+
+ const FuncValue& arg = arg_pack[value_index];
+ const Operand& op = invoke_node->arg(arg_index, value_index);
+
+ if (op.is_none()) {
+ continue;
+ }
+
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (arg.is_indirect()) {
+ RegGroup reg_group = work_reg->group();
+ if (reg_group != RegGroup::kGp) {
+ return make_error(Error::kInvalidState);
+ }
+ ASMJIT_PROPAGATE(ib.add_call_arg(work_reg, arg.reg_id()));
+ }
+ else if (arg.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup arg_group = RegUtils::group_of(arg.reg_type());
+
+ if (reg_group == arg_group) {
+ ASMJIT_PROPAGATE(ib.add_call_arg(work_reg, arg.reg_id()));
+ }
+ }
+ }
+ }
+ }
+
+ for (uint32_t ret_index = 0; ret_index < Globals::kMaxValuePack; ret_index++) {
+ const FuncValue& ret = fd.ret(ret_index);
+ if (!ret) {
+ break;
+ }
+
+ // Not handled here...
+ const Operand& op = invoke_node->ret(ret_index);
+ if (ret.reg_type() == RegType::kX86_St) {
+ continue;
+ }
+
+ if (op.is_reg()) {
+ const Reg& reg = op.as<Reg>();
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, Operand::virt_id_to_index(reg.id())));
+
+ if (ret.is_reg()) {
+ RegGroup reg_group = work_reg->group();
+ RegGroup ret_group = RegUtils::group_of(ret.reg_type());
+
+ if (reg_group == ret_group) {
+ ASMJIT_PROPAGATE(ib.add_call_ret(work_reg, ret.reg_id()));
+ }
+ }
+ else {
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ }
+
+ // Setup clobbered registers.
+ for (RegGroup group : Support::enumerate(RegGroup::kMaxVirt)) {
+ ib._clobbered[group] = Support::lsb_mask<RegMask>(_pass._phys_reg_count.get(group)) & ~fd.preserved_regs(group);
+ }
+
+ return Error::kOk;
+}
+
+// x86::RACFGBuilder - MoveVecToPtr
+// ================================
+
+static inline OperandSignature vec_reg_signature_by_size(uint32_t size) noexcept {
+ return OperandSignature{
+ size >= 64 ? RegTraits<RegType::kVec512>::kSignature :
+ size >= 32 ? RegTraits<RegType::kVec256>::kSignature :
+ RegTraits<RegType::kVec128>::kSignature
+ };
+}
+
+Error RACFGBuilder::move_vec_to_ptr(InvokeNode* invoke_node, const FuncValue& arg, const Vec& src, Out<Reg> out) noexcept {
+ Support::maybe_unused(invoke_node);
+ ASMJIT_ASSERT(arg.is_reg());
+
+ uint32_t arg_size = TypeUtils::size_of(arg.type_id());
+ if (arg_size == 0) {
+ return make_error(Error::kInvalidState);
+ }
+
+ if (arg_size < 16) {
+ arg_size = 16;
+ }
+
+ uint32_t arg_stack_offset = Support::align_up(invoke_node->detail()._arg_stack_size, arg_size);
+ _func_node->frame().update_call_stack_alignment(arg_size);
+ invoke_node->detail()._arg_stack_size = arg_stack_offset + arg_size;
+
+ Vec vec_reg(vec_reg_signature_by_size(arg_size), src.id());
+ Mem vec_ptr = ptr(_pass._sp.as<Gp>(), int32_t(arg_stack_offset));
+
+ uint32_t vec_mov_inst_id = pass()._emit_helper.ids().movaps();
+ if (arg_size > 16) {
+ vec_mov_inst_id = Inst::kIdVmovaps;
+ }
+
+ ASMJIT_PROPAGATE(cc()._new_reg(out, RegUtils::type_id_of(cc()._gp_signature.reg_type()), nullptr));
+
+ VirtReg* virt_reg = cc().virt_reg_by_id(out->id());
+ virt_reg->set_weight(BaseRAPass::kCallArgWeight);
+
+ ASMJIT_PROPAGATE(cc().lea(out->as<Gp>(), vec_ptr));
+ ASMJIT_PROPAGATE(cc().emit(vec_mov_inst_id, ptr(out->as<Gp>()), vec_reg));
+
+ if (arg.is_stack()) {
+ Mem stack_ptr = ptr(_pass._sp.as<Gp>(), arg.stack_offset());
+ ASMJIT_PROPAGATE(cc().mov(stack_ptr, out->as<Gp>()));
+ }
+
+ return Error::kOk;
+}
+
+// x86::RACFGBuilder - Move Imm to Reg Arg
+// =======================================
+
+Error RACFGBuilder::move_imm_to_reg_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_, Out<Reg> out) noexcept {
+ Support::maybe_unused(invoke_node);
+ ASMJIT_ASSERT(arg.is_reg());
+
+ Imm imm(imm_);
+ TypeId reg_type_id = TypeId::kUInt32;
+
+ switch (arg.type_id()) {
+ case TypeId::kInt8: imm.sign_extend_int8(); goto MovU32;
+ case TypeId::kUInt8: imm.zero_extend_uint8(); goto MovU32;
+ case TypeId::kInt16: imm.sign_extend_int16(); goto MovU32;
+ case TypeId::kUInt16: imm.zero_extend_uint16(); goto MovU32;
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+MovU32:
+ imm.zero_extend_uint32();
+ break;
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ // Moving to GPD automatically zero extends in 64-bit mode.
+ if (imm.is_uint32()) {
+ imm.zero_extend_uint32();
+ break;
+ }
+
+ reg_type_id = TypeId::kUInt64;
+ break;
+
+ default:
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ ASMJIT_PROPAGATE(cc()._new_reg(out, reg_type_id, nullptr));
+ cc().virt_reg_by_id(out->id())->set_weight(BaseRAPass::kCallArgWeight);
+
+ return cc().mov(out->as<x86::Gp>(), imm);
+}
+
+// x86::RACFGBuilder - Move Imm to Stack Arg
+// =========================================
+
+Error RACFGBuilder::move_imm_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Imm& imm_) noexcept {
+ Support::maybe_unused(invoke_node);
+ ASMJIT_ASSERT(arg.is_stack());
+
+ Mem stack_ptr = ptr(_pass._sp.as<Gp>(), arg.stack_offset());
+ Imm imm[2];
+
+ stack_ptr.set_size(4);
+ imm[0] = imm_;
+ uint32_t mov_count = 0;
+
+ // One stack entry has the same size as the native register size. That means that if we want to move a 32-bit
+ // integer on the stack in 64-bit mode, we need to extend it to a 64-bit integer first. In 32-bit mode, pushing
+ // a 64-bit on stack is done in two steps by pushing low and high parts separately.
+ switch (arg.type_id()) {
+ case TypeId::kInt8: imm[0].sign_extend_int8(); goto MovU32;
+ case TypeId::kUInt8: imm[0].zero_extend_uint8(); goto MovU32;
+ case TypeId::kInt16: imm[0].sign_extend_int16(); goto MovU32;
+ case TypeId::kUInt16: imm[0].zero_extend_uint16(); goto MovU32;
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kFloat32:
+MovU32:
+ imm[0].zero_extend_uint32();
+ mov_count = 1;
+ break;
+
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ case TypeId::kFloat64:
+ case TypeId::kMmx32:
+ case TypeId::kMmx64:
+ if (_is_64bit && imm[0].is_int32()) {
+ stack_ptr.set_size(8);
+ mov_count = 1;
+ break;
+ }
+
+ imm[1].set_value(imm[0].uint_hi32());
+ imm[0].zero_extend_uint32();
+ mov_count = 2;
+ break;
+
+ default:
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ for (uint32_t i = 0; i < mov_count; i++) {
+ ASMJIT_PROPAGATE(cc().mov(stack_ptr, imm[i]));
+ stack_ptr.add_offset_lo32(int32_t(stack_ptr.size()));
+ }
+
+ return Error::kOk;
+}
+
+// x86::RACFGBuilder - MoveRegToStackArg
+// =====================================
+
+Error RACFGBuilder::move_reg_to_stack_arg(InvokeNode* invoke_node, const FuncValue& arg, const Reg& reg) noexcept {
+ Support::maybe_unused(invoke_node);
+ ASMJIT_ASSERT(arg.is_stack());
+
+ Mem stack_ptr = ptr(_pass._sp.as<Gp>(), arg.stack_offset());
+ Reg r0, r1;
+
+ VirtReg* vr = cc().virt_reg_by_id(reg.id());
+ uint32_t register_size = cc().register_size();
+ InstId inst_id = 0;
+
+ TypeId dst_type_id = arg.type_id();
+ TypeId src_type_id = vr->type_id();
+
+ switch (dst_type_id) {
+ case TypeId::kInt64:
+ case TypeId::kUInt64:
+ // Extend BYTE->QWORD (GP).
+ if (TypeUtils::is_gp8(src_type_id)) {
+ r1.set_reg_t<RegType::kGp8Lo>(reg.id());
+
+ inst_id = (dst_type_id == TypeId::kInt64 && src_type_id == TypeId::kInt8) ? Inst::kIdMovsx : Inst::kIdMovzx;
+ goto ExtendMovGpXQ;
+ }
+
+ // Extend WORD->QWORD (GP).
+ if (TypeUtils::is_gp16(src_type_id)) {
+ r1.set_reg_t<RegType::kGp16>(reg.id());
+
+ inst_id = (dst_type_id == TypeId::kInt64 && src_type_id == TypeId::kInt16) ? Inst::kIdMovsx : Inst::kIdMovzx;
+ goto ExtendMovGpXQ;
+ }
+
+ // Extend DWORD->QWORD (GP).
+ if (TypeUtils::is_gp32(src_type_id)) {
+ r1.set_reg_t<RegType::kGp32>(reg.id());
+
+ inst_id = Inst::kIdMovsxd;
+ if (dst_type_id == TypeId::kInt64 && src_type_id == TypeId::kInt32) {
+ goto ExtendMovGpXQ;
+ }
+ else {
+ goto ZeroExtendGpDQ;
+ }
+ }
+
+ // Move QWORD (GP).
+ if (TypeUtils::is_gp64(src_type_id)) goto MovGpQ;
+ if (TypeUtils::is_mmx(src_type_id)) goto MovMmQ;
+ if (TypeUtils::is_vec(src_type_id)) goto MovXmmQ;
+ break;
+
+ case TypeId::kInt32:
+ case TypeId::kUInt32:
+ case TypeId::kInt16:
+ case TypeId::kUInt16:
+ // DWORD <- WORD (Zero|Sign Extend).
+ if (TypeUtils::is_gp16(src_type_id)) {
+ bool is_dst_signed = dst_type_id == TypeId::kInt16 || dst_type_id == TypeId::kInt32;
+ bool is_src_signed = src_type_id == TypeId::kInt8 || src_type_id == TypeId::kInt16;
+
+ r1.set_reg_t<RegType::kGp16>(reg.id());
+ inst_id = is_dst_signed && is_src_signed ? Inst::kIdMovsx : Inst::kIdMovzx;
+ goto ExtendMovGpD;
+ }
+
+ // DWORD <- BYTE (Zero|Sign Extend).
+ if (TypeUtils::is_gp8(src_type_id)) {
+ bool is_dst_signed = dst_type_id == TypeId::kInt16 || dst_type_id == TypeId::kInt32;
+ bool is_src_signed = src_type_id == TypeId::kInt8 || src_type_id == TypeId::kInt16;
+
+ r1.set_reg_t<RegType::kGp8Lo>(reg.id());
+ inst_id = is_dst_signed && is_src_signed ? Inst::kIdMovsx : Inst::kIdMovzx;
+ goto ExtendMovGpD;
+ }
+ [[fallthrough]];
+
+ case TypeId::kInt8:
+ case TypeId::kUInt8:
+ if (TypeUtils::is_int(src_type_id)) goto MovGpD;
+ if (TypeUtils::is_mmx(src_type_id)) goto MovMmD;
+ if (TypeUtils::is_vec(src_type_id)) goto MovXmmD;
+ break;
+
+ case TypeId::kMmx32:
+ case TypeId::kMmx64:
+ // Extend BYTE->QWORD (GP).
+ if (TypeUtils::is_gp8(src_type_id)) {
+ r1.set_reg_t<RegType::kGp8Lo>(reg.id());
+
+ inst_id = Inst::kIdMovzx;
+ goto ExtendMovGpXQ;
+ }
+
+ // Extend WORD->QWORD (GP).
+ if (TypeUtils::is_gp16(src_type_id)) {
+ r1.set_reg_t<RegType::kGp16>(reg.id());
+
+ inst_id = Inst::kIdMovzx;
+ goto ExtendMovGpXQ;
+ }
+
+ if (TypeUtils::is_gp32(src_type_id)) goto ExtendMovGpDQ;
+ if (TypeUtils::is_gp64(src_type_id)) goto MovGpQ;
+ if (TypeUtils::is_mmx(src_type_id)) goto MovMmQ;
+ if (TypeUtils::is_vec(src_type_id)) goto MovXmmQ;
+ break;
+
+ case TypeId::kFloat32:
+ case TypeId::kFloat32x1:
+ if (TypeUtils::is_vec(src_type_id)) goto MovXmmD;
+ break;
+
+ case TypeId::kFloat64:
+ case TypeId::kFloat64x1:
+ if (TypeUtils::is_vec(src_type_id)) goto MovXmmQ;
+ break;
+
+ default:
+ if (TypeUtils::is_vec(dst_type_id) && reg.as<Reg>().is_vec()) {
+ stack_ptr.set_size(TypeUtils::size_of(dst_type_id));
+ uint32_t vec_mov_inst_id = pass()._emit_helper.ids().movaps();
+
+ if (TypeUtils::is_vec128(dst_type_id)) {
+ r0.set_reg_t<RegType::kVec128>(reg.id());
+ }
+ else if (TypeUtils::is_vec256(dst_type_id)) {
+ r0.set_reg_t<RegType::kVec256>(reg.id());
+ }
+ else if (TypeUtils::is_vec512(dst_type_id)) {
+ r0.set_reg_t<RegType::kVec512>(reg.id());
+ }
+ else {
+ break;
+ }
+
+ return cc().emit(vec_mov_inst_id, stack_ptr, r0);
+ }
+ break;
+ }
+ return make_error(Error::kInvalidAssignment);
+
+ // Extend+Move Gp.
+ExtendMovGpD:
+ stack_ptr.set_size(4);
+ r0.set_reg_t<RegType::kGp32>(reg.id());
+
+ ASMJIT_PROPAGATE(cc().emit(inst_id, r0, r1));
+ ASMJIT_PROPAGATE(cc().emit(Inst::kIdMov, stack_ptr, r0));
+ return Error::kOk;
+
+ExtendMovGpXQ:
+ if (register_size == 8) {
+ stack_ptr.set_size(8);
+ r0.set_reg_t<RegType::kGp64>(reg.id());
+
+ ASMJIT_PROPAGATE(cc().emit(inst_id, r0, r1));
+ ASMJIT_PROPAGATE(cc().emit(Inst::kIdMov, stack_ptr, r0));
+ }
+ else {
+ stack_ptr.set_size(4);
+ r0.set_reg_t<RegType::kGp32>(reg.id());
+
+ ASMJIT_PROPAGATE(cc().emit(inst_id, r0, r1));
+
+ExtendMovGpDQ:
+ ASMJIT_PROPAGATE(cc().emit(Inst::kIdMov, stack_ptr, r0));
+ stack_ptr.add_offset_lo32(4);
+ ASMJIT_PROPAGATE(cc().emit(Inst::kIdAnd, stack_ptr, 0));
+ }
+ return Error::kOk;
+
+ZeroExtendGpDQ:
+ stack_ptr.set_size(4);
+ r0.set_reg_t<RegType::kGp32>(reg.id());
+ goto ExtendMovGpDQ;
+
+MovGpD:
+ stack_ptr.set_size(4);
+ r0.set_reg_t<RegType::kGp32>(reg.id());
+ return cc().emit(Inst::kIdMov, stack_ptr, r0);
+
+MovGpQ:
+ stack_ptr.set_size(8);
+ r0.set_reg_t<RegType::kGp64>(reg.id());
+ return cc().emit(Inst::kIdMov, stack_ptr, r0);
+
+MovMmD:
+ stack_ptr.set_size(4);
+ r0.set_reg_t<RegType::kX86_Mm>(reg.id());
+ return cc().emit(ids().movd(), stack_ptr, r0);
+
+MovMmQ:
+ stack_ptr.set_size(8);
+ r0.set_reg_t<RegType::kX86_Mm>(reg.id());
+ return cc().emit(ids().movq(), stack_ptr, r0);
+
+MovXmmD:
+ stack_ptr.set_size(4);
+ r0.set_reg_t<RegType::kVec128>(reg.id());
+ return cc().emit(ids().movss(), stack_ptr, r0);
+
+MovXmmQ:
+ stack_ptr.set_size(8);
+ r0.set_reg_t<RegType::kVec128>(reg.id());
+ return cc().emit(ids().movlps(), stack_ptr, r0);
+}
+
+// x86::RACFGBuilder - OnReg
+// =========================
+
+Error RACFGBuilder::on_before_ret(FuncRetNode* func_ret) noexcept {
+ const FuncDetail& func_detail = _pass.func()->detail();
+ Span<const Operand> operands = func_ret->operands();
+
+ cc().set_cursor(func_ret->prev());
+
+ for (size_t i = 0; i < operands.size(); i++) {
+ const Operand& op = operands[i];
+ const FuncValue& ret = func_detail.ret(i);
+
+ if (!op.is_reg()) {
+ continue;
+ }
+
+ if (ret.reg_type() == RegType::kX86_St) {
+ const Reg& reg = op.as<Reg>();
+ uint32_t virt_index = Operand::virt_id_to_index(reg.id());
+
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ if (work_reg->group() != RegGroup::kVec) {
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ Reg src(work_reg->signature(), work_reg->virt_id());
+ Mem mem;
+
+ TypeId type_id = TypeUtils::scalar_of(work_reg->type_id());
+ if (ret.has_type_id()) {
+ type_id = ret.type_id();
+ }
+
+ switch (type_id) {
+ case TypeId::kFloat32:
+ ASMJIT_PROPAGATE(_pass.use_temporary_mem(mem, 4, 4));
+ mem.set_size(4);
+ ASMJIT_PROPAGATE(cc().emit(ids().movss(), mem, src.as<Vec>()));
+ ASMJIT_PROPAGATE(cc().fld(mem));
+ break;
+
+ case TypeId::kFloat64:
+ ASMJIT_PROPAGATE(_pass.use_temporary_mem(mem, 8, 4));
+ mem.set_size(8);
+ ASMJIT_PROPAGATE(cc().emit(ids().movsd(), mem, src.as<Vec>()));
+ ASMJIT_PROPAGATE(cc().fld(mem));
+ break;
+
+ default:
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+ }
+ }
+
+ return Error::kOk;
+}
+
+Error RACFGBuilder::on_ret(FuncRetNode* func_ret, RAInstBuilder& ib) noexcept {
+ const FuncDetail& func_detail = _pass.func()->detail();
+ Span<const Operand> operands = func_ret->operands();
+
+ for (size_t i = 0u; i < operands.size(); i++) {
+ const Operand& op = operands[i];
+ if (op.is_none()) {
+ continue;
+ }
+
+ const FuncValue& ret = func_detail.ret(i);
+ if (ASMJIT_UNLIKELY(!ret.is_reg())) {
+ return make_error(Error::kInvalidAssignment);
+ }
+
+ // Not handled here...
+ if (ret.reg_type() == RegType::kX86_St) {
+ continue;
+ }
+
+ if (op.is_reg()) {
+ // Register return value.
+ const Reg& reg = op.as<Reg>();
+ uint32_t virt_index = Operand::virt_id_to_index(reg.id());
+
+ if (virt_index < Operand::kVirtIdCount) {
+ RAWorkReg* work_reg;
+ ASMJIT_PROPAGATE(_pass.virt_index_as_work_reg(&work_reg, virt_index));
+
+ RegGroup group = work_reg->group();
+ RegMask in_out_regs = _pass._available_regs[group];
+ ASMJIT_PROPAGATE(ib.add(work_reg, RATiedFlags::kUse | RATiedFlags::kRead, in_out_regs, ret.reg_id(), 0, in_out_regs, Reg::kIdBad, 0));
+ }
+ }
+ else {
+ return make_error(Error::kInvalidAssignment);
+ }
+ }
+
+ return Error::kOk;
+}
+
+// x86::X86RAPass - Construction & Destruction
+// ===========================================
+
+X86RAPass::X86RAPass(BaseCompiler& cc) noexcept
+ : BaseRAPass(cc) { _emit_helper_ptr = &_emit_helper; }
+X86RAPass::~X86RAPass() noexcept {}
+
+// x86::X86RAPass - OnInit & OnDone
+// ================================
+
+void X86RAPass::on_init() noexcept {
+ Arch arch = cc().arch();
+ uint32_t base_reg_count = Environment::is_32bit(arch) ? 8u : 16u;
+ uint32_t simd_reg_count = base_reg_count;
+
+ if (Environment::is_64bit(arch) && _func->frame().is_avx512_enabled()) {
+ simd_reg_count = 32u;
+ }
+
+ _emit_helper.reset(&_cb, _func->frame().is_avx_enabled(), _func->frame().is_avx512_enabled());
+ _arch_traits = &ArchTraits::by_arch(arch);
+ _phys_reg_count.set(RegGroup::kGp, base_reg_count);
+ _phys_reg_count.set(RegGroup::kVec, simd_reg_count);
+ _phys_reg_count.set(RegGroup::kMask, 8);
+ _phys_reg_count.set(RegGroup::kX86_MM, 8);
+ _build_phys_index();
+
+ _available_regs[RegGroup::kGp] = Support::lsb_mask<RegMask>(_phys_reg_count.get(RegGroup::kGp));
+ _available_regs[RegGroup::kVec] = Support::lsb_mask<RegMask>(_phys_reg_count.get(RegGroup::kVec));
+ _available_regs[RegGroup::kMask] = Support::lsb_mask<RegMask>(_phys_reg_count.get(RegGroup::kMask)) ^ 1u;
+ _available_regs[RegGroup::kX86_MM] = Support::lsb_mask<RegMask>(_phys_reg_count.get(RegGroup::kX86_MM));
+
+ _scratch_reg_indexes[0] = uint8_t(Gp::kIdCx);
+ _scratch_reg_indexes[1] = uint8_t(base_reg_count - 1);
+
+ const FuncFrame& frame = _func->frame();
+
+ // The architecture specific setup makes implicitly all registers available. So
+ // make unavailable all registers that are special and cannot be used in general.
+ bool has_fp = frame.has_preserved_fp();
+
+ make_unavailable(RegGroup::kGp, Gp::kIdSp); // ESP|RSP used as a stack-pointer (SP).
+ if (has_fp) {
+ make_unavailable(RegGroup::kGp, Gp::kIdBp); // EBP|RBP used as a frame-pointer (FP).
+ }
+ make_unavailable(frame._unavailable_regs);
+
+ _sp = cc().zsp();
+ _fp = cc().zbp();
+}
+
+void X86RAPass::on_done() noexcept {}
+
+// x86::X86RAPass - BuildCFG
+// =========================
+
+Error X86RAPass::build_cfg_nodes() noexcept {
+ return RACFGBuilder(*this).run();
+}
+
+// x86::X86RAPass - Rewrite
+// ========================
+
+static InstId transform_vex_to_evex(InstId inst_id) {
+ switch (inst_id) {
+ case Inst::kIdVbroadcastf128: return Inst::kIdVbroadcastf32x4;
+ case Inst::kIdVbroadcasti128: return Inst::kIdVbroadcasti32x4;
+ case Inst::kIdVextractf128: return Inst::kIdVextractf32x4;
+ case Inst::kIdVextracti128: return Inst::kIdVextracti32x4;
+ case Inst::kIdVinsertf128: return Inst::kIdVinsertf32x4;
+ case Inst::kIdVinserti128: return Inst::kIdVinserti32x4;
+ case Inst::kIdVmovdqa: return Inst::kIdVmovdqa32;
+ case Inst::kIdVmovdqu: return Inst::kIdVmovdqu32;
+ case Inst::kIdVpand: return Inst::kIdVpandd;
+ case Inst::kIdVpandn: return Inst::kIdVpandnd;
+ case Inst::kIdVpor: return Inst::kIdVpord;
+ case Inst::kIdVpxor: return Inst::kIdVpxord;
+ case Inst::kIdVroundpd: return Inst::kIdVrndscalepd;
+ case Inst::kIdVroundps: return Inst::kIdVrndscaleps;
+ case Inst::kIdVroundsd: return Inst::kIdVrndscalesd;
+ case Inst::kIdVroundss: return Inst::kIdVrndscaless;
+
+ default:
+ // This should never happen as only transformable instructions should go this path.
+ ASMJIT_ASSERT(false);
+ return 0;
+ }
+}
+
+ASMJIT_FAVOR_SPEED Error X86RAPass::rewrite() noexcept {
+ const size_t virt_count = cc()._virt_regs.size();
+ return rewrite_iterate([&](BaseNode* node, BaseNode* stop, RABlock* block) noexcept -> Error {
+ while (node != stop) {
+ BaseNode* next = node->next();
+ if (node->is_inst()) {
+ InstNode* inst = node->as<InstNode>();
+ RAInst* ra_inst = node->pass_data<RAInst>();
+ Span<Operand> operands = inst->operands();
+
+ // Rewrite virtual registers into physical registers.
+ if (ra_inst) {
+ // This data is allocated by Arena passed to `run_on_function()`, which will be reset after the RA pass finishes.
+ // So reset this data to prevent having a dead pointer after the RA pass is complete.
+ node->reset_pass_data();
+
+ // If the instruction contains pass data (ra_inst) then it was a subject for register allocation and must be
+ // rewritten to use physical regs.
+ const RATiedReg* tied_regs = ra_inst->tied_regs();
+ uint32_t tied_count = ra_inst->tied_count();
+ RegMask combined_reg_ids = 0;
+
+ for (uint32_t i = 0; i < tied_count; i++) {
+ const RATiedReg& tied_reg = tied_regs[i];
+
+ Support::BitWordIterator<uint32_t> use_it(tied_reg.use_rewrite_mask());
+ if (use_it.has_next()) {
+ uint32_t use_id = tied_reg.use_id();
+ do {
+ inst->_rewrite_id_at_index(use_it.next(), use_id);
+ } while (use_it.has_next());
+ combined_reg_ids |= use_id;
+ }
+
+ Support::BitWordIterator<uint32_t> out_it(tied_reg.out_rewrite_mask());
+ if (out_it.has_next()) {
+ uint32_t out_id = tied_reg.out_id();
+ do {
+ inst->_rewrite_id_at_index(out_it.next(), out_id);
+ } while (out_it.has_next());
+ combined_reg_ids |= out_id;
+ }
+ }
+
+ // If one operand was rewritten from Reg to Mem, we have to ensure that we are using the correct instruction.
+ if (ra_inst->is_reg_to_mem_patched()) {
+ switch (inst->inst_id()) {
+ case Inst::kIdKmovb: {
+ if (operands[0].is_gp() && operands[1].is_mem()) {
+ // Transform from [V]MOVD to MOV.
+ operands[1].as<Mem>().set_size(1);
+ inst->set_inst_id(Inst::kIdMovzx);
+ }
+ break;
+ }
+
+ case Inst::kIdVmovw: {
+ if (operands[0].is_gp() && operands[1].is_mem()) {
+ // Transform from [V]MOVD to MOV.
+ operands[1].as<Mem>().set_size(2);
+ inst->set_inst_id(Inst::kIdMovzx);
+ }
+ break;
+ }
+
+ case Inst::kIdMovd:
+ case Inst::kIdVmovd:
+ case Inst::kIdKmovd: {
+ if (operands[0].is_gp() && operands[1].is_mem()) {
+ // Transform from [V]MOVD to MOV.
+ operands[1].as<Mem>().set_size(4);
+ inst->set_inst_id(Inst::kIdMov);
+ }
+ break;
+ }
+
+ case Inst::kIdMovq:
+ case Inst::kIdVmovq:
+ case Inst::kIdKmovq: {
+ if (operands[0].is_gp() && operands[1].is_mem()) {
+ // Transform from [V]MOVQ to MOV.
+ operands[1].as<Mem>().set_size(8);
+ inst->set_inst_id(Inst::kIdMov);
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ // Transform VEX instruction to EVEX when necessary.
+ if (ra_inst->is_transformable()) {
+ if (combined_reg_ids >= 16u) {
+ inst->set_inst_id(transform_vex_to_evex(inst->inst_id()));
+ }
+ }
+
+ // Remove moves that do not do anything.
+ //
+ // Usually these moves are inserted during code generation and originally they used different registers. If RA
+ // allocated these into the same register such redundant mov would appear.
+ if (ra_inst->has_inst_rw_flag(InstRWFlags::kMovOp) && !inst->has_extra_reg()) {
+ if (operands.size() == 2u) {
+ if (operands[0] == operands[1]) {
+ cc().remove_node(node);
+ node = next;
+ continue;
+ }
+ }
+ }
+
+ if (ASMJIT_UNLIKELY(node->type() != NodeType::kInst)) {
+ // FuncRet terminates the flow, it must either be removed if the exit label is next to it (optimization) or
+ // patched to an architecture dependent jump instruction that jumps to the function's exit before the epilog.
+ if (node->type() == NodeType::kFuncRet) {
+ if (!is_next_to(node, _func->exit_node())) {
+ cc().set_cursor(node->prev());
+ ASMJIT_PROPAGATE(emit_jump(_func->exit_node()->label()));
+ }
+
+ BaseNode* prev = node->prev();
+ cc().remove_node(node);
+
+ if (block) {
+ block->set_last(prev);
+ }
+ }
+ }
+ }
+
+ // Rewrite stack slot addresses.
+ for (Operand& op : operands) {
+ if (op.is_mem()) {
+ BaseMem& mem = op.as<BaseMem>();
+ if (mem.is_reg_home()) {
+ uint32_t virt_index = Operand::virt_id_to_index(mem.base_id());
+ if (ASMJIT_UNLIKELY(virt_index >= virt_count)) {
+ return make_error(Error::kInvalidVirtId);
+ }
+
+ VirtReg* virt_reg = cc().virt_reg_by_index(virt_index);
+ RAWorkReg* work_reg = virt_reg->work_reg();
+ ASMJIT_ASSERT(work_reg != nullptr);
+
+ RAStackSlot* slot = work_reg->stack_slot();
+ int32_t offset = slot->offset();
+
+ mem._set_base(_sp.reg_type(), slot->base_reg_id());
+ mem.clear_reg_home();
+ mem.add_offset_lo32(offset);
+ }
+ }
+ }
+ }
+
+ node = next;
+ }
+
+ return Error::kOk;
+ });
+}
+
+// x86::X86RAPass - OnEmit
+// =======================
+
+Error X86RAPass::emit_move(RAWorkReg* work_reg, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept {
+ Reg dst(work_reg->signature(), dst_phys_id);
+ Reg src(work_reg->signature(), src_phys_id);
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<MOVE> ", 7u, work_reg->virt_reg());
+ comment = _tmp_string.data();
+ }
+#endif
+
+ return _emit_helper.emit_reg_move(dst, src, work_reg->type_id(), comment);
+}
+
+Error X86RAPass::emit_swap(RAWorkReg* a_reg, uint32_t a_phys_id, RAWorkReg* b_reg, uint32_t b_phys_id) noexcept {
+ bool is_64bit = Support::max(a_reg->type_id(), b_reg->type_id()) >= TypeId::kInt64;
+ OperandSignature sign = is_64bit ? OperandSignature{RegTraits<RegType::kGp64>::kSignature}
+ : OperandSignature{RegTraits<RegType::kGp32>::kSignature};
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<SWAP> ", 7u, a_reg->virt_reg());
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, ", " , 2u, b_reg->virt_reg());
+ cc().set_inline_comment(_tmp_string.data());
+ }
+#endif
+
+ return cc().emit(Inst::kIdXchg, Reg(sign, a_phys_id), Reg(sign, b_phys_id));
+}
+
+Error X86RAPass::emit_load(RAWorkReg* work_reg, uint32_t dst_phys_id) noexcept {
+ Reg dst_reg(work_reg->signature(), dst_phys_id);
+ BaseMem src_mem(work_reg_as_mem(work_reg));
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<LOAD> ", 7u, work_reg->virt_reg());
+ comment = _tmp_string.data();
+ }
+#endif
+
+ return _emit_helper.emit_reg_move(dst_reg, src_mem, work_reg->type_id(), comment);
+}
+
+Error X86RAPass::emit_save(RAWorkReg* work_reg, uint32_t src_phys_id) noexcept {
+ BaseMem dst_mem(work_reg_as_mem(work_reg));
+ Reg src_reg(work_reg->signature(), src_phys_id);
+
+ const char* comment = nullptr;
+
+#ifndef ASMJIT_NO_LOGGING
+ if (has_diagnostic_option(DiagnosticOptions::kRAAnnotate)) {
+ _tmp_string.clear();
+ Formatter::format_virt_reg_name_with_prefix(_tmp_string, "<SAVE> ", 7u, work_reg->virt_reg());
+ comment = _tmp_string.data();
+ }
+#endif
+
+ return _emit_helper.emit_reg_move(dst_mem, src_reg, work_reg->type_id(), comment);
+}
+
+Error X86RAPass::emit_jump(const Label& label) noexcept {
+ return cc().jmp(label);
+}
+
+Error X86RAPass::emit_pre_call(InvokeNode* invoke_node) noexcept {
+ if (invoke_node->detail().has_var_args() && cc().is_64bit()) {
+ const FuncDetail& fd = invoke_node->detail();
+ uint32_t arg_count = invoke_node->arg_count();
+
+ switch (invoke_node->detail().call_conv().id()) {
+ case CallConvId::kX64SystemV: {
+ // AL register contains the number of arguments passed in XMM register(s).
+ uint32_t n = 0;
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ const FuncValuePack& arg_pack = fd.arg_pack(arg_index);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ const FuncValue& arg = arg_pack[value_index];
+ if (!arg) {
+ break;
+ }
+
+ if (arg.is_reg() && RegUtils::group_of(arg.reg_type()) == RegGroup::kVec) {
+ n++;
+ }
+ }
+ }
+
+ if (!n) {
+ ASMJIT_PROPAGATE(cc().xor_(eax, eax));
+ }
+ else {
+ ASMJIT_PROPAGATE(cc().mov(eax, n));
+ }
+ break;
+ }
+
+ case CallConvId::kX64Windows: {
+ // Each double-precision argument passed in XMM must be also passed in GP.
+ for (uint32_t arg_index = 0; arg_index < arg_count; arg_index++) {
+ const FuncValuePack& arg_pack = fd.arg_pack(arg_index);
+ for (uint32_t value_index = 0; value_index < Globals::kMaxValuePack; value_index++) {
+ const FuncValue& arg = arg_pack[value_index];
+ if (!arg) {
+ break;
+ }
+
+ if (arg.is_reg() && RegUtils::group_of(arg.reg_type()) == RegGroup::kVec) {
+ Gp dst = gpq(fd.call_conv().passed_order(RegGroup::kGp)[arg_index]);
+ Vec src = xmm(arg.reg_id());
+ ASMJIT_PROPAGATE(cc().emit(_emit_helper.ids().movq(), dst, src));
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ return make_error(Error::kInvalidState);
+ }
+ }
+
+ return Error::kOk;
+}
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/asmjit/x86/x86rapass_p.h b/3rdparty/asmjit/asmjit/x86/x86rapass_p.h
new file mode 100644
index 00000000000..4dd1d5fa661
--- /dev/null
+++ b/3rdparty/asmjit/asmjit/x86/x86rapass_p.h
@@ -0,0 +1,96 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+#ifndef ASMJIT_X86_X86RAPASS_P_H_INCLUDED
+#define ASMJIT_X86_X86RAPASS_P_H_INCLUDED
+
+#include <asmjit/core/api-config.h>
+#ifndef ASMJIT_NO_COMPILER
+
+#include <asmjit/core/compiler.h>
+#include <asmjit/core/racfgblock_p.h>
+#include <asmjit/core/racfgbuilder_p.h>
+#include <asmjit/core/rapass_p.h>
+#include <asmjit/x86/x86assembler.h>
+#include <asmjit/x86/x86compiler.h>
+#include <asmjit/x86/x86emithelper_p.h>
+
+ASMJIT_BEGIN_SUB_NAMESPACE(x86)
+
+//! \cond INTERNAL
+//! \addtogroup asmjit_x86
+//! \{
+
+//! X86 register allocation pass.
+//!
+//! Takes care of generating function prologs and epilogs, and also performs register allocation.
+class X86RAPass : public BaseRAPass {
+public:
+ ASMJIT_NONCOPYABLE(X86RAPass)
+ using Base = BaseRAPass;
+
+ //! \name Members
+ //! \{
+
+ EmitHelper _emit_helper;
+
+ //! \}
+
+ //! \name Construction & Destruction
+ //! \{
+
+ X86RAPass(BaseCompiler& cc) noexcept;
+ ~X86RAPass() noexcept override;
+
+ //! \}
+
+ //! \name Accessors
+ //! \{
+
+ //! Returns the compiler casted to `x86::Compiler`.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG Compiler& cc() const noexcept { return static_cast<Compiler&>(_cb); }
+
+ //! Returns emit helper.
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG EmitHelper* emit_helper() noexcept { return &_emit_helper; }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_avx_enabled() const noexcept { return _emit_helper.is_avx_enabled(); }
+
+ [[nodiscard]]
+ ASMJIT_INLINE_NODEBUG bool is_avx512_enabled() const noexcept { return _emit_helper.is_avx512_enabled(); }
+
+ //! \}
+
+ //! \name Interface
+ //! \{
+
+ void on_init() noexcept override;
+ void on_done() noexcept override;
+
+ Error build_cfg_nodes() noexcept override;
+
+ Error rewrite() noexcept override;
+
+ Error emit_move(RAWorkReg* work_reg, uint32_t dst_phys_id, uint32_t src_phys_id) noexcept override;
+ Error emit_swap(RAWorkReg* a_reg, uint32_t a_phys_id, RAWorkReg* b_reg, uint32_t b_phys_id) noexcept override;
+
+ Error emit_load(RAWorkReg* work_reg, uint32_t dst_phys_id) noexcept override;
+ Error emit_save(RAWorkReg* work_reg, uint32_t src_phys_id) noexcept override;
+
+ Error emit_jump(const Label& label) noexcept override;
+ Error emit_pre_call(InvokeNode* invoke_node) noexcept override;
+
+ //! \}
+};
+
+//! \}
+//! \endcond
+
+ASMJIT_END_SUB_NAMESPACE
+
+#endif // !ASMJIT_NO_COMPILER
+#endif // ASMJIT_X86_X86RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/configure.sh b/3rdparty/asmjit/configure.sh
new file mode 100644
index 00000000000..3f9b1d6b88b
--- /dev/null
+++ b/3rdparty/asmjit/configure.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+echo "== [configure debug] =="
+cmake --preset debug "$@"
+echo ""
+
+echo "== [configure release] =="
+cmake --preset release "$@"
+echo ""
diff --git a/3rdparty/asmjit/configure_sanitizers.sh b/3rdparty/asmjit/configure_sanitizers.sh
new file mode 100644
index 00000000000..defd80f959e
--- /dev/null
+++ b/3rdparty/asmjit/configure_sanitizers.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+echo "== [configure release-asan] =="
+cmake --preset release-asan "$@"
+echo ""
+
+echo "== [configure release-msan] =="
+cmake --preset release-msan "$@"
+echo ""
+
+echo "== [configure release-ubsan] =="
+cmake --preset release-ubsan "$@"
+echo ""
diff --git a/3rdparty/asmjit/configure_vs2022_x64.bat b/3rdparty/asmjit/configure_vs2022_x64.bat
new file mode 100644
index 00000000000..9bbadd7a3fd
--- /dev/null
+++ b/3rdparty/asmjit/configure_vs2022_x64.bat
@@ -0,0 +1,2 @@
+@echo off
+cmake . -B build_x64 -G"Visual Studio 17" -A x64 -DASMJIT_TEST=ON
diff --git a/3rdparty/asmjit/configure_vs2022_x86.bat b/3rdparty/asmjit/configure_vs2022_x86.bat
new file mode 100644
index 00000000000..8c123a0a281
--- /dev/null
+++ b/3rdparty/asmjit/configure_vs2022_x86.bat
@@ -0,0 +1,2 @@
+@echo off
+cmake . -B build_x86 -G"Visual Studio 17" -A Win32 -DASMJIT_TEST=ON
diff --git a/3rdparty/asmjit/db/LICENSE.md b/3rdparty/asmjit/db/LICENSE.md
new file mode 100644
index 00000000000..e01395cd5cf
--- /dev/null
+++ b/3rdparty/asmjit/db/LICENSE.md
@@ -0,0 +1,17 @@
+Copyright (c) 2008-2025 The AsmJit Authors
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
diff --git a/3rdparty/asmjit/db/README.md b/3rdparty/asmjit/db/README.md
new file mode 100644
index 00000000000..faddd94822d
--- /dev/null
+++ b/3rdparty/asmjit/db/README.md
@@ -0,0 +1,21 @@
+AsmJit Instruction Database
+---------------------------
+
+This is a database of instructions that is used by AsmJit to generate its internal database and also assembler implementations. This project started initially as AsmDB, but was merged to AsmJit later to make the maintenance easier. The database was created in a way so that each instruction definition would only need a single line in JSON data file. The data is then processed by architecture specific data readers that make the data canonical and ready for processing.
+
+AsmJit database provides the following ISAs:
+
+ * `isa_x86.json` - provides X86 instruction data (both 32-bit and 64-bit)
+ * `isa_aarch32.json` - provides AArch32 instruction data (A32/T16/T32 encoding)
+ * `isa_aarch64.json` - provides AArch64 instruction data (A64 encoding)
+ * `isa_aarch64_sme.json` - provides AArch64 SME instruction data (work-in-progress)
+
+To Be Documented
+----------------
+
+This project will be refactored and documented in the future.
+
+License
+-------
+
+AsmJit database is licensed under [Zlib License](./LICENSE.md)
diff --git a/3rdparty/asmjit/db/aarch32.js b/3rdparty/asmjit/db/aarch32.js
new file mode 100644
index 00000000000..6f9d61651e0
--- /dev/null
+++ b/3rdparty/asmjit/db/aarch32.js
@@ -0,0 +1,987 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+(function($scope, $as) {
+"use strict";
+
+function FAIL(msg) { throw new Error("[AArch32] " + msg); }
+
+// Import
+// ======
+
+const base = $scope.base ? $scope.base : require("./base.js");
+const exp = $scope.exp ? $scope.exp : require("./exp.js")
+
+const dict = base.dict;
+const NONE = base.NONE;
+const Parsing = base.Parsing;
+const MapUtils = base.MapUtils;
+
+// Export
+// ======
+
+const arm = $scope[$as] = dict();
+
+// Database
+// ========
+
+arm.dbName = "isa_aarch32.json";
+
+// asmdb.aarch32.Utils
+// ===================
+
+// Can be used to assign the number of bits each part of the opcode occupies.
+// NOTE: THUMB instructions that use halfword must always specify the width
+// of all registers as many instructions accept only LO (r0..r7) registers.
+const FieldInfo = {
+ "P" : { "bits": 1 },
+ "U" : { "bits": 1 },
+ "W" : { "bits": 1 },
+ "S" : { "bits": 1 },
+ "R" : { "bits": 1 },
+ "H" : { "bits": 1 },
+ "isFp32": { "bits": 1 },
+ "F" : { "bits": 1 },
+ "align" : { "bits": 2 },
+ "ja" : { "bits": 1 },
+ "jb" : { "bits": 1 },
+ "op" : { "bits": 1 }, // TODO: This should be fixed.
+ "sz" : { "bits": 2 },
+ "sop" : { "bits": 2 },
+ "cond" : { "bits": 4 },
+ "cmode" : { "bits": 4 },
+ "Cn" : { "bits": 4 },
+ "Cm" : { "bits": 4 },
+
+ "Rd" : { "bits": 4, "read": false, "write": true },
+ "Rd2" : { "bits": 4, "read": false, "write": true },
+ "RdLo" : { "bits": 4, "read": false, "write": true },
+ "RdHi" : { "bits": 4, "read": false, "write": true },
+ "RdList": { "bits": 4, "read": false, "write": true , "list": true },
+ "Rx" : { "bits": 4, "read": true , "write": true },
+ "RxLo" : { "bits": 4, "read": true , "write": true },
+ "RxHi" : { "bits": 4, "read": true , "write": true },
+ "Rn" : { "bits": 4, "read": true , "write": false },
+ "Rm" : { "bits": 4, "read": true , "write": false },
+ "Ra" : { "bits": 4, "read": true , "write": false },
+ "Rs" : { "bits": 4, "read": true , "write": false },
+ "Rs2" : { "bits": 4, "read": true , "write": false },
+ "RsList": { "bits": 4, "read": true , "write": false , "list": true },
+
+ "Sd" : { "bits": 4, "read": false, "write": true },
+ "Sd2" : { "bits": 4, "read": false, "write": true },
+ "SdList": { "bits": 4, "read": false, "write": true , "list": true },
+ "Sx" : { "bits": 4, "read": true , "write": true },
+ "Sn" : { "bits": 4, "read": true , "write": false },
+ "Sm" : { "bits": 4, "read": true , "write": false },
+ "Ss" : { "bits": 4, "read": true , "write": false },
+ "Ss2" : { "bits": 4, "read": true , "write": false },
+ "SsList": { "bits": 4, "read": true , "write": false , "list": true },
+
+ "Dd" : { "bits": 4, "read": false, "write": true },
+ "Dd2" : { "bits": 4, "read": false, "write": true },
+ "Dd3" : { "bits": 4, "read": false, "write": true },
+ "Dd4" : { "bits": 4, "read": false, "write": true },
+ "DdList": { "bits": 4, "read": false, "write": true , "list": true },
+ "Dx" : { "bits": 4, "read": true , "write": true },
+ "Dx2" : { "bits": 4, "read": true , "write": true },
+ "Dn" : { "bits": 4, "read": true , "write": false },
+ "Dn2" : { "bits": 4, "read": true , "write": false },
+ "Dn3" : { "bits": 4, "read": true , "write": false },
+ "Dn4" : { "bits": 4, "read": true , "write": false },
+ "Dm" : { "bits": 4, "read": true , "write": false },
+ "Ds" : { "bits": 4, "read": true , "write": false },
+ "Ds2" : { "bits": 4, "read": true , "write": false },
+ "Ds3" : { "bits": 4, "read": true , "write": false },
+ "Ds4" : { "bits": 4, "read": true , "write": false },
+ "DsList": { "bits": 4, "read": true , "write": false , "list": true },
+
+ "Vd" : { "bits": 4, "read": false, "write": true },
+ "Vd2" : { "bits": 4, "read": false, "write": true },
+ "Vd3" : { "bits": 4, "read": false, "write": true },
+ "Vd4" : { "bits": 4, "read": false, "write": true },
+ "Vx" : { "bits": 4, "read": true , "write": true },
+ "Vx2" : { "bits": 4, "read": true , "write": true },
+ "Vn" : { "bits": 4, "read": true , "write": false },
+ "Vm" : { "bits": 4, "read": true , "write": false },
+ "Vs" : { "bits": 4, "read": true , "write": false },
+ "Vs2" : { "bits": 4, "read": true , "write": false },
+};
+
+arm.FieldInfo = FieldInfo;
+
+// ARM utilities.
+class Utils {
+ static splitInstructionSignature(s) {
+ const names = s.match(/^[\w\|]+/)[0];
+ s = s.substring(names.length);
+
+ const opOffset = s.indexOf(" ")
+ const suffix = s.substring(0, opOffset).trim();
+ const operands = opOffset === -1 ? "" : s.substring(opOffset + 1).trim();
+
+ return {
+ names: names.split("|").map((base)=>{ return base + suffix}),
+ operands: operands
+ }
+ }
+
+ static parseShiftOp(s) {
+ const m = s.match(/^(sop|lsl_or_asr|lsl|lsr|asr|ror|rrx) /);
+ return m ? m[1] : "";
+ }
+
+ static parseDtArray(s) {
+ const out = [];
+ if (!s) return out;
+
+ const arr = s.split("|");
+ let i;
+
+ // First expand anything between X-Y, for example s8-32 would be expanded to [s8, s16, s32].
+ for (i = 0; i < arr.length; i++) {
+ const v = arr[i];
+
+ if (v.indexOf("-") !== -1) {
+ const m = /^([A-Za-z]+)?(\d+)-(\d+)$/.exec(v);
+ if (!m)
+ FAIL(`Couldn't parse '${s}' data-type`);
+
+ let type = m[1] || "";
+ let size = parseInt(m[2], 10);
+ let last = parseInt(m[3], 10);
+
+ if (!Utils.checkDtSize(size) || !Utils.checkDtSize(last))
+ FAIL(`Invalid dt width in '${s}'`);
+
+ do {
+ out.push(type + String(size));
+ size <<= 1;
+ } while (size <= last);
+ }
+ else {
+ out.push(v);
+ }
+ }
+
+ // Now expand 'x' to 's' and 'u'.
+ i = 0;
+ while (i < out.length) {
+ const v = out[i];
+ if (v.startsWith("x")) {
+ out.splice(i, 1, "s" + v.substr(1), "u" + v.substr(1));
+ i += 2;
+ }
+ else {
+ i++;
+ }
+ }
+
+ return out;
+ }
+
+ static checkDtSize(x) {
+ return x === 8 || x === 16 || x === 32 || x === 64;
+ }
+}
+arm.Utils = Utils;
+
+function normalizeNumber(n) {
+ return n < 0 ? 0x100000000 + n : n;
+}
+
+function decomposeOperand(s) {
+ const elementSuffix = "[#i]";
+ let element = null;
+ let consecutive = 0;
+ let userRegList = false;
+
+ if (s.endsWith("^")) {
+ userRegList = true;
+ s = s.substring(0, s.length - 1);
+ }
+
+ if (s.endsWith(elementSuffix)) {
+ element = "#i";
+ s = s.substring(0, s.length - elementSuffix.length);
+ }
+
+ if (s.endsWith("++")) {
+ consecutive = 2;
+ s = s.substr(0, s.length - 2);
+ }
+ else if (s.endsWith("+")) {
+ consecutive = 1;
+ s = s.substr(0, s.length - 1);
+ }
+
+ let m = s.match(/==|\!=|>=|<=|\*/);
+ let restrict = false;
+
+ if (m) {
+ restrict = s.substr(m.index);
+ s = s.substr(0, m.index);
+ }
+
+ return {
+ data : s,
+ element : element,
+ restrict: restrict,
+ consecutive: consecutive,
+ userRegList: true
+ };
+}
+
+function splitOpcodeFields(s) {
+ const arr = s.split("|");
+ const out = [];
+
+ for (let i = 0; i < arr.length; i++) {
+ const val = arr[i];
+ if (/^[0-1A-Z]{2,}$/.test(val))
+ out.push.apply(out, val.match(/([0-1]+)|[A-Z]/g));
+ else
+ out.push(val);
+ }
+
+ return out.map((field) => { return field.trim(); });
+}
+
+// asmdb.aarch32.Operand
+// =====================
+
+// ARM operand.
+class Operand extends base.Operand {
+ constructor(def) {
+ super();
+ this.data = def;
+ }
+
+ hasMemModes() {
+ return Object.keys(this.memModes).length !== 0;
+ }
+
+ get name() {
+ switch (this.type) {
+ case "reg": return this.reg;
+ case "mem": return this.mem;
+ case "imm": return this.imm;
+ case "rel": return this.rel;
+ default : return "";
+ }
+ }
+
+ get scale() {
+ if (this.restrict && this.restrict.startsWith("*"))
+ return parseInt(this.restrict.substr(1), 10);
+ else
+ return 0;
+ }
+
+ isRelative() {
+ if (this.type === "imm")
+ return this.name === "relA" || this.name === "relS" || this.name === "relZ";
+ else
+ return false;
+ }
+}
+arm.Operand = Operand;
+
+// asmdb.aarch32.Instruction
+// =========================
+
+function patternFromOperand(key) {
+ return key;
+ // return key.replace(/\b(?:[RVDS](?:d|s|n|m|x|x2))\b/, "R");
+}
+
+// Rewrite a memory operand expression (either base or index) to a simplified one, which is okay
+// to be generated as C++ expression. In general, we want to simplify != to a more favorable code.
+function simplifyMemoryExpression(e) {
+ if (e.type === "binary" && e.op === "!=" && e.right.type === "var") {
+ // Rewrite A != PC to A < PC
+ if (e.right.name === "PC") { e.op = "<"; }
+
+ // Rewrite A != HI to A < 8
+ if (e.right.name === "HI") { e.op = "<"; e.right = exp.Imm(8); }
+
+ // Rewrite A != XX to A < SP || A == LR
+ if (e.right.name === "XX") {
+ return exp.Or(exp.Lt(e.left, exp.Var("SP")),
+ exp.Eq(e.left.clone(), exp.Var("LR")));
+ }
+ }
+
+ return e;
+}
+
+// ARM instruction.
+class Instruction extends base.Instruction {
+ constructor(db, data) {
+ super(db, data);
+ // name, operands, encoding, opcode, metadata
+
+ const encoding = Object.hasOwn(data, "a32") ? "a32" :
+ Object.hasOwn(data, "t32") ? "t32" :
+ Object.hasOwn(data, "t16") ? "t16" : "";
+
+ this.name = data.name;
+ this.it = dict(); // THUMB's 'it' flags.
+ this.apsr = dict();
+ this.fpcsr = dict();
+ this.calc = dict(); // Calculations required to generate opcode.
+ this.immCond = []; // Immediate value conditions (array of conditions).
+
+ this.s = null; // Instruction S flag (null, true, or false).
+ this.dt = []; // Instruction <dt> field (first data-type).
+ this.dt2 = []; // Instruction <dt2> field (second data-type).
+
+ this.availableFrom = ""; // Instruction supported by from ARMv???.
+ this.availableUntil = ""; // Instruction supported by until ARMv???.
+
+ this._assignOperands(data.operands);
+ this._assignEncoding(encoding.toUpperCase());
+ this._assignOpcode(data[encoding]);
+
+ for (let k in data) {
+ if (k === "name" || k == encoding || k === "operands")
+ continue;
+ this._assignAttribute(k, data[k]);
+ }
+
+ this._updateOperandsInfo();
+ this._postProcess();
+ }
+
+ _assignAttribute(key, value) {
+ switch (key) {
+ case "it":
+ for (let it of value.split(" "))
+ this.it[it.trim()] = true;
+ break;
+
+ case "apsr":
+ case "fpcsr":
+ this._assignAttributeKeyValue(key, value);
+ break;
+
+ case "imm":
+ this.imm = exp.parse(value);
+ break;
+
+ case "calc":
+ for (let calcKey in value)
+ this.calc[calcKey] = exp.parse(value[calcKey]);
+ break;
+
+ default:
+ super._assignAttribute(key, value);
+ }
+ }
+
+ _assignAttributeKeyValue(name, content) {
+ const attributes = content.trim().split(/[ ]+/);
+
+ for (let i = 0; i < attributes.length; i++) {
+ const attr = attributes[i].trim();
+ if (!attr)
+ continue;
+
+ const eq = attr.indexOf("=");
+ let key = eq === -1 ? attr : attr.substr(0, eq);
+ let val = eq === -1 ? true : attr.substr(eq + 1);
+
+ // If the key contains "|" it's a definition of multiple attributes.
+ if (key.indexOf("|") !== -1) {
+ const dot = key.indexOf(".");
+
+ const base = dot === -1 ? "" : key.substr(0, dot + 1);
+ const keys = (dot === -1 ? key : key.substr(dot + 1)).split("|");
+
+ for (let j = 0; j < keys.length; j++)
+ this[name][base + keys[j]] = val;
+ }
+ else {
+ this[name][key] = val;
+ }
+ }
+ }
+
+ _assignEncoding(s) {
+ this.arch = s === "T16" || s === "T32" ? "THUMB" : "ARM";
+ this.encoding = s;
+ }
+
+ _assignOperands(s) {
+ if (!s) return;
+
+ // Split into individual operands and push them to `operands`.
+ const arr = base.Parsing.splitOperands(s);
+ for (let i = 0; i < arr.length; i++) {
+ let def = arr[i];
+ const op = new Operand(def);
+
+ const consecutive = def.match(/(\d+)x\{(.*)\}([+][+]?)/);
+ if (consecutive)
+ def = consecutive[2];
+
+ op.sign = false;
+ op.element = null;
+ op.shiftOp = "";
+ op.shiftImm = null;
+
+ // Handle {optional} attribute.
+ if (Parsing.isOptional(def)) {
+ op.optional = true;
+ def = Parsing.clearOptional(def);
+ }
+
+ // Handle commutativity <-> symbol.
+ if (Parsing.isCommutative(def)) {
+ op.commutative = true;
+ def = Parsing.clearCommutative(def);
+ }
+
+ // Handle shift operation.
+ let shiftOp = Utils.parseShiftOp(def);
+ if (shiftOp) {
+ op.shiftOp = shiftOp;
+ def = def.substring(shiftOp.length + 1);
+ }
+
+ if (def.startsWith("[")) {
+ op.type = "mem";
+ op.memModes = dict();
+
+ op.base = null;
+ op.index = null;
+ op.offset = null;
+
+ let mem = def;
+ let didHaveMemMode = false;
+
+ for (;;) {
+ if (mem.endsWith("!")) {
+ op.memModes.preIndex = true;
+ mem = mem.substring(0, mem.length - 1);
+
+ didHaveMemMode = true;
+ break;
+ }
+
+ if (mem.endsWith("@")) {
+ op.memModes.postIndex = true;
+ mem = mem.substring(0, mem.length - 1);
+
+ didHaveMemMode = true;
+ break;
+ }
+
+ if (mem.endsWith("{!}")) {
+ op.memModes.offset = true;
+ op.memModes.preIndex = true;
+ mem = mem.substring(0, mem.length - 3);
+
+ didHaveMemMode = true;
+ continue;
+ }
+
+ if (mem.endsWith("{@}")) {
+ op.memModes.offset = true;
+ op.memModes.postIndex = true;
+ mem = mem.substring(0, mem.length - 3);
+
+ didHaveMemMode = true;
+ continue;
+ }
+
+ break;
+ }
+
+ if (!mem.endsWith("]"))
+ FAIL(`Unknown memory operand '${mem}' in '${def}'`);
+
+ let parts = mem.substring(1, mem.length - 1).split(",").map(function(s) { return s.trim() });
+ for (let i = 0; i < parts.length; i++) {
+ const part = parts[i];
+
+ const m = part.match(/^\{(lsl|sop)\s+#(\w+)\}$/);
+ if (m) {
+ op.shiftOp = m[1];
+ op.shiftImm = m[2];
+ continue;
+ }
+
+ if (i === 0) {
+ op.base = dict();
+ op.base.field = part;
+ op.base.exp = null;
+
+ const m = part.match(/^([A-Za-z]\w*)/);
+ if (m.length < part.length) {
+ op.base.exp = simplifyMemoryExpression(exp.parse(part));
+ op.base.field = m[1];
+ }
+ }
+ else if (part.startsWith("#")) {
+ let p = part.substring(1);
+ let u = "1";
+ let alwaysNegative = false;
+
+ let offExp = null;
+ let offMul = 1;
+
+ if (p.startsWith("+/-")) {
+ u = "U";
+ p = p.substring(3);
+ }
+
+ if (p.startsWith("-")) {
+ alwaysNegative = false;
+ p = p.substring(1);
+ }
+
+ const expMatch = p.match(/^([A-Za-z]\w*)==/);
+ if (expMatch) {
+ offExp = exp.parse(p);
+ p = p.substr(0, expMatch[1].length);
+ }
+
+ const mulMatch = p.match(/\s*\*\s*(\d+)$/);
+ if (mulMatch) {
+ offMul = parseInt(mulMatch[1]);
+ p = p.substr(0, mulMatch.index);
+ }
+
+ op.offset = dict();
+ op.offset.field = p;
+ op.offset.u = u;
+ op.offset.exp = offExp;
+ op.offset.mul = offMul;
+ op.offset.negative = alwaysNegative;
+ }
+ else {
+ let p = part;
+ let u = "1";
+
+ if (p.startsWith("+/-")) {
+ u = "U";
+ p = p.substring(3);
+ }
+
+ op.index = dict();
+ op.index.field = p;
+ op.index.u = u;
+
+ const m = p.match(/^([A-Za-z]\w*)/);
+ if (m.length < p.length) {
+ op.index.exp = simplifyMemoryExpression(exp.parse(p));
+ op.index.field = m[1];
+ }
+ }
+ }
+
+ if (!op.hasMemModes() && (op.offset || op.index))
+ op.memModes.offset = true;
+
+ op.mem = mem;
+ }
+ else if (def.startsWith("#")) {
+ const obj = decomposeOperand(def);
+ const imm = obj.data;
+
+ op.type = "imm";
+ op.imm = imm.substring(1); // Immediate operand name.
+ op.immSize = 0; // Immediate size in bits.
+ op.restrict = obj.restrict; // Immediate condition.
+ }
+ else {
+ const obj = decomposeOperand(def);
+ const reg = obj.data;
+
+ const type = reg.substr(0, 1).toLowerCase();
+ const info = FieldInfo[reg];
+
+ if (!info)
+ FAIL(`Unknown register operand '${reg}' in '${def}'`);
+
+ op.type = info.list ? "reg-list" : "reg";
+ op.reg = reg; // Register name (as specified in manual).
+ op.regType = type; // Register type.
+ op.regList = !!info.list; // Register list.
+ op.read = info.read; // Register access (read).
+ op.write = info.write; // Register access (write).
+ op.element = obj.element; // Register element[] access.
+ op.restrict = obj.restrict; // Register condition.
+ op.consecutive = obj.consecutive;
+ }
+
+ this.operands.push(op);
+
+ if (consecutive) {
+ const count = parseInt(consecutive[1]);
+ for (let n = 2; n <= count; n++) {
+ const def = consecutive[3].replace(op.reg, op.reg + n);
+ const opN = new Operand(def);
+ opN.type = "reg";
+ opN.reg = op.reg + n;
+ opN.regType = op.regType;
+ opN.read = op.read;
+ opN.write = op.write;
+ opN.element = op.element;
+ opN.consecutive = consecutive[3].length;
+ this.operands.push(opN);
+ }
+ }
+ }
+ }
+
+ _assignOpcode(s) {
+ this.opcodeString = s;
+
+ let opcodeIndex = 0;
+ let opcodeValue = 0;
+
+ let patternMap = {};
+
+ // Split opcode into its fields.
+ const arr = splitOpcodeFields(s);
+ const dup = dict();
+
+ const fields = this.fields;
+ const pattern = [];
+
+ const fieldMap = Object.create(null);
+ for (let field of arr) {
+ fieldMap[field] = true;
+ }
+
+ for (let i = arr.length - 1; i >= 0; i--) {
+ let key = arr[i];
+ let m;
+
+ if (/^[0-1]+$/.test(key)) {
+ // This part of the opcode is RAW bits, they contribute to the `opcodeValue`.
+ opcodeValue |= parseInt(key, 2) << opcodeIndex;
+ opcodeIndex += key.length;
+ pattern.unshift("_".repeat(key.length));
+ }
+ else {
+ pattern.unshift(patternFromOperand(key));
+ patternMap[patternFromOperand(key)] = true;
+
+ let size = 0;
+ let mask = 0;
+ let bits = 0;
+ let from = -1;
+
+ let lbit = key.startsWith("'");
+ let hbit = key.endsWith("'");
+
+ if ((m = key.match(/\[\s*(\d+)\s*\:\s*(\d+)\s*\]$/))) {
+ const a = parseInt(m[1], 10);
+ const b = parseInt(m[2], 10);
+ if (a < b)
+ FAIL(`Invalid bit range '${key}' in opcode '${s}'`);
+ from = b;
+ size = a - b + 1;
+ mask = ((1 << size) - 1) << b;
+ key = key.substr(0, m.index).trim();
+ }
+ else if ((m = key.match(/\[\s*(\d+)\s*\]$/))) {
+ from = parseInt(m[1], 10);
+ size = 1;
+ mask = 1 << from;
+ key = key.substr(0, m.index).trim();
+ }
+ else if ((m = key.match(/\:\s*(\d+)$/))) {
+ size = parseInt(m[1], 10);
+ bits = size;
+ key = key.substr(0, m.index).trim();
+ }
+ else {
+ const key_ = key;
+
+ if (lbit || hbit) {
+ from = 0;
+
+ if (lbit && hbit)
+ FAIL(`Couldn't recognize the format of '${key}' in opcode '${s}'`);
+
+ if (lbit) {
+ key = key.substring(1);
+ }
+
+ if (hbit) {
+ key = key.substring(0, key.length - 1);
+ from = 4;
+ }
+
+ size = 1;
+ }
+ else if (FieldInfo[key]) {
+ // Sizes of some standard fields can be assigned automatically.
+ size = FieldInfo[key].bits;
+ bits = size;
+
+ if (fieldMap["'" + key])
+ from = 1;
+ }
+ else if (key.length === 1) {
+ // Sizes of one-letter fields (like 'U', 'F', etc...) is 1 if not specified.
+ size = 1;
+ bits = 1;
+ }
+ else {
+ FAIL(`Couldn't recognize the size of '${key}' in opcode '${s}'`);
+ }
+
+ if (dup[key_] === true) {
+ bits = 0;
+ lbit = 0;
+ hbit = 0;
+ }
+ else {
+ dup[key_] = true;
+ }
+ }
+
+ let field = fields[key];
+ if (!field) {
+ field = {
+ index: opcodeIndex,
+ values: [],
+ bits: 0,
+ mask: 0,
+ lbit: 0,
+ hbit: 0 // Only 1 if a single quote (') was used.
+ }
+ fields[key] = field;
+ }
+
+ if (from === -1)
+ from = field.bits;
+
+ field.mask |= mask;
+ field.bits += bits;
+ field.lbit += lbit;
+ field.hbit += hbit;
+ field.values.push({
+ index: opcodeIndex,
+ from: from,
+ size: size
+ });
+
+ opcodeIndex += size;
+ }
+ }
+
+ for (let i = 0; i < pattern.length; i++)
+ if (pattern[i] === 'U')
+ pattern[i] = "_";
+
+ // Normalize all fields.
+ for (let key in fields) {
+ const field = fields[key];
+
+ // There should be either number of bits or mask, there shouldn't be both.
+ if (!field.bits && !field.mask)
+ FAIL(`Part '${key}' of opcode '${s}' contains neither size nor mask`);
+
+ if (field.bits && field.mask)
+ FAIL(`Part '${key}' of opcode '${s}' contains both size and mask`);
+
+ if (field.bits)
+ field.mask = ((1 << field.bits) - 1);
+ else if (field.mask)
+ field.bits = 32 - Math.clz32(field.mask);
+
+ // Handle field that used single-quote.
+ if (field.lbit) {
+ field.mask = (field.mask << 1) | 0x1;
+ field.bits++;
+ }
+
+ if (field.hbit) {
+ field.mask |= 1 << field.bits;
+ field.bits++;
+ }
+
+ const op = this.operandByName(key);
+ if (op && op.isImm())
+ op.immSize = field.bits;
+ }
+
+ // Check if the opcode value has the correct number of bits (either 16 or 32).
+ if (opcodeIndex !== 16 && opcodeIndex !== 32)
+ FAIL(`The number of bits '${opcodeIndex}' used by the opcode '${s}' doesn't match 16 or 32`);
+ this.opcodeValue = normalizeNumber(opcodeValue);
+ }
+
+ _assignSpecificAttribute(key, value) {
+ // Support ARMv?+ and ARMv?- attributes.
+ if (/^ARM\w+[+-]$/.test(key)) {
+ const armv = key.substr(0, key.length - 1);
+ const sign = key.substr(key.length - 1);
+
+ if (sign === "+")
+ this.availableFrom = armv;
+ else
+ this.availableUntil = armv;
+ return true;
+ }
+
+ switch (key) {
+ case "it": {
+ const values = String(value).split("|");
+ for (let i = 0; i < values.length; i++) {
+ const value = values[i];
+ switch (value) {
+ case "in" : this.it.IN = true; break;
+ case "out" : this.it.OUT = true; break;
+ case "any" : this.it.IN = true;
+ this.it.OUT = true; break;
+ case "last": this.it.LAST = true; break;
+ case "def" : this.it.DEF = true; break;
+ default:
+ this.report(`${this.name}: Unhandled IT value '${value}'`);
+ }
+ }
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ // ARM instruction name could consist of name and optional type information
+ // specified as <dt> and <dt2> in ARM manuals. We parse this information and
+ // store it to `dt` and `dt2` fields. In addition, we also recognize the `S`
+ // suffix (uppercase) of the instruction and mark it as `S` instruction. After
+ // that the name is normalized to be lowercased.
+ //
+ // This functionality requires all the instruction data to be already set-up.
+ _postProcess() {
+ let s = this.name;
+
+ // Parse <dt> and <dt2> fields.
+ if (s.indexOf(".") !== -1) {
+ const parts = s.split(".");
+ this.name = parts[0];
+
+ if (parts.length > 3)
+ FAIL(`Couldn't recognize name attributes of '${s}'`);
+
+ for (let i = 1; i < parts.length; i++) {
+ const dt = Utils.parseDtArray(parts[i]);
+ if (i === 1)
+ this.dt = dt;
+ else
+ this.dt2 = dt;
+ }
+ }
+
+ // Recognize "S" suffix.
+ if (this.name.endsWith("S")) {
+ this.name = this.name.substr(0, this.name.length - 1) + "s";
+ this.s = true;
+ }
+
+ this.dt.sort();
+ }
+
+ operandByName(name) {
+ const operands = this.operands;
+ for (let i = 0; i < operands.length; i++) {
+ const op = operands[i];
+ if (op.name === name)
+ return op;
+ }
+ return null;
+ }
+}
+arm.Instruction = Instruction;
+
+// asmdb.aarch32.ISA
+// =================
+
+function mergeGroupData(data, group) {
+ for (let k in group) {
+ switch (k) {
+ case "group":
+ case "data":
+ break;
+
+ case "ext":
+ data[k] = (data[k] ? data[k] + " " : "") + group[k];
+ break;
+
+ default:
+ if (data[k] === undefined)
+ data[k] = group[k]
+ break;
+ }
+ }
+}
+
+class ISA extends base.ISA {
+ constructor(data) {
+ super(data);
+ this.addData(data || NONE);
+ }
+
+ _addInstructions(groups) {
+ for (let group of groups) {
+ for (let inst of group.data) {
+ const sgn = Utils.splitInstructionSignature(inst.inst);
+ const data = MapUtils.cloneExcept(inst, { "inst": true });
+
+ mergeGroupData(data, group)
+
+ for (let j = 0; j < sgn.names.length; j++) {
+ data.name = sgn.names[j];
+ data.operands = sgn.operands;
+ if (j > 0)
+ data.aliasOf = sgn.names[0];
+ this._addInstruction(new Instruction(this, data));
+ }
+ }
+ }
+
+ return this;
+ }
+/*
+ _addInstructions(instructions) {
+ for (let i = 0; i < instructions.length; i++) {
+ const obj = instructions[i];
+ const sgn = obj.inst;
+ const sep = sgn.indexOf(" ");
+
+ const names = (sep !== -1 ? sgn.substring(0, sep) : sgn).trim().split("/");
+ const operands = sep !== -1 ? sgn.substring(sep + 1) : "";
+
+ const encoding = Object.hasOwn(obj, "a32") ? "a32" :
+ Object.hasOwn(obj, "t32") ? "t32" :
+ Object.hasOwn(obj, "t16") ? "t16" : "";
+
+ if (!encoding)
+ FAIL(`Instruction ${names.join("/")} doesn't encoding, it must provide either a32, t32, or t16 field`);
+
+ for (let j = 0; j < names.length; j++) {
+ const inst = new Instruction(this, names[j], operands, encoding.toUpperCase(), obj[encoding], obj);
+ if (j > 0)
+ inst.aliasOf = names[0];
+ this._addInstruction(inst);
+ }
+ }
+
+ return this;
+ }
+*/
+}
+arm.ISA = ISA;
+
+}).apply(this, typeof module === "object" && module && module.exports
+ ? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "aarch32"]);
diff --git a/3rdparty/asmjit/db/aarch64.js b/3rdparty/asmjit/db/aarch64.js
new file mode 100644
index 00000000000..af3b623c1af
--- /dev/null
+++ b/3rdparty/asmjit/db/aarch64.js
@@ -0,0 +1,920 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+(function($scope, $as) {
+"use strict";
+
+function FAIL(msg) { throw new Error("[AArch64] " + msg); }
+
+// Import
+// ======
+
+const base = $scope.base ? $scope.base : require("./base.js");
+const exp = $scope.exp ? $scope.exp : require("./exp.js")
+
+const dict = base.dict;
+const NONE = base.NONE;
+const Parsing = base.Parsing;
+const MapUtils = base.MapUtils;
+
+// Export
+// ======
+
+const arm = $scope[$as] = dict();
+
+// Database
+// ========
+
+arm.dbName = "isa_aarch64.json";
+
+// asmdb.aarch64.Utils
+// ===================
+
+// Can be used to assign the number of bits each part of the opcode occupies.
+// NOTE: THUMB instructions that use halfword must always specify the width
+// of all registers as many instructions accept only LO (r0..r7) registers.
+const FieldInfo = {
+ "P" : { "bits": 1 },
+ "U" : { "bits": 1 },
+ "W" : { "bits": 1 },
+ "S" : { "bits": 1 },
+ "R" : { "bits": 1 },
+ "H" : { "bits": 1 },
+ "F" : { "bits": 1 },
+ "post" : { "bits": 1 },
+ "!post" : { "bits": 1 },
+ "op" : { "bits": 1 }, // TODO: This should be fixed.
+ "s" : { "bits": 1 },
+ "sz" : { "bits": 2 },
+ "msz" : { "bits": 2 },
+ "sop" : { "bits": 2 },
+ "cond" : { "bits": 4 },
+ "nzcv" : { "bits": 4 },
+ "cmode" : { "bits": 4 },
+ "CRn" : { "bits": 4 },
+ "CRm" : { "bits": 4 },
+
+ "Rx" : { "bits": 5, "read": true , "write": true },
+ "Rx2" : { "bits": 5, "read": true , "write": true },
+ "Rdn" : { "bits": 5, "read": true , "write": true },
+ "Rd" : { "bits": 5, "read": false, "write": true },
+ "Rd2" : { "bits": 5, "read": false, "write": true },
+ "Rs" : { "bits": 5, "read": true , "write": false },
+ "Rs2" : { "bits": 5, "read": true , "write": false },
+ "Rn" : { "bits": 5, "read": true , "write": false },
+ "Rm" : { "bits": 5, "read": true , "write": false },
+ "Ra" : { "bits": 5, "read": true , "write": false },
+ "Rt" : { "bits": 5, "read": true , "write": false },
+ "Rt2" : { "bits": 5, "read": true , "write": false },
+
+ "Wx" : { "bits": 5, "read": true , "write": true },
+ "Wx2" : { "bits": 5, "read": true , "write": true },
+ "Wdn" : { "bits": 5, "read": true , "write": true },
+ "Wd" : { "bits": 5, "read": false, "write": true },
+ "Wd2" : { "bits": 5, "read": false, "write": true },
+ "Ws" : { "bits": 5, "read": true , "write": false },
+ "Ws2" : { "bits": 5, "read": true , "write": false },
+ "Wn" : { "bits": 5, "read": true , "write": false },
+ "Wm" : { "bits": 5, "read": true , "write": false },
+ "Wa" : { "bits": 5, "read": true , "write": false },
+ "Wt" : { "bits": 5, "read": true , "write": false },
+ "Wt2" : { "bits": 5, "read": true , "write": false },
+
+ "Xx" : { "bits": 5, "read": true , "write": true },
+ "Xx2" : { "bits": 5, "read": true , "write": true },
+ "Xdn" : { "bits": 5, "read": true , "write": true },
+ "Xd" : { "bits": 5, "read": false, "write": true },
+ "Xd2" : { "bits": 5, "read": false, "write": true },
+ "Xs" : { "bits": 5, "read": true , "write": false },
+ "Xs2" : { "bits": 5, "read": true , "write": false },
+ "Xn" : { "bits": 5, "read": true , "write": false },
+ "Xm" : { "bits": 5, "read": true , "write": false },
+ "Xa" : { "bits": 5, "read": true , "write": false },
+ "Xt" : { "bits": 5, "read": true , "write": false },
+ "Xt2" : { "bits": 5, "read": true , "write": false },
+
+ "Bx" : { "bits": 5, "read": true , "write": true },
+ "Bx2" : { "bits": 5, "read": true , "write": true },
+ "Bdn" : { "bits": 5, "read": true , "write": true },
+ "Bd" : { "bits": 5, "read": false, "write": true },
+ "Bd2" : { "bits": 5, "read": false, "write": true },
+ "Bs" : { "bits": 5, "read": true , "write": false },
+ "Bs2" : { "bits": 5, "read": true , "write": false },
+ "Bn" : { "bits": 5, "read": true , "write": false },
+ "Bm" : { "bits": 5, "read": true , "write": false },
+ "Ba" : { "bits": 5, "read": true , "write": false },
+
+ "Hx" : { "bits": 5, "read": true , "write": true },
+ "Hx2" : { "bits": 5, "read": true , "write": true },
+ "Hdn" : { "bits": 5, "read": true , "write": true },
+ "Hd" : { "bits": 5, "read": false, "write": true },
+ "Hd2" : { "bits": 5, "read": false, "write": true },
+ "Hs" : { "bits": 5, "read": true , "write": false },
+ "Hs2" : { "bits": 5, "read": true , "write": false },
+ "Hn" : { "bits": 5, "read": true , "write": false },
+ "Hm" : { "bits": 5, "read": true , "write": false },
+ "Ha" : { "bits": 5, "read": true , "write": false },
+
+ "Sx" : { "bits": 5, "read": true , "write": true },
+ "Sx2" : { "bits": 5, "read": true , "write": true },
+ "Sdn" : { "bits": 5, "read": true , "write": true },
+ "Sd" : { "bits": 5, "read": false, "write": true },
+ "Sd2" : { "bits": 5, "read": false, "write": true },
+ "Ss" : { "bits": 5, "read": true , "write": false },
+ "Ss2" : { "bits": 5, "read": true , "write": false },
+ "Sn" : { "bits": 5, "read": true , "write": false },
+ "Sm" : { "bits": 5, "read": true , "write": false },
+ "Sa" : { "bits": 5, "read": true , "write": false },
+
+ "Dx" : { "bits": 5, "read": true , "write": true },
+ "Dx2" : { "bits": 5, "read": true , "write": true },
+ "Ddn" : { "bits": 5, "read": true , "write": true },
+ "Dd" : { "bits": 5, "read": false, "write": true },
+ "Dd2" : { "bits": 5, "read": false, "write": true },
+ "Ds" : { "bits": 5, "read": true , "write": false },
+ "Ds2" : { "bits": 5, "read": true , "write": false },
+ "Dn" : { "bits": 5, "read": true , "write": false },
+ "Dn2" : { "bits": 5, "read": true , "write": false },
+ "Dm" : { "bits": 5, "read": true , "write": false },
+ "Da" : { "bits": 5, "read": true , "write": false },
+
+ "Qx" : { "bits": 5, "read": true , "write": true },
+ "Qx2" : { "bits": 5, "read": true , "write": true },
+ "Qdn" : { "bits": 5, "read": true , "write": true },
+ "Qd" : { "bits": 5, "read": false, "write": true },
+ "Qd2" : { "bits": 5, "read": false, "write": true },
+ "Qs" : { "bits": 5, "read": true , "write": false },
+ "Qs2" : { "bits": 5, "read": true , "write": false },
+ "Qn" : { "bits": 5, "read": true , "write": false },
+ "Qn2" : { "bits": 5, "read": true , "write": false },
+ "Qm" : { "bits": 5, "read": true , "write": false },
+ "Qa" : { "bits": 5, "read": true , "write": false },
+
+ "Vx" : { "bits": 5, "read": true , "write": true },
+ "Vx2" : { "bits": 5, "read": true , "write": true },
+ "Vdn" : { "bits": 5, "read": true , "write": true },
+ "Vd" : { "bits": 5, "read": false, "write": true },
+ "Vd2" : { "bits": 5, "read": false, "write": true },
+ "Vs" : { "bits": 5, "read": true , "write": false },
+ "Vs2" : { "bits": 5, "read": true , "write": false },
+ "Vn" : { "bits": 5, "read": true , "write": false },
+ "Vm" : { "bits": 5, "read": true , "write": false },
+ "Va" : { "bits": 5, "read": true , "write": false },
+
+ "Zx" : { "bits": 5, "read": true , "write": true },
+ "Zx2" : { "bits": 5, "read": true , "write": true },
+ "Zda" : { "bits": 5, "read": true , "write": true },
+ "Zdn" : { "bits": 5, "read": true , "write": true },
+ "Zdn2" : { "bits": 5, "read": true , "write": true },
+ "Zd" : { "bits": 5, "read": false, "write": true },
+ "Zd2" : { "bits": 5, "read": false, "write": true },
+ "Zs" : { "bits": 5, "read": true , "write": false },
+ "Zs2" : { "bits": 5, "read": true , "write": false },
+ "Zn" : { "bits": 5, "read": true , "write": false },
+ "Zm" : { "bits": 5, "read": true , "write": false },
+ "Zk" : { "bits": 5, "read": true , "write": false },
+ "Za" : { "bits": 5, "read": true , "write": false },
+
+ "Pdn" : { "bits": 4, "read": true , "write": true },
+ "Pdm" : { "bits": 4, "read": true , "write": true },
+ "Pd" : { "bits": 4, "read": false, "write": true },
+ "Ps" : { "bits": 4, "read": true , "write": false },
+ "Pn" : { "bits": 4, "read": true , "write": false },
+ "Pm" : { "bits": 4, "read": true , "write": false },
+ "Pg" : { "bits": 4, "read": true , "write": false }
+};
+
+arm.FieldInfo = FieldInfo;
+
+// AArch64 utilities.
+class Utils {
+ static splitInstructionSignature(s) {
+ const names = s.match(/^[\w\|]+/)[0];
+ s = s.substring(names.length);
+
+ const opOffset = s.indexOf(" ")
+ const suffix = s.substring(0, opOffset).trim();
+ const operands = opOffset === -1 ? "" : s.substring(opOffset + 1).trim();
+
+ return {
+ names: names.split("|").map((base)=>{ return base + suffix}),
+ operands: operands
+ }
+ }
+
+ static parseShiftOrExtendOp(s) {
+ const space = s.indexOf(" ");
+ if (space === -1)
+ return "";
+
+ const ops = s.substring(0, space).trim();
+ for (let op of ops.split("|"))
+ if (!/^(sop|extend|lsl|lsr|asr|uxtw|sxtw|sxtx|mul)$/.test(op))
+ return "";
+
+ return ops;
+ }
+}
+arm.Utils = Utils;
+
+function normalizeNumber(n) {
+ return n < 0 ? 0x100000000 + n : n;
+}
+
+function decomposeOperand(s) {
+ let type = null;
+ let element = null;
+ let consecutive = 0;
+ let maskType = "";
+
+ const elementM = s.match(/\[#(\w+)\]$/);
+ if (elementM) {
+ element = elementM[1];
+ s = s.substring(0, s.length - elementM[0].length);
+ }
+
+ const typeM = s.match(/\.(\w+)$/);
+ if (typeM) {
+ type = typeM[1];
+ s = s.substring(0, s.length - typeM[0].length);
+ }
+
+ const maskM = s.match(/\/(M|Z|MZ)$/);
+ if (maskM) {
+ maskType = maskM[1];
+ s = s.substring(0, s.length - maskM[0].length);
+ }
+
+ if (s.endsWith("++")) {
+ consecutive = 2;
+ s = s.substring(0, s.length - 2);
+ }
+ else if (s.endsWith("+")) {
+ consecutive = 1;
+ s = s.substring(0, s.length - 1);
+ }
+
+ let m = s.match(/==|\!=|>=|<=|\*/);
+ let restrict = false;
+
+ if (m) {
+ restrict = s.substring(m.index);
+ s = s.substring(0, m.index);
+ }
+
+ return {
+ data : s,
+ maskType : maskType,
+ type : type,
+ element : element,
+ restrict : restrict,
+ consecutive: consecutive
+ };
+}
+
+function splitOpcodeFields(s) {
+ const arr = s.split("|");
+ const out = [];
+
+ for (let i = 0; i < arr.length; i++) {
+ const val = arr[i];
+ if (/^[0-1A-Z]{2,}$/.test(val))
+ out.push.apply(out, val.match(/([0-1]+)|[A-Z]/g));
+ else
+ out.push(val);
+ }
+
+ return out.map((field)=>{return field.trim(); });
+}
+
+// asmdb.aarch64.Operand
+// =====================
+
+// ARM operand.
+class Operand extends base.Operand {
+ constructor(def) {
+ super();
+ this.data = def;
+
+ // Register.
+ this.sp = ""; // GP register stack access: ["", "WSP" or "SP"].
+ this.mask = ""; // Masking specifier.
+ }
+
+ hasMemModes() {
+ return Object.keys(this.memModes).length !== 0;
+ }
+
+ get name() {
+ switch (this.type) {
+ case "reg": return this.reg;
+ case "mem": return this.mem;
+ case "imm": return this.imm;
+ case "rel": return this.rel;
+ default : return "";
+ }
+ }
+
+ get scale() {
+ if (this.restrict && this.restrict.startsWith("*"))
+ return parseInt(this.restrict.substring(1), 10);
+ else
+ return 0;
+ }
+}
+arm.Operand = Operand;
+
+// asmdb.aarch64.Instruction
+// =========================
+
+function patternFromOperand(key) { return key; }
+
+// ARM instruction.
+class Instruction extends base.Instruction {
+ constructor(db, data) {
+ super(db, data);
+
+ this.name = data.name;
+ this.it = dict(); // THUMB's 'it' flags.
+ this.apsr = dict();
+ this.fpcsr = dict();
+ this.calc = dict(); // Calculations required to generate opcode.
+ this.immCond = []; // Immediate value conditions (array of conditions).
+
+ this._assignOperands(data.operands);
+ this._assignOpcode(data.op);
+
+ for (let k in data) {
+ if (k === "name" || k == "op" || k === "operands")
+ continue;
+ this._assignAttribute(k, data[k]);
+ }
+
+ this._updateOperandsInfo();
+ this._postProcess();
+ }
+
+ _assignAttribute(key, value) {
+ switch (key) {
+ case "it":
+ for (let it of value.split(" "))
+ this.it[it.trim()] = true;
+ break;
+
+ case "apsr":
+ case "fpcsr":
+ this._assignAttributeKeyValue(key, value);
+ break;
+
+ case "imm":
+ this.imm = exp.parse(value);
+ break;
+
+ case "calc":
+ for (let calcKey in value)
+ this.calc[calcKey] = exp.parse(value[calcKey]);
+ break;
+
+ default:
+ super._assignAttribute(key, value);
+ }
+ }
+
+ _assignAttributeKeyValue(name, content) {
+ const attributes = content.trim().split(/[ ]+/);
+
+ for (let i = 0; i < attributes.length; i++) {
+ const attr = attributes[i].trim();
+ if (!attr)
+ continue;
+
+ const eq = attr.indexOf("=");
+ let key = eq === -1 ? attr : attr.substring(0, eq);
+ let val = eq === -1 ? true : attr.substring(eq + 1);
+
+ // If the key contains "|" it's a definition of multiple attributes.
+ if (key.indexOf("|") !== -1) {
+ const dot = key.indexOf(".");
+
+ const base = dot === -1 ? "" : key.substring(0, dot + 1);
+ const keys = (dot === -1 ? key : key.substring(dot + 1)).split("|");
+
+ for (let j = 0; j < keys.length; j++)
+ this[name][base + keys[j]] = val;
+ }
+ else {
+ this[name][key] = val;
+ }
+ }
+ }
+
+ _assignOperands(s) {
+ if (!s) return;
+
+ // Split into individual operands and push them to `operands`.
+ const arr = base.Parsing.splitOperands(s);
+ for (let i = 0; i < arr.length; i++) {
+ let def = arr[i].trim();
+ const op = new Operand(def);
+
+ const sp = def.match(/^(\w+)\|(SP|WSP)$/);
+ if (sp) {
+ def = sp[1];
+ op.sp = sp[2];
+ }
+
+ const consecutive = def.match(/(\d+)x\{(.*)\}([+]?[+]?)/);
+ if (consecutive)
+ def = consecutive[2];
+
+ op.sign = false;
+ op.element = null;
+ op.shiftOp = "";
+ op.shiftImm = null;
+ op.shiftCond = "";
+
+ // Handle {optional} attribute.
+ if (Parsing.isOptional(def)) {
+ op.optional = true;
+ def = Parsing.clearOptional(def);
+ }
+
+ // Handle commutativity <-> symbol.
+ if (Parsing.isCommutative(def)) {
+ op.commutative = true;
+ def = Parsing.clearCommutative(def);
+ }
+
+ // Handle shift operation.
+ let shiftOp = Utils.parseShiftOrExtendOp(def);
+ if (shiftOp) {
+ op.shiftOp = shiftOp;
+ def = def.substring(shiftOp.length + 1);
+ }
+
+ if (def.startsWith("[")) {
+ op.type = "mem";
+ op.memModes = dict();
+
+ op.base = null;
+ op.index = null;
+ op.offset = null;
+
+ let mem = def;
+ let didHaveMemMode = false;
+
+ for (;;) {
+ if (mem.endsWith("!")) {
+ op.memModes.preIndex = true;
+ mem = mem.substring(0, mem.length - 1);
+
+ didHaveMemMode = true;
+ break;
+ }
+
+ if (mem.endsWith("@")) {
+ op.memModes.postIndex = true;
+ mem = mem.substring(0, mem.length - 1);
+
+ didHaveMemMode = true;
+ break;
+ }
+
+ if (mem.endsWith("{!}")) {
+ op.memModes.offset = true;
+ op.memModes.preIndex = true;
+ mem = mem.substring(0, mem.length - 3);
+
+ didHaveMemMode = true;
+ continue;
+ }
+
+ if (mem.endsWith("{@}")) {
+ op.memModes.offset = true;
+ op.memModes.postIndex = true;
+ mem = mem.substring(0, mem.length - 3);
+
+ didHaveMemMode = true;
+ continue;
+ }
+
+ break;
+ }
+
+ if (!mem.endsWith("]"))
+ FAIL(`Unknown memory operand '${mem}' in '${def}'`);
+
+ let parts = mem.substring(1, mem.length - 1).split(",").map(function(s) { return s.trim() });
+ for (let i = 0; i < parts.length; i++) {
+ const part = parts[i];
+
+ const m = part.match(/^\{(([a-z]+)(\|[a-z]+)*)\s+#(\w+)\s*(\*\s*\d+\s*)?\}$/);
+ if (m) {
+ op.shiftOp = m[1];
+ op.shiftImm = m[2];
+ if (m[3])
+ op.shiftCond = m[3]
+ continue;
+ }
+
+ if (i === 0) {
+ op.base = dict();
+ op.base.field = part;
+ op.base.exp = null;
+
+ const m = part.match(/^([A-Za-z]\w*(?:\.\w+)?)/);
+ if (m && m[1].length < part.length) {
+ op.base.exp = exp.parse(part);
+ op.base.field = m[1];
+ }
+ }
+ else if (part.startsWith("#")) {
+ let p = part.substring(1);
+ let u = "1";
+
+ let offExp = null;
+ let offMul = 1;
+
+ if (p.startsWith("+/-")) {
+ u = "U";
+ p = p.substring(3);
+ }
+
+ const expMatch = p.match(/^([A-Za-z]\w*)==/);
+ if (expMatch) {
+ offExp = exp.parse(p);
+ p = p.substring(0, expMatch[1].length);
+ }
+
+ const mulMatch = p.match(/\s*\*\s*(\d+)$/);
+ if (mulMatch) {
+ offMul = parseInt(mulMatch[1]);
+ p = p.substring(0, mulMatch.index);
+ }
+
+ op.offset = dict();
+ op.offset.field = p;
+ op.offset.u = u;
+ op.offset.exp = offExp;
+ op.offset.mul = offMul;
+ }
+ else {
+ let p = part;
+ let u = "1";
+
+ if (p.startsWith("+/-")) {
+ u = "U";
+ p = p.substring(3);
+ }
+
+ op.index = dict();
+ op.index.field = p;
+ op.index.u = u;
+
+ const m = p.match(/^([A-Za-z\|]\w*(?:\.\w+)?)/);
+ if (m && m[1].length < p.length) {
+ op.index.exp = exp.parse(p);
+ op.index.field = m[1];
+ }
+ }
+ }
+
+ if (!op.hasMemModes() && (op.offset || op.index))
+ op.memModes.offset = true;
+
+ op.mem = mem;
+ }
+ else if (def.startsWith("#")) {
+ const obj = decomposeOperand(def);
+ const imm = obj.data;
+
+ op.type = "imm";
+ op.imm = imm.substring(1); // Immediate operand name.
+ op.immSize = 0; // Immediate size in bits.
+ op.restrict = obj.restrict; // Immediate condition.
+ }
+ else {
+ // Some instructions use Reg! to specify that the register increments.
+ if (def.endsWith("!")) {
+ def = def.substring(0, def.length - 1)
+ op.regInc = true
+ }
+
+ const obj = decomposeOperand(def);
+ const reg = obj.data;
+
+ const type = reg.substring(0, 1).toLowerCase();
+ const info = FieldInfo[reg];
+
+ if (!info)
+ FAIL(`Unknown register operand '${reg}' in '${def}'`);
+
+ op.type = info.list ? "reg-list" : "reg";
+ op.reg = reg; // Register name (as specified in manual).
+ op.regType = type; // Register type.
+ op.regList = !!info.list; // Register list.
+ op.maskType = obj.maskType; // Mask type.
+ op.elementType = obj.type // Element type or t, ta, tb.
+ op.read = info.read; // Register access (read).
+ op.write = info.write; // Register access (write).
+ op.element = obj.element; // Register element[] access.
+ op.restrict = obj.restrict; // Register condition.
+ op.consecutive = obj.consecutive;
+ }
+
+ this.operands.push(op);
+
+ if (consecutive) {
+ const count = parseInt(consecutive[1]);
+ for (let n = 2; n <= count; n++) {
+ const def = consecutive[3].replace(op.reg, op.reg + n);
+ const opN = new Operand(def);
+ opN.type = "reg";
+ opN.reg = op.reg + n;
+ opN.regType = op.regType;
+ opN.read = op.read;
+ opN.write = op.write;
+ opN.element = op.element;
+ opN.consecutive = consecutive[3].length;
+ opN.artificial = true;
+ this.operands.push(opN);
+ }
+ }
+ }
+ }
+
+ _assignOpcode(s) {
+ this.opcodeString = s;
+
+ let opcodeIndex = 0;
+ let opcodeValue = 0;
+
+ let patternMap = {};
+
+ // Split opcode into its fields.
+ const arr = splitOpcodeFields(s);
+ const dup = dict();
+
+ const fields = this.fields;
+ const pattern = [];
+
+ const fieldMap = Object.create(null);
+ for (let field of arr) {
+ fieldMap[field] = true;
+ }
+
+ for (let i = arr.length - 1; i >= 0; i--) {
+ let key = arr[i].trim();
+ let m;
+
+ if (/^[0-1]+$/.test(key)) {
+ // This part of the opcode is RAW bits, they contribute to the `opcodeValue`.
+ opcodeValue |= parseInt(key, 2) << opcodeIndex;
+ opcodeIndex += key.length;
+ pattern.unshift("_".repeat(key.length));
+ }
+ else {
+ pattern.unshift(patternFromOperand(key));
+ patternMap[patternFromOperand(key)] = true;
+
+ let size = 0;
+ let mask = 0;
+ let bits = 0;
+ let from = -1;
+
+ let lbit = key.startsWith("'");
+ let hbit = key.endsWith("'");
+
+ if ((m = key.match(/\[\s*(\d+)\s*\:\s*(\d+)\s*\]$/))) {
+ const a = parseInt(m[1], 10);
+ const b = parseInt(m[2], 10);
+ if (a < b)
+ FAIL(`Invalid bit range '${key}' in opcode '${s}'`);
+ from = b;
+ size = a - b + 1;
+ mask = ((1 << size) - 1) << b;
+ key = key.substring(0, m.index).trim();
+ }
+ else if ((m = key.match(/\[\s*(\d+)\s*\]$/))) {
+ from = parseInt(m[1], 10);
+ size = 1;
+ mask = 1 << from;
+ key = key.substring(0, m.index).trim();
+ }
+ else if ((m = key.match(/\:\s*(\d+)$/))) {
+ size = parseInt(m[1], 10);
+ bits = size;
+ key = key.substring(0, m.index).trim();
+ }
+ else {
+ const key_ = key;
+
+ if (lbit || hbit) {
+ from = 0;
+
+ if (lbit && hbit)
+ FAIL(`Couldn't recognize the format of '${key}' in opcode '${s}'`);
+
+ if (lbit) {
+ key = key.substring(1);
+ }
+
+ if (hbit) {
+ key = key.substring(0, key.length - 1);
+ from = 4;
+ }
+
+ size = 1;
+ }
+ else if (FieldInfo[key]) {
+ // Sizes of some standard fields can be assigned automatically.
+ size = FieldInfo[key].bits;
+ bits = size;
+
+ if (fieldMap["'" + key])
+ from = 1;
+ }
+ else if (key.length === 1) {
+ // Sizes of one-letter fields (like 'U', 'F', etc...) is 1 if not specified.
+ size = 1;
+ bits = 1;
+ }
+ else {
+ FAIL(`Couldn't recognize the size of '${key}' in opcode '${s}'`);
+ }
+
+ if (dup[key_] === true) {
+ bits = 0;
+ lbit = 0;
+ hbit = 0;
+ }
+ else {
+ dup[key_] = true;
+ }
+ }
+
+ let field = fields[key];
+ if (!field) {
+ field = {
+ index: opcodeIndex,
+ values: [],
+ bits: 0,
+ mask: 0,
+ lbit: 0,
+ hbit: 0 // Only 1 if a single quote (') was used.
+ }
+ fields[key] = field;
+ }
+
+ if (from === -1)
+ from = field.bits;
+
+ field.mask |= mask;
+ field.bits += bits;
+ field.lbit += lbit;
+ field.hbit += hbit;
+ field.values.push({
+ index: opcodeIndex,
+ from: from,
+ size: size
+ });
+
+ opcodeIndex += size;
+ }
+ }
+
+ for (let i = 0; i < pattern.length; i++)
+ if (pattern[i] === 'U')
+ pattern[i] = "_";
+
+ // Normalize all fields.
+ for (let key in fields) {
+ const field = fields[key];
+
+ // There should be either number of bits or mask, there shouldn't be both.
+ if (!field.bits && !field.mask)
+ FAIL(`Part '${key}' of opcode '${s}' contains neither size nor mask`);
+
+ if (field.bits && field.mask)
+ FAIL(`Part '${key}' of opcode '${s}' contains both size and mask`);
+
+ if (field.bits)
+ field.mask = ((1 << field.bits) - 1);
+ else if (field.mask)
+ field.bits = 32 - Math.clz32(field.mask);
+
+ // Handle field that used single-quote.
+ if (field.lbit) {
+ field.mask = (field.mask << 1) | 0x1;
+ field.bits++;
+ }
+
+ if (field.hbit) {
+ field.mask |= 1 << field.bits;
+ field.bits++;
+ }
+
+ const op = this.operandByName(key);
+ if (op && op.isImm())
+ op.immSize = field.bits;
+ }
+
+ // Check if the opcode value has the correct number of bits.
+ if (opcodeIndex !== 32)
+ FAIL(`The number of bits '${opcodeIndex}' used by the opcode '${s}' doesn't match 32`);
+ this.opcodeValue = normalizeNumber(opcodeValue);
+ }
+
+ _assignSpecificAttribute(key, value) {
+ switch (key) {
+ case "it": {
+ const values = String(value).split("|");
+ for (let i = 0; i < values.length; i++) {
+ const value = values[i];
+ switch (value) {
+ case "in" : this.it.IN = true; break;
+ case "out" : this.it.OUT = true; break;
+ case "any" : this.it.IN = true;
+ this.it.OUT = true; break;
+ case "last": this.it.LAST = true; break;
+ case "def" : this.it.DEF = true; break;
+ default:
+ this.report(`${this.name}: Unhandled IT value '${value}'`);
+ }
+ }
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ _postProcess() {}
+
+ operandByName(name) {
+ const operands = this.operands;
+ for (let i = 0; i < operands.length; i++) {
+ const op = operands[i];
+ if (op.name === name)
+ return op;
+ }
+ return null;
+ }
+}
+arm.Instruction = Instruction;
+
+// asmdb.aarch64.ISA
+// =================
+
+function mergeGroupData(data, group) {
+ for (let k in group) {
+ switch (k) {
+ case "group":
+ case "data":
+ break;
+
+ case "ext":
+ data[k] = (data[k] ? data[k] + " " : "") + group[k];
+ break;
+
+ default:
+ if (data[k] === undefined)
+ data[k] = group[k]
+ break;
+ }
+ }
+}
+
+class ISA extends base.ISA {
+ constructor(data) {
+ super(data);
+ this.addData(data || NONE);
+ }
+
+ _addInstructions(groups) {
+ for (let group of groups) {
+ for (let instructions of group.data) {
+ const sgn = Utils.splitInstructionSignature(instructions.inst);
+ const data = MapUtils.cloneExcept(instructions, { "inst": true });
+
+ mergeGroupData(data, group)
+
+ for (let j = 0; j < sgn.names.length; j++) {
+ data.name = sgn.names[j];
+ data.operands = sgn.operands;
+ if (j > 0)
+ data.aliasOf = sgn.names[0];
+ this._addInstruction(new Instruction(this, data));
+ }
+ }
+ }
+
+ return this;
+ }
+}
+arm.ISA = ISA;
+
+}).apply(this, typeof module === "object" && module && module.exports
+ ? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "aarch64"]);
diff --git a/3rdparty/asmjit/db/base.js b/3rdparty/asmjit/db/base.js
new file mode 100644
index 00000000000..38bec54819c
--- /dev/null
+++ b/3rdparty/asmjit/db/base.js
@@ -0,0 +1,707 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+(function($scope, $as) {
+"use strict";
+
+function FAIL(msg) { throw new Error("[BASE] " + msg); }
+
+const exp = $scope.exp ? $scope.exp : require("./exp.js");
+
+// Export.
+const base = $scope[$as] = Object.create(null);
+
+base.exp = exp;
+
+function dict(src) {
+ const dst = Object.create(null);
+ if (src)
+ Object.assign(dst, src);
+ return dst;
+}
+base.dict = dict;
+const NONE = base.NONE = Object.freeze(dict());
+
+// asmdb.base.Symbols
+// ==================
+
+const Symbols = Object.freeze({
+ Commutative: '~'
+});
+base.Symbols = Symbols;
+
+// asmdb.base.Parsing
+// ==================
+
+// Namespace that provides functions related to text parsing.
+const Parsing = {
+ // Get whether the string `s` representing an operand is <implicit>.
+ isImplicit: function(s) { return s.startsWith("<") && s.endsWith(">"); },
+
+ // Clear <implicit> attribute from the given operand string `s`.
+ clearImplicit: function(s) { return s.substring(1, s.length - 1); },
+
+ // Get whether the string `s` representing an operand is {optional}.
+ isOptional: function(s) { return s.startsWith("{") && s.endsWith("}"); },
+
+ // Clear {optional} attribute from the given operand string `s`.
+ clearOptional: function(s) { return s.substring(1, s.length - 1); },
+
+ // Get whether the string `s` representing an operand specifies commutativity.
+ isCommutative: function(s) { return s.length > 0 && s.charAt(0) === Symbols.Commutative; },
+
+ // Clear commutative attribute from the given operand string `s`.
+ clearCommutative: function(s) { return s.substring(1); },
+
+ // Matches a closing bracket in string `s` starting `from` the given index.
+ // It behaves like `s.indexOf()`, but uses a counter and skips all nested
+ // matches.
+ matchClosingChar: function(s, from) {
+ const len = s.length;
+ const opening = s.charCodeAt(from);
+ const closing = opening === 40 ? 31 : // ().
+ opening === 60 ? 62 : // <>.
+ opening === 91 ? 93 : // [].
+ opening === 123 ? 125 : 0; // {}.
+
+ let i = from;
+ let pending = 1;
+ do {
+ if (++i >= len)
+ break;
+
+ const c = s.charCodeAt(i);
+ pending += Number(c === opening);
+ pending -= Number(c === closing);
+ } while (pending);
+
+ return i;
+ },
+
+ // Split instruction operands into an array containing each operand as a
+ // trimmed string. This function is similar to `s.split(",")`, however,
+ // it matches brackets inside the operands and won't just blindly split
+ // the string based on "," token. If operand contains metadata or it's
+ // an address it would still be split correctly.
+ splitOperands: function(s) {
+ const result = [];
+
+ s = s.trim();
+ if (!s)
+ return result;
+
+ let start = 0;
+ let i = 0;
+ let c = "";
+
+ for (;;) {
+ if (i === s.length || (c = s[i]) === ",") {
+ const op = s.substring(start, i).trim();
+ if (!op)
+ FAIL(`Found empty operand in '${s}'`);
+
+ result.push(op);
+ if (i === s.length)
+ return result;
+
+ start = ++i;
+ continue;
+ }
+
+ if ((c === "<" || c === ">") && i != start) {
+ i++;
+ continue;
+ }
+
+ if (c === "[" || c === "{" || c === "(" || c === "<")
+ i = base.Parsing.matchClosingChar(s, i);
+ else
+ i++;
+ }
+ }
+}
+base.Parsing = Parsing;
+
+// asmdb.base.MapUtils
+// ===================
+
+class MapUtils {
+ static cloneExcept(map, except) {
+ if (typeof except === "string") {
+ const key = except;
+ except = Object.create(null);
+ except[key] = true;
+ }
+
+ const out = Object.create(null);
+ for (let k in map) {
+ if (k in except)
+ continue
+ out[k] = map[k];
+ }
+ return out;
+ }
+
+ static mapFromArray(array) {
+ const out = Object.create(null);
+ for (let k of array) {
+ out[k] = true;
+ }
+ return out;
+ }
+};
+base.MapUtils = MapUtils;
+
+// asmdb.base.Operand
+// ==================
+
+const OperandFlags = Object.freeze({
+ Optional : 0x00000001,
+ Implicit : 0x00000002,
+ Commutative: 0x00000004,
+ ZExt : 0x00000008,
+ ReadAccess : 0x00000010,
+ WriteAccess: 0x00000020
+});
+base.OperandFlags = OperandFlags;
+
+class Operand {
+ constructor() {
+ this.type = ""; // Type of the operand ("reg", "reg-list", "mem", "reg/mem", "imm", "rel").
+ this.data = ""; // The operand's data (possibly processed).
+ this.flags = 0;
+
+ this.reg = ""; // Register operand's definition.
+ this.mem = ""; // Memory operand's definition.
+ this.imm = 0; // Immediate operand's size.
+ this.rel = 0; // Relative displacement operand's size.
+
+ this.restrict = ""; // Operand is restricted (specific register or immediate value).
+ this.read = false; // True if the operand is a read-op from reg/mem.
+ this.write = false; // True if the operand is a write-op to reg/mem.
+
+ this.regType = ""; // Register operand's type.
+ this.regIndexRel = 0; // Register index is relative to the previous register operand index (0 if not).
+ this.memSize = -1; // Memory operand's size.
+ this.immSign = ""; // Immediate sign (any / signed / unsigned).
+ this.immValue = null; // Immediate value - `null` or `1` (only used by shift/rotate instructions).
+
+ this.rwxIndex = -1; // Read/Write (RWX) index.
+ this.rwxWidth = -1; // Read/Write (RWX) width.
+ }
+
+ _getFlag(flag) {
+ return (this.flags & flag) != 0;
+ }
+
+ _setFlag(flag, value) {
+ this.flags = (this.flags & ~flag) | (value ? flag : 0);
+ return this;
+ }
+
+ get optional() { return this._getFlag(OperandFlags.Optional); }
+ set optional(value) { this._setFlag(OperandFlags.Optional, value); }
+
+ get implicit() { return this._getFlag(OperandFlags.Implicit); }
+ set implicit(value) { this._setFlag(OperandFlags.Implicit, value); }
+
+ get commutative() { return this._getFlag(OperandFlags.Commutative); }
+ set commutative(value) { this._setFlag(OperandFlags.Commutative, value); }
+
+ get zext() { return this._getFlag(OperandFlags.ZExt); }
+ set zext(value) { this._setFlag(OperandFlags.ZExt, value); }
+
+ toString() { return this.data; }
+
+ isReg() { return !!this.reg && this.type !== "reg-list"; }
+ isMem() { return !!this.mem; }
+ isImm() { return !!this.imm; }
+ isRel() { return !!this.rel; }
+
+ isRegMem() { return this.reg && this.mem; }
+ isRegOrMem() { return !!this.reg || !!this.mem; }
+
+ isRegList() { return this.type === "reg-list" }
+ isPartialOp() { return false; }
+}
+base.Operand = Operand;
+
+// asmdb.base.Instruction
+// ======================
+
+// Defines interface and properties that each architecture dependent instruction
+// must provide even if that particular architecture doesn't use that feature(s).
+class Instruction {
+ constructor(db) {
+ Object.defineProperty(this, "db", { value: db });
+
+ this.name = ""; // Instruction name.
+ this.arch = "ANY"; // Architecture.
+ this.encoding = ""; // Encoding type.
+ this.operands = []; // Instruction operands.
+
+ this.implicit = 0; // Indexes of all implicit operands (registers / memory).
+ this.commutative = 0; // Indexes of all commutative operands.
+
+ this.opcodeString = ""; // Instruction opcode as specified in manual.
+ this.opcodeValue = 0; // Instruction opcode as number (arch dependent).
+ this.fields = dict(); // Information about each opcode field (arch dependent).
+ this.operations = dict(); // Operations the instruction performs.
+
+ this.io = dict(); // Instruction input / output (CPU flags, states, and other registers).
+ this.ext = dict(); // ISA extensions required by the instruction.
+ this.category = dict(); // Instruction categories.
+
+ this.specialRegs = dict(); // Information about read/write to special registers.
+
+ this.alt = false; // This is an alternative form, not needed to create a signature.
+ this.volatile = false; // Instruction is volatile and should not be reordered.
+ this.control = "none"; // Control flow type (none by default).
+ this.privilege = ""; // Privilege-level required to execute the instruction.
+ this.aliasOf = ""; // Instruction is an alias of another instruction
+ }
+
+ get extArray() {
+ const out = Object.keys(this.ext);
+ out.sort();
+ return out;
+ }
+
+ get operandCount() {
+ return this.operands.length;
+ }
+
+ get minimumOperandCount() {
+ const count = this.operands.length;
+ for (let i = 0; i < count; i++) {
+ if (this.operands[i].optional) {
+ return i;
+ }
+ }
+ return count
+ }
+
+ _assignAttribute(key, value) {
+ switch (key) {
+ case "ext":
+ case "io":
+ case "category":
+ return this._combineAttribute(key, value);
+
+ default:
+ if (typeof this[key] === undefined)
+ FAIL(`Cannot assign ${key}=${value}`);
+ this[key] = value;
+ break;
+ }
+ }
+
+ _combineAttribute(key, value) {
+ if (typeof value === "string")
+ value = value.split(" ");
+
+ if (Array.isArray(value)) {
+ for (let v of value) {
+ let pKeys = v;
+ let pValue = true;
+
+ const i = v.indexOf("=");
+ if (i !== -1) {
+ pValue = v.substring(i + 1);
+ pKeys = v.substring(0, i).trim();
+ }
+
+ for (let pk of pKeys.trim().split("|").map(function(s) { return s.trim(); })) {
+ this[key][pk] = pValue;
+ }
+ }
+ }
+ else {
+ for (let k in value)
+ this[key][k] = value[k];
+ }
+ }
+
+ _updateOperandsInfo() {
+ this.implicit = 0;
+ this.commutative = 0;
+
+ for (let i = 0; i < this.operands.length; i++) {
+ const op = this.operands[i];
+
+ if (op.implicit) this.implicit |= (1 << i);
+ if (op.commutative) this.commutative |= (1 << i);
+ }
+ }
+
+ isAlias() { return !!this.aliasOf; }
+ isCommutative() { return this.commutative !== 0; }
+
+ hasImplicit() { return this.implicit !== 0; }
+
+ hasAttribute(name, matchValue) {
+ const value = this[name];
+ if (value === undefined)
+ return false;
+
+ if (matchValue === undefined)
+ return true;
+
+ return value === matchValue;
+ }
+
+ report(msg) {
+ console.log(`${this}: ${msg}`);
+ }
+
+ toString() {
+ return `${this.name} ${this.operands.join(", ")}`;
+ }
+}
+base.Instruction = Instruction;
+
+// asmdb.base.InstructionGroup
+// ===========================
+
+// Instruction group is simply array of function that has some additional
+// functionality.
+class InstructionGroup extends Array {
+ constructor() {
+ super();
+
+ if (arguments.length === 1) {
+ const a = arguments[0];
+ if (Array.isArray(a)) {
+ for (let i = 0; i < a.length; i++)
+ this.push(a[i]);
+ }
+ }
+ }
+
+ unionCpuFeatures(name) {
+ const result = dict();
+ for (let i = 0; i < this.length; i++) {
+ const instruction = this[i];
+ const features = instruction.ext;
+ for (let k in features)
+ result[k] = features[k];
+ }
+ return result;
+ }
+
+ checkAttribute(key, value) {
+ let n = 0;
+ for (let i = 0; i < this.length; i++)
+ n += Number(this[i][key] === value);
+ return n;
+ }
+}
+base.InstructionGroup = InstructionGroup;
+
+const EmptyInstructionGroup = Object.freeze(new InstructionGroup());
+
+// asmdb.base.ISA
+// ==============
+
+class ISA {
+ constructor() {
+ this._instructions = null; // Instruction array (contains all instructions).
+ this._instructionNames = null; // Instruction names (sorted), regenerated when needed.
+ this._instructionMap = dict(); // Instruction name to `Instruction[]` mapping.
+ this._aliases = dict(); // Instruction aliases.
+ this._aliasMap = dict(); // Instruction aliases.
+ this._cpuLevels = dict(); // Architecture versions.
+ this._extensions = dict(); // Architecture extensions.
+ this._attributes = dict(); // Instruction attributes.
+ this._specialRegs = dict(); // Special registers.
+ this._shortcuts = dict(); // Shortcuts used by instructions metadata.
+ this.stats = {
+ instructions : 0, // Number of all instructions.
+ groups: 0 // Number of grouped instructions (having unique name).
+ };
+ }
+
+ get instructions() {
+ let array = this._instructions;
+ if (array === null) {
+ array = [];
+ const map = this.instructionMap;
+ const names = this.instructionNames;
+ for (let i = 0; i < names.length; i++)
+ array.push.apply(array, map[names[i]]);
+ this._instructions = array;
+ }
+ return array;
+ }
+
+ get instructionNames() {
+ let names = this._instructionNames;
+ if (names === null) {
+ names = Object.keys(this._instructionMap);
+ names.sort();
+ this._instructionNames = names;
+ }
+ return names;
+ }
+
+ get instructionMap() { return this._instructionMap; }
+ get aliases() { return this._aliasMap; }
+ get cpuLevels() { return this._cpuLevels; }
+ get extensions() { return this._extensions; }
+ get attributes() { return this._attributes; }
+ get specialRegs() { return this._specialRegs; }
+ get shortcuts() { return this._shortcuts; }
+
+ query(args, copy) {
+ if (typeof args !== "object" || !args || Array.isArray(args))
+ return this._queryByName(args, copy);
+
+ const filter = args.filter;
+ if (filter)
+ copy = false;
+
+ let result = this._queryByName(args.name, copy);
+ if (filter)
+ result = result.filter(filter, args.filterThis);
+
+ return result;
+ }
+
+ aliasData(name) {
+ return this._aliases[name] || null;
+ }
+
+ _queryByName(name, copy) {
+ let result = EmptyInstructionGroup;
+ const map = this._instructionMap;
+
+ if (typeof name === "string") {
+ const instructions = map[name];
+ if (instructions) result = instructions;
+ return copy ? result.slice() : result;
+ }
+
+ if (Array.isArray(name)) {
+ const names = name;
+ for (let i = 0; i < names.length; i++) {
+ const instructions = map[names[i]];
+ if (!instructions) continue;
+
+ if (result === EmptyInstructionGroup)
+ result = new InstructionGroup();
+
+ for (let j = 0; j < instructions.length; j++)
+ result.push(instructions[j]);
+ }
+ return result;
+ }
+
+ result = this.instructions;
+ return copy ? result.slice() : result;
+ }
+
+ forEachGroup(cb, thisArg) {
+ const map = this._instructionMap;
+ const names = this.instructionNames;
+
+ for (let i = 0; i < names.length; i++) {
+ const name = names[i];
+ cb.call(thisArg, name, map[name]);
+ }
+
+ return this;
+ }
+
+ addData(data) {
+ if (typeof data !== "object" || !data)
+ FAIL("ISA.addData(): data argument must be object");
+
+ if (data.cpuLevels) this._addCpuLevels(data.cpuLevels);
+ if (data.specialRegs) this._addSpecialRegs(data.specialRegs);
+ if (data.shortcuts) this._addShortcuts(data.shortcuts);
+ if (data.instructions) this._addInstructions(data.instructions);
+ if (data.aliases) this._addAliases(data.aliases);
+ if (data.postproc) this._postProc(data.postproc);
+ }
+
+ _postProc(groups) {
+ for (let group of groups) {
+ for (let iRule of group.instructions) {
+ const names = iRule.name.split(" ");
+ for (let name of names) {
+ const instructions = this._instructionMap[name];
+ if (!instructions)
+ FAIL(`Instruction ${name} referenced by '${group.group}' group doesn't exist`);
+
+ for (let k in iRule) {
+ if (k === "name" || k === "data")
+ continue;
+ for (let instruction of instructions) {
+ instruction._assignAttribute(k, iRule[k]);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ _addCpuLevels(items) {
+ if (!Array.isArray(items))
+ FAIL("Property 'cpuLevels' must be array");
+
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+ const name = item.name;
+
+ const obj = {
+ name: name
+ };
+
+ this._cpuLevels[name] = obj;
+ }
+ }
+
+ _addExtensions(items) {
+ if (!Array.isArray(items))
+ FAIL("Property 'extensions' must be array");
+
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+ const name = item.name;
+
+ const obj = {
+ name: name,
+ from: item.from || ""
+ };
+
+ this._extensions[name] = obj;
+ }
+ }
+
+ _addAttributes(items) {
+ if (!Array.isArray(items))
+ FAIL("Property 'attributes' must be array");
+
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+ const name = item.name;
+ const type = item.type;
+
+ if (!/^(?:flag|string|string\[\])$/.test(type))
+ FAIL(`Unknown attribute type '${type}'`);
+
+ const obj = {
+ name: name,
+ type: type,
+ doc : item.doc || ""
+ };
+
+ this._attributes[name] = obj;
+ }
+ }
+
+ _addSpecialRegs(items) {
+ if (!Array.isArray(items))
+ FAIL("Property 'specialRegs' must be array");
+
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+ const name = item.name;
+
+ const obj = {
+ name : name,
+ group: item.group || name,
+ doc : item.doc || ""
+ };
+
+ this._specialRegs[name] = obj;
+ }
+ }
+
+ _addShortcuts(items) {
+ if (!Array.isArray(items))
+ FAIL("Property 'shortcuts' must be array");
+
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+ const name = item.name;
+ const expand = item.expand;
+
+ if (!name || !expand)
+ FAIL("Shortcut must contain 'name' and 'expand' properties");
+
+ const obj = {
+ name : name,
+ expand: expand,
+ doc : item.doc || ""
+ };
+
+ this._shortcuts[name] = obj;
+ }
+ }
+
+ _addInstructions(instructions) {
+ FAIL("ISA._addInstructions() must be reimplemented");
+ }
+
+ _addInstruction(instruction) {
+ let group;
+
+ if (Object.hasOwn(this._instructionMap, instruction.name)) {
+ group = this._instructionMap[instruction.name];
+ }
+ else {
+ group = new InstructionGroup();
+ this._instructionNames = null;
+ this._instructionMap[instruction.name] = group;
+ this.stats.groups++;
+ }
+
+ if (instruction.aliasOf) {
+ this._addAlias(instruction.name, instruction.aliasOf);
+ }
+
+ group.push(instruction);
+ this.stats.instructions++;
+ this._instructions = null;
+
+ return this;
+ }
+
+ // Add aliases from instruction database - aliases must be an object where each key is a non-aliased instruction.
+ _addAliases(aliases) {
+ for (let instructionName in aliases) {
+ const data = aliases[instructionName];
+ for (let aliasName of data.aliases) {
+ this._addAlias(instructionName, aliasName, data.format || "");
+ }
+ }
+ }
+
+ _addAlias(instructionName, aliasName, aliasFormat) {
+ const group = this._instructionMap[instructionName];
+ if (!group) {
+ FAIL(`Instruction ${instructionName} doesn't exist when processing alias (${aliasName})`);
+ }
+
+ let alias = this._aliases[instructionName];
+ if (!alias) {
+ alias = dict({
+ primaryName: instructionName,
+ aliasNames: [],
+ format: ""
+ });
+ this._aliases[instructionName] = alias;
+ }
+
+ this._aliasMap[aliasName] = instructionName;
+ alias.aliasNames.push(aliasName);
+ alias.format = aliasFormat || "";
+ }
+}
+base.ISA = ISA;
+
+}).apply(this, typeof module === "object" && module && module.exports
+ ? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "base"]);
diff --git a/3rdparty/asmjit/db/exp.js b/3rdparty/asmjit/db/exp.js
new file mode 100644
index 00000000000..32674b78762
--- /dev/null
+++ b/3rdparty/asmjit/db/exp.js
@@ -0,0 +1,760 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+(function($scope, $as) {
+"use strict";
+
+// Supported Operators
+// -------------------
+
+const kUnaryOperators = {
+ "-": {prec: 3, rtl : 1, emit: "-@1" },
+ "~": {prec: 3, rtl : 1, emit: "~@1" },
+ "!": {prec: 3, rtl : 1, emit: "!@1" }
+};
+
+const kBinaryOperators = {
+ "*" : { prec: 5, rtl : 0, emit: "@1 * @2" },
+ "/" : { prec: 5, rtl : 0, emit: "@1 / @2" },
+ "%" : { prec: 5, rtl : 0, emit: "@1 % @2" },
+ "+" : { prec: 6, rtl : 0, emit: "@1 + @2" },
+ "-" : { prec: 6, rtl : 0, emit: "@1 - @2" },
+ ">>": { prec: 7, rtl : 0, emit: "@1 >> @2" },
+ "<<": { prec: 7, rtl : 0, emit: "@1 << @2" },
+ "<" : { prec: 9, rtl : 0, emit: "@1 < @2" },
+ ">" : { prec: 9, rtl : 0, emit: "@1 > @2" },
+ "<=": { prec: 9, rtl : 0, emit: "@1 <= @2" },
+ ">=": { prec: 9, rtl : 0, emit: "@1 >= @2" },
+ "==": { prec:10, rtl : 0, emit: "@1 == @2" },
+ "!=": { prec:10, rtl : 0, emit: "@1 != @2" },
+ "&" : { prec:11, rtl : 0, emit: "@1 & @2" },
+ "^" : { prec:12, rtl : 0, emit: "@1 ^ @2" },
+ "|" : { prec:13, rtl : 0, emit: "@1 | @2" },
+ "&&": { prec:14, rtl : 0, emit: "@1 && @2" },
+ "||": { prec:15, rtl : 0, emit: "@1 || @2" },
+ "?" : { prec:16, rtl : 0, emit: "@1 ? @2" },
+ ":" : { prec:16, rtl : 0, emit: "@1 : @2" }
+};
+
+const kMaxOperatorLen = 4;
+
+function rightAssociate(info, bPrec) {
+ return info.prec > bPrec || (info.prec === bPrec && info.rtl);
+}
+
+// Expression Error
+// ----------------
+
+// Contains `message` and `position` members. If the `position` is not `-1` then it is
+// a zero-based index, which points to a first character of the token near the error.
+class ExpressionError extends Error {
+ constructor(message, position) {
+ super(message);
+ this.name = "ExpressionError";
+ this.message = message;
+ this.position = position != null ? position : -1;
+ }
+}
+
+function throwTokenizerError(token) {
+ throw new ExpressionError(`Unexpected token '${token.data}'`, token.position);
+}
+
+function throwExpressionError(message, position) {
+ throw new ExpressionError(message, position);
+}
+
+// Expression Tree
+// ---------------
+
+function mustEnclose(node) {
+ return node.isUnary() ? node.child.isOperator() : node.isBinary() ? true : false;
+}
+
+class ExpNode {
+ constructor(type) { this.type = type; }
+
+ isImm() { return this.type === "imm"; }
+ isVar() { return this.type === "var"; }
+ isCall() { return this.type === "call"; }
+ isUnary() { return this.type === "unary"; }
+ isBinary() { return this.type === "binary"; }
+ isOperator() { return this.type === "unary" || this.type === "binary"; }
+
+ info() { return null; }
+ clone() { throw new Error("ExpNode.clone() must be overridden"); }
+ evaluate(ctx) { throw new Error("ExpNode.evaluate() must be overridden"); }
+ toString(ctx) { throw new Error("ExpNode.toString() must be overridden"); }
+}
+
+class ImmNode extends ExpNode {
+ constructor(imm) {
+ super("imm");
+ this.imm = imm || 0;
+ }
+
+ clone() { return new ImmNode(this.imm); }
+ evaluate(ctx) { return this.imm; }
+ toString(ctx) { return ctx ? ctx.stringifyImmediate(this.imm) : String(this.imm); }
+}
+
+class VarNode extends ExpNode {
+ constructor(name) {
+ super("var");
+ this.name = name || "";
+ }
+
+ clone() { return new VarNode(this.name); }
+ evaluate(ctx) { return ctx.variable(this.name); }
+ toString(ctx) { return ctx ? ctx.stringifyVariable(this.name) : String(this.name); }
+}
+
+class CallNode extends ExpNode {
+ constructor(name, args) {
+ super("call");
+ this.name = name || "";
+ this.args = args || [];
+ }
+
+ clone() {
+ return new CallNode(this.name, this.args.map(function(arg) { return arg.clone(); }));
+ }
+
+ evaluate(ctx) {
+ const evaluatedArgs = this.args.map(function(arg) { return arg.evaluate(ctx); });
+ return ctx.function(this.name, evaluatedArgs);
+ }
+
+ toString(ctx) {
+ if (this.name === "$bit") {
+ return `((${this.args[0]} >> ${this.args[1]}) & 1)`;
+ }
+ else {
+ let argsCode = this.args.map(function(arg) { return arg.toString(ctx); }).join(", ");
+ if (ctx)
+ return `${ctx.stringifyFunction(this.name)}(${argsCode})`;
+ else
+ return `${this.name}(${argsCode})`;
+ }
+ }
+}
+
+class UnaryNode extends ExpNode {
+ constructor(op, child) {
+ if (!Object.hasOwn(kUnaryOperators, op))
+ throw new Error(`Invalid unary operator '${op}`);
+
+ super("unary");
+ this.op = op;
+ this.child = child || null;
+ }
+
+ info() {
+ return kUnaryOperators[this.op];
+ }
+
+ clone() {
+ return new UnaryNode(this.op, this.left ? this.left.clone() : null);
+ }
+
+ evaluate(ctx) {
+ const val = this.child.evaluate(ctx);
+ switch (this.op) {
+ case "-": return (-val);
+ case "~": return (~val);
+ case "!": return (val ? 0 : 1);
+ default : return ctx.unary(this.op, val);
+ }
+ }
+
+ toString(ctx) {
+ return this.info().emit.replace(/@1/g, () => {
+ const node = this.child;
+ const code = node.toString(ctx);
+ return mustEnclose(node) ? `(${code})` : code;
+ });
+ }
+}
+
+class BinaryNode extends ExpNode {
+ constructor(op, left, right) {
+ if (!Object.hasOwn(kBinaryOperators, op))
+ throw new Error(`Invalid binary operator '${op}`);
+
+ super("binary");
+ this.op = op || "";
+ this.left = left || null;
+ this.right = right || null;
+ }
+
+ info() {
+ return kBinaryOperators[this.op];
+ }
+
+ clone() {
+ return new BinaryNode(this.op, this.left ? this.left.clone() : null, this.right ? this.right.clone() : null);
+ }
+
+ evaluate(ctx) {
+ const left = this.left.evaluate(ctx);
+ const right = this.right.evaluate(ctx);
+
+ switch (this.op) {
+ case "-" : return left - right;
+ case "+" : return left + right;
+ case "*" : return left * right;
+ case "/" : return (left / right)|0;
+ case "%" : return (left % right)|0;
+ case "&" : return left & right;
+ case "|" : return left | right;
+ case "^" : return left ^ right;
+ case "<<": return left << right;
+ case ">>": return left >> right;
+ case "==": return left == right ? 1 : 0;
+ case "!=": return left != right ? 1 : 0;
+ case "<" : return left < right ? 1 : 0;
+ case "<=": return left <= right ? 1 : 0;
+ case ">" : return left > right ? 1 : 0;
+ case ">=": return left >= right ? 1 : 0;
+ case "&&": return left && right ? 1 : 0;
+ case "||": return left || right ? 1 : 0;
+ default : return ctx.binary(this.op, left, right);
+ }
+ }
+
+ toString(ctx) {
+ return this.info().emit.replace(/@[1-2]/g, (p) => {
+ const node = p === "@1" ? this.left : this.right;
+ const code = node.toString(ctx);
+ return mustEnclose(node) ? `(${code})` : code;
+ });
+ }
+}
+
+function Imm(imm) { return new ImmNode(imm); }
+function Var(name) { return new VarNode(name); }
+function Call(name, args) { return new CallNode(name, args); }
+function Unary(op, child) { return new UnaryNode(op, child); }
+function Binary(op, left, right) { return new BinaryNode(op, left, right); }
+
+function Negate(child) { return Unary("-", child); }
+function BitNot(child) { return Unary("~", child); }
+
+function Add(left, right) { return Binary("+", left, right); }
+function Sub(left, right) { return Binary("-", left, right); }
+function Mul(left, right) { return Binary("*", left, right); }
+function Div(left, right) { return Binary("/", left, right); }
+function Mod(left, right) { return Binary("%", left, right); }
+function Shl(left, right) { return Binary("<<", left, right); }
+function Shr(left, right) { return Binary(">>", left, right); }
+function BitAnd(left, right) { return Binary("&", left, right); }
+function BitOr(left, right) { return Binary("|", left, right); }
+function BitXor(left, right) { return Binary("^", left, right); }
+function Eq(left, right) { return Binary("==", left, right); }
+function Ne(left, right) { return Binary("!=", left, right); }
+function Lt(left, right) { return Binary("<", left, right); }
+function Le(left, right) { return Binary("<=", left, right); }
+function Gt(left, right) { return Binary(">", left, right); }
+function Ge(left, right) { return Binary(">=", left, right); }
+function And(left, right) { return Binary("&&", left, right); }
+function Or(left, right) { return Binary("||", left, right); }
+
+
+
+// Expression Tokenizer
+// --------------------
+
+const kCharNone = 0; // '_' - Character category - Invalid or <end>.
+const kCharSpace = 1; // 'S' - Character category - Space.
+const kCharAlpha = 2; // 'A' - Character category - Alpha [A-Za-z_].
+const kCharDigit = 3; // 'D' - Character category - Digit [0-9].
+const kCharPunct = 4; // '$' - Character category - Punctuation.
+
+const Category = (function(_, S, A, D, $) {
+ const Table = [
+ _,_,_,_,_,_,_,_,_,S,S,S,S,S,_,_, // 000-015 |......... ..|
+ _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, // 016-031 |................|
+ S,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$, // 032-047 | !"#$%&'()*+,-./|
+ D,D,D,D,D,D,D,D,D,D,$,$,$,$,$,$, // 048-063 |0123456789:;<=>?|
+ $,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A, // 064-079 |@ABCDEFGHIJKLMNO|
+ A,A,A,A,A,A,A,A,A,A,A,$,$,$,$,A, // 080-095 |PQRSTUVWXYZ[\]^_|
+ $,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A, // 096-111 |`abcdefghijklmno|
+ A,A,A,A,A,A,A,A,A,A,A,$,$,$,$,_, // 112-127 |pqrstuvwxyz{|}~ |
+ _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, // 128-143 |................|
+ _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ // 144-159 |................|
+ ];
+ const kTableLength = Table.length;
+
+ return function(c) {
+ if (c < kTableLength)
+ return Table[c];
+ return kCharNone;
+ };
+})(kCharNone, kCharSpace, kCharAlpha, kCharDigit, kCharPunct);
+
+const kTokenNone = 0;
+const kTokenPunct = 1;
+const kTokenIdent = 2;
+const kTokenValue = 3;
+
+function newToken(type, position, data, value) {
+ return {
+ type : type, // Token type, see `kToken...`.
+ position: position, // Token position in expression's source.
+ data : data, // Token data (content) as string.
+ value : value // Token value (only if the token is a value).
+ };
+}
+const NoToken = newToken(kTokenNone, -1, "<end>", null);
+
+// Must be reset before it can be used, use `RegExp.lastIndex`.
+const reNumValue = /(?:(?:\d*\.\d+|\d+)(?:[E|e][+|-]?\d+)?)/g;
+
+function parseHex(source, from) {
+ let i = from;
+ let number = 0;
+
+ while (i < source.length) {
+ let c = source.charCodeAt(i);
+ let n = 0;
+
+ if (c >= '0'.charCodeAt(0) && c <= '9'.charCodeAt(0)) {
+ n = c - '0'.charCodeAt(0);
+ }
+ else if (c >= 'a'.charCodeAt(0) && c <= 'f'.charCodeAt(0)) {
+ n = c - 'a'.charCodeAt(0) + 10;
+ }
+ else if (c >= 'A'.charCodeAt(0) && c <= 'F'.charCodeAt(0)) {
+ n = c - 'A'.charCodeAt(0) + 10;
+ }
+ else if (c >= 'g'.charCodeAt(0) && c <= 'z'.charCodeAt(0) || c >= 'g'.charCodeAt(0) && c <= 'Z'.charCodeAt(0)) {
+ throwExpressionError(`Invalid hex number 0x${source.substring(from, i + 1)}`);
+ }
+ else {
+ break;
+ }
+
+ number = (number << 4) | n;
+ i++;
+ }
+
+ if (i === from)
+ throwExpressionError(`Invalid number starting with 0x`);
+
+ return {
+ number: number,
+ end: i
+ };
+}
+
+function tokenize(source) {
+ const len = source.length;
+ const tokens = [];
+
+ let i = 0, j = 0; // Current index in `source` and temporary.
+ let start = 0; // Current token start position.
+ let data = ""; // Current token data (content) as string.
+ let c, cat; // Current character code and category.
+
+ while (i < len) {
+ c = source.charCodeAt(i);
+ cat = Category(c);
+
+ if (cat === kCharSpace) {
+ i++;
+ }
+ else if (cat === kCharDigit) {
+ const n = tokens.length - 1;
+
+ // Hex number.
+ if (c === '0'.charCodeAt(0) && i + 1 < len && source.charCodeAt(i + 1) === 'x'.charCodeAt(0)) {
+ const status = parseHex(source, i + 2);
+ tokens.push(newToken(kTokenValue, i, source.substring(i, status.end), status.number));
+ i = status.end;
+ }
+ else {
+ if (n >= 0 && tokens[n].data === "." && source[i - 1] === ".") {
+ tokens.length = n;
+ i--;
+ }
+
+ reNumValue.lastIndex = i;
+ data = reNumValue.exec(source)[0];
+
+ tokens.push(newToken(kTokenValue, i, data, parseFloat(data)));
+ i += data.length;
+ }
+ }
+ else if (cat === kCharAlpha) {
+ start = i;
+ while (++i < len && ((cat = Category(source.charCodeAt(i))) === kCharAlpha || cat === kCharDigit))
+ continue;
+
+ data = source.substring(start, i);
+ tokens.push(newToken(kTokenIdent, start, data, null));
+ }
+ else if (cat === kCharPunct) {
+ start = i;
+ while (++i < len && Category(source.charCodeAt(i)) === kCharPunct)
+ continue;
+
+ data = source.substring(start, i);
+ do {
+ for (j = Math.min(i - start, kMaxOperatorLen); j > 0; j--) {
+ const part = source.substr(start, j);
+ if (Object.hasOwn(kUnaryOperators, part) || Object.hasOwn(kBinaryOperators, part) || j === 1) {
+ tokens.push(newToken(kTokenPunct, start, part, null));
+ start += j;
+ break;
+ }
+ }
+ } while (start < i);
+ }
+ else {
+ throwExpressionError(`Unrecognized character '0x${c.toString(16)}'`, i);
+ }
+ }
+
+ return tokens;
+}
+
+// Expression Parser
+// -----------------
+
+class Parser {
+ constructor(tokens) {
+ this.tokens = tokens;
+ this.tIndex = 0;
+ }
+
+ peek() { return this.tIndex < this.tokens.length ? this.tokens[this.tIndex ] : NoToken; }
+ next() { return this.tIndex < this.tokens.length ? this.tokens[this.tIndex++] : NoToken; }
+ skip() { this.tIndex++; return this; }
+ back(token) { this.tIndex -= +(token !== NoToken); return this; }
+
+ parse() {
+ // The root expression cannot be empty.
+ let token = this.peek();
+ if (token === NoToken)
+ throwExpressionError("Expression cannot be empty", 0);
+
+ const exp = this.parseExpression();
+
+ // The root expression must reach the end of the input.
+ token = this.peek();
+ if (token !== NoToken)
+ throwTokenizerError(token);
+
+ return exp;
+ }
+
+ parseExpression() {
+ const stack = [];
+ let value = null;
+ let token = null;
+
+ for (;;) {
+ // The only case of value not being `null` is after ternary-if. In that
+ // case the value was already parsed so we want to skip this section.
+ if (value === null) {
+ let unaryFirst = null;
+ let unaryLast = null;
+
+ token = this.next();
+
+ // Parse a possible unary operator(s).
+ if (token.type === kTokenPunct) {
+ do {
+ const opName = token.data;
+ const opInfo = kUnaryOperators[opName];
+
+ if (!opInfo)
+ break;
+
+ const node = Unary(opName);
+ if (unaryLast)
+ unaryLast.child = node;
+ else
+ unaryFirst = node;
+
+ unaryLast = node;
+ token = this.next();
+ } while (token.type === kTokenPunct);
+ }
+
+ // Parse a value, variable, function call, or nested expression.
+ if (token.type === kTokenValue) {
+ value = Imm(token.value);
+ }
+ else if (token.type === kTokenIdent) {
+ const name = token.data;
+ const after = this.peek();
+
+ if (after.data === "(")
+ value = this.parseCall(token.data);
+ else if (after.data === "[")
+ value = this.parseBitAccess(token.data);
+ else
+ value = Var(name);
+ }
+ else if (token.data === "(") {
+ value = this.parseExpression();
+ token = this.next();
+
+ if (token.data !== ")")
+ throwTokenizerError(token);
+ }
+ else {
+ throwTokenizerError(token);
+ }
+
+ // Replace the value with the top-level unary operator, if parsed.
+ if (unaryFirst) {
+ unaryLast.child = value;
+ value = unaryFirst;
+ }
+ }
+
+ // Parse a possible binary operator - the loop must repeat, if present.
+ token = this.peek();
+ if (token.type === kTokenPunct && Object.hasOwn(kBinaryOperators, token.data)) {
+ const opName = token.data;
+ if (opName === ":")
+ break;
+
+ // Consume the token.
+ this.skip();
+
+ const bNode = Binary(opName, null, null);
+
+ if (!stack.length) {
+ bNode.left = value;
+ stack.push(bNode);
+ }
+ else {
+ let aNode = stack.pop();
+ let aPrec = aNode.info().prec;
+ let bPrec = bNode.info().prec;
+
+ if (aPrec > bPrec) {
+ aNode.right = bNode;
+ bNode.left = value;
+ stack.push(aNode, bNode);
+ }
+ else {
+ aNode.right = value;
+
+ // Advance to the top-most op that has less/equal precedence than `bPrec`.
+ while (stack.length) {
+ if (rightAssociate(aNode.info(), bPrec))
+ break;
+ aNode = stack.pop();
+ }
+
+ if (!stack.length && !rightAssociate(aNode.info(), bPrec)) {
+ bNode.left = aNode;
+ stack.push(bNode);
+ }
+ else {
+ const tmp = aNode.right;
+ aNode.right = bNode;
+ bNode.left = tmp;
+ stack.push(aNode, bNode);
+ }
+ }
+ }
+
+ // Parse "<cond> {ternary-if} <taken> {ternary-else} <not-taken>".
+ if (opName === "?") {
+ const ternLeft = this.parseExpression();
+ const ternTok = this.next();
+
+ if (ternTok.data !== ":")
+ throwExpressionError(`Unterminated ternary if '${token.data}'`, token.position);
+
+ const ternRight = this.parseExpression();
+ value = Binary(opName, info, ternLeft, ternRight);
+ }
+ else {
+ value = null;
+ }
+
+ continue;
+ }
+
+ break;
+ }
+
+ if (value === null)
+ throwExpressionError("Invalid expression");
+
+ if (stack.length !== 0) {
+ stack[stack.length - 1].right = value;
+ value = stack[0];
+ }
+
+ return value;
+ }
+
+ parseCall(name) {
+ const args = [];
+
+ let token = this.next();
+ if (token.data !== "(")
+ throwTokenizerError(token);
+
+ for (;;) {
+ token = this.peek();
+ if (token.data === ")")
+ break;
+
+ if (args.length !== 0) {
+ if (token.data !== ",")
+ throwTokenizerError(token);
+ this.skip();
+ }
+
+ args.push(this.parseExpression());
+ }
+
+ this.skip();
+ return Call(name, args);
+ }
+
+ parseBitAccess(name) {
+ let token = this.next();
+ if (token.data !== "[")
+ throwTokenizerError(token);
+
+ token = this.next();
+ if (token.type != kTokenValue)
+ throwTokenizerError(token);
+
+ const index = token.value;
+
+ token = this.next();
+ if (token.data !== "]")
+ throwTokenizerError(token);
+
+ return Call("$bit", [Var(name), index]);
+ }
+}
+
+function parse(source) {
+ const tokens = tokenize(source);
+ return new Parser(tokens).parse();
+}
+
+// Expression Visitors
+// -------------------
+
+class Visitor {
+ visit(node) {
+ switch (node.type) {
+ case "imm":
+ case "var": {
+ break;
+ }
+
+ case "call": {
+ for (let arg of node.args)
+ this.visit(arg);
+ break;
+ }
+
+ case "unary": {
+ if (node.child)
+ this.visit(node.child);
+ break;
+ }
+
+ case "binary": {
+ if (node.left)
+ this.visit(node.left);
+ if (node.right)
+ this.visit(node.right);
+ break;
+ }
+
+ default: {
+ throw new Error(`Visitor.visit(): Unknown node type '${node.type}'`);
+ }
+ }
+ }
+}
+
+class Collector extends Visitor {
+ constructor(nodeType, dst) {
+ super();
+ this.dict = dst || Object.create(null);
+ this.nodeType = nodeType;
+ }
+
+ visit(node) {
+ if (node.type === this.nodeType) {
+ if (Object.hasOwn(this.dict, node.name))
+ this.dict[node.name]++;
+ else
+ this.dict[node.name] = 1;
+ }
+
+ super.visit(node);
+ }
+}
+
+function collectVars(node, dst) {
+ const collector = new Collector("var", dst);
+ collector.visit(node)
+ return collector.dict;
+}
+
+function collectCalls(node, dst) {
+ const collector = new Collector("call", dst);
+ collector.visit(node)
+ return collector.dict;
+}
+
+// Exports
+// -------
+
+$scope[$as] = {
+ Imm: Imm,
+ Var: Var,
+ Call: Call,
+ Unary: Unary,
+ Binary: Binary,
+
+ Negate: Negate,
+ BitNot: BitNot,
+
+ Add: Add,
+ Sub: Sub,
+ Mul: Mul,
+ Div: Div,
+ Mod: Mod,
+ Shl: Shl,
+ Shr: Shr,
+ BitAnd: BitAnd,
+ BitOr: BitOr,
+ BitXor: BitXor,
+ Eq: Eq,
+ Ne: Ne,
+ Lt: Lt,
+ Le: Le,
+ Gt: Gt,
+ Ge: Ge,
+ And: And,
+ Or: Or,
+
+ Visitor: Visitor,
+ ExpressionError: ExpressionError,
+
+ parse: parse,
+ collectVars: collectVars,
+ collectCalls: collectCalls
+};
+
+}).apply(this, typeof module === "object" && module && module.exports
+ ? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "exp"]);
diff --git a/3rdparty/asmjit/db/index.js b/3rdparty/asmjit/db/index.js
new file mode 100644
index 00000000000..bf55e6f94b0
--- /dev/null
+++ b/3rdparty/asmjit/db/index.js
@@ -0,0 +1,11 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+"use strict";
+
+exports.base = require("./base.js");
+exports.aarch32 = require("./aarch32.js");
+exports.aarch64 = require("./aarch64.js");
+exports.x86 = require("./x86.js");
diff --git a/3rdparty/asmjit/db/isa_aarch32.json b/3rdparty/asmjit/db/isa_aarch32.json
new file mode 100644
index 00000000000..2e53010054d
--- /dev/null
+++ b/3rdparty/asmjit/db/isa_aarch32.json
@@ -0,0 +1,2783 @@
+{
+ "instructions": [
+ {"category": "GP", "data": [
+ {"inst": "adc Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0101|0|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "C=R"},
+ {"inst": "adc Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0101|0|Rn|Rd|n:5|sop:2|0|Rm" , "io": "C=R"},
+ {"inst": "adc Rd, Rn, #immA" , "a32": "cond|001|0101|0|Rn|Rd|imm:12" , "io": "C=R"},
+ {"inst": "adcS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0101|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "adcS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0101|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "adcS Rd!=PC, Rn, #immA" , "a32": "cond|001|0101|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "add Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0100|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "add Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0100|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "add Rd, Rn!=PC, #immA" , "a32": "cond|001|0100|0|Rn|Rd|imm:12"},
+ {"inst": "addS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0100|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0100|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=PC, Rn, #immA" , "a32": "cond|001|0100|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adr Rd, #relA" , "a32": "cond|001|0PN0|0|1111|Rd|relA:12"},
+ {"inst": "and Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0000|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "and Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0000|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "and Rd, Rn, #immA" , "a32": "cond|001|0000|0|Rn|Rd|imm:12"},
+ {"inst": "andS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0000|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "andS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0000|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "andS Rd!=PC, Rn, #immA" , "a32": "cond|001|0000|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "asr Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|0|0000|Rd|Rm|0101|Rn"},
+ {"inst": "asr Rd, Rn, #n" , "a32": "cond|000|1101|0|0000|Rd|n:5|100|Rn"},
+ {"inst": "asrS Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|1|0000|Rd|Rm|0101|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "asrS Rd, Rn, #n" , "a32": "cond|000|1101|1|0000|Rd|n:5|100|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "b #relS*4" , "a32": "cond|101|0|relS:24"},
+ {"inst": "bfc Rd!=PC, #lsb, #width" , "a32": "cond|011|1110|msb:5|Rd|lsb:5|001|1111" , "imm": "BfcBfiImm(lsb, width)"},
+ {"inst": "bfi Rd!=PC, Rn!=PC, #lsb, #width" , "a32": "cond|011|1110|msb:5|Rd|lsb:5|001|Rn" , "imm": "BfcBfiImm(lsb, width)"},
+ {"inst": "bic Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1110|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "bic Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|1110|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "bic Rd, Rn, #immA" , "a32": "cond|001|1110|0|Rn|Rd|imm:12"},
+ {"inst": "bicS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1110|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "bicS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|1110|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "bicS Rd!=PC, Rn, #immA" , "a32": "cond|001|1110|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "bkpt #immZ" , "a32": "cond|000|1001|0|immZ:12|0111|immZ:4"},
+ {"inst": "bl #relS*4" , "a32": "cond|101|1|relS:24"},
+ {"inst": "blx Rm!=PC" , "a32": "cond|000|1001|0|1111|1111|1111|0011|Rm"},
+ {"inst": "blx #relS*2" , "a32": "1111|101|relS[0]|relS[24:1]" },
+ {"inst": "bx Rm" , "a32": "cond|000|1001|0|1111|1111|1111|0001|Rm"},
+ {"inst": "bxj Rm!=PC" , "a32": "cond|000|1001|0|1111|1111|1111|0010|Rm"},
+ {"inst": "clz Rd!=PC, Rn!=PC" , "a32": "cond|000|1011|0|1111|Rd|1111|0001|Rn"},
+ {"inst": "cmn Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1011|1|Rn|0000|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Rn, Rm, {sop #n}" , "a32": "cond|000|1011|1|Rn|0000|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Rn, #immA" , "a32": "cond|001|1011|1|Rn|0000|imm:12" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1010|1|Rn|0000|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn, Rm, {sop #n}" , "a32": "cond|000|1010|1|Rn|0000|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn, #immA" , "a32": "cond|001|1010|1|Rn|0000|imm:12" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cps #immZ" , "a32": "1111|000|1000|0|0010|0000|000|000|0|immZ:5"},
+ {"inst": "cpsid #aif" , "a32": "1111|000|1000|0|1100|0000|000|aif:3|0|00000"},
+ {"inst": "cpsid #aif, #immZ" , "a32": "1111|000|1000|0|1110|0000|000|aif:3|0|immZ:5"},
+ {"inst": "cpsie #aif" , "a32": "1111|000|1000|0|1000|0000|000|aif:3|0|00000"},
+ {"inst": "cpsie #aif, #immZ" , "a32": "1111|000|1000|0|1010|0000|000|aif:3|0|immZ:5"},
+ {"inst": "eor Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0001|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "eor Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0001|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "eor Rd, Rn, #immA" , "a32": "cond|001|0001|0|Rn|Rd|imm:12"},
+ {"inst": "eorS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0001|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "eorS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0001|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "eorS Rd!=PC, Rn, #immA" , "a32": "cond|001|0001|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "eret" , "a32": "cond|000|1011|0|0000|0000|0000|0110|1110"},
+ {"inst": "hlt #immZ" , "a32": "1110|000|1000|0|immZ:12|0111|immZ:4"},
+ {"inst": "hvc #immZ" , "a32": "cond|000|1010|0|immZ:12|0111|immZ:4"},
+ {"inst": "ldmda [Rn!=PC]{!}, RdList" , "a32": "cond|100|000W|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmdb [Rn!=PC]{!}, RdList" , "a32": "cond|100|100W|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmia [Rn!=PC]{!}, RdList" , "a32": "cond|100|010W|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmib [Rn!=PC]{!}, RdList" , "a32": "cond|100|110W|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmda [Rn!=PC], RdList^" , "a32": "cond|100|0010|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmdb [Rn!=PC], RdList^" , "a32": "cond|100|1010|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmia [Rn!=PC], RdList^" , "a32": "cond|100|0110|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldmib [Rn!=PC], RdList^" , "a32": "cond|100|1110|1|Rn|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "ldr Rd, [Rn!=PC, +/-Rm!=PC, {sop #n}]{@}{!}" , "a32": "cond|011|PU0W|1|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "ldr Rd, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|010|PU0W|1|Rn|Rd|off:12"},
+ {"inst": "ldr Rd, [Rn==PC, #+/-off]" , "a32": "cond|010|1U00|1|Rn|Rd|off:12"},
+ {"inst": "ldrb Rd!=PC, [Rn!=PC, +/-Rm!=PC, {sop #n}]{@}{!}" , "a32": "cond|011|PU1W|1|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "ldrb Rd!=PC, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|010|PU1W|1|Rn|Rd|off:12"},
+ {"inst": "ldrb Rd!=PC, [Rn==PC, #+/-off]" , "a32": "cond|010|1U10|1|Rn|Rd|off:12"},
+ {"inst": "ldrbt Rd!=PC, [Rn!=PC, +/-Rm!=PC, {sop #n}]@" , "a32": "cond|011|0U11|1|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "ldrbt Rd!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|010|0U11|1|Rn|Rd|off:12"},
+ {"inst": "ldrd Rd<=13, Rd2+, [Rn!=PC, +/-Rm]{@}{!}" , "a32": "cond|000|PU0W|0|Rn|Rd|0000|1101|Rm"},
+ {"inst": "ldrd Rd<=13, Rd2+, [Rn!=PC, #+/-off]{!}" , "a32": "cond|000|PU1W|0|Rn|Rd|off:4|1101|off:4"},
+ {"inst": "ldrd Rd<=13, Rd2+, [Rn==PC, #+/-off]" , "a32": "cond|000|1U10|0|Rn|Rd|off:4|1101|off:4"},
+ {"inst": "ldrex Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1100|1|Rn|Rd|1111|1001|1111"},
+ {"inst": "ldrexb Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1110|1|Rn|Rd|1111|1001|1111"},
+ {"inst": "ldrexd Rd<=13, Rd2+, [Rn!=PC]" , "a32": "cond|000|1101|1|Rn|Rd|1111|1001|1111"},
+ {"inst": "ldrexh Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1111|1|Rn|Rd|1111|1001|1111"},
+ {"inst": "ldrh Rd!=PC, [Rn!=PC, +/-Rm!=PC]{@}{!}" , "a32": "cond|000|PU0W|1|Rn|Rd|0000|1011|Rm"},
+ {"inst": "ldrh Rd!=PC, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|000|PU1W|1|Rn|Rd|off:4|1011|off:4"},
+ {"inst": "ldrh Rd!=PC, [Rn==PC, #+/-off]" , "a32": "cond|000|1U10|1|Rn|Rd|off:4|1011|off:4"},
+ {"inst": "ldrht Rd!=PC, [Rn!=PC, +/-Rm!=PC]@" , "a32": "cond|000|0U01|1|Rn|Rd|0000|1011|Rm"},
+ {"inst": "ldrht Rd!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|000|0U11|1|Rn|Rd|off:4|1011|off:4"},
+ {"inst": "ldrsb Rd!=PC, [Rn!=PC, +/-Rm!=PC]{@}{!}" , "a32": "cond|000|PU0W|1|Rn|Rd|0000|1101|Rm"},
+ {"inst": "ldrsb Rd!=PC, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|000|PU1W|1|Rn|Rd|off:4|1101|off:4"},
+ {"inst": "ldrsb Rd!=PC, [Rn==PC, #+/-off]" , "a32": "cond|000|1U10|1|Rn|Rd|off:4|1101|off:4"},
+ {"inst": "ldrsbt Rd!=PC, [Rn!=PC, +/-Rm]@" , "a32": "cond|000|0U01|1|Rn|Rd|0000|1101|Rm"},
+ {"inst": "ldrsbt Rd!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|000|0U11|1|Rn|Rd|off:4|1101|off:4"},
+ {"inst": "ldrsh Rd!=PC, [Rn!=PC, +/-Rm!=PC]{@}{!}" , "a32": "cond|000|PU0W|1|Rn|Rd|0000|1111|Rm"},
+ {"inst": "ldrsh Rd!=PC, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|000|PU1W|1|Rn|Rd|off:4|1111|off:4"},
+ {"inst": "ldrsh Rd!=PC, [Rn==PC, #+/-off]" , "a32": "cond|000|1U10|1|Rn|Rd|off:4|1111|off:4"},
+ {"inst": "ldrsht Rd!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|000|0U11|1|Rn|Rd|off:4|1111|off:4"},
+ {"inst": "ldrsht Rd!=PC, [Rn!=PC, +/-Rm!=PC]@" , "a32": "cond|000|0U01|1|Rn|Rd|0000|1111|Rm"},
+ {"inst": "ldrt Rd!=PC, [Rn!=PC, +/-Rm!=PC, {sop #n}]@" , "a32": "cond|011|0U01|1|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "ldrt Rd!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|010|0U01|1|Rn|Rd|off:12"},
+ {"inst": "lsl Rd, Rn, #n" , "a32": "cond|000|1101|0|0000|Rd|n:5|000|Rn"},
+ {"inst": "lsl Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|0|0000|Rd|Rm|0001|Rn"},
+ {"inst": "lslS Rd, Rn, #n" , "a32": "cond|000|1101|1|0000|Rd|n:5|000|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "lslS Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|1|0000|Rd|Rm|0001|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "lsr Rd, Rn, #n" , "a32": "cond|000|1101|0|0000|Rd|n:5|010|Rn"},
+ {"inst": "lsr Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|0|0000|Rd|Rm|0011|Rn"},
+ {"inst": "lsrS Rd, Rn, #n" , "a32": "cond|000|1101|1|0000|Rd|n:5|010|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "lsrS Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|1|0000|Rd|Rm|0011|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "mcr #CP, #Op1, Rs!=PC, Cn, Cm, {#Op2}" , "a32": "cond|111|0|Op1:3|0|Cn:4|Rs|CP:4|Op2:3|1|Cm:4"},
+ {"inst": "mcr2 #CP, #Op1, Rs!=PC, Cn, Cm, {#Op2}" , "a32": "1111|111|0|Op1:3|0|Cn:4|Rs|CP:4|Op2:3|1|Cm:4"},
+ {"inst": "mcrr #CP, #Op1, Rs!=PC, Rs2!=PC, Cm" , "a32": "cond|110|0010|0|Rs2|Rs|CP:4|Op1:4|Cm:4"},
+ {"inst": "mcrr2 #CP, #Op1, Rs!=PC, Rs2!=PC, Cm" , "a32": "1111|110|0010|0|Rs2|Rs|CP:4|Op1:4|Cm:4"},
+ {"inst": "mla Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|0001|0|Rd|Ra|Rm|1001|Rn"},
+ {"inst": "mlaS Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|0001|1|Rd|Ra|Rm|1001|Rn" , "io": "N=W Z=W"},
+ {"inst": "mls Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|0011|0|Rd|Ra|Rm|1001|Rn"},
+ {"inst": "mov Rd, Rn, sop Rs" , "a32": "cond|000|1101|0|0000|Rd|Rs|0|sop:2|1|Rn"},
+ {"inst": "mov Rd, Rn, {sop #n}" , "a32": "cond|000|1101|0|0000|Rd|n:5|sop:2|0|Rn"},
+ {"inst": "mov Rd, #immA" , "a32": "cond|001|1101|0|0000|Rd|imm:12"},
+ {"inst": "movS Rd!=PC, Rn, sop Rs" , "a32": "cond|000|1101|1|0000|Rd|Rs|0|sop:2|1|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=PC, Rn, {sop #n}" , "a32": "cond|000|1101|1|0000|Rd|n:5|sop:2|0|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=PC, #immA" , "a32": "cond|001|1101|1|0000|Rd|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "movt Rx!=PC, #immZ" , "a32": "cond|001|1010|0|immZ:4|Rx|immZ:12"},
+ {"inst": "movw Rd!=PC, #immZ" , "a32": "cond|001|1000|0|immZ:4|Rd|immZ:12"},
+ {"inst": "mrc #CP, #op1, Rd!=PC, Cn, Cm, {#op2}" , "a32": "cond|111|0|op1:3|1|Cn:4|Rd|CP:4|op2:3|1|Cm:4"},
+ {"inst": "mrc2 #CP, #op1, Rd!=PC, Cn, Cm, {#op2}" , "a32": "1111|111|0|op1:3|1|Cn:4|Rd|CP:4|op2:3|1|Cm:4"},
+ {"inst": "mrrc #CP, #op1, Rd!=PC, Rd2!=Rd, Cm" , "a32": "cond|110|0010|1|Rd2|Rd|CP:4|op1:4|Cm:4"},
+ {"inst": "mrrc2 #CP, #op1, Rd!=PC, Rd2!=Rd, Cm" , "a32": "1111|110|0010|1|Rd2|Rd|CP:4|op1:4|Cm:4"},
+ {"inst": "mrs Rd!=PC, #APSR" , "a32": "cond|000|10|APSR:1|0|0|1111|Rd|0000|0000|0000"},
+ {"inst": "msr #APSR, Rn!=PC" , "a32": "cond|000|1001|0|APSR:2|00|1111|0000|0000|Rn"},
+ {"inst": "msr #APSR, #immA" , "a32": "cond|001|1001|0|APSR:2|00|1111|imm:12"},
+ {"inst": "mul Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0000|0|Rd|0000|Rm|1001|Rn"},
+ {"inst": "mulS Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0000|1|Rd|0000|Rm|1001|Rn" , "io": "N=W Z=W"},
+ {"inst": "mvn Rd!=PC, Rn!=PC, sop Rs!=PC" , "a32": "cond|000|1111|0|0000|Rd|Rs|0|sop:2|1|Rn"},
+ {"inst": "mvn Rd, Rn, {sop #n}" , "a32": "cond|000|1111|0|0000|Rd|n:5|sop:2|0|Rn"},
+ {"inst": "mvn Rd, #immA" , "a32": "cond|001|1111|0|0000|Rd|imm:12"},
+ {"inst": "mvnS Rd!=PC, Rn!=PC, sop Rs!=PC" , "a32": "cond|000|1111|1|0000|Rd|Rs|0|sop:2|1|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "mvnS Rd!=PC, Rn, {sop #n}" , "a32": "cond|000|1111|1|0000|Rd|n:5|sop:2|0|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "mvnS Rd!=PC, #immA" , "a32": "cond|001|1111|1|0000|Rd|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "nop" , "a32": "cond|001|1001|0|0000|1111|0000|0000|0000"},
+ {"inst": "orr Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1100|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "orr Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|1100|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "orr Rd, Rn, #immA" , "a32": "cond|001|1100|0|Rn|Rd|imm:12"},
+ {"inst": "orrS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1100|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "orrS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|1100|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "orrS Rd!=PC, Rn, #immA" , "a32": "cond|001|1100|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "pkhbt Rd!=PC, Rn!=PC, Rm!=PC, {lsl #n}" , "a32": "cond|011|0100|0|Rn|Rd|n:5|0|01|Rm"},
+ {"inst": "pkhtb Rd!=PC, Rn!=PC, Rm!=PC, {asr #n}" , "a32": "cond|011|0100|0|Rn|Rd|n:5|1|01|Rm"},
+ {"inst": "pld [Rn!=PC, +/-Rm!=PC, {sop #n}]" , "a32": "1111|011|1U10|1|Rn|1111|n:5|sop:2|0|Rm"},
+ {"inst": "pld [Rn, #+/-off]" , "a32": "1111|010|1U10|1|Rn|1111|off:12"},
+ {"inst": "pop Rd!=SP" , "a32": "cond|010|0100|1|1101|Rd|0000|0000|0100"},
+ {"inst": "pop RdList" , "a32": "cond|100|0101|1|1101|immMask:16" , "imm": "GpListImm(RdList)"},
+ {"inst": "push Rs!=SP" , "a32": "cond|010|1001|0|1101|Rs|0000|0000|0100"},
+ {"inst": "push RsList" , "a32": "cond|100|1001|0|1101|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "qadd Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1000|0|Rm|Rd|0000|0101|Rn" , "io": "Q=X"},
+ {"inst": "qadd16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|0|Rn|Rd|1111|0001|Rm"},
+ {"inst": "qadd8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|0|Rn|Rd|1111|1001|Rm"},
+ {"inst": "qasx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|0|Rn|Rd|1111|0011|Rm"},
+ {"inst": "qdadd Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|Rm|Rd|0000|0101|Rn" , "io": "Q=X"},
+ {"inst": "qdsub Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1011|0|Rm|Rd|0000|0101|Rn" , "io": "Q=X"},
+ {"inst": "qsax Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|0|Rn|Rd|1111|0101|Rm"},
+ {"inst": "qsub Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1001|0|Rm|Rd|0000|0101|Rn" , "io": "Q=X"},
+ {"inst": "qsub16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|0|Rn|Rd|1111|0111|Rm"},
+ {"inst": "qsub8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|0|Rn|Rd|1111|1111|Rm"},
+ {"inst": "rbit Rd!=PC, Rn!=PC" , "a32": "cond|011|0111|1|1111|Rd|1111|0011|Rn"},
+ {"inst": "rev Rd!=PC, Rn!=PC" , "a32": "cond|011|0101|1|1111|Rd|1111|0011|Rn"},
+ {"inst": "rev16 Rd!=PC, Rn!=PC" , "a32": "cond|011|0101|1|1111|Rd|1111|1011|Rn"},
+ {"inst": "revsh Rd!=PC, Rn!=PC" , "a32": "cond|011|0111|1|1111|Rd|1111|1011|Rn"},
+ {"inst": "rfeda [Rn!=PC]{!}" , "a32": "1111|100|000|W|1|Rn|0000|1010|0000|0000"},
+ {"inst": "rfedb [Rn!=PC]{!}" , "a32": "1111|100|100|W|1|Rn|0000|1010|0000|0000"},
+ {"inst": "rfeia [Rn!=PC]{!}" , "a32": "1111|100|010|W|1|Rn|0000|1010|0000|0000"},
+ {"inst": "rfeib [Rn!=PC]{!}" , "a32": "1111|100|110|W|1|Rn|0000|1010|0000|0000"},
+ {"inst": "ror Rd, Rn, #n" , "a32": "cond|000|1101|0|0000|Rd|n:5|110|Rn"},
+ {"inst": "ror Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|0|0000|Rd|Rm|0111|Rn"},
+ {"inst": "rorS Rd, Rn, #n" , "a32": "cond|000|1101|1|0000|Rd|n:5|110|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "rorS Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1101|1|0000|Rd|Rm|0111|Rn" , "io": "N=W Z=W C=W"},
+ {"inst": "rsb Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0011|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "rsb Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0011|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "rsb Rd, Rn, #immA" , "a32": "cond|001|0011|0|Rn|Rd|imm:12"},
+ {"inst": "rsbS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0011|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rsbS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0011|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rsbS Rd!=PC, Rn, #immA" , "a32": "cond|001|0011|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rsc Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0111|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "rsc Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0111|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "rsc Rd, Rn, #immA" , "a32": "cond|001|0111|0|Rn|Rd|imm:12"},
+ {"inst": "rscS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0111|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rscS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0111|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rscS Rd!=PC, Rn, #immA" , "a32": "cond|001|0111|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rrx Rd, Rn" , "a32": "cond|000|1101|0|0000|Rd|00000|110|Rn" , "io": "C=R"},
+ {"inst": "rrxS Rd, Rn" , "a32": "cond|000|1101|1|0000|Rd|00000|110|Rn" , "io": "N=W Z=W C=X"},
+ {"inst": "sadd16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0000|1|Rn|Rd|1111|0001|Rm" , "io": "GE=W"},
+ {"inst": "sadd8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0000|1|Rn|Rd|1111|1001|Rm" , "io": "GE=W"},
+ {"inst": "sasx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0000|1|Rn|Rd|1111|0011|Rm" , "io": "GE=W"},
+ {"inst": "sbc Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0110|0|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "C=R"},
+ {"inst": "sbc Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0110|0|Rn|Rd|n:5|sop:2|0|Rm" , "io": "C=R"},
+ {"inst": "sbc Rd, Rn, #immA" , "a32": "cond|001|0110|0|Rn|Rd|imm:12" , "io": "C=R"},
+ {"inst": "sbcS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0110|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "sbcS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0110|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "sbcS Rd!=PC, Rn, #immA" , "a32": "cond|001|0110|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "sbfx Rd!=PC, Rn!=PC, #lsb, #width" , "a32": "cond|011|1101|widthM1:5|Rd|lsb:5|101|Rn" , "imm": "SbfxUbfxImm(lsb, width)"},
+ {"inst": "sel Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0100|0|Rn|Rd|1111|1011|Rm" , "io": "GE=R"},
+ {"inst": "setend #immZ" , "a32": "1111|000|1000|0|0001|0000|00|immZ:1|0|0000|0000" , "ext": "ARMv8-"},
+ {"inst": "shadd16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|1|Rn|Rd|1111|0001|Rm"},
+ {"inst": "shadd8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|1|Rn|Rd|1111|1001|Rm"},
+ {"inst": "shasx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|1|Rn|Rd|1111|0011|Rm"},
+ {"inst": "shsax Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|1|Rn|Rd|1111|0101|Rm"},
+ {"inst": "shsub16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|1|Rn|Rd|1111|0111|Rm"},
+ {"inst": "shsub8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0001|1|Rn|Rd|1111|1111|Rm"},
+ {"inst": "smlabb Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|1000|0|Rd|Ra|Rm|1000|Rn" , "io": "Q=X"},
+ {"inst": "smlabt Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|1000|0|Rd|Ra|Rm|1100|Rn" , "io": "Q=X"},
+ {"inst": "smlatb Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|1000|0|Rd|Ra|Rm|1010|Rn" , "io": "Q=X"},
+ {"inst": "smlatt Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|1000|0|Rd|Ra|Rm|1110|Rn" , "io": "Q=X"},
+ {"inst": "smlad Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1000|0|Rd|Ra|Rm|0001|Rn" , "io": "Q=X"},
+ {"inst": "smladx Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1000|0|Rd|Ra|Rm|0011|Rn" , "io": "Q=X"},
+ {"inst": "smlal RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0111|0|RxHi|RxLo|Rm|1001|Rn"},
+ {"inst": "smlalS RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0111|1|RxHi|RxLo|Rm|1001|Rn" , "io": "N=W Z=W"},
+ {"inst": "smlalbb RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|RxHi|RxLo|Rm|1000|Rn"},
+ {"inst": "smlalbt RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|RxHi|RxLo|Rm|1100|Rn"},
+ {"inst": "smlaltb RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|RxHi|RxLo|Rm|1010|Rn"},
+ {"inst": "smlaltt RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|RxHi|RxLo|Rm|1110|Rn"},
+ {"inst": "smlald RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1010|0|RxHi|RxLo|Rm|0001|Rn"},
+ {"inst": "smlaldx RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1010|0|RxHi|RxLo|Rm|0011|Rn"},
+ {"inst": "smlawb Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|1001|0|Rd|Ra|Rm|1000|Rn" , "io": "Q=X"},
+ {"inst": "smlawt Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|000|1001|0|Rd|Ra|Rm|1100|Rn" , "io": "Q=X"},
+ {"inst": "smlsd Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1000|0|Rd|Ra|Rm|0101|Rn" , "io": "Q=X"},
+ {"inst": "smlsdx Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1000|0|Rd|Ra|Rm|0111|Rn" , "io": "Q=X"},
+ {"inst": "smlsld RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1010|0|RxHi|RxLo|Rm|0101|Rn"},
+ {"inst": "smlsldx RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1010|0|RxHi|RxLo|Rm|0111|Rn"},
+ {"inst": "smmla Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1010|1|Rd|Ra|Rm|0001|Rn"},
+ {"inst": "smmlar Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1010|1|Rd|Ra|Rm|0011|Rn"},
+ {"inst": "smmls Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1010|1|Rd|Ra|Rm|1101|Rn"},
+ {"inst": "smmlsr Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1010|1|Rd|Ra|Rm|1111|Rn"},
+ {"inst": "smmul Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1010|1|Rd|1111|Rm|0001|Rn"},
+ {"inst": "smmulr Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1010|1|Rd|1111|Rm|0011|Rn"},
+ {"inst": "smuad Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1000|0|Rd|1111|Rm|0001|Rn" , "io": "Q=X"},
+ {"inst": "smuadx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1000|0|Rd|1111|Rm|0011|Rn" , "io": "Q=X"},
+ {"inst": "smulbb Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1011|0|Rd|0000|Rm|1000|Rn"},
+ {"inst": "smulbt Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1011|0|Rd|0000|Rm|1100|Rn"},
+ {"inst": "smultb Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1011|0|Rd|0000|Rm|1010|Rn"},
+ {"inst": "smultt Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1011|0|Rd|0000|Rm|1110|Rn"},
+ {"inst": "smull RdLo!=PC, RdHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0110|0|RdHi|RdLo|Rm|1001|Rn"},
+ {"inst": "smullS RdLo!=PC, RdHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0110|1|RdHi|RdLo|Rm|1001|Rn" , "io": "N=W Z=W"},
+ {"inst": "smulwb Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1001|0|Rd|0000|Rm|1010|Rn"},
+ {"inst": "smulwt Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1001|0|Rd|0000|Rm|1110|Rn"},
+ {"inst": "smusd Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1000|0|Rd|1111|Rm|0101|Rn"},
+ {"inst": "smusdx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1000|0|Rd|1111|Rm|0111|Rn"},
+ {"inst": "srsda [Rn==SP]{!}, #mode" , "a32": "1111|100|001|W|0|1101|0000|0101|000|mode:5"},
+ {"inst": "srsdb [Rn==SP]{!}, #mode" , "a32": "1111|100|101|W|0|1101|0000|0101|000|mode:5"},
+ {"inst": "srsia [Rn==SP]{!}, #mode" , "a32": "1111|100|011|W|0|1101|0000|0101|000|mode:5"},
+ {"inst": "srsib [Rn==SP]{!}, #mode" , "a32": "1111|100|111|W|0|1101|0000|0101|000|mode:5"},
+ {"inst": "ssat Rd!=PC, #sat, Rn!=PC" , "a32": "cond|011|0101|imm:5|Rd|00000|00|1|Rn" , "imm": "SsatImm(sat)", "io": "Q=X"},
+ {"inst": "ssat Rd!=PC, #sat, Rn!=PC, lsl_or_asr #n" , "a32": "cond|011|0101|imm:5|Rd|n:5|sop:2|1|Rn" , "imm": "SsatImm(sat, n)", "io": "Q=X"},
+ {"inst": "ssat16 Rd!=PC, #sat, Rn!=PC" , "a32": "cond|011|0101|0|imm:4|Rd|1111|0011|Rn" , "imm": "Ssat16Imm(sat)", "io": "Q=X"},
+ {"inst": "ssax Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0000|1|Rn|Rd|1111|0101|Rm" , "io": "GE=W"},
+ {"inst": "ssub16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0000|1|Rn|Rd|1111|0111|Rm" , "io": "GE=W"},
+ {"inst": "ssub8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0000|1|Rn|Rd|1111|1111|Rm" , "io": "GE=W"},
+ {"inst": "stmda [Rn!=PC]{!}, RsList" , "a32": "cond|100|000W|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmdb [Rn!=PC]{!}, RsList" , "a32": "cond|100|100W|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmia [Rn!=PC]{!}, RsList" , "a32": "cond|100|010W|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmib [Rn!=PC]{!}, RsList" , "a32": "cond|100|110W|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmda [Rn!=PC], RsList^" , "a32": "cond|100|0010|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmdb [Rn!=PC], RsList^" , "a32": "cond|100|1010|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmia [Rn!=PC], RsList^" , "a32": "cond|100|0110|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "stmib [Rn!=PC], RsList^" , "a32": "cond|100|1110|0|Rn|immMask:16" , "imm": "GpListImm(RsList)"},
+ {"inst": "str Rs, [Rn!=PC, +/-Rm!=PC, {sop #n}]{@}{!}" , "a32": "cond|011|PU0W|0|Rn|Rs|n:5|sop:2|0|Rm"},
+ {"inst": "str Rs, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|010|PU0W|0|Rn|Rs|off:12"},
+ {"inst": "str Rs, [Rn==PC, #+/-off]" , "a32": "cond|010|1U00|0|Rn|Rs|off:12"},
+ {"inst": "strb Rs!=PC, [Rn!=PC, +/-Rm!=PC, {sop #n}]{@}{!}" , "a32": "cond|011|PU1W|0|Rn|Rs|n:5|sop:2|0|Rm"},
+ {"inst": "strb Rs!=PC, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|010|PU1W|0|Rn|Rs|off:12"},
+ {"inst": "strb Rs!=PC, [Rn==PC, #+/-off]" , "a32": "cond|010|1U10|0|Rn|Rs|off:12"},
+ {"inst": "strbt Rs!=PC, [Rn!=PC, +/-Rm!=PC, {sop #n}]@" , "a32": "cond|011|0U11|0|Rn|Rs|n:5|sop:2|0|Rm"},
+ {"inst": "strbt Rs!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|010|0U11|0|Rn|Rs|off:12"},
+ {"inst": "strbt Rs!=PC, [Rn==PC, #+/-off]" , "a32": "cond|010|0U11|0|Rn|Rs|off:12"},
+ {"inst": "strd Rs<=13, Rs2+, [Rn!=PC, +/-Rm!=PC]{@}{!}" , "a32": "cond|000|PU0W|0|Rn|Rs|0000|1111|Rm"},
+ {"inst": "strd Rs<=13, Rs2+, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|000|PU1W|0|Rn|Rs|off:4|1111|off:4"},
+ {"inst": "strd Rs<=13, Rs2+, [Rn==PC, #+/-off]" , "a32": "cond|000|1U10|0|Rn|Rs|off:4|1111|off:4"},
+ {"inst": "strex Rd!=PC, Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1100|0|Rn|Rd|1111|1001|Rs"},
+ {"inst": "strexb Rd!=PC, Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1110|0|Rn|Rd|1111|1001|Rs"},
+ {"inst": "strexd Rd!=PC, Rs!=PC, Rs2+, [Rn!=PC]" , "a32": "cond|000|1101|0|Rn|Rd|1111|1001|Rs"},
+ {"inst": "strexh Rd!=PC, Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1111|0|Rn|Rd|1111|1001|Rs"},
+ {"inst": "strh Rs!=PC, [Rn!=PC, +/-Rm!=PC]{@}{!}" , "a32": "cond|000|PU0W|0|Rn|Rs|0000|1011|Rm"},
+ {"inst": "strh Rs!=PC, [Rn!=PC, #+/-off]{@}{!}" , "a32": "cond|000|PU1W|0|Rn|Rs|off:4|1011|off:4"},
+ {"inst": "strh Rs!=PC, [Rn==PC, #+/-off]" , "a32": "cond|000|1U10|0|Rn|Rs|off:4|1011|off:4"},
+ {"inst": "strht Rs!=PC, [Rn!=PC, +/-Rm!=PC]@" , "a32": "cond|000|0U01|0|Rn|Rs|0000|1011|Rm"},
+ {"inst": "strht Rs!=PC, [Rn!=PC, #+/-off]@" , "a32": "cond|000|0U11|0|Rn|Rs|off:4|1011|off:4"},
+ {"inst": "strt Rs, [Rn!=PC, +/-Rm!=PC, {sop #n}]@" , "a32": "cond|011|0U01|0|Rn|Rs|n:5|sop:2|0|Rm"},
+ {"inst": "strt Rs, [Rn!=PC, #+/-off]@" , "a32": "cond|010|0U01|0|Rn|Rs|off:12"},
+ {"inst": "sub Rd, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0010|0|Rn|Rd|Rs|0|sop:2|1|Rm"},
+ {"inst": "sub Rd, Rn, Rm, {sop #n}" , "a32": "cond|000|0010|0|Rn|Rd|n:5|sop:2|0|Rm"},
+ {"inst": "sub Rd, Rn, #immA" , "a32": "cond|001|0010|0|Rn|Rd|imm:12"},
+ {"inst": "subS Rd!=PC, Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|0010|1|Rn|Rd|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=PC, Rn, Rm, {sop #n}" , "a32": "cond|000|0010|1|Rn|Rd|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=PC, Rn, #immA" , "a32": "cond|001|0010|1|Rn|Rd|imm:12" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "svc #immZ" , "a32": "cond|1111|immZ:24"},
+ {"inst": "sxtab Rd!=PC, Rn!=PC, Rm!=PC, {ror #n}" , "a32": "cond|011|0101|0|Rn|Rd|imm:2|00|0111|Rm" , "imm": "Ror8Imm(n)"},
+ {"inst": "sxtab16 Rd!=PC, Rn!=PC, Rm!=PC, {ror #n}" , "a32": "cond|011|0100|0|Rn|Rd|imm:2|00|0111|Rm" , "imm": "Ror8Imm(n)"},
+ {"inst": "sxtah Rd!=PC, Rn!=PC, Rm!=PC, {ror #n}" , "a32": "cond|011|0101|1|Rn|Rd|imm:2|00|0111|Rm" , "imm": "Ror8Imm(n)"},
+ {"inst": "sxtb Rd!=PC, Rn!=PC, {ror #n}" , "a32": "cond|011|0101|0|1111|Rd|imm:2|00|0111|Rn" , "imm": "Ror8Imm(n)"},
+ {"inst": "sxtb16 Rd!=PC, Rn!=PC, {ror #n}" , "a32": "cond|011|0100|0|1111|Rd|imm:2|00|0111|Rn" , "imm": "Ror8Imm(n)"},
+ {"inst": "sxth Rd!=PC, Rn!=PC, {ror #n}" , "a32": "cond|011|0101|1|1111|Rd|imm:2|00|0111|Rn" , "imm": "Ror8Imm(n)"},
+ {"inst": "teq Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1001|1|Rn|0000|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "teq Rn, Rm, {sop #n}" , "a32": "cond|000|1001|1|Rn|0000|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "teq Rn, #immA" , "a32": "cond|001|1001|1|Rn|0000|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "tst Rn!=PC, Rm!=PC, sop Rs!=PC" , "a32": "cond|000|1000|1|Rn|0000|Rs|0|sop:2|1|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "tst Rn, Rm, {sop #n}" , "a32": "cond|000|1000|1|Rn|0000|n:5|sop:2|0|Rm" , "io": "N=W Z=W C=W"},
+ {"inst": "tst Rn, #immA" , "a32": "cond|001|1000|1|Rn|0000|imm:12" , "io": "N=W Z=W C=W"},
+ {"inst": "uadd16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0010|1|Rn|Rd|1111|0001|Rm" , "io": "GE=W"},
+ {"inst": "uadd8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0010|1|Rn|Rd|1111|1001|Rm" , "io": "GE=W"},
+ {"inst": "uasx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0010|1|Rn|Rd|1111|0011|Rm" , "io": "GE=W"},
+ {"inst": "ubfx Rd!=PC, Rn!=PC, #lsb, #width" , "a32": "cond|011|1111|widthM1:5|Rd|lsb:5|101|Rn" , "imm": "SbfxUbfxImm(lsb, width)"},
+ {"inst": "udf #immZ" , "a32": "1110|011|1111|1|immZ:12|1111|immZ:4"},
+ {"inst": "uhadd8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|1|Rn|Rd|1111|1001|Rm"},
+ {"inst": "uhadd16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|1|Rn|Rd|1111|0001|Rm"},
+ {"inst": "uhasx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|1|Rn|Rd|1111|0011|Rm"},
+ {"inst": "uhsax Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|1|Rn|Rd|1111|0101|Rm"},
+ {"inst": "uhsub16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|1|Rn|Rd|1111|0111|Rm"},
+ {"inst": "uhsub8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|1|Rn|Rd|1111|1111|Rm"},
+ {"inst": "umaal RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0010|0|RxHi|RxLo|Rm|1001|Rn"},
+ {"inst": "umlal RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0101|0|RxHi|RxLo|Rm|1001|Rn"},
+ {"inst": "umlalS RxLo!=PC, RxHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0101|1|RxHi|RxLo|Rm|1001|Rn" , "io": "N=W Z=W"},
+ {"inst": "umull RdLo!=PC, RdHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0100|0|RdHi|RdLo|Rm|1001|Rn"},
+ {"inst": "umullS RdLo!=PC, RdHi!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|0100|1|RdHi|RdLo|Rm|1001|Rn" , "io": "N=W Z=W"},
+ {"inst": "uqadd16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|0|Rn|Rd|1111|0001|Rm"},
+ {"inst": "uqadd8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|0|Rn|Rd|1111|1001|Rm"},
+ {"inst": "uqasx Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|0|Rn|Rd|1111|0011|Rm"},
+ {"inst": "uqsax Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|0|Rn|Rd|1111|0101|Rm"},
+ {"inst": "uqsub16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|0|Rn|Rd|1111|0111|Rm"},
+ {"inst": "uqsub8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0011|0|Rn|Rd|1111|1111|Rm"},
+ {"inst": "usad8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1100|0|Rd|1111|Rm|0001|Rn"},
+ {"inst": "usada8 Rd!=PC, Rn!=PC, Rm!=PC, Ra!=PC" , "a32": "cond|011|1100|0|Rd|Ra|Rm|0001|Rn"},
+ {"inst": "usat Rd!=PC, #sat, Rn!=PC, {lsl_or_asr #n}" , "a32": "cond|011|0111|sat:5|Rd|n:5|sop:2|1|Rn"},
+ {"inst": "usat16 Rd!=PC, #sat, Rn!=PC" , "a32": "cond|011|0111|0|sat:4|Rd|1111|0011|Rn"},
+ {"inst": "usax Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0010|1|Rn|Rd|1111|0101|Rm" , "io": "GE=W"},
+ {"inst": "usub16 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0010|1|Rn|Rd|1111|0111|Rm" , "io": "GE=W"},
+ {"inst": "usub8 Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|0010|1|Rn|Rd|1111|1111|Rm" , "io": "GE=W"},
+ {"inst": "uxtab Rd!=PC, Rn!=PC, Rm!=PC, {ror #n}" , "a32": "cond|011|0111|0|Rn|Rd|imm:2|00|0111|Rm" , "imm": "Ror8Imm(n)"},
+ {"inst": "uxtab16 Rd!=PC, Rn!=PC, Rm!=PC, {ror #n}" , "a32": "cond|011|0110|0|Rn|Rd|imm:2|00|0111|Rm" , "imm": "Ror8Imm(n)"},
+ {"inst": "uxtah Rd!=PC, Rn!=PC, Rm!=PC, {ror #n}" , "a32": "cond|011|0111|1|Rn|Rd|imm:2|00|0111|Rm" , "imm": "Ror8Imm(n)"},
+ {"inst": "uxtb Rd!=PC, Rn!=PC, {ror #n}" , "a32": "cond|011|0111|0|1111|Rd|imm:2|00|0111|Rn" , "imm": "Ror8Imm(n)"},
+ {"inst": "uxtb16 Rd!=PC, Rn!=PC, {ror #n}" , "a32": "cond|011|0110|0|1111|Rd|imm:2|00|0111|Rn" , "imm": "Ror8Imm(n)"},
+ {"inst": "uxth Rd!=PC, Rn!=PC, {ror #n}" , "a32": "cond|011|0111|1|1111|Rd|imm:2|00|0111|Rn" , "imm": "Ror8Imm(n)"},
+ {"inst": "wfe" , "a32": "cond|001|1001|0|0000|1111|0000|0000|0010"},
+ {"inst": "wfi" , "a32": "cond|001|1001|0|0000|1111|0000|0000|0011"},
+ {"inst": "yield" , "a32": "cond|001|1001|0|0000|1111|0000|0000|0001"}
+ ]},
+
+ {"category": "GP", "data": [
+ {"inst": "adc Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|101|Rm:3|Rx:3" , "it": "in" , "io": "C=R"},
+ {"inst": "adc Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1010|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "C=R"},
+ {"inst": "adc Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1010|0|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "C=R"},
+ {"inst": "adcS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|101|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=X V=W", "mod": "APSR_IF_NOT_PC"},
+ {"inst": "adcS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1010|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=X V=W", "mod": "APSR_IF_NOT_PC"},
+ {"inst": "adcS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1010|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=X V=W", "mod": "APSR_IF_NOT_PC"},
+ {"inst": "add Rd!=HI, Rn!=HI, Rm!=HI" , "t16": "0001|100|Rm:3|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "add Rx!=XX, Rx!=XX, Rm!=XX" , "t16": "0100|010|0|Rx:1|Rm:4|Rx:3" , "it": "in"},
+ {"inst": "add Rx, Rx, Rm==SP" , "t16": "0100|010|0|Rx:1|Rm:4|Rx:3" , "it": "any"},
+ {"inst": "add Rx==SP, Rx==SP, Rm" , "t16": "0100|010|0|Rx:1|Rm:4|Rx:3" , "it": "any"},
+ {"inst": "add Rx!=HI, Rx!=HI, #immZ" , "t16": "0011|0|Rx:3|immZ:8" , "it": "in"},
+ {"inst": "add Rd!=HI, Rn!=HI, #immZ" , "t16": "0001|110|immZ:3|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "add Rx==SP, Rx==SP, #immZ*4" , "t16": "1011|00000|immZ:7" , "it": "any"},
+ {"inst": "add Rd!=SP, Rn==SP, #immZ*4" , "t16": "1010|1|Rd:3|immZ:8" , "it": "any"},
+ {"inst": "add Rd!=XX, Rn!=PC, Rm!=XX, {sop #n}" , "t32": "1110|101|1000|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "add Rd!=PC, Rn==SP, Rm!=XX, {sop #n}" , "t32": "1110|101|1000|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "mod": "LSL_3_IF_SP"},
+ {"inst": "add Rd!=XX, Rn!=PC, #immZ" , "t32": "1111|0|immZ:1|1|0000|0|Rn|0|immZ:3|Rd|immZ:8" , "it": "any"},
+ {"inst": "add Rd!=XX, Rn!=PC, #immA" , "t32": "1111|0|imm:1|0|1000|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "add Rd!=PC, Rn==SP, #immZ" , "t32": "1111|0|immZ:1|1|0000|0|Rn|0|immZ:3|Rd|immZ:8" , "it": "any"},
+ {"inst": "add Rd!=PC, Rn==SP, #immA" , "t32": "1111|0|imm:1|0|1000|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "addS Rx!=HI, Rx!=HI, #immZ" , "t16": "0011|0|Rx:3|immZ:8" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=HI, Rn!=HI, #immZ" , "t16": "0001|110|immZ:3|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=HI, Rn!=HI, Rm!=HI" , "t16": "0001|100|Rm:3|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=XX, Rn!=PC, Rm!=XX, {sop #n}" , "t32": "1110|101|1000|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=PC, Rn==SP, Rm!=XX, {sop #n}" , "t32": "1110|101|1000|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W", "mod": "LSL_3_IF_SP"},
+ {"inst": "addS Rd!=XX, Rn!=PC, #immA" , "t32": "1111|0|imm:1|0|1000|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "addS Rd!=PC, Rn==SP, #immA" , "t32": "1111|0|imm:1|0|1000|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "adr Rd!=HI, #relZ*4" , "t16": "1010|0|Rd:3|relZ:8" , "it": "any"},
+ {"inst": "adr Rd!=XX, #relZ" , "t32": "1111|0|relZ:1|10N0N|0|1111|0|relZ:3|Rd|relZ:8" , "it": "any"},
+ {"inst": "and Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|000|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "and Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0000|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "and Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1010|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "andS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|000|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "andS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0000|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "andS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1010|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W", "mod": "APSR_IF_NOT_PC"},
+ {"inst": "asr Rd!=HI, Rn!=HI, #n" , "t16": "0001|0|n:5|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "asr Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|100|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "asr Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|0|1111|0|n:3|Rd|n:2|10|Rn" , "it": "any"},
+ {"inst": "asr Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0010|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "asrS Rd!=HI, Rn!=HI, #n" , "t16": "0001|0|n:5|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "asrS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|100|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "asrS Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|1|1111|0|n:3|Rd|n:2|10|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "asrS Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0010|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "b #relS*2" , "t16": "1110|0|relS:11" , "it": "out last"},
+ {"inst": "b #relS*2" , "t32": "1111|0|relS[23]|relS[20:11]|10|ja|1|jb|relS[10:0]" , "it": "out last", "calc": {"ja": "relS[23] ^ relS[22] ^ 1", "jb": "relS[23] ^ relS[21] ^ 1"}},
+ {"inst": "b #relS*2" , "t16": "1101|cond|relS:8" , "it": "out"},
+ {"inst": "b #relS*2" , "t32": "1111|0|relS[19]|cond|relS[16:11]|10|ja|0|jb|relS[10:0]" , "it": "out" , "calc": {"ja": "relS[19] ^ relS[18] ^ 1", "jb": "relS[19] ^ relS[17] ^ 1"}},
+ {"inst": "bfc Rd!=XX, #lsb, #width" , "t32": "1111|001|1011|0|1111|0|lsb:3|Rd|lsb:2|0|msb:5" , "it": "any", "imm": "BfcBfiImm(lsb, width)"},
+ {"inst": "bfi Rd!=XX, Rn!=XX, #lsb, #width" , "t32": "1111|001|1011|0|Rn|0|lsb:3|Rd|lsb:2|0|msb:5" , "it": "any", "imm": "BfcBfiImm(lsb, width)"},
+ {"inst": "bic Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|001|110|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "bic Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0001|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "bic Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0001|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "bicS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|001|110|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "bicS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0001|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "bicS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0001|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "bkpt #immZ" , "t16": "1011|111|0|immZ:8" , "it": "uncond"},
+ {"inst": "bl #relS*2" , "t32": "1111|0|relS[23]|relS[20:11]|11|ja|1|jb|relS[10:0]" , "it": "out last", "calc": {"ja": "relS[23] ^ relS[22] ^ 1", "jb": "relS[23] ^ relS[21] ^ 1"}},
+ {"inst": "blx Rm!=PC" , "t16": "0100|011|11|Rm:4|000" , "it": "out last"},
+ {"inst": "blx #relS*4" , "t32": "1111|0|relS[22]|relS[19:10]|11|ja|0|jb|relS[9:0]|0" , "it": "out last", "calc": {"ja": "relS[22] ^ relS[21] ^ 1", "jb": "relS[22] ^ relS[20] ^ 1"}},
+ {"inst": "bx Rm" , "t16": "0100|011|10|Rm:4|000" , "it": "out last"},
+ {"inst": "bxj Rm!=XX" , "t32": "1111|001|1110|0|Rm|1000|1111|00000000" , "it": "out last"},
+ {"inst": "cbz Rn!=HI, #relZ*2" , "t16": "1011|00|relZ:1|1|relZ:5|Rn:3" , "it": "out"},
+ {"inst": "cbnz Rn!=HI, #relZ*2" , "t16": "1011|10|relZ:1|1|relZ:5|Rn:3" , "it": "out"},
+ {"inst": "clz Rd!=XX, Rn!=XX" , "t32": "1111|101|0101|1|Rm|1111|Rd|1000|Rn" , "it": "any"},
+ {"inst": "cmn Rn!=HI, Rm!=HI" , "t16": "0100|001|011|Rm:3|Rn:3" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Rn!=PC, Rm!=XX, {sop #n}" , "t32": "1110|101|1000|1|Rn|0|n:3|1111|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Rn!=PC, #immA" , "t32": "1111|0|imm:1|0|1000|1|Rn|0|imm:3|1111|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn!=HI, #immZ" , "t16": "0010|1|Rn:3|immZ:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn!=HI, Rm!=HI" , "t16": "0100|001|010|Rm:3|Rn:3" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn!=PC, Rm!=PC" , "t16": "0100|010|1|Rn:1|Rm:4|Rn:3" , "it": "any", "io": "N=W Z=W C=W V=W", "mod": "UNPRED_IF_ALL_LOW"},
+ {"inst": "cmp Rn!=PC, Rm!=XX, {sop #n}" , "t32": "1110|101|1101|1|Rn|0|n:3|1111|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Rn!=PC, #immA" , "t32": "1111|0|imm:1|0|1101|1|Rn|0|imm:3|1111|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "dbg #immZ" , "t32": "1111|001|1101|0|1111|1000|0000|1111|immZ:4" , "it": "any"},
+ {"inst": "eor Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|001|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "eor Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0100|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "eor Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0100|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "eorS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|001|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "eorS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0100|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "eorS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0100|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "hlt #immZ" , "t16": "1011|1010|10|immZ:6" , "it": "out", "ext": "ARMv8+"},
+ {"inst": "it #cond!=15" , "t16": "1011|111|1|cond[3:0]|1000" , "it": "out def"},
+ {"inst": "ite #cond!=15" , "t16": "1011|111|1|cond[3:0]|X100" , "it": "out def"},
+ {"inst": "itee #cond!=15" , "t16": "1011|111|1|cond[3:0]|XY10" , "it": "out def"},
+ {"inst": "iteee #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "iteet #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "itet #cond!=15" , "t16": "1011|111|1|cond[3:0]|XY10" , "it": "out def"},
+ {"inst": "itete #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "itett #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "itt #cond!=15" , "t16": "1011|111|1|cond[3:0]|X100" , "it": "out def"},
+ {"inst": "itte #cond!=15" , "t16": "1011|111|1|cond[3:0]|XY10" , "it": "out def"},
+ {"inst": "ittee #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "ittet #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "ittt #cond!=15" , "t16": "1011|111|1|cond[3:0]|XY10" , "it": "out def"},
+ {"inst": "ittte #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "itttt #cond!=15" , "t16": "1011|111|1|cond[3:0]|XYZ1" , "it": "out def"},
+ {"inst": "ldmia [Rn!=HI]{!}, RdList" , "t16": "1100|1|Rn:3|imm:8" , "it": "any", "imm": "GpListImm(RdList, 0xFF)"},
+ {"inst": "ldmia [Rn!=PC]{!}, RdList" , "t32": "1110|100|010W|1|Rn|immMask[15:14]|0|immMask[12:0]" , "it": "any", "imm": "GpListImm(RdList, 0xDFFF)"},
+ {"inst": "ldmdb [Rn!=PC]{!}, RdList" , "t32": "1110|100|100W|1|Rn|immMask[15:14]|0|immMask[12:0]" , "it": "any", "imm": "GpListImm(RdList, 0xDFFF)"},
+ {"inst": "ldr Rd!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|100|Rm:3|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldr Rd, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0010|1|Rn|Rd|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "ldr Rd!=HI, [Rn!=HI, #off*4]" , "t16": "0110|1|off:5|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldr Rd!=HI, [Rn==SP, #off*4]" , "t16": "1001|1|Rd:3|off:8" , "it": "any"},
+ {"inst": "ldr Rd!=HI, [Rn==PC, #off*4]" , "t16": "0100|1|Rd:3|off:8" , "it": "any"},
+ {"inst": "ldr Rd, [Rn!=PC, #off]" , "t32": "1111|100|0110|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldr Rd, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|0010|1|Rn|Rd|1PUW|off:8" , "it": "any"},
+ {"inst": "ldr Rd, [Rn==PC, #+/-off]" , "t32": "1111|100|0U10|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrb Rd!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|110|Rm:3|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldrb Rd!=XX, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0000|1|Rn|Rd|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "ldrb Rd!=HI, [Rn!=HI, #off*4]" , "t16": "0111|1|off:5|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldrb Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0100|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrb Rd!=XX, [Rn!=PC, #+/-off]{!}" , "t32": "1111|100|0000|1|Rn|Rd|1PUW|off:8" , "it": "any"},
+ {"inst": "ldrb Rd!=XX, [Rn==PC, #+/-off]" , "t32": "1111|100|0U00|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrbt Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0000|1|Rn|Rd|1110|off:8" , "it": "any"},
+ {"inst": "ldrd Rd!=XX, Rd2!=XX, [Rn==PC, #+/-off*4]" , "t32": "1110|100|1U10|1|Rn|Rd|Rd2|off:8" , "it": "any"},
+ {"inst": "ldrd Rd!=XX, Rd2!=XX, [Rn!=PC, #+/-off*4]{@}{!}" , "t32": "1110|100|PU1W|1|Rn|Rd|Rd2|off:8" , "it": "any"},
+ {"inst": "ldrex Rd!=XX, [Rn!=PC, #off*4]" , "t32": "1110|100|0010|1|Rn|Rd|1111|off:8" , "it": "any"},
+ {"inst": "ldrh Rd!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|101|Rm:3|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldrh Rd!=XX, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0001|1|Rn|Rd|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "ldrh Rd!=HI, [Rn!=HI, #off*4]" , "t16": "1000|1|off:5|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldrh Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0101|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrh Rd!=XX, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|0001|1|Rn|Rd|1PUW|off:8" , "it": "any"},
+ {"inst": "ldrh Rd!=XX, [Rn==PC, #+/-off]" , "t32": "1111|100|0U01|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrht Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0001|1|Rn|Rd|1110|off:8" , "it": "any"},
+ {"inst": "ldrsb Rd!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|011|Rm:3|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldrsb Rd!=XX, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|1000|1|Rn|Rd|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "ldrsb Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|1100|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrsb Rd!=XX, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|1000|1|Rn|Rd|1PUW|off:8" , "it": "any"},
+ {"inst": "ldrsb Rd!=XX, [Rn==PC, #+/-off]" , "t32": "1111|100|1U00|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrsbt Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|1000|1|Rn|Rd|1110|off:8" , "it": "any"},
+ {"inst": "ldrsh Rd!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|111|Rm:3|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "ldrsh Rd!=XX, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|1001|1|Rn|Rd|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "ldrsh Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|1101|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrsh Rd!=XX, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|1001|1|Rn|Rd|1PUW|off:8" , "it": "any"},
+ {"inst": "ldrsh Rd!=XX, [Rn==PC, #+/-off]" , "t32": "1111|100|1U01|1|Rn|Rd|off:12" , "it": "any"},
+ {"inst": "ldrsht Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|1001|1|Rn|Rd|1110|off:8" , "it": "any"},
+ {"inst": "ldrt Rd!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0010|1|Rn|Rd|1110|off:8" , "it": "any"},
+ {"inst": "lsl Rd!=HI, Rn!=HI, #n" , "t16": "0000|0|n:5|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "lsl Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|0|1111|0|n:3|Rd|n:2|00|Rn" , "it": "any"},
+ {"inst": "lsl Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|010|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "lsl Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0000|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "lslS Rd!=HI, Rn!=HI, #n" , "t16": "0000|0|n:5|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "lslS Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|1|1111|0|n:3|Rd|n:2|00|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "lslS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|010|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "lslS Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1110|101|0000|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "lsr Rd!=HI, Rn!=HI, #n" , "t16": "0000|1|n:5|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "lsr Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|0|1111|0|n:3|Rd|n:2|01|Rn" , "it": "any"},
+ {"inst": "lsr Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|011|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "lsr Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0001|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "lsrS Rd!=HI, Rn!=HI, #n" , "t16": "0000|1|n:5|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "lsrS Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|1|1111|0|n:3|Rd|n:2|01|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "lsrS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|011|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "lsrS Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1110|101|0001|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "mcr #CP, #Op1, Rs!=XX, Cn, Cm, {#Op2}" , "t32": "1110|111|0|Op1:3|0|Cn:4|Rs|CP:4|Op2:3|1|Cm:4" , "ext": "ARMv6T2+"},
+ {"inst": "mcr2 #CP, #Op1, Rs!=XX, Cn, Cm, {#Op2}" , "t32": "1111|111|0|Op1:3|0|Cn:4|Rs|CP:4|Op2:3|1|Cm:4" , "ext": "ARMv6T2+"},
+ {"inst": "mcrr #CP, #Op1, Rs!=XX, Rs2!=XX, Cm" , "t32": "1110|110|0010|0|Rs2|Rs|CP:4|Op1:4|Cm:4" , "ext": "ARMv6T2+"},
+ {"inst": "mcrr2 #CP, #Op1, Rs!=XX, Rs2!=XX, Cm" , "t32": "1111|110|0010|0|Rs2|Rs|CP:4|Op1:4|Cm:4" , "ext": "ARMv6T2+"},
+ {"inst": "mla Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1000|0|Rn|Ra|Rd|0000|Rm" , "it": "any"},
+ {"inst": "mls Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1000|0|Rn|Ra|Rd|0001|Rm" , "it": "any"},
+ {"inst": "mov Rd, Rn" , "t16": "0100|0110|Rd:1|Rn:4|Rd:3" , "it": "in", "mod": "ARMv6T2_IF_LOW"},
+ {"inst": "mov Rx!=HI, Rx!=HI, lsl Rm!=HI" , "t16": "0100|000|010|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "mov Rx!=HI, Rx!=HI, lsr Rm!=HI" , "t16": "0100|000|011|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "mov Rx!=HI, Rx!=HI, asr Rm!=HI" , "t16": "0100|000|100|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "mov Rx!=HI, Rx!=HI, ror Rm!=HI" , "t16": "0100|000|111|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "mov Rd!=HI, Rn!=HI, lsl #n" , "t16": "0000|0|n:5|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "mov Rd!=HI, Rn!=HI, lsr #n" , "t16": "0000|1|n:5|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "mov Rd!=HI, Rn!=HI, asr #n" , "t16": "0001|0|n:5|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "mov Rd!=HI, #immZ" , "t16": "0010|0|Rd:3|immZ:8" , "it": "in"},
+ {"inst": "mov Rd!=PC, Rn" , "t32": "1110|101|0010|0|1111|0000|Rd|0000|Rn" , "it": "any", "mod": "UNPRED_COMPLEX"},
+ {"inst": "mov Rd!=XX, Rn!=XX, sop #n" , "t32": "1110|101|0010|0|1111|0|n:3|Rd|n:2|sop:2|Rn" , "it": "any"},
+ {"inst": "mov Rd!=XX, Rn!=XX, sop Rm!=XX" , "t32": "1111|101|00|sop:2|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "mov Rd!=XX, #immA" , "t32": "1111|0|imm:1|0|0010|0|1111|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "movS Rd!=HI, Rn!=HI" , "t16": "0000|0000|00|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rx!=HI, Rx!=HI, lsl Rm!=HI" , "t16": "0100|000|010|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rx!=HI, Rx!=HI, lsr Rm!=HI" , "t16": "0100|000|011|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rx!=HI, Rx!=HI, asr Rm!=HI" , "t16": "0100|000|100|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rx!=HI, Rx!=HI, ror Rm!=HI" , "t16": "0100|000|111|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=HI, Rn!=HI, lsl #n" , "t16": "0000|0|n:5|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=HI, Rn!=HI, lsr #n" , "t16": "0000|1|n:5|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=HI, Rn!=HI, asr #n" , "t16": "0001|0|n:5|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=HI, #immZ" , "t16": "0010|0|Rd:3|immZ:8" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=XX, Rn" , "t32": "1110|101|0010|1|1111|0000|Rd|0000|Rn" , "it": "any", "io": "N=W Z=W C=W", "mod": "UNPRED_COMPLEX"},
+ {"inst": "movS Rd!=XX, Rn!=XX, sop Rm!=XX" , "t32": "1110|101|00|sop:2|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=XX, Rn!=XX, sop #n" , "t32": "1110|101|0010|1|1111|0|n:3|Rd|n:2|sop:2|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "movS Rd!=XX, #immA" , "t32": "1111|0|imm:1|0|0010|1|1111|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "movt Rx!=XX, #immZ" , "t32": "1111|0|immZ:1|1|0110|0|immZ:4|0|immZ:3|Rx|immZ:8" , "it": "any"},
+ {"inst": "movw Rd!=XX, #immZ" , "t32": "1111|0|immZ:1|1|0010|0|immZ:4|0|immZ:3|Rd|immZ:8" , "it": "any"},
+ {"inst": "mrc #CP, #op1, Rd!=XX, Cn, Cm, {#op2}" , "t32": "1110|111|0|op1:3|1|Cn:4|Rd|CP:4|op2:3|1|Cm:4" , "it": "any"},
+ {"inst": "mrc2 #CP, #op1, Rd!=XX, Cn, Cm, {#op2}" , "t32": "1111|111|0|op1:3|1|Cn:4|Rd|CP:4|op2:3|1|Cm:4" , "it": "any"},
+ {"inst": "mrrc #CP, #op1, Rd!=XX, Rd2!=Rd, Cm" , "t32": "1110|110|0010|1|Rd2|Rd|CP:4|op1:4|Cm:4" , "it": "any"},
+ {"inst": "mrrc2 #CP, #op1, Rd!=XX, Rd2!=Rd, Cm" , "t32": "1111|110|0010|1|Rd2|Rd|CP:4|op1:4|Cm:4" , "it": "any"},
+ {"inst": "mrs Rd!=XX, #APSR" , "t32": "11110011111|APSR:1|1111|1000|Rd|0000|0000" , "it": "any"},
+ {"inst": "msr #APSR, Rn!=PC" , "t32": "1111|001|1100|0|Rn|1100|APSR:2|00|0000|0000" , "it": "any"},
+ {"inst": "mul Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|001|101|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "mulS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|001|101|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W"},
+ {"inst": "mul Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1000|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "mvn Rd!=HI, Rn!=HI" , "t16": "0100|001|111|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "mvn Rd!=XX, Rn!=XX, {sop #n}" , "t32": "1110|101|0011|0|1111|0|n:3|Rd|n:2|sop:2|Rn" , "it": "any"},
+ {"inst": "mvn Rd!=XX, #immA" , "t32": "1111|0|imm:1|0|0011|0|1111|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "mvnS Rd!=HI, Rn!=HI" , "t16": "0100|001|111|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "mvnS Rd!=XX, Rn!=XX, {sop #n}" , "t32": "1110|101|0011|1|1111|0|n:3|Rd|n:2|sop:2|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "mvnS Rd!=XX, #immA" , "t32": "1111|0|imm:1|0|0011|1|1111|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "nop" , "t16": "1011|111|1000|0|0000" , "it": "any"},
+ {"inst": "nop" , "t32": "1111|001|1101|0|1111|1000|0000|0000|0000" , "it": "any"},
+ {"inst": "orn Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0011|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "orn Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0011|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "ornS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0011|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "ornS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0011|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "orr Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|001|100|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "orr Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0010|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "orr Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0010|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "orrS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|001|100|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "orrS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|0010|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "orrS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0010|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "pkhbt Rd!=XX, Rn!=XX, Rm!=XX, {lsl #n}" , "t32": "1110|101|0110|0|Rn|0|n:3|Rd|n:2|00|Rm" , "it": "any"},
+ {"inst": "pkhtb Rd!=XX, Rn!=XX, Rm!=XX, {asr #n}" , "t32": "1110|101|0110|0|Rn|0|n:3|Rd|n:2|10|Rm" , "it": "any"},
+ {"inst": "pld [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0000|1|Rn|1111|0000|00|n:2|Rm" , "it": "any"},
+ {"inst": "pld [Rn!=PC, #off]" , "t32": "1111|100|0100|1|Rn|1111|off:12" , "it": "any"},
+ {"inst": "pld [Rn!=PC, #-off]" , "t32": "1111|100|0000|1|Rn|1111|1100|off:8" , "it": "any"},
+ {"inst": "pld [Rn==PC, #+/-off]" , "t32": "1111|100|0U00|1|Rn|1111|off:12" , "it": "any"},
+ {"inst": "pldw [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0001|1|Rn|1111|0000|00|n:2|Rm" , "it": "any"},
+ {"inst": "pldw [Rn!=PC, #off]" , "t32": "1111|100|0101|1|Rn|1111|off:12" , "it": "any"},
+ {"inst": "pldw [Rn!=PC, #-off]" , "t32": "1111|100|0001|1|Rn|1111|1100|off:8" , "it": "any"},
+ {"inst": "pop Rd!=SP" , "t32": "1111|100|0010|1|1101|Rd|1011|00000100" , "it": "any"},
+ {"inst": "pop RdList" , "t16": "1011|110|immMask[15]|immMask[7:0]" , "it": "any", "imm": "GpListImm(RsList, 0x80FF)"},
+ {"inst": "pop RdList" , "t32": "1110|100|0101|1|1101|immMask[15:14]|0|immMask[12:0]" , "it": "any", "imm": "GpListImm(RsList, 0xDFFF)"},
+ {"inst": "push Rs!=XX" , "t32": "1111|100|0010|0|1101|Rs|1101|0000|0100" , "it": "any"},
+ {"inst": "push RsList" , "t16": "1011|010|immMask[14]|immMask[7:0]" , "it": "any", "imm": "GpListImm(RsList, 0x40FF)"},
+ {"inst": "push RsList" , "t32": "1110|100|0101|0|1101|0|immMask[14]|0|immMask[12:0]" , "it": "any", "imm": "GpListImm(RsList, 0x5FFF)"},
+ {"inst": "qadd Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rm|1111|Rd|1000|Rn" , "it": "any", "io": "Q=X"},
+ {"inst": "qadd16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|1|Rm|1111|Rd|0001|Rn" , "it": "any"},
+ {"inst": "qadd8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rm|1111|Rd|0001|Rn" , "it": "any"},
+ {"inst": "qasx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rm|1111|Rd|0001|Rn" , "it": "any"},
+ {"inst": "qdadd Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rm|1111|Rd|1001|Rn" , "it": "any", "io": "Q=X"},
+ {"inst": "qdsub Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rm|1111|Rd|1011|Rn" , "it": "any", "io": "Q=X"},
+ {"inst": "qsax Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0111|0|Rm|1111|Rd|0001|Rn" , "it": "any"},
+ {"inst": "qsub Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rm|1111|Rd|1010|Rn" , "it": "any", "io": "Q=X"},
+ {"inst": "qsub16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|1|Rm|1111|Rd|0001|Rn" , "it": "any"},
+ {"inst": "qsub8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|0|Rm|1111|Rd|0001|Rn" , "it": "any"},
+ {"inst": "rbit Rd!=XX, Rn!=XX" , "t32": "1111|101|0100|1|Rm|1111|Rd|1010|Rn" , "it": "any"},
+ {"inst": "rev Rd!=HI, Rn!=HI" , "t16": "1011|101|000|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "rev Rd!=XX, Rn!=XX" , "t32": "1111|101|0100|1|Rm|1111|Rd|1000|Rn" , "it": "any"},
+ {"inst": "rev16 Rd!=HI, Rn!=HI" , "t16": "1011|101|001|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "rev16 Rd!=XX, Rn!=XX" , "t32": "1111|101|0100|1|Rm|1111|Rd|1001|Rn" , "it": "any"},
+ {"inst": "revsh Rd!=HI, Rn!=HI" , "t16": "1011|101|011|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "revsh Rd!=XX, Rn!=XX" , "t32": "1111|101|0100|1|Rm|1111|Rd|1011|Rn" , "it": "any"},
+ {"inst": "ror Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|0|1111|0|n:3|Rd|n:2|11|Rn" , "it": "any"},
+ {"inst": "ror Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|111|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "ror Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0011|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "rorS Rd!=XX, Rn!=XX, #n" , "t32": "1110|101|0010|1|1111|0|n:3|Rd|n:2|11|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "rorS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|111|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W"},
+ {"inst": "rorS Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0011|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "rsb Rd!=HI, Rn!=HI, #zero" , "t16": "0100|001001|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "rsb Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1110|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "rsb Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1110|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "rsbS Rd!=HI, Rn!=HI, #zero" , "t16": "0100|001001|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "rsbS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1110|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "rsbS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1110|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "rrx Rd!=XX, Rn!=XX" , "t32": "1110|101|0010|0|1111|0000|Rd|0011|Rn" , "it": "any", "io": "C=R"},
+ {"inst": "rrxS Rd!=XX, Rn!=XX" , "t32": "1110|101|0010|1|1111|0000|Rd|0011|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "sadd16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "sadd8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "sasx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "sbc Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|110|Rm:3|Rx:3" , "it": "in"},
+ {"inst": "sbc Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1011|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "sbc Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1011|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "sbcS Rx!=HI, Rx!=HI, Rm!=HI" , "t16": "0100|000|110|Rm:3|Rx:3" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "sbcS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1011|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "sbcS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1011|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "sbfx Rd!=XX, Rn!=XX, #lsb, #width" , "t32": "1111|001|1010|0|Rn|0|lsb:3|Rd|lsb:2|0|widthM1:5" , "it": "any", "imm": "SbfxUbfxImm(lsb, width)"},
+ {"inst": "sel Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rn|1111|Rd|1000|Rm" , "it": "any"},
+ {"inst": "setend #immZ" , "t16": "1011|0110|010|1|immZ:1|000" , "it": "out"},
+ {"inst": "shadd16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|1|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "shadd8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "shasx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "shsax Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0111|0|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "shsub16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|1|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "shsub8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|0|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "smlabb Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|1|Rn|Ra|Rd|0000|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlabt Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|1|Rn|Ra|Rd|0001|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlatb Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|1|Rn|Ra|Rd|0010|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlatt Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|1|Rn|Ra|Rd|0011|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlad Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|0|Rn|Ra|Rd|0000|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smladx Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|0|Rn|Ra|Rd|0001|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlal RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|0000|Rm" , "it": "any"},
+ {"inst": "smlalbb RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|1000|Rm" , "it": "any"},
+ {"inst": "smlalbt RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|1001|Rm" , "it": "any"},
+ {"inst": "smlaltb RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|1010|Rm" , "it": "any"},
+ {"inst": "smlaltt RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|1011|Rm" , "it": "any"},
+ {"inst": "smlald RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|1100|Rm" , "it": "any"},
+ {"inst": "smlaldx RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|0|Rn|RxLo|RxHi|1101|Rm" , "it": "any"},
+ {"inst": "smlawb Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|1|Rn|Ra|Rd|0000|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlawt Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1001|1|Rn|Ra|Rd|0001|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlsd Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1010|1|Rn|Ra|Rd|0000|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlsdx Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1010|1|Rn|Ra|Rd|0001|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlsld RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|1|Rn|RxLo|RxHi|1100|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smlsldx RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1110|1|Rn|RxLo|RxHi|1101|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smmla Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1010|1|Rn|Ra|Rd|0000|Rm" , "it": "any"},
+ {"inst": "smmlar Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1010|1|Rn|Ra|Rd|0001|Rm" , "it": "any"},
+ {"inst": "smmls Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1011|0|Rn|Ra|Rd|0000|Rm" , "it": "any"},
+ {"inst": "smmlsr Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1011|0|Rn|Ra|Rd|0001|Rm" , "it": "any"},
+ {"inst": "smmul Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1010|1|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "smmulr Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1010|1|Rn|1111|Rd|0001|Rm" , "it": "any"},
+ {"inst": "smuad Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1001|0|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smuadx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1001|0|Rn|1111|Rd|0001|Rm" , "it": "any", "io": "Q=X"},
+ {"inst": "smulbb Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1000|1|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "smulbt Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1000|1|Rn|1111|Rd|0001|Rm" , "it": "any"},
+ {"inst": "smultb Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1000|1|Rn|1111|Rd|0010|Rm" , "it": "any"},
+ {"inst": "smultt Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1000|1|Rn|1111|Rd|0011|Rm" , "it": "any"},
+ {"inst": "smull RdLo!=XX, RdHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1100|0|Rn|RdLo|RdHi|0000|Rm" , "it": "any"},
+ {"inst": "smulwb Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1001|1|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "smulwt Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1001|1|Rn|1111|Rd|0001|Rm" , "it": "any"},
+ {"inst": "smusd Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1010|0|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "smusdx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1010|0|Rn|1111|Rd|0001|Rm" , "it": "any"},
+ {"inst": "ssat Rd!=XX, #sat, Rn!=XX" , "t32": "1111|001|100|00|Rn|0|000|Rd|00|0|imm:5" , "it": "any", "imm": "SsatImm(sat)", "io": "Q=X"},
+ {"inst": "ssat Rd!=XX, #sat, Rn!=XX, lsl_or_asr #n" , "t32": "1111|001|100|sop:2|Rn|0|n:3|Rd|n:2|0|imm:5" , "it": "any", "imm": "SsatImm(sat, n)", "io": "Q=X"},
+ {"inst": "ssat16 Rd!=XX, #sat, Rn!=XX" , "t32": "1111|001|1001|0|Rn|0000|Rd|0000|imm:4" , "it": "any", "imm": "Ssat16Imm(sat)", "io": "Q=X"},
+ {"inst": "ssax Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0111|0|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "ssub16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|1|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "ssub8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|0|Rn|1111|Rd|0000|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "stmia [Rn!=HI]!, RsList" , "t16": "1100|0|Rn:3|immMask:8" , "it": "any", "imm": "GpListImm(RsList, 0xFF)"},
+ {"inst": "stmia [Rn!=PC]{!}, RsList" , "t32": "1110|100|010W|0|Rn|0|immMask[14]|0|immMask[12:0]" , "it": "any", "imm": "GpListImm(RsList, 0x5FFF)"},
+ {"inst": "stmdb [Rn!=PC]{!}, RsList" , "t32": "1110|100|100W|0|Rn|0|immMask[14]|0|immMask[12:0]" , "it": "any", "imm": "GpListImm(RsList, 0x5FFF)"},
+ {"inst": "str Rs!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|000|Rm:3|Rn:3|Rs:3" , "it": "any"},
+ {"inst": "str Rs!=PC, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0010|0|Rn|Rs|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "str Rs!=HI, [Rn==SP, #off*4]" , "t16": "1001|0|Rs:3|off:8" , "it": "any"},
+ {"inst": "str Rs!=HI, [Rn!=HI, #off*4]" , "t16": "0110|0|off:5|Rn:3|Rs:3" , "it": "any"},
+ {"inst": "str Rs!=PC, [Rn!=PC, #off]" , "t32": "1111|100|0110|0|Rn|Rs|off:12" , "it": "any"},
+ {"inst": "str Rs!=PC, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|0010|0|Rn|Rs|1PUW|off:8" , "it": "any"},
+ {"inst": "strb Rs!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|010|Rm:3|Rn:3|Rs:3" , "it": "any"},
+ {"inst": "strb Rs!=XX, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0000|0|Rn|Rs|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "strb Rs!=HI, [Rn!=HI, #off*4]" , "t16": "0111|0|off:5|Rn:3|Rs:3" , "it": "any"},
+ {"inst": "strb Rs!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0100|0|Rn|Rs|off:12" , "it": "any"},
+ {"inst": "strb Rs!=XX, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|0000|0|Rn|Rs|1PUW|off:8" , "it": "any"},
+ {"inst": "strbt Rs!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0000|0|Rn|Rs|1110|off:8" , "it": "any"},
+ {"inst": "strd Rs!=XX, Rs2!=XX, [Rn!=PC, #off]{@}{!}" , "t32": "1110|100|PU1W|0|Rn|Rs|Rs2|off:8" , "it": "any"},
+ {"inst": "strex Rd!=XX, Rs!=XX, [Rn!=PC, #off]" , "t32": "1110|100|0010|0|Rn|Rs|Rd|off:8" , "it": "any", "mod": "UNPRED_COMPLEX"},
+ {"inst": "strexb Rd!=XX, Rs!=XX, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|0100|Rd" , "it": "any", "mod": "UNPRED_COMPLEX"},
+ {"inst": "strexd Rd!=XX, Rs!=XX, Rs2!=XX, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|Rs2|0111|Rd" , "it": "any", "mod": "UNPRED_COMPLEX"},
+ {"inst": "strexh Rd!=XX, Rs!=XX, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|0101|Rd" , "it": "any", "mod": "UNPRED_COMPLEX"},
+ {"inst": "strh Rs!=HI, [Rn!=HI, Rm!=HI]" , "t16": "0101|001|Rm:3|Rn:3|Rs:3" , "it": "any"},
+ {"inst": "strh Rs!=XX, [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|0001|0|Rn|Rs|0|00000|n:2|Rm" , "it": "any"},
+ {"inst": "strh Rs!=HI, [Rn!=HI, #off*4]" , "t16": "1000|0|off:5|Rn:3|Rs:3" , "it": "any"},
+ {"inst": "strh Rs!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0101|0|Rn|Rs|off:12" , "it": "any"},
+ {"inst": "strh Rs!=XX, [Rn!=PC, #+/-off]{@}{!}" , "t32": "1111|100|0001|0|Rn|Rs|1PUW|off:8" , "it": "any"},
+ {"inst": "strht Rs!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0001|0|Rn|Rs|1110|off:8" , "it": "any"},
+ {"inst": "strt Rs!=XX, [Rn!=PC, #off]" , "t32": "1111|100|0010|0|Rn|Rs|1110|off:8" , "it": "any"},
+ {"inst": "sub Rd!=HI, Rn!=HI, Rm!=HI" , "t16": "0001|101|Rm:3|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "sub Rd!=HI, Rn!=HI, #immZ" , "t16": "0001|111|immZ:3|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "sub Rx!=HI, Rx!=HI, #immZ" , "t16": "0011|1|Rx:3|immZ:8" , "it": "in"},
+ {"inst": "sub Rx==SP, Rx==SP, #immZ*4" , "t16": "1011|00001|immZ:7" , "it": "any"},
+ {"inst": "sub Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1101|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "sub Rd!=PC, Rn==SP, Rm!=XX, {sop #n}" , "t32": "1110|101|1101|0|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any"},
+ {"inst": "sub Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1101|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "sub Rd!=PC, Rn==SP, #immA" , "t32": "1111|0|imm:1|0|1101|0|Rn|0|imm:3|Rd|imm:8" , "it": "any"},
+ {"inst": "sub Rd!=XX, Rn!=XX, #immZ" , "t32": "1111|0|immZ:1|1|0101|0|Rn|0|immZ:3|Rd|immZ:8" , "it": "any"},
+ {"inst": "sub Rd!=HI, Rn!=HI, Rm!=HI" , "t16": "0001|101|Rm:3|Rn:3|Rd:3" , "it": "in"},
+ {"inst": "subS Rd!=HI, Rn!=HI, #immZ" , "t16": "0001|111|immZ:3|Rn:3|Rd:3" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rx!=HI, Rx!=HI, #immZ" , "t16": "0001|1|Rx:3|immZ:8" , "it": "out", "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=XX, Rn!=XX, Rm!=XX, {sop #n}" , "t32": "1110|101|1101|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=PC, Rn==SP, Rm!=XX, {sop #n}" , "t32": "1110|101|1101|1|Rn|0|n:3|Rd|n:2|sop:2|Rm" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=XX, Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|1101|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=PC, Rn==SP, #immA" , "t32": "1111|0|imm:1|0|1101|1|Rn|0|imm:3|Rd|imm:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "subS Rd!=XX, Rn!=XX, #immZ" , "t32": "1111|0|immZ:1|1|0101|1|Rn|0|immZ:3|Rd|immZ:8" , "it": "any", "io": "N=W Z=W C=W V=W"},
+ {"inst": "svc #immZ" , "t16": "1101|1111|immZ:8" , "it": "any"},
+ {"inst": "sxtab Rd!=XX, Rn!=XX, Rm!=XX, {ror #n}" , "t32": "1111|101|0010|0|Rn|1111|Rd|1|0|imm:2|Rm" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "sxtab16 Rd!=XX, Rn!=XX, Rm!=XX, {ror #n}" , "t32": "1111|101|0001|0|Rn|1111|Rd|1|0|imm:2|Rm" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "sxtah Rd!=XX, Rn!=XX, Rm!=XX, {ror #n}" , "t32": "1111|101|0000|0|Rn|1111|Rd|1|0|imm:2|Rm" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "sxtb Rd!=HI, Rn!=HI, {ror #zero}" , "t16": "1011|001|001|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "sxtb Rd!=XX, Rn!=XX, {ror #n}" , "t32": "1111|101|0010|0|1111|1111|Rd|10|imm:2|Rn" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "sxtb16 Rd!=XX, Rn!=XX, {ror #n}" , "t32": "1111|101|0001|0|1111|1111|Rd|10|imm:2|Rn" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "sxth Rd!=HI, Rn!=HI, {ror #zero}" , "t16": "1011|001|000|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "sxth Rd!=XX, Rn!=XX, {ror #n}" , "t32": "1111|101|0000|0|1111|1111|Rd|10|imm:2|Rn" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "tbb Rn!=SP, Rn!=XX" , "t32": "1110|100|0110|1|Rn|1111|0000|0000|Rn" , "it": "out last"},
+ {"inst": "tbh Rn!=SP, Rn!=XX" , "t32": "1110|100|0110|1|Rn|1111|0000|0001|Rn" , "it": "out last"},
+ {"inst": "teq Rn!=XX, Rn!=XX, {sop #n}" , "t32": "1110|101|0100|1|Rn|0|n:3|1111|n:2|sop:2|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "teq Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0100|1|Rn|0|imm:3|1111|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "tst Rn!=HI, Rn!=HI" , "t16": "0100|00|1000|Rn:3|Rn:3" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "tst Rn!=XX, Rn!=XX, {sop #n}" , "t32": "1110|101|0000|1|Rn|0|n:3|1111|n:2|sop:2|Rn" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "tst Rn!=XX, #immA" , "t32": "1111|0|imm:1|0|0000|1|Rn|0|imm:3|1111|imm:8" , "it": "any", "io": "N=W Z=W C=W"},
+ {"inst": "uadd16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|1|Rn|1111|Rd|0100|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "uadd8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rn|1111|Rd|0100|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "uasx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rn|1111|Rd|0100|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "ubfx Rd!=XX, Rn!=XX, #lsb, #width" , "t32": "1111|001|1110|0|Rn|0|lsb:3|Rd|lsb:2|0|widthM1:5" , "it": "any", "imm": "SbfxUbfxImm(lsb, width)"},
+ {"inst": "uhadd8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rn|1111|Rd|0110|Rm" , "it": "any"},
+ {"inst": "uhadd16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|1|Rn|1111|Rd|0110|Rm" , "it": "any"},
+ {"inst": "uhasx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rn|1111|Rd|0110|Rm" , "it": "any"},
+ {"inst": "uhsax Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0111|0|Rn|1111|Rd|0110|Rm" , "it": "any"},
+ {"inst": "uhsub16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|1|Rn|1111|Rd|0110|Rm" , "it": "any"},
+ {"inst": "uhsub8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|0|Rn|1111|Rd|0110|Rm" , "it": "any"},
+ {"inst": "umaal RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1111|0|Rn|RxLo|RxHi|0110|Rm" , "it": "any"},
+ {"inst": "umlal RxLo!=XX, RxHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1111|0|Rn|RxLo|RxHi|0000|Rm" , "it": "any"},
+ {"inst": "umull RdLo!=XX, RdHi!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1101|0|Rn|RdLo|RdHi|0000|Rm" , "it": "any"},
+ {"inst": "uqadd16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|1|Rn|1111|Rd|0101|Rm" , "it": "any"},
+ {"inst": "uqadd8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0100|0|Rn|1111|Rd|0101|Rm" , "it": "any"},
+ {"inst": "uqasx Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0101|0|Rn|1111|Rd|0101|Rm" , "it": "any"},
+ {"inst": "uqsax Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0111|0|Rn|1111|Rd|0101|Rm" , "it": "any"},
+ {"inst": "uqsub16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|1|Rn|1111|Rd|0101|Rm" , "it": "any"},
+ {"inst": "uqsub8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|0|Rn|1111|Rd|0101|Rm" , "it": "any"},
+ {"inst": "usad8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1011|1|Rn|1111|Rd|0000|Rm" , "it": "any"},
+ {"inst": "usada8 Rd!=XX, Rn!=XX, Rm!=XX, Ra!=XX" , "t32": "1111|101|1011|1|Rn|Ra|Rd|0000|Rm" , "it": "any"},
+ {"inst": "usat Rd!=XX, #sat, Rn!=XX, {lsl_or_asr #n}" , "t32": "1111|001|110|sop:2|Rn|0|n:3|Rd|n:2|0|sat:5" , "it": "any", "io": "Q=X"},
+ {"inst": "usat16 Rd!=XX, #sat, Rn!=XX" , "t32": "1111|001|1101|0|Rn|0000|Rd|0000|sat:4" , "it": "any", "io": "Q=X"},
+ {"inst": "usax Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0111|0|Rn|1111|Rd|0100|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "usub16 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|1|Rn|1111|Rd|0100|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "usub8 Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|0110|0|Rn|1111|Rd|0100|Rm" , "it": "any", "io": "GE=W"},
+ {"inst": "uxtab Rd!=XX, Rn!=XX, Rm!=XX, {ror #n}" , "t32": "1111|101|0010|1|Rn|1111|Rd|10|imm:2|Rm" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "uxtab16 Rd!=XX, Rn!=XX, Rm!=XX, {ror #n}" , "t32": "1111|101|0001|1|Rn|1111|Rd|10|imm:2|Rm" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "uxtah Rd!=XX, Rn!=XX, Rm!=XX, {ror #n}" , "t32": "1111|101|0000|1|Rn|1111|Rd|10|imm:2|Rm" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "uxtb Rd!=HI, Rn!=HI, {ror #zero}" , "t16": "1011|001|011|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "uxtb Rd!=XX, Rn!=XX, {ror #n}" , "t32": "1111|101|0010|1|1111|1111|Rd|10|imm:2|Rn" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "uxtb16 Rd!=XX, Rn!=XX, {ror #n}" , "t32": "1111|101|0001|1|1111|1111|Rd|10|imm:2|Rn" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "uxth Rd!=HI, Rn!=HI, {ror #zero}" , "t16": "1011|001|010|Rn:3|Rd:3" , "it": "any"},
+ {"inst": "uxth Rd!=XX, Rn!=XX, {ror #n}" , "t32": "1111|101|0000|1|1111|1111|Rd|10|imm:2|Rn" , "it": "any", "imm": "Ror8Imm(n)"},
+ {"inst": "wfe" , "t16": "1011|1111|0010|0000" , "it": "any"},
+ {"inst": "wfe" , "t32": "1111|001|1101|0|1111|1000|0000|0000|0010" , "it": "any"},
+ {"inst": "wfi" , "t16": "1011|1111|0011|0000" , "it": "any"},
+ {"inst": "wfi" , "t32": "1111|001|1101|0|1111|1000|0000|0000|0011" , "it": "any"},
+ {"inst": "yield" , "t16": "1011|1111|0001|0000" , "it": "any"},
+ {"inst": "yield" , "t32": "1111|001|1101|0|1111|1000|0000|0000|0001" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT", "level": "ARMv7+", "data": [
+ {"inst": "clrex" , "a32": "1111|010|1011|1|1111|1111|0000|0001|1111"},
+ {"inst": "dbg #immZ" , "a32": "cond|001|1001|0|0000|1111|0000|1111|immZ:4" , "ext": "ARMv8-"},
+ {"inst": "dmb #immZ" , "a32": "1111|010|1011|1|1111|1111|0000|0101|immZ:4"},
+ {"inst": "dsb #immZ" , "a32": "1111|010|1011|1|1111|1111|0000|0100|immZ:4"},
+ {"inst": "isb #immZ" , "a32": "1111|010|1011|1|1111|1111|0000|0110|immZ:4"},
+ {"inst": "pldw [Rn!=PC, +/-Rm!=PC, {sop #n}]" , "a32": "1111|011|1U00|1|Rn|1111|n:5|sop:2|0|Rm" , "ext": "MP"},
+ {"inst": "pldw [Rn!=PC, #+/-off]" , "a32": "1111|010|1U00|1|Rn|1111|off:12" , "ext": "MP"},
+ {"inst": "pli [Rn, +/-Rm!=PC, {sop #n}]" , "a32": "1111|011|0U10|1|Rn|1111|n:5|sop:2|0|Rm"},
+ {"inst": "pli [Rn, #+/-off]" , "a32": "1111|010|0U10|1|Rn|1111|off:12"},
+ {"inst": "sev" , "a32": "cond|001|1001|0|0000|1111|0000|0000|0100"},
+ {"inst": "sevl" , "a32": "cond|001|1001|0|0000|1111|0000|0000|0101"}
+ ]},
+
+ {"category": "GP GP_EXT", "level": "ARMv7+", "data": [
+ {"inst": "clrex" , "t32": "1111|001|1101|1|1111|1000|1111|0010|1111" , "it": "any"},
+ {"inst": "dmb #immZ" , "t32": "1111|001|1101|1|1111|1000|1111|0101|immZ:4" , "it": "any"},
+ {"inst": "dsb #immZ" , "t32": "1111|001|1101|1|1111|1000|1111|0100|immZ:4" , "it": "any"},
+ {"inst": "ldrexb Rd!=XX, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|0100|1111" , "it": "any"},
+ {"inst": "ldrexd Rd!=XX, Rd2!=XX, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|Rd2 |0111|1111" , "it": "any"},
+ {"inst": "ldrexh Rd!=XX, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|0101|1111" , "it": "any"},
+ {"inst": "isb #immZ" , "t32": "1111|001|1101|1|1111|1000|1111|0110|immZ:4" , "it": "any"},
+ {"inst": "pli [Rn!=PC, Rm!=XX, {lsl #n}]" , "t32": "1111|100|1000|1|Rn|1111|0000|00|n:2|Rm" , "it": "any"},
+ {"inst": "pli [Rn!=PC, #off]" , "t32": "1111|100|1100|1|Rn|1111|off:12" , "it": "any"},
+ {"inst": "pli [Rn!=PC, #-off]" , "t32": "1111|100|1000|1|Rn|1111|1100|off:8" , "it": "any"},
+ {"inst": "pli [Rn==PC, #+/-off]" , "t32": "1111|100|1U00|1|Rn|1111|off:12" , "it": "any"},
+ {"inst": "sev" , "t16": "1011|1111|0100|0000" , "it": "any"},
+ {"inst": "sev" , "t32": "1111|001|1101|0|1111|1000|0000|0000|0000" , "it": "any"},
+ {"inst": "sevl" , "t16": "1011|1111|0101|0000" , "it": "any"},
+ {"inst": "sevl" , "t32": "1111|001|1101|0|1111|1000|0000|0000|0101" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT", "level": "ARMv8+", "data": [
+ {"inst": "lda Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1100|1|Rn|Rd|1100|1001|1111"},
+ {"inst": "ldab Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1110|1|Rn|Rd|1100|1001|1111"},
+ {"inst": "ldaex Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1100|1|Rn|Rd|1110|1001|1111"},
+ {"inst": "ldaexb Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1110|1|Rn|Rd|1110|1001|1111"},
+ {"inst": "ldaexd Rd<=13, Rd2+, [Rn!=PC]" , "a32": "cond|000|1101|1|Rn|Rd|1110|1001|1111"},
+ {"inst": "ldaexh Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1111|1|Rn|Rd|1110|1001|1111"},
+ {"inst": "ldah Rd!=PC, [Rn!=PC]" , "a32": "cond|000|1111|1|Rn|Rd|1100|1001|1111"},
+ {"inst": "stl Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1100|0|Rn|1111|1100|1001|Rs"},
+ {"inst": "stlb Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1110|0|Rn|1111|1100|1001|Rs"},
+ {"inst": "stlex Rd!=PC, Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1100|0|Rn|Rd|1110|1001|Rs"},
+ {"inst": "stlexb Rd!=PC, Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1110|0|Rn|Rd|1110|1001|Rs"},
+ {"inst": "stlexd Rd!=PC, Rs!=PC, Rs2+, [Rn!=PC]" , "a32": "cond|000|1101|0|Rn|Rd|1110|1001|Rs"},
+ {"inst": "stlexh Rd!=PC, Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1111|0|Rn|Rd|1110|1001|Rs"},
+ {"inst": "stlh Rs!=PC, [Rn!=PC]" , "a32": "cond|000|1111|0|Rn|1111|1100|1001|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "level": "ARMv8+", "data": [
+ {"inst": "dcps1" , "t32": "1111|011|1100|0|1111|1000|0000|0000|0001" , "it": "out"},
+ {"inst": "dcps2" , "t32": "1111|011|1100|0|1111|1000|0000|0000|0010" , "it": "out"},
+ {"inst": "dcps3" , "t32": "1111|011|1100|0|1111|1000|0000|0000|0011" , "it": "out"},
+ {"inst": "lda Rd!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|1010|1111" , "it": "any"},
+ {"inst": "ldab Rd!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|1000|1111" , "it": "any"},
+ {"inst": "ldaex Rd!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|1110|1111" , "it": "any"},
+ {"inst": "ldaexb Rd!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|1100|1111" , "it": "any"},
+ {"inst": "ldaexd Rd!=PC, Rd2!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|Rd2|1111|1111" , "it": "any"},
+ {"inst": "ldaexh Rd!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|1101|1111" , "it": "any"},
+ {"inst": "ldah Rd!=PC, [Rn!=PC]" , "t32": "1110|100|0110|1|Rn|Rd|1111|1001|1111" , "it": "any"},
+ {"inst": "stl Rs!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|1010|1111" , "it": "any"},
+ {"inst": "stlb Rs!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|1000|1111" , "it": "any"},
+ {"inst": "stlex Rd!=PC, Rs!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|1110|Rd" , "it": "any"},
+ {"inst": "stlexb Rd!=PC, Rs!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|1100|Rd" , "it": "any"},
+ {"inst": "stlexd Rd!=PC, Rs!=PC, Rs2!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|Rs2|1111|Rd" , "it": "any"},
+ {"inst": "stlexh Rd!=PC, Rs!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|1101|Rd" , "it": "any"},
+ {"inst": "stlh Rs!=PC, [Rn!=PC]" , "t32": "1110|100|0110|0|Rn|Rs|1111|1001|1111" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "IDIVA", "data": [
+ {"inst": "sdiv Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1000|1|Rd|1111|Rm|0001|Rn"},
+ {"inst": "udiv Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|011|1001|1|Rd|1111|Rm|0001|Rn"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "IDIVT", "data": [
+ {"inst": "sdiv Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1100|1|Rn|1111|Rd|1111|Rm" , "it": "any"},
+ {"inst": "udiv Rd!=XX, Rn!=XX, Rm!=XX" , "t32": "1111|101|1101|1|Rn|1111|Rd|1111|Rm" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT", "data": [
+ {"inst": "csdb" , "a32": "cond|001|1001|0|0000|1111|0000|0001|0100"},
+ {"inst": "ssbb" , "a32": "1111|010|1011|1|1111|1111|0000|0100|0000"},
+ {"inst": "pssbb" , "a32": "1111|010|1011|1|1111|1111|0000|0100|0100"}
+ ]},
+
+ {"category": "GP GP_EXT", "data": [
+ {"inst": "csdb" , "t32": "1111|001|1101|0|1111|1000|0000|0001|0100" , "it": "out"},
+ {"inst": "ssbb" , "t32": "1111|001|1101|1|1111|1000|1111|0100|0000" , "it": "any"},
+ {"inst": "pssbb" , "t32": "1111|001|1101|1|1111|1000|1111|0100|0100" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLRBHB", "data": [
+ {"inst": "clrbhb" , "a32": "cond|001|1001|0|0000|1111|0000|0001|0110"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLRBHB", "data": [
+ {"inst": "clrbhb" , "t32": "1111|001|1101|0|1111|1000|0000|0001|0110" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT CRYPTO_HASH", "ext": "CRC32", "data": [
+ {"inst": "crc32b Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1000|0|Rn|Rd|0000|0100|Rm"},
+ {"inst": "crc32h Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1001|0|Rn|Rd|0000|0100|Rm"},
+ {"inst": "crc32w Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|Rn|Rd|0000|0100|Rm"},
+ {"inst": "crc32cb Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1000|0|Rn|Rd|0010|0100|Rm"},
+ {"inst": "crc32ch Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1001|0|Rn|Rd|0010|0100|Rm"},
+ {"inst": "crc32cw Rd!=PC, Rn!=PC, Rm!=PC" , "a32": "cond|000|1010|0|Rn|Rd|0010|0100|Rm"}
+ ]},
+
+ {"category": "GP GP_EXT CRYPTO_HASH", "ext": "CRC32", "data": [
+ {"inst": "crc32b Rd!=PC, Rn!=PC, Rm!=PC" , "t32": "1111|101|0110|0|Rn|1111|Rd|10|00|Rm" , "it": "out"},
+ {"inst": "crc32h Rd!=PC, Rn!=PC, Rm!=PC" , "t32": "1111|101|0110|0|Rn|1111|Rd|10|01|Rm" , "it": "out"},
+ {"inst": "crc32w Rd!=PC, Rn!=PC, Rm!=PC" , "t32": "1111|101|0110|0|Rn|1111|Rd|10|10|Rm" , "it": "out"},
+ {"inst": "crc32cb Rd!=PC, Rn!=PC, Rm!=PC" , "t32": "1111|101|0110|1|Rn|1111|Rd|10|00|Rm" , "it": "out"},
+ {"inst": "crc32ch Rd!=PC, Rn!=PC, Rm!=PC" , "t32": "1111|101|0110|1|Rn|1111|Rd|10|01|Rm" , "it": "out"},
+ {"inst": "crc32cw Rd!=PC, Rn!=PC, Rm!=PC" , "t32": "1111|101|0110|1|Rn|1111|Rd|10|10|Rm" , "it": "out"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PAN", "data": [
+ {"inst": "setpan #immZ" , "a32": "1111|000|1000|1|0000|0000|00|immZ:1|0|0000|0000"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PAN", "data": [
+ {"inst": "setpan #immZ" , "t16": "1011|0110|0001|immZ:1|000" , "it": "out"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RAS", "data": [
+ {"inst": "esb" , "a32": "cond|001|1001|0|0000|1111|0000|0001|0000"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RAS", "data": [
+ {"inst": "esb" , "t32": "1111|001|1101|0|1111|1000|0000|0001|0000" , "it": "any"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SB", "data": [
+ {"inst": "sb" , "a32": "1111|010|1011|1|1111|1111|0000|0111|0000"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SB", "data": [
+ {"inst": "sb" , "t32": "1111|001|1101|1|1111|1000|1111|0111|0000" , "it": "out"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SECURITY", "data": [
+ {"inst": "smc #immZ" , "a32": "cond|000|1011|0|000000000000|0111|immZ:4"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SECURITY", "data": [
+ {"inst": "smc #immZ" , "t32": "1111|011|1111|1|immZ:4|1000|000000000000" , "it": "any"}
+ ]},
+
+ {"category": "FP", "ext": "FP", "data": [
+ {"inst": "vabs.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|00|00|Vd|10|10|1|1|'Vn|0|Vn"},
+ {"inst": "vabs.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|00|00|Vd|10|11|1|1|Vn'|0|Vn"},
+ {"inst": "vadd.f32 Sd, Sn, Sm" , "a32": "cond|11100|'Vd|11|Vn|Vd|1010|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vadd.f64 Dd, Dn, Dm" , "a32": "cond|11100|Vd'|11|Vn|Vd|1011|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vcmp.f32 Sn, Sm" , "a32": "cond|11101|'Vn|11|01|00|Vn|10|10|01|'Vm|0|Vm"},
+ {"inst": "vcmp.f32 Sn, #zero" , "a32": "cond|11101|'Vn|11|01|01|Vn|10|10|01|00|0000"},
+ {"inst": "vcmp.f64 Dn, Dm" , "a32": "cond|11101|Vn'|11|01|00|Vn|10|11|01|Vm'|0|Vm"},
+ {"inst": "vcmp.f64 Dn, #zero" , "a32": "cond|11101|Vn'|11|01|01|Vn|10|11|01|00|0000"},
+ {"inst": "vcmpe.f32 Sn, Sm" , "a32": "cond|11101|'Vn|11|01|00|Vn|10|10|11|'Vm|0|Vm"},
+ {"inst": "vcmpe.f32 Sn, #zero" , "a32": "cond|11101|'Vn|11|01|01|Vn|10|10|11|00|0000"},
+ {"inst": "vcmpe.f64 Dn, Dm" , "a32": "cond|11101|Vn'|11|01|00|Vn|10|11|11|Vm'|0|Vm"},
+ {"inst": "vcmpe.f64 Dn, #zero" , "a32": "cond|11101|Vn'|11|01|01|Vn|10|11|11|00|0000"},
+ {"inst": "vcvt.f32.f64 Sd, Dn" , "a32": "cond|11101|'Vd|11|01|11|Vd|10111|1|Vn'|0|Vn"},
+ {"inst": "vcvt.f64.f32 Dd, Sn" , "a32": "cond|11101|Vd'|11|01|11|Vd|10101|1|'Vn|0|Vn"},
+ {"inst": "vcvt.f32.s32 Sd, Sn" , "a32": "cond|11101|'Vd|11|10|00|Vd|10101|1|'Vn|0|Vn"},
+ {"inst": "vcvt.f32.u32 Sd, Sn" , "a32": "cond|11101|'Vd|11|10|00|Vd|10100|1|'Vn|0|Vn"},
+ {"inst": "vcvt.f64.s32 Dd, Sn" , "a32": "cond|11101|Vd'|11|10|00|Vd|10111|1|'Vn|0|Vn"},
+ {"inst": "vcvt.f64.u32 Dd, Sn" , "a32": "cond|11101|Vd'|11|10|00|Vd|10110|1|'Vn|0|Vn"},
+ {"inst": "vcvt.f32.s16 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|10|10|Vx|10100|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.s16.f32 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|11|10|Vx|10100|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f32.u16 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|10|11|Vx|10100|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.u16.f32 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|11|11|Vx|10100|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f32.s32 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|10|10|Vx|10101|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.s32.f32 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|11|10|Vx|10101|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.f32.u32 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|10|11|Vx|10101|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.u32.f32 Sx, Sx, #fbits" , "a32": "cond|11101|'Vx|11|11|11|Vx|10101|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.f64.s16 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|10|10|Vx|10110|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.s16.f64 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|11|10|Vx|10110|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f64.u16 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|10|11|Vx|10110|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.u16.f64 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|11|11|Vx|10110|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f64.s32 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|10|10|Vx|10111|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.s32.f64 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|11|10|Vx|10111|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.f64.u32 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|10|11|Vx|10111|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.u32.f64 Dx, Dx, #fbits" , "a32": "cond|11101|Vx'|11|11|11|Vx|10111|1|imm[0]|0|imm[4:1]" , "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvtr.s32.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|11|01|Vd|10100|1|'Vn|0|Vn"},
+ {"inst": "vcvtr.s32.f64 Sd, Dn" , "a32": "cond|11101|'Vd|11|11|01|Vd|10110|1|Vn'|0|Vn"},
+ {"inst": "vcvtr.u32.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|11|00|Vd|10100|1|'Vn|0|Vn"},
+ {"inst": "vcvtr.u32.f64 Sd, Dn" , "a32": "cond|11101|'Vd|11|11|00|Vd|10110|1|Vn'|0|Vn"},
+ {"inst": "vdiv.f32 Sd, Sn, Sm" , "a32": "cond|11101|'Vd|00|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vdiv.f64 Dd, Dn, Dm" , "a32": "cond|11101|Vd'|00|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vldr.32 Sd, [Rn, #+/-off*4]" , "a32": "cond|1101U|'Vd|01|Rn|Vd|1010|off:8"},
+ {"inst": "vldr.64 Dd, [Rn, #+/-off*4]" , "a32": "cond|1101U|Vd'|01|Rn|Vd|1011|off:8"},
+ {"inst": "vmla.f32 Sx, Sn, Sm" , "a32": "cond|11100|'Vx|00|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vmla.f64 Dx, Dn, Dm" , "a32": "cond|11100|Vx'|00|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vmls.f32 Sx, Sn, Sm" , "a32": "cond|11100|'Vx|00|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vmls.f64 Dx, Dn, Dm" , "a32": "cond|11100|Vx'|00|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vmov.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|0000|Vd|1010|0|1|'Vn|0|Vn"},
+ {"inst": "vmov.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|0000|Vd|1011|0|1|Vn'|0|Vn"},
+ {"inst": "vmov.f32 Sd, #immVFP" , "a32": "cond|11101|'Vd|11|imm:4|Vd|1010|0000|imm:4" , "imm": "VecVFPImm(immVFP)"},
+ {"inst": "vmov.f64 Dd, #immVFP" , "a32": "cond|11101|Vd'|11|imm:4|Vd|1011|0000|imm:4" , "imm": "VecVFPImm(immVFP)"},
+ {"inst": "vmul.f32 Sd, Sn, Sm" , "a32": "cond|11100|'Vd|10|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vmul.f64 Dd, Dn, Dm" , "a32": "cond|11100|Vd'|10|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vneg.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|0001|Vd|10|10|01|'Vn|0|Vn"},
+ {"inst": "vneg.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|0001|Vd|10|11|01|Vn'|0|Vn"},
+ {"inst": "vnmla.f32 Sx, Sn, Sm" , "a32": "cond|11100|'Vx|01|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vnmla.f64 Dx, Dn, Dm" , "a32": "cond|11100|Vx'|01|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vnmls.f32 Sx, Sn, Sm" , "a32": "cond|11100|'Vx|01|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vnmls.f64 Dx, Dn, Dm" , "a32": "cond|11100|Vx'|01|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vnmul.f32 Sd, Sn, Sm" , "a32": "cond|11100|'Vd|10|Vn|Vd|10|10|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vnmul.f64 Dd, Dn, Dm" , "a32": "cond|11100|Vd'|10|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vsqrt.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|0001|Vd|10|10|11|'Vn|0|Vn"},
+ {"inst": "vsqrt.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|0001|Vd|10|11|11|Vn'|0|Vn"},
+ {"inst": "vstr.32 Ss, [Rn, #+/-off*4]" , "a32": "cond|1101U|'Vs|00|Rn|Vs|1010|off:8"},
+ {"inst": "vstr.64 Ds, [Rn, #+/-off*4]" , "a32": "cond|1101U|Vs'|00|Rn|Vs|1011|off:8"},
+ {"inst": "vsub.f32 Sd, Sn, Sm" , "a32": "cond|11100|'Vd|11|Vn|Vd|10|10|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vsub.f64 Dd, Dn, Dm" , "a32": "cond|11100|Vd'|11|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm"}
+ ]},
+
+ {"category": "FP", "ext": "FP", "data": [
+ {"inst": "vabs.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|00|00|Vd|10|10|1|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vabs.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|00|00|Vd|10|11|1|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vadd.f32 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|11|Vn|Vd|1010|'Vn|0|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vadd.f64 Dd, Dn, Dm" , "t32": "1110|11100|Vd'|11|Vn|Vd|1011|Vn'|0|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vcmp.f32 Sn, Sm" , "t32": "1110|11101|'Vn|11|01|00|Vn|10|10|01|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vcmp.f32 Sn, #zero" , "t32": "1110|11101|'Vn|11|01|01|Vn|10|10|01|00|0000" , "it": "any"},
+ {"inst": "vcmp.f64 Dn, Dm" , "t32": "1110|11101|Vn'|11|01|00|Vn|10|11|01|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vcmp.f64 Dn, #zero" , "t32": "1110|11101|Vn'|11|01|01|Vn|10|11|01|00|0000" , "it": "any"},
+ {"inst": "vcmpe.f32 Sn, Sm" , "t32": "1110|11101|'Vn|11|01|00|Vn|10|10|11|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vcmpe.f32 Sn, #zero" , "t32": "1110|11101|'Vn|11|01|01|Vn|10|10|11|00|0000" , "it": "any"},
+ {"inst": "vcmpe.f64 Dn, Dm" , "t32": "1110|11101|Vn'|11|01|00|Vn|10|11|11|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vcmpe.f64 Dn, #zero" , "t32": "1110|11101|Vn'|11|01|01|Vn|10|11|11|00|0000" , "it": "any"},
+ {"inst": "vcvt.f32.f64 Sd, Dn" , "t32": "1110|11101|'Vd|11|01|11|Vd|10111|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vcvt.f64.f32 Dd, Sn" , "t32": "1110|11101|Vd'|11|01|11|Vd|10101|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvt.f32.s32 Sd, Sn" , "t32": "1110|11101|'Vd|11|10|00|Vd|10101|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvt.f32.u32 Sd, Sn" , "t32": "1110|11101|'Vd|11|10|00|Vd|10100|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvt.f64.s32 Dd, Sn" , "t32": "1110|11101|Vd'|11|10|00|Vd|10111|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvt.f64.u32 Dd, Sn" , "t32": "1110|11101|Vd'|11|10|00|Vd|10110|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvt.f32.s16 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|10|10|Vx|10100|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.s16.f32 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|11|10|Vx|10100|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f32.u16 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|10|11|Vx|10100|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.u16.f32 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|11|11|Vx|10100|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f32.s32 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|10|10|Vx|10101|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.s32.f32 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|11|10|Vx|10101|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.f32.u32 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|10|11|Vx|10101|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.u32.f32 Sx, Sx, #fbits" , "t32": "1110|11101|'Vx|11|11|11|Vx|10101|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.f64.s16 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|10|10|Vx|10110|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.s16.f64 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|11|10|Vx|10110|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f64.u16 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|10|11|Vx|10110|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.u16.f64 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|11|11|Vx|10110|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(16, fbits)"},
+ {"inst": "vcvt.f64.s32 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|10|10|Vx|10111|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.s32.f64 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|11|10|Vx|10111|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.f64.u32 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|10|11|Vx|10111|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvt.u32.f64 Dx, Dx, #fbits" , "t32": "1110|11101|Vx'|11|11|11|Vx|10111|1|imm[0]|0|imm[4:1]" , "it": "any", "imm": "VecFBitsVFP(32, fbits)"},
+ {"inst": "vcvtr.s32.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|11|01|Vd|10100|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtr.s32.f64 Sd, Dn" , "t32": "1110|11101|'Vd|11|11|01|Vd|10110|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vcvtr.u32.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|11|00|Vd|10100|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtr.u32.f64 Sd, Dn" , "t32": "1110|11101|'Vd|11|11|00|Vd|10110|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vdiv.f32 Sd, Sn, Sm" , "t32": "1110|11101|'Vd|00|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vdiv.f64 Dd, Dn, Dm" , "t32": "1110|11101|Vd'|00|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vldr.32 Sd, [Rn, #+/-off*4]" , "t32": "1110|1101U|'Vd|01|Rn|Vd|1010|off:8" , "it": "any"},
+ {"inst": "vldr.64 Dd, [Rn, #+/-off*4]" , "t32": "1110|1101U|Vd'|01|Rn|Vd|1011|off:8" , "it": "any"},
+ {"inst": "vmla.f64 Dx, Dn, Dm" , "t32": "1110|11100|Vx'|00|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vmls.f64 Dx, Dn, Dm" , "t32": "1110|11100|Vx'|00|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vmov.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|0000|Vd|1010|0|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vmov.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|0000|Vd|1011|0|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vmov.f32 Sd, #immVFP" , "t32": "1110|11101|'Vd|11|imm:4|Vd|1010|0000|imm:4" , "it": "any", "imm": "VecVFPImm(immVFP)"},
+ {"inst": "vmov.f64 Dd, #immVFP" , "t32": "1110|11101|Vd'|11|imm:4|Vd|1011|0000|imm:4" , "it": "any", "imm": "VecVFPImm(immVFP)"},
+ {"inst": "vmul.f32 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|10|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vmul.f64 Dd, Dn, Dm" , "t32": "1110|11100|Vd'|10|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vneg.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|0001|Vd|10|10|01|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vneg.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|0001|Vd|10|11|01|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vnmla.f32 Sx, Sn, Sm" , "t32": "1110|11100|'Vx|01|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vnmla.f64 Dx, Dn, Dm" , "t32": "1110|11100|Vx'|01|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vnmls.f32 Sx, Sn, Sm" , "t32": "1110|11100|'Vx|01|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vnmls.f64 Dx, Dn, Dm" , "t32": "1110|11100|Vx'|01|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vnmul.f32 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|10|Vn|Vd|10|10|'Vn|1|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vnmul.f64 Dd, Dn, Dm" , "t32": "1110|11100|Vd'|10|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm" , "it": "any"},
+ {"inst": "vsqrt.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|0001|Vd|10|10|11|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vsqrt.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|0001|Vd|1011|1|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vstr.32 Ss, [Rn, #+/-off*4]" , "t32": "1110|1101U|'Vs|00|Rn|Vs|1010|off:8" , "it": "any"},
+ {"inst": "vstr.64 Ds, [Rn, #+/-off*4]" , "t32": "1110|1101U|Vs'|00|Rn|Vs|1011|off:8" , "it": "any"},
+ {"inst": "vsub.f32 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|11|Vn|Vd|10|10|'Vn|1|'Vm|0|Vm" , "it": "any"},
+ {"inst": "vsub.f64 Dd, Dn, Dm" , "t32": "1110|11100|Vd'|11|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm" , "it": "any"}
+ ]},
+
+ {"category": "FP", "ext": "FP FP16", "data": [
+ {"inst": "vabs.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|00|00|Vd|10|01|1|1|'Vn|0|Vn"},
+ {"inst": "vadd.f16 Sd, Sn, Sm" , "a32": "1110|11100|'Vd|11|Vn|Vd|1001|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vcmp.f16 Sn, Sm" , "a32": "1110|11101|'Vn|11|01|00|Vn|10|01|01|'Vm|0|Vm"},
+ {"inst": "vcmp.f16 Sn, #zero" , "a32": "1110|11101|'Vn|11|01|01|Vn|10|01|01|00|0000"},
+ {"inst": "vcmpe.f16 Sn, Sm" , "a32": "1110|11101|'Vn|11|01|00|Vn|10|01|11|'Vm|0|Vm"},
+ {"inst": "vcmpe.f16 Sn, #zero" , "a32": "1110|11101|'Vn|11|01|01|Vn|10|01|11|00|0000"},
+ {"inst": "vdiv.f16 Sd, Sn, Sm" , "a32": "1110|11101|'Vd|00|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vldr.16 Sd, [Rn, #+/-off*2]" , "a32": "1110|1101U|'Vd|01|Rn|Vd|1001|off:8"},
+ {"inst": "vmla.f16 Sx, Sn, Sm" , "a32": "1110|11100|'Vx|00|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vmls.f16 Sx, Sn, Sm" , "a32": "1110|11100|'Vx|00|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vmov.f16 Rd!=PC, Sn" , "a32": "1110|11100|0|01|Vn|Rd|1001|'Vn|00|1|0000"},
+ {"inst": "vmov.f16 Sd, Rn!=PC" , "a32": "1110|11100|0|00|Vd|Rn|1001|'Vd|00|1|0000"},
+ {"inst": "vmov.f16 Sd, #immVFP" , "a32": "1110|11101|'Vd|11|imm:4|Vd|1001|0000|imm:4" , "imm": "VecVFPImm(immVFP)"},
+ {"inst": "vmovx.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|00|00|Vd|1010|01|'Vn|0|Vn"},
+ {"inst": "vmul.f16 Sd, Sn, Sm" , "a32": "1110|11100|'Vd|10|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vmul.f16 Dd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|01|Vn|Vd|1001|Vn'|1|i:1|0|i:1|Vm:3"},
+ {"inst": "vmul.f16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vd'|01|Vn|Vd|1001|Vn'|1|i:1|0|i:1|Vm:3"},
+ {"inst": "vneg.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|0001|Vd|10|01|01|'Vn|0|Vn"},
+ {"inst": "vnmla.f16 Sx, Sn, Sm" , "a32": "1110|11100|'Vx|01|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vnmls.f16 Sx, Sn, Sm" , "a32": "1110|11100|'Vx|01|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm"},
+ {"inst": "vnmul.f16 Sd, Sn, Sm" , "a32": "1110|11100|'Vd|10|Vn|Vd|10|01|'Vn|1|'Vm|0|Vm"},
+ {"inst": "vsqrt.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|0001|Vd|10|01|11|'Vn|0|Vn"},
+ {"inst": "vstr.16 Ss, [Rn, #+/-off*2]" , "a32": "1110|1101U|'Vs|00|Rn|Vs|1001|off:8"},
+ {"inst": "vsub.f16 Sd, Sn, Sm" , "a32": "1110|11100|'Vd|11|Vn|Vd|10|01|'Vn|1|'Vm|0|Vm"}
+ ]},
+
+ {"category": "FP", "ext": "FP FP16", "data": [
+ {"inst": "vabs.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|00|00|Vd|10|01|1|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vadd.f16 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|11|Vn|Vd|1001|'Vn|0|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vcmp.f16 Sn, Sm" , "t32": "1110|11101|'Vn|11|01|00|Vn|10|01|01|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vcmp.f16 Sn, #zero" , "t32": "1110|11101|'Vn|11|01|01|Vn|10|01|01|00|0000" , "it": "out"},
+ {"inst": "vcmpe.f16 Sn, Sm" , "t32": "1110|11101|'Vn|11|01|00|Vn|10|01|11|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vcmpe.f16 Sn, #zero" , "t32": "1110|11101|'Vn|11|01|01|Vn|10|01|11|00|0000" , "it": "out"},
+ {"inst": "vdiv.f16 Sd, Sn, Sm" , "t32": "1110|11101|'Vd|00|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vldr.16 Sd, [Rn, #+/-off*2]" , "t32": "1110|1101U|'Vd|01|Rn|Vd|1001|off:8" , "it": "out"},
+ {"inst": "vmla.f16-32 Sx, Sn, Sm" , "t32": "1110|11100|'Vx|00|Vn|Vx|10|sz|'Vn|0|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vmls.f16-32 Sx, Sn, Sm" , "t32": "1110|11100|'Vx|00|Vn|Vx|10|sz|'Vn|1|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vmov.f16 Rd!=PC, Sn" , "t32": "1110|11100|0|01|Vn|Rd|1001|'Vn|00|1|0000" , "it": "out"},
+ {"inst": "vmov.f16 Sd, Rn!=PC" , "t32": "1110|11100|0|00|Vd|Rn|1001|'Vd|00|1|0000" , "it": "out"},
+ {"inst": "vmov.f16 Sd, #immVFP" , "t32": "1110|11101|'Vd|11|imm:4|Vd|1001|0000|imm:4" , "it": "out", "imm": "VecVFPImm(immVFP)"},
+ {"inst": "vmovx.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|00|00|Vd|1010|01|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vmul.f16 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|10|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vmul.f16 Dd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|01|Vn|Vd|1001|Vn'|1|i:1|0|i:1|Vm:3" , "it": "out"},
+ {"inst": "vmul.f16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vd'|01|Vn|Vd|1001|Vn'|1|i:1|0|i:1|Vm:3" , "it": "out"},
+ {"inst": "vneg.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|0001|Vd|10|01|01|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vnmla.f16 Sx, Sn, Sm" , "t32": "1110|11100|'Vx|01|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vnmls.f16 Sx, Sn, Sm" , "t32": "1110|11100|'Vx|01|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vnmul.f16 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|10|Vn|Vd|10|01|'Vn|1|'Vm|0|Vm" , "it": "out"},
+ {"inst": "vsqrt.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|0001|Vd|10|01|11|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vstr.16 Ss, [Rn, #+/-off*2]" , "t32": "1110|1101U|'Vs|00|Rn|Vs|1001|off:8" , "it": "out"},
+ {"inst": "vsub.f16 Sd, Sn, Sm" , "t32": "1110|11100|'Vd|11|Vn|Vd|10|01|'Vn|1|'Vm|0|Vm" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "VFPv4", "data": [
+ {"inst": "vfma.f16 Sx, Sn, Sm" , "a32": "1110|11101|'Vx|10|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm" , "ext": "VFPv4 FP16"},
+ {"inst": "vfma.f32 Sx, Sn, Sm" , "a32": "cond|11101|'Vx|10|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfma.f64 Dx, Dn, Dm" , "a32": "cond|11101|Vx'|10|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfms.f16 Sx, Sn, Sm" , "a32": "1110|11101|'Vx|10|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm" , "ext": "VFPv4 FP16"},
+ {"inst": "vfms.f32 Sx, Sn, Sm" , "a32": "cond|11101|'Vx|10|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfms.f64 Dx, Dn, Dm" , "a32": "cond|11101|Vx'|10|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfnma.f16 Sx, Sn, Sm" , "a32": "1110|11101|'Vx|01|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm" , "ext": "VFPv4 FP16"},
+ {"inst": "vfnma.f32 Sx, Sn, Sm" , "a32": "cond|11101|'Vx|01|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfnma.f64 Dx, Dn, Dm" , "a32": "cond|11101|Vx'|01|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfnms.f16 Sx, Sn, Sm" , "a32": "1110|11101|'Vx|01|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm" , "ext": "VFPv4 FP16"},
+ {"inst": "vfnms.f32 Sx, Sn, Sm" , "a32": "cond|11101|'Vx|01|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm" , "ext": "VFPv4"},
+ {"inst": "vfnms.f64 Dx, Dn, Dm" , "a32": "cond|11101|Vx'|01|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm" , "ext": "VFPv4"}
+ ]},
+
+ {"category": "ASIMD", "ext": "VFPv4", "data": [
+ {"inst": "vfma.f16 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|10|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm" , "it": "out", "ext": "VFPv4 FP16"},
+ {"inst": "vfma.f32 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|10|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfma.f64 Dx, Dn, Dm" , "t32": "1110|11101|Vx'|10|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfms.f16 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|10|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm" , "it": "out", "ext": "VFPv4 FP16"},
+ {"inst": "vfms.f32 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|10|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfms.f64 Dx, Dn, Dm" , "t32": "1110|11101|Vx'|10|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfnma.f16 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|01|Vn|Vx|10|01|'Vn|1|'Vm|0|Vm" , "it": "out", "ext": "VFPv4 FP16"},
+ {"inst": "vfnma.f32 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|01|Vn|Vx|10|10|'Vn|1|'Vm|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfnma.f64 Dx, Dn, Dm" , "t32": "1110|11101|Vx'|01|Vn|Vx|10|11|Vn'|1|Vm'|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfnms.f16 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|01|Vn|Vx|10|01|'Vn|0|'Vm|0|Vm" , "it": "out", "ext": "VFPv4 FP16"},
+ {"inst": "vfnms.f32 Sx, Sn, Sm" , "t32": "1110|11101|'Vx|01|Vn|Vx|10|10|'Vn|0|'Vm|0|Vm" , "it": "any", "ext": "VFPv4"},
+ {"inst": "vfnms.f64 Dx, Dn, Dm" , "t32": "1110|11101|Vx'|01|Vn|Vx|10|11|Vn'|0|Vm'|0|Vm" , "it": "any", "ext": "VFPv4"}
+ ]},
+
+ {"category": "ASIMD", "ext": "ASIMD", "data": [
+ {"inst": "vaba.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vaba.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vabal.x8-32 Vd, Dn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|0101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vabd.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vabd.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabdl.x8-32 Vd, Dn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|0111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabs.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|01|Vd|01|11|0|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vabs.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|01|Vd|01|11|0|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vabs.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|01|Vd|01|11|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vabs.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|01|Vd|01|11|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vabs.s8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00|11|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vabs.s8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00|11|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vacge.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacge.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacge.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacge.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacgt.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacgt.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacgt.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacgt.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacle.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vacle.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vacle.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vacle.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vaclt.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vaclt.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vaclt.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vaclt.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vadd.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vadd.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vadd.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vadd.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vadd.x8-64 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|sz|Vn|Vd|1000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vadd.x8-64 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|sz|Vn|Vd|1000|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vaddhn.x16-64 Dd, Vn, Vm" , "a32": "1111|00101|Vd'|szM1:2|Vn|Vd|0100|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vaddl.x8-32 Vd, Dn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|0000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vaddw.x8-32 Vd, Vn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|0001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vand.any Dd, Dn, Dm" , "a32": "1111|00100|Vd'|00|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vand.any Vd, Vn, Vm" , "a32": "1111|00100|Vd'|00|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vand.x16-64 Dx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0011|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vbic"},
+ {"inst": "vand.x16-64 Vx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0111|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vbic"},
+ {"inst": "vbic.any Dd, Dn, Dm" , "a32": "1111|00100|Vd'|01|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbic.any Vd, Vn, Vm" , "a32": "1111|00100|Vd'|01|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbic.x16-64 Dx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0011|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vbic.x16-64 Vx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0111|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vbif.any Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbif.any Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbit.any Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbit.any Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbsl.any Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbsl.any Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.f16 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01010|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f16 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01010|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01010|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vceq.f32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01010|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1000|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1000|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00010|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00010|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.f16 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01001|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f16 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01001|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01001|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.f32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01001|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0011|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0011|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.s8-32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00001|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.s8-32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00001|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.f16 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01000|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f16 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01000|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01000|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.f32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01000|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0011|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.s8-32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00000|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.s8-32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00000|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f16 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01011|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f16 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01011|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01011|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01011|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0011|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0011|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.s8-32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00011|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.s8-32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00011|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcls.x8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|01000|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcls.x8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|01000|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f16 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01100|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f16 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|01|01|Vd|01100|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01100|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|10|01|Vd|01100|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0011|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0011|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.s8-32 Dd, Dn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00100|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.s8-32 Vd, Vn, #zero" , "a32": "1111|00111|Vd'|11|sz|01|Vd|00100|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclz.x8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|01001|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclz.x8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|01001|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcnt.x8 Dd, Dn" , "a32": "1111|00111|Vd'|11|00|00|Vd|01010|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcnt.x8 Vd, Vn" , "a32": "1111|00111|Vd'|11|00|00|Vd|01010|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.s32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01110|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.s32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01110|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.u32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01111|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.u32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01111|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.s32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01100|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.s32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01100|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.u32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01101|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.u32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01101|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.s32 Dd, Dn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11100|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f32.s32 Vd, Vn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11100|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s32.f32 Dd, Dn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11110|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s32.f32 Vd, Vn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11110|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f32.u32 Dd, Dn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11100|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f32.u32 Vd, Vn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11100|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u32.f32 Dd, Dn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11110|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u32.f32 Vd, Vn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11110|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvta.s32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|00|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvta.s32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|00|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvta.u32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|00|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvta.u32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|00|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00110|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00111|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|11|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|11|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|11|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|11|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00010|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00010|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00011|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00011|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|01|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|01|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|01|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|01|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00100|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00100|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00101|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|00101|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|10|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|10|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|10|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f64 Sd, Dn" , "a32": "1111|11101|'Vd|11|11|10|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vdup.8 Dd, Rn!=PC" , "a32": "cond|11101|1|00|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.8 Vd, Rn!=PC" , "a32": "cond|11101|1|10|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Dd, Rn!=PC" , "a32": "cond|11101|0|00|Vd|Rn|1011|Vd'|0|1|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Vd, Rn!=PC" , "a32": "cond|11101|0|10|Vd|Rn|1011|Vd'|0|1|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Dd, Rn!=PC" , "a32": "cond|11101|0|00|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Vd, Rn!=PC" , "a32": "cond|11101|0|10|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.8 Dd, Dn[#i]" , "a32": "1111|00111|Vd'|11|i:3|1|Vd|1100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.8 Vd, Dn[#i]" , "a32": "1111|00111|Vd'|11|i:3|1|Vd|1100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Dd, Dn[#i]" , "a32": "1111|00111|Vd'|11|i:2|10|Vd|1100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Vd, Dn[#i]" , "a32": "1111|00111|Vd'|11|i:2|10|Vd|1100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Dd, Dn[#i]" , "a32": "1111|00111|Vd'|11|i:1|100|Vd|1100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Vd, Dn[#i]" , "a32": "1111|00111|Vd'|11|i:1|100|Vd|1100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "veor.any Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "veor.any Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vext.8 Dd, Dn, Dm, #immZ<=07" , "a32": "1111|00101|Vd'|11|Vn|Vd|immZ:4|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vext.8 Vd, Vn, Vm, #immZ<=15" , "a32": "1111|00101|Vd'|11|Vn|Vd|immZ:4|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vfma.f16 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|01|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfma.f16 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|01|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfma.f32 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|00|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vfma.f32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|00|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vfms.f16 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|11|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfms.f16 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|11|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfms.f32 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|10|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vfms.f32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|10|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vhadd.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vhadd.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0000|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vhsub.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vhsub.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0010|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vins.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|0000|Vd|1010|11|'Vn|0|Vn" , "ext": "FP16"},
+ {"inst": "vld1.8-64 Dd, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0111|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 Dd, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0111|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 Dd, [Rn!=PC, #off==8]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0111|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 2x{Dd<=30}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|1010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|1010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 2x{Dd<=30}+, [Rn!=PC, #off==16]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|1010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 3x{Dd<=29}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0110|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 3x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0110|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 3x{Dd<=29}+, [Rn!=PC, #off==24]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0110|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 4x{Dd<=28}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 4x{Dd<=28}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 4x{Dd<=28}+, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8 Dd[#i], [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0000|i:3|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8 Dd[#i], [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0000|i:3|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8 Dd[#i], [Rn!=PC, #off==1]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0000|i:3|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.16 Dd[#i], [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0100|i:2|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.16 Dd[#i], [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0100|i:2|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.16 Dd[#i], [Rn!=PC, #off==2]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0100|i:2|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.32 Dd[#i], [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1000|i:1|0|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.32 Dd[#i], [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1000|i:1|0|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.32 Dd[#i], [Rn!=PC, #off==4]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1000|i:1|0|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 Dd, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1100|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 Dd, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1100|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 Dd, [Rn!=PC, #off==1<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1100|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 2x{Dd<=30}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1100|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1100|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 2x{Dd<=30}+, [Rn!=PC, #off==1<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1100|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=30}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|1000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|1000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=30}+, [Rn!=PC, #off==16]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|1000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=29}++, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|1001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=29}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|1001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=29}++, [Rn!=PC, #off==16]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|1001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 4x{Dd<=28}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0011|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 4x{Dd<=28}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0011|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 4x{Dd<=28}+, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0011|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8 2x{Dd<=30[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0001|i:3|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8 2x{Dd<=30[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0001|i:3|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8 2x{Dd<=30[#i]}+, [Rn!=PC, #off==2]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0001|i:3|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=30[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0101|i:2|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=30[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0101|i:2|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=30[#i]}+, [Rn!=PC, #off==4]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0101|i:2|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=29[#i]}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0101|i:2|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=29[#i]}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0101|i:2|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=29[#i]}++, [Rn!=PC, #off==4]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0101|i:2|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=30[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1001|i:1|0|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=30[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1001|i:1|0|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=30[#i]}+, [Rn!=PC, #off==8]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1001|i:1|0|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=29[#i]}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1001|i:1|1|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=29[#i]}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1001|i:1|1|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=29[#i]}++, [Rn!=PC, #off==8]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1001|i:1|1|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=30}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1101|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1101|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=30}+, [Rn!=PC, #off==2<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1101|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=29}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1101|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=29}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1101|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=29}++, [Rn!=PC, #off==2<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1101|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=29}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0100|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0100|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=29}+, [Rn!=PC, #off==24]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0100|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=27}++, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0101|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=27}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0101|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=27}++, [Rn!=PC, #off==24]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0101|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.8 3x{Dd<=29[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0010|i:3|0|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.8 3x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0010|i:3|0|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.8 3x{Dd<=29[#i]}+, [Rn!=PC, #off==3]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0010|i:3|0|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=29[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0110|i:2|00|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0110|i:2|00|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=29[#i]}+, [Rn!=PC, #off==6]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0110|i:2|00|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=27[#i]}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0110|i:2|10|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0110|i:2|10|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=27[#i]}++, [Rn!=PC, #off==6]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0110|i:2|10|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=29[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1010|i:1|000|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1010|i:1|000|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=29[#i]}+, [Rn!=PC, #off==12]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1010|i:1|000|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=27[#i]}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1010|i:1|100|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1010|i:1|100|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=27[#i]}++, [Rn!=PC, #off==12]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1010|i:1|100|1101" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=29}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1110|sz|0|0|1111" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1110|sz|0|0|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=29}+, [Rn!=PC, #off==3<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1110|sz|0|0|1101" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=27}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1110|sz|1|0|1111" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=27}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1110|sz|1|0|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=27}++, [Rn!=PC, #off==3<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1110|sz|1|0|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=29}+, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=29}+, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=27}++, [Rn!=PC]" , "a32": "1111|01000|Vd'|10|Rn|Vd|0001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=27}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=27}++, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vd'|10|Rn|Vd|0001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.8 4x{Dd<=29[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0011|i:3|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.8 4x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0011|i:3|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.8 4x{Dd<=29[#i]}+, [Rn!=PC, #off==4]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0011|i:3|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=29[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0111|i:2|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0111|i:2|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=29[#i]}+, [Rn!=PC, #off==8]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0111|i:2|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=27[#i]}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|0111|i:2|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0111|i:2|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=27[#i]}++, [Rn!=PC, #off==8]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|0111|i:2|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=29[#i]}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1011|i:1|0|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1011|i:1|0|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=29[#i]}+, [Rn!=PC, #off==16]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1011|i:1|0|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=27[#i]}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1011|i:1|1|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1011|i:1|1|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=27[#i]}++, [Rn!=PC, #off==16]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1011|i:1|1|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=28}+, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1111|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=28}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1111|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=28}+, [Rn!=PC, #off==4<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1111|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=25}++, [Rn!=PC]" , "a32": "1111|01001|Vd'|10|Rn|Vd|1111|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=25}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1111|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=25}++, [Rn!=PC, #off==4<<sz]@" , "a32": "1111|01001|Vd'|10|Rn|Vd|1111|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vldmdb.32 [Rn]!, SdList" , "a32": "cond|11010|immVd[0]|11|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vldmdb.64 [Rn]!, DdList" , "a32": "cond|11010|immVd[4]|11|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vldmia.32 [Rn!=PC]{!}, SdList" , "a32": "cond|11001|immVd[0]|W1|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vldmia.64 [Rn!=PC]{!}, DdList" , "a32": "cond|11001|immVd[4]|W1|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vldmia.32 [Rn==PC], SdList" , "a32": "cond|11001|immVd[0]|01|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vldmia.64 [Rn==PC], DdList" , "a32": "cond|11001|immVd[4]|01|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vmax.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmax.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmax.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmax.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmax.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmax.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmaxnm.f16 Sd, Sn, Sm" , "a32": "1111|11101|'Vd|00|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16"},
+ {"inst": "vmaxnm.f32 Sd, Sn, Sm" , "a32": "1111|11101|'Vd|00|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vmaxnm.f64 Dd, Dn, Dm" , "a32": "1111|11101|Vd'|00|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vmaxnm.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmaxnm.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmaxnm.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmaxnm.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmin.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmin.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|11|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmin.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmin.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|10|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmin.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmin.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vminnm.f16 Sd, Sn, Sm" , "a32": "1111|11101|'Vd|00|Vn|Vd|10|01|'Vn|1|'Vm|0|Vm" , "ext": "ARMv8+ FP16"},
+ {"inst": "vminnm.f32 Sd, Sn, Sm" , "a32": "1111|11101|'Vd|00|Vn|Vd|10|10|'Vn|1|'Vm|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vminnm.f64 Dd, Dn, Dm" , "a32": "1111|11101|Vd'|00|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vminnm.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vminnm.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vminnm.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vminnm.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f16 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|01|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmla.f16 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|01|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmla.f32 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|00|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|00|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x8-32 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|sz|Vn|Vx|1001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x8-32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|sz|Vn|Vx|1001|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f16 Dx, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vx'|01|Vn|Vx|0001|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "FP16"},
+ {"inst": "vmla.f16 Vx, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vx'|01|Vn|Vx|0001|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "FP16"},
+ {"inst": "vmla.f32 Dx, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vx'|10|Vn|Vx|0001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f32 Vx, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vx'|10|Vn|Vx|0001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x16 Dx, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vx'|01|Vn|Vx|0000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmla.x16 Vx, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vx'|01|Vn|Vx|0000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmla.x32 Dx, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vx'|10|Vn|Vx|0000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x32 Vx, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vx'|10|Vn|Vx|0000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmlal.x8-32 Vx, Dn, Dm" , "a32": "1111|001U1|Vx'|sz|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlal.x16 Vx, Dn, Dm<=07[#i]" , "a32": "1111|001U1|Vx'|01|Vn|Vx|0010|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlal.x32 Vx, Dn, Dm<=15[#i]" , "a32": "1111|001U1|Vx'|10|Vn|Vx|0010|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmls.f16 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|11|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmls.f16 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|11|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmls.f32 Dx, Dn, Dm" , "a32": "1111|00100|Vx'|10|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.f32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|10|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x8-32 Dx, Dn, Dm" , "a32": "1111|00110|Vx'|sz|Vn|Vx|1001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x8-32 Vx, Vn, Vm" , "a32": "1111|00110|Vx'|sz|Vn|Vx|1001|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.f16 Dx, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vx'|01|Vn|Vx|0101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.f16 Vx, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vx'|01|Vn|Vx|0101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.f32 Dx, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vx'|10|Vn|Vx|0101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.f32 Vx, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vx'|10|Vn|Vx|0101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x16 Dx, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vx'|01|Vn|Vx|0100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.x16 Vx, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vx'|01|Vn|Vx|0100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.x32 Dx, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vx'|10|Vn|Vx|0100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x32 Vx, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vx'|10|Vn|Vx|0100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmlsl.x8-32 Vx, Dn, Dm" , "a32": "1111|001U1|Vx'|sz|Vn|Vx|1010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlsl.x16 Vx, Dn, Dm<=07[#i]" , "a32": "1111|001U1|Vx'|01|Vn|Vx|0110|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlsl.x32 Vx, Dn, Dm<=15[#i]" , "a32": "1111|001U1|Vx'|10|Vn|Vx|0110|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmov Rd!=PC, Sn" , "a32": "cond|11100|0|01|Vn|Rd|1010|'Vn|00|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov Sd, Rn!=PC" , "a32": "cond|11100|0|00|Vd|Rn|1010|'Vd|00|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov Rd!=PC, Rd2!=PC, Ss!=31, Ss2+" , "a32": "cond|11000|1|01|Rd2|Rd|101|000|'Vs|1|Vs" , "ext": "ASIMD"},
+ {"inst": "vmov Sd!=31, Sd2+, Rs!=PC, Rs2!=PC" , "a32": "cond|11000|1|00|Rs2|Rs|101|000|'Vd|1|Vd" , "ext": "ASIMD"},
+ {"inst": "vmov Rd!=PC, Rd2!=PC, Ds" , "a32": "cond|11000|1|01|Rd2|Rd|1011|0|0|Vs'|1|Vs" , "ext": "ASIMD"},
+ {"inst": "vmov Dd, Rs!=PC, Rs2!=PC" , "a32": "cond|11000|1|00|Rs2|Rs|1011|0|0|Vd'|1|Vd" , "ext": "ASIMD"},
+ {"inst": "vmov.x8 Dd[#i], Rn!=PC" , "a32": "cond|11100|1|i:1|0|Vd|Rn|1011|Vd'|i:2|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.x16 Dd[#i], Rn!=PC" , "a32": "cond|11100|0|i:1|0|Vd|Rn|1011|Vd'|i:1|110000" , "ext": "ASIMD"},
+ {"inst": "vmov.x32 Dd[#i], Rn!=PC" , "a32": "cond|11100|0|i:1|0|Vd|Rn|1011|Vd'|001|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.x8 Rd!=PC, Dn[#i]" , "a32": "cond|1110U|1|i:1|1|Vn|Rd|1011|Vn'|i:2|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.x16 Rd!=PC, Dn[#i]" , "a32": "cond|1110U|0|i:1|1|Vn|Rd|1011|Vn'|i:1|110000" , "ext": "ASIMD"},
+ {"inst": "vmov.x32 Rd!=PC, Dn[#i]" , "a32": "cond|11100|0|i:1|1|Vn|Rd|1011|Vn'|001|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.any Dd, Dn" , "a32": "1111|00100|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|0|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "aliasOf": "vorr"},
+ {"inst": "vmov.any Vd, Vn" , "a32": "1111|00100|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|1|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "aliasOf": "vorr"},
+ {"inst": "vmov.x8-64 Dd, #immV" , "a32": "1111|001|imm:1|1|Vd'|000|imm:3|Vd|cmode:4|00|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 0, immV)"},
+ {"inst": "vmov.x8-64 Vd, #immV" , "a32": "1111|001|imm:1|1|Vd'|000|imm:3|Vd|cmode:4|01|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 0, immV)"},
+ {"inst": "vmovl.x8 Vd, Dn" , "a32": "1111|001U1|Vd'|00|1000|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmovl.x16 Vd, Dn" , "a32": "1111|001U1|Vd'|01|0000|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmovl.x32 Vd, Dn" , "a32": "1111|001U1|Vd'|10|0000|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmovn.x16-64 Dd, Vn" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|00|Vn'|0|Vn" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vmul.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmul.f16 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmul.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.f32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x8-32|p8 Dd, Dn, Dm" , "a32": "1111|001P0|Vd'|sz|Vn|Vd|1001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x8-32|p8 Vd, Vn, Vm" , "a32": "1111|001P0|Vd'|sz|Vn|Vd|1001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.f32 Dd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|10|Vn|Vd|1001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.f32 Vd, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vd'|10|Vn|Vd|1001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x16 Dd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|01|Vn|Vd|1000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmul.x16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vd'|01|Vn|Vd|1000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmul.x32 Dd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|10|Vn|Vd|1000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x32 Vd, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vd'|10|Vn|Vd|1000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmull.x8-32|p8 Vd, Dn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|11P0|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmull.p64 Vd, Dn, Dm" , "a32": "1111|00101|Vd'|10|Vn|Vd|11P0|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmull.x16 Vd, Dn, Dm<=07[#i]" , "a32": "1111|001U1|Vd'|01|Vn|Vd|1010|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmull.x32 Vd, Dn, Dm<=15[#i]" , "a32": "1111|001U1|Vd'|10|Vn|Vd|1010|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmvn.any Dd, #immV" , "a32": "1111|001|imm:1|1|Vd'|000|imm:3|Vd|cmode:4|00|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 1, immV)"},
+ {"inst": "vmvn.any Vd, #immV" , "a32": "1111|001|imm:1|1|Vd'|000|imm:3|Vd|cmode:4|01|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 1, immV)"},
+ {"inst": "vmvn.any Dd, Dn" , "a32": "1111|00111|Vd'|11|0000|Vd|0101|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vmvn.any Vd, Vn" , "a32": "1111|00111|Vd'|11|0000|Vd|0101|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vneg.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|01|Vd|0111|10|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vneg.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|01|Vd|0111|11|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vneg.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|01|Vd|0111|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vneg.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|01|Vd|0111|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vneg.s8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|01|Vd|0011|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vneg.s8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|01|Vd|0011|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vorn.x16-64 Dx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0001|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vorr"},
+ {"inst": "vorn.x16-64 Vx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0101|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vorr"},
+ {"inst": "vorn.any Dd, Dn, Dm" , "a32": "1111|00100|Vd'|11|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vorn.any Vd, Vn, Vm" , "a32": "1111|00100|Vd'|11|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vorr.x16-64 Dx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0001|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vorr.x16-64 Vx, #immV" , "a32": "1111|001|imm:1|1|Vx'|000|imm:3|Vx|cmode:4|0101|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vorr.any Dd, Dn, Dm" , "a32": "1111|00100|Vd'|10|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vorr.any Vd, Vn, Vm" , "a32": "1111|00100|Vd'|10|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vpadal.x8-32 Dx, Dn" , "a32": "1111|00111|Vx'|11|sz|00|Vx|0110|U|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpadal.x8-32 Vx, Vn" , "a32": "1111|00111|Vx'|11|sz|00|Vx|0110|U|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpadd.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vpadd.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vpaddl.x8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0010|U|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpaddl.x8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0010|U|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpmax.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vpmax.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vpmax.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|1010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vpmin.f16 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vpmin.f32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vpmin.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|1010|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vpop.32 SdList" , "a32": "cond|11001|immVd[0]|11|1101|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vpop.64 DdList" , "a32": "cond|11001|immVd[4]|11|1101|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vpush.32 SdList" , "a32": "cond|11010|immVd[0]|10|1101|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vpush.64 DdList" , "a32": "cond|11010|immVd[4]|10|1101|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vqabs.s8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0111|0|0|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqabs.s8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0111|0|1|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqadd.x8-64 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0000|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqadd.x8-64 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0000|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmlal.s16-32 Vx, Dn, Dm" , "a32": "1111|00101|Vx'|sz|Vn|Vx|1001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlal.s16 Vx, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vx'|01|Vn|Vx|0011|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlal.s32 Vx, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vx'|10|Vn|Vx|0011|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlsl.s16-32 Vx, Dn, Dm" , "a32": "1111|00101|Vx'|sz|Vn|Vx|1011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlsl.s16 Vx, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vx'|01|Vn|Vx|0111|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlsl.s32 Vx, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vx'|10|Vn|Vx|0111|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmulh.s16-32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|sz|Vn|Vd|1011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s16-32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|sz|Vn|Vd|1011|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s16 Dd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|01|Vn|Vd|1100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vd'|01|Vn|Vd|1100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s32 Dd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|10|Vn|Vd|1100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s32 Vd, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vd'|10|Vn|Vd|1100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmull.s16-32 Vd, Dn, Dm" , "a32": "1111|00101|Vd'|sz|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmull.s16 Vd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|01|Vn|Vd|1011|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmull.s32 Vd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|10|Vn|Vd|1011|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqmovn.x16-64 Dd, Vn" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|1|U|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqmovun.s16-64 Dd, Vn" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|0|1|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqneg.s8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0111|1|0|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqneg.s8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0111|1|1|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16-32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16-32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1011|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16 Dd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|01|Vn|Vd|1101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vd'|01|Vn|Vd|1101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s32 Dd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s32 Vd, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrshl.x8-64 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0101|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrshl.x8-64 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0101|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrshrn.x16-64 Dd, Vn, #zero" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|1U|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqrshrn.x16-64 Dd, Vn, #n" , "a32": "1111|001U1|Vd'|imm:6|Vd|1001|01|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqrshrun.s16-64 Dd, Vn, #zero" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|01|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqrshrun.s16-64 Dd, Vn, #n" , "a32": "1111|00111|Vd'|imm:6|Vd|1000|01|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqshl.x8-64 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0100|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqshl.x8-64 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0100|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqshl.x8-64 Dd, Dn, #n" , "a32": "1111|001U1|Vd'|imm[5:0]|Vd|0111|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshl.x8-64 Vd, Vn, #n" , "a32": "1111|001U1|Vd'|imm[5:0]|Vd|0111|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshlu.s8-64 Dd, Dn, #n" , "a32": "1111|00111|Vd'|imm[5:0]|Vd|0110|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshlu.s8-64 Vd, Vn, #n" , "a32": "1111|00111|Vd'|imm[5:0]|Vd|0110|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshrn.x16-64 Dd, Vn, #zero" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|1U|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqshrn.x16-64 Dd, Vn, #n" , "a32": "1111|001U1|Vd'|imm:6|Vd|1001|0|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqshrun.s16-64 Dd, Vn, #zero" , "a32": "1111|00111|Vd'|11|szM1:2|10|Vd|0010|01|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqshrun.s16-64 Dd, Vn, #n" , "a32": "1111|00111|Vd'|imm:6|Vd|1000|0|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqsub.x8-64 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0010|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqsub.x8-64 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0010|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vraddhn.x16-64 Dd, Vn, Vm" , "a32": "1111|00111|Vd'|szM1:2|Vn|Vd|0100|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vrecpe.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|0101|0|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vrecpe.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|0101|0|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vrecpe.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|0101|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecpe.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|0101|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecpe.u32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|0100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecpe.u32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|0100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecps.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vrecps.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|01|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vrecps.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vrecps.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|00|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vrev16.x8 Dd, Dn" , "a32": "1111|00111|Vd'|11|00|00|Vd|0001|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev16.x8 Vd, Vn" , "a32": "1111|00111|Vd'|11|00|00|Vd|0001|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev32.x8-16 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0000|1|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev32.x8-16 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0000|1|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev64.x8-32 Dd, Dn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0000|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev64.x8-32 Vd, Vn" , "a32": "1111|00111|Vd'|11|sz|00|Vd|0000|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrhadd.x8-32 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vrhadd.x8-32 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vn|Vd|0001|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vrinta.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|00|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrinta.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|00|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrinta.f64 Dd, Dn" , "a32": "1111|11101|Vd'|11|10|00|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrinta.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|01|00|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrinta.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|01|01|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrinta.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|01|00|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrinta.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|01|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintm.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|11|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintm.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|11|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintm.f64 Dd, Dn" , "a32": "1111|11101|Vd'|11|10|11|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintm.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|10|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintm.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|10|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintm.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|10|10|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintm.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|10|11|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintn.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|01|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintn.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|01|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintn.f64 Dd, Dn" , "a32": "1111|11101|Vd'|11|10|01|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintn.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|00|00|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintn.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|00|01|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintn.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|00|00|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintn.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|00|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintp.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|10|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintp.f32 Sd, Sn" , "a32": "1111|11101|'Vd|11|10|10|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintp.f64 Dd, Dn" , "a32": "1111|11101|Vd'|11|10|10|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintp.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|11|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintp.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|11|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintp.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|11|10|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintp.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|11|11|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintr.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|01|10|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintr.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|01|10|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintr.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|01|10|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintx.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|01|11|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintx.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|01|11|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintx.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|01|11|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintx.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|00|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintx.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|00|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintx.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|00|10|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintx.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|00|11|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintz.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|01|10|Vd|10|01|11|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintz.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|01|10|Vd|10|10|11|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintz.f64 Dd, Dn" , "a32": "cond|11101|Vd'|11|01|10|Vd|10|11|11|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintz.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|01|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintz.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01|01|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintz.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|01|10|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintz.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|10|Vd|01|01|11|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrshl.x8-64 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0101|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrshl.x8-64 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0101|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrshr.x8-32 Dd, Dn, #zero" , "a32": "1111|00100|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|0|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vrshr.x8-32 Vd, Vn, #zero" , "a32": "1111|00100|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|1|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vrshr.x8-32 Dd, Dn, #n" , "a32": "1111|001U1|Vd'|imm:6|Vd|0010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrshr.x8-32 Vd, Vn, #n" , "a32": "1111|001U1|Vd'|imm:6|Vd|0010|0|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrshrn.x16-64 Dd, Vn, #zero" , "a32": "1111|00111|Vd'|11|sz|10|Vd|0010|00|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "narrow", "pseudoOf": "vmovn"},
+ {"inst": "vrshrn.x16-64 Dd, Vn, #n" , "a32": "1111|00101|Vd'|imm:6|Vd|1000|0|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vrsqrte.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|01|01|10|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vrsqrte.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|01|01|11|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vrsqrte.f32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01|01|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrsqrte.f32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01|01|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrsqrte.u32 Dd, Dn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01|00|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrsqrte.u32 Vd, Vn" , "a32": "1111|00111|Vd'|11|10|11|Vd|01|00|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrsqrts.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vrsqrts.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|11|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vrsqrts.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vrsqrts.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|10|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vrsra.x8-64 Dx, Dn, #n" , "a32": "1111|001U1|Vx'|imm[5:0]|Vx|0011|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrsra.x8-64 Vx, Vn, #n" , "a32": "1111|001U1|Vx'|imm[5:0]|Vx|0011|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrsubhn.x16-64 Dd, Vn, Vm" , "a32": "1111|00111|Vd'|szM1:2|Vn|Vd|0110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vseleq.f16 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|00|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16"},
+ {"inst": "vseleq.f32 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|00|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vseleq.f64 Dd, Dn, Dm" , "a32": "1111|11100|Vd'|00|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vselge.f16 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|10|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16"},
+ {"inst": "vselge.f32 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|10|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vselge.f64 Dd, Dn, Dm" , "a32": "1111|11100|Vd'|10|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vselgt.f16 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|11|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16"},
+ {"inst": "vselgt.f32 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|11|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vselgt.f64 Dd, Dn, Dm" , "a32": "1111|11100|Vd'|11|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vselvs.f16 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|01|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16"},
+ {"inst": "vselvs.f32 Sd, Sn, Sm" , "a32": "1111|11100|'Vd|01|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vselvs.f64 Dd, Dn, Dm" , "a32": "1111|11100|Vd'|01|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+"},
+ {"inst": "vshl.x8-64 Dd, Dn, Dm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0100|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vshl.x8-64 Vd, Vn, Vm" , "a32": "1111|001U0|Vd'|sz|Vm|Vd|0100|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vshl.x8-64 Dd, Dn, #n" , "a32": "1111|00101|Vd'|imm[5:0]|Vd|0101|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vshl.x8-64 Vd, Vn, #n" , "a32": "1111|00101|Vd'|imm[5:0]|Vd|0101|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vshll.x8-32 Vd, Dn, #n" , "a32": "1111|001U1|Vd'|imm[5:0]|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)", "vecOp": "widen"},
+ {"inst": "vshr.x8-64 Dd, Dn, #zero" , "a32": "1111|00100|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|0|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vshr.x8-64 Vd, Vn, #zero" , "a32": "1111|00100|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|1|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vshr.x8-64 Dd, Dn, #n" , "a32": "1111|001U1|Vd'|imm[5:0]|Vd|0000|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vshr.x8-64 Vd, Vn, #n" , "a32": "1111|001U1|Vd'|imm[5:0]|Vd|0000|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vshrn.x16-64 Dd, Vn, #zero" , "a32": "1111|11111|Vd'|11|sz|10|Vd|0010|00|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vshrn.x16-64 Dd, Vn, #n" , "a32": "1111|00101|Vd'|imm:6|Vd|1000|00|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vsli.x8-64 Dx, Dn, #n" , "a32": "1111|00111|Vx'|imm[5:0]|Vx|0101|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vsli.x8-64 Vx, Vn, #n" , "a32": "1111|00111|Vx'|imm[5:0]|Vx|0101|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vsra.x8-64 Dx, Dn, #n" , "a32": "1111|001U1|Vx'|imm[5:0]|Vx|0001|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vsra.x8-64 Vx, Vn, #n" , "a32": "1111|001U1|Vx'|imm[5:0]|Vx|0001|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vsri.x8-64 Dx, Dn, #n" , "a32": "1111|00111|Vx'|imm[5:0]|Vx|0100|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vsri.x8-64 Vx, Vn, #n" , "a32": "1111|00111|Vx'|imm[5:0]|Vx|0100|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vst1.8-64 Ds, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0111|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 Ds, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0111|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 Ds, [Rn!=PC, #off==8]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0111|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 2x{Ds<=30}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|1010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 2x{Ds<=30}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|1010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 2x{Ds<=30}+, [Rn!=PC, #off==16]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|1010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 3x{Ds<=29}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0110|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 3x{Ds<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0110|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 3x{Ds<=29}+, [Rn!=PC, #off==24]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0110|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 4x{Ds<=28}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 4x{Ds<=28}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 4x{Ds<=28}+, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=30}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|1000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=30}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|1000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=30}+, [Rn!=PC, #off==16]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|1000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=29}++, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|1001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=29}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|1001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=29}++, [Rn!=PC, #off==16]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|1001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 4x{Ds<=28}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0011|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 4x{Ds<=28}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0011|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 4x{Ds<=28}+, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0011|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=29}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0100|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0100|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=29}+, [Rn!=PC, #off==24]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0100|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=27}++, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0101|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=27}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0101|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=27}++, [Rn!=PC, #off==24]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0101|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=29}+, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=29}+, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=29}+, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=27}++, [Rn!=PC]" , "a32": "1111|01000|Vs'|00|Rn|Vs|0001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=27}++, [Rn!=PC, Rm!=XX]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=27}++, [Rn!=PC, #off==32]@" , "a32": "1111|01000|Vs'|00|Rn|Vs|0001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vstmdb.32 [Rn]!, SdList" , "a32": "cond|11010|immVd[0]|10|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vstmdb.64 [Rn]!, DdList" , "a32": "cond|11010|immVd[4]|10|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vstmia.32 [Rn!=PC]{!}, SdList" , "a32": "cond|11001|immVd[0]|W0|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vstmia.64 [Rn!=PC]{!}, DdList" , "a32": "cond|11001|immVd[4]|W0|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vstmia.32 [Rn==PC], SdList" , "a32": "cond|11001|immVd[0]|00|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "imm": "VecSListImm(SdList)"},
+ {"inst": "vstmia.64 [Rn==PC], DdList" , "a32": "cond|11001|immVd[4]|00|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "imm": "VecDListImm(SdList)"},
+ {"inst": "vsub.f16 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|11|Vn|Vd|11|01|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vsub.f16 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|11|Vn|Vd|11|01|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vsub.f32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|10|Vn|Vd|11|01|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsub.f32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|10|Vn|Vd|11|01|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsub.x8-64 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|10|00|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsub.x8-64 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|10|00|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsubhn.x16-64 Dd, Vn, Vm" , "a32": "1111|00101|Vd'|szM1:2|Vn|Vd|0110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vsubl.x8-32 Vd, Dn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|0010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vsubw.x8-32 Vd, Vn, Dm" , "a32": "1111|001U1|Vd'|sz|Vn|Vd|0011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vswp.any Dx, Dx2!=Dx" , "a32": "1111|00111|Vx'|11|00|10|Vx|0000|0|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vswp.any Vx, Vx2!=Vx" , "a32": "1111|00111|Vx'|11|00|10|Vx|0000|0|1|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|00|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dn2+, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|01|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dn2+, Dn3+, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|10|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dn2+, Dn3+, Dn4+, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|00|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dn2+, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|01|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dn2+, Dn3+, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|10|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dn2+, Dn3+, Dn4+, Dm" , "a32": "1111|00111|Vd'|11|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtrn.x8-32 Dx, Dx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0000|1|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vtrn.x8-32 Vx, Vx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0000|1|1|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vtst.x8-32 Dd, Dn, Dm" , "a32": "1111|00100|Vd'|sz|Vn|Vd|1000|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vtst.x8-32 Vd, Vn, Vm" , "a32": "1111|00100|Vd'|sz|Vn|Vd|1000|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vuzp.x8-16 Dx, Dx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0001|0|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vuzp.x32 Dx, Dx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0000|1|0|Vx2'|0|Vx2" , "ext": "ASIMD", "aliasOf": "vtrn"},
+ {"inst": "vuzp.x8-32 Vx, Vx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0001|0|1|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vzip.x8-16 Dx, Dx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0001|1|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vzip.x32 Dx, Dx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0000|1|0|Vx2'|0|Vx2" , "ext": "ASIMD", "aliasOf": "vtrn"},
+ {"inst": "vzip.x8-32 Vx, Vx2" , "a32": "1111|00111|Vx'|11|sz|10|Vx|0001|1|1|Vx2'|0|Vx2" , "ext": "ASIMD"}
+ ]},
+
+ {"category": "ASIMD", "ext": "ASIMD", "data": [
+ {"inst": "vaba.x8-32 Dd, Dn, Dm" , "t32": "111U|111U0|Vd'|sz|Vn|Vd|0111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vaba.x8-32 Vd, Vn, Vm" , "t32": "111U|111U0|Vd'|sz|Vn|Vd|0111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vabal.x8-32 Vd, Dn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|0101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vabd.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vabd.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabd.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabdl.x8-32 Vd, Dn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|0111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vabs.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|01|Vd|01|11|0|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vabs.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|01|Vd|01|11|0|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vabs.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|01|Vd|01|11|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vabs.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|01|Vd|01|11|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vabs.s8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00|11|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vabs.s8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00|11|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vacge.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacge.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacge.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacge.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacgt.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacgt.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vacgt.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacgt.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vacle.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vacle.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vacle.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vacle.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vaclt.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vaclt.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vaclt.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vm|Vd|1110|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vaclt.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vm|Vd|1110|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vadd.f16 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vadd.f16 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vadd.f32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vadd.f32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vadd.x8-64 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|sz|Vn|Vd|1000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vadd.x8-64 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|sz|Vn|Vd|1000|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vaddhn.x16-64 Dd, Vn, Vm" , "t32": "1110|11111|Vd'|szM1:2|Vn|Vd|0100|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vaddl.x8-32 Vd, Dn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|0000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vaddw.x8-32 Vd, Vn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|0001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vand.any Dd, Dn, Dm" , "t32": "1110|11110|Vd'|00|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vand.any Vd, Vn, Vm" , "t32": "1110|11110|Vd'|00|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vand.x16-64 Dx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0011|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vbic"},
+ {"inst": "vand.x16-64 Vx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0111|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vbic"},
+ {"inst": "vbic.any Dd, Dn, Dm" , "t32": "1110|11110|Vd'|01|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbic.any Vd, Vn, Vm" , "t32": "1110|11110|Vd'|01|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbic.x16-64 Dx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0011|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vbic.x16-64 Vx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0111|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vbif.any Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbif.any Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbit.any Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbit.any Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbsl.any Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vbsl.any Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.f16-32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f16-32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f16-32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.f16-32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01010|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01010|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vceq.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01010|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vceq.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01010|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1000|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1000|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00010|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vceq.x8-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00010|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01001|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01001|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcge.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01001|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01001|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0011|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0011|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vcge.s8-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00001|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcge.s8-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00001|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01000|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01000|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcgt.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01000|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01000|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0011|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vcgt.s8-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00000|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcgt.s8-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00000|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01011|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01011|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vcle.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01011|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01011|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0011|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0011|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.s8-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00011|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcle.s8-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00011|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcls.x8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|01000|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcls.x8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|01000|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vm|Vd|1110|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vm|Vd|1110|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01100|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|01|01|Vd|01100|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vclt.f16-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01100|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.f16-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|10|01|Vd|01100|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0011|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0011|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.s8-32 Dd, Dn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00100|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclt.s8-32 Vd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|01|Vd|00100|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclz.x8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|01001|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vclz.x8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|01001|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcnt.x8 Dd, Dn" , "t32": "1111|11111|Vd'|11|00|00|Vd|01010|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcnt.x8 Vd, Vn" , "t32": "1111|11111|Vd'|11|00|00|Vd|01010|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.s32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01110|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.s32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01110|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.u32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01111|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.u32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01111|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.s32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01100|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.s32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01100|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.u32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01101|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.u32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01101|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vcvt.f32.s32 Dd, Dn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11100|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f32.s32 Vd, Vn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11100|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s32.f32 Dd, Dn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11110|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s32.f32 Vd, Vn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11110|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f32.u32 Dd, Dn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11100|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f32.u32 Vd, Vn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11100|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u32.f32 Dd, Dn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11110|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u32.f32 Vd, Vn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11110|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvta.s32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|00|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvta.s32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|00|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvta.u32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|00|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvta.u32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|00|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00110|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00111|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|11|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.s32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|11|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|11|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtm.u32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|11|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00010|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00010|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00011|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00011|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|01|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.s32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|01|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|01|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtn.u32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|01|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00100|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00100|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00101|0|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|00101|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|10|Vd|10101|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.s32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|10|Vd|10111|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|10|Vd|10100|1|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vcvtp.u32.f64 Sd, Dn" , "t32": "1111|11101|'Vd|11|11|10|Vd|10110|1|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vdup.8 Dd, Rn!=PC" , "t32": "1110|11101|1|00|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.8 Vd, Rn!=PC" , "t32": "1110|11101|1|10|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Dd, Rn!=PC" , "t32": "1110|11101|0|00|Vd|Rn|1011|Vd'|0|1|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Vd, Rn!=PC" , "t32": "1110|11101|0|10|Vd|Rn|1011|Vd'|0|1|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Dd, Rn!=PC" , "t32": "1110|11101|0|00|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Vd, Rn!=PC" , "t32": "1110|11101|0|10|Vd|Rn|1011|Vd'|0|0|1|0000" , "ext": "ASIMD"},
+ {"inst": "vdup.8 Dd, Dn[#i]" , "t32": "1111|11111|Vd'|11|i:3|1|Vd|1100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.8 Vd, Dn[#i]" , "t32": "1111|11111|Vd'|11|i:3|1|Vd|1100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Dd, Dn[#i]" , "t32": "1111|11111|Vd'|11|i:2|10|Vd|1100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.16 Vd, Dn[#i]" , "t32": "1111|11111|Vd'|11|i:2|10|Vd|1100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Dd, Dn[#i]" , "t32": "1111|11111|Vd'|11|i:1|100|Vd|1100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vdup.32 Vd, Dn[#i]" , "t32": "1111|11111|Vd'|11|i:1|100|Vd|1100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "veor.any Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "veor.any Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vext.8 Dd, Dn, Dm, #immZ<=07" , "t32": "1110|11111|Vd'|11|Vn|Vd|immZ:4|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vext.8 Vd, Vn, Vm, #immZ<=15" , "t32": "1110|11111|Vd'|11|Vn|Vd|immZ:4|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vfma.f16 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|01|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfma.f16 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|01|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfma.f32 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|00|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vfma.f32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|00|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vfms.f16 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|11|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfms.f16 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|11|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vfms.f32 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|10|Vn|Vx|1100|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vfms.f32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|10|Vn|Vx|1100|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vhadd.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vhadd.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0000|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vhsub.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vhsub.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0010|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vins.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|0000|Vd|1010|11|'Vn|0|Vn" , "ext": "FP16"},
+ {"inst": "vld1.8-64 Dd, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0111|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 Dd, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0111|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 Dd, [Rn!=PC, #off==8]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0111|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 2x{Dd<=30}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|1010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|1010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 2x{Dd<=30}+, [Rn!=PC, #off==16]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|1010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 3x{Dd<=29}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0110|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 3x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0110|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 3x{Dd<=29}+, [Rn!=PC, #off==24]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0110|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 4x{Dd<=28}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 4x{Dd<=28}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8-64 4x{Dd<=28}+, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.8 Dd[#i], [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0000|i:3|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.8 Dd[#i], [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0000|i:3|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.8 Dd[#i], [Rn!=PC, #off==1]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0000|i:3|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.16 Dd[#i], [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0100|i:2|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.16 Dd[#i], [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0100|i:2|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.16 Dd[#i], [Rn!=PC, #off==2]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0100|i:2|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1.32 Dd[#i], [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1000|i:1|0|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld1.32 Dd[#i], [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1000|i:1|0|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1.32 Dd[#i], [Rn!=PC, #off==4]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1000|i:1|0|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 Dd, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1100|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 Dd, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1100|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 Dd, [Rn!=PC, #off==1<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1100|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 2x{Dd<=30}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1100|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1100|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld1r.8-32 2x{Dd<=30}+, [Rn!=PC, #off==1<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1100|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=30}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|1000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|1000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=30}+, [Rn!=PC, #off==16]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|1000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=29}++, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|1001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=29}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|1001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 2x{Dd<=29}++, [Rn!=PC, #off==16]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|1001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 4x{Dd<=28}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0011|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 4x{Dd<=28}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0011|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8-32 4x{Dd<=28}+, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0011|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.8 2x{Dd<=30[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0001|i:3|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.8 2x{Dd<=30[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0001|i:3|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.8 2x{Dd<=30[#i]}+, [Rn!=PC, #off==2]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0001|i:3|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=30[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0101|i:2|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=30[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0101|i:2|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=30[#i]}+, [Rn!=PC, #off==4]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0101|i:2|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=29[#i]}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0101|i:2|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=29[#i]}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0101|i:2|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.16 2x{Dd<=29[#i]}++, [Rn!=PC, #off==4]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0101|i:2|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=30[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1001|i:1|0|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=30[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1001|i:1|0|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=30[#i]}+, [Rn!=PC, #off==8]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1001|i:1|0|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=29[#i]}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1001|i:1|1|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=29[#i]}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1001|i:1|1|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2.32 2x{Dd<=29[#i]}++, [Rn!=PC, #off==8]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1001|i:1|1|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=30}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1101|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=30}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1101|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=30}+, [Rn!=PC, #off==2<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1101|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=29}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1101|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=29}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1101|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld2r.8-32 2x{Dd<=29}++, [Rn!=PC, #off==2<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1101|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=29}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0100|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0100|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=29}+, [Rn!=PC, #off==24]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0100|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=27}++, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0101|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=27}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0101|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.8-32 3x{Dd<=27}++, [Rn!=PC, #off==24]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0101|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.8 3x{Dd<=29[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0010|i:3|0|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.8 3x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0010|i:3|0|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.8 3x{Dd<=29[#i]}+, [Rn!=PC, #off==3]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0010|i:3|0|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=29[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0110|i:2|00|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0110|i:2|00|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=29[#i]}+, [Rn!=PC, #off==6]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0110|i:2|00|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=27[#i]}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0110|i:2|10|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0110|i:2|10|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.16 3x{Dd<=27[#i]}++, [Rn!=PC, #off==6]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0110|i:2|10|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=29[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1010|i:1|000|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1010|i:1|000|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=29[#i]}+, [Rn!=PC, #off==12]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1010|i:1|000|1101" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=27[#i]}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1010|i:1|100|1111" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1010|i:1|100|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3.32 3x{Dd<=27[#i]}++, [Rn!=PC, #off==12]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1010|i:1|100|1101" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=29}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1110|sz|0|0|1111" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1110|sz|0|0|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=29}+, [Rn!=PC, #off==3<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1110|sz|0|0|1101" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=27}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1110|sz|1|0|1111" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=27}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1110|sz|1|0|Rm" , "ext": "ASIMD"},
+ {"inst": "vld3r.8-32 3x{Dd<=27}++, [Rn!=PC, #off==3<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1110|sz|1|0|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=29}+, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=29}+, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=27}++, [Rn!=PC]" , "t32": "1111|10010|Vd'|10|Rn|Vd|0001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=27}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.8-32 4x{Dd<=27}++, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vd'|10|Rn|Vd|0001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.8 4x{Dd<=29[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0011|i:3|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.8 4x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0011|i:3|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.8 4x{Dd<=29[#i]}+, [Rn!=PC, #off==4]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0011|i:3|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=29[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0111|i:2|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0111|i:2|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=29[#i]}+, [Rn!=PC, #off==8]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0111|i:2|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=27[#i]}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|0111|i:2|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0111|i:2|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.16 4x{Dd<=27[#i]}++, [Rn!=PC, #off==8]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|0111|i:2|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=29[#i]}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1011|i:1|0|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=29[#i]}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1011|i:1|0|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=29[#i]}+, [Rn!=PC, #off==16]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1011|i:1|0|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=27[#i]}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1011|i:1|1|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=27[#i]}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1011|i:1|1|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4.32 4x{Dd<=27[#i]}++, [Rn!=PC, #off==16]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1011|i:1|1|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=28}+, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1111|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=28}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1111|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=28}+, [Rn!=PC, #off==4<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1111|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=25}++, [Rn!=PC]" , "t32": "1111|10011|Vd'|10|Rn|Vd|1111|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=25}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1111|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vld4r.8-32 4x{Dd<=25}++, [Rn!=PC, #off==4<<sz]@" , "t32": "1111|10011|Vd'|10|Rn|Vd|1111|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vldmdb.32 [Rn!=PC]!, SdList" , "t32": "1110|11010|immVd[0]|11|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecSListImm(SdList)"},
+ {"inst": "vldmdb.64 [Rn!=PC]!, DdList" , "t32": "1110|11010|immVd[4]|11|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecDListImm(SdList)"},
+ {"inst": "vldmia.32 [Rn!=PC]{!}, SdList" , "t32": "1110|11001|immVd[0]|W1|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecSListImm(SdList)"},
+ {"inst": "vldmia.64 [Rn!=PC]{!}, DdList" , "t32": "1110|11001|immVd[4]|W1|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecDListImm(SdList)"},
+ {"inst": "vmax.f16 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vmax.f16 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vmax.f32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmax.f32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmax.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmax.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0110|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmaxnm.f16 Sd, Sn, Sm" , "t32": "1111|11101|'Vd|00|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vmaxnm.f32 Sd, Sn, Sm" , "t32": "1111|11101|'Vd|00|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vmaxnm.f64 Dd, Dn, Dm" , "t32": "1111|11101|Vd'|00|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vmaxnm.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vmaxnm.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vmaxnm.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmaxnm.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmin.f16 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vmin.f16 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|11|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vmin.f32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmin.f32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|10|Vn|Vd|1111|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmin.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0110|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmin.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0110|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vminnm.f16 Sd, Sn, Sm" , "t32": "1111|11101|'Vd|00|Vn|Vd|10|01|'Vn|1|'Vm|0|Vm" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vminnm.f32 Sd, Sn, Sm" , "t32": "1111|11101|'Vd|00|Vn|Vd|10|10|'Vn|1|'Vm|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vminnm.f64 Dd, Dn, Dm" , "t32": "1111|11101|Vd'|00|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vminnm.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vminnm.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vminnm.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vminnm.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vmla.f16 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|01|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmla.f16 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|01|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmla.f32 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|00|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|00|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x8-32 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|sz|Vn|Vx|1001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x8-32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|sz|Vn|Vx|1001|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f16 Dx, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vx'|01|Vn|Vx|0001|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "FP16"},
+ {"inst": "vmla.f16 Vx, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vx'|01|Vn|Vx|0001|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "FP16"},
+ {"inst": "vmla.f32 Dx, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vx'|10|Vn|Vx|0001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.f32 Vx, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vx'|10|Vn|Vx|0001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x16 Dx, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vx'|01|Vn|Vx|0000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmla.x16 Vx, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vx'|01|Vn|Vx|0000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmla.x32 Dx, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vx'|10|Vn|Vx|0000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmla.x32 Vx, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vx'|10|Vn|Vx|0000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmlal.x8-32 Vx, Dn, Dm" , "t32": "111U|11111|Vx'|sz|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlal.x16 Vx, Dn, Dm<=07[#i]" , "t32": "111U|11111|Vx'|01|Vn|Vx|0010|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlal.x32 Vx, Dn, Dm<=15[#i]" , "t32": "111U|11111|Vx'|10|Vn|Vx|0010|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmls.f16 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|11|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmls.f16 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|11|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmls.f32 Dx, Dn, Dm" , "t32": "1110|11110|Vx'|10|Vn|Vx|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.f32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|10|Vn|Vx|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x8-32 Dx, Dn, Dm" , "t32": "1111|11110|Vx'|sz|Vn|Vx|1001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x8-32 Vx, Vn, Vm" , "t32": "1111|11110|Vx'|sz|Vn|Vx|1001|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.f16 Dx, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vx'|01|Vn|Vx|0101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.f16 Vx, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vx'|01|Vn|Vx|0101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.f32 Dx, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vx'|10|Vn|Vx|0101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.f32 Vx, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vx'|10|Vn|Vx|0101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x16 Dx, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vx'|01|Vn|Vx|0100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.x16 Vx, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vx'|01|Vn|Vx|0100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmls.x32 Dx, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vx'|10|Vn|Vx|0100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmls.x32 Vx, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vx'|10|Vn|Vx|0100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmlsl.x8-32 Vx, Dn, Dm" , "t32": "111U|11111|Vx'|sz|Vn|Vx|1010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlsl.x16 Vx, Dn, Dm<=07[#i]" , "t32": "111U|11111|Vx'|01|Vn|Vx|0110|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmlsl.x32 Vx, Dn, Dm<=15[#i]" , "t32": "111U|11111|Vx'|10|Vn|Vx|0110|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmov Rd!=PC, Sn" , "t32": "1110|11100|0|01|Vn|Rd|1010|'Vn|00|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov Sd, Rn!=PC" , "t32": "1110|11100|0|00|Vd|Rn|1010|'Vd|00|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov Rd!=PC, Rd2!=PC, Ss!=31, Ss2+" , "t32": "1110|11000|1|01|Rd2|Rd|101|000|'Vs|1|Vs" , "ext": "ASIMD"},
+ {"inst": "vmov Sd!=31, Sd2+, Rs!=PC, Rs2!=PC" , "t32": "1110|11000|1|00|Rs2|Rs|101|000|'Vd|1|Vd" , "ext": "ASIMD"},
+ {"inst": "vmov Rd!=PC, Rd2!=PC, Ds" , "t32": "1110|11000|1|01|Rd2|Rd|1011|0|0|Vs'|1|Vs" , "ext": "ASIMD"},
+ {"inst": "vmov Dd, Rs!=PC, Rs2!=PC" , "t32": "1110|11000|1|00|Rs2|Rs|1011|0|0|Vd'|1|Vd" , "ext": "ASIMD"},
+ {"inst": "vmov.x8 Dd[#i], Rn!=PC" , "t32": "1110|11100|1|i:1|0|Vd|Rn|1011|Vd'|i:2|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.x16 Dd[#i], Rn!=PC" , "t32": "1110|11100|0|i:1|0|Vd|Rn|1011|Vd'|i:1|110000" , "ext": "ASIMD"},
+ {"inst": "vmov.x32 Dd[#i], Rn!=PC" , "t32": "1110|11100|0|i:1|0|Vd|Rn|1011|Vd'|001|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.x8 Rd!=PC, Dn[#i]" , "t32": "1110|1110U|1|i:1|1|Vn|Rd|1011|Vn'|i:2|1|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.x16 Rd!=PC, Dn[#i]" , "t32": "1110|1110U|0|i:1|1|Vn|Rd|1011|Vn'|i:1|110000" , "ext": "ASIMD"},
+ {"inst": "vmov.x32 Rd!=PC, Dn[#i]" , "t32": "1110|11100|0|i:1|1|Vn|Rd|1011|Vn'|001|0000" , "ext": "ASIMD"},
+ {"inst": "vmov.any Dd, Dn" , "t32": "1110|11110|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|0|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "aliasOf": "vorr"},
+ {"inst": "vmov.any Vd, Vn" , "t32": "1110|11110|Vd'|10|Vn[3:0]|Vd|0001|Vn[4]|1|Vn[4]|1|Vn[3:0]", "ext": "ASIMD", "aliasOf": "vorr"},
+ {"inst": "vmov.x8-64 Dd, #immV" , "t32": "111|imm:1|11111|Vd'|000|imm:3|Vd|cmode:4|00|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 0, immV)"},
+ {"inst": "vmov.x8-64 Vd, #immV" , "t32": "111|imm:1|11111|Vd'|000|imm:3|Vd|cmode:4|01|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 0, immV)"},
+ {"inst": "vmovl.x8 Vd, Dn" , "t32": "111U|11111|Vd'|00|1000|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmovl.x16 Vd, Dn" , "t32": "111U|11111|Vd'|01|0000|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmovl.x32 Vd, Dn" , "t32": "111U|11111|Vd'|10|0000|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmovn.x16-64 Dd, Vn" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|00|Vn'|0|Vn" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vmul.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmul.f16 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vmul.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.f32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1101|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x8-32|p8 Dd, Dn, Dm" , "t32": "111P|11110|Vd'|sz|Vn|Vd|1001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x8-32|p8 Vd, Vn, Vm" , "t32": "111P|11110|Vd'|sz|Vn|Vd|1001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.f32 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|10|Vn|Vd|1001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.f32 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vd'|10|Vn|Vd|1001|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x16 Dd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|01|Vn|Vd|1000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmul.x16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vd'|01|Vn|Vd|1000|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD"},
+ {"inst": "vmul.x32 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|10|Vn|Vd|1000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmul.x32 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vd'|10|Vn|Vd|1000|Vn'|1|i:1|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vmull.x8-32|p8 Vd, Dn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|11P0|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmull.p64 Vd, Dn, Dm" , "t32": "1110|11111|Vd'|10|Vn|Vd|11P0|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmull.x16 Vd, Dn, Dm<=07[#i]" , "t32": "111U|11111|Vd'|01|Vn|Vd|1010|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmull.x32 Vd, Dn, Dm<=15[#i]" , "t32": "111U|11111|Vd'|10|Vn|Vd|1010|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vmvn.any Dd, #immV" , "t32": "111|imm:1|11111|Vd'|000|imm:3|Vd|cmode:4|00|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 1, immV)"},
+ {"inst": "vmvn.any Vd, #immV" , "t32": "111|imm:1|11111|Vd'|000|imm:3|Vd|cmode:4|01|op|1|imm:4" , "ext": "ASIMD", "imm": "VecMovImm(sz, 1, immV)"},
+ {"inst": "vmvn.any Dd, Dn" , "t32": "1111|11111|Vd'|11|0000|Vd|0101|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vmvn.any Vd, Vn" , "t32": "1111|11111|Vd'|11|0000|Vd|0101|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vneg.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|0111|10|Vn'|0|Vn" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vneg.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|0111|11|Vn'|0|Vn" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vneg.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|0111|10|Vn'|0|Vn" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vneg.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|0111|11|Vn'|0|Vn" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vneg.s8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|0011|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vneg.s8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|01|Vd|0011|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vorn.x16-64 Dx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0001|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vorr"},
+ {"inst": "vorn.x16-64 Vx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0101|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 1, immV)", "pseudoOf": "vorr"},
+ {"inst": "vorn.any Dd, Dn, Dm" , "t32": "1110|11110|Vd'|11|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vorn.any Vd, Vn, Vm" , "t32": "1110|11110|Vd'|11|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vorr.x16-64 Dx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0001|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vorr.x16-64 Vx, #immV" , "t32": "111|imm:1|11111|Vx'|000|imm:3|Vx|cmode:4|0101|imm:4" , "ext": "ASIMD", "imm": "VecBicOrrImm(sz, 0, immV)"},
+ {"inst": "vorr.any Dd, Dn, Dm" , "t32": "1110|11110|Vd'|10|Vn|Vd|0001|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vorr.any Vd, Vn, Vm" , "t32": "1110|11110|Vd'|10|Vn|Vd|0001|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vpadal.x8-32 Dx, Dn" , "t32": "1111|11111|Vx'|11|sz|00|Vx|0110|U|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpadal.x8-32 Vx, Vn" , "t32": "1111|11111|Vx'|11|sz|00|Vx|0110|U|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpadd.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vpadd.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vpaddl.x8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0010|U|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpaddl.x8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0010|U|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vpmax.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vpmax.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vpmax.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|1010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vpmin.f16 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vpmin.f32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vpmin.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|1010|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vpop.32 SdList" , "t32": "1110|11001|immVd[0]|11|1101|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecSListImm(SdList)"},
+ {"inst": "vpop.64 DdList" , "t32": "1110|11001|immVd[4]|11|1101|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecDListImm(SdList)"},
+ {"inst": "vpush.32 SdList" , "t32": "1110|11010|immVd[0]|10|1101|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecSListImm(SdList)"},
+ {"inst": "vpush.64 DdList" , "t32": "1110|11010|immVd[4]|10|1101|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecDListImm(SdList)"},
+ {"inst": "vqabs.s8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0111|0|0|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqabs.s8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0111|0|1|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqadd.x8-64 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0000|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqadd.x8-64 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0000|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmlal.s16-32 Vx, Dn, Dm" , "t32": "1110|11111|Vx'|sz|Vn|Vx|1001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlal.s16 Vx, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vx'|01|Vn|Vx|0011|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlal.s32 Vx, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vx'|10|Vn|Vx|0011|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlsl.s16-32 Vx, Dn, Dm" , "t32": "1110|11111|Vx'|sz|Vn|Vx|1011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlsl.s16 Vx, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vx'|01|Vn|Vx|0111|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmlsl.s32 Vx, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vx'|10|Vn|Vx|0111|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmulh.s16-32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|sz|Vn|Vd|1011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s16-32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|sz|Vn|Vd|1011|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s16 Dd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|01|Vn|Vd|1100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vd'|01|Vn|Vd|1100|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s32 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|10|Vn|Vd|1100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmulh.s32 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vd'|10|Vn|Vd|1100|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqdmull.s16-32 Vd, Dn, Dm" , "t32": "1110|11111|Vd'|sz|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmull.s16 Vd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|01|Vn|Vd|1011|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqdmull.s32 Vd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|10|Vn|Vd|1011|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "widen"},
+ {"inst": "vqmovn.x16-64 Dd, Vn" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|1|U|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqmovun.s16-64 Dd, Vn" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|0|1|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqneg.s8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0111|1|0|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqneg.s8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0111|1|1|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1011|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16 Dd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|01|Vn|Vd|1101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vd'|01|Vn|Vd|1101|Vn'|1|i:1|0|i:1|Vm:3" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s32 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrdmulh.s32 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrshl.x8-64 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0101|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrshl.x8-64 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0101|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqrshrn.x16-64 Dd, Vn, #zero" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|1U|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqrshrn.x16-64 Dd, Vn, #n" , "t32": "111U|11111|Vd'|imm:6|Vd|1001|01|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqrshrun.s16-64 Dd, Vn, #zero" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|01|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqrshrun.s16-64 Dd, Vn, #n" , "t32": "1111|11111|Vd'|imm:6|Vd|1000|01|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqshl.x8-64 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0100|Vm'|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqshl.x8-64 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0100|Vm'|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqshl.x8-64 Dd, Dn, #n" , "t32": "111U|11111|Vd'|imm[5:0]|Vd|0111|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshl.x8-64 Vd, Vn, #n" , "t32": "111U|11111|Vd'|imm[5:0]|Vd|0111|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshlu.s8-64 Dd, Dn, #n" , "t32": "1111|11111|Vd'|imm[5:0]|Vd|0110|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshlu.s8-64 Vd, Vn, #n" , "t32": "1111|11111|Vd'|imm[5:0]|Vd|0110|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vqshrn.x16-64 Dd, Vn, #zero" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|1U|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqshrn.x16-64 Dd, Vn, #n" , "t32": "111U|11111|Vd'|imm:6|Vd|1001|0|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqshrun.s16-64 Dd, Vn, #zero" , "t32": "1111|11111|Vd'|11|szM1:2|10|Vd|0010|01|Vn'|0|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "vecOp": "narrow"},
+ {"inst": "vqshrun.s16-64 Dd, Vn, #n" , "t32": "1111|11111|Vd'|imm:6|Vd|1000|0|0|Vn'|1|Vn" , "ext": "ASIMD", "fpcsr": "Q=X", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vqsub.x8-64 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0010|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vqsub.x8-64 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0010|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "fpcsr": "Q=X"},
+ {"inst": "vraddhn.x16-64 Dd, Vn, Vm" , "t32": "1111|11111|Vd'|szM1:2|Vn|Vd|0100|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vrecpe.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|0101|0|0|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vrecpe.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|0101|0|1|Vn'|0|Vn" , "ext": "ASIMD FP16"},
+ {"inst": "vrecpe.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|0101|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecpe.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|0101|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecpe.u32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|0100|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecpe.u32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|0100|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrecps.f16 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vrecps.f16 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|01|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vrecps.f32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vrecps.f32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|00|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vrev16.x8 Dd, Dn" , "t32": "1111|11111|Vd'|11|00|00|Vd|0001|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev16.x8 Vd, Vn" , "t32": "1111|11111|Vd'|11|00|00|Vd|0001|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev32.x8-16 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0000|1|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev32.x8-16 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0000|1|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev64.x8-32 Dd, Dn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0000|0|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrev64.x8-32 Vd, Vn" , "t32": "1111|11111|Vd'|11|sz|00|Vd|0000|0|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrhadd.x8-32 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0001|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vrhadd.x8-32 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vn|Vd|0001|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vrinta.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|00|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrinta.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|00|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrinta.f64 Dd, Dn" , "t32": "1111|11101|Vd'|11|10|00|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrinta.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|01|00|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrinta.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|01|01|Vn'|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrinta.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|01|00|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrinta.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|01|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintm.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|11|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintm.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|11|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintm.f64 Dd, Dn" , "t32": "1111|11101|Vd'|11|10|11|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintm.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|10|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintm.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|10|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintm.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|10|10|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintm.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|10|11|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintn.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|01|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintn.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|01|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintn.f64 Dd, Dn" , "t32": "1111|11101|Vd'|11|10|01|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintn.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|00|00|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintn.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|00|01|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintn.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|00|00|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintn.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|00|01|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintp.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|10|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintp.f32 Sd, Sn" , "t32": "1111|11101|'Vd|11|10|10|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintp.f64 Dd, Dn" , "t32": "1111|11101|Vd'|11|10|10|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintp.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|11|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintp.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|11|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintp.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|11|10|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintp.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|11|11|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintr.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|01|10|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintr.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|01|10|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintr.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|01|10|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintx.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|01|11|Vd|10|01|01|'Vn|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintx.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|01|11|Vd|10|10|01|'Vn|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintx.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|01|11|Vd|10|11|01|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintx.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|00|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintx.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|00|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintx.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|00|10|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintx.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|00|11|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintz.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|01|10|Vd|10|01|11|'Vn|0|Vn" , "ext": "ARMv8+ FP16"},
+ {"inst": "vrintz.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|01|10|Vd|10|10|11|'Vn|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintz.f64 Dd, Dn" , "t32": "1110|11101|Vd'|11|01|10|Vd|10|11|11|Vn'|0|Vn" , "ext": "ARMv8+"},
+ {"inst": "vrintz.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|01|10|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintz.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01|01|11|Vn'|0|Vn" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vrintz.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|01|10|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrintz.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|10|Vd|01|01|11|Vn'|0|Vn" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vrshl.x8-64 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0101|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrshl.x8-64 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0101|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrshr.x8-32 Dd, Dn, #zero" , "t32": "1110|11110|Vd'|10|Vd|Vd|0001|Vn'|0|Vn'|1|Vn" , "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vrshr.x8-32 Vd, Vn, #zero" , "t32": "1110|11110|Vd'|10|Vd|Vd|0001|Vn'|1|Vn'|1|Vn" , "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vrshr.x8-32 Dd, Dn, #n" , "t32": "111U|11111|Vd'|imm:6|Vd|0010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrshr.x8-32 Vd, Vn, #n" , "t32": "111U|11111|Vd'|imm:6|Vd|0010|0|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrshrn.x16-64 Dd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|10|Vd|0010|00|Vn'|1|Vn" , "ext": "ASIMD", "vecOp": "narrow", "pseudoOf": "vmovn"},
+ {"inst": "vrshrn.x16-64 Dd, Vn, #n" , "t32": "1110|11111|Vd'|imm:6|Vd|1000|0|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vrsqrte.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|01|01|10|Vn'|0|Vn" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vrsqrte.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|01|01|11|Vn'|0|Vn" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vrsqrte.f32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01|01|10|Vn'|0|Vn" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vrsqrte.f32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01|01|11|Vn'|0|Vn" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vrsqrte.u32 Dd, Dn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01|00|10|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrsqrte.u32 Vd, Vn" , "t32": "1111|11111|Vd'|11|10|11|Vd|01|00|11|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vrsqrts.f16 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|11|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vrsqrts.f16 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|11|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD FP16", "it": "out"},
+ {"inst": "vrsqrts.f32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|10|Vn|Vd|1111|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vrsqrts.f32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|10|Vn|Vd|1111|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD", "it": "out"},
+ {"inst": "vrsra.x8-64 Dx, Dn, #n" , "t32": "111U|11111|Vx'|imm[5:0]|Vx|0011|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrsra.x8-64 Vx, Vn, #n" , "t32": "111U|11111|Vx'|imm[5:0]|Vx|0011|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vrsubhn.x16-64 Dd, Vn, Vm" , "t32": "1111|11111|Vd'|szM1:2|Vn|Vd|0110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vseleq.f16 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|00|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vseleq.f32 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|00|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vseleq.f64 Dd, Dn, Dm" , "t32": "1111|11100|Vd'|00|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vselge.f16 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|10|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vselge.f32 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|10|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vselge.f64 Dd, Dn, Dm" , "t32": "1111|11100|Vd'|10|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vselgt.f16 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|11|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vselgt.f32 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|11|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vselgt.f64 Dd, Dn, Dm" , "t32": "1111|11100|Vd'|11|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vselvs.f16 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|01|Vn|Vd|10|01|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+ FP16", "it": "out"},
+ {"inst": "vselvs.f32 Sd, Sn, Sm" , "t32": "1111|11100|'Vd|01|Vn|Vd|10|10|'Vn|0|'Vm|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vselvs.f64 Dd, Dn, Dm" , "t32": "1111|11100|Vd'|01|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ARMv8+", "it": "out"},
+ {"inst": "vshl.x8-64 Dd, Dn, Dm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0100|Vm'|0|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vshl.x8-64 Vd, Vn, Vm" , "t32": "111U|11110|Vd'|sz|Vm|Vd|0100|Vm'|1|Vn'|0|Vn" , "ext": "ASIMD"},
+ {"inst": "vshl.x8-64 Dd, Dn, #n" , "t32": "1110|11111|Vd'|imm[5:0]|Vd|0101|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vshl.x8-64 Vd, Vn, #n" , "t32": "1110|11111|Vd'|imm[5:0]|Vd|0101|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vshll.x8-32 Vd, Dn, #n" , "t32": "111U|11111|Vd'|imm[5:0]|Vd|1010|0|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)", "vecOp": "widen"},
+ {"inst": "vshr.x8-64 Dd, Dn, #zero" , "t32": "1110|11110|Vd'|10|Vn|Vd|0001|Vn'|0|Vn'|1|Vn" , "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vshr.x8-64 Vd, Vn, #zero" , "t32": "1110|11110|Vd'|10|Vn|Vd|0001|Vn'|1|Vn'|1|Vn" , "ext": "ASIMD", "pseudoOf": "vorr"},
+ {"inst": "vshr.x8-64 Dd, Dn, #n" , "t32": "111U|11111|Vd'|imm[5:0]|Vd|0000|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vshr.x8-64 Vd, Vn, #n" , "t32": "111U|11111|Vd'|imm[5:0]|Vd|0000|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vshrn.x16-64 Dd, Vn, #zero" , "t32": "1111|11111|Vd'|11|sz|10|Vd|0010|00|Vn'|0|Vn" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vshrn.x16-64 Dd, Vn, #n" , "t32": "1110|11111|Vd'|imm:6|Vd|1000|00|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNarrowImm(sz, n)", "vecOp": "narrow"},
+ {"inst": "vsli.x8-64 Dx, Dn, #n" , "t32": "1111|11111|Vx'|imm[5:0]|Vx|0101|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vsli.x8-64 Vx, Vn, #n" , "t32": "1111|11111|Vx'|imm[5:0]|Vx|0101|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftPImm(sz, n)"},
+ {"inst": "vsra.x8-64 Dx, Dn, #n" , "t32": "111U|11111|Vx'|imm[5:0]|Vx|0001|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vsra.x8-64 Vx, Vn, #n" , "t32": "111U|11111|Vx'|imm[5:0]|Vx|0001|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vsri.x8-64 Dx, Dn, #n" , "t32": "1111|11111|Vx'|imm[5:0]|Vx|0100|imm[6]|0|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vsri.x8-64 Vx, Vn, #n" , "t32": "1111|11111|Vx'|imm[5:0]|Vx|0100|imm[6]|1|Vn'|1|Vn" , "ext": "ASIMD", "imm": "VecShiftNImm(sz, n)"},
+ {"inst": "vst1.8-64 Ds, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0111|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 Ds, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0111|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 Ds, [Rn!=PC, #off==8]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0111|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 2x{Ds<=30}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|1010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 2x{Ds<=30}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|1010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 2x{Ds<=30}+, [Rn!=PC, #off==16]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|1010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 3x{Ds<=29}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0110|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 3x{Ds<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0110|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 3x{Ds<=29}+, [Rn!=PC, #off==24]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0110|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 4x{Ds<=28}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0010|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 4x{Ds<=28}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0010|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst1.8-64 4x{Ds<=28}+, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0010|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=30}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|1000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=30}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|1000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=30}+, [Rn!=PC, #off==16]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|1000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=29}++, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|1001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=29}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|1001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 2x{Ds<=29}++, [Rn!=PC, #off==16]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|1001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 4x{Ds<=28}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0011|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 4x{Ds<=28}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0011|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst2.8-32 4x{Ds<=28}+, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0011|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=29}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0100|sz|0|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0100|sz|0|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=29}+, [Rn!=PC, #off==24]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0100|sz|0|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=27}++, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0101|sz|1|align:1|1111" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=27}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0101|sz|1|align:1|Rm" , "ext": "ASIMD"},
+ {"inst": "vst3.8-32 3x{Ds<=27}++, [Rn!=PC, #off==24]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0101|sz|1|align:1|1101" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=29}+, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0000|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=29}+, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0000|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=29}+, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0000|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=27}++, [Rn!=PC]" , "t32": "1111|10010|Vs'|00|Rn|Vs|0001|sz|align:2|1111" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=27}++, [Rn!=PC, Rm!=XX]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0001|sz|align:2|Rm" , "ext": "ASIMD"},
+ {"inst": "vst4.8-32 4x{Ds<=27}++, [Rn!=PC, #off==32]@" , "t32": "1111|10010|Vs'|00|Rn|Vs|0001|sz|align:2|1101" , "ext": "ASIMD"},
+ {"inst": "vstmdb.32 [Rn!=PC]!, SdList" , "t32": "1110|11010|immVd[0]|10|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecSListImm(SdList)"},
+ {"inst": "vstmdb.64 [Rn!=PC]!, DdList" , "t32": "1110|11010|immVd[4]|10|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecDListImm(SdList)"},
+ {"inst": "vstmia.32 [Rn!=PC]{!}, SdList" , "t32": "1110|11001|immVd[0]|W0|Rn|immVd[4:1]|1010|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecSListImm(SdList)"},
+ {"inst": "vstmia.64 [Rn!=PC]{!}, DdList" , "t32": "1110|11001|immVd[4]|W0|Rn|immVd[3:0]|1011|immCount:8" , "ext": "ASIMD", "it": "any", "imm": "VecDListImm(SdList)"},
+ {"inst": "vsub.f16 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|11|Vn|Vd|11|01|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vsub.f16 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|11|Vn|Vd|11|01|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD FP16"},
+ {"inst": "vsub.f32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|10|Vn|Vd|11|01|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsub.f32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|10|Vn|Vd|11|01|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsub.x8-64 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|10|00|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsub.x8-64 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|10|00|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vsubhn.x16-64 Dd, Vn, Vm" , "t32": "1110|11111|Vd'|szM1:2|Vn|Vd|0110|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "narrow"},
+ {"inst": "vsubl.x8-32 Vd, Dn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|0010|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vsubw.x8-32 Vd, Vn, Dm" , "t32": "111U|11111|Vd'|sz|Vn|Vd|0011|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD", "vecOp": "widen"},
+ {"inst": "vswp.any Dx, Dx2!=Dx" , "t32": "1111|11111|Vx'|11|00|10|Vx|0000|0|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vswp.any Vx, Vx2!=Vx" , "t32": "1111|11111|Vx'|11|00|10|Vx|0000|0|1|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|00|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dn2+, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|01|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dn2+, Dn3+, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|10|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbl.x8 Dd, Dn, Dn2+, Dn3+, Dn4+, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|11|Vn'|0|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|00|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dn2+, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|01|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dn2+, Dn3+, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|10|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtbx.x8 Dd, Dn, Dn2+, Dn3+, Dn4+, Dm" , "t32": "1111|11111|Vd'|11|Vn|Vd|10|11|Vn'|1|Vm'|0|Vm" , "ext": "ASIMD"},
+ {"inst": "vtrn.x8-32 Dx, Dx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0000|1|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vtrn.x8-32 Vx, Vx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0000|1|1|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vtst.x8-32 Dd, Dn, Dm" , "t32": "1110|11110|Vd'|sz|Vn|Vd|1000|Vn'|0|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vtst.x8-32 Vd, Vn, Vm" , "t32": "1110|11110|Vd'|sz|Vn|Vd|1000|Vn'|1|Vm'|1|Vm" , "ext": "ASIMD"},
+ {"inst": "vuzp.x8-16 Dx, Dx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0001|0|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vuzp.x32 Dx, Dx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0000|1|0|Vx2'|0|Vx2" , "ext": "ASIMD", "aliasOf": "vtrn"},
+ {"inst": "vuzp.x8-32 Vx, Vx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0001|0|1|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vzip.x8-16 Dx, Dx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0001|1|0|Vx2'|0|Vx2" , "ext": "ASIMD"},
+ {"inst": "vzip.x32 Dx, Dx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0000|1|0|Vx2'|0|Vx2" , "ext": "ASIMD", "aliasOf": "vtrn"},
+ {"inst": "vzip.x8-32 Vx, Vx2" , "t32": "1111|11111|Vx'|11|sz|10|Vx|0001|1|1|Vx2'|0|Vx2" , "ext": "ASIMD"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "AES", "data": [
+ {"inst": "aesd.x8 Vx, Vm" , "a32": "1111|00111|Vx'|11|00|00|Vx|0|0110|1|Vm'|0|Vm"},
+ {"inst": "aese.x8 Vx, Vm" , "a32": "1111|00111|Vx'|11|00|00|Vx|0|0110|0|Vm'|0|Vm"},
+ {"inst": "aesimc.x8 Vd, Vm" , "a32": "1111|00111|Vd'|11|00|00|Vd|0|0111|1|Vm'|0|Vm"},
+ {"inst": "aesmc.x8 Vd, Vm" , "a32": "1111|00111|Vd'|11|00|00|Vd|0|0111|0|Vm'|0|Vm"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "AES", "data": [
+ {"inst": "aesd.x8 Vx, Vm" , "t32": "1111|11111|Vx'|11|00|00|Vx|0|0110|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "aese.x8 Vx, Vm" , "t32": "1111|11111|Vx'|11|00|00|Vx|0|0110|0|Vm'|0|Vm" , "it": "out"},
+ {"inst": "aesimc.x8 Vd, Vm" , "t32": "1111|11111|Vd'|11|00|00|Vd|0|0111|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "aesmc.x8 Vd, Vm" , "t32": "1111|11111|Vd'|11|00|00|Vd|0|0111|0|Vm'|0|Vm" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "BF16", "data": [
+ {"inst": "vmmla.bf16 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|00|Vn|Vd|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vcvtb.bf16.f32 Sd, Dn" , "a32": "cond|11101|'Vd|11|00|11|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtt.bf16.f32 Sd, Dn" , "a32": "cond|11101|'Vd|11|00|11|Vd|10011|1|'Vn|0|Vn"},
+ {"inst": "vdot.bf16 Dd, Dn, Dm" , "a32": "1111|11000|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vdot.bf16 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|00|Vn|Vd|1101|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vdot.bf16 Dd, Dn, Dm<=15[#i]" , "a32": "1111|11100|Vd'|00|Vn|Vd|1101|Vn'|0|i:1|0|Vm"},
+ {"inst": "vdot.bf16 Vd, Vn, Dm<=15[#i]" , "a32": "1111|11100|Vd'|00|Vn|Vd|1101|Vn'|1|i:1|0|Vm"},
+ {"inst": "vfmab.bf16 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|11|Vn|Vd|1000|Vn'|0|Vm'|1|Vm"},
+ {"inst": "vfmab.bf16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|11100|Vd'|11|Vn|Vd|1000|Vn'|0|i:1|1|i:1|Vm[2:0]"},
+ {"inst": "vfmat.bf16 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|11|Vn|Vd|1000|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vfmat.bf16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|11100|Vd'|11|Vn|Vd|1000|Vn'|1|i:1|1|i:1|Vm[2:0]"}
+ ]},
+
+ {"category": "ASIMD", "ext": "BF16", "data": [
+ {"inst": "vmmla.bf16 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|00|Vn|Vd|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vcvtb.bf16.f32 Sd, Dn" , "t32": "1110|11101|'Vd|11|00|11|Vd|10010|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtt.bf16.f32 Sd, Dn" , "t32": "1110|11101|'Vd|11|00|11|Vd|10011|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vdot.bf16 Dd, Dn, Dm" , "t32": "1110|11000|Vd'|00|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vdot.bf16 Vd, Vn, Vm" , "t32": "1110|11000|Vd'|00|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vdot.bf16 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11100|Vd'|00|Vn|Vd|1101|Vn'|0|i:1|0|Vm" , "it": "out"},
+ {"inst": "vdot.bf16 Vd, Vn, Dm<=15[#i]" , "t32": "1110|11100|Vd'|00|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "it": "out"},
+ {"inst": "vfmab.bf16 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|11|Vn|Vd|1000|Vn'|0|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vfmab.bf16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11100|Vd'|11|Vn|Vd|1000|Vn'|0|i:1|1|i:1|Vm[2:0]" , "it": "out"},
+ {"inst": "vfmat.bf16 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|11|Vn|Vd|1000|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vfmat.bf16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11100|Vd'|11|Vn|Vd|1000|Vn'|1|i:1|1|i:1|Vm[2:0]" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "DOTPROD", "data": [
+ {"inst": "vsdot.s8 Dd, Dn, Dm" , "a32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vsdot.s8 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vsdot.s8 Dd, Dn, Dm<=15[#i]" , "a32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|0|i:1|0|Vm"},
+ {"inst": "vsdot.s8 Vd, Vn, Dm<=15[#i]" , "a32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|0|Vm"},
+ {"inst": "vudot.u8 Dd, Dn, Dm" , "a32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|1|Vm"},
+ {"inst": "vudot.u8 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vudot.u8 Dd, Dn, Dm<=15[#i]" , "a32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|0|i:1|1|Vm"},
+ {"inst": "vudot.u8 Vd, Vn, Dm<=15[#i]" , "a32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|1|Vm"}
+ ]},
+
+ {"category": "ASIMD", "ext": "DOTPROD", "data": [
+ {"inst": "vsdot.s8 Dd, Dn, Dm" , "t32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vsdot.s8 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vsdot.s8 Dd, Dn, Dm<=15[#i]" , "t32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|0|i:1|0|Vm" , "it": "out"},
+ {"inst": "vsdot.s8 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "it": "out"},
+ {"inst": "vudot.u8 Dd, Dn, Dm" , "t32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vudot.u8 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vudot.u8 Dd, Dn, Dm<=15[#i]" , "t32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|0|i:1|1|Vm" , "it": "out"},
+ {"inst": "vudot.u8 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11100|Vd'|10|Vn|Vd|1101|Vn'|1|i:1|1|Vm" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FCMA", "data": [
+ {"inst": "vcadd.f32 Dd, Dn, Dm, #rot1" , "a32": "1111|110|imm:1|1|Vd'|01|Vn|Vd|1000|Vn'|0|Vm'|0|Vm" , "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcadd.f32 Vd, Vn, Vm, #rot1" , "a32": "1111|110|imm:1|1|Vd'|01|Vn|Vd|1000|Vn'|1|Vm'|0|Vm" , "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcmla.f32 Dx, Dn, Dm, #rot2" , "a32": "1111|110|imm:2|Vx'|11|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f32 Vx, Vn, Vm, #rot2" , "a32": "1111|110|imm:2|Vx'|11|Vn|Vx|1000|Vn'|1|Vm'|0|Vm" , "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f32 Dx, Dn, Dm[#i], #rot2" , "a32": "1111|1110|1|Vx'|imm:2|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f32 Vx, Vn, Dm[#i], #rot2" , "a32": "1111|1110|1|Vx'|imm:2|Vn|Vx|1000|Vn'|1|Vm'|0|Vm" , "imm": "VecRot2Imm(rot2)"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FCMA", "data": [
+ {"inst": "vcadd.f32 Dd, Dn, Dm, #rot1" , "t32": "1111|110|imm:1|1|Vd'|01|Vn|Vd|1000|Vn'|0|Vm'|0|Vm" , "it": "out", "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcadd.f32 Vd, Vn, Vm, #rot1" , "t32": "1111|110|imm:1|1|Vd'|01|Vn|Vd|1000|Vn'|1|Vm'|0|Vm" , "it": "out", "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcmla.f32 Vx, Vn, Vm, #rot2" , "t32": "1111|110|imm:2|Vx'|11|Vn|Vx|1000|Vn'|1|Vm'|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f32 Vx, Vn, Vm, #rot2" , "t32": "1111|110|imm:2|Vx'|11|Vn|Vx|1000|Vn'|1|Vm'|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f32 Dx, Dn, Dm[#i], #rot2" , "t32": "1111|1110|1|Vx'|imm:2|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f32 Vx, Vn, Dm[#i], #rot2" , "t32": "1111|1110|1|Vx'|imm:2|Vn|Vx|1000|Vn'|1|Vm'|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FCMA FP16", "data": [
+ {"inst": "vcadd.f16 Dd, Dn, Dm, #rot1" , "a32": "1111|110|imm:1|1|Vd'|00|Vn|Vd|1000|Vn'|0|Vm'|0|Vm" , "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcadd.f16 Vd, Vn, Vm, #rot1" , "a32": "1111|110|imm:1|1|Vd'|00|Vn|Vd|1000|Vn'|1|Vm'|0|Vm" , "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcmla.f16 Dx, Dn, Dm, #rot2" , "a32": "1111|110|imm:2|Vx'|10|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f16 Vx, Vn, Vm, #rot2" , "a32": "1111|110|imm:2|Vx'|10|Vn|Vx|1000|Vn'|1|Vm'|0|Vm" , "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f16 Dx, Dn, Dm<=15[#i], #rot2" , "a32": "1111|1110|0|Vx'|imm:2|Vn|Vx|1000|Vn'|0|i:1|0|Vm" , "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f16 Vx, Vn, Dm<=15[#i], #rot2" , "a32": "1111|1110|0|Vx'|imm:2|Vn|Vx|1000|Vn'|1|i:1|0|Vm" , "imm": "VecRot2Imm(rot2)"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FCMA FP16", "data": [
+ {"inst": "vcadd.f16 Dd, Dn, Dm, #rot1" , "t32": "1111|110|imm:1|1|Vd'|00|Vn|Vd|1000|Vn'|0|Vm'|0|Vm" , "it": "out", "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcadd.f16 Vd, Vn, Vm, #rot1" , "t32": "1111|110|imm:1|1|Vd'|00|Vn|Vd|1000|Vn'|1|Vm'|0|Vm" , "it": "out", "imm": "VecRot1Imm(rot1)"},
+ {"inst": "vcmla.f16 Dx, Dn, Dm, #rot2" , "t32": "1111|110|imm:2|Vx'|10|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f16 Dx, Dn, Dm, #rot2" , "t32": "1111|110|imm:2|Vx'|10|Vn|Vx|1000|Vn'|0|Vm'|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f16 Dx, Dn, Dm<=15[#i], #rot2" , "t32": "1111|1110|0|Vx'|imm:2|Vn|Vx|1000|Vn'|0|i:1|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"},
+ {"inst": "vcmla.f16 Vx, Vn, Dm<=15[#i], #rot2" , "t32": "1111|1110|0|Vx'|imm:2|Vn|Vx|1000|Vn'|1|i:1|0|Vm" , "it": "out", "imm": "VecRot2Imm(rot2)"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FHM", "data": [
+ {"inst": "vfmal.f16 Dx, Sn, Sm" , "a32": "1111|11000|Vx'|10|Vn|Vx|1000|'Vn|0|'Vm|1|Vm"},
+ {"inst": "vfmal.f16 Vx, Dn, Dm" , "a32": "1111|11000|Vx'|10|Vn|Vx|1000|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vfmal.f16 Dx, Sn, Sm<=15[#i]" , "a32": "1111|11100|Vx'|00|Vn|Vx|1000|'Vn|0|Vm[0]|1|i:1|Vm[3:1]"},
+ {"inst": "vfmal.f16 Vx, Dn, Dm<=15[#i]" , "a32": "1111|11100|Vx'|00|Vn|Vx|1000|Vn'|1|i:1|1|i:1|Vm:3"},
+ {"inst": "vfmsl.f16 Dx, Sn, Sm" , "a32": "1111|11001|Vx'|10|Vn|Vx|1000|'Vn|0|'Vm|1|Vm"},
+ {"inst": "vfmsl.f16 Vx, Dn, Dm" , "a32": "1111|11001|Vx'|10|Vn|Vx|1000|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vfmsl.f16 Dx, Sn, Sm<=15[#i]" , "a32": "1111|11100|Vx'|01|Vn|Vx|1000|'Vn|0|Vm[0]|1|i:1|Vm[3:1]"},
+ {"inst": "vfmsl.f16 Vx, Dn, Dm<=07[#i]" , "a32": "1111|11100|Vx'|01|Vn|Vx|1000|Vn'|1|i:1|1|i:1|Vm:3"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FHM", "data": [
+ {"inst": "vfmal.f16 Dx, Sn, Sm" , "t32": "1111|11000|Vx'|10|Vn|Vx|1000|'Vn|0|'Vm|1|Vm" , "it": "out"},
+ {"inst": "vfmal.f16 Vx, Dn, Dm" , "t32": "1111|11000|Vx'|10|Vn|Vx|1000|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vfmal.f16 Dx, Sn, Sm<=15[#i]" , "t32": "1111|11100|Vx'|00|Vn|Vx|1000|'Vn|0|Vm[0]|1|i:1|Vm[3:1]" , "it": "out"},
+ {"inst": "vfmal.f16 Vx, Dn, Dm<=15[#i]" , "t32": "1111|11100|Vx'|00|Vn|Vx|1000|Vn'|1|i:1|1|i:1|Vm:3" , "it": "out"},
+ {"inst": "vfmsl.f16 Dx, Sn, Sm" , "t32": "1111|11001|Vx'|10|Vn|Vx|1000|'Vn|0|'Vm|1|Vm" , "it": "out"},
+ {"inst": "vfmsl.f16 Vx, Dn, Dm" , "t32": "1111|11001|Vx'|10|Vn|Vx|1000|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vfmsl.f16 Dx, Sn, Sm<=15[#i]" , "t32": "1111|11100|Vx'|01|Vn|Vx|1000|'Vn|0|Vm[0]|1|i:1|Vm[3:1]" , "it": "out"},
+ {"inst": "vfmsl.f16 Vx, Dn, Dm<=07[#i]" , "t32": "1111|11100|Vx'|01|Vn|Vx|1000|Vn'|1|i:1|1|i:1|Vm:3" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FP16CONV", "data": [
+ {"inst": "vcvt.f16.f32 Dd, Vn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01100|0|Vn'|0|Vn"},
+ {"inst": "vcvt.f32.f16 Vd, Dn" , "a32": "1111|00111|Vd'|11|01|10|Vd|01110|0|Vn'|0|Vn"},
+ {"inst": "vcvt.f16.s16 Dd, Dn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11000|0|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f16.s16 Vd, Vn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11000|1|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s16.f16 Dd, Dn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11010|0|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s16.f16 Vd, Vn, #fbits" , "a32": "1111|00101|Vd'|imm:6|Vd|11010|1|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f16.u16 Dd, Dn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11000|0|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f16.u16 Vd, Vn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11000|1|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u16.f16 Dd, Dn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11010|0|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u16.f16 Vd, Vn, #fbits" , "a32": "1111|00111|Vd'|imm:6|Vd|11010|1|Vn'|1|Vn" , "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvta.s32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|00|Vd|10011|1|'Vn|0|Vn"},
+ {"inst": "vcvta.u32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|00|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtb.f32.f16 Sd, Sn" , "a32": "cond|11101|'Vd|11|00|10|Vd|10100|1|'Vn|0|Vn"},
+ {"inst": "vcvtb.f16.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|00|11|Vd|10100|1|'Vn|0|Vn"},
+ {"inst": "vcvtb.f64.f16 Dd, Sn" , "a32": "cond|11101|Vd'|11|00|10|Vd|10110|1|'Vn|0|Vn"},
+ {"inst": "vcvtb.f16.f64 Sd, Dn" , "a32": "cond|11101|'Vd|11|00|11|Vd|10110|1|Vn'|0|Vn"},
+ {"inst": "vcvtm.s16.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00110|0|Vn'|0|Vn"},
+ {"inst": "vcvtm.s16.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00110|1|Vn'|0|Vn"},
+ {"inst": "vcvtm.u16.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00111|0|Vn'|0|Vn"},
+ {"inst": "vcvtm.u16.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00111|1|Vn'|0|Vn"},
+ {"inst": "vcvtm.s32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|11|Vd|10011|1|'Vn|0|Vn"},
+ {"inst": "vcvtm.u32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|11|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtn.s16.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00010|0|Vn'|0|Vn"},
+ {"inst": "vcvtn.s16.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00010|1|Vn'|0|Vn"},
+ {"inst": "vcvtn.u16.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00011|0|Vn'|0|Vn"},
+ {"inst": "vcvtn.u16.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00011|1|Vn'|0|Vn"},
+ {"inst": "vcvtn.s32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|01|Vd|10011|1|'Vn|0|Vn"},
+ {"inst": "vcvtn.u32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|01|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtp.s16.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00100|0|Vn'|0|Vn"},
+ {"inst": "vcvtp.s16.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00100|1|Vn'|0|Vn"},
+ {"inst": "vcvtp.u16.f16 Dd, Dn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00101|0|Vn'|0|Vn"},
+ {"inst": "vcvtp.u16.f16 Vd, Vn" , "a32": "1111|00111|Vd'|11|01|11|Vd|00101|1|Vn'|0|Vn"},
+ {"inst": "vcvtp.s32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|10|Vd|10011|1|'Vn|0|Vn"},
+ {"inst": "vcvtp.u32.f16 Sd, Sn" , "a32": "1111|11101|'Vd|11|11|10|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtr.s32.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|11|01|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtr.u32.f16 Sd, Sn" , "a32": "1110|11101|'Vd|11|11|00|Vd|10010|1|'Vn|0|Vn"},
+ {"inst": "vcvtt.f32.f16 Sd, Sn" , "a32": "cond|11101|'Vd|11|00|10|Vd|10101|1|'Vn|0|Vn"},
+ {"inst": "vcvtt.f16.f32 Sd, Sn" , "a32": "cond|11101|'Vd|11|00|11|Vd|10101|1|'Vn|0|Vn"},
+ {"inst": "vcvtt.f64.f16 Dd, Sn" , "a32": "cond|11101|Vd'|11|00|10|Vd|10111|1|'Vn|0|Vn"},
+ {"inst": "vcvtt.f16.f64 Sd, Dn" , "a32": "cond|11101|'Vd|11|00|11|Vd|10111|1|Vn'|0|Vn"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FP16CONV", "data": [
+ {"inst": "vcvt.f16.f32 Dd, Vn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01100|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvt.f32.f16 Vd, Dn" , "t32": "1111|11111|Vd'|11|01|10|Vd|01110|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvt.f16.s16 Dd, Dn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11000|0|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f16.s16 Vd, Vn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11000|1|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s16.f16 Dd, Dn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11010|0|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.s16.f16 Vd, Vn, #fbits" , "t32": "1110|11111|Vd'|imm:6|Vd|11010|1|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f16.u16 Dd, Dn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11000|0|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.f16.u16 Vd, Vn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11000|1|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u16.f16 Dd, Dn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11010|0|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvt.u16.f16 Vd, Vn, #fbits" , "t32": "1111|11111|Vd'|imm:6|Vd|11010|1|Vn'|1|Vn" , "it": "out", "imm": "VecFBitsASIMD(fbits)"},
+ {"inst": "vcvta.s32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|00|Vd|10011|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvta.u32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|00|Vd|10010|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtb.f32.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|00|10|Vd|10100|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtb.f16.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|00|11|Vd|10100|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtb.f64.f16 Dd, Sn" , "t32": "1110|11101|Vd'|11|00|10|Vd|10110|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtb.f16.f64 Sd, Dn" , "t32": "1110|11101|'Vd|11|00|11|Vd|10110|1|Vn'|0|Vn" , "it": "any"},
+ {"inst": "vcvtm.s16.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00110|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtm.s16.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00110|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtm.u16.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00111|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtm.u16.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00111|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtm.s32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|11|Vd|10011|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtm.u32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|11|Vd|10010|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtn.s16.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00010|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtn.s16.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00010|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtn.u16.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00011|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtn.u16.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00011|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtn.s32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|01|Vd|10011|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtn.u32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|01|Vd|10010|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtp.s16.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00100|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtp.s16.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00100|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtp.u16.f16 Dd, Dn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00101|0|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtp.u16.f16 Vd, Vn" , "t32": "1111|11111|Vd'|11|01|11|Vd|00101|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "vcvtp.s32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|10|Vd|10011|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtp.u32.f16 Sd, Sn" , "t32": "1111|11101|'Vd|11|11|10|Vd|10010|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtr.s32.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|11|01|Vd|10010|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtr.u32.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|11|00|Vd|10010|1|'Vn|0|Vn" , "it": "out"},
+ {"inst": "vcvtt.f32.f16 Sd, Sn" , "t32": "1110|11101|'Vd|11|00|10|Vd|10101|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtt.f16.f32 Sd, Sn" , "t32": "1110|11101|'Vd|11|00|11|Vd|10101|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtt.f64.f16 Dd, Sn" , "t32": "1110|11101|Vd'|11|00|10|Vd|10111|1|'Vn|0|Vn" , "it": "any"},
+ {"inst": "vcvtt.f16.f64 Sd, Dn" , "t32": "1110|11101|'Vd|11|00|11|Vd|10111|1|Vn'|0|Vn" , "it": "any"}
+ ]},
+
+ {"category": "ASIMD", "ext": "I8MM", "data": [
+ {"inst": "vsmmla.s8 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|10|Vn|Vd|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vsudot.u8 Dd, Dn, Dm<=15[#i]" , "a32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|0|i:1|1|Vm"},
+ {"inst": "vsudot.u8 Vd, Vn, Dm<=15[#i]" , "a32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|1|i:1|1|Vm"},
+ {"inst": "vummla.u8 Vd, Vn, Vm" , "a32": "1111|11000|Vd'|10|Vn|Vd|1100|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vusdot.s8 Dd, Dn, Dm" , "a32": "1111|11001|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|0|Vm"},
+ {"inst": "vusdot.s8 Vd, Vn, Vm" , "a32": "1111|11001|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|0|Vm"},
+ {"inst": "vusdot.s8 Dd, Dn, Dm<=15[#i]" , "a32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|0|i:1|0|Vm"},
+ {"inst": "vusdot.s8 Vd, Vn, Dm<=15[#i]" , "a32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|1|i:1|0|Vm"},
+ {"inst": "vusmmla.s8 Vd, Vn, Vm" , "a32": "1111|11001|Vd'|10|Vn|Vd|1100|Vn'|1|Vm'|0|Vm"}
+ ]},
+
+ {"category": "ASIMD", "ext": "I8MM", "data": [
+ {"inst": "vsmmla.s8 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|10|Vn|Vd|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vsudot.u8 Dd, Dn, Dm<=15[#i]" , "t32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|0|i:1|1|Vm" , "it": "out"},
+ {"inst": "vsudot.u8 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|1|i:1|1|Vm" , "it": "out"},
+ {"inst": "vummla.u8 Vd, Vn, Vm" , "t32": "1111|11000|Vd'|10|Vn|Vd|1100|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vusdot.s8 Dd, Dn, Dm" , "t32": "1111|11001|Vd'|10|Vn|Vd|1101|Vn'|0|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vusdot.s8 Vd, Vn, Vm" , "t32": "1111|11001|Vd'|10|Vn|Vd|1101|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "vusdot.s8 Dd, Dn, Dm<=15[#i]" , "t32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|0|i:1|0|Vm" , "it": "out"},
+ {"inst": "vusdot.s8 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11101|Vd'|00|Vn|Vd|1101|Vn'|1|i:1|0|Vm" , "it": "out"},
+ {"inst": "vusmmla.s8 Vd, Vn, Vm" , "t32": "1111|11001|Vd'|10|Vn|Vd|1100|Vn'|1|Vm'|0|Vm" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "JSCVT", "data": [
+ {"inst": "vjcvt.s32.f64 Sd, Dn" , "a32": "1110|11101|'Vd|11|1001|Vd|1011|11|Vn'|0|Vn"}
+ ]},
+
+ {"category": "ASIMD", "ext": "JSCVT", "data": [
+ {"inst": "vjcvt.s32.f64 Sd, Dn" , "t32": "1110|11101|'Vd|11|1001|Vd|1011|11|Vn'|0|Vn" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD", "ext": "RDM", "data": [
+ {"inst": "vqrdmlah.s16-32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1011|Vn'|0|Vm'|1|Vm"},
+ {"inst": "vqrdmlah.s16-32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1011|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vqrdmlah.s16 Dd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|i:1|Vm:3"},
+ {"inst": "vqrdmlah.s16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|i:1|Vm:3"},
+ {"inst": "vqrdmlah.s32 Dd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|Vm"},
+ {"inst": "vqrdmlah.s32 Vd, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|Vm"},
+ {"inst": "vqrdmlsh.s16-32 Dd, Dn, Dm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1100|Vn'|0|Vm'|1|Vm"},
+ {"inst": "vqrdmlsh.s16-32 Vd, Vn, Vm" , "a32": "1111|00110|Vd'|sz|Vn|Vd|1100|Vn'|1|Vm'|1|Vm"},
+ {"inst": "vqrdmlsh.s16 Dd, Dn, Dm<=07[#i]" , "a32": "1111|00101|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|i:1|Vm:3"},
+ {"inst": "vqrdmlsh.s16 Vd, Vn, Dm<=07[#i]" , "a32": "1111|00111|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|i:1|Vm:3"},
+ {"inst": "vqrdmlsh.s32 Dd, Dn, Dm<=15[#i]" , "a32": "1111|00101|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|Vm"},
+ {"inst": "vqrdmlsh.s32 Vd, Vn, Dm<=15[#i]" , "a32": "1111|00111|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|Vm"}
+ ]},
+
+ {"category": "ASIMD", "ext": "RDM", "data": [
+ {"inst": "vqrdmlah.s16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1011|Vn'|0|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vqrdmlah.s16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1011|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vqrdmlah.s16 Dd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|i:1|Vm:3" , "it": "out"},
+ {"inst": "vqrdmlah.s16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|i:1|Vm:3" , "it": "out"},
+ {"inst": "vqrdmlah.s32 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|Vm" , "it": "out"},
+ {"inst": "vqrdmlah.s32 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vd'|sz|Vn|Vd|1110|Vn'|1|i:1|0|Vm" , "it": "out"},
+ {"inst": "vqrdmlsh.s16-32 Dd, Dn, Dm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1100|Vn'|0|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vqrdmlsh.s16-32 Vd, Vn, Vm" , "t32": "1111|11110|Vd'|sz|Vn|Vd|1100|Vn'|1|Vm'|1|Vm" , "it": "out"},
+ {"inst": "vqrdmlsh.s16 Dd, Dn, Dm<=07[#i]" , "t32": "1110|11111|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|i:1|Vm:3" , "it": "out"},
+ {"inst": "vqrdmlsh.s16 Vd, Vn, Dm<=07[#i]" , "t32": "1111|11111|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|i:1|Vm:3" , "it": "out"},
+ {"inst": "vqrdmlsh.s32 Dd, Dn, Dm<=15[#i]" , "t32": "1110|11111|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|Vm" , "it": "out"},
+ {"inst": "vqrdmlsh.s32 Vd, Vn, Dm<=15[#i]" , "t32": "1111|11111|Vd'|sz|Vn|Vd|1111|Vn'|1|i:1|0|Vm" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA1", "data": [
+ {"inst": "sha1c.32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|00|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "sha1h.32 Vd, Vn" , "a32": "1111|00111|Vd'|11|1001|Vd|0|0101|1|Vn'|0|Vn"},
+ {"inst": "sha1m.32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|10|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "sha1p.32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|01|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "sha1su0.32 Vx, Vn, Vm" , "a32": "1111|00100|Vx'|11|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "sha1su1.32 Vx, Vn" , "a32": "1111|00111|Vx'|11|1010|Vx|0|0111|0|Vn'|0|Vn"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA1", "data": [
+ {"inst": "sha1c.32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|00|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "sha1h.32 Vd, Vn" , "t32": "1111|11111|Vd'|11|1001|Vd|0|0101|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "sha1m.32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|10|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "sha1p.32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|01|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "sha1su0.32 Vx, Vn, Vm" , "t32": "1110|11110|Vx'|11|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "sha1su1.32 Vx, Vn" , "t32": "1111|11111|Vx'|11|1010|Vx|0|0111|0|Vn'|0|Vn" , "it": "out"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA256", "data": [
+ {"inst": "sha256h.32 Vx, Vn, Vm" , "a32": "1111|00110|Vx'|00|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "sha256h2.32 Vx, Vn, Vm" , "a32": "1111|00110|Vx'|01|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"},
+ {"inst": "sha256su0.32 Vx, Vn" , "a32": "1111|00111|Vx'|11|1010|Vx|0|0111|1|Vn'|0|Vn"},
+ {"inst": "sha256su1.32 Vx, Vn, Vm" , "a32": "1111|00110|Vx'|10|Vn|Vx|1100|Vn'|1|Vm'|0|Vm"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA256", "data": [
+ {"inst": "sha256h.32 Vx, Vn, Vm" , "t32": "1111|11110|Vx'|00|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "sha256h2.32 Vx, Vn, Vm" , "t32": "1111|11110|Vx'|01|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"},
+ {"inst": "sha256su0.32 Vx, Vn" , "t32": "1111|11111|Vx'|11|1010|Vx|0|0111|1|Vn'|0|Vn" , "it": "out"},
+ {"inst": "sha256su1.32 Vx, Vn, Vm" , "t32": "1111|11110|Vx'|10|Vn|Vx|1100|Vn'|1|Vm'|0|Vm" , "it": "out"}
+ ]}
+ ]
+}
diff --git a/3rdparty/asmjit/db/isa_aarch64.json b/3rdparty/asmjit/db/isa_aarch64.json
new file mode 100644
index 00000000000..740085101e4
--- /dev/null
+++ b/3rdparty/asmjit/db/isa_aarch64.json
@@ -0,0 +1,3820 @@
+{
+ "registers": {
+ "r": {"kind": "gp" , "any": "r", "names": ["r0-31"]},
+ "b": {"kind": "vec", "any": "b", "names": ["b0-31"]},
+ "h": {"kind": "vec", "any": "h", "names": ["h0-31"]},
+ "s": {"kind": "vec", "any": "s", "names": ["s0-31"]},
+ "d": {"kind": "vec", "any": "d", "names": ["d0-31"]},
+ "v": {"kind": "vec", "any": "v", "names": ["v0-31"]}
+ },
+
+ "instructions": [
+ {"category": "GP", "data": [
+ {"inst": "adc Wd, Wn, Wm" , "op": "00011010|000|Rm|000000|Rn|Rd" , "io": "C=R"},
+ {"inst": "adc Xd, Xn, Xm" , "op": "10011010|000|Rm|000000|Rn|Rd" , "io": "C=R"},
+ {"inst": "adcs Wd, Wn, Wm" , "op": "00111010|000|Rm|000000|Rn|Rd" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "adcs Xd, Xn, Xm" , "op": "10111010|000|Rm|000000|Rn|Rd" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "add Wd, Wn, Wm, {lsl|lsr|asr #n}" , "op": "00001011|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "add Xd, Xn, Xm, {lsl|lsr|asr #n}" , "op": "10001011|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "add Wd|WSP, Wn|WSP, Wm, {extend #n}" , "op": "00001011|001|Rm|option:3|n:3|Rn|Rd"},
+ {"inst": "add Xd|SP, Xn|SP, Rm, {extend #n}" , "op": "10001011|001|Rm|option:3|n:3|Rn|Rd"},
+ {"inst": "add Wd|WSP, Wn|WSP, #immZ, {lsl #n=0|12}" , "op": "00010001|0|n:1|immZ:12|Rn|Rd"},
+ {"inst": "add Xd|SP, Xn|SP, #immZ, {lsl #n=0|12}" , "op": "10010001|0|n:1|immZ:12|Rn|Rd"},
+ {"inst": "adds Wd, Wn, Wm, {lsl|lsr|asr #n}" , "op": "00101011|sop:2|0|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adds Xd, Xn, Xm, {lsl|lsr|asr #n}" , "op": "10101011|sop:2|0|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adds Wd, Wn|WSP, Wm, {extend #n}" , "op": "00101011|001|Rm|option:3|n:3|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adds Xd, Xn|SP, Rm, {extend #n}" , "op": "10101011|001|Rm|option:3|n:3|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adds Wd|WSP, Wn|WSP, #immZ, {lsl #n=0|12}" , "op": "00110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adds Xd|SP, Xn|SP, #immZ, {lsl #n=0|12}" , "op": "10110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "adr Xd, #relS" , "op": "0|relS[1:0]|10000|relS[20:2]|Rd"},
+ {"inst": "adrp Xd, #relS" , "op": "1|relS[1:0]|10000|relS[20:2]|Rd"},
+ {"inst": "and Wd|WSP, Wn, Wm, {sop #n}" , "op": "00001010|sop|0|Rm|n:6|Rn|Rd" , "imm": "ShiftImm(n, x)"},
+ {"inst": "and Xd|SP, Xn, Xm, {sop #n}" , "op": "10001010|sop|0|Rm|n:6|Rn|Rd" , "imm": "ShiftImm(n, x)"},
+ {"inst": "and Wd|WSP, Wn, #imm" , "op": "00010010|0|imm:13|Rn|Rd" , "imm": "LogicalImm(imm, 0)"},
+ {"inst": "and Xd|SP, Xn, #imm" , "op": "10010010|0|imm:13|Rn|Rd" , "imm": "LogicalImm(imm, 1)"},
+ {"inst": "ands Wd|WSP, Wn, Wm, {sop #n}" , "op": "01101010|sop|0|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W", "imm": "ShiftImm(n, x)"},
+ {"inst": "ands Xd|SP, Xn, Xm, {sop #n}" , "op": "11101010|sop|0|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W", "imm": "ShiftImm(n, x)"},
+ {"inst": "ands Wd|WSP, Wn, #imm" , "op": "01110010|0|imm:13|Rn|Rd" , "io": "N=W Z=W C=W V=W", "imm": "LogicalImm(imm, 0)"},
+ {"inst": "ands Xd|SP, Xn, #imm" , "op": "11110010|0|imm:13|Rn|Rd" , "io": "N=W Z=W C=W V=W", "imm": "LogicalImm(imm, 1)"},
+ {"inst": "asr|asrv Wd, Wn, Wm" , "op": "00011010|110|Rm|001010|Rn|Rd"},
+ {"inst": "asr|asrv Xd, Xn, Xm" , "op": "10011010|110|Rm|001010|Rn|Rd"},
+ {"inst": "asr Wd, Wn, #n" , "op": "00010011|00|immr:6|011111|Rn|Rd"},
+ {"inst": "asr Xd, Xn, #n" , "op": "10010011|01|immr:6|111111|Rn|Rd"},
+ {"inst": "at #at_op, Xt" , "op": "11010101|00001|op1:3|0111|CRm|op2:3|Rt" , "imm": "ImmAt(at_op)"},
+ {"inst": "b #relS*4" , "op": "000101|relS:26" , "control": "jump"},
+ {"inst": "b.<cond> #relS*4" , "op": "01010100|relS:19|0|cond" , "control": "branch", "io": "N=R Z=R C=R V=R"},
+ {"inst": "bfc Wd, #lsb, #width" , "op": "00110011|00|immr:6|imms:6|11111|Rd"},
+ {"inst": "bfc Xd, #lsb, #width" , "op": "10110011|01|immr:6|imms:6|11111|Rd"},
+ {"inst": "bfi Wd, Wn, #lsb, #width" , "op": "00110011|00|immr:6|imms:6|Rn|Rd"},
+ {"inst": "bfi Xd, Xn, #lsb, #width" , "op": "10110011|01|immr:6|imms:6|Rn|Rd"},
+ {"inst": "bfm Wd, Wn, #immr, #imms" , "op": "00110011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFM(immr, imms)"},
+ {"inst": "bfm Xd, Xn, #immr, #imms" , "op": "10110011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFM(immr, imms)"},
+ {"inst": "bfxil Wd, Wn, #lsb, #width" , "op": "00110011|00|immr:6|imms:6|Rn|Rd"},
+ {"inst": "bfxil Xd, Xn, #lsb, #width" , "op": "10110011|01|immr:6|imms:6|Rn|Rd"},
+ {"inst": "bic Wd, Wn, Wm, {sop #n}" , "op": "00001010|sop:2|1|Rm|n:6|Rn|Rd"},
+ {"inst": "bic Xd, Xn, Xm, {sop #n}" , "op": "10001010|sop:2|1|Rm|n:6|Rn|Rd"},
+ {"inst": "bics Wd, Wn, Wm, {sop #n}" , "op": "01101010|sop:2|1|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "bics Xd, Xn, Xm, {sop #n}" , "op": "11101010|sop:2|1|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "bl #relS*4" , "op": "100101|relS:26" , "control": "call"},
+ {"inst": "blr Xn" , "op": "11010110|001|11111000000|Rn|00000" , "control": "call"},
+ {"inst": "br Xn" , "op": "11010110|000|11111000000|Rn|00000" , "control": "jump"},
+ {"inst": "brk #imm" , "op": "11010100|001|imm:16|00000"},
+ {"inst": "cbnz Wn, #relS*4" , "op": "00110101|relS:19|Rn" , "control": "branch"},
+ {"inst": "cbnz Xn, #relS*4" , "op": "10110101|relS:19|Rn" , "control": "branch"},
+ {"inst": "cbz Wn, #relS*4" , "op": "00110101|relS:19|Rn" , "control": "branch"},
+ {"inst": "cbz Xn, #relS*4" , "op": "10110101|relS:19|Rn" , "control": "branch"},
+ {"inst": "ccmn Wn, Wm, #nzcv, #cond" , "op": "00111010|010|Rm|cond|00|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmn Xn, Xm, #nzcv, #cond" , "op": "10111010|010|Rm|cond|00|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmn Wn, #imm, #nzcv, #cond" , "op": "00111010|010|imm:5|cond|10|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmn Xn, #imm, #nzcv, #cond" , "op": "10111010|010|imm:5|cond|10|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmp Wn, Wm, #nzcv, #cond" , "op": "01111010|010|Rm|cond|00|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmp Xn, Xm, #nzcv, #cond" , "op": "11111010|010|Rm|cond|00|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmp Wn, #imm, #nzcv, #cond" , "op": "01111010|010|imm:5|cond|10|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ccmp Xn, #imm, #nzcv, #cond" , "op": "11111010|010|imm:5|cond|10|Rn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cinc Wd, Wn, #cond" , "op": "00011010|100|Rn|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "cinc Xd, Xn, #cond" , "op": "10011010|100|Rn|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "cinv Wd, Wn, #cond" , "op": "01011010|100|Rn|cond|00|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "cinv Xd, Xn, #cond" , "op": "11011010|100|Rn|cond|00|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "clrex {#imm=15}" , "op": "11010101|000|00011|0011|CRm|010|11111" , "CRm": "imm"},
+ {"inst": "cls Wd, Wn" , "op": "01011010|110|00000000101|Rn|Rd"},
+ {"inst": "cls Xd, Xn" , "op": "11011010|110|00000000101|Rn|Rd"},
+ {"inst": "clz Wd, Wn" , "op": "01011010|110|00000000100|Rn|Rd"},
+ {"inst": "clz Xd, Xn" , "op": "11011010|110|00000000100|Rn|Rd"},
+ {"inst": "cmn Wn|WSP, #imm, {lsl #n=0|12}" , "op": "00110001|0|n:1|imm:12|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Xn|SP, #imm, {lsl #n=0|12}" , "op": "10110001|0|n:1|imm:12|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Wn|WSP, Wm, {extend #n}" , "op": "00101011|001|Rm|option:3|n:3|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Xn|SP, Rm, {extend #n}" , "op": "10101011|001|Rm|option:3|n:3|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Wn, Wm, {lsl|lsr|asr #n}" , "op": "00101011|sop:2|0|Rm|n:6|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmn Xn, Xm, {lsl|lsr|asr #n}" , "op": "10101011|sop:2|0|Rm|n:6|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Wn, Wm, {lsl|lsr|asr #n}" , "op": "01101011|sop:2|0|Rm|n:6|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Xn, Xm, {lsl|lsr|asr #n}" , "op": "11101011|sop:2|0|Rm|n:6|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Wn|WSP, Wm, {extend #n}" , "op": "01101011|001|Rm|option:3|n:3|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Xn|SP, Rm, {extend #n}" , "op": "11101011|001|Rm|option:3|n:3|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Wn|WSP, #imm, {lsl #n=0|12}" , "op": "01110001|0|n:1|imm:12|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmp Xn|SP, #imm, {lsl #n=0|12}" , "op": "11110001|0|n:1|imm:12|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cneg Wd, Wn, #cond" , "op": "01011010|100|Rn|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "cneg Xd, Xn, #cond" , "op": "11011010|100|Rn|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csdb" , "op": "11010101|00|000|011|0010|0010|100|11111"},
+ {"inst": "csel Wd, Wn, Wm, #cond" , "op": "00011010|100|Rm|cond|00|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csel Xd, Xn, Xm, #cond" , "op": "10011010|100|Rm|cond|00|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "cset Wd, #cond" , "op": "00011010|100|11111|cond|01|11111|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "cset Xd, #cond" , "op": "10011010|100|11111|cond|01|11111|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csetm Wd, #cond" , "op": "01011010|100|11111|cond|00|11111|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csetm Xd, #cond" , "op": "11011010|100|11111|cond|00|11111|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csinc Wd, Wn, Wm, #cond" , "op": "00011010|100|Rm|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csinc Xd, Xn, Xm, #cond" , "op": "10011010|100|Rm|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csinv Wd, Wn, Wm, #cond" , "op": "01011010|100|Rm|cond|00|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csinv Xd, Xn, Xm, #cond" , "op": "11011010|100|Rm|cond|00|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csneg Wd, Wn, Wm, #cond" , "op": "01011010|100|Rm|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "csneg Xd, Xn, Xm, #cond" , "op": "11011010|100|Rm|cond|01|Rn|Rd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "dc #dc_op, Xt" , "op": "11010101|000|01|op1:3|0111|CRm|op2:3|Rt" , "imm": "ImmDC(dc_op)"},
+ {"inst": "dcps1 {#imm}" , "op": "11010100|101|imm:16|00001"},
+ {"inst": "dcps2 {#imm}" , "op": "11010100|101|imm:16|00010"},
+ {"inst": "dcps3 {#imm}" , "op": "11010100|101|imm:16|00011"},
+ {"inst": "dmb #barrier_op" , "op": "11010101|000|00|011|0011|CRm|101|11111" , "imm": "ImmDataBarrier(barrier_op)"},
+ {"inst": "drps" , "op": "11010110|101|11111|00000|01111|1|00000"},
+ {"inst": "dsb #barrier_op" , "op": "11010101|000|00|011|0011|CRm|101|11111" , "imm": "ImmDataBarrier(barrier_op)", "ext": "XS"},
+ {"inst": "eon Wd, Wn, Wm, {sop #n}" , "op": "01001010|sop:2|1|Rm|n:6|Rn|Rd"},
+ {"inst": "eon Xd, Xn, Xm, {sop #n}" , "op": "11001010|sop:2|1|Rm|n:6|Rn|Rd"},
+ {"inst": "eor Wd, Wn, Wm, {sop #n}" , "op": "01001010|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "eor Xd, Xn, Xm, {sop #n}" , "op": "11001010|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "eor Wd|WSP, Wn, #imm" , "op": "01010010|0|imm:13|Rn|Rd" , "imm": "LogicalImm(imm, 0)"},
+ {"inst": "eor Xd|SP, Xn, #imm" , "op": "11010010|0|imm:13|Rn|Rd" , "imm": "LogicalImm(imm, 1)"},
+ {"inst": "eret" , "op": "11010110|100|11111|0000|00|11111|00000"},
+ {"inst": "extr Wd, Wn, Wm, #imm" , "op": "00010011|100|Rm|0|imm:5|Rn|Rd"},
+ {"inst": "extr Xd, Xn, Xm, #imm" , "op": "10010011|110|Rm|imm:6|Rn|Rd"},
+ {"inst": "hint #imm" , "op": "11010101|000|00|011|0010|imm:7|11111"},
+ {"inst": "hlt #imm" , "op": "11010100|010|imm:16|00000"},
+ {"inst": "hvc #imm" , "op": "11010100|000|imm:16|00010"},
+ {"inst": "ic #ic_op" , "op": "11010101|000|01|op1:3|0111|CRm|op2:3|11111" , "imm": "ImmIC(ic_op)"},
+ {"inst": "ic #ic_op, Xt" , "op": "11010101|000|01|op1:3|0111|CRm|op2:3|Rt" , "imm": "ImmIC(ic_op)"},
+ {"inst": "isb {#isb_op=15}" , "op": "11010101|000|00|011|0011|CRm|110|11111" , "imm": "ImmISB(isb_op)"},
+ {"inst": "ldar Wd, [Xn|SP]" , "op": "10001000|110|11111|1|11111|Rn|Rd"},
+ {"inst": "ldar Xd, [Xn|SP]" , "op": "11001000|110|11111|1|11111|Rn|Rd"},
+ {"inst": "ldarb Wd, [Xn|SP]" , "op": "00001000|110|11111|1|11111|Rn|Rd"},
+ {"inst": "ldarh Wd, [Xn|SP]" , "op": "01001000|110|11111|1|11111|Rn|Rd"},
+ {"inst": "ldaxp Wd, Wd2, [Xn|SP]" , "op": "10001000|011|11111|1|Rd2|Rn|Rd"},
+ {"inst": "ldaxp Xd, Xd2, [Xn|SP]" , "op": "11001000|011|11111|1|Rd2|Rn|Rd"},
+ {"inst": "ldaxr Wd, [Xn|SP]" , "op": "10001000|010|11111|1|11111|Rn|Rd"},
+ {"inst": "ldaxr Xd, [Xn|SP]" , "op": "11001000|010|11111|1|11111|Rn|Rd"},
+ {"inst": "ldaxrb Wd, [Xn|SP]" , "op": "00001000|010|11111|1|11111|Rn|Rd"},
+ {"inst": "ldaxrh Xd, [Xn|SP]" , "op": "01001000|010|11111|1|11111|Rn|Rd"},
+ {"inst": "ldnp Wd, Wd2, [Xn|SP, #offS*4]" , "op": "00101000|01|offS:7|Rd2|Rn|Rd"},
+ {"inst": "ldnp Xd, Xd2, [Xn|SP, #offS*8]" , "op": "10101000|01|offS:7|Rd2|Rn|Rd"},
+ {"inst": "ldp Wd, Wd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010100|!post|W|1|offS:7|Rd2|Rn|Rd"},
+ {"inst": "ldp Xd, Xd2, [Xn|SP, #offS*8]{@}{!}" , "op": "1010100|!post|W|1|offS:7|Rd2|Rn|Rd"},
+ {"inst": "ldpsw Xd, Xd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0110100|!post|W|1|offS:7|Rd2|Rn|Rd"},
+ {"inst": "ldr Wd, [Xn|SP, #offZ*4]" , "op": "10111001|01|offZ:12|Rn|Rd"},
+ {"inst": "ldr Xd, [Xn|SP, #offZ*8]" , "op": "11111001|01|offZ:12|Rn|Rd"},
+ {"inst": "ldr Wd, [Xn|SP, #offS*4]@" , "op": "10111000|010|offS:9|01|Rn|Rd"},
+ {"inst": "ldr Xd, [Xn|SP, #offS*8]@" , "op": "11111000|010|offS:9|01|Rn|Rd"},
+ {"inst": "ldr Wd, [Xn|SP, #offS*4]!" , "op": "10111000|010|offS:9|11|Rn|Rd"},
+ {"inst": "ldr Xd, [Xn|SP, #offS*8]!" , "op": "11111000|010|offS:9|11|Rn|Rd"},
+ {"inst": "ldr Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDR(iop, n)"},
+ {"inst": "ldr Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "11111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDR(iop, n)"},
+ {"inst": "ldr Wd, [PC, #offS*4]" , "op": "00011000|offS:19|Rd"},
+ {"inst": "ldr Xd, [PC, #offS*4]" , "op": "01011000|offS:19|Rd"},
+ {"inst": "ldrb Wd, [Xn|SP, #offZ]" , "op": "00111001|01|offZ:12|Rn|Rd"},
+ {"inst": "ldrb Wd, [Xn|SP, #offS]@" , "op": "00111000|010|offS:9|01|Rn|Rd"},
+ {"inst": "ldrb Wd, [Xn|SP, #offS]!" , "op": "00111000|010|offS:9|11|Rn|Rd"},
+ {"inst": "ldrb Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
+ {"inst": "ldrh Wd, [Xn|SP, #offZ*2]" , "op": "01111001|01|offZ:12|Rn|Rd"},
+ {"inst": "ldrh Wd, [Xn|SP, #offS*2]@" , "op": "01111000|010|offS:9|01|Rn|Rd"},
+ {"inst": "ldrh Wd, [Xn|SP, #offS*2]!" , "op": "01111000|010|offS:9|11|Rn|Rd"},
+ {"inst": "ldrh Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|011|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
+ {"inst": "ldrsb Wd, [Xn|SP, #offZ]" , "op": "00111001|11|offZ:12|Rn|Rd"},
+ {"inst": "ldrsb Xd, [Xn|SP, #offZ]" , "op": "00111001|10|offZ:12|Rn|Rd"},
+ {"inst": "ldrsb Wd, [Xn|SP, #offS]@" , "op": "00111000|110|offS:9|01|Rn|Rd"},
+ {"inst": "ldrsb Xd, [Xn|SP, #offS]@" , "op": "00111000|100|offS:9|01|Rn|Rd"},
+ {"inst": "ldrsb Wd, [Xn|SP, #offS]!" , "op": "00111000|110|offS:9|11|Rn|Rd"},
+ {"inst": "ldrsb Xd, [Xn|SP, #offS]!" , "op": "00111000|100|offS:9|11|Rn|Rd"},
+ {"inst": "ldrsb Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|111|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
+ {"inst": "ldrsb Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRB(iop, n)"},
+ {"inst": "ldrsh Wd, [Xn|SP, #offZ*2]" , "op": "01111001|11|offZ:12|Rn|Rd"},
+ {"inst": "ldrsh Xd, [Xn|SP, #offZ*2]" , "op": "01111001|10|offZ:12|Rn|Rd"},
+ {"inst": "ldrsh Wd, [Xn|SP, #offS*2]@" , "op": "01111000|110|offS:9|01|Rn|Rd"},
+ {"inst": "ldrsh Xd, [Xn|SP, #offS*2]@" , "op": "01111000|100|offS:9|01|Rn|Rd"},
+ {"inst": "ldrsh Wd, [Xn|SP, #offS*2]!" , "op": "01111000|110|offS:9|11|Rn|Rd"},
+ {"inst": "ldrsh Xd, [Xn|SP, #offS*2]!" , "op": "01111000|100|offS:9|11|Rn|Rd"},
+ {"inst": "ldrsh Wd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|111|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
+ {"inst": "ldrsh Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRH(iop, n)"},
+ {"inst": "ldrsw Xd, [Xn|SP, #offZ*4]" , "op": "10111001|10|offZ:12|Rn|Rd"},
+ {"inst": "ldrsw Xd, [Xn|SP, #offS*4]@" , "op": "10111000|100|offS:9|01|Rn|Rd"},
+ {"inst": "ldrsw Xd, [Xn|SP, #offS*4]!" , "op": "10111000|100|offS:9|11|Rn|Rd"},
+ {"inst": "ldrsw Xd, [PC, #offS*4]" , "op": "10011000|offS:19|Rd"},
+ {"inst": "ldrsw Xd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|101|Rm|option:3|s:1|10|Rn|Rd" , "imm": "ImmLDRW(iop, n)"},
+ {"inst": "ldtr Wd, [Xn|SP, #offS]" , "op": "10111000|010|offS:9|10|Rn|Rd"},
+ {"inst": "ldtr Xd, [Xn|SP, #offS]" , "op": "11111000|010|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrb Wd, [Xn|SP, #offS]" , "op": "00111000|010|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrh Wd, [Xn|SP, #offS]" , "op": "01111000|010|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrsb Wd, [Xn|SP, #offS]" , "op": "00111000|100|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrsb Xd, [Xn|SP, #offS]" , "op": "00111000|110|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrsh Wd, [Xn|SP, #offS]" , "op": "01111000|100|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrsh Xd, [Xn|SP, #offS]" , "op": "01111000|110|offS:9|10|Rn|Rd"},
+ {"inst": "ldtrsw Xd, [Xn|SP, #offS]" , "op": "10111000|100|offS:9|10|Rn|Rd"},
+ {"inst": "ldur Wd, [Xn|SP, #offS]" , "op": "10111000|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldur Xd, [Xn|SP, #offS]" , "op": "11111000|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldurb Wd, [Xn|SP, #offS]" , "op": "00111000|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldurh Wd, [Xn|SP, #offS]" , "op": "01111000|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldursb Wd, [Xn|SP, #offS]" , "op": "00111000|100|offS:9|00|Rn|Rd"},
+ {"inst": "ldursb Xd, [Xn|SP, #offS]" , "op": "00111000|110|offS:9|00|Rn|Rd"},
+ {"inst": "ldursh Wd, [Xn|SP, #offS]" , "op": "01111000|100|offS:9|00|Rn|Rd"},
+ {"inst": "ldursh Xd, [Xn|SP, #offS]" , "op": "01111000|110|offS:9|00|Rn|Rd"},
+ {"inst": "ldursw Xd, [Xn|SP, #offS]" , "op": "10111000|100|offS:9|00|Rn|Rd"},
+ {"inst": "ldxp Wd, Wd2, [Xn|SP, #offS*4]" , "op": "10001000|011|11111|0|Rd2|Rn|Rd"},
+ {"inst": "ldxp Xd, Xd2, [Xn|SP, #offS*8]" , "op": "11001000|011|11111|0|Rd2|Rn|Rd"},
+ {"inst": "ldxr Wd, [Xn|SP]" , "op": "10001000|010|11111|0|11111|Rn|Rd"},
+ {"inst": "ldxr Xd, [Xn|SP]" , "op": "11001000|010|11111|0|11111|Rn|Rd"},
+ {"inst": "ldxrb Wd, [Xn|SP]" , "op": "00001000|010|11111|0|11111|Rn|Rd"},
+ {"inst": "ldxrh Wd, [Xn|SP]" , "op": "01001000|010|11111|0|11111|Rn|Rd"},
+ {"inst": "lsl|lslv Wd, Wn, Wm" , "op": "00011010|110|Rm|001000|Rn|Rd"},
+ {"inst": "lsl|lslv Xd, Xn, Xm" , "op": "10011010|110|Rm|001000|Rn|Rd"},
+ {"inst": "lsl Wd, Wn, #n" , "op": "01010011|00|immr:6|imms:6|Rn|Rd"},
+ {"inst": "lsl Xd, Xn, #n" , "op": "11010011|01|immr:6|imms:6|Rn|Rd"},
+ {"inst": "lsr|lsrv Wd, Wn, Wm" , "op": "00011010|110|Rm|001001|Rn|Rd"},
+ {"inst": "lsr|lsrv Xd, Xn, Xm" , "op": "10011010|110|Rm|001001|Rn|Rd"},
+ {"inst": "lsr Wd, Wn, #n" , "op": "01010011|00|immr:6|011111|Rn|Rd"},
+ {"inst": "lsr Xd, Xn, #n" , "op": "11010011|01|immr:6|111111|Rn|Rd"},
+ {"inst": "madd Wd, Wn, Wm, Wa" , "op": "00011011|000|Rm|0|Ra|Rn|Rd"},
+ {"inst": "madd Xd, Xn, Xm, Xa" , "op": "10011011|000|Rm|0|Ra|Rn|Rd"},
+ {"inst": "mneg Wd, Wn, Wm" , "op": "00011011|000|Rm|1|11111|Rn|Rd"},
+ {"inst": "mneg Xd, Xn, Xm" , "op": "10011011|000|Rm|1|11111|Rn|Rd"},
+ {"inst": "mov Wd, Wm" , "op": "00101010|000|Rm|0|00000|11111|Rd"},
+ {"inst": "mov Xd, Xm" , "op": "10101010|000|Rm|0|00000|11111|Rd"},
+ {"inst": "mov Wd|WSP, Wn|WSP" , "op": "00010001|000|00000|0|00000|Rn|Rd"},
+ {"inst": "mov Xd|SP, Xn|SP" , "op": "10010001|000|00000|0|00000|Rn|Rd"},
+ {"inst": "mov Wd, #imm" , "op": "01010010|1|hw:2|imm:16|Rd" , "imm": "ImmWide(imm, 0, 0)"},
+ {"inst": "mov Xd, #imm" , "op": "11010010|1|hw:2|imm:16|Rd" , "imm": "ImmWide(imm, 0, 1)"},
+ {"inst": "mov Wd, #imm" , "op": "00010010|1|hw:2|imm:16|Rd" , "imm": "ImmWideInv(imm, 0, 0)"},
+ {"inst": "mov Xd, #imm" , "op": "10010010|1|hw:2|imm:16|Rd" , "imm": "ImmWideInv(imm, 0, 1)"},
+ {"inst": "mov Wd|WSP, #log_imm" , "op": "00110010|00|immr:6|imms:6|11111|Rd" , "imm": "ImmLogical(log_imm, 0)"},
+ {"inst": "mov Xd|SP, #log_imm" , "op": "10110010|01|immr:6|imms:6|11111|Rd" , "imm": "ImmLogical(log_imm, 1)"},
+ {"inst": "movk Wd, #imm, {lsl #n}" , "op": "01110010|1|hw:2|imm:16|Rd" , "imm": "ImmWide(imm, n, 0)"},
+ {"inst": "movk Xd, #imm, {lsl #n}" , "op": "11110010|1|hw:2|imm:16|Rd" , "imm": "ImmWide(imm, n, 1)"},
+ {"inst": "movn Wd, #imm, {lsl #n}" , "op": "00010010|1|hw:2|imm:16|Rd" , "imm": "ImmWideInv(imm, n, 0)"},
+ {"inst": "movn Xd, #imm, {lsl #n}" , "op": "10010010|1|hw:2|imm:16|Rd" , "imm": "ImmWideInv(imm, n, 1)"},
+ {"inst": "movz Wd, #imm, {lsl #n}" , "op": "01010010|1|hw:2|imm:16|Rd" , "imm": "ImmWide(imm, n, 0)"},
+ {"inst": "movz Xd, #imm, {lsl #n}" , "op": "11010010|1|hw:2|imm:16|Rd" , "imm": "ImmWide(imm, n, 1)"},
+ {"inst": "mrs Xd, #sysreg" , "op": "11010101|001|1|sysreg:15|Rd"},
+ {"inst": "msr #sysreg, Xs" , "op": "11010101|000|1|sysreg:15|Rs"},
+ {"inst": "msr #pstatefield, #imm" , "op": "11010101|000|00|op1:3|0100|imm:4|op2:3|11111" , "imm": "ImmMSR(pstatefield)"},
+ {"inst": "msub Wd, Wn, Wm, Wa" , "op": "00011011|000|Rm|1|Ra|Rn|Rd"},
+ {"inst": "msub Xd, Xn, Xm, Xa" , "op": "10011011|000|Rm|1|Ra|Rn|Rd"},
+ {"inst": "mul Wd, Wn, Wm" , "op": "00011011|000|Rm|0|11111|Rn|Rd"},
+ {"inst": "mul Xd, Xn, Xm" , "op": "10011011|000|Rm|0|11111|Rn|Rd"},
+ {"inst": "mvn Wd, Wn, {sop #n}" , "op": "X0101010|sop|1|Rn|n:6|Rn|Rd"},
+ {"inst": "mvn Xd, Xn, {sop #n}" , "op": "X0101010|sop|1|Rn|n:6|Rn|Rd"},
+ {"inst": "neg Wd, Wm, {lsl|lsr|asr #n}" , "op": "01001011|sop:2|0|Rm|n:6|11111|Rd"},
+ {"inst": "neg Xd, Xm, {lsl|lsr|asr #n}" , "op": "11001011|sop:2|0|Rm|n:6|11111|Rd"},
+ {"inst": "negs Wd, Wm, {lsl|lsr|asr #n}" , "op": "01101011|sop:2|0|Rm|n:6|11111|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "negs Xd, Xm, {lsl|lsr|asr #n}" , "op": "11101011|sop:2|0|Rm|n:6|11111|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ngc Wd, Wm" , "op": "01011010|000|Rm|0|00000|11111|Rd" , "io": "C=R"},
+ {"inst": "ngc Xd, Xm" , "op": "11011010|000|Rm|0|00000|11111|Rd" , "io": "C=R"},
+ {"inst": "ngcs Wd, Wm" , "op": "01111010|000|Rm|0|00000|11111|Rd" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "ngcs Xd, Xm" , "op": "11111010|000|Rm|0|00000|11111|Rd" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "nop" , "op": "11010101|00|000011|0010|0000|000|11111"},
+ {"inst": "orn Wd, Wn, Wm, {sop #n}" , "op": "00101010|sop:2|1|Rm|n:6|Rn|Rd"},
+ {"inst": "orn Xd, Xn, Xm, {sop #n}" , "op": "10101010|sop:2|1|Rm|n:6|Rn|Rd"},
+ {"inst": "orr Wd, Wn, Wm, {sop #n}" , "op": "00101010|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "orr Xd, Xn, Xm, {sop #n}" , "op": "10101010|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "orr Wd|WSP, Wn, #log_imm" , "op": "00110010|0|imm:13|Rn|Rd" , "imm": "ImmLogical(log_imm, 0)"},
+ {"inst": "orr Xd|SP, Xn, #log_imm" , "op": "10110010|0|imm:13|Rn|Rd" , "imm": "ImmLogical(log_imm, 1)"},
+ {"inst": "prfm #prf_op, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*8}]" , "op": "11111000|101|Rm|option:3|n:1|10|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
+ {"inst": "prfm #prf_op, [Xn|SP, #offZ]" , "op": "11111001|10|offZ:12|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
+ {"inst": "prfm #prf_op, [PC, #offS*4]" , "op": "11011000|offS:19|prf_op:5" , "imm": "ImmPRF(prf_op)"},
+ {"inst": "prfum #prf_op, [Xn|SP, #offS]" , "op": "11111000|100|offS:9|00|Rn|prf_op:5" , "imm": "ImmPRF(prf_op)"},
+ {"inst": "pssbb" , "op": "11010101|000|00011|0011|0100|100|11111"},
+ {"inst": "rbit Wd, Wn" , "op": "01011010|110|00000|0|00000|Rn|Rd"},
+ {"inst": "rbit Xd, Xn" , "op": "11011010|110|00000|0|00000|Rn|Rd"},
+ {"inst": "ret Xn" , "op": "11010100|010|11111|0|00000|Rn|00000" , "control": "return"},
+ {"inst": "rev Wd, Wn" , "op": "01011010|110|00000|0|00010|Rn|Rd"},
+ {"inst": "rev|rev64 Xd, Xn" , "op": "11011010|110|00000|0|00011|Rn|Rd"},
+ {"inst": "rev16 Wd, Wn" , "op": "01011010|110|00000|0|00001|Rn|Rd"},
+ {"inst": "rev16 Xd, Xn" , "op": "11011010|110|00000|0|00001|Rn|Rd"},
+ {"inst": "rev32 Xd, Xn" , "op": "11011010|110|00000|0|00010|Rn|Rd"},
+ {"inst": "ror|rorv Wd, Wn, Wm" , "op": "00011010|110|Rm|0|01011|Rn|Rd"},
+ {"inst": "ror|rorv Xd, Xn, Xm" , "op": "10011010|110|Rm|0|01011|Rn|Rd"},
+ {"inst": "ror Wd, Wn, #n" , "op": "00010011|100|Rn|n:6|Rn|Rd"},
+ {"inst": "ror Xd, Xn, #n" , "op": "10010011|111|Rn|n:6|Rn|Rd"},
+ {"inst": "sbc Wd, Wn, Wm" , "op": "01011010|000|Rm|0|00000|Rn|Rd" , "io": "C=R"},
+ {"inst": "sbc Xd, Xn, Xm" , "op": "11011010|000|Rm|0|00000|Rn|Rd" , "io": "C=R"},
+ {"inst": "sbcs Wd, Wn, Wm" , "op": "01111010|000|Rm|0|00000|Rn|Rd" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "sbcs Xd, Xn, Xm" , "op": "11111010|000|Rm|0|00000|Rn|Rd" , "io": "N=W Z=W C=X V=W"},
+ {"inst": "sbfiz Wd, Wn, #lsb, #width" , "op": "00010011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFIZ(lsb, width, 0)"},
+ {"inst": "sbfiz Xd, Xn, #lsb, #width" , "op": "10010011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFIZ(lsb, width, 1)"},
+ {"inst": "sbfm Wd, Wn, #immr, #imms" , "op": "00010011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFM(immr, imms, 0)"},
+ {"inst": "sbfm Xd, Xn, #immr, #imms" , "op": "10010011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFM(immr, imms, 1)"},
+ {"inst": "sbfx Wd, Wn, #lsb, #width" , "op": "00010011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFX(lsb, width, 0)"},
+ {"inst": "sbfx Xd, Xn, #lsb, #width" , "op": "10010011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFX(lsb, width, 1)"},
+ {"inst": "sdiv Wd, Wn, Wm" , "op": "00011010|110|Rm|0|00011|Rn|Rd"},
+ {"inst": "sdiv Xd, Xn, Xm" , "op": "10011010|110|Rm|0|00011|Rn|Rd"},
+ {"inst": "sev" , "op": "11010101|000|00011|0010|0000|100|11111"},
+ {"inst": "sevl" , "op": "11010101|000|00011|0010|0000|101|11111"},
+ {"inst": "smaddl Xd, Wn, Wm, Xa" , "op": "10011011|001|Rm|0|Ra|Rn|Rd"},
+ {"inst": "smc #immZ" , "op": "11010100|000|immZ:16|00011"},
+ {"inst": "smnegl Xd, Wn, Wm" , "op": "10011011|001|Rm|1|11111|Rn|Rd"},
+ {"inst": "smsubl Xd, Wn, Wm, Xa" , "op": "10011011|001|Rm|1|Ra|Rn|Rd"},
+ {"inst": "smulh Xd, Xn, Xm" , "op": "10011011|010|Rm|0|11111|Rn|Rd"},
+ {"inst": "smull Xd, Wn, Wm" , "op": "10011011|001|Rm|0|11111|Rn|Rd"},
+ {"inst": "ssbb" , "op": "11010101|000|00011|0011|0000|100|11111"},
+ {"inst": "stlr Ws, [Xn|SP]" , "op": "10001000|100|11111|1|11111|Rn|Rs"},
+ {"inst": "stlr Xs, [Xn|SP]" , "op": "11001000|100|11111|1|11111|Rn|Rs"},
+ {"inst": "stlrb Ws, [Xn|SP]" , "op": "00001000|100|11111|1|11111|Rn|Rs"},
+ {"inst": "stlrh Ws, [Xn|SP]" , "op": "01001000|100|11111|1|11111|Rn|Rs"},
+ {"inst": "stlxp Wd, Ws, Ws2, [Xn|SP]" , "op": "10001000|001|Rd|1|Rs2|Rn|Rs"},
+ {"inst": "stlxp Wd, Xs, Xs2, [Xn|SP]" , "op": "11001000|001|Rd|1|Rs2|Rn|Rs"},
+ {"inst": "stlxr Wd, Ws, [Xn|SP]" , "op": "10001000|000|Rd|1|11111|Rn|Rs"},
+ {"inst": "stlxr Wd, Xs, [Xn|SP]" , "op": "11001000|000|Rd|1|11111|Rn|Rs"},
+ {"inst": "stlxrb Wd, Ws, [Xn|SP]" , "op": "00001000|000|Rd|1|11111|Rn|Rs"},
+ {"inst": "stlxrh Wd, Xs, [Xn|SP]" , "op": "01001000|000|Rd|1|11111|Rn|Rs"},
+ {"inst": "stnp Ws, Ws2, [Xn|SP, #offS*4]" , "op": "00101000|00|offS:7|Rs2|Rn|Rs"},
+ {"inst": "stnp Xs, Xs2, [Xn|SP, #offS*8]" , "op": "10101000|00|offS:7|Rs2|Rn|Rs"},
+ {"inst": "stp Ws, Ws2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010100|!post|W|0|offS:7|Rs2|Rn|Rs"},
+ {"inst": "stp Xs, Xs2, [Xn|SP, #offS*8]{@}{!}" , "op": "1010100|!post|W|0|offS:7|Rs2|Rn|Rs"},
+ {"inst": "str Ws, [Xn|SP, #offZ*4]" , "op": "10111001|00|offZ:12|Rn|Rs"},
+ {"inst": "str Xs, [Xn|SP, #offZ*8]" , "op": "11111001|00|offZ:12|Rn|Rs"},
+ {"inst": "str Ws, [Xn|SP, #offS*4]@" , "op": "10111000|000|offS:9|01|Rn|Rs"},
+ {"inst": "str Xs, [Xn|SP, #offS*8]@" , "op": "11111000|000|offS:9|01|Rn|Rs"},
+ {"inst": "str Ws, [Xn|SP, #offS*4]!" , "op": "10111000|000|offS:9|11|Rn|Rs"},
+ {"inst": "str Xs, [Xn|SP, #offS*8]!" , "op": "11111000|000|offS:9|11|Rn|Rs"},
+ {"inst": "str Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "10111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDR_STR(iop, n)"},
+ {"inst": "str Xs, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "11111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDR_STR(iop, n)"},
+ {"inst": "strb Ws, [Xn|SP, #offZ]" , "op": "00111001|00|offZ:12|Rn|Rs"},
+ {"inst": "strb Ws, [Xn|SP, #offS]@" , "op": "00111000|000|offS:9|01|Rn|Rs"},
+ {"inst": "strb Ws, [Xn|SP, #offS]!" , "op": "00111000|000|offS:9|11|Rn|Rs"},
+ {"inst": "strb Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDRB_STRB(iop, n)"},
+ {"inst": "strh Ws, [Xn|SP, #offZ*2]" , "op": "01111001|00|offZ:12|Rn|Rs"},
+ {"inst": "strh Ws, [Xn|SP, #offS*2]@" , "op": "01111000|000|offS:9|01|Rn|Rs"},
+ {"inst": "strh Ws, [Xn|SP, #offS*2]!" , "op": "01111000|000|offS:9|11|Rn|Rs"},
+ {"inst": "strh Ws, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111000|001|Rm|option:3|s:1|10|Rn|Rs" , "imm": "ImmLDRH_STRH(iop, n)"},
+ {"inst": "sttr Ws, [Xn|SP, #offS]" , "op": "10111000|000|offS:9|10|Rn|Rs"},
+ {"inst": "sttr Xs, [Xn|SP, #offS]" , "op": "11111000|000|offS:9|10|Rn|Rs"},
+ {"inst": "sttrb Ws, [Xn|SP, #offS]" , "op": "00111000|000|offS:9|10|Rn|Rs"},
+ {"inst": "sttrh Ws, [Xn|SP, #offS]" , "op": "01111000|000|offS:9|10|Rn|Rs"},
+ {"inst": "stur Ws, [Xn|SP, #offS]" , "op": "10111000|000|offS:9|00|Rn|Rs"},
+ {"inst": "stur Xs, [Xn|SP, #offS]" , "op": "11111000|000|offS:9|00|Rn|Rs"},
+ {"inst": "sturb Ws, [Xn|SP, #offS]" , "op": "00111000|000|offS:9|00|Rn|Rs"},
+ {"inst": "sturh Ws, [Xn|SP, #offS]" , "op": "01111000|000|offS:9|00|Rn|Rs"},
+ {"inst": "stxp Wd, Ws, Ws2, [Xn|SP]" , "op": "10001000|001|Rd|0|Rs2|Rn|Rs"},
+ {"inst": "stxp Wd, Xs, Xs2, [Xn|SP]" , "op": "11001000|001|Rd|0|Rs2|Rn|Rs"},
+ {"inst": "stxr Wd, Ws, [Xn|SP]" , "op": "10001000|000|Rd|0|11111|Rn|Rs"},
+ {"inst": "stxr Wd, Xs, [Xn|SP]" , "op": "11001000|000|Rd|0|11111|Rn|Rs"},
+ {"inst": "stxrb Wd, Ws, [Xn|SP]" , "op": "00001000|000|Rd|0|11111|Rn|Rs"},
+ {"inst": "stxrh Wd, Xs, [Xn|SP]" , "op": "01001000|000|Rd|0|11111|Rn|Rs"},
+ {"inst": "sub Wd, Wn, Wm, {lsl|lsr|asr #n}" , "op": "01001011|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "sub Xd, Xn, Xm, {lsl|lsr|asr #n}" , "op": "11001011|sop:2|0|Rm|n:6|Rn|Rd"},
+ {"inst": "sub Wd|WSP, Wn|WSP, Wm, {extend #n}" , "op": "01001011|00|1|Rm|option:3|n:3|Rn|Rd"},
+ {"inst": "sub Xd|SP, Xn|SP, Rm, {extend #n}" , "op": "11001011|00|1|Rm|option:3|n:3|Rn|Rd"},
+ {"inst": "sub Wd|WSP, Wn|WSP, #immZ, {lsl #n=0|12}" , "op": "01010001|0|n:1|immZ:12|Rn|Rd"},
+ {"inst": "sub Xd|SP, Xn|SP, #immZ, {lsl #n=0|12}" , "op": "11010001|0|n:1|immZ:12|Rn|Rd"},
+ {"inst": "subs Wd, Wn, Wm, {lsl|lsr|asr #n}" , "op": "01101011|sop:2|0|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subs Xd, Xn, Xm, {lsl|lsr|asr #n}" , "op": "11101011|sop:2|0|Rm|n:6|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subs Wd, Wn|WSP, Wm, {extend #n}" , "op": "01101011|00|1|Rm|option:3|n:3|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subs Xd, Xn|SP, Rm, {extend #n}" , "op": "11101011|00|1|Rm|option:3|n:3|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subs Wd|WSP, Wn|WSP, #immZ, {lsl #n=0|12}" , "op": "01110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "subs Xd|SP, Xn|SP, #immZ, {lsl #n=0|12}" , "op": "11110001|0|n:1|immZ:12|Rn|Rd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "svc #immZ" , "op": "11010100|000|immZ:16|00001"},
+ {"inst": "sxtb Wd, Wn" , "op": "00010011|000|00000|0|00111|Rn|Rd"},
+ {"inst": "sxtb Xd, Wn" , "op": "10010011|010|00000|0|00111|Rn|Rd"},
+ {"inst": "sxth Wd, Wn" , "op": "00010011|000|00000|0|01111|Rn|Rd"},
+ {"inst": "sxth Xd, Wn" , "op": "10010011|010|00000|0|01111|Rn|Rd"},
+ {"inst": "sxtw Xd, Wn" , "op": "10010011|010|00000|0|11111|Rn|Rd"},
+ {"inst": "sys #op1, #Cn, #Cm, #op2" , "op": "11010101|000|01|op1:3|CRn|CRm|op2:3|11111"},
+ {"inst": "sys #op1, #Cn, #Cm, #op2, Xt" , "op": "11010101|000|01|op1:3|CRn|CRm|op2:3|Rt"},
+ {"inst": "sysl Xd, #op1, #Cn, #Cm, #op2" , "op": "11010101|001|01|op1:3|CRn|CRm|op2:3|Rd"},
+ {"inst": "tbnz Wt, #imm, #relS*4" , "op": "00110111|imm:5|relS:14|Rt"},
+ {"inst": "tbnz Xt, #imm, #relS*4" , "op": "imm:1|0110111|imm:5|relS:14|Rt"},
+ {"inst": "tbz Wt, #imm, #relS*4" , "op": "00110110|imm:5|relS:14|Rt"},
+ {"inst": "tbz Xt, #imm, #relS*4" , "op": "imm:1|0110110|imm:5|relS:14|Rt"},
+ {"inst": "tlbi #tlbi_op" , "op": "11010101|00|001|op1:3|1000|CRm|op2:3|11111" , "imm": "ImmTLBI(tlbi_op)"},
+ {"inst": "tlbi #tlbi_op, Xt" , "op": "11010101|00|001|op1:3|1000|CRm|op2:3|Rt" , "imm": "ImmTLBI(tlbi_op)"},
+ {"inst": "tst Wn, Wm, {sop #n}" , "op": "01101010|sop:2|0|Rm|n:6|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "tst Xn, Xm, {sop #n}" , "op": "11101010|sop:2|0|Rm|n:6|Rn|11111" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "tst Wn, #imm" , "op": "01110010|0|imm:13|Rn|11111" , "io": "N=W Z=W C=W V=W", "imm": "LogicalImm(imm, 0)"},
+ {"inst": "tst Xn, #imm" , "op": "11110010|0|imm:13|Rn|11111" , "io": "N=W Z=W C=W V=W", "imm": "LogicalImm(imm, 1)"},
+ {"inst": "ubfiz Wd, Wn, #lsb, #width" , "op": "01010011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFIZ(lsb, width, 0)"},
+ {"inst": "ubfiz Xd, Xn, #lsb, #width" , "op": "11010011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFIZ(lsb, width, 1)"},
+ {"inst": "ubfm Wd, Wn, #immr, #imms" , "op": "01010011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFM(immr, imms, 0)"},
+ {"inst": "ubfm Xd, Xn, #immr, #imms" , "op": "11010011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFM(immr, imms, 1)"},
+ {"inst": "ubfx Wd, Wn, #lsb, #width" , "op": "01010011|00|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFX(lsb, width, 0)"},
+ {"inst": "ubfx Xd, Xn, #lsb, #width" , "op": "11010011|01|immr:6|imms:6|Rn|Rd" , "imm": "ImmBFX(lsb, width, 1)"},
+ {"inst": "udf #imm" , "op": "00000000|000|00000|imm:16"},
+ {"inst": "udiv Wd, Wn, Wm" , "op": "00011010|110|Rm|0|00010|Rn|Rd"},
+ {"inst": "udiv Xd, Xn, Xm" , "op": "10011010|110|Rm|0|00010|Rn|Rd"},
+ {"inst": "umaddl Xd, Wn, Wm, Xa" , "op": "10011011|101|Rm|0|Ra|Rn|Rd"},
+ {"inst": "umnegl Xd, Wn, Wm" , "op": "10011011|101|Rm|1|11111|Rn|Rd"},
+ {"inst": "umsubl Xd, Wn, Wm, Xa" , "op": "10011011|101|Rm|1|Ra|Rn|Rd"},
+ {"inst": "umulh Xd, Xn, Xm" , "op": "10011011|110|Rm|0|11111|Rn|Rd"},
+ {"inst": "umull Xd, Wn, Wm" , "op": "10011011|101|Rm|0|11111|Rn|Rd"},
+ {"inst": "uxtb Wd, Wn" , "op": "01010011|000|00000|0|00111|Rn|Rd"},
+ {"inst": "uxth Wd, Wn" , "op": "01010011|000|00000|0|01111|Rn|Rd"},
+ {"inst": "wfe" , "op": "11010101|000|00011|0010|0000|010|11111"},
+ {"inst": "wfi" , "op": "11010101|000|00011|0010|0000|011|11111"},
+ {"inst": "yield" , "op": "11010101|000|00011|0010|0000|001|11111"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "BRBE", "data": [
+ {"inst": "brb #brb_op" , "op": "11010101|000|01001|0111|0010|op2:3|11111" , "imm": "ImmBRB(beb_op)"},
+ {"inst": "brb #brb_op, Xt" , "op": "11010101|000|01001|0111|0010|op2:3|Rt" , "imm": "ImmBRB(beb_op)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "BTI", "data": [
+ {"inst": "bti {#targets}" , "op": "11010101|000|00011|0010|0100|op2:3|11111" , "imm": "ImmBTI(targets)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CHK", "data": [
+ {"inst": "chkfeat" , "op": "11010101|000|00011|0010|0101|000|11111"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLRBHB", "data": [
+ {"inst": "clrbhb" , "op": "11010101|000|00011|0010|0010|110|11111"}
+ ]},
+
+ {"category": "GP", "ext": "CPA", "data": [
+ {"inst": "addpt Xd|SP, Xn|SP, Xm, {lsl #n}" , "op": "10011010|000|Rm|001|n:3|Rn|Rd"},
+ {"inst": "maddpt Xd, Xn, Xm, Xa" , "op": "10011011|011|Rm|0|Ra|Rn|Rd"},
+ {"inst": "msubpt Xd, Xn, Xm, Xa" , "op": "10011011|011|Rm|1|Ra|Rn|Rd"},
+ {"inst": "subpt Xd|SP, Xn|SP, Xm, {lsl #n}" , "op": "11011010|000|Rm|001|n:3|Rn|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT CRYPTO_HASH", "ext": "CRC32", "data": [
+ {"inst": "crc32b Wd, Wn, Wm" , "op": "00011010|110|Rm|0|10000|Rn|Rd"},
+ {"inst": "crc32h Wd, Wn, Wm" , "op": "00011010|110|Rm|0|10001|Rn|Rd"},
+ {"inst": "crc32w Wd, Wn, Wm" , "op": "00011010|110|Rm|0|10010|Rn|Rd"},
+ {"inst": "crc32x Xd, Xn, Xm" , "op": "10011010|110|Rm|0|10011|Rn|Rd"},
+
+ {"inst": "crc32cb Wd, Wn, Wm" , "op": "00011010|110|Rm|0|10100|Rn|Rd"},
+ {"inst": "crc32ch Wd, Wn, Wm" , "op": "00011010|110|Rm|0|10101|Rn|Rd"},
+ {"inst": "crc32cw Wd, Wn, Wm" , "op": "00011010|110|Rm|0|10110|Rn|Rd"},
+ {"inst": "crc32cx Xd, Xn, Xm" , "op": "10011010|110|Rm|0|10111|Rn|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CSSC", "data": [
+ {"inst": "abs Wd, Wn" , "op": "01011010|110|00000|0|01000|Rn|Rd"},
+ {"inst": "abs Xd, Xn" , "op": "11011010|110|00000|0|01000|Rn|Rd"},
+ {"inst": "cnt Wd, Wn" , "op": "01011010|110|00000|0|00111|Rn|Rd"},
+ {"inst": "cnt Xd, Xn" , "op": "11011010|110|00000|0|00111|Rn|Rd"},
+ {"inst": "ctz Wd, Wn" , "op": "01011010|110|00000|0|00110|Rn|Rd"},
+ {"inst": "ctz Xd, Xn" , "op": "11011010|110|00000|0|00110|Rn|Rd"},
+ {"inst": "smax Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11000|Rn|Rd"},
+ {"inst": "smax Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11000|Rn|Rd"},
+ {"inst": "smax Wd, Wn, #immS" , "op": "00010001|110|000|immS:8|Rn|Rd"},
+ {"inst": "smax Xd, Xn, #immS" , "op": "10010001|110|000|immS:8|Rn|Rd"},
+ {"inst": "smin Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11010|Rn|Rd"},
+ {"inst": "smin Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11010|Rn|Rd"},
+ {"inst": "smin Wd, Wn, #immS" , "op": "00010001|110|010|immS:8|Rn|Rd"},
+ {"inst": "smin Xd, Xn, #immS" , "op": "10010001|110|010|immS:8|Rn|Rd"},
+ {"inst": "umax Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11001|Rn|Rd"},
+ {"inst": "umax Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11001|Rn|Rd"},
+ {"inst": "umax Wd, Wn, #immZ" , "op": "00010001|110|001|immZ:8|Rn|Rd"},
+ {"inst": "umax Xd, Xn, #immZ" , "op": "10010001|110|001|immZ:8|Rn|Rd"},
+ {"inst": "umin Wd, Wn, Wm" , "op": "00011010|110|Rm|0|11011|Rn|Rd"},
+ {"inst": "umin Xd, Xn, Xm" , "op": "10011010|110|Rm|0|11011|Rn|Rd"},
+ {"inst": "umin Wd, Wn, #immZ" , "op": "00010001|110|011|immZ:8|Rn|Rd"},
+ {"inst": "umin Xd, Xn, #immZ" , "op": "10010001|110|011|immZ:8|Rn|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "D128", "data": [
+ {"inst": "tlbip #tlbip_op, 2x{Xt}+" , "op": "11010101|010|01|op1:3|CRn|CRm|op2:3|Rt" , "imm": "ImmTLBIP(tlbip_op)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "DGH", "data": [
+ {"inst": "dgh" , "op": "11010101|000|00|011|0010|0000|110|11111"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "FLAGM", "data": [
+ {"inst": "cfinv" , "op": "11010101|000|00000|0100|0000|000|11111" , "io": "C=X"},
+ {"inst": "rmif Xn, #shift, #mask" , "op": "10111010|000|shift:6|00001|Rn|0|mask:4" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "setf16 Wn" , "op": "00111010|000|00000|0|10010|Rn|01101" , "io": "N=W Z=W V=W"},
+ {"inst": "setf8 Wn" , "op": "00111010|000|00000|0|00010|Rn|01101" , "io": "N=W Z=W V=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "FLAGM2", "data": [
+ {"inst": "axflag" , "op": "11010101|000|00000|0100|0000|010|11111" , "io": "N=X Z=X C=X V=X"},
+ {"inst": "xaflag" , "op": "11010101|000|00000|0100|0000|001|11111" , "io": "N=X Z=X C=X V=X"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "GCS", "data": [
+ {"inst": "gcsb #dsync" , "op": "11010101|000|00011|0010|0010|011|11111"},
+ {"inst": "gcspopcx" , "op": "11010101|000|01000|0111|0111|101|11111"},
+ {"inst": "gcspopcx Xt" , "op": "11010101|000|01000|0111|0111|101|Rt"},
+ {"inst": "gcspopm Xt" , "op": "11010101|001|01011|0111|0111|001|Rt"},
+ {"inst": "gcspopx" , "op": "11010101|000|01000|0111|0111|110|11111"},
+ {"inst": "gcspopx Xt" , "op": "11010101|000|01000|0111|0111|110|Rt"},
+ {"inst": "gcspushm Xt" , "op": "11010101|000|01011|0111|0111|000|Rt"},
+ {"inst": "gcspushx" , "op": "11010101|000|01000|0111|0111|100|11111"},
+ {"inst": "gcspushx Xt" , "op": "11010101|000|01000|0111|0111|100|Rt"},
+ {"inst": "gcsss1 Xt" , "op": "11010101|000|01011|0111|0111|010|Rt"},
+ {"inst": "gcsss2 Xt" , "op": "11010101|001|01011|0111|0111|011|Rt"},
+ {"inst": "gcsstr Xs, [Xn|SP]" , "op": "11011001|000|11111|0|00011|Rn|Rs"},
+ {"inst": "gcssttr Xs, [Xn|SP]" , "op": "11011001|000|11111|0|00111|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "HBC", "data": [
+ {"inst": "bc.<cond> #relS*4" , "op": "01010100|relS:19|1|cond" , "control": "branch", "io": "N=R Z=R C=R V=R"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "ITE", "data": [
+ {"inst": "trcit Xt" , "op": "11010101|000|01011|0111|0010|111|Rt"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LOR", "data": [
+ {"inst": "ldlar Wd, [Xn|SP]" , "op": "10001000|110|11111|0|11111|Rn|Rd"},
+ {"inst": "ldlar Xd, [Xn|SP]" , "op": "11001000|110|11111|0|11111|Rn|Rd"},
+ {"inst": "ldlarb Wd, [Xn|SP]" , "op": "00001000|110|11111|0|11111|Rn|Rd"},
+ {"inst": "ldlarh Wd, [Xn|SP]" , "op": "01001000|110|11111|0|11111|Rn|Rd"},
+ {"inst": "stllr Ws, [Xn|SP]" , "op": "10001000|100|11111|0|11111|Rn|Rs"},
+ {"inst": "stllr Xs, [Xn|SP]" , "op": "11001000|100|11111|0|11111|Rn|Rs"},
+ {"inst": "stllrb Ws, [Xn|SP]" , "op": "00001000|100|11111|0|11111|Rn|Rs"},
+ {"inst": "stllrh Ws, [Xn|SP]" , "op": "01001000|100|11111|0|11111|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LRCPC", "data": [
+ {"inst": "ldapr Wd, [Xn|SP]" , "op": "10111000|101|11111|1|10000|Rn|Rd"},
+ {"inst": "ldapr Xd, [Xn|SP]" , "op": "11111000|101|11111|1|10000|Rn|Rd"},
+ {"inst": "ldaprb Wd, [Xn|SP]" , "op": "00111000|101|11111|1|10000|Rn|Rd"},
+ {"inst": "ldaprh Wd, [Xn|SP]" , "op": "01111000|101|11111|1|10000|Rn|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LRCPC2", "data": [
+ {"inst": "ldapur Wd, [Xn|SP, #offS]" , "op": "10011001|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldapur Xd, [Xn|SP, #offS]" , "op": "11011001|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldapurb Wd, [Xn|SP, #offS]" , "op": "00011001|010|offS:9|00|Rn|Rd"},
+ {"inst": "ldapurh Wd, [Xn|SP, #offS]" , "op": "01011001|010|offS:9|00|Rn|Rd"},
+
+ {"inst": "ldapursb Wd, [Xn|SP, #offS]" , "op": "00011001|110|offS:9|00|Rn|Rd"},
+ {"inst": "ldapursb Xd, [Xn|SP, #offS]" , "op": "00011001|100|offS:9|00|Rn|Rd"},
+ {"inst": "ldapursh Wd, [Xn|SP, #offS]" , "op": "01011001|110|offS:9|00|Rn|Rd"},
+ {"inst": "ldapursh Xd, [Xn|SP, #offS]" , "op": "01011001|100|offS:9|00|Rn|Rd"},
+ {"inst": "ldapursw Xd, [Xn|SP, #offS]" , "op": "10011001|100|offS:9|00|Rn|Rd"},
+
+ {"inst": "stlur Ws, [Xn|SP, #offS]" , "op": "10011001|000|offS:9|00|Rn|Rs"},
+ {"inst": "stlur Xs, [Xn|SP, #offS]" , "op": "11011001|000|offS:9|00|Rn|Rs"},
+ {"inst": "stlurb Ws, [Xn|SP, #offS]" , "op": "00011001|000|offS:9|00|Rn|Rs"},
+ {"inst": "stlurh Ws, [Xn|SP, #offS]" , "op": "01011001|000|offS:9|00|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LRCPC3", "data": [
+ {"inst": "ldiapp Wd, Wd2, [Xn|SP]" , "op": "10011001|010|Rd2|0|00110|Rn|Rd"},
+ {"inst": "ldiapp Wd, Wd2, [Xn|SP, #8]@" , "op": "10011001|010|Rd2|0|00010|Rn|Rd"},
+ {"inst": "ldiapp Xd, Xd2, [Xn|SP]" , "op": "11011001|010|Rd2|0|00110|Rn|Rd"},
+ {"inst": "ldiapp Xd, Xd2, [Xn|SP, #16]@" , "op": "11011001|010|Rd2|0|00010|Rn|Rd"},
+ {"inst": "stilp Ws, Ws2, [Xn|SP]" , "op": "10011001|000|Rs2|0|00110|Rn|Rs"},
+ {"inst": "stilp Ws, Ws2, [Xn|SP, #8]@" , "op": "10011001|000|Rs2|0|00010|Rn|Rs"},
+ {"inst": "stilp Xs, Xs2, [Xn|SP]" , "op": "11011001|000|Rs2|0|00110|Rn|Rs"},
+ {"inst": "stilp Xs, Xs2, [Xn|SP, #16]@" , "op": "11011001|000|Rs2|0|00010|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LS64", "data": [
+ {"inst": "ld64b 8x{Xd}+, [Xn|SP]" , "op": "11111000|001|11111|1|10100|Rn|Rd"},
+ {"inst": "st64b 8x{Xs}+, [Xn|SP]" , "op": "11111000|001|11111|1|00100|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LS64_ACCDATA", "data": [
+ {"inst": "st64bv0 Rd, 8x{Xs}+, [Xn|SP]" , "op": "11111000|001|Rd|1|01000|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LS64_V", "data": [
+ {"inst": "st64bv Rd, 8x{Xs}+, [Xn|SP]" , "op": "11111000|001|Rd|1|01100|Rn|Rs"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LSE", "data": [
+ {"inst": "cas Ws, Wd, [Xn|SP]" , "op": "10001000|001|Rs|0|11111|Rn|Rd"},
+ {"inst": "casa Ws, Wd, [Xn|SP]" , "op": "10001000|011|Rs|0|11111|Rn|Rd"},
+ {"inst": "casal Ws, Wd, [Xn|SP]" , "op": "10001000|011|Rs|1|11111|Rn|Rd"},
+ {"inst": "casl Ws, Wd, [Xn|SP]" , "op": "10001000|001|Rs|1|11111|Rn|Rd"},
+ {"inst": "cas Xs, Xd, [Xn|SP]" , "op": "11001000|001|Rs|0|11111|Rn|Rd"},
+ {"inst": "casa Xs, Xd, [Xn|SP]" , "op": "11001000|011|Rs|0|11111|Rn|Rd"},
+ {"inst": "casal Xs, Xd, [Xn|SP]" , "op": "11001000|011|Rs|1|11111|Rn|Rd"},
+ {"inst": "casl Xs, Xd, [Xn|SP]" , "op": "11001000|001|Rs|1|11111|Rn|Rd"},
+ {"inst": "casab Ws, Wd, [Xn|SP]" , "op": "00001000|111|Rs|0|11111|Rn|Rd"},
+ {"inst": "casalb Ws, Wd, [Xn|SP]" , "op": "00001000|111|Rs|1|11111|Rn|Rd"},
+ {"inst": "casb Ws, Wd, [Xn|SP]" , "op": "00001000|101|Rs|0|11111|Rn|Rd"},
+ {"inst": "caslb Ws, Wd, [Xn|SP]" , "op": "00001000|101|Rs|1|11111|Rn|Rd"},
+ {"inst": "casah Ws, Wd, [Xn|SP]" , "op": "01001000|111|Rs|0|11111|Rn|Rd"},
+ {"inst": "casalh Ws, Wd, [Xn|SP]" , "op": "01001000|111|Rs|1|11111|Rn|Rd"},
+ {"inst": "cash Ws, Wd, [Xn|SP]" , "op": "01001000|101|Rs|0|11111|Rn|Rd"},
+ {"inst": "caslh Ws, Wd, [Xn|SP]" , "op": "01001000|101|Rs|1|11111|Rn|Rd"},
+ {"inst": "casp 2x{Ws}+, 2x{Wd}+, [Xn|SP]" , "op": "00001000|001|Rs|0|11111|Rn|Rd"},
+ {"inst": "caspa 2x{Ws}+, 2x{Wd}+, [Xn|SP]" , "op": "00001000|011|Rs|0|11111|Rn|Rd"},
+ {"inst": "caspal 2x{Ws}+, 2x{Wd}+, [Xn|SP]" , "op": "00001000|011|Rs|1|11111|Rn|Rd"},
+ {"inst": "caspl 2x{Ws}+, 2x{Wd}+, [Xn|SP]" , "op": "00001000|001|Rs|1|11111|Rn|Rd"},
+ {"inst": "casp 2x{Xs}+, 2x{Xd}+, [Xn|SP]" , "op": "01001000|001|Rs|0|11111|Rn|Rd"},
+ {"inst": "caspa 2x{Xs}+, 2x{Xd}+, [Xn|SP]" , "op": "01001000|011|Rs|0|11111|Rn|Rd"},
+ {"inst": "caspal 2x{Xs}+, 2x{Xd}+, [Xn|SP]" , "op": "01001000|011|Rs|1|11111|Rn|Rd"},
+ {"inst": "caspl 2x{Xs}+, 2x{Xd}+, [Xn|SP]" , "op": "01001000|001|Rs|1|11111|Rn|Rd"},
+ {"inst": "ldadd Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldadda Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldadd Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldadda Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddal Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldaddlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|00000|Rn|Rd"},
+ {"inst": "ldclr Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclra Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclral Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclr Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclra Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclral Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclralb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclralh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldclrlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|00100|Rn|Rd"},
+ {"inst": "ldeor Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeora Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeoral Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeor Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeora Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeoral Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeoralb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeoralh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldeorlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|01000|Rn|Rd"},
+ {"inst": "ldset Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldseta Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldset Xs, Wd, [Xn|SP]" , "op": "11111000|001|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldseta Xs, Wd, [Xn|SP]" , "op": "11111000|101|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetal Xs, Wd, [Xn|SP]" , "op": "11111000|111|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetl Xs, Wd, [Xn|SP]" , "op": "11111000|011|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldseth Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsetlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|01100|Rn|Rd"},
+ {"inst": "ldsmax Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxa Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmax Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxa Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxal Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmaxlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|10000|Rn|Rd"},
+ {"inst": "ldsmin Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsmina Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsmin Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsmina Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminal Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldsminlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|10100|Rn|Rd"},
+ {"inst": "ldumax Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxa Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumax Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxa Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxal Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumaxlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|11000|Rn|Rd"},
+ {"inst": "ldumin Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|0|11100|Rn|Rd"},
+ {"inst": "ldumina Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|0|11100|Rn|Rd"},
+ {"inst": "ldumin Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|0|11100|Rn|Rd"},
+ {"inst": "ldumina Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminal Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminlb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminh Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|0|11100|Rn|Rd"},
+ {"inst": "lduminlh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|0|11100|Rn|Rd"},
+ {"inst": "stadd Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|00000|Rn|11111"},
+ {"inst": "stadda Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|00000|Rn|11111"},
+ {"inst": "staddal Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|00000|Rn|11111"},
+ {"inst": "staddl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|00000|Rn|11111"},
+ {"inst": "stadd Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|00000|Rn|11111"},
+ {"inst": "stadda Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|00000|Rn|11111"},
+ {"inst": "staddal Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|00000|Rn|11111"},
+ {"inst": "staddl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|00000|Rn|11111"},
+ {"inst": "staddb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|00000|Rn|11111"},
+ {"inst": "staddab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|00000|Rn|11111"},
+ {"inst": "staddalb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|00000|Rn|11111"},
+ {"inst": "staddlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|00000|Rn|11111"},
+ {"inst": "staddh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|00000|Rn|11111"},
+ {"inst": "staddah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|00000|Rn|11111"},
+ {"inst": "staddalh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|00000|Rn|11111"},
+ {"inst": "staddlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|00000|Rn|11111"},
+ {"inst": "stclr Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|00100|Rn|11111"},
+ {"inst": "stclra Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|00100|Rn|11111"},
+ {"inst": "stclral Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|00100|Rn|11111"},
+ {"inst": "stclr Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|00100|Rn|11111"},
+ {"inst": "stclra Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|00100|Rn|11111"},
+ {"inst": "stclral Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|00100|Rn|11111"},
+ {"inst": "stclralb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|00100|Rn|11111"},
+ {"inst": "stclralh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|00100|Rn|11111"},
+ {"inst": "stclrlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|00100|Rn|11111"},
+ {"inst": "steor Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|01000|Rn|11111"},
+ {"inst": "steora Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|01000|Rn|11111"},
+ {"inst": "steoral Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|01000|Rn|11111"},
+ {"inst": "steorl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|01000|Rn|11111"},
+ {"inst": "steor Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|01000|Rn|11111"},
+ {"inst": "steora Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|01000|Rn|11111"},
+ {"inst": "steoral Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|01000|Rn|11111"},
+ {"inst": "steorl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|01000|Rn|11111"},
+ {"inst": "steorb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|01000|Rn|11111"},
+ {"inst": "steorab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|01000|Rn|11111"},
+ {"inst": "steoralb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|01000|Rn|11111"},
+ {"inst": "steorlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|01000|Rn|11111"},
+ {"inst": "steorh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|01000|Rn|11111"},
+ {"inst": "steorah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|01000|Rn|11111"},
+ {"inst": "steoralh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|01000|Rn|11111"},
+ {"inst": "steorlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|01000|Rn|11111"},
+ {"inst": "stset Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|01100|Rn|11111"},
+ {"inst": "stseta Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetal Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|01100|Rn|11111"},
+ {"inst": "stset Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|01100|Rn|11111"},
+ {"inst": "stseta Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetal Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetalb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|01100|Rn|11111"},
+ {"inst": "stseth Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetalh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|01100|Rn|11111"},
+ {"inst": "stsetlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|01100|Rn|11111"},
+ {"inst": "stsmax Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxa Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxal Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmax Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxa Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxal Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxalb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxalh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmaxlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|10000|Rn|11111"},
+ {"inst": "stsmin Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|10100|Rn|11111"},
+ {"inst": "stsmina Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminal Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|10100|Rn|11111"},
+ {"inst": "stsmin Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|10100|Rn|11111"},
+ {"inst": "stsmina Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminal Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminalb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminalh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|10100|Rn|11111"},
+ {"inst": "stsminlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|10100|Rn|11111"},
+ {"inst": "stumax Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxa Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxal Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|11000|Rn|11111"},
+ {"inst": "stumax Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxa Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxal Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxalb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxalh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|11000|Rn|11111"},
+ {"inst": "stumaxlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|11000|Rn|11111"},
+ {"inst": "stumin Ws, [Xn|SP]" , "op": "10111000|001|Rs|0|11100|Rn|11111"},
+ {"inst": "stumina Ws, [Xn|SP]" , "op": "10111000|101|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminal Ws, [Xn|SP]" , "op": "10111000|111|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminl Ws, [Xn|SP]" , "op": "10111000|011|Rs|0|11100|Rn|11111"},
+ {"inst": "stumin Xs, [Xn|SP]" , "op": "11111000|001|Rs|0|11100|Rn|11111"},
+ {"inst": "stumina Xs, [Xn|SP]" , "op": "11111000|101|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminal Xs, [Xn|SP]" , "op": "11111000|111|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminl Xs, [Xn|SP]" , "op": "11111000|011|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminb Ws, [Xn|SP]" , "op": "00111000|001|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminab Ws, [Xn|SP]" , "op": "00111000|101|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminalb Ws, [Xn|SP]" , "op": "00111000|111|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminlb Ws, [Xn|SP]" , "op": "00111000|011|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminh Ws, [Xn|SP]" , "op": "01111000|001|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminah Ws, [Xn|SP]" , "op": "01111000|101|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminalh Ws, [Xn|SP]" , "op": "01111000|111|Rs|0|11100|Rn|11111"},
+ {"inst": "stuminlh Ws, [Xn|SP]" , "op": "01111000|011|Rs|0|11100|Rn|11111"},
+ {"inst": "swp Ws, Wd, [Xn|SP]" , "op": "10111000|001|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpa Ws, Wd, [Xn|SP]" , "op": "10111000|101|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpal Ws, Wd, [Xn|SP]" , "op": "10111000|111|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpl Ws, Wd, [Xn|SP]" , "op": "10111000|011|Rs|1|00000|Rn|Rd"},
+ {"inst": "swp Xs, Xd, [Xn|SP]" , "op": "11111000|001|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpa Xs, Xd, [Xn|SP]" , "op": "11111000|101|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpal Xs, Xd, [Xn|SP]" , "op": "11111000|111|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpl Xs, Xd, [Xn|SP]" , "op": "11111000|011|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpb Ws, Wd, [Xn|SP]" , "op": "00111000|001|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpab Ws, Wd, [Xn|SP]" , "op": "00111000|101|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpalb Ws, Wd, [Xn|SP]" , "op": "00111000|111|Rs|1|00000|Rn|Rd"},
+ {"inst": "swplb Ws, Wd, [Xn|SP]" , "op": "00111000|011|Rs|1|00000|Rn|Rd"},
+ {"inst": "swph Ws, Wd, [Xn|SP]" , "op": "01111000|001|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpah Ws, Wd, [Xn|SP]" , "op": "01111000|101|Rs|1|00000|Rn|Rd"},
+ {"inst": "swpalh Ws, Wd, [Xn|SP]" , "op": "01111000|111|Rs|1|00000|Rn|Rd"},
+ {"inst": "swplh Ws, Wd, [Xn|SP]" , "op": "01111000|011|Rs|1|00000|Rn|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MOPS", "data": [
+ {"inst": "cpyfe [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|00001|Rn|Rd"},
+ {"inst": "cpyfm [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|00001|Rn|Rd"},
+ {"inst": "cpyfp [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|00001|Rn|Rd"},
+ {"inst": "cpyfen [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|10001|Rn|Rd"},
+ {"inst": "cpyfmn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|10001|Rn|Rd"},
+ {"inst": "cpyfpn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|10001|Rn|Rd"},
+ {"inst": "cpyfern [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|00001|Rn|Rd"},
+ {"inst": "cpyfmrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|00001|Rn|Rd"},
+ {"inst": "cpyfprn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|00001|Rn|Rd"},
+ {"inst": "cpyfert [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyfmrt [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyfprt [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyfert [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyfmrt [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyfprt [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyfertn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|11001|Rn|Rd"},
+ {"inst": "cpyfmrtn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|11001|Rn|Rd"},
+ {"inst": "cpyfprtn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|11001|Rn|Rd"},
+ {"inst": "cpyfertrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|01001|Rn|Rd"},
+ {"inst": "cpyfmrtrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|01001|Rn|Rd"},
+ {"inst": "cpyfprtrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|01001|Rn|Rd"},
+ {"inst": "cpyfertwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|11001|Rn|Rd"},
+ {"inst": "cpyfmrtwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|11001|Rn|Rd"},
+ {"inst": "cpyfprtwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|11001|Rn|Rd"},
+ {"inst": "cpyfet [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|01101|Rn|Rd"},
+ {"inst": "cpyfmt [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|01101|Rn|Rd"},
+ {"inst": "cpyfpt [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|01101|Rn|Rd"},
+ {"inst": "cpyfetn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|11101|Rn|Rd"},
+ {"inst": "cpyfmtn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|11101|Rn|Rd"},
+ {"inst": "cpyfptn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|11101|Rn|Rd"},
+ {"inst": "cpyfetrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|01101|Rn|Rd"},
+ {"inst": "cpyfmtrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|01101|Rn|Rd"},
+ {"inst": "cpyfptrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|01101|Rn|Rd"},
+ {"inst": "cpyfetwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|11101|Rn|Rd"},
+ {"inst": "cpyfmtwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|11101|Rn|Rd"},
+ {"inst": "cpyfptwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|11101|Rn|Rd"},
+ {"inst": "cpyfewn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|10001|Rn|Rd"},
+ {"inst": "cpyfmwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|10001|Rn|Rd"},
+ {"inst": "cpyfpwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|10001|Rn|Rd"},
+ {"inst": "cpyfewt [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|00101|Rn|Rd"},
+ {"inst": "cpyfmwt [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|00101|Rn|Rd"},
+ {"inst": "cpyfpwt [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|00101|Rn|Rd"},
+ {"inst": "cpyfewtn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|10101|Rn|Rd"},
+ {"inst": "cpyfmwtn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|10101|Rn|Rd"},
+ {"inst": "cpyfpwtn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|10101|Rn|Rd"},
+ {"inst": "cpyfewtrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|1|00101|Rn|Rd"},
+ {"inst": "cpyfmwtrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|1|00101|Rn|Rd"},
+ {"inst": "cpyfpwtrn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|1|00101|Rn|Rd"},
+ {"inst": "cpyfewtwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|100|Rs|0|10101|Rn|Rd"},
+ {"inst": "cpyfmwtwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|010|Rs|0|10101|Rn|Rd"},
+ {"inst": "cpyfpwtwn [Xd]!, [Xs]!, Xn!" , "op": "00011001|000|Rs|0|10101|Rn|Rd"},
+ {"inst": "cpye [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|00001|Rn|Rd"},
+ {"inst": "cpym [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|00001|Rn|Rd"},
+ {"inst": "cpyp [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|00001|Rn|Rd"},
+ {"inst": "cpyen [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|10001|Rn|Rd"},
+ {"inst": "cpymn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|10001|Rn|Rd"},
+ {"inst": "cpypn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|10001|Rn|Rd"},
+ {"inst": "cpyern [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|00001|Rn|Rd"},
+ {"inst": "cpymrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|00001|Rn|Rd"},
+ {"inst": "cpyprn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|00001|Rn|Rd"},
+ {"inst": "cpyert [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpymrt [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyprt [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|01001|Rn|Rd"},
+ {"inst": "cpyertn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|11001|Rn|Rd"},
+ {"inst": "cpymrtn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|11001|Rn|Rd"},
+ {"inst": "cpyprtn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|11001|Rn|Rd"},
+ {"inst": "cpyertrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|01001|Rn|Rd"},
+ {"inst": "cpymrtrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|01001|Rn|Rd"},
+ {"inst": "cpyprtrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|01001|Rn|Rd"},
+ {"inst": "cpyertwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|11001|Rn|Rd"},
+ {"inst": "cpymrtwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|11001|Rn|Rd"},
+ {"inst": "cpyprtwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|11001|Rn|Rd"},
+ {"inst": "cpyet [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|01101|Rn|Rd"},
+ {"inst": "cpymt [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|01101|Rn|Rd"},
+ {"inst": "cpypt [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|01101|Rn|Rd"},
+ {"inst": "cpyetn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|11101|Rn|Rd"},
+ {"inst": "cpymtn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|11101|Rn|Rd"},
+ {"inst": "cpyptn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|11101|Rn|Rd"},
+ {"inst": "cpyetrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|01101|Rn|Rd"},
+ {"inst": "cpymtrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|01101|Rn|Rd"},
+ {"inst": "cpyptrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|01101|Rn|Rd"},
+ {"inst": "cpyetwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|11101|Rn|Rd"},
+ {"inst": "cpymtwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|11101|Rn|Rd"},
+ {"inst": "cpyptwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|11101|Rn|Rd"},
+ {"inst": "cpyewn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|10001|Rn|Rd"},
+ {"inst": "cpymwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|10001|Rn|Rd"},
+ {"inst": "cpypwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|10001|Rn|Rd"},
+ {"inst": "cpyewt [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|00101|Rn|Rd"},
+ {"inst": "cpymwt [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|00101|Rn|Rd"},
+ {"inst": "cpypwt [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|00101|Rn|Rd"},
+ {"inst": "cpyewtn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|10101|Rn|Rd"},
+ {"inst": "cpymwtn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|10101|Rn|Rd"},
+ {"inst": "cpypwtn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|10101|Rn|Rd"},
+ {"inst": "cpyewtrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|1|00101|Rn|Rd"},
+ {"inst": "cpymwtrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|1|00101|Rn|Rd"},
+ {"inst": "cpypwtrn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|1|00101|Rn|Rd"},
+ {"inst": "cpyewtwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|100|Rs|0|10101|Rn|Rd"},
+ {"inst": "cpymwtwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|010|Rs|0|10101|Rn|Rd"},
+ {"inst": "cpypwtwn [Xd]!, [Xs]!, Xn!" , "op": "00011101|000|Rs|0|10101|Rn|Rd"},
+ {"inst": "setge [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|1|00001|Rn|Rd"},
+ {"inst": "setgm [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|10001|Rn|Rd"},
+ {"inst": "setgp [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|00001|Rn|Rd"},
+ {"inst": "setgen [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|1|01001|Rn|Rd"},
+ {"inst": "setgmn [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|11001|Rn|Rd"},
+ {"inst": "setgpn [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|01001|Rn|Rd"},
+ {"inst": "setget [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|1|00101|Rn|Rd"},
+ {"inst": "setgmt [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|10101|Rn|Rd"},
+ {"inst": "setgpt [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|00101|Rn|Rd"},
+ {"inst": "setgetn [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|1|01101|Rn|Rd"},
+ {"inst": "setgmtn [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|11101|Rn|Rd"},
+ {"inst": "setgptn [Xd]!, Xn!, Xs" , "op": "00011101|110|Rs|0|01101|Rn|Rd"},
+ {"inst": "sete [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|1|00001|Rn|Rd"},
+ {"inst": "setm [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|10001|Rn|Rd"},
+ {"inst": "setp [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|00001|Rn|Rd"},
+ {"inst": "seten [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|1|01001|Rn|Rd"},
+ {"inst": "setmn [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|11001|Rn|Rd"},
+ {"inst": "setpn [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|01001|Rn|Rd"},
+ {"inst": "setet [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|1|00101|Rn|Rd"},
+ {"inst": "setmt [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|10101|Rn|Rd"},
+ {"inst": "setpt [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|00101|Rn|Rd"},
+ {"inst": "setetn [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|1|01101|Rn|Rd"},
+ {"inst": "setmtn [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|11101|Rn|Rd"},
+ {"inst": "setptn [Xd]!, Xn!, Xs" , "op": "00011001|110|Rs|0|01101|Rn|Rd"}
+ ]},
+
+ {"category": "GP MTE", "ext": "MTE", "data": [
+ {"inst": "addg Xd|SP, Xn|SP, #imm1, #imm2" , "op": "10010001|10|imm1:6|00|imm2:4|Rn|Rd"},
+ {"inst": "cmpp Xn|SP, Xm|SP" , "op": "10111010|110|Rm|000000|Rn|11111"},
+ {"inst": "gmi Xd, Xn|SP, Xm" , "op": "10011010|110|Rm|000101|Rn|Rd"},
+ {"inst": "irg Xd, Xn|SP, Xm" , "op": "10011010|110|Rm|000100|Rn|Rd"},
+ {"inst": "ldg Xd, [Xn|SP, #offS*16]" , "op": "11011001|011|offS:9|00|Rn|Rd"},
+ {"inst": "st2g Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|101|offS:9|!post|W|Rn|Rs"},
+ {"inst": "stg Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|001|offS:9|!post|W|Rn|Rs"},
+ {"inst": "stgp Xs, Xs2, [Xn|SP, #offS*16]{@}{!}" , "op": "0110100|!post|W|0|offS:7|Rs2|Rn|Rs"},
+ {"inst": "stz2g Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|111|offS:9|!post|W|Rn|Rs"},
+ {"inst": "stzg Xs|SP, [Xn|SP, #offS*16]{@}{!}" , "op": "11011001|011|offS:9|!post|W|Rn|Rs"},
+ {"inst": "subg Xd|SP, Xn|SP, #imm1, #imm2" , "op": "11010001|10|imm1:6|00|imm2:4|Rn|Rd"},
+ {"inst": "subp Xd, Xn|SP, Xm|SP" , "op": "10011010|110|Rm|0|00000|Rn|Rd"},
+ {"inst": "subps Xd, Xn|SP, Xm|SP" , "op": "10011010|110|Rm|0|00000|Rn|Rd" , "io": "N=W Z=W C=W V=W"}
+ ]},
+
+ {"category": "GP MTE", "ext": "MTE2", "data": [
+ {"inst": "ldgm Xd, [Xn|SP]" , "op": "11011001|111|00000|0|00000|Rn|Rd"},
+ {"inst": "stgm Xs, [Xn|SP]" , "op": "11011001|101|00000|0|00000|Rn|Rs"},
+ {"inst": "stzgm Xs, [Xn|SP]" , "op": "11011001|001|00000|0|00000|Rn|Rs"}
+ ]},
+
+ {"category": "GP PAUTH", "ext": "PAUTH", "data": [
+ {"inst": "autda Xd, Xn|SP" , "op": "11011010|110|00001|000110|Rn|Rd"},
+ {"inst": "autdb Xd, Xn|SP" , "op": "11011010|110|00001|000111|Rn|Rd"},
+ {"inst": "autdza Xd" , "op": "11011010|110|00001|001110|11111|Rd"},
+ {"inst": "autdzb Xd" , "op": "11011010|110|00001|001111|11111|Rd"},
+ {"inst": "autia Xd, Xn|SP" , "op": "11011010|110|00001|000100|Rn|Rd"},
+ {"inst": "autia1716" , "op": "11010101|000|00011|0010|0001|100|11111"},
+ {"inst": "autiasp" , "op": "11010101|000|00011|0010|0011|101|11111"},
+ {"inst": "autiaz" , "op": "11010101|000|00011|0010|0011|100|11111"},
+ {"inst": "autib Xd, Xn|SP" , "op": "11011010|110|00001|000101|Rn|Rd"},
+ {"inst": "autib1716" , "op": "11010101|000|00011|0010|0001|110|11111"},
+ {"inst": "autibsp" , "op": "11010101|000|00011|0010|0011|111|11111"},
+ {"inst": "autibz" , "op": "11010101|000|00011|0010|0011|110|11111"},
+ {"inst": "autiza Xd" , "op": "11011010|110|00001|001100|11111|Rd"},
+ {"inst": "autizb Xd" , "op": "11011010|110|00001|001101|11111|Rd"},
+ {"inst": "blraa Xn, Xm|SP" , "op": "11010111|001|11111|0000|10|Rn|Rm" , "control": "call"},
+ {"inst": "blraaz Xn" , "op": "11010110|001|11111|0000|10|Rn|11111" , "control": "call"},
+ {"inst": "blrab Xn, Xm|SP" , "op": "11010111|001|11111|0000|11|Rn|Rm" , "control": "call"},
+ {"inst": "blrabz Xn" , "op": "11010110|001|11111|0000|11|Rn|11111" , "control": "call"},
+ {"inst": "braa Xn, Xm|SP" , "op": "11010111|000|11111|0000|10|Rn|Rm" , "control": "call"},
+ {"inst": "braaz Xn" , "op": "11010110|000|11111|0000|10|Rn|11111" , "control": "call"},
+ {"inst": "brab Xn, Xm|SP" , "op": "11010111|000|11111|0000|11|Rn|Rm" , "control": "call"},
+ {"inst": "brabz Xn" , "op": "11010110|000|11111|0000|11|Rn|11111" , "control": "call"},
+ {"inst": "eretaa" , "op": "11010110|100|11111|0000|10|11111|11111" , "control": "return"},
+ {"inst": "eretab" , "op": "11010110|100|11111|0000|11|11111|11111" , "control": "return"},
+ {"inst": "ldraa Xd, [Xn|SP, #offS]{!}" , "op": "11111000|0|offS:1|1|offS:9|W1|Rn|Rd"},
+ {"inst": "ldrab Xd, [Xn|SP, #offS]{!}" , "op": "11111000|1|offS:1|1|offS:9|W1|Rn|Rd"},
+ {"inst": "pacda Xd, Xn|SP" , "op": "11011010|110|00001|0|00010|Rn|Rd"},
+ {"inst": "pacdb Xd, Xn|SP" , "op": "11011010|110|00001|0|00011|Rn|Rd"},
+ {"inst": "pacdza Xd" , "op": "11011010|110|00001|0|01010|11111|Rd"},
+ {"inst": "pacdzb Xd" , "op": "11011010|110|00001|0|01011|11111|Rd"},
+ {"inst": "pacga Xd, Xn, Xm|SP" , "op": "10011010|110|Rm|0|01100|Rn|Rd"},
+ {"inst": "pacia Xd, Xn|SP" , "op": "11011010|110|00001|0|00000|Rn|Rd"},
+ {"inst": "pacia1716" , "op": "11010101|000|00011|0010|0001|000|11111"},
+ {"inst": "paciasp" , "op": "11010101|000|00011|0010|0011|001|11111"},
+ {"inst": "paciaz" , "op": "11010101|000|00011|0010|0011|000|11111"},
+ {"inst": "pacib Xd, Xn|SP" , "op": "11011010|110|00001|0|00001|Rn|Rd"},
+ {"inst": "pacib1716" , "op": "11010101|000|00011|0010|0001|010|11111"},
+ {"inst": "pacibsp" , "op": "11010101|000|00011|0010|0011|011|11111"},
+ {"inst": "pacibz" , "op": "11010101|000|00011|0010|0011|010|11111"},
+ {"inst": "paciza Xd" , "op": "11011010|110|00001|0|01000|11111|Rd"},
+ {"inst": "pacizb Xd" , "op": "11011010|110|00001|0|01001|11111|Rd"},
+ {"inst": "retaa" , "op": "11010110|010|11111|0|00010|11111|11111" , "control": "return"},
+ {"inst": "retab" , "op": "11010110|010|11111|0|00011|11111|11111" , "control": "return"},
+ {"inst": "xpacd Xd" , "op": "11011010|110|00001|0|10001|11111|Rd"},
+ {"inst": "xpaci Xd" , "op": "11011010|110|00001|0|10000|11111|Rd"},
+ {"inst": "xpaclri Xd" , "op": "11010101|000|00011|0|01000|00111|11111"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RAS", "data": [
+ {"inst": "esb" , "op": "11010101|000|00011|0010|0010|000|11111"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RPRFM", "data": [
+ {"inst": "rprfm #rprf_op, Xm, [Xn|SP]" , "op": "11111000|101|Rm|imm:1|1|imm:2|10|Rn|11|imm:3" , "imm": "ImmRPRF(rprf_op)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SB", "data": [
+ {"inst": "sb" , "op": "11010101|000|00011|0011|0000|111|11111"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SPE", "data": [
+ {"inst": "psb #psb_tsb_op" , "op": "11010101|000|00011|0010|0010|001|11111" , "imm": "ImmPSB_TSB(psb_tsb_op)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SPECRES", "data": [
+ {"inst": "cfp #rctx, Xt" , "op": "11010101|000|01011|0111|0011|100|Rt" , "imm": "ImmRCTX(rctx)"},
+ {"inst": "cpp #rctx, Xt" , "op": "11010101|000|01011|0111|0011|111|Rt" , "imm": "ImmRCTX(rctx)"},
+ {"inst": "dvp #rctx, Xt" , "op": "11010101|000|01|011|0111|0011|101|Rt" , "imm": "ImmRCTX(rctx)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SPECRES2", "data": [
+ {"inst": "cosp #rctx, Xt" , "op": "11010101|000|01011|0111|0011|110|Rt" , "imm": "ImmRCTX(rctx)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SYSINSTR128", "data": [
+ {"inst": "sysp #op1, #CRn, #CRm, #op2, 2x{Xt}+" , "op": "11010101|010|01|op1:3|CRn|CRm|op2:3|Rt"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SYSREG128", "data": [
+ {"inst": "mrrs 2x{Xd}+, #sysreg" , "op": "11010101|011|1|sysreg:15|Rd"},
+ {"inst": "msrr 2x{Xs}+, #sysreg" , "op": "11010101|010|1|sysreg:15|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "THE", "data": [
+ {"inst": "rcwcas Xs, Xt, [Xn|SP]" , "op": "00011001|001|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwcasa Xs, Xt, [Xn|SP]" , "op": "00011001|101|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwcasal Xs, Xt, [Xn|SP]" , "op": "00011001|111|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwcasl Xs, Xt, [Xn|SP]" , "op": "00011001|011|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwcasp 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "00011001|001|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwcaspa 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "00011001|101|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwcaspal 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "00011001|111|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwcaspl 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "00011001|011|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwclr Xs, Xt, [Xn|SP]" , "op": "00111000|001|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwclra Xs, Xt, [Xn|SP]" , "op": "00111000|101|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwclral Xs, Xt, [Xn|SP]" , "op": "00111000|111|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwclrl Xs, Xt, [Xn|SP]" , "op": "00111000|011|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwclrp Xt, Xt2, [Xn|SP]" , "op": "00011001|001|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwclrpa Xt, Xt2, [Xn|SP]" , "op": "00011001|101|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwclrpal Xt, Xt2, [Xn|SP]" , "op": "00011001|111|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwclrpl Xt, Xt2, [Xn|SP]" , "op": "00011001|011|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwscas Xs, Xt, [Xn|SP]" , "op": "01011001|001|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwscasa Xs, Xt, [Xn|SP]" , "op": "01011001|101|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwscasal Xs, Xt, [Xn|SP]" , "op": "01011001|111|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwscasl Xs, Xt, [Xn|SP]" , "op": "01011001|011|Rs|0|00010|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwscasp 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "01011001|001|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwscaspa 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "01011001|101|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwscaspal 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "01011001|111|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwscaspl 2x{Xs}+, 2x{Xt}+, [Xn|SP]" , "op": "01011001|011|Rs|0|00011|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsclr Xs, Xt, [Xn|SP]" , "op": "01111000|001|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsclra Xs, Xt, [Xn|SP]" , "op": "01111000|101|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsclral Xs, Xt, [Xn|SP]" , "op": "01111000|111|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsclrl Xs, Xt, [Xn|SP]" , "op": "01111000|011|Rs|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsclrp Xt, Xt2, [Xn|SP]" , "op": "01011001|001|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsclrpa Xt, Xt2, [Xn|SP]" , "op": "01011001|101|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsclrpal Xt, Xt2, [Xn|SP]" , "op": "01011001|111|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsclrpl Xt, Xt2, [Xn|SP]" , "op": "01011001|011|Rt2|1|00100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwset Xs, Xt, [Xn|SP]" , "op": "00111000|001|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwseta Xs, Xt, [Xn|SP]" , "op": "00111000|101|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsetal Xs, Xt, [Xn|SP]" , "op": "00111000|111|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsetl Xs, Xt, [Xn|SP]" , "op": "00111000|011|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsetp Xt, Xt2, [Xn|SP]" , "op": "00011001|001|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsetpa Xt, Xt2, [Xn|SP]" , "op": "00011001|101|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsetpal Xt, Xt2, [Xn|SP]" , "op": "00011001|111|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsetpl Xt, Xt2, [Xn|SP]" , "op": "00011001|011|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsset Xs, Xt, [Xn|SP]" , "op": "01111000|001|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsseta Xs, Xt, [Xn|SP]" , "op": "01111000|101|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwssetal Xs, Xt, [Xn|SP]" , "op": "01111000|111|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwssetl Xs, Xt, [Xn|SP]" , "op": "01111000|011|Rs|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwssetp Xt, Xt2, [Xn|SP]" , "op": "01011001|001|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwssetpa Xt, Xt2, [Xn|SP]" , "op": "01011001|101|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwssetpal Xt, Xt2, [Xn|SP]" , "op": "01011001|111|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwssetpl Xt, Xt2, [Xn|SP]" , "op": "01011001|011|Rt2|1|01100|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsswp Xs, Xt, [Xn|SP]" , "op": "01111000|001|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsswpa Xs, Xt, [Xn|SP]" , "op": "01111000|101|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsswpal Xs, Xt, [Xn|SP]" , "op": "01111000|111|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsswpl Xs, Xt, [Xn|SP]" , "op": "01111000|011|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwsswpp Xt, Xt2, [Xn|SP]" , "op": "01011001|001|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsswppa Xt, Xt2, [Xn|SP]" , "op": "01011001|101|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsswppal Xt, Xt2, [Xn|SP]" , "op": "01011001|111|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwsswppl Xt, Xt2, [Xn|SP]" , "op": "01011001|011|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwswp Xs, Xt, [Xn|SP]" , "op": "00111000|001|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwswpa Xs, Xt, [Xn|SP]" , "op": "00111000|101|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwswpal Xs, Xt, [Xn|SP]" , "op": "00111000|111|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwswpl Xs, Xt, [Xn|SP]" , "op": "00111000|011|Rs|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rcwswpp Xt, Xt2, [Xn|SP]" , "op": "00011001|001|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwswppa Xt, Xt2, [Xn|SP]" , "op": "00011001|101|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwswppal Xt, Xt2, [Xn|SP]" , "op": "00011001|111|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"},
+ {"inst": "rcwswppl Xt, Xt2, [Xn|SP]" , "op": "00011001|011|Rt2|1|01000|Rn|Rt" , "io": "N=W Z=W C=W V=W", "ext": "D128"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "TME", "data": [
+ {"inst": "tcancel #imm" , "op": "11010100|011|imm:16|00000"},
+ {"inst": "tcommit" , "op": "11010101|000|00011|0011|0000|011|11111"},
+ {"inst": "tstart Xt" , "op": "11010101|001|00011|0011|0000|011|Rt"},
+ {"inst": "ttest Xd" , "op": "11010101|001|00011|0011|0001|011|Rd"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "TRF", "data": [
+ {"inst": "tsb #psb_tsb_op" , "op": "11010101|000|00011|0010|0010|010|11111" , "imm": "ImmPSB_TSB(psb_tsb_op)"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "WFXT", "data": [
+ {"inst": "wfet Xs" , "op": "11010101|000|00011|0001|0000|000|Rs"},
+ {"inst": "wfit Xs" , "op": "11010101|000|00011|0001|0000|001|Rs"}
+ ]},
+
+ {"category": "ASIMD", "ext": "ASIMD", "data": [
+ {"inst": "abs Dd, Dn" , "op": "01011110|11|10000|01011|10|Vn|Vd"},
+ {"inst": "abs Vd.t, Vn.t" , "op": "00001110|sz|10000|01011|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "abs Vd.t, Vn.t" , "op": "01001110|sz|10000|01011|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "add Dd, Dn, Dm" , "op": "01011110|11|1|Vm|10000|1|Vn|Vd"},
+ {"inst": "add Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10000|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "add Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10000|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "addhn Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|01000|0|Vn|Vd" , "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "addhn2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|01000|0|Vn|Vx" , "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "addp Dd, Vn.2D" , "op": "01011110|sz|11000|11011|10|Vn|Vd"},
+ {"inst": "addp Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10111|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "addp Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10111|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "addv Bd, Vn.8B" , "op": "00001110|00|11000|11011|10|Vn|Vd"},
+ {"inst": "addv Bd, Vn.16B" , "op": "01001110|00|11000|11011|10|Vn|Vd"},
+ {"inst": "addv Hd, Vn.4H" , "op": "00001110|01|11000|11011|10|Vn|Vd"},
+ {"inst": "addv Hd, Vn.8H" , "op": "01001110|01|11000|11011|10|Vn|Vd"},
+ {"inst": "addv Sd, Vn.4S" , "op": "01001110|10|11000|11011|10|Vn|Vd"},
+ {"inst": "and Vd.8B, Vn.8B, Vm.8B" , "op": "00001110|00|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "and Vd.16B, Vn.16B, Vm.16B" , "op": "01001110|00|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "bic Vd.8B, Vn.8B, Vm.8B" , "op": "00001110|01|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "bic Vd.16B, Vn.16B, Vm.16B" , "op": "01001110|01|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "bic Vd.t, #imm, {lsl #n}" , "op": "00101111|00000|abc:3|cmode:4|01|defgh:5|Vd" , "t": "4H 2S", "imm": "ASimdLogicalImm(sz, 1, imm, lsl)"},
+ {"inst": "bic Vd.t, #imm, {lsl #n}" , "op": "01101111|00000|abc:3|cmode:4|01|defgh:5|Vd" , "t": "8H 4S", "imm": "ASimdLogicalImm(sz, 1, imm, lsl)"},
+ {"inst": "bif Dx.8B, Vn.8B, Vm.8B" , "op": "00101111|11|1|Vm|00011|1|Vn|Vx"},
+ {"inst": "bif Vx.16B, Vn.16B, Vm.16B" , "op": "01101111|11|1|Vm|00011|1|Vn|Vx"},
+ {"inst": "bit Dx.8B, Vn.8B, Vm.8B" , "op": "00101111|10|1|Vm|00011|1|Vn|Vx"},
+ {"inst": "bit Vx.16B, Vn.16B, Vm.16B" , "op": "01101111|10|1|Vm|00011|1|Vn|Vx"},
+ {"inst": "bsl Dx.8B, Vn.8B, Vm.8B" , "op": "00101111|01|1|Vm|00011|1|Vn|Vx"},
+ {"inst": "bsl Vx.16B, Vn.16B, Vm.16B" , "op": "01101111|01|1|Vm|00011|1|Vn|Vx"},
+ {"inst": "cls Vd.t, Vn.t" , "op": "00001110|sz|10000|00100|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cls Vd.t, Vn.t" , "op": "01001110|sz|10000|00100|10|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "clz Vd.t, Vn.t" , "op": "00101110|sz|10000|00100|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "clz Vd.t, Vn.t" , "op": "01101110|sz|10000|00100|10|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "cmeq Dd, Dn, Dm" , "op": "01111110|11|1|Vm|10001|1|Vn|Vd"},
+ {"inst": "cmeq Dd, Dn, #0" , "op": "01011110|11|10000|01001|10|Vn|Vd"},
+ {"inst": "cmeq Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10001|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmeq Vd.t, Vn.t, #0" , "op": "00101110|sz|10000|01001|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmeq Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10001|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmeq Vd.t, Vn.t, #0" , "op": "01101110|sz|10000|01001|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmge Dd, Dn, Dm" , "op": "01011110|11|1|Vm|00111|1|Vn|Vd"},
+ {"inst": "cmge Dd, Dn, #0" , "op": "01111110|11|10000|01000|10|Vn|Vd"},
+ {"inst": "cmge Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00111|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmge Vd.t, Vn.t, #0" , "op": "00101110|sz|10000|01000|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmge Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00111|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmge Vd.t, Vn.t, #0" , "op": "01101110|sz|10000|01000|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmgt Dd, Dn, Dm" , "op": "01011110|11|1|Vm|00110|1|Vn|Vd"},
+ {"inst": "cmgt Dd, Dn, #0" , "op": "01011110|11|10000|01000|10|Vn|Vd"},
+ {"inst": "cmgt Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00110|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmgt Vd.t, Vn.t, #0" , "op": "00001110|sz|10000|01000|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmgt Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00110|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmgt Vd.t, Vn.t, #0" , "op": "01001110|sz|10000|01000|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmhi Dd, Dn, Dm" , "op": "01111110|11|1|Vm|00110|1|Vn|Vd"},
+ {"inst": "cmhi Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00110|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmhi Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00110|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmhs Dd, Dn, Dm" , "op": "01111110|11|1|Vm|00111|1|Vn|Vd"},
+ {"inst": "cmhs Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00111|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmhs Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00111|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmle Dd, Dn, #0" , "op": "01111110|11|10000|01001|10|Vn|Vd"},
+ {"inst": "cmle Vd.t, Vn.t, #0" , "op": "00101110|sz|10000|01001|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmle Vd.t, Vn.t, #0" , "op": "01101110|sz|10000|01001|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmlt Dd, Dn, #0" , "op": "01011110|11|10000|01010|10|Vn|Vd"},
+ {"inst": "cmlt Vd.t, Vn.t, #0" , "op": "00001110|sz|10000|01010|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmlt Vd.t, Vn.t, #0" , "op": "01001110|sz|10000|01010|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cmtst Dd, Dn, Dm" , "op": "01011110|11|1|Vm|10001|1|Vn|Vd"},
+ {"inst": "cmtst Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10001|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "cmtst Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10001|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "cnt Vd.8B, Vn.8B" , "op": "00001110|sz|10000|00101|10|Vn|Vd"},
+ {"inst": "cnt Vd.16B, Vn.16B" , "op": "01001110|sz|10000|00101|10|Vn|Vd"},
+ {"inst": "dup|mov Bd, Vn.B[#idx]" , "op": "01011110|00|0|idx:4| 1|00000|1|Vn|Vd"},
+ {"inst": "dup|mov Hd, Vn.H[#idx]" , "op": "01011110|00|0|idx:3| 10|00000|1|Vn|Vd"},
+ {"inst": "dup|mov Sd, Vn.S[#idx]" , "op": "01011110|00|0|idx:2| 100|00000|1|Vn|Vd"},
+ {"inst": "dup|mov Dd, Vn.D[#idx]" , "op": "01011110|00|0|idx:1| 1000|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.8B, Wn" , "op": "00001110|00|0|00001|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.4H, Wn" , "op": "00001110|00|0|00010|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.2S, Wn" , "op": "00001110|00|0|11011|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.16B, Wn" , "op": "01001110|00|0|00001|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.8H, Wn" , "op": "01001110|00|0|00010|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.4S, Wn" , "op": "01001110|00|0|11011|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.2D, Xn" , "op": "01001110|00|0|11011|00001|1|Rn|Vd"},
+ {"inst": "dup Vd.8B, Vn.B[#idx]" , "op": "00001110|00|0|idx:4| 1|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.4H, Vn.H[#idx]" , "op": "00001110|00|0|idx:3| 10|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.2S, Vn.S[#idx]" , "op": "00001110|00|0|idx:2| 100|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.16B, Vn.B[#idx]" , "op": "01001110|00|0|idx:4| 1|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.8H, Vn.H[#idx]" , "op": "01001110|00|0|idx:3| 10|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.4S, Vn.S[#idx]" , "op": "01001110|00|0|idx:2| 100|00000|1|Vn|Vd"},
+ {"inst": "dup Vd.2D, Vn.D[#idx]" , "op": "01001110|00|0|idx:1| 1000|00000|1|Vn|Vd"},
+ {"inst": "eor Vd.8B, Vn.8B, Vm.8B" , "op": "00101110|00|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "eor Vd.16B, Vn.16B, Vm.16B" , "op": "01101110|00|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "ext Vd.8B, Vn.8B, Vm.8B, #idx" , "op": "00101110|00|0|Vm|00|idx:3|0|Vn|Vd"},
+ {"inst": "ext Vd.16B, Vn.16B, Vm.16B, #idx" , "op": "01101110|00|0|Vm|0|idx:4|0|Vn|Vd"},
+ {"inst": "fabd Sd, Sn, Sm" , "op": "01111110|10|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fabd Dd, Dn, Dm" , "op": "01111110|11|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fabd Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|0|Vm|11010|1|Vn|Vd"},
+ {"inst": "fabd Vd.4S, Vn.4S, Vm.4S" , "op": "00101110|10|0|Vm|11010|1|Vn|Vd"},
+ {"inst": "fabd Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|0|Vm|11010|1|Vn|Vd"},
+ {"inst": "fabs Sd, Sn" , "op": "00011110|00|10000|01100|00|Vn|Vd"},
+ {"inst": "fabs Dd, Dn" , "op": "00011110|01|10000|01100|00|Vn|Vd"},
+ {"inst": "fabs Vd.2S, Vn.2S" , "op": "00001110|10|10000|01111|10|Vn|Vd"},
+ {"inst": "fabs Vd.4S, Vn.4S" , "op": "01001110|10|10000|01111|10|Vn|Vd"},
+ {"inst": "fabs Vd.2D, Vn.2D" , "op": "01001110|11|10000|01111|10|Vn|Vd"},
+ {"inst": "facge Sd, Sn, Sm" , "op": "01111110|00|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facge Dd, Dn, Dm" , "op": "01111110|01|0|Vm|11101|1|Vn|Vd"},
+ {"inst": "facge Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facge Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facge Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facgt Sd, Sn, Sm" , "op": "01111110|10|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facgt Dd, Dn, Dm" , "op": "01111110|11|0|Vm|11101|1|Vn|Vd"},
+ {"inst": "facgt Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facgt Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|10|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "facgt Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|1|Vm|11101|1|Vn|Vd"},
+ {"inst": "fadd Sd, Sn, Sm" , "op": "00011110|00|1|Vm|00101|0|Vn|Vd"},
+ {"inst": "fadd Dd, Dn, Dm" , "op": "00011110|01|1|Vm|00101|0|Vn|Vd"},
+ {"inst": "fadd Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fadd Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fadd Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "faddp Sd, Vn.2S" , "op": "01111110|00|11000|01101|10|Vn|Vd"},
+ {"inst": "faddp Dd, Vn.2D" , "op": "01111110|01|11000|01101|10|Vn|Vd"},
+ {"inst": "faddp Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "faddp Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "faddp Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fccmp Sn, Sm, #nzcv, #cond" , "op": "00011110|00|1|Vm|cond|01|Vn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fccmp Dn, Dm, #nzcv, #cond" , "op": "00011110|01|1|Vm|cond|01|Vn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fccmpe Sn, Sm, #nzcv, #cond" , "op": "00011110|00|1|Vm|cond|01|Vn|1|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fccmpe Dn, Dm, #nzcv, #cond" , "op": "00011110|01|1|Vm|cond|01|Vn|1|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmeq Sd, Sn, Sm" , "op": "01011110|00|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmeq Sd, Sn, #0" , "op": "01011110|10|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmeq Dd, Dn, Dm" , "op": "01011110|01|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmeq Dd, Dn, #0" , "op": "01011110|11|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmeq Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmeq Vd.2S, Vn.2S, #0" , "op": "00001110|10|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmeq Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmeq Vd.4S, Vn.4S, #0" , "op": "01001110|10|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmeq Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmeq Vd.2D, Vn.2D, #0" , "op": "01001110|11|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmge Sd, Sn, Sm" , "op": "01111110|00|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmge Sd, Sn, #0" , "op": "01111110|10|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmge Dd, Dn, Dm" , "op": "01111110|01|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmge Dd, Dn, #0" , "op": "01111110|11|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmge Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmge Vd.2S, Vn.2S, #0" , "op": "00101110|10|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmge Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmge Vd.4S, Vn.4S, #0" , "op": "01101110|10|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmge Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmge Vd.2D, Vn.2D, #0" , "op": "01101110|11|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Sd, Sn, Sm" , "op": "01111110|10|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmgt Sd, Sn, #0" , "op": "01011110|10|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Dd, Dn, Dm" , "op": "01111110|11|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmgt Dd, Dn, #0" , "op": "01011110|11|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmgt Vd.2S, Vn.2S, #0" , "op": "00001110|10|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|10|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmgt Vd.4S, Vn.4S, #0" , "op": "01001110|10|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|1|Vm|11100|1|Vn|Vd"},
+ {"inst": "fcmgt Vd.2D, Vn.2D, #0" , "op": "01001110|11|10000|01100|10|Vn|Vd"},
+ {"inst": "fcmle Sd, Sn, #0" , "op": "01111110|10|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmle Dd, Dn, #0" , "op": "01111110|11|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmle Vd.2S, Vn.2S, #0" , "op": "00101110|10|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmle Vd.4S, Vn.4S, #0" , "op": "01101110|10|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmle Vd.2D, Vn.2D, #0" , "op": "01101110|11|10000|01101|10|Vn|Vd"},
+ {"inst": "fcmlt Sd, Sn, #0" , "op": "01011110|10|10000|01110|10|Vn|Vd"},
+ {"inst": "fcmlt Dd, Dn, #0" , "op": "01011110|11|10000|01110|10|Vn|Vd"},
+ {"inst": "fcmlt Vd.2S, Vn.2S, #0" , "op": "00001110|10|10000|01110|10|Vn|Vd"},
+ {"inst": "fcmlt Vd.4S, Vn.4S, #0" , "op": "01001110|10|10000|01110|10|Vn|Vd"},
+ {"inst": "fcmlt Vd.2D, Vn.2D, #0" , "op": "01001110|11|10000|01110|10|Vn|Vd"},
+ {"inst": "fcmp Sn, Sm" , "op": "00011110|00|1|Vm|00100|0|Vn|00000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmp Sn, #0" , "op": "00011110|00|1|00000|00100|0|Vn|01000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmp Dn, Dm" , "op": "00011110|01|1|Vm|00100|0|Vn|00000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmp Dn, #0" , "op": "00011110|01|1|00000|00100|0|Vn|01000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmpe Sn, Sm" , "op": "00011110|00|1|Vm|00100|0|Vn|10000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmpe Sn, #0" , "op": "00011110|00|1|00000|00100|0|Vn|11000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmpe Dn, Dm" , "op": "00011110|01|1|Vm|00100|0|Vn|10000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmpe Dn, #0" , "op": "00011110|01|1|00000|00100|0|Vn|11000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcsel Sd, Sn, Sm, #cond" , "op": "00011110|00|1|Vm|cond|11|Vn|Vd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "fcsel Dd, Dn, Dm, #cond" , "op": "00011110|01|1|Vm|cond|11|Vn|Vd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "fcvt Sd, Hn" , "op": "00011110|11|10001|00100|00|Vn|Vd"},
+ {"inst": "fcvt Dd, Hn" , "op": "00011110|11|10001|01100|00|Vn|Vd"},
+ {"inst": "fcvt Hd, Sn" , "op": "00011110|00|10001|11100|00|Vn|Vd"},
+ {"inst": "fcvt Dd, Sn" , "op": "00011110|00|10001|01100|00|Vn|Vd"},
+ {"inst": "fcvt Hd, Dn" , "op": "00011110|01|10001|11100|00|Vn|Vd"},
+ {"inst": "fcvt Sd, Dn" , "op": "00011110|01|10001|00100|00|Vn|Vd"},
+ {"inst": "fcvtas Wd, Sn" , "op": "00011110|00|10010|00000|00|Vn|Rd"},
+ {"inst": "fcvtas Xd, Sn" , "op": "10011110|00|10010|00000|00|Vn|Rd"},
+ {"inst": "fcvtas Wd, Dn" , "op": "00011110|01|10010|00000|00|Vn|Rd"},
+ {"inst": "fcvtas Xd, Dn" , "op": "10011110|01|10010|00000|00|Vn|Rd"},
+ {"inst": "fcvtas Sd, Sn" , "op": "01011110|00|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtas Dd, Dn" , "op": "01011110|01|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtas Vd.2S, Vn.2S" , "op": "00001110|00|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtas Vd.4S, Vn.4S" , "op": "01001110|00|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtas Vd.2D, Vn.2D" , "op": "01001110|01|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Wd, Sn" , "op": "00011110|00|10010|10000|00|Vn|Rd"},
+ {"inst": "fcvtau Xd, Sn" , "op": "10011110|00|10010|10000|00|Vn|Rd"},
+ {"inst": "fcvtau Wd, Dn" , "op": "00011110|01|10010|10000|00|Vn|Rd"},
+ {"inst": "fcvtau Xd, Dn" , "op": "10011110|01|10010|10000|00|Vn|Rd"},
+ {"inst": "fcvtau Sd, Sn" , "op": "01111110|00|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Dd, Dn" , "op": "01111110|01|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Vd.2S, Vn.2S" , "op": "00101110|00|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Vd.4S, Vn.4S" , "op": "01101110|00|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Vd.2D, Vn.2D" , "op": "01101110|01|10000|11100|10|Vn|Vd"},
+ {"inst": "fcvtl Vd.4S, Vn.4H" , "op": "00001110|00|10000|10111|10|Vn|Vd"},
+ {"inst": "fcvtl2 Vd.4S, Vn.8H" , "op": "01001110|00|10000|10111|10|Vn|Vd"},
+ {"inst": "fcvtl Vd.2D, Vn.2S" , "op": "00001110|01|10000|10111|10|Vn|Vd"},
+ {"inst": "fcvtl2 Vd.2D, Vn.4S" , "op": "01001110|01|10000|10111|10|Vn|Vd"},
+ {"inst": "fcvtms Wd, Sn" , "op": "00011110|00|11000|00000|00|Vn|Rd"},
+ {"inst": "fcvtms Xd, Sn" , "op": "10011110|00|11000|00000|00|Vn|Rd"},
+ {"inst": "fcvtms Wd, Dn" , "op": "00011110|01|11000|00000|00|Vn|Rd"},
+ {"inst": "fcvtms Xd, Dn" , "op": "10011110|01|11000|00000|00|Vn|Rd"},
+ {"inst": "fcvtms Sd, Sn" , "op": "01011110|00|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtms Dd, Dn" , "op": "01011110|01|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtms Vd.2S, Vn.2S" , "op": "00001110|00|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtms Vd.4S, Vn.4S" , "op": "01001110|00|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtms Vd.2D, Vn.2D" , "op": "01001110|01|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Wd, Sn" , "op": "00011110|00|11000|10000|00|Vn|Rd"},
+ {"inst": "fcvtmu Xd, Sn" , "op": "10011110|00|11000|10000|00|Vn|Rd"},
+ {"inst": "fcvtmu Wd, Dn" , "op": "00011110|01|11000|10000|00|Vn|Rd"},
+ {"inst": "fcvtmu Xd, Dn" , "op": "10011110|01|11000|10000|00|Vn|Rd"},
+ {"inst": "fcvtmu Sd, Sn" , "op": "01111110|00|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Dd, Dn" , "op": "01111110|01|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Vd.2S, Vn.2S" , "op": "00101110|00|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Vd.4S, Vn.4S" , "op": "01101110|00|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Vd.2D, Vn.2D" , "op": "01101110|01|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtn Vd.4S, Vn.4H" , "op": "00001110|00|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtn2 Vd.4S, Vn.8H" , "op": "01001110|00|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtn Vd.2D, Vn.2S" , "op": "00001110|01|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtn2 Vd.2D, Vn.4S" , "op": "01001110|01|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtns Wd, Sn" , "op": "00011110|00|10000|00000|00|Vn|Rd"},
+ {"inst": "fcvtns Xd, Sn" , "op": "10011110|00|10000|00000|00|Vn|Rd"},
+ {"inst": "fcvtns Wd, Dn" , "op": "00011110|01|10000|00000|00|Vn|Rd"},
+ {"inst": "fcvtns Xd, Dn" , "op": "10011110|01|10000|00000|00|Vn|Rd"},
+ {"inst": "fcvtns Sd, Sn" , "op": "01011110|00|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtns Dd, Dn" , "op": "01011110|01|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtns Vd.2S, Vn.2S" , "op": "00001110|00|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtns Vd.4S, Vn.4S" , "op": "01001110|00|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtns Vd.2D, Vn.2D" , "op": "01001110|01|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Wd, Sn" , "op": "00011110|00|10000|10000|00|Vn|Rd"},
+ {"inst": "fcvtnu Xd, Sn" , "op": "10011110|00|10000|10000|00|Vn|Rd"},
+ {"inst": "fcvtnu Wd, Dn" , "op": "00011110|01|10000|10000|00|Vn|Rd"},
+ {"inst": "fcvtnu Xd, Dn" , "op": "10011110|01|10000|10000|00|Vn|Rd"},
+ {"inst": "fcvtnu Sd, Sn" , "op": "01111110|00|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Dd, Dn" , "op": "01111110|01|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Vd.2S, Vn.2S" , "op": "00101110|00|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Vd.4S, Vn.4S" , "op": "01101110|00|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Vd.2D, Vn.2D" , "op": "01101110|01|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Wd, Sn" , "op": "00011110|00|10100|00000|00|Vn|Rd"},
+ {"inst": "fcvtps Xd, Sn" , "op": "10011110|00|10100|00000|00|Vn|Rd"},
+ {"inst": "fcvtps Wd, Dn" , "op": "00011110|01|10100|00000|00|Vn|Rd"},
+ {"inst": "fcvtps Xd, Dn" , "op": "10011110|01|10100|00000|00|Vn|Rd"},
+ {"inst": "fcvtps Sd, Sn" , "op": "01011110|10|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Dd, Dn" , "op": "01011110|11|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Vd.2S, Vn.2S" , "op": "00001110|10|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Vd.4S, Vn.4S" , "op": "01001110|10|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Vd.2D, Vn.2D" , "op": "01001110|11|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Wd, Sn" , "op": "00011110|00|10100|10000|00|Vn|Rd"},
+ {"inst": "fcvtpu Xd, Sn" , "op": "10011110|00|10100|10000|00|Vn|Rd"},
+ {"inst": "fcvtpu Wd, Dn" , "op": "00011110|01|10100|10000|00|Vn|Rd"},
+ {"inst": "fcvtpu Xd, Dn" , "op": "10011110|01|10100|10000|00|Vn|Rd"},
+ {"inst": "fcvtpu Sd, Sn" , "op": "01111110|10|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Dd, Dn" , "op": "01111110|11|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Vd.2S, Vn.2S" , "op": "00101110|10|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Vd.4S, Vn.4S" , "op": "01101110|10|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Vd.2D, Vn.2D" , "op": "01101110|11|10000|11010|10|Vn|Vd"},
+ {"inst": "fcvtx Sd, Dn" , "op": "01111110|01|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtx Vd.4S, Vn.4H" , "op": "00101110|00|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtx2 Vd.4S, Vn.8H" , "op": "01101110|00|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtx Vd.2D, Vn.2S" , "op": "00101110|01|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtx2 Vd.2D, Vn.4S" , "op": "01101110|01|10000|10110|10|Vn|Vd"},
+ {"inst": "fcvtzs Wd, Sn" , "op": "00011110|00|11100|00000|00|Vn|Rd"},
+ {"inst": "fcvtzs Xd, Sn" , "op": "10011110|00|11100|00000|00|Vn|Rd"},
+ {"inst": "fcvtzs Wd, Dn" , "op": "00011110|01|11100|00000|00|Vn|Rd"},
+ {"inst": "fcvtzs Xd, Dn" , "op": "10011110|01|11100|00000|00|Vn|Rd"},
+ {"inst": "fcvtzs Sd, Sn" , "op": "01011110|10|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Dd, Dn" , "op": "01011110|11|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Vd.2S, Vn.2S" , "op": "00001110|10|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Vd.4S, Vn.4S" , "op": "01001110|10|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Vd.2D, Vn.2D" , "op": "01001110|11|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Wd, Sn, #fbits" , "op": "00011110|00|011000|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "fcvtzs Xd, Sn, #fbits" , "op": "10011110|00|011000|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "fcvtzs Wd, Dn, #fbits" , "op": "00011110|01|011000|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "fcvtzs Xd, Dn, #fbits" , "op": "10011110|01|011000|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "fcvtzs Sd, Sn, #fbits" , "op": "01011111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "fcvtzs Dd, Dn, #fbits" , "op": "01011111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "fcvtzs Vd.2S, Vn.2S, #fbits" , "op": "00001111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "fcvtzs Vd.4S, Vn.4S, #fbits" , "op": "01001111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "fcvtzs Vd.2D, Vn.2D, #fbits" , "op": "01001111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "fcvtzu Wd, Sn" , "op": "00011110|00|11100|10000|00|Vn|Rd"},
+ {"inst": "fcvtzu Xd, Sn" , "op": "10011110|00|11100|10000|00|Vn|Rd"},
+ {"inst": "fcvtzu Wd, Dn" , "op": "00011110|01|11100|10000|00|Vn|Rd"},
+ {"inst": "fcvtzu Xd, Dn" , "op": "10011110|01|11100|10000|00|Vn|Rd"},
+ {"inst": "fcvtzu Sd, Sn" , "op": "01111110|10|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Dd, Dn" , "op": "01111110|11|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Vd.2S, Vn.2S" , "op": "00101110|10|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Vd.4S, Vn.4S" , "op": "01101110|10|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Vd.2D, Vn.2D" , "op": "01101110|11|10000|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Wd, Sn, #fbits" , "op": "00011110|00|011001|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "fcvtzu Xd, Sn, #fbits" , "op": "10011110|00|011001|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "fcvtzu Wd, Dn, #fbits" , "op": "00011110|01|011001|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "fcvtzu Xd, Dn, #fbits" , "op": "10011110|01|011001|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "fcvtzu Sd, Sn, #fbits" , "op": "01111111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "fcvtzu Dd, Dn, #fbits" , "op": "01111111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "fcvtzu Vd.2S, Vn.2S, #fbits" , "op": "00101111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "fcvtzu Vd.4S, Vn.4S, #fbits" , "op": "01101111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "fcvtzu Vd.2D, Vn.2D, #fbits" , "op": "01101111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "fdiv Sd, Sn, Sm" , "op": "00011110|00|1|Vm|00011|0|Vn|Vd"},
+ {"inst": "fdiv Dd, Dn, Dm" , "op": "00011110|01|1|Vm|00011|0|Vn|Vd"},
+ {"inst": "fdiv Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "fdiv Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "fdiv Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "fmadd Sd, Sn, Sm, Sa" , "op": "00011111|00|0|Vm|0|Va|Vn|Vd"},
+ {"inst": "fmadd Dd, Dn, Dm, Da" , "op": "00011111|01|0|Vm|0|Va|Vn|Vd"},
+ {"inst": "fmax Sd, Sn, Sm" , "op": "00011110|00|1|Vm|01001|0|Vn|Vd"},
+ {"inst": "fmax Dd, Dn, Dm" , "op": "00011110|01|1|Vm|01001|0|Vn|Vd"},
+ {"inst": "fmax Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmax Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmax Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmaxnm Sd, Sn, Sm" , "op": "00011110|00|1|Vm|01101|0|Vn|Vd"},
+ {"inst": "fmaxnm Dd, Dn, Dm" , "op": "00011110|01|1|Vm|01101|0|Vn|Vd"},
+ {"inst": "fmaxnm Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fmaxnm Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fmaxnm Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fmaxnmp Sd, Vn.2S" , "op": "01111110|00|11000|01100|10|Vn|Vd"},
+ {"inst": "fmaxnmp Dd, Vn.2D" , "op": "01111110|01|11000|01100|10|Vn|Vd"},
+ {"inst": "fmaxnmp Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fmaxnmp Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fmaxnmp Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fmaxnmv Sd, Vn.4S" , "op": "01101110|00|11000|01100|10|Vn|Vd"},
+ {"inst": "fmaxp Sd, Vn.2S" , "op": "01111110|00|11000|01111|10|Vn|Vd"},
+ {"inst": "fmaxp Dd, Vn.2D" , "op": "01111110|01|11000|01111|10|Vn|Vd"},
+ {"inst": "fmaxp Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmaxp Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmaxp Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmaxv Sd, Vn.4S" , "op": "01101110|00|11000|01111|10|Vn|Vd"},
+ {"inst": "fmin Sd, Sn, Sm" , "op": "00011110|00|1|Vm|01011|0|Vn|Vd"},
+ {"inst": "fmin Dd, Dn, Dm" , "op": "00011110|01|1|Vm|01011|0|Vn|Vd"},
+ {"inst": "fmin Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|10|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmin Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|10|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fmin Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fminnm Sd, Sn, Sm" , "op": "00011110|00|1|Vm|01111|0|Vn|Vd"},
+ {"inst": "fminnm Dd, Dn, Dm" , "op": "00011110|01|1|Vm|01111|0|Vn|Vd"},
+ {"inst": "fminnm Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|10|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fminnm Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fminnm Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|10|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fminnmp Sd, Vn.2S" , "op": "01111110|10|11000|01100|10|Vn|Vd"},
+ {"inst": "fminnmp Dd, Vn.2D" , "op": "01111110|11|11000|01100|10|Vn|Vd"},
+ {"inst": "fminnmp Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fminnmp Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|10|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fminnmp Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|1|Vm|11000|1|Vn|Vd"},
+ {"inst": "fminnmv Sd, Vn.4S" , "op": "01101110|10|11000|01100|10|Vn|Vd"},
+ {"inst": "fminp Sd, Vn.2S" , "op": "01111110|10|11000|01111|10|Vn|Vd"},
+ {"inst": "fminp Dd, Vn.2D" , "op": "01111110|11|11000|01111|10|Vn|Vd"},
+ {"inst": "fminp Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fminp Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|10|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fminp Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|1|Vm|11110|1|Vn|Vd"},
+ {"inst": "fminv Sd, Vn.4S" , "op": "01101110|10|11000|01111|10|Vn|Vd"},
+ {"inst": "fmla Sx, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0]|Vm|0001|idx[1]|0|Vn|Vx"},
+ {"inst": "fmla Dx, Dn, Vm.D[#idx]" , "op": "01011111|11|0|Vm|0001|idx[0]|0|Vn|Vx"},
+ {"inst": "fmla Vx.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmla Vx.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmla Vx.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmla Vx.2S, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0]|Vm|0001|idx[1]|0|Vn|Vx"},
+ {"inst": "fmla Vx.4S, Vn.4S, Vm.S[#idx]" , "op": "01001111|11|idx[0]|Vm|0001|idx[1]|0|Vn|Vx"},
+ {"inst": "fmla Vx.2D, Vn.2D, Vm.D[#idx]" , "op": "01001111|11|0|Vm|0001|idx[0]|0|Vn|Vx"},
+ {"inst": "fmls Sx, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0]|Vm|0101|idx[1]|0|Vn|Vx"},
+ {"inst": "fmls Dx, Dn, Vm.D[#idx]" , "op": "01011111|11|0|Vm|0101|idx[0]|0|Vn|Vx"},
+ {"inst": "fmls Vx.2S, Vn.2S, Vm.2S" , "op": "00001110|10|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmls Vx.4S, Vn.4S, Vm.4S" , "op": "01001110|10|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmls Vx.2D, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmls Vx.2S, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0]|Vm|0101|idx[1]|0|Vn|Vx"},
+ {"inst": "fmls Vx.4S, Vn.4S, Vm.S[#idx]" , "op": "01001111|11|idx[0]|Vm|0101|idx[1]|0|Vn|Vx"},
+ {"inst": "fmls Vx.2D, Vn.2D, Vm.D[#idx]" , "op": "01001111|11|0|Vm|0101|idx[0]|0|Vn|Vx"},
+ {"inst": "fmov Wd, Sn" , "op": "00011110|00|10011|00000|00|Vn|Rd"},
+ {"inst": "fmov Xd, Dn" , "op": "10011110|01|10011|00000|00|Vn|Rd"},
+ {"inst": "fmov Xd, Vn.D[#1]" , "op": "10011110|10|10111|00000|00|Vn|Rd"},
+ {"inst": "fmov Sd, Wn" , "op": "00011110|00|10011|10000|00|Rn|Vd"},
+ {"inst": "fmov Sd, Sn" , "op": "00011110|00|10000|00100|00|Vn|Vd"},
+ {"inst": "fmov Sd, #fimm" , "op": "00011110|00|1|imm:8|100|00000|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmov Dd, Xn" , "op": "10011110|01|10011|10000|00|Rn|Vd"},
+ {"inst": "fmov Dd, Dn" , "op": "00011110|01|10000|00100|00|Vn|Vd"},
+ {"inst": "fmov Dd, #fimm" , "op": "00011110|01|1|imm:8|100|00000|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmov Vd.D[#1], Xn" , "op": "10011110|10|10111|10000|00|Rn|Vd"},
+ {"inst": "fmov Vd.2S, #fimm" , "op": "00001111|00|000|abc:3|111101|defgh:5|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmov Vd.4S, #fimm" , "op": "01001111|00|000|abc:3|111101|defgh:5|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmov Vd.2D, #fimm" , "op": "01101111|00|000|abc:3|111101|defgh:5|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmsub Sd, Sn, Sm, Sa" , "op": "00011111|00|0|Vm|1|Va|Vn|Vd"},
+ {"inst": "fmsub Dd, Dn, Dm, Da" , "op": "00011111|01|0|Vm|1|Va|Vn|Vd"},
+ {"inst": "fmul Sd, Sn, Sm" , "op": "00011110|00|1|Vm|00001|0|Vn|Vd"},
+ {"inst": "fmul Dd, Dn, Dm" , "op": "00011110|01|1|Vm|00001|0|Vn|Vd"},
+ {"inst": "fmul Sd, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0]|Vm|1001|idx[1]|0|Vn|Vd"},
+ {"inst": "fmul Dd, Dn, Vm.D[#idx]" , "op": "01011111|11|0|Vm|1001|idx[0]|0|Vn|Vd"},
+ {"inst": "fmul Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|00|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmul Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|00|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmul Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|01|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmul Vd.2S, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0]|Vm|1001|idx[1]|0|Vn|Vd"},
+ {"inst": "fmul Vd.4S, Vn.4S, Vm.S[#idx]" , "op": "01001111|11|idx[0]|Vm|1001|idx[1]|0|Vn|Vd"},
+ {"inst": "fmul Vd.2D, Vn.2D, Vm.D[#idx]" , "op": "01001111|11|0|Vm|1001|idx[0]|0|Vn|Vd"},
+ {"inst": "fmulx Sd, Sn, Sm" , "op": "01011110|00|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmulx Dd, Dn, Dm" , "op": "01011110|01|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmulx Sd, Sn, Vm.S[#idx]" , "op": "01111111|10|idx[0]|Vm|1001|idx[1]|0|Vn|Vd"},
+ {"inst": "fmulx Dd, Dn, Vm.D[#idx]" , "op": "01111111|11|0|Vm|1001|idx:1|0|Vn|Vd"},
+ {"inst": "fmulx Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmulx Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmulx Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "fmulx Vd.2S, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0]|Vm|1001|idx[1]|0|Vn|Vd"},
+ {"inst": "fmulx Vd.4S, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0]|Vm|1001|idx[1]|0|Vn|Vd"},
+ {"inst": "fmulx Vd.2D, Vn.2D, Vm.D[#idx]" , "op": "01101111|11|0|Vm|1001|idx:1|0|Vn|Vd"},
+ {"inst": "fneg Sd, Sn" , "op": "00011110|00|10000|10100|00|Vn|Vd"},
+ {"inst": "fneg Dd, Dn" , "op": "00011110|01|10000|10100|00|Vn|Vd"},
+ {"inst": "fneg Vd.2S, Vn.2S" , "op": "00101110|10|10000|01111|10|Vn|Vd"},
+ {"inst": "fneg Vd.4S, Vn.4S" , "op": "01101110|10|10000|01111|10|Vn|Vd"},
+ {"inst": "fneg Vd.2D, Vn.2D" , "op": "01101110|11|10000|01111|10|Vn|Vd"},
+ {"inst": "fnmadd Sd, Sn, Sm, Sa" , "op": "00011111|00|1|Vm|0|Va|Vn|Vd"},
+ {"inst": "fnmadd Dd, Dn, Dm, Da" , "op": "00011111|01|1|Vm|0|Va|Vn|Vd"},
+ {"inst": "fnmsub Sd, Sn, Sm, Sa" , "op": "00011111|00|1|Vm|1|Va|Vn|Vd"},
+ {"inst": "fnmsub Dd, Dn, Dm, Da" , "op": "00011111|01|1|Vm|1|Va|Vn|Vd"},
+ {"inst": "fnmul Sd, Sn, Sm" , "op": "00011110|00|1|Vm|10001|0|Vn|Vd"},
+ {"inst": "fnmul Dd, Dn, Dm" , "op": "00011110|01|1|Vm|10001|0|Vn|Vd"},
+ {"inst": "frecpe Sd, Sn" , "op": "01011110|10|10000|11101|10|Vn|Vd"},
+ {"inst": "frecpe Dd, Dn" , "op": "01011110|11|10000|11101|10|Vn|Vd"},
+ {"inst": "frecpe Vd.2S, Vn.2S" , "op": "00001110|10|10000|11101|10|Vn|Vd"},
+ {"inst": "frecpe Vd.4S, Vn.4S" , "op": "01001110|10|10000|11101|10|Vn|Vd"},
+ {"inst": "frecpe Vd.2D, Vn.2D" , "op": "01001110|11|10000|11101|10|Vn|Vd"},
+ {"inst": "frecps Sd, Sn, Sm" , "op": "01011110|00|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frecps Dd, Dn, Dm" , "op": "01011110|01|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frecps Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|00|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frecps Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|00|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frecps Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|01|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frecpx Sd, Sn, Sm" , "op": "01011110|10|10000|11111|10|Vn|Vd"},
+ {"inst": "frecpx Dd, Dn, Dm" , "op": "01011110|11|10000|11111|10|Vn|Vd"},
+ {"inst": "frinta Sd, Sn" , "op": "00011110|00|10011|00100|00|Vn|Vd"},
+ {"inst": "frinta Dd, Dn" , "op": "00011110|01|10011|00100|00|Vn|Vd"},
+ {"inst": "frinta Vd.2S, Vn.2S" , "op": "00101110|00|10000|11000|10|Vn|Vd"},
+ {"inst": "frinta Vd.4S, Vn.4S" , "op": "01101110|00|10000|11000|10|Vn|Vd"},
+ {"inst": "frinta Vd.2D, Vn.2D" , "op": "01101110|01|10000|11000|10|Vn|Vd"},
+ {"inst": "frinti Sd, Sn" , "op": "00011110|00|10011|11100|00|Vn|Vd"},
+ {"inst": "frinti Dd, Dn" , "op": "00011110|01|10011|11100|00|Vn|Vd"},
+ {"inst": "frinti Vd.2S, Vn.2S" , "op": "00101110|10|10000|11001|10|Vn|Vd"},
+ {"inst": "frinti Vd.4S, Vn.4S" , "op": "01101110|10|10000|11001|10|Vn|Vd"},
+ {"inst": "frinti Vd.2D, Vn.2D" , "op": "01101110|11|10000|11001|10|Vn|Vd"},
+ {"inst": "frintm Sd, Sn" , "op": "00011110|00|10010|10100|00|Vn|Vd"},
+ {"inst": "frintm Dd, Dn" , "op": "00011110|01|10010|10100|00|Vn|Vd"},
+ {"inst": "frintm Vd.2S, Vn.2S" , "op": "00001110|00|10000|11001|10|Vn|Vd"},
+ {"inst": "frintm Vd.4S, Vn.4S" , "op": "01001110|00|10000|11001|10|Vn|Vd"},
+ {"inst": "frintm Vd.2D, Vn.2D" , "op": "01001110|01|10000|11001|10|Vn|Vd"},
+ {"inst": "frintn Sd, Sn" , "op": "00011110|00|10010|00100|00|Vn|Vd"},
+ {"inst": "frintn Dd, Dn" , "op": "00011110|01|10010|00100|00|Vn|Vd"},
+ {"inst": "frintn Vd.2S, Vn.2S" , "op": "00001110|00|10000|11000|10|Vn|Vd"},
+ {"inst": "frintn Vd.4S, Vn.4S" , "op": "01001110|00|10000|11000|10|Vn|Vd"},
+ {"inst": "frintn Vd.2D, Vn.2D" , "op": "01001110|01|10000|11000|10|Vn|Vd"},
+ {"inst": "frintp Sd, Sn" , "op": "00011110|00|10010|01100|00|Vn|Vd"},
+ {"inst": "frintp Dd, Dn" , "op": "00011110|01|10010|01100|00|Vn|Vd"},
+ {"inst": "frintp Vd.2S, Vn.2S" , "op": "00001110|10|10000|11000|10|Vn|Vd"},
+ {"inst": "frintp Vd.4S, Vn.4S" , "op": "01001110|10|10000|11000|10|Vn|Vd"},
+ {"inst": "frintp Vd.2D, Vn.2D" , "op": "01001110|11|10000|11000|10|Vn|Vd"},
+ {"inst": "frintx Sd, Sn" , "op": "00011110|00|10011|10100|00|Vn|Vd"},
+ {"inst": "frintx Dd, Dn" , "op": "00011110|01|10011|10100|00|Vn|Vd"},
+ {"inst": "frintx Vd.2S, Vn.2S" , "op": "00101110|00|10000|11001|10|Vn|Vd"},
+ {"inst": "frintx Vd.4S, Vn.4S" , "op": "01101110|00|10000|11001|10|Vn|Vd"},
+ {"inst": "frintx Vd.2D, Vn.2D" , "op": "01101110|01|10000|11001|10|Vn|Vd"},
+ {"inst": "frintz Sd, Sn" , "op": "00011110|00|10010|11100|00|Vn|Vd"},
+ {"inst": "frintz Dd, Dn" , "op": "00011110|01|10010|11100|00|Vn|Vd"},
+ {"inst": "frintz Vd.2S, Vn.2S" , "op": "00001110|10|10000|11001|10|Vn|Vd"},
+ {"inst": "frintz Vd.4S, Vn.4S" , "op": "01001110|10|10000|11001|10|Vn|Vd"},
+ {"inst": "frintz Vd.2D, Vn.2D" , "op": "01001110|11|10000|11001|10|Vn|Vd"},
+ {"inst": "frsqrte Sd, Sn" , "op": "01111110|10|10000|11101|10|Vn|Vd"},
+ {"inst": "frsqrte Dd, Dn" , "op": "01111110|11|10000|11101|10|Vn|Vd"},
+ {"inst": "frsqrte Vd.2S, Vn.2S" , "op": "00101110|10|10000|11101|10|Vn|Vd"},
+ {"inst": "frsqrte Vd.4S, Vn.4S" , "op": "01101110|10|10000|11101|10|Vn|Vd"},
+ {"inst": "frsqrte Vd.2D, Vn.2D" , "op": "01101110|11|10000|11101|10|Vn|Vd"},
+ {"inst": "frsqrts Sd, Sn, Sm" , "op": "01011110|10|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frsqrts Dd, Dn, Dm" , "op": "01011110|11|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frsqrts Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|10|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frsqrts Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|10|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "frsqrts Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "fsqrt Sd, Sn" , "op": "00011110|10|10000|11100|00|Vn|Vd"},
+ {"inst": "fsqrt Dd, Dn" , "op": "00011110|11|10000|11100|00|Vn|Vd"},
+ {"inst": "fsqrt Vd.2S, Vn.2S" , "op": "00101110|10|10000|11111|10|Vn|Vd"},
+ {"inst": "fsqrt Vd.4S, Vn.4S" , "op": "01101110|10|10000|11111|10|Vn|Vd"},
+ {"inst": "fsqrt Vd.2D, Vn.2D" , "op": "01101110|11|10000|11111|10|Vn|Vd"},
+ {"inst": "fsub Sd, Sn, Sm" , "op": "00011110|00|1|Vm|00111|0|Vn|Vd"},
+ {"inst": "fsub Dd, Dn, Dm" , "op": "00011110|01|1|Vm|00111|0|Vn|Vd"},
+ {"inst": "fsub Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|10|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fsub Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|10|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "fsub Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11010|1|Vn|Vd"},
+ {"inst": "ins|mov Vd.B[#idx], Wn" , "op": "01001110|00|0|idx:4|1 |00011|1|Rn|Vd"},
+ {"inst": "ins|mov Vd.H[#idx], Wn" , "op": "01001110|00|0|idx:3|10 |00011|1|Rn|Vd"},
+ {"inst": "ins|mov Vd.S[#idx], Wn" , "op": "01001110|00|0|idx:2|100 |00011|1|Rn|Vd"},
+ {"inst": "ins|mov Vd.D[#idx], Xn" , "op": "01001110|00|0|idx:1|1000|00011|1|Rn|Vd"},
+ {"inst": "ins|mov Vd.B[#idx1], Vn.B[#idx2]" , "op": "01101110|00|0|idx1:4|1 |0|idx2:4|1 |Rn|Vd"},
+ {"inst": "ins|mov Vd.H[#idx1], Vn.H[#idx2]" , "op": "01101110|00|0|idx1:3|10 |0|idx2:3|01 |Rn|Vd"},
+ {"inst": "ins|mov Vd.S[#idx1], Vn.S[#idx2]" , "op": "01101110|00|0|idx1:2|100 |0|idx2:2|001 |Rn|Vd"},
+ {"inst": "ins|mov Vd.D[#idx1], Vn.D[#idx2]" , "op": "01101110|00|0|idx1:1|1000|0|idx2:1|0001|Rn|Vd"},
+ {"inst": "ld1 Vx.B[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|000|idx:3 |Rn|Vx"},
+ {"inst": "ld1 Vx.H[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|010|idx:2| 0|Rn|Vx"},
+ {"inst": "ld1 Vx.S[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|100|idx:1|00|Rn|Vx"},
+ {"inst": "ld1 Vx.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|100| 001|Rn|Vx"},
+ {"inst": "ld1 Vx.B[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |000|idx:3 |Rn|Vx"},
+ {"inst": "ld1 Vx.H[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |010|idx:2| 0|Rn|Vx"},
+ {"inst": "ld1 Vx.S[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |100|idx:1|00|Rn|Vx"},
+ {"inst": "ld1 Vx.D[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |100| 001|Rn|Vx"},
+ {"inst": "ld1 Vx.B[#idx], [Xn|SP, #off=1]@" , "op": "0|idx:1|001101|110|11111|000|idx:3 |Rn|Vx"},
+ {"inst": "ld1 Vx.H[#idx], [Xn|SP, #off=2]@" , "op": "0|idx:1|001101|110|11111|010|idx:2| 0|Rn|Vx"},
+ {"inst": "ld1 Vx.S[#idx], [Xn|SP, #off=4]@" , "op": "0|idx:1|001101|110|11111|100|idx:1|00|Rn|Vx"},
+ {"inst": "ld1 Vx.D[#idx], [Xn|SP, #off=8]@" , "op": "0|idx:1|001101|110|11111|100| 001|Rn|Vx"},
+ {"inst": "ld1 1x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|0111|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 1x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|0111|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 2x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|1010|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 2x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|1010|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 3x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|0110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 3x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|0110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 4x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|0010|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 4x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|0010|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 1x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |0111|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 1x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |0111|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 2x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |1010|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 2x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |1010|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 3x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |0110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 3x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |0110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |0010|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |0010|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 1x{Vd.t}, [Xn|SP, #off==8]@" , "op": "00001100|110|11111|0111|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 1x{Vd.t}, [Xn|SP, #off==16]@" , "op": "01001100|110|11111|0111|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 2x{Vd.t}, [Xn|SP, #off==16]@" , "op": "00001100|110|11111|1010|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 2x{Vd.t}, [Xn|SP, #off==32]@" , "op": "01001100|110|11111|1010|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 3x{Vd.t}, [Xn|SP, #off==24]@" , "op": "00001100|110|11111|0110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 3x{Vd.t}, [Xn|SP, #off==48]@" , "op": "01001100|110|11111|0110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1 4x{Vd.t}, [Xn|SP, #off==32]@" , "op": "00001100|110|11111|0010|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1 4x{Vd.t}, [Xn|SP, #off==64]@" , "op": "01001100|110|11111|0010|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1r 1x{Vd.t}, [Xn|SP]" , "op": "00001101|010|00000|1100|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1r 1x{Vd.t}, [Xn|SP]" , "op": "01001101|010|00000|1100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1r 1x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001101|110|Rm |1100|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1r 1x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001101|110|Rm |1100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld1r 1x{Vd.t}, [Xn|SP, #off==1<<sz]@" , "op": "00001101|110|11111|1100|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld1r 1x{Vd.t}, [Xn|SP, #off==1<<sz]@" , "op": "01001101|110|11111|1100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld2 2x{Vx.B}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|000|idx:3 |Rn|Vx"},
+ {"inst": "ld2 2x{Vx.H}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|010|idx:2| 0|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.S}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|100|idx:1|00|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.D}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|100| 001|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.B}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|111|Rm |000|idx:3 |Rn|Vx"},
+ {"inst": "ld2 2x{Vx.H}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|111|Rm |010|idx:2| 0|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.S}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|111|Rm |100|idx:1|00|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.D}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|111|Rm |100| 001|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.B}[#idx], [Xn|SP, #off=2]@" , "op": "0|idx:1|001101|111|11111|000|idx:3 |Rn|Vx"},
+ {"inst": "ld2 2x{Vx.H}[#idx], [Xn|SP, #off=4]@" , "op": "0|idx:1|001101|111|11111|010|idx:2| 0|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.S}[#idx], [Xn|SP, #off=8]@" , "op": "0|idx:1|001101|111|11111|100|idx:1|00|Rn|Vx"},
+ {"inst": "ld2 2x{Vx.D}[#idx], [Xn|SP, #off=16]@" , "op": "0|idx:1|001101|111|11111|100| 001|Rn|Vx"},
+ {"inst": "ld2 2x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|1000|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld2 2x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|1000|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld2 2x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |1000|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld2 2x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |1000|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld2 2x{Vd.t}, [Xn|SP, #off==16]@" , "op": "00001100|110|11111|1000|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld2 2x{Vd.t}, [Xn|SP, #off==32]@" , "op": "01001100|110|11111|1000|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld2r 2x{Vd.t}, [Xn|SP]" , "op": "00001101|011|00000|1100|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld2r 2x{Vd.t}, [Xn|SP]" , "op": "01001101|011|00000|1100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld2r 2x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001101|111|Rm |1100|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld2r 2x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001101|111|Rm |1100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld2r 2x{Vd.t}, [Xn|SP, #off==2<<sz]@" , "op": "00001101|111|11111|1100|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld2r 2x{Vd.t}, [Xn|SP, #off==2<<sz]@" , "op": "01001101|111|11111|1100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld3 3x{Vx.B}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|001|idx:3 |Rn|Vx"},
+ {"inst": "ld3 3x{Vx.H}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|011|idx:2| 0|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.S}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|101|idx:1|00|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.D}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00000|101| 001|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.B}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |001|idx:3 |Rn|Vx"},
+ {"inst": "ld3 3x{Vx.H}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |011|idx:2| 0|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.S}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |101|idx:1|00|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.D}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |101| 001|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.B}[#idx], [Xn|SP, #off=3]@" , "op": "0|idx:1|001101|110|11111|001|idx:3 |Rn|Vx"},
+ {"inst": "ld3 3x{Vx.H}[#idx], [Xn|SP, #off=6]@" , "op": "0|idx:1|001101|110|11111|011|idx:2| 0|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.S}[#idx], [Xn|SP, #off=12]@" , "op": "0|idx:1|001101|110|11111|101|idx:1|00|Rn|Vx"},
+ {"inst": "ld3 3x{Vx.D}[#idx], [Xn|SP, #off=24]@" , "op": "0|idx:1|001101|110|11111|101| 001|Rn|Vx"},
+ {"inst": "ld3 3x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|0100|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld3 3x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|0100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld3 3x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |0100|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld3 3x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |0100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld3 3x{Vd.t}, [Xn|SP, #off==16]@" , "op": "00001100|110|11111|0100|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld3 3x{Vd.t}, [Xn|SP, #off==32]@" , "op": "01001100|110|11111|0100|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld3r 3x{Vd.t}, [Xn|SP]" , "op": "00001101|010|00000|1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld3r 3x{Vd.t}, [Xn|SP]" , "op": "01001101|010|00000|1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld3r 3x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001101|110|Rm |1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld3r 3x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001101|110|Rm |1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld3r 3x{Vd.t}, [Xn|SP, #off==3<<sz]@" , "op": "00001101|110|11111|1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld3r 3x{Vd.t}, [Xn|SP, #off==3<<sz]@" , "op": "01001101|110|11111|1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld4 4x{Vx.B}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|001|idx:3 |Rn|Vx"},
+ {"inst": "ld4 4x{Vx.H}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|011|idx:2| 0|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.S}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|101|idx:1|00|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.D}[#idx], [Xn|SP]" , "op": "0|idx:1|001101|011|00000|101| 001|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.B}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |001|idx:3 |Rn|Vx"},
+ {"inst": "ld4 4x{Vx.H}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |011|idx:2| 0|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.S}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |101|idx:1|00|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.D}[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|110|Rm |101| 001|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.B}[#idx], [Xn|SP, #off=4]@" , "op": "0|idx:1|001101|110|11111|001|idx:3 |Rn|Vx"},
+ {"inst": "ld4 4x{Vx.H}[#idx], [Xn|SP, #off=8]@" , "op": "0|idx:1|001101|110|11111|011|idx:2| 0|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.S}[#idx], [Xn|SP, #off=16]@" , "op": "0|idx:1|001101|110|11111|101|idx:1|00|Rn|Vx"},
+ {"inst": "ld4 4x{Vx.D}[#idx], [Xn|SP, #off=32]@" , "op": "0|idx:1|001101|110|11111|101| 001|Rn|Vx"},
+ {"inst": "ld4 4x{Vd.t}, [Xn|SP]" , "op": "00001100|010|00000|0000|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld4 4x{Vd.t}, [Xn|SP]" , "op": "01001100|010|00000|0000|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld4 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001100|110|Rm |0000|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld4 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001100|110|Rm |0000|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld4 4x{Vd.t}, [Xn|SP, #off==32]@" , "op": "00001100|110|11111|0000|sz|Rn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "ld4 4x{Vd.t}, [Xn|SP, #off==64]@" , "op": "01001100|110|11111|0000|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld4r 4x{Vd.t}, [Xn|SP]" , "op": "00001101|011|00000|1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld4r 4x{Vd.t}, [Xn|SP]" , "op": "01001101|011|00000|1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld4r 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "00001101|111|Rm |1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld4r 4x{Vd.t}, [Xn|SP, Xm]@" , "op": "01001101|111|Rm |1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ld4r 4x{Vd.t}, [Xn|SP, #off==4<<sz]@" , "op": "00001101|111|11111|1110|sz|Rn|Vd" , "t": "8B 4H 2S 1D"},
+ {"inst": "ld4r 4x{Vd.t}, [Xn|SP, #off==4<<sz]@" , "op": "01001101|111|11111|1110|sz|Rn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "ldnp Sd, Sd2, [Xn|SP, #offS*4]" , "op": "00101100|01|offS:7|Vd2|Vn|Vd"},
+ {"inst": "ldnp Dd, Dd2, [Xn|SP, #offS*8]" , "op": "01101100|01|offS:7|Vd2|Vn|Vd"},
+ {"inst": "ldnp Qd, Qd2, [Xn|SP, #offS*16]" , "op": "10101100|01|offS:7|Vd2|Vn|Vd"},
+ {"inst": "ldp Sd, Sd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010110|!post|W|1|offS:7|Vd2|Vn|Vd"},
+ {"inst": "ldp Dd, Dd2, [Xn|SP, #offS*8]{@}{!}" , "op": "0110110|!post|W|1|offS:7|Vd2|Vn|Vd"},
+ {"inst": "ldp Qd, Qd2, [Xn|SP, #offS*16]{@}{!}" , "op": "1010110|!post|W|1|offS:7|Vd2|Vn|Vd"},
+ {"inst": "ldr Bd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111100|011|Rm|option:3|n:1|10|Rn|Vd"},
+ {"inst": "ldr Hd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111100|011|Rm|option:3|n:1|10|Rn|Vd"},
+ {"inst": "ldr Sd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*2}]" , "op": "10111100|011|Rm|option:3|n:1|10|Rn|Vd"},
+ {"inst": "ldr Dd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*3}]" , "op": "11111100|011|Rm|option:3|n:1|10|Rn|Vd"},
+ {"inst": "ldr Qd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*4}]" , "op": "00111100|111|Rm|option:3|n:1|10|Rn|Vd"},
+ {"inst": "ldr Sd, [PC, #offS*4]" , "op": "00011100|offS:19|Vd"},
+ {"inst": "ldr Dd, [PC, #offS*4]" , "op": "01011100|offS:19|Vd"},
+ {"inst": "ldr Qd, [PC, #offS*4]" , "op": "10011100|offS:19|Vd"},
+ {"inst": "ldr Bd, [Xn|SP, #offZ]" , "op": "00111101|01|offZ:12|Rn|Vd"},
+ {"inst": "ldr Hd, [Xn|SP, #offZ*2]" , "op": "01111101|01|offZ:12|Rn|Vd"},
+ {"inst": "ldr Sd, [Xn|SP, #offZ*4]" , "op": "10111101|01|offZ:12|Rn|Vd"},
+ {"inst": "ldr Dd, [Xn|SP, #offZ*8]" , "op": "11111101|01|offZ:12|Rn|Vd"},
+ {"inst": "ldr Qd, [Xn|SP, #offZ*16]" , "op": "00111101|11|offZ:12|Rn|Vd"},
+ {"inst": "ldr Bd, [Xn|SP, #offS]!" , "op": "00111100|010|offS:9|11|Rn|Vd"},
+ {"inst": "ldr Hd, [Xn|SP, #offS*2]!" , "op": "01111100|010|offS:9|11|Rn|Vd"},
+ {"inst": "ldr Sd, [Xn|SP, #offS*4]!" , "op": "10111100|010|offS:9|11|Rn|Vd"},
+ {"inst": "ldr Dd, [Xn|SP, #offS*8]!" , "op": "11111100|010|offS:9|11|Rn|Vd"},
+ {"inst": "ldr Qd, [Xn|SP, #offS*16]!" , "op": "00111100|110|offS:9|11|Rn|Vd"},
+ {"inst": "ldr Bd, [Xn|SP, #offS]@" , "op": "00111100|010|offS:9|01|Rn|Vd"},
+ {"inst": "ldr Hd, [Xn|SP, #offS*2]@" , "op": "01111100|010|offS:9|01|Rn|Vd"},
+ {"inst": "ldr Sd, [Xn|SP, #offS*4]@" , "op": "10111100|010|offS:9|01|Rn|Vd"},
+ {"inst": "ldr Dd, [Xn|SP, #offS*8]@" , "op": "11111100|010|offS:9|01|Rn|Vd"},
+ {"inst": "ldr Qd, [Xn|SP, #offS*16]@" , "op": "00111100|110|offS:9|01|Rn|Vd"},
+ {"inst": "ldur Bd, [Xn|SP, #offS]" , "op": "00111100|010|offS:9|00|Rn|Vd"},
+ {"inst": "ldur Hd, [Xn|SP, #offS]" , "op": "01111100|010|offS:9|00|Rn|Vd"},
+ {"inst": "ldur Sd, [Xn|SP, #offS]" , "op": "10111100|010|offS:9|00|Rn|Vd"},
+ {"inst": "ldur Dd, [Xn|SP, #offS]" , "op": "11111100|010|offS:9|00|Rn|Vd"},
+ {"inst": "ldur Qd, [Xn|SP, #offS]" , "op": "00111100|110|offS:9|00|Rn|Vd"},
+ {"inst": "mla Vx.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10010|1|Vn|Vx" , "t": "8B 4H 2S"},
+ {"inst": "mla Vx.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10010|1|Vn|Vx" , "t": "16B 8H 4S"},
+ {"inst": "mla Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|0000|idx[2]|0|Vn|Vx"},
+ {"inst": "mla Vx.8H, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|0000|idx[2]|0|Vn|Vx"},
+ {"inst": "mla Vx.2S, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0]|Vm|0000|idx[1]|0|Vn|Vx"},
+ {"inst": "mla Vx.4S, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0]|Vm|0000|idx[1]|0|Vn|Vx"},
+ {"inst": "mls Vx.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10010|1|Vn|Vx" , "t": "8B 4H 2S"},
+ {"inst": "mls Vx.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10010|1|Vn|Vx" , "t": "16B 8H 4S"},
+ {"inst": "mls Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|0100|idx[2]|0|Vn|Vx"},
+ {"inst": "mls Vx.8H, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|0100|idx[2]|0|Vn|Vx"},
+ {"inst": "mls Vx.2S, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0]|Vm|0100|idx[1]|0|Vn|Vx"},
+ {"inst": "mls Vx.4S, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0]|Vm|0100|idx[1]|0|Vn|Vx"},
+ {"inst": "mov Vd.8B, Vn.8B" , "op": "00001110|10|1|Vn|00011|1|Vn|Vd"},
+ {"inst": "mov Vd.16B, Vn.16B" , "op": "01001110|10|1|Vn|00011|1|Vn|Vd"},
+ {"inst": "movi Dd, #imm, {lsl #n}" , "op": "00|op:1|01111|00|0|00|abc:3|cmode:4|01|defgh:5|Vd" , "imm": "ASimdMovPImm(0, imm, n)"},
+ {"inst": "movi Vd.t, #imm, {lsl #n}" , "op": "00|op:1|01111|00|0|00|abc:3|cmode:4|01|defgh:5|Vd" , "imm": "ASimdMovPImm(sz, imm, n)", "t": "8B 4H 2S"},
+ {"inst": "movi Vd.t, #imm, {lsl #n}" , "op": "01|op:1|01111|00|0|00|abc:3|cmode:4|01|defgh:5|Vd" , "imm": "ASimdMovPImm(sz, imm, n)", "t": "16B 8H 4S 2D"},
+ {"inst": "mul Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10011|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "mul Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10011|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "mul Vd.4H, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|1000|idx[2]|0|Vn|Vd"},
+ {"inst": "mul Vd.8H, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|1000|idx[2]|0|Vn|Vd"},
+ {"inst": "mul Vd.2S, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0]|Vm|1000|idx[1]|0|Vn|Vd"},
+ {"inst": "mul Vd.4S, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0]|Vm|1000|idx[1]|0|Vn|Vd"},
+ {"inst": "mvni Dd, #imm, {lsl #n}" , "op": "00|op:1|01111|00|0|00|abc:3|cmode:4|01|defgh:5|Vd" , "imm": "ASimdMovNImm(0, imm, n)"},
+ {"inst": "mvni Vd.t, #imm, {lsl #n}" , "op": "00|op:1|01111|00|0|00|abc:3|cmode:4|01|defgh:5|Vd" , "imm": "ASimdMovNImm(sz, imm, n)", "t": "8B 4H 2S"},
+ {"inst": "mvni Vd.t, #imm, {lsl #n}" , "op": "01|op:1|01111|00|0|00|abc:3|cmode:4|01|defgh:5|Vd" , "imm": "ASimdMovNImm(sz, imm, n)", "t": "16B 8H 4S 2D"},
+ {"inst": "neg Dd, Dn" , "op": "01111110|11|10000|01011|10|Vn|Vd"},
+ {"inst": "neg Vd.t, Vn.t" , "op": "00101110|sz|10000|01011|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "neg Vd.t, Vn.t" , "op": "01101110|sz|10000|01011|10|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "not|mvn Vd.8B, Vn.8B" , "op": "00101110|00|10000|00101|10|Vn|Vd"},
+ {"inst": "not|mvn Vd.16B, Vn.16B" , "op": "01101110|00|10000|00101|10|Vn|Vd"},
+ {"inst": "orn Vd.8B, Vn.8B, Vm.8B" , "op": "00001110|11|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "orn Vd.16B, Vn.16B, Vm.16B" , "op": "01001110|11|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "orr Vd.8B, Vn.8B, Vm.8B" , "op": "00001110|10|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "orr Vd.16B, Vn.16B, Vm.16B" , "op": "01001110|10|1|Vm|00011|1|Vn|Vd"},
+ {"inst": "orr Vd.t, #imm, {lsl #n}" , "op": "00001111|00000|abc:3|cmode:4|01|defgh:5|Vd" , "t": "4H 2S", "imm": "ASimdLogicalImm(sz, 0, imm, n)"},
+ {"inst": "orr Vd.t, #imm, {lsl #n}" , "op": "01001111|00000|abc:3|cmode:4|01|defgh:5|Vd" , "t": "8H 4S", "imm": "ASimdLogicalImm(sz, 0, imm, n)"},
+ {"inst": "pmul Vd.8B, Vn.8B, Vm.8B" , "op": "00101110|00|1|Vm|10011|1|Vn|Vd"},
+ {"inst": "pmul Vd.16B, Vn.16B, Vm.16B" , "op": "01101110|00|1|Vm|10011|1|Vn|Vd"},
+ {"inst": "pmull Vd.8H, Vn.8B, Vm.8B" , "op": "00001110|00|1|Vm|11100|0|Vn|Vd"},
+ {"inst": "pmull Vd.1Q, Vn.1D, Vm.1D" , "op": "00001110|11|1|Vm|11100|0|Vn|Vd"},
+ {"inst": "pmull2 Vd.8H, Vn.16B, Vm.16B" , "op": "01001110|00|1|Vm|11100|0|Vn|Vd"},
+ {"inst": "pmull2 Vd.1Q, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11100|0|Vn|Vd"},
+ {"inst": "raddhn Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|01000|0|Vn|Vd" , "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "raddhn2 Vx.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|01000|0|Vn|Vx" , "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "rbit Vd.8B, Vn.8B" , "op": "00101110|01|10000|00101|10|Vn|Vd"},
+ {"inst": "rbit Vd.16B, Vn.16B" , "op": "01101110|01|10000|00101|10|Vn|Vd"},
+ {"inst": "rev16 Vd.8B, Vn.8B" , "op": "00001110|sz|10000|00001|10|Vn|Vd"},
+ {"inst": "rev16 Vd.16B, Vn.16B" , "op": "01001110|sz|10000|00001|10|Vn|Vd"},
+ {"inst": "rev32 Vd.t, Vn.t" , "op": "00101110|sz|10000|00000|10|Vn|Vd" , "t": "8B 4H"},
+ {"inst": "rev32 Vd.t, Vn.t" , "op": "01101110|sz|10000|00000|10|Vn|Vd" , "t": "16B 8H"},
+ {"inst": "rev64 Vd.t, Vn.t" , "op": "00001110|sz|10000|00000|10|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "rev64 Vd.t, Vn.t" , "op": "01001110|sz|10000|00000|10|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "rshrn Vd.ta, Vn.tb, #n" , "op": "00001111|0|immh:4|immb:3|10001|1|Vn|Vd" , "imm": "ASimdShiftNImm(n, sz)", "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "rshrn2 Vx.ta, Vn.tb, #n" , "op": "01001111|0|immh:4|immb:3|10001|1|Vn|Vx" , "imm": "ASimdShiftNImm(n, sz)", "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "rsubhn Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|01100|0|Vn|Vd" , "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "rsubhn2 Vx.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|01100|0|Vn|Vx" , "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "saba Vx.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01111|1|Vn|Vx" , "t": "8B 4H 2S"},
+ {"inst": "saba Vx.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01111|1|Vn|Vx" , "t": "16B 8H 4S"},
+ {"inst": "sabal Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|01010|0|Vn|Vx" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "sabal2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|01010|0|Vn|Vx" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "sabd Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01110|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "sabd Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01110|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "sabdl Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|01110|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "sabdl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|01110|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "sadalp Vx.ta, Vn.tb" , "op": "00001110|sz|10000|00110|10|Vn|Vx" , "ta.tb": "4H.8B 2S.4H 1D.2S"},
+ {"inst": "sadalp Vx.ta, Vn.tb" , "op": "01001110|sz|10000|00110|10|Vn|Vx" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "saddl Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|00000|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "saddl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|00000|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "saddlp Vd.ta, Vn.tb" , "op": "00001110|sz|10000|00010|10|Vn|Vd" , "ta.tb": "4H.8B 2S.4H 1D.2S"},
+ {"inst": "saddlp Vd.ta, Vn.tb" , "op": "01001110|sz|10000|00010|10|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "saddlv Hd, Vn.8B" , "op": "00001110|00|11000|00011|10|Vn|Vd"},
+ {"inst": "saddlv Hd, Vn.16B" , "op": "01001110|00|11000|00011|10|Vn|Vd"},
+ {"inst": "saddlv Sd, Vn.4H" , "op": "00001110|01|11000|00011|10|Vn|Vd"},
+ {"inst": "saddlv Sd, Vn.8H" , "op": "01001110|01|11000|00011|10|Vn|Vd"},
+ {"inst": "saddlv Dd, Vn.4S" , "op": "01001110|10|11000|00011|10|Vn|Vd"},
+ {"inst": "saddw Vd.ta, Vn.ta, Vm.tb" , "op": "00001110|sz|1|Vm|00010|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "saddw2 Vd.ta, Vn.ta, Vm.tb" , "op": "01001110|sz|1|Vm|00010|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "scvtf Sd, Wn" , "op": "00011110|00|1|00010|00000|0|Rn|Vd"},
+ {"inst": "scvtf Sd, Wn, #fbits" , "op": "00011110|00|0|00010|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "scvtf Sd, Xn" , "op": "10011110|00|1|00010|00000|0|Rn|Vd"},
+ {"inst": "scvtf Sd, Xn, #fbits" , "op": "10011110|00|0|00010|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "scvtf Sd, Sn" , "op": "01011110|00|10000|11101|10|Vn|Vd"},
+ {"inst": "scvtf Sd, Sn, #bits" , "op": "01011111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "scvtf Dd, Wn" , "op": "00011110|01|1|00010|00000|0|Rn|Vd"},
+ {"inst": "scvtf Dd, Wn, #fbits" , "op": "00011110|01|0|00010|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "scvtf Dd, Xn" , "op": "10011110|01|1|00010|00000|0|Rn|Vd"},
+ {"inst": "scvtf Dd, Xn, #fbits" , "op": "10011110|01|0|00010|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "scvtf Dd, Dn" , "op": "01011110|01|10000|11101|10|Vn|Vd"},
+ {"inst": "scvtf Dd, Dn, #bits" , "op": "01011111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "scvtf Vd.2S, Vn.2S" , "op": "00001110|00|10000|11101|10|Vn|Vd"},
+ {"inst": "scvtf Vd.4S, Vn.4S" , "op": "01001110|00|10000|11101|10|Vn|Vd"},
+ {"inst": "scvtf Vd.2D, Vn.2D" , "op": "01001110|01|10000|11101|10|Vn|Vd"},
+ {"inst": "scvtf Vd.2S, Vn.2S, #fbits" , "op": "00001111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "scvtf Vd.4S, Vn.4S, #fbits" , "op": "01001111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "scvtf Vd.2D, Vn.2D, #fbits" , "op": "01001111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "shadd Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00000|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "shadd Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00000|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "shl Dd, Dn, #n" , "op": "01011111|0|immh:4|immb:3|01010|1|Vn|Vd" , "imm": "ASimdSHL(n, 3)"},
+ {"inst": "shl Vd.t, Vn.t, #n" , "op": "00001111|0|immh:4|immb:3|01010|1|Vn|Vd" , "imm": "ASimdSHL(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "shl Vd.t, Vn.t, #n" , "op": "01001111|0|immh:4|immb:3|01010|1|Vn|Vd" , "imm": "ASimdSHL(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "shll Vd.8H, Vn.8B, #8" , "op": "00101110|00|10000|10011|10|Vn|Vd"},
+ {"inst": "shll2 Vd.8H, Vn.16B, #8" , "op": "01101110|00|10000|10011|10|Vn|Vd"},
+ {"inst": "shll Vd.4S, Vn.4H, #16" , "op": "00101110|01|10000|10011|10|Vn|Vd"},
+ {"inst": "shll2 Vd.4S, Vn.8H, #16" , "op": "01101110|01|10000|10011|10|Vn|Vd"},
+ {"inst": "shll Vd.2D, Vn.2S, #32" , "op": "00101110|10|10000|10011|10|Vn|Vd"},
+ {"inst": "shll2 Vd.2D, Vn.4S, #32" , "op": "01101110|10|10000|10011|10|Vn|Vd"},
+ {"inst": "shrn Vd.ta, Vn.tb, #n" , "op": "00001111|0|immh:4|immb:3|100001|Vn|Vd" , "imm": "ASimdSHRN(n, sz)", "t": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "shrn2 Vx.ta, Vn.tb, #n" , "op": "01001111|0|immh:4|immb:3|100001|Vn|Vx" , "imm": "ASimdSHRN(n, sz)", "t": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "shsub Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00100|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "shsub Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00100|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "sli Dx, Dn, #n" , "op": "01111111|0|immh:4|immb:3|01010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 3)"},
+ {"inst": "sli Vx.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|01010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "sli Vx.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|01010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "smax Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01100|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "smax Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01100|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "smaxp Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10100|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "smaxp Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10100|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "smaxv Bd, Vn.8B" , "op": "00001110|00|11000|01010|10|Vn|Vd"},
+ {"inst": "smaxv Bd, Vn.16B" , "op": "01001110|00|11000|01010|10|Vn|Vd"},
+ {"inst": "smaxv Hd, Vn.4H" , "op": "00001110|01|11000|01010|10|Vn|Vd"},
+ {"inst": "smaxv Hd, Vn.8H" , "op": "01001110|01|11000|01010|10|Vn|Vd"},
+ {"inst": "smaxv Sd, Vn.4S" , "op": "01001110|10|11000|01010|10|Vn|Vd"},
+ {"inst": "smin Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01101|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "smin Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01101|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "sminp Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10101|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "sminp Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10101|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "sminv Bd, Vn.8B" , "op": "00001110|00|11000|11010|10|Vn|Vd"},
+ {"inst": "sminv Bd, Vn.16B" , "op": "01001110|00|11000|11010|10|Vn|Vd"},
+ {"inst": "sminv Hd, Vn.4H" , "op": "00001110|01|11000|11010|10|Vn|Vd"},
+ {"inst": "sminv Hd, Vn.8H" , "op": "01001110|01|11000|11010|10|Vn|Vd"},
+ {"inst": "sminv Sd, Vn.4S" , "op": "01001110|10|11000|11010|10|Vn|Vd"},
+ {"inst": "smlal Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10000|0|Vn|Vx" , "t": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "smlal2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10000|0|Vn|Vx" , "t": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "smlal Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vx"},
+ {"inst": "smlal2 Vx.4S, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vx"},
+ {"inst": "smlal Vx.2D, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vx"},
+ {"inst": "smlal2 Vx.2D, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vx"},
+ {"inst": "smlsl Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10100|0|Vn|Vx" , "t": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "smlsl2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10100|0|Vn|Vx" , "t": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "smlsl Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vx"},
+ {"inst": "smlsl2 Vx.4S, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vx"},
+ {"inst": "smlsl Vx.2D, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vx"},
+ {"inst": "smlsl2 Vx.2D, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vx"},
+ {"inst": "smov Wd, Vn.B[#idx]" , "op": "00001110|00|0|idx:4| 1|00101|1|Vn|Rd"},
+ {"inst": "smov Wd, Vn.H[#idx]" , "op": "00001110|00|0|idx:3| 10|00101|1|Vn|Rd"},
+ {"inst": "smov Xd, Vn.B[#idx]" , "op": "01001110|00|0|idx:4| 1|00101|1|Vn|Rd"},
+ {"inst": "smov Xd, Vn.H[#idx]" , "op": "01001110|00|0|idx:3| 10|00101|1|Vn|Rd"},
+ {"inst": "smov Xd, Vn.S[#idx]" , "op": "01001110|00|0|idx:2|100|00101|1|Vn|Rd"},
+ {"inst": "smull Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|11000|0|Vn|Vd" , "t": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "smull2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|11000|0|Vn|Vd" , "t": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "smull Vd.4S, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|1010|idx[2]|0|Vn|Vd"},
+ {"inst": "smull2 Vd.4S, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|1010|idx[2]|0|Vn|Vd"},
+ {"inst": "smull Vd.2D, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0] |Vm |1010|idx[1]|0|Vn|Vd"},
+ {"inst": "smull2 Vd.2D, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0] |Vm |1010|idx[1]|0|Vn|Vd"},
+ {"inst": "sqabs Bd, Bn" , "op": "01011110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqabs Hd, Hn" , "op": "01011110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqabs Sd, Sn" , "op": "01011110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqabs Dd, Dn" , "op": "01011110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqabs Vd.t, Vn.t" , "op": "00001110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "sqabs Vd.t, Vn.t" , "op": "01001110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sqadd Bd, Bn, Bm" , "op": "01011110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqadd Hd, Hn, Hm" , "op": "01011110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqadd Sd, Sn, Sm" , "op": "01011110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqadd Dd, Dn, Dm" , "op": "01011110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqadd Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "sqadd Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sqdmlal Sx, Hn, Hm" , "op": "01011110|01|1|Vm|10010|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal Dx, Sn, Sm" , "op": "01011110|10|1|Vm|10010|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal Sx, Hn, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|0011|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal Dx, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |0011|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10010|0|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "4S.4H 2D.2S"},
+ {"inst": "sqdmlal2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10010|0|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "4S.8H 2D.4S"},
+ {"inst": "sqdmlal Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "00011111|01|idx[1:0]|Vm:4|0011|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal2 Vx.4S, Vn.8H, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|0011|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal Vx.2D, Vn.2S, Vm.S[#idx]" , "op": "00011111|10|idx[0] |Vm |0011|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlal2 Vx.2D, Vn.4S, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |0011|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl Sx, Hn, Hm" , "op": "01011110|01|1|Vm|10110|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl Dx, Sn, Sm" , "op": "01011110|10|1|Vm|10110|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl Sx, Hn, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|0111|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl Dx, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |0111|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl Vx.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10110|0|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "4S.4H 2D.2S"},
+ {"inst": "sqdmlsl2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10110|0|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "4S.8H 2D.4S"},
+ {"inst": "sqdmlsl Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "00011111|01|idx[1:0]|Vm:4|0111|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl2 Vx.4S, Vn.8H, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|0111|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl Vx.2D, Vn.2S, Vm.S[#idx]" , "op": "00011111|10|idx[0] |Vm |0111|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmlsl2 Vx.2D, Vn.4S, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |0111|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Hd, Hn, Hm" , "op": "01011110|01|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Sd, Sn, Sm" , "op": "01011110|10|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Hd, Hn, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|1100|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Sd, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |1100|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT", "t": "~ 4H 2S"},
+ {"inst": "sqdmulh Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT", "t": "~ 8H 4S"},
+ {"inst": "sqdmulh Vd.4H, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|1100|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Vd.8H, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|1100|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Vd.2S, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0] |Vm |1100|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmulh Vd.4S, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0] |Vm |1100|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull Sd, Hn, Hm" , "op": "01011110|01|1|Vm|11010|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull Dd, Sn, Sm" , "op": "01011110|10|1|Vm|11010|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull Sd, Hn, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|1011|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull Dd, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |1011|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT", "ta.tb": "~ 4S.4H 2D.2S"},
+ {"inst": "sqdmull2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT", "ta.tb": "~ 4S.8H 2D.4S"},
+ {"inst": "sqdmull Vd.4S, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|1011|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull2 Vd.4S, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|1011|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull Vd.2D, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0] |Vm |1011|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqdmull2 Vd.2D, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0] |Vm |1011|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqneg Bd, Bn" , "op": "01111110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqneg Hd, Hn" , "op": "01111110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqneg Sd, Sn" , "op": "01111110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqneg Dd, Dn" , "op": "01111110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqneg Vd.t, Vn.t" , "op": "00101110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "sqneg Vd.t, Vn.t" , "op": "01101110|sz|10000|00111|10|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sqrdmulh Hd, Hn, Hm" , "op": "01111110|01|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Sd, Sn, Sm" , "op": "01111110|10|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Hd, Hn, Vm.H[#idx]" , "op": "01011111|01|idx[1:0]|Vm:4|1101|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Sd, Sn, Vm.S[#idx]" , "op": "01011111|10|idx[0] |Vm |1101|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT", "t": "~ 4H 2S"},
+ {"inst": "sqrdmulh Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10110|1|Vn|Vd" , "io": "QC|=SAT", "t": "~ 8H 4S"},
+ {"inst": "sqrdmulh Vd.4H, Vn.4H, Vm.H[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|1101|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Vd.2S, Vn.2S, Vm.S[#idx]" , "op": "00001111|10|idx[0] |Vm |1101|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Vd.8H, Vn.8H, Vm.H[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|1101|idx[2]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrdmulh Vd.4S, Vn.4S, Vm.S[#idx]" , "op": "01001111|10|idx[0] |Vm |1101|idx[1]|0|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrshl Bd, Bn, Bm" , "op": "01011110|00|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrshl Hd, Hn, Hm" , "op": "01011110|01|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrshl Sd, Sn, Sm" , "op": "01011110|10|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrshl Dd, Dn, Dm" , "op": "01011110|11|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqrshl Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "sqrshl Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sqrshrn Bd, Hn, #n" , "op": "01011111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqrshrn Hd, Sn, #n" , "op": "01011111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqrshrn Sd, Dn, #n" , "op": "01011111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqrshrn Vd.8B, Vn.8H, #n" , "op": "00001111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqrshrn2 Vx.16B, Vn.8H, #n" , "op": "01001111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqrshrn Vd.4H, Vn.4S, #n" , "op": "00001111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqrshrn2 Vx.8H, Vn.4S, #n" , "op": "01001111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqrshrn Vd.2S, Vn.2D, #n" , "op": "00001111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqrshrn2 Vx.4S, Vn.2D, #n" , "op": "01001111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqrshrun Bd, Hn, #n" , "op": "01111111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqrshrun Hd, Sn, #n" , "op": "01111111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqrshrun Sd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqrshrun Vd.8B, Vn.8H, #n" , "op": "00101111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqrshrun2 Vx.16B, Vn.8H, #n" , "op": "01101111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqrshrun Vd.4H, Vn.4S, #n" , "op": "00101111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqrshrun2 Vx.8H, Vn.4S, #n" , "op": "01101111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqrshrun Vd.2S, Vn.2D, #n" , "op": "00101111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqrshrun2 Vx.4S, Vn.2D, #n" , "op": "01101111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqshl Bd, Bn, Bm" , "op": "01011110|00|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqshl Hd, Hn, Hm" , "op": "01011110|01|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqshl Sd, Sn, Sm" , "op": "01011110|10|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqshl Dd, Dn, Dm" , "op": "01011110|11|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqshl Bd, Bn, #n" , "op": "01011111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 0)"},
+ {"inst": "sqshl Hd, Hn, #n" , "op": "01011111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 1)"},
+ {"inst": "sqshl Sd, Sn, #n" , "op": "01011111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 2)"},
+ {"inst": "sqshl Dd, Dn, #n" , "op": "01011111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 3)"},
+ {"inst": "sqshl Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "sqshl Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sqshl Vd.t, Vn.t, #n" , "op": "00001111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "sqshl Vd.t, Vn.t, #n" , "op": "01001111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "sqshlu Bd, Bn, #n" , "op": "01111111|0|immh:4|immb:3|01100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 0)"},
+ {"inst": "sqshlu Hd, Hn, #n" , "op": "01111111|0|immh:4|immb:3|01100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 1)"},
+ {"inst": "sqshlu Sd, Sn, #n" , "op": "01111111|0|immh:4|immb:3|01100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 2)"},
+ {"inst": "sqshlu Dd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|01100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 3)"},
+ {"inst": "sqshlu Vd.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|01100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "sqshlu Vd.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|01100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "sqshrn Bd, Hn, #n" , "op": "01011111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqshrn Hd, Sn, #n" , "op": "01011111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqshrn Sd, Dn, #n" , "op": "01011111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqshrn Vd.ta, Vn.tb, #n" , "op": "00001111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)", "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "sqshrn2 Vx.ta, Vn.tb, #n" , "op": "01001111|0|immh:4|immb:3|10010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)", "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "sqshrun Bd, Hn, #n" , "op": "01111111|0|immh:4|immb:3|10000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqshrun Hd, Sn, #n" , "op": "01111111|0|immh:4|immb:3|10000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqshrun Sd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|10000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqshrun Vd.8B, Vn.8H, #n" , "op": "00101111|0|immh:4|immb:3|10000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqshrun2 Vx.16B, Vn.8H, #n" , "op": "01101111|0|immh:4|immb:3|10000|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "sqshrun Vd.4H, Vn.4S, #n" , "op": "00101111|0|immh:4|immb:3|10000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqshrun2 Vx.8H, Vn.4S, #n" , "op": "01101111|0|immh:4|immb:3|10000|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "sqshrun Vd.2S, Vn.2D, #n" , "op": "00101111|0|immh:4|immb:3|10000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqshrun2 Vx.4S, Vn.2D, #n" , "op": "01101111|0|immh:4|immb:3|10000|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "sqsub Bd, Bn, Bm" , "op": "01011110|00|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqsub Hd, Hn, Hm" , "op": "01011110|01|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqsub Sd, Sn, Sm" , "op": "01011110|10|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqsub Dd, Dn, Dm" , "op": "01011110|11|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqsub Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "sqsub Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sqxtn Bd, Hn" , "op": "01011110|00|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqxtn Hd, Sn" , "op": "01011110|01|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqxtn Sd, Dn" , "op": "01011110|10|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqxtn Vd.ta, Vn.tb" , "op": "00001110|sz|10000|10100|10|Vn|Vd" , "io": "QC|=SAT", "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "sqxtn2 Vx.ta, Vn.tb" , "op": "01001110|sz|10000|10100|10|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "sqxtun Bd, Hn" , "op": "01011110|00|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqxtun Hd, Sn" , "op": "01011110|01|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqxtun Sd, Dn" , "op": "01011110|10|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sqxtun Vd.ta, Vn.tb" , "op": "00001110|sz|10000|10100|10|Vn|Vd" , "io": "QC|=SAT", "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "sqxtun2 Vx.ta, Vn.tb" , "op": "01001110|sz|10000|10100|10|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "srhadd Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|00010|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "srhadd Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|00010|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "sri Dx, Dn, #n" , "op": "01111111|0|immh:4|immb:3|01000|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "sri Vx.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|01000|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "sri Vx.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|01000|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "srshl Dd, Dn, Dm" , "op": "01011110|11|1|Vm|01010|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "srshl Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01010|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "srshl Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01010|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "srshr Dd, Dn, #n" , "op": "01011111|0|immh:4|immb:3|00100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "srshr Vd.t, Vn.t, #n" , "op": "00001111|0|immh:4|immb:3|00100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "srshr Vd.t, Vn.t, #n" , "op": "01001111|0|immh:4|immb:3|00100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "srsra Dx, Dn, #n" , "op": "01011111|0|immh:4|immb:3|00110|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "srsra Vx.t, Vn.t, #n" , "op": "00001111|0|immh:4|immb:3|00110|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "srsra Vx.t, Vn.t, #n" , "op": "01001111|0|immh:4|immb:3|00110|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "sshl Dd, Dn, Dm" , "op": "01011110|11|1|Vm|01000|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "sshl Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|1|Vm|01000|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "sshl Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|1|Vm|01000|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sshll Vd.ta, Vn.tb, #n" , "op": "00001111|0|immh:4|immb:3|10100|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "sshll2 Vd.ta, Vn.tb, #n" , "op": "01001111|0|immh:4|immb:3|10100|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "sshr Dd, Dn, #n" , "op": "01011111|0|immh:4|immb:3|00000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "sshr Vd.t, Vn.t, #n" , "op": "00001111|0|immh:4|immb:3|00000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "sshr Vd.t, Vn.t, #n" , "op": "01001111|0|immh:4|immb:3|00000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "ssra Dx, Dn, #n" , "op": "01011111|0|immh:4|immb:3|00010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "ssra Vx.t, Vn.t, #n" , "op": "00001111|0|immh:4|immb:3|00010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "ssra Vx.t, Vn.t, #n" , "op": "01001111|0|immh:4|immb:3|00010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "ssubl Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|00100|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "ssubl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|00100|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "ssubw Vd.ta, Vn.ta, Vm.tb" , "op": "00001110|sz|1|Vm|00110|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "ssubw2 Vd.ta, Vn.ta, Vm.tb" , "op": "01001110|sz|1|Vm|00110|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "st1 Vs.B[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|000|idx:3 |Rn|Vs"},
+ {"inst": "st1 Vs.H[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|010|idx:2| 0|Rn|Vs"},
+ {"inst": "st1 Vs.S[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|100|idx:1|00|Rn|Vs"},
+ {"inst": "st1 Vs.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|100| 001|Rn|Vs"},
+ {"inst": "st1 Vs.B[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |000|idx:3 |Rn|Vs"},
+ {"inst": "st1 Vs.H[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |010|idx:2| 0|Rn|Vs"},
+ {"inst": "st1 Vs.S[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |100|idx:1|00|Rn|Vs"},
+ {"inst": "st1 Vs.D[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |100| 001|Rn|Vs"},
+ {"inst": "st1 Vs.B[#idx], [Xn|SP, #off=1]@" , "op": "0|idx:1|001101|100|11111|000|idx:3 |Rn|Vs"},
+ {"inst": "st1 Vs.H[#idx], [Xn|SP, #off=2]@" , "op": "0|idx:1|001101|100|11111|010|idx:2| 0|Rn|Vs"},
+ {"inst": "st1 Vs.S[#idx], [Xn|SP, #off=4]@" , "op": "0|idx:1|001101|100|11111|100|idx:1|00|Rn|Vs"},
+ {"inst": "st1 Vs.D[#idx], [Xn|SP, #off=8]@" , "op": "0|idx:1|001101|100|11111|100| 001|Rn|Vs"},
+ {"inst": "st1 1x{Vs.t}, [Xn|SP]" , "op": "00001100|000|00000|0111|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 1x{Vs.t}, [Xn|SP]" , "op": "01001100|000|00000|0111|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 2x{Vs.t}+, [Xn|SP]" , "op": "00001100|000|00000|1010|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 2x{Vs.t}+, [Xn|SP]" , "op": "01001100|000|00000|1010|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 3x{Vs.t}+, [Xn|SP]" , "op": "00001100|000|00000|0110|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 3x{Vs.t}+, [Xn|SP]" , "op": "01001100|000|00000|0110|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 4x{Vs.t}+, [Xn|SP]" , "op": "00001100|000|00000|0010|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 4x{Vs.t}+, [Xn|SP]" , "op": "01001100|000|00000|0010|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 1x{Vs.t}, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |0111|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 1x{Vs.t}, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0111|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 2x{Vs.t}+, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |1010|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 2x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |1010|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 3x{Vs.t}+, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |0110|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 3x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0110|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 4x{Vs.t}+, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |0010|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 4x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0010|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 1x{Vs.t}, [Xn|SP, #off==8]@" , "op": "00001100|100|11111|0111|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 1x{Vs.t}, [Xn|SP, #off==16]@" , "op": "01001100|100|11111|0111|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 2x{Vs.t}+, [Xn|SP, #off==16]@" , "op": "00001100|100|11111|1010|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 2x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "01001100|100|11111|1010|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 3x{Vs.t}+, [Xn|SP, #off==24]@" , "op": "00001100|100|11111|0110|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 3x{Vs.t}+, [Xn|SP, #off==48]@" , "op": "01001100|100|11111|0110|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st1 4x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "00001100|100|11111|0010|sz|Rn|Vs" , "t": "8B 4H 2S 1D"},
+ {"inst": "st1 4x{Vs.t}+, [Xn|SP, #off==64]@" , "op": "01001100|100|11111|0010|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st2 2x{Vs.B}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|000|idx:3 |Rn|Vs"},
+ {"inst": "st2 2x{Vs.H}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|010|idx:2| 0|Rn|Vs"},
+ {"inst": "st2 2x{Vs.S}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|100|idx:1|00|Rn|Vs"},
+ {"inst": "st2 2x{Vs.D}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|100| 001|Rn|Vs"},
+ {"inst": "st2 2x{Vs.B}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|101|Rm |000|idx:3 |Rn|Vs"},
+ {"inst": "st2 2x{Vs.H}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|101|Rm |010|idx:2| 0|Rn|Vs"},
+ {"inst": "st2 2x{Vs.S}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|101|Rm |100|idx:1|00|Rn|Vs"},
+ {"inst": "st2 2x{Vs.D}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|101|Rm |100| 001|Rn|Vs"},
+ {"inst": "st2 2x{Vs.B}+[#idx], [Xn|SP, #off=2]@" , "op": "0|idx:1|001101|101|11111|000|idx:3 |Rn|Vs"},
+ {"inst": "st2 2x{Vs.H}+[#idx], [Xn|SP, #off=4]@" , "op": "0|idx:1|001101|101|11111|010|idx:2| 0|Rn|Vs"},
+ {"inst": "st2 2x{Vs.S}+[#idx], [Xn|SP, #off=8]@" , "op": "0|idx:1|001101|101|11111|100|idx:1|00|Rn|Vs"},
+ {"inst": "st2 2x{Vs.D}+[#idx], [Xn|SP, #off=16]@" , "op": "0|idx:1|001101|101|11111|100| 001|Rn|Vs"},
+ {"inst": "st2 2x{Vs.t}+, [Xn|SP]" , "op": "00001100|000|00000|1000|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st2 2x{Vs.t}+, [Xn|SP]" , "op": "01001100|000|00000|1000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st2 2x{Vs.t}+, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |1000|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st2 2x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |1000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st2 2x{Vs.t}+, [Xn|SP, #off==16]@" , "op": "00001100|100|11111|1000|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st2 2x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "01001100|100|11111|1000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st3 3x{Vs.B}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|001|idx:3 |Rn|Vs"},
+ {"inst": "st3 3x{Vs.H}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|011|idx:2| 0|Rn|Vs"},
+ {"inst": "st3 3x{Vs.S}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|101|idx:1|00|Rn|Vs"},
+ {"inst": "st3 3x{Vs.D}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00000|101| 001|Rn|Vs"},
+ {"inst": "st3 3x{Vs.B}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |001|idx:3 |Rn|Vs"},
+ {"inst": "st3 3x{Vs.H}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |011|idx:2| 0|Rn|Vs"},
+ {"inst": "st3 3x{Vs.S}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |101|idx:1|00|Rn|Vs"},
+ {"inst": "st3 3x{Vs.D}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |101| 001|Rn|Vs"},
+ {"inst": "st3 3x{Vs.B}+[#idx], [Xn|SP, #off=3]@" , "op": "0|idx:1|001101|100|11111|001|idx:3 |Rn|Vs"},
+ {"inst": "st3 3x{Vs.H}+[#idx], [Xn|SP, #off=6]@" , "op": "0|idx:1|001101|100|11111|011|idx:2| 0|Rn|Vs"},
+ {"inst": "st3 3x{Vs.S}+[#idx], [Xn|SP, #off=12]@" , "op": "0|idx:1|001101|100|11111|101|idx:1|00|Rn|Vs"},
+ {"inst": "st3 3x{Vs.D}+[#idx], [Xn|SP, #off=24]@" , "op": "0|idx:1|001101|100|11111|101| 001|Rn|Vs"},
+ {"inst": "st3 3x{Vs.t}+, [Xn|SP]" , "op": "00001100|000|00000|0100|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st3 3x{Vs.t}+, [Xn|SP]" , "op": "01001100|000|00000|0100|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st3 3x{Vs.t}+, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |0100|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st3 3x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0100|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st3 3x{Vs.t}+, [Xn|SP, #off==16]@" , "op": "00001100|100|11111|0100|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st3 3x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "01001100|100|11111|0100|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st4 4x{Vs.B}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|001|idx:3 |Rn|Vs"},
+ {"inst": "st4 4x{Vs.H}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|011|idx:2| 0|Rn|Vs"},
+ {"inst": "st4 4x{Vs.S}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|101|idx:1|00|Rn|Vs"},
+ {"inst": "st4 4x{Vs.D}+[#idx], [Xn|SP]" , "op": "0|idx:1|001101|001|00000|101| 001|Rn|Vs"},
+ {"inst": "st4 4x{Vs.B}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |001|idx:3 |Rn|Vs"},
+ {"inst": "st4 4x{Vs.H}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |011|idx:2| 0|Rn|Vs"},
+ {"inst": "st4 4x{Vs.S}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |101|idx:1|00|Rn|Vs"},
+ {"inst": "st4 4x{Vs.D}+[#idx], [Xn|SP, Xm]@" , "op": "0|idx:1|001101|100|Rm |101| 001|Rn|Vs"},
+ {"inst": "st4 4x{Vs.B}+[#idx], [Xn|SP, #off=4]@" , "op": "0|idx:1|001101|100|11111|001|idx:3 |Rn|Vs"},
+ {"inst": "st4 4x{Vs.H}+[#idx], [Xn|SP, #off=8]@" , "op": "0|idx:1|001101|100|11111|011|idx:2| 0|Rn|Vs"},
+ {"inst": "st4 4x{Vs.S}+[#idx], [Xn|SP, #off=16]@" , "op": "0|idx:1|001101|100|11111|101|idx:1|00|Rn|Vs"},
+ {"inst": "st4 4x{Vs.D}+[#idx], [Xn|SP, #off=32]@" , "op": "0|idx:1|001101|100|11111|101| 001|Rn|Vs"},
+ {"inst": "st4 4x{Vs.t}+, [Xn|SP]" , "op": "00001100|000|00000|0000|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st4 4x{Vs.t}+, [Xn|SP]" , "op": "01001100|000|00000|0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st4 4x{Vs.t}+, [Xn|SP, Xm]@" , "op": "00001100|100|Rm |0000|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st4 4x{Vs.t}+, [Xn|SP, Xm]@" , "op": "01001100|100|Rm |0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "st4 4x{Vs.t}+, [Xn|SP, #off==32]@" , "op": "00001100|100|11111|0000|sz|Rn|Vs" , "t": "8B 4H 2S"},
+ {"inst": "st4 4x{Vs.t}+, [Xn|SP, #off==64]@" , "op": "01001100|100|11111|0000|sz|Rn|Vs" , "t": "16B 8H 4S 2D"},
+ {"inst": "stnp Sd, Sd2, [Xn|SP, #offS*4]" , "op": "00101100|00|offS:7|Vs2|Vn|Vs"},
+ {"inst": "stnp Dd, Dd2, [Xn|SP, #offS*8]" , "op": "01101100|00|offS:7|Vs2|Vn|Vs"},
+ {"inst": "stnp Qd, Qd2, [Xn|SP, #offS*16]" , "op": "10101100|00|offS:7|Vs2|Vn|Vs"},
+ {"inst": "stp Sd, Sd2, [Xn|SP, #offS*4]{@}{!}" , "op": "0010110|!post|W|0|offS:7|Vs2|Vn|Vs"},
+ {"inst": "stp Dd, Dd2, [Xn|SP, #offS*8]{@}{!}" , "op": "0110110|!post|W|0|offS:7|Vs2|Vn|Vs"},
+ {"inst": "stp Qd, Qd2, [Xn|SP, #offS*16]{@}{!}" , "op": "1010110|!post|W|0|offS:7|Vs2|Vn|Vs"},
+ {"inst": "str Bd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "00111100|001|Rm|option:3|n:1|10|Rn|Vs"},
+ {"inst": "str Hd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n}]" , "op": "01111100|001|Rm|option:3|n:1|10|Rn|Vs"},
+ {"inst": "str Sd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*2}]" , "op": "10111100|001|Rm|option:3|n:1|10|Rn|Vs"},
+ {"inst": "str Dd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*3}]" , "op": "11111100|001|Rm|option:3|n:1|10|Rn|Vs"},
+ {"inst": "str Qd, [Xn|SP, Rm, {uxtw|lsl|sxtw|sxtx #n*4}]" , "op": "00111100|101|Rm|option:3|n:1|10|Rn|Vs"},
+ {"inst": "str Bd, [Xn|SP, #offZ]" , "op": "00111101|00|offZ:12|Rn|Vs"},
+ {"inst": "str Hd, [Xn|SP, #offZ*2]" , "op": "01111101|00|offZ:12|Rn|Vs"},
+ {"inst": "str Sd, [Xn|SP, #offZ*4]" , "op": "10111101|00|offZ:12|Rn|Vs"},
+ {"inst": "str Dd, [Xn|SP, #offZ*8]" , "op": "11111101|00|offZ:12|Rn|Vs"},
+ {"inst": "str Qd, [Xn|SP, #offZ*16]" , "op": "00111101|10|offZ:12|Rn|Vs"},
+ {"inst": "str Bd, [Xn|SP, #offS]!" , "op": "00111100|000|offS:9|11|Rn|Vs"},
+ {"inst": "str Hd, [Xn|SP, #offS*2]!" , "op": "01111100|000|offS:9|11|Rn|Vs"},
+ {"inst": "str Sd, [Xn|SP, #offS*4]!" , "op": "10111100|000|offS:9|11|Rn|Vs"},
+ {"inst": "str Dd, [Xn|SP, #offS*8]!" , "op": "11111100|000|offS:9|11|Rn|Vs"},
+ {"inst": "str Qd, [Xn|SP, #offS*16]!" , "op": "00111100|100|offS:9|11|Rn|Vs"},
+ {"inst": "str Bd, [Xn|SP, #offS]@" , "op": "00111100|000|offS:9|01|Rn|Vs"},
+ {"inst": "str Hd, [Xn|SP, #offS*2]@" , "op": "01111100|000|offS:9|01|Rn|Vs"},
+ {"inst": "str Sd, [Xn|SP, #offS*4]@" , "op": "10111100|000|offS:9|01|Rn|Vs"},
+ {"inst": "str Dd, [Xn|SP, #offS*8]@" , "op": "11111100|000|offS:9|01|Rn|Vs"},
+ {"inst": "str Qd, [Xn|SP, #offS*16]@" , "op": "00111100|100|offS:9|01|Rn|Vs"},
+ {"inst": "stur Bd, [Xn|SP, #offS]" , "op": "00111100|000|offS:9|00|Rn|Vs"},
+ {"inst": "stur Hd, [Xn|SP, #offS]" , "op": "01111100|000|offS:9|00|Rn|Vs"},
+ {"inst": "stur Sd, [Xn|SP, #offS]" , "op": "10111100|000|offS:9|00|Rn|Vs"},
+ {"inst": "stur Dd, [Xn|SP, #offS]" , "op": "11111100|000|offS:9|00|Rn|Vs"},
+ {"inst": "stur Qd, [Xn|SP, #offS]" , "op": "00111100|100|offS:9|00|Rn|Vs"},
+ {"inst": "sub Dd, Dn, Dm" , "op": "01111110|11|1|Vm|10000|1|Vn|Vd"},
+ {"inst": "sub Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10000|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "sub Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10000|1|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "subhn Vd.ta, Vn.tb, Vm.tb" , "op": "00001110|sz|1|Vm|01100|0|Vn|Vd" , "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "subhn2 Vx.ta, Vn.tb, Vm.tb" , "op": "01001110|sz|1|Vm|01100|0|Vn|Vx" , "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "suqadd Bx, Bn" , "op": "01011110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "suqadd Hx, Hn" , "op": "01011110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "suqadd Sx, Sn" , "op": "01011110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "suqadd Dx, Dn" , "op": "01011110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "suqadd Vx.t, Vn.t" , "op": "00001110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "suqadd Vx.t, Vn.t" , "op": "01001110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "sxtl Vd.ta, Vn.tb" , "op": "00001111|0|immh:4|000|10100|1|Vn|Vd" , "imm": "ASimdXtlImm(sz)", "ta.tb": "8H.8B 4S.4H 2D.2S" },
+ {"inst": "sxtl2 Vd.ta, Vn.tb" , "op": "01001111|0|immh:4|000|10100|1|Vn|Vd" , "imm": "ASimdXtlImm(sz)", "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "tbl Vd.8B, Vn.16B, Vm.8B" , "op": "00001110|00|0|Vm|0|00|000|Vn|Vd"},
+ {"inst": "tbl Vd.16B, Vn.16B, Vm.16B" , "op": "01001110|00|0|Vm|0|00|000|Vn|Vd"},
+ {"inst": "tbl Vd.8B, 2x{Vn.16B}+, Vm.8B" , "op": "00001110|00|0|Vm|0|01|000|Vn|Vd"},
+ {"inst": "tbl Vd.16B, 2x{Vn.16B}+, Vm.16B" , "op": "01001110|00|0|Vm|0|01|000|Vn|Vd"},
+ {"inst": "tbl Vd.8B, 3x{Vn.16B}+, Vm.8B" , "op": "00001110|00|0|Vm|0|10|000|Vn|Vd"},
+ {"inst": "tbl Vd.16B, 3x{Vn.16B}+, Vm.16B" , "op": "01001110|00|0|Vm|0|10|000|Vn|Vd"},
+ {"inst": "tbl Vd.8B, 4x{Vn.16B}+, Vm.8B" , "op": "00001110|00|0|Vm|0|11|000|Vn|Vd"},
+ {"inst": "tbl Vd.16B, 4x{Vn.16B}+, Vm.16B" , "op": "01001110|00|0|Vm|0|11|000|Vn|Vd"},
+ {"inst": "tbx Vx.8B, Vn.16B, Vm.8B" , "op": "00001110|00|0|Vm|0|00|100|Vn|Vx"},
+ {"inst": "tbx Vx.16B, Vn.16B, Vm.16B" , "op": "01001110|00|0|Vm|0|00|100|Vn|Vx"},
+ {"inst": "tbx Vx.8B, 2x{Vn.16B}+, Vm.8B" , "op": "00001110|00|0|Vm|0|01|100|Vn|Vx"},
+ {"inst": "tbx Vx.16B, 2x{Vn.16B}+, Vm.16B" , "op": "01001110|00|0|Vm|0|01|100|Vn|Vx"},
+ {"inst": "tbx Vx.8B, 3x{Vn.16B}+, Vm.8B" , "op": "00001110|00|0|Vm|0|10|100|Vn|Vx"},
+ {"inst": "tbx Vx.16B, 3x{Vn.16B}+, Vm.16B" , "op": "01001110|00|0|Vm|0|10|100|Vn|Vx"},
+ {"inst": "tbx Vx.8B, 4x{Vn.16B}+, Vm.8B" , "op": "00001110|00|0|Vm|0|11|100|Vn|Vx"},
+ {"inst": "tbx Vx.16B, 4x{Vn.16B}+, Vm.16B" , "op": "01001110|00|0|Vm|0|11|100|Vn|Vx"},
+ {"inst": "trn1 Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|0|Vm|00101|0|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "trn1 Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|0|Vm|00101|0|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "trn2 Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|0|Vm|01101|0|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "trn2 Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|0|Vm|01101|0|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "uaba Vx.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01111|1|Vn|Vx" , "t": "8B 4H 2S"},
+ {"inst": "uaba Vx.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01111|1|Vn|Vx" , "t": "16B 8H 4S"},
+ {"inst": "uabal Vx.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|01010|0|Vn|Vx" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "uabal2 Vx.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|01010|0|Vn|Vx" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uabd Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01110|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "uabd Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01110|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "uabdl Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|01110|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "uabdl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|01110|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uadalp Vx.ta, Vn.tb" , "op": "00101110|sz|10000|00110|10|Vn|Vx" , "ta.tb": "4H.8B 2S.4H 1D.2S"},
+ {"inst": "uadalp Vx.ta, Vn.tb" , "op": "01101110|sz|10000|00110|10|Vn|Vx" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uaddl Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|00000|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "uaddl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|00000|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uaddlp Vd.ta, Vn.tb" , "op": "00101110|sz|10000|00010|10|Vn|Vd" , "ta.tb": "4H.8B 2S.4H 1D.2S"},
+ {"inst": "uaddlp Vd.ta, Vn.tb" , "op": "01101110|sz|10000|00010|10|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uaddlv Hd, Vn.8B" , "op": "00101110|00|11000|00011|10|Vn|Vd"},
+ {"inst": "uaddlv Hd, Vn.16B" , "op": "01101110|00|11000|00011|10|Vn|Vd"},
+ {"inst": "uaddlv Sd, Vn.4H" , "op": "00101110|01|11000|00011|10|Vn|Vd"},
+ {"inst": "uaddlv Sd, Vn.8H" , "op": "01101110|01|11000|00011|10|Vn|Vd"},
+ {"inst": "uaddlv Dd, Vn.4S" , "op": "01101110|10|11000|00011|10|Vn|Vd"},
+ {"inst": "uaddw Vd.ta, Vn.ta, Vm.tb" , "op": "00101110|sz|1|Vm|00010|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "uaddw2 Vd.ta, Vn.ta, Vm.tb" , "op": "01101110|sz|1|Vm|00010|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "ucvtf Sd, Wn" , "op": "00011110|00|1|00011|00000|0|Rn|Vd"},
+ {"inst": "ucvtf Sd, Wn, #fbits" , "op": "00011110|00|0|00011|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "ucvtf Sd, Xn" , "op": "10011110|00|1|00011|00000|0|Rn|Vd"},
+ {"inst": "ucvtf Sd, Xn, #fbits" , "op": "10011110|00|0|00011|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "ucvtf Sd, Sn" , "op": "01111110|00|10000|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Sd, Sn, #bits" , "op": "01111111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "ucvtf Dd, Wn" , "op": "00011110|01|1|00011|00000|0|Rn|Vd"},
+ {"inst": "ucvtf Dd, Wn, #fbits" , "op": "00011110|01|0|00011|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "ucvtf Dd, Xn" , "op": "10011110|01|1|00011|00000|0|Rn|Vd"},
+ {"inst": "ucvtf Dd, Xn, #fbits" , "op": "10011110|01|0|00011|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "ucvtf Dd, Dn" , "op": "01111110|01|10000|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Dd, Dn, #bits" , "op": "01111111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "ucvtf Vd.2S, Vn.2S" , "op": "00101110|00|10000|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Vd.4S, Vn.4S" , "op": "01101110|00|10000|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Vd.2D, Vn.2D" , "op": "01101110|01|10000|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Vd.2S, Vn.2S, #fbits" , "op": "00101111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "ucvtf Vd.4S, Vn.4S, #fbits" , "op": "01101111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 32)"},
+ {"inst": "ucvtf Vd.2D, Vn.2D, #fbits" , "op": "01101111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 64)"},
+ {"inst": "uhadd Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00000|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "uhadd Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00000|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "uhsub Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00100|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "uhsub Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00100|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "umax Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01100|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "umax Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01100|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "umaxp Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10100|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "umaxp Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10100|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "umaxv Bd, Vn.8B" , "op": "00101110|00|11000|01010|10|Vn|Vd"},
+ {"inst": "umaxv Bd, Vn.16B" , "op": "01101110|00|11000|01010|10|Vn|Vd"},
+ {"inst": "umaxv Hd, Vn.4H" , "op": "00101110|01|11000|01010|10|Vn|Vd"},
+ {"inst": "umaxv Hd, Vn.8H" , "op": "01101110|01|11000|01010|10|Vn|Vd"},
+ {"inst": "umaxv Sd, Vn.4S" , "op": "01101110|10|11000|01010|10|Vn|Vd"},
+ {"inst": "umin Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01101|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "umin Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01101|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "uminp Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|10101|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "uminp Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|10101|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "uminv Bd, Vn.8B" , "op": "00101110|00|11000|11010|10|Vn|Vd"},
+ {"inst": "uminv Bd, Vn.16B" , "op": "01101110|00|11000|11010|10|Vn|Vd"},
+ {"inst": "uminv Hd, Vn.4H" , "op": "00101110|01|11000|11010|10|Vn|Vd"},
+ {"inst": "uminv Hd, Vn.8H" , "op": "01101110|01|11000|11010|10|Vn|Vd"},
+ {"inst": "uminv Sd, Vn.4S" , "op": "01101110|10|11000|11010|10|Vn|Vd"},
+ {"inst": "umlal Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|10000|0|Vn|Vd" , "t": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "umlal2 Vd.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|10000|0|Vn|Vd" , "t": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "umlal Vd.4S, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vd"},
+ {"inst": "umlal2 Vd.4S, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|0010|idx[2]|0|Vn|Vd"},
+ {"inst": "umlal Vd.2D, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vd"},
+ {"inst": "umlal2 Vd.2D, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0] |Vm |0010|idx[1]|0|Vn|Vd"},
+ {"inst": "umlsl Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|10100|0|Vn|Vd" , "t": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "umlsl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|10100|0|Vn|Vd" , "t": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "umlsl Vd.4S, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vd"},
+ {"inst": "umlsl2 Vd.4S, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|0110|idx[2]|0|Vn|Vd"},
+ {"inst": "umlsl Vd.2D, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vd"},
+ {"inst": "umlsl2 Vd.2D, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0] |Vm |0110|idx[1]|0|Vn|Vd"},
+ {"inst": "umov Wd, Vn.B[#idx]" , "op": "00001110|00|0|idx:4| 1|00111|1|Vn|Rd"},
+ {"inst": "umov Wd, Vn.H[#idx]" , "op": "00001110|00|0|idx:3| 10|00111|1|Vn|Rd"},
+ {"inst": "umov|mov Wd, Vn.S[#idx]" , "op": "00001110|00|0|idx:2| 100|00111|1|Vn|Rd"},
+ {"inst": "umov|mov Xd, Vn.D[#idx]" , "op": "01001110|00|0|idx:1|1000|00111|1|Vn|Rd"},
+ {"inst": "umull Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|11000|0|Vn|Vd" , "t": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "umull2 Vd.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|11000|0|Vn|Vd" , "t": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "umull Vd.4S, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|1010|idx[2]|0|Vn|Vd"},
+ {"inst": "umull2 Vd.4S, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|1010|idx[2]|0|Vn|Vd"},
+ {"inst": "umull Vd.2D, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0] |Vm |1010|idx[1]|0|Vn|Vd"},
+ {"inst": "umull2 Vd.2D, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0] |Vm |1010|idx[1]|0|Vn|Vd"},
+ {"inst": "uqadd Bd, Bn, Bm" , "op": "01111110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqadd Hd, Hn, Hm" , "op": "01111110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqadd Sd, Sn, Sm" , "op": "01111110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqadd Dd, Dn, Dm" , "op": "01111110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqadd Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "uqadd Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00001|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "uqrshl Bd, Bn, Bm" , "op": "01111110|00|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqrshl Hd, Hn, Hm" , "op": "01111110|01|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqrshl Sd, Sn, Sm" , "op": "01111110|10|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqrshl Dd, Dn, Dm" , "op": "01111110|11|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqrshl Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "uqrshl Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01011|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "uqrshrn Bd, Hn, #n" , "op": "01111111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "uqrshrn Hd, Sn, #n" , "op": "01111111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "uqrshrn Sd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "uqrshrn Vd.8B, Vn.8H, #n" , "op": "00101111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "uqrshrn2 Vx.16B, Vn.8H, #n" , "op": "01101111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "uqrshrn Vd.4H, Vn.4S, #n" , "op": "00101111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "uqrshrn2 Vx.8H, Vn.4S, #n" , "op": "01101111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "uqrshrn Vd.2S, Vn.2D, #n" , "op": "00101111|0|immh:4|immb:3|10011|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "uqrshrn2 Vx.4S, Vn.2D, #n" , "op": "01101111|0|immh:4|immb:3|10011|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "uqshl Bd, Bn, Bm" , "op": "01111110|00|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqshl Hd, Hn, Hm" , "op": "01111110|01|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqshl Sd, Sn, Sm" , "op": "01111110|10|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqshl Dd, Dn, Dm" , "op": "01111110|11|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqshl Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "uqshl Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01001|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "uqshl Bd, Bn, #n" , "op": "01111111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 0)"},
+ {"inst": "uqshl Hd, Hn, #n" , "op": "01111111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 1)"},
+ {"inst": "uqshl Sd, Sn, #n" , "op": "01111111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 2)"},
+ {"inst": "uqshl Dd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, 3)"},
+ {"inst": "uqshl Vd.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "uqshl Vd.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|01110|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "uqshrn Bd, Hn, #n" , "op": "01111111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 0)"},
+ {"inst": "uqshrn Hd, Sn, #n" , "op": "01111111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 1)"},
+ {"inst": "uqshrn Sd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 2)"},
+ {"inst": "uqshrn Vd.ta, Vn.tb, #n" , "op": "00001111|0|immh:4|immb:3|10010|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "uqshrn2 Vx.ta, Vn.tb, #n" , "op": "01001111|0|immh:4|immb:3|10010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "uqsub Bd, Bn, Bm" , "op": "01111110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqsub Hd, Hn, Hm" , "op": "01111110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqsub Sd, Sn, Sm" , "op": "01111110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqsub Dd, Dn, Dm" , "op": "01111110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqsub Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "uqsub Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00101|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "uqxtn Bd, Hn" , "op": "01111110|00|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqxtn Hd, Sn" , "op": "01111110|01|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqxtn Sd, Dn" , "op": "01111110|10|10000|10100|10|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "uqxtn Vd.ta, Vn.tb" , "op": "00101110|sz|10000|10100|10|Vn|Vd" , "io": "QC|=SAT", "ta.tb": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "uqxtn2 Vx.ta, Vn.tb" , "op": "01101110|sz|10000|10100|10|Vn|Vx" , "io": "QC|=SAT", "ta.tb": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "urecpe Vd.2S, Vn.2S" , "op": "00001110|10|10000|11100|10|Vn|Vd"},
+ {"inst": "urecpe Vd.4S, Vn.4S" , "op": "01001110|10|10000|11100|10|Vn|Vd"},
+ {"inst": "urhadd Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|00010|1|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "urhadd Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|00010|1|Vn|Vd" , "t": "16B 8H 4S"},
+ {"inst": "urshl Dd, Dn, Dm" , "op": "01111110|11|1|Vm|01010|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "urshl Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01010|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "urshl Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01010|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "urshr Dd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|00100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "urshr Vd.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|00100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "urshr Vd.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|00100|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "ursqrte Vd.2S, Vn.2S" , "op": "00101110|10|10000|11100|10|Vn|Vd"},
+ {"inst": "ursqrte Vd.4S, Vn.4S" , "op": "01101110|10|10000|11100|10|Vn|Vd"},
+ {"inst": "ursra Dx, Dn, #n" , "op": "01111111|0|immh:4|immb:3|00110|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "ursra Vx.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|00110|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "ursra Vx.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|00110|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "ushl Dd, Dn, Dm" , "op": "01111110|11|1|Vm|01000|1|Vn|Vd" , "io": "QC|=SAT"},
+ {"inst": "ushl Vd.t, Vn.t, Vm.t" , "op": "00101110|sz|1|Vm|01000|1|Vn|Vd" , "io": "QC|=SAT", "t": "8B 4H 2S"},
+ {"inst": "ushl Vd.t, Vn.t, Vm.t" , "op": "01101110|sz|1|Vm|01000|1|Vn|Vd" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "ushll Vd.ta, Vn.tb, #n" , "op": "00101111|0|immh:4|immb:3|10100|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "ushll2 Vd.ta, Vn.tb, #n" , "op": "01101111|0|immh:4|immb:3|10100|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftPImm(n, sz)", "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "ushr Dd, Dn, #n" , "op": "01111111|0|immh:4|immb:3|00000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "ushr Vd.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|00000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "ushr Vd.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|00000|1|Vn|Vd" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "usqadd Bx, Bn" , "op": "01111110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "usqadd Hx, Hn" , "op": "01111110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "usqadd Sx, Sn" , "op": "01111110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "usqadd Dx, Dn" , "op": "01111110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "usqadd Vx.t, Vn.t" , "op": "00101110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT", "t": "16B 8H 4S"},
+ {"inst": "usqadd Vx.t, Vn.t" , "op": "01101110|sz|10000|00011|10|Vn|Vx" , "io": "QC|=SAT", "t": "16B 8H 4S 2D"},
+ {"inst": "usra Dx, Dn, #n" , "op": "01111111|0|immh:4|immb:3|00010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, 3)"},
+ {"inst": "usra Vx.t, Vn.t, #n" , "op": "00101111|0|immh:4|immb:3|00010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "8B 4H 2S"},
+ {"inst": "usra Vx.t, Vn.t, #n" , "op": "01101111|0|immh:4|immb:3|00010|1|Vn|Vx" , "io": "QC|=SAT", "imm": "ASimdShiftNImm(n, sz)", "t": "16B 8H 4S 2D"},
+ {"inst": "usubl Vd.ta, Vn.tb, Vm.tb" , "op": "00101110|sz|1|Vm|00100|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "usubl2 Vd.ta, Vn.tb, Vm.tb" , "op": "01101110|sz|1|Vm|00100|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "usubw Vd.ta, Vn.ta, Vm.tb" , "op": "00101110|sz|1|Vm|00110|0|Vn|Vd" , "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "usubw2 Vd.ta, Vn.ta, Vm.tb" , "op": "01101110|sz|1|Vm|00110|0|Vn|Vd" , "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uxtl Vd.ta, Vn.tb" , "op": "00101111|0|immh:4|000|10100|1|Vn|Vd" , "imm": "ASimdXtlImm(sz)", "ta.tb": "8H.8B 4S.4H 2D.2S"},
+ {"inst": "uxtl2 Vd.ta, Vn.tb" , "op": "01101111|0|immh:4|000|10100|1|Vn|Vd" , "imm": "ASimdXtlImm(sz)", "ta.tb": "8H.16B 4S.8H 2D.4S"},
+ {"inst": "uzp1 Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|0|Vm|00011|0|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "uzp1 Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|0|Vm|00011|0|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "uzp2 Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|0|Vm|01011|0|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "uzp2 Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|0|Vm|01011|0|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "xtn Vd.ta, Vn.tb" , "op": "00001110|sz|10000|10010|10|Vn|Vd" , "t": "8B.8H 4H.4S 2S.2D"},
+ {"inst": "xtn2 Vx.ta, Vn.tb" , "op": "01001110|sz|10000|10010|10|Vn|Vx" , "t": "16B.8H 8H.4S 4S.2D"},
+ {"inst": "zip1 Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|0|Vm|00111|0|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "zip1 Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|0|Vm|00111|0|Vn|Vd" , "t": "16B 8H 4S 2D"},
+ {"inst": "zip2 Vd.t, Vn.t, Vm.t" , "op": "00001110|sz|0|Vm|01111|0|Vn|Vd" , "t": "8B 4H 2S"},
+ {"inst": "zip2 Vd.t, Vn.t, Vm.t" , "op": "01001110|sz|0|Vm|01111|0|Vn|Vd" , "t": "16B 8H 4S 2D"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "AES", "data": [
+ {"inst": "aesd Vd.16B, Vn.16B" , "op": "01001110|00|10100|00101|10|Vn|Vd"},
+ {"inst": "aese Vd.16B, Vn.16B" , "op": "01001110|00|10100|00100|10|Vn|Vd"},
+ {"inst": "aesimc Vd.16B, Vn.16B" , "op": "01001110|00|10100|00111|10|Vn|Vd"},
+ {"inst": "aesmc Vd.16B, Vn.16B" , "op": "01001110|00|10100|00110|10|Vn|Vd"}
+ ]},
+
+ {"category": "ASIMD", "ext": "BF16", "data": [
+ {"inst": "bfcvt Hd, Sn" , "op": "00011110|01|10001|10100|00|Vn|Vd"},
+ {"inst": "bfcvtn Vd.4H, Vn.4S" , "op": "00001110|10|10000|10110|10|Vn|Vd"},
+ {"inst": "bfcvtn2 Vd.8H, Vn.4S" , "op": "01001110|10|10000|10110|10|Vn|Vd"},
+ {"inst": "bfdot Vx.2S, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "bfdot Vx.4S, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "bfdot Vx.2S, Vn.4H, Vm.2H[#idx]" , "op": "00001111|01|idx[0]|Vm|1111|idx[1]|0|Vn|Vx"},
+ {"inst": "bfdot Vx.4S, Vn.8H, Vm.2H[#idx]" , "op": "01001111|01|idx[0]|Vm|1111|idx[1]|0|Vn|Vx"},
+ {"inst": "bfmlalb Vx.4S, Vn.8H, Vm.8H" , "op": "00101110|11|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "bfmlalb Vx.4S, Vn.8H, Vm.H[#idx]" , "op": "00001111|11|idx[1:0]|Vm:4|1111|idx[2]|1|Vn|Vx"},
+ {"inst": "bfmlalt Vx.4S, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "bfmlalt Vx.4S, Vn.8H, Vm.H[#idx]" , "op": "01001111|11|idx[1:0]|Vm:4|1111|idx[2]|1|Vn|Vx"},
+ {"inst": "bfmmla Vx.4S, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|11101|1|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "DOTPROD", "data": [
+ {"inst": "sdot Vx.2S, Vn.8B, Vm.8B" , "op": "00001110|10|0|Vm|10010|1|Vn|Vx"},
+ {"inst": "sdot Vx.4S, Vn.16B, Vm.16B" , "op": "01001110|10|0|Vm|10010|1|Vn|Vx"},
+ {"inst": "sdot Vx.2S, Vn.8B, Vm.4B[#idx]" , "op": "00001111|10|idx[0]|Vm|1110|idx[1]|0|Vn|Vx"},
+ {"inst": "sdot Vx.4S, Vn.16B, Vm.4B[#idx]" , "op": "01001111|10|idx[0]|Vm|1110|idx[1]|0|Vn|Vx"},
+ {"inst": "udot Vx.2S, Vn.8B, Vm.8B" , "op": "00101110|10|0|Vm|10010|1|Vn|Vx"},
+ {"inst": "udot Vx.4S, Vn.16B, Vm.16B" , "op": "01101110|10|0|Vm|10010|1|Vn|Vx"},
+ {"inst": "udot Vx.2S, Vn.8B, Vm.4B[#idx]" , "op": "00101111|10|idx[0]|Vm|1110|idx[1]|0|Vn|Vx"},
+ {"inst": "udot Vx.4S, Vn.16B, Vm.4B[#idx]" , "op": "01101111|10|idx[0]|Vm|1110|idx[1]|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FAMINMAX", "data": [
+ {"inst": "famax Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|11|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "famax Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|11|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "famax Vd.2S, Vn.2S, Vm.2S" , "op": "00001110|10|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "famax Vd.4S, Vn.4S, Vm.4S" , "op": "01001110|10|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "famax Vd.2D, Vn.2D, Vm.2D" , "op": "01001110|11|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "famin Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "famin Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "famin Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "famin Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|10|1|Vm|11011|1|Vn|Vd"},
+ {"inst": "famin Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|1|Vm|11011|1|Vn|Vd"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FCMA", "data": [
+ {"inst": "fcadd Vd.t, Vn.t, Vm.t, #rotate" , "op": "00101110|sz|0|Vm|111|imm:1|01|Vn|Vd" , "imm": "ASimdRotateImm_90_270(rotate)", "t": "4H 2S"},
+ {"inst": "fcadd Vd.t, Vn.t, Vm.t, #rotate" , "op": "01101110|sz|0|Vm|111|imm:1|01|Vn|Vd" , "imm": "ASimdRotateImm_90_270(rotate)", "t": "8H 4S 2D"},
+ {"inst": "fcmla Vd.t, Vn.t, Vm.t, #rotate" , "op": "00101110|sz|0|Vm|110|imm:2|1|Vn|Vd" , "imm": "ASimdRotateImm_0_90_180_270(rotate)", "t": "4H 2S"},
+ {"inst": "fcmla Vd.t, Vn.t, Vm.t, #rotate" , "op": "01101110|sz|0|Vm|110|imm:2|1|Vn|Vd" , "imm": "ASimdRotateImm_0_90_180_270(rotate)", "t": "8H 4S 2D"},
+ {"inst": "fcmla Vd.4H, Vn.4H, Vm.H[#idx], #rotate" , "op": "00101111|01|idx[0]|Vm|1|imm:2|1|idx[1]|0|Vn|Vd" , "imm": "ASimdRotateImm_0_90_180_270(rotate)"},
+ {"inst": "fcmla Vd.8H, Vn.8H, Vm.H[#idx], #rotate" , "op": "01101111|01|idx[0]|Vm|1|imm:2|1|idx[1]|0|Vn|Vd" , "imm": "ASimdRotateImm_0_90_180_270(rotate)"},
+ {"inst": "fcmla Vd.4S, Vn.4S, Vm.S[#idx], #rotate" , "op": "01101111|10|0|Vm|1|imm:2|1|idx:1|0|Vn|Vd" , "imm": "ASimdRotateImm_0_90_180_270(rotate)"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FHM", "data": [
+ {"inst": "fmlal Vx.2S, Vn.2H, Vm.2H" , "op": "00001110|00|1|Vm|11101|1|Vn|Vx"},
+ {"inst": "fmlal Vx.4S, Vn.4H, Vm.4H" , "op": "01001110|00|1|Vm|11101|1|Vn|Vx"},
+ {"inst": "fmlal Vx.2S, Vn.2H, Vm.H[#idx]" , "op": "00001111|10|imm[1:0]|Vm:4|0000|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlal Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "01001111|10|imm[1:0]|Vm:4|0000|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlal2 Vx.2S, Vn.2H, Vm.2H" , "op": "00101110|00|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmlal2 Vx.4S, Vn.4H, Vm.4H" , "op": "01101110|00|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmlal2 Vx.2S, Vn.2H, Vm.H[#idx]" , "op": "00101111|10|imm[1:0]|Vm:4|1000|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlal2 Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "01101111|10|imm[1:0]|Vm:4|1000|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlsl Vx.2S, Vn.2H, Vm.2H" , "op": "00001110|10|1|Vm|11101|1|Vn|Vx"},
+ {"inst": "fmlsl Vx.4S, Vn.4H, Vm.4H" , "op": "01001110|10|1|Vm|11101|1|Vn|Vx"},
+ {"inst": "fmlsl Vx.2S, Vn.2H, Vm.H[#idx]" , "op": "00001111|10|imm[1:0]|Vm:4|0100|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlsl Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "01001111|10|imm[1:0]|Vm:4|0100|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlsl2 Vx.2S, Vn.2H, Vm.2H" , "op": "00101110|10|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmlsl2 Vx.4S, Vn.4H, Vm.4H" , "op": "01101110|10|1|Vm|11001|1|Vn|Vx"},
+ {"inst": "fmlsl2 Vx.2S, Vn.2H, Vm.H[#idx]" , "op": "00101111|10|imm[1:0]|Vm:4|1100|imm[2]|0|Vn|Vx"},
+ {"inst": "fmlsl2 Vx.4S, Vn.4H, Vm.H[#idx]" , "op": "01101111|10|imm[1:0]|Vm:4|1100|imm[2]|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FP16", "data": [
+ {"inst": "fabd Hd, Hn, Hm" , "op": "01111110|11|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "fabd Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "fabd Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "fabs Hd, Hn" , "op": "00011110|11|10000|01100|00|Vn|Vd"},
+ {"inst": "fabs Vd.4H, Vn.4H" , "op": "00001110|11|11100|01111|10|Vn|Vd"},
+ {"inst": "fabs Vd.8H, Vn.8H" , "op": "01001110|11|11100|01111|10|Vn|Vd"},
+ {"inst": "facge Hd, Hn, Hm" , "op": "01111110|01|0|Vm|00101|1|Vn|Vd"},
+ {"inst": "facge Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00101|1|Vn|Vd"},
+ {"inst": "facge Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00101|1|Vn|Vd"},
+ {"inst": "facgt Hd, Hn, Hm" , "op": "01111110|11|0|Vm|00101|1|Vn|Vd"},
+ {"inst": "facgt Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00101|1|Vn|Vd"},
+ {"inst": "facgt Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00101|1|Vn|Vd"},
+ {"inst": "fadd Hd, Hn, Hm" , "op": "00011110|11|1|Vm|00101|0|Vn|Vd"},
+ {"inst": "fadd Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "fadd Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "faddp Hd, Vn.2H" , "op": "01011110|00|11000|01101|10|Vn|Vd"},
+ {"inst": "faddp Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "faddp Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "fccmp Hn, Hm, #nzcv, #cond" , "op": "00011110|11|1|Vm|cond|01|Vn|0|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fccmpe Hn, Hm, #nzcv, #cond" , "op": "00011110|11|1|Vm|cond|01|Vn|1|nzcv" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmeq Hd, Hn, Hm" , "op": "01011110|01|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmeq Hd, Hn, #0" , "op": "01011110|11|11100|01101|10|Vn|Vd"},
+ {"inst": "fcmeq Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmeq Vd.4H, Vn.4H, #0" , "op": "00001110|11|11100|01101|10|Vn|Vd"},
+ {"inst": "fcmeq Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmeq Vd.8H, Vn.8H, #0" , "op": "01001110|11|11100|01101|10|Vn|Vd"},
+ {"inst": "fcmge Hd, Hn, Hm" , "op": "01111110|01|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmge Hd, Hn, #0" , "op": "01111110|11|11100|01100|10|Vn|Vd"},
+ {"inst": "fcmge Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmge Vd.4H, Vn.4H, #0" , "op": "00101110|11|11100|01100|10|Vn|Vd"},
+ {"inst": "fcmge Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmge Vd.8H, Vn.8H, #0" , "op": "01101110|11|11100|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Hd, Hn, Hm" , "op": "01111110|11|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmgt Hd, Hn, #0" , "op": "01011110|11|11100|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmgt Vd.4H, Vn.4H, #0" , "op": "00001110|11|11100|01100|10|Vn|Vd"},
+ {"inst": "fcmgt Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00100|1|Vn|Vd"},
+ {"inst": "fcmgt Vd.8H, Vn.8H, #0" , "op": "01001110|11|11100|01100|10|Vn|Vd"},
+ {"inst": "fcmle Hd, Hn, #0" , "op": "01111110|11|11100|01101|10|Vn|Vd"},
+ {"inst": "fcmle Vd.4H, Vn.4H, #0" , "op": "00101110|11|11100|01101|10|Vn|Vd"},
+ {"inst": "fcmle Vd.8H, Vn.8H, #0" , "op": "01101110|11|11100|01101|10|Vn|Vd"},
+ {"inst": "fcmlt Hd, Hn, #0" , "op": "01011110|11|11100|01110|10|Vn|Vd"},
+ {"inst": "fcmlt Vd.4H, Vn.4H, #0" , "op": "00001110|11|11100|01110|10|Vn|Vd"},
+ {"inst": "fcmlt Vd.8H, Vn.8H, #0" , "op": "01001110|11|11100|01110|10|Vn|Vd"},
+ {"inst": "fcmp Hn, Hm" , "op": "00011110|11|1|Vm|00100|0|Vn|00000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmp Hn, #0" , "op": "00011110|11|1|00000|00100|0|Vn|01000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmpe Hn, Hm" , "op": "00011110|11|1|Vm|00100|0|Vn|10000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcmpe Hn, #0" , "op": "00011110|11|1|00000|00100|0|Vn|11000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "fcsel Hd, Hn, Hm, #cond" , "op": "00011110|11|1|Vm|cond|11|Vn|Vd" , "io": "N=R Z=R C=R V=R"},
+ {"inst": "fcvtas Wd, Hn" , "op": "00011110|11|10010|00000|00|Vn|Rd"},
+ {"inst": "fcvtas Xd, Hn" , "op": "10011110|11|10010|00000|00|Vn|Rd"},
+ {"inst": "fcvtas Hd, Hn" , "op": "01011110|01|11100|11100|10|Vn|Vd"},
+ {"inst": "fcvtas Vd.4H, Vn.4H" , "op": "00001110|01|11100|11100|10|Vn|Vd"},
+ {"inst": "fcvtas Vd.8H, Vn.8H" , "op": "01001110|01|11100|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Wd, Hn" , "op": "00011110|11|10010|10000|00|Vn|Rd"},
+ {"inst": "fcvtau Xd, Hn" , "op": "10011110|11|10010|10000|00|Vn|Rd"},
+ {"inst": "fcvtau Hd, Hn" , "op": "01111110|01|11100|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Vd.4H, Vn.4H" , "op": "00101110|01|11100|11100|10|Vn|Vd"},
+ {"inst": "fcvtau Vd.8H, Vn.8H" , "op": "01101110|01|11100|11100|10|Vn|Vd"},
+ {"inst": "fcvtms Wd, Hn" , "op": "00011110|11|11000|00000|00|Vn|Rd"},
+ {"inst": "fcvtms Xd, Hn" , "op": "10011110|11|11000|00000|00|Vn|Rd"},
+ {"inst": "fcvtms Hd, Hn" , "op": "01011110|01|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtms Vd.4H, Vn.4H" , "op": "00001110|01|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtms Vd.8H, Vn.8H" , "op": "01001110|01|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Wd, Hn" , "op": "00011110|11|11000|10000|00|Vn|Rd"},
+ {"inst": "fcvtmu Xd, Hn" , "op": "10011110|11|11000|10000|00|Vn|Rd"},
+ {"inst": "fcvtmu Hd, Hn" , "op": "01111110|01|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Vd.4H, Vn.4H" , "op": "00101110|01|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtmu Vd.8H, Vn.8H" , "op": "01101110|01|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtns Wd, Hn" , "op": "00011110|11|10000|00000|00|Vn|Rd"},
+ {"inst": "fcvtns Xd, Hn" , "op": "10011110|11|10000|00000|00|Vn|Rd"},
+ {"inst": "fcvtns Hd, Hn" , "op": "01011110|01|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtns Vd.4H, Vn.4H" , "op": "00001110|01|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtns Vd.8H, Vn.8H" , "op": "01001110|01|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Wd, Hn" , "op": "00011110|11|10000|10000|00|Vn|Rd"},
+ {"inst": "fcvtnu Xd, Hn" , "op": "10011110|11|10000|10000|00|Vn|Rd"},
+ {"inst": "fcvtnu Hd, Hn" , "op": "01111110|01|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Vd.4H, Vn.4H" , "op": "00101110|01|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtnu Vd.8H, Vn.8H" , "op": "01101110|01|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Wd, Hn" , "op": "00011110|11|10100|00000|00|Vn|Rd"},
+ {"inst": "fcvtps Xd, Hn" , "op": "10011110|11|10100|00000|00|Vn|Rd"},
+ {"inst": "fcvtps Hd, Hn" , "op": "01011110|11|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Vd.4H, Vn.4H" , "op": "00001110|11|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtps Vd.8H, Vn.8H" , "op": "01001110|11|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Wd, Hn" , "op": "00011110|11|10100|10000|00|Vn|Rd"},
+ {"inst": "fcvtpu Xd, Hn" , "op": "10011110|11|10100|10000|00|Vn|Rd"},
+ {"inst": "fcvtpu Hd, Hn" , "op": "01111110|11|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Vd.4H, Vn.4H" , "op": "00101110|11|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtpu Vd.8H, Vn.8H" , "op": "01101110|11|11100|11010|10|Vn|Vd"},
+ {"inst": "fcvtzs Wd, Hn" , "op": "00011110|11|11100|00000|00|Vn|Rd"},
+ {"inst": "fcvtzs Xd, Hn" , "op": "10011110|11|11100|00000|00|Vn|Rd"},
+ {"inst": "fcvtzs Hd, Hn" , "op": "01011110|11|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Vd.4H, Vn.4H" , "op": "00001110|11|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Vd.8H, Vn.8H" , "op": "01001110|11|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtzs Wd, Hn, #fbits" , "op": "00011110|11|011000|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "fcvtzs Xd, Hn, #fbits" , "op": "10011110|11|011000|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "fcvtzs Hd, Hn, #fbits" , "op": "01011111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "fcvtzs Vd.4H, Vn.4H, #fbits" , "op": "00001111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "fcvtzs Vd.8H, Vn.8H, #fbits" , "op": "01001111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "fcvtzu Wd, Hn" , "op": "00011110|11|11100|10000|00|Vn|Rd"},
+ {"inst": "fcvtzu Xd, Hn" , "op": "10011110|11|11100|10000|00|Vn|Rd"},
+ {"inst": "fcvtzu Hd, Hn" , "op": "01111110|11|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Vd.4H, Vn.4H" , "op": "00101110|11|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Vd.8H, Vn.8H" , "op": "01101110|11|11100|11011|10|Vn|Vd"},
+ {"inst": "fcvtzu Wd, Hn, #fbits" , "op": "00011110|11|011001|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "fcvtzu Xd, Hn, #fbits" , "op": "10011110|11|011001|scale:6|Vn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "fcvtzu Hd, Hn, #fbits" , "op": "01111111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "fcvtzu Vd.4H, Vn.4H, #fbits" , "op": "00101111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "fcvtzu Vd.8H, Vn.8H, #fbits" , "op": "01101111|0|immh:4|immb:3|11111|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "fdiv Hd, Hn, Hm" , "op": "00011110|11|1|Vm|00011|0|Vn|Vd"},
+ {"inst": "fdiv Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "fdiv Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "fmadd Hd, Hn, Hm, Ha" , "op": "00011111|11|0|Vm|0|Va|Vn|Vd"},
+ {"inst": "fmax Hd, Hn, Hm" , "op": "00011110|11|1|Vm|01001|0|Vn|Vd"},
+ {"inst": "fmax Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fmax Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fmaxnm Hd, Hn, Hm" , "op": "00011110|11|1|Vm|01101|0|Vn|Vd"},
+ {"inst": "fmaxnm Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fmaxnm Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fmaxnmp Hd, Vn.2H" , "op": "01011110|00|11000|01100|10|Vn|Vd"},
+ {"inst": "fmaxnmp Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fmaxnmp Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fmaxnmv Hd, Vn.4H" , "op": "00001110|00|11000|01100|10|Vn|Vd"},
+ {"inst": "fmaxnmv Hd, Vn.8H" , "op": "01001110|00|11000|01100|10|Vn|Vd"},
+ {"inst": "fmaxp Hd, Vn.2H" , "op": "01011110|00|11000|01111|10|Vn|Vd"},
+ {"inst": "fmaxp Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fmaxp Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fmaxv Hd, Vn.4H" , "op": "00001110|00|11000|01111|10|Vn|Vd"},
+ {"inst": "fmaxv Hd, Vn.8H" , "op": "01001110|00|11000|01111|10|Vn|Vd"},
+ {"inst": "fmin Hd, Hn, Hm" , "op": "00011110|11|1|Vm|01011|0|Vn|Vd"},
+ {"inst": "fmin Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|11|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fmin Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|11|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fminnm Hd, Hn, Hm" , "op": "00011110|11|1|Vm|01111|0|Vn|Vd"},
+ {"inst": "fminnm Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|11|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fminnm Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|11|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fminnmp Hd, Vn.2H" , "op": "01011110|10|11000|01100|10|Vn|Vd"},
+ {"inst": "fminnmp Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fminnmp Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00000|1|Vn|Vd"},
+ {"inst": "fminnmv Hd, Vn.4H" , "op": "00001110|10|11000|01100|10|Vn|Vd"},
+ {"inst": "fminnmv Hd, Vn.8H" , "op": "01001110|10|11000|01100|10|Vn|Vd"},
+ {"inst": "fminp Hd, Vn.2H" , "op": "01011110|10|11000|01111|10|Vn|Vd"},
+ {"inst": "fminp Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fminp Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00110|1|Vn|Vd"},
+ {"inst": "fminv Hd, Vn.4H" , "op": "00001110|10|11000|01111|10|Vn|Vd"},
+ {"inst": "fminv Hd, Vn.8H" , "op": "01001110|10|11000|01111|10|Vn|Vd"},
+ {"inst": "fmla Hx, Hn, Vm.H[#idx]" , "op": "01011111|00|idx[1:0]|Vm:4|0001|idx[2]|0|Vn|Vx"},
+ {"inst": "fmla Vx.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00001|1|Vn|Vx"},
+ {"inst": "fmla Vx.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00001|1|Vn|Vx"},
+ {"inst": "fmla Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00001111|00|idx[1:0]|Vm:4|0001|idx[2]|0|Vn|Vx"},
+ {"inst": "fmla Vx.8H, Vn.8H, Vm.H[#idx]" , "op": "01001111|00|idx[1:0]|Vm:4|0001|idx[2]|0|Vn|Vx"},
+ {"inst": "fmls Hx, Hn, Vm.H[#idx]" , "op": "01011111|00|idx[1:0]|Vm:4|0101|idx[2]|0|Vn|Vx"},
+ {"inst": "fmls Vx.4H, Vn.4H, Vm.4H" , "op": "00001110|11|0|Vm|00001|1|Vn|Vx"},
+ {"inst": "fmls Vx.8H, Vn.8H, Vm.8H" , "op": "01001110|11|0|Vm|00001|1|Vn|Vx"},
+ {"inst": "fmls Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00001111|00|idx[1:0]|Vm:4|0101|idx[2]|0|Vn|Vx"},
+ {"inst": "fmls Vx.8H, Vn.8H, Vm.H[#idx]" , "op": "01001111|00|idx[1:0]|Vm:4|0101|idx[2]|0|Vn|Vx"},
+ {"inst": "fmov Wd, Hn" , "op": "00011110|11|10011|00000|00|Vn|Rd"},
+ {"inst": "fmov Xd, Hn" , "op": "10011110|11|10011|00000|00|Vn|Rd"},
+ {"inst": "fmov Hd, Wn" , "op": "00011110|11|10011|10000|00|Rn|Vd"},
+ {"inst": "fmov Hd, Xn" , "op": "10011110|11|10011|10000|00|Rn|Vd"},
+ {"inst": "fmov Hd, Hn" , "op": "00011110|11|10000|00100|00|Vn|Vd"},
+ {"inst": "fmov Hd, #fimm" , "op": "00011110|11|1|imm:8|100|00000|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmov Vd.4H, #fimm" , "op": "00001111|00|000|abc:3|111111|defgh:5|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmov Vd.8H, #fimm" , "op": "01001111|00|000|abc:3|111111|defgh:5|Vd" , "imm": "ASimdFMovImm(fimm)"},
+ {"inst": "fmsub Hd, Hn, Hm, Ha" , "op": "00011111|11|0|Vm|1|Va|Vn|Vd"},
+ {"inst": "fmul Hd, Hn, Hm" , "op": "00011110|11|1|Vm|00001|0|Vn|Vd"},
+ {"inst": "fmul Hd, Hn, Vm.H[#idx]" , "op": "01011111|00|idx[1:0]|Vm:4|1001|idx[2]|0|Vn|Vd"},
+ {"inst": "fmul Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|01|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "fmul Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|01|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "fmul Vd.4H, Vn.4H, Vm.H[#idx]" , "op": "00001111|00|idx[1:0]|Vm:4|1001|idx[2]|0|Vn|Vd"},
+ {"inst": "fmul Vd.8H, Vn.8H, Vm.H[#idx]" , "op": "01001111|00|idx[1:0]|Vm:4|1001|idx[2]|0|Vn|Vd"},
+ {"inst": "fmulx Hd, Hn, Hm" , "op": "01011110|01|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "fmulx Hd, Hn, Vm.H[#idx]" , "op": "01111111|00|idx[1:0]|Vm:4|1001|idx[2]|0|Vn|Vd"},
+ {"inst": "fmulx Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "fmulx Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00011|1|Vn|Vd"},
+ {"inst": "fmulx Vd.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|00|idx[1:0]|Vm:4|1001|idx[2]|0|Vn|Vd"},
+ {"inst": "fmulx Vd.8H, Vn.8H, Vm.H[#idx]" , "op": "01101111|00|idx[1:0]|Vm:4|1001|idx[2]|0|Vn|Vd"},
+ {"inst": "fneg Hd, Hn" , "op": "00011110|11|10000|10100|00|Vn|Vd"},
+ {"inst": "fneg Vd.4H, Vn.4H" , "op": "00101110|11|11100|01111|10|Vn|Vd"},
+ {"inst": "fneg Vd.8H, Vn.8H" , "op": "01101110|11|11100|01111|10|Vn|Vd"},
+ {"inst": "fnmadd Hd, Hn, Hm, Ha" , "op": "00011111|11|1|Vm|0|Va|Vn|Vd"},
+ {"inst": "fnmsub Hd, Hn, Hm, Ha" , "op": "00011111|11|1|Vm|1|Va|Vn|Vd"},
+ {"inst": "fnmul Hd, Hn, Hm" , "op": "00011110|11|1|Vm|10001|0|Vn|Vd"},
+ {"inst": "frecpe Hd, Hn" , "op": "01011110|11|11100|11101|10|Vn|Vd"},
+ {"inst": "frecpe Vd.4H, Vn.4H" , "op": "00001110|11|11100|11101|10|Vn|Vd"},
+ {"inst": "frecpe Vd.8H, Vn.8H" , "op": "01001110|11|11100|11101|10|Vn|Vd"},
+ {"inst": "frecps Hd, Hn, Hm" , "op": "01011110|01|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "frecps Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "frecps Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "frecpx Hd, Hn, Hm" , "op": "01011110|11|11100|11111|10|Vn|Vd"},
+ {"inst": "frinta Hd, Hn" , "op": "00011110|11|10011|00100|00|Vn|Vd"},
+ {"inst": "frinta Vd.4H, Vn.4H" , "op": "00101110|01|11100|11000|10|Vn|Vd"},
+ {"inst": "frinta Vd.8H, Vn.8H" , "op": "01101110|01|11100|11000|10|Vn|Vd"},
+ {"inst": "frinti Hd, Hn" , "op": "00011110|11|10011|11100|00|Vn|Vd"},
+ {"inst": "frinti Vd.4H, Vn.4H" , "op": "00101110|11|11100|11001|10|Vn|Vd"},
+ {"inst": "frinti Vd.8H, Vn.8H" , "op": "01101110|11|11100|11001|10|Vn|Vd"},
+ {"inst": "frintm Hd, Hn" , "op": "00011110|11|10010|10100|00|Vn|Vd"},
+ {"inst": "frintm Vd.4H, Vn.4H" , "op": "00001110|01|11100|11001|10|Vn|Vd"},
+ {"inst": "frintm Vd.8H, Vn.8H" , "op": "01001110|01|11100|11001|10|Vn|Vd"},
+ {"inst": "frintn Hd, Hn" , "op": "00011110|11|10010|00100|00|Vn|Vd"},
+ {"inst": "frintn Vd.4H, Vn.4H" , "op": "00001110|01|11100|11000|10|Vn|Vd"},
+ {"inst": "frintn Vd.8H, Vn.8H" , "op": "01001110|01|11100|11000|10|Vn|Vd"},
+ {"inst": "frintp Hd, Hn" , "op": "00011110|11|10010|01100|00|Vn|Vd"},
+ {"inst": "frintp Vd.4H, Vn.4H" , "op": "00001110|11|11100|11000|10|Vn|Vd"},
+ {"inst": "frintp Vd.8H, Vn.8H" , "op": "01001110|11|11100|11000|10|Vn|Vd"},
+ {"inst": "frintx Hd, Hn" , "op": "00011110|11|10011|10100|00|Vn|Vd"},
+ {"inst": "frintx Vd.4H, Vn.4H" , "op": "00101110|01|11100|11001|10|Vn|Vd"},
+ {"inst": "frintx Vd.8H, Vn.8H" , "op": "01101110|01|11100|11001|10|Vn|Vd"},
+ {"inst": "frintz Hd, Hn" , "op": "00011110|11|10010|11100|00|Vn|Vd"},
+ {"inst": "frintz Vd.4H, Vn.4H" , "op": "00001110|11|11100|11001|10|Vn|Vd"},
+ {"inst": "frintz Vd.8H, Vn.8H" , "op": "01001110|11|11100|11001|10|Vn|Vd"},
+ {"inst": "frsqrte Hd, Hn" , "op": "01111110|11|11100|11101|10|Vn|Vd"},
+ {"inst": "frsqrte Vd.4H, Vn.4H" , "op": "00101110|11|11100|11101|10|Vn|Vd"},
+ {"inst": "frsqrte Vd.8H, Vn.8H" , "op": "01101110|11|11100|11101|10|Vn|Vd"},
+ {"inst": "frsqrts Hd, Hn, Hm" , "op": "01011110|11|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "frsqrts Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|11|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "frsqrts Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|11|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "fsqrt Hd, Hn" , "op": "00011110|11|10000|11100|00|Vn|Vd"},
+ {"inst": "fsqrt Vd.4H, Vn.4H" , "op": "00101110|11|11100|11111|10|Vn|Vd"},
+ {"inst": "fsqrt Vd.8H, Vn.8H" , "op": "01101110|11|11100|11111|10|Vn|Vd"},
+ {"inst": "fsub Hd, Hn, Hm" , "op": "00011110|11|1|Vm|00111|0|Vn|Vd"},
+ {"inst": "fsub Vd.4H, Vn.4H, Vm.4H" , "op": "00001110|11|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "fsub Vd.8H, Vn.8H, Vm.8H" , "op": "01001110|11|0|Vm|00010|1|Vn|Vd"},
+ {"inst": "scvtf Hd, Wn" , "op": "00011110|11|1|00010|00000|0|Rn|Vd"},
+ {"inst": "scvtf Hd, Wn, #fbits" , "op": "00011110|11|0|00010|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "scvtf Hd, Xn" , "op": "10011110|11|1|00010|00000|0|Rn|Vd"},
+ {"inst": "scvtf Hd, Xn, #fbits" , "op": "10011110|11|0|00010|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "scvtf Hd, Hn" , "op": "01011110|01|11100|11101|10|Vn|Vd"},
+ {"inst": "scvtf Hd, Hn, #bits" , "op": "01011111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "scvtf Vd.4H, Vn.4H" , "op": "00001110|01|11100|11101|10|Vn|Vd"},
+ {"inst": "scvtf Vd.8H, Vn.8H" , "op": "01001110|01|11100|11101|10|Vn|Vd"},
+ {"inst": "scvtf Vd.4H, Vn.4H, #fbits" , "op": "00001111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "scvtf Vd.8H, Vn.8H, #fbits" , "op": "01001111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "ucvtf Hd, Wn" , "op": "00011110|11|1|00011|00000|0|Rn|Vd"},
+ {"inst": "ucvtf Hd, Wn, #fbits" , "op": "00011110|11|0|00011|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 32)"},
+ {"inst": "ucvtf Hd, Xn" , "op": "10011110|11|1|00011|00000|0|Rn|Vd"},
+ {"inst": "ucvtf Hd, Xn, #fbits" , "op": "10011110|11|0|00011|scale:6|Rn|Vd" , "imm": "ASimdFBitsScaleImm(fbits, 64)"},
+ {"inst": "ucvtf Hd, Hn" , "op": "01111110|01|11100|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Hd, Hn, #bits" , "op": "01111111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "ucvtf Vd.4H, Vn.4H" , "op": "00101110|01|11100|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Vd.8H, Vn.8H" , "op": "01101110|01|11100|11101|10|Vn|Vd"},
+ {"inst": "ucvtf Vd.4H, Vn.4H, #fbits" , "op": "00101111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"},
+ {"inst": "ucvtf Vd.8H, Vn.8H, #fbits" , "op": "01101111|0|immh:4|immb:3|11100|1|Vn|Vd" , "imm": "ASimdFBitsHBImm(fbits, 16)"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FP8", "data": [
+ {"inst": "bf1cvtl Vd.8H, Vn.8B" , "op": "00101110|10|10000|10111|10|Vn|Vd"},
+ {"inst": "bf1cvtl2 Vd.8H, Vn.16B" , "op": "01101110|10|10000|10111|10|Vn|Vd"},
+ {"inst": "bf2cvtl Vd.8H, Vn.8B" , "op": "00101110|11|10000|10111|10|Vn|Vd"},
+ {"inst": "bf2cvtl2 Vd.8H, Vn.16B" , "op": "01101110|11|10000|10111|10|Vn|Vd"},
+ {"inst": "f1cvtl Vd.8H, Vn.8B" , "op": "00101110|00|10000|10111|10|Vn|Vd"},
+ {"inst": "f1cvtl2 Vd.8H, Vn.16B" , "op": "01101110|00|10000|10111|10|Vn|Vd"},
+ {"inst": "f2cvtl Vd.8H, Vn.8B" , "op": "00101110|01|10000|10111|10|Vn|Vd"},
+ {"inst": "f2cvtl2 Vd.8H, Vn.16B" , "op": "01101110|01|10000|10111|10|Vn|Vd"},
+ {"inst": "fcvtn Vd.8B, Vn.4H, Vm.4H" , "op": "00001110|01|0|Vm|11110|1|Vn|Vd"},
+ {"inst": "fcvtn Vd.16B, Vn.8H, Vm.8H" , "op": "01001110|01|0|Vm|11110|1|Vn|Vd"},
+ {"inst": "fcvtn Vd.8B, Vn.4S, Vm.4S" , "op": "00001110|00|0|Vm|11110|1|Vn|Vd"},
+ {"inst": "fcvtn2 Vx.16B, Vn.4S, Vm.4S" , "op": "01001110|00|0|Vm|11110|1|Vn|Vx"},
+ {"inst": "fscale Vd.4H, Vn.4H, Vm.4H" , "op": "00101110|11|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "fscale Vd.8H, Vn.8H, Vm.8H" , "op": "01101110|11|0|Vm|00111|1|Vn|Vd"},
+ {"inst": "fscale Vd.2S, Vn.2S, Vm.2S" , "op": "00101110|10|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "fscale Vd.4S, Vn.4S, Vm.4S" , "op": "01101110|10|1|Vm|11111|1|Vn|Vd"},
+ {"inst": "fscale Vd.2D, Vn.2D, Vm.2D" , "op": "01101110|11|1|Vm|11111|1|Vn|Vd"}
+
+ ]},
+
+ {"category": "ASIMD", "ext": "FP8DOT2", "data": [
+ {"inst": "fdot Vx.4H, Vn.8B, Vm.8B" , "op": "00001110|01|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "fdot Vx.8H, Vn.16B, Vm.16B" , "op": "01001110|01|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "fdot Vx.4H, Vn.8B, Vm.2B[#idx]" , "op": "00001111|01|idx[1:0]|Vm:4|0000|idx[2]|0|Vn|Vx"},
+ {"inst": "fdot Vx.8H, Vn.16B, Vm.2B[#idx]" , "op": "01001111|01|idx[1:0]|Vm:4|0000|idx[2]|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FP8DOT4", "data": [
+ {"inst": "fdot Vx.2S, Vn.8B, Vm.8B" , "op": "00001110|00|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "fdot Vx.4S, Vn.16B, Vm.16B" , "op": "01001110|00|0|Vm|11111|1|Vn|Vx"},
+ {"inst": "fdot Vx.2S, Vn.8B, Vm.4B[#idx]" , "op": "00001111|00|idx[0]|Vm|0000|idx[1]|0|Vn|Vx"},
+ {"inst": "fdot Vx.4S, Vn.16B, Vm.4B[#idx]" , "op": "01001111|00|idx[0]|Vm|0000|idx[1]|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FP8FMA", "data": [
+ {"inst": "fmlalb Vx.8H, Vn.16B, Vm.16B" , "op": "00001110|110|Vm|11111|1|Vn|Vx"},
+ {"inst": "fmlalt Vx.8H, Vn.16B, Vm.16B" , "op": "01001110|110|Vm|11111|1|Vn|Vx"},
+ {"inst": "fmlalb Vx.8H, Vn.16B, Vm.B[#idx]" , "op": "00001111|11|idx[2:0]|Vm:3|0000|idx[3]|0|Vn|Vx"},
+ {"inst": "fmlalt Vx.8H, Vn.16B, Vm.B[#idx]" , "op": "01001111|11|idx[2:0]|Vm:3|0000|idx[3]|0|Vn|Vx"},
+ {"inst": "fmlallbb Vx.4S, Vn.16B, Vm.16B" , "op": "00001110|000|Vm|11000|1|Vn|Vx"},
+ {"inst": "fmlallbt Vx.4S, Vn.16B, Vm.16B" , "op": "00001110|010|Vm|11000|1|Vn|Vx"},
+ {"inst": "fmlalltb Vx.4S, Vn.16B, Vm.16B" , "op": "01001110|000|Vm|11000|1|Vn|Vx"},
+ {"inst": "fmlalltt Vx.4S, Vn.16B, Vm.16B" , "op": "01001110|010|Vm|11000|1|Vn|Vx"},
+ {"inst": "fmlallbb Vx.4S, Vn.16B, Vm.B[#idx]" , "op": "00101111|00|idx[2:0]|Vm:3|1000|idx[3]|0|Vn|Vx"},
+ {"inst": "fmlallbt Vx.4S, Vn.16B, Vm.B[#idx]" , "op": "00101111|01|idx[2:0]|Vm:3|1000|idx[3]|0|Vn|Vx"},
+ {"inst": "fmlalltb Vx.4S, Vn.16B, Vm.B[#idx]" , "op": "01101111|00|idx[2:0]|Vm:3|1000|idx[3]|0|Vn|Vx"},
+ {"inst": "fmlalltt Vx.4S, Vn.16B, Vm.B[#idx]" , "op": "01101111|01|idx[2:0]|Vm:3|1000|idx[3]|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "FRINTTS", "data": [
+ {"inst": "frint32x Sd, Sn" , "op": "00011110|00|10100|01100|00|Vn|Vd"},
+ {"inst": "frint32x Dd, Dn" , "op": "00011110|01|10100|01100|00|Vn|Vd"},
+ {"inst": "frint32x Vd.2S, Vn.2S" , "op": "00101110|00|10000|11110|10|Vn|Vd"},
+ {"inst": "frint32x Vd.4S, Vn.4S" , "op": "01101110|00|10000|11110|10|Vn|Vd"},
+ {"inst": "frint32x Vd.2D, Vn.2D" , "op": "01101110|01|10000|11110|10|Vn|Vd"},
+ {"inst": "frint32z Sd, Sn" , "op": "00011110|00|10100|00100|00|Vn|Vd"},
+ {"inst": "frint32z Dd, Dn" , "op": "00011110|01|10100|00100|00|Vn|Vd"},
+ {"inst": "frint32z Vd.2S, Vn.2S" , "op": "00001110|00|10000|11110|10|Vn|Vd"},
+ {"inst": "frint32z Vd.4S, Vn.4S" , "op": "01001110|00|10000|11110|10|Vn|Vd"},
+ {"inst": "frint32z Vd.2D, Vn.2D" , "op": "01001110|01|10000|11110|10|Vn|Vd"},
+ {"inst": "frint64x Sd, Sn" , "op": "00011110|00|10100|11100|00|Vn|Vd"},
+ {"inst": "frint64x Dd, Dn" , "op": "00011110|01|10100|11100|00|Vn|Vd"},
+ {"inst": "frint64x Vd.2S, Vn.2S" , "op": "00101110|00|10000|11111|10|Vn|Vd"},
+ {"inst": "frint64x Vd.4S, Vn.4S" , "op": "01101110|00|10000|11111|10|Vn|Vd"},
+ {"inst": "frint64x Vd.2D, Vn.2D" , "op": "01101110|01|10000|11111|10|Vn|Vd"},
+ {"inst": "frint64z Sd, Sn" , "op": "00011110|00|10100|10100|00|Vn|Vd"},
+ {"inst": "frint64z Dd, Dn" , "op": "00011110|01|10100|10100|00|Vn|Vd"},
+ {"inst": "frint64z Vd.2S, Vn.2S" , "op": "00001110|00|10000|11111|10|Vn|Vd"},
+ {"inst": "frint64z Vd.4S, Vn.4S" , "op": "01001110|00|10000|11111|10|Vn|Vd"},
+ {"inst": "frint64z Vd.2D, Vn.2D" , "op": "01001110|01|10000|11111|10|Vn|Vd"}
+ ]},
+
+ {"category": "ASIMD", "ext": "I8MM", "data": [
+ {"inst": "smmla Vx.4S, Vn.16B, Vm.16B" , "op": "01001110|10|0|Vm|10100|1|Vn|Vx"},
+ {"inst": "sudot Vx.2S, Vn.8B, Vm.4B[#idx]" , "op": "00001111|00|idx[0]|Vm|1111|idx[1]|0|Vn|Vx"},
+ {"inst": "sudot Vx.4S, Vn.16B, Vm.4B[#idx]" , "op": "01001111|00|idx[0]|Vm|1111|idx[1]|0|Vn|Vx"},
+ {"inst": "ummla Vx.4S, Vn.16B, Vm.16B" , "op": "01101110|10|0|Vm|10100|1|Vn|Vx"},
+ {"inst": "usdot Vx.2S, Vn.8B, Vm.tb" , "op": "00001110|10|0|Vm|10011|1|Vn|Vx"},
+ {"inst": "usdot Vx.4S, Vn.16B, Vm.tb" , "op": "01001110|10|0|Vm|10011|1|Vn|Vx"},
+ {"inst": "usdot Vx.2S, Vn.8B, Vm.4B[#idx]" , "op": "00001111|10|idx[0]|Vm|1111|idx[1]|0|Vn|Vx"},
+ {"inst": "usdot Vx.4S, Vn.16B, Vm.4B[#idx]" , "op": "01001111|10|idx[0]|Vm|1111|idx[1]|0|Vn|Vx"},
+ {"inst": "usmmla Vx.4S, Vn.16B, Vm.16B" , "op": "01001110|10|0|Vm|10101|1|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD", "ext": "JSCVT", "data": [
+ {"inst": "fjcvtzs Wd, Dn" , "op": "00011110|011|11110|00000|0|Vn|Vd"}
+ ]},
+
+ {"category": "ASIMD", "ext": "LUT", "data": [
+ {"inst": "luti2 Vd.16B, Vn.16B, Vm[#idx]" , "op": "01001110|100|Vm|0|idx:2|100|Vn|Vd"},
+ {"inst": "luti2 Vd.8H, Vn.8H, Vm[#idx]" , "op": "01001110|110|Vm|0|idx:3|00|Vn|Vd"},
+ {"inst": "luti4 Vd.16B, Vn.16B, Vm[#idx]" , "op": "01001110|010|Vm|0|idx:1|1000|Vn|Vd"},
+ {"inst": "luti4 Vd.8H, 2x{Vn.8H}, Vm[#idx]" , "op": "01001110|010|Vm|0|idx:2|100|Vn|Vd"}
+ ]},
+
+ {"category": "ASIMD", "ext": "LRCPC3", "data": [
+ {"inst": "ldap1 Vd.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|010|00001|10000|1|Rn|Vd"},
+ {"inst": "ldapur Bd, [Xn|SP, #offS]" , "op": "00011101|010|offS:9|10|Rn|Vd"},
+ {"inst": "ldapur Hd, [Xn|SP, #offS]" , "op": "01011101|010|offS:9|10|Rn|Vd"},
+ {"inst": "ldapur Sd, [Xn|SP, #offS]" , "op": "10011101|010|offS:9|10|Rn|Vd"},
+ {"inst": "ldapur Dd, [Xn|SP, #offS]" , "op": "11011101|010|offS:9|10|Rn|Vd"},
+ {"inst": "ldapur Qd, [Xn|SP, #offS]" , "op": "00011101|110|offS:9|10|Rn|Vd"},
+ {"inst": "stl1 Vs.D[#idx], [Xn|SP]" , "op": "0|idx:1|001101|000|00001|10000|1|Rn|Vs"},
+ {"inst": "stlur Bs, [Xn|SP, #offS]" , "op": "00011101|000|offS:9|10|Rn|Vs"},
+ {"inst": "stlur Hs, [Xn|SP, #offS]" , "op": "01011101|000|offS:9|10|Rn|Vs"},
+ {"inst": "stlur Ss, [Xn|SP, #offS]" , "op": "10011101|000|offS:9|10|Rn|Vs"},
+ {"inst": "stlur Ds, [Xn|SP, #offS]" , "op": "11011101|000|offS:9|10|Rn|Vs"},
+ {"inst": "stlur Qs, [Xn|SP, #offS]" , "op": "00011101|100|offS:9|10|Rn|Vs"}
+ ]},
+
+ {"category": "ASIMD", "ext": "RDM", "data": [
+ {"inst": "sqrdmlah Hx, Hn, Hm" , "op": "01111110|01|0|Vm|10000|1|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Sx, Sn, Sm" , "op": "01111110|10|0|Vm|10000|1|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Hx, Hn, Vn.H[#idx]" , "op": "01111111|01|idx[1:0]|Vm:4|1101|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Sx, Sn, Vn.S[#idx]" , "op": "01111111|10|idx[0] |Vm |1101|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Vx.t, Vn.t, Vm.t" , "op": "00101110|sz|0|Vm|10000|1|Vn|Vx" , "io": "QC|=SAT", "t": "~ 4H 2S"},
+ {"inst": "sqrdmlah Vx.t, Vn.t, Vm.t" , "op": "01101110|sz|0|Vm|10000|1|Vn|Vx" , "io": "QC|=SAT", "t": "~ 8H 4S"},
+ {"inst": "sqrdmlah Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|1101|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Vx.2S, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0] |Vm |1101|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Vx.8H, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|1101|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlah Vx.4S, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0] |Vm |1101|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Hx, Hn, Hm" , "op": "01111110|01|0|Vm|10001|1|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Sx, Sn, Sm" , "op": "01111110|10|0|Vm|10001|1|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Hx, Hn, Vn.H[#idx]" , "op": "01111111|01|idx[1:0]|Vm:4|1111|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Sx, Sn, Vn.S[#idx]" , "op": "01111111|10|idx[0] |Vm |1111|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Vx.t, Vn.t, Vm.t" , "op": "00101110|sz|0|Vm|10001|1|Vn|Vx" , "io": "QC|=SAT", "t": "~ 4H 2S"},
+ {"inst": "sqrdmlsh Vx.t, Vn.t, Vm.t" , "op": "01101110|sz|0|Vm|10001|1|Vn|Vx" , "io": "QC|=SAT", "t": "~ 8H 4S"},
+ {"inst": "sqrdmlsh Vx.4H, Vn.4H, Vm.H[#idx]" , "op": "00101111|01|idx[1:0]|Vm:4|1111|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Vx.2S, Vn.2S, Vm.S[#idx]" , "op": "00101111|10|idx[0] |Vm |1111|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Vx.8H, Vn.8H, Vm.H[#idx]" , "op": "01101111|01|idx[1:0]|Vm:4|1111|idx[2]|0|Vn|Vx" , "io": "QC|=SAT"},
+ {"inst": "sqrdmlsh Vx.4S, Vn.4S, Vm.S[#idx]" , "op": "01101111|10|idx[0] |Vm |1111|idx[1]|0|Vn|Vx" , "io": "QC|=SAT"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA1", "data": [
+ {"inst": "sha1c Qx, Sn, Vm.4S" , "op": "01011110|00|0|Vm|00000|0|Vn|Vx"},
+ {"inst": "sha1h Sd, Sn" , "op": "01011110|00|10100|00000|10|Vn|Vd"},
+ {"inst": "sha1m Qx, Sn, Vm.4S" , "op": "01011110|00|0|Vm|00100|0|Vn|Vx"},
+ {"inst": "sha1p Qx, Sn, Vm.4S" , "op": "01011110|00|0|Vm|00010|0|Vn|Vx"},
+ {"inst": "sha1su0 Vx.4S, Vn.4S, Vm.4S" , "op": "01011110|00|0|Vm|00110|0|Vn|Vx"},
+ {"inst": "sha1su1 Vx.4S, Vn.4S" , "op": "01011110|00|1|01000|00011|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA256", "data": [
+ {"inst": "sha256h Qx, Qn, Vm.4S" , "op": "01011110|00|0|Vm|01000|0|Vn|Vx"},
+ {"inst": "sha256h2 Qx, Qn, Vm.4S" , "op": "01011110|00|0|Vm|01010|0|Vn|Vx"},
+ {"inst": "sha256su0 Vx.4S, Vn.4S" , "op": "01011110|00|10100|00010|10|Vn|Vx"},
+ {"inst": "sha256su1 Vx.4S, Vn.4S, Vm.4S" , "op": "01011110|00|0|Vm|01100|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA3", "data": [
+ {"inst": "bcax Vd.16B, Vn.16B, Vm.16B, Va.16B" , "op": "11001110|00|1|Vm|0|Va|Vn|Vd"},
+ {"inst": "eor3 Vd.16B, Vn.16B, Vm.16B, Va.16B" , "op": "11001110|00|0|Vm|0|Va|Vn|Vd"},
+ {"inst": "rax1 Vd.2D, Vn.2D, Vm.2D" , "op": "11001110|01|1|Vm|10001|1|Vn|Vd"},
+ {"inst": "xar Vd.2D, Vn.2D, Vm.2D, #imm" , "op": "11001110|10|0|Vm|imm:6|Vn|Vd"}
+
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SHA512", "data": [
+ {"inst": "sha512h Qx, Qn, Vm.2D" , "op": "11001110|01|1|Vm|10000|0|Vn|Vx"},
+ {"inst": "sha512h2 Qx, Qn, Vm.2D" , "op": "11001110|01|1|Vm|10000|1|Vn|Vx"},
+ {"inst": "sha512su0 Vx.2D, Vn.2D" , "op": "11001110|11|00000|01000|00|Vn|Vx"},
+ {"inst": "sha512su1 Vx.2D, Vn.2D, Vm.2D" , "op": "11001110|01|1|Vm|10001|0|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SM3", "data": [
+ {"inst": "sm3partw1 Vx.4S, Vn.4S, Vm.4S" , "op": "11001110|01|1|Vm|11000|0|Vn|Vx"},
+ {"inst": "sm3partw2 Vx.4S, Vn.4S, Vm.4S" , "op": "11001110|01|1|Vm|11000|1|Vn|Vx"},
+ {"inst": "sm3ss1 Vd.4S, Vn.4S, Vm.4S, Va.4S" , "op": "11001110|01|0|Vm|0|Va|Vn|Vd"},
+ {"inst": "sm3tt1a Vx.4S, Vn.4S, Vm.4[#idx]" , "op": "11001110|01|0|Vm|10|idx:2|00|Vn|Vx"},
+ {"inst": "sm3tt1b Vx.4S, Vn.4S, Vm.4[#idx]" , "op": "11001110|01|0|Vm|10|idx:2|01|Vn|Vx"},
+ {"inst": "sm3tt2a Vx.4S, Vn.4S, Vm.4[#idx]" , "op": "11001110|01|0|Vm|10|idx:2|10|Vn|Vx"},
+ {"inst": "sm3tt2b Vx.4S, Vn.4S, Vm.4[#idx]" , "op": "11001110|01|0|Vm|10|idx:2|11|Vn|Vx"}
+ ]},
+
+ {"category": "ASIMD CRYPTO_HASH", "ext": "SM4", "data": [
+ {"inst": "sm4e Vx.4S, Vn.4S" , "op": "11001110|11|0|00000|10000|1|Vn|Vx"},
+ {"inst": "sm4ekey Vd.4S, Vn.4S, Vm.4S" , "op": "11001110|01|1|Vm|11001|0|Vn|Vd"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE", "data": [
+ {"inst": "abs Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|0|10110101|Pg:3|Zn|Zd"},
+ {"inst": "add Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|000000|Zn|Zd"},
+ {"inst": "add Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|10000011|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+ {"inst": "add Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|000000000|Pg:3|Zm|Zdn"},
+ {"inst": "addp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010001101|Pg:3|Zm|Zdn"},
+ {"inst": "addpl Xd|SP, Xn|SP, #immS" , "op": "00000100|01|1|Rn|01010|immS:6|Rd"},
+ {"inst": "addvl Xd|SP, Xn|SP, #immS" , "op": "00000100|00|1|Rn|01010|immS:6|Rd"},
+ {"inst": "adr Zd.t, [Zn.t, Zm.t, {lsl #n}]" , "op": "00000100|sz|1|Zm|1010|msz|Zn|Zd" , "t": "~~SD"},
+ {"inst": "adr Zd.D, [Zn.D, Zm.D, {sxtw #n}]" , "op": "00000100|00|1|Zm|1010|msz|Zn|Zd"},
+ {"inst": "adr Zd.D, [Zn.D, Zm.D, {uxtw #n}]" , "op": "00000100|01|1|Zm|1010|msz|Zn|Zd"},
+ {"inst": "and Zd.D, Zn.D, Zm.D" , "op": "00000100|00|1|Zm|001100|Zn|Zd"},
+ {"inst": "and Zdn.t, Zdn.t, #imm" , "op": "00000101|10|0000|imm:13|Zdn" , "imm": "SveLogicalImm(imm, 0, t)"},
+ {"inst": "and Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|00|00|Pm|01|Pg|0|Pn|0|Pd"},
+ {"inst": "and Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|011010000|Pg:3|Zm|Zdn"},
+ {"inst": "ands Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|01|00|Pm|01|Pg|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "andv Vd, Pg, Zn.t" , "op": "00000100|sz|011010001|Pg:3|Zn|Vd"},
+ {"inst": "asr Zd.t, Zn.t, Zm.D" , "op": "00000100|sz|1|Zm|100000|Zn|Zd" , "t": "BHS~"},
+ {"inst": "asr Zd.t, Zn.t, #imm" , "op": "00000100|imm:2|1|imm:5|100100|Zn|Zd" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "asr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010000100|Pg:3|Zm|Zdn"},
+ {"inst": "asr Zdn.t, Pg/M, Zdn.t, Zm.D" , "op": "00000100|sz|011000100|Pg:3|Zm|Zdn" , "t": "BHS~"},
+ {"inst": "asr Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|000000100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "asrd Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|000100100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "asrr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010100100|Pg:3|Zm|Zdn"},
+ {"inst": "bic Zd.D, Zn.D, Zm.D" , "op": "00000100|11|1|Zm|001100|Zn|Zd"},
+ {"inst": "bic Zdn.t, Zdn.t, #imm" , "op": "00000101|10|0000|imm:13|Zdn" , "imm": "SveLogicalImm(imm, 1, t)"},
+ {"inst": "bic Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|011010000|Pg:3|Zm|Zdn"},
+ {"inst": "bic Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|00|00|Pm|01|Pg|0|Pn|1|Pd"},
+ {"inst": "bics Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|01|10|Pm|01|Pg|0|Pn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "brka Pd.B, Pg/MZ, Pn.B" , "op": "00100101|00|01000001|Pg|0|Pn|M|Pd"},
+ {"inst": "brkas Pd.B, Pg/M, Pn.B" , "op": "00100101|01|01000001|Pg|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "brkb Pd.B, Pg/MZ, Pn.B" , "op": "00100101|10|01000001|Pg|0|Pn|M|Pd"},
+ {"inst": "brkbs Pd.B, Pg/M, Pn.B" , "op": "00100101|11|01000001|Pg|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "brkn Pdm.B, Pg/Z, Pn.B, Pdm.B" , "op": "00100101|00|01100001|Pg|0|Pn|0|Pdm"},
+ {"inst": "brkns Pdm.B, Pg/Z, Pn.B, Pdm.B" , "op": "00100101|01|01100001|Pg|0|Pn|0|Pdm" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "brkpa Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|00|00|Pm|11|Pg|0|Pn|0|Pd"},
+ {"inst": "brkpas Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|01|00|Pm|11|Pg|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "brkpb Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|00|00|Pm|11|Pg|0|Pn|1|Pd"},
+ {"inst": "brkpbs Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|01|00|Pm|11|Pg|0|Pn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "clasta Wdn, Pg, Wdn, Zm.t" , "op": "00000101|sz|110000101|Pg:3|Zm|Rdn" , "t": "BHS~"},
+ {"inst": "clasta Xdn, Pg, Xdn, Zm.D" , "op": "00000101|11|110000101|Pg:3|Zm|Rdn"},
+ {"inst": "clasta Bdn, Pg, Bdn, Zm.t" , "op": "00000101|00|101010100|Pg:3|Zm|Vdn"},
+ {"inst": "clasta Hdn, Pg, Hdn, Zm.t" , "op": "00000101|01|101010100|Pg:3|Zm|Vdn"},
+ {"inst": "clasta Sdn, Pg, Sdn, Zm.t" , "op": "00000101|10|101010100|Pg:3|Zm|Vdn"},
+ {"inst": "clasta Ddn, Pg, Ddn, Zm.t" , "op": "00000101|11|101010100|Pg:3|Zm|Vdn"},
+ {"inst": "clasta Zdn.t, Pg, Zdn.t, Zm.t" , "op": "00000101|sz|101000100|Pg:3|Zm|Zdn"},
+ {"inst": "clastb Wdn, Pg, Wdn, Zm.t" , "op": "00000101|sz|110001101|Pg:3|Zm|Rdn" , "t": "BHS~"},
+ {"inst": "clastb Xdn, Pg, Xdn, Zm.D" , "op": "00000101|11|110001101|Pg:3|Zm|Rdn"},
+ {"inst": "clastb Bdn, Pg, Bdn, Zm.t" , "op": "00000101|00|101011100|Pg:3|Zm|Vdn"},
+ {"inst": "clastb Hdn, Pg, Hdn, Zm.t" , "op": "00000101|01|101011100|Pg:3|Zm|Vdn"},
+ {"inst": "clastb Sdn, Pg, Sdn, Zm.t" , "op": "00000101|10|101011100|Pg:3|Zm|Vdn"},
+ {"inst": "clastb Ddn, Pg, Ddn, Zm.t" , "op": "00000101|11|101011100|Pg:3|Zm|Vdn"},
+ {"inst": "clastb Zdn.t, Pg, Zdn.t, Zm.t" , "op": "00000101|sz|101001100|Pg:3|Zm|Zdn"},
+ {"inst": "cls Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011000101|Pg:3|Zn|Zd"},
+ {"inst": "clz Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011001101|Pg:3|Zn|Zd"},
+ {"inst": "cmpeq Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zm|101|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpeq Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|001|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmpeq Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100101|sz|0|immS:5|100|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpgt Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zm|100|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpgt Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|010|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmpgt Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100101|sz|0|immS:5|000|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpge Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zm|100|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpge Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|010|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmpge Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100101|sz|0|immS:5|000|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmphi Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zm|000|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmphi Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|110|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmphi Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100100|sz|1|immS:7|0|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmphs Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zm|000|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmphs Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|110|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmphs Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100100|sz|1|immS:7|0|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmple Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zn|100|Pg:3|Zm|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmple Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|011|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmple Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100101|sz|0|immS:5|001|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmplo Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zn|000|Pg:3|Zm|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmplo Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|111|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmplo Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100100|sz|1|immS:7|1|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpls Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zn|000|Pg:3|Zm|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpls Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|111|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmpls Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100100|sz|1|immS:7|1|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmplt Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zn|100|Pg:3|Zm|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmplt Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|011|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmplt Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100101|sz|0|immS:5|001|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpne Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "00100100|sz|0|Zm|101|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cmpne Pd.t, Pg/Z, Zn.t, Zm.D" , "op": "00100100|sz|0|Zm|001|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W", "t": "BHS~"},
+ {"inst": "cmpne Pd.t, Pg/Z, Zn.t, #immS" , "op": "00100101|sz|0|immS:5|100|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "cnot Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011011101|Pg:3|Zn|Zd"},
+ {"inst": "cnt Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011010101|Pg:3|Zn|Zd"},
+ {"inst": "cntb Xd, {#pattern}, {mul #imm}" , "op": "00000100|00|10|imm:4|111000|pattern:5|Rd" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "cntd Xd, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|111000|pattern:5|Rd" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "cnth Xd, {#pattern}, {mul #imm}" , "op": "00000100|01|10|imm:4|111000|pattern:5|Rd" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "cntp Xd, Pg, Pn.t" , "op": "00100101|sz|10000010|Pg|0|Pn|Rd"},
+ {"inst": "cntw Xd, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|111000|pattern:5|Rd" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "compact Zd.t, Pg, Zn.t" , "op": "00000101|sz|10000010|Pg|0|Pn|Rd" , "t": "~~SD"},
+ {"inst": "cpy Zd.t, Pg/M, Wn|SP" , "op": "00000101|sz|101000101|Pg:3|Rn|Zd" , "t": "BHS~"},
+ {"inst": "cpy Zd.D, Pg/M, Xn|SP" , "op": "00000101|11|101000101|Pg:3|Rn|Zd"},
+ {"inst": "cpy Zd.B, Pg/M, Bn" , "op": "00000101|00|100000100|Pg:3|Rn|Zd"},
+ {"inst": "cpy Zd.H, Pg/M, Hn" , "op": "00000101|01|100000100|Pg:3|Rn|Zd"},
+ {"inst": "cpy Zd.S, Pg/M, Sn" , "op": "00000101|10|100000100|Pg:3|Rn|Zd"},
+ {"inst": "cpy Zd.D, Pg/M, Dn" , "op": "00000101|11|100000100|Pg:3|Rn|Zd"},
+ {"inst": "cpy Zd.t, Pg/MZ, #imm, {lsl #n}" , "op": "00000101|sz|01|Pg|0|M|n:1|imm:8|Zd"},
+ {"inst": "ctermeq Rn, Rm" , "op": "00100101|1X|1|Rm|001000|Rn|00000"},
+ {"inst": "ctermne Rn, Rm" , "op": "00100101|1X|1|Rm|001000|Rn|10000"},
+ {"inst": "decb Xdn, {#pattern}, {mul #imm}" , "op": "00000100|00|11|imm:4|111001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "decd Xdn, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|111001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "decd Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|110001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "dech Xdn, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|111001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "dech Zdn.H, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|110001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "decp Xdn, Pm.t" , "op": "00100101|sz|1011011000100|Pm|Rdn"},
+ {"inst": "decp Zdn.t, Pm.t" , "op": "00100101|sz|1011011000000|Pm|Zdn" , "t": "~HSD"},
+ {"inst": "decw Xdn, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|111001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "decw Zdn.S, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|110001|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "dup Zd.t, Wn|SP" , "op": "00000101|sz|100000001110|Rn|Zd" , "T": "BHS~"},
+ {"inst": "dup Zd.t, Xn|SP" , "op": "00000101|11|100000001110|Rn|Zd"},
+ {"inst": "dup Zd.t, Zn.t[#idx]" , "op": "00000101|imm:2|1|imm:5|001000|Zn|Zd" , "imm": "SveDupImm(sz, idx)"},
+ {"inst": "dup Zd.t, #imm, {lsl #n}" , "op": "00100101|sz|11100011|n:1|imm:8|Zd"},
+ {"inst": "dupm Zd.t, #imm" , "op": "00000101|11|0000|imm:13|Zd" , "imm": "SveDupmImm(sz, imm)"},
+ {"inst": "eon Zdn.t, Zdn.t, #imm" , "op": "00000101|01|0000|imm:13|Zdn" , "imm": "SveLogicalImm(imm, 1, t)"},
+ {"inst": "eor Zd.D, Zn.D, Zm.D" , "op": "00000100|10|1|Zm|001100|Zn|Zd"},
+ {"inst": "eor Zdn.t, Zdn.t, #imm" , "op": "00000101|01|0000|imm:13|Zdn" , "imm": "SveLogicalImm(imm, 0, t)"},
+ {"inst": "eor Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|011001000|Pg:3|Zm|Zdn"},
+ {"inst": "eor Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|00|00|Pm|01|Pg|1|Pn|0|Pd"},
+ {"inst": "eors Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|01|00|Pm|01|Pg|1|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "eorv Bd, Pg, Zn.t" , "op": "00000100|00|011001001|Pg:3|Zn|Vd"},
+ {"inst": "eorv Hd, Pg, Zn.t" , "op": "00000100|01|011001001|Pg:3|Zn|Vd"},
+ {"inst": "eorv Sd, Pg, Zn.t" , "op": "00000100|10|011001001|Pg:3|Zn|Vd"},
+ {"inst": "eorv Dd, Pg, Zn.t" , "op": "00000100|11|011001001|Pg:3|Zn|Vd"},
+ {"inst": "ext Zdn.B, Zdn.B, Zm.B, #imm" , "op": "00000101|00|1|imm:5|000|imm:3|Zm|Zdn"},
+ {"inst": "fabd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|001000100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fabs Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011100101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "facge Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|110|Pg:3|Zn|1|Pd" , "t": "~HSD"},
+ {"inst": "facgt Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|111|Pg:3|Zn|1|Pd" , "t": "~HSD"},
+ {"inst": "facle Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zn|110|Pg:3|Zm|1|Pd" , "t": "~HSD"},
+ {"inst": "faclt Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zn|111|Pg:3|Zm|1|Pd" , "t": "~HSD"},
+ {"inst": "fadd Zd.t, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|000000|Zn|Zd" , "t": "~HSD"},
+ {"inst": "fadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000000100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fadd Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011000100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpHalfOrOneImm(immF)"},
+ {"inst": "fadda Hdn, Pg, Hdn, Zm.H" , "op": "01100101|01|011000001|Pg:3|Zm|Vdn"},
+ {"inst": "fadda Sdn, Pg, Sdn, Zm.S" , "op": "01100101|10|011000001|Pg:3|Zm|Vdn"},
+ {"inst": "fadda Ddn, Pg, Ddn, Zm.D" , "op": "01100101|11|011000001|Pg:3|Zm|Vdn"},
+ {"inst": "faddv Hd, Pg, Zn.H" , "op": "01100101|01|000000001|Pg:3|Zn|Vd"},
+ {"inst": "faddv Sd, Pg, Zn.S" , "op": "01100101|10|000000001|Pg:3|Zn|Vd"},
+ {"inst": "faddv Dd, Pg, Zn.D" , "op": "01100101|11|000000001|Pg:3|Zn|Vd"},
+ {"inst": "fcadd Zdn.t, Pg/M, Zdn.t, Zm.t, #rot2" , "op": "01100100|sz|00000|imm:1|100|Pg:3|Zm|Zdn" , "t": "~HSD", "imm": "Rot1Imm(rot1)"},
+ {"inst": "fcmeq Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|011|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmeq Pd.t, Pg/Z, Zn.t, #zero" , "op": "01100101|sz|0|10010001|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmge Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|010|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmge Pd.t, Pg/Z, Zn.t, #zero" , "op": "01100101|sz|0|10000001|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmgt Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|010|Pg:3|Zn|1|Pd" , "t": "~HSD"},
+ {"inst": "fcmgt Pd.t, Pg/Z, Zn.t, #zero" , "op": "01100101|sz|0|10000001|Pg:3|Zn|1|Pd" , "t": "~HSD"},
+ {"inst": "fcmle Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zn|010|Pg:3|Zm|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmle Pd.t, Pg/Z, Zn.t, #zero" , "op": "01100101|sz|010001001|Pg:3|Zn|1|Pd" , "t": "~HSD"},
+ {"inst": "fcmlt Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zn|010|Pg:3|Zm|1|Pd" , "t": "~HSD"},
+ {"inst": "fcmlt Pd.t, Pg/Z, Zn.t, #zero" , "op": "01100101|sz|010001001|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmne Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|011|Pg:3|Zn|1|Pd" , "t": "~HSD"},
+ {"inst": "fcmne Pd.t, Pg/Z, Zn.t, #zero" , "op": "01100101|sz|010011001|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcmuo Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|110|Pg:3|Zn|0|Pd" , "t": "~HSD"},
+ {"inst": "fcpy Zd.t, Pg/M, #immVFP" , "op": "00000101|sz|01|Pg|110|imm:8|Zd" , "t": "~HSD", "imm": "VecVFPImm(immVFP)"},
+ {"inst": "fcvt Zd.S, Pg/M, Zn.H" , "op": "01100101|10|001001101|Pg:3|Zn|Zd"},
+ {"inst": "fcvt Zd.D, Pg/M, Zn.H" , "op": "01100101|11|001001101|Pg:3|Zn|Zd"},
+ {"inst": "fcvt Zd.H, Pg/M, Zn.S" , "op": "01100101|10|001000101|Pg:3|Zn|Zd"},
+ {"inst": "fcvt Zd.D, Pg/M, Zn.S" , "op": "01100101|11|001011101|Pg:3|Zn|Zd"},
+ {"inst": "fcvt Zd.H, Pg/M, Zn.D" , "op": "01100101|11|001000101|Pg:3|Zn|Zd"},
+ {"inst": "fcvt Zd.S, Pg/M, Zn.D" , "op": "01100101|11|001010101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.H, Pg/M, Zn.H" , "op": "01100101|01|011010101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.S, Pg/M, Zn.H" , "op": "01100101|01|011100101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.D, Pg/M, Zn.H" , "op": "01100101|01|011110101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.S, Pg/M, Zn.S" , "op": "01100101|10|011100101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.D, Pg/M, Zn.S" , "op": "01100101|11|011100101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.S, Pg/M, Zn.D" , "op": "01100101|11|011000101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzs Zd.D, Pg/M, Zn.D" , "op": "01100101|11|011110101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.H, Pg/M, Zn.H" , "op": "01100101|01|011011101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.S, Pg/M, Zn.H" , "op": "01100101|01|011101101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.D, Pg/M, Zn.H" , "op": "01100101|01|011111101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.S, Pg/M, Zn.S" , "op": "01100101|10|011101101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.D, Pg/M, Zn.S" , "op": "01100101|11|011101101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.S, Pg/M, Zn.D" , "op": "01100101|11|011001101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtzu Zd.D, Pg/M, Zn.D" , "op": "01100101|11|011111101|Pg:3|Zn|Zd"},
+ {"inst": "fdiv Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|001101100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fdivr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|001100100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fdup Zd.t, #immVFP" , "op": "00100101|sz|111001110|imm:8|Zd" , "t": "~HSD", "imm": "VecVFPImm(immVFP)"},
+ {"inst": "fexpa Zd.t, Zn.t" , "op": "00000100|sz|100000101110|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmad Zdn.t, Pg/M, Zm.t, Za.t" , "op": "01100101|sz|1|Za|100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmax Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000110100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmax Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011110100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpZeroOrOneImm(immF)"},
+ {"inst": "fmaxnm Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000100100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmaxnm Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011100100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpZeroOrOneImm(immF)"},
+ {"inst": "fmaxnmv Hd, Pg, Zn.H" , "op": "01100101|01|000100001|Pg:3|Zm|Zd"},
+ {"inst": "fmaxnmv Sd, Pg, Zn.S" , "op": "01100101|10|000100001|Pg:3|Zm|Zd"},
+ {"inst": "fmaxnmv Dd, Pg, Zn.D" , "op": "01100101|11|000100001|Pg:3|Zm|Zd"},
+ {"inst": "fmaxv Hd, Pg, Zn.H" , "op": "01100101|01|000110001|Pg:3|Zm|Zd"},
+ {"inst": "fmaxv Sd, Pg, Zn.S" , "op": "01100101|10|000110001|Pg:3|Zm|Zd"},
+ {"inst": "fmaxv Dd, Pg, Zn.D" , "op": "01100101|11|000110001|Pg:3|Zm|Zd"},
+ {"inst": "fmin Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000111100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmin Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011111100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpZeroOrOneImm(immF)"},
+ {"inst": "fminnm Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000101100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fminnm Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011101100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpZeroOrOneImm(immF)"},
+ {"inst": "fminnmv Hd, Pg, Zn.H" , "op": "01100101|01|000101001|Pg:3|Zm|Zd"},
+ {"inst": "fminnmv Sd, Pg, Zn.S" , "op": "01100101|10|000101001|Pg:3|Zm|Zd"},
+ {"inst": "fminnmv Dd, Pg, Zn.D" , "op": "01100101|11|000101001|Pg:3|Zm|Zd"},
+ {"inst": "fminv Hd, Pg, Zn.H" , "op": "01100101|01|000111001|Pg:3|Zm|Zd"},
+ {"inst": "fminv Sd, Pg, Zn.S" , "op": "01100101|10|000111001|Pg:3|Zm|Zd"},
+ {"inst": "fminv Dd, Pg, Zn.D" , "op": "01100101|11|000111001|Pg:3|Zm|Zd"},
+ {"inst": "fmla Zda.t, Pg/M, Zn.t, Zm.t" , "op": "01100101|sz|1|Zm|000|Pg:3|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmla Zda.H, Zn.H, Zm.H[#idx]" , "op": "01100100|0|idx:1|1|idx:2|Zm:3|000000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmla Zda.S, Zn.S, Zm.S[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|000000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmla Zda.D, Zn.D, Zm.D[#idx]" , "op": "01100100|11|1|idx:1|Zm:4|000000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmls Zda.t, Pg/M, Zn.t, Zm.t" , "op": "01100101|sz|1|Zm|001|Pg:3|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmls Zda.H, Zn.H, Zm.H[#idx]" , "op": "01100100|0|idx:1|1|idx:2|Zm:3|000001|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmls Zda.S, Zn.S, Zm.S[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|000001|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmls Zda.D, Zn.D, Zm.D[#idx]" , "op": "01100100|11|1|idx:1|Zm:4|000001|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmov Zd.t, #zero" , "op": "00100101|sz|111000110|00000000|Zd" , "t": "~HSD", "aliasOf": "dup"},
+ {"inst": "fmov Zd.t, #immVFP" , "op": "00100101|sz|111001110|imm:8|Zd" , "t": "~HSD", "imm": "VecVFPImm(immVFP)", "aliasOf": "fdup"},
+ {"inst": "fmov Zd.t, Pg/M, #zero" , "op": "00000101|sz|01|Pg|010|00000000|Zd" , "t": "~HSD", "aliasOf": "cpy"},
+ {"inst": "fmov Zd.t, Pg/M, #immVFP" , "op": "00000101|sz|01|Pg|110|imm:8|Zd" , "t": "~HSD", "imm": "VecVFPImm(immVFP)", "aliasOf": "fcpy"},
+ {"inst": "fmsb Zdn.t, Pg/M, Zm.t, Za.t" , "op": "01100101|sz|1|Za|101|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmul Zd.t, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|000010|Zn|Zd" , "t": "~HSD"},
+ {"inst": "fmul Zd.H, Zn.H, Zm.H[#idx]" , "op": "01100100|0|idx:1|1|idx:2|Zm:3|001000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmul Zd.S, Zn.S, Zm.S[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|001000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmul Zd.D, Zn.D, Zm.D[#idx]" , "op": "01100100|11|1|idx:1|Zm:4|001000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmul Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000010100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmul Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011010100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpHalfOrTwoImm(immF)"},
+ {"inst": "fmulx Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|001010100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fneg Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011101101|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fnmad Zdn.t, Pg/M, Zm.t, Za.t" , "op": "01100101|sz|1|Za|110|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fnmla Zda.t, Pg/M, Zn.t, Zm.t" , "op": "01100101|sz|1|Zm|010|Pg:3|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fnmls Zda.t, Pg/M, Zn.t, Zm.t" , "op": "01100101|sz|1|Zm|011|Pg:3|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fnmsb Zdn.t, Pg/M, Zm.t, Za.t" , "op": "01100101|sz|1|Za|111|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "frecpe Zd.t, Zn.t" , "op": "01100101|sz|001110001100|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frecps Zd.t, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|000110|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frecpx Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|001100101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frinta Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000100101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frinti Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000111101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frintm Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000010101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frintn Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000000101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frintp Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000001101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frintx Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000110101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frintz Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|000011101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frsqrte Zd.t, Zn.t" , "op": "01100101|sz|001111001100|Zn|Zd" , "t": "~HSD"},
+ {"inst": "frsqrts Zd.t, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|000111|Zn|Zd" , "t": "~HSD"},
+ {"inst": "fscale Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|001001100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fsqrt Zd.t, Pg/M, Zn.t" , "op": "01100101|sz|001101101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "fsub Zd.t, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|000001|Zn|Zd" , "t": "~HSD"},
+ {"inst": "fsub Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000001100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fsub Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011001100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpHalfOrOneImm(immF)"},
+ {"inst": "fsubr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100101|sz|000011100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fsubr Zdn.t, Pg/M, Zdn.t, #immF" , "op": "01100101|sz|011011100|Pg:3|0000|imm:1|Zdn" , "t": "~HSD", "imm": "FpHalfOrOneImm(immF)"},
+ {"inst": "ftmad Zdn.t, Zdn.t, Zm.t, #imm" , "op": "01100101|sz|010|imm:3|100000|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "ftsmul Zd.t, Zn.t, Zm.t" , "op": "01100101|sz|0|Zm|000011|Zn|Zd" , "t": "~HSD"},
+ {"inst": "ftssel Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|101100|Zn|Zd" , "t": "~HSD"},
+ {"inst": "incb Xdn, {#pattern}, {mul #imm}" , "op": "00000100|00|11|imm:4|111000|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "incd Xdn, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|111000|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "incd Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|110000|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "inch Xdn, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|111000|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "inch Zdn.H, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|110000|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "incp Xdn, Pm.t" , "op": "00100101|sz|1011001000100|Pm|Rdn"},
+ {"inst": "incp Zdn.t, Pm.t" , "op": "00100101|sz|1011001000000|Pm|Zdn" , "t": "~HSD"},
+ {"inst": "incw Xdn, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|111000|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "incw Zdn.S, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|110000|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "index Zd.t, Wn, Wm" , "op": "00000100|sz|1|Rm|010011|Rn|Zd" , "t": "BHS~"},
+ {"inst": "index Zd.D, Xn, Xm" , "op": "00000100|11|1|Rm|010011|Rn|Zd"},
+ {"inst": "index Zd.t, Wn, #immS" , "op": "00000100|sz|1|immS:5|010001|Rn|Zd" , "t": "BHS~"},
+ {"inst": "index Zd.D, Xn, #immS" , "op": "00000100|11|1|immS:5|010001|Rn|Zd"},
+ {"inst": "index Zd.t, #immS, Wm" , "op": "00000100|sz|1|Rm|010010|immS:5|Zd" , "t": "BHS~"},
+ {"inst": "index Zd.D, #immS, Xm" , "op": "00000100|11|1|Rm|010010|immS:5|Zd"},
+ {"inst": "index Zd.t, #immSa, #immSb" , "op": "00000100|sz|1|immSb:5|010000|immSa:5|Zd"},
+ {"inst": "insr Zdn.t, Wm" , "op": "00000101|sz|100100001110|Rm|Zdn" , "t": "BHS~"},
+ {"inst": "insr Zdn.D, Xm" , "op": "00000101|11|100100001110|Rm|Zdn"},
+ {"inst": "insr Zdn.B, Bm" , "op": "00000101|00|110100001110|Vm|Zdn"},
+ {"inst": "insr Zdn.H, Hm" , "op": "00000101|01|110100001110|Vm|Zdn"},
+ {"inst": "insr Zdn.S, Sm" , "op": "00000101|10|110100001110|Vm|Zdn"},
+ {"inst": "insr Zdn.D, Dm" , "op": "00000101|11|110100001110|Vm|Zdn"},
+ {"inst": "lasta Wd, Pg, Zn.t" , "op": "00000101|sz|100000101|Pg:3|Zn|Rd" , "t": "BHS~"},
+ {"inst": "lasta Xd, Pg, Zn.D" , "op": "00000101|11|100000101|Pg:3|Zn|Rd"},
+ {"inst": "lasta Bd, Pg, Zn.B" , "op": "00000101|00|100010100|Pg:3|Zn|Rd"},
+ {"inst": "lasta Hd, Pg, Zn.H" , "op": "00000101|01|100010100|Pg:3|Zn|Rd"},
+ {"inst": "lasta Sd, Pg, Zn.S" , "op": "00000101|10|100010100|Pg:3|Zn|Rd"},
+ {"inst": "lasta Dd, Pg, Zn.D" , "op": "00000101|11|100010100|Pg:3|Zn|Rd"},
+ {"inst": "lastb Wd, Pg, Zn.t" , "op": "00000101|sz|100001101|Pg:3|Zn|Rd" , "t": "BHS~"},
+ {"inst": "lastb Xd, Pg, Zn.D" , "op": "00000101|11|100001101|Pg:3|Zn|Rd"},
+ {"inst": "lastb Bd, Pg, Zn.B" , "op": "00000101|00|100011100|Pg:3|Zn|Rd"},
+ {"inst": "lastb Hd, Pg, Zn.H" , "op": "00000101|01|100011100|Pg:3|Zn|Rd"},
+ {"inst": "lastb Sd, Pg, Zn.S" , "op": "00000101|10|100011100|Pg:3|Zn|Rd"},
+ {"inst": "lastb Dd, Pg, Zn.D" , "op": "00000101|11|100011100|Pg:3|Zn|Rd"},
+
+ {"inst": "lsl Zd.t, Zn.t, Zm.D" , "op": "00000100|sz|1|Zm|100011|Zn|Zd" , "t": "BHS~"},
+ {"inst": "lsl Zd.t, Zn.t, #imm" , "op": "00000100|imm:2|1|imm:5|100111|Zn|Zd" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "lsl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010011100|Pg:3|Zm|Zdn"},
+ {"inst": "lsl Zdn.t, Pg/M, Zdn.t, Zm.D" , "op": "00000100|sz|011011100|Pg:3|Zm|Zdn" , "t": "BHS~"},
+ {"inst": "lsl Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|000011100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "lslr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010111100|Pg:3|Zm|Zdn"},
+ {"inst": "lsr Zd.t, Zn.t, Zm.D" , "op": "00000100|sz|1|Zm|100001|Zn|Zd" , "t": "BHS~"},
+ {"inst": "lsr Zd.t, Zn.t, #imm" , "op": "00000100|imm:2|1|imm:5|100101|Zn|Zd" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "lsr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010001100|Pg:3|Zm|Zdn"},
+ {"inst": "lsr Zdn.t, Pg/M, Zdn.t, Zm.D" , "op": "00000100|sz|011001100|Pg:3|Zm|Zdn" , "t": "BHS~"},
+ {"inst": "lsr Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|000001100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "lsrr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010101100|Pg:3|Zm|Zdn"},
+ {"inst": "mad Zdn.t, Pg/M, Zm.t, Za.t" , "op": "00000100|sz|0|Zm|110|Pg:3|Za|Zdn"},
+ {"inst": "mla Zda.t, Pg/M, Zn.t, Zm.t" , "op": "00000100|sz|0|Zm|010|Pg:3|Za|Zdn"},
+ {"inst": "mls Zda.t, Pg/M, Zn.t, Zm.t" , "op": "00000100|sz|0|Zm|011|Pg:3|Za|Zdn"},
+ {"inst": "mov Pd.B, Pn.B" , "op": "001001011000|Pn|01|Pn|0|Pn|0|Pd" , "aliasOf": "orr"},
+ {"inst": "mov Zd.t, Wn|SP" , "op": "00000101|sz|100000001110|Rn|Zd" , "aliasOf": "dup", "T": "BHS~"},
+ {"inst": "mov Zd.t, Xn|SP" , "op": "00000101|11|100000001110|Rn|Zd" , "aliasOf": "dup"},
+ {"inst": "mov Zd.B, Bn" , "op": "00000101|imm:2|1|imm:5|001000|Zn|Zd" , "aliasOf": "dup", "imm": "SveDupImm(0, 0)"},
+ {"inst": "mov Zd.H, Hn" , "op": "00000101|imm:2|1|imm:5|001000|Zn|Zd" , "aliasOf": "dup", "imm": "SveDupImm(1, 0)"},
+ {"inst": "mov Zd.S, Sn" , "op": "00000101|imm:2|1|imm:5|001000|Zn|Zd" , "aliasOf": "dup", "imm": "SveDupImm(2, 0)"},
+ {"inst": "mov Zd.D, Dn" , "op": "00000101|imm:2|1|imm:5|001000|Zn|Zd" , "aliasOf": "dup", "imm": "SveDupImm(3, 0)"},
+ {"inst": "mov Zd.D, Zn.D" , "op": "00000100|01|1|Zn|001100|Zn|Zd" , "aliasOf": "orr"},
+ {"inst": "mov Zd.t, Zn.t[#idx]" , "op": "00000101|imm:2|1|imm:5|001000|Zn|Zd" , "aliasOf": "dup", "imm": "SveDupImm(sz, idx)"},
+ {"inst": "mov Zd.t, #imm" , "op": "00000101|11|0000|imm:13|Zd" , "aliasOf": "dupm", "imm": "SveDupmImm(sz, imm)"},
+ {"inst": "mov Zd.t, #imm, {lsl #n}" , "op": "00100101|sz|11100011|n:1|imm:8|Zd" , "aliasOf": "dup"},
+ {"inst": "mov Pd.B, Pg/M, Pn.B" , "op": "00100101|00|00|Pd|01|Pg|1|Pn|1|Pd" , "aliasOf": "sel"},
+ {"inst": "mov Pd.B, Pg/Z, Pn.B" , "op": "00100101|00|00|Pn|01|Pg|0|Pn|0|Pd" , "aliasOf": "and"},
+ {"inst": "mov Zd.t, Pg/M, Wn|SP" , "op": "00000101|sz|101000101|Pg:3|Rn|Zd" , "aliasOf": "cpy", "t": "BHS~"},
+ {"inst": "mov Zd.D, Pg/M, Xn|SP" , "op": "00000101|11|101000101|Pg:3|Rn|Zd" , "aliasOf": "cpy"},
+ {"inst": "mov Zd.B, Pg/M, Bn" , "op": "00000101|00|100000100|Pg:3|Rn|Zd" , "aliasOf": "cpy"},
+ {"inst": "mov Zd.H, Pg/M, Hn" , "op": "00000101|01|100000100|Pg:3|Rn|Zd" , "aliasOf": "cpy"},
+ {"inst": "mov Zd.S, Pg/M, Sn" , "op": "00000101|10|100000100|Pg:3|Rn|Zd" , "aliasOf": "cpy"},
+ {"inst": "mov Zd.D, Pg/M, Dn" , "op": "00000101|11|100000100|Pg:3|Rn|Zd" , "aliasOf": "cpy"},
+ {"inst": "mov Zd.t, Pg/M, Zn.t" , "op": "00000101|sz|1|Zd|11|Pg|Zn|Zd" , "aliasOf": "sel"},
+ {"inst": "mov Zd.t, Pg/MZ, #imm, {lsl #n}" , "op": "00000101|sz|01|Pg|0M|n:1|imm:8|Zd" , "aliasOf": "cpy"},
+ {"inst": "movprfx Zd, Zn" , "op": "00000100|00|100000101111|Zn|Zd"},
+ {"inst": "movprfx Zd.t, Pg/MZ, Zn.t" , "op": "00000100|sz|01000M001|Pg:3|Zn|Zd"},
+ {"inst": "movs Pd.B, Pn.B" , "op": "00100101|11|00|Pn|01|Pn|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W", "aliasOf": "orrs"},
+ {"inst": "movs Pd.B, Pg/Z, Pn.B" , "op": "00100101|01|00|Pn|01|Pg|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W", "aliasOf": "ands"},
+ {"inst": "msb Zdn.t, Pg/M, Zm.t, Za.t" , "op": "00000100|sz|0|Zm|111|Pg:3|Za|Zdn"},
+ {"inst": "mul Zdn.t, Zdn.t, #immS" , "op": "00100101|sz|110000110|immS:8|Zdn"},
+ {"inst": "mul Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010000000|Pg:3|Zm|Zdn"},
+ {"inst": "nand Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|10|00|Pm|01|Pg|1|Pn|1|Pd"},
+ {"inst": "nands Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|11|00|Pm|01|Pg|1|Pn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "neg Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|010111101|Pg:3|Zm|Zdn"},
+ {"inst": "nor Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|10|00|Pm|01|Pg|1|Pn|0|Pd"},
+ {"inst": "nors Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|11|00|Pm|01|Pg|1|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "not Pd.B, Pg/Z, Pn.B" , "op": "00100101|00|00|Pg|01|Pg|1|Pn|0|Pd"},
+ {"inst": "not Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|011110101|Pg:3|Zn|Zd"},
+ {"inst": "nots Pd.B, Pg/Z, Pn.B" , "op": "00100101|01|00|Pg|01|Pg|1|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "orn Zdn.t, Zdn.t, #imm" , "op": "00000101|00|0000|imm:13|Zdn" , "imm": "SveLogicalImm(imm, 1, t)"},
+ {"inst": "orn Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|10|00|Pm|01|Pg|0|Pn|1|Pd"},
+ {"inst": "orns Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|11|00|Pm|01|Pg|0|Pn|1|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "orr Zd.D, Zn.D, Zm.D" , "op": "00000100|01|1|Zm|001100|Zn|Zd"},
+ {"inst": "orr Zdn.t, Zdn.t, #imm" , "op": "00000101|00|0000|imm:13|Zdn" , "imm": "SveLogicalImm(imm, 0, t)"},
+ {"inst": "orr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|011000000|Pg:3|Zm|Zdn"},
+ {"inst": "orr Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100100|10|00|Pm|01|Pg|0|Pn|0|Pd"},
+ {"inst": "orrs Pd.B, Pg/Z, Pn.B, Pm.B" , "op": "00100101|11|00|Pm|01|Pg|0|Pn|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "orv Bd, Pg, Zn.B" , "op": "00000100|00|011000001|Pg:3|Zn|Vd"},
+ {"inst": "orv Hd, Pg, Zn.H" , "op": "00000100|01|011000001|Pg:3|Zn|Vd"},
+ {"inst": "orv Sd, Pg, Zn.S" , "op": "00000100|10|011000001|Pg:3|Zn|Vd"},
+ {"inst": "orv Dd, Pg, Zn.D" , "op": "00000100|11|011000001|Pg:3|Zn|Vd"},
+ {"inst": "pfalse Pd.B" , "op": "00100101|00|011000111001|000000|Pd"},
+ {"inst": "pfirst Pdn.B, Pg, Pdn.B" , "op": "00100101|01|0110001100000|Pg|0|Pdn"},
+ {"inst": "pnext Pdn.t, Pg, Pdn.t" , "op": "00100101|sz|0110011100010|Pg|0|Pdn"},
+
+ {"inst": "ptest Pg, Pn.B" , "op": "00100101|01|01000011|Pg|0|Pn|00000" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "ptrue Pd.t, {#pattern}" , "op": "00100101|sz|011000111000|pattern:5|0|Pd"},
+ {"inst": "ptrues Pd.t, {#pattern}" , "op": "00100101|sz|011001111000|pattern:5|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "punpkhi Pd.H, Pn.B" , "op": "00000101|00|1100010100000|Pn|0|Pd"},
+ {"inst": "punpklo Pd.H, Pn.B" , "op": "00000101|00|1100000100000|Pn|0|Pd"},
+ {"inst": "rbit Zd.t, Pg/M, Zn.t" , "op": "00000101|sz|100111100|Pg:3|Zn|Zd"},
+ {"inst": "rdffr Pd.B" , "op": "00100101|00|011001111100000000|Pd"},
+ {"inst": "rdffr Pd.B, Pg/Z" , "op": "00100101|00|0110001111000|Pg|0|Pd"},
+ {"inst": "rdffrs Pd.B, Pg/Z" , "op": "00100101|01|0110001111000|Pg|0|Pd" , "io": "N=W Z=W C=W V=W"},
+ {"inst": "rdvl Xd, #immS" , "op": "00000100|10|11111101010|immS:6|Rd"},
+ {"inst": "rev Pd.t, Pn.t" , "op": "00000101|sz|1101000100000|Pn|0|Pd"},
+ {"inst": "rev Zd.t, Zn.t" , "op": "00000101|sz|111000001110|Zn|Zd"},
+ {"inst": "revb Zd.t, Pg/M, Zn.t" , "op": "00000101|sz|100100100|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "revh Zd.t, Pg/M, Zn.t" , "op": "00000101|sz|100101100|Pg:3|Zn|Zd" , "t": "~~SD"},
+ {"inst": "revw Zd.D, Pg/M, Zn.D" , "op": "00000101|11|100110100|Pg:3|Zn|Zd"},
+ {"inst": "rshrnb Zd.ta, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|000110|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "rshrnt Zd.ta, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|000111|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sabd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|0|01100000|Pg:3|Zm|Zdn"},
+ {"inst": "saddv Dd, Pg, Zn.t" , "op": "00000100|sz|0|00000001|Pg:3|Zn|Vd" , "t": "BHS~"},
+ {"inst": "scvtf Zd.H, Pg/M, Zn.H" , "op": "01100101|01|0|10010101|Pg:3|Zn|Zd"},
+ {"inst": "scvtf Zd.H, Pg/M, Zn.S" , "op": "01100101|01|0|10100101|Pg:3|Zn|Zd"},
+ {"inst": "scvtf Zd.S, Pg/M, Zn.S" , "op": "01100101|10|0|10100101|Pg:3|Zn|Zd"},
+ {"inst": "scvtf Zd.D, Pg/M, Zn.S" , "op": "01100101|11|0|10000101|Pg:3|Zn|Zd"},
+ {"inst": "scvtf Zd.H, Pg/M, Zn.D" , "op": "01100101|01|0|10110101|Pg:3|Zn|Zd"},
+ {"inst": "scvtf Zd.S, Pg/M, Zn.D" , "op": "01100101|11|0|10100101|Pg:3|Zn|Zd"},
+ {"inst": "scvtf Zd.D, Pg/M, Zn.D" , "op": "01100101|11|0|10110101|Pg:3|Zn|Zd"},
+ {"inst": "sdiv Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|0|10100000|Pg:3|Zm|Zdn" , "t": "~~SD"},
+ {"inst": "sdivr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|0|10110000|Pg:3|Zm|Zdn" , "t": "~~SD"},
+ {"inst": "sdot Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|000000|Zn|Zda" , "ta": "~~SD", "tb": "~~BH"},
+ {"inst": "sdot Zda.S, Zn.B, Zm.B[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000000|Zn|Zda"},
+ {"inst": "sdot Zda.D, Zn.H, Zm.H[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|000000|Zn|Zda"},
+ {"inst": "sel Pd.B, Pg, Pn.B, Pm.B" , "op": "00100101|00|00|Pm|01|Pg|1|Pn|1|Pd"},
+ {"inst": "sel Zd.t, Pg, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|11|Pg|Zn|Zd"},
+ {"inst": "setffr" , "op": "00100101|00|10|1100100100|0000000000"},
+ {"inst": "shrnb Zd.t, Zn.t, #imm" , "op": "01000101|0|imm:1|1|imm:5|0001|00|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "t": "~BHS"},
+ {"inst": "shrnt Zd.t, Zn.t, #imm" , "op": "01000101|0|imm:1|1|imm:5|0001|01|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "t": "~BHS"},
+ {"inst": "smax Zdn.t, Zdn.t, #immS" , "op": "00100101|sz|1|01000110|immS:8|Zdn"},
+ {"inst": "smax Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|0|01000000|Pg:3|Zm|Zdn"},
+ {"inst": "smaxv Bd, Pg, Zn.B" , "op": "00000100|00|0|01000001|Pg:3|Zn|Vd"},
+ {"inst": "smaxv Hd, Pg, Zn.H" , "op": "00000100|01|0|01000001|Pg:3|Zn|Vd"},
+ {"inst": "smaxv Sd, Pg, Zn.S" , "op": "00000100|10|0|01000001|Pg:3|Zn|Vd"},
+ {"inst": "smaxv Dd, Pg, Zn.D" , "op": "00000100|11|0|01000001|Pg:3|Zn|Vd"},
+ {"inst": "smin Zdn.t, Zdn.t, #immS" , "op": "00100101|sz|1|01010110|immS:8|Zdn"},
+ {"inst": "smin Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|0|01010000|Pg:3|Zm|Zdn"},
+ {"inst": "sminv Bd, Pg, Zn.B" , "op": "00000100|00|0|01010001|Pg:3|Zn|Vd"},
+ {"inst": "sminv Hd, Pg, Zn.H" , "op": "00000100|01|0|01010001|Pg:3|Zn|Vd"},
+ {"inst": "sminv Sd, Pg, Zn.S" , "op": "00000100|10|0|01010001|Pg:3|Zn|Vd"},
+ {"inst": "sminv Dd, Pg, Zn.D" , "op": "00000100|11|0|01010001|Pg:3|Zn|Vd"},
+ {"inst": "smulh Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|0|10010000|Pg:3|Zm|Zdn"},
+ {"inst": "splice Zdn.t, Pg, Zdn.t, Zm.t" , "op": "00000101|sz|1|01100100|Pg:3|Zn|Zdn"},
+ {"inst": "sqadd Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|000100|Zn|Zd"},
+ {"inst": "sqadd Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|1|0010011|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+ {"inst": "sqdecb Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|00|10|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecb Xdn, {#pattern}, {mul #imm}" , "op": "00000100|00|11|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecd Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecd Xdn, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecd Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|110010|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdech Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|01|10|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdech Xdn, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdech Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|01|01|imm:4|110010|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecp Xdn, Pm.t, Wdn" , "op": "00100101|sz|1|010101000100|Pm|Rdn"},
+ {"inst": "sqdecp Xdn, Pm.t" , "op": "00100101|sz|1|010101000110|Pm|Rdn"},
+ {"inst": "sqdecp Zdn.t, Pm.t" , "op": "00100101|sz|1|010101000000|Pm|Zdn" , "t": "~HSD"},
+ {"inst": "sqdecw Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecw Xdn, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|111110|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqdecw Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|110010|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincb Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|00|10|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincb Xdn, {#pattern}, {mul #imm}" , "op": "00000100|00|11|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincd Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincd Xdn, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincd Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|110000|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqinch Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|01|10|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqinch Xdn, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqinch Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|01|01|imm:4|110000|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincp Xdn, Pm.t, Wdn" , "op": "00100101|sz|1010001000100|Pm|Rdn"},
+ {"inst": "sqincp Xdn, Pm.t" , "op": "00100101|sz|1010001000110|Pm|Rdn"},
+ {"inst": "sqincp Zdn.t, Pm.t" , "op": "00100101|sz|1010001000000|Pm|Zdn" , "t": "~HSD"},
+ {"inst": "sqincw Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincw Xdn, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|111100|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "sqincw Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|110000|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+
+ {"inst": "sqsub Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|000110|Zn|Zd"},
+ {"inst": "sqsub Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|10011011|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+
+ {"inst": "sub Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|000001|Zn|Zd"},
+ {"inst": "sub Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|10000111|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+ {"inst": "sub Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|000001000|Pg:3|Zm|Zdn"},
+ {"inst": "subr Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|10001111|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+ {"inst": "subr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|000011000|Pg:3|Zm|Zdn"},
+ {"inst": "sunpkhi Zd.t, Zn.tb" , "op": "00000101|sz|110001001110|Zn|Zd"},
+ {"inst": "sunpklo Zd.t, Zn.tb" , "op": "00000101|sz|110000001110|Zn|Zd"},
+ {"inst": "sxtb Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|010000101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "sxth Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|010010101|Pg:3|Zn|Zd" , "t": "~~SD"},
+ {"inst": "sxtw Zd.D, Pg/M, Zn.D" , "op": "00000100|11|010100101|Pg:3|Zn|Zd"},
+ {"inst": "tbl Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|001100|Zn|Zd"},
+ {"inst": "trn1 Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|011100|Zn|Zd"},
+ {"inst": "trn1 Pd.t, Pn.t, Pm.t" , "op": "00000101|sz|10|Pm|0101000|Pn|0|Pd"},
+ {"inst": "trn2 Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|011101|Zn|Zd"},
+ {"inst": "trn2 Pd.t, Pn.t, Pm.t" , "op": "00000101|sz|10|Pm|0101010|Pn|0|Pd"},
+ {"inst": "uabd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|001101000|Pg:3|Zm|Zdn"},
+ {"inst": "uaddv Dd, Pg, Zn.t" , "op": "00000100|sz|000001001|Pg:3|Zn|Vd" , "t": "BHS~"},
+ {"inst": "ucvtf Zd.H, Pg/M, Zn.H" , "op": "01100101|01|010011101|Pg:3|Zn|Zd"},
+ {"inst": "ucvtf Zd.H, Pg/M, Zn.S" , "op": "01100101|01|010101101|Pg:3|Zn|Zd"},
+ {"inst": "ucvtf Zd.S, Pg/M, Zn.S" , "op": "01100101|10|010101101|Pg:3|Zn|Zd"},
+ {"inst": "ucvtf Zd.D, Pg/M, Zn.S" , "op": "01100101|11|010001101|Pg:3|Zn|Zd"},
+ {"inst": "ucvtf Zd.H, Pg/M, Zn.D" , "op": "01100101|01|010111101|Pg:3|Zn|Zd"},
+ {"inst": "ucvtf Zd.S, Pg/M, Zn.D" , "op": "01100101|11|010101101|Pg:3|Zn|Zd"},
+ {"inst": "ucvtf Zd.D, Pg/M, Zn.D" , "op": "01100101|11|010111101|Pg:3|Zn|Zd"},
+ {"inst": "udiv Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010101000|Pg:3|Zm|Zdn" , "t": "~~SD"},
+ {"inst": "udivr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010111000|Pg:3|Zm|Zdn" , "t": "~~SD"},
+ {"inst": "udot Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|000001|Zn|Zda" , "ta": "~~SD", "tb": "~~BH"},
+ {"inst": "udot Zda.S, Zn.B, Zm.B[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000001|Zn|Zda"},
+ {"inst": "udot Zda.D, Zn.H, Zm.H[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|000001|Zn|Zda"},
+ {"inst": "umax Zdn.t, Zdn.t, #immZ" , "op": "00100101|sz|101001110|immZ:8|Zdn"},
+ {"inst": "umax Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|001001000|Pg:3|Zm|Zdn"},
+ {"inst": "umaxv Bd, Pg, Zn.B" , "op": "00000100|00|001001001|Pg:3|Zn|Vd"},
+ {"inst": "umaxv Hd, Pg, Zn.H" , "op": "00000100|01|001001001|Pg:3|Zn|Vd"},
+ {"inst": "umaxv Sd, Pg, Zn.S" , "op": "00000100|10|001001001|Pg:3|Zn|Vd"},
+ {"inst": "umaxv Dd, Pg, Zn.D" , "op": "00000100|11|001001001|Pg:3|Zn|Vd"},
+ {"inst": "umin Zdn.t, Zdn.t, #immS" , "op": "00100101|sz|101011110|immS:8|Zdn"},
+ {"inst": "umin Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|001011000|Pg:3|Zm|Zdn"},
+ {"inst": "uminv Bd, Pg, Zn.B" , "op": "00000100|00|001011001|Pg:3|Zn|Vd"},
+ {"inst": "uminv Hd, Pg, Zn.H" , "op": "00000100|01|001011001|Pg:3|Zn|Vd"},
+ {"inst": "uminv Sd, Pg, Zn.S" , "op": "00000100|10|001011001|Pg:3|Zn|Vd"},
+ {"inst": "uminv Dd, Pg, Zn.D" , "op": "00000100|11|001011001|Pg:3|Zn|Vd"},
+ {"inst": "umulh Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "00000100|sz|010011000|Pg:3|Zm|Zdn"},
+ {"inst": "uqadd Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|000101|Zn|Zd"},
+ {"inst": "uqadd Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|10010111|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+ {"inst": "uqdecb Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|00|10|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecb Xdn, {#pattern}, {mul #imm}" , "op": "00000100|00|11|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecd Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecd Xdn, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecd Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|110011|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdech Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|01|10|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdech Xdn, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdech Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|01|01|imm:4|110011|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecp Xdn, Pm.t" , "op": "00100101|sz|1010111000100|Pm|Rdn"},
+ {"inst": "uqdecp Xdn, Pm.t" , "op": "00100101|sz|1010111000110|Pm|Rdn"},
+ {"inst": "uqdecp Zdn.t, Pm.t" , "op": "00100101|sz|1010111000000|Pm|Zdn" , "t": "~HSD"},
+ {"inst": "uqdecw Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecw Xdn, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|111111|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqdecw Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|110011|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincb Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|00|10|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincb Xdn, {#pattern}, {mul #imm}" , "op": "00000100|00|11|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincd Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincd Xdn, {#pattern}, {mul #imm}" , "op": "00000100|11|11|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincd Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|11|10|imm:4|110001|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqinch Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|01|10|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqinch Xdn, {#pattern}, {mul #imm}" , "op": "00000100|01|11|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqinch Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|01|01|imm:4|110001|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincp Xdn, Pm.t" , "op": "00100101|sz|1010011000100|Pm|Rdn"},
+ {"inst": "uqincp Xdn, Pm.t" , "op": "00100101|sz|1010011000110|Pm|Rdn"},
+ {"inst": "uqincp Zdn.t, Pm.t" , "op": "00100101|sz|1010011000000|Pm|Zdn" , "t": "~HSD"},
+ {"inst": "uqincw Xdn, Wdn, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincw Xdn, {#pattern}, {mul #imm}" , "op": "00000100|10|11|imm:4|111101|pattern:5|Rdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqincw Zdn.D, {#pattern}, {mul #imm}" , "op": "00000100|10|10|imm:4|110001|pattern:5|Zdn" , "imm": "SvePatternImm(pattern, imm)"},
+ {"inst": "uqsub Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|000111|Zn|Zd"},
+ {"inst": "uqsub Zdn.t, Zdn.t, #imm, {lsl #n}" , "op": "00100101|sz|10011111|n:1|imm:8|Zdn" , "imm": "Sve8BitImm(imm)"},
+ {"inst": "uunpkhi Zd.t, Zn.tb" , "op": "00000101|sz|110011001110|Zn|Zd"},
+ {"inst": "uunpklo Zd.t, Zn.tb" , "op": "00000101|sz|110010001110|Zn|Zd"},
+ {"inst": "uxtb Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|010001101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "uxth Zd.t, Pg/M, Zn.t" , "op": "00000100|sz|010011101|Pg:3|Zn|Zd" , "t": "~~SD"},
+ {"inst": "uxtw Zd.D, Pg/M, Zn.D" , "op": "00000100|11|010101101|Pg:3|Zn|Zd"},
+ {"inst": "uzp1 Pd.t, Pn.t, Pm.t" , "op": "00000101|sz|10|Pm|0100100|Pn|0|Pd"},
+ {"inst": "uzp1 Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|011010|Zn|Zd"},
+ {"inst": "uzp2 Pd.t, Pn.t, Pm.t" , "op": "00000101|sz|10|Pm|0100110|Pn|0|Pd"},
+ {"inst": "uzp2 Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|011011|Zn|Zd"},
+ {"inst": "whilege Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X00|Rn|0|Pd"},
+ {"inst": "whilegt Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X00|Rn|1|Pd"},
+ {"inst": "whilehi Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X10|Rn|1|Pd"},
+ {"inst": "whilehs Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X10|Rn|0|Pd"},
+ {"inst": "whilele Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X01|Rn|1|Pd"},
+ {"inst": "whilelo Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X11|Rn|0|Pd"},
+ {"inst": "whilels Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X11|Rn|1|Pd"},
+ {"inst": "whilelt Pd.t, Rn, Rm" , "op": "00100101|sz|1|Rm|000X01|Rn|0|Pd"},
+ {"inst": "wrffr Pn.B" , "op": "00100101|00|1010001001000|Pn|00000"},
+ {"inst": "zip1 Pd.t, Pn.t, Pm.t" , "op": "00000101|sz|10|Pm|0100000|Pn|0|Pd"},
+ {"inst": "zip1 Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|011000|Zn|Zd"},
+ {"inst": "zip2 Pd.t, Pn.t, Pm.t" , "op": "00000101|sz|10|Pm|0100010|Pn|0|Pd"},
+ {"inst": "zip2 Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|011001|Zn|Zd"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE_BF16", "data": [
+ {"inst": "bfcvt Zd.H, Pg/M, Zn.S" , "op": "01100101|10|001010101|Pg:3|Zn|Zd"},
+ {"inst": "bfcvtnt Zd.H, Pg/M, Zn.S" , "op": "01100100|10|001010101|Pg:3|Zn|Zd"},
+ {"inst": "bfdot Zda.S, Zn.H, Zm.H" , "op": "01100100|01|1|Zm|100000|Zn|Zda"},
+ {"inst": "bfdot Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|01|1|idx:2|Zm:3|010000|Zn|Zda"},
+ {"inst": "bfmlalb Zda.S, Zn.H, Zm.H" , "op": "01100100|11|1|Zm|100000|Zn|Zda"},
+ {"inst": "bfmlalb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|11|1|idx:2|Zm:3|0100|idx:1|0|Zn|Zda"},
+ {"inst": "bfmlalt Zda.S, Zn.H, Zm.H" , "op": "01100100|11|1|Zm|100001|Zn|Zda"},
+ {"inst": "bfmlalt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|11|1|idx:2|Zm:3|0100|idx:1|1|Zn|Zda"},
+ {"inst": "bfmmla Zda.S, Zn.H, Zm.H" , "op": "01100100|01|1|Zm|111001|Zn|Zda"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE_F32MM", "data": [
+ {"inst": "fmmla Zda.S, Zn.S, Zm.S" , "op": "01100100|10|1|Zm|111001|Zn|Zda", "t": "~~SD"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE_F64MM", "data": [
+ {"inst": "fmmla Zda.D, Zn.D, Zm.D" , "op": "01100100|11|1|Zm|111001|Zn|Zda", "t": "~~SD"},
+ {"inst": "trn1 Zd.Q, Zn.Q, Zm.Q" , "op": "00000101|10|1|Zm|000110|Zn|Zd"},
+ {"inst": "trn2 Zd.Q, Zn.Q, Zm.Q" , "op": "00000101|10|1|Zm|000111|Zn|Zd"},
+ {"inst": "uzp1 Zd.Q, Zn.Q, Zm.Q" , "op": "00000101|10|1|Zm|000010|Zn|Zd"},
+ {"inst": "uzp2 Zd.Q, Zn.Q, Zm.Q" , "op": "00000101|10|1|Zm|000011|Zn|Zd"},
+ {"inst": "zip1 Zd.Q, Zn.Q, Zm.Q" , "op": "00000101|10|1|Zm|000000|Zn|Zd"},
+ {"inst": "zip2 Zd.Q, Zn.Q, Zm.Q" , "op": "00000101|10|1|Zm|000001|Zn|Zd"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE_I8MM", "data": [
+ {"inst": "smmla Zda.S, Zn.B, Zm.B" , "op": "01000101|00|0|Zm|100110|Zn|Zda"},
+ {"inst": "sudot Zda.S, Zn.B, Zm.B[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000111|Zn|Zda"},
+ {"inst": "ummla Zda.S, Zn.B, Zm.B" , "op": "01000101|11|0|Zm|100110|Zn|Zda"},
+ {"inst": "usdot Zda.S, Zn.B, Zm.B" , "op": "01000100|10|0|Zm|011110|Zn|Zda"},
+ {"inst": "usdot Zda.S, Zn.B, Zm.B[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000110|Zn|Zda"},
+ {"inst": "usmmla Zda.S, Zn.B, Zm.B" , "op": "01000101|10|0|Zm|100110|Zn|Zda"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE2", "data": [
+ {"inst": "adclb Zda.t, Pg/M, Zn.t" , "op": "01000101|0|sz[0]|0|Zm|110100|Zn|Zda" , "t": "~~SD"},
+ {"inst": "adclt Zda.t, Pg/M, Zn.t" , "op": "01000101|0|sz[0]|0|Zm|110101|Zn|Zda" , "t": "~~SD"},
+ {"inst": "addhnb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011000|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "addhnt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011001|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "bcax Zdn.D, Zdn.D, Zm.D, Zk.D" , "op": "00000100|01|1|Zm|001110|Zk|Zdn"},
+ {"inst": "bsl Zdn.D, Zdn.D, Zm.D, Zk.D" , "op": "00000100|00|1|Zm|001111|Zk|Zdn"},
+ {"inst": "bsl1n Zdn.D, Zdn.D, Zm.D, Zk.D" , "op": "00000100|01|1|Zm|001111|Zk|Zdn"},
+ {"inst": "bsl2n Zdn.D, Zdn.D, Zm.D, Zk.D" , "op": "00000100|10|1|Zm|001111|Zk|Zdn"},
+ {"inst": "cadd Zdn.t, Zdn.t, Zm.t, #rot1" , "op": "01000101|sz|0|00000110|11|imm:1|Zm|Zdn" , "imm": "Rot1Imm(rot1)"},
+ {"inst": "cdot Zda.ta, Zn.tb, Zm.tb, #rot2" , "op": "01000100|sz|0|Zm|0001|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)", "ta": "~~SD", "tb": "~~BH"},
+ {"inst": "cdot Zda.S, Zn.B, Zm.B[#idx], #rot2" , "op": "01000100|10|1|idx:2|Zm:3|0100|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "cdot Zda.D, Zn.H, Zm.H[#idx], #rot2" , "op": "01000100|11|1|idx:1|Zm:4|0100|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "cmla Zda.t, Zn.t, Zm.t, #rot2" , "op": "01000100|sz|0|Zm|0010|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "cmla Zda.H, Zn.H, Zm.H[#idx], #rot2" , "op": "01000100|10|1|idx:2|Zm:3|0110|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "cmla Zda.S, Zn.S, Zm.S[#idx], #rot2" , "op": "01000100|11|1|idx:1|Zm:4|0110|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "eor3 Zdn.D, Zdn.D, Zm.D, Zk.D" , "op": "00000100|00|1|Zm|001110|Zk|Zdn"},
+ {"inst": "ext Zd.B, 2x{Zn.B}+, #imm" , "op": "00000101|01|1|imm:5|000|imm:3|Zn|Zd"},
+ {"inst": "faddp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100100|sz|010000100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fcmla Zda.t, Pg/M, Zn.t, Zm.t, #rot2" , "op": "01100100|sz|0|Zm|0|imm:2|Pg:3|Zn|Zda" , "t": "~HSD", "imm": "Rot2Imm(rot2)"},
+ {"inst": "fcmla Zda.H, Zn.H, Zm.H[#idx], #rot2" , "op": "01100100|10|1|idx:2|Zm:3|0001|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "fcmla Zda.S, Zn.S, Zm.S[#idx], #rot2" , "op": "01100100|11|1|idx:1|Zm:4|0001|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "fcvtlt Zd.S, Pg/M, Zn.H" , "op": "01100100|10|001001101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtlt Zd.D, Pg/M, Zn.S" , "op": "01100100|11|001011101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtnt Zd.H, Pg/M, Zn.S" , "op": "01100100|10|001000101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtnt Zd.S, Pg/M, Zn.D" , "op": "01100100|11|001010101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtx Zd.S, Pg/M, Zn.D" , "op": "01100101|00|001010101|Pg:3|Zn|Zd"},
+ {"inst": "fcvtxnt Zd.S, Pg/M, Zn.D" , "op": "01100100|00|001010101|Pg:3|Zn|Zd"},
+ {"inst": "flogb Zd.t, Pg/M, Zn.t" , "op": "01100101|00|011|sz|0101|Pg:3|Zn|Zd" , "t": "~HSD"},
+ {"inst": "fmaxnmp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100100|sz|010100100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmaxp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100100|sz|010110100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fminnmp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100100|sz|010101100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fminp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01100100|sz|010111100|Pg:3|Zm|Zdn" , "t": "~HSD"},
+ {"inst": "fmlalb Zda.S, Zn.H, Zm.H" , "op": "01100100|10|1|Zm|100000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlalb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|0100|idx:1|0|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlalt Zda.S, Zn.H, Zm.H" , "op": "01100100|10|1|Zm|100001|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlalt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|0100|idx:1|1|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlslb Zda.S, Zn.H, Zm.H" , "op": "01100100|10|1|Zm|101000|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlslb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|0110|idx:1|0|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlslt Zda.S, Zn.H, Zm.H" , "op": "01100100|10|1|Zm|101001|Zn|Zda" , "t": "~HSD"},
+ {"inst": "fmlslt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01100100|10|1|idx:2|Zm:3|0110|idx:1|1|Zn|Zda" , "t": "~HSD"},
+ {"inst": "histcnt Zd.t, Pg/Z, Zn.t, Zm.t" , "op": "01000101|sz|1|Zm|110|Pg:3|Zn|Zd" , "t": "~~SD"},
+ {"inst": "histseg Zd.B, Zn.B, Zm.B" , "op": "01000101|00|1|Zm|101000|Zn|Zd"},
+ {"inst": "match Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01000101|sz|1|Zm|100|Pg:3|Zn|0|Pd" , "io": "N=W Z=W C=W V=W", "t": "BH~~"},
+ {"inst": "mla Zda.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|000010|Zn|Zda"},
+ {"inst": "mla Zda.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000010|Zn|Zda"},
+ {"inst": "mla Zda.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|000010|Zn|Zda"},
+ {"inst": "mls Zda.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|000011|Zn|Zda"},
+ {"inst": "mls Zda.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000011|Zn|Zda"},
+ {"inst": "mls Zda.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|000011|Zn|Zda"},
+ {"inst": "mul Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|011000|Zn|Zd"},
+ {"inst": "mul Zd.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|111110|Zn|Zd"},
+ {"inst": "mul Zd.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|111110|Zn|Zd"},
+ {"inst": "mul Zd.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|111110|Zn|Zd"},
+ {"inst": "nbsl Zdn.D, Zdn.D, Zm.D, Zk.D" , "op": "00000100|11|1|Zm|001111|Zk|Zdn"},
+ {"inst": "nmatch Pd.t, Pg/Z, Zn.t, Zm.t" , "op": "01000101|sz|1|Zm|100|Pg:3|Zn|1|Pd" , "io": "N=W Z=W C=W V=W", "t": "BH~~"},
+ {"inst": "pmul Zd.B, Zn.B, Zm.B" , "op": "00000100|00|1|Zm|011001|Zn|Zd"},
+ {"inst": "pmullb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011010|Zn|Zd" , "ta": "QH~D", "tb": "DB~S"},
+ {"inst": "pmullt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011011|Zn|Zd" , "ta": "QH~D", "tb": "DB~S"},
+ {"inst": "raddhnb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011010|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "raddhnt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011011|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "rsubhnb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011110|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "rsubhnt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011111|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "saba Zda.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|111110|Zn|Zd"},
+ {"inst": "sabalb Zda.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|110000|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sabalt Zda.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|110001|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sabdlb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|001100|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sabdlt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|001101|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sadalp Zda.ta, Pg/M, Zn.tb" , "op": "01000100|sz|0|00100101|Pg:3|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "saddlb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000000|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "saddlbt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|100000|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "saddlt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000001|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "saddwb Zd.ta, Zn.t, Zm.tb" , "op": "01000101|sz|0|Zm|010000|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "saddwt Zd.ta, Zn.t, Zm.tb" , "op": "01000101|sz|0|Zm|010001|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sbclb Zda.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|110100|Zn|Zda" , "t": "~~SD"},
+ {"inst": "sbclt Zda.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|110101|Zn|Zda" , "t": "~~SD"},
+ {"inst": "shadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|0|10000100|Pg:3|Zm|Zdn"},
+ {"inst": "shsub Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|0|10010100|Pg:3|Zm|Zdn"},
+ {"inst": "shsubr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|0|10110100|Pg:3|Zm|Zdn"},
+ {"inst": "sli Zd.t, Zn.t, #idxmm" , "op": "01000101|imm:2|0|imm:5|111101|Zn|Zd" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "smaxp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|0|10100101|Pg:3|Zm|Zdn"},
+ {"inst": "sminp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|0|10110101|Pg:3|Zm|Zdn"},
+ {"inst": "smlalb Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010000|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "smlalb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1000|idx:1|0|Zn|Zda"},
+ {"inst": "smlalb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1000|idx:1|0|Zn|Zda"},
+ {"inst": "smlalt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010001|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "smlalt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1000|idx:1|1|Zn|Zda"},
+ {"inst": "smlalt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1000|idx:1|1|Zn|Zda"},
+ {"inst": "smlslb Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010100|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "smlslb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1010|idx:1|0|Zn|Zda"},
+ {"inst": "smlslb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1010|idx:1|0|Zn|Zda"},
+ {"inst": "smlslt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010101|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "smlslt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1010|idx:1|1|Zn|Zda"},
+ {"inst": "smlslt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1010|idx:1|1|Zn|Zda"},
+ {"inst": "smulh Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|011010|Zn|Zd"},
+ {"inst": "smullb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011100|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "smullb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1100|idx:1|0|Zn|Zda"},
+ {"inst": "smullb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1100|idx:1|0|Zn|Zda"},
+ {"inst": "smullt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011101|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "smullt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1100|idx:1|1|Zn|Zda"},
+ {"inst": "smullt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1100|idx:1|1|Zn|Zda"},
+ {"inst": "splice Zd.t, Pg, 2x{Zn.t}+" , "op": "00000101|sz|1|01101100|Pg:3|Zn|Zd"},
+ {"inst": "sqabs Zd.t, Pg/M, Zn.t" , "op": "01000100|sz|0|01000101|Pg:3|Zn|Zd"},
+ {"inst": "sqadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|0|11000100|Pg:3|Zm|Zdn"},
+ {"inst": "sqcadd Zdn.t, Zdn.t, Zm.t, #rot1" , "op": "01000101|sz|0|0000111011|imm:1|Zm|Zdn" , "imm": "Rot1Imm(rot1)"},
+ {"inst": "sqdmlalb Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|011000|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmlalb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|0010|idx:1|0|Zn|Zda"},
+ {"inst": "sqdmlalb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|0010|idx:1|0|Zn|Zda"},
+ {"inst": "sqdmlalbt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|000010|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmlalt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|011001|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmlalt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|0010|idx:1|1|Zn|Zda"},
+ {"inst": "sqdmlalt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|0010|idx:1|1|Zn|Zda"},
+ {"inst": "sqdmlslb Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|011010|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmlslb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|0011|idx:1|0|Zn|Zda"},
+ {"inst": "sqdmlslb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|0011|idx:1|0|Zn|Zda"},
+ {"inst": "sqdmlslbt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|000011|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmlslt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|011011|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmlslt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|0011|idx:1|1|Zn|Zda"},
+ {"inst": "sqdmlslt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|0011|idx:1|1|Zn|Zda"},
+ {"inst": "sqdmulh Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|011100|Zn|Zd" , "t": "~HSD"},
+ {"inst": "sqdmulh Zd.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|111100|Zn|Zd"},
+ {"inst": "sqdmulh Zd.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|111100|Zn|Zd"},
+ {"inst": "sqdmulh Zd.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|111100|Zn|Zd"},
+ {"inst": "sqdmullb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011000|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmullb Zd.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1110|idx:1|0|Zn|Zd"},
+ {"inst": "sqdmullb Zd.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|1110|idx:1|0|Zn|Zd"},
+ {"inst": "sqdmullt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011001|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "sqdmullt Zd.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1110|idx:1|1|Zn|Zd"},
+ {"inst": "sqdmullt Zd.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|1110|idx:1|1|Zn|Zd"},
+ {"inst": "sqneg Zd.t, Pg/M, Zn.t" , "op": "01000100|sz|001001101|Pg:3|Zm|Zdn"},
+ {"inst": "sqrdcmlah Zda.t, Zn.t, Zm.t, #rot2" , "op": "01000100|sz|0|Zm|0011|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "sqrdcmlah Zda.H, Zn.H, Zm.H[#idx], #rot2" , "op": "01000100|10|1|idx:2|Zm:3|0111|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "sqrdcmlah Zda.S, Zn.S, Zm.S[#idx], #rot2" , "op": "01000100|11|1|idx:1|Zm:4|0111|imm:2|Zn|Zda" , "imm": "Rot2Imm(rot2)"},
+ {"inst": "sqrdmlah Zda.t, Zn.t, Zm.t" , "op": "01000100|sz|0|Zm|011100|Zn|Zda"},
+ {"inst": "sqrdmlah Zda.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|000100|Zn|Zda"},
+ {"inst": "sqrdmlah Zda.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000100|Zn|Zda"},
+ {"inst": "sqrdmlah Zda.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|000100|Zn|Zda"},
+ {"inst": "sqrdmlsh Zda.t, Zn.t, Zm.t" , "op": "01000100|sz|0|Zm|011101|Zn|Zda"},
+ {"inst": "sqrdmlsh Zda.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|000101|Zn|Zda"},
+ {"inst": "sqrdmlsh Zda.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|000101|Zn|Zda"},
+ {"inst": "sqrdmlsh Zda.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|000101|Zn|Zda"},
+ {"inst": "sqrdmulh Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|011101|Zn|Zd"},
+ {"inst": "sqrdmulh Zd.H, Zn.H, Zm.H[#idx]" , "op": "01000100|0|idx:1|1|idx:2|Zm:3|111101|Zn|Zd"},
+ {"inst": "sqrdmulh Zd.S, Zn.S, Zm.S[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|111101|Zn|Zd"},
+ {"inst": "sqrdmulh Zd.D, Zn.D, Zm.D[#idx]" , "op": "01000100|11|1|idx:1|Zm:4|111101|Zn|Zd"},
+ {"inst": "sqrshl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001010100|Pg:3|Zm|Zdn"},
+ {"inst": "sqrshlr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001110100|Pg:3|Zm|Zdn"},
+ {"inst": "sqrshrnb Zd.ta, Zd.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001010|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqrshrnt Zd.ta, Zd.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001011|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqrshrunb Zd.ta, Zd.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|000010|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqrshrunt Zd.ta, Zd.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|000011|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqshl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001000100|Pg:3|Zm|Zdn"},
+ {"inst": "sqshl Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|000110100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "sqshlr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001100100|Pg:3|Zm|Zdn"},
+ {"inst": "sqshlu Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|001111100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "sqshrnb Zd.t, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001000|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "sqshrnt Zd.t, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001001|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "sqshrunb Zd.t, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|000000|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "sqshrunt Zd.t, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|000000|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "sqsub Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011010100|Pg:3|Zm|Zdn"},
+ {"inst": "sqsubr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011110100|Pg:3|Zm|Zdn"},
+ {"inst": "sqxtnb Zd.ta, Zn.tb" , "op": "01000101|0|imm:1|1|imm:2|000010000|Zn|Zd" , "imm": "SveXtImm(sz)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqxtnt Zd.ta, Zn.tb" , "op": "01000101|0|imm:1|1|imm:2|000010001|Zn|Zd" , "imm": "SveXtImm(sz)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqxtunb Zd.ta, Zn.tb" , "op": "01000101|0|imm:1|1|imm:2|000010100|Zn|Zd" , "imm": "SveXtImm(sz)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "sqxtunt Zd.ta, Zn.tb" , "op": "01000101|0|imm:1|1|imm:2|000010101|Zn|Zd" , "imm": "SveXtImm(sz)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "srhadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010100100|Pg:3|Zm|Zdn"},
+ {"inst": "sri Zd.t, Zn.t, #imm" , "op": "01000101|imm:2|0|imm:5|111100|Zn|Zd" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "srshl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|000010100|Pg:3|Zm|Zdn"},
+ {"inst": "srshlr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|000110100|Pg:3|Zm|Zdn"},
+ {"inst": "srshr Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|001100100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "srsra Zda.t, Zn.t, #imm" , "op": "01000101|imm:2|0|imm:5|111010|Zn|Zda" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "sshllb Zd.t, Zn.t, #imm" , "op": "01000101|0|imm:1|0|imm:5|101000|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "sshllt Zd.t, Zn.t, #imm" , "op": "01000101|0|imm:1|0|imm:5|101001|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "ssra Zda.t, Zn.t, #imm" , "op": "01000101|imm:2|0|imm:5|111000|Zn|Zda" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "ssublb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000100|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "ssublbt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|100010|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "ssublt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000101|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "ssubltb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|100011|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "ssubwb Zd.ta, Zn.t, Zm.tb" , "op": "01000101|sz|0|Zm|010100|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "ssubwt Zd.ta, Zn.t, Zm.tb" , "op": "01000101|sz|0|Zm|010101|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "subhnb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011100|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "subhnt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|1|Zm|011101|Zn|Zd" , "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "suqadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011100100|Pg:3|Zm|Zdn"},
+ {"inst": "tbl Zd.t, 2x{Zn.t}+, Zm.t" , "op": "00000101|sz|1|Zm|001010|Zn|Zd"},
+ {"inst": "tbx Zd.t, Zn.t, Zm.t" , "op": "00000101|sz|1|Zm|001011|Zn|Zd"},
+ {"inst": "uaba Zda.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|111111|Zn|Zd"},
+ {"inst": "uabalb Zda.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|110010|Zn|Zd" , "TODO": "ta.tb?"},
+ {"inst": "uabalt Zda.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|110011|Zn|Zd" , "TODO": "ta.tb?"},
+ {"inst": "uabdlb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|001110|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uabdlt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|001111|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uadalp Zda.ta, Pg/M, Zn.tb" , "op": "01000100|sz|000101101|Pg:3|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uaddlb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000010|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uaddlt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000011|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uaddwb Zd.ta, Zn.ta, Zm.tb" , "op": "01000101|sz|0|Zm|010010|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uaddwt Zd.ta, Zn.ta, Zm.tb" , "op": "01000101|sz|0|Zm|010011|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "uhadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010001100|Pg:3|Zm|Zdn"},
+ {"inst": "uhsub Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010011100|Pg:3|Zm|Zdn"},
+ {"inst": "uhsubr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010111100|Pg:3|Zm|Zdn"},
+ {"inst": "umaxp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010101101|Pg:3|Zm|Zdn"},
+ {"inst": "uminp Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010111101|Pg:3|Zm|Zdn"},
+ {"inst": "umlalb Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010010|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "umlalb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1001|idx:1|0|Zn|Zda"},
+ {"inst": "umlalb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1001|idx:1|0|Zn|Zda"},
+ {"inst": "umlalt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010011|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "umlalt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1001|idx:1|1|Zn|Zda"},
+ {"inst": "umlalt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1001|idx:1|1|Zn|Zda"},
+ {"inst": "umlslb Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010110|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "umlslb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1011|idx:1|0|Zn|Zda"},
+ {"inst": "umlslb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1011|idx:1|0|Zn|Zda"},
+ {"inst": "umlslt Zda.ta, Zn.tb, Zm.tb" , "op": "01000100|sz|0|Zm|010111|Zn|Zda" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "umlslt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1011|idx:1|1|Zn|Zda"},
+ {"inst": "umlslt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1011|idx:1|1|Zn|Zda"},
+ {"inst": "umulh Zd.t, Zn.t, Zm.t" , "op": "00000100|sz|1|Zm|011011|Zn|Zd"},
+ {"inst": "umullb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011110|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "umullb Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1101|idx:1|0|Zn|Zda"},
+ {"inst": "umullb Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1101|idx:1|0|Zn|Zda"},
+ {"inst": "umullt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|011111|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "umullt Zda.S, Zn.H, Zm.H[#idx]" , "op": "01000100|10|1|idx:2|Zm:3|1101|idx:1|1|Zn|Zda"},
+ {"inst": "umullt Zda.D, Zn.S, Zm.S[#idx]" , "op": "01000100|11|1|idx:2|Zm:3|1101|idx:1|1|Zn|Zda"},
+ {"inst": "uqadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011001100|Pg:3|Zm|Zdn"},
+ {"inst": "uqrshl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001011100|Pg:3|Zm|Zdn"},
+ {"inst": "uqrshlr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001111100|Pg:3|Zm|Zdn"},
+ {"inst": "uqrshrnb Zd.ta, Zd.tb, #idxmm" , "op": "01000101|0|imm:1|1|imm:5|001110|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "uqrshrnt Zd.ta, Zd.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001111|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "uqshl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001001100|Pg:3|Zm|Zdn"},
+ {"inst": "uqshl Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|000111100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "uqshlr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|001101100|Pg:3|Zm|Zdn"},
+ {"inst": "uqshrnb Zd.t, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001100|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "uqshrnt Zd.t, Zn.tb, #imm" , "op": "01000101|0|imm:1|1|imm:5|001101|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "uqsub Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011011100|Pg:3|Zm|Zdn"},
+ {"inst": "uqsubr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011111100|Pg:3|Zm|Zdn"},
+ {"inst": "uqxtnb Zd.ta, Zn.tb" , "op": "01000101|0|imm:1|1|imm:2|000010010|Zn|Zd" , "imm": "SveXtImm(sz)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "uqxtnt Zd.ta, Zn.tb" , "op": "01000101|0|imm:1|1|imm:2|000010011|Zn|Zd" , "imm": "SveXtImm(sz)", "ta": "~BHS", "tb": "~HSD"},
+ {"inst": "urecpe Zd.S, Pg/M, Zn.S" , "op": "01000100|10|000000101|Pg:3|Zn|Zd"},
+ {"inst": "urhadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|010101100|Pg:3|Zm|Zdn"},
+ {"inst": "urshl Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|000011100|Pg:3|Zm|Zdn"},
+ {"inst": "urshlr Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|000111100|Pg:3|Zm|Zdn"},
+ {"inst": "urshr Zdn.t, Pg/M, Zdn.t, #imm" , "op": "00000100|imm:2|001101100|Pg:3|imm:5|Zdn" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "ursqrte Zd.S, Pg/M, Zn.S" , "op": "01000100|10|000001101|Pg:3|Zn|Zd"},
+ {"inst": "ursra Zda.t, Zn.t, #imm" , "op": "01000101|imm:2|0|imm:5|111011|Zn|Zda" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "ushllb Zd.t, Zn.t, #imm" , "op": "01000101|0|imm:1|0|imm:5|101010|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "ushllt Zd.t, Zn.t, #imm" , "op": "01000101|0|imm:1|0|imm:5|101011|Zn|Zd" , "imm": "SveShiftImm6(sz, imm)"},
+ {"inst": "usqadd Zdn.t, Pg/M, Zdn.t, Zm.t" , "op": "01000100|sz|011101100|Pg:3|Zm|Zdn"},
+ {"inst": "usra Zda.t, Zn.t, #imm" , "op": "01000101|imm:2|0|imm:5|111001|Zn|Zda" , "imm": "SveShiftImm7(sz, imm)"},
+ {"inst": "usublb Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000110|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "usublt Zd.ta, Zn.tb, Zm.tb" , "op": "01000101|sz|0|Zm|000111|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "usubwb Zd.ta, Zn.ta, Zm.tb" , "op": "01000101|sz|0|Zm|010110|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "usubwt Zd.ta, Zn.ta, Zm.tb" , "op": "01000101|sz|0|Zm|010111|Zn|Zd" , "ta": "~HSD", "tb": "~BHS"},
+ {"inst": "whilerw Pd.t, Xn, Xm" , "op": "00100101|sz|1|Rm|001100|Rn|1|Pd"},
+ {"inst": "whilewr Pd.t, Xn, Xm" , "op": "00100101|sz|1|Rm|001100|Rn|0|Pd"},
+ {"inst": "xar Zdn.t, Zdn.t, Zm.t, #imm" , "op": "00000100|imm:2|1|imm:5|001101|Zm|Zdn" , "imm": "SveShiftImm7(sz, imm)"}
+ ]},
+
+ {"category": "SVE CRYPTO_HASH", "ext": "SVE2_AES", "data": [
+ {"inst": "aesd Zdn.B, Zdn.B, Zm.B" , "op": "01000101|00|100010111|001|Zm|Zdn"},
+ {"inst": "aese Zdn.B, Zdn.B, Zm.B" , "op": "01000101|00|100010111|000|Zm|Zdn"},
+ {"inst": "aesimc Zdn.B, Zdn.B" , "op": "01000101|00|100000111|001|00000|Zdn"},
+ {"inst": "aesmc Zdn.B, Zdn.B" , "op": "01000101|00|100000111|000|00000|Zdn"}
+ ]},
+
+ {"category": "SVE", "ext": "SVE2_BITPERM", "data": [
+ {"inst": "bdep Zd.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|101101|Zn|Zd"},
+ {"inst": "bext Zd.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|101100|Zn|Zd"},
+ {"inst": "bgrp Zd.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|101110|Zn|Zd"}
+ ]},
+
+ {"category": "SVE CRYPTO_HASH", "ext": "SVE2_SHA3", "data": [
+ {"inst": "rax1 Zd.D, Zn.D, Zm.D" , "op": "01000101|00|1|Zm|111101|Zn|Zd"}
+ ]},
+
+ {"category": "SVE CRYPTO_HASH", "ext": "SVE2_SM4", "data": [
+ {"inst": "sm4e Zdn.S, Zdn.S, Zm.S" , "op": "01000101|00|1|00011111000|Zm|Zdn"},
+ {"inst": "sm4ekey Zd.S, Zn.S, Zm.S" , "op": "01000101|00|1|Zm|111100|Zn|Zd"}
+ ]},
+
+ {"category": "SME", "ext": "SME", "data": [
+ {"inst": "smstart {#sme_mode=1}" , "op": "11010101|00|000011|0100|0|op:2|1|011|11111" , "imm": "ImmSMEMode(sme_mode)"},
+ {"inst": "smstop {#sme_mode=1}" , "op": "11010101|00|000011|0100|0|op:2|0|011|11111" , "imm": "ImmSMEMode(sme_mode)"}
+ ]}
+ ]
+}
diff --git a/3rdparty/asmjit/db/isa_aarch64_sme.json b/3rdparty/asmjit/db/isa_aarch64_sme.json
new file mode 100644
index 00000000000..31d45696e16
--- /dev/null
+++ b/3rdparty/asmjit/db/isa_aarch64_sme.json
@@ -0,0 +1,15 @@
+{
+ "instructions": [
+ {"category": "SME", "ext": "SME", "data": [
+ {"inst": "smstart {#sme_mode=1}" , "op": "11010101|00|000011|0100|0|op:2|1|011|11111" , "imm": "ImmSMEMode(sme_mode)"},
+ {"inst": "smstop {#sme_mode=1}" , "op": "11010101|00|000011|0100|0|op:2|0|011|11111" , "imm": "ImmSMEMode(sme_mode)"},
+
+ {"inst": "eorbt Zd.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|100100|Zn|Zda"},
+ {"inst": "eortb Zd.t, Zn.t, Zm.t" , "op": "01000101|sz|0|Zm|100101|Zn|Zda"},
+ {"inst": "TODO_psel Pd, Pn, Pm.t[Wv, #imm]" , "op": "00100101|sz|0110011100010|Pg|0|Pdn"},
+ {"inst": "revd Zd.Q, Pg/M, Zn.Q" , "op": "00000101|00|101110100|Pg:3|Zn|Zd"},
+ {"inst": "sclamp Zd.t, Zn.t, Zm.t" , "op": "01000100|sz|0|Zm|110000|Zn|Zda"},
+ {"inst": "uclamp Zd.t, Zn.t, Zm.t" , "op": "01000100|sz|0|Zm|110001|Zn|Zda"}
+ ]}
+ ]
+}
diff --git a/3rdparty/asmjit/db/isa_x86.json b/3rdparty/asmjit/db/isa_x86.json
new file mode 100644
index 00000000000..d6be812a05e
--- /dev/null
+++ b/3rdparty/asmjit/db/isa_x86.json
@@ -0,0 +1,4244 @@
+{
+ "instructions": [
+ {"category": "GP", "instructions": [
+ {"any": "adc x:al, imm8" , "alt": true, "op": "[OP] 14 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "adc x:axv, immv" , "alt": true, "op": "[OP] 15 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] adc x:~r8/m8, ~r8" , "op": "[MR] 10 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] adc x:~rv/mv, ~rv" , "op": "[MR] 11 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] adc x:r8/m8, imm8" , "op": "[M ] 80 /2 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] adc x:rv/mv, imms8" , "op": "[M ] 83 /2 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] adc x:rv/mv, immv" , "op": "[M ] 81 /2 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "adc x:~r8, ~r8/m8" , "op": "[RM] 12 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "adc x:~rv, ~rv/mv" , "op": "[RM] 13 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "add x:al, imm8" , "alt": true, "op": "[OP] 04 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "add x:axv, immv" , "alt": true, "op": "[OP] 05 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] add x:~r8/m8, ~r8" , "op": "[MR] 00 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] add x:~rv/mv, ~rv" , "op": "[MR] 01 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] add x:r8/m8, imm8" , "op": "[M ] 80 /0 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] add x:rv/mv, imms8" , "op": "[M ] 83 /0 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] add x:rv/mv, immv" , "op": "[M ] 81 /0 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "add x:~r8, ~r8/m8" , "op": "[RM] 02 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "add x:~rv, ~rv/mv" , "op": "[RM] 03 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "and x:al, imm8" , "alt": true, "op": "[OP] 24 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "and x:ax, imm16" , "alt": true, "op": "[OP] 66 25 iw" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "and X:eax, imm32" , "alt": true, "op": "[OP] 25 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "and X:rax, immu32" , "alt": true, "op": "[OP] 25 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "and X:rax, imms32" , "alt": true, "op": "[OP] REX.W 25 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and x:r8/m8, imm8" , "op": "[M ] 80 /4 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and x:r16/m16, imm16" , "op": "[M ] 66 81 /4 iw" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and X:r32/m32, imm32" , "op": "[M ] 81 /4 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and X:r64, immu32" , "op": "[M ] 81 /4 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and X:r64/m64, imms32" , "op": "[M ] REX.W 81 /4 id" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and x:rv/mv, imms8" , "op": "[M ] 83 /4 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and x:~r8/m8, ~r8" , "op": "[MR] 20 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] and x:~rv/mv, ~rv" , "op": "[MR] 21 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "and x:~r8, ~r8/m8" , "op": "[RM] 22 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "and x:~rv, ~rv/mv" , "op": "[RM] 23 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "bsf w:rv, rv/mv" , "op": "[RM] 0F BC /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=U"},
+ {"any": "bsr w:rv, rv/mv" , "op": "[RM] 0F BD /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=U"},
+ {"any": "bswap X:rv" , "op": "[OP] 0F C8+r"},
+ {"any": "bt R:rv/mv, rv" , "op": "[MR] 0F A3 /r" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "bt R:rv/mv, imm8" , "op": "[M ] 0F BA /4 ib" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] btc x:rv/mv, rv" , "op": "[MR] 0F BB /r" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] btc x:rv/mv, imm8" , "op": "[M ] 0F BA /7 ib" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] btr x:rv/mv, rv" , "op": "[MR] 0F B3 /r" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] btr x:rv/mv, imm8" , "op": "[M ] 0F BA /6 ib" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] bts x:rv/mv, rv" , "op": "[MR] 0F AB /r" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] bts x:rv/mv, imm8" , "op": "[M ] 0F BA /5 ib" , "io": "OF=U SF=U AF=U PF=U CF=W"},
+ {"x86": "[bnd|repIgnore] call rel16" , "op": "[OP] 66 E8 cw" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "[bnd|repIgnore] call rel32" , "op": "[OP] E8 cd" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"x86": "[bnd|repIgnore] call R:r16/m16" , "op": "[OP] 66 FF /2" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"x86": "[bnd|repIgnore] call R:r32/m32" , "op": "[OP] FF /2" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"x64": "[bnd|repIgnore] call R:r64/m64" , "op": "[OP] FF /2" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "cbw x:<ax>" , "op": "[OP] 66 98"},
+ {"any": "cdq W:<edx>, <eax>" , "op": "[OP] 99"},
+ {"any": "cdqe X:<rax>" , "op": "[OP] REX.W 98"},
+ {"any": "clc" , "op": "[OP] F8" , "io": "CF=0"},
+ {"any": "cld" , "op": "[OP] FC" , "io": "DF=0"},
+ {"any": "cmc" , "op": "[OP] F5" , "io": "CF=X"},
+ {"any": "cmp R:r8/m8, r8" , "op": "[MR] 38 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:rv/mv, rv" , "op": "[MR] 39 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:r8, r8/m8" , "op": "[RM] 3A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:rv, rv/mv" , "op": "[RM] 3B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:al, imm8" , "alt": true, "op": "[OP] 3C ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:axv, immv" , "alt": true, "op": "[OP] 3D iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:r8/m8, imm8" , "op": "[M ] 80 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:rv/mv, imms8" , "op": "[M ] 83 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmp R:rv/mv, immv" , "op": "[M ] 81 /7 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[rep|repne] cmps R:m8(ds:zsi), R:m8(es:zdi)" , "op": "[OP] A6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "[rep|repne] cmps R:m16(ds:zsi), R:m16(es:zdi)" , "op": "[OP] 66 A7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "[rep|repne] cmps R:m32(ds:zsi), R:m32(es:zdi)" , "op": "[OP] A7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "[rep|repne] cmps R:m64(ds:zsi), R:m64(es:zdi)" , "op": "[OP] REX.W A7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "cwde X:<eax>" , "op": "[OP] 98"},
+ {"any": "cqo W:<rdx>, <rax>" , "op": "[OP] REX.W 99"},
+ {"any": "cwd w:<dx>, <ax>" , "op": "[OP] 66 99"},
+ {"x86": "dec x:r16" , "op": "[OP] 66 48+r" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"x86": "dec X:r32" , "op": "[OP] 48+r" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "[lock|xacqrel] dec x:r8/m8" , "op": "[OP] FE /1" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "[lock|xacqrel] dec x:rv/mv" , "op": "[OP] FF /1" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "div x:<ax>, R:r8/m8" , "op": "[M ] F6 /6" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "div x:<dxv>, x:<axv>, rv/mv" , "op": "[M ] F7 /6" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "enter imm16, imm8" , "op": "[OP] C8 iw ib" , "volatile": true},
+ {"any": "idiv x:<ax>, R:r8/m8" , "op": "[M ] F6 /7" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "idiv x:<dxv>, x:<axv>, rv/mv" , "op": "[M ] F7 /7" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "imul x:<ax>, R:r8/m8" , "op": "[M ] F6 /5" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"any": "imul w:<dxv>, x:<axv>, rv/mv" , "op": "[M ] F7 /5" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"any": "imul x:~rv, ~rv/mv" , "op": "[RM] 0F AF /r" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"any": "imul w:rv, R:rv/mv, imms8" , "op": "[RM] 6B /r ib" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"any": "imul w:rv, R:rv/mv, immv" , "op": "[RM] 69 /r iv" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"x86": "inc x:r16" , "op": "[OP] 66 40+r" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"x86": "inc X:r32" , "op": "[OP] 40+r" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "[lock] inc x:r8/m8" , "op": "[M ] FE /0" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "[lock] inc x:rv/mv" , "op": "[M ] FF /0" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "iret" , "op": "[OP] 66 CF" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "iretd" , "op": "[OP] CF" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "iretq" , "op": "[OP] REX.W CF" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "[bnd] jb rel8" , "op": "[OP] 72 cb" , "io": "CF=R"},
+ {"x86": "[bnd] jb rel16" , "op": "[OP] 66 0F 82 cw" , "io": "CF=R"},
+ {"any": "[bnd] jb rel32" , "op": "[OP] 0F 82 cd" , "io": "CF=R"},
+ {"any": "[bnd] jbe rel8" , "op": "[OP] 76 cb" , "io": "CF=R ZF=R"},
+ {"x86": "[bnd] jbe rel16" , "op": "[OP] 66 0F 86 cw" , "io": "CF=R ZF=R"},
+ {"any": "[bnd] jbe rel32" , "op": "[OP] 0F 86 cd" , "io": "CF=R ZF=R"},
+ {"any": "[bnd] jl rel8" , "op": "[OP] 7C cb" , "io": "SF=R OF=R"},
+ {"x86": "[bnd] jl rel16" , "op": "[OP] 66 0F 8C cw" , "io": "SF=R OF=R"},
+ {"any": "[bnd] jl rel32" , "op": "[OP] 0F 8C cd" , "io": "SF=R OF=R"},
+ {"any": "[bnd] jle rel8" , "op": "[OP] 7E cb" , "io": "ZF=R SF=R OF=R"},
+ {"x86": "[bnd] jle rel16" , "op": "[OP] 66 0F 8E cw" , "io": "ZF=R SF=R OF=R"},
+ {"any": "[bnd] jle rel32" , "op": "[OP] 0F 8E cd" , "io": "ZF=R SF=R OF=R"},
+ {"any": "[bnd] jnb rel8" , "op": "[OP] 73 cb" , "io": "CF=R"},
+ {"x86": "[bnd] jnb rel16" , "op": "[OP] 66 0F 83 cw" , "io": "CF=R"},
+ {"any": "[bnd] jnb rel32" , "op": "[OP] 0F 83 cd" , "io": "CF=R"},
+ {"any": "[bnd] jnbe rel8" , "op": "[OP] 77 cb" , "io": "CF=R ZF=R"},
+ {"x86": "[bnd] jnbe rel16" , "op": "[OP] 66 0F 87 cw" , "io": "CF=R ZF=R"},
+ {"any": "[bnd] jnbe rel32" , "op": "[OP] 0F 87 cd" , "io": "CF=R ZF=R"},
+ {"any": "[bnd] jnl rel8" , "op": "[OP] 7D cb" , "io": "SF=R OF=R"},
+ {"x86": "[bnd] jnl rel16" , "op": "[OP] 66 0F 8D cw" , "io": "SF=R OF=R"},
+ {"any": "[bnd] jnl rel32" , "op": "[OP] 0F 8D cd" , "io": "SF=R OF=R"},
+ {"any": "[bnd] jnle rel8" , "op": "[OP] 7F cb" , "io": "ZF=R SF=R OF=R"},
+ {"x86": "[bnd] jnle rel16" , "op": "[OP] 66 0F 8F cw" , "io": "ZF=R SF=R OF=R"},
+ {"any": "[bnd] jnle rel32" , "op": "[OP] 0F 8F cd" , "io": "ZF=R SF=R OF=R"},
+ {"any": "[bnd] jno rel8" , "op": "[OP] 71 cb" , "io": "OF=R"},
+ {"x86": "[bnd] jno rel16" , "op": "[OP] 66 0F 81 cw" , "io": "OF=R"},
+ {"any": "[bnd] jno rel32" , "op": "[OP] 0F 81 cd" , "io": "OF=R"},
+ {"any": "[bnd] jnp rel8" , "op": "[OP] 7B cb" , "io": "PF=R"},
+ {"x86": "[bnd] jnp rel16" , "op": "[OP] 66 0F 8B cw" , "io": "PF=R"},
+ {"any": "[bnd] jnp rel32" , "op": "[OP] 0F 8B cd" , "io": "PF=R"},
+ {"any": "[bnd] jns rel8" , "op": "[OP] 79 cb" , "io": "SF=R"},
+ {"x86": "[bnd] jns rel16" , "op": "[OP] 66 0F 89 cw" , "io": "SF=R"},
+ {"any": "[bnd] jns rel32" , "op": "[OP] 0F 89 cd" , "io": "SF=R"},
+ {"any": "[bnd] jnz rel8" , "op": "[OP] 75 cb" , "io": "ZF=R"},
+ {"x86": "[bnd] jnz rel16" , "op": "[OP] 66 0F 85 cw" , "io": "ZF=R"},
+ {"any": "[bnd] jnz rel32" , "op": "[OP] 0F 85 cd" , "io": "ZF=R"},
+ {"any": "[bnd] jo rel8" , "op": "[OP] 70 cb" , "io": "OF=R"},
+ {"x86": "[bnd] jo rel16" , "op": "[OP] 66 0F 80 cw" , "io": "OF=R"},
+ {"any": "[bnd] jo rel32" , "op": "[OP] 0F 80 cd" , "io": "OF=R"},
+ {"any": "[bnd] jp rel8" , "op": "[OP] 7A cb" , "io": "PF=R"},
+ {"x86": "[bnd] jp rel16" , "op": "[OP] 66 0F 8A cw" , "io": "PF=R"},
+ {"any": "[bnd] jp rel32" , "op": "[OP] 0F 8A cd" , "io": "PF=R"},
+ {"any": "[bnd] js rel8" , "op": "[OP] 78 cb" , "io": "SF=R"},
+ {"x86": "[bnd] js rel16" , "op": "[OP] 66 0F 88 cw" , "io": "SF=R"},
+ {"any": "[bnd] js rel32" , "op": "[OP] 0F 88 cd" , "io": "SF=R"},
+ {"any": "[bnd] jz rel8" , "op": "[OP] 74 cb" , "io": "ZF=R"},
+ {"x86": "[bnd] jz rel16" , "op": "[OP] 66 0F 84 cw" , "io": "ZF=R"},
+ {"any": "[bnd] jz rel32" , "op": "[OP] 0F 84 cd" , "io": "ZF=R"},
+ {"x86": "[bnd] jecxz R:<cx>, rel8" , "op": "[OP] 67 E3 cb"},
+ {"x86": "[bnd] jecxz R:<ecx>, rel8" , "op": "[OP] E3 cb"},
+ {"x64": "[bnd] jecxz R:<ecx>, rel8" , "op": "[OP] 67 E3 cb"},
+ {"x64": "[bnd] jecxz R:<rcx>, rel8" , "op": "[OP] E3 cb"},
+ {"any": "[bnd] jmp rel8" , "op": "[OP] EB cb"},
+ {"x86": "[bnd] jmp rel16" , "op": "[OP] 66 E9 cw"},
+ {"any": "[bnd] jmp rel32" , "op": "[OP] E9 cd"},
+ {"x86": "[bnd] jmp R:r32/m32" , "op": "[M ] FF /4"},
+ {"x64": "[bnd] jmp R:r64/m64" , "op": "[M ] FF /4"},
+ {"x86": "lcall imm16, imm16" , "op": "[OP] 66 9A iw iw" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"x86": "lcall imm16, imm32" , "op": "[OP] 9A id iw" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "lcall R:m16_16" , "op": "[M ] 66 FF /3" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "lcall R:m16_32" , "op": "[M ] FF /3" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"x64": "lcall R:m16_64" , "op": "[M ] REX.W FF /3" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "lea w:r16, mem" , "op": "[RM] 67 8D /r"},
+ {"any": "lea W:r32, mem" , "op": "[RM] 8D /r"},
+ {"any": "lea W:r64, mem" , "op": "[RM] REX.W 8D /r"},
+ {"any": "leave" , "op": "[OP]C9" , "volatile": true},
+ {"x86": "ljmp imm16, imm16" , "op": "[OP] 66 EA iw iw"},
+ {"x86": "ljmp imm16, imm32" , "op": "[OP] EA id iw"},
+ {"any": "ljmp R:m16_16" , "op": "[M ] 66 FF /5"},
+ {"any": "ljmp R:m16_32" , "op": "[M ] FF /5"},
+ {"any": "ljmp R:m16_64" , "op": "[M ] REX.W FF /5"},
+ {"any": "[rep] lods w:al, R:m8(ds:zsi)" , "op": "[OP] AC" , "io": "DF=R"},
+ {"any": "[rep] lods w:ax, R:m16(ds:zsi)" , "op": "[OP] 66 AD" , "io": "DF=R"},
+ {"any": "[rep] lods W:eax, R:m32(ds:zsi)" , "op": "[OP] AD" , "io": "DF=R"},
+ {"any": "[rep] lods W:rax, R:m64(ds:zsi)" , "op": "[OP] REX.W AD" , "io": "DF=R"},
+ {"x86": "loop x:<cx>, rel8" , "op": "[OP] 67 E2 cb"},
+ {"x86": "loop X:<ecx>, rel8" , "op": "[OP] E2 cb"},
+ {"x64": "loop X:<ecx>, rel8" , "op": "[OP] 67 E2 cb"},
+ {"x64": "loop X:<rcx>, rel8" , "op": "[OP] E2 cb"},
+ {"x86": "loope x:<cx>, rel8" , "op": "[OP] 67 E1 cb" , "io": "ZF=R"},
+ {"x86": "loope X:<ecx>, rel8" , "op": "[OP] E1 cb" , "io": "ZF=R"},
+ {"x64": "loope X:<ecx>, rel8" , "op": "[OP] 67 E1 cb" , "io": "ZF=R"},
+ {"x64": "loope X:<rcx>, rel8" , "op": "[OP] E1 cb" , "io": "ZF=R"},
+ {"x86": "loopne x:<cx>, rel8" , "op": "[OP] 67 E0 cb" , "io": "ZF=R"},
+ {"x86": "loopne X:<ecx>, rel8" , "op": "[OP] E0 cb" , "io": "ZF=R"},
+ {"x64": "loopne X:<ecx>, rel8" , "op": "[OP] 67 E0 cb" , "io": "ZF=R"},
+ {"x64": "loopne X:<rcx>, rel8" , "op": "[OP] E0 cb" , "io": "ZF=R"},
+ {"any": "[xrelease] mov w:r8/m8, r8" , "op": "[MR] 88 /r"},
+ {"any": "[xrelease] mov w:rv/mv, rv" , "op": "[MR] 89 /r"},
+ {"any": "[xrelease] mov w:r8/m8, imm8" , "op": "[M ] C6 /0 ib"},
+ {"any": "[xrelease] mov w:rv/mv, immv" , "op": "[M ] C7 /0 iv"},
+ {"any": "mov w:r8, r8/m8" , "op": "[RM] 8A /r"},
+ {"any": "mov w:rv, rv/mv" , "op": "[RM] 8B /r"},
+ {"any": "mov w:r8, imm8" , "op": "[OP] B0+r ib"},
+ {"any": "mov w:r16, imm16" , "op": "[OP] 66 B8+r iw"},
+ {"any": "mov W:r32, imm32" , "op": "[OP] B8+r id"},
+ {"any": "mov W:r64, imm64" , "op": "[OP] REX.W B8+r iq"},
+ {"any": "mov w:r16/m16, sreg" , "op": "[MR] 66 8C /r"},
+ {"any": "mov W:r32/m16, sreg" , "op": "[MR] 8C /r"},
+ {"any": "mov W:r64/m16, sreg" , "op": "[MR] REX.W 8C /r"},
+ {"any": "mov W:sreg, r16/m16" , "op": "[RM] 66 8E /r"},
+ {"any": "mov W:sreg, r32/m16" , "op": "[RM] 8E /r"},
+ {"any": "mov W:sreg, r64/m16" , "op": "[RM] REX.W 8E /r"},
+ {"any": "mov w:al, moff8" , "op": "[OP] A0 moff"},
+ {"any": "mov w:ax, moff16" , "op": "[OP] 66 A1 moff"},
+ {"any": "mov W:eax, moff32" , "op": "[OP] A1 moff"},
+ {"any": "mov W:rax, moff64" , "op": "[OP] REX.W A1 moff"},
+ {"any": "mov W:moff8, al" , "op": "[OP] A2 moff"},
+ {"any": "mov W:moff16, ax" , "op": "[OP] 66 A3 moff"},
+ {"any": "mov W:moff32, eax" , "op": "[OP] A3 moff"},
+ {"any": "mov W:moff64, rax" , "op": "[OP] REX.W A3 moff"},
+ {"x86": "mov W:r32, creg" , "op": "[MR] 0F 20 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x64": "mov W:r64, creg" , "op": "[MR] 0F 20 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x86": "mov W:creg, r32" , "op": "[RM] 0F 22 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x64": "mov W:creg, r64" , "op": "[RM] 0F 22 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x86": "mov W:r32, dreg" , "op": "[MR] 0F 21 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x64": "mov W:r64, dreg" , "op": "[MR] 0F 21 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x86": "mov W:dreg, r32" , "op": "[RM] 0F 23 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"x64": "mov W:dreg, r64" , "op": "[RM] 0F 23 /r" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U", "privilege": "L0"},
+ {"any": "movabs W:r64, imm64" , "op": "[OP] REX.W B8+r iq"},
+ {"any": "movabs w:al, moff8" , "op": "[OP] A0 moff"},
+ {"any": "movabs w:ax, moff16" , "op": "[OP] 66 A1 moff"},
+ {"any": "movabs W:eax, moff32" , "op": "[OP] A1 moff"},
+ {"any": "movabs W:rax, moff64" , "op": "[OP] REX.W A1 moff"},
+ {"any": "movabs W:moff8, al" , "op": "[OP] A2 moff"},
+ {"any": "movabs W:moff16, ax" , "op": "[OP] 66 A3 moff"},
+ {"any": "movabs W:moff32, eax" , "op": "[OP] A3 moff"},
+ {"any": "movabs W:moff64, rax" , "op": "[OP] REX.W A3 moff"},
+ {"any": "[rep] movs W:m8(es:zdi), R:m8(ds:zsi)" , "op": "[OP] A4" , "io": "DF=R"},
+ {"any": "[rep] movs W:m16(es:zdi), R:m16(ds:zsi)" , "op": "[OP] 66 A5" , "io": "DF=R"},
+ {"any": "[rep] movs W:m32(es:zdi), R:m32(ds:zsi)" , "op": "[OP] A5" , "io": "DF=R"},
+ {"any": "[rep] movs W:m64(es:zdi), R:m64(ds:zsi)" , "op": "[OP] REX.W A5" , "io": "DF=R"},
+ {"any": "movsx w:rv, r8/m8" , "op": "[RM] 0F BE /r"},
+ {"any": "movsx W:ry, r16/m16" , "op": "[RM] 0F BF /r"},
+ {"x64": "movsxd W:r16, r16/m16" , "op": "[RM] 66 63 /r"},
+ {"x64": "movsxd W:r32, r32/m32" , "op": "[RM] 63 /r"},
+ {"x64": "movsxd W:r64, r32/m32" , "op": "[RM] REX.W 63 /r"},
+ {"any": "movzx w:rv, r8/m8" , "op": "[RM] 0F B6 /r"},
+ {"any": "movzx W:r32, r16/m16" , "op": "[RM] 0F B7 /r"},
+ {"any": "movzx W:r64, r16/m16" , "op": "[RM] REX.W 0F B7 /r"},
+ {"any": "mul x:<ax>, r8/m8" , "op": "[M ] F6 /4" , "io": "OF=W SF=U ZF=U AF=U PF=U CF=W"},
+ {"any": "mul w:<dxv>, x:<axv>, rv/mv" , "op": "[M ] F7 /4" , "io": "OF=W SF=U ZF=U AF=U PF=U CF=W"},
+ {"any": "[lock|xacqrel] neg x:r8/m8" , "op": "[M ] F6 /3" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] neg x:rv/mv" , "op": "[M ] F7 /3" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "nop" , "op": "[OP] 90"},
+ {"any": "nop R:rv/mv" , "op": "[M ] 0F 1F /0"},
+ {"any": "nop R:rv/mv, rv" , "op": "[MR] 0F 1F /r"},
+ {"any": "[lock|xacqrel] not x:r8/m8" , "op": "[M ] F6 /2"},
+ {"any": "[lock|xacqrel] not x:rv/mv" , "op": "[M ] F7 /2"},
+ {"any": "or x:al, imm8" , "alt": true, "op": "[OP] 0C ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "or x:axv, immv" , "alt": true, "op": "[OP] 0D iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] or x:~r8/m8, ~r8" , "op": "[MR] 08 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] or x:~rv/mv, ~rv" , "op": "[MR] 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] or x:r8/m8, imm8" , "op": "[M ] 80 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] or x:rv/mv, immv" , "op": "[M ] 81 /1 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] or x:rv/mv, imms8" , "op": "[M ] 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "or x:~r8, ~r8/m8" , "op": "[RM] 0A /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "or x:~rv, ~rv/mv" , "op": "[RM] 0B /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "pop w:r16/m16" , "op": "[M ] 66 8F /0"},
+ {"x86": "pop W:r32/m32" , "op": "[M ] 8F /0"},
+ {"x64": "pop W:r64/m64" , "op": "[M ] 8F /0"},
+ {"any": "pop w:r16" , "op": "[OP] 66 58+r"},
+ {"x86": "pop W:r32" , "op": "[OP] 58+r"},
+ {"x64": "pop W:r64" , "op": "[OP] 58+r"},
+ {"x86": "pop W:ds" , "op": "[OP] 1F"},
+ {"x86": "pop W:es" , "op": "[OP] 07"},
+ {"x86": "pop W:ss" , "op": "[OP] 17"},
+ {"any": "pop W:fs" , "op": "[OP] 0F A1"},
+ {"any": "pop W:gs" , "op": "[OP] 0F A9"},
+ {"any": "popf" , "op": "[OP] 66 9D" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=W IF=W TF=W"},
+ {"x86": "popfd" , "op": "[OP] 9D" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=W IF=W TF=W"},
+ {"x64": "popfq" , "op": "[OP] 9D" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=W IF=W TF=W"},
+ {"any": "push R:r16/m16" , "op": "[M ] 66 FF /6"},
+ {"x86": "push R:r32/m32" , "op": "[M ] FF /6"},
+ {"x64": "push R:r64/m64" , "op": "[M ] FF /6"},
+ {"any": "push R:r16" , "op": "[OP] 66 50+r"},
+ {"x86": "push R:r32" , "op": "[OP] 50+r"},
+ {"x64": "push R:r64" , "op": "[OP] 50+r"},
+ {"x86": "push R:cs" , "op": "[OP] 0E"},
+ {"x86": "push R:ss" , "op": "[OP] 16"},
+ {"x86": "push R:ds" , "op": "[OP] 1E"},
+ {"x86": "push R:es" , "op": "[OP] 06"},
+ {"any": "push R:fs" , "op": "[OP] 0F A0"},
+ {"any": "push R:gs" , "op": "[OP] 0F A8"},
+ {"any": "push imm8" , "op": "[OP] 6A ib"},
+ {"any": "push imm16" , "op": "[OP] 66 68 iw"},
+ {"x86": "push imm32" , "op": "[OP] 68 id"},
+ {"x64": "push imms32" , "op": "[OP] 68 id"},
+ {"any": "pushf" , "op": "[OP] 66 9C" , "io": "OF=R SF=R ZF=R AF=R PF=R CF=R DF=R IF=R TF=R"},
+ {"x86": "pushfd" , "op": "[OP] 9C" , "io": "OF=R SF=R ZF=R AF=R PF=R CF=R DF=R IF=R TF=R"},
+ {"x64": "pushfq" , "op": "[OP] 9C" , "io": "OF=R SF=R ZF=R AF=R PF=R CF=R DF=R IF=R TF=R"},
+ {"any": "pushw imm16" , "op": "[OP] 66 68 iw"},
+ {"any": "rcl x:r8/m8, cl" , "op": "[M ] D2 /2" , "io": "CF=X OF=X"},
+ {"any": "rcl x:rv/mv, cl" , "op": "[M ] D3 /2" , "io": "CF=X OF=X"},
+ {"any": "rcl x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /2" , "io": "CF=X OF=X"},
+ {"any": "rcl x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /2" , "io": "CF=X OF=X"},
+ {"any": "rcl x:r8/m8, imm8" , "op": "[M ] C0 /2 ib" , "io": "CF=X OF=X"},
+ {"any": "rcl x:rv/mv, imm8" , "op": "[M ] C1 /2 ib" , "io": "CF=X OF=X"},
+ {"any": "rcr x:r8/m8, cl" , "op": "[M ] D2 /3" , "io": "CF=X OF=X"},
+ {"any": "rcr x:rv/mv, cl" , "op": "[M ] D3 /3" , "io": "CF=X OF=X"},
+ {"any": "rcr x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /3" , "io": "CF=X OF=X"},
+ {"any": "rcr x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /3" , "io": "CF=X OF=X"},
+ {"any": "rcr x:r8/m8, imm8" , "op": "[M ] C0 /3 ib" , "io": "CF=X OF=X"},
+ {"any": "rcr x:rv/mv, imm8" , "op": "[M ] C1 /3 ib" , "io": "CF=X OF=X"},
+ {"any": "[bnd|repIgnore] ret" , "op": "[OP] C3"},
+ {"any": "[bnd|repIgnore] ret immu16" , "op": "[OP] C2 iw"},
+ {"any": "retf" , "op": "[OP] CB"},
+ {"any": "retf immu16" , "op": "[OP] CA iw"},
+ {"any": "rol x:r8/m8, cl" , "op": "[M ] D2 /0" , "io": "CF=W OF=W"},
+ {"any": "rol x:rv/mv, cl" , "op": "[M ] D3 /0" , "io": "CF=W OF=W"},
+ {"any": "rol x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /0" , "io": "CF=W OF=W"},
+ {"any": "rol x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /0" , "io": "CF=W OF=W"},
+ {"any": "rol x:r8/m8, imm8" , "op": "[M ] C0 /0 ib" , "io": "CF=W OF=W"},
+ {"any": "rol x:rv/mv, imm8" , "op": "[M ] C1 /0 ib" , "io": "CF=W OF=W"},
+ {"any": "ror x:r8/m8, cl" , "op": "[M ] D2 /1" , "io": "CF=W OF=W"},
+ {"any": "ror x:rv/mv, cl" , "op": "[M ] D3 /1" , "io": "CF=W OF=W"},
+ {"any": "ror x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /1" , "io": "CF=W OF=W"},
+ {"any": "ror x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /1" , "io": "CF=W OF=W"},
+ {"any": "ror x:r8/m8, imm8" , "op": "[M ] C0 /1 ib" , "io": "CF=W OF=W"},
+ {"any": "ror x:rv/mv, imm8" , "op": "[M ] C1 /1 ib" , "io": "CF=W OF=W"},
+ {"any": "sar x:r8/m8, cl" , "op": "[M ] D2 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sar x:rv/mv, cl" , "op": "[M ] D3 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sar x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sar x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sar x:r8/m8, imm8" , "op": "[M ] C0 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sar x:rv/mv, imm8" , "op": "[M ] C1 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sbb x:al, imm8" , "alt": true, "op": "[OP] 1C ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "sbb x:axv, immv" , "alt": true, "op": "[OP] 1D iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] sbb x:r8/m8, r8" , "op": "[MR] 18 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] sbb x:rv/mv, rv" , "op": "[MR] 19 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] sbb x:r8/m8, imm8" , "op": "[M ] 80 /3 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] sbb x:rv/mv, imms8" , "op": "[M ] 83 /3 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[lock|xacqrel] sbb x:rv/mv, immv" , "op": "[M ] 81 /3 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "sbb x:r8, r8/m8" , "op": "[RM] 1A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "sbb x:rv, rv/mv" , "op": "[RM] 1B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"any": "[rep|repne] scas R:al, R:m8(es:zdi)" , "op": "[OP] AE" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "[rep|repne] scas R:ax, R:m16(es:zdi)" , "op": "[OP] 66 AF" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "[rep|repne] scas R:eax, R:m32(es:zdi)" , "op": "[OP] AF" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "[rep|repne] scas R:rax, R:m64(es:zdi)" , "op": "[OP] REX.W AF" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W DF=R"},
+ {"any": "setb w:r8/m8" , "op": "[M ] 0F 92 /r" , "io": "CF=R"},
+ {"any": "setbe w:r8/m8" , "op": "[M ] 0F 96 /r" , "io": "CF=R ZF=R"},
+ {"any": "setl w:r8/m8" , "op": "[M ] 0F 9C /r" , "io": "SF=R OF=R"},
+ {"any": "setle w:r8/m8" , "op": "[M ] 0F 9E /r" , "io": "ZF=R SF=R OF=R"},
+ {"any": "setnb w:r8/m8" , "op": "[M ] 0F 93 /r" , "io": "CF=R"},
+ {"any": "setnbe w:r8/m8" , "op": "[M ] 0F 97 /r" , "io": "CF=R ZF=R"},
+ {"any": "setnl w:r8/m8" , "op": "[M ] 0F 9D /r" , "io": "SF=R OF=R"},
+ {"any": "setnle w:r8/m8" , "op": "[M ] 0F 9F /r" , "io": "ZF=R SF=R OF=R"},
+ {"any": "setno w:r8/m8" , "op": "[M ] 0F 91 /r" , "io": "OF=R"},
+ {"any": "setnp w:r8/m8" , "op": "[M ] 0F 9B /r" , "io": "PF=R"},
+ {"any": "setns w:r8/m8" , "op": "[M ] 0F 99 /r" , "io": "SF=R"},
+ {"any": "setnz w:r8/m8" , "op": "[M ] 0F 95 /r" , "io": "ZF=R"},
+ {"any": "seto w:r8/m8" , "op": "[M ] 0F 90 /r" , "io": "OF=R"},
+ {"any": "setp w:r8/m8" , "op": "[M ] 0F 9A /r" , "io": "PF=R"},
+ {"any": "sets w:r8/m8" , "op": "[M ] 0F 98 /r" , "io": "SF=R"},
+ {"any": "setz w:r8/m8" , "op": "[M ] 0F 94 /r" , "io": "ZF=R"},
+ {"any": "shl x:r8/m8, cl" , "op": "[M ] D2 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shl x:rv/mv, cl" , "op": "[M ] D3 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shl x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shl x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shl x:r8/m8, imm8" , "op": "[M ] C0 /4 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shl x:rv/mv, imm8" , "op": "[M ] C1 /4 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shld x:rv/mv, rv, cl" , "op": "[MR] 0F A5 /r" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"any": "shld x:rv/mv, rv, imm8" , "op": "[MR] 0F A4 /r ib" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"any": "shr x:r8/m8, cl" , "op": "[M ] D2 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shr x:rv/mv, cl" , "op": "[M ] D3 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shr x:r8/m8, 1" , "alt": true, "op": "[M ] D0 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shr x:rv/mv, 1" , "alt": true, "op": "[M ] D1 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shr x:r8/m8, imm8" , "op": "[M ] C0 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shr x:rv/mv, imm8" , "op": "[M ] C1 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "shrd x:rv/mv, rv, cl" , "op": "[MR] 0F AD /r" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"any": "shrd x:rv/mv, rv, imm8" , "op": "[MR] 66 0F AC /r ib" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"any": "stc" , "op": "[OP] F9" , "io": "CF=1"},
+ {"any": "std" , "op": "[OP] FD" , "io": "DF=1"},
+ {"any": "[rep] stos W:m8(es:zdi), R:al" , "op": "[OP] AA" , "io": "DF=R"},
+ {"any": "[rep] stos W:m16(es:zdi), R:ax" , "op": "[OP] 66 AB" , "io": "DF=R"},
+ {"any": "[rep] stos W:m32(es:zdi), R:eax" , "op": "[OP] AB" , "io": "DF=R"},
+ {"any": "[rep] stos W:m64(es:zdi), R:rax" , "op": "[OP] REX.W AB" , "io": "DF=R"},
+ {"any": "sub x:al, imm8" , "alt": true, "op": "[OP] 2C ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sub x:axv, immv" , "alt": true, "op": "[OP] 2D iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] sub x:r8/m8, r8" , "op": "[MR] 28 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] sub x:rv/mv, rv" , "op": "[MR] 29 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] sub x:r8/m8, imm8" , "op": "[M ] 80 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] sub x:rv/mv, imms8" , "op": "[M ] 83 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] sub x:rv/mv, immv" , "op": "[M ] 81 /5 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sub x:r8, r8/m8" , "op": "[RM] 2A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "sub x:rv, rv/mv" , "op": "[RM] 2B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "test R:~r8/m8, ~r8" , "op": "[MR] 84 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "test R:~rv/mv, ~rv" , "op": "[MR] 85 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "test R:al, imm8" , "alt": true, "op": "[OP] A8 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "test R:axv, immv" , "alt": true, "op": "[OP] A9 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "test R:r8/m8, imm8" , "op": "[M ] F6 /0 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "test R:rv/mv, immv" , "op": "[M ] F7 /0 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "ud0 r32, r32/m32" , "op": "[RM] 0F FF /r"},
+ {"any": "ud1 r32, r32/m32" , "op": "[RM] 0F B9 /r"},
+ {"any": "ud2" , "op": "[OP] 0F 0B"},
+ {"any": "xchg x:~ax, x:~r16" , "alt": true, "op": "[OP] 66 90+r"},
+ {"any": "xchg X:~eax, X:~r32" , "alt": true, "op": "[OP] 90+r"},
+ {"any": "xchg X:~rax, X:~r64" , "alt": true, "op": "[OP] REX.W 90+r"},
+ {"any": "xchg x:~r16, x:~ax" , "alt": true, "op": "[OP] 66 90+r"},
+ {"any": "xchg X:~r32, X:~eax" , "alt": true, "op": "[OP] 90+r"},
+ {"any": "xchg X:~r64, X:~rax" , "alt": true, "op": "[OP] REX.W 90+r"},
+ {"any": "[ilock|xacquire] xchg x:~r8/m8, x:~r8" , "op": "[MR] 86 /r"},
+ {"any": "[ilock|xacquire] xchg x:~rv/mv, x:~rv" , "op": "[MR] 87 /r"},
+ {"any": "[ilock|xacquire] xchg x:~r8, x:~r8/m8" , "op": "[RM] 86 /r"},
+ {"any": "[ilock|xacquire] xchg x:~rv, x:~rv/mv" , "op": "[RM] 87 /r"},
+ {"any": "xor x:al, imm8" , "alt": true, "op": "[OP] 34 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "xor x:axv, immv" , "alt": true, "op": "[OP] 35 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] xor x:~r8/m8, ~r8" , "op": "[MR] 30 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] xor x:~rv/mv, ~rv" , "op": "[MR] 31 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] xor x:r8/m8, imm8" , "op": "[M ] 80 /6 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] xor x:rv/mv, imms8" , "op": "[M ] 83 /6 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "[lock|xacqrel] xor x:rv/mv, immv" , "op": "[M ] 81 /6 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "xor x:~r8, ~r8/m8" , "op": "[RM] 32 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"any": "xor x:~rv, ~rv/mv" , "op": "[RM] 33 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"}
+ ]},
+
+ {"category": "GP GP_IN_OUT", "volatile": true, "instructions": [
+ {"any": "in w:al, imm8" , "op": "E4 ib"},
+ {"any": "in w:ax, imm8" , "op": "66 E5 ib"},
+ {"any": "in W:eax, imm8" , "op": "E5 ib"},
+ {"any": "in w:al, dx" , "op": "EC"},
+ {"any": "in w:ax, dx" , "op": "66 ED"},
+ {"any": "in W:eax, dx" , "op": "ED"},
+ {"any": "[rep] ins W:m8(es:zdi), dx" , "op": "6C"},
+ {"any": "[rep] ins W:m16(es:zdi), dx" , "op": "66 6D"},
+ {"any": "[rep] ins W:m32(es:zdi), dx" , "op": "6D"},
+ {"any": "out imm8, al" , "op": "E6 ib"},
+ {"any": "out imm8, ax" , "op": "66 E7 ib"},
+ {"any": "out imm8, eax" , "op": "E7 ib"},
+ {"any": "out R:dx, R:al" , "op": "EE"},
+ {"any": "out R:dx, R:ax" , "op": "66 EF"},
+ {"any": "out R:dx, R:eax" , "op": "EF"},
+ {"any": "[rep] outs R:dx, R:m8(ds:zsi)" , "op": "6E"},
+ {"any": "[rep] outs R:dx, R:m16(ds:zsi)" , "op": "66 6F"},
+ {"any": "[rep] outs R:dx, R:m32(ds:zsi)" , "op": "6F"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "I486", "instructions": [
+ {"any": "[lock|xacqrel] cmpxchg x:r8/m8, r8, <al>" , "op": "[MR] 0F B0 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] cmpxchg x:rv/mv, rv, <axv>" , "op": "[MR] 0F B1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cpuid X:<eax>, W:<ebx>, X:<ecx>, W:<edx>" , "op": "[OP] 0F A2" , "volatile": true},
+ {"any": "[lock|xacqrel] xadd x:r8/m8, x:r8" , "op": "[MR] 0F C0 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"any": "[lock|xacqrel] xadd x:rv/mv, x:rv" , "op": "[MR] 0F C1 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "3DNOW", "volatile": true, "instructions": [
+ {"any": "prefetch R:mem" , "op": "0F 0D /0"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "ADX", "instructions": [
+ {"any": "adcx X:~ry, R:~ry/my" , "op": "[RM ] 66 0F 38 F6 /r" , "io": "CF=X"},
+ {"any": "adox X:~ry, R:~ry/my" , "op": "[RM ] F3 0F 38 F6 /r" , "io": "OF=X"},
+ {"apx": "adcx X:~ry, R:~ry/my" , "op": "[RM ] EVEX.ND=0.LLZ.66.MAP4.Wy 66 /r" , "io": "CF=X"},
+ {"apx": "adcx W:ry, R:~ry, R:~ry/my" , "op": "[VRM] EVEX.ND=1.LLZ.66.MAP4.Wy 66 /r" , "io": "CF=X"},
+ {"apx": "adox X:~ry, R:~ry/my" , "op": "[RM ] EVEX.ND=0.LLZ.F3.MAP4.Wy 66 /r" , "io": "OF=X"},
+ {"apx": "adox W:ry, R:~ry, R:~ry/my" , "op": "[VRM] EVEX.ND=1.LLZ.F3.MAP4.Wy 66 /r" , "io": "OF=X"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "BMI", "instructions": [
+ {"any": "andn W:ry, R:ry, R:ry/my" , "op": "[RVM] VEX.LZ.0F38.Wy F2 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=0"},
+ {"apx": "andn{nf} W:ry, R:ry, R:my/ry" , "op": "[RVM] EVEX.128.NP.0F38.Wy F2 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=0"},
+ {"any": "bextr W:ry, R:ry/my, R:ry" , "op": "[RMV] VEX.LZ.0F38.Wy F7 /r" , "io": "OF=0 SF=U ZF=W AF=U PF=U CF=0"},
+ {"apx": "bextr{nf} W:ry, R:my/ry, ry" , "op": "[RMV] EVEX.128.NP.0F38.Wy F7 /r" , "io": "OF=0 SF=U ZF=W AF=U PF=U CF=0"},
+ {"any": "blsi W:ry, R:ry/my" , "op": "[VM ] VEX.LZ.0F38.Wy F3 /3" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
+ {"apx": "blsi{nf} W:ry, R:my/ry" , "op": "[VM ] EVEX.128.NP.0F38.Wy F3 /3" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
+ {"any": "blsmsk W:ry, R:ry/my" , "op": "[VM ] VEX.LZ.0F38.Wy F3 /2" , "io": "OF=0 SF=W ZF=0 AF=U PF=U CF=W"},
+ {"apx": "blsmsk{nf} W:ry, R:my/ry" , "op": "[VM ] EVEX.128.NP.0F38.Wy F3 /2" , "io": "OF=0 SF=W ZF=0 AF=U PF=U CF=W"},
+ {"any": "blsr W:ry, R:ry/my" , "op": "[VM ] VEX.LZ.0F38.Wy F3 /1" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
+ {"apx": "blsr{nf} W:ry, R:my/ry" , "op": "[VM ] EVEX.128.NP.0F38.Wy F3 /1" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
+ {"any": "tzcnt w:rv, rv/mv" , "op": "[RM ] F3 0F BC /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
+ {"apx": "tzcnt{nf} w:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F4 /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "BMI2", "instructions": [
+ {"any": "bzhi W:ry, R:ry/my, R:ry" , "op": "[RMV] VEX.LZ.0F38.Wy F5 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
+ {"apx": "bzhi{nf} W:ry, R:my/ry, R:ry" , "op": "[RMV] EVEX.128.NP.0F38.Wy F5 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=U CF=W"},
+ {"any": "mulx W:ry, W:ry, ~ry/my, ~<dxy>" , "op": "[RVM] VEX.LZ.F2.0F38.Wy F6 /r"},
+ {"apx": "mulx W:ry, W:ry, R:~my/ry, R:~<dxy>" , "op": "[RVM] EVEX.128.F2.0F38.Wy F6 /r"},
+ {"any": "pdep W:ry, ry, ry/my" , "op": "[RVM] VEX.LZ.F2.0F38.Wy F5 /r"},
+ {"apx": "pdep W:ry, R:ry, R:my/ry" , "op": "[RVM] EVEX.128.F2.0F38.Wy F5 /r"},
+ {"any": "pext W:ry, ry, ry/my" , "op": "[RVM] VEX.LZ.F3.0F38.Wy F5 /r"},
+ {"apx": "pext W:ry, R:ry, R:my/ry" , "op": "[RVM] EVEX.128.F3.0F38.Wy F5 /r"},
+ {"any": "rorx W:ry, ry/my, imm8" , "op": "[RM ] VEX.LZ.F2.0F3A.Wy F0 /r ib"},
+ {"apx": "rorx W:ry, R:my/ry, imm8" , "op": "[RM ] EVEX.128.F2.0F3A.Wy F0 /r ib"},
+ {"any": "sarx W:ry, ry/my, ry" , "op": "[RMV] VEX.LZ.F3.0F38.Wy F7 /r"},
+ {"apx": "sarx W:ry, R:my/ry, R:ry" , "op": "[RMV] EVEX.128.F3.0F38.Wy F7 /r"},
+ {"any": "shlx W:ry, ry/my, ry" , "op": "[RMV] VEX.LZ.66.0F38.Wy F7 /r"},
+ {"apx": "shlx W:ry, R:my/ry, R:ry" , "op": "[RMV] EVEX.128.66.0F38.Wy F7 /r"},
+ {"any": "shrx W:ry, ry/my, ry" , "op": "[RMV] VEX.LZ.F2.0F38.Wy F7 /r"},
+ {"apx": "shrx W:ry, R:my/ry, R:ry" , "op": "[RMV] EVEX.128.F2.0F38.Wy F7 /r"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CET_SS", "volatile": true, "instructions": [
+ {"any": "incsspd R:r32[7:0]" , "op": "F3 0F AE /5"},
+ {"x64": "incsspq R:r64[7:0]" , "op": "F3 REX.W 0F AE /5"},
+ {"any": "rdsspd W:r32" , "op": "F3 0F 1E /1"},
+ {"any": "rdsspq W:r64" , "op": "F3 REX.W 0F 1E /1"},
+ {"any": "rstorssp R:m64" , "op": "F3 0F 01 /5" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
+ {"any": "saveprevssp" , "op": "F3 0F 01 EA" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLDEMOTE", "instructions": [
+ {"any": "cldemote R:mem" , "op": "[M ] NP 0F 1C /0"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLFLUSH", "instructions": [
+ {"any": "clflush R:mem" , "op": "[M ] NP 0F AE /7"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLFLUSHOPT", "instructions": [
+ {"any": "clflushopt R:mem" , "op": "[M ] NFx 66 0F AE /7"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLWB", "instructions": [
+ {"any": "clwb R:mem" , "op": "[M ] 66 0F AE /6"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CLZERO", "instructions": [
+ {"any": "clzero R:<m512(ds:zax)>" , "op": "[OP] NP 0F 01 FC"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CMOV", "instructions": [
+ {"any": "cmovb x:rv, rv/mv" , "op": "[RM] 0F 42 /r" , "io": "CF=R"},
+ {"any": "cmovbe x:rv, rv/mv" , "op": "[RM] 0F 46 /r" , "io": "CF=R ZF=R"},
+ {"any": "cmovl x:rv, rv/mv" , "op": "[RM] 0F 4C /r" , "io": "SF=R OF=R"},
+ {"any": "cmovle x:rv, rv/mv" , "op": "[RM] 0F 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"any": "cmovnb x:rv, rv/mv" , "op": "[RM] 0F 43 /r" , "io": "CF=R"},
+ {"any": "cmovnbe x:rv, rv/mv" , "op": "[RM] 0F 47 /r" , "io": "CF=R ZF=R"},
+ {"any": "cmovnl x:rv, rv/mv" , "op": "[RM] 0F 4D /r" , "io": "SF=R OF=R"},
+ {"any": "cmovnle x:rv, rv/mv" , "op": "[RM] 0F 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"any": "cmovno x:rv, rv/mv" , "op": "[RM] 0F 41 /r" , "io": "OF=R"},
+ {"any": "cmovnp x:rv, rv/mv" , "op": "[RM] 0F 4B /r" , "io": "PF=R"},
+ {"any": "cmovns x:rv, rv/mv" , "op": "[RM] 0F 49 /r" , "io": "SF=R"},
+ {"any": "cmovnz x:rv, rv/mv" , "op": "[RM] 0F 45 /r" , "io": "ZF=R"},
+ {"any": "cmovo x:rv, rv/mv" , "op": "[RM] 0F 40 /r" , "io": "OF=R"},
+ {"any": "cmovp x:rv, rv/mv" , "op": "[RM] 0F 4A /r" , "io": "PF=R"},
+ {"any": "cmovs x:rv, rv/mv" , "op": "[RM] 0F 48 /r" , "io": "SF=R"},
+ {"any": "cmovz x:rv, rv/mv" , "op": "[RM] 0F 44 /r" , "io": "ZF=R"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CMPCCXADD", "instructions": [
+ {"any": "cmpbxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E2 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpbxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E2 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpbexadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E6 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpbexadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E6 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmplxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy EC !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmplxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy EC !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmplexadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy EE !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmplexadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy EE !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnbxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E3 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnbxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E3 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnbexadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E7 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnbexadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E7 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnlxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy ED !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnlxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy ED !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnlexadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy EF !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnlexadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy EF !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnoxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E1 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnoxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E1 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnpxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy EB !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnpxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy EB !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnsxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E9 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnsxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E9 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpnzxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E5 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpnzxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E5 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpoxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E0 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpoxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E0 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmppxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy EA !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmppxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy EA !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpsxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E8 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpsxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E8 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"},
+ {"any": "cmpzxadd X:my, X:ry, R:ry" , "op": "[MRV] VEX.128.66.0F38.Wy E4 !(11):rrr:bbb" , "io": "CF=W OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "cmpzxadd X:my, X:ry, R:ry" , "op": "[MRV] EVEX.128.66.0F38.Wy E4 !(11):rrr:bbb", "io": "OF=W SD=W ZF=W AF=W PF=W CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CMPXCHG8B", "instructions": [
+ {"any": "[lock|xacqrel] cmpxchg8b X:m64,X:<edx>,X:<eax>,<ecx>,<ebx>" , "op": "[OP] 0F C7 /1" , "io": "ZF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CMPXCHG16B", "instructions": [
+ {"any": "[lock|xacqrel] cmpxchg16b X:m128,X:<rdx>,X:<rax>,<rcx>,<rbx>","op": "[OP] REX.W 0F C7 /1" , "io": "ZF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "FSGSBASE", "volatile": true, "instructions": [
+ {"x64": "rdfsbase W:ry" , "op": "[M ] F3 0F AE /0"},
+ {"x64": "rdgsbase W:ry" , "op": "[M ] F3 0F AE /1"},
+ {"x64": "wrfsbase R:ry" , "op": "[M ] F3 0F AE /2"},
+ {"x64": "wrgsbase R:ry" , "op": "[M ] F3 0F AE /3"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "FXSR", "volatile": true, "instructions": [
+ {"any": "fxrstor R:mem" , "op": "[M ] 0F AE /1" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fxrstor64 R:mem" , "op": "[M ] REX.W 0F AE /1" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fxsave W:mem" , "op": "[M ] 0F AE /0" , "io": "C0=R C1=R C2=R C3=R"},
+ {"any": "fxsave64 W:mem" , "op": "[M ] REX.W 0F AE /0" , "io": "C0=R C1=R C2=R C3=R"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LAHFSAHF", "instructions": [
+ {"any": "lahf w:<ah>" , "op": "[OP] 9F" , "io": "SF=R ZF=R AF=R PF=R CF=R"},
+ {"any": "sahf R:<ah>" , "op": "[OP] 9E" , "io": "SF=W ZF=W AF=W PF=W CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LWP", "volatile": true, "instructions": [
+ {"any": "llwpcb R:r32" , "op": "[M ] XOP.L0.P0.MAP9.W0 12 /0"},
+ {"any": "llwpcb R:r64" , "op": "[M ] XOP.L0.P0.MAP9.W1 12 /0"},
+ {"any": "lwpins R:r32, R:r32/m32, imm32" , "op": "[VM ] XOP.L0.P0.MAPA.W0 12 /0 id"},
+ {"any": "lwpins R:r64, R:r32/m32, imm32" , "op": "[VM ] XOP.L0.P0.MAPA.W1 12 /0 id"},
+ {"any": "lwpval R:r32, R:r32/m32, imm32" , "op": "[VM ] XOP.L0.P0.MAPA.W0 12 /1 id"},
+ {"any": "lwpval R:r64, R:r32/m32, imm32" , "op": "[VM ] XOP.L0.P0.MAPA.W1 12 /1 id"},
+ {"any": "slwpcb W:r32" , "op": "[M ] XOP.L0.P0.MAP9.W0 12 /1"},
+ {"any": "slwpcb W:r64" , "op": "[M ] XOP.L0.P0.MAP9.W1 12 /1"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "LZCNT", "instructions": [
+ {"any": "lzcnt w:rv, rv/mv" , "op": "[RM] F3 0F BD /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"},
+ {"apx": "lzcnt{nf} w:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F5 /r" , "io": "OF=U SF=U ZF=W AF=U PF=U CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MONITORX", "volatile": true, "instructions": [
+ {"any": "monitorx R:<mem(ds:zax)>, R:<ecx>, R:<edx>" , "op": "0F 01 FA"},
+ {"any": "mwaitx R:<eax>, R:<ecx>, R:<ebx>" , "op": "0F 01 FB"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MCOMMIT", "instructions": [
+ {"any": "mcommit" , "op": "F3 0F 01 FA" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MOVBE", "instructions": [
+ {"any": "movbe w:rv, R:mv" , "op": "[RM] 0F 38 F0 /r"},
+ {"any": "movbe W:mv, R:rv" , "op": "[MR] 0F 38 F1 /r"},
+ {"apx": "movbe w:rv, R:rv/mv" , "op": "[RM] EVEX.ND=0.LLZ.Pv.MAP4.Wv 60 /r"},
+ {"apx": "movbe w:rv/mv, R:rv" , "op": "[MR] EVEX.ND=0.LLZ.Pv.MAP4.Wv 61 /r"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MOVDIRI", "instructions": [
+ {"any": "movdiri W:my, R:ry" , "op": "[MR] 0F 38 F9 /r"},
+ {"apx": "movdiri W:my, R:ry" , "op": "[MR] EVEX.ND=0.LLZ.NP.MAP4.W0 F9 !(11):rrr:bbb"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MOVDIR64B", "instructions": [
+ {"any": "movdir64b W:m512(es:r32), m512" , "op": "[RM] 66 0F 38 F8 /r"},
+ {"any": "movdir64b W:m512(es:r64), m512" , "op": "[RM] 66 0F 38 F8 /r"},
+ {"apx": "movdir64b W:m512(es:r64), R:m512" , "op": "[RM] EVEX.LLZ.66.MAP4.W0 F8 !(11):rrr:bbb"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MOVRS", "instructions": [
+ {"x64": "movrs W:r8, R:m8" , "op": "[RM] NOREP 0F 38 8A !(11):rrr:bbb"},
+ {"x64": "movrs W:rv, R:mv" , "op": "[RM] NOREP 0F 38 8B !(11):rrr:bbb"},
+ {"any": "prefetchrst2 R:mem" , "op": "[M ] 0F 18 !(11):100:bbb"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PCONFIG", "volatile": true, "instructions": [
+ {"any": "pconfig" , "op": "[OP] NP 0F 01 C5"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "POPCNT", "instructions": [
+ {"any": "popcnt w:rv, rv/mv" , "op": "[RM] F3 0F B8 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"apx": "popcnt{nf} w:rv, R:rv/mv" , "op": "[RM] EVEX.ND=0.LLZ.Pv.MAP4.Wv 88 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "OSPKE", "instructions": [
+ {"any": "rdpkru W:<edx>, W:<eax>, R:<ecx>" , "op": "[OP] 0F 01 EE"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PREFETCHI", "volatile": true, "instructions": [
+ {"x64": "prefetchit0 R:mem" , "op": "[M ] 0F 18 /7"},
+ {"x64": "prefetchit1 R:mem" , "op": "[M ] 0F 18 /6"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PREFETCHW", "volatile": true, "instructions": [
+ {"any": "prefetchw R:mem" , "op": "[M ] 0F 0D /1" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PREFETCHWT1", "volatile": true, "instructions": [
+ {"any": "prefetchwt1 R:mem" , "op": "[M ] 0F 0D /2" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "PTWRITE", "volatile": true, "instructions": [
+ {"any": "ptwrite R:r32/m32" , "op": "[M ] F3 0F AE /4"},
+ {"any": "ptwrite R:r64/m64" , "op": "[M ] F3 REX.W 0F AE /4"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RAO_INT", "volatile": true, "instructions": [
+ {"any": "aadd X:my, R:ry" , "op": "[MR] NP 0F 38 FC !(11):rrr:bbb"},
+ {"apx": "aadd X:my, R:ry" , "op": "[MR] EVEX.ND=0.LLZ.NP.MAP4.Wy FC !(11):rrr:bbb"},
+ {"any": "aand X:my, R:ry" , "op": "[MR] 66 0F 38 FC !(11):rrr:bbb"},
+ {"apx": "aand X:my, R:ry" , "op": "[MR] EVEX.ND=0.LLZ.66.MAP4.Wy FC !(11):rrr:bbb"},
+ {"any": "aor X:my, R:ry" , "op": "[MR] F2 0F 38 FC !(11):rrr:bbb"},
+ {"apx": "aor X:my, R:ry" , "op": "[MR] EVEX.ND=0.LLZ.F2.MAP4.Wy FC !(11):rrr:bbb"},
+ {"any": "axor X:my, R:ry" , "op": "[MR] F3 0F 38 FC !(11):rrr:bbb"},
+ {"apx": "axor X:my, R:ry" , "op": "[MR] EVEX.ND=0.LLZ.F3.MAP4.Wy FC !(11):rrr:bbb"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RDPID", "instructions": [
+ {"x86": "rdpid W:r32" , "op": "[R ] F3 0F C7 /7"},
+ {"x64": "rdpid W:r64" , "op": "[R ] F3 0F C7 /7"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RDPRU", "instructions": [
+ {"any": "rdpru W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 01 FD"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RDRAND", "instructions": [
+ {"any": "rdrand w:rv" , "op": "NFx 0F C7 /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RDSEED", "instructions": [
+ {"any": "rdseed w:rv" , "op": "NFx 0F C7 /7" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RDTSC", "instructions": [
+ {"any": "rdtsc W:<edx>, W:<eax>" , "op": "0F 31"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RDTSCP", "instructions": [
+ {"any": "rdtscp W:<edx>, W:<eax>, W:<ecx>" , "op": "0F 01 F9"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "RTM", "deprecated": true, "volatile": true, "instructions": [
+ {"any": "xabort imm8" , "op": "C6 /7 ib"},
+ {"any": "xbegin rel16" , "op": "66 C7 /7 cw"},
+ {"any": "xbegin rel32" , "op": "C7 /7 cd"},
+ {"any": "xend" , "op": "0F 01 D5"},
+ {"any": "xtest" , "op": "0F 01 D6" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SERIALIZE", "volatile": true, "instructions": [
+ {"any": "serialize" , "op": "0F 01 E8"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SSE", "volatile": true, "instructions": [
+ {"any": "prefetchnta R:mem" , "op": "[M ] 0F 18 /0"},
+ {"any": "prefetcht0 R:mem" , "op": "[M ] 0F 18 /1"},
+ {"any": "prefetcht1 R:mem" , "op": "[M ] 0F 18 /2"},
+ {"any": "prefetcht2 R:mem" , "op": "[M ] 0F 18 /3"},
+ {"any": "sfence" , "op": "[OP] NP 0F AE F8"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SSE2", "volatile": true, "instructions": [
+ {"any": "lfence" , "op": "[OP] NP 0F AE E8"},
+ {"any": "mfence" , "op": "[OP] NP 0F AE F0"},
+ {"any": "movnti W:my, ry" , "op": "[MR] NP 0F C3 /r"}
+ ]},
+
+ {"category": "GP GP_EXT CRYPTO_HASH", "ext": "SSE4_2", "instructions": [
+ {"any": "crc32 X:r32, R:r8/m8" , "op": "[RM] F2 0F 38 F0 /r"},
+ {"any": "crc32 X:r32, R:r16/m16" , "op": "[RM] 66 F2 0F 38 F1 /r"},
+ {"any": "crc32 X:r32, R:r32/m32" , "op": "[RM] F2 0F 38 F1 /r"},
+ {"any": "crc32 X:r64, R:r8/m8" , "op": "[RM] F2 REX.W 0F 38 F0 /r"},
+ {"any": "crc32 X:r64, R:r64/m64" , "op": "[RM] F2 REX.W 0F 38 F1 /r"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "TSE", "volatile": true, "instructions": [
+ {"x64": "pbndkb W:<rax>, R:<mem(ds:rbx)>, W:<mem(ds:rcx)>" , "op": "NP 0F 01 C7" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "TSXLDTRK", "volatile": true, "instructions": [
+ {"any": "xresldtrk" , "op": "F2 0F 01 E9"},
+ {"any": "xsusldtrk" , "op": "F2 0F 01 E8"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "UINTR", "volatile": true, "instructions": [
+ {"x64": "uiret" , "op": "F3 0F 01 EC"},
+ {"x64": "clui" , "op": "F3 0F 01 EE"},
+ {"x64": "stui" , "op": "F3 0F 01 EF"},
+ {"x64": "testui" , "op": "F3 0F 01 ED" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
+ {"x64": "senduipi R:r64" , "op": "[R ] F3 0F C7 /6"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "WAITPKG", "volatile": true, "instructions": [
+ {"any": "tpause R:r32, <edx>, <eax>" , "op": "66 0F AE /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
+ {"x86": "umonitor R:mem(ds:r32)" , "op": "F3 0F AE /6"},
+ {"x64": "umonitor R:mem(ds:r64)" , "op": "F3 0F AE /6"},
+ {"any": "umwait R:r32, <edx>, <eax>" , "op": "F2 0F AE /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "XSAVE", "volatile": true, "instructions": [
+ {"any": "xgetbv W:<edx>, W:<eax>, R:<ecx>" , "op": "NP 0F 01 D0" , "io": "XCR=R"},
+ {"any": "xrstor R:mem, <edx>, <eax>" , "op": "NP 0F AE /5" , "io": "XCR=R"},
+ {"any": "xrstor64 R:mem, <edx>, <eax>" , "op": "NP REX.W 0F AE /5" , "io": "XCR=R"},
+ {"any": "xsave W:mem, <edx>, <eax>" , "op": "NP 0F AE /4" , "io": "XCR=R"},
+ {"any": "xsave64 W:mem, <edx>, <eax>" , "op": "NP REX.W 0F AE /4" , "io": "XCR=R"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "XSAVEC", "volatile": true, "instructions": [
+ {"any": "xsavec W:mem, <edx>, <eax>" , "op": "NP 0F C7 /4" , "io": "XCR=R"},
+ {"any": "xsavec64 W:mem, <edx>, <eax>" , "op": "NP REX.W 0F C7 /4" , "io": "XCR=R"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "XSAVEOPT", "volatile": true, "instructions": [
+ {"any": "xsaveopt W:mem, <edx>, <eax>" , "op": "NP 0F AE /6" , "io": "XCR=R"},
+ {"any": "xsaveopt64 W:mem, <edx>, <eax>" , "op": "NP REX.W 0F AE /6" , "io": "XCR=R"}
+ ]},
+
+ {"category": "GP", "volatile": true, "instructions": [
+ {"any": "cli" , "op": "FA" , "io": "IF=W"},
+ {"any": "int imm8" , "op": "CD ib"},
+ {"any": "int3" , "op": "CC"},
+ {"any": "lar w:r16, R:r16/m16" , "op": "[RM] 66 0F 02 /r" , "io": "ZF=W"},
+ {"any": "lar W:r32, R:r32/m16" , "op": "[RM] 0F 02 /r" , "io": "ZF=W"},
+ {"x86": "lds x:r16, m16_16" , "op": "[RM] 66 C5 /r"},
+ {"x86": "lds X:r32, m16_32" , "op": "[RM] C5 /r"},
+ {"x86": "les x:r16, m16_16" , "op": "[RM] 66 C4 /r"},
+ {"x86": "les X:r32, m16_32" , "op": "[RM] C4 /r"},
+ {"any": "lfs x:r16, m16_16" , "op": "[RM] 66 0F B4 /r"},
+ {"any": "lfs X:r32, m16_32" , "op": "[RM] 0F B4 /r"},
+ {"x64": "lfs X:r64, m16_64" , "op": "[RM] REX.W 0F B4 /r"},
+ {"any": "lgs x:r16, m16_16" , "op": "[RM] 66 0F B5 /r"},
+ {"any": "lgs X:r32, m16_32" , "op": "[RM] 0F B5 /r"},
+ {"x64": "lgs X:r64, m16_64" , "op": "[RM] REX.W 0F B5 /r"},
+ {"any": "lsl w:r16, R:r16/m16" , "op": "[RM] 66 0F 03 /r" , "io": "ZF=W"},
+ {"any": "lsl W:r32, R:r32/m16" , "op": "[RM] 0F 03 /r" , "io": "ZF=W"},
+ {"x64": "lsl W:r64, R:r32/m16" , "op": "[RM] REX.W 0F 03 /r" , "io": "ZF=W"},
+ {"any": "lss x:r16, m16_16" , "op": "[RM] 66 0F B2 /r"},
+ {"any": "lss X:r32, m16_32" , "op": "[RM] 0F B2 /r"},
+ {"x64": "lss X:r64, m16_64" , "op": "[RM] REX.W 0F B2 /r"},
+ {"any": "pause" , "op": "F3 90"},
+ {"x86": "rsm" , "op": "0F AA" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "sgdt W:mem" , "op": "0F 01 /0"},
+ {"any": "sidt W:mem" , "op": "0F 01 /1"},
+ {"any": "sldt w:r16/m16" , "op": "66 0F 00 /0"},
+ {"any": "sldt W:r32/m16" , "op": "0F 00 /0"},
+ {"x64": "sldt W:r64/m16" , "op": "REX.W 0F 00 /0"},
+ {"any": "smsw w:r16/m16" , "op": "66 0F 01 /4"},
+ {"any": "smsw W:r32/m16" , "op": "0F 01 /4"},
+ {"x64": "smsw W:r64/m16" , "op": "REX.W 0F 01 /4"},
+ {"any": "sti" , "op": "FB" , "io": "IF=1"},
+ {"any": "str w:r16/m16" , "op": "66 0F 00 /1"},
+ {"any": "str W:r32/m16" , "op": "0F 00 /1"},
+ {"any": "str W:r64/m16" , "op": "REX.W 0F 00 /1"},
+ {"x64": "syscall" , "op": "0F 05"},
+ {"any": "sysenter" , "op": "0F 34"},
+ {"any": "verr R:r16/m16" , "op": "0F 00 /4" , "io": "ZF=W"},
+ {"any": "verw R:r16/m16" , "op": "0F 00 /5" , "io": "ZF=W"},
+ {"any": "xlatb" , "op": "D7"}
+ ]},
+
+ {"category": "GP", "deprecated": true, "instructions": [
+ {"x86": "aaa x:<ax>" , "op": "37" , "io": "OF=U SF=U ZF=U AF=W PF=U CF=W"},
+ {"x86": "aad x:<ax>, imm8" , "op": "D5 ib" , "io": "OF=U SF=W ZF=W AF=U PF=W CF=U"},
+ {"x86": "aam x:<ax>, imm8" , "op": "D4 ib" , "io": "OF=U SF=W ZF=W AF=U PF=W CF=U"},
+ {"x86": "aas x:<ax>" , "op": "3F" , "io": "OF=U SF=U ZF=U AF=W PF=U CF=W"},
+ {"x86": "arpl x:r16/m16, R:r16" , "op": "[MR] 63 /r" , "io": "ZF=W"},
+ {"x86": "bound R:r16, R:m32" , "op": "[RM] 66 62 /r"},
+ {"x86": "bound R:r32, R:m64" , "op": "[RM] 62 /r"},
+ {"x86": "daa x:<ax>" , "op": "27" , "io": "OF=U SF=W ZF=W AF=W PF=W CF=W"},
+ {"x86": "das x:<ax>" , "op": "2F" , "io": "OF=U SF=W ZF=W AF=W PF=W CF=W"},
+ {"x86": "into" , "op": "CE" , "io": "OF=R"},
+ {"x86": "popa" , "op": "66 61"},
+ {"x86": "popad" , "op": "61"},
+ {"x86": "pusha" , "op": "66 60"},
+ {"x86": "pushad" , "op": "60"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MPX", "deprecated": true, "instructions": [
+ {"x86": "bndcl R:bnd, r32/m32" , "op": "[RM] F3 0F 1A /r"},
+ {"x64": "bndcl R:bnd, r64/m64" , "op": "[RM] F3 0F 1A /r"},
+ {"x86": "bndcn R:bnd, r32/m32" , "op": "[RM] F2 0F 1B /r"},
+ {"x64": "bndcn R:bnd, r64/m64" , "op": "[RM] F2 0F 1B /r"},
+ {"x86": "bndcu R:bnd, r32/m32" , "op": "[RM] F2 0F 1A /r"},
+ {"x64": "bndcu R:bnd, r64/m64" , "op": "[RM] F2 0F 1A /r"},
+ {"any": "bndldx W:bnd, mib" , "op": "[RM] 0F 1A /r"},
+ {"any": "bndmk W:bnd, mem" , "op": "[RM] F3 0F 1B /r"},
+ {"any": "bndmov W:bnd, bnd/mem" , "op": "[RM] 66 0F 1A /r"},
+ {"any": "bndmov W:bnd/mem, bnd" , "op": "[MR] 66 0F 1B /r"},
+ {"any": "bndstx W:mib, bnd" , "op": "[MR] 0F 1B /r"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "TBM", "deprecated": true, "instructions": [
+ {"any": "blci W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 02 /6"},
+ {"any": "blcic W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /5"},
+ {"any": "blsic W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /6"},
+ {"any": "blcfill W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /1"},
+ {"any": "blsfill W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /2"},
+ {"any": "blcmsk W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 02 /1"},
+ {"any": "blcs W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /3"},
+ {"any": "tzmsk W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /4"},
+ {"any": "t1mskc W:ry, ry/my" , "op": "[VM ] XOP.LZ.MAP9.Wy 01 /7"}
+ ]},
+
+ {"category": "GP", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "clts" , "op": "0F 06"},
+ {"any": "hlt" , "op": "F4"},
+ {"any": "lgdt R:mem" , "op": "0F 01 /2"},
+ {"any": "lidt R:mem" , "op": "0F 01 /3"},
+ {"any": "lldt R:r16/m16" , "op": "0F 00 /2"},
+ {"any": "lmsw R:r16/m16" , "op": "0F 01 /6"},
+ {"any": "ltr R:r16/m16" , "op": "0F 00 /3"},
+ {"any": "rdpmc W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 33"},
+ {"x64": "swapgs" , "op": "0F 01 F8"},
+ {"any": "sysexit" , "op": "0F 35"},
+ {"any": "sysexitq" , "op": "REX.W 0F 35"},
+ {"x64": "sysret" , "op": "0F 07"},
+ {"x64": "sysretq" , "op": "REX.W 0F 07"}
+ ]},
+
+ {"category": "GP", "ext": "I486", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "invd" , "op": "[OP] 0F 08"},
+ {"any": "invlpg R:mem" , "op": "[M ] 0F 01 /7"},
+ {"x86": "invpcid R:r32, R:m128" , "op": "[RM] 66 0F 38 82 /r"},
+ {"x64": "invpcid R:r64, R:m128" , "op": "[RM] 66 0F 38 82 /r"},
+ {"apx": "invpcid R:r64, R:m128" , "op": "[RM] EVEX.ND=0.LLZ.F3.MAP4.WIG F2 !(11):rrr:bbb"},
+ {"any": "wbinvd" , "op": "[OP] 0F 09"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CET_IBT", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "endbr32" , "op": "F3 0F 1E FB"},
+ {"any": "endbr64" , "op": "F3 0F 1E FA"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "CET_SS", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "clrssbsy R:m64" , "op": "F3 0F AE /6" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=W"},
+ {"any": "setssbsy" , "op": "F3 0F 01 E8"},
+ {"any": "wrssd W:m32, R:r32" , "op": "[MR] 0F 38 F6 !(11):rrr:bbb"},
+ {"apx": "wrssd W:m32, R:r32" , "op": "[MR] EVEX.ND=0.LLZ.NP.MAP4.W0 66 !(11):rrr:bbb"},
+ {"x64": "wrssq W:m64, R:r64" , "op": "[MR] REX.W 0F 38 F6 !(11):rrr:bbb"},
+ {"apx": "wrssq W:m64, R:r64" , "op": "[MR] EVEX.ND=0.LLZ.NP.MAP4.W1 66 !(11):rrr:bbb"},
+ {"any": "wrussd W:m32, R:r32" , "op": "[MR] 66 0F 38 F5 !(11):rrr:bbb"},
+ {"apx": "wrussd W:m32, R:r32" , "op": "[MR] EVEX.ND=0.LLZ.66.MAP4.W0 65 !(11):rrr:bbb"},
+ {"x64": "wrussq W:m64, R:r64" , "op": "[MR] REX.W 66 0F 38 F5 !(11):rrr:bbb"},
+ {"apx": "wrussq W:m64, R:r64" , "op": "[MR] EVEX.ND=0.LLZ.66.MAP4.W1 65 !(11):rrr:bbb"}
+
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "HRESET", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "hreset imm8, W:<eax>" , "op": "F3 0F 3A F0 /0 ib"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MONITOR", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "monitor R:<mem(ds:zax)>, R:<ecx>, R:<edx>" , "op": "0F 01 C8"},
+ {"any": "mwait R:<eax>, R:<ecx>" , "op": "0F 01 C9"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MSR", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "rdmsr W:<edx>, W:<eax>, R:<ecx>" , "op": "0F 32" , "io": "MSR=R"},
+ {"any": "wrmsr R:<edx>, R:<eax>, R:<ecx>" , "op": "0F 30" , "io": "MSR=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MSR_IMM", "volatile": true, "privilege": "L0", "instructions": [
+ {"x64": "rdmsr W:r64, R:imm32" , "op": "[M ] VEX.128.F2.MAP7.W0 F6 11:000:bbb id" , "io": "MSR=R"},
+ {"apx": "rdmsr W:r64, R:imm32" , "op": "[M ] EVEX.128.F2.MAP7.W0 F6 11:000:bbb id", "io": "MSR=R"},
+ {"x64": "wrmsrns imm32, R:r64" , "op": "[M ] VEX.128.F3.MAP7.W0 F6 11:000:bbb id" , "io": "MSR=W"},
+ {"apx": "wrmsrns imm32, R:r64" , "op": "[M ] EVEX.128.F3.MAP7.W0 F6 11:000:bbb id", "io": "MSR=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "MSRLIST", "volatile": true, "privilege": "L0", "instructions": [
+ {"x64": "rdmsrlist R:<mem(ds:rsi)>, W:<mem(ds:rdi)>, X:<rcx>" , "op": "[OP] F2 0F 01 C6" , "io": "MSR=R"},
+ {"x64": "wrmsrlist R:<mem(ds:rsi)>, R:<mem(ds:rdi)>, X:<rcx>" , "op": "[OP] F3 0F 01 C6" , "io": "MSR=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "SMX", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "getsec W:<eax>, R:<ebx>" , "op": "[OP] NP 0F 37"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "WBNOINVD", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "wbnoinvd" , "op": "[OP] F3 0F 09"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "WRMSRNS", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "wrmsrns R:<edx>, R:<eax>, R:<ecx>" , "op": "[OP] NP 0F 01 C6" , "io": "MSR=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "XSAVE", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "xsetbv R:<edx>, R:<eax>, R:<ecx>" , "op": "[OP] NP 0F 01 D1" , "io": "XCR=W"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "XSAVES", "volatile": true, "privilege": "L0", "instructions": [
+ {"any": "xrstors R:mem, <edx>, <eax>" , "op": "[M ] NP 0F C7 /3" , "io": "XCR=R"},
+ {"any": "xrstors64 R:mem, <edx>, <eax>" , "op": "[M ] NP REX.W 0F C7 /3" , "io": "XCR=R"},
+ {"any": "xsaves W:mem, <edx>, <eax>" , "op": "[M ] NP 0F C7 /5" , "io": "XCR=R"},
+ {"any": "xsaves64 W:mem, <edx>, <eax>" , "op": "[M ] NP REX.W 0F C7 /5" , "io": "XCR=R"}
+ ]},
+
+ {"category": "VIRTUALIZATION", "ext": "SMAP", "volatile": true, "instructions": [
+ {"any": "clac" , "op": "[OP] NP 0F 01 CA" , "ext": "SMAP" , "privilege": "L0", "io": "AC=0"},
+ {"any": "stac" , "op": "[OP] NP 0F 01 CB" , "ext": "SMAP" , "privilege": "L0", "io": "AC=1"}
+ ]},
+
+ {"category": "VIRTUALIZATION", "ext": "VMX", "volatile": true, "instructions": [
+ {"x86": "invept R:r32, R:m128" , "op": "[RM] 66 0F 38 80 /r" , "privilege": "L0"},
+ {"x64": "invept R:r64, R:m128" , "op": "[RM] 66 0F 38 80 /r" , "privilege": "L0"},
+ {"apx": "invept R:r64, R:m128" , "op": "[RM] EVEX.ND=0.LLZ.F3.MAP4.WIG F0 !(11):rrr:bbb" , "privilege": "L0"},
+ {"x86": "invvpid R:r32, R:m128" , "op": "[RM] 66 0F 38 81 /r" , "privilege": "L0"},
+ {"x64": "invvpid R:r64, R:m128" , "op": "[RM] 66 0F 38 81 /r" , "privilege": "L0"},
+ {"apx": "invvpid R:r64, R:m128" , "op": "[RM] EVEX.ND=0.LLZ.F3.MAP4.WIG F1 !(11):rrr:bbb" , "privilege": "L0"},
+ {"any": "vmcall" , "op": "[OP] 0F 01 C1" , "privilege": "L0"},
+ {"any": "vmclear R:m64" , "op": "[M ] 66 0F C7 /6" , "privilege": "L0"},
+ {"any": "vmfunc" , "op": "[OP] NP 0F 01 D4" , "privilege": "L0"},
+ {"any": "vmlaunch" , "op": "[OP] 0F 01 C2" , "privilege": "L0"},
+ {"any": "vmptrld R:m64" , "op": "[M ] NP 0F C7 /6" , "privilege": "L0"},
+ {"any": "vmptrst W:m64" , "op": "[M ] NP 0F C7 /7" , "privilege": "L0"},
+ {"x86": "vmread W:r32/m32, R:r32" , "op": "[MR] NP 0F 78 /r" , "privilege": "L0"},
+ {"x64": "vmread W:r64/m64, R:r64" , "op": "[MR] NP 0F 78 /r" , "privilege": "L0"},
+ {"any": "vmresume" , "op": "[OP] 0F 01 C3" , "privilege": "L0"},
+ {"x86": "vmwrite R:r32, R:r32/m32" , "op": "[RM] NP 0F 79 /r" , "privilege": "L0"},
+ {"x64": "vmwrite R:r64, R:r64/m64" , "op": "[RM] NP 0F 79 /r" , "privilege": "L0"},
+ {"any": "vmxoff" , "op": "[OP] 0F 01 C4" , "privilege": "L0"},
+ {"any": "vmxon R:m64" , "op": "[M ] F3 0F C7 /6" , "privilege": "L0"}
+ ]},
+
+ {"category": "VIRTUALIZATION", "ext": "SEAM", "volatile": true, "instructions": [
+ {"any": "seamcall" , "op": "[OP] 66 0F 01 CF" , "ext": "SEAM"},
+ {"any": "seamops" , "op": "[OP] 66 0F 01 CE" , "ext": "SEAM"},
+ {"any": "seamret" , "op": "[OP] 66 0F 01 CD" , "ext": "SEAM"},
+ {"any": "tdcall" , "op": "[OP] 66 0F 01 CC" , "ext": "SEAM"}
+ ]},
+
+ {"category": "VIRTUALIZATION", "ext": "ENQCMD", "volatile": true, "instructions": [
+ {"x86": "enqcmd W:m512(es:r32), m512" , "op": "[RM] F2 0F 38 F8 !(11):rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"x64": "enqcmd W:m512(es:r64), m512" , "op": "[RM] F2 0F 38 F8 !(11):rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"apx": "enqcmd W:m512(es:r64), R:m512" , "op": "[RM] EVEX.ND=0.LLZ.F2.MAP4.W? F8 !(11):rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"x86": "enqcmds W:m512(es:r32), m512" , "op": "[RM] F3 0F 38 F8 !(11):rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"x64": "enqcmds W:m512(es:r64), m512" , "op": "[RM] F3 0F 38 F8 !(11):rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"apx": "enqcmds W:m512(es:r64), R:m512" , "op": "[RM] EVEX.ND=0.LLZ.F3.MAP4.W? F8 !(11):rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
+ ]},
+
+
+ {"category": "VIRTUALIZATION", "volatile": true, "instructions": [
+ {"any": "clgi" , "op": "0F 01 DD" , "ext": "SVM" , "privilege": "L0"},
+ {"x86": "invlpga R:<eax>, R:<ecx>" , "op": "0F 01 DF" , "ext": "SVM" , "privilege": "L0"},
+ {"x64": "invlpga R:<eax>, R:<ecx>" , "op": "67 0F 01 DF" , "ext": "SVM" , "privilege": "L0"},
+ {"x64": "invlpga R:<rax>, R:<ecx>" , "op": "0F 01 DF" , "ext": "SVM" , "privilege": "L0"},
+ {"x86": "invlpgb R:<eax>, R:<edx>, R:<ecx>" , "op": "0F 01 FE" , "ext": "INVLPGB" , "privilege": "L0"},
+ {"x64": "invlpgb R:<eax>, R:<edx>, R:<ecx>" , "op": "67 0F 01 FE" , "ext": "INVLPGB" , "privilege": "L0"},
+ {"x64": "invlpgb R:<rax>, R:<edx>, R:<ecx>" , "op": "0F 01 FE" , "ext": "INVLPGB" , "privilege": "L0"},
+ {"x64": "psmash" , "op": "F3 0F 01 FF" , "ext": "SEV_SNP" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "pvalidate" , "op": "F2 0F 01 FF" , "ext": "SEV_SNP" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"x64": "rmpadjust" , "op": "F3 0F 01 FE" , "ext": "SEV_SNP" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"x64": "rmpquery R:<rax>, W:<rcx>, W:<rdx>" , "op": "F3 0F 01 FD" , "ext": "RMPQUERY", "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"x64": "rmpupdate" , "op": "F2 0F 01 FE" , "ext": "SEV_SNP" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "skinit X:<eax>" , "op": "0F 01 DE" , "ext": "SKINIT"},
+ {"any": "stgi" , "op": "0F 01 DC" , "ext": "SKINIT"},
+ {"any": "tlbsync" , "op": "0F 01 FF" , "ext": "INVLPGB" , "privilege": "L0"},
+ {"any": "vmgexit" , "op": "F2 0F 01 D9" , "ext": "SEV_ES"},
+ {"x86": "vmload R:<eax>" , "op": "0F 01 DA" , "ext": "SVM" , "privilege": "L0"},
+ {"x64": "vmload R:<rax>" , "op": "0F 01 DA" , "ext": "SVM" , "privilege": "L0"},
+ {"any": "vmmcall" , "op": "0F 01 D9" , "ext": "SVM"},
+ {"x86": "vmrun X:<eax>" , "op": "0F 01 D8" , "ext": "SVM" , "privilege": "L0"},
+ {"x64": "vmrun X:<rax>" , "op": "0F 01 D8" , "ext": "SVM" , "privilege": "L0"},
+ {"x86": "vmsave R:<eax>" , "op": "0F 01 DB" , "ext": "SVM" , "privilege": "L0"},
+ {"x64": "vmsave R:<rax>" , "op": "0F 01 DB" , "ext": "SVM" , "privilege": "L0"}
+ ]},
+
+ {"category": "FPU", "ext": "FPU", "instructions": [
+ {"any": "f2xm1" , "op": "D9 F0" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fabs" , "op": "D9 E1" , "io": "C0=U C1=0 C2=U C3=U"},
+ {"any": "fadd R:m32fp" , "op": "D8 /0" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fadd R:m64fp" , "op": "DC /0" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fadd st(0), st(i)" , "op": "D8 C0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fadd st(i), st(0)" , "op": "DC C0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "faddp" , "op": "DE C1" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "faddp st(i)" , "op": "DE C0+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fbld R:m80dec" , "op": "DF /4" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fbstp W:m80bcd" , "op": "DF /6" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fchs" , "op": "D9 E0" , "io": "C0=U C1=0 C2=U C3=U"},
+ {"any": "fclex" , "op": "9B DB E2" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fcom" , "op": "D8 D1" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fcom R:m32fp" , "op": "D8 /2" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fcom R:m64fp" , "op": "DC /2" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fcom R:st(i)" , "op": "D8 D0+i" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fcomi R:st(i)" , "op": "DB F0+i" , "io": "C1=0 ZF=W PF=W CF=W"},
+ {"any": "fcomip R:st(i)" , "op": "DF F0+i" , "io": "C1=0 ZF=W PF=W CF=W", "fpuStack": "pop"},
+ {"any": "fcomp" , "op": "D8 D9" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop"},
+ {"any": "fcomp R:m32fp" , "op": "D8 /3" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop"},
+ {"any": "fcomp R:m64fp" , "op": "DC /3" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop"},
+ {"any": "fcomp R:st(i)" , "op": "D8 D8+i" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop"},
+ {"any": "fcompp" , "op": "DE D9" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop2x"},
+ {"any": "fcos" , "op": "D9 FF" , "io": "C0=U C1=W C2=W C3=U"},
+ {"any": "fdecstp" , "op": "D9 F6" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "dec"},
+ {"any": "fdiv R:m32fp" , "op": "D8 /6" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdiv R:m64fp" , "op": "DC /6" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdiv st(0), st(i)" , "op": "D8 F0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdiv st(i), st(0)" , "op": "DC F8+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdivp" , "op": "DE F9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fdivp st(i)" , "op": "DE F8+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fdivr R:m32fp" , "op": "D8 /7" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdivr R:m64fp" , "op": "DC /7" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdivr st(0), st(i)" , "op": "D8 F8+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdivr st(i), st(0)" , "op": "DC F0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fdivrp" , "op": "DE F1" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fdivrp st(i)" , "op": "DE F0+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "ffree st(i)" , "op": "DD C0+i" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fiadd R:m16int" , "op": "DE /0" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fiadd R:m32int" , "op": "DA /0" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "ficom R:m16int" , "op": "DE /2" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "ficom R:m32int" , "op": "DA /2" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "ficomp R:m16int" , "op": "DE /3" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "ficomp R:m32int" , "op": "DA /3" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fidiv R:m16int" , "op": "DE /6" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fidiv R:m32int" , "op": "DA /6" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fidivr R:m16int" , "op": "DE /7" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fidivr R:m32int" , "op": "DA /7" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fild R:m16int" , "op": "DF /0" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fild R:m32int" , "op": "DB /0" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fild R:m64int" , "op": "DF /5" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fimul R:m16int" , "op": "DE /1" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fimul R:m32int" , "op": "DA /1" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fincstp" , "op": "D9 F7" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "inc"},
+ {"any": "finit" , "op": "9B DB E3" , "io": "C0=0 C1=0 C2=0 C3=0"},
+ {"any": "fist W:m16int" , "op": "DF /2" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fist W:m32int" , "op": "DB /2" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fistp W:m16int" , "op": "DF /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fistp W:m32int" , "op": "DB /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fistp W:m64int" , "op": "DF /7" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fisub R:m16int" , "op": "DE /4" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fisub R:m32int" , "op": "DA /4" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fisubr R:m16int" , "op": "DE /5" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fisubr R:m32int" , "op": "DA /5" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fld R:m32fp" , "op": "D9 /0" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fld R:m64fp" , "op": "DD /0" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fld R:m80fp" , "op": "DB /5" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fld R:st(i)" , "op": "D9 C0+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fld1" , "op": "D9 E8" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fldcw R:m16" , "op": "D9 /5" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fldenv R:mem" , "op": "D9 /4" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fldl2e" , "op": "D9 EA" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fldl2t" , "op": "D9 E9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fldlg2" , "op": "D9 EC" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fldln2" , "op": "D9 ED" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fldpi" , "op": "D9 EB" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fldz" , "op": "D9 EE" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fmul R:m32fp" , "op": "D8 /1" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fmul R:m64fp" , "op": "DC /1" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fmul st(0), st(i)" , "op": "D8 C8+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fmul st(i), st(0)" , "op": "DC C8+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fmulp" , "op": "DE C9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fmulp st(i)" , "op": "DE C8+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fnclex" , "op": "DB E2" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fninit" , "op": "DB E3" , "io": "C0=0 C1=0 C2=0 C3=0"},
+ {"any": "fnop" , "op": "D9 D0" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fnsave W:mem" , "op": "DD /6" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fnstcw W:m16" , "op": "D9 /7" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fnstenv W:mem" , "op": "D9 /6" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fnstsw w:ax" , "op": "DF E0" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fnstsw W:m16" , "op": "DD /7" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fpatan" , "op": "D9 F3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fprem" , "op": "D9 F8" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fprem1" , "op": "D9 F5" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fptan" , "op": "D9 F2" , "io": "C0=U C1=W C2=W C3=U", "fpuStack": "pop"},
+ {"any": "frndint" , "op": "D9 FC" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "frstor R:mem" , "op": "DD /4" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fsave W:mem" , "op": "9B DD /6" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fscale" , "op": "D9 FD" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsin" , "op": "D9 FE" , "io": "C0=U C1=W C2=W C3=U"},
+ {"any": "fsincos" , "op": "D9 FB" , "io": "C0=U C1=W C2=W C3=U", "fpuStack": "push"},
+ {"any": "fsqrt" , "op": "D9 FE" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fst W:m32fp" , "op": "D9 /2" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fst W:m64fp" , "op": "DD /2" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fst W:st(i)" , "op": "DD D0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fstcw W:m16" , "op": "9B D9 /7" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fstenv W:mem" , "op": "9B D9 /6" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fstp W:m32fp" , "op": "D9 /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fstp W:m64fp" , "op": "DD /3" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fstp W:m80fp" , "op": "DB /7" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fstp W:st(i)" , "op": "DD D8+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fstsw w:ax" , "op": "9B DF E0" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fstsw W:m16" , "op": "9B DD /7" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fsub R:m32fp" , "op": "D8 /4" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsub R:m64fp" , "op": "DC /4" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsub st(0), st(i)" , "op": "D8 E0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsub st(i), st(0)" , "op": "DC E8+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsubp" , "op": "DE E9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fsubp st(i)" , "op": "DE E8+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fsubr R:m32fp" , "op": "D8 /5" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsubr R:m64fp" , "op": "DC /5" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsubr st(0), st(i)" , "op": "D8 E8+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsubr st(i), st(0)" , "op": "DC E0+i" , "io": "C0=U C1=W C2=U C3=U"},
+ {"any": "fsubrp" , "op": "DE E1" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fsubrp st(i)" , "op": "DE E0+i" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "ftst" , "op": "D9 E4" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fucom" , "op": "DD E1" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fucom R:st(i)" , "op": "DD E0+i" , "io": "C0=W C1=0 C2=W C3=W"},
+ {"any": "fucomi R:st(i)" , "op": "DB E8+i" , "io": "C1=0 ZF=W PF=W CF=W"},
+ {"any": "fucomip R:st(i)" , "op": "DF E8+i" , "io": "C1=0 ZF=W PF=W CF=W", "fpuStack": "pop"},
+ {"any": "fucomp" , "op": "DD E9" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop"},
+ {"any": "fucomp R:st(i)" , "op": "DD E8+i" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop"},
+ {"any": "fucompp" , "op": "DA E9" , "io": "C0=W C1=W C2=W C3=W", "fpuStack": "pop2x"},
+ {"any": "fwait" , "op": "9B" , "io": "C0=U C1=U C2=U C3=U"},
+ {"any": "fxam" , "op": "D9 E5" , "io": "C0=W C1=W C2=W C3=W"},
+ {"any": "fxch" , "op": "D9 C9" , "io": "C0=U C1=0 C2=U C3=U"},
+ {"any": "fxch st(i)" , "op": "D9 C8+i" , "io": "C0=U C1=0 C2=U C3=U"},
+ {"any": "fxtract" , "op": "D9 F4" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "push"},
+ {"any": "fyl2x" , "op": "D9 F1" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fyl2xp1" , "op": "D9 F9" , "io": "C0=U C1=W C2=U C3=U", "fpuStack": "pop"}
+ ]},
+
+ {"category": "FPU", "ext": "FPU CMOV", "instructions": [
+ {"any": "fcmovb st(i)" , "op": "DA C0+i" , "io": "C0=U C1=W C2=U C3=U CF=R" },
+ {"any": "fcmovbe st(i)" , "op": "DA D0+i" , "io": "C0=U C1=W C2=U C3=U CF=R ZF=R"},
+ {"any": "fcmove st(i)" , "op": "DA C8+i" , "io": "C0=U C1=W C2=U C3=U ZF=R" },
+ {"any": "fcmovnb st(i)" , "op": "DB C0+i" , "io": "C0=U C1=W C2=U C3=U CF=R" },
+ {"any": "fcmovnbe st(i)" , "op": "DB D0+i" , "io": "C0=U C1=W C2=U C3=U CF=R ZF=R"},
+ {"any": "fcmovne st(i)" , "op": "DB C8+i" , "io": "C0=U C1=W C2=U C3=U ZF=R" },
+ {"any": "fcmovnu st(i)" , "op": "DB D8+i" , "io": "C0=U C1=W C2=U C3=U PF=R" },
+ {"any": "fcmovu st(i)" , "op": "DA D8+i" , "io": "C0=U C1=W C2=U C3=U PF=R" }
+ ]},
+
+ {"category": "FPU", "ext": "FPU SSE3", "instructions": [
+ {"any": "fisttp W:m16int" , "op": "DF /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fisttp W:m32int" , "op": "DB /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop"},
+ {"any": "fisttp W:m64int" , "op": "DD /1" , "io": "C0=U C1=0 C2=U C3=U", "fpuStack": "pop"}
+ ]},
+
+ {"category": "MMX STATE", "deprecated": true, "volatile": true, "instructions": [
+ {"any": "emms" , "op": "[OP] 0F 77" , "ext": "MMX"},
+ {"any": "femms" , "op": "[OP] 0F 0E" , "ext": "3DNOW"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "MMX", "deprecated": true, "instructions": [
+ {"any": "movd W:mm[31:0], R:r32[31:0]/m32" , "op": "[RM] NP 0F 6E /r"},
+ {"any": "movd W:r32[31:0]/m32, R:mm[31:0]" , "op": "[MR] NP 0F 7E /r"},
+ {"any": "movq W:mm, mm/m64" , "op": "[RM] NP 0F 6F /r"},
+ {"x64": "movq W:mm, r64/m64" , "op": "[RM] NP REX.W 0F 6E /r"},
+ {"any": "movq W:mm/m64, mm" , "op": "[MR] NP 0F 7F /r"},
+ {"x64": "movq W:r64/m64, mm" , "op": "[MR] NP REX.W 0F 7E /r"},
+ {"any": "packssdw X:mm, mm/m64" , "op": "[RM] NP 0F 6B /r"},
+ {"any": "packsswb X:mm, mm/m64" , "op": "[RM] NP 0F 63 /r"},
+ {"any": "packuswb X:mm, mm/m64" , "op": "[RM] NP 0F 67 /r"},
+ {"any": "paddb X:~mm, ~mm/m64" , "op": "[RM] NP 0F FC /r"},
+ {"any": "paddd X:~mm, ~mm/m64" , "op": "[RM] NP 0F FE /r"},
+ {"any": "paddsb X:~mm, ~mm/m64" , "op": "[RM] NP 0F EC /r"},
+ {"any": "paddsw X:~mm, ~mm/m64" , "op": "[RM] NP 0F ED /r"},
+ {"any": "paddusb X:~mm, ~mm/m64" , "op": "[RM] NP 0F DC /r"},
+ {"any": "paddusw X:~mm, ~mm/m64" , "op": "[RM] NP 0F DD /r"},
+ {"any": "paddw X:~mm, ~mm/m64" , "op": "[RM] NP 0F FD /r"},
+ {"any": "pand X:~mm, ~mm/m64" , "op": "[RM] NP 0F DB /r"},
+ {"any": "pandn X:mm, mm/m64" , "op": "[RM] NP 0F DF /r"},
+ {"any": "pcmpeqb X:~mm, ~mm/m64" , "op": "[RM] NP 0F 74 /r"},
+ {"any": "pcmpeqd X:~mm, ~mm/m64" , "op": "[RM] NP 0F 76 /r"},
+ {"any": "pcmpeqw X:~mm, ~mm/m64" , "op": "[RM] NP 0F 75 /r"},
+ {"any": "pcmpgtb X:mm, mm/m64" , "op": "[RM] NP 0F 64 /r"},
+ {"any": "pcmpgtd X:mm, mm/m64" , "op": "[RM] NP 0F 66 /r"},
+ {"any": "pcmpgtw X:mm, mm/m64" , "op": "[RM] NP 0F 65 /r"},
+ {"any": "pmaddwd X:~mm, ~mm/m64" , "op": "[RM] NP 0F F5 /r"},
+ {"any": "pmulhw X:~mm, ~mm/m64" , "op": "[RM] NP 0F E5 /r"},
+ {"any": "pmullw X:~mm, ~mm/m64" , "op": "[RM] NP 0F D5 /r"},
+ {"any": "por X:~mm, ~mm/m64" , "op": "[RM] NP 0F EB /r"},
+ {"any": "pslld X:mm, mm/m64" , "op": "[RM] NP 0F F2 /r"},
+ {"any": "pslld X:mm, imm8" , "op": "[M ] NP 0F 72 /6 ib"},
+ {"any": "psllq X:mm, mm/m64" , "op": "[RM] NP 0F F3 /r"},
+ {"any": "psllq X:mm, imm8" , "op": "[M ] NP 0F 73 /6 ib"},
+ {"any": "psllw X:mm, mm/m64" , "op": "[RM] NP 0F F1 /r"},
+ {"any": "psllw X:mm, imm8" , "op": "[M ] NP 0F 71 /6 ib"},
+ {"any": "psrad X:mm, mm/m64" , "op": "[RM] NP 0F E2 /r"},
+ {"any": "psrad X:mm, imm8" , "op": "[M ] NP 0F 72 /4 ib"},
+ {"any": "psraw X:mm, mm/m64" , "op": "[RM] NP 0F E1 /r"},
+ {"any": "psraw X:mm, imm8" , "op": "[M ] NP 0F 71 /4 ib"},
+ {"any": "psrld X:mm, mm/m64" , "op": "[RM] NP 0F D2 /r"},
+ {"any": "psrld X:mm, imm8" , "op": "[M ] NP 0F 72 /2 ib"},
+ {"any": "psrlq X:mm, mm/m64" , "op": "[RM] NP 0F D3 /r"},
+ {"any": "psrlq X:mm, imm8" , "op": "[M ] NP 0F 73 /2 ib"},
+ {"any": "psrlw X:mm, mm/m64" , "op": "[RM] NP 0F D1 /r"},
+ {"any": "psrlw X:mm, imm8" , "op": "[M ] NP 0F 71 /2 ib"},
+ {"any": "psubb X:mm, mm/m64" , "op": "[RM] NP 0F F8 /r"},
+ {"any": "psubd X:mm, mm/m64" , "op": "[RM] NP 0F FA /r"},
+ {"any": "psubsb X:mm, mm/m64" , "op": "[RM] NP 0F E8 /r"},
+ {"any": "psubsw X:mm, mm/m64" , "op": "[RM] NP 0F E9 /r"},
+ {"any": "psubusb X:mm, mm/m64" , "op": "[RM] NP 0F D8 /r"},
+ {"any": "psubusw X:mm, mm/m64" , "op": "[RM] NP 0F D9 /r"},
+ {"any": "psubw X:mm, mm/m64" , "op": "[RM] NP 0F F9 /r"},
+ {"any": "punpckhbw X:mm, mm/m64" , "op": "[RM] NP 0F 68 /r"},
+ {"any": "punpckhdq X:mm, mm/m64" , "op": "[RM] NP 0F 6A /r"},
+ {"any": "punpckhwd X:mm, mm/m64" , "op": "[RM] NP 0F 69 /r"},
+ {"any": "punpcklbw X:mm, mm/m32" , "op": "[RM] NP 0F 60 /r"},
+ {"any": "punpckldq X:mm, mm/m32" , "op": "[RM] NP 0F 62 /r"},
+ {"any": "punpcklwd X:mm, mm/m32" , "op": "[RM] NP 0F 61 /r"},
+ {"any": "pxor X:~mm, ~mm/m64" , "op": "[RM] NP 0F EF /r"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "MMX2", "deprecated": true, "instructions": [
+ {"any": "maskmovq R:mm, mm, X:<m64(ds:zdi)>" , "op": "[RM] NP 0F F7 /r"},
+ {"any": "movntq W:m64, mm" , "op": "[MR] NP 0F E7 /r"},
+ {"any": "pavgb X:~mm, ~mm/m64" , "op": "[RM] NP 0F E0 /r"},
+ {"any": "pavgw X:~mm, ~mm/m64" , "op": "[RM] NP 0F E3 /r"},
+ {"any": "pextrw W:r32[15:0], mm, imm8" , "op": "[RM] NP 0F C5 /r ib"},
+ {"any": "pinsrw X:mm, r32[15:0]/m16, imm8" , "op": "[RM] NP 0F C4 /r ib"},
+ {"any": "pmaxsw X:~mm, ~mm/m64" , "op": "[RM] NP 0F EE /r"},
+ {"any": "pmaxub X:~mm, ~mm/m64" , "op": "[RM] NP 0F DE /r"},
+ {"any": "pminsw X:~mm, ~mm/m64" , "op": "[RM] NP 0F EA /r"},
+ {"any": "pminub X:~mm, ~mm/m64" , "op": "[RM] NP 0F DA /r"},
+ {"any": "pmovmskb W:r32[7:0], mm" , "op": "[RM] NP 0F D7 /r"},
+ {"any": "pmulhuw X:~mm, ~mm/m64" , "op": "[RM] NP 0F E4 /r"},
+ {"any": "psadbw X:~mm, ~mm/m64" , "op": "[RM] NP 0F F6 /r"},
+ {"any": "pshufw W:mm, mm/m64, imm8" , "op": "[RM] NP 0F 70 /r ib"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "3DNOW", "deprecated": true, "instructions": [
+ {"any": "pavgusb X:mm, mm/m64" , "op": "[RM] 0F 0F /r BF"},
+ {"any": "pf2id W:mm, mm/m64" , "op": "[RM] 0F 0F /r 1D"},
+ {"any": "pfacc X:mm, mm/m64" , "op": "[RM] 0F 0F /r AE"},
+ {"any": "pfadd X:mm, mm/m64" , "op": "[RM] 0F 0F /r 9E"},
+ {"any": "pfcmpeq X:mm, mm/m64" , "op": "[RM] 0F 0F /r B0"},
+ {"any": "pfcmpge X:mm, mm/m64" , "op": "[RM] 0F 0F /r 90"},
+ {"any": "pfcmpgt X:mm, mm/m64" , "op": "[RM] 0F 0F /r A0"},
+ {"any": "pfmax X:mm, mm/m64" , "op": "[RM] 0F 0F /r A4"},
+ {"any": "pfmin X:mm, mm/m64" , "op": "[RM] 0F 0F /r 94"},
+ {"any": "pfmul X:mm, mm/m64" , "op": "[RM] 0F 0F /r B4"},
+ {"any": "pfrcp W:mm, mm/m64" , "op": "[RM] 0F 0F /r 96"},
+ {"any": "pfrcpit1 X:mm, mm/m64" , "op": "[RM] 0F 0F /r A6"},
+ {"any": "pfrcpit2 X:mm, mm/m64" , "op": "[RM] 0F 0F /r B6"},
+ {"any": "pfrsqit1 W:mm, mm/m64" , "op": "[RM] 0F 0F /r A7"},
+ {"any": "pfrsqrt W:mm, mm/m64" , "op": "[RM] 0F 0F /r 97"},
+ {"any": "pfsub X:mm, mm/m64" , "op": "[RM] 0F 0F /r 9A"},
+ {"any": "pfsubr X:mm, mm/m64" , "op": "[RM] 0F 0F /r AA"},
+ {"any": "pi2fd W:mm, mm/m64" , "op": "[RM] 0F 0F /r 0D"},
+ {"any": "pmulhrw X:mm, mm/m64" , "op": "[RM] 0F 0F /r B7"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "3DNOW2", "deprecated": true, "instructions": [
+ {"any": "pf2iw W:mm, mm/m64" , "op": "[RM] 0F 0F /r 1C"},
+ {"any": "pfnacc X:mm, mm/m64" , "op": "[RM] 0F 0F /r 8A"},
+ {"any": "pfpnacc X:mm, mm/m64" , "op": "[RM] 0F 0F /r 8E"},
+ {"any": "pi2fw W:mm, mm/m64" , "op": "[RM] 0F 0F /r 0C"},
+ {"any": "pswapd W:mm, mm/m64" , "op": "[RM] 0F 0F /r BB"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "GEODE", "deprecated": true, "instructions": [
+ {"any": "pfrcpv X:mm, mm/m64" , "op": "[RM] 0F 0F /r 86"},
+ {"any": "pfrsqrtv X:mm, mm/m64" , "op": "[RM] 0F 0F /r 87"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "SSE", "deprecated": true, "instructions": [
+ {"any": "cvtpi2ps w:xmm[63:0], mm/m64" , "op": "[RM] NP 0F 2A /r"},
+ {"any": "cvtps2pi W:mm, xmm[63:0]/m64" , "op": "[RM] NP 0F 2D /r"},
+ {"any": "cvttps2pi W:mm, xmm[63:0]/m64" , "op": "[RM] NP 0F 2C /r"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "SSE2", "deprecated": true, "instructions": [
+ {"any": "cvtpd2pi W:mm, xmm/m128" , "op": "[RM] 66 0F 2D /r"},
+ {"any": "cvtpi2pd W:xmm, R:mm[63:0]/m64" , "op": "[RM] 66 0F 2A /r"},
+ {"any": "cvttpd2pi W:mm, xmm/m128" , "op": "[RM] 66 0F 2C /r"},
+ {"any": "movdq2q W:mm, xmm[63:0]" , "op": "[RM] F2 0F D6 /r"},
+ {"any": "movq2dq W:xmm[63:0], mm" , "op": "[RM] F3 0F D6 /r"},
+ {"any": "paddq X:~mm, ~mm/m64" , "op": "[RM] NP 0F D4 /r"},
+ {"any": "pmuludq X:~mm, ~mm/m64" , "op": "[RM] NP 0F F4 /r"},
+ {"any": "psubq X:mm, mm/m64" , "op": "[RM] NP 0F FB /r"}
+ ]},
+
+ {"category": "MMX SIMD", "ext": "SSSE3", "deprecated": true, "instructions": [
+ {"any": "pabsb W:mm, mm/m64" , "op": "[RM] NP 0F 38 1C /r"},
+ {"any": "pabsd W:mm, mm/m64" , "op": "[RM] NP 0F 38 1E /r"},
+ {"any": "pabsw W:mm, mm/m64" , "op": "[RM] NP 0F 38 1D /r"},
+ {"any": "palignr X:mm, mm/m64, imm8" , "op": "[RM] NP 0F 3A 0F /r ib"},
+ {"any": "phaddd X:~mm, ~mm/m64" , "op": "[RM] NP 0F 38 02 /r"},
+ {"any": "phaddsw X:~mm, ~mm/m64" , "op": "[RM] NP 0F 38 03 /r"},
+ {"any": "phaddw X:~mm, ~mm/m64" , "op": "[RM] NP 0F 38 01 /r"},
+ {"any": "phsubd X:mm, mm/m64" , "op": "[RM] NP 0F 38 06 /r"},
+ {"any": "phsubsw X:mm, mm/m64" , "op": "[RM] NP 0F 38 07 /r"},
+ {"any": "phsubw X:mm, mm/m64" , "op": "[RM] NP 0F 38 05 /r"},
+ {"any": "pmaddubsw X:~mm, ~mm/m64" , "op": "[RM] NP 0F 38 04 /r"},
+ {"any": "pmulhrsw X:~mm, ~mm/m64" , "op": "[RM] NP 0F 38 0B /r"},
+ {"any": "pshufb X:mm, mm/m64" , "op": "[RM] NP 0F 38 00 /r"},
+ {"any": "psignb X:mm, mm/m64" , "op": "[RM] NP 0F 38 08 /r"},
+ {"any": "psignd X:mm, mm/m64" , "op": "[RM] NP 0F 38 0A /r"},
+ {"any": "psignw X:mm, mm/m64" , "op": "[RM] NP 0F 38 09 /r"}
+ ]},
+
+ {"category": "SSE STATE", "ext": "SSE", "instructions": [
+ {"any": "ldmxcsr R:m32" , "op": "[M ] NP 0F AE /2", "io": "MXCSR=W"},
+ {"any": "stmxcsr W:m32" , "op": "[M ] NP 0F AE /3", "io": "MXCSR=R"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSE", "instructions": [
+ {"any": "addps X:~xmm, ~xmm/m128" , "op": "[RM] NP 0F 58 /r"},
+ {"any": "addss x:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 58 /r"},
+ {"any": "andnps X:xmm, xmm/m128" , "op": "[RM] NP 0F 55 /r"},
+ {"any": "andps X:~xmm, ~xmm/m128" , "op": "[RM] NP 0F 54 /r"},
+ {"any": "cmpps X:xmm, xmm/m128, imm8" , "op": "[RM] NP 0F C2 /r ib"},
+ {"any": "cmpss x:xmm[31:0], xmm[31:0]/m32, imm8" , "op": "[RM] F3 0F C2 /r ib"},
+ {"any": "comiss R:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] NP 0F 2F /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "cvtsi2ss w:xmm[31:0], ry/my" , "op": "[RM] F3 0F 2A /r"},
+ {"any": "cvtss2si W:ry, xmm[31:0]/m32" , "op": "[RM] F3 0F 2D /r"},
+ {"any": "cvttss2si W:ry, xmm[31:0]/m32" , "op": "[RM] F3 0F 2C /r"},
+ {"any": "divps X:xmm, xmm/m128" , "op": "[RM] NP 0F 5E /r"},
+ {"any": "divss x:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 5E /r"},
+ {"any": "maxps X:xmm, xmm/m128" , "op": "[RM] NP 0F 5F /r"},
+ {"any": "maxss x:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 5F /r"},
+ {"any": "minps X:xmm, xmm/m128" , "op": "[RM] NP 0F 5D /r"},
+ {"any": "minss x:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 5D /r"},
+ {"any": "movaps W:xmm, xmm/m128" , "op": "[RM] NP 0F 28 /r"},
+ {"any": "movaps W:xmm/m128, xmm" , "op": "[MR] NP 0F 29 /r"},
+ {"any": "movhlps w:xmm[63:0], xmm[127:64]" , "op": "[RM] NP 0F 12 /r"},
+ {"any": "movhps W:m64, xmm[127:64]" , "op": "[MR] NP 0F 17 /r"},
+ {"any": "movhps w:xmm[127:64], m64" , "op": "[RM] NP 0F 16 /r"},
+ {"any": "movlhps w:xmm[127:64], xmm[63:0]" , "op": "[RM] NP 0F 16 /r"},
+ {"any": "movlps W:m64, xmm[63:0]" , "op": "[MR] NP 0F 13 /r"},
+ {"any": "movlps w:xmm[63:0], m64" , "op": "[RM] NP 0F 12 /r"},
+ {"any": "movmskps W:r32[3:0], xmm" , "op": "[RM] NP 0F 50 /r"},
+ {"any": "movntps W:m128, xmm" , "op": "[MR] NP 0F 2B /r"},
+ {"any": "movss w:xmm[31:0], xmm[31:0]" , "op": "[RM] F3 0F 10 /r"},
+ {"any": "movss W:xmm[31:0], m32" , "op": "[RM] F3 0F 10 /r"},
+ {"any": "movss W:m32, xmm[31:0]" , "op": "[MR] F3 0F 11 /r"},
+ {"any": "movups W:xmm, xmm/m128" , "op": "[RM] NP 0F 10 /r"},
+ {"any": "movups W:xmm/m128, xmm" , "op": "[MR] NP 0F 11 /r"},
+ {"any": "mulps X:~xmm, ~xmm/m128" , "op": "[RM] NP 0F 59 /r"},
+ {"any": "mulss x:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 59 /r"},
+ {"any": "orps X:~xmm, ~xmm/m128" , "op": "[RM] NP 0F 56 /r"},
+ {"any": "rcpps W:xmm, xmm/m128" , "op": "[RM] NP 0F 53 /r"},
+ {"any": "rcpss w:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 53 /r"},
+ {"any": "rsqrtps W:xmm, xmm/m128" , "op": "[RM] NP 0F 52 /r"},
+ {"any": "rsqrtss w:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 52 /r"},
+ {"any": "shufps X:xmm, xmm/m128, imm8" , "op": "[RM] NP 0F C6 /r ib"},
+ {"any": "sqrtps W:xmm, xmm/m128" , "op": "[RM] NP 0F 51 /r"},
+ {"any": "sqrtss w:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 51 /r"},
+ {"any": "subps X:xmm, xmm/m128" , "op": "[RM] NP 0F 5C /r"},
+ {"any": "subss x:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 5C /r"},
+ {"any": "ucomiss R:xmm[31:0], xmm[31:0]/m32" , "op": "[RM] NP 0F 2E /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "unpckhps X:xmm, xmm/m128" , "op": "[RM] NP 0F 15 /r"},
+ {"any": "unpcklps X:xmm, xmm/m128" , "op": "[RM] NP 0F 14 /r"},
+ {"any": "xorps X:~xmm, ~xmm/m128" , "op": "[RM] NP 0F 57 /r"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSE2", "instructions": [
+ {"any": "addpd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 58 /r"},
+ {"any": "addsd x:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 58 /r"},
+ {"any": "andnpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 55 /r"},
+ {"any": "andpd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 54 /r"},
+ {"any": "cmppd X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F C2 /r ib"},
+ {"any": "cmpsd x:xmm[63:0], xmm[63:0]/m64, imm8" , "op": "[RM] F2 0F C2 /r ib"},
+ {"any": "comisd R:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] 66 0F 2F /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "cvtdq2pd W:xmm, xmm[63:0]/m64" , "op": "[RM] F3 0F E6 /r"},
+ {"any": "cvtdq2ps W:xmm, xmm/m128" , "op": "[RM] NP 0F 5B /r"},
+ {"any": "cvtpd2dq W:xmm[63:0], xmm/m128" , "op": "[RM] F2 0F E6 /r"},
+ {"any": "cvtpd2ps W:xmm[63:0], xmm/m128" , "op": "[RM] 66 0F 5A /r"},
+ {"any": "cvtps2dq W:xmm, xmm/m128" , "op": "[RM] 66 0F 5B /r"},
+ {"any": "cvtps2pd W:xmm, xmm[63:0]/m64" , "op": "[RM] NP 0F 5A /r"},
+ {"any": "cvtsd2si W:ry, xmm[63:0]/m64" , "op": "[RM] F2 0F 2D /r"},
+ {"any": "cvtsd2ss w:xmm[31:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 5A /r"},
+ {"any": "cvtsi2sd w:xmm[63:0], ry/my" , "op": "[RM] F2 0F 2A /r"},
+ {"any": "cvtss2sd w:xmm[63:0], xmm[31:0]/m32" , "op": "[RM] F3 0F 5A /r"},
+ {"any": "cvttpd2dq W:xmm[63:0], xmm/m128" , "op": "[RM] 66 0F E6 /r"},
+ {"any": "cvttps2dq W:xmm, xmm/m128" , "op": "[RM] F3 0F 5B /r"},
+ {"any": "cvttsd2si W:ry, xmm[63:0]/m64" , "op": "[RM] F2 0F 2C /r"},
+ {"any": "divpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 5E /r"},
+ {"any": "divsd x:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 5E /r"},
+ {"any": "maskmovdqu R:xmm, xmm, X:<m128(ds:zdi)>" , "op": "[RM] 66 0F F7 /r"},
+ {"any": "maxpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 5F /r"},
+ {"any": "maxsd x:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 5F /r"},
+ {"any": "minpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 5D /r"},
+ {"any": "minsd x:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 5D /r"},
+ {"any": "movapd W:xmm, xmm/m128" , "op": "[RM] 66 0F 28 /r"},
+ {"any": "movapd W:xmm/m128, xmm" , "op": "[MR] 66 0F 29 /r"},
+ {"any": "movd W:r32[31:0]/m32, xmm[31:0]" , "op": "[MR] 66 0F 7E /r"},
+ {"any": "movd W:xmm[31:0], R:r32[31:0]/m32" , "op": "[RM] 66 0F 6E /r"},
+ {"any": "movdqa W:xmm, xmm/m128" , "op": "[RM] 66 0F 6F /r"},
+ {"any": "movdqa W:xmm/m128, xmm" , "op": "[MR] 66 0F 7F /r"},
+ {"any": "movdqu W:xmm, xmm/m128" , "op": "[RM] F3 0F 6F /r"},
+ {"any": "movdqu W:xmm/m128, xmm" , "op": "[MR] F3 0F 7F /r"},
+ {"any": "movhpd W:m64, xmm[127:64]" , "op": "[MR] 66 0F 17 /r"},
+ {"any": "movhpd w:xmm[127:64], m64" , "op": "[RM] 66 0F 16 /r"},
+ {"any": "movlpd W:m64, xmm[63:0]" , "op": "[MR] 66 0F 13 /r"},
+ {"any": "movlpd w:xmm[63:0], m64" , "op": "[RM] 66 0F 12 /r"},
+ {"any": "movmskpd W:r32[1:0], xmm" , "op": "[RM] 66 0F 50 /r"},
+ {"any": "movntdq W:m128, xmm" , "op": "[MR] 66 0F E7 /r"},
+ {"any": "movntpd W:m128, xmm" , "op": "[MR] 66 0F 2B /r"},
+ {"x64": "movq W:r64/m64, xmm[63:0]" , "op": "[MR] REX.W 66 0F 7E /r"},
+ {"x64": "movq W:xmm[63:0], r64[63:0]/m64" , "op": "[RM] REX.W 66 0F 6E /r"},
+ {"any": "movq W:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F3 0F 7E /r"},
+ {"any": "movq W:xmm[63:0]/m64, xmm[63:0]" , "op": "[MR] 66 0F D6 /r"},
+ {"any": "movsd w:xmm[63:0], xmm[63:0]" , "op": "[RM] F2 0F 10 /r"},
+ {"any": "movsd W:xmm[63:0], m64" , "op": "[RM] F2 0F 10 /r"},
+ {"any": "movsd W:m64, xmm[63:0]" , "op": "[MR] F2 0F 11 /r"},
+ {"any": "movupd W:xmm, xmm/m128" , "op": "[RM] 66 0F 10 /r"},
+ {"any": "movupd W:xmm/m128, xmm" , "op": "[MR] 66 0F 11 /r"},
+ {"any": "mulpd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 59 /r"},
+ {"any": "mulsd x:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 59 /r"},
+ {"any": "orpd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 56 /r"},
+ {"any": "packssdw X:xmm, xmm/m128" , "op": "[RM] 66 0F 6B /r"},
+ {"any": "packsswb X:xmm, xmm/m128" , "op": "[RM] 66 0F 63 /r"},
+ {"any": "packuswb X:xmm, xmm/m128" , "op": "[RM] 66 0F 67 /r"},
+ {"any": "paddb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F FC /r"},
+ {"any": "paddd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F FE /r"},
+ {"any": "paddq X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F D4 /r"},
+ {"any": "paddsb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F EC /r"},
+ {"any": "paddsw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F ED /r"},
+ {"any": "paddusb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F DC /r"},
+ {"any": "paddusw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F DD /r"},
+ {"any": "paddw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F FD /r"},
+ {"any": "pand X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F DB /r"},
+ {"any": "pandn X:xmm, xmm/m128" , "op": "[RM] 66 0F DF /r"},
+ {"any": "pavgb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F E0 /r"},
+ {"any": "pavgw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F E3 /r"},
+ {"any": "pcmpeqb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 74 /r"},
+ {"any": "pcmpeqd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 76 /r"},
+ {"any": "pcmpeqw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 75 /r"},
+ {"any": "pcmpgtb X:xmm, xmm/m128" , "op": "[RM] 66 0F 64 /r"},
+ {"any": "pcmpgtd X:xmm, xmm/m128" , "op": "[RM] 66 0F 66 /r"},
+ {"any": "pcmpgtw X:xmm, xmm/m128" , "op": "[RM] 66 0F 65 /r"},
+ {"any": "pextrw W:r32[15:0], xmm, imm8" , "op": "[RM] 66 0F C5 /r ib"},
+ {"any": "pinsrw X:xmm, r32[15:0]/m16, imm8" , "op": "[RM] 66 0F C4 /r ib"},
+ {"any": "pmaddwd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F F5 /r"},
+ {"any": "pmaxsw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F EE /r"},
+ {"any": "pmaxub X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F DE /r"},
+ {"any": "pminsw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F EA /r"},
+ {"any": "pminub X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F DA /r"},
+ {"any": "pmovmskb W:r32[15:0], xmm" , "op": "[RM] 66 0F D7 /r"},
+ {"any": "pmulhuw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F E4 /r"},
+ {"any": "pmulhw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F E5 /r"},
+ {"any": "pmullw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F D5 /r"},
+ {"any": "pmuludq X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F F4 /r"},
+ {"any": "por X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F EB /r"},
+ {"any": "psadbw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F F6 /r"},
+ {"any": "pshufd W:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 70 /r ib"},
+ {"any": "pshufhw W:xmm, xmm/m128, imm8" , "op": "[RM] F3 0F 70 /r ib"},
+ {"any": "pshuflw W:xmm, xmm/m128, imm8" , "op": "[RM] F2 0F 70 /r ib"},
+ {"any": "pslld X:xmm, xmm/m128" , "op": "[RM] 66 0F F2 /r"},
+ {"any": "pslld X:xmm, imm8" , "op": "[M ] 66 0F 72 /6 ib"},
+ {"any": "pslldq X:xmm, imm8" , "op": "[M ] 66 0F 73 /7 ib"},
+ {"any": "psllq X:xmm, xmm/m128" , "op": "[RM] 66 0F F3 /r"},
+ {"any": "psllq X:xmm, imm8" , "op": "[M ] 66 0F 73 /6 ib"},
+ {"any": "psllw X:xmm, xmm/m128" , "op": "[RM] 66 0F F1 /r"},
+ {"any": "psllw X:xmm, imm8" , "op": "[M ] 66 0F 71 /6 ib"},
+ {"any": "psrad X:xmm, xmm/m128" , "op": "[RM] 66 0F E2 /r"},
+ {"any": "psrad X:xmm, imm8" , "op": "[M ] 66 0F 72 /4 ib"},
+ {"any": "psraw X:xmm, xmm/m128" , "op": "[RM] 66 0F E1 /r"},
+ {"any": "psraw X:xmm, imm8" , "op": "[M ] 66 0F 71 /4 ib"},
+ {"any": "psrld X:xmm, xmm/m128" , "op": "[RM] 66 0F D2 /r"},
+ {"any": "psrld X:xmm, imm8" , "op": "[M ] 66 0F 72 /2 ib"},
+ {"any": "psrldq X:xmm, imm8" , "op": "[M ] 66 0F 73 /3 ib"},
+ {"any": "psrlq X:xmm, xmm/m128" , "op": "[RM] 66 0F D3 /r"},
+ {"any": "psrlq X:xmm, imm8" , "op": "[M ] 66 0F 73 /2 ib"},
+ {"any": "psrlw X:xmm, imm8" , "op": "[M ] 66 0F 71 /2 ib"},
+ {"any": "psrlw X:xmm, xmm/m128" , "op": "[RM] 66 0F D1 /r"},
+ {"any": "psubb X:xmm, xmm/m128" , "op": "[RM] 66 0F F8 /r"},
+ {"any": "psubd X:xmm, xmm/m128" , "op": "[RM] 66 0F FA /r"},
+ {"any": "psubq X:xmm, xmm/m128" , "op": "[RM] 66 0F FB /r"},
+ {"any": "psubsb X:xmm, xmm/m128" , "op": "[RM] 66 0F E8 /r"},
+ {"any": "psubsw X:xmm, xmm/m128" , "op": "[RM] 66 0F E9 /r"},
+ {"any": "psubusb X:xmm, xmm/m128" , "op": "[RM] 66 0F D8 /r"},
+ {"any": "psubusw X:xmm, xmm/m128" , "op": "[RM] 66 0F D9 /r"},
+ {"any": "psubw X:xmm, xmm/m128" , "op": "[RM] 66 0F F9 /r"},
+ {"any": "punpckhbw X:xmm, xmm/m128" , "op": "[RM] 66 0F 68 /r"},
+ {"any": "punpckhdq X:xmm, xmm/m128" , "op": "[RM] 66 0F 6A /r"},
+ {"any": "punpckhqdq X:xmm, xmm/m128" , "op": "[RM] 66 0F 6D /r"},
+ {"any": "punpckhwd X:xmm, xmm/m128" , "op": "[RM] 66 0F 69 /r"},
+ {"any": "punpcklbw X:xmm, xmm/m128" , "op": "[RM] 66 0F 60 /r"},
+ {"any": "punpckldq X:xmm, xmm/m128" , "op": "[RM] 66 0F 62 /r"},
+ {"any": "punpcklqdq X:xmm, xmm/m128" , "op": "[RM] 66 0F 6C /r"},
+ {"any": "punpcklwd X:xmm, xmm/m128" , "op": "[RM] 66 0F 61 /r"},
+ {"any": "pxor X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F EF /r"},
+ {"any": "shufpd X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F C6 /r ib"},
+ {"any": "sqrtpd W:xmm, xmm/m128" , "op": "[RM] 66 0F 51 /r"},
+ {"any": "sqrtsd w:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 51 /r"},
+ {"any": "subpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 5C /r"},
+ {"any": "subsd x:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] F2 0F 5C /r"},
+ {"any": "ucomisd R:xmm[63:0], xmm[63:0]/m64" , "op": "[RM] 66 0F 2E /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "unpckhpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 15 /r"},
+ {"any": "unpcklpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 14 /r"},
+ {"any": "xorpd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 57 /r"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSE3", "instructions": [
+ {"any": "addsubpd X:xmm, xmm/m128" , "op": "[RM] 66 0F D0 /r"},
+ {"any": "addsubps X:xmm, xmm/m128" , "op": "[RM] F2 0F D0 /r"},
+ {"any": "haddpd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 7C /r"},
+ {"any": "haddps X:~xmm, ~xmm/m128" , "op": "[RM] F2 0F 7C /r"},
+ {"any": "hsubpd X:xmm, xmm/m128" , "op": "[RM] 66 0F 7D /r"},
+ {"any": "hsubps X:xmm, xmm/m128" , "op": "[RM] F2 0F 7D /r"},
+ {"any": "lddqu W:xmm, m128" , "op": "[RM] F2 0F F0 /r"},
+ {"any": "movddup W:xmm, xmm[63:0]/m64" , "op": "[RM] F2 0F 12 /r"},
+ {"any": "movshdup W:xmm, xmm/m128" , "op": "[RM] F3 0F 16 /r"},
+ {"any": "movsldup W:xmm, xmm/m128" , "op": "[RM] F3 0F 12 /r"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSSE3", "instructions": [
+ {"any": "pabsb W:xmm, xmm/m128" , "op": "[RM] 66 0F 38 1C /r"},
+ {"any": "pabsd W:xmm, xmm/m128" , "op": "[RM] 66 0F 38 1E /r"},
+ {"any": "pabsw W:xmm, xmm/m128" , "op": "[RM] 66 0F 38 1D /r"},
+ {"any": "palignr X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 0F /r ib"},
+ {"any": "phaddd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 02 /r"},
+ {"any": "phaddsw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 03 /r"},
+ {"any": "phaddw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 01 /r"},
+ {"any": "phsubd X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 06 /r"},
+ {"any": "phsubsw X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 07 /r"},
+ {"any": "phsubw X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 05 /r"},
+ {"any": "pmaddubsw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 04 /r"},
+ {"any": "pmulhrsw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 0B /r"},
+ {"any": "pshufb X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 00 /r"},
+ {"any": "psignb X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 08 /r"},
+ {"any": "psignd X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 0A /r"},
+ {"any": "psignw X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 09 /r"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSE4_1", "instructions": [
+ {"any": "blendpd X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 0D /r ib"},
+ {"any": "blendps X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 0C /r ib"},
+ {"any": "blendvpd X:xmm, xmm/m128, <xmm0>" , "op": "[RM] 66 0F 38 15 /r"},
+ {"any": "blendvps X:xmm, xmm/m128, <xmm0>" , "op": "[RM] 66 0F 38 14 /r"},
+ {"any": "dppd X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 41 /r ib"},
+ {"any": "dpps X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 40 /r ib"},
+ {"any": "extractps W:r32/m32, xmm, imm8" , "op": "[MR] 66 0F 3A 17 /r ib"},
+ {"any": "insertps X:xmm, xmm[31:0]/m32, imm8" , "op": "[RM] 66 0F 3A 21 /r ib"},
+ {"any": "movntdqa W:xmm, m128" , "op": "[RM] 66 0F 38 2A /r"},
+ {"any": "mpsadbw X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 42 /r ib"},
+ {"any": "packusdw X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 2B /r"},
+ {"any": "pblendvb X:xmm, xmm/m128, <xmm0>" , "op": "[RM] 66 0F 38 10 /r"},
+ {"any": "pblendw X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 0E /r ib"},
+ {"any": "pcmpeqq X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 29 /r"},
+ {"any": "pextrb W:r32[7:0]/m8, xmm, imm8" , "op": "[MR] 66 0F 3A 14 /r ib"},
+ {"any": "pextrd W:r32[31:0]/m32, xmm, imm8" , "op": "[MR] 66 0F 3A 16 /r ib"},
+ {"any": "pextrq W:r64/m64, xmm, imm8" , "op": "[MR] REX.W 66 0F 3A 16 /r ib"},
+ {"any": "pextrw W:r32[15:0]/m16, xmm, imm8" , "op": "[MR] 66 0F 3A 15 /r ib"},
+ {"any": "phminposuw W:xmm[18:0], xmm/m128" , "op": "[RM] 66 0F 38 41 /r"},
+ {"any": "pinsrb X:xmm, r32[7:0]/m8, imm8" , "op": "[RM] 66 0F 3A 20 /r ib"},
+ {"any": "pinsrd X:xmm, r32[31:0]/m32, imm8" , "op": "[RM] 66 0F 3A 22 /r ib"},
+ {"any": "pinsrq X:xmm, r64/m64, imm8" , "op": "[RM] REX.W 66 0F 3A 22 /r ib"},
+ {"any": "pmaxsb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 3C /r"},
+ {"any": "pmaxsd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 3D /r"},
+ {"any": "pmaxud X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 3F /r"},
+ {"any": "pmaxuw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 3E /r"},
+ {"any": "pminsb X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 38 /r"},
+ {"any": "pminsd X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 39 /r"},
+ {"any": "pminud X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 3B /r"},
+ {"any": "pminuw X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 3A /r"},
+ {"any": "pmovsxbd W:xmm, xmm[31:0]/m32" , "op": "[RM] 66 0F 38 21 /r"},
+ {"any": "pmovsxbq W:xmm, xmm[15:0]/m16" , "op": "[RM] 66 0F 38 22 /r"},
+ {"any": "pmovsxbw W:xmm, xmm[63:0]/m64" , "op": "[RM] 66 0F 38 20 /r"},
+ {"any": "pmovsxdq W:xmm, xmm[63:0]/m64" , "op": "[RM] 66 0F 38 25 /r"},
+ {"any": "pmovsxwd W:xmm, xmm[63:0]/m64" , "op": "[RM] 66 0F 38 23 /r"},
+ {"any": "pmovsxwq W:xmm, xmm[31:0]/m32" , "op": "[RM] 66 0F 38 24 /r"},
+ {"any": "pmovzxbd W:xmm, xmm[31:0]/m32" , "op": "[RM] 66 0F 38 31 /r"},
+ {"any": "pmovzxbq W:xmm, xmm[15:0]/m16" , "op": "[RM] 66 0F 38 32 /r"},
+ {"any": "pmovzxbw W:xmm, xmm[63:0]/m64" , "op": "[RM] 66 0F 38 30 /r"},
+ {"any": "pmovzxdq W:xmm, xmm[63:0]/m64" , "op": "[RM] 66 0F 38 35 /r"},
+ {"any": "pmovzxwd W:xmm, xmm[63:0]/m64" , "op": "[RM] 66 0F 38 33 /r"},
+ {"any": "pmovzxwq W:xmm, xmm[31:0]/m32" , "op": "[RM] 66 0F 38 34 /r"},
+ {"any": "pmuldq X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 28 /r"},
+ {"any": "pmulld X:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 40 /r"},
+ {"any": "ptest R:~xmm, ~xmm/m128" , "op": "[RM] 66 0F 38 17 /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "roundpd W:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 09 /r ib"},
+ {"any": "roundps W:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 08 /r ib"},
+ {"any": "roundsd w:xmm[63:0], xmm[63:0]/m64, imm8" , "op": "[RM] 66 0F 3A 0B /r ib"},
+ {"any": "roundss w:xmm[31:0], xmm[31:0]/m32, imm8" , "op": "[RM] 66 0F 3A 0A /r ib"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSE4_2", "instructions": [
+ {"any": "pcmpestri R:xmm, xmm/m128, imm8, W:<ecx>, <eax>, <edx>" , "op": "[RM] 66 0F 3A 61 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "pcmpestrm R:xmm, xmm/m128, imm8, W:<xmm0>, <eax>, <edx>" , "op": "[RM] 66 0F 3A 60 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "pcmpgtq X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 37 /r"},
+ {"any": "pcmpistri R:xmm, xmm/m128, imm8, W:<ecx>" , "op": "[RM] 66 0F 3A 63 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "pcmpistrm R:xmm, xmm/m128, imm8, W:<xmm0>" , "op": "[RM] 66 0F 3A 62 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "SSE4A", "instructions": [
+ {"any": "extrq X:xmm, imm8, imm8" , "op": "[R ] 66 0F 78 /0 ib ib"},
+ {"any": "extrq X:xmm, xmm" , "op": "[RM] 66 0F 79 /r"},
+ {"any": "insertq X:xmm, xmm" , "op": "[RM] F2 0F 79 /r"},
+ {"any": "insertq X:xmm, xmm, imm8, imm8" , "op": "[RM] F2 0F 78 /r ib ib"},
+ {"any": "movntsd W:m64, xmm[63:0]" , "op": "[RM] F2 0F 2B /r"},
+ {"any": "movntss W:m32, xmm[31:0]" , "op": "[RM] F3 0F 2B /r"}
+ ]},
+
+ {"category": "SSE SIMD CRYPTO_HASH", "ext": "KL", "instructions": [
+ {"any": "loadiwkey R:xmm, R:xmm, R:<eax>, R:<xmm0>" , "op": "[RM] F3 0F 38 DC 11:rrr:bbb" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
+ ]},
+
+ {"category": "SSE SIMD CRYPTO_HASH", "ext": "AESKLE", "instructions": [
+ {"any": "aesdec128kl X:xmm, R:m384" , "op": "[RM] F3 0F 38 DD !(11):rrr:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"any": "aesdec256kl X:xmm, R:m512" , "op": "[RM] F3 0F 38 DF !(11):rrr:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"any": "aesenc128kl X:xmm, R:m384" , "op": "[RM] F3 0F 38 DC !(11):rrr:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"any": "aesenc256kl X:xmm, R:m512" , "op": "[RM] F3 0F 38 DE !(11):rrr:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"___": "encodekey128 W:r32, R:r32, X:<xmm0>, W:<xmm1-6>" , "op": "[RM] F3 0F 38 FA 11:rrr:bbb" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=0"},
+ {"___": "encodekey256 W:r32, R:r32, X:<xmm0-1>, W:<xmm2-6>" , "op": "[RM] F3 0F 38 FB 11:rrr:bbb" , "io": "OF=0 SF=0 ZF=0 AF=0 PF=0 CF=0"}
+ ]},
+
+ {"category": "SSE SIMD CRYPTO_HASH", "ext": "AESKLEWIDE_KL", "instructions": [
+ {"___": "aesdecwide128kl R:m384, X:<xmm0-7>" , "op": "[RM] F3 0F 38 D8 !(11):001:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"___": "aesdecwide256kl R:m512, X:<xmm0-7>" , "op": "[RM] F3 0F 38 D8 !(11):011:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"___": "aesencwide128kl R:m384, X:<xmm0-7>" , "op": "[RM] F3 0F 38 D8 !(11):000:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"},
+ {"___": "aesencwide256kl R:m512, X:<xmm0-7>" , "op": "[RM] F3 0F 38 D8 !(11):010:bbb", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=0"}
+ ]},
+
+ {"category": "SSE SIMD CRYPTO_HASH", "ext": "AESNI", "instructions": [
+ {"any": "aesdec X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 DE /r"},
+ {"any": "aesdeclast X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 DF /r"},
+ {"any": "aesenc X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 DC /r"},
+ {"any": "aesenclast X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 DD /r"},
+ {"any": "aesimc W:xmm, xmm/m128" , "op": "[RM] 66 0F 38 DB /r"},
+ {"any": "aeskeygenassist W:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A DF /r ib"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "GFNI", "instructions": [
+ {"any": "gf2p8affineinvqb X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A CF /r ib"},
+ {"any": "gf2p8affineqb X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A CE /r ib"},
+ {"any": "gf2p8mulb X:xmm, xmm/m128" , "op": "[RM] 66 0F 38 CF /r"}
+ ]},
+
+ {"category": "SSE SIMD", "ext": "PCLMULQDQ", "instructions": [
+ {"any": "pclmulqdq X:xmm, xmm/m128, imm8" , "op": "[RM] 66 0F 3A 44 /r ib"}
+ ]},
+
+ {"category": "SSE SIMD CRYPTO_HASH", "ext": "SHA", "instructions": [
+ {"any": "sha1msg1 xmm, xmm/m128" , "op": "[RM] NP 0F 38 C9 /r"},
+ {"any": "sha1msg2 xmm, xmm/m128" , "op": "[RM] NP 0F 38 CA /r"},
+ {"any": "sha1nexte xmm, xmm/m128" , "op": "[RM] NP 0F 38 C8 /r"},
+ {"any": "sha1rnds4 xmm, xmm/m128, imm8" , "op": "[RM] NP 0F 3A CC /r ib"},
+ {"any": "sha256msg1 xmm, xmm/m128" , "op": "[RM] NP 0F 38 CC /r"},
+ {"any": "sha256msg2 xmm, xmm/m128" , "op": "[RM] NP 0F 38 CD /r"},
+ {"any": "sha256rnds2 xmm, xmm/m128, <xmm0>" , "op": "[RM] NP 0F 38 CB /r"}
+ ]},
+
+ {"category": "AVX STATE", "ext": "AVX", "instructions": [
+ {"any": "vldmxcsr R:m32" , "op": "[M ] VEX.LZ.NP.0F.WIG AE /2", "io": "MXCSR=W"},
+ {"any": "vstmxcsr W:m32" , "op": "[M ] VEX.LZ.NP.0F.WIG AE /3", "io": "MXCSR=R"},
+ {"any": "vzeroall" , "op": "[OP ] VEX.256.NP.0F.WIG 77", "volatile": true},
+ {"any": "vzeroupper" , "op": "[OP ] VEX.128.NP.0F.WIG 77", "volatile": true}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX", "instructions": [
+ {"any": "vaddpd W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 58 /r"},
+ {"any": "vaddps W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 58 /r"},
+ {"any": "vaddsd W:xmm, xmm, xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 58 /r"},
+ {"any": "vaddss W:xmm, xmm, xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 58 /r"},
+ {"any": "vaddsubpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG D0 /r"},
+ {"any": "vaddsubps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.F2.0F.WIG D0 /r"},
+ {"any": "vandnpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 55 /r"},
+ {"any": "vandnps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 55 /r"},
+ {"any": "vandpd W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 54 /r"},
+ {"any": "vandps W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 54 /r"},
+ {"any": "vblendpd W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F3A.WIG 0D /r ib"},
+ {"any": "vblendps W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F3A.WIG 0C /r ib"},
+ {"any": "vblendvpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS]VEX.Lxy.66.0F3A.W0 4B /r /is4"},
+ {"any": "vblendvps W:xy, xy, xy/mxy, xy" , "op": "[RVMS]VEX.Lxy.66.0F3A.W0 4A /r /is4"},
+ {"any": "vbroadcastf128 W:ymm, m128" , "op": "[RM ] VEX.256.66.0F38.W0 1A /r"},
+ {"any": "vbroadcastsd W:ymm, m64" , "op": "[RM ] VEX.256.66.0F38.W0 19 /r"},
+ {"any": "vbroadcastss W:xy, m32" , "op": "[RM ] VEX.Lxy.66.0F38.W0 18 /r"},
+ {"any": "vcmppd W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F.WIG C2 /r ib"},
+ {"any": "vcmpps W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.NP.0F.WIG C2 /r ib"},
+ {"any": "vcmpsd W:xmm, xmm, xmm[63:0]/m64, imm8" , "op": "[RVM] VEX.LIG.F2.0F.WIG C2 /r ib"},
+ {"any": "vcmpss W:xmm, xmm, xmm[31:0]/m32, imm8" , "op": "[RVM] VEX.LIG.F3.0F.WIG C2 /r ib"},
+ {"any": "vcomisd R:xmm[63:0], xmm[63:0]/m64" , "op": "[RM ] VEX.LIG.66.0F.WIG 2F /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcomiss R:xmm[31:0], xmm[31:0]/m32" , "op": "[RM ] VEX.LIG.NP.0F.WIG 2F /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcvtdq2pd W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.F3.0F.WIG E6 /r"},
+ {"any": "vcvtdq2pd W:ymm, xmm/m128" , "op": "[RM ] VEX.256.F3.0F.WIG E6 /r"},
+ {"any": "vcvtdq2ps W:xmm, xmm/m128" , "op": "[RM ] VEX.128.NP.0F.WIG 5B /r"},
+ {"any": "vcvtdq2ps W:ymm, ymm/m256" , "op": "[RM ] VEX.256.NP.0F.WIG 5B /r"},
+ {"any": "vcvtpd2dq W:xmm[63:0], xmm/m128" , "op": "[RM ] VEX.128.F2.0F.WIG E6 /r"},
+ {"any": "vcvtpd2dq W:xmm, ymm/m256" , "op": "[RM ] VEX.256.F2.0F.WIG E6 /r"},
+ {"any": "vcvtpd2ps W:xmm[63:0], xmm/m128" , "op": "[RM ] VEX.128.66.0F.WIG 5A /r"},
+ {"any": "vcvtpd2ps W:xmm, ymm/m256" , "op": "[RM ] VEX.256.66.0F.WIG 5A /r"},
+ {"any": "vcvtps2dq W:xmm, xmm/m128" , "op": "[RM ] VEX.128.66.0F.WIG 5B /r"},
+ {"any": "vcvtps2dq W:ymm, ymm/m256" , "op": "[RM ] VEX.256.66.0F.WIG 5B /r"},
+ {"any": "vcvtps2pd W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.NP.0F.WIG 5A /r"},
+ {"any": "vcvtps2pd W:ymm, xmm/m128" , "op": "[RM ] VEX.256.NP.0F.WIG 5A /r"},
+ {"any": "vcvtsd2si W:ry, xmm[63:0]/m64" , "op": "[RM ] VEX.LIG.F2.0F.Wy 2D /r"},
+ {"any": "vcvtsd2ss W:xmm, xmm[127:32], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 5A /r"},
+ {"any": "vcvtsi2sd W:xmm, xmm[127:64], ry/my" , "op": "[RVM] VEX.LIG.F2.0F.Wy 2A /r"},
+ {"any": "vcvtsi2ss W:xmm, xmm[127:32], ry/my" , "op": "[RVM] VEX.LIG.F3.0F.Wy 2A /r"},
+ {"any": "vcvtss2sd W:xmm, xmm[127:64], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 5A /r"},
+ {"any": "vcvtss2si W:ry, xmm[31:0]/m32" , "op": "[RM ] VEX.LIG.F3.0F.Wy 2D /r"},
+ {"any": "vcvttpd2dq W:xmm[63:0], xmm/m128" , "op": "[RM ] VEX.128.66.0F.WIG E6 /r"},
+ {"any": "vcvttpd2dq W:xmm, ymm/m256" , "op": "[RM ] VEX.256.66.0F.WIG E6 /r"},
+ {"any": "vcvttps2dq W:xmm, xmm/m128" , "op": "[RM ] VEX.128.F3.0F.WIG 5B /r"},
+ {"any": "vcvttps2dq W:ymm, ymm/m256" , "op": "[RM ] VEX.256.F3.0F.WIG 5B /r"},
+ {"any": "vcvttsd2si W:ry, xmm[63:0]/m64" , "op": "[RM ] VEX.LIG.F2.0F.Wy 2C /r"},
+ {"any": "vcvttss2si W:ry, xmm[31:0]/m32" , "op": "[RM ] VEX.LIG.F3.0F.Wy 2C /r"},
+ {"any": "vdivpd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 5E /r"},
+ {"any": "vdivpd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 5E /r"},
+ {"any": "vdivps W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.NP.0F.WIG 5E /r"},
+ {"any": "vdivps W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.NP.0F.WIG 5E /r"},
+ {"any": "vdivsd W:xmm, xmm, xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 5E /r"},
+ {"any": "vdivss W:xmm, xmm, xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 5E /r"},
+ {"any": "vdppd W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG 41 /r ib"},
+ {"any": "vdpps W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F3A.WIG 40 /r ib"},
+ {"any": "vextractps W:r32[31:0]/m32, xmm, imm8" , "op": "[MR ] VEX.128.66.0F3A.WIG 17 /r ib"},
+ {"any": "vextractf128 W:xmm/m128, ymm, imm8" , "op": "[MR ] VEX.256.66.0F3A.W0 19 /r ib"},
+ {"any": "vhaddpd W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 7C /r"},
+ {"any": "vhaddps W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.F2.0F.WIG 7C /r"},
+ {"any": "vhsubpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 7D /r"},
+ {"any": "vhsubps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.F2.0F.WIG 7D /r"},
+ {"any": "vinsertf128 W:ymm, ymm, xmm/m128, imm8" , "op": "[RVM] VEX.256.66.0F3A.W0 18 /r ib"},
+ {"any": "vinsertps W:xmm, xmm, xmm[31:0]/m32, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG 21 /r ib"},
+ {"any": "vlddqu W:xy, mxy" , "op": "[RM ] VEX.Lxy.F2.0F.WIG F0 /r"},
+ {"any": "vmaskmovdqu R:xmm, xmm, X:<m128(ds:zdi)>" , "op": "[RM ] VEX.128.66.0F.WIG F7 /r"},
+ {"any": "vmaskmovpd X:mxy, xy, xy" , "op": "[MVR] VEX.Lxy.66.0F38.W0 2F /r"},
+ {"any": "vmaskmovpd W:xy, xy, mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 2D /r"},
+ {"any": "vmaskmovps X:mxy, xy, xy" , "op": "[MVR] VEX.Lxy.66.0F38.W0 2E /r"},
+ {"any": "vmaskmovps W:xy, xy, mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 2C /r"},
+ {"any": "vmaxpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 5F /r"},
+ {"any": "vmaxps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 5F /r"},
+ {"any": "vmaxsd W:xmm, xmm, xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 5F /r"},
+ {"any": "vmaxss W:xmm, xmm, xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 5F /r"},
+ {"any": "vminpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 5D /r"},
+ {"any": "vminps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 5D /r"},
+ {"any": "vminsd W:xmm, xmm, xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 5D /r"},
+ {"any": "vminss W:xmm, xmm, xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 5D /r"},
+ {"any": "vmovapd W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F.WIG 28 /r"},
+ {"any": "vmovapd W:xy/mxy, xy" , "op": "[MR ] VEX.Lxy.66.0F.WIG 29 /r"},
+ {"any": "vmovaps W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.NP.0F.WIG 28 /r"},
+ {"any": "vmovaps W:xy/mxy, xy" , "op": "[MR ] VEX.Lxy.NP.0F.WIG 29 /r"},
+ {"any": "vmovd W:r32[31:0]/m32, xmm[31:0]" , "op": "[MR ] VEX.128.66.0F.W0 7E /r"},
+ {"any": "vmovd W:xmm[31:0], r32[31:0]/m32" , "op": "[RM ] VEX.128.66.0F.W0 6E /r"},
+ {"any": "vmovddup W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.F2.0F.WIG 12 /r"},
+ {"any": "vmovddup W:ymm, ymm/m256" , "op": "[RM ] VEX.256.F2.0F.WIG 12 /r"},
+ {"any": "vmovdqa W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F.WIG 6F /r"},
+ {"any": "vmovdqa W:xy/mxy, xy" , "op": "[MR ] VEX.Lxy.66.0F.WIG 7F /r"},
+ {"any": "vmovdqu W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.F3.0F.WIG 6F /r"},
+ {"any": "vmovdqu W:xy/mxy, xy" , "op": "[MR ] VEX.Lxy.F3.0F.WIG 7F /r"},
+ {"any": "vmovhlps W:xmm, xmm[127:64], xmm[127:64]" , "op": "[RVM] VEX.128.NP.0F.WIG 12 /r"},
+ {"any": "vmovhpd W:m64, xmm[127:64]" , "op": "[MR ] VEX.128.66.0F.WIG 17 /r"},
+ {"any": "vmovhpd W:xmm, xmm[63:0], m64" , "op": "[RVM] VEX.128.66.0F.WIG 16 /r"},
+ {"any": "vmovhps W:m64, xmm[127:64]" , "op": "[MR ] VEX.128.NP.0F.WIG 17 /r"},
+ {"any": "vmovhps W:xmm, xmm[63:0], m64" , "op": "[RVM] VEX.128.NP.0F.WIG 16 /r"},
+ {"any": "vmovlhps W:xmm, xmm[63:0], xmm[63:0]" , "op": "[RVM] VEX.128.NP.0F.WIG 16 /r"},
+ {"any": "vmovlpd W:m64, xmm[63:0]" , "op": "[MR ] VEX.128.66.0F.WIG 13 /r"},
+ {"any": "vmovlpd W:xmm, xmm[127:64], m64" , "op": "[RVM] VEX.128.66.0F.WIG 12 /r"},
+ {"any": "vmovlps W:m64, xmm[63:0]" , "op": "[MR ] VEX.128.NP.0F.WIG 13 /r"},
+ {"any": "vmovlps W:xmm, xmm[127:64], m64" , "op": "[RVM] VEX.128.NP.0F.WIG 12 /r"},
+ {"any": "vmovmskpd W:r32[1:0], xmm" , "op": "[RM ] VEX.128.66.0F.WIG 50 /r"},
+ {"any": "vmovmskpd W:r32[3:0], ymm" , "op": "[RM ] VEX.256.66.0F.WIG 50 /r"},
+ {"any": "vmovmskps W:r32[3:0], xmm" , "op": "[RM ] VEX.128.NP.0F.WIG 50 /r"},
+ {"any": "vmovmskps W:r32[7:0], ymm" , "op": "[RM ] VEX.256.NP.0F.WIG 50 /r"},
+ {"any": "vmovntdq W:mxy, xy" , "op": "[MR ] VEX.Lxy.66.0F.WIG E7 /r"},
+ {"any": "vmovntdqa W:xmm, m128" , "op": "[RM ] VEX.128.66.0F38.WIG 2A /r"},
+ {"any": "vmovntpd W:mxy, xy" , "op": "[MR ] VEX.Lxy.66.0F.WIG 2B /r"},
+ {"any": "vmovntps W:mxy, xy" , "op": "[MR ] VEX.Lxy.NP.0F.WIG 2B /r"},
+ {"any": "vmovq W:r64/m64, xmm[63:0]" , "op": "[MR ] VEX.128.66.0F.W1 7E /r"},
+ {"any": "vmovq W:xmm[63:0], xmm[63:0]/m64" , "op": "[RM ] VEX.128.F3.0F.WIG 7E /r"},
+ {"any": "vmovq W:xmm[63:0], r64/m64" , "op": "[RM ] VEX.128.66.0F.W1 6E /r"},
+ {"any": "vmovq W:xmm[63:0]/m64, xmm[63:0]" , "op": "[MR ] VEX.128.66.0F.WIG D6 /r"},
+ {"any": "vmovsd W:m64, xmm[63:0]" , "op": "[MR ] VEX.LIG.F2.0F.WIG 11 /r"},
+ {"any": "vmovsd W:xmm[63:0], m64" , "op": "[RM ] VEX.LIG.F2.0F.WIG 10 /r"},
+ {"any": "vmovsd W:xmm, xmm[127:64], xmm[63:0]" , "op": "[MVR] VEX.LIG.F2.0F.WIG 11 /r"},
+ {"any": "vmovsd W:xmm, xmm[127:64], xmm[63:0]" , "op": "[RVM] VEX.LIG.F2.0F.WIG 10 /r"},
+ {"any": "vmovshdup W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.F3.0F.WIG 16 /r"},
+ {"any": "vmovsldup W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.F3.0F.WIG 12 /r"},
+ {"any": "vmovss W:m32, xmm[31:0]" , "op": "[MR ] VEX.LIG.F3.0F.WIG 11 /r"},
+ {"any": "vmovss W:xmm[31:0], m32" , "op": "[RM ] VEX.LIG.F3.0F.WIG 10 /r"},
+ {"any": "vmovss W:xmm, xmm[127:32], xmm[31:0]" , "op": "[MVR] VEX.LIG.F3.0F.WIG 11 /r"},
+ {"any": "vmovss W:xmm, xmm[127:32], xmm[31:0]" , "op": "[RVM] VEX.LIG.F3.0F.WIG 10 /r"},
+ {"any": "vmovupd W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.NP.0F.WIG 10 /r"},
+ {"any": "vmovupd W:xy/mxy, xy" , "op": "[MR ] VEX.Lxy.NP.0F.WIG 11 /r"},
+ {"any": "vmovups W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F.WIG 10 /r"},
+ {"any": "vmovups W:xy/mxy, xy" , "op": "[MR ] VEX.Lxy.66.0F.WIG 11 /r"},
+ {"any": "vmpsadbw W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG 42 /r ib"},
+ {"any": "vmulpd W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 59 /r"},
+ {"any": "vmulps W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 59 /r"},
+ {"any": "vmulsd W:xmm, xmm, xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 59 /r"},
+ {"any": "vmulss W:xmm, xmm, xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 59 /r"},
+ {"any": "vorpd W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 56 /r"},
+ {"any": "vorps W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 56 /r"},
+ {"any": "vpabsb W:xmm, xmm/m128" , "op": "[RM ] VEX.128.66.0F38.WIG 1C /r"},
+ {"any": "vpabsd W:xmm, xmm/m128" , "op": "[RM_] VEX.128.66.0F38.WIG 1E /r"},
+ {"any": "vpabsw W:xmm, xmm/m128" , "op": "[RM ] VEX.128.66.0F38.WIG 1D /r"},
+ {"any": "vpackssdw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 6B /r"},
+ {"any": "vpacksswb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 63 /r"},
+ {"any": "vpackusdw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 2B /r"},
+ {"any": "vpackuswb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 67 /r"},
+ {"any": "vpaddb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG FC /r"},
+ {"any": "vpaddd W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG FE /r"},
+ {"any": "vpaddq W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D4 /r"},
+ {"any": "vpaddsb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG EC /r"},
+ {"any": "vpaddsw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG ED /r"},
+ {"any": "vpaddusb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG DC /r"},
+ {"any": "vpaddusw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG DD /r"},
+ {"any": "vpaddw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG FD /r"},
+ {"any": "vpalignr W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG 0F /r ib"},
+ {"any": "vpand W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG DB /r"},
+ {"any": "vpandn W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG DF /r"},
+ {"any": "vpavgb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E0 /r"},
+ {"any": "vpavgw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E3 /r"},
+ {"any": "vpblendvb W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]VEX.128.66.0F3A.W0 4C /r /is4"},
+ {"any": "vpblendw W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG 0E /r ib"},
+ {"any": "vpcmpeqb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 74 /r"},
+ {"any": "vpcmpeqd W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 76 /r"},
+ {"any": "vpcmpeqq W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 29 /r"},
+ {"any": "vpcmpeqw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 75 /r"},
+ {"any": "vpcmpestri R:xmm, xmm/m128, imm8, W:<ecx>, <eax>, <edx>" , "op": "[RM ] VEX.128.66.0F3A.WIG 61 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vpcmpestrm R:xmm, xmm/m128, imm8, W:<xmm0>, <eax>, <edx>" , "op": "[RM ] VEX.128.66.0F3A.WIG 60 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vpcmpgtb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 64 /r"},
+ {"any": "vpcmpgtd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 66 /r"},
+ {"any": "vpcmpgtq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 37 /r"},
+ {"any": "vpcmpgtw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 65 /r"},
+ {"any": "vpcmpistri R:xmm, xmm/m128, imm8, W:<ecx>" , "op": "[RM ] VEX.128.66.0F3A.WIG 63 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vpcmpistrm R:xmm, xmm/m128, imm8, W:<xmm0>" , "op": "[RM ] VEX.128.66.0F3A.WIG 62 /r ib", "io": "OF=W SF=W ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vperm2f128 W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.W0 06 /r ib"},
+ {"any": "vpermilpd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W0 0D /r"},
+ {"any": "vpermilpd W:xmm, xmm/m128, imm8" , "op": "[RM ] VEX.128.66.0F3A.W0 05 /r ib"},
+ {"any": "vpermilpd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 0D /r"},
+ {"any": "vpermilpd W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.66.0F3A.W0 05 /r ib"},
+ {"any": "vpermilps W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W0 0C /r"},
+ {"any": "vpermilps W:xmm, xmm/m128, imm8" , "op": "[RM ] VEX.128.66.0F3A.W0 04 /r ib"},
+ {"any": "vpermilps W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 0C /r"},
+ {"any": "vpermilps W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.66.0F3A.W0 04 /r ib"},
+ {"any": "vpextrb W:r32[7:0]/m8, xmm, imm8" , "op": "[MR ] VEX.128.66.0F3A.W0 14 /r ib"},
+ {"any": "vpextrd W:r32/m32, xmm, imm8" , "op": "[MR ] VEX.128.66.0F3A.W0 16 /r ib"},
+ {"any": "vpextrq W:r64/m64, xmm, imm8" , "op": "[MR ] VEX.128.66.0F3A.W1 16 /r ib"},
+ {"any": "vpextrw W:r32[15:0], xmm, imm8" , "op": "[RM ] VEX.128.66.0F.W0 C5 /r ib"},
+ {"any": "vpextrw W:r32[15:0]/m16, xmm, imm8" , "op": "[MR ] VEX.128.66.0F3A.W0 15 /r ib"},
+ {"any": "vphaddd W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 02 /r"},
+ {"any": "vphaddsw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 03 /r"},
+ {"any": "vphaddw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 01 /r"},
+ {"any": "vphminposuw W:xmm[18:0], xmm/m128" , "op": "[RM ] VEX.128.66.0F38.WIG 41 /r"},
+ {"any": "vphsubd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 06 /r"},
+ {"any": "vphsubsw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 07 /r"},
+ {"any": "vphsubw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 05 /r"},
+ {"any": "vpinsrb W:xmm, xmm, r32[7:0]/m8, imm8" , "op": "[RVM] VEX.128.66.0F3A.W0 20 /r ib"},
+ {"any": "vpinsrd W:xmm, xmm, r32/m32, imm8" , "op": "[RVM] VEX.128.66.0F3A.W0 22 /r ib"},
+ {"any": "vpinsrq W:xmm, xmm, r64/m64, imm8" , "op": "[RVM] VEX.128.66.0F3A.W1 22 /r ib"},
+ {"any": "vpinsrw W:xmm, xmm, r32[15:0]/m16, imm8" , "op": "[RVM] VEX.128.66.0F.W0 C4 /r ib"},
+ {"any": "vpmaddubsw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 04 /r"},
+ {"any": "vpmaddwd W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F5 /r"},
+ {"any": "vpmaxsb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 3C /r"},
+ {"any": "vpmaxsd W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 3D /r"},
+ {"any": "vpmaxsw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG EE /r"},
+ {"any": "vpmaxub W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG DE /r"},
+ {"any": "vpmaxud W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 3F /r"},
+ {"any": "vpmaxuw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 3E /r"},
+ {"any": "vpminsb W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 38 /r"},
+ {"any": "vpminsd W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 39 /r"},
+ {"any": "vpminsw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG EA /r"},
+ {"any": "vpminub W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG DA /r"},
+ {"any": "vpminud W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 3B /r"},
+ {"any": "vpminuw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 3A /r"},
+ {"any": "vpmovmskb W:r32[15:0], xmm" , "op": "[RVM] VEX.128.66.0F.WIG D7 /r"},
+ {"any": "vpmovsxwq W:xmm, xmm[31:0]/m32" , "op": "[RM ] VEX.128.66.0F38.WIG 24 /r"},
+ {"any": "vpmovsxbd W:xmm, xmm[31:0]/m32" , "op": "[RM ] VEX.128.66.0F38.WIG 21 /r"},
+ {"any": "vpmovsxbq W:xmm, xmm[15:0]/m16" , "op": "[RM ] VEX.128.66.0F38.WIG 22 /r"},
+ {"any": "vpmovsxbw W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.WIG 20 /r"},
+ {"any": "vpmovsxdq W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.WIG 25 /r"},
+ {"any": "vpmovsxwd W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.WIG 23 /r"},
+ {"any": "vpmovzxbd W:xmm, xmm[31:0]/m32" , "op": "[RM ] VEX.128.66.0F38.WIG 31 /r"},
+ {"any": "vpmovzxbq W:xmm, xmm[15:0]/m16" , "op": "[RM ] VEX.128.66.0F38.WIG 32 /r"},
+ {"any": "vpmovzxbw W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.WIG 30 /r"},
+ {"any": "vpmovzxdq W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.WIG 35 /r"},
+ {"any": "vpmovzxwd W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.WIG 33 /r"},
+ {"any": "vpmovzxwq W:xmm, xmm[31:0]/m32" , "op": "[RM ] VEX.128.66.0F38.WIG 34 /r"},
+ {"any": "vpmuldq W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 28 /r"},
+ {"any": "vpmulhrsw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 0B /r"},
+ {"any": "vpmulhuw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E4 /r"},
+ {"any": "vpmulhw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E5 /r"},
+ {"any": "vpmulld W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 40 /r"},
+ {"any": "vpmullw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D5 /r"},
+ {"any": "vpmuludq W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F4 /r"},
+ {"any": "vpor W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG EB /r"},
+ {"any": "vpsadbw W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F6 /r"},
+ {"any": "vpshufb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 00 /r"},
+ {"any": "vpshufd W:xmm, xmm/m128, imm8" , "op": "[RM ] VEX.128.66.0F.WIG 70 /r ib"},
+ {"any": "vpshufhw W:xmm, xmm/m128, imm8" , "op": "[RM ] VEX.128.F3.0F.WIG 70 /r ib"},
+ {"any": "vpshuflw W:xmm, xmm/m128, imm8" , "op": "[RM ] VEX.128.F2.0F.WIG 70 /r ib"},
+ {"any": "vpsignb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 08 /r"},
+ {"any": "vpsignd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 0A /r"},
+ {"any": "vpsignw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG 09 /r"},
+ {"any": "vpslld W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F2 /r"},
+ {"any": "vpslld W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 72 /6 ib"},
+ {"any": "vpslldq W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 73 /7 ib"},
+ {"any": "vpsllq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F3 /r"},
+ {"any": "vpsllq W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 73 /6 ib"},
+ {"any": "vpsllw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F1 /r"},
+ {"any": "vpsllw W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 71 /6 ib"},
+ {"any": "vpsrad W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E2 /r"},
+ {"any": "vpsrad W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 72 /4 ib"},
+ {"any": "vpsraw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E1 /r"},
+ {"any": "vpsraw W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 71 /4 ib"},
+ {"any": "vpsrld W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D2 /r"},
+ {"any": "vpsrld W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 72 /2 ib"},
+ {"any": "vpsrldq W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 73 /3 ib"},
+ {"any": "vpsrlq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D3 /r"},
+ {"any": "vpsrlq W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 73 /2 ib"},
+ {"any": "vpsrlw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D1 /r"},
+ {"any": "vpsrlw W:xmm, xmm, imm8" , "op": "[VM ] VEX.128.66.0F.WIG 71 /2 ib"},
+ {"any": "vpsubb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F8 /r"},
+ {"any": "vpsubd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG FA /r"},
+ {"any": "vpsubq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG FB /r"},
+ {"any": "vpsubsb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E8 /r"},
+ {"any": "vpsubsw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG E9 /r"},
+ {"any": "vpsubusb W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D8 /r"},
+ {"any": "vpsubusw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG D9 /r"},
+ {"any": "vpsubw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG F9 /r"},
+ {"any": "vptest R:~xy, ~xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F38.WIG 17 /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vpunpckhbw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 68 /r"},
+ {"any": "vpunpckhdq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 6A /r"},
+ {"any": "vpunpckhqdq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 6D /r"},
+ {"any": "vpunpckhwd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 69 /r"},
+ {"any": "vpunpcklbw W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 60 /r"},
+ {"any": "vpunpckldq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 62 /r"},
+ {"any": "vpunpcklqdq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 6C /r"},
+ {"any": "vpunpcklwd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG 61 /r"},
+ {"any": "vpxor W:xmm, ~xmm, ~xmm/m128" , "op": "[RVM] VEX.128.66.0F.WIG EF /r"},
+ {"any": "vrcpps W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.NP.0F.WIG 53 /r"},
+ {"any": "vrcpss W:xmm, xmm[127:32], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 53 /r"},
+ {"any": "vroundpd W:xy, xy/mxy, imm8" , "op": "[RM ] VEX.Lxy.66.0F3A.WIG 09 /r ib"},
+ {"any": "vroundps W:xy, xy/mxy, imm8" , "op": "[RM ] VEX.Lxy.66.0F3A.WIG 08 /r ib"},
+ {"any": "vroundsd W:xmm, xmm[127:64], xmm[63:0]/m64, imm8" , "op": "[RVM] VEX.LIG.66.0F3A.WIG 0B /r ib"},
+ {"any": "vroundss W:xmm, xmm[127:32], xmm[31:0]/m32, imm8" , "op": "[RVM] VEX.LIG.66.0F3A.WIG 0A /r ib"},
+ {"any": "vrsqrtps W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.NP.0F.WIG 52 /r"},
+ {"any": "vrsqrtss W:xmm, xmm[127:32], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 52 /r"},
+ {"any": "vshufpd W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F.WIG C6 /r ib"},
+ {"any": "vshufps W:xy, xy, xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.NP.0F.WIG C6 /r ib"},
+ {"any": "vsqrtpd W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F.WIG 51 /r"},
+ {"any": "vsqrtps W:xy, xy/mxy" , "op": "[RM ] VEX.Lxy.NP.0F.WIG 51 /r"},
+ {"any": "vsqrtsd W:xmm, xmm[127:64], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 51 /r"},
+ {"any": "vsqrtss W:xmm, xmm[127:32], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 51 /r"},
+ {"any": "vsubpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 5C /r"},
+ {"any": "vsubps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 5C /r"},
+ {"any": "vsubsd W:xmm, xmm, xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.F2.0F.WIG 5C /r"},
+ {"any": "vsubss W:xmm, xmm, xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.F3.0F.WIG 5C /r"},
+ {"any": "vtestpd R:~xy, ~xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F38.W0 0F /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vtestps R:~xy, ~xy/mxy" , "op": "[RM ] VEX.Lxy.66.0F38.W0 0E /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "vucomisd R:xmm[63:0], xmm[63:0]/m64" , "op": "[RM ] VEX.LIG.66.0F.WIG 2E /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vucomiss R:xmm[31:0], xmm[31:0]/m32" , "op": "[RM ] VEX.LIG.NP.0F.WIG 2E /r", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vunpckhpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 15 /r"},
+ {"any": "vunpckhps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 15 /r"},
+ {"any": "vunpcklpd W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 14 /r"},
+ {"any": "vunpcklps W:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 14 /r"},
+ {"any": "vxorpd W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F.WIG 57 /r"},
+ {"any": "vxorps W:xy, ~xy, ~xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F.WIG 57 /r"}
+ ]},
+
+ {"category": "AVX SIMD CRYPTO_HASH", "ext": "AVX AESNI", "instructions": [
+ {"any": "vaesdec W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG DE /r"},
+ {"any": "vaesdeclast W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG DF /r"},
+ {"any": "vaesenc W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG DC /r"},
+ {"any": "vaesenclast W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG DD /r"},
+ {"any": "vaesimc W:xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.WIG DB /r"},
+ {"any": "vaeskeygenassist W:xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG DF /r ib"}
+ ]},
+
+ {"category": "AVX SIMD CRYPTO_HASH", "ext": "VAES", "instructions": [
+ {"any": "vaesdec W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG DE /r"},
+ {"any": "vaesdeclast W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG DF /r"},
+ {"any": "vaesenc W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG DC /r"},
+ {"any": "vaesenclast W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG DD /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX GFNI", "instructions": [
+ {"any": "vgf2p8affineinvqb W:xy, R:xy, R:xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F3A.W1 CF /r ib"},
+ {"any": "vgf2p8affineqb W:xy, R:xy, R:xy/mxy, imm8" , "op": "[RVM] VEX.Lxy.66.0F3A.W1 CE /r ib"},
+ {"any": "vgf2p8mulb W:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 CF /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX2", "instructions": [
+ {"any": "vbroadcasti128 W:ymm, m128" , "op": "[RM ] VEX.256.66.0F38.W0 5A /r"},
+ {"any": "vbroadcastsd W:ymm, xmm[63:0]" , "op": "[RM ] VEX.256.66.0F38.W0 19 /r"},
+ {"any": "vbroadcastss W:xmm, xmm[31:0]" , "op": "[RM ] VEX.128.66.0F38.W0 18 /r"},
+ {"any": "vbroadcastss W:ymm, xmm[31:0]" , "op": "[RM ] VEX.256.66.0F38.W0 18 /r"},
+ {"any": "vextracti128 W:xmm/m128, ymm, imm8" , "op": "[MR ] VEX.256.66.0F3A.W0 39 /r ib"},
+ {"any": "vgatherdpd X:xmm, vm32x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W1 92 /r"},
+ {"any": "vgatherdpd X:ymm, vm32x, X:ymm" , "op": "[RMV] VEX.256.66.0F38.W1 92 /r"},
+ {"any": "vgatherdps X:xmm, vm32x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W0 92 /r"},
+ {"any": "vgatherdps X:ymm, vm32y, X:ymm" , "op": "[RMV] VEX.256.66.0F38.W0 92 /r"},
+ {"any": "vgatherqpd X:xmm, vm64x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W1 93 /r"},
+ {"any": "vgatherqpd X:ymm, vm64y, X:ymm" , "op": "[RMV] VEX.256.66.0F38.W1 93 /r"},
+ {"any": "vgatherqps X:xmm, vm64x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W0 93 /r"},
+ {"any": "vgatherqps X:xmm, vm64y, X:xmm" , "op": "[RMV] VEX.256.66.0F38.W0 93 /r"},
+ {"any": "vinserti128 W:ymm, ymm, xmm/m128, imm8" , "op": "[RVM] VEX.256.66.0F3A.W0 38 /r ib"},
+ {"any": "vmovntdqa W:ymm, m256" , "op": "[RM ] VEX.256.66.0F38.WIG 2A /r"},
+ {"any": "vmpsadbw W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.WIG 42 /r ib"},
+ {"any": "vpabsb W:ymm, ymm/m256" , "op": "[RM ] VEX.256.66.0F38.WIG 1C /r"},
+ {"any": "vpabsd W:ymm, ymm/m256" , "op": "[RM ] VEX.256.66.0F38.WIG 1E /r"},
+ {"any": "vpabsw W:ymm, ymm/m256" , "op": "[RM ] VEX.256.66.0F38.WIG 1D /r"},
+ {"any": "vpackssdw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 6B /r"},
+ {"any": "vpacksswb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 63 /r"},
+ {"any": "vpackusdw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 2B /r"},
+ {"any": "vpackuswb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 67 /r"},
+ {"any": "vpaddb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG FC /r"},
+ {"any": "vpaddd W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG FE /r"},
+ {"any": "vpaddq W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG D4 /r"},
+ {"any": "vpaddsb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG EC /r"},
+ {"any": "vpaddsw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG ED /r"},
+ {"any": "vpaddusb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG DC /r"},
+ {"any": "vpaddusw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG DD /r"},
+ {"any": "vpaddw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG FD /r"},
+ {"any": "vpalignr W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.WIG 0F /r ib"},
+ {"any": "vpand W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG DB /r"},
+ {"any": "vpandn W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG DF /r"},
+ {"any": "vpavgb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG E0 /r"},
+ {"any": "vpavgw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG E3 /r"},
+ {"any": "vpblendd W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.W0 02 /r ib"},
+ {"any": "vpblendd W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.W0 02 /r ib"},
+ {"any": "vpblendvb W:ymm, ymm, ymm/m256, ymm" , "op": "[RVMS]VEX.256.66.0F3A.W0 4C /r /is4"},
+ {"any": "vpblendw W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.WIG 0E /r ib"},
+ {"any": "vpbroadcastb W:xmm, xmm[7:0]/m8" , "op": "[RM ] VEX.128.66.0F38.W0 78 /r"},
+ {"any": "vpbroadcastb W:ymm, xmm[7:0]/m8" , "op": "[RM ] VEX.256.66.0F38.W0 78 /r"},
+ {"any": "vpbroadcastd W:xmm, xmm[31:0]/m32" , "op": "[RM ] VEX.128.66.0F38.W0 58 /r"},
+ {"any": "vpbroadcastd W:ymm, xmm[31:0]/m32" , "op": "[RM ] VEX.256.66.0F38.W0 58 /r"},
+ {"any": "vpbroadcastq W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.W0 59 /r"},
+ {"any": "vpbroadcastq W:ymm, xmm[63:0]/m64" , "op": "[RM ] VEX.256.66.0F38.W0 59 /r"},
+ {"any": "vpbroadcastw W:xmm, xmm[15:0]/m16" , "op": "[RM ] VEX.128.66.0F38.W0 79 /r"},
+ {"any": "vpbroadcastw W:ymm, xmm[15:0]/m16" , "op": "[RM ] VEX.256.66.0F38.W0 79 /r"},
+ {"any": "vpcmpeqb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 74 /r"},
+ {"any": "vpcmpeqd W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 76 /r"},
+ {"any": "vpcmpeqq W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 29 /r"},
+ {"any": "vpcmpeqw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 75 /r"},
+ {"any": "vpcmpgtb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 64 /r"},
+ {"any": "vpcmpgtd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 66 /r"},
+ {"any": "vpcmpgtq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 37 /r"},
+ {"any": "vpcmpgtw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 65 /r"},
+ {"any": "vperm2i128 W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.W0 46 /r ib"},
+ {"any": "vpermd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 36 /r"},
+ {"any": "vpermpd W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.66.0F3A.W1 01 /r ib"},
+ {"any": "vpermps W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 16 /r"},
+ {"any": "vpermq W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.66.0F3A.W1 00 /r ib"},
+ {"any": "vpgatherdd X:xmm, vm32x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W0 90 /r"},
+ {"any": "vpgatherdd X:ymm, vm32y, X:ymm" , "op": "[RMV] VEX.256.66.0F38.W0 90 /r"},
+ {"any": "vpgatherdq X:xmm, vm32x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W1 90 /r"},
+ {"any": "vpgatherdq X:ymm, vm32x, X:ymm" , "op": "[RMV] VEX.256.66.0F38.W1 90 /r"},
+ {"any": "vpgatherqd X:xmm, vm64x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W0 91 /r"},
+ {"any": "vpgatherqd X:xmm, vm64y, X:xmm" , "op": "[RMV] VEX.256.66.0F38.W0 91 /r"},
+ {"any": "vpgatherqq X:xmm, vm64x, X:xmm" , "op": "[RMV] VEX.128.66.0F38.W1 91 /r"},
+ {"any": "vpgatherqq X:ymm, vm64y, X:ymm" , "op": "[RMV] VEX.256.66.0F38.W1 91 /r"},
+ {"any": "vphaddd W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 02 /r"},
+ {"any": "vphaddsw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 03 /r"},
+ {"any": "vphaddw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 01 /r"},
+ {"any": "vphsubd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 06 /r"},
+ {"any": "vphsubsw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 07 /r"},
+ {"any": "vphsubw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 05 /r"},
+ {"any": "vpmaddubsw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 04 /r"},
+ {"any": "vpmaddwd W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG F5 /r"},
+ {"any": "vpmaskmovd X:m128, xmm, xmm" , "op": "[MVR] VEX.128.66.0F38.W0 8E /r"},
+ {"any": "vpmaskmovd X:m256, ymm, ymm" , "op": "[MVR] VEX.256.66.0F38.W0 8E /r"},
+ {"any": "vpmaskmovd W:xmm, xmm, m128" , "op": "[RVM] VEX.128.66.0F38.W0 8C /r"},
+ {"any": "vpmaskmovd W:ymm, ymm, m256" , "op": "[RVM] VEX.256.66.0F38.W0 8C /r"},
+ {"any": "vpmaskmovq X:m128, xmm, xmm" , "op": "[MVR] VEX.128.66.0F38.W1 8E /r"},
+ {"any": "vpmaskmovq X:m256, ymm, ymm" , "op": "[MVR] VEX.256.66.0F38.W1 8E /r"},
+ {"any": "vpmaskmovq W:xmm, xmm, m128" , "op": "[RVM] VEX.128.66.0F38.W1 8C /r"},
+ {"any": "vpmaskmovq W:ymm, ymm, m256" , "op": "[RVM] VEX.256.66.0F38.W1 8C /r"},
+ {"any": "vpmaxsb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 3C /r"},
+ {"any": "vpmaxsd W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 3D /r"},
+ {"any": "vpmaxsw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG EE /r"},
+ {"any": "vpmaxub W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG DE /r"},
+ {"any": "vpmaxud W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 3F /r"},
+ {"any": "vpmaxuw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 3E /r"},
+ {"any": "vpminsb W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 38 /r"},
+ {"any": "vpminsd W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 39 /r"},
+ {"any": "vpminsw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG EA /r"},
+ {"any": "vpminub W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG DA /r"},
+ {"any": "vpminud W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 3B /r"},
+ {"any": "vpminuw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 3A /r"},
+ {"any": "vpmovmskb W:r32[31:0], ymm" , "op": "[RVM] VEX.256.66.0F.WIG D7 /r"},
+ {"any": "vpmovsxbd W:ymm, xmm[63:0]/m64" , "op": "[RM ] VEX.256.66.0F38.WIG 21 /r"},
+ {"any": "vpmovsxbq W:ymm, xmm[31:0]/m32" , "op": "[RM ] VEX.256.66.0F38.WIG 22 /r"},
+ {"any": "vpmovsxbw W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.WIG 20 /r"},
+ {"any": "vpmovsxdq W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.WIG 25 /r"},
+ {"any": "vpmovsxwd W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.WIG 23 /r"},
+ {"any": "vpmovsxwq W:ymm, xmm[63:0]/m64" , "op": "[RM ] VEX.256.66.0F38.WIG 24 /r"},
+ {"any": "vpmovzxbd W:ymm, xmm[63:0]/m64" , "op": "[RM ] VEX.256.66.0F38.WIG 31 /r"},
+ {"any": "vpmovzxbq W:ymm, xmm[31:0]/m32" , "op": "[RM ] VEX.256.66.0F38.WIG 32 /r"},
+ {"any": "vpmovzxbw W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.WIG 30 /r"},
+ {"any": "vpmovzxdq W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.WIG 35 /r"},
+ {"any": "vpmovzxwd W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.WIG 33 /r"},
+ {"any": "vpmovzxwq W:ymm, xmm[63:0]/m64" , "op": "[RM ] VEX.256.66.0F38.WIG 34 /r"},
+ {"any": "vpmuldq W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 28 /r"},
+ {"any": "vpmulhrsw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 0B /r"},
+ {"any": "vpmulhuw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG E4 /r"},
+ {"any": "vpmulhw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG E5 /r"},
+ {"any": "vpmulld W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 40 /r"},
+ {"any": "vpmullw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG D5 /r"},
+ {"any": "vpmuludq W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG F4 /r"},
+ {"any": "vpor W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG EB /r"},
+ {"any": "vpsadbw W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG F6 /r"},
+ {"any": "vpshufb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 00 /r"},
+ {"any": "vpshufd W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.66.0F.WIG 70 /r ib"},
+ {"any": "vpshufhw W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.F3.0F.WIG 70 /r ib"},
+ {"any": "vpshuflw W:ymm, ymm/m256, imm8" , "op": "[RM ] VEX.256.F2.0F.WIG 70 /r ib"},
+ {"any": "vpsignb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 08 /r"},
+ {"any": "vpsignd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 0A /r"},
+ {"any": "vpsignw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.WIG 09 /r"},
+ {"any": "vpslld W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG F2 /r"},
+ {"any": "vpslld W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 72 /6 ib"},
+ {"any": "vpslldq W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 73 /7 ib"},
+ {"any": "vpsllq W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG F3 /r"},
+ {"any": "vpsllq W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 73 /6 ib"},
+ {"any": "vpsllvd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W0 47 /r"},
+ {"any": "vpsllvd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 47 /r"},
+ {"any": "vpsllvq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W1 47 /r"},
+ {"any": "vpsllvq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W1 47 /r"},
+ {"any": "vpsllw W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG F1 /r"},
+ {"any": "vpsllw W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 71 /6 ib"},
+ {"any": "vpsrad W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG E2 /r"},
+ {"any": "vpsrad W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 72 /4 ib"},
+ {"any": "vpsravd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W0 46 /r"},
+ {"any": "vpsravd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 46 /r"},
+ {"any": "vpsraw W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG E1 /r"},
+ {"any": "vpsraw W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 71 /4 ib"},
+ {"any": "vpsrld W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG D2 /r"},
+ {"any": "vpsrld W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 72 /2 ib"},
+ {"any": "vpsrldq W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 73 /3 ib"},
+ {"any": "vpsrlq W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG D3 /r"},
+ {"any": "vpsrlq W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 73 /2 ib"},
+ {"any": "vpsrlvd W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W0 45 /r"},
+ {"any": "vpsrlvd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W0 45 /r"},
+ {"any": "vpsrlvq W:xmm, xmm, xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W1 45 /r"},
+ {"any": "vpsrlvq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F38.W1 45 /r"},
+ {"any": "vpsrlw W:ymm, ymm, xmm/m128" , "op": "[RVM] VEX.256.66.0F.WIG D1 /r"},
+ {"any": "vpsrlw W:ymm, ymm, imm8" , "op": "[VM ] VEX.256.66.0F.WIG 71 /2 ib"},
+ {"any": "vpsubb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG F8 /r"},
+ {"any": "vpsubd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG FA /r"},
+ {"any": "vpsubq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG FB /r"},
+ {"any": "vpsubsb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG E8 /r"},
+ {"any": "vpsubsw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG E9 /r"},
+ {"any": "vpsubusb W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG D8 /r"},
+ {"any": "vpsubusw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG D9 /r"},
+ {"any": "vpsubw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG F9 /r"},
+ {"any": "vpunpckhbw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 68 /r"},
+ {"any": "vpunpckhdq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 6A /r"},
+ {"any": "vpunpckhqdq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 6D /r"},
+ {"any": "vpunpckhwd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 69 /r"},
+ {"any": "vpunpcklbw W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 60 /r"},
+ {"any": "vpunpckldq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 62 /r"},
+ {"any": "vpunpcklqdq W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 6C /r"},
+ {"any": "vpunpcklwd W:ymm, ymm, ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG 61 /r"},
+ {"any": "vpxor W:ymm, ~ymm, ~ymm/m256" , "op": "[RVM] VEX.256.66.0F.WIG EF /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "F16C", "instructions": [
+ {"any": "vcvtph2ps W:xmm, xmm[63:0]/m64" , "op": "[RM ] VEX.128.66.0F38.W0 13 /r"},
+ {"any": "vcvtph2ps W:ymm, xmm/m128" , "op": "[RM ] VEX.256.66.0F38.W0 13 /r"},
+ {"any": "vcvtps2ph W:xmm[63:0]/m64, xmm, imm8" , "op": "[MR ] VEX.128.66.0F3A.W0 1D /r ib"},
+ {"any": "vcvtps2ph W:xmm/m128, ymm, imm8" , "op": "[MR ] VEX.256.66.0F3A.W0 1D /r ib"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "FMA", "instructions": [
+ {"any": "vfmadd132pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 98 /r"},
+ {"any": "vfmadd132ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 98 /r"},
+ {"any": "vfmadd132sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 99 /r"},
+ {"any": "vfmadd132ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 99 /r"},
+ {"any": "vfmadd213pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 A8 /r"},
+ {"any": "vfmadd213ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 A8 /r"},
+ {"any": "vfmadd213sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 A9 /r"},
+ {"any": "vfmadd213ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 A9 /r"},
+ {"any": "vfmadd231pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 B8 /r"},
+ {"any": "vfmadd231ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 B8 /r"},
+ {"any": "vfmadd231sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 B9 /r"},
+ {"any": "vfmadd231ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 B9 /r"},
+ {"any": "vfmaddsub132pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 96 /r"},
+ {"any": "vfmaddsub132ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 96 /r"},
+ {"any": "vfmaddsub213pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 A6 /r"},
+ {"any": "vfmaddsub213ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 A6 /r"},
+ {"any": "vfmaddsub231pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 B6 /r"},
+ {"any": "vfmaddsub231ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 B6 /r"},
+ {"any": "vfmsub132pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 9A /r"},
+ {"any": "vfmsub132ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 9A /r"},
+ {"any": "vfmsub132sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 9B /r"},
+ {"any": "vfmsub132ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 9B /r"},
+ {"any": "vfmsub213pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 AA /r"},
+ {"any": "vfmsub213ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 AA /r"},
+ {"any": "vfmsub213sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 AB /r"},
+ {"any": "vfmsub213ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 AB /r"},
+ {"any": "vfmsub231pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 BA /r"},
+ {"any": "vfmsub231ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 BA /r"},
+ {"any": "vfmsub231sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 BB /r"},
+ {"any": "vfmsub231ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 BB /r"},
+ {"any": "vfmsubadd132pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 97 /r"},
+ {"any": "vfmsubadd132ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 97 /r"},
+ {"any": "vfmsubadd213pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 A7 /r"},
+ {"any": "vfmsubadd213ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 A7 /r"},
+ {"any": "vfmsubadd231pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 B7 /r"},
+ {"any": "vfmsubadd231ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 B7 /r"},
+ {"any": "vfnmadd132pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 9C /r"},
+ {"any": "vfnmadd132ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 9C /r"},
+ {"any": "vfnmadd132sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 9D /r"},
+ {"any": "vfnmadd132ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 9D /r"},
+ {"any": "vfnmadd213pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 AC /r"},
+ {"any": "vfnmadd213ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 AC /r"},
+ {"any": "vfnmadd213sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 AD /r"},
+ {"any": "vfnmadd213ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 AD /r"},
+ {"any": "vfnmadd231pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 BC /r"},
+ {"any": "vfnmadd231ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 BC /r"},
+ {"any": "vfnmadd231sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 BD /r"},
+ {"any": "vfnmadd231ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 BD /r"},
+ {"any": "vfnmsub132pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 9E /r"},
+ {"any": "vfnmsub132ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 9E /r"},
+ {"any": "vfnmsub132sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 9F /r"},
+ {"any": "vfnmsub132ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 9F /r"},
+ {"any": "vfnmsub213pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 AE /r"},
+ {"any": "vfnmsub213ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 AE /r"},
+ {"any": "vfnmsub213sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 AF /r"},
+ {"any": "vfnmsub213ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 AF /r"},
+ {"any": "vfnmsub231pd X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 BE /r"},
+ {"any": "vfnmsub231ps X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 BE /r"},
+ {"any": "vfnmsub231sd x:xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVM] VEX.LIG.66.0F38.W1 BF /r"},
+ {"any": "vfnmsub231ss x:xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVM] VEX.LIG.66.0F38.W0 BF /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "FMA4", "deprecated": true, "instructions": [
+ {"any": "vfmaddpd W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 69 /r /is4"},
+ {"any": "vfmaddpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 69 /r /is4"},
+ {"any": "vfmaddps W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 68 /r /is4"},
+ {"any": "vfmaddps W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 68 /r /is4"},
+ {"any": "vfmaddsd W:xmm[63:0], xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVSM] VEX.128.66.0F3A.W1 6b /r /is4"},
+ {"any": "vfmaddsd W:xmm[63:0], xmm[63:0], xmm[63:0]/m64, xmm[63:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 6b /r /is4"},
+ {"any": "vfmaddss W:xmm[31:0], xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVSM] VEX.128.66.0F3A.W1 6a /r /is4"},
+ {"any": "vfmaddss W:xmm[31:0], xmm[31:0], xmm[31:0]/m32, xmm[31:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 6a /r /is4"},
+ {"any": "vfmaddsubpd W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 5D /r /is4"},
+ {"any": "vfmaddsubpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 5D /r /is4"},
+ {"any": "vfmaddsubps W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 5C /r /is4"},
+ {"any": "vfmaddsubps W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 5C /r /is4"},
+ {"any": "vfmsubaddpd W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 5F /r /is4"},
+ {"any": "vfmsubaddpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 5F /r /is4"},
+ {"any": "vfmsubaddps W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 5E /r /is4"},
+ {"any": "vfmsubaddps W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 5E /r /is4"},
+ {"any": "vfmsubpd W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 6D /r /is4"},
+ {"any": "vfmsubpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 6D /r /is4"},
+ {"any": "vfmsubps W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 6C /r /is4"},
+ {"any": "vfmsubps W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 6C /r /is4"},
+ {"any": "vfmsubsd W:xmm[63:0], xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVSM] VEX.128.66.0F3A.W1 6F /r /is4"},
+ {"any": "vfmsubsd W:xmm[63:0], xmm[63:0], xmm[63:0]/m64, xmm[63:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 6F /r /is4"},
+ {"any": "vfmsubss W:xmm[31:0], xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVSM] VEX.128.66.0F3A.W1 6E /r /is4"},
+ {"any": "vfmsubss W:xmm[31:0], xmm[31:0], xmm[31:0]/m32, xmm[31:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 6E /r /is4"},
+ {"any": "vfnmaddpd W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 79 /r /is4"},
+ {"any": "vfnmaddpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 79 /r /is4"},
+ {"any": "vfnmaddps W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 78 /r /is4"},
+ {"any": "vfnmaddps W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 78 /r /is4"},
+ {"any": "vfnmaddsd W:xmm[63:0], xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVSM] VEX.128.66.0F3A.W1 7B /r /is4"},
+ {"any": "vfnmaddsd W:xmm[63:0], xmm[63:0], xmm[63:0]/m64, xmm[63:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 7B /r /is4"},
+ {"any": "vfnmaddss W:xmm[31:0], xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVSM] VEX.128.66.0F3A.W1 7A /r /is4"},
+ {"any": "vfnmaddss W:xmm[31:0], xmm[31:0], xmm[31:0]/m32, xmm[31:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 7A /r /is4"},
+ {"any": "vfnmsubpd W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 7D /r /is4"},
+ {"any": "vfnmsubpd W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 7D /r /is4"},
+ {"any": "vfnmsubps W:xy, xy, xy, xy/mxy" , "op": "[RVSM] VEX.Lxy.66.0F3A.W1 7C /r /is4"},
+ {"any": "vfnmsubps W:xy, xy, xy/mxy, xy" , "op": "[RVMS] VEX.Lxy.66.0F3A.W0 7C /r /is4"},
+ {"any": "vfnmsubsd W:xmm[63:0], xmm[63:0], xmm[63:0], xmm[63:0]/m64" , "op": "[RVSM] VEX.128.66.0F3A.W1 7F /r /is4"},
+ {"any": "vfnmsubsd W:xmm[63:0], xmm[63:0], xmm[63:0]/m64, xmm[63:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 7F /r /is4"},
+ {"any": "vfnmsubss W:xmm[31:0], xmm[31:0], xmm[31:0], xmm[31:0]/m32" , "op": "[RVSM] VEX.128.66.0F3A.W1 7E /r /is4"},
+ {"any": "vfnmsubss W:xmm[31:0], xmm[31:0], xmm[31:0]/m32, xmm[31:0]" , "op": "[RVMS] VEX.128.66.0F3A.W0 7E /r /is4"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "XOP", "deprecated": true, "instructions": [
+ {"any": "vfrczpd W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 81 /r"},
+ {"any": "vfrczpd W:ymm, ymm/m256" , "op": "[RM ] XOP.256.P0.MAP9.W0 81 /r"},
+ {"any": "vfrczps W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 80 /r"},
+ {"any": "vfrczps W:ymm, ymm/m256" , "op": "[RM ] XOP.256.P0.MAP9.W0 80 /r"},
+ {"any": "vfrczsd W:xmm[63:0], xmm[63:0]/m64" , "op": "[RM ] XOP.128.P0.MAP9.W0 83 /r"},
+ {"any": "vfrczss W:xmm[31:0], xmm[31:0]/m32" , "op": "[RM ] XOP.128.P0.MAP9.W0 82 /r"},
+ {"any": "vpcmov W:xmm, xmm, xmm, xmm/m128" , "op": "[RVSM]XOP.128.P0.MAP8.W1 A2 /r /is4"},
+ {"any": "vpcmov W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 A2 /r /is4"},
+ {"any": "vpcmov W:ymm, ymm, ymm, ymm/m256" , "op": "[RVSM]XOP.256.P0.MAP8.W1 A2 /r /is4"},
+ {"any": "vpcmov W:ymm, ymm, ymm/m256, ymm" , "op": "[RVMS]XOP.256.P0.MAP8.W0 A2 /r /is4"},
+ {"any": "vpcomb W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 CC /r ib"},
+ {"any": "vpcomd W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 CE /r ib"},
+ {"any": "vpcomq W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 CF /r ib"},
+ {"any": "vpcomub W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 EC /r ib"},
+ {"any": "vpcomud W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 EE /r ib"},
+ {"any": "vpcomuq W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 EF /r ib"},
+ {"any": "vpcomuw W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 ED /r ib"},
+ {"any": "vpcomw W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] XOP.128.P0.MAP8.W0 CD /r ib"},
+ {"any": "vpermil2pd W:xmm, xmm, xmm/m128, xmm, imm4" , "op": "[RVMS]VEX.128.66.0F3A.W0 49 /r /is4"},
+ {"any": "vpermil2pd W:xmm, xmm, xmm, xmm/m128, imm4" , "op": "[RVSM]VEX.128.66.0F3A.W1 49 /r /is4"},
+ {"any": "vpermil2pd W:ymm, ymm, ymm/m256, ymm, imm4" , "op": "[RVMS]VEX.256.66.0F3A.W0 49 /r /is4"},
+ {"any": "vpermil2pd W:ymm, ymm, ymm, ymm/m256, imm4" , "op": "[RVSM]VEX.256.66.0F3A.W1 49 /r /is4"},
+ {"any": "vpermil2ps W:xmm, xmm, xmm/m128, xmm, imm4" , "op": "[RVMS]VEX.128.66.0F3A.W0 48 /r /is4"},
+ {"any": "vpermil2ps W:xmm, xmm, xmm, xmm/m128, imm4" , "op": "[RVSM]VEX.128.66.0F3A.W1 48 /r /is4"},
+ {"any": "vpermil2ps W:ymm, ymm, ymm/m256, ymm, imm4" , "op": "[RVMS]VEX.256.66.0F3A.W0 48 /r /is4"},
+ {"any": "vpermil2ps W:ymm, ymm, ymm, ymm/m256, imm4" , "op": "[RVSM]VEX.256.66.0F3A.W1 48 /r /is4"},
+ {"any": "vphaddbd W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 C2 /r"},
+ {"any": "vphaddbq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 C3 /r"},
+ {"any": "vphaddbw W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 C1 /r"},
+ {"any": "vphadddq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 CB /r"},
+ {"any": "vphaddubd W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 D2 /r"},
+ {"any": "vphaddubq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 D3 /r"},
+ {"any": "vphaddubw W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 D1 /r"},
+ {"any": "vphaddudq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 DB /r"},
+ {"any": "vphadduwd W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 D6 /r"},
+ {"any": "vphadduwq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 D7 /r"},
+ {"any": "vphaddwd W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 C6 /r"},
+ {"any": "vphaddwq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 C7 /r"},
+ {"any": "vphsubbw W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 E1 /r"},
+ {"any": "vphsubdq W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 E3 /r"},
+ {"any": "vphsubwd W:xmm, xmm/m128" , "op": "[RM ] XOP.128.P0.MAP9.W0 E2 /r"},
+ {"any": "vpmacsdd W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 9E /r /is4"},
+ {"any": "vpmacsdqh W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 9F /r /is4"},
+ {"any": "vpmacsdql W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 97 /r /is4"},
+ {"any": "vpmacssdd W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 8E /r /is4"},
+ {"any": "vpmacssdqh W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 8F /r /is4"},
+ {"any": "vpmacssdql W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 87 /r /is4"},
+ {"any": "vpmacsswd W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 86 /r /is4"},
+ {"any": "vpmacssww W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 85 /r /is4"},
+ {"any": "vpmacswd W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 96 /r /is4"},
+ {"any": "vpmacsww W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 95 /r /is4"},
+ {"any": "vpmadcsswd W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 A6 /r /is4"},
+ {"any": "vpmadcswd W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 B6 /r /is4"},
+ {"any": "vpperm W:xmm, xmm, xmm, xmm/m128" , "op": "[RVSM]XOP.128.P0.MAP8.W1 A3 /r /is4"},
+ {"any": "vpperm W:xmm, xmm, xmm/m128, xmm" , "op": "[RVMS]XOP.128.P0.MAP8.W0 A3 /r /is4"},
+ {"any": "vprotb W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 90 /r"},
+ {"any": "vprotb W:xmm, xmm/m128, imm8" , "op": "[RM ] XOP.128.P0.MAP8.W0 C0 /r ib"},
+ {"any": "vprotb W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 90 /r"},
+ {"any": "vprotd W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 92 /r"},
+ {"any": "vprotd W:xmm, xmm/m128, imm8" , "op": "[RM ] XOP.128.P0.MAP8.W0 C2 /r ib"},
+ {"any": "vprotd W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 92 /r"},
+ {"any": "vprotq W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 93 /r"},
+ {"any": "vprotq W:xmm, xmm/m128, imm8" , "op": "[RM ] XOP.128.P0.MAP8.W0 C3 /r ib"},
+ {"any": "vprotq W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 93 /r"},
+ {"any": "vprotw W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 91 /r"},
+ {"any": "vprotw W:xmm, xmm/m128, imm8" , "op": "[RM ] XOP.128.P0.MAP8.W0 C1 /r ib"},
+ {"any": "vprotw W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 91 /r"},
+ {"any": "vpshab W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 98 /r"},
+ {"any": "vpshab W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 98 /r"},
+ {"any": "vpshad W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 9A /r"},
+ {"any": "vpshad W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 9A /r"},
+ {"any": "vpshaq W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 9B /r"},
+ {"any": "vpshaq W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 9B /r"},
+ {"any": "vpshaw W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 99 /r"},
+ {"any": "vpshaw W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 99 /r"},
+ {"any": "vpshlb W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 94 /r"},
+ {"any": "vpshlb W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 94 /r"},
+ {"any": "vpshld W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 96 /r"},
+ {"any": "vpshld W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 96 /r"},
+ {"any": "vpshlq W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 97 /r"},
+ {"any": "vpshlq W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 97 /r"},
+ {"any": "vpshlw W:xmm, xmm, xmm/m128" , "op": "[RVM] XOP.128.P0.MAP9.W1 95 /r"},
+ {"any": "vpshlw W:xmm, xmm/m128, xmm" , "op": "[RMV] XOP.128.P0.MAP9.W0 95 /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX PCLMULQDQ", "instructions": [
+ {"any": "vpclmulqdq W:xmm, xmm, xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.WIG 44 /r ib"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "VPCLMULQDQ", "instructions": [
+ {"any": "vpclmulqdq W:ymm, ymm, ymm/m256, imm8" , "op": "[RVM] VEX.256.66.0F3A.WIG 44 /r ib"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX_IFMA", "instructions": [
+ {"any": "vpmadd52huq X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 B5 /r"},
+ {"any": "vpmadd52luq X:xy, xy, xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W1 B4 /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX_NE_CONVERT", "instructions": [
+ {"any": "vbcstnebf162ps W:xy, m16" , "op": "[RM ] VEX.Lxy.F3.0F38.W0 B1 !(11):rrr:bbb"},
+ {"any": "vbcstnesh2ps W:xy, m16" , "op": "[RM ] VEX.Lxy.66.0F38.W0 B1 !(11):rrr:bbb"},
+ {"any": "vcvtneebf162ps W:xy, mxy" , "op": "[RM ] VEX.Lxy.F3.0F38.W0 B0 !(11):rrr:bbb"},
+ {"any": "vcvtneeph2ps W:xy, mxy" , "op": "[RM ] VEX.Lxy.66.0F38.W0 B0 !(11):rrr:bbb"},
+ {"any": "vcvtneobf162ps W:xy, mxy" , "op": "[RM ] VEX.Lxy.F2.0F38.W0 B0 !(11):rrr:bbb"},
+ {"any": "vcvtneoph2ps W:xy, mxy" , "op": "[RM ] VEX.Lxy.NP.0F38.W0 B0 !(11):rrr:bbb"},
+ {"any": "vcvtneps2bf16 W:xmm[63:0], xmm/m128" , "op": "[RM ] VEX.128.F3.0F38.W0 72 /r"},
+ {"any": "vcvtneps2bf16 W:xmm, ymm/m256" , "op": "[RM ] VEX.256.F3.0F38.W0 72 /r"}
+ ]},
+
+ {"category": "AVX SIMD CRYPTO_HASH", "ext": "AVX SHA512", "instructions": [
+ {"any": "vsha512msg1 X:ymm, R:xmm" , "op": "[RM ] VEX.256.F2.0F38.W0 CC 11:rrr:bbb"},
+ {"any": "vsha512msg2 X:ymm, R:ymm" , "op": "[RM ] VEX.256.F2.0F38.W0 CD 11:rrr:bbb"},
+ {"any": "vsha512rnds2 X:ymm, R:ymm, R:xmm" , "op": "[RVM] VEX.256.F2.0F38.W0 CB 11:rrr:bbb"}
+ ]},
+
+ {"category": "AVX SIMD CRYPTO_HASH", "ext": "AVX SM3", "instructions": [
+ {"any": "vsm3msg1 X:xmm, R:xmm, R:xmm/m128" , "op": "[RVM] VEX.128.NP.0F38.W0 DA /r"},
+ {"any": "vsm3msg2 X:xmm, R:xmm, R:xmm/m128" , "op": "[RVM] VEX.128.66.0F38.W0 DA /r"},
+ {"any": "vsm3rnds2 X:xmm, R:xmm, R:xmm/m128, imm8" , "op": "[RVM] VEX.128.66.0F3A.W0 DE /r ib"}
+ ]},
+
+ {"category": "AVX SIMD CRYPTO_HASH", "ext": "AVX SM4", "instructions": [
+ {"any": "vsm4key4 W:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F3.0F38.W0 DA /r"},
+ {"any": "vsm4rnds4 W:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F2.0F38.W0 DA /r"}
+ ]},
+
+ {"category": "AVX SIMD CRYPTO_HASH", "ext": "AVX10_2 SM4", "instructions": [
+ {"any": "vsm4key4 W:xyz, R:xyz, R:xyz/mxyz" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 DA /r"},
+ {"any": "vsm4rnds4 W:xyz, R:xyz, R:xyz/mxyz" , "op": "[RVM] EVEX.xyz.F2.0F38.W0 DA /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX_VNNI", "instructions": [
+ {"any": "vpdpbusd X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 50 /r"},
+ {"any": "vpdpbusds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 51 /r"},
+ {"any": "vpdpwssd X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 52 /r"},
+ {"any": "vpdpwssds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 53 /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX_VNNI_INT8", "instructions": [
+ {"any": "vpdpbssd X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F2.0F38.W0 50 /r"},
+ {"any": "vpdpbssds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F2.0F38.W0 51 /r"},
+ {"any": "vpdpbsud X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F3.0F38.W0 50 /r"},
+ {"any": "vpdpbsuds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F3.0F38.W0 51 /r"},
+ {"any": "vpdpbuud X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F38.W0 50 /r"},
+ {"any": "vpdpbuuds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F38.W0 51 /r"}
+ ]},
+
+ {"category": "AVX SIMD", "ext": "AVX_VNNI_INT16", "instructions": [
+ {"any": "vpdpwsud X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F3.0F38.W0 D2 /r"},
+ {"any": "vpdpwsuds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.F3.0F38.W0 D3 /r"},
+ {"any": "vpdpwusd X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 D2 /r"},
+ {"any": "vpdpwusds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.66.0F38.W0 D3 /r"},
+ {"any": "vpdpwuud X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F38.W0 D2 /r"},
+ {"any": "vpdpwuuds X:xy, R:xy, R:xy/mxy" , "op": "[RVM] VEX.Lxy.NP.0F38.W0 D3 /r"}
+ ]},
+
+ {"category": "AVX512 MASK", "ext": "AVX512_F", "instructions": [
+ {"any": "kandnw W:k[15:0], k[15:0], k[15:0]" , "op": "[RVM] VEX.L1.0F.W0 42 /r"},
+ {"any": "kandw W:k[15:0], ~k[15:0], ~k[15:0]" , "op": "[RVM] VEX.L1.0F.W0 41 /r"},
+ {"any": "kmovw W:k[15:0], k[15:0]/m16" , "op": "[RM ] VEX.L0.0F.W0 90 /r"},
+ {"apx": "kmovw W:k[15:0], k[15:0]/m16" , "op": "[RM ] EVEX.128.NP.0F.W0 90 /r"},
+ {"any": "kmovw W:k[15:0], r32[15:0]" , "op": "[RM ] VEX.L0.0F.W0 92 /r"},
+ {"apx": "kmovw W:k[15:0], r32[15:0]" , "op": "[RM ] EVEX.128.NP.0F.W0 92 11:rrr:bbb"},
+ {"any": "kmovw W:m16, k[15:0]" , "op": "[MR ] VEX.L0.0F.W0 91 /r"},
+ {"apx": "kmovw W:m16, k[15:0]" , "op": "[MR ] EVEX.128.NP.0F.W0 91 !(11):rrr:bbb"},
+ {"any": "kmovw W:r32[15:0], k[15:0]" , "op": "[RM ] VEX.L0.0F.W0 93 /r"},
+ {"apx": "kmovw W:r32[15:0], k[15:0]" , "op": "[RM ] EVEX.128.NP.0F.W0 93 11:rrr:bbb"},
+ {"any": "knotw W:k[15:0], k[15:0]" , "op": "[RM ] VEX.L0.0F.W0 44 /r"},
+ {"any": "kortestw R:~k[15:0], ~k[15:0]" , "op": "[RM ] VEX.L0.0F.W0 98 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "korw W:k[15:0], ~k[15:0], ~k[15:0]" , "op": "[RVM] VEX.L1.0F.W0 45 /r"},
+ {"any": "kshiftlw W:k[15:0], k[15:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W1 32 /r ib"},
+ {"any": "kshiftrw W:k[15:0], k[15:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W1 30 /r ib"},
+ {"any": "kunpckbw W:k[15:0], k[7:0], k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 4B /r"},
+ {"any": "kxnorw W:k[15:0], k[15:0], k[15:0]" , "op": "[RVM] VEX.L1.0F.W0 46 /r"},
+ {"any": "kxorw W:k[15:0], ~k[15:0], ~k[15:0]" , "op": "[RVM] VEX.L1.0F.W0 47 /r"}
+ ]},
+
+ {"category": "AVX512 MASK", "ext": "AVX512_DQ", "instructions": [
+ {"any": "kaddb W:k[7:0], ~k[7:0], ~k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 4A /r"},
+ {"any": "kaddw W:k[15:0], ~k[15:0], ~k[15:0]" , "op": "[RVM] VEX.L1.NP.0F.W0 4A /r"},
+ {"any": "kandb W:k[7:0], ~k[7:0], ~k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 41 /r"},
+ {"any": "kandnb W:k[7:0], k[7:0], k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 42 /r"},
+ {"any": "kmovb W:k[7:0], k[7:0]/m8" , "op": "[RM ] VEX.L0.66.0F.W0 90 /r"},
+ {"apx": "kmovb W:k[7:0], k[7:0]/m8" , "op": "[RM ] EVEX.128.66.0F.W0 90 /r"},
+ {"any": "kmovb W:k[7:0], r32[7:0]" , "op": "[RM ] VEX.L0.66.0F.W0 92 /r"},
+ {"apx": "kmovb W:k[7:0], r32[7:0]" , "op": "[RM ] EVEX.128.66.0F.W0 92 11:rrr:bbb"},
+ {"any": "kmovb W:m8, k[7:0]" , "op": "[MR ] VEX.L0.66.0F.W0 91 /r"},
+ {"apx": "kmovb W:m8, k[7:0]" , "op": "[MR ] EVEX.128.66.0F.W0 91 !(11):rrr:bbb"},
+ {"any": "kmovb W:r32[7:0], k[7:0]" , "op": "[RM ] VEX.L0.66.0F.W0 93 /r"},
+ {"apx": "kmovb W:r32[7:0], k[7:0]" , "op": "[RM ] EVEX.128.66.0F.W0 93 11:rrr:bbb"},
+ {"any": "knotb W:k[7:0], k[7:0]" , "op": "[RM ] VEX.L0.66.0F.W0 44 /r"},
+ {"any": "korb W:k[7:0], ~k[7:0], ~k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 45 /r"},
+ {"any": "kortestb R:~k[7:0], ~k[7:0]" , "op": "[RM ] VEX.L0.66.0F.W0 98 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "kshiftlb W:k[7:0], k[7:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W0 32 /r ib"},
+ {"any": "kshiftrb W:k[7:0], k[7:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W0 30 /r ib"},
+ {"any": "ktestb R:~k[7:0], ~k[7:0]" , "op": "[RM ] VEX.L0.66.0F.W0 99 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "ktestw R:~k[15:0], ~k[15:0]" , "op": "[RM ] VEX.L0.NP.0F.W0 99 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "kxnorb W:k[7:0], k[7:0], k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 46 /r"},
+ {"any": "kxorb W:k[7:0], ~k[7:0], ~k[7:0]" , "op": "[RVM] VEX.L1.66.0F.W0 47 /r"}
+ ]},
+
+ {"category": "AVX512 MASK", "ext": "AVX512_BW", "instructions": [
+ {"any": "kaddd W:k[31:0], ~k[31:0], ~k[31:0]" , "op": "[RVM] VEX.L1.66.0F.W1 4A /r"},
+ {"any": "kaddq W:k[63:0], ~k[63:0], ~k[63:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 4A /r"},
+ {"any": "kandd W:k[31:0], ~k[31:0], ~k[31:0]" , "op": "[RVM] VEX.L1.66.0F.W1 41 /r"},
+ {"any": "kandnd W:k[31:0], k[31:0], k[31:0]" , "op": "[RVM] VEX.L1.66.0F.W1 42 /r"},
+ {"any": "kandnq W:k[63:0], k[63:0], k[63:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 42 /r"},
+ {"any": "kandq W:k[63:0], ~k[63:0], ~k[63:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 41 /r"},
+ {"any": "kmovd W:k[31:0], k[31:0]/m32" , "op": "[RM ] VEX.L0.66.0F.W1 90 /r"},
+ {"apx": "kmovd W:k[31:0], k[31:0]/m32" , "op": "[RM ] EVEX.128.66.0F.W1 90 /r"},
+ {"any": "kmovd W:k[31:0], r32" , "op": "[RM ] VEX.L0.F2.0F.W0 92 /r"},
+ {"apx": "kmovd W:k[31:0], r32" , "op": "[RM ] EVEX.128.F2.0F.W0 92 11:rrr:bbb"},
+ {"any": "kmovd W:m32, k[31:0]" , "op": "[MR ] VEX.L0.66.0F.W1 91 /r"},
+ {"apx": "kmovd W:m32, k[31:0]" , "op": "[MR ] EVEX.128.66.0F.W1 91 !(11):rrr:bbb"},
+ {"any": "kmovd W:r32, k[31:0]" , "op": "[RM ] VEX.L0.F2.0F.W0 93 /r"},
+ {"apx": "kmovd W:r32, k[31:0]" , "op": "[RM ] EVEX.128.F2.0F.W0 93 11:rrr:bbb"},
+ {"any": "kmovq W:k[63:0], k[63:0]/m64" , "op": "[RM ] VEX.L0.NP.0F.W1 90 /r"},
+ {"apx": "kmovq W:k[63:0], k[63:0]/m64" , "op": "[RM ] EVEX.128.NP.0F.W1 90 /r"},
+ {"any": "kmovq W:k[63:0], r64" , "op": "[RM ] VEX.L0.F2.0F.W1 92 /r"},
+ {"apx": "kmovq W:k[63:0], r64" , "op": "[RM ] EVEX.128.F2.0F.W1 92 11:rrr:bbb"},
+ {"any": "kmovq W:m64, k[63:0]" , "op": "[MR ] VEX.L0.NP.0F.W1 91 /r"},
+ {"apx": "kmovq W:m64, k[63:0]" , "op": "[MR ] EVEX.128.NP.0F.W1 91 !(11):rrr:bbb"},
+ {"any": "kmovq W:r64, k[63:0]" , "op": "[RM ] VEX.L0.F2.0F.W1 93 /r"},
+ {"apx": "kmovq W:r64, k[63:0]" , "op": "[RM ] EVEX.128.F2.0F.W1 93 11:rrr:bbb"},
+ {"any": "knotd W:k[31:0], k[31:0]" , "op": "[RM ] VEX.L0.66.0F.W1 44 /r"},
+ {"any": "knotq W:k[63:0], k[63:0]" , "op": "[RM ] VEX.L0.NP.0F.W1 44 /r"},
+ {"any": "kord W:k[31:0], ~k[31:0], ~k[31:0]" , "op": "[RVM] VEX.L1.66.0F.W1 45 /r"},
+ {"any": "korq W:k[63:0], ~k[63:0], ~k[63:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 45 /r"},
+ {"any": "kortestd R:~k[31:0], ~k[31:0]" , "op": "[RM ] VEX.L0.66.0F.W1 98 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "kortestq R:~k[63:0], ~k[63:0]" , "op": "[RM ] VEX.L0.NP.0F.W1 98 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "kshiftld W:k[31:0], k[31:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W0 33 /r ib"},
+ {"any": "kshiftlq W:k[63:0], k[63:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W1 33 /r ib"},
+ {"any": "kshiftrd W:k[31:0], k[31:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W0 31 /r ib"},
+ {"any": "kshiftrq W:k[63:0], k[63:0], imm8" , "op": "[RM ] VEX.L0.66.0F3A.W1 31 /r ib"},
+ {"any": "ktestd R:~k[31:0], ~k[31:0]" , "op": "[RM ] VEX.L0.66.0F.W1 99 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "ktestq R:~k[63:0], ~k[63:0]" , "op": "[RM ] VEX.L0.NP.0F.W1 99 /r" , "io": "OF=0 SF=0 ZF=W AF=0 PF=0 CF=W"},
+ {"any": "kunpckdq W:k[63:0], k[31:0], k[31:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 4B /r"},
+ {"any": "kunpckwd W:k[31:0], k[15:0], k[15:0]" , "op": "[RVM] VEX.L1.NP.0F.W0 4B /r"},
+ {"any": "kxnord W:k[31:0], k[31:0], k[31:0]" , "op": "[RVM] VEX.L1.66.0F.W1 46 /r"},
+ {"any": "kxnorq W:k[63:0], k[63:0], k[63:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 46 /r"},
+ {"any": "kxord W:k[31:0], ~k[31:0], ~k[31:0]" , "op": "[RVM] VEX.L1.66.0F.W1 47 /r"},
+ {"any": "kxorq W:k[63:0], ~k[63:0], ~k[63:0]" , "op": "[RVM] VEX.L1.NP.0F.W1 47 /r"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_F", "instructions": [
+ {"any": "vaddpd W:xyz {kz}, ~xyz, ~xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F.W1 58 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vaddps W:xyz {kz}, ~xyz, ~xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.NP.0F.W0 58 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vaddsd W:xmm {kz}, xmm, xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 58 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vaddss W:xmm {kz}, xmm, xmm[31:0]/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 58 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "valignd W:xyz {kz}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 03 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "valignq W:xyz {kz}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 03 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vblendmpd W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 65 /r" , "tt": "fv" , "vl": "xy", "k": "blend"},
+ {"any": "vblendmps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 65 /r" , "tt": "fv" , "vl": "xy", "k": "blend"},
+ {"any": "vbroadcastf32x4 W:ymm {kz}, m128" , "op": "[RM ] EVEX.256.66.0F38.W0 1A /r" , "tt": "t4" , "vl": "xy"},
+ {"any": "vbroadcastf32x4 W:zmm {kz}, m128" , "op": "[RM ] EVEX.512.66.0F38.W0 1A /r" , "tt": "t4" , "vl": "xy"},
+ {"any": "vbroadcastf64x4 W:zmm {kz}, m256" , "op": "[RM ] EVEX.512.66.0F38.W1 1B /r" , "tt": "t4" , "vl": "xy"},
+ {"any": "vbroadcasti32x4 W:ymm {kz}, m128" , "op": "[RM ] EVEX.256.66.0F38.W0 5A /r" , "tt": "t4" , "vl": "xy"},
+ {"any": "vbroadcasti32x4 W:zmm {kz}, m128" , "op": "[RM ] EVEX.512.66.0F38.W0 5A /r" , "tt": "t4" , "vl": "xy"},
+ {"any": "vbroadcasti64x4 W:zmm {kz}, m256" , "op": "[RM ] EVEX.512.66.0F38.W1 5B /r" , "tt": "t4" , "vl": "xy"},
+ {"any": "vbroadcastsd W:ymm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.256.66.0F38.W1 19 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vbroadcastsd W:zmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.512.66.0F38.W1 19 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vbroadcastss W:xyz {kz}, xmm[31:0]/m32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 18 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vcmppd W:k {k}, xyz, xyz/mxyz/b64, imm8 {sae}" , "op": "[RVM] EVEX.xyz.66.0F.W1 C2 /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vcmpps W:k {k}, xyz, xyz/mxyz/b32, imm8 {sae}" , "op": "[RVM] EVEX.xyz.NP.0F.W0 C2 /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vcmpsd W:k {k}, xmm, xmm[63:0]/m64, imm8 {sae}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 C2 /r ib" , "tt": "t1s" , "vl": "no", "k": "zeroing"},
+ {"any": "vcmpss W:k {k}, xmm, xmm[31:0]/m32, imm8 {sae}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 C2 /r ib" , "tt": "t1s" , "vl": "no", "k": "zeroing"},
+ {"any": "vcomisd R:xmm[63:0], xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.66.0F.W1 2F /r" , "tt": "t1s" , "vl": "no", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcomiss R:xmm[31:0], xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.NP.0F.W0 2F /r" , "tt": "t1s" , "vl": "no", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcompresspd W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F38.W1 8A /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vcompressps W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F38.W0 8A /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vcvtdq2pd W:xyz {kz}, xxy/mxxy/b32" , "op": "[RM ] EVEX.xyz.F3.0F.W0 E6 /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtdq2ps W:xyz {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.NP.0F.W0 5B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtpd2ps W:xxy {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W1 5A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtpd2dq W:xxy {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.F2.0F.W1 E6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtpd2udq W:xxy {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.NP.0F.W1 79 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtph2ps W:xyz {kz}, xxy/mxxy {sae}" , "op": "[RM ] EVEX.xyz.66.0F38.W0 13 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vcvtps2dq W:xyz {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W0 5B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtps2pd W:xyz {kz}, xxy/mxxy/b32 {er}" , "op": "[RM ] EVEX.xyz.NP.0F.W0 5A /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtps2ph W:xxy/mxxy {kz}, xyz, imm8 {sae}" , "op": "[MR ] EVEX.xyz.66.0F3A.W0 1D /r ib" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vcvtps2udq W:xyz {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.NP.0F.W0 79 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtsd2si W:ry, xmm[63:0]/m64 {er}" , "op": "[RM ] EVEX.LIG.F2.0F.Wy 2D /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvtsd2ss W:xmm {kz}, xmm[127:32], xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 5A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsd2usi W:ry, xmm[63:0]/m64 {er}" , "op": "[RM ] EVEX.LIG.F2.0F.Wy 79 /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvtsi2sd W:xmm, xmm[127:64], ry/my {er}" , "op": "[RVM] EVEX.LIG.F2.0F.Wy 2A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsi2ss W:xmm, xmm[127:32], ry/my {er}" , "op": "[RVM] EVEX.LIG.F3.0F.Wy 2A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtss2sd W:xmm {kz}, xmm[127:64], xmm[31:0]/m32 {sae}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 5A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtss2si W:ry, xmm[31:0]/m32 {er}" , "op": "[RM ] EVEX.LIG.F3.0F.Wy 2D /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvtss2usi W:ry, xmm[31:0]/m32 {er}" , "op": "[RM ] EVEX.LIG.F3.0F.Wy 79 /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvttpd2dq W:xxy {kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.66.0F.W1 E6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttpd2qq W:xyz {kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.66.0F.W1 7A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttpd2udq W:xxy {kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.NP.0F.W1 78 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttps2dq W:xyz {kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.F3.0F.W0 5B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttps2udq W:xyz {kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.NP.0F.W0 78 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttsd2si W:ry, xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.F2.0F.Wy 2C /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvttsd2usi W:ry, xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.F2.0F.Wy 78 /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvttss2si W:ry, xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.F3.0F.Wy 2C /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvttss2usi W:ry, xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.F3.0F.Wy 78 /r" , "tt": "t1f" , "vl": "no"},
+ {"any": "vcvtudq2pd W:xyz {kz}, xxy/mxxy/b32 {er}" , "op": "[RM ] EVEX.xyz.F3.0F.W0 7A /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtudq2ps W:xyz {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.F2.0F.W0 7A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtusi2sd W:xmm, xmm[127:64], ry/my {er}" , "op": "[RVM] EVEX.LIG.F2.0F.Wy 7B /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtusi2ss W:xmm, xmm[127:32], ry/my {er}" , "op": "[RVM] EVEX.LIG.F3.0F.Wy 7B /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vdivpd W:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F.W1 5E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vdivps W:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.NP.0F.W0 5E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vdivsd W:xmm {kz}, xmm, xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 5E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vdivss W:xmm {kz}, xmm, xmm[31:0]/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 5E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vexpandpd W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W1 88 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vexpandps W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W0 88 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vextractf32x4 W:xmm/m128 {kz}, ymm, imm8" , "op": "[MR ] EVEX.256.66.0F3A.W0 19 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vextractf32x4 W:xmm/m128 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W0 19 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vextractf64x4 W:ymm/m256 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W1 1B /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vextracti32x4 W:xmm/m128 {kz}, ymm, imm8" , "op": "[MR ] EVEX.256.66.0F3A.W0 39 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vextracti32x4 W:xmm/m128 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W0 39 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vextracti64x4 W:ymm/m256 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W1 3B /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vextractps W:r32[31:0]/m32, xmm, imm8" , "op": "[MR ] EVEX.128.66.0F3A.WIG 17 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfixupimmpd X:xyz {kz}, xyz, xyz/mxyz/b64, imm8 {sae}" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 54 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfixupimmps X:xyz {kz}, xyz, xyz/mxyz/b32, imm8 {sae}" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 54 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfixupimmsd X:xmm {kz},xmm[127:64],xmm[63:0]/m64,imm8 {sae}", "op": "[RVM] EVEX.LIG.66.0F3A.W1 55 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfixupimmss X:xmm {kz},xmm[127:32],xmm[31:0]/m32,imm8 {sae}", "op": "[RVM] EVEX.LIG.66.0F3A.W0 55 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 98 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd132ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 98 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd132sd x:xmm[63:0] {kz}, xmm[63:0], xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 99 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd132ss x:xmm[31:0] {kz}, xmm[31:0], xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 99 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd213pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 A8 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd213ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 A8 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd213sd x:xmm[63:0] {kz}, xmm[63:0], xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 A9 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd213ss x:xmm[31:0] {kz}, xmm[31:0], xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 A9 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd231pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 B8 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd231ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 B8 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd231sd x:xmm[63:0] {kz}, xmm[63:0], xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 B9 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd231ss x:xmm[31:0] {kz}, xmm[31:0], xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 B9 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmaddsub132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 96 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub132ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 96 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub213pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 A6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub213ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 A6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub231pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 B6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub231ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 B6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 9A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub132ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 9A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub132sd x:xmm[63:0] {kz}, xmm[63:0], xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 9B /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub132ss x:xmm[31:0] {kz}, xmm[31:0], xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 9B /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub213pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 AA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub213ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 AA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub213sd x:xmm[63:0] {kz}, xmm[63:0], xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 AB /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub213ss x:xmm[31:0] {kz}, xmm[31:0], xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 AB /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub231pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 BA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub231ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 BA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub231sd x:xmm[63:0] {kz}, xmm[63:0], xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 BB /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub231ss x:xmm[31:0] {kz}, xmm[31:0], xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 BB /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsubadd132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 97 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd132ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 97 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd213pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 A7 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd213ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 A7 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd231pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 B7 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd231ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 B7 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 9C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd132ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 9C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd132sd x:xmm[63:0] {kz}, xmm[63:0],xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 9D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd132ss x:xmm[31:0] {kz}, xmm[31:0],xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 9D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd213pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 AC /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd213ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 AC /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd213sd x:xmm[63:0] {kz}, xmm[63:0],xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 AD /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd213ss x:xmm[31:0] {kz}, xmm[31:0],xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 AD /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd231pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 BC /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd231ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 BC /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd231sd x:xmm[63:0] {kz}, xmm[63:0],xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 BD /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd231ss x:xmm[31:0] {kz}, xmm[31:0],xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 BD /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 9E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub132ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 9E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub132sd x:xmm[63:0] {kz}, xmm[63:0],xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 9F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub132ss x:xmm[31:0] {kz}, xmm[31:0],xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 9F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub213pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 AE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub213ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 AE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub213sd x:xmm[63:0] {kz}, xmm[63:0],xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 AF /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub213ss x:xmm[31:0] {kz}, xmm[31:0],xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 AF /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub231pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 BE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub231ps X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 BE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub231sd X:xmm[63:0] {kz}, xmm[63:0],xmm[63:0]/m64 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W1 BF /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub231ss X:xmm[31:0] {kz}, xmm[31:0],xmm[31:0]/m32 {er}", "op": "[RVM] EVEX.LIG.66.0F38.W0 BF /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vgatherdpd X:xmm {k}, vm32x" , "op": "[RM ] EVEX.128.66.0F38.W1 92 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherdpd X:ymm {k}, vm32x" , "op": "[RM ] EVEX.256.66.0F38.W1 92 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherdpd X:zmm {k}, vm32y" , "op": "[RM ] EVEX.512.66.0F38.W1 92 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherdps X:xmm {k}, vm32x" , "op": "[RM ] EVEX.128.66.0F38.W0 92 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherdps X:ymm {k}, vm32y" , "op": "[RM ] EVEX.256.66.0F38.W0 92 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherdps X:zmm {k}, vm32z" , "op": "[RM ] EVEX.512.66.0F38.W0 92 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherqpd X:xmm {k}, vm64x" , "op": "[RM ] EVEX.128.66.0F38.W1 93 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherqpd X:ymm {k}, vm64y" , "op": "[RM ] EVEX.256.66.0F38.W1 93 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherqpd X:zmm {k}, vm64z" , "op": "[RM ] EVEX.512.66.0F38.W1 93 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherqps X:xmm {k}, vm64x" , "op": "[RM ] EVEX.128.66.0F38.W0 93 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherqps X:xmm {k}, vm64y" , "op": "[RM ] EVEX.256.66.0F38.W0 93 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgatherqps X:ymm {k}, vm64z" , "op": "[RM ] EVEX.512.66.0F38.W0 93 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vgetexppd W:xyz {kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.66.0F38.W1 42 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vgetexpps W:xyz {kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.0F38.W0 42 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vgetexpsd W:xmm {kz}, xmm[127:64], xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.66.0F38.W1 43 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vgetexpss W:xmm {kz}, xmm[127:32], xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.66.0F38.W0 43 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vgetmantpd W:xyz {kz}, xyz/mxyz/b64, imm8 {sae}" , "op": "[RM ] EVEX.xyz.66.0F3A.W1 26 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vgetmantps W:xyz {kz}, xyz/mxyz/b32, imm8 {sae}" , "op": "[RM ] EVEX.xyz.66.0F3A.W0 26 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vgetmantsd W:xmm {kz}, xmm[127:64],xmm[63:0]/m64,imm8 {sae}", "op": "[RM ] EVEX.LIG.66.0F3A.W1 27 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vgetmantss W:xmm {kz}, xmm[127:32],xmm[31:0]/m32,imm8 {sae}", "op": "[RM ] EVEX.LIG.66.0F3A.W0 27 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vinsertf32x4 W:ymm {kz}, ymm, xmm/m128, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W0 18 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vinsertf32x4 W:zmm {kz}, zmm, xmm/m128, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W0 18 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vinsertf64x4 W:zmm {kz}, zmm, ymm/m256, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W1 1A /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vinserti32x4 W:ymm {kz}, ymm, xmm/m128, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W0 38 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vinserti32x4 W:zmm {kz}, zmm, xmm/m128, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W0 38 /r ib" , "tt": "t4" , "vl": "xy"},
+ {"any": "vinserti64x4 W:zmm {kz}, zmm, ymm/m256, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W1 3A /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vinsertps W:xmm, xmm, xmm[31:0]/m32, imm8" , "op": "[RVM] EVEX.128.66.0F3A.W0 21 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmaxpd W:xyz {kz}, xyz, xyz/mxyz/b64 {sae}" , "op": "[RVM] EVEX.xyz.66.0F.W1 5F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vmaxps W:xyz {kz}, xyz, xyz/mxyz/b32 {sae}" , "op": "[RVM] EVEX.xyz.NP.0F.W0 5F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vmaxsd W:xmm {kz}, xmm, xmm[63:0]/m64 {sae}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 5F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmaxss W:xmm {kz}, xmm, xmm[31:0]/m32 {sae}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 5F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vminpd W:xyz {kz}, xyz, xyz/mxyz/b64 {sae}" , "op": "[RVM] EVEX.xyz.66.0F.W1 5D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vminps W:xyz {kz}, xyz, xyz/mxyz/b32 {sae}" , "op": "[RVM] EVEX.xyz.NP.0F.W0 5D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vminsd W:xmm {kz}, xmm, xmm[63:0]/m64 {sae}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 5D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vminss W:xmm {kz}, xmm, xmm[31:0]/m32 {sae}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 5D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovapd W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F.W1 28 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovapd W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W1 29 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovaps W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.NP.0F.W0 28 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovaps W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.NP.0F.W0 29 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovd W:r32/m32, xmm[31:0]" , "op": "[MR ] EVEX.128.66.0F.W0 7E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovd W:xmm[31:0], r32/m32" , "op": "[RM ] EVEX.128.66.0F.W0 6E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovddup W:xmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.128.F2.0F.W1 12 /r" , "tt": "movddup", "vl": "xy"},
+ {"any": "vmovddup W:ymm {kz}, ymm/m256" , "op": "[RM ] EVEX.256.F2.0F.W1 12 /r" , "tt": "movddup", "vl": "xy"},
+ {"any": "vmovddup W:zmm {kz}, zmm/m512" , "op": "[RM ] EVEX.512.F2.0F.W1 12 /r" , "tt": "movddup", "vl": "xy"},
+ {"any": "vmovdqa32 W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F.W0 6F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqa32 W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W0 7F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqa64 W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F.W1 6F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqa64 W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W1 7F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu32 W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.F3.0F.W0 6F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu32 W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F.W0 7F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu64 W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.F3.0F.W1 6F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu64 W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F.W1 7F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovhlps W:xmm, xmm[127:64], xmm[127:64]" , "op": "[RVM] EVEX.128.NP.0F.W0 12 /r" , "tt": "none" , "vl": "no"},
+ {"any": "vmovhpd W:m64, xmm[127:64]" , "op": "[MR ] EVEX.128.66.0F.W1 17 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovhpd W:xmm, xmm[63:0], m64" , "op": "[RVM] EVEX.128.66.0F.W1 16 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovhps W:m64, xmm[127:64]" , "op": "[MR ] EVEX.128.NP.0F.W0 17 /r" , "tt": "t2" , "vl": "no"},
+ {"any": "vmovhps W:xmm, xmm[63:0], m64" , "op": "[RVM] EVEX.128.NP.0F.W0 16 /r" , "tt": "t2" , "vl": "no"},
+ {"any": "vmovlhps W:xmm, xmm[63:0], xmm[63:0]" , "op": "[RVM] EVEX.128.NP.0F.W0 16 /r" , "tt": "none" , "vl": "no"},
+ {"any": "vmovlpd W:m64, xmm[63:0]" , "op": "[MR ] EVEX.128.66.0F.W1 13 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovlpd W:xmm, xmm[127:64], m64" , "op": "[RVM] EVEX.128.66.0F.W1 12 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovlps W:m64, xmm[63:0]" , "op": "[MR ] EVEX.128.NP.0F.W0 13 /r" , "tt": "t2" , "vl": "no"},
+ {"any": "vmovlps W:xmm, xmm[127:64], m64" , "op": "[RVM] EVEX.128.NP.0F.W0 12 /r" , "tt": "t2" , "vl": "no"},
+ {"any": "vmovntdq W:mxyz, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W0 E7 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovntdqa W:xyz, mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W0 2A /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovntpd W:mxyz, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W1 2B /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovntps W:mxyz, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W0 2B /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovq W:r64/m64, xmm[63:0]" , "op": "[MR ] EVEX.128.66.0F.W1 7E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovq W:xmm[63:0], r64/m64" , "op": "[RM ] EVEX.128.66.0F.W1 6E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovq W:xmm[63:0], xmm[63:0]/m64" , "op": "[RM ] EVEX.128.F3.0F.W1 7E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovq W:xmm[63:0]/m64, xmm[63:0]" , "op": "[MR ] EVEX.128.66.0F.W1 D6 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsd W:m64, xmm[63:0]" , "op": "[MR ] EVEX.LIG.F2.0F.W1 11 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsd W:xmm[63:0] {kz}, m64" , "op": "[MR ] EVEX.LIG.F2.0F.W1 10 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsd W:xmm {kz}, xmm[127:64], xmm[63:0]" , "op": "[MVR] EVEX.LIG.F2.0F.W1 11 /r" , "tt": "none" , "vl": "no"},
+ {"any": "vmovsd W:xmm {kz}, xmm[127:64], xmm[63:0]" , "op": "[RVM] EVEX.LIG.F2.0F.W1 10 /r" , "tt": "none" , "vl": "no"},
+ {"any": "vmovshdup W:xyz {kz}, xyz/mxyz" , "op": "[RVM] EVEX.xyz.F3.0F.W0 16 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovsldup W:xyz {kz}, xyz/mxyz" , "op": "[RVM] EVEX.xyz.F3.0F.W0 12 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovss W:m32, xmm[31:0]" , "op": "[MR ] EVEX.LIG.F3.0F.W0 11 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovss W:xmm[31:0] {kz}, m32" , "op": "[MR ] EVEX.LIG.F3.0F.W0 10 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovss W:xmm {kz}, xmm[127:32], xmm[31:0]" , "op": "[MVR] EVEX.LIG.F3.0F.W0 11 /r" , "tt": "none" , "vl": "no"},
+ {"any": "vmovss W:xmm {kz}, xmm[127:32], xmm[31:0]" , "op": "[RVM] EVEX.LIG.F3.0F.W0 10 /r" , "tt": "none" , "vl": "no"},
+ {"any": "vmovupd W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F.W1 10 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovupd W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F.W1 11 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovups W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.0F.W0 10 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovups W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.0F.W0 11 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmulpd W:xyz {kz}, ~xyz, ~xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F.W1 59 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vmulps W:xyz {kz}, ~xyz, ~xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.0F.W0 59 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vmulsd W:xmm {kz}, xmm, xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 59 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmulss W:xmm {kz}, xmm, xmm[31:0]/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 59 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpabsd W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 1E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpabsq W:xyz {kz}, xyz/mxyz/b64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 1F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpaddd W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 FE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpaddq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 D4 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpandd W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 DB /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpandnd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 DF /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpandnq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 DF /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpandq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 DB /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpblendmd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 64 /r" , "tt": "fv" , "vl": "xy", "k": "blend"},
+ {"any": "vpblendmq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 64 /r" , "tt": "fv" , "vl": "xy", "k": "blend"},
+ {"any": "vpbroadcastd W:xyz {kz}, r32[31:0]" , "op": "[RM ] EVEX.xyz.66.0F38.W0 7C /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpbroadcastd W:xyz {kz}, xmm[31:0]/m32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 58 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpbroadcastq W:xyz {kz}, r64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 7C /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpbroadcastq W:xyz {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 59 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpcmpd W:k {k}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 1F /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpeqd W:k {k}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 76 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpeqq W:k {k}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 29 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpgtd W:k {k}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 66 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpgtq W:k {k}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 37 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpq W:k {k}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 1F /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpud W:k {k}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 1E /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpuq W:k {k}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 1E /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcompressd W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F38.W0 8B /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpcompressq W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.66.0F38.W1 8B /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpermd W:ymm {kz}, ymm, ymm/m256/b32" , "op": "[RVM] EVEX.256.66.0F38.W0 36 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermd W:zmm {kz}, zmm, zmm/m512/b32" , "op": "[RVM] EVEX.512.66.0F38.W0 36 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermi2d X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 76 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermi2pd W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 77 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermi2ps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 77 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermi2q X:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 76 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermilpd W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 0D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermilpd W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[RM ] EVEX.xyz.66.0F3A.W1 05 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermilps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 0C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermilps W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[RM ] EVEX.xyz.66.0F3A.W0 04 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermpd W:ymm {kz}, ymm, ymm/m256/b64" , "op": "[RVM] EVEX.256.66.0F38.W1 16 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermpd W:zmm {kz}, zmm, zmm/m512/b64" , "op": "[RVM] EVEX.512.66.0F38.W1 16 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermpd W:ymm {kz}, ymm/m256/b64, imm8" , "op": "[RM ] EVEX.256.66.0F3A.W1 01 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermpd W:zmm {kz}, zmm/m512/b64, imm8" , "op": "[RM ] EVEX.512.66.0F3A.W1 01 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermps W:ymm {kz}, ymm, ymm/m256/b32" , "op": "[RVM] EVEX.256.66.0F38.W0 16 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermps W:zmm {kz}, zmm, zmm/m512/b32" , "op": "[RVM] EVEX.512.66.0F38.W0 16 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermq W:ymm {kz}, ymm, ymm/m256/b64" , "op": "[RVM] EVEX.256.66.0F38.W1 36 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermq W:zmm {kz}, zmm, zmm/m512/b64" , "op": "[RVM] EVEX.512.66.0F38.W1 36 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermq W:ymm {kz}, ymm/m256/b64, imm8" , "op": "[RM ] EVEX.256.66.0F3A.W1 00 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermq W:zmm {kz}, zmm/m512/b64, imm8" , "op": "[RM ] EVEX.512.66.0F3A.W1 00 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermt2d X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 7E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermt2pd X:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 7F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermt2ps X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 7F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpermt2q X:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 7E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpexpandd W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W0 89 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpexpandq W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W1 89 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherdd X:xmm {k}, vm32x" , "op": "[RM ] EVEX.128.66.0F38.W0 90" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherdd X:ymm {k}, vm32y" , "op": "[RM ] EVEX.256.66.0F38.W0 90" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherdd X:zmm {k}, vm32z" , "op": "[RM ] EVEX.512.66.0F38.W0 90" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherdq X:xmm {k}, vm32x" , "op": "[RM ] EVEX.128.66.0F38.W1 90" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherdq X:ymm {k}, vm32x" , "op": "[RM ] EVEX.256.66.0F38.W1 90" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherdq X:zmm {k}, vm32y" , "op": "[RM ] EVEX.512.66.0F38.W1 90" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherqd X:xmm {k}, vm64x" , "op": "[RM ] EVEX.128.66.0F38.W0 91" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherqd X:xmm {k}, vm64y" , "op": "[RM ] EVEX.256.66.0F38.W0 91" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherqd X:ymm {k}, vm64z" , "op": "[RM ] EVEX.512.66.0F38.W0 91" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherqq X:xmm {k}, vm64x" , "op": "[RM ] EVEX.128.66.0F38.W1 91" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherqq X:ymm {k}, vm64y" , "op": "[RM ] EVEX.256.66.0F38.W1 91" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpgatherqq X:zmm {k}, vm64z" , "op": "[RM ] EVEX.512.66.0F38.W1 91" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpmaxsd W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 3D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmaxsq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 3D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmaxud W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 3F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmaxuq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 3F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpminsd W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 39 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpminsq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 39 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpminud W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 3B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpminuq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 3B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmovdb W:xxx/mxxx {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 31 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovdw W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 33 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovqb W:xmm[15:0]/m16 {kz}, xmm" , "op": "[MR ] EVEX.128.F3.0F38.W0 32 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovqb W:xmm[31:0]/m32 {kz}, ymm" , "op": "[MR ] EVEX.256.F3.0F38.W0 32 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovqb W:xmm[63:0]/m64 {kz}, zmm" , "op": "[MR ] EVEX.512.F3.0F38.W0 32 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovqd W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 35 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovqw W:xxx/mxxx {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 34 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovsdb W:xxx/mxxx {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 21 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovsdw W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 23 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovsqb W:xmm[15:0]/m16 {kz}, xmm" , "op": "[MR ] EVEX.128.F3.0F38.W0 22 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovsqb W:xmm[31:0]/m32 {kz}, ymm" , "op": "[MR ] EVEX.256.F3.0F38.W0 22 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovsqb W:xmm[63:0]/m64 {kz}, zmm" , "op": "[MR ] EVEX.512.F3.0F38.W0 22 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovsqd W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 25 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovsqw W:xxx/mxxx {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 24 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovsxbd W:xyz {kz}, xxx/mxxx" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 21 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovsxbq W:xmm {kz}, xmm[15:0]/m16" , "op": "[RM ] EVEX.128.66.0F38.WIG 22 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovsxbq W:ymm {kz}, xmm[31:0]/m32" , "op": "[RM ] EVEX.256.66.0F38.WIG 22 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovsxbq W:zmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.512.66.0F38.WIG 22 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovsxdq W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.66.0F38.W0 25 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovsxwd W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 23 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovsxwq W:xyz {kz}, xxx/mxxx" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 24 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovusdb W:xxx/mxxx {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 11 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovusdw W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 13 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovusqb W:xmm[15:0]/m16 {kz}, xmm" , "op": "[MR ] EVEX.128.F3.0F38.W0 12 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovusqb W:xmm[31:0]/m32 {kz}, ymm" , "op": "[MR ] EVEX.256.F3.0F38.W0 12 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovusqb W:xmm[63:0]/m64 {kz}, zmm" , "op": "[MR ] EVEX.512.F3.0F38.W0 12 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovusqd W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 15 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovusqw W:xxx/mxxx {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 14 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovzxbd W:xyz {kz}, xxx/mxxx" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 31 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmovzxbq W:xmm {kz}, xmm[15:0]/m16" , "op": "[RM ] EVEX.128.66.0F38.WIG 32 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovzxbq W:ymm {kz}, xmm[31:0]/m32" , "op": "[RM ] EVEX.256.66.0F38.WIG 32 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovzxbq W:zmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.512.66.0F38.WIG 32 /r" , "tt": "ovm" , "vl": "xy"},
+ {"any": "vpmovzxdq W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.66.0F38.W0 35 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovzxwd W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 33 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovzxwq W:xyz {kz}, xxx/mxxx" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 34 /r" , "tt": "qvm" , "vl": "xy"},
+ {"any": "vpmuldq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 28 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmulld W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 40 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmuludq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 F4 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpord W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 EB /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vporq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 EB /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprold W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W0 72 /1 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprolq W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W1 72 /1 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprolvd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 15 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprolvq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 15 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprord W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W0 72 /0 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprorq W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W1 72 /0 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprorvd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 14 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vprorvq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 14 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpscatterdd W:vm32x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W0 A0 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterdd W:vm32y {k}, ymm" , "op": "[MR ] EVEX.256.66.0F38.W0 A0 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterdd W:vm32z {k}, zmm" , "op": "[MR ] EVEX.512.66.0F38.W0 A0 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterdq W:vm32x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W1 A0 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterdq W:vm32x {k}, ymm" , "op": "[MR ] EVEX.256.66.0F38.W1 A0 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterdq W:vm32y {k}, zmm" , "op": "[MR ] EVEX.512.66.0F38.W1 A0 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterqd W:vm64x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W0 A1 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterqd W:vm64y {k}, xmm" , "op": "[MR ] EVEX.256.66.0F38.W0 A1 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterqd W:vm64z {k}, ymm" , "op": "[MR ] EVEX.512.66.0F38.W0 A1 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterqq W:vm64x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W1 A1 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterqq W:vm64y {k}, ymm" , "op": "[MR ] EVEX.256.66.0F38.W1 A1 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpscatterqq W:vm64z {k}, zmm" , "op": "[MR ] EVEX.512.66.0F38.W1 A1 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpshufd W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[RM ] EVEX.xyz.66.0F.W0 70 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpslld W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.W0 F2 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpslld W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W0 72 /6 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsllq W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.W1 F3 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsllq W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W1 73 /6 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsllvd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 47 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsllvq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 47 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsrad W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.W0 E2 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsrad W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W0 72 /4 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsraq W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.W1 E2 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsraq W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W1 72 /4 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsravd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 46 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsravq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 46 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsrld W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.W0 D2 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsrld W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W0 72 /2 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsrlq W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.W1 D3 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsrlq W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[VM ] EVEX.xyz.66.0F.W1 73 /2 ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsrlvd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 45 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsrlvq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 45 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsubd W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 FA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpsubq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 FB /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpternlogd X:xyz {kz}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 25 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpternlogq X:xyz {kz}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 25 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vptestmd W:k {k}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 27 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vptestmq W:k {k}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 27 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vptestnmd W:k {k}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 27 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vptestnmq W:k {k}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.F3.0F38.W1 27 /r" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpunpckhdq W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 6A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpunpckhqdq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 6D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpunpckldq W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 62 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpunpcklqdq W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 6C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpxord W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 EF /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpxorq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 EF /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrcp14pd W:xyz {kz}, xyz/mxyz/b64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 4C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrcp14ps W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 4C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrcp14sd W:xmm {kz}, xmm[127:64], xmm[63:0]/m64" , "op": "[RVM] EVEX.LIG.66.0F38.W1 4D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrcp14ss W:xmm {kz}, xmm[127:32], xmm[31:0]/m32" , "op": "[RVM] EVEX.LIG.66.0F38.W0 4D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrndscalepd W:xyz {kz}, xyz/mxyz/b64, imm8 {sae}" , "op": "[RM ] EVEX.xyz.66.0F3A.W1 09 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrndscaleps W:xyz {kz}, xyz/mxyz/b32, imm8 {sae}" , "op": "[RM ] EVEX.xyz.66.0F3A.W0 08 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrndscalesd W:xmm {kz},xmm[127:64],xmm[63:0]/m64,imm8 {sae}", "op": "[RVM] EVEX.LIG.66.0F3A.W1 0B /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrndscaless W:xmm {kz},xmm[127:32],xmm[31:0]/m32,imm8 {sae}", "op": "[RVM] EVEX.LIG.66.0F3A.W0 0A /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrsqrt14pd W:xyz {kz}, xyz/mxyz/b64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 4E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrsqrt14ps W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 4E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrsqrt14sd W:xmm {kz}, xmm[127:64], xmm[63:0]/m64" , "op": "[RVM] EVEX.LIG.66.0F38.W1 4F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrsqrt14ss W:xmm {kz}, xmm[127:32], xmm[31:0]/m32" , "op": "[RVM] EVEX.LIG.66.0F38.W0 4F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vscalefpd W:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W1 2C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vscalefps W:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 2C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vscalefsd W:xmm {kz}, xmm, xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.66.0F38.W1 2D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vscalefss W:xmm {kz}, xmm, xmm[31:0]/m32 {er}" , "op": "[RVM] EVEX.LIG.66.0F38.W0 2D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vscatterdpd W:vm32x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W1 A2 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterdpd W:vm32x {k}, ymm" , "op": "[MR ] EVEX.256.66.0F38.W1 A2 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterdpd W:vm32y {k}, zmm" , "op": "[MR ] EVEX.512.66.0F38.W1 A2 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterdps W:vm32x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W0 A2 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterdps W:vm32y {k}, ymm" , "op": "[MR ] EVEX.256.66.0F38.W0 A2 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterdps W:vm32z {k}, zmm" , "op": "[MR ] EVEX.512.66.0F38.W0 A2 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterqpd W:vm64x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W1 A3" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterqpd W:vm64y {k}, ymm" , "op": "[MR ] EVEX.256.66.0F38.W1 A3" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterqpd W:vm64z {k}, zmm" , "op": "[MR ] EVEX.512.66.0F38.W1 A3" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterqps W:vm64x {k}, xmm" , "op": "[MR ] EVEX.128.66.0F38.W0 A3" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterqps W:vm64y {k}, xmm" , "op": "[MR ] EVEX.256.66.0F38.W0 A3" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vscatterqps W:vm64z {k}, ymm" , "op": "[MR ] EVEX.512.66.0F38.W0 A3" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vshuff32x4 W:ymm {kz}, ymm, ymm/m256/b32, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W0 23 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshuff32x4 W:zmm {kz}, zmm, zmm/m512/b32, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W0 23 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshuff64x2 W:ymm {kz}, ymm, ymm/m256/b64, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W1 23 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshuff64x2 W:zmm {kz}, zmm, zmm/m512/b64, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W1 23 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshufi32x4 W:ymm {kz}, ymm, ymm/m256/b32, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W0 43 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshufi32x4 W:zmm {kz}, zmm, zmm/m512/b32, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W0 43 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshufi64x2 W:ymm {kz}, ymm, ymm/m256/b64, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W1 43 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshufi64x2 W:zmm {kz}, zmm, zmm/m512/b64, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W1 43 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshufpd W:xyz {kz}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F.W1 C6 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vshufps W:xyz {kz}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.0F.W0 C6 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsqrtpd W:xyz {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W1 51 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsqrtps W:xyz {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.0F.W0 51 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsqrtsd W:xmm {kz}, xmm[127:64], xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 51 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vsqrtss W:xmm {kz}, xmm[127:32], xmm[31:0]/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 51 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vsubpd W:xyz {kz}, xyz, xyz/mxyz/b64 {er}" , "op": "[RVM] EVEX.xyz.66.0F.W1 5C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsubps W:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.0F.W0 5C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsubsd W:xmm {kz}, xmm, xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.0F.W1 5C /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vsubss W:xmm {kz}, xmm, xmm[31:0]/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.0F.W0 5C /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vucomisd R:xmm[63:0], xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.66.0F.W1 2E /r" , "tt": "t1s" , "vl": "no", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vucomiss R:xmm[31:0], xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.NP.0F.W0 2E /r" , "tt": "t1s" , "vl": "no", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vunpckhpd W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 15 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vunpckhps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.0F.W0 15 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vunpcklpd W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 14 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vunpcklps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.0F.W0 14 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD CRYPTO_HASH", "ext": "AVX512_F VAES", "instructions": [
+ {"any": "vaesdec W:xyz, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG DE /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vaesdeclast W:xyz, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG DF /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vaesenc W:xyz, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG DC /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vaesenclast W:xyz, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG DD /r" , "tt": "fvm" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_F GFNI", "instructions": [
+ {"any": "vgf2p8affineinvqb W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 CF /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vgf2p8affineqb W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 CE /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vgf2p8mulb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 CF /r" , "tt": "fvm" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_F VPCLMULQDQ", "instructions": [
+ {"any": "vpclmulqdq W:xyz, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.WIG 44 /r ib" , "tt": "fvm" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_DQ", "instructions": [
+ {"any": "vandnpd W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 55 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vandnps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.W0 55 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vandpd W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 54 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vandps W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.0F.W0 54 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vbroadcastf32x2 W:ymm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.256.66.0F38.W0 19 /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcastf32x2 W:zmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.512.66.0F38.W0 19 /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcastf32x8 W:zmm {kz}, m256" , "op": "[RM ] EVEX.512.66.0F38.W0 1B /r" , "tt": "t8" , "vl": "xy"},
+ {"any": "vbroadcastf64x2 W:ymm {kz}, m128" , "op": "[RM ] EVEX.256.66.0F38.W1 1A /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcastf64x2 W:zmm {kz}, m128" , "op": "[RM ] EVEX.512.66.0F38.W1 1A /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcasti32x2 W:xmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.128.66.0F38.W0 59 /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcasti32x2 W:ymm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.256.66.0F38.W0 59 /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcasti32x2 W:zmm {kz}, xmm[63:0]/m64" , "op": "[RM ] EVEX.512.66.0F38.W0 59 /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcasti32x8 W:zmm {kz}, m256" , "op": "[RM ] EVEX.512.66.0F38.W0 5B /r" , "tt": "t8" , "vl": "xy"},
+ {"any": "vbroadcasti64x2 W:ymm {kz}, m128" , "op": "[RM ] EVEX.256.66.0F38.W1 5A /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vbroadcasti64x2 W:zmm {kz}, m128" , "op": "[RM ] EVEX.512.66.0F38.W1 5A /r" , "tt": "t2" , "vl": "xy"},
+ {"any": "vcvtpd2qq W:xyz {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W1 7B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtpd2uqq W:xyz {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W1 79 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtps2qq W:xyz {kz}, xxy/mxxy/b32 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W0 7B /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtps2uqq W:xyz {kz}, xxy/mxxy/b32 {er}" , "op": "[RM ] EVEX.xyz.66.0F.W0 79 /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtqq2pd W:xyz {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.F3.0F.W1 E6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtqq2ps W:xxy {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.NP.0F.W1 5B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttpd2uqq W:xyz {kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.66.0F.W1 78 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttps2qq W:xyz {kz}, xxy/mxxy/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.0F.W0 7A /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvttps2uqq W:xyz {kz}, xxy/mxxy/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.0F.W0 78 /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtuqq2pd W:xyz {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.F3.0F.W1 7A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtuqq2ps W:xxy {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.F2.0F.W1 7A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vextractf32x8 W:ymm/m256 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W0 1B /r ib" , "tt": "t8" , "vl": "xy"},
+ {"any": "vextractf64x2 W:xmm/m128 {kz}, ymm, imm8" , "op": "[MR ] EVEX.256.66.0F3A.W1 19 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vextractf64x2 W:xmm/m128 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W1 19 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vextracti32x8 W:ymm/m256 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W0 3B /r ib" , "tt": "t8" , "vl": "xy"},
+ {"any": "vextracti64x2 W:xmm/m128 {kz}, ymm, imm8" , "op": "[MR ] EVEX.256.66.0F3A.W1 39 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vextracti64x2 W:xmm/m128 {kz}, zmm, imm8" , "op": "[MR ] EVEX.512.66.0F3A.W1 39 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vfpclasspd W:k {k}, xyz/mxyz/b64, imm8" , "op": "[RM ] EVEX.xyz.66.0F3A.W1 66 /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vfpclassps W:k {k}, xyz/mxyz/b32, imm8" , "op": "[RM ] EVEX.xyz.66.0F3A.W0 66 /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vfpclasssd W:k {k}, xmm[63:0]/m64, imm8" , "op": "[RM ] EVEX.LIG.66.0F3A.W1 67 /r ib" , "tt": "t1s" , "vl": "no", "k": "zeroing"},
+ {"any": "vfpclassss W:k {k}, xmm[31:0]/m32, imm8" , "op": "[RM ] EVEX.LIG.66.0F3A.W0 67 /r ib" , "tt": "t1s" , "vl": "no", "k": "zeroing"},
+ {"any": "vinsertf32x8 W:zmm {kz}, zmm, ymm/m256, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W0 1A /r ib" , "tt": "t8" , "vl": "xy"},
+ {"any": "vinsertf64x2 W:ymm {kz}, ymm, xmm/m128, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W1 18 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vinsertf64x2 W:zmm {kz}, zmm, xmm/m128, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W1 18 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vinserti32x8 W:zmm {kz}, zmm, ymm/m256, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W0 3A /r ib" , "tt": "t8" , "vl": "xy"},
+ {"any": "vinserti64x2 W:ymm {kz}, ymm, xmm/m128, imm8" , "op": "[RVM] EVEX.256.66.0F3A.W1 38 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vinserti64x2 W:zmm {kz}, zmm, xmm/m128, imm8" , "op": "[RVM] EVEX.512.66.0F3A.W1 38 /r ib" , "tt": "t2" , "vl": "xy"},
+ {"any": "vorpd W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 56 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vorps W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.NP.0F.W0 56 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpextrd W:r32/m32, xmm, imm8" , "op": "[MR ] EVEX.128.66.0F3A.W0 16 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpextrq W:r64/m64, xmm, imm8" , "op": "[MR ] EVEX.128.66.0F3A.W1 16 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpinsrd W:xmm {kz}, xmm, r32/m32, imm8" , "op": "[RVM] EVEX.128.66.0F3A.W0 22 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpinsrq W:xmm {kz}, xmm, r64/m64, imm8" , "op": "[RVM] EVEX.128.66.0F3A.W1 22 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpmovd2m W:k, xyz" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 39 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovm2d W:xyz, k" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 38 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovm2q W:xyz, k" , "op": "[RM ] EVEX.xyz.F3.0F38.W1 38 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovq2m W:k, xyz" , "op": "[RM ] EVEX.xyz.F3.0F38.W1 39 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmullq W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 40 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrangepd W:xyz {kz}, xyz, xyz/mxyz/b64, imm8 {sae}" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 50 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrangeps W:xyz {kz}, xyz, xyz/mxyz/b32, imm8 {sae}" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 50 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrangesd W:xmm {kz}, xmm[127:64], xmm[63:0]/m64,imm8 {sae}" , "op": "[RVM] EVEX.LIG.66.0F3A.W1 51 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrangess W:xmm {kz}, xmm[127:32], xmm[31:0]/m32,imm8 {sae}" , "op": "[RVM] EVEX.LIG.66.0F3A.W0 51 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vreducepd W:xyz {kz}, xyz/mxyz/b64, imm8" , "op": "[RM ] EVEX.xyz.66.0F3A.W1 56 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vreduceps W:xyz {kz}, xyz/mxyz/b32, imm8" , "op": "[RM ] EVEX.xyz.66.0F3A.W0 56 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vreducesd W:xmm {kz}, xmm[127:64], xmm[63:0]/m64, imm8" , "op": "[RVM] EVEX.LIG.66.0F3A.W1 57 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vreducess W:xmm {kz}, xmm[127:32], xmm[31:0]/m32, imm8" , "op": "[RVM] EVEX.LIG.66.0F3A.W0 57 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vxorpd W:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F.W1 57 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vxorps W:xyz {kz}, ~xyz, ~xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.0F.W0 57 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_BW", "instructions": [
+ {"any": "vdbpsadbw W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 42 /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu16 W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.F2.0F.W1 6F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu16 W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.F2.0F.W1 7F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu8 W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.F2.0F.W0 6F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vmovdqu8 W:xyz/mxyz {kz}, xyz" , "op": "[MR ] EVEX.xyz.F2.0F.W0 7F /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpabsb W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38 1C /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpabsw W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38 1D /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpackssdw W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F.W0 6B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpacksswb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 63 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpackusdw W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 2B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpackuswb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 67 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpaddb W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG FC /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpaddsb W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG EC /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpaddsw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG ED /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpaddusb W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG DC /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpaddusw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG DD /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpaddw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG FD /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpalignr W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.WIG 0F /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpavgb W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG E0 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpavgw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG E3 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpblendmb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 66 /r" , "tt": "fvm" , "vl": "xy", "k": "blend"},
+ {"any": "vpblendmw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 66 /r" , "tt": "fvm" , "vl": "xy", "k": "blend"},
+ {"any": "vpbroadcastb W:xyz {kz}, r32[7:0]" , "op": "[RM ] EVEX.xyz.66.0F38.W0 7A /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpbroadcastb W:xyz {kz}, xmm[7:0]/m8" , "op": "[RM ] EVEX.xyz.66.0F38.W0 78 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpbroadcastw W:xyz {kz}, r32[15:0]" , "op": "[RM ] EVEX.xyz.66.0F38.W0 7B /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpbroadcastw W:xyz {kz}, xmm[15:0]/m16" , "op": "[RM ] EVEX.xyz.66.0F38.W0 79 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpcmpb W:k {k}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 3F /r ib" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpeqb W:k {k}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 74 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpeqw W:k {k}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 75 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpgtb W:k {k}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 64 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpgtw W:k {k}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 65 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpub W:k {k}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 3E /r ib" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpuw W:k {k}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 3E /r ib" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpcmpw W:k {k}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 3F /r ib" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpermi2w X:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 75 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpermt2w X:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 7D /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpermw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 8D /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpextrb W:r32[7:0]/m8 , xmm, imm8" , "op": "[MR ] EVEX.128.66.0F3A.WIG 14 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpextrw W:r32[15:0], xmm, imm8" , "op": "[RM ] EVEX.128.66.0F.WIG C5 /r ib" , "tt": "none" , "vl": "no"},
+ {"any": "vpextrw W:r32[15:0]/m16, xmm, imm8" , "op": "[MR ] EVEX.128.66.0F3A.WIG 15 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpinsrb W:xmm {kz}, xmm, r32[7:0]/m8, imm8" , "op": "[RVM] EVEX.128.66.0F3A.WIG 20 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpinsrw W:xmm {kz}, xmm, r32[15:0]/m16, imm8" , "op": "[RVM] EVEX.128.66.0F.WIG C4 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vpmaddubsw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG 04 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmaddwd W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG F5 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmaxsb W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG 3C /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmaxsw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG EE /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmaxub W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG DE /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmaxuw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG 3E /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpminsb W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG 38 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpminsw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG EA /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpminub W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F DA /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpminuw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38 3A /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmovb2m W:k, xyz" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 29 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovm2b W:xyz, k" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 28 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovm2w W:xyz, k" , "op": "[RM ] EVEX.xyz.F3.0F38.W1 28 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovswb W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 20 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovsxbw W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 20 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovuswb W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 10 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovw2m W:k, xyz" , "op": "[RM ] EVEX.xyz.F3.0F38.W1 29 /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpmovwb W:xxy/mxxy {kz}, xyz" , "op": "[MR ] EVEX.xyz.F3.0F38.W0 30 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmovzxbw W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.66.0F38.WIG 30 /r" , "tt": "hvm" , "vl": "xy"},
+ {"any": "vpmulhrsw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG 0B /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmulhuw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG E4 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmulhw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG E5 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmullw W:xyz {kz}, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG D5 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsadbw W:xyz, ~xyz, ~xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG F6 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshufb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.WIG 00 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshufhw W:xyz {kz}, xyz/mxyz, imm8" , "op": "[RM ] EVEX.xyz.F3.0F.WIG 70 /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshuflw W:xyz {kz}, xyz/mxyz, imm8" , "op": "[RM ] EVEX.xyz.F2.0F.WIG 70 /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpslldq W:xyz, xyz/mxyz, imm8" , "op": "[VM ] EVEX.xyz.66.0F.WIG 73 /7 ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsllvw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 12 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsllw W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.WIG F1 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsllw W:xyz {kz}, xyz/mxyz, imm8" , "op": "[VM ] EVEX.xyz.66.0F.WIG 71 /6 ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsravw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 11 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsraw W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.WIG E1 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsraw W:xyz {kz}, xyz/mxyz, imm8" , "op": "[VM ] EVEX.xyz.66.0F.WIG 71 /4 ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsrldq W:xyz, xyz/mxyz, imm8" , "op": "[VM ] EVEX.xyz.66.0F.WIG 73 /3 ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsrlvw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 10 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsrlw W:xyz {kz}, xyz, xmm/m128" , "op": "[RVM] EVEX.xyz.66.0F.WIG D1 /r" , "tt": "m128" , "vl": "xy"},
+ {"any": "vpsrlw W:xyz {kz}, xyz/mxyz, imm8" , "op": "[VM ] EVEX.xyz.66.0F.WIG 71 /2 ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsubb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG F8 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsubsb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG E8 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsubsw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG E9 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsubusb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG D8 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsubusw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG D9 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpsubw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG F9 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vptestmb W:k {k}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 26 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vptestmw W:k {k}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 26 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vptestnmb W:k {k}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 26 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vptestnmw W:k {k}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.F3.0F38.W1 26 /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"},
+ {"any": "vpunpckhbw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 68 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpunpckhwd W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 69 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpunpcklbw W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 60 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpunpcklwd W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F.WIG 61 /r" , "tt": "fvm" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_CD", "instructions": [
+ {"any": "vpbroadcastmb2q W:xyz, k" , "op": "[RM ] EVEX.xyz.F3.0F38.W1 2A /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpbroadcastmw2d W:xyz, k" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 3A /r" , "tt": "none" , "vl": "xy"},
+ {"any": "vpconflictd W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 C4 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpconflictq W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W1 C4 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vplzcntd W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 44 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vplzcntq W:xyz {kz}, xyz/mxyz/b64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 44 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_IFMA", "instructions": [
+ {"any": "vpmadd52luq X:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 B4 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpmadd52huq X:xyz {kz}, ~xyz, ~xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 B5 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_VPOPCNTDQ", "instructions": [
+ {"any": "vpopcntd W:xyz {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.66.0F38.W0 55 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpopcntq W:xyz {kz}, xyz/mxyz/b64" , "op": "[RM ] EVEX.xyz.66.0F38.W1 55 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_VBMI", "instructions": [
+ {"any": "vpermb W:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 8D /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpermi2b X:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 75 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpermt2b X:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 7D /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpmultishiftqb W:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 83 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_VBMI2", "instructions": [
+ {"any": "vpcompressb W:xyz/mxyz {kz}, xyz" , "op": "[RVM] EVEX.xyz.66.0F38.W0 63 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpcompressw W:xyz/mxyz {kz}, xyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 63 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpexpandb W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W0 62 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpexpandw W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W1 62 /r" , "tt": "t1s" , "vl": "xy"},
+ {"any": "vpshldd W:xyz {kz}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 71 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshldq W:xyz {kz}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 71 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshldvd X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 71 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshldvq X:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 71 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshldvw X:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 70 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshldw W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 70 /r ib" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshrdd W:xyz {kz}, xyz, xyz/mxyz/b32, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 73 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshrdq W:xyz {kz}, xyz, xyz/mxyz/b64, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 73 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshrdvd X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 73 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshrdvq X:xyz {kz}, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.66.0F38.W1 73 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpshrdvw X:xyz {kz}, xyz, xyz/mxyz" , "op": "[RVM] EVEX.xyz.66.0F38.W1 72 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshrdw W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 72 /r ib" , "tt": "fvm" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_VNNI", "instructions": [
+ {"any": "vpdpbusd X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 50 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpdpbusds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 51 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpdpwssd X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 52 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vpdpwssds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 53 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_BITALG", "instructions": [
+ {"any": "vpopcntb W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W0 54 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpopcntw W:xyz {kz}, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W1 54 /r" , "tt": "fvm" , "vl": "xy"},
+ {"any": "vpshufbitqmb W:k {k}, xyz, xyz/mxyz" , "op": "[RM ] EVEX.xyz.66.0F38.W0 8F /r" , "tt": "fvm" , "vl": "xy", "k": "zeroing"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_VP2INTERSECT", "instructions": [
+ {"any": "vp2intersectd W:k, W:k+1, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F2.0F38.W0 68 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vp2intersectq W:k, W:k+1, xyz, xyz/mxyz/b64" , "op": "[RVM] EVEX.xyz.F2.0F38.W1 68 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_BF16", "instructions": [
+ {"any": "vcvtne2ps2bf16 W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F2.0F38.W0 72 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtneps2bf16 W:xxy {kz}, xyz/mxyz/b32" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 72 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vdpbf16ps W:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 52 /r" , "tt": "fv" , "vl": "xy"}
+ ]},
+
+ {"category": "AVX512 SIMD", "ext": "AVX512_FP16", "instructions": [
+ {"any": "vaddph W:xyz {kz}, ~xyz, ~xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 58 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vaddsh W:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 58 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcmpph W:k {k}, xyz, xyz/mxyz/b16, imm8 {sae}" , "op": "[RVM] EVEX.xyz.NP.0F3A.W0 C2 /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vcmpsh W:k {k}, xmm[15:0], xmm[15:0]/m16, imm8 {sae}" , "op": "[RVM] EVEX.LIG.F3.0F3A.W0 C2 /r ib" , "tt": "t1s" , "vl": "no", "k": "zeroing"},
+ {"any": "vcomish R:xmm[15:0], xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.NP.MAP5.W0 2F /r" , "tt": "t1s" , "vl": "no", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcvtdq2ph W:xxy {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 5B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtpd2ph W:xxx {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W1 5A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtph2dq W:xyz {kz}, xxy/mxxy/b16 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 5B /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtph2pd W:xyz {kz}, xxx/mxxx/b16 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 5A /r" , "tt": "qv" , "vl": "xy"},
+ {"any": "vcvtph2psx W:xyz {kz}, xxy/mxxy/b16 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP6.W0 13 /r" , "tt": "qv" , "vl": "xy"},
+ {"any": "vcvtph2qq W:xyz {kz}, xxx/mxxx/b16 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 7B /r" , "tt": "qv" , "vl": "xy"},
+ {"any": "vcvtph2udq W:xyz {kz}, xxy/mxxy/b16 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 79 /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvtph2uqq W:xyz {kz}, xxx/mxxx/b16 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 79 /r" , "tt": "qv" , "vl": "xy"},
+ {"any": "vcvtph2uw W:xyz {kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 7D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtph2w W:xyz {kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 7D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtps2phx W:xxy {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 1D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtqq2ph W:xmm {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W1 5B /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtsd2sh W:xmm {kz}, xmm, xmm[63:0]/m64 {er}" , "op": "[RVM] EVEX.LIG.F2.MAP5.W1 5A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsh2sd W:xmm {kz}, xmm, xmm[15:0]/m16 {sae}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 5A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsh2si W:ry, xmm[15:0]/m16 {er}" , "op": "[RM ] EVEX.LIG.F3.MAP5.Wy 2D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsh2ss W:xmm {kz}, xmm, xmm/m16 {sae}" , "op": "[RVM] EVEX.LIG.NP.MAP6.W0 13 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsh2usi W:ry, xmm[15:0]/m16 {er}" , "op": "[RM ] EVEX.LIG.F3.MAP5.Wy 79 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtsi2sh W:xmm, xmm, ry/my {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.Wy 2A /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtss2sh W:xmm {kz}, xmm, xmm/m32 {er}" , "op": "[RVM] EVEX.LIG.NP.MAP5.W0 1D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvttph2dq W:xyz {kz}, xxy/mxxy/b16 {sae}" , "op": "[RM ] EVEX.xyz.F3.MAP5.W0 5B /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvttph2qq W:xyz {kz}, xxx/mxxx/b16 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 7A /r" , "tt": "qv" , "vl": "xy"},
+ {"any": "vcvttph2udq W:xyz {kz}, xxy/mxxy/b16 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 78 /r" , "tt": "hv" , "vl": "xy"},
+ {"any": "vcvttph2uqq W:xyz {kz}, xxx/mxxx/b16 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 78 /r" , "tt": "qv" , "vl": "xy"},
+ {"any": "vcvttph2uw W:xyz {kz}, xyz/mxyz/b16 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 7C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttph2w W:xyz {kz}, xyz/mxyz/b16 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 7C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvttsh2si W:ry, xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.F3.MAP5.Wy 2C /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvttsh2usi W:ry, xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.F3.MAP5.Wy 78 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtudq2ph W:xxy {kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 7A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtuqq2ph W:xxx {kz}, xyz/mxyz/b64 {er}" , "op": "[RM ] EVEX.xyz.F2.MAP5.W1 7A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtusi2sh W:xmm, xmm, ry/my {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.Wy 7B /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vcvtuw2ph W:xyz {kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 7D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vcvtw2ph W:xyz {kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.F3.MAP5.W0 7D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vdivph W:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 5E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vdivsh W:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 5E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfcmaddcph X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.F2.MAP6.W0 56 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfcmaddcsh x:xmm {kz}, xmm, xmm/m32 {er}" , "op": "[RVM] EVEX.LIG.F2.MAP6.W0 57 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfcmulcph X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.F2.MAP6.W0 D6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfcmulcsh x:xmm {kz}, xmm, xmm/m32 {er}" , "op": "[RVM] EVEX.LIG.F2.MAP6.W0 D7 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd132ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 98 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd132sh x:xmm {kz}, xmm, xmm/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 99 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd213ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 A8 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd213sh x:xmm {kz}, xmm, xmm/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 A9 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmadd231ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 B8 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmadd231sh x:xmm {kz}, xmm, xmm/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 B9 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmaddcph X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.F3.MAP6.W0 56 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddcsh x:xmm {kz}, xmm, xmm/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP6.W0 57 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmaddsub132ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 96 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub213ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 A6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmaddsub231ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 B6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub132ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 9A /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub132sh x:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 9B /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub213ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 AA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub213sh x:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 AB /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsub231ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 BA /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsub231sh x:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 BB /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfmsubadd132ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 97 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd213ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 A7 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmsubadd231ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 B7 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmulcph X:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.F3.MAP6.W0 D6 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfmulcsh X:xmm {kz}, xmm, xmm/m32 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP6.W0 D7 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd132ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 9C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd132sh x:xmm {kz}, xmm, xmm/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 9D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd213ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 AC /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd213sh x:xmm {kz}, xmm, xmm/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 AD /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmadd231ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 BC /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmadd231sh x:xmm {kz}, xmm, xmm/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 BD /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub132ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 9E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub132sh x:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 9F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub213ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 AE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub213sh x:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 AF /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfnmsub231ph X:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 BE /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vfnmsub231sh x:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 BF /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vfpclassph W:k {k}, xyz/mxyz/b16, imm8" , "op": "[RM ] EVEX.xyz.NP.0F3A.W0 66 /r ib" , "tt": "fv" , "vl": "xy", "k": "zeroing"},
+ {"any": "vfpclasssh W:k {k}, xmm[15:0]/m16, imm8" , "op": "[RM ] EVEX.LIG.NP.0F3A.W0 67 /r ib" , "tt": "t1s" , "vl": "no", "k": "zeroing"},
+ {"any": "vgetexpph W:xyz {kz}, xyz/mxyz/b16 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP6.W0 42 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vgetexpsh W:xmm {kz}, xmm[127:16], xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.66.MAP6.W0 43 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vgetmantph W:xyz {kz}, xyz/mxyz/b16, imm8 {sae}" , "op": "[RM ] EVEX.xyz.NP.0F3A.W0 26 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vgetmantsh W:xmm {kz},xmm[127:16],xmm[15:0]/m16,imm8 {sae}" , "op": "[RM ] EVEX.LIG.NP.0F3A.W0 27 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmaxph W:xyz {kz}, xyz, xyz/mxyz/b16 {sae}" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 5F /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vmaxsh W:xmm {kz}, xmm, xmm[15:0]/m16 {sae}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 5F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vminph W:xyz {kz}, xyz, xyz/mxyz/b16 {sae}" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 5D /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vminsh W:xmm {kz}, xmm, xmm[15:0]/m16 {sae}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 5D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsh W:m16, xmm[15:0]" , "op": "[MR ] EVEX.LIG.F3.MAP5.W0 11 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsh W:xmm[15:0] {kz}, m16" , "op": "[RM ] EVEX.LIG.F3.MAP5.W0 10 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsh W:xmm {kz}, xmm[127:16], xmm[15:0]" , "op": "[MVR] EVEX.LIG.F3.MAP5.W0 11 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovsh W:xmm {kz}, xmm[127:16], xmm[15:0]" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 10 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovw W:r32[15:0]/m16, xmm[15:0]" , "op": "[MR ] EVEX.128.66.MAP5.WIG 7E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmovw W:xmm[15:0] {kz}, r32[15:0]/m16" , "op": "[RM ] EVEX.128.66.MAP5.WIG 6E /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vmulph W:xyz {kz}, ~xyz, ~xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 59 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vmulsh W:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 59 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrcpph W:xyz {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.66.MAP6.W0 4C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrcpsh W:xmm {kz}, xmm[127:16], xmm[15:0]/m16" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 4D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vreduceph W:xyz {kz}, xyz/mxyz/b16, imm8 {sae}" , "op": "[RM ] EVEX.xyz.NP.0F3A.W0 56 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vreducesh W:xmm {kz}, xmm[127:16], xmm[15:0]/m16,imm8 {sae}", "op": "[RVM] EVEX.LIG.NP.0F3A.W0 57 /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrndscaleph W:xyz {kz}, xyz/mxyz/b16, imm8 {sae}" , "op": "[RM ] EVEX.xyz.NP.0F3A.W0 08 /r ib" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrndscalesh W:xmm {kz},xmm[127:16],xmm[15:0]/m16,imm8 {sae}", "op": "[RVM] EVEX.LIG.NP.0F3A.W0 0A /r ib" , "tt": "t1s" , "vl": "no"},
+ {"any": "vrsqrtph W:xyz {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.66.MAP6.W0 4E /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vrsqrtsh W:xmm {kz}, xmm[127:16], xmm[15:0]/m16" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 4F /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vscalefph W:xyz {kz}, xyz, xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.66.MAP6.W0 2C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vscalefsh W:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.66.MAP6.W0 2D /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vsqrtph W:xyz {kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 51 /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsqrtsh W:xmm {kz}, xmm[127:16], xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 51 /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vsubph W:xyz {kz}, ~xyz, ~xyz/mxyz/b16 {er}" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 5C /r" , "tt": "fv" , "vl": "xy"},
+ {"any": "vsubsh W:xmm {kz}, xmm, xmm[15:0]/m16 {er}" , "op": "[RVM] EVEX.LIG.F3.MAP5.W0 5C /r" , "tt": "t1s" , "vl": "no"},
+ {"any": "vucomish R:xmm[15:0], xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.NP.MAP5.W0 2E /r" , "tt": "t1s" , "vl": "no", "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vaddnepbf16 W:xyz{kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.66.MAP5.W0 58 /r" , "tt": "fv"},
+ {"any": "vcmppbf16 W:k {k}, xyz, xyz/mxyz/b16, imm8" , "op": "[RVM] EVEX.xyz.F2.0F3A.W0 C2 /r ib" , "tt": "fv" , "k": "zeroing"},
+ {"any": "vcomsbf16 R:xmm, xmm/m16" , "op": "[RM ] EVEX.LIG.66.MAP5.W0 2F /r" , "tt": "t1s" , "io": "OF=0 SF=0 ZF=W AF=0 PF=W CF=W"},
+ {"any": "vdivnepbf16 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.66.MAP5.W0 5E /r" , "tt": "fv"},
+ {"any": "vfmadd132nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 98 /r" , "tt": "fv"},
+ {"any": "vfmadd213nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 A8 /r" , "tt": "fv"},
+ {"any": "vfmadd231nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 B8 /r" , "tt": "fv"},
+ {"any": "vfmsub132nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 9A /r" , "tt": "fv"},
+ {"any": "vfmsub213nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 AA /r" , "tt": "fv"},
+ {"any": "vfmsub231nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 BA /r" , "tt": "fv"},
+ {"any": "vfnmadd132nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 9C /r" , "tt": "fv"},
+ {"any": "vfnmadd213nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 AC /r" , "tt": "fv"},
+ {"any": "vfnmadd231nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 BC /r" , "tt": "fv"},
+ {"any": "vfnmsub132nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 9E /r" , "tt": "fv"},
+ {"any": "vfnmsub213nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 AE /r" , "tt": "fv"},
+ {"any": "vfnmsub231nepbf16 X:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 BE /r" , "tt": "fv"},
+ {"any": "vfpclasspbf16 W:k {k}, xyz/mxyz/b16, imm8" , "op": "[RM ] EVEX.xyz.F2.0F3A.W0 66 /r ib" , "tt": "fv" , "k": "zeroing"},
+ {"any": "vgetexppbf16 W:xyz {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 42 /r" , "tt": "fv"},
+ {"any": "vgetmantpbf16 W:xyz {kz}, xyz/mxyz/b16, imm8" , "op": "[RM ] EVEX.xyz.F2.0F3A.W0 26 /r ib" , "tt": "fv"},
+ {"any": "vmaxpbf16 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.66.MAP5.W0 5F /r" , "tt": "fv"},
+ {"any": "vminpbf16 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.66.MAP5.W0 5D /r" , "tt": "fv"},
+ {"any": "vmulnepbf16 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.66.MAP5.W0 59 /r" , "tt": "fv"},
+ {"any": "vrcppbf16 W:xyz {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.NP.MAP6.W0 4C /r" , "tt": "fv"},
+ {"any": "vreducenepbf16 W:xyz {kz}, xyz/mxyz/b16, imm8" , "op": "[RM ] EVEX.xyz.F2.0F3A.W0 56 /r ib" , "tt": "fv"},
+ {"any": "vrndscalenepbf16 W:xyz {kz}, xyz/mxyz/b16, imm8" , "op": "[RM ] EVEX.xyz.F2.0F3A.W0 08 /r ib" , "tt": "fv"},
+ {"any": "vrsqrtpbf16 W:xyz {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.NP.MAP6.W0 4E /r" , "tt": "fv"},
+ {"any": "vscalefpbf16 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP6.W0 2C /r" , "tt": "fv"},
+ {"any": "vsqrtnepbf16 W:xyz {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 51 /r " , "tt": "fv"},
+ {"any": "vsubnepbf16 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.66.MAP5.W0 5C /r" , "tt": "fv"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vcomxsd R:xmm[63:0], R:xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.F3.0F.W1 2F /r" , "tt": "t1s" , "io": "OF=W SF=W ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcomxsh R:xmm[15:0], R:xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.F2.MAP5.W0 2F /r" , "tt": "t1s" , "io": "OF=W SF=W ZF=W AF=0 PF=W CF=W"},
+ {"any": "vcomxss R:xmm[31:0], R:xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.F2.0F.W0 2F /r" , "tt": "t1s" , "io": "OF=W SF=W ZF=W AF=0 PF=W CF=W"},
+ {"any": "vucomxsd R:xmm[63:0], R:xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.F3.0F.W1 2E /r" , "tt": "t1s" , "io": "OF=W SF=W ZF=W AF=0 PF=W CF=W"},
+ {"any": "vucomxsh R:xmm[15:0], R:xmm[15:0]/m16 {sae}" , "op": "[RM ] EVEX.LIG.F2.MAP5.W0 2E /r" , "tt": "t1s" , "io": "OF=W SF=W ZF=W AF=0 PF=W CF=W"},
+ {"any": "vucomxss R:xmm[31:0], R:xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.F2.0F.W0 2E /r" , "tt": "t1s" , "io": "OF=W SF=W ZF=W AF=0 PF=W CF=W"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vcvt2ps2phx W:xyz {kz}, xyz, xyz/mxyz/b32 {er}" , "op": "[RVM] EVEX.xyz.66.0F38.W0 67 /r" , "tt": "fv"},
+ {"any": "vcvtbiasph2bf8 W:xxy {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.0F38.W0 74 /r" , "tt": "fv"},
+ {"any": "vcvtbiasph2bf8s W:xxy {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 74 /r" , "tt": "fv"},
+ {"any": "vcvtbiasph2hf8 W:xxy {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 18 /r" , "tt": "fv"},
+ {"any": "vcvtbiasph2hf8s W:xxy {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.NP.MAP5.W0 1B /r" , "tt": "fv"},
+ {"any": "vcvthf82ph W:xyz {kz}, xxy/mxxy" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 1E /r" , "tt": "hv"},
+ {"any": "vcvtne2ph2bf8 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.F2.0F38.W0 74 /r" , "tt": "fv"},
+ {"any": "vcvtne2ph2bf8s W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.F2.MAP5.W0 74 /r" , "tt": "fv"},
+ {"any": "vcvtne2ph2hf8 W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.F2.MAP5.W0 18 /r" , "tt": "fv"},
+ {"any": "vcvtne2ph2hf8s W:xyz {kz}, xyz, xyz/mxyz/b16" , "op": "[RVM] EVEX.xyz.F2.MAP5.W0 1B /r" , "tt": "fv"},
+ {"any": "vcvtneph2bf8 W:xxy {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F3.0F38.W0 74 /r" , "tt": "fv"},
+ {"any": "vcvtneph2bf8s W:xxy {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F3.MAP5.W0 74 /r" , "tt": "fv"},
+ {"any": "vcvtneph2hf8 W:xxy {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F3.MAP5.W0 18 /r" , "tt": "fv"},
+ {"any": "vcvtneph2hf8s W:xxy {kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F3.MAP5.W0 1B /r" , "tt": "fv"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vdpphps X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.NP.0F38.W0 52 /r" , "tt": "fv"},
+ {"any": "vmpsadbw W:xyz {kz}, xyz, xyz/mxyz, imm8" , "op": "[RVM] EVEX.xyz.F3.0F3A.W0 42 /r ib" , "tt": "fv"},
+ {"any": "vpdpbssd X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F2.0F38.W0 50 /r" , "tt": "fv"},
+ {"any": "vpdpbssds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F2.0F38.W0 51 /r" , "tt": "fv"},
+ {"any": "vpdpbsud X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 50 /r" , "tt": "fv"},
+ {"any": "vpdpbsuds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 51 /r" , "tt": "fv"},
+ {"any": "vpdpbuud X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.NP.0F38.W0 50 /r" , "tt": "fv"},
+ {"any": "vpdpbuuds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.NP.0F38.W0 51 /r" , "tt": "fv"},
+ {"any": "vpdpwsud X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 D2 /r" , "tt": "fv"},
+ {"any": "vpdpwsuds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.F3.0F38.W0 D3 /r" , "tt": "fv"},
+ {"any": "vpdpwusd X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 D2 /r" , "tt": "fv"},
+ {"any": "vpdpwusds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.66.0F38.W0 D3 /r" , "tt": "fv"},
+ {"any": "vpdpwuud X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.NP.0F38.W0 D2 /r" , "tt": "fv"},
+ {"any": "vpdpwuuds X:xyz {kz}, xyz, xyz/mxyz/b32" , "op": "[RVM] EVEX.xyz.NP.0F38.W0 D3 /r" , "tt": "fv"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vminmaxnepbf16 W:xyz {kz}, xyz, xyz/mxyz/b16, imm8" , "op": "[RVM] EVEX.xyz.F2.0F3A.W0 52 /r ib" , "tt": "fv"},
+ {"any": "vminmaxpd W:xyz {kz}, xyz, xyz/mxyz/b64 {sae}, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W1 52 /r ib" , "tt": "fv"},
+ {"any": "vminmaxph W:xyz {kz}, xyz, xyz/mxyz/b16 {sae}, imm8" , "op": "[RVM] EVEX.xyz.NP.0F3A.W0 52 /r ib" , "tt": "fv"},
+ {"any": "vminmaxps W:xyz {kz}, xyz, xyz/mxyz/b32 {sae}, imm8" , "op": "[RVM] EVEX.xyz.66.0F3A.W0 52 /r ib" , "tt": "fv"},
+ {"any": "vminmaxsd W:xmm {kz}, xmm, xmm/m64 {sae}, imm8" , "op": "[RVM] EVEX.LIG.66.0F3A.W1 53 /r ib" , "tt": "t1s"},
+ {"any": "vminmaxsh W:xmm {kz}, xmm, xmm/m16 {sae}, imm8" , "op": "[RVM] EVEX.LIG.NP.0F3A.W0 53 /r ib" , "tt": "t1s"},
+ {"any": "vminmaxss W:xmm {kz}, xmm, xmm/m32 {sae}, imm8" , "op": "[RVM] EVEX.LIG.66.0F3A.W0 53 /r ib" , "tt": "t1s"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vcvtnebf162ibs W:xyz{kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 69 /r" , "tt": "fv"},
+ {"any": "vcvtnebf162iubs W:xyz{kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 6B /r" , "tt": "fv"},
+ {"any": "vcvttnebf162ibs W:xyz{kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 68 /r" , "tt": "fv"},
+ {"any": "vcvttnebf162iubs W:xyz{kz}, xyz/mxyz/b16" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 6A /r" , "tt": "fv"},
+ {"any": "vcvttpd2dqs W:xxy{kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W1 6D /r" , "tt": "fv"},
+ {"any": "vcvttpd2qqs W:xyz{kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W1 6D /r" , "tt": "fv"},
+ {"any": "vcvttpd2udqs W:xxy{kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W1 6C /r" , "tt": "fv"},
+ {"any": "vcvttpd2uqqs W:xyz{kz}, xyz/mxyz/b64 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W1 6C /r" , "tt": "fv"},
+ {"any": "vcvtph2ibs W:xyz{kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 69 /r" , "tt": "fv"},
+ {"any": "vcvtph2iubs W:xyz{kz}, xyz/mxyz/b16 {er}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 6B /r" , "tt": "fv"},
+ {"any": "vcvttph2ibs W:xyz{kz}, xyz/mxyz/b16 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 68 /r" , "tt": "fv"},
+ {"any": "vcvttph2iubs W:xyz{kz}, xyz/mxyz/b16 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 6A /r" , "tt": "fv"},
+ {"any": "vcvttps2dqs W:xyz{kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 6D /r" , "tt": "fv"},
+ {"any": "vcvtps2ibs W:xyz{kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 69 /r" , "tt": "fv"},
+ {"any": "vcvtps2iubs W:xyz{kz}, xyz/mxyz/b32 {er}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 6B /r" , "tt": "fv"},
+ {"any": "vcvttps2ibs W:xyz{kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 68 /r" , "tt": "fv"},
+ {"any": "vcvttps2iubs W:xyz{kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 6A /r" , "tt": "fv"},
+ {"any": "vcvttps2qqs W:xyz{kz}, xxy/mxxy/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 6D /r" , "tt": "fv"},
+ {"any": "vcvttps2udqs W:xyz{kz}, xyz/mxyz/b32 {sae}" , "op": "[RM ] EVEX.xyz.NP.MAP5.W0 6C /r" , "tt": "fv"},
+ {"any": "vcvttps2uqqs W:xyz{kz}, xxy/mxxy/b32 {sae}" , "op": "[RM ] EVEX.xyz.66.MAP5.W0 6C /r" , "tt": "fv"},
+ {"any": "vcvttsd2sis W:ry, xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.F2.MAP5.Wy 6D /r" , "tt": "t1f"},
+ {"any": "vcvttsd2usis W:ry, xmm[63:0]/m64 {sae}" , "op": "[RM ] EVEX.LIG.F2.MAP5.Wy 6C /r" , "tt": "t1f"},
+ {"any": "vcvttss2sis W:ry, xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.F3.MAP5.Wy 6D /r" , "tt": "t1f"},
+ {"any": "vcvttss2usis W:ry, xmm[31:0]/m32 {sae}" , "op": "[RM ] EVEX.LIG.F3.MAP5.Wy 6C /r" , "tt": "t1f"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2", "instructions": [
+ {"any": "vmovd W:xmm[31:0], R:xmm[31:0]/m32" , "op": "[RM ] EVEX.128.F3.0F.W0 7E /r" , "tt": "t1"},
+ {"any": "vmovd W:xmm[31:0]/m32, R:xmm[31:0]" , "op": "[MR ] EVEX.128.66.0F.W0 D6 /r" , "tt": "t1"},
+ {"any": "vmovw W:xmm[15:0], R:xmm[15:0]/m16" , "op": "[RM ] EVEX.128.F3.MAP5.W0 6E /r" , "tt": "t1"},
+ {"any": "vmovw W:xmm[15:0]/m16, R:xmm[15:0]" , "op": "[MR ] EVEX.128.F3.MAP5.W0 7E /r" , "tt": "t1"}
+ ]},
+
+ {"category": "AVX10_2 SIMD", "ext": "AVX10_2 MOVRS", "instructions": [
+ {"x64": "vmovrsb X:xyz {kz}, R:mxyz" , "op": "[RM ] EVEX.xyz.F2.MAP5.W0 6F !(11):rrr:bbb", "tt": "fm"},
+ {"x64": "vmovrsd X:xyz {kz}, R:mxyz" , "op": "[RM ] EVEX.xyz.F3.MAP5.W0 6F !(11):rrr:bbb", "tt": "fm"},
+ {"x64": "vmovrsq X:xyz {kz}, R:mxyz" , "op": "[RM ] EVEX.xyz.F3.MAP5.W1 6F !(11):rrr:bbb", "tt": "fm"},
+ {"x64": "vmovrsw X:xyz {kz}, R:mxyz" , "op": "[RM ] EVEX.xyz.F2.MAP5.W1 6F !(11):rrr:bbb", "tt": "fm"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_TILE", "instructions": [
+ {"x64": "ldtilecfg R:m512" , "op": "[M ] VEX.128.NP.0F38.W0 49 !(11):000:bbb"},
+ {"apx": "ldtilecfg R:m512" , "op": "[M ] EVEX.128.NP.0F38.W0 49 !(11):000:bbb"},
+ {"x64": "sttilecfg W:m512" , "op": "[M ] VEX.128.66.0F38.W0 49 !(11):000:bbb"},
+ {"apx": "sttilecfg W:m512" , "op": "[M ] EVEX.128.66.0F38.W0 49 !(11):000:bbb"},
+ {"x64": "tileloadd W:tmm, tmem" , "op": "[RM ] VEX.128.F2.0F38.W0 4B !(11):rrr:100"},
+ {"apx": "tileloadd W:tmm, R:tmem" , "op": "[RM ] EVEX.128.F2.0F38.W0 4B !(11):rrr:100"},
+ {"x64": "tileloaddt1 W:tmm, tmem" , "op": "[RM ] VEX.128.66.0F38.W0 4B !(11):rrr:100"},
+ {"apx": "tileloaddt1 W:tmm, R:tmem" , "op": "[RM ] EVEX.128.66.0F38.W0 4B !(11):rrr:100"},
+ {"x64": "tilerelease" , "op": "[OP ] VEX.128.NP.0F38.W0 49 /0"},
+ {"x64": "tilestored W:tmem, R:tmm" , "op": "[MR ] VEX.128.F3.0F38.W0 4B !(11):rrr:100"},
+ {"apx": "tilestored W:tmem, R:tmm" , "op": "[MR ] EVEX.128.F3.0F38.W0 4B !(11):rrr:100"},
+ {"x64": "tilezero W:tmm" , "op": "[R ] VEX.128.F2.0F38.W0 49 11:rrr:000"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_BF16", "instructions": [
+ {"x64": "tdpbf16ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.F3.0F38.W0 5C 11:rrr:bbb"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_COMPLEX", "instructions": [
+ {"x64": "tcmmimfp16ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.66.0F38.W0 6C 11:rrr:bbb"},
+ {"x64": "tcmmrlfp16ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.NP.0F38.W0 6C 11:rrr:bbb"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_FP16", "instructions": [
+ {"x64": "tdpfp16ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.F2.0F38.W0 5C 11:rrr:bbb"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_INT8", "instructions": [
+ {"x64": "tdpbssd X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.F2.0F38.W0 5E 11:rrr:bbb"},
+ {"x64": "tdpbsud X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.F3.0F38.W0 5E 11:rrr:bbb"},
+ {"x64": "tdpbusd X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.66.0F38.W0 5E 11:rrr:bbb"},
+ {"x64": "tdpbuud X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.NP.0F38.W0 5E 11:rrr:bbb"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_AVX512 AVX10_2", "instructions": [
+ {"x64": "tcvtrowd2ps W:zmm, tmm, r32" , "op": "[RMV] EVEX.512.F3.0F38.W0 4A 11:rrr:bbb"},
+ {"x64": "tcvtrowd2ps W:zmm, tmm, imm8" , "op": "[RM ] EVEX.512.F3.0F3A.W0 07 11:rrr:bbb ib"},
+ {"x64": "tcvtrowps2pbf16h W:zmm, tmm, r32" , "op": "[RMV] EVEX.512.F2.0F38.W0 6D 11:rrr:bbb"},
+ {"x64": "tcvtrowps2pbf16h W:zmm, tmm, imm8" , "op": "[RM ] EVEX.512.F2.0F3A.W0 07 11:rrr:bbb ib"},
+ {"x64": "tcvtrowps2pbf16l W:zmm, tmm, r32" , "op": "[RMV] EVEX.512.F3.0F38.W0 6D 11:rrr:bbb"},
+ {"x64": "tcvtrowps2pbf16l W:zmm, tmm, imm8" , "op": "[RM ] EVEX.512.F3.0F3A.W0 77 11:rrr:bbb ib"},
+ {"x64": "tcvtrowps2phh W:zmm, tmm, r32" , "op": "[RMV] EVEX.512.NP.0F38.W0 6D 11:rrr:bbb"},
+ {"x64": "tcvtrowps2phh W:zmm, tmm, imm8" , "op": "[RM ] EVEX.512.NP.0F3A.W0 07 11:rrr:bbb ib"},
+ {"x64": "tcvtrowps2phl W:zmm, tmm, r32" , "op": "[RMV] EVEX.512.66.0F38.W0 6D 11:rrr:bbb"},
+ {"x64": "tcvtrowps2phl W:zmm, tmm, imm8" , "op": "[RM ] EVEX.512.F2.0F3A.W0 77 11:rrr:bbb ib"},
+ {"x64": "tilemovrow W:zmm, tmm, r32" , "op": "[RMV] EVEX.512.66.0F38.W0 4A 11:rrr:bbb"},
+ {"x64": "tilemovrow W:zmm, tmm, imm8" , "op": "[RMV] EVEX.512.66.0F3A.W0 07 11:rrr:bbb ib"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_FP8", "instructions": [
+ {"x64": "tdpbf8ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.NP.MAP5.W0 FD 11:rrr:bbb"},
+ {"x64": "tdpbhf8ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.F2.MAP5.W0 FD 11:rrr:bbb"},
+ {"x64": "tdphbf8ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.F3.MAP5.W0 FD 11:rrr:bbb"},
+ {"x64": "tdphf8ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.66.MAP5.W0 FD 11:rrr:bbb"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_MOVRS", "instructions": [
+ {"x64": "tileloaddrs W:tmm, tmem" , "op": "[RM ] VEX.128.F2.0F38.W0 4A !(11):rrr:100"},
+ {"apx": "tileloaddrs W:tmm, tmem" , "op": "[RM ] EVEX.128.F2.0F38.W0 4A !(11):rrr:100"},
+ {"x64": "tileloaddrst1 W:tmm, tmem" , "op": "[RM ] VEX.128.66.0F38.W0 4A !(11):rrr:100"},
+ {"apx": "tileloaddrst1 W:tmm, tmem" , "op": "[RM ] EVEX.128.66.0F38.W0 4A !(11):rrr:100"}
+ ]},
+
+ {"category": "AMX", "ext": "AMX_TF32", "instructions": [
+ {"x64": "tmmultf32ps X:tmm, tmm, tmm" , "op": "[RMV] VEX.128.66.0F38.W0 48 11:rrr:bbb"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "APX_F", "instructions": [
+ {"apx": "adc x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 10 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 11 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 12 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 13 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /2 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /2 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /2 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 10 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 11 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 12 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 13 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /2 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /2 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "adc W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /2 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "add{nf} x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 00 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 01 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 02 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 03 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /0 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /0 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /0 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 00 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 01 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 02 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 03 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /0 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /0 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "add{nf} W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /0 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "and{nf} x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 20 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 21 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 22 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 23 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /4 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /4 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /4 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 20 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 21 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 22 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 23 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /4 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /4 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "and{nf} W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /4 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "cmovb X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 42 /r" , "io": "CF=R"},
+ {"apx": "cmovbe X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 46 /r" , "io": "CF=R ZF=R"},
+ {"apx": "cmovl X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 4C /r" , "io": "SF=R OF=R"},
+ {"apx": "cmovle X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"apx": "cmovnb X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 43 /r" , "io": "CF=R"},
+ {"apx": "cmovnbe X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 47 /r" , "io": "CF=R ZF=R"},
+ {"apx": "cmovnl X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 4D /r" , "io": "SF=R OF=R"},
+ {"apx": "cmovnle X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"apx": "cmovno X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 41 /r" , "io": "OF=R"},
+ {"apx": "cmovnp X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 4B /r" , "io": "PF=R"},
+ {"apx": "cmovns X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 49 /r" , "io": "SF=R"},
+ {"apx": "cmovnz X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 45 /r" , "io": "ZF=R"},
+ {"apx": "cmovo X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 40 /r" , "io": "OF=R"},
+ {"apx": "cmovp X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 4A /r" , "io": "PF=R"},
+ {"apx": "cmovs X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 48 /r" , "io": "SF=R"},
+ {"apx": "cmovz X:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 44 /r" , "io": "ZF=R"},
+ {"any": "crc32 X:r32, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.W0 F0 /r"},
+ {"any": "crc32 X:r64, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.W1 F0 /r"},
+ {"any": "crc32 X:r32, R:r16/m16" , "op": "[RM ] EVEX.ND=0.LLZ.66.MAP4.W0 F1 /r"},
+ {"any": "crc32 X:r32, R:r32/m32" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.W0 F1 /r"},
+ {"any": "crc32 X:r64, R:r64/m64" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.W1 F1 /r"},
+ {"apx": "dec{nf} X:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG FE /1" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "dec{nf} X:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv FF /1" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "dec{nf} W:r8, R:r8/m8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG FE /1" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "dec{nf} W:rv, R:rv/mv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv FF /1" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "inc{nf} X:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG FE /0" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "inc{nf} X:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv FF /0" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "inc{nf} W:r8, R:r8/m8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG FE /0" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"apx": "inc{nf} W:rv, R:rv/mv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv FF /0" , "io": "OF=W SF=W ZF=W AF=W PF=W"},
+ {"any": "div{nf} x:<ax>, R:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG F6 /6" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"any": "div{nf} x:<dxv>, x:<axv>, R:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F7 /6" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"apx": "idiv{nf} x:<ax>, R:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG F6 /7" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"apx": "idiv{nf} x:<dxv>, x:<axv>, R:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F7 /7" , "io": "OF=U SF=U ZF=U AF=U PF=U CF=U"},
+ {"apx": "imul{nf} x:<ax>, R:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG F6 /5" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imul{nf} w:<dxv>, x:<axv>, R:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F7 /5" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imul{nf} x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv AF /r" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imul{nf} W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv AF /r" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imul{nf} w:rv, R:rv/mv, imms8" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 6B /r ib" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imul{nf} w:rv, R:rv/mv, immv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 69 /r iv" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imulzu{nf} W:r16, R:r16/m16, imms8" , "op": "[RM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 6B /r ib" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "imulzu{nf} W:r16, R:r16/m16, imm16" , "op": "[RM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 69 /r iv" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "mul{nf} x:<ax>, R:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG F6 /4" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "mul{nf} w:<dxv>, x:<axv>, rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F7 /4" , "io": "OF=W SF=W ZF=U AF=U PF=U CF=W"},
+ {"apx": "neg{nf} X:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG F6 /3" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "neg{nf} X:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F7 /3" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "neg{nf} W:r8, R:r8/m8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG F6 /3" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "neg{nf} W:rv, R:rv/mv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv F7 /3" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "not{nf} X:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG F6 /2"},
+ {"apx": "not{nf} X:rv/mv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv F7 /2"},
+ {"apx": "not{nf} W:r8, R:r8/m8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG F6 /2"},
+ {"apx": "not{nf} W:rv, R:rv/mv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv F7 /2"},
+ {"apx": "or{nf} x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 08 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 0A /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 0B /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /1 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 08 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 09 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 0A /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 0B /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /1 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "or{nf} W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /1 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "rcl x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /2 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcl x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /2 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcl W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /2" , "io": "CF=X OF=X"},
+ {"apx": "rcl W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /2 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcl W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /2 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcr x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /3 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcr x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /3 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcr W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /3" , "io": "CF=X OF=X"},
+ {"apx": "rcr W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /3 ib" , "io": "CF=X OF=X"},
+ {"apx": "rcr W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /3 ib" , "io": "CF=X OF=X"},
+ {"apx": "rol{nf} x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /0 ib" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /0 ib" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /0" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /0 ib" , "io": "CF=W OF=W"},
+ {"apx": "rol{nf} W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /0 ib" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /1 ib" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /1 ib" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /1" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /1 ib" , "io": "CF=W OF=W"},
+ {"apx": "ror{nf} W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /1 ib" , "io": "CF=W OF=W"},
+ {"apx": "sar{nf} x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /7" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sar{nf} W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /7 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sbb x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 18 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 19 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 1A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 1B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /3 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /3 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /3 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 18 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 19 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 1A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 1B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /3 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /3 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "sbb W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /3 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=X"},
+ {"apx": "shl{nf} x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /4 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /6 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /4 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /6 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /4" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /6" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /4 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /6 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /4 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shl{nf} W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /6 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shld{nf} x:rv/mv, R:rv, R:cl" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv A5 /r" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shld{nf} x:rv/mv, R:rv, imm8" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 24 /r ib" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shld{nf} W:rv, R:rv/mv, R:rv, R:cl" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv A5 /r" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shld{nf} W:rv, R:rv/mv, R:rv, imm8" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 24 /r ib" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shr{nf} x:r8/m8, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D2 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} x:rv/mv, R:cl" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D3 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} x:r8/m8, 1" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG D0 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} x:rv/mv, 1" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv D1 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG C0 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} x:rv/mv, imm8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv C1 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} W:r8, R:r8/m8, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D2 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} W:rv, R:rv/mv, R:cl" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D3 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} W:r8, R:r8/m8, 1" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG D0 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} W:rv, R:rv/mv, 1" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv D1 /5" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG C0 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shr{nf} W:rv, R:rv/mv, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv C1 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "shrd{nf} x:rv/mv, R:rv, R:cl" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv AD /r" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shrd{nf} x:rv/mv, R:rv, imm8" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 2C /r ib" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shrd{nf} W:rv, R:rv/mv, R:rv, R:cl" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv AD /r" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "shrd{nf} W:rv, R:rv/mv, R:rv, imm8" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 2C /r ib" , "io": "OF=W SF=W ZF=W AF=U PF=W CF=W"},
+ {"apx": "sub{nf} x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 28 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 29 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 2A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 2B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /5 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 28 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 29 /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 2A /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 2B /r" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /5 ib" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "sub{nf} W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /5 iv" , "io": "OF=W SF=W ZF=W AF=W PF=W CF=W"},
+ {"apx": "xor{nf} x:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.LLZ.NP.MAP4.WIG 38 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} x:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 39 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} x:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.LLZ.NP.MAP4.WIG 3A /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} x:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 3B /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} x:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.LLZ.NP.MAP4.WIG 80 /6 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} x:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 83 /6 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} x:rv/mv, immv" , "op": "[M ] EVEX.ND=0.LLZ.Pv.MAP4.Wv 81 /6 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:r8, R:r8/m8, R:r8" , "op": "[VMR] EVEX.ND=1.LLZ.NP.MAP4.WIG 38 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:rv, R:rv/mv, R:rv" , "op": "[VMR] EVEX.ND=1.LLZ.Pv.MAP4.Wv 39 /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:r8, R:r8, R:r8/m8" , "op": "[VRM] EVEX.ND=1.LLZ.NP.MAP4.WIG 3A /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:rv, R:rv, R:rv/mv" , "op": "[VRM] EVEX.ND=1.LLZ.Pv.MAP4.Wv 3B /r" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:r8, R:r8/m8, imm8" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.WIG 80 /6 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:rv, R:rv/mv, imms8" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 83 /6 ib" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"},
+ {"apx": "xor{nf} W:rv, R:rv/mv, immv" , "op": "[VM ] EVEX.ND=1.LLZ.Pv.MAP4.Wv 81 /6 iv" , "io": "OF=0 SF=W ZF=W AF=U PF=W CF=0"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "USER_MSR", "instructions": [
+ {"x64": "urdmsr W:r64, R:r64" , "op": "[MR ] F2 0F 38 F8 11:rrr:bbb"},
+ {"apx": "urdmsr W:r64, R:r64" , "op": "[MR ] EVEX.ND=0.LLZ.F2.MAP4.W0 F8 11:rrr:bbb"},
+ {"x64": "urdmsr W:r64, imm32" , "op": "[M ] VEX.128.F2.MAP7.W0 F8 11:000:bbb id"},
+ {"apx": "urdmsr W:r64, imm32" , "op": "[M ] EVEX.128.F2.MAP7.W0 F8 11:000:bbb id"},
+ {"x64": "uwrmsr R:r64, R:r64" , "op": "[RM ] F3 0F 38 F8 11:rrr:bbb"},
+ {"apx": "uwrmsr R:r64, R:r64" , "op": "[RM ] EVEX.ND=0.LLZ.F3.MAP4.W0 F8 11:rrr:bbb"},
+ {"x64": "uwrmsr imm32, R:r64" , "op": "[M ] VEX.128.F3.MAP7.W0 F8 11:000:bbb id"},
+ {"apx": "uwrmsr imm32, R:r64" , "op": "[M ] EVEX.128.F3.MAP7.W0 F8 11:000:bbb id"}
+ ]},
+
+ {"category": "GP GP_EXT", "ext": "APX_F", "instructions": [
+ {"x64": "ccmpb dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=2.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpb dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpb dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=2.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpb dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpb dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpb dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpb dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpbe dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=6.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpbe dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpbe dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=6.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpbe dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpbe dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpbe dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpbe dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpf dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=A.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpf dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpf dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=A.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpf dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpf dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpf dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpf dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpl dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=C.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpl dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpl dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=C.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpl dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpl dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpl dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpl dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmple dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=E.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmple dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmple dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=E.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmple dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmple dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmple dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmple dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpnb dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=3.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpnb dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpnb dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=3.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpnb dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpnb dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpnb dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpnb dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpnbe dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=7.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpnbe dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpnbe dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=7.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpnbe dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpnbe dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpnbe dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpnbe dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpnl dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=D.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpnl dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpnl dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=D.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpnl dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpnl dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpnl dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpnl dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpnle dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=F.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpnle dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpnle dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=F.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpnle dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpnle dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpnle dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpnle dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpno dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=1.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpno dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpno dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=1.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpno dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpno dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpno dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpno dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpns dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=9.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpns dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpns dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=9.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpns dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpns dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpns dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpns dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpnz dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=5.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpnz dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpnz dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=5.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpnz dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpnz dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpnz dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpnz dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpo dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=0.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpo dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpo dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=0.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpo dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpo dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpo dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpo dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmps dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=8.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmps dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmps dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=8.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmps dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmps dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmps dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmps dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpt dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=B.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpt dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpt dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=B.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpt dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpt dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpt dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpt dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "ccmpz dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=4.LLZ.NP.MAP4.WIG 38 /r" },
+ {"x64": "ccmpz dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv 39 /r" },
+ {"x64": "ccmpz dfv, R:r8, R:r8/m8" , "op": "[RM ] EVEX.ND=0.SCC=4.LLZ.NP.MAP4.WIG 3A /r" },
+ {"x64": "ccmpz dfv, R:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv 3B /r" },
+ {"x64": "ccmpz dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.NP.MAP4.WIG 80 /7 ib" },
+ {"x64": "ccmpz dfv, R:rv/mv, imms8" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv 83 /7 ib" },
+ {"x64": "ccmpz dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv 81 /7 iv" },
+ {"x64": "cfcmovb X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 42 /r" , "io": "CF=R"},
+ {"x64": "cfcmovb X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 42 /r" , "io": "CF=R"},
+ {"x64": "cfcmovb X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 42 /r" , "io": "CF=R"},
+ {"x64": "cfcmovb W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 42 /r" , "io": "CF=R"},
+ {"x64": "cfcmovbe X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 46 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovbe X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 46 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovbe X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 46 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovbe W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 46 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovl X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 4C /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovl X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4C /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovl X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4C /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovl W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 4C /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovle X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovle X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovle X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovle W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovnb X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 43 /r" , "io": "CF=R"},
+ {"x64": "cfcmovnb X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 43 /r" , "io": "CF=R"},
+ {"x64": "cfcmovnb X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 43 /r" , "io": "CF=R"},
+ {"x64": "cfcmovnb W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 43 /r" , "io": "CF=R"},
+ {"x64": "cfcmovnbe X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 47 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovnbe X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 47 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovnbe X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 47 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovnbe W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 47 /r" , "io": "CF=R ZF=R"},
+ {"x64": "cfcmovnl X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 4D /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovnl X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4D /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovnl X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4D /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovnl W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 4D /r" , "io": "SF=R OF=R"},
+ {"x64": "cfcmovnle X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovnle X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovnle X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovnle W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "cfcmovno X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 41 /r" , "io": "OF=R"},
+ {"x64": "cfcmovno X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 41 /r" , "io": "OF=R"},
+ {"x64": "cfcmovno X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 41 /r" , "io": "OF=R"},
+ {"x64": "cfcmovno W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 41 /r" , "io": "OF=R"},
+ {"x64": "cfcmovnp X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 4B /r" , "io": "PF=R"},
+ {"x64": "cfcmovnp X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4B /r" , "io": "PF=R"},
+ {"x64": "cfcmovnp X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4B /r" , "io": "PF=R"},
+ {"x64": "cfcmovnp W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 4B /r" , "io": "PF=R"},
+ {"x64": "cfcmovns X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 49 /r" , "io": "SF=R"},
+ {"x64": "cfcmovns X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 49 /r" , "io": "SF=R"},
+ {"x64": "cfcmovns X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 49 /r" , "io": "SF=R"},
+ {"x64": "cfcmovns W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 49 /r" , "io": "SF=R"},
+ {"x64": "cfcmovnz X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 45 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovnz X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 45 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovnz X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 45 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovnz W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 45 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovo X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 40 /r" , "io": "OF=R"},
+ {"x64": "cfcmovo X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 40 /r" , "io": "OF=R"},
+ {"x64": "cfcmovo X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 40 /r" , "io": "OF=R"},
+ {"x64": "cfcmovo W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 40 /r" , "io": "OF=R"},
+ {"x64": "cfcmovp X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 4A /r" , "io": "PF=R"},
+ {"x64": "cfcmovp X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4A /r" , "io": "PF=R"},
+ {"x64": "cfcmovp X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 4A /r" , "io": "PF=R"},
+ {"x64": "cfcmovp W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 4A /r" , "io": "PF=R"},
+ {"x64": "cfcmovs X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 48 /r" , "io": "SF=R"},
+ {"x64": "cfcmovs X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 48 /r" , "io": "SF=R"},
+ {"x64": "cfcmovs X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 48 /r" , "io": "SF=R"},
+ {"x64": "cfcmovs W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 48 /r" , "io": "SF=R"},
+ {"x64": "cfcmovz X:rv, R:rv/mv" , "op": "[RM ] EVEX.ND=0.NF=0.LLZ.Pv.MAP4.Wv 44 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovz X:rv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 44 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovz X?:mv, R:rv" , "op": "[MR ] EVEX.ND=0.NF=1.LLZ.Pv.MAP4.Wv 44 /r" , "io": "ZF=R"},
+ {"x64": "cfcmovz W:rv, R:rv, R?:rv/mv" , "op": "[VRM] EVEX.ND=1.NF=1.LLZ.Pv.MAP4.Wv 44 /r" , "io": "ZF=R"},
+ {"x64": "ctestb dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=2.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestb dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestb dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestb dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestb dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestb dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=2.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestbe dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=6.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestbe dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestbe dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestbe dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestbe dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestbe dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=6.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestf dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=A.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestf dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestf dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestf dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestf dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestf dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=A.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestl dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=C.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestl dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestl dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestl dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestl dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestl dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=C.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestle dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=E.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestle dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestle dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestle dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestle dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestle dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=E.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestnb dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=3.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestnb dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestnb dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestnb dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestnb dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestnb dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=3.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestnbe dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=7.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestnbe dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestnbe dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestnbe dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestnbe dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestnbe dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=7.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestnl dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=D.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestnl dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestnl dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestnl dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestnl dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestnl dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=D.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestnle dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=F.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestnle dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestnle dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestnle dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestnle dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestnle dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=F.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestno dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=1.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestno dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestno dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestno dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestno dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestno dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=1.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestns dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=9.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestns dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestns dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestns dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestns dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestns dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=9.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestnz dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=5.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestnz dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestnz dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestnz dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestnz dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestnz dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=5.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctesto dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=0.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctesto dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctesto dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctesto dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctesto dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctesto dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=0.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctests dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=8.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctests dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctests dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctests dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctests dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctests dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=8.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestt dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=B.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestt dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestt dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestt dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestt dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestt dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=B.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "ctestz dfv, R:r8/m8, R:r8" , "op": "[MR ] EVEX.ND=0.SCC=4.LLZ.NP.MAP4.WIG 84 /r" },
+ {"x64": "ctestz dfv, R:rv/mv, R:rv" , "op": "[MR ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv 85 /r" },
+ {"x64": "ctestz dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.NP.MAP4.WIG F6 /0 ib" },
+ {"x64": "ctestz dfv, R:r8/m8, imm8" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.NP.MAP4.WIG F6 /1 ib" },
+ {"x64": "ctestz dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv F7 /0 iv" },
+ {"x64": "ctestz dfv, R:rv/mv, immv" , "op": "[M ] EVEX.ND=0.SCC=4.LLZ.Pv.MAP4.Wv F7 /1 iv" },
+ {"x64": "jmpabs imm64" , "op": "[OP] NO67 NP REX2.MAP0.W0 A1 iq"},
+ {"x64": "pop2 W:r64, W:r64" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.W0 8F 11:000:bbb"},
+ {"x64": "pop2p W:r64, W:r64" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.W1 8F 11:000:bbb"},
+ {"x64": "popp W:r64" , "op": "[OP] REX2.MAP0.W1 58+r"},
+ {"x64": "push2 R:r64, R:r64" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.W0 FF 11:110:bbb"},
+ {"x64": "push2p R:r64, R:r64" , "op": "[VM ] EVEX.ND=1.LLZ.NP.MAP4.W1 FF 11:110:bbb"},
+ {"x64": "pushp R:r64" , "op": "[OP] REX2.MAP0.W1 50+r"},
+ {"x64": "setb w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 42 /r" , "io": "CF=R"},
+ {"x64": "setbe w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 46 /r" , "io": "CF=R ZF=R"},
+ {"x64": "setl w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 4C /r" , "io": "SF=R OF=R"},
+ {"x64": "setle w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "setnb w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 43 /r" , "io": "CF=R"},
+ {"x64": "setnbe w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 47 /r" , "io": "CF=R ZF=R"},
+ {"x64": "setnl w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 4D /r" , "io": "SF=R OF=R"},
+ {"x64": "setnle w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "setno w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 41 /r" , "io": "OF=R"},
+ {"x64": "setnp w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 4B /r" , "io": "PF=R"},
+ {"x64": "setns w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 49 /r" , "io": "SF=R"},
+ {"x64": "setnz w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 45 /r" , "io": "ZF=R"},
+ {"x64": "seto w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 40 /r" , "io": "OF=R"},
+ {"x64": "setp w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 4A /r" , "io": "PF=R"},
+ {"x64": "sets w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 48 /r" , "io": "SF=R"},
+ {"x64": "setz w:r8/m8" , "op": "[M ] EVEX.ND=0.LLZ.F2.MAP4.WIG 44 /r" , "io": "ZF=R"},
+ {"x64": "setzub W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 42 /r" , "io": "CF=R"},
+ {"x64": "setzube W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 46 /r" , "io": "CF=R ZF=R"},
+ {"x64": "setzul W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 4C /r" , "io": "SF=R OF=R"},
+ {"x64": "setzule W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 4E /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "setzunb W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 43 /r" , "io": "CF=R"},
+ {"x64": "setzunbe W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 47 /r" , "io": "CF=R ZF=R"},
+ {"x64": "setzunl W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 4D /r" , "io": "SF=R OF=R"},
+ {"x64": "setzunle W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 4F /r" , "io": "ZF=R SF=R OF=R"},
+ {"x64": "setzuno W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 41 /r" , "io": "OF=R"},
+ {"x64": "setzunp W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 4B /r" , "io": "PF=R"},
+ {"x64": "setzuns W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 49 /r" , "io": "SF=R"},
+ {"x64": "setzunz W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 45 /r" , "io": "ZF=R"},
+ {"x64": "setzuo W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 40 /r" , "io": "OF=R"},
+ {"x64": "setzup W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 4A /r" , "io": "PF=R"},
+ {"x64": "setzus W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 48 /r" , "io": "SF=R"},
+ {"x64": "setzuz W:r8" , "op": "[M ] EVEX.ND=1.LLZ.F2.MAP4.WIG 44 /r" , "io": "ZF=R"}
+ ]}
+ ],
+
+ "aliases": {
+ "ccmpb" : {"aliases": ["ccmpnae", "ccmpc" ], "format": "ccmp.b|nae|c" , "sign": "u"},
+ "ccmpbe" : {"aliases": ["ccmpna" ], "format": "ccmp.be|na" , "sign": "u"},
+ "ccmpl" : {"aliases": ["ccmpnge" ], "format": "ccmp.l|nge" , "sign": "s"},
+ "ccmple" : {"aliases": ["ccmpng" ], "format": "ccmp.le|ng" , "sign": "s"},
+ "ccmpnb" : {"aliases": ["ccmpae", "ccmpnc" ], "format": "ccmp.nb|ae|nc" , "sign": "u"},
+ "ccmpnbe" : {"aliases": ["ccmpa" ], "format": "ccmp.nbe|a" , "sign": "u"},
+ "ccmpnl" : {"aliases": ["ccmpge" ], "format": "ccmp.nl|ge" , "sign": "s"},
+ "ccmpnle" : {"aliases": ["ccmpg" ], "format": "ccmp.nle|g" , "sign": "s"},
+ "ccmpnz" : {"aliases": ["ccmpne" ], "format": "ccmp.nz|ne" , "sign": "_"},
+ "ccmpz" : {"aliases": ["ccmpe" ], "format": "ccmp.z|e" , "sign": "_"},
+
+ "cfcmovb" : {"aliases": ["cfcmovnae", "cfcmovc"], "format": "cfmov.b|nae|c" , "sign": "u"},
+ "cfcmovbe" : {"aliases": ["cfcmovna" ], "format": "cfmov.be|na" , "sign": "u"},
+ "cfcmovl" : {"aliases": ["cfcmovnge" ], "format": "cfmov.l|nge" , "sign": "s"},
+ "cfcmovle" : {"aliases": ["cfcmovng" ], "format": "cfmov.le|ng" , "sign": "s"},
+ "cfcmovnb" : {"aliases": ["cfcmovae", "cfcmovnc"], "format": "cfmov.nb|ae|nc" , "sign": "u"},
+ "cfcmovnbe": {"aliases": ["cfcmova" ], "format": "cfmov.nbe|a" , "sign": "u"},
+ "cfcmovnl" : {"aliases": ["cfcmovge" ], "format": "cfmov.nl|ge" , "sign": "s"},
+ "cfcmovnle": {"aliases": ["cfcmovg" ], "format": "cfmov.nle|g" , "sign": "s"},
+ "cfcmovnp" : {"aliases": ["cfcmovpo" ], "format": "cfmov.np|po" , "sign": "_"},
+ "cfcmovnz" : {"aliases": ["cfcmovne" ], "format": "cfmov.nz|ne" , "sign": "_"},
+ "cfcmovp" : {"aliases": ["cfcmovpe" ], "format": "cfmov.p|pe" , "sign": "_"},
+ "cfcmovz" : {"aliases": ["cfcmove" ], "format": "cfmov.z|e" , "sign": "_"},
+
+ "cmovb" : {"aliases": ["cmovnae", "cmovc" ], "format": "cmov.b|nae|c" , "sign": "u"},
+ "cmovbe" : {"aliases": ["cmovna" ], "format": "cmov.be|na" , "sign": "u"},
+ "cmovl" : {"aliases": ["cmovnge" ], "format": "cmov.l|nge" , "sign": "s"},
+ "cmovle" : {"aliases": ["cmovng" ], "format": "cmov.le|ng" , "sign": "s"},
+ "cmovnb" : {"aliases": ["cmovae", "cmovnc" ], "format": "cmov.nb|ae|nc" , "sign": "u"},
+ "cmovnbe" : {"aliases": ["cmova" ], "format": "cmov.nbe|a" , "sign": "u"},
+ "cmovnl" : {"aliases": ["cmovge" ], "format": "cmov.nl|ge" , "sign": "s"},
+ "cmovnle" : {"aliases": ["cmovg" ], "format": "cmov.nle|g" , "sign": "s"},
+ "cmovnp" : {"aliases": ["cmovpo" ], "format": "cmov.np|po" , "sign": "_"},
+ "cmovnz" : {"aliases": ["cmovne" ], "format": "cmov.nz|ne" , "sign": "_"},
+ "cmovp" : {"aliases": ["cmovpe" ], "format": "cmov.p|pe" , "sign": "_"},
+ "cmovz" : {"aliases": ["cmove" ], "format": "cmov.z|e" , "sign": "_"},
+
+ "ctestb" : {"aliases": ["ctestnae", "ctestc" ], "format": "ctest.b|nae|c" , "sign": "u"},
+ "ctestbe" : {"aliases": ["ctestna" ], "format": "ctest.be|na" , "sign": "u"},
+ "ctestl" : {"aliases": ["ctestnge" ], "format": "ctest.l|nge" , "sign": "s"},
+ "ctestle" : {"aliases": ["ctestng" ], "format": "ctest.le|ng" , "sign": "s"},
+ "ctestnb" : {"aliases": ["ctestae", "ctestnc" ], "format": "ctest.nb|ae|nc" , "sign": "u"},
+ "ctestnbe" : {"aliases": ["ctesta" ], "format": "ctest.nbe|a" , "sign": "u"},
+ "ctestnl" : {"aliases": ["ctestge" ], "format": "ctest.nl|ge" , "sign": "s"},
+ "ctestnle" : {"aliases": ["ctestg" ], "format": "ctest.nle|g" , "sign": "s"},
+ "ctestnz" : {"aliases": ["ctestne" ], "format": "ctest.nz|ne" , "sign": "_"},
+ "ctestz" : {"aliases": ["cteste" ], "format": "ctest.z|e" , "sign": "_"},
+
+ "jb" : {"aliases": ["jnae", "jc" ], "format": "jb|jnae|jc" , "sign": "u"},
+ "jbe" : {"aliases": ["jna" ], "format": "jbe|jna" , "sign": "u"},
+ "jl" : {"aliases": ["jnge" ], "format": "jl|jnge" , "sign": "s"},
+ "jle" : {"aliases": ["jng" ], "format": "jle|jng" , "sign": "s"},
+ "jnb" : {"aliases": ["jae", "jnc" ], "format": "jnb|jae|jnc" , "sign": "u"},
+ "jnbe" : {"aliases": ["ja" ], "format": "jnbe|ja" , "sign": "u"},
+ "jnl" : {"aliases": ["jge" ], "format": "jnl|jge" , "sign": "s"},
+ "jnle" : {"aliases": ["jg" ], "format": "jnle|jg" , "sign": "s"},
+ "jnp" : {"aliases": ["jpo" ], "format": "jnp|jpo" , "sign": "_"},
+ "jnz" : {"aliases": ["jne" ], "format": "jnz|jne" , "sign": "_"},
+ "jp" : {"aliases": ["jpe" ], "format": "jp|jpe" , "sign": "_"},
+ "jz" : {"aliases": ["je" ], "format": "jz|je" , "sign": "_"},
+
+ "setb" : {"aliases": ["setnae", "setc" ], "format": "set.b|nae|c" , "sign": "u"},
+ "setbe" : {"aliases": ["setna" ], "format": "set.be|na" , "sign": "u"},
+ "setl" : {"aliases": ["setnge" ], "format": "set.l|nge" , "sign": "s"},
+ "setle" : {"aliases": ["setng" ], "format": "set.le|ng" , "sign": "s"},
+ "setnb" : {"aliases": ["setae", "setnc" ], "format": "set.nb|ae|nc" , "sign": "u"},
+ "setnbe" : {"aliases": ["seta" ], "format": "set.nbe|a" , "sign": "u"},
+ "setnl" : {"aliases": ["setge" ], "format": "set.nl|ge" , "sign": "s"},
+ "setnle" : {"aliases": ["setg" ], "format": "set.nle|g" , "sign": "s"},
+ "setnp" : {"aliases": ["setpo" ], "format": "set.np|po" , "sign": "_"},
+ "setnz" : {"aliases": ["setne" ], "format": "set.nz|ne" , "sign": "_"},
+ "setp" : {"aliases": ["setpe" ], "format": "set.p|pe" , "sign": "_"},
+ "setz" : {"aliases": ["sete" ], "format": "set.z|e" , "sign": "_"},
+
+ "setzub" : {"aliases": ["setzunae", "setzuc" ], "format": "setzu.b|nae|c" , "sign": "u"},
+ "setzube" : {"aliases": ["setzuna" ], "format": "setzu.be|na" , "sign": "u"},
+ "setzul" : {"aliases": ["setzunge" ], "format": "setzu.l|nge" , "sign": "s"},
+ "setzule" : {"aliases": ["setzung" ], "format": "setzu.le|ng" , "sign": "s"},
+ "setzunb" : {"aliases": ["setzuae", "setzunc" ], "format": "setzu.nb|ae|nc" , "sign": "u"},
+ "setzunbe" : {"aliases": ["setzua" ], "format": "setzu.nbe|a" , "sign": "u"},
+ "setzunl" : {"aliases": ["setzuge" ], "format": "setzu.nl|ge" , "sign": "s"},
+ "setzunle" : {"aliases": ["setzug" ], "format": "setzu.nle|g" , "sign": "s"},
+ "setzunp" : {"aliases": ["setzupo" ], "format": "setzu.np|po" , "sign": "_"},
+ "setzunz" : {"aliases": ["setzune" ], "format": "setzu.nz|ne" , "sign": "_"},
+ "setzup" : {"aliases": ["setzupe" ], "format": "setzu.p|pe" , "sign": "_"},
+ "setzuz" : {"aliases": ["setzue" ], "format": "setzu.z|e" , "sign": "_"},
+
+ "fwait" : {"aliases": ["wait" ], "format": "fwait"},
+ "shl" : {"aliases": ["sal" ], "format": "shl"}
+ },
+
+ "postproc": [
+ {"group": "Control Flow", "instructions": [
+ {"name": "call lcall", "control": "call"},
+ {"name": "iret iretd iretq", "control": "return"},
+ {"name": "jb jbe jl jle jnb jnbe jnl jnle jno jnp jns jnz jo jp js jz jecxz", "control": "branch"},
+ {"name": "jmp jmpabs ljmp", "control": "jump"},
+ {"name": "loop loope loopne", "control": "branch"},
+ {"name": "ret retf", "control": "return"}
+ ]},
+
+ {"group": "Encoding Preference", "instructions": [
+ {"name": "vcvtneps2bf16", "encodingPreference": "EVEX"},
+ {"name": "vpmadd52huq vpmadd52luq", "encodingPreference": "EVEX"},
+ {"name": "vpdpbusd vpdpbusds vpdpwssd vpdpwssds", "encodingPreference": "EVEX"}
+ ]}
+ ]
+}
diff --git a/3rdparty/asmjit/db/isa_x86.md b/3rdparty/asmjit/db/isa_x86.md
new file mode 100644
index 00000000000..7a761d7730d
--- /dev/null
+++ b/3rdparty/asmjit/db/isa_x86.md
@@ -0,0 +1,145 @@
+X86 ISA - JSON Database Documentation
+-------------------------------------
+
+This file provides a documentation of isa_x86.json file, which contains a compact X86 and X86_64 instruction database. The database has been created from several manuals from Intel and AMD, which describes the encoding of instructions and other properties. The database tries to keep the instruction and opcode formats compatible with the database, however, in cases where applicable it tries to simplify it (for example merging instructions that all use either XMM, YMM, or ZMM registers, etc...).
+
+## Instruction Category
+
+Each set of instructions start with category group, which looks like the following:
+
+```json
+{"category": "<LIST_OF_CATEGORIES>", "ext": "<LIST_OF_EXTENSIONS>", /* flags, */ "instructions": [
+ /* (instruction records) */
+]}
+```
+
+Fields:
+
+ - `category` - describes a single or multiple categories this instruction belongs to. In general the database is written in a way to provide "baseline" and "extended" categories, so have the following categories used to distinguish between different set of instructions:
+ - `GP` - General purpose instructions.
+ - `GP_EXT` - Extensions to general purpose instructions (such as BMI, POPCNT, etc...).
+ - `MMX` - MMX and 3DNOW instructions (in general instructions using MM registers).
+ - `SSE` - SSE to SSE4.2 instructions, including other extensions that don't use VEX/EVEX prefixes.
+ - `AVX` - AVX, AVX2, and other instructions that use SIMD registers (XMM, YMM) and VEX prefix.
+ - `AVX512` - AVX512 instructions.
+
+ - `ext` (optional) - describes extensions required to execute the instruction. When multiple extensions are in the list it means ALL of them must be available. For example `AESNI` means that `AESNI` extension is required, `AVX AESNI` means that both `AVX` and `AESNI` extensions are required.
+
+ - `deprecated` (optional) - deprecation flag (either `true` or `false`), by default instructions are not deprecated.
+
+ - `volatile` (optional) - volatility flag (either `true` or `false`), by default instructions are not volatile (note that volatile flag is used for code generators and in general it says that the instruction should not be reordered and nothing above it should move below and vice versa).
+
+ - `instructions` - array of instruction records, one line per instruction.
+
+## Instruction Record
+
+A single instruction record looks like the following:
+
+```json
+{"<ARCH>": "<INSTRUCTION_SIGNATURE>", "op": "[<ENCODING_OPS>] <ENCODING_DATA>" /*, <ADDITIONAL_DATA>*/ }
+```
+
+### Architecture Field
+
+`<ARCH>` field describes the architecture and optionally `APX_F` promoted instruction:
+
+ - `any` - The instruction can run in both 32-bit and 64-bit mode and shares the encoding.
+ - `x86` - The instruction can only run in 32-bit mode. This in general may be an indication that the instruction was deprecated in 64-bit mode or that the instruction has a different signature in 64-bit mode (some instructions require 32-bit registers in 32-bit mode and 64-bit registers in 64-bit mode, for example)
+ - `x64` - The instruction can only run in 64-bit mode.
+ - `apx` - The instruction can only run in 64-bit mode with `APX_F` extension present. This notation is only used for `APX_F` instructions that provide alternative `EVEX` encoding to existing instructions, but not new `APX_F` only instructions. For example `jmpabs` instruction is a new `APX_F` instruction, thus the arch notation it uses is `x64`.
+
+Explanation: The database uses this "variable" field name to save space and to avoid defining the architecture elsewhere.
+
+### Instruction Signature
+
+Instruction signature is composed of the following components:
+
+```
+[<PREFIX>|<OPTIONS>] <INSTRUCTION_NAME>|<ALIASES> <OPERANDS>
+```
+
+ - `[<PREFIX>|<OPTIONS>]` (optional) - prefixes and other options:
+ - `[bnd]` - instruction supports `bnd` prefix (deprecated).
+ - `[lock]` - instruction supports `lock` prefix.
+ - `[xacquire]` - instruction supports `xacquire` prefix.
+ - `[xacqrel]` - instruction supports both `xacquire` and `xrelease` prefixes.
+ - `[xrelease]` - instruction supports `xrelease` prefix.
+ - `[rep]` - instruction supports `rep` prefix (or `repe`).
+ - `[repne]` - instruction supports `repne` prefix.
+ - `[repIgnore]` - instruction supports `rep` prefix, which is ignored during execution (to support for example `rep ret`).
+
+ - `<INSTRUCTION_NAME>|<ALIASES>` (required) - the name of the instruction possibly followed by aliases if the instruction has them
+ - if the instruction has aliases, they will be recognized in AsmJit API (the API will provide aliases), but will not have a separate instruction identifier
+ - for example `cmovz|cmove` is a `cmovz` instruction that has a `cmove` alias.
+
+ - `<OPERANDS>` (optional):
+ - When an instruction has multiple operands, they are separated by comma.
+ - Registers:
+ - `r8` - 8-bit general purpose register.
+ - `r16` - 16-bit general purpose register.
+ - `r32` - 32-bit general purpose register.
+ - `r64` - 64-bit general purpose register (x64 only).
+ - `mm` - 64-bit MM register.
+ - `xmm` - 128-bit XMM register (SSE).
+ - `ymm` - 256-bit YMM register (AVX)
+ - `zmm` - 512-bit ZMM register (AVX512/AVX10).
+ - `k` - 64-bit K register (AVX512/AVX10).
+ - `tmm` - TMM register (AMX).
+ - `creg` - Control register.
+ - `dreg` - Debug register.
+ - `st(x)` - FPU register.
+ - `rip` - Instruction pointer register (used during addressing).
+ - `bnd` - Bounds register (deprecated).
+ - Memory:
+ - `mem` - Memory operand without size specified.
+ - `m8-m512` - Memory operand of a specified size.
+ - Immediate values
+ - `imm4` - Signed or unsigned 4-bit immediate value (only used by instructions where the other 4 bits are used to encode additional register operand).
+ - `imm8` - Signed or unsigned 8-bit immediate value.
+ - `imm16` - Signed or unsigned 16-bit immediate value.
+ - `imm32` - Signed or unsigned 32-bit immediate value.
+ - `imm64` - Signed or unsigned 64-bit immediate value.
+ - `imms8` - Signed 8-bit immediate value (instructions that sign-extend the immediate value to 32 or 64 bits).
+ - `immu8` - Unsigned 8-bit immediate value (instructions that zero-extend the immediate value to 32 or 64 bits).
+ - `immu16` - Unsigned 16-bit immediate value (instructions that zero-extend the immediate value to 32 or 64 bits).
+ - `imms32` - Signed 32-bit immediate value (instructions that sign-extend the immediate value to 64 bits).
+ - `immu32` - Unsigned 32-bit immediate value (instructions that zero-extend the immediate value to 64 bits).
+ - Relative operands (addressing labels and relative locations in code):
+ - `rel8` - 8-bit signed relative displacement.
+ - `rel16` - 16-bit signed relative displacement.
+ - `rel32` - 32-bit signed relative displacement.
+ - Combining:
+ - Register and memory operands can be combined, for example `r8/m8` means either 8-bit register or 8-bit memory operand
+ - Read/Write access:
+ - The first operand must be decorated by access in a form `[r|w|x]: <OPERAND>`:
+ - `R:` - read access.
+ - `W:` - write access (overwrites the whole register).
+ - `w:` - write access (only overwrites an addressed part of the register - 8-bit and 16-bit GP registers use this access).
+ - `X:` - read/write access (the final write operation overwrites the whole register).
+ - `x:` - read/write access (the final write operation only overwrites the addressed part of the register - 16-bit GP access).
+ - The access of the second operand and following operands is implied to be read-only, when not specified explicitly.
+ - Grouping:
+ - If the encoding used for multiple register combinations is the same, multiple instructions can be grouped into a single record.
+ - `GP` Instructions:
+ - `ry` - either `r32` or `r64`.
+ - `my` - either `m32` or `m64`.
+ - `rv` - either `r16`, `r32`, or `r64`.
+ - `mv` - either `m16`, `m32`, or `m64`.
+ - `immv` - either `imm16`, `imm32`, or `simm32`.
+ - All registers must match, example: `add x:rv, rv/mv` - either all `r16/m16`, `r32/m32`, or `r64/m64`.
+ - When `rv/mv/immv` is used, the instruction must use `66h` prefix (or 66h part of `VEX/EVEX`) when a 16-bit `r16/m16` is used, and `REX.W` (or `W` part of `VEX/EVEX`) when a 64-bit `r64/m64` is used. The immediate expands to `imm16` for instructions working with 16-bit registers, to `imm32` for instructions working with 32-bit registers, and to `simm32` for instructions working with 64-bit registers (32-bit immediate sign extended to 64 bits).
+ - When `rv/mv` is used with `w` and `x` access option, it only applies to a 16-bit operation, wider operations would use `W` or `X` (this is an architectural constraint that the tool processing the database must be aware of)
+ - Why `y` and `v`? `ry/my` and `rv/mv` appeared in initial manuals describing `APX_F` extension, so this database is using exactly this notation to group multiple instructions into a single entry.
+ - `AVX` Instructions:
+ - `xy/mxy` - either `xmm/m128` or `ymm/m256` register operand.
+ - All registers must match, example: `vfmadd132pd X:xy, xy, xy/mxy` - either all `xmm/m128` or all `ymm/m256`.
+ - Why `xy/mxy`? This notation is not used by instruction manuals, but we have found it easy to use and understand.
+ - `AVX512` and `AVX10` Instructions:
+ - `xxx/mxxx` - either `xmm[31:0]/m32`, `xmm[63:0]/m64`, or `xmm/m128` register operand.
+ - `xxy/mxxy` - either `xmm[63:0]/m64`, `xmm/m128`, or `ymm/m256` register operand.
+ - `xyz/mxyz` - either `xmm/m128`, `ymm/m256`, or `zmm/m512` register operand.
+ - All registers must match, example: `vvfmadd132pd X:xyz {kz}, xyz, xyz/mxyz/b64 {er}` - either all `xmm/m128`, `ymm/m256`, or `zmm/m512`.
+ - Embedded rounding `{er}` and `{sae}` are grouped - in AVX512 case only 512-bit operations can use `{er}/{sae}`; in AVX10.2 case both 256-bit and 512-bit operations can use `{er}/{sae}`, but not 128-bit operations - the assembler or the tool processing this data must be aware of this architectural constraint.
+ - Why `xyz/mxyz`? This notation is not used by instruction manuals, but we have found it easy to use and understand.
+
+
diff --git a/3rdparty/asmjit/db/package.json b/3rdparty/asmjit/db/package.json
new file mode 100644
index 00000000000..8b4f5fc3c6f
--- /dev/null
+++ b/3rdparty/asmjit/db/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "asmdb",
+ "version": "0.1.0",
+ "license": "Zlib",
+ "engines": { "node": ">=8" },
+
+ "description": "Instructions database and utilities for X86/X64 and ARM (THUMB/A32/A64) architectures.",
+ "keywords": [
+ "asm", "assembler", "database", "instructions",
+ "arm", "thumb", "thumb2", "a32", "a64", "aarch32", "aarch64",
+ "x86", "x86_64", "x64", "amd64"
+ ],
+
+ "homepage": "https://github.com/asmjit/asmjit/db",
+ "bugs": {
+ "url": "https://github.com/asmjit/asmjit/issues"
+ },
+
+ "contributors": [
+ "Petr Kobalicek <kobalicek.petr@gmail.com> (kobalicek.com)"
+ ],
+
+ "main": "index.js",
+
+ "repository" : {
+ "type": "git",
+ "url": "https://github.com/asmjit/asmjit.git"
+ }
+}
diff --git a/3rdparty/asmjit/db/x86.js b/3rdparty/asmjit/db/x86.js
new file mode 100644
index 00000000000..1861b3c1c9b
--- /dev/null
+++ b/3rdparty/asmjit/db/x86.js
@@ -0,0 +1,1273 @@
+// This file is part of AsmJit project <https://asmjit.com>
+//
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
+// SPDX-License-Identifier: Zlib
+
+(function($scope, $as) {
+"use strict";
+
+// Import.
+const base = $scope.base ? $scope.base : require("./base.js");
+
+const dict = base.dict;
+const NONE = base.NONE;
+const Parsing = base.Parsing;
+const MapUtils = base.MapUtils;
+
+// Export.
+const x86 = $scope[$as] = {};
+
+function FAIL(msg) { throw new Error("[X86] " + msg); }
+
+// Database
+// ========
+
+x86.dbName = "isa_x86.json";
+
+// Metadata Tables
+// ===============
+
+const ArchGroupInfo = dict({
+ "ry": ["ANY", "X64"],
+ "rv": ["ANY", "ANY", "X64"]
+});
+
+// Groups are used by instruction tables to group multiple operand combinations into a single record. In general
+// X86 and X86_64 instructions can be divided into GP and SIMD groups, where GP groups use `ry/my` syntax to
+// specify operation for 16/32/64 bit registers and "xy/mxy"/"xyz/mxyz" groups to specify a SIMD instruction that
+// uses either XMM/YMM (AVX) or XMM/YMM/ZMM registers (AVX-512).
+const OperandGroupInfo = dict({
+ "ry" : { "group": "ry" , "subst": ["r32", "r64"] },
+ "my" : { "group": "ry" , "subst": ["m32", "m64"] },
+ "axy" : { "group": "ry" , "subst": ["eax", "rax"] },
+ "bxy" : { "group": "ry" , "subst": ["ebx", "rbx"] },
+ "cxy" : { "group": "ry" , "subst": ["ecx", "rcx"] },
+ "dxy" : { "group": "ry" , "subst": ["edx", "rdx"] },
+
+ "rv" : { "group": "rv" , "subst": ["r16", "r32", "r64"] },
+ "mv" : { "group": "rv" , "subst": ["m16", "m32", "m64"] },
+ "axv" : { "group": "rv" , "subst": ["ax", "eax", "rax"] },
+ "bxv" : { "group": "rv" , "subst": ["bx", "ebx", "rbx"] },
+ "cxv" : { "group": "rv" , "subst": ["cx", "ecx", "rcx"] },
+ "dxv" : { "group": "rv" , "subst": ["dx", "edx", "rdx"] },
+ "immv" : { "group": "rv" , "subst": ["imm16", "imm32", "imms32"] },
+
+ "xy" : { "group": "xy" , "subst": ["xmm", "ymm"] },
+ "mxy" : { "group": "xy" , "subst": ["m128", "m256"] },
+
+ "xxx" : { "group": "xyz", "subst": ["xmm[31:0]", "xmm[63:0]", "xmm"] },
+ "xxy" : { "group": "xyz", "subst": ["xmm[63:0]", "xmm", "ymm"] },
+ "xyz" : { "group": "xyz", "subst": ["xmm", "ymm", "zmm"] },
+ "mxxx" : { "group": "xyz", "subst": ["m32", "m64", "m128"] },
+ "mxxy" : { "group": "xyz", "subst": ["m64", "m128", "m256"] },
+ "mxyz" : { "group": "xyz", "subst": ["m128", "m256", "m512"] }
+});
+
+const OpcodeGroupInfo = dict({
+ "Wy" : { "group": "ry" , "subst": ["W0", "W1"] },
+ "iv" : { "group": "rv" , "subst": ["iw", "id", "id"] },
+ "Pv" : { "group": "rv" , "subst": ["66", "NP", "NP"] },
+ "Wv" : { "group": "rv" , "subst": ["W0", "W0", "W1"] }
+});
+
+// Instruction tables use various notations to specify L/LL field, which is used by VEX/EVEX/XOP encodings. This
+// field has 1 bit (VEX/XOP) and 2 bits (EVEX) and in general the notation used is 128/256/512, which determines
+// the size of SIMD operation, and this is also the notation we want to convert everything else into.
+const OpcodeLLMapping = dict({
+ "128": "128",
+ "256": "256",
+ "512": "512",
+ "LZ" : "128",
+ "LLZ": "128",
+ "L0" : "128",
+ "L1" : "256",
+ "LIG": "LIG",
+ "Lxy": "xy",
+ "xyz": "xyz"
+});
+
+const RegSize = Object.freeze({
+ "r8" : 8,
+ "r8hi": 8,
+ "r16" : 16,
+ "r32" : 32,
+ "r64" : 64,
+ "mm" : 64,
+ "xmm" : 128,
+ "ymm" : 256,
+ "zmm" : 512,
+ "tmm" : 512, // Maximum size (64 bytes).
+ "bnd" : 128,
+ "k" : 64,
+ "st" : 80
+});
+
+// CpuRegs
+// =======
+
+// Build an object containing CPU registers as keys mapping them to type, kind, and index.
+function buildCpuRegs(defs) {
+ const map = dict();
+
+ for (let type in defs) {
+ const def = defs[type];
+ const kind = def.kind;
+ const names = def.names;
+ const group = def.group;
+
+ if (def.any)
+ map[def.any] = { type: type, kind: kind, index: -1, group: group };
+
+ if (names) {
+ for (let i = 0; i < names.length; i++) {
+ let name = names[i];
+ let m = /^([A-Za-z\(\)]+)(\d+)-(\d+)([A-Za-z\(\)]*)$/.exec(name);
+
+ if (m) {
+ let a = parseInt(m[2], 10);
+ let b = parseInt(m[3], 10);
+
+ for (let n = a; n <= b; n++) {
+ const index = m[1] + n + m[4];
+ map[index] = { type: type, kind: kind, index: index };
+ }
+ }
+ else {
+ map[name] = { type: type, kind: kind, index: i };
+ }
+ }
+ }
+ }
+
+ // HACK: In instruction manuals `r8` denotes low 8-bit register, however,
+ // that collides with `r8`, which is a 64-bit register. Since the result
+ // of this function is only used internally we patch it to be compatible
+ // with what Intel specifies.
+ map.r8.type = "r8";
+
+ return map;
+}
+
+const CpuRegisters = buildCpuRegs({
+ "r8" : { "kind": "gp" , "any": "r8" , "names": ["al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8-15b"] },
+ "r8hi": { "kind": "gp" , "names": ["ah", "ch", "dh", "bh"] },
+ "r16" : { "kind": "gp" , "any": "r16" , "names": ["ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8-15w"] },
+ "r32" : { "kind": "gp" , "any": "r32" , "names": ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8-15d"] },
+ "r64" : { "kind": "gp" , "any": "r64" , "names": ["rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8-15"] },
+ "rxx" : { "kind": "gp" , "names": ["zax", "zcx", "zdx", "zbx", "zsp", "zbp", "zsi", "zdi"] },
+ "sreg": { "kind": "sreg", "any": "sreg" , "names": ["es", "cs", "ss", "ds", "fs", "gs" ] },
+ "creg": { "kind": "creg", "any": "creg" , "names": ["cr0-15"] },
+ "dreg": { "kind": "dreg", "any": "dreg" , "names": ["dr0-15"] },
+ "bnd" : { "kind": "bnd" , "any": "bnd" , "names": ["bnd0-3"] },
+ "st" : { "kind": "st" , "any": "st(i)", "names": ["st(0-7)"] },
+ "mm" : { "kind": "mm" , "any": "mm" , "names": ["mm0-7"] },
+ "k" : { "kind": "k" , "any": "k" , "names": ["k0-7"] },
+ "xmm" : { "kind": "vec" , "any": "xmm" , "names": ["xmm0-31"] },
+ "ymm" : { "kind": "vec" , "any": "ymm" , "names": ["ymm0-31"] },
+ "zmm" : { "kind": "vec" , "any": "zmm" , "names": ["zmm0-31"] },
+ "tmm" : { "kind": "tile", "any": "tmm" , "names": ["tmm0-7"] }
+});
+
+// asmdb.x86.Utils
+// ===============
+
+// X86/X64 utilities.
+class Utils {
+ static groupOf(op) {
+ return Object.hasOwn(OperandGroupInfo, op) ? OperandGroupInfo[op].group : null;
+ }
+
+ static splitInstructionSignature(s) {
+ let prefixes = [];
+ if (s.startsWith("[")) {
+ const prefixEnd = Parsing.matchClosingChar(s, 0);
+ prefixes = s.substring(1, prefixEnd).replace("xacqrel", "xacquire|xrelease").split("|");
+
+ s = s.substring(prefixEnd + 1).trim();
+ }
+
+ let nameEnd = s.indexOf(" ");
+ let names = s.substring(0, nameEnd === -1 ? s.length : nameEnd);
+ let operands = nameEnd === -1 ? "" : s.substring(nameEnd + 1).trim();
+
+ if (names.endsWith("{nf}")) {
+ names = names.substring(0, names.length - 4);
+ prefixes.nf = true;
+ }
+
+ return {
+ names: names.split("|"),
+ prefixes: prefixes,
+ operands: operands
+ }
+ }
+
+ // Split the operand(s) string into individual operands as defined by the
+ // instruction database.
+ //
+ // NOTE: X86/X64 doesn't require anything else than separating the commas,
+ // this function is here for compatibility with other instruction sets.
+ static splitOperands(s) {
+ const array = s.split(",");
+ for (let i = 0; i < array.length; i++)
+ array[i] = array[i].trim();
+ return array;
+ }
+
+ // Get whether the string `s` describes a register operand.
+ static isRegOp(s) { return s && Object.hasOwn(CpuRegisters, s); }
+ // Get whether the string `s` describes a memory operand.
+ static isMemOp(s) { return s && /^(?:mem|mib|tmem|moff||(?:m(?:off)?\d+(?:dec|bcd|fp|int)?)|(?:m16_\d+)|(?:vm\d+(?:x|y|z)))$/.test(s); }
+ // Get whether the string `s` describes an immediate operand.
+ static isImmOp(s) { return s && /^(?:1|imm4|imm8|imm16|imm32|imm64|imms8|imms32|immu16|immu32|immv|if|p16_16|p16_32|dfv)$/.test(s); }
+ // Get whether the string `s` describes a relative displacement (label).
+ static isRelOp(s) { return s && /^rel\d+$/.test(s); }
+
+ // Get a register type of a `s`, returns `null` if the register is unknown.
+ static regTypeOf(s) { return Object.hasOwn(CpuRegisters, s) ? CpuRegisters[s].type : null; }
+ // Get a register kind of a `s`, returns `null` if the register is unknown.
+ static regKindOf(s) { return Object.hasOwn(CpuRegisters, s) ? CpuRegisters[s].kind : null; }
+ // Get a register type of a `s`, returns `null` if the register is unknown and `-1`
+ // if the given string does only represent a register type, but not a specific reg.
+ static regIndexOf(s) { return Object.hasOwn(CpuRegisters, s) ? CpuRegisters[s].index : null; }
+
+ static regSize(s) {
+ if (s in RegSize)
+ return RegSize[s];
+
+ const reg = CpuRegisters[s];
+ if (reg && reg.type in RegSize)
+ return RegSize[reg.type];
+
+ return -1;
+ }
+
+ // Get size of an immediate `s` [in bits].
+ //
+ // Handles "ib", "iw", "id", "if", "iq", and also "/is4".
+ static immSize(s) {
+ switch (s) {
+ case "/is4" : return 4;
+ case "imm4" : return 4;
+ case "1" : return 8;
+ case "imm8" : return 8;
+ case "imm16" : return 16;
+ case "imm32" : return 32;
+ case "imm64" : return 64;
+ case "imms8" : return 8;
+ case "imms32": return 32;
+ case "immu16": return 16;
+ case "immu32": return 32;
+ case "ib" :
+ case "ub" : return 8;
+ case "iw" :
+ case "uw" : return 16;
+ case "id" :
+ case "ud" : return 32;
+ case "iq" :
+ case "uq" : return 64;
+ case "p16_16": return 32;
+ case "if" :
+ case "p16_32": return 48;
+
+ // Influences EVEX encoding, not an immediate byte.
+ case "dfv" : return 0;
+
+ // Invalid immediate.
+ default : FAIL(`Invalid immediate ${s}`);
+ }
+ }
+
+ // Get size of a relative displacement [in bits].
+ static relSize(s) {
+ switch (s) {
+ case "rel8" : return 8;
+ case "rel16" : return 16;
+ case "rel32" : return 32;
+ default : return -1;
+ }
+ }
+}
+x86.Utils = Utils;
+
+// asmdb.x86.Operand
+// =================
+
+// X86/X64 operand.
+class Operand extends base.Operand {
+ constructor() {
+ super();
+
+ this.groupPattern = ""; // Group pattern in case this operand was created from a group.
+ this.memSegment = ""; // Segment specified with register that is used to perform a memory IO.
+ this.memOff = false; // Memory operand is an absolute offset (only a specific version of MOV).
+ this.memFar = false; // Memory is a far pointer (includes segment in first two bytes).
+ this.vsibReg = ""; // AVX VSIB register type (xmm/ymm/zmm).
+ this.vsibSize = -1; // AVX VSIB register size (32/64).
+ this.bcstSize = -1; // AVX-512 broadcast size.
+ }
+
+ _substituteGroupOp(op, groupIndex) {
+ const opPart = op.match(/^([A-Za-z]+)/);
+ if (opPart) {
+ const groupPattern = Utils.groupOf(opPart[1]);
+ if (groupPattern) {
+ this.groupPattern = groupPattern;
+ return OperandGroupInfo[opPart[1]].subst[groupIndex] + op.substring(opPart[1].length);
+ }
+ }
+ return op;
+ }
+
+ assignData(data, defaultAccess, groupIndex) {
+ let s = data;
+ this.data = data;
+
+ const type = [];
+
+ // Handle RWX decorators prefix "[RWwXx]:".
+ let access = defaultAccess;
+ const access_match = /^(R|W|w|X|x)(\?)?\:/.exec(s);
+ if (access_match) {
+ // TODO: Conditional access is ignored at the moment.
+ access = access_match[1];
+ s = s.substring(access_match[0].length);
+ }
+
+ // Handle commutativity attribute.
+ if (Parsing.isCommutative(s)) {
+ this.commutative = true;
+ s = Parsing.clearCommutative(s);
+ }
+
+ // Handle AVX-512 broadcast possibility specified as "/bN" suffix.
+ const mBcst = /\/b(\d+)/.exec(s);
+ if (mBcst) {
+ this.bcstSize = parseInt(mBcst[1], 10);
+
+ // Remove the broadcast attribute from the definition; it's not needed anymore.
+ s = s.substring(0, mBcst.index) + s.substring(mBcst.index + mBcst[0].length);
+ }
+
+ // Handle <implicit> attribute.
+ if (Parsing.isImplicit(s)) {
+ this.implicit = true;
+ s = Parsing.clearImplicit(s);
+ }
+
+ // Support multiple operands separated by "/" (only used by r/m).
+ let ops = s.split("/");
+ let oArr = [];
+
+ for (let i = 0; i < ops.length; i++) {
+ let origOp = ops[i].trim();
+ let op = this._substituteGroupOp(origOp, groupIndex);
+
+ // Handle range suffix [A] or [A:B]:
+ const mRange = /\[(\d+)\s*(?:\:\s*(\d+)\s*)?\]$/.exec(op);
+ if (mRange) {
+ const a = parseInt(mRange[1], 10);
+ const b = parseInt(mRange[2] || String(a), 10);
+
+ if (a < b)
+ FAIL(`Operand '${origOp}' contains invalid range '[${a}:${b}]'`)
+
+ this.rwxIndex = b;
+ this.rwxWidth = a - b + 1;
+
+ op = op.substring(0, op.length - mRange[0].length);
+ }
+
+ // Handle a segment specification if this is an implicit register performing memory access.
+ const memSegRegM = op.match(/\((ds|es)\:\s*([\w]+)\)$/);
+ if (memSegRegM) {
+ this.memSegment = memSegRegM[1];
+ this.memRegOnly = memSegRegM[2];
+ op = op.substring(0, memSegRegM.index).trim();
+ }
+
+ oArr.push(op);
+
+ let regIndexRel = 0;
+ if (op.endsWith("+1") || op.endsWith("+2") || op.endsWith("+3")) {
+ regIndexRel = parseInt(op.substr(op.length - 1, 1));
+ op = op.substring(0, op.length - 2);
+ }
+
+ // Group substitution - when a rv/mv instruction uses 'w' or 'x' access it's only used by
+ // the 16-bit form, 32-bit and 64-bit always use 'W' and 'X' when used in a 'rv/mv' group.
+ if (this.groupPattern === "rv" && groupIndex > 0 && access !== "R") {
+ access = access.toUpperCase();
+ }
+
+ if (Utils.isRegOp(op)) {
+ this.reg = op;
+ this.regType = Utils.regTypeOf(op);
+ this.regIndexRel = regIndexRel;
+ this.setAccess(access);
+
+ type.push("reg");
+ continue;
+ }
+
+ if (Utils.isMemOp(op)) {
+ this.mem = op;
+ this.setAccess(access);
+
+ // Handle memory size.
+ const mOff = /^m(?:off)?(\d+)/.exec(op);
+ this.memSize = mOff ? parseInt(mOff[1], 10) : 0;
+ this.memOff = op.indexOf("moff") === 0;
+
+ const mSeg = /^m16_(\d+)/.exec(op);
+ if (mSeg) {
+ this.memFar = true;
+ this.memSize = parseInt(mSeg[1], 10) + 16;
+ }
+
+ // Handle vector addressing mode and size "vmXXr".
+ const mVM = /^vm(\d+)(x|y|z)$/.exec(op);
+ if (mVM) {
+ this.vsibReg = mVM[2] + "mm";
+ this.vsibSize = parseInt(mVM[1], 10);
+ }
+
+ type.push("mem");
+ continue;
+ }
+
+ if (Utils.isImmOp(op)) {
+ const size = Utils.immSize(op);
+ if (!this.imm)
+ this.imm = size;
+ else if (this.imm !== size)
+ FAIL(`Immediate size mismatch: ${this.imm} != ${size}`);
+
+ // Sign-extend / zero-extend.
+ const sign = op.startsWith("imms") ? "signed" :
+ op.startsWith("immu") ? "unsigned" : "any";
+ this.immSign = sign;
+
+ if (op === "1") {
+ this.immValue = 1;
+ this.implicit = true;
+ }
+
+ if (type.indexOf("imm") !== -1)
+ type.push("imm");
+ continue;
+ }
+
+ if (Utils.isRelOp(op)) {
+ this.rel = Utils.relSize(op);
+
+ type.push("rel");
+ continue;
+ }
+
+ FAIL(`Operand '${origOp}' unhandled`);
+ }
+
+ // In case the data has been modified it's always better to use the stripped off
+ // version as we have already processed and stored all the possible decorators.
+ this.data = oArr.join("/");
+ this.type = type.join("/");
+
+ if (this.rwxIndex === -1) {
+ const opSize = this.isReg() ? this.regSize :
+ this.isMem() ? this.memSize : -1;
+ if (opSize !== -1) {
+ this.rwxIndex = 0;
+ this.rwxWidth = opSize;
+ }
+ }
+ }
+
+ get regSize() {
+ return Utils.regSize(this.reg);
+ }
+
+ setAccess(x) {
+ const u = x.toUpperCase();
+ this.zext = x === "W" || x === "X";
+ this.read = u === "R" || u === "X";
+ this.write = u === "W" || u === "X";
+ return this;
+ }
+
+
+ isFixedReg() { return this.reg && this.reg !== this.regType && this.reg !== "st(i)"; }
+ isFixedMem() { return this.memSegment && this.isFixedReg(); }
+
+ isPartialOp() {
+ const maybePartial = this.regType === "r8" ||
+ this.regType === "r8hi" ||
+ this.regType === "r16" ||
+ this.regType === "xmm";
+ return maybePartial && !this.zext;
+ }
+
+ toRegMem() {
+ if (this.reg && this.mem)
+ return this.reg + "/m";
+ else if (this.mem && (this.vsibReg || /fp$|int$/.test(this.mem)))
+ return this.mem;
+ else if (this.mem)
+ return "m";
+ else
+ return this.toString();
+ }
+
+ toString() { return this.data; }
+}
+x86.Operand = Operand;
+
+// asmdb.x86.Instruction
+// =====================
+
+// X86/X64 instruction.
+class Instruction extends base.Instruction {
+ constructor(db) {
+ super(db);
+
+ this.opcode = dict({
+ byte : "", // Opcode byte (a single value specified as HEX string "00-FF").
+ ri : false, // Instruction opcode is combined with register, "XX+r" or "XX+i".
+ _67h : false, // Opcode 67h prefix use.
+ mm : "", // Opcode MM[MMM] part (map).
+ pp : "", // Opcode PP part.
+ w : "", // Opcode W field.
+ l : "", // EVEX.LL (nothing, 128, 256, 512, LIG).
+ nd : 0, // EVEX.ND (new dest) field (default is false, specified as ND=0 or ND=1).
+ nf : 0, // EVEX.NF (no flags) field (default is false, specified as NF=0 or NF=1).
+ scc : "", // EVEX.SCC field (4 bits - condition flags).
+ mod : "", // MODRM.MOD part (2 bits) - either "xx", "11" or "!(11)".
+ modr : "", // MODRM.R part (3 bits) - either "rrr"
+ modrm: "" // MODRM.R/M part - either "bbb"
+ });
+
+ this.prefix = ""; // Prefix - "", "3DNOW", "EVEX", "VEX", "XOP".
+ this.privilege = "L3"; // Privilege level required to execute the instruction.
+ this.groupPattern = ""; // Group pattern in case the instruction was created from a group such as "ry", "rv", "xy", "xyz".
+ this.groupIndex = -1; // Group index.
+
+ this.rel = 0; // Displacement ("cb", "cw", and "cd" parts).
+
+ this.fpuTop = 0; // FPU top index manipulation [-1, 0, 1, 2].
+ this.fpuStack = ""; // FPU stack manipulation
+
+ this.vsibReg = ""; // AVX VSIB register type (xmm/ymm/zmm).
+ this.vsibSize = -1; // AVX VSIB register size (32/64).
+
+ this.broadcast = false; // AVX-512 broadcast support.
+ this.bcstSize = -1; // AVX-512 broadcast size.
+
+ this.k = ""; // AVX-512 K function ("", "blend", "zeroing").
+ this.kmask = false; // AVX-512 merging {k}.
+ this.zmask = false; // AVX-512 zeroing {kz}, implies {k}.
+ this.er = false; // AVX-512 embedded rounding {er}, implies {sae}.
+ this.sae = false; // AVX-512 suppress all exceptions {sae} support.
+
+ this.tupleType = ""; // AVX-512 tuple-type.
+ this.elementSize = -1; // Instruction's element size.
+ this.encodingPreference = ""; // Encoding preference (either nothing or "EVEX").
+
+ this.consecutiveLead = 0; // Consecutive register leading N other registers.
+ this.prefixes = dict(); // Allowed prefixes.
+ }
+
+ _substituteOpcodePart(op, groupIndex) {
+ if (Object.hasOwn(OpcodeGroupInfo, op)) {
+ return OpcodeGroupInfo[op].subst[groupIndex];
+ }
+ else {
+ return op;
+ }
+ }
+
+ assignData(data, groupIndex) {
+ this.name = data.name;
+ this.groupIndex = groupIndex;
+
+ if (data.tt)
+ this.tupleType = data.tt;
+
+ const em = data.op.match(/^\[\s*(\w+)\s*\](.*)$/);
+ const encodingField = em ? em[1] : "NONE";
+ const opcodeField = em ? em[2] : data.op;
+
+ this._assignOperands(data.operands, groupIndex);
+ this._assignEncoding(encodingField);
+ this._assignOpcode(opcodeField.trim(), groupIndex);
+
+ for (let k in data) {
+ if (k === "name" || k === "op" || k === "operands")
+ continue;
+ this._assignAttribute(k, data[k]);
+ }
+
+ this._updateOperandsInfo();
+ this._postProcess();
+ }
+
+ _assignAttribute(key, value) {
+ switch (key) {
+ case "vl":
+ if (value) {
+ this.ext["AVX512_VL"] = true;
+ }
+ return;
+
+ case "prefixes":
+ this._combineAttribute("prefixes", value);
+ return;
+
+ case "fpuStack":
+ this.fpuStack = value;
+ switch (value) {
+ case "dec" : this.fpuTop = -1; break;
+ case "inc" : this.fpuTop = 1; break;
+ case "pop" : this.fpuTop = 1; break;
+ case "pop2x": this.fpuTop = 2; break;
+ case "push" : this.fpuTop = -1; break;
+ default:
+ FAIL(`Invalid fpuStack value '${value}'`);
+ }
+ return;
+
+ case "kz":
+ this.zmask = true;
+ this.kmask = true;
+ return;
+
+ case "k":
+ this.kmask = true;
+ if (typeof value === "string")
+ super._assignAttribute(key, value);
+ return;
+
+ case "er":
+ this.er = true;
+ this.sae = true; // {er} implies {sae}.
+ return;
+
+ case "sae":
+ this.sae = true;
+ return;
+
+ case "broadcast":
+ this.broadcast = true;
+ this.elementSize = value;
+ return;
+
+ default:
+ super._assignAttribute(key, value);
+ }
+ }
+
+ _assignOperands(s, groupIndex) {
+ if (!s) return;
+
+ // First remove all flags specified as {...}. We put them into `flags`
+ // map and mix with others. This seems to be the best we can do here.
+ for (;;) {
+ let a = s.indexOf("{");
+ let b = s.indexOf("}");
+
+ if (a === -1 || b === -1)
+ break;
+
+ // Get the `flag` and remove it from `s`.
+ this._assignAttribute(s.substring(a + 1, b), true);
+ s = s.substring(0, a) + s.substring(b + 1);
+ }
+
+ // Split into individual operands and push them to `operands`.
+ const arr = Utils.splitOperands(s);
+ for (let i = 0; i < arr.length; i++) {
+ const operand = new Operand();
+ operand.assignData(arr[i].trim(), i === 0 ? "X" : "R", groupIndex);
+
+ if (operand.mem == "tmem") {
+ this.tsib = true;
+ }
+
+ if (operand.groupPattern && this.groupPattern !== operand.groupPattern) {
+ if (this.groupPattern) {
+ FAIL(`Instruction ${this.name}: Operand's group pattern mismatch '${this.groupPattern}' != '${operand.groupPattern}'`);
+ }
+ this.groupPattern = operand.groupPattern;
+ }
+
+ this.operands.push(operand);
+ }
+ }
+
+ _assignEncoding(s) {
+ this.encoding = s;
+ }
+
+ _assignOpcode(s, groupIndex) {
+ this.opcodeString = s;
+
+ let parts = s.split(" ");
+
+ if (/^(VEX|EVEX|XOP)\./.test(s)) {
+ // Parse VEX/XOP and EVEX encoded instruction, which looks like "<PREFIX>.[APX-DATA].<LL>.<PP>.<MAP>.<W>"
+ let prefix = parts[0].split(".");
+ this.prefix = prefix[0];
+
+ for (let i = 1; i < prefix.length; i++) {
+ let comp = prefix[i];
+
+ if (/^(Pv|Wv|Wy)$/.test(comp)) {
+ comp = OpcodeGroupInfo[comp].subst[groupIndex];
+ }
+
+ // Process APX EVEX.ND field - ND=0 or ND=1.
+ if (/^ND=[01]$/.test(comp)) {
+ this.opcode.nd = comp === "ND=1";
+ continue;
+ }
+
+ // Process APX EVEX.NF field - NF=0 or NF=1.
+ if (/^NF=[01]$/.test(comp)) {
+ this.opcode.nf = comp === "NF=1";
+ continue;
+ }
+
+ // Process APX EVEX.SCC field - SCC=0-F
+ if (/^SCC=[0-9A-F]$/.test(comp)) {
+ this.opcode.scc = comp.charAt(5);
+ continue;
+ }
+
+ // Process `L/LL` field.
+ if (Object.hasOwn(OpcodeLLMapping, comp)) {
+ this.opcode.l = OpcodeLLMapping[comp];
+ continue;
+ }
+
+ // Process `PP` field - 66/F2/F3/NP (NP means no PP field used)
+ if (comp === "P0") { /* ignored, `P` is zero... */ continue; }
+ if (/^(?:66|F2|F3|NP)$/.test(comp)) { this.opcode.pp = comp; continue; }
+
+ // Process `MM` field - 0F/0F3A/0F38/MAP4/MAP5/MAP6/M8/M9.
+ if (/^(?:0F|0F3A|0F38|MAP[4-9A])$/.test(comp)) { this.opcode.mm = comp; continue; }
+
+ // Process `W` field.
+ if (/^(WIG|W0|W1|)$/.test(comp)) { this.opcode.w = comp; continue; }
+
+ // TODO: Some new APX instructions don't have W specified (ENQCMD/ENQCMDS).
+ if (comp === "W?") { this.opcode.w = "W0"; continue; }
+
+ // ERROR.
+ this.report(`'${this.opcodeString}' Unhandled component: ${comp}`);
+ }
+
+ for (let i = 1; i < parts.length; i++) {
+ let comp = parts[i];
+
+ // Parse opcode.
+ if (/^[0-9A-Fa-f]{2}$/.test(comp)) {
+ this.opcode.byte = comp.toUpperCase();
+ continue;
+ }
+
+ // Parse ModR/M field using "/r" or "/0-7" notation.
+ if (/^\/[r0-7]$/.test(comp)) {
+ this.opcode.mod = "xx";
+ this.opcode.modr = comp.charAt(1);
+ this.opcode.modm = "b";
+ continue;
+ }
+
+ // Parse ModR/M field using "11:xxx:xxx" and "!(11):xxx:xxx" notation.
+ const m = comp.match(/^(11|!\(11\)):(rrr|[01]{3}):(bbb|[01]{3})$/);
+ if (m) {
+ this.opcode.mod = m[1];
+ this.opcode.modr = m[2] === "rrr" ? "r" : String(parseInt(m[2], 2));
+ this.opcode.modrm = m[3] === "bbb" ? "b" : String(parseInt(m[3], 2));
+ continue;
+ }
+
+ // Parse immediate byte, word, dword, or qword.
+ comp = this._substituteOpcodePart(comp, groupIndex);
+ if (/^(?:ib|iw|id|iq|\/is4)$/.test(comp)) {
+ this.imm += Utils.immSize(comp);
+ continue;
+ }
+
+ this.report(`'${this.opcodeString}' Unhandled opcode component: ${comp}`);
+ }
+ }
+ else {
+ // Parse X86/X64 instruction (including legacy MMX/SSE/3DNOW instructions).
+ let rex_parsed = false;
+
+ for (let i = 0; i < parts.length; i++) {
+ let comp = parts[i];
+
+ if (comp === "NFx" || comp === "NOREP" || comp === "NO67") {
+ // Ignored for now.
+ continue;
+ }
+
+ // Parse REX or REX2 prefix.
+ if (comp.startsWith("REX2.") || comp === "REX.W") {
+ if (rex_parsed) {
+ FAIL(`'${this.opcodeString}' Multiple REX prefixes are invalid`);
+ }
+
+ rex_parsed = true;
+
+ // Instructions that force REX.W prefix or use REX2 prefix are always 64-bit instructions.
+ this.arch = "X64";
+
+ if (comp === "REX.W") {
+ this.opcode.w = "W1";
+ }
+ else {
+ this.prefix = "REX2";
+
+ // REX2 has always 3 components - "REX2.<MAP>.<W>".
+ const rex2 = comp.split(".");
+ if (rex2.length !== 3) {
+ FAIL(`'${this.opcodeString}' Invalid REX2 prefix - expected exactly 3 REX2 components`);
+ }
+
+ if (rex2[1] === "MAP0") {
+ // nothing.
+ }
+ else if (rex2[1] === "MAP1") {
+ this.opcode.mm = "0F";
+ }
+ else {
+ FAIL(`'${this.opcodeString}' Invalid REX2 prefix - REX2.MAP component could be either MAP0 or MAP1`);
+ }
+
+ this.opcode.w = rex2[2];
+ }
+
+ continue;
+ }
+
+ // Parse `PP` prefixes.
+ if (this.opcode.mm === "") {
+ if (this.opcode.pp === "" && /^(?:66|F2|F3|NP)$/.test(comp) ||
+ this.opcode.pp === "66" && /^(?:F2|F3)$/.test(comp)) {
+ this.opcode.pp += comp;
+ continue;
+ }
+ }
+
+ // Parse `MM` prefixes.
+ if ((this.opcode.mm === "" && comp === "0F") ||
+ (this.opcode.mm === "0F" && /^(?:01|3A|38)$/.test(comp))) {
+ this.opcode.mm += comp;
+ continue;
+ }
+
+ // Recognize "0F 0F /r XX" encoding.
+ if (this.opcode.mm === "0F" && comp === "0F") {
+ this.prefix = "3DNOW";
+ continue;
+ }
+
+ // Parse opcode byte.
+ if (/^[0-9A-F]{2}(?:\+[ri])?$/.test(comp)) {
+ // Parse "+r" or "+i" suffix.
+ if (comp.length > 2) {
+ this.opcode.ri = true;
+ comp = comp.substring(0, 2);
+ }
+
+ // FPU instructions are encoded as "PREFIX XX", where prefix is not the same
+ // as MM prefixes used everywhere else. AsmJit internally extends MM field in
+ // instruction tables to allow storing this prefix together with other "MM"
+ // prefixes, currently the unused indexes are used, but if X86 moves forward
+ // and starts using these we can simply use more bits in the opcode DWORD.
+ if (!this.opcode.pp && this.opcode.byte === "9B") {
+ this.opcode.pp = this.opcode.byte;
+ this.opcode.byte = comp;
+ continue;
+ }
+
+ if (!this.opcode.mm && (/^(?:D8|D9|DA|DB|DC|DD|DE|DF)$/.test(this.opcode.byte))) {
+ this.opcode.mm = this.opcode.byte;
+ this.opcode.byte = comp;
+ continue;
+ }
+
+ if (this.opcode.byte) {
+ if (this.opcode.byte === "67") {
+ this.opcode._67h = true;
+ }
+ else {
+ if (!this.opcode.modr && !this.opcode.modrm) {
+ const value = parseInt(comp, 16);
+ if ((value & 0xC0) == 0xC0) {
+ this.opcode.mod = "11";
+ this.opcode.modr = String((value >> 3) & 0x7);
+ this.opcode.modrm = String((value >> 0) & 0x7);
+ }
+ else {
+ this.report(`'${this.opcodeString}' Unsupported secondary opcode (MOD/RM) '${comp}' value`);
+ }
+ }
+ else {
+ this.report(`'${this.opcodeString}' Multiple opcodes, have ${this.opcode.byte}, found ${comp}`);
+ }
+ }
+ }
+
+ this.opcode.byte = comp;
+ continue;
+ }
+
+ // Parse ModR/M field using "/r" or "/0-7" notation.
+ if (/^\/[r0-7]$/.test(comp) && !this.opcode.modr) {
+ this.opcode.mod = "xx";
+ this.opcode.modr = comp.charAt(1);
+ this.opcode.modm = "b";
+ continue;
+ }
+
+ // Parse ModR/M field using "11:xxx:xxx" and "!(11):xxx:xxx" notation.
+ const m = comp.match(/^(11|!\(11\)):(rrr|[01]{3}):(bbb|[01]{3})$/);
+ if (m) {
+ this.opcode.mod = m[1];
+ this.opcode.modr = m[2] === "rrr" ? "r" : String(parseInt(m[2], 2));
+ this.opcode.modrm = m[3] === "bbb" ? "b" : String(parseInt(m[3], 2));
+ continue;
+ }
+
+ // Parse immediate byte, word, dword, fword, or qword.
+ if (/^(?:ib|iw|id|iq|iv|if)$/.test(comp)) {
+ if (comp === "iv")
+ comp = OpcodeGroupInfo[comp].subst[groupIndex];
+ this.imm += Utils.immSize(comp);
+ continue;
+ }
+
+ if (comp === "moff") {
+ this.moff = true;
+ continue;
+ }
+
+ // Parse displacement.
+ if (/^(?:cb|cw|cd)$/.test(comp) && !this.rel) {
+ this.rel = comp === "cb" ? 1 :
+ comp === "cw" ? 2 :
+ comp === "cd" ? 4 : -1;
+ continue;
+ }
+
+ // ERROR.
+ this.report(`'${this.opcodeString}' Unhandled opcode component: ${comp}`);
+ }
+ }
+
+ // HACK: Fix instructions having opcode "01".
+ if (this.opcode.byte === "" && this.opcode.mm.indexOf("0F01") === this.opcode.mm.length - 4) {
+ this.opcode.byte = "01";
+ this.opcode.mm = this.opcode.mm.substring(0, this.opcode.mm.length - 2);
+ }
+
+ if (this.opcode.byte)
+ this.opcodeValue = parseInt(this.opcode.byte, 16);
+
+ if (!this.opcode.byte)
+ this.report(`Couldn't parse instruction's opcode '${this.opcodeString}'`);
+ }
+
+ _updateOperandsInfo() {
+ super._updateOperandsInfo();
+
+ let consecutiveLead = null;
+ let consecutiveLastIndex = 0;
+
+ for (let i = 0; i < this.operands.length; i++) {
+ const op = this.operands[i];
+
+ // Instructions that use 64-bit GP registers are always 64-bit instructions.
+ if (op.reg === "r64" || op.reg === "rax" || op.reg === "rbx" || op.reg === "rcx" || op.reg === "rdx" || op.reg === "rsi" || op.reg === "rdi")
+ this.arch = "X64";
+
+ // Propagate broadcast.
+ if (op.bcstSize > 0)
+ this._assignAttribute("broadcast", op.bcstSize);
+
+ // Propagate VSIB.
+ if (op.vsibReg) {
+ if (this.vsibReg) {
+ this.report("Only one operand can be a vector memory address (vmNNx)");
+ }
+
+ this.vsibReg = op.vsibReg;
+ this.vsibSize = op.vsibSize;
+ }
+
+ if (op.regIndexRel) {
+ if (i - op.regIndexRel < 0) {
+ this.report(`The consecutive register information is invalid, index of the lead (${i - op.regIndexRel}) is out of range`);
+ }
+ else {
+ const lead = this.operands[i - op.regIndexRel];
+ if (consecutiveLead && consecutiveLead != lead) {
+ this.report(`The consecutive register chain is invalid`);
+ }
+ else {
+ consecutiveLead = lead;
+ consecutiveLastIndex = Math.max(consecutiveLastIndex, op.regIndexRel);
+ }
+ }
+ }
+ }
+
+ if (consecutiveLead) {
+ consecutiveLead.consecutive_lead_count = consecutiveLastIndex + 1;
+ }
+ }
+
+ // Validate the instruction's definition. Common mistakes can be checked and
+ // reported easily, however, if the mistake is just an invalid opcode or
+ // something else it's impossible to detect.
+ _postProcess() {
+ if (this.groupPattern) {
+ const archInfo = ArchGroupInfo[this.groupPattern];
+ if (this.arch === "ANY" && archInfo && this.arch !== archInfo[this.groupIndex]) {
+ // TODO: Never triggered, which means it should be removed.
+ this.arch = archInfo[this.groupIndex];
+ }
+ }
+ else {
+ this.groupIndex = -1;
+ }
+
+ if (this.privilege === "L0")
+ this.category.SYSTEM = true;
+
+ let immCount = this.immCount;
+
+ // Verify that the immediate operand/operands are specified in instruction
+ // encoding and opcode field. Basically if there is an "ix" in operands,
+ // the encoding should contain "I".
+ if (immCount > 0) {
+ if (immCount === 1 && this.operands[this.operands.length - 1].data === "1") {
+ // This must be one of rcl|rcr|rol|ror|sar|sal|shr. We won't validate
+ // these as these have "1" as implicit (encoded within opcode, not after).
+ }
+ else {
+ // Every immediate should have its imm byte ("ib", "iw", "id", or "iq") in the opcode data.
+ let m = this.opcodeString.match(/(?:^|\s+)(ib|iw|id|iq|iv|if|\/is4)/g);
+ if (!m || m.length !== immCount) {
+ this.report(`Immediate(s) [${immCount}] not found in opcode: ${this.opcodeString}`);
+ }
+ }
+ }
+ }
+
+ isAVX() { return this.isVEX() || this.isEVEX(); }
+ isVEX() { return this.prefix === "VEX" || this.prefix === "XOP"; }
+ isEVEX() { return this.prefix === "EVEX" }
+
+ getWValue() {
+ switch (this.opcode.w) {
+ case "W0": return 0;
+ case "W1": return 1;
+ }
+ return -1;
+ }
+
+ // Get signature of the instruction as "ARCH PREFIX ENCODING[:operands]" form.
+ get signature() {
+ let operands = this.operands;
+ let sign = this.arch;
+
+ if (this.prefix) {
+ sign += " " + this.prefix;
+ if (this.prefix !== "3DNOW") {
+ if (this.opcode.l === "L1")
+ sign += ".256";
+ else if (this.opcode.l === "256" || this.opcode.l === "512")
+ sign += `.${this.opcode.l}`;
+ else
+ sign += ".128";
+
+ if (this.opcode.w === "W1")
+ sign += ".W";
+ }
+ }
+ else if (this.opcode.w === "W1") {
+ sign += " REX.W";
+ }
+
+ sign += " " + this.encoding;
+
+ for (let i = 0; i < operands.length; i++) {
+ sign += (i === 0) ? ":" : ",";
+
+ let operand = operands[i];
+ if (operand.implicit)
+ sign += `[${operand.reg}]`;
+ else
+ sign += operand.toRegMem();
+ }
+
+ return sign;
+ }
+
+ get immCount() {
+ let ops = this.operands;
+ let n = 0;
+ for (let i = 0; i < ops.length; i++)
+ if (ops[i].isImm())
+ n++;
+ return n;
+ }
+
+ get modRValue() {
+ if (/^[0-7]$/.test(this.opcode.modr))
+ return parseInt(this.opcode.modr, 10);
+ else
+ return 0;
+ }
+
+ get modRMValue() {
+ if (/^[0-7]$/.test(this.opcode.modrm))
+ return parseInt(this.opcode.modrm, 10);
+ else
+ return 0;
+ }
+}
+x86.Instruction = Instruction;
+
+// asmdb.x86.ISA
+// =============
+
+const ArchKeys = MapUtils.mapFromArray(["any", "x86", "x64", "apx", "___"]);
+
+function findArch(inst) {
+ for (let a in ArchKeys) {
+ if (typeof inst[a] === "string") {
+ return a;
+ }
+ }
+
+ FAIL(`Instruction signature not found in record: ${JSON.stringify(inst)}`);
+}
+
+function mergeGroupData(data, group) {
+ for (let k in group) {
+ switch (k) {
+ case "group":
+ case "instructions":
+ break;
+
+ case "ext":
+ data[k] = (data[k] ? data[k] + " " : "") + group[k];
+ break;
+
+ default:
+ if (data[k] === undefined)
+ data[k] = group[k]
+ break;
+ }
+ }
+}
+
+// X86/X64 instruction database - stores Instruction instances in a map and
+// aggregates all instructions with the same name.
+class ISA extends base.ISA {
+ constructor(data) {
+ super(data);
+ this.addData(data || NONE);
+ }
+
+ _addInstructions(groups) {
+ for (let group of groups) {
+ for (let record of group.instructions) {
+ let arch = findArch(record);
+
+ // TODO: Ignore records having this (only used for testing purposes).
+ if (arch === "___")
+ continue;
+
+ const apx = arch === "apx";
+
+ const sgn = Utils.splitInstructionSignature(record[arch]);
+ const data = MapUtils.cloneExcept(record, arch);
+
+ mergeGroupData(data, group)
+
+ for (let j = 0; j < sgn.names.length; j++) {
+ data.name = sgn.names[j];
+ data.prefixes = sgn.prefixes;
+ data.operands = sgn.operands;
+
+ if (j > 0) {
+ data.aliasOf = sgn.names[0];
+ }
+
+ let groupIndex = 0;
+ let instruction = null;
+ do {
+ instruction = new Instruction(this);
+ instruction.arch = apx ? "X64" : arch.toUpperCase();
+ instruction.assignData(data, groupIndex);
+
+ if (apx) {
+ instruction.ext["APX_F"] = true;
+ if (instruction.category.GP) {
+ instruction.category.GP_EXT = true
+ }
+ }
+
+ this._addInstruction(instruction);
+ } while (instruction.groupPattern && ++groupIndex < OperandGroupInfo[instruction.groupPattern].subst.length);
+ }
+ }
+ }
+
+ return this;
+ }
+}
+x86.ISA = ISA;
+
+// asmdb.x86.X86DataCheck
+// ======================
+
+class X86DataCheck {
+ static checkVexEvex(db) {
+ const map = db.instructionMap;
+ for (let name in map) {
+ const instructions = map[name];
+ for (let i = 0; i < instructions.length; i++) {
+ const instA = instructions[i];
+ for (let j = i + 1; j < instructions.length; j++) {
+ const instB = instructions[j];
+ if (instA.operands.join("_") === instB.operands.join("_")) {
+ const vex = instA.prefix === "VEX" ? instA : instB.prefix === "VEX" ? instB : null;
+ const evex = instA.prefix === "EVEX" ? instA : instB.prefix === "EVEX" ? instB : null;
+
+ if (vex && evex && vex.opcode.byte === evex.opcode.byte) {
+ // NOTE: There are some false positives, they will be printed as well.
+ let ok = vex.opcode.w === evex.opcode.w && vex.opcode.l === evex.opcode.l;
+
+ if (!ok) {
+ console.log(`Instruction ${name} differs:`);
+ console.log(` ${vex.operands.join(" ")}: ${vex.opcodeString}`);
+ console.log(` ${evex.operands.join(" ")}: ${evex.opcodeString}`);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+x86.X86DataCheck = X86DataCheck;
+
+}).apply(this, typeof module === "object" && module && module.exports
+ ? [module, "exports"] : [this.asmdb || (this.asmdb = {}), "x86"]);
diff --git a/3rdparty/asmjit/src/asmjit.natvis b/3rdparty/asmjit/src/asmjit.natvis
deleted file mode 100644
index 68012e0d15a..00000000000
--- a/3rdparty/asmjit/src/asmjit.natvis
+++ /dev/null
@@ -1,245 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- asmjit visualizer for Visual Studio (natvis) -->
-
-<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
- <Type Name="asmjit::String">
- <Intrinsic Name="isSmall" Expression="(_type &lt; 0x1F)"/>
- <DisplayString Condition="isSmall()">{_small.data, s8}</DisplayString>
- <DisplayString Condition="!isSmall()">{_large.data, s8}</DisplayString>
- <Expand HideRawView="true">
- <Synthetic Name="_type">
- <DisplayString Condition="(_type &lt; 0x1F)">Small</DisplayString>
- <DisplayString Condition="(_type == 0x1F)">Large</DisplayString>
- <DisplayString Condition="(_type &gt; 0x1F)">External</DisplayString>
- </Synthetic>
- <Item Name="_size" Condition="isSmall()" ExcludeView="simple">(int)_small.type, d</Item>
- <Item Name="_size" Condition="!isSmall()" ExcludeView="simple">_large.size, d</Item>
- <Item Name="_capacity" Condition="isSmall()" ExcludeView="simple">asmjit::String::kSSOCapacity, d</Item>
- <Item Name="_capacity" Condition="!isSmall()" ExcludeView="simple">_large.capacity, d</Item>
- <Item Name="_data" Condition="isSmall()" ExcludeView="simple">_small.data, s8</Item>
- <Item Name="_data" Condition="!isSmall()" ExcludeView="simple">_large.data, s8</Item>
- </Expand>
- </Type>
-
- <Type Name="asmjit::ZoneVector&lt;*&gt;">
- <DisplayString>{{ [size={_size, d} capacity={_capacity, d}] }}</DisplayString>
- <Expand>
- <Item Name="_size" ExcludeView="simple">_size, d</Item>
- <Item Name="_capacity" ExcludeView="simple">_capacity, d</Item>
- <ArrayItems>
- <Size>_size</Size>
- <ValuePointer>(($T1*)_data)</ValuePointer>
- </ArrayItems>
- </Expand>
- </Type>
-
- <Type Name="asmjit::OperandSignature">
- <Intrinsic Name="opType" Expression="(asmjit::OperandType)(_bits &amp; 0x7)" />
- <Intrinsic Name="opSize" Expression="(_bits &gt;&gt; 24) &amp; 0xFF" />
- <Intrinsic Name="regType" Expression="(asmjit::RegType)((_bits &gt;&gt; 3) &amp; 0x1F)" />
- <Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_bits &gt;&gt; 8) &amp; 0xF)" />
- <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_bits &gt;&gt; 3) &amp; 0x1F)" />
- <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_bits &gt;&gt; 8) &amp; 0x1F)" />
- <Intrinsic Name="memRegHome" Expression="(bool)((_bits &gt;&gt; 13) &amp; 0x1)" />
- <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_bits &gt;&gt; 18) &amp; 0x7)" />
- <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_bits &gt;&gt; 14) &amp; 0x3)" />
- <Intrinsic Name="memX86ShiftValue" Expression="((_bits &gt;&gt; 16) &amp; 0x3)" />
- <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_bits &gt;&gt; 21) &amp; 0x7)" />
- <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_bits &gt;&gt; 3) &amp; 0x1)" />
-
- <DisplayString Condition="opType() == asmjit::OperandType::kNone">[None]</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kReg">[Reg] {{ type={regType()} group={regGroup()} size={opSize(), d} }}</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kMem">[Mem] {{ base={memBaseType()} index={memIndexType()} }}</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kImm">[Imm] {{ type={immType()} }}</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kLabel">[Label]</DisplayString>
- <DisplayString Condition="opType() &gt; asmjit::OperandType::kMaxValue">[Unknown]</DisplayString>
-
- <Expand HideRawView="true">
- <Item Name="bits">_bits, X</Item>
- <Item Name="op.type">opType()</Item>
- <Item Name="reg.type" Condition="opType() == asmjit::OperandType::kReg">regType()</Item>
- <Item Name="reg.group" Condition="opType() == asmjit::OperandType::kReg">regGroup()</Item>
- <Item Name="reg.size" Condition="opType() == asmjit::OperandType::kReg">opSize(), d</Item>
- <Item Name="mem.baseType" Condition="opType() == asmjit::OperandType::kMem">memBaseType()</Item>
- <Item Name="mem.indexType" Condition="opType() == asmjit::OperandType::kMem">memIndexType()</Item>
- <Item Name="mem.regHome" Condition="opType() == asmjit::OperandType::kMem">memRegHome()</Item>
- <Item Name="mem.size" Condition="opType() == asmjit::OperandType::kMem">opSize(), d</Item>
- <Item Name="mem.x86.segment" Condition="opType() == asmjit::OperandType::kMem">memX86Segment()</Item>
- <Item Name="mem.x86.addrType" Condition="opType() == asmjit::OperandType::kMem">memX86AddrType()</Item>
- <Item Name="mem.x86.shift" Condition="opType() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
- <Item Name="mem.x86.broadcast" Condition="opType() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
- <Item Name="imm.type" Condition="opType() == asmjit::OperandType::kImm">immType()</Item>
- </Expand>
- </Type>
-
- <Type Name="asmjit::Operand_">
- <Intrinsic Name="opType" Expression="(asmjit::OperandType)(_signature._bits &amp; 0x7)" />
- <Intrinsic Name="opSize" Expression="(_signature._bits &gt;&gt; 24) &amp; 0xFF" />
- <Intrinsic Name="regType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 3) &amp; 0x1F)" />
- <Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_signature._bits &gt;&gt; 8) &amp; 0xF)" />
- <Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 3) &amp; 0x1F)" />
- <Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_signature._bits &gt;&gt; 8) &amp; 0x1F)" />
- <Intrinsic Name="memRegHome" Expression="(bool)((_signature._bits &gt;&gt; 13) &amp; 0x1)" />
- <Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_signature._bits &gt;&gt; 18) &amp; 0x7)" />
- <Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_signature._bits &gt;&gt; 14) &amp; 0x3)" />
- <Intrinsic Name="memX86ShiftValue" Expression="((_signature._bits &gt;&gt; 16) &amp; 0x3)" />
- <Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_signature._bits &gt;&gt; 21) &amp; 0x7)" />
- <Intrinsic Name="memBaseId" Expression="_baseId" />
- <Intrinsic Name="memIndexId" Expression="_data[0]" />
- <Intrinsic Name="memOffset32b" Expression="(__int64)int(_data[1])" />
- <Intrinsic Name="memOffset64b" Expression="(__int64) ((unsigned __int64)_baseId &lt;&lt; 32) | ((unsigned __int64)_data[1])" />
- <Intrinsic Name="memOffset" Expression="memBaseType() != asmjit::RegType::kNone ? memOffset32b() : memOffset64b()" />
- <Intrinsic Name="immType" Expression="(asmjit::ImmType)((_signature._bits &gt;&gt; 3) &amp; 0x1)" />
- <Intrinsic Name="immValue" Expression="((__int64)_data[1] &lt;&lt; 32) | (__int64)_data[0]" />
-
- <DisplayString Condition="opType() == asmjit::OperandType::kNone">[None]</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kReg">[Reg] {{ id={_baseId, d} group={regGroup(), d} type={regType(), d} size={opSize(), d} }}</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kMem">[Mem] {{ baseId={memBaseId(), d} indexId={memIndexId(), d} offset={(__int64)memOffset(), d} }}</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kImm">[Imm] {{ val={immValue(), d} hex={immValue(), X} }}</DisplayString>
- <DisplayString Condition="opType() == asmjit::OperandType::kLabel">[Label] {{ id={_baseId} }}</DisplayString>
- <DisplayString Condition="opType() &gt; 4">[Unknown]</DisplayString>
- <Expand HideRawView="true">
- <Item Name="_signature">_signature._bits, X</Item>
- <Item Name="op.type">opType()</Item>
- <Item Name="op.size">opSize(), d</Item>
- <Item Name="reg.type" Condition="opType() == asmjit::OperandType::kReg">regType()</Item>
- <Item Name="reg.group" Condition="opType() == asmjit::OperandType::kReg">regGroup()</Item>
- <Item Name="reg.id" Condition="opType() == asmjit::OperandType::kReg">_baseId, d</Item>
- <Item Name="mem.baseType" Condition="opType() == asmjit::OperandType::kMem">memBaseType()</Item>
- <Item Name="mem.baseId" Condition="opType() == asmjit::OperandType::kMem &amp;&amp; memBaseType() != asmjit::RegType::kNone">memBaseId()</Item>
- <Item Name="mem.indexType" Condition="opType() == asmjit::OperandType::kMem">memIndexType()</Item>
- <Item Name="mem.indexId" Condition="opType() == asmjit::OperandType::kMem &amp;&amp; memIndexType() != asmjit::RegType::kNone">memIndexId()</Item>
- <Item Name="mem.regHome" Condition="opType() == asmjit::OperandType::kMem">memRegHome()</Item>
- <Item Name="mem.offset" Condition="opType() == asmjit::OperandType::kMem">memOffset(), d</Item>
- <Item Name="mem.x86.segment" Condition="opType() == asmjit::OperandType::kMem">memX86Segment()</Item>
- <Item Name="mem.x86.addrType" Condition="opType() == asmjit::OperandType::kMem">memX86AddrType()</Item>
- <Item Name="mem.x86.shift" Condition="opType() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
- <Item Name="mem.x86.broadcast" Condition="opType() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
- <Item Name="imm.type" Condition="opType() == asmjit::OperandType::kImm">immType()</Item>
- <Item Name="imm.value" Condition="opType() == asmjit::OperandType::kImm">immValue(), X</Item>
- <Item Name="label.id" Condition="opType() == asmjit::OperandType::kLabel">_baseId, d</Item>
- <Item Name="raw.baseId">_baseId</Item>
- <Item Name="raw.data[0]">_data[0]</Item>
- <Item Name="raw.data[1]">_data[1]</Item>
- </Expand>
- </Type>
-
- <Type Name="asmjit::FuncValue">
- <Intrinsic Name="isReg" Expression="(_data &amp; asmjit::FuncValue::kFlagIsReg) != 0" />
- <Intrinsic Name="isStack" Expression="(_data &amp; asmjit::FuncValue::kFlagIsStack) != 0" />
- <Intrinsic Name="isIndirect" Expression="(_data &amp; asmjit::FuncValue::kFlagIsIndirect) != 0" />
- <Intrinsic Name="isDone" Expression="(_data &amp; asmjit::FuncValue::kFlagIsDone) != 0" />
-
- <Intrinsic Name="typeId" Expression="((_data &amp; asmjit::FuncValue::kTypeIdMask) &gt;&gt; asmjit::FuncValue::kTypeIdShift)" />
- <Intrinsic Name="regId" Expression="((_data &amp; asmjit::FuncValue::kRegIdMask) &gt;&gt; asmjit::FuncValue::kRegIdShift)" />
- <Intrinsic Name="regType" Expression="((_data &amp; asmjit::FuncValue::kRegTypeMask) &gt;&gt; asmjit::FuncValue::kRegTypeShift)" />
- <Intrinsic Name="stackOffset" Expression="((_data &amp; asmjit::FuncValue::kStackOffsetMask) &gt;&gt; asmjit::FuncValue::kStackOffsetShift)" />
-
- <DisplayString Condition="isReg()">[RegValue {{ regType={regType()} indirect={isIndirect()} done={isDone()} }}]</DisplayString>
- <DisplayString Condition="isStack()">[StackValue {{ indirect={isIndirect()} done={isDone()} }}]</DisplayString>
- <DisplayString Condition="!isReg() &amp;&amp; !isStack()">[Unknown]</DisplayString>
-
- <Expand HideRawView="true">
- <Item Name="data">_data</Item>
- <Item Name="typeId">(asmjit::TypeId)(typeId())</Item>
- <Item Name="regType" Condition="isReg()">(asmjit::BaseReg::RegType)regType()</Item>
- <Item Name="regId" Condition="isReg()">regId()</Item>
- <Item Name="stackOffset" Condition="isStack()">stackOffset()</Item>
- </Expand>
- </Type>
-
- <Type Name="asmjit::BaseNode">
- <Intrinsic Name="nodeType" Expression="_any._nodeType" />
-
- <Intrinsic Name="isInst" Expression="nodeType() == asmjit::NodeType::kInst"></Intrinsic>
- <Intrinsic Name="isSection" Expression="nodeType() == asmjit::NodeType::kSection"></Intrinsic>
- <Intrinsic Name="isLabel" Expression="nodeType() == asmjit::NodeType::kLabel"></Intrinsic>
- <Intrinsic Name="isAlign" Expression="nodeType() == asmjit::NodeType::kAlign"></Intrinsic>
- <Intrinsic Name="isEmbedData" Expression="nodeType() == asmjit::NodeType::kEmbedData"></Intrinsic>
- <Intrinsic Name="isEmbedLabel" Expression="nodeType() == asmjit::NodeType::kEmbedLabel"></Intrinsic>
- <Intrinsic Name="isEmbedLabelDelta" Expression="nodeType() == asmjit::NodeType::kEmbedLabelDelta"></Intrinsic>
- <Intrinsic Name="isConstPool" Expression="nodeType() == asmjit::NodeType::kConstPool"></Intrinsic>
- <Intrinsic Name="isComment" Expression="nodeType() == asmjit::NodeType::kComment"></Intrinsic>
- <Intrinsic Name="isSentinel" Expression="nodeType() == asmjit::NodeType::kSentinel"></Intrinsic>
- <Intrinsic Name="isJump" Expression="nodeType() == asmjit::NodeType::kJump"></Intrinsic>
- <Intrinsic Name="isFunc" Expression="nodeType() == asmjit::NodeType::kFunc"></Intrinsic>
- <Intrinsic Name="isFuncRet" Expression="nodeType() == asmjit::NodeType::kFuncRet"></Intrinsic>
- <Intrinsic Name="isInvoke" Expression="nodeType() == asmjit::NodeType::kInvoke"></Intrinsic>
-
- <Intrinsic Name="actsAsInst" Expression="isInst() || isJump() || isFunc() || isFuncRet() || isInvoke()" />
- <Intrinsic Name="actsAsLabel" Expression="isLabel() || isFunc()" />
-
- <DisplayString Condition="isInst()">[InstNode]</DisplayString>
- <DisplayString Condition="isSection()">[SectionNode]</DisplayString>
- <DisplayString Condition="isLabel()">[LabelNode]</DisplayString>
- <DisplayString Condition="isAlign()">[AlignNode]</DisplayString>
- <DisplayString Condition="isEmbedData()">[EmbedDataNode]</DisplayString>
- <DisplayString Condition="isEmbedLabel()">[EmbedLabelNode]</DisplayString>
- <DisplayString Condition="isEmbedLabelDelta()">[EmbedLabelDeltaNode]</DisplayString>
- <DisplayString Condition="isConstPool()">[ConstPoolNode]</DisplayString>
- <DisplayString Condition="isComment()">[CommentNode]</DisplayString>
- <DisplayString Condition="isSentinel()">[SentinelNode]</DisplayString>
- <DisplayString Condition="isJump()">[JumpNode]</DisplayString>
- <DisplayString Condition="isFunc()">[FuncNode]</DisplayString>
- <DisplayString Condition="isFuncRet()">[FuncRetNode]</DisplayString>
- <DisplayString Condition="isInvoke()">[InvokeNode]</DisplayString>
- <DisplayString Condition="nodeType() == asmjit::NodeType::kNone || nodeType() &gt; 18">[UnknownNode {nodeType(), d}]</DisplayString>
-
- <Expand HideRawView="true">
- <Item Name="prev">_prev</Item>
- <Item Name="next">_next</Item>
-
- <Item Name="nodeType">_any._nodeType</Item>
- <Item Name="nodeFlags">_any._nodeFlags</Item>
-
- <Item Name="position">_position</Item>
- <Item Name="userData.u64">_userDataU64</Item>
- <Item Name="userData.ptr">_userDataPtr</Item>
- <Item Name="passData">_passData</Item>
- <Item Name="inlineComment">_inlineComment, s8</Item>
-
- <Item Name="baseInst" Condition="actsAsInst()">((asmjit::InstNode*)this)-&gt;_baseInst</Item>
- <Item Name="opCount" Condition="actsAsInst()">_inst._opCount</Item>
- <Item Name="opCapacity" Condition="actsAsInst()">_inst._opCapacity</Item>
- <Item Name="opArray" Condition="actsAsInst()">((asmjit::InstNode*)this)-&gt;_opArray, [_inst._opCount]</Item>
-
- <Item Name="sectionId" Condition="isSection()">((asmjit::SectionNode*)this)-&gt;_id</Item>
- <Item Name="nextSection" Condition="isSection()">((asmjit::SectionNode*)this)-&gt;_nextSection</Item>
-
- <Item Name="labelId" Condition="isLabel()">((asmjit::LabelNode*)this)-&gt;_labelId</Item>
-
- <Item Name="alignMode" Condition="isAlign()">((asmjit::AlignNode*)this)-&gt;_alignData._alignMode</Item>
- <Item Name="alignment" Condition="isAlign()">((asmjit::AlignNode*)this)-&gt;_alignment</Item>
-
- <Item Name="typeId" Condition="isEmbedData()">_embed._typeId, d</Item>
- <Item Name="typeSize" Condition="isEmbedData()">_embed._typeSize, d</Item>
- <Item Name="itemCount" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)-&gt;_itemCount</Item>
- <Item Name="repeatCount" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)-&gt;_repeatCount</Item>
- <Item Name="inlineData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)-&gt;_inlineData</Item>
- <Item Name="externalData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)-&gt;_externalData</Item>
-
- <Item Name="labelId" Condition="isEmbedLabel()">((asmjit::EmbedLabelNode*)this)-&gt;_labelId</Item>
-
- <Item Name="labelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_labelId</Item>
- <Item Name="baseLabelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_baseLabelId</Item>
- <Item Name="dataSize" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)-&gt;_dataSize</Item>
-
- <Item Name="constPool" Condition="isConstPool()">((asmjit::ConstPoolNode*)this)-&gt;_constPool</Item>
-
- <Item Name="sentinel.sentinelType" Condition="isSentinel()">_sentinel._sentinelType</Item>
-
- <Item Name="annotation" Condition="isJump()">((asmjit::JumpNode*)this)-&gt;_annotation</Item>
-
- <Item Name="funcDetail" Condition="isFunc()">((asmjit::FuncNode*)this)-&gt;_funcDetail</Item>
- <Item Name="frame" Condition="isFunc()">((asmjit::FuncNode*)this)-&gt;_frame</Item>
- <Item Name="exitNode" Condition="isFunc()">((asmjit::FuncNode*)this)-&gt;_exitNode</Item>
- <Item Name="end" Condition="isFunc()">((asmjit::FuncNode*)this)-&gt;_end</Item>
- <Item Name="args" Condition="isFunc()">((asmjit::FuncNode*)this)-&gt;_args, [((asmjit::FuncNode*)this)-&gt;_funcDetail._argCount]</Item>
-
- <Item Name="funcDetail" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_funcDetail</Item>
- <Item Name="rets" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_rets</Item>
- <Item Name="args" Condition="isInvoke()">((asmjit::InvokeNode*)this)-&gt;_args, [((asmjit::InvokeNode*)this)-&gt;_funcDetail._argCount]</Item>
- </Expand>
- </Type>
-</AutoVisualizer>
diff --git a/3rdparty/asmjit/src/asmjit/a64.h b/3rdparty/asmjit/src/asmjit/a64.h
deleted file mode 100644
index e849eb3a8ca..00000000000
--- a/3rdparty/asmjit/src/asmjit/a64.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_A64_H_INCLUDED
-#define ASMJIT_A64_H_INCLUDED
-
-//! \addtogroup asmjit_a64
-//!
-//! ### Emitters
-//!
-//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
-//! - \ref a64::Builder - AArch64 builder.
-//! - \ref a64::Compiler - AArch64 compiler.
-//! - \ref a64::Emitter - AArch64 emitter (abstract).
-//!
-//! ### Supported Instructions
-//!
-//! - Emitters:
-//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility
-//! functions. The member functions provided are part of all AArch64 emitters.
-//!
-//! - Instruction representation:
-//! - \ref a64::Inst::Id - instruction identifiers.
-//!
-//! ### Register Operands
-//!
-//! - \ref arm::Reg - Base class of all AArch32/AArch64 registers.
-//! - \ref a64::Gp - General purpose register (AArch64):
-//! - \ref a64::GpW - 32-bit general purpose register (AArch64).
-//! - \ref a64::GpX - 64-bit general purpose register (AArch64).
-//! - \ref a64::Vec - Vector (SIMD) register:
-//! - \ref a64::VecB - 8-bit SIMD register.
-//! - \ref a64::VecH - 16-bit SIMD register.
-//! - \ref a64::VecS - 32-bit SIMD register.
-//! - \ref a64::VecD - 64-bit SIMD register.
-//! - \ref a64::VecV - 128-bit SIMD register.
-//!
-//! ### Memory Operands
-//!
-//! - \ref arm::Mem - AArch32/AArch64 memory operand that provides support for all ARM addressing features
-//! including base, index, pre/post increment, and ARM-specific shift addressing and index extending.
-//!
-//! ### Other
-//!
-//! - \ref arm::Shift - Shift operation and value.
-//! - \ref arm::Utils - Utilities that can help during code generation for AArch32 and AArch64.
-
-#include "./arm.h"
-#include "./arm/a64assembler.h"
-#include "./arm/a64builder.h"
-#include "./arm/a64compiler.h"
-#include "./arm/a64emitter.h"
-#include "./arm/a64globals.h"
-#include "./arm/a64instdb.h"
-#include "./arm/a64operand.h"
-
-#endif // ASMJIT_A64_H_INCLUDED
-
diff --git a/3rdparty/asmjit/src/asmjit/arm.h b/3rdparty/asmjit/src/asmjit/arm.h
deleted file mode 100644
index e4a3e3d3ac5..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_H_INCLUDED
-#define ASMJIT_ARM_H_INCLUDED
-
-//! \addtogroup asmjit_arm
-//!
-//! ### Namespaces
-//!
-//! - \ref arm - arm namespace provides common functionality for both AArch32 and AArch64 backends.
-//! - \ref a32 - a32 namespace provides support for AArch32 architecture. In addition it includes
-//! \ref arm namespace, so you can only use a single namespace when targeting AArch32 architecture.
-//! - \ref a64 - a64 namespace provides support for AArch64 architecture. In addition it includes
-//! \ref arm namespace, so you can only use a single namespace when targeting AArch64 architecture.
-//!
-//! ### Emitters
-//!
-//! - AArch32
-//! - \ref a32::Assembler - AArch32 assembler (must read, provides examples).
-//! - \ref a32::Builder - AArch32 builder.
-//! - \ref a32::Compiler - AArch32 compiler.
-//! - \ref a32::Emitter - AArch32 emitter (abstract).
-//!
-//! - AArch64
-//! - \ref a64::Assembler - AArch64 assembler (must read, provides examples).
-//! - \ref a64::Builder - AArch64 builder.
-//! - \ref a64::Compiler - AArch64 compiler.
-//! - \ref a64::Emitter - AArch64 emitter (abstract).
-//!
-//! ### Supported Instructions
-//!
-//! - AArch32:
-//! - Emitters:
-//! - \ref a32::EmitterExplicitT - Provides all instructions that use explicit operands, provides also
-//! utility functions. The member functions provided are part of all AArch32 emitters.
-//! - Instruction representation:
-//! - \ref a32::Inst::Id - instruction identifiers.
-//!
-//! - AArch64:
-//! - Emitters:
-//! - \ref a64::EmitterExplicitT - Provides all instructions that use explicit operands, provides also
-//! utility functions. The member functions provided are part of all AArch64 emitters.
-//! - Instruction representation:
-//! - \ref a64::Inst::Id - instruction identifiers.
-//!
-//! ### Register Operands
-//!
-//! - \ref arm::Reg - Base class of all AArch32/AArch64 registers.
-//! - \ref a32::Gp - 32-bit general purpose register used by AArch32:
-//! - \ref a64::Gp - 32-bit or 64-bit general purpose register used by AArch64:
-//! - \ref a64::GpW - 32-bit register (AArch64).
-//! - \ref a64::GpX - 64-bit register (AArch64).
-//! - \ref arm::BaseVec - Base vector (SIMD) register.
-//! - \ref a32::Vec - Vector (SIMD) register (AArch32):
-//! - \ref a32::VecS - 32-bit SIMD register (AArch32).
-//! - \ref a32::VecD - 64-bit SIMD register (AArch32).
-//! - \ref a32::VecV - 128-bit SIMD register (AArch32).
-//! - \ref a64::Vec - Vector (SIMD) register (AArch64):
-//! - \ref a64::VecB - 8-bit SIMD register (AArch64).
-//! - \ref a64::VecH - 16-bit SIMD register (AArch64).
-//! - \ref a64::VecS - 32-bit SIMD register (AArch64).
-//! - \ref a64::VecD - 64-bit SIMD register (AArch64).
-//! - \ref a64::VecV - 128-bit SIMD register (AArch64).
-//!
-//! ### Memory Operands
-//!
-//! - \ref arm::Mem - AArch32/AArch64 memory operand that provides support for all ARM addressing features
-//! including base, index, pre/post increment, and ARM-specific shift addressing and index extending.
-//!
-//! ### Other
-//!
-//! - \ref arm::Shift - Shift operation and value (both AArch32 and AArch64).
-//! - \ref arm::DataType - Data type that is part of an instruction in AArch32 mode.
-//! - \ref arm::Utils - Utilities that can help during code generation for AArch32 and AArch64.
-
-#include "./core.h"
-#include "./arm/armglobals.h"
-#include "./arm/armoperand.h"
-#include "./arm/armutils.h"
-
-#endif // ASMJIT_ARM_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h b/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h
deleted file mode 100644
index 4b5bde68a9e..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64archtraits_p.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
-#define ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/misc_p.h"
-#include "../core/type.h"
-#include "../arm/a64globals.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-static const constexpr ArchTraits a64ArchTraits = {
- // SP/FP/LR/PC.
- Gp::kIdSp, Gp::kIdFp, Gp::kIdLr, 0xFF,
-
- // Reserved.
- { 0, 0, 0 },
-
- // HW stack alignment (AArch64 requires stack aligned to 16 bytes at HW level).
- 16,
-
- // Min/max stack offset - byte addressing is the worst, VecQ addressing the best.
- 4095, 65520,
-
- // Instruction hints [Gp, Vec, ExtraVirt2, ExtraVirt3].
- {{
- InstHints::kPushPop,
- InstHints::kPushPop,
- InstHints::kNoHints,
- InstHints::kNoHints
- }},
-
- // RegInfo.
- #define V(index) OperandSignature{RegTraits<RegType(index)>::kSignature}
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // RegTypeToTypeId.
- #define V(index) TypeId(RegTraits<RegType(index)>::kTypeId)
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // TypeIdToRegType.
- #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kARM_GpW : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kARM_GpW : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kARM_GpW : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kARM_GpW : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kARM_GpW : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kARM_GpW : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt64) ? RegType::kARM_GpX : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt64) ? RegType::kARM_GpX : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kARM_GpX : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kARM_GpX : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kARM_VecS : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kARM_VecD : RegType::kNone)
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
- {
- ArchTypeNameId::kByte,
- ArchTypeNameId::kHWord,
- ArchTypeNameId::kWord,
- ArchTypeNameId::kXWord
- }
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_A64ARCHTRAITS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp b/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp
deleted file mode 100644
index c926766af6f..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64assembler.cpp
+++ /dev/null
@@ -1,5183 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64)
-
-#include "../core/codewriter_p.h"
-#include "../core/cpuinfo.h"
-#include "../core/emitterutils_p.h"
-#include "../core/formatter.h"
-#include "../core/logger.h"
-#include "../core/misc_p.h"
-#include "../core/support.h"
-#include "../arm/armformatter_p.h"
-#include "../arm/armutils.h"
-#include "../arm/a64assembler.h"
-#include "../arm/a64emithelper_p.h"
-#include "../arm/a64instdb_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::Assembler - Utils
-// ======================
-
-static ASMJIT_FORCE_INLINE constexpr uint32_t diff(RegType a, RegType b) noexcept { return uint32_t(a) - uint32_t(b); }
-static ASMJIT_FORCE_INLINE constexpr uint32_t diff(VecElementType elementType, VecElementType baseType) noexcept { return uint32_t(elementType) - uint32_t(baseType); }
-
-// a64::Assembler - Cond
-// =====================
-
-static inline uint32_t condCodeToOpcodeCond(uint32_t cond) noexcept { return (uint32_t(cond) - 2u) & 0xFu; }
-
-// a64::Assembler - Bits
-// =====================
-
-template<typename T>
-static inline constexpr uint32_t B(const T& index) noexcept { return uint32_t(1u) << uint32_t(index); }
-
-static constexpr uint32_t kSP = Gp::kIdSp;
-static constexpr uint32_t kZR = Gp::kIdZr;
-static constexpr uint32_t kWX = InstDB::kWX;
-
-// a64::Assembler - ShiftOpToLdStOptMap
-// ====================================
-
-// Table that maps ShiftOp to OPT part in LD/ST (register) opcode.
-#define VALUE(index) index == uint32_t(ShiftOp::kUXTW) ? 2u : \
- index == uint32_t(ShiftOp::kLSL) ? 3u : \
- index == uint32_t(ShiftOp::kSXTW) ? 6u : \
- index == uint32_t(ShiftOp::kSXTX) ? 7u : 0xFF
-static const uint8_t armShiftOpToLdStOptMap[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
-#undef VALUE
-
-// asmjit::a64::Assembler - SizeOp
-// ===============================
-
-//! Struct that contains Size (2 bits), Q flag, and S (scalar) flag. These values
-//! are used to encode Q, Size, and Scalar fields in an opcode.
-struct SizeOp {
- enum : uint8_t {
- k128BitShift = 0,
- kScalarShift = 1,
- kSizeShift = 2,
-
- kQ = uint8_t(1u << k128BitShift),
- kS = uint8_t(1u << kScalarShift),
-
- k00 = uint8_t(0 << kSizeShift),
- k01 = uint8_t(1 << kSizeShift),
- k10 = uint8_t(2 << kSizeShift),
- k11 = uint8_t(3 << kSizeShift),
-
- k00Q = k00 | kQ,
- k01Q = k01 | kQ,
- k10Q = k10 | kQ,
- k11Q = k11 | kQ,
-
- k00S = k00 | kS,
- k01S = k01 | kS,
- k10S = k10 | kS,
- k11S = k11 | kS,
-
- kInvalid = 0xFFu,
-
- // Masks used by SizeOpMap.
- kSzQ = (0x3u << kSizeShift) | kQ,
- kSzS = (0x3u << kSizeShift) | kS,
- kSzQS = (0x3u << kSizeShift) | kQ | kS
- };
-
- uint8_t value;
-
- inline bool isValid() const noexcept { return value != kInvalid; }
- inline void makeInvalid() noexcept { value = kInvalid; }
-
- inline uint32_t q() const noexcept { return (value >> k128BitShift) & 0x1u; }
- inline uint32_t qs() const noexcept { return ((value >> k128BitShift) | (value >> kScalarShift)) & 0x1u; }
- inline uint32_t scalar() const noexcept { return (value >> kScalarShift) & 0x1u; }
- inline uint32_t size() const noexcept { return (value >> kSizeShift) & 0x3u; }
-
- inline void decrementSize() noexcept {
- ASMJIT_ASSERT(size() > 0);
- value = uint8_t(value - (1u << kSizeShift));
- }
-};
-
-struct SizeOpTable {
- enum TableId : uint8_t {
- kTableBin = 0,
- kTableAny,
- kCount
- };
-
- // 40 elements for each combination.
- SizeOp array[(uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB) + 1) * 8];
-};
-
-#define VALUE_BIN(x) { \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00 : \
- x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00Q : \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \
- x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : SizeOp::kInvalid \
-}
-
-#define VALUE_ANY(x) { \
- x == (((uint32_t(RegType::kARM_VecB) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k00S : \
- x == (((uint32_t(RegType::kARM_VecH) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k01S : \
- x == (((uint32_t(RegType::kARM_VecS) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k10S : \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kNone)) ? SizeOp::k11S : \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00 : \
- x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kB )) ? SizeOp::k00Q : \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01 : \
- x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kH )) ? SizeOp::k01Q : \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10 : \
- x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kS )) ? SizeOp::k10Q : \
- x == (((uint32_t(RegType::kARM_VecD) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11S : \
- x == (((uint32_t(RegType::kARM_VecV) - uint32_t(RegType::kARM_VecB)) << 3) | uint32_t(VecElementType::kD )) ? SizeOp::k11Q : SizeOp::kInvalid \
-}
-
-static const SizeOpTable sizeOpTable[SizeOpTable::kCount] = {
- {{ ASMJIT_LOOKUP_TABLE_40(VALUE_BIN, 0) }},
- {{ ASMJIT_LOOKUP_TABLE_40(VALUE_ANY, 0) }}
-};
-
-#undef VALUE_ANY
-#undef VALUE_BIN
-
-struct SizeOpMap {
- uint8_t tableId;
- uint8_t sizeOpMask;
- uint16_t acceptMask;
-};
-
-static const constexpr SizeOpMap sizeOpMap[InstDB::kVO_Count] = {
- { // kVO_V_B:
- SizeOpTable::kTableBin, SizeOp::kQ , uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q))
- },
-
- { // kVO_V_BH:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q))
- },
-
- { // kVO_V_BH_4S:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10Q))
- },
-
- { // kVO_V_BHS:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q))
- },
-
- { // kVO_V_BHS_D2:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k11Q))
- },
-
- { // kVO_V_HS:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q))
- },
-
- { // kVO_V_S:
- SizeOpTable::kTableAny, SizeOp::kQ , uint16_t(B(SizeOp::k10) | B(SizeOp::k10Q))
- },
-
- { // kVO_V_B8H4:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k01))
- },
-
- { // kVO_V_B8H4S2:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k01) | B(SizeOp::k10))
- },
-
- { // kVO_V_B8D1:
- SizeOpTable::kTableAny, SizeOp::kSzQ , uint16_t(B(SizeOp::k00) | B(SizeOp::k11S))
- },
-
- { // kVO_V_H4S2:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k10))
- },
-
- { // kVO_V_B16:
- SizeOpTable::kTableBin, SizeOp::kQ , uint16_t(B(SizeOp::k00Q))
- },
-
- { // kVO_V_B16H8:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k01Q))
- },
-
- { // kVO_V_B16H8S4:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k01Q) | B(SizeOp::k10Q))
- },
-
- { // kVO_V_B16D2:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00Q) | B(SizeOp::k11Q))
- },
-
- { // kVO_V_H8S4:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01Q) | B(SizeOp::k10Q))
- },
-
- { // kVO_V_S4:
- SizeOpTable::kTableAny, 0 , uint16_t(B(SizeOp::k10Q))
- },
-
- { // kVO_V_D2:
- SizeOpTable::kTableAny, 0 , uint16_t(B(SizeOp::k11Q))
- },
-
- { // kVO_SV_BHS:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k00S) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S))
- },
-
- { // kVO_SV_B8H4S2:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00S) | B(SizeOp::k01) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10S))
- },
-
- { // kVO_SV_HS:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S))
- },
-
- { // kVO_V_Any:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k11S) | B(SizeOp::k11Q))
- },
-
- { // kVO_SV_Any:
- SizeOpTable::kTableAny, SizeOp::kSzQS, uint16_t(B(SizeOp::k00) | B(SizeOp::k00Q) | B(SizeOp::k00S) |
- B(SizeOp::k01) | B(SizeOp::k01Q) | B(SizeOp::k01S) |
- B(SizeOp::k10) | B(SizeOp::k10Q) | B(SizeOp::k10S) |
- B(SizeOp::k11) | B(SizeOp::k11Q) | B(SizeOp::k11S))
- }
-};
-
-static const Operand_& significantSimdOp(const Operand_& o0, const Operand_& o1, uint32_t instFlags) noexcept {
- return !(instFlags & InstDB::kInstFlagLong) ? o0 : o1;
-}
-
-static inline SizeOp armElementTypeToSizeOp(uint32_t vecOpType, RegType regType, VecElementType elementType) noexcept {
- // Instruction data or Assembler is wrong if this triggers an assertion failure.
- ASMJIT_ASSERT(vecOpType < InstDB::kVO_Count);
- // ElementType uses 3 bits in the operand signature, it should never overflow.
- ASMJIT_ASSERT(uint32_t(elementType) <= 0x7u);
-
- const SizeOpMap& map = sizeOpMap[vecOpType];
- const SizeOpTable& table = sizeOpTable[map.tableId];
-
- size_t index = (Support::min<uint32_t>(diff(regType, RegType::kARM_VecB), diff(RegType::kARM_VecV, RegType::kARM_VecB) + 1) << 3) | uint32_t(elementType);
- SizeOp op = table.array[index];
- SizeOp modifiedOp { uint8_t(op.value & map.sizeOpMask) };
-
- if (!Support::bitTest(map.acceptMask, op.value))
- modifiedOp.makeInvalid();
-
- return modifiedOp;
-}
-
-// a64::Assembler - Immediate Encoding Utilities (Integral)
-// ========================================================
-
-using Utils::LogicalImm;
-
-struct HalfWordImm {
- uint32_t hw;
- uint32_t inv;
- uint32_t imm;
-};
-
-struct LMHImm {
- uint32_t lm;
- uint32_t h;
- uint32_t maxRmId;
-};
-
-static inline uint32_t countZeroHalfWords64(uint64_t imm) noexcept {
- return uint32_t((imm & 0x000000000000FFFFu) == 0) +
- uint32_t((imm & 0x00000000FFFF0000u) == 0) +
- uint32_t((imm & 0x0000FFFF00000000u) == 0) +
- uint32_t((imm & 0xFFFF000000000000u) == 0) ;
-}
-
-static uint32_t encodeMovSequence32(uint32_t out[2], uint32_t imm, uint32_t rd, uint32_t x) noexcept {
- ASMJIT_ASSERT(rd <= 31);
-
- uint32_t kMovZ = 0b01010010100000000000000000000000 | (x << 31);
- uint32_t kMovN = 0b00010010100000000000000000000000;
- uint32_t kMovK = 0b01110010100000000000000000000000;
-
- if ((imm & 0xFFFF0000u) == 0x00000000u) {
- out[0] = kMovZ | (0 << 21) | ((imm & 0xFFFFu) << 5) | rd;
- return 1;
- }
-
- if ((imm & 0xFFFF0000u) == 0xFFFF0000u) {
- out[0] = kMovN | (0 << 21) | ((~imm & 0xFFFFu) << 5) | rd;
- return 1;
- }
-
- if ((imm & 0x0000FFFFu) == 0x00000000u) {
- out[0] = kMovZ | (1 << 21) | ((imm >> 16) << 5) | rd;
- return 1;
- }
-
- if ((imm & 0x0000FFFFu) == 0x0000FFFFu) {
- out[0] = kMovN | (1 << 21) | ((~imm >> 16) << 5) | rd;
- return 1;
- }
-
- out[0] = kMovZ | (0 << 21) | ((imm & 0xFFFFu) << 5) | rd;
- out[1] = kMovK | (1 << 21) | ((imm >> 16) << 5) | rd;
- return 2;
-}
-
-static uint32_t encodeMovSequence64(uint32_t out[4], uint64_t imm, uint32_t rd, uint32_t x) noexcept {
- ASMJIT_ASSERT(rd <= 31);
-
- uint32_t kMovZ = 0b11010010100000000000000000000000;
- uint32_t kMovN = 0b10010010100000000000000000000000;
- uint32_t kMovK = 0b11110010100000000000000000000000;
-
- if (imm <= 0xFFFFFFFFu)
- return encodeMovSequence32(out, uint32_t(imm), rd, x);
-
- uint32_t zhw = countZeroHalfWords64( imm);
- uint32_t ohw = countZeroHalfWords64(~imm);
-
- if (zhw >= ohw) {
- uint32_t op = kMovZ;
- uint32_t count = 0;
-
- for (uint32_t hwIndex = 0; hwIndex < 4; hwIndex++, imm >>= 16) {
- uint32_t hwImm = uint32_t(imm & 0xFFFFu);
- if (hwImm == 0)
- continue;
-
- out[count++] = op | (hwIndex << 21) | (hwImm << 5) | rd;
- op = kMovK;
- }
-
- // This should not happen - zero should be handled by encodeMovSequence32().
- ASMJIT_ASSERT(count > 0);
-
- return count;
- }
- else {
- uint32_t op = kMovN;
- uint32_t count = 0;
- uint32_t negMask = 0xFFFFu;
-
- for (uint32_t hwIndex = 0; hwIndex < 4; hwIndex++, imm >>= 16) {
- uint32_t hwImm = uint32_t(imm & 0xFFFFu);
- if (hwImm == 0xFFFFu)
- continue;
-
- out[count++] = op | (hwIndex << 21) | ((hwImm ^ negMask) << 5) | rd;
- op = kMovK;
- negMask = 0;
- }
-
- if (count == 0) {
- out[count++] = kMovN | ((0xFFFF ^ negMask) << 5) | rd;
- }
-
- return count;
- }
-}
-
-static inline bool encodeLMH(uint32_t sizeField, uint32_t elementIndex, LMHImm* out) noexcept {
- if (sizeField != 1 && sizeField != 2)
- return false;
-
- uint32_t hShift = 3u - sizeField;
- uint32_t lmShift = sizeField - 1u;
- uint32_t maxElementIndex = 15u >> sizeField;
-
- out->h = elementIndex >> hShift;
- out->lm = (elementIndex << lmShift) & 0x3u;
- out->maxRmId = (8u << sizeField) - 1;
-
- return elementIndex <= maxElementIndex;
-}
-
-// a64::Assembler - Opcode
-// =======================
-
-//! Helper class to store and manipulate ARM opcode.
-struct Opcode {
- uint32_t v;
-
- enum Bits : uint32_t {
- kN = (1u << 22),
- kQ = (1u << 30),
- kX = (1u << 31)
- };
-
- // --------------------------------------------------------------------------
- // [Opcode Builder]
- // --------------------------------------------------------------------------
-
- inline uint32_t get() const noexcept { return v; }
- inline void reset(uint32_t value) noexcept { v = value; }
-
- inline bool hasQ() const noexcept { return (v & kQ) != 0; }
- inline bool hasX() const noexcept { return (v & kX) != 0; }
-
- template<typename T>
- inline Opcode& addImm(T value, uint32_t bitIndex) noexcept { return operator|=(uint32_t(value) << bitIndex); }
-
- template<typename T>
- inline Opcode& xorImm(T value, uint32_t bitIndex) noexcept { return operator^=(uint32_t(value) << bitIndex); }
-
- template<typename T, typename Condition>
- inline Opcode& addIf(T value, const Condition& condition) noexcept { return operator|=(condition ? uint32_t(value) : uint32_t(0)); }
-
- inline Opcode& addLogicalImm(const LogicalImm& logicalImm) noexcept {
- addImm(logicalImm.n, 22);
- addImm(logicalImm.r, 16);
- addImm(logicalImm.s, 10);
- return *this;
- }
-
- inline Opcode& addReg(uint32_t id, uint32_t bitIndex) noexcept { return operator|=((id & 31u) << bitIndex); }
- inline Opcode& addReg(const Operand_& op, uint32_t bitIndex) noexcept { return addReg(op.id(), bitIndex); }
-
- inline Opcode& operator=(uint32_t x) noexcept { v = x; return *this; }
- inline Opcode& operator&=(uint32_t x) noexcept { v &= x; return *this; }
- inline Opcode& operator|=(uint32_t x) noexcept { v |= x; return *this; }
- inline Opcode& operator^=(uint32_t x) noexcept { v ^= x; return *this; }
-
- inline uint32_t operator&(uint32_t x) const noexcept { return v & x; }
- inline uint32_t operator|(uint32_t x) const noexcept { return v | x; }
- inline uint32_t operator^(uint32_t x) const noexcept { return v ^ x; }
-};
-
-// a64::Assembler - Signature Utilities
-// ====================================
-
-// TODO: [ARM] Deprecate matchSignature.
-static inline bool matchSignature(const Operand_& o0, const Operand_& o1, uint32_t instFlags) noexcept {
- if (!(instFlags & (InstDB::kInstFlagLong | InstDB::kInstFlagNarrow)))
- return o0.signature() == o1.signature();
-
- // TODO: [ARM] Something smart to validate this.
- return true;
-}
-
-static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t instFlags) noexcept {
- return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature();
-}
-
-static inline bool matchSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, uint32_t instFlags) noexcept {
- return matchSignature(o0, o1, instFlags) && o1.signature() == o2.signature() && o2.signature() == o3.signature();
-}
-
-// Memory must be either:
-// 1. Absolute address, which will be converted to relative.
-// 2. Relative displacement (Label).
-// 3. Base register + either offset or index.
-static inline bool armCheckMemBaseIndexRel(const Mem& mem) noexcept {
- // Allowed base types (Nothing, Label, and GpX).
- constexpr uint32_t kBaseMask = B(0) |
- B(RegType::kLabelTag) |
- B(RegType::kARM_GpX);
-
- // Allowed index types (Nothing, GpW, and GpX).
- constexpr uint32_t kIndexMask = B(0) |
- B(RegType::kARM_GpW) |
- B(RegType::kARM_GpX) ;
-
- RegType baseType = mem.baseType();
- RegType indexType = mem.indexType();
-
- if (!Support::bitTest(kBaseMask, baseType))
- return false;
-
- if (baseType > RegType::kLabelTag) {
- // Index allows either GpW or GpX.
- if (!Support::bitTest(kIndexMask, indexType))
- return false;
-
- if (indexType == RegType::kNone)
- return true;
- else
- return !mem.hasOffset();
- }
- else {
- // No index register allowed if this is a PC relative address (literal).
- return indexType == RegType::kNone;
- }
-}
-
-struct EncodeFpOpcodeBits {
- uint32_t sizeMask;
- uint32_t mask[3];
-};
-
-static inline bool pickFpOpcode(const Vec& reg, uint32_t sOp, uint32_t sHf, uint32_t vOp, uint32_t vHf, Opcode* opcode, uint32_t* szOut) noexcept {
- static constexpr uint32_t kQBitIndex = 30;
-
- static const EncodeFpOpcodeBits szBits[InstDB::kHF_Count] = {
- { B(2) | B(1) , { 0u , 0u, B(22) } },
- { B(2) | B(1) | B(0), { 0u , 0u, 0u } },
- { B(2) | B(1) | B(0), { B(23) | B(22) , 0u, B(22) } },
- { B(2) | B(1) | B(0), { B(22) | B(20) | B(19) , 0u, B(22) } },
- { B(2) | B(1) | B(0), { B(22) | B(21) | B(15) | B(14), 0u, B(22) } },
- { B(2) | B(1) | B(0), { B(23) , 0u, B(22) } }
- };
-
- if (!reg.hasElementType()) {
- // Scalar operation [HSD].
- uint32_t sz = diff(reg.type(), RegType::kARM_VecH);
- if (sz > 2u || !Support::bitTest(szBits[sHf].sizeMask, sz))
- return false;
-
- opcode->reset(szBits[sHf].mask[sz] ^ sOp);
- *szOut = sz;
- return sOp != 0;
- }
- else {
- // Vector operation [HSD].
- uint32_t q = diff(reg.type(), RegType::kARM_VecD);
- uint32_t sz = diff(reg.elementType(), VecElementType::kH);
-
- if (q > 1u || sz > 2u || !Support::bitTest(szBits[vHf].sizeMask, sz))
- return false;
-
- opcode->reset(szBits[vHf].mask[sz] ^ (vOp | (q << kQBitIndex)));
- *szOut = sz;
- return vOp != 0;
- }
-}
-
-static inline bool pickFpOpcode(const Vec& reg, uint32_t sOp, uint32_t sHf, uint32_t vOp, uint32_t vHf, Opcode* opcode) noexcept {
- uint32_t sz;
- return pickFpOpcode(reg, sOp, sHf, vOp, vHf, opcode, &sz);
-}
-
-// a64::Assembler - Operand Checks
-// ===============================
-
-// Checks whether all operands have the same signature.
-static inline bool checkSignature(const Operand_& o0, const Operand_& o1) noexcept {
- return o0.signature() == o1.signature();
-}
-
-static inline bool checkSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
- return o0.signature() == o1.signature() &&
- o1.signature() == o2.signature();
-}
-
-static inline bool checkSignature(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
- return o0.signature() == o1.signature() &&
- o1.signature() == o2.signature() &&
- o2.signature() == o3.signature();
-}
-
-// Checks whether the register is GP register of the allowed types.
-//
-// Allowed is a 2-bit mask, where the first bits allows GpW and the second bit
-// allows GpX. These bits are usually stored within the instruction, but could
-// be also hardcoded in the assembler for instructions where GP types are not
-// selectable.
-static inline bool checkGpType(const Operand_& op, uint32_t allowed) noexcept {
- RegType type = op.as<Reg>().type();
- return Support::bitTest(allowed << uint32_t(RegType::kARM_GpW), type);
-}
-
-static inline bool checkGpType(const Operand_& op, uint32_t allowed, uint32_t* x) noexcept {
- // NOTE: We set 'x' to one only when GpW is allowed, otherwise the X is part
- // of the opcode and we cannot set it. This is why this works without requiring
- // additional logic.
- RegType type = op.as<Reg>().type();
- *x = diff(type, RegType::kARM_GpW) & allowed;
- return Support::bitTest(allowed << uint32_t(RegType::kARM_GpW), type);
-}
-
-static inline bool checkGpType(const Operand_& o0, const Operand_& o1, uint32_t allowed, uint32_t* x) noexcept {
- return checkGpType(o0, allowed, x) && checkSignature(o0, o1);
-}
-
-static inline bool checkGpType(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t allowed, uint32_t* x) noexcept {
- return checkGpType(o0, allowed, x) && checkSignature(o0, o1, o2);
-}
-
-static inline bool checkGpId(const Operand_& op, uint32_t hiId = kZR) noexcept {
- uint32_t id = op.as<Reg>().id();
- return id < 31u || id == hiId;
-}
-
-static inline bool checkGpId(const Operand_& o0, const Operand_& o1, uint32_t hiId = kZR) noexcept {
- uint32_t id0 = o0.as<Reg>().id();
- uint32_t id1 = o1.as<Reg>().id();
-
- return (id0 < 31u || id0 == hiId) && (id1 < 31u || id1 == hiId);
-}
-
-static inline bool checkGpId(const Operand_& o0, const Operand_& o1, const Operand_& o2, uint32_t hiId = kZR) noexcept {
- uint32_t id0 = o0.as<Reg>().id();
- uint32_t id1 = o1.as<Reg>().id();
- uint32_t id2 = o2.as<Reg>().id();
-
- return (id0 < 31u || id0 == hiId) && (id1 < 31u || id1 == hiId) && (id2 < 31u || id2 == hiId);
-}
-
-static inline bool checkVecId(const Operand_& op) noexcept {
- uint32_t id = op.as<Reg>().id();
- return id <= 31u;
-}
-
-static inline bool checkVecId(const Operand_& o0, const Operand_& o1) noexcept {
- uint32_t id0 = o0.as<Reg>().id();
- uint32_t id1 = o1.as<Reg>().id();
-
- return (id0 | id1) <= 31u;
-}
-
-/* Unused at the moment.
-static inline bool checkVecId(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
- uint32_t id0 = o0.as<Reg>().id();
- uint32_t id1 = o1.as<Reg>().id();
- uint32_t id2 = o2.as<Reg>().id();
-
- return (id0 | id1 | id2) <= 31u;
-}
-
-static inline bool checkVecId(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
- uint32_t id0 = o0.as<Reg>().id();
- uint32_t id1 = o1.as<Reg>().id();
- uint32_t id2 = o2.as<Reg>().id();
- uint32_t id3 = o3.as<Reg>().id();
-
- return (id0 | id1 | id2 | id3) <= 31u;
-}
-*/
-
-static inline bool checkMemBase(const Mem& mem) noexcept {
- return mem.baseType() == RegType::kARM_GpX && mem.baseId() <= 31;
-}
-
-static inline bool checkEven(const Operand_& o0, const Operand_& o1) noexcept {
- return ((o0.id() | o1.id()) & 1) == 0;
-}
-
-static inline bool checkConsecutive(const Operand_& o0, const Operand_& o1) noexcept {
- return ((o0.id() + 1u) & 0x1Fu) == o1.id();
-}
-
-static inline bool checkConsecutive(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
- return ((o0.id() + 1u) & 0x1Fu) == o1.id() &&
- ((o0.id() + 2u) & 0x1Fu) == o2.id();
-}
-
-static inline bool checkConsecutive(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
- return ((o0.id() + 1u) & 0x1Fu) == o1.id() &&
- ((o0.id() + 2u) & 0x1Fu) == o2.id() &&
- ((o0.id() + 3u) & 0x1Fu) == o3.id();
-}
-
-// a64::Assembler - CheckReg
-// =========================
-
-#define V(index) (index == uint32_t(RegType::kARM_GpW) ? Gp::kIdZr : \
- index == uint32_t(RegType::kARM_GpX) ? Gp::kIdZr : \
- index == uint32_t(RegType::kARM_VecB) ? 31u : \
- index == uint32_t(RegType::kARM_VecH) ? 31u : \
- index == uint32_t(RegType::kARM_VecS) ? 31u : \
- index == uint32_t(RegType::kARM_VecD) ? 31u : \
- index == uint32_t(RegType::kARM_VecV) ? 31u : 0)
-static const Support::Array<uint8_t, 32> commonHiRegIdOfType = {{
- ASMJIT_LOOKUP_TABLE_32(V, 0)
-}};
-#undef V
-
-static inline bool checkValidRegs(const Operand_& o0) noexcept {
- return bool(unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()]));
-}
-
-static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1) noexcept {
- return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()])) &
- (unsigned(o1.id() < 31) | unsigned(o1.id() == commonHiRegIdOfType[o1.as<Reg>().type()])));
-}
-
-static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Operand_& o2) noexcept {
- return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()])) &
- (unsigned(o1.id() < 31) | unsigned(o1.id() == commonHiRegIdOfType[o1.as<Reg>().type()])) &
- (unsigned(o2.id() < 31) | unsigned(o2.id() == commonHiRegIdOfType[o2.as<Reg>().type()])));
-}
-
-static inline bool checkValidRegs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) noexcept {
- return bool((unsigned(o0.id() < 31) | unsigned(o0.id() == commonHiRegIdOfType[o0.as<Reg>().type()])) &
- (unsigned(o1.id() < 31) | unsigned(o1.id() == commonHiRegIdOfType[o1.as<Reg>().type()])) &
- (unsigned(o2.id() < 31) | unsigned(o2.id() == commonHiRegIdOfType[o2.as<Reg>().type()])) &
- (unsigned(o3.id() < 31) | unsigned(o3.id() == commonHiRegIdOfType[o3.as<Reg>().type()])));
-}
-
-// a64::Assembler - Construction & Destruction
-// ===========================================
-
-Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
- _archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
- if (code)
- code->attach(this);
-}
-
-Assembler::~Assembler() noexcept {}
-
-// a64::Assembler - Emit
-// =====================
-
-#define ENC_OPS1(OP0) \
- (uint32_t(OperandType::k##OP0))
-
-#define ENC_OPS2(OP0, OP1) \
- (uint32_t(OperandType::k##OP0) + \
- (uint32_t(OperandType::k##OP1) << 3))
-
-#define ENC_OPS3(OP0, OP1, OP2) \
- (uint32_t(OperandType::k##OP0) + \
- (uint32_t(OperandType::k##OP1) << 3) + \
- (uint32_t(OperandType::k##OP2) << 6))
-
-#define ENC_OPS4(OP0, OP1, OP2, OP3) \
- (uint32_t(OperandType::k##OP0) + \
- (uint32_t(OperandType::k##OP1) << 3) + \
- (uint32_t(OperandType::k##OP2) << 6) + \
- (uint32_t(OperandType::k##OP3) << 9))
-
-Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
- // Logging/Validation/Error.
- constexpr InstOptions kRequiresSpecialHandling = InstOptions::kReserved;
-
- Error err;
- CodeWriter writer(this);
-
- // Combine all instruction options and also check whether the instruction
- // is valid. All options that require special handling (including invalid
- // instruction) are handled by the next branch.
- InstOptions options = InstOptions(instId - 1 >= Inst::_kIdCount - 1) | InstOptions((size_t)(_bufferEnd - writer.cursor()) < 4) | instOptions() | forcedInstOptions();
-
- CondCode instCC = BaseInst::extractARMCondCode(instId);
- instId = instId & uint32_t(InstIdParts::kRealId);
-
- if (instId >= Inst::_kIdCount)
- instId = 0;
-
- const InstDB::InstInfo* instInfo = &InstDB::_instInfoTable[instId];
- uint32_t encodingIndex = instInfo->_encodingDataIndex;
-
- Opcode opcode;
- uint32_t isign4;
- uint32_t instFlags;
-
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const Operand_* rmRel = nullptr;
-
- uint32_t multipleOpData[4];
- uint32_t multipleOpCount;
-
- // These are only used when instruction uses a relative displacement.
- OffsetFormat offsetFormat; // Offset format.
- uint64_t offsetValue; // Offset value (if known).
-
- if (ASMJIT_UNLIKELY(Support::test(options, kRequiresSpecialHandling))) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- // Unknown instruction.
- if (ASMJIT_UNLIKELY(instId == 0))
- goto InvalidInstruction;
-
- // Condition code can only be used with 'B' instruction.
- if (ASMJIT_UNLIKELY(instCC != CondCode::kAL && instId != Inst::kIdB))
- goto InvalidInstruction;
-
- // Grow request, happens rarely.
- err = writer.ensureSpace(this, 4);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
-#ifndef ASMJIT_NO_VALIDATION
- // Strict validation.
- if (hasDiagnosticOption(DiagnosticOptions::kValidateAssembler)) {
- Operand_ opArray[Globals::kMaxOpCount];
- EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
-
- err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
- }
-#endif
- }
-
- // Signature of the first 4 operands.
- isign4 = (uint32_t(o0.opType()) ) +
- (uint32_t(o1.opType()) << 3) +
- (uint32_t(o2.opType()) << 6) +
- (uint32_t(o3.opType()) << 9);
- instFlags = instInfo->flags();
-
- switch (instInfo->_encoding) {
- // ------------------------------------------------------------------------
- // [Base - Universal]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseOp: {
- const InstDB::EncodingData::BaseOp& opData = InstDB::EncodingData::baseOp[encodingIndex];
-
- if (isign4 == 0) {
- opcode.reset(opData.opcode);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseOpImm: {
- const InstDB::EncodingData::BaseOpImm& opData = InstDB::EncodingData::baseOpImm[encodingIndex];
-
- if (isign4 == ENC_OPS1(Imm)) {
- uint64_t imm = o0.as<Imm>().valueAs<uint64_t>();
- uint32_t immMax = 1u << opData.immBits;
-
- if (imm >= immMax)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(imm, opData.immOffset);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseR: {
- const InstDB::EncodingData::BaseR& opData = InstDB::EncodingData::baseR[encodingIndex];
-
- if (isign4 == ENC_OPS1(Reg)) {
- if (!checkGpType(o0, opData.rType))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.rHiId))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode);
- opcode.addReg(o0, opData.rShift);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRR: {
- const InstDB::EncodingData::BaseRR& opData = InstDB::EncodingData::baseRR[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- uint32_t x;
- if (!checkGpType(o0, opData.aType, &x))
- goto InvalidInstruction;
-
- if (!checkGpType(o1, opData.bType))
- goto InvalidInstruction;
-
- if (opData.uniform && !checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.aHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o1, opData.bHiId))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addReg(o1, opData.bShift);
- opcode.addReg(o0, opData.aShift);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRRR: {
- const InstDB::EncodingData::BaseRRR& opData = InstDB::EncodingData::baseRRR[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- uint32_t x;
- if (!checkGpType(o0, opData.aType, &x))
- goto InvalidInstruction;
-
- if (!checkGpType(o1, opData.bType))
- goto InvalidInstruction;
-
- if (!checkGpType(o2, opData.cType))
- goto InvalidInstruction;
-
- if (opData.uniform && !checkSignature(o0, o1, o2))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.aHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o1, opData.bHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o2, opData.cHiId))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, 31);
- opcode.addReg(o2, 16);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRRRR: {
- const InstDB::EncodingData::BaseRRRR& opData = InstDB::EncodingData::baseRRRR[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- uint32_t x;
- if (!checkGpType(o0, opData.aType, &x))
- goto InvalidInstruction;
-
- if (!checkGpType(o1, opData.bType))
- goto InvalidInstruction;
-
- if (!checkGpType(o2, opData.cType))
- goto InvalidInstruction;
-
- if (!checkGpType(o3, opData.dType))
- goto InvalidInstruction;
-
- if (opData.uniform && !checkSignature(o0, o1, o2, o3))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.aHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o1, opData.bHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o2, opData.cHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o3, opData.dHiId))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, 31);
- opcode.addReg(o2, 16);
- opcode.addReg(o3, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRRII: {
- const InstDB::EncodingData::BaseRRII& opData = InstDB::EncodingData::baseRRII[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- if (!checkGpType(o0, opData.aType))
- goto InvalidInstruction;
-
- if (!checkGpType(o1, opData.bType))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.aHiId))
- goto InvalidPhysId;
-
- if (!checkGpId(o1, opData.bHiId))
- goto InvalidPhysId;
-
- if (o2.as<Imm>().valueAs<uint64_t>() >= Support::bitMask(opData.aImmSize + opData.aImmDiscardLsb) ||
- o3.as<Imm>().valueAs<uint64_t>() >= Support::bitMask(opData.bImmSize + opData.bImmDiscardLsb))
- goto InvalidImmediate;
-
- uint32_t aImm = o2.as<Imm>().valueAs<uint32_t>() >> opData.aImmDiscardLsb;
- uint32_t bImm = o3.as<Imm>().valueAs<uint32_t>() >> opData.bImmDiscardLsb;
-
- if ((aImm << opData.aImmDiscardLsb) != o2.as<Imm>().valueAs<uint32_t>() ||
- (bImm << opData.bImmDiscardLsb) != o3.as<Imm>().valueAs<uint32_t>())
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode());
- opcode.addImm(aImm, opData.aImmOffset);
- opcode.addImm(bImm, opData.bImmOffset);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Mov]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseMov: {
- // MOV is a pseudo instruction that uses various instructions depending on its signature.
- uint32_t x = diff(o0.as<Reg>().type(), RegType::kARM_GpW);
- if (x > 1)
- goto InvalidInstruction;
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (!o0.as<Reg>().isGp())
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- bool hasSP = o0.as<Gp>().isSP() || o1.as<Gp>().isSP();
- if (hasSP) {
- // Cannot be combined with ZR.
- if (!checkGpId(o0, o1, kSP))
- goto InvalidPhysId;
-
- // MOV Rd, Rm -> ADD Rd, Rn, #0.
- opcode.reset(0b00010001000000000000000000000000);
- opcode.addImm(x, 31);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
- else {
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- // MOV Rd, Rm -> ORR Rd, <ZR>, Rm.
- opcode.reset(0b00101010000000000000001111100000);
- opcode.addImm(x, 31);
- opcode.addReg(o1, 16);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
- }
-
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- if (!o0.as<Reg>().isGp())
- goto InvalidInstruction;
-
- uint64_t immValue = o1.as<Imm>().valueAs<uint64_t>();
- if (!x)
- immValue &= 0xFFFFFFFFu;
-
- // Prefer a single MOVN/MOVZ instruction over a logical instruction.
- multipleOpCount = encodeMovSequence64(multipleOpData, immValue, o0.id() & 31, x);
- if (multipleOpCount == 1 && !o0.as<Gp>().isSP()) {
- opcode.reset(multipleOpData[0]);
- goto EmitOp;
- }
-
- // Logical instructions use 13-bit immediate pattern encoded as N:ImmR:ImmS.
- LogicalImm logicalImm;
- if (!o0.as<Gp>().isZR()) {
- if (Utils::encodeLogicalImm(immValue, x ? 64 : 32, &logicalImm)) {
- if (!checkGpId(o0, kSP))
- goto InvalidPhysId;
-
- opcode.reset(0b00110010000000000000001111100000);
- opcode.addImm(x, 31);
- opcode.addLogicalImm(logicalImm);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
- }
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- goto EmitOp_Multiple;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseMovKNZ: {
- const InstDB::EncodingData::BaseMovKNZ& opData = InstDB::EncodingData::baseMovKNZ[encodingIndex];
-
- uint32_t x = diff(o0.as<Reg>().type(), RegType::kARM_GpW);
- if (x > 1)
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
-
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- uint64_t imm16 = o1.as<Imm>().valueAs<uint64_t>();
- if (imm16 > 0xFFFFu)
- goto InvalidImmediate;
-
- opcode.addImm(imm16, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS3(Reg, Imm, Imm)) {
- uint64_t imm16 = o1.as<Imm>().valueAs<uint64_t>();
- uint32_t shiftType = o2.as<Imm>().predicate();
- uint64_t shiftValue = o2.as<Imm>().valueAs<uint64_t>();
-
- if (imm16 > 0xFFFFu || shiftValue > 48 || shiftType != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- // Convert shift value to 'hw' field.
- uint32_t hw = uint32_t(shiftValue) >> 4;
- if ((hw << 4) != uint32_t(shiftValue))
- goto InvalidImmediate;
-
- opcode.addImm(hw, 21);
- opcode.addImm(imm16, 5);
- opcode.addReg(o0, 0);
-
- if (!x && hw > 1u)
- goto InvalidImmediate;
-
- goto EmitOp;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Adr]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseAdr: {
- const InstDB::EncodingData::BaseAdr& opData = InstDB::EncodingData::baseAdr[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Label) || isign4 == ENC_OPS2(Reg, Imm)) {
- if (!o0.as<Reg>().isGpX())
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addReg(o0, 0);
- offsetFormat.resetToImmValue(opData.offsetType, 4, 5, 21, 0);
-
- if (instId == Inst::kIdAdrp)
- offsetFormat._immDiscardLsb = 12;
-
- rmRel = &o1;
- goto EmitOp_Rel;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Arithmetic and Logical]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseAddSub: {
- const InstDB::EncodingData::BaseAddSub& opData = InstDB::EncodingData::baseAddSub[encodingIndex];
-
- uint32_t x;
- if (!checkGpType(o0, o1, kWX, &x))
- goto InvalidInstruction;
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) || isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- opcode.reset(uint32_t(opData.immediateOp) << 24);
-
- // ADD | SUB (immediate) - ZR is not allowed.
- // ADDS|SUBS (immediate) - ZR allowed in Rd, SP allowed in Rn.
- uint32_t aHiId = opcode.get() & B(29) ? kZR : kSP;
- uint32_t bHiId = kSP;
-
- if (!checkGpId(o0, aHiId) || !checkGpId(o1, bHiId))
- goto InvalidPhysId;
-
- // ADD|SUB (immediate) use 12-bit immediate optionally shifted by 'LSL #12'.
- uint64_t imm = o2.as<Imm>().valueAs<uint64_t>();
- uint32_t shift = 0;
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- if (o3.as<Imm>().predicate() != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- if (o3.as<Imm>().value() != 0 && o3.as<Imm>().value() != 12)
- goto InvalidImmediate;
-
- shift = uint32_t(o3.as<Imm>().value() != 0);
- }
-
- // Accept immediate value of '0x00XXX000' by setting 'shift' to 12.
- if (imm > 0xFFFu) {
- if (shift || (imm & ~uint64_t(0xFFFu << 12)) != 0)
- goto InvalidImmediate;
- shift = 1;
- imm >>= 12;
- }
-
- opcode.addImm(x, 31);
- opcode.addImm(shift, 22);
- opcode.addImm(imm, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg) || isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- if (!checkSignature(o1, o2))
- goto InvalidInstruction;
-
- uint32_t opSize = x ? 64 : 32;
- uint64_t shift = 0;
- uint32_t sType = uint32_t(ShiftOp::kLSL);
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- sType = o3.as<Imm>().predicate();
- shift = o3.as<Imm>().valueAs<uint64_t>();
- }
-
- if (!checkGpId(o2, kZR))
- goto InvalidPhysId;
-
- // Shift operation - LSL, LSR, ASR.
- if (sType <= uint32_t(ShiftOp::kASR)) {
- bool hasSP = o0.as<Gp>().isSP() || o1.as<Gp>().isSP();
- if (!hasSP) {
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- if (shift >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(uint32_t(opData.shiftedOp) << 21);
- opcode.addImm(x, 31);
- opcode.addImm(sType, 22);
- opcode.addReg(o2, 16);
- opcode.addImm(shift, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- // SP register can only be used with LSL or Extend.
- if (sType != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
- sType = x ? uint32_t(ShiftOp::kUXTX) : uint32_t(ShiftOp::kUXTW);
- }
-
- // Extend operation - UXTB, UXTH, UXTW, UXTX, SXTB, SXTH, SXTW, SXTX.
- opcode.reset(uint32_t(opData.extendedOp) << 21);
- sType -= uint32_t(ShiftOp::kUXTB);
-
- if (sType > 7 || shift > 4)
- goto InvalidImmediate;
-
- if (!(opcode.get() & B(29))) {
- // ADD|SUB (extend) - ZR is not allowed.
- if (!checkGpId(o0, o1, kSP))
- goto InvalidPhysId;
- }
- else {
- // ADDS|SUBS (extend) - ZR allowed in Rd, SP allowed in Rn.
- if (!checkGpId(o0, kZR) || !checkGpId(o1, kSP))
- goto InvalidPhysId;
- }
-
- opcode.addImm(x, 31);
- opcode.addReg(o2, 16);
- opcode.addImm(sType, 13);
- opcode.addImm(shift, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseLogical: {
- const InstDB::EncodingData::BaseLogical& opData = InstDB::EncodingData::baseLogical[encodingIndex];
-
- uint32_t x;
- if (!checkGpType(o0, o1, kWX, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- uint32_t opSize = x ? 64 : 32;
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.immediateOp != 0) {
- opcode.reset(uint32_t(opData.immediateOp) << 23);
-
- // AND|ANDS|BIC|BICS|ORR|EOR (immediate) uses a LogicalImm format described by N:R:S values.
- uint64_t immMask = Support::lsbMask<uint64_t>(opSize);
- uint64_t immValue = o2.as<Imm>().valueAs<uint64_t>();
-
- if (opData.negateImm)
- immValue ^= immMask;
-
- // Logical instructions use 13-bit immediate pattern encoded as N:ImmS:ImmR.
- LogicalImm logicalImm;
- if (!Utils::encodeLogicalImm(immValue & immMask, opSize, &logicalImm))
- goto InvalidImmediate;
-
- // AND|BIC|ORR|EOR (immediate) can have SP on destination, but ANDS|BICS (immediate) cannot.
- uint32_t kOpANDS = 0x3 << 29;
- bool isANDS = (opcode.get() & kOpANDS) == kOpANDS;
-
- if (!checkGpId(o0, isANDS ? kZR : kSP) || !checkGpId(o1, kZR))
- goto InvalidPhysId;
-
- opcode.addImm(x, 31);
- opcode.addLogicalImm(logicalImm);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- if (!checkSignature(o1, o2))
- goto InvalidInstruction;
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!checkGpId(o0, o1, o2, kZR))
- goto InvalidPhysId;
-
- opcode.reset(uint32_t(opData.shiftedOp) << 21);
- opcode.addImm(x, 31);
- opcode.addReg(o2, 16);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- if (!checkGpId(o0, o1, o2, kZR))
- goto InvalidPhysId;
-
- uint32_t shiftType = o3.as<Imm>().predicate();
- uint64_t opShift = o3.as<Imm>().valueAs<uint64_t>();
-
- if (shiftType > 0x3 || opShift >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(uint32_t(opData.shiftedOp) << 21);
- opcode.addImm(x, 31);
- opcode.addImm(shiftType, 22);
- opcode.addReg(o2, 16);
- opcode.addImm(opShift, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseCmpCmn: {
- const InstDB::EncodingData::BaseCmpCmn& opData = InstDB::EncodingData::baseCmpCmn[encodingIndex];
-
- uint32_t x;
- if (!checkGpType(o0, kWX, &x))
- goto InvalidInstruction;
-
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- // CMN|CMP (immediate) - ZR is not allowed.
- if (!checkGpId(o0, kSP))
- goto InvalidPhysId;
-
- // CMN|CMP (immediate) use 12-bit immediate optionally shifted by 'LSL #12'.
- const Imm& imm12 = o1.as<Imm>();
- uint32_t immShift = 0;
- uint64_t immValue = imm12.valueAs<uint64_t>();
-
- if (immValue > 0xFFFu) {
- if ((immValue & ~uint64_t(0xFFFu << 12)) != 0)
- goto InvalidImmediate;
- immShift = 1;
- immValue >>= 12;
- }
-
- opcode.reset(uint32_t(opData.immediateOp) << 24);
- opcode.addImm(x, 31);
- opcode.addImm(immShift, 22);
- opcode.addImm(immValue, 10);
- opcode.addReg(o0, 5);
- opcode.addReg(Gp::kIdZr, 0);
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS2(Reg, Reg) || isign4 == ENC_OPS3(Reg, Reg, Imm)) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- uint32_t opSize = x ? 64 : 32;
- uint32_t sType = 0;
- uint64_t shift = 0;
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
- sType = o2.as<Imm>().predicate();
- shift = o2.as<Imm>().valueAs<uint64_t>();
- }
-
- bool hasSP = o0.as<Gp>().isSP() || o1.as<Gp>().isSP();
-
- // Shift operation - LSL, LSR, ASR.
- if (sType <= uint32_t(ShiftOp::kASR)) {
- if (!hasSP) {
- if (shift >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(uint32_t(opData.shiftedOp) << 21);
- opcode.addImm(x, 31);
- opcode.addImm(sType, 22);
- opcode.addReg(o1, 16);
- opcode.addImm(shift, 10);
- opcode.addReg(o0, 5);
- opcode.addReg(Gp::kIdZr, 0);
- goto EmitOp;
- }
-
- // SP register can only be used with LSL or Extend.
- if (sType != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- sType = x ? uint32_t(ShiftOp::kUXTX) : uint32_t(ShiftOp::kUXTW);
- }
-
- // Extend operation - UXTB, UXTH, UXTW, UXTX, SXTB, SXTH, SXTW, SXTX.
- sType -= uint32_t(ShiftOp::kUXTB);
- if (sType > 7 || shift > 4)
- goto InvalidImmediate;
-
- opcode.reset(uint32_t(opData.extendedOp) << 21);
- opcode.addImm(x, 31);
- opcode.addReg(o1, 16);
- opcode.addImm(sType, 13);
- opcode.addImm(shift, 10);
- opcode.addReg(o0, 5);
- opcode.addReg(Gp::kIdZr, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseMvnNeg: {
- const InstDB::EncodingData::BaseMvnNeg& opData = InstDB::EncodingData::baseMvnNeg[encodingIndex];
-
- uint32_t x;
- if (!checkGpType(o0, o1, kWX, &x))
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addReg(o1, 16);
- opcode.addReg(o0, 0);
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- uint32_t opSize = x ? 64 : 32;
- uint32_t shiftType = o2.as<Imm>().predicate();
- uint64_t opShift = o2.as<Imm>().valueAs<uint64_t>();
-
- if (shiftType > uint32_t(ShiftOp::kROR) || opShift >= opSize)
- goto InvalidImmediate;
-
- opcode.addImm(shiftType, 22);
- opcode.addImm(opShift, 10);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseTst: {
- const InstDB::EncodingData::BaseTst& opData = InstDB::EncodingData::baseTst[encodingIndex];
-
- uint32_t x;
- if (!checkGpType(o0, kWX, &x))
- goto InvalidInstruction;
-
- uint32_t opSize = x ? 64 : 32;
-
- if (isign4 == ENC_OPS2(Reg, Imm) && opData.immediateOp != 0) {
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- // TST (immediate) uses a LogicalImm format described by N:R:S values.
- uint64_t immMask = Support::lsbMask<uint64_t>(opSize);
- uint64_t immValue = o1.as<Imm>().valueAs<uint64_t>();
-
- // Logical instructions use 13-bit immediate pattern encoded as N:ImmS:ImmR.
- LogicalImm logicalImm;
- if (!Utils::encodeLogicalImm(immValue & immMask, opSize, &logicalImm))
- goto InvalidImmediate;
-
- opcode.reset(uint32_t(opData.immediateOp) << 22);
- opcode.addLogicalImm(logicalImm);
- opcode.addImm(x, 31);
- opcode.addReg(o0, 5);
- opcode.addReg(Gp::kIdZr, 0);
- goto EmitOp;
- }
-
- opcode.reset(uint32_t(opData.shiftedOp) << 21);
- opcode.addImm(x, 31);
- opcode.addReg(o1, 16);
- opcode.addReg(o0, 5);
- opcode.addReg(Gp::kIdZr, 0);
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- uint32_t shiftType = o2.as<Imm>().predicate();
- uint64_t opShift = o2.as<Imm>().valueAs<uint64_t>();
-
- if (shiftType > 0x3 || opShift >= opSize)
- goto InvalidImmediate;
-
- opcode.addImm(shiftType, 22);
- opcode.addImm(opShift, 10);
- goto EmitOp;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Bit Manipulation]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseBfc: {
- const InstDB::EncodingData::BaseBfc& opData = InstDB::EncodingData::baseBfc[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Imm, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0))
- goto InvalidPhysId;
-
- uint64_t lsb = o1.as<Imm>().valueAs<uint64_t>();
- uint64_t width = o2.as<Imm>().valueAs<uint64_t>();
- uint32_t opSize = x ? 64 : 32;
-
- if (lsb >= opSize || width == 0 || width > opSize)
- goto InvalidImmediate;
-
- uint32_t lsb32 = Support::neg(uint32_t(lsb)) & (opSize - 1);
- uint32_t width32 = uint32_t(width) - 1;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addImm(lsb32, 16);
- opcode.addImm(width32, 10);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseBfi: {
- const InstDB::EncodingData::BaseBfi& opData = InstDB::EncodingData::baseBfi[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1))
- goto InvalidPhysId;
-
- uint64_t lsb = o2.as<Imm>().valueAs<uint64_t>();
- uint64_t width = o3.as<Imm>().valueAs<uint64_t>();
- uint32_t opSize = x ? 64 : 32;
-
- if (lsb >= opSize || width == 0 || width > opSize)
- goto InvalidImmediate;
-
- uint32_t lImm = Support::neg(uint32_t(lsb)) & (opSize - 1);
- uint32_t wImm = uint32_t(width) - 1;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addImm(lImm, 16);
- opcode.addImm(wImm, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseBfm: {
- const InstDB::EncodingData::BaseBfm& opData = InstDB::EncodingData::baseBfm[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1))
- goto InvalidPhysId;
-
- uint64_t immR = o2.as<Imm>().valueAs<uint64_t>();
- uint64_t immS = o3.as<Imm>().valueAs<uint64_t>();
- uint32_t opSize = x ? 64 : 32;
-
- if ((immR | immS) >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addImm(immR, 16);
- opcode.addImm(immS, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseBfx: {
- const InstDB::EncodingData::BaseBfx& opData = InstDB::EncodingData::baseBfx[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1))
- goto InvalidPhysId;
-
- uint64_t lsb = o2.as<Imm>().valueAs<uint64_t>();
- uint64_t width = o3.as<Imm>().valueAs<uint64_t>();
- uint32_t opSize = x ? 64 : 32;
-
- if (lsb >= opSize || width == 0 || width > opSize)
- goto InvalidImmediate;
-
- uint32_t lsb32 = uint32_t(lsb);
- uint32_t width32 = lsb32 + uint32_t(width) - 1u;
-
- if (width32 >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addImm(lsb32, 16);
- opcode.addImm(width32, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseExtend: {
- const InstDB::EncodingData::BaseExtend& opData = InstDB::EncodingData::baseExtend[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- uint32_t x;
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!o1.as<Reg>().isGpW())
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseExtract: {
- const InstDB::EncodingData::BaseExtract& opData = InstDB::EncodingData::baseExtract[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, kWX, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1, o2))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, o2))
- goto InvalidPhysId;
-
- uint64_t lsb = o3.as<Imm>().valueAs<uint64_t>();
- uint32_t opSize = x ? 64 : 32;
-
- if (lsb >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addReg(o2, 16);
- opcode.addImm(lsb, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRev: {
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1))
- goto InvalidPhysId;
-
- opcode.reset(0b01011010110000000000100000000000);
- opcode.addImm(x, 31);
- opcode.addImm(x, 10);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseShift: {
- const InstDB::EncodingData::BaseShift& opData = InstDB::EncodingData::baseShift[encodingIndex];
-
- uint32_t x;
- if (!checkGpType(o0, kWX, &x))
- goto InvalidInstruction;
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!checkSignature(o0, o1, o2))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, o2, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.registerOp());
- opcode.addImm(x, 31);
- opcode.addReg(o2, 16);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.immediateOp()) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- uint64_t immR = o2.as<Imm>().valueAs<uint64_t>();
- uint32_t opSize = x ? 64 : 32;
-
- if (immR >= opSize)
- goto InvalidImmediate;
-
- opcode.reset(opData.immediateOp());
- opcode.addImm(x, 31);
- opcode.addImm(x, 22);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
-
- if (opcode.get() & B(10)) {
- // ASR and LSR (immediate) has the same logic.
- opcode.addImm(x, 15);
- opcode.addImm(immR, 16);
- goto EmitOp;
- }
-
- if (opData.ror == 0) {
- // LSL (immediate) is an alias to UBFM
- uint32_t ubfmImmR = Support::neg(uint32_t(immR)) & (opSize - 1);
- uint32_t ubfmImmS = opSize - 1 - uint32_t(immR);
-
- opcode.addImm(ubfmImmR, 16);
- opcode.addImm(ubfmImmS, 10);
- goto EmitOp;
- }
- else {
- // ROR (immediate) is an alias to EXTR.
- opcode.addImm(immR, 10);
- opcode.addReg(o1, 16);
- goto EmitOp;
- }
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Conditionals]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseCCmp: {
- const InstDB::EncodingData::BaseCCmp& opData = InstDB::EncodingData::baseCCmp[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm) || isign4 == ENC_OPS4(Reg, Imm, Imm, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- uint64_t nzcv = o2.as<Imm>().valueAs<uint64_t>();
- uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
-
- if ((nzcv | cond) > 0xFu)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
- opcode.addImm(nzcv, 0);
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- // CCMN|CCMP (register) form.
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o1, kZR))
- goto InvalidPhysId;
-
- opcode.addReg(o1, 16);
- opcode.addReg(o0, 5);
- goto EmitOp;
- }
- else {
- // CCMN|CCMP (immediate) form.
- uint64_t imm5 = o1.as<Imm>().valueAs<uint64_t>();
- if (imm5 > 0x1F)
- goto InvalidImmediate;
-
- opcode.addImm(1, 11);
- opcode.addImm(imm5, 16);
- opcode.addReg(o0, 5);
- goto EmitOp;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseCInc: {
- const InstDB::EncodingData::BaseCInc& opData = InstDB::EncodingData::baseCInc[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, o1, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- uint64_t cond = o2.as<Imm>().valueAs<uint64_t>();
- if (cond - 2u > 0xEu)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addReg(o1, 16);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)) ^ 1u, 12);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseCSel: {
- const InstDB::EncodingData::BaseCSel& opData = InstDB::EncodingData::baseCSel[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, o1, o2, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, o2, kZR))
- goto InvalidPhysId;
-
- uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
- if (cond > 0xFu)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addReg(o2, 16);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
- opcode.addReg(o1, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseCSet: {
- const InstDB::EncodingData::BaseCSet& opData = InstDB::EncodingData::baseCSet[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, InstDB::kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- uint64_t cond = o1.as<Imm>().valueAs<uint64_t>();
- if (cond - 2u >= 0xEu)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)) ^ 1u, 12);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Special]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseAtDcIcTlbi: {
- const InstDB::EncodingData::BaseAtDcIcTlbi& opData = InstDB::EncodingData::baseAtDcIcTlbi[encodingIndex];
-
- if (isign4 == ENC_OPS1(Imm) || isign4 == ENC_OPS2(Imm, Reg)) {
- if (opData.mandatoryReg && isign4 != ENC_OPS2(Imm, Reg))
- goto InvalidInstruction;
-
- if (o0.as<Imm>().valueAs<uint64_t>() > 0x7FFFu)
- goto InvalidImmediate;
-
- uint32_t imm = o0.as<Imm>().valueAs<uint32_t>();
- if ((imm & opData.immVerifyMask) != opData.immVerifyData)
- goto InvalidImmediate;
-
- uint32_t rt = 31;
- if (o1.isReg()) {
- if (!o1.as<Reg>().isGpX())
- goto InvalidInstruction;
-
- if (!checkGpId(o1, kZR))
- goto InvalidPhysId;
-
- rt = o1.id() & 31;
- }
-
- opcode.reset(0b11010101000010000000000000000000);
- opcode.addImm(imm, 5);
- opcode.addReg(rt, 0);
- goto EmitOp;
- }
- break;
- }
-
- case InstDB::kEncodingBaseMrs: {
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- if (!o0.as<Reg>().isGpX())
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- if (o1.as<Imm>().valueAs<uint64_t>() > 0xFFFFu)
- goto InvalidImmediate;
-
- uint32_t imm = o1.as<Imm>().valueAs<uint32_t>();
- if (!(imm & B(15)))
- goto InvalidImmediate;
-
- opcode.reset(0b11010101001100000000000000000000);
- opcode.addImm(imm, 5);
- opcode.addReg(o0, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseMsr: {
- if (isign4 == ENC_OPS2(Imm, Reg)) {
- if (!o1.as<Reg>().isGpX())
- goto InvalidInstruction;
-
- if (o0.as<Imm>().valueAs<uint64_t>() > 0xFFFFu)
- goto InvalidImmediate;
-
- uint32_t imm = o0.as<Imm>().valueAs<uint32_t>();
- if (!(imm & B(15)))
- goto InvalidImmediate;
-
- if (!checkGpId(o1, kZR))
- goto InvalidPhysId;
-
- opcode.reset(0b11010101000100000000000000000000);
- opcode.addImm(imm, 5);
- opcode.addReg(o1, 0);
- goto EmitOp;
- }
-
- if (isign4 == ENC_OPS2(Imm, Imm)) {
- if (o0.as<Imm>().valueAs<uint64_t>() > 0x1Fu)
- goto InvalidImmediate;
-
- if (o1.as<Imm>().valueAs<uint64_t>() > 0xFu)
- goto InvalidImmediate;
-
- uint32_t op = o0.as<Imm>().valueAs<uint32_t>();
- uint32_t cRm = o1.as<Imm>().valueAs<uint32_t>();
-
- uint32_t op1 = uint32_t(op) >> 3;
- uint32_t op2 = uint32_t(op) & 0x7u;
-
- opcode.reset(0b11010101000000000100000000011111);
- opcode.addImm(op1, 16);
- opcode.addImm(cRm, 8);
- opcode.addImm(op2, 5);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseSys: {
- if (isign4 == ENC_OPS4(Imm, Imm, Imm, Imm)) {
- if (o0.as<Imm>().valueAs<uint64_t>() > 0x7u ||
- o1.as<Imm>().valueAs<uint64_t>() > 0xFu ||
- o2.as<Imm>().valueAs<uint64_t>() > 0xFu ||
- o3.as<Imm>().valueAs<uint64_t>() > 0x7u)
- goto InvalidImmediate;
-
- uint32_t op1 = o0.as<Imm>().valueAs<uint32_t>();
- uint32_t cRn = o1.as<Imm>().valueAs<uint32_t>();
- uint32_t cRm = o2.as<Imm>().valueAs<uint32_t>();
- uint32_t op2 = o3.as<Imm>().valueAs<uint32_t>();
- uint32_t rt = 31;
-
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
- if (o4.isReg()) {
- if (!o4.as<Reg>().isGpX())
- goto InvalidInstruction;
-
- if (!checkGpId(o4, kZR))
- goto InvalidPhysId;
-
- rt = o4.id() & 31;
- }
- else if (!o4.isNone()) {
- goto InvalidInstruction;
- }
-
- opcode.reset(0b11010101000010000000000000000000);
- opcode.addImm(op1, 16);
- opcode.addImm(cRn, 12);
- opcode.addImm(cRm, 8);
- opcode.addImm(op2, 5);
- opcode.addImm(rt, 0);
- goto EmitOp;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Branch]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseBranchReg: {
- const InstDB::EncodingData::BaseBranchReg& opData = InstDB::EncodingData::baseBranchReg[encodingIndex];
-
- if (isign4 == ENC_OPS1(Reg)) {
- if (!o0.as<Reg>().isGpX())
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode);
- opcode.addReg(o0, 5);
- goto EmitOp;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseBranchRel: {
- const InstDB::EncodingData::BaseBranchRel& opData = InstDB::EncodingData::baseBranchRel[encodingIndex];
-
- if (isign4 == ENC_OPS1(Label) || isign4 == ENC_OPS1(Imm)) {
- opcode.reset(opData.opcode);
- rmRel = &o0;
-
- if (instCC != CondCode::kAL) {
- opcode |= B(30);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(instCC)), 0);
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
- goto EmitOp_Rel;
- }
-
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 0, 26, 2);
- goto EmitOp_Rel;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseBranchCmp: {
- const InstDB::EncodingData::BaseBranchCmp& opData = InstDB::EncodingData::baseBranchCmp[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Label) || isign4 == ENC_OPS2(Reg, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode);
- opcode.addImm(x, 31);
- opcode.addReg(o0, 0);
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
-
- rmRel = &o1;
- goto EmitOp_Rel;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseBranchTst: {
- const InstDB::EncodingData::BaseBranchTst& opData = InstDB::EncodingData::baseBranchTst[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Imm, Label) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
- uint32_t x;
- if (!checkGpType(o0, kWX, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- uint64_t imm = o1.as<Imm>().valueAs<uint64_t>();
-
- opcode.reset(opData.opcode);
- if (imm >= 32) {
- if (!x)
- goto InvalidImmediate;
- opcode.addImm(x, 31);
- imm &= 0x1F;
- }
-
- opcode.addReg(o0, 0);
- opcode.addImm(imm, 19);
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 14, 2);
-
- rmRel = &o2;
- goto EmitOp_Rel;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Prefetch]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBasePrfm: {
- const InstDB::EncodingData::BasePrfm& opData = InstDB::EncodingData::basePrfm[encodingIndex];
-
- if (isign4 == ENC_OPS2(Imm, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- uint32_t immShift = 3u;
-
- if (o0.as<Imm>().valueAs<uint64_t>() > 0x1Fu)
- goto InvalidImmediate;
-
- if (!armCheckMemBaseIndexRel(m))
- goto InvalidAddress;
-
- int64_t offset = m.offset();
- uint32_t prfop = o0.as<Imm>().valueAs<uint32_t>();
-
- if (m.hasBaseReg()) {
- // [Base {Offset | Index}]
- if (m.hasIndex()) {
- uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())];
- if (opt == 0xFF)
- goto InvalidAddress;
-
- uint32_t shift = m.shift();
- uint32_t s = shift != 0;
-
- if (s && shift != immShift)
- goto InvalidAddressScale;
-
- opcode.reset(uint32_t(opData.registerOp) << 21);
- opcode.addImm(opt, 13);
- opcode.addImm(s, 12);
- opcode |= B(11);
- opcode.addImm(prfop, 0);
- goto EmitOp_MemBaseIndex_Rn5_Rm16;
- }
-
- if (!Support::isInt32(offset))
- goto InvalidDisplacement;
-
- int32_t offset32 = int32_t(offset);
-
- if (m.isPreOrPost())
- goto InvalidAddress;
-
- uint32_t imm12 = uint32_t(offset32) >> immShift;
-
- if (Support::isUInt12(imm12) && (imm12 << immShift) == uint32_t(offset32)) {
- opcode.reset(uint32_t(opData.sOffsetOp) << 22);
- opcode.addImm(imm12, 10);
- opcode.addImm(prfop, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- if (Support::isInt9(offset32)) {
- opcode.reset(uint32_t(opData.uOffsetOp) << 21);
- opcode.addImm(uint32_t(offset32) & 0x1FFu, 12);
- opcode.addImm(prfop, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- goto InvalidAddress;
- }
- else {
- opcode.reset(uint32_t(opData.literalOp) << 24);
- opcode.addImm(prfop, 0);
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
- goto EmitOp_Rel;
- }
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Base - Load / Store]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingBaseLdSt: {
- const InstDB::EncodingData::BaseLdSt& opData = InstDB::EncodingData::baseLdSt[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- uint32_t x;
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- // Instructions that work with either word or dword have the unsigned
- // offset shift set to 2 (word), so we set it to 3 (dword) if this is
- // X version of the instruction.
- uint32_t xShiftMask = uint32_t(opData.uOffsetShift == 2);
- uint32_t immShift = uint32_t(opData.uOffsetShift) + (x & xShiftMask);
-
- if (!armCheckMemBaseIndexRel(m))
- goto InvalidAddress;
-
- int64_t offset = m.offset();
- if (m.hasBaseReg()) {
- // [Base {Offset | Index}]
- if (m.hasIndex()) {
- uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())];
- if (opt == 0xFF)
- goto InvalidAddress;
-
- uint32_t shift = m.shift();
- uint32_t s = shift != 0;
-
- if (s && shift != immShift)
- goto InvalidAddressScale;
-
- opcode.reset(uint32_t(opData.registerOp) << 21);
- opcode.xorImm(x, opData.xOffset);
- opcode.addImm(opt, 13);
- opcode.addImm(s, 12);
- opcode |= B(11);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBaseIndex_Rn5_Rm16;
- }
-
- // Makes it easier to work with the offset especially on 32-bit arch.
- if (!Support::isInt32(offset))
- goto InvalidDisplacement;
- int32_t offset32 = int32_t(offset);
-
- if (m.isPreOrPost()) {
- if (!Support::isInt9(offset32))
- goto InvalidDisplacement;
-
- opcode.reset(uint32_t(opData.prePostOp) << 21);
- opcode.xorImm(x, opData.xOffset);
- opcode.addImm(offset32 & 0x1FF, 12);
- opcode.addImm(m.isPreIndex(), 11);
- opcode |= B(10);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
- else {
- uint32_t imm12 = uint32_t(offset32) >> immShift;
-
- // Alternative form of LDUR/STUR and related instructions as described by AArch64 reference manual:
- //
- // If this instruction is not encodable with scaled unsigned offset, try unscaled signed offset.
- if (!Support::isUInt12(imm12) || (imm12 << immShift) != uint32_t(offset32)) {
- instId = opData.uAltInstId;
- instInfo = &InstDB::_instInfoTable[instId];
- encodingIndex = instInfo->_encodingDataIndex;
- goto Case_BaseLdurStur;
- }
-
- opcode.reset(uint32_t(opData.uOffsetOp) << 22);
- opcode.xorImm(x, opData.xOffset);
- opcode.addImm(imm12, 10);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
- }
- else {
- if (!opData.literalOp)
- goto InvalidAddress;
-
- opcode.reset(uint32_t(opData.literalOp) << 24);
- opcode.xorImm(x, opData.xOffset);
- opcode.addReg(o0, 0);
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
- goto EmitOp_Rel;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseLdpStp: {
- const InstDB::EncodingData::BaseLdpStp& opData = InstDB::EncodingData::baseLdpStp[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
- const Mem& m = o2.as<Mem>();
- rmRel = &m;
-
- uint32_t x;
- if (!checkGpType(o0, o1, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- if (m.baseType() != RegType::kARM_GpX || m.hasIndex())
- goto InvalidAddress;
-
- if (m.isOffset64Bit())
- goto InvalidDisplacement;
-
- uint32_t offsetShift = opData.offsetShift + x;
- int32_t offset32 = m.offsetLo32() >> offsetShift;
-
- // Make sure we didn't lose bits by applying the mandatory offset shift.
- if (uint32_t(offset32) << offsetShift != uint32_t(m.offsetLo32()))
- goto InvalidDisplacement;
-
- // Offset is encoded as 7-bit immediate.
- if (!Support::isInt7(offset32))
- goto InvalidDisplacement;
-
- if (m.isPreOrPost() && offset32 != 0) {
- if (!opData.prePostOp)
- goto InvalidAddress;
-
- opcode.reset(uint32_t(opData.prePostOp) << 22);
- opcode.addImm(m.isPreIndex(), 24);
- }
- else {
- opcode.reset(uint32_t(opData.offsetOp) << 22);
- }
-
- opcode.addImm(x, opData.xOffset);
- opcode.addImm(offset32 & 0x7F, 15);
- opcode.addReg(o1, 10);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseStx: {
- const InstDB::EncodingData::BaseStx& opData = InstDB::EncodingData::baseStx[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
- const Mem& m = o2.as<Mem>();
- uint32_t x;
-
- if (!o0.as<Reg>().isGpW() || !checkGpType(o1, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o0, 16);
- opcode.addReg(o1, 0);
-
- rmRel = &m;
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseLdxp: {
- const InstDB::EncodingData::BaseLdxp& opData = InstDB::EncodingData::baseLdxp[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
- const Mem& m = o2.as<Mem>();
- uint32_t x;
-
- if (!checkGpType(o0, opData.rType, &x) || !checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o1, 10);
- opcode.addReg(o0, 0);
-
- rmRel = &m;
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseStxp: {
- const InstDB::EncodingData::BaseStxp& opData = InstDB::EncodingData::baseStxp[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
- const Mem& m = o3.as<Mem>();
- uint32_t x;
-
- if (!o0.as<Reg>().isGpW() || !checkGpType(o1, opData.rType, &x) || !checkSignature(o1, o2))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, o2, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o0, 16);
- opcode.addReg(o2, 10);
- opcode.addReg(o1, 0);
-
- rmRel = &m;
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRM_NoImm: {
- const InstDB::EncodingData::BaseRM_NoImm& opData = InstDB::EncodingData::baseRM_NoImm[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- uint32_t x;
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.rHiId))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRM_SImm9: {
-Case_BaseLdurStur:
- const InstDB::EncodingData::BaseRM_SImm9& opData = InstDB::EncodingData::baseRM_SImm9[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- uint32_t x;
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.rHiId))
- goto InvalidPhysId;
-
- if (m.hasBaseReg() && !m.hasIndex()) {
- if (m.isOffset64Bit())
- goto InvalidDisplacement;
-
- int32_t offset32 = m.offsetLo32() >> opData.immShift;
- if (Support::shl(offset32, opData.immShift) != m.offsetLo32())
- goto InvalidDisplacement;
-
- if (!Support::isInt9(offset32))
- goto InvalidDisplacement;
-
- if (m.isFixedOffset()) {
- opcode.reset(opData.offsetOp());
- }
- else {
- if (!opData.prePostOp())
- goto InvalidInstruction;
-
- opcode.reset(opData.prePostOp());
- opcode.xorImm(m.isPreIndex(), 11);
- }
-
- opcode.xorImm(x, opData.xOffset);
- opcode.addImm(offset32 & 0x1FF, 12);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- goto InvalidAddress;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseRM_SImm10: {
- const InstDB::EncodingData::BaseRM_SImm10& opData = InstDB::EncodingData::baseRM_SImm10[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- uint32_t x;
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, opData.rHiId))
- goto InvalidPhysId;
-
- if (m.hasBaseReg() && !m.hasIndex()) {
- if (m.isOffset64Bit())
- goto InvalidDisplacement;
-
- int32_t offset32 = m.offsetLo32() >> opData.immShift;
- if (Support::shl(offset32, opData.immShift) != m.offsetLo32())
- goto InvalidDisplacement;
-
- if (!Support::isInt10(offset32))
- goto InvalidDisplacement;
-
- if (m.isPostIndex())
- goto InvalidAddress;
-
- // Offset has 10 bits, sign is stored in the 10th bit.
- offset32 &= 0x3FF;
-
- opcode.reset(opData.opcode());
- opcode.xorImm(m.isPreIndex(), 11);
- opcode.xorImm(x, opData.xOffset);
- opcode.addImm(offset32 >> 9, 22);
- opcode.addImm(offset32, 12);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- goto InvalidAddress;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseAtomicOp: {
- const InstDB::EncodingData::BaseAtomicOp& opData = InstDB::EncodingData::baseAtomicOp[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
- const Mem& m = o2.as<Mem>();
- uint32_t x;
-
- if (!checkGpType(o0, opData.rType, &x) || !checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, o1, kZR))
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o0, 16);
- opcode.addReg(o1, 0);
-
- rmRel = &m;
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseAtomicSt: {
- const InstDB::EncodingData::BaseAtomicSt& opData = InstDB::EncodingData::baseAtomicSt[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- uint32_t x;
-
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkGpId(o0, kZR))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o0, 16);
- opcode.addReg(Gp::kIdZr, 0);
-
- rmRel = &m;
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingBaseAtomicCasp: {
- const InstDB::EncodingData::BaseAtomicCasp& opData = InstDB::EncodingData::baseAtomicCasp[encodingIndex];
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg) && o4.isMem()) {
- const Mem& m = o4.as<Mem>();
- uint32_t x;
-
- if (!checkGpType(o0, opData.rType, &x))
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1, o2, o3))
- goto InvalidInstruction;
-
- if (!checkEven(o0, o2) || !checkGpId(o0, o2, kZR))
- goto InvalidPhysId;
-
- if (!checkConsecutive(o0, o1) || !checkConsecutive(o2, o3))
- goto InvalidPhysId;
-
- opcode.reset(opData.opcode());
- opcode.addImm(x, opData.xOffset);
- opcode.addReg(o0, 16);
- opcode.addReg(o2, 0);
-
- rmRel = &m;
- goto EmitOp_MemBaseNoImm_Rn5;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [FSimd - Instructions]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingFSimdSV: {
- const InstDB::EncodingData::FSimdSV& opData = InstDB::EncodingData::fSimdSV[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- uint32_t q = diff(o1.as<Reg>().type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- if (o0.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- // This operation is only defined for:
- // hD, vS.{4|8}h (16-bit)
- // sD, vS.4s (32-bit)
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- uint32_t elementSz = diff(o1.as<Vec>().elementType(), VecElementType::kH);
-
- // Size greater than 1 means 64-bit elements, not supported.
- if ((sz | elementSz) > 1 || sz != elementSz)
- goto InvalidInstruction;
-
- // Size 1 (32-bit float) requires at least 4 elements.
- if (sz && !q)
- goto InvalidInstruction;
-
- // Bit flipping according to sz.
- static const uint32_t szBits[] = { B(29), 0 };
-
- opcode.reset(opData.opcode << 10);
- opcode ^= szBits[sz];
- opcode.addImm(q, 30);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingFSimdVV: {
- const InstDB::EncodingData::FSimdVV& opData = InstDB::EncodingData::fSimdVV[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingFSimdVVV: {
- const InstDB::EncodingData::FSimdVVV& opData = InstDB::EncodingData::fSimdVVV[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingFSimdVVVe: {
- const InstDB::EncodingData::FSimdVVVe& opData = InstDB::EncodingData::fSimdVVVe[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!o2.as<Vec>().hasElementIndex()) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- else {
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- uint32_t q = o1.as<Reg>().isVecQ();
- uint32_t sz;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.elementScalarOp(), InstDB::kHF_D, opData.elementVectorOp(), InstDB::kHF_D, &opcode, &sz))
- goto InvalidInstruction;
-
- if (sz == 0 && o2.as<Reg>().id() > 15)
- goto InvalidPhysId;
-
- uint32_t elementIndex = o2.as<Vec>().elementIndex();
- if (elementIndex > (7u >> sz))
- goto InvalidElementIndex;
-
- uint32_t hlm = elementIndex << sz;
- opcode.addImm(q, 30);
- opcode.addImm(hlm & 3u, 20);
- opcode.addImm(hlm >> 2, 11);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingFSimdVVVV: {
- const InstDB::EncodingData::FSimdVVVV& opData = InstDB::EncodingData::fSimdVVVV[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- if (!matchSignature(o0, o1, o2, o3, instFlags))
- goto InvalidInstruction;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.scalarOp(), opData.scalarHf(), opData.vectorOp(), opData.vectorHf(), &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5_Rm16_Ra10;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcadd: {
- const InstDB::EncodingData::SimdFcadd& opData = InstDB::EncodingData::simdFcadd[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- if (!checkSignature(o0, o1, o2) || o0.as<Vec>().hasElementIndex())
- goto InvalidInstruction;
-
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kB);
- if (sz == 0 || sz > 3)
- goto InvalidInstruction;
-
- // 0 <- 90deg.
- // 1 <- 270deg.
- uint32_t rot = 0;
- if (o3.as<Imm>().value() == 270)
- rot = 1;
- else if (o3.as<Imm>().value() != 90)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode());
- opcode.addImm(q, 30);
- opcode.addImm(sz, 22);
- opcode.addImm(rot, 12);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFccmpFccmpe: {
- const InstDB::EncodingData::SimdFccmpFccmpe& opData = InstDB::EncodingData::simdFccmpFccmpe[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- if (sz > 2)
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1) || o0.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- uint64_t nzcv = o2.as<Imm>().valueAs<uint64_t>();
- uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
-
- if ((nzcv | cond) > 0xFu)
- goto InvalidImmediate;
-
- uint32_t type = (sz - 1) & 0x3u;
-
- opcode.reset(opData.opcode());
- opcode.addImm(type, 22);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
- opcode.addImm(nzcv, 0);
-
- goto EmitOp_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcm: {
- const InstDB::EncodingData::SimdFcm& opData = InstDB::EncodingData::simdFcm[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg) && opData.hasRegisterOp()) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.registerScalarOp(), opData.registerScalarHf(), opData.registerVectorOp(), opData.registerVectorHf(), &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.hasZeroOp()) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (o2.as<Imm>().value() != 0 || o2.as<Imm>().predicate() != 0)
- goto InvalidImmediate;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.zeroScalarOp(), InstDB::kHF_B, opData.zeroVectorOp(), InstDB::kHF_B, &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcmla: {
- const InstDB::EncodingData::SimdFcmla& opData = InstDB::EncodingData::simdFcmla[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kB);
- if (sz == 0 || sz > 3)
- goto InvalidInstruction;
-
- uint32_t rot = 0;
- switch (o3.as<Imm>().value()) {
- case 0 : rot = 0; break;
- case 90 : rot = 1; break;
- case 180: rot = 2; break;
- case 270: rot = 3; break;
- default:
- goto InvalidImmediate;
- }
-
- if (!o2.as<Vec>().hasElementIndex()) {
- if (!checkSignature(o1, o2))
- goto InvalidInstruction;
-
- opcode.reset(opData.regularOp());
- opcode.addImm(q, 30);
- opcode.addImm(sz, 22);
- opcode.addImm(rot, 11);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- else {
- if (o0.as<Vec>().elementType() != o2.as<Vec>().elementType())
- goto InvalidInstruction;
-
- // Only allowed vectors are: 4H, 8H, and 4S.
- if (!(sz == 1 || (q == 1 && sz == 2)))
- goto InvalidInstruction;
-
- // Element index ranges:
- // 4H - ElementIndex[0..1] (index 2..3 is UNDEFINED).
- // 8H - ElementIndex[0..3].
- // 4S - ElementIndex[0..1].
- uint32_t elementIndex = o2.as<Vec>().elementIndex();
- uint32_t hlFieldShift = sz == 1 ? 0u : 1u;
- uint32_t maxElementIndex = q == 1 && sz == 1 ? 3u : 1u;
-
- if (elementIndex > maxElementIndex)
- goto InvalidElementIndex;
-
- uint32_t hl = elementIndex << hlFieldShift;
-
- opcode.reset(opData.elementOp());
- opcode.addImm(q, 30);
- opcode.addImm(sz, 22);
- opcode.addImm(hl & 1u, 21); // L field.
- opcode.addImm(hl >> 1, 11); // H field.
- opcode.addImm(rot, 13);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcmpFcmpe: {
- const InstDB::EncodingData::SimdFcmpFcmpe& opData = InstDB::EncodingData::simdFcmpFcmpe[encodingIndex];
-
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- uint32_t type = (sz - 1) & 0x3u;
-
- if (sz > 2)
- goto InvalidInstruction;
-
- if (o0.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- opcode.addImm(type, 22);
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- goto EmitOp_Rn5_Rm16;
- }
-
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- if (o1.as<Imm>().value() != 0 || o1.as<Imm>().predicate() != 0)
- goto InvalidInstruction;
-
- opcode |= B(3);
- goto EmitOp_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcsel: {
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- if (!checkSignature(o0, o1, o2))
- goto InvalidInstruction;
-
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- uint32_t type = (sz - 1) & 0x3u;
-
- if (sz > 2 || o0.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- uint64_t cond = o3.as<Imm>().valueAs<uint64_t>();
- if (cond > 0xFu)
- goto InvalidImmediate;
-
- opcode.reset(0b00011110001000000000110000000000);
- opcode.addImm(type, 22);
- opcode.addImm(condCodeToOpcodeCond(uint32_t(cond)), 12);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcvt: {
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- uint32_t dstSz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- uint32_t srcSz = diff(o1.as<Reg>().type(), RegType::kARM_VecH);
-
- if ((dstSz | srcSz) > 3)
- goto InvalidInstruction;
-
- if (o0.as<Vec>().hasElementType() || o1.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- // Table that provides 'type' and 'opc' according to the dst/src combination.
- static const uint8_t table[] = {
- 0xFFu, // H <- H (Invalid).
- 0x03u, // H <- S (type=00 opc=11).
- 0x13u, // H <- D (type=01 opc=11).
- 0xFFu, // H <- Q (Invalid).
- 0x30u, // S <- H (type=11 opc=00).
- 0xFFu, // S <- S (Invalid).
- 0x10u, // S <- D (type=01 opc=00).
- 0xFFu, // S <- Q (Invalid).
- 0x31u, // D <- H (type=11 opc=01).
- 0x01u, // D <- S (type=00 opc=01).
- 0xFFu, // D <- D (Invalid).
- 0xFFu, // D <- Q (Invalid).
- 0xFFu, // Q <- H (Invalid).
- 0xFFu, // Q <- S (Invalid).
- 0xFFu, // Q <- D (Invalid).
- 0xFFu // Q <- Q (Invalid).
- };
-
- uint32_t typeOpc = table[(dstSz << 2) | srcSz];
- opcode.reset(0b0001111000100010010000 << 10);
- opcode.addImm(typeOpc >> 4, 22);
- opcode.addImm(typeOpc & 15, 15);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcvtLN: {
- const InstDB::EncodingData::SimdFcvtLN& opData = InstDB::EncodingData::simdFcvtLN[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- // Scalar form - only FCVTXN.
- if (o0.as<Vec>().isVecS() && o1.as<Vec>().isVecD()) {
- if (!opData.hasScalar())
- goto InvalidInstruction;
-
- if (o0.as<Vec>().hasElementType() || o1.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- opcode.reset(opData.scalarOp());
- opcode |= B(22); // sz bit must be 1, the only supported combination of FCVTXN.
- goto EmitOp_Rd0_Rn5;
- }
-
- opcode.reset(opData.vectorOp());
-
- const Vec& rL = (instFlags & InstDB::kInstFlagLong) ? o0.as<Vec>() : o1.as<Vec>();
- const Vec& rN = (instFlags & InstDB::kInstFlagLong) ? o1.as<Vec>() : o0.as<Vec>();
-
- uint32_t q = diff(rN.type(), RegType::kARM_VecD);
- if (uint32_t(opcode.hasQ()) != q)
- goto InvalidInstruction;
-
- if (rL.isVecS4() && rN.elementType() == VecElementType::kH && !opData.isCvtxn()) {
- goto EmitOp_Rd0_Rn5;
- }
-
- if (rL.isVecD2() && rN.elementType() == VecElementType::kS) {
- opcode |= B(22);
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFcvtSV: {
- const InstDB::EncodingData::SimdFcvtSV& opData = InstDB::EncodingData::simdFcvtSV[encodingIndex];
-
- // So we can support both IntToFloat and FloatToInt conversions.
- const Operand_& oGp = opData.isFloatToInt() ? o0 : o1;
- const Operand_& oVec = opData.isFloatToInt() ? o1 : o0;
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (oGp.as<Reg>().isGp() && oVec.as<Reg>().isVec()) {
- uint32_t x = oGp.as<Reg>().isGpX();
- uint32_t type = diff(oVec.as<Reg>().type(), RegType::kARM_VecH);
-
- if (type > 2u)
- goto InvalidInstruction;
-
- type = (type - 1u) & 0x3;
- opcode.reset(opData.generalOp());
- opcode.addImm(type, 22);
- opcode.addImm(x, 31);
- goto EmitOp_Rd0_Rn5;
- }
-
- if (o0.as<Reg>().isVec() && o1.as<Reg>().isVec()) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!pickFpOpcode(o0.as<Vec>(), opData.scalarIntOp(), InstDB::kHF_B, opData.vectorIntOp(), InstDB::kHF_B, &opcode))
- goto InvalidInstruction;
-
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.isFixedPoint()) {
- if (o2.as<Imm>().valueAs<uint64_t>() >= 64)
- goto InvalidInstruction;
-
- uint32_t scale = o2.as<Imm>().valueAs<uint32_t>();
- if (scale == 0)
- goto InvalidInstruction;
-
- if (oGp.as<Reg>().isGp() && oVec.as<Reg>().isVec()) {
- uint32_t x = oGp.as<Reg>().isGpX();
- uint32_t type = diff(oVec.as<Reg>().type(), RegType::kARM_VecH);
-
- uint32_t scaleLimit = 32u << x;
- if (scale > scaleLimit)
- goto InvalidInstruction;
-
- type = (type - 1u) & 0x3;
- opcode.reset(opData.generalOp() ^ B(21));
- opcode.addImm(type, 22);
- opcode.addImm(x, 31);
- opcode.addImm(64u - scale, 10);
- goto EmitOp_Rd0_Rn5;
- }
-
- if (o0.as<Reg>().isVec() && o1.as<Reg>().isVec()) {
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- uint32_t sz;
- if (!pickFpOpcode(o0.as<Vec>(), opData.scalarFpOp(), InstDB::kHF_0, opData.vectorFpOp(), InstDB::kHF_0, &opcode, &sz))
- goto InvalidInstruction;
-
- uint32_t scaleLimit = 16u << sz;
- if (scale > scaleLimit)
- goto InvalidInstruction;
-
- uint32_t imm = Support::neg(scale) & Support::lsbMask<uint32_t>(sz + 4 + 1);
- opcode.addImm(imm, 16);
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFmlal: {
- const InstDB::EncodingData::SimdFmlal& opData = InstDB::EncodingData::simdFmlal[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- uint32_t qIsOptional = opData.optionalQ();
-
- if (qIsOptional) {
- // This instruction works with either 64-bit or 128-bit registers,
- // encoded by Q bit.
- if (q > 1)
- goto InvalidInstruction;
- }
- else {
- // This instruction requires 128-bit vector registers.
- if (q != 1)
- goto InvalidInstruction;
-
- // The instruction is ehtier B (bottom) or T (top), which is part of
- // the opcode, which uses Q bit, so we have to clear it explicitly.
- q = 0;
- }
-
- if (uint32_t(o0.as<Reg>().type()) != uint32_t(o1.as<Reg>().type()) + qIsOptional ||
- uint32_t(o0.as<Vec>().elementType()) != opData.tA ||
- uint32_t(o1.as<Vec>().elementType()) != opData.tB)
- goto InvalidInstruction;
-
- if (!o2.as<Vec>().hasElementIndex()) {
- if (!checkSignature(o1, o2))
- goto InvalidInstruction;
-
- opcode.reset(opData.vectorOp());
- opcode.addImm(q, 30);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- else {
- if (uint32_t(o2.as<Vec>().elementType()) != opData.tElement)
- goto InvalidInstruction;
-
- if (o2.as<Reg>().id() > 15)
- goto InvalidPhysId;
-
- uint32_t elementIndex = o2.as<Vec>().elementIndex();
- if (elementIndex > 7u)
- goto InvalidElementIndex;
-
- opcode.reset(opData.elementOp());
- opcode.addImm(q, 30);
- opcode.addImm(elementIndex & 3u, 20);
- opcode.addImm(elementIndex >> 2, 11);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdFmov: {
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- // FMOV Gp <-> Vec opcode:
- opcode.reset(0b00011110001001100000000000000000);
-
- if (o0.as<Reg>().isGp() && o1.as<Reg>().isVec()) {
- // FMOV Wd, Hn (sf=0 type=11 rmode=00 op=110)
- // FMOV Xd, Hn (sf=1 type=11 rmode=00 op=110)
- // FMOV Wd, Sn (sf=0 type=00 rmode=00 op=110)
- // FMOV Xd, Dn (sf=1 type=11 rmode=00 op=110)
- // FMOV Xd, Vn.d[1] (sf=1 type=10 rmode=01 op=110)
- uint32_t x = o0.as<Reg>().isGpX();
- uint32_t sz = diff(o1.as<Reg>().type(), RegType::kARM_VecH);
-
- uint32_t type = (sz - 1) & 0x3u;
- uint32_t rModeOp = 0b00110;
-
- if (o1.as<Vec>().hasElementIndex()) {
- // Special case.
- if (!x || !o1.as<Vec>().isVecD2() || o1.as<Vec>().elementIndex() != 1)
- goto InvalidInstruction;
- type = 0b10;
- rModeOp = 0b01110;
- }
- else {
- // Must be scalar.
- if (sz > 2)
- goto InvalidInstruction;
-
- if (o1.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- if (o1.as<Vec>().isVecS() && x)
- goto InvalidInstruction;
-
- if (o1.as<Vec>().isVecD() && !x)
- goto InvalidInstruction;
- }
-
- opcode.addImm(x, 31);
- opcode.addImm(type, 22);
- opcode.addImm(rModeOp, 16);
- goto EmitOp_Rd0_Rn5;
- }
-
- if (o0.as<Reg>().isVec() && o1.as<Reg>().isGp()) {
- // FMOV Hd, Wn (sf=0 type=11 rmode=00 op=111)
- // FMOV Hd, Xn (sf=1 type=11 rmode=00 op=111)
- // FMOV Sd, Wn (sf=0 type=00 rmode=00 op=111)
- // FMOV Dd, Xn (sf=1 type=11 rmode=00 op=111)
- // FMOV Vd.d[1], Xn (sf=1 type=10 rmode=01 op=111)
- uint32_t x = o1.as<Reg>().isGpX();
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
-
- uint32_t type = (sz - 1) & 0x3u;
- uint32_t rModeOp = 0b00111;
-
- if (o0.as<Vec>().hasElementIndex()) {
- // Special case.
- if (!x || !o0.as<Vec>().isVecD2() || o0.as<Vec>().elementIndex() != 1)
- goto InvalidInstruction;
- type = 0b10;
- rModeOp = 0b01111;
- }
- else {
- // Must be scalar.
- if (sz > 2)
- goto InvalidInstruction;
-
- if (o0.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- if (o0.as<Vec>().isVecS() && x)
- goto InvalidInstruction;
-
- if (o0.as<Vec>().isVecD() && !x)
- goto InvalidInstruction;
- }
-
- opcode.addImm(x, 31);
- opcode.addImm(type, 22);
- opcode.addImm(rModeOp, 16);
- goto EmitOp_Rd0_Rn5;
- }
-
- if (checkSignature(o0, o1)) {
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- if (sz > 2)
- goto InvalidInstruction;
-
- if (o0.as<Vec>().hasElementType())
- goto InvalidInstruction;
-
- uint32_t type = (sz - 1) & 0x3;
- opcode.reset(0b00011110001000000100000000000000);
- opcode.addImm(type, 22);
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- if (isign4 == ENC_OPS2(Reg, Imm)) {
- if (o0.as<Reg>().isVec()) {
- double fpValue;
- if (o1.as<Imm>().isDouble())
- fpValue = o1.as<Imm>().valueAs<double>();
- else if (o1.as<Imm>().isInt32())
- fpValue = o1.as<Imm>().valueAs<int32_t>();
- else
- goto InvalidImmediate;
-
- if (!Utils::isFP64Imm8(fpValue))
- goto InvalidImmediate;
-
- uint32_t imm8 = Utils::encodeFP64ToImm8(fpValue);
- if (!o0.as<Vec>().hasElementType()) {
- // FMOV (scalar, immediate).
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- uint32_t type = (sz - 1u) & 0x3u;
-
- if (sz > 2)
- goto InvalidInstruction;
-
- opcode.reset(0b00011110001000000001000000000000);
- opcode.addImm(type, 22);
- opcode.addImm(imm8, 13);
- goto EmitOp_Rd0;
- }
- else {
- uint32_t q = diff(o0.as<Vec>().type(), RegType::kARM_VecD);
- uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kH);
-
- if (q > 1 || sz > 2)
- goto InvalidInstruction;
-
- static const uint32_t szBits[3] = { B(11), B(0), B(29) };
- opcode.reset(0b00001111000000001111010000000000);
- opcode ^= szBits[sz];
- opcode.addImm(q, 30);
- opcode.addImm(imm8 >> 5, 16);
- opcode.addImm(imm8 & 31, 5);
- goto EmitOp_Rd0;
- }
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingFSimdPair: {
- const InstDB::EncodingData::FSimdPair& opData = InstDB::EncodingData::fSimdPair[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- // This operation is only defined for:
- // hD, vS.2h (16-bit)
- // sD, vS.2s (32-bit)
- // dD, vS.2d (64-bit)
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecH);
- if (sz > 2)
- goto InvalidInstruction;
-
- static const uint32_t szSignatures[3] = {
- VecS::kSignature | (Vec::kSignatureElementH),
- VecD::kSignature | (Vec::kSignatureElementS),
- VecV::kSignature | (Vec::kSignatureElementD)
- };
-
- if (o1.signature() != szSignatures[sz])
- goto InvalidInstruction;
-
- static const uint32_t szBits[] = { B(29), 0, B(22) };
- opcode.reset(opData.scalarOp());
- opcode ^= szBits[sz];
- goto EmitOp_Rd0_Rn5;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!checkSignature(o0, o1, o2))
- goto InvalidInstruction;
-
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- uint32_t sz = diff(o0.as<Vec>().elementType(), VecElementType::kH);
- if (sz > 2)
- goto InvalidInstruction;
-
- static const uint32_t szBits[3] = { B(22) | B(21) | B(15) | B(14), 0, B(22) };
- opcode.reset(opData.vectorOp());
- opcode ^= szBits[sz];
- opcode.addImm(q, 30);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [ISimd - Instructions]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingISimdSV: {
- const InstDB::EncodingData::ISimdSV& opData = InstDB::EncodingData::iSimdSV[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- // The first destination operand is scalar, which matches element-type of source vectors.
- uint32_t L = (instFlags & InstDB::kInstFlagLong) != 0;
- if (diff(o0.as<Vec>().type(), RegType::kARM_VecB) != diff(o1.as<Vec>().elementType(), VecElementType::kB) + L)
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- opcode.addImm(sizeOp.q(), 30);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVV: {
- const InstDB::EncodingData::ISimdVV& opData = InstDB::EncodingData::iSimdVV[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- const Operand_& sop = significantSimdOp(o0, o1, instFlags);
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVx: {
- const InstDB::EncodingData::ISimdVVx& opData = InstDB::EncodingData::iSimdVVx[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (o0.signature() != opData.op0Signature ||
- o1.signature() != opData.op1Signature)
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVV: {
- const InstDB::EncodingData::ISimdVVV& opData = InstDB::EncodingData::iSimdVVV[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- const Operand_& sop = significantSimdOp(o0, o1, instFlags);
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVVx: {
- const InstDB::EncodingData::ISimdVVVx& opData = InstDB::EncodingData::iSimdVVVx[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (o0.signature() != opData.op0Signature ||
- o1.signature() != opData.op1Signature ||
- o2.signature() != opData.op2Signature)
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdWWV: {
- // Special case for wide add/sub [s|b][add|sub][w]{2}.
- const InstDB::EncodingData::ISimdWWV& opData = InstDB::EncodingData::iSimdWWV[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o2.as<Reg>().type(), o2.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1) || !o0.as<Reg>().isVecV() || uint32_t(o0.as<Vec>().elementType()) != uint32_t(o2.as<Vec>().elementType()) + 1u)
- goto InvalidInstruction;
-
- opcode.reset(opData.opcode());
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVVe: {
- const InstDB::EncodingData::ISimdVVVe& opData = InstDB::EncodingData::iSimdVVVe[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- const Operand_& sop = significantSimdOp(o0, o1, instFlags);
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- if (!o2.as<Vec>().hasElementIndex()) {
- SizeOp sizeOp = armElementTypeToSizeOp(opData.regularVecType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (!checkSignature(o1, o2))
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.regularOp) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- else {
- SizeOp sizeOp = armElementTypeToSizeOp(opData.elementVecType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- uint32_t elementIndex = o2.as<Vec>().elementIndex();
- LMHImm lmh;
-
- if (!encodeLMH(sizeOp.size(), elementIndex, &lmh))
- goto InvalidElementIndex;
-
- if (o2.as<Reg>().id() > lmh.maxRmId)
- goto InvalidPhysId;
-
- opcode.reset(uint32_t(opData.elementOp) << 10);
- opcode.addImm(sizeOp.q(), 30);
- opcode.addImm(sizeOp.size(), 22);
- opcode.addImm(lmh.lm, 20);
- opcode.addImm(lmh.h, 11);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVVI: {
- const InstDB::EncodingData::ISimdVVVI& opData = InstDB::EncodingData::iSimdVVVI[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- const Operand_& sop = significantSimdOp(o0, o1, instFlags);
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- uint64_t immValue = o3.as<Imm>().valueAs<uint64_t>();
- uint32_t immSize = opData.immSize;
-
- if (opData.imm64HasOneBitLess && !sizeOp.q())
- immSize--;
-
- uint32_t immMax = 1u << immSize;
- if (immValue >= immMax)
- goto InvalidImmediate;
-
- opcode.reset(opData.opcode());
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- opcode.addImm(immValue, opData.immShift);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVVV: {
- const InstDB::EncodingData::ISimdVVVV& opData = InstDB::EncodingData::iSimdVVVV[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- const Operand_& sop = significantSimdOp(o0, o1, instFlags);
- if (!matchSignature(o0, o1, o2, o3, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16_Ra10;
- }
-
- break;
- }
-
- case InstDB::kEncodingISimdVVVVx: {
- const InstDB::EncodingData::ISimdVVVVx& opData = InstDB::EncodingData::iSimdVVVVx[encodingIndex];
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- if (o0.signature() != opData.op0Signature ||
- o1.signature() != opData.op1Signature ||
- o2.signature() != opData.op2Signature ||
- o3.signature() != opData.op3Signature)
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- goto EmitOp_Rd0_Rn5_Rm16_Ra10;
- }
-
- break;
- }
-
-
- case InstDB::kEncodingISimdPair: {
- const InstDB::EncodingData::ISimdPair& opData = InstDB::EncodingData::iSimdPair[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg) && opData.opcode2) {
- if (o0.as<Vec>().isVecD1() && o1.as<Vec>().isVecD2()) {
- opcode.reset(uint32_t(opData.opcode2) << 10);
- opcode.addImm(0x3, 22); // size.
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.opType3, o0.as<Reg>().type(), o0.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.opcode3) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdBicOrr: {
- const InstDB::EncodingData::SimdBicOrr& opData = InstDB::EncodingData::simdBicOrr[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(InstDB::kVO_V_B, o0.as<Reg>().type(), o0.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.registerOp) << 10);
- opcode.addImm(sizeOp.q(), 30);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- if (isign4 == ENC_OPS2(Reg, Imm) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
- SizeOp sizeOp = armElementTypeToSizeOp(InstDB::kVO_V_HS, o0.as<Reg>().type(), o0.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (o1.as<Imm>().valueAs<uint64_t>() > 0xFFFFFFFFu)
- goto InvalidImmediate;
-
- uint32_t imm = o1.as<Imm>().valueAs<uint32_t>();
- uint32_t shift = 0;
- uint32_t maxShift = (8u << sizeOp.size()) - 8u;
-
- if (o2.isImm()) {
- if (o2.as<Imm>().predicate() != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- if (imm > 0xFFu || o2.as<Imm>().valueAs<uint64_t>() > maxShift)
- goto InvalidImmediate;
-
- shift = o2.as<Imm>().valueAs<uint32_t>();
- if ((shift & 0x7u) != 0u)
- goto InvalidImmediate;
- }
- else if (imm) {
- shift = Support::ctz(imm) & ~0x7u;
- imm >>= shift;
-
- if (imm > 0xFFu || shift > maxShift)
- goto InvalidImmediate;
- }
-
- uint32_t cmode = 0x1u | ((shift / 8u) << 1);
- if (sizeOp.size() == 1)
- cmode |= B(3);
-
- // The immediate value is split into ABC and DEFGH parts.
- uint32_t abc = (imm >> 5) & 0x7u;
- uint32_t defgh = imm & 0x1Fu;
-
- opcode.reset(uint32_t(opData.immediateOp) << 10);
- opcode.addImm(sizeOp.q(), 30);
- opcode.addImm(abc, 16);
- opcode.addImm(cmode, 12);
- opcode.addImm(defgh, 5);
- goto EmitOp_Rd0;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdCmp: {
- const InstDB::EncodingData::SimdCmp& opData = InstDB::EncodingData::simdCmp[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg) && opData.regOp) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o0.as<Reg>().type(), o0.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.regOp) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.zeroOp) {
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- if (o2.as<Imm>().value() != 0)
- goto InvalidImmediate;
-
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o0.as<Reg>().type(), o0.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.zeroOp) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdDot: {
- const InstDB::EncodingData::SimdDot& opData = InstDB::EncodingData::simdDot[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- uint32_t size = 2;
-
- if (q > 1u)
- goto InvalidInstruction;
-
- if (!o2.as<Vec>().hasElementIndex()) {
- if (!opData.vectorOp)
- goto InvalidInstruction;
-
- if (o0.as<Reg>().type() != o1.as<Reg>().type() || o1.as<Reg>().type() != o2.as<Reg>().type())
- goto InvalidInstruction;
-
- if (uint32_t(o0.as<Vec>().elementType()) != opData.tA ||
- uint32_t(o1.as<Vec>().elementType()) != opData.tB ||
- uint32_t(o2.as<Vec>().elementType()) != opData.tB)
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.vectorOp) << 10);
- opcode.addImm(q, 30);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- else {
- if (!opData.elementOp)
- goto InvalidInstruction;
-
- if (o0.as<Reg>().type() != o1.as<Reg>().type() || !o2.as<Reg>().isVecV())
- goto InvalidInstruction;
-
- if (uint32_t(o0.as<Vec>().elementType()) != opData.tA ||
- uint32_t(o1.as<Vec>().elementType()) != opData.tB ||
- uint32_t(o2.as<Vec>().elementType()) != opData.tElement)
- goto InvalidInstruction;
-
- uint32_t elementIndex = o2.as<Vec>().elementIndex();
- LMHImm lmh;
-
- if (!encodeLMH(size, elementIndex, &lmh))
- goto InvalidElementIndex;
-
- if (o2.as<Reg>().id() > lmh.maxRmId)
- goto InvalidPhysId;
-
- opcode.reset(uint32_t(opData.elementOp) << 10);
- opcode.addImm(q, 30);
- opcode.addImm(lmh.lm, 20);
- opcode.addImm(lmh.h, 11);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdDup: SimdDup: {
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- // Truth table of valid encodings of `Q:1|ElementType:3`
- uint32_t kValidEncodings = B(uint32_t(VecElementType::kB) + 0) |
- B(uint32_t(VecElementType::kH) + 0) |
- B(uint32_t(VecElementType::kS) + 0) |
- B(uint32_t(VecElementType::kB) + 8) |
- B(uint32_t(VecElementType::kH) + 8) |
- B(uint32_t(VecElementType::kS) + 8) |
- B(uint32_t(VecElementType::kD) + 8) ;
-
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
-
- if (o1.as<Reg>().isGp()) {
- // DUP - Vec (scalar|vector) <- GP register.
- //
- // NOTE: This is only scalar for `dup d, x` case, otherwise the value
- // would be duplicated across all vector elements (1, 2, 4, 8, or 16).
- uint32_t elementType = uint32_t(o0.as<Vec>().elementType());
- if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
- goto InvalidInstruction;
-
- uint32_t lsbIndex = elementType - 1u;
- uint32_t imm5 = 1u << lsbIndex;
-
- opcode.reset(0b0000111000000000000011 << 10);
- opcode.addImm(q, 30);
- opcode.addImm(imm5, 16);
- goto EmitOp_Rd0_Rn5;
- }
-
- if (!o1.as<Reg>().isVec() || !o1.as<Vec>().hasElementIndex())
- goto InvalidInstruction;
-
- uint32_t dstIndex = o1.as<Vec>().elementIndex();
- if (!o0.as<Vec>().hasElementType()) {
- // DUP - Vec (scalar) <- Vec[N].
- uint32_t lsbIndex = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
-
- if (lsbIndex != diff(o1.as<Vec>().elementType(), VecElementType::kB) || lsbIndex > 3)
- goto InvalidInstruction;
-
- uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
- if (imm5 > 31)
- goto InvalidElementIndex;
-
- opcode.reset(0b0101111000000000000001 << 10);
- opcode.addImm(imm5, 16);
- goto EmitOp_Rd0_Rn5;
- }
- else {
- // DUP - Vec (all) <- Vec[N].
- uint32_t elementType = uint32_t(o0.as<Vec>().elementType());
- if (q > 1 || !Support::bitTest(kValidEncodings, (q << 3) | elementType))
- goto InvalidInstruction;
-
- uint32_t lsbIndex = elementType - 1u;
- uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
-
- if (imm5 > 31)
- goto InvalidElementIndex;
-
- opcode.reset(0b0000111000000000000001 << 10);
- opcode.addImm(q, 30);
- opcode.addImm(imm5, 16);
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdIns: SimdIns: {
- if (isign4 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().isVecV()) {
- if (!o0.as<Vec>().hasElementIndex())
- goto InvalidInstruction;
-
- uint32_t elementType = uint32_t(o0.as<Vec>().elementType());
- uint32_t dstIndex = o0.as<Vec>().elementIndex();
- uint32_t lsbIndex = elementType - 1u;
-
- uint32_t imm5 = ((dstIndex << 1) | 1u) << lsbIndex;
- if (imm5 > 31)
- goto InvalidElementIndex;
-
- if (o1.as<Reg>().isGp()) {
- // INS - Vec[N] <- GP register.
- opcode.reset(0b0100111000000000000111 << 10);
- opcode.addImm(imm5, 16);
- goto EmitOp_Rd0_Rn5;
- }
- else if (o1.as<Reg>().isVecV() && o1.as<Vec>().hasElementIndex()) {
- // INS - Vec[N] <- Vec[M].
- if (o0.as<Vec>().elementType() != o1.as<Vec>().elementType())
- goto InvalidInstruction;
-
- uint32_t srcIndex = o1.as<Vec>().elementIndex();
- if (o0.as<Reg>().type() != o1.as<Reg>().type())
- goto InvalidInstruction;
-
- uint32_t imm4 = srcIndex << lsbIndex;
- if (imm4 > 15)
- goto InvalidElementIndex;
-
- opcode.reset(0b0110111000000000000001 << 10);
- opcode.addImm(imm5, 16);
- opcode.addImm(imm4, 11);
- goto EmitOp_Rd0_Rn5;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdMov: {
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- if (o0.as<Reg>().isVec() && o1.as<Reg>().isVec()) {
- // INS v.x[index], v.x[index].
- if (o0.as<Vec>().hasElementIndex() && o1.as<Vec>().hasElementIndex())
- goto SimdIns;
-
- // DUP {b|h|s|d}, v.{b|h|s|d}[index].
- if (o1.as<Vec>().hasElementIndex())
- goto SimdDup;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- // ORR Vd, Vn, Vm
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- opcode.reset(0b0000111010100000000111 << 10);
- opcode.addImm(q, 30);
- opcode.addReg(o1, 16); // Vn == Vm.
- goto EmitOp_Rd0_Rn5;
- }
-
- if (o0.as<Reg>().isVec() && o1.as<Reg>().isGp()) {
- // INS v.x[index], Rn.
- if (o0.as<Vec>().hasElementIndex())
- goto SimdIns;
-
- goto InvalidInstruction;
- }
-
- if (o0.as<Reg>().isGp() && o1.as<Reg>().isVec()) {
- // UMOV Rd, V.{s|d}[index].
- encodingIndex = 1;
- goto SimdUmov;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdMoviMvni: {
- const InstDB::EncodingData::SimdMoviMvni& opData = InstDB::EncodingData::simdMoviMvni[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Imm) || isign4 == ENC_OPS3(Reg, Imm, Imm)) {
- SizeOp sizeOp = armElementTypeToSizeOp(InstDB::kVO_V_Any, o0.as<Reg>().type(), o0.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- uint64_t imm64 = o1.as<Imm>().valueAs<uint64_t>();
- uint32_t imm8 = 0;
- uint32_t cmode = 0;
- uint32_t inverted = opData.inverted;
- uint32_t op = 0;
- uint32_t shift = 0;
- uint32_t shiftOp = uint32_t(ShiftOp::kLSL);
-
- if (sizeOp.size() == 3u) {
- // The second immediate should not be present, however, we accept
- // an immediate value of zero as some user code may still pass it.
- if (o2.isImm() && o0.as<Imm>().value() != 0)
- goto InvalidImmediate;
-
- if (Utils::isByteMaskImm8(imm64)) {
- imm8 = Utils::encodeImm64ByteMaskToImm8(imm64);
- }
- else {
- // Change from D to S and from 64-bit imm to 32-bit imm if this
- // is not a byte-mask pattern.
- if ((imm64 >> 32) == (imm64 & 0xFFFFFFFFu)) {
- imm64 &= 0xFFFFFFFFu;
- sizeOp.decrementSize();
- }
- else {
- goto InvalidImmediate;
- }
- }
- }
-
- if (sizeOp.size() < 3u) {
- if (imm64 > 0xFFFFFFFFu)
- goto InvalidImmediate;
- imm8 = uint32_t(imm64);
-
- if (sizeOp.size() == 2) {
- if ((imm8 >> 16) == (imm8 & 0xFFFFu)) {
- imm8 >>= 16;
- sizeOp.decrementSize();
- }
- }
-
- if (sizeOp.size() == 1) {
- if (imm8 > 0xFFFFu)
- goto InvalidImmediate;
-
- if ((imm8 >> 8) == (imm8 & 0xFFu)) {
- imm8 >>= 8;
- sizeOp.decrementSize();
- }
- }
-
- uint32_t maxShift = (8u << sizeOp.size()) - 8u;
- if (o2.isImm()) {
- if (imm8 > 0xFFu || o2.as<Imm>().valueAs<uint64_t>() > maxShift)
- goto InvalidImmediate;
-
- shift = o2.as<Imm>().valueAs<uint32_t>();
- shiftOp = o2.as<Imm>().predicate();
- }
- else if (imm8) {
- shift = Support::ctz(imm8) & ~0x7u;
- imm8 >>= shift;
-
- if (imm8 > 0xFFu || shift > maxShift)
- goto InvalidImmediate;
- }
-
- if ((shift & 0x7u) != 0u)
- goto InvalidImmediate;
- }
-
- shift /= 8u;
-
- switch (sizeOp.size()) {
- case 0:
- if (shiftOp != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- if (inverted) {
- imm8 = ~imm8 & 0xFFu;
- }
-
- cmode = B(3) | B(2) | B(1);
- break;
-
- case 1:
- if (shiftOp != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- cmode = B(3) | (shift << 1);
- op = inverted;
- break;
-
- case 2:
- if (shiftOp == uint32_t(ShiftOp::kLSL)) {
- cmode = shift << 1;
- }
- else if (shiftOp == uint32_t(ShiftOp::kMSL)) {
- if (shift == 0 || shift > 2)
- goto InvalidImmediate;
- cmode = B(3) | B(2) | (shift - 1u);
- }
- else {
- goto InvalidImmediate;
- }
-
- op = inverted;
- break;
-
- case 3:
- if (inverted) {
- imm8 = ~imm8 & 0xFFu;
- }
-
- op = 1;
- cmode = B(3) | B(2) | B(1);
- break;
- }
-
- // The immediate value is split into ABC and DEFGH parts.
- uint32_t abc = (imm8 >> 5) & 0x7u;
- uint32_t defgh = imm8 & 0x1Fu;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(sizeOp.q(), 30);
- opcode.addImm(op, 29);
- opcode.addImm(abc, 16);
- opcode.addImm(cmode, 12);
- opcode.addImm(defgh, 5);
- goto EmitOp_Rd0;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdShift: {
- const InstDB::EncodingData::SimdShift& opData = InstDB::EncodingData::simdShift[encodingIndex];
-
- const Operand_& sop = significantSimdOp(o0, o1, instFlags);
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, sop.as<Reg>().type(), sop.as<Vec>().elementType());
-
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm) && opData.immediateOp) {
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- if (o2.as<Imm>().valueAs<uint64_t>() > 63)
- goto InvalidImmediate;
-
- uint32_t lsbShift = sizeOp.size() + 3u;
- uint32_t lsbMask = (1u << lsbShift) - 1u;
- uint32_t imm = o2.as<Imm>().valueAs<uint32_t>();
-
- // Some instructions use IMM and some X - IMM, so negate if required.
- if (opData.invertedImm) {
- if (imm == 0 || imm > (1u << lsbShift))
- goto InvalidImmediate;
- imm = Support::neg(imm) & lsbMask;
- }
-
- if (imm > lsbMask)
- goto InvalidImmediate;
- imm |= (1u << lsbShift);
-
- opcode.reset(uint32_t(opData.immediateOp) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(imm, 16);
- goto EmitOp_Rd0_Rn5;
- }
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg) && opData.registerOp) {
- if (!matchSignature(o0, o1, o2, instFlags))
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.registerOp) << 10);
- opcode.addImm(sizeOp.qs(), 30);
- opcode.addImm(sizeOp.scalar(), 28);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdShiftES: {
- const InstDB::EncodingData::SimdShiftES& opData = InstDB::EncodingData::simdShiftES[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Imm)) {
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- // The immediate value must match the element size.
- uint64_t shift = o2.as<Imm>().valueAs<uint64_t>();
- uint32_t shiftOp = o2.as<Imm>().predicate();
-
- if (shift != (8u << sizeOp.size()) || shiftOp != uint32_t(ShiftOp::kLSL))
- goto InvalidImmediate;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(sizeOp.q(), 30);
- opcode.addImm(sizeOp.size(), 22);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdSm3tt: {
- const InstDB::EncodingData::SimdSm3tt& opData = InstDB::EncodingData::simdSm3tt[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg)) {
- if (o0.as<Vec>().isVecS4() && o1.as<Vec>().isVecS4() && o2.as<Vec>().isVecS4() && o2.as<Vec>().hasElementIndex()) {
- uint32_t imm2 = o2.as<Vec>().elementIndex();
- if (imm2 > 3)
- goto InvalidElementIndex;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(imm2, 12);
- goto EmitOp_Rd0_Rn5_Rm16;
- }
- }
-
- break;
- }
-
-
- case InstDB::kEncodingSimdSmovUmov: SimdUmov: {
- const InstDB::EncodingData::SimdSmovUmov& opData = InstDB::EncodingData::simdSmovUmov[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg) && o0.as<Reg>().isGp() && o1.as<Reg>().isVec()) {
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (!o1.as<Vec>().hasElementIndex())
- goto InvalidInstruction;
-
- uint32_t x = o0.as<Gp>().isGpX();
- uint32_t gpMustBeX = uint32_t(sizeOp.size() >= 3u - opData.isSigned);
-
- if (opData.isSigned) {
- if (gpMustBeX && !x)
- goto InvalidInstruction;
- }
- else {
- if (x != gpMustBeX)
- goto InvalidInstruction;
- }
-
- uint32_t elementIndex = o1.as<Vec>().elementIndex();
- uint32_t maxElementIndex = 15u >> sizeOp.size();
-
- if (elementIndex > maxElementIndex)
- goto InvalidElementIndex;
-
- uint32_t imm5 = (1u | (elementIndex << 1)) << sizeOp.size();
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(x, 30);
- opcode.addImm(imm5, 16);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdSxtlUxtl: {
- const InstDB::EncodingData::SimdSxtlUxtl& opData = InstDB::EncodingData::simdSxtlUxtl[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Reg)) {
- SizeOp sizeOp = armElementTypeToSizeOp(opData.vecOpType, o1.as<Reg>().type(), o1.as<Vec>().elementType());
- if (!sizeOp.isValid())
- goto InvalidInstruction;
-
- if (!matchSignature(o0, o1, instFlags))
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(sizeOp.q(), 30);
- opcode.addImm(1u, sizeOp.size() + 19);
- goto EmitOp_Rd0_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdTblTbx: {
- const InstDB::EncodingData::SimdTblTbx& opData = InstDB::EncodingData::simdTblTbx[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Reg) || isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- // TBL/TBX <Vd>.<Ta>, { <Vn>.16B }, <Vm>.<Ta>
- // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B }, <Vm>.<Ta>
- // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B, <Vn+2>.16B }, <Vm>.<Ta>
- // TBL/TBX <Vd>.<Ta>, { <Vn>.16B, <Vn+1>.16B, <Vn+2>.16B, <Vn+3>.16B }, <Vm>.<Ta>
- opcode.reset(uint32_t(opData.opcode) << 10);
-
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
- const Operand_& o5 = opExt[EmitterUtils::kOp5];
-
- uint32_t q = diff(o0.as<Reg>().type(), RegType::kARM_VecD);
- if (q > 1 || o0.as<Vec>().hasElementIndex())
- goto InvalidInstruction;
-
- if (!o1.as<Vec>().isVecB16() || o1.as<Vec>().hasElementIndex())
- goto InvalidInstruction;
-
- uint32_t len = uint32_t(!o3.isNone()) + uint32_t(!o4.isNone()) + uint32_t(!o5.isNone());
- opcode.addImm(q, 30);
- opcode.addImm(len, 13);
-
- switch (len) {
- case 0:
- if (!checkSignature(o0, o2))
- goto InvalidInstruction;
-
- if (o2.id() > 31)
- goto InvalidPhysId;
-
- opcode.addReg(o2, 16);
- goto EmitOp_Rd0_Rn5;
-
- case 1:
- if (!checkSignature(o0, o3))
- goto InvalidInstruction;
-
- if (o3.id() > 31)
- goto InvalidPhysId;
-
- opcode.addReg(o3, 16);
- goto EmitOp_Rd0_Rn5;
-
- case 2:
- if (!checkSignature(o0, o4))
- goto InvalidInstruction;
-
- if (o4.id() > 31)
- goto InvalidPhysId;
-
- opcode.addReg(o4, 16);
- goto EmitOp_Rd0_Rn5;
-
- case 3:
- if (!checkSignature(o0, o5))
- goto InvalidInstruction;
-
- if (o5.id() > 31)
- goto InvalidPhysId;
-
- opcode.addReg(o5, 16);
- goto EmitOp_Rd0_Rn5;
-
- default:
- // Should never happen.
- goto InvalidInstruction;
- }
- }
-
- break;
- }
-
- // ------------------------------------------------------------------------
- // [Simd - Load / Store]
- // ------------------------------------------------------------------------
-
- case InstDB::kEncodingSimdLdSt: {
- const InstDB::EncodingData::SimdLdSt& opData = InstDB::EncodingData::simdLdSt[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- // Width | SZ | XY | XSZ
- // -------+----------+-----------+-----
- // 8-bit | size==00 | opc == 01 | 000
- // 16-bit | size==01 | opc == 01 | 001
- // 32-bit | size==10 | opc == 01 | 010
- // 64-bit | size==11 | opc == 01 | 011
- // 128-bit| size==00 | opc == 11 | 100
- uint32_t xsz = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
- if (xsz > 4u || o0.as<Vec>().hasElementIndex())
- goto InvalidRegType;
-
- if (!checkVecId(o0))
- goto InvalidPhysId;
-
- if (!armCheckMemBaseIndexRel(m))
- goto InvalidAddress;
-
- int64_t offset = m.offset();
- if (m.hasBaseReg()) {
- // [Base {Offset | Index}]
- if (m.hasIndex()) {
- uint32_t opt = armShiftOpToLdStOptMap[size_t(m.shiftOp())];
- if (opt == 0xFFu)
- goto InvalidAddress;
-
- uint32_t shift = m.shift();
- uint32_t s = (shift != 0);
-
- if (s && shift != xsz)
- goto InvalidAddressScale;
-
- opcode.reset(uint32_t(opData.registerOp) << 21);
- opcode.addImm(xsz & 3u, 30);
- opcode.addImm(xsz >> 2, 23);
- opcode.addImm(opt, 13);
- opcode.addImm(s, 12);
- opcode |= B(11);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBaseIndex_Rn5_Rm16;
- }
-
- // Makes it easier to work with the offset especially on 32-bit arch.
- if (!Support::isInt32(offset))
- goto InvalidDisplacement;
- int32_t offset32 = int32_t(offset);
-
- if (m.isPreOrPost()) {
- if (!Support::isInt9(offset32))
- goto InvalidDisplacement;
-
- opcode.reset(uint32_t(opData.prePostOp) << 21);
- opcode.addImm(xsz & 3u, 30);
- opcode.addImm(xsz >> 2, 23);
- opcode.addImm(offset32 & 0x1FF, 12);
- opcode.addImm(m.isPreIndex(), 11);
- opcode |= B(10);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
- else {
- uint32_t imm12 = uint32_t(offset32) >> xsz;
-
- // If this instruction is not encodable with scaled unsigned offset, try unscaled signed offset.
- if (!Support::isUInt12(imm12) || (imm12 << xsz) != uint32_t(offset32)) {
- instId = opData.uAltInstId;
- instInfo = &InstDB::_instInfoTable[instId];
- encodingIndex = instInfo->_encodingDataIndex;
- goto Case_SimdLdurStur;
- }
-
- opcode.reset(uint32_t(opData.uOffsetOp) << 22);
- opcode.addImm(xsz & 3u, 30);
- opcode.addImm(xsz >> 2, 23);
- opcode.addImm(imm12, 10);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
- }
- else {
- if (!opData.literalOp)
- goto InvalidAddress;
-
- if (xsz < 2u)
- goto InvalidRegType;
-
- uint32_t opc = xsz - 2u;
- opcode.reset(uint32_t(opData.literalOp) << 24);
- opcode.addImm(opc, 30);
- opcode.addReg(o0, 0);
- offsetFormat.resetToImmValue(OffsetType::kSignedOffset, 4, 5, 19, 2);
- goto EmitOp_Rel;
- }
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdLdpStp: {
- const InstDB::EncodingData::SimdLdpStp& opData = InstDB::EncodingData::simdLdpStp[encodingIndex];
-
- if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
- const Mem& m = o2.as<Mem>();
- rmRel = &m;
-
- uint32_t opc = diff(o0.as<Reg>().type(), RegType::kARM_VecS);
- if (opc > 2u || o0.as<Vec>().hasElementTypeOrIndex())
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1))
- goto InvalidInstruction;
-
- if (!checkVecId(o0, o1))
- goto InvalidPhysId;
-
- if (m.baseType() != RegType::kARM_GpX || m.hasIndex())
- goto InvalidAddress;
-
- if (m.isOffset64Bit())
- goto InvalidDisplacement;
-
- uint32_t offsetShift = 2u + opc;
- int32_t offset32 = m.offsetLo32() >> offsetShift;
-
- // Make sure we didn't lose bits by applying the mandatory offset shift.
- if (Support::shl(offset32, offsetShift) != m.offsetLo32())
- goto InvalidDisplacement;
-
- // Offset is encoded as a 7-bit immediate.
- if (!Support::isInt7(offset32))
- goto InvalidDisplacement;
-
- if (m.isPreOrPost() && offset32 != 0) {
- if (!opData.prePostOp)
- goto InvalidAddress;
-
- opcode.reset(uint32_t(opData.prePostOp) << 22);
- opcode.addImm(m.isPreIndex(), 24);
- }
- else {
- opcode.reset(uint32_t(opData.offsetOp) << 22);
- }
-
- opcode.addImm(opc, 30);
- opcode.addImm(offset32 & 0x7F, 15);
- opcode.addReg(o1, 10);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdLdurStur: {
-Case_SimdLdurStur:
- const InstDB::EncodingData::SimdLdurStur& opData = InstDB::EncodingData::simdLdurStur[encodingIndex];
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- const Mem& m = o1.as<Mem>();
- rmRel = &m;
-
- uint32_t sz = diff(o0.as<Reg>().type(), RegType::kARM_VecB);
- if (sz > 4 || o0.as<Vec>().hasElementTypeOrIndex())
- goto InvalidInstruction;
-
- if (!checkVecId(o0))
- goto InvalidPhysId;
-
- if (!armCheckMemBaseIndexRel(m))
- goto InvalidAddress;
-
- if (m.hasBaseReg() && !m.hasIndex() && !m.isPreOrPost()) {
- if (m.isOffset64Bit())
- goto InvalidDisplacement;
-
- int32_t offset32 = m.offsetLo32();
- if (!Support::isInt9(offset32))
- goto InvalidDisplacement;
-
- opcode.reset(uint32_t(opData.opcode) << 10);
- opcode.addImm(sz & 3u, 30);
- opcode.addImm(sz >> 2, 23);
- opcode.addImm(offset32 & 0x1FF, 12);
- opcode.addReg(o0, 0);
- goto EmitOp_MemBase_Rn5;
- }
-
- goto InvalidAddress;
- }
-
- break;
- }
-
- case InstDB::kEncodingSimdLdNStN: {
- const InstDB::EncodingData::SimdLdNStN& opData = InstDB::EncodingData::simdLdNStN[encodingIndex];
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
-
- uint32_t n = 1;
-
- if (isign4 == ENC_OPS2(Reg, Mem)) {
- if (opData.n != 1)
- goto InvalidInstruction;
-
- rmRel = &o1;
- }
- else if (isign4 == ENC_OPS3(Reg, Reg, Mem)) {
- if (opData.n != 1 && opData.n != 2)
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1) || !checkConsecutive(o0, o1))
- goto InvalidInstruction;
-
- n = 2;
- rmRel = &o2;
- }
- else if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem) && o4.isNone()) {
- if (opData.n != 1 && opData.n != 3)
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1, o2) || !checkConsecutive(o0, o1, o2))
- goto InvalidInstruction;
-
- n = 3;
- rmRel = &o3;
- }
- else if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg) && o4.isMem()) {
- if (opData.n != 1 && opData.n != 4)
- goto InvalidInstruction;
-
- if (!checkSignature(o0, o1, o2, o3) || !checkConsecutive(o0, o1, o2, o3))
- goto InvalidInstruction;
-
- n = 4;
- rmRel = &o4;
- }
- else {
- goto InvalidInstruction;
- }
-
- // We will use `v` and `m` from now as those are relevant for encoding.
- const Vec& v = o0.as<Vec>();
- const Mem& m = rmRel->as<Mem>();
-
- uint32_t q = 0;
- uint32_t rm = 0;
- uint32_t rn = m.baseId();
- uint32_t sz = diff(v.elementType(), VecElementType::kB);
- uint32_t opcSsize = sz;
- uint32_t offsetPossibility = 0;
-
- if (sz > 3)
- goto InvalidInstruction;
-
- if (m.baseType() != RegType::kARM_GpX)
- goto InvalidAddress;
-
- // Rn cannot be ZR, but can be SP.
- if (rn > 30 && rn != Gp::kIdSp)
- goto InvalidAddress;
-
- rn &= 31;
-
- if (opData.replicate) {
- if (n != opData.n)
- goto InvalidInstruction;
-
- // Replicates to the whole register, element index cannot be used.
- if (v.hasElementIndex())
- goto InvalidInstruction;
-
- q = diff(v.type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- opcode.reset(uint32_t(opData.singleOp) << 10);
- offsetPossibility = (1u << sz) * n;
- }
- else if (v.hasElementIndex()) {
- if (n != opData.n)
- goto InvalidInstruction;
-
- // LDx/STx (single structure).
- static const uint8_t opcSsizeBySzS[] = { 0x0u << 3, 0x2u << 3, 0x4u << 3, (0x4u << 3) | 1u };
-
- opcode.reset(uint32_t(opData.singleOp) << 10);
- opcSsize = opcSsizeBySzS[sz];
- offsetPossibility = (1u << sz) * opData.n;
-
- uint32_t elementIndex = v.elementIndex();
- uint32_t maxElementIndex = 15 >> sz;
-
- if (elementIndex > maxElementIndex)
- goto InvalidElementIndex;
-
- elementIndex <<= sz;
- q = elementIndex >> 3;
- opcSsize |= elementIndex & 0x7u;
- }
- else {
- // LDx/STx (multiple structures).
- static const uint8_t opcSsizeByN[] = { 0u, 0x7u << 2, 0xAu << 2, 0x6u << 2, 0x2u << 2 };
-
- q = diff(v.type(), RegType::kARM_VecD);
- if (q > 1)
- goto InvalidInstruction;
-
- if (opData.n == 1)
- opcSsize |= opcSsizeByN[n];
-
- opcode.reset(uint32_t(opData.multipleOp) << 10);
- offsetPossibility = (8u << q) * n;
- }
-
- if (m.hasIndex()) {
- if (m.hasOffset() || !m.isPostIndex())
- goto InvalidAddress;
-
- rm = m.indexId();
- if (rm > 30)
- goto InvalidAddress;
-
- // Bit 23 - PostIndex.
- opcode |= B(23);
- }
- else {
- if (m.hasOffset()) {
- if (m.offset() != int32_t(offsetPossibility) || !m.isPostIndex())
- goto InvalidAddress;
- rm = 31;
-
- // Bit 23 - PostIndex.
- opcode |= B(23);
- }
- }
-
- opcode.addImm(q, 30);
- opcode.addImm(rm, 16);
- opcode.addImm(opcSsize, 10);
- opcode.addImm(rn, 5);
- goto EmitOp_Rd0;
- }
-
- default:
- break;
- }
-
- goto InvalidInstruction;
-
- // --------------------------------------------------------------------------
- // [EmitGp - Single]
- // --------------------------------------------------------------------------
-
-EmitOp_Rd0:
- if (!checkValidRegs(o0))
- goto InvalidPhysId;
-
- opcode.addReg(o0, 0);
- goto EmitOp;
-
-EmitOp_Rn5:
- if (!checkValidRegs(o0))
- goto InvalidPhysId;
-
- opcode.addReg(o0, 5);
- goto EmitOp;
-
-EmitOp_Rn5_Rm16:
- if (!checkValidRegs(o0, o1))
- goto InvalidPhysId;
-
- opcode.addReg(o0, 5);
- opcode.addReg(o1, 16);
- goto EmitOp;
-
-EmitOp_Rd0_Rn5:
- if (!checkValidRegs(o0, o1))
- goto InvalidPhysId;
-
- opcode.addReg(o0, 0);
- opcode.addReg(o1, 5);
- goto EmitOp;
-
-EmitOp_Rd0_Rn5_Rm16_Ra10:
- if (!checkValidRegs(o0, o1, o2, o3))
- goto InvalidPhysId;
-
- opcode.addReg(o0, 0);
- opcode.addReg(o1, 5);
- opcode.addReg(o2, 16);
- opcode.addReg(o3, 10);
- goto EmitOp;
-
-EmitOp_Rd0_Rn5_Rm16:
- if (!checkValidRegs(o0, o1, o3))
- goto InvalidPhysId;
-
- opcode.addReg(o0, 0);
- opcode.addReg(o1, 5);
- opcode.addReg(o2, 16);
- goto EmitOp;
-
- // --------------------------------------------------------------------------
- // [EmitGp - Multiple]
- // --------------------------------------------------------------------------
-
-EmitOp_Multiple:
- {
- ASMJIT_ASSERT(multipleOpCount > 0);
- err = writer.ensureSpace(this, multipleOpCount * 4u);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
- for (uint32_t i = 0; i < multipleOpCount; i++)
- writer.emit32uLE(multipleOpData[i]);
-
- goto EmitDone;
- }
-
- // --------------------------------------------------------------------------
- // [EmitGp - Memory]
- // --------------------------------------------------------------------------
-
-EmitOp_MemBase_Rn5:
- if (!checkMemBase(rmRel->as<Mem>()))
- goto InvalidAddress;
-
- opcode.addReg(rmRel->as<Mem>().baseId(), 5);
- goto EmitOp;
-
-EmitOp_MemBaseNoImm_Rn5:
- if (!checkMemBase(rmRel->as<Mem>()) || rmRel->as<Mem>().hasIndex())
- goto InvalidAddress;
-
- if (rmRel->as<Mem>().hasOffset())
- goto InvalidDisplacement;
-
- opcode.addReg(rmRel->as<Mem>().baseId(), 5);
- goto EmitOp;
-
-EmitOp_MemBaseIndex_Rn5_Rm16:
- if (!rmRel->as<Mem>().hasBaseReg())
- goto InvalidAddress;
-
- if (rmRel->as<Mem>().indexId() > 30 && rmRel->as<Mem>().indexId() != Gp::kIdZr)
- goto InvalidPhysId;
-
- opcode.addReg(rmRel->as<Mem>().indexId(), 16);
- opcode.addReg(rmRel->as<Mem>().baseId(), 5);
- goto EmitOp;
-
- // --------------------------------------------------------------------------
- // [EmitOp - PC Relative]
- // --------------------------------------------------------------------------
-
-EmitOp_Rel:
- {
- if (rmRel->isLabel() || rmRel->isMem()) {
- uint32_t labelId;
- int64_t labelOffset = 0;
-
- if (rmRel->isLabel()) {
- labelId = rmRel->as<Label>().id();
- }
- else {
- labelId = rmRel->as<Mem>().baseId();
- labelOffset = rmRel->as<Mem>().offset();
- }
-
- LabelEntry* label = _code->labelEntry(labelId);
- if (ASMJIT_UNLIKELY(!label))
- goto InvalidLabel;
-
- if (offsetFormat.type() == OffsetType::kAArch64_ADRP) {
- // TODO: [ARM] Always create relocation entry.
- }
-
- if (label->isBoundTo(_section)) {
- // Label bound to the current section.
- offsetValue = label->offset() - uint64_t(offset()) + uint64_t(labelOffset);
- goto EmitOp_DispImm;
- }
- else {
- // Record non-bound label.
- size_t codeOffset = writer.offsetFrom(_bufferData);
- LabelLink* link = _code->newLabelLink(label, _section->id(), codeOffset, intptr_t(labelOffset), offsetFormat);
-
- if (ASMJIT_UNLIKELY(!link))
- goto OutOfMemory;
-
- goto EmitOp;
- }
- }
- }
-
- if (rmRel->isImm()) {
- uint64_t baseAddress = _code->baseAddress();
- uint64_t targetOffset = rmRel->as<Imm>().valueAs<uint64_t>();
-
- size_t codeOffset = writer.offsetFrom(_bufferData);
-
- if (baseAddress == Globals::kNoBaseAddress || _section->id() != 0) {
- // Create a new RelocEntry as we cannot calculate the offset right now.
- RelocEntry* re;
- err = _code->newRelocEntry(&re, RelocType::kAbsToRel);
- if (err)
- goto Failed;
-
- re->_sourceSectionId = _section->id();
- re->_sourceOffset = codeOffset;
- re->_format = offsetFormat;
- re->_payload = rmRel->as<Imm>().valueAs<uint64_t>() + 4u;
- goto EmitOp;
- }
- else {
- uint64_t pc = baseAddress + codeOffset;
-
- if (offsetFormat.type() == OffsetType::kAArch64_ADRP)
- pc &= ~uint64_t(4096 - 1);
-
- offsetValue = targetOffset - pc;
- goto EmitOp_DispImm;
- }
- }
-
- goto InvalidInstruction;
-
-EmitOp_DispImm:
- {
- if ((offsetValue & Support::lsbMask<uint32_t>(offsetFormat.immDiscardLsb())) != 0)
- goto InvalidDisplacement;
-
- int64_t dispImm64 = int64_t(offsetValue) >> offsetFormat.immDiscardLsb();
- if (!Support::isEncodableOffset64(dispImm64, offsetFormat.immBitCount()))
- goto InvalidDisplacement;
-
- uint32_t dispImm32 = uint32_t(dispImm64 & Support::lsbMask<uint32_t>(offsetFormat.immBitCount()));
- switch (offsetFormat.type()) {
- case OffsetType::kSignedOffset: {
- opcode.addImm(dispImm32, offsetFormat.immBitShift());
- goto EmitOp;
- }
-
- case OffsetType::kAArch64_ADR:
- case OffsetType::kAArch64_ADRP: {
- uint32_t immLo = dispImm32 & 0x3u;
- uint32_t immHi = dispImm32 >> 2;
- opcode.addImm(immLo, 29);
- opcode.addImm(immHi, 5);
- goto EmitOp;
- }
-
- default:
- goto InvalidDisplacement;
- }
- }
-
- // --------------------------------------------------------------------------
- // [EmitOp - Opcode]
- // --------------------------------------------------------------------------
-
-EmitOp:
- writer.emit32uLE(opcode.get());
- goto EmitDone;
-
- // --------------------------------------------------------------------------
- // [Done]
- // --------------------------------------------------------------------------
-
-EmitDone:
- if (Support::test(options, InstOptions::kReserved)) {
-#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- EmitterUtils::logInstructionEmitted(this, BaseInst::composeARMInstId(instId, instCC), options, o0, o1, o2, opExt, 0, 0, writer.cursor());
-#endif
- }
-
- resetState();
-
- writer.done(this);
- return kErrorOk;
-
- // --------------------------------------------------------------------------
- // [Error Handler]
- // --------------------------------------------------------------------------
-
-#define ERROR_HANDLER(ERR) ERR: err = DebugUtils::errored(kError##ERR); goto Failed;
- ERROR_HANDLER(OutOfMemory)
- ERROR_HANDLER(InvalidAddress)
- ERROR_HANDLER(InvalidAddressScale)
- ERROR_HANDLER(InvalidDisplacement)
- ERROR_HANDLER(InvalidElementIndex)
- ERROR_HANDLER(InvalidLabel)
- ERROR_HANDLER(InvalidImmediate)
- ERROR_HANDLER(InvalidInstruction)
- ERROR_HANDLER(InvalidPhysId)
- ERROR_HANDLER(InvalidRegType)
-#undef ERROR_HANDLER
-
-Failed:
-#ifndef ASMJIT_NO_LOGGING
- return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
-#else
- resetState();
- return reportError(err);
-#endif
-}
-
-#undef ENC_OPS1
-#undef ENC_OPS2
-#undef ENC_OPS3
-#undef ENC_OPS4
-
-// a64::Assembler - Align
-// ======================
-
-Error Assembler::align(AlignMode alignMode, uint32_t alignment) {
- constexpr uint32_t kNopA64 = 0xD503201Fu; // [11010101|00000011|00100000|00011111].
-
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- if (ASMJIT_UNLIKELY(uint32_t(alignMode) > uint32_t(AlignMode::kMaxValue)))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (alignment <= 1)
- return kErrorOk;
-
- if (ASMJIT_UNLIKELY(alignment > Globals::kMaxAlignment || !Support::isPowerOf2(alignment)))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- uint32_t i = uint32_t(Support::alignUpDiff<size_t>(offset(), alignment));
- if (i == 0)
- return kErrorOk;
-
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, i));
-
- switch (alignMode) {
- case AlignMode::kCode: {
- uint32_t pattern = kNopA64;
-
- if (ASMJIT_UNLIKELY(offset() & 0x3u))
- return DebugUtils::errored(kErrorInvalidState);
-
- while (i >= 4) {
- writer.emit32uLE(pattern);
- i -= 4;
- }
-
- ASMJIT_ASSERT(i == 0);
- break;
- }
-
- case AlignMode::kData:
- case AlignMode::kZero:
- writer.emitZeros(i);
- break;
- }
-
- writer.done(this);
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- StringTmp<128> sb;
- sb.appendChars(' ', _logger->indentation(FormatIndentationGroup::kCode));
- sb.appendFormat("align %u\n", alignment);
- _logger->log(sb);
- }
-#endif
-
- return kErrorOk;
-}
-
-// a64::Assembler - Events
-// =======================
-
-Error Assembler::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- _instructionAlignment = uint8_t(4);
- assignEmitterFuncs(this);
-
- return kErrorOk;
-}
-
-Error Assembler::onDetach(CodeHolder* code) noexcept {
- return Base::onDetach(code);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64assembler.h b/3rdparty/asmjit/src/asmjit/arm/a64assembler.h
deleted file mode 100644
index 319321576d8..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64assembler.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
-#define ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
-
-#include "../core/assembler.h"
-#include "../arm/a64emitter.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \addtogroup asmjit_a64
-//! \{
-
-//! AArch64 assembler implementation.
-class ASMJIT_VIRTAPI Assembler
- : public BaseAssembler,
- public EmitterExplicitT<Assembler> {
-
-public:
- typedef BaseAssembler Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API Assembler(CodeHolder* code = nullptr) noexcept;
- ASMJIT_API ~Assembler() noexcept override;
-
- //! \}
-
- //! \name Emit
- //! \{
-
- ASMJIT_API Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
-
- //! \}
-
- //! \name Align
- //! \{
-
- ASMJIT_API Error align(AlignMode alignMode, uint32_t alignment) override;
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_A64ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp b/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp
deleted file mode 100644
index d29b0a498b9..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64builder.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_BUILDER)
-
-#include "../arm/a64assembler.h"
-#include "../arm/a64builder.h"
-#include "../arm/a64emithelper_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::Builder - Construction & Destruction
-// =========================================
-
-Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
- _archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
- if (code)
- code->attach(this);
-}
-Builder::~Builder() noexcept {}
-
-// a64::Builder - Events
-// =====================
-
-Error Builder::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- _instructionAlignment = uint8_t(4);
- assignEmitterFuncs(this);
-
- return kErrorOk;
-}
-
-Error Builder::onDetach(CodeHolder* code) noexcept {
- return Base::onDetach(code);
-}
-
-
-// a64::Builder - Finalize
-// =======================
-
-Error Builder::finalize() {
- ASMJIT_PROPAGATE(runPasses());
- Assembler a(_code);
- a.addEncodingOptions(encodingOptions());
- a.addDiagnosticOptions(diagnosticOptions());
- return serializeTo(&a);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64builder.h b/3rdparty/asmjit/src/asmjit/arm/a64builder.h
deleted file mode 100644
index cab1083172b..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64builder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64BUILDER_H_INCLUDED
-#define ASMJIT_ARM_A64BUILDER_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_BUILDER
-
-#include "../core/builder.h"
-#include "../arm/a64emitter.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \addtogroup asmjit_a64
-//! \{
-
-//! AArch64 builder implementation.
-class ASMJIT_VIRTAPI Builder
- : public BaseBuilder,
- public EmitterExplicitT<Builder> {
-public:
- ASMJIT_NONCOPYABLE(Builder)
- typedef BaseBuilder Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept;
- ASMJIT_API ~Builder() noexcept override;
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-
- //! \name Finalize
- //! \{
-
- ASMJIT_API Error finalize() override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_BUILDER
-#endif // ASMJIT_ARM_A64BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp b/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp
deleted file mode 100644
index 765fd4b9dee..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64compiler.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_COMPILER)
-
-#include "../arm/a64assembler.h"
-#include "../arm/a64compiler.h"
-#include "../arm/a64emithelper_p.h"
-#include "../arm/a64rapass_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::Compiler - Construction & Destruction
-// ==========================================
-
-Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
- _archMask = uint64_t(1) << uint32_t(Arch::kAArch64);
- if (code)
- code->attach(this);
-}
-Compiler::~Compiler() noexcept {}
-
-// a64::Compiler - Events
-// ======================
-
-Error Compiler::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
- Error err = addPassT<ARMRAPass>();
-
- if (ASMJIT_UNLIKELY(err)) {
- onDetach(code);
- return err;
- }
-
- _instructionAlignment = uint8_t(4);
- assignEmitterFuncs(this);
-
- return kErrorOk;
-}
-
-Error Compiler::onDetach(CodeHolder* code) noexcept {
- return Base::onDetach(code);
-}
-
-// a64::Compiler - Finalize
-// ========================
-
-Error Compiler::finalize() {
- ASMJIT_PROPAGATE(runPasses());
- Assembler a(_code);
- a.addEncodingOptions(encodingOptions());
- a.addDiagnosticOptions(diagnosticOptions());
- return serializeTo(&a);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64compiler.h b/3rdparty/asmjit/src/asmjit/arm/a64compiler.h
deleted file mode 100644
index 64f82f62538..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64compiler.h
+++ /dev/null
@@ -1,254 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64COMPILER_H_INCLUDED
-#define ASMJIT_ARM_A64COMPILER_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/compiler.h"
-#include "../core/type.h"
-#include "../arm/a64emitter.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \addtogroup asmjit_a64
-//! \{
-
-//! AArch64 compiler implementation.
-class ASMJIT_VIRTAPI Compiler
- : public BaseCompiler,
- public EmitterExplicitT<Compiler> {
-public:
- ASMJIT_NONCOPYABLE(Compiler)
- typedef BaseCompiler Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept;
- ASMJIT_API ~Compiler() noexcept override;
-
- //! \}
-
- //! \name Virtual Registers
- //! \{
-
- //! \cond INTERNAL
- template<typename RegT, typename Type>
- ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type) {
- RegT reg(Globals::NoInit);
- _newReg(&reg, type, nullptr);
- return reg;
- }
-
- template<typename RegT, typename Type>
- ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s) {
-#ifndef ASMJIT_NO_LOGGING
- RegT reg(Globals::NoInit);
- _newReg(&reg, type, s);
- return reg;
-#else
- DebugUtils::unused(s);
- return _newRegInternal<RegT>(type);
-#endif
- }
-
- template<typename RegT, typename Type, typename... Args>
- ASMJIT_INLINE_NODEBUG RegT _newRegInternal(const Type& type, const char* s, Args&&... args) {
-#ifndef ASMJIT_NO_LOGGING
- RegT reg(Globals::NoInit);
- _newRegFmt(&reg, type, s, std::forward<Args>(args)...);
- return reg;
-#else
- DebugUtils::unused(s, std::forward<Args>(args)...);
- return _newRegInternal<RegT>(type);
-#endif
- }
- //! \endcond
-
- template<typename RegT, typename... Args>
- ASMJIT_INLINE_NODEBUG RegT newSimilarReg(const RegT& ref, Args&&... args) {
- return _newRegInternal<RegT>(ref, std::forward<Args>(args)...);
- }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Reg newReg(TypeId typeId, Args&&... args) { return _newRegInternal<Reg>(typeId, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newGp(TypeId typeId, Args&&... args) { return _newRegInternal<Gp>(typeId, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Vec newVec(TypeId typeId, Args&&... args) { return _newRegInternal<Vec>(typeId, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newInt32(Args&&... args) { return _newRegInternal<Gp>(TypeId::kInt32, std::forward<Args>(args)...); }
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newUInt32(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newInt64(Args&&... args) { return _newRegInternal<Gp>(TypeId::kInt64, std::forward<Args>(args)...); }
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newUInt64(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt64, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newIntPtr(Args&&... args) { return _newRegInternal<Gp>(TypeId::kIntPtr, std::forward<Args>(args)...); }
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newUIntPtr(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newGpw(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt32, std::forward<Args>(args)...); }
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newGpx(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUInt64, std::forward<Args>(args)...); }
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Gp newGpz(Args&&... args) { return _newRegInternal<Gp>(TypeId::kUIntPtr, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Vec newVecS(Args&&... args) { return _newRegInternal<Vec>(TypeId::kFloat32, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Vec newVecD(Args&&... args) { return _newRegInternal<Vec>(TypeId::kFloat64, std::forward<Args>(args)...); }
-
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Vec newVecQ(Args&&... args) { return _newRegInternal<Vec>(TypeId::kUInt8x16, std::forward<Args>(args)...); }
-
- //! \}
-
- //! \name Stack
- //! \{
-
- //! Creates a new memory chunk allocated on the current function's stack.
- ASMJIT_INLINE_NODEBUG Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) {
- Mem m(Globals::NoInit);
- _newStack(&m, size, alignment, name);
- return m;
- }
-
- //! \}
-
- //! \name Constants
- //! \{
-
- //! Put data to a constant-pool and get a memory reference to it.
- ASMJIT_INLINE_NODEBUG Mem newConst(ConstPoolScope scope, const void* data, size_t size) {
- Mem m(Globals::NoInit);
- _newConst(&m, scope, data, size);
- return m;
- }
-
- //! Put a BYTE `val` to a constant-pool (8 bits).
- ASMJIT_INLINE_NODEBUG Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); }
- //! Put a HWORD `val` to a constant-pool (16 bits).
- ASMJIT_INLINE_NODEBUG Mem newHWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
- //! Put a WORD `val` to a constant-pool (32 bits).
- ASMJIT_INLINE_NODEBUG Mem newWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
- //! Put a DWORD `val` to a constant-pool (64 bits).
- ASMJIT_INLINE_NODEBUG Mem newDWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
-
- //! Put a WORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); }
- //! Put a WORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
- //! Put a DWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); }
- //! Put a DWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
- //! Put a QWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); }
- //! Put a QWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
-
- //! Put a SP-FP `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); }
- //! Put a DP-FP `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); }
-
- //! \}
-
- //! \name Instruction Options
- //! \{
-
- //! Force the compiler to not follow the conditional or unconditional jump.
- ASMJIT_INLINE_NODEBUG Compiler& unfollow() noexcept { _instOptions |= InstOptions::kUnfollow; return *this; }
-
- //! \}
-
- //! \name Compiler specific
- //! \{
-
- //! Special pseudo-instruction that can be used to load a memory address into `o0` GP register.
- //!
- //! \note At the moment this instruction is only useful to load a stack allocated address into a GP register
- //! for further use. It makes very little sense to use it for anything else. The semantics of this instruction
- //! is the same as X86 `LEA` (load effective address) instruction.
- ASMJIT_INLINE_NODEBUG Error loadAddressOf(const Gp& o0, const Mem& o1) { return _emitter()->_emitI(Inst::kIdAdr, o0, o1); }
-
- //! \}
-
- //! \name Function Call & Ret Intrinsics
- //! \{
-
- //! Invoke a function call without `target` type enforcement.
- ASMJIT_INLINE_NODEBUG Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) {
- return addInvokeNode(out, Inst::kIdBlr, target, signature);
- }
-
- //! Invoke a function call of the given `target` and `signature` and store the added node to `out`.
- //!
- //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`,
- //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails
- //! nullptr is stored in `out` and error code is returned.
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); }
-
- //! Return.
- ASMJIT_INLINE_NODEBUG Error ret() { return addRet(Operand(), Operand()); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0) { return addRet(o0, Operand()); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); }
-
- //! \}
-
- //! \name Jump Tables Support
- //! \{
-
- using EmitterExplicitT<Compiler>::br;
-
- //! Adds a jump to the given `target` with the provided jump `annotation`.
- ASMJIT_INLINE_NODEBUG Error br(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdBr, target, annotation); }
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-
- //! \name Finalize
- //! \{
-
- ASMJIT_API Error finalize() override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_ARM_A64COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp b/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp
deleted file mode 100644
index 0cf098250a3..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64emithelper.cpp
+++ /dev/null
@@ -1,470 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64)
-
-#include "../core/formatter.h"
-#include "../core/funcargscontext_p.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../arm/a64emithelper_p.h"
-#include "../arm/a64formatter_p.h"
-#include "../arm/a64instapi_p.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::EmitHelper - Emit Operations
-// =================================
-
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitRegMove(
- const Operand_& dst_,
- const Operand_& src_, TypeId typeId, const char* comment) {
-
- Emitter* emitter = _emitter->as<Emitter>();
-
- // Invalid or abstract TypeIds are not allowed.
- ASMJIT_ASSERT(TypeUtils::isValid(typeId) && !TypeUtils::isAbstract(typeId));
-
- emitter->setInlineComment(comment);
-
- if (dst_.isReg() && src_.isMem()) {
- Reg dst(dst_.as<Reg>());
- Mem src(src_.as<Mem>());
-
- switch (typeId) {
- case TypeId::kInt8:
- case TypeId::kUInt8:
- return emitter->ldrb(dst.as<Gp>(), src);
-
- case TypeId::kInt16:
- case TypeId::kUInt16:
- return emitter->ldrh(dst.as<Gp>(), src);
-
- case TypeId::kInt32:
- case TypeId::kUInt32:
- return emitter->ldr(dst.as<Gp>().w(), src);
-
- case TypeId::kInt64:
- case TypeId::kUInt64:
- return emitter->ldr(dst.as<Gp>().x(), src);
-
- default: {
- if (TypeUtils::isFloat32(typeId) || TypeUtils::isVec32(typeId))
- return emitter->ldr(dst.as<Vec>().s(), src);
-
- if (TypeUtils::isFloat64(typeId) || TypeUtils::isVec64(typeId))
- return emitter->ldr(dst.as<Vec>().d(), src);
-
- if (TypeUtils::isVec128(typeId))
- return emitter->ldr(dst.as<Vec>().q(), src);
-
- break;
- }
- }
- }
-
- if (dst_.isMem() && src_.isReg()) {
- Mem dst(dst_.as<Mem>());
- Reg src(src_.as<Reg>());
-
- switch (typeId) {
- case TypeId::kInt8:
- case TypeId::kUInt8:
- return emitter->strb(src.as<Gp>(), dst);
-
- case TypeId::kInt16:
- case TypeId::kUInt16:
- return emitter->strh(src.as<Gp>(), dst);
-
- case TypeId::kInt32:
- case TypeId::kUInt32:
- return emitter->str(src.as<Gp>().w(), dst);
-
- case TypeId::kInt64:
- case TypeId::kUInt64:
- return emitter->str(src.as<Gp>().x(), dst);
-
- default: {
- if (TypeUtils::isFloat32(typeId) || TypeUtils::isVec32(typeId))
- return emitter->str(src.as<Vec>().s(), dst);
-
- if (TypeUtils::isFloat64(typeId) || TypeUtils::isVec64(typeId))
- return emitter->str(src.as<Vec>().d(), dst);
-
- if (TypeUtils::isVec128(typeId))
- return emitter->str(src.as<Vec>().q(), dst);
-
- break;
- }
- }
- }
-
- if (dst_.isReg() && src_.isReg()) {
- Reg dst(dst_.as<Reg>());
- Reg src(src_.as<Reg>());
-
- switch (typeId) {
- case TypeId::kInt8:
- case TypeId::kUInt8:
- case TypeId::kInt16:
- case TypeId::kUInt16:
- case TypeId::kInt32:
- case TypeId::kUInt32:
- case TypeId::kInt64:
- case TypeId::kUInt64:
- return emitter->mov(dst.as<Gp>().x(), src.as<Gp>().x());
-
- default: {
- if (TypeUtils::isFloat32(typeId) || TypeUtils::isVec32(typeId))
- return emitter->fmov(dst.as<Vec>().s(), src.as<Vec>().s());
-
- if (TypeUtils::isFloat64(typeId) || TypeUtils::isVec64(typeId))
- return emitter->mov(dst.as<Vec>().b8(), src.as<Vec>().b8());
-
- if (TypeUtils::isVec128(typeId))
- return emitter->mov(dst.as<Vec>().b16(), src.as<Vec>().b16());
-
- break;
- }
- }
- }
-
- emitter->setInlineComment(nullptr);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error EmitHelper::emitRegSwap(
- const BaseReg& a,
- const BaseReg& b, const char* comment) {
-
- DebugUtils::unused(a, b, comment);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// TODO: [ARM] EmitArgMove is unfinished.
-Error EmitHelper::emitArgMove(
- const BaseReg& dst_, TypeId dstTypeId,
- const Operand_& src_, TypeId srcTypeId, const char* comment) {
-
- // Deduce optional `dstTypeId`, which may be `TypeId::kVoid` in some cases.
- if (dstTypeId == TypeId::kVoid) {
- const ArchTraits& archTraits = ArchTraits::byArch(_emitter->arch());
- dstTypeId = archTraits.regTypeToTypeId(dst_.type());
- }
-
- // Invalid or abstract TypeIds are not allowed.
- ASMJIT_ASSERT(TypeUtils::isValid(dstTypeId) && !TypeUtils::isAbstract(dstTypeId));
- ASMJIT_ASSERT(TypeUtils::isValid(srcTypeId) && !TypeUtils::isAbstract(srcTypeId));
-
- Reg dst(dst_.as<Reg>());
- Operand src(src_);
-
- uint32_t dstSize = TypeUtils::sizeOf(dstTypeId);
- uint32_t srcSize = TypeUtils::sizeOf(srcTypeId);
-
- if (TypeUtils::isInt(dstTypeId)) {
- if (TypeUtils::isInt(srcTypeId)) {
- uint32_t x = uint32_t(dstSize == 8);
-
- dst.setSignature(OperandSignature{x ? uint32_t(GpX::kSignature) : uint32_t(GpW::kSignature)});
- _emitter->setInlineComment(comment);
-
- if (src.isReg()) {
- src.setSignature(dst.signature());
- return _emitter->emit(Inst::kIdMov, dst, src);
- }
- else if (src.isMem()) {
- InstId instId = Inst::kIdNone;
- switch (srcTypeId) {
- case TypeId::kInt8: instId = Inst::kIdLdrsb; break;
- case TypeId::kUInt8: instId = Inst::kIdLdrb; break;
- case TypeId::kInt16: instId = Inst::kIdLdrsh; break;
- case TypeId::kUInt16: instId = Inst::kIdLdrh; break;
- case TypeId::kInt32: instId = x ? Inst::kIdLdrsw : Inst::kIdLdr; break;
- case TypeId::kUInt32: instId = Inst::kIdLdr; break;
- case TypeId::kInt64: instId = Inst::kIdLdr; break;
- case TypeId::kUInt64: instId = Inst::kIdLdr; break;
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
- return _emitter->emit(instId, dst, src);
- }
- }
- }
-
- if (TypeUtils::isFloat(dstTypeId) || TypeUtils::isVec(dstTypeId)) {
- if (TypeUtils::isFloat(srcTypeId) || TypeUtils::isVec(srcTypeId)) {
- switch (srcSize) {
- case 2: dst.as<Vec>().setSignature(OperandSignature{VecH::kSignature}); break;
- case 4: dst.as<Vec>().setSignature(OperandSignature{VecS::kSignature}); break;
- case 8: dst.as<Vec>().setSignature(OperandSignature{VecD::kSignature}); break;
- case 16: dst.as<Vec>().setSignature(OperandSignature{VecV::kSignature}); break;
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- _emitter->setInlineComment(comment);
-
- if (src.isReg()) {
- InstId instId = srcSize <= 4 ? Inst::kIdFmov_v : Inst::kIdMov_v;
- src.setSignature(dst.signature());
- return _emitter->emit(instId, dst, src);
- }
- else if (src.isMem()) {
- return _emitter->emit(Inst::kIdLdr_v, dst, src);
- }
- }
- }
-
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// a64::EmitHelper - Emit Prolog & Epilog
-// ======================================
-
-struct LoadStoreInstructions {
- InstId singleInstId;
- InstId pairInstId;
-};
-
-struct PrologEpilogInfo {
- struct RegPair {
- uint8_t ids[2];
- uint16_t offset;
- };
-
- struct GroupData {
- RegPair pairs[16];
- uint32_t pairCount;
- };
-
- Support::Array<GroupData, 2> groups;
- uint32_t sizeTotal;
-
- Error init(const FuncFrame& frame) noexcept {
- uint32_t offset = 0;
-
- for (RegGroup group : Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kVec>{}) {
- GroupData& data = groups[group];
-
- uint32_t n = 0;
- uint32_t pairCount = 0;
- RegPair* pairs = data.pairs;
-
- uint32_t slotSize = frame.saveRestoreRegSize(group);
- uint32_t savedRegs = frame.savedRegs(group);
-
- if (group == RegGroup::kGp && frame.hasPreservedFP()) {
- // Must be at the beginning of the push/pop sequence.
- ASMJIT_ASSERT(pairCount == 0);
-
- pairs[0].offset = uint16_t(offset);
- pairs[0].ids[0] = Gp::kIdFp;
- pairs[0].ids[1] = Gp::kIdLr;
- offset += slotSize * 2;
- pairCount++;
-
- savedRegs &= ~Support::bitMask(Gp::kIdFp, Gp::kIdLr);
- }
-
- Support::BitWordIterator<uint32_t> it(savedRegs);
- while (it.hasNext()) {
- pairs[pairCount].ids[n] = uint8_t(it.next());
-
- if (++n == 2) {
- pairs[pairCount].offset = uint16_t(offset);
- offset += slotSize * 2;
-
- n = 0;
- pairCount++;
- }
- }
-
- if (n == 1) {
- pairs[pairCount].ids[1] = uint8_t(BaseReg::kIdBad);
- pairs[pairCount].offset = uint16_t(offset);
- offset += slotSize * 2;
- pairCount++;
- }
-
- data.pairCount = pairCount;
- }
-
- sizeTotal = offset;
- return kErrorOk;
- }
-};
-
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) {
- Emitter* emitter = _emitter->as<Emitter>();
-
- PrologEpilogInfo pei;
- ASMJIT_PROPAGATE(pei.init(frame));
-
- static const Support::Array<Reg, 2> groupRegs = {{ x0, d0 }};
- static const Support::Array<LoadStoreInstructions, 2> groupInsts = {{
- { Inst::kIdStr , Inst::kIdStp },
- { Inst::kIdStr_v, Inst::kIdStp_v }
- }};
-
- // Emit: 'bti' (indirect branch protection).
- if (frame.hasIndirectBranchProtection()) {
- // TODO: The instruction is not available at the moment (would be ABI break).
- // ASMJIT_PROPAGATE(emitter->bti());
- }
-
- uint32_t adjustInitialOffset = pei.sizeTotal;
-
- for (RegGroup group : Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kVec>{}) {
- const PrologEpilogInfo::GroupData& data = pei.groups[group];
- uint32_t pairCount = data.pairCount;
-
- Reg regs[2] = { groupRegs[group], groupRegs[group] };
- Mem mem = ptr(sp);
-
- const LoadStoreInstructions& insts = groupInsts[group];
- for (uint32_t i = 0; i < pairCount; i++) {
- const PrologEpilogInfo::RegPair& pair = data.pairs[i];
-
- regs[0].setId(pair.ids[0]);
- regs[1].setId(pair.ids[1]);
- mem.setOffsetLo32(pair.offset);
-
- if (pair.offset == 0 && adjustInitialOffset) {
- mem.setOffset(-int(adjustInitialOffset));
- mem.makePreIndex();
- }
-
- if (pair.ids[1] == BaseReg::kIdBad)
- ASMJIT_PROPAGATE(emitter->emit(insts.singleInstId, regs[0], mem));
- else
- ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
-
- mem.resetOffsetMode();
-
- if (i == 0 && frame.hasPreservedFP()) {
- ASMJIT_PROPAGATE(emitter->mov(x29, sp));
- }
- }
- }
-
- if (frame.hasStackAdjustment()) {
- uint32_t adj = frame.stackAdjustment();
- if (adj <= 0xFFFu) {
- ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj));
- }
- else if (adj <= 0xFFFFFFu) {
- // TODO: [ARM] Prolog - we must touch the pages otherwise it's undefined.
- ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj & 0x000FFFu));
- ASMJIT_PROPAGATE(emitter->sub(sp, sp, adj & 0xFFF000u));
- }
- else {
- return DebugUtils::errored(kErrorInvalidState);
- }
- }
-
- return kErrorOk;
-}
-
-// TODO: [ARM] Emit epilog.
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) {
- Emitter* emitter = _emitter->as<Emitter>();
-
- PrologEpilogInfo pei;
- ASMJIT_PROPAGATE(pei.init(frame));
-
- static const Support::Array<Reg, 2> groupRegs = {{ x0, d0 }};
- static const Support::Array<LoadStoreInstructions, 2> groupInsts = {{
- { Inst::kIdLdr , Inst::kIdLdp },
- { Inst::kIdLdr_v, Inst::kIdLdp_v }
- }};
-
- uint32_t adjustInitialOffset = pei.sizeTotal;
-
- if (frame.hasStackAdjustment()) {
- uint32_t adj = frame.stackAdjustment();
- if (adj <= 0xFFFu) {
- ASMJIT_PROPAGATE(emitter->add(sp, sp, adj));
- }
- else if (adj <= 0xFFFFFFu) {
- ASMJIT_PROPAGATE(emitter->add(sp, sp, adj & 0x000FFFu));
- ASMJIT_PROPAGATE(emitter->add(sp, sp, adj & 0xFFF000u));
- }
- else {
- return DebugUtils::errored(kErrorInvalidState);
- }
- }
-
- for (int g = 1; g >= 0; g--) {
- RegGroup group = RegGroup(g);
- const PrologEpilogInfo::GroupData& data = pei.groups[group];
- uint32_t pairCount = data.pairCount;
-
- Reg regs[2] = { groupRegs[group], groupRegs[group] };
- Mem mem = ptr(sp);
-
- const LoadStoreInstructions& insts = groupInsts[group];
-
- for (int i = int(pairCount) - 1; i >= 0; i--) {
- const PrologEpilogInfo::RegPair& pair = data.pairs[i];
-
- regs[0].setId(pair.ids[0]);
- regs[1].setId(pair.ids[1]);
- mem.setOffsetLo32(pair.offset);
-
- if (pair.offset == 0 && adjustInitialOffset) {
- mem.setOffset(int(adjustInitialOffset));
- mem.makePostIndex();
- }
-
- if (pair.ids[1] == BaseReg::kIdBad)
- ASMJIT_PROPAGATE(emitter->emit(insts.singleInstId, regs[0], mem));
- else
- ASMJIT_PROPAGATE(emitter->emit(insts.pairInstId, regs[0], regs[1], mem));
-
- mem.resetOffsetMode();
- }
- }
-
- ASMJIT_PROPAGATE(emitter->ret(x30));
-
- return kErrorOk;
-}
-
-static Error ASMJIT_CDECL Emitter_emitProlog(BaseEmitter* emitter, const FuncFrame& frame) {
- EmitHelper emitHelper(emitter);
- return emitHelper.emitProlog(frame);
-}
-
-static Error ASMJIT_CDECL Emitter_emitEpilog(BaseEmitter* emitter, const FuncFrame& frame) {
- EmitHelper emitHelper(emitter);
- return emitHelper.emitEpilog(frame);
-}
-
-static Error ASMJIT_CDECL Emitter_emitArgsAssignment(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
- EmitHelper emitHelper(emitter);
- return emitHelper.emitArgsAssignment(frame, args);
-}
-
-void assignEmitterFuncs(BaseEmitter* emitter) {
- emitter->_funcs.emitProlog = Emitter_emitProlog;
- emitter->_funcs.emitEpilog = Emitter_emitEpilog;
- emitter->_funcs.emitArgsAssignment = Emitter_emitArgsAssignment;
-
-#ifndef ASMJIT_NO_LOGGING
- emitter->_funcs.formatInstruction = FormatterInternal::formatInstruction;
-#endif
-
-#ifndef ASMJIT_NO_VALIDATION
- emitter->_funcs.validate = InstInternal::validate;
-#endif
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h b/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h
deleted file mode 100644
index 6e10f9eaabe..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64emithelper_p.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED
-#define ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED
-
-#include "../core/api-config.h"
-
-#include "../core/emithelper_p.h"
-#include "../core/func.h"
-#include "../arm/a64emitter.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-class EmitHelper : public BaseEmitHelper {
-public:
- ASMJIT_INLINE_NODEBUG explicit EmitHelper(BaseEmitter* emitter = nullptr) noexcept
- : BaseEmitHelper(emitter) {}
-
- Error emitRegMove(
- const Operand_& dst_,
- const Operand_& src_, TypeId typeId, const char* comment = nullptr) override;
-
- Error emitRegSwap(
- const BaseReg& a,
- const BaseReg& b, const char* comment = nullptr) override;
-
- Error emitArgMove(
- const BaseReg& dst_, TypeId dstTypeId,
- const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr) override;
-
- Error emitProlog(const FuncFrame& frame);
- Error emitEpilog(const FuncFrame& frame);
-};
-
-void assignEmitterFuncs(BaseEmitter* emitter);
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_A64EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64emitter.h b/3rdparty/asmjit/src/asmjit/arm/a64emitter.h
deleted file mode 100644
index 43484344526..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64emitter.h
+++ /dev/null
@@ -1,1232 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64EMITTER_H_INCLUDED
-#define ASMJIT_ARM_A64EMITTER_H_INCLUDED
-
-#include "../core/emitter.h"
-#include "../core/support.h"
-#include "../arm/a64instdb.h"
-#include "../arm/a64operand.h"
-
-// MSVC targeting AArch64 defines a lot of macros without underscores clashing
-// with AArch64 instruction names. We have to workaround until it's fixed in SDK.
-#if defined(_MSC_VER) && defined(mvn)
- #define ASMJIT_RESTORE_MSVC_AARCH64_MACROS
- #pragma push_macro("mvn")
- #undef mvn
-#endif
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-#define ASMJIT_INST_0x(NAME, ID) \
- inline Error NAME() { return _emitter()->_emitI(Inst::kId##ID); }
-
-#define ASMJIT_INST_1x(NAME, ID, T0) \
- inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); }
-
-#define ASMJIT_INST_2x(NAME, ID, T0, T1) \
- inline Error NAME(const T0& o0, const T1& o1) { return _emitter()->_emitI(Inst::kId##ID, o0, o1); }
-
-#define ASMJIT_INST_3x(NAME, ID, T0, T1, T2) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2); }
-
-#define ASMJIT_INST_4x(NAME, ID, T0, T1, T2, T3) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3); }
-
-#define ASMJIT_INST_5x(NAME, ID, T0, T1, T2, T3, T4) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4); }
-
-#define ASMJIT_INST_6x(NAME, ID, T0, T1, T2, T3, T4, T5) \
- inline Error NAME(const T0& o0, const T1& o1, const T2& o2, const T3& o3, const T4& o4, const T5& o5) { return _emitter()->_emitI(Inst::kId##ID, o0, o1, o2, o3, o4, o5); }
-
-#define ASMJIT_INST_1cc(NAME, ID, T0) \
- inline Error NAME(const T0& o0) { return _emitter()->_emitI(Inst::kId##ID, o0); } \
- \
- inline Error NAME(CondCode cc, const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, cc), o0); } \
- \
- inline Error NAME##_eq(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kEQ), o0); } \
- inline Error NAME##_ne(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kNE), o0); } \
- inline Error NAME##_cs(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kCS), o0); } \
- inline Error NAME##_hs(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kHS), o0); } \
- inline Error NAME##_cc(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kCC), o0); } \
- inline Error NAME##_lo(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLO), o0); } \
- inline Error NAME##_mi(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kMI), o0); } \
- inline Error NAME##_pl(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kPL), o0); } \
- inline Error NAME##_vs(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kVS), o0); } \
- inline Error NAME##_vc(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kVC), o0); } \
- inline Error NAME##_hi(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kHI), o0); } \
- inline Error NAME##_ls(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLS), o0); } \
- inline Error NAME##_ge(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kGE), o0); } \
- inline Error NAME##_lt(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLT), o0); } \
- inline Error NAME##_gt(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kGT), o0); } \
- inline Error NAME##_le(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kLE), o0); } \
- inline Error NAME##_al(const T0& o0) { return _emitter()->_emitI(BaseInst::composeARMInstId(Inst::kId##ID, CondCode::kAL), o0); }
-
-//! \addtogroup asmjit_a64
-//! \{
-
-//! ARM emitter.
-//!
-//! NOTE: This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
-//! \ref Assembler, \ref Builder, or \ref Compiler (use with caution with \ref Compiler as it expects virtual
-//! registers to be used).
-template<typename This>
-struct EmitterExplicitT {
- //! \cond
-
- // These two are unfortunately reported by the sanitizer. We know what we do, however, the sanitizer doesn't.
- // I have tried to use reinterpret_cast instead, but that would generate bad code when compiled by MSC.
- ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG This* _emitter() noexcept { return static_cast<This*>(this); }
- ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF ASMJIT_INLINE_NODEBUG const This* _emitter() const noexcept { return static_cast<const This*>(this); }
-
- //! \endcond
-
- //! \name General Purpose Instructions
- //! \{
-
- ASMJIT_INST_3x(adc, Adc, Gp, Gp, Gp)
- ASMJIT_INST_3x(adcs, Adcs, Gp, Gp, Gp)
-
- ASMJIT_INST_3x(add, Add, Gp, Gp, Gp)
- ASMJIT_INST_4x(add, Add, Gp, Gp, Gp, Imm)
- ASMJIT_INST_3x(add, Add, Gp, Gp, Imm)
- ASMJIT_INST_4x(add, Add, Gp, Gp, Imm, Imm)
- ASMJIT_INST_3x(adds, Adds, Gp, Gp, Gp)
- ASMJIT_INST_3x(adds, Adds, Gp, Gp, Imm)
- ASMJIT_INST_4x(adds, Adds, Gp, Gp, Gp, Imm)
- ASMJIT_INST_4x(adds, Adds, Gp, Gp, Imm, Imm)
-
- ASMJIT_INST_2x(adr, Adr, Gp, Imm)
- ASMJIT_INST_2x(adr, Adr, Gp, Label)
- ASMJIT_INST_2x(adrp, Adrp, Gp, Imm)
- ASMJIT_INST_2x(adrp, Adrp, Gp, Label)
-
- ASMJIT_INST_3x(and_, And, Gp, Gp, Imm)
- ASMJIT_INST_3x(and_, And, Gp, Gp, Gp)
- ASMJIT_INST_4x(and_, And, Gp, Gp, Gp, Imm)
- ASMJIT_INST_3x(ands, Ands, Gp, Gp, Imm)
- ASMJIT_INST_3x(ands, Ands, Gp, Gp, Gp)
- ASMJIT_INST_4x(ands, Ands, Gp, Gp, Gp, Imm)
-
- ASMJIT_INST_3x(asr, Asr, Gp, Gp, Imm)
- ASMJIT_INST_3x(asr, Asr, Gp, Gp, Gp)
- ASMJIT_INST_3x(asrv, Asrv, Gp, Gp, Gp)
-
- ASMJIT_INST_2x(at, At, Imm, Gp)
-
- ASMJIT_INST_3x(bfc, Bfc, Gp, Imm, Imm)
- ASMJIT_INST_4x(bfi, Bfi, Gp, Gp, Imm, Imm)
- ASMJIT_INST_4x(bfm, Bfm, Gp, Gp, Imm, Imm)
- ASMJIT_INST_4x(bfxil, Bfxil, Gp, Gp, Imm, Imm)
-
- ASMJIT_INST_3x(bic, Bic, Gp, Gp, Imm);
- ASMJIT_INST_3x(bic, Bic, Gp, Gp, Gp);
- ASMJIT_INST_4x(bic, Bic, Gp, Gp, Gp, Imm);
- ASMJIT_INST_3x(bics, Bics, Gp, Gp, Imm);
- ASMJIT_INST_3x(bics, Bics, Gp, Gp, Gp);
- ASMJIT_INST_4x(bics, Bics, Gp, Gp, Gp, Imm);
-
- ASMJIT_INST_1x(brk, Brk, Imm)
-
- ASMJIT_INST_4x(ccmn, Ccmn, Gp, Gp, Imm, Imm);
- ASMJIT_INST_4x(ccmn, Ccmn, Gp, Imm, Imm, Imm);
- ASMJIT_INST_4x(ccmp, Ccmp, Gp, Gp, Imm, Imm);
- ASMJIT_INST_4x(ccmp, Ccmp, Gp, Imm, Imm, Imm);
-
- ASMJIT_INST_3x(cinc, Cinc, Gp, Gp, Imm);
- ASMJIT_INST_3x(cinv, Cinv, Gp, Gp, Imm);
-
- ASMJIT_INST_1x(clrex, Clrex, Imm)
-
- ASMJIT_INST_2x(cls, Cls, Gp, Gp)
- ASMJIT_INST_2x(clz, Clz, Gp, Gp)
-
- ASMJIT_INST_2x(cmn, Cmn, Gp, Gp)
- ASMJIT_INST_3x(cmn, Cmn, Gp, Gp, Imm)
- ASMJIT_INST_2x(cmn, Cmn, Gp, Imm)
- ASMJIT_INST_3x(cmn, Cmn, Gp, Imm, Imm)
- ASMJIT_INST_2x(cmp, Cmp, Gp, Gp)
- ASMJIT_INST_3x(cmp, Cmp, Gp, Gp, Imm)
- ASMJIT_INST_2x(cmp, Cmp, Gp, Imm)
- ASMJIT_INST_3x(cmp, Cmp, Gp, Imm, Imm)
-
- ASMJIT_INST_3x(cneg, Cneg, Gp, Gp, Imm);
-
- ASMJIT_INST_4x(csel, Csel, Gp, Gp, Gp, Imm);
- ASMJIT_INST_2x(cset, Cset, Gp, Imm);
- ASMJIT_INST_2x(csetm, Csetm, Gp, Imm);
-
- ASMJIT_INST_4x(csinc, Csinc, Gp, Gp, Gp, Imm);
- ASMJIT_INST_4x(csinv, Csinv, Gp, Gp, Gp, Imm);
- ASMJIT_INST_4x(csneg, Csneg, Gp, Gp, Gp, Imm);
-
- ASMJIT_INST_2x(dc, Dc, Imm, Gp)
- ASMJIT_INST_1x(dmb, Dmb, Imm)
- ASMJIT_INST_1x(dsb, Dsb, Imm)
- ASMJIT_INST_0x(drps, Drps)
-
- ASMJIT_INST_3x(eon, Eon, Gp, Gp, Gp)
- ASMJIT_INST_4x(eon, Eon, Gp, Gp, Gp, Imm)
-
- ASMJIT_INST_3x(eor, Eor, Gp, Gp, Imm)
- ASMJIT_INST_3x(eor, Eor, Gp, Gp, Gp)
- ASMJIT_INST_4x(eor, Eor, Gp, Gp, Gp, Imm)
-
- ASMJIT_INST_0x(eret, Eret)
- ASMJIT_INST_0x(esb, Esb)
-
- ASMJIT_INST_4x(extr, Extr, Gp, Gp, Gp, Imm)
-
- ASMJIT_INST_1x(hlt, Hlt, Imm)
- ASMJIT_INST_1x(hvc, Hvc, Imm)
- ASMJIT_INST_2x(ic, Ic, Imm, Gp)
- ASMJIT_INST_1x(isb, Isb, Imm)
-
- ASMJIT_INST_3x(lsl, Lsl, Gp, Gp, Imm)
- ASMJIT_INST_3x(lsl, Lsl, Gp, Gp, Gp)
- ASMJIT_INST_3x(lslv, Lslv, Gp, Gp, Gp)
-
- ASMJIT_INST_3x(lsr, Lsr, Gp, Gp, Imm)
- ASMJIT_INST_3x(lsr, Lsr, Gp, Gp, Gp)
- ASMJIT_INST_3x(lsrv, Lsrv, Gp, Gp, Gp)
-
- ASMJIT_INST_4x(madd, Madd, Gp, Gp, Gp, Gp)
- ASMJIT_INST_3x(mneg, Mneg, Gp, Gp, Gp)
-
- ASMJIT_INST_2x(mov, Mov, Gp, Gp)
- ASMJIT_INST_2x(mov, Mov, Gp, Imm)
- ASMJIT_INST_2x(movk, Movk, Gp, Imm)
- ASMJIT_INST_3x(movk, Movk, Gp, Imm, Imm)
- ASMJIT_INST_2x(movn, Movn, Gp, Imm)
- ASMJIT_INST_3x(movn, Movn, Gp, Imm, Imm)
- ASMJIT_INST_2x(movz, Movz, Gp, Imm)
- ASMJIT_INST_3x(movz, Movz, Gp, Imm, Imm)
-
- ASMJIT_INST_2x(mrs, Mrs, Gp, Imm)
- ASMJIT_INST_2x(msr, Msr, Imm, Gp)
- ASMJIT_INST_2x(msr, Msr, Imm, Imm)
-
- ASMJIT_INST_4x(msub, Msub, Gp, Gp, Gp, Gp)
- ASMJIT_INST_3x(mul, Mul, Gp, Gp, Gp)
-
- ASMJIT_INST_2x(mvn, Mvn, Gp, Gp)
- ASMJIT_INST_3x(mvn, Mvn, Gp, Gp, Imm)
-
- ASMJIT_INST_2x(neg, Neg, Gp, Gp)
- ASMJIT_INST_3x(neg, Neg, Gp, Gp, Imm)
- ASMJIT_INST_2x(negs, Negs, Gp, Gp)
- ASMJIT_INST_3x(negs, Negs, Gp, Gp, Imm)
-
- ASMJIT_INST_2x(ngc, Ngc, Gp, Gp)
- ASMJIT_INST_2x(ngcs, Ngcs, Gp, Gp)
-
- ASMJIT_INST_3x(orn, Orn, Gp, Gp, Gp)
- ASMJIT_INST_4x(orn, Orn, Gp, Gp, Gp, Imm)
-
- ASMJIT_INST_3x(orr, Orr, Gp, Gp, Imm)
- ASMJIT_INST_3x(orr, Orr, Gp, Gp, Gp)
- ASMJIT_INST_4x(orr, Orr, Gp, Gp, Gp, Imm)
-
- ASMJIT_INST_2x(rbit, Rbit, Gp, Gp)
- ASMJIT_INST_1x(ret, Ret, Gp)
-
- ASMJIT_INST_2x(rev, Rev, Gp, Gp)
- ASMJIT_INST_2x(rev16, Rev16, Gp, Gp)
- ASMJIT_INST_2x(rev32, Rev32, Gp, Gp)
- ASMJIT_INST_2x(rev64, Rev64, Gp, Gp)
-
- ASMJIT_INST_3x(ror, Ror, Gp, Gp, Imm)
- ASMJIT_INST_3x(ror, Ror, Gp, Gp, Gp)
- ASMJIT_INST_3x(rorv, Rorv, Gp, Gp, Gp)
-
- ASMJIT_INST_3x(sbc, Sbc, Gp, Gp, Gp)
- ASMJIT_INST_3x(sbcs, Sbcs, Gp, Gp, Gp)
-
- ASMJIT_INST_4x(sbfiz, Sbfiz, Gp, Gp, Imm, Imm)
- ASMJIT_INST_4x(sbfm, Sbfm, Gp, Gp, Imm, Imm)
- ASMJIT_INST_4x(sbfx, Sbfx, Gp, Gp, Imm, Imm)
-
- ASMJIT_INST_3x(sdiv, Sdiv, Gp, Gp, Gp)
-
- ASMJIT_INST_4x(smaddl, Smaddl, Gp, Gp, Gp, Gp)
- ASMJIT_INST_1x(smc, Smc, Imm)
- ASMJIT_INST_3x(smnegl, Smnegl, Gp, Gp, Gp)
- ASMJIT_INST_4x(smsubl, Smsubl, Gp, Gp, Gp, Gp)
- ASMJIT_INST_3x(smulh, Smulh, Gp, Gp, Gp)
- ASMJIT_INST_3x(smull, Smull, Gp, Gp, Gp)
-
- ASMJIT_INST_3x(sub, Sub, Gp, Gp, Gp)
- ASMJIT_INST_4x(sub, Sub, Gp, Gp, Gp, Imm)
- ASMJIT_INST_3x(sub, Sub, Gp, Gp, Imm)
- ASMJIT_INST_4x(sub, Sub, Gp, Gp, Imm, Imm)
- ASMJIT_INST_3x(subs, Subs, Gp, Gp, Gp)
- ASMJIT_INST_4x(subs, Subs, Gp, Gp, Gp, Imm)
- ASMJIT_INST_3x(subs, Subs, Gp, Gp, Imm)
- ASMJIT_INST_4x(subs, Subs, Gp, Gp, Imm, Imm)
-
- ASMJIT_INST_1x(svc, Svc, Imm)
-
- ASMJIT_INST_2x(sxtb, Sxtb, Gp, Gp)
- ASMJIT_INST_2x(sxth, Sxth, Gp, Gp)
- ASMJIT_INST_2x(sxtw, Sxtw, Gp, Gp)
-
- ASMJIT_INST_4x(sys, Sys, Imm, Imm, Imm, Imm)
- ASMJIT_INST_5x(sys, Sys, Imm, Imm, Imm, Imm, Gp)
-
- ASMJIT_INST_2x(tlbi, Tlbi, Imm, Gp)
- ASMJIT_INST_2x(tst, Tst, Gp, Imm)
- ASMJIT_INST_2x(tst, Tst, Gp, Gp)
- ASMJIT_INST_3x(tst, Tst, Gp, Gp, Imm)
-
- ASMJIT_INST_3x(udiv, Udiv, Gp, Gp, Gp)
-
- ASMJIT_INST_4x(ubfiz, Ubfiz, Gp, Gp, Imm, Imm)
- ASMJIT_INST_4x(ubfm, Ubfm, Gp, Gp, Imm, Imm)
- ASMJIT_INST_4x(ubfx, Ubfx, Gp, Gp, Imm, Imm)
-
- ASMJIT_INST_4x(umaddl, Umaddl, Gp, Gp, Gp, Gp)
- ASMJIT_INST_3x(umnegl, Umnegl, Gp, Gp, Gp)
- ASMJIT_INST_4x(umsubl, Umsubl, Gp, Gp, Gp, Gp)
- ASMJIT_INST_3x(umull, Umull, Gp, Gp, Gp)
- ASMJIT_INST_3x(umulh, Umulh, Gp, Gp, Gp)
-
- ASMJIT_INST_2x(uxtb, Uxtb, Gp, Gp)
- ASMJIT_INST_2x(uxth, Uxth, Gp, Gp)
-
- ASMJIT_INST_0x(csdb, Csdb)
- ASMJIT_INST_1x(dcps1, Dcps1, Imm)
- ASMJIT_INST_1x(dcps2, Dcps2, Imm)
- ASMJIT_INST_1x(dcps3, Dcps3, Imm)
- ASMJIT_INST_0x(dgh, Dgh)
- ASMJIT_INST_0x(pssbb, Pssbb)
- ASMJIT_INST_0x(ssbb, Ssbb)
- ASMJIT_INST_1x(udf, Udf, Imm)
- ASMJIT_INST_1x(setf8, Setf8, Gp)
- ASMJIT_INST_1x(setf16, Setf16, Gp)
-
- //! \}
-
- //! \name ARMv8.4 Instructions
- //! \{
-
- ASMJIT_INST_0x(cfinv, Cfinv)
-
- //! \}
-
- //! \name ARMv8.5 Instructions
- //! \{
-
- ASMJIT_INST_0x(axflag, Axflag)
- ASMJIT_INST_0x(xaflag, Xaflag)
-
- //! \}
-
- //! \name Branch Instructions
- //! \{
-
- ASMJIT_INST_1cc(b, B, Imm)
- ASMJIT_INST_1cc(b, B, Label)
- ASMJIT_INST_1x(bl, Bl, Imm)
- ASMJIT_INST_1x(bl, Bl, Label)
- ASMJIT_INST_1x(blr, Blr, Gp)
- ASMJIT_INST_1x(br, Br, Gp)
- ASMJIT_INST_2x(cbz, Cbz, Gp, Imm)
- ASMJIT_INST_2x(cbz, Cbz, Gp, Label)
- ASMJIT_INST_2x(cbnz, Cbnz, Gp, Imm)
- ASMJIT_INST_2x(cbnz, Cbnz, Gp, Label)
- ASMJIT_INST_3x(tbnz, Tbnz, Gp, Imm, Imm)
- ASMJIT_INST_3x(tbnz, Tbnz, Gp, Imm, Label)
- ASMJIT_INST_3x(tbz, Tbz, Gp, Imm, Imm)
- ASMJIT_INST_3x(tbz, Tbz, Gp, Imm, Label)
-
- //! \}
-
- //! \name Load & Store Instructions
- //! \{
-
- ASMJIT_INST_3x(cas, Cas, Gp, Gp, Mem)
- ASMJIT_INST_3x(casa, Casa, Gp, Gp, Mem)
- ASMJIT_INST_3x(casab, Casab, Gp, Gp, Mem)
- ASMJIT_INST_3x(casah, Casah, Gp, Gp, Mem)
- ASMJIT_INST_3x(casal, Casal, Gp, Gp, Mem)
- ASMJIT_INST_3x(casalb, Casalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(casalh, Casalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(casb, Casb, Gp, Gp, Mem)
- ASMJIT_INST_3x(cash, Cash, Gp, Gp, Mem)
- ASMJIT_INST_3x(casl, Casl, Gp, Gp, Mem)
- ASMJIT_INST_3x(caslb, Caslb, Gp, Gp, Mem)
- ASMJIT_INST_3x(caslh, Caslh, Gp, Gp, Mem)
-
- ASMJIT_INST_5x(casp, Casp, Gp, Gp, Gp, Gp, Mem)
- ASMJIT_INST_5x(caspa, Caspa, Gp, Gp, Gp, Gp, Mem)
- ASMJIT_INST_5x(caspal, Caspal, Gp, Gp, Gp, Gp, Mem)
- ASMJIT_INST_5x(caspl, Caspl, Gp, Gp, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(ldadd, Ldadd, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldadda, Ldadda, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddab, Ldaddab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddah, Ldaddah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddal, Ldaddal, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddalb, Ldaddalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddalh, Ldaddalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddb, Ldaddb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddh, Ldaddh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddl, Ldaddl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddlb, Ldaddlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaddlh, Ldaddlh, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(ldar, Ldar, Gp, Mem)
- ASMJIT_INST_2x(ldarb, Ldarb, Gp, Mem)
- ASMJIT_INST_2x(ldarh, Ldarh, Gp, Mem)
-
- ASMJIT_INST_2x(ldaxr, Ldaxr, Gp, Mem)
- ASMJIT_INST_2x(ldaxrb, Ldaxrb, Gp, Mem)
- ASMJIT_INST_2x(ldaxrh, Ldaxrh, Gp, Mem)
-
- ASMJIT_INST_3x(ldclr, Ldclr, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclra, Ldclra, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrab, Ldclrab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrah, Ldclrah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclral, Ldclral, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclralb, Ldclralb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclralh, Ldclralh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrb, Ldclrb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrh, Ldclrh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrl, Ldclrl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrlb, Ldclrlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldclrlh, Ldclrlh, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(ldeor, Ldeor, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeora, Ldeora, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorab, Ldeorab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorah, Ldeorah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeoral, Ldeoral, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeoralb, Ldeoralb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeoralh, Ldeoralh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorb, Ldeorb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorh, Ldeorh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorl, Ldeorl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorlb, Ldeorlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldeorlh, Ldeorlh, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(ldlar, Ldlar, Gp, Mem)
- ASMJIT_INST_2x(ldlarb, Ldlarb, Gp, Mem)
- ASMJIT_INST_2x(ldlarh, Ldlarh, Gp, Mem)
-
- ASMJIT_INST_3x(ldnp, Ldnp, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(ldp, Ldp, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldpsw, Ldpsw, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(ldr, Ldr, Gp, Mem)
- ASMJIT_INST_2x(ldrb, Ldrb, Gp, Mem)
- ASMJIT_INST_2x(ldrh, Ldrh, Gp, Mem)
- ASMJIT_INST_2x(ldrsb, Ldrsb, Gp, Mem)
- ASMJIT_INST_2x(ldrsh, Ldrsh, Gp, Mem)
- ASMJIT_INST_2x(ldrsw, Ldrsw, Gp, Mem)
-
- ASMJIT_INST_3x(ldset, Ldset, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldseta, Ldseta, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetab, Ldsetab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetah, Ldsetah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetal, Ldsetal, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetalb, Ldsetalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetalh, Ldsetalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetb, Ldsetb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldseth, Ldseth, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetl, Ldsetl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetlb, Ldsetlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsetlh, Ldsetlh, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(ldsmax, Ldsmax, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxa, Ldsmaxa, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxab, Ldsmaxab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxah, Ldsmaxah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxal, Ldsmaxal, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxalb, Ldsmaxalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxalh, Ldsmaxalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxb, Ldsmaxb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxh, Ldsmaxh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxl, Ldsmaxl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxlb, Ldsmaxlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmaxlh, Ldsmaxlh, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(ldsmin, Ldsmin, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsmina, Ldsmina, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminab, Ldsminab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminah, Ldsminah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminal, Ldsminal, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminalb, Ldsminalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminalh, Ldsminalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminb, Ldsminb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminh, Ldsminh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminl, Ldsminl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminlb, Ldsminlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldsminlh, Ldsminlh, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(ldtr, Ldtr, Gp, Mem)
- ASMJIT_INST_2x(ldtrb, Ldtrb, Gp, Mem)
- ASMJIT_INST_2x(ldtrh, Ldtrh, Gp, Mem)
- ASMJIT_INST_2x(ldtrsb, Ldtrsb, Gp, Mem)
- ASMJIT_INST_2x(ldtrsh, Ldtrsh, Gp, Mem)
- ASMJIT_INST_2x(ldtrsw, Ldtrsw, Gp, Mem)
-
- ASMJIT_INST_3x(ldumax, Ldumax, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxa, Ldumaxa, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxab, Ldumaxab, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxah, Ldumaxah, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxal, Ldumaxal, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxalb, Ldumaxalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxalh, Ldumaxalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxb, Ldumaxb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxh, Ldumaxh, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxl, Ldumaxl, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxlb, Ldumaxlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumaxlh, Ldumaxlh, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(ldumin, Ldumin, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldumina, Ldumina, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminab, Lduminab, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminah, Lduminah, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminal, Lduminal, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminalb, Lduminalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminalh, Lduminalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminb, Lduminb, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminh, Lduminh, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminl, Lduminl, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminlb, Lduminlb, Gp, Gp, Mem)
- ASMJIT_INST_3x(lduminlh, Lduminlh, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(ldur, Ldur, Gp, Mem)
- ASMJIT_INST_2x(ldurb, Ldurb, Gp, Mem)
- ASMJIT_INST_2x(ldurh, Ldurh, Gp, Mem)
- ASMJIT_INST_2x(ldursb, Ldursb, Gp, Mem)
- ASMJIT_INST_2x(ldursh, Ldursh, Gp, Mem)
- ASMJIT_INST_2x(ldursw, Ldursw, Gp, Mem)
-
- ASMJIT_INST_3x(ldxp, Ldxp, Gp, Gp, Mem)
- ASMJIT_INST_3x(ldaxp, Ldaxp, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(ldxr, Ldxr, Gp, Mem)
- ASMJIT_INST_2x(ldxrb, Ldxrb, Gp, Mem)
- ASMJIT_INST_2x(ldxrh, Ldxrh, Gp, Mem)
-
- ASMJIT_INST_2x(prfm, Prfm, Imm, Mem)
-
- ASMJIT_INST_2x(stadd, Stadd, Gp, Mem)
- ASMJIT_INST_2x(staddb, Staddb, Gp, Mem)
- ASMJIT_INST_2x(staddh, Staddh, Gp, Mem)
- ASMJIT_INST_2x(staddl, Staddl, Gp, Mem)
- ASMJIT_INST_2x(staddlb, Staddlb, Gp, Mem)
- ASMJIT_INST_2x(staddlh, Staddlh, Gp, Mem)
-
- ASMJIT_INST_2x(stclr, Stclr, Gp, Mem)
- ASMJIT_INST_2x(stclrb, Stclrb, Gp, Mem)
- ASMJIT_INST_2x(stclrh, Stclrh, Gp, Mem)
- ASMJIT_INST_2x(stclrl, Stclrl, Gp, Mem)
- ASMJIT_INST_2x(stclrlb, Stclrlb, Gp, Mem)
- ASMJIT_INST_2x(stclrlh, Stclrlh, Gp, Mem)
-
- ASMJIT_INST_2x(steor, Steor, Gp, Mem)
- ASMJIT_INST_2x(steorb, Steorb, Gp, Mem)
- ASMJIT_INST_2x(steorh, Steorh, Gp, Mem)
- ASMJIT_INST_2x(steorl, Steorl, Gp, Mem)
- ASMJIT_INST_2x(steorlb, Steorlb, Gp, Mem)
- ASMJIT_INST_2x(steorlh, Steorlh, Gp, Mem)
-
- ASMJIT_INST_2x(stllr, Stllr, Gp, Mem)
- ASMJIT_INST_2x(stllrb, Stllrb, Gp, Mem)
- ASMJIT_INST_2x(stllrh, Stllrh, Gp, Mem)
-
- ASMJIT_INST_2x(stlr, Stllr, Gp, Mem)
- ASMJIT_INST_2x(stlrb, Stllrb, Gp, Mem)
- ASMJIT_INST_2x(stlrh, Stllrh, Gp, Mem)
-
- ASMJIT_INST_3x(stlxr, Stlxr, Gp, Gp, Mem)
- ASMJIT_INST_3x(stlxrb, Stlxrb, Gp, Gp, Mem)
- ASMJIT_INST_3x(stlxrh, Stlxrh, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(stnp, Stnp, Gp, Gp, Mem)
- ASMJIT_INST_3x(stp, Stp, Gp, Gp, Mem)
-
- ASMJIT_INST_2x(str, Str, Gp, Mem)
- ASMJIT_INST_2x(strb, Strb, Gp, Mem)
- ASMJIT_INST_2x(strh, Strh, Gp, Mem)
-
- ASMJIT_INST_2x(stset, Stset, Gp, Mem)
- ASMJIT_INST_2x(stsetb, Stsetb, Gp, Mem)
- ASMJIT_INST_2x(stseth, Stseth, Gp, Mem)
- ASMJIT_INST_2x(stsetl, Stsetl, Gp, Mem)
- ASMJIT_INST_2x(stsetlb, Stsetlb, Gp, Mem)
- ASMJIT_INST_2x(stsetlh, Stsetlh, Gp, Mem)
-
- ASMJIT_INST_2x(stsmax, Stsmax, Gp, Mem)
- ASMJIT_INST_2x(stsmaxb, Stsmaxb, Gp, Mem)
- ASMJIT_INST_2x(stsmaxh, Stsmaxh, Gp, Mem)
- ASMJIT_INST_2x(stsmaxl, Stsmaxl, Gp, Mem)
- ASMJIT_INST_2x(stsmaxlb, Stsmaxlb, Gp, Mem)
- ASMJIT_INST_2x(stsmaxlh, Stsmaxlh, Gp, Mem)
-
- ASMJIT_INST_2x(stsmin, Stsmin, Gp, Mem)
- ASMJIT_INST_2x(stsminb, Stsminb, Gp, Mem)
- ASMJIT_INST_2x(stsminh, Stsminh, Gp, Mem)
- ASMJIT_INST_2x(stsminl, Stsminl, Gp, Mem)
- ASMJIT_INST_2x(stsminlb, Stsminlb, Gp, Mem)
- ASMJIT_INST_2x(stsminlh, Stsminlh, Gp, Mem)
-
- ASMJIT_INST_2x(sttr, Sttr, Gp, Mem)
- ASMJIT_INST_2x(sttrb, Sttrb, Gp, Mem)
- ASMJIT_INST_2x(sttrh, Sttrh, Gp, Mem)
-
- ASMJIT_INST_2x(stumax, Stumax, Gp, Mem)
- ASMJIT_INST_2x(stumaxb, Stumaxb, Gp, Mem)
- ASMJIT_INST_2x(stumaxh, Stumaxh, Gp, Mem)
- ASMJIT_INST_2x(stumaxl, Stumaxl, Gp, Mem)
- ASMJIT_INST_2x(stumaxlb, Stumaxlb, Gp, Mem)
- ASMJIT_INST_2x(stumaxlh, Stumaxlh, Gp, Mem)
-
- ASMJIT_INST_2x(stumin, Stumin, Gp, Mem)
- ASMJIT_INST_2x(stuminb, Stuminb, Gp, Mem)
- ASMJIT_INST_2x(stuminh, Stuminh, Gp, Mem)
- ASMJIT_INST_2x(stuminl, Stuminl, Gp, Mem)
- ASMJIT_INST_2x(stuminlb, Stuminlb, Gp, Mem)
- ASMJIT_INST_2x(stuminlh, Stuminlh, Gp, Mem)
-
- ASMJIT_INST_2x(stur, Stur, Gp, Mem)
- ASMJIT_INST_2x(sturb, Sturb, Gp, Mem)
- ASMJIT_INST_2x(sturh, Sturh, Gp, Mem)
-
- ASMJIT_INST_4x(stxp, Stxp, Gp, Gp, Gp, Mem)
- ASMJIT_INST_4x(stlxp, Stlxp, Gp, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(stxr, Stxr, Gp, Gp, Mem)
- ASMJIT_INST_3x(stxrb, Stxrb, Gp, Gp, Mem)
- ASMJIT_INST_3x(stxrh, Stxrh, Gp, Gp, Mem)
-
- ASMJIT_INST_3x(swp, Swp, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpa, Swpa, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpab, Swpab, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpah, Swpah, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpal, Swpal, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpalb, Swpalb, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpalh, Swpalh, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpb, Swpb, Gp, Gp, Mem)
- ASMJIT_INST_3x(swph, Swph, Gp, Gp, Mem)
- ASMJIT_INST_3x(swpl, Swpl, Gp, Gp, Mem)
- ASMJIT_INST_3x(swplb, Swplb, Gp, Gp, Mem)
- ASMJIT_INST_3x(swplh, Swplh, Gp, Gp, Mem)
- //! \}
-
- //! \name CRC Instructions (ARMv8.1-A, optional in ARMv8.0-A)
- //! \{
-
- ASMJIT_INST_3x(crc32b, Crc32b, Gp, Gp, Gp);
- ASMJIT_INST_3x(crc32h, Crc32h, Gp, Gp, Gp);
- ASMJIT_INST_3x(crc32w, Crc32w, Gp, Gp, Gp);
- ASMJIT_INST_3x(crc32x, Crc32x, Gp, Gp, Gp);
-
- ASMJIT_INST_3x(crc32cb, Crc32cb, Gp, Gp, Gp);
- ASMJIT_INST_3x(crc32ch, Crc32ch, Gp, Gp, Gp);
- ASMJIT_INST_3x(crc32cw, Crc32cw, Gp, Gp, Gp);
- ASMJIT_INST_3x(crc32cx, Crc32cx, Gp, Gp, Gp);
-
- //! \}
-
- //! \name MTE Instructions
- //! \{
-
- ASMJIT_INST_2x(autda, Autda, Gp, Gp);
- ASMJIT_INST_2x(autdb, Autdb, Gp, Gp);
- ASMJIT_INST_1x(autdza, Autdza, Gp);
- ASMJIT_INST_1x(autdzb, Autdzb, Gp);
- ASMJIT_INST_2x(autia, Autia, Gp, Gp);
- ASMJIT_INST_0x(autia1716, Autia1716);
- ASMJIT_INST_0x(autiasp, Autiasp);
- ASMJIT_INST_0x(autiaz, Autiaz);
- ASMJIT_INST_2x(autib, Autib, Gp, Gp);
- ASMJIT_INST_0x(autib1716, Autib1716);
- ASMJIT_INST_0x(autibsp, Autibsp);
- ASMJIT_INST_0x(autibz, Autibz);
- ASMJIT_INST_1x(autiza, Autiza, Gp);
- ASMJIT_INST_1x(autizb, Autizb, Gp);
-
- ASMJIT_INST_3x(gmi, Gmi, Gp, Gp, Gp);
-
- ASMJIT_INST_2x(cmpp, Cmpp, Gp, Gp);
- ASMJIT_INST_4x(addg, Addg, Gp, Gp, Imm, Imm);
-
- ASMJIT_INST_2x(ldg, Ldg, Gp, Mem)
- ASMJIT_INST_2x(ldgm, Ldgm, Gp, Mem)
- ASMJIT_INST_2x(ldraa, Ldraa, Gp, Mem)
- ASMJIT_INST_2x(ldrab, Ldrab, Gp, Mem)
-
- ASMJIT_INST_2x(pacda, Pacda, Gp, Gp);
- ASMJIT_INST_2x(pacdb, Pacdb, Gp, Gp);
- ASMJIT_INST_1x(pacdza, Pacdza, Gp);
- ASMJIT_INST_1x(pacdzb, Pacdzb, Gp);
- ASMJIT_INST_3x(pacga, Pacga, Gp, Gp, Gp);
-
- ASMJIT_INST_3x(subp, Subp, Gp, Gp, Gp);
- ASMJIT_INST_3x(subps, Subps, Gp, Gp, Gp);
- ASMJIT_INST_4x(subg, Subg, Gp, Gp, Imm, Imm);
-
- ASMJIT_INST_2x(st2g, St2g, Gp, Mem)
- ASMJIT_INST_2x(stg, Stg, Gp, Mem)
- ASMJIT_INST_3x(stgp, Stgp, Gp, Gp, Mem)
- ASMJIT_INST_2x(stgm, Stgm, Gp, Mem)
- ASMJIT_INST_2x(stzg, Stzg, Gp, Mem)
- ASMJIT_INST_2x(stz2g, Stz2g, Gp, Mem)
- ASMJIT_INST_2x(stzgm, Stzgm, Gp, Mem)
-
- ASMJIT_INST_1x(xpacd, Xpacd, Gp);
- ASMJIT_INST_1x(xpaci, Xpaci, Gp);
- ASMJIT_INST_0x(xpaclri, Xpaclri);
-
- //! \}
-
- //! \name Hint Instructions
- //! \{
-
- ASMJIT_INST_1x(hint, Hint, Imm)
- ASMJIT_INST_0x(nop, Nop)
- ASMJIT_INST_0x(sev, Sev)
- ASMJIT_INST_0x(sevl, Sevl)
- ASMJIT_INST_0x(wfe, Wfe)
- ASMJIT_INST_0x(wfi, Wfi)
- ASMJIT_INST_0x(yield, Yield)
-
- //! \}
-
- //! \name SIMD & FP Instructions
- //! \{
-
- ASMJIT_INST_2x(abs, Abs_v, Vec, Vec);
- ASMJIT_INST_3x(add, Add_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(addhn, Addhn_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(addhn2, Addhn2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(addp, Addp_v, Vec, Vec);
- ASMJIT_INST_3x(addp, Addp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(addv, Addv_v, Vec, Vec);
- ASMJIT_INST_3x(and_, And_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(bic, Bic_v, Vec, Imm);
- ASMJIT_INST_3x(bic, Bic_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(bic, Bic_v, Vec, Imm, Imm);
- ASMJIT_INST_3x(bif, Bif_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(bit, Bit_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(bsl, Bsl_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(cls, Cls_v, Vec, Vec);
- ASMJIT_INST_2x(clz, Clz_v, Vec, Vec);
- ASMJIT_INST_3x(cmeq, Cmeq_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(cmeq, Cmeq_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(cmge, Cmge_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(cmge, Cmge_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(cmgt, Cmgt_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(cmgt, Cmgt_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(cmhi, Cmhi_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(cmhs, Cmhs_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(cmle, Cmle_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(cmlt, Cmlt_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(cmtst, Cmtst_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(cnt, Cnt_v, Vec, Vec);
- ASMJIT_INST_2x(dup, Dup_v, Vec, Gp);
- ASMJIT_INST_2x(dup, Dup_v, Vec, Vec);
- ASMJIT_INST_3x(eor, Eor_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(ext, Ext_v, Vec, Vec, Vec, Imm);
- ASMJIT_INST_3x(fabd, Fabd_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fabs, Fabs_v, Vec, Vec);
- ASMJIT_INST_3x(facge, Facge_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(facgt, Facgt_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fadd, Fadd_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(faddp, Faddp_v, Vec, Vec);
- ASMJIT_INST_3x(faddp, Faddp_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(fccmp, Fccmp_v, Vec, Vec, Imm, Imm);
- ASMJIT_INST_4x(fccmpe, Fccmpe_v, Vec, Vec, Imm, Imm);
- ASMJIT_INST_3x(fcmeq, Fcmeq_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fcmeq, Fcmeq_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(fcmge, Fcmge_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fcmge, Fcmge_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(fcmgt, Fcmgt_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fcmgt, Fcmgt_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(fcmle, Fcmle_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(fcmlt, Fcmlt_v, Vec, Vec, Imm);
- ASMJIT_INST_2x(fcmp, Fcmp_v, Vec, Vec);
- ASMJIT_INST_2x(fcmp, Fcmp_v, Vec, Imm);
- ASMJIT_INST_2x(fcmpe, Fcmpe_v, Vec, Vec);
- ASMJIT_INST_2x(fcmpe, Fcmpe_v, Vec, Imm);
- ASMJIT_INST_4x(fcsel, Fcsel_v, Vec, Vec, Vec, Imm);
- ASMJIT_INST_2x(fcvt, Fcvt_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtas, Fcvtas_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtas, Fcvtas_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtau, Fcvtau_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtau, Fcvtau_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtl, Fcvtl_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtl2, Fcvtl2_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtms, Fcvtms_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtms, Fcvtms_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtmu, Fcvtmu_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtmu, Fcvtmu_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtn, Fcvtn_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtn2, Fcvtn2_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtns, Fcvtns_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtns, Fcvtns_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtnu, Fcvtnu_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtnu, Fcvtnu_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtps, Fcvtps_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtps, Fcvtps_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtpu, Fcvtpu_v, Gp, Vec);
- ASMJIT_INST_2x(fcvtpu, Fcvtpu_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtxn, Fcvtxn_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtxn2, Fcvtxn2_v, Vec, Vec);
- ASMJIT_INST_2x(fcvtzs, Fcvtzs_v, Gp, Vec);
- ASMJIT_INST_3x(fcvtzs, Fcvtzs_v, Gp, Vec, Imm);
- ASMJIT_INST_2x(fcvtzs, Fcvtzs_v, Vec, Vec);
- ASMJIT_INST_3x(fcvtzs, Fcvtzs_v, Vec, Vec, Imm);
- ASMJIT_INST_2x(fcvtzu, Fcvtzu_v, Gp, Vec);
- ASMJIT_INST_3x(fcvtzu, Fcvtzu_v, Gp, Vec, Imm);
- ASMJIT_INST_2x(fcvtzu, Fcvtzu_v, Vec, Vec);
- ASMJIT_INST_3x(fcvtzu, Fcvtzu_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(fdiv, Fdiv_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(fmadd, Fmadd_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmax, Fmax_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmaxnm, Fmaxnm_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmaxnmp, Fmaxnmp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fmaxnmp, Fmaxnmp_v, Vec, Vec);
- ASMJIT_INST_2x(fmaxnmv, Fmaxnmv_v, Vec, Vec);
- ASMJIT_INST_3x(fmaxp, Fmaxp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fmaxp, Fmaxp_v, Vec, Vec);
- ASMJIT_INST_2x(fmaxv, Fmaxv_v, Vec, Vec);
- ASMJIT_INST_3x(fmin, Fmin_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fminnm, Fminnm_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fminnmv, Fminnmv_v, Vec, Vec);
- ASMJIT_INST_3x(fminnmp, Fminnmp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fminnmp, Fminnmp_v, Vec, Vec);
- ASMJIT_INST_2x(fminp, Fminp_v, Vec, Vec);
- ASMJIT_INST_3x(fminp, Fminp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fminv, Fminv_v, Vec, Vec);
- ASMJIT_INST_3x(fmla, Fmla_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmls, Fmls_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fmov, Fmov_v, Gp, Vec);
- ASMJIT_INST_2x(fmov, Fmov_v, Vec, Gp);
- ASMJIT_INST_2x(fmov, Fmov_v, Vec, Vec);
- ASMJIT_INST_2x(fmov, Fmov_v, Vec, Imm);
- ASMJIT_INST_4x(fmsub, Fmsub_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmul, Fmul_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmulx, Fmulx_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fneg, Fneg_v, Vec, Vec);
- ASMJIT_INST_4x(fnmadd, Fnmadd_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_4x(fnmsub, Fnmsub_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(fnmul, Fnmul_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(frecpe, Frecpe_v, Vec, Vec);
- ASMJIT_INST_3x(frecps, Frecps_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(frecpx, Frecpx_v, Vec, Vec);
- ASMJIT_INST_2x(frint32x, Frint32x_v, Vec, Vec);
- ASMJIT_INST_2x(frint32z, Frint32z_v, Vec, Vec);
- ASMJIT_INST_2x(frint64x, Frint64x_v, Vec, Vec);
- ASMJIT_INST_2x(frint64z, Frint64z_v, Vec, Vec);
- ASMJIT_INST_2x(frinta, Frinta_v, Vec, Vec);
- ASMJIT_INST_2x(frinti, Frinti_v, Vec, Vec);
- ASMJIT_INST_2x(frintm, Frintm_v, Vec, Vec);
- ASMJIT_INST_2x(frintn, Frintn_v, Vec, Vec);
- ASMJIT_INST_2x(frintp, Frintp_v, Vec, Vec);
- ASMJIT_INST_2x(frintx, Frintx_v, Vec, Vec);
- ASMJIT_INST_2x(frintz, Frintz_v, Vec, Vec);
- ASMJIT_INST_2x(frsqrte, Frsqrte_v, Vec, Vec);
- ASMJIT_INST_3x(frsqrts, Frsqrts_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(fsqrt, Fsqrt_v, Vec, Vec);
- ASMJIT_INST_3x(fsub, Fsub_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(ins, Ins_v, Vec, Gp);
- ASMJIT_INST_2x(ins, Ins_v, Vec, Vec);
- ASMJIT_INST_2x(ld1, Ld1_v, Vec, Mem);
- ASMJIT_INST_3x(ld1, Ld1_v, Vec, Vec, Mem);
- ASMJIT_INST_4x(ld1, Ld1_v, Vec, Vec, Vec, Mem);
- ASMJIT_INST_5x(ld1, Ld1_v, Vec, Vec, Vec, Vec, Mem);
- ASMJIT_INST_2x(ld1r, Ld1r_v, Vec, Mem);
- ASMJIT_INST_3x(ld2, Ld2_v, Vec, Vec, Mem);
- ASMJIT_INST_3x(ld2r, Ld2r_v, Vec, Vec, Mem);
- ASMJIT_INST_4x(ld3, Ld3_v, Vec, Vec, Vec, Mem);
- ASMJIT_INST_4x(ld3r, Ld3r_v, Vec, Vec, Vec, Mem);
- ASMJIT_INST_5x(ld4, Ld4_v, Vec, Vec, Vec, Vec, Mem);
- ASMJIT_INST_5x(ld4r, Ld4r_v, Vec, Vec, Vec, Vec, Mem);
- ASMJIT_INST_3x(ldnp, Ldnp_v, Vec, Vec, Mem);
- ASMJIT_INST_3x(ldp, Ldp_v, Vec, Vec, Mem);
- ASMJIT_INST_2x(ldr, Ldr_v, Vec, Mem);
- ASMJIT_INST_2x(ldur, Ldur_v, Vec, Mem);
- ASMJIT_INST_3x(mla, Mla_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(mls, Mls_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(mov, Mov_v, Vec, Vec);
- ASMJIT_INST_2x(mov, Mov_v, Gp, Vec);
- ASMJIT_INST_2x(mov, Mov_v, Vec, Gp);
- ASMJIT_INST_2x(movi, Movi_v, Vec, Imm);
- ASMJIT_INST_3x(movi, Movi_v, Vec, Imm, Imm);
- ASMJIT_INST_3x(mul, Mul_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(mvn, Mvn_v, Vec, Vec);
- ASMJIT_INST_2x(mvni, Mvni_v, Vec, Imm);
- ASMJIT_INST_3x(mvni, Mvni_v, Vec, Imm, Imm);
- ASMJIT_INST_2x(neg, Neg_v, Vec, Vec);
- ASMJIT_INST_2x(not_, Not_v, Vec, Vec);
- ASMJIT_INST_3x(orn, Orn_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(orr, Orr_v, Vec, Imm);
- ASMJIT_INST_3x(orr, Orr_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(orr, Orr_v, Vec, Imm, Imm);
- ASMJIT_INST_3x(pmul, Pmul_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(pmull, Pmull_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(pmull2, Pmull2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(raddhn, Raddhn_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(raddhn2, Raddhn2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(rbit, Rbit_v, Vec, Vec);
- ASMJIT_INST_2x(rev16, Rev16_v, Vec, Vec);
- ASMJIT_INST_2x(rev32, Rev32_v, Vec, Vec);
- ASMJIT_INST_2x(rev64, Rev64_v, Vec, Vec);
- ASMJIT_INST_3x(rshrn, Rshrn_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(rshrn2, Rshrn2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(rsubhn, Rsubhn_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(rsubhn2, Rsubhn2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(saba, Saba_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sabal, Sabal_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sabal2, Sabal2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sabd, Sabd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sabdl, Sabdl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sabdl2, Sabdl2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sadalp, Sadalp_v, Vec, Vec);
- ASMJIT_INST_3x(saddl, Saddl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(saddl2, Saddl2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(saddlp, Saddlp_v, Vec, Vec);
- ASMJIT_INST_2x(saddlv, Saddlv_v, Vec, Vec);
- ASMJIT_INST_3x(saddw, Saddw_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(saddw2, Saddw2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(scvtf, Scvtf_v, Vec, Gp);
- ASMJIT_INST_3x(scvtf, Scvtf_v, Vec, Gp, Imm);
- ASMJIT_INST_2x(scvtf, Scvtf_v, Vec, Vec);
- ASMJIT_INST_3x(scvtf, Scvtf_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(shadd, Shadd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(shl, Shl_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(shll, Shll_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(shll2, Shll2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(shrn, Shrn_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(shrn2, Shrn2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(shsub, Shsub_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sli, Sli_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(smax, Smax_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(smaxp, Smaxp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(smaxv, Smaxv_v, Vec, Vec);
- ASMJIT_INST_3x(smin, Smin_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sminp, Sminp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sminv, Sminv_v, Vec, Vec);
- ASMJIT_INST_3x(smlal, Smlal_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(smlal2, Smlal2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(smlsl, Smlsl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(smlsl2, Smlsl2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(smov, Smov_v, Gp, Vec);
- ASMJIT_INST_3x(smull, Smull_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(smull2, Smull2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sqabs, Sqabs_v, Vec, Vec);
- ASMJIT_INST_3x(sqadd, Sqadd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmlal, Sqdmlal_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmlal2, Sqdmlal2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmlsl, Sqdmlsl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmlsl2, Sqdmlsl2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmulh, Sqdmulh_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmull, Sqdmull_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqdmull2, Sqdmull2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sqneg, Sqneg_v, Vec, Vec);
- ASMJIT_INST_3x(sqrdmulh, Sqrdmulh_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqrshl, Sqrshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqrshrn, Sqrshrn_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqrshrn2, Sqrshrn2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqrshrun, Sqrshrun_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqrshrun2, Sqrshrun2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqshl, Sqshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqshl, Sqshl_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqshlu, Sqshlu_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqshrn, Sqshrn_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqshrn2, Sqshrn2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqshrun, Sqshrun_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqshrun2, Sqshrun2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sqsub, Sqsub_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sqxtn, Sqxtn_v, Vec, Vec);
- ASMJIT_INST_2x(sqxtn2, Sqxtn2_v, Vec, Vec);
- ASMJIT_INST_2x(sqxtun, Sqxtun_v, Vec, Vec);
- ASMJIT_INST_2x(sqxtun2, Sqxtun2_v, Vec, Vec);
- ASMJIT_INST_3x(srhadd, Srhadd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sri, Sri_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(srshl, Srshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(srshr, Srshr_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(srsra, Srsra_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sshl, Sshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sshll, Sshll_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sshll2, Sshll2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(sshr, Sshr_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(ssra, Ssra_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(ssubl, Ssubl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(ssubl2, Ssubl2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(ssubw, Ssubw_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(ssubw2, Ssubw2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(st1, St1_v, Vec, Mem);
- ASMJIT_INST_3x(st1, St1_v, Vec, Vec, Mem);
- ASMJIT_INST_4x(st1, St1_v, Vec, Vec, Vec, Mem);
- ASMJIT_INST_5x(st1, St1_v, Vec, Vec, Vec, Vec, Mem);
- ASMJIT_INST_3x(st2, St2_v, Vec, Vec, Mem);
- ASMJIT_INST_4x(st3, St3_v, Vec, Vec, Vec, Mem);
- ASMJIT_INST_5x(st4, St4_v, Vec, Vec, Vec, Vec, Mem);
- ASMJIT_INST_3x(stnp, Stnp_v, Vec, Vec, Mem);
- ASMJIT_INST_3x(stp, Stp_v, Vec, Vec, Mem);
- ASMJIT_INST_2x(str, Str_v, Vec, Mem);
- ASMJIT_INST_2x(stur, Stur_v, Vec, Mem);
- ASMJIT_INST_3x(sub, Sub_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(subhn, Subhn_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(subhn2, Subhn2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(suqadd, Suqadd_v, Vec, Vec);
- ASMJIT_INST_2x(sxtl, Sxtl_v, Vec, Vec);
- ASMJIT_INST_2x(sxtl2, Sxtl2_v, Vec, Vec);
- ASMJIT_INST_3x(tbl, Tbl_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(tbl, Tbl_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_5x(tbl, Tbl_v, Vec, Vec, Vec, Vec, Vec);
- ASMJIT_INST_6x(tbl, Tbl_v, Vec, Vec, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(tbx, Tbx_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(tbx, Tbx_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_5x(tbx, Tbx_v, Vec, Vec, Vec, Vec, Vec);
- ASMJIT_INST_6x(tbx, Tbx_v, Vec, Vec, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(trn1, Trn1_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(trn2, Trn2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uaba, Uaba_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uabal, Uabal_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uabal2, Uabal2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uabd, Uabd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uabdl, Uabdl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uabdl2, Uabdl2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(uadalp, Uadalp_v, Vec, Vec);
- ASMJIT_INST_3x(uaddl, Uaddl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uaddl2, Uaddl2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(uaddlp, Uaddlp_v, Vec, Vec);
- ASMJIT_INST_2x(uaddlv, Uaddlv_v, Vec, Vec);
- ASMJIT_INST_3x(uaddw, Uaddw_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uaddw2, Uaddw2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(ucvtf, Ucvtf_v, Vec, Gp);
- ASMJIT_INST_3x(ucvtf, Ucvtf_v, Vec, Gp, Imm);
- ASMJIT_INST_2x(ucvtf, Ucvtf_v, Vec, Vec);
- ASMJIT_INST_3x(ucvtf, Ucvtf_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uhadd, Uhadd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uhsub, Uhsub_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(umax, Umax_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(umaxp, Umaxp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(umaxv, Umaxv_v, Vec, Vec);
- ASMJIT_INST_3x(umin, Umin_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uminp, Uminp_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(uminv, Uminv_v, Vec, Vec);
- ASMJIT_INST_3x(umlal, Umlal_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(umlal2, Umlal2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(umlsl, Umlsl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(umlsl2, Umlsl2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(umov, Umov_v, Gp, Vec);
- ASMJIT_INST_3x(umull, Umull_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(umull2, Umull2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uqadd, Uqadd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uqrshl, Uqrshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uqrshl, Uqrshl_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uqrshrn, Uqrshrn_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uqrshrn2, Uqrshrn2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uqshl, Uqshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uqshl, Uqshl_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uqshrn, Uqshrn_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uqshrn2, Uqshrn2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(uqsub, Uqsub_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(uqxtn, Uqxtn_v, Vec, Vec);
- ASMJIT_INST_2x(uqxtn2, Uqxtn2_v, Vec, Vec);
- ASMJIT_INST_2x(urecpe, Urecpe_v, Vec, Vec);
- ASMJIT_INST_3x(urhadd, Urhadd_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(urshl, Urshl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(urshr, Urshr_v, Vec, Vec, Imm);
- ASMJIT_INST_2x(ursqrte, Ursqrte_v, Vec, Vec);
- ASMJIT_INST_3x(ursra, Ursra_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(ushl, Ushl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(ushll, Ushll_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(ushll2, Ushll2_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(ushr, Ushr_v, Vec, Vec, Imm);
- ASMJIT_INST_2x(usqadd, Usqadd_v, Vec, Vec);
- ASMJIT_INST_3x(usra, Usra_v, Vec, Vec, Imm);
- ASMJIT_INST_3x(usubl, Usubl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(usubl2, Usubl2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(usubw, Usubw_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(usubw2, Usubw2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(uxtl, Uxtl_v, Vec, Vec);
- ASMJIT_INST_2x(uxtl2, Uxtl2_v, Vec, Vec);
- ASMJIT_INST_3x(uzp1, Uzp1_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(uzp2, Uzp2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(xtn, Xtn_v, Vec, Vec);
- ASMJIT_INST_2x(xtn2, Xtn2_v, Vec, Vec);
- ASMJIT_INST_3x(zip1, Zip1_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(zip2, Zip2_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name AES Instructions
- //! \{
-
- ASMJIT_INST_2x(aesd, Aesd_v, Vec, Vec);
- ASMJIT_INST_2x(aese, Aese_v, Vec, Vec);
- ASMJIT_INST_2x(aesimc, Aesimc_v, Vec, Vec);
- ASMJIT_INST_2x(aesmc, Aesmc_v, Vec, Vec);
-
- //! \}
-
- //! \name SHA1 Instructions
- //! \{
-
- ASMJIT_INST_3x(sha1c, Sha1c_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sha1h, Sha1h_v, Vec, Vec);
- ASMJIT_INST_3x(sha1m, Sha1m_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sha1p, Sha1p_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sha1su0, Sha1su0_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sha1su1, Sha1su1_v, Vec, Vec);
-
- //! \}
-
- //! \name SHA2 Instructions
- //! \{
-
- ASMJIT_INST_3x(sha256h, Sha256h_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sha256h2, Sha256h2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sha256su0, Sha256su0_v, Vec, Vec);
- ASMJIT_INST_3x(sha256su1, Sha256su1_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name RDMA Instructions (ARMv8.1-A)
- //! \{
-
- ASMJIT_INST_3x(sqrdmlah, Sqrdmlah_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sqrdmlsh, Sqrdmlsh_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name FCMA Instruction (ARMv8.3-A)
- //! \{
-
- ASMJIT_INST_4x(fcadd, Fcadd_v, Vec, Vec, Vec, Imm);
- ASMJIT_INST_4x(fcmla, Fcmla_v, Vec, Vec, Vec, Imm);
-
- //! \}
-
- //! \name JSCVT Instruction (ARMv8.3-A)
- //! \{
-
- ASMJIT_INST_2x(fjcvtzs, Fjcvtzs_v, Gp, Vec);
-
- //! \}
-
- //! \name FHM Instructions
- //! \{
-
- ASMJIT_INST_3x(fmlal, Fmlal_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmlal2, Fmlal2_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmlsl, Fmlsl_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(fmlsl2, Fmlsl2_v, Vec, Vec, Vec);
-
-
- //! \}
-
- //! \name SHA3 Instructions (ARMv8.4-A, optional in ARMv8.2-A)
- //! \{
-
- ASMJIT_INST_4x(bcax, Bcax_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_4x(eor3, Eor3_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(rax1, Rax1_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(xar, Xar_v, Vec, Vec, Vec, Imm);
-
- //! \}
-
- //! \name SHA512 Instructions (ARMv8.4-A)
- //! \{
-
- ASMJIT_INST_3x(sha512h, Sha512h_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sha512h2, Sha512h2_v, Vec, Vec, Vec);
- ASMJIT_INST_2x(sha512su0, Sha512su0_v, Vec, Vec);
- ASMJIT_INST_3x(sha512su1, Sha512su1_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name SM3 Instructions (ARMv8.4-A)
- //! \{
-
- ASMJIT_INST_3x(sm3partw1, Sm3partw1_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sm3partw2, Sm3partw2_v, Vec, Vec, Vec);
- ASMJIT_INST_4x(sm3ss1, Sm3ss1_v, Vec, Vec, Vec, Vec);
- ASMJIT_INST_3x(sm3tt1a, Sm3tt1a_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sm3tt1b, Sm3tt1b_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sm3tt2a, Sm3tt2a_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sm3tt2b, Sm3tt2b_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name SM4 Instructions (ARMv8.4-A)
- //! \{
-
- ASMJIT_INST_2x(sm4e, Sm4e_v, Vec, Vec);
- ASMJIT_INST_3x(sm4ekey, Sm4ekey_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name DOTPROD Instructions (ARMv8.4-A, optional in ARMv8.2-A)
- //! \{
-
- ASMJIT_INST_3x(sdot, Sdot_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(udot, Udot_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name BF16 Instructions (ARMv8.6-A)
- //! \{
-
- ASMJIT_INST_2x(bfcvt, Bfcvt_v, Vec, Vec);
- ASMJIT_INST_2x(bfcvtn, Bfcvtn_v, Vec, Vec);
- ASMJIT_INST_2x(bfcvtn2, Bfcvtn2_v, Vec, Vec);
- ASMJIT_INST_3x(bfmlalb, Bfmlalb_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(bfmlalt, Bfmlalt_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(bfmmla, Bfmmla_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(bfdot, Bfdot_v, Vec, Vec, Vec);
-
- //! \}
-
- //! \name I8MM Instructions (ARMv8.6-A)
- //! \{
-
- ASMJIT_INST_3x(smmla, Smmla_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(sudot, Sudot_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(ummla, Ummla_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(usdot, Usdot_v, Vec, Vec, Vec);
- ASMJIT_INST_3x(usmmla, Usmmla_v, Vec, Vec, Vec);
-
- //! \}
-};
-
-//! Emitter (ARM).
-//!
-//! \note This class cannot be instantiated, you can only cast to it and use it as emitter that emits to either
-//! `a64::Assembler`, `a64::Builder`, or `a64::Compiler` (use with caution with `a64::Compiler` as it requires
-//! virtual registers).
-class Emitter : public BaseEmitter, public EmitterExplicitT<Emitter> {
- ASMJIT_NONCONSTRUCTIBLE(Emitter)
-};
-
-//! \}
-
-#undef ASMJIT_INST_0x
-#undef ASMJIT_INST_1x
-#undef ASMJIT_INST_2x
-#undef ASMJIT_INST_3x
-#undef ASMJIT_INST_4x
-#undef ASMJIT_INST_5x
-#undef ASMJIT_INST_6x
-#undef ASMJIT_INST_1cc
-
-ASMJIT_END_SUB_NAMESPACE
-
-// Restore undefined MSVC AArch64 macros.
-#if defined(ASMJIT_RESTORE_MSVC_AARCH64_MACROS)
- #pragma pop_macro("mvn")
-#endif
-
-#endif // ASMJIT_ARM_A64EMITTER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp b/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp
deleted file mode 100644
index 94ef3ee59e9..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64formatter.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_LOGGING)
-
-#include "../core/misc_p.h"
-#include "../core/support.h"
-#include "../arm/a64formatter_p.h"
-#include "../arm/a64instapi_p.h"
-#include "../arm/a64instdb_p.h"
-#include "../arm/a64operand.h"
-
-#ifndef ASMJIT_NO_COMPILER
- #include "../core/compiler.h"
-#endif
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::FormatterInternal - Format Instruction
-// ===========================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
-
- // Format instruction options and instruction mnemonic.
- InstId instId = inst.realId();
- if (instId != Inst::kIdNone && instId < Inst::_kIdCount)
- ASMJIT_PROPAGATE(InstInternal::instIdToString(instId, sb));
- else
- ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId)));
-
- CondCode cc = inst.armCondCode();
- if (cc != CondCode::kAL) {
- ASMJIT_PROPAGATE(sb.append('.'));
- ASMJIT_PROPAGATE(formatCondCode(sb, cc));
- }
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand_& op = operands[i];
- if (op.isNone())
- break;
-
- ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
- ASMJIT_PROPAGATE(formatOperand(sb, flags, emitter, arch, op));
- }
-
- return kErrorOk;
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h b/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h
deleted file mode 100644
index d0adde3ce0d..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64formatter_p.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
-#define ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_LOGGING
-
-#include "../core/formatter.h"
-#include "../core/string.h"
-#include "../arm/armformatter_p.h"
-#include "../arm/a64globals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-namespace FormatterInternal {
-
-using namespace arm::FormatterInternal;
-
-Error ASMJIT_CDECL formatInstruction(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept;
-
-} // {FormatterInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_LOGGING
-#endif // ASMJIT_ARM_A64FORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64func.cpp b/3rdparty/asmjit/src/asmjit/arm/a64func.cpp
deleted file mode 100644
index a88c4d88506..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64func.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64)
-
-#include "../arm/a64func_p.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-namespace FuncInternal {
-
-static inline bool shouldThreatAsCDecl(CallConvId ccId) noexcept {
- return ccId == CallConvId::kCDecl ||
- ccId == CallConvId::kStdCall ||
- ccId == CallConvId::kFastCall ||
- ccId == CallConvId::kVectorCall ||
- ccId == CallConvId::kThisCall ||
- ccId == CallConvId::kRegParm1 ||
- ccId == CallConvId::kRegParm2 ||
- ccId == CallConvId::kRegParm3;
-}
-
-static RegType regTypeFromFpOrVecTypeId(TypeId typeId) noexcept {
- if (typeId == TypeId::kFloat32)
- return RegType::kARM_VecS;
- else if (typeId == TypeId::kFloat64)
- return RegType::kARM_VecD;
- else if (TypeUtils::isVec32(typeId))
- return RegType::kARM_VecS;
- else if (TypeUtils::isVec64(typeId))
- return RegType::kARM_VecD;
- else if (TypeUtils::isVec128(typeId))
- return RegType::kARM_VecV;
- else
- return RegType::kNone;
-}
-
-ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept {
- cc.setArch(environment.arch());
- cc.setStrategy(environment.isDarwin() ? CallConvStrategy::kAArch64Apple : CallConvStrategy::kDefault);
-
- cc.setSaveRestoreRegSize(RegGroup::kGp, 8);
- cc.setSaveRestoreRegSize(RegGroup::kVec, 8);
- cc.setSaveRestoreAlignment(RegGroup::kGp, 16);
- cc.setSaveRestoreAlignment(RegGroup::kVec, 16);
- cc.setSaveRestoreAlignment(RegGroup::kMask, 1);
- cc.setSaveRestoreAlignment(RegGroup::kExtraVirt3, 1);
- cc.setPassedOrder(RegGroup::kGp, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setNaturalStackAlignment(16);
-
- if (shouldThreatAsCDecl(ccId)) {
- // ARM doesn't have that many calling conventions as we can find in X86 world, treat most conventions as __cdecl.
- cc.setId(CallConvId::kCDecl);
- cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(Gp::kIdOs, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
- cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(8, 9, 10, 11, 12, 13, 14, 15));
- }
- else {
- cc.setId(ccId);
- cc.setSaveRestoreRegSize(RegGroup::kVec, 16);
- cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
- cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31));
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature) noexcept {
- DebugUtils::unused(signature);
-
- const CallConv& cc = func.callConv();
- uint32_t stackOffset = 0;
-
- uint32_t i;
- uint32_t argCount = func.argCount();
-
- // Minimum stack size of a single argument passed via stack. The standard AArch64 calling convention
- // specifies 8 bytes, so each function argument would occupy at least 8 bytes even if it needs less.
- // However, Apple has decided to not follow this rule and function argument can occupy less, for
- // example two consecutive 32-bit arguments would occupy 8 bytes total, instead of 16 as specified
- // by ARM.
- uint32_t minStackArgSize = cc.strategy() == CallConvStrategy::kAArch64Apple ? 4u : 8u;
-
- if (func.hasRet()) {
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- TypeId typeId = func._rets[valueIndex].typeId();
-
- // Terminate at the first void type (end of the pack).
- if (typeId == TypeId::kVoid)
- break;
-
- switch (typeId) {
- case TypeId::kInt8:
- case TypeId::kInt16:
- case TypeId::kInt32: {
- func._rets[valueIndex].initReg(RegType::kARM_GpW, valueIndex, TypeId::kInt32);
- break;
- }
-
- case TypeId::kUInt8:
- case TypeId::kUInt16:
- case TypeId::kUInt32: {
- func._rets[valueIndex].initReg(RegType::kARM_GpW, valueIndex, TypeId::kUInt32);
- break;
- }
-
- case TypeId::kInt64:
- case TypeId::kUInt64: {
- func._rets[valueIndex].initReg(RegType::kARM_GpX, valueIndex, typeId);
- break;
- }
-
- default: {
- RegType regType = regTypeFromFpOrVecTypeId(typeId);
- if (regType == RegType::kNone)
- return DebugUtils::errored(kErrorInvalidRegType);
-
- func._rets[valueIndex].initReg(regType, valueIndex, typeId);
- break;
- }
- }
- }
- }
-
- switch (cc.strategy()) {
- case CallConvStrategy::kDefault:
- case CallConvStrategy::kAArch64Apple: {
- uint32_t gpzPos = 0;
- uint32_t vecPos = 0;
-
- for (i = 0; i < argCount; i++) {
- FuncValue& arg = func._args[i][0];
- TypeId typeId = arg.typeId();
-
- if (TypeUtils::isInt(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (gpzPos < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[RegGroup::kGp].id[gpzPos];
-
- if (regId != BaseReg::kIdBad) {
- RegType regType = typeId <= TypeId::kUInt32 ? RegType::kARM_GpW : RegType::kARM_GpX;
- arg.assignRegData(regType, regId);
- func.addUsedRegs(RegGroup::kGp, Support::bitMask(regId));
- gpzPos++;
- }
- else {
- uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), minStackArgSize);
- if (size >= 8)
- stackOffset = Support::alignUp(stackOffset, 8);
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += size;
- }
- continue;
- }
-
- if (TypeUtils::isFloat(typeId) || TypeUtils::isVec(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (vecPos < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[RegGroup::kVec].id[vecPos];
-
- if (regId != BaseReg::kIdBad) {
- RegType regType = regTypeFromFpOrVecTypeId(typeId);
- if (regType == RegType::kNone)
- return DebugUtils::errored(kErrorInvalidRegType);
-
- arg.initTypeId(typeId);
- arg.assignRegData(regType, regId);
- func.addUsedRegs(RegGroup::kVec, Support::bitMask(regId));
- vecPos++;
- }
- else {
- uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), minStackArgSize);
- if (size >= 8)
- stackOffset = Support::alignUp(stackOffset, 8);
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += size;
- }
- continue;
- }
- }
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- func._argStackSize = Support::alignUp(stackOffset, 8u);
- return kErrorOk;
-}
-
-} // {FuncInternal}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64func_p.h b/3rdparty/asmjit/src/asmjit/arm/a64func_p.h
deleted file mode 100644
index 7f2221c7059..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64func_p.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64FUNC_P_H_INCLUDED
-#define ASMJIT_ARM_A64FUNC_P_H_INCLUDED
-
-#include "../core/func.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-//! AArch64-specific function API (calling conventions and other utilities).
-namespace FuncInternal {
-
-//! Initialize `CallConv` structure (AArch64 specific).
-Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept;
-
-//! Initialize `FuncDetail` (AArch64 specific).
-Error initFuncDetail(FuncDetail& func, const FuncSignature& signature) noexcept;
-
-} // {FuncInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_A64FUNC_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp b/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp
deleted file mode 100644
index 97e23fd9452..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64instapi.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64)
-
-#include "../core/cpuinfo.h"
-#include "../core/misc_p.h"
-#include "../core/support_p.h"
-#include "../arm/a64instapi_p.h"
-#include "../arm/a64instdb_p.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-namespace InstInternal {
-
-// a64::InstInternal - Text
-// ========================
-
-#ifndef ASMJIT_NO_TEXT
-Error instIdToString(InstId instId, String& output) noexcept {
- uint32_t realId = instId & uint32_t(InstIdParts::kRealId);
- if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId)))
- return DebugUtils::errored(kErrorInvalidInstruction);
-
- return InstNameUtils::decode(output, InstDB::_instNameIndexTable[realId], InstDB::_instNameStringTable);
-}
-
-InstId stringToInstId(const char* s, size_t len) noexcept {
- return InstNameUtils::find(s, len, InstDB::instNameIndex, InstDB::_instNameIndexTable, InstDB::_instNameStringTable);
-}
-#endif // !ASMJIT_NO_TEXT
-
-// a64::InstInternal - Validate
-// ============================
-
-#ifndef ASMJIT_NO_VALIDATION
-ASMJIT_FAVOR_SIZE Error validate(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
- // TODO:
- DebugUtils::unused(inst, operands, opCount, validationFlags);
- return kErrorOk;
-}
-#endif // !ASMJIT_NO_VALIDATION
-
-// a64::InstInternal - QueryRWInfo
-// ===============================
-
-#ifndef ASMJIT_NO_INTROSPECTION
-struct InstRWInfoData {
- uint8_t rwx[Globals::kMaxOpCount];
-};
-
-static const InstRWInfoData instRWInfoData[] = {
- #define R uint8_t(OpRWFlags::kRead)
- #define W uint8_t(OpRWFlags::kWrite)
- #define X uint8_t(OpRWFlags::kRW)
-
- {{ R, R, R, R, R, R }}, // kRWI_R
- {{ R, W, R, R, R, R }}, // kRWI_RW
- {{ R, X, R, R, R, R }}, // kRWI_RX
- {{ R, R, W, R, R, R }}, // kRWI_RRW
- {{ R, W, X, R, R, R }}, // kRWI_RWX
- {{ W, R, R, R, R, R }}, // kRWI_W
- {{ W, R, W, R, R, R }}, // kRWI_WRW
- {{ W, R, X, R, R, R }}, // kRWI_WRX
- {{ W, R, R, W, R, R }}, // kRWI_WRRW
- {{ W, R, R, X, R, R }}, // kRWI_WRRX
- {{ W, W, R, R, R, R }}, // kRWI_WW
- {{ X, R, R, R, R, R }}, // kRWI_X
- {{ X, R, X, R, R, R }}, // kRWI_XRX
- {{ X, X, R, R, X, R }}, // kRWI_XXRRX
-
- {{ W, R, R, R, R, R }}, // kRWI_LDn
- {{ R, W, R, R, R, R }}, // kRWI_STn
- {{ R, R, R, R, R, R }} // kRWI_TODO
-
- #undef R
- #undef W
- #undef X
-};
-
-static const uint8_t elementTypeSize[8] = { 0, 1, 2, 4, 8, 4, 4, 0 };
-
-Error queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
- // Get the instruction data.
- uint32_t realId = inst.id() & uint32_t(InstIdParts::kRealId);
-
- if (ASMJIT_UNLIKELY(!Inst::isDefinedId(realId)))
- return DebugUtils::errored(kErrorInvalidInstruction);
-
- out->_instFlags = InstRWFlags::kNone;
- out->_opCount = uint8_t(opCount);
- out->_rmFeature = 0;
- out->_extraReg.reset();
- out->_readFlags = CpuRWFlags::kNone; // TODO: [ARM] Read PSTATUS.
- out->_writeFlags = CpuRWFlags::kNone; // TODO: [ARM] Write PSTATUS
-
- const InstDB::InstInfo& instInfo = InstDB::_instInfoTable[realId];
- const InstRWInfoData& rwInfo = instRWInfoData[instInfo.rwInfoIndex()];
-
- if (instInfo.hasFlag(InstDB::kInstFlagConsecutive) && opCount > 2) {
- for (uint32_t i = 0; i < opCount; i++) {
- OpRWInfo& op = out->_operands[i];
- const Operand_& srcOp = operands[i];
-
- if (!srcOp.isRegOrMem()) {
- op.reset();
- continue;
- }
-
- OpRWFlags rwFlags = i < opCount - 1 ? (OpRWFlags)rwInfo.rwx[0] : (OpRWFlags)rwInfo.rwx[1];
-
- op._opFlags = rwFlags & ~(OpRWFlags::kZExt);
- op._physId = BaseReg::kIdBad;
- op._rmSize = 0;
- op._resetReserved();
-
- uint64_t rByteMask = op.isRead() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
- uint64_t wByteMask = op.isWrite() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
-
- op._readByteMask = rByteMask;
- op._writeByteMask = wByteMask;
- op._extendByteMask = 0;
- op._consecutiveLeadCount = 0;
-
- if (srcOp.isReg()) {
- if (i == 0)
- op._consecutiveLeadCount = uint8_t(opCount - 1);
- else
- op.addOpFlags(OpRWFlags::kConsecutive);
- }
- else {
- const Mem& memOp = srcOp.as<Mem>();
-
- if (memOp.hasBase()) {
- op.addOpFlags(OpRWFlags::kMemBaseRead);
- }
-
- if (memOp.hasIndex()) {
- op.addOpFlags(OpRWFlags::kMemIndexRead);
- op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexWrite : OpRWFlags::kNone);
- }
- }
- }
- }
- else {
- for (uint32_t i = 0; i < opCount; i++) {
- OpRWInfo& op = out->_operands[i];
- const Operand_& srcOp = operands[i];
-
- if (!srcOp.isRegOrMem()) {
- op.reset();
- continue;
- }
-
- OpRWFlags rwFlags = (OpRWFlags)rwInfo.rwx[i];
-
- op._opFlags = rwFlags & ~(OpRWFlags::kZExt);
- op._physId = BaseReg::kIdBad;
- op._rmSize = 0;
- op._resetReserved();
-
- uint64_t rByteMask = op.isRead() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
- uint64_t wByteMask = op.isWrite() ? 0xFFFFFFFFFFFFFFFFu : 0x0000000000000000u;
-
- op._readByteMask = rByteMask;
- op._writeByteMask = wByteMask;
- op._extendByteMask = 0;
- op._consecutiveLeadCount = 0;
-
- if (srcOp.isReg()) {
- if (srcOp.as<Vec>().hasElementIndex()) {
- // Only part of the vector is accessed if element index [] is used.
- VecElementType elementType = srcOp.as<Vec>().elementType();
- uint32_t elementIndex = srcOp.as<Vec>().elementIndex();
-
- uint32_t elementSize = elementTypeSize[size_t(elementType)];
- uint64_t accessMask = uint64_t(Support::lsbMask<uint32_t>(elementSize)) << (elementIndex * elementSize);
-
- op._readByteMask &= accessMask;
- op._writeByteMask &= accessMask;
- }
-
- // TODO: [ARM] RW info is not finished.
- }
- else {
- const Mem& memOp = srcOp.as<Mem>();
-
- if (memOp.hasBase()) {
- op.addOpFlags(OpRWFlags::kMemBaseRead);
- }
-
- if (memOp.hasIndex()) {
- op.addOpFlags(memOp.isPreOrPost() ? OpRWFlags::kMemIndexRW : OpRWFlags::kMemIndexRead);
- }
- }
- }
- }
-
- return kErrorOk;
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-// a64::InstInternal - QueryFeatures
-// =================================
-
-#ifndef ASMJIT_NO_INTROSPECTION
-Error queryFeatures(const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
- // TODO: [ARM] QueryFeatures not implemented yet.
- DebugUtils::unused(inst, operands, opCount, out);
- return kErrorOk;
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-} // {InstInternal}
-
-// a64::InstInternal - Unit
-// ========================
-
-#if defined(ASMJIT_TEST)
-UNIT(arm_inst_api_text) {
- // TODO:
-}
-#endif
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h b/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h
deleted file mode 100644
index 535e4bd71f8..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64instapi_p.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
-#define ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
-
-#include "../core/inst.h"
-#include "../core/operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-namespace InstInternal {
-
-#ifndef ASMJIT_NO_TEXT
-Error ASMJIT_CDECL instIdToString(InstId instId, String& output) noexcept;
-InstId ASMJIT_CDECL stringToInstId(const char* s, size_t len) noexcept;
-#endif // !ASMJIT_NO_TEXT
-
-#ifndef ASMJIT_NO_VALIDATION
-Error ASMJIT_CDECL validate(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
-#endif // !ASMJIT_NO_VALIDATION
-
-#ifndef ASMJIT_NO_INTROSPECTION
-Error ASMJIT_CDECL queryRWInfo(const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
-Error ASMJIT_CDECL queryFeatures(const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
-#endif // !ASMJIT_NO_INTROSPECTION
-
-} // {InstInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_A64INSTAPI_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb.h b/3rdparty/asmjit/src/asmjit/arm/a64instdb.h
deleted file mode 100644
index a03125401ad..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64instdb.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64INSTDB_H_INCLUDED
-#define ASMJIT_ARM_A64INSTDB_H_INCLUDED
-
-#include "../arm/a64globals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \addtogroup asmjit_a64
-//! \{
-
-//! Instruction database (AArch64).
-namespace InstDB {
-
-//! Instruction flags.
-enum InstFlags : uint32_t {
- //! The instruction provides conditional execution.
- kInstFlagCond = 0x00000001u,
- //! SIMD instruction that processes elements in pairs.
- kInstFlagPair = 0x00000002u,
- //! SIMD instruction that does widening (Long).
- kInstFlagLong = 0x00000004u,
- //! SIMD instruction that does narrowing (Narrow).
- kInstFlagNarrow = 0x00000008u,
- //! SIMD element access of half-words can only be used with v0..15.
- kInstFlagVH0_15 = 0x00000010u,
-
- //! Instruction uses consecutive registers if the number of operands is greater than 2.
- kInstFlagConsecutive = 0x00000080u
-};
-
-//! Instruction information (AArch64).
-struct InstInfo {
- //! Instruction encoding type.
- uint32_t _encoding : 8;
- //! Index to data specific to each encoding type.
- uint32_t _encodingDataIndex : 8;
- uint32_t _reserved : 16;
-
- uint16_t _rwInfoIndex;
- uint16_t _flags;
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG uint32_t rwInfoIndex() const noexcept { return _rwInfoIndex; }
- ASMJIT_INLINE_NODEBUG uint32_t flags() const noexcept { return _flags; }
-
- ASMJIT_INLINE_NODEBUG bool hasFlag(uint32_t flag) const { return (_flags & flag) != 0; }
-
- //! \}
-};
-
-ASMJIT_VARAPI const InstInfo _instInfoTable[];
-
-static inline const InstInfo& infoById(InstId instId) noexcept {
- instId &= uint32_t(InstIdParts::kRealId);
- ASMJIT_ASSERT(Inst::isDefinedId(instId));
- return _instInfoTable[instId];
-}
-
-} // {InstDB}
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_A64INSTDB_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h b/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h
deleted file mode 100644
index 5c3da7e1f9f..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64instdb_p.h
+++ /dev/null
@@ -1,873 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
-#define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
-
-#include "../core/codeholder.h"
-#include "../core/instdb_p.h"
-#include "../arm/a64instdb.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-namespace InstDB {
-
-// a64::InstDB - Constants Used by Instructions
-// ============================================
-
-// GP register types supported by base instructions.
-static constexpr uint32_t kW = 0x1;
-static constexpr uint32_t kX = 0x2;
-static constexpr uint32_t kWX = 0x3;
-
-// GP high register IDs supported by the instruction.
-static constexpr uint32_t kZR = Gp::kIdZr;
-static constexpr uint32_t kSP = Gp::kIdSp;
-
-// a64::InstDB - RWInfo
-// ====================
-
-enum RWInfoType : uint32_t {
- kRWI_R,
- kRWI_RW,
- kRWI_RX,
- kRWI_RRW,
- kRWI_RWX,
- kRWI_W,
- kRWI_WRW,
- kRWI_WRX,
- kRWI_WRRW,
- kRWI_WRRX,
- kRWI_WW,
- kRWI_X,
- kRWI_XRX,
- kRWI_XXRRX,
-
- kRWI_LDn,
- kRWI_STn,
-
- kRWI_SpecialStart = kRWI_LDn
-};
-
-// a64::InstDB - ElementType
-// =========================
-
-enum InstElementType : uint8_t {
- kET_None = uint8_t(VecElementType::kNone),
- kET_B = uint8_t(VecElementType::kB),
- kET_H = uint8_t(VecElementType::kH),
- kET_S = uint8_t(VecElementType::kS),
- kET_D = uint8_t(VecElementType::kD),
- kET_2H = uint8_t(VecElementType::kH2),
- kET_4B = uint8_t(VecElementType::kB4)
-};
-
-// a64::InstDB - GpType
-// ====================
-
-enum GpType : uint8_t {
- kGp_W,
- kGp_X,
- kGp_X_SP
-};
-
-// a64::InstDB - OPSig
-// ===================
-
-enum kOpSignature : uint32_t {
- kOp_GpW = GpW::kSignature,
- kOp_GpX = GpX::kSignature,
-
- kOp_B = VecB::kSignature,
- kOp_H = VecH::kSignature,
- kOp_S = VecS::kSignature,
- kOp_D = VecD::kSignature,
- kOp_Q = VecV::kSignature,
-
- kOp_V8B = VecD::kSignature | Vec::kSignatureElementB,
- kOp_V4H = VecD::kSignature | Vec::kSignatureElementH,
- kOp_V2S = VecD::kSignature | Vec::kSignatureElementS,
-
- kOp_V16B = VecV::kSignature | Vec::kSignatureElementB,
- kOp_V8H = VecV::kSignature | Vec::kSignatureElementH,
- kOp_V4S = VecV::kSignature | Vec::kSignatureElementS,
- kOp_V2D = VecV::kSignature | Vec::kSignatureElementD
-};
-
-// a64::InstDB - HFConv
-// ====================
-
-enum kHFConv : uint32_t {
- //! FP16 version of the instruction is not available.
- kHF_N,
-
- //! Doesn't do any change to the opcode.
- kHF_0,
-
- kHF_A,
- kHF_B,
- kHF_C,
- kHF_D,
-
- kHF_Count
-};
-
-// a64::InstDB - VOType
-// ====================
-
-//! Vector operand type combinations used by FP&SIMD instructions.
-enum VOType : uint32_t {
- kVO_V_B,
- kVO_V_BH,
- kVO_V_BH_4S,
- kVO_V_BHS,
- kVO_V_BHS_D2,
- kVO_V_HS,
- kVO_V_S,
-
- kVO_V_B8H4,
- kVO_V_B8H4S2,
- kVO_V_B8D1,
- kVO_V_H4S2,
-
- kVO_V_B16,
- kVO_V_B16H8,
- kVO_V_B16H8S4,
- kVO_V_B16D2,
- kVO_V_H8S4,
- kVO_V_S4,
- kVO_V_D2,
-
- kVO_SV_BHS,
- kVO_SV_B8H4S2,
- kVO_SV_HS,
- kVO_V_Any,
- kVO_SV_Any,
-
- kVO_Count
-};
-
-// a64::InstDB - EncodingId
-// ========================
-
-// ${EncodingId:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-enum EncodingId : uint32_t {
- kEncodingNone = 0,
- kEncodingBaseAddSub,
- kEncodingBaseAdr,
- kEncodingBaseAtDcIcTlbi,
- kEncodingBaseAtomicCasp,
- kEncodingBaseAtomicOp,
- kEncodingBaseAtomicSt,
- kEncodingBaseBfc,
- kEncodingBaseBfi,
- kEncodingBaseBfm,
- kEncodingBaseBfx,
- kEncodingBaseBranchCmp,
- kEncodingBaseBranchReg,
- kEncodingBaseBranchRel,
- kEncodingBaseBranchTst,
- kEncodingBaseCCmp,
- kEncodingBaseCInc,
- kEncodingBaseCSel,
- kEncodingBaseCSet,
- kEncodingBaseCmpCmn,
- kEncodingBaseExtend,
- kEncodingBaseExtract,
- kEncodingBaseLdSt,
- kEncodingBaseLdpStp,
- kEncodingBaseLdxp,
- kEncodingBaseLogical,
- kEncodingBaseMov,
- kEncodingBaseMovKNZ,
- kEncodingBaseMrs,
- kEncodingBaseMsr,
- kEncodingBaseMvnNeg,
- kEncodingBaseOp,
- kEncodingBaseOpImm,
- kEncodingBasePrfm,
- kEncodingBaseR,
- kEncodingBaseRM_NoImm,
- kEncodingBaseRM_SImm10,
- kEncodingBaseRM_SImm9,
- kEncodingBaseRR,
- kEncodingBaseRRII,
- kEncodingBaseRRR,
- kEncodingBaseRRRR,
- kEncodingBaseRev,
- kEncodingBaseShift,
- kEncodingBaseStx,
- kEncodingBaseStxp,
- kEncodingBaseSys,
- kEncodingBaseTst,
- kEncodingFSimdPair,
- kEncodingFSimdSV,
- kEncodingFSimdVV,
- kEncodingFSimdVVV,
- kEncodingFSimdVVVV,
- kEncodingFSimdVVVe,
- kEncodingISimdPair,
- kEncodingISimdSV,
- kEncodingISimdVV,
- kEncodingISimdVVV,
- kEncodingISimdVVVI,
- kEncodingISimdVVVV,
- kEncodingISimdVVVVx,
- kEncodingISimdVVVe,
- kEncodingISimdVVVx,
- kEncodingISimdVVx,
- kEncodingISimdWWV,
- kEncodingSimdBicOrr,
- kEncodingSimdCmp,
- kEncodingSimdDot,
- kEncodingSimdDup,
- kEncodingSimdFcadd,
- kEncodingSimdFccmpFccmpe,
- kEncodingSimdFcm,
- kEncodingSimdFcmla,
- kEncodingSimdFcmpFcmpe,
- kEncodingSimdFcsel,
- kEncodingSimdFcvt,
- kEncodingSimdFcvtLN,
- kEncodingSimdFcvtSV,
- kEncodingSimdFmlal,
- kEncodingSimdFmov,
- kEncodingSimdIns,
- kEncodingSimdLdNStN,
- kEncodingSimdLdSt,
- kEncodingSimdLdpStp,
- kEncodingSimdLdurStur,
- kEncodingSimdMov,
- kEncodingSimdMoviMvni,
- kEncodingSimdShift,
- kEncodingSimdShiftES,
- kEncodingSimdSm3tt,
- kEncodingSimdSmovUmov,
- kEncodingSimdSxtlUxtl,
- kEncodingSimdTblTbx
-};
-// ----------------------------------------------------------------------------
-// ${EncodingId:End}
-
-// a64::InstDB::EncodingData
-// =========================
-
-namespace EncodingData {
-
-#define M_OPCODE(field, bits) \
- uint32_t _##field : bits; \
- ASMJIT_INLINE_NODEBUG constexpr uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); }
-
-struct BaseOp {
- uint32_t opcode;
-};
-
-struct BaseOpImm {
- uint32_t opcode;
- uint16_t immBits;
- uint16_t immOffset;
-};
-
-struct BaseR {
- uint32_t opcode;
- uint32_t rType : 8;
- uint32_t rHiId : 8;
- uint32_t rShift : 8;
-};
-
-struct BaseRR {
- uint32_t opcode;
- uint32_t aType : 2;
- uint32_t aHiId : 6;
- uint32_t aShift : 5;
- uint32_t bType : 2;
- uint32_t bHiId : 6;
- uint32_t bShift : 5;
- uint32_t uniform : 1;
-};
-
-struct BaseRRR {
- M_OPCODE(opcode, 22)
- uint32_t aType : 2;
- uint32_t aHiId : 6;
- uint32_t bType : 2;
- uint32_t bHiId : 6;
- uint32_t cType : 2;
- uint32_t cHiId : 6;
- uint32_t uniform : 1;
-};
-
-struct BaseRRRR {
- M_OPCODE(opcode, 22)
- uint32_t aType : 2;
- uint32_t aHiId : 6;
- uint32_t bType : 2;
- uint32_t bHiId : 6;
- uint32_t cType : 2;
- uint32_t cHiId : 6;
- uint32_t dType : 2;
- uint32_t dHiId : 6;
- uint32_t uniform : 1;
-};
-
-struct BaseRRII {
- M_OPCODE(opcode, 22)
- uint32_t aType : 2;
- uint32_t aHiId : 6;
- uint32_t bType : 2;
- uint32_t bHiId : 6;
- uint32_t aImmSize : 6;
- uint32_t aImmDiscardLsb : 5;
- uint32_t aImmOffset : 5;
- uint32_t bImmSize : 6;
- uint32_t bImmDiscardLsb : 5;
- uint32_t bImmOffset : 5;
-};
-
-struct BaseAtDcIcTlbi {
- uint32_t immVerifyMask : 14;
- uint32_t immVerifyData : 14;
- uint32_t mandatoryReg : 1;
-};
-
-struct BaseAdcSbc {
- uint32_t opcode;
-};
-
-struct BaseAddSub {
- uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
- uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|Rd|
- uint32_t immediateOp: 10; // sf|.......|Sh| Imm:12 |Rn|Rd|
-};
-
-struct BaseAdr {
- M_OPCODE(opcode, 22)
- OffsetType offsetType : 8;
-};
-
-struct BaseBfm {
- uint32_t opcode; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
-};
-
-struct BaseCmpCmn {
- uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
- uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|11111|
- uint32_t immediateOp: 10; // sf|.......|Sh| Imm:12 |Rn|11111|
-};
-
-struct BaseExtend {
- M_OPCODE(opcode, 22) // sf|........|N|......|......|Rn|Rd|
- uint32_t rType : 2;
- uint32_t u : 1;
-};
-
-struct BaseLogical {
- uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
- uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
- uint32_t negateImm : 1 ; // True if this is an operation that must negate IMM.
-};
-
-struct BaseMvnNeg {
- uint32_t opcode;
-};
-
-struct BaseShift {
- M_OPCODE(registerOp, 22)
- M_OPCODE(immediateOp, 22)
- uint32_t ror : 2;
-};
-
-struct BaseTst {
- uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
- uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|11111|
-};
-
-struct BaseRM_NoImm {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t rHiId : 6;
- uint32_t xOffset : 5;
-};
-
-struct BaseRM_SImm9 {
- M_OPCODE(offsetOp, 22)
- M_OPCODE(prePostOp, 22)
- uint32_t rType : 2;
- uint32_t rHiId : 6;
- uint32_t xOffset : 5;
- uint32_t immShift : 4;
-};
-
-struct BaseRM_SImm10 {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t rHiId : 6;
- uint32_t xOffset : 5;
- uint32_t immShift : 4;
-};
-
-struct BasePrfm {
- uint32_t registerOp : 11;
- uint32_t sOffsetOp : 10;
- uint32_t uOffsetOp : 11;
- uint32_t literalOp;
-};
-
-struct BaseLdSt {
- uint32_t uOffsetOp : 10;
- uint32_t prePostOp : 11;
- uint32_t registerOp : 11;
- uint32_t literalOp : 8;
- uint32_t rType : 2;
- uint32_t xOffset : 5;
- uint32_t uOffsetShift : 3;
- uint32_t uAltInstId : 14;
-};
-
-struct BaseLdpStp {
- uint32_t offsetOp : 10;
- uint32_t prePostOp : 10;
- uint32_t rType : 2;
- uint32_t xOffset : 5;
- uint32_t offsetShift : 3;
-};
-
-struct BaseStx {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t xOffset : 5;
-};
-
-struct BaseLdxp {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t xOffset : 5;
-};
-
-struct BaseStxp {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t xOffset : 5;
-};
-
-struct BaseAtomicOp {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t xOffset : 5;
- uint32_t zr : 1;
-};
-
-struct BaseAtomicSt {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t xOffset : 5;
-};
-
-struct BaseAtomicCasp {
- M_OPCODE(opcode, 22)
- uint32_t rType : 2;
- uint32_t xOffset : 5;
-};
-
-typedef BaseOp BaseBranchReg;
-typedef BaseOp BaseBranchRel;
-typedef BaseOp BaseBranchCmp;
-typedef BaseOp BaseBranchTst;
-typedef BaseOp BaseExtract;
-typedef BaseOp BaseBfc;
-typedef BaseOp BaseBfi;
-typedef BaseOp BaseBfx;
-typedef BaseOp BaseCCmp;
-typedef BaseOp BaseCInc;
-typedef BaseOp BaseCSet;
-typedef BaseOp BaseCSel;
-typedef BaseOp BaseMovKNZ;
-typedef BaseOp BaseMull;
-
-struct FSimdGeneric {
- uint32_t _scalarOp : 28;
- uint32_t _scalarHf : 4;
- uint32_t _vectorOp : 28;
- uint32_t _vectorHf : 4;
-
- constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
- constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
- constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); }
- constexpr uint32_t vectorHf() const noexcept { return uint32_t(_vectorHf); }
-};
-
-typedef FSimdGeneric FSimdVV;
-typedef FSimdGeneric FSimdVVV;
-typedef FSimdGeneric FSimdVVVV;
-
-struct FSimdSV {
- uint32_t opcode;
-};
-
-struct FSimdVVVe {
- uint32_t _scalarOp : 28;
- uint32_t _scalarHf : 4;
- uint32_t _vectorOp;
- uint32_t _elementOp;
-
- constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
- constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); };
- constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
- constexpr uint32_t vectorHf() const noexcept { return kHF_C; }
- constexpr uint32_t elementScalarOp() const noexcept { return (uint32_t(_elementOp) << 10) | (0x5u << 28); }
- constexpr uint32_t elementVectorOp() const noexcept { return (uint32_t(_elementOp) << 10); }
-};
-
-struct SimdFcadd {
- uint32_t _opcode;
-
- constexpr uint32_t opcode() const noexcept { return _opcode << 10; }
-};
-
-struct SimdFcmla {
- uint32_t _regularOp;
- uint32_t _elementOp;
-
- constexpr uint32_t regularOp() const noexcept { return uint32_t(_regularOp) << 10; }
- constexpr uint32_t elementOp() const noexcept { return (uint32_t(_elementOp) << 10); }
-};
-
-struct SimdFccmpFccmpe {
- uint32_t _opcode;
- constexpr uint32_t opcode() const noexcept { return _opcode; }
-};
-
-struct SimdFcm {
- uint32_t _registerOp : 28;
- uint32_t _registerHf : 4;
-
- uint32_t _zeroOp : 28;
-
- constexpr bool hasRegisterOp() const noexcept { return _registerOp != 0; }
- constexpr bool hasZeroOp() const noexcept { return _zeroOp != 0; }
-
- constexpr uint32_t registerScalarOp() const noexcept { return (uint32_t(_registerOp) << 10) | (0x5u << 28); }
- constexpr uint32_t registerVectorOp() const noexcept { return uint32_t(_registerOp) << 10; }
- constexpr uint32_t registerScalarHf() const noexcept { return uint32_t(_registerHf); }
- constexpr uint32_t registerVectorHf() const noexcept { return uint32_t(_registerHf); }
-
- constexpr uint32_t zeroScalarOp() const noexcept { return (uint32_t(_zeroOp) << 10) | (0x5u << 28); }
- constexpr uint32_t zeroVectorOp() const noexcept { return (uint32_t(_zeroOp) << 10); }
-};
-
-struct SimdFcmpFcmpe {
- uint32_t _opcode;
- constexpr uint32_t opcode() const noexcept { return _opcode; }
-};
-
-struct SimdFcvtLN {
- uint32_t _opcode : 22;
- uint32_t _isCvtxn : 1;
- uint32_t _hasScalar : 1;
-
- constexpr uint32_t scalarOp() const noexcept { return (uint32_t(_opcode) << 10) | (0x5u << 28); }
- constexpr uint32_t vectorOp() const noexcept { return (uint32_t(_opcode) << 10); }
-
- constexpr uint32_t isCvtxn() const noexcept { return _isCvtxn; }
- constexpr uint32_t hasScalar() const noexcept { return _hasScalar; }
-};
-
-struct SimdFcvtSV {
- uint32_t _vectorIntOp;
- uint32_t _vectorFpOp;
- uint32_t _generalOp : 31;
- uint32_t _isFloatToInt : 1;
-
- constexpr uint32_t scalarIntOp() const noexcept { return (uint32_t(_vectorIntOp) << 10) | (0x5u << 28); }
- constexpr uint32_t vectorIntOp() const noexcept { return uint32_t(_vectorIntOp) << 10; }
- constexpr uint32_t scalarFpOp() const noexcept { return (uint32_t(_vectorFpOp) << 10) | (0x5u << 28); }
- constexpr uint32_t vectorFpOp() const noexcept { return uint32_t(_vectorFpOp) << 10; }
- constexpr uint32_t generalOp() const noexcept { return (uint32_t(_generalOp) << 10); }
-
- constexpr uint32_t isFloatToInt() const noexcept { return _isFloatToInt; }
- constexpr uint32_t isFixedPoint() const noexcept { return _vectorFpOp != 0; }
-};
-
-struct SimdFmlal {
- uint32_t _vectorOp;
- uint32_t _elementOp;
- uint8_t _optionalQ;
- uint8_t tA;
- uint8_t tB;
- uint8_t tElement;
-
- constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
- constexpr uint32_t elementOp() const noexcept { return uint32_t(_elementOp) << 10; }
- constexpr uint32_t optionalQ() const noexcept { return _optionalQ; }
-};
-
-struct FSimdPair {
- uint32_t _scalarOp;
- uint32_t _vectorOp;
-
- constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
- constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
-};
-
-struct ISimdVV {
- M_OPCODE(opcode, 22)
- uint32_t vecOpType : 6;
-};
-
-struct ISimdVVx {
- M_OPCODE(opcode, 22)
- uint32_t op0Signature;
- uint32_t op1Signature;
-};
-
-struct ISimdSV {
- M_OPCODE(opcode, 22)
- uint32_t vecOpType : 6;
-};
-
-struct ISimdVVV {
- M_OPCODE(opcode, 22)
- uint32_t vecOpType : 6;
-};
-
-struct ISimdVVVx {
- M_OPCODE(opcode, 22)
- uint32_t op0Signature;
- uint32_t op1Signature;
- uint32_t op2Signature;
-};
-
-struct ISimdWWV {
- M_OPCODE(opcode, 22)
- uint32_t vecOpType : 6;
-};
-
-struct ISimdVVVe {
- uint32_t regularOp : 26; // 22 bits used.
- uint32_t regularVecType : 6;
- uint32_t elementOp : 26; // 22 bits used.
- uint32_t elementVecType : 6;
-};
-
-struct ISimdVVVI {
- M_OPCODE(opcode, 22)
- uint32_t vecOpType : 6;
- uint32_t immSize : 4;
- uint32_t immShift : 4;
- uint32_t imm64HasOneBitLess : 1;
-};
-
-struct ISimdVVVV {
- uint32_t opcode : 22;
- uint32_t vecOpType : 6;
-};
-
-struct ISimdVVVVx {
- uint32_t opcode;
- uint32_t op0Signature;
- uint32_t op1Signature;
- uint32_t op2Signature;
- uint32_t op3Signature;
-};
-
-struct SimdBicOrr {
- uint32_t registerOp; // 22 bits used.
- uint32_t immediateOp; // 22 bits used.
-};
-
-struct SimdCmp {
- uint32_t regOp;
- uint32_t zeroOp : 22;
- uint32_t vecOpType : 6;
-};
-
-struct SimdDot {
- uint32_t vectorOp; // 22 bits used.
- uint32_t elementOp; // 22 bits used.
- uint8_t tA; // Element-type of the first operand.
- uint8_t tB; // Element-type of the second and third operands.
- uint8_t tElement; // Element-type of the element index[] operand.
-};
-
-struct SimdMoviMvni {
- uint32_t opcode : 31;
- uint32_t inverted : 1;
-};
-
-struct SimdLdSt {
- uint32_t uOffsetOp : 10;
- uint32_t prePostOp : 11;
- uint32_t registerOp : 11;
- uint32_t literalOp : 8;
- uint32_t uAltInstId : 16;
-};
-
-struct SimdLdNStN {
- uint32_t singleOp;
- uint32_t multipleOp : 22;
- uint32_t n : 3;
- uint32_t replicate : 1;
-};
-
-struct SimdLdpStp {
- uint32_t offsetOp : 10;
- uint32_t prePostOp : 10;
-};
-
-struct SimdLdurStur {
- uint32_t opcode;
-};
-
-struct ISimdPair {
- uint32_t opcode2; // 22 bits used.
- uint32_t opcode3 : 26; // 22 bits used.
- uint32_t opType3 : 6;
-};
-
-struct SimdShift {
- uint32_t registerOp; // 22 bits used.
- uint32_t immediateOp : 22; // 22 bits used.
- uint32_t invertedImm : 1;
- uint32_t vecOpType : 6;
-};
-
-struct SimdShiftES {
- uint32_t opcode : 22;
- uint32_t vecOpType : 6;
-};
-
-struct SimdSm3tt {
- uint32_t opcode;
-};
-
-struct SimdSmovUmov {
- uint32_t opcode : 22;
- uint32_t vecOpType : 6;
- uint32_t isSigned : 1;
-};
-
-struct SimdSxtlUxtl {
- uint32_t opcode : 22;
- uint32_t vecOpType : 6;
-};
-
-struct SimdTblTbx {
- uint32_t opcode;
-};
-
-#undef M_OPCODE
-
-// ${EncodingDataForward:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-extern const BaseAddSub baseAddSub[4];
-extern const BaseAdr baseAdr[2];
-extern const BaseAtDcIcTlbi baseAtDcIcTlbi[4];
-extern const BaseAtomicCasp baseAtomicCasp[4];
-extern const BaseAtomicOp baseAtomicOp[123];
-extern const BaseAtomicSt baseAtomicSt[48];
-extern const BaseBfc baseBfc[1];
-extern const BaseBfi baseBfi[3];
-extern const BaseBfm baseBfm[3];
-extern const BaseBfx baseBfx[3];
-extern const BaseBranchCmp baseBranchCmp[2];
-extern const BaseBranchReg baseBranchReg[3];
-extern const BaseBranchRel baseBranchRel[2];
-extern const BaseBranchTst baseBranchTst[2];
-extern const BaseCCmp baseCCmp[2];
-extern const BaseCInc baseCInc[3];
-extern const BaseCSel baseCSel[4];
-extern const BaseCSet baseCSet[2];
-extern const BaseCmpCmn baseCmpCmn[2];
-extern const BaseExtend baseExtend[5];
-extern const BaseExtract baseExtract[1];
-extern const BaseLdSt baseLdSt[9];
-extern const BaseLdpStp baseLdpStp[6];
-extern const BaseLdxp baseLdxp[2];
-extern const BaseLogical baseLogical[8];
-extern const BaseMovKNZ baseMovKNZ[3];
-extern const BaseMvnNeg baseMvnNeg[3];
-extern const BaseOp baseOp[23];
-extern const BaseOpImm baseOpImm[14];
-extern const BasePrfm basePrfm[1];
-extern const BaseR baseR[10];
-extern const BaseRM_NoImm baseRM_NoImm[21];
-extern const BaseRM_SImm10 baseRM_SImm10[2];
-extern const BaseRM_SImm9 baseRM_SImm9[23];
-extern const BaseRR baseRR[15];
-extern const BaseRRII baseRRII[2];
-extern const BaseRRR baseRRR[26];
-extern const BaseRRRR baseRRRR[6];
-extern const BaseShift baseShift[8];
-extern const BaseStx baseStx[3];
-extern const BaseStxp baseStxp[2];
-extern const BaseTst baseTst[1];
-extern const FSimdPair fSimdPair[5];
-extern const FSimdSV fSimdSV[4];
-extern const FSimdVV fSimdVV[17];
-extern const FSimdVVV fSimdVVV[13];
-extern const FSimdVVVV fSimdVVVV[4];
-extern const FSimdVVVe fSimdVVVe[4];
-extern const ISimdPair iSimdPair[1];
-extern const ISimdSV iSimdSV[7];
-extern const ISimdVV iSimdVV[29];
-extern const ISimdVVV iSimdVVV[65];
-extern const ISimdVVVI iSimdVVVI[2];
-extern const ISimdVVVV iSimdVVVV[2];
-extern const ISimdVVVVx iSimdVVVVx[1];
-extern const ISimdVVVe iSimdVVVe[25];
-extern const ISimdVVVx iSimdVVVx[17];
-extern const ISimdVVx iSimdVVx[13];
-extern const ISimdWWV iSimdWWV[8];
-extern const SimdBicOrr simdBicOrr[2];
-extern const SimdCmp simdCmp[7];
-extern const SimdDot simdDot[5];
-extern const SimdFcadd simdFcadd[1];
-extern const SimdFccmpFccmpe simdFccmpFccmpe[2];
-extern const SimdFcm simdFcm[5];
-extern const SimdFcmla simdFcmla[1];
-extern const SimdFcmpFcmpe simdFcmpFcmpe[2];
-extern const SimdFcvtLN simdFcvtLN[6];
-extern const SimdFcvtSV simdFcvtSV[12];
-extern const SimdFmlal simdFmlal[6];
-extern const SimdLdNStN simdLdNStN[12];
-extern const SimdLdSt simdLdSt[2];
-extern const SimdLdpStp simdLdpStp[4];
-extern const SimdLdurStur simdLdurStur[2];
-extern const SimdMoviMvni simdMoviMvni[2];
-extern const SimdShift simdShift[40];
-extern const SimdShiftES simdShiftES[2];
-extern const SimdSm3tt simdSm3tt[4];
-extern const SimdSmovUmov simdSmovUmov[2];
-extern const SimdSxtlUxtl simdSxtlUxtl[4];
-extern const SimdTblTbx simdTblTbx[2];
-// ----------------------------------------------------------------------------
-// ${EncodingDataForward:End}
-
-} // {EncodingData}
-
-// a64::InstDB - Tables
-// ====================
-
-#ifndef ASMJIT_NO_TEXT
-extern const InstNameIndex instNameIndex;
-extern const char _instNameStringTable[];
-extern const uint32_t _instNameIndexTable[];
-#endif // !ASMJIT_NO_TEXT
-
-} // {InstDB}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_A64_ARMINSTDB_H_P_INCLUDED
-
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp b/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp
deleted file mode 100644
index e8c6100fa68..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64operand.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64)
-
-#include "../core/misc_p.h"
-#include "../arm/a64operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::Operand - Tests
-// ====================
-
-#if defined(ASMJIT_TEST)
-UNIT(a64_operand) {
- INFO("Checking if a64::reg(...) matches built-in IDs");
- EXPECT_EQ(w(5), w5);
- EXPECT_EQ(x(5), x5);
-
- INFO("Checking Gp register properties");
- EXPECT_TRUE(Gp().isReg());
- EXPECT_TRUE(w0.isReg());
- EXPECT_TRUE(x0.isReg());
- EXPECT_EQ(w0.id(), 0u);
- EXPECT_EQ(x0.id(), 0u);
- EXPECT_EQ(wzr.id(), Gp::kIdZr);
- EXPECT_EQ(xzr.id(), Gp::kIdZr);
- EXPECT_EQ(wsp.id(), Gp::kIdSp);
- EXPECT_EQ(sp.id(), Gp::kIdSp);
- EXPECT_EQ(w0.size(), 4u);
- EXPECT_EQ(x0.size(), 8u);
- EXPECT_EQ(w0.type(), RegType::kARM_GpW);
- EXPECT_EQ(x0.type(), RegType::kARM_GpX);
- EXPECT_EQ(w0.group(), RegGroup::kGp);
- EXPECT_EQ(x0.group(), RegGroup::kGp);
-
- INFO("Checking Vec register properties");
- EXPECT_EQ(v0.type(), RegType::kARM_VecV);
- EXPECT_EQ(d0.type(), RegType::kARM_VecD);
- EXPECT_EQ(s0.type(), RegType::kARM_VecS);
- EXPECT_EQ(h0.type(), RegType::kARM_VecH);
- EXPECT_EQ(b0.type(), RegType::kARM_VecB);
-
- EXPECT_EQ(v0.group(), RegGroup::kVec);
- EXPECT_EQ(d0.group(), RegGroup::kVec);
- EXPECT_EQ(s0.group(), RegGroup::kVec);
- EXPECT_EQ(h0.group(), RegGroup::kVec);
- EXPECT_EQ(b0.group(), RegGroup::kVec);
-
- INFO("Checking Vec register element[] access");
- Vec vd_1 = v15.d(1);
- EXPECT_EQ(vd_1.type(), RegType::kARM_VecV);
- EXPECT_EQ(vd_1.group(), RegGroup::kVec);
- EXPECT_EQ(vd_1.id(), 15u);
- EXPECT_TRUE(vd_1.isVecD2());
- EXPECT_EQ(vd_1.elementType(), VecElementType::kD);
- EXPECT_TRUE(vd_1.hasElementIndex());
- EXPECT_EQ(vd_1.elementIndex(), 1u);
-
- Vec vs_3 = v15.s(3);
- EXPECT_EQ(vs_3.type(), RegType::kARM_VecV);
- EXPECT_EQ(vs_3.group(), RegGroup::kVec);
- EXPECT_EQ(vs_3.id(), 15u);
- EXPECT_TRUE(vs_3.isVecS4());
- EXPECT_EQ(vs_3.elementType(), VecElementType::kS);
- EXPECT_TRUE(vs_3.hasElementIndex());
- EXPECT_EQ(vs_3.elementIndex(), 3u);
-
- Vec vb_4 = v15.b4(3);
- EXPECT_EQ(vb_4.type(), RegType::kARM_VecV);
- EXPECT_EQ(vb_4.group(), RegGroup::kVec);
- EXPECT_EQ(vb_4.id(), 15u);
- EXPECT_TRUE(vb_4.isVecB4x4());
- EXPECT_EQ(vb_4.elementType(), VecElementType::kB4);
- EXPECT_TRUE(vb_4.hasElementIndex());
- EXPECT_EQ(vb_4.elementIndex(), 3u);
-}
-#endif
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64operand.h b/3rdparty/asmjit/src/asmjit/arm/a64operand.h
deleted file mode 100644
index c64f20eb445..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64operand.h
+++ /dev/null
@@ -1,650 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64OPERAND_H_INCLUDED
-#define ASMJIT_ARM_A64OPERAND_H_INCLUDED
-
-#include "../arm/armoperand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \addtogroup asmjit_a64
-//! \{
-
-class GpW;
-class GpX;
-
-class VecB;
-class VecH;
-class VecS;
-class VecD;
-class VecV;
-
-//! General purpose register (AArch64).
-class Gp : public Reg {
-public:
- ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg)
-
- //! Special register id.
- enum Id : uint32_t {
- //! Register that depends on OS, could be used as TLS offset.
- kIdOs = 18,
- //! Frame pointer register id.
- kIdFp = 29,
- //! Link register id.
- kIdLr = 30,
- //! Stack register id.
- kIdSp = 31,
- //! Zero register id.
- //!
- //! Although zero register has the same id as stack register it has a special treatment, because we need to be
- //! able to distinguish between these two at API level. Some instructions were designed to be used with SP and
- //! some other with ZR - so we need a way to distinguish these two to make sure we emit the right thing.
- //!
- //! The number 63 is not random, when you perform `id & 31` you would always get 31 for both SP and ZR inputs,
- //! which is the identifier used by AArch64 ISA to encode either SP or ZR depending on the instruction.
- kIdZr = 63
- };
-
- //! Test whether this register is ZR register.
- ASMJIT_INLINE_NODEBUG constexpr bool isZR() const noexcept { return id() == kIdZr; }
- //! Test whether this register is SP register.
- ASMJIT_INLINE_NODEBUG constexpr bool isSP() const noexcept { return id() == kIdSp; }
-
- //! Cast this register to a 32-bit W register (returns a new operand).
- ASMJIT_INLINE_NODEBUG GpW w() const noexcept;
- //! \overload
- ASMJIT_INLINE_NODEBUG GpW r32() const noexcept;
- //! Cast this register to a 64-bit X register (returns a new operand).
- ASMJIT_INLINE_NODEBUG GpX x() const noexcept;
- //! \overload
- ASMJIT_INLINE_NODEBUG GpX r64() const noexcept;
-};
-
-//! 32-bit general purpose W register (AArch64).
-class GpW : public Gp { ASMJIT_DEFINE_FINAL_REG(GpW, Gp, RegTraits<RegType::kARM_GpW>); };
-//! 64-bit general purpose X register (AArch64).
-class GpX : public Gp { ASMJIT_DEFINE_FINAL_REG(GpX, Gp, RegTraits<RegType::kARM_GpX>); };
-
-#ifndef _DOXYGEN
-ASMJIT_INLINE_NODEBUG GpW Gp::w() const noexcept { return GpW(id()); }
-ASMJIT_INLINE_NODEBUG GpX Gp::x() const noexcept { return GpX(id()); }
-ASMJIT_INLINE_NODEBUG GpW Gp::r32() const noexcept { return GpW(id()); }
-ASMJIT_INLINE_NODEBUG GpX Gp::r64() const noexcept { return GpX(id()); }
-#endif
-
-//! Vector element type (AArch64).
-enum class VecElementType : uint32_t {
- //! No element type specified.
- kNone = 0,
- //! Byte elements (B8 or B16).
- kB,
- //! Halfword elements (H4 or H8).
- kH,
- //! Singleword elements (S2 or S4).
- kS,
- //! Doubleword elements (D2).
- kD,
- //! Byte elements grouped by 4 bytes (B4).
- //!
- //! \note This element-type is only used by few instructions.
- kB4,
- //! Halfword elements grouped by 2 halfwords (H2).
- //!
- //! \note This element-type is only used by few instructions.
- kH2,
-
- //! Maximum value of \ref VecElementType
- kMaxValue = kH2
-};
-
-//! Vector register (AArch64).
-class Vec : public BaseVec {
-public:
- ASMJIT_DEFINE_ABSTRACT_REG(Vec, BaseVec)
-
- //! \cond
- //! Shortcuts.
- enum SignatureReg : uint32_t {
- kSignatureElementB = uint32_t(VecElementType::kB) << kSignatureRegElementTypeShift,
- kSignatureElementH = uint32_t(VecElementType::kH) << kSignatureRegElementTypeShift,
- kSignatureElementS = uint32_t(VecElementType::kS) << kSignatureRegElementTypeShift,
- kSignatureElementD = uint32_t(VecElementType::kD) << kSignatureRegElementTypeShift,
- kSignatureElementB4 = uint32_t(VecElementType::kB4) << kSignatureRegElementTypeShift,
- kSignatureElementH2 = uint32_t(VecElementType::kH2) << kSignatureRegElementTypeShift
- };
- //! \endcond
-
- //! Returns whether the register has element type or element index (or both).
- ASMJIT_INLINE_NODEBUG constexpr bool hasElementTypeOrIndex() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask | kSignatureRegElementFlagMask>(); }
-
- //! Returns whether the vector register has associated a vector element type.
- ASMJIT_INLINE_NODEBUG constexpr bool hasElementType() const noexcept { return _signature.hasField<kSignatureRegElementTypeMask>(); }
- //! Returns vector element type of the register.
- ASMJIT_INLINE_NODEBUG constexpr VecElementType elementType() const noexcept { return VecElementType(_signature.getField<kSignatureRegElementTypeMask>()); }
- //! Sets vector element type of the register to `elementType`.
- ASMJIT_INLINE_NODEBUG void setElementType(VecElementType elementType) noexcept { _signature.setField<kSignatureRegElementTypeMask>(uint32_t(elementType)); }
- //! Resets vector element type to none.
- ASMJIT_INLINE_NODEBUG void resetElementType() noexcept { _signature.setField<kSignatureRegElementTypeMask>(0); }
-
- ASMJIT_INLINE_NODEBUG constexpr bool isVecB8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementB); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecH4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementH); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecS2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature | kSignatureElementS); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecD1() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecD>::kSignature); }
-
- ASMJIT_INLINE_NODEBUG constexpr bool isVecB16() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecH8() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecS4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementS); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecD2() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementD); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecB4x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementB4); }
- ASMJIT_INLINE_NODEBUG constexpr bool isVecH2x4() const noexcept { return _signature.subset(kBaseSignatureMask | kSignatureRegElementTypeMask) == (RegTraits<RegType::kARM_VecV>::kSignature | kSignatureElementH2); }
-
- //! Creates a cloned register with element access.
- ASMJIT_INLINE_NODEBUG Vec at(uint32_t elementIndex) const noexcept {
- return Vec((signature() & ~kSignatureRegElementIndexMask) | (elementIndex << kSignatureRegElementIndexShift) | kSignatureRegElementFlagMask, id());
- }
-
- //! Cast this register to an 8-bit B register (AArch64 only).
- ASMJIT_INLINE_NODEBUG VecB b() const noexcept;
- //! Cast this register to a 16-bit H register (AArch64 only).
- ASMJIT_INLINE_NODEBUG VecH h() const noexcept;
- //! Cast this register to a 32-bit S register.
- ASMJIT_INLINE_NODEBUG VecS s() const noexcept;
- //! Cast this register to a 64-bit D register.
- ASMJIT_INLINE_NODEBUG VecD d() const noexcept;
- //! Cast this register to a 128-bit Q register.
- ASMJIT_INLINE_NODEBUG VecV q() const noexcept;
- //! Cast this register to a 128-bit V register.
- ASMJIT_INLINE_NODEBUG VecV v() const noexcept;
-
- //! Casts this register to b (clone).
- ASMJIT_INLINE_NODEBUG Vec v8() const noexcept;
- //! Casts this register to h (clone).
- ASMJIT_INLINE_NODEBUG Vec v16() const noexcept;
- //! Casts this register to s (clone).
- ASMJIT_INLINE_NODEBUG Vec v32() const noexcept;
- //! Casts this register to d (clone).
- ASMJIT_INLINE_NODEBUG Vec v64() const noexcept;
- //! Casts this register to q (clone).
- ASMJIT_INLINE_NODEBUG Vec v128() const noexcept;
-
- //! Cast this register to a 128-bit V.B[elementIndex] register.
- ASMJIT_INLINE_NODEBUG VecV b(uint32_t elementIndex) const noexcept;
- //! Cast this register to a 128-bit V.H[elementIndex] register.
- ASMJIT_INLINE_NODEBUG VecV h(uint32_t elementIndex) const noexcept;
- //! Cast this register to a 128-bit V.S[elementIndex] register.
- ASMJIT_INLINE_NODEBUG VecV s(uint32_t elementIndex) const noexcept;
- //! Cast this register to a 128-bit V.D[elementIndex] register.
- ASMJIT_INLINE_NODEBUG VecV d(uint32_t elementIndex) const noexcept;
- //! Cast this register to a 128-bit V.H2[elementIndex] register.
- ASMJIT_INLINE_NODEBUG VecV h2(uint32_t elementIndex) const noexcept;
- //! Cast this register to a 128-bit V.B4[elementIndex] register.
- ASMJIT_INLINE_NODEBUG VecV b4(uint32_t elementIndex) const noexcept;
-
- //! Cast this register to V.8B.
- ASMJIT_INLINE_NODEBUG VecD b8() const noexcept;
- //! Cast this register to V.16B.
- ASMJIT_INLINE_NODEBUG VecV b16() const noexcept;
- //! Cast this register to V.2H.
- ASMJIT_INLINE_NODEBUG VecS h2() const noexcept;
- //! Cast this register to V.4H.
- ASMJIT_INLINE_NODEBUG VecD h4() const noexcept;
- //! Cast this register to V.8H.
- ASMJIT_INLINE_NODEBUG VecV h8() const noexcept;
- //! Cast this register to V.2S.
- ASMJIT_INLINE_NODEBUG VecD s2() const noexcept;
- //! Cast this register to V.4S.
- ASMJIT_INLINE_NODEBUG VecV s4() const noexcept;
- //! Cast this register to V.2D.
- ASMJIT_INLINE_NODEBUG VecV d2() const noexcept;
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature _makeElementAccessSignature(VecElementType elementType, uint32_t elementIndex) noexcept {
- return OperandSignature{
- uint32_t(RegTraits<RegType::kARM_VecV>::kSignature) |
- uint32_t(kSignatureRegElementFlagMask) |
- (uint32_t(elementType) << kSignatureRegElementTypeShift) |
- (uint32_t(elementIndex << kSignatureRegElementIndexShift))};
- }
-};
-
-//! 8-bit view (S) of VFP/SIMD register.
-class VecB : public Vec {
-public:
- ASMJIT_DEFINE_FINAL_REG(VecB, Vec, RegTraits<RegType::kARM_VecB>)
-};
-
-//! 16-bit view (S) of VFP/SIMD register.
-class VecH : public Vec {
-public:
- ASMJIT_DEFINE_FINAL_REG(VecH, Vec, RegTraits<RegType::kARM_VecH>)
-};
-
-//! 32-bit view (S) of VFP/SIMD register.
-class VecS : public Vec {
-public:
- ASMJIT_DEFINE_FINAL_REG(VecS, Vec, RegTraits<RegType::kARM_VecS>)
-};
-
-//! 64-bit view (D) of VFP/SIMD register.
-class VecD : public Vec {
-public:
- ASMJIT_DEFINE_FINAL_REG(VecD, Vec, RegTraits<RegType::kARM_VecD>)
-};
-
-//! 128-bit vector register (Q or V).
-class VecV : public Vec {
-public:
- ASMJIT_DEFINE_FINAL_REG(VecV, Vec, RegTraits<RegType::kARM_VecV>)
-};
-
-ASMJIT_INLINE_NODEBUG VecB Vec::b() const noexcept { return VecB(id()); }
-ASMJIT_INLINE_NODEBUG VecH Vec::h() const noexcept { return VecH(id()); }
-ASMJIT_INLINE_NODEBUG VecS Vec::s() const noexcept { return VecS(id()); }
-ASMJIT_INLINE_NODEBUG VecD Vec::d() const noexcept { return VecD(id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::q() const noexcept { return VecV(id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::v() const noexcept { return VecV(id()); }
-
-ASMJIT_INLINE_NODEBUG Vec Vec::v8() const noexcept { return VecB(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v16() const noexcept { return VecH(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v32() const noexcept { return VecS(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v64() const noexcept { return VecD(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v128() const noexcept { return VecV(id()); }
-
-ASMJIT_INLINE_NODEBUG VecV Vec::b(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kB, elementIndex), id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::h(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kH, elementIndex), id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::s(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kS, elementIndex), id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::d(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kD, elementIndex), id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::h2(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kH2, elementIndex), id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::b4(uint32_t elementIndex) const noexcept { return VecV(_makeElementAccessSignature(VecElementType::kB4, elementIndex), id()); }
-
-ASMJIT_INLINE_NODEBUG VecD Vec::b8() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementB}, id()); }
-ASMJIT_INLINE_NODEBUG VecS Vec::h2() const noexcept { return VecS(OperandSignature{VecS::kSignature | kSignatureElementH}, id()); }
-ASMJIT_INLINE_NODEBUG VecD Vec::h4() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementH}, id()); }
-ASMJIT_INLINE_NODEBUG VecD Vec::s2() const noexcept { return VecD(OperandSignature{VecD::kSignature | kSignatureElementS}, id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::b16() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementB}, id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::h8() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementH}, id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::s4() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementS}, id()); }
-ASMJIT_INLINE_NODEBUG VecV Vec::d2() const noexcept { return VecV(OperandSignature{VecV::kSignature | kSignatureElementD}, id()); }
-
-#ifndef _DOXYGEN
-namespace regs {
-#endif
-
-//! Creates a 32-bit W register operand.
-static ASMJIT_INLINE_NODEBUG constexpr GpW w(uint32_t id) noexcept { return GpW(id); }
-//! Creates a 64-bit X register operand.
-static ASMJIT_INLINE_NODEBUG constexpr GpX x(uint32_t id) noexcept { return GpX(id); }
-
-//! Creates a 32-bit S register operand.
-static ASMJIT_INLINE_NODEBUG constexpr VecS s(uint32_t id) noexcept { return VecS(id); }
-//! Creates a 64-bit D register operand.
-static ASMJIT_INLINE_NODEBUG constexpr VecD d(uint32_t id) noexcept { return VecD(id); }
-//! Creates a 1282-bit V register operand.
-static ASMJIT_INLINE_NODEBUG constexpr VecV v(uint32_t id) noexcept { return VecV(id); }
-
-static constexpr GpW w0 = GpW(0);
-static constexpr GpW w1 = GpW(1);
-static constexpr GpW w2 = GpW(2);
-static constexpr GpW w3 = GpW(3);
-static constexpr GpW w4 = GpW(4);
-static constexpr GpW w5 = GpW(5);
-static constexpr GpW w6 = GpW(6);
-static constexpr GpW w7 = GpW(7);
-static constexpr GpW w8 = GpW(8);
-static constexpr GpW w9 = GpW(9);
-static constexpr GpW w10 = GpW(10);
-static constexpr GpW w11 = GpW(11);
-static constexpr GpW w12 = GpW(12);
-static constexpr GpW w13 = GpW(13);
-static constexpr GpW w14 = GpW(14);
-static constexpr GpW w15 = GpW(15);
-static constexpr GpW w16 = GpW(16);
-static constexpr GpW w17 = GpW(17);
-static constexpr GpW w18 = GpW(18);
-static constexpr GpW w19 = GpW(19);
-static constexpr GpW w20 = GpW(20);
-static constexpr GpW w21 = GpW(21);
-static constexpr GpW w22 = GpW(22);
-static constexpr GpW w23 = GpW(23);
-static constexpr GpW w24 = GpW(24);
-static constexpr GpW w25 = GpW(25);
-static constexpr GpW w26 = GpW(26);
-static constexpr GpW w27 = GpW(27);
-static constexpr GpW w28 = GpW(28);
-static constexpr GpW w29 = GpW(29);
-static constexpr GpW w30 = GpW(30);
-static constexpr GpW wzr = GpW(Gp::kIdZr);
-static constexpr GpW wsp = GpW(Gp::kIdSp);
-
-static constexpr GpX x0 = GpX(0);
-static constexpr GpX x1 = GpX(1);
-static constexpr GpX x2 = GpX(2);
-static constexpr GpX x3 = GpX(3);
-static constexpr GpX x4 = GpX(4);
-static constexpr GpX x5 = GpX(5);
-static constexpr GpX x6 = GpX(6);
-static constexpr GpX x7 = GpX(7);
-static constexpr GpX x8 = GpX(8);
-static constexpr GpX x9 = GpX(9);
-static constexpr GpX x10 = GpX(10);
-static constexpr GpX x11 = GpX(11);
-static constexpr GpX x12 = GpX(12);
-static constexpr GpX x13 = GpX(13);
-static constexpr GpX x14 = GpX(14);
-static constexpr GpX x15 = GpX(15);
-static constexpr GpX x16 = GpX(16);
-static constexpr GpX x17 = GpX(17);
-static constexpr GpX x18 = GpX(18);
-static constexpr GpX x19 = GpX(19);
-static constexpr GpX x20 = GpX(20);
-static constexpr GpX x21 = GpX(21);
-static constexpr GpX x22 = GpX(22);
-static constexpr GpX x23 = GpX(23);
-static constexpr GpX x24 = GpX(24);
-static constexpr GpX x25 = GpX(25);
-static constexpr GpX x26 = GpX(26);
-static constexpr GpX x27 = GpX(27);
-static constexpr GpX x28 = GpX(28);
-static constexpr GpX x29 = GpX(29);
-static constexpr GpX x30 = GpX(30);
-static constexpr GpX xzr = GpX(Gp::kIdZr);
-static constexpr GpX sp = GpX(Gp::kIdSp);
-
-static constexpr VecB b0 = VecB(0);
-static constexpr VecB b1 = VecB(1);
-static constexpr VecB b2 = VecB(2);
-static constexpr VecB b3 = VecB(3);
-static constexpr VecB b4 = VecB(4);
-static constexpr VecB b5 = VecB(5);
-static constexpr VecB b6 = VecB(6);
-static constexpr VecB b7 = VecB(7);
-static constexpr VecB b8 = VecB(8);
-static constexpr VecB b9 = VecB(9);
-static constexpr VecB b10 = VecB(10);
-static constexpr VecB b11 = VecB(11);
-static constexpr VecB b12 = VecB(12);
-static constexpr VecB b13 = VecB(13);
-static constexpr VecB b14 = VecB(14);
-static constexpr VecB b15 = VecB(15);
-static constexpr VecB b16 = VecB(16);
-static constexpr VecB b17 = VecB(17);
-static constexpr VecB b18 = VecB(18);
-static constexpr VecB b19 = VecB(19);
-static constexpr VecB b20 = VecB(20);
-static constexpr VecB b21 = VecB(21);
-static constexpr VecB b22 = VecB(22);
-static constexpr VecB b23 = VecB(23);
-static constexpr VecB b24 = VecB(24);
-static constexpr VecB b25 = VecB(25);
-static constexpr VecB b26 = VecB(26);
-static constexpr VecB b27 = VecB(27);
-static constexpr VecB b28 = VecB(28);
-static constexpr VecB b29 = VecB(29);
-static constexpr VecB b30 = VecB(30);
-static constexpr VecB b31 = VecB(31);
-
-static constexpr VecH h0 = VecH(0);
-static constexpr VecH h1 = VecH(1);
-static constexpr VecH h2 = VecH(2);
-static constexpr VecH h3 = VecH(3);
-static constexpr VecH h4 = VecH(4);
-static constexpr VecH h5 = VecH(5);
-static constexpr VecH h6 = VecH(6);
-static constexpr VecH h7 = VecH(7);
-static constexpr VecH h8 = VecH(8);
-static constexpr VecH h9 = VecH(9);
-static constexpr VecH h10 = VecH(10);
-static constexpr VecH h11 = VecH(11);
-static constexpr VecH h12 = VecH(12);
-static constexpr VecH h13 = VecH(13);
-static constexpr VecH h14 = VecH(14);
-static constexpr VecH h15 = VecH(15);
-static constexpr VecH h16 = VecH(16);
-static constexpr VecH h17 = VecH(17);
-static constexpr VecH h18 = VecH(18);
-static constexpr VecH h19 = VecH(19);
-static constexpr VecH h20 = VecH(20);
-static constexpr VecH h21 = VecH(21);
-static constexpr VecH h22 = VecH(22);
-static constexpr VecH h23 = VecH(23);
-static constexpr VecH h24 = VecH(24);
-static constexpr VecH h25 = VecH(25);
-static constexpr VecH h26 = VecH(26);
-static constexpr VecH h27 = VecH(27);
-static constexpr VecH h28 = VecH(28);
-static constexpr VecH h29 = VecH(29);
-static constexpr VecH h30 = VecH(30);
-static constexpr VecH h31 = VecH(31);
-
-static constexpr VecS s0 = VecS(0);
-static constexpr VecS s1 = VecS(1);
-static constexpr VecS s2 = VecS(2);
-static constexpr VecS s3 = VecS(3);
-static constexpr VecS s4 = VecS(4);
-static constexpr VecS s5 = VecS(5);
-static constexpr VecS s6 = VecS(6);
-static constexpr VecS s7 = VecS(7);
-static constexpr VecS s8 = VecS(8);
-static constexpr VecS s9 = VecS(9);
-static constexpr VecS s10 = VecS(10);
-static constexpr VecS s11 = VecS(11);
-static constexpr VecS s12 = VecS(12);
-static constexpr VecS s13 = VecS(13);
-static constexpr VecS s14 = VecS(14);
-static constexpr VecS s15 = VecS(15);
-static constexpr VecS s16 = VecS(16);
-static constexpr VecS s17 = VecS(17);
-static constexpr VecS s18 = VecS(18);
-static constexpr VecS s19 = VecS(19);
-static constexpr VecS s20 = VecS(20);
-static constexpr VecS s21 = VecS(21);
-static constexpr VecS s22 = VecS(22);
-static constexpr VecS s23 = VecS(23);
-static constexpr VecS s24 = VecS(24);
-static constexpr VecS s25 = VecS(25);
-static constexpr VecS s26 = VecS(26);
-static constexpr VecS s27 = VecS(27);
-static constexpr VecS s28 = VecS(28);
-static constexpr VecS s29 = VecS(29);
-static constexpr VecS s30 = VecS(30);
-static constexpr VecS s31 = VecS(31);
-
-static constexpr VecD d0 = VecD(0);
-static constexpr VecD d1 = VecD(1);
-static constexpr VecD d2 = VecD(2);
-static constexpr VecD d3 = VecD(3);
-static constexpr VecD d4 = VecD(4);
-static constexpr VecD d5 = VecD(5);
-static constexpr VecD d6 = VecD(6);
-static constexpr VecD d7 = VecD(7);
-static constexpr VecD d8 = VecD(8);
-static constexpr VecD d9 = VecD(9);
-static constexpr VecD d10 = VecD(10);
-static constexpr VecD d11 = VecD(11);
-static constexpr VecD d12 = VecD(12);
-static constexpr VecD d13 = VecD(13);
-static constexpr VecD d14 = VecD(14);
-static constexpr VecD d15 = VecD(15);
-static constexpr VecD d16 = VecD(16);
-static constexpr VecD d17 = VecD(17);
-static constexpr VecD d18 = VecD(18);
-static constexpr VecD d19 = VecD(19);
-static constexpr VecD d20 = VecD(20);
-static constexpr VecD d21 = VecD(21);
-static constexpr VecD d22 = VecD(22);
-static constexpr VecD d23 = VecD(23);
-static constexpr VecD d24 = VecD(24);
-static constexpr VecD d25 = VecD(25);
-static constexpr VecD d26 = VecD(26);
-static constexpr VecD d27 = VecD(27);
-static constexpr VecD d28 = VecD(28);
-static constexpr VecD d29 = VecD(29);
-static constexpr VecD d30 = VecD(30);
-static constexpr VecD d31 = VecD(31);
-
-static constexpr VecV q0 = VecV(0);
-static constexpr VecV q1 = VecV(1);
-static constexpr VecV q2 = VecV(2);
-static constexpr VecV q3 = VecV(3);
-static constexpr VecV q4 = VecV(4);
-static constexpr VecV q5 = VecV(5);
-static constexpr VecV q6 = VecV(6);
-static constexpr VecV q7 = VecV(7);
-static constexpr VecV q8 = VecV(8);
-static constexpr VecV q9 = VecV(9);
-static constexpr VecV q10 = VecV(10);
-static constexpr VecV q11 = VecV(11);
-static constexpr VecV q12 = VecV(12);
-static constexpr VecV q13 = VecV(13);
-static constexpr VecV q14 = VecV(14);
-static constexpr VecV q15 = VecV(15);
-static constexpr VecV q16 = VecV(16);
-static constexpr VecV q17 = VecV(17);
-static constexpr VecV q18 = VecV(18);
-static constexpr VecV q19 = VecV(19);
-static constexpr VecV q20 = VecV(20);
-static constexpr VecV q21 = VecV(21);
-static constexpr VecV q22 = VecV(22);
-static constexpr VecV q23 = VecV(23);
-static constexpr VecV q24 = VecV(24);
-static constexpr VecV q25 = VecV(25);
-static constexpr VecV q26 = VecV(26);
-static constexpr VecV q27 = VecV(27);
-static constexpr VecV q28 = VecV(28);
-static constexpr VecV q29 = VecV(29);
-static constexpr VecV q30 = VecV(30);
-static constexpr VecV q31 = VecV(31);
-
-static constexpr VecV v0 = VecV(0);
-static constexpr VecV v1 = VecV(1);
-static constexpr VecV v2 = VecV(2);
-static constexpr VecV v3 = VecV(3);
-static constexpr VecV v4 = VecV(4);
-static constexpr VecV v5 = VecV(5);
-static constexpr VecV v6 = VecV(6);
-static constexpr VecV v7 = VecV(7);
-static constexpr VecV v8 = VecV(8);
-static constexpr VecV v9 = VecV(9);
-static constexpr VecV v10 = VecV(10);
-static constexpr VecV v11 = VecV(11);
-static constexpr VecV v12 = VecV(12);
-static constexpr VecV v13 = VecV(13);
-static constexpr VecV v14 = VecV(14);
-static constexpr VecV v15 = VecV(15);
-static constexpr VecV v16 = VecV(16);
-static constexpr VecV v17 = VecV(17);
-static constexpr VecV v18 = VecV(18);
-static constexpr VecV v19 = VecV(19);
-static constexpr VecV v20 = VecV(20);
-static constexpr VecV v21 = VecV(21);
-static constexpr VecV v22 = VecV(22);
-static constexpr VecV v23 = VecV(23);
-static constexpr VecV v24 = VecV(24);
-static constexpr VecV v25 = VecV(25);
-static constexpr VecV v26 = VecV(26);
-static constexpr VecV v27 = VecV(27);
-static constexpr VecV v28 = VecV(28);
-static constexpr VecV v29 = VecV(29);
-static constexpr VecV v30 = VecV(30);
-static constexpr VecV v31 = VecV(31);
-
-#ifndef _DOXYGEN
-} // {regs}
-
-// Make `a64::regs` accessible through `a64` namespace as well.
-using namespace regs;
-#endif
-
-//! \name Shift Operation Construction
-//! \{
-
-//! Constructs a `UXTB #value` extend and shift (unsigned byte extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift uxtb(uint32_t value) noexcept { return Shift(ShiftOp::kUXTB, value); }
-//! Constructs a `UXTH #value` extend and shift (unsigned hword extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift uxth(uint32_t value) noexcept { return Shift(ShiftOp::kUXTH, value); }
-//! Constructs a `UXTW #value` extend and shift (unsigned word extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift uxtw(uint32_t value) noexcept { return Shift(ShiftOp::kUXTW, value); }
-//! Constructs a `UXTX #value` extend and shift (unsigned dword extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift uxtx(uint32_t value) noexcept { return Shift(ShiftOp::kUXTX, value); }
-
-//! Constructs a `SXTB #value` extend and shift (signed byte extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift sxtb(uint32_t value) noexcept { return Shift(ShiftOp::kSXTB, value); }
-//! Constructs a `SXTH #value` extend and shift (signed hword extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift sxth(uint32_t value) noexcept { return Shift(ShiftOp::kSXTH, value); }
-//! Constructs a `SXTW #value` extend and shift (signed word extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift sxtw(uint32_t value) noexcept { return Shift(ShiftOp::kSXTW, value); }
-//! Constructs a `SXTX #value` extend and shift (signed dword extend) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Shift sxtx(uint32_t value) noexcept { return Shift(ShiftOp::kSXTX, value); }
-
-//! \}
-
-//! \name Memory Operand Construction
-//! \{
-
-//! Creates `[base, offset]` memory operand (offset mode) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, int32_t offset = 0) noexcept {
- return Mem(base, offset);
-}
-
-//! Creates `[base, offset]!` memory operand (pre-index mode) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, int32_t offset = 0) noexcept {
- return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPreIndex));
-}
-
-//! Creates `[base], offset` memory operand (post-index mode) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, int32_t offset = 0) noexcept {
- return Mem(base, offset, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPostIndex));
-}
-
-//! Creates `[base, index]` memory operand (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index) noexcept {
- return Mem(base, index);
-}
-
-//! Creates `[base, index]!` memory operand (pre-index mode) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_pre(const Gp& base, const Gp& index) noexcept {
- return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPreIndex));
-}
-
-//! Creates `[base], index` memory operand (post-index mode) (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_post(const Gp& base, const Gp& index) noexcept {
- return Mem(base, index, OperandSignature::fromValue<Mem::kSignatureMemOffsetModeMask>(OffsetMode::kPostIndex));
-}
-
-//! Creates `[base, index, SHIFT_OP #shift]` memory operand (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index, const Shift& shift) noexcept {
- return Mem(base, index, shift);
-}
-
-//! Creates `[base, offset]` memory operand (AArch64).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, int32_t offset = 0) noexcept {
- return Mem(base, offset);
-}
-
-// TODO: [ARM] PC + offset address.
-#if 0
-//! Creates `[PC + offset]` (relative) memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const PC& pc, int32_t offset = 0) noexcept {
- return Mem(pc, offset);
-}
-#endif
-
-//! \}
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-//! \cond INTERNAL
-ASMJIT_BEGIN_NAMESPACE
-ASMJIT_DEFINE_TYPE_ID(a64::GpW, TypeId::kInt32);
-ASMJIT_DEFINE_TYPE_ID(a64::GpX, TypeId::kInt64);
-ASMJIT_DEFINE_TYPE_ID(a64::VecS, TypeId::kFloat32x1);
-ASMJIT_DEFINE_TYPE_ID(a64::VecD, TypeId::kFloat64x1);
-ASMJIT_DEFINE_TYPE_ID(a64::VecV, TypeId::kInt32x4);
-ASMJIT_END_NAMESPACE
-//! \endcond
-
-#endif // ASMJIT_ARM_A64OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp b/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp
deleted file mode 100644
index b97f259efa0..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64rapass.cpp
+++ /dev/null
@@ -1,854 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_AARCH64) && !defined(ASMJIT_NO_COMPILER)
-
-#include "../core/cpuinfo.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../arm/a64assembler.h"
-#include "../arm/a64compiler.h"
-#include "../arm/a64emithelper_p.h"
-#include "../arm/a64instapi_p.h"
-#include "../arm/a64instdb_p.h"
-#include "../arm/a64rapass_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-// a64::ARMRAPass - Helpers
-// ========================
-
-// TODO: [ARM] These should be shared with all backends.
-ASMJIT_MAYBE_UNUSED
-static inline uint64_t raImmMaskFromSize(uint32_t size) noexcept {
- ASMJIT_ASSERT(size > 0 && size < 256);
- static const uint64_t masks[] = {
- 0x00000000000000FFu, // 1
- 0x000000000000FFFFu, // 2
- 0x00000000FFFFFFFFu, // 4
- 0xFFFFFFFFFFFFFFFFu, // 8
- 0x0000000000000000u, // 16
- 0x0000000000000000u, // 32
- 0x0000000000000000u, // 64
- 0x0000000000000000u, // 128
- 0x0000000000000000u // 256
- };
- return masks[Support::ctz(size)];
-}
-
-static const RegMask raConsecutiveLeadCountToRegMaskFilter[5] = {
- 0xFFFFFFFFu, // [0] No consecutive.
- 0x00000000u, // [1] Invalid, never used.
- 0x7FFFFFFFu, // [2] 2 consecutive registers.
- 0x3FFFFFFFu, // [3] 3 consecutive registers.
- 0x1FFFFFFFu // [4] 4 consecutive registers.
-};
-
-static inline RATiedFlags raUseOutFlagsFromRWFlags(OpRWFlags rwFlags) noexcept {
- static constexpr RATiedFlags map[] = {
- RATiedFlags::kNone,
- RATiedFlags::kRead | RATiedFlags::kUse, // kRead
- RATiedFlags::kWrite | RATiedFlags::kOut, // kWrite
- RATiedFlags::kRW | RATiedFlags::kUse, // kRW
- };
-
- return map[uint32_t(rwFlags & OpRWFlags::kRW)];
-}
-
-static inline RATiedFlags raRegRwFlags(OpRWFlags flags) noexcept {
- return raUseOutFlagsFromRWFlags(flags);
-}
-
-static inline RATiedFlags raMemBaseRwFlags(OpRWFlags flags) noexcept {
- constexpr uint32_t shift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemBaseRW)>::value;
- return raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> shift) & OpRWFlags::kRW);
-}
-
-static inline RATiedFlags raMemIndexRwFlags(OpRWFlags flags) noexcept {
- constexpr uint32_t shift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemIndexRW)>::value;
- return raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> shift) & OpRWFlags::kRW);
-}
-// a64::RACFGBuilder
-// =================
-
-class RACFGBuilder : public RACFGBuilderT<RACFGBuilder> {
-public:
- Arch _arch;
-
- inline RACFGBuilder(ARMRAPass* pass) noexcept
- : RACFGBuilderT<RACFGBuilder>(pass),
- _arch(pass->cc()->arch()) {}
-
- inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cc); }
-
- Error onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept;
-
- Error onBeforeInvoke(InvokeNode* invokeNode) noexcept;
- Error onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept;
-
- Error moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept;
- Error moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept;
- Error moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept;
-
- Error onBeforeRet(FuncRetNode* funcRet) noexcept;
- Error onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept;
-};
-
-// a64::RACFGBuilder - OnInst
-// ==========================
-
-// TODO: [ARM] This is just a workaround...
-static InstControlFlow getControlFlowType(InstId instId) noexcept {
- switch (BaseInst::extractRealId(instId)) {
- case Inst::kIdB:
- case Inst::kIdBr:
- if (BaseInst::extractARMCondCode(instId) == CondCode::kAL)
- return InstControlFlow::kJump;
- else
- return InstControlFlow::kBranch;
- case Inst::kIdBl:
- case Inst::kIdBlr:
- return InstControlFlow::kCall;
- case Inst::kIdCbz:
- case Inst::kIdCbnz:
- case Inst::kIdTbz:
- case Inst::kIdTbnz:
- return InstControlFlow::kBranch;
- case Inst::kIdRet:
- return InstControlFlow::kReturn;
- default:
- return InstControlFlow::kRegular;
- }
-}
-
-Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept {
- InstRWInfo rwInfo;
-
- if (Inst::isDefinedId(inst->realId())) {
- InstId instId = inst->id();
- uint32_t opCount = inst->opCount();
- const Operand* opArray = inst->operands();
- ASMJIT_PROPAGATE(InstInternal::queryRWInfo(inst->baseInst(), opArray, opCount, &rwInfo));
-
- const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
- uint32_t singleRegOps = 0;
-
- ib.addInstRWFlags(rwInfo.instFlags());
-
- if (opCount) {
- uint32_t consecutiveOffset = 0xFFFFFFFFu;
- uint32_t consecutiveParent = Globals::kInvalidId;
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand& op = opArray[i];
- const OpRWInfo& opRwInfo = rwInfo.operand(i);
-
- if (op.isReg()) {
- // Register Operand
- // ----------------
- const Reg& reg = op.as<Reg>();
-
- RATiedFlags flags = raRegRwFlags(opRwInfo.opFlags());
- uint32_t vIndex = Operand::virtIdToIndex(reg.id());
-
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- // Use RW instead of Write in case that not the whole register is overwritten. This is important for
- // liveness as we cannot kill a register that will be used.
- if ((flags & RATiedFlags::kRW) == RATiedFlags::kWrite) {
- if (workReg->regByteMask() & ~(opRwInfo.writeByteMask() | opRwInfo.extendByteMask())) {
- // Not write-only operation.
- flags = (flags & ~RATiedFlags::kOut) | (RATiedFlags::kRead | RATiedFlags::kUse);
- }
- }
-
- RegGroup group = workReg->group();
-
- RegMask useRegs = _pass->_availableRegs[group];
- RegMask outRegs = useRegs;
-
- uint32_t useId = BaseReg::kIdBad;
- uint32_t outId = BaseReg::kIdBad;
-
- uint32_t useRewriteMask = 0;
- uint32_t outRewriteMask = 0;
-
- if (opRwInfo.consecutiveLeadCount()) {
- // There must be a single consecutive register lead, otherwise the RW data is invalid.
- if (consecutiveOffset != 0xFFFFFFFFu)
- return DebugUtils::errored(kErrorInvalidState);
-
- // A consecutive lead register cannot be used as a consecutive +1/+2/+3 register, the registers must be distinct.
- if (RATiedReg::consecutiveDataFromFlags(flags) != 0)
- return DebugUtils::errored(kErrorNotConsecutiveRegs);
-
- flags |= RATiedFlags::kLeadConsecutive | RATiedReg::consecutiveDataToFlags(opRwInfo.consecutiveLeadCount() - 1);
- consecutiveOffset = 0;
-
- RegMask filter = raConsecutiveLeadCountToRegMaskFilter[opRwInfo.consecutiveLeadCount()];
- if (Support::test(flags, RATiedFlags::kUse)) {
- flags |= RATiedFlags::kUseConsecutive;
- useRegs &= filter;
- }
- else {
- flags |= RATiedFlags::kOutConsecutive;
- outRegs &= filter;
- }
- }
-
- if (Support::test(flags, RATiedFlags::kUse)) {
- useRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
- if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
- useId = opRwInfo.physId();
- flags |= RATiedFlags::kUseFixed;
- }
- else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
- if (consecutiveOffset == 0xFFFFFFFFu)
- return DebugUtils::errored(kErrorInvalidState);
- flags |= RATiedFlags::kUseConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
- }
- }
- else {
- outRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
- if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
- outId = opRwInfo.physId();
- flags |= RATiedFlags::kOutFixed;
- }
- else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
- if (consecutiveOffset == 0xFFFFFFFFu)
- return DebugUtils::errored(kErrorInvalidState);
- flags |= RATiedFlags::kOutConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
- }
- }
-
- // Special cases regarding element access.
- if (reg.as<Vec>().hasElementIndex()) {
- // Only the first 0..15 registers can be used if the register uses
- // element accessor that accesses half-words (h[0..7] elements).
- if (instInfo.hasFlag(InstDB::kInstFlagVH0_15) && reg.as<Vec>().elementType() == VecElementType::kH) {
- if (Support::test(flags, RATiedFlags::kUse))
- useId &= 0x0000FFFFu;
- else
- outId &= 0x0000FFFFu;
- }
- }
-
- ASMJIT_PROPAGATE(ib.add(workReg, flags, useRegs, useId, useRewriteMask, outRegs, outId, outRewriteMask, opRwInfo.rmSize(), consecutiveParent));
- if (singleRegOps == i)
- singleRegOps++;
-
- if (Support::test(flags, RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive))
- consecutiveParent = workReg->workId();
- }
- }
- else if (op.isMem()) {
- // Memory Operand
- // --------------
- const Mem& mem = op.as<Mem>();
-
- if (mem.isRegHome()) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(mem.baseId()), &workReg));
- _pass->getOrCreateStackSlot(workReg);
- }
- else if (mem.hasBaseReg()) {
- uint32_t vIndex = Operand::virtIdToIndex(mem.baseId());
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RATiedFlags flags = raMemBaseRwFlags(opRwInfo.opFlags());
- RegGroup group = workReg->group();
- RegMask allocable = _pass->_availableRegs[group];
-
- // Base registers have never fixed id on ARM.
- const uint32_t useId = BaseReg::kIdBad;
- const uint32_t outId = BaseReg::kIdBad;
-
- uint32_t useRewriteMask = 0;
- uint32_t outRewriteMask = 0;
-
- if (Support::test(flags, RATiedFlags::kUse))
- useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
- else
- outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
-
- ASMJIT_PROPAGATE(ib.add(workReg, flags, allocable, useId, useRewriteMask, allocable, outId, outRewriteMask));
- }
- }
-
- if (mem.hasIndexReg()) {
- uint32_t vIndex = Operand::virtIdToIndex(mem.indexId());
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RATiedFlags flags = raMemIndexRwFlags(opRwInfo.opFlags());
- RegGroup group = workReg->group();
- RegMask allocable = _pass->_availableRegs[group];
-
- // Index registers have never fixed id on ARM.
- const uint32_t useId = BaseReg::kIdBad;
- const uint32_t outId = BaseReg::kIdBad;
-
- uint32_t useRewriteMask = 0;
- uint32_t outRewriteMask = 0;
-
- if (Support::test(flags, RATiedFlags::kUse))
- useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
- else
- outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
-
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, allocable, useId, useRewriteMask, allocable, outId, outRewriteMask));
- }
- }
- }
- }
- }
-
- controlType = getControlFlowType(instId);
- }
-
- return kErrorOk;
-}
-
-// a64::RACFGBuilder - OnInvoke
-// ============================
-
-Error RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
- const FuncDetail& fd = invokeNode->detail();
- uint32_t argCount = invokeNode->argCount();
-
- cc()->_setCursor(invokeNode->prev());
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- const FuncValuePack& argPack = fd.argPack(argIndex);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- if (!argPack[valueIndex])
- break;
-
- const FuncValue& arg = argPack[valueIndex];
- const Operand& op = invokeNode->arg(argIndex, valueIndex);
-
- if (op.isNone())
- continue;
-
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (arg.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup argGroup = Reg::groupOf(arg.regType());
-
- if (regGroup != argGroup) {
- // TODO: [ARM] Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- else {
- ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, reg));
- }
- }
- else if (op.isImm()) {
- if (arg.isReg()) {
- BaseReg reg;
- ASMJIT_PROPAGATE(moveImmToRegArg(invokeNode, arg, op.as<Imm>(), &reg));
- invokeNode->_args[argIndex][valueIndex] = reg;
- }
- else {
- ASMJIT_PROPAGATE(moveImmToStackArg(invokeNode, arg, op.as<Imm>()));
- }
- }
- }
- }
-
- cc()->_setCursor(invokeNode);
-
- if (fd.hasRet()) {
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- const FuncValue& ret = fd.ret(valueIndex);
- if (!ret)
- break;
-
- const Operand& op = invokeNode->ret(valueIndex);
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (ret.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup retGroup = Reg::groupOf(ret.regType());
-
- if (regGroup != retGroup) {
- // TODO: [ARM] Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- }
- }
- }
-
- // This block has function call(s).
- _curBlock->addFlags(RABlockFlags::kHasFuncCalls);
- _pass->func()->frame().addAttributes(FuncAttributes::kHasFuncCalls);
- _pass->func()->frame().updateCallStackSize(fd.argStackSize());
-
- return kErrorOk;
-}
-
-Error RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept {
- uint32_t argCount = invokeNode->argCount();
- const FuncDetail& fd = invokeNode->detail();
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- const FuncValuePack& argPack = fd.argPack(argIndex);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- if (!argPack[valueIndex])
- continue;
-
- const FuncValue& arg = argPack[valueIndex];
- const Operand& op = invokeNode->arg(argIndex, valueIndex);
-
- if (op.isNone())
- continue;
-
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (arg.isIndirect()) {
- RegGroup regGroup = workReg->group();
- if (regGroup != RegGroup::kGp)
- return DebugUtils::errored(kErrorInvalidState);
- ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
- }
- else if (arg.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup argGroup = Reg::groupOf(arg.regType());
-
- if (regGroup == argGroup) {
- ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
- }
- }
- }
- }
- }
-
- for (uint32_t retIndex = 0; retIndex < Globals::kMaxValuePack; retIndex++) {
- const FuncValue& ret = fd.ret(retIndex);
- if (!ret)
- break;
-
- const Operand& op = invokeNode->ret(retIndex);
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (ret.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup retGroup = Reg::groupOf(ret.regType());
-
- if (regGroup == retGroup) {
- ASMJIT_PROPAGATE(ib.addCallRet(workReg, ret.regId()));
- }
- }
- else {
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- }
-
- // Setup clobbered registers.
- ib._clobbered[0] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(0)]) & ~fd.preservedRegs(RegGroup(0));
- ib._clobbered[1] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(1)]) & ~fd.preservedRegs(RegGroup(1));
- ib._clobbered[2] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(2)]) & ~fd.preservedRegs(RegGroup(2));
- ib._clobbered[3] = Support::lsbMask<RegMask>(_pass->_physRegCount[RegGroup(3)]) & ~fd.preservedRegs(RegGroup(3));
-
- return kErrorOk;
-}
-
-// a64::RACFGBuilder - MoveImmToRegArg
-// ===================================
-
-Error RACFGBuilder::moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept {
- DebugUtils::unused(invokeNode);
- ASMJIT_ASSERT(arg.isReg());
-
- Imm imm(imm_);
- TypeId typeId = TypeId::kVoid;
-
- switch (arg.typeId()) {
- case TypeId::kInt8 : typeId = TypeId::kUInt64; imm.signExtend8Bits(); break;
- case TypeId::kUInt8 : typeId = TypeId::kUInt64; imm.zeroExtend8Bits(); break;
- case TypeId::kInt16 : typeId = TypeId::kUInt64; imm.signExtend16Bits(); break;
- case TypeId::kUInt16: typeId = TypeId::kUInt64; imm.zeroExtend16Bits(); break;
- case TypeId::kInt32 : typeId = TypeId::kUInt64; imm.signExtend32Bits(); break;
- case TypeId::kUInt32: typeId = TypeId::kUInt64; imm.zeroExtend32Bits(); break;
- case TypeId::kInt64 : typeId = TypeId::kUInt64; break;
- case TypeId::kUInt64: typeId = TypeId::kUInt64; break;
-
- default:
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
-
- ASMJIT_PROPAGATE(cc()->_newReg(out, typeId, nullptr));
- cc()->virtRegById(out->id())->setWeight(BaseRAPass::kCallArgWeight);
- return cc()->mov(out->as<Gp>(), imm);
-}
-
-// a64::RACFGBuilder - MoveImmToStackArg
-// =====================================
-
-Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept {
- BaseReg reg;
-
- ASMJIT_PROPAGATE(moveImmToRegArg(invokeNode, arg, imm_, &reg));
- ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, reg));
-
- return kErrorOk;
-}
-
-// a64::RACFGBuilder - MoveRegToStackArg
-// =====================================
-
-Error RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept {
- DebugUtils::unused(invokeNode);
- Mem stackPtr = ptr(_pass->_sp.as<Gp>(), arg.stackOffset());
-
- if (reg.isGp())
- return cc()->str(reg.as<Gp>(), stackPtr);
-
- if (reg.isVec())
- return cc()->str(reg.as<Vec>(), stackPtr);
-
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// a64::RACFGBuilder - OnReg
-// =========================
-
-Error RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
- DebugUtils::unused(funcRet);
- return kErrorOk;
-}
-
-Error RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
- const FuncDetail& funcDetail = _pass->func()->detail();
- const Operand* opArray = funcRet->operands();
- uint32_t opCount = funcRet->opCount();
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand& op = opArray[i];
- if (op.isNone()) continue;
-
- const FuncValue& ret = funcDetail.ret(i);
- if (ASMJIT_UNLIKELY(!ret.isReg()))
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- if (op.isReg()) {
- // Register return value.
- const Reg& reg = op.as<Reg>();
- uint32_t vIndex = Operand::virtIdToIndex(reg.id());
-
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RegGroup group = workReg->group();
- RegMask allocable = _pass->_availableRegs[group];
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, allocable, ret.regId(), 0, 0, BaseReg::kIdBad, 0));
- }
- }
- else {
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
-
- return kErrorOk;
-}
-
-// a64::ARMRAPass - Construction & Destruction
-// ===========================================
-
-ARMRAPass::ARMRAPass() noexcept
- : BaseRAPass() { _iEmitHelper = &_emitHelper; }
-ARMRAPass::~ARMRAPass() noexcept {}
-
-// a64::ARMRAPass - OnInit / OnDone
-// ================================
-
-void ARMRAPass::onInit() noexcept {
- Arch arch = cc()->arch();
-
- _emitHelper._emitter = _cb;
-
- _archTraits = &ArchTraits::byArch(arch);
- _physRegCount.set(RegGroup::kGp, 32);
- _physRegCount.set(RegGroup::kVec, 32);
- _physRegCount.set(RegGroup::kMask, 0);
- _physRegCount.set(RegGroup::kExtraVirt3, 0);
- _buildPhysIndex();
-
- _availableRegCount = _physRegCount;
- _availableRegs[RegGroup::kGp] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kGp));
- _availableRegs[RegGroup::kVec] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kVec));
- _availableRegs[RegGroup::kMask] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kMask));
- _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<uint32_t>(_physRegCount.get(RegGroup::kExtraVirt3));
-
- _scratchRegIndexes[0] = uint8_t(27);
- _scratchRegIndexes[1] = uint8_t(28);
-
- // The architecture specific setup makes implicitly all registers available. So
- // make unavailable all registers that are special and cannot be used in general.
- bool hasFP = _func->frame().hasPreservedFP();
-
- // Apple ABI requires that the frame-pointer register is not changed by leaf functions and properly updated
- // by non-leaf functions. So, let's make this register unavailable as it's just not safe to update it.
- if (hasFP || cc()->environment().isDarwin())
- makeUnavailable(RegGroup::kGp, Gp::kIdFp);
-
- makeUnavailable(RegGroup::kGp, Gp::kIdSp);
- makeUnavailable(RegGroup::kGp, Gp::kIdOs); // OS-specific use, usually TLS.
-
- _sp = sp;
- _fp = x29;
-}
-
-void ARMRAPass::onDone() noexcept {}
-
-// a64::ARMRAPass - BuildCFG
-// =========================
-
-Error ARMRAPass::buildCFG() noexcept {
- return RACFGBuilder(this).run();
-}
-
-// a64::ARMRAPass - Rewrite
-// ========================
-
-ASMJIT_FAVOR_SPEED Error ARMRAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept {
- uint32_t virtCount = cc()->_vRegArray.size();
-
- BaseNode* node = first;
- while (node != stop) {
- BaseNode* next = node->next();
- if (node->isInst()) {
- InstNode* inst = node->as<InstNode>();
- RAInst* raInst = node->passData<RAInst>();
-
- Operand* operands = inst->operands();
- uint32_t opCount = inst->opCount();
-
- uint32_t i;
-
- // Rewrite virtual registers into physical registers.
- if (raInst) {
- // If the instruction contains pass data (raInst) then it was a subject
- // for register allocation and must be rewritten to use physical regs.
- RATiedReg* tiedRegs = raInst->tiedRegs();
- uint32_t tiedCount = raInst->tiedCount();
-
- for (i = 0; i < tiedCount; i++) {
- RATiedReg* tiedReg = &tiedRegs[i];
-
- Support::BitWordIterator<uint32_t> useIt(tiedReg->useRewriteMask());
- uint32_t useId = tiedReg->useId();
- while (useIt.hasNext())
- inst->rewriteIdAtIndex(useIt.next(), useId);
-
- Support::BitWordIterator<uint32_t> outIt(tiedReg->outRewriteMask());
- uint32_t outId = tiedReg->outId();
- while (outIt.hasNext())
- inst->rewriteIdAtIndex(outIt.next(), outId);
- }
-
- // This data is allocated by Zone passed to `runOnFunction()`, which
- // will be reset after the RA pass finishes. So reset this data to
- // prevent having a dead pointer after the RA pass is complete.
- node->resetPassData();
-
- if (ASMJIT_UNLIKELY(node->type() != NodeType::kInst)) {
- // FuncRet terminates the flow, it must either be removed if the exit
- // label is next to it (optimization) or patched to an architecture
- // dependent jump instruction that jumps to the function's exit before
- // the epilog.
- if (node->type() == NodeType::kFuncRet) {
- RABlock* block = raInst->block();
- if (!isNextTo(node, _func->exitNode())) {
- cc()->_setCursor(node->prev());
- ASMJIT_PROPAGATE(emitJump(_func->exitNode()->label()));
- }
-
- BaseNode* prev = node->prev();
- cc()->removeNode(node);
- block->setLast(prev);
- }
- }
- }
-
- // Rewrite stack slot addresses.
- for (i = 0; i < opCount; i++) {
- Operand& op = operands[i];
- if (op.isMem()) {
- BaseMem& mem = op.as<BaseMem>();
- if (mem.isRegHome()) {
- uint32_t virtIndex = Operand::virtIdToIndex(mem.baseId());
- if (ASMJIT_UNLIKELY(virtIndex >= virtCount))
- return DebugUtils::errored(kErrorInvalidVirtId);
-
- VirtReg* virtReg = cc()->virtRegByIndex(virtIndex);
- RAWorkReg* workReg = virtReg->workReg();
- ASMJIT_ASSERT(workReg != nullptr);
-
- RAStackSlot* slot = workReg->stackSlot();
- int32_t offset = slot->offset();
-
- mem._setBase(_sp.type(), slot->baseRegId());
- mem.clearRegHome();
- mem.addOffsetLo32(offset);
- }
- }
- }
-
- // Rewrite `loadAddressOf()` construct.
- if (inst->realId() == Inst::kIdAdr && inst->opCount() == 2 && inst->op(1).isMem()) {
- BaseMem mem = inst->op(1).as<BaseMem>();
- int64_t offset = mem.offset();
-
- if (!mem.hasBaseOrIndex()) {
- inst->setId(Inst::kIdMov);
- inst->setOp(1, Imm(offset));
- }
- else {
- if (mem.hasIndex())
- return DebugUtils::errored(kErrorInvalidAddressIndex);
-
- GpX dst(inst->op(0).as<Gp>().id());
- GpX base(mem.baseId());
-
- InstId arithInstId = offset < 0 ? Inst::kIdSub : Inst::kIdAdd;
- uint64_t absOffset = offset < 0 ? Support::neg(uint64_t(offset)) : uint64_t(offset);
-
- inst->setId(arithInstId);
- inst->setOpCount(3);
- inst->setOp(1, base);
- inst->setOp(2, Imm(absOffset));
-
- // Use two operations if the offset cannot be encoded with ADD/SUB.
- if (absOffset > 0xFFFu && (absOffset & ~uint64_t(0xFFF000u)) != 0) {
- if (absOffset <= 0xFFFFFFu) {
- cc()->_setCursor(inst->prev());
- ASMJIT_PROPAGATE(cc()->emit(arithInstId, dst, base, Imm(absOffset & 0xFFFu)));
-
- inst->setOp(1, dst);
- inst->setOp(2, Imm(absOffset & 0xFFF000u));
- }
- else {
- cc()->_setCursor(inst->prev());
- ASMJIT_PROPAGATE(cc()->emit(Inst::kIdMov, inst->op(0), Imm(absOffset)));
-
- inst->setOp(1, base);
- inst->setOp(2, dst);
- }
- }
- }
- }
- }
-
- node = next;
- }
-
- return kErrorOk;
-}
-
-// a64::ARMRAPass - Prolog & Epilog
-// ================================
-
-Error ARMRAPass::updateStackFrame() noexcept {
- if (_func->frame().hasFuncCalls())
- _func->frame().addDirtyRegs(RegGroup::kGp, Support::bitMask(Gp::kIdLr));
-
- return BaseRAPass::updateStackFrame();
-}
-
-// a64::ARMRAPass - OnEmit
-// =======================
-
-Error ARMRAPass::emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
- RAWorkReg* wReg = workRegById(workId);
- BaseReg dst(wReg->signature(), dstPhysId);
- BaseReg src(wReg->signature(), srcPhysId);
-
- const char* comment = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<MOVE> %s", workRegById(workId)->name());
- comment = _tmpString.data();
- }
-#endif
-
- return _emitHelper.emitRegMove(dst, src, wReg->typeId(), comment);
-}
-
-Error ARMRAPass::emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
- DebugUtils::unused(aWorkId, aPhysId, bWorkId, bPhysId);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error ARMRAPass::emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept {
- RAWorkReg* wReg = workRegById(workId);
- BaseReg dstReg(wReg->signature(), dstPhysId);
- BaseMem srcMem(workRegAsMem(wReg));
-
- const char* comment = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<LOAD> %s", workRegById(workId)->name());
- comment = _tmpString.data();
- }
-#endif
-
- return _emitHelper.emitRegMove(dstReg, srcMem, wReg->typeId(), comment);
-}
-
-Error ARMRAPass::emitSave(uint32_t workId, uint32_t srcPhysId) noexcept {
- RAWorkReg* wReg = workRegById(workId);
- BaseMem dstMem(workRegAsMem(wReg));
- BaseReg srcReg(wReg->signature(), srcPhysId);
-
- const char* comment = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<SAVE> %s", workRegById(workId)->name());
- comment = _tmpString.data();
- }
-#endif
-
- return _emitHelper.emitRegMove(dstMem, srcReg, wReg->typeId(), comment);
-}
-
-Error ARMRAPass::emitJump(const Label& label) noexcept {
- return cc()->b(label);
-}
-
-Error ARMRAPass::emitPreCall(InvokeNode* invokeNode) noexcept {
- DebugUtils::unused(invokeNode);
- return kErrorOk;
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_AARCH64 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h b/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h
deleted file mode 100644
index 73130873f44..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/a64rapass_p.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
-#define ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/compiler.h"
-#include "../core/rabuilders_p.h"
-#include "../core/rapass_p.h"
-#include "../arm/a64assembler.h"
-#include "../arm/a64compiler.h"
-#include "../arm/a64emithelper_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(a64)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_a64
-//! \{
-
-//! ARM register allocation pass.
-//!
-//! Takes care of generating function prologs and epilogs, and also performs
-//! register allocation.
-class ARMRAPass : public BaseRAPass {
-public:
- ASMJIT_NONCOPYABLE(ARMRAPass)
- typedef BaseRAPass Base;
-
- EmitHelper _emitHelper;
-
- //! \name Construction & Destruction
- //! \{
-
- ARMRAPass() noexcept;
- ~ARMRAPass() noexcept override;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the compiler casted to `arm::Compiler`.
- ASMJIT_INLINE_NODEBUG Compiler* cc() const noexcept { return static_cast<Compiler*>(_cb); }
-
- //! Returns emit helper.
- ASMJIT_INLINE_NODEBUG EmitHelper* emitHelper() noexcept { return &_emitHelper; }
-
- //! \}
-
- //! \name Events
- //! \{
-
- void onInit() noexcept override;
- void onDone() noexcept override;
-
- //! \}
-
- //! \name CFG
- //! \{
-
- Error buildCFG() noexcept override;
-
- //! \}
-
- //! \name Rewrite
- //! \{
-
- Error _rewrite(BaseNode* first, BaseNode* stop) noexcept override;
-
- //! \}
-
- //! \name Prolog & Epilog
- //! \{
-
- Error updateStackFrame() noexcept override;
-
- //! \}
-
- //! \name Emit Helpers
- //! \{
-
- Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept override;
- Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept override;
-
- Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept override;
- Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept override;
-
- Error emitJump(const Label& label) noexcept override;
- Error emitPreCall(InvokeNode* invokeNode) noexcept override;
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_ARM_A64RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp b/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp
deleted file mode 100644
index 3fe2c6b911c..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/armformatter.cpp
+++ /dev/null
@@ -1,588 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_LOGGING
-
-#include "../core/misc_p.h"
-#include "../core/support.h"
-#include "../arm/armformatter_p.h"
-#include "../arm/a64operand.h"
-#include "../arm/a64instapi_p.h"
-#include "../arm/a64instdb_p.h"
-
-#ifndef ASMJIT_NO_COMPILER
- #include "../core/compiler.h"
-#endif
-
-ASMJIT_BEGIN_SUB_NAMESPACE(arm)
-
-// arm::FormatterInternal - Format Feature
-// =======================================
-
-Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept {
- // @EnumStringBegin{"enum": "CpuFeatures::ARM", "output": "sFeature", "strip": "k"}@
- static const char sFeatureString[] =
- "None\0"
- "ARMv6\0"
- "ARMv7\0"
- "ARMv8a\0"
- "THUMB\0"
- "THUMBv2\0"
- "ABLE\0"
- "ADERR\0"
- "AES\0"
- "AFP\0"
- "AIE\0"
- "AMU1\0"
- "AMU1_1\0"
- "ANERR\0"
- "ASIMD\0"
- "BF16\0"
- "BRBE\0"
- "BTI\0"
- "BWE\0"
- "CCIDX\0"
- "CHK\0"
- "CLRBHB\0"
- "CMOW\0"
- "CONSTPACFIELD\0"
- "CPA\0"
- "CPA2\0"
- "CPUID\0"
- "CRC32\0"
- "CSSC\0"
- "CSV2\0"
- "CSV2_3\0"
- "CSV3\0"
- "D128\0"
- "DGH\0"
- "DIT\0"
- "DOTPROD\0"
- "DPB\0"
- "DPB2\0"
- "EBEP\0"
- "EBF16\0"
- "ECBHB\0"
- "ECV\0"
- "EDHSR\0"
- "EDSP\0"
- "FAMINMAX\0"
- "FCMA\0"
- "FGT\0"
- "FGT2\0"
- "FHM\0"
- "FLAGM\0"
- "FLAGM2\0"
- "FMAC\0"
- "FP\0"
- "FP16\0"
- "FP16CONV\0"
- "FP8\0"
- "FP8DOT2\0"
- "FP8DOT4\0"
- "FP8FMA\0"
- "FPMR\0"
- "FRINTTS\0"
- "GCS\0"
- "HACDBS\0"
- "HAFDBS\0"
- "HAFT\0"
- "HDBSS\0"
- "HBC\0"
- "HCX\0"
- "HPDS\0"
- "HPDS2\0"
- "I8MM\0"
- "IDIVA\0"
- "IDIVT\0"
- "ITE\0"
- "JSCVT\0"
- "LOR\0"
- "LRCPC\0"
- "LRCPC2\0"
- "LRCPC3\0"
- "LS64\0"
- "LS64_ACCDATA\0"
- "LS64_V\0"
- "LSE\0"
- "LSE128\0"
- "LSE2\0"
- "LUT\0"
- "LVA\0"
- "LVA3\0"
- "MEC\0"
- "MOPS\0"
- "MPAM\0"
- "MTE\0"
- "MTE2\0"
- "MTE3\0"
- "MTE4\0"
- "MTE_ASYM_FAULT\0"
- "MTE_ASYNC\0"
- "MTE_CANONICAL_TAGS\0"
- "MTE_NO_ADDRESS_TAGS\0"
- "MTE_PERM_S1\0"
- "MTE_STORE_ONLY\0"
- "MTE_TAGGED_FAR\0"
- "MTPMU\0"
- "NMI\0"
- "NV\0"
- "NV2\0"
- "PAN\0"
- "PAN2\0"
- "PAN3\0"
- "PAUTH\0"
- "PFAR\0"
- "PMU\0"
- "PMULL\0"
- "PRFMSLC\0"
- "RAS\0"
- "RAS1_1\0"
- "RAS2\0"
- "RASSA2\0"
- "RDM\0"
- "RME\0"
- "RNG\0"
- "RNG_TRAP\0"
- "RPRES\0"
- "RPRFM\0"
- "S1PIE\0"
- "S1POE\0"
- "S2PIE\0"
- "S2POE\0"
- "SB\0"
- "SCTLR2\0"
- "SEBEP\0"
- "SEL2\0"
- "SHA1\0"
- "SHA256\0"
- "SHA3\0"
- "SHA512\0"
- "SM3\0"
- "SM4\0"
- "SME\0"
- "SME2\0"
- "SME2_1\0"
- "SME_B16B16\0"
- "SME_B16F32\0"
- "SME_BI32I32\0"
- "SME_F16F16\0"
- "SME_F16F32\0"
- "SME_F32F32\0"
- "SME_F64F64\0"
- "SME_F8F16\0"
- "SME_F8F32\0"
- "SME_FA64\0"
- "SME_I16I32\0"
- "SME_I16I64\0"
- "SME_I8I32\0"
- "SME_LUTv2\0"
- "SPE\0"
- "SPE1_1\0"
- "SPE1_2\0"
- "SPE1_3\0"
- "SPE1_4\0"
- "SPE_ALTCLK\0"
- "SPE_CRR\0"
- "SPE_EFT\0"
- "SPE_FDS\0"
- "SPE_FPF\0"
- "SPE_SME\0"
- "SPECRES\0"
- "SPECRES2\0"
- "SPMU\0"
- "SSBS\0"
- "SSBS2\0"
- "SSVE_FP8DOT2\0"
- "SSVE_FP8DOT4\0"
- "SSVE_FP8FMA\0"
- "SVE\0"
- "SVE2\0"
- "SVE2_1\0"
- "SVE_AES\0"
- "SVE_B16B16\0"
- "SVE_BF16\0"
- "SVE_BITPERM\0"
- "SVE_EBF16\0"
- "SVE_F32MM\0"
- "SVE_F64MM\0"
- "SVE_I8MM\0"
- "SVE_PMULL128\0"
- "SVE_SHA3\0"
- "SVE_SM4\0"
- "SYSINSTR128\0"
- "SYSREG128\0"
- "THE\0"
- "TLBIOS\0"
- "TLBIRANGE\0"
- "TLBIW\0"
- "TME\0"
- "TRF\0"
- "UAO\0"
- "VFP_D32\0"
- "VHE\0"
- "VMID16\0"
- "WFXT\0"
- "XNX\0"
- "XS\0"
- "<Unknown>\0";
-
- static const uint16_t sFeatureIndex[] = {
- 0, 5, 11, 17, 24, 30, 38, 43, 49, 53, 57, 61, 66, 73, 79, 85, 90, 95, 99,
- 103, 109, 113, 120, 125, 139, 143, 148, 154, 160, 165, 170, 177, 182, 187,
- 191, 195, 203, 207, 212, 217, 223, 229, 233, 239, 244, 253, 258, 262, 267,
- 271, 277, 284, 289, 292, 297, 306, 310, 318, 326, 333, 338, 346, 350, 357,
- 364, 369, 375, 379, 383, 388, 394, 399, 405, 411, 415, 421, 425, 431, 438,
- 445, 450, 463, 470, 474, 481, 486, 490, 494, 499, 503, 508, 513, 517, 522,
- 527, 532, 547, 557, 576, 596, 608, 623, 638, 644, 648, 651, 655, 659, 664,
- 669, 675, 680, 684, 690, 698, 702, 709, 714, 721, 725, 729, 733, 742, 748,
- 754, 760, 766, 772, 778, 781, 788, 794, 799, 804, 811, 816, 823, 827, 831,
- 835, 840, 847, 858, 869, 881, 892, 903, 914, 925, 935, 945, 954, 965, 976,
- 986, 996, 1000, 1007, 1014, 1021, 1028, 1039, 1047, 1055, 1063, 1071, 1079,
- 1087, 1096, 1101, 1106, 1112, 1125, 1138, 1150, 1154, 1159, 1166, 1174, 1185,
- 1194, 1206, 1216, 1226, 1236, 1245, 1258, 1267, 1275, 1287, 1297, 1301, 1308,
- 1318, 1324, 1328, 1332, 1336, 1344, 1348, 1355, 1360, 1364, 1367
- };
- // @EnumStringEnd@
-
- return sb.append(sFeatureString + sFeatureIndex[Support::min<uint32_t>(featureId, uint32_t(CpuFeatures::ARM::kMaxValue) + 1)]);
-}
-
-// arm::FormatterInternal - Format Constants
-// =========================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatCondCode(String& sb, CondCode cc) noexcept {
- static const char condCodeData[] =
- "al\0" "na\0"
- "eq\0" "ne\0"
- "hs\0" "lo\0" "mi\0" "pl\0" "vs\0" "vc\0"
- "hi\0" "ls\0" "ge\0" "lt\0" "gt\0" "le\0"
- "<Unknown>";
- return sb.append(condCodeData + Support::min<uint32_t>(uint32_t(cc), 16u) * 3);
-}
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatShiftOp(String& sb, ShiftOp shiftOp) noexcept {
- const char* str = nullptr;
- switch (shiftOp) {
- case ShiftOp::kLSL: str = "lsl"; break;
- case ShiftOp::kLSR: str = "lsr"; break;
- case ShiftOp::kASR: str = "asr"; break;
- case ShiftOp::kROR: str = "ror"; break;
- case ShiftOp::kRRX: str = "rrx"; break;
- case ShiftOp::kMSL: str = "msl"; break;
- case ShiftOp::kUXTB: str = "uxtb"; break;
- case ShiftOp::kUXTH: str = "uxth"; break;
- case ShiftOp::kUXTW: str = "uxtw"; break;
- case ShiftOp::kUXTX: str = "uxtx"; break;
- case ShiftOp::kSXTB: str = "sxtb"; break;
- case ShiftOp::kSXTH: str = "sxth"; break;
- case ShiftOp::kSXTW: str = "sxtw"; break;
- case ShiftOp::kSXTX: str = "sxtx"; break;
- default: str = "<Unknown>"; break;
- }
- return sb.append(str);
-}
-
-// arm::FormatterInternal - Format Register
-// ========================================
-
-struct FormatElementData {
- char letter;
- uint8_t elementCount;
- uint8_t onlyIndex;
- uint8_t reserved;
-};
-
-static constexpr FormatElementData formatElementDataTable[9] = {
- { '?' , 0 , 0, 0 }, // None
- { 'b' , 16, 0, 0 }, // bX or b[index]
- { 'h' , 8 , 0, 0 }, // hX or h[index]
- { 's' , 4 , 0, 0 }, // sX or s[index]
- { 'd' , 2 , 0, 0 }, // dX or d[index]
- { 'b' , 4 , 1, 0 }, // ?? or b4[index]
- { 'h' , 2 , 1, 0 }, // ?? or h2[index]
- { '?' , 0 , 0, 0 }, // invalid (possibly stored in Operand)
- { '?' , 0 , 0, 0 } // invalid (never stored in Operand, bug...)
-};
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t rId,
- uint32_t elementType,
- uint32_t elementIndex) noexcept {
-
- DebugUtils::unused(flags);
- DebugUtils::unused(arch);
-
- static const char bhsdq[] = "bhsdq";
-
- bool virtRegFormatted = false;
-
-#ifndef ASMJIT_NO_COMPILER
- if (Operand::isVirtId(rId)) {
- if (emitter && emitter->isCompiler()) {
- const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
- if (cc->isVirtIdValid(rId)) {
- VirtReg* vReg = cc->virtRegById(rId);
- ASMJIT_ASSERT(vReg != nullptr);
-
- const char* name = vReg->name();
- if (name && name[0] != '\0')
- ASMJIT_PROPAGATE(sb.append(name));
- else
- ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(rId))));
-
- virtRegFormatted = true;
- }
- }
- }
-#else
- DebugUtils::unused(emitter, flags);
-#endif
-
- if (!virtRegFormatted) {
- char letter = '\0';
- switch (regType) {
- case RegType::kARM_VecB:
- case RegType::kARM_VecH:
- case RegType::kARM_VecS:
- case RegType::kARM_VecD:
- case RegType::kARM_VecV:
- letter = bhsdq[uint32_t(regType) - uint32_t(RegType::kARM_VecB)];
- if (elementType)
- letter = 'v';
- break;
-
- case RegType::kARM_GpW:
- if (Environment::is64Bit(arch)) {
- letter = 'w';
-
- if (rId == a64::Gp::kIdZr)
- return sb.append("wzr", 3);
-
- if (rId == a64::Gp::kIdSp)
- return sb.append("wsp", 3);
- }
- else {
- letter = 'r';
- }
- break;
-
- case RegType::kARM_GpX:
- if (Environment::is64Bit(arch)) {
- if (rId == a64::Gp::kIdZr)
- return sb.append("xzr", 3);
- if (rId == a64::Gp::kIdSp)
- return sb.append("sp", 2);
-
- letter = 'x';
- break;
- }
-
- // X registers are undefined in 32-bit mode.
- ASMJIT_FALLTHROUGH;
-
- default:
- ASMJIT_PROPAGATE(sb.appendFormat("<Reg-%u>?%u", uint32_t(regType), rId));
- break;
- }
-
- if (letter)
- ASMJIT_PROPAGATE(sb.appendFormat("%c%u", letter, rId));
- }
-
- constexpr uint32_t kElementTypeCount = uint32_t(a64::VecElementType::kMaxValue) + 1;
- if (elementType) {
- elementType = Support::min(elementType, kElementTypeCount);
-
- FormatElementData elementData = formatElementDataTable[elementType];
- uint32_t elementCount = elementData.elementCount;
-
- if (regType == RegType::kARM_VecD) {
- elementCount /= 2u;
- }
-
- ASMJIT_PROPAGATE(sb.append('.'));
- if (elementCount) {
- ASMJIT_PROPAGATE(sb.appendUInt(elementCount));
- }
- ASMJIT_PROPAGATE(sb.append(elementData.letter));
- }
-
- if (elementIndex != 0xFFFFFFFFu) {
- ASMJIT_PROPAGATE(sb.appendFormat("[%u]", elementIndex));
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegisterList(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t rMask) noexcept {
-
- bool first = true;
-
- ASMJIT_PROPAGATE(sb.append('{'));
- while (rMask != 0u) {
- uint32_t start = Support::ctz(rMask);
- uint32_t count = 0u;
-
- uint32_t mask = 1u << start;
- do {
- rMask &= ~mask;
- mask <<= 1u;
- count++;
- } while (rMask & mask);
-
- if (!first)
- ASMJIT_PROPAGATE(sb.append(", "));
-
- ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, regType, start, 0, 0xFFFFFFFFu));
- if (count >= 2u) {
- ASMJIT_PROPAGATE(sb.append('-'));
- ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, regType, start + count - 1, 0, 0xFFFFFFFFu));
- }
-
- first = false;
- }
- ASMJIT_PROPAGATE(sb.append('}'));
-
- return kErrorOk;
-}
-
-// a64::FormatterInternal - Format Operand
-// =======================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- const Operand_& op) noexcept {
-
- if (op.isReg()) {
- const BaseReg& reg = op.as<BaseReg>();
-
- uint32_t elementType = op._signature.getField<BaseVec::kSignatureRegElementTypeMask>();
- uint32_t elementIndex = op.as<BaseVec>().elementIndex();
-
- if (!op.as<BaseVec>().hasElementIndex())
- elementIndex = 0xFFFFFFFFu;
-
- return formatRegister(sb, flags, emitter, arch, reg.type(), reg.id(), elementType, elementIndex);
- }
-
- if (op.isMem()) {
- const Mem& m = op.as<Mem>();
- ASMJIT_PROPAGATE(sb.append('['));
-
- if (m.hasBase()) {
- if (m.hasBaseLabel()) {
- ASMJIT_PROPAGATE(Formatter::formatLabel(sb, flags, emitter, m.baseId()));
- }
- else {
- FormatFlags modifiedFlags = flags;
- if (m.isRegHome()) {
- ASMJIT_PROPAGATE(sb.append('&'));
- modifiedFlags &= ~FormatFlags::kRegCasts;
- }
- ASMJIT_PROPAGATE(formatRegister(sb, modifiedFlags, emitter, arch, m.baseType(), m.baseId()));
- }
- }
- else {
- // ARM really requires base.
- if (m.hasIndex() || m.hasOffset()) {
- ASMJIT_PROPAGATE(sb.append("<None>"));
- }
- }
-
- // The post index makes it look like there was another operand, but it's
- // still the part of AsmJit's `arm::Mem` operand so it's consistent with
- // other architectures.
- if (m.isPostIndex())
- ASMJIT_PROPAGATE(sb.append(']'));
-
- if (m.hasIndex()) {
- ASMJIT_PROPAGATE(sb.append(", "));
- ASMJIT_PROPAGATE(formatRegister(sb, flags, emitter, arch, m.indexType(), m.indexId()));
- }
-
- if (m.hasOffset()) {
- ASMJIT_PROPAGATE(sb.append(", "));
-
- int64_t off = int64_t(m.offset());
- uint32_t base = 10;
-
- if (Support::test(flags, FormatFlags::kHexOffsets) && uint64_t(off) > 9)
- base = 16;
-
- if (base == 10) {
- ASMJIT_PROPAGATE(sb.appendInt(off, base));
- }
- else {
- ASMJIT_PROPAGATE(sb.append("0x"));
- ASMJIT_PROPAGATE(sb.appendUInt(uint64_t(off), base));
- }
- }
-
- if (m.hasShift()) {
- ASMJIT_PROPAGATE(sb.append(' '));
- if (!m.isPreOrPost())
- ASMJIT_PROPAGATE(formatShiftOp(sb, m.shiftOp()));
- ASMJIT_PROPAGATE(sb.appendFormat(" %u", m.shift()));
- }
-
- if (!m.isPostIndex())
- ASMJIT_PROPAGATE(sb.append(']'));
-
- if (m.isPreIndex())
- ASMJIT_PROPAGATE(sb.append('!'));
-
- return kErrorOk;
- }
-
- if (op.isImm()) {
- const Imm& i = op.as<Imm>();
- int64_t val = i.value();
- uint32_t predicate = i.predicate();
-
- if (predicate) {
- ASMJIT_PROPAGATE(formatShiftOp(sb, ShiftOp(predicate)));
- ASMJIT_PROPAGATE(sb.append(' '));
- }
-
- if (Support::test(flags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
- ASMJIT_PROPAGATE(sb.append("0x"));
- return sb.appendUInt(uint64_t(val), 16);
- }
- else {
- return sb.appendInt(val, 10);
- }
- }
-
- if (op.isLabel()) {
- return Formatter::formatLabel(sb, flags, emitter, op.id());
- }
-
- if (op.isRegList()) {
- const BaseRegList& regList = op.as<BaseRegList>();
- return formatRegisterList(sb, flags, emitter, arch, regList.type(), regList.list());
- }
-
- return sb.append("<None>");
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h b/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h
deleted file mode 100644
index 20b4812e913..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/armformatter_p.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
-#define ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_LOGGING
-
-#include "../core/formatter.h"
-#include "../core/string.h"
-#include "../arm/armglobals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(arm)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_arm
-//! \{
-
-namespace FormatterInternal {
-
-Error ASMJIT_CDECL formatFeature(
- String& sb,
- uint32_t featureId) noexcept;
-
-Error ASMJIT_CDECL formatCondCode(
- String& sb,
- CondCode cc) noexcept;
-
-Error ASMJIT_CDECL formatShiftOp(
- String& sb,
- ShiftOp shiftOp) noexcept;
-
-Error ASMJIT_CDECL formatRegister(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t rId,
- uint32_t elementType = 0,
- uint32_t elementIndex = 0xFFFFFFFF) noexcept;
-
-Error ASMJIT_CDECL formatRegisterList(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t rMask) noexcept;
-
-Error ASMJIT_CDECL formatOperand(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- const Operand_& op) noexcept;
-
-} // {FormatterInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_LOGGING
-#endif // ASMJIT_ARM_ARMFORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/armglobals.h b/3rdparty/asmjit/src/asmjit/arm/armglobals.h
deleted file mode 100644
index 851f6708601..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/armglobals.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
-#define ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
-
-#include "../core/archcommons.h"
-#include "../core/inst.h"
-
-//! \namespace asmjit::arm
-//! \ingroup asmjit_arm
-//!
-//! API shared between AArch32 & AArch64 backends.
-
-#endif // ASMJIT_ARM_ARMGLOBALS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/armoperand.h b/3rdparty/asmjit/src/asmjit/arm/armoperand.h
deleted file mode 100644
index 583a3d8c326..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/armoperand.h
+++ /dev/null
@@ -1,396 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_ARMOPERAND_H_INCLUDED
-#define ASMJIT_ARM_ARMOPERAND_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-#include "../arm/armglobals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(arm)
-
-//! \addtogroup asmjit_arm
-//! \{
-
-class Reg;
-class Mem;
-
-//! Register traits (AArch32/AArch64).
-//!
-//! Register traits contains information about a particular register type. It's used by asmjit to setup register
-//! information on-the-fly and to populate tables that contain register information (this way it's possible to
-//! change register types and groups without having to reorder these tables).
-template<RegType kRegType>
-struct RegTraits : public BaseRegTraits {};
-
-//! \cond
-// <--------------------+------------------------+------------------------+---+------------------+
-// | Reg-Type | Reg-Group |Sz | TypeId |
-// <--------------------+------------------------+------------------------+---+------------------+
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_GpW , RegGroup::kGp , 4 , TypeId::kInt32 ); // AArch32 & AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_GpX , RegGroup::kGp , 8 , TypeId::kInt64 ); // AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecB , RegGroup::kVec , 1 , TypeId::kVoid ); // AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecH , RegGroup::kVec , 2 , TypeId::kVoid ); // AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecS , RegGroup::kVec , 4 , TypeId::kInt32x1 ); // AArch32 & AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecD , RegGroup::kVec , 8 , TypeId::kInt32x2 ); // AArch32 & AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_VecQ , RegGroup::kVec , 16, TypeId::kInt32x4 ); // AArch32 & AArch64
-ASMJIT_DEFINE_REG_TRAITS(RegType::kARM_PC , RegGroup::kPC , 8 , TypeId::kInt64 ); // AArch64
-//! \endcond
-
-//! Register operand that can represent AArch32 and AArch64 registers.
-class Reg : public BaseReg {
-public:
- ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg)
-
- //! Gets whether the register is either `R` or `W` register (32-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpR() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpW>::kSignature; }
- //! Gets whether the register is either `R` or `W` register (32-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpW() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpW>::kSignature; }
- //! Gets whether the register is an `X` register (64-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpX() const noexcept { return baseSignature() == RegTraits<RegType::kARM_GpX>::kSignature; }
-
- //! Gets whether the register is a VEC-B register (8-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecB() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecB>::kSignature; }
- //! Gets whether the register is a VEC-H register (16-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecH() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecH>::kSignature; }
- //! Gets whether the register is a VEC-S register (32-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecS() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecS>::kSignature; }
- //! Gets whether the register is a VEC-D register (64-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecD() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecD>::kSignature; }
- //! Gets whether the register is a VEC-Q register (128-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecQ() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
- //! Gets whether the register is either VEC-D (64-bit) or VEC-Q (128-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecDOrQ() const noexcept { return uint32_t(type()) - uint32_t(RegType::kARM_VecD) <= 1u; }
- //! Gets whether the register is a VEC-V register (128-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isVecV() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
-
- //! Gets whether the register is an 8-bit vector register or view, alias if \ref isVecB().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec8() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecB>::kSignature; }
- //! Gets whether the register is a 16-bit vector register or view, alias if \ref isVecH().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec16() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecH>::kSignature; }
- //! Gets whether the register is a 32-bit vector register or view, alias if \ref isVecS().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec32() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecS>::kSignature; }
- //! Gets whether the register is a 64-bit vector register or view, alias if \ref isVecD().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec64() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecD>::kSignature; }
- //! Gets whether the register is a 128-bit vector register or view, alias if \ref isVecQ().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return baseSignature() == RegTraits<RegType::kARM_VecV>::kSignature; }
-
- template<RegType kRegType>
- ASMJIT_INLINE_NODEBUG void setRegT(uint32_t id) noexcept {
- setSignature(RegTraits<kRegType>::kSignature);
- setId(id);
- }
-
- ASMJIT_INLINE_NODEBUG void setTypeAndId(RegType type, uint32_t id) noexcept {
- setSignature(signatureOf(type));
- setId(id);
- }
-
- static ASMJIT_INLINE_NODEBUG RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToGroup(type); }
- static ASMJIT_INLINE_NODEBUG TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToTypeId(type); }
- static ASMJIT_INLINE_NODEBUG OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kAArch64).regTypeToSignature(type); }
-
- template<RegType kRegType>
- static ASMJIT_INLINE_NODEBUG RegGroup groupOfT() noexcept { return RegTraits<kRegType>::kGroup; }
-
- template<RegType kRegType>
- static ASMJIT_INLINE_NODEBUG TypeId typeIdOfT() noexcept { return RegTraits<kRegType>::kTypeId; }
-
- template<RegType kRegType>
- static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits<kRegType>::kSignature}; }
-
- static ASMJIT_INLINE_NODEBUG bool isGpW(const Operand_& op) noexcept { return op.as<Reg>().isGpW(); }
- static ASMJIT_INLINE_NODEBUG bool isGpX(const Operand_& op) noexcept { return op.as<Reg>().isGpX(); }
- static ASMJIT_INLINE_NODEBUG bool isVecB(const Operand_& op) noexcept { return op.as<Reg>().isVecB(); }
- static ASMJIT_INLINE_NODEBUG bool isVecH(const Operand_& op) noexcept { return op.as<Reg>().isVecH(); }
- static ASMJIT_INLINE_NODEBUG bool isVecS(const Operand_& op) noexcept { return op.as<Reg>().isVecS(); }
- static ASMJIT_INLINE_NODEBUG bool isVecD(const Operand_& op) noexcept { return op.as<Reg>().isVecD(); }
- static ASMJIT_INLINE_NODEBUG bool isVecQ(const Operand_& op) noexcept { return op.as<Reg>().isVecQ(); }
- static ASMJIT_INLINE_NODEBUG bool isVecV(const Operand_& op) noexcept { return op.as<Reg>().isVecV(); }
-
- static ASMJIT_INLINE_NODEBUG bool isGpW(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isGpW(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isGpX(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isGpX(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isVecB(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecB(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isVecH(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecH(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isVecS(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecS(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isVecD(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecD(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isVecQ(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecQ(op)) & unsigned(op.id() == id)); }
- static ASMJIT_INLINE_NODEBUG bool isVecV(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVecV(op)) & unsigned(op.id() == id)); }
-};
-
-//! Vector register base - a common base for both AArch32 & AArch64 vector register.
-class BaseVec : public Reg {
-public:
- ASMJIT_DEFINE_ABSTRACT_REG(BaseVec, Reg)
-
- //! Additional signature bits used by a vector register.
- enum AdditionalBits : uint32_t {
- // Register element type (3 bits).
- // |........|........|.XXX....|........|
- kSignatureRegElementTypeShift = 12,
- kSignatureRegElementTypeMask = 0x07 << kSignatureRegElementTypeShift,
-
- // Register has element index (1 bit).
- // |........|........|X.......|........|
- kSignatureRegElementFlagShift = 15,
- kSignatureRegElementFlagMask = 0x01 << kSignatureRegElementFlagShift,
-
- // Register element index (4 bits).
- // |........|....XXXX|........|........|
- kSignatureRegElementIndexShift = 16,
- kSignatureRegElementIndexMask = 0x0F << kSignatureRegElementIndexShift
- };
-
- //! Returns whether the register has element index (it's an element index access).
- ASMJIT_INLINE_NODEBUG constexpr bool hasElementIndex() const noexcept { return _signature.hasField<kSignatureRegElementFlagMask>(); }
- //! Returns element index of the register.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t elementIndex() const noexcept { return _signature.getField<kSignatureRegElementIndexMask>(); }
- //! Sets element index of the register to `elementType`.
- ASMJIT_INLINE_NODEBUG void setElementIndex(uint32_t elementIndex) noexcept {
- _signature |= kSignatureRegElementFlagMask;
- _signature.setField<kSignatureRegElementIndexMask>(elementIndex);
- }
- //! Resets element index of the register.
- ASMJIT_INLINE_NODEBUG void resetElementIndex() noexcept {
- _signature &= ~(kSignatureRegElementFlagMask | kSignatureRegElementIndexMask);
- }
-};
-
-//! Memory operand (ARM).
-class Mem : public BaseMem {
-public:
- //! \cond INTERNAL
- //! Additional bits of operand's signature used by `arm::Mem`.
- enum AdditionalBits : uint32_t {
- // Index shift value (5 bits).
- // |........|.....XXX|XX......|........|
- kSignatureMemShiftValueShift = 14,
- kSignatureMemShiftValueMask = 0x1Fu << kSignatureMemShiftValueShift,
-
- // Index shift operation (4 bits).
- // |........|XXXX....|........|........|
- kSignatureMemShiftOpShift = 20,
- kSignatureMemShiftOpMask = 0x0Fu << kSignatureMemShiftOpShift,
-
- // Offset mode type (2 bits).
- // |......XX|........|........|........|
- kSignatureMemOffsetModeShift = 24,
- kSignatureMemOffsetModeMask = 0x03u << kSignatureMemOffsetModeShift
- };
- //! \endcond
-
- //! \name Construction & Destruction
- //! \{
-
- //! Construct a default `Mem` operand, that points to [0].
- ASMJIT_INLINE_NODEBUG constexpr Mem() noexcept
- : BaseMem() {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const Mem& other) noexcept
- : BaseMem(other) {}
-
- ASMJIT_INLINE_NODEBUG explicit Mem(Globals::NoInit_) noexcept
- : BaseMem(Globals::NoInit) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept
- : BaseMem(signature, baseId, indexId, offset) {}
-
- ASMJIT_INLINE_NODEBUG constexpr explicit Mem(const Label& base, int32_t off = 0, Signature signature = Signature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(RegType::kLabelTag) |
- signature, base.id(), 0, off) {}
-
- ASMJIT_INLINE_NODEBUG constexpr explicit Mem(const BaseReg& base, int32_t off = 0, Signature signature = Signature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(base.type()) |
- signature, base.id(), 0, off) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, const BaseReg& index, Signature signature = Signature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(base.type()) |
- Signature::fromMemIndexType(index.type()) |
- signature, base.id(), index.id(), 0) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, const BaseReg& index, const Shift& shift, Signature signature = Signature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(base.type()) |
- Signature::fromMemIndexType(index.type()) |
- Signature::fromValue<kSignatureMemShiftOpMask>(uint32_t(shift.op())) |
- Signature::fromValue<kSignatureMemShiftValueMask>(shift.value()) |
- signature, base.id(), index.id(), 0) {}
-
- ASMJIT_INLINE_NODEBUG constexpr explicit Mem(uint64_t base, Signature signature = Signature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG Mem& operator=(const Mem& other) noexcept = default;
-
- //! \}
-
- //! \name Clone
- //! \{
-
- //! Clones the memory operand.
- ASMJIT_INLINE_NODEBUG constexpr Mem clone() const noexcept { return Mem(*this); }
-
- //! Gets new memory operand adjusted by `off`.
- ASMJIT_INLINE_NODEBUG Mem cloneAdjusted(int64_t off) const noexcept {
- Mem result(*this);
- result.addOffset(off);
- return result;
- }
-
- //! Clones the memory operand and makes it pre-index.
- ASMJIT_INLINE_NODEBUG Mem pre() const noexcept {
- Mem result(*this);
- result.setOffsetMode(OffsetMode::kPreIndex);
- return result;
- }
-
- //! Clones the memory operand, applies a given offset `off` and makes it pre-index.
- ASMJIT_INLINE_NODEBUG Mem pre(int64_t off) const noexcept {
- Mem result(*this);
- result.setOffsetMode(OffsetMode::kPreIndex);
- result.addOffset(off);
- return result;
- }
-
- //! Clones the memory operand and makes it post-index.
- ASMJIT_INLINE_NODEBUG Mem post() const noexcept {
- Mem result(*this);
- result.setOffsetMode(OffsetMode::kPostIndex);
- return result;
- }
-
- //! Clones the memory operand, applies a given offset `off` and makes it post-index.
- ASMJIT_INLINE_NODEBUG Mem post(int64_t off) const noexcept {
- Mem result(*this);
- result.setOffsetMode(OffsetMode::kPostIndex);
- result.addOffset(off);
- return result;
- }
-
- //! \}
-
- //! \name Base & Index
- //! \{
-
- //! Converts memory `baseType` and `baseId` to `arm::Reg` instance.
- //!
- //! The memory must have a valid base register otherwise the result will be wrong.
- ASMJIT_INLINE_NODEBUG Reg baseReg() const noexcept { return Reg::fromTypeAndId(baseType(), baseId()); }
-
- //! Converts memory `indexType` and `indexId` to `arm::Reg` instance.
- //!
- //! The memory must have a valid index register otherwise the result will be wrong.
- ASMJIT_INLINE_NODEBUG Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); }
-
- using BaseMem::setIndex;
-
- ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, uint32_t shift) noexcept {
- setIndex(index);
- setShift(shift);
- }
-
- ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, Shift shift) noexcept {
- setIndex(index);
- setShift(shift);
- }
-
- //! \}
-
- //! \name ARM Specific Features
- //! \{
-
- //! Gets offset mode.
- ASMJIT_INLINE_NODEBUG constexpr OffsetMode offsetMode() const noexcept { return OffsetMode(_signature.getField<kSignatureMemOffsetModeMask>()); }
- //! Sets offset mode to `mode`.
- ASMJIT_INLINE_NODEBUG void setOffsetMode(OffsetMode mode) noexcept { _signature.setField<kSignatureMemOffsetModeMask>(uint32_t(mode)); }
- //! Resets offset mode to default (fixed offset, without write-back).
- ASMJIT_INLINE_NODEBUG void resetOffsetMode() noexcept { _signature.setField<kSignatureMemOffsetModeMask>(uint32_t(OffsetMode::kFixed)); }
-
- //! Tests whether the current memory offset mode is fixed (see \ref OffsetMode::kFixed).
- ASMJIT_INLINE_NODEBUG constexpr bool isFixedOffset() const noexcept { return offsetMode() == OffsetMode::kFixed; }
- //! Tests whether the current memory offset mode is either pre-index or post-index (write-back is used).
- ASMJIT_INLINE_NODEBUG constexpr bool isPreOrPost() const noexcept { return offsetMode() != OffsetMode::kFixed; }
- //! Tests whether the current memory offset mode is pre-index (write-back is used).
- ASMJIT_INLINE_NODEBUG constexpr bool isPreIndex() const noexcept { return offsetMode() == OffsetMode::kPreIndex; }
- //! Tests whether the current memory offset mode is post-index (write-back is used).
- ASMJIT_INLINE_NODEBUG constexpr bool isPostIndex() const noexcept { return offsetMode() == OffsetMode::kPostIndex; }
-
- //! Sets offset mode of this memory operand to pre-index (write-back is used).
- ASMJIT_INLINE_NODEBUG void makePreIndex() noexcept { setOffsetMode(OffsetMode::kPreIndex); }
- //! Sets offset mode of this memory operand to post-index (write-back is used).
- ASMJIT_INLINE_NODEBUG void makePostIndex() noexcept { setOffsetMode(OffsetMode::kPostIndex); }
-
- //! Gets shift operation that is used by index register.
- ASMJIT_INLINE_NODEBUG constexpr ShiftOp shiftOp() const noexcept { return ShiftOp(_signature.getField<kSignatureMemShiftOpMask>()); }
- //! Sets shift operation that is used by index register.
- ASMJIT_INLINE_NODEBUG void setShiftOp(ShiftOp sop) noexcept { _signature.setField<kSignatureMemShiftOpMask>(uint32_t(sop)); }
- //! Resets shift operation that is used by index register to LSL (default value).
- ASMJIT_INLINE_NODEBUG void resetShiftOp() noexcept { _signature.setField<kSignatureMemShiftOpMask>(uint32_t(ShiftOp::kLSL)); }
-
- //! Gets whether the memory operand has shift (aka scale) constant.
- ASMJIT_INLINE_NODEBUG constexpr bool hasShift() const noexcept { return _signature.hasField<kSignatureMemShiftValueMask>(); }
- //! Gets the memory operand's shift (aka scale) constant.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t shift() const noexcept { return _signature.getField<kSignatureMemShiftValueMask>(); }
- //! Sets the memory operand's shift (aka scale) constant.
- ASMJIT_INLINE_NODEBUG void setShift(uint32_t shift) noexcept { _signature.setField<kSignatureMemShiftValueMask>(shift); }
-
- //! Sets the memory operand's shift and shift operation.
- ASMJIT_INLINE_NODEBUG void setShift(Shift shift) noexcept {
- _signature.setField<kSignatureMemShiftOpMask>(uint32_t(shift.op()));
- _signature.setField<kSignatureMemShiftValueMask>(shift.value());
- }
-
- //! Resets the memory operand's shift (aka scale) constant to zero.
- ASMJIT_INLINE_NODEBUG void resetShift() noexcept { _signature.setField<kSignatureMemShiftValueMask>(0); }
-
- //! \}
-};
-
-//! \name Shift Operation Construction
-//! \{
-
-//! Constructs a `LSL #value` shift (logical shift left).
-static ASMJIT_INLINE_NODEBUG constexpr Shift lsl(uint32_t value) noexcept { return Shift(ShiftOp::kLSL, value); }
-//! Constructs a `LSR #value` shift (logical shift right).
-static ASMJIT_INLINE_NODEBUG constexpr Shift lsr(uint32_t value) noexcept { return Shift(ShiftOp::kLSR, value); }
-//! Constructs a `ASR #value` shift (arithmetic shift right).
-static ASMJIT_INLINE_NODEBUG constexpr Shift asr(uint32_t value) noexcept { return Shift(ShiftOp::kASR, value); }
-//! Constructs a `ROR #value` shift (rotate right).
-static ASMJIT_INLINE_NODEBUG constexpr Shift ror(uint32_t value) noexcept { return Shift(ShiftOp::kROR, value); }
-//! Constructs a `RRX` shift (rotate with carry by 1).
-static ASMJIT_INLINE_NODEBUG constexpr Shift rrx() noexcept { return Shift(ShiftOp::kRRX, 0); }
-//! Constructs a `MSL #value` shift (logical shift left filling ones).
-static ASMJIT_INLINE_NODEBUG constexpr Shift msl(uint32_t value) noexcept { return Shift(ShiftOp::kMSL, value); }
-
-//! \}
-
-//! \name Memory Operand Construction
-//! \{
-
-//! Creates `[base]` absolute memory operand (AArch32 or AArch64).
-//!
-//! \note The concept of absolute memory operands doesn't exist on ARM, the ISA only provides PC relative addressing.
-//! Absolute memory operands can only be used if it's known that the PC relative offset is encodable and that it
-//! would be within the limits. Absolute address is also often output from disassemblers, so AsmJit supports it to
-//! make it possible to assemble such output back.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base) noexcept { return Mem(base); }
-
-//! \}
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_ARMOPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/arm/armutils.h b/3rdparty/asmjit/src/asmjit/arm/armutils.h
deleted file mode 100644
index 8241eda052e..00000000000
--- a/3rdparty/asmjit/src/asmjit/arm/armutils.h
+++ /dev/null
@@ -1,226 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_ARM_ARMUTILS_H_INCLUDED
-#define ASMJIT_ARM_ARMUTILS_H_INCLUDED
-
-#include "../core/support.h"
-#include "../arm/armglobals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(arm)
-
-//! \addtogroup asmjit_arm
-//! \{
-
-//! Public utilities and helpers for targeting AArch32 and AArch64 architectures.
-namespace Utils {
-
-//! Encodes a 12-bit immediate part of opcode that ise used by a standard 32-bit ARM encoding.
-ASMJIT_MAYBE_UNUSED
-static inline bool encodeAArch32Imm(uint64_t imm, uint32_t* encodedImmOut) noexcept {
- if (imm & 0xFFFFFFFF00000000u)
- return false;
-
- uint32_t v = uint32_t(imm);
- uint32_t r = 0;
-
- if (v <= 0xFFu) {
- *encodedImmOut = v;
- return true;
- }
-
- // Rotate if there are bits on both ends (LSB and MSB)
- // (otherwise we would not be able to calculate the rotation with ctz).
- if (v & 0xFF0000FFu) {
- v = Support::ror(v, 16);
- r = 16u;
- }
-
- uint32_t n = Support::ctz(v) & ~0x1u;
- r = (r - n) & 0x1Eu;
- v = Support::ror(v, n);
-
- if (v > 0xFFu)
- return false;
-
- *encodedImmOut = v | (r << 7);
- return true;
-}
-
-//! Decomposed fields of a logical immediate value.
-struct LogicalImm {
- uint32_t n;
- uint32_t s;
- uint32_t r;
-};
-
-//! Encodes the given `imm` value of the given `width` to a logical immediate value represented as N, S, and R fields
-//! and writes these fields to `out`.
-//!
-//! Encoding Table:
-//!
-//! ```
-//! +---+--------+--------+------+
-//! | N | ImmS | ImmR | Size |
-//! +---+--------+--------+------+
-//! | 1 | ssssss | rrrrrr | 64 |
-//! | 0 | 0sssss | .rrrrr | 32 |
-//! | 0 | 10ssss | ..rrrr | 16 |
-//! | 0 | 110sss | ...rrr | 8 |
-//! | 0 | 1110ss | ....rr | 4 |
-//! | 0 | 11110s | .....r | 2 |
-//! +---+--------+--------+------+
-//! ```
-ASMJIT_MAYBE_UNUSED
-static bool encodeLogicalImm(uint64_t imm, uint32_t width, LogicalImm* out) noexcept {
- // Determine the element width, which must be 2, 4, 8, 16, 32, or 64 bits.
- do {
- width /= 2;
- uint64_t mask = (uint64_t(1) << width) - 1u;
- if ((imm & mask) != ((imm >> width) & mask)) {
- width *= 2;
- break;
- }
- } while (width > 2);
-
- // Patterns of all zeros and all ones are not encodable.
- uint64_t lsbMask = Support::lsbMask<uint64_t>(width);
- imm &= lsbMask;
-
- if (imm == 0 || imm == lsbMask)
- return false;
-
- // Inspect the pattern and get the most important bit indexes.
- //
- // oIndex <-+ +-> zIndex
- // | |
- // |..zeros..|oCount|zCount|..ones..|
- // |000000000|111111|000000|11111111|
-
- uint32_t zIndex = Support::ctz(~imm);
- uint64_t zImm = imm ^ ((uint64_t(1) << zIndex) - 1);
- uint32_t zCount = (zImm ? Support::ctz(zImm) : width) - zIndex;
-
- uint32_t oIndex = zIndex + zCount;
- uint64_t oImm = ~(zImm ^ Support::lsbMask<uint64_t>(oIndex));
- uint32_t oCount = (oImm ? Support::ctz(oImm) : width) - (oIndex);
-
- // Verify whether the bit-pattern is encodable.
- uint64_t mustBeZero = oImm ^ ~Support::lsbMask<uint64_t>(oIndex + oCount);
- if (mustBeZero != 0 || (zIndex > 0 && width - (oIndex + oCount) != 0))
- return false;
-
- out->n = width == 64;
- out->s = (oCount + zIndex - 1) | (Support::neg(width * 2) & 0x3F);
- out->r = width - oIndex;
- return true;
-}
-
-//! Returns true if the given `imm` value is encodable as a logical immediate. The `width` argument describes the
-//! width of the operation, and must be either 32 or 64. This function can be used to test whether an immediate
-//! value can be used with AND, ANDS, BIC, BICS, EON, EOR, ORN, and ORR instruction.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_INLINE_NODEBUG bool isLogicalImm(uint64_t imm, uint32_t width) noexcept {
- LogicalImm dummy;
- return encodeLogicalImm(imm, width, &dummy);
-}
-
-//! Returns true if the given `imm` value is encodable as an immediate with `add` and `sub` instructions on AArch64.
-//! These two instructions can encode 12-bit immediate value optionally shifted left by 12 bits.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_INLINE_NODEBUG bool isAddSubImm(uint64_t imm) noexcept {
- return imm <= 0xFFFu || (imm & ~uint64_t(0xFFFu << 12)) == 0;
-}
-
-//! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either
-//! 0x00 or 0xFF. Some ARM instructions accept immediates that form a byte-mask and this function can be used to
-//! verify that the immediate is encodable before using the value.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG bool isByteMaskImm8(const T& imm) noexcept {
- constexpr T kMask = T(0x0101010101010101 & Support::allOnes<T>());
- return imm == (imm & kMask) * T(255);
-}
-
-// [.......A|B.......|.......C|D.......|.......E|F.......|.......G|H.......]
-static ASMJIT_INLINE_NODEBUG uint32_t encodeImm64ByteMaskToImm8(uint64_t imm) noexcept {
- return uint32_t(((imm >> (7 - 0)) & 0b00000011) | // [.......G|H.......]
- ((imm >> (23 - 2)) & 0b00001100) | // [.......E|F.......]
- ((imm >> (39 - 4)) & 0b00110000) | // [.......C|D.......]
- ((imm >> (55 - 6)) & 0b11000000)); // [.......A|B.......]
-}
-//! \cond
-//! A generic implementation that checjs whether a floating point value can be converted to ARM Imm8.
-template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
-static ASMJIT_FORCE_INLINE bool isFPImm8Generic(T val) noexcept {
- constexpr uint32_t kAllBsMask = Support::lsbMask<uint32_t>(kNumBBits);
- constexpr uint32_t kB0Pattern = Support::bitMask(kNumBBits - 1);
- constexpr uint32_t kB1Pattern = kAllBsMask ^ kB0Pattern;
-
- T immZ = val & Support::lsbMask<T>(kNumZeroBits);
- uint32_t immB = uint32_t(val >> (kNumZeroBits + kNumCDEFGHBits)) & kAllBsMask;
-
- // ImmZ must be all zeros and ImmB must either be B0 or B1 pattern.
- return immZ == 0 && (immB == kB0Pattern || immB == kB1Pattern);
-}
-//! \endcond
-
-//! Returns true if the given half precision floating point `val` can be encoded as ARM IMM8 value, which represents
-//! a limited set of floating point immediate values, which can be used with FMOV instruction.
-//!
-//! The floating point must have bits distributed in the following way:
-//!
-//! ```
-//! [aBbbcdef|gh000000]
-//! ```
-static ASMJIT_INLINE_NODEBUG bool isFP16Imm8(uint32_t val) noexcept { return isFPImm8Generic<uint32_t, 3, 6, 6>(val); }
-
-//! Returns true if the given single precision floating point `val` can be encoded as ARM IMM8 value, which represents
-//! a limited set of floating point immediate values, which can be used with FMOV instruction.
-//!
-//! The floating point must have bits distributed in the following way:
-//!
-//! ```
-//! [aBbbbbbc|defgh000|00000000|00000000]
-//! ```
-static ASMJIT_INLINE_NODEBUG bool isFP32Imm8(uint32_t val) noexcept { return isFPImm8Generic<uint32_t, 6, 6, 19>(val); }
-//! \overload
-static ASMJIT_INLINE_NODEBUG bool isFP32Imm8(float val) noexcept { return isFP32Imm8(Support::bitCast<uint32_t>(val)); }
-
-//! Returns true if the given double precision floating point `val` can be encoded as ARM IMM8 value, which represents
-//! a limited set of floating point immediate values, which can be used with FMOV instruction.
-//!
-//! The floating point must have bits distributed in the following way:
-//!
-//! ```
-//! [aBbbbbbb|bbcdefgh|00000000|00000000|00000000|00000000|00000000|00000000]
-//! ```
-static ASMJIT_INLINE_NODEBUG bool isFP64Imm8(uint64_t val) noexcept { return isFPImm8Generic<uint64_t, 9, 6, 48>(val); }
-//! \overload
-static ASMJIT_INLINE_NODEBUG bool isFP64Imm8(double val) noexcept { return isFP64Imm8(Support::bitCast<uint64_t>(val)); }
-
-//! \cond
-template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
-static ASMJIT_INLINE_NODEBUG uint32_t encodeFPToImm8Generic(T val) noexcept {
- uint32_t bits = uint32_t(val >> kNumZeroBits);
- return ((bits >> (kNumBBits + kNumCDEFGHBits - 7)) & 0x80u) | (bits & 0x7F);
-}
-//! \endcond
-
-//! Encodes a double precision floating point value into IMM8 format.
-//!
-//! \note This function expects that `isFP64Imm8(val) == true` so it doesn't perform any checks of the value and just
-//! rearranges some bits into Imm8 order.
-static ASMJIT_INLINE_NODEBUG uint32_t encodeFP64ToImm8(uint64_t val) noexcept { return encodeFPToImm8Generic<uint64_t, 9, 6, 48>(val); }
-//! \overload
-static ASMJIT_INLINE_NODEBUG uint32_t encodeFP64ToImm8(double val) noexcept { return encodeFP64ToImm8(Support::bitCast<uint64_t>(val)); }
-
-} // {Utils}
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_ARM_ARMUTILS_H_INCLUDED
-
diff --git a/3rdparty/asmjit/src/asmjit/asmjit-scope-end.h b/3rdparty/asmjit/src/asmjit/asmjit-scope-end.h
deleted file mode 100644
index 702cef49f1f..00000000000
--- a/3rdparty/asmjit/src/asmjit/asmjit-scope-end.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifdef _WIN32
- #pragma pop_macro("min")
- #pragma pop_macro("max")
-#endif
diff --git a/3rdparty/asmjit/src/asmjit/core.h b/3rdparty/asmjit/src/asmjit/core.h
deleted file mode 100644
index 66cbce642a3..00000000000
--- a/3rdparty/asmjit/src/asmjit/core.h
+++ /dev/null
@@ -1,1991 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_H_INCLUDED
-#define ASMJIT_CORE_H_INCLUDED
-
-//! Root namespace used by AsmJit.
-namespace asmjit {
-
-//! \mainpage API Reference
-//!
-//! AsmJit C++ API reference documentation generated by Doxygen.
-//!
-//! AsmJit library uses one global namespace called \ref asmjit, which provides the whole functionality. Core
-//! functionality is within \ref asmjit namespace and architecture specific functionality is always in its own
-//! namespace. For example \ref asmjit::x86 provides both 32-bit and 64-bit X86 code generation.
-//!
-//! \section main_groups Documentation Groups
-//!
-//! AsmJit documentation is structured into groups. Groups can be followed in order to learn AsmJit, but knowledge
-//! from multiple groups is required to use AsmJit properly:
-//!
-//! $$DOCS_GROUP_OVERVIEW$$
-//!
-//! \note It's important to understand that in order to learn AsmJit all groups are important. Some groups can be
-//! omitted if a particular tool is out of interest - for example \ref asmjit_assembler users don't need to know
-//! about \ref asmjit_builder, but it's not the opposite. \ref asmjit_builder users should know about \ref
-//! asmjit_assembler as it also uses operands, labels, and other concepts. Similarly \ref asmjit_compiler users
-//! should know how both \ref asmjit_assembler and \ref asmjit_builder tools work.
-//!
-//! \section where_to_start Where To Start
-//!
-//! AsmJit \ref asmjit_core provides the following two classes that are essential from the code generation perspective:
-//!
-//! - \ref CodeHolder provides functionality to temporarily hold the generated code. It stores all the necessary
-//! information about the code - code buffers, sections, labels, symbols, and information about relocations.
-//!
-//! - \ref BaseEmitter provides interface used by emitter implementations. The interface provides basic building
-//! blocks that are then implemented by \ref BaseAssembler, \ref BaseBuilder, and \ref BaseCompiler.
-//!
-//! Code emitters:
-//!
-//! - \ref asmjit_assembler - provides direct machine code generation.
-//!
-//! - \ref asmjit_builder - provides intermediate code generation that can be processed before it's serialized to
-//! \ref BaseAssembler.
-//!
-//! - \ref asmjit_compiler - provides high-level code generation with built-in register allocation.
-//!
-//! - \ref FuncNode - provides insight into how function looks from the Compiler perspective and how it's stored in
-//! a node-list.
-//!
-//! \section main_recommendations Recommendations
-//!
-//! The following steps are recommended for all AsmJit users:
-//!
-//! - Make sure that you use \ref Logger, see \ref asmjit_logging.
-//!
-//! - Make sure that you use \ref ErrorHandler, see \ref asmjit_error_handling.
-//!
-//! - Instruction validation in your debug builds can reveal problems too. AsmJit provides validation at instruction
-//! level that can be enabled via \ref BaseEmitter::addDiagnosticOptions(). See \ref DiagnosticOptions for more
-//! details.
-//!
-//! - If you are a Compiler user, use diagnostic options and read carefully if anything suspicious pops out.
-//! Diagnostic options can be enabled via \ref BaseEmitter::addDiagnosticOptions(). If unsure which ones to use,
-//! enable annotations and all debug options: `DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll`.
-//!
-//! - Make sure you put a breakpoint into \ref DebugUtils::errored() function if you have a problem with AsmJit
-//! returning errors during instruction encoding or register allocation. Having an active breakpoint there can
-//! help to reveal the origin of the error, to inspect variables and other conditions that caused it.
-//!
-//! The reason for using \ref Logger and \ref ErrorHandler is that they provide a very useful information about what's
-//! happening inside emitters. In many cases the information provided by these two is crucial to quickly identify and
-//! fix issues that happen during development (for example wrong instruction, address, or register used). In addition,
-//! output from \ref Logger is always necessary when filling bug reports. In other words, using logging and proper error
-//! handling can save a lot of time during the development and can also save users from submitting issues.
-//!
-//! \section main_other Other Pages
-//!
-//! - <a href="annotated.html">Class List</a> - List of classes sorted alphabetically
-//! - <a href="namespaceasmjit.html">AsmJit Namespace</a> - List of symbols provided by `asmjit` namespace
-
-
-//! \defgroup asmjit_build Build Instructions
-//! \brief Build instructions, supported environments, and feature selection.
-//!
-//! ### Overview
-//!
-//! AsmJit is designed to be easy embeddable in any project. However, it depends on some compile-time definitions that
-//! can be used to enable or disable features to decrease the resulting binary size. A typical way of building AsmJit
-//! is to use [cmake](https://www.cmake.org), but it's also possible to just include AsmJit source code in your project
-//! and to just build it. The easiest way to include AsmJit in your project is to just include **src** directory in
-//! your project and to define \ref ASMJIT_STATIC. AsmJit can be just updated from time to time without any changes to
-//! this integration process. Do not embed AsmJit's `test` files in such case as these are used exclusively for testing.
-//!
-//! ### Supported C++ Compilers
-//!
-//! - Requirements:
-//!
-//! - AsmJit won't build without C++11 enabled. If you use older GCC or Clang you would have to enable at least
-//! C++11 standard through compiler flags.
-//!
-//! - Tested:
-//!
-//! - **Clang** - Tested by GitHub Actions - Clang 10+ is officially supported and tested by CI, older Clang versions
-//! having C++11 should work, but are not tested anymore due to upgraded CI images.
-//!
-//! - **GNU** - Tested by GitHub Actions - GCC 7+ is officially supported, older GCC versions from 4.8+ having C++11
-//! enabled should also work, but are not tested anymore due to upgraded CI images.
-//!
-//! - **MINGW** - Reported to work, but not tested in our CI environment (help welcome).
-//!
-//! - **MSVC** - Tested by GitHub Actions - VS2019+ is officially supported, VS2015 and VS2017 is reported to work,
-//! but not tested by CI anymore.
-//!
-//! ### Supported Operating Systems and Platforms
-//!
-//! - Tested:
-//!
-//! - **BSD** - FreeBSD, NetBSD, and OpenBSD tested by GitHub Actions (only recent images are tested by CI). BSD
-//! runners only test BSD images with clang compiler.
-//!
-//! - **Linux** - Tested by GitHub Actions (only recent Ubuntu images are tested by CI, in general any distribution
-//! should be supported as AsmJit has no dependencies).
-//!
-//! - **Mac OS** - Tested by GitHub Actions.
-//!
-//! - **Windows** - Tested by GitHub Actions - (Windows 7+ is officially supported).
-//!
-//! - **Emscripten** - Works if compiled with \ref ASMJIT_NO_JIT. AsmJit cannot generate WASM code, but can be
-//! used to generate X86/X64/AArch64 code within a browser, for example.
-//!
-//! - Untested:
-//!
-//! - **Haiku** - Reported to work, not tested by CI.
-//!
-//! - **Other** operating systems would require some testing and support in the following files:
-//! - [core/api-config.h](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/api-config.h)
-//! - [core/osutils.cpp](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/osutils.cpp)
-//! - [core/virtmem.cpp](https://github.com/asmjit/asmjit/tree/master/src/asmjit/core/virtmem.cpp)
-//!
-//! ### Supported Backends / Architectures
-//!
-//! - **X86** and **X86_64** - Both 32-bit and 64-bit backends tested on CI.
-//! - **AArch64** - AArch64 backend is currently only partially tested (there is no native AArch64 runner to test
-//! AsmJit Builder/Compiler).
-//!
-//! ### Static Builds and Embedding
-//!
-//! These definitions can be used to enable static library build. Embed is used when AsmJit's source code is embedded
-//! directly in another project, implies static build as well.
-//!
-//! - \ref ASMJIT_EMBED - Asmjit is embedded, implies \ref ASMJIT_STATIC.
-//! - \ref ASMJIT_STATIC - Enable static-library build.
-//!
-//! \note Projects that use AsmJit statically must define \ref ASMJIT_STATIC in all compilation units that use AsmJit,
-//! otherwise AsmJit would use dynamic library imports in \ref ASMJIT_API decorator. The recommendation is to define
-//! this macro across the whole project that uses AsmJit this way.
-//!
-//! ### Build Configuration
-//!
-//! These definitions control whether asserts are active or not. By default AsmJit would autodetect build configuration
-//! from existing pre-processor definitions, but this behavior can be overridden, for example to enable debug asserts
-//! in release configuration.
-//!
-//! - \ref ASMJIT_BUILD_DEBUG - Overrides build configuration to debug, asserts will be enabled in this case.
-//! - \ref ASMJIT_BUILD_RELEASE - Overrides build configuration to release, asserts will be disabled in this case.
-//!
-//! \note There is usually no need to override the build configuration. AsmJit detects the build configuration by
-//! checking whether `NDEBUG` is defined and automatically defines \ref ASMJIT_BUILD_RELEASE if configuration overrides
-//! were not used. We only recommend using build configuration overrides in special situations, like using AsmJit in
-//! release configuration with asserts enabled for whatever reason.
-//!
-//! ### AsmJit Backends
-//!
-//! AsmJit currently supports only X86/X64 backend, but the plan is to add more backends in the future. By default
-//! AsmJit builds only the host backend, which is auto-detected at compile-time, but this can be overridden.
-//!
-//! - \ref ASMJIT_NO_X86 - Disables both X86 and X86_64 backends.
-//! - \ref ASMJIT_NO_AARCH64 - Disables AArch64 backend.
-//! - \ref ASMJIT_NO_FOREIGN - Disables the support for foreign architecture backends, only keeps a native backend.
-//!
-//! ### AsmJit Compilation Options
-//!
-//! - \ref ASMJIT_NO_DEPRECATED - Disables deprecated API at compile time so it won't be available and the
-//! compilation will fail if there is attempt to use such API. This includes deprecated classes, namespaces,
-//! enumerations, and functions.
-//!
-//! - \ref ASMJIT_NO_SHM_OPEN - Disables functionality that uses `shm_open()`.
-//!
-//! - \ref ASMJIT_NO_ABI_NAMESPACE - Disables inline ABI namespace within `asmjit` namespace. This is only provided
-//! for users that control all the dependencies (even transitive ones) and that make sure that no two AsmJit
-//! versions are used at the same time. This option can be debugging a little simpler as there would not be ABI
-//! tag after `asmjit::` namespace. Otherwise asmjit would look like `asmjit::_abi_1_13::`, for example.
-//!
-//! ### Features Selection
-//!
-//! AsmJit builds by defaults all supported features, which includes all emitters, logging, instruction validation and
-//! introspection, and JIT memory allocation. Features can be disabled at compile time by using `ASMJIT_NO_...`
-//! definitions.
-//! - \ref ASMJIT_NO_JIT - Disables JIT memory management and \ref JitRuntime.
-//!
-//! - \ref ASMJIT_NO_TEXT - Disables everything that contains string representation of AsmJit constants, should
-//! be used together with \ref ASMJIT_NO_LOGGING as logging doesn't make sense without the ability to query
-//! instruction names, register names, etc...
-//!
-//! - \ref ASMJIT_NO_LOGGING - Disables \ref Logger and \ref Formatter.
-//!
-//! - \ref ASMJIT_NO_VALIDATION - Disables validation API.
-//!
-//! - \ref ASMJIT_NO_INTROSPECTION - Disables instruction introspection API, must be used together with \ref
-//! ASMJIT_NO_COMPILER as \ref asmjit_compiler requires introspection for its liveness analysis and register
-//! allocation.
-//!
-//! - \ref ASMJIT_NO_BUILDER - Disables \ref asmjit_builder functionality completely. This implies \ref
-//! ASMJIT_NO_COMPILER as \ref asmjit_compiler cannot be used without \ref asmjit_builder.
-//!
-//! - \ref ASMJIT_NO_COMPILER - Disables \ref asmjit_compiler functionality completely.
-//!
-//! \note It's not recommended to disable features if you plan to build AsmJit as a shared library that will be
-//! used by multiple projects that you don't control how AsmJit was built (for example AsmJit in a Linux distribution).
-//! The possibility to disable certain features exists mainly for customized AsmJit builds.
-
-
-//! \defgroup asmjit_breaking_changes Breaking Changes
-//! \brief Documentation of breaking changes
-//!
-//! ### Overview
-//!
-//! AsmJit is a live project that is being actively developed. Deprecating the existing API in favor of a new
-//! one is preferred, but it's not always possible if the changes are significant. AsmJit authors prefer to do
-//! accumulated breaking changes at once instead of breaking the API often. This page documents deprecated and
-//! removed APIs and should serve as a how-to guide for people that want to port existing code to work with the
-//! newest AsmJit.
-//!
-//! ### Tips
-//!
-//! Useful tips before you start:
-//!
-//! - Visit our [Public Gitter Chat](https://app.gitter.im/#/room/#asmjit:gitter.im) if you need a quick help.
-//!
-//! - Build AsmJit with `ASMJIT_NO_DEPRECATED` macro defined to make sure that you are not using deprecated
-//! functionality at all. Deprecated functions are decorated with `ASMJIT_DEPRECATED()` macro, but sometimes
-//! it's not possible to decorate everything like classes, which are used by deprecated functions as well,
-//! because some compilers would warn about that. If your project compiles fine with `ASMJIT_NO_DEPRECATED`
-//! it's not using anything, which was deprecated.
-//!
-//! ### Changes committed at 2024-01-01
-//!
-//! Core changes:
-//!
-//! - Renamed equality functions `eq()` to `equals()` - Only related to `String`, `ZoneVector`, and `CpuFeatures`.
-//! Old function names were deprecated.
-//!
-//! - Removed `CallConvId::kNone` in favor of `CallConvId::kCDecl`, which is now the default calling convention.
-//!
-//! - Deprecated `CallConvId::kHost` in favor of `CallConvId::kCDecl` - host calling convention is now not part
-//! of CallConvId, it can be calculated from CallConvId and Environment instead.
-//!
-//! ### Changes committed at 2023-12-27
-//!
-//! Core changes:
-//!
-//! - Renamed `a64::Vec::ElementType` to `a64::VecElementType` and made it a typed enum. This enum was used mostly
-//! internally, but there is a public API using it, so it's a breaking change.
-//!
-//! - Refactored `FuncSignature`, `FuncSignatureT`, and `FuncSignatureBuilder`. There is only `FuncSignature` now,
-//! which acts as a function signature holder and builder. Replace `FuncSignatureBuilder` with `FuncSignature`
-//! and use `FuncSignature::build<args>` instead of `FuncSignatureT<args>`. The old API has been deprecated.
-//!
-//! - The maximum number of function arguments was raised from 16 to 32.
-//!
-//! ### Changes committed at 2023-12-26
-//!
-//! Core changes:
-//!
-//! - Reworked InstNode and InstExNode to be friendlier to static analysis and to not cause undefined behavior.
-//! InstNode has no operands visually embedded within the struct so there is no _opArray (which was internal).
-//! This means that sizeof(InstNode) changed, but since it's allocated by AsmJit this should be fine. Moreover,
-//! there is no longer InstExNode as that was more a hack, instead there is now InstNodeWithOperands, which is
-//! a template and specifies the number of operands embedded (InstNode accesses these). All nodes that inherited
-//! InstExNode now just inherit InstNodeWithOperands<InstNode::kBaseOpCapacity>, which would provide the same
-//! number of nodes as InstNode.
-//!
-//! - Moved GP and Vec registers from asmjit::arm namespace to asmjit::a64 namespace. At this time there was
-//! no prior deprecation as having arm::Vec would collide with a64::Vec as arm namespace is used within a64
-//! namespace. Just change `arm::Gp` to `a64::Gp` and `arm::Vec` to `a64::Vec`.
-//!
-//! ### Changes committed at 2023-09-10
-//!
-//! Core changes:
-//!
-//! - Changed allocation API to work with spans (JitAllocator).
-//!
-//! - This change is required to support more hardened platforms in the future that make it very difficult
-//! to write JIT compilers.
-//! - `JitAllocator::Span` now represents a memory that the user can access. It abstracts both regular and
-//! dual mappings.
-//! - The `Span` is mostly designed to make it possible to write into it, so in general the read+execute
-//! pointer is what user is intended to keep. Use `span.rx()` to access RX pointer. `Span` is not needed
-//! after the memory it references has been modified, only remember `span.rx()` pointer, which is then
-//! used to deallocate or change the memory the span references.
-//! - Use a new `JitAllocator::alloc()` to allocate a `Span`, then pass the populated Span to `JitAllocator`
-//! write API such as `JitAllocator::write()` - note that JitAllocator can also establish a scope, so you
-//! can use a lambda function that would perform the write, but since it's going through JitAllocator it's
-//! able to ensure that the memory is actually writable.
-//! - If you need to repopulate a `Span` from rx pointer, use `JitAllocator::query(<span-out>, rx)` to get it.
-//! - Study what JitRuntime is doing to better understand how this new API works in detail.
-//! - Users of JitRuntime do not have to do anything as JitRuntime properly abstracts the allocation.
-//!
-//! - Renamed some X86 CPU features to make them compatible with architecture manuals:
-//!
-//! - Changed `AVX512_CDI` to `AVX512_CD`.
-//! - Changed `AVX512_ERI` to `AVX512_ER`.
-//! - Changed `AVX512_PFI` to `AVX512_PF`.
-//!
-//! - Old names were deprecated.
-//!
-//! ### Changes committed at 2021-12-13
-//!
-//! Core changes:
-//!
-//! - Removed old deprecated API.
-//!
-//! - Many enumerations were changed to enum class, and many public APIs were changed to use such enums instead
-//! of uint32_t. This change makes some APIs backward incompatible - there are no deprecations this time.
-//!
-//! - Extracted operand signature manipulation to `OperandSignature`.
-//! - Setting function arguments through `Compiler::setArg()` was deprecated, use FuncNode::setArg() instead.
-//! - Moved `{arch}::Features::k` to `CpuFeatures::{arch}::k`.
-//! - Moved `BaseEmitter::kEncodingOption` to `EncodingOptions::k`.
-//! - Moved `BaseEmitter::kFlag` to `EmitterFlags::k`.
-//! - Moved `BaseEmitter::kType` to `EmitterType::k`.
-//! - Moved `BaseEmitter::kValidationOption` to `DiagnosticOptions::kValidate`.
-//! - Moved `BaseFeatures` to `CpuFeatures`.
-//! - Moved `BaseInst::kControl` to `InstControlFlow::k`.
-//! - Moved `BaseInst::kOption` and `x86::Inst::kOption` to `InstOptions::k`.
-//! - Moved `BaseNode::kNode` to `NodeType::k`.
-//! - Moved `BaseReg::kGroup` and `x86::Reg::kGroup` to `RegGroup::k`.
-//! - Moved `BaseReg::kType` and `x86::Reg::kType` to `RegType::k`.
-//! - Moved `CallConv::kFlag` to `CallConvFlags::k`.
-//! - Moved `CallConv::kId` to `CallConvId::k`.
-//! - Moved `CallConv::kStrategy` to `CallConvStrategy::k`.
-//! - Moved `CodeBuffer::kFlag` to `CodeBufferFlags`.
-//! - Moved `ConstPool::kScope` to `ConstPoolScope::k`.
-//! - Moved `Environment::kArch` to `Arch::k`.
-//! - Moved `Environment::kSubArch` to `SubArch::k`.
-//! - Moved `Environment::kFormat` to `OjectFormat::k`.
-//! - Moved `Environment::kPlatform` to `Platform::k`.
-//! - Moved `Environment::kAbi` to `PlatformABI::k`.
-//! - Moved `Environment::kVendor` to `Vendor::k`.
-//! - Moved `FormatOptions::kFlag` to `FormatFlags::k` and `DiagnosticOptions::k` (Compiler diagnostics flags).
-//! - Moved `FormatOptions::kIndentation` to `FormatIndentationGroup::k`.
-//! - Moved `FuncFrame::kAttr` to `FuncAttributes::k`.
-//! - Moved `Globals::kReset` to `ResetPolicy::k`.
-//! - Moved `InstDB::kAvx512Flag` to `InstDB::Avx512Flags::k`.
-//! - Moved `InstDB::kFlag` to `InstDB::InstFlags::k`.
-//! - Moved `InstDB::kMemFlag` to `InstDB::OpFlags::kMem`.
-//! - Moved `InstDB::kMode` to `InstDB::Mode::k`.
-//! - Moved `InstDB::kOpFlag` to `InstDB::OpFlags::k{OpType}...`.
-//! - Moved `JitAllocator::kOption` to `JitAllocatorOptions::k`.
-//! - Moved `Label::kType` to `LabelType::k`.
-//! - Moved `Operand::kOpType` to `OperandType::k`.
-//! - Moved `OpRWInfo::kFlag` to `OpRWFlags::k`.
-//! - Moved `Type::kId` to `TypeId::k`.
-//! - Moved `VirtMem::k` to `VirtMem::MemoryFlags::k`.
-//!
-//! ### Changes committed at 2020-05-30
-//!
-//! AsmJit has been cleaned up significantly, many todo items have been fixed and many functions and classes have
-//! been redesigned, some in an incompatible way.
-//!
-//! Core changes:
-//!
-//! - `Imm` operand has now only `Imm::value()` and `Imm::valueAs()` functions that return its value content,
-//! and `Imm::setValue()` function that sets the content. Functions like `setI8()`, `setU8()` were deprecated.
-//!
-//! Old functions were deprecated, but code using them should still compile.
-//!
-//! - `ArchInfo` has been replaced with `Environment`. Environment provides more details about the architecture,
-//! but drops some properties that were used by arch info - `gpSize(`) and `gpCount()`. `gpSize()` can be replaced
-//! with `registerSize()` getter, which returns a native register size of the architecture the environment uses.
-//! However, `gpCount()` was removed - at the moment `ArchTraits` can be used to access such properties.
-//!
-//! Some other functions were renamed, like `ArchInfo::isX86Family()` is now `Environment::isFamilyX86()`, etc.
-//! The reason for changing the order was support for more properties and all the accessors now start with the
-//! type of the property, like `Environment::isPlatformWindows()`.
-//!
-//! This function causes many other classes to provide `environment()` getter instead of `archInfo()` getter.
-//! In addition, AsmJit now uses `arch()` to get an architecture instead of `archId()`. `ArchInfo::kIdXXX` was
-//! renamed to `Environment::kArchXXX`.
-//!
-//! Some functions were deprecated, some removed...
-//!
-//! - `CodeInfo` has been removed in favor of `Environment`. If you used `CodeInfo` to set architecture and base
-//! address, this is now possible with `Environment` and setting base address explicitly by `CodeHolder::init()`
-//! - the first argument is `Environment`, and the second argument is base address, which defaults to
-//! `Globals::kNoBaseAddress`.
-//!
-//! CodeInfo class was deprecated, but the code using it should still compile with warnings.
-//!
-//! - `CallConv` has been updated to offer a more unified way of representing calling conventions - many calling
-//! conventions were abstracted to follow standard naming like `CallConvId::kCDecl` or `CallConvId::kStdCall`.
-//!
-//! This change means that other APIs like `FuncDetail::init()` now require both, calling convention and target
-//! `Environment`.
-//!
-//! - `Logging` namespace has been renamed to `Formatter`, which now provides general functionality for formatting
-//! in AsmJit.
-//!
-//! Logging namespace should still work, but its use is deprecated. Unfortunately this will be without deprecation
-//! warnings, so make sure you don't use it.
-//!
-//! - `Data64`, `Data128`, and `Data256` structs were deprecated and should no longer be used. There is no replacement,
-//! AsmJit users should simply create their own structures if they need them or use the new repeated embed API in
-//! emitters, see `BaseEmitter::embedDataArray()`.
-//!
-//! Emitter changes:
-//!
-//! - `BaseEmitter::emit()` function signature has been changed to accept 3 operands by reference and the rest 3
-//! operands as a continuous array. This change is purely cosmetic and shouldn't affect users as emit() has many
-//! overloads that dispatch to the right function.
-//!
-//! - `x86::Emitter` (Assembler, Builder, Compiler) deprecates embed utilities like `dint8()`, `duint8()`, `duint16()`,
-//! `dxmm()`, etc... in favor of a new and more powerful `BaseEmitter::embedDataArray()`. This function also allows
-//! emitting repeated values and/or patterns, which is used by helpers `BaseEmitter::embedUInt8()`, and others...
-//!
-//! - Validation is now available through `BaseEmitter::DiagnosticOptions`, which can be enabled/disabled through
-//! `BaseEmitter::addDiagnosticOptions()` and `BaseEmitter::clearDiagnosticOptions()`, respectively. Validation
-//! options now separate between encoding and Builder/Compiler so it's possible to choose the granularity required.
-//!
-//! Builder changes:
-//!
-//! - Internal functions for creating nodes were redesigned. They now accept a pointer to the node created as
-//! a first parameter. These changes should not affect AsmJit users as these functions were used internally.
-//!
-//! Compiler changes:
-//!
-//! - `FuncCallNode` has been renamed to `InvokeNode`. Additionally, function calls should now use
-//! `x86::Compiler::invoke()` instead of `call()`. The reason behind this is to remove the confusion between a
-//! `call` instruction and AsmJit's `call()` intrinsic, which is now `invoke()`.
-//!
-//! - Creating new nodes also changed. Now the preferred way of invoking a function is to call
-//! `x86::Compiler::invoke()` where the first argument is `InvokeNode**`. The function now returns an error and
-//! would call `ErrorHandler` in case of a failure. Error handling was unspecified in the past - the function was
-//! marked noexcept, but called error handler, which could throw.
-//!
-//! The reason behind this change is to make the API consistent with other changes and to also make it possible
-//! to inspect the possible error. In the previous API it returned a new node or `nullptr` in case of error,
-//! which the user couldn't inspect unless there was an attached `ErrorHandler`.
-//!
-//! Samples:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! // The basic setup of JitRuntime and CodeHolder changed, use environment()
-//! // instead of codeInfo().
-//! void basicSetup() {
-//! JitRuntime rt;
-//! CodeHolder code(rt.environment());
-//! }
-//!
-//! // Calling a function (Compiler) changed - use invoke() instead of call().
-//! void functionInvocation(x86::Compiler& cc) {
-//! InvokeNode* invokeNode;
-//! cc.invoke(&invokeNode, targetOperand, FuncSignature::build<...>(...));
-//! }
-//! ```
-
-
-//! \defgroup asmjit_core Core
-//! \brief Globals, code storage, and emitter interface.
-//!
-//! ### Overview
-//!
-//! AsmJit library uses \ref CodeHolder to hold code during code generation and emitters inheriting from \ref
-//! BaseEmitter to emit code. CodeHolder uses containers to manage its data:
-//!
-//! - \ref Section - stores information about a code or data section.
-//! - \ref CodeBuffer - stores actual code or data, part of \ref Section.
-//! - \ref LabelEntry - stores information about a label - its name, offset, section where it belongs to, and
-//! other bits.
-//! - \ref LabelLink - stores information about yet unbound label, which was already used by the assembler.
-//! - \ref RelocEntry - stores information about a relocation.
-//! - \ref AddressTableEntry - stores information about an address, which was used in a jump or call. Such
-//! address may need relocation.
-//!
-//! To generate code you would need to instantiate at least the following classes:
-//!
-//! - \ref CodeHolder - to hold code during code generation.
-//! - \ref BaseEmitter - to emit code into \ref CodeHolder.
-//! - \ref Target (optional) - most likely \ref JitRuntime to keep the generated code in executable memory. \ref
-//! Target can be customized by inheriting from it.
-//!
-//! There are also other core classes that are important:
-//!
-//! - \ref Environment - describes where the code will run. Environment brings the concept of target triples or
-//! tuples into AsmJit, which means that users can specify target architecture, platform, and ABI.
-//! - \ref TypeId - encapsulates lightweight type functionality that can be used to describe primitive and vector
-//! types. Types are used by higher level utilities, for example by \ref asmjit_function and \ref asmjit_compiler.
-//! - \ref CpuInfo - encapsulates CPU information - stores both CPU information and CPU features described by \ref
-//! CpuFeatures.
-//!
-//! AsmJit also provides global constants:
-//!
-//! - \ref Globals - namespace that provides global constants.
-//! - \ref ByteOrder - byte-order constants and functionality.
-//!
-//! \note CodeHolder examples use \ref x86::Assembler as abstract interfaces cannot be used to generate code.
-//!
-//! ### CodeHolder & Emitters
-//!
-//! The example below shows how the mentioned classes interact to generate X86 code:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef int (*Func)(void);
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//!
-//! CodeHolder code; // Holds code and relocation information.
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//!
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
-//! a.mov(x86::eax, 1); // Move one to eax register.
-//! a.ret(); // Return from function.
-//! // ===== x86::Assembler is no longer needed from here and can be destroyed =====
-//!
-//! Func fn; // Holds address to the generated function.
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//! // ===== CodeHolder is no longer needed from here and can be destroyed =====
-//!
-//! int result = fn(); // Execute the generated code.
-//! printf("%d\n", result); // Print the resulting "1".
-//!
-//! // All classes use RAII, all resources will be released before `main()` returns,
-//! // the generated function can be, however, released explicitly if you intend to
-//! // reuse or keep the runtime alive, which you should in a production-ready code.
-//! rt.release(fn);
-//!
-//! return 0;
-//! }
-//! ```
-//!
-//! The example above used \ref x86::Assembler as an emitter. AsmJit provides the following emitters that offer various
-//! levels of abstraction:
-//!
-//! - \ref asmjit_assembler - Low-level emitter that emits directly to \ref CodeBuffer.
-//! - \ref asmjit_builder - Low-level emitter that emits to a \ref BaseNode list.
-//! - \ref asmjit_compiler - High-level emitter that provides register allocation.
-//!
-//! ### Targets and JitRuntime
-//!
-//! AsmJit's \ref Target is an interface that provides basic target abstraction. At the moment AsmJit provides only
-//! one implementation called \ref JitRuntime, which as the name suggests provides JIT code target and execution
-//! runtime. \ref JitRuntime provides all the necessary stuff to implement a simple JIT compiler with basic memory
-//! management. It only provides \ref JitRuntime::add() and \ref JitRuntime::release() functions that are used to
-//! either add code to the runtime or release it. \ref JitRuntime doesn't do any decisions on when the code should be
-//! released, the decision is up to the developer.
-//!
-//! See more at \ref asmjit_virtual_memory group.
-//!
-//! ### More About Environment
-//!
-//! In the previous example the \ref Environment is retrieved from \ref JitRuntime. It's logical as \ref JitRuntime
-//! always returns an \ref Environment that is compatible with the host. For example if your application runs on X86_64
-//! CPU the \ref Environment returned will use \ref Arch::kX64 architecture in contrast to \ref Arch::kX86, which will
-//! be used in 32-bit mode on an X86 target.
-//!
-//! AsmJit allows to setup the \ref Environment manually and to select a different architecture and ABI when necessary.
-//! So let's do something else this time, let's always generate a 32-bit code and print its binary representation. To
-//! do that, we can create our own \ref Environment and initialize it to \ref Arch::kX86.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! int main(int argc, char* argv[]) {
-//! using namespace asmjit::x86;
-//!
-//! // Create a custom environment initialized to 32-bit X86 architecture.
-//! Environment env;
-//! env.setArch(Arch::kX86);
-//!
-//! CodeHolder code; // Create a CodeHolder.
-//! code.init(env); // Initialize CodeHolder with custom environment.
-//!
-//! // Generate a 32-bit function that sums 4 floats and looks like:
-//! // void func(float* dst, const float* a, const float* b)
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to `code`.
-//!
-//! a.mov(eax, dword_ptr(esp, 4)); // Load the destination pointer.
-//! a.mov(ecx, dword_ptr(esp, 8)); // Load the first source pointer.
-//! a.mov(edx, dword_ptr(esp, 12)); // Load the second source pointer.
-//!
-//! a.movups(xmm0, ptr(ecx)); // Load 4 floats from [ecx] to XMM0.
-//! a.movups(xmm1, ptr(edx)); // Load 4 floats from [edx] to XMM1.
-//! a.addps(xmm0, xmm1); // Add 4 floats in XMM1 to XMM0.
-//! a.movups(ptr(eax), xmm0); // Store the result to [eax].
-//! a.ret(); // Return from function.
-//!
-//! // We have no Runtime this time, it's on us what we do with the code.
-//! // CodeHolder stores code in Section, which provides some basic properties
-//! // and CodeBuffer structure. We are interested in section's CodeBuffer.
-//! //
-//! // NOTE: The first section is always '.text', it can be retrieved by
-//! // code.sectionById(0) or simply by code.textSection().
-//! CodeBuffer& buffer = code.textSection()->buffer();
-//!
-//! // Print the machine-code generated or do something else with it...
-//! // 8B4424048B4C24048B5424040F28010F58010F2900C3
-//! for (size_t i = 0; i < buffer.length; i++)
-//! printf("%02X", buffer.data[i]);
-//!
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Explicit Code Relocation
-//!
-//! In addition to \ref Environment, \ref CodeHolder can be configured to specify a base-address (or a virtual base
-//! address in a linker terminology), which could be static (useful when you know the location where the target's
-//! machine code will be) or dynamic. AsmJit assumes dynamic base-address by default and relocates the code held by
-//! \ref CodeHolder to a user provided address on-demand. To be able to relocate to a user provided address it needs
-//! to store some information about relocations, which is represented by \ref RelocEntry. Relocation entries are only
-//! required if you call external functions from the generated code that cannot be encoded by using a 32-bit
-//! displacement (64-bit displacements are not provided by aby supported architecture).
-//!
-//! There is also a concept called \ref LabelLink - label link is a lightweight data structure that doesn't have any
-//! identifier and is stored in \ref LabelEntry as a single-linked list. Label link represents either unbound yet used
-//! label and cross-sections links (only relevant to code that uses multiple sections). Since crossing sections is
-//! something that cannot be resolved immediately these links persist until offsets of these sections are assigned and
-//! until \ref CodeHolder::resolveUnresolvedLinks() is called. It's an error if you end up with code that has
-//! unresolved label links after flattening. You can verify it by calling \ref CodeHolder::hasUnresolvedLinks(), which
-//! inspects the value returned by \ref CodeHolder::unresolvedLinkCount().
-//!
-//! AsmJit can flatten code that uses multiple sections by assigning each section an incrementing offset that respects
-//! its alignment. Use \ref CodeHolder::flatten() to do that. After the sections are flattened their offsets and
-//! virtual sizes are adjusted to respect each section's buffer size and alignment. The \ref
-//! CodeHolder::resolveUnresolvedLinks() function must be called before relocating the code held by \ref CodeHolder.
-//! You can also flatten your code manually by iterating over all sections and calculating their offsets (relative to
-//! base) by your own algorithm. In that case \ref CodeHolder::flatten() should not be called, however,
-//! \ref CodeHolder::resolveUnresolvedLinks() should be.
-//!
-//! The example below shows how to use a built-in virtual memory allocator \ref JitAllocator instead of using \ref
-//! JitRuntime (just in case you want to use your own memory management) and how to relocate the generated code
-//! into your own memory block - you can use your own virtual memory allocator if you prefer that, but that's OS
-//! specific and not covered by the documentation.
-//!
-//! The following code is similar to the previous one, but implements a function working in both 32-bit and 64-bit
-//! environments:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! typedef void (*SumIntsFunc)(int* dst, const int* a, const int* b);
-//!
-//! int main() {
-//! // Create a custom environment that matches the current host environment.
-//! Environment env = Environment::host();
-//! CpuFeatures cpuFeatures = CpuInfo::host().features();
-//!
-//! CodeHolder code; // Create a CodeHolder.
-//! code.init(env, cpuFeatures); // Initialize CodeHolder with environment.
-//!
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to `code`.
-//!
-//! // Signature: 'void func(int* dst, const int* a, const int* b)'.
-//! x86::Gp dst;
-//! x86::Gp src_a;
-//! x86::Gp src_b;
-//!
-//! // Handle the difference between 32-bit and 64-bit calling conventions
-//! // (arguments passed through stack vs. arguments passed by registers).
-//! if (env.is32Bit()) {
-//! dst = x86::eax;
-//! src_a = x86::ecx;
-//! src_b = x86::edx;
-//! a.mov(dst , x86::dword_ptr(x86::esp, 4));
-//! a.mov(src_a, x86::dword_ptr(x86::esp, 8));
-//! a.mov(src_b, x86::dword_ptr(x86::esp, 12));
-//! }
-//! else {
-//! if (env.isPlatformWindows()) {
-//! dst = x86::rcx; // First argument (destination pointer).
-//! src_a = x86::rdx; // Second argument (source 'a' pointer).
-//! src_b = x86::r8; // Third argument (source 'b' pointer).
-//! }
-//! else {
-//! dst = x86::rdi; // First argument (destination pointer).
-//! src_a = x86::rsi; // Second argument (source 'a' pointer).
-//! src_b = x86::rdx; // Third argument (source 'b' pointer).
-//! }
-//! }
-//!
-//! a.movdqu(x86::xmm0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
-//! a.movdqu(x86::xmm1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
-//! a.paddd(x86::xmm0, x86::xmm1); // Add 4 ints in XMM1 to XMM0.
-//! a.movdqu(x86::ptr(dst), x86::xmm0); // Store the result to [dst].
-//! a.ret(); // Return from function.
-//!
-//! // Even when we didn't use multiple sections AsmJit could insert one section
-//! // called '.addrtab' (address table section), which would be filled by data
-//! // required by relocations (absolute jumps and calls). You can omit this code
-//! // if you are 100% sure your code doesn't contain multiple sections and
-//! // such relocations. You can use `CodeHolder::hasAddressTable()` to verify
-//! // whether the address table section does exist.
-//! code.flatten();
-//! code.resolveUnresolvedLinks();
-//!
-//! // After the code was generated it can be relocated manually to any memory
-//! // location, however, we need to know it's size before we perform memory
-//! // allocation. `CodeHolder::codeSize()` returns the worst estimated code
-//! // size in case that relocations are not possible without trampolines (in
-//! // that case some extra code at the end of the current code buffer is
-//! // generated during relocation).
-//! size_t estimatedSize = code.codeSize();
-//!
-//! // Instead of rolling up our own memory allocator we can use the one AsmJit
-//! // provides. It's decoupled so you don't need to use `JitRuntime` for that.
-//! JitAllocator allocator;
-//!
-//! // Allocate an executable virtual memory and handle a possible failure.
-//! void* p = allocator.alloc(estimatedSize);
-//! if (!p)
-//! return 0;
-//!
-//! // Now relocate the code to the address provided by the memory allocator.
-//! // Please note that this DOESN'T COPY anything to `p`. This function will
-//! // store the address in CodeHolder and use relocation entries to patch the
-//! // existing code in all sections to respect the base address provided.
-//! code.relocateToBase((uint64_t)p);
-//!
-//! // This is purely optional. There are cases in which the relocation can omit
-//! // unneeded data, which would shrink the size of address table. If that
-//! // happened the codeSize returned after relocateToBase() would be smaller
-//! // than the originally `estimatedSize`.
-//! size_t codeSize = code.codeSize();
-//!
-//! // This will copy code from all sections to `p`. Iterating over all sections
-//! // and calling `memcpy()` would work as well, however, this function supports
-//! // additional options that can be used to also zero pad sections' virtual
-//! // size, etc.
-//! //
-//! // With some additional features, copyFlattenData() does roughly this:
-//! // for (Section* section : code.sections())
-//! // memcpy((uint8_t*)p + section->offset(),
-//! // section->data(),
-//! // section->bufferSize());
-//! code.copyFlattenedData(p, codeSize, CopySectionFlags::kPadSectionBuffer);
-//!
-//! // Execute the generated function.
-//! int inA[4] = { 4, 3, 2, 1 };
-//! int inB[4] = { 1, 5, 2, 8 };
-//! int out[4];
-//!
-//! // This code uses AsmJit's ptr_as_func<> to cast between void* and SumIntsFunc.
-//! ptr_as_func<SumIntsFunc>(p)(out, inA, inB);
-//!
-//! // Prints {5 8 4 9}
-//! printf("{%d %d %d %d}\n", out[0], out[1], out[2], out[3]);
-//!
-//! // Release 'p' is it's no longer needed. It will be destroyed with 'vm'
-//! // instance anyway, but it's a good practice to release it explicitly
-//! // when you know that the function will not be needed anymore.
-//! allocator.release(p);
-//!
-//! return 0;
-//! }
-//! ```
-//!
-//! If you know the base-address in advance (before the code generation) it can be passed as a second argument to
-//! \ref CodeHolder::init(). In that case the Assembler will know the absolute position of each instruction and
-//! would be able to use it during instruction encoding to prevent relocations where possible. The following example
-//! shows how to configure the base address:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! void initializeCodeHolder(CodeHolder& code) {
-//! Environment env = Environment::host();
-//! CpuFeatures cpuFeatures = CpuInfo::host().features();
-//! uint64_t baseAddress = uint64_t(0x1234);
-//!
-//! // initialize CodeHolder with environment and custom base address.
-//! code.init(env, cpuFeatures, baseAddress);
-//! }
-//! ```
-//!
-//! ### Label Offsets and Links
-//!
-//! When a label that is not yet bound is used by the Assembler, it creates a \ref LabelLink, which is then added to
-//! a \ref LabelEntry. These links are also created if a label is used in a different section than in which it was
-//! bound. Let's examine some functions that can be used to check whether there are any unresolved links.
-//!
-//! ```
-//! #include <asmjit/core.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! void labelLinksExample(CodeHolder& code, const Label& label) {
-//! // Tests whether the `label` is bound.
-//! bool isBound = code.isLabelBound(label);
-//! printf("Label %u is %s\n", label.id(), isBound ? "bound" : "not bound");
-//!
-//! // Returns true if the code contains either referenced, but unbound
-//! // labels, or cross-section label links that are not resolved yet.
-//! bool hasUnresolved = code.hasUnresolvedLinks(); // Boolean answer.
-//! size_t nUnresolved = code.unresolvedLinkCount(); // Count of unresolved links.
-//!
-//! printf("Number of unresolved links: %zu\n", nUnresolved);
-//! }
-//! ```
-//!
-//! There is no function that would return the number of unbound labels as this is completely unimportant from
-//! CodeHolder's perspective. If a label is not used then it doesn't matter whether it's bound or not, only actually
-//! used labels matter. After a Label is bound it's possible to query its offset relative to the start of the
-//! section where it was bound:
-//!
-//! ```
-//! #include <asmjit/core.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! void labelOffsetExample(CodeHolder& code, const Label& label) {
-//! // Label offset is known after it's bound. The offset provided is relative
-//! // to the start of the section, see below for alternative. If the given
-//! // label is not bound the offset returned will be zero. It's recommended
-//! // to always check whether the label is bound before using its offset.
-//! uint64_t sectionOffset = code.labelOffset(label);
-//! printf("Label offset relative to section: %llu\n", (unsigned long long)sectionOffset);
-//!
-//! // If you use multiple sections and want the offset relative to the base.
-//! // NOTE: This function expects that the section has already an offset and
-//! // the label-link was resolved (if this is not true you will still get an
-//! // offset relative to the start of the section).
-//! uint64_t baseOffset = code.labelOffsetFromBase(label);
-//! printf("Label offset relative to base: %llu\n", (unsigned long long)baseOffset);
-//! }
-//! ```
-//!
-//! ### Sections
-//!
-//! AsmJit allows to create multiple sections within the same \ref CodeHolder. A test-case
-//! [asmjit_test_x86_sections.cpp](https://github.com/asmjit/asmjit/blob/master/test/asmjit_test_x86_sections.cpp)
-//! can be used as a reference point although the following example should also provide a useful insight:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! void sectionsExample(CodeHolder& code) {
-//! // Text section is always provided as the first section.
-//! Section* text = code.textSection(); // or code.sectionById(0);
-//!
-//! // To create another section use CodeHolder::newSection().
-//! Section* data;
-//! Error err = code.newSection(&data,
-//! ".data", // Section name
-//! SIZE_MAX, // Name length if the name is not null terminated (or SIZE_MAX).
-//! SectionFlags::kNone, // Section flags, see SectionFlags.
-//! 8, // Section alignment, must be power of 2.
-//! 0); // Section order value (optional, default 0).
-//!
-//! // When you switch sections in Assembler, Builder, or Compiler the cursor
-//! // will always move to the end of that section. When you create an Assembler
-//! // the cursor would be placed at the end of the first (.text) section, which
-//! // is initially empty.
-//! x86::Assembler a(&code);
-//! Label L_Data = a.newLabel();
-//!
-//! a.mov(x86::eax, x86::ebx); // Emits in .text section.
-//!
-//! a.section(data); // Switches to the end of .data section.
-//! a.bind(L_Data); // Binds label in this .data section
-//! a.db(0x01); // Emits byte in .data section.
-//!
-//! a.section(text); // Switches to the end of .text section.
-//! a.add(x86::ebx, x86::eax); // Emits in .text section.
-//!
-//! // References a label in .text section, which was bound in .data section.
-//! // This would create a LabelLink even when the L_Data is already bound,
-//! // because the reference crosses sections. See below...
-//! a.lea(x86::rsi, x86::ptr(L_Data));
-//! }
-//! ```
-//!
-//! The last line in the example above shows that a LabelLink would be created even for bound labels that cross
-//! sections. In this case a referenced label was bound in another section, which means that the link couldn't be
-//! resolved at that moment. If your code uses sections, but you wish AsmJit to flatten these sections (you don't
-//! plan to flatten them manually) then there is an API for that.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // ... (continuing the previous example) ...
-//! void sectionsExampleContinued(CodeHolder& code) {
-//! // Suppose we have some code that contains multiple sections and
-//! // we would like to flatten it by using AsmJit's built-in API:
-//! Error err = code.flatten();
-//! if (err) {
-//! // There are many reasons it can fail, so always handle a possible error.
-//! printf("Failed to flatten the code: %s\n", DebugUtils::errorAsString(err));
-//! exit(1);
-//! }
-//!
-//! // After flattening all sections would contain assigned offsets
-//! // relative to base. Offsets are 64-bit unsigned integers so we
-//! // cast them to `size_t` for simplicity. On 32-bit targets it's
-//! // guaranteed that the offset cannot be greater than `2^32 - 1`.
-//! printf("Data section offset %zu", size_t(data->offset()));
-//!
-//! // The flattening doesn't resolve unresolved label links, this
-//! // has to be done manually as flattening can be done separately.
-//! err = code.resolveUnresolvedLinks();
-//! if (err) {
-//! // This is the kind of error that should always be handled...
-//! printf("Failed to resolve label links: %s\n", DebugUtils::errorAsString(err));
-//! exit(1);
-//! }
-//!
-//! if (code.hasUnresolvedLinks()) {
-//! // This would mean either unbound label or some other issue.
-//! printf("The code has %zu unbound labels\n", code.unresolvedLinkCount());
-//! exit(1);
-//! }
-//! }
-//! ```
-
-
-//! \defgroup asmjit_assembler Assembler
-//! \brief Assembler interface and operands.
-//!
-//! ### Overview
-//!
-//! AsmJit's Assembler is used to emit machine code directly into a \ref CodeBuffer. In general, code generation
-//! with assembler requires the knowledge of the following:
-//!
-//! - \ref BaseAssembler and architecture-specific assemblers:
-//! - \ref x86::Assembler - Assembler implementation targeting X86 and X86_64 architectures.
-//! - \ref a64::Assembler - Assembler implementation targeting AArch64 architecture.
-//! - \ref Operand and its variations:
-//! - \ref BaseReg - Base class for a register operand, inherited by:
-//! - \ref x86::Reg - Register operand specific to X86 and X86_64 architectures.
-//! - \ref arm::Reg - Register operand specific to AArch64 architecture.
-//! - \ref BaseMem - Base class for a memory operand, inherited by:
-//! - \ref x86::Mem - Memory operand specific to X86 architecture.
-//! - \ref arm::Mem - Memory operand specific to AArch64 architecture.
-//! - \ref Imm - Immediate (value) operand.
-//! - \ref Label - Label operand.
-//!
-//! \note Assembler examples use \ref x86::Assembler as abstract interfaces cannot be used to generate code.
-//!
-//! ### Operand Basics
-//!
-//! Let's start with operands. \ref Operand is a data structure that defines a data layout of any operand. It can be
-//! inherited, but any class inheriting it cannot add any members to it, only the existing layout can be reused.
-//! AsmJit allows to construct operands dynamically, to store them, and to query a complete information about them
-//! at run-time. Operands are small (always 16 bytes per \ref Operand) and can be copied and passed by value. Please
-//! never allocate individual operands dynamically by using a `new` keyword - it would work, but then you would have
-//! to be responsible for deleting such operands. In AsmJit operands are always part of some other data structures
-//! like \ref InstNode, which is part of \ref asmjit_builder tool.
-//!
-//! Operands contain only identifiers, but not pointers to any code-generation data. For example \ref Label operand
-//! only provides label identifier, but not a pointer to \ref LabelEntry structure. In AsmJit such IDs are used to
-//! link stuff together without having to deal with pointers.
-//!
-//! AsmJit's operands all inherit from a base class called \ref Operand. Operands have the following properties that
-//! are commonly accessible by getters and setters:
-//!
-//! - \ref Operand - Base operand, which only provides accessors that are common to all operand types.
-//! - \ref BaseReg - Describes either physical or virtual register. Physical registers have id that matches the
-//! target's machine id directly whereas virtual registers must be allocated into physical registers by a register
-//! allocator pass. Register operand provides:
-//! - Register Type (\ref RegType) - Unique id that describes each possible register provided by the target
-//! architecture - for example X86 backend provides general purpose registers (GPB-LO, GPB-HI, GPW, GPD, and GPQ)
-//! and all types of other registers like K, MM, BND, XMM, YMM, ZMM, and TMM.
-//! - Register Group (\ref RegGroup) - Groups multiple register types under a single group - for example all
-//! general-purpose registers (of all sizes) on X86 are part of \ref RegGroup::kGp and all SIMD registers
-//! (XMM, YMM, ZMM) are part of \ref RegGroup::kVec.
-//! - Register Size - Contains the size of the register in bytes. If the size depends on the mode (32-bit vs
-//! 64-bit) then generally the higher size is used (for example RIP register has size 8 by default).
-//! - Register Id - Contains physical or virtual id of the register.
-//! - \ref BaseMem - Used to reference a memory location. Memory operand provides:
-//! - Base Register - A base register type and id (physical or virtual).
-//! - Index Register - An index register type and id (physical or virtual).
-//! - Offset - Displacement or absolute address to be referenced (32-bit if base register is used and 64-bit if
-//! base register is not used).
-//! - Flags that can describe various architecture dependent information (like scale and segment-override on X86).
-//! - \ref Imm - Immediate values are usually part of instructions (encoded within the instruction itself) or data.
-//! - \ref Label - used to reference a location in code or data. Labels must be created by the \ref BaseEmitter or
-//! by \ref CodeHolder. Each label has its unique id per \ref CodeHolder instance.
-//!
-//! ### Operand Manipulation
-//!
-//! AsmJit allows to construct operands dynamically, to store them, and to query a complete information about them at
-//! run-time. Operands are small (always 16 bytes per `Operand`) and should be always copied (by value) if you intend
-//! to store them (don't create operands by using `new` keyword, it's not recommended). Operands are safe to be passed
-//! to `memcpy()` and `memset()`, which becomes handy when working with arrays of operands. If you set all members of
-//! an \ref Operand to zero the operand would become NONE operand, which is the same as a default constructed Operand.
-//!
-//! The example below illustrates how operands can be used and modified even without using any other code generation
-//! classes. The example uses X86 architecture-specific operands.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Registers can be copied, it's a common practice.
-//! x86::Gp dstRegByValue() { return x86::ecx; }
-//!
-//! void usingOperandsExample(x86::Assembler& a) {
-//! // Gets `ecx` register returned by a function.
-//! x86::Gp dst = dstRegByValue();
-//! // Gets `rax` register directly from the provided `x86` namespace.
-//! x86::Gp src = x86::rax;
-//! // Constructs `r10` dynamically.
-//! x86::Gp idx = x86::gpq(10);
-//! // Constructs [src + idx] memory address - referencing [rax + r10].
-//! x86::Mem m = x86::ptr(src, idx);
-//!
-//! // Examine `m`: Returns `RegType::kX86_Gpq`.
-//! m.indexType();
-//! // Examine `m`: Returns 10 (`r10`).
-//! m.indexId();
-//!
-//! // Reconstruct `idx` stored in mem:
-//! x86::Gp idx_2 = x86::Gp::fromTypeAndId(m.indexType(), m.indexId());
-//!
-//! // True, `idx` and idx_2` are identical.
-//! idx == idx_2;
-//!
-//! // Possible - op will still be the same as `m`.
-//! Operand op = m;
-//! // True (can be casted to BaseMem or architecture-specific Mem).
-//! op.isMem();
-//!
-//! // True, `op` is just a copy of `m`.
-//! m == op;
-//!
-//! // Static cast is fine and valid here.
-//! static_cast<BaseMem&>(op).addOffset(1);
-//! // However, using `as<T>()` to cast to a derived type is preferred.
-//! op.as<BaseMem>().addOffset(1);
-//! // False, `op` now points to [rax + r10 + 2], which is not [rax + r10].
-//! m == op;
-//!
-//! // Emitting 'mov' - type safe way.
-//! a.mov(dst, m);
-//! // Not possible, `mov` doesn't provide mov(x86::Gp, Operand) overload.
-//! a.mov(dst, op);
-//!
-//! // Type-unsafe, but possible.
-//! a.emit(x86::Inst::kIdMov, dst, m);
-//! // Also possible, `emit()` is type-less and can be used with raw Operand.
-//! a.emit(x86::Inst::kIdMov, dst, op);
-//! }
-//! ```
-//!
-//! Some operands have to be created explicitly by emitters. For example labels must be created by \ref
-//! BaseEmitter::newLabel(), which creates a label entry and returns a \ref Label operand with the id that refers
-//! to it. Such label then can be used by emitters.
-//!
-//! ### Memory Operands
-//!
-//! Some architectures like X86 provide a complex memory addressing model that allows to encode addresses having a
-//! BASE register, INDEX register with a possible scale (left shift), and displacement (called offset in AsmJit).
-//! Memory address on X86 can also specify memory segment (segment-override in X86 terminology) and some instructions
-//! (gather / scatter) require INDEX to be a \ref x86::Vec register instead of a general-purpose register.
-//!
-//! AsmJit allows to encode and work with all forms of addresses mentioned and implemented by X86. In addition, it
-//! also allows to construct absolute 64-bit memory address operands, which is only allowed in one form of 'mov'
-//! instruction.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! void testX86Mem() {
-//! // Makes it easier to access x86 stuff...
-//! using namespace asmjit::x86;
-//!
-//! // BASE + OFFSET.
-//! Mem a = ptr(rax); // a = [rax]
-//! Mem b = ptr(rax, 15); // b = [rax + 15]
-//!
-//! // BASE + INDEX << SHIFT - Shift is in BITS as used by X86!
-//! Mem c = ptr(rax, rbx); // c = [rax + rbx]
-//! Mem d = ptr(rax, rbx, 2); // d = [rax + rbx << 2]
-//! Mem e = ptr(rax, rbx, 2, 15); // e = [rax + rbx << 2 + 15]
-//!
-//! // BASE + VM (Vector Index) (encoded as MOD+VSIB).
-//! Mem f = ptr(rax, xmm1); // f = [rax + xmm1]
-//! Mem g = ptr(rax, xmm1, 2); // g = [rax + xmm1 << 2]
-//! Mem h = ptr(rax, xmm1, 2, 15); // h = [rax + xmm1 << 2 + 15]
-//!
-//! // Absolute address:
-//! uint64_t addr = (uint64_t)0x1234;
-//! Mem i = ptr(addr); // i = [0x1234]
-//! Mem j = ptr(addr, rbx); // j = [0x1234 + rbx]
-//! Mem k = ptr(addr, rbx, 2); // k = [0x1234 + rbx << 2]
-//!
-//! // LABEL - Will be encoded as RIP (64-bit) or absolute address (32-bit).
-//! Label L = ...;
-//! Mem m = ptr(L); // m = [L]
-//! Mem n = ptr(L, rbx); // n = [L + rbx]
-//! Mem o = ptr(L, rbx, 2); // o = [L + rbx << 2]
-//! Mem p = ptr(L, rbx, 2, 15); // p = [L + rbx << 2 + 15]
-//!
-//! // RIP - 64-bit only (RIP can't use INDEX).
-//! Mem q = ptr(rip, 24); // q = [rip + 24]
-//! }
-//! ```
-//!
-//! Memory operands can optionally contain memory size. This is required by instructions where the memory size cannot
-//! be deduced from other operands, like `inc` and `dec` on X86:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! void testX86Mem() {
-//! // The same as: dword ptr [rax + rbx].
-//! x86::Mem a = x86::dword_ptr(x86::rax, x86::rbx);
-//!
-//! // The same as: qword ptr [rdx + rsi << 0 + 1].
-//! x86::Mem b = x86::qword_ptr(x86::rdx, x86::rsi, 0, 1);
-//! }
-//! ```
-//!
-//! Memory operands provide API that can be used to access its properties:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! void testX86Mem() {
-//! // The same as: dword ptr [rax + 12].
-//! x86::Mem mem = x86::dword_ptr(x86::rax, 12);
-//!
-//! mem.hasBase(); // true.
-//! mem.hasIndex(); // false.
-//! mem.size(); // 4.
-//! mem.offset(); // 12.
-//!
-//! mem.setSize(0); // Sets the size to 0 (makes it size-less).
-//! mem.addOffset(-1); // Adds -1 to the offset and makes it 11.
-//! mem.setOffset(0); // Sets the offset to 0.
-//! mem.setBase(x86::rcx); // Changes BASE to RCX.
-//! mem.setIndex(x86::rax); // Changes INDEX to RAX.
-//! mem.hasIndex(); // true.
-//! }
-//! // ...
-//! ```
-//!
-//! Making changes to memory operand is very comfortable when emitting loads
-//! and stores:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! void testX86Mem(CodeHolder& code) {
-//! x86::Assembler a(code); // Your initialized x86::Assembler.
-//! x86::Mem mSrc = x86::ptr(eax); // Construct [eax] memory operand.
-//!
-//! // One way of emitting bunch of loads is to use `mem.adjusted()`, which
-//! // returns a new memory operand and keeps the source operand unchanged.
-//! a.movaps(x86::xmm0, mSrc); // No adjustment needed to load [eax].
-//! a.movaps(x86::xmm1, mSrc.adjusted(16)); // Loads from [eax + 16].
-//! a.movaps(x86::xmm2, mSrc.adjusted(32)); // Loads from [eax + 32].
-//! a.movaps(x86::xmm3, mSrc.adjusted(48)); // Loads from [eax + 48].
-//!
-//! // ... do something with xmm0-3 ...
-//!
-//! // Another way of adjusting memory is to change the operand in-place.
-//! // If you want to keep the original operand you can simply clone it.
-//! x86::Mem mDst = mSrc.clone(); // Clone mSrc.
-//!
-//! a.movaps(mDst, x86::xmm0); // Stores xmm0 to [eax].
-//! mDst.addOffset(16); // Adds 16 to `mDst`.
-//!
-//! a.movaps(mDst, x86::xmm1); // Stores to [eax + 16] .
-//! mDst.addOffset(16); // Adds 16 to `mDst`.
-//!
-//! a.movaps(mDst, x86::xmm2); // Stores to [eax + 32].
-//! mDst.addOffset(16); // Adds 16 to `mDst`.
-//!
-//! a.movaps(mDst, x86::xmm3); // Stores to [eax + 48].
-//! }
-//! ```
-//!
-//! ### Assembler Examples
-//!
-//! - \ref x86::Assembler provides many X86/X64 examples.
-
-
-//! \defgroup asmjit_builder Builder
-//! \brief Builder interface, nodes, and passes.
-//!
-//! ### Overview
-//!
-//! Both \ref BaseBuilder and \ref BaseCompiler interfaces describe emitters that emit into a representation that
-//! allows further processing. The code stored in such representation is completely safe to be patched, simplified,
-//! reordered, obfuscated, removed, injected, analyzed, or processed some other way. Each instruction, label,
-//! directive, or other building block is stored as \ref BaseNode (or derived class like \ref InstNode or \ref
-//! LabelNode) and contains all the information necessary to pass that node later to the assembler.
-//!
-//! \ref BaseBuilder is an emitter that inherits from \ref BaseEmitter interface. It was designed to provide a maximum
-//! compatibility with the existing \ref BaseAssembler emitter so users can move from assembler to builder when needed,
-//! for example to implement post-processing, which is not possible with Assembler.
-//!
-//! ### Builder Nodes
-//!
-//! \ref BaseBuilder doesn't generate machine code directly, it uses an intermediate representation based on nodes,
-//! however, it allows to serialize to \ref BaseAssembler when the code is ready to be encoded.
-//!
-//! There are multiple node types used by both \ref BaseBuilder and \ref BaseCompiler :
-//!
-//! - Basic nodes:
-//! - \ref BaseNode - Base class for all nodes.
-//! - \ref InstNode - Represents an instruction node.
-//! - \ref AlignNode - Represents an alignment directive (.align).
-//! - \ref LabelNode - Represents a location where to bound a \ref Label.
-//!
-//! - Data nodes:
-//! - \ref EmbedDataNode - Represents data.
-//! - \ref EmbedLabelNode - Represents \ref Label address embedded as data.
-//! - \ref EmbedLabelDeltaNode - Represents a difference of two labels embedded in data.
-//! - \ref ConstPoolNode - Represents a constant pool data embedded as data.
-//!
-//! - Informative nodes:
-//! - \ref CommentNode - Represents a comment string, doesn't affect code generation.
-//! - \ref SentinelNode - A marker that can be used to remember certain position in code or data, doesn't affect
-//! code generation. Used by \ref FuncNode to mark the end of a function.
-//!
-//! - Other nodes are provided by \ref asmjit_compiler infrastructure.
-//!
-//! ### Builder Examples
-//!
-//! - \ref x86::Builder - Builder implementation targeting X86 and X86_64 architectures.
-//! - \ref a64::Builder - Builder implementation targeting AArch64 architecture.
-
-
-//! \defgroup asmjit_compiler Compiler
-//! \brief Compiler interface.
-//!
-//! ### Overview
-//!
-//! \ref BaseCompiler is a high-level interface, which provides register allocation and support for defining and
-//! invoking functions, built on top of \ref BaseBuilder interface At the moment it's the easiest way of generating
-//! code in AsmJit as most architecture and OS specifics is properly abstracted and handled by AsmJit automatically.
-//! However, abstractions also mean restrictions, which means that \ref BaseCompiler has more limitations than \ref
-//! BaseAssembler or \ref BaseBuilder.
-//!
-//! Since \ref BaseCompiler provides register allocation it also establishes the concept of functions - a function
-//! in Compiler sense is a unit in which virtual registers are allocated into physical registers by the register
-//! allocator. In addition, it enables to use such virtual registers in function invocations.
-//!
-//! \ref BaseCompiler automatically handles function calling conventions. It's still architecture dependent, but
-//! makes the code generation much easies. Functions are essential; the first-step to generate some code is to define
-//! a signature of the function to be generated (before generating the function body itself). Function arguments and
-//! return value(s) are handled by assigning virtual registers to them. Similarly, function calls are handled the same
-//! way.
-//!
-//! ### Compiler Nodes
-//!
-//! \ref BaseCompiler adds some nodes that are required for function generation and invocation:
-//!
-//! - \ref FuncNode - Represents a function definition.
-//! - \ref FuncRetNode - Represents a function return.
-//! - \ref InvokeNode - Represents a function invocation.
-//!
-//! \ref BaseCompiler also makes the use of passes (\ref Pass) and automatically adds an architecture-dependent
-//! register allocator pass to the list of passes when attached to \ref CodeHolder.
-//!
-//! ### Compiler Examples
-//!
-//! - \ref x86::Compiler - Compiler implementation targeting X86 and X86_64 architectures.
-//! - \ref a64::Compiler - Compiler implementation targeting AArch64 architecture.
-//!
-//! ### Compiler Tips
-//!
-//! Users of AsmJit have done mistakes in the past, this section should provide some useful tips for beginners:
-//!
-//! - Virtual registers in compiler are bound to a single function. At the moment the implementation doesn't
-//! care whether a single virtual register is used in multiple functions, but it sees it as two independent
-//! virtual registers in that case. This means that virtual registers cannot be used to implement global
-//! variables. Global variables are basically memory addresses which functions can read from and write to,
-//! and they have to be implemented in the same way.
-//!
-//! - Compiler provides a useful debugging functionality, which can be turned on through \ref FormatFlags. Use
-//! \ref Logger::addFlags() to turn on additional logging features when using Compiler.
-
-
-//! \defgroup asmjit_function Function
-//! \brief Function definitions.
-//!
-//! ### Overview
-//!
-//! AsmJit provides functionality that can be used to define function signatures and to calculate automatically
-//! optimal function frame that can be used directly by a prolog and epilog insertion. This feature was exclusive
-//! to AsmJit's Compiler for a very long time, but was abstracted out and is now available for all users regardless
-//! of the emitter they use. The following use cases are possible:
-//!
-//! - Calculate function frame before the function is generated - this is the only way available to \ref
-//! BaseAssembler users and it will be described in this section.
-//!
-//! - Calculate function frame after the function is generated - this way is generally used by \ref BaseBuilder
-//! and \ref BaseCompiler emitters and this way is generally described in \ref asmjit_compiler section.
-//!
-//! The following concepts are used to describe and create functions in AsmJit:
-//!
-//! - \ref TypeId - Type-id is an 8-bit value that describes a platform independent type as we know from C/C++.
-//! It provides abstractions for most common types like `int8_t`, `uint32_t`, `uintptr_t`, `float`, `double`,
-//! and all possible vector types to match ISAs up to AVX512. \ref TypeId was introduced originally for \ref
-//! asmjit_compiler, but it's now used by \ref FuncSignature as well.
-//!
-//! - \ref CallConv - Describes a calling convention - this class contains instructions to assign registers and
-//! stack addresses to function arguments and return value(s), but doesn't specify any function signature itself.
-//! Calling conventions are architecture and OS dependent.
-//!
-//! - \ref FuncSignature - Describes a function signature, for example `int func(int, int)`. FuncSignature contains
-//! a function calling convention id, return value type, and function arguments. The signature itself is platform
-//! independent and uses \ref TypeId to describe types of function arguments and function return value(s).
-//!
-//! - \ref FuncDetail - Architecture and ABI dependent information that describes \ref CallConv and expanded \ref
-//! FuncSignature. Each function argument and return value is represented as \ref FuncValue that contains the
-//! original \ref TypeId enriched with additional information that specifies whether the value is passed or
-//! returned by register (and which register) or by stack. Each value also contains some other metadata that
-//! provide additional information required to handle it properly (for example whether a vector is passed
-//! indirectly by a pointer as required by WIN64 calling convention).
-//!
-//! - \ref FuncFrame - Contains information about the function frame that can be used by prolog/epilog inserter
-//! (PEI). Holds call stack size size and alignment, local stack size and alignment, and various attributes that
-//! describe how prolog and epilog should be constructed. `FuncFrame` doesn't know anything about function's
-//! arguments or return values, it hold only information necessary to create a valid and ABI conforming function
-//! prologs and epilogs.
-//!
-//! - \ref FuncArgsAssignment - A helper class that can be used to reassign function arguments into user specified
-//! registers. It's architecture and ABI dependent mapping from function arguments described by \ref CallConv
-//! and \ref FuncDetail into registers specified by the user.
-//!
-//! It's a lot of concepts where each represents one step in a function frame calculation. It can be used to create
-//! function prologs, epilogs, and also to calculate information necessary to perform function calls.
-
-
-//! \defgroup asmjit_logging Logging
-//! \brief Logging and formatting.
-//!
-//! ### Overview
-//!
-//! The initial phase of a project that generates machine code is not always smooth. Failure cases are common not just
-//! at the beginning phase, but also during the development or refactoring. AsmJit provides logging functionality to
-//! address this issue. AsmJit does already a good job with function overloading to prevent from emitting unencodable
-//! instructions, but it can't prevent from emitting machine code that is correct at instruction level, but doesn't
-//! work when it's executed asa whole. Logging has always been an important part of AsmJit's infrastructure and looking
-//! at logs can sometimes reveal code generation issues quickly.
-//!
-//! AsmJit provides API for logging and formatting:
-//!
-//! - \ref Logger - A logger that you can pass to \ref CodeHolder and all emitters that inherit from \ref BaseEmitter.
-//!
-//! - \ref FormatOptions - Formatting options that can change how instructions and operands are formatted.
-//!
-//! - \ref Formatter - A namespace that provides functions that can format input data like \ref Operand, \ref BaseReg,
-//! \ref Label, and \ref BaseNode into \ref String.
-//!
-//! AsmJit's \ref Logger serves the following purposes:
-//!
-//! - Provides a basic foundation for logging.
-//!
-//! - Abstract class leaving the implementation on users. The following built-in implementations are provided for
-//! simplicity:
-//!
-//! - \ref FileLogger implements logging into a standard `FILE` stream.
-//! - \ref StringLogger serializes all logs into a \ref String instance.
-//!
-//! AsmJit's \ref FormatOptions provides the following to customize the formatting of instructions and operands through:
-//!
-//! - \ref FormatFlags
-//! - \ref FormatIndentationGroup
-//!
-//! ### Logging
-//!
-//! A \ref Logger is typically attached to a \ref CodeHolder, which propagates it to all attached emitters
-//! automatically. The example below illustrates how to use \ref FileLogger that outputs to standard output:
-//!
-//! ```
-//! #include <asmjit/core.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! FileLogger logger(stdout); // Logger should always survive CodeHolder.
-//!
-//! CodeHolder code; // Holds code and relocation information.
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! code.setLogger(&logger); // Attach the `logger` to `code` holder.
-//!
-//! // ... code as usual, everything emitted will be logged to `stdout` ...
-//! return 0;
-//! }
-//! ```
-//!
-//! If output to FILE stream is not desired it's possible to use \ref StringLogger, which concatenates everything
-//! into a multi-line string:
-//!
-//! ```
-//! #include <asmjit/core.h>
-//! #include <stdio.h>
-//! #include <utility>
-//!
-//! using namespace asmjit;
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! StringLogger logger; // Logger should always survive CodeHolder.
-//!
-//! CodeHolder code; // Holds code and relocation information.
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! code.setLogger(&logger); // Attach the `logger` to `code` holder.
-//!
-//! // ... code as usual, logging will be concatenated to logger string ...
-//!
-//! // You can either use the string from StringLogger directly or you can
-//! // move it. Logger::data() returns its content as null terminated char[].
-//! printf("Logger content: %s\n", logger.data());
-//!
-//! // It can be moved into your own string like this:
-//! String content = std::move(logger.content());
-//! printf("The same content: %s\n", content.data());
-//!
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Formatting
-//!
-//! AsmJit uses \ref Formatter to format inputs that are then passed to \ref Logger. Formatting is public and can be
-//! used by AsmJit users as well. The most important thing to know regarding formatting is that \ref Formatter always
-//! appends to the output string, so it can be used to build complex strings without having to concatenate
-//! intermediate strings.
-//!
-//! The first example illustrates how to format operands:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! void logOperand(Arch arch, const Operand_& op) {
-//! // The emitter is optional (named labels and virtual registers need it).
-//! BaseEmitter* emitter = nullptr;
-//!
-//! // No flags by default.
-//! FormatFlags formatFlags = FormatFlags::kNone;
-//!
-//! StringTmp<128> sb;
-//! Formatter::formatOperand(sb, formatFlags, emitter, arch, op);
-//! printf("%s\n", sb.data());
-//! }
-//!
-//! void formattingExample() {
-//! using namespace x86;
-//!
-//! // Architecture is not part of operand, it must be passed explicitly.
-//! // Format flags. We pass it explicitly also to 'logOperand' to make
-//! // compatible with what AsmJit normally does.
-//! Arch arch = Arch::kX64;
-//!
-//! logOperand(arch, rax); // Prints 'rax'.
-//! logOperand(arch, ptr(rax, rbx, 2)); // Prints '[rax + rbx * 4]`.
-//! logOperand(arch, dword_ptr(rax, rbx, 2)); // Prints 'dword [rax + rbx * 4]`.
-//! logOperand(arch, imm(42)); // Prints '42'.
-//! }
-//! ```
-//!
-//! Next example illustrates how to format whole instructions:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//! #include <utility>
-//!
-//! using namespace asmjit;
-//!
-//! template<typename... Args>
-//! void logInstruction(Arch arch, const BaseInst& inst, Args&&... args) {
-//! // The emitter is optional (named labels and virtual registers need it).
-//! BaseEmitter* emitter = nullptr;
-//!
-//! // No flags by default.
-//! FormatFlags formatFlags = FormatFlags::kNone;
-//!
-//! // The formatter expects operands in an array.
-//! Operand_ operands[] { std::forward<Args>(args)... };
-//!
-//! StringTmp<128> sb;
-//! Formatter::formatInstruction(
-//! sb, formatFlags, emitter, arch, inst, operands, sizeof...(args));
-//! printf("%s\n", sb.data());
-//! }
-//!
-//! void formattingExample() {
-//! using namespace x86;
-//!
-//! // Architecture is not part of operand, it must be passed explicitly.
-//! // Format flags. We pass it explicitly also to 'logOperand' to make
-//! // compatible with what AsmJit normally does.
-//! Arch arch = Arch::kX64;
-//!
-//! // Prints 'mov rax, rcx'.
-//! logInstruction(arch, BaseInst(Inst::kIdMov), rax, rcx);
-//!
-//! // Prints 'vaddpd zmm0, zmm1, [rax] {1to8}'.
-//! logInstruction(arch,
-//! BaseInst(Inst::kIdVaddpd),
-//! zmm0, zmm1, ptr(rax)._1to8());
-//!
-//! // BaseInst abstracts instruction id, instruction options, and extraReg.
-//! // Prints 'lock add [rax], rcx'.
-//! logInstruction(arch,
-//! BaseInst(Inst::kIdAdd, InstOptions::kX86_Lock),
-//! ptr(rax), rcx);
-//!
-//! // Similarly an extra register (like AVX-512 selector) can be used.
-//! // Prints 'vaddpd zmm0 {k2} {z}, zmm1, [rax]'.
-//! logInstruction(arch,
-//! BaseInst(Inst::kIdAdd, InstOptions::kX86_ZMask, k2),
-//! zmm0, zmm1, ptr(rax));
-//! }
-//! ```
-//!
-//! And finally, the example below illustrates how to use a built-in function to format the content of
-//! \ref BaseBuilder, which consists of nodes:
-//!
-//! ```
-//! #include <asmjit/core.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! void formattingExample(BaseBuilder* builder) {
-//! FormatOptions formatOptions {};
-//!
-//! // This also shows how temporary strings can be used.
-//! StringTmp<512> sb;
-//!
-//! // FormatNodeList requires the String for output, formatting flags, which
-//! // were zero (no extra flags), and the builder instance, which we have
-//! // provided. An overloaded version also exists, which accepts begin and
-//! // and end nodes, which can be used to only format a range of nodes.
-//! Formatter::formatNodeList(sb, formatOptions, builder);
-//!
-//! // You can do whatever else with the string, it's always null terminated,
-//! // so it can be passed to C functions like printf().
-//! printf("%s\n", sb.data());
-//! }
-//! ```
-
-
-//! \defgroup asmjit_error_handling Error Handling
-//! \brief Error handling.
-//!
-//! ### Overview
-//!
-//! AsmJit uses error codes to represent and return errors. Every function that can fail returns an \ref Error code.
-//! Exceptions are never thrown by AsmJit itself even in extreme conditions like out-of-memory, but it's possible to
-//! override \ref ErrorHandler::handleError() to throw, in that case no error will be returned and exception will be
-//! thrown instead. All functions where this can happen are not marked `noexcept`.
-//!
-//! Errors should never be ignored, however, checking errors after each AsmJit API call would simply over-complicate
-//! the whole code generation experience. \ref ErrorHandler exists to make the use of AsmJit API simpler as it allows
-//! to customize how errors can be handled:
-//!
-//! - Record the error and continue (the way how the error is user-implemented).
-//! - Throw an exception. AsmJit doesn't use exceptions and is completely exception-safe, but it's perfectly legal
-//! to throw an exception from the error handler.
-//! - Use plain old C's `setjmp()` and `longjmp()`. Asmjit always puts Assembler, Builder and Compiler to a
-//! consistent state before calling \ref ErrorHandler::handleError(), so `longjmp()` can be used without issues
-//! to cancel the code-generation if an error occurred. This method can be used if exception handling in your
-//! project is turned off and you still want some comfort. In most cases it should be safe as AsmJit uses \ref
-//! Zone memory and the ownership of memory it allocates always ends with the instance that allocated it. If
-//! using this approach please never jump outside the life-time of \ref CodeHolder and \ref BaseEmitter.
-//!
-//! ### Using ErrorHandler
-//!
-//! An example of attaching \ref ErrorHandler to \ref CodeHolder.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // A simple error handler implementation, extend according to your needs.
-//! class MyErrorHandler : public ErrorHandler {
-//! public:
-//! void handleError(Error err, const char* message, BaseEmitter* origin) override {
-//! printf("AsmJit error: %s\n", message);
-//! }
-//! };
-//!
-//! int main() {
-//! JitRuntime rt;
-//!
-//! MyErrorHandler myErrorHandler;
-//! CodeHolder code;
-//!
-//! code.init(rt.environment(), rt.cpuFeatures());
-//! code.setErrorHandler(&myErrorHandler);
-//!
-//! x86::Assembler a(&code);
-//! // ... code generation ...
-//!
-//! return 0;
-//! }
-//! ```
-//!
-//! Useful classes in error handling group:
-//!
-//! - See \ref DebugUtils that provides utilities useful for debugging.
-//! - See \ref Error that lists error codes that AsmJit uses.
-//! - See \ref ErrorHandler for more details about error handling.
-
-
-//! \defgroup asmjit_instruction_db Instruction DB
-//! \brief Instruction database (introspection, read/write, validation, ...).
-//!
-//! ### Overview
-//!
-//! AsmJit provides a public instruction database that can be used to query information about a complete instruction.
-//! The instruction database requires the knowledge of the following:
-//!
-//! - \ref BaseInst - Base instruction that contains instruction id, options, and a possible extra-register that
-//! represents either REP prefix counter or AVX-512 selector (mask).
-//!
-//! - \ref Operand - Represents operands of an instruction.
-//!
-//! Each instruction can be then queried for the following information:
-//!
-//! - \ref InstRWInfo - Read/write information of instruction and its operands (includes \ref OpRWInfo).
-//!
-//! - \ref CpuFeatures - CPU features required to execute the instruction.
-//!
-//! In addition to query functionality AsmJit is also able to validate whether an instruction and its operands are
-//! valid. This is useful for making sure that what user tries to emit is correct and it can be also used by other
-//! projects that parse user input, like AsmTK project.
-//!
-//! ### Query API
-//!
-//! The instruction query API is provided by \ref InstAPI namespace. The following queries are possible:
-//!
-//! - \ref InstAPI::queryRWInfo() - queries read/write information of the given instruction and its operands.
-//! Includes also CPU flags read/written.
-//!
-//! - \ref InstAPI::queryFeatures() - queries CPU features that are required to execute the given instruction. A full
-//! instruction with operands must be given as some architectures like X86 may require different features for the
-//! same instruction based on its operands.
-//!
-//! - <a href="https://github.com/asmjit/asmjit/blob/master/test/asmjit_test_instinfo.cpp">asmjit_test_instinfo.cpp</a>
-//! can be also used as a reference about accessing instruction information.
-//!
-//! ### Validation API
-//!
-//! The instruction validation API is provided by \ref InstAPI namespace in the similar fashion like the Query API,
-//! however, validation can also be turned on at \ref BaseEmitter level. The following is possible:
-//!
-//! - \ref InstAPI::validate() - low-level instruction validation function that is used internally by emitters
-//! if strict validation is enabled.
-//!
-//! - \ref BaseEmitter::addDiagnosticOptions() - can be used to enable validation at emitter level, see \ref
-//! DiagnosticOptions.
-
-
-//! \defgroup asmjit_virtual_memory Virtual Memory
-//! \brief Virtual memory management.
-//!
-//! ### Overview
-//!
-//! AsmJit's virtual memory management is divided into three main categories:
-//!
-//! - Low level interface that provides cross-platform abstractions for virtual memory allocation. Implemented in
-//! \ref VirtMem namespace. This API is a thin wrapper around operating system specific calls such as
-//! `VirtualAlloc()` and `mmap()` and it's intended to be used by AsmJit's higher level API. Low-level virtual
-//! memory functions can be used to allocate virtual memory, change its permissions, and to release it.
-//! Additionally, an API that allows to create dual mapping (to support hardened environments) is provided.
-//!
-//! - Middle level API that is provided by \ref JitAllocator, which uses \ref VirtMem internally and offers nicer
-//! API that can be used by users to allocate executable memory conveniently. \ref JitAllocator tries to be smart,
-//! for example automatically using dual mapping or `MAP_JIT` on hardened environments.
-//!
-//! - High level API that is provided by \ref JitRuntime, which implements \ref Target interface and uses \ref
-//! JitAllocator under the hood. Since \ref JitRuntime inherits from \ref Target it makes it easy to use with
-//! \ref CodeHolder. Many AsmJit examples use \ref JitRuntime for its simplicity and easy integration.
-//!
-//! The main difference between \ref VirtMem and \ref JitAllocator is that \ref VirtMem can only be used to allocate
-//! whole pages, whereas \ref JitAllocator has `malloc()` like API that allows to allocate smaller quantities that
-//! usually represent the size of an assembled function or a chunk of functions that can represent a module, for
-//! example. \ref JitAllocator then tracks used space of each page it maintains. Internally, \ref JitAllocator uses
-//! two bit arrays to track occupied regions in each allocated block of pages.
-//!
-//! ### Hardened Environments
-//!
-//! In the past, allocating virtual memory with Read+Write+Execute (RWX) access permissions was easy. However, modern
-//! operating systems and runtime environments often use hardening, which typically prohibits mapping pages with both
-//! Write and Execute permissions (known as the W^X policy). This presents a challenge for JIT compilers because
-//! generated code for a single function is unlikely to fit in exactly N pages without leaving some space empty. To
-//! accommodate this, the execution environment may need to temporarily change the permissions of existing pages to
-//! read+write (RW) to insert new code into them, however, sometimes it's not possible to ensure that no thread is
-//! executing code in such affected pages in a multithreaded environment, in which multiple threads may be executing
-//! generated code.
-//!
-//! Such restrictions leave a lot of complexity on the application, so AsmJit implements a dual mapping technique to
-//! make the life of AsmJit users easier. In this technique, a region of memory is mapped to two different virtual
-//! addresses with different access permissions. One virtual address is mapped with read and write (RW) access, which
-//! is used by the JIT compiler to write generated code. The other virtual address is mapped with read and execute (RX)
-//! access, which is used by the application to execute the generated code.
-//!
-//! However, implementing dual mapping can be challenging because it typically requires obtaining an anonymous file
-//! descriptor on most Unix-like operating systems. This file descriptor is then passed to mmap() twice to create
-//! the two mappings. AsmJit handles this challenge by using system-specific techniques such as `memfd_create()` on
-//! Linux, `shm_open(SHM_ANON)` on BSD, and `MAP_REMAPDUP` with `mremap()` on NetBSD. The latter approach does not
-//! require a file descriptor. If none of these options are available, AsmJit uses a plain `open()` call followed by
-//! `unlink()`.
-//!
-//! The most challenging part is actually obtaining a file descriptor that can be passed to `mmap()` with `PROT_EXEC`.
-//! This is still something that may fail, for example the environment could be hardened in a way that this would
-//! not be possible at all, and thus dual mapping would not work.
-//!
-//! Dual mapping is provided by both \ref VirtMem and \ref JitAllocator.
-
-
-//! \defgroup asmjit_zone Zone Memory
-//! \brief Zone memory allocator and containers.
-//!
-//! ### Overview
-//!
-//! AsmJit uses zone memory allocation (also known as Arena allocation) to allocate most of the data it uses. It's a
-//! fast allocator that allows AsmJit to allocate a lot of small data structures fast and without `malloc()` overhead.
-//! Since code generators and all related classes are usually short-lived this approach decreases memory usage and
-//! fragmentation as arena-based allocators always allocate larger blocks of memory, which are then split into smaller
-//! chunks.
-//!
-//! Another advantage of zone memory allocation is that since the whole library uses this strategy it's very easy to
-//! deallocate everything that a particular instance is holding by simply releasing the memory the allocator holds.
-//! This improves destruction time of such objects as there is no destruction at all. Long-lived objects just reset
-//! its data in destructor or in their reset() member function for a future reuse. For this purpose all containers in
-//! AsmJit are also zone allocated.
-//!
-//! ### Zone Allocation
-//!
-//! - \ref Zone - Incremental zone memory allocator with minimum features. It can only allocate memory without the
-//! possibility to return it back to the allocator.
-//!
-//! - \ref ZoneTmp - A temporary \ref Zone with some initial static storage. If the allocation requests fit the
-//! static storage allocated then there will be no dynamic memory allocation during the lifetime of \ref ZoneTmp,
-//! otherwise it would act as \ref Zone with one preallocated block on the stack.
-//!
-//! - \ref ZoneAllocator - A wrapper of \ref Zone that provides the capability of returning memory to the allocator.
-//! Such memory is stored in a pool for later reuse.
-//!
-//! ### Zone Allocated Containers
-//!
-//! - \ref ZoneString - Zone allocated string.
-//! - \ref ZoneHash - Zone allocated hash table.
-//! - \ref ZoneTree - Zone allocated red-black tree.
-//! - \ref ZoneList - Zone allocated double-linked list.
-//! - \ref ZoneStack - Zone allocated stack.
-//! - \ref ZoneVector - Zone allocated vector.
-//! - \ref ZoneBitVector - Zone allocated vector of bits.
-//!
-//! ### Using Zone Allocated Containers
-//!
-//! The most common data structure exposed by AsmJit is \ref ZoneVector. It's very similar to `std::vector`, but the
-//! implementation doesn't use exceptions and uses the mentioned \ref ZoneAllocator for performance reasons. You don't
-//! have to worry about allocations as you should not need to add items to AsmJit's data structures directly as there
-//! should be API for all required operations.
-//!
-//! The following APIs in \ref CodeHolder returns \ref ZoneVector reference:
-//!
-//! ```
-//! using namespace asmjit;
-//!
-//! void example(CodeHolder& code) {
-//! // Contains all emitters attached to CodeHolder.
-//! const ZoneVector<BaseEmitter*>& emitters = code.emitters();
-//!
-//! // Contains all section entries managed by CodeHolder.
-//! const ZoneVector<Section*>& sections = code.sections();
-//!
-//! // Contains all label entries managed by CodeHolder.
-//! const ZoneVector<LabelEntry*>& labelEntries = code.labelEntries();
-//!
-//! // Contains all relocation entries managed by CodeHolder.
-//! const ZoneVector<RelocEntry*>& relocEntries = code.relocEntries();
-//! }
-//! ```
-//!
-//! \ref ZoneVector has overloaded array access operator to make it possible to access its elements through operator[].
-//! Some standard functions like \ref ZoneVector::empty(), \ref ZoneVector::size(), and \ref ZoneVector::data() are
-//! provided as well. Vectors are also iterable through a range-based for loop:
-//!
-//! ```
-//! using namespace asmjit;
-//!
-//! void example(CodeHolder& code) {
-//! for (LabelEntry* le : code.labelEntries()) {
-//! printf("Label #%u {Bound=%s Offset=%llu}",
-//! le->id(),
-//! le->isBound() ? "true" : "false",
-//! (unsigned long long)le->offset());
-//! }
-//! }
-//! ```
-//!
-//! ### Design Considerations
-//!
-//! Zone-allocated containers do not store the allocator within the container. This decision was made to reduce the
-//! footprint of such containers as AsmJit tooling, especially Compiler's register allocation, may use many instances
-//! of such containers to perform code analysis and register allocation.
-//!
-//! For example to append an item into a \ref ZoneVector it's required to pass the allocator as the first argument,
-//! so it can be used in case that the vector needs a reallocation. Such function also returns an error, which must
-//! be propagated to the caller.
-//!
-//! ```
-//! using namespace asmjit
-//!
-//! Error example(ZoneAllocator* allocator) {
-//! ZoneVector<int> vector;
-//!
-//! // Unfortunately, allocator must be provided to all functions that mutate
-//! // the vector. However, AsmJit users should never need to do this as all
-//! // manipulation should be done through public API, which takes care of
-//! // that.
-//! for (int i = 0; i < 100; i++) {
-//! ASMJIT_PROPAGATE(vector.append(allocator, i));
-//! }
-//!
-//! // By default vector's destructor doesn't release anything as it knows
-//! // that its content is zone allocated. However, \ref ZoneVector::release
-//! // can be used to explicitly release the vector data to the allocator if
-//! // necessary
-//! vector.release(allocator);
-//! }
-//! ```
-//!
-//! Containers like \ref ZoneVector also provide a functionality to reserve a certain number of items before any items
-//! are added to it. This approach is used internally in most places as it allows to prepare space for data that will
-//! be added to some container before the data itself was created.
-//!
-//! ```
-//! using namespace asmjit
-//!
-//! Error example(ZoneAllocator* allocator) {
-//! ZoneVector<int> vector;
-//!
-//! ASMJIT_PROPAGATE(vector.willGrow(100));
-//! for (int i = 0; i < 100; i++) {
-//! // Cannot fail.
-//! vector.appendUnsafe(allocator, i);
-//! }
-//!
-//! vector.release(allocator);
-//! }
-//! ```
-
-
-//! \defgroup asmjit_utilities Utilities
-//! \brief Utility classes and functions.
-//!
-//! ### Overview
-//!
-//! AsmJit uses and provides utility classes and functions, that can be used with AsmJit. The functionality can be
-//! divided into the following topics:
-//!
-//! ### String Functionality
-//!
-//! - \ref String - AsmJit's string container, which is used internally and which doesn't use exceptions and has
-//! a stable layout, which is not dependent on C++ standard library.
-//!
-//! - \ref StringTmp - String that can have base storage allocated on stack. The amount of storage on stack can
-//! be specified as a template parameter.
-//!
-//! - \ref FixedString - Fixed string container limited up to N characters.
-//!
-//! ### Code Generation Utilities
-//!
-//! - \ref ConstPool - Constant pool used by \ref BaseCompiler, but also available to users that may find use of it.
-//!
-//! ### Support Functionality Used by AsmJit
-//!
-//! - \ref Support namespace provides many other utility functions and classes that are used by AsmJit, and made
-//! public.
-
-
-//! \defgroup asmjit_x86 X86 Backend
-//! \brief X86/X64 backend.
-
-
-//! \defgroup asmjit_arm ARM Commons
-//! \brief ARM commons shared between AArch32 and AArch64.
-
-
-//! \defgroup asmjit_a64 AArch64 Backend
-//! \brief AArch64 backend.
-
-
-//! \cond INTERNAL
-//! \defgroup asmjit_ra RA
-//! \brief Register allocator internals.
-//! \endcond
-
-} // {asmjit}
-
-#include "asmjit-scope-begin.h"
-#include "core/archtraits.h"
-#include "core/assembler.h"
-#include "core/builder.h"
-#include "core/codeholder.h"
-#include "core/compiler.h"
-#include "core/constpool.h"
-#include "core/cpuinfo.h"
-#include "core/emitter.h"
-#include "core/environment.h"
-#include "core/errorhandler.h"
-#include "core/formatter.h"
-#include "core/func.h"
-#include "core/globals.h"
-#include "core/inst.h"
-#include "core/jitallocator.h"
-#include "core/jitruntime.h"
-#include "core/logger.h"
-#include "core/operand.h"
-#include "core/osutils.h"
-#include "core/string.h"
-#include "core/support.h"
-#include "core/target.h"
-#include "core/type.h"
-#include "core/virtmem.h"
-#include "core/zone.h"
-#include "core/zonehash.h"
-#include "core/zonelist.h"
-#include "core/zonetree.h"
-#include "core/zonestack.h"
-#include "core/zonestring.h"
-#include "core/zonevector.h"
-#include "asmjit-scope-end.h"
-
-#endif // ASMJIT_CORE_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/api-config.h b/3rdparty/asmjit/src/asmjit/core/api-config.h
deleted file mode 100644
index c9199c9d7f6..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/api-config.h
+++ /dev/null
@@ -1,666 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_API_CONFIG_H_INCLUDED
-#define ASMJIT_CORE_API_CONFIG_H_INCLUDED
-
-// AsmJit Library & ABI Version
-// ============================
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! Makes a 32-bit integer that represents AsmJit version in `(major << 16) | (minor << 8) | patch` form.
-#define ASMJIT_LIBRARY_MAKE_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
-
-//! AsmJit library version, see \ref ASMJIT_LIBRARY_MAKE_VERSION for a version format reference.
-#define ASMJIT_LIBRARY_VERSION ASMJIT_LIBRARY_MAKE_VERSION(1, 13, 0)
-
-//! \def ASMJIT_ABI_NAMESPACE
-//!
-//! AsmJit ABI namespace is an inline namespace within \ref asmjit namespace.
-//!
-//! It's used to make sure that when user links to an incompatible version of AsmJit, it won't link. It has also
-//! some additional properties as well. When `ASMJIT_ABI_NAMESPACE` is defined by the user it would override the
-//! AsmJit default, which makes it possible to use multiple AsmJit libraries within a single project, totally
-//! controlled by users. This is useful especially in cases in which some of such library comes from third party.
-#if !defined(ASMJIT_ABI_NAMESPACE)
- #define ASMJIT_ABI_NAMESPACE _abi_1_13
-#endif // !ASMJIT_ABI_NAMESPACE
-
-//! \}
-
-// Global Dependencies
-// ===================
-
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdint.h> // We really want std types as globals, not under 'std' namespace.
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <initializer_list>
-#include <limits>
-#include <type_traits>
-#include <utility>
-
-#if !defined(_WIN32) && !defined(__EMSCRIPTEN__)
- #include <pthread.h>
-#endif
-
-// Build Options
-// =============
-
-#define ASMJIT_STATIC
-
-// NOTE: Doxygen cannot document macros that are not defined, that's why we have to define them and then undefine
-// them immediately, so it won't use the macros with its own preprocessor.
-#ifdef _DOXYGEN
-namespace asmjit {
-
-//! \addtogroup asmjit_build
-//! \{
-
-//! Asmjit is embedded, implies \ref ASMJIT_STATIC.
-#define ASMJIT_EMBED
-
-//! Enables static-library build.
-#define ASMJIT_STATIC
-
-//! Defined when AsmJit's build configuration is 'Debug'.
-//!
-//! \note Can be defined explicitly to bypass auto-detection.
-#define ASMJIT_BUILD_DEBUG
-
-//! Defined when AsmJit's build configuration is 'Release'.
-//!
-//! \note Can be defined explicitly to bypass auto-detection.
-#define ASMJIT_BUILD_RELEASE
-
-//! Disables X86/X64 backends.
-#define ASMJIT_NO_X86
-
-//! Disables AArch64 backend.
-#define ASMJIT_NO_AARCH64
-
-//! Disables non-host backends entirely (useful for JIT compilers to minimize the library size).
-#define ASMJIT_NO_FOREIGN
-
-//! Disables deprecated API at compile time (deprecated API won't be available).
-#define ASMJIT_NO_DEPRECATED
-
-//! Disables \ref asmjit_builder functionality completely.
-#define ASMJIT_NO_BUILDER
-
-//! Disables \ref asmjit_compiler functionality completely.
-#define ASMJIT_NO_COMPILER
-
-//! Disables JIT memory management and \ref asmjit::JitRuntime.
-#define ASMJIT_NO_JIT
-
-//! Disables \ref asmjit::Logger and \ref asmjit::Formatter.
-#define ASMJIT_NO_LOGGING
-
-//! Disables everything that contains text.
-#define ASMJIT_NO_TEXT
-
-//! Disables instruction validation API.
-#define ASMJIT_NO_VALIDATION
-
-//! Disables instruction introspection API.
-#define ASMJIT_NO_INTROSPECTION
-
-// Avoid doxygen preprocessor using feature-selection definitions.
-#undef ASMJIT_BUILD_EMBED
-#undef ASMJIT_BUILD_STATIC
-#undef ASMJIT_BUILD_DEBUG
-#undef ASMJIT_BUILD_RELEASE
-#undef ASMJIT_NO_X86
-#undef ASMJIT_NO_FOREIGN
-// (keep ASMJIT_NO_DEPRECATED defined, we don't document deprecated APIs).
-#undef ASMJIT_NO_BUILDER
-#undef ASMJIT_NO_COMPILER
-#undef ASMJIT_NO_JIT
-#undef ASMJIT_NO_LOGGING
-#undef ASMJIT_NO_TEXT
-#undef ASMJIT_NO_VALIDATION
-#undef ASMJIT_NO_INTROSPECTION
-
-//! \}
-
-} // {asmjit}
-#endif // _DOXYGEN
-
-// ASMJIT_NO_BUILDER implies ASMJIT_NO_COMPILER.
-#if defined(ASMJIT_NO_BUILDER) && !defined(ASMJIT_NO_COMPILER)
- #define ASMJIT_NO_COMPILER
-#endif
-
-// Prevent compile-time errors caused by misconfiguration.
-#if defined(ASMJIT_NO_TEXT) && !defined(ASMJIT_NO_LOGGING)
- #pragma message("'ASMJIT_NO_TEXT' can only be defined when 'ASMJIT_NO_LOGGING' is defined.")
- #undef ASMJIT_NO_TEXT
-#endif
-
-#if defined(ASMJIT_NO_INTROSPECTION) && !defined(ASMJIT_NO_COMPILER)
- #pragma message("'ASMJIT_NO_INTROSPECTION' can only be defined when 'ASMJIT_NO_COMPILER' is defined")
- #undef ASMJIT_NO_INTROSPECTION
-#endif
-
-// Build Mode
-// ==========
-
-// Detect ASMJIT_BUILD_DEBUG and ASMJIT_BUILD_RELEASE if not defined.
-#if !defined(ASMJIT_BUILD_DEBUG) && !defined(ASMJIT_BUILD_RELEASE)
- #if !defined(NDEBUG)
- #define ASMJIT_BUILD_DEBUG
- #else
- #define ASMJIT_BUILD_RELEASE
- #endif
-#endif
-
-// Target Architecture Detection
-// =============================
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! \def ASMJIT_ARCH_X86
-//!
-//! Defined to either 0, 32, or 64 depending on whether the target CPU is X86 (32) or X86_64 (64).
-
-//! \def ASMJIT_ARCH_ARM
-//!
-//! Defined to either 0, 32, or 64 depending on whether the target CPU is ARM (32) or AArch64 (64).
-
-//! \def ASMJIT_ARCH_MIPS
-//!
-//! Defined to either 0, 32, or 64 depending on whether the target CPU is MIPS (32) or MISP64 (64).
-
-//! \def ASMJIT_ARCH_RISCV
-//!
-//! Defined to either 0, 32, or 64 depending on whether the target CPU is RV32 (32) or RV64 (64).
-
-//! \def ASMJIT_ARCH_BITS
-//!
-//! Defined to either 32 or 64 depending on the target.
-
-//! \def ASMJIT_ARCH_LE
-//!
-//! Defined to 1 if the target architecture is little endian.
-
-//! \def ASMJIT_ARCH_BE
-//!
-//! Defined to 1 if the target architecture is big endian.
-
-//! \}
-
-//! \cond NONE
-
-#if defined(_M_X64) || defined(__x86_64__)
- #define ASMJIT_ARCH_X86 64
-#elif defined(_M_IX86) || defined(__X86__) || defined(__i386__)
- #define ASMJIT_ARCH_X86 32
-#else
- #define ASMJIT_ARCH_X86 0
-#endif
-
-#if defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__)
-# define ASMJIT_ARCH_ARM 64
-#elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__) || defined(__thumb2__)
- #define ASMJIT_ARCH_ARM 32
-#else
- #define ASMJIT_ARCH_ARM 0
-#endif
-
-#if defined(_MIPS_ARCH_MIPS64) || defined(__mips64)
- #define ASMJIT_ARCH_MIPS 64
-#elif defined(_MIPS_ARCH_MIPS32) || defined(_M_MRX000) || defined(__mips__)
- #define ASMJIT_ARCH_MIPS 32
-#else
- #define ASMJIT_ARCH_MIPS 0
-#endif
-
-// NOTE `__riscv` is the correct macro in this case as specified by "RISC-V Toolchain Conventions".
-#if (defined(__riscv) || defined(__riscv__)) && defined(__riscv_xlen)
- #define ASMJIT_ARCH_RISCV __riscv_xlen
-#else
- #define ASMJIT_ARCH_RISCV 0
-#endif
-
-#define ASMJIT_ARCH_BITS (ASMJIT_ARCH_X86 | ASMJIT_ARCH_ARM | ASMJIT_ARCH_MIPS | ASMJIT_ARCH_RISCV)
-#if ASMJIT_ARCH_BITS == 0
- #undef ASMJIT_ARCH_BITS
- #if defined (__LP64__) || defined(_LP64)
- #define ASMJIT_ARCH_BITS 64
- #else
- #define ASMJIT_ARCH_BITS 32
- #endif
-#endif
-
-#if (defined(__ARMEB__)) || \
- (defined(__MIPSEB__)) || \
- (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
- #define ASMJIT_ARCH_LE 0
- #define ASMJIT_ARCH_BE 1
-#else
- #define ASMJIT_ARCH_LE 1
- #define ASMJIT_ARCH_BE 0
-#endif
-
-#if defined(ASMJIT_NO_FOREIGN)
- #if !ASMJIT_ARCH_X86 && !defined(ASMJIT_NO_X86)
- #define ASMJIT_NO_X86
- #endif
-
- #if ASMJIT_ARCH_ARM != 64 && !defined(ASMJIT_NO_AARCH64)
- #define ASMJIT_NO_AARCH64
- #endif
-#endif
-
-//! \endcond
-
-// C++ Compiler and Features Detection
-// ===================================
-
-#if defined(__GNUC__) && defined(__has_attribute)
- #define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (__has_attribute(NAME))
-#else
- #define ASMJIT_CXX_HAS_ATTRIBUTE(NAME, CHECK) (!(!(CHECK)))
-#endif // !ASMJIT_CXX_HAS_ATTRIBUTE
-
-// API Decorators & C++ Extensions
-// ===============================
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! \def ASMJIT_API
-//!
-//! A decorator that is used to decorate API that AsmJit exports when built as a shared library.
-
-//! \def ASMJIT_VIRTAPI
-//!
-//! This is basically a workaround. When using MSVC and marking class as DLL export everything gets exported, which
-//! is unwanted in most projects. MSVC automatically exports typeinfo and vtable if at least one symbol of the class
-//! is exported. However, GCC has some strange behavior that even if one or more symbol is exported it doesn't export
-//! typeinfo unless the class itself is decorated with "visibility(default)" (i.e. ASMJIT_API).
-
-//! \def ASMJIT_FORCE_INLINE
-//!
-//! Decorator to force inlining of functions, uses either `__attribute__((__always_inline__))` or __forceinline,
-//! depending on C++ compiler.
-
-//! \def ASMJIT_INLINE_NODEBUG
-//!
-//! Like \ref ASMJIT_FORCE_INLINE, but uses additionally `__nodebug__` or `__artificial__` attribute to make the
-//! debugging of some AsmJit functions easier, especially getters and one-line abstractions where usually you don't
-//! want to step in.
-
-//! \def ASMJIT_NOINLINE
-//!
-//! Decorator to avoid inlining of functions, uses either `__attribute__((__noinline__))` or `__declspec(noinline)`
-//! depending on C++ compiler.
-
-//! \def ASMJIT_NORETURN
-//!
-//! Decorator that marks functions that should never return. Typically used to implement assertion handlers that
-//! terminate, so the function never returns.
-
-//! \def ASMJIT_CDECL
-//!
-//! CDECL function attribute - either `__attribute__((__cdecl__))` or `__cdecl`.
-
-//! \def ASMJIT_STDCALL
-//!
-//! STDCALL function attribute - either `__attribute__((__stdcall__))` or `__stdcall`.
-//!
-//! \note This expands to nothing on non-x86 targets as STDCALL is X86 specific.
-
-//! \def ASMJIT_FASTCALL
-//!
-//! FASTCALL function attribute - either `__attribute__((__fastcall__))` or `__fastcall`.
-//!
-//! \note Expands to nothing on non-x86 targets as FASTCALL is X86 specific.
-
-//! \def ASMJIT_REGPARM(N)
-//!
-//! Expands to `__attribute__((__regparm__(N)))` when compiled by GCC or clang, nothing otherwise.
-
-//! \def ASMJIT_VECTORCALL
-//!
-//! VECTORCALL function attribute - either `__attribute__((__vectorcall__))` or `__vectorcall`.
-//!
-//! \note Expands to nothing on non-x86 targets as VECTORCALL is X86 specific.
-
-//! \}
-
-// API (Export / Import).
-#if !defined(ASMJIT_STATIC)
- #if defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__))
- #ifdef ASMJIT_EXPORTS
- #define ASMJIT_API __declspec(dllexport)
- #else
- #define ASMJIT_API __declspec(dllimport)
- #endif
- #elif defined(_WIN32) && defined(__GNUC__)
- #ifdef ASMJIT_EXPORTS
- #define ASMJIT_API __attribute__((__dllexport__))
- #else
- #define ASMJIT_API __attribute__((__dllimport__))
- #endif
- #elif defined(__GNUC__)
- #define ASMJIT_API __attribute__((__visibility__("default")))
- #endif
-#endif
-
-#if !defined(ASMJIT_API)
- #define ASMJIT_API
-#endif
-
-#if !defined(ASMJIT_VARAPI)
- #define ASMJIT_VARAPI extern ASMJIT_API
-#endif
-
-#if defined(__GNUC__) && !defined(_WIN32)
- #define ASMJIT_VIRTAPI ASMJIT_API
-#else
- #define ASMJIT_VIRTAPI
-#endif
-
-// Function attributes.
-#if !defined(ASMJIT_BUILD_DEBUG) && defined(__GNUC__)
- #define ASMJIT_FORCE_INLINE inline __attribute__((__always_inline__))
-#elif !defined(ASMJIT_BUILD_DEBUG) && defined(_MSC_VER)
- #define ASMJIT_FORCE_INLINE __forceinline
-#else
- #define ASMJIT_FORCE_INLINE inline
-#endif
-
-
-#if defined(__clang__)
- #define ASMJIT_INLINE_NODEBUG inline __attribute__((__always_inline__, __nodebug__))
-#elif defined(__GNUC__)
- #define ASMJIT_INLINE_NODEBUG inline __attribute__((__always_inline__, __artificial__))
-#else
- #define ASMJIT_INLINE_NODEBUG inline
-#endif
-
-#if defined(__GNUC__)
- #define ASMJIT_NOINLINE __attribute__((__noinline__))
- #define ASMJIT_NORETURN __attribute__((__noreturn__))
-#elif defined(_MSC_VER)
- #define ASMJIT_NOINLINE __declspec(noinline)
- #define ASMJIT_NORETURN __declspec(noreturn)
-#else
- #define ASMJIT_NOINLINE
- #define ASMJIT_NORETURN
-#endif
-
-// Calling conventions.
-#if ASMJIT_ARCH_X86 == 32 && defined(__GNUC__)
- #define ASMJIT_CDECL __attribute__((__cdecl__))
- #define ASMJIT_STDCALL __attribute__((__stdcall__))
- #define ASMJIT_FASTCALL __attribute__((__fastcall__))
- #define ASMJIT_REGPARM(N) __attribute__((__regparm__(N)))
-#elif ASMJIT_ARCH_X86 == 32 && defined(_MSC_VER)
- #define ASMJIT_CDECL __cdecl
- #define ASMJIT_STDCALL __stdcall
- #define ASMJIT_FASTCALL __fastcall
- #define ASMJIT_REGPARM(N)
-#else
- #define ASMJIT_CDECL
- #define ASMJIT_STDCALL
- #define ASMJIT_FASTCALL
- #define ASMJIT_REGPARM(N)
-#endif
-
-#if ASMJIT_ARCH_X86 && defined(_WIN32) && defined(_MSC_VER)
- #define ASMJIT_VECTORCALL __vectorcall
-#elif ASMJIT_ARCH_X86 && defined(_WIN32)
- #define ASMJIT_VECTORCALL __attribute__((__vectorcall__))
-#else
- #define ASMJIT_VECTORCALL
-#endif
-
-// Type alignment (not allowed by C++11 'alignas' keyword).
-#if defined(__GNUC__)
- #define ASMJIT_ALIGN_TYPE(TYPE, N) __attribute__((__aligned__(N))) TYPE
-#elif defined(_MSC_VER)
- #define ASMJIT_ALIGN_TYPE(TYPE, N) __declspec(align(N)) TYPE
-#else
- #define ASMJIT_ALIGN_TYPE(TYPE, N) TYPE
-#endif
-
-//! \def ASMJIT_MAY_ALIAS
-//!
-//! Expands to `__attribute__((__may_alias__))` if supported.
-#if defined(__GNUC__)
- #define ASMJIT_MAY_ALIAS __attribute__((__may_alias__))
-#else
- #define ASMJIT_MAY_ALIAS
-#endif
-
-//! \def ASMJIT_MAYBE_UNUSED
-//!
-//! Expands to `[[maybe_unused]]` if supported or a compiler attribute instead.
-#if __cplusplus >= 201703L
- #define ASMJIT_MAYBE_UNUSED [[maybe_unused]]
-#elif defined(__GNUC__)
- #define ASMJIT_MAYBE_UNUSED __attribute__((unused))
-#else
- #define ASMJIT_MAYBE_UNUSED
-#endif
-
-#if defined(__clang_major__) && __clang_major__ >= 4 && !defined(_DOXYGEN)
- // NOTE: Clang allows to apply this attribute to function arguments, which is what we want. Once GCC decides to
- // support this use, we will enable it for GCC as well. However, until that, it will be clang only, which is
- // what we need for static analysis.
- #define ASMJIT_NONNULL(FUNCTION_ARGUMENT) FUNCTION_ARGUMENT __attribute__((__nonnull__))
-#else
- #define ASMJIT_NONNULL(FUNCTION_ARGUMENT) FUNCTION_ARGUMENT
-#endif
-
-//! \def ASMJIT_NOEXCEPT_TYPE
-//!
-//! Defined to `noexcept` in C++17 mode or nothing otherwise. Used by function typedefs.
-#if __cplusplus >= 201703L
- #define ASMJIT_NOEXCEPT_TYPE noexcept
-#else
- #define ASMJIT_NOEXCEPT_TYPE
-#endif
-
-//! \def ASMJIT_ASSUME(...)
-//!
-//! Macro that tells the C/C++ compiler that the expression `...` evaluates to true.
-//!
-//! This macro has two purposes:
-//!
-//! 1. Enable optimizations that would not be possible without the assumption.
-//! 2. Hint static analysis tools that a certain condition is true to prevent false positives.
-#if defined(__clang__)
- #define ASMJIT_ASSUME(...) __builtin_assume(__VA_ARGS__)
-#elif defined(__GNUC__)
- #define ASMJIT_ASSUME(...) do { if (!(__VA_ARGS__)) __builtin_unreachable(); } while (0)
-#elif defined(_MSC_VER)
- #define ASMJIT_ASSUME(...) __assume(__VA_ARGS__)
-#else
- #define ASMJIT_ASSUME(...) (void)0
-#endif
-
-//! \def ASMJIT_LIKELY(...)
-//!
-//! Condition is likely to be taken (mostly error handling and edge cases).
-
-//! \def ASMJIT_UNLIKELY(...)
-//!
-//! Condition is unlikely to be taken (mostly error handling and edge cases).
-#if defined(__GNUC__)
- #define ASMJIT_LIKELY(...) __builtin_expect(!!(__VA_ARGS__), 1)
- #define ASMJIT_UNLIKELY(...) __builtin_expect(!!(__VA_ARGS__), 0)
-#else
- #define ASMJIT_LIKELY(...) (__VA_ARGS__)
- #define ASMJIT_UNLIKELY(...) (__VA_ARGS__)
-#endif
-
-//! \def ASMJIT_FALLTHROUGH
-//!
-//! Portable [[fallthrough]] attribute.
-#if defined(__clang__) && __cplusplus >= 201103L
- #define ASMJIT_FALLTHROUGH [[clang::fallthrough]]
-#elif defined(__GNUC__) && __GNUC__ >= 7
- #define ASMJIT_FALLTHROUGH __attribute__((__fallthrough__))
-#else
- #define ASMJIT_FALLTHROUGH ((void)0) /* fallthrough */
-#endif
-
-//! \def ASMJIT_DEPRECATED
-//!
-//! Marks function, class, struct, enum, or anything else as deprecated.
-#if defined(__GNUC__)
- #define ASMJIT_DEPRECATED(MESSAGE) __attribute__((__deprecated__(MESSAGE)))
-#elif defined(_MSC_VER)
- #define ASMJIT_DEPRECATED(MESSAGE) __declspec(deprecated(MESSAGE))
-#else
- #define ASMJIT_DEPRECATED(MESSAGE)
-#endif
-
-// Utilities.
-#define ASMJIT_OFFSET_OF(STRUCT, MEMBER) ((int)(intptr_t)((const char*)&((const STRUCT*)0x100)->MEMBER) - 0x100)
-#define ASMJIT_ARRAY_SIZE(X) uint32_t(sizeof(X) / sizeof(X[0]))
-
-#if ASMJIT_CXX_HAS_ATTRIBUTE(no_sanitize, 0)
- #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize__("undefined")))
-#elif defined(__GNUC__) && __GNUC__ >= 5
- #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF __attribute__((__no_sanitize_undefined__))
-#else
- #define ASMJIT_ATTRIBUTE_NO_SANITIZE_UNDEF
-#endif
-
-// Diagnostic Macros
-// ======================================
-
-#if !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(_DOXYGEN)
- #if defined(__GNUC__) && __GNUC__ == 4
- // There is a bug in GCC 4.X that has been fixed in GCC 5+, so just silence the warning.
- #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
- _Pragma("GCC diagnostic push") \
- _Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"")
- #define ASMJIT_END_DIAGNOSTIC_SCOPE \
- _Pragma("GCC diagnostic pop")
- #elif defined(_MSC_VER)
- #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
- __pragma(warning(push)) \
- __pragma(warning(disable: 4127)) /* conditional expression is const */ \
- __pragma(warning(disable: 4201)) /* nameless struct/union */
- #define ASMJIT_END_DIAGNOSTIC_SCOPE \
- __pragma(warning(pop))
- #endif
-#endif
-
-#if !defined(ASMJIT_BEGIN_DIAGNOSTIC_SCOPE) && !defined(ASMJIT_END_DIAGNOSTIC_SCOPE)
- #define ASMJIT_BEGIN_DIAGNOSTIC_SCOPE
- #define ASMJIT_END_DIAGNOSTIC_SCOPE
-#endif
-
-// Begin-Namespace & End-Namespace Macros
-// ======================================
-
-#if !defined(ASMJIT_NO_ABI_NAMESPACE) && !defined(_DOXYGEN)
- #define ASMJIT_BEGIN_NAMESPACE \
- ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
- namespace asmjit { \
- inline namespace ASMJIT_ABI_NAMESPACE {
- #define ASMJIT_END_NAMESPACE \
- }} \
- ASMJIT_END_DIAGNOSTIC_SCOPE
-#else
- #define ASMJIT_BEGIN_NAMESPACE \
- ASMJIT_BEGIN_DIAGNOSTIC_SCOPE \
- namespace asmjit {
- #define ASMJIT_END_NAMESPACE \
- } \
- ASMJIT_END_DIAGNOSTIC_SCOPE
-#endif
-
-#define ASMJIT_BEGIN_SUB_NAMESPACE(NAMESPACE) ASMJIT_BEGIN_NAMESPACE namespace NAMESPACE {
-#define ASMJIT_END_SUB_NAMESPACE } ASMJIT_END_NAMESPACE
-
-// C++ Utilities
-// =============
-
-#define ASMJIT_NONCOPYABLE(Type) \
- Type(const Type& other) = delete; \
- Type& operator=(const Type& other) = delete;
-
-#define ASMJIT_NONCONSTRUCTIBLE(Type) \
- Type() = delete; \
- Type(const Type& other) = delete; \
- Type& operator=(const Type& other) = delete;
-
-//! \def ASMJIT_DEFINE_ENUM_FLAGS(T)
-//!
-//! Defines bit operations for enumeration flags.
-#ifdef _DOXYGEN
- #define ASMJIT_DEFINE_ENUM_FLAGS(T)
-#else
- #define ASMJIT_DEFINE_ENUM_FLAGS(T) \
- static ASMJIT_INLINE_NODEBUG constexpr T operator~(T a) noexcept { \
- return T(~(std::underlying_type<T>::type)(a)); \
- } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr T operator|(T a, T b) noexcept { \
- return T((std::underlying_type<T>::type)(a) | \
- (std::underlying_type<T>::type)(b)); \
- } \
- static ASMJIT_INLINE_NODEBUG constexpr T operator&(T a, T b) noexcept { \
- return T((std::underlying_type<T>::type)(a) & \
- (std::underlying_type<T>::type)(b)); \
- } \
- static ASMJIT_INLINE_NODEBUG constexpr T operator^(T a, T b) noexcept { \
- return T((std::underlying_type<T>::type)(a) ^ \
- (std::underlying_type<T>::type)(b)); \
- } \
- \
- static ASMJIT_INLINE_NODEBUG T& operator|=(T& a, T b) noexcept { \
- a = T((std::underlying_type<T>::type)(a) | \
- (std::underlying_type<T>::type)(b)); \
- return a; \
- } \
- static ASMJIT_INLINE_NODEBUG T& operator&=(T& a, T b) noexcept { \
- a = T((std::underlying_type<T>::type)(a) & \
- (std::underlying_type<T>::type)(b)); \
- return a; \
- } \
- static ASMJIT_INLINE_NODEBUG T& operator^=(T& a, T b) noexcept { \
- a = T((std::underlying_type<T>::type)(a) ^ \
- (std::underlying_type<T>::type)(b)); \
- return a; \
- }
-#endif
-
-//! \def ASMJIT_DEFINE_ENUM_COMPARE(T)
-//!
-//! Defines comparison operations for enumeration flags.
-#if defined(_DOXYGEN) || (defined(_MSC_VER) && _MSC_VER <= 1900)
- #define ASMJIT_DEFINE_ENUM_COMPARE(T)
-#else
- #define ASMJIT_DEFINE_ENUM_COMPARE(T) \
- static ASMJIT_INLINE_NODEBUG bool operator<(T a, T b) noexcept { \
- return (std::underlying_type<T>::type)(a) < (std::underlying_type<T>::type)(b); \
- } \
- static ASMJIT_INLINE_NODEBUG bool operator<=(T a, T b) noexcept { \
- return (std::underlying_type<T>::type)(a) <= (std::underlying_type<T>::type)(b); \
- } \
- static ASMJIT_INLINE_NODEBUG bool operator>(T a, T b) noexcept { \
- return (std::underlying_type<T>::type)(a) > (std::underlying_type<T>::type)(b); \
- } \
- static ASMJIT_INLINE_NODEBUG bool operator>=(T a, T b) noexcept { \
- return (std::underlying_type<T>::type)(a) >= (std::underlying_type<T>::type)(b); \
- }
-#endif
-
-#endif // ASMJIT_CORE_API_CONFIG_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/archtraits.cpp b/3rdparty/asmjit/src/asmjit/core/archtraits.cpp
deleted file mode 100644
index a15a00c048b..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/archtraits.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/archtraits.h"
-#include "../core/environment.h"
-#include "../core/misc_p.h"
-
-#if !defined(ASMJIT_NO_X86)
- #include "../x86/x86archtraits_p.h"
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- #include "../arm/a64archtraits_p.h"
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-static const constexpr ArchTraits noArchTraits = {
- // SP/FP/LR/PC.
- 0xFF, 0xFF, 0xFF, 0xFF,
-
- // Reserved,
- { 0, 0, 0 },
-
- // HW stack alignment.
- 0,
-
- // Min/Max stack offset.
- 0, 0,
-
- // ISA features [Gp, Vec, Other0, Other1].
- {{
- InstHints::kNoHints,
- InstHints::kNoHints,
- InstHints::kNoHints,
- InstHints::kNoHints
- }},
-
- // RegTypeToSignature.
- #define V(index) OperandSignature{0}
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // RegTypeToTypeId.
- #define V(index) TypeId::kVoid
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // TypeIdToRegType.
- #define V(index) RegType::kNone
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
- {
- ArchTypeNameId::kByte,
- ArchTypeNameId::kHalf,
- ArchTypeNameId::kWord,
- ArchTypeNameId::kQuad
- }
-};
-
-ASMJIT_VARAPI const ArchTraits _archTraits[uint32_t(Arch::kMaxValue) + 1] = {
- // No architecture.
- noArchTraits,
-
- // X86/X86 architectures.
-#if !defined(ASMJIT_NO_X86)
- x86::x86ArchTraits,
- x86::x64ArchTraits,
-#else
- noArchTraits,
- noArchTraits,
-#endif
-
- // RISCV32/RISCV64 architectures.
- noArchTraits,
- noArchTraits,
-
- // ARM architecture
- noArchTraits,
-
- // AArch64 architecture.
-#if !defined(ASMJIT_NO_AARCH64)
- a64::a64ArchTraits,
-#else
- noArchTraits,
-#endif
-
- // ARM/Thumb architecture.
- noArchTraits,
-
- // Reserved.
- noArchTraits,
-
- // MIPS32/MIPS64
- noArchTraits,
- noArchTraits
-};
-
-ASMJIT_FAVOR_SIZE Error ArchUtils::typeIdToRegSignature(Arch arch, TypeId typeId, TypeId* typeIdOut, OperandSignature* regSignatureOut) noexcept {
- const ArchTraits& archTraits = ArchTraits::byArch(arch);
-
- // TODO: Remove this, should never be used like this.
- // Passed RegType instead of TypeId?
- if (uint32_t(typeId) <= uint32_t(RegType::kMaxValue))
- typeId = archTraits.regTypeToTypeId(RegType(uint32_t(typeId)));
-
- if (ASMJIT_UNLIKELY(!TypeUtils::isValid(typeId)))
- return DebugUtils::errored(kErrorInvalidTypeId);
-
- // First normalize architecture dependent types.
- if (TypeUtils::isAbstract(typeId)) {
- bool is32Bit = Environment::is32Bit(arch);
- if (typeId == TypeId::kIntPtr)
- typeId = is32Bit ? TypeId::kInt32 : TypeId::kInt64;
- else
- typeId = is32Bit ? TypeId::kUInt32 : TypeId::kUInt64;
- }
-
- // Type size helps to construct all groups of registers.
- // TypeId is invalid if the size is zero.
- uint32_t size = TypeUtils::sizeOf(typeId);
- if (ASMJIT_UNLIKELY(!size))
- return DebugUtils::errored(kErrorInvalidTypeId);
-
- if (ASMJIT_UNLIKELY(typeId == TypeId::kFloat80))
- return DebugUtils::errored(kErrorInvalidUseOfF80);
-
- RegType regType = RegType::kNone;
- if (TypeUtils::isBetween(typeId, TypeId::_kBaseStart, TypeId::_kVec32Start)) {
- regType = archTraits._typeIdToRegType[uint32_t(typeId) - uint32_t(TypeId::_kBaseStart)];
- if (regType == RegType::kNone) {
- if (typeId == TypeId::kInt64 || typeId == TypeId::kUInt64)
- return DebugUtils::errored(kErrorInvalidUseOfGpq);
- else
- return DebugUtils::errored(kErrorInvalidTypeId);
- }
- }
- else {
- if (size <= 8 && archTraits._regSignature[RegType::kVec64].isValid())
- regType = RegType::kVec64;
- else if (size <= 16 && archTraits._regSignature[RegType::kVec128].isValid())
- regType = RegType::kVec128;
- else if (size == 32 && archTraits._regSignature[RegType::kVec256].isValid())
- regType = RegType::kVec256;
- else if (archTraits._regSignature[RegType::kVec512].isValid())
- regType = RegType::kVec512;
- else
- return DebugUtils::errored(kErrorInvalidTypeId);
- }
-
- *typeIdOut = typeId;
- *regSignatureOut = archTraits.regTypeToSignature(regType);
- return kErrorOk;
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/archtraits.h b/3rdparty/asmjit/src/asmjit/core/archtraits.h
deleted file mode 100644
index 9f08dea523f..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/archtraits.h
+++ /dev/null
@@ -1,293 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
-#define ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
-
-#include "../core/operand.h"
-#include "../core/support.h"
-#include "../core/type.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! Instruction set architecture (ISA).
-enum class Arch : uint8_t {
- //! Unknown or uninitialized ISA.
- kUnknown = 0,
-
- //! 32-bit X86 ISA.
- kX86 = 1,
- //! 64-bit X86 ISA also known as X64, X86_64, and AMD64.
- kX64 = 2,
-
- //! 32-bit RISC-V ISA.
- kRISCV32 = 3,
- //! 64-bit RISC-V ISA.
- kRISCV64 = 4,
-
- //! 32-bit ARM ISA (little endian).
- kARM = 5,
- //! 64-bit ARM ISA in (little endian).
- kAArch64 = 6,
- //! 32-bit ARM ISA in Thumb mode (little endian).
- kThumb = 7,
-
- // 8 is not used at the moment, even numbers are 64-bit architectures.
-
- //! 32-bit MIPS ISA in (little endian).
- kMIPS32_LE = 9,
- //! 64-bit MIPS ISA in (little endian).
- kMIPS64_LE = 10,
-
- //! 32-bit ARM ISA (big endian).
- kARM_BE = 11,
- //! 64-bit ARM ISA in (big endian).
- kAArch64_BE = 12,
- //! 32-bit ARM ISA in Thumb mode (big endian).
- kThumb_BE = 13,
-
- // 14 is not used at the moment, even numbers are 64-bit architectures.
-
- //! 32-bit MIPS ISA in (big endian).
- kMIPS32_BE = 15,
- //! 64-bit MIPS ISA in (big endian).
- kMIPS64_BE = 16,
-
- //! Maximum value of `Arch`.
- kMaxValue = kMIPS64_BE,
-
- //! Mask used by 32-bit ISAs (odd are 32-bit, even are 64-bit).
- k32BitMask = 0x01,
- //! First big-endian architecture.
- kBigEndian = kARM_BE,
-
- //! ISA detected at compile-time (ISA of the host).
- kHost =
-#if defined(_DOXYGEN)
- DETECTED_AT_COMPILE_TIME
-#else
- ASMJIT_ARCH_X86 == 32 ? kX86 :
- ASMJIT_ARCH_X86 == 64 ? kX64 :
-
- ASMJIT_ARCH_RISCV == 32 ? kRISCV32 :
- ASMJIT_ARCH_RISCV == 64 ? kRISCV64 :
-
- ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_LE ? kARM :
- ASMJIT_ARCH_ARM == 32 && ASMJIT_ARCH_BE ? kARM_BE :
- ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_LE ? kAArch64 :
- ASMJIT_ARCH_ARM == 64 && ASMJIT_ARCH_BE ? kAArch64_BE :
-
- ASMJIT_ARCH_MIPS == 32 && ASMJIT_ARCH_LE ? kMIPS32_LE :
- ASMJIT_ARCH_MIPS == 32 && ASMJIT_ARCH_BE ? kMIPS32_BE :
- ASMJIT_ARCH_MIPS == 64 && ASMJIT_ARCH_LE ? kMIPS64_LE :
- ASMJIT_ARCH_MIPS == 64 && ASMJIT_ARCH_BE ? kMIPS64_BE :
-
- kUnknown
-#endif
-};
-
-//! Sub-architecture.
-enum class SubArch : uint8_t {
- //! Unknown or uninitialized architecture sub-type.
- kUnknown = 0,
-
- //! Maximum value of `SubArch`.
- kMaxValue = kUnknown,
-
- //! Sub-architecture detected at compile-time (sub-architecture of the host).
- kHost =
-#if defined(_DOXYGEN)
- DETECTED_AT_COMPILE_TIME
-#else
- kUnknown
-#endif
-};
-
-//! Identifier used to represent names of different data types across architectures.
-enum class ArchTypeNameId : uint8_t {
- //! Describes 'db' (X86/X86_64 convention, always 8-bit quantity).
- kDB = 0,
- //! Describes 'dw' (X86/X86_64 convention, always 16-bit word).
- kDW,
- //! Describes 'dd' (X86/X86_64 convention, always 32-bit word).
- kDD,
- //! Describes 'dq' (X86/X86_64 convention, always 64-bit word).
- kDQ,
- //! Describes 'byte' (always 8-bit quantity).
- kByte,
- //! Describes 'half' (most likely 16-bit word).
- kHalf,
- //! Describes 'word' (either 16-bit or 32-bit word).
- kWord,
- //! Describes 'hword' (most likely 16-bit word).
- kHWord,
- //! Describes 'dword' (either 32-bit or 64-bit word).
- kDWord,
- //! Describes 'qword' (64-bit word).
- kQWord,
- //! Describes 'xword' (64-bit word).
- kXWord,
- //! Describes 'short' (always 16-bit word).
- kShort,
- //! Describes 'long' (most likely 32-bit word).
- kLong,
- //! Describes 'quad' (64-bit word).
- kQuad,
-
- //! Maximum value of `ArchTypeNameId`.
- kMaxValue = kQuad
-};
-
-//! Instruction feature hints for each register group provided by \ref ArchTraits.
-//!
-//! Instruction feature hints describe miscellaneous instructions provided by the architecture that can be used by
-//! register allocator to make certain things simpler - like register swaps or emitting register push/pop sequences.
-//!
-//! \remarks Instruction feature hints are only defined for register groups that can be used with \ref
-//! asmjit_compiler infrastructure. Register groups that are not managed by Compiler are not provided by
-//! \ref ArchTraits and cannot be queried.
-enum class InstHints : uint8_t {
- //! No feature hints.
- kNoHints = 0,
-
- //! Architecture supports a register swap by using a single instruction.
- kRegSwap = 0x01u,
- //! Architecture provides push/pop instructions.
- kPushPop = 0x02u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(InstHints)
-
-//! Architecture traits used by Function API and Compiler's register allocator.
-struct ArchTraits {
- //! \name Members
- //! \{
-
- //! Stack pointer register id.
- uint8_t _spRegId;
- //! Frame pointer register id.
- uint8_t _fpRegId;
- //! Link register id.
- uint8_t _linkRegId;
- //! Instruction pointer (or program counter) register id, if accessible.
- uint8_t _ipRegId;
-
- // Reserved.
- uint8_t _reserved[3];
- //! Hardware stack alignment requirement.
- uint8_t _hwStackAlignment;
-
- //! Minimum addressable offset on stack guaranteed for all instructions.
- uint32_t _minStackOffset;
- //! Maximum addressable offset on stack depending on specific instruction.
- uint32_t _maxStackOffset;
-
- //! Flags for each virtual register group.
- Support::Array<InstHints, Globals::kNumVirtGroups> _instHints;
-
- //! Maps register type into a signature, that provides group, size and can be used to construct register operands.
- Support::Array<OperandSignature, uint32_t(RegType::kMaxValue) + 1> _regSignature;
- //! Maps a register to type-id, see \ref TypeId.
- Support::Array<TypeId, uint32_t(RegType::kMaxValue) + 1> _regTypeToTypeId;
- //! Maps scalar TypeId values (from TypeId::_kIdBaseStart) to register types, see \ref TypeId.
- Support::Array<RegType, 32> _typeIdToRegType;
-
- //! Word name identifiers of 8-bit, 16-bit, 32-biit, and 64-bit quantities that appear in formatted text.
- ArchTypeNameId _typeNameIdTable[4];
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns stack pointer register id.
- ASMJIT_INLINE_NODEBUG uint32_t spRegId() const noexcept { return _spRegId; }
- //! Returns stack frame register id.
- ASMJIT_INLINE_NODEBUG uint32_t fpRegId() const noexcept { return _fpRegId; }
- //! Returns link register id, if the architecture provides it.
- ASMJIT_INLINE_NODEBUG uint32_t linkRegId() const noexcept { return _linkRegId; }
- //! Returns instruction pointer register id, if the architecture provides it.
- ASMJIT_INLINE_NODEBUG uint32_t ipRegId() const noexcept { return _ipRegId; }
-
- //! Returns a hardware stack alignment requirement.
- //!
- //! \note This is a hardware constraint. Architectures that don't constrain it would return the lowest alignment
- //! (1), however, some architectures may constrain the alignment, for example AArch64 requires 16-byte alignment.
- ASMJIT_INLINE_NODEBUG uint32_t hwStackAlignment() const noexcept { return _hwStackAlignment; }
-
- //! Tests whether the architecture provides link register, which is used across function calls. If the link
- //! register is not provided then a function call pushes the return address on stack (X86/X64).
- ASMJIT_INLINE_NODEBUG bool hasLinkReg() const noexcept { return _linkRegId != BaseReg::kIdBad; }
-
- //! Returns minimum addressable offset on stack guaranteed for all instructions.
- ASMJIT_INLINE_NODEBUG uint32_t minStackOffset() const noexcept { return _minStackOffset; }
- //! Returns maximum addressable offset on stack depending on specific instruction.
- ASMJIT_INLINE_NODEBUG uint32_t maxStackOffset() const noexcept { return _maxStackOffset; }
-
- //! Returns ISA flags of the given register `group`.
- ASMJIT_INLINE_NODEBUG InstHints instFeatureHints(RegGroup group) const noexcept { return _instHints[group]; }
- //! Tests whether the given register `group` has the given `flag` set.
- ASMJIT_INLINE_NODEBUG bool hasInstHint(RegGroup group, InstHints feature) const noexcept { return Support::test(_instHints[group], feature); }
- //! Tests whether the ISA provides register swap instruction for the given register `group`.
- ASMJIT_INLINE_NODEBUG bool hasInstRegSwap(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kRegSwap); }
- //! Tests whether the ISA provides push/pop instructions for the given register `group`.
- ASMJIT_INLINE_NODEBUG bool hasInstPushPop(RegGroup group) const noexcept { return hasInstHint(group, InstHints::kPushPop); }
-
- ASMJIT_INLINE_NODEBUG bool hasRegType(RegType type) const noexcept {
- return type <= RegType::kMaxValue && _regSignature[type].isValid();
- }
-
- //! Returns an operand signature from the given register `type` of this architecture.
- ASMJIT_INLINE_NODEBUG OperandSignature regTypeToSignature(RegType type) const noexcept { return _regSignature[type]; }
- //! Returns a register from the given register `type` of this architecture.
- ASMJIT_INLINE_NODEBUG RegGroup regTypeToGroup(RegType type) const noexcept { return _regSignature[type].regGroup(); }
- //! Returns a register size the given register `type` of this architecture.
- ASMJIT_INLINE_NODEBUG uint32_t regTypeToSize(RegType type) const noexcept { return _regSignature[type].size(); }
- //! Returns a corresponding `TypeId` from the given register `type` of this architecture.
- ASMJIT_INLINE_NODEBUG TypeId regTypeToTypeId(RegType type) const noexcept { return _regTypeToTypeId[type]; }
-
- //! Returns a table of ISA word names that appear in formatted text. Word names are ISA dependent.
- //!
- //! The index of this table is log2 of the size:
- //! - [0] 8-bits
- //! - [1] 16-bits
- //! - [2] 32-bits
- //! - [3] 64-bits
- ASMJIT_INLINE_NODEBUG const ArchTypeNameId* typeNameIdTable() const noexcept { return _typeNameIdTable; }
-
- //! Returns an ISA word name identifier of the given `index`, see \ref typeNameIdTable() for more details.
- ASMJIT_INLINE_NODEBUG ArchTypeNameId typeNameIdByIndex(uint32_t index) const noexcept { return _typeNameIdTable[index]; }
-
- //! \}
-
- //! \name Statics
- //! \{
-
- //! Returns a const reference to `ArchTraits` for the given architecture `arch`.
- static ASMJIT_INLINE_NODEBUG const ArchTraits& byArch(Arch arch) noexcept;
-
- //! \}
-};
-
-ASMJIT_VARAPI const ArchTraits _archTraits[uint32_t(Arch::kMaxValue) + 1];
-
-//! \cond
-ASMJIT_INLINE_NODEBUG const ArchTraits& ArchTraits::byArch(Arch arch) noexcept { return _archTraits[uint32_t(arch)]; }
-//! \endcond
-
-//! Architecture utilities.
-namespace ArchUtils {
-
-ASMJIT_API Error typeIdToRegSignature(Arch arch, TypeId typeId, TypeId* typeIdOut, OperandSignature* regSignatureOut) noexcept;
-
-} // {ArchUtils}
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ARCHTRAITS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/assembler.cpp b/3rdparty/asmjit/src/asmjit/core/assembler.cpp
deleted file mode 100644
index d6c87627ec4..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/assembler.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/assembler.h"
-#include "../core/codewriter_p.h"
-#include "../core/constpool.h"
-#include "../core/emitterutils_p.h"
-#include "../core/formatter.h"
-#include "../core/logger.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// BaseAssembler - Construction & Destruction
-// ==========================================
-
-BaseAssembler::BaseAssembler() noexcept
- : BaseEmitter(EmitterType::kAssembler) {}
-
-BaseAssembler::~BaseAssembler() noexcept {}
-
-// BaseAssembler - Buffer Management
-// =================================
-
-Error BaseAssembler::setOffset(size_t offset) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- size_t size = Support::max<size_t>(_section->bufferSize(), this->offset());
- if (ASMJIT_UNLIKELY(offset > size))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- _bufferPtr = _bufferData + offset;
- return kErrorOk;
-}
-
-// BaseAssembler - Section Management
-// ==================================
-
-static void BaseAssembler_initSection(BaseAssembler* self, Section* section) noexcept {
- uint8_t* p = section->_buffer._data;
-
- self->_section = section;
- self->_bufferData = p;
- self->_bufferPtr = p + section->_buffer._size;
- self->_bufferEnd = p + section->_buffer._capacity;
-}
-
-Error BaseAssembler::section(Section* section) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- if (!_code->isSectionValid(section->id()) || _code->_sections[section->id()] != section)
- return reportError(DebugUtils::errored(kErrorInvalidSection));
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- _logger->logf(".section %s {#%u}\n", section->name(), section->id());
-#endif
-
- BaseAssembler_initSection(this, section);
- return kErrorOk;
-}
-
-// BaseAssembler - Label Management
-// ================================
-
-Label BaseAssembler::newLabel() {
- uint32_t labelId = Globals::kInvalidId;
- if (ASMJIT_LIKELY(_code)) {
- LabelEntry* le;
- Error err = _code->newLabelEntry(&le);
- if (ASMJIT_UNLIKELY(err))
- reportError(err);
- else
- labelId = le->id();
- }
- return Label(labelId);
-}
-
-Label BaseAssembler::newNamedLabel(const char* name, size_t nameSize, LabelType type, uint32_t parentId) {
- uint32_t labelId = Globals::kInvalidId;
- if (ASMJIT_LIKELY(_code)) {
- LabelEntry* le;
- Error err = _code->newNamedLabelEntry(&le, name, nameSize, type, parentId);
- if (ASMJIT_UNLIKELY(err))
- reportError(err);
- else
- labelId = le->id();
- }
- return Label(labelId);
-}
-
-Error BaseAssembler::bind(const Label& label) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- Error err = _code->bindLabel(label, _section->id(), offset());
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- EmitterUtils::logLabelBound(this, label);
-#endif
-
- resetInlineComment();
- if (err)
- return reportError(err);
-
- return kErrorOk;
-}
-
-// BaseAssembler - Embed
-// =====================
-
-Error BaseAssembler::embed(const void* data, size_t dataSize) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- if (dataSize == 0)
- return kErrorOk;
-
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, dataSize));
-
- writer.emitData(data, dataSize);
- writer.done(this);
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- StringTmp<512> sb;
- Formatter::formatData(sb, _logger->flags(), arch(), TypeId::kUInt8, data, dataSize, 1);
- sb.append('\n');
- _logger->log(sb);
- }
-#endif
-
- return kErrorOk;
-}
-
-Error BaseAssembler::embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) {
- uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize());
- TypeId finalTypeId = TypeUtils::deabstract(typeId, deabstractDelta);
-
- if (ASMJIT_UNLIKELY(!TypeUtils::isValid(finalTypeId)))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (itemCount == 0 || repeatCount == 0)
- return kErrorOk;
-
- uint32_t typeSize = TypeUtils::sizeOf(finalTypeId);
- Support::FastUInt8 of = 0;
-
- size_t dataSize = Support::mulOverflow(itemCount, size_t(typeSize), &of);
- size_t totalSize = Support::mulOverflow(dataSize, repeatCount, &of);
-
- if (ASMJIT_UNLIKELY(of))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, totalSize));
-
- for (size_t i = 0; i < repeatCount; i++)
- writer.emitData(data, dataSize);
-
- writer.done(this);
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- StringTmp<512> sb;
- Formatter::formatData(sb, _logger->flags(), arch(), typeId, data, itemCount, repeatCount);
- sb.append('\n');
- _logger->log(sb);
- }
-#endif
-
- return kErrorOk;
-}
-
-#ifndef ASMJIT_NO_LOGGING
-static const TypeId dataTypeIdBySize[9] = {
- TypeId::kVoid, // [0] (invalid)
- TypeId::kUInt8, // [1] (uint8_t)
- TypeId::kUInt16, // [2] (uint16_t)
- TypeId::kVoid, // [3] (invalid)
- TypeId::kUInt32, // [4] (uint32_t)
- TypeId::kVoid, // [5] (invalid)
- TypeId::kVoid, // [6] (invalid)
- TypeId::kVoid, // [7] (invalid)
- TypeId::kUInt64 // [8] (uint64_t)
-};
-#endif
-
-Error BaseAssembler::embedConstPool(const Label& label, const ConstPool& pool) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- if (ASMJIT_UNLIKELY(!isLabelValid(label)))
- return reportError(DebugUtils::errored(kErrorInvalidLabel));
-
- ASMJIT_PROPAGATE(align(AlignMode::kData, uint32_t(pool.alignment())));
- ASMJIT_PROPAGATE(bind(label));
-
- size_t size = pool.size();
- if (!size)
- return kErrorOk;
-
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, size));
-
-#ifndef ASMJIT_NO_LOGGING
- uint8_t* data = writer.cursor();
-#endif
-
- pool.fill(writer.cursor());
- writer.advance(size);
- writer.done(this);
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- uint32_t dataSizeLog2 = Support::min<uint32_t>(Support::ctz(pool.minItemSize()), 3);
- uint32_t dataSize = 1 << dataSizeLog2;
-
- StringTmp<512> sb;
- Formatter::formatData(sb, _logger->flags(), arch(), dataTypeIdBySize[dataSize], data, size >> dataSizeLog2);
- sb.append('\n');
- _logger->log(sb);
- }
-#endif
-
- return kErrorOk;
-}
-
-Error BaseAssembler::embedLabel(const Label& label, size_t dataSize) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- ASMJIT_ASSERT(_code != nullptr);
- RelocEntry* re;
- LabelEntry* le = _code->labelEntry(label);
-
- if (ASMJIT_UNLIKELY(!le))
- return reportError(DebugUtils::errored(kErrorInvalidLabel));
-
- if (dataSize == 0)
- dataSize = registerSize();
-
- if (ASMJIT_UNLIKELY(!Support::isPowerOf2(dataSize) || dataSize > 8))
- return reportError(DebugUtils::errored(kErrorInvalidOperandSize));
-
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, dataSize));
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- StringTmp<256> sb;
- sb.append('.');
- Formatter::formatDataType(sb, _logger->flags(), arch(), dataTypeIdBySize[dataSize]);
- sb.append(' ');
- Formatter::formatLabel(sb, FormatFlags::kNone, this, label.id());
- sb.append('\n');
- _logger->log(sb);
- }
-#endif
-
- Error err = _code->newRelocEntry(&re, RelocType::kRelToAbs);
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- re->_sourceSectionId = _section->id();
- re->_sourceOffset = offset();
- re->_format.resetToSimpleValue(OffsetType::kUnsignedOffset, dataSize);
-
- if (le->isBound()) {
- re->_targetSectionId = le->section()->id();
- re->_payload = le->offset();
- }
- else {
- OffsetFormat of;
- of.resetToSimpleValue(OffsetType::kUnsignedOffset, dataSize);
-
- LabelLink* link = _code->newLabelLink(le, _section->id(), offset(), 0, of);
- if (ASMJIT_UNLIKELY(!link))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- link->relocId = re->id();
- }
-
- // Emit dummy DWORD/QWORD depending on the data size.
- writer.emitZeros(dataSize);
- writer.done(this);
-
- return kErrorOk;
-}
-
-Error BaseAssembler::embedLabelDelta(const Label& label, const Label& base, size_t dataSize) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- LabelEntry* labelEntry = _code->labelEntry(label);
- LabelEntry* baseEntry = _code->labelEntry(base);
-
- if (ASMJIT_UNLIKELY(!labelEntry || !baseEntry))
- return reportError(DebugUtils::errored(kErrorInvalidLabel));
-
- if (dataSize == 0)
- dataSize = registerSize();
-
- if (ASMJIT_UNLIKELY(!Support::isPowerOf2(dataSize) || dataSize > 8))
- return reportError(DebugUtils::errored(kErrorInvalidOperandSize));
-
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, dataSize));
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- StringTmp<256> sb;
- sb.append('.');
- Formatter::formatDataType(sb, _logger->flags(), arch(), dataTypeIdBySize[dataSize]);
- sb.append(" (");
- Formatter::formatLabel(sb, FormatFlags::kNone, this, label.id());
- sb.append(" - ");
- Formatter::formatLabel(sb, FormatFlags::kNone, this, base.id());
- sb.append(")\n");
- _logger->log(sb);
- }
-#endif
-
- // If both labels are bound within the same section it means the delta can be calculated now.
- if (labelEntry->isBound() && baseEntry->isBound() && labelEntry->section() == baseEntry->section()) {
- uint64_t delta = labelEntry->offset() - baseEntry->offset();
- writer.emitValueLE(delta, dataSize);
- }
- else {
- RelocEntry* re;
- Error err = _code->newRelocEntry(&re, RelocType::kExpression);
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- Expression* exp = _code->_zone.newT<Expression>();
- if (ASMJIT_UNLIKELY(!exp))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- exp->reset();
- exp->opType = ExpressionOpType::kSub;
- exp->setValueAsLabel(0, labelEntry);
- exp->setValueAsLabel(1, baseEntry);
-
- re->_format.resetToSimpleValue(OffsetType::kSignedOffset, dataSize);
- re->_sourceSectionId = _section->id();
- re->_sourceOffset = offset();
- re->_payload = (uint64_t)(uintptr_t)exp;
-
- writer.emitZeros(dataSize);
- }
-
- writer.done(this);
- return kErrorOk;
-}
-
-// BaseAssembler - Comment
-// =======================
-
-Error BaseAssembler::comment(const char* data, size_t size) {
- if (!hasEmitterFlag(EmitterFlags::kLogComments)) {
- if (!hasEmitterFlag(EmitterFlags::kAttached))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
- return kErrorOk;
- }
-
-#ifndef ASMJIT_NO_LOGGING
- // Logger cannot be NULL if `EmitterFlags::kLogComments` is set.
- ASMJIT_ASSERT(_logger != nullptr);
-
- _logger->log(data, size);
- _logger->log("\n", 1);
- return kErrorOk;
-#else
- DebugUtils::unused(data, size);
- return kErrorOk;
-#endif
-}
-
-// BaseAssembler - Events
-// ======================
-
-Error BaseAssembler::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- // Attach to the end of the .text section.
- BaseAssembler_initSection(this, code->_sections[0]);
-
- return kErrorOk;
-}
-
-Error BaseAssembler::onDetach(CodeHolder* code) noexcept {
- _section = nullptr;
- _bufferData = nullptr;
- _bufferEnd = nullptr;
- _bufferPtr = nullptr;
- return Base::onDetach(code);
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/assembler.h b/3rdparty/asmjit/src/asmjit/core/assembler.h
deleted file mode 100644
index d53d9e53764..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/assembler.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ASSEMBLER_H_INCLUDED
-#define ASMJIT_CORE_ASSEMBLER_H_INCLUDED
-
-#include "../core/codeholder.h"
-#include "../core/emitter.h"
-#include "../core/operand.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_assembler
-//! \{
-
-//! Base assembler.
-//!
-//! This is a base class that provides interface used by architecture specific
-//! assembler implementations. Assembler doesn't hold any data, instead it's
-//! attached to \ref CodeHolder, which provides all the data that Assembler
-//! needs and which can be altered by it.
-//!
-//! Check out architecture specific assemblers for more details and examples:
-//!
-//! - \ref x86::Assembler - X86/X64 assembler implementation.
-//! - \ref a64::Assembler - AArch64 assembler implementation.
-class ASMJIT_VIRTAPI BaseAssembler : public BaseEmitter {
-public:
- ASMJIT_NONCOPYABLE(BaseAssembler)
- typedef BaseEmitter Base;
-
- //! Current section where the assembling happens.
- Section* _section = nullptr;
- //! Start of the CodeBuffer of the current section.
- uint8_t* _bufferData = nullptr;
- //! End (first invalid byte) of the current section.
- uint8_t* _bufferEnd = nullptr;
- //! Pointer in the CodeBuffer of the current section.
- uint8_t* _bufferPtr = nullptr;
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `BaseAssembler` instance.
- ASMJIT_API BaseAssembler() noexcept;
- //! Destroys the `BaseAssembler` instance.
- ASMJIT_API ~BaseAssembler() noexcept override;
-
- //! \}
-
- //! \name Code-Buffer Management
- //! \{
-
- //! Returns the capacity of the current CodeBuffer.
- ASMJIT_INLINE_NODEBUG size_t bufferCapacity() const noexcept { return (size_t)(_bufferEnd - _bufferData); }
- //! Returns the number of remaining bytes in the current CodeBuffer.
- ASMJIT_INLINE_NODEBUG size_t remainingSpace() const noexcept { return (size_t)(_bufferEnd - _bufferPtr); }
-
- //! Returns the current position in the CodeBuffer.
- ASMJIT_INLINE_NODEBUG size_t offset() const noexcept { return (size_t)(_bufferPtr - _bufferData); }
-
- //! Sets the current position in the CodeBuffer to `offset`.
- //!
- //! \note The `offset` cannot be greater than buffer size even if it's
- //! within the buffer's capacity.
- ASMJIT_API Error setOffset(size_t offset);
-
- //! Returns the start of the CodeBuffer in the current section.
- ASMJIT_INLINE_NODEBUG uint8_t* bufferData() const noexcept { return _bufferData; }
- //! Returns the end (first invalid byte) in the current section.
- ASMJIT_INLINE_NODEBUG uint8_t* bufferEnd() const noexcept { return _bufferEnd; }
- //! Returns the current pointer in the CodeBuffer in the current section.
- ASMJIT_INLINE_NODEBUG uint8_t* bufferPtr() const noexcept { return _bufferPtr; }
-
- //! \}
-
- //! \name Section Management
- //! \{
-
- //! Returns the current section.
- ASMJIT_INLINE_NODEBUG Section* currentSection() const noexcept { return _section; }
-
- ASMJIT_API Error section(Section* section) override;
-
- //! \}
-
- //! \name Label Management
- //! \{
-
- ASMJIT_API Label newLabel() override;
- ASMJIT_API Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId) override;
- ASMJIT_API Error bind(const Label& label) override;
-
- //! \}
-
- //! \name Embed
- //! \{
-
- ASMJIT_API Error embed(const void* data, size_t dataSize) override;
- ASMJIT_API Error embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1) override;
- ASMJIT_API Error embedConstPool(const Label& label, const ConstPool& pool) override;
-
- ASMJIT_API Error embedLabel(const Label& label, size_t dataSize = 0) override;
- ASMJIT_API Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0) override;
-
- //! \}
-
- //! \name Comment
- //! \{
-
- ASMJIT_API Error comment(const char* data, size_t size = SIZE_MAX) override;
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/builder.cpp b/3rdparty/asmjit/src/asmjit/core/builder.cpp
deleted file mode 100644
index 25433b9a0d8..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/builder.cpp
+++ /dev/null
@@ -1,897 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_BUILDER
-
-#include "../core/builder.h"
-#include "../core/emitterutils_p.h"
-#include "../core/errorhandler.h"
-#include "../core/formatter.h"
-#include "../core/logger.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// PostponedErrorHandler (Internal)
-// ================================
-
-//! Postponed error handler that never throws. Used as a temporal error handler
-//! to run passes. If error occurs, the caller is notified and will call the
-//! real error handler, that can throw.
-class PostponedErrorHandler : public ErrorHandler {
-public:
- void handleError(Error err, const char* message, BaseEmitter* origin) override {
- DebugUtils::unused(err, origin);
- _message.assign(message);
- }
-
- StringTmp<128> _message;
-};
-
-// BaseBuilder - Utilities
-// =======================
-
-static void BaseBuilder_deletePasses(BaseBuilder* self) noexcept {
- for (Pass* pass : self->_passes)
- pass->~Pass();
- self->_passes.reset();
-}
-
-// BaseBuilder - Construction & Destruction
-// ========================================
-
-BaseBuilder::BaseBuilder() noexcept
- : BaseEmitter(EmitterType::kBuilder),
- _codeZone(32768 - Zone::kBlockOverhead),
- _dataZone(16384 - Zone::kBlockOverhead),
- _passZone(65536 - Zone::kBlockOverhead),
- _allocator(&_codeZone) {}
-
-BaseBuilder::~BaseBuilder() noexcept {
- BaseBuilder_deletePasses(this);
-}
-
-// BaseBuilder - Node Management
-// =============================
-
-Error BaseBuilder::newInstNode(InstNode** out, InstId instId, InstOptions instOptions, uint32_t opCount) {
- uint32_t opCapacity = InstNode::capacityOfOpCount(opCount);
- ASMJIT_ASSERT(opCapacity >= InstNode::kBaseOpCapacity);
-
- InstNode* node = _allocator.allocT<InstNode>(InstNode::nodeSizeOfOpCapacity(opCapacity));
- if (ASMJIT_UNLIKELY(!node))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- *out = new(Support::PlacementNew{node}) InstNode(this, instId, instOptions, opCount, opCapacity);
- return kErrorOk;
-}
-
-
-Error BaseBuilder::newLabelNode(LabelNode** out) {
- *out = nullptr;
-
- ASMJIT_PROPAGATE(_newNodeT<LabelNode>(out));
- return registerLabelNode(*out);
-}
-
-Error BaseBuilder::newAlignNode(AlignNode** out, AlignMode alignMode, uint32_t alignment) {
- *out = nullptr;
- return _newNodeT<AlignNode>(out, alignMode, alignment);
-}
-
-Error BaseBuilder::newEmbedDataNode(EmbedDataNode** out, TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) {
- *out = nullptr;
-
- uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize());
- TypeId finalTypeId = TypeUtils::deabstract(typeId, deabstractDelta);
-
- if (ASMJIT_UNLIKELY(!TypeUtils::isValid(finalTypeId)))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- uint32_t typeSize = TypeUtils::sizeOf(finalTypeId);
- Support::FastUInt8 of = 0;
-
- size_t dataSize = Support::mulOverflow(itemCount, size_t(typeSize), &of);
- if (ASMJIT_UNLIKELY(of))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- EmbedDataNode* node;
- ASMJIT_PROPAGATE(_newNodeT<EmbedDataNode>(&node));
-
- node->_embed._typeId = typeId;
- node->_embed._typeSize = uint8_t(typeSize);
- node->_itemCount = itemCount;
- node->_repeatCount = repeatCount;
-
- uint8_t* dstData = node->_inlineData;
- if (dataSize > EmbedDataNode::kInlineBufferSize) {
- dstData = static_cast<uint8_t*>(_dataZone.alloc(dataSize, 8));
- if (ASMJIT_UNLIKELY(!dstData))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
- node->_externalData = dstData;
- }
-
- if (data)
- memcpy(dstData, data, dataSize);
-
- *out = node;
- return kErrorOk;
-}
-
-Error BaseBuilder::newConstPoolNode(ConstPoolNode** out) {
- *out = nullptr;
-
- ASMJIT_PROPAGATE(_newNodeT<ConstPoolNode>(out));
- return registerLabelNode(*out);
-}
-
-Error BaseBuilder::newCommentNode(CommentNode** out, const char* data, size_t size) {
- *out = nullptr;
-
- if (data) {
- if (size == SIZE_MAX)
- size = strlen(data);
-
- if (size > 0) {
- data = static_cast<char*>(_dataZone.dup(data, size, true));
- if (ASMJIT_UNLIKELY(!data))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
- }
- }
-
- return _newNodeT<CommentNode>(out, data);
-}
-
-BaseNode* BaseBuilder::addNode(BaseNode* node) noexcept {
- ASMJIT_ASSERT(!node->_prev);
- ASMJIT_ASSERT(!node->_next);
- ASMJIT_ASSERT(!node->isActive());
-
- if (!_cursor) {
- if (_nodeList.empty()) {
- _nodeList.reset(node, node);
- }
- else {
- node->_next = _nodeList.first();
- _nodeList._first->_prev = node;
- _nodeList._first = node;
- }
- }
- else {
- BaseNode* prev = _cursor;
- BaseNode* next = _cursor->next();
-
- node->_prev = prev;
- node->_next = next;
-
- prev->_next = node;
- if (next)
- next->_prev = node;
- else
- _nodeList._last = node;
- }
-
- node->addFlags(NodeFlags::kIsActive);
- if (node->isSection())
- _dirtySectionLinks = true;
-
- _cursor = node;
- return node;
-}
-
-BaseNode* BaseBuilder::addAfter(BaseNode* node, BaseNode* ref) noexcept {
- ASMJIT_ASSERT(!node->_prev);
- ASMJIT_ASSERT(!node->_next);
-
- BaseNode* prev = ref;
- BaseNode* next = ref->next();
-
- node->_prev = prev;
- node->_next = next;
-
- node->addFlags(NodeFlags::kIsActive);
- if (node->isSection())
- _dirtySectionLinks = true;
-
- prev->_next = node;
- if (next)
- next->_prev = node;
- else
- _nodeList._last = node;
-
- return node;
-}
-
-BaseNode* BaseBuilder::addBefore(BaseNode* node, BaseNode* ref) noexcept {
- ASMJIT_ASSERT(!node->_prev);
- ASMJIT_ASSERT(!node->_next);
- ASMJIT_ASSERT(!node->isActive());
- ASMJIT_ASSERT(ref->isActive());
-
- BaseNode* prev = ref->prev();
- BaseNode* next = ref;
-
- node->_prev = prev;
- node->_next = next;
-
- node->addFlags(NodeFlags::kIsActive);
- if (node->isSection())
- _dirtySectionLinks = true;
-
- next->_prev = node;
- if (prev)
- prev->_next = node;
- else
- _nodeList._first = node;
-
- return node;
-}
-
-BaseNode* BaseBuilder::removeNode(BaseNode* node) noexcept {
- if (!node->isActive())
- return node;
-
- BaseNode* prev = node->prev();
- BaseNode* next = node->next();
-
- if (_nodeList._first == node)
- _nodeList._first = next;
- else
- prev->_next = next;
-
- if (_nodeList._last == node)
- _nodeList._last = prev;
- else
- next->_prev = prev;
-
- node->_prev = nullptr;
- node->_next = nullptr;
- node->clearFlags(NodeFlags::kIsActive);
- if (node->isSection())
- _dirtySectionLinks = true;
-
- if (_cursor == node)
- _cursor = prev;
-
- return node;
-}
-
-void BaseBuilder::removeNodes(BaseNode* first, BaseNode* last) noexcept {
- if (first == last) {
- removeNode(first);
- return;
- }
-
- if (!first->isActive())
- return;
-
- BaseNode* prev = first->prev();
- BaseNode* next = last->next();
-
- if (_nodeList._first == first)
- _nodeList._first = next;
- else
- prev->_next = next;
-
- if (_nodeList._last == last)
- _nodeList._last = prev;
- else
- next->_prev = prev;
-
- BaseNode* node = first;
- uint32_t didRemoveSection = false;
-
- for (;;) {
- next = node->next();
- ASMJIT_ASSERT(next != nullptr);
-
- node->_prev = nullptr;
- node->_next = nullptr;
- node->clearFlags(NodeFlags::kIsActive);
- didRemoveSection |= uint32_t(node->isSection());
-
- if (_cursor == node)
- _cursor = prev;
-
- if (node == last)
- break;
- node = next;
- }
-
- if (didRemoveSection)
- _dirtySectionLinks = true;
-}
-
-BaseNode* BaseBuilder::setCursor(BaseNode* node) noexcept {
- BaseNode* old = _cursor;
- _cursor = node;
- return old;
-}
-
-// BaseBuilder - Sections
-// ======================
-
-Error BaseBuilder::sectionNodeOf(SectionNode** out, uint32_t sectionId) {
- *out = nullptr;
-
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (ASMJIT_UNLIKELY(!_code->isSectionValid(sectionId)))
- return reportError(DebugUtils::errored(kErrorInvalidSection));
-
- if (sectionId >= _sectionNodes.size()) {
- Error err = _sectionNodes.reserve(&_allocator, sectionId + 1);
- if (ASMJIT_UNLIKELY(err != kErrorOk))
- return reportError(err);
- }
-
- SectionNode* node = nullptr;
- if (sectionId < _sectionNodes.size())
- node = _sectionNodes[sectionId];
-
- if (!node) {
- ASMJIT_PROPAGATE(_newNodeT<SectionNode>(&node, sectionId));
-
- // We have already reserved enough space, this cannot fail now.
- if (sectionId >= _sectionNodes.size())
- _sectionNodes.resize(&_allocator, sectionId + 1);
-
- _sectionNodes[sectionId] = node;
- }
-
- *out = node;
- return kErrorOk;
-}
-
-Error BaseBuilder::section(Section* section) {
- SectionNode* node;
- ASMJIT_PROPAGATE(sectionNodeOf(&node, section->id()));
- ASMJIT_ASSUME(node != nullptr);
-
- if (!node->isActive()) {
- // Insert the section at the end if it was not part of the code.
- addAfter(node, lastNode());
- _cursor = node;
- }
- else {
- // This is a bit tricky. We cache section links to make sure that
- // switching sections doesn't involve traversal in linked-list unless
- // the position of the section has changed.
- if (hasDirtySectionLinks())
- updateSectionLinks();
-
- if (node->_nextSection)
- _cursor = node->_nextSection->_prev;
- else
- _cursor = _nodeList.last();
- }
-
- return kErrorOk;
-}
-
-void BaseBuilder::updateSectionLinks() noexcept {
- if (!_dirtySectionLinks)
- return;
-
- BaseNode* node_ = _nodeList.first();
- SectionNode* currentSection = nullptr;
-
- while (node_) {
- if (node_->isSection()) {
- if (currentSection)
- currentSection->_nextSection = node_->as<SectionNode>();
- currentSection = node_->as<SectionNode>();
- }
- node_ = node_->next();
- }
-
- if (currentSection)
- currentSection->_nextSection = nullptr;
-
- _dirtySectionLinks = false;
-}
-
-// BaseBuilder - Labels
-// ====================
-
-Error BaseBuilder::labelNodeOf(LabelNode** out, uint32_t labelId) {
- *out = nullptr;
-
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- uint32_t index = labelId;
- if (ASMJIT_UNLIKELY(index >= _code->labelCount()))
- return DebugUtils::errored(kErrorInvalidLabel);
-
- if (index >= _labelNodes.size())
- ASMJIT_PROPAGATE(_labelNodes.resize(&_allocator, index + 1));
-
- LabelNode* node = _labelNodes[index];
- if (!node) {
- ASMJIT_PROPAGATE(_newNodeT<LabelNode>(&node, labelId));
- _labelNodes[index] = node;
- }
-
- *out = node;
- return kErrorOk;
-}
-
-Error BaseBuilder::registerLabelNode(LabelNode* node) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- LabelEntry* le;
- ASMJIT_PROPAGATE(_code->newLabelEntry(&le));
- uint32_t labelId = le->id();
-
- // We just added one label so it must be true.
- ASMJIT_ASSERT(_labelNodes.size() < labelId + 1);
- ASMJIT_PROPAGATE(_labelNodes.resize(&_allocator, labelId + 1));
-
- _labelNodes[labelId] = node;
- node->_labelId = labelId;
-
- return kErrorOk;
-}
-
-static Error BaseBuilder_newLabelInternal(BaseBuilder* self, uint32_t labelId) {
- ASMJIT_ASSERT(self->_labelNodes.size() < labelId + 1);
-
- uint32_t growBy = labelId - self->_labelNodes.size();
- Error err = self->_labelNodes.willGrow(&self->_allocator, growBy);
-
- if (ASMJIT_UNLIKELY(err))
- return self->reportError(err);
-
- LabelNode* node;
- ASMJIT_PROPAGATE(self->_newNodeT<LabelNode>(&node, labelId));
-
- self->_labelNodes.resize(&self->_allocator, labelId + 1);
- self->_labelNodes[labelId] = node;
- node->_labelId = labelId;
- return kErrorOk;
-}
-
-Label BaseBuilder::newLabel() {
- uint32_t labelId = Globals::kInvalidId;
- LabelEntry* le;
-
- if (_code &&
- _code->newLabelEntry(&le) == kErrorOk &&
- BaseBuilder_newLabelInternal(this, le->id()) == kErrorOk) {
- labelId = le->id();
- }
-
- return Label(labelId);
-}
-
-Label BaseBuilder::newNamedLabel(const char* name, size_t nameSize, LabelType type, uint32_t parentId) {
- uint32_t labelId = Globals::kInvalidId;
- LabelEntry* le;
-
- if (_code &&
- _code->newNamedLabelEntry(&le, name, nameSize, type, parentId) == kErrorOk &&
- BaseBuilder_newLabelInternal(this, le->id()) == kErrorOk) {
- labelId = le->id();
- }
-
- return Label(labelId);
-}
-
-Error BaseBuilder::bind(const Label& label) {
- LabelNode* node;
- ASMJIT_PROPAGATE(labelNodeOf(&node, label));
-
- addNode(node);
- return kErrorOk;
-}
-
-// BaseBuilder - Passes
-// ====================
-
-ASMJIT_FAVOR_SIZE Pass* BaseBuilder::passByName(const char* name) const noexcept {
- for (Pass* pass : _passes)
- if (strcmp(pass->name(), name) == 0)
- return pass;
- return nullptr;
-}
-
-ASMJIT_FAVOR_SIZE Error BaseBuilder::addPass(Pass* pass) noexcept {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (ASMJIT_UNLIKELY(pass == nullptr)) {
- // Since this is directly called by `addPassT()` we treat `null` argument
- // as out-of-memory condition. Otherwise it would be API misuse.
- return DebugUtils::errored(kErrorOutOfMemory);
- }
- else if (ASMJIT_UNLIKELY(pass->_cb)) {
- // Kinda weird, but okay...
- if (pass->_cb == this)
- return kErrorOk;
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- ASMJIT_PROPAGATE(_passes.append(&_allocator, pass));
- pass->_cb = this;
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error BaseBuilder::deletePass(Pass* pass) noexcept {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (ASMJIT_UNLIKELY(pass == nullptr))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- if (pass->_cb != nullptr) {
- if (pass->_cb != this)
- return DebugUtils::errored(kErrorInvalidState);
-
- uint32_t index = _passes.indexOf(pass);
- ASMJIT_ASSERT(index != Globals::kNotFound);
-
- pass->_cb = nullptr;
- _passes.removeAt(index);
- }
-
- pass->~Pass();
- return kErrorOk;
-}
-
-Error BaseBuilder::runPasses() {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (_passes.empty())
- return kErrorOk;
-
- ErrorHandler* prev = errorHandler();
- PostponedErrorHandler postponed;
-
- Error err = kErrorOk;
- setErrorHandler(&postponed);
-
- for (Pass* pass : _passes) {
- _passZone.reset();
- err = pass->run(&_passZone, _logger);
- if (err)
- break;
- }
- _passZone.reset();
- setErrorHandler(prev);
-
- if (ASMJIT_UNLIKELY(err))
- return reportError(err, !postponed._message.empty() ? postponed._message.data() : nullptr);
-
- return kErrorOk;
-}
-
-// BaseBuilder - Emit
-// ==================
-
-Error BaseBuilder::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
- uint32_t opCount = EmitterUtils::opCountFromEmitArgs(o0, o1, o2, opExt);
- InstOptions options = instOptions() | forcedInstOptions();
-
- if (Support::test(options, InstOptions::kReserved)) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
-#ifndef ASMJIT_NO_VALIDATION
- // Strict validation.
- if (hasDiagnosticOption(DiagnosticOptions::kValidateIntermediate)) {
- Operand_ opArray[Globals::kMaxOpCount];
- EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
-
- ValidationFlags validationFlags = isCompiler() ? ValidationFlags::kEnableVirtRegs : ValidationFlags::kNone;
- Error err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, opCount, validationFlags);
-
- if (ASMJIT_UNLIKELY(err)) {
-#ifndef ASMJIT_NO_LOGGING
- return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
-#else
- resetState();
- return reportError(err);
-#endif
- }
- }
-#endif
-
- // Clear instruction options that should never be part of a regular instruction.
- options &= ~InstOptions::kReserved;
- }
-
- uint32_t opCapacity = InstNode::capacityOfOpCount(opCount);
- ASMJIT_ASSERT(opCapacity >= InstNode::kBaseOpCapacity);
-
- InstNode* node = _allocator.allocT<InstNode>(InstNode::nodeSizeOfOpCapacity(opCapacity));
- const char* comment = inlineComment();
-
- resetInstOptions();
- resetInlineComment();
-
- if (ASMJIT_UNLIKELY(!node)) {
- resetExtraReg();
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
- }
-
- node = new(Support::PlacementNew{node}) InstNode(this, instId, options, opCount, opCapacity);
- node->setExtraReg(extraReg());
- node->setOp(0, o0);
- node->setOp(1, o1);
- node->setOp(2, o2);
- for (uint32_t i = 3; i < opCount; i++)
- node->setOp(i, opExt[i - 3]);
- node->resetOpRange(opCount, opCapacity);
-
- if (comment)
- node->setInlineComment(static_cast<char*>(_dataZone.dup(comment, strlen(comment), true)));
-
- addNode(node);
- resetExtraReg();
- return kErrorOk;
-}
-
-// BaseBuilder - Align
-// ===================
-
-Error BaseBuilder::align(AlignMode alignMode, uint32_t alignment) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- AlignNode* node;
- ASMJIT_PROPAGATE(newAlignNode(&node, alignMode, alignment));
- ASMJIT_ASSUME(node != nullptr);
-
- addNode(node);
- return kErrorOk;
-}
-
-// BaseBuilder - Embed
-// ===================
-
-Error BaseBuilder::embed(const void* data, size_t dataSize) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- EmbedDataNode* node;
- ASMJIT_PROPAGATE(newEmbedDataNode(&node, TypeId::kUInt8, data, dataSize));
- ASMJIT_ASSUME(node != nullptr);
-
- addNode(node);
- return kErrorOk;
-}
-
-Error BaseBuilder::embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t itemRepeat) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- EmbedDataNode* node;
- ASMJIT_PROPAGATE(newEmbedDataNode(&node, typeId, data, itemCount, itemRepeat));
- ASMJIT_ASSUME(node != nullptr);
-
- addNode(node);
- return kErrorOk;
-}
-
-Error BaseBuilder::embedConstPool(const Label& label, const ConstPool& pool) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (!isLabelValid(label))
- return reportError(DebugUtils::errored(kErrorInvalidLabel));
-
- ASMJIT_PROPAGATE(align(AlignMode::kData, uint32_t(pool.alignment())));
- ASMJIT_PROPAGATE(bind(label));
-
- EmbedDataNode* node;
- ASMJIT_PROPAGATE(newEmbedDataNode(&node, TypeId::kUInt8, nullptr, pool.size()));
- ASMJIT_ASSUME(node != nullptr);
-
- pool.fill(node->data());
- addNode(node);
- return kErrorOk;
-}
-
-// BaseBuilder - EmbedLabel & EmbedLabelDelta
-// ==========================================
-//
-// If dataSize is zero it means that the size is the same as target register width, however,
-// if it's provided we really want to validate whether it's within the possible range.
-
-static inline bool BaseBuilder_checkDataSize(size_t dataSize) noexcept {
- return !dataSize || (Support::isPowerOf2(dataSize) && dataSize <= 8);
-}
-
-Error BaseBuilder::embedLabel(const Label& label, size_t dataSize) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (!BaseBuilder_checkDataSize(dataSize))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- EmbedLabelNode* node;
- ASMJIT_PROPAGATE(_newNodeT<EmbedLabelNode>(&node, label.id(), uint32_t(dataSize)));
-
- addNode(node);
- return kErrorOk;
-}
-
-Error BaseBuilder::embedLabelDelta(const Label& label, const Label& base, size_t dataSize) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (!BaseBuilder_checkDataSize(dataSize))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- EmbedLabelDeltaNode* node;
- ASMJIT_PROPAGATE(_newNodeT<EmbedLabelDeltaNode>(&node, label.id(), base.id(), uint32_t(dataSize)));
-
- addNode(node);
- return kErrorOk;
-}
-
-// BaseBuilder - Comment
-// =====================
-
-Error BaseBuilder::comment(const char* data, size_t size) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- CommentNode* node;
- ASMJIT_PROPAGATE(newCommentNode(&node, data, size));
- ASMJIT_ASSUME(node != nullptr);
-
- addNode(node);
- return kErrorOk;
-}
-
-// BaseBuilder - SerializeTo
-// =========================
-
-Error BaseBuilder::serializeTo(BaseEmitter* dst) {
- Error err = kErrorOk;
- BaseNode* node_ = _nodeList.first();
-
- Operand_ opArray[Globals::kMaxOpCount];
-
- do {
- dst->setInlineComment(node_->inlineComment());
-
- if (node_->isInst()) {
- InstNode* node = node_->as<InstNode>();
-
- // NOTE: Inlined to remove one additional call per instruction.
- dst->setInstOptions(node->options());
- dst->setExtraReg(node->extraReg());
-
- const Operand_* op = node->operands();
- const Operand_* opExt = EmitterUtils::noExt;
-
- uint32_t opCount = node->opCount();
- if (opCount > 3) {
- uint32_t i = 4;
- opArray[3] = op[3];
-
- while (i < opCount) {
- opArray[i].copyFrom(op[i]);
- i++;
- }
- while (i < Globals::kMaxOpCount) {
- opArray[i].reset();
- i++;
- }
- opExt = opArray + 3;
- }
-
- err = dst->_emit(node->id(), op[0], op[1], op[2], opExt);
- }
- else if (node_->isLabel()) {
- if (node_->isConstPool()) {
- ConstPoolNode* node = node_->as<ConstPoolNode>();
- err = dst->embedConstPool(node->label(), node->constPool());
- }
- else {
- LabelNode* node = node_->as<LabelNode>();
- err = dst->bind(node->label());
- }
- }
- else if (node_->isAlign()) {
- AlignNode* node = node_->as<AlignNode>();
- err = dst->align(node->alignMode(), node->alignment());
- }
- else if (node_->isEmbedData()) {
- EmbedDataNode* node = node_->as<EmbedDataNode>();
- err = dst->embedDataArray(node->typeId(), node->data(), node->itemCount(), node->repeatCount());
- }
- else if (node_->isEmbedLabel()) {
- EmbedLabelNode* node = node_->as<EmbedLabelNode>();
- err = dst->embedLabel(node->label(), node->dataSize());
- }
- else if (node_->isEmbedLabelDelta()) {
- EmbedLabelDeltaNode* node = node_->as<EmbedLabelDeltaNode>();
- err = dst->embedLabelDelta(node->label(), node->baseLabel(), node->dataSize());
- }
- else if (node_->isSection()) {
- SectionNode* node = node_->as<SectionNode>();
- err = dst->section(_code->sectionById(node->id()));
- }
- else if (node_->isComment()) {
- CommentNode* node = node_->as<CommentNode>();
- err = dst->comment(node->inlineComment());
- }
-
- if (err) break;
- node_ = node_->next();
- } while (node_);
-
- return err;
-}
-
-// BaseBuilder - Events
-// ====================
-
-Error BaseBuilder::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- SectionNode* initialSection;
- Error err = sectionNodeOf(&initialSection, 0);
-
- if (!err)
- err = _passes.willGrow(&_allocator, 8);
-
- if (ASMJIT_UNLIKELY(err)) {
- onDetach(code);
- return err;
- }
-
- ASMJIT_ASSUME(initialSection != nullptr);
- _cursor = initialSection;
- _nodeList.reset(initialSection, initialSection);
- initialSection->setFlags(NodeFlags::kIsActive);
-
- return kErrorOk;
-}
-
-Error BaseBuilder::onDetach(CodeHolder* code) noexcept {
- BaseBuilder_deletePasses(this);
- _sectionNodes.reset();
- _labelNodes.reset();
-
- _allocator.reset(&_codeZone);
- _codeZone.reset();
- _dataZone.reset();
- _passZone.reset();
-
- _nodeFlags = NodeFlags::kNone;
- _cursor = nullptr;
- _nodeList.reset();
-
- return Base::onDetach(code);
-}
-
-// Pass - Construction & Destruction
-// =================================
-
-Pass::Pass(const char* name) noexcept
- : _name(name) {}
-Pass::~Pass() noexcept {}
-
-// Pass - Interface
-// ================
-
-// [[pure virtual]]
-Error Pass::run(Zone* zone, Logger* logger) {
- DebugUtils::unused(zone, logger);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/src/asmjit/core/builder.h b/3rdparty/asmjit/src/asmjit/core/builder.h
deleted file mode 100644
index 0de19234cb6..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/builder.h
+++ /dev/null
@@ -1,1499 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_BUILDER_H_INCLUDED
-#define ASMJIT_CORE_BUILDER_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_BUILDER
-
-#include "../core/assembler.h"
-#include "../core/codeholder.h"
-#include "../core/constpool.h"
-#include "../core/formatter.h"
-#include "../core/inst.h"
-#include "../core/operand.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../core/zone.h"
-#include "../core/zonevector.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_builder
-//! \{
-
-class BaseBuilder;
-class Pass;
-
-class BaseNode;
-class InstNode;
-class SectionNode;
-class LabelNode;
-class AlignNode;
-class EmbedDataNode;
-class EmbedLabelNode;
-class ConstPoolNode;
-class CommentNode;
-class SentinelNode;
-class LabelDeltaNode;
-
-//! Type of node used by \ref BaseBuilder and \ref BaseCompiler.
-enum class NodeType : uint8_t {
- //! Invalid node (internal, don't use).
- kNone = 0,
-
- // [BaseBuilder]
-
- //! Node is \ref InstNode.
- kInst = 1,
- //! Node is \ref SectionNode.
- kSection = 2,
- //! Node is \ref LabelNode.
- kLabel = 3,
- //! Node is \ref AlignNode.
- kAlign = 4,
- //! Node is \ref EmbedDataNode.
- kEmbedData = 5,
- //! Node is \ref EmbedLabelNode.
- kEmbedLabel = 6,
- //! Node is \ref EmbedLabelDeltaNode.
- kEmbedLabelDelta = 7,
- //! Node is \ref ConstPoolNode.
- kConstPool = 8,
- //! Node is \ref CommentNode.
- kComment = 9,
- //! Node is \ref SentinelNode.
- kSentinel = 10,
-
- // [BaseCompiler]
-
- //! Node is \ref JumpNode (acts as InstNode).
- kJump = 15,
- //! Node is \ref FuncNode (acts as LabelNode).
- kFunc = 16,
- //! Node is \ref FuncRetNode (acts as InstNode).
- kFuncRet = 17,
- //! Node is \ref InvokeNode (acts as InstNode).
- kInvoke = 18,
-
- // [UserDefined]
-
- //! First id of a user-defined node.
- kUser = 32
-};
-
-//! Node flags, specify what the node is and/or does.
-enum class NodeFlags : uint8_t {
- //! No flags.
- kNone = 0,
- //! Node is code that can be executed (instruction, label, align, etc...).
- kIsCode = 0x01u,
- //! Node is data that cannot be executed (data, const-pool, etc...).
- kIsData = 0x02u,
- //! Node is informative, can be removed and ignored.
- kIsInformative = 0x04u,
- //! Node can be safely removed if unreachable.
- kIsRemovable = 0x08u,
- //! Node does nothing when executed (label, align, explicit nop).
- kHasNoEffect = 0x10u,
- //! Node is an instruction or acts as it.
- kActsAsInst = 0x20u,
- //! Node is a label or acts as it.
- kActsAsLabel = 0x40u,
- //! Node is active (part of the code).
- kIsActive = 0x80u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(NodeFlags)
-
-//! Type of the sentinel (purely informative purpose).
-enum class SentinelType : uint8_t {
- //! Type of the sentinel is not known.
- kUnknown = 0u,
- //! This is a sentinel used at the end of \ref FuncNode.
- kFuncEnd = 1u
-};
-
-//! Node list.
-//!
-//! A double-linked list of pointers to \ref BaseNode, managed by \ref BaseBuilder or \ref BaseCompiler.
-//!
-//! \note At the moment NodeList is just a view, but it's planned that it will get more functionality in the future.
-class NodeList {
-public:
- //! \name Members
- //! \{
-
- //! First node in the list or nullptr if there are no nodes in the list.
- BaseNode* _first = nullptr;
- //! Last node in the list or nullptr if there are no nodes in the list.
- BaseNode* _last = nullptr;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG NodeList() noexcept {}
-
- ASMJIT_INLINE_NODEBUG NodeList(BaseNode* first, BaseNode* last) noexcept
- : _first(first),
- _last(last) {}
-
- //! \}
-
- //! \name Reset
- //! \{
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _first = nullptr;
- _last = nullptr;
- }
-
- ASMJIT_INLINE_NODEBUG void reset(BaseNode* first, BaseNode* last) noexcept {
- _first = first;
- _last = last;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _first == nullptr; }
-
- ASMJIT_INLINE_NODEBUG BaseNode* first() const noexcept { return _first; }
- ASMJIT_INLINE_NODEBUG BaseNode* last() const noexcept { return _last; }
-
- //! \}
-};
-
-//! Builder interface.
-//!
-//! `BaseBuilder` interface was designed to be used as a \ref BaseAssembler replacement in case pre-processing or
-//! post-processing of the generated code is required. The code can be modified during or after code generation.
-//! Pre processing or post processing can be done manually or through a \ref Pass object. \ref BaseBuilder stores
-//! the emitted code as a double-linked list of nodes, which allows O(1) insertion and removal during processing.
-//!
-//! Check out architecture specific builders for more details and examples:
-//!
-//! - \ref x86::Builder - X86/X64 builder implementation.
-//! - \ref a64::Builder - AArch64 builder implementation.
-class ASMJIT_VIRTAPI BaseBuilder : public BaseEmitter {
-public:
- ASMJIT_NONCOPYABLE(BaseBuilder)
- typedef BaseEmitter Base;
-
- //! \name Members
- //! \{
-
- //! Base zone used to allocate nodes and passes.
- Zone _codeZone;
- //! Data zone used to allocate data and names.
- Zone _dataZone;
- //! Pass zone, passed to `Pass::run()`.
- Zone _passZone;
- //! Allocator that uses `_codeZone`.
- ZoneAllocator _allocator;
-
- //! Array of `Pass` objects.
- ZoneVector<Pass*> _passes {};
- //! Maps section indexes to `LabelNode` nodes.
- ZoneVector<SectionNode*> _sectionNodes {};
- //! Maps label indexes to `LabelNode` nodes.
- ZoneVector<LabelNode*> _labelNodes {};
-
- //! Current node (cursor).
- BaseNode* _cursor = nullptr;
- //! First and last nodes.
- NodeList _nodeList;
-
- //! Flags assigned to each new node.
- NodeFlags _nodeFlags = NodeFlags::kNone;
- //! The sections links are dirty (used internally).
- bool _dirtySectionLinks = false;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `BaseBuilder` instance.
- ASMJIT_API BaseBuilder() noexcept;
- //! Destroys the `BaseBuilder` instance.
- ASMJIT_API ~BaseBuilder() noexcept override;
-
- //! \}
-
- //! \name Node Management
- //! \{
-
- ASMJIT_INLINE_NODEBUG NodeList nodeList() const noexcept { return _nodeList; }
-
- //! Returns the first node.
- ASMJIT_INLINE_NODEBUG BaseNode* firstNode() const noexcept { return _nodeList.first(); }
- //! Returns the last node.
- ASMJIT_INLINE_NODEBUG BaseNode* lastNode() const noexcept { return _nodeList.last(); }
-
- //! Allocates and instantiates a new node of type `T` and returns its instance. If the allocation fails `nullptr`
- //! is returned.
- //!
- //! The template argument `T` must be a type that is extends \ref BaseNode.
- //!
- //! \remarks The pointer returned (if non-null) is owned by the Builder or Compiler. When the Builder/Compiler
- //! is destroyed it destroys all nodes it created so no manual memory management is required.
- template<typename T, typename... Args>
- inline Error _newNodeT(T** ASMJIT_NONNULL(out), Args&&... args) {
- *out = _allocator.newT<T>(this, std::forward<Args>(args)...);
- if (ASMJIT_UNLIKELY(!*out))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
- return kErrorOk;
- }
-
- //! Creates a new \ref InstNode.
- ASMJIT_API Error newInstNode(InstNode** ASMJIT_NONNULL(out), InstId instId, InstOptions instOptions, uint32_t opCount);
- //! Creates a new \ref LabelNode.
- ASMJIT_API Error newLabelNode(LabelNode** ASMJIT_NONNULL(out));
- //! Creates a new \ref AlignNode.
- ASMJIT_API Error newAlignNode(AlignNode** ASMJIT_NONNULL(out), AlignMode alignMode, uint32_t alignment);
- //! Creates a new \ref EmbedDataNode.
- ASMJIT_API Error newEmbedDataNode(EmbedDataNode** ASMJIT_NONNULL(out), TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1);
- //! Creates a new \ref ConstPoolNode.
- ASMJIT_API Error newConstPoolNode(ConstPoolNode** ASMJIT_NONNULL(out));
- //! Creates a new \ref CommentNode.
- ASMJIT_API Error newCommentNode(CommentNode** ASMJIT_NONNULL(out), const char* data, size_t size);
-
- //! Adds `node` after the current and sets the current node to the given `node`.
- ASMJIT_API BaseNode* addNode(BaseNode* ASMJIT_NONNULL(node)) noexcept;
- //! Inserts the given `node` after `ref`.
- ASMJIT_API BaseNode* addAfter(BaseNode* ASMJIT_NONNULL(node), BaseNode* ASMJIT_NONNULL(ref)) noexcept;
- //! Inserts the given `node` before `ref`.
- ASMJIT_API BaseNode* addBefore(BaseNode* ASMJIT_NONNULL(node), BaseNode* ASMJIT_NONNULL(ref)) noexcept;
- //! Removes the given `node`.
- ASMJIT_API BaseNode* removeNode(BaseNode* ASMJIT_NONNULL(node)) noexcept;
- //! Removes multiple nodes.
- ASMJIT_API void removeNodes(BaseNode* first, BaseNode* last) noexcept;
-
- //! Returns the cursor.
- //!
- //! When the Builder/Compiler is created it automatically creates a '.text' \ref SectionNode, which will be the
- //! initial one. When instructions are added they are always added after the cursor and the cursor is changed
- //! to be that newly added node. Use `setCursor()` to change where new nodes are inserted.
- ASMJIT_INLINE_NODEBUG BaseNode* cursor() const noexcept { return _cursor; }
-
- //! Sets the current node to `node` and return the previous one.
- ASMJIT_API BaseNode* setCursor(BaseNode* node) noexcept;
-
- //! Sets the current node without returning the previous node.
- //!
- //! Only use this function if you are concerned about performance and want this inlined (for example if you set
- //! the cursor in a loop, etc...).
- ASMJIT_INLINE_NODEBUG void _setCursor(BaseNode* node) noexcept { _cursor = node; }
-
- //! \}
-
- //! \name Section Management
- //! \{
-
- //! Returns a vector of SectionNode objects.
- //!
- //! \note If a section of some id is not associated with the Builder/Compiler it would be null, so always check
- //! for nulls if you iterate over the vector.
- ASMJIT_INLINE_NODEBUG const ZoneVector<SectionNode*>& sectionNodes() const noexcept {
- return _sectionNodes;
- }
-
- //! Tests whether the `SectionNode` of the given `sectionId` was registered.
- ASMJIT_INLINE_NODEBUG bool hasRegisteredSectionNode(uint32_t sectionId) const noexcept {
- return sectionId < _sectionNodes.size() && _sectionNodes[sectionId] != nullptr;
- }
-
- //! Returns or creates a `SectionNode` that matches the given `sectionId`.
- //!
- //! \remarks This function will either get the existing `SectionNode` or create it in case it wasn't created before.
- //! You can check whether a section has a registered `SectionNode` by using `BaseBuilder::hasRegisteredSectionNode()`.
- ASMJIT_API Error sectionNodeOf(SectionNode** ASMJIT_NONNULL(out), uint32_t sectionId);
-
- ASMJIT_API Error section(Section* ASMJIT_NONNULL(section)) override;
-
- //! Returns whether the section links of active section nodes are dirty. You can update these links by calling
- //! `updateSectionLinks()` in such case.
- ASMJIT_INLINE_NODEBUG bool hasDirtySectionLinks() const noexcept { return _dirtySectionLinks; }
-
- //! Updates links of all active section nodes.
- ASMJIT_API void updateSectionLinks() noexcept;
-
- //! \}
-
- //! \name Label Management
- //! \{
-
- //! Returns a vector of \ref LabelNode nodes.
- //!
- //! \note If a label of some id is not associated with the Builder/Compiler it would be null, so always check for
- //! nulls if you iterate over the vector.
- ASMJIT_INLINE_NODEBUG const ZoneVector<LabelNode*>& labelNodes() const noexcept { return _labelNodes; }
-
- //! Tests whether the `LabelNode` of the given `labelId` was registered.
- ASMJIT_INLINE_NODEBUG bool hasRegisteredLabelNode(uint32_t labelId) const noexcept {
- return labelId < _labelNodes.size() && _labelNodes[labelId] != nullptr;
- }
-
- //! \overload
- ASMJIT_INLINE_NODEBUG bool hasRegisteredLabelNode(const Label& label) const noexcept {
- return hasRegisteredLabelNode(label.id());
- }
-
- //! Gets or creates a \ref LabelNode that matches the given `labelId`.
- //!
- //! \remarks This function will either get the existing `LabelNode` or create it in case it wasn't created before.
- //! You can check whether a label has a registered `LabelNode` by calling \ref BaseBuilder::hasRegisteredLabelNode().
- ASMJIT_API Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), uint32_t labelId);
-
- //! \overload
- ASMJIT_INLINE_NODEBUG Error labelNodeOf(LabelNode** ASMJIT_NONNULL(out), const Label& label) {
- return labelNodeOf(out, label.id());
- }
-
- //! Registers this \ref LabelNode (internal).
- //!
- //! This function is used internally to register a newly created `LabelNode` with this instance of Builder/Compiler.
- //! Use \ref labelNodeOf() functions to get back \ref LabelNode from a label or its identifier.
- ASMJIT_API Error registerLabelNode(LabelNode* ASMJIT_NONNULL(node));
-
- ASMJIT_API Label newLabel() override;
- ASMJIT_API Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId) override;
- ASMJIT_API Error bind(const Label& label) override;
-
- //! \}
-
- //! \name Passes
- //! \{
-
- //! Returns a vector of `Pass` instances that will be executed by `runPasses()`.
- ASMJIT_INLINE_NODEBUG const ZoneVector<Pass*>& passes() const noexcept { return _passes; }
-
- //! Allocates and instantiates a new pass of type `T` and returns its instance. If the allocation fails `nullptr` is
- //! returned.
- //!
- //! The template argument `T` must be a type that is extends \ref Pass.
- //!
- //! \remarks The pointer returned (if non-null) is owned by the Builder or Compiler. When the Builder/Compiler is
- //! destroyed it destroys all passes it created so no manual memory management is required.
- template<typename T>
- inline T* newPassT() noexcept { return _codeZone.newT<T>(); }
-
- //! \overload
- template<typename T, typename... Args>
- inline T* newPassT(Args&&... args) noexcept { return _codeZone.newT<T>(std::forward<Args>(args)...); }
-
- template<typename T>
- inline Error addPassT() { return addPass(newPassT<T>()); }
-
- template<typename T, typename... Args>
- inline Error addPassT(Args&&... args) { return addPass(newPassT<T, Args...>(std::forward<Args>(args)...)); }
-
- //! Returns `Pass` by name.
- //!
- //! If the pass having the given `name` doesn't exist `nullptr` is returned.
- ASMJIT_API Pass* passByName(const char* name) const noexcept;
- //! Adds `pass` to the list of passes.
- ASMJIT_API Error addPass(Pass* pass) noexcept;
- //! Removes `pass` from the list of passes and delete it.
- ASMJIT_API Error deletePass(Pass* pass) noexcept;
-
- //! Runs all passes in order.
- ASMJIT_API Error runPasses();
-
- //! \}
-
- //! \name Emit
- //! \{
-
- ASMJIT_API Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
-
- //! \}
-
- //! \name Align
- //! \{
-
- ASMJIT_API Error align(AlignMode alignMode, uint32_t alignment) override;
-
- //! \}
-
- //! \name Embed
- //! \{
-
- ASMJIT_API Error embed(const void* data, size_t dataSize) override;
- ASMJIT_API Error embedDataArray(TypeId typeId, const void* data, size_t count, size_t repeat = 1) override;
- ASMJIT_API Error embedConstPool(const Label& label, const ConstPool& pool) override;
-
- ASMJIT_API Error embedLabel(const Label& label, size_t dataSize = 0) override;
- ASMJIT_API Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0) override;
-
- //! \}
-
- //! \name Comment
- //! \{
-
- ASMJIT_API Error comment(const char* data, size_t size = SIZE_MAX) override;
-
- //! \}
-
- //! \name Serialization
- //! \{
-
- //! Serializes everything the given emitter `dst`.
- //!
- //! Although not explicitly required the emitter will most probably be of Assembler type. The reason is that
- //! there is no known use of serializing nodes held by Builder/Compiler into another Builder-like emitter.
- ASMJIT_API Error serializeTo(BaseEmitter* dst);
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-};
-
-//! Base node.
-//!
-//! Every node represents a building-block used by \ref BaseBuilder. It can be instruction, data, label, comment,
-//! directive, or any other high-level representation that can be transformed to the building blocks mentioned.
-//! Every class that inherits \ref BaseBuilder can define its own high-level nodes that can be later lowered to
-//! basic nodes like instructions.
-class BaseNode {
-public:
- ASMJIT_NONCOPYABLE(BaseNode)
-
- //! \name Members
- //! \{
-
- union {
- struct {
- //! Previous node.
- BaseNode* _prev;
- //! Next node.
- BaseNode* _next;
- };
- //! Links (an alternative view to previous and next nodes).
- BaseNode* _links[2];
- };
-
- //! Data shared between all types of nodes.
- struct AnyData {
- //! Node type.
- NodeType _nodeType;
- //! Node flags.
- NodeFlags _nodeFlags;
- //! Not used by BaseNode.
- uint8_t _reserved0;
- //! Not used by BaseNode.
- uint8_t _reserved1;
- };
-
- //! Data used by \ref AlignNode.
- struct AlignData {
- //! Node type.
- NodeType _nodeType;
- //! Node flags.
- NodeFlags _nodeFlags;
- //! Align mode.
- AlignMode _alignMode;
- //! Not used by AlignNode.
- uint8_t _reserved;
- };
-
- //! Data used by \ref InstNode.
- struct InstData {
- //! Node type.
- NodeType _nodeType;
- //! Node flags.
- NodeFlags _nodeFlags;
- //! Instruction operands count (used).
- uint8_t _opCount;
- //! Instruction operands capacity (allocated).
- uint8_t _opCapacity;
- };
-
- //! Data used by \ref EmbedDataNode.
- struct EmbedData {
- //! Node type.
- NodeType _nodeType;
- //! Node flags.
- NodeFlags _nodeFlags;
- //! Type id.
- TypeId _typeId;
- //! Size of `_typeId`.
- uint8_t _typeSize;
- };
-
- //! Data used by \ref SentinelNode.
- struct SentinelData {
- //! Node type.
- NodeType _nodeType;
- //! Node flags.
- NodeFlags _nodeFlags;
- //! Sentinel type.
- SentinelType _sentinelType;
- //! Not used by BaseNode.
- uint8_t _reserved1;
- };
-
- //! Data that can have different meaning depending on \ref NodeType.
- union {
- //! Data useful by any node type.
- AnyData _any;
- //! Data specific to \ref AlignNode.
- AlignData _alignData;
- //! Data specific to \ref InstNode.
- InstData _inst;
- //! Data specific to \ref EmbedDataNode.
- EmbedData _embed;
- //! Data specific to \ref SentinelNode.
- SentinelData _sentinel;
- };
-
- //! Node position in code (should be unique).
- uint32_t _position;
-
- //! Value reserved for AsmJit users never touched by AsmJit itself.
- union {
- //! User data as 64-bit integer.
- uint64_t _userDataU64;
- //! User data as pointer.
- void* _userDataPtr;
- };
-
- //! Data used exclusively by the current `Pass`.
- void* _passData;
-
- //! Inline comment/annotation or nullptr if not used.
- const char* _inlineComment;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `BaseNode` - always use `BaseBuilder` to allocate nodes.
- ASMJIT_INLINE_NODEBUG BaseNode(BaseBuilder* cb, NodeType nodeType, NodeFlags nodeFlags = NodeFlags::kNone) noexcept {
- _prev = nullptr;
- _next = nullptr;
- _any._nodeType = nodeType;
- _any._nodeFlags = nodeFlags | cb->_nodeFlags;
- _any._reserved0 = 0;
- _any._reserved1 = 0;
- _position = 0;
- _userDataU64 = 0;
- _passData = nullptr;
- _inlineComment = nullptr;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Casts this node to `T*`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* as() noexcept { return static_cast<T*>(this); }
- //! Casts this node to `const T*`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG const T* as() const noexcept { return static_cast<const T*>(this); }
-
- //! Returns previous node or `nullptr` if this node is either first or not
- //! part of Builder/Compiler node-list.
- ASMJIT_INLINE_NODEBUG BaseNode* prev() const noexcept { return _prev; }
- //! Returns next node or `nullptr` if this node is either last or not part
- //! of Builder/Compiler node-list.
- ASMJIT_INLINE_NODEBUG BaseNode* next() const noexcept { return _next; }
-
- //! Returns the type of the node, see `NodeType`.
- ASMJIT_INLINE_NODEBUG NodeType type() const noexcept { return _any._nodeType; }
-
- //! Sets the type of the node, see `NodeType` (internal).
- //!
- //! \remarks You should never set a type of a node to anything else than the initial value. This function is only
- //! provided for users that use custom nodes and need to change the type either during construction or later.
- ASMJIT_INLINE_NODEBUG void setType(NodeType type) noexcept { _any._nodeType = type; }
-
- //! Tests whether this node is either `InstNode` or extends it.
- ASMJIT_INLINE_NODEBUG bool isInst() const noexcept { return hasFlag(NodeFlags::kActsAsInst); }
- //! Tests whether this node is `SectionNode`.
- ASMJIT_INLINE_NODEBUG bool isSection() const noexcept { return type() == NodeType::kSection; }
- //! Tests whether this node is either `LabelNode` or extends it.
- ASMJIT_INLINE_NODEBUG bool isLabel() const noexcept { return hasFlag(NodeFlags::kActsAsLabel); }
- //! Tests whether this node is `AlignNode`.
- ASMJIT_INLINE_NODEBUG bool isAlign() const noexcept { return type() == NodeType::kAlign; }
- //! Tests whether this node is `EmbedDataNode`.
- ASMJIT_INLINE_NODEBUG bool isEmbedData() const noexcept { return type() == NodeType::kEmbedData; }
- //! Tests whether this node is `EmbedLabelNode`.
- ASMJIT_INLINE_NODEBUG bool isEmbedLabel() const noexcept { return type() == NodeType::kEmbedLabel; }
- //! Tests whether this node is `EmbedLabelDeltaNode`.
- ASMJIT_INLINE_NODEBUG bool isEmbedLabelDelta() const noexcept { return type() == NodeType::kEmbedLabelDelta; }
- //! Tests whether this node is `ConstPoolNode`.
- ASMJIT_INLINE_NODEBUG bool isConstPool() const noexcept { return type() == NodeType::kConstPool; }
- //! Tests whether this node is `CommentNode`.
- ASMJIT_INLINE_NODEBUG bool isComment() const noexcept { return type() == NodeType::kComment; }
- //! Tests whether this node is `SentinelNode`.
- ASMJIT_INLINE_NODEBUG bool isSentinel() const noexcept { return type() == NodeType::kSentinel; }
-
- //! Tests whether this node is `FuncNode`.
- ASMJIT_INLINE_NODEBUG bool isFunc() const noexcept { return type() == NodeType::kFunc; }
- //! Tests whether this node is `FuncRetNode`.
- ASMJIT_INLINE_NODEBUG bool isFuncRet() const noexcept { return type() == NodeType::kFuncRet; }
- //! Tests whether this node is `InvokeNode`.
- ASMJIT_INLINE_NODEBUG bool isInvoke() const noexcept { return type() == NodeType::kInvoke; }
-
- //! Returns the node flags.
- ASMJIT_INLINE_NODEBUG NodeFlags flags() const noexcept { return _any._nodeFlags; }
- //! Tests whether the node has the given `flag` set.
- ASMJIT_INLINE_NODEBUG bool hasFlag(NodeFlags flag) const noexcept { return Support::test(_any._nodeFlags, flag); }
- //! Replaces node flags with `flags`.
- ASMJIT_INLINE_NODEBUG void setFlags(NodeFlags flags) noexcept { _any._nodeFlags = flags; }
- //! Adds the given `flags` to node flags.
- ASMJIT_INLINE_NODEBUG void addFlags(NodeFlags flags) noexcept { _any._nodeFlags |= flags; }
- //! Clears the given `flags` from node flags.
- ASMJIT_INLINE_NODEBUG void clearFlags(NodeFlags flags) noexcept { _any._nodeFlags &= ~flags; }
-
- //! Tests whether the node is code that can be executed.
- ASMJIT_INLINE_NODEBUG bool isCode() const noexcept { return hasFlag(NodeFlags::kIsCode); }
- //! Tests whether the node is data that cannot be executed.
- ASMJIT_INLINE_NODEBUG bool isData() const noexcept { return hasFlag(NodeFlags::kIsData); }
- //! Tests whether the node is informative only (is never encoded like comment, etc...).
- ASMJIT_INLINE_NODEBUG bool isInformative() const noexcept { return hasFlag(NodeFlags::kIsInformative); }
- //! Tests whether the node is removable if it's in an unreachable code block.
- ASMJIT_INLINE_NODEBUG bool isRemovable() const noexcept { return hasFlag(NodeFlags::kIsRemovable); }
- //! Tests whether the node has no effect when executed (label, .align, nop, ...).
- ASMJIT_INLINE_NODEBUG bool hasNoEffect() const noexcept { return hasFlag(NodeFlags::kHasNoEffect); }
- //! Tests whether the node is part of the code.
- ASMJIT_INLINE_NODEBUG bool isActive() const noexcept { return hasFlag(NodeFlags::kIsActive); }
-
- //! Tests whether the node has a position assigned.
- //!
- //! \remarks Returns `true` if node position is non-zero.
- ASMJIT_INLINE_NODEBUG bool hasPosition() const noexcept { return _position != 0; }
- //! Returns node position.
- ASMJIT_INLINE_NODEBUG uint32_t position() const noexcept { return _position; }
- //! Sets node position.
- //!
- //! Node position is a 32-bit unsigned integer that is used by Compiler to track where the node is relatively to
- //! the start of the function. It doesn't describe a byte position in a binary, instead it's just a pseudo position
- //! used by liveness analysis and other tools around Compiler.
- //!
- //! If you don't use Compiler then you may use `position()` and `setPosition()` freely for your own purposes if
- //! the 32-bit value limit is okay for you.
- ASMJIT_INLINE_NODEBUG void setPosition(uint32_t position) noexcept { _position = position; }
-
- //! Returns user data casted to `T*`.
- //!
- //! User data is dedicated to be used only by AsmJit users and not touched by the library. The data is of a pointer
- //! size so you can either store a pointer or `int64_t` value through `setUserDataAsPtr()`, `setUserDataAsInt64()`
- //! and `setUserDataAsUInt64()`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* userDataAsPtr() const noexcept { return static_cast<T*>(_userDataPtr); }
- //! Returns user data casted to `int64_t`.
- ASMJIT_INLINE_NODEBUG int64_t userDataAsInt64() const noexcept { return int64_t(_userDataU64); }
- //! Returns user data casted to `uint64_t`.
- ASMJIT_INLINE_NODEBUG uint64_t userDataAsUInt64() const noexcept { return _userDataU64; }
-
- //! Sets user data to `data`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG void setUserDataAsPtr(T* data) noexcept { _userDataPtr = static_cast<void*>(data); }
- //! Sets used data to the given 64-bit signed `value`.
- ASMJIT_INLINE_NODEBUG void setUserDataAsInt64(int64_t value) noexcept { _userDataU64 = uint64_t(value); }
- //! Sets used data to the given 64-bit unsigned `value`.
- ASMJIT_INLINE_NODEBUG void setUserDataAsUInt64(uint64_t value) noexcept { _userDataU64 = value; }
-
- //! Resets user data to zero / nullptr.
- ASMJIT_INLINE_NODEBUG void resetUserData() noexcept { _userDataU64 = 0; }
-
- //! Tests whether the node has an associated pass data.
- ASMJIT_INLINE_NODEBUG bool hasPassData() const noexcept { return _passData != nullptr; }
- //! Returns the node pass data - data used during processing & transformations.
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* passData() const noexcept { return (T*)_passData; }
- //! Sets the node pass data to `data`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG void setPassData(T* data) noexcept { _passData = (void*)data; }
- //! Resets the node pass data to nullptr.
- ASMJIT_INLINE_NODEBUG void resetPassData() noexcept { _passData = nullptr; }
-
- //! Tests whether the node has an inline comment/annotation.
- ASMJIT_INLINE_NODEBUG bool hasInlineComment() const noexcept { return _inlineComment != nullptr; }
- //! Returns an inline comment/annotation string.
- ASMJIT_INLINE_NODEBUG const char* inlineComment() const noexcept { return _inlineComment; }
- //! Sets an inline comment/annotation string to `s`.
- ASMJIT_INLINE_NODEBUG void setInlineComment(const char* s) noexcept { _inlineComment = s; }
- //! Resets an inline comment/annotation string to nullptr.
- ASMJIT_INLINE_NODEBUG void resetInlineComment() noexcept { _inlineComment = nullptr; }
-
- //! \}
-};
-
-//! Instruction node.
-//!
-//! Wraps an instruction with its options and operands.
-class InstNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(InstNode)
-
- //! \name Constants
- //! \{
-
- //! The number of embedded operands for a default \ref InstNode instance that are always allocated as a part of
- //! the instruction itself. Minimum embedded operands is 4, but in 32-bit more pointers are smaller and we can
- //! embed 5. The rest (up to 6 operands) is considered extended.
- //!
- //! The number of operands InstNode holds is decided when \ref InstNode is created.
- static constexpr uint32_t kBaseOpCapacity = uint32_t((128 - sizeof(BaseNode) - sizeof(BaseInst)) / sizeof(Operand_));
-
- //! Count of maximum number of operands \ref InstNode can hold.
- static constexpr uint32_t kFullOpCapacity = Globals::kMaxOpCount;
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Base instruction data.
- BaseInst _baseInst;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `InstNode` instance.
- ASMJIT_INLINE_NODEBUG InstNode(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount, uint32_t opCapacity = kBaseOpCapacity) noexcept
- : BaseNode(cb, NodeType::kInst, NodeFlags::kIsCode | NodeFlags::kIsRemovable | NodeFlags::kActsAsInst),
- _baseInst(instId, options) {
- _inst._opCapacity = uint8_t(opCapacity);
- _inst._opCount = uint8_t(opCount);
- }
-
- //! \cond INTERNAL
- //! Reset all built-in operands, including `extraReg`.
- ASMJIT_INLINE_NODEBUG void _resetOps() noexcept {
- _baseInst.resetExtraReg();
- resetOpRange(0, opCapacity());
- }
- //! \endcond
-
- //! \}
-
- //! \name Instruction Object
- //! \{
-
- ASMJIT_INLINE_NODEBUG BaseInst& baseInst() noexcept { return _baseInst; }
- ASMJIT_INLINE_NODEBUG const BaseInst& baseInst() const noexcept { return _baseInst; }
-
- //! \}
-
- //! \name Instruction Id
- //! \{
-
- //! Returns the instruction id, see `BaseInst::Id`.
- ASMJIT_INLINE_NODEBUG InstId id() const noexcept { return _baseInst.id(); }
- //! Returns the instruction real id, see `BaseInst::Id`.
- ASMJIT_INLINE_NODEBUG InstId realId() const noexcept { return _baseInst.realId(); }
-
- //! Sets the instruction id to `id`, see `BaseInst::Id`.
- ASMJIT_INLINE_NODEBUG void setId(InstId id) noexcept { _baseInst.setId(id); }
-
- //! \}
-
- //! \name Instruction Options
- //! \{
-
- //! Returns instruction options, see \ref InstOptions for more details.
- ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _baseInst.options(); }
- //! Tests whether instruction has the given \option` set/enabled.
- ASMJIT_INLINE_NODEBUG bool hasOption(InstOptions option) const noexcept { return _baseInst.hasOption(option); }
- //! Sets instruction `options` to the provided value, resetting all others.
- ASMJIT_INLINE_NODEBUG void setOptions(InstOptions options) noexcept { _baseInst.setOptions(options); }
- //! Adds instruction `options` to the instruction.
- ASMJIT_INLINE_NODEBUG void addOptions(InstOptions options) noexcept { _baseInst.addOptions(options); }
- //! Clears instruction `options` of the instruction (disables the given options).
- ASMJIT_INLINE_NODEBUG void clearOptions(InstOptions options) noexcept { _baseInst.clearOptions(options); }
- //! Resets instruction options to none - disabling all instruction options.
- ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _baseInst.resetOptions(); }
-
- //! \}
-
- //! \name Extra Register
- //! \{
-
- //! Tests whether the node has an extra register operand.
- ASMJIT_INLINE_NODEBUG bool hasExtraReg() const noexcept { return _baseInst.hasExtraReg(); }
- //! Returns extra register operand.
- ASMJIT_INLINE_NODEBUG RegOnly& extraReg() noexcept { return _baseInst.extraReg(); }
- //! \overload
- ASMJIT_INLINE_NODEBUG const RegOnly& extraReg() const noexcept { return _baseInst.extraReg(); }
- //! Sets extra register operand to `reg`.
- ASMJIT_INLINE_NODEBUG void setExtraReg(const BaseReg& reg) noexcept { _baseInst.setExtraReg(reg); }
- //! Sets extra register operand to `reg`.
- ASMJIT_INLINE_NODEBUG void setExtraReg(const RegOnly& reg) noexcept { _baseInst.setExtraReg(reg); }
- //! Resets extra register operand.
- ASMJIT_INLINE_NODEBUG void resetExtraReg() noexcept { _baseInst.resetExtraReg(); }
-
- //! \}
-
- //! \name Instruction Operands
- //! \{
-
- //! Returns operand count.
- ASMJIT_INLINE_NODEBUG uint32_t opCount() const noexcept { return _inst._opCount; }
- //! Returns operand capacity.
- ASMJIT_INLINE_NODEBUG uint32_t opCapacity() const noexcept { return _inst._opCapacity; }
-
- //! Sets operand count.
- ASMJIT_INLINE_NODEBUG void setOpCount(uint32_t opCount) noexcept { _inst._opCount = uint8_t(opCount); }
-
- //! Returns operands array.
- ASMJIT_INLINE_NODEBUG Operand* operands() noexcept {
- return reinterpret_cast<Operand*>(reinterpret_cast<uint8_t*>(this) + sizeof(InstNode));
- }
-
- //! Returns operands array (const).
- ASMJIT_INLINE_NODEBUG const Operand* operands() const noexcept {
- return reinterpret_cast<const Operand*>(reinterpret_cast<const uint8_t*>(this) + sizeof(InstNode));
- }
-
- //! Returns operand at the given `index`.
- inline Operand& op(uint32_t index) noexcept {
- ASMJIT_ASSERT(index < opCapacity());
-
- Operand* ops = operands();
- return ops[index].as<Operand>();
- }
-
- //! Returns operand at the given `index` (const).
- inline const Operand& op(uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < opCapacity());
-
- const Operand* ops = operands();
- return ops[index].as<Operand>();
- }
-
- //! Sets operand at the given `index` to `op`.
- inline void setOp(uint32_t index, const Operand_& op) noexcept {
- ASMJIT_ASSERT(index < opCapacity());
-
- Operand* ops = operands();
- ops[index].copyFrom(op);
- }
-
- //! Resets operand at the given `index` to none.
- inline void resetOp(uint32_t index) noexcept {
- ASMJIT_ASSERT(index < opCapacity());
-
- Operand* ops = operands();
- ops[index].reset();
- }
-
- //! Resets operands at `[start, end)` range.
- inline void resetOpRange(uint32_t start, uint32_t end) noexcept {
- Operand* ops = operands();
- for (uint32_t i = start; i < end; i++)
- ops[i].reset();
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Tests whether the given operand type `opType` is used by the instruction.
- inline bool hasOpType(OperandType opType) const noexcept {
- const Operand* ops = operands();
- for (uint32_t i = 0, count = opCount(); i < count; i++)
- if (ops[i].opType() == opType)
- return true;
- return false;
- }
-
- //! Tests whether the instruction uses at least one register operand.
- inline bool hasRegOp() const noexcept { return hasOpType(OperandType::kReg); }
- //! Tests whether the instruction uses at least one memory operand.
- inline bool hasMemOp() const noexcept { return hasOpType(OperandType::kMem); }
- //! Tests whether the instruction uses at least one immediate operand.
- inline bool hasImmOp() const noexcept { return hasOpType(OperandType::kImm); }
- //! Tests whether the instruction uses at least one label operand.
- inline bool hasLabelOp() const noexcept { return hasOpType(OperandType::kLabel); }
-
- //! Returns the index of the given operand type `opType`.
- //!
- //! \note If the operand type wa found, the value returned represents its index in \ref operands()
- //! array, otherwise \ref Globals::kNotFound is returned to signalize that the operand was not found.
- inline uint32_t indexOfOpType(OperandType opType) const noexcept {
- uint32_t i = 0;
- uint32_t count = opCount();
- const Operand* ops = operands();
-
- while (i < count) {
- if (ops[i].opType() == opType)
- return i;
- i++;
- }
-
- return Globals::kNotFound;
- }
-
- //! A shortcut that calls `indexOfOpType(OperandType::kMem)`.
- inline uint32_t indexOfMemOp() const noexcept { return indexOfOpType(OperandType::kMem); }
- //! A shortcut that calls `indexOfOpType(OperandType::kImm)`.
- inline uint32_t indexOfImmOp() const noexcept { return indexOfOpType(OperandType::kImm); }
- //! A shortcut that calls `indexOfOpType(OperandType::kLabel)`.
- inline uint32_t indexOfLabelOp() const noexcept { return indexOfOpType(OperandType::kLabel); }
-
- //! \}
-
- //! \name Rewriting
- //! \{
-
- //! \cond INTERNAL
-
- //! Returns uint32_t[] view that represents BaseInst::RegOnly and instruction operands.
- ASMJIT_INLINE_NODEBUG uint32_t* _getRewriteArray() noexcept { return &_baseInst._extraReg._id; }
- //! \overload
- ASMJIT_INLINE_NODEBUG const uint32_t* _getRewriteArray() const noexcept { return &_baseInst._extraReg._id; }
-
- //! Maximum value of rewrite id - 6 operands each having 4 slots is 24, one RegOnly having 2 slots => 26.
- static constexpr uint32_t kMaxRewriteId = 26 - 1;
-
- //! Returns a rewrite index of the given pointer to `id`.
- //!
- //! This function returns a value that can be then passed to `\ref rewriteIdAtIndex() function. It can address
- //! any id from any operand that is used by the instruction in addition to \ref BaseInst::regOnly field, which
- //! can also be used by the register allocator.
- inline uint32_t getRewriteIndex(const uint32_t* id) const noexcept {
- const uint32_t* array = _getRewriteArray();
- ASMJIT_ASSERT(array <= id);
-
- size_t index = (size_t)(id - array);
- ASMJIT_ASSERT(index <= kMaxRewriteId);
-
- return uint32_t(index);
- }
-
- //! Rewrites the given `index` to the provided identifier `id`.
- //!
- //! \note This is an internal function that is used by a \ref BaseCompiler implementation to rewrite virtual
- //! registers to physical registers. The rewriter in this case sees all operands as array of uint32 values
- //! and the given `index` describes a position in this array. For example a single \ref Operand would be
- //! decomposed to 4 uint32_t values, where the first at index 0 would be operand signature, next would be
- //! base id, etc... This is a comfortable way of patching operands without having to check for their types.
- inline void rewriteIdAtIndex(uint32_t index, uint32_t id) noexcept {
- ASMJIT_ASSERT(index <= kMaxRewriteId);
-
- uint32_t* array = _getRewriteArray();
- array[index] = id;
- }
- //! \endcond
-
- //! \}
-
- //! \name Static Functions
- //! \{
-
- //! \cond INTERNAL
-
- //! Returns the capacity required for the given operands count `opCount`.
- //!
- //! There are only two capacities used - \ref kBaseOpCapacity and \ref kFullOpCapacity, so this function
- //! is used to decide between these two. The general rule is that instructions that can be represented with
- //! \ref kBaseOpCapacity would use this value, and all others would take \ref kFullOpCapacity.
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t capacityOfOpCount(uint32_t opCount) noexcept {
- return opCount <= kBaseOpCapacity ? kBaseOpCapacity : kFullOpCapacity;
- }
-
- //! Calculates the size of \ref InstNode required to hold at most `opCapacity` operands.
- //!
- //! This function is used internally to allocate \ref InstNode.
- static ASMJIT_INLINE_NODEBUG constexpr size_t nodeSizeOfOpCapacity(uint32_t opCapacity) noexcept {
- return sizeof(InstNode) + opCapacity * sizeof(Operand);
- }
- //! \endcond
-
- //! \}
-};
-
-//! Instruction node with embedded operands following \ref InstNode layout.
-//!
-//! \note This is used to make tools such as static analysis and compilers happy about the layout. There were two
-//! instruction nodes in the past, having the second extend the operand array of the first, but that has caused
-//! undefined behavior and made recent tools unhappy about that.
-template<uint32_t kN>
-class InstNodeWithOperands : public InstNode {
-public:
- Operand_ _operands[kN];
-
- //! Creates a new `InstNodeWithOperands` instance.
- ASMJIT_INLINE_NODEBUG InstNodeWithOperands(BaseBuilder* cb, InstId instId, InstOptions options, uint32_t opCount) noexcept
- : InstNode(cb, instId, options, opCount, kN) {}
-};
-
-//! Section node.
-class SectionNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(SectionNode)
-
- //! \name Members
- //! \{
-
- //! Section id.
- uint32_t _id;
-
- //! Next section node that follows this section.
- //!
- //! This link is only valid when the section is active (is part of the code) and when `Builder::hasDirtySectionLinks()`
- //! returns `false`. If you intend to use this field you should always call `Builder::updateSectionLinks()` before you
- //! do so.
- SectionNode* _nextSection;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `SectionNode` instance.
- ASMJIT_INLINE_NODEBUG SectionNode(BaseBuilder* cb, uint32_t sectionId = 0) noexcept
- : BaseNode(cb, NodeType::kSection, NodeFlags::kHasNoEffect),
- _id(sectionId),
- _nextSection(nullptr) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the section id.
- ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; }
-
- //! \}
-};
-
-//! Label node.
-class LabelNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(LabelNode)
-
- //! \name Members
- //! \{
-
- //! Label identifier.
- uint32_t _labelId;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `LabelNode` instance.
- ASMJIT_INLINE_NODEBUG LabelNode(BaseBuilder* cb, uint32_t labelId = 0) noexcept
- : BaseNode(cb, NodeType::kLabel, NodeFlags::kHasNoEffect | NodeFlags::kActsAsLabel),
- _labelId(labelId) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns \ref Label representation of the \ref LabelNode.
- ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_labelId); }
- //! Returns the id of the label.
- ASMJIT_INLINE_NODEBUG uint32_t labelId() const noexcept { return _labelId; }
-
- //! \}
-};
-
-//! Align directive (BaseBuilder).
-//!
-//! Wraps `.align` directive.
-class AlignNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(AlignNode)
-
- //! \name Members
- //! \{
-
- //! Alignment (in bytes).
- uint32_t _alignment;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `AlignNode` instance.
- ASMJIT_INLINE_NODEBUG AlignNode(BaseBuilder* cb, AlignMode alignMode, uint32_t alignment) noexcept
- : BaseNode(cb, NodeType::kAlign, NodeFlags::kIsCode | NodeFlags::kHasNoEffect) {
-
- _alignData._alignMode = alignMode;
- _alignment = alignment;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns align mode.
- ASMJIT_INLINE_NODEBUG AlignMode alignMode() const noexcept { return _alignData._alignMode; }
- //! Sets align mode to `alignMode`.
- ASMJIT_INLINE_NODEBUG void setAlignMode(AlignMode alignMode) noexcept { _alignData._alignMode = alignMode; }
-
- //! Returns align offset in bytes.
- ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
- //! Sets align offset in bytes to `offset`.
- ASMJIT_INLINE_NODEBUG void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; }
-
- //! \}
-};
-
-//! Embed data node.
-//!
-//! Wraps `.data` directive. The node contains data that will be placed at the node's position in the assembler
-//! stream. The data is considered to be RAW; no analysis nor byte-order conversion is performed on RAW data.
-class EmbedDataNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(EmbedDataNode)
-
- //! \cond INTERNAL
- enum : uint32_t {
- kInlineBufferSize = 128 - (sizeof(BaseNode) + sizeof(size_t) * 2)
- };
- //! \endcond
-
- //! \name Members
- //! \{
-
- size_t _itemCount;
- size_t _repeatCount;
-
- union {
- uint8_t* _externalData;
- uint8_t _inlineData[kInlineBufferSize];
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `EmbedDataNode` instance.
- ASMJIT_INLINE_NODEBUG EmbedDataNode(BaseBuilder* cb) noexcept
- : BaseNode(cb, NodeType::kEmbedData, NodeFlags::kIsData),
- _itemCount(0),
- _repeatCount(0) {
- _embed._typeId = TypeId::kUInt8;
- _embed._typeSize = uint8_t(1);
- memset(_inlineData, 0, kInlineBufferSize);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns data type as \ref TypeId.
- ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return _embed._typeId; }
- //! Returns the size of a single data element.
- ASMJIT_INLINE_NODEBUG uint32_t typeSize() const noexcept { return _embed._typeSize; }
-
- //! Returns a pointer to the data casted to `uint8_t`.
- ASMJIT_INLINE_NODEBUG uint8_t* data() const noexcept {
- return dataSize() <= kInlineBufferSize ? const_cast<uint8_t*>(_inlineData) : _externalData;
- }
-
- //! Returns a pointer to the data casted to `T`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* dataAs() const noexcept { return reinterpret_cast<T*>(data()); }
-
- //! Returns the number of (typed) items in the array.
- ASMJIT_INLINE_NODEBUG size_t itemCount() const noexcept { return _itemCount; }
-
- //! Returns how many times the data is repeated (default 1).
- //!
- //! Repeated data is useful when defining constants for SIMD, for example.
- ASMJIT_INLINE_NODEBUG size_t repeatCount() const noexcept { return _repeatCount; }
-
- //! Returns the size of the data, not considering the number of times it repeats.
- //!
- //! \note The returned value is the same as `typeSize() * itemCount()`.
- ASMJIT_INLINE_NODEBUG size_t dataSize() const noexcept { return typeSize() * _itemCount; }
-
- //! \}
-};
-
-//! Label data node.
-class EmbedLabelNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(EmbedLabelNode)
-
- //! \name Members
- //! \{
-
- uint32_t _labelId;
- uint32_t _dataSize;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `EmbedLabelNode` instance.
- ASMJIT_INLINE_NODEBUG EmbedLabelNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t dataSize = 0) noexcept
- : BaseNode(cb, NodeType::kEmbedLabel, NodeFlags::kIsData),
- _labelId(labelId),
- _dataSize(dataSize) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the label to embed as \ref Label operand.
- ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_labelId); }
- //! Returns the id of the label.
- ASMJIT_INLINE_NODEBUG uint32_t labelId() const noexcept { return _labelId; }
-
- //! Sets the label id from `label` operand.
- ASMJIT_INLINE_NODEBUG void setLabel(const Label& label) noexcept { setLabelId(label.id()); }
- //! Sets the label id (use with caution, improper use can break a lot of things).
- ASMJIT_INLINE_NODEBUG void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; }
-
- //! Returns the data size.
- ASMJIT_INLINE_NODEBUG uint32_t dataSize() const noexcept { return _dataSize; }
- //! Sets the data size.
- ASMJIT_INLINE_NODEBUG void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; }
-
- //! \}
-};
-
-//! Label data node.
-class EmbedLabelDeltaNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(EmbedLabelDeltaNode)
-
- //! \name Members
- //! \{
-
- uint32_t _labelId;
- uint32_t _baseLabelId;
- uint32_t _dataSize;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `EmbedLabelDeltaNode` instance.
- ASMJIT_INLINE_NODEBUG EmbedLabelDeltaNode(BaseBuilder* cb, uint32_t labelId = 0, uint32_t baseLabelId = 0, uint32_t dataSize = 0) noexcept
- : BaseNode(cb, NodeType::kEmbedLabelDelta, NodeFlags::kIsData),
- _labelId(labelId),
- _baseLabelId(baseLabelId),
- _dataSize(dataSize) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the label as `Label` operand.
- ASMJIT_INLINE_NODEBUG Label label() const noexcept { return Label(_labelId); }
- //! Returns the id of the label.
- ASMJIT_INLINE_NODEBUG uint32_t labelId() const noexcept { return _labelId; }
-
- //! Sets the label id from `label` operand.
- ASMJIT_INLINE_NODEBUG void setLabel(const Label& label) noexcept { setLabelId(label.id()); }
- //! Sets the label id.
- ASMJIT_INLINE_NODEBUG void setLabelId(uint32_t labelId) noexcept { _labelId = labelId; }
-
- //! Returns the base label as `Label` operand.
- ASMJIT_INLINE_NODEBUG Label baseLabel() const noexcept { return Label(_baseLabelId); }
- //! Returns the id of the base label.
- ASMJIT_INLINE_NODEBUG uint32_t baseLabelId() const noexcept { return _baseLabelId; }
-
- //! Sets the base label id from `label` operand.
- ASMJIT_INLINE_NODEBUG void setBaseLabel(const Label& baseLabel) noexcept { setBaseLabelId(baseLabel.id()); }
- //! Sets the base label id.
- ASMJIT_INLINE_NODEBUG void setBaseLabelId(uint32_t baseLabelId) noexcept { _baseLabelId = baseLabelId; }
-
- //! Returns the size of the embedded label address.
- ASMJIT_INLINE_NODEBUG uint32_t dataSize() const noexcept { return _dataSize; }
- //! Sets the size of the embedded label address.
- ASMJIT_INLINE_NODEBUG void setDataSize(uint32_t dataSize) noexcept { _dataSize = dataSize; }
-
- //! \}
-};
-
-//! A node that wraps `ConstPool`.
-class ConstPoolNode : public LabelNode {
-public:
- ASMJIT_NONCOPYABLE(ConstPoolNode)
-
- //! \name Members
- //! \{
-
- ConstPool _constPool;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `ConstPoolNode` instance.
- ASMJIT_INLINE_NODEBUG ConstPoolNode(BaseBuilder* cb, uint32_t id = 0) noexcept
- : LabelNode(cb, id),
- _constPool(&cb->_codeZone) {
-
- setType(NodeType::kConstPool);
- addFlags(NodeFlags::kIsData);
- clearFlags(NodeFlags::kIsCode | NodeFlags::kHasNoEffect);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the constant-pool is empty.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _constPool.empty(); }
- //! Returns the size of the constant-pool in bytes.
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _constPool.size(); }
- //! Returns minimum alignment.
- ASMJIT_INLINE_NODEBUG size_t alignment() const noexcept { return _constPool.alignment(); }
-
- //! Returns the wrapped `ConstPool` instance.
- ASMJIT_INLINE_NODEBUG ConstPool& constPool() noexcept { return _constPool; }
- //! Returns the wrapped `ConstPool` instance (const).
- ASMJIT_INLINE_NODEBUG const ConstPool& constPool() const noexcept { return _constPool; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! See `ConstPool::add()`.
- ASMJIT_INLINE_NODEBUG Error add(const void* data, size_t size, size_t& dstOffset) noexcept {
- return _constPool.add(data, size, dstOffset);
- }
-
- //! \}
-};
-
-//! Comment node.
-class CommentNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(CommentNode)
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `CommentNode` instance.
- ASMJIT_INLINE_NODEBUG CommentNode(BaseBuilder* cb, const char* comment) noexcept
- : BaseNode(cb, NodeType::kComment, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect | NodeFlags::kIsRemovable) {
- _inlineComment = comment;
- }
-
- //! \}
-};
-
-//! Sentinel node.
-//!
-//! Sentinel is a marker that is completely ignored by the code builder. It's used to remember a position in a code
-//! as it never gets removed by any pass.
-class SentinelNode : public BaseNode {
-public:
- ASMJIT_NONCOPYABLE(SentinelNode)
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `SentinelNode` instance.
- ASMJIT_INLINE_NODEBUG SentinelNode(BaseBuilder* cb, SentinelType sentinelType = SentinelType::kUnknown) noexcept
- : BaseNode(cb, NodeType::kSentinel, NodeFlags::kIsInformative | NodeFlags::kHasNoEffect) {
-
- _sentinel._sentinelType = sentinelType;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the type of the sentinel.
- ASMJIT_INLINE_NODEBUG SentinelType sentinelType() const noexcept {
- return _sentinel._sentinelType;
- }
-
- //! Sets the type of the sentinel.
- ASMJIT_INLINE_NODEBUG void setSentinelType(SentinelType type) noexcept {
- _sentinel._sentinelType = type;
- }
-
- //! \}
-};
-
-//! Pass can be used to implement code transformations, analysis, and lowering.
-class ASMJIT_VIRTAPI Pass {
-public:
- ASMJIT_BASE_CLASS(Pass)
- ASMJIT_NONCOPYABLE(Pass)
-
- //! \name Members
- //! \{
-
- //! BaseBuilder this pass is assigned to.
- BaseBuilder* _cb = nullptr;
- //! Name of the pass.
- const char* _name = nullptr;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API Pass(const char* name) noexcept;
- ASMJIT_API virtual ~Pass() noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns \ref BaseBuilder associated with the pass.
- ASMJIT_INLINE_NODEBUG const BaseBuilder* cb() const noexcept { return _cb; }
- //! Returns the name of the pass.
- ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name; }
-
- //! \}
-
- //! \name Pass Interface
- //! \{
-
- //! Processes the code stored in Builder or Compiler.
- //!
- //! This is the only function that is called by the `BaseBuilder` to process the code. It passes `zone`,
- //! which will be reset after the `run()` finishes.
- ASMJIT_API virtual Error run(Zone* zone, Logger* logger);
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_BUILDER
-#endif // ASMJIT_CORE_BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/builder_p.h b/3rdparty/asmjit/src/asmjit/core/builder_p.h
deleted file mode 100644
index 98790fdf95f..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/builder_p.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_BUILDER_P_H_INCLUDED
-#define ASMJIT_CORE_BUILDER_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_BUILDER
-
-#include "../core/builder.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_builder
-//! \{
-
-static inline void BaseBuilder_assignInlineComment(BaseBuilder* self, BaseNode* node, const char* comment) noexcept {
- if (comment)
- node->setInlineComment(static_cast<char*>(self->_dataZone.dup(comment, strlen(comment), true)));
-}
-
-static inline void BaseBuilder_assignInstState(BaseBuilder* self, InstNode* node, const BaseEmitter::State& state) noexcept {
- node->setOptions(state.options);
- node->setExtraReg(state.extraReg);
- BaseBuilder_assignInlineComment(self, node, state.comment);
-}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_BUILDER
-#endif // ASMJIT_CORE_BUILDER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/codeholder.cpp b/3rdparty/asmjit/src/asmjit/core/codeholder.cpp
deleted file mode 100644
index 63b15a3ada3..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/codeholder.cpp
+++ /dev/null
@@ -1,1156 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/assembler.h"
-#include "../core/codewriter_p.h"
-#include "../core/logger.h"
-#include "../core/support.h"
-
-#include <algorithm>
-#include <tuple>
-
-ASMJIT_BEGIN_NAMESPACE
-
-// Globals
-// =======
-
-static const char CodeHolder_addrTabName[] = ".addrtab";
-
-//! Encode MOD byte.
-static inline uint32_t x86EncodeMod(uint32_t m, uint32_t o, uint32_t rm) noexcept {
- return (m << 6) | (o << 3) | rm;
-}
-
-// LabelLinkIterator
-// =================
-
-class LabelLinkIterator {
-public:
- inline LabelLinkIterator(LabelEntry* le) noexcept { reset(le); }
-
- inline explicit operator bool() const noexcept { return isValid(); }
- inline bool isValid() const noexcept { return _link != nullptr; }
-
- inline LabelLink* link() const noexcept { return _link; }
- inline LabelLink* operator->() const noexcept { return _link; }
-
- inline void reset(LabelEntry* le) noexcept {
- _pPrev = &le->_links;
- _link = *_pPrev;
- }
-
- inline void next() noexcept {
- _pPrev = &_link->next;
- _link = *_pPrev;
- }
-
- inline void resolveAndNext(CodeHolder* code) noexcept {
- LabelLink* linkToDelete = _link;
-
- _link = _link->next;
- *_pPrev = _link;
-
- code->_unresolvedLinkCount--;
- code->_allocator.release(linkToDelete, sizeof(LabelLink));
- }
-
- LabelLink** _pPrev;
- LabelLink* _link;
-};
-
-// CodeHolder - Utilities
-// ======================
-
-static void CodeHolder_resetInternal(CodeHolder* self, ResetPolicy resetPolicy) noexcept {
- uint32_t i;
- const ZoneVector<BaseEmitter*>& emitters = self->emitters();
-
- i = emitters.size();
- while (i)
- self->detach(emitters[--i]);
-
- // Reset everything into its construction state.
- self->_environment.reset();
- self->_cpuFeatures.reset();
- self->_baseAddress = Globals::kNoBaseAddress;
- self->_logger = nullptr;
- self->_errorHandler = nullptr;
-
- // Reset all sections.
- uint32_t numSections = self->_sections.size();
- for (i = 0; i < numSections; i++) {
- Section* section = self->_sections[i];
- if (section->_buffer.data() && !section->_buffer.isExternal())
- ::free(section->_buffer._data);
- section->_buffer._data = nullptr;
- section->_buffer._capacity = 0;
- }
-
- // Reset zone allocator and all containers using it.
- ZoneAllocator* allocator = self->allocator();
-
- self->_emitters.reset();
- self->_namedLabels.reset();
- self->_relocations.reset();
- self->_labelEntries.reset();
- self->_sections.reset();
- self->_sectionsByOrder.reset();
-
- self->_unresolvedLinkCount = 0;
- self->_addressTableSection = nullptr;
- self->_addressTableEntries.reset();
-
- allocator->reset(&self->_zone);
- self->_zone.reset(resetPolicy);
-}
-
-static void CodeHolder_onSettingsUpdated(CodeHolder* self) noexcept {
- // Notify all attached emitters about a settings update.
- for (BaseEmitter* emitter : self->emitters()) {
- emitter->onSettingsUpdated();
- }
-}
-
-// CodeHolder - Construction & Destruction
-// =======================================
-
-CodeHolder::CodeHolder(const Support::Temporary* temporary) noexcept
- : _environment(),
- _cpuFeatures{},
- _baseAddress(Globals::kNoBaseAddress),
- _logger(nullptr),
- _errorHandler(nullptr),
- _zone(16384 - Zone::kBlockOverhead, 1, temporary),
- _allocator(&_zone),
- _unresolvedLinkCount(0),
- _addressTableSection(nullptr) {}
-
-CodeHolder::~CodeHolder() noexcept {
- CodeHolder_resetInternal(this, ResetPolicy::kHard);
-}
-
-// CodeHolder - Initialization & Reset
-// ===================================
-
-inline void CodeHolder_setSectionDefaultName(
- Section* section,
- char c0 = 0, char c1 = 0, char c2 = 0, char c3 = 0,
- char c4 = 0, char c5 = 0, char c6 = 0, char c7 = 0) noexcept {
-
- section->_name.u32[0] = Support::bytepack32_4x8(uint8_t(c0), uint8_t(c1), uint8_t(c2), uint8_t(c3));
- section->_name.u32[1] = Support::bytepack32_4x8(uint8_t(c4), uint8_t(c5), uint8_t(c6), uint8_t(c7));
-}
-
-Error CodeHolder::init(const Environment& environment, uint64_t baseAddress) noexcept {
- return init(environment, CpuFeatures{}, baseAddress);
-}
-
-Error CodeHolder::init(const Environment& environment, const CpuFeatures& cpuFeatures, uint64_t baseAddress) noexcept {
- // Cannot reinitialize if it's locked or there is one or more emitter attached.
- if (isInitialized())
- return DebugUtils::errored(kErrorAlreadyInitialized);
-
- // If we are just initializing there should be no emitters attached.
- ASMJIT_ASSERT(_emitters.empty());
-
- // Create a default section and insert it to the `_sections` array.
- Error err = _sections.willGrow(&_allocator) |
- _sectionsByOrder.willGrow(&_allocator);
- if (err == kErrorOk) {
- Section* section = _allocator.allocZeroedT<Section>();
- if (ASMJIT_LIKELY(section)) {
- section->_flags = SectionFlags::kExecutable | SectionFlags::kReadOnly;
- CodeHolder_setSectionDefaultName(section, '.', 't', 'e', 'x', 't');
- _sections.appendUnsafe(section);
- _sectionsByOrder.appendUnsafe(section);
- }
- else {
- err = DebugUtils::errored(kErrorOutOfMemory);
- }
- }
-
- if (ASMJIT_UNLIKELY(err)) {
- _zone.reset();
- return err;
- }
- else {
- _environment = environment;
- _cpuFeatures = cpuFeatures;
- _baseAddress = baseAddress;
- return kErrorOk;
- }
-}
-
-void CodeHolder::reset(ResetPolicy resetPolicy) noexcept {
- CodeHolder_resetInternal(this, resetPolicy);
-}
-
-// CodeHolder - Attach / Detach
-// ============================
-
-Error CodeHolder::attach(BaseEmitter* emitter) noexcept {
- // Catch a possible misuse of the API.
- if (ASMJIT_UNLIKELY(!emitter))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- // Invalid emitter, this should not be possible.
- EmitterType type = emitter->emitterType();
- if (ASMJIT_UNLIKELY(type == EmitterType::kNone || uint32_t(type) > uint32_t(EmitterType::kMaxValue)))
- return DebugUtils::errored(kErrorInvalidState);
-
- uint64_t archMask = emitter->_archMask;
- if (ASMJIT_UNLIKELY(!(archMask & (uint64_t(1) << uint32_t(arch())))))
- return DebugUtils::errored(kErrorInvalidArch);
-
- // This is suspicious, but don't fail if `emitter` is already attached
- // to this code holder. This is not error, but it's not recommended.
- if (emitter->_code != nullptr) {
- if (emitter->_code == this)
- return kErrorOk;
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- // Reserve the space now as we cannot fail after `onAttach()` succeeded.
- ASMJIT_PROPAGATE(_emitters.willGrow(&_allocator, 1));
- ASMJIT_PROPAGATE(emitter->onAttach(this));
-
- // Connect CodeHolder <-> BaseEmitter.
- ASMJIT_ASSERT(emitter->_code == this);
- _emitters.appendUnsafe(emitter);
-
- return kErrorOk;
-}
-
-Error CodeHolder::detach(BaseEmitter* emitter) noexcept {
- if (ASMJIT_UNLIKELY(!emitter))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- if (ASMJIT_UNLIKELY(emitter->_code != this))
- return DebugUtils::errored(kErrorInvalidState);
-
- // NOTE: We always detach if we were asked to, if error happens during
- // `emitter->onDetach()` we just propagate it, but the BaseEmitter will
- // be detached.
- Error err = kErrorOk;
- if (!emitter->isDestroyed())
- err = emitter->onDetach(this);
-
- // Disconnect CodeHolder <-> BaseEmitter.
- uint32_t index = _emitters.indexOf(emitter);
- ASMJIT_ASSERT(index != Globals::kNotFound);
-
- _emitters.removeAt(index);
- emitter->_code = nullptr;
-
- return err;
-}
-
-// CodeHolder - Logging
-// ====================
-
-void CodeHolder::setLogger(Logger* logger) noexcept {
-#ifndef ASMJIT_NO_LOGGING
- _logger = logger;
- CodeHolder_onSettingsUpdated(this);
-#else
- DebugUtils::unused(logger);
-#endif
-}
-
-// CodeHolder - Error Handling
-// ===========================
-
-void CodeHolder::setErrorHandler(ErrorHandler* errorHandler) noexcept {
- _errorHandler = errorHandler;
- CodeHolder_onSettingsUpdated(this);
-}
-
-// CodeHolder - Code Buffer
-// ========================
-
-static Error CodeHolder_reserveInternal(CodeHolder* self, CodeBuffer* cb, size_t n) noexcept {
- uint8_t* oldData = cb->_data;
- uint8_t* newData;
-
- if (oldData && !cb->isExternal())
- newData = static_cast<uint8_t*>(::realloc(oldData, n));
- else
- newData = static_cast<uint8_t*>(::malloc(n));
-
- if (ASMJIT_UNLIKELY(!newData))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- cb->_data = newData;
- cb->_capacity = n;
-
- // Update pointers used by assemblers, if attached.
- for (BaseEmitter* emitter : self->emitters()) {
- if (emitter->isAssembler()) {
- BaseAssembler* a = static_cast<BaseAssembler*>(emitter);
- if (&a->_section->_buffer == cb) {
- size_t offset = a->offset();
-
- a->_bufferData = newData;
- a->_bufferEnd = newData + n;
- a->_bufferPtr = newData + offset;
- }
- }
- }
-
- return kErrorOk;
-}
-
-Error CodeHolder::growBuffer(CodeBuffer* cb, size_t n) noexcept {
- // The size of the section must be valid.
- size_t size = cb->size();
- if (ASMJIT_UNLIKELY(n > std::numeric_limits<uintptr_t>::max() - size))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // We can now check if growing the buffer is really necessary. It's unlikely
- // that this function is called while there is still room for `n` bytes.
- size_t capacity = cb->capacity();
- size_t required = cb->size() + n;
- if (ASMJIT_UNLIKELY(required <= capacity))
- return kErrorOk;
-
- if (cb->isFixed())
- return DebugUtils::errored(kErrorTooLarge);
-
- size_t kInitialCapacity = 8096;
- if (capacity < kInitialCapacity)
- capacity = kInitialCapacity;
- else
- capacity += Globals::kAllocOverhead;
-
- do {
- size_t old = capacity;
- if (capacity < Globals::kGrowThreshold)
- capacity *= 2;
- else
- capacity += Globals::kGrowThreshold;
-
- // Overflow.
- if (ASMJIT_UNLIKELY(old > capacity))
- return DebugUtils::errored(kErrorOutOfMemory);
- } while (capacity - Globals::kAllocOverhead < required);
-
- return CodeHolder_reserveInternal(this, cb, capacity - Globals::kAllocOverhead);
-}
-
-Error CodeHolder::reserveBuffer(CodeBuffer* cb, size_t n) noexcept {
- size_t capacity = cb->capacity();
-
- if (n <= capacity)
- return kErrorOk;
-
- if (cb->isFixed())
- return DebugUtils::errored(kErrorTooLarge);
-
- return CodeHolder_reserveInternal(this, cb, n);
-}
-
-// CodeHolder - Sections
-// =====================
-
-Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t nameSize, SectionFlags flags, uint32_t alignment, int32_t order) noexcept {
- *sectionOut = nullptr;
-
- if (nameSize == SIZE_MAX)
- nameSize = strlen(name);
-
- if (alignment == 0)
- alignment = 1;
-
- if (ASMJIT_UNLIKELY(!Support::isPowerOf2(alignment)))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- if (ASMJIT_UNLIKELY(nameSize > Globals::kMaxSectionNameSize))
- return DebugUtils::errored(kErrorInvalidSectionName);
-
- uint32_t sectionId = _sections.size();
- if (ASMJIT_UNLIKELY(sectionId == Globals::kInvalidId))
- return DebugUtils::errored(kErrorTooManySections);
-
- ASMJIT_PROPAGATE(_sections.willGrow(&_allocator));
- ASMJIT_PROPAGATE(_sectionsByOrder.willGrow(&_allocator));
-
- Section* section = _allocator.allocZeroedT<Section>();
- if (ASMJIT_UNLIKELY(!section))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- section->_id = sectionId;
- section->_flags = flags;
- section->_alignment = alignment;
- section->_order = order;
- memcpy(section->_name.str, name, nameSize);
-
- Section** insertPosition = std::lower_bound(_sectionsByOrder.begin(), _sectionsByOrder.end(), section, [](const Section* a, const Section* b) {
- return std::make_tuple(a->order(), a->id()) < std::make_tuple(b->order(), b->id());
- });
-
- _sections.appendUnsafe(section);
- _sectionsByOrder.insertUnsafe((size_t)(insertPosition - _sectionsByOrder.data()), section);
-
- *sectionOut = section;
- return kErrorOk;
-}
-
-Section* CodeHolder::sectionByName(const char* name, size_t nameSize) const noexcept {
- if (nameSize == SIZE_MAX)
- nameSize = strlen(name);
-
- // This could be also put in a hash-table similarly like we do with labels,
- // however it's questionable as the number of sections should be pretty low
- // in general. Create an issue if this becomes a problem.
- if (nameSize <= Globals::kMaxSectionNameSize) {
- for (Section* section : _sections)
- if (memcmp(section->_name.str, name, nameSize) == 0 && section->_name.str[nameSize] == '\0')
- return section;
- }
-
- return nullptr;
-}
-
-Section* CodeHolder::ensureAddressTableSection() noexcept {
- if (_addressTableSection)
- return _addressTableSection;
-
- newSection(&_addressTableSection,
- CodeHolder_addrTabName,
- sizeof(CodeHolder_addrTabName) - 1,
- SectionFlags::kNone,
- _environment.registerSize(),
- std::numeric_limits<int32_t>::max());
- return _addressTableSection;
-}
-
-Error CodeHolder::addAddressToAddressTable(uint64_t address) noexcept {
- AddressTableEntry* entry = _addressTableEntries.get(address);
- if (entry)
- return kErrorOk;
-
- Section* section = ensureAddressTableSection();
- if (ASMJIT_UNLIKELY(!section))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- entry = _zone.newT<AddressTableEntry>(address);
- if (ASMJIT_UNLIKELY(!entry))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _addressTableEntries.insert(entry);
- section->_virtualSize += _environment.registerSize();
-
- return kErrorOk;
-}
-
-// CodeHolder - Labels & Symbols
-// =============================
-
-//! Only used to lookup a label from `_namedLabels`.
-class LabelByName {
-public:
- inline LabelByName(const char* key, size_t keySize, uint32_t hashCode, uint32_t parentId) noexcept
- : _key(key),
- _keySize(uint32_t(keySize)),
- _hashCode(hashCode),
- _parentId(parentId) {}
-
- inline uint32_t hashCode() const noexcept { return _hashCode; }
-
- inline bool matches(const LabelEntry* entry) const noexcept {
- return entry->nameSize() == _keySize &&
- entry->parentId() == _parentId &&
- ::memcmp(entry->name(), _key, _keySize) == 0;
- }
-
- const char* _key;
- uint32_t _keySize;
- uint32_t _hashCode;
- uint32_t _parentId;
-};
-
-// Returns a hash of `name` and fixes `nameSize` if it's `SIZE_MAX`.
-static uint32_t CodeHolder_hashNameAndGetSize(const char* name, size_t& nameSize) noexcept {
- uint32_t hashCode = 0;
- if (nameSize == SIZE_MAX) {
- size_t i = 0;
- for (;;) {
- uint8_t c = uint8_t(name[i]);
- if (!c) break;
- hashCode = Support::hashRound(hashCode, c);
- i++;
- }
- nameSize = i;
- }
- else {
- for (size_t i = 0; i < nameSize; i++) {
- uint8_t c = uint8_t(name[i]);
- if (ASMJIT_UNLIKELY(!c)) return DebugUtils::errored(kErrorInvalidLabelName);
- hashCode = Support::hashRound(hashCode, c);
- }
- }
- return hashCode;
-}
-
-LabelLink* CodeHolder::newLabelLink(LabelEntry* le, uint32_t sectionId, size_t offset, intptr_t rel, const OffsetFormat& format) noexcept {
- LabelLink* link = _allocator.allocT<LabelLink>();
- if (ASMJIT_UNLIKELY(!link)) return nullptr;
-
- link->next = le->_links;
- le->_links = link;
-
- link->sectionId = sectionId;
- link->relocId = Globals::kInvalidId;
- link->offset = offset;
- link->rel = rel;
- link->format = format;
-
- _unresolvedLinkCount++;
- return link;
-}
-
-Error CodeHolder::newLabelEntry(LabelEntry** entryOut) noexcept {
- *entryOut = nullptr;
-
- uint32_t labelId = _labelEntries.size();
- if (ASMJIT_UNLIKELY(labelId == Globals::kInvalidId))
- return DebugUtils::errored(kErrorTooManyLabels);
-
- ASMJIT_PROPAGATE(_labelEntries.willGrow(&_allocator));
- LabelEntry* le = _allocator.allocZeroedT<LabelEntry>();
-
- if (ASMJIT_UNLIKELY(!le))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- le->_setId(labelId);
- le->_parentId = Globals::kInvalidId;
- le->_offset = 0;
- _labelEntries.appendUnsafe(le);
-
- *entryOut = le;
- return kErrorOk;
-}
-
-Error CodeHolder::newNamedLabelEntry(LabelEntry** entryOut, const char* name, size_t nameSize, LabelType type, uint32_t parentId) noexcept {
- *entryOut = nullptr;
- uint32_t hashCode = CodeHolder_hashNameAndGetSize(name, nameSize);
-
- if (ASMJIT_UNLIKELY(nameSize == 0)) {
- if (type == LabelType::kAnonymous)
- return newLabelEntry(entryOut);
- else
- return DebugUtils::errored(kErrorInvalidLabelName);
- }
-
- if (ASMJIT_UNLIKELY(nameSize > Globals::kMaxLabelNameSize))
- return DebugUtils::errored(kErrorLabelNameTooLong);
-
- switch (type) {
- case LabelType::kAnonymous: {
- // Anonymous labels cannot have a parent (or more specifically, parent is useless here).
- if (ASMJIT_UNLIKELY(parentId != Globals::kInvalidId))
- return DebugUtils::errored(kErrorInvalidParentLabel);
-
- uint32_t labelId = _labelEntries.size();
- if (ASMJIT_UNLIKELY(labelId == Globals::kInvalidId))
- return DebugUtils::errored(kErrorTooManyLabels);
-
- ASMJIT_PROPAGATE(_labelEntries.willGrow(&_allocator));
- LabelEntry* le = _allocator.allocZeroedT<LabelEntry>();
-
- if (ASMJIT_UNLIKELY(!le))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // NOTE: This LabelEntry has a name, but we leave its hashCode as zero as it's anonymous.
- le->_setId(labelId);
- le->_parentId = Globals::kInvalidId;
- le->_offset = 0;
- ASMJIT_PROPAGATE(le->_name.setData(&_zone, name, nameSize));
-
- _labelEntries.appendUnsafe(le);
-
- *entryOut = le;
- return kErrorOk;
- }
-
- case LabelType::kLocal: {
- if (ASMJIT_UNLIKELY(parentId >= _labelEntries.size()))
- return DebugUtils::errored(kErrorInvalidParentLabel);
-
- hashCode ^= parentId;
- break;
- }
-
- case LabelType::kGlobal:
- case LabelType::kExternal: {
- if (ASMJIT_UNLIKELY(parentId != Globals::kInvalidId))
- return DebugUtils::errored(kErrorInvalidParentLabel);
- break;
- }
-
- default: {
- return DebugUtils::errored(kErrorInvalidArgument);
- }
- }
-
- // Don't allow to insert duplicates. Local labels allow duplicates that have
- // different id, this is already accomplished by having a different hashes
- // between the same label names having different parent labels.
- LabelEntry* le = _namedLabels.get(LabelByName(name, nameSize, hashCode, parentId));
- if (ASMJIT_UNLIKELY(le))
- return DebugUtils::errored(kErrorLabelAlreadyDefined);
-
- Error err = kErrorOk;
- uint32_t labelId = _labelEntries.size();
-
- if (ASMJIT_UNLIKELY(labelId == Globals::kInvalidId))
- return DebugUtils::errored(kErrorTooManyLabels);
-
- ASMJIT_PROPAGATE(_labelEntries.willGrow(&_allocator));
- le = _allocator.allocZeroedT<LabelEntry>();
-
- if (ASMJIT_UNLIKELY(!le))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- le->_hashCode = hashCode;
- le->_setId(labelId);
- le->_type = type;
- le->_parentId = parentId;
- le->_offset = 0;
- ASMJIT_PROPAGATE(le->_name.setData(&_zone, name, nameSize));
-
- _labelEntries.appendUnsafe(le);
- _namedLabels.insert(allocator(), le);
-
- *entryOut = le;
- return err;
-}
-
-uint32_t CodeHolder::labelIdByName(const char* name, size_t nameSize, uint32_t parentId) noexcept {
- uint32_t hashCode = CodeHolder_hashNameAndGetSize(name, nameSize);
- if (ASMJIT_UNLIKELY(!nameSize))
- return 0;
-
- if (parentId != Globals::kInvalidId)
- hashCode ^= parentId;
-
- LabelEntry* le = _namedLabels.get(LabelByName(name, nameSize, hashCode, parentId));
- return le ? le->id() : uint32_t(Globals::kInvalidId);
-}
-
-ASMJIT_API Error CodeHolder::resolveUnresolvedLinks() noexcept {
- if (!hasUnresolvedLinks())
- return kErrorOk;
-
- Error err = kErrorOk;
- for (LabelEntry* le : labelEntries()) {
- if (!le->isBound())
- continue;
-
- LabelLinkIterator link(le);
- if (link) {
- Support::FastUInt8 of = 0;
- Section* toSection = le->section();
- uint64_t toOffset = Support::addOverflow(toSection->offset(), le->offset(), &of);
-
- do {
- uint32_t linkSectionId = link->sectionId;
- if (link->relocId == Globals::kInvalidId) {
- Section* fromSection = sectionById(linkSectionId);
- size_t linkOffset = link->offset;
-
- CodeBuffer& buf = _sections[linkSectionId]->buffer();
- ASMJIT_ASSERT(linkOffset < buf.size());
-
- // Calculate the offset relative to the start of the virtual base.
- Support::FastUInt8 localOF = of;
- uint64_t fromOffset = Support::addOverflow<uint64_t>(fromSection->offset(), linkOffset, &localOF);
- int64_t displacement = int64_t(toOffset - fromOffset + uint64_t(int64_t(link->rel)));
-
- if (!localOF) {
- ASMJIT_ASSERT(size_t(linkOffset) < buf.size());
- ASMJIT_ASSERT(buf.size() - size_t(linkOffset) >= link->format.valueSize());
-
- // Overwrite a real displacement in the CodeBuffer.
- if (CodeWriterUtils::writeOffset(buf._data + linkOffset, displacement, link->format)) {
- link.resolveAndNext(this);
- continue;
- }
- }
-
- err = DebugUtils::errored(kErrorInvalidDisplacement);
- // Falls through to `link.next()`.
- }
-
- link.next();
- } while (link);
- }
- }
-
- return err;
-}
-
-ASMJIT_API Error CodeHolder::bindLabel(const Label& label, uint32_t toSectionId, uint64_t toOffset) noexcept {
- LabelEntry* le = labelEntry(label);
- if (ASMJIT_UNLIKELY(!le))
- return DebugUtils::errored(kErrorInvalidLabel);
-
- if (ASMJIT_UNLIKELY(toSectionId > _sections.size()))
- return DebugUtils::errored(kErrorInvalidSection);
-
- // Label can be bound only once.
- if (ASMJIT_UNLIKELY(le->isBound()))
- return DebugUtils::errored(kErrorLabelAlreadyBound);
-
- // Bind the label.
- Section* section = _sections[toSectionId];
- le->_section = section;
- le->_offset = toOffset;
-
- Error err = kErrorOk;
- CodeBuffer& buf = section->buffer();
-
- // Fix all links to this label we have collected so far if they are within
- // the same section. We ignore any inter-section links as these have to be
- // fixed later.
- LabelLinkIterator link(le);
- while (link) {
- uint32_t linkSectionId = link->sectionId;
- size_t linkOffset = link->offset;
-
- uint32_t relocId = link->relocId;
- if (relocId != Globals::kInvalidId) {
- // Adjust relocation data only.
- RelocEntry* re = _relocations[relocId];
- re->_payload += toOffset;
- re->_targetSectionId = toSectionId;
- }
- else {
- if (linkSectionId != toSectionId) {
- link.next();
- continue;
- }
-
- ASMJIT_ASSERT(linkOffset < buf.size());
- int64_t displacement = int64_t(toOffset - uint64_t(linkOffset) + uint64_t(int64_t(link->rel)));
-
- // Size of the value we are going to patch. Only BYTE/DWORD is allowed.
- ASMJIT_ASSERT(buf.size() - size_t(linkOffset) >= link->format.regionSize());
-
- // Overwrite a real displacement in the CodeBuffer.
- if (!CodeWriterUtils::writeOffset(buf._data + linkOffset, displacement, link->format)) {
- err = DebugUtils::errored(kErrorInvalidDisplacement);
- link.next();
- continue;
- }
- }
-
- link.resolveAndNext(this);
- }
-
- return err;
-}
-
-// CodeHolder - Relocations
-// ========================
-
-Error CodeHolder::newRelocEntry(RelocEntry** dst, RelocType relocType) noexcept {
- ASMJIT_PROPAGATE(_relocations.willGrow(&_allocator));
-
- uint32_t relocId = _relocations.size();
- if (ASMJIT_UNLIKELY(relocId == Globals::kInvalidId))
- return DebugUtils::errored(kErrorTooManyRelocations);
-
- RelocEntry* re = _allocator.allocZeroedT<RelocEntry>();
- if (ASMJIT_UNLIKELY(!re))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- re->_id = relocId;
- re->_relocType = relocType;
- re->_sourceSectionId = Globals::kInvalidId;
- re->_targetSectionId = Globals::kInvalidId;
- _relocations.appendUnsafe(re);
-
- *dst = re;
- return kErrorOk;
-}
-
-// CodeHolder - Expression Evaluation
-// ==================================
-
-static Error CodeHolder_evaluateExpression(CodeHolder* self, Expression* exp, uint64_t* out) noexcept {
- uint64_t value[2];
- for (size_t i = 0; i < 2; i++) {
- uint64_t v;
- switch (exp->valueType[i]) {
- case ExpressionValueType::kNone: {
- v = 0;
- break;
- }
-
- case ExpressionValueType::kConstant: {
- v = exp->value[i].constant;
- break;
- }
-
- case ExpressionValueType::kLabel: {
- LabelEntry* le = exp->value[i].label;
- if (!le->isBound())
- return DebugUtils::errored(kErrorExpressionLabelNotBound);
- v = le->section()->offset() + le->offset();
- break;
- }
-
- case ExpressionValueType::kExpression: {
- Expression* nested = exp->value[i].expression;
- ASMJIT_PROPAGATE(CodeHolder_evaluateExpression(self, nested, &v));
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- value[i] = v;
- }
-
- uint64_t result;
- uint64_t& a = value[0];
- uint64_t& b = value[1];
-
- switch (exp->opType) {
- case ExpressionOpType::kAdd:
- result = a + b;
- break;
-
- case ExpressionOpType::kSub:
- result = a - b;
- break;
-
- case ExpressionOpType::kMul:
- result = a * b;
- break;
-
- case ExpressionOpType::kSll:
- result = (b > 63) ? uint64_t(0) : uint64_t(a << b);
- break;
-
- case ExpressionOpType::kSrl:
- result = (b > 63) ? uint64_t(0) : uint64_t(a >> b);
- break;
-
- case ExpressionOpType::kSra:
- result = Support::sar(a, Support::min<uint64_t>(b, 63));
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- *out = result;
- return kErrorOk;
-}
-
-// CodeHolder - Utilities
-// ======================
-
-Error CodeHolder::flatten() noexcept {
- uint64_t offset = 0;
- for (Section* section : _sectionsByOrder) {
- uint64_t realSize = section->realSize();
- if (realSize) {
- uint64_t alignedOffset = Support::alignUp(offset, section->alignment());
- if (ASMJIT_UNLIKELY(alignedOffset < offset))
- return DebugUtils::errored(kErrorTooLarge);
-
- Support::FastUInt8 of = 0;
- offset = Support::addOverflow(alignedOffset, realSize, &of);
-
- if (ASMJIT_UNLIKELY(of))
- return DebugUtils::errored(kErrorTooLarge);
- }
- }
-
- // Now we know that we can assign offsets of all sections properly.
- Section* prev = nullptr;
- offset = 0;
- for (Section* section : _sectionsByOrder) {
- uint64_t realSize = section->realSize();
- if (realSize)
- offset = Support::alignUp(offset, section->alignment());
- section->_offset = offset;
-
- // Make sure the previous section extends a bit to cover the alignment.
- if (prev)
- prev->_virtualSize = offset - prev->_offset;
-
- prev = section;
- offset += realSize;
- }
-
- return kErrorOk;
-}
-
-size_t CodeHolder::codeSize() const noexcept {
- Support::FastUInt8 of = 0;
- uint64_t offset = 0;
-
- for (Section* section : _sectionsByOrder) {
- uint64_t realSize = section->realSize();
-
- if (realSize) {
- uint64_t alignedOffset = Support::alignUp(offset, section->alignment());
- ASMJIT_ASSERT(alignedOffset >= offset);
- offset = Support::addOverflow(alignedOffset, realSize, &of);
- }
- }
-
- if ((sizeof(uint64_t) > sizeof(size_t) && offset > uint64_t(SIZE_MAX)) || of)
- return SIZE_MAX;
-
- return size_t(offset);
-}
-
-Error CodeHolder::relocateToBase(uint64_t baseAddress) noexcept {
- // Base address must be provided.
- if (ASMJIT_UNLIKELY(baseAddress == Globals::kNoBaseAddress))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- _baseAddress = baseAddress;
- uint32_t addressSize = _environment.registerSize();
-
- Section* addressTableSection = _addressTableSection;
- uint32_t addressTableEntryCount = 0;
- uint8_t* addressTableEntryData = nullptr;
-
- if (addressTableSection) {
- ASMJIT_PROPAGATE(
- reserveBuffer(&addressTableSection->_buffer, size_t(addressTableSection->virtualSize())));
- addressTableEntryData = addressTableSection->_buffer.data();
- }
-
- // Relocate all recorded locations.
- for (const RelocEntry* re : _relocations) {
- // Possibly deleted or optimized-out entry.
- if (re->relocType() == RelocType::kNone)
- continue;
-
- Section* sourceSection = sectionById(re->sourceSectionId());
- Section* targetSection = nullptr;
-
- if (re->targetSectionId() != Globals::kInvalidId)
- targetSection = sectionById(re->targetSectionId());
-
- uint64_t value = re->payload();
- uint64_t sectionOffset = sourceSection->offset();
- uint64_t sourceOffset = re->sourceOffset();
-
- // Make sure that the `RelocEntry` doesn't go out of bounds.
- size_t regionSize = re->format().regionSize();
- if (ASMJIT_UNLIKELY(re->sourceOffset() >= sourceSection->bufferSize() ||
- sourceSection->bufferSize() - size_t(re->sourceOffset()) < regionSize))
- return DebugUtils::errored(kErrorInvalidRelocEntry);
-
- uint8_t* buffer = sourceSection->data();
-
- switch (re->relocType()) {
- case RelocType::kExpression: {
- Expression* expression = (Expression*)(uintptr_t(value));
- ASMJIT_PROPAGATE(CodeHolder_evaluateExpression(this, expression, &value));
- break;
- }
-
- case RelocType::kAbsToAbs: {
- break;
- }
-
- case RelocType::kRelToAbs: {
- // Value is currently a relative offset from the start of its section.
- // We have to convert it to an absolute offset (including base address).
- if (ASMJIT_UNLIKELY(!targetSection))
- return DebugUtils::errored(kErrorInvalidRelocEntry);
-
- //value += baseAddress + sectionOffset + sourceOffset + regionSize;
- value += baseAddress + targetSection->offset();
- break;
- }
-
- case RelocType::kAbsToRel: {
- value -= baseAddress + sectionOffset + sourceOffset + regionSize;
-
- // Sign extend as we are not interested in the high 32-bit word in a 32-bit address space.
- if (addressSize <= 4)
- value = uint64_t(int64_t(int32_t(value & 0xFFFFFFFFu)));
- else if (!Support::isInt32(int64_t(value)))
- return DebugUtils::errored(kErrorRelocOffsetOutOfRange);
-
- break;
- }
-
- case RelocType::kX64AddressEntry: {
- size_t valueOffset = size_t(re->sourceOffset()) + re->format().valueOffset();
- if (re->format().valueSize() != 4 || valueOffset < 2)
- return DebugUtils::errored(kErrorInvalidRelocEntry);
-
- // First try whether a relative 32-bit displacement would work.
- value -= baseAddress + sectionOffset + sourceOffset + regionSize;
- if (!Support::isInt32(int64_t(value))) {
- // Relative 32-bit displacement is not possible, use '.addrtab' section.
- AddressTableEntry* atEntry = _addressTableEntries.get(re->payload());
- if (ASMJIT_UNLIKELY(!atEntry))
- return DebugUtils::errored(kErrorInvalidRelocEntry);
-
- // Cannot be null as we have just matched the `AddressTableEntry`.
- ASMJIT_ASSERT(addressTableSection != nullptr);
-
- if (!atEntry->hasAssignedSlot())
- atEntry->_slot = addressTableEntryCount++;
-
- size_t atEntryIndex = size_t(atEntry->slot()) * addressSize;
- uint64_t addrSrc = sectionOffset + sourceOffset + regionSize;
- uint64_t addrDst = addressTableSection->offset() + uint64_t(atEntryIndex);
-
- value = addrDst - addrSrc;
- if (!Support::isInt32(int64_t(value)))
- return DebugUtils::errored(kErrorRelocOffsetOutOfRange);
-
- // Bytes that replace [REX, OPCODE] bytes.
- uint32_t byte0 = 0xFF;
- uint32_t byte1 = buffer[valueOffset - 1];
-
- if (byte1 == 0xE8) {
- // Patch CALL/MOD byte to FF /2 (-> 0x15).
- byte1 = x86EncodeMod(0, 2, 5);
- }
- else if (byte1 == 0xE9) {
- // Patch JMP/MOD byte to FF /4 (-> 0x25).
- byte1 = x86EncodeMod(0, 4, 5);
- }
- else {
- return DebugUtils::errored(kErrorInvalidRelocEntry);
- }
-
- // Patch `jmp/call` instruction.
- buffer[valueOffset - 2] = uint8_t(byte0);
- buffer[valueOffset - 1] = uint8_t(byte1);
-
- Support::writeU64uLE(addressTableEntryData + atEntryIndex, re->payload());
- }
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidRelocEntry);
- }
-
- if (!CodeWriterUtils::writeOffset(buffer + re->sourceOffset(), int64_t(value), re->format())) {
- return DebugUtils::errored(kErrorInvalidRelocEntry);
- }
- }
-
- // Fixup the virtual size of the address table if it's the last section.
- if (_sectionsByOrder.last() == addressTableSection) {
- ASMJIT_ASSERT(addressTableSection != nullptr);
-
- size_t addressTableSize = addressTableEntryCount * addressSize;
- addressTableSection->_buffer._size = addressTableSize;
- addressTableSection->_virtualSize = addressTableSize;
- }
-
- return kErrorOk;
-}
-
-Error CodeHolder::copySectionData(void* dst, size_t dstSize, uint32_t sectionId, CopySectionFlags copyFlags) noexcept {
- if (ASMJIT_UNLIKELY(!isSectionValid(sectionId)))
- return DebugUtils::errored(kErrorInvalidSection);
-
- Section* section = sectionById(sectionId);
- size_t bufferSize = section->bufferSize();
-
- if (ASMJIT_UNLIKELY(dstSize < bufferSize))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- memcpy(dst, section->data(), bufferSize);
-
- if (bufferSize < dstSize && Support::test(copyFlags, CopySectionFlags::kPadSectionBuffer)) {
- size_t paddingSize = dstSize - bufferSize;
- memset(static_cast<uint8_t*>(dst) + bufferSize, 0, paddingSize);
- }
-
- return kErrorOk;
-}
-
-Error CodeHolder::copyFlattenedData(void* dst, size_t dstSize, CopySectionFlags copyFlags) noexcept {
- size_t end = 0;
- for (Section* section : _sectionsByOrder) {
- if (section->offset() > dstSize)
- return DebugUtils::errored(kErrorInvalidArgument);
-
- size_t bufferSize = section->bufferSize();
- size_t offset = size_t(section->offset());
-
- if (ASMJIT_UNLIKELY(dstSize - offset < bufferSize))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- uint8_t* dstTarget = static_cast<uint8_t*>(dst) + offset;
- size_t paddingSize = 0;
- memcpy(dstTarget, section->data(), bufferSize);
-
- if (Support::test(copyFlags, CopySectionFlags::kPadSectionBuffer) && bufferSize < section->virtualSize()) {
- paddingSize = Support::min<size_t>(dstSize - offset, size_t(section->virtualSize())) - bufferSize;
- memset(dstTarget + bufferSize, 0, paddingSize);
- }
-
- end = Support::max(end, offset + bufferSize + paddingSize);
- }
-
- if (end < dstSize && Support::test(copyFlags, CopySectionFlags::kPadTargetBuffer)) {
- memset(static_cast<uint8_t*>(dst) + end, 0, dstSize - end);
- }
-
- return kErrorOk;
-}
-
-// CodeHolder - Tests
-// ==================
-
-#if defined(ASMJIT_TEST)
-UNIT(code_holder) {
- CodeHolder code;
-
- INFO("Verifying CodeHolder::init()");
- Environment env;
- env.init(Arch::kX86);
-
- code.init(env);
- EXPECT_EQ(code.arch(), Arch::kX86);
-
- INFO("Verifying named labels");
- LabelEntry* le;
- EXPECT_EQ(code.newNamedLabelEntry(&le, "NamedLabel", SIZE_MAX, LabelType::kGlobal), kErrorOk);
- EXPECT_EQ(strcmp(le->name(), "NamedLabel"), 0);
- EXPECT_EQ(code.labelIdByName("NamedLabel"), le->id());
-
- INFO("Verifying section ordering");
- Section* section1;
- EXPECT_EQ(code.newSection(&section1, "high-priority", SIZE_MAX, SectionFlags::kNone, 1, -1), kErrorOk);
- EXPECT_EQ(code.sections()[1], section1);
- EXPECT_EQ(code.sectionsByOrder()[0], section1);
-
- Section* section0;
- EXPECT_EQ(code.newSection(&section0, "higher-priority", SIZE_MAX, SectionFlags::kNone, 1, -2), kErrorOk);
- EXPECT_EQ(code.sections()[2], section0);
- EXPECT_EQ(code.sectionsByOrder()[0], section0);
- EXPECT_EQ(code.sectionsByOrder()[1], section1);
-
- Section* section3;
- EXPECT_EQ(code.newSection(&section3, "low-priority", SIZE_MAX, SectionFlags::kNone, 1, 2), kErrorOk);
- EXPECT_EQ(code.sections()[3], section3);
- EXPECT_EQ(code.sectionsByOrder()[3], section3);
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/codeholder.h b/3rdparty/asmjit/src/asmjit/core/codeholder.h
deleted file mode 100644
index 3f2d1d70745..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/codeholder.h
+++ /dev/null
@@ -1,1123 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_CODEHOLDER_H_INCLUDED
-#define ASMJIT_CORE_CODEHOLDER_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/codebuffer.h"
-#include "../core/errorhandler.h"
-#include "../core/operand.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/target.h"
-#include "../core/zone.h"
-#include "../core/zonehash.h"
-#include "../core/zonestring.h"
-#include "../core/zonetree.h"
-#include "../core/zonevector.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-class BaseEmitter;
-class CodeHolder;
-class LabelEntry;
-class Logger;
-
-//! Operator type that can be used within an \ref Expression.
-enum class ExpressionOpType : uint8_t {
- //! Addition.
- kAdd = 0,
- //! Subtraction.
- kSub = 1,
- //! Multiplication
- kMul = 2,
- //! Logical left shift.
- kSll = 3,
- //! Logical right shift.
- kSrl = 4,
- //! Arithmetic right shift.
- kSra = 5
-};
-
-//! Value type that can be used within an \ref Expression.
-enum class ExpressionValueType : uint8_t {
- //! No value or invalid.
- kNone = 0,
- //! Value is 64-bit unsigned integer (constant).
- kConstant = 1,
- //! Value is \ref LabelEntry, which references a \ref Label.
- kLabel = 2,
- //! Value is \ref Expression
- kExpression = 3
-};
-
-//! Expression node that can reference constants, labels, and another expressions.
-struct Expression {
- //! Expression value.
- union Value {
- //! Constant.
- uint64_t constant;
- //! Pointer to another expression.
- Expression* expression;
- //! Pointer to \ref LabelEntry.
- LabelEntry* label;
- };
-
- //! \name Members
- //! \{
-
- //! Operation type.
- ExpressionOpType opType;
- //! Value types of \ref value.
- ExpressionValueType valueType[2];
- //! Reserved for future use, should be initialized to zero.
- uint8_t reserved[5];
- //! Expression left and right values.
- Value value[2];
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Resets the whole expression.
- //!
- //! Changes both values to \ref ExpressionValueType::kNone.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Expression{}; }
-
- //! Sets the value type at `index` to \ref ExpressionValueType::kConstant and its content to `constant`.
- ASMJIT_INLINE_NODEBUG void setValueAsConstant(size_t index, uint64_t constant) noexcept {
- valueType[index] = ExpressionValueType::kConstant;
- value[index].constant = constant;
- }
-
- //! Sets the value type at `index` to \ref ExpressionValueType::kLabel and its content to `labelEntry`.
- ASMJIT_INLINE_NODEBUG void setValueAsLabel(size_t index, LabelEntry* labelEntry) noexcept {
- valueType[index] = ExpressionValueType::kLabel;
- value[index].label = labelEntry;
- }
-
- //! Sets the value type at `index` to \ref ExpressionValueType::kExpression and its content to `expression`.
- ASMJIT_INLINE_NODEBUG void setValueAsExpression(size_t index, Expression* expression) noexcept {
- valueType[index] = ExpressionValueType::kExpression;
- value[index].expression = expression;
- }
-
- //! \}
-};
-
-//! Section flags, used by \ref Section.
-enum class SectionFlags : uint32_t {
- //! No flags.
- kNone = 0,
- //! Executable (.text sections).
- kExecutable = 0x00000001u,
- //! Read-only (.text and .data sections).
- kReadOnly = 0x00000002u,
- //! Zero initialized by the loader (BSS).
- kZeroInitialized = 0x00000004u,
- //! Info / comment flag.
- kComment = 0x00000008u,
- //! Section created implicitly, can be deleted by \ref Target.
- kImplicit = 0x80000000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(SectionFlags)
-
-//! Flags that can be used with \ref CodeHolder::copySectionData() and \ref CodeHolder::copyFlattenedData().
-enum class CopySectionFlags : uint32_t {
- //! No flags.
- kNone = 0,
-
- //! If virtual size of a section is greater than the size of its \ref CodeBuffer then all bytes between the buffer
- //! size and virtual size will be zeroed. If this option is not set then those bytes would be left as is, which
- //! means that if the user didn't initialize them they would have a previous content, which may be unwanted.
- kPadSectionBuffer = 0x00000001u,
-
- //! Clears the target buffer if the flattened data is less than the destination size. This option works
- //! only with \ref CodeHolder::copyFlattenedData() as it processes multiple sections. It is ignored by
- //! \ref CodeHolder::copySectionData().
- kPadTargetBuffer = 0x00000002u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(CopySectionFlags)
-
-//! Section entry.
-class Section {
-public:
- //! \name Members
- //! \{
-
- //! Section id.
- uint32_t _id;
- //! Section flags.
- SectionFlags _flags;
- //! Section alignment requirements (0 if no requirements).
- uint32_t _alignment;
- //! Order (lower value means higher priority).
- int32_t _order;
- //! Offset of this section from base-address.
- uint64_t _offset;
- //! Virtual size of the section (zero initialized sections).
- uint64_t _virtualSize;
- //! Section name (max 35 characters, PE allows max 8).
- FixedString<Globals::kMaxSectionNameSize + 1> _name;
- //! Code or data buffer.
- CodeBuffer _buffer;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the section id.
- ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; }
- //! Returns the section name, as a null terminated string.
- ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.str; }
-
- //! Returns the section data.
- ASMJIT_INLINE_NODEBUG uint8_t* data() noexcept { return _buffer.data(); }
- //! \overload
- ASMJIT_INLINE_NODEBUG const uint8_t* data() const noexcept { return _buffer.data(); }
-
- //! Returns the section flags.
- ASMJIT_INLINE_NODEBUG SectionFlags flags() const noexcept { return _flags; }
- //! Tests whether the section has the given `flag`.
- ASMJIT_INLINE_NODEBUG bool hasFlag(SectionFlags flag) const noexcept { return Support::test(_flags, flag); }
- //! Adds `flags` to the section flags.
- ASMJIT_INLINE_NODEBUG void addFlags(SectionFlags flags) noexcept { _flags |= flags; }
- //! Removes `flags` from the section flags.
- ASMJIT_INLINE_NODEBUG void clearFlags(SectionFlags flags) noexcept { _flags &= ~flags; }
-
- //! Returns the minimum section alignment
- ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
- //! Sets the minimum section alignment
- ASMJIT_INLINE_NODEBUG void setAlignment(uint32_t alignment) noexcept { _alignment = alignment; }
-
- //! Returns the section order, which has a higher priority than section id.
- ASMJIT_INLINE_NODEBUG int32_t order() const noexcept { return _order; }
-
- //! Returns the section offset, relative to base.
- ASMJIT_INLINE_NODEBUG uint64_t offset() const noexcept { return _offset; }
- //! Set the section offset.
- ASMJIT_INLINE_NODEBUG void setOffset(uint64_t offset) noexcept { _offset = offset; }
-
- //! Returns the virtual size of the section.
- //!
- //! Virtual size is initially zero and is never changed by AsmJit. It's normal if virtual size is smaller than
- //! size returned by `bufferSize()` as the buffer stores real data emitted by assemblers or appended by users.
- //!
- //! Use `realSize()` to get the real and final size of this section.
- ASMJIT_INLINE_NODEBUG uint64_t virtualSize() const noexcept { return _virtualSize; }
- //! Sets the virtual size of the section.
- ASMJIT_INLINE_NODEBUG void setVirtualSize(uint64_t virtualSize) noexcept { _virtualSize = virtualSize; }
-
- //! Returns the buffer size of the section.
- ASMJIT_INLINE_NODEBUG size_t bufferSize() const noexcept { return _buffer.size(); }
- //! Returns the real size of the section calculated from virtual and buffer sizes.
- ASMJIT_INLINE_NODEBUG uint64_t realSize() const noexcept { return Support::max<uint64_t>(virtualSize(), bufferSize()); }
-
- //! Returns the `CodeBuffer` used by this section.
- ASMJIT_INLINE_NODEBUG CodeBuffer& buffer() noexcept { return _buffer; }
- //! Returns the `CodeBuffer` used by this section (const).
- ASMJIT_INLINE_NODEBUG const CodeBuffer& buffer() const noexcept { return _buffer; }
-
- //! \}
-};
-
-//! Entry in an address table.
-class AddressTableEntry : public ZoneTreeNodeT<AddressTableEntry> {
-public:
- ASMJIT_NONCOPYABLE(AddressTableEntry)
-
- //! \name Members
- //! \{
-
- //! Address.
- uint64_t _address;
- //! Slot.
- uint32_t _slot;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG explicit AddressTableEntry(uint64_t address) noexcept
- : _address(address),
- _slot(0xFFFFFFFFu) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG uint64_t address() const noexcept { return _address; }
- ASMJIT_INLINE_NODEBUG uint32_t slot() const noexcept { return _slot; }
-
- ASMJIT_INLINE_NODEBUG bool hasAssignedSlot() const noexcept { return _slot != 0xFFFFFFFFu; }
-
- ASMJIT_INLINE_NODEBUG bool operator<(const AddressTableEntry& other) const noexcept { return _address < other._address; }
- ASMJIT_INLINE_NODEBUG bool operator>(const AddressTableEntry& other) const noexcept { return _address > other._address; }
-
- ASMJIT_INLINE_NODEBUG bool operator<(uint64_t queryAddress) const noexcept { return _address < queryAddress; }
- ASMJIT_INLINE_NODEBUG bool operator>(uint64_t queryAddress) const noexcept { return _address > queryAddress; }
-
- //! \}
-};
-
-//! Offset format type, used by \ref OffsetFormat.
-enum class OffsetType : uint8_t {
- // Common Offset Formats
- // ---------------------
-
- //! A value having `_immBitCount` bits and shifted by `_immBitShift`.
- //!
- //! This offset type is sufficient for many targets that store offset as a continuous set bits within an
- //! instruction word / sequence of bytes.
- kSignedOffset,
-
- //! An unsigned value having `_immBitCount` bits and shifted by `_immBitShift`.
- kUnsignedOffset,
-
- // AArch64 Specific Offset Formats
- // -------------------------------
-
- //! AArch64 ADR format of `[.|immlo:2|.....|immhi:19|.....]`.
- kAArch64_ADR,
-
- //! AArch64 ADRP format of `[.|immlo:2|.....|immhi:19|.....]` (4kB pages).
- kAArch64_ADRP,
-
- // AArch32 Specific Offset Formats (T16 & T32)
- // -------------------------------------------
-
- //! AArch32 THUMBv2 immediate encoding of 'ADR' instruction (12-bit payload and sign bit):
- //!
- //! `|.....|imm:1|..N.N|......|imm:3|....|imm:8|`
- //!
- //! Where `N` is one if the offset is negative. The immediate is encoded as absolute value of the offset if negative.
- kThumb32_ADR,
-
- //! AArch32 THUMBv2 immediate encoding of 'BLX' instruction (23-bit immediate payload, multiplied by 4):
- //!
- //! `|.....|imm[22]|imm[19:10]|..|ja|1|jb|imm[9:0]|0`
- //!
- //! Where:
- //!
- //! - `ja` is calculated as imm[22] ^ imm[21] ^ 1.
- //! - `jb` is calculated as imm[22] ^ imm[20] ^ 1.
- kThumb32_BLX,
-
- //! AArch32 THUMBv2 immediate encoding of 'B' instruction without `<cond>` (24-bit immediate payload, multiplied by 2):
- //!
- //! `|.....|imm[23]|imm[20:11]|..|ja|1|jb|imm[10:0]`
- //!
- //! Where:
- //!
- //! - `ja` is calculated as imm[23] ^ imm[22] ^ 1.
- //! - `jb` is calculated as imm[23] ^ imm[21] ^ 1.
- kThumb32_B,
-
- //! AArch32 THUMBv2 immediate encoding of 'B' instruction with `<cond>` (20-bit immediate payload, multiplied by 2).
- //!
- //! `|.....|imm[19]|....|imm[16:11]|..|ja|1|jb|imm[10:0]`
- //!
- //! Where:
- //!
- //! - `ja` is calculated as imm[19] ^ imm[18] ^ 1.
- //! - `jb` is calculated as imm[19] ^ imm[17] ^ 1.
- kThumb32_BCond,
-
- // AArch32 Specific Offset Formats (A32)
- // -------------------------------------
-
- //! AArch32 ADR instruction, which uses a standard 12-bit immediate encoding that is used by other ARM instructions.
- kAArch32_ADR,
-
- //! AArch32 signed offset that is similar to `kSignedOffset`, however it uses absolute value of the offset and its
- //! sign is encoded in 23rd bit of the opcode.
- //!
- //! `|........|U.......|........|........|`
- //!
- kAArch32_U23_SignedOffset,
-
- //! AArch32 offset format that encodes 8-bit offset as:
- //!
- //! `|........|U.......|....|imm[7:4]|....|imm[3:0]|`
- //!
- //! in a 32-bit word, where U is a sign of the displacement and the displacement itself is encoded as its absolute
- //! value.
- kAArch32_U23_0To3At0_4To7At8,
-
- //! AArch32 offset format that encodes a signed 25-bit offset as:
- //!
- //! `|.......|imm[0]|imm[24:1]|`
- //!
- //! in a 32-bit word.
- kAArch32_1To24At0_0At24,
-
- //! Maximum value of `OffsetFormatType`.
- kMaxValue = kAArch32_1To24At0_0At24
-};
-
-//! Provides information about formatting offsets, absolute addresses, or their parts. Offset format is used by both
-//! \ref RelocEntry and \ref LabelLink. The illustration below describes the relation of region size and offset size.
-//! Region size is the size of the whole unit whereas offset size is the size of the unit that will be patched.
-//!
-//! ```
-//! +-> Code buffer | The subject of the relocation (region) |
-//! | | (Word-Offset) (Word-Size) |
-//! |xxxxxxxxxxxxxxx|................|*PATCHED*|................|xxxxxxxxxxxx->
-//! | |
-//! [Word Offset points here]----+ +--- [WordOffset + WordSize]
-//! ```
-//!
-//! Once the offset word has been located it can be patched like this:
-//!
-//! ```
-//! |ImmDiscardLSB (discard LSB bits).
-//! |..
-//! [0000000000000iiiiiiiiiiiiiiiiiDD] - Offset value (32-bit)
-//! [000000000000000iiiiiiiiiiiiiiiii] - Offset value after discard LSB.
-//! [00000000000iiiiiiiiiiiiiiiii0000] - Offset value shifted by ImmBitShift.
-//! [xxxxxxxxxxxiiiiiiiiiiiiiiiiixxxx] - Patched word (32-bit)
-//! |...............|
-//! (ImmBitCount) +- ImmBitShift
-//! ```
-struct OffsetFormat {
- //! \name Members
- //! \{
-
- //! Type of the offset.
- OffsetType _type;
- //! Encoding flags.
- uint8_t _flags;
- //! Size of the region (in bytes) containing the offset value, if the offset value is part of an instruction,
- //! otherwise it would be the same as `_valueSize`.
- uint8_t _regionSize;
- //! Size of the offset value, in bytes (1, 2, 4, or 8).
- uint8_t _valueSize;
- //! Offset of the offset value, in bytes, relative to the start of the region or data. Value offset would be
- //! zero if both region size and value size are equal.
- uint8_t _valueOffset;
- //! Size of the offset immediate value in bits.
- uint8_t _immBitCount;
- //! Shift of the offset immediate value in bits in the target word.
- uint8_t _immBitShift;
- //! Number of least significant bits to discard before writing the immediate to the destination. All discarded
- //! bits must be zero otherwise the value is invalid.
- uint8_t _immDiscardLsb;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the type of the offset.
- ASMJIT_INLINE_NODEBUG OffsetType type() const noexcept { return _type; }
-
- //! Returns whether the offset is encoded as an absolute value of the offset with additional field(s) that represent
- //! the sign (AArch32 U/N fields in the opcode).
- //!
- //! If true, the offset itself is always positive and a separate U/N field is used to indicate the sign of the offset
- //! (usually `U==1` means ADD, but sometimes `N==1` means negative offset, which implies SUB).
- ASMJIT_INLINE_NODEBUG bool hasSignBit() const noexcept {
- return _type == OffsetType::kThumb32_ADR ||
- _type == OffsetType::kAArch32_ADR ||
- _type == OffsetType::kAArch32_U23_SignedOffset ||
- _type == OffsetType::kAArch32_U23_0To3At0_4To7At8;
- }
-
- //! Returns flags.
- ASMJIT_INLINE_NODEBUG uint32_t flags() const noexcept { return _flags; }
- //! Returns the size of the region/instruction where the offset is encoded.
- ASMJIT_INLINE_NODEBUG uint32_t regionSize() const noexcept { return _regionSize; }
- //! Returns the offset of the word relative to the start of the region where the offset is.
- ASMJIT_INLINE_NODEBUG uint32_t valueOffset() const noexcept { return _valueOffset; }
- //! Returns the size of the data-type (word) that contains the offset, in bytes.
- ASMJIT_INLINE_NODEBUG uint32_t valueSize() const noexcept { return _valueSize; }
- //! Returns the count of bits of the offset value in the data it's stored in.
- ASMJIT_INLINE_NODEBUG uint32_t immBitCount() const noexcept { return _immBitCount; }
- //! Returns the bit-shift of the offset value in the data it's stored in.
- ASMJIT_INLINE_NODEBUG uint32_t immBitShift() const noexcept { return _immBitShift; }
- //! Returns the number of least significant bits of the offset value, that must be zero and that are not part of
- //! the encoded data.
- ASMJIT_INLINE_NODEBUG uint32_t immDiscardLsb() const noexcept { return _immDiscardLsb; }
-
- //! Resets this offset format to a simple data value of `dataSize` bytes.
- //!
- //! The region will be the same size as data and immediate bits would correspond to `dataSize * 8`. There will be
- //! no immediate bit shift or discarded bits.
- inline void resetToSimpleValue(OffsetType type, size_t valueSize) noexcept {
- ASMJIT_ASSERT(valueSize <= 8u);
-
- _type = type;
- _flags = uint8_t(0);
- _regionSize = uint8_t(valueSize);
- _valueSize = uint8_t(valueSize);
- _valueOffset = uint8_t(0);
- _immBitCount = uint8_t(valueSize * 8u);
- _immBitShift = uint8_t(0);
- _immDiscardLsb = uint8_t(0);
- }
-
- inline void resetToImmValue(OffsetType type, size_t valueSize, uint32_t immBitShift, uint32_t immBitCount, uint32_t immDiscardLsb) noexcept {
- ASMJIT_ASSERT(valueSize <= 8u);
- ASMJIT_ASSERT(immBitShift < valueSize * 8u);
- ASMJIT_ASSERT(immBitCount <= 64u);
- ASMJIT_ASSERT(immDiscardLsb <= 64u);
-
- _type = type;
- _flags = uint8_t(0);
- _regionSize = uint8_t(valueSize);
- _valueSize = uint8_t(valueSize);
- _valueOffset = uint8_t(0);
- _immBitCount = uint8_t(immBitCount);
- _immBitShift = uint8_t(immBitShift);
- _immDiscardLsb = uint8_t(immDiscardLsb);
- }
-
- inline void setRegion(size_t regionSize, size_t valueOffset) noexcept {
- _regionSize = uint8_t(regionSize);
- _valueOffset = uint8_t(valueOffset);
- }
-
- inline void setLeadingAndTrailingSize(size_t leadingSize, size_t trailingSize) noexcept {
- _regionSize = uint8_t(leadingSize + trailingSize + _valueSize);
- _valueOffset = uint8_t(leadingSize);
- }
-
- //! \}
-};
-
-//! Relocation type.
-enum class RelocType : uint32_t {
- //! None/deleted (no relocation).
- kNone = 0,
- //! Expression evaluation, `_payload` is pointer to `Expression`.
- kExpression = 1,
- //! Relocate absolute to absolute.
- kAbsToAbs = 2,
- //! Relocate relative to absolute.
- kRelToAbs = 3,
- //! Relocate absolute to relative.
- kAbsToRel = 4,
- //! Relocate absolute to relative or use trampoline.
- kX64AddressEntry = 5
-};
-
-//! Relocation entry.
-struct RelocEntry {
- //! \name Members
- //! \{
-
- //! Relocation id.
- uint32_t _id;
- //! Type of the relocation.
- RelocType _relocType;
- //! Format of the relocated value.
- OffsetFormat _format;
- //! Source section id.
- uint32_t _sourceSectionId;
- //! Target section id.
- uint32_t _targetSectionId;
- //! Source offset (relative to start of the section).
- uint64_t _sourceOffset;
- //! Payload (target offset, target address, expression, etc).
- uint64_t _payload;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; }
-
- ASMJIT_INLINE_NODEBUG RelocType relocType() const noexcept { return _relocType; }
- ASMJIT_INLINE_NODEBUG const OffsetFormat& format() const noexcept { return _format; }
-
- ASMJIT_INLINE_NODEBUG uint32_t sourceSectionId() const noexcept { return _sourceSectionId; }
- ASMJIT_INLINE_NODEBUG uint32_t targetSectionId() const noexcept { return _targetSectionId; }
-
- ASMJIT_INLINE_NODEBUG uint64_t sourceOffset() const noexcept { return _sourceOffset; }
- ASMJIT_INLINE_NODEBUG uint64_t payload() const noexcept { return _payload; }
-
- ASMJIT_INLINE_NODEBUG Expression* payloadAsExpression() const noexcept {
- return reinterpret_cast<Expression*>(uintptr_t(_payload));
- }
-
- //! \}
-};
-
-//! Type of the \ref Label.
-enum class LabelType : uint8_t {
- //! Anonymous label that can optionally have a name, which is only used for debugging purposes.
- kAnonymous = 0,
- //! Local label (always has parentId).
- kLocal = 1,
- //! Global label (never has parentId).
- kGlobal = 2,
- //! External label (references an external symbol).
- kExternal = 3,
-
- //! Maximum value of `LabelType`.
- kMaxValue = kExternal
-};
-
-//! Data structure used to link either unbound labels or cross-section links.
-struct LabelLink {
- //! Next link (single-linked list).
- LabelLink* next;
- //! Section id where the label is bound.
- uint32_t sectionId;
- //! Relocation id or Globals::kInvalidId.
- uint32_t relocId;
- //! Label offset relative to the start of the section.
- size_t offset;
- //! Inlined rel8/rel32.
- intptr_t rel;
- //! Offset format information.
- OffsetFormat format;
-};
-
-//! Label entry.
-//!
-//! Contains the following properties:
-//! - Label id - This is the only thing that is set to the `Label` operand.
-//! - Label name - Optional, used mostly to create executables and libraries.
-//! - Label type - Type of the label, default `LabelType::kAnonymous`.
-//! - Label parent id - Derived from many assemblers that allow to define a local label that falls under a global
-//! label. This allows to define many labels of the same name that have different parent (global) label.
-//! - Offset - offset of the label bound by `Assembler`.
-//! - Links - single-linked list that contains locations of code that has to be patched when the label gets bound.
-//! Every use of unbound label adds one link to `_links` list.
-//! - HVal - Hash value of label's name and optionally parentId.
-//! - HashNext - Hash-table implementation detail.
-class LabelEntry : public ZoneHashNode {
-public:
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- //! SSO size of \ref _name.
- //!
- //! \cond INTERNAL
- //! Let's round the size of `LabelEntry` to 64 bytes (as `ZoneAllocator` has granularity of 32 bytes anyway). This
- //! gives `_name` the remaining space, which is should be 16 bytes on 64-bit and 28 bytes on 32-bit architectures.
- //! \endcond
- kStaticNameSize = 64 - (sizeof(ZoneHashNode) + 8 + sizeof(Section*) + sizeof(size_t) + sizeof(LabelLink*))
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Type of the label.
- LabelType _type;
- //! Must be zero.
- uint8_t _reserved[3];
- //! Label parent id or zero.
- uint32_t _parentId;
- //! Label offset relative to the start of the `_section`.
- uint64_t _offset;
- //! Section where the label was bound.
- Section* _section;
- //! Label links.
- LabelLink* _links;
- //! Label name.
- ZoneString<kStaticNameSize> _name;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- // NOTE: Label id is stored in `_customData`, which is provided by ZoneHashNode to fill a padding that a C++
- // compiler targeting 64-bit CPU will add to align the structure to 64-bits.
-
- //! Returns label id.
- ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _customData; }
- //! Sets label id (internal, used only by `CodeHolder`).
- ASMJIT_INLINE_NODEBUG void _setId(uint32_t id) noexcept { _customData = id; }
-
- //! Returns label type.
- ASMJIT_INLINE_NODEBUG LabelType type() const noexcept { return _type; }
-
- //! Tests whether the label has a parent label.
- ASMJIT_INLINE_NODEBUG bool hasParent() const noexcept { return _parentId != Globals::kInvalidId; }
- //! Returns label's parent id.
- ASMJIT_INLINE_NODEBUG uint32_t parentId() const noexcept { return _parentId; }
-
- //! Returns the section where the label was bound.
- //!
- //! If the label was not yet bound the return value is `nullptr`.
- ASMJIT_INLINE_NODEBUG Section* section() const noexcept { return _section; }
-
- //! Tests whether the label has name.
- ASMJIT_INLINE_NODEBUG bool hasName() const noexcept { return !_name.empty(); }
-
- //! Returns the label's name.
- //!
- //! \note Local labels will return their local name without their parent part, for example ".L1".
- ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.data(); }
-
- //! Returns size of label's name.
- //!
- //! \note Label name is always null terminated, so you can use `strlen()` to get it, however, it's also cached in
- //! `LabelEntry` itself, so if you want to know the size the fastest way is to call `LabelEntry::nameSize()`.
- ASMJIT_INLINE_NODEBUG uint32_t nameSize() const noexcept { return _name.size(); }
-
- //! Returns links associated with this label.
- ASMJIT_INLINE_NODEBUG LabelLink* links() const noexcept { return _links; }
-
- //! Tests whether the label is bound.
- ASMJIT_INLINE_NODEBUG bool isBound() const noexcept { return _section != nullptr; }
- //! Tests whether the label is bound to a the given `sectionId`.
- ASMJIT_INLINE_NODEBUG bool isBoundTo(Section* section) const noexcept { return _section == section; }
-
- //! Returns the label offset (only useful if the label is bound).
- ASMJIT_INLINE_NODEBUG uint64_t offset() const noexcept { return _offset; }
-
- //! Returns the hash-value of label's name and its parent label (if any).
- //!
- //! Label hash is calculated as `HASH(Name) ^ ParentId`. The hash function is implemented in `Support::hashString()`
- //! and `Support::hashRound()`.
- ASMJIT_INLINE_NODEBUG uint32_t hashCode() const noexcept { return _hashCode; }
-
- //! \}
-};
-
-//! Holds assembled code and data (including sections, labels, and relocation information).
-//!
-//! CodeHolder connects emitters with their targets. It provides them interface that can be used to query information
-//! about the target environment (architecture, etc...) and API to create labels, sections, relocations, and to write
-//! data to a \ref CodeBuffer, which is always part of \ref Section. More than one emitter can be attached to a single
-//! CodeHolder instance at a time, which is used in practice
-//!
-//! CodeHolder provides interface for all emitter types. Assemblers use CodeHolder to write into \ref CodeBuffer, and
-//! higher level emitters like Builder and Compiler use CodeHolder to manage labels and sections so higher level code
-//! can be serialized to Assembler by \ref BaseEmitter::finalize() and \ref BaseBuilder::serializeTo().
-//!
-//! In order to use CodeHolder, it must be first initialized by \ref init(). After the CodeHolder has been successfully
-//! initialized it can be used to hold assembled code, sections, labels, relocations, and to attach / detach code
-//! emitters. After the end of code generation it can be used to query physical locations of labels and to relocate
-//! the assembled code into the right address.
-//!
-//! \note \ref CodeHolder has an ability to attach an \ref ErrorHandler, however, the error handler is not triggered
-//! by \ref CodeHolder itself, it's instead propagated to all emitters that attach to it.
-class CodeHolder {
-public:
- ASMJIT_NONCOPYABLE(CodeHolder)
-
- //! \name Members
- //! \{
-
- //! Environment information.
- Environment _environment;
- //! CPU features of the target architecture.
- CpuFeatures _cpuFeatures;
- //! Base address or \ref Globals::kNoBaseAddress.
- uint64_t _baseAddress;
-
- //! Attached `Logger`, used by all consumers.
- Logger* _logger;
- //! Attached `ErrorHandler`.
- ErrorHandler* _errorHandler;
-
- //! Code zone (used to allocate core structures).
- Zone _zone;
- //! Zone allocator, used to manage internal containers.
- ZoneAllocator _allocator;
-
- //! Attached emitters.
- ZoneVector<BaseEmitter*> _emitters;
- //! Section entries.
- ZoneVector<Section*> _sections;
- //! Section entries sorted by section order and then section id.
- ZoneVector<Section*> _sectionsByOrder;
- //! Label entries.
- ZoneVector<LabelEntry*> _labelEntries;
- //! Relocation entries.
- ZoneVector<RelocEntry*> _relocations;
- //! Label name -> LabelEntry (only named labels).
- ZoneHash<LabelEntry> _namedLabels;
-
- //! Count of label links, which are not resolved.
- size_t _unresolvedLinkCount;
- //! Pointer to an address table section (or null if this section doesn't exist).
- Section* _addressTableSection;
- //! Address table entries.
- ZoneTree<AddressTableEntry> _addressTableEntries;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates an uninitialized CodeHolder (you must init() it before it can be used).
- //!
- //! An optional `temporary` argument can be used to initialize the first block of \ref Zone that the CodeHolder
- //! uses into a temporary memory provided by the user.
- ASMJIT_API explicit CodeHolder(const Support::Temporary* temporary = nullptr) noexcept;
-
- //! \overload
- ASMJIT_INLINE_NODEBUG explicit CodeHolder(const Support::Temporary& temporary) noexcept
- : CodeHolder(&temporary) {}
-
- //! Destroys the CodeHolder and frees all resources it has allocated.
- ASMJIT_API ~CodeHolder() noexcept;
-
- //! Tests whether the `CodeHolder` has been initialized.
- //!
- //! Emitters can be only attached to initialized `CodeHolder` instances.
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _environment.isInitialized(); }
-
- //! Initializes CodeHolder to hold code described by the given `environment` and `baseAddress`.
- ASMJIT_API Error init(const Environment& environment, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept;
- //! Initializes CodeHolder to hold code described by the given `environment`, `cpuFeatures`, and `baseAddress`.
- ASMJIT_API Error init(const Environment& environment, const CpuFeatures& cpuFeatures, uint64_t baseAddress = Globals::kNoBaseAddress) noexcept;
- //! Detaches all code-generators attached and resets the `CodeHolder`.
- ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept;
-
- //! \}
-
- //! \name Attach & Detach
- //! \{
-
- //! Attaches an emitter to this `CodeHolder`.
- ASMJIT_API Error attach(BaseEmitter* emitter) noexcept;
- //! Detaches an emitter from this `CodeHolder`.
- ASMJIT_API Error detach(BaseEmitter* emitter) noexcept;
-
- //! \}
-
- //! \name Allocators
- //! \{
-
- //! Returns the allocator that the `CodeHolder` uses.
- //!
- //! \note This should be only used for AsmJit's purposes. Code holder uses arena allocator to allocate everything,
- //! so anything allocated through this allocator will be invalidated by \ref CodeHolder::reset() or by CodeHolder's
- //! destructor.
- ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return const_cast<ZoneAllocator*>(&_allocator); }
-
- //! \}
-
- //! \name Code & Architecture
- //! \{
-
- //! Returns the target environment information.
- ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; }
-
- //! Returns the target architecture.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return environment().arch(); }
- //! Returns the target sub-architecture.
- ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return environment().subArch(); }
-
- //! Returns the minimum CPU features of the target architecture.
- ASMJIT_INLINE_NODEBUG const CpuFeatures& cpuFeatures() const noexcept { return _cpuFeatures; }
-
- //! Tests whether a static base-address is set.
- ASMJIT_INLINE_NODEBUG bool hasBaseAddress() const noexcept { return _baseAddress != Globals::kNoBaseAddress; }
- //! Returns a static base-address or \ref Globals::kNoBaseAddress, if not set.
- ASMJIT_INLINE_NODEBUG uint64_t baseAddress() const noexcept { return _baseAddress; }
-
- //! \}
-
- //! \name Emitters
- //! \{
-
- //! Returns a vector of attached emitters.
- ASMJIT_INLINE_NODEBUG const ZoneVector<BaseEmitter*>& emitters() const noexcept { return _emitters; }
-
- //! \}
-
- //! \name Logging
- //! \{
-
- //! Returns the attached logger.
- ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; }
- //! Attaches a `logger` to CodeHolder and propagates it to all attached emitters.
- ASMJIT_API void setLogger(Logger* logger) noexcept;
- //! Resets the logger to none.
- ASMJIT_INLINE_NODEBUG void resetLogger() noexcept { setLogger(nullptr); }
-
- //! \name Error Handling
- //! \{
-
- //! Tests whether the CodeHolder has an attached error handler, see \ref ErrorHandler.
- ASMJIT_INLINE_NODEBUG bool hasErrorHandler() const noexcept { return _errorHandler != nullptr; }
- //! Returns the attached error handler.
- ASMJIT_INLINE_NODEBUG ErrorHandler* errorHandler() const noexcept { return _errorHandler; }
- //! Attach an error handler to this `CodeHolder`.
- ASMJIT_API void setErrorHandler(ErrorHandler* errorHandler) noexcept;
- //! Resets the error handler to none.
- ASMJIT_INLINE_NODEBUG void resetErrorHandler() noexcept { setErrorHandler(nullptr); }
-
- //! \}
-
- //! \name Code Buffer
- //! \{
-
- //! Makes sure that at least `n` bytes can be added to CodeHolder's buffer `cb`.
- //!
- //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the behavior of the function is undefined.
- ASMJIT_API Error growBuffer(CodeBuffer* cb, size_t n) noexcept;
-
- //! Reserves the size of `cb` to at least `n` bytes.
- //!
- //! \note The buffer `cb` must be managed by `CodeHolder` - otherwise the behavior of the function is undefined.
- ASMJIT_API Error reserveBuffer(CodeBuffer* cb, size_t n) noexcept;
-
- //! \}
-
- //! \name Sections
- //! \{
-
- //! Returns an array of `Section*` records.
- ASMJIT_INLINE_NODEBUG const ZoneVector<Section*>& sections() const noexcept { return _sections; }
- //! Returns an array of `Section*` records sorted according to section order first, then section id.
- ASMJIT_INLINE_NODEBUG const ZoneVector<Section*>& sectionsByOrder() const noexcept { return _sectionsByOrder; }
- //! Returns the number of sections.
- ASMJIT_INLINE_NODEBUG uint32_t sectionCount() const noexcept { return _sections.size(); }
-
- //! Tests whether the given `sectionId` is valid.
- ASMJIT_INLINE_NODEBUG bool isSectionValid(uint32_t sectionId) const noexcept { return sectionId < _sections.size(); }
-
- //! Creates a new section and return its pointer in `sectionOut`.
- //!
- //! Returns `Error`, does not report a possible error to `ErrorHandler`.
- ASMJIT_API Error newSection(Section** sectionOut, const char* name, size_t nameSize = SIZE_MAX, SectionFlags flags = SectionFlags::kNone, uint32_t alignment = 1, int32_t order = 0) noexcept;
-
- //! Returns a section entry of the given index.
- ASMJIT_INLINE_NODEBUG Section* sectionById(uint32_t sectionId) const noexcept { return _sections[sectionId]; }
-
- //! Returns section-id that matches the given `name`.
- //!
- //! If there is no such section `Section::kInvalidId` is returned.
- ASMJIT_API Section* sectionByName(const char* name, size_t nameSize = SIZE_MAX) const noexcept;
-
- //! Returns '.text' section (section that commonly represents code).
- //!
- //! \note Text section is always the first section in \ref CodeHolder::sections() array.
- ASMJIT_INLINE_NODEBUG Section* textSection() const noexcept { return _sections[0]; }
-
- //! Tests whether '.addrtab' section exists.
- ASMJIT_INLINE_NODEBUG bool hasAddressTable() const noexcept { return _addressTableSection != nullptr; }
-
- //! Returns '.addrtab' section.
- //!
- //! This section is used exclusively by AsmJit to store absolute 64-bit
- //! addresses that cannot be encoded in instructions like 'jmp' or 'call'.
- //!
- //! \note This section is created on demand, the returned pointer can be null.
- ASMJIT_INLINE_NODEBUG Section* addressTableSection() const noexcept { return _addressTableSection; }
-
- //! Ensures that '.addrtab' section exists (creates it if it doesn't) and
- //! returns it. Can return `nullptr` on out of memory condition.
- ASMJIT_API Section* ensureAddressTableSection() noexcept;
-
- //! Used to add an address to an address table.
- //!
- //! This implicitly calls `ensureAddressTableSection()` and then creates `AddressTableEntry` that is inserted
- //! to `_addressTableEntries`. If the address already exists this operation does nothing as the same addresses
- //! use the same slot.
- //!
- //! This function should be considered internal as it's used by assemblers to insert an absolute address into the
- //! address table. Inserting address into address table without creating a particular relocation entry makes no sense.
- ASMJIT_API Error addAddressToAddressTable(uint64_t address) noexcept;
-
- //! \}
-
- //! \name Labels & Symbols
- //! \{
-
- //! Returns array of `LabelEntry*` records.
- ASMJIT_INLINE_NODEBUG const ZoneVector<LabelEntry*>& labelEntries() const noexcept { return _labelEntries; }
-
- //! Returns number of labels created.
- ASMJIT_INLINE_NODEBUG uint32_t labelCount() const noexcept { return _labelEntries.size(); }
-
- //! Tests whether the label having `id` is valid (i.e. created by `newLabelEntry()`).
- ASMJIT_INLINE_NODEBUG bool isLabelValid(uint32_t labelId) const noexcept {
- return labelId < _labelEntries.size();
- }
-
- //! Tests whether the `label` is valid (i.e. created by `newLabelEntry()`).
- ASMJIT_INLINE_NODEBUG bool isLabelValid(const Label& label) const noexcept {
- return label.id() < _labelEntries.size();
- }
-
- //! \overload
- ASMJIT_INLINE_NODEBUG bool isLabelBound(uint32_t labelId) const noexcept {
- return isLabelValid(labelId) && _labelEntries[labelId]->isBound();
- }
-
- //! Tests whether the `label` is already bound.
- //!
- //! Returns `false` if the `label` is not valid.
- ASMJIT_INLINE_NODEBUG bool isLabelBound(const Label& label) const noexcept {
- return isLabelBound(label.id());
- }
-
- //! Returns LabelEntry of the given label `id`.
- ASMJIT_INLINE_NODEBUG LabelEntry* labelEntry(uint32_t labelId) const noexcept {
- return isLabelValid(labelId) ? _labelEntries[labelId] : static_cast<LabelEntry*>(nullptr);
- }
-
- //! Returns LabelEntry of the given `label`.
- ASMJIT_INLINE_NODEBUG LabelEntry* labelEntry(const Label& label) const noexcept {
- return labelEntry(label.id());
- }
-
- //! Returns offset of a `Label` by its `labelId`.
- //!
- //! The offset returned is relative to the start of the section. Zero offset is returned for unbound labels,
- //! which is their initial offset value.
- ASMJIT_INLINE_NODEBUG uint64_t labelOffset(uint32_t labelId) const noexcept {
- ASMJIT_ASSERT(isLabelValid(labelId));
- return _labelEntries[labelId]->offset();
- }
-
- //! \overload
- ASMJIT_INLINE_NODEBUG uint64_t labelOffset(const Label& label) const noexcept {
- return labelOffset(label.id());
- }
-
- //! Returns offset of a label by it's `labelId` relative to the base offset.
- //!
- //! \remarks The offset of the section where the label is bound must be valid in order to use this function,
- //! otherwise the value returned will not be reliable.
- inline uint64_t labelOffsetFromBase(uint32_t labelId) const noexcept {
- ASMJIT_ASSERT(isLabelValid(labelId));
- const LabelEntry* le = _labelEntries[labelId];
- return (le->isBound() ? le->section()->offset() : uint64_t(0)) + le->offset();
- }
-
- //! \overload
- inline uint64_t labelOffsetFromBase(const Label& label) const noexcept {
- return labelOffsetFromBase(label.id());
- }
-
- //! Creates a new anonymous label and return its id in `idOut`.
- //!
- //! Returns `Error`, does not report error to `ErrorHandler`.
- ASMJIT_API Error newLabelEntry(LabelEntry** entryOut) noexcept;
-
- //! Creates a new named \ref LabelEntry of the given label `type`.
- //!
- //! \param entryOut Where to store the created \ref LabelEntry.
- //! \param name The name of the label.
- //! \param nameSize The length of `name` argument, or `SIZE_MAX` if `name` is a null terminated string, which
- //! means that the `CodeHolder` will use `strlen()` to determine the length.
- //! \param type The type of the label to create, see \ref LabelType.
- //! \param parentId Parent id of a local label, otherwise it must be \ref Globals::kInvalidId.
- //! \retval Always returns \ref Error, does not report a possible error to the attached \ref ErrorHandler.
- //!
- //! AsmJit has a support for local labels (\ref LabelType::kLocal) which require a parent label id (parentId).
- //! The names of local labels can conflict with names of other local labels that have a different parent. In
- //! addition, AsmJit supports named anonymous labels, which are useful only for debugging purposes as the
- //! anonymous name will have a name, which will be formatted, but the label itself cannot be queried by such
- //! name.
- ASMJIT_API Error newNamedLabelEntry(LabelEntry** entryOut, const char* name, size_t nameSize, LabelType type, uint32_t parentId = Globals::kInvalidId) noexcept;
-
- //! Returns a label by name.
- //!
- //! If the named label doesn't a default constructed \ref Label is returned,
- //! which has its id set to \ref Globals::kInvalidId.
- ASMJIT_INLINE_NODEBUG Label labelByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept {
- return Label(labelIdByName(name, nameSize, parentId));
- }
-
- //! Returns a label id by name.
- //!
- //! If the named label doesn't exist \ref Globals::kInvalidId is returned.
- ASMJIT_API uint32_t labelIdByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept;
-
- //! Tests whether there are any unresolved label links.
- ASMJIT_INLINE_NODEBUG bool hasUnresolvedLinks() const noexcept { return _unresolvedLinkCount != 0; }
- //! Returns the number of label links, which are unresolved.
- ASMJIT_INLINE_NODEBUG size_t unresolvedLinkCount() const noexcept { return _unresolvedLinkCount; }
-
- //! Creates a new label-link used to store information about yet unbound labels.
- //!
- //! Returns `null` if the allocation failed.
- ASMJIT_API LabelLink* newLabelLink(LabelEntry* le, uint32_t sectionId, size_t offset, intptr_t rel, const OffsetFormat& format) noexcept;
-
- //! Resolves cross-section links (`LabelLink`) associated with each label that was used as a destination in code
- //! of a different section. It's only useful to people that use multiple sections as it will do nothing if the code
- //! only contains a single section in which cross-section links are not possible.
- ASMJIT_API Error resolveUnresolvedLinks() noexcept;
-
- //! Binds a label to a given `sectionId` and `offset` (relative to start of the section).
- //!
- //! This function is generally used by `BaseAssembler::bind()` to do the heavy lifting.
- ASMJIT_API Error bindLabel(const Label& label, uint32_t sectionId, uint64_t offset) noexcept;
-
- //! \}
-
- //! \name Relocations
- //! \{
-
- //! Tests whether the code contains relocation entries.
- ASMJIT_INLINE_NODEBUG bool hasRelocEntries() const noexcept { return !_relocations.empty(); }
- //! Returns array of `RelocEntry*` records.
- ASMJIT_INLINE_NODEBUG const ZoneVector<RelocEntry*>& relocEntries() const noexcept { return _relocations; }
-
- //! Returns a RelocEntry of the given `id`.
- ASMJIT_INLINE_NODEBUG RelocEntry* relocEntry(uint32_t id) const noexcept { return _relocations[id]; }
-
- //! Creates a new relocation entry of type `relocType`.
- //!
- //! Additional fields can be set after the relocation entry was created.
- ASMJIT_API Error newRelocEntry(RelocEntry** dst, RelocType relocType) noexcept;
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Flattens all sections by recalculating their offsets, starting at 0.
- //!
- //! \note This should never be called more than once.
- ASMJIT_API Error flatten() noexcept;
-
- //! Returns computed the size of code & data of all sections.
- //!
- //! \note All sections will be iterated over and the code size returned would represent the minimum code size of
- //! all combined sections after applying minimum alignment. Code size may decrease after calling `flatten()` and
- //! `relocateToBase()`.
- ASMJIT_API size_t codeSize() const noexcept;
-
- //! Relocates the code to the given `baseAddress`.
- //!
- //! \param baseAddress Absolute base address where the code will be relocated to. Please note that nothing is
- //! copied to such base address, it's just an absolute value used by the relocation code to resolve all stored
- //! relocations.
- //!
- //! \note This should never be called more than once.
- ASMJIT_API Error relocateToBase(uint64_t baseAddress) noexcept;
-
- //! Copies a single section into `dst`.
- ASMJIT_API Error copySectionData(void* dst, size_t dstSize, uint32_t sectionId, CopySectionFlags copyFlags = CopySectionFlags::kNone) noexcept;
-
- //! Copies all sections into `dst`.
- //!
- //! This should only be used if the data was flattened and there are no gaps between the sections. The `dstSize`
- //! is always checked and the copy will never write anything outside the provided buffer.
- ASMJIT_API Error copyFlattenedData(void* dst, size_t dstSize, CopySectionFlags copyFlags = CopySectionFlags::kNone) noexcept;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_CODEHOLDER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/codewriter.cpp b/3rdparty/asmjit/src/asmjit/core/codewriter.cpp
deleted file mode 100644
index 2ee5b38cda5..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/codewriter.cpp
+++ /dev/null
@@ -1,278 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/codeholder.h"
-#include "../core/codewriter_p.h"
-#include "../arm/armutils.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-bool CodeWriterUtils::encodeOffset32(uint32_t* dst, int64_t offset64, const OffsetFormat& format) noexcept {
- uint32_t bitCount = format.immBitCount();
- uint32_t bitShift = format.immBitShift();
- uint32_t discardLsb = format.immDiscardLsb();
-
- // Invalid offset (should not happen).
- if (!bitCount || bitCount > format.valueSize() * 8u)
- return false;
-
- uint32_t value;
- uint32_t u = 0;
- bool unsignedLogic = format.type() == OffsetType::kUnsignedOffset;
-
- // First handle all offsets that use additional field for their sign and the offset is encoded as its
- // absolute value.
- if (format.hasSignBit()) {
- u = uint32_t(offset64 >= 0);
- if (u == 0)
- offset64 = -offset64;
- unsignedLogic = true;
- }
-
- // First handle all unsigned offset types.
- if (unsignedLogic) {
- if (discardLsb) {
- ASMJIT_ASSERT(discardLsb <= 32);
- if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
- return false;
- offset64 = int64_t(uint64_t(offset64) >> discardLsb);
- }
-
- value = uint32_t(offset64 & Support::lsbMask<uint32_t>(bitCount));
- if (value != offset64)
- return false;
- }
- else {
- // The rest of OffsetType options are all signed.
- if (discardLsb) {
- ASMJIT_ASSERT(discardLsb <= 32);
- if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
- return false;
- offset64 >>= discardLsb;
- }
-
- if (!Support::isInt32(offset64))
- return false;
-
- value = uint32_t(int32_t(offset64));
- if (!Support::isEncodableOffset32(int32_t(value), bitCount))
- return false;
- }
-
- switch (format.type()) {
- case OffsetType::kSignedOffset:
- case OffsetType::kUnsignedOffset: {
- *dst = (value & Support::lsbMask<uint32_t>(bitCount)) << bitShift;
- return true;
- }
-
- // Opcode: {.....|imm:1|..N.N|......|imm:3|....|imm:8}
- case OffsetType::kThumb32_ADR: {
- // Sanity checks.
- if (format.valueSize() != 4 || bitCount != 12 || bitShift != 0)
- return false;
-
- uint32_t imm8 = (value & 0x00FFu);
- uint32_t imm3 = (value & 0x0700u) << (12 - 8);
- uint32_t imm1 = (value & 0x0800u) << (26 - 11);
- uint32_t n = u ^ 1u;
-
- *dst = imm8 | imm3 | imm1 | (n << 21) | (n << 23);
- return true;
- }
-
- // Opcode: {....|.|imm[22]|imm[19:10]|..|ja|.|jb|imm[9:0]|.}
- case OffsetType::kThumb32_BLX:
- // The calculation is the same as `B`, but the first LSB bit must be zero, so account for that.
- value <<= 1;
- ASMJIT_FALLTHROUGH;
-
- // Opcode: {....|.|imm[23]|imm[20:11]|..|ja|.|jb|imm[10:0]}
- case OffsetType::kThumb32_B: {
- // Sanity checks.
- if (format.valueSize() != 4)
- return false;
-
- uint32_t ia = (value & 0x0007FFu);
- uint32_t ib = (value & 0x1FF800u) << (16 - 11);
- uint32_t ic = (value & 0x800000u) << (26 - 23);
- uint32_t ja = ((~value >> 23) ^ (value >> 22)) & 1u;
- uint32_t jb = ((~value >> 23) ^ (value >> 21)) & 1u;
-
- *dst = ia | ib | ic | (ja << 14) | (jb << 11);
- return true;
- }
-
- // Opcode: {....|.|imm[19]|....|imm[16:11]|..|ja|.|jb|imm[10:0]}
- case OffsetType::kThumb32_BCond: {
- // Sanity checks.
- if (format.valueSize() != 4 || bitCount != 20 || bitShift != 0)
- return false;
-
- uint32_t ia = (value & 0x0007FFu);
- uint32_t ib = (value & 0x01F800u) << (16 - 11);
- uint32_t ic = (value & 0x080000u) << (26 - 19);
- uint32_t ja = ((~value >> 19) ^ (value >> 22)) & 1u;
- uint32_t jb = ((~value >> 19) ^ (value >> 21)) & 1u;
-
- *dst = ia | ib | ic | (ja << 14) | (jb << 11);
- return true;
- }
-
- case OffsetType::kAArch32_ADR: {
- uint32_t encodedImm;
- if (!arm::Utils::encodeAArch32Imm(value, &encodedImm))
- return false;
-
- *dst = (Support::bitMask(22) << u) | (encodedImm << bitShift);
- return true;
- }
-
- case OffsetType::kAArch32_U23_SignedOffset: {
- *dst = (value << bitShift) | (u << 23);
- return true;
- }
-
- case OffsetType::kAArch32_U23_0To3At0_4To7At8: {
- // Sanity checks.
- if (format.valueSize() != 4 || bitCount != 8 || bitShift != 0)
- return false;
-
- uint32_t immLo = (value & 0x0Fu);
- uint32_t immHi = (value & 0xF0u) << (8 - 4);
-
- *dst = immLo | immHi | (u << 23);
- return true;
- }
-
- case OffsetType::kAArch32_1To24At0_0At24: {
- // Sanity checks.
- if (format.valueSize() != 4 || bitCount != 25 || bitShift != 0)
- return false;
-
- uint32_t immLo = (value & 0x0000001u) << 24;
- uint32_t immHi = (value & 0x1FFFFFEu) >> 1;
-
- *dst = immLo | immHi;
- return true;
- }
-
- case OffsetType::kAArch64_ADR:
- case OffsetType::kAArch64_ADRP: {
- // Sanity checks.
- if (format.valueSize() != 4 || bitCount != 21 || bitShift != 5)
- return false;
-
- uint32_t immLo = value & 0x3u;
- uint32_t immHi = (value >> 2) & Support::lsbMask<uint32_t>(19);
-
- *dst = (immLo << 29) | (immHi << 5);
- return true;
- }
-
- default:
- return false;
- }
-}
-
-bool CodeWriterUtils::encodeOffset64(uint64_t* dst, int64_t offset64, const OffsetFormat& format) noexcept {
- uint32_t bitCount = format.immBitCount();
- uint32_t discardLsb = format.immDiscardLsb();
-
- if (!bitCount || bitCount > format.valueSize() * 8u)
- return false;
-
- uint64_t value;
-
- // First handle all unsigned offset types.
- if (format.type() == OffsetType::kUnsignedOffset) {
- if (discardLsb) {
- ASMJIT_ASSERT(discardLsb <= 32);
- if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
- return false;
- offset64 = int64_t(uint64_t(offset64) >> discardLsb);
- }
-
- value = uint64_t(offset64) & Support::lsbMask<uint64_t>(bitCount);
- if (value != uint64_t(offset64))
- return false;
- }
- else {
- // The rest of OffsetType options are all signed.
- if (discardLsb) {
- ASMJIT_ASSERT(discardLsb <= 32);
- if ((offset64 & Support::lsbMask<uint32_t>(discardLsb)) != 0)
- return false;
- offset64 >>= discardLsb;
- }
-
- if (!Support::isEncodableOffset64(offset64, bitCount))
- return false;
-
- value = uint64_t(offset64);
- }
-
- switch (format.type()) {
- case OffsetType::kSignedOffset:
- case OffsetType::kUnsignedOffset: {
- *dst = (value & Support::lsbMask<uint64_t>(bitCount)) << format.immBitShift();
- return true;
- }
-
- default:
- return false;
- }
-}
-
-bool CodeWriterUtils::writeOffset(void* dst, int64_t offset64, const OffsetFormat& format) noexcept {
- // Offset the destination by ValueOffset so the `dst` points to the
- // patched word instead of the beginning of the patched region.
- dst = static_cast<char*>(dst) + format.valueOffset();
-
- switch (format.valueSize()) {
- case 1: {
- uint32_t mask;
- if (!encodeOffset32(&mask, offset64, format))
- return false;
-
- Support::writeU8(dst, uint8_t(Support::readU8(dst) | mask));
- return true;
- }
-
- case 2: {
- uint32_t mask;
- if (!encodeOffset32(&mask, offset64, format))
- return false;
-
- Support::writeU16uLE(dst, uint16_t(Support::readU16uLE(dst) | mask));
- return true;
- }
-
- case 4: {
- uint32_t mask;
- if (!encodeOffset32(&mask, offset64, format)) {
- return false;
- }
-
- Support::writeU32uLE(dst, Support::readU32uLE(dst) | mask);
- return true;
- }
-
- case 8: {
- uint64_t mask;
- if (!encodeOffset64(&mask, offset64, format))
- return false;
-
- Support::writeU64uLE(dst, Support::readU64uLE(dst) | mask);
- return true;
- }
-
- default:
- return false;
- }
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/codewriter_p.h b/3rdparty/asmjit/src/asmjit/core/codewriter_p.h
deleted file mode 100644
index c799241490a..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/codewriter_p.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
-#define ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
-
-#include "../core/assembler.h"
-#include "../core/codebuffer.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_assembler
-//! \{
-
-struct OffsetFormat;
-
-//! Helper that is used to write into a \ref CodeBuffer held by \ref BaseAssembler.
-class CodeWriter {
-public:
- uint8_t* _cursor;
-
- ASMJIT_FORCE_INLINE explicit CodeWriter(BaseAssembler* a) noexcept
- : _cursor(a->_bufferPtr) {}
-
- ASMJIT_FORCE_INLINE Error ensureSpace(BaseAssembler* a, size_t n) noexcept {
- size_t remainingSpace = (size_t)(a->_bufferEnd - _cursor);
- if (ASMJIT_UNLIKELY(remainingSpace < n)) {
- CodeBuffer& buffer = a->_section->_buffer;
- Error err = a->_code->growBuffer(&buffer, n);
- if (ASMJIT_UNLIKELY(err))
- return a->reportError(err);
- _cursor = a->_bufferPtr;
- }
- return kErrorOk;
- }
-
- ASMJIT_FORCE_INLINE uint8_t* cursor() const noexcept { return _cursor; }
- ASMJIT_FORCE_INLINE void setCursor(uint8_t* cursor) noexcept { _cursor = cursor; }
- ASMJIT_FORCE_INLINE void advance(size_t n) noexcept { _cursor += n; }
-
- ASMJIT_FORCE_INLINE size_t offsetFrom(uint8_t* from) const noexcept {
- ASMJIT_ASSERT(_cursor >= from);
- return (size_t)(_cursor - from);
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emit8(T val) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- _cursor[0] = uint8_t(U(val) & U(0xFF));
- _cursor++;
- }
-
- template<typename T, typename Y>
- ASMJIT_FORCE_INLINE void emit8If(T val, Y cond) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- ASMJIT_ASSERT(size_t(cond) <= 1u);
-
- _cursor[0] = uint8_t(U(val) & U(0xFF));
- _cursor += size_t(cond);
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emit16uLE(T val) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- Support::writeU16uLE(_cursor, uint16_t(U(val) & 0xFFFFu));
- _cursor += 2;
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emit16uBE(T val) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- Support::writeU16uBE(_cursor, uint16_t(U(val) & 0xFFFFu));
- _cursor += 2;
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emit32uLE(T val) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- Support::writeU32uLE(_cursor, uint32_t(U(val) & 0xFFFFFFFFu));
- _cursor += 4;
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emit32uBE(T val) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- Support::writeU32uBE(_cursor, uint32_t(U(val) & 0xFFFFFFFFu));
- _cursor += 4;
- }
-
- ASMJIT_FORCE_INLINE void emitData(const void* data, size_t size) noexcept {
- ASMJIT_ASSERT(size != 0);
- memcpy(_cursor, data, size);
- _cursor += size;
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emitValueLE(const T& value, size_t size) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- ASMJIT_ASSERT(size <= sizeof(T));
-
- U v = U(value);
- for (uint32_t i = 0; i < size; i++) {
- _cursor[i] = uint8_t(v & 0xFFu);
- v >>= 8;
- }
- _cursor += size;
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void emitValueBE(const T& value, size_t size) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- ASMJIT_ASSERT(size <= sizeof(T));
-
- U v = U(value);
- for (uint32_t i = 0; i < size; i++) {
- _cursor[i] = uint8_t(v >> (sizeof(T) - 8));
- v <<= 8;
- }
- _cursor += size;
- }
-
- ASMJIT_FORCE_INLINE void emitZeros(size_t size) noexcept {
- ASMJIT_ASSERT(size != 0);
- memset(_cursor, 0, size);
- _cursor += size;
- }
-
- ASMJIT_FORCE_INLINE void remove8(uint8_t* where) noexcept {
- ASMJIT_ASSERT(where < _cursor);
-
- uint8_t* p = where;
- while (++p != _cursor)
- p[-1] = p[0];
- _cursor--;
- }
-
- template<typename T>
- ASMJIT_FORCE_INLINE void insert8(uint8_t* where, T val) noexcept {
- uint8_t* p = _cursor;
-
- while (p != where) {
- p[0] = p[-1];
- p--;
- }
-
- *p = uint8_t(val & 0xFF);
- _cursor++;
- }
-
- ASMJIT_FORCE_INLINE void done(BaseAssembler* a) noexcept {
- CodeBuffer& buffer = a->_section->_buffer;
- size_t newSize = (size_t)(_cursor - a->_bufferData);
- ASMJIT_ASSERT(newSize <= buffer.capacity());
-
- a->_bufferPtr = _cursor;
- buffer._size = Support::max(buffer._size, newSize);
- }
-};
-
-//! Code writer utilities.
-namespace CodeWriterUtils {
-
-bool encodeOffset32(uint32_t* dst, int64_t offset64, const OffsetFormat& format) noexcept;
-bool encodeOffset64(uint64_t* dst, int64_t offset64, const OffsetFormat& format) noexcept;
-
-bool writeOffset(void* dst, int64_t offset64, const OffsetFormat& format) noexcept;
-
-} // {CodeWriterUtils}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_CODEBUFFERWRITER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/compiler.cpp b/3rdparty/asmjit/src/asmjit/core/compiler.cpp
deleted file mode 100644
index b09ae396608..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/compiler.cpp
+++ /dev/null
@@ -1,598 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/assembler.h"
-#include "../core/builder_p.h"
-#include "../core/compiler.h"
-#include "../core/cpuinfo.h"
-#include "../core/logger.h"
-#include "../core/rapass_p.h"
-#include "../core/rastack_p.h"
-#include "../core/support.h"
-#include "../core/type.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// GlobalConstPoolPass
-// ===================
-
-class GlobalConstPoolPass : public Pass {
-public:
- typedef Pass Base;
-public:
- ASMJIT_NONCOPYABLE(GlobalConstPoolPass)
-
- GlobalConstPoolPass() noexcept : Pass("GlobalConstPoolPass") {}
-
- Error run(Zone* zone, Logger* logger) override {
- DebugUtils::unused(zone, logger);
-
- // Flush the global constant pool.
- BaseCompiler* compiler = static_cast<BaseCompiler*>(_cb);
- ConstPoolNode* globalConstPool = compiler->_constPools[uint32_t(ConstPoolScope::kGlobal)];
-
- if (globalConstPool) {
- compiler->addAfter(globalConstPool, compiler->lastNode());
- compiler->_constPools[uint32_t(ConstPoolScope::kGlobal)] = nullptr;
- }
-
- return kErrorOk;
- }
-};
-
-// BaseCompiler - Construction & Destruction
-// =========================================
-
-BaseCompiler::BaseCompiler() noexcept
- : BaseBuilder(),
- _func(nullptr),
- _vRegZone(4096 - Zone::kBlockOverhead),
- _vRegArray(),
- _constPools { nullptr, nullptr } {
- _emitterType = EmitterType::kCompiler;
- _validationFlags = ValidationFlags::kEnableVirtRegs;
-}
-BaseCompiler::~BaseCompiler() noexcept {}
-
-// BaseCompiler - Function Management
-// ==================================
-
-Error BaseCompiler::newFuncNode(FuncNode** out, const FuncSignature& signature) {
- *out = nullptr;
-
- // Create FuncNode together with all the required surrounding nodes.
- FuncNode* funcNode;
- ASMJIT_PROPAGATE(_newNodeT<FuncNode>(&funcNode));
- ASMJIT_PROPAGATE(newLabelNode(&funcNode->_exitNode));
- ASMJIT_PROPAGATE(_newNodeT<SentinelNode>(&funcNode->_end, SentinelType::kFuncEnd));
-
- // Initialize the function's detail info.
- Error err = funcNode->detail().init(signature, environment());
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- // If the Target guarantees greater stack alignment than required by the calling convention
- // then override it as we can prevent having to perform dynamic stack alignment
- uint32_t environmentStackAlignment = _environment.stackAlignment();
-
- if (funcNode->_funcDetail._callConv.naturalStackAlignment() < environmentStackAlignment)
- funcNode->_funcDetail._callConv.setNaturalStackAlignment(environmentStackAlignment);
-
- // Initialize the function frame.
- err = funcNode->_frame.init(funcNode->_funcDetail);
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- // Allocate space for function arguments.
- funcNode->_args = nullptr;
- if (funcNode->argCount() != 0) {
- funcNode->_args = _allocator.allocT<FuncNode::ArgPack>(funcNode->argCount() * sizeof(FuncNode::ArgPack));
- if (ASMJIT_UNLIKELY(!funcNode->_args))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
- memset(funcNode->_args, 0, funcNode->argCount() * sizeof(FuncNode::ArgPack));
- }
-
- ASMJIT_PROPAGATE(registerLabelNode(funcNode));
-
- *out = funcNode;
- return kErrorOk;
-}
-
-Error BaseCompiler::addFuncNode(FuncNode** out, const FuncSignature& signature) {
- State state = _grabState();
-
- ASMJIT_PROPAGATE(newFuncNode(out, signature));
- ASMJIT_ASSUME(*out != nullptr);
-
- BaseBuilder_assignInlineComment(this, *out, state.comment);
-
- addFunc(*out);
- return kErrorOk;
-}
-
-Error BaseCompiler::newFuncRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
- uint32_t opCount = !o1.isNone() ? 2u : !o0.isNone() ? 1u : 0u;
- FuncRetNode* node;
-
- ASMJIT_PROPAGATE(_newNodeT<FuncRetNode>(&node));
- ASMJIT_ASSUME(node != nullptr);
-
- node->setOpCount(opCount);
- node->setOp(0, o0);
- node->setOp(1, o1);
- node->resetOpRange(2, node->opCapacity());
-
- *out = node;
- return kErrorOk;
-}
-
-Error BaseCompiler::addFuncRetNode(FuncRetNode** out, const Operand_& o0, const Operand_& o1) {
- State state = _grabState();
-
- ASMJIT_PROPAGATE(newFuncRetNode(out, o0, o1));
- ASMJIT_ASSUME(*out != nullptr);
-
- BaseBuilder_assignInlineComment(this, *out, state.comment);
-
- addNode(*out);
- return kErrorOk;
-}
-
-FuncNode* BaseCompiler::addFunc(FuncNode* func) {
- _func = func;
-
- addNode(func); // Function node.
- BaseNode* prev = cursor(); // {CURSOR}.
- addNode(func->exitNode()); // Function exit label.
- addNode(func->endNode()); // Function end sentinel.
-
- _setCursor(prev);
- return func;
-}
-
-Error BaseCompiler::endFunc() {
- FuncNode* func = _func;
- resetState();
-
- if (ASMJIT_UNLIKELY(!func))
- return reportError(DebugUtils::errored(kErrorInvalidState));
-
- // Add the local constant pool at the end of the function (if exists).
- ConstPoolNode* localConstPool = _constPools[uint32_t(ConstPoolScope::kLocal)];
- if (localConstPool) {
- setCursor(func->endNode()->prev());
- addNode(localConstPool);
- _constPools[uint32_t(ConstPoolScope::kLocal)] = nullptr;
- }
-
- // Mark as finished.
- _func = nullptr;
-
- SentinelNode* end = func->endNode();
- setCursor(end);
-
- return kErrorOk;
-}
-
-// BaseCompiler - Function Invocation
-// ==================================
-
-Error BaseCompiler::newInvokeNode(InvokeNode** out, InstId instId, const Operand_& o0, const FuncSignature& signature) {
- InvokeNode* node;
- ASMJIT_PROPAGATE(_newNodeT<InvokeNode>(&node, instId, InstOptions::kNone));
-
- node->setOpCount(1);
- node->setOp(0, o0);
- node->resetOpRange(1, node->opCapacity());
-
- Error err = node->detail().init(signature, environment());
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- // Skip the allocation if there are no arguments.
- uint32_t argCount = signature.argCount();
- if (argCount) {
- node->_args = static_cast<InvokeNode::OperandPack*>(_allocator.alloc(argCount * sizeof(InvokeNode::OperandPack)));
- if (!node->_args)
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
- memset(node->_args, 0, argCount * sizeof(InvokeNode::OperandPack));
- }
-
- *out = node;
- return kErrorOk;
-}
-
-Error BaseCompiler::addInvokeNode(InvokeNode** out, InstId instId, const Operand_& o0, const FuncSignature& signature) {
- State state = _grabState();
-
- ASMJIT_PROPAGATE(newInvokeNode(out, instId, o0, signature));
- ASMJIT_ASSUME(*out != nullptr);
-
- BaseBuilder_assignInstState(this, *out, state);
- addNode(*out);
- return kErrorOk;
-}
-
-// BaseCompiler - Virtual Registers
-// ================================
-
-static void BaseCompiler_assignGenericName(BaseCompiler* self, VirtReg* vReg) {
- uint32_t index = unsigned(Operand::virtIdToIndex(vReg->_id));
-
- char buf[64];
- int size = snprintf(buf, ASMJIT_ARRAY_SIZE(buf), "%%%u", unsigned(index));
-
- ASMJIT_ASSERT(size > 0 && size < int(ASMJIT_ARRAY_SIZE(buf)));
- vReg->_name.setData(&self->_dataZone, buf, unsigned(size));
-}
-
-Error BaseCompiler::newVirtReg(VirtReg** out, TypeId typeId, OperandSignature signature, const char* name) {
- *out = nullptr;
- uint32_t index = _vRegArray.size();
-
- if (ASMJIT_UNLIKELY(index >= uint32_t(Operand::kVirtIdCount)))
- return reportError(DebugUtils::errored(kErrorTooManyVirtRegs));
-
- if (ASMJIT_UNLIKELY(_vRegArray.willGrow(&_allocator) != kErrorOk))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- VirtReg* vReg = _vRegZone.allocZeroedT<VirtReg>();
- if (ASMJIT_UNLIKELY(!vReg))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- uint32_t size = TypeUtils::sizeOf(typeId);
- uint32_t alignment = Support::min<uint32_t>(size, 64);
-
- vReg = new(Support::PlacementNew{vReg}) VirtReg(signature, Operand::indexToVirtId(index), size, alignment, typeId);
-
-#ifndef ASMJIT_NO_LOGGING
- if (name && name[0] != '\0')
- vReg->_name.setData(&_dataZone, name, SIZE_MAX);
- else
- BaseCompiler_assignGenericName(this, vReg);
-#else
- DebugUtils::unused(name);
-#endif
-
- _vRegArray.appendUnsafe(vReg);
- *out = vReg;
-
- return kErrorOk;
-}
-
-Error BaseCompiler::_newReg(BaseReg* out, TypeId typeId, const char* name) {
- OperandSignature regSignature;
- out->reset();
-
- Error err = ArchUtils::typeIdToRegSignature(arch(), typeId, &typeId, &regSignature);
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- VirtReg* vReg;
- ASMJIT_PROPAGATE(newVirtReg(&vReg, typeId, regSignature, name));
- ASMJIT_ASSUME(vReg != nullptr);
-
- out->_initReg(regSignature, vReg->id());
- return kErrorOk;
-}
-
-Error BaseCompiler::_newRegFmt(BaseReg* out, TypeId typeId, const char* fmt, ...) {
- va_list ap;
- StringTmp<256> sb;
-
- va_start(ap, fmt);
- sb.appendVFormat(fmt, ap);
- va_end(ap);
-
- return _newReg(out, typeId, sb.data());
-}
-
-Error BaseCompiler::_newReg(BaseReg* out, const BaseReg& ref, const char* name) {
- out->reset();
-
- OperandSignature regSignature;
- TypeId typeId;
-
- if (isVirtRegValid(ref)) {
- VirtReg* vRef = virtRegByReg(ref);
- typeId = vRef->typeId();
-
- // NOTE: It's possible to cast one register type to another if it's the same register group. However, VirtReg
- // always contains the TypeId that was used to create the register. This means that in some cases we may end
- // up having different size of `ref` and `vRef`. In such case we adjust the TypeId to match the `ref` register
- // type instead of the original register type, which should be the expected behavior.
- uint32_t typeSize = TypeUtils::sizeOf(typeId);
- uint32_t refSize = ref.size();
-
- if (typeSize != refSize) {
- if (TypeUtils::isInt(typeId)) {
- // GP register - change TypeId to match `ref`, but keep sign of `vRef`.
- switch (refSize) {
- case 1: typeId = TypeId(uint32_t(TypeId::kInt8 ) | (uint32_t(typeId) & 1)); break;
- case 2: typeId = TypeId(uint32_t(TypeId::kInt16) | (uint32_t(typeId) & 1)); break;
- case 4: typeId = TypeId(uint32_t(TypeId::kInt32) | (uint32_t(typeId) & 1)); break;
- case 8: typeId = TypeId(uint32_t(TypeId::kInt64) | (uint32_t(typeId) & 1)); break;
- default: typeId = TypeId::kVoid; break;
- }
- }
- else if (TypeUtils::isMmx(typeId)) {
- // MMX register - always use 64-bit.
- typeId = TypeId::kMmx64;
- }
- else if (TypeUtils::isMask(typeId)) {
- // Mask register - change TypeId to match `ref` size.
- switch (refSize) {
- case 1: typeId = TypeId::kMask8; break;
- case 2: typeId = TypeId::kMask16; break;
- case 4: typeId = TypeId::kMask32; break;
- case 8: typeId = TypeId::kMask64; break;
- default: typeId = TypeId::kVoid; break;
- }
- }
- else {
- // Vector register - change TypeId to match `ref` size, keep vector metadata.
- TypeId scalarTypeId = TypeUtils::scalarOf(typeId);
- switch (refSize) {
- case 16: typeId = TypeUtils::scalarToVector(scalarTypeId, TypeId::_kVec128Start); break;
- case 32: typeId = TypeUtils::scalarToVector(scalarTypeId, TypeId::_kVec256Start); break;
- case 64: typeId = TypeUtils::scalarToVector(scalarTypeId, TypeId::_kVec512Start); break;
- default: typeId = TypeId::kVoid; break;
- }
- }
-
- if (typeId == TypeId::kVoid)
- return reportError(DebugUtils::errored(kErrorInvalidState));
- }
- }
- else {
- typeId = ArchTraits::byArch(arch()).regTypeToTypeId(ref.type());
- }
-
- Error err = ArchUtils::typeIdToRegSignature(arch(), typeId, &typeId, &regSignature);
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- VirtReg* vReg;
- ASMJIT_PROPAGATE(newVirtReg(&vReg, typeId, regSignature, name));
- ASMJIT_ASSUME(vReg != nullptr);
-
- out->_initReg(regSignature, vReg->id());
- return kErrorOk;
-}
-
-Error BaseCompiler::_newRegFmt(BaseReg* out, const BaseReg& ref, const char* fmt, ...) {
- va_list ap;
- StringTmp<256> sb;
-
- va_start(ap, fmt);
- sb.appendVFormat(fmt, ap);
- va_end(ap);
-
- return _newReg(out, ref, sb.data());
-}
-
-Error BaseCompiler::_newStack(BaseMem* out, uint32_t size, uint32_t alignment, const char* name) {
- out->reset();
-
- if (size == 0)
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (alignment == 0)
- alignment = 1;
-
- if (!Support::isPowerOf2(alignment))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (alignment > 64)
- alignment = 64;
-
- VirtReg* vReg;
- ASMJIT_PROPAGATE(newVirtReg(&vReg, TypeId::kVoid, OperandSignature{0}, name));
- ASMJIT_ASSUME(vReg != nullptr);
-
- vReg->_virtSize = size;
- vReg->_isStack = true;
- vReg->_alignment = uint8_t(alignment);
-
- // Set the memory operand to GPD/GPQ and its id to VirtReg.
- *out = BaseMem(OperandSignature::fromOpType(OperandType::kMem) |
- OperandSignature::fromMemBaseType(_gpSignature.regType()) |
- OperandSignature::fromBits(OperandSignature::kMemRegHomeFlag),
- vReg->id(), 0, 0);
- return kErrorOk;
-}
-
-Error BaseCompiler::setStackSize(uint32_t virtId, uint32_t newSize, uint32_t newAlignment) {
- if (!isVirtIdValid(virtId))
- return DebugUtils::errored(kErrorInvalidVirtId);
-
- if (newAlignment && !Support::isPowerOf2(newAlignment))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (newAlignment > 64)
- newAlignment = 64;
-
- VirtReg* vReg = virtRegById(virtId);
- if (newSize)
- vReg->_virtSize = newSize;
-
- if (newAlignment)
- vReg->_alignment = uint8_t(newAlignment);
-
- // This is required if the RAPass is already running. There is a chance that a stack-slot has been already
- // allocated and in that case it has to be updated as well, otherwise we would allocate wrong amount of memory.
- RAWorkReg* workReg = vReg->_workReg;
- if (workReg && workReg->_stackSlot) {
- workReg->_stackSlot->_size = vReg->_virtSize;
- workReg->_stackSlot->_alignment = vReg->_alignment;
- }
-
- return kErrorOk;
-}
-
-Error BaseCompiler::_newConst(BaseMem* out, ConstPoolScope scope, const void* data, size_t size) {
- out->reset();
-
- if (uint32_t(scope) > 1)
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (!_constPools[uint32_t(scope)])
- ASMJIT_PROPAGATE(newConstPoolNode(&_constPools[uint32_t(scope)]));
-
- ConstPoolNode* pool = _constPools[uint32_t(scope)];
- size_t off;
- Error err = pool->add(data, size, off);
-
- if (ASMJIT_UNLIKELY(err))
- return reportError(err);
-
- *out = BaseMem(OperandSignature::fromOpType(OperandType::kMem) |
- OperandSignature::fromMemBaseType(RegType::kLabelTag) |
- OperandSignature::fromSize(uint32_t(size)),
- pool->labelId(), 0, int32_t(off));
- return kErrorOk;
-}
-
-void BaseCompiler::rename(const BaseReg& reg, const char* fmt, ...) {
- if (!reg.isVirtReg()) return;
-
- VirtReg* vReg = virtRegById(reg.id());
- if (!vReg) return;
-
- if (fmt && fmt[0] != '\0') {
- char buf[128];
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap);
- va_end(ap);
-
- vReg->_name.setData(&_dataZone, buf, SIZE_MAX);
- }
- else {
- BaseCompiler_assignGenericName(this, vReg);
- }
-}
-
-// BaseCompiler - Jump Annotations
-// ===============================
-
-Error BaseCompiler::newJumpNode(JumpNode** out, InstId instId, InstOptions instOptions, const Operand_& o0, JumpAnnotation* annotation) {
- JumpNode* node = _allocator.allocT<JumpNode>();
- uint32_t opCount = 1;
-
- *out = node;
- if (ASMJIT_UNLIKELY(!node))
- return reportError(DebugUtils::errored(kErrorOutOfMemory));
-
- node = new(Support::PlacementNew{node}) JumpNode(this, instId, instOptions, opCount, annotation);
- node->setOp(0, o0);
- node->resetOpRange(opCount, JumpNode::kBaseOpCapacity);
-
- return kErrorOk;
-}
-
-Error BaseCompiler::emitAnnotatedJump(InstId instId, const Operand_& o0, JumpAnnotation* annotation) {
- State state = _grabState();
-
- JumpNode* node;
- ASMJIT_PROPAGATE(newJumpNode(&node, instId, state.options, o0, annotation));
-
- node->setExtraReg(state.extraReg);
- BaseBuilder_assignInlineComment(this, node, state.comment);
-
- addNode(node);
- return kErrorOk;
-}
-
-JumpAnnotation* BaseCompiler::newJumpAnnotation() {
- if (_jumpAnnotations.grow(&_allocator, 1) != kErrorOk) {
- reportError(DebugUtils::errored(kErrorOutOfMemory));
- return nullptr;
- }
-
- uint32_t id = _jumpAnnotations.size();
- JumpAnnotation* jumpAnnotation = _allocator.newT<JumpAnnotation>(this, id);
-
- if (!jumpAnnotation) {
- reportError(DebugUtils::errored(kErrorOutOfMemory));
- return nullptr;
- }
-
- _jumpAnnotations.appendUnsafe(jumpAnnotation);
- return jumpAnnotation;
-}
-
-// BaseCompiler - Events
-// =====================
-
-Error BaseCompiler::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- const ArchTraits& archTraits = ArchTraits::byArch(code->arch());
- RegType nativeRegType = Environment::is32Bit(code->arch()) ? RegType::kGp32 : RegType::kGp64;
- _gpSignature = archTraits.regTypeToSignature(nativeRegType);
-
- Error err = addPassT<GlobalConstPoolPass>();
- if (ASMJIT_UNLIKELY(err)) {
- onDetach(code);
- return err;
- }
-
- return kErrorOk;
-}
-
-Error BaseCompiler::onDetach(CodeHolder* code) noexcept {
- _func = nullptr;
- _constPools[uint32_t(ConstPoolScope::kLocal)] = nullptr;
- _constPools[uint32_t(ConstPoolScope::kGlobal)] = nullptr;
-
- _vRegArray.reset();
- _vRegZone.reset();
-
- return Base::onDetach(code);
-}
-
-// FuncPass - Construction & Destruction
-// =====================================
-
-FuncPass::FuncPass(const char* name) noexcept
- : Pass(name) {}
-
-// FuncPass - Run
-// ==============
-
-Error FuncPass::run(Zone* zone, Logger* logger) {
- BaseNode* node = cb()->firstNode();
- if (!node) return kErrorOk;
-
- do {
- if (node->type() == NodeType::kFunc) {
- FuncNode* func = node->as<FuncNode>();
- node = func->endNode();
- ASMJIT_PROPAGATE(runOnFunction(zone, logger, func));
- }
-
- // Find a function by skipping all nodes that are not `NodeType::kFunc`.
- do {
- node = node->next();
- } while (node && node->type() != NodeType::kFunc);
- } while (node);
-
- return kErrorOk;
-}
-
-// [[pure virtual]]
-Error FuncPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
- DebugUtils::unused(zone, logger, func);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/core/compiler.h b/3rdparty/asmjit/src/asmjit/core/compiler.h
deleted file mode 100644
index 7d4b47c4597..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/compiler.h
+++ /dev/null
@@ -1,741 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_COMPILER_H_INCLUDED
-#define ASMJIT_CORE_COMPILER_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/assembler.h"
-#include "../core/builder.h"
-#include "../core/constpool.h"
-#include "../core/compilerdefs.h"
-#include "../core/func.h"
-#include "../core/inst.h"
-#include "../core/operand.h"
-#include "../core/support.h"
-#include "../core/zone.h"
-#include "../core/zonevector.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-class JumpAnnotation;
-class JumpNode;
-class FuncNode;
-class FuncRetNode;
-class InvokeNode;
-
-//! \addtogroup asmjit_compiler
-//! \{
-
-//! Code emitter that uses virtual registers and performs register allocation.
-//!
-//! Compiler is a high-level code-generation tool that provides register allocation and automatic handling of function
-//! calling conventions. It was primarily designed for merging multiple parts of code into a function without worrying
-//! about registers and function calling conventions.
-//!
-//! BaseCompiler can be used, with a minimum effort, to handle 32-bit and 64-bit code generation within a single code
-//! base.
-//!
-//! BaseCompiler is based on BaseBuilder and contains all the features it provides. It means that the code it stores
-//! can be modified (removed, added, injected) and analyzed. When the code is finalized the compiler can emit the code
-//! into an Assembler to translate the abstract representation into a machine code.
-//!
-//! Check out architecture specific compilers for more details and examples:
-//!
-//! - \ref x86::Compiler - X86/X64 compiler implementation.
-//! - \ref a64::Compiler - AArch64 compiler implementation.
-class ASMJIT_VIRTAPI BaseCompiler : public BaseBuilder {
-public:
- ASMJIT_NONCOPYABLE(BaseCompiler)
- typedef BaseBuilder Base;
-
- //! \name Members
- //! \{
-
- //! Current function.
- FuncNode* _func;
- //! Allocates `VirtReg` objects.
- Zone _vRegZone;
- //! Stores array of `VirtReg` pointers.
- ZoneVector<VirtReg*> _vRegArray;
- //! Stores jump annotations.
- ZoneVector<JumpAnnotation*> _jumpAnnotations;
-
- //! Local and global constant pools.
- //!
- //! Local constant pool is flushed with each function, global constant pool is flushed only by \ref finalize().
- ConstPoolNode* _constPools[2];
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `BaseCompiler` instance.
- ASMJIT_API BaseCompiler() noexcept;
- //! Destroys the `BaseCompiler` instance.
- ASMJIT_API ~BaseCompiler() noexcept override;
-
- //! \}
-
- //! \name Function Management
- //! \{
-
- //! Creates a new \ref FuncNode.
- ASMJIT_API Error newFuncNode(FuncNode** ASMJIT_NONNULL(out), const FuncSignature& signature);
- //! Creates a new \ref FuncNode adds it to the instruction stream.
- ASMJIT_API Error addFuncNode(FuncNode** ASMJIT_NONNULL(out), const FuncSignature& signature);
-
- //! Creates a new \ref FuncRetNode.
- ASMJIT_API Error newFuncRetNode(FuncRetNode** ASMJIT_NONNULL(out), const Operand_& o0, const Operand_& o1);
- //! Creates a new \ref FuncRetNode and adds it to the instruction stream.
- ASMJIT_API Error addFuncRetNode(FuncRetNode** ASMJIT_NONNULL(out), const Operand_& o0, const Operand_& o1);
-
- //! Returns the current function.
- ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return _func; }
-
- //! Creates a new \ref FuncNode with the given `signature` and returns it.
- inline FuncNode* newFunc(const FuncSignature& signature) {
- FuncNode* node;
- newFuncNode(&node, signature);
- return node;
- }
-
- //! Creates a new \ref FuncNode with the given `signature`, adds it to the instruction stream by using
- //! the \ref addFunc(FuncNode*) overload, and returns it.
- inline FuncNode* addFunc(const FuncSignature& signature) {
- FuncNode* node;
- addFuncNode(&node, signature);
- return node;
- }
-
- //! Adds a function `node` to the instruction stream.
- ASMJIT_API FuncNode* addFunc(FuncNode* ASMJIT_NONNULL(func));
- //! Emits a sentinel that marks the end of the current function.
- ASMJIT_API Error endFunc();
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- inline Error _setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg);
-
- //! Sets a function argument at `argIndex` to `reg`.
- ASMJIT_DEPRECATED("Setting arguments through Compiler is deprecated, use FuncNode->setArg() instead")
- inline Error setArg(size_t argIndex, const BaseReg& reg) { return _setArg(argIndex, 0, reg); }
-
- //! Sets a function argument at `argIndex` at `valueIndex` to `reg`.
- ASMJIT_DEPRECATED("Setting arguments through Compiler is deprecated, use FuncNode->setArg() instead")
- inline Error setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) { return _setArg(argIndex, valueIndex, reg); }
-#endif
-
- inline Error addRet(const Operand_& o0, const Operand_& o1) {
- FuncRetNode* node;
- return addFuncRetNode(&node, o0, o1);
- }
-
- //! \}
-
- //! \name Function Invocation
- //! \{
-
- //! Creates a new \ref InvokeNode.
- ASMJIT_API Error newInvokeNode(InvokeNode** ASMJIT_NONNULL(out), InstId instId, const Operand_& o0, const FuncSignature& signature);
- //! Creates a new \ref InvokeNode and adds it to the instruction stream.
- ASMJIT_API Error addInvokeNode(InvokeNode** ASMJIT_NONNULL(out), InstId instId, const Operand_& o0, const FuncSignature& signature);
-
- //! \}
-
- //! \name Virtual Registers
- //! \{
-
- //! Creates a new virtual register representing the given `typeId` and `signature`.
- //!
- //! \note This function is public, but it's not generally recommended to be used by AsmJit users, use architecture
- //! specific `newReg()` functionality instead or functions like \ref _newReg() and \ref _newRegFmt().
- ASMJIT_API Error newVirtReg(VirtReg** ASMJIT_NONNULL(out), TypeId typeId, OperandSignature signature, const char* name);
-
- //! Creates a new virtual register of the given `typeId` and stores it to `out` operand.
- ASMJIT_API Error _newReg(BaseReg* ASMJIT_NONNULL(out), TypeId typeId, const char* name = nullptr);
-
- //! Creates a new virtual register of the given `typeId` and stores it to `out` operand.
- //!
- //! \note This version accepts a snprintf() format `fmt` followed by a variadic arguments.
- ASMJIT_API Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), TypeId typeId, const char* fmt, ...);
- //! \overload
- inline Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), TypeId typeId) { return _newRegFmt(out, typeId, nullptr); }
-
- //! Creates a new virtual register compatible with the provided reference register `ref`.
- ASMJIT_API Error _newReg(BaseReg* ASMJIT_NONNULL(out), const BaseReg& ref, const char* name = nullptr);
-
- //! Creates a new virtual register compatible with the provided reference register `ref`.
- //!
- //! \note This version accepts a snprintf() format `fmt` followed by a variadic arguments.
- ASMJIT_API Error _newRegFmt(BaseReg* ASMJIT_NONNULL(out), const BaseReg& ref, const char* fmt, ...);
-
- //! Tests whether the given `id` is a valid virtual register id.
- ASMJIT_INLINE_NODEBUG bool isVirtIdValid(uint32_t id) const noexcept {
- uint32_t index = Operand::virtIdToIndex(id);
- return index < _vRegArray.size();
- }
- //! Tests whether the given `reg` is a virtual register having a valid id.
- ASMJIT_INLINE_NODEBUG bool isVirtRegValid(const BaseReg& reg) const noexcept {
- return isVirtIdValid(reg.id());
- }
-
- //! Returns \ref VirtReg associated with the given `id`.
- inline VirtReg* virtRegById(uint32_t id) const noexcept {
- ASMJIT_ASSERT(isVirtIdValid(id));
- return _vRegArray[Operand::virtIdToIndex(id)];
- }
-
- //! Returns \ref VirtReg associated with the given `reg`.
- ASMJIT_INLINE_NODEBUG VirtReg* virtRegByReg(const BaseReg& reg) const noexcept { return virtRegById(reg.id()); }
-
- //! Returns \ref VirtReg associated with the given virtual register `index`.
- //!
- //! \note This is not the same as virtual register id. The conversion between id and its index is implemented
- //! by \ref Operand_::virtIdToIndex() and \ref Operand_::indexToVirtId() functions.
- ASMJIT_INLINE_NODEBUG VirtReg* virtRegByIndex(uint32_t index) const noexcept { return _vRegArray[index]; }
-
- //! Returns an array of all virtual registers managed by the Compiler.
- ASMJIT_INLINE_NODEBUG const ZoneVector<VirtReg*>& virtRegs() const noexcept { return _vRegArray; }
-
- //! \name Stack
- //! \{
-
- //! Creates a new stack of the given `size` and `alignment` and stores it to `out`.
- //!
- //! \note `name` can be used to give the stack a name, for debugging purposes.
- ASMJIT_API Error _newStack(BaseMem* ASMJIT_NONNULL(out), uint32_t size, uint32_t alignment, const char* name = nullptr);
-
- //! Updates the stack size of a stack created by `_newStack()` by its `virtId`.
- ASMJIT_API Error setStackSize(uint32_t virtId, uint32_t newSize, uint32_t newAlignment = 0);
-
- //! Updates the stack size of a stack created by `_newStack()`.
- ASMJIT_INLINE_NODEBUG Error setStackSize(const BaseMem& mem, uint32_t newSize, uint32_t newAlignment = 0) {
- return setStackSize(mem.id(), newSize, newAlignment);
- }
-
- //! \}
-
- //! \name Constants
- //! \{
-
- //! Creates a new constant of the given `scope` (see \ref ConstPoolScope).
- //!
- //! This function adds a constant of the given `size` to the built-in \ref ConstPool and stores the reference to that
- //! constant to the `out` operand.
- ASMJIT_API Error _newConst(BaseMem* ASMJIT_NONNULL(out), ConstPoolScope scope, const void* data, size_t size);
-
- //! \}
-
- //! \name Miscellaneous
- //! \{
-
- //! Rename the given virtual register `reg` to a formatted string `fmt`.
- ASMJIT_API void rename(const BaseReg& reg, const char* fmt, ...);
-
- //! \}
-
- //! \name Jump Annotations
- //! \{
-
- ASMJIT_INLINE_NODEBUG const ZoneVector<JumpAnnotation*>& jumpAnnotations() const noexcept {
- return _jumpAnnotations;
- }
-
- ASMJIT_API Error newJumpNode(JumpNode** ASMJIT_NONNULL(out), InstId instId, InstOptions instOptions, const Operand_& o0, JumpAnnotation* annotation);
- ASMJIT_API Error emitAnnotatedJump(InstId instId, const Operand_& o0, JumpAnnotation* annotation);
-
- //! Returns a new `JumpAnnotation` instance, which can be used to aggregate possible targets of a jump where the
- //! target is not a label, for example to implement jump tables.
- ASMJIT_API JumpAnnotation* newJumpAnnotation();
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-};
-
-//! Jump annotation used to annotate jumps.
-//!
-//! \ref BaseCompiler allows to emit jumps where the target is either register or memory operand. Such jumps cannot be
-//! trivially inspected, so instead of doing heuristics AsmJit allows to annotate such jumps with possible targets.
-//! Register allocator then uses the annotation to construct control-flow, which is then used by liveness analysis and
-//! other tools to prepare ground for register allocation.
-class JumpAnnotation {
-public:
- ASMJIT_NONCOPYABLE(JumpAnnotation)
-
- //! \name Members
- //! \{
-
- //! Compiler that owns this JumpAnnotation.
- BaseCompiler* _compiler;
- //! Annotation identifier.
- uint32_t _annotationId;
- //! Vector of label identifiers, see \ref labelIds().
- ZoneVector<uint32_t> _labelIds;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG JumpAnnotation(BaseCompiler* ASMJIT_NONNULL(compiler), uint32_t annotationId) noexcept
- : _compiler(compiler),
- _annotationId(annotationId) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the compiler that owns this JumpAnnotation.
- ASMJIT_INLINE_NODEBUG BaseCompiler* compiler() const noexcept { return _compiler; }
- //! Returns the annotation id.
- ASMJIT_INLINE_NODEBUG uint32_t annotationId() const noexcept { return _annotationId; }
- //! Returns a vector of label identifiers that lists all targets of the jump.
- ASMJIT_INLINE_NODEBUG const ZoneVector<uint32_t>& labelIds() const noexcept { return _labelIds; }
-
- //! Tests whether the given `label` is a target of this JumpAnnotation.
- ASMJIT_INLINE_NODEBUG bool hasLabel(const Label& label) const noexcept { return hasLabelId(label.id()); }
- //! Tests whether the given `labelId` is a target of this JumpAnnotation.
- ASMJIT_INLINE_NODEBUG bool hasLabelId(uint32_t labelId) const noexcept { return _labelIds.contains(labelId); }
-
- //! \}
-
- //! \name Annotation Building API
- //! \{
-
- //! Adds the `label` to the list of targets of this JumpAnnotation.
- ASMJIT_INLINE_NODEBUG Error addLabel(const Label& label) noexcept { return addLabelId(label.id()); }
- //! Adds the `labelId` to the list of targets of this JumpAnnotation.
- ASMJIT_INLINE_NODEBUG Error addLabelId(uint32_t labelId) noexcept { return _labelIds.append(&_compiler->_allocator, labelId); }
-
- //! \}
-};
-
-//! Jump instruction with \ref JumpAnnotation.
-//!
-//! \note This node should be only used to represent jump where the jump target cannot be deduced by examining
-//! instruction operands. For example if the jump target is register or memory location. This pattern is often
-//! used to perform indirect jumps that use jump table, e.g. to implement `switch{}` statement.
-class JumpNode : public InstNodeWithOperands<InstNode::kBaseOpCapacity> {
-public:
- ASMJIT_NONCOPYABLE(JumpNode)
-
- //! \name Members
- //! \{
-
- JumpAnnotation* _annotation;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- inline JumpNode(BaseCompiler* ASMJIT_NONNULL(cc), InstId instId, InstOptions options, uint32_t opCount, JumpAnnotation* annotation) noexcept
- : InstNodeWithOperands(cc, instId, options, opCount),
- _annotation(annotation) {
- setType(NodeType::kJump);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether this JumpNode has associated a \ref JumpAnnotation.
- ASMJIT_INLINE_NODEBUG bool hasAnnotation() const noexcept { return _annotation != nullptr; }
- //! Returns the \ref JumpAnnotation associated with this jump, or `nullptr`.
- ASMJIT_INLINE_NODEBUG JumpAnnotation* annotation() const noexcept { return _annotation; }
- //! Sets the \ref JumpAnnotation associated with this jump to `annotation`.
- ASMJIT_INLINE_NODEBUG void setAnnotation(JumpAnnotation* annotation) noexcept { _annotation = annotation; }
-
- //! \}
-};
-
-//! Function node represents a function used by \ref BaseCompiler.
-//!
-//! A function is composed of the following:
-//!
-//! - Function entry, \ref FuncNode acts as a label, so the entry is implicit. To get the entry, simply use
-//! \ref FuncNode::label(), which is the same as \ref LabelNode::label().
-//!
-//! - Function exit, which is represented by \ref FuncNode::exitNode(). A helper function
-//! \ref FuncNode::exitLabel() exists and returns an exit label instead of node.
-//!
-//! - Function \ref FuncNode::endNode() sentinel. This node marks the end of a function - there should be no
-//! code that belongs to the function after this node, but the Compiler doesn't enforce that at the moment.
-//!
-//! - Function detail, see \ref FuncNode::detail().
-//!
-//! - Function frame, see \ref FuncNode::frame().
-//!
-//! - Function arguments mapped to virtual registers, see \ref FuncNode::argPacks().
-//!
-//! In a node list, the function and its body looks like the following:
-//!
-//! \code{.unparsed}
-//! [...] - Anything before the function.
-//!
-//! [FuncNode] - Entry point of the function, acts as a label as well.
-//! <Prolog> - Prolog inserted by the register allocator.
-//! {...} - Function body - user code basically.
-//! [ExitLabel] - Exit label
-//! <Epilog> - Epilog inserted by the register allocator.
-//! <Return> - Return inserted by the register allocator.
-//! {...} - Can contain data or user code (error handling, special cases, ...).
-//! [FuncEnd] - End sentinel
-//!
-//! [...] - Anything after the function.
-//! \endcode
-//!
-//! When a function is added to the instruction stream by \ref BaseCompiler::addFunc() it actually inserts 3 nodes
-//! (FuncNode, ExitLabel, and FuncEnd) and sets the current cursor to be FuncNode. When \ref BaseCompiler::endFunc()
-//! is called the cursor is set to FuncEnd. This guarantees that user can use ExitLabel as a marker after additional
-//! code or data can be placed, which is a common practice.
-class FuncNode : public LabelNode {
-public:
- ASMJIT_NONCOPYABLE(FuncNode)
-
- //! Arguments pack.
- struct ArgPack {
- RegOnly _data[Globals::kMaxValuePack];
-
- inline void reset() noexcept {
- for (size_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++)
- _data[valueIndex].reset();
- }
-
- inline RegOnly& operator[](size_t valueIndex) noexcept { return _data[valueIndex]; }
- inline const RegOnly& operator[](size_t valueIndex) const noexcept { return _data[valueIndex]; }
- };
-
- //! \name Members
- //! \{
-
- //! Function detail.
- FuncDetail _funcDetail;
- //! Function frame.
- FuncFrame _frame;
- //! Function exit label.
- LabelNode* _exitNode;
- //! Function end (sentinel).
- SentinelNode* _end;
- //! Argument packs.
- ArgPack* _args;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `FuncNode` instance.
- //!
- //! Always use `BaseCompiler::addFunc()` to create a new `FuncNode`.
- inline FuncNode(BaseBuilder* ASMJIT_NONNULL(cb)) noexcept
- : LabelNode(cb),
- _funcDetail(),
- _frame(),
- _exitNode(nullptr),
- _end(nullptr),
- _args(nullptr) {
- setType(NodeType::kFunc);
- }
-
- //! \}
-
- //! \{
- //! \name Accessors
-
- //! Returns function exit `LabelNode`.
- ASMJIT_INLINE_NODEBUG LabelNode* exitNode() const noexcept { return _exitNode; }
- //! Returns function exit label.
- ASMJIT_INLINE_NODEBUG Label exitLabel() const noexcept { return _exitNode->label(); }
-
- //! Returns "End of Func" sentinel node.
- ASMJIT_INLINE_NODEBUG SentinelNode* endNode() const noexcept { return _end; }
-
- //! Returns function detail.
- ASMJIT_INLINE_NODEBUG FuncDetail& detail() noexcept { return _funcDetail; }
- //! Returns function detail.
- ASMJIT_INLINE_NODEBUG const FuncDetail& detail() const noexcept { return _funcDetail; }
-
- //! Returns function frame.
- ASMJIT_INLINE_NODEBUG FuncFrame& frame() noexcept { return _frame; }
- //! Returns function frame.
- ASMJIT_INLINE_NODEBUG const FuncFrame& frame() const noexcept { return _frame; }
-
- //! Returns function attributes.
- ASMJIT_INLINE_NODEBUG FuncAttributes attributes() const noexcept { return _frame.attributes(); }
- //! Adds `attrs` to the function attributes.
- ASMJIT_INLINE_NODEBUG void addAttributes(FuncAttributes attrs) noexcept { _frame.addAttributes(attrs); }
-
- //! Returns arguments count.
- ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _funcDetail.argCount(); }
- //! Returns argument packs.
- ASMJIT_INLINE_NODEBUG ArgPack* argPacks() const noexcept { return _args; }
-
- //! Tests whether the function has a return value.
- ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return _funcDetail.hasRet(); }
-
- //! Returns argument pack at `argIndex`.
- inline ArgPack& argPack(size_t argIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- return _args[argIndex];
- }
-
- //! Sets argument at `argIndex`.
- inline void setArg(size_t argIndex, const BaseReg& vReg) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex][0].init(vReg);
- }
-
- //! \overload
- inline void setArg(size_t argIndex, const RegOnly& vReg) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex][0].init(vReg);
- }
-
- //! Sets argument at `argIndex` and `valueIndex`.
- inline void setArg(size_t argIndex, size_t valueIndex, const BaseReg& vReg) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex][valueIndex].init(vReg);
- }
-
- //! \overload
- inline void setArg(size_t argIndex, size_t valueIndex, const RegOnly& vReg) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex][valueIndex].init(vReg);
- }
-
- //! Resets argument pack at `argIndex`.
- inline void resetArg(size_t argIndex) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex].reset();
- }
-
- //! Resets argument pack at `argIndex`.
- inline void resetArg(size_t argIndex, size_t valueIndex) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex][valueIndex].reset();
- }
-
- //! \}
-};
-
-//! Function return, used by \ref BaseCompiler.
-class FuncRetNode : public InstNodeWithOperands<InstNode::kBaseOpCapacity> {
-public:
- ASMJIT_NONCOPYABLE(FuncRetNode)
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `FuncRetNode` instance.
- inline FuncRetNode(BaseBuilder* ASMJIT_NONNULL(cb)) noexcept
- : InstNodeWithOperands(cb, BaseInst::kIdAbstract, InstOptions::kNone, 0) {
- _any._nodeType = NodeType::kFuncRet;
- }
-
- //! \}
-};
-
-//! Function invocation, used by \ref BaseCompiler.
-class InvokeNode : public InstNodeWithOperands<InstNode::kBaseOpCapacity> {
-public:
- ASMJIT_NONCOPYABLE(InvokeNode)
-
- //! Operand pack provides multiple operands that can be associated with a single return value of function
- //! argument. Sometimes this is necessary to express an argument or return value that requires multiple
- //! registers, for example 64-bit value in 32-bit mode or passing / returning homogeneous data structures.
- struct OperandPack {
- //! Operands.
- Operand_ _data[Globals::kMaxValuePack];
-
- //! Reset the pack by resetting all operands in the pack.
- inline void reset() noexcept {
- for (size_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++)
- _data[valueIndex].reset();
- }
-
- //! Returns an operand at the given `valueIndex`.
- inline Operand& operator[](size_t valueIndex) noexcept {
- ASMJIT_ASSERT(valueIndex < Globals::kMaxValuePack);
- return _data[valueIndex].as<Operand>();
- }
-
- //! Returns an operand at the given `valueIndex` (const).
- const inline Operand& operator[](size_t valueIndex) const noexcept {
- ASMJIT_ASSERT(valueIndex < Globals::kMaxValuePack);
- return _data[valueIndex].as<Operand>();
- }
- };
-
- //! \name Members
- //! \{
-
- //! Function detail.
- FuncDetail _funcDetail;
- //! Function return value(s).
- OperandPack _rets;
- //! Function arguments.
- OperandPack* _args;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `InvokeNode` instance.
- inline InvokeNode(BaseBuilder* ASMJIT_NONNULL(cb), InstId instId, InstOptions options) noexcept
- : InstNodeWithOperands(cb, instId, options, 0),
- _funcDetail(),
- _args(nullptr) {
- setType(NodeType::kInvoke);
- _resetOps();
- _rets.reset();
- addFlags(NodeFlags::kIsRemovable);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Sets the function signature.
- inline Error init(const FuncSignature& signature, const Environment& environment) noexcept {
- return _funcDetail.init(signature, environment);
- }
-
- //! Returns the function detail.
- ASMJIT_INLINE_NODEBUG FuncDetail& detail() noexcept { return _funcDetail; }
- //! Returns the function detail.
- ASMJIT_INLINE_NODEBUG const FuncDetail& detail() const noexcept { return _funcDetail; }
-
- //! Returns the target operand.
- ASMJIT_INLINE_NODEBUG Operand& target() noexcept { return op(0); }
- //! \overload
- ASMJIT_INLINE_NODEBUG const Operand& target() const noexcept { return op(0); }
-
- //! Returns the number of function return values.
- ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return _funcDetail.hasRet(); }
- //! Returns the number of function arguments.
- ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _funcDetail.argCount(); }
-
- //! Returns operand pack representing function return value(s).
- ASMJIT_INLINE_NODEBUG OperandPack& retPack() noexcept { return _rets; }
- //! Returns operand pack representing function return value(s).
- ASMJIT_INLINE_NODEBUG const OperandPack& retPack() const noexcept { return _rets; }
-
- //! Returns the return value at the given `valueIndex`.
- ASMJIT_INLINE_NODEBUG Operand& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; }
- //! \overload
- ASMJIT_INLINE_NODEBUG const Operand& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; }
-
- //! Returns operand pack representing function return value(s).
- inline OperandPack& argPack(size_t argIndex) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- return _args[argIndex];
- }
- //! \overload
- inline const OperandPack& argPack(size_t argIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- return _args[argIndex];
- }
-
- //! Returns a function argument at the given `argIndex`.
- inline Operand& arg(size_t argIndex, size_t valueIndex) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- return _args[argIndex][valueIndex];
- }
- //! \overload
- inline const Operand& arg(size_t argIndex, size_t valueIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- return _args[argIndex][valueIndex];
- }
-
- //! Sets the function return value at `i` to `op`.
- inline void _setRet(size_t valueIndex, const Operand_& op) noexcept { _rets[valueIndex] = op; }
- //! Sets the function argument at `i` to `op`.
- inline void _setArg(size_t argIndex, size_t valueIndex, const Operand_& op) noexcept {
- ASMJIT_ASSERT(argIndex < argCount());
- _args[argIndex][valueIndex] = op;
- }
-
- //! Sets the function return value at `valueIndex` to `reg`.
- ASMJIT_INLINE_NODEBUG void setRet(size_t valueIndex, const BaseReg& reg) noexcept { _setRet(valueIndex, reg); }
-
- //! Sets the first function argument in a value-pack at `argIndex` to `reg`.
- ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, const BaseReg& reg) noexcept { _setArg(argIndex, 0, reg); }
- //! Sets the first function argument in a value-pack at `argIndex` to `imm`.
- ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, const Imm& imm) noexcept { _setArg(argIndex, 0, imm); }
-
- //! Sets the function argument at `argIndex` and `valueIndex` to `reg`.
- ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) noexcept { _setArg(argIndex, valueIndex, reg); }
- //! Sets the function argument at `argIndex` and `valueIndex` to `imm`.
- ASMJIT_INLINE_NODEBUG void setArg(size_t argIndex, size_t valueIndex, const Imm& imm) noexcept { _setArg(argIndex, valueIndex, imm); }
-
- //! \}
-};
-
-//! Function pass extends \ref Pass with \ref FuncPass::runOnFunction().
-class ASMJIT_VIRTAPI FuncPass : public Pass {
-public:
- ASMJIT_NONCOPYABLE(FuncPass)
- typedef Pass Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API FuncPass(const char* name) noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the associated `BaseCompiler`.
- ASMJIT_INLINE_NODEBUG BaseCompiler* cc() const noexcept { return static_cast<BaseCompiler*>(_cb); }
-
- //! \}
-
- //! \name Pass Interface
- //! \{
-
- //! Calls `runOnFunction()` on each `FuncNode` node found.
- ASMJIT_API Error run(Zone* zone, Logger* logger) override;
-
- //! Called once per `FuncNode`.
- ASMJIT_API virtual Error runOnFunction(Zone* zone, Logger* logger, FuncNode* func);
-
- //! \}
-};
-
-#if !defined(ASMJIT_NO_DEPRECATED)
-inline Error BaseCompiler::_setArg(size_t argIndex, size_t valueIndex, const BaseReg& reg) {
- FuncNode* func = _func;
-
- if (ASMJIT_UNLIKELY(!func))
- return reportError(DebugUtils::errored(kErrorInvalidState));
-
- func->setArg(argIndex, valueIndex, reg);
- return kErrorOk;
-}
-#endif
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_CORE_COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/compilerdefs.h b/3rdparty/asmjit/src/asmjit/core/compilerdefs.h
deleted file mode 100644
index e2e74ce6790..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/compilerdefs.h
+++ /dev/null
@@ -1,171 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
-#define ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
-
-#include "../core/api-config.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-#include "../core/zonestring.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-class RAWorkReg;
-
-//! \addtogroup asmjit_compiler
-//! \{
-
-//! Virtual register data, managed by \ref BaseCompiler.
-class VirtReg {
-public:
- ASMJIT_NONCOPYABLE(VirtReg)
-
- //! \name Members
- //! \{
-
- //! Virtual register signature.
- OperandSignature _signature {};
- //! Virtual register id.
- uint32_t _id = 0;
- //! Virtual register size (can be smaller than `_signature._size`).
- uint32_t _virtSize = 0;
- //! Virtual register alignment (for spilling).
- uint8_t _alignment = 0;
- //! Type-id.
- TypeId _typeId = TypeId::kVoid;
- //! Virtual register weight for alloc/spill decisions.
- uint8_t _weight = 1;
- //! True if this is a fixed register, never reallocated.
- uint8_t _isFixed : 1;
- //! True if the virtual register is only used as a stack (never accessed as register).
- uint8_t _isStack : 1;
- //! True if this virtual register has assigned stack offset (can be only valid after register allocation pass).
- uint8_t _hasStackSlot : 1;
- uint8_t _reservedBits : 5;
-
- //! Stack offset assigned by the register allocator relative to stack pointer (can be negative as well).
- int32_t _stackOffset = 0;
-
- //! Reserved for future use (padding).
- uint32_t _reservedU32 = 0;
-
- //! Virtual register name (user provided or automatically generated).
- ZoneString<16> _name {};
-
- // The following members are used exclusively by RAPass. They are initialized when the VirtReg is created to
- // null pointers and then changed during RAPass execution. RAPass sets them back to NULL before it returns.
-
- //! Reference to `RAWorkReg`, used during register allocation.
- RAWorkReg* _workReg = nullptr;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG VirtReg(OperandSignature signature, uint32_t id, uint32_t virtSize, uint32_t alignment, TypeId typeId) noexcept
- : _signature(signature),
- _id(id),
- _virtSize(virtSize),
- _alignment(uint8_t(alignment)),
- _typeId(typeId),
- _isFixed(0),
- _isStack(0),
- _hasStackSlot(0),
- _reservedBits(0) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the virtual register id.
- ASMJIT_INLINE_NODEBUG uint32_t id() const noexcept { return _id; }
-
- //! Returns the virtual register name.
- ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _name.data(); }
- //! Returns the size of the virtual register name.
- ASMJIT_INLINE_NODEBUG uint32_t nameSize() const noexcept { return _name.size(); }
-
- //! Returns a register signature of this virtual register.
- ASMJIT_INLINE_NODEBUG OperandSignature signature() const noexcept { return _signature; }
- //! Returns a virtual register type (maps to the physical register type as well).
- ASMJIT_INLINE_NODEBUG RegType type() const noexcept { return _signature.regType(); }
- //! Returns a virtual register group (maps to the physical register group as well).
- ASMJIT_INLINE_NODEBUG RegGroup group() const noexcept { return _signature.regGroup(); }
-
- //! Returns a real size of the register this virtual register maps to.
- //!
- //! For example if this is a 128-bit SIMD register used for a scalar single precision floating point value then
- //! its virtSize would be 4, however, the `regSize` would still say 16 (128-bits), because it's the smallest size
- //! of that register type.
- ASMJIT_INLINE_NODEBUG uint32_t regSize() const noexcept { return _signature.size(); }
-
- //! Returns the virtual register size.
- //!
- //! The virtual register size describes how many bytes the virtual register needs to store its content. It can be
- //! smaller than the physical register size, see `regSize()`.
- ASMJIT_INLINE_NODEBUG uint32_t virtSize() const noexcept { return _virtSize; }
-
- //! Returns the virtual register alignment.
- ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
-
- //! Returns the virtual register type id.
- ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return _typeId; }
-
- //! Returns the virtual register weight - the register allocator can use it as explicit hint for alloc/spill
- //! decisions.
- ASMJIT_INLINE_NODEBUG uint32_t weight() const noexcept { return _weight; }
- //! Sets the virtual register weight (0 to 255) - the register allocator can use it as explicit hint for
- //! alloc/spill decisions and initial bin-packing.
- ASMJIT_INLINE_NODEBUG void setWeight(uint32_t weight) noexcept { _weight = uint8_t(weight); }
-
- //! Returns whether the virtual register is always allocated to a fixed physical register (and never reallocated).
- //!
- //! \note This is only used for special purposes and it's mostly internal.
- ASMJIT_INLINE_NODEBUG bool isFixed() const noexcept { return bool(_isFixed); }
-
- //! Tests whether the virtual register is in fact a stack that only uses the virtual register id.
- //!
- //! \note It's an error if a stack is accessed as a register.
- ASMJIT_INLINE_NODEBUG bool isStack() const noexcept { return bool(_isStack); }
-
- //! Tests whether this virtual register (or stack) has assigned a stack offset.
- //!
- //! If this is a virtual register that was never allocated on stack, it would return false, otherwise if
- //! it's a virtual register that was spilled or explicitly allocated stack, the return value would be true.
- ASMJIT_INLINE_NODEBUG bool hasStackSlot() const noexcept { return bool(_hasStackSlot); }
-
- //! Assigns a stack offset of this virtual register to `stackOffset` and sets `_hasStackSlot` to true.
- ASMJIT_INLINE_NODEBUG void assignStackSlot(int32_t stackOffset) noexcept {
- _hasStackSlot = 1;
- _stackOffset = stackOffset;
- }
-
- //! Returns a stack offset associated with a virtual register or explicit stack allocation.
- //!
- //! \note Always verify that the stack offset has been assigned by calling \ref hasStackSlot(). The return
- //! value will be zero when the stack offset was not assigned.
- ASMJIT_INLINE_NODEBUG int32_t stackOffset() const noexcept { return _stackOffset; }
-
- //! Tests whether the virtual register has an associated `RAWorkReg` at the moment.
- ASMJIT_INLINE_NODEBUG bool hasWorkReg() const noexcept { return _workReg != nullptr; }
- //! Returns an associated RAWorkReg with this virtual register (only valid during register allocation).
- ASMJIT_INLINE_NODEBUG RAWorkReg* workReg() const noexcept { return _workReg; }
- //! Associates a RAWorkReg with this virtual register (used by register allocator).
- ASMJIT_INLINE_NODEBUG void setWorkReg(RAWorkReg* workReg) noexcept { _workReg = workReg; }
- //! Reset the RAWorkReg association (used by register allocator).
- ASMJIT_INLINE_NODEBUG void resetWorkReg() noexcept { _workReg = nullptr; }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_COMPILERDEFS_H_INCLUDED
-
diff --git a/3rdparty/asmjit/src/asmjit/core/constpool.cpp b/3rdparty/asmjit/src/asmjit/core/constpool.cpp
deleted file mode 100644
index 2ac5edf33c6..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/constpool.cpp
+++ /dev/null
@@ -1,370 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/constpool.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ConstPool - Construction & Destruction
-// ======================================
-
-ConstPool::ConstPool(Zone* zone) noexcept { reset(zone); }
-ConstPool::~ConstPool() noexcept {}
-
-// ConstPool - Reset
-// =================
-
-void ConstPool::reset(Zone* zone) noexcept {
- _zone = zone;
-
- size_t dataSize = 1;
- for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_tree); i++) {
- _tree[i].reset();
- _tree[i].setDataSize(dataSize);
- _gaps[i] = nullptr;
- dataSize <<= 1;
- }
-
- _gapPool = nullptr;
- _size = 0;
- _alignment = 0;
- _minItemSize = 0;
-}
-
-// ConstPool - Operations
-// ======================
-
-static inline ConstPool::Gap* ConstPool_allocGap(ConstPool* self) noexcept {
- ConstPool::Gap* gap = self->_gapPool;
- if (!gap)
- return self->_zone->allocT<ConstPool::Gap>();
-
- self->_gapPool = gap->_next;
- return gap;
-}
-
-static inline void ConstPool_freeGap(ConstPool* self, ConstPool::Gap* gap) noexcept {
- gap->_next = self->_gapPool;
- self->_gapPool = gap;
-}
-
-static void ConstPool_addGap(ConstPool* self, size_t offset, size_t size) noexcept {
- ASMJIT_ASSERT(size > 0);
-
- while (size > 0) {
- size_t gapIndex;
- size_t gapSize;
-
- if (size >= 32 && Support::isAligned<size_t>(offset, 32)) {
- gapIndex = ConstPool::kIndex32;
- gapSize = 32;
- }
- else if (size >= 16 && Support::isAligned<size_t>(offset, 16)) {
- gapIndex = ConstPool::kIndex16;
- gapSize = 16;
- }
- else if (size >= 8 && Support::isAligned<size_t>(offset, 8)) {
- gapIndex = ConstPool::kIndex8;
- gapSize = 8;
- }
- else if (size >= 4 && Support::isAligned<size_t>(offset, 4)) {
- gapIndex = ConstPool::kIndex4;
- gapSize = 4;
- }
- else if (size >= 2 && Support::isAligned<size_t>(offset, 2)) {
- gapIndex = ConstPool::kIndex2;
- gapSize = 2;
- }
- else {
- gapIndex = ConstPool::kIndex1;
- gapSize = 1;
- }
-
- // We don't have to check for errors here, if this failed nothing really happened (just the gap won't be
- // visible) and it will fail again at place where the same check would generate `kErrorOutOfMemory` error.
- ConstPool::Gap* gap = ConstPool_allocGap(self);
- if (!gap)
- return;
-
- gap->_next = self->_gaps[gapIndex];
- self->_gaps[gapIndex] = gap;
-
- gap->_offset = offset;
- gap->_size = gapSize;
-
- offset += gapSize;
- size -= gapSize;
- }
-}
-
-Error ConstPool::add(const void* data, size_t size, size_t& dstOffset) noexcept {
- size_t treeIndex;
-
- if (size == 64)
- treeIndex = kIndex64;
- else if (size == 32)
- treeIndex = kIndex32;
- else if (size == 16)
- treeIndex = kIndex16;
- else if (size == 8)
- treeIndex = kIndex8;
- else if (size == 4)
- treeIndex = kIndex4;
- else if (size == 2)
- treeIndex = kIndex2;
- else if (size == 1)
- treeIndex = kIndex1;
- else
- return DebugUtils::errored(kErrorInvalidArgument);
-
- ConstPool::Node* node = _tree[treeIndex].get(data);
- if (node) {
- dstOffset = node->_offset;
- return kErrorOk;
- }
-
- // Before incrementing the current offset try if there is a gap that can be used for the requested data.
- size_t offset = ~size_t(0);
- size_t gapIndex = treeIndex;
-
- while (gapIndex != kIndexCount - 1) {
- ConstPool::Gap* gap = _gaps[treeIndex];
-
- // Check if there is a gap.
- if (gap) {
- size_t gapOffset = gap->_offset;
- size_t gapSize = gap->_size;
-
- // Destroy the gap for now.
- _gaps[treeIndex] = gap->_next;
- ConstPool_freeGap(this, gap);
-
- offset = gapOffset;
- ASMJIT_ASSERT(Support::isAligned<size_t>(offset, size));
-
- gapSize -= size;
- if (gapSize > 0)
- ConstPool_addGap(this, gapOffset, gapSize);
- }
-
- gapIndex++;
- }
-
- if (offset == ~size_t(0)) {
- // Get how many bytes have to be skipped so the address is aligned accordingly to the 'size'.
- size_t diff = Support::alignUpDiff<size_t>(_size, size);
-
- if (diff != 0) {
- ConstPool_addGap(this, _size, diff);
- _size += diff;
- }
-
- offset = _size;
- _size += size;
- }
-
- // Add the initial node to the right index.
- node = ConstPool::Tree::_newNode(_zone, data, size, offset, false);
- if (ASMJIT_UNLIKELY(!node))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _tree[treeIndex].insert(node);
- _alignment = Support::max<size_t>(_alignment, size);
-
- dstOffset = offset;
-
- // Now create a bunch of shared constants that are based on the data pattern. We stop at size 4,
- // it probably doesn't make sense to split constants down to 1 byte.
- size_t pCount = 1;
- size_t smallerSize = size;
-
- while (smallerSize > 4) {
- pCount <<= 1;
- smallerSize >>= 1;
-
- ASMJIT_ASSERT(treeIndex != 0);
- treeIndex--;
-
- const uint8_t* pData = static_cast<const uint8_t*>(data);
- for (size_t i = 0; i < pCount; i++, pData += smallerSize) {
- node = _tree[treeIndex].get(pData);
- if (node) continue;
-
- node = ConstPool::Tree::_newNode(_zone, pData, smallerSize, offset + (i * smallerSize), true);
- _tree[treeIndex].insert(node);
- }
- }
-
- if (_minItemSize == 0)
- _minItemSize = size;
- else
- _minItemSize = Support::min(_minItemSize, size);
-
- return kErrorOk;
-}
-
-// ConstPool - Reset
-// =================
-
-struct ConstPoolFill {
- inline ConstPoolFill(uint8_t* dst, size_t dataSize) noexcept :
- _dst(dst),
- _dataSize(dataSize) {}
-
- inline void operator()(const ConstPool::Node* node) noexcept {
- if (!node->_shared)
- memcpy(_dst + node->_offset, node->data(), _dataSize);
- }
-
- uint8_t* _dst;
- size_t _dataSize;
-};
-
-void ConstPool::fill(void* dst) const noexcept {
- // Clears possible gaps, asmjit should never emit garbage to the output.
- memset(dst, 0, _size);
-
- ConstPoolFill filler(static_cast<uint8_t*>(dst), 1);
- for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_tree); i++) {
- _tree[i].forEach(filler);
- filler._dataSize <<= 1;
- }
-}
-
-// ConstPool - Tests
-// =================
-
-#if defined(ASMJIT_TEST)
-UNIT(const_pool) {
- Zone zone(32384 - Zone::kBlockOverhead);
- ConstPool pool(&zone);
-
- uint32_t i;
- uint32_t kCount = BrokenAPI::hasArg("--quick") ? 1000 : 1000000;
-
- INFO("Adding %u constants to the pool", kCount);
- {
- size_t prevOffset;
- size_t curOffset;
- uint64_t c = 0x0101010101010101u;
-
- EXPECT_EQ(pool.add(&c, 8, prevOffset), kErrorOk);
- EXPECT_EQ(prevOffset, 0u);
-
- for (i = 1; i < kCount; i++) {
- c++;
- EXPECT_EQ(pool.add(&c, 8, curOffset), kErrorOk);
- EXPECT_EQ(prevOffset + 8, curOffset);
- EXPECT_EQ(pool.size(), (i + 1) * 8);
- prevOffset = curOffset;
- }
-
- EXPECT_EQ(pool.alignment(), 8u);
- }
-
- INFO("Retrieving %u constants from the pool", kCount);
- {
- uint64_t c = 0x0101010101010101u;
-
- for (i = 0; i < kCount; i++) {
- size_t offset;
- EXPECT_EQ(pool.add(&c, 8, offset), kErrorOk);
- EXPECT_EQ(offset, i * 8);
- c++;
- }
- }
-
- INFO("Checking if the constants were split into 4-byte patterns");
- {
- uint32_t c = 0x01010101u;
- size_t offset;
-
- EXPECT_EQ(pool.add(&c, 4, offset), kErrorOk);
- EXPECT_EQ(offset, 0u);
-
- // NOTE: We have to adjust the offset to successfully test this on big endian architectures.
- size_t baseOffset = size_t(ASMJIT_ARCH_BE ? 4 : 0);
-
- for (i = 1; i < kCount; i++) {
- c++;
- EXPECT_EQ(pool.add(&c, 4, offset), kErrorOk);
- EXPECT_EQ(offset, baseOffset + i * 8);
- }
- }
-
- INFO("Adding 2 byte constant to misalign the current offset");
- {
- uint16_t c = 0xFFFF;
- size_t offset;
-
- EXPECT_EQ(pool.add(&c, 2, offset), kErrorOk);
- EXPECT_EQ(offset, kCount * 8);
- EXPECT_EQ(pool.alignment(), 8u);
- }
-
- INFO("Adding 8 byte constant to check if pool gets aligned again");
- {
- uint64_t c = 0xFFFFFFFFFFFFFFFFu;
- size_t offset;
-
- EXPECT_EQ(pool.add(&c, 8, offset), kErrorOk);
- EXPECT_EQ(offset, kCount * 8 + 8u);
- }
-
- INFO("Adding 2 byte constant to verify the gap is filled");
- {
- uint16_t c = 0xFFFE;
- size_t offset;
-
- EXPECT_EQ(pool.add(&c, 2, offset), kErrorOk);
- EXPECT_EQ(offset, kCount * 8 + 2);
- EXPECT_EQ(pool.alignment(), 8u);
- }
-
- INFO("Checking reset functionality");
- {
- pool.reset(&zone);
- zone.reset();
-
- EXPECT_EQ(pool.size(), 0u);
- EXPECT_EQ(pool.alignment(), 0u);
- }
-
- INFO("Checking pool alignment when combined constants are added");
- {
- uint8_t bytes[32] = { 0 };
- size_t offset;
-
- pool.add(bytes, 1, offset);
- EXPECT_EQ(pool.size(), 1u);
- EXPECT_EQ(pool.alignment(), 1u);
- EXPECT_EQ(offset, 0u);
-
- pool.add(bytes, 2, offset);
- EXPECT_EQ(pool.size(), 4u);
- EXPECT_EQ(pool.alignment(), 2u);
- EXPECT_EQ(offset, 2u);
-
- pool.add(bytes, 4, offset);
- EXPECT_EQ(pool.size(), 8u);
- EXPECT_EQ(pool.alignment(), 4u);
- EXPECT_EQ(offset, 4u);
-
- pool.add(bytes, 4, offset);
- EXPECT_EQ(pool.size(), 8u);
- EXPECT_EQ(pool.alignment(), 4u);
- EXPECT_EQ(offset, 4u);
-
- pool.add(bytes, 32, offset);
- EXPECT_EQ(pool.size(), 64u);
- EXPECT_EQ(pool.alignment(), 32u);
- EXPECT_EQ(offset, 32u);
- }
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/constpool.h b/3rdparty/asmjit/src/asmjit/core/constpool.h
deleted file mode 100644
index 673c11d6a93..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/constpool.h
+++ /dev/null
@@ -1,261 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_CONSTPOOL_H_INCLUDED
-#define ASMJIT_CORE_CONSTPOOL_H_INCLUDED
-
-#include "../core/support.h"
-#include "../core/zone.h"
-#include "../core/zonetree.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_utilities
-//! \{
-
-//! Constant pool scope.
-enum class ConstPoolScope : uint32_t {
- //! Local constant, always embedded right after the current function.
- kLocal = 0,
- //! Global constant, embedded at the end of the currently compiled code.
- kGlobal = 1,
-
- //! Maximum value of `ConstPoolScope`.
- kMaxValue = kGlobal
-};
-
-//! Constant pool.
-//!
-//! Constant pool is designed to hold 1, 2, 4, 8, 16, 32, and 64 byte constants. It's not designed to hold constants
-//! having arbitrary length like strings and arrays.
-class ConstPool {
-public:
- ASMJIT_NONCOPYABLE(ConstPool)
-
- //! \cond INTERNAL
-
- //! Index of a given size in const-pool table.
- enum Index : uint32_t {
- kIndex1 = 0,
- kIndex2 = 1,
- kIndex4 = 2,
- kIndex8 = 3,
- kIndex16 = 4,
- kIndex32 = 5,
- kIndex64 = 6,
- kIndexCount = 7
- };
-
- //! Zone-allocated const-pool gap created by two differently aligned constants.
- struct Gap {
- //! Pointer to the next gap
- Gap* _next;
- //! Offset of the gap.
- size_t _offset;
- //! Remaining bytes of the gap (basically a gap size).
- size_t _size;
- };
-
- //! Zone-allocated const-pool node.
- class Node : public ZoneTreeNodeT<Node> {
- public:
- ASMJIT_NONCOPYABLE(Node)
-
- //! If this constant is shared with another.
- uint32_t _shared : 1;
- //! Data offset from the beginning of the pool.
- uint32_t _offset;
-
- ASMJIT_INLINE_NODEBUG Node(size_t offset, bool shared) noexcept
- : ZoneTreeNodeT<Node>(),
- _shared(shared),
- _offset(uint32_t(offset)) {}
-
- ASMJIT_INLINE_NODEBUG void* data() const noexcept {
- return static_cast<void*>(const_cast<ConstPool::Node*>(this) + 1);
- }
- };
-
- //! Data comparer used internally.
- class Compare {
- public:
- size_t _dataSize;
-
- ASMJIT_INLINE_NODEBUG Compare(size_t dataSize) noexcept
- : _dataSize(dataSize) {}
-
- ASMJIT_INLINE_NODEBUG int operator()(const Node& a, const Node& b) const noexcept {
- return ::memcmp(a.data(), b.data(), _dataSize);
- }
-
- ASMJIT_INLINE_NODEBUG int operator()(const Node& a, const void* data) const noexcept {
- return ::memcmp(a.data(), data, _dataSize);
- }
- };
-
- //! Zone-allocated const-pool tree.
- struct Tree {
- //! RB tree.
- ZoneTree<Node> _tree;
- //! Size of the tree (number of nodes).
- size_t _size;
- //! Size of the data.
- size_t _dataSize;
-
- ASMJIT_INLINE_NODEBUG explicit Tree(size_t dataSize = 0) noexcept
- : _tree(),
- _size(0),
- _dataSize(dataSize) {}
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _tree.reset();
- _size = 0;
- }
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; }
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
-
- inline void setDataSize(size_t dataSize) noexcept {
- ASMJIT_ASSERT(empty());
- _dataSize = dataSize;
- }
-
- ASMJIT_INLINE_NODEBUG Node* get(const void* data) noexcept {
- Compare cmp(_dataSize);
- return _tree.get(data, cmp);
- }
-
- ASMJIT_INLINE_NODEBUG void insert(Node* node) noexcept {
- Compare cmp(_dataSize);
- _tree.insert(node, cmp);
- _size++;
- }
-
- template<typename Visitor>
- inline void forEach(Visitor& visitor) const noexcept {
- Node* node = _tree.root();
- if (!node) return;
-
- Node* stack[Globals::kMaxTreeHeight];
- size_t top = 0;
-
- for (;;) {
- Node* left = node->left();
- if (left != nullptr) {
- ASMJIT_ASSERT(top != Globals::kMaxTreeHeight);
- stack[top++] = node;
-
- node = left;
- continue;
- }
-
- for (;;) {
- visitor(node);
- node = node->right();
-
- if (node != nullptr)
- break;
-
- if (top == 0)
- return;
-
- node = stack[--top];
- }
- }
- }
-
- static inline Node* _newNode(Zone* zone, const void* data, size_t size, size_t offset, bool shared) noexcept {
- Node* node = zone->allocT<Node>(sizeof(Node) + size);
- if (ASMJIT_UNLIKELY(!node)) return nullptr;
-
- node = new(Support::PlacementNew{node}) Node(offset, shared);
- memcpy(node->data(), data, size);
- return node;
- }
- };
-
- //! \endcond
-
- //! \name Members
- //! \{
-
- //! Zone allocator.
- Zone* _zone;
- //! Tree per size.
- Tree _tree[kIndexCount];
- //! Gaps per size.
- Gap* _gaps[kIndexCount];
- //! Gaps pool
- Gap* _gapPool;
-
- //! Size of the pool (in bytes).
- size_t _size;
- //! Required pool alignment.
- size_t _alignment;
- //! Minimum item size in the pool.
- size_t _minItemSize;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new constant pool that would use `zone` as a memory allocator.
- ASMJIT_API explicit ConstPool(Zone* zone) noexcept;
- //! Destroys this constant pool.
- ASMJIT_API ~ConstPool() noexcept;
-
- //! \}
-
- //! \name Reset
- //! \{
-
- //! Resets this constant pool and its allocator to `zone`.
- ASMJIT_API void reset(Zone* zone) noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the constant-pool is empty.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; }
- //! Returns the size of the constant-pool in bytes.
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
- //! Returns minimum alignment.
- ASMJIT_INLINE_NODEBUG size_t alignment() const noexcept { return _alignment; }
- //! Returns the minimum size of all items added to the constant pool.
- ASMJIT_INLINE_NODEBUG size_t minItemSize() const noexcept { return _minItemSize; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Adds a constant to the constant pool.
- //!
- //! The constant must have known size, which is 1, 2, 4, 8, 16 or 32 bytes. The constant is added to the pool only
- //! if it doesn't not exist, otherwise cached value is returned.
- //!
- //! AsmJit is able to subdivide added constants, so for example if you add 8-byte constant 0x1122334455667788 it
- //! will create the following slots:
- //!
- //! 8-byte: 0x1122334455667788
- //! 4-byte: 0x11223344, 0x55667788
- //!
- //! The reason is that when combining MMX/SSE/AVX code some patterns are used frequently. However, AsmJit is not
- //! able to reallocate a constant that has been already added. For example if you try to add 4-byte constant and
- //! then 8-byte constant having the same 4-byte pattern as the previous one, two independent slots will be used.
- ASMJIT_API Error add(const void* data, size_t size, size_t& dstOffset) noexcept;
-
- //! Fills the destination with the content of this constant pool.
- ASMJIT_API void fill(void* dst) const noexcept;
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_CONSTPOOL_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp b/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp
deleted file mode 100644
index c6d35459389..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/cpuinfo.cpp
+++ /dev/null
@@ -1,2000 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/cpuinfo.h"
-#include "../core/support.h"
-
-#include <atomic>
-
-// Required by `__cpuidex()` and `_xgetbv()`.
-#if ASMJIT_ARCH_X86
- #if defined(_MSC_VER)
- #include <intrin.h>
- #endif
-#endif // ASMJIT_ARCH_X86
-
-#if !defined(_WIN32)
- #include <unistd.h>
-#endif
-
-#if ASMJIT_ARCH_ARM
- // Required by various utilities that are required by features detection.
- #if !defined(_WIN32)
- #include <errno.h>
- #include <sys/utsname.h>
- #endif
-
- //! Required to detect CPU and features on Apple platforms.
- #if defined(__APPLE__)
- #include <mach/machine.h>
- #include <sys/types.h>
- #include <sys/sysctl.h>
- #endif
-
- #if (defined(__linux__) || defined(__FreeBSD__))
- // Required by `getauxval()` on Linux and FreeBSD.
- #include <sys/auxv.h>
- #define ASMJIT_ARM_DETECT_VIA_HWCAPS
- #endif
-
- #if ASMJIT_ARCH_ARM >= 64 && defined(__GNUC__) && defined(__linux__) && 0
- // This feature is disabled at the moment - it works, but it seems linux supports ARM features
- // via HWCAPS pretty well and the most recent features need to access more registers that were
- // not originally accessible, which would break on some systems.
- #define ASMJIT_ARM_DETECT_VIA_CPUID
- #endif
-
- #if ASMJIT_ARCH_ARM >= 64 && defined(__OpenBSD__)
- #include <sys/sysctl.h>
- #include <machine/cpu.h>
- #endif
-#endif // ASMJIT_ARCH_ARM
-
-ASMJIT_BEGIN_NAMESPACE
-
-// CpuInfo - Detect - Compatibility
-// ================================
-
-// CPU features detection is a minefield on non-X86 platforms. The following list describes which
-// operating systems and architectures are supported and the status of the implementation:
-//
-// * X86, X86_64:
-// - All OSes supported
-// - Detection is based on using a CPUID instruction, which is a user-space instruction, so there
-// is no need to use any OS specific APIs or syscalls to detect all features provided by the CPU.
-//
-// * ARM32:
-// - Linux - HWCAPS based detection.
-// - FreeBSD - HWCAPS based detection (shared with Linux code).
-// - NetBSD - NOT IMPLEMENTED!
-// - OpenBSD - NOT IMPLEMENTED!
-// - Apple - sysctlbyname() based detection (this architecture is deprecated on Apple HW).
-// - Windows - IsProcessorFeaturePresent() based detection (only detects a subset of features).
-// - Others - NOT IMPLEMENTED!
-//
-// * ARM64:
-// - Linux - HWCAPS and CPUID based detection.
-// - FreeBSD - HWCAPS and CPUID based detection (shared with Linux code).
-// - NetBSD - NOT IMPLEMENTED!
-// - OpenBSD - CPUID based detection (reading CPUID via sysctl's CTL_MACHDEP).
-// - Apple - sysctlbyname() based detection with FamilyId matrix (record for each family id).
-// - Windows - IsProcessorFeaturePresent() based detection (only detects a subset of features).
-// - Others - NOT IMPLEMENTED!
-//
-// * Others
-// - NOT IMPLEMENTED!
-
-// CpuInfo - Detect - HW-Thread Count
-// ==================================
-
-#if defined(_WIN32)
-static inline uint32_t detectHWThreadCount() noexcept {
- SYSTEM_INFO info;
- ::GetSystemInfo(&info);
- return info.dwNumberOfProcessors;
-}
-#elif defined(_SC_NPROCESSORS_ONLN)
-static inline uint32_t detectHWThreadCount() noexcept {
- long res = ::sysconf(_SC_NPROCESSORS_ONLN);
- return res <= 0 ? uint32_t(1) : uint32_t(res);
-}
-#else
-static inline uint32_t detectHWThreadCount() noexcept {
- return 1;
-}
-#endif
-
-// CpuInfo - Detect - X86
-// ======================
-
-// X86 and X86_64 detection is based on CPUID.
-
-#if ASMJIT_ARCH_X86
-
-namespace x86 {
-
-typedef CpuFeatures::X86 Ext;
-
-struct cpuid_t { uint32_t eax, ebx, ecx, edx; };
-struct xgetbv_t { uint32_t eax, edx; };
-
-// Executes `cpuid` instruction.
-static inline void cpuidQuery(cpuid_t* out, uint32_t inEax, uint32_t inEcx = 0) noexcept {
-#if defined(_MSC_VER)
- __cpuidex(reinterpret_cast<int*>(out), inEax, inEcx);
-#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 32
- __asm__ __volatile__(
- "mov %%ebx, %%edi\n"
- "cpuid\n"
- "xchg %%edi, %%ebx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(inEax), "c"(inEcx));
-#elif defined(__GNUC__) && ASMJIT_ARCH_X86 == 64
- __asm__ __volatile__(
- "mov %%rbx, %%rdi\n"
- "cpuid\n"
- "xchg %%rdi, %%rbx\n" : "=a"(out->eax), "=D"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(inEax), "c"(inEcx));
-#else
- #error "[asmjit] x86::cpuidQuery() - Unsupported compiler."
-#endif
-}
-
-// Executes 'xgetbv' instruction.
-static inline void xgetbvQuery(xgetbv_t* out, uint32_t inEcx) noexcept {
-#if defined(_MSC_VER)
- uint64_t value = _xgetbv(inEcx);
- out->eax = uint32_t(value & 0xFFFFFFFFu);
- out->edx = uint32_t(value >> 32);
-#elif defined(__GNUC__)
- uint32_t outEax;
- uint32_t outEdx;
-
- // Replaced, because the world is not perfect:
- // __asm__ __volatile__("xgetbv" : "=a"(outEax), "=d"(outEdx) : "c"(inEcx));
- __asm__ __volatile__(".byte 0x0F, 0x01, 0xD0" : "=a"(outEax), "=d"(outEdx) : "c"(inEcx));
-
- out->eax = outEax;
- out->edx = outEdx;
-#else
- out->eax = 0;
- out->edx = 0;
-#endif
-}
-
-// Map a 12-byte vendor string returned by `cpuid` into a `CpuInfo::Vendor` ID.
-static inline void simplifyCpuVendor(CpuInfo& cpu, uint32_t d0, uint32_t d1, uint32_t d2) noexcept {
- struct Vendor {
- char normalized[8];
- union { char text[12]; uint32_t d[3]; };
- };
-
- static const Vendor table[] = {
- { { 'A', 'M', 'D' }, {{ 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' }} },
- { { 'I', 'N', 'T', 'E', 'L' }, {{ 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' }} },
- { { 'V', 'I', 'A' }, {{ 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' }} },
- { { 'V', 'I', 'A' }, {{ 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 }} },
- { { 'U', 'N', 'K', 'N', 'O', 'W', 'N' }, {{ 0 }} }
- };
-
- uint32_t i;
- for (i = 0; i < ASMJIT_ARRAY_SIZE(table) - 1; i++)
- if (table[i].d[0] == d0 && table[i].d[1] == d1 && table[i].d[2] == d2)
- break;
- memcpy(cpu._vendor.str, table[i].normalized, 8);
-}
-
-static ASMJIT_FAVOR_SIZE void simplifyCpuBrand(char* s) noexcept {
- char* d = s;
-
- char c = s[0];
- char prev = 0;
-
- // Used to always clear the current character to ensure that the result
- // doesn't contain garbage after a new null terminator is placed at the end.
- s[0] = '\0';
-
- for (;;) {
- if (!c)
- break;
-
- if (!(c == ' ' && (prev == '@' || s[1] == ' ' || s[1] == '@'))) {
- *d++ = c;
- prev = c;
- }
-
- c = *++s;
- s[0] = '\0';
- }
-
- d[0] = '\0';
-}
-
-static ASMJIT_FAVOR_SIZE void detectX86Cpu(CpuInfo& cpu) noexcept {
- using Support::bitTest;
-
- cpuid_t regs;
- xgetbv_t xcr0 { 0, 0 };
- CpuFeatures::X86& features = cpu.features().x86();
-
- cpu._wasDetected = true;
- cpu._maxLogicalProcessors = 1;
-
- // We are gonna execute CPUID, which was introduced by I486, so it's the requirement.
- features.add(Ext::kI486);
-
- // CPUID EAX=0
- // -----------
-
- // Get vendor string/id.
- cpuidQuery(&regs, 0x0);
-
- uint32_t maxId = regs.eax;
- uint32_t maxSubLeafId_0x7 = 0;
-
- simplifyCpuVendor(cpu, regs.ebx, regs.edx, regs.ecx);
-
- // CPUID EAX=1
- // -----------
-
- if (maxId >= 0x1) {
- // Get feature flags in ECX/EDX and family/model in EAX.
- cpuidQuery(&regs, 0x1);
-
- // Fill family and model fields.
- uint32_t modelId = (regs.eax >> 4) & 0x0F;
- uint32_t familyId = (regs.eax >> 8) & 0x0F;
-
- // Use extended family and model fields.
- if (familyId == 0x06u || familyId == 0x0Fu)
- modelId += (((regs.eax >> 16) & 0x0Fu) << 4);
-
- if (familyId == 0x0Fu)
- familyId += ((regs.eax >> 20) & 0xFFu);
-
- cpu._modelId = modelId;
- cpu._familyId = familyId;
- cpu._brandId = (regs.ebx) & 0xFF;
- cpu._processorType = (regs.eax >> 12) & 0x03;
- cpu._maxLogicalProcessors = (regs.ebx >> 16) & 0xFF;
- cpu._stepping = (regs.eax) & 0x0F;
- cpu._cacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8;
-
- features.addIf(bitTest(regs.ecx, 0), Ext::kSSE3);
- features.addIf(bitTest(regs.ecx, 1), Ext::kPCLMULQDQ);
- features.addIf(bitTest(regs.ecx, 3), Ext::kMONITOR);
- features.addIf(bitTest(regs.ecx, 5), Ext::kVMX);
- features.addIf(bitTest(regs.ecx, 6), Ext::kSMX);
- features.addIf(bitTest(regs.ecx, 9), Ext::kSSSE3);
- features.addIf(bitTest(regs.ecx, 13), Ext::kCMPXCHG16B);
- features.addIf(bitTest(regs.ecx, 19), Ext::kSSE4_1);
- features.addIf(bitTest(regs.ecx, 20), Ext::kSSE4_2);
- features.addIf(bitTest(regs.ecx, 22), Ext::kMOVBE);
- features.addIf(bitTest(regs.ecx, 23), Ext::kPOPCNT);
- features.addIf(bitTest(regs.ecx, 25), Ext::kAESNI);
- features.addIf(bitTest(regs.ecx, 26), Ext::kXSAVE);
- features.addIf(bitTest(regs.ecx, 27), Ext::kOSXSAVE);
- features.addIf(bitTest(regs.ecx, 30), Ext::kRDRAND);
- features.addIf(bitTest(regs.edx, 0), Ext::kFPU);
- features.addIf(bitTest(regs.edx, 4), Ext::kRDTSC);
- features.addIf(bitTest(regs.edx, 5), Ext::kMSR);
- features.addIf(bitTest(regs.edx, 8), Ext::kCMPXCHG8B);
- features.addIf(bitTest(regs.edx, 15), Ext::kCMOV);
- features.addIf(bitTest(regs.edx, 19), Ext::kCLFLUSH);
- features.addIf(bitTest(regs.edx, 23), Ext::kMMX);
- features.addIf(bitTest(regs.edx, 24), Ext::kFXSR);
- features.addIf(bitTest(regs.edx, 25), Ext::kSSE, Ext::kMMX2);
- features.addIf(bitTest(regs.edx, 26), Ext::kSSE2, Ext::kSSE);
- features.addIf(bitTest(regs.edx, 28), Ext::kMT);
-
- // Get the content of XCR0 if supported by the CPU and enabled by the OS.
- if (features.hasXSAVE() && features.hasOSXSAVE()) {
- xgetbvQuery(&xcr0, 0);
- }
-
- // Detect AVX+.
- if (bitTest(regs.ecx, 28)) {
- // - XCR0[2:1] == 11b
- // XMM & YMM states need to be enabled by OS.
- if ((xcr0.eax & 0x00000006u) == 0x00000006u) {
- features.add(Ext::kAVX);
- features.addIf(bitTest(regs.ecx, 12), Ext::kFMA);
- features.addIf(bitTest(regs.ecx, 29), Ext::kF16C);
- }
- }
- }
-
- constexpr uint32_t kXCR0_AMX_Bits = 0x3u << 17;
- bool amxEnabledByOS = (xcr0.eax & kXCR0_AMX_Bits) == kXCR0_AMX_Bits;
-
-#if defined(__APPLE__)
- // Apple platform provides on-demand AVX512 support. When an AVX512 instruction is used the first time it results
- // in #UD, which would cause the thread being promoted to use AVX512 support by the OS in addition to enabling the
- // necessary bits in XCR0 register.
- bool avx512EnabledByOS = true;
-#else
- // - XCR0[2:1] == 11b - XMM/YMM states need to be enabled by OS.
- // - XCR0[7:5] == 111b - Upper 256-bit of ZMM0-XMM15 and ZMM16-ZMM31 need to be enabled by OS.
- constexpr uint32_t kXCR0_AVX512_Bits = (0x3u << 1) | (0x7u << 5);
- bool avx512EnabledByOS = (xcr0.eax & kXCR0_AVX512_Bits) == kXCR0_AVX512_Bits;
-#endif
-
- // CPUID EAX=7 ECX=0
- // -----------------
-
- // Detect new features if the processor supports CPUID-07.
- bool maybeMPX = false;
-
- if (maxId >= 0x7) {
- cpuidQuery(&regs, 0x7);
-
- maybeMPX = bitTest(regs.ebx, 14);
- maxSubLeafId_0x7 = regs.eax;
-
- features.addIf(bitTest(regs.ebx, 0), Ext::kFSGSBASE);
- features.addIf(bitTest(regs.ebx, 3), Ext::kBMI);
- features.addIf(bitTest(regs.ebx, 4), Ext::kHLE);
- features.addIf(bitTest(regs.ebx, 7), Ext::kSMEP);
- features.addIf(bitTest(regs.ebx, 8), Ext::kBMI2);
- features.addIf(bitTest(regs.ebx, 9), Ext::kERMS);
- features.addIf(bitTest(regs.ebx, 11), Ext::kRTM);
- features.addIf(bitTest(regs.ebx, 18), Ext::kRDSEED);
- features.addIf(bitTest(regs.ebx, 19), Ext::kADX);
- features.addIf(bitTest(regs.ebx, 20), Ext::kSMAP);
- features.addIf(bitTest(regs.ebx, 23), Ext::kCLFLUSHOPT);
- features.addIf(bitTest(regs.ebx, 24), Ext::kCLWB);
- features.addIf(bitTest(regs.ebx, 29), Ext::kSHA);
- features.addIf(bitTest(regs.ecx, 0), Ext::kPREFETCHWT1);
- features.addIf(bitTest(regs.ecx, 4), Ext::kOSPKE);
- features.addIf(bitTest(regs.ecx, 5), Ext::kWAITPKG);
- features.addIf(bitTest(regs.ecx, 7), Ext::kCET_SS);
- features.addIf(bitTest(regs.ecx, 8), Ext::kGFNI);
- features.addIf(bitTest(regs.ecx, 9), Ext::kVAES);
- features.addIf(bitTest(regs.ecx, 10), Ext::kVPCLMULQDQ);
- features.addIf(bitTest(regs.ecx, 22), Ext::kRDPID);
- features.addIf(bitTest(regs.ecx, 25), Ext::kCLDEMOTE);
- features.addIf(bitTest(regs.ecx, 27), Ext::kMOVDIRI);
- features.addIf(bitTest(regs.ecx, 28), Ext::kMOVDIR64B);
- features.addIf(bitTest(regs.ecx, 29), Ext::kENQCMD);
- features.addIf(bitTest(regs.edx, 4), Ext::kFSRM);
- features.addIf(bitTest(regs.edx, 5), Ext::kUINTR);
- features.addIf(bitTest(regs.edx, 14), Ext::kSERIALIZE);
- features.addIf(bitTest(regs.edx, 16), Ext::kTSXLDTRK);
- features.addIf(bitTest(regs.edx, 18), Ext::kPCONFIG);
- features.addIf(bitTest(regs.edx, 20), Ext::kCET_IBT);
-
- // Detect 'TSX' - Requires at least one of `HLE` and `RTM` features.
- if (features.hasHLE() || features.hasRTM()) {
- features.add(Ext::kTSX);
- }
-
- if (bitTest(regs.ebx, 5) && features.hasAVX()) {
- features.add(Ext::kAVX2);
- }
-
- if (avx512EnabledByOS && bitTest(regs.ebx, 16)) {
- features.add(Ext::kAVX512_F);
-
- features.addIf(bitTest(regs.ebx, 17), Ext::kAVX512_DQ);
- features.addIf(bitTest(regs.ebx, 21), Ext::kAVX512_IFMA);
- features.addIf(bitTest(regs.ebx, 26), Ext::kAVX512_PF);
- features.addIf(bitTest(regs.ebx, 27), Ext::kAVX512_ER);
- features.addIf(bitTest(regs.ebx, 28), Ext::kAVX512_CD);
- features.addIf(bitTest(regs.ebx, 30), Ext::kAVX512_BW);
- features.addIf(bitTest(regs.ebx, 31), Ext::kAVX512_VL);
- features.addIf(bitTest(regs.ecx, 1), Ext::kAVX512_VBMI);
- features.addIf(bitTest(regs.ecx, 6), Ext::kAVX512_VBMI2);
- features.addIf(bitTest(regs.ecx, 11), Ext::kAVX512_VNNI);
- features.addIf(bitTest(regs.ecx, 12), Ext::kAVX512_BITALG);
- features.addIf(bitTest(regs.ecx, 14), Ext::kAVX512_VPOPCNTDQ);
- features.addIf(bitTest(regs.edx, 2), Ext::kAVX512_4VNNIW);
- features.addIf(bitTest(regs.edx, 3), Ext::kAVX512_4FMAPS);
- features.addIf(bitTest(regs.edx, 8), Ext::kAVX512_VP2INTERSECT);
- features.addIf(bitTest(regs.edx, 23), Ext::kAVX512_FP16);
- }
-
- if (amxEnabledByOS) {
- features.addIf(bitTest(regs.edx, 22), Ext::kAMX_BF16);
- features.addIf(bitTest(regs.edx, 24), Ext::kAMX_TILE);
- features.addIf(bitTest(regs.edx, 25), Ext::kAMX_INT8);
- }
- }
-
- // CPUID EAX=7 ECX=1
- // -----------------
-
- if (maxSubLeafId_0x7 >= 1) {
- cpuidQuery(&regs, 0x7, 1);
-
- features.addIf(bitTest(regs.eax, 0), Ext::kSHA512);
- features.addIf(bitTest(regs.eax, 1), Ext::kSM3);
- features.addIf(bitTest(regs.eax, 2), Ext::kSM4);
- features.addIf(bitTest(regs.eax, 3), Ext::kRAO_INT);
- features.addIf(bitTest(regs.eax, 7), Ext::kCMPCCXADD);
- features.addIf(bitTest(regs.eax, 10), Ext::kFZRM);
- features.addIf(bitTest(regs.eax, 11), Ext::kFSRS);
- features.addIf(bitTest(regs.eax, 12), Ext::kFSRC);
- features.addIf(bitTest(regs.eax, 19), Ext::kWRMSRNS);
- features.addIf(bitTest(regs.eax, 22), Ext::kHRESET);
- features.addIf(bitTest(regs.eax, 26), Ext::kLAM);
- features.addIf(bitTest(regs.eax, 27), Ext::kMSRLIST);
- features.addIf(bitTest(regs.ebx, 1), Ext::kTSE);
- features.addIf(bitTest(regs.edx, 14), Ext::kPREFETCHI);
- features.addIf(bitTest(regs.edx, 18), Ext::kCET_SSS);
- features.addIf(bitTest(regs.edx, 21), Ext::kAPX_F);
-
- if (features.hasAVX2()) {
- features.addIf(bitTest(regs.eax, 4), Ext::kAVX_VNNI);
- features.addIf(bitTest(regs.eax, 23), Ext::kAVX_IFMA);
- features.addIf(bitTest(regs.edx, 4), Ext::kAVX_VNNI_INT8);
- features.addIf(bitTest(regs.edx, 5), Ext::kAVX_NE_CONVERT);
- features.addIf(bitTest(regs.edx, 10), Ext::kAVX_VNNI_INT16);
- }
-
- if (features.hasAVX512_F()) {
- features.addIf(bitTest(regs.eax, 5), Ext::kAVX512_BF16);
- }
-
- if (amxEnabledByOS) {
- features.addIf(bitTest(regs.eax, 21), Ext::kAMX_FP16);
- features.addIf(bitTest(regs.edx, 8), Ext::kAMX_COMPLEX);
- }
- }
-
- // CPUID EAX=13 ECX=0
- // ------------------
-
- if (maxId >= 0xD) {
- cpuidQuery(&regs, 0xD, 0);
-
- // Both CPUID result and XCR0 has to be enabled to have support for MPX.
- if (((regs.eax & xcr0.eax) & 0x00000018u) == 0x00000018u && maybeMPX)
- features.add(Ext::kMPX);
-
- cpuidQuery(&regs, 0xD, 1);
-
- features.addIf(bitTest(regs.eax, 0), Ext::kXSAVEOPT);
- features.addIf(bitTest(regs.eax, 1), Ext::kXSAVEC);
- features.addIf(bitTest(regs.eax, 3), Ext::kXSAVES);
- }
-
- // CPUID EAX=14 ECX=0
- // ------------------
-
- if (maxId >= 0xE) {
- cpuidQuery(&regs, 0xE, 0);
-
- features.addIf(bitTest(regs.ebx, 4), Ext::kPTWRITE);
- }
-
- // CPUID EAX=0x80000000...maxId
- // ----------------------------
-
- maxId = 0x80000000u;
- uint32_t i = maxId;
-
- // The highest EAX that we understand.
- constexpr uint32_t kHighestProcessedEAX = 0x8000001Fu;
-
- // Several CPUID calls are required to get the whole branc string. It's easier
- // to copy one DWORD at a time instead of copying the string a byte by byte.
- uint32_t* brand = cpu._brand.u32;
- do {
- cpuidQuery(&regs, i);
- switch (i) {
- case 0x80000000u:
- maxId = Support::min<uint32_t>(regs.eax, kHighestProcessedEAX);
- break;
-
- case 0x80000001u:
- features.addIf(bitTest(regs.ecx, 0), Ext::kLAHFSAHF);
- features.addIf(bitTest(regs.ecx, 2), Ext::kSVM);
- features.addIf(bitTest(regs.ecx, 5), Ext::kLZCNT);
- features.addIf(bitTest(regs.ecx, 6), Ext::kSSE4A);
- features.addIf(bitTest(regs.ecx, 7), Ext::kMSSE);
- features.addIf(bitTest(regs.ecx, 8), Ext::kPREFETCHW);
- features.addIf(bitTest(regs.ecx, 12), Ext::kSKINIT);
- features.addIf(bitTest(regs.ecx, 15), Ext::kLWP);
- features.addIf(bitTest(regs.ecx, 21), Ext::kTBM);
- features.addIf(bitTest(regs.ecx, 29), Ext::kMONITORX);
- features.addIf(bitTest(regs.edx, 20), Ext::kNX);
- features.addIf(bitTest(regs.edx, 21), Ext::kFXSROPT);
- features.addIf(bitTest(regs.edx, 22), Ext::kMMX2);
- features.addIf(bitTest(regs.edx, 27), Ext::kRDTSCP);
- features.addIf(bitTest(regs.edx, 29), Ext::kPREFETCHW);
- features.addIf(bitTest(regs.edx, 30), Ext::k3DNOW2, Ext::kMMX2);
- features.addIf(bitTest(regs.edx, 31), Ext::kPREFETCHW);
-
- if (features.hasAVX()) {
- features.addIf(bitTest(regs.ecx, 11), Ext::kXOP);
- features.addIf(bitTest(regs.ecx, 16), Ext::kFMA4);
- }
-
- // This feature seems to be only supported by AMD.
- if (cpu.isVendor("AMD")) {
- features.addIf(bitTest(regs.ecx, 4), Ext::kALTMOVCR8);
- }
- break;
-
- case 0x80000002u:
- case 0x80000003u:
- case 0x80000004u:
- *brand++ = regs.eax;
- *brand++ = regs.ebx;
- *brand++ = regs.ecx;
- *brand++ = regs.edx;
-
- // Go directly to the next one we are interested in.
- if (i == 0x80000004u)
- i = 0x80000008u - 1;
- break;
-
- case 0x80000008u:
- features.addIf(bitTest(regs.ebx, 0), Ext::kCLZERO);
- features.addIf(bitTest(regs.ebx, 0), Ext::kRDPRU);
- features.addIf(bitTest(regs.ebx, 8), Ext::kMCOMMIT);
- features.addIf(bitTest(regs.ebx, 9), Ext::kWBNOINVD);
-
- // Go directly to the next one we are interested in.
- i = 0x8000001Fu - 1;
- break;
-
- case 0x8000001Fu:
- features.addIf(bitTest(regs.eax, 0), Ext::kSME);
- features.addIf(bitTest(regs.eax, 1), Ext::kSEV);
- features.addIf(bitTest(regs.eax, 3), Ext::kSEV_ES);
- features.addIf(bitTest(regs.eax, 4), Ext::kSEV_SNP);
- features.addIf(bitTest(regs.eax, 6), Ext::kRMPQUERY);
- break;
- }
- } while (++i <= maxId);
-
- // Simplify CPU brand string a bit by removing some unnecessary spaces.
- simplifyCpuBrand(cpu._brand.str);
-}
-
-} // {x86}
-
-#endif // ASMJIT_ARCH_X86
-
-// CpuInfo - Detect - ARM
-// ======================
-
-// Implement the most code outside the platform specific #ifdefs to minimize breaking the detection on
-// platforms that don't run on our CI infrastructure. The problem with the detection is that every OS
-// requires a specific implementation as ARM features cannot be detected in user-mode without OS enablement.
-
-// The most relevant and accurate information can be found here:
-// https://github.com/llvm-project/llvm/blob/master/lib/Target/AArch64/AArch64.td
-// https://github.com/apple/llvm-project/blob/apple/main/llvm/lib/Target/AArch64/AArch64.td (Apple fork)
-//
-// Other resources:
-// https://en.wikipedia.org/wiki/AArch64
-// https://en.wikipedia.org/wiki/Apple_silicon#List_of_Apple_processors
-// https://developer.arm.com/downloads/-/exploration-tools/feature-names-for-a-profile
-// https://developer.arm.com/architectures/learn-the-architecture/understanding-the-armv8-x-extensions/single-page
-
-#if ASMJIT_ARCH_ARM
-
-namespace arm {
-
-// ARM commonly refers to CPU features using FEAT_ prefix, we use Ext:: to make it compatible with other parts.
-typedef CpuFeatures::ARM Ext;
-
-// CpuInfo - Detect - ARM - OS Kernel Version
-// ==========================================
-
-#if defined(__linux__)
-struct UNameKernelVersion {
- int parts[3];
-
- inline bool atLeast(int major, int minor, int patch = 0) const noexcept {
- if (parts[0] >= major) {
- if (parts[0] > major)
- return true;
-
- if (parts[1] >= minor) {
- if (parts[1] > minor)
- return true;
-
- return parts[2] >= patch;
- }
- }
-
- return false;
- }
-};
-
-ASMJIT_MAYBE_UNUSED
-static UNameKernelVersion getUNameKernelVersion() noexcept {
- UNameKernelVersion ver{};
- ver.parts[0] = -1;
-
- utsname buffer;
- if (uname(&buffer) != 0)
- return ver;
-
- size_t count = 0;
- char* p = buffer.release;
- while (*p) {
- uint32_t c = uint8_t(*p);
- if (c >= uint32_t('0') && c <= uint32_t('9')) {
- ver.parts[count] = int(strtol(p, &p, 10));
- if (++count == 3)
- break;
- }
- else if (c == '.' || c == '-') {
- p++;
- }
- else {
- break;
- }
- }
-
- return ver;
-}
-#endif // __linux__
-
-// CpuInfo - Detect - ARM - Baseline Features of ARM Architectures
-// ===============================================================
-
-ASMJIT_MAYBE_UNUSED
-static inline void populateBaseAArch32Features(CpuFeatures::ARM& features) noexcept {
- // No baseline flags at the moment.
- DebugUtils::unused(features);
-}
-
-ASMJIT_MAYBE_UNUSED
-static inline void populateBaseAArch64Features(CpuFeatures::ARM& features) noexcept {
- // AArch64 is based on ARMv8.0 and later.
- features.add(Ext::kARMv6);
- features.add(Ext::kARMv7);
- features.add(Ext::kARMv8a);
-
- // AArch64 comes with these features by default.
- features.add(Ext::kASIMD);
- features.add(Ext::kFP);
- features.add(Ext::kIDIVA);
-}
-
-static inline void populateBaseARMFeatures(CpuInfo& cpu) noexcept {
-#if ASMJIT_ARCH_ARM == 32
- populateBaseAArch32Features(cpu.features().arm());
-#else
- populateBaseAArch64Features(cpu.features().arm());
-#endif
-}
-
-// CpuInfo - Detect - ARM - Mandatory Features of ARM Architectures
-// ================================================================
-
-// Populates mandatory ARMv8.[v]A features.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void populateARMv8AFeatures(CpuFeatures::ARM& features, uint32_t v) noexcept {
- switch (v) {
- default:
- ASMJIT_FALLTHROUGH;
- case 9: // ARMv8.9
- features.add(Ext::kCLRBHB, Ext::kCSSC, Ext::kPRFMSLC, Ext::kSPECRES2, Ext::kRAS2);
- ASMJIT_FALLTHROUGH;
- case 8: // ARMv8.8
- features.add(Ext::kHBC, Ext::kMOPS, Ext::kNMI);
- ASMJIT_FALLTHROUGH;
- case 7: // ARMv8.7
- features.add(Ext::kHCX, Ext::kPAN3, Ext::kWFXT, Ext::kXS);
- ASMJIT_FALLTHROUGH;
- case 6: // ARMv8.6
- features.add(Ext::kAMU1_1, Ext::kBF16, Ext::kECV, Ext::kFGT, Ext::kI8MM);
- ASMJIT_FALLTHROUGH;
- case 5: // ARMv8.5
- features.add(Ext::kBTI, Ext::kCSV2, Ext::kDPB2, Ext::kFLAGM2, Ext::kFRINTTS, Ext::kSB, Ext::kSPECRES, Ext::kSSBS);
- ASMJIT_FALLTHROUGH;
- case 4: // ARMv8.4
- features.add(Ext::kAMU1, Ext::kDIT, Ext::kDOTPROD, Ext::kFLAGM,
- Ext::kLRCPC2, Ext::kLSE2, Ext::kMPAM, Ext::kNV,
- Ext::kSEL2, Ext::kTLBIOS, Ext::kTLBIRANGE, Ext::kTRF);
- ASMJIT_FALLTHROUGH;
- case 3: // ARMv8.3
- features.add(Ext::kCCIDX, Ext::kFCMA, Ext::kJSCVT, Ext::kLRCPC, Ext::kPAUTH);
- ASMJIT_FALLTHROUGH;
- case 2: // ARMv8.2
- features.add(Ext::kDPB, Ext::kPAN2, Ext::kRAS, Ext::kUAO);
- ASMJIT_FALLTHROUGH;
- case 1: // ARMv8.1
- features.add(Ext::kCRC32, Ext::kLOR, Ext::kLSE, Ext::kPAN, Ext::kRDM, Ext::kVHE);
- ASMJIT_FALLTHROUGH;
- case 0: // ARMv8.0
- features.add(Ext::kASIMD, Ext::kFP, Ext::kIDIVA, Ext::kVFP_D32);
- break;
- }
-}
-
-// Populates mandatory ARMv9.[v] features.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void populateARMv9AFeatures(CpuFeatures::ARM& features, uint32_t v) noexcept {
- populateARMv8AFeatures(features, v <= 4u ? 5u + v : 9u);
-
- switch (v) {
- default:
- ASMJIT_FALLTHROUGH;
- case 4: // ARMv9.4 - based on ARMv8.9.
- ASMJIT_FALLTHROUGH;
- case 3: // ARMv9.3 - based on ARMv8.8.
- ASMJIT_FALLTHROUGH;
- case 2: // ARMv9.2 - based on ARMv8.7.
- ASMJIT_FALLTHROUGH;
- case 1: // ARMv9.1 - based on ARMv8.6.
- ASMJIT_FALLTHROUGH;
- case 0: // ARMv9.0 - based on ARMv8.5.
- features.add(Ext::kRME, Ext::kSVE, Ext::kSVE2);
- break;
- }
-}
-
-// CpuInfo - Detect - ARM - CPUID Based Features
-// =============================================
-
-// This implements detection based on the content of CPUID registers. The following code doesn't actually read any
-// of the registers so it's an implementation that can theoretically be tested / used in mocks.
-
-// Merges a feature that contains 0b1111 when it doesn't exist and starts at 0b0000 when it does.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeatureNA(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset,
- Ext::Id f0,
- Ext::Id f1 = Ext::kNone,
- Ext::Id f2 = Ext::kNone,
- Ext::Id f3 = Ext::kNone) noexcept {
-
- uint32_t val = uint32_t((regBits >> offset) & 0xFu);
-
- // If val == 0b1111 then the feature is not implemented in this case (some early extensions).
- if (val == 0xFu)
- return;
-
- if (f0 != Ext::kNone) features.add(f0);
- if (f1 != Ext::kNone) features.addIf(val >= 1, f1);
- if (f2 != Ext::kNone) features.addIf(val >= 2, f2);
- if (f3 != Ext::kNone) features.addIf(val >= 3, f3);
-}
-
-// Merges a feature identified by a single bit at `offset`.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature1B(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, Ext::Id f1) noexcept {
- features.addIf((regBits & (uint64_t(1) << offset)) != 0, f1);
-}
-
-// Merges a feature-list starting from 0b01 when it does (0b00 means feature not supported).
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature2B(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, Ext::Id f1, Ext::Id f2, Ext::Id f3) noexcept {
- uint32_t val = uint32_t((regBits >> offset) & 0x3u);
-
- if (f1 != Ext::kNone) features.addIf(val >= 1, f1);
- if (f2 != Ext::kNone) features.addIf(val >= 2, f2);
- if (f3 != Ext::kNone) features.addIf(val == 3, f3);
-}
-
-// Merges a feature-list starting from 0b0001 when it does (0b0000 means feature not supported).
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature4B(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset,
- Ext::Id f1,
- Ext::Id f2 = Ext::kNone,
- Ext::Id f3 = Ext::kNone,
- Ext::Id f4 = Ext::kNone) noexcept {
-
- uint32_t val = uint32_t((regBits >> offset) & 0xFu);
-
- // if val == 0 it means that this feature is not supported.
-
- if (f1 != Ext::kNone) features.addIf(val >= 1, f1);
- if (f2 != Ext::kNone) features.addIf(val >= 2, f2);
- if (f3 != Ext::kNone) features.addIf(val >= 3, f3);
- if (f4 != Ext::kNone) features.addIf(val >= 4, f4);
-}
-
-// Merges a feature that is identified by an exact bit-combination of 4 bits.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FORCE_INLINE void mergeAArch64CPUIDFeature4S(CpuFeatures::ARM& features, uint64_t regBits, uint32_t offset, uint32_t value, Ext::Id f1) noexcept {
- features.addIf(uint32_t((regBits >> offset) & 0xFu) == value, f1);
-}
-
-#define MERGE_FEATURE_NA(identifier, reg, offset, ...) mergeAArch64CPUIDFeatureNA(cpu.features().arm(), reg, offset, __VA_ARGS__)
-#define MERGE_FEATURE_1B(identifier, reg, offset, ...) mergeAArch64CPUIDFeature1B(cpu.features().arm(), reg, offset, __VA_ARGS__)
-#define MERGE_FEATURE_2B(identifier, reg, offset, ...) mergeAArch64CPUIDFeature2B(cpu.features().arm(), reg, offset, __VA_ARGS__)
-#define MERGE_FEATURE_4B(identifier, reg, offset, ...) mergeAArch64CPUIDFeature4B(cpu.features().arm(), reg, offset, __VA_ARGS__)
-#define MERGE_FEATURE_4S(identifier, reg, offset, ...) mergeAArch64CPUIDFeature4S(cpu.features().arm(), reg, offset, __VA_ARGS__)
-
-// Detects features based on the content of ID_AA64PFR0_EL1 and ID_AA64PFR1_EL1 registers.
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64PFR0_AA64PFR1(CpuInfo& cpu, uint64_t fpr0, uint64_t fpr1) noexcept {
- // ID_AA64PFR0_EL1
- // ===============
-
- // FP and AdvSIMD bits should match (i.e. if FP features FP16, ASIMD must feature it too).
- MERGE_FEATURE_NA("FP bits [19:16]" , fpr0, 16, Ext::kFP, Ext::kFP16);
- MERGE_FEATURE_NA("AdvSIMD bits [23:20]" , fpr0, 20, Ext::kASIMD, Ext::kFP16);
- /*
- MERGE_FEATURE_4B("GIC bits [27:24]" , fpr0, 24, ...);
- */
- MERGE_FEATURE_4B("RAS bits [31:28]" , fpr0, 28, Ext::kRAS, Ext::kRAS1_1, Ext::kRAS2);
- MERGE_FEATURE_4B("SVE bits [35:32]" , fpr0, 32, Ext::kSVE);
- MERGE_FEATURE_4B("SEL2 bits [39:36]" , fpr0, 36, Ext::kSEL2);
- MERGE_FEATURE_4B("MPAM bits [43:40]" , fpr0, 40, Ext::kMPAM);
- MERGE_FEATURE_4B("AMU bits [47:44]" , fpr0, 44, Ext::kAMU1, Ext::kAMU1_1);
- MERGE_FEATURE_4B("DIT bits [51:48]" , fpr0, 48, Ext::kDIT);
- MERGE_FEATURE_4B("RME bits [55:52]" , fpr0, 52, Ext::kRME);
- MERGE_FEATURE_4B("CSV2 bits [59:56]" , fpr0, 56, Ext::kCSV2, Ext::kCSV2, Ext::kCSV2, Ext::kCSV2_3);
- MERGE_FEATURE_4B("CSV3 bits [63:60]" , fpr0, 60, Ext::kCSV3);
-
- // ID_AA64PFR1_EL1
- // ===============
-
- MERGE_FEATURE_4B("BT bits [3:0]" , fpr1, 0, Ext::kBTI);
- MERGE_FEATURE_4B("SSBS bits [7:4]" , fpr1, 4, Ext::kSSBS, Ext::kSSBS2);
- MERGE_FEATURE_4B("MTE bits [11:8]" , fpr1, 8, Ext::kMTE, Ext::kMTE2, Ext::kMTE3);
- /*
- MERGE_FEATURE_4B("RAS_frac bits [15:12]" , fpr1, 12, ...);
- MERGE_FEATURE_4B("MPAM_frac bits [19:16]" , fpr1, 16, ...);
- */
- MERGE_FEATURE_4B("SME bits [27:24]" , fpr1, 24, Ext::kSME, Ext::kSME2);
- MERGE_FEATURE_4B("RNDR_trap bits [31:28]" , fpr1, 28, Ext::kRNG_TRAP);
- /*
- MERGE_FEATURE_4B("CSV2_frac bits [35:32]" , fpr1, 32, ...);
- */
- MERGE_FEATURE_4B("NMI bits [39:36]" , fpr1, 36, Ext::kNMI);
- /*
- MERGE_FEATURE_4B("MTE_frac bits [43:40]" , fpr1, 40, ...);
- */
- MERGE_FEATURE_4B("GCS bits [47:44]" , fpr1, 44, Ext::kGCS);
- MERGE_FEATURE_4B("THE bits [51:48]" , fpr1, 48, Ext::kTHE);
-
- // MTEX extensions are only available when MTE3 is available.
- if (cpu.features().arm().hasMTE3())
- MERGE_FEATURE_4B("MTEX bits [55:52]" , fpr1, 52, Ext::kMTE4);
-
- /*
- MERGE_FEATURE_4B("DF2 bits [59:56]" , fpr1, 56, ...);
- */
- MERGE_FEATURE_4B("PFAR bits [63:60]" , fpr1, 60, Ext::kPFAR);
-
- // ID_AA64PFR0_EL1 + ID_AA64PFR1_EL1
- // =================================
-
- uint32_t rasMain = uint32_t((fpr0 >> 28) & 0xFu);
- uint32_t rasFrac = uint32_t((fpr1 >> 12) & 0xFu);
-
- if (rasMain == 1 && rasFrac == 1) {
- cpu.features().arm().add(Ext::kRAS1_1);
- }
-
- uint32_t mpamMain = uint32_t((fpr0 >> 40) & 0xFu);
- uint32_t mpamFrac = uint32_t((fpr1 >> 16) & 0xFu);
-
- if (mpamMain || mpamFrac)
- cpu.features().arm().add(Ext::kMPAM);
-}
-
-// Detects features based on the content of ID_AA64ISAR0_EL1 and ID_AA64ISAR1_EL1 registers.
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64ISAR0_AA64ISAR1(CpuInfo& cpu, uint64_t isar0, uint64_t isar1) noexcept {
- // ID_AA64ISAR0_EL1
- // ================
-
- MERGE_FEATURE_4B("AES bits [7:4]" , isar0, 4, Ext::kAES, Ext::kPMULL);
- MERGE_FEATURE_4B("SHA1 bits [11:8]" , isar0, 8, Ext::kSHA1);
- MERGE_FEATURE_4B("SHA2 bits [15:12]" , isar0, 12, Ext::kSHA256, Ext::kSHA512);
- MERGE_FEATURE_4B("CRC32 bits [19:16]" , isar0, 16, Ext::kCRC32);
- MERGE_FEATURE_4B("Atomic bits [23:20]" , isar0, 20, Ext::kNone, Ext::kLSE, Ext::kLSE128);
- MERGE_FEATURE_4B("TME bits [27:24]" , isar0, 24, Ext::kTME);
- MERGE_FEATURE_4B("RDM bits [31:28]" , isar0, 28, Ext::kRDM);
- MERGE_FEATURE_4B("SHA3 bits [35:32]" , isar0, 32, Ext::kSHA3);
- MERGE_FEATURE_4B("SM3 bits [39:36]" , isar0, 36, Ext::kSM3);
- MERGE_FEATURE_4B("SM4 bits [43:40]" , isar0, 40, Ext::kSM4);
- MERGE_FEATURE_4B("DP bits [47:44]" , isar0, 44, Ext::kDOTPROD);
- MERGE_FEATURE_4B("FHM bits [51:48]" , isar0, 48, Ext::kFHM);
- MERGE_FEATURE_4B("TS bits [55:52]" , isar0, 52, Ext::kFLAGM, Ext::kFLAGM2);
- /*
- MERGE_FEATURE_4B("TLB bits [59:56]" , isar0, 56, ...);
- */
- MERGE_FEATURE_4B("RNDR bits [63:60]" , isar0, 60, Ext::kFLAGM, Ext::kRNG);
-
- // ID_AA64ISAR1_EL1
- // ================
-
- MERGE_FEATURE_4B("DPB bits [3:0]" , isar1, 0, Ext::kDPB, Ext::kDPB2);
- /*
- MERGE_FEATURE_4B("APA bits [7:4]" , isar1, 4, ...);
- MERGE_FEATURE_4B("API bits [11:8]" , isar1, 8, ...);
- */
- MERGE_FEATURE_4B("JSCVT bits [15:12]" , isar1, 12, Ext::kJSCVT);
- MERGE_FEATURE_4B("FCMA bits [19:16]" , isar1, 16, Ext::kFCMA);
- MERGE_FEATURE_4B("LRCPC bits [23:20]" , isar1, 20, Ext::kLRCPC, Ext::kLRCPC2, Ext::kLRCPC3);
- /*
- MERGE_FEATURE_4B("GPA bits [27:24]" , isar1, 24, ...);
- MERGE_FEATURE_4B("GPI bits [31:28]" , isar1, 28, ...);
- */
- MERGE_FEATURE_4B("FRINTTS bits [35:32]" , isar1, 32, Ext::kFRINTTS);
- MERGE_FEATURE_4B("SB bits [39:36]" , isar1, 36, Ext::kSB);
- MERGE_FEATURE_4B("SPECRES bits [43:40]" , isar1, 40, Ext::kSPECRES, Ext::kSPECRES2);
- MERGE_FEATURE_4B("BF16 bits [47:44]" , isar1, 44, Ext::kBF16, Ext::kEBF16);
- MERGE_FEATURE_4B("DGH bits [51:48]" , isar1, 48, Ext::kDGH);
- MERGE_FEATURE_4B("I8MM bits [55:52]" , isar1, 52, Ext::kI8MM);
- MERGE_FEATURE_4B("XS bits [59:56]" , isar1, 56, Ext::kXS);
- MERGE_FEATURE_4B("LS64 bits [63:60]" , isar1, 60, Ext::kLS64, Ext::kLS64_V, Ext::kLS64_ACCDATA);
-}
-
-// Detects features based on the content of ID_AA64ISAR2_EL1 register.
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64ISAR2(CpuInfo& cpu, uint64_t isar2) noexcept {
- MERGE_FEATURE_4B("WFxT bits [3:0]" , isar2, 0, Ext::kNone, Ext::kWFXT);
- MERGE_FEATURE_4B("RPRES bits [7:4]" , isar2, 4, Ext::kRPRES);
- /*
- MERGE_FEATURE_4B("GPA3 bits [11:8]" , isar2, 8, ...);
- MERGE_FEATURE_4B("APA3 bits [15:12]" , isar2, 12, ...);
- */
- MERGE_FEATURE_4B("MOPS bits [19:16]" , isar2, 16, Ext::kMOPS);
- MERGE_FEATURE_4B("BC bits [23:20]" , isar2, 20, Ext::kHBC);
- MERGE_FEATURE_4B("PAC_frac bits [27:24]" , isar2, 24, Ext::kCONSTPACFIELD);
- MERGE_FEATURE_4B("CLRBHB bits [31:28]" , isar2, 28, Ext::kCLRBHB);
- MERGE_FEATURE_4B("SYSREG128 bits [35:32]" , isar2, 32, Ext::kSYSREG128);
- MERGE_FEATURE_4B("SYSINSTR128 bits [39:36]" , isar2, 36, Ext::kSYSINSTR128);
- MERGE_FEATURE_4B("PRFMSLC bits [43:40]" , isar2, 40, Ext::kPRFMSLC);
- MERGE_FEATURE_4B("RPRFM bits [51:48]" , isar2, 48, Ext::kRPRFM);
- MERGE_FEATURE_4B("CSSC bits [55:52]" , isar2, 52, Ext::kCSSC);
- MERGE_FEATURE_4B("LUT bits [59:56]" , isar2, 56, Ext::kLUT);
-}
-
-// TODO: This register is not accessed at the moment.
-#if 0
-// Detects features based on the content of ID_AA64ISAR3_EL1register.
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64ISAR3(CpuInfo& cpu, uint64_t isar3) noexcept {
- // ID_AA64ISAR3_EL1
- // ================
-
- MERGE_FEATURE_4B("CPA bits [3:0]" , isar3, 0, Ext::kCPA, Ext::kCPA2);
- MERGE_FEATURE_4B("FAMINMAX bits [7:4]" , isar3, 4, Ext::kFAMINMAX);
- MERGE_FEATURE_4B("TLBIW bits [11:8]" , isar3, 8, Ext::kTLBIW);
-}
-#endif
-
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64MMFR0(CpuInfo& cpu, uint64_t mmfr0) noexcept {
- // ID_AA64MMFR0_EL1
- // ================
-
- /*
- MERGE_FEATURE_4B("PARange bits [3:0]" , mmfr0, 0, ...);
- MERGE_FEATURE_4B("ASIDBits bits [7:4]" , mmfr0, 4, ...);
- MERGE_FEATURE_4B("BigEnd bits [11:8]" , mmfr0, 8, ...);
- MERGE_FEATURE_4B("SNSMem bits [15:12]" , mmfr0, 12, ...);
- MERGE_FEATURE_4B("BigEndEL0 bits [19:16]" , mmfr0, 16, ...);
- MERGE_FEATURE_4B("TGran16 bits [23:20]" , mmfr0, 20, ...);
- MERGE_FEATURE_4B("TGran64 bits [27:24]" , mmfr0, 24, ...);
- MERGE_FEATURE_4B("TGran4 bits [31:28]" , mmfr0, 28, ...);
- MERGE_FEATURE_4B("TGran16_2 bits [35:32]" , mmfr0, 32, ...);
- MERGE_FEATURE_4B("TGran64_2 bits [39:36]" , mmfr0, 36, ...);
- MERGE_FEATURE_4B("TGran4_2 bits [43:40]" , mmfr0, 40, ...);
- MERGE_FEATURE_4B("ExS bits [47:44]" , mmfr0, 44, ...);
- */
- MERGE_FEATURE_4B("FGT bits [59:56]" , mmfr0, 56, Ext::kFGT, Ext::kFGT2);
- MERGE_FEATURE_4B("ECV bits [63:60]" , mmfr0, 60, Ext::kECV);
-}
-
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64MMFR1(CpuInfo& cpu, uint64_t mmfr1) noexcept {
- // ID_AA64MMFR1_EL1
- // ================
-
- MERGE_FEATURE_4B("HAFDBS bits [3:0]" , mmfr1, 0, Ext::kHAFDBS, Ext::kNone, Ext::kHAFT, Ext::kHDBSS);
- MERGE_FEATURE_4B("VMIDBits bits [7:4]" , mmfr1, 4, Ext::kVMID16);
- MERGE_FEATURE_4B("VH bits [11:8]" , mmfr1, 8, Ext::kVHE);
- MERGE_FEATURE_4B("HPDS bits [15:12]" , mmfr1, 12, Ext::kHPDS, Ext::kHPDS2);
- MERGE_FEATURE_4B("LO bits [19:16]" , mmfr1, 16, Ext::kLOR);
- MERGE_FEATURE_4B("PAN bits [23:20]" , mmfr1, 20, Ext::kPAN, Ext::kPAN2, Ext::kPAN3);
- /*
- MERGE_FEATURE_4B("SpecSEI bits [27:24]" , mmfr1, 24, ...);
- */
- MERGE_FEATURE_4B("XNX bits [31:28]" , mmfr1, 28, Ext::kXNX);
- /*
- MERGE_FEATURE_4B("TWED bits [35:32]" , mmfr1, 32, ...);
- MERGE_FEATURE_4B("ETS bits [39:36]" , mmfr1, 36, ...);
- */
- MERGE_FEATURE_4B("HCX bits [43:40]" , mmfr1, 40, Ext::kHCX);
- MERGE_FEATURE_4B("AFP bits [47:44]" , mmfr1, 44, Ext::kAFP);
- /*
- MERGE_FEATURE_4B("nTLBPA bits [51:48]" , mmfr1, 48, ...);
- MERGE_FEATURE_4B("TIDCP1 bits [55:52]" , mmfr1, 52, ...);
- */
- MERGE_FEATURE_4B("CMOW bits [59:56]" , mmfr1, 56, Ext::kCMOW);
- MERGE_FEATURE_4B("ECBHB bits [63:60]" , mmfr1, 60, Ext::kECBHB);
-}
-
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64MMFR2(CpuInfo& cpu, uint64_t mmfr2) noexcept {
- // ID_AA64MMFR2_EL1
- // ================
-
- /*
- MERGE_FEATURE_4B("CnP bits [3:0]" , mmfr2, 0, ...);
- */
- MERGE_FEATURE_4B("UAO bits [7:4]" , mmfr2, 4, Ext::kUAO);
- /*
- MERGE_FEATURE_4B("LSM bits [11:8]" , mmfr2, 8, ...);
- MERGE_FEATURE_4B("IESB bits [15:12]" , mmfr2, 12, ...);
- */
- MERGE_FEATURE_4B("VARange bits [19:16]" , mmfr2, 16, Ext::kLVA, Ext::kLVA3);
- MERGE_FEATURE_4B("CCIDX bits [23:20]" , mmfr2, 20, Ext::kCCIDX);
- MERGE_FEATURE_4B("NV bits [27:24]" , mmfr2, 24, Ext::kNV, Ext::kNV2);
- /*
- MERGE_FEATURE_4B("ST bits [31:28]" , mmfr2, 28, ...);
- */
- MERGE_FEATURE_4B("AT bits [35:32]" , mmfr2, 32, Ext::kLSE2);
- /*
- MERGE_FEATURE_4B("IDS bits [39:36]" , mmfr2, 36, ...);
- MERGE_FEATURE_4B("FWB bits [43:40]" , mmfr2, 40, ...);
- MERGE_FEATURE_4B("TTL bits [51:48]" , mmfr2, 48, ...);
- MERGE_FEATURE_4B("BBM bits [55:52]" , mmfr2, 52, ...);
- MERGE_FEATURE_4B("EVT bits [59:56]" , mmfr2, 56, ...);
- MERGE_FEATURE_4B("E0PD bits [63:60]" , mmfr2, 60, ...);
- */
-}
-
-// Detects features based on the content of ID_AA64ZFR0_EL1 register.
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64ZFR0(CpuInfo& cpu, uint64_t zfr0) noexcept {
- MERGE_FEATURE_4B("SVEver bits [3:0]" , zfr0, 0, Ext::kSVE2, Ext::kSVE2_1);
- MERGE_FEATURE_4B("AES bits [7:4]" , zfr0, 4, Ext::kSVE_AES, Ext::kSVE_PMULL128);
- MERGE_FEATURE_4B("BitPerm bits [19:16]" , zfr0, 16, Ext::kSVE_BITPERM);
- MERGE_FEATURE_4B("BF16 bits [23:20]" , zfr0, 20, Ext::kSVE_BF16, Ext::kSVE_EBF16);
- MERGE_FEATURE_4B("B16B16 bits [27:24]" , zfr0, 24, Ext::kSVE_B16B16);
- MERGE_FEATURE_4B("SHA3 bits [35:32]" , zfr0, 32, Ext::kSVE_SHA3);
- MERGE_FEATURE_4B("SM4 bits [43:40]" , zfr0, 40, Ext::kSVE_SM4);
- MERGE_FEATURE_4B("I8MM bits [47:44]" , zfr0, 44, Ext::kSVE_I8MM);
- MERGE_FEATURE_4B("F32MM bits [55:52]" , zfr0, 52, Ext::kSVE_F32MM);
- MERGE_FEATURE_4B("F64MM bits [59:56]" , zfr0, 56, Ext::kSVE_F64MM);
-}
-
-ASMJIT_MAYBE_UNUSED
-static inline void detectAArch64FeaturesViaCPUID_AA64SMFR0(CpuInfo& cpu, uint64_t smfr0) noexcept {
- MERGE_FEATURE_1B("SF8DP2 bit [28]" , smfr0, 29, Ext::kSSVE_FP8DOT2);
- MERGE_FEATURE_1B("SF8DP4 bit [29]" , smfr0, 29, Ext::kSSVE_FP8DOT4);
- MERGE_FEATURE_1B("SF8FMA bit [30]" , smfr0, 30, Ext::kSSVE_FP8FMA);
- MERGE_FEATURE_1B("F32F32 bit [32]" , smfr0, 32, Ext::kSME_F32F32);
- MERGE_FEATURE_1B("BI32I32 bit [33]" , smfr0, 33, Ext::kSME_BI32I32);
- MERGE_FEATURE_1B("B16F32 bit [34]" , smfr0, 34, Ext::kSME_B16F32);
- MERGE_FEATURE_1B("F16F32 bit [35]" , smfr0, 35, Ext::kSME_F16F32);
- MERGE_FEATURE_4S("I8I32 bits [39:36]" , smfr0, 36, 0xF, Ext::kSME_I8I32);
- MERGE_FEATURE_1B("F8F32 bit [40]" , smfr0, 40, Ext::kSME_F8F32);
- MERGE_FEATURE_1B("F8F16 bit [41]" , smfr0, 41, Ext::kSME_F8F16);
- MERGE_FEATURE_1B("F16F16 bit [42]" , smfr0, 42, Ext::kSME_F16F16);
- MERGE_FEATURE_1B("B16B16 bit [43]" , smfr0, 43, Ext::kSME_B16B16);
- MERGE_FEATURE_4S("I16I32 bits [47:44]" , smfr0, 44, 0x5, Ext::kSME_I16I32);
- MERGE_FEATURE_1B("F64F64 bit [48]" , smfr0, 48, Ext::kSME_F64F64);
- MERGE_FEATURE_4S("I16I64 bits [55:52]" , smfr0, 52, 0xF, Ext::kSME_I16I64);
- MERGE_FEATURE_4B("SMEver bits [59:56]" , smfr0, 56, Ext::kSME2, Ext::kSME2_1);
- MERGE_FEATURE_1B("LUTv2 bit [60]" , smfr0, 60, Ext::kSME_LUTv2);
- MERGE_FEATURE_1B("FA64 bit [63]" , smfr0, 63, Ext::kSME_FA64);
-}
-
-#undef MERGE_FEATURE_4S
-#undef MERGE_FEATURE_4B
-#undef MERGE_FEATURE_2B
-#undef MERGE_FEATURE_1B
-#undef MERGE_FEATURE_NA
-
-// CpuInfo - Detect - ARM - CPU Vendor Features
-// ============================================
-
-// CPU features detection based on Apple family ID.
-enum class AppleFamilyId : uint32_t {
- // Apple design.
- kSWIFT = 0x1E2D6381u, // Apple A6/A6X (ARMv7s).
- kCYCLONE = 0x37A09642u, // Apple A7 (ARMv8.0-A).
- kTYPHOON = 0x2C91A47Eu, // Apple A8 (ARMv8.0-A).
- kTWISTER = 0x92FB37C8u, // Apple A9 (ARMv8.0-A).
- kHURRICANE = 0x67CEEE93u, // Apple A10 (ARMv8.1-A).
- kMONSOON_MISTRAL = 0xE81E7EF6u, // Apple A11 (ARMv8.2-A).
- kVORTEX_TEMPEST = 0x07D34B9Fu, // Apple A12 (ARMv8.3-A).
- kLIGHTNING_THUNDER = 0x462504D2u, // Apple A13 (ARMv8.4-A).
- kFIRESTORM_ICESTORM = 0x1B588BB3u, // Apple A14/M1 (ARMv8.5-A).
- kAVALANCHE_BLIZZARD = 0XDA33D83Du, // Apple A15/M2.
- kEVEREST_SAWTOOTH = 0X8765EDEAu // Apple A16.
-};
-
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE bool detectARMFeaturesViaAppleFamilyId(CpuInfo& cpu) noexcept {
- typedef AppleFamilyId Id;
- CpuFeatures::ARM& features = cpu.features().arm();
-
- switch (cpu.familyId()) {
- // Apple A7-A9 (ARMv8.0-A).
- case uint32_t(Id::kCYCLONE):
- case uint32_t(Id::kTYPHOON):
- case uint32_t(Id::kTWISTER):
- populateARMv8AFeatures(features, 0);
- features.add(Ext::kAES, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256);
- return true;
-
- // Apple A10 (ARMv8.0-A).
- case uint32_t(Id::kHURRICANE):
- populateARMv8AFeatures(features, 0);
- features.add(Ext::kAES, Ext::kCRC32, Ext::kLOR, Ext::kPAN, Ext::kPMU, Ext::kPMULL, Ext::kRDM, Ext::kSHA1,
- Ext::kSHA256, Ext::kVHE);
- return true;
-
- // Apple A11 (ARMv8.2-A).
- case uint32_t(Id::kMONSOON_MISTRAL):
- populateARMv8AFeatures(features, 2);
- features.add(Ext::kAES, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256);
- return true;
-
- // Apple A12 (ARMv8.3-A).
- case uint32_t(Id::kVORTEX_TEMPEST):
- populateARMv8AFeatures(features, 3);
- features.add(Ext::kAES, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1, Ext::kSHA256);
- return true;
-
- // Apple A13 (ARMv8.4-A).
- case uint32_t(Id::kLIGHTNING_THUNDER):
- populateARMv8AFeatures(features, 4);
- features.add(Ext::kAES, Ext::kFHM, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1,
- Ext::kSHA256, Ext::kSHA3, Ext::kSHA512);
- return true;
-
- // Apple A14/M1 (ARMv8.5-A).
- case uint32_t(Id::kFIRESTORM_ICESTORM):
- populateARMv8AFeatures(features, 4);
- features.add(Ext::kAES, Ext::kCSV2, Ext::kCSV3, Ext::kDPB2, Ext::kECV, Ext::kFHM, Ext::kFLAGM2,
- Ext::kFP16, Ext::kFP16CONV, Ext::kFRINTTS, Ext::kPMU, Ext::kPMULL, Ext::kSB,
- Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512, Ext::kSSBS);
- return true;
-
- // Apple A15/M2.
- case uint32_t(Id::kAVALANCHE_BLIZZARD):
- populateARMv8AFeatures(features, 6);
- features.add(Ext::kAES, Ext::kFHM, Ext::kFP16, Ext::kFP16CONV, Ext::kPMU, Ext::kPMULL, Ext::kSHA1,
- Ext::kSHA256, Ext::kSHA3, Ext::kSHA512);
- return true;
-
- // Apple A16.
- case uint32_t(Id::kEVEREST_SAWTOOTH):
- populateARMv8AFeatures(features, 6);
- features.add(Ext::kAES, Ext::kFHM, Ext::kFP16, Ext::kFP16CONV, Ext::kHCX, Ext::kPMU, Ext::kPMULL,
- Ext::kSHA1, Ext::kSHA256, Ext::kSHA3, Ext::kSHA512);
- return true;
-
- default:
- return false;
- }
-}
-
-// CpuInfo - Detect - ARM - Compile Flags Features
-// ===============================================
-
-// Detects ARM version by macros defined at compile time. This means that AsmJit will report features forced at
-// compile time that should always be provided by the target CPU. This also means that if we don't provide any
-// means to detect CPU features the features reported by AsmJit will at least not report less features than the
-// target it was compiled to.
-
-#if ASMJIT_ARCH_ARM == 32
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void detectAArch32FeaturesViaCompilerFlags(CpuInfo& cpu) noexcept {
- DebugUtils::unused(cpu);
-
- // ARM targets have no baseline at the moment.
-#if defined(__ARM_ARCH_7A__)
- cpu.addFeature(CpuFeatures::ARM::kARMv7);
-#endif
-
-#if defined(__ARM_ARCH_8A__)
- cpu.addFeature(CpuFeatures::ARM::kARMv8a);
-#endif
-
-#if defined(__TARGET_ARCH_THUMB)
- cpu.addFeature(CpuFeatures::ARM::kTHUMB);
-#if __TARGET_ARCH_THUMB >= 4
- cpu.addFeature(CpuFeatures::ARM::kTHUMBv2);
-#endif
-#endif
-
-#if defined(__ARM_FEATURE_FMA)
- cpu.addFeature(Ext::kFP);
-#endif
-
-#if defined(__ARM_NEON)
- cpu.addFeature(Ext::kASIMD);
-#endif
-
-#if defined(__ARM_FEATURE_IDIV) && defined(__TARGET_ARCH_THUMB)
- cpu.addFeature(Ext::kIDIVT);
-#endif
-#if defined(__ARM_FEATURE_IDIV) && !defined(__TARGET_ARCH_THUMB)
- cpu.addFeature(Ext::kIDIVA);
-#endif
-}
-#endif // ASMJIT_ARCH_ARM == 32
-
-#if ASMJIT_ARCH_ARM == 64
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void detectAArch64FeaturesViaCompilerFlags(CpuInfo& cpu) noexcept {
- DebugUtils::unused(cpu);
-
-#if defined(__ARM_ARCH_9_5A__)
- populateARMv9AFeatures(cpu.features().arm(), 5);
-#elif defined(__ARM_ARCH_9_4A__)
- populateARMv9AFeatures(cpu.features().arm(), 4);
-#elif defined(__ARM_ARCH_9_3A__)
- populateARMv9AFeatures(cpu.features().arm(), 3);
-#elif defined(__ARM_ARCH_9_2A__)
- populateARMv9AFeatures(cpu.features().arm(), 2);
-#elif defined(__ARM_ARCH_9_1A__)
- populateARMv9AFeatures(cpu.features().arm(), 1);
-#elif defined(__ARM_ARCH_9A__)
- populateARMv9AFeatures(cpu.features().arm(), 0);
-#elif defined(__ARM_ARCH_8_9A__)
- populateARMv8AFeatures(cpu.features().arm(), 9);
-#elif defined(__ARM_ARCH_8_8A__)
- populateARMv8AFeatures(cpu.features().arm(), 8);
-#elif defined(__ARM_ARCH_8_7A__)
- populateARMv8AFeatures(cpu.features().arm(), 7);
-#elif defined(__ARM_ARCH_8_6A__)
- populateARMv8AFeatures(cpu.features().arm(), 6);
-#elif defined(__ARM_ARCH_8_5A__)
- populateARMv8AFeatures(cpu.features().arm(), 5);
-#elif defined(__ARM_ARCH_8_4A__)
- populateARMv8AFeatures(cpu.features().arm(), 4);
-#elif defined(__ARM_ARCH_8_3A__)
- populateARMv8AFeatures(cpu.features().arm(), 3);
-#elif defined(__ARM_ARCH_8_2A__)
- populateARMv8AFeatures(cpu.features().arm(), 2);
-#elif defined(__ARM_ARCH_8_1A__)
- populateARMv8AFeatures(cpu.features().arm(), 1);
-#else
- populateARMv8AFeatures(cpu.features().arm(), 0);
-#endif
-
-#if defined(__ARM_FEATURE_AES)
- cpu.addFeature(Ext::kAES);
-#endif
-
-#if defined(__ARM_FEATURE_BF16_SCALAR_ARITHMETIC) && defined(__ARM_FEATURE_BF16_VECTOR_ARITHMETIC)
- cpu.addFeature(Ext::kBF16);
-#endif
-
-#if defined(__ARM_FEATURE_CRC32)
- cpu.addFeature(Ext::kCRC32);
-#endif
-
-#if defined(__ARM_FEATURE_CRYPTO)
- cpu.addFeature(Ext::kAES, Ext::kSHA1, Ext::kSHA256);
-#endif
-
-#if defined(__ARM_FEATURE_DOTPROD)
- cpu.addFeature(Ext::kDOTPROD);
-#endif
-
-#if defined(__ARM_FEATURE_FP16FML) || defined(__ARM_FEATURE_FP16_FML)
- cpu.addFeature(Ext::kFHM);
-#endif
-
-#if defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC)
- cpu.addFeature(Ext::kFP16);
-#endif
-
-#if defined(__ARM_FEATURE_FRINT)
- cpu.addFeature(Ext::kFRINTTS);
-#endif
-
-#if defined(__ARM_FEATURE_JCVT)
- cpu.addFeature(Ext::kJSCVT);
-#endif
-
-#if defined(__ARM_FEATURE_MATMUL_INT8)
- cpu.addFeature(Ext::kI8MM);
-#endif
-
-#if defined(__ARM_FEATURE_ATOMICS)
- cpu.addFeature(Ext::kLSE);
-#endif
-
-#if defined(__ARM_FEATURE_MEMORY_TAGGING)
- cpu.addFeature(Ext::kMTE);
-#endif
-
-#if defined(__ARM_FEATURE_QRDMX)
- cpu.addFeature(Ext::kRDM);
-#endif
-
-#if defined(__ARM_FEATURE_RNG)
- cpu.addFeature(Ext::kRNG);
-#endif
-
-#if defined(__ARM_FEATURE_SHA2)
- cpu.addFeature(Ext::kSHA256);
-#endif
-
-#if defined(__ARM_FEATURE_SHA3)
- cpu.addFeature(Ext::kSHA3);
-#endif
-
-#if defined(__ARM_FEATURE_SHA512)
- cpu.addFeature(Ext::kSHA512);
-#endif
-
-#if defined(__ARM_FEATURE_SM3)
- cpu.addFeature(Ext::kSM3);
-#endif
-
-#if defined(__ARM_FEATURE_SM4)
- cpu.addFeature(Ext::kSM4);
-#endif
-
-#if defined(__ARM_FEATURE_SVE) || defined(__ARM_FEATURE_SVE_VECTOR_OPERATORS)
- cpu.addFeature(Ext::kSVE);
-#endif
-
-#if defined(__ARM_FEATURE_SVE_MATMUL_INT8)
- cpu.addFeature(Ext::kSVE_I8MM);
-#endif
-
-#if defined(__ARM_FEATURE_SVE_MATMUL_FP32)
- cpu.addFeature(Ext::kSVE_F32MM);
-#endif
-
-#if defined(__ARM_FEATURE_SVE_MATMUL_FP64)
- cpu.addFeature(Ext::kSVE_F64MM);
-#endif
-
-#if defined(__ARM_FEATURE_SVE2)
- cpu.addFeature(Ext::kSVE2);
-#endif
-
-#if defined(__ARM_FEATURE_SVE2_AES)
- cpu.addFeature(Ext::kSVE_AES);
-#endif
-
-#if defined(__ARM_FEATURE_SVE2_BITPERM)
- cpu.addFeature(Ext::kSVE_BITPERM);
-#endif
-
-#if defined(__ARM_FEATURE_SVE2_SHA3)
- cpu.addFeature(Ext::kSVE_SHA3);
-#endif
-
-#if defined(__ARM_FEATURE_SVE2_SM4)
- cpu.addFeature(Ext::kSVE_SM4);
-#endif
-
-#if defined(__ARM_FEATURE_TME)
- cpu.addFeature(Ext::kTME);
-#endif
-}
-#endif // ASMJIT_ARCH_ARM == 64
-
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void detectARMFeaturesViaCompilerFlags(CpuInfo& cpu) noexcept {
-#if ASMJIT_ARCH_ARM == 32
- detectAArch32FeaturesViaCompilerFlags(cpu);
-#else
- detectAArch64FeaturesViaCompilerFlags(cpu);
-#endif // ASMJIT_ARCH_ARM
-}
-
-// CpuInfo - Detect - ARM - Post Processing ARM Features
-// =====================================================
-
-// Postprocesses AArch32 features.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void postProcessAArch32Features(CpuFeatures::ARM& features) noexcept {
- DebugUtils::unused(features);
-}
-
-// Postprocesses AArch64 features.
-//
-// The only reason to use this function is to deduce some flags from others.
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void postProcessAArch64Features(CpuFeatures::ARM& features) noexcept {
- if (features.hasFP16())
- features.add(Ext::kFP16CONV);
-
- if (features.hasMTE3())
- features.add(Ext::kMTE2);
-
- if (features.hasMTE2())
- features.add(Ext::kMTE);
-
- if (features.hasSSBS2())
- features.add(Ext::kSSBS);
-}
-
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void postProcessARMCpuInfo(CpuInfo& cpu) noexcept {
-#if ASMJIT_ARCH_ARM == 32
- postProcessAArch32Features(cpu.features().arm());
-#else
- postProcessAArch64Features(cpu.features().arm());
-#endif // ASMJIT_ARCH_ARM
-}
-
-// CpuInfo - Detect - ARM - Detect by Reading CPUID Registers
-// ==========================================================
-
-// Support CPUID-based detection on AArch64.
-#if defined(ASMJIT_ARM_DETECT_VIA_CPUID)
-
-// Since the register ID is encoded with the instruction we have to create a function for each register ID to read.
-#define ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(func, regId) \
-ASMJIT_MAYBE_UNUSED \
-static inline uint64_t func() noexcept { \
- uint64_t output; \
- __asm__ __volatile__("mrs %0, " #regId : "=r"(output)); \
- return output; \
-}
-
-// NOTE: Older tools don't know the IDs. For example Ubuntu on RPI (GCC 9) won't compile ID_AA64ISAR2_EL1 in 2023.
-ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadPFR0, ID_AA64PFR0_EL1)
-ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadPFR1, ID_AA64PFR1_EL1)
-ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadISAR0, ID_AA64ISAR0_EL1)
-ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadISAR1, ID_AA64ISAR1_EL1)
-ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadISAR2, S3_0_C0_C6_2) // ID_AA64ISAR2_EL1
-ASMJIT_AARCH64_DEFINE_CPUID_READ_FN(aarch64ReadZFR0, S3_0_C0_C4_4) // ID_AA64ZFR0_EL1
-
-#undef ASMJIT_AARCH64_DEFINE_CPUID_READ_FN
-
-// Detects AArch64 features by reading CPUID bits directly from CPUID registers. This is the most reliable method
-// as the OS doesn't have to know all supported extensions this way (if there is something missing in HWCAPS then
-// there is no way to detect such feature without reading CPUID bits).
-//
-// This function uses MSR instructions, which means that it reads registers that cannot be read in user-mode. The
-// OS typically implements this feature by handling SIGILL internally and providing a filtered content of these
-// registers back to the user - at least this is what Linux documentation states - everything implementation
-// dependent is zeroed, only the bits that are used for CPU feature identification would be present.
-//
-// References:
-// - https://docs.kernel.org/arch/arm64/cpu-feature-registers.html
-ASMJIT_MAYBE_UNUSED
-static ASMJIT_FAVOR_SIZE void detectAArch64FeaturesViaCPUID(CpuInfo& cpu) noexcept {
- populateBaseARMFeatures(cpu);
-
- detectAArch64FeaturesViaCPUID_AA64PFR0_AA64PFR1(cpu,
- aarch64ReadPFR0(),
- aarch64ReadPFR1());
-
- detectAArch64FeaturesViaCPUID_AA64ISAR0_AA64ISAR1(cpu,
- aarch64ReadISAR0(),
- aarch64ReadISAR1());
-
- // TODO: Fix this on FreeBSD - I don't know what kernel version allows to access the registers below...
-
-#if defined(__linux__)
- UNameKernelVersion kVer = getUNameKernelVersion();
-
- // Introduced in Linux 4.19 by "arm64: add ID_AA64ISAR2_EL1 sys register"), so we want at least 4.20.
- if (kVer.atLeast(4, 20)) {
- detectAArch64FeaturesViaCPUID_AA64ISAR2(cpu, aarch64ReadISAR2());
- }
-
- // Introduced in Linux 5.10 by "arm64: Expose SVE2 features for userspace", so we want at least 5.11.
- if (kVer.atLeast(5, 11) && cpu.features().arm().hasAny(Ext::kSVE, Ext::kSME)) {
- // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available.
- detectAArch64FeaturesViaCPUID_AA64ZFR0(cpu, aarch64ReadZFR0());
- }
-#endif
-}
-
-#endif // ASMJIT_ARM_DETECT_VIA_CPUID
-
-// CpuInfo - Detect - ARM - Detect by Windows API
-// ==============================================
-
-#if defined(_WIN32)
-struct WinPFPMapping {
- uint8_t featureId;
- uint8_t pfpFeatureId;
-};
-
-static ASMJIT_FAVOR_SIZE void detectPFPFeatures(CpuInfo& cpu, const WinPFPMapping* mapping, size_t size) noexcept {
- for (size_t i = 0; i < size; i++) {
- if (::IsProcessorFeaturePresent(mapping[i].pfpFeatureId)) {
- cpu.addFeature(mapping[i].featureId);
- }
- }
-}
-
-//! Detect ARM CPU features on Windows.
-//!
-//! The detection is based on `IsProcessorFeaturePresent()` API call.
-static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
- cpu._wasDetected = true;
- populateBaseARMFeatures(cpu);
-
- CpuFeatures::ARM& features = cpu.features().arm();
-
- // Win32 for ARM requires ARMv7 with DSP extensions, VFPv3 (FP), and uses THUMBv2 by default.
-#if ASMJIT_ARCH_ARM == 32
- features.add(Ext::kTHUMB);
- features.add(Ext::kTHUMBv2);
- features.add(Ext::kARMv6);
- features.add(Ext::kARMv7);
- features.add(Ext::kEDSP);
-#endif
-
- // Windows for ARM requires FP and ASIMD.
- features.add(Ext::kFP);
- features.add(Ext::kASIMD);
-
- // Detect additional CPU features by calling `IsProcessorFeaturePresent()`.
- static const WinPFPMapping mapping[] = {
-#if ASMJIT_ARCH_ARM == 32
- { uint8_t(Ext::kVFP_D32) , 18 }, // PF_ARM_VFP_32_REGISTERS_AVAILABLE
- { uint8_t(Ext::kIDIVT) , 24 }, // PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE
- { uint8_t(Ext::kFMAC) , 27 }, // PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE
- { uint8_t(Ext::kARMv8a) , 29 }, // PF_ARM_V8_INSTRUCTIONS_AVAILABLE
-#endif
- { uint8_t(Ext::kAES) , 30 }, // PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE
- { uint8_t(Ext::kCRC32) , 31 }, // PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE
- { uint8_t(Ext::kLSE) , 34 }, // PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE
- { uint8_t(Ext::kDOTPROD) , 43 }, // PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
- { uint8_t(Ext::kJSCVT) , 44 }, // PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE
- { uint8_t(Ext::kLRCPC) , 45 } // PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE
- };
- detectPFPFeatures(cpu, mapping, ASMJIT_ARRAY_SIZE(mapping));
-
- // Windows can only report ARMv8A at the moment.
- if (features.hasARMv8a()) {
- populateARMv8AFeatures(cpu.features().arm(), 0);
- }
-
- // Windows provides several instructions under a single flag:
- if (features.hasAES()) {
- features.add(Ext::kPMULL, Ext::kSHA1, Ext::kSHA256);
- }
-
- postProcessARMCpuInfo(cpu);
-}
-
-// CpuInfo - Detect - ARM - Detect by Reading HWCAPS
-// =================================================
-
-#elif defined(ASMJIT_ARM_DETECT_VIA_HWCAPS)
-
-#ifndef AT_HWCAP
- #define AT_HWCAP 16
-#endif // !AT_HWCAP
-
-#ifndef AT_HWCAP2
- #define AT_HWCAP2 26
-#endif // !AT_HWCAP2
-
-#if defined(__linux__)
-static void getAuxValues(unsigned long* vals, const unsigned long* tags, size_t count) noexcept {
- for (size_t i = 0; i < count; i++) {
- vals[i] = getauxval(tags[i]);
- }
-}
-#elif defined(__FreeBSD__)
-static void getAuxValues(unsigned long* vals, const unsigned long* tags, size_t count) noexcept {
- for (size_t i = 0; i < count; i++) {
- unsigned long result = 0;
- if (elf_aux_info(int(tags[i]), &result, int(sizeof(unsigned long))) != 0)
- result = 0;
- vals[i] = result;
- }
-}
-#else
-#error "[asmjit] getAuxValues() - Unsupported OS."
-#endif
-
-struct HWCapMapping {
- uint8_t featureId;
- uint8_t hwCapBit;
-};
-
-static const unsigned long hwCapTags[2] = { AT_HWCAP, AT_HWCAP2 };
-
-static ASMJIT_FAVOR_SIZE void mergeHWCaps(CpuInfo& cpu, unsigned long mask, const HWCapMapping* mapping, size_t size) noexcept {
- for (size_t i = 0; i < size; i++) {
- cpu.features().addIf(Support::bitTest(mask, mapping[i].hwCapBit), mapping[i].featureId);
- }
-}
-
-#if ASMJIT_ARCH_ARM == 32
-
-// Reference:
-// - https://github.com/torvalds/linux/blob/master/arch/arm/include/uapi/asm/hwcap.h
-static const HWCapMapping hwCapMapping[] = {
- { uint8_t(Ext::kEDSP) , 7 }, // HWCAP_EDSP
- { uint8_t(Ext::kASIMD) , 12 }, // HWCAP_NEON
- { uint8_t(Ext::kFP) , 13 }, // HWCAP_VFPv3
- { uint8_t(Ext::kFMAC) , 16 }, // HWCAP_VFPv4
- { uint8_t(Ext::kIDIVA) , 17 }, // HWCAP_IDIVA
- { uint8_t(Ext::kIDIVT) , 18 }, // HWCAP_IDIVT
- { uint8_t(Ext::kVFP_D32) , 19 }, // HWCAP_VFPD32
- { uint8_t(Ext::kFP16CONV) , 22 }, // HWCAP_FPHP
- { uint8_t(Ext::kFP16) , 23 }, // HWCAP_ASIMDHP
- { uint8_t(Ext::kDOTPROD) , 24 }, // HWCAP_ASIMDDP
- { uint8_t(Ext::kFHM) , 25 }, // HWCAP_ASIMDFHM
- { uint8_t(Ext::kBF16) , 26 }, // HWCAP_ASIMDBF16
- { uint8_t(Ext::kI8MM) , 27 } // HWCAP_I8MM
-};
-
-static const HWCapMapping hwCap2Mapping[] = {
- { uint8_t(Ext::kAES) , 0 }, // HWCAP2_AES
- { uint8_t(Ext::kPMULL) , 1 }, // HWCAP2_PMULL
- { uint8_t(Ext::kSHA1) , 2 }, // HWCAP2_SHA1
- { uint8_t(Ext::kSHA256) , 3 }, // HWCAP2_SHA2
- { uint8_t(Ext::kCRC32) , 4 }, // HWCAP2_CRC32
- { uint8_t(Ext::kSB) , 5 }, // HWCAP2_SB
- { uint8_t(Ext::kSSBS) , 6 } // HWCAP2_SSBS
-};
-
-static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
- cpu._wasDetected = true;
- populateBaseARMFeatures(cpu);
-
- unsigned long hwCapMasks[2] {};
- getAuxValues(hwCapMasks, hwCapTags, 2u);
-
- mergeHWCaps(cpu, hwCapMasks[0], hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping));
- mergeHWCaps(cpu, hwCapMasks[1], hwCap2Mapping, ASMJIT_ARRAY_SIZE(hwCap2Mapping));
-
- CpuFeatures::ARM& features = cpu.features().arm();
-
- // ARMv7 provides FP|ASIMD.
- if (features.hasFP() || features.hasASIMD())
- features.add(CpuFeatures::ARM::kARMv7);
-
- // ARMv8 provives AES, CRC32, PMULL, SHA1, and SHA256.
- if (features.hasAES() || features.hasCRC32() || features.hasPMULL() || features.hasSHA1() || features.hasSHA256())
- features.add(CpuFeatures::ARM::kARMv8a);
-
- postProcessARMCpuInfo(cpu);
-}
-
-#else
-
-// Reference:
-// - https://docs.kernel.org/arch/arm64/elf_hwcaps.html
-// - https://github.com/torvalds/linux/blob/master/arch/arm64/include/uapi/asm/hwcap.h
-static const HWCapMapping hwCapMapping[] = {
- { uint8_t(Ext::kFP) , 0 }, // HWCAP_FP
- { uint8_t(Ext::kASIMD) , 1 }, // HWCAP_ASIMD
- /*
- { uint8_t(Ext::k) , 2 }, // HWCAP_EVTSTRM
- */
- { uint8_t(Ext::kAES) , 3 }, // HWCAP_AES
- { uint8_t(Ext::kPMULL) , 4 }, // HWCAP_PMULL
- { uint8_t(Ext::kSHA1) , 5 }, // HWCAP_SHA1
- { uint8_t(Ext::kSHA256) , 6 }, // HWCAP_SHA2
- { uint8_t(Ext::kCRC32) , 7 }, // HWCAP_CRC32
- { uint8_t(Ext::kLSE) , 8 }, // HWCAP_ATOMICS
- { uint8_t(Ext::kFP16CONV) , 9 }, // HWCAP_FPHP
- { uint8_t(Ext::kFP16) , 10 }, // HWCAP_ASIMDHP
- { uint8_t(Ext::kCPUID) , 11 }, // HWCAP_CPUID
- { uint8_t(Ext::kRDM) , 12 }, // HWCAP_ASIMDRDM
- { uint8_t(Ext::kJSCVT) , 13 }, // HWCAP_JSCVT
- { uint8_t(Ext::kFCMA) , 14 }, // HWCAP_FCMA
- { uint8_t(Ext::kLRCPC) , 15 }, // HWCAP_LRCPC
- { uint8_t(Ext::kDPB) , 16 }, // HWCAP_DCPOP
- { uint8_t(Ext::kSHA3) , 17 }, // HWCAP_SHA3
- { uint8_t(Ext::kSM3) , 18 }, // HWCAP_SM3
- { uint8_t(Ext::kSM4) , 19 }, // HWCAP_SM4
- { uint8_t(Ext::kDOTPROD) , 20 }, // HWCAP_ASIMDDP
- { uint8_t(Ext::kSHA512) , 21 }, // HWCAP_SHA512
- { uint8_t(Ext::kSVE) , 22 }, // HWCAP_SVE
- { uint8_t(Ext::kFHM) , 23 }, // HWCAP_ASIMDFHM
- { uint8_t(Ext::kDIT) , 24 }, // HWCAP_DIT
- { uint8_t(Ext::kLSE2) , 25 }, // HWCAP_USCAT
- { uint8_t(Ext::kLRCPC2) , 26 }, // HWCAP_ILRCPC
- { uint8_t(Ext::kFLAGM) , 27 }, // HWCAP_FLAGM
- { uint8_t(Ext::kSSBS) , 28 }, // HWCAP_SSBS
- { uint8_t(Ext::kSB) , 29 } // HWCAP_SB
- /*
- { uint8_t(Ext::k) , 30 }, // HWCAP_PACA
- { uint8_t(Ext::k) , 31 } // HWCAP_PACG
- */
-};
-
-static const HWCapMapping hwCap2Mapping[] = {
- { uint8_t(Ext::kDPB2) , 0 }, // HWCAP2_DCPODP
- { uint8_t(Ext::kSVE2) , 1 }, // HWCAP2_SVE2
- { uint8_t(Ext::kSVE_AES) , 2 }, // HWCAP2_SVEAES
- { uint8_t(Ext::kSVE_PMULL128) , 3 }, // HWCAP2_SVEPMULL
- { uint8_t(Ext::kSVE_BITPERM) , 4 }, // HWCAP2_SVEBITPERM
- { uint8_t(Ext::kSVE_SHA3) , 5 }, // HWCAP2_SVESHA3
- { uint8_t(Ext::kSVE_SM4) , 6 }, // HWCAP2_SVESM4
- { uint8_t(Ext::kFLAGM2) , 7 }, // HWCAP2_FLAGM2
- { uint8_t(Ext::kFRINTTS) , 8 }, // HWCAP2_FRINT
- { uint8_t(Ext::kSVE_I8MM) , 9 }, // HWCAP2_SVEI8MM
- { uint8_t(Ext::kSVE_F32MM) , 10 }, // HWCAP2_SVEF32MM
- { uint8_t(Ext::kSVE_F64MM) , 11 }, // HWCAP2_SVEF64MM
- { uint8_t(Ext::kSVE_BF16) , 12 }, // HWCAP2_SVEBF16
- { uint8_t(Ext::kI8MM) , 13 }, // HWCAP2_I8MM
- { uint8_t(Ext::kBF16) , 14 }, // HWCAP2_BF16
- { uint8_t(Ext::kDGH) , 15 }, // HWCAP2_DGH
- { uint8_t(Ext::kRNG) , 16 }, // HWCAP2_RNG
- { uint8_t(Ext::kBTI) , 17 }, // HWCAP2_BTI
- { uint8_t(Ext::kMTE) , 18 }, // HWCAP2_MTE
- { uint8_t(Ext::kECV) , 19 }, // HWCAP2_ECV
- { uint8_t(Ext::kAFP) , 20 }, // HWCAP2_AFP
- { uint8_t(Ext::kRPRES) , 21 }, // HWCAP2_RPRES
- { uint8_t(Ext::kMTE3) , 22 }, // HWCAP2_MTE3
- { uint8_t(Ext::kSME) , 23 }, // HWCAP2_SME
- { uint8_t(Ext::kSME_I16I64) , 24 }, // HWCAP2_SME_I16I64
- { uint8_t(Ext::kSME_F64F64) , 25 }, // HWCAP2_SME_F64F64
- { uint8_t(Ext::kSME_I8I32) , 26 }, // HWCAP2_SME_I8I32
- { uint8_t(Ext::kSME_F16F32) , 27 }, // HWCAP2_SME_F16F32
- { uint8_t(Ext::kSME_B16F32) , 28 }, // HWCAP2_SME_B16F32
- { uint8_t(Ext::kSME_F32F32) , 29 }, // HWCAP2_SME_F32F32
- { uint8_t(Ext::kSME_FA64) , 30 }, // HWCAP2_SME_FA64
- { uint8_t(Ext::kWFXT) , 31 }, // HWCAP2_WFXT
- { uint8_t(Ext::kEBF16) , 32 }, // HWCAP2_EBF16
- { uint8_t(Ext::kSVE_EBF16) , 33 }, // HWCAP2_SVE_EBF16
- { uint8_t(Ext::kCSSC) , 34 }, // HWCAP2_CSSC
- { uint8_t(Ext::kRPRFM) , 35 }, // HWCAP2_RPRFM
- { uint8_t(Ext::kSVE2_1) , 36 }, // HWCAP2_SVE2P1
- { uint8_t(Ext::kSME2) , 37 }, // HWCAP2_SME2
- { uint8_t(Ext::kSME2_1) , 38 }, // HWCAP2_SME2P1
- { uint8_t(Ext::kSME_I16I32) , 39 }, // HWCAP2_SME_I16I32
- { uint8_t(Ext::kSME_BI32I32) , 40 }, // HWCAP2_SME_BI32I32
- { uint8_t(Ext::kSME_B16B16) , 41 }, // HWCAP2_SME_B16B16
- { uint8_t(Ext::kSME_F16F16) , 42 }, // HWCAP2_SME_F16F16
- { uint8_t(Ext::kMOPS) , 43 }, // HWCAP2_MOPS
- { uint8_t(Ext::kHBC) , 44 }, // HWCAP2_HBC
- { uint8_t(Ext::kSVE_B16B16) , 45 }, // HWCAP2_SVE_B16B16
- { uint8_t(Ext::kLRCPC3) , 46 }, // HWCAP2_LRCPC3
- { uint8_t(Ext::kLSE128) , 47 }, // HWCAP2_LSE128
-};
-
-static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
- cpu._wasDetected = true;
- populateBaseARMFeatures(cpu);
-
- unsigned long hwCapMasks[2] {};
- getAuxValues(hwCapMasks, hwCapTags, 2u);
-
- mergeHWCaps(cpu, hwCapMasks[0], hwCapMapping, ASMJIT_ARRAY_SIZE(hwCapMapping));
- mergeHWCaps(cpu, hwCapMasks[1], hwCap2Mapping, ASMJIT_ARRAY_SIZE(hwCap2Mapping));
-
-#if defined(ASMJIT_ARM_DETECT_VIA_CPUID)
- if (cpu.features().arm().hasCPUID()) {
- detectAArch64FeaturesViaCPUID(cpu);
- return;
- }
-#endif // ASMJIT_ARM_DETECT_VIA_CPUID
-
- postProcessARMCpuInfo(cpu);
-}
-
-#endif // ASMJIT_ARCH_ARM
-
-// CpuInfo - Detect - ARM - Detect by OpenBSD API That Reads CPUID
-// ===============================================================
-
-#elif defined(__OpenBSD__) && ASMJIT_ARCH_ARM >= 64
-
-// Supported CPUID registers on OpenBSD (CTL_MACHDEP definitions):
-// - https://github.com/openbsd/src/blob/master/sys/arch/arm64/include/cpu.h
-enum class OpenBSDAArch64CPUID {
- kAA64ISAR0 = 2,
- kAA64ISAR1 = 3,
- kAA64ISAR2 = 4,
- kAA64MMFR0 = 5,
- kAA64MMFR1 = 6,
- kAA64MMFR2 = 7,
- kAA64PFR0 = 8,
- kAA64PFR1 = 9,
- kAA64SMFR0 = 10,
- kAA64ZFR0 = 11
-};
-
-static uint64_t openbsdReadAArch64CPUID(OpenBSDAArch64CPUID id) noexcept {
- uint64_t bits = 0;
- size_t size = sizeof(bits);
- int name[2] = { CTL_MACHDEP, int(id) };
-
- return (sysctl(name, 2, &bits, &size, NULL, 0) < 0) ? uint64_t(0) : bits;
-}
-
-static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
- typedef OpenBSDAArch64CPUID ID;
-
- populateBaseARMFeatures(cpu);
-
- detectAArch64FeaturesViaCPUID_AA64PFR0_AA64PFR1(cpu,
- openbsdReadAArch64CPUID(ID::kAA64PFR0),
- openbsdReadAArch64CPUID(ID::kAA64PFR1));
-
- detectAArch64FeaturesViaCPUID_AA64ISAR0_AA64ISAR1(cpu,
- openbsdReadAArch64CPUID(ID::kAA64ISAR0),
- openbsdReadAArch64CPUID(ID::kAA64ISAR1));
-
- detectAArch64FeaturesViaCPUID_AA64ISAR2(cpu, openbsdReadAArch64CPUID(ID::kAA64ISAR2));
- detectAArch64FeaturesViaCPUID_AA64MMFR0(cpu, openbsdReadAArch64CPUID(ID::kAA64MMFR0));
- detectAArch64FeaturesViaCPUID_AA64MMFR1(cpu, openbsdReadAArch64CPUID(ID::kAA64MMFR1));
- detectAArch64FeaturesViaCPUID_AA64MMFR2(cpu, openbsdReadAArch64CPUID(ID::kAA64MMFR2));
-
- // Only read CPU_ID_AA64ZFR0 when either SVE or SME is available.
- if (cpu.features().arm().hasAny(Ext::kSVE, Ext::kSME)) {
- detectAArch64FeaturesViaCPUID_AA64ZFR0(cpu, openbsdReadAArch64CPUID(ID::kAA64ZFR0));
-
- if (cpu.features().arm().hasSME())
- detectAArch64FeaturesViaCPUID_AA64SMFR0(cpu, openbsdReadAArch64CPUID(ID::kAA64SMFR0));
- }
-
- postProcessARMCpuInfo(cpu);
-}
-
-// CpuInfo - Detect - ARM - Detect by Apple API (sysctlbyname)
-// ===========================================================
-
-#elif defined(__APPLE__)
-
-enum class AppleFeatureType : uint8_t {
- kHWOptional,
- kHWOptionalArmFEAT
-};
-
-struct AppleFeatureMapping {
- AppleFeatureType type;
- char name[18];
- uint8_t featureId;
-};
-
-template<typename T>
-static inline bool appleSysctlByName(const char* sysctlName, T* dst, size_t size = sizeof(T)) noexcept {
- return sysctlbyname(sysctlName, dst, &size, nullptr, 0) == 0;
-}
-
-static ASMJIT_FAVOR_SIZE long appleDetectARMFeatureViaSysctl(AppleFeatureType type, const char* featureName) noexcept {
- static const char hwOptionalPrefix[] = "hw.optional.";
- static const char hwOptionalArmFeatPrefix[] = "hw.optional.arm.FEAT_";
-
- char sysctlName[128];
-
- const char* prefix = type == AppleFeatureType::kHWOptional ? hwOptionalPrefix : hwOptionalArmFeatPrefix;
- size_t prefixSize = (type == AppleFeatureType::kHWOptional ? sizeof(hwOptionalPrefix) : sizeof(hwOptionalArmFeatPrefix)) - 1u;
- size_t featureNameSize = strlen(featureName);
-
- if (featureNameSize < 128 - prefixSize) {
- memcpy(sysctlName, prefix, prefixSize);
- memcpy(sysctlName + prefixSize, featureName, featureNameSize + 1u); // Include NULL terminator.
-
- long val = 0;
- if (appleSysctlByName<long>(sysctlName, &val))
- return val;
- }
-
- return 0;
-}
-
-static ASMJIT_FAVOR_SIZE void appleDetectARMFeaturesViaSysctl(CpuInfo& cpu) noexcept {
- typedef AppleFeatureType FT;
-
- // Based on:
- // - https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
- static const AppleFeatureMapping mappings[] = {
- // Determine Advanced SIMD and Floating Point Capabilities:
- { FT::kHWOptional , "AdvSIMD_HPFPCvt", uint8_t(Ext::kFP16CONV) },
- { FT::kHWOptional , "neon_hpfp" , uint8_t(Ext::kFP16CONV) },
- { FT::kHWOptionalArmFEAT, "BF16" , uint8_t(Ext::kBF16) },
- { FT::kHWOptionalArmFEAT, "DotProd" , uint8_t(Ext::kDOTPROD) },
- { FT::kHWOptionalArmFEAT, "FCMA" , uint8_t(Ext::kFCMA) },
- { FT::kHWOptional , "armv8_3_compnum", uint8_t(Ext::kFCMA) },
- { FT::kHWOptionalArmFEAT, "FHM" , uint8_t(Ext::kFHM) },
- { FT::kHWOptional , "armv8_2_fhm" , uint8_t(Ext::kFHM) },
- { FT::kHWOptionalArmFEAT, "FP16" , uint8_t(Ext::kFP16) },
- { FT::kHWOptional , "neon_fp16" , uint8_t(Ext::kFP16) },
- { FT::kHWOptionalArmFEAT, "FRINTTS" , uint8_t(Ext::kFRINTTS) },
- { FT::kHWOptionalArmFEAT, "I8MM" , uint8_t(Ext::kI8MM) },
- { FT::kHWOptionalArmFEAT, "JSCVT" , uint8_t(Ext::kJSCVT) },
- { FT::kHWOptionalArmFEAT, "RDM" , uint8_t(Ext::kRDM) },
-
- // Determine Integer Capabilities:
- { FT::kHWOptional , "armv8_crc32" , uint8_t(Ext::kCRC32) },
- { FT::kHWOptionalArmFEAT, "FlagM" , uint8_t(Ext::kFLAGM) },
- { FT::kHWOptionalArmFEAT, "FlagM2" , uint8_t(Ext::kFLAGM2) },
-
- // Determine Atomic and Memory Ordering Instruction Capabilities:
- { FT::kHWOptionalArmFEAT, "LRCPC" , uint8_t(Ext::kLRCPC) },
- { FT::kHWOptionalArmFEAT, "LRCPC2" , uint8_t(Ext::kLRCPC2) },
- { FT::kHWOptional , "armv8_1_atomics", uint8_t(Ext::kLSE) },
- { FT::kHWOptionalArmFEAT, "LSE" , uint8_t(Ext::kLSE) },
- { FT::kHWOptionalArmFEAT, "LSE2" , uint8_t(Ext::kLSE2) },
-
- // Determine Encryption Capabilities:
- { FT::kHWOptionalArmFEAT, "AES" , uint8_t(Ext::kAES) },
- { FT::kHWOptionalArmFEAT, "PMULL" , uint8_t(Ext::kPMULL) },
- { FT::kHWOptionalArmFEAT, "SHA1" , uint8_t(Ext::kSHA1) },
- { FT::kHWOptionalArmFEAT, "SHA256" , uint8_t(Ext::kSHA256) },
- { FT::kHWOptionalArmFEAT, "SHA512" , uint8_t(Ext::kSHA512) },
- { FT::kHWOptional , "armv8_2_sha512" , uint8_t(Ext::kSHA512) },
- { FT::kHWOptionalArmFEAT, "SHA3" , uint8_t(Ext::kSHA3) },
- { FT::kHWOptional , "armv8_2_sha3" , uint8_t(Ext::kSHA3) },
-
- // Determine General Capabilities:
- { FT::kHWOptionalArmFEAT, "BTI" , uint8_t(Ext::kBTI) },
- { FT::kHWOptionalArmFEAT, "DPB" , uint8_t(Ext::kDPB) },
- { FT::kHWOptionalArmFEAT, "DPB2" , uint8_t(Ext::kDPB2) },
- { FT::kHWOptionalArmFEAT, "ECV" , uint8_t(Ext::kECV) },
- { FT::kHWOptionalArmFEAT, "SB" , uint8_t(Ext::kSB) },
- { FT::kHWOptionalArmFEAT, "SSBS" , uint8_t(Ext::kSSBS) }
- };
-
- for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(mappings); i++) {
- const AppleFeatureMapping& mapping = mappings[i];
- if (!cpu.features().arm().has(mapping.featureId) && appleDetectARMFeatureViaSysctl(mapping.type, mapping.name)) {
- cpu.features().arm().add(mapping.featureId);
- }
- }
-}
-
-static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
- cpu._wasDetected = true;
- populateBaseARMFeatures(cpu);
-
- appleSysctlByName<uint32_t>("hw.cpufamily", &cpu._familyId);
- appleSysctlByName<uint32_t>("hw.cachelinesize", &cpu._cacheLineSize);
- appleSysctlByName<uint32_t>("machdep.cpu.logical_per_package", &cpu._maxLogicalProcessors);
- appleSysctlByName<char>("machdep.cpu.brand_string", cpu._brand.str, sizeof(cpu._brand.str));
-
- memcpy(cpu._vendor.str, "APPLE", 6);
-
- bool cpuFeaturesPopulated = detectARMFeaturesViaAppleFamilyId(cpu);
- if (!cpuFeaturesPopulated)
- appleDetectARMFeaturesViaSysctl(cpu);
- postProcessARMCpuInfo(cpu);
-}
-
-// CpuInfo - Detect - ARM - Detect by Fallback (Using Compiler Flags)
-// ==================================================================
-
-#else
-
-#if ASMJIT_ARCH_ARM == 32
- #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch32 CPU)")
-#else
- #pragma message("[asmjit] Disabling runtime CPU detection - unsupported OS/CPU combination (Unknown OS with AArch64 CPU)")
-#endif
-
-static ASMJIT_FAVOR_SIZE void detectARMCpu(CpuInfo& cpu) noexcept {
- populateBaseARMFeatures(cpu);
- detectARMFeaturesViaCompilerFlags(cpu);
- postProcessARMCpuInfo(cpu);
-}
-#endif
-
-} // {arm}
-
-#endif
-
-// CpuInfo - Detect - Host
-// =======================
-
-const CpuInfo& CpuInfo::host() noexcept {
- static std::atomic<uint32_t> cpuInfoInitialized;
- static CpuInfo cpuInfoGlobal(Globals::NoInit);
-
- // This should never cause a problem as the resulting information should always
- // be the same. In the worst case it would just be overwritten non-atomically.
- if (!cpuInfoInitialized.load(std::memory_order_relaxed)) {
- CpuInfo cpuInfoLocal;
-
- cpuInfoLocal._arch = Arch::kHost;
- cpuInfoLocal._subArch = SubArch::kHost;
-
-#if ASMJIT_ARCH_X86
- x86::detectX86Cpu(cpuInfoLocal);
-#elif ASMJIT_ARCH_ARM
- arm::detectARMCpu(cpuInfoLocal);
-#endif
-
- cpuInfoLocal._hwThreadCount = detectHWThreadCount();
- cpuInfoGlobal = cpuInfoLocal;
- cpuInfoInitialized.store(1, std::memory_order_seq_cst);
- }
-
- return cpuInfoGlobal;
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/cpuinfo.h b/3rdparty/asmjit/src/asmjit/core/cpuinfo.h
deleted file mode 100644
index 2638146a4cc..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/cpuinfo.h
+++ /dev/null
@@ -1,1224 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_CPUINFO_H_INCLUDED
-#define ASMJIT_CORE_CPUINFO_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/environment.h"
-#include "../core/globals.h"
-#include "../core/string.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! CPU features information.
-//!
-//! Each feature is represented by a single bit in an embedded bit array.
-class CpuFeatures {
-public:
- //! \name Constants
- //! \{
-
- //! \cond INTERNAL
- enum : uint32_t {
- kMaxFeatures = 256,
- kNumBitWords = kMaxFeatures / Support::kBitWordSizeInBits
- };
- //! \endcond
-
- //! A word that is used to represents feature bits.
- typedef Support::BitWord BitWord;
- //! Iterator that can iterate all CPU features set.
- typedef Support::BitVectorIterator<BitWord> Iterator;
-
- typedef Support::Array<BitWord, kNumBitWords> Bits;
-
- //! \}
-
- //! \name Data
- //! \{
-
- //! CPU features data.
- struct Data {
- //! \name Members
- //! \{
-
- //! Data bits.
- Bits _bits;
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool operator==(const Data& other) const noexcept { return equals(other); }
- ASMJIT_INLINE_NODEBUG bool operator!=(const Data& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns true if there are no features set.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _bits.aggregate<Support::Or>(0) == 0; }
-
- //! Returns all features as array of bitwords (see \ref Support::BitWord).
- ASMJIT_INLINE_NODEBUG BitWord* bits() noexcept { return _bits.data(); }
- //! Returns all features as array of bitwords (const).
- ASMJIT_INLINE_NODEBUG const BitWord* bits() const noexcept { return _bits.data(); }
-
- //! Returns the number of BitWords returned by \ref bits().
- ASMJIT_INLINE_NODEBUG size_t bitWordCount() const noexcept { return kNumBitWords; }
-
- //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently.
- ASMJIT_INLINE_NODEBUG Iterator iterator() const noexcept { return Iterator(_bits.data(), kNumBitWords); }
-
- //! Tests whether the feature `featureId` is present.
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG bool has(const FeatureId& featureId) const noexcept {
- ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
-
- uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
- uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
-
- return bool((_bits[idx] >> bit) & 0x1);
- }
-
- //! \cond NONE
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG bool hasAny(const FeatureId& featureId) const noexcept {
- return has(featureId);
- }
- //! \endcond
-
- //! Tests whether any feature given is present.
- //!
- //! \note This is a variadic function template that can be used with multiple features.
- template<typename FeatureId, typename... Args>
- ASMJIT_INLINE_NODEBUG bool hasAny(const FeatureId& featureId, Args&&... otherFeatureIds) const noexcept {
- return bool(unsigned(has(featureId)) | unsigned(hasAny(std::forward<Args>(otherFeatureIds)...)));
- }
-
- //! Tests whether all features as defined by `other` are present.
- ASMJIT_INLINE_NODEBUG bool hasAll(const Data& other) const noexcept {
- uint32_t result = 1;
- for (uint32_t i = 0; i < kNumBitWords; i++)
- result &= uint32_t((_bits[i] & other._bits[i]) == other._bits[i]);
- return bool(result);
- }
-
- //! \}
-
- //! \name Manipulation
- //! \{
-
- //! Clears all features set.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _bits.fill(0); }
-
- //! Adds the given CPU `featureId` to the list of features.
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG void add(const FeatureId& featureId) noexcept {
- ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
-
- uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
- uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
-
- _bits[idx] |= BitWord(1) << bit;
- }
-
- template<typename FeatureId, typename... Args>
- ASMJIT_INLINE_NODEBUG void add(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept {
- add(featureId);
- add(std::forward<Args>(otherFeatureIds)...);
- }
-
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG void addIf(bool condition, const FeatureId& featureId) noexcept {
- ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
-
- uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
- uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
-
- _bits[idx] |= BitWord(condition) << bit;
- }
-
- template<typename FeatureId, typename... Args>
- ASMJIT_INLINE_NODEBUG void addIf(bool condition, const FeatureId& featureId, Args&&... otherFeatureIds) noexcept {
- addIf(condition, featureId);
- addIf(condition, std::forward<Args>(otherFeatureIds)...);
- }
-
- //! Removes the given CPU `featureId` from the list of features.
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG void remove(const FeatureId& featureId) noexcept {
- ASMJIT_ASSERT(uint32_t(featureId) < kMaxFeatures);
-
- uint32_t idx = uint32_t(featureId) / Support::kBitWordSizeInBits;
- uint32_t bit = uint32_t(featureId) % Support::kBitWordSizeInBits;
-
- _bits[idx] &= ~(BitWord(1) << bit);
- }
-
- template<typename FeatureId, typename... Args>
- ASMJIT_INLINE_NODEBUG void remove(const FeatureId& featureId, Args&&... otherFeatureIds) noexcept {
- remove(featureId);
- remove(std::forward<Args>(otherFeatureIds)...);
- }
-
- //! Tests whether this CPU features data matches `other`.
- ASMJIT_INLINE_NODEBUG bool equals(const Data& other) const noexcept { return _bits == other._bits; }
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ASMJIT_DEPRECATED("Use CpuFeatures::Data::equals() instead")
- ASMJIT_INLINE_NODEBUG bool eq(const Data& other) const noexcept { return equals(other); }
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! \}
- };
-
- //! X86 specific features data.
- struct X86 : public Data {
- //! X86 CPU feature identifiers.
- enum Id : uint8_t {
- // @EnumValuesBegin{"enum": "CpuFeatures::X86"}@
- kNone, //!< No feature (never set, used internally).
-
- kMT, //!< CPU has multi-threading capabilities.
- kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
- k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) {AMD} (deprecated).
- k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) {AMD} (deprecated).
- kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
- kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
- kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) {AMD}.
- kAMX_BF16, //!< CPU has AMX_BF16 (AMX-BF16 instructions).
- kAMX_COMPLEX, //!< CPU has AMX_COMPLEX (AMX-COMPLEX instructions).
- kAMX_FP16, //!< CPU has AMX_FP16 (AMX-FP16 instructions).
- kAMX_INT8, //!< CPU has AMX_INT8 (AMX-INT8 instructions).
- kAMX_TILE, //!< CPU has AMX_TILE (advanced matrix extensions).
- kAPX_F, //!< CPU has APX_F (advanced performance extensions - 32 GP registers, REX2 prefix, ...) {X86_64}.
- kAVX, //!< CPU has AVX (advanced vector extensions).
- kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
- kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single).
- kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision).
- kAVX512_BF16, //!< CPU has AVX512_BF16 (AVX512 BFLOAT16 support instructions).
- kAVX512_BITALG, //!< CPU has AVX512_BITALG (AVX512 VPOPCNT[B|W] and VPSHUFBITQMB instructions).
- kAVX512_BW, //!< CPU has AVX512_BW (AVX512 integer BYTE|WORD instructions).
- kAVX512_CD, //!< CPU has AVX512_CD (AVX512 conflict detection DWORD|QWORD instructions).
- kAVX512_DQ, //!< CPU has AVX512_DQ (AVX512 integer DWORD|QWORD instructions).
- kAVX512_ER, //!< CPU has AVX512_ER (AVX512 exponential and reciprocal instructions).
- kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
- kAVX512_FP16, //!< CPU has AVX512_FP16 (AVX512 FP16 instructions).
- kAVX512_IFMA, //!< CPU has AVX512_IFMA (AVX512 integer fused-multiply-add using 52-bit precision).
- kAVX512_PF, //!< CPU has AVX512_PF (AVX512 prefetch instructions).
- kAVX512_VBMI, //!< CPU has AVX512_VBMI (AVX152 vector byte manipulation instructions).
- kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (AVX512 vector byte manipulation instructions v2).
- kAVX512_VL, //!< CPU has AVX512_VL (AVX512 vector length extensions).
- kAVX512_VNNI, //!< CPU has AVX512_VNNI (AVX512 vector neural network instructions).
- kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
- kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (AVX512 VPOPCNT[D|Q] instructions).
- kAVX_IFMA, //!< CPU has AVX_IFMA (AVX/VEX encoding of vpmadd52huq/vpmadd52luq).
- kAVX_NE_CONVERT, //!< CPU has AVX_NE_CONVERT.
- kAVX_VNNI, //!< CPU has AVX_VNNI (AVX/VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds).
- kAVX_VNNI_INT16, //!< CPU has AVX_VNNI_INT16.
- kAVX_VNNI_INT8, //!< CPU has AVX_VNNI_INT8.
- kBMI, //!< CPU has BMI (bit manipulation instructions #1).
- kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
- kCET_IBT, //!< CPU has CET-IBT (indirect branch tracking).
- kCET_SS, //!< CPU has CET-SS.
- kCET_SSS, //!< CPU has CET-SSS.
- kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
- kCLFLUSH, //!< CPU has CLFUSH (cache Line flush).
- kCLFLUSHOPT, //!< CPU has CLFUSHOPT (cache Line flush - optimized).
- kCLWB, //!< CPU has CLWB.
- kCLZERO, //!< CPU has CLZERO.
- kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
- kCMPCCXADD, //!< CPU has CMPCCXADD.
- kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) {X86_64}.
- kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
- kENCLV, //!< CPU has ENCLV.
- kENQCMD, //!< CPU has ENQCMD (enqueue stores).
- kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
- kF16C, //!< CPU has F16C (AVX FP16 conversion instructions).
- kFMA, //!< CPU has FMA (AVX fused-multiply-add - 3 operand form).
- kFMA4, //!< CPU has FMA4 (AVX fused-multiply-add - 4 operand form) (deprecated).
- kFPU, //!< CPU has FPU (FPU support).
- kFSGSBASE, //!< CPU has FSGSBASE.
- kFSRM, //!< CPU has FSRM (fast short REP MOVSB).
- kFSRC, //!< CPU has FSRC (fast short REP CMPSB|SCASB).
- kFSRS, //!< CPU has FSRS (fast short REP STOSB)
- kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
- kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
- kFZRM, //!< CPU has FZRM (fast zero-length REP MOVSB).
- kGEODE, //!< CPU has GEODE extensions (GEODE 3DNOW additions) (deprecated).
- kGFNI, //!< CPU has GFNI (galois field instructions).
- kHLE, //!< CPU has HLE.
- kHRESET, //!< CPU has HRESET.
- kI486, //!< CPU has I486 features (I486+ support).
- kINVLPGB, //!< CPU has INVLPGB.
- kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) {X86_64}.
- kLAM, //!< CPU has LAM (linear address masking) {X86_64}.
- kLWP, //!< CPU has LWP (lightweight profiling) {AMD}.
- kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
- kMCOMMIT, //!< CPU has MCOMMIT (MCOMMIT instruction).
- kMMX, //!< CPU has MMX (MMX base instructions) (deprecated).
- kMMX2, //!< CPU has MMX2 (MMX2 extensions or initial SSE extensions) (deprecated).
- kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
- kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
- kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
- kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
- kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
- kMPX, //!< CPU has MPX (memory protection extensions).
- kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
- kMSRLIST, //!< CPU has MSRLIST.
- kMSSE, //!< CPU has MSSE (misaligned SSE support).
- kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
- kOSPKE, //!< CPU has OSPKE (PKE enabled by OS).
- kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
- kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
- kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
- kPREFETCHI, //!< CPU has PREFETCHI.
- kPREFETCHW, //!< CPU has PREFETCHW.
- kPREFETCHWT1, //!< CPU has PREFETCHWT1.
- kPTWRITE, //!< CPU has PTWRITE.
- kRAO_INT, //!< CPU has RAO_INT (AADD, AAND, AOR, AXOR instructions).
- kRMPQUERY, //!< CPU has RMPQUERY (RMPQUERY instruction).
- kRDPID, //!< CPU has RDPID (RDPID instruction).
- kRDPRU, //!< CPU has RDPRU (RDPRU instruction).
- kRDRAND, //!< CPU has RDRAND (RDRAND instruction).
- kRDSEED, //!< CPU has RDSEED (RDSEED instruction).
- kRDTSC, //!< CPU has RDTSC.
- kRDTSCP, //!< CPU has RDTSCP.
- kRTM, //!< CPU has RTM.
- kSEAM, //!< CPU has SEAM.
- kSERIALIZE, //!< CPU has SERIALIZE.
- kSEV, //!< CPU has SEV (secure encrypted virtualization).
- kSEV_ES, //!< CPU has SEV_ES (SEV encrypted state).
- kSEV_SNP, //!< CPU has SEV_SNP (SEV secure nested paging).
- kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
- kSHA512, //!< CPU has SHA512 (SHA-512 instructions).
- kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) {AMD}.
- kSM3, //!< CPU has SM3 (SM3 hash extensions).
- kSM4, //!< CPU has SM4 (SM4 cipher extensions).
- kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
- kSME , //!< CPU has SME (secure memory encryption).
- kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
- kSMX, //!< CPU has SMX (safer mode extensions).
- kSSE, //!< CPU has SSE (SSE instructions).
- kSSE2, //!< CPU has SSE2 (SSE2 instructions).
- kSSE3, //!< CPU has SSE3 (SSE3 instructions).
- kSSE4_1, //!< CPU has SSE4.1 (SSE4.1 instructions).
- kSSE4_2, //!< CPU has SSE4.2 (SSE4.2 instructions).
- kSSE4A, //!< CPU has SSE4A (SSE4.A instructions) {AMD} (deprecated).
- kSSSE3, //!< CPU has SSSE3 (SSSE3 instructions).
- kSVM, //!< CPU has SVM (virtualization) {AMD}.
- kTBM, //!< CPU has TBM (trailing bit manipulation) {AMD}.
- kTSE, //!< CPU has TSE.
- kTSX, //!< CPU has TSX.
- kTSXLDTRK, //!< CPU has TSXLDTRK.
- kUINTR, //!< CPU has UINTR (user interrupts).
- kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
- kVMX, //!< CPU has VMX (virtualization) {INTEL}.
- kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
- kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
- kWBNOINVD, //!< CPU has WBNOINVD.
- kWRMSRNS, //!< CPU has WRMSRNS.
- kXOP, //!< CPU has XOP (XOP instructions) {AMD} (deprecated).
- kXSAVE, //!< CPU has XSAVE.
- kXSAVEC, //!< CPU has XSAVEC.
- kXSAVEOPT, //!< CPU has XSAVEOPT.
- kXSAVES, //!< CPU has XSAVES.
- // @EnumValuesEnd@
-
-#ifndef ASMJIT_NO_DEPRECATED
- kAVX512_CDI = kAVX512_CD,
- kAVX512_ERI = kAVX512_ER,
- kAVX512_PFI = kAVX512_PF,
-#endif
-
- kMaxValue = kXSAVES
- };
-
- #define ASMJIT_X86_FEATURE(FEATURE) \
- /*! Tests whether FEATURE is present. */ \
- ASMJIT_INLINE_NODEBUG bool has##FEATURE() const noexcept { return has(X86::k##FEATURE); }
-
- ASMJIT_X86_FEATURE(MT)
- ASMJIT_X86_FEATURE(NX)
- ASMJIT_X86_FEATURE(3DNOW)
- ASMJIT_X86_FEATURE(3DNOW2)
- ASMJIT_X86_FEATURE(ADX)
- ASMJIT_X86_FEATURE(AESNI)
- ASMJIT_X86_FEATURE(ALTMOVCR8)
- ASMJIT_X86_FEATURE(AMX_BF16)
- ASMJIT_X86_FEATURE(AMX_COMPLEX)
- ASMJIT_X86_FEATURE(AMX_FP16)
- ASMJIT_X86_FEATURE(AMX_INT8)
- ASMJIT_X86_FEATURE(AMX_TILE)
- ASMJIT_X86_FEATURE(APX_F)
- ASMJIT_X86_FEATURE(AVX)
- ASMJIT_X86_FEATURE(AVX2)
- ASMJIT_X86_FEATURE(AVX512_4FMAPS)
- ASMJIT_X86_FEATURE(AVX512_4VNNIW)
- ASMJIT_X86_FEATURE(AVX512_BF16)
- ASMJIT_X86_FEATURE(AVX512_BITALG)
- ASMJIT_X86_FEATURE(AVX512_BW)
- ASMJIT_X86_FEATURE(AVX512_CD)
- ASMJIT_X86_FEATURE(AVX512_DQ)
- ASMJIT_X86_FEATURE(AVX512_ER)
- ASMJIT_X86_FEATURE(AVX512_F)
- ASMJIT_X86_FEATURE(AVX512_FP16)
- ASMJIT_X86_FEATURE(AVX512_IFMA)
- ASMJIT_X86_FEATURE(AVX512_PF)
- ASMJIT_X86_FEATURE(AVX512_VBMI)
- ASMJIT_X86_FEATURE(AVX512_VBMI2)
- ASMJIT_X86_FEATURE(AVX512_VL)
- ASMJIT_X86_FEATURE(AVX512_VNNI)
- ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT)
- ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ)
- ASMJIT_X86_FEATURE(AVX_IFMA)
- ASMJIT_X86_FEATURE(AVX_NE_CONVERT)
- ASMJIT_X86_FEATURE(AVX_VNNI)
- ASMJIT_X86_FEATURE(AVX_VNNI_INT16)
- ASMJIT_X86_FEATURE(AVX_VNNI_INT8)
- ASMJIT_X86_FEATURE(BMI)
- ASMJIT_X86_FEATURE(BMI2)
- ASMJIT_X86_FEATURE(CET_IBT)
- ASMJIT_X86_FEATURE(CET_SS)
- ASMJIT_X86_FEATURE(CET_SSS)
- ASMJIT_X86_FEATURE(CLDEMOTE)
- ASMJIT_X86_FEATURE(CLFLUSH)
- ASMJIT_X86_FEATURE(CLFLUSHOPT)
- ASMJIT_X86_FEATURE(CLWB)
- ASMJIT_X86_FEATURE(CLZERO)
- ASMJIT_X86_FEATURE(CMOV)
- ASMJIT_X86_FEATURE(CMPXCHG16B)
- ASMJIT_X86_FEATURE(CMPXCHG8B)
- ASMJIT_X86_FEATURE(ENCLV)
- ASMJIT_X86_FEATURE(ENQCMD)
- ASMJIT_X86_FEATURE(ERMS)
- ASMJIT_X86_FEATURE(F16C)
- ASMJIT_X86_FEATURE(FMA)
- ASMJIT_X86_FEATURE(FMA4)
- ASMJIT_X86_FEATURE(FPU)
- ASMJIT_X86_FEATURE(FSGSBASE)
- ASMJIT_X86_FEATURE(FSRM)
- ASMJIT_X86_FEATURE(FSRC)
- ASMJIT_X86_FEATURE(FSRS)
- ASMJIT_X86_FEATURE(FXSR)
- ASMJIT_X86_FEATURE(FXSROPT)
- ASMJIT_X86_FEATURE(FZRM)
- ASMJIT_X86_FEATURE(GEODE)
- ASMJIT_X86_FEATURE(GFNI)
- ASMJIT_X86_FEATURE(HLE)
- ASMJIT_X86_FEATURE(HRESET)
- ASMJIT_X86_FEATURE(I486)
- ASMJIT_X86_FEATURE(INVLPGB)
- ASMJIT_X86_FEATURE(LAHFSAHF)
- ASMJIT_X86_FEATURE(LAM)
- ASMJIT_X86_FEATURE(LWP)
- ASMJIT_X86_FEATURE(LZCNT)
- ASMJIT_X86_FEATURE(MCOMMIT)
- ASMJIT_X86_FEATURE(MMX)
- ASMJIT_X86_FEATURE(MMX2)
- ASMJIT_X86_FEATURE(MONITOR)
- ASMJIT_X86_FEATURE(MONITORX)
- ASMJIT_X86_FEATURE(MOVBE)
- ASMJIT_X86_FEATURE(MOVDIR64B)
- ASMJIT_X86_FEATURE(MOVDIRI)
- ASMJIT_X86_FEATURE(MPX)
- ASMJIT_X86_FEATURE(MSR)
- ASMJIT_X86_FEATURE(MSRLIST)
- ASMJIT_X86_FEATURE(MSSE)
- ASMJIT_X86_FEATURE(OSXSAVE)
- ASMJIT_X86_FEATURE(OSPKE)
- ASMJIT_X86_FEATURE(PCLMULQDQ)
- ASMJIT_X86_FEATURE(PCONFIG)
- ASMJIT_X86_FEATURE(POPCNT)
- ASMJIT_X86_FEATURE(PREFETCHI)
- ASMJIT_X86_FEATURE(PREFETCHW)
- ASMJIT_X86_FEATURE(PREFETCHWT1)
- ASMJIT_X86_FEATURE(PTWRITE)
- ASMJIT_X86_FEATURE(RAO_INT)
- ASMJIT_X86_FEATURE(RMPQUERY)
- ASMJIT_X86_FEATURE(RDPID)
- ASMJIT_X86_FEATURE(RDPRU)
- ASMJIT_X86_FEATURE(RDRAND)
- ASMJIT_X86_FEATURE(RDSEED)
- ASMJIT_X86_FEATURE(RDTSC)
- ASMJIT_X86_FEATURE(RDTSCP)
- ASMJIT_X86_FEATURE(RTM)
- ASMJIT_X86_FEATURE(SEAM)
- ASMJIT_X86_FEATURE(SERIALIZE)
- ASMJIT_X86_FEATURE(SEV)
- ASMJIT_X86_FEATURE(SEV_ES)
- ASMJIT_X86_FEATURE(SEV_SNP)
- ASMJIT_X86_FEATURE(SHA)
- ASMJIT_X86_FEATURE(SKINIT)
- ASMJIT_X86_FEATURE(SMAP)
- ASMJIT_X86_FEATURE(SMEP)
- ASMJIT_X86_FEATURE(SMX)
- ASMJIT_X86_FEATURE(SSE)
- ASMJIT_X86_FEATURE(SSE2)
- ASMJIT_X86_FEATURE(SSE3)
- ASMJIT_X86_FEATURE(SSE4_1)
- ASMJIT_X86_FEATURE(SSE4_2)
- ASMJIT_X86_FEATURE(SSE4A)
- ASMJIT_X86_FEATURE(SSSE3)
- ASMJIT_X86_FEATURE(SVM)
- ASMJIT_X86_FEATURE(TBM)
- ASMJIT_X86_FEATURE(TSE)
- ASMJIT_X86_FEATURE(TSX)
- ASMJIT_X86_FEATURE(TSXLDTRK)
- ASMJIT_X86_FEATURE(UINTR)
- ASMJIT_X86_FEATURE(VAES)
- ASMJIT_X86_FEATURE(VMX)
- ASMJIT_X86_FEATURE(VPCLMULQDQ)
- ASMJIT_X86_FEATURE(WAITPKG)
- ASMJIT_X86_FEATURE(WBNOINVD)
- ASMJIT_X86_FEATURE(WRMSRNS)
- ASMJIT_X86_FEATURE(XOP)
- ASMJIT_X86_FEATURE(XSAVE)
- ASMJIT_X86_FEATURE(XSAVEC)
- ASMJIT_X86_FEATURE(XSAVEOPT)
- ASMJIT_X86_FEATURE(XSAVES)
-
-#ifndef ASMJIT_NO_DEPRECATED
- ASMJIT_DEPRECATED("Use hasAVX512_CD() instead")
- ASMJIT_X86_FEATURE(AVX512_CDI)
-
- ASMJIT_DEPRECATED("Use hasAVX512_ER() instead")
- ASMJIT_X86_FEATURE(AVX512_ERI)
-
- ASMJIT_DEPRECATED("Use hasAVX512_PF() instead")
- ASMJIT_X86_FEATURE(AVX512_PFI)
-#endif
-
- #undef ASMJIT_X86_FEATURE
- };
-
- //! ARM specific features data.
- //!
- //! Naming reference:
- //! - https://developer.arm.com/downloads/-/exploration-tools/feature-names-for-a-profile
- struct ARM : public Data {
- //! ARM CPU feature identifiers.
- enum Id : uint8_t {
- // @EnumValuesBegin{"enum": "CpuFeatures::ARM"}@
- kNone = 0, //!< No feature (never set, used internally).
-
- kARMv6, //!< CPU is at least ARMv6 {A32}.
- kARMv7, //!< CPU is at least ARMv7 {A32}.
- kARMv8a, //!< CPU is at least ARMv8A.
- kTHUMB, //!< CPU has THUMB (16-bit THUMB encoding) {A32}.
- kTHUMBv2, //!< CPU has THUMBv2 (32-bit THUMB encoding) {A32}.
-
- kABLE, //!< CPU has ABLE (address breakpoint linking extension) {A64}.
- kADERR, //!< CPU has ADERR (asynchronous device error exceptions) {A64}.
- kAES, //!< CPU has AES (ASIMD AES instructions).
- kAFP, //!< CPU has AFP (alternate floating-point behavior) {A64}.
- kAIE, //!< CPU has AIE (memory attribute index enhancement) {A64}.
- kAMU1, //!< CPU has AMUv1 (activity monitors extension version 1) {A64}.
- kAMU1_1, //!< CPU has AMUv1p1 (activity monitors extension version 1.1) {A64}.
- kANERR, //!< CPU has ANERR (asynchronous normal error exception) {A64}.
- kASIMD, //!< CPU has ASIMD (NEON on ARM/THUMB).
- kBF16, //!< CPU has BF16 (BFloat16 instructions) {A64}.
- kBRBE, //!< CPU has BRBE (branch record buffer extension) {A64}.
- kBTI, //!< CPU has BTI (branch target identification).
- kBWE, //!< CPU has BWE (breakpoint mismatch and range extension) {A64}.
- kCCIDX, //!< CPU has CCIDX (extend of the CCSIDR number of sets).
- kCHK, //!< CPU has CHK (check feature status - CHKFEAT instruction) {A64}.
- kCLRBHB, //!< CPU has CLRBHB (clear BHB instruction).
- kCMOW, //!< CPU has CMOW (control for cache maintenance permission) {A64}.
- kCONSTPACFIELD, //!< CPU has CONSTPACFIELD (PAC algorithm enhancement) {A64}.
- kCPA, //!< CPU has CPA (instruction-only Checked Pointer Arithmetic) {A64}.
- kCPA2, //!< CPU has CPA2 (checked Pointer Arithmetic) {A64}.
- kCPUID, //!< CPU has CPUID (CPUID registers accessible in user-space).
- kCRC32, //!< CPU has CRC32 (CRC32 instructions).
- kCSSC, //!< CPU has CSSC (common short sequence compression) {A64}.
- kCSV2, //!< CPU has CSV2 (cache speculation variant 2 version 2.1) {A64}.
- kCSV2_3, //!< CPU has CSV2_3 (cache speculation variant 2 version 3) {A64}.
- kCSV3, //!< CPU has CSV3 (cache speculation Variant 3) {A64}.
- kD128, //!< CPU has D128 (128-bit translation tables, 56 bit PA) {A64}.
- kDGH, //!< CPU has DGH (data gathering hint) {A64}.
- kDIT, //!< CPU has DIT (data independent timing of instructions).
- kDOTPROD, //!< CPU has DOTPROD (ASIMD Int8 dot product instructions).
- kDPB, //!< CPU has DPB (DC CVAP instruction) {A64}.
- kDPB2, //!< CPU has DPB2 (DC CVADP instruction) {A64}.
- kEBEP, //!< CPU has EBEP (exception-based event profiling) {A64}.
- kEBF16, //!< CPU has EBF16 (extended BFloat16 mode) {A64}.
- kECBHB, //!< CPU has ECBHB (exploitative control using branch history information) {A64}.
- kECV, //!< CPU has ECV (enhanced counter virtualization).
- kEDHSR, //!< CPU has EDHSR (support for EDHSR) {A64}.
- kEDSP, //!< CPU has EDSP (ARM/THUMB only).
- kFAMINMAX, //!< CPU has FAMINMAX (floating-point maximum and minimum absolute value instructions) {A64}.
- kFCMA, //!< CPU has FCMA (FCADD/FCMLA).
- kFGT, //!< CPU has FGT (fine-grained traps).
- kFGT2, //!< CPU has FGT2 (fine-grained traps 2).
- kFHM, //!< CPU has FHM (half-precision floating-point FMLAL instructions).
- kFLAGM, //!< CPU has FLAGM (condition flag manipulation) {A64}.
- kFLAGM2, //!< CPU has FLAGM2 (condition flag manipulation version v2) {A64}.
- kFMAC, //!< CPU has FMAC (ARM/THUMB only).
- kFP, //!< CPU has FP (floating-point) (on 32-bit ARM this means VFPv3).
- kFP16, //!< CPU has FP16 (half-precision floating-point data processing).
- kFP16CONV, //!< CPU has FP16CONV (half-precision float conversion).
- kFP8, //!< CPU has FP8 (FP8 convert instructions) {A64}.
- kFP8DOT2, //!< CPU has FP8DOT2 (FP8 2-way dot product to half-precision instructions) {A64}.
- kFP8DOT4, //!< CPU has FP8DOT4 (FP8 4-way dot product to single-precision instructions) {A64}.
- kFP8FMA, //!< CPU has FP8FMA (FP8 multiply-accumulate to half-precision and single-precision instructions) {A64}.
- kFPMR, //!< CPU has FPMR (floating-point Mode Register) {A64}.
- kFRINTTS, //!< CPU has FRINTTS (FRINT[32|64][X|Z] instructions) {A64}.
- kGCS, //!< CPU has GCS (guarded control stack extension) {A64}.
- kHACDBS, //!< CPU has HACDBS (hardware accelerator for cleaning Dirty state) {A64}.
- kHAFDBS, //!< CPU has HAFDBS (hardware management of the access flag and dirty state) {A64}.
- kHAFT, //!< CPU has HAFT (hardware managed access flag for table descriptors) {A64}.
- kHDBSS, //!< CPU has HDBSS (hardware Dirty state tracking Structure) {A64}.
- kHBC, //!< CPU has HBC (hinted conditional branches) {A64}.
- kHCX, //!< CPU has HCX (support for the HCRX_EL2 register) {A64}.
- kHPDS, //!< CPU has HPDS (hierarchical permission disables in translation tables ) {A64}.
- kHPDS2, //!< CPU has HPDS2 (hierarchical permission disables) {A64}.
- kI8MM, //!< CPU has I8MM (int8 matrix multiplication) {A64}.
- kIDIVA, //!< CPU has IDIV (hardware SDIV and UDIV in ARM mode).
- kIDIVT, //!< CPU has IDIV (hardware SDIV and UDIV in THUMB mode).
- kITE, //!< CPU has ITE (instrumentation extension) {A64}.
- kJSCVT, //!< CPU has JSCVT (JavaScript FJCVTS conversion instruction) {A64}.
- kLOR, //!< CPU has LOR (limited ordering regions extension).
- kLRCPC, //!< CPU has LRCPC (load-acquire RCpc instructions) {A64}.
- kLRCPC2, //!< CPU has LRCPC2 (load-acquire RCpc instructions v2) {A64}.
- kLRCPC3, //!< CPU has LRCPC3 (load-Acquire RCpc instructions v3) {A64}.
- kLS64, //!< CPU has LS64 (64 byte loads/stores without return) {A64}.
- kLS64_ACCDATA, //!< CPU has LS64_ACCDATA (64-byte EL0 stores with return) {A64}.
- kLS64_V, //!< CPU has LS64_V (64-byte stores with return) {A64}.
- kLSE, //!< CPU has LSE (large system extensions) {A64}.
- kLSE128, //!< CPU has LSE128 (128-bit atomics) {A64}.
- kLSE2, //!< CPU has LSE2 (large system extensions v2) {A64}.
- kLUT, //!< CPU has LUT (lookup table instructions with 2-bit and 4-bit indices) {A64}.
- kLVA, //!< CPU has LVA (large VA support) {A64}.
- kLVA3, //!< CPU has LVA3 (56-bit VA) {A64}.
- kMEC, //!< CPU has MEC (memory encryption contexts) {A64}.
- kMOPS, //!< CPU has MOPS (memcpy and memset acceleration instructions) {A64}.
- kMPAM, //!< CPU has MPAM (memory system partitioning and monitoring extension) {A64}.
- kMTE, //!< CPU has MTE (instruction-only memory tagging extension) {A64}.
- kMTE2, //!< CPU has MTE2 (full memory tagging extension) {A64}.
- kMTE3, //!< CPU has MTE3 (MTE asymmetric fault handling) {A64}.
- kMTE4, //!< CPU has MTE4 (MTE v4) {A64}.
- kMTE_ASYM_FAULT, //!< CPU has MTE_ASYM_FAULT (memory tagging asymmetric faults) {A64}.
- kMTE_ASYNC, //!< CPU has MTE_ASYNC (memory tagging asynchronous faulting) {A64}.
- kMTE_CANONICAL_TAGS, //!< CPU has MTE_CANONICAL_TAGS (canonical tag checking for untagged memory) {A64}.
- kMTE_NO_ADDRESS_TAGS, //!< CPU has MTE_NO_ADDRESS_TAGS (memory tagging with address tagging disabled) {A64}.
- kMTE_PERM_S1, //!< CPU has MTE_PERM_S1 (allocation tag access permission) {A64}.
- kMTE_STORE_ONLY, //!< CPU has MTE_STORE_ONLY (store-only tag checking) {A64}.
- kMTE_TAGGED_FAR, //!< CPU has MTE_TAGGED_FAR (FAR_ELx on a tag check fault) {A64}.
- kMTPMU, //!< CPU has MTPMU (multi-threaded PMU extensions) {A64}.
- kNMI, //!< CPU has NMI (non-maskable Interrupt) {A64}.
- kNV, //!< CPU has NV (nested virtualization enchancement) {A64}.
- kNV2, //!< CPU has NV2 (enhanced support for nested virtualization) {A64}.
- kPAN, //!< CPU has PAN (privileged access-never extension) {A64}.
- kPAN2, //!< CPU has PAN2 (PAN s1e1R and s1e1W variants) {A64}.
- kPAN3, //!< CPU has PAN3 (support for SCTLR_ELx.EPAN) {A64}.
- kPAUTH, //!< CPU has PAUTH (pointer authentication extension) {A64}.
- kPFAR, //!< CPU has PFAR (physical fault address registers) {A64}.
- kPMU, //!< CPU has PMU {A64}.
- kPMULL, //!< CPU has PMULL (ASIMD PMULL instructions) {A64}.
- kPRFMSLC, //!< CPU has PRFMSLC (PRFM instructions support the SLC target) {A64}.
- kRAS, //!< CPU has RAS (reliability, availability and serviceability extensions).
- kRAS1_1, //!< CPU has RASv1p1 (RAS v1.1).
- kRAS2, //!< CPU has RASv2 (RAS v2).
- kRASSA2, //!< CPU has RASSAv2 (RAS v2 system architecture).
- kRDM, //!< CPU has RDM (rounding double multiply accumulate) {A64}.
- kRME, //!< CPU has RME (memory encryption contexts extension) {A64}.
- kRNG, //!< CPU has RNG (random number generation).
- kRNG_TRAP, //!< CPU has RNG_TRAP (random number trap to EL3 field) {A64}.
- kRPRES, //!< CPU has RPRES (increased precision of reciprocal estimate and RSQRT estimate) {A64}.
- kRPRFM, //!< CPU has RPRFM (range prefetch hint instruction).
- kS1PIE, //!< CPU has S1PIE (permission model enhancements) {A64}.
- kS1POE, //!< CPU has S1POE (permission model enhancements) {A64}.
- kS2PIE, //!< CPU has S2PIE (permission model enhancements) {A64}.
- kS2POE, //!< CPU has S2POE (permission model enhancements) {A64}.
- kSB, //!< CPU has SB (speculative barrier).
- kSCTLR2, //!< CPU has SCTLR2 (extension to SCTLR_ELx) {A64}.
- kSEBEP, //!< CPU has SEBEP (synchronous exception-based event profiling) {A64}.
- kSEL2, //!< CPU has SEL2 (secure EL2) {A64}.
- kSHA1, //!< CPU has SHA1 (ASIMD SHA1 instructions).
- kSHA256, //!< CPU has SHA256 (ASIMD SHA256 instructions).
- kSHA3, //!< CPU has SHA3 (ASIMD EOR3, RAX1, XAR, and BCAX instructions).
- kSHA512, //!< CPU has SHA512 (ASIMD SHA512 instructions).
- kSM3, //!< CPU has SM3 (ASIMD SM3 instructions).
- kSM4, //!< CPU has SM4 (ASIMD SM4 instructions).
- kSME, //!< CPU has SME (SME v1 - scalable matrix extension) {A64}.
- kSME2, //!< CPU has SME2 (SME v2) {A64}.
- kSME2_1, //!< CPU has SME2p1 (SME v2.1) {A64}.
- kSME_B16B16, //!< CPU has SME_B16B16 (SME non-widening BFloat16 to BFloat16 arithmetic) {A64}.
- kSME_B16F32, //!< CPU has SME_B16F32 (BFMOPA and BFMOPS instructions that accumulate BFloat16 outer products into single-precision tiles) {A64}.
- kSME_BI32I32, //!< CPU has SME_BI32I32 (BMOPA and BMOPS instructions that accumulate 1-bit binary outer products into 32-bit integer tiles) {A64}.
- kSME_F16F16, //!< CPU has SME_F16F16 (SME2.1 non-widening half-precision FP16 to FP16 arithmetic) {A64}.
- kSME_F16F32, //!< CPU has SME_F16F32 {A64}.
- kSME_F32F32, //!< CPU has SME_F32F32 {A64}.
- kSME_F64F64, //!< CPU has SME_F64F64 {A64}.
- kSME_F8F16, //!< CPU has SME_F8F16 (SME2 ZA-targeting FP8 multiply-accumulate, dot product, and outer product to half-precision instructions) {A64}.
- kSME_F8F32, //!< CPU has SME_F8F32 (SME2 ZA-targeting FP8 multiply-accumulate, dot product, and outer product to single-precision instructions) {A64}.
- kSME_FA64, //!< CPU has SME_FA64 {A64}.
- kSME_I16I32, //!< CPU has SME_I16I32 {A64}.
- kSME_I16I64, //!< CPU has SME_I16I64 {A64}.
- kSME_I8I32, //!< CPU has SME_I8I32 {A64}.
- kSME_LUTv2, //!< CPU has SME_LUTv2 (lookup table instructions with 4-bit indices and 8-bit elements) {A64}.
- kSPE, //!< CPU has SPE (statistical profiling extension) {A64}.
- kSPE1_1, //!< CPU has SPEv1p1 (statistical profiling extensions version 1.1) {A64}.
- kSPE1_2, //!< CPU has SPEv1p2 (statistical profiling extensions version 1.2) {A64}.
- kSPE1_3, //!< CPU has SPEv1p3 (statistical profiling extensions version 1.3) {A64}.
- kSPE1_4, //!< CPU has SPEv1p4 (statistical profiling extensions version 1.4) {A64}.
- kSPE_ALTCLK, //!< CPU has SPE_ALTCLK (statistical profiling alternate clock domain extension) {A64}.
- kSPE_CRR, //!< CPU has SPE_CRR (statistical profiling call return branch records) {A64}.
- kSPE_EFT, //!< CPU has SPE_EFT (statistical profiling extended filtering by type) {A64}.
- kSPE_FDS, //!< CPU has SPE_FDS (statistical profiling data source filtering) {A64}.
- kSPE_FPF, //!< CPU has SPE_FPF (statistical profiling floating-point flag extension) {A64}.
- kSPE_SME, //!< CPU has SPE_SME (statistical profiling extensions for SME) {A64}.
- kSPECRES, //!< CPU has SPECRES (speculation restriction instructions).
- kSPECRES2, //!< CPU has SPECRES2 (clear other speculative predictions).
- kSPMU, //!< CPU has SPMU (system performance monitors extension) {A64}.
- kSSBS, //!< CPU has SSBS (speculative store bypass safe instruction).
- kSSBS2, //!< CPU has SSBS2 (MRS and MSR instructions for SSBS).
- kSSVE_FP8DOT2, //!< CPU has SSVE_FP8DOT2 (SVE2 FP8 2-way dot product to half-precision instructions in Streaming SVE mode) {A64}.
- kSSVE_FP8DOT4, //!< CPU has SSVE_FP8DOT4 (SVE2 FP8 4-way dot product to single-precision instructions in Streaming SVE mode) {A64}.
- kSSVE_FP8FMA, //!< CPU has SSVE_FP8FMA (SVE2 FP8 multiply-accumulate to half-precision and single-precision instructions in Streaming SVE mode) {A64}.
- kSVE, //!< CPU has SVE (SVE v1 - scalable vector extension) {A64}.
- kSVE2, //!< CPU has SVE2 (SVE v2) {A64}.
- kSVE2_1, //!< CPU has SVE2p1 (SVE v2.1) {A64}.
- kSVE_AES, //!< CPU has SVE_AES (SVE AES instructions) {A64}.
- kSVE_B16B16, //!< CPU has SVE_B16B16 (SVE non-widening BFloat16 to BFloat16 arithmetic) {A64}.
- kSVE_BF16, //!< CPU has SVE_BF16 (SVE BF16 instructions) {A64}.
- kSVE_BITPERM, //!< CPU has SVE_BITPERM (SVE bit permute) {A64}.
- kSVE_EBF16, //!< CPU has SVE_EBF16 (SVE extended BFloat16 mode) {A64}.
- kSVE_F32MM, //!< CPU has SVE_F32MM (SVE single-precision floating-point matrix multiply instruction) {A64}.
- kSVE_F64MM, //!< CPU has SVE_F64MM (SVE double-precision floating-point matrix multiply instruction) {A64}.
- kSVE_I8MM, //!< CPU has SVE_I8MM (SVE int8 matrix multiplication) {A64}.
- kSVE_PMULL128, //!< CPU has SVE_PMULL128 (SVE PMULL instructions) {A64}.
- kSVE_SHA3, //!< CPU has SVE_SHA3 (SVE SHA-3 instructions) {A64}.
- kSVE_SM4, //!< CPU has SVE_SM4 (SVE SM4 instructions {A64}.
- kSYSINSTR128, //!< CPU has SYSINSTR128 (128-bit system instructions) {A64}.
- kSYSREG128, //!< CPU has SYSREG128 (128-bit system registers) {A64}.
- kTHE, //!< CPU has THE (translation hardening extension).
- kTLBIOS, //!< CPU has TLBIOS (TLBI instructions in Outer Shareable domain) {A64}.
- kTLBIRANGE, //!< CPU has TLBIRANGE (TLBI range instructions) {A64}.
- kTLBIW, //!< CPU has TLBIW (TLBI VMALL for dirty state) {A64}.
- kTME, //!< CPU has TME (transactional memory extensions).
- kTRF, //!< CPU has TRF (self-hosted trace extensions).
- kUAO, //!< CPU has UAO (AArch64 v8.2 UAO PState) {A64}.
- kVFP_D32, //!< CPU has VFP_D32 (32 VFP-D registers) (ARM/THUMB only).
- kVHE, //!< CPU has VHE (virtual host extension).
- kVMID16, //!< CPU has VMID16 (16-bit VMID) {A64}.
- kWFXT, //!< CPU has WFxT (WFE and WFI instructions with timeout) {A64}.
- kXNX, //!< CPU has XNX (translation table stage 2 unprivileged execute-never) {A64}.
- kXS, //!< CPU has XS (XS attribute in TLBI and DSB instructions) {A64}.
- // @EnumValuesEnd@
-
- kMaxValue = kXS
- };
-
- #define ASMJIT_ARM_FEATURE(FEATURE) \
- /*! Tests whether FEATURE is present. */ \
- ASMJIT_INLINE_NODEBUG bool has##FEATURE() const noexcept { return has(ARM::k##FEATURE); }
-
- ASMJIT_ARM_FEATURE(THUMB)
- ASMJIT_ARM_FEATURE(THUMBv2)
-
- ASMJIT_ARM_FEATURE(ARMv6)
- ASMJIT_ARM_FEATURE(ARMv7)
- ASMJIT_ARM_FEATURE(ARMv8a)
-
- ASMJIT_ARM_FEATURE(ABLE)
- ASMJIT_ARM_FEATURE(ADERR)
- ASMJIT_ARM_FEATURE(AES)
- ASMJIT_ARM_FEATURE(AFP)
- ASMJIT_ARM_FEATURE(AIE)
- ASMJIT_ARM_FEATURE(AMU1)
- ASMJIT_ARM_FEATURE(AMU1_1)
- ASMJIT_ARM_FEATURE(ANERR)
- ASMJIT_ARM_FEATURE(ASIMD)
- ASMJIT_ARM_FEATURE(BF16)
- ASMJIT_ARM_FEATURE(BRBE)
- ASMJIT_ARM_FEATURE(BTI)
- ASMJIT_ARM_FEATURE(BWE)
- ASMJIT_ARM_FEATURE(CCIDX)
- ASMJIT_ARM_FEATURE(CHK)
- ASMJIT_ARM_FEATURE(CLRBHB)
- ASMJIT_ARM_FEATURE(CMOW)
- ASMJIT_ARM_FEATURE(CONSTPACFIELD)
- ASMJIT_ARM_FEATURE(CPA)
- ASMJIT_ARM_FEATURE(CPA2)
- ASMJIT_ARM_FEATURE(CPUID)
- ASMJIT_ARM_FEATURE(CRC32)
- ASMJIT_ARM_FEATURE(CSSC)
- ASMJIT_ARM_FEATURE(CSV2)
- ASMJIT_ARM_FEATURE(CSV2_3)
- ASMJIT_ARM_FEATURE(CSV3)
- ASMJIT_ARM_FEATURE(D128)
- ASMJIT_ARM_FEATURE(DGH)
- ASMJIT_ARM_FEATURE(DIT)
- ASMJIT_ARM_FEATURE(DOTPROD)
- ASMJIT_ARM_FEATURE(DPB)
- ASMJIT_ARM_FEATURE(DPB2)
- ASMJIT_ARM_FEATURE(EBEP)
- ASMJIT_ARM_FEATURE(EBF16)
- ASMJIT_ARM_FEATURE(ECBHB)
- ASMJIT_ARM_FEATURE(ECV)
- ASMJIT_ARM_FEATURE(EDHSR)
- ASMJIT_ARM_FEATURE(EDSP)
- ASMJIT_ARM_FEATURE(FAMINMAX)
- ASMJIT_ARM_FEATURE(FCMA)
- ASMJIT_ARM_FEATURE(FGT)
- ASMJIT_ARM_FEATURE(FGT2)
- ASMJIT_ARM_FEATURE(FHM)
- ASMJIT_ARM_FEATURE(FLAGM)
- ASMJIT_ARM_FEATURE(FLAGM2)
- ASMJIT_ARM_FEATURE(FMAC)
- ASMJIT_ARM_FEATURE(FP)
- ASMJIT_ARM_FEATURE(FP16)
- ASMJIT_ARM_FEATURE(FP16CONV)
- ASMJIT_ARM_FEATURE(FP8)
- ASMJIT_ARM_FEATURE(FP8DOT2)
- ASMJIT_ARM_FEATURE(FP8DOT4)
- ASMJIT_ARM_FEATURE(FP8FMA)
- ASMJIT_ARM_FEATURE(FPMR)
- ASMJIT_ARM_FEATURE(FRINTTS)
- ASMJIT_ARM_FEATURE(GCS)
- ASMJIT_ARM_FEATURE(HACDBS)
- ASMJIT_ARM_FEATURE(HAFDBS)
- ASMJIT_ARM_FEATURE(HAFT)
- ASMJIT_ARM_FEATURE(HDBSS)
- ASMJIT_ARM_FEATURE(HBC)
- ASMJIT_ARM_FEATURE(HCX)
- ASMJIT_ARM_FEATURE(HPDS)
- ASMJIT_ARM_FEATURE(HPDS2)
- ASMJIT_ARM_FEATURE(I8MM)
- ASMJIT_ARM_FEATURE(IDIVA)
- ASMJIT_ARM_FEATURE(IDIVT)
- ASMJIT_ARM_FEATURE(ITE)
- ASMJIT_ARM_FEATURE(JSCVT)
- ASMJIT_ARM_FEATURE(LOR)
- ASMJIT_ARM_FEATURE(LRCPC)
- ASMJIT_ARM_FEATURE(LRCPC2)
- ASMJIT_ARM_FEATURE(LRCPC3)
- ASMJIT_ARM_FEATURE(LS64)
- ASMJIT_ARM_FEATURE(LS64_ACCDATA)
- ASMJIT_ARM_FEATURE(LS64_V)
- ASMJIT_ARM_FEATURE(LSE)
- ASMJIT_ARM_FEATURE(LSE128)
- ASMJIT_ARM_FEATURE(LSE2)
- ASMJIT_ARM_FEATURE(LUT)
- ASMJIT_ARM_FEATURE(LVA)
- ASMJIT_ARM_FEATURE(LVA3)
- ASMJIT_ARM_FEATURE(MEC)
- ASMJIT_ARM_FEATURE(MOPS)
- ASMJIT_ARM_FEATURE(MPAM)
- ASMJIT_ARM_FEATURE(MTE)
- ASMJIT_ARM_FEATURE(MTE2)
- ASMJIT_ARM_FEATURE(MTE3)
- ASMJIT_ARM_FEATURE(MTE4)
- ASMJIT_ARM_FEATURE(MTE_ASYM_FAULT)
- ASMJIT_ARM_FEATURE(MTE_ASYNC)
- ASMJIT_ARM_FEATURE(MTE_CANONICAL_TAGS)
- ASMJIT_ARM_FEATURE(MTE_NO_ADDRESS_TAGS)
- ASMJIT_ARM_FEATURE(MTE_PERM_S1)
- ASMJIT_ARM_FEATURE(MTE_STORE_ONLY)
- ASMJIT_ARM_FEATURE(MTE_TAGGED_FAR)
- ASMJIT_ARM_FEATURE(MTPMU)
- ASMJIT_ARM_FEATURE(NMI)
- ASMJIT_ARM_FEATURE(NV)
- ASMJIT_ARM_FEATURE(NV2)
- ASMJIT_ARM_FEATURE(PAN)
- ASMJIT_ARM_FEATURE(PAN2)
- ASMJIT_ARM_FEATURE(PAN3)
- ASMJIT_ARM_FEATURE(PAUTH)
- ASMJIT_ARM_FEATURE(PFAR)
- ASMJIT_ARM_FEATURE(PMU)
- ASMJIT_ARM_FEATURE(PMULL)
- ASMJIT_ARM_FEATURE(PRFMSLC)
- ASMJIT_ARM_FEATURE(RAS)
- ASMJIT_ARM_FEATURE(RAS1_1)
- ASMJIT_ARM_FEATURE(RAS2)
- ASMJIT_ARM_FEATURE(RASSA2)
- ASMJIT_ARM_FEATURE(RDM)
- ASMJIT_ARM_FEATURE(RME)
- ASMJIT_ARM_FEATURE(RNG)
- ASMJIT_ARM_FEATURE(RNG_TRAP)
- ASMJIT_ARM_FEATURE(RPRES)
- ASMJIT_ARM_FEATURE(RPRFM)
- ASMJIT_ARM_FEATURE(S1PIE)
- ASMJIT_ARM_FEATURE(S1POE)
- ASMJIT_ARM_FEATURE(S2PIE)
- ASMJIT_ARM_FEATURE(S2POE)
- ASMJIT_ARM_FEATURE(SB)
- ASMJIT_ARM_FEATURE(SCTLR2)
- ASMJIT_ARM_FEATURE(SEBEP)
- ASMJIT_ARM_FEATURE(SEL2)
- ASMJIT_ARM_FEATURE(SHA1)
- ASMJIT_ARM_FEATURE(SHA256)
- ASMJIT_ARM_FEATURE(SHA3)
- ASMJIT_ARM_FEATURE(SHA512)
- ASMJIT_ARM_FEATURE(SM3)
- ASMJIT_ARM_FEATURE(SM4)
- ASMJIT_ARM_FEATURE(SME)
- ASMJIT_ARM_FEATURE(SME2)
- ASMJIT_ARM_FEATURE(SME2_1)
- ASMJIT_ARM_FEATURE(SME_B16B16)
- ASMJIT_ARM_FEATURE(SME_B16F32)
- ASMJIT_ARM_FEATURE(SME_BI32I32)
- ASMJIT_ARM_FEATURE(SME_F16F16)
- ASMJIT_ARM_FEATURE(SME_F16F32)
- ASMJIT_ARM_FEATURE(SME_F32F32)
- ASMJIT_ARM_FEATURE(SME_F64F64)
- ASMJIT_ARM_FEATURE(SME_F8F16)
- ASMJIT_ARM_FEATURE(SME_F8F32)
- ASMJIT_ARM_FEATURE(SME_FA64)
- ASMJIT_ARM_FEATURE(SME_I16I32)
- ASMJIT_ARM_FEATURE(SME_I16I64)
- ASMJIT_ARM_FEATURE(SME_I8I32)
- ASMJIT_ARM_FEATURE(SME_LUTv2)
- ASMJIT_ARM_FEATURE(SPE)
- ASMJIT_ARM_FEATURE(SPE1_1)
- ASMJIT_ARM_FEATURE(SPE1_2)
- ASMJIT_ARM_FEATURE(SPE1_3)
- ASMJIT_ARM_FEATURE(SPE1_4)
- ASMJIT_ARM_FEATURE(SPE_ALTCLK)
- ASMJIT_ARM_FEATURE(SPE_CRR)
- ASMJIT_ARM_FEATURE(SPE_EFT)
- ASMJIT_ARM_FEATURE(SPE_FDS)
- ASMJIT_ARM_FEATURE(SPE_FPF)
- ASMJIT_ARM_FEATURE(SPE_SME)
- ASMJIT_ARM_FEATURE(SPECRES)
- ASMJIT_ARM_FEATURE(SPECRES2)
- ASMJIT_ARM_FEATURE(SPMU)
- ASMJIT_ARM_FEATURE(SSBS)
- ASMJIT_ARM_FEATURE(SSBS2)
- ASMJIT_ARM_FEATURE(SSVE_FP8DOT2)
- ASMJIT_ARM_FEATURE(SSVE_FP8DOT4)
- ASMJIT_ARM_FEATURE(SSVE_FP8FMA)
- ASMJIT_ARM_FEATURE(SVE)
- ASMJIT_ARM_FEATURE(SVE2)
- ASMJIT_ARM_FEATURE(SVE2_1)
- ASMJIT_ARM_FEATURE(SVE_AES)
- ASMJIT_ARM_FEATURE(SVE_B16B16)
- ASMJIT_ARM_FEATURE(SVE_BF16)
- ASMJIT_ARM_FEATURE(SVE_BITPERM)
- ASMJIT_ARM_FEATURE(SVE_EBF16)
- ASMJIT_ARM_FEATURE(SVE_F32MM)
- ASMJIT_ARM_FEATURE(SVE_F64MM)
- ASMJIT_ARM_FEATURE(SVE_I8MM)
- ASMJIT_ARM_FEATURE(SVE_PMULL128)
- ASMJIT_ARM_FEATURE(SVE_SHA3)
- ASMJIT_ARM_FEATURE(SVE_SM4)
- ASMJIT_ARM_FEATURE(SYSINSTR128)
- ASMJIT_ARM_FEATURE(SYSREG128)
- ASMJIT_ARM_FEATURE(THE)
- ASMJIT_ARM_FEATURE(TLBIOS)
- ASMJIT_ARM_FEATURE(TLBIRANGE)
- ASMJIT_ARM_FEATURE(TLBIW)
- ASMJIT_ARM_FEATURE(TME)
- ASMJIT_ARM_FEATURE(TRF)
- ASMJIT_ARM_FEATURE(UAO)
- ASMJIT_ARM_FEATURE(VFP_D32)
- ASMJIT_ARM_FEATURE(VHE)
- ASMJIT_ARM_FEATURE(VMID16)
- ASMJIT_ARM_FEATURE(WFXT)
- ASMJIT_ARM_FEATURE(XNX)
- ASMJIT_ARM_FEATURE(XS)
-
- #undef ASMJIT_ARM_FEATURE
- };
-
- static_assert(uint32_t(X86::kMaxValue) < kMaxFeatures, "The number of X86 CPU features cannot exceed CpuFeatures::kMaxFeatures");
- static_assert(uint32_t(ARM::kMaxValue) < kMaxFeatures, "The number of ARM CPU features cannot exceed CpuFeatures::kMaxFeatures");
-
- //! \}
-
- //! \name Members
- //! \{
-
- Data _data {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG CpuFeatures() noexcept {}
- ASMJIT_INLINE_NODEBUG CpuFeatures(const CpuFeatures& other) noexcept = default;
- ASMJIT_INLINE_NODEBUG explicit CpuFeatures(const Data& other) noexcept : _data{other._bits} {}
- ASMJIT_INLINE_NODEBUG explicit CpuFeatures(Globals::NoInit_) noexcept {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG CpuFeatures& operator=(const CpuFeatures& other) noexcept = default;
-
- ASMJIT_INLINE_NODEBUG bool operator==(const CpuFeatures& other) const noexcept { return equals(other); }
- ASMJIT_INLINE_NODEBUG bool operator!=(const CpuFeatures& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns true if there are no features set.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _data.empty(); }
-
- //! Casts this base class into a derived type `T`.
- template<typename T = Data>
- ASMJIT_INLINE_NODEBUG T& data() noexcept { return static_cast<T&>(_data); }
-
- //! Casts this base class into a derived type `T` (const).
- template<typename T = Data>
- ASMJIT_INLINE_NODEBUG const T& data() const noexcept { return static_cast<const T&>(_data); }
-
- //! Returns CpuFeatures::Data as \ref CpuFeatures::X86.
- ASMJIT_INLINE_NODEBUG X86& x86() noexcept { return data<X86>(); }
- //! Returns CpuFeatures::Data as \ref CpuFeatures::X86 (const).
- ASMJIT_INLINE_NODEBUG const X86& x86() const noexcept { return data<X86>(); }
-
- //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM.
- ASMJIT_INLINE_NODEBUG ARM& arm() noexcept { return data<ARM>(); }
- //! Returns CpuFeatures::Data as \ref CpuFeatures::ARM (const).
- ASMJIT_INLINE_NODEBUG const ARM& arm() const noexcept { return data<ARM>(); }
-
- //! Returns all features as array of bitwords (see \ref Support::BitWord).
- ASMJIT_INLINE_NODEBUG BitWord* bits() noexcept { return _data.bits(); }
- //! Returns all features as array of bitwords (const).
- ASMJIT_INLINE_NODEBUG const BitWord* bits() const noexcept { return _data.bits(); }
- //! Returns the number of BitWords returned by \ref bits().
- ASMJIT_INLINE_NODEBUG size_t bitWordCount() const noexcept { return _data.bitWordCount(); }
-
- //! Returns \ref Support::BitVectorIterator, that can be used to iterate over all features efficiently.
- ASMJIT_INLINE_NODEBUG Iterator iterator() const noexcept { return _data.iterator(); }
-
- //! Tests whether the feature `featureId` is present.
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG bool has(const FeatureId& featureId) const noexcept { return _data.has(featureId); }
-
- //! Tests whether any of the features is present.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG bool hasAny(Args&&... args) const noexcept { return _data.hasAny(std::forward<Args>(args)...); }
-
- //! Tests whether all features as defined by `other` are present.
- ASMJIT_INLINE_NODEBUG bool hasAll(const CpuFeatures& other) const noexcept { return _data.hasAll(other._data); }
-
- //! \}
-
- //! \name Manipulation
- //! \{
-
- //! Clears all features set.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _data.reset(); }
-
- //! Adds the given CPU `featureId` to the list of features.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG void add(Args&&... args) noexcept { return _data.add(std::forward<Args>(args)...); }
-
- //! Adds the given CPU `featureId` to the list of features if `condition` is true.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG void addIf(bool condition, Args&&... args) noexcept { return _data.addIf(condition, std::forward<Args>(args)...); }
-
- //! Removes the given CPU `featureId` from the list of features.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG void remove(Args&&... args) noexcept { return _data.remove(std::forward<Args>(args)...); }
-
- //! Tests whether this CPU features matches `other`.
- ASMJIT_INLINE_NODEBUG bool equals(const CpuFeatures& other) const noexcept { return _data.equals(other._data); }
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ASMJIT_DEPRECATED("Use CpuFeatures::equals() instead")
- ASMJIT_INLINE_NODEBUG bool eq(const CpuFeatures& other) const noexcept { return equals(other); }
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! \}
-};
-
-//! CPU information.
-class CpuInfo {
-public:
- //! \name Members
- //! \{
-
- //! Architecture.
- Arch _arch {};
- //! Sub-architecture.
- SubArch _subArch {};
- //! True if the CPU was detected, false if the detection failed or it's not available.
- bool _wasDetected {};
- //! Reserved for future use.
- uint8_t _reserved {};
- //! CPU family ID.
- uint32_t _familyId {};
- //! CPU model ID.
- uint32_t _modelId {};
- //! CPU brand ID.
- uint32_t _brandId {};
- //! CPU stepping.
- uint32_t _stepping {};
- //! Processor type.
- uint32_t _processorType {};
- //! Maximum number of addressable IDs for logical processors.
- uint32_t _maxLogicalProcessors {};
- //! Cache line size (in bytes).
- uint32_t _cacheLineSize {};
- //! Number of hardware threads.
- uint32_t _hwThreadCount {};
-
- //! CPU vendor string.
- FixedString<16> _vendor {};
- //! CPU brand string.
- FixedString<64> _brand {};
- //! CPU features.
- CpuFeatures _features {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new CpuInfo instance.
- ASMJIT_INLINE_NODEBUG CpuInfo() noexcept {}
- //! Creates a copy of `other` instance.
- ASMJIT_INLINE_NODEBUG CpuInfo(const CpuInfo& other) noexcept = default;
-
- //! Creates an unitialized `CpuInfo` instance.
- ASMJIT_INLINE_NODEBUG explicit CpuInfo(Globals::NoInit_) noexcept
- : _features(Globals::NoInit) {};
-
- //! \}
-
- //! \name CPU Information Detection
- //! \{
-
- //! Returns the host CPU information.
- //!
- //! \note The returned reference is global - it's setup only once and then shared.
- ASMJIT_API static const CpuInfo& host() noexcept;
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Copy assignment.
- ASMJIT_INLINE_NODEBUG CpuInfo& operator=(const CpuInfo& other) noexcept = default;
-
- //! \}
-
- //! \name Initialization & Reset
- //! \{
-
- //! Initializes CpuInfo architecture and sub-architecture members to `arch` and `subArch`, respectively.
- ASMJIT_INLINE_NODEBUG void initArch(Arch arch, SubArch subArch = SubArch::kUnknown) noexcept {
- _arch = arch;
- _subArch = subArch;
- }
-
- //! Resets this \ref CpuInfo to a default constructed state.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = CpuInfo{}; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the CPU architecture this information relates to.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
-
- //! Returns the CPU sub-architecture this information relates to.
- ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return _subArch; }
-
- //! Returns whether the CPU was detected successfully.
- //!
- //! If the returned value is false it means that AsmJit either failed to detect the CPU or it doesn't have
- //! implementation targeting the host architecture and operating system.
- ASMJIT_INLINE_NODEBUG bool wasDetected() const noexcept { return _wasDetected; }
-
- //! Returns the CPU family ID.
- //!
- //! The information provided depends on architecture and OS:
- //! - X86:
- //! - Family identifier matches the FamilyId read by using CPUID.
- //! - ARM:
- //! - Apple - returns Apple Family identifier returned by sysctlbyname("hw.cpufamily").
- ASMJIT_INLINE_NODEBUG uint32_t familyId() const noexcept { return _familyId; }
-
- //! Returns the CPU model ID.
- //!
- //! The information provided depends on architecture and OS:
- //! - X86:
- //! - Model identifier matches the ModelId read by using CPUID.
- ASMJIT_INLINE_NODEBUG uint32_t modelId() const noexcept { return _modelId; }
-
- //! Returns the CPU brand id.
- //!
- //! The information provided depends on architecture and OS:
- //! - X86:
- //! - Brand identifier matches the BrandId read by using CPUID.
- ASMJIT_INLINE_NODEBUG uint32_t brandId() const noexcept { return _brandId; }
-
- //! Returns the CPU stepping.
- //!
- //! The information provided depends on architecture and OS:
- //! - X86:
- //! - Stepping identifier matches the Stepping information read by using CPUID.
- ASMJIT_INLINE_NODEBUG uint32_t stepping() const noexcept { return _stepping; }
-
- //! Returns the processor type.
- //!
- //! The information provided depends on architecture and OS:
- //! - X86:
- //! - Processor type identifier matches the ProcessorType read by using CPUID.
- ASMJIT_INLINE_NODEBUG uint32_t processorType() const noexcept { return _processorType; }
-
- //! Returns the maximum number of logical processors.
- ASMJIT_INLINE_NODEBUG uint32_t maxLogicalProcessors() const noexcept { return _maxLogicalProcessors; }
-
- //! Returns the size of a CPU cache line.
- //!
- //! On a multi-architecture system this should return the smallest cache line of all CPUs.
- ASMJIT_INLINE_NODEBUG uint32_t cacheLineSize() const noexcept { return _cacheLineSize; }
-
- //! Returns number of hardware threads available.
- ASMJIT_INLINE_NODEBUG uint32_t hwThreadCount() const noexcept { return _hwThreadCount; }
-
- //! Returns a CPU vendor string.
- ASMJIT_INLINE_NODEBUG const char* vendor() const noexcept { return _vendor.str; }
- //! Tests whether the CPU vendor string is equal to `s`.
- ASMJIT_INLINE_NODEBUG bool isVendor(const char* s) const noexcept { return _vendor.equals(s); }
-
- //! Returns a CPU brand string.
- ASMJIT_INLINE_NODEBUG const char* brand() const noexcept { return _brand.str; }
-
- //! Returns CPU features.
- ASMJIT_INLINE_NODEBUG CpuFeatures& features() noexcept { return _features; }
- //! Returns CPU features (const).
- ASMJIT_INLINE_NODEBUG const CpuFeatures& features() const noexcept { return _features; }
-
- //! Tests whether the CPU has the given `feature`.
- template<typename FeatureId>
- ASMJIT_INLINE_NODEBUG bool hasFeature(const FeatureId& featureId) const noexcept { return _features.has(featureId); }
-
- //! Adds the given CPU `featureId` to the list of features.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG void addFeature(Args&&... args) noexcept { return _features.add(std::forward<Args>(args)...); }
-
- //! Removes the given CPU `featureId` from the list of features.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG void removeFeature(Args&&... args) noexcept { return _features.remove(std::forward<Args>(args)...); }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_CPUINFO_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/emithelper.cpp b/3rdparty/asmjit/src/asmjit/core/emithelper.cpp
deleted file mode 100644
index 36b984f832f..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/emithelper.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/archtraits.h"
-#include "../core/emithelper_p.h"
-#include "../core/formatter.h"
-#include "../core/funcargscontext_p.h"
-#include "../core/radefs_p.h"
-
-// Can be used for debugging...
-// #define ASMJIT_DUMP_ARGS_ASSIGNMENT
-
-ASMJIT_BEGIN_NAMESPACE
-
-// BaseEmitHelper - Formatting
-// ===========================
-
-#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
-static void dumpFuncValue(String& sb, Arch arch, const FuncValue& value) noexcept {
- Formatter::formatTypeId(sb, value.typeId());
- sb.append('@');
-
- if (value.isIndirect())
- sb.append('[');
-
- if (value.isReg())
- Formatter::formatRegister(sb, 0, nullptr, arch, value.regType(), value.regId());
- else if (value.isStack())
- sb.appendFormat("[%d]", value.stackOffset());
- else
- sb.append("<none>");
-
- if (value.isIndirect())
- sb.append(']');
-}
-
-static void dumpAssignment(String& sb, const FuncArgsContext& ctx) noexcept {
- typedef FuncArgsContext::Var Var;
-
- Arch arch = ctx.arch();
- uint32_t varCount = ctx.varCount();
-
- for (uint32_t i = 0; i < varCount; i++) {
- const Var& var = ctx.var(i);
- const FuncValue& dst = var.out;
- const FuncValue& cur = var.cur;
-
- sb.appendFormat("Var%u: ", i);
- dumpFuncValue(sb, arch, dst);
- sb.append(" <- ");
- dumpFuncValue(sb, arch, cur);
-
- if (var.isDone())
- sb.append(" {Done}");
-
- sb.append('\n');
- }
-}
-#endif
-
-// BaseEmitHelper - Abstract
-// =========================
-
-Error BaseEmitHelper::emitRegMove(const Operand_& dst_, const Operand_& src_, TypeId typeId, const char* comment) {
- DebugUtils::unused(dst_, src_, typeId, comment);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error BaseEmitHelper::emitRegSwap(const BaseReg& a, const BaseReg& b, const char* comment) {
- DebugUtils::unused(a, b, comment);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error BaseEmitHelper::emitArgMove(const BaseReg& dst_, TypeId dstTypeId, const Operand_& src_, TypeId srcTypeId, const char* comment) {
- DebugUtils::unused(dst_, dstTypeId, src_, srcTypeId, comment);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// BaseEmitHelper - EmitArgsAssignment
-// ===================================
-
-ASMJIT_FAVOR_SIZE Error BaseEmitHelper::emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
- typedef FuncArgsContext::Var Var;
- typedef FuncArgsContext::WorkData WorkData;
-
- enum WorkFlags : uint32_t {
- kWorkNone = 0x00,
- kWorkDidSome = 0x01,
- kWorkPending = 0x02,
- kWorkPostponed = 0x04
- };
-
- Arch arch = frame.arch();
- const ArchTraits& archTraits = ArchTraits::byArch(arch);
-
- RAConstraints constraints;
- FuncArgsContext ctx;
-
- ASMJIT_PROPAGATE(constraints.init(arch));
- ASMJIT_PROPAGATE(ctx.initWorkData(frame, args, &constraints));
-
-#ifdef ASMJIT_DUMP_ARGS_ASSIGNMENT
- {
- String sb;
- dumpAssignment(sb, ctx);
- printf("%s\n", sb.data());
- }
-#endif
-
- auto& workData = ctx._workData;
- uint32_t varCount = ctx._varCount;
- uint32_t saVarId = ctx._saVarId;
-
- BaseReg sp = BaseReg(_emitter->_gpSignature, archTraits.spRegId());
- BaseReg sa = sp;
-
- if (frame.hasDynamicAlignment()) {
- if (frame.hasPreservedFP())
- sa.setId(archTraits.fpRegId());
- else
- sa.setId(saVarId < varCount ? ctx._vars[saVarId].cur.regId() : frame.saRegId());
- }
-
- // Register to stack and stack to stack moves must be first as now we have
- // the biggest chance of having as many as possible unassigned registers.
-
- if (ctx._stackDstMask) {
- // Base address of all arguments passed by stack.
- BaseMem baseArgPtr(sa, int32_t(frame.saOffset(sa.id())));
- BaseMem baseStackPtr(sp, 0);
-
- for (uint32_t varId = 0; varId < varCount; varId++) {
- Var& var = ctx._vars[varId];
-
- if (!var.out.isStack())
- continue;
-
- FuncValue& cur = var.cur;
- FuncValue& out = var.out;
-
- ASMJIT_ASSERT(cur.isReg() || cur.isStack());
- BaseReg reg;
-
- BaseMem dstStackPtr = baseStackPtr.cloneAdjusted(out.stackOffset());
- BaseMem srcStackPtr = baseArgPtr.cloneAdjusted(cur.stackOffset());
-
- if (cur.isIndirect()) {
- if (cur.isStack()) {
- // TODO: Indirect stack.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- else {
- srcStackPtr.setBaseId(cur.regId());
- }
- }
-
- if (cur.isReg() && !cur.isIndirect()) {
- WorkData& wd = workData[archTraits.regTypeToGroup(cur.regType())];
- uint32_t regId = cur.regId();
-
- reg.setSignatureAndId(archTraits.regTypeToSignature(cur.regType()), regId);
- wd.unassign(varId, regId);
- }
- else {
- // Stack to reg move - tricky since we move stack to stack we can decide which register to use. In general
- // we follow the rule that IntToInt moves will use GP regs with possibility to signature or zero extend,
- // and all other moves will either use GP or VEC regs depending on the size of the move.
- OperandSignature signature = getSuitableRegForMemToMemMove(arch, out.typeId(), cur.typeId());
- if (ASMJIT_UNLIKELY(!signature.isValid()))
- return DebugUtils::errored(kErrorInvalidState);
-
- WorkData& wd = workData[signature.regGroup()];
- RegMask availableRegs = wd.availableRegs();
- if (ASMJIT_UNLIKELY(!availableRegs))
- return DebugUtils::errored(kErrorInvalidState);
-
- uint32_t availableId = Support::ctz(availableRegs);
- reg.setSignatureAndId(signature, availableId);
-
- ASMJIT_PROPAGATE(emitArgMove(reg, out.typeId(), srcStackPtr, cur.typeId()));
- }
-
- if (cur.isIndirect() && cur.isReg())
- workData[RegGroup::kGp].unassign(varId, cur.regId());
-
- // Register to stack move.
- ASMJIT_PROPAGATE(emitRegMove(dstStackPtr, reg, cur.typeId()));
- var.markDone();
- }
- }
-
- // Shuffle all registers that are currently assigned accordingly to target assignment.
-
- uint32_t workFlags = kWorkNone;
- for (;;) {
- for (uint32_t varId = 0; varId < varCount; varId++) {
- Var& var = ctx._vars[varId];
- if (var.isDone() || !var.cur.isReg())
- continue;
-
- FuncValue& cur = var.cur;
- FuncValue& out = var.out;
-
- RegGroup curGroup = archTraits.regTypeToGroup(cur.regType());
- RegGroup outGroup = archTraits.regTypeToGroup(out.regType());
-
- uint32_t curId = cur.regId();
- uint32_t outId = out.regId();
-
- if (curGroup != outGroup) {
- // TODO: Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- else {
- WorkData& wd = workData[outGroup];
- if (!wd.isAssigned(outId) || curId == outId) {
-EmitMove:
- ASMJIT_PROPAGATE(
- emitArgMove(
- BaseReg(archTraits.regTypeToSignature(out.regType()), outId), out.typeId(),
- BaseReg(archTraits.regTypeToSignature(cur.regType()), curId), cur.typeId()));
-
- // Only reassign if this is not a sign/zero extension that happens on the same in/out register.
- if (curId != outId)
- wd.reassign(varId, outId, curId);
-
- cur.initReg(out.regType(), outId, out.typeId());
-
- if (outId == out.regId())
- var.markDone();
- workFlags |= kWorkDidSome | kWorkPending;
- }
- else {
- uint32_t altId = wd._physToVarId[outId];
- Var& altVar = ctx._vars[altId];
-
- if (!altVar.out.isInitialized() || (altVar.out.isReg() && altVar.out.regId() == curId)) {
- // Only few architectures provide swap operations, and only for few register groups.
- if (archTraits.hasInstRegSwap(curGroup)) {
- RegType highestType = Support::max(cur.regType(), altVar.cur.regType());
- if (Support::isBetween(highestType, RegType::kGp8Lo, RegType::kGp16))
- highestType = RegType::kGp32;
-
- OperandSignature signature = archTraits.regTypeToSignature(highestType);
- ASMJIT_PROPAGATE(
- emitRegSwap(BaseReg(signature, outId), BaseReg(signature, curId)));
-
- wd.swap(varId, curId, altId, outId);
- cur.setRegId(outId);
- var.markDone();
- altVar.cur.setRegId(curId);
-
- if (altVar.out.isInitialized())
- altVar.markDone();
- workFlags |= kWorkDidSome;
- }
- else {
- // If there is a scratch register it can be used to perform the swap.
- RegMask availableRegs = wd.availableRegs();
- if (availableRegs) {
- RegMask inOutRegs = wd.dstRegs();
- if (availableRegs & ~inOutRegs)
- availableRegs &= ~inOutRegs;
- outId = Support::ctz(availableRegs);
- goto EmitMove;
- }
- else {
- workFlags |= kWorkPending;
- }
- }
- }
- else {
- workFlags |= kWorkPending;
- }
- }
- }
- }
-
- if (!(workFlags & kWorkPending))
- break;
-
- // If we did nothing twice it means that something is really broken.
- if ((workFlags & (kWorkDidSome | kWorkPostponed)) == kWorkPostponed)
- return DebugUtils::errored(kErrorInvalidState);
-
- workFlags = (workFlags & kWorkDidSome) ? kWorkNone : kWorkPostponed;
- }
-
- // Load arguments passed by stack into registers. This is pretty simple and
- // it never requires multiple iterations like the previous phase.
-
- if (ctx._hasStackSrc) {
- uint32_t iterCount = 1;
- if (frame.hasDynamicAlignment() && !frame.hasPreservedFP())
- sa.setId(saVarId < varCount ? ctx._vars[saVarId].cur.regId() : frame.saRegId());
-
- // Base address of all arguments passed by stack.
- BaseMem baseArgPtr(sa, int32_t(frame.saOffset(sa.id())));
-
- for (uint32_t iter = 0; iter < iterCount; iter++) {
- for (uint32_t varId = 0; varId < varCount; varId++) {
- Var& var = ctx._vars[varId];
- if (var.isDone())
- continue;
-
- if (var.cur.isStack()) {
- ASMJIT_ASSERT(var.out.isReg());
-
- uint32_t outId = var.out.regId();
- RegType outType = var.out.regType();
-
- RegGroup group = archTraits.regTypeToGroup(outType);
- WorkData& wd = workData[group];
-
- if (outId == sa.id() && group == RegGroup::kGp) {
- // This register will be processed last as we still need `saRegId`.
- if (iterCount == 1) {
- iterCount++;
- continue;
- }
- wd.unassign(wd._physToVarId[outId], outId);
- }
-
- BaseReg dstReg = BaseReg(archTraits.regTypeToSignature(outType), outId);
- BaseMem srcMem = baseArgPtr.cloneAdjusted(var.cur.stackOffset());
-
- ASMJIT_PROPAGATE(emitArgMove(
- dstReg, var.out.typeId(),
- srcMem, var.cur.typeId()));
-
- wd.assign(varId, outId);
- var.cur.initReg(outType, outId, var.cur.typeId(), FuncValue::kFlagIsDone);
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/emithelper_p.h b/3rdparty/asmjit/src/asmjit/core/emithelper_p.h
deleted file mode 100644
index 0f4a2f3ece4..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/emithelper_p.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
-#define ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
-
-#include "../core/emitter.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_core
-//! \{
-
-//! Helper class that provides utilities for each supported architecture.
-class BaseEmitHelper {
-public:
- BaseEmitter* _emitter;
-
- ASMJIT_INLINE_NODEBUG explicit BaseEmitHelper(BaseEmitter* emitter = nullptr) noexcept
- : _emitter(emitter) {}
-
- ASMJIT_INLINE_NODEBUG BaseEmitter* emitter() const noexcept { return _emitter; }
- ASMJIT_INLINE_NODEBUG void setEmitter(BaseEmitter* emitter) noexcept { _emitter = emitter; }
-
- //! Emits a pure move operation between two registers or the same type or between a register and its home
- //! slot. This function does not handle register conversion.
- virtual Error emitRegMove(
- const Operand_& dst_,
- const Operand_& src_, TypeId typeId, const char* comment = nullptr);
-
- //! Emits swap between two registers.
- virtual Error emitRegSwap(
- const BaseReg& a,
- const BaseReg& b, const char* comment = nullptr);
-
- //! Emits move from a function argument (either register or stack) to a register.
- //!
- //! This function can handle the necessary conversion from one argument to another, and from one register type
- //! to another, if it's possible. Any attempt of conversion that requires third register of a different group
- //! (for example conversion from K to MMX on X86/X64) will fail.
- virtual Error emitArgMove(
- const BaseReg& dst_, TypeId dstTypeId,
- const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr);
-
- Error emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args);
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/emitter.cpp b/3rdparty/asmjit/src/asmjit/core/emitter.cpp
deleted file mode 100644
index 4c855ea5688..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/emitter.cpp
+++ /dev/null
@@ -1,415 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/emitterutils_p.h"
-#include "../core/errorhandler.h"
-#include "../core/logger.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// BaseEmitter - Construction & Destruction
-// ========================================
-
-BaseEmitter::BaseEmitter(EmitterType emitterType) noexcept
- : _emitterType(emitterType) {}
-
-BaseEmitter::~BaseEmitter() noexcept {
- if (_code) {
- _addEmitterFlags(EmitterFlags::kDestroyed);
- _code->detach(this);
- }
-}
-
-// BaseEmitter - Finalize
-// ======================
-
-Error BaseEmitter::finalize() {
- // Does nothing by default, overridden by `BaseBuilder` and `BaseCompiler`.
- return kErrorOk;
-}
-
-// BaseEmitter - Internals
-// =======================
-
-static constexpr EmitterFlags kEmitterPreservedFlags = EmitterFlags::kOwnLogger | EmitterFlags::kOwnErrorHandler;
-
-static ASMJIT_NOINLINE void BaseEmitter_updateForcedOptions(BaseEmitter* self) noexcept {
- bool emitComments = false;
- bool hasDiagnosticOptions = false;
-
- if (self->emitterType() == EmitterType::kAssembler) {
- // Assembler: Don't emit comments if logger is not attached.
- emitComments = self->_code != nullptr && self->_logger != nullptr;
- hasDiagnosticOptions = self->hasDiagnosticOption(DiagnosticOptions::kValidateAssembler);
- }
- else {
- // Builder/Compiler: Always emit comments, we cannot assume they won't be used.
- emitComments = self->_code != nullptr;
- hasDiagnosticOptions = self->hasDiagnosticOption(DiagnosticOptions::kValidateIntermediate);
- }
-
- if (emitComments)
- self->_addEmitterFlags(EmitterFlags::kLogComments);
- else
- self->_clearEmitterFlags(EmitterFlags::kLogComments);
-
- // The reserved option tells emitter (Assembler/Builder/Compiler) that there may be either a border
- // case (CodeHolder not attached, for example) or that logging or validation is required.
- if (self->_code == nullptr || self->_logger || hasDiagnosticOptions)
- self->_forcedInstOptions |= InstOptions::kReserved;
- else
- self->_forcedInstOptions &= ~InstOptions::kReserved;
-}
-
-// BaseEmitter - Diagnostic Options
-// ================================
-
-void BaseEmitter::addDiagnosticOptions(DiagnosticOptions options) noexcept {
- _diagnosticOptions |= options;
- BaseEmitter_updateForcedOptions(this);
-}
-
-void BaseEmitter::clearDiagnosticOptions(DiagnosticOptions options) noexcept {
- _diagnosticOptions &= ~options;
- BaseEmitter_updateForcedOptions(this);
-}
-
-// BaseEmitter - Logging
-// =====================
-
-void BaseEmitter::setLogger(Logger* logger) noexcept {
-#ifndef ASMJIT_NO_LOGGING
- if (logger) {
- _logger = logger;
- _addEmitterFlags(EmitterFlags::kOwnLogger);
- }
- else {
- _logger = nullptr;
- _clearEmitterFlags(EmitterFlags::kOwnLogger);
- if (_code)
- _logger = _code->logger();
- }
- BaseEmitter_updateForcedOptions(this);
-#else
- DebugUtils::unused(logger);
-#endif
-}
-
-// BaseEmitter - Error Handling
-// ============================
-
-void BaseEmitter::setErrorHandler(ErrorHandler* errorHandler) noexcept {
- if (errorHandler) {
- _errorHandler = errorHandler;
- _addEmitterFlags(EmitterFlags::kOwnErrorHandler);
- }
- else {
- _errorHandler = nullptr;
- _clearEmitterFlags(EmitterFlags::kOwnErrorHandler);
- if (_code)
- _errorHandler = _code->errorHandler();
- }
-}
-
-Error BaseEmitter::reportError(Error err, const char* message) {
- ErrorHandler* eh = _errorHandler;
- if (eh) {
- if (!message)
- message = DebugUtils::errorAsString(err);
- eh->handleError(err, message, this);
- }
- return err;
-}
-
-// BaseEmitter - Sections
-// ======================
-
-// [[pure virtual]]
-Error BaseEmitter::section(Section* section) {
- DebugUtils::unused(section);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// BaseEmitter - Labels
-// ====================
-
-// [[pure virtual]]
-Label BaseEmitter::newLabel() {
- return Label(Globals::kInvalidId);
-}
-
-// [[pure virtual]]
-Label BaseEmitter::newNamedLabel(const char* name, size_t nameSize, LabelType type, uint32_t parentId) {
- DebugUtils::unused(name, nameSize, type, parentId);
- return Label(Globals::kInvalidId);
-}
-
-Label BaseEmitter::labelByName(const char* name, size_t nameSize, uint32_t parentId) noexcept {
- return Label(_code ? _code->labelIdByName(name, nameSize, parentId) : Globals::kInvalidId);
-}
-
-// [[pure virtual]]
-Error BaseEmitter::bind(const Label& label) {
- DebugUtils::unused(label);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-bool BaseEmitter::isLabelValid(uint32_t labelId) const noexcept {
- return _code && labelId < _code->labelCount();
-}
-
-// BaseEmitter - Emit (Low-Level)
-// ==============================
-
-using EmitterUtils::noExt;
-
-Error BaseEmitter::_emitI(InstId instId) {
- return _emit(instId, noExt[0], noExt[1], noExt[2], noExt);
-}
-
-Error BaseEmitter::_emitI(InstId instId, const Operand_& o0) {
- return _emit(instId, o0, noExt[1], noExt[2], noExt);
-}
-
-Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1) {
- return _emit(instId, o0, o1, noExt[2], noExt);
-}
-
-Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2) {
- return _emit(instId, o0, o1, o2, noExt);
-}
-
-Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3) {
- Operand_ opExt[3] = { o3 };
- return _emit(instId, o0, o1, o2, opExt);
-}
-
-Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4) {
- Operand_ opExt[3] = { o3, o4 };
- return _emit(instId, o0, o1, o2, opExt);
-}
-
-Error BaseEmitter::_emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5) {
- Operand_ opExt[3] = { o3, o4, o5 };
- return _emit(instId, o0, o1, o2, opExt);
-}
-
-// [[pure virtual]]
-Error BaseEmitter::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt) {
- DebugUtils::unused(instId, o0, o1, o2, oExt);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error BaseEmitter::_emitOpArray(InstId instId, const Operand_* operands, size_t opCount) {
- const Operand_* op = operands;
- Operand_ opExt[3];
-
- switch (opCount) {
- case 0:
- return _emit(instId, noExt[0], noExt[1], noExt[2], noExt);
-
- case 1:
- return _emit(instId, op[0], noExt[1], noExt[2], noExt);
-
- case 2:
- return _emit(instId, op[0], op[1], noExt[2], noExt);
-
- case 3:
- return _emit(instId, op[0], op[1], op[2], noExt);
-
- case 4:
- opExt[0] = op[3];
- opExt[1].reset();
- opExt[2].reset();
- return _emit(instId, op[0], op[1], op[2], opExt);
-
- case 5:
- opExt[0] = op[3];
- opExt[1] = op[4];
- opExt[2].reset();
- return _emit(instId, op[0], op[1], op[2], opExt);
-
- case 6:
- return _emit(instId, op[0], op[1], op[2], op + 3);
-
- default:
- return DebugUtils::errored(kErrorInvalidArgument);
- }
-}
-
-// BaseEmitter - Emit Utilities
-// ============================
-
-Error BaseEmitter::emitProlog(const FuncFrame& frame) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- return _funcs.emitProlog(this, frame);
-}
-
-Error BaseEmitter::emitEpilog(const FuncFrame& frame) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- return _funcs.emitEpilog(this, frame);
-}
-
-Error BaseEmitter::emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args) {
- if (ASMJIT_UNLIKELY(!_code))
- return DebugUtils::errored(kErrorNotInitialized);
-
- return _funcs.emitArgsAssignment(this, frame, args);
-}
-
-// BaseEmitter - Align
-// ===================
-
-// [[pure virtual]]
-Error BaseEmitter::align(AlignMode alignMode, uint32_t alignment) {
- DebugUtils::unused(alignMode, alignment);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// BaseEmitter - Embed
-// ===================
-
-// [[pure virtual]]
-Error BaseEmitter::embed(const void* data, size_t dataSize) {
- DebugUtils::unused(data, dataSize);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseEmitter::embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) {
- DebugUtils::unused(typeId, data, itemCount, repeatCount);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseEmitter::embedConstPool(const Label& label, const ConstPool& pool) {
- DebugUtils::unused(label, pool);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseEmitter::embedLabel(const Label& label, size_t dataSize) {
- DebugUtils::unused(label, dataSize);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseEmitter::embedLabelDelta(const Label& label, const Label& base, size_t dataSize) {
- DebugUtils::unused(label, base, dataSize);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// BaseEmitter - Comment
-// =====================
-
-// [[pure virtual]]
-Error BaseEmitter::comment(const char* data, size_t size) {
- DebugUtils::unused(data, size);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error BaseEmitter::commentf(const char* fmt, ...) {
- if (!hasEmitterFlag(EmitterFlags::kLogComments)) {
- if (!hasEmitterFlag(EmitterFlags::kAttached))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
- return kErrorOk;
- }
-
-#ifndef ASMJIT_NO_LOGGING
- StringTmp<1024> sb;
-
- va_list ap;
- va_start(ap, fmt);
- Error err = sb.appendVFormat(fmt, ap);
- va_end(ap);
-
- ASMJIT_PROPAGATE(err);
- return comment(sb.data(), sb.size());
-#else
- DebugUtils::unused(fmt);
- return kErrorOk;
-#endif
-}
-
-Error BaseEmitter::commentv(const char* fmt, va_list ap) {
- if (!hasEmitterFlag(EmitterFlags::kLogComments)) {
- if (!hasEmitterFlag(EmitterFlags::kAttached))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
- return kErrorOk;
- }
-
-#ifndef ASMJIT_NO_LOGGING
- StringTmp<1024> sb;
- Error err = sb.appendVFormat(fmt, ap);
-
- ASMJIT_PROPAGATE(err);
- return comment(sb.data(), sb.size());
-#else
- DebugUtils::unused(fmt, ap);
- return kErrorOk;
-#endif
-}
-
-// BaseEmitter - Events
-// ====================
-
-Error BaseEmitter::onAttach(CodeHolder* code) noexcept {
- _code = code;
- _environment = code->environment();
- _addEmitterFlags(EmitterFlags::kAttached);
-
- const ArchTraits& archTraits = ArchTraits::byArch(code->arch());
- RegType nativeRegType = Environment::is32Bit(code->arch()) ? RegType::kGp32 : RegType::kGp64;
- _gpSignature = archTraits.regTypeToSignature(nativeRegType);
-
- onSettingsUpdated();
- return kErrorOk;
-}
-
-Error BaseEmitter::onDetach(CodeHolder* code) noexcept {
- DebugUtils::unused(code);
-
- if (!hasOwnLogger())
- _logger = nullptr;
-
- if (!hasOwnErrorHandler())
- _errorHandler = nullptr;
-
- _clearEmitterFlags(~kEmitterPreservedFlags);
- _instructionAlignment = uint8_t(0);
- _forcedInstOptions = InstOptions::kReserved;
- _privateData = 0;
-
- _environment.reset();
- _gpSignature.reset();
-
- _instOptions = InstOptions::kNone;
- _extraReg.reset();
- _inlineComment = nullptr;
- _funcs.reset();
-
- return kErrorOk;
-}
-
-void BaseEmitter::onSettingsUpdated() noexcept {
- // Only called when attached to CodeHolder by CodeHolder.
- ASMJIT_ASSERT(_code != nullptr);
-
- if (!hasOwnLogger())
- _logger = _code->logger();
-
- if (!hasOwnErrorHandler())
- _errorHandler = _code->errorHandler();
-
- BaseEmitter_updateForcedOptions(this);
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/emitter.h b/3rdparty/asmjit/src/asmjit/core/emitter.h
deleted file mode 100644
index 09c72a68eae..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/emitter.h
+++ /dev/null
@@ -1,817 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_EMITTER_H_INCLUDED
-#define ASMJIT_CORE_EMITTER_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/codeholder.h"
-#include "../core/formatter.h"
-#include "../core/inst.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-class ConstPool;
-class FuncFrame;
-class FuncArgsAssignment;
-
-//! Align mode, used by \ref BaseEmitter::align().
-enum class AlignMode : uint8_t {
- //! Align executable code.
- kCode = 0,
- //! Align non-executable code.
- kData = 1,
- //! Align by a sequence of zeros.
- kZero = 2,
-
- //! Maximum value of `AlignMode`.
- kMaxValue = kZero
-};
-
-//! Emitter type used by \ref BaseEmitter.
-enum class EmitterType : uint8_t {
- //! Unknown or uninitialized.
- kNone = 0,
- //! Emitter inherits from \ref BaseAssembler.
- kAssembler = 1,
- //! Emitter inherits from \ref BaseBuilder.
- kBuilder = 2,
- //! Emitter inherits from \ref BaseCompiler.
- kCompiler = 3,
-
- //! Maximum value of `EmitterType`.
- kMaxValue = kCompiler
-};
-
-//! Emitter flags, used by \ref BaseEmitter.
-enum class EmitterFlags : uint8_t {
- //! No flags.
- kNone = 0u,
- //! Emitter is attached to CodeHolder.
- kAttached = 0x01u,
- //! The emitter must emit comments.
- kLogComments = 0x08u,
- //! The emitter has its own \ref Logger (not propagated from \ref CodeHolder).
- kOwnLogger = 0x10u,
- //! The emitter has its own \ref ErrorHandler (not propagated from \ref CodeHolder).
- kOwnErrorHandler = 0x20u,
- //! The emitter was finalized.
- kFinalized = 0x40u,
- //! The emitter was destroyed.
- //!
- //! This flag is used for a very short time when an emitter is being destroyed by
- //! CodeHolder.
- kDestroyed = 0x80u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(EmitterFlags)
-
-//! Encoding options.
-enum class EncodingOptions : uint32_t {
- //! No encoding options.
- kNone = 0,
-
- //! Emit instructions that are optimized for size, if possible.
- //!
- //! Default: false.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! When this option is set it the assembler will try to fix instructions if possible into operation equivalent
- //! instructions that take less bytes by taking advantage of implicit zero extension. For example instruction
- //! like `mov r64, imm` and `and r64, imm` can be translated to `mov r32, imm` and `and r32, imm` when the
- //! immediate constant is lesser than `2^31`.
- kOptimizeForSize = 0x00000001u,
-
- //! Emit optimized code-alignment sequences.
- //!
- //! Default: false.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Default align sequence used by X86 architecture is one-byte (0x90) opcode that is often shown by disassemblers
- //! as NOP. However there are more optimized align sequences for 2-11 bytes that may execute faster on certain CPUs.
- //! If this feature is enabled AsmJit will generate specialized sequences for alignment between 2 to 11 bytes.
- kOptimizedAlign = 0x00000002u,
-
- //! Emit jump-prediction hints.
- //!
- //! Default: false.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Jump prediction is usually based on the direction of the jump. If the jump is backward it is usually predicted as
- //! taken; and if the jump is forward it is usually predicted as not-taken. The reason is that loops generally use
- //! backward jumps and conditions usually use forward jumps. However this behavior can be overridden by using
- //! instruction prefixes. If this option is enabled these hints will be emitted.
- //!
- //! This feature is disabled by default, because the only processor that used to take into consideration prediction
- //! hints was P4. Newer processors implement heuristics for branch prediction and ignore static hints. This means
- //! that this feature can be only used for annotation purposes.
- kPredictedJumps = 0x00000010u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(EncodingOptions)
-
-//! Diagnostic options are used to tell emitters and their passes to perform diagnostics when emitting or processing
-//! user code. These options control validation and extra diagnostics that can be performed by higher level emitters.
-//!
-//! Instruction Validation
-//! ----------------------
-//!
-//! \ref BaseAssembler implementation perform by default only basic checks that are necessary to identify all
-//! variations of an instruction so the correct encoding can be selected. This is fine for production-ready code
-//! as the assembler doesn't have to perform checks that would slow it down. However, sometimes these checks are
-//! beneficial especially when the project that uses AsmJit is in a development phase, in which mistakes happen
-//! often. To make the experience of using AsmJit seamless it offers validation features that can be controlled
-//! by \ref DiagnosticOptions.
-//!
-//! Compiler Diagnostics
-//! --------------------
-//!
-//! Diagnostic options work with \ref BaseCompiler passes (precisely with its register allocation pass). These options
-//! can be used to enable logging of all operations that the Compiler does.
-enum class DiagnosticOptions : uint32_t {
- //! No validation options.
- kNone = 0,
-
- //! Perform strict validation in \ref BaseAssembler::emit() implementations.
- //!
- //! This flag ensures that each instruction is checked before it's encoded into a binary representation. This flag
- //! is only relevant for \ref BaseAssembler implementations, but can be set in any other emitter type, in that case
- //! if that emitter needs to create an assembler on its own, for the purpose of \ref BaseEmitter::finalize() it
- //! would propagate this flag to such assembler so all instructions passed to it are explicitly validated.
- //!
- //! Default: false.
- kValidateAssembler = 0x00000001u,
-
- //! Perform strict validation in \ref BaseBuilder::emit() and \ref BaseCompiler::emit() implementations.
- //!
- //! This flag ensures that each instruction is checked before an \ref InstNode representing the instruction is
- //! created by \ref BaseBuilder or \ref BaseCompiler. This option could be more useful than \ref kValidateAssembler
- //! in cases in which there is an invalid instruction passed to an assembler, which was invalid much earlier, most
- //! likely when such instruction was passed to Builder/Compiler.
- //!
- //! This is a separate option that was introduced, because it's possible to manipulate the instruction stream
- //! emitted by \ref BaseBuilder and \ref BaseCompiler - this means that it's allowed to emit invalid instructions
- //! (for example with missing operands) that will be fixed later before finalizing it.
- //!
- //! Default: false.
- kValidateIntermediate = 0x00000002u,
-
- //! Annotate all nodes processed by register allocator (Compiler/RA).
- //!
- //! \note Annotations don't need debug options, however, some debug options like `kRADebugLiveness` may influence
- //! their output (for example the mentioned option would add liveness information to per-instruction annotation).
- kRAAnnotate = 0x00000080u,
-
- //! Debug CFG generation and other related algorithms / operations (Compiler/RA).
- kRADebugCFG = 0x00000100u,
-
- //! Debug liveness analysis (Compiler/RA).
- kRADebugLiveness = 0x00000200u,
-
- //! Debug register allocation assignment (Compiler/RA).
- kRADebugAssignment = 0x00000400u,
-
- //! Debug the removal of code part of unreachable blocks.
- kRADebugUnreachable = 0x00000800u,
-
- //! Enable all debug options (Compiler/RA).
- kRADebugAll = 0x0000FF00u,
-};
-ASMJIT_DEFINE_ENUM_FLAGS(DiagnosticOptions)
-
-//! Provides a base foundation to emitting code - specialized by \ref BaseAssembler and \ref BaseBuilder.
-class ASMJIT_VIRTAPI BaseEmitter {
-public:
- ASMJIT_BASE_CLASS(BaseEmitter)
- ASMJIT_NONCOPYABLE(BaseEmitter)
-
- //! \name Members
- //! \{
-
- //! See \ref EmitterType.
- EmitterType _emitterType = EmitterType::kNone;
- //! See \ref EmitterFlags.
- EmitterFlags _emitterFlags = EmitterFlags::kNone;
- //! Instruction alignment.
- uint8_t _instructionAlignment = 0u;
- //! \cond
- uint8_t _reservedBaseEmitter = 0u;
- //! \endcond
- //! Validation flags in case validation is used.
- //!
- //! \note Validation flags are specific to the emitter and they are setup at construction time and then never
- //! changed.
- ValidationFlags _validationFlags = ValidationFlags::kNone;
- //! Validation options.
- DiagnosticOptions _diagnosticOptions = DiagnosticOptions::kNone;
-
- //! All supported architectures in a bit-mask, where LSB is the bit with a zero index.
- uint64_t _archMask = 0;
-
- //! Encoding options.
- EncodingOptions _encodingOptions = EncodingOptions::kNone;
-
- //! Forced instruction options, combined with \ref _instOptions by \ref emit().
- InstOptions _forcedInstOptions = InstOptions::kReserved;
- //! Internal private data used freely by any emitter.
- uint32_t _privateData = 0;
-
- //! CodeHolder the emitter is attached to.
- CodeHolder* _code = nullptr;
- //! Attached \ref Logger.
- Logger* _logger = nullptr;
- //! Attached \ref ErrorHandler.
- ErrorHandler* _errorHandler = nullptr;
-
- //! Describes the target environment, matches \ref CodeHolder::environment().
- Environment _environment {};
- //! Native GP register signature and signature related information.
- OperandSignature _gpSignature {};
-
- //! Emitter state that can be used to specify options and inline comment of a next node or instruction.
- struct State {
- InstOptions options;
- RegOnly extraReg;
- const char* comment;
- };
-
- //! Next instruction options (affects the next instruction).
- InstOptions _instOptions = InstOptions::kNone;
- //! Extra register (op-mask {k} on AVX-512) (affects the next instruction).
- RegOnly _extraReg {};
- //! Inline comment of the next instruction (affects the next instruction).
- const char* _inlineComment = nullptr;
-
- //! Function callbacks used by emitter implementation.
- //!
- //! These are typically shared between Assembler/Builder/Compiler of a single backend.
- struct Funcs {
- typedef Error (ASMJIT_CDECL* EmitProlog)(BaseEmitter* emitter, const FuncFrame& frame);
- typedef Error (ASMJIT_CDECL* EmitEpilog)(BaseEmitter* emitter, const FuncFrame& frame);
- typedef Error (ASMJIT_CDECL* EmitArgsAssignment)(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args);
-
- typedef Error (ASMJIT_CDECL* FormatInstruction)(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) ASMJIT_NOEXCEPT_TYPE;
-
- typedef Error (ASMJIT_CDECL* ValidateFunc)(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) ASMJIT_NOEXCEPT_TYPE;
-
- //! Emit prolog implementation.
- EmitProlog emitProlog;
- //! Emit epilog implementation.
- EmitEpilog emitEpilog;
- //! Emit arguments assignment implementation.
- EmitArgsAssignment emitArgsAssignment;
- //! Instruction formatter implementation.
- FormatInstruction formatInstruction;
- //! Instruction validation implementation.
- ValidateFunc validate;
-
- //! Resets all functions to nullptr.
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- emitProlog = nullptr;
- emitEpilog = nullptr;
- emitArgsAssignment = nullptr;
- validate = nullptr;
- }
- };
-
- Funcs _funcs {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API explicit BaseEmitter(EmitterType emitterType) noexcept;
- ASMJIT_API virtual ~BaseEmitter() noexcept;
-
- //! \}
-
- //! \name Cast
- //! \{
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* as() noexcept { return reinterpret_cast<T*>(this); }
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG const T* as() const noexcept { return reinterpret_cast<const T*>(this); }
-
- //! \}
-
- //! \name Emitter Type & Flags
- //! \{
-
- //! Returns the type of this emitter, see `EmitterType`.
- ASMJIT_INLINE_NODEBUG EmitterType emitterType() const noexcept { return _emitterType; }
- //! Returns emitter flags , see `Flags`.
- ASMJIT_INLINE_NODEBUG EmitterFlags emitterFlags() const noexcept { return _emitterFlags; }
-
- //! Tests whether the emitter inherits from `BaseAssembler`.
- ASMJIT_INLINE_NODEBUG bool isAssembler() const noexcept { return _emitterType == EmitterType::kAssembler; }
- //! Tests whether the emitter inherits from `BaseBuilder`.
- //!
- //! \note Both Builder and Compiler emitters would return `true`.
- ASMJIT_INLINE_NODEBUG bool isBuilder() const noexcept { return uint32_t(_emitterType) >= uint32_t(EmitterType::kBuilder); }
- //! Tests whether the emitter inherits from `BaseCompiler`.
- ASMJIT_INLINE_NODEBUG bool isCompiler() const noexcept { return _emitterType == EmitterType::kCompiler; }
-
- //! Tests whether the emitter has the given `flag` enabled.
- ASMJIT_INLINE_NODEBUG bool hasEmitterFlag(EmitterFlags flag) const noexcept { return Support::test(_emitterFlags, flag); }
- //! Tests whether the emitter is finalized.
- ASMJIT_INLINE_NODEBUG bool isFinalized() const noexcept { return hasEmitterFlag(EmitterFlags::kFinalized); }
- //! Tests whether the emitter is destroyed (only used during destruction).
- ASMJIT_INLINE_NODEBUG bool isDestroyed() const noexcept { return hasEmitterFlag(EmitterFlags::kDestroyed); }
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal Functions
- //! \{
-
- ASMJIT_INLINE_NODEBUG void _addEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags |= flags; }
- ASMJIT_INLINE_NODEBUG void _clearEmitterFlags(EmitterFlags flags) noexcept { _emitterFlags &= _emitterFlags & ~flags; }
-
- //! \}
- //! \endcond
-
- //! \name Target Information
- //! \{
-
- //! Returns the CodeHolder this emitter is attached to.
- ASMJIT_INLINE_NODEBUG CodeHolder* code() const noexcept { return _code; }
-
- //! Returns the target environment.
- //!
- //! The returned \ref Environment reference matches \ref CodeHolder::environment().
- ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; }
-
- //! Tests whether the target architecture is 32-bit.
- ASMJIT_INLINE_NODEBUG bool is32Bit() const noexcept { return environment().is32Bit(); }
- //! Tests whether the target architecture is 64-bit.
- ASMJIT_INLINE_NODEBUG bool is64Bit() const noexcept { return environment().is64Bit(); }
-
- //! Returns the target architecture type.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return environment().arch(); }
- //! Returns the target architecture sub-type.
- ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return environment().subArch(); }
-
- //! Returns the target architecture's GP register size (4 or 8 bytes).
- ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return environment().registerSize(); }
-
- //! Returns instruction alignment.
- //!
- //! The following values are returned based on the target architecture:
- //! - X86 and X86_64 - instruction alignment is 1
- //! - AArch32 - instruction alignment is 4 in A32 mode and 2 in THUMB mode.
- //! - AArch64 - instruction alignment is 4
- ASMJIT_INLINE_NODEBUG uint32_t instructionAlignment() const noexcept { return _instructionAlignment; }
-
- //! \}
-
- //! \name Initialization & Finalization
- //! \{
-
- //! Tests whether the emitter is initialized (i.e. attached to \ref CodeHolder).
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _code != nullptr; }
-
- //! Finalizes this emitter.
- //!
- //! Materializes the content of the emitter by serializing it to the attached \ref CodeHolder through an architecture
- //! specific \ref BaseAssembler. This function won't do anything if the emitter inherits from \ref BaseAssembler as
- //! assemblers emit directly to a \ref CodeBuffer held by \ref CodeHolder. However, if this is an emitter that
- //! inherits from \ref BaseBuilder or \ref BaseCompiler then these emitters need the materialization phase as they
- //! store their content in a representation not visible to \ref CodeHolder.
- ASMJIT_API virtual Error finalize();
-
- //! \}
-
- //! \name Logging
- //! \{
-
- //! Tests whether the emitter has a logger.
- ASMJIT_INLINE_NODEBUG bool hasLogger() const noexcept { return _logger != nullptr; }
-
- //! Tests whether the emitter has its own logger.
- //!
- //! Own logger means that it overrides the possible logger that may be used by \ref CodeHolder this emitter is
- //! attached to.
- ASMJIT_INLINE_NODEBUG bool hasOwnLogger() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnLogger); }
-
- //! Returns the logger this emitter uses.
- //!
- //! The returned logger is either the emitter's own logger or it's logger used by \ref CodeHolder this emitter
- //! is attached to.
- ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; }
-
- //! Sets or resets the logger of the emitter.
- //!
- //! If the `logger` argument is non-null then the logger will be considered emitter's own logger, see \ref
- //! hasOwnLogger() for more details. If the given `logger` is null then the emitter will automatically use logger
- //! that is attached to the \ref CodeHolder this emitter is attached to.
- ASMJIT_API void setLogger(Logger* logger) noexcept;
-
- //! Resets the logger of this emitter.
- //!
- //! The emitter will bail to using a logger attached to \ref CodeHolder this emitter is attached to, or no logger
- //! at all if \ref CodeHolder doesn't have one.
- ASMJIT_INLINE_NODEBUG void resetLogger() noexcept { return setLogger(nullptr); }
-
- //! \}
-
- //! \name Error Handling
- //! \{
-
- //! Tests whether the emitter has an error handler attached.
- ASMJIT_INLINE_NODEBUG bool hasErrorHandler() const noexcept { return _errorHandler != nullptr; }
-
- //! Tests whether the emitter has its own error handler.
- //!
- //! Own error handler means that it overrides the possible error handler that may be used by \ref CodeHolder this
- //! emitter is attached to.
- ASMJIT_INLINE_NODEBUG bool hasOwnErrorHandler() const noexcept { return hasEmitterFlag(EmitterFlags::kOwnErrorHandler); }
-
- //! Returns the error handler this emitter uses.
- //!
- //! The returned error handler is either the emitter's own error handler or it's error handler used by
- //! \ref CodeHolder this emitter is attached to.
- ASMJIT_INLINE_NODEBUG ErrorHandler* errorHandler() const noexcept { return _errorHandler; }
-
- //! Sets or resets the error handler of the emitter.
- ASMJIT_API void setErrorHandler(ErrorHandler* errorHandler) noexcept;
-
- //! Resets the error handler.
- ASMJIT_INLINE_NODEBUG void resetErrorHandler() noexcept { setErrorHandler(nullptr); }
-
- //! Handles the given error in the following way:
- //! 1. If the emitter has \ref ErrorHandler attached, it calls its \ref ErrorHandler::handleError() member function
- //! first, and then returns the error. The `handleError()` function may throw.
- //! 2. if the emitter doesn't have \ref ErrorHandler, the error is simply returned.
- ASMJIT_API Error reportError(Error err, const char* message = nullptr);
-
- //! \}
-
- //! \name Encoding Options
- //! \{
-
- //! Returns encoding options.
- ASMJIT_INLINE_NODEBUG EncodingOptions encodingOptions() const noexcept { return _encodingOptions; }
- //! Tests whether the encoding `option` is set.
- ASMJIT_INLINE_NODEBUG bool hasEncodingOption(EncodingOptions option) const noexcept { return Support::test(_encodingOptions, option); }
-
- //! Enables the given encoding `options`.
- ASMJIT_INLINE_NODEBUG void addEncodingOptions(EncodingOptions options) noexcept { _encodingOptions |= options; }
- //! Disables the given encoding `options`.
- ASMJIT_INLINE_NODEBUG void clearEncodingOptions(EncodingOptions options) noexcept { _encodingOptions &= ~options; }
-
- //! \}
-
- //! \name Diagnostic Options
- //! \{
-
- //! Returns the emitter's diagnostic options.
- ASMJIT_INLINE_NODEBUG DiagnosticOptions diagnosticOptions() const noexcept { return _diagnosticOptions; }
-
- //! Tests whether the given `option` is present in the emitter's diagnostic options.
- ASMJIT_INLINE_NODEBUG bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); }
-
- //! Activates the given diagnostic `options`.
- //!
- //! This function is used to activate explicit validation options that will be then used by all emitter
- //! implementations. There are in general two possibilities:
- //!
- //! - Architecture specific assembler is used. In this case a \ref DiagnosticOptions::kValidateAssembler can be
- //! used to turn on explicit validation that will be used before an instruction is emitted. This means that
- //! internally an extra step will be performed to make sure that the instruction is correct. This is needed,
- //! because by default assemblers prefer speed over strictness.
- //!
- //! This option should be used in debug builds as it's pretty expensive.
- //!
- //! - Architecture specific builder or compiler is used. In this case the user can turn on
- //! \ref DiagnosticOptions::kValidateIntermediate option that adds explicit validation step before the Builder
- //! or Compiler creates an \ref InstNode to represent an emitted instruction. Error will be returned if the
- //! instruction is ill-formed. In addition, also \ref DiagnosticOptions::kValidateAssembler can be used, which
- //! would not be consumed by Builder / Compiler directly, but it would be propagated to an architecture specific
- //! \ref BaseAssembler implementation it creates during \ref BaseEmitter::finalize().
- ASMJIT_API void addDiagnosticOptions(DiagnosticOptions options) noexcept;
-
- //! Deactivates the given validation `options`.
- //!
- //! See \ref addDiagnosticOptions() and \ref DiagnosticOptions for more details.
- ASMJIT_API void clearDiagnosticOptions(DiagnosticOptions options) noexcept;
-
- //! \}
-
- //! \name Instruction Options
- //! \{
-
- //! Returns forced instruction options.
- //!
- //! Forced instruction options are merged with next instruction options before the instruction is encoded. These
- //! options have some bits reserved that are used by error handling, logging, and instruction validation purposes.
- //! Other options are globals that affect each instruction.
- ASMJIT_INLINE_NODEBUG InstOptions forcedInstOptions() const noexcept { return _forcedInstOptions; }
-
- //! Returns options of the next instruction.
- ASMJIT_INLINE_NODEBUG InstOptions instOptions() const noexcept { return _instOptions; }
- //! Returns options of the next instruction.
- ASMJIT_INLINE_NODEBUG void setInstOptions(InstOptions options) noexcept { _instOptions = options; }
- //! Adds options of the next instruction.
- ASMJIT_INLINE_NODEBUG void addInstOptions(InstOptions options) noexcept { _instOptions |= options; }
- //! Resets options of the next instruction.
- ASMJIT_INLINE_NODEBUG void resetInstOptions() noexcept { _instOptions = InstOptions::kNone; }
-
- //! Tests whether the extra register operand is valid.
- ASMJIT_INLINE_NODEBUG bool hasExtraReg() const noexcept { return _extraReg.isReg(); }
- //! Returns an extra operand that will be used by the next instruction (architecture specific).
- ASMJIT_INLINE_NODEBUG const RegOnly& extraReg() const noexcept { return _extraReg; }
- //! Sets an extra operand that will be used by the next instruction (architecture specific).
- ASMJIT_INLINE_NODEBUG void setExtraReg(const BaseReg& reg) noexcept { _extraReg.init(reg); }
- //! Sets an extra operand that will be used by the next instruction (architecture specific).
- ASMJIT_INLINE_NODEBUG void setExtraReg(const RegOnly& reg) noexcept { _extraReg.init(reg); }
- //! Resets an extra operand that will be used by the next instruction (architecture specific).
- ASMJIT_INLINE_NODEBUG void resetExtraReg() noexcept { _extraReg.reset(); }
-
- //! Returns comment/annotation of the next instruction.
- ASMJIT_INLINE_NODEBUG const char* inlineComment() const noexcept { return _inlineComment; }
- //! Sets comment/annotation of the next instruction.
- //!
- //! \note This string is set back to null by `_emit()`, but until that it has to remain valid as the Emitter is not
- //! required to make a copy of it (and it would be slow to do that for each instruction).
- ASMJIT_INLINE_NODEBUG void setInlineComment(const char* s) noexcept { _inlineComment = s; }
- //! Resets the comment/annotation to nullptr.
- ASMJIT_INLINE_NODEBUG void resetInlineComment() noexcept { _inlineComment = nullptr; }
-
- //! \}
-
- //! \name Emitter State
- //! \{
-
- //! Resets the emitter state, which contains instruction options, extra register, and inline comment.
- //!
- //! Emitter can have a state that describes instruction options and extra register used by the instruction. Most
- //! instructions don't need nor use the state, however, if an instruction uses a prefix such as REX or REP prefix,
- //! which is set explicitly, then the state would contain it. This allows to mimic the syntax of assemblers such
- //! as X86. For example `rep().movs(...)` would map to a `REP MOVS` instuction on X86. The same applies to various
- //! hints and the use of a mask register in AVX-512 mode.
- ASMJIT_INLINE_NODEBUG void resetState() noexcept {
- resetInstOptions();
- resetExtraReg();
- resetInlineComment();
- }
-
- //! \cond INTERNAL
-
- //! Grabs the current emitter state and resets the emitter state at the same time, returning the state the emitter
- //! had before the state was reset.
- ASMJIT_INLINE_NODEBUG State _grabState() noexcept {
- State s{_instOptions | _forcedInstOptions, _extraReg, _inlineComment};
- resetState();
- return s;
- }
- //! \endcond
-
- //! \}
-
- //! \name Sections
- //! \{
-
- //! Switches the given `section`.
- //!
- //! Once switched, everything is added to the given `section`.
- ASMJIT_API virtual Error section(Section* section);
-
- //! \}
-
- //! \name Labels
- //! \{
-
- //! Creates a new label.
- ASMJIT_API virtual Label newLabel();
- //! Creates a new named label.
- ASMJIT_API virtual Label newNamedLabel(const char* name, size_t nameSize = SIZE_MAX, LabelType type = LabelType::kGlobal, uint32_t parentId = Globals::kInvalidId);
-
- //! Creates a new anonymous label with a name, which can only be used for debugging purposes.
- ASMJIT_INLINE_NODEBUG Label newAnonymousLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kAnonymous); }
- //! Creates a new external label.
- ASMJIT_INLINE_NODEBUG Label newExternalLabel(const char* name, size_t nameSize = SIZE_MAX) { return newNamedLabel(name, nameSize, LabelType::kExternal); }
-
- //! Returns `Label` by `name`.
- //!
- //! Returns invalid Label in case that the name is invalid or label was not found.
- //!
- //! \note This function doesn't trigger ErrorHandler in case the name is invalid or no such label exist. You must
- //! always check the validity of the `Label` returned.
- ASMJIT_API Label labelByName(const char* name, size_t nameSize = SIZE_MAX, uint32_t parentId = Globals::kInvalidId) noexcept;
-
- //! Binds the `label` to the current position of the current section.
- //!
- //! \note Attempt to bind the same label multiple times will return an error.
- ASMJIT_API virtual Error bind(const Label& label);
-
- //! Tests whether the label `id` is valid (i.e. registered).
- ASMJIT_API bool isLabelValid(uint32_t labelId) const noexcept;
- //! Tests whether the `label` is valid (i.e. registered).
- ASMJIT_INLINE_NODEBUG bool isLabelValid(const Label& label) const noexcept { return isLabelValid(label.id()); }
-
- //! \}
-
- //! \name Emit
- //! \{
-
- // NOTE: These `emit()` helpers are designed to address a code-bloat generated by C++ compilers to call a function
- // having many arguments. Each parameter to `_emit()` requires some code to pass it, which means that if we default
- // to 5 arguments in `_emit()` and instId the C++ compiler would have to generate a virtual function call having 5
- // parameters and additional `this` argument, which is quite a lot. Since by default most instructions have 2 to 3
- // operands it's better to introduce helpers that pass from 0 to 6 operands that help to reduce the size of emit(...)
- // function call.
-
- //! Emits an instruction (internal).
- ASMJIT_API Error _emitI(InstId instId);
- //! \overload
- ASMJIT_API Error _emitI(InstId instId, const Operand_& o0);
- //! \overload
- ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1);
- //! \overload
- ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2);
- //! \overload
- ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3);
- //! \overload
- ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4);
- //! \overload
- ASMJIT_API Error _emitI(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_& o3, const Operand_& o4, const Operand_& o5);
-
- //! Emits an instruction `instId` with the given `operands`.
- //!
- //! This is the most universal way of emitting code, which accepts an instruction identifier and instruction
- //! operands. This is called an "unchecked" API as emit doesn't provide any type checks at compile-time. This
- //! allows to emit instruction with just \ref Operand instances, which could be handy in some cases - for
- //! example emitting generic code where you don't know whether some operand is register, memory, or immediate.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Error emit(InstId instId, Args&&... operands) {
- return _emitI(instId, Support::ForwardOp<Args>::forward(operands)...);
- }
-
- //! Similar to \ref emit(), but uses array of `operands` instead.
- ASMJIT_INLINE_NODEBUG Error emitOpArray(InstId instId, const Operand_* operands, size_t opCount) {
- return _emitOpArray(instId, operands, opCount);
- }
-
- //! Similar to \ref emit(), but emits instruction with both instruction options and extra register, followed
- //! by an array of `operands`.
- ASMJIT_FORCE_INLINE Error emitInst(const BaseInst& inst, const Operand_* operands, size_t opCount) {
- setInstOptions(inst.options());
- setExtraReg(inst.extraReg());
- return _emitOpArray(inst.id(), operands, opCount);
- }
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Emit Internals
- //! \{
-
- //! Emits an instruction - all 6 operands must be defined.
- ASMJIT_API virtual Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* oExt);
- //! Emits instruction having operands stored in array.
- ASMJIT_API virtual Error _emitOpArray(InstId instId, const Operand_* operands, size_t opCount);
-
- //! \}
- //! \endcond
-
- //! \name Emit Utilities
- //! \{
-
- //! Emits a function prolog described by the given function `frame`.
- ASMJIT_API Error emitProlog(const FuncFrame& frame);
- //! Emits a function epilog described by the given function `frame`.
- ASMJIT_API Error emitEpilog(const FuncFrame& frame);
- //! Emits code that reassigns function `frame` arguments to the given `args`.
- ASMJIT_API Error emitArgsAssignment(const FuncFrame& frame, const FuncArgsAssignment& args);
-
- //! \}
-
- //! \name Align
- //! \{
-
- //! Aligns the current CodeBuffer position to the `alignment` specified.
- //!
- //! The sequence that is used to fill the gap between the aligned location and the current location depends on the
- //! align `mode`, see \ref AlignMode. The `alignment` argument specifies alignment in bytes, so for example when
- //! it's `32` it means that the code buffer will be aligned to `32` bytes.
- ASMJIT_API virtual Error align(AlignMode alignMode, uint32_t alignment);
-
- //! \}
-
- //! \name Embed
- //! \{
-
- //! Embeds raw data into the \ref CodeBuffer.
- ASMJIT_API virtual Error embed(const void* data, size_t dataSize);
-
- //! Embeds a typed data array.
- //!
- //! This is the most flexible function for embedding data as it allows to:
- //!
- //! - Assign a `typeId` to the data, so the emitter knows the type of items stored in `data`. Binary data should
- //! use \ref TypeId::kUInt8.
- //!
- //! - Repeat the given data `repeatCount` times, so the data can be used as a fill pattern for example, or as a
- //! pattern used by SIMD instructions.
- ASMJIT_API virtual Error embedDataArray(TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1);
-
- //! Embeds int8_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedInt8(int8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt8, &value, 1, repeatCount); }
- //! Embeds uint8_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedUInt8(uint8_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt8, &value, 1, repeatCount); }
- //! Embeds int16_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedInt16(int16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt16, &value, 1, repeatCount); }
- //! Embeds uint16_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedUInt16(uint16_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt16, &value, 1, repeatCount); }
- //! Embeds int32_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedInt32(int32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt32, &value, 1, repeatCount); }
- //! Embeds uint32_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedUInt32(uint32_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt32, &value, 1, repeatCount); }
- //! Embeds int64_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedInt64(int64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kInt64, &value, 1, repeatCount); }
- //! Embeds uint64_t `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedUInt64(uint64_t value, size_t repeatCount = 1) { return embedDataArray(TypeId::kUInt64, &value, 1, repeatCount); }
- //! Embeds a floating point `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedFloat(float value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT<float>::kTypeId), &value, 1, repeatCount); }
- //! Embeds a floating point `value` repeated by `repeatCount`.
- ASMJIT_INLINE_NODEBUG Error embedDouble(double value, size_t repeatCount = 1) { return embedDataArray(TypeId(TypeUtils::TypeIdOfT<double>::kTypeId), &value, 1, repeatCount); }
-
- //! Embeds a constant pool at the current offset by performing the following:
- //! 1. Aligns by using AlignMode::kData to the minimum `pool` alignment.
- //! 2. Binds the ConstPool label so it's bound to an aligned location.
- //! 3. Emits ConstPool content.
- ASMJIT_API virtual Error embedConstPool(const Label& label, const ConstPool& pool);
-
- //! Embeds an absolute `label` address as data.
- //!
- //! The `dataSize` is an optional argument that can be used to specify the size of the address data. If it's zero
- //! (default) the address size is deduced from the target architecture (either 4 or 8 bytes).
- ASMJIT_API virtual Error embedLabel(const Label& label, size_t dataSize = 0);
-
- //! Embeds a delta (distance) between the `label` and `base` calculating it as `label - base`. This function was
- //! designed to make it easier to embed lookup tables where each index is a relative distance of two labels.
- ASMJIT_API virtual Error embedLabelDelta(const Label& label, const Label& base, size_t dataSize = 0);
-
- //! \}
-
- //! \name Comment
- //! \{
-
- //! Emits a comment stored in `data` with an optional `size` parameter.
- ASMJIT_API virtual Error comment(const char* data, size_t size = SIZE_MAX);
-
- //! Emits a formatted comment specified by `fmt` and variable number of arguments.
- ASMJIT_API Error commentf(const char* fmt, ...);
- //! Emits a formatted comment specified by `fmt` and `ap`.
- ASMJIT_API Error commentv(const char* fmt, va_list ap);
-
- //! \}
-
- //! \name Events
- //! \{
-
- //! Called after the emitter was attached to `CodeHolder`.
- ASMJIT_API virtual Error onAttach(CodeHolder* ASMJIT_NONNULL(code)) noexcept;
- //! Called after the emitter was detached from `CodeHolder`.
- ASMJIT_API virtual Error onDetach(CodeHolder* ASMJIT_NONNULL(code)) noexcept;
-
- //! Called when \ref CodeHolder has updated an important setting, which involves the following:
- //!
- //! - \ref Logger has been changed (\ref CodeHolder::setLogger() has been called).
- //!
- //! - \ref ErrorHandler has been changed (\ref CodeHolder::setErrorHandler() has been called).
- //!
- //! This function ensures that the settings are properly propagated from \ref CodeHolder to the emitter.
- //!
- //! \note This function is virtual and can be overridden, however, if you do so, always call \ref
- //! BaseEmitter::onSettingsUpdated() within your own implementation to ensure that the emitter is
- //! in a consistent state.
- ASMJIT_API virtual void onSettingsUpdated() noexcept;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_EMITTER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp b/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp
deleted file mode 100644
index d0a687244b3..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/emitterutils.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/assembler.h"
-#include "../core/emitterutils_p.h"
-#include "../core/formatter_p.h"
-#include "../core/logger.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-namespace EmitterUtils {
-
-#ifndef ASMJIT_NO_LOGGING
-
-Error finishFormattedLine(String& sb, const FormatOptions& formatOptions, const uint8_t* binData, size_t binSize, size_t offsetSize, size_t immSize, const char* comment) noexcept {
- ASMJIT_ASSERT(binSize >= offsetSize);
- const size_t kNoBinSize = SIZE_MAX;
-
- size_t commentSize = comment ? Support::strLen(comment, Globals::kMaxCommentSize) : 0;
-
- if ((binSize != 0 && binSize != kNoBinSize) || commentSize) {
- char sep = ';';
- size_t padding = Formatter::paddingFromOptions(formatOptions, FormatPaddingGroup::kRegularLine);
-
- for (size_t i = (binSize == kNoBinSize); i < 2; i++) {
- ASMJIT_PROPAGATE(sb.padEnd(padding));
-
- if (sep) {
- ASMJIT_PROPAGATE(sb.append(sep));
- ASMJIT_PROPAGATE(sb.append(' '));
- }
-
- // Append binary data or comment.
- if (i == 0) {
- ASMJIT_PROPAGATE(sb.appendHex(binData, binSize - offsetSize - immSize));
- ASMJIT_PROPAGATE(sb.appendChars('.', offsetSize * 2));
- ASMJIT_PROPAGATE(sb.appendHex(binData + binSize - immSize, immSize));
- if (commentSize == 0) break;
- }
- else {
- ASMJIT_PROPAGATE(sb.append(comment, commentSize));
- }
-
- sep = '|';
- padding += Formatter::paddingFromOptions(formatOptions, FormatPaddingGroup::kMachineCode);
- }
- }
-
- return sb.append('\n');
-}
-
-void logLabelBound(BaseAssembler* self, const Label& label) noexcept {
- Logger* logger = self->logger();
-
- StringTmp<512> sb;
- size_t binSize = logger->hasFlag(FormatFlags::kMachineCode) ? size_t(0) : SIZE_MAX;
-
- sb.appendChars(' ', logger->indentation(FormatIndentationGroup::kLabel));
- Formatter::formatLabel(sb, logger->flags(), self, label.id());
- sb.append(':');
- finishFormattedLine(sb, logger->options(), nullptr, binSize, 0, 0, self->_inlineComment);
- logger->log(sb.data(), sb.size());
-}
-
-void logInstructionEmitted(
- BaseAssembler* self,
- InstId instId,
- InstOptions options,
- const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
- uint32_t relSize, uint32_t immSize, uint8_t* afterCursor) {
-
- Logger* logger = self->logger();
- ASMJIT_ASSERT(logger != nullptr);
-
- StringTmp<256> sb;
- FormatFlags formatFlags = logger->flags();
-
- uint8_t* beforeCursor = self->bufferPtr();
- intptr_t emittedSize = (intptr_t)(afterCursor - beforeCursor);
-
- Operand_ opArray[Globals::kMaxOpCount];
- opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
-
- sb.appendChars(' ', logger->indentation(FormatIndentationGroup::kCode));
- self->_funcs.formatInstruction(sb, formatFlags, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
-
- if (Support::test(formatFlags, FormatFlags::kMachineCode))
- finishFormattedLine(sb, logger->options(), self->bufferPtr(), size_t(emittedSize), relSize, immSize, self->inlineComment());
- else
- finishFormattedLine(sb, logger->options(), nullptr, SIZE_MAX, 0, 0, self->inlineComment());
- logger->log(sb);
-}
-
-Error logInstructionFailed(
- BaseEmitter* self,
- Error err,
- InstId instId,
- InstOptions options,
- const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
-
- StringTmp<256> sb;
- sb.append(DebugUtils::errorAsString(err));
- sb.append(": ");
-
- Operand_ opArray[Globals::kMaxOpCount];
- opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
-
- self->_funcs.formatInstruction(sb, FormatFlags::kRegType, self, self->arch(), BaseInst(instId, options, self->extraReg()), opArray, Globals::kMaxOpCount);
-
- if (self->inlineComment()) {
- sb.append(" ; ");
- sb.append(self->inlineComment());
- }
-
- self->resetState();
- return self->reportError(err, sb.data());
-}
-
-#endif
-
-} // {EmitterUtils}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h b/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h
deleted file mode 100644
index 8b6e1e0547e..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/emitterutils_p.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
-#define ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
-
-#include "../core/emitter.h"
-#include "../core/operand.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-class BaseAssembler;
-class FormatOptions;
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_core
-//! \{
-
-//! Utilities used by various emitters, mostly Assembler implementations.
-namespace EmitterUtils {
-
-//! Default paddings used by Emitter utils and Formatter.
-
-static constexpr Operand noExt[3] = { {}, {}, {} };
-
-enum kOpIndex : uint32_t {
- kOp3 = 0,
- kOp4 = 1,
- kOp5 = 2
-};
-
-static ASMJIT_FORCE_INLINE uint32_t opCountFromEmitArgs(const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
- uint32_t opCount = 0;
-
- if (opExt[kOp3].isNone()) {
- if (!o0.isNone()) opCount = 1;
- if (!o1.isNone()) opCount = 2;
- if (!o2.isNone()) opCount = 3;
- }
- else {
- opCount = 4;
- if (!opExt[kOp4].isNone()) {
- opCount = 5 + uint32_t(!opExt[kOp5].isNone());
- }
- }
-
- return opCount;
-}
-
-static ASMJIT_FORCE_INLINE void opArrayFromEmitArgs(Operand_ dst[Globals::kMaxOpCount], const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) noexcept {
- dst[0].copyFrom(o0);
- dst[1].copyFrom(o1);
- dst[2].copyFrom(o2);
- dst[3].copyFrom(opExt[kOp3]);
- dst[4].copyFrom(opExt[kOp4]);
- dst[5].copyFrom(opExt[kOp5]);
-}
-
-#ifndef ASMJIT_NO_LOGGING
-Error finishFormattedLine(String& sb, const FormatOptions& formatOptions, const uint8_t* binData, size_t binSize, size_t offsetSize, size_t immSize, const char* comment) noexcept;
-
-void logLabelBound(BaseAssembler* self, const Label& label) noexcept;
-
-void logInstructionEmitted(
- BaseAssembler* self,
- InstId instId,
- InstOptions options,
- const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt,
- uint32_t relSize, uint32_t immSize, uint8_t* afterCursor);
-
-Error logInstructionFailed(
- BaseEmitter* self,
- Error err,
- InstId instId,
- InstOptions options,
- const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt);
-#endif
-
-}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_EMITTERUTILS_P_H_INCLUDED
-
diff --git a/3rdparty/asmjit/src/asmjit/core/environment.cpp b/3rdparty/asmjit/src/asmjit/core/environment.cpp
deleted file mode 100644
index 9a694af610e..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/environment.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/environment.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// X86 Target
-// ----------
-//
-// - 32-bit - Linux, OSX, BSD, and apparently also Haiku guarantee 16-byte
-// stack alignment. Other operating systems are assumed to have
-// 4-byte alignment by default for safety reasons.
-// - 64-bit - stack must be aligned to 16 bytes.
-//
-// ARM Target
-// ----------
-//
-// - 32-bit - Stack must be aligned to 8 bytes.
-// - 64-bit - Stack must be aligned to 16 bytes (hardware requirement).
-uint32_t Environment::stackAlignment() const noexcept {
- if (is64Bit()) {
- // Assume 16-byte alignment on any 64-bit target.
- return 16;
- }
- else {
- // The following platforms use 16-byte alignment in 32-bit mode.
- if (isPlatformLinux() ||
- isPlatformBSD() ||
- isPlatformApple() ||
- isPlatformHaiku()) {
- return 16u;
- }
-
- if (isFamilyARM())
- return 8;
-
- // Bail to 4-byte alignment if we don't know.
- return 4;
- }
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/environment.h b/3rdparty/asmjit/src/asmjit/core/environment.h
deleted file mode 100644
index c3678dc65bc..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/environment.h
+++ /dev/null
@@ -1,534 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
-#define ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
-
-#include "../core/archtraits.h"
-
-#if defined(__APPLE__)
- #include <TargetConditionals.h>
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! Vendor.
-//!
-//! \note AsmJit doesn't use vendor information at the moment. It's provided for future use, if required.
-enum class Vendor : uint8_t {
- //! Unknown or uninitialized platform vendor.
- kUnknown = 0,
-
- //! Maximum value of `Vendor`.
- kMaxValue = kUnknown,
-
- //! Platform vendor detected at compile-time.
- kHost =
-#if defined(_DOXYGEN)
- DETECTED_AT_COMPILE_TIME
-#else
- kUnknown
-#endif
-};
-
-//! Platform - runtime environment or operating system.
-enum class Platform : uint8_t {
- //! Unknown or uninitialized platform.
- kUnknown = 0,
-
- //! Windows OS.
- kWindows,
-
- //! Other platform that is not Windows, most likely POSIX based.
- kOther,
-
- //! Linux OS.
- kLinux,
- //! GNU/Hurd OS.
- kHurd,
-
- //! FreeBSD OS.
- kFreeBSD,
- //! OpenBSD OS.
- kOpenBSD,
- //! NetBSD OS.
- kNetBSD,
- //! DragonFly BSD OS.
- kDragonFlyBSD,
-
- //! Haiku OS.
- kHaiku,
-
- //! Apple OSX.
- kOSX,
- //! Apple iOS.
- kIOS,
- //! Apple TVOS.
- kTVOS,
- //! Apple WatchOS.
- kWatchOS,
-
- //! Emscripten platform.
- kEmscripten,
-
- //! Maximum value of `Platform`.
- kMaxValue = kEmscripten,
-
- //! Platform detected at compile-time (platform of the host).
- kHost =
-#if defined(_DOXYGEN)
- DETECTED_AT_COMPILE_TIME
-#elif defined(__EMSCRIPTEN__)
- kEmscripten
-#elif defined(_WIN32)
- kWindows
-#elif defined(__linux__)
- kLinux
-#elif defined(__gnu_hurd__)
- kHurd
-#elif defined(__FreeBSD__)
- kFreeBSD
-#elif defined(__OpenBSD__)
- kOpenBSD
-#elif defined(__NetBSD__)
- kNetBSD
-#elif defined(__DragonFly__)
- kDragonFlyBSD
-#elif defined(__HAIKU__)
- kHaiku
-#elif defined(__APPLE__) && TARGET_OS_OSX
- kOSX
-#elif defined(__APPLE__) && TARGET_OS_TV
- kTVOS
-#elif defined(__APPLE__) && TARGET_OS_WATCH
- kWatchOS
-#elif defined(__APPLE__) && TARGET_OS_IPHONE
- kIOS
-#else
- kOther
-#endif
-};
-
-//! Platform ABI (application binary interface).
-enum class PlatformABI : uint8_t {
- //! Unknown or uninitialized environment.
- kUnknown = 0,
- //! Microsoft ABI.
- kMSVC,
- //! GNU ABI.
- kGNU,
- //! Android Environment / ABI.
- kAndroid,
- //! Cygwin ABI.
- kCygwin,
- //! Darwin ABI.
- kDarwin,
-
- //! Maximum value of `PlatformABI`.
- kMaxValue,
-
- //! Host ABI detected at compile-time.
- kHost =
-#if defined(_DOXYGEN)
- DETECTED_AT_COMPILE_TIME
-#elif defined(_MSC_VER)
- kMSVC
-#elif defined(__CYGWIN__)
- kCygwin
-#elif defined(__MINGW32__) || defined(__GLIBC__)
- kGNU
-#elif defined(__ANDROID__)
- kAndroid
-#elif defined(__APPLE__)
- kDarwin
-#else
- kUnknown
-#endif
-};
-
-//! Floating point ABI (ARM).
-enum class FloatABI : uint8_t {
- kHardFloat = 0,
- kSoftFloat,
-
- kHost =
-#if ASMJIT_ARCH_ARM == 32 && defined(__SOFTFP__)
- kSoftFloat
-#else
- kHardFloat
-#endif
-};
-
-//! Object format.
-//!
-//! \note AsmJit doesn't really use anything except \ref ObjectFormat::kUnknown and \ref ObjectFormat::kJIT at
-//! the moment. Object file formats are provided for future extensibility and a possibility to generate object
-//! files at some point.
-enum class ObjectFormat : uint8_t {
- //! Unknown or uninitialized object format.
- kUnknown = 0,
-
- //! JIT code generation object, most likely \ref JitRuntime or a custom
- //! \ref Target implementation.
- kJIT,
-
- //! Executable and linkable format (ELF).
- kELF,
- //! Common object file format.
- kCOFF,
- //! Extended COFF object format.
- kXCOFF,
- //! Mach object file format.
- kMachO,
-
- //! Maximum value of `ObjectFormat`.
- kMaxValue
-};
-
-//! Represents an environment, which is usually related to a \ref Target.
-//!
-//! Environment has usually an 'arch-subarch-vendor-os-abi' format, which is sometimes called "Triple" (historically
-//! it used to be 3 only parts) or "Tuple", which is a convention used by Debian Linux.
-//!
-//! AsmJit doesn't support all possible combinations or architectures and ABIs, however, it models the environment
-//! similarly to other compilers for future extensibility.
-class Environment {
-public:
- //! \name Members
- //! \{
-
- //! Architecture.
- Arch _arch = Arch::kUnknown;
- //! Sub-architecture type.
- SubArch _subArch = SubArch::kUnknown;
- //! Vendor type.
- Vendor _vendor = Vendor::kUnknown;
- //! Platform.
- Platform _platform = Platform::kUnknown;
- //! Platform ABI.
- PlatformABI _platformABI = PlatformABI::kUnknown;
- //! Object format.
- ObjectFormat _objectFormat = ObjectFormat::kUnknown;
- //! Floating point ABI.
- FloatABI _floatABI = FloatABI::kHardFloat;
- //! Reserved for future use, must be zero.
- uint8_t _reserved = 0;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a default initialized environment (all values either unknown or set to safe defaults).
- ASMJIT_INLINE_NODEBUG constexpr Environment() noexcept = default;
- //! Creates a copy of `other` instance.
- ASMJIT_INLINE_NODEBUG constexpr Environment(const Environment& other) noexcept = default;
-
- //! Creates \ref Environment initialized to `arch`, `subArch`, `vendor`, `platform`, `platformABI`, `objectFormat`,
- //! and `floatABI`.
- ASMJIT_INLINE_NODEBUG constexpr explicit Environment(
- Arch arch,
- SubArch subArch = SubArch::kUnknown,
- Vendor vendor = Vendor::kUnknown,
- Platform platform = Platform::kUnknown,
- PlatformABI platformABI = PlatformABI::kUnknown,
- ObjectFormat objectFormat = ObjectFormat::kUnknown,
- FloatABI floatABI = FloatABI::kHardFloat) noexcept
- : _arch(arch),
- _subArch(subArch),
- _vendor(vendor),
- _platform(platform),
- _platformABI(platformABI),
- _objectFormat(objectFormat),
- _floatABI(floatABI) {}
-
- //! Returns the host environment constructed from preprocessor macros defined by the compiler.
- //!
- //! The returned environment should precisely match the target host architecture, sub-architecture, platform,
- //! and ABI.
- static ASMJIT_INLINE_NODEBUG Environment host() noexcept {
- return Environment(Arch::kHost, SubArch::kHost, Vendor::kHost, Platform::kHost, PlatformABI::kHost, ObjectFormat::kUnknown, FloatABI::kHost);
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG Environment& operator=(const Environment& other) noexcept = default;
-
- ASMJIT_INLINE_NODEBUG bool operator==(const Environment& other) const noexcept { return equals(other); }
- ASMJIT_INLINE_NODEBUG bool operator!=(const Environment& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the environment is not set up.
- //!
- //! Returns true if all members are zero, and thus unknown.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept {
- // Unfortunately compilers won't optimize fields are checked one by one...
- return _packed() == 0;
- }
-
- //! Tests whether the environment is initialized, which means it must have
- //! a valid architecture.
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept {
- return _arch != Arch::kUnknown;
- }
-
- ASMJIT_INLINE_NODEBUG uint64_t _packed() const noexcept {
- uint64_t x;
- memcpy(&x, this, 8);
- return x;
- }
-
- //! Resets all members of the environment to zero / unknown.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Environment{}; }
-
- //! Tests whether this environment is equal to `other`.
- ASMJIT_INLINE_NODEBUG bool equals(const Environment& other) const noexcept { return _packed() == other._packed(); }
-
- //! Returns the architecture.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
- //! Returns the sub-architecture.
- ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return _subArch; }
- //! Returns vendor.
- ASMJIT_INLINE_NODEBUG Vendor vendor() const noexcept { return _vendor; }
- //! Returns target's platform or operating system.
- ASMJIT_INLINE_NODEBUG Platform platform() const noexcept { return _platform; }
- //! Returns target's ABI.
- ASMJIT_INLINE_NODEBUG PlatformABI platformABI() const noexcept { return _platformABI; }
- //! Returns target's object format.
- ASMJIT_INLINE_NODEBUG ObjectFormat objectFormat() const noexcept { return _objectFormat; }
- //! Returns floating point ABI.
- ASMJIT_INLINE_NODEBUG FloatABI floatABI() const noexcept { return _floatABI; }
-
- //! Initializes \ref Environment to `arch`, `subArch`, `vendor`, `platform`, `platformABI`, `objectFormat`,
- //! and `floatABI`.
- inline void init(
- Arch arch,
- SubArch subArch = SubArch::kUnknown,
- Vendor vendor = Vendor::kUnknown,
- Platform platform = Platform::kUnknown,
- PlatformABI platformABI = PlatformABI::kUnknown,
- ObjectFormat objectFormat = ObjectFormat::kUnknown,
- FloatABI floatABI = FloatABI::kHardFloat) noexcept {
-
- _arch = arch;
- _subArch = subArch;
- _vendor = vendor;
- _platform = platform;
- _platformABI = platformABI;
- _objectFormat = objectFormat;
- _floatABI = floatABI;
- _reserved = 0;
- }
-
- //! Tests whether this environment describes a 32-bit X86.
- ASMJIT_INLINE_NODEBUG bool isArchX86() const noexcept { return _arch == Arch::kX86; }
- //! Tests whether this environment describes a 64-bit X86.
- ASMJIT_INLINE_NODEBUG bool isArchX64() const noexcept { return _arch == Arch::kX64; }
- //! Tests whether this environment describes a 32-bit ARM.
- ASMJIT_INLINE_NODEBUG bool isArchARM() const noexcept { return isArchARM(_arch); }
- //! Tests whether this environment describes a 32-bit ARM in THUMB mode.
- ASMJIT_INLINE_NODEBUG bool isArchThumb() const noexcept { return isArchThumb(_arch); }
- //! Tests whether this environment describes a 64-bit X86.
- ASMJIT_INLINE_NODEBUG bool isArchAArch64() const noexcept { return isArchAArch64(_arch); }
- //! Tests whether this environment describes a 32-bit MIPS.
- ASMJIT_INLINE_NODEBUG bool isArchMIPS32() const noexcept { return isArchMIPS32(_arch); }
- //! Tests whether this environment describes a 64-bit MIPS.
- ASMJIT_INLINE_NODEBUG bool isArchMIPS64() const noexcept { return isArchMIPS64(_arch); }
- //! Tests whether this environment describes a 32-bit RISC-V.
- ASMJIT_INLINE_NODEBUG bool isArchRISCV32() const noexcept { return _arch == Arch::kRISCV32; }
- //! Tests whether this environment describes a 64-bit RISC-V.
- ASMJIT_INLINE_NODEBUG bool isArchRISCV64() const noexcept { return _arch == Arch::kRISCV64; }
-
- //! Tests whether the architecture is 32-bit.
- ASMJIT_INLINE_NODEBUG bool is32Bit() const noexcept { return is32Bit(_arch); }
- //! Tests whether the architecture is 64-bit.
- ASMJIT_INLINE_NODEBUG bool is64Bit() const noexcept { return is64Bit(_arch); }
-
- //! Tests whether the architecture is little endian.
- ASMJIT_INLINE_NODEBUG bool isLittleEndian() const noexcept { return isLittleEndian(_arch); }
- //! Tests whether the architecture is big endian.
- ASMJIT_INLINE_NODEBUG bool isBigEndian() const noexcept { return isBigEndian(_arch); }
-
- //! Tests whether this architecture is of X86 family.
- ASMJIT_INLINE_NODEBUG bool isFamilyX86() const noexcept { return isFamilyX86(_arch); }
- //! Tests whether this architecture family is ARM, THUMB, or AArch64.
- ASMJIT_INLINE_NODEBUG bool isFamilyARM() const noexcept { return isFamilyARM(_arch); }
- //! Tests whether this architecture family is AArch32 (ARM or THUMB).
- ASMJIT_INLINE_NODEBUG bool isFamilyAArch32() const noexcept { return isFamilyAArch32(_arch); }
- //! Tests whether this architecture family is AArch64.
- ASMJIT_INLINE_NODEBUG bool isFamilyAArch64() const noexcept { return isFamilyAArch64(_arch); }
- //! Tests whether this architecture family is MISP or MIPS64.
- ASMJIT_INLINE_NODEBUG bool isFamilyMIPS() const noexcept { return isFamilyMIPS(_arch); }
- //! Tests whether this architecture family is RISC-V (both 32-bit and 64-bit).
- ASMJIT_INLINE_NODEBUG bool isFamilyRISCV() const noexcept { return isFamilyRISCV(_arch); }
-
- //! Tests whether the environment platform is Windows.
- ASMJIT_INLINE_NODEBUG bool isPlatformWindows() const noexcept { return _platform == Platform::kWindows; }
- //! Tests whether the environment platform is Linux.
- ASMJIT_INLINE_NODEBUG bool isPlatformLinux() const noexcept { return _platform == Platform::kLinux; }
- //! Tests whether the environment platform is Hurd.
- ASMJIT_INLINE_NODEBUG bool isPlatformHurd() const noexcept { return _platform == Platform::kHurd; }
- //! Tests whether the environment platform is Haiku.
- ASMJIT_INLINE_NODEBUG bool isPlatformHaiku() const noexcept { return _platform == Platform::kHaiku; }
-
- //! Tests whether the environment platform is any BSD.
- ASMJIT_INLINE_NODEBUG bool isPlatformBSD() const noexcept {
- return _platform == Platform::kFreeBSD ||
- _platform == Platform::kOpenBSD ||
- _platform == Platform::kNetBSD ||
- _platform == Platform::kDragonFlyBSD;
- }
-
- //! Tests whether the environment platform is any Apple platform (OSX, iOS, TVOS, WatchOS).
- ASMJIT_INLINE_NODEBUG bool isPlatformApple() const noexcept {
- return _platform == Platform::kOSX ||
- _platform == Platform::kIOS ||
- _platform == Platform::kTVOS ||
- _platform == Platform::kWatchOS;
- }
-
- //! Tests whether the ABI is MSVC.
- ASMJIT_INLINE_NODEBUG bool isMSVC() const noexcept { return _platformABI == PlatformABI::kMSVC; }
- //! Tests whether the ABI is GNU.
- ASMJIT_INLINE_NODEBUG bool isGNU() const noexcept { return _platformABI == PlatformABI::kGNU; }
- //! Tests whether the ABI is GNU.
- ASMJIT_INLINE_NODEBUG bool isDarwin() const noexcept { return _platformABI == PlatformABI::kDarwin; }
-
- //! Returns a calculated stack alignment for this environment.
- ASMJIT_API uint32_t stackAlignment() const noexcept;
-
- //! Returns a native register size of this architecture.
- ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return registerSizeFromArch(_arch); }
-
- //! Sets the architecture to `arch`.
- ASMJIT_INLINE_NODEBUG void setArch(Arch arch) noexcept { _arch = arch; }
- //! Sets the sub-architecture to `subArch`.
- ASMJIT_INLINE_NODEBUG void setSubArch(SubArch subArch) noexcept { _subArch = subArch; }
- //! Sets the vendor to `vendor`.
- ASMJIT_INLINE_NODEBUG void setVendor(Vendor vendor) noexcept { _vendor = vendor; }
- //! Sets the platform to `platform`.
- ASMJIT_INLINE_NODEBUG void setPlatform(Platform platform) noexcept { _platform = platform; }
- //! Sets the ABI to `platformABI`.
- ASMJIT_INLINE_NODEBUG void setPlatformABI(PlatformABI platformABI) noexcept { _platformABI = platformABI; }
- //! Sets the object format to `objectFormat`.
- ASMJIT_INLINE_NODEBUG void setObjectFormat(ObjectFormat objectFormat) noexcept { _objectFormat = objectFormat; }
-
- //! Sets floating point ABI to `floatABI`.
- ASMJIT_INLINE_NODEBUG void setFloatABI(FloatABI floatABI) noexcept { _floatABI = floatABI; }
-
- //! \}
-
- //! \name Static Utilities
- //! \{
-
- static ASMJIT_INLINE_NODEBUG bool isDefinedArch(Arch arch) noexcept {
- return uint32_t(arch) <= uint32_t(Arch::kMaxValue);
- }
-
- static ASMJIT_INLINE_NODEBUG bool isValidArch(Arch arch) noexcept {
- return arch != Arch::kUnknown && uint32_t(arch) <= uint32_t(Arch::kMaxValue);
- }
-
- //! Tests whether the given architecture `arch` is 32-bit.
- static ASMJIT_INLINE_NODEBUG bool is32Bit(Arch arch) noexcept {
- return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == uint32_t(Arch::k32BitMask);
- }
-
- //! Tests whether the given architecture `arch` is 64-bit.
- static ASMJIT_INLINE_NODEBUG bool is64Bit(Arch arch) noexcept {
- return (uint32_t(arch) & uint32_t(Arch::k32BitMask)) == 0;
- }
-
- //! Tests whether the given architecture `arch` is little endian.
- static ASMJIT_INLINE_NODEBUG bool isLittleEndian(Arch arch) noexcept {
- return uint32_t(arch) < uint32_t(Arch::kBigEndian);
- }
-
- //! Tests whether the given architecture `arch` is big endian.
- static ASMJIT_INLINE_NODEBUG bool isBigEndian(Arch arch) noexcept {
- return uint32_t(arch) >= uint32_t(Arch::kBigEndian);
- }
-
- //! Tests whether the given architecture is Thumb or Thumb_BE.
- static ASMJIT_INLINE_NODEBUG bool isArchThumb(Arch arch) noexcept {
- return arch == Arch::kThumb || arch == Arch::kThumb_BE;
- }
-
- //! Tests whether the given architecture is ARM or ARM_BE.
- static ASMJIT_INLINE_NODEBUG bool isArchARM(Arch arch) noexcept {
- return arch == Arch::kARM || arch == Arch::kARM_BE;
- }
-
- //! Tests whether the given architecture is AArch64 or AArch64_BE.
- static ASMJIT_INLINE_NODEBUG bool isArchAArch64(Arch arch) noexcept {
- return arch == Arch::kAArch64 || arch == Arch::kAArch64_BE;
- }
-
- //! Tests whether the given architecture is MIPS32_LE or MIPS32_BE.
- static ASMJIT_INLINE_NODEBUG bool isArchMIPS32(Arch arch) noexcept {
- return arch == Arch::kMIPS32_LE || arch == Arch::kMIPS32_BE;
- }
-
- //! Tests whether the given architecture is MIPS64_LE or MIPS64_BE.
- static ASMJIT_INLINE_NODEBUG bool isArchMIPS64(Arch arch) noexcept {
- return arch == Arch::kMIPS64_LE || arch == Arch::kMIPS64_BE;
- }
-
- //! Tests whether the given architecture family is X86 or X64.
- static ASMJIT_INLINE_NODEBUG bool isFamilyX86(Arch arch) noexcept {
- return arch == Arch::kX86 || arch == Arch::kX64;
- }
-
- //! Tests whether the given architecture family is AArch32 (ARM or THUMB).
- static ASMJIT_INLINE_NODEBUG bool isFamilyAArch32(Arch arch) noexcept {
- return isArchARM(arch) || isArchThumb(arch);
- }
-
- //! Tests whether the given architecture family is AArch64.
- static ASMJIT_INLINE_NODEBUG bool isFamilyAArch64(Arch arch) noexcept {
- return isArchAArch64(arch);
- }
-
- //! Tests whether the given architecture family is ARM, THUMB, or AArch64.
- static ASMJIT_INLINE_NODEBUG bool isFamilyARM(Arch arch) noexcept {
- return isFamilyAArch32(arch) || isFamilyAArch64(arch);
- }
-
- //! Tests whether the given architecture family is MIPS or MIPS64.
- static ASMJIT_INLINE_NODEBUG bool isFamilyMIPS(Arch arch) noexcept {
- return isArchMIPS32(arch) || isArchMIPS64(arch);
- }
-
- //! Tests whether the given architecture family is RISC-V (both 32-bit and 64-bit).
- static ASMJIT_INLINE_NODEBUG bool isFamilyRISCV(Arch arch) noexcept {
- return arch == Arch::kRISCV32 || arch == Arch::kRISCV64;
- }
-
- //! Returns a native general purpose register size from the given architecture.
- static ASMJIT_INLINE_NODEBUG uint32_t registerSizeFromArch(Arch arch) noexcept {
- return is32Bit(arch) ? 4u : 8u;
- }
-
- //! \}
-};
-
-static_assert(sizeof(Environment) == 8,
- "Environment must occupy exactly 8 bytes.");
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ENVIRONMENT_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp b/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp
deleted file mode 100644
index ce2ad016af1..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/errorhandler.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/errorhandler.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-ErrorHandler::ErrorHandler() noexcept {}
-ErrorHandler::~ErrorHandler() noexcept {}
-
-void ErrorHandler::handleError(Error err, const char* message, BaseEmitter* origin) {
- DebugUtils::unused(err, message, origin);
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/formatter.cpp b/3rdparty/asmjit/src/asmjit/core/formatter.cpp
deleted file mode 100644
index 0f12e416364..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/formatter.cpp
+++ /dev/null
@@ -1,584 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_LOGGING
-
-#include "../core/archtraits.h"
-#include "../core/builder.h"
-#include "../core/codeholder.h"
-#include "../core/compiler.h"
-#include "../core/emitter.h"
-#include "../core/formatter_p.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/type.h"
-
-#if !defined(ASMJIT_NO_X86)
- #include "../x86/x86formatter_p.h"
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- #include "../arm/a64formatter_p.h"
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-#if defined(ASMJIT_NO_COMPILER)
-class VirtReg;
-#endif
-
-namespace Formatter {
-
-static const char wordNameTable[][8] = {
- "db",
- "dw",
- "dd",
- "dq",
- "byte",
- "half",
- "word",
- "hword",
- "dword",
- "qword",
- "xword",
- "short",
- "long",
- "quad"
-};
-
-
-Error formatTypeId(String& sb, TypeId typeId) noexcept {
- if (typeId == TypeId::kVoid)
- return sb.append("void");
-
- if (!TypeUtils::isValid(typeId))
- return sb.append("unknown");
-
- const char* typeName = nullptr;
- uint32_t typeSize = TypeUtils::sizeOf(typeId);
- TypeId scalarType = TypeUtils::scalarOf(typeId);
-
- switch (scalarType) {
- case TypeId::kIntPtr : typeName = "intptr" ; break;
- case TypeId::kUIntPtr: typeName = "uintptr"; break;
- case TypeId::kInt8 : typeName = "int8" ; break;
- case TypeId::kUInt8 : typeName = "uint8" ; break;
- case TypeId::kInt16 : typeName = "int16" ; break;
- case TypeId::kUInt16 : typeName = "uint16" ; break;
- case TypeId::kInt32 : typeName = "int32" ; break;
- case TypeId::kUInt32 : typeName = "uint32" ; break;
- case TypeId::kInt64 : typeName = "int64" ; break;
- case TypeId::kUInt64 : typeName = "uint64" ; break;
- case TypeId::kFloat32: typeName = "float32"; break;
- case TypeId::kFloat64: typeName = "float64"; break;
- case TypeId::kFloat80: typeName = "float80"; break;
- case TypeId::kMask8 : typeName = "mask8" ; break;
- case TypeId::kMask16 : typeName = "mask16" ; break;
- case TypeId::kMask32 : typeName = "mask32" ; break;
- case TypeId::kMask64 : typeName = "mask64" ; break;
- case TypeId::kMmx32 : typeName = "mmx32" ; break;
- case TypeId::kMmx64 : typeName = "mmx64" ; break;
-
- default:
- typeName = "unknown";
- break;
- }
-
- uint32_t baseSize = TypeUtils::sizeOf(scalarType);
- if (typeSize > baseSize) {
- uint32_t count = typeSize / baseSize;
- return sb.appendFormat("%sx%u", typeName, unsigned(count));
- }
- else {
- return sb.append(typeName);
- }
-}
-
-Error formatFeature(
- String& sb,
- Arch arch,
- uint32_t featureId) noexcept {
-
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::FormatterInternal::formatFeature(sb, featureId);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyARM(arch))
- return arm::FormatterInternal::formatFeature(sb, featureId);
-#endif
-
- return kErrorInvalidArch;
-}
-
-Error formatLabel(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- uint32_t labelId) noexcept {
-
- DebugUtils::unused(formatFlags);
-
- if (emitter && emitter->code()) {
- const LabelEntry* le = emitter->code()->labelEntry(labelId);
- if (ASMJIT_UNLIKELY(!le))
- return sb.appendFormat("<InvalidLabel:%u>", labelId);
-
- if (le->hasName()) {
- if (le->hasParent()) {
- uint32_t parentId = le->parentId();
- const LabelEntry* pe = emitter->code()->labelEntry(parentId);
-
- if (ASMJIT_UNLIKELY(!pe))
- ASMJIT_PROPAGATE(sb.appendFormat("<InvalidLabel:%u>", labelId));
- else if (ASMJIT_UNLIKELY(!pe->hasName()))
- ASMJIT_PROPAGATE(sb.appendFormat("L%u", parentId));
- else
- ASMJIT_PROPAGATE(sb.append(pe->name()));
-
- ASMJIT_PROPAGATE(sb.append('.'));
- }
-
- if (le->type() == LabelType::kAnonymous)
- ASMJIT_PROPAGATE(sb.appendFormat("L%u@", labelId));
- return sb.append(le->name());
- }
- }
-
- return sb.appendFormat("L%u", labelId);
-}
-
-Error formatRegister(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t regId) noexcept {
-
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyARM(arch))
- return arm::FormatterInternal::formatRegister(sb, formatFlags, emitter, arch, regType, regId);
-#endif
-
- return kErrorInvalidArch;
-}
-
-Error formatOperand(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const Operand_& op) noexcept {
-
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyARM(arch))
- return arm::FormatterInternal::formatOperand(sb, formatFlags, emitter, arch, op);
-#endif
-
- return kErrorInvalidArch;
-}
-
-ASMJIT_API Error formatDataType(
- String& sb,
- FormatFlags formatFlags,
- Arch arch,
- TypeId typeId) noexcept
-{
- DebugUtils::unused(formatFlags);
-
- if (ASMJIT_UNLIKELY(uint32_t(arch) > uint32_t(Arch::kMaxValue)))
- return DebugUtils::errored(kErrorInvalidArch);
-
- uint32_t typeSize = TypeUtils::sizeOf(typeId);
- if (typeSize == 0 || typeSize > 8)
- return DebugUtils::errored(kErrorInvalidState);
-
- uint32_t typeSizeLog2 = Support::ctz(typeSize);
- return sb.append(wordNameTable[size_t(ArchTraits::byArch(arch).typeNameIdByIndex(typeSizeLog2))]);
-}
-
-static Error formatDataHelper(String& sb, const char* typeName, uint32_t typeSize, const uint8_t* data, size_t itemCount) noexcept {
- sb.append('.');
- sb.append(typeName);
- sb.append(' ');
-
- for (size_t i = 0; i < itemCount; i++) {
- uint64_t v = 0;
-
- if (i != 0)
- ASMJIT_PROPAGATE(sb.append(", ", 2));
-
- switch (typeSize) {
- case 1: v = data[0]; break;
- case 2: v = Support::readU16u(data); break;
- case 4: v = Support::readU32u(data); break;
- case 8: v = Support::readU64u(data); break;
- }
-
- ASMJIT_PROPAGATE(sb.appendUInt(v, 16, typeSize * 2, StringFormatFlags::kAlternate));
- data += typeSize;
- }
-
- return kErrorOk;
-}
-
-Error formatData(
- String& sb,
- FormatFlags formatFlags,
- Arch arch,
- TypeId typeId, const void* data, size_t itemCount, size_t repeatCount) noexcept
-{
- DebugUtils::unused(formatFlags);
-
- if (ASMJIT_UNLIKELY(!Environment::isDefinedArch(arch)))
- return DebugUtils::errored(kErrorInvalidArch);
-
- uint32_t typeSize = TypeUtils::sizeOf(typeId);
- if (typeSize == 0)
- return DebugUtils::errored(kErrorInvalidState);
-
- if (!Support::isPowerOf2(typeSize)) {
- itemCount *= typeSize;
- typeSize = 1;
- }
-
- while (typeSize > 8u) {
- typeSize >>= 1;
- itemCount <<= 1;
- }
-
- uint32_t typeSizeLog2 = Support::ctz(typeSize);
- const char* wordName = wordNameTable[size_t(ArchTraits::byArch(arch).typeNameIdByIndex(typeSizeLog2))];
-
- if (repeatCount > 1)
- ASMJIT_PROPAGATE(sb.appendFormat(".repeat %zu ", repeatCount));
-
- return formatDataHelper(sb, wordName, typeSize, static_cast<const uint8_t*>(data), itemCount);
-}
-
-Error formatInstruction(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
-
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::FormatterInternal::formatInstruction(sb, formatFlags, emitter, arch, inst, operands, opCount);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyAArch64(arch))
- return a64::FormatterInternal::formatInstruction(sb, formatFlags, emitter, arch, inst, operands, opCount);
-#endif
-
- return kErrorInvalidArch;
-}
-
-#ifndef ASMJIT_NO_BUILDER
-
-#ifndef ASMJIT_NO_COMPILER
-static Error formatFuncValue(String& sb, FormatFlags formatFlags, const BaseEmitter* emitter, FuncValue value) noexcept {
- TypeId typeId = value.typeId();
- ASMJIT_PROPAGATE(formatTypeId(sb, typeId));
-
- if (value.isAssigned()) {
- ASMJIT_PROPAGATE(sb.append('@'));
-
- if (value.isIndirect())
- ASMJIT_PROPAGATE(sb.append('['));
-
- // NOTE: It should be either reg or stack, but never both. We
- // use two IFs on purpose so if the FuncValue is both it would
- // show in logs.
- if (value.isReg()) {
- ASMJIT_PROPAGATE(formatRegister(sb, formatFlags, emitter, emitter->arch(), value.regType(), value.regId()));
- }
-
- if (value.isStack()) {
- ASMJIT_PROPAGATE(sb.appendFormat("[%d]", int(value.stackOffset())));
- }
-
- if (value.isIndirect())
- ASMJIT_PROPAGATE(sb.append(']'));
- }
-
- return kErrorOk;
-}
-
-static Error formatFuncValuePack(
- String& sb,
- FormatFlags formatFlags,
- const BaseCompiler* cc,
- const FuncValuePack& pack,
- const RegOnly* vRegs) noexcept {
-
- size_t count = pack.count();
- if (!count)
- return sb.append("void");
-
- if (count > 1)
- sb.append('[');
-
- for (uint32_t valueIndex = 0; valueIndex < count; valueIndex++) {
- const FuncValue& value = pack[valueIndex];
- if (!value)
- break;
-
- if (valueIndex)
- ASMJIT_PROPAGATE(sb.append(", "));
-
- ASMJIT_PROPAGATE(formatFuncValue(sb, formatFlags, cc, value));
-
- if (vRegs) {
- const VirtReg* virtReg = nullptr;
- static const char nullReg[] = "<none>";
-
- if (vRegs[valueIndex].isReg() && cc->isVirtIdValid(vRegs[valueIndex].id()))
- virtReg = cc->virtRegById(vRegs[valueIndex].id());
-
- ASMJIT_PROPAGATE(sb.appendFormat(" %s", virtReg ? virtReg->name() : nullReg));
- }
- }
-
- if (count > 1)
- sb.append(']');
-
- return kErrorOk;
-}
-
-static Error formatFuncRets(
- String& sb,
- FormatFlags formatFlags,
- const BaseCompiler* cc,
- const FuncDetail& fd) noexcept {
-
- return formatFuncValuePack(sb, formatFlags, cc, fd.retPack(), nullptr);
-}
-
-static Error formatFuncArgs(
- String& sb,
- FormatFlags formatFlags,
- const BaseCompiler* cc,
- const FuncDetail& fd,
- const FuncNode::ArgPack* argPacks) noexcept {
-
- uint32_t argCount = fd.argCount();
- if (!argCount)
- return sb.append("void");
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- if (argIndex)
- ASMJIT_PROPAGATE(sb.append(", "));
-
- ASMJIT_PROPAGATE(formatFuncValuePack(sb, formatFlags, cc, fd.argPack(argIndex), argPacks[argIndex]._data));
- }
-
- return kErrorOk;
-}
-#endif
-
-Error formatNode(
- String& sb,
- const FormatOptions& formatOptions,
- const BaseBuilder* builder,
- const BaseNode* node) noexcept {
-
- if (node->hasPosition() && formatOptions.hasFlag(FormatFlags::kPositions))
- ASMJIT_PROPAGATE(sb.appendFormat("<%05u> ", node->position()));
-
- size_t startLineIndex = sb.size();
-
- switch (node->type()) {
- case NodeType::kInst:
- case NodeType::kJump: {
- const InstNode* instNode = node->as<InstNode>();
- ASMJIT_PROPAGATE(builder->_funcs.formatInstruction(sb, formatOptions.flags(), builder,
- builder->arch(),
- instNode->baseInst(), instNode->operands(), instNode->opCount()));
- break;
- }
-
- case NodeType::kSection: {
- const SectionNode* sectionNode = node->as<SectionNode>();
- if (builder->_code->isSectionValid(sectionNode->id())) {
- const Section* section = builder->_code->sectionById(sectionNode->id());
- ASMJIT_PROPAGATE(sb.appendFormat(".section %s", section->name()));
- }
- break;
- }
-
- case NodeType::kLabel: {
- const LabelNode* labelNode = node->as<LabelNode>();
- ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, labelNode->labelId()));
- ASMJIT_PROPAGATE(sb.append(":"));
- break;
- }
-
- case NodeType::kAlign: {
- const AlignNode* alignNode = node->as<AlignNode>();
- ASMJIT_PROPAGATE(sb.appendFormat(".align %u (%s)",
- alignNode->alignment(),
- alignNode->alignMode() == AlignMode::kCode ? "code" : "data"));
- break;
- }
-
- case NodeType::kEmbedData: {
- const EmbedDataNode* embedNode = node->as<EmbedDataNode>();
- ASMJIT_PROPAGATE(sb.append('.'));
- ASMJIT_PROPAGATE(formatDataType(sb, formatOptions.flags(), builder->arch(), embedNode->typeId()));
- ASMJIT_PROPAGATE(sb.appendFormat(" {Count=%zu Repeat=%zu TotalSize=%zu}", embedNode->itemCount(), embedNode->repeatCount(), embedNode->dataSize()));
- break;
- }
-
- case NodeType::kEmbedLabel: {
- const EmbedLabelNode* embedNode = node->as<EmbedLabelNode>();
- ASMJIT_PROPAGATE(sb.append(".label "));
- ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, embedNode->labelId()));
- break;
- }
-
- case NodeType::kEmbedLabelDelta: {
- const EmbedLabelDeltaNode* embedNode = node->as<EmbedLabelDeltaNode>();
- ASMJIT_PROPAGATE(sb.append(".label ("));
- ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, embedNode->labelId()));
- ASMJIT_PROPAGATE(sb.append(" - "));
- ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, embedNode->baseLabelId()));
- ASMJIT_PROPAGATE(sb.append(")"));
- break;
- }
-
- case NodeType::kConstPool: {
- const ConstPoolNode* constPoolNode = node->as<ConstPoolNode>();
- ASMJIT_PROPAGATE(sb.appendFormat("[ConstPool Size=%zu Alignment=%zu]", constPoolNode->size(), constPoolNode->alignment()));
- break;
- };
-
- case NodeType::kComment: {
- const CommentNode* commentNode = node->as<CommentNode>();
- return sb.appendFormat("; %s", commentNode->inlineComment());
- }
-
- case NodeType::kSentinel: {
- const SentinelNode* sentinelNode = node->as<SentinelNode>();
- const char* sentinelName = nullptr;
-
- switch (sentinelNode->sentinelType()) {
- case SentinelType::kFuncEnd:
- sentinelName = "[FuncEnd]";
- break;
-
- default:
- sentinelName = "[Sentinel]";
- break;
- }
-
- ASMJIT_PROPAGATE(sb.append(sentinelName));
- break;
- }
-
-#ifndef ASMJIT_NO_COMPILER
- case NodeType::kFunc: {
- const FuncNode* funcNode = node->as<FuncNode>();
-
- if (builder->isCompiler()) {
- ASMJIT_PROPAGATE(formatLabel(sb, formatOptions.flags(), builder, funcNode->labelId()));
- ASMJIT_PROPAGATE(sb.append(": "));
-
- ASMJIT_PROPAGATE(formatFuncRets(sb, formatOptions.flags(), static_cast<const BaseCompiler*>(builder), funcNode->detail()));
- ASMJIT_PROPAGATE(sb.append(" Func("));
- ASMJIT_PROPAGATE(formatFuncArgs(sb, formatOptions.flags(), static_cast<const BaseCompiler*>(builder), funcNode->detail(), funcNode->argPacks()));
- ASMJIT_PROPAGATE(sb.append(")"));
- }
- break;
- }
-
- case NodeType::kFuncRet: {
- const FuncRetNode* retNode = node->as<FuncRetNode>();
- ASMJIT_PROPAGATE(sb.append("[FuncRet]"));
-
- for (uint32_t i = 0; i < 2; i++) {
- const Operand_& op = retNode->op(i);
- if (!op.isNone()) {
- ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
- ASMJIT_PROPAGATE(formatOperand(sb, formatOptions.flags(), builder, builder->arch(), op));
- }
- }
- break;
- }
-
- case NodeType::kInvoke: {
- const InvokeNode* invokeNode = node->as<InvokeNode>();
- ASMJIT_PROPAGATE(builder->_funcs.formatInstruction(sb, formatOptions.flags(), builder,
- builder->arch(),
- invokeNode->baseInst(), invokeNode->operands(), invokeNode->opCount()));
- break;
- }
-#endif
-
- default: {
- ASMJIT_PROPAGATE(sb.appendFormat("[UserNode:%u]", node->type()));
- break;
- }
- }
-
- if (node->hasInlineComment()) {
- size_t requiredPadding = paddingFromOptions(formatOptions, FormatPaddingGroup::kRegularLine);
- size_t currentPadding = sb.size() - startLineIndex;
-
- if (currentPadding < requiredPadding)
- ASMJIT_PROPAGATE(sb.appendChars(' ', requiredPadding - currentPadding));
-
- ASMJIT_PROPAGATE(sb.append("; "));
- ASMJIT_PROPAGATE(sb.append(node->inlineComment()));
- }
-
- return kErrorOk;
-}
-
-Error formatNodeList(
- String& sb,
- const FormatOptions& formatOptions,
- const BaseBuilder* builder) noexcept {
-
- return formatNodeList(sb, formatOptions, builder, builder->firstNode(), nullptr);
-}
-
-Error formatNodeList(
- String& sb,
- const FormatOptions& formatOptions,
- const BaseBuilder* builder,
- const BaseNode* begin,
- const BaseNode* end) noexcept {
-
- const BaseNode* node = begin;
- while (node != end) {
- ASMJIT_PROPAGATE(formatNode(sb, formatOptions, builder, node));
- ASMJIT_PROPAGATE(sb.append('\n'));
- node = node->next();
- }
- return kErrorOk;
-}
-#endif
-
-} // {Formatter}
-
-ASMJIT_END_NAMESPACE
-
-#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/formatter.h b/3rdparty/asmjit/src/asmjit/core/formatter.h
deleted file mode 100644
index 392e4787302..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/formatter.h
+++ /dev/null
@@ -1,249 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_FORMATTER_H_INCLUDED
-#define ASMJIT_CORE_FORMATTER_H_INCLUDED
-
-#include "../core/globals.h"
-#include "../core/inst.h"
-#include "../core/string.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_logging
-//! \{
-
-class BaseBuilder;
-class BaseEmitter;
-class BaseNode;
-struct Operand_;
-
-//! Format flags used by \ref Logger and \ref FormatOptions.
-enum class FormatFlags : uint32_t {
- //! No formatting flags.
- kNone = 0u,
-
- //! Show also binary form of each logged instruction (Assembler).
- kMachineCode = 0x00000001u,
- //! Show a text explanation of some immediate values.
- kExplainImms = 0x00000002u,
- //! Use hexadecimal notation of immediate values.
- kHexImms = 0x00000004u,
- //! Use hexadecimal notation of addresses and offsets in addresses.
- kHexOffsets = 0x00000008u,
- //! Show casts between virtual register types (Compiler output).
- kRegCasts = 0x00000010u,
- //! Show positions associated with nodes (Compiler output).
- kPositions = 0x00000020u,
- //! Always format a register type (Compiler output).
- kRegType = 0x00000040u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(FormatFlags)
-
-//! Format indentation group, used by \ref FormatOptions.
-enum class FormatIndentationGroup : uint32_t {
- //! Indentation used for instructions and directives.
- kCode = 0u,
- //! Indentation used for labels and function nodes.
- kLabel = 1u,
- //! Indentation used for comments (not inline comments).
- kComment = 2u,
-
- //! \cond INTERNAL
- //! Reserved for future use.
- kReserved = 3u,
- //! \endcond
-
- //! Maximum value of `FormatIndentationGroup`.
- kMaxValue = kReserved
-};
-
-//! Format padding group, used by \ref FormatOptions.
-enum class FormatPaddingGroup : uint32_t {
- //! Describes padding of a regular line, which can represent instruction, data, or assembler directives.
- kRegularLine = 0,
- //! Describes padding of machine code dump that is visible next to the instruction, if enabled.
- kMachineCode = 1,
-
- //! Maximum value of `FormatPaddingGroup`.
- kMaxValue = kMachineCode
-};
-
-//! Formatting options used by \ref Logger and \ref Formatter.
-class FormatOptions {
-public:
- //! \name Members
- //! \{
-
- //! Format flags.
- FormatFlags _flags = FormatFlags::kNone;
- //! Indentations for each indentation group.
- Support::Array<uint8_t, uint32_t(FormatIndentationGroup::kMaxValue) + 1> _indentation {};
- //! Paddings for each padding group.
- Support::Array<uint16_t, uint32_t(FormatPaddingGroup::kMaxValue) + 1> _padding {};
-
- //! \}
-
- //! \name Reset
- //! \{
-
- //! Resets FormatOptions to its default initialized state.
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _flags = FormatFlags::kNone;
- _indentation.fill(uint8_t(0));
- _padding.fill(uint16_t(0));
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns format flags.
- ASMJIT_INLINE_NODEBUG FormatFlags flags() const noexcept { return _flags; }
- //! Tests whether the given `flag` is set in format flags.
- ASMJIT_INLINE_NODEBUG bool hasFlag(FormatFlags flag) const noexcept { return Support::test(_flags, flag); }
-
- //! Resets all format flags to `flags`.
- ASMJIT_INLINE_NODEBUG void setFlags(FormatFlags flags) noexcept { _flags = flags; }
- //! Adds `flags` to format flags.
- ASMJIT_INLINE_NODEBUG void addFlags(FormatFlags flags) noexcept { _flags |= flags; }
- //! Removes `flags` from format flags.
- ASMJIT_INLINE_NODEBUG void clearFlags(FormatFlags flags) noexcept { _flags &= ~flags; }
-
- //! Returns indentation for the given indentation `group`.
- ASMJIT_INLINE_NODEBUG uint8_t indentation(FormatIndentationGroup group) const noexcept { return _indentation[group]; }
- //! Sets indentation for the given indentation `group`.
- ASMJIT_INLINE_NODEBUG void setIndentation(FormatIndentationGroup group, uint32_t n) noexcept { _indentation[group] = uint8_t(n); }
- //! Resets indentation for the given indentation `group` to zero.
- ASMJIT_INLINE_NODEBUG void resetIndentation(FormatIndentationGroup group) noexcept { _indentation[group] = uint8_t(0); }
-
- //! Returns padding for the given padding `group`.
- ASMJIT_INLINE_NODEBUG size_t padding(FormatPaddingGroup group) const noexcept { return _padding[group]; }
- //! Sets padding for the given padding `group`.
- ASMJIT_INLINE_NODEBUG void setPadding(FormatPaddingGroup group, size_t n) noexcept { _padding[group] = uint16_t(n); }
- //! Resets padding for the given padding `group` to zero, which means that a default padding will be used
- //! based on the target architecture properties.
- ASMJIT_INLINE_NODEBUG void resetPadding(FormatPaddingGroup group) noexcept { _padding[group] = uint16_t(0); }
-
- //! \}
-};
-
-//! Provides formatting functionality to format operands, instructions, and nodes.
-namespace Formatter {
-
-#ifndef ASMJIT_NO_LOGGING
-
-//! Appends a formatted `typeId` to the output string `sb`.
-ASMJIT_API Error formatTypeId(
- String& sb,
- TypeId typeId) noexcept;
-
-//! Appends a formatted `featureId` to the output string `sb`.
-//!
-//! See \ref CpuFeatures.
-ASMJIT_API Error formatFeature(
- String& sb,
- Arch arch,
- uint32_t featureId) noexcept;
-
-//! Appends a formatted register to the output string `sb`.
-//!
-//! \note Emitter is optional, but it's required to format virtual registers, which won't be formatted properly
-//! if the `emitter` is not provided.
-ASMJIT_API Error formatRegister(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t regId) noexcept;
-
-//! Appends a formatted label to the output string `sb`.
-//!
-//! \note Emitter is optional, but it's required to format named labels properly, otherwise the formatted as
-//! it is an anonymous label.
-ASMJIT_API Error formatLabel(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- uint32_t labelId) noexcept;
-
-//! Appends a formatted operand to the output string `sb`.
-//!
-//! \note Emitter is optional, but it's required to format named labels and virtual registers. See
-//! \ref formatRegister() and \ref formatLabel() for more details.
-ASMJIT_API Error formatOperand(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const Operand_& op) noexcept;
-
-//! Appends a formatted data-type to the output string `sb`.
-ASMJIT_API Error formatDataType(
- String& sb,
- FormatFlags formatFlags,
- Arch arch,
- TypeId typeId) noexcept;
-
-//! Appends a formatted data to the output string `sb`.
-ASMJIT_API Error formatData(
- String& sb,
- FormatFlags formatFlags,
- Arch arch,
- TypeId typeId, const void* data, size_t itemCount, size_t repeatCount = 1) noexcept;
-
-//! Appends a formatted instruction to the output string `sb`.
-//!
-//! \note Emitter is optional, but it's required to format named labels and virtual registers. See
-//! \ref formatRegister() and \ref formatLabel() for more details.
-ASMJIT_API Error formatInstruction(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept;
-
-#ifndef ASMJIT_NO_BUILDER
-//! Appends a formatted node to the output string `sb`.
-//!
-//! The `node` must belong to the provided `builder`.
-ASMJIT_API Error formatNode(
- String& sb,
- const FormatOptions& formatOptions,
- const BaseBuilder* builder,
- const BaseNode* node) noexcept;
-
-//! Appends formatted nodes to the output string `sb`.
-//!
-//! All nodes that are part of the given `builder` will be appended.
-ASMJIT_API Error formatNodeList(
- String& sb,
- const FormatOptions& formatOptions,
- const BaseBuilder* builder) noexcept;
-
-//! Appends formatted nodes to the output string `sb`.
-//!
-//! This function works the same as \ref formatNode(), but appends more nodes to the output string,
-//! separating each node with a newline '\n' character.
-ASMJIT_API Error formatNodeList(
- String& sb,
- const FormatOptions& formatOptions,
- const BaseBuilder* builder,
- const BaseNode* begin,
- const BaseNode* end) noexcept;
-#endif
-
-#endif
-
-} // {Formatter}
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_FORMATTER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/formatter_p.h b/3rdparty/asmjit/src/asmjit/core/formatter_p.h
deleted file mode 100644
index 6070fd74f24..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/formatter_p.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_FORMATTER_P_H_INCLUDED
-#define ASMJIT_CORE_FORMATTER_P_H_INCLUDED
-
-#include "../core/formatter.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_logging
-//! \{
-
-namespace Formatter {
-
-static ASMJIT_FORCE_INLINE size_t paddingFromOptions(const FormatOptions& formatOptions, FormatPaddingGroup group) noexcept {
- static constexpr uint16_t _defaultPaddingTable[uint32_t(FormatPaddingGroup::kMaxValue) + 1] = { 44, 26 };
- static_assert(uint32_t(FormatPaddingGroup::kMaxValue) + 1 == 2, "If a new group is defined it must be added here");
-
- size_t padding = formatOptions.padding(group);
- return padding ? padding : size_t(_defaultPaddingTable[uint32_t(group)]);
-}
-
-} // {Formatter}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_FORMATTER_H_P_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/func.cpp b/3rdparty/asmjit/src/asmjit/core/func.cpp
deleted file mode 100644
index a8a6d3ab932..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/func.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/archtraits.h"
-#include "../core/func.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-#include "../core/funcargscontext_p.h"
-
-#if !defined(ASMJIT_NO_X86)
- #include "../x86/x86func_p.h"
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- #include "../arm/a64func_p.h"
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-// CallConv - Initialization & Reset
-// =================================
-
-ASMJIT_FAVOR_SIZE Error CallConv::init(CallConvId ccId, const Environment& environment) noexcept {
- reset();
-
-#if !defined(ASMJIT_NO_X86)
- if (environment.isFamilyX86())
- return x86::FuncInternal::initCallConv(*this, ccId, environment);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (environment.isFamilyAArch64())
- return a64::FuncInternal::initCallConv(*this, ccId, environment);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArgument);
-}
-
-// FuncDetail - Init / Reset
-// =========================
-
-ASMJIT_FAVOR_SIZE Error FuncDetail::init(const FuncSignature& signature, const Environment& environment) noexcept {
- CallConvId ccId = signature.callConvId();
- uint32_t argCount = signature.argCount();
-
- if (ASMJIT_UNLIKELY(argCount > Globals::kMaxFuncArgs))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- CallConv& cc = _callConv;
- ASMJIT_PROPAGATE(cc.init(ccId, environment));
-
- uint32_t registerSize = Environment::registerSizeFromArch(cc.arch());
- uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize);
-
- const TypeId* signatureArgs = signature.args();
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- FuncValuePack& argPack = _args[argIndex];
- argPack[0].initTypeId(TypeUtils::deabstract(signatureArgs[argIndex], deabstractDelta));
- }
-
- _argCount = uint8_t(argCount);
- _vaIndex = uint8_t(signature.vaIndex());
-
- TypeId ret = signature.ret();
- if (ret != TypeId::kVoid)
- _rets[0].initTypeId(TypeUtils::deabstract(ret, deabstractDelta));
-
-#if !defined(ASMJIT_NO_X86)
- if (environment.isFamilyX86())
- return x86::FuncInternal::initFuncDetail(*this, signature, registerSize);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (environment.isFamilyAArch64())
- return a64::FuncInternal::initFuncDetail(*this, signature);
-#endif
-
- // We should never bubble here as if `cc.init()` succeeded then there has to be an implementation for the current
- // architecture. However, stay safe.
- return DebugUtils::errored(kErrorInvalidArgument);
-}
-
-// FuncFrame - Init
-// ================
-
-ASMJIT_FAVOR_SIZE Error FuncFrame::init(const FuncDetail& func) noexcept {
- Arch arch = func.callConv().arch();
- if (!Environment::isValidArch(arch))
- return DebugUtils::errored(kErrorInvalidArch);
-
- const ArchTraits& archTraits = ArchTraits::byArch(arch);
-
- // Initializing FuncFrame means making a copy of some properties of `func`. Properties like `_localStackSize` will
- // be set by the user before the frame is finalized.
- reset();
-
- _arch = arch;
- _spRegId = uint8_t(archTraits.spRegId());
- _saRegId = uint8_t(BaseReg::kIdBad);
-
- uint32_t naturalStackAlignment = func.callConv().naturalStackAlignment();
- uint32_t minDynamicAlignment = Support::max<uint32_t>(naturalStackAlignment, 16);
-
- if (minDynamicAlignment == naturalStackAlignment)
- minDynamicAlignment <<= 1;
-
- _naturalStackAlignment = uint8_t(naturalStackAlignment);
- _minDynamicAlignment = uint8_t(minDynamicAlignment);
- _redZoneSize = uint8_t(func.redZoneSize());
- _spillZoneSize = uint8_t(func.spillZoneSize());
- _finalStackAlignment = uint8_t(_naturalStackAlignment);
-
- if (func.hasFlag(CallConvFlags::kCalleePopsStack)) {
- _calleeStackCleanup = uint16_t(func.argStackSize());
- }
-
- // Initial masks of dirty and preserved registers.
- for (RegGroup group : RegGroupVirtValues{}) {
- _dirtyRegs[group] = func.usedRegs(group);
- _preservedRegs[group] = func.preservedRegs(group);
- }
-
- // Exclude stack pointer - this register is never included in saved GP regs.
- _preservedRegs[RegGroup::kGp] &= ~Support::bitMask(archTraits.spRegId());
-
- // The size and alignment of save/restore area of registers for each virtual register group
- _saveRestoreRegSize = func.callConv()._saveRestoreRegSize;
- _saveRestoreAlignment = func.callConv()._saveRestoreAlignment;
-
- return kErrorOk;
-}
-
-// FuncFrame - Finalize
-// ====================
-
-ASMJIT_FAVOR_SIZE Error FuncFrame::finalize() noexcept {
- if (!Environment::isValidArch(arch()))
- return DebugUtils::errored(kErrorInvalidArch);
-
- const ArchTraits& archTraits = ArchTraits::byArch(arch());
-
- uint32_t registerSize = _saveRestoreRegSize[RegGroup::kGp];
- uint32_t vectorSize = _saveRestoreRegSize[RegGroup::kVec];
- uint32_t returnAddressSize = archTraits.hasLinkReg() ? 0u : registerSize;
-
- // The final stack alignment must be updated accordingly to call and local stack alignments.
- uint32_t stackAlignment = _finalStackAlignment;
- ASMJIT_ASSERT(stackAlignment == Support::max(_naturalStackAlignment,
- _callStackAlignment,
- _localStackAlignment));
-
- bool hasFP = hasPreservedFP();
- bool hasDA = hasDynamicAlignment();
-
- uint32_t kSp = archTraits.spRegId();
- uint32_t kFp = archTraits.fpRegId();
- uint32_t kLr = archTraits.linkRegId();
-
- // Make frame pointer dirty if the function uses it.
- if (hasFP) {
- _dirtyRegs[RegGroup::kGp] |= Support::bitMask(kFp);
-
- // Currently required by ARM, if this works differently across architectures we would have to generalize most
- // likely in CallConv.
- if (kLr != BaseReg::kIdBad)
- _dirtyRegs[RegGroup::kGp] |= Support::bitMask(kLr);
- }
-
- // These two are identical if the function doesn't align its stack dynamically.
- uint32_t saRegId = _saRegId;
- if (saRegId == BaseReg::kIdBad)
- saRegId = kSp;
-
- // Fix stack arguments base-register from SP to FP in case it was not picked before and the function performs
- // dynamic stack alignment.
- if (hasDA && saRegId == kSp)
- saRegId = kFp;
-
- // Mark as dirty any register but SP if used as SA pointer.
- if (saRegId != kSp)
- _dirtyRegs[RegGroup::kGp] |= Support::bitMask(saRegId);
-
- _spRegId = uint8_t(kSp);
- _saRegId = uint8_t(saRegId);
-
- // Setup stack size used to save preserved registers.
- uint32_t saveRestoreSizes[2] {};
- for (RegGroup group : RegGroupVirtValues{})
- saveRestoreSizes[size_t(!archTraits.hasInstPushPop(group))]
- += Support::alignUp(Support::popcnt(savedRegs(group)) * saveRestoreRegSize(group), saveRestoreAlignment(group));
-
- _pushPopSaveSize = uint16_t(saveRestoreSizes[0]);
- _extraRegSaveSize = uint16_t(saveRestoreSizes[1]);
-
- uint32_t v = 0; // The beginning of the stack frame relative to SP after prolog.
- v += callStackSize(); // Count 'callStackSize' <- This is used to call functions.
- v = Support::alignUp(v, stackAlignment); // Align to function's stack alignment.
-
- _localStackOffset = v; // Store 'localStackOffset' <- Function's local stack starts here.
- v += localStackSize(); // Count 'localStackSize' <- Function's local stack ends here.
-
- // If the function's stack must be aligned, calculate the alignment necessary to store vector registers, and set
- // `FuncAttributes::kAlignedVecSR` to inform PEI that it can use instructions that perform aligned stores/loads.
- if (stackAlignment >= vectorSize && _extraRegSaveSize) {
- addAttributes(FuncAttributes::kAlignedVecSR);
- v = Support::alignUp(v, vectorSize); // Align 'extraRegSaveOffset'.
- }
-
- _extraRegSaveOffset = v; // Store 'extraRegSaveOffset' <- Non-GP save/restore starts here.
- v += _extraRegSaveSize; // Count 'extraRegSaveSize' <- Non-GP save/restore ends here.
-
- // Calculate if dynamic alignment (DA) slot (stored as offset relative to SP) is required and its offset.
- if (hasDA && !hasFP) {
- _daOffset = v; // Store 'daOffset' <- DA pointer would be stored here.
- v += registerSize; // Count 'daOffset'.
- }
- else {
- _daOffset = FuncFrame::kTagInvalidOffset;
- }
-
- // Link Register
- // -------------
- //
- // The stack is aligned after the function call as the return address is stored in a link register. Some
- // architectures may require to always have aligned stack after PUSH/POP operation, which is represented
- // by ArchTraits::stackAlignmentConstraint().
- //
- // No Link Register (X86/X64)
- // --------------------------
- //
- // The return address should be stored after GP save/restore regs. It has the same size as `registerSize`
- // (basically the native register/pointer size). We don't adjust it now as `v` now contains the exact size
- // that the function requires to adjust (call frame + stack frame, vec stack size). The stack (if we consider
- // this size) is misaligned now, as it's always aligned before the function call - when `call()` is executed
- // it pushes the current EIP|RIP onto the stack, and misaligns it by 12 or 8 bytes (depending on the
- // architecture). So count number of bytes needed to align it up to the function's CallFrame (the beginning).
- if (v || hasFuncCalls() || !returnAddressSize)
- v += Support::alignUpDiff(v + pushPopSaveSize() + returnAddressSize, stackAlignment);
-
- _pushPopSaveOffset = v; // Store 'pushPopSaveOffset' <- Function's push/pop save/restore starts here.
- _stackAdjustment = v; // Store 'stackAdjustment' <- SA used by 'add SP, SA' and 'sub SP, SA'.
- v += _pushPopSaveSize; // Count 'pushPopSaveSize' <- Function's push/pop save/restore ends here.
- _finalStackSize = v; // Store 'finalStackSize' <- Final stack used by the function.
-
- if (!archTraits.hasLinkReg())
- v += registerSize; // Count 'ReturnAddress' <- As CALL pushes onto stack.
-
- // If the function performs dynamic stack alignment then the stack-adjustment must be aligned.
- if (hasDA)
- _stackAdjustment = Support::alignUp(_stackAdjustment, stackAlignment);
-
- // Calculate where the function arguments start relative to SP.
- _saOffsetFromSP = hasDA ? FuncFrame::kTagInvalidOffset : v;
-
- // Calculate where the function arguments start relative to FP or user-provided register.
- _saOffsetFromSA = hasFP ? returnAddressSize + registerSize // Return address + frame pointer.
- : returnAddressSize + _pushPopSaveSize; // Return address + all push/pop regs.
-
- return kErrorOk;
-}
-
-// FuncArgsAssignment - UpdateFuncFrame
-// ====================================
-
-ASMJIT_FAVOR_SIZE Error FuncArgsAssignment::updateFuncFrame(FuncFrame& frame) const noexcept {
- Arch arch = frame.arch();
- const FuncDetail* func = funcDetail();
-
- if (!func)
- return DebugUtils::errored(kErrorInvalidState);
-
- RAConstraints constraints;
- ASMJIT_PROPAGATE(constraints.init(arch));
-
- FuncArgsContext ctx;
- ASMJIT_PROPAGATE(ctx.initWorkData(frame, *this, &constraints));
- ASMJIT_PROPAGATE(ctx.markDstRegsDirty(frame));
- ASMJIT_PROPAGATE(ctx.markScratchRegs(frame));
- ASMJIT_PROPAGATE(ctx.markStackArgsReg(frame));
- return kErrorOk;
-}
-
-// Func API - Tests
-// ================
-
-#if defined(ASMJIT_TEST)
-UNIT(func_signature) {
- FuncSignature signature;
- signature.setRetT<int8_t>();
- signature.addArgT<int16_t>();
- signature.addArg(TypeId::kInt32);
-
- EXPECT_EQ(signature, FuncSignature::build<int8_t, int16_t, int32_t>());
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/func.h b/3rdparty/asmjit/src/asmjit/core/func.h
deleted file mode 100644
index 695a23bbcf0..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/func.h
+++ /dev/null
@@ -1,1595 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_FUNC_H_INCLUDED
-#define ASMJIT_CORE_FUNC_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/environment.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_function
-//! \{
-
-//! Calling convention id.
-//!
-//! Calling conventions can be divided into the following groups:
-//!
-//! - Universal - calling conventions are applicable to any target. They will be converted to a target dependent
-//! calling convention at runtime by \ref CallConv::init() with some help from \ref Environment. The purpose of
-//! these calling conventions is to make using functions less target dependent and closer to C and C++.
-//!
-//! - Target specific - calling conventions that are used by a particular architecture and ABI. For example
-//! Windows 64-bit calling convention and AMD64 SystemV calling convention.
-enum class CallConvId : uint8_t {
- // Universal Calling Conventions
- // -----------------------------
-
- //! Standard function call or explicit `__cdecl` where it can be specified.
- //!
- //! This is a universal calling convention, which is used to initialize specific calling conventions based on
- //! architecture, platform, and its ABI.
- kCDecl = 0,
-
- //! `__stdcall` on targets that support this calling convention (X86).
- //!
- //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support
- //! this calling convention it will be replaced by \ref CallConvId::kCDecl.
- kStdCall = 1,
-
- //! `__fastcall` on targets that support this calling convention (X86).
- //!
- //! \note This calling convention is only supported on 32-bit X86. If used on environment that doesn't support
- //! this calling convention it will be replaced by \ref CallConvId::kCDecl.
- kFastCall = 2,
-
- //! `__vectorcall` on targets that support this calling convention (X86/X64).
- //!
- //! \note This calling convention is only supported on 32-bit and 64-bit X86 architecture on Windows platform.
- //! If used on environment that doesn't support this calling it will be replaced by \ref CallConvId::kCDecl.
- kVectorCall = 3,
-
- //! `__thiscall` on targets that support this calling convention (X86).
- //!
- //! \note This calling convention is only supported on 32-bit X86 Windows platform. If used on environment that
- //! doesn't support this calling convention it will be replaced by \ref CallConvId::kCDecl.
- kThisCall = 4,
-
- //! `__attribute__((regparm(1)))` convention (GCC and Clang).
- kRegParm1 = 5,
- //! `__attribute__((regparm(2)))` convention (GCC and Clang).
- kRegParm2 = 6,
- //! `__attribute__((regparm(3)))` convention (GCC and Clang).
- kRegParm3 = 7,
-
- //! AsmJit specific calling convention designed for calling functions inside a multimedia code that don't use many
- //! registers internally, but are long enough to be called and not inlined. These functions are usually used to
- //! calculate trigonometric functions, logarithms, etc...
- kLightCall2 = 16,
- kLightCall3 = 17,
- kLightCall4 = 18,
-
- // ABI-Specific Calling Conventions
- // --------------------------------
-
- //! Soft-float calling convention (AArch32).
- //!
- //! Floating point arguments are passed via general purpose registers.
- kSoftFloat = 30,
-
- //! Hard-float calling convention (AArch32).
- //!
- //! Floating point arguments are passed via SIMD registers.
- kHardFloat = 31,
-
- //! X64 System-V calling convention.
- kX64SystemV = 32,
- //! X64 Windows calling convention.
- kX64Windows = 33,
-
- //! Maximum value of `CallConvId`.
- kMaxValue = kX64Windows
-
- // Deprecated Aliases
- // ------------------
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ,
- kNone = kCDecl,
- kHost = kCDecl
-#endif // !ASMJIT_NO_DEPRECATED
-};
-
-//! Strategy used by calling conventions to assign registers to function arguments.
-//!
-//! Calling convention strategy describes how AsmJit should convert function arguments used by \ref FuncSignature
-//! into register identifiers and stack offsets. The \ref CallConvStrategy::kDefault strategy assigns registers
-//! and then stack whereas \ref CallConvStrategy::kX64Windows strategy does register shadowing as defined by WIN64
-//! calling convention, which is only used by 64-bit Windows.
-enum class CallConvStrategy : uint8_t {
- //! Default register assignment strategy.
- kDefault = 0,
- //! Windows 64-bit ABI register assignment strategy.
- kX64Windows = 1,
- //! Windows 64-bit __vectorcall register assignment strategy.
- kX64VectorCall = 2,
- //! Apple's AArch64 calling convention (differs compared to AArch64 calling convention used by Linux).
- kAArch64Apple = 3,
-
- //! Maximum value of `CallConvStrategy`.
- kMaxValue = kX64VectorCall
-};
-
-//! Calling convention flags.
-enum class CallConvFlags : uint32_t {
- //! No flags.
- kNone = 0,
- //! Callee is responsible for cleaning up the stack.
- kCalleePopsStack = 0x0001u,
- //! Pass vector arguments indirectly (as a pointer).
- kIndirectVecArgs = 0x0002u,
- //! Pass F32 and F64 arguments via VEC128 register.
- kPassFloatsByVec = 0x0004u,
- //! Pass MMX and vector arguments via stack if the function has variable arguments.
- kPassVecByStackIfVA = 0x0008u,
- //! MMX registers are passed and returned via GP registers.
- kPassMmxByGp = 0x0010u,
- //! MMX registers are passed and returned via XMM registers.
- kPassMmxByXmm = 0x0020u,
- //! Calling convention can be used with variable arguments.
- kVarArgCompatible = 0x0080u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(CallConvFlags)
-
-//! Function calling convention.
-//!
-//! Function calling convention is a scheme that defines how function parameters are passed and how function
-//! returns its result. AsmJit defines a variety of architecture and OS specific calling conventions and also
-//! provides a compile time detection to make the code-generation easier.
-struct CallConv {
- //! \name Constants
- //! \{
-
- //! Maximum number of register arguments per register group.
- //!
- //! \note This is not really AsmJit's limitation, it's just the number that makes sense considering all common
- //! calling conventions. Usually even conventions that use registers to pass function arguments are limited to 8
- //! and less arguments passed via registers per group.
- static constexpr uint32_t kMaxRegArgsPerGroup = 16;
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Target architecture.
- Arch _arch;
- //! Calling convention id.
- CallConvId _id;
- //! Register assignment strategy.
- CallConvStrategy _strategy;
-
- //! Red zone size (AMD64 == 128 bytes).
- uint8_t _redZoneSize;
- //! Spill zone size (WIN-X64 == 32 bytes).
- uint8_t _spillZoneSize;
- //! Natural stack alignment as defined by OS/ABI.
- uint8_t _naturalStackAlignment;
-
- //! \cond INTERNAL
- //! Reserved for future use.
- uint8_t _reserved[2];
- //! \endcond
-
- //! Calling convention flags.
- CallConvFlags _flags;
-
- //! Size to save/restore per register group.
- Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreRegSize;
- //! Alignment of save/restore groups.
- Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreAlignment;
-
- //! Mask of all passed registers, per group.
- Support::Array<RegMask, Globals::kNumVirtGroups> _passedRegs;
- //! Mask of all preserved registers, per group.
- Support::Array<RegMask, Globals::kNumVirtGroups> _preservedRegs;
-
- //! Passed registers' order.
- union RegOrder {
- //! Passed registers, ordered.
- uint8_t id[kMaxRegArgsPerGroup];
- //! Packed IDs in `uint32_t` array.
- uint32_t packed[(kMaxRegArgsPerGroup + 3) / 4];
- };
-
- //! Passed registers' order, per register group.
- Support::Array<RegOrder, Globals::kNumVirtGroups> _passedOrder;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Initializes this calling convention to the given `ccId` based on the `environment`.
- //!
- //! See \ref CallConvId and \ref Environment for more details.
- ASMJIT_API Error init(CallConvId ccId, const Environment& environment) noexcept;
-
- //! Resets this CallConv struct into a defined state.
- //!
- //! It's recommended to reset the \ref CallConv struct in case you would like create a custom calling convention
- //! as it prevents from using an uninitialized data (CallConv doesn't have a constructor that would initialize it,
- //! it's just a struct).
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- *this = CallConv{};
- memset(_passedOrder.data(), 0xFF, sizeof(_passedOrder));
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the target architecture of this calling convention.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
- //! Sets the target architecture of this calling convention.
- ASMJIT_INLINE_NODEBUG void setArch(Arch arch) noexcept { _arch = arch; }
-
- //! Returns the calling convention id.
- ASMJIT_INLINE_NODEBUG CallConvId id() const noexcept { return _id; }
- //! Sets the calling convention id.
- ASMJIT_INLINE_NODEBUG void setId(CallConvId ccId) noexcept { _id = ccId; }
-
- //! Returns the strategy used to assign registers to arguments.
- ASMJIT_INLINE_NODEBUG CallConvStrategy strategy() const noexcept { return _strategy; }
- //! Sets the strategy used to assign registers to arguments.
- ASMJIT_INLINE_NODEBUG void setStrategy(CallConvStrategy ccStrategy) noexcept { _strategy = ccStrategy; }
-
- //! Tests whether the calling convention has the given `flag` set.
- ASMJIT_INLINE_NODEBUG bool hasFlag(CallConvFlags flag) const noexcept { return Support::test(_flags, flag); }
- //! Returns the calling convention flags, see `Flags`.
- ASMJIT_INLINE_NODEBUG CallConvFlags flags() const noexcept { return _flags; }
- //! Adds the calling convention flags, see `Flags`.
- ASMJIT_INLINE_NODEBUG void setFlags(CallConvFlags flag) noexcept { _flags = flag; };
- //! Adds the calling convention flags, see `Flags`.
- ASMJIT_INLINE_NODEBUG void addFlags(CallConvFlags flags) noexcept { _flags |= flags; };
-
- //! Tests whether this calling convention specifies 'RedZone'.
- ASMJIT_INLINE_NODEBUG bool hasRedZone() const noexcept { return _redZoneSize != 0; }
- //! Tests whether this calling convention specifies 'SpillZone'.
- ASMJIT_INLINE_NODEBUG bool hasSpillZone() const noexcept { return _spillZoneSize != 0; }
-
- //! Returns size of 'RedZone'.
- ASMJIT_INLINE_NODEBUG uint32_t redZoneSize() const noexcept { return _redZoneSize; }
- //! Returns size of 'SpillZone'.
- ASMJIT_INLINE_NODEBUG uint32_t spillZoneSize() const noexcept { return _spillZoneSize; }
-
- //! Sets size of 'RedZone'.
- ASMJIT_INLINE_NODEBUG void setRedZoneSize(uint32_t size) noexcept { _redZoneSize = uint8_t(size); }
- //! Sets size of 'SpillZone'.
- ASMJIT_INLINE_NODEBUG void setSpillZoneSize(uint32_t size) noexcept { _spillZoneSize = uint8_t(size); }
-
- //! Returns a natural stack alignment.
- ASMJIT_INLINE_NODEBUG uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; }
- //! Sets a natural stack alignment.
- //!
- //! This function can be used to override the default stack alignment in case that you know that it's alignment is
- //! different. For example it allows to implement custom calling conventions that guarantee higher stack alignment.
- ASMJIT_INLINE_NODEBUG void setNaturalStackAlignment(uint32_t value) noexcept { _naturalStackAlignment = uint8_t(value); }
-
- //! Returns the size of a register (or its part) to be saved and restored of the given `group`.
- ASMJIT_INLINE_NODEBUG uint32_t saveRestoreRegSize(RegGroup group) const noexcept { return _saveRestoreRegSize[group]; }
- //! Sets the size of a vector register (or its part) to be saved and restored.
- ASMJIT_INLINE_NODEBUG void setSaveRestoreRegSize(RegGroup group, uint32_t size) noexcept { _saveRestoreRegSize[group] = uint8_t(size); }
-
- //! Returns the alignment of a save-restore area of the given `group`.
- ASMJIT_INLINE_NODEBUG uint32_t saveRestoreAlignment(RegGroup group) const noexcept { return _saveRestoreAlignment[group]; }
- //! Sets the alignment of a save-restore area of the given `group`.
- ASMJIT_INLINE_NODEBUG void setSaveRestoreAlignment(RegGroup group, uint32_t alignment) noexcept { _saveRestoreAlignment[group] = uint8_t(alignment); }
-
- //! Returns the order of passed registers of the given `group`.
- inline const uint8_t* passedOrder(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _passedOrder[size_t(group)].id;
- }
-
- //! Returns the mask of passed registers of the given `group`.
- inline RegMask passedRegs(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _passedRegs[size_t(group)];
- }
-
- inline void _setPassedPacked(RegGroup group, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
-
- _passedOrder[group].packed[0] = p0;
- _passedOrder[group].packed[1] = p1;
- _passedOrder[group].packed[2] = p2;
- _passedOrder[group].packed[3] = p3;
- }
-
- //! Resets the order and mask of passed registers.
- inline void setPassedToNone(RegGroup group) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
-
- _setPassedPacked(group, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu);
- _passedRegs[size_t(group)] = 0u;
- }
-
- //! Sets the order and mask of passed registers.
- inline void setPassedOrder(RegGroup group, uint32_t a0, uint32_t a1 = 0xFF, uint32_t a2 = 0xFF, uint32_t a3 = 0xFF, uint32_t a4 = 0xFF, uint32_t a5 = 0xFF, uint32_t a6 = 0xFF, uint32_t a7 = 0xFF) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
-
- // NOTE: This should always be called with all arguments known at compile time, so even if it looks scary it
- // should be translated into few instructions.
- _setPassedPacked(group, Support::bytepack32_4x8(a0, a1, a2, a3),
- Support::bytepack32_4x8(a4, a5, a6, a7),
- 0xFFFFFFFFu,
- 0xFFFFFFFFu);
-
- _passedRegs[group] = (a0 != 0xFF ? 1u << a0 : 0u) |
- (a1 != 0xFF ? 1u << a1 : 0u) |
- (a2 != 0xFF ? 1u << a2 : 0u) |
- (a3 != 0xFF ? 1u << a3 : 0u) |
- (a4 != 0xFF ? 1u << a4 : 0u) |
- (a5 != 0xFF ? 1u << a5 : 0u) |
- (a6 != 0xFF ? 1u << a6 : 0u) |
- (a7 != 0xFF ? 1u << a7 : 0u) ;
- }
-
- //! Returns preserved register mask of the given `group`.
- inline RegMask preservedRegs(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _preservedRegs[group];
- }
-
- //! Sets preserved register mask of the given `group`.
- inline void setPreservedRegs(RegGroup group, RegMask regs) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- _preservedRegs[group] = regs;
- }
-
- //! \}
-};
-
-//! Function signature.
-//!
-//! Contains information about a function return type, count of arguments, and their TypeIds. Function signature
-//! is a low level structure which doesn't contain platform specific or calling convention specific information.
-//! It's typically used to describe function arguments in a C-API like form, which is then used to calculate a
-//! \ref FuncDetail instance, which then maps function signature into a platform and calling convention specific
-//! format.
-//!
-//! Function signature can be built either dynamically by using \ref addArg() and \ref addArgT() functionality,
-//! or dynamically by using a template-based \ref FuncSignature::build() function, which maps template types
-//! into a function signature.
-struct FuncSignature {
- //! \name Constants
- //! \{
-
- //! Doesn't have variable number of arguments (`...`).
- static constexpr uint8_t kNoVarArgs = 0xFFu;
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Calling convention id.
- CallConvId _ccId = CallConvId::kCDecl;
- //! Count of arguments.
- uint8_t _argCount = 0;
- //! Index of a first VA or `kNoVarArgs`.
- uint8_t _vaIndex = kNoVarArgs;
- //! Return value TypeId.
- TypeId _ret = TypeId::kVoid;
- //! Reserved for future use.
- uint8_t _reserved[4] {};
- //! Function argument TypeIds.
- TypeId _args[Globals::kMaxFuncArgs] {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Default constructed function signature, initialized to \ref CallConvId::kCDecl, having no return value and no arguments.
- ASMJIT_FORCE_INLINE constexpr FuncSignature() = default;
-
- //! Copy constructor, which is initialized to the same function signature as `other`.
- ASMJIT_FORCE_INLINE constexpr FuncSignature(const FuncSignature& other) = default;
-
- //! Initializes the function signature with calling convention id `ccId` and variable argument's index `vaIndex`.
- ASMJIT_FORCE_INLINE constexpr FuncSignature(CallConvId ccId, uint32_t vaIndex = kNoVarArgs) noexcept
- : _ccId(ccId),
- _vaIndex(uint8_t(vaIndex)) {}
-
- //! Initializes the function signature with calling convention id `ccId`, `vaIndex`, return value, and function arguments.
- template<typename... Args>
- ASMJIT_FORCE_INLINE constexpr FuncSignature(CallConvId ccId, uint32_t vaIndex, TypeId ret, Args&&...args) noexcept
- : _ccId(ccId),
- _argCount(uint8_t(sizeof...(args))),
- _vaIndex(uint8_t(vaIndex)),
- _ret(ret),
- _args{std::forward<Args>(args)...} {}
-
- //! Builds a function signature based on `RetValueAndArgs`. The first template argument is a function return type,
- //! and function arguments follow.
- //!
- //! \note This function returns a new function signature, which can be passed to functions where it's required. It's
- //! a convenience function that allows to build function signature statically based on types known at compile time,
- //! which is common in JIT code generation.
- template<typename... RetValueAndArgs>
- static ASMJIT_INLINE_NODEBUG constexpr FuncSignature build(CallConvId ccId = CallConvId::kCDecl, uint32_t vaIndex = kNoVarArgs) noexcept {
- return FuncSignature(ccId, vaIndex, (TypeId(TypeUtils::TypeIdOfT<RetValueAndArgs>::kTypeId))... );
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Copy assignment - function signature can be copied by value.
- ASMJIT_FORCE_INLINE FuncSignature& operator=(const FuncSignature& other) noexcept = default;
-
- //! Compares this function signature with `other` for equality..
- ASMJIT_FORCE_INLINE bool operator==(const FuncSignature& other) const noexcept { return equals(other); }
- //! Compares this function signature with `other` for inequality..
- ASMJIT_FORCE_INLINE bool operator!=(const FuncSignature& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Initialization & Reset
- //! \{
-
- //! Resets this function signature to a default constructed state.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncSignature{}; }
-
- //! \}
-
- //! \name Equality & Comparison
- //! \{
-
- //! Compares this function signature with `other` for equality..
- ASMJIT_INLINE_NODEBUG bool equals(const FuncSignature& other) const noexcept {
- return _ccId == other._ccId &&
- _argCount == other._argCount &&
- _vaIndex == other._vaIndex &&
- _ret == other._ret &&
- memcmp(_args, other._args, sizeof(_args)) == 0;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the calling convention.
- ASMJIT_INLINE_NODEBUG CallConvId callConvId() const noexcept { return _ccId; }
- //! Sets the calling convention to `ccId`;
- ASMJIT_INLINE_NODEBUG void setCallConvId(CallConvId ccId) noexcept { _ccId = ccId; }
-
- //! Tests whether the function signature has a return value.
- ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return _ret != TypeId::kVoid; }
- //! Returns the type of the return value.
- ASMJIT_INLINE_NODEBUG TypeId ret() const noexcept { return _ret; }
- //! Sets the return type to `retType`.
- ASMJIT_INLINE_NODEBUG void setRet(TypeId retType) noexcept { _ret = retType; }
- //! Sets the return type based on `T`.
- template<typename T>
- ASMJIT_INLINE_NODEBUG void setRetT() noexcept { setRet(TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
-
-
- //! Returns the array of function arguments' types.
- ASMJIT_INLINE_NODEBUG const TypeId* args() const noexcept { return _args; }
- //! Returns the number of function arguments.
- ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _argCount; }
-
- //! Returns the type of the argument at index `i`.
- inline TypeId arg(uint32_t i) const noexcept {
- ASMJIT_ASSERT(i < _argCount);
- return _args[i];
- }
-
- //! Sets the argument at index `index` to `argType`.
- inline void setArg(uint32_t index, TypeId argType) noexcept {
- ASMJIT_ASSERT(index < _argCount);
- _args[index] = argType;
- }
- //! Sets the argument at index `i` to the type based on `T`.
- template<typename T>
- inline void setArgT(uint32_t index) noexcept { setArg(index, TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
-
- //! Tests whether an argument can be added to the signature, use before calling \ref addArg() and \ref addArgT().
- //!
- //! \note If you know that you are not adding more arguments than \ref Globals::kMaxFuncArgs then it's not necessary
- //! to use this function. However, if you are adding arguments based on user input, for example, then either check
- //! the number of arguments before using function signature or use \ref canAddArg() before actually adding them to
- //! the function signature.
- inline bool canAddArg() const noexcept { return _argCount < Globals::kMaxFuncArgs; }
-
- //! Appends an argument of `type` to the function prototype.
- inline void addArg(TypeId type) noexcept {
- ASMJIT_ASSERT(_argCount < Globals::kMaxFuncArgs);
- _args[_argCount++] = type;
- }
-
- //! Appends an argument of type based on `T` to the function prototype.
- template<typename T>
- inline void addArgT() noexcept { addArg(TypeId(TypeUtils::TypeIdOfT<T>::kTypeId)); }
-
- //! Tests whether the function has variable number of arguments (...).
- ASMJIT_INLINE_NODEBUG bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; }
- //! Returns the variable arguments (...) index, `kNoVarArgs` if none.
- ASMJIT_INLINE_NODEBUG uint32_t vaIndex() const noexcept { return _vaIndex; }
- //! Sets the variable arguments (...) index to `index`.
- ASMJIT_INLINE_NODEBUG void setVaIndex(uint32_t index) noexcept { _vaIndex = uint8_t(index); }
- //! Resets the variable arguments index (making it a non-va function).
- ASMJIT_INLINE_NODEBUG void resetVaIndex() noexcept { _vaIndex = kNoVarArgs; }
-
- //! \}
-};
-
-#if !defined(ASMJIT_NO_DEPRECATED)
-template<typename... RetValueAndArgs>
-class FuncSignatureT : public FuncSignature {
-public:
- ASMJIT_DEPRECATED("Use FuncSignature::build<RetValueAndArgs>() instead")
- ASMJIT_INLINE_NODEBUG constexpr FuncSignatureT(CallConvId ccId = CallConvId::kCDecl, uint32_t vaIndex = kNoVarArgs) noexcept
- : FuncSignature(ccId, vaIndex, (TypeId(TypeUtils::TypeIdOfT<RetValueAndArgs>::kTypeId))... ) {}
-};
-
-ASMJIT_DEPRECATED("Use FuncSignature instead of FuncSignatureBuilder")
-typedef FuncSignature FuncSignatureBuilder;
-#endif // !ASMJIT_NO_DEPRECATED
-
-//! Argument or return value (or its part) as defined by `FuncSignature`, but with register or stack address
-//! (and other metadata) assigned.
-struct FuncValue {
- //! \name Constants
- //! \{
-
- enum Bits : uint32_t {
- kTypeIdShift = 0, //!< TypeId shift.
- kTypeIdMask = 0x000000FFu, //!< TypeId mask.
-
- kFlagIsReg = 0x00000100u, //!< Passed by register.
- kFlagIsStack = 0x00000200u, //!< Passed by stack.
- kFlagIsIndirect = 0x00000400u, //!< Passed indirectly by reference (internally a pointer).
- kFlagIsDone = 0x00000800u, //!< Used internally by arguments allocator.
-
- kStackOffsetShift = 12, //!< Stack offset shift.
- kStackOffsetMask = 0xFFFFF000u, //!< Stack offset mask (must occupy MSB bits).
-
- kRegIdShift = 16, //!< RegId shift.
- kRegIdMask = 0x00FF0000u, //!< RegId mask.
-
- kRegTypeShift = 24, //!< RegType shift.
- kRegTypeMask = 0xFF000000u //!< RegType mask.
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- uint32_t _data;
-
- //! \}
-
- //! \name Initialization & Reset
- //!
- //! These initialize the whole `FuncValue` to either register or stack. Useful when you know all of these
- //! properties and wanna just set it up.
- //!
- //! \{
-
- //! Initializes this `FuncValue` only to the `typeId` provided - the rest of the values will be cleared.
- ASMJIT_INLINE_NODEBUG void initTypeId(TypeId typeId) noexcept {
- _data = uint32_t(typeId) << kTypeIdShift;
- }
-
- //! Initializes this `FuncValue` to a register of `regType`, `regId`, and assigns its `typeId` and `flags`.
- ASMJIT_INLINE_NODEBUG void initReg(RegType regType, uint32_t regId, TypeId typeId, uint32_t flags = 0) noexcept {
- _data = (uint32_t(regType) << kRegTypeShift) | (regId << kRegIdShift) | (uint32_t(typeId) << kTypeIdShift) | kFlagIsReg | flags;
- }
-
- //! Initializes this `FuncValue` to a stack at the given `offset` and assigns its `typeId`.
- ASMJIT_INLINE_NODEBUG void initStack(int32_t offset, TypeId typeId) noexcept {
- _data = (uint32_t(offset) << kStackOffsetShift) | (uint32_t(typeId) << kTypeIdShift) | kFlagIsStack;
- }
-
- //! Resets the value to its unassigned state.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _data = 0; }
-
- //! \}
-
- //! \name Assign
- //!
- //! These initialize only part of `FuncValue`, useful when building `FuncValue` incrementally. The caller
- //! should first init the type-id by calling `initTypeId` and then continue building either register or stack.
- //!
- //! \{
-
- //! Assigns a register of `regType` and `regId`.
- inline void assignRegData(RegType regType, uint32_t regId) noexcept {
- ASMJIT_ASSERT((_data & (kRegTypeMask | kRegIdMask)) == 0);
- _data |= (uint32_t(regType) << kRegTypeShift) | (regId << kRegIdShift) | kFlagIsReg;
- }
-
- //! Assigns a stack location at `offset`.
- inline void assignStackOffset(int32_t offset) noexcept {
- ASMJIT_ASSERT((_data & kStackOffsetMask) == 0);
- _data |= (uint32_t(offset) << kStackOffsetShift) | kFlagIsStack;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns true if the value is initialized (explicit bool cast).
- ASMJIT_INLINE_NODEBUG explicit operator bool() const noexcept { return _data != 0; }
-
- //! \cond INTERNAL
- ASMJIT_INLINE_NODEBUG void _replaceValue(uint32_t mask, uint32_t value) noexcept { _data = (_data & ~mask) | value; }
- //! \endcond
-
- //! Tests whether the `FuncValue` has a flag `flag` set.
- ASMJIT_INLINE_NODEBUG bool hasFlag(uint32_t flag) const noexcept { return Support::test(_data, flag); }
- //! Adds `flags` to `FuncValue`.
- ASMJIT_INLINE_NODEBUG void addFlags(uint32_t flags) noexcept { _data |= flags; }
- //! Clears `flags` of `FuncValue`.
- ASMJIT_INLINE_NODEBUG void clearFlags(uint32_t flags) noexcept { _data &= ~flags; }
-
- //! Tests whether the value is initialized (i.e. contains a valid data).
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _data != 0; }
- //! Tests whether the argument is passed by register.
- ASMJIT_INLINE_NODEBUG bool isReg() const noexcept { return hasFlag(kFlagIsReg); }
- //! Tests whether the argument is passed by stack.
- ASMJIT_INLINE_NODEBUG bool isStack() const noexcept { return hasFlag(kFlagIsStack); }
- //! Tests whether the argument is passed by register.
- ASMJIT_INLINE_NODEBUG bool isAssigned() const noexcept { return hasFlag(kFlagIsReg | kFlagIsStack); }
- //! Tests whether the argument is passed through a pointer (used by WIN64 to pass XMM|YMM|ZMM).
- ASMJIT_INLINE_NODEBUG bool isIndirect() const noexcept { return hasFlag(kFlagIsIndirect); }
-
- //! Tests whether the argument was already processed (used internally).
- ASMJIT_INLINE_NODEBUG bool isDone() const noexcept { return hasFlag(kFlagIsDone); }
-
- //! Returns a register type of the register used to pass function argument or return value.
- ASMJIT_INLINE_NODEBUG RegType regType() const noexcept { return RegType((_data & kRegTypeMask) >> kRegTypeShift); }
- //! Sets a register type of the register used to pass function argument or return value.
- ASMJIT_INLINE_NODEBUG void setRegType(RegType regType) noexcept { _replaceValue(kRegTypeMask, uint32_t(regType) << kRegTypeShift); }
-
- //! Returns a physical id of the register used to pass function argument or return value.
- ASMJIT_INLINE_NODEBUG uint32_t regId() const noexcept { return (_data & kRegIdMask) >> kRegIdShift; }
- //! Sets a physical id of the register used to pass function argument or return value.
- ASMJIT_INLINE_NODEBUG void setRegId(uint32_t regId) noexcept { _replaceValue(kRegIdMask, regId << kRegIdShift); }
-
- //! Returns a stack offset of this argument.
- ASMJIT_INLINE_NODEBUG int32_t stackOffset() const noexcept { return int32_t(_data & kStackOffsetMask) >> kStackOffsetShift; }
- //! Sets a stack offset of this argument.
- ASMJIT_INLINE_NODEBUG void setStackOffset(int32_t offset) noexcept { _replaceValue(kStackOffsetMask, uint32_t(offset) << kStackOffsetShift); }
-
- //! Tests whether the argument or return value has associated `TypeId`.
- ASMJIT_INLINE_NODEBUG bool hasTypeId() const noexcept { return Support::test(_data, kTypeIdMask); }
- //! Returns a TypeId of this argument or return value.
- ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return TypeId((_data & kTypeIdMask) >> kTypeIdShift); }
- //! Sets a TypeId of this argument or return value.
- ASMJIT_INLINE_NODEBUG void setTypeId(TypeId typeId) noexcept { _replaceValue(kTypeIdMask, uint32_t(typeId) << kTypeIdShift); }
-
- //! \}
-};
-
-//! Contains multiple `FuncValue` instances in an array so functions that use multiple registers for arguments or
-//! return values can represent all inputs and outputs.
-struct FuncValuePack {
-public:
- //! \name Members
- //! \{
-
- //! Values of the pack.
- FuncValue _values[Globals::kMaxValuePack];
-
- //! \}
-
- //! \name Initialization & Reset
- //! \{
-
- //! Resets all values in the pack.
- inline void reset() noexcept {
- for (size_t i = 0; i < Globals::kMaxValuePack; i++)
- _values[i].reset();
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Calculates how many values are in the pack, checking for non-values from the end.
- inline uint32_t count() const noexcept {
- uint32_t n = Globals::kMaxValuePack;
- while (n && !_values[n - 1])
- n--;
- return n;
- }
-
- //! Returns values in this value in the pack.
- //!
- //! \note The returned array has exactly \ref Globals::kMaxValuePack elements.
- ASMJIT_INLINE_NODEBUG FuncValue* values() noexcept { return _values; }
- //! \overload
- ASMJIT_INLINE_NODEBUG const FuncValue* values() const noexcept { return _values; }
-
- //! Resets a value at the given `index` in the pack, which makes it unassigned.
- inline void resetValue(size_t index) noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- _values[index].reset();
- }
-
- //! Tests whether the value at the given `index` in the pack is assigned.
- inline bool hasValue(size_t index) noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- return _values[index].isInitialized();
- }
-
- //! Assigns a register at the given `index` to `reg` and an optional `typeId`.
- inline void assignReg(size_t index, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- ASMJIT_ASSERT(reg.isPhysReg());
- _values[index].initReg(reg.type(), reg.id(), typeId);
- }
-
- //! Assigns a register at the given `index` to `regType`, `regId`, and an optional `typeId`.
- inline void assignReg(size_t index, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- _values[index].initReg(regType, regId, typeId);
- }
-
- //! Assigns a stack location at the given `index` to `offset` and an optional `typeId`.
- inline void assignStack(size_t index, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- _values[index].initStack(offset, typeId);
- }
-
- //! Accesses the value in the pack at the given `index`.
- //!
- //! \note The maximum index value is `Globals::kMaxValuePack - 1`.
- inline FuncValue& operator[](size_t index) {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- return _values[index];
- }
- //! \overload
- inline const FuncValue& operator[](size_t index) const {
- ASMJIT_ASSERT(index < Globals::kMaxValuePack);
- return _values[index];
- }
-
- //! \}
-};
-
-//! Attributes are designed in a way that all are initially false, and user or \ref FuncFrame finalizer adds
-//! them when necessary.
-enum class FuncAttributes : uint32_t {
- //! No attributes.
- kNoAttributes = 0,
-
- //! Function has variable number of arguments.
- kHasVarArgs = 0x00000001u,
- //! Preserve frame pointer (don't omit FP).
- kHasPreservedFP = 0x00000010u,
- //! Function calls other functions (is not leaf).
- kHasFuncCalls = 0x00000020u,
- //! Function has aligned save/restore of vector registers.
- kAlignedVecSR = 0x00000040u,
- //! Function must begin with an instruction that marks a start of a branch or function.
- //!
- //! * `ENDBR32/ENDBR64` instruction is inserted at the beginning of the function (X86, X86_64).
- //! * `BTI` instruction is inserted at the beginning of the function (AArch64)
- kIndirectBranchProtection = 0x00000080u,
- //! FuncFrame is finalized and can be used by prolog/epilog inserter (PEI).
- kIsFinalized = 0x00000800u,
-
- // X86 Specific Attributes
- // -----------------------
-
- //! Enables the use of AVX within the function's body, prolog, and epilog (X86).
- //!
- //! This flag instructs prolog and epilog emitter to use AVX instead of SSE for manipulating XMM registers.
- kX86_AVXEnabled = 0x00010000u,
-
- //! Enables the use of AVX-512 within the function's body, prolog, and epilog (X86).
- //!
- //! This flag instructs Compiler register allocator to use additional 16 registers introduced by AVX-512.
- //! Additionally, if the functions saves full width of ZMM registers (custom calling conventions only) then
- //! the prolog/epilog inserter would use AVX-512 move instructions to emit the save and restore sequence.
- kX86_AVX512Enabled = 0x00020000u,
-
- //! This flag instructs the epilog writer to emit EMMS instruction before RET (X86).
- kX86_MMXCleanup = 0x00040000u,
-
- //! This flag instructs the epilog writer to emit VZEROUPPER instruction before RET (X86).
- kX86_AVXCleanup = 0x00080000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(FuncAttributes)
-
-//! Function detail - \ref CallConv and expanded \ref FuncSignature.
-//!
-//! Function detail is architecture and OS dependent representation of a function. It contains a materialized
-//! calling convention and expanded function signature so all arguments have assigned either register type/id
-//! or stack address.
-class FuncDetail {
-public:
- //! \name Constants
- //! \{
-
- //! Function doesn't have a variable number of arguments (`...`).
- static constexpr uint8_t kNoVarArgs = 0xFFu;
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Calling convention.
- CallConv _callConv {};
- //! Number of function arguments.
- uint8_t _argCount = 0;
- //! Variable arguments index of `kNoVarArgs`.
- uint8_t _vaIndex = 0;
- //! Reserved for future use.
- uint16_t _reserved = 0;
- //! Registers that contain arguments.
- Support::Array<RegMask, Globals::kNumVirtGroups> _usedRegs {};
- //! Size of arguments passed by stack.
- uint32_t _argStackSize = 0;
- //! Function return value(s).
- FuncValuePack _rets {};
- //! Function arguments.
- FuncValuePack _args[Globals::kMaxFuncArgs] {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a default constructed \ref FuncDetail.
- ASMJIT_INLINE_NODEBUG FuncDetail() noexcept {}
-
- //! Copy constructor.
- //!
- //! Function details are copyable.
- ASMJIT_INLINE_NODEBUG FuncDetail(const FuncDetail& other) noexcept = default;
-
- //! Initializes this `FuncDetail` to the given signature.
- ASMJIT_API Error init(const FuncSignature& signature, const Environment& environment) noexcept;
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Assignment operator, copies `other` to this \ref FuncDetail.
- ASMJIT_INLINE_NODEBUG FuncDetail& operator=(const FuncDetail& other) noexcept = default;
-
- //! \}
-
- //! \name Reset
- //! \{
-
- //! Resets the function detail to its default constructed state.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncDetail{}; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the function's calling convention, see `CallConv`.
- ASMJIT_INLINE_NODEBUG const CallConv& callConv() const noexcept { return _callConv; }
-
- //! Returns the associated calling convention flags, see `CallConv::Flags`.
- ASMJIT_INLINE_NODEBUG CallConvFlags flags() const noexcept { return _callConv.flags(); }
- //! Checks whether a CallConv `flag` is set, see `CallConv::Flags`.
- ASMJIT_INLINE_NODEBUG bool hasFlag(CallConvFlags ccFlag) const noexcept { return _callConv.hasFlag(ccFlag); }
-
- //! Tests whether the function has a return value.
- ASMJIT_INLINE_NODEBUG bool hasRet() const noexcept { return bool(_rets[0]); }
- //! Returns the number of function arguments.
- ASMJIT_INLINE_NODEBUG uint32_t argCount() const noexcept { return _argCount; }
-
- //! Returns function return values.
- ASMJIT_INLINE_NODEBUG FuncValuePack& retPack() noexcept { return _rets; }
- //! Returns function return values.
- ASMJIT_INLINE_NODEBUG const FuncValuePack& retPack() const noexcept { return _rets; }
-
- //! Returns a function return value associated with the given `valueIndex`.
- ASMJIT_INLINE_NODEBUG FuncValue& ret(size_t valueIndex = 0) noexcept { return _rets[valueIndex]; }
- //! Returns a function return value associated with the given `valueIndex` (const).
- ASMJIT_INLINE_NODEBUG const FuncValue& ret(size_t valueIndex = 0) const noexcept { return _rets[valueIndex]; }
-
- //! Returns function argument packs array.
- ASMJIT_INLINE_NODEBUG FuncValuePack* argPacks() noexcept { return _args; }
- //! Returns function argument packs array (const).
- ASMJIT_INLINE_NODEBUG const FuncValuePack* argPacks() const noexcept { return _args; }
-
- //! Returns function argument pack at the given `argIndex`.
- inline FuncValuePack& argPack(size_t argIndex) noexcept {
- ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
- return _args[argIndex];
- }
-
- //! Returns function argument pack at the given `argIndex` (const).
- inline const FuncValuePack& argPack(size_t argIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
- return _args[argIndex];
- }
-
- //! Returns an argument at `valueIndex` from the argument pack at the given `argIndex`.
- inline FuncValue& arg(size_t argIndex, size_t valueIndex = 0) noexcept {
- ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
- return _args[argIndex][valueIndex];
- }
-
- //! Returns an argument at `valueIndex` from the argument pack at the given `argIndex` (const).
- inline const FuncValue& arg(size_t argIndex, size_t valueIndex = 0) const noexcept {
- ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
- return _args[argIndex][valueIndex];
- }
-
- //! Resets an argument at the given `argIndex`.
- //!
- //! If the argument is a parameter pack (has multiple values) all values are reset.
- inline void resetArg(size_t argIndex) noexcept {
- ASMJIT_ASSERT(argIndex < Globals::kMaxFuncArgs);
- _args[argIndex].reset();
- }
-
- //! Tests whether the function has variable arguments.
- ASMJIT_INLINE_NODEBUG bool hasVarArgs() const noexcept { return _vaIndex != kNoVarArgs; }
- //! Returns an index of a first variable argument.
- ASMJIT_INLINE_NODEBUG uint32_t vaIndex() const noexcept { return _vaIndex; }
-
- //! Tests whether the function passes one or more argument by stack.
- ASMJIT_INLINE_NODEBUG bool hasStackArgs() const noexcept { return _argStackSize != 0; }
- //! Returns stack size needed for function arguments passed on the stack.
- ASMJIT_INLINE_NODEBUG uint32_t argStackSize() const noexcept { return _argStackSize; }
-
- //! Returns red zone size.
- ASMJIT_INLINE_NODEBUG uint32_t redZoneSize() const noexcept { return _callConv.redZoneSize(); }
- //! Returns spill zone size.
- ASMJIT_INLINE_NODEBUG uint32_t spillZoneSize() const noexcept { return _callConv.spillZoneSize(); }
- //! Returns natural stack alignment.
- ASMJIT_INLINE_NODEBUG uint32_t naturalStackAlignment() const noexcept { return _callConv.naturalStackAlignment(); }
-
- //! Returns a mask of all passed registers of the given register `group`.
- ASMJIT_INLINE_NODEBUG RegMask passedRegs(RegGroup group) const noexcept { return _callConv.passedRegs(group); }
- //! Returns a mask of all preserved registers of the given register `group`.
- ASMJIT_INLINE_NODEBUG RegMask preservedRegs(RegGroup group) const noexcept { return _callConv.preservedRegs(group); }
-
- //! Returns a mask of all used registers of the given register `group`.
- inline RegMask usedRegs(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _usedRegs[size_t(group)];
- }
-
- //! Adds `regs` to the mask of used registers of the given register `group`.
- inline void addUsedRegs(RegGroup group, RegMask regs) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- _usedRegs[size_t(group)] |= regs;
- }
-
- //! \}
-};
-
-//! Function frame.
-//!
-//! Function frame is used directly by prolog and epilog insertion (PEI) utils. It provides information necessary to
-//! insert a proper and ABI conforming prolog and epilog. Function frame calculation is based on `CallConv` and
-//! other function attributes.
-//!
-//! SSE vs AVX vs AVX-512
-//! ---------------------
-//!
-//! Function frame provides a way to tell prolog/epilog inserter to use AVX instructions instead of SSE. Use
-//! `setAvxEnabled()` and `setAvx512Enabled()` to enable AVX and/or AVX-512, respectively. Enabling AVX-512
-//! is mostly for Compiler as it would use 32 SIMD registers instead of 16 when enabled.
-//!
-//! \note If your code uses AVX instructions and AVX is not enabled there would be a performance hit in case that
-//! some registers had to be saved/restored in function's prolog/epilog, respectively. Thus, it's recommended to
-//! always let the function frame know about the use of AVX.
-//!
-//! Function Frame Structure
-//! ------------------------
-//!
-//! Various properties can contribute to the size and structure of the function frame. The function frame in most
-//! cases won't use all of the properties illustrated (for example Spill Zone and Red Zone are never used together).
-//!
-//! ```
-//! +-----------------------------+
-//! | Arguments Passed by Stack |
-//! +-----------------------------+
-//! | Spill Zone |
-//! +-----------------------------+ <- Stack offset (args) starts from here.
-//! | Return Address, if Pushed |
-//! +-----------------------------+ <- Stack pointer (SP) upon entry.
-//! | Save/Restore Stack. |
-//! +-----------------------------+-----------------------------+
-//! | Local Stack | |
-//! +-----------------------------+ Final Stack |
-//! | Call Stack | |
-//! +-----------------------------+-----------------------------+ <- SP after prolog.
-//! | Red Zone |
-//! +-----------------------------+
-//! ```
-class FuncFrame {
-public:
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- //! Tag used to inform that some offset is invalid.
- kTagInvalidOffset = 0xFFFFFFFFu
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Function attributes.
- FuncAttributes _attributes {};
-
- //! Target architecture.
- Arch _arch {};
- //! SP register ID (to access call stack and local stack).
- uint8_t _spRegId = uint8_t(BaseReg::kIdBad);
- //! SA register ID (to access stack arguments).
- uint8_t _saRegId = uint8_t(BaseReg::kIdBad);
-
- //! Red zone size (copied from CallConv).
- uint8_t _redZoneSize = 0;
- //! Spill zone size (copied from CallConv).
- uint8_t _spillZoneSize = 0;
- //! Natural stack alignment (copied from CallConv).
- uint8_t _naturalStackAlignment = 0;
- //! Minimum stack alignment to turn on dynamic alignment.
- uint8_t _minDynamicAlignment = 0;
-
- //! Call stack alignment.
- uint8_t _callStackAlignment = 0;
- //! Local stack alignment.
- uint8_t _localStackAlignment = 0;
- //! Final stack alignment.
- uint8_t _finalStackAlignment = 0;
-
- //! Adjustment of the stack before returning (X86-STDCALL).
- uint16_t _calleeStackCleanup = 0;
-
- //! Call stack size.
- uint32_t _callStackSize = 0;
- //! Local stack size.
- uint32_t _localStackSize = 0;
- //! Final stack size (sum of call stack and local stack).
- uint32_t _finalStackSize = 0;
-
- //! Local stack offset (non-zero only if call stack is used).
- uint32_t _localStackOffset = 0;
- //! Offset relative to SP that contains previous SP (before alignment).
- uint32_t _daOffset = 0;
- //! Offset of the first stack argument relative to SP.
- uint32_t _saOffsetFromSP = 0;
- //! Offset of the first stack argument relative to SA (_saRegId or FP).
- uint32_t _saOffsetFromSA = 0;
-
- //! Local stack adjustment in prolog/epilog.
- uint32_t _stackAdjustment = 0;
-
- //! Registers that are dirty.
- Support::Array<RegMask, Globals::kNumVirtGroups> _dirtyRegs {};
- //! Registers that must be preserved (copied from CallConv).
- Support::Array<RegMask, Globals::kNumVirtGroups> _preservedRegs {};
- //! Size to save/restore per register group.
- Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreRegSize {};
- //! Alignment of save/restore area per register group.
- Support::Array<uint8_t, Globals::kNumVirtGroups> _saveRestoreAlignment {};
-
- //! Stack size required to save registers with push/pop.
- uint16_t _pushPopSaveSize = 0;
- //! Stack size required to save extra registers that cannot use push/pop.
- uint16_t _extraRegSaveSize = 0;
- //! Offset where registers saved/restored via push/pop are stored
- uint32_t _pushPopSaveOffset = 0;
- //! Offset where extra registers that cannot use push/pop are stored.
- uint32_t _extraRegSaveOffset = 0;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a default constructed function frame, which has initialized all members to their default values.
- ASMJIT_INLINE_NODEBUG FuncFrame() noexcept = default;
- //! Creates a copy of `other` function frame.
- ASMJIT_INLINE_NODEBUG FuncFrame(const FuncFrame& other) noexcept = default;
-
- //! \}
-
- //! \name Initialization & Reset
- //! \{
-
- //! Initializes the function frame based on `func` detail.
- ASMJIT_API Error init(const FuncDetail& func) noexcept;
- //! Resets the function frame into its default constructed state.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = FuncFrame{}; }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Copy assignment - function frame is copy assignable.
- ASMJIT_INLINE_NODEBUG FuncFrame& operator=(const FuncFrame& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the target architecture of the function frame.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
-
- //! Returns function frame attributes, see `Attributes`.
- ASMJIT_INLINE_NODEBUG FuncAttributes attributes() const noexcept { return _attributes; }
- //! Checks whether the FuncFame contains an attribute `attr`.
- ASMJIT_INLINE_NODEBUG bool hasAttribute(FuncAttributes attr) const noexcept { return Support::test(_attributes, attr); }
- //! Adds attributes `attrs` to the FuncFrame.
- ASMJIT_INLINE_NODEBUG void addAttributes(FuncAttributes attrs) noexcept { _attributes |= attrs; }
- //! Clears attributes `attrs` from the FrameFrame.
- ASMJIT_INLINE_NODEBUG void clearAttributes(FuncAttributes attrs) noexcept { _attributes &= ~attrs; }
-
- //! Tests whether the function has variable number of arguments.
- ASMJIT_INLINE_NODEBUG bool hasVarArgs() const noexcept { return hasAttribute(FuncAttributes::kHasVarArgs); }
- //! Sets the variable arguments flag.
- ASMJIT_INLINE_NODEBUG void setVarArgs() noexcept { addAttributes(FuncAttributes::kHasVarArgs); }
- //! Resets variable arguments flag.
- ASMJIT_INLINE_NODEBUG void resetVarArgs() noexcept { clearAttributes(FuncAttributes::kHasVarArgs); }
-
- //! Tests whether the function preserves frame pointer (EBP|ESP on X86).
- ASMJIT_INLINE_NODEBUG bool hasPreservedFP() const noexcept { return hasAttribute(FuncAttributes::kHasPreservedFP); }
- //! Enables preserved frame pointer.
- ASMJIT_INLINE_NODEBUG void setPreservedFP() noexcept { addAttributes(FuncAttributes::kHasPreservedFP); }
- //! Disables preserved frame pointer.
- ASMJIT_INLINE_NODEBUG void resetPreservedFP() noexcept { clearAttributes(FuncAttributes::kHasPreservedFP); }
-
- //! Tests whether the function calls other functions.
- ASMJIT_INLINE_NODEBUG bool hasFuncCalls() const noexcept { return hasAttribute(FuncAttributes::kHasFuncCalls); }
- //! Sets `FuncAttributes::kHasFuncCalls` to true.
- ASMJIT_INLINE_NODEBUG void setFuncCalls() noexcept { addAttributes(FuncAttributes::kHasFuncCalls); }
- //! Sets `FuncAttributes::kHasFuncCalls` to false.
- ASMJIT_INLINE_NODEBUG void resetFuncCalls() noexcept { clearAttributes(FuncAttributes::kHasFuncCalls); }
-
- //! Tests whether the function uses indirect branch protection, see \ref FuncAttributes::kIndirectBranchProtection.
- ASMJIT_INLINE_NODEBUG bool hasIndirectBranchProtection() const noexcept { return hasAttribute(FuncAttributes::kIndirectBranchProtection); }
- //! Enabled indirect branch protection (sets `FuncAttributes::kIndirectBranchProtection` attribute to true).
- ASMJIT_INLINE_NODEBUG void setIndirectBranchProtection() noexcept { addAttributes(FuncAttributes::kIndirectBranchProtection); }
- //! Disables indirect branch protection (sets `FuncAttributes::kIndirectBranchProtection` attribute to false).
- ASMJIT_INLINE_NODEBUG void resetIndirectBranchProtection() noexcept { clearAttributes(FuncAttributes::kIndirectBranchProtection); }
-
- //! Tests whether the function has AVX enabled.
- ASMJIT_INLINE_NODEBUG bool isAvxEnabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXEnabled); }
- //! Enables AVX use.
- ASMJIT_INLINE_NODEBUG void setAvxEnabled() noexcept { addAttributes(FuncAttributes::kX86_AVXEnabled); }
- //! Disables AVX use.
- ASMJIT_INLINE_NODEBUG void resetAvxEnabled() noexcept { clearAttributes(FuncAttributes::kX86_AVXEnabled); }
-
- //! Tests whether the function has AVX-512 enabled.
- ASMJIT_INLINE_NODEBUG bool isAvx512Enabled() const noexcept { return hasAttribute(FuncAttributes::kX86_AVX512Enabled); }
- //! Enables AVX-512 use.
- ASMJIT_INLINE_NODEBUG void setAvx512Enabled() noexcept { addAttributes(FuncAttributes::kX86_AVX512Enabled); }
- //! Disables AVX-512 use.
- ASMJIT_INLINE_NODEBUG void resetAvx512Enabled() noexcept { clearAttributes(FuncAttributes::kX86_AVX512Enabled); }
-
- //! Tests whether the function has MMX cleanup - 'emms' instruction in epilog.
- ASMJIT_INLINE_NODEBUG bool hasMmxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_MMXCleanup); }
- //! Enables MMX cleanup.
- ASMJIT_INLINE_NODEBUG void setMmxCleanup() noexcept { addAttributes(FuncAttributes::kX86_MMXCleanup); }
- //! Disables MMX cleanup.
- ASMJIT_INLINE_NODEBUG void resetMmxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_MMXCleanup); }
-
- //! Tests whether the function has AVX cleanup - 'vzeroupper' instruction in epilog.
- ASMJIT_INLINE_NODEBUG bool hasAvxCleanup() const noexcept { return hasAttribute(FuncAttributes::kX86_AVXCleanup); }
- //! Enables AVX cleanup.
- ASMJIT_INLINE_NODEBUG void setAvxCleanup() noexcept { addAttributes(FuncAttributes::kX86_AVXCleanup); }
- //! Disables AVX cleanup.
- ASMJIT_INLINE_NODEBUG void resetAvxCleanup() noexcept { clearAttributes(FuncAttributes::kX86_AVXCleanup); }
-
- //! Tests whether the function uses call stack.
- ASMJIT_INLINE_NODEBUG bool hasCallStack() const noexcept { return _callStackSize != 0; }
- //! Tests whether the function uses local stack.
- ASMJIT_INLINE_NODEBUG bool hasLocalStack() const noexcept { return _localStackSize != 0; }
- //! Tests whether vector registers can be saved and restored by using aligned reads and writes.
- ASMJIT_INLINE_NODEBUG bool hasAlignedVecSR() const noexcept { return hasAttribute(FuncAttributes::kAlignedVecSR); }
- //! Tests whether the function has to align stack dynamically.
- ASMJIT_INLINE_NODEBUG bool hasDynamicAlignment() const noexcept { return _finalStackAlignment >= _minDynamicAlignment; }
-
- //! Tests whether the calling convention specifies 'RedZone'.
- ASMJIT_INLINE_NODEBUG bool hasRedZone() const noexcept { return _redZoneSize != 0; }
- //! Tests whether the calling convention specifies 'SpillZone'.
- ASMJIT_INLINE_NODEBUG bool hasSpillZone() const noexcept { return _spillZoneSize != 0; }
-
- //! Returns the size of 'RedZone'.
- ASMJIT_INLINE_NODEBUG uint32_t redZoneSize() const noexcept { return _redZoneSize; }
- //! Returns the size of 'SpillZone'.
- ASMJIT_INLINE_NODEBUG uint32_t spillZoneSize() const noexcept { return _spillZoneSize; }
-
- //! Resets the size of red zone, which would disable it entirely.
- //!
- //! \note Red zone is currently only used by an AMD64 SystemV calling convention, which expects 128
- //! bytes of stack to be accessible below stack pointer. These bytes are then accessible within the
- //! function and Compiler can use this space as a spill area. However, sometimes it's better to
- //! disallow the use of red zone in case that a user wants to use this stack for a custom purpose.
- ASMJIT_INLINE_NODEBUG void resetRedZone() noexcept { _redZoneSize = 0; }
-
- //! Returns natural stack alignment (guaranteed stack alignment upon entry).
- ASMJIT_INLINE_NODEBUG uint32_t naturalStackAlignment() const noexcept { return _naturalStackAlignment; }
- //! Returns natural stack alignment (guaranteed stack alignment upon entry).
- ASMJIT_INLINE_NODEBUG uint32_t minDynamicAlignment() const noexcept { return _minDynamicAlignment; }
-
- //! Tests whether the callee must adjust SP before returning (X86-STDCALL only)
- ASMJIT_INLINE_NODEBUG bool hasCalleeStackCleanup() const noexcept { return _calleeStackCleanup != 0; }
- //! Returns home many bytes of the stack the callee must adjust before returning (X86-STDCALL only)
- ASMJIT_INLINE_NODEBUG uint32_t calleeStackCleanup() const noexcept { return _calleeStackCleanup; }
-
- //! Returns call stack alignment.
- ASMJIT_INLINE_NODEBUG uint32_t callStackAlignment() const noexcept { return _callStackAlignment; }
- //! Returns local stack alignment.
- ASMJIT_INLINE_NODEBUG uint32_t localStackAlignment() const noexcept { return _localStackAlignment; }
- //! Returns final stack alignment (the maximum value of call, local, and natural stack alignments).
- ASMJIT_INLINE_NODEBUG uint32_t finalStackAlignment() const noexcept { return _finalStackAlignment; }
-
- //! Sets call stack alignment.
- //!
- //! \note This also updates the final stack alignment.
- inline void setCallStackAlignment(uint32_t alignment) noexcept {
- _callStackAlignment = uint8_t(alignment);
- _finalStackAlignment = Support::max(_naturalStackAlignment, _callStackAlignment, _localStackAlignment);
- }
-
- //! Sets local stack alignment.
- //!
- //! \note This also updates the final stack alignment.
- inline void setLocalStackAlignment(uint32_t value) noexcept {
- _localStackAlignment = uint8_t(value);
- _finalStackAlignment = Support::max(_naturalStackAlignment, _callStackAlignment, _localStackAlignment);
- }
-
- //! Combines call stack alignment with `alignment`, updating it to the greater value.
- //!
- //! \note This also updates the final stack alignment.
- inline void updateCallStackAlignment(uint32_t alignment) noexcept {
- _callStackAlignment = uint8_t(Support::max<uint32_t>(_callStackAlignment, alignment));
- _finalStackAlignment = Support::max(_finalStackAlignment, _callStackAlignment);
- }
-
- //! Combines local stack alignment with `alignment`, updating it to the greater value.
- //!
- //! \note This also updates the final stack alignment.
- inline void updateLocalStackAlignment(uint32_t alignment) noexcept {
- _localStackAlignment = uint8_t(Support::max<uint32_t>(_localStackAlignment, alignment));
- _finalStackAlignment = Support::max(_finalStackAlignment, _localStackAlignment);
- }
-
- //! Returns call stack size.
- ASMJIT_INLINE_NODEBUG uint32_t callStackSize() const noexcept { return _callStackSize; }
- //! Returns local stack size.
- ASMJIT_INLINE_NODEBUG uint32_t localStackSize() const noexcept { return _localStackSize; }
-
- //! Sets call stack size.
- ASMJIT_INLINE_NODEBUG void setCallStackSize(uint32_t size) noexcept { _callStackSize = size; }
- //! Sets local stack size.
- ASMJIT_INLINE_NODEBUG void setLocalStackSize(uint32_t size) noexcept { _localStackSize = size; }
-
- //! Combines call stack size with `size`, updating it to the greater value.
- ASMJIT_INLINE_NODEBUG void updateCallStackSize(uint32_t size) noexcept { _callStackSize = Support::max(_callStackSize, size); }
- //! Combines local stack size with `size`, updating it to the greater value.
- ASMJIT_INLINE_NODEBUG void updateLocalStackSize(uint32_t size) noexcept { _localStackSize = Support::max(_localStackSize, size); }
-
- //! Returns final stack size (only valid after the FuncFrame is finalized).
- ASMJIT_INLINE_NODEBUG uint32_t finalStackSize() const noexcept { return _finalStackSize; }
-
- //! Returns an offset to access the local stack (non-zero only if call stack is used).
- ASMJIT_INLINE_NODEBUG uint32_t localStackOffset() const noexcept { return _localStackOffset; }
-
- //! Tests whether the function prolog/epilog requires a memory slot for storing unaligned SP.
- ASMJIT_INLINE_NODEBUG bool hasDAOffset() const noexcept { return _daOffset != kTagInvalidOffset; }
- //! Returns a memory offset used to store DA (dynamic alignment) slot (relative to SP).
- ASMJIT_INLINE_NODEBUG uint32_t daOffset() const noexcept { return _daOffset; }
-
- ASMJIT_INLINE_NODEBUG uint32_t saOffset(uint32_t regId) const noexcept {
- return regId == _spRegId ? saOffsetFromSP()
- : saOffsetFromSA();
- }
-
- ASMJIT_INLINE_NODEBUG uint32_t saOffsetFromSP() const noexcept { return _saOffsetFromSP; }
- ASMJIT_INLINE_NODEBUG uint32_t saOffsetFromSA() const noexcept { return _saOffsetFromSA; }
-
- //! Returns mask of registers of the given register `group` that are modified by the function. The engine would
- //! then calculate which registers must be saved & restored by the function by using the data provided by the
- //! calling convention.
- inline RegMask dirtyRegs(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _dirtyRegs[group];
- }
-
- //! Sets which registers (as a mask) are modified by the function.
- //!
- //! \remarks Please note that this will completely overwrite the existing register mask, use `addDirtyRegs()`
- //! to modify the existing register mask.
- inline void setDirtyRegs(RegGroup group, RegMask regs) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- _dirtyRegs[group] = regs;
- }
-
- //! Adds which registers (as a mask) are modified by the function.
- inline void addDirtyRegs(RegGroup group, RegMask regs) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- _dirtyRegs[group] |= regs;
- }
-
- //! \overload
- inline void addDirtyRegs(const BaseReg& reg) noexcept {
- ASMJIT_ASSERT(reg.id() < Globals::kMaxPhysRegs);
- addDirtyRegs(reg.group(), Support::bitMask(reg.id()));
- }
-
- //! \overload
- template<typename... Args>
- inline void addDirtyRegs(const BaseReg& reg, Args&&... args) noexcept {
- addDirtyRegs(reg);
- addDirtyRegs(std::forward<Args>(args)...);
- }
-
- //! A helper function to set all registers from all register groups dirty.
- //!
- //! \note This should not be used in general as it's the most pessimistic case. However, it can be used for testing
- //! or in cases in which all registers are considered clobbered.
- ASMJIT_INLINE_NODEBUG void setAllDirty() noexcept {
- for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_dirtyRegs); i++)
- _dirtyRegs[i] = 0xFFFFFFFFu;
- }
-
- //! A helper function to set all registers from the given register `group` dirty.
- inline void setAllDirty(RegGroup group) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- _dirtyRegs[group] = 0xFFFFFFFFu;
- }
-
- //! Returns a calculated mask of registers of the given `group` that will be saved and restored in the function's
- //! prolog and epilog, respectively. The register mask is calculated from both `dirtyRegs` (provided by user) and
- //! `preservedMask` (provided by the calling convention).
- inline RegMask savedRegs(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _dirtyRegs[group] & _preservedRegs[group];
- }
-
- //! Returns the mask of preserved registers of the given register `group`.
- //!
- //! Preserved registers are those that must survive the function call unmodified. The function can only modify
- //! preserved registers it they are saved and restored in function's prolog and epilog, respectively.
- inline RegMask preservedRegs(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _preservedRegs[group];
- }
-
- //! Returns the size of a save-restore are for the required register `group`.
- inline uint32_t saveRestoreRegSize(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _saveRestoreRegSize[group];
- }
-
- inline uint32_t saveRestoreAlignment(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _saveRestoreAlignment[group];
- }
-
- ASMJIT_INLINE_NODEBUG bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; }
- ASMJIT_INLINE_NODEBUG uint32_t saRegId() const noexcept { return _saRegId; }
- ASMJIT_INLINE_NODEBUG void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); }
- ASMJIT_INLINE_NODEBUG void resetSARegId() { setSARegId(BaseReg::kIdBad); }
-
- //! Returns stack size required to save/restore registers via push/pop.
- ASMJIT_INLINE_NODEBUG uint32_t pushPopSaveSize() const noexcept { return _pushPopSaveSize; }
- //! Returns an offset to the stack where registers are saved via push/pop.
- ASMJIT_INLINE_NODEBUG uint32_t pushPopSaveOffset() const noexcept { return _pushPopSaveOffset; }
-
- //! Returns stack size required to save/restore extra registers that don't use push/pop/
- //!
- //! \note On X86 this covers all registers except GP registers, on other architectures it can be always
- //! zero (for example AArch64 saves all registers via push/pop like instructions, so this would be zero).
- ASMJIT_INLINE_NODEBUG uint32_t extraRegSaveSize() const noexcept { return _extraRegSaveSize; }
- //! Returns an offset to the stack where extra registers are saved.
- ASMJIT_INLINE_NODEBUG uint32_t extraRegSaveOffset() const noexcept { return _extraRegSaveOffset; }
-
- //! Tests whether the functions contains stack adjustment.
- ASMJIT_INLINE_NODEBUG bool hasStackAdjustment() const noexcept { return _stackAdjustment != 0; }
- //! Returns function's stack adjustment used in function's prolog and epilog.
- //!
- //! If the returned value is zero it means that the stack is not adjusted. This can mean both that the stack
- //! is not used and/or the stack is only adjusted by instructions that pust/pop registers into/from stack.
- ASMJIT_INLINE_NODEBUG uint32_t stackAdjustment() const noexcept { return _stackAdjustment; }
-
- //! \}
-
- //! \name Finalization
- //! \{
-
- ASMJIT_API Error finalize() noexcept;
-
- //! \}
-};
-
-//! A helper class that can be used to assign a physical register for each function argument. Use with
-//! `BaseEmitter::emitArgsAssignment()`.
-class FuncArgsAssignment {
-public:
- //! \name Members
- //! \{
-
- //! Function detail.
- const FuncDetail* _funcDetail {};
- //! Register that can be used to access arguments passed by stack.
- uint8_t _saRegId = uint8_t(BaseReg::kIdBad);
- //! Reserved for future use.
- uint8_t _reserved[3] {};
- //! Mapping of each function argument.
- FuncValuePack _argPacks[Globals::kMaxFuncArgs] {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates either a default initialized `FuncArgsAssignment` or to assignment that links to `fd`, if non-null.
- ASMJIT_INLINE_NODEBUG explicit FuncArgsAssignment(const FuncDetail* fd = nullptr) noexcept { reset(fd); }
-
- //! Copy constructor.
- ASMJIT_INLINE_NODEBUG FuncArgsAssignment(const FuncArgsAssignment& other) noexcept = default;
-
- //! Resets this `FuncArgsAssignment` to either default constructed state or to assignment that links to `fd`,
- //! if non-null.
- inline void reset(const FuncDetail* fd = nullptr) noexcept {
- _funcDetail = fd;
- _saRegId = uint8_t(BaseReg::kIdBad);
- memset(_reserved, 0, sizeof(_reserved));
- memset(_argPacks, 0, sizeof(_argPacks));
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Copy assignment.
- ASMJIT_INLINE_NODEBUG FuncArgsAssignment& operator=(const FuncArgsAssignment& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the associated \ref FuncDetail of this `FuncArgsAssignment`.
- ASMJIT_INLINE_NODEBUG const FuncDetail* funcDetail() const noexcept { return _funcDetail; }
- //! Associates \ref FuncDetails with this `FuncArgsAssignment`.
- ASMJIT_INLINE_NODEBUG void setFuncDetail(const FuncDetail* fd) noexcept { _funcDetail = fd; }
-
- ASMJIT_INLINE_NODEBUG bool hasSARegId() const noexcept { return _saRegId != BaseReg::kIdBad; }
- ASMJIT_INLINE_NODEBUG uint32_t saRegId() const noexcept { return _saRegId; }
- ASMJIT_INLINE_NODEBUG void setSARegId(uint32_t regId) { _saRegId = uint8_t(regId); }
- ASMJIT_INLINE_NODEBUG void resetSARegId() { _saRegId = uint8_t(BaseReg::kIdBad); }
-
- //! Returns assigned argument at `argIndex` and `valueIndex`.
- //!
- //! \note `argIndex` refers to he function argument and `valueIndex` refers to a value pack (in case multiple
- //! values are passed as a single argument).
- inline FuncValue& arg(size_t argIndex, size_t valueIndex) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- return _argPacks[argIndex][valueIndex];
- }
- //! \overload
- inline const FuncValue& arg(size_t argIndex, size_t valueIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- return _argPacks[argIndex][valueIndex];
- }
-
- //! Tests whether argument at `argIndex` and `valueIndex` has been assigned.
- inline bool isAssigned(size_t argIndex, size_t valueIndex) const noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- return _argPacks[argIndex][valueIndex].isAssigned();
- }
-
- //! Assigns register at `argIndex` and value index of 0 to `reg` and an optional `typeId`.
- inline void assignReg(size_t argIndex, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- ASMJIT_ASSERT(reg.isPhysReg());
- _argPacks[argIndex][0].initReg(reg.type(), reg.id(), typeId);
- }
-
- //! Assigns register at `argIndex` and value index of 0 to `regType`, `regId`, and an optional `typeId`.
- inline void assignReg(size_t argIndex, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- _argPacks[argIndex][0].initReg(regType, regId, typeId);
- }
-
- //! Assigns stack at `argIndex` and value index of 0 to `offset` and an optional `typeId`.
- inline void assignStack(size_t argIndex, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- _argPacks[argIndex][0].initStack(offset, typeId);
- }
-
- //! Assigns register at `argIndex` and `valueIndex` to `reg` and an optional `typeId`.
- inline void assignRegInPack(size_t argIndex, size_t valueIndex, const BaseReg& reg, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- ASMJIT_ASSERT(reg.isPhysReg());
- _argPacks[argIndex][valueIndex].initReg(reg.type(), reg.id(), typeId);
- }
-
- //! Assigns register at `argIndex` and `valueIndex` to `regType`, `regId`, and an optional `typeId`.
- inline void assignRegInPack(size_t argIndex, size_t valueIndex, RegType regType, uint32_t regId, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- _argPacks[argIndex][valueIndex].initReg(regType, regId, typeId);
- }
-
- //! Assigns stack at `argIndex` and `valueIndex` to `offset` and an optional `typeId`.
- inline void assignStackInPack(size_t argIndex, size_t valueIndex, int32_t offset, TypeId typeId = TypeId::kVoid) noexcept {
- ASMJIT_ASSERT(argIndex < ASMJIT_ARRAY_SIZE(_argPacks));
- _argPacks[argIndex][valueIndex].initStack(offset, typeId);
- }
-
- // NOTE: All `assignAll()` methods are shortcuts to assign all arguments at once, however, since registers are
- // passed all at once these initializers don't provide any way to pass TypeId and/or to keep any argument between
- // the arguments passed unassigned.
- inline void _assignAllInternal(size_t argIndex, const BaseReg& reg) noexcept {
- assignReg(argIndex, reg);
- }
-
- template<typename... Args>
- inline void _assignAllInternal(size_t argIndex, const BaseReg& reg, Args&&... args) noexcept {
- assignReg(argIndex, reg);
- _assignAllInternal(argIndex + 1, std::forward<Args>(args)...);
- }
-
- //! Assigns all argument at once.
- //!
- //! \note This function can be only used if the arguments don't contain value packs (multiple values per argument).
- template<typename... Args>
- inline void assignAll(Args&&... args) noexcept {
- _assignAllInternal(0, std::forward<Args>(args)...);
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Update `FuncFrame` based on function's arguments assignment.
- //!
- //! \note This function must be called in order to use `BaseEmitter::emitArgsAssignment()`, otherwise the \ref FuncFrame
- //! would not contain the information necessary to assign all arguments into the registers and/or stack specified.
- ASMJIT_API Error updateFuncFrame(FuncFrame& frame) const noexcept;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_FUNC_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp b/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp
deleted file mode 100644
index a6580874089..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/funcargscontext.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/funcargscontext_p.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_core
-//! \{
-
-FuncArgsContext::FuncArgsContext() noexcept {
- for (RegGroup group : RegGroupVirtValues{})
- _workData[size_t(group)].reset();
-}
-
-ASMJIT_FAVOR_SIZE Error FuncArgsContext::initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept {
- Arch arch = frame.arch();
- const FuncDetail& func = *args.funcDetail();
-
- _archTraits = &ArchTraits::byArch(arch);
- _constraints = constraints;
- _arch = arch;
-
- // Initialize `_archRegs`.
- for (RegGroup group : RegGroupVirtValues{})
- _workData[group]._archRegs = _constraints->availableRegs(group);
-
- if (frame.hasPreservedFP())
- _workData[size_t(RegGroup::kGp)]._archRegs &= ~Support::bitMask(archTraits().fpRegId());
-
- // Extract information from all function arguments/assignments and build Var[] array.
- uint32_t varId = 0;
- for (uint32_t argIndex = 0; argIndex < Globals::kMaxFuncArgs; argIndex++) {
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- const FuncValue& dst_ = args.arg(argIndex, valueIndex);
- if (!dst_.isAssigned())
- continue;
-
- const FuncValue& src_ = func.arg(argIndex, valueIndex);
- if (ASMJIT_UNLIKELY(!src_.isAssigned()))
- return DebugUtils::errored(kErrorInvalidState);
-
- Var& var = _vars[varId];
- var.init(src_, dst_);
-
- FuncValue& src = var.cur;
- FuncValue& dst = var.out;
-
- RegGroup dstGroup = RegGroup::kMaxValue;
- uint32_t dstId = BaseReg::kIdBad;
- WorkData* dstWd = nullptr;
-
- // Not supported.
- if (src.isIndirect())
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- if (dst.isReg()) {
- RegType dstType = dst.regType();
- if (ASMJIT_UNLIKELY(!archTraits().hasRegType(dstType)))
- return DebugUtils::errored(kErrorInvalidRegType);
-
- // Copy TypeId from source if the destination doesn't have it. The RA used by BaseCompiler would never
- // leave TypeId undefined, but users of FuncAPI can just assign phys regs without specifying the type.
- if (!dst.hasTypeId())
- dst.setTypeId(archTraits().regTypeToTypeId(dst.regType()));
-
- dstGroup = archTraits().regTypeToGroup(dstType);
- if (ASMJIT_UNLIKELY(dstGroup > RegGroup::kMaxVirt))
- return DebugUtils::errored(kErrorInvalidRegGroup);
-
- dstWd = &_workData[dstGroup];
- dstId = dst.regId();
- if (ASMJIT_UNLIKELY(dstId >= 32 || !Support::bitTest(dstWd->archRegs(), dstId)))
- return DebugUtils::errored(kErrorInvalidPhysId);
-
- if (ASMJIT_UNLIKELY(Support::bitTest(dstWd->dstRegs(), dstId)))
- return DebugUtils::errored(kErrorOverlappedRegs);
-
- dstWd->_dstRegs |= Support::bitMask(dstId);
- dstWd->_dstShuf |= Support::bitMask(dstId);
- dstWd->_usedRegs |= Support::bitMask(dstId);
- }
- else {
- if (!dst.hasTypeId())
- dst.setTypeId(src.typeId());
-
- OperandSignature signature = getSuitableRegForMemToMemMove(arch, dst.typeId(), src.typeId());
- if (ASMJIT_UNLIKELY(!signature.isValid()))
- return DebugUtils::errored(kErrorInvalidState);
- _stackDstMask = uint8_t(_stackDstMask | Support::bitMask(signature.regGroup()));
- }
-
- if (src.isReg()) {
- uint32_t srcId = src.regId();
- RegGroup srcGroup = archTraits().regTypeToGroup(src.regType());
-
- if (dstGroup == srcGroup) {
- ASMJIT_ASSERT(dstWd != nullptr);
- dstWd->assign(varId, srcId);
-
- // The best case, register is allocated where it is expected to be. However, we should
- // not mark this as done if both registers are GP and sign or zero extension is required.
- if (dstId == srcId) {
- if (dstGroup != RegGroup::kGp) {
- var.markDone();
- }
- else {
- TypeId dt = dst.typeId();
- TypeId st = src.typeId();
-
- uint32_t dstSize = TypeUtils::sizeOf(dt);
- uint32_t srcSize = TypeUtils::sizeOf(st);
-
- if (dt == TypeId::kVoid || st == TypeId::kVoid || dstSize <= srcSize)
- var.markDone();
- }
- }
- }
- else {
- if (ASMJIT_UNLIKELY(srcGroup > RegGroup::kMaxVirt))
- return DebugUtils::errored(kErrorInvalidState);
-
- WorkData& srcData = _workData[size_t(srcGroup)];
- srcData.assign(varId, srcId);
- }
- }
- else {
- if (dstWd)
- dstWd->_numStackArgs++;
- _hasStackSrc = true;
- }
-
- varId++;
- }
- }
-
- // Initialize WorkData::workRegs.
- for (RegGroup group : RegGroupVirtValues{}) {
- _workData[group]._workRegs =
- (_workData[group].archRegs() & (frame.dirtyRegs(group) | ~frame.preservedRegs(group))) | _workData[group].dstRegs() | _workData[group].assignedRegs();
- }
-
- // Create a variable that represents `SARegId` if necessary.
- bool saRegRequired = _hasStackSrc && frame.hasDynamicAlignment() && !frame.hasPreservedFP();
-
- WorkData& gpRegs = _workData[RegGroup::kGp];
- uint32_t saCurRegId = frame.saRegId();
- uint32_t saOutRegId = args.saRegId();
-
- if (saCurRegId != BaseReg::kIdBad) {
- // Check if the provided `SARegId` doesn't collide with input registers.
- if (ASMJIT_UNLIKELY(gpRegs.isAssigned(saCurRegId)))
- return DebugUtils::errored(kErrorOverlappedRegs);
- }
-
- if (saOutRegId != BaseReg::kIdBad) {
- // Check if the provided `SARegId` doesn't collide with argument assignments.
- if (ASMJIT_UNLIKELY(Support::bitTest(gpRegs.dstRegs(), saOutRegId)))
- return DebugUtils::errored(kErrorOverlappedRegs);
- saRegRequired = true;
- }
-
- if (saRegRequired) {
- TypeId ptrTypeId = Environment::is32Bit(arch) ? TypeId::kUInt32 : TypeId::kUInt64;
- RegType ptrRegType = Environment::is32Bit(arch) ? RegType::kGp32 : RegType::kGp64;
-
- _saVarId = uint8_t(varId);
- _hasPreservedFP = frame.hasPreservedFP();
-
- Var& var = _vars[varId];
- var.reset();
-
- if (saCurRegId == BaseReg::kIdBad) {
- if (saOutRegId != BaseReg::kIdBad && !gpRegs.isAssigned(saOutRegId)) {
- saCurRegId = saOutRegId;
- }
- else {
- RegMask availableRegs = gpRegs.availableRegs();
- if (!availableRegs)
- availableRegs = gpRegs.archRegs() & ~gpRegs.workRegs();
-
- if (ASMJIT_UNLIKELY(!availableRegs))
- return DebugUtils::errored(kErrorNoMorePhysRegs);
-
- saCurRegId = Support::ctz(availableRegs);
- }
- }
-
- var.cur.initReg(ptrRegType, saCurRegId, ptrTypeId);
- gpRegs.assign(varId, saCurRegId);
- gpRegs._workRegs |= Support::bitMask(saCurRegId);
-
- if (saOutRegId != BaseReg::kIdBad) {
- var.out.initReg(ptrRegType, saOutRegId, ptrTypeId);
- gpRegs._dstRegs |= Support::bitMask(saOutRegId);
- gpRegs._workRegs |= Support::bitMask(saOutRegId);
- }
- else {
- var.markDone();
- }
-
- varId++;
- }
-
- _varCount = varId;
-
- // Detect register swaps.
- for (varId = 0; varId < _varCount; varId++) {
- Var& var = _vars[varId];
- if (var.cur.isReg() && var.out.isReg()) {
- uint32_t srcId = var.cur.regId();
- uint32_t dstId = var.out.regId();
-
- RegGroup group = archTraits().regTypeToGroup(var.cur.regType());
- if (group != archTraits().regTypeToGroup(var.out.regType()))
- continue;
-
- WorkData& wd = _workData[group];
- if (wd.isAssigned(dstId)) {
- Var& other = _vars[wd._physToVarId[dstId]];
- if (archTraits().regTypeToGroup(other.out.regType()) == group && other.out.regId() == srcId) {
- wd._numSwaps++;
- _regSwapsMask = uint8_t(_regSwapsMask | Support::bitMask(group));
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error FuncArgsContext::markDstRegsDirty(FuncFrame& frame) noexcept {
- for (RegGroup group : RegGroupVirtValues{}) {
- WorkData& wd = _workData[group];
- uint32_t regs = wd.usedRegs() | wd._dstShuf;
-
- wd._workRegs |= regs;
- frame.addDirtyRegs(group, regs);
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error FuncArgsContext::markScratchRegs(FuncFrame& frame) noexcept {
- uint32_t groupMask = 0;
-
- // Handle stack to stack moves.
- groupMask |= _stackDstMask;
-
- // Handle register swaps.
- groupMask |= _regSwapsMask & ~Support::bitMask(RegGroup::kGp);
-
- if (!groupMask)
- return kErrorOk;
-
- // Selects one dirty register per affected group that can be used as a scratch register.
- for (RegGroup group : RegGroupVirtValues{}) {
- if (Support::bitTest(groupMask, group)) {
- WorkData& wd = _workData[group];
-
- // Initially, pick some clobbered or dirty register.
- RegMask workRegs = wd.workRegs();
- RegMask regs = workRegs & ~(wd.usedRegs() | wd._dstShuf);
-
- // If that didn't work out pick some register which is not in 'used'.
- if (!regs)
- regs = workRegs & ~wd.usedRegs();
-
- // If that didn't work out pick any other register that is allocable.
- // This last resort case will, however, result in marking one more
- // register dirty.
- if (!regs)
- regs = wd.archRegs() & ~workRegs;
-
- // If that didn't work out we will have to use XORs instead of MOVs.
- if (!regs)
- continue;
-
- RegMask regMask = Support::blsi(regs);
- wd._workRegs |= regMask;
- frame.addDirtyRegs(group, regMask);
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error FuncArgsContext::markStackArgsReg(FuncFrame& frame) noexcept {
- if (_saVarId != kVarIdNone) {
- const Var& var = _vars[_saVarId];
- frame.setSARegId(var.cur.regId());
- }
- else if (frame.hasPreservedFP()) {
- frame.setSARegId(archTraits().fpRegId());
- }
-
- return kErrorOk;
-}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h b/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h
deleted file mode 100644
index a8ad6b47dcd..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/funcargscontext_p.h
+++ /dev/null
@@ -1,199 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
-#define ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/environment.h"
-#include "../core/func.h"
-#include "../core/operand.h"
-#include "../core/radefs_p.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_core
-//! \{
-
-static inline OperandSignature getSuitableRegForMemToMemMove(Arch arch, TypeId dstTypeId, TypeId srcTypeId) noexcept {
- const ArchTraits& archTraits = ArchTraits::byArch(arch);
-
- uint32_t dstSize = TypeUtils::sizeOf(dstTypeId);
- uint32_t srcSize = TypeUtils::sizeOf(srcTypeId);
- uint32_t maxSize = Support::max<uint32_t>(dstSize, srcSize);
- uint32_t regSize = Environment::registerSizeFromArch(arch);
-
- OperandSignature signature{0};
- if (maxSize <= regSize || (TypeUtils::isInt(dstTypeId) && TypeUtils::isInt(srcTypeId)))
- signature = maxSize <= 4 ? archTraits.regTypeToSignature(RegType::kGp32)
- : archTraits.regTypeToSignature(RegType::kGp64);
- else if (maxSize <= 8 && archTraits.hasRegType(RegType::kVec64))
- signature = archTraits.regTypeToSignature(RegType::kVec64);
- else if (maxSize <= 16 && archTraits.hasRegType(RegType::kVec128))
- signature = archTraits.regTypeToSignature(RegType::kVec128);
- else if (maxSize <= 32 && archTraits.hasRegType(RegType::kVec256))
- signature = archTraits.regTypeToSignature(RegType::kVec256);
- else if (maxSize <= 64 && archTraits.hasRegType(RegType::kVec512))
- signature = archTraits.regTypeToSignature(RegType::kVec512);
-
- return signature;
-}
-
-class FuncArgsContext {
-public:
- enum VarId : uint32_t {
- kVarIdNone = 0xFF
- };
-
- //! Contains information about a single argument or SA register that may need shuffling.
- struct Var {
- FuncValue cur;
- FuncValue out;
-
- inline void init(const FuncValue& cur_, const FuncValue& out_) noexcept {
- cur = cur_;
- out = out_;
- }
-
- //! Reset the value to its unassigned state.
- inline void reset() noexcept {
- cur.reset();
- out.reset();
- }
-
- inline bool isDone() const noexcept { return cur.isDone(); }
- inline void markDone() noexcept { cur.addFlags(FuncValue::kFlagIsDone); }
- };
-
- struct WorkData {
- //! All allocable registers provided by the architecture.
- RegMask _archRegs;
- //! All registers that can be used by the shuffler.
- RegMask _workRegs;
- //! Registers used by the shuffler (all).
- RegMask _usedRegs;
- //! Assigned registers.
- RegMask _assignedRegs;
- //! Destination registers assigned to arguments or SA.
- RegMask _dstRegs;
- //! Destination registers that require shuffling.
- RegMask _dstShuf;
- //! Number of register swaps.
- uint8_t _numSwaps;
- //! Number of stack loads.
- uint8_t _numStackArgs;
- //! Reserved (only used as padding).
- uint8_t _reserved[6];
- //! Physical ID to variable ID mapping.
- uint8_t _physToVarId[32];
-
- inline void reset() noexcept {
- _archRegs = 0;
- _workRegs = 0;
- _usedRegs = 0;
- _assignedRegs = 0;
- _dstRegs = 0;
- _dstShuf = 0;
- _numSwaps = 0;
- _numStackArgs = 0;
- memset(_reserved, 0, sizeof(_reserved));
- memset(_physToVarId, kVarIdNone, 32);
- }
-
- inline bool isAssigned(uint32_t regId) const noexcept {
- ASMJIT_ASSERT(regId < 32);
- return Support::bitTest(_assignedRegs, regId);
- }
-
- inline void assign(uint32_t varId, uint32_t regId) noexcept {
- ASMJIT_ASSERT(!isAssigned(regId));
- ASMJIT_ASSERT(_physToVarId[regId] == kVarIdNone);
-
- _physToVarId[regId] = uint8_t(varId);
- _assignedRegs ^= Support::bitMask(regId);
- }
-
- inline void reassign(uint32_t varId, uint32_t newId, uint32_t oldId) noexcept {
- ASMJIT_ASSERT( isAssigned(oldId));
- ASMJIT_ASSERT(!isAssigned(newId));
- ASMJIT_ASSERT(_physToVarId[oldId] == varId);
- ASMJIT_ASSERT(_physToVarId[newId] == kVarIdNone);
-
- _physToVarId[oldId] = uint8_t(kVarIdNone);
- _physToVarId[newId] = uint8_t(varId);
- _assignedRegs ^= Support::bitMask(newId) ^ Support::bitMask(oldId);
- }
-
- inline void swap(uint32_t aVarId, uint32_t aRegId, uint32_t bVarId, uint32_t bRegId) noexcept {
- ASMJIT_ASSERT(isAssigned(aRegId));
- ASMJIT_ASSERT(isAssigned(bRegId));
- ASMJIT_ASSERT(_physToVarId[aRegId] == aVarId);
- ASMJIT_ASSERT(_physToVarId[bRegId] == bVarId);
-
- _physToVarId[aRegId] = uint8_t(bVarId);
- _physToVarId[bRegId] = uint8_t(aVarId);
- }
-
- inline void unassign(uint32_t varId, uint32_t regId) noexcept {
- ASMJIT_ASSERT(isAssigned(regId));
- ASMJIT_ASSERT(_physToVarId[regId] == varId);
-
- DebugUtils::unused(varId);
- _physToVarId[regId] = uint8_t(kVarIdNone);
- _assignedRegs ^= Support::bitMask(regId);
- }
-
- inline RegMask archRegs() const noexcept { return _archRegs; }
- inline RegMask workRegs() const noexcept { return _workRegs; }
- inline RegMask usedRegs() const noexcept { return _usedRegs; }
- inline RegMask assignedRegs() const noexcept { return _assignedRegs; }
- inline RegMask dstRegs() const noexcept { return _dstRegs; }
- inline RegMask availableRegs() const noexcept { return _workRegs & ~_assignedRegs; }
- };
-
- //! Architecture traits.
- const ArchTraits* _archTraits = nullptr;
- //! Architecture constraints.
- const RAConstraints* _constraints = nullptr;
- //! Target architecture.
- Arch _arch = Arch::kUnknown;
- //! Has arguments passed via stack (SRC).
- bool _hasStackSrc = false;
- //! Has preserved frame-pointer (FP).
- bool _hasPreservedFP = false;
- //! Has arguments assigned to stack (DST).
- uint8_t _stackDstMask = 0;
- //! Register swap groups (bit-mask).
- uint8_t _regSwapsMask = 0;
- uint8_t _saVarId = kVarIdNone;
- uint32_t _varCount = 0;
- Support::Array<WorkData, Globals::kNumVirtGroups> _workData;
- Var _vars[Globals::kMaxFuncArgs * Globals::kMaxValuePack + 1];
-
- FuncArgsContext() noexcept;
-
- ASMJIT_INLINE_NODEBUG const ArchTraits& archTraits() const noexcept { return *_archTraits; }
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _arch; }
-
- ASMJIT_INLINE_NODEBUG uint32_t varCount() const noexcept { return _varCount; }
- ASMJIT_INLINE_NODEBUG size_t indexOf(const Var* var) const noexcept { return (size_t)(var - _vars); }
-
- ASMJIT_INLINE_NODEBUG Var& var(size_t varId) noexcept { return _vars[varId]; }
- ASMJIT_INLINE_NODEBUG const Var& var(size_t varId) const noexcept { return _vars[varId]; }
-
- Error initWorkData(const FuncFrame& frame, const FuncArgsAssignment& args, const RAConstraints* constraints) noexcept;
- Error markScratchRegs(FuncFrame& frame) noexcept;
- Error markDstRegsDirty(FuncFrame& frame) noexcept;
- Error markStackArgsReg(FuncFrame& frame) noexcept;
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_FUNCARGSCONTEXT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/globals.h b/3rdparty/asmjit/src/asmjit/core/globals.h
deleted file mode 100644
index db921cfc6e1..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/globals.h
+++ /dev/null
@@ -1,421 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_GLOBALS_H_INCLUDED
-#define ASMJIT_CORE_GLOBALS_H_INCLUDED
-
-#include "../core/api-config.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_utilities
-//! \{
-namespace Support {
-
-//! Cast designed to cast between function and void* pointers.
-template<typename Dst, typename Src>
-static inline Dst ptr_cast_impl(Src p) noexcept { return (Dst)p; }
-
-//! Helper to implement placement new/delete without relying on `<new>` header.
-struct PlacementNew { void* ptr; };
-
-} // {Support}
-
-#if defined(ASMJIT_NO_STDCXX)
-namespace Support {
- ASMJIT_FORCE_INLINE void* operatorNew(size_t n) noexcept { return malloc(n); }
- ASMJIT_FORCE_INLINE void operatorDelete(void* p) noexcept { if (p) free(p); }
-} // {Support}
-
-#define ASMJIT_BASE_CLASS(TYPE) \
- ASMJIT_FORCE_INLINE void* operator new(size_t n) noexcept { return Support::operatorNew(n); } \
- ASMJIT_FORCE_INLINE void operator delete(void* ptr) noexcept { Support::operatorDelete(ptr); } \
- \
- ASMJIT_FORCE_INLINE void* operator new(size_t, void* ptr) noexcept { return ptr; } \
- ASMJIT_FORCE_INLINE void operator delete(void*, void*) noexcept {} \
- \
- ASMJIT_FORCE_INLINE void* operator new(size_t, Support::PlacementNew ptr) noexcept { return ptr.ptr; } \
- ASMJIT_FORCE_INLINE void operator delete(void*, Support::PlacementNew) noexcept {}
-#else
-#define ASMJIT_BASE_CLASS(TYPE)
-#endif
-
-//! \}
-//! \endcond
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! Byte order.
-enum class ByteOrder {
- //! Little endian.
- kLE = 0,
- //! Big endian.
- kBE = 1,
- //! Native byte order of the target architecture.
- kNative = ASMJIT_ARCH_LE ? kLE : kBE,
- //! Swapped byte order of the target architecture.
- kSwapped = ASMJIT_ARCH_LE ? kBE : kLE
-};
-
-//! A policy that can be used with some `reset()` member functions.
-enum class ResetPolicy : uint32_t {
- //! Soft reset, doesn't deallocate memory (default).
- kSoft = 0,
- //! Hard reset, releases all memory used, if any.
- kHard = 1
-};
-
-//! Contains typedefs, constants, and variables used globally by AsmJit.
-namespace Globals {
-
-//! Host memory allocator overhead.
-static constexpr uint32_t kAllocOverhead = uint32_t(sizeof(intptr_t) * 4);
-
-//! Host memory allocator alignment.
-static constexpr uint32_t kAllocAlignment = 8;
-
-//! Aggressive growing strategy threshold.
-static constexpr uint32_t kGrowThreshold = 1024 * 1024 * 16;
-
-//! Maximum depth of RB-Tree is:
-//!
-//! `2 * log2(n + 1)`
-//!
-//! Size of RB node is at least two pointers (without data), so a theoretical architecture limit would be:
-//!
-//! `2 * log2(addressableMemorySize / sizeof(Node) + 1)`
-//!
-//! Which yields 30 on 32-bit arch and 61 on 64-bit arch. The final value was adjusted by +1 for safety reasons.
-static constexpr uint32_t kMaxTreeHeight = (ASMJIT_ARCH_BITS == 32 ? 30 : 61) + 1;
-
-//! Maximum number of operands per a single instruction.
-static constexpr uint32_t kMaxOpCount = 6;
-
-//! Maximum arguments of a function supported by the Compiler / Function API.
-static constexpr uint32_t kMaxFuncArgs = 32;
-
-//! The number of values that can be assigned to a single function argument or return value.
-static constexpr uint32_t kMaxValuePack = 4;
-
-//! Maximum number of physical registers AsmJit can use per register group.
-static constexpr uint32_t kMaxPhysRegs = 32;
-
-//! Maximum alignment.
-static constexpr uint32_t kMaxAlignment = 64;
-
-//! Maximum label or symbol size in bytes.
-static constexpr uint32_t kMaxLabelNameSize = 2048;
-
-//! Maximum section name size.
-static constexpr uint32_t kMaxSectionNameSize = 35;
-
-//! Maximum size of comment.
-static constexpr uint32_t kMaxCommentSize = 1024;
-
-//! Invalid identifier.
-static constexpr uint32_t kInvalidId = 0xFFFFFFFFu;
-
-//! Returned by `indexOf()` and similar when working with containers that use 32-bit index/size.
-static constexpr uint32_t kNotFound = 0xFFFFFFFFu;
-
-//! Invalid base address.
-static constexpr uint64_t kNoBaseAddress = ~uint64_t(0);
-
-//! Number of virtual register groups.
-static constexpr uint32_t kNumVirtGroups = 4;
-
-struct Init_ {};
-struct NoInit_ {};
-
-//! A decorator used to initialize.
-static const constexpr Init_ Init {};
-//! A decorator used to not initialize.
-static const constexpr NoInit_ NoInit {};
-
-} // {Globals}
-
-//! Casts a `void*` pointer `func` to a function pointer `Func`.
-template<typename Func>
-static ASMJIT_INLINE_NODEBUG Func ptr_as_func(void* func) noexcept { return Support::ptr_cast_impl<Func, void*>(func); }
-
-//! Casts a function pointer `func` to a void pointer `void*`.
-template<typename Func>
-static ASMJIT_INLINE_NODEBUG void* func_as_ptr(Func func) noexcept { return Support::ptr_cast_impl<void*, Func>(func); }
-
-//! \}
-
-//! \addtogroup asmjit_error_handling
-//! \{
-
-//! AsmJit error type (uint32_t).
-typedef uint32_t Error;
-
-//! AsmJit error codes.
-enum ErrorCode : uint32_t {
- // @EnumValuesBegin{"enum": "ErrorCode"}@
-
- //! No error (success).
- kErrorOk = 0,
-
- //! Out of memory.
- kErrorOutOfMemory,
-
- //! Invalid argument.
- kErrorInvalidArgument,
-
- //! Invalid state.
- //!
- //! If this error is returned it means that either you are doing something wrong or AsmJit caught itself by
- //! doing something wrong. This error should never be ignored.
- kErrorInvalidState,
-
- //! Invalid or incompatible architecture.
- kErrorInvalidArch,
-
- //! The object is not initialized.
- kErrorNotInitialized,
- //! The object is already initialized.
- kErrorAlreadyInitialized,
-
- //! Either a built-in feature was disabled at compile time and it's not available or the feature is not
- //! available on the target platform.
- //!
- //! For example trying to allocate large pages on unsupported platform would return this error.
- kErrorFeatureNotEnabled,
-
- //! Too many handles (Windows) or file descriptors (Unix/Posix).
- kErrorTooManyHandles,
- //! Code generated is larger than allowed.
- kErrorTooLarge,
-
- //! No code generated.
- //!
- //! Returned by runtime if the \ref CodeHolder contains no code.
- kErrorNoCodeGenerated,
-
- //! Invalid directive.
- kErrorInvalidDirective,
- //! Attempt to use uninitialized label.
- kErrorInvalidLabel,
- //! Label index overflow - a single \ref BaseAssembler instance can hold almost 2^32 (4 billion) labels. If
- //! there is an attempt to create more labels then this error is returned.
- kErrorTooManyLabels,
- //! Label is already bound.
- kErrorLabelAlreadyBound,
- //! Label is already defined (named labels).
- kErrorLabelAlreadyDefined,
- //! Label name is too long.
- kErrorLabelNameTooLong,
- //! Label must always be local if it's anonymous (without a name).
- kErrorInvalidLabelName,
- //! Parent id passed to \ref CodeHolder::newNamedLabelEntry() was either invalid or parent is not supported
- //! by the requested `LabelType`.
- kErrorInvalidParentLabel,
-
- //! Invalid section.
- kErrorInvalidSection,
- //! Too many sections (section index overflow).
- kErrorTooManySections,
- //! Invalid section name (most probably too long).
- kErrorInvalidSectionName,
-
- //! Relocation index overflow (too many relocations).
- kErrorTooManyRelocations,
- //! Invalid relocation entry.
- kErrorInvalidRelocEntry,
- //! Reloc entry contains address that is out of range (unencodable).
- kErrorRelocOffsetOutOfRange,
-
- //! Invalid assignment to a register, function argument, or function return value.
- kErrorInvalidAssignment,
- //! Invalid instruction.
- kErrorInvalidInstruction,
- //! Invalid register type.
- kErrorInvalidRegType,
- //! Invalid register group.
- kErrorInvalidRegGroup,
- //! Invalid physical register id.
- kErrorInvalidPhysId,
- //! Invalid virtual register id.
- kErrorInvalidVirtId,
- //! Invalid element index (ARM).
- kErrorInvalidElementIndex,
- //! Invalid prefix combination (X86|X64).
- kErrorInvalidPrefixCombination,
- //! Invalid LOCK prefix (X86|X64).
- kErrorInvalidLockPrefix,
- //! Invalid XACQUIRE prefix (X86|X64).
- kErrorInvalidXAcquirePrefix,
- //! Invalid XRELEASE prefix (X86|X64).
- kErrorInvalidXReleasePrefix,
- //! Invalid REP prefix (X86|X64).
- kErrorInvalidRepPrefix,
- //! Invalid REX prefix (X86|X64).
- kErrorInvalidRexPrefix,
- //! Invalid {...} register (X86|X64).
- kErrorInvalidExtraReg,
- //! Invalid {k} use (not supported by the instruction) (X86|X64).
- kErrorInvalidKMaskUse,
- //! Invalid {k}{z} use (not supported by the instruction) (X86|X64).
- kErrorInvalidKZeroUse,
- //! Invalid broadcast - Currently only related to invalid use of AVX-512 {1tox} (X86|X64).
- kErrorInvalidBroadcast,
- //! Invalid 'embedded-rounding' {er} or 'suppress-all-exceptions' {sae} (AVX-512) (X86|X64).
- kErrorInvalidEROrSAE,
- //! Invalid address used (not encodable).
- kErrorInvalidAddress,
- //! Invalid index register used in memory address (not encodable).
- kErrorInvalidAddressIndex,
- //! Invalid address scale (not encodable).
- kErrorInvalidAddressScale,
- //! Invalid use of 64-bit address.
- kErrorInvalidAddress64Bit,
- //! Invalid use of 64-bit address that require 32-bit zero-extension (X64).
- kErrorInvalidAddress64BitZeroExtension,
- //! Invalid displacement (not encodable).
- kErrorInvalidDisplacement,
- //! Invalid segment (X86).
- kErrorInvalidSegment,
-
- //! Invalid immediate (out of bounds on X86 and invalid pattern on ARM).
- kErrorInvalidImmediate,
-
- //! Invalid operand size.
- kErrorInvalidOperandSize,
- //! Ambiguous operand size (memory has zero size while it's required to determine the operation type.
- kErrorAmbiguousOperandSize,
- //! Mismatching operand size (size of multiple operands doesn't match the operation size).
- kErrorOperandSizeMismatch,
-
- //! Invalid option.
- kErrorInvalidOption,
- //! Option already defined.
- kErrorOptionAlreadyDefined,
-
- //! Invalid TypeId.
- kErrorInvalidTypeId,
- //! Invalid use of a 8-bit GPB-HIGH register.
- kErrorInvalidUseOfGpbHi,
- //! Invalid use of a 64-bit GPQ register in 32-bit mode.
- kErrorInvalidUseOfGpq,
- //! Invalid use of an 80-bit float (\ref TypeId::kFloat80).
- kErrorInvalidUseOfF80,
- //! Instruction requires the use of consecutive registers, but registers in operands weren't (AVX512, ASIMD load/store, etc...).
- kErrorNotConsecutiveRegs,
- //! Failed to allocate consecutive registers - allocable registers either too restricted or a bug in RW info.
- kErrorConsecutiveRegsAllocation,
-
- //! Illegal virtual register - reported by instruction validation.
- kErrorIllegalVirtReg,
- //! AsmJit cannot create more virtual registers.
- kErrorTooManyVirtRegs,
-
- //! AsmJit requires a physical register, but no one is available.
- kErrorNoMorePhysRegs,
- //! A variable has been assigned more than once to a function argument (BaseCompiler).
- kErrorOverlappedRegs,
- //! Invalid register to hold stack arguments offset.
- kErrorOverlappingStackRegWithRegArg,
-
- //! Unbound label cannot be evaluated by expression.
- kErrorExpressionLabelNotBound,
- //! Arithmetic overflow during expression evaluation.
- kErrorExpressionOverflow,
-
- //! Failed to open anonymous memory handle or file descriptor.
- kErrorFailedToOpenAnonymousMemory,
-
- //! Failed to open a file.
- //!
- //! \note This is a generic error that is used by internal filesystem API.
- kErrorFailedToOpenFile,
-
- //! Protection failure can be returned from a virtual memory allocator or when trying to change memory access
- //! permissions.
- kErrorProtectionFailure,
-
- // @EnumValuesEnd@
-
- //! Count of AsmJit error codes.
- kErrorCount
-};
-
-//! Debugging utilities.
-namespace DebugUtils {
-
-//! \cond INTERNAL
-//! Used to silence warnings about unused arguments or variables.
-template<typename... Args>
-static ASMJIT_INLINE_NODEBUG void unused(Args&&...) noexcept {}
-//! \endcond
-
-//! Returns the error `err` passed.
-//!
-//! Provided for debugging purposes. Putting a breakpoint inside `errored` can help with tracing the origin of any
-//! error reported / returned by AsmJit.
-static constexpr Error errored(Error err) noexcept { return err; }
-
-//! Returns a printable version of `asmjit::Error` code.
-ASMJIT_API const char* errorAsString(Error err) noexcept;
-
-//! Called to output debugging message(s).
-ASMJIT_API void debugOutput(const char* str) noexcept;
-
-//! Called on assertion failure.
-//!
-//! \param file Source file name where it happened.
-//! \param line Line in the source file.
-//! \param msg Message to display.
-//!
-//! If you have problems with assertion failures a breakpoint can be put at \ref assertionFailed() function
-//! (asmjit/core/globals.cpp). A call stack will be available when such assertion failure is triggered. AsmJit
-//! always returns errors on failures, assertions are a last resort and usually mean unrecoverable state due to out
-//! of range array access or totally invalid arguments like nullptr where a valid pointer should be provided, etc...
-ASMJIT_API void ASMJIT_NORETURN assertionFailed(const char* file, int line, const char* msg) noexcept;
-
-} // {DebugUtils}
-
-//! \def ASMJIT_ASSERT(...)
-//!
-//! AsmJit's own assert macro used in AsmJit code-base.
-#if defined(ASMJIT_BUILD_DEBUG)
-#define ASMJIT_ASSERT(...) \
- do { \
- if (ASMJIT_LIKELY(__VA_ARGS__)) \
- break; \
- ::asmjit::DebugUtils::assertionFailed(__FILE__, __LINE__, #__VA_ARGS__); \
- } while (0)
-#else
-#define ASMJIT_ASSERT(...) ((void)0)
-#endif
-
-//! \def ASMJIT_PROPAGATE(...)
-//!
-//! Propagates a possible `Error` produced by `...` to the caller by returning the error immediately. Used by AsmJit
-//! internally, but kept public for users that want to use the same technique to propagate errors to the caller.
-#define ASMJIT_PROPAGATE(...) \
- do { \
- ::asmjit::Error _err = __VA_ARGS__; \
- if (ASMJIT_UNLIKELY(_err)) \
- return _err; \
- } while (0)
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-//! Implementation of a placement new so we don't have to depend on `<new>`.
-ASMJIT_INLINE_NODEBUG void* operator new(size_t, const asmjit::Support::PlacementNew& p) noexcept {
-#if defined(_MSC_VER) && !defined(__clang__)
- __assume(p.ptr != nullptr); // Otherwise MSVC would emit a nullptr check.
-#endif
- return p.ptr;
-}
-
-ASMJIT_INLINE_NODEBUG void operator delete(void*, const asmjit::Support::PlacementNew&) noexcept {}
-
-#endif // ASMJIT_CORE_GLOBALS_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/inst.cpp b/3rdparty/asmjit/src/asmjit/core/inst.cpp
deleted file mode 100644
index ade4ae001f2..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/inst.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/archtraits.h"
-#include "../core/inst.h"
-
-#if !defined(ASMJIT_NO_X86)
- #include "../x86/x86instapi_p.h"
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- #include "../arm/a64instapi_p.h"
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-// InstAPI - InstId <-> String
-// ===========================
-
-#ifndef ASMJIT_NO_TEXT
-Error InstAPI::instIdToString(Arch arch, InstId instId, String& output) noexcept {
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::InstInternal::instIdToString(instId, output);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyAArch64(arch))
- return a64::InstInternal::instIdToString(instId, output);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
-}
-
-InstId InstAPI::stringToInstId(Arch arch, const char* s, size_t len) noexcept {
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::InstInternal::stringToInstId(s, len);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyAArch64(arch))
- return a64::InstInternal::stringToInstId(s, len);
-#endif
-
- return 0;
-}
-#endif // !ASMJIT_NO_TEXT
-
-// InstAPI - Validate
-// ==================
-
-#ifndef ASMJIT_NO_VALIDATION
-Error InstAPI::validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch)) {
- if (arch == Arch::kX86)
- return x86::InstInternal::validateX86(inst, operands, opCount, validationFlags);
- else
- return x86::InstInternal::validateX64(inst, operands, opCount, validationFlags);
- }
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyAArch64(arch))
- return a64::InstInternal::validate(inst, operands, opCount, validationFlags);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
-}
-#endif // !ASMJIT_NO_VALIDATION
-
-// InstAPI - QueryRWInfo
-// =====================
-
-#ifndef ASMJIT_NO_INTROSPECTION
-Error InstAPI::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
- if (ASMJIT_UNLIKELY(opCount > Globals::kMaxOpCount))
- return DebugUtils::errored(kErrorInvalidArgument);
-
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::InstInternal::queryRWInfo(arch, inst, operands, opCount, out);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyAArch64(arch))
- return a64::InstInternal::queryRWInfo(inst, operands, opCount, out);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-// InstAPI - QueryFeatures
-// =======================
-
-#ifndef ASMJIT_NO_INTROSPECTION
-Error InstAPI::queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
-#if !defined(ASMJIT_NO_X86)
- if (Environment::isFamilyX86(arch))
- return x86::InstInternal::queryFeatures(arch, inst, operands, opCount, out);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if (Environment::isFamilyAArch64(arch))
- return a64::InstInternal::queryFeatures(inst, operands, opCount, out);
-#endif
-
- return DebugUtils::errored(kErrorInvalidArch);
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/inst.h b/3rdparty/asmjit/src/asmjit/core/inst.h
deleted file mode 100644
index a653fe8e4cc..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/inst.h
+++ /dev/null
@@ -1,804 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_INST_H_INCLUDED
-#define ASMJIT_CORE_INST_H_INCLUDED
-
-#include "../core/cpuinfo.h"
-#include "../core/operand.h"
-#include "../core/string.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_instruction_db
-//! \{
-
-//! Describes an instruction id and modifiers used together with the id.
-//!
-//! Each architecture has a set of valid instructions indexed from 0. Instruction with 0 id is, however, a special
-//! instruction that describes a "no instruction" or "invalid instruction". Different architectures can assign a.
-//! different instruction to the same id, each architecture typically has its own instructions indexed from 1.
-//!
-//! Instruction identifiers listed by architecture:
-//!
-//! - \ref x86::Inst (X86 and X86_64)
-//! - \ref a64::Inst (AArch64)
-typedef uint32_t InstId;
-
-//! Instruction id parts.
-//!
-//! A mask that specifies a bit-layout of \ref InstId.
-enum class InstIdParts : uint32_t {
- // Common Masks
- // ------------
-
- //! Real id without any modifiers (always 16 least significant bits).
- kRealId = 0x0000FFFFu,
- //! Instruction is abstract (or virtual, IR, etc...).
- kAbstract = 0x80000000u,
-
- // ARM Specific
- // ------------
-
- //! AArch32 first data type, used by ASIMD instructions (`inst.dt.dt2`).
- kA32_DT = 0x000F0000u,
- //! AArch32 second data type, used by ASIMD instructions (`inst.dt.dt2`).
- kA32_DT2 = 0x00F00000u,
- //! AArch32/AArch64 condition code.
- kARM_Cond = 0x78000000u
-};
-
-//! Instruction options.
-//!
-//! Instruction options complement instruction identifier and attributes.
-enum class InstOptions : uint32_t {
- //! No options.
- kNone = 0,
-
- //! Used internally by emitters for handling errors and rare cases.
- kReserved = 0x00000001u,
-
- //! Prevents following a jump during compilation (Compiler).
- kUnfollow = 0x00000002u,
-
- //! Overwrite the destination operand(s) (Compiler).
- //!
- //! Hint that is important for register liveness analysis. It tells the compiler that the destination operand will
- //! be overwritten now or by adjacent instructions. Compiler knows when a register is completely overwritten by a
- //! single instruction, for example you don't have to mark "movaps" or "pxor x, x", however, if a pair of
- //! instructions is used and the first of them doesn't completely overwrite the content of the destination,
- //! Compiler fails to mark that register as dead.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! - All instructions that always overwrite at least the size of the register the virtual-register uses, for
- //! example "mov", "movq", "movaps" don't need the overwrite option to be used - conversion, shuffle, and
- //! other miscellaneous instructions included.
- //!
- //! - All instructions that clear the destination register if all operands are the same, for example "xor x, x",
- //! "pcmpeqb x x", etc...
- //!
- //! - Consecutive instructions that partially overwrite the variable until there is no old content require
- //! `BaseCompiler::overwrite()` to be used. Some examples (not always the best use cases thought):
- //!
- //! - `movlps xmm0, ?` followed by `movhps xmm0, ?` and vice versa
- //! - `movlpd xmm0, ?` followed by `movhpd xmm0, ?` and vice versa
- //! - `mov al, ?` followed by `and ax, 0xFF`
- //! - `mov al, ?` followed by `mov ah, al`
- //! - `pinsrq xmm0, ?, 0` followed by `pinsrq xmm0, ?, 1`
- //!
- //! - If the allocated virtual register is used temporarily for scalar operations. For example if you allocate a
- //! full vector like `x86::Compiler::newXmm()` and then use that vector for scalar operations you should use
- //! `overwrite()` directive:
- //!
- //! - `sqrtss x, y` - only LO element of `x` is changed, if you don't
- //! use HI elements, use `compiler.overwrite().sqrtss(x, y)`.
- kOverwrite = 0x00000004u,
-
- //! Emit short-form of the instruction.
- kShortForm = 0x00000010u,
- //! Emit long-form of the instruction.
- kLongForm = 0x00000020u,
-
- //! Conditional jump is likely to be taken.
- kTaken = 0x00000040u,
- //! Conditional jump is unlikely to be taken.
- kNotTaken = 0x00000080u,
-
- // X86 & X64 Options
- // -----------------
-
- //! Use ModMR instead of ModRM if applicable.
- kX86_ModMR = 0x00000100u,
- //! Use ModRM instead of ModMR if applicable.
- kX86_ModRM = 0x00000200u,
- //! Use 3-byte VEX prefix if possible (AVX) (must be 0x00000400).
- kX86_Vex3 = 0x00000400u,
- //! Use VEX prefix when both VEX|EVEX prefixes are available (HINT: AVX_VNNI).
- kX86_Vex = 0x00000800u,
- //! Use 4-byte EVEX prefix if possible (AVX-512) (must be 0x00001000).
- kX86_Evex = 0x00001000u,
-
- //! LOCK prefix (lock-enabled instructions only).
- kX86_Lock = 0x00002000u,
- //! REP prefix (string instructions only).
- kX86_Rep = 0x00004000u,
- //! REPNE prefix (string instructions only).
- kX86_Repne = 0x00008000u,
-
- //! XACQUIRE prefix (only allowed instructions).
- kX86_XAcquire = 0x00010000u,
- //! XRELEASE prefix (only allowed instructions).
- kX86_XRelease = 0x00020000u,
-
- //! AVX-512: embedded-rounding {er} and implicit {sae}.
- kX86_ER = 0x00040000u,
- //! AVX-512: suppress-all-exceptions {sae}.
- kX86_SAE = 0x00080000u,
- //! AVX-512: round-to-nearest (even) {rn-sae} (bits 00).
- kX86_RN_SAE = 0x00000000u,
- //! AVX-512: round-down (toward -inf) {rd-sae} (bits 01).
- kX86_RD_SAE = 0x00200000u,
- //! AVX-512: round-up (toward +inf) {ru-sae} (bits 10).
- kX86_RU_SAE = 0x00400000u,
- //! AVX-512: round-toward-zero (truncate) {rz-sae} (bits 11).
- kX86_RZ_SAE = 0x00600000u,
- //! AVX-512: Use zeroing {k}{z} instead of merging {k}.
- kX86_ZMask = 0x00800000u,
-
- //! AVX-512: Mask to get embedded rounding bits (2 bits).
- kX86_ERMask = kX86_RZ_SAE,
- //! AVX-512: Mask of all possible AVX-512 options except EVEX prefix flag.
- kX86_AVX512Mask = 0x00FC0000u,
-
- //! Force REX.B and/or VEX.B field (X64 only).
- kX86_OpCodeB = 0x01000000u,
- //! Force REX.X and/or VEX.X field (X64 only).
- kX86_OpCodeX = 0x02000000u,
- //! Force REX.R and/or VEX.R field (X64 only).
- kX86_OpCodeR = 0x04000000u,
- //! Force REX.W and/or VEX.W field (X64 only).
- kX86_OpCodeW = 0x08000000u,
- //! Force REX prefix (X64 only).
- kX86_Rex = 0x40000000u,
- //! Invalid REX prefix (set by X86 or when AH|BH|CH|DH regs are used on X64).
- kX86_InvalidRex = 0x80000000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(InstOptions)
-
-//! Instruction control flow.
-enum class InstControlFlow : uint32_t {
- //! Regular instruction.
- kRegular = 0u,
- //! Unconditional jump.
- kJump = 1u,
- //! Conditional jump (branch).
- kBranch = 2u,
- //! Function call.
- kCall = 3u,
- //! Function return.
- kReturn = 4u,
-
- //! Maximum value of `InstType`.
- kMaxValue = kReturn
-};
-
-//! Hint that is used when both input operands to the instruction are the same.
-//!
-//! Provides hints to the instruction RW query regarding special cases in which two or more operands are the same
-//! registers. This is required by instructions such as XOR, AND, OR, SUB, etc... These hints will influence the
-//! RW operations query.
-enum class InstSameRegHint : uint8_t {
- //! No special handling.
- kNone = 0,
- //! Operands become read-only, the operation doesn't change the content - `X & X` and similar.
- kRO = 1,
- //! Operands become write-only, the content of the input(s) don't matter - `X ^ X`, `X - X`, and similar.
- kWO = 2
-};
-
-//! Instruction id, options, and extraReg in a single structure. This structure exists mainly to simplify analysis
-//! and validation API that requires `BaseInst` and `Operand[]` array.
-class BaseInst {
-public:
- //! \name Members
- //! \{
-
- //! Instruction id with modifiers.
- InstId _id;
- //! Instruction options.
- InstOptions _options;
- //! Extra register used by the instruction (either REP register or AVX-512 selector).
- RegOnly _extraReg;
-
- enum Id : uint32_t {
- //! Invalid or uninitialized instruction id.
- kIdNone = 0x00000000u,
- //! Abstract instruction (BaseBuilder and BaseCompiler).
- kIdAbstract = 0x80000000u
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new BaseInst instance with `id` and `options` set.
- //!
- //! Default values of `id` and `options` are zero, which means 'none' instruction. Such instruction is guaranteed
- //! to never exist for any architecture supported by AsmJit.
- ASMJIT_INLINE_NODEBUG explicit BaseInst(InstId instId = 0, InstOptions options = InstOptions::kNone) noexcept
- : _id(instId),
- _options(options),
- _extraReg() {}
-
- ASMJIT_INLINE_NODEBUG BaseInst(InstId instId, InstOptions options, const RegOnly& extraReg) noexcept
- : _id(instId),
- _options(options),
- _extraReg(extraReg) {}
-
- ASMJIT_INLINE_NODEBUG BaseInst(InstId instId, InstOptions options, const BaseReg& extraReg) noexcept
- : _id(instId),
- _options(options),
- _extraReg { extraReg.signature(), extraReg.id() } {}
-
- //! \}
-
- //! \name Instruction id and modifiers
- //! \{
-
- //! Returns the instruction id with modifiers.
- ASMJIT_INLINE_NODEBUG InstId id() const noexcept { return _id; }
- //! Sets the instruction id and modiiers from `id`.
- ASMJIT_INLINE_NODEBUG void setId(InstId id) noexcept { _id = id; }
- //! Resets the instruction id and modifiers to zero, see \ref kIdNone.
- ASMJIT_INLINE_NODEBUG void resetId() noexcept { _id = 0; }
-
- //! Returns a real instruction id that doesn't contain any modifiers.
- ASMJIT_INLINE_NODEBUG InstId realId() const noexcept { return _id & uint32_t(InstIdParts::kRealId); }
-
- template<InstIdParts kPart>
- ASMJIT_INLINE_NODEBUG uint32_t getInstIdPart() const noexcept {
- return (uint32_t(_id) & uint32_t(kPart)) >> Support::ConstCTZ<uint32_t(kPart)>::value;
- }
-
- template<InstIdParts kPart>
- ASMJIT_INLINE_NODEBUG void setInstIdPart(uint32_t value) noexcept {
- _id = (_id & ~uint32_t(kPart)) | (value << Support::ConstCTZ<uint32_t(kPart)>::value);
- }
-
- //! \}
-
- //! \name Instruction Options
- //! \{
-
- ASMJIT_INLINE_NODEBUG InstOptions options() const noexcept { return _options; }
- ASMJIT_INLINE_NODEBUG bool hasOption(InstOptions option) const noexcept { return Support::test(_options, option); }
- ASMJIT_INLINE_NODEBUG void setOptions(InstOptions options) noexcept { _options = options; }
- ASMJIT_INLINE_NODEBUG void addOptions(InstOptions options) noexcept { _options |= options; }
- ASMJIT_INLINE_NODEBUG void clearOptions(InstOptions options) noexcept { _options &= ~options; }
- ASMJIT_INLINE_NODEBUG void resetOptions() noexcept { _options = InstOptions::kNone; }
-
- //! \}
-
- //! \name Extra Register
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool hasExtraReg() const noexcept { return _extraReg.isReg(); }
- ASMJIT_INLINE_NODEBUG RegOnly& extraReg() noexcept { return _extraReg; }
- ASMJIT_INLINE_NODEBUG const RegOnly& extraReg() const noexcept { return _extraReg; }
- ASMJIT_INLINE_NODEBUG void setExtraReg(const BaseReg& reg) noexcept { _extraReg.init(reg); }
- ASMJIT_INLINE_NODEBUG void setExtraReg(const RegOnly& reg) noexcept { _extraReg.init(reg); }
- ASMJIT_INLINE_NODEBUG void resetExtraReg() noexcept { _extraReg.reset(); }
-
- //! \}
-
- //! \name ARM Specific
- //! \{
-
- ASMJIT_INLINE_NODEBUG arm::CondCode armCondCode() const noexcept { return (arm::CondCode)getInstIdPart<InstIdParts::kARM_Cond>(); }
- ASMJIT_INLINE_NODEBUG void setArmCondCode(arm::CondCode cc) noexcept { setInstIdPart<InstIdParts::kARM_Cond>(uint32_t(cc)); }
-
- ASMJIT_INLINE_NODEBUG a32::DataType armDt() const noexcept { return (a32::DataType)getInstIdPart<InstIdParts::kA32_DT>(); }
- ASMJIT_INLINE_NODEBUG a32::DataType armDt2() const noexcept { return (a32::DataType)getInstIdPart<InstIdParts::kA32_DT2>(); }
-
- //! \}
-
- //! \name Statics
- //! \{
-
- static ASMJIT_INLINE_NODEBUG constexpr InstId composeARMInstId(uint32_t id, arm::CondCode cc) noexcept {
- return id | (uint32_t(cc) << Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr InstId composeARMInstId(uint32_t id, a32::DataType dt, arm::CondCode cc = arm::CondCode::kAL) noexcept {
- return id | (uint32_t(dt) << Support::ConstCTZ<uint32_t(InstIdParts::kA32_DT)>::value)
- | (uint32_t(cc) << Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr InstId composeARMInstId(uint32_t id, a32::DataType dt, a32::DataType dt2, arm::CondCode cc = arm::CondCode::kAL) noexcept {
- return id | (uint32_t(dt) << Support::ConstCTZ<uint32_t(InstIdParts::kA32_DT)>::value)
- | (uint32_t(dt2) << Support::ConstCTZ<uint32_t(InstIdParts::kA32_DT2)>::value)
- | (uint32_t(cc) << Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr InstId extractRealId(uint32_t id) noexcept {
- return id & uint32_t(InstIdParts::kRealId);
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept {
- return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ConstCTZ<uint32_t(InstIdParts::kARM_Cond)>::value);
- }
-
- //! \}
-};
-
-//! CPU read/write flags used by \ref InstRWInfo.
-//!
-//! These flags can be used to get a basic overview about CPU specifics flags used by instructions.
-enum class CpuRWFlags : uint32_t {
- //! No flags.
- kNone = 0x00000000u,
-
- // Common RW Flags (0x000000FF)
- // ----------------------------
-
- //! Signed overflow flag.
- kOF = 0x00000001u,
- //! Carry flag.
- kCF = 0x00000002u,
- //! Zero and/or equality flag (1 if zero/equal).
- kZF = 0x00000004u,
- //! Sign flag (negative/sign, if set).
- kSF = 0x00000008u,
-
- // X86 Specific RW Flags
- // ----------------------------------
-
- //! Carry flag (X86, X86_64).
- kX86_CF = kCF,
- //! Overflow flag (X86, X86_64).
- kX86_OF = kOF,
- //! Sign flag (X86, X86_64).
- kX86_SF = kSF,
- //! Zero flag (X86, X86_64).
- kX86_ZF = kZF,
-
- //! Adjust flag (X86, X86_64).
- kX86_AF = 0x00000100u,
- //! Parity flag (X86, X86_64).
- kX86_PF = 0x00000200u,
- //! Direction flag (X86, X86_64).
- kX86_DF = 0x00000400u,
- //! Interrupt enable flag (X86, X86_64).
- kX86_IF = 0x00000800u,
-
- //! Alignment check flag (X86, X86_64).
- kX86_AC = 0x00001000u,
-
- //! FPU C0 status flag (X86, X86_64).
- kX86_C0 = 0x00010000u,
- //! FPU C1 status flag (X86, X86_64).
- kX86_C1 = 0x00020000u,
- //! FPU C2 status flag (X86, X86_64).
- kX86_C2 = 0x00040000u,
- //! FPU C3 status flag (X86, X86_64).
- kX86_C3 = 0x00080000u,
-
- // ARM Specific RW Flags
- // ----------------------------------
-
- kARM_V = kOF,
- kARM_C = kCF,
- kARM_Z = kZF,
- kARM_N = kSF,
- kARM_Q = 0x00000100u,
- kARM_GE = 0x00000200u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(CpuRWFlags)
-
-//! Operand read/write flags describe how the operand is accessed and some additional features.
-enum class OpRWFlags : uint32_t {
- //! No flags.
- kNone = 0,
-
- //! Operand is read.
- kRead = 0x00000001u,
-
- //! Operand is written.
- kWrite = 0x00000002u,
-
- //! Operand is both read and written.
- kRW = 0x00000003u,
-
- //! Register operand can be replaced by a memory operand.
- kRegMem = 0x00000004u,
-
- //! The register must be allocated to the index of the previous register + 1.
- //!
- //! This flag is used by all architectures to describe instructions that use consecutive registers, where only the
- //! first one is encoded in the instruction, and the others are just a sequence that starts with the first one. On
- //! X86/X86_64 architecture this is used by instructions such as V4FMADDPS, V4FMADDSS, V4FNMADDPS, V4FNMADDSS,
- //! VP4DPWSSD, VP4DPWSSDS, VP2INTERSECTD, and VP2INTERSECTQ. On ARM/AArch64 this is used by vector load and store
- //! instructions that can load or store multiple registers at once.
- kConsecutive = 0x00000008u,
-
- //! The `extendByteMask()` represents a zero extension.
- kZExt = 0x00000010u,
-
- //! The register must have assigned a unique physical ID, which cannot be assigned to any other register.
- kUnique = 0x00000080u,
-
- //! Register operand must use \ref OpRWInfo::physId().
- kRegPhysId = 0x00000100u,
- //! Base register of a memory operand must use \ref OpRWInfo::physId().
- kMemPhysId = 0x00000200u,
-
- //! This memory operand is only used to encode registers and doesn't access memory.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Instructions that use such feature include BNDLDX, BNDSTX, and LEA.
- kMemFake = 0x000000400u,
-
- //! Base register of the memory operand will be read.
- kMemBaseRead = 0x00001000u,
- //! Base register of the memory operand will be written.
- kMemBaseWrite = 0x00002000u,
- //! Base register of the memory operand will be read & written.
- kMemBaseRW = 0x00003000u,
-
- //! Index register of the memory operand will be read.
- kMemIndexRead = 0x00004000u,
- //! Index register of the memory operand will be written.
- kMemIndexWrite = 0x00008000u,
- //! Index register of the memory operand will be read & written.
- kMemIndexRW = 0x0000C000u,
-
- //! Base register of the memory operand will be modified before the operation.
- kMemBasePreModify = 0x00010000u,
- //! Base register of the memory operand will be modified after the operation.
- kMemBasePostModify = 0x00020000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(OpRWFlags)
-
-// Don't remove these asserts. Read/Write flags are used extensively
-// by Compiler and they must always be compatible with constants below.
-static_assert(uint32_t(OpRWFlags::kRead) == 0x1, "OpRWFlags::kRead flag must be 0x1");
-static_assert(uint32_t(OpRWFlags::kWrite) == 0x2, "OpRWFlags::kWrite flag must be 0x2");
-static_assert(uint32_t(OpRWFlags::kRegMem) == 0x4, "OpRWFlags::kRegMem flag must be 0x4");
-
-//! Read/Write information related to a single operand, used by \ref InstRWInfo.
-struct OpRWInfo {
- //! \name Members
- //! \{
-
- //! Read/Write flags.
- OpRWFlags _opFlags;
- //! Physical register index, if required.
- uint8_t _physId;
- //! Size of a possible memory operand that can replace a register operand.
- uint8_t _rmSize;
- //! If non-zero, then this is a consecutive lead register, and the value describes how many registers follow.
- uint8_t _consecutiveLeadCount;
- //! Reserved for future use.
- uint8_t _reserved[1];
- //! Read bit-mask where each bit represents one byte read from Reg/Mem.
- uint64_t _readByteMask;
- //! Write bit-mask where each bit represents one byte written to Reg/Mem.
- uint64_t _writeByteMask;
- //! Zero/Sign extend bit-mask where each bit represents one byte written to Reg/Mem.
- uint64_t _extendByteMask;
-
- //! \}
-
- //! \name Reset
- //! \{
-
- //! Resets this operand information to all zeros.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = OpRWInfo{}; }
-
- //! Resets this operand info (resets all members) and set common information
- //! to the given `opFlags`, `regSize`, and possibly `physId`.
- inline void reset(OpRWFlags opFlags, uint32_t regSize, uint32_t physId = BaseReg::kIdBad) noexcept {
- _opFlags = opFlags;
- _physId = uint8_t(physId);
- _rmSize = Support::test(opFlags, OpRWFlags::kRegMem) ? uint8_t(regSize) : uint8_t(0);
- _consecutiveLeadCount = 0;
- _resetReserved();
-
- uint64_t mask = Support::lsbMask<uint64_t>(Support::min<uint32_t>(regSize, 64));
-
- _readByteMask = Support::test(opFlags, OpRWFlags::kRead) ? mask : uint64_t(0);
- _writeByteMask = Support::test(opFlags, OpRWFlags::kWrite) ? mask : uint64_t(0);
- _extendByteMask = 0;
- }
-
- ASMJIT_INLINE_NODEBUG void _resetReserved() noexcept {
- _reserved[0] = 0;
- }
-
- //! \}
-
- //! \name Operand Flags
- //! \{
-
- //! Returns operand flags.
- ASMJIT_INLINE_NODEBUG OpRWFlags opFlags() const noexcept { return _opFlags; }
- //! Tests whether operand flags contain the given `flag`.
- ASMJIT_INLINE_NODEBUG bool hasOpFlag(OpRWFlags flag) const noexcept { return Support::test(_opFlags, flag); }
-
- //! Adds the given `flags` to operand flags.
- ASMJIT_INLINE_NODEBUG void addOpFlags(OpRWFlags flags) noexcept { _opFlags |= flags; }
- //! Removes the given `flags` from operand flags.
- ASMJIT_INLINE_NODEBUG void clearOpFlags(OpRWFlags flags) noexcept { _opFlags &= ~flags; }
-
- //! Tests whether this operand is read from.
- ASMJIT_INLINE_NODEBUG bool isRead() const noexcept { return hasOpFlag(OpRWFlags::kRead); }
- //! Tests whether this operand is written to.
- ASMJIT_INLINE_NODEBUG bool isWrite() const noexcept { return hasOpFlag(OpRWFlags::kWrite); }
- //! Tests whether this operand is both read and write.
- ASMJIT_INLINE_NODEBUG bool isReadWrite() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRW; }
- //! Tests whether this operand is read only.
- ASMJIT_INLINE_NODEBUG bool isReadOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kRead; }
- //! Tests whether this operand is write only.
- ASMJIT_INLINE_NODEBUG bool isWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kRW) == OpRWFlags::kWrite; }
-
- //! Returns the type of a lead register, which is followed by consecutive registers.
- ASMJIT_INLINE_NODEBUG uint32_t consecutiveLeadCount() const noexcept { return _consecutiveLeadCount; }
-
- //! Tests whether this operand is Reg/Mem
- //!
- //! Reg/Mem operands can use either register or memory.
- ASMJIT_INLINE_NODEBUG bool isRm() const noexcept { return hasOpFlag(OpRWFlags::kRegMem); }
-
- //! Tests whether the operand will be zero extended.
- ASMJIT_INLINE_NODEBUG bool isZExt() const noexcept { return hasOpFlag(OpRWFlags::kZExt); }
-
- //! Tests whether the operand must have allocated a unique physical id that cannot be shared with other register
- //! operands.
- ASMJIT_INLINE_NODEBUG bool isUnique() const noexcept { return hasOpFlag(OpRWFlags::kUnique); }
-
- //! \}
-
- //! \name Memory Flags
- //! \{
-
- //! Tests whether this is a fake memory operand, which is only used, because of encoding. Fake memory operands do
- //! not access any memory, they are only used to encode registers.
- ASMJIT_INLINE_NODEBUG bool isMemFake() const noexcept { return hasOpFlag(OpRWFlags::kMemFake); }
-
- //! Tests whether the instruction's memory BASE register is used.
- ASMJIT_INLINE_NODEBUG bool isMemBaseUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRW); }
- //! Tests whether the instruction reads from its BASE registers.
- ASMJIT_INLINE_NODEBUG bool isMemBaseRead() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseRead); }
- //! Tests whether the instruction writes to its BASE registers.
- ASMJIT_INLINE_NODEBUG bool isMemBaseWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemBaseWrite); }
- //! Tests whether the instruction reads and writes from/to its BASE registers.
- ASMJIT_INLINE_NODEBUG bool isMemBaseReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRW; }
- //! Tests whether the instruction only reads from its BASE registers.
- ASMJIT_INLINE_NODEBUG bool isMemBaseReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseRead; }
- //! Tests whether the instruction only writes to its BASE registers.
- ASMJIT_INLINE_NODEBUG bool isMemBaseWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemBaseRW) == OpRWFlags::kMemBaseWrite; }
-
- //! Tests whether the instruction modifies the BASE register before it uses it to calculate the target address.
- ASMJIT_INLINE_NODEBUG bool isMemBasePreModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePreModify); }
- //! Tests whether the instruction modifies the BASE register after it uses it to calculate the target address.
- ASMJIT_INLINE_NODEBUG bool isMemBasePostModify() const noexcept { return hasOpFlag(OpRWFlags::kMemBasePostModify); }
-
- //! Tests whether the instruction's memory INDEX register is used.
- ASMJIT_INLINE_NODEBUG bool isMemIndexUsed() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRW); }
- //! Tests whether the instruction reads the INDEX registers.
- ASMJIT_INLINE_NODEBUG bool isMemIndexRead() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexRead); }
- //! Tests whether the instruction writes to its INDEX registers.
- ASMJIT_INLINE_NODEBUG bool isMemIndexWrite() const noexcept { return hasOpFlag(OpRWFlags::kMemIndexWrite); }
- //! Tests whether the instruction reads and writes from/to its INDEX registers.
- ASMJIT_INLINE_NODEBUG bool isMemIndexReadWrite() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRW; }
- //! Tests whether the instruction only reads from its INDEX registers.
- ASMJIT_INLINE_NODEBUG bool isMemIndexReadOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexRead; }
- //! Tests whether the instruction only writes to its INDEX registers.
- ASMJIT_INLINE_NODEBUG bool isMemIndexWriteOnly() const noexcept { return (_opFlags & OpRWFlags::kMemIndexRW) == OpRWFlags::kMemIndexWrite; }
-
- //! \}
-
- //! \name Physical Register ID
- //! \{
-
- //! Returns a physical id of the register that is fixed for this operand.
- //!
- //! Returns \ref BaseReg::kIdBad if any register can be used.
- ASMJIT_INLINE_NODEBUG uint32_t physId() const noexcept { return _physId; }
- //! Tests whether \ref physId() would return a valid physical register id.
- ASMJIT_INLINE_NODEBUG bool hasPhysId() const noexcept { return _physId != BaseReg::kIdBad; }
- //! Sets physical register id, which would be fixed for this operand.
- ASMJIT_INLINE_NODEBUG void setPhysId(uint32_t physId) noexcept { _physId = uint8_t(physId); }
-
- //! \}
-
- //! \name Reg/Mem Information
- //! \{
-
- //! Returns Reg/Mem size of the operand.
- ASMJIT_INLINE_NODEBUG uint32_t rmSize() const noexcept { return _rmSize; }
- //! Sets Reg/Mem size of the operand.
- ASMJIT_INLINE_NODEBUG void setRmSize(uint32_t rmSize) noexcept { _rmSize = uint8_t(rmSize); }
-
- //! \}
-
- //! \name Read & Write Masks
- //! \{
-
- //! Returns read mask.
- ASMJIT_INLINE_NODEBUG uint64_t readByteMask() const noexcept { return _readByteMask; }
- //! Returns write mask.
- ASMJIT_INLINE_NODEBUG uint64_t writeByteMask() const noexcept { return _writeByteMask; }
- //! Returns extend mask.
- ASMJIT_INLINE_NODEBUG uint64_t extendByteMask() const noexcept { return _extendByteMask; }
-
- //! Sets read mask.
- ASMJIT_INLINE_NODEBUG void setReadByteMask(uint64_t mask) noexcept { _readByteMask = mask; }
- //! Sets write mask.
- ASMJIT_INLINE_NODEBUG void setWriteByteMask(uint64_t mask) noexcept { _writeByteMask = mask; }
- //! Sets extend mask.
- ASMJIT_INLINE_NODEBUG void setExtendByteMask(uint64_t mask) noexcept { _extendByteMask = mask; }
-
- //! \}
-};
-
-//! Flags used by \ref InstRWInfo.
-enum class InstRWFlags : uint32_t {
- //! No flags.
- kNone = 0x00000000u,
-
- //! Describes a move operation.
- //!
- //! This flag is used by RA to eliminate moves that are guaranteed to be moves only.
- kMovOp = 0x00000001u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(InstRWFlags)
-
-//! Read/Write information of an instruction.
-struct InstRWInfo {
- //! \name Members
- //! \{
-
- //! Instruction flags (there are no flags at the moment, this field is reserved).
- InstRWFlags _instFlags;
- //! CPU flags read.
- CpuRWFlags _readFlags;
- //! CPU flags written.
- CpuRWFlags _writeFlags;
- //! Count of operands.
- uint8_t _opCount;
- //! CPU feature required for replacing register operand with memory operand.
- uint8_t _rmFeature;
- //! Reserved for future use.
- uint8_t _reserved[18];
- //! Read/Write info of extra register (rep{} or kz{}).
- OpRWInfo _extraReg;
- //! Read/Write info of instruction operands.
- OpRWInfo _operands[Globals::kMaxOpCount];
-
- //! \}
-
- //! \name Commons
- //! \{
-
- //! Resets this RW information to all zeros.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = InstRWInfo{}; }
-
- //! \}
-
- //! \name Instruction Flags
- //! \{
-
- //! Returns flags associated with the instruction, see \ref InstRWFlags.
- ASMJIT_INLINE_NODEBUG InstRWFlags instFlags() const noexcept { return _instFlags; }
-
- //! Tests whether the instruction flags contain `flag`.
- ASMJIT_INLINE_NODEBUG bool hasInstFlag(InstRWFlags flag) const noexcept { return Support::test(_instFlags, flag); }
-
- //! Tests whether the instruction flags contain \ref InstRWFlags::kMovOp.
- ASMJIT_INLINE_NODEBUG bool isMovOp() const noexcept { return hasInstFlag(InstRWFlags::kMovOp); }
-
- //! \}
-
- //! \name CPU Flags Information
- //! \{
-
- //! Returns a mask of CPU flags read.
- ASMJIT_INLINE_NODEBUG CpuRWFlags readFlags() const noexcept { return _readFlags; }
- //! Returns a mask of CPU flags written.
- ASMJIT_INLINE_NODEBUG CpuRWFlags writeFlags() const noexcept { return _writeFlags; }
-
- //! \}
-
- //! \name Reg/Mem Information
- //! \{
-
- //! Returns the CPU feature required to replace a register operand with memory operand. If the returned feature is
- //! zero (none) then this instruction either doesn't provide memory operand combination or there is no extra CPU
- //! feature required.
- //!
- //! X86 Specific
- //! ------------
- //!
- //! Some AVX+ instructions may require extra features for replacing registers with memory operands, for example
- //! VPSLLDQ instruction only supports `vpslldq reg, reg, imm` combination on AVX/AVX2 capable CPUs and requires
- //! AVX-512 for `vpslldq reg, mem, imm` combination.
- ASMJIT_INLINE_NODEBUG uint32_t rmFeature() const noexcept { return _rmFeature; }
-
- //! \}
-
- //! \name Operand Read/Write Information
- //! \{
-
- //! Returns RW information of extra register operand (extraReg).
- ASMJIT_INLINE_NODEBUG const OpRWInfo& extraReg() const noexcept { return _extraReg; }
-
- //! Returns RW information of all instruction's operands.
- ASMJIT_INLINE_NODEBUG const OpRWInfo* operands() const noexcept { return _operands; }
-
- //! Returns RW information of the operand at the given `index`.
- inline const OpRWInfo& operand(size_t index) const noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxOpCount);
- return _operands[index];
- }
-
- //! Returns the number of operands this instruction has.
- ASMJIT_INLINE_NODEBUG uint32_t opCount() const noexcept { return _opCount; }
-
- //! \}
-};
-
-//! Validation flags that can be used with \ref InstAPI::validate().
-enum class ValidationFlags : uint32_t {
- //! No flags.
- kNone = 0,
- //! Allow virtual registers in the instruction.
- kEnableVirtRegs = 0x01u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(ValidationFlags)
-
-//! Instruction API.
-namespace InstAPI {
-
-#ifndef ASMJIT_NO_TEXT
-//! Appends the name of the instruction specified by `instId` and `instOptions` into the `output` string.
-//!
-//! \note Instruction options would only affect instruction prefix & suffix, other options would be ignored.
-//! If `instOptions` is zero then only raw instruction name (without any additional text) will be appended.
-ASMJIT_API Error instIdToString(Arch arch, InstId instId, String& output) noexcept;
-
-//! Parses an instruction name in the given string `s`. Length is specified by `len` argument, which can be
-//! `SIZE_MAX` if `s` is known to be null terminated.
-//!
-//! Returns the parsed instruction id or \ref BaseInst::kIdNone if no such instruction exists.
-ASMJIT_API InstId stringToInstId(Arch arch, const char* s, size_t len) noexcept;
-#endif // !ASMJIT_NO_TEXT
-
-#ifndef ASMJIT_NO_VALIDATION
-//! Validates the given instruction considering the given `validationFlags`.
-ASMJIT_API Error validate(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags = ValidationFlags::kNone) noexcept;
-#endif // !ASMJIT_NO_VALIDATION
-
-#ifndef ASMJIT_NO_INTROSPECTION
-//! Gets Read/Write information of the given instruction.
-ASMJIT_API Error queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
-
-//! Gets CPU features required by the given instruction.
-ASMJIT_API Error queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
-#endif // !ASMJIT_NO_INTROSPECTION
-
-} // {InstAPI}
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_INST_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/instdb.cpp b/3rdparty/asmjit/src/asmjit/core/instdb.cpp
deleted file mode 100644
index cde369f6a18..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/instdb.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/instdb_p.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-namespace InstNameUtils {
-
-static constexpr uint32_t kBufferSize = 32;
-
-static ASMJIT_FORCE_INLINE char decode5BitChar(uint32_t c) noexcept {
- uint32_t base = c <= 26 ? uint32_t('a') - 1u : uint32_t('0') - 27u;
- return char(base + c);
-}
-
-static ASMJIT_FORCE_INLINE size_t decodeToBuffer(char nameOut[kBufferSize], uint32_t nameValue, const char* stringTable) noexcept {
- size_t i;
-
- if (nameValue & 0x80000000u) {
- // Small string of 5-bit characters.
- for (i = 0; i < 6; i++, nameValue >>= 5) {
- uint32_t c = nameValue & 0x1F;
- if (c == 0)
- break;
- nameOut[i] = decode5BitChar(c);
- }
- return i;
- }
- else {
- size_t prefixBase = nameValue & 0xFFFu;
- size_t prefixSize = (nameValue >> 12) & 0xFu;
-
- size_t suffixBase = (nameValue >> 16) & 0xFFFu;
- size_t suffixSize = (nameValue >> 28) & 0x7u;
-
- for (i = 0; i < prefixSize; i++)
- nameOut[i] = stringTable[prefixBase + i];
-
- char* suffixOut = nameOut + prefixSize;
- for (i = 0; i < suffixSize; i++)
- suffixOut[i] = stringTable[suffixBase + i];
-
- return prefixSize + suffixSize;
- }
-}
-
-Error decode(String& output, uint32_t nameValue, const char* stringTable) noexcept {
- char nameData[kBufferSize];
- size_t nameSize = decodeToBuffer(nameData, nameValue, stringTable);
-
- return output.append(nameData, nameSize);
-}
-
-InstId find(const char* s, size_t len, const InstNameIndex& nameIndex, const uint32_t* nameTable, const char* stringTable) noexcept {
- if (ASMJIT_UNLIKELY(!s))
- return BaseInst::kIdNone;
-
- if (len == SIZE_MAX)
- len = strlen(s);
-
- if (ASMJIT_UNLIKELY(len == 0 || len > nameIndex.maxNameLength))
- return BaseInst::kIdNone;
-
- uint32_t prefix = uint32_t(s[0]) - 'a';
- if (ASMJIT_UNLIKELY(prefix > 'z' - 'a'))
- return BaseInst::kIdNone;
-
- size_t base = nameIndex.data[prefix].start;
- size_t end = nameIndex.data[prefix].end;
-
- if (ASMJIT_UNLIKELY(!base))
- return BaseInst::kIdNone;
-
- char nameData[kBufferSize];
- for (size_t lim = end - base; lim != 0; lim >>= 1) {
- size_t instId = base + (lim >> 1);
- size_t nameSize = decodeToBuffer(nameData, nameTable[instId], stringTable);
-
- int result = Support::compareStringViews(s, len, nameData, nameSize);
- if (result < 0)
- continue;
-
- if (result > 0) {
- base = instId + 1;
- lim--;
- continue;
- }
-
- return InstId(instId);
- }
-
- return BaseInst::kIdNone;
-}
-
-} // {InstNameUtils}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/instdb_p.h b/3rdparty/asmjit/src/asmjit/core/instdb_p.h
deleted file mode 100644
index b5afb72cb36..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/instdb_p.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_INSTDB_P_H_INCLUDED
-#define ASMJIT_CORE_INSTDB_P_H_INCLUDED
-
-#include "../core/inst.h"
-#include "../core/string.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_instruction_db
-//! \{
-
-struct InstNameIndex {
- struct Span {
- uint16_t start;
- uint16_t end;
- };
-
- Span data[26];
- uint16_t maxNameLength;
-};
-
-namespace InstNameUtils {
-
-Error decode(String& output, uint32_t nameValue, const char* stringTable) noexcept;
-InstId find(const char* s, size_t len, const InstNameIndex& nameIndex, const uint32_t* nameTable, const char* stringTable) noexcept;
-
-} // {InstNameUtils}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_INSTDB_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp b/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp
deleted file mode 100644
index 760826b0372..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/jitallocator.cpp
+++ /dev/null
@@ -1,1563 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_JIT
-
-#include "../core/archtraits.h"
-#include "../core/jitallocator.h"
-#include "../core/osutils_p.h"
-#include "../core/support.h"
-#include "../core/virtmem.h"
-#include "../core/zone.h"
-#include "../core/zonelist.h"
-#include "../core/zonetree.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// JitAllocator - Constants
-// ========================
-
-//! Number of pools to use when `JitAllocatorOptions::kUseMultiplePools` is set.
-//!
-//! Each pool increases granularity twice to make memory management more
-//! efficient. Ideal number of pools appears to be 3 to 4 as it distributes
-//! small and large functions properly.
-static constexpr uint32_t kJitAllocatorMultiPoolCount = 3;
-
-//! Minimum granularity (and the default granularity for pool #0).
-static constexpr uint32_t kJitAllocatorBaseGranularity = 64;
-
-//! Maximum block size (32MB).
-static constexpr uint32_t kJitAllocatorMaxBlockSize = 1024 * 1024 * 64;
-
-// JitAllocator - Fill Pattern
-// ===========================
-
-static inline uint32_t JitAllocator_defaultFillPattern() noexcept {
-#if ASMJIT_ARCH_X86
- // X86 and X86_64 - 4x 'int3' instruction.
- return 0xCCCCCCCCu;
-#else
- // Unknown...
- return 0u;
-#endif
-}
-
-// JitAllocator - BitVectorRangeIterator
-// =====================================
-
-template<typename T, uint32_t B>
-class BitVectorRangeIterator {
-public:
- const T* _ptr;
- size_t _idx;
- size_t _end;
- T _bitWord;
-
- enum : uint32_t { kBitWordSize = Support::bitSizeOf<T>() };
- enum : T { kXorMask = B == 0 ? Support::allOnes<T>() : T(0) };
-
- ASMJIT_FORCE_INLINE BitVectorRangeIterator(const T* data, size_t numBitWords) noexcept {
- init(data, numBitWords);
- }
-
- ASMJIT_FORCE_INLINE BitVectorRangeIterator(const T* data, size_t numBitWords, size_t start, size_t end) noexcept {
- init(data, numBitWords, start, end);
- }
-
- ASMJIT_FORCE_INLINE void init(const T* data, size_t numBitWords) noexcept {
- init(data, numBitWords, 0, numBitWords * kBitWordSize);
- }
-
- ASMJIT_FORCE_INLINE void init(const T* data, size_t numBitWords, size_t start, size_t end) noexcept {
- ASMJIT_ASSERT(numBitWords >= (end + kBitWordSize - 1) / kBitWordSize);
- DebugUtils::unused(numBitWords);
-
- size_t idx = Support::alignDown(start, kBitWordSize);
- const T* ptr = data + (idx / kBitWordSize);
-
- T bitWord = 0;
- if (idx < end)
- bitWord = (*ptr ^ kXorMask) & (Support::allOnes<T>() << (start % kBitWordSize));
-
- _ptr = ptr;
- _idx = idx;
- _end = end;
- _bitWord = bitWord;
- }
-
- ASMJIT_FORCE_INLINE bool nextRange(size_t* rangeStart, size_t* rangeEnd, size_t rangeHint = std::numeric_limits<size_t>::max()) noexcept {
- // Skip all empty BitWords.
- while (_bitWord == 0) {
- _idx += kBitWordSize;
- if (_idx >= _end)
- return false;
- _bitWord = (*++_ptr) ^ kXorMask;
- }
-
- size_t i = Support::ctz(_bitWord);
-
- *rangeStart = _idx + i;
- _bitWord = ~(_bitWord ^ ~(Support::allOnes<T>() << i));
-
- if (_bitWord == 0) {
- *rangeEnd = Support::min(_idx + kBitWordSize, _end);
- while (*rangeEnd - *rangeStart < rangeHint) {
- _idx += kBitWordSize;
- if (_idx >= _end)
- break;
-
- _bitWord = (*++_ptr) ^ kXorMask;
- if (_bitWord != Support::allOnes<T>()) {
- size_t j = Support::ctz(~_bitWord);
- *rangeEnd = Support::min(_idx + j, _end);
- _bitWord = _bitWord ^ ~(Support::allOnes<T>() << j);
- break;
- }
-
- *rangeEnd = Support::min(_idx + kBitWordSize, _end);
- _bitWord = 0;
- continue;
- }
-
- return true;
- }
- else {
- size_t j = Support::ctz(_bitWord);
- *rangeEnd = Support::min(_idx + j, _end);
-
- _bitWord = ~(_bitWord ^ ~(Support::allOnes<T>() << j));
- return true;
- }
- }
-};
-
-// JitAllocator - Pool
-// ===================
-
-class JitAllocatorBlock;
-
-class JitAllocatorPool {
-public:
- ASMJIT_NONCOPYABLE(JitAllocatorPool)
-
- //! Double linked list of blocks.
- ZoneList<JitAllocatorBlock> blocks;
- //! Where to start looking first.
- JitAllocatorBlock* cursor = nullptr;
-
- //! Count of blocks.
- uint32_t blockCount = 0;
- //! Allocation granularity.
- uint16_t granularity = 0;
- //! Log2(granularity).
- uint8_t granularityLog2 = 0;
- //! Count of empty blocks (either 0 or 1 as we won't keep more blocks empty).
- uint8_t emptyBlockCount = 0;
-
- //! Number of bits reserved across all blocks.
- size_t totalAreaSize[2] {};
- //! Number of bits used across all blocks.
- size_t totalAreaUsed[2] {};
- //! Overhead of all blocks (in bytes).
- size_t totalOverheadBytes = 0;
-
- inline JitAllocatorPool(uint32_t granularity) noexcept
- : blocks(),
- granularity(uint16_t(granularity)),
- granularityLog2(uint8_t(Support::ctz(granularity))) {}
-
- inline void reset() noexcept {
- blocks.reset();
- cursor = nullptr;
- blockCount = 0u;
- totalAreaSize[0] = 0u;
- totalAreaSize[1] = 0u;
- totalAreaUsed[0] = 0u;
- totalAreaUsed[1] = 0u;
- totalOverheadBytes = 0u;
- }
-
- inline size_t byteSizeFromAreaSize(uint32_t areaSize) const noexcept { return size_t(areaSize) * granularity; }
- inline uint32_t areaSizeFromByteSize(size_t size) const noexcept { return uint32_t((size + granularity - 1) >> granularityLog2); }
-
- inline size_t bitWordCountFromAreaSize(uint32_t areaSize) const noexcept {
- using namespace Support;
- return alignUp<size_t>(areaSize, kBitWordSizeInBits) / kBitWordSizeInBits;
- }
-};
-
-// JitAllocator - Block
-// ====================
-
-class JitAllocatorBlock : public ZoneTreeNodeT<JitAllocatorBlock>,
- public ZoneListNode<JitAllocatorBlock> {
-public:
- ASMJIT_NONCOPYABLE(JitAllocatorBlock)
-
- enum Flags : uint32_t {
- //! Block has initial padding, see \ref JitAllocatorOptions::kDisableInitialPadding.
- kFlagInitialPadding = 0x00000001u,
- //! Block is empty.
- kFlagEmpty = 0x00000002u,
- //! Block is dirty (largestUnusedArea, searchStart, searchEnd).
- kFlagDirty = 0x00000004u,
- //! Block represents memory that is using large pages.
- kFlagLargePages = 0x00000008u,
- //! Block represents memory that is dual-mapped.
- kFlagDualMapped = 0x00000010u
- };
-
- static_assert(kFlagInitialPadding == 1, "JitAllocatorBlock::kFlagInitialPadding must be equal to 1");
-
- static inline uint32_t initialAreaStartByFlags(uint32_t flags) noexcept { return flags & kFlagInitialPadding; }
-
- //! Link to the pool that owns this block.
- JitAllocatorPool* _pool {};
- //! Virtual memory mapping - either single mapping (both pointers equal) or
- //! dual mapping, where one pointer is Read+Execute and the second Read+Write.
- VirtMem::DualMapping _mapping {};
- //! Virtual memory size (block size) [bytes].
- size_t _blockSize = 0;
-
- //! Block flags.
- uint32_t _flags = 0;
- //! Size of the whole block area (bit-vector size).
- uint32_t _areaSize = 0;
- //! Used area (number of bits in bit-vector used).
- uint32_t _areaUsed = 0;
- //! The largest unused continuous area in the bit-vector (or `areaSize` to initiate rescan).
- uint32_t _largestUnusedArea = 0;
- //! Start of a search range (for unused bits).
- uint32_t _searchStart = 0;
- //! End of a search range (for unused bits).
- uint32_t _searchEnd = 0;
-
- //! Used bit-vector (0 = unused, 1 = used).
- Support::BitWord* _usedBitVector {};
- //! Stop bit-vector (0 = don't care, 1 = stop).
- Support::BitWord* _stopBitVector {};
-
- inline JitAllocatorBlock(
- JitAllocatorPool* pool,
- VirtMem::DualMapping mapping,
- size_t blockSize,
- uint32_t blockFlags,
- Support::BitWord* usedBitVector,
- Support::BitWord* stopBitVector,
- uint32_t areaSize) noexcept
- : ZoneTreeNodeT(),
- _pool(pool),
- _mapping(mapping),
- _blockSize(blockSize),
- _flags(blockFlags),
- _areaSize(areaSize),
- _areaUsed(0), // Will be initialized by clearBlock().
- _largestUnusedArea(0), // Will be initialized by clearBlock().
- _searchStart(0), // Will be initialized by clearBlock().
- _searchEnd(0), // Will be initialized by clearBlock().
- _usedBitVector(usedBitVector),
- _stopBitVector(stopBitVector) {
-
- clearBlock();
- }
-
- inline JitAllocatorPool* pool() const noexcept { return _pool; }
-
- inline uint8_t* rxPtr() const noexcept { return static_cast<uint8_t*>(_mapping.rx); }
- inline uint8_t* rwPtr() const noexcept { return static_cast<uint8_t*>(_mapping.rw); }
-
- inline bool hasFlag(uint32_t f) const noexcept { return (_flags & f) != 0; }
- inline void addFlags(uint32_t f) noexcept { _flags |= f; }
- inline void clearFlags(uint32_t f) noexcept { _flags &= ~f; }
-
- inline bool empty() const noexcept { return hasFlag(kFlagEmpty); }
- inline bool isDirty() const noexcept { return hasFlag(kFlagDirty); }
- inline void makeDirty() noexcept { addFlags(kFlagDirty); }
-
- inline bool hasLargePages() const noexcept { return hasFlag(kFlagLargePages); }
- inline bool hasInitialPadding() const noexcept { return hasFlag(kFlagInitialPadding); }
-
- inline uint32_t initialAreaStart() const noexcept { return initialAreaStartByFlags(_flags); }
-
- inline size_t blockSize() const noexcept { return _blockSize; }
-
- inline uint32_t areaSize() const noexcept { return _areaSize; }
- inline uint32_t areaUsed() const noexcept { return _areaUsed; }
- inline uint32_t areaAvailable() const noexcept { return _areaSize - _areaUsed; }
- inline uint32_t largestUnusedArea() const noexcept { return _largestUnusedArea; }
-
- inline void decreaseUsedArea(uint32_t value) noexcept {
- _areaUsed -= value;
- _pool->totalAreaUsed[size_t(hasLargePages())] -= value;
- }
-
- inline void clearBlock() noexcept {
- bool bit = hasInitialPadding();
- size_t numBitWords = _pool->bitWordCountFromAreaSize(_areaSize);
-
- memset(_usedBitVector, 0, numBitWords * sizeof(Support::BitWord));
- memset(_stopBitVector, 0, numBitWords * sizeof(Support::BitWord));
-
- Support::bitVectorSetBit(_usedBitVector, 0, bit);
- Support::bitVectorSetBit(_stopBitVector, 0, bit);
-
- uint32_t start = initialAreaStartByFlags(_flags);
- _areaUsed = start;
- _largestUnusedArea = _areaSize - start;
- _searchStart = start;
- _searchEnd = _areaSize;
-
- addFlags(JitAllocatorBlock::kFlagEmpty);
- clearFlags(JitAllocatorBlock::kFlagDirty);
- }
-
- inline void markAllocatedArea(uint32_t allocatedAreaStart, uint32_t allocatedAreaEnd) noexcept {
- uint32_t allocatedAreaSize = allocatedAreaEnd - allocatedAreaStart;
-
- // Mark the newly allocated space as occupied and also the sentinel.
- Support::bitVectorFill(_usedBitVector, allocatedAreaStart, allocatedAreaSize);
- Support::bitVectorSetBit(_stopBitVector, allocatedAreaEnd - 1, true);
-
- // Update search region and statistics.
- _pool->totalAreaUsed[size_t(hasLargePages())] += allocatedAreaSize;
- _areaUsed += allocatedAreaSize;
-
- if (areaAvailable() == 0) {
- _searchStart = _areaSize;
- _searchEnd = 0;
- _largestUnusedArea = 0;
-
- clearFlags(kFlagDirty | kFlagEmpty);
- }
- else {
- if (_searchStart == allocatedAreaStart)
- _searchStart = allocatedAreaEnd;
- if (_searchEnd == allocatedAreaEnd)
- _searchEnd = allocatedAreaStart;
-
- addFlags(kFlagDirty);
- clearFlags(kFlagEmpty);
- }
- }
-
- inline void markReleasedArea(uint32_t releasedAreaStart, uint32_t releasedAreaEnd) noexcept {
- uint32_t releasedAreaSize = releasedAreaEnd - releasedAreaStart;
-
- // Update the search region and statistics.
- _pool->totalAreaUsed[size_t(hasLargePages())] -= releasedAreaSize;
- _areaUsed -= releasedAreaSize;
- _searchStart = Support::min(_searchStart, releasedAreaStart);
- _searchEnd = Support::max(_searchEnd, releasedAreaEnd);
-
- // Unmark occupied bits and also the sentinel.
- Support::bitVectorClear(_usedBitVector, releasedAreaStart, releasedAreaSize);
- Support::bitVectorSetBit(_stopBitVector, releasedAreaEnd - 1, false);
-
- if (areaUsed() == initialAreaStart()) {
- _searchStart = initialAreaStart();
- _searchEnd = _areaSize;
- _largestUnusedArea = _areaSize - initialAreaStart();
- addFlags(kFlagEmpty);
- clearFlags(kFlagDirty);
- }
- else {
- addFlags(kFlagDirty);
- }
- }
-
- inline void markShrunkArea(uint32_t shrunkAreaStart, uint32_t shrunkAreaEnd) noexcept {
- uint32_t shrunkAreaSize = shrunkAreaEnd - shrunkAreaStart;
-
- // Shrunk area cannot start at zero as it would mean that we have shrunk the first
- // block to zero bytes, which is not allowed as such block must be released instead.
- ASMJIT_ASSERT(shrunkAreaStart != 0);
- ASMJIT_ASSERT(shrunkAreaSize != 0);
-
- // Update the search region and statistics.
- _pool->totalAreaUsed[size_t(hasLargePages())] -= shrunkAreaSize;
- _areaUsed -= shrunkAreaSize;
- _searchStart = Support::min(_searchStart, shrunkAreaStart);
- _searchEnd = Support::max(_searchEnd, shrunkAreaEnd);
-
- // Unmark the released space and move the sentinel.
- Support::bitVectorClear(_usedBitVector, shrunkAreaStart, shrunkAreaSize);
- Support::bitVectorSetBit(_stopBitVector, shrunkAreaEnd - 1, false);
- Support::bitVectorSetBit(_stopBitVector, shrunkAreaStart - 1, true);
-
- addFlags(kFlagDirty);
- }
-
- // RBTree default CMP uses '<' and '>' operators.
- inline bool operator<(const JitAllocatorBlock& other) const noexcept { return rxPtr() < other.rxPtr(); }
- inline bool operator>(const JitAllocatorBlock& other) const noexcept { return rxPtr() > other.rxPtr(); }
-
- // Special implementation for querying blocks by `key`, which must be in `[BlockPtr, BlockPtr + BlockSize)` range.
- inline bool operator<(const uint8_t* key) const noexcept { return rxPtr() + _blockSize <= key; }
- inline bool operator>(const uint8_t* key) const noexcept { return rxPtr() > key; }
-};
-
-// JitAllocator - PrivateImpl
-// ==========================
-
-class JitAllocatorPrivateImpl : public JitAllocator::Impl {
-public:
- //! Lock for thread safety.
- mutable Lock lock;
- //! System page size (also a minimum block size).
- uint32_t pageSize;
- //! Number of active allocations.
- size_t allocationCount;
-
- //! Blocks from all pools in RBTree.
- ZoneTree<JitAllocatorBlock> tree;
- //! Allocator pools.
- JitAllocatorPool* pools;
- //! Number of allocator pools.
- size_t poolCount;
-
- inline JitAllocatorPrivateImpl(JitAllocatorPool* pools, size_t poolCount) noexcept
- : JitAllocator::Impl {},
- pageSize(0),
- allocationCount(0),
- pools(pools),
- poolCount(poolCount) {}
- inline ~JitAllocatorPrivateImpl() noexcept {}
-};
-
-static const JitAllocator::Impl JitAllocatorImpl_none {};
-static const JitAllocator::CreateParams JitAllocatorParams_none {};
-
-// JitAllocator - Utilities
-// ========================
-
-static inline JitAllocatorPrivateImpl* JitAllocatorImpl_new(const JitAllocator::CreateParams* params) noexcept {
- VirtMem::Info vmInfo = VirtMem::info();
-
- if (!params)
- params = &JitAllocatorParams_none;
-
- JitAllocatorOptions options = params->options;
- uint32_t blockSize = params->blockSize;
- uint32_t granularity = params->granularity;
- uint32_t fillPattern = params->fillPattern;
-
- // Setup pool count to [1..3].
- size_t poolCount = 1;
- if (Support::test(options, JitAllocatorOptions::kUseMultiplePools))
- poolCount = kJitAllocatorMultiPoolCount;
-
- // Setup block size [64kB..256MB].
- if (blockSize < 64 * 1024 || blockSize > 256 * 1024 * 1024 || !Support::isPowerOf2(blockSize))
- blockSize = vmInfo.pageGranularity;
-
- // Setup granularity [64..256].
- if (granularity < 64 || granularity > 256 || !Support::isPowerOf2(granularity))
- granularity = kJitAllocatorBaseGranularity;
-
- // Setup fill-pattern.
- if (uint32_t(options & JitAllocatorOptions::kCustomFillPattern) == 0)
- fillPattern = JitAllocator_defaultFillPattern();
-
- size_t size = sizeof(JitAllocatorPrivateImpl) + sizeof(JitAllocatorPool) * poolCount;
- void* p = ::malloc(size);
- if (ASMJIT_UNLIKELY(!p))
- return nullptr;
-
- VirtMem::HardenedRuntimeInfo hardenedRtInfo = VirtMem::hardenedRuntimeInfo();
- if (Support::test(hardenedRtInfo.flags, VirtMem::HardenedRuntimeFlags::kEnabled)) {
- // If we are running within a hardened environment (mapping RWX is not allowed) then we have to use dual mapping
- // or other runtime capabilities like Apple specific MAP_JIT. There is no point in not enabling these as otherwise
- // the allocation would fail and JitAllocator would not be able to allocate memory.
- if (!Support::test(hardenedRtInfo.flags, VirtMem::HardenedRuntimeFlags::kMapJit))
- options |= JitAllocatorOptions::kUseDualMapping;
- }
-
- JitAllocatorPool* pools = reinterpret_cast<JitAllocatorPool*>((uint8_t*)p + sizeof(JitAllocatorPrivateImpl));
- JitAllocatorPrivateImpl* impl = new(Support::PlacementNew{p}) JitAllocatorPrivateImpl(pools, poolCount);
-
- impl->options = options;
- impl->blockSize = blockSize;
- impl->granularity = granularity;
- impl->fillPattern = fillPattern;
- impl->pageSize = vmInfo.pageSize;
-
- for (size_t poolId = 0; poolId < poolCount; poolId++)
- new(Support::PlacementNew{&pools[poolId]}) JitAllocatorPool(granularity << poolId);
-
- return impl;
-}
-
-static inline void JitAllocatorImpl_destroy(JitAllocatorPrivateImpl* impl) noexcept {
- impl->~JitAllocatorPrivateImpl();
- ::free(impl);
-}
-
-static inline size_t JitAllocatorImpl_sizeToPoolId(const JitAllocatorPrivateImpl* impl, size_t size) noexcept {
- size_t poolId = impl->poolCount - 1;
- size_t granularity = size_t(impl->granularity) << poolId;
-
- while (poolId) {
- if (Support::alignUp(size, granularity) == size)
- break;
- poolId--;
- granularity >>= 1;
- }
-
- return poolId;
-}
-
-static inline size_t JitAllocatorImpl_bitVectorSizeToByteSize(uint32_t areaSize) noexcept {
- using Support::kBitWordSizeInBits;
- return ((areaSize + kBitWordSizeInBits - 1u) / kBitWordSizeInBits) * sizeof(Support::BitWord);
-}
-
-static inline size_t JitAllocatorImpl_calculateIdealBlockSize(JitAllocatorPrivateImpl* impl, JitAllocatorPool* pool, size_t allocationSize) noexcept {
- JitAllocatorBlock* last = pool->blocks.last();
- size_t blockSize = last ? last->blockSize() : size_t(impl->blockSize);
-
- // We have to increase the allocationSize if we know that the block must provide padding.
- if (!Support::test(impl->options, JitAllocatorOptions::kDisableInitialPadding)) {
- size_t granularity = pool->granularity;
- if (SIZE_MAX - allocationSize < granularity)
- return 0; // Overflown
- allocationSize += granularity;
- }
-
- if (blockSize < kJitAllocatorMaxBlockSize)
- blockSize *= 2u;
-
- if (allocationSize > blockSize) {
- blockSize = Support::alignUp(allocationSize, impl->blockSize);
- if (ASMJIT_UNLIKELY(blockSize < allocationSize))
- return 0; // Overflown.
- }
-
- return blockSize;
-}
-
-ASMJIT_NOINLINE
-ASMJIT_FAVOR_SPEED static void JitAllocatorImpl_fillPattern(void* mem, uint32_t pattern, size_t byteSize) noexcept {
- // NOTE: This is always used to fill a pattern in allocated / freed memory. The allocation has always
- // a granularity that is greater than the pattern, however, when shrink() is used, we may end up having
- // an unaligned start, so deal with it here and then copy aligned pattern in the loop.
- if ((uintptr_t(mem) & 0x1u) && byteSize >= 1u) {
- static_cast<uint8_t*>(mem)[0] = uint8_t(pattern & 0xFF);
- mem = static_cast<uint8_t*>(mem) + 1;
- byteSize--;
- }
-
- if ((uintptr_t(mem) & 0x2u) && byteSize >= 2u) {
- static_cast<uint16_t*>(mem)[0] = uint16_t(pattern & 0xFFFF);
- mem = static_cast<uint16_t*>(mem) + 1;
- byteSize -= 2;
- }
-
- // Something would be seriously broken if we end up with aligned `mem`, but unaligned `byteSize`.
- ASMJIT_ASSERT((byteSize & 0x3u) == 0u);
-
- uint32_t* mem32 = static_cast<uint32_t*>(mem);
- size_t n = byteSize / 4u;
-
- for (size_t i = 0; i < n; i++)
- mem32[i] = pattern;
-}
-
-// Allocate a new `JitAllocatorBlock` for the given `blockSize`.
-//
-// NOTE: The block doesn't have `kFlagEmpty` flag set, because the new block
-// is only allocated when it's actually needed, so it would be cleared anyway.
-static Error JitAllocatorImpl_newBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock** dst, JitAllocatorPool* pool, size_t blockSize) noexcept {
- using Support::BitWord;
- using Support::kBitWordSizeInBits;
-
- uint32_t blockFlags = 0;
- if (!Support::test(impl->options, JitAllocatorOptions::kDisableInitialPadding))
- blockFlags |= JitAllocatorBlock::kFlagInitialPadding;
-
- VirtMem::DualMapping virtMem {};
- VirtMem::MemoryFlags memFlags = VirtMem::MemoryFlags::kAccessRWX;
-
- if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping)) {
- ASMJIT_PROPAGATE(VirtMem::allocDualMapping(&virtMem, blockSize, memFlags));
- blockFlags |= JitAllocatorBlock::kFlagDualMapped;
- }
- else {
- bool allocateRegularPages = true;
- if (Support::test(impl->options, JitAllocatorOptions::kUseLargePages)) {
- size_t largePageSize = VirtMem::largePageSize();
- bool tryLargePage = blockSize >= largePageSize || Support::test(impl->options, JitAllocatorOptions::kAlignBlockSizeToLargePage);
-
- // Only proceed if we can actually allocate large pages.
- if (largePageSize && tryLargePage) {
- size_t largeBlockSize = Support::alignUp(blockSize, largePageSize);
- Error err = VirtMem::alloc(&virtMem.rx, largeBlockSize, memFlags | VirtMem::MemoryFlags::kMMapLargePages);
-
- // Fallback to regular pages if large page(s) allocation failed.
- if (err == kErrorOk) {
- allocateRegularPages = false;
- blockSize = largeBlockSize;
- blockFlags |= JitAllocatorBlock::kFlagLargePages;
- }
- }
- }
-
- // Called either if large pages were not requested or large page(s) allocation failed.
- if (allocateRegularPages) {
- ASMJIT_PROPAGATE(VirtMem::alloc(&virtMem.rx, blockSize, memFlags));
- }
-
- virtMem.rw = virtMem.rx;
- }
-
- uint32_t areaSize = uint32_t((blockSize + pool->granularity - 1) >> pool->granularityLog2);
- uint32_t numBitWords = (areaSize + kBitWordSizeInBits - 1u) / kBitWordSizeInBits;
- uint8_t* blockPtr = static_cast<uint8_t*>(::malloc(sizeof(JitAllocatorBlock) + size_t(numBitWords) * 2u * sizeof(BitWord)));
-
- // Out of memory...
- if (ASMJIT_UNLIKELY(blockPtr == nullptr)) {
- if (Support::test(impl->options, JitAllocatorOptions::kUseDualMapping))
- VirtMem::releaseDualMapping(&virtMem, blockSize);
- else
- VirtMem::release(virtMem.rx, blockSize);
- return DebugUtils::errored(kErrorOutOfMemory);
- }
-
- // Fill the allocated virtual memory if secure mode is enabled.
- if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
- VirtMem::ProtectJitReadWriteScope scope(virtMem.rw, blockSize);
- JitAllocatorImpl_fillPattern(virtMem.rw, impl->fillPattern, blockSize);
- }
-
- BitWord* bitWords = reinterpret_cast<BitWord*>(blockPtr + sizeof(JitAllocatorBlock));
- *dst = new(Support::PlacementNew{blockPtr}) JitAllocatorBlock(pool, virtMem, blockSize, blockFlags, bitWords, bitWords + numBitWords, areaSize);
- return kErrorOk;
-}
-
-static void JitAllocatorImpl_deleteBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- DebugUtils::unused(impl);
-
- if (block->hasFlag(JitAllocatorBlock::kFlagDualMapped))
- VirtMem::releaseDualMapping(&block->_mapping, block->blockSize());
- else
- VirtMem::release(block->rxPtr(), block->blockSize());
-
- ::free(block);
-}
-
-static void JitAllocatorImpl_insertBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- JitAllocatorPool* pool = block->pool();
-
- if (!pool->cursor)
- pool->cursor = block;
-
- // Add to RBTree and List.
- impl->tree.insert(block);
- pool->blocks.append(block);
-
- // Update statistics.
- size_t statIndex = size_t(block->hasLargePages());
- pool->blockCount++;
- pool->totalAreaSize[statIndex] += block->areaSize();
- pool->totalAreaUsed[statIndex] += block->areaUsed();
- pool->totalOverheadBytes += sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize()) * 2u;
-}
-
-static void JitAllocatorImpl_removeBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- JitAllocatorPool* pool = block->pool();
-
- // Remove from RBTree and List.
- if (pool->cursor == block)
- pool->cursor = block->hasPrev() ? block->prev() : block->next();
-
- impl->tree.remove(block);
- pool->blocks.unlink(block);
-
- // Update statistics.
- size_t statIndex = size_t(block->hasLargePages());
- pool->blockCount--;
- pool->totalAreaSize[statIndex] -= block->areaSize();
- pool->totalAreaUsed[statIndex] -= block->areaUsed();
- pool->totalOverheadBytes -= sizeof(JitAllocatorBlock) + JitAllocatorImpl_bitVectorSizeToByteSize(block->areaSize()) * 2u;
-}
-
-static void JitAllocatorImpl_wipeOutBlock(JitAllocatorPrivateImpl* impl, JitAllocatorBlock* block) noexcept {
- if (block->hasFlag(JitAllocatorBlock::kFlagEmpty))
- return;
-
- JitAllocatorPool* pool = block->pool();
- if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
- VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadWrite);
-
- uint32_t granularity = pool->granularity;
- uint8_t* rwPtr = block->rwPtr();
- BitVectorRangeIterator<Support::BitWord, 0> it(block->_usedBitVector, pool->bitWordCountFromAreaSize(block->areaSize()));
-
- size_t rangeStart;
- size_t rangeEnd;
-
- while (it.nextRange(&rangeStart, &rangeEnd)) {
- uint8_t* spanPtr = rwPtr + rangeStart * granularity;
- size_t spanSize = (rangeEnd - rangeStart) * granularity;
-
- JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize);
- VirtMem::flushInstructionCache(spanPtr, spanSize);
- }
- VirtMem::protectJitMemory(VirtMem::ProtectJitAccess::kReadExecute);
- }
-
- block->clearBlock();
-}
-
-// JitAllocator - Construction & Destruction
-// =========================================
-
-JitAllocator::JitAllocator(const CreateParams* params) noexcept {
- _impl = JitAllocatorImpl_new(params);
- if (ASMJIT_UNLIKELY(!_impl))
- _impl = const_cast<JitAllocator::Impl*>(&JitAllocatorImpl_none);
-}
-
-JitAllocator::~JitAllocator() noexcept {
- if (_impl == &JitAllocatorImpl_none)
- return;
-
- reset(ResetPolicy::kHard);
- JitAllocatorImpl_destroy(static_cast<JitAllocatorPrivateImpl*>(_impl));
-}
-
-// JitAllocator - Reset
-// ====================
-
-void JitAllocator::reset(ResetPolicy resetPolicy) noexcept {
- if (_impl == &JitAllocatorImpl_none)
- return;
-
- JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
- impl->tree.reset();
- size_t poolCount = impl->poolCount;
-
- for (size_t poolId = 0; poolId < poolCount; poolId++) {
- JitAllocatorPool& pool = impl->pools[poolId];
- JitAllocatorBlock* block = pool.blocks.first();
-
- JitAllocatorBlock* blockToKeep = nullptr;
- if (resetPolicy != ResetPolicy::kHard && uint32_t(impl->options & JitAllocatorOptions::kImmediateRelease) == 0) {
- blockToKeep = block;
- block = block->next();
- }
-
- while (block) {
- JitAllocatorBlock* next = block->next();
- JitAllocatorImpl_deleteBlock(impl, block);
- block = next;
- }
-
- pool.reset();
-
- if (blockToKeep) {
- blockToKeep->_listNodes[0] = nullptr;
- blockToKeep->_listNodes[1] = nullptr;
- JitAllocatorImpl_wipeOutBlock(impl, blockToKeep);
- JitAllocatorImpl_insertBlock(impl, blockToKeep);
- pool.emptyBlockCount = 1;
- }
- }
-}
-
-// JitAllocator - Statistics
-// =========================
-
-JitAllocator::Statistics JitAllocator::statistics() const noexcept {
- Statistics statistics;
- statistics.reset();
-
- if (ASMJIT_LIKELY(_impl != &JitAllocatorImpl_none)) {
- JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
- LockGuard guard(impl->lock);
-
- size_t poolCount = impl->poolCount;
- for (size_t poolId = 0; poolId < poolCount; poolId++) {
- const JitAllocatorPool& pool = impl->pools[poolId];
- statistics._blockCount += size_t(pool.blockCount);
- statistics._reservedSize += size_t(pool.totalAreaSize[0] + pool.totalAreaSize[1]) * pool.granularity;
- statistics._usedSize += size_t(pool.totalAreaUsed[0] + pool.totalAreaUsed[1]) * pool.granularity;
- statistics._overheadSize += size_t(pool.totalOverheadBytes);
- }
-
- statistics._allocationCount = impl->allocationCount;
- }
-
- return statistics;
-}
-
-// JitAllocator - Alloc & Release
-// ==============================
-
-Error JitAllocator::alloc(Span& out, size_t size) noexcept {
- out = Span{};
-
- if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
- return DebugUtils::errored(kErrorNotInitialized);
-
- JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
- constexpr uint32_t kNoIndex = std::numeric_limits<uint32_t>::max();
-
- // Align to the minimum granularity by default.
- size = Support::alignUp<size_t>(size, impl->granularity);
- if (ASMJIT_UNLIKELY(size == 0))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- if (ASMJIT_UNLIKELY(size > std::numeric_limits<uint32_t>::max() / 2))
- return DebugUtils::errored(kErrorTooLarge);
-
- LockGuard guard(impl->lock);
- JitAllocatorPool* pool = &impl->pools[JitAllocatorImpl_sizeToPoolId(impl, size)];
-
- uint32_t areaIndex = kNoIndex;
- uint32_t areaSize = uint32_t(pool->areaSizeFromByteSize(size));
-
- // Try to find the requested memory area in existing blocks.
- JitAllocatorBlock* block = pool->blocks.first();
- if (block) {
- JitAllocatorBlock* initial = block;
- do {
- JitAllocatorBlock* next = block->hasNext() ? block->next() : pool->blocks.first();
- if (block->areaAvailable() >= areaSize) {
- if (block->isDirty() || block->largestUnusedArea() >= areaSize) {
- BitVectorRangeIterator<Support::BitWord, 0> it(block->_usedBitVector, pool->bitWordCountFromAreaSize(block->areaSize()), block->_searchStart, block->_searchEnd);
-
- size_t rangeStart = 0;
- size_t rangeEnd = block->areaSize();
-
- size_t searchStart = SIZE_MAX;
- size_t largestArea = 0;
-
- while (it.nextRange(&rangeStart, &rangeEnd, areaSize)) {
- size_t rangeSize = rangeEnd - rangeStart;
- if (rangeSize >= areaSize) {
- areaIndex = uint32_t(rangeStart);
- break;
- }
-
- searchStart = Support::min(searchStart, rangeStart);
- largestArea = Support::max(largestArea, rangeSize);
- }
-
- if (areaIndex != kNoIndex)
- break;
-
- if (searchStart != SIZE_MAX) {
- // Because we have iterated over the entire block, we can now mark the
- // largest unused area that can be used to cache the next traversal.
- size_t searchEnd = rangeEnd;
-
- block->_searchStart = uint32_t(searchStart);
- block->_searchEnd = uint32_t(searchEnd);
- block->_largestUnusedArea = uint32_t(largestArea);
- block->clearFlags(JitAllocatorBlock::kFlagDirty);
- }
- }
- }
-
- block = next;
- } while (block != initial);
- }
-
- // Allocate a new block if there is no region of a required size.
- if (areaIndex == kNoIndex) {
- size_t blockSize = JitAllocatorImpl_calculateIdealBlockSize(impl, pool, size);
- if (ASMJIT_UNLIKELY(!blockSize))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- ASMJIT_PROPAGATE(JitAllocatorImpl_newBlock(impl, &block, pool, blockSize));
- areaIndex = block->initialAreaStart();
-
- JitAllocatorImpl_insertBlock(impl, block);
- block->_searchStart += areaSize;
- block->_largestUnusedArea -= areaSize;
- }
- else if (block->hasFlag(JitAllocatorBlock::kFlagEmpty)) {
- pool->emptyBlockCount--;
- block->clearFlags(JitAllocatorBlock::kFlagEmpty);
- }
-
- // Update statistics.
- impl->allocationCount++;
- block->markAllocatedArea(areaIndex, areaIndex + areaSize);
-
- // Return a span referencing the allocated memory.
- size_t offset = pool->byteSizeFromAreaSize(areaIndex);
- ASMJIT_ASSERT(offset <= block->blockSize() - size);
-
- out._rx = block->rxPtr() + offset;
- out._rw = block->rwPtr() + offset;
- out._size = size;
- out._block = static_cast<void*>(block);
-
- return kErrorOk;
-}
-
-Error JitAllocator::release(void* rx) noexcept {
- if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (ASMJIT_UNLIKELY(!rx))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
- LockGuard guard(impl->lock);
-
- JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(rx));
- if (ASMJIT_UNLIKELY(!block))
- return DebugUtils::errored(kErrorInvalidState);
-
- // Offset relative to the start of the block.
- JitAllocatorPool* pool = block->pool();
- size_t offset = (size_t)((uint8_t*)rx - block->rxPtr());
-
- // The first bit representing the allocated area and its size.
- uint32_t areaIndex = uint32_t(offset >> pool->granularityLog2);
- uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaIndex, true)) + 1;
- uint32_t areaSize = areaEnd - areaIndex;
-
- impl->allocationCount--;
- block->markReleasedArea(areaIndex, areaEnd);
-
- // Fill the released memory if the secure mode is enabled.
- if (Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
- uint8_t* spanPtr = block->rwPtr() + areaIndex * pool->granularity;
- size_t spanSize = areaSize * pool->granularity;
-
- VirtMem::ProtectJitReadWriteScope scope(spanPtr, spanSize);
- JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize);
- }
-
- // Release the whole block if it became empty.
- if (block->empty()) {
- if (pool->emptyBlockCount || Support::test(impl->options, JitAllocatorOptions::kImmediateRelease)) {
- JitAllocatorImpl_removeBlock(impl, block);
- JitAllocatorImpl_deleteBlock(impl, block);
- }
- else {
- pool->emptyBlockCount++;
- }
- }
-
- return kErrorOk;
-}
-
-static Error JitAllocatorImpl_shrink(JitAllocatorPrivateImpl* impl, JitAllocator::Span& span, size_t newSize, bool alreadyUnderWriteScope) noexcept {
- JitAllocatorBlock* block = static_cast<JitAllocatorBlock*>(span._block);
- if (ASMJIT_UNLIKELY(!block))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- LockGuard guard(impl->lock);
-
- // Offset relative to the start of the block.
- JitAllocatorPool* pool = block->pool();
- size_t offset = (size_t)((uint8_t*)span.rx() - block->rxPtr());
-
- // The first bit representing the allocated area and its size.
- uint32_t areaStart = uint32_t(offset >> pool->granularityLog2);
-
- // Don't trust `span.size()` - if it has been already truncated we would be off...
- bool isUsed = Support::bitVectorGetBit(block->_usedBitVector, areaStart);
- if (ASMJIT_UNLIKELY(!isUsed))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaStart, true)) + 1;
- uint32_t areaPrevSize = areaEnd - areaStart;
- uint32_t spanPrevSize = areaPrevSize * pool->granularity;
- uint32_t areaShrunkSize = pool->areaSizeFromByteSize(newSize);
-
- if (ASMJIT_UNLIKELY(areaShrunkSize > areaPrevSize))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- uint32_t areaDiff = areaPrevSize - areaShrunkSize;
- if (areaDiff) {
- block->markShrunkArea(areaStart + areaShrunkSize, areaEnd);
- span._size = pool->byteSizeFromAreaSize(areaShrunkSize);
- }
-
- // Fill released memory if the secure mode is enabled.
- if (newSize < spanPrevSize && Support::test(impl->options, JitAllocatorOptions::kFillUnusedMemory)) {
- uint8_t* spanPtr = block->rwPtr() + (areaStart + areaShrunkSize) * pool->granularity;
- size_t spanSize = areaDiff * pool->granularity;
-
- if (!alreadyUnderWriteScope) {
- VirtMem::ProtectJitReadWriteScope scope(spanPtr, spanSize, VirtMem::CachePolicy::kNeverFlush);
- JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize);
- }
- else {
- JitAllocatorImpl_fillPattern(spanPtr, impl->fillPattern, spanSize);
- }
- }
-
- return kErrorOk;
-}
-
-Error JitAllocator::shrink(Span& span, size_t newSize) noexcept {
- if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
- return DebugUtils::errored(kErrorNotInitialized);
-
- if (ASMJIT_UNLIKELY(!span.rx()))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- if (ASMJIT_UNLIKELY(newSize == 0)) {
- Error err = release(span.rx());
- span = Span{};
- return err;
- }
-
- return JitAllocatorImpl_shrink(static_cast<JitAllocatorPrivateImpl*>(_impl), span, newSize, false);
-}
-
-Error JitAllocator::query(Span& out, void* rx) const noexcept {
- out = Span{};
-
- if (ASMJIT_UNLIKELY(_impl == &JitAllocatorImpl_none))
- return DebugUtils::errored(kErrorNotInitialized);
-
- JitAllocatorPrivateImpl* impl = static_cast<JitAllocatorPrivateImpl*>(_impl);
- LockGuard guard(impl->lock);
- JitAllocatorBlock* block = impl->tree.get(static_cast<uint8_t*>(rx));
-
- if (ASMJIT_UNLIKELY(!block))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- // Offset relative to the start of the block.
- JitAllocatorPool* pool = block->pool();
- size_t offset = (size_t)((uint8_t*)rx - block->rxPtr());
-
- // The first bit representing the allocated area and its size.
- uint32_t areaStart = uint32_t(offset >> pool->granularityLog2);
-
- bool isUsed = Support::bitVectorGetBit(block->_usedBitVector, areaStart);
- if (ASMJIT_UNLIKELY(!isUsed))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- uint32_t areaEnd = uint32_t(Support::bitVectorIndexOf(block->_stopBitVector, areaStart, true)) + 1;
- size_t byteOffset = pool->byteSizeFromAreaSize(areaStart);
- size_t byteSize = pool->byteSizeFromAreaSize(areaEnd - areaStart);
-
- out._rx = static_cast<uint8_t*>(block->_mapping.rx) + byteOffset;
- out._rw = static_cast<uint8_t*>(block->_mapping.rw) + byteOffset;
- out._size = byteSize;
- out._block = static_cast<void*>(block);
-
- return kErrorOk;
-}
-
-// JitAllocator - Write
-// ====================
-
-static ASMJIT_FORCE_INLINE VirtMem::CachePolicy JitAllocator_defaultPolicyForSpan(const JitAllocator::Span& span) noexcept {
- if (Support::test(span.flags(), JitAllocator::Span::Flags::kInstructionCacheClean))
- return VirtMem::CachePolicy::kNeverFlush;
- else
- return VirtMem::CachePolicy::kFlushAfterWrite;
-}
-
-Error JitAllocator::write(Span& span, size_t offset, const void* src, size_t size, VirtMem::CachePolicy policy) noexcept {
- if (ASMJIT_UNLIKELY(span._block == nullptr || offset > span.size() || span.size() - offset < size))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- if (ASMJIT_UNLIKELY(size == 0))
- return kErrorOk;
-
- if (policy == VirtMem::CachePolicy::kDefault)
- policy = JitAllocator_defaultPolicyForSpan(span);
-
- VirtMem::ProtectJitReadWriteScope writeScope(span.rx(), span.size(), policy);
- memcpy(static_cast<uint8_t*>(span.rw()) + offset, src, size);
- return kErrorOk;
-}
-
-Error JitAllocator::write(Span& span, WriteFunc writeFunc, void* userData, VirtMem::CachePolicy policy) noexcept {
- if (ASMJIT_UNLIKELY(span._block == nullptr) || span.size() == 0)
- return DebugUtils::errored(kErrorInvalidArgument);
-
- size_t size = span.size();
- if (ASMJIT_UNLIKELY(size == 0))
- return kErrorOk;
-
- if (policy == VirtMem::CachePolicy::kDefault)
- policy = JitAllocator_defaultPolicyForSpan(span);
-
- VirtMem::ProtectJitReadWriteScope writeScope(span.rx(), span.size(), policy);
- ASMJIT_PROPAGATE(writeFunc(span, userData));
-
- // Check whether span.truncate() has been called.
- if (span.size() != size) {
- // OK, this is a bit awkward... However, shrink wants the original span and newSize, so we have to swap.
- std::swap(span._size, size);
- return JitAllocatorImpl_shrink(static_cast<JitAllocatorPrivateImpl*>(_impl), span, size, true);
- }
-
- return kErrorOk;
-}
-
-// JitAllocator - Write Scope
-// ==========================
-
-Error JitAllocator::beginWriteScope(WriteScopeData& scope, VirtMem::CachePolicy policy) noexcept {
- scope._allocator = this;
- scope._data[0] = size_t(policy);
- return kErrorOk;
-}
-
-Error JitAllocator::endWriteScope(WriteScopeData& scope) noexcept {
- if (ASMJIT_UNLIKELY(!scope._allocator))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- return kErrorOk;
-}
-
-Error JitAllocator::flushWriteScope(WriteScopeData& scope) noexcept {
- if (ASMJIT_UNLIKELY(!scope._allocator))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- return kErrorOk;
-}
-
-Error JitAllocator::scopedWrite(WriteScopeData& scope, Span& span, size_t offset, const void* src, size_t size) noexcept {
- if (ASMJIT_UNLIKELY(!scope._allocator))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- VirtMem::CachePolicy policy = VirtMem::CachePolicy(scope._data[0]);
- return scope._allocator->write(span, offset, src, size, policy);
-}
-
-Error JitAllocator::scopedWrite(WriteScopeData& scope, Span& span, WriteFunc writeFunc, void* userData) noexcept {
- if (ASMJIT_UNLIKELY(!scope._allocator))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- VirtMem::CachePolicy policy = VirtMem::CachePolicy(scope._data[0]);
- return scope._allocator->write(span, writeFunc, userData, policy);
-}
-
-// JitAllocator - Tests
-// ====================
-
-#if defined(ASMJIT_TEST)
-// A pseudo random number generator based on a paper by Sebastiano Vigna:
-// http://vigna.di.unimi.it/ftp/papers/xorshiftplus.pdf
-class Random {
-public:
- // Constants suggested as `23/18/5`.
- enum Steps : uint32_t {
- kStep1_SHL = 23,
- kStep2_SHR = 18,
- kStep3_SHR = 5
- };
-
- inline explicit Random(uint64_t seed = 0) noexcept { reset(seed); }
- inline Random(const Random& other) noexcept = default;
-
- inline void reset(uint64_t seed = 0) noexcept {
- // The number is arbitrary, it means nothing.
- constexpr uint64_t kZeroSeed = 0x1F0A2BE71D163FA0u;
-
- // Generate the state data by using splitmix64.
- for (uint32_t i = 0; i < 2; i++) {
- seed += 0x9E3779B97F4A7C15u;
- uint64_t x = seed;
- x = (x ^ (x >> 30)) * 0xBF58476D1CE4E5B9u;
- x = (x ^ (x >> 27)) * 0x94D049BB133111EBu;
- x = (x ^ (x >> 31));
- _state[i] = x != 0 ? x : kZeroSeed;
- }
- }
-
- inline uint32_t nextUInt32() noexcept {
- return uint32_t(nextUInt64() >> 32);
- }
-
- inline uint64_t nextUInt64() noexcept {
- uint64_t x = _state[0];
- uint64_t y = _state[1];
-
- x ^= x << kStep1_SHL;
- y ^= y >> kStep3_SHR;
- x ^= x >> kStep2_SHR;
- x ^= y;
-
- _state[0] = y;
- _state[1] = x;
- return x + y;
- }
-
- uint64_t _state[2];
-};
-
-namespace JitAllocatorUtils {
- static void fillPattern64(void* p_, uint64_t pattern, size_t sizeInBytes) noexcept {
- uint64_t* p = static_cast<uint64_t*>(p_);
- size_t n = sizeInBytes / 8u;
-
- for (size_t i = 0; i < n; i++)
- p[i] = pattern;
- }
-
- static bool verifyPattern64(const void* p_, uint64_t pattern, size_t sizeInBytes) noexcept {
- const uint64_t* p = static_cast<const uint64_t*>(p_);
- size_t n = sizeInBytes / 8u;
-
- for (size_t i = 0; i < n; i++) {
- if (p[i] != pattern) {
- INFO("Pattern verification failed at 0x%p [%zu * 8]: value(0x%016llX) != expected(0x%016llX)",
- p,
- i,
- (unsigned long long)p[i],
- (unsigned long long)pattern);
- return false;
- }
- }
-
- return true;
- }
-}
-
-// Helper class to verify that JitAllocator doesn't return addresses that overlap.
-class JitAllocatorWrapper {
-public:
- // Address to a memory region of a given size.
- class Range {
- public:
- inline Range(uint8_t* addr, size_t size) noexcept
- : addr(addr),
- size(size) {}
- uint8_t* addr;
- size_t size;
- };
-
- // Based on JitAllocator::Block, serves our purpose well...
- class Record : public ZoneTreeNodeT<Record>,
- public Range {
- public:
- //! Read/write address, in case this is a dual mapping.
- void* _rw;
- //! Describes a pattern used to fill the allocated memory.
- uint64_t pattern;
-
- inline Record(void* rx, void* rw, size_t size, uint64_t pattern)
- : ZoneTreeNodeT<Record>(),
- Range(static_cast<uint8_t*>(rx), size),
- _rw(rw),
- pattern(pattern) {}
-
- inline void* rx() const noexcept { return addr; }
- inline void* rw() const noexcept { return _rw; }
-
- inline bool operator<(const Record& other) const noexcept { return addr < other.addr; }
- inline bool operator>(const Record& other) const noexcept { return addr > other.addr; }
-
- inline bool operator<(const uint8_t* key) const noexcept { return addr + size <= key; }
- inline bool operator>(const uint8_t* key) const noexcept { return addr > key; }
- };
-
- Zone _zone;
- ZoneAllocator _heap;
- ZoneTree<Record> _records;
- JitAllocator _allocator;
- Random _rng;
-
- explicit JitAllocatorWrapper(const JitAllocator::CreateParams* params) noexcept
- : _zone(1024 * 1024),
- _heap(&_zone),
- _allocator(params),
- _rng(0x123456789u) {}
-
- void _insert(void* pRX, void* pRW, size_t size) noexcept {
- uint8_t* p = static_cast<uint8_t*>(pRX);
- uint8_t* pEnd = p + size - 1;
-
- Record* record;
-
- record = _records.get(p);
- EXPECT_NULL(record)
- .message("Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size);
-
- record = _records.get(pEnd);
- EXPECT_NULL(record)
- .message("Address [%p:%p] collides with a newly allocated [%p:%p]\n", record->addr, record->addr + record->size, p, p + size);
-
- uint64_t pattern = _rng.nextUInt64();
- record = _heap.newT<Record>(pRX, pRW, size, pattern);
- EXPECT_NOT_NULL(record);
-
- {
- VirtMem::ProtectJitReadWriteScope scope(pRW, size);
- JitAllocatorUtils::fillPattern64(pRW, pattern, size);
- }
-
- VirtMem::flushInstructionCache(pRX, size);
- EXPECT_TRUE(JitAllocatorUtils::verifyPattern64(pRX, pattern, size));
-
- _records.insert(record);
- }
-
- void _remove(void* p) noexcept {
- Record* record = _records.get(static_cast<uint8_t*>(p));
- EXPECT_NOT_NULL(record);
-
- EXPECT_TRUE(JitAllocatorUtils::verifyPattern64(record->rx(), record->pattern, record->size));
- EXPECT_TRUE(JitAllocatorUtils::verifyPattern64(record->rw(), record->pattern, record->size));
-
- _records.remove(record);
- _heap.release(record, sizeof(Record));
- }
-
- void* alloc(size_t size) noexcept {
- JitAllocator::Span span;
- Error err = _allocator.alloc(span, size);
- EXPECT_EQ(err, kErrorOk)
- .message("JitAllocator failed to allocate %zu bytes\n", size);
-
- _insert(span.rx(), span.rw(), size);
- return span.rx();
- }
-
- void release(void* p) noexcept {
- _remove(p);
- EXPECT_EQ(_allocator.release(p), kErrorOk)
- .message("JitAllocator failed to release '%p'\n", p);
- }
-
- void shrink(void* p, size_t newSize) noexcept {
- Record* record = _records.get(static_cast<uint8_t*>(p));
- EXPECT_NOT_NULL(record);
-
- if (!newSize)
- return release(p);
-
- JitAllocator::Span span;
- EXPECT_EQ(_allocator.query(span, p), kErrorOk);
- Error err = _allocator.shrink(span, newSize);
- EXPECT_EQ(err, kErrorOk)
- .message("JitAllocator failed to shrink %p to %zu bytes\n", p, newSize);
-
- record->size = newSize;
- }
-};
-
-static void JitAllocatorTest_shuffle(void** ptrArray, size_t count, Random& prng) noexcept {
- for (size_t i = 0; i < count; ++i)
- std::swap(ptrArray[i], ptrArray[size_t(prng.nextUInt32() % count)]);
-}
-
-static void JitAllocatorTest_usage(JitAllocator& allocator) noexcept {
- JitAllocator::Statistics stats = allocator.statistics();
- INFO(" Block Count : %9llu [Blocks]" , (unsigned long long)(stats.blockCount()));
- INFO(" Reserved (VirtMem): %9llu [Bytes]" , (unsigned long long)(stats.reservedSize()));
- INFO(" Used (VirtMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.usedSize()), stats.usedSizeAsPercent());
- INFO(" Overhead (HeapMem): %9llu [Bytes] (%.1f%%)", (unsigned long long)(stats.overheadSize()), stats.overheadSizeAsPercent());
-}
-
-template<typename T, size_t kPatternSize, bool Bit>
-static void BitVectorRangeIterator_testRandom(Random& rnd, size_t count) noexcept {
- for (size_t i = 0; i < count; i++) {
- T in[kPatternSize];
- T out[kPatternSize];
-
- for (size_t j = 0; j < kPatternSize; j++) {
- in[j] = T(uint64_t(rnd.nextUInt32() & 0xFFu) * 0x0101010101010101);
- out[j] = Bit == 0 ? Support::allOnes<T>() : T(0);
- }
-
- {
- BitVectorRangeIterator<T, Bit> it(in, kPatternSize);
- size_t rangeStart, rangeEnd;
- while (it.nextRange(&rangeStart, &rangeEnd)) {
- if (Bit)
- Support::bitVectorFill(out, rangeStart, rangeEnd - rangeStart);
- else
- Support::bitVectorClear(out, rangeStart, rangeEnd - rangeStart);
- }
- }
-
- for (size_t j = 0; j < kPatternSize; j++) {
- EXPECT_EQ(in[j], out[j])
- .message("Invalid pattern detected at [%zu] (%llX != %llX)", j, (unsigned long long)in[j], (unsigned long long)out[j]);
- }
- }
-}
-
-static void test_jit_allocator_alloc_release() noexcept {
- size_t kCount = BrokenAPI::hasArg("--quick") ? 20000 : 100000;
-
- struct TestParams {
- const char* name;
- JitAllocatorOptions options;
- uint32_t blockSize;
- uint32_t granularity;
- };
-
- using Opt = JitAllocatorOptions;
-
- VirtMem::HardenedRuntimeInfo hri = VirtMem::hardenedRuntimeInfo();
-
- TestParams testParams[] = {
- { "Default" , Opt::kNone, 0, 0 },
- { "16MB blocks" , Opt::kNone, 16 * 1024 * 1024, 0 },
- { "256B granularity" , Opt::kNone, 0, 256 },
- { "kUseMultiplePools" , Opt::kUseMultiplePools, 0, 0 },
- { "kFillUnusedMemory" , Opt::kFillUnusedMemory, 0, 0 },
- { "kImmediateRelease" , Opt::kImmediateRelease, 0, 0 },
- { "kDisableInitialPadding" , Opt::kDisableInitialPadding, 0, 0 },
- { "kUseLargePages" , Opt::kUseLargePages, 0, 0 },
- { "kUseLargePages | kFillUnusedMemory" , Opt::kUseLargePages | Opt::kFillUnusedMemory, 0, 0 },
- { "kUseLargePages | kAlignBlockSizeToLargePage", Opt::kUseLargePages | Opt::kAlignBlockSizeToLargePage, 0, 0 },
- { "kUseDualMapping" , Opt::kUseDualMapping , 0, 0 },
- { "kUseDualMapping | kFillUnusedMemory" , Opt::kUseDualMapping | Opt::kFillUnusedMemory, 0, 0 }
- };
-
- INFO("BitVectorRangeIterator<uint32_t>");
- {
- Random rnd;
- BitVectorRangeIterator_testRandom<uint32_t, 64, 0>(rnd, kCount);
- }
-
- INFO("BitVectorRangeIterator<uint64_t>");
- {
- Random rnd;
- BitVectorRangeIterator_testRandom<uint64_t, 64, 0>(rnd, kCount);
- }
-
- for (uint32_t testId = 0; testId < ASMJIT_ARRAY_SIZE(testParams); testId++) {
- // Don't try to allocate dual-mapping if dual mapping is not possible - it would fail the test.
- if (Support::test(testParams[testId].options, JitAllocatorOptions::kUseDualMapping) &&
- !Support::test(hri.flags, VirtMem::HardenedRuntimeFlags::kDualMapping)) {
- continue;
- }
-
- INFO("JitAllocator(%s)", testParams[testId].name);
-
- JitAllocator::CreateParams params {};
- params.options = testParams[testId].options;
- params.blockSize = testParams[testId].blockSize;
- params.granularity = testParams[testId].granularity;
-
- size_t fixedBlockSize = 256;
-
- JitAllocatorWrapper wrapper(&params);
- Random prng(100);
-
- size_t i;
-
- INFO(" Memory alloc/release test - %d allocations", kCount);
-
- void** ptrArray = (void**)::malloc(sizeof(void*) * size_t(kCount));
- EXPECT_NOT_NULL(ptrArray);
-
- // Random blocks tests...
- INFO(" Allocating random blocks...");
- for (i = 0; i < kCount; i++)
- ptrArray[i] = wrapper.alloc((prng.nextUInt32() % 1024) + 8);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Releasing all allocated blocks from the beginning...");
- for (i = 0; i < kCount; i++)
- wrapper.release(ptrArray[i]);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Allocating random blocks again...", kCount);
- for (i = 0; i < kCount; i++)
- ptrArray[i] = wrapper.alloc((prng.nextUInt32() % 1024) + 8);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Shuffling allocated blocks...");
- JitAllocatorTest_shuffle(ptrArray, unsigned(kCount), prng);
-
- INFO(" Releasing 50%% of allocated blocks...");
- for (i = 0; i < kCount / 2; i++)
- wrapper.release(ptrArray[i]);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Allocating 50%% more blocks again...");
- for (i = 0; i < kCount / 2; i++)
- ptrArray[i] = wrapper.alloc((prng.nextUInt32() % 1024) + 8);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Releasing all allocated blocks from the end...");
- for (i = 0; i < kCount; i++)
- wrapper.release(ptrArray[kCount - i - 1]);
- JitAllocatorTest_usage(wrapper._allocator);
-
- // Fixed blocks tests...
- INFO(" Allocating %zuB blocks...", fixedBlockSize);
- for (i = 0; i < kCount / 2; i++)
- ptrArray[i] = wrapper.alloc(fixedBlockSize);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Shrinking each %zuB block to 1 byte", fixedBlockSize);
- for (i = 0; i < kCount / 2; i++)
- wrapper.shrink(ptrArray[i], 1);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Allocating more 64B blocks...", 64);
- for (i = kCount / 2; i < kCount; i++)
- ptrArray[i] = wrapper.alloc(64);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Releasing all blocks from the beginning...");
- for (i = 0; i < kCount; i++)
- wrapper.release(ptrArray[i]);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Allocating %zuB blocks...", fixedBlockSize);
- for (i = 0; i < kCount; i++)
- ptrArray[i] = wrapper.alloc(fixedBlockSize);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Shuffling allocated blocks...");
- JitAllocatorTest_shuffle(ptrArray, unsigned(kCount), prng);
-
- INFO(" Releasing 50%% of allocated blocks...");
- for (i = 0; i < kCount / 2; i++)
- wrapper.release(ptrArray[i]);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Allocating 50%% more %zuB blocks again...", fixedBlockSize);
- for (i = 0; i < kCount / 2; i++)
- ptrArray[i] = wrapper.alloc(fixedBlockSize);
- JitAllocatorTest_usage(wrapper._allocator);
-
- INFO(" Releasing all allocated blocks from the end...");
- for (i = 0; i < kCount; i++)
- wrapper.release(ptrArray[kCount - i - 1]);
- JitAllocatorTest_usage(wrapper._allocator);
-
- ::free(ptrArray);
- }
-}
-
-static void test_jit_allocator_query() noexcept {
- JitAllocator allocator;
- size_t allocatedSize = 100;
-
- JitAllocator::Span allocatedSpan;
- EXPECT_EQ(allocator.alloc(allocatedSpan, allocatedSize), kErrorOk);
- EXPECT_NOT_NULL(allocatedSpan.rx());
- EXPECT_GE(allocatedSpan.size(), allocatedSize);
-
- JitAllocator::Span queriedSpan;
- EXPECT_EQ(allocator.query(queriedSpan, allocatedSpan.rx()), kErrorOk);
- EXPECT_EQ(allocatedSpan.rx(), queriedSpan.rx());
- EXPECT_EQ(allocatedSpan.rw(), queriedSpan.rw());
- EXPECT_EQ(allocatedSpan.size(), queriedSpan.size());
-}
-
-UNIT(jit_allocator) {
- test_jit_allocator_alloc_release();
- test_jit_allocator_query();
-}
-#endif // ASMJIT_TEST
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/src/asmjit/core/jitallocator.h b/3rdparty/asmjit/src/asmjit/core/jitallocator.h
deleted file mode 100644
index b694f8cd535..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/jitallocator.h
+++ /dev/null
@@ -1,570 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_JITALLOCATOR_H_INCLUDED
-#define ASMJIT_CORE_JITALLOCATOR_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_JIT
-
-#include "../core/globals.h"
-#include "../core/support.h"
-#include "../core/virtmem.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_virtual_memory
-//! \{
-
-//! Options used by \ref JitAllocator.
-enum class JitAllocatorOptions : uint32_t {
- //! No options.
- kNone = 0,
-
- //! Enables the use of an anonymous memory-mapped memory that is mapped into two buffers having a different pointer.
- //! The first buffer has read and execute permissions and the second buffer has read+write permissions.
- //!
- //! See \ref VirtMem::allocDualMapping() for more details about this feature.
- //!
- //! \remarks Dual mapping would be automatically turned on by \ref JitAllocator in case of hardened runtime that
- //! enforces `W^X` policy, so specifying this flag is essentially forcing to use dual mapped pages even when RWX
- //! pages can be allocated and dual mapping is not necessary.
- kUseDualMapping = 0x00000001u,
-
- //! Enables the use of multiple pools with increasing granularity instead of a single pool. This flag would enable
- //! 3 internal pools in total having 64, 128, and 256 bytes granularity.
- //!
- //! This feature is only recommended for users that generate a lot of code and would like to minimize the overhead
- //! of `JitAllocator` itself by having blocks of different allocation granularities. Using this feature only for
- //! few allocations won't pay off as the allocator may need to create more blocks initially before it can take the
- //! advantage of variable block granularity.
- kUseMultiplePools = 0x00000002u,
-
- //! Always fill reserved memory by a fill-pattern.
- //!
- //! Causes a new block to be cleared by the fill pattern and freshly released memory to be cleared before making
- //! it ready for another use.
- kFillUnusedMemory = 0x00000004u,
-
- //! When this flag is set the allocator would immediately release unused blocks during `release()` or `reset()`.
- //! When this flag is not set the allocator would keep one empty block in each pool to prevent excessive virtual
- //! memory allocations and deallocations in border cases, which involve constantly allocating and deallocating a
- //! single block caused by repetitive calling `alloc()` and `release()` when the allocator has either no blocks
- //! or have all blocks fully occupied.
- kImmediateRelease = 0x00000008u,
-
- //! This flag enables placing functions (or allocating memory) at the very beginning of each memory mapped region.
- //!
- //! Initially, this was the default behavior. However, LLVM developers working on undefined behavior sanitizer
- //! (UBSAN) decided that they want to store metadata before each function and to access such metadata before an
- //! indirect function call. This means that the instrumented code always reads from `[fnPtr - 8]` to decode whether
- //! the function has his metadata present. However, reading 8 bytes below a function means that if a function is
- //! placed at the very beginning of a memory mapped region, it could try to read bytes that are inaccessible. And
- //! since AsmJit can be compiled as a shared library and used by applications instrumented by UBSAN, it's not
- //! possible to conditionally compile the support only when necessary.
- //!
- //! \remarks This flag controls a workaround to make it possible to use LLVM UBSAN with AsmJit's \ref JitAllocator.
- //! There is no undefined behavior even when `kDisableInitialPadding` is used, however, that doesn't really matter
- //! as LLVM's UBSAN introduces one, and according to LLVM developers it's a "trade-off". This flag is safe to use
- //! when the code is not instrumented with LLVM's UBSAN.
- kDisableInitialPadding = 0x00000010u,
-
- //! Enables the use of large pages, if they are supported and the process can actually allocate them.
- //!
- //! \remarks This flag is a hint - if large pages can be allocated, JitAllocator would try to allocate them.
- //! However, if the allocation fails, it will still try to fallback to use regular pages as \ref JitAllocator
- //! is designed to minimize allocation failures, so a regular page is better than no page at all. Also, if a
- //! block \ref JitAllocator wants to allocate is too small to consume a whole large page, regular page(s) will
- //! be allocated as well.
- kUseLargePages = 0x00000020u,
-
- //! Forces \ref JitAllocator to always align block size to be at least as big as a large page, if large pages are
- //! enabled. This option does nothing if large pages are disabled.
- //!
- //! \remarks If \ref kUseLargePages option is used, the allocator would prefer large pages only when allocating a
- //! block that has a sufficient size. Usually the allocator first allocates smaller block and when more requests
- //! come it will start increasing the block size of next allocations. This option makes it sure that even the first
- //! allocation would be the same as a minimum large page when large pages are enabled and can be allocated.
- kAlignBlockSizeToLargePage = 0x00000040u,
-
- //! Use a custom fill pattern, must be combined with `kFlagFillUnusedMemory`.
- kCustomFillPattern = 0x10000000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(JitAllocatorOptions)
-
-//! A simple implementation of memory manager that uses `asmjit::VirtMem`
-//! functions to manage virtual memory for JIT compiled code.
-//!
-//! Implementation notes:
-//!
-//! - Granularity of allocated blocks is different than granularity for a typical C malloc. In addition, the allocator
-//! can use several memory pools having a different granularity to minimize the maintenance overhead. Multiple pools
-//! feature requires `kFlagUseMultiplePools` flag to be set.
-//!
-//! - The allocator doesn't store any information in executable memory, instead, the implementation uses two
-//! bit-vectors to manage allocated memory of each allocator-block. The first bit-vector called 'used' is used to
-//! track used memory (where each bit represents memory size defined by granularity) and the second bit vector called
-//! 'stop' is used as a sentinel to mark where the allocated area ends.
-//!
-//! - Internally, the allocator also uses RB tree to keep track of all blocks across all pools. Each inserted block is
-//! added to the tree so it can be matched fast during `release()` and `shrink()`.
-class JitAllocator {
-public:
- ASMJIT_NONCOPYABLE(JitAllocator)
-
- //! Visible \ref JitAllocator implementation data.
- struct Impl {
- //! Allocator options.
- JitAllocatorOptions options;
- //! Base block size (0 if the allocator is not initialized).
- uint32_t blockSize;
- //! Base granularity (0 if the allocator is not initialized).
- uint32_t granularity;
- //! A pattern that is used to fill unused memory if secure mode is enabled.
- uint32_t fillPattern;
- };
-
- //! \name Members
- //! \{
-
- //! Allocator implementation (private).
- Impl* _impl;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Parameters that can be passed to `JitAllocator` constructor.
- //!
- //! Use it like this:
- //!
- //! ```
- //! // Zero initialize (zero means the default value) and change what you need.
- //! JitAllocator::CreateParams params {};
- //! params.blockSize = 1024 * 1024;
- //!
- //! // Create the allocator.
- //! JitAllocator allocator(&params);
- //! ```
- struct CreateParams {
- //! Allocator options.
- //!
- //! No options are used by default.
- JitAllocatorOptions options = JitAllocatorOptions::kNone;
-
- //! Base size of a single block in bytes (default 64kB).
- //!
- //! \remarks Block size must be equal to or greater than page size and must be power of 2. If the input is not
- //! valid then the default block size will be used instead.
- uint32_t blockSize = 0;
-
- //! Base granularity (and also natural alignment) of allocations in bytes (default 64).
- //!
- //! Since the `JitAllocator` uses bit-arrays to mark used memory the granularity also specifies how many bytes
- //! correspond to a single bit in such bit-array. Higher granularity means more waste of virtual memory (as it
- //! increases the natural alignment), but smaller bit-arrays as less bits would be required per a single block.
- uint32_t granularity = 0;
-
- //! Patter to use to fill unused memory.
- //!
- //! Only used if \ref JitAllocatorOptions::kCustomFillPattern is set.
- uint32_t fillPattern = 0;
-
- // Reset the content of `CreateParams`.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = CreateParams{}; }
- };
-
- //! Creates a `JitAllocator` instance.
- ASMJIT_API explicit JitAllocator(const CreateParams* params = nullptr) noexcept;
- //! Destroys the `JitAllocator` instance and release all blocks held.
- ASMJIT_API ~JitAllocator() noexcept;
-
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _impl->blockSize == 0; }
-
- //! Free all allocated memory - makes all pointers returned by `alloc()` invalid.
- //!
- //! \remarks This function is not thread-safe as it's designed to be used when nobody else is using allocator.
- //! The reason is that there is no point of calling `reset()` when the allocator is still in use.
- ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns allocator options, see `Flags`.
- ASMJIT_INLINE_NODEBUG JitAllocatorOptions options() const noexcept { return _impl->options; }
- //! Tests whether the allocator has the given `option` set.
- ASMJIT_INLINE_NODEBUG bool hasOption(JitAllocatorOptions option) const noexcept { return uint32_t(_impl->options & option) != 0; }
-
- //! Returns a base block size (a minimum size of block that the allocator would allocate).
- ASMJIT_INLINE_NODEBUG uint32_t blockSize() const noexcept { return _impl->blockSize; }
- //! Returns granularity of the allocator.
- ASMJIT_INLINE_NODEBUG uint32_t granularity() const noexcept { return _impl->granularity; }
- //! Returns pattern that is used to fill unused memory if `kFlagUseFillPattern` is set.
- ASMJIT_INLINE_NODEBUG uint32_t fillPattern() const noexcept { return _impl->fillPattern; }
-
- //! \}
-
- //! \name Alloc & Release
- //! \{
-
- //! A memory reference returned by \ref JitAllocator::alloc().
- //!
- //! Span contains everything needed to actually write new code to the memory chunk it references.
- class Span {
- public:
- //! \name Constants
- //! \{
-
- //! Span flags
- enum class Flags : uint32_t {
- //! No flags.
- kNone = 0u,
-
- //! The process has never executed the region of the span.
- //!
- //! If this flag is set on a \ref Span it would mean that the allocator can avoid flushing
- //! instruction cache after a code has been written to it.
- kInstructionCacheClean = 0x00000001u
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Address of memory that has Read and Execute permissions.
- void* _rx = nullptr;
-
- //! Address of memory that has Read and Write permissions.
- void* _rw = nullptr;
-
- //! Size of the span in bytes (rounded up to the allocation granularity).
- size_t _size = 0;
-
- //! Pointer that references a memory block maintained by \ref JitAllocator.
- //!
- //! This pointer is considered private and should never be used nor inspected outside of AsmJit.
- void* _block = nullptr;
-
- //! Span flags.
- Flags _flags = Flags::kNone;
-
- //! Reserved for future use.
- uint32_t _reserved = 0;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns a pointer having Read & Execute permissions (references executable memory).
- //!
- //! This pointer is never NULL if the allocation succeeded, it points to an executable memory.
- ASMJIT_INLINE_NODEBUG void* rx() const noexcept { return _rx; }
-
- //! Returns a pointer having Read & Write permissions (references writable memory).
- //!
- //! Depending on the type of the allocation strategy this could either be:
- //!
- //! - the same address as returned by `rx()` if the allocator uses RWX mapping (pages have all of Read, Write,
- //! and Execute permissions) or MAP_JIT, which requires either \ref VirtMem::ProtectJitReadWriteScope or to
- //! call \ref VirtMem::protectJitMemory() manually.
- //! - a valid pointer, but not the same as `rx` - this would be valid if dual mapping is used.
- //! - NULL pointer, in case that the allocation strategy doesn't use RWX, MAP_JIT, or dual mapping. In this
- //! case only \ref JitAllocator can copy new code into the executable memory referenced by \ref Span.
- //!
- //! \note If `rw()` returns a non-null pointer it's important to use either VirtMem::protectJitMemory() or
- //! \ref VirtMem::ProtectJitReadWriteScope to guard the write, because in case of `MAP_JIT` it would temporarily
- //! switch the permissions of the pointer to RW (that's per thread permissions).
- //!
- //! If \ref VirtMem::ProtectJitReadWriteScope is not used it's important to clear the instruction cache via
- //! \ref VirtMem::flushInstructionCache() after the write is done.
- ASMJIT_INLINE_NODEBUG void* rw() const noexcept { return _rw; }
-
- //! Returns size of this span, aligned to the allocator granularity.
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
-
- //! Returns span flags.
- ASMJIT_INLINE_NODEBUG Flags flags() const noexcept { return _flags; }
-
- //! Shrinks this span to `newSize`.
- //!
- //! \note This is the only function that is able to change the size of a span, and it's only use case is to
- //! shrink the span size during \ref JitAllocator::write(). When the writer detects that the span size shrunk,
- //! it will automatically shrink the memory used by the span, and propagate the new aligned size to the caller.
- ASMJIT_INLINE_NODEBUG void shrink(size_t newSize) noexcept { _size = Support::min(_size, newSize); }
-
- //! Returns whether \ref rw() returns a non-null pointer.
- ASMJIT_INLINE_NODEBUG bool isDirectlyWritable() const noexcept { return _rw != nullptr; }
-
- //! \}
- };
-
- //! Allocates a new memory span of the requested `size`.
- ASMJIT_API Error alloc(Span& out, size_t size) noexcept;
-
- //! Releases a memory block returned by `alloc()`.
- //!
- //! \remarks This function is thread-safe.
- ASMJIT_API Error release(void* rx) noexcept;
-
- //! Frees extra memory allocated with `rx` by shrinking it to the given `newSize`.
- //!
- //! \remarks This function is thread-safe.
- ASMJIT_API Error shrink(Span& span, size_t newSize) noexcept;
-
- //! Queries information about an allocated memory block that contains the given `rx`, and writes it to `out`.
- //!
- //! If the pointer is matched, the function returns `kErrorOk` and fills `out` with the corresponding span.
- ASMJIT_API Error query(Span& out, void* rx) const noexcept;
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- //! Allocates a new memory block of the requested `size`.
- ASMJIT_DEPRECATED("Use alloc(Span& out, size_t size) instead")
- ASMJIT_FORCE_INLINE Error alloc(void** rxPtrOut, void** rwPtrOut, size_t size) noexcept {
- Span span;
- Error err = alloc(span, size);
- *rwPtrOut = span.rw();
- *rxPtrOut = span.rx();
- return err;
- }
-
- ASMJIT_DEPRECATED("Use shrink(Span& span, size_t newSize) instead")
- ASMJIT_FORCE_INLINE Error shrink(void* rxPtr, size_t newSize) noexcept {
- Span span;
- ASMJIT_PROPAGATE(query(span, rxPtr));
- return (span.size() > newSize) ? shrink(span, newSize) : Error(kErrorOk);
- }
-
- ASMJIT_DEPRECATED("Use query(Span& out, void* rx) instead")
- ASMJIT_FORCE_INLINE Error query(void* rxPtr, void** rxPtrOut, void** rwPtrOut, size_t* sizeOut) const noexcept {
- Span span;
- Error err = query(span, rxPtr);
- *rxPtrOut = span.rx();
- *rwPtrOut = span.rw();
- *sizeOut = span.size();
- return err;
- }
-#endif
-
- //! \}
-
- //! \name Write Operations
- //! \{
-
- typedef Error (ASMJIT_CDECL* WriteFunc)(Span& span, void* userData) ASMJIT_NOEXCEPT_TYPE;
-
- ASMJIT_API Error write(
- Span& span,
- size_t offset,
- const void* src,
- size_t size,
- VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept;
-
- ASMJIT_API Error write(
- Span& span,
- WriteFunc writeFunc,
- void* userData,
- VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept;
-
- template<class Lambda>
- ASMJIT_FORCE_INLINE Error write(
- Span& span,
- Lambda&& lambdaFunc,
- VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept {
-
- WriteFunc wrapperFunc = [](Span& span, void* userData) noexcept -> Error {
- Lambda& lambdaFunc = *static_cast<Lambda*>(userData);
- return lambdaFunc(span);
- };
- return write(span, wrapperFunc, (void*)(&lambdaFunc), policy);
- }
-
- //! \}
-
- //! \name Write Operations with Scope
- //! \{
-
- //! \cond INTERNAL
-
- //! Write scope data.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope instead.
- struct WriteScopeData {
- //! \name Members
- //! \{
-
- //! Link to the allocator.
- JitAllocator* _allocator;
- //! Cache policy passed to \ref JitAllocator::beginWriteScope().
- VirtMem::CachePolicy _policy;
- //! Internal flags used by the implementation.
- uint32_t _flags;
- //! Internal data used by the implementation.
- size_t _data[64];
-
- //! \}
- };
-
- //! Begins a write `scope`.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope constructor instead.
- ASMJIT_API Error beginWriteScope(WriteScopeData& scope, VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept;
-
- //! Ends a write `scope`.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope destructor instead.
- ASMJIT_API Error endWriteScope(WriteScopeData& scope) noexcept;
-
- //! Flushes accumulated changes in a write `scope`.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope destructor or \ref WriteScope::flush() instead.
- ASMJIT_API Error flushWriteScope(WriteScopeData& scope) noexcept;
-
- //! Alternative to `JitAllocator::write(span, offset, src, size)`, but under a write `scope`.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope::write() instead.
- ASMJIT_API Error scopedWrite(WriteScopeData& scope, Span& span, size_t offset, const void* src, size_t size) noexcept;
-
- //! Alternative to `JitAllocator::write(span, writeFunc, userData)`, but under a write `scope`.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope::write() instead.
- ASMJIT_API Error scopedWrite(WriteScopeData& scope, Span& span, WriteFunc writeFunc, void* userData) noexcept;
-
- //! Alternative to `JitAllocator::write(span, [lambda])`, but under a write `scope`.
- //!
- //! This is mostly for internal purposes, please use \ref WriteScope::write() instead.
- template<class Lambda>
- inline Error scopedWrite(WriteScopeData& scope, Span& span, Lambda&& lambdaFunc) noexcept {
- WriteFunc wrapperFunc = [](Span& span, void* userData) noexcept -> Error {
- Lambda& lambdaFunc = *static_cast<Lambda*>(userData);
- return lambdaFunc(span);
- };
- return scopedWrite(scope, span, wrapperFunc, (void*)(&lambdaFunc));
- }
-
- //! \endcond
-
- //! Write scope can be used to create a single scope that is optimized for writing multiple spans.
- class WriteScope : public WriteScopeData {
- public:
- ASMJIT_NONCOPYABLE(WriteScope)
-
- //! \name Construction & Destruction
- //! \{
-
- // Begins a write scope.
- inline explicit WriteScope(JitAllocator* allocator, VirtMem::CachePolicy policy = VirtMem::CachePolicy::kDefault) noexcept {
- allocator->beginWriteScope(*this, policy);
- }
-
- // Ends a write scope.
- inline ~WriteScope() noexcept {
- if (_allocator)
- _allocator->endWriteScope(*this);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG JitAllocator* allocator() const noexcept { return _allocator; }
- ASMJIT_INLINE_NODEBUG VirtMem::CachePolicy policy() const noexcept { return _policy; }
-
- //! \}
-
- //! \name Operations
- //! \{
-
- //! Similar to `JitAllocator::write(span, offset, src, size)`, but under a write scope.
- ASMJIT_INLINE_NODEBUG Error write(Span& span, size_t offset, const void* src, size_t size) noexcept {
- return _allocator->scopedWrite(*this, span, offset, src, size);
- }
-
- //! Similar to `JitAllocator::write(span, writeFunc, userData)`, but under a write scope.
- ASMJIT_INLINE_NODEBUG Error write(Span& span, WriteFunc writeFunc, void* userData) noexcept {
- return _allocator->scopedWrite(*this, span, writeFunc, userData);
- }
-
- //! Similar to `JitAllocator::write(span, <lambda>)`, but under a write scope.
- template<class Lambda>
- ASMJIT_INLINE_NODEBUG Error write(Span& span, Lambda&& lambdaFunc) noexcept {
- return _allocator->scopedWrite(*this, span, lambdaFunc);
- }
-
- //! Flushes accumulated changes in this write scope.
- ASMJIT_INLINE_NODEBUG Error flush() noexcept {
- return _allocator->flushWriteScope(*this);
- }
-
- //! \}
- };
-
- //! \}
-
- //! \name Statistics
- //! \{
-
- //! Statistics about `JitAllocator`.
- struct Statistics {
- //! Number of blocks `JitAllocator` maintains.
- size_t _blockCount;
- //! Number of active allocations.
- size_t _allocationCount;
- //! How many bytes are currently used / allocated.
- size_t _usedSize;
- //! How many bytes are currently reserved by the allocator.
- size_t _reservedSize;
- //! Allocation overhead (in bytes) required to maintain all blocks.
- size_t _overheadSize;
-
- //! Resets the statistics to all zeros.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { *this = Statistics{}; }
-
- //! Returns count of blocks managed by `JitAllocator` at the moment.
- ASMJIT_INLINE_NODEBUG size_t blockCount() const noexcept { return _blockCount; }
- //! Returns the number of active allocations.
- ASMJIT_INLINE_NODEBUG size_t allocationCount() const noexcept { return _allocationCount; }
-
- //! Returns how many bytes are currently used.
- ASMJIT_INLINE_NODEBUG size_t usedSize() const noexcept { return _usedSize; }
- //! Returns the number of bytes unused by the allocator at the moment.
- ASMJIT_INLINE_NODEBUG size_t unusedSize() const noexcept { return _reservedSize - _usedSize; }
- //! Returns the total number of bytes reserved by the allocator (sum of sizes of all blocks).
- ASMJIT_INLINE_NODEBUG size_t reservedSize() const noexcept { return _reservedSize; }
- //! Returns the number of bytes the allocator needs to manage the allocated memory.
- ASMJIT_INLINE_NODEBUG size_t overheadSize() const noexcept { return _overheadSize; }
-
- ASMJIT_INLINE_NODEBUG double usedSizeAsPercent() const noexcept {
- return (double(usedSize()) / (double(reservedSize()) + 1e-16)) * 100.0;
- }
-
- ASMJIT_INLINE_NODEBUG double unusedSizeAsPercent() const noexcept {
- return (double(unusedSize()) / (double(reservedSize()) + 1e-16)) * 100.0;
- }
-
- ASMJIT_INLINE_NODEBUG double overheadSizeAsPercent() const noexcept {
- return (double(overheadSize()) / (double(reservedSize()) + 1e-16)) * 100.0;
- }
- };
-
- //! Returns JIT allocator statistics.
- //!
- //! \remarks This function is thread-safe.
- ASMJIT_API Statistics statistics() const noexcept;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif
-#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp b/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
deleted file mode 100644
index 0cc026987a2..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/jitruntime.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_JIT
-
-#include "../core/cpuinfo.h"
-#include "../core/jitruntime.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-JitRuntime::JitRuntime(const JitAllocator::CreateParams* params) noexcept
- : _allocator(params) {
- _environment = Environment::host();
- _environment.setObjectFormat(ObjectFormat::kJIT);
- _cpuFeatures = CpuInfo::host().features();
-}
-
-JitRuntime::~JitRuntime() noexcept {}
-
-Error JitRuntime::_add(void** dst, CodeHolder* code) noexcept {
- *dst = nullptr;
-
- ASMJIT_PROPAGATE(code->flatten());
- ASMJIT_PROPAGATE(code->resolveUnresolvedLinks());
-
- size_t estimatedCodeSize = code->codeSize();
- if (ASMJIT_UNLIKELY(estimatedCodeSize == 0))
- return DebugUtils::errored(kErrorNoCodeGenerated);
-
- JitAllocator::Span span;
- ASMJIT_PROPAGATE(_allocator.alloc(span, estimatedCodeSize));
-
- // Relocate the code.
- Error err = code->relocateToBase(uintptr_t(span.rx()));
- if (ASMJIT_UNLIKELY(err)) {
- _allocator.release(span.rx());
- return err;
- }
-
- // Recalculate the final code size and shrink the memory we allocated for it
- // in case that some relocations didn't require records in an address table.
- size_t codeSize = code->codeSize();
- ASMJIT_ASSERT(codeSize <= estimatedCodeSize);
-
- _allocator.write(span, [&](JitAllocator::Span& span) noexcept -> Error {
- uint8_t* rw = static_cast<uint8_t*>(span.rw());
-
- for (Section* section : code->_sections) {
- size_t offset = size_t(section->offset());
- size_t bufferSize = size_t(section->bufferSize());
- size_t virtualSize = size_t(section->virtualSize());
-
- ASMJIT_ASSERT(offset + bufferSize <= span.size());
- memcpy(rw + offset, section->data(), bufferSize);
-
- if (virtualSize > bufferSize) {
- ASMJIT_ASSERT(offset + virtualSize <= span.size());
- memset(rw + offset + bufferSize, 0, virtualSize - bufferSize);
- }
- }
-
- span.shrink(codeSize);
- return kErrorOk;
- });
-
- *dst = span.rx();
- return kErrorOk;
-}
-
-Error JitRuntime::_release(void* p) noexcept {
- return _allocator.release(p);
-}
-
-ASMJIT_END_NAMESPACE
-
-#endif
diff --git a/3rdparty/asmjit/src/asmjit/core/operand.cpp b/3rdparty/asmjit/src/asmjit/core/operand.cpp
deleted file mode 100644
index b78dc54678a..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/operand.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/operand.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// Operand - Tests
-// ===============
-
-#if defined(ASMJIT_TEST)
-enum class StrongEnumForImmTests : uint32_t {
- kValue0,
- kValue0xFFFFFFFF = 0xFFFFFFFFu
-};
-
-UNIT(operand) {
- INFO("Checking operand sizes");
- EXPECT_EQ(sizeof(Operand), 16u);
- EXPECT_EQ(sizeof(BaseReg), 16u);
- EXPECT_EQ(sizeof(BaseMem), 16u);
- EXPECT_EQ(sizeof(Imm), 16u);
- EXPECT_EQ(sizeof(Label), 16u);
-
- INFO("Checking basic functionality of Operand");
- Operand a, b;
- Operand dummy;
-
- EXPECT_TRUE(a.isNone());
- EXPECT_FALSE(a.isReg());
- EXPECT_FALSE(a.isMem());
- EXPECT_FALSE(a.isImm());
- EXPECT_FALSE(a.isLabel());
- EXPECT_EQ(a, b);
- EXPECT_EQ(a._data[0], 0u);
- EXPECT_EQ(a._data[1], 0u);
-
- INFO("Checking basic functionality of Label");
- Label label;
- EXPECT_FALSE(label.isValid());
- EXPECT_EQ(label.id(), Globals::kInvalidId);
-
- INFO("Checking basic functionality of BaseReg");
- EXPECT_TRUE(BaseReg().isReg());
- EXPECT_FALSE(BaseReg().isValid());
- EXPECT_EQ(BaseReg()._data[0], 0u);
- EXPECT_EQ(BaseReg()._data[1], 0u);
- EXPECT_FALSE(dummy.as<BaseReg>().isValid());
-
- // Create some register (not specific to any architecture).
- OperandSignature rSig = OperandSignature::fromOpType(OperandType::kReg) |
- OperandSignature::fromRegType(RegType::kVec128) |
- OperandSignature::fromRegGroup(RegGroup::kVec) |
- OperandSignature::fromSize(8);
- BaseReg r1(rSig, 5);
-
- EXPECT_TRUE(r1.isValid());
- EXPECT_TRUE(r1.isReg());
- EXPECT_TRUE(r1.isReg(RegType::kVec128));
- EXPECT_TRUE(r1.isPhysReg());
- EXPECT_FALSE(r1.isVirtReg());
- EXPECT_EQ(r1.signature(), rSig);
- EXPECT_EQ(r1.type(), RegType::kVec128);
- EXPECT_EQ(r1.group(), RegGroup::kVec);
- EXPECT_EQ(r1.size(), 8u);
- EXPECT_EQ(r1.id(), 5u);
- EXPECT_TRUE(r1.isReg(RegType::kVec128, 5)); // RegType and Id.
- EXPECT_EQ(r1._data[0], 0u);
- EXPECT_EQ(r1._data[1], 0u);
-
- // The same type of register having different id.
- BaseReg r2(r1, 6);
- EXPECT_TRUE(r2.isValid());
- EXPECT_TRUE(r2.isReg());
- EXPECT_TRUE(r2.isReg(RegType::kVec128));
- EXPECT_TRUE(r2.isPhysReg());
- EXPECT_FALSE(r2.isVirtReg());
- EXPECT_EQ(r2.signature(), rSig);
- EXPECT_EQ(r2.type(), r1.type());
- EXPECT_EQ(r2.group(), r1.group());
- EXPECT_EQ(r2.size(), r1.size());
- EXPECT_EQ(r2.id(), 6u);
- EXPECT_TRUE(r2.isReg(RegType::kVec128, 6));
-
- r1.reset();
- EXPECT_FALSE(r1.isReg());
- EXPECT_FALSE(r1.isValid());
-
- INFO("Checking basic functionality of BaseMem");
- BaseMem m;
- EXPECT_TRUE(m.isMem());
- EXPECT_EQ(m, BaseMem());
- EXPECT_FALSE(m.hasBase());
- EXPECT_FALSE(m.hasIndex());
- EXPECT_FALSE(m.hasOffset());
- EXPECT_TRUE(m.isOffset64Bit());
- EXPECT_EQ(m.offset(), 0);
-
- m.setOffset(-1);
- EXPECT_EQ(m.offsetLo32(), -1);
- EXPECT_EQ(m.offset(), -1);
-
- int64_t x = int64_t(0xFF00FF0000000001u);
- int32_t xHi = int32_t(0xFF00FF00u);
-
- m.setOffset(x);
- EXPECT_EQ(m.offset(), x);
- EXPECT_EQ(m.offsetLo32(), 1);
- EXPECT_EQ(m.offsetHi32(), xHi);
-
- INFO("Checking basic functionality of Imm");
- Imm immValue(-42);
- EXPECT_EQ(immValue.type(), ImmType::kInt);
- EXPECT_EQ(Imm(-1).value(), -1);
- EXPECT_EQ(imm(-1).value(), -1);
- EXPECT_EQ(immValue.value(), -42);
- EXPECT_EQ(imm(0xFFFFFFFF).value(), int64_t(0xFFFFFFFF));
-
- Imm immDouble(0.4);
- EXPECT_EQ(immDouble.type(), ImmType::kDouble);
- EXPECT_EQ(immDouble.valueAs<double>(), 0.4);
- EXPECT_EQ(immDouble, imm(0.4));
-
- EXPECT_EQ(Imm(StrongEnumForImmTests::kValue0).value(), 0);
- EXPECT_EQ(Imm(StrongEnumForImmTests::kValue0xFFFFFFFF).value(), 0xFFFFFFFFu);
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/operand.h b/3rdparty/asmjit/src/asmjit/core/operand.h
deleted file mode 100644
index 8a1eee79b2f..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/operand.h
+++ /dev/null
@@ -1,1889 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_OPERAND_H_INCLUDED
-#define ASMJIT_CORE_OPERAND_H_INCLUDED
-
-#include "../core/archcommons.h"
-#include "../core/support.h"
-#include "../core/type.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_assembler
-//! \{
-
-//! Operand type used by \ref Operand_.
-enum class OperandType : uint32_t {
- //! Not an operand or not initialized.
- kNone = 0,
- //! Operand is a register.
- kReg = 1,
- //! Operand is a memory.
- kMem = 2,
- //! Operand is a register-list.
- kRegList = 3,
- //! Operand is an immediate value.
- kImm = 4,
- //! Operand is a label.
- kLabel = 5,
-
- //! Maximum value of `OperandType`.
- kMaxValue = kRegList
-};
-
-static_assert(uint32_t(OperandType::kMem) == uint32_t(OperandType::kReg) + 1,
- "AsmJit requires that `OperandType::kMem` equals to `OperandType::kReg + 1`");
-
-//! Register mask is a convenience typedef that describes a mask where each bit describes a physical register id
-//! in the same \ref RegGroup. At the moment 32 bits are enough as AsmJit doesn't support any architecture that
-//! would provide more than 32 registers for a register group.
-typedef uint32_t RegMask;
-
-//! Register type.
-//!
-//! Provides a unique type that can be used to identify a register or its view.
-enum class RegType : uint8_t {
- //! No register - unused, invalid, multiple meanings.
- kNone = 0,
-
- //! This is not a register type. This value is reserved for a \ref Label that's used in \ref BaseMem as a base.
- //!
- //! Label tag is used as a sub-type, forming a unique signature across all operand types as 0x1 is never associated
- //! with any register type. This means that a memory operand's BASE register can be constructed from virtually any
- //! operand (register vs. label) by just assigning its type (register type or label-tag) and operand id.
- kLabelTag = 1,
-
- //! Universal type describing program counter (PC) or instruction pointer (IP) register, if the target architecture
- //! actually exposes it as a separate register type, which most modern architectures do.
- kPC = 2,
-
- //! 8-bit low general purpose register (X86).
- kGp8Lo = 3,
- //! 8-bit high general purpose register (X86).
- kGp8Hi = 4,
- //! 16-bit general purpose register (X86).
- kGp16 = 5,
- //! 32-bit general purpose register (X86|AArch32|AArch64).
- kGp32 = 6,
- //! 64-bit general purpose register (X86|AArch64).
- kGp64 = 7,
- //! 8-bit view of a vector register (AArch64).
- kVec8 = 8,
- //! 16-bit view of a vector register (AArch64).
- kVec16 = 9,
- //! 32-bit view of a vector register (AArch32|AArch64).
- kVec32 = 10,
- //! 64-bit view of a vector register (AArch32|AArch64).
- //!
- //! \note This is never used for MMX registers on X86, MMX registers have its own category.
- kVec64 = 11,
- //! 128-bit view of a vector register (X86|AArch32|AArch64).
- kVec128 = 12,
- //! 256-bit view of a vector register (X86).
- kVec256 = 13,
- //! 512-bit view of a vector register (X86).
- kVec512 = 14,
- //! 1024-bit view of a vector register (future).
- kVec1024 = 15,
- //! View of a vector register, which width is implementation specific (AArch64).
- kVecNLen = 16,
-
- //! Mask register (X86).
- kMask = 17,
-
- //! Start of architecture dependent register types.
- kExtra = 18,
-
- // X86 Specific Register Types
- // ---------------------------
-
- //! Instruction pointer (RIP), only addressable in \ref x86::Mem in 64-bit targets.
- kX86_Rip = kPC,
- //! Low GPB register (AL, BL, CL, DL, ...).
- kX86_GpbLo = kGp8Lo,
- //! High GPB register (AH, BH, CH, DH only).
- kX86_GpbHi = kGp8Hi,
- //! GPW register.
- kX86_Gpw = kGp16,
- //! GPD register.
- kX86_Gpd = kGp32,
- //! GPQ register (64-bit).
- kX86_Gpq = kGp64,
- //! XMM register (SSE+).
- kX86_Xmm = kVec128,
- //! YMM register (AVX+).
- kX86_Ymm = kVec256,
- //! ZMM register (AVX512+).
- kX86_Zmm = kVec512,
- //! K register (AVX512+).
- kX86_KReg = kMask,
- //! MMX register.
- kX86_Mm = kExtra + 0,
- //! Segment register (None, ES, CS, SS, DS, FS, GS).
- kX86_SReg = kExtra + 1,
- //! Control register (CR).
- kX86_CReg = kExtra + 2,
- //! Debug register (DR).
- kX86_DReg = kExtra + 3,
- //! FPU (x87) register.
- kX86_St = kExtra + 4,
- //! Bound register (BND).
- kX86_Bnd = kExtra + 5,
- //! TMM register (AMX_TILE)
- kX86_Tmm = kExtra + 6,
-
- // ARM Specific Register Types
- // ---------------------------
-
- //! Program pointer (PC) register (AArch64).
- kARM_PC = kPC,
- //! 32-bit general purpose register (R or W).
- kARM_GpW = kGp32,
- //! 64-bit general purpose register (X).
- kARM_GpX = kGp64,
- //! 8-bit view of VFP/ASIMD register (B).
- kARM_VecB = kVec8,
- //! 16-bit view of VFP/ASIMD register (H).
- kARM_VecH = kVec16,
- //! 32-bit view of VFP/ASIMD register (S).
- kARM_VecS = kVec32,
- //! 64-bit view of VFP/ASIMD register (D).
- kARM_VecD = kVec64,
- //! 128-bit view of VFP/ASIMD register (Q).
- kARM_VecQ = kVec128,
- //! 128-bit view of VFP/ASIMD register (V).
- kARM_VecV = kVec128,
-
- //! Maximum value of `RegType`.
- kMaxValue = 31
-};
-ASMJIT_DEFINE_ENUM_COMPARE(RegType)
-
-//! Register group.
-//!
-//! Provides a unique value that identifies groups of registers and their views.
-enum class RegGroup : uint8_t {
- //! General purpose register group compatible with all backends.
- kGp = 0,
- //! Vector register group compatible with all backends.
- //!
- //! Describes X86 XMM|YMM|ZMM registers ARM/AArch64 V registers.
- kVec = 1,
-
- //! Mask register group compatible with all backends that can use masking.
- kMask = 2,
- //! Extra virtual group #3 that can be used by Compiler for register allocation.
- kExtraVirt3 = 3,
-
- //! Program counter group.
- kPC = 4,
-
- //! Extra non-virtual group that can be used by registers not managed by Compiler.
- kExtraNonVirt = 5,
-
- // X86 Specific Register Groups
- // ----------------------------
-
- //! K register group (KReg) - maps to \ref RegGroup::kMask (X86, X86_64).
- kX86_K = kMask,
- //! MMX register group (MM) - maps to \ref RegGroup::kExtraVirt3 (X86, X86_64).
- kX86_MM = kExtraVirt3,
-
- //! Instruction pointer (X86, X86_64).
- kX86_Rip = kPC,
- //! Segment register group (X86, X86_64).
- kX86_SReg = kExtraNonVirt + 0,
- //! CR register group (X86, X86_64).
- kX86_CReg = kExtraNonVirt + 1,
- //! DR register group (X86, X86_64).
- kX86_DReg = kExtraNonVirt + 2,
- //! FPU register group (X86, X86_64).
- kX86_St = kExtraNonVirt + 3,
- //! BND register group (X86, X86_64).
- kX86_Bnd = kExtraNonVirt + 4,
- //! TMM register group (X86, X86_64).
- kX86_Tmm = kExtraNonVirt + 5,
-
- //! First group - only used in loops.
- k0 = 0,
- //! Last value of a virtual register that is managed by \ref BaseCompiler.
- kMaxVirt = Globals::kNumVirtGroups - 1,
- //! Maximum value of `RegGroup`.
- kMaxValue = 15
-};
-ASMJIT_DEFINE_ENUM_COMPARE(RegGroup)
-
-typedef Support::EnumValues<RegGroup, RegGroup::kGp, RegGroup::kMaxVirt> RegGroupVirtValues;
-
-//! Operand signature is a 32-bit number describing \ref Operand and some of its payload.
-//!
-//! In AsmJit operand signature is used to store additional payload of register, memory, and immediate operands.
-//! In practice the biggest pressure on OperandSignature is from \ref BaseMem and architecture specific memory
-//! operands that need to store additional payload that cannot be stored elsewhere as values of all other members
-//! are fully specified by \ref BaseMem.
-struct OperandSignature {
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- // Operand type (3 least significant bits).
- // |........|........|........|.....XXX|
- kOpTypeShift = 0,
- kOpTypeMask = 0x07u << kOpTypeShift,
-
- // Register type (5 bits).
- // |........|........|........|XXXXX...|
- kRegTypeShift = 3,
- kRegTypeMask = 0x1Fu << kRegTypeShift,
-
- // Register group (4 bits).
- // |........|........|....XXXX|........|
- kRegGroupShift = 8,
- kRegGroupMask = 0x0Fu << kRegGroupShift,
-
- // Memory base type (5 bits).
- // |........|........|........|XXXXX...|
- kMemBaseTypeShift = 3,
- kMemBaseTypeMask = 0x1Fu << kMemBaseTypeShift,
-
- // Memory index type (5 bits).
- // |........|........|...XXXXX|........|
- kMemIndexTypeShift = 8,
- kMemIndexTypeMask = 0x1Fu << kMemIndexTypeShift,
-
- // Memory base+index combined (10 bits).
- // |........|........|...XXXXX|XXXXX...|
- kMemBaseIndexShift = 3,
- kMemBaseIndexMask = 0x3FFu << kMemBaseIndexShift,
-
- // This memory operand represents a home-slot or stack (Compiler) (1 bit).
- // |........|........|..X.....|........|
- kMemRegHomeShift = 13,
- kMemRegHomeFlag = 0x01u << kMemRegHomeShift,
-
- // Immediate type (1 bit).
- // |........|........|........|....X...|
- kImmTypeShift = 3,
- kImmTypeMask = 0x01u << kImmTypeShift,
-
- // Predicate used by either registers or immediate values (4 bits).
- // |........|XXXX....|........|........|
- kPredicateShift = 20,
- kPredicateMask = 0x0Fu << kPredicateShift,
-
- // Operand size (8 most significant bits).
- // |XXXXXXXX|........|........|........|
- kSizeShift = 24,
- kSizeMask = 0xFFu << kSizeShift
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- uint32_t _bits;
-
- //! \}
-
- //! \name Overloaded Operators
- //!
- //! Overloaded operators make `OperandSignature` behave like regular integer.
- //!
- //! \{
-
- ASMJIT_INLINE_NODEBUG constexpr bool operator!() const noexcept { return _bits == 0; }
- ASMJIT_INLINE_NODEBUG constexpr explicit operator bool() const noexcept { return _bits != 0; }
-
- ASMJIT_INLINE_NODEBUG OperandSignature& operator|=(uint32_t x) noexcept { _bits |= x; return *this; }
- ASMJIT_INLINE_NODEBUG OperandSignature& operator&=(uint32_t x) noexcept { _bits &= x; return *this; }
- ASMJIT_INLINE_NODEBUG OperandSignature& operator^=(uint32_t x) noexcept { _bits ^= x; return *this; }
-
- ASMJIT_INLINE_NODEBUG OperandSignature& operator|=(const OperandSignature& other) noexcept { return operator|=(other._bits); }
- ASMJIT_INLINE_NODEBUG OperandSignature& operator&=(const OperandSignature& other) noexcept { return operator&=(other._bits); }
- ASMJIT_INLINE_NODEBUG OperandSignature& operator^=(const OperandSignature& other) noexcept { return operator^=(other._bits); }
-
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator~() const noexcept { return OperandSignature{~_bits}; }
-
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator|(uint32_t x) const noexcept { return OperandSignature{_bits | x}; }
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator&(uint32_t x) const noexcept { return OperandSignature{_bits & x}; }
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator^(uint32_t x) const noexcept { return OperandSignature{_bits ^ x}; }
-
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator|(const OperandSignature& other) const noexcept { return OperandSignature{_bits | other._bits}; }
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator&(const OperandSignature& other) const noexcept { return OperandSignature{_bits & other._bits}; }
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature operator^(const OperandSignature& other) const noexcept { return OperandSignature{_bits ^ other._bits}; }
-
- ASMJIT_INLINE_NODEBUG constexpr bool operator==(uint32_t x) const noexcept { return _bits == x; }
- ASMJIT_INLINE_NODEBUG constexpr bool operator!=(uint32_t x) const noexcept { return _bits != x; }
-
- ASMJIT_INLINE_NODEBUG constexpr bool operator==(const OperandSignature& other) const noexcept { return _bits == other._bits; }
- ASMJIT_INLINE_NODEBUG constexpr bool operator!=(const OperandSignature& other) const noexcept { return _bits != other._bits; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _bits = 0; }
-
- ASMJIT_INLINE_NODEBUG constexpr uint32_t bits() const noexcept { return _bits; }
- ASMJIT_INLINE_NODEBUG void setBits(uint32_t bits) noexcept { _bits = bits; }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG constexpr bool hasField() const noexcept {
- return (_bits & kFieldMask) != 0;
- }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG constexpr bool hasField(uint32_t value) const noexcept {
- return (_bits & kFieldMask) != value << Support::ConstCTZ<kFieldMask>::value;
- }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG constexpr uint32_t getField() const noexcept {
- return (_bits >> Support::ConstCTZ<kFieldMask>::value) & (kFieldMask >> Support::ConstCTZ<kFieldMask>::value);
- }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG void setField(uint32_t value) noexcept {
- ASMJIT_ASSERT(((value << Support::ConstCTZ<kFieldMask>::value) & ~kFieldMask) == 0);
- _bits = (_bits & ~kFieldMask) | (value << Support::ConstCTZ<kFieldMask>::value);
- }
-
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature subset(uint32_t mask) const noexcept { return OperandSignature{_bits & mask}; }
-
- template<uint32_t kFieldMask, uint32_t kFieldShift = Support::ConstCTZ<kFieldMask>::value>
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature replacedValue(uint32_t value) const noexcept { return OperandSignature{(_bits & ~kFieldMask) | (value << kFieldShift)}; }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG constexpr bool matchesSignature(const OperandSignature& signature) const noexcept {
- return (_bits & kFieldMask) == signature._bits;
- }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG constexpr bool matchesFields(uint32_t bits) const noexcept {
- return (_bits & kFieldMask) == bits;
- }
-
- template<uint32_t kFieldMask>
- ASMJIT_INLINE_NODEBUG constexpr bool matchesFields(const OperandSignature& fields) const noexcept {
- return (_bits & kFieldMask) == fields._bits;
- }
-
- ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return _bits != 0; }
-
- ASMJIT_INLINE_NODEBUG constexpr OperandType opType() const noexcept { return (OperandType)getField<kOpTypeMask>(); }
-
- ASMJIT_INLINE_NODEBUG constexpr RegType regType() const noexcept { return (RegType)getField<kRegTypeMask>(); }
- ASMJIT_INLINE_NODEBUG constexpr RegGroup regGroup() const noexcept { return (RegGroup)getField<kRegGroupMask>(); }
-
- ASMJIT_INLINE_NODEBUG constexpr RegType memBaseType() const noexcept { return (RegType)getField<kMemBaseTypeMask>(); }
- ASMJIT_INLINE_NODEBUG constexpr RegType memIndexType() const noexcept { return (RegType)getField<kMemIndexTypeMask>(); }
-
- ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return getField<kPredicateMask>(); }
- ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return getField<kSizeMask>(); }
-
- ASMJIT_INLINE_NODEBUG void setOpType(OperandType opType) noexcept { setField<kOpTypeMask>(uint32_t(opType)); }
- ASMJIT_INLINE_NODEBUG void setRegType(RegType regType) noexcept { setField<kRegTypeMask>(uint32_t(regType)); }
- ASMJIT_INLINE_NODEBUG void setRegGroup(RegGroup regGroup) noexcept { setField<kRegGroupMask>(uint32_t(regGroup)); }
-
- ASMJIT_INLINE_NODEBUG void setMemBaseType(RegType baseType) noexcept { setField<kMemBaseTypeMask>(uint32_t(baseType)); }
- ASMJIT_INLINE_NODEBUG void setMemIndexType(RegType indexType) noexcept { setField<kMemIndexTypeMask>(uint32_t(indexType)); }
-
- ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { setField<kPredicateMask>(predicate); }
- ASMJIT_INLINE_NODEBUG void setSize(uint32_t size) noexcept { setField<kSizeMask>(size); }
-
- //! \}
-
- //! \name Static Constructors
- //! \{
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromBits(uint32_t bits) noexcept {
- return OperandSignature{bits};
- }
-
- template<uint32_t kFieldMask, typename T>
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromValue(const T& value) noexcept {
- return OperandSignature{uint32_t(value) << Support::ConstCTZ<kFieldMask>::value};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromOpType(OperandType opType) noexcept {
- return OperandSignature{uint32_t(opType) << kOpTypeShift};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromRegType(RegType regType) noexcept {
- return OperandSignature{uint32_t(regType) << kRegTypeShift};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromRegGroup(RegGroup regGroup) noexcept {
- return OperandSignature{uint32_t(regGroup) << kRegGroupShift};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromRegTypeAndGroup(RegType regType, RegGroup regGroup) noexcept {
- return fromRegType(regType) | fromRegGroup(regGroup);
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromMemBaseType(RegType baseType) noexcept {
- return OperandSignature{uint32_t(baseType) << kMemBaseTypeShift};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromMemIndexType(RegType indexType) noexcept {
- return OperandSignature{uint32_t(indexType) << kMemIndexTypeShift};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromPredicate(uint32_t predicate) noexcept {
- return OperandSignature{predicate << kPredicateShift};
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr OperandSignature fromSize(uint32_t size) noexcept {
- return OperandSignature{size << kSizeShift};
- }
-
- //! \}
-};
-
-//! Base class representing an operand in AsmJit (non-default constructed version).
-//!
-//! Contains no initialization code and can be used safely to define an array of operands that won't be initialized.
-//! This is a \ref Operand base structure designed to be statically initialized, static const, or to be used by user
-//! code to define an array of operands without having them default initialized at construction time.
-//!
-//! The key difference between \ref Operand and \ref Operand_ is:
-//!
-//! ```
-//! Operand_ xArray[10]; // Not initialized, contains garbage.
-//! Operand_ yArray[10] {}; // All operands initialized to none explicitly (zero initialized).
-//! Operand yArray[10]; // All operands initialized to none implicitly (zero initialized).
-//! ```
-struct Operand_ {
- //! \name Types
- //! \{
-
- typedef OperandSignature Signature;
-
- //! \}
-
- //! \name Constants
- //! \{
-
- // Indexes to `_data` array.
- enum DataIndex : uint32_t {
- kDataMemIndexId = 0,
- kDataMemOffsetLo = 1,
-
- kDataImmValueLo = ASMJIT_ARCH_LE ? 0 : 1,
- kDataImmValueHi = ASMJIT_ARCH_LE ? 1 : 0
- };
-
- //! Constants useful for VirtId <-> Index translation.
- enum VirtIdConstants : uint32_t {
- //! Minimum valid packed-id.
- kVirtIdMin = 256,
- //! Maximum valid packed-id, excludes Globals::kInvalidId.
- kVirtIdMax = Globals::kInvalidId - 1,
- //! Count of valid packed-ids.
- kVirtIdCount = uint32_t(kVirtIdMax - kVirtIdMin + 1)
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Provides operand type and additional payload.
- Signature _signature;
- //! Either base id as used by memory operand or any id as used by others.
- uint32_t _baseId;
-
- //! Data specific to the operand type.
- //!
- //! The reason we don't use union is that we have `constexpr` constructors that construct operands and other
- //!`constexpr` functions that return whether another Operand or something else. These cannot generally work with
- //! unions so we also cannot use `union` if we want to be standard compliant.
- uint32_t _data[2];
-
- //! \}
-
- //! Tests whether the given `id` is a valid virtual register id. Since AsmJit supports both physical and virtual
- //! registers it must be able to distinguish between these two. The idea is that physical registers are always
- //! limited in size, so virtual identifiers start from `kVirtIdMin` and end at `kVirtIdMax`.
- static ASMJIT_INLINE_NODEBUG bool isVirtId(uint32_t id) noexcept { return id - kVirtIdMin < uint32_t(kVirtIdCount); }
- //! Converts a real-id into a packed-id that can be stored in Operand.
- static ASMJIT_INLINE_NODEBUG uint32_t indexToVirtId(uint32_t id) noexcept { return id + kVirtIdMin; }
- //! Converts a packed-id back to real-id.
- static ASMJIT_INLINE_NODEBUG uint32_t virtIdToIndex(uint32_t id) noexcept { return id - kVirtIdMin; }
-
- //! \name Construction & Destruction
- //! \{
-
- //! \cond INTERNAL
- //! Initializes a `BaseReg` operand from `signature` and register `id`.
- ASMJIT_INLINE_NODEBUG void _initReg(const Signature& signature, uint32_t id) noexcept {
- _signature = signature;
- _baseId = id;
- _data[0] = 0;
- _data[1] = 0;
- }
- //! \endcond
-
- //! Initializes the operand from `other` operand (used by operator overloads).
- ASMJIT_INLINE_NODEBUG void copyFrom(const Operand_& other) noexcept {
- _signature._bits = other._signature._bits;
- _baseId = other._baseId;
- _data[0] = other._data[0];
- _data[1] = other._data[1];
- }
-
- //! Resets the `Operand` to none.
- //!
- //! None operand is defined the following way:
- //! - Its signature is zero (OperandType::kNone, and the rest zero as well).
- //! - Its id is `0`.
- //! - The reserved8_4 field is set to `0`.
- //! - The reserved12_4 field is set to zero.
- //!
- //! In other words, reset operands have all members set to zero. Reset operand must match the Operand state
- //! right after its construction. Alternatively, if you have an array of operands, you can simply use `memset()`.
- //!
- //! ```
- //! using namespace asmjit;
- //!
- //! Operand a;
- //! Operand b;
- //! assert(a == b);
- //!
- //! b = x86::eax;
- //! assert(a != b);
- //!
- //! b.reset();
- //! assert(a == b);
- //!
- //! memset(&b, 0, sizeof(Operand));
- //! assert(a == b);
- //! ```
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _signature.reset();
- _baseId = 0;
- _data[0] = 0;
- _data[1] = 0;
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Tests whether this operand is the same as `other`.
- ASMJIT_INLINE_NODEBUG constexpr bool operator==(const Operand_& other) const noexcept { return equals(other); }
- //! Tests whether this operand is not the same as `other`.
- ASMJIT_INLINE_NODEBUG constexpr bool operator!=(const Operand_& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Cast
- //! \{
-
- //! Casts this operand to `T` type.
- template<typename T>
- ASMJIT_INLINE_NODEBUG T& as() noexcept { return static_cast<T&>(*this); }
-
- //! Casts this operand to `T` type (const).
- template<typename T>
- ASMJIT_INLINE_NODEBUG const T& as() const noexcept { return static_cast<const T&>(*this); }
-
- //! \}
-
- //! \name Equality
- //! \{
-
- //! Tests whether the operand is 100% equal to `other` operand.
- //!
- //! \note This basically performs a binary comparison, if aby bit is
- //! different the operands are not equal.
- ASMJIT_INLINE_NODEBUG constexpr bool equals(const Operand_& other) const noexcept {
- return bool(unsigned(_signature == other._signature) &
- unsigned(_baseId == other._baseId ) &
- unsigned(_data[0] == other._data[0] ) &
- unsigned(_data[1] == other._data[1] ));
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the operand's signature matches the signature of the `other` operand.
- ASMJIT_INLINE_NODEBUG constexpr bool hasSignature(const Operand_& other) const noexcept { return _signature == other._signature; }
- //! Tests whether the operand's signature matches the given signature `sign`.
- ASMJIT_INLINE_NODEBUG constexpr bool hasSignature(const Signature& other) const noexcept { return _signature == other; }
-
- //! Returns operand signature as unsigned 32-bit integer.
- //!
- //! Signature is first 4 bytes of the operand data. It's used mostly for operand checking as it's
- //! much faster to check packed 4 bytes at once than having to check these bytes individually.
- ASMJIT_INLINE_NODEBUG constexpr Signature signature() const noexcept { return _signature; }
-
- //! Sets the operand signature, see `signature()`.
- //!
- //! \note Improper use of `setSignature()` can lead to hard-to-debug errors.
- ASMJIT_INLINE_NODEBUG void setSignature(const Signature& signature) noexcept { _signature = signature; }
- //! \overload
- ASMJIT_INLINE_NODEBUG void setSignature(uint32_t signature) noexcept { _signature._bits = signature; }
-
- //! Returns the type of the operand, see `OpType`.
- ASMJIT_INLINE_NODEBUG constexpr OperandType opType() const noexcept { return _signature.opType(); }
- //! Tests whether the operand is none (`OperandType::kNone`).
- ASMJIT_INLINE_NODEBUG constexpr bool isNone() const noexcept { return _signature == Signature::fromBits(0); }
- //! Tests whether the operand is a register (`OperandType::kReg`).
- ASMJIT_INLINE_NODEBUG constexpr bool isReg() const noexcept { return opType() == OperandType::kReg; }
- //! Tests whether the operand is a register-list.
- //!
- //! \note Register-list is currently only used by 32-bit ARM architecture.
- ASMJIT_INLINE_NODEBUG constexpr bool isRegList() const noexcept { return opType() == OperandType::kRegList; }
- //! Tests whether the operand is a memory location (`OperandType::kMem`).
- ASMJIT_INLINE_NODEBUG constexpr bool isMem() const noexcept { return opType() == OperandType::kMem; }
- //! Tests whether the operand is an immediate (`OperandType::kImm`).
- ASMJIT_INLINE_NODEBUG constexpr bool isImm() const noexcept { return opType() == OperandType::kImm; }
- //! Tests whether the operand is a label (`OperandType::kLabel`).
- ASMJIT_INLINE_NODEBUG constexpr bool isLabel() const noexcept { return opType() == OperandType::kLabel; }
-
- //! Tests whether the operand is a physical register.
- ASMJIT_INLINE_NODEBUG constexpr bool isPhysReg() const noexcept { return isReg() && _baseId < 0xFFu; }
- //! Tests whether the operand is a virtual register.
- ASMJIT_INLINE_NODEBUG constexpr bool isVirtReg() const noexcept { return isReg() && _baseId > 0xFFu; }
-
- //! Returns the operand id.
- //!
- //! The value returned should be interpreted accordingly to the operand type:
- //! * None - Should be `0`.
- //! * Reg - Physical or virtual register id.
- //! * Mem - Multiple meanings - BASE address (register or label id), or high value of a 64-bit absolute address.
- //! * Imm - Should be `0`.
- //! * Label - Label id if it was created by using `newLabel()` or `Globals::kInvalidId` if the label is invalid or
- //! not initialized.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t id() const noexcept { return _baseId; }
-
- //! Tests whether the operand is a register matching the given register `type`.
- ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType type) const noexcept {
- return _signature.subset(Signature::kOpTypeMask | Signature::kRegTypeMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegType(type));
- }
-
- //! Tests whether the operand is a register of the provided register group `regGroup`.
- ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegGroup regGroup) const noexcept {
- return _signature.subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(regGroup));
- }
-
- //! Tests whether the operand is register and of register type `regType` and `regId`.
- ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType regType, uint32_t regId) const noexcept { return isReg(regType) && _baseId == regId; }
- //! Tests whether the operand is register and of register group `regGroup` and `regId`.
- ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegGroup regGroup, uint32_t regId) const noexcept { return isReg(regGroup) && _baseId == regId; }
-
- //! Tests whether the register is a general purpose register (any size).
- ASMJIT_INLINE_NODEBUG constexpr bool isGp() const noexcept { return isReg(RegGroup::kGp); }
- //! Tests whether the register is a 32-bit general purpose register.
- ASMJIT_INLINE_NODEBUG constexpr bool isGp32() const noexcept { return isReg(RegType::kGp32); }
- //! Tests whether the register is a 64-bit general purpose register.
- ASMJIT_INLINE_NODEBUG constexpr bool isGp64() const noexcept { return isReg(RegType::kGp64); }
-
- //! Tests whether the register is a vector register of any size.
- ASMJIT_INLINE_NODEBUG constexpr bool isVec() const noexcept { return isReg(RegGroup::kVec); }
- //! Tests whether the register is an 8-bit vector register or view (AArch64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec8() const noexcept { return isReg(RegType::kVec8); }
- //! Tests whether the register is a 16-bit vector register or view (AArch64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec16() const noexcept { return isReg(RegType::kVec16); }
- //! Tests whether the register is a 32-bit vector register or view (AArch32, AArch64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec32() const noexcept { return isReg(RegType::kVec32); }
- //! Tests whether the register is a 64-bit vector register or view (AArch32, AArch64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec64() const noexcept { return isReg(RegType::kVec64); }
- //! Tests whether the register is a 128-bit vector register or view (AArch32, AArch64, X86, X86_64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return isReg(RegType::kVec128); }
- //! Tests whether the register is a 256-bit vector register or view (X86, X86_64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec256() const noexcept { return isReg(RegType::kVec256); }
- //! Tests whether the register is a 512-bit vector register or view (X86, X86_64).
- ASMJIT_INLINE_NODEBUG constexpr bool isVec512() const noexcept { return isReg(RegType::kVec512); }
-
- //! Tests whether the register is a mask register of any size.
- ASMJIT_INLINE_NODEBUG constexpr bool isMask() const noexcept { return isReg(RegGroup::kMask); }
-
- //! Tests whether the operand is a register matching the given register `type`.
- ASMJIT_INLINE_NODEBUG constexpr bool isRegList(RegType type) const noexcept {
- return _signature.subset(Signature::kOpTypeMask | Signature::kRegTypeMask) == (Signature::fromOpType(OperandType::kRegList) | Signature::fromRegType(type));
- }
-
- //! Tests whether the operand is a register or memory.
- //!
- //! \note This is useful on X86 and X86_64 architectures as many instructions support Reg/Mem operand combination.
- //! So if the user code works with just \ref Operand, it's possible to check whether the operand is either a register
- //! or memory location with a single check.
- ASMJIT_INLINE_NODEBUG constexpr bool isRegOrMem() const noexcept {
- return Support::isBetween<uint32_t>(uint32_t(opType()), uint32_t(OperandType::kReg), uint32_t(OperandType::kMem));
- }
-
- //! Tests whether the operand is a register, register-list, or memory.
- //!
- //! \note This is useful on 32-bit ARM architecture to check whether an operand references a register. It can be
- //! used in other architectures too, but it would work identically to \ref isRegOrMem() as other architectures
- //! don't provide register lists.
- ASMJIT_INLINE_NODEBUG constexpr bool isRegOrRegListOrMem() const noexcept {
- return Support::isBetween<uint32_t>(uint32_t(opType()), uint32_t(OperandType::kReg), uint32_t(OperandType::kRegList));
- }
-
- //! \}
-
- //! \name Accessors (X86 Specific)
- //! \{
-
- //! Returns a size of a register or an X86 memory operand.
- //!
- //! At the moment only X86 and X86_64 memory operands have a size - other memory operands can use bits that represent
- //! size as an additional payload. This means that memory size is architecture specific and should be accessed via
- //! \ref x86::Mem::size(). Sometimes when the user knows that the operand is either a register or memory operand this
- //! function can be helpful as it avoids casting.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t x86RmSize() const noexcept {
- return _signature.size();
- }
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ASMJIT_DEPRECATED("hasSize() is no longer portable - use x86RmSize() instead, if your target is X86/X86_64")
- ASMJIT_INLINE_NODEBUG constexpr bool hasSize() const noexcept { return x86RmSize() != 0u; }
-
- ASMJIT_DEPRECATED("hasSize() is no longer portable - use x86RmSize() instead, if your target is X86/X86_64")
- ASMJIT_INLINE_NODEBUG constexpr bool hasSize(uint32_t s) const noexcept { return x86RmSize() == s; }
-
- ASMJIT_DEPRECATED("size() is no longer portable - use x86RmSize() instead, if your target is X86/X86_64")
- ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField<Signature::kSizeMask>(); }
-#endif
-
- //! \}
-};
-
-//! Base class representing an operand in AsmJit (default constructed version).
-class Operand : public Operand_ {
-public:
- //! \name Construction & Destruction
- //! \{
-
- //! Creates `kOpNone` operand having all members initialized to zero.
- ASMJIT_INLINE_NODEBUG constexpr Operand() noexcept
- : Operand_{ Signature::fromOpType(OperandType::kNone), 0u, { 0u, 0u }} {}
-
- //! Creates a cloned `other` operand.
- ASMJIT_INLINE_NODEBUG constexpr Operand(const Operand& other) noexcept = default;
-
- //! Creates a cloned `other` operand.
- ASMJIT_INLINE_NODEBUG constexpr explicit Operand(const Operand_& other)
- : Operand_(other) {}
-
- //! Creates an operand initialized to raw `[u0, u1, u2, u3]` values.
- ASMJIT_INLINE_NODEBUG constexpr Operand(Globals::Init_, const Signature& u0, uint32_t u1, uint32_t u2, uint32_t u3) noexcept
- : Operand_{{u0._bits}, u1, {u2, u3}} {}
-
- //! Creates an uninitialized operand (dangerous).
- ASMJIT_INLINE_NODEBUG explicit Operand(Globals::NoInit_) noexcept {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG Operand& operator=(const Operand& other) noexcept = default;
- ASMJIT_INLINE_NODEBUG Operand& operator=(const Operand_& other) noexcept { return operator=(static_cast<const Operand&>(other)); }
-
- //! \}
-
- //! \name Clone
- //! \{
-
- //! Clones this operand and returns its copy.
- ASMJIT_INLINE_NODEBUG constexpr Operand clone() const noexcept { return Operand(*this); }
-
- //! \}
-};
-
-static_assert(sizeof(Operand) == 16, "asmjit::Operand must be exactly 16 bytes long");
-
-//! Label (jump target or data location).
-//!
-//! Label represents a location in code typically used as a jump target, but may be also a reference to some data or
-//! a static variable. Label has to be explicitly created by BaseEmitter.
-//!
-//! Example of using labels:
-//!
-//! ```
-//! // Create some emitter (for example x86::Assembler).
-//! x86::Assembler a;
-//!
-//! // Create Label instance.
-//! Label L1 = a.newLabel();
-//!
-//! // ... your code ...
-//!
-//! // Using label.
-//! a.jump(L1);
-//!
-//! // ... your code ...
-//!
-//! // Bind label to the current position, see `BaseEmitter::bind()`.
-//! a.bind(L1);
-//! ```
-class Label : public Operand {
-public:
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a label operand without ID (you must set the ID to make it valid).
- ASMJIT_INLINE_NODEBUG constexpr Label() noexcept
- : Operand(Globals::Init, Signature::fromOpType(OperandType::kLabel), Globals::kInvalidId, 0, 0) {}
-
- //! Creates a cloned label operand of `other`.
- ASMJIT_INLINE_NODEBUG constexpr Label(const Label& other) noexcept
- : Operand(other) {}
-
- //! Creates a label operand of the given `id`.
- ASMJIT_INLINE_NODEBUG constexpr explicit Label(uint32_t id) noexcept
- : Operand(Globals::Init, Signature::fromOpType(OperandType::kLabel), id, 0, 0) {}
-
- ASMJIT_INLINE_NODEBUG explicit Label(Globals::NoInit_) noexcept
- : Operand(Globals::NoInit) {}
-
- //! Resets the label, will reset all properties and set its ID to `Globals::kInvalidId`.
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _signature = Signature::fromOpType(OperandType::kLabel);
- _baseId = Globals::kInvalidId;
- _data[0] = 0;
- _data[1] = 0;
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG Label& operator=(const Label& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the label was created by CodeHolder and/or an attached emitter.
- ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return _baseId != Globals::kInvalidId; }
- //! Sets the label `id`.
- ASMJIT_INLINE_NODEBUG void setId(uint32_t id) noexcept { _baseId = id; }
-
- //! \}
-};
-
-//! \cond INTERNAL
-//! Default register traits.
-struct BaseRegTraits {
- enum : uint32_t {
- //! \ref TypeId representing this register type, could be \ref TypeId::kVoid if such type doesn't exist.
- kTypeId = uint32_t(TypeId::kVoid),
- //! RegType is not valid by default.
- kValid = 0,
-
- //! Zero type by default (defaults to None).
- kType = uint32_t(RegType::kNone),
- //! Zero group by default (defaults to GP).
- kGroup = uint32_t(RegGroup::kGp),
- //! No size by default.
- kSize = 0,
-
- //! Empty signature by default (not even having operand type set to register).
- kSignature = 0
- };
-};
-//! \endcond
-
-//! Physical or virtual register operand (base).
-class BaseReg : public Operand {
-public:
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- //! None or any register (mostly internal).
- kIdBad = 0xFFu,
-
- kBaseSignatureMask =
- Signature::kOpTypeMask |
- Signature::kRegTypeMask |
- Signature::kRegGroupMask |
- Signature::kSizeMask,
-
- kTypeNone = uint32_t(RegType::kNone),
- kSignature = Signature::fromOpType(OperandType::kReg).bits()
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a dummy register operand.
- ASMJIT_INLINE_NODEBUG constexpr BaseReg() noexcept
- : Operand(Globals::Init, Signature::fromOpType(OperandType::kReg), kIdBad, 0, 0) {}
-
- //! Creates a new register operand which is the same as `other` .
- ASMJIT_INLINE_NODEBUG constexpr BaseReg(const BaseReg& other) noexcept
- : Operand(other) {}
-
- //! Creates a new register operand compatible with `other`, but with a different `id`.
- ASMJIT_INLINE_NODEBUG constexpr BaseReg(const BaseReg& other, uint32_t id) noexcept
- : Operand(Globals::Init, other._signature, id, 0, 0) {}
-
- //! Creates a register initialized to the given `signature` and `id`.
- ASMJIT_INLINE_NODEBUG constexpr BaseReg(const Signature& signature, uint32_t id) noexcept
- : Operand(Globals::Init, signature, id, 0, 0) {}
-
- ASMJIT_INLINE_NODEBUG explicit BaseReg(Globals::NoInit_) noexcept
- : Operand(Globals::NoInit) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG BaseReg& operator=(const BaseReg& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns base signature of the register associated with each register type.
- //!
- //! Base signature only contains the operand type, register type, register group, and register size. It doesn't
- //! contain element type, predicate, or other architecture-specific data. Base signature is a signature that is
- //! provided by architecture-specific `RegTraits`, like \ref x86::RegTraits.
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature baseSignature() const noexcept { return _signature & kBaseSignatureMask; }
-
- //! Tests whether the operand's base signature matches the given signature `sign`.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseSignature(uint32_t signature) const noexcept { return baseSignature() == signature; }
- //! Tests whether the operand's base signature matches the given signature `sign`.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseSignature(const OperandSignature& signature) const noexcept { return baseSignature() == signature; }
- //! Tests whether the operand's base signature matches the base signature of the `other` operand.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseSignature(const BaseReg& other) const noexcept { return baseSignature() == other.baseSignature(); }
-
- //! Tests whether this register is the same as `other`.
- //!
- //! This is just an optimization. Registers by default only use the first 8 bytes of Operand data, so this method
- //! takes advantage of this knowledge and only compares these 8 bytes. If both operands were created correctly
- //! both \ref equals() and \ref isSame() should give the same answer, however, if any of these two contains garbage
- //! or other metadata in the upper 8 bytes then \ref isSame() may return `true` in cases in which \ref equals()
- //! returns false.
- ASMJIT_INLINE_NODEBUG constexpr bool isSame(const BaseReg& other) const noexcept {
- return (_signature == other._signature) & (_baseId == other._baseId);
- }
-
- //! Tests whether the register is valid (either virtual or physical).
- ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return bool(unsigned(_signature != 0) & unsigned(_baseId != kIdBad)); }
-
- //! Tests whether this is a physical register.
- ASMJIT_INLINE_NODEBUG constexpr bool isPhysReg() const noexcept { return _baseId < kIdBad; }
- //! Tests whether this is a virtual register.
- ASMJIT_INLINE_NODEBUG constexpr bool isVirtReg() const noexcept { return _baseId > kIdBad; }
-
- //! Tests whether the register type matches `type` - same as `isReg(type)`, provided for convenience.
- ASMJIT_INLINE_NODEBUG constexpr bool isType(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::fromRegType(type); }
- //! Tests whether the register group matches `group`.
- ASMJIT_INLINE_NODEBUG constexpr bool isGroup(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::fromRegGroup(group); }
-
- //! Tests whether the register is a general purpose register (any size).
- ASMJIT_INLINE_NODEBUG constexpr bool isGp() const noexcept { return isGroup(RegGroup::kGp); }
- //! Tests whether the register is a vector register of any size.
- ASMJIT_INLINE_NODEBUG constexpr bool isVec() const noexcept { return isGroup(RegGroup::kVec); }
- //! Tests whether the register is a mask register of any size.
- ASMJIT_INLINE_NODEBUG constexpr bool isMask() const noexcept { return isGroup(RegGroup::kMask); }
-
- using Operand_::isReg;
-
- //! Same as `isType()`, provided for convenience.
- ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType rType) const noexcept { return isType(rType); }
- //! Tests whether the register type matches `type` and register id matches `id`.
- ASMJIT_INLINE_NODEBUG constexpr bool isReg(RegType rType, uint32_t id) const noexcept { return isType(rType) && this->id() == id; }
-
- //! Returns the register type.
- ASMJIT_INLINE_NODEBUG constexpr RegType type() const noexcept { return _signature.regType(); }
- //! Returns the register group.
- ASMJIT_INLINE_NODEBUG constexpr RegGroup group() const noexcept { return _signature.regGroup(); }
-
- //! Tests whether the register specifies a size (i.e. the size is not zero).
- ASMJIT_INLINE_NODEBUG constexpr bool hasSize() const noexcept { return _signature.hasField<Signature::kSizeMask>(); }
- //! Tests whether the register size matches size `s`.
- ASMJIT_INLINE_NODEBUG constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; }
-
- //! Returns the size of the register in bytes. If the register size depends on architecture (like `x86::CReg` and
- //! `x86::DReg`) the size returned should be the greatest possible (so it should return 64-bit size in such case).
- ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField<Signature::kSizeMask>(); }
-
- //! Returns operation predicate of the register (ARM/AArch64).
- //!
- //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
- //! of the register.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return _signature.getField<Signature::kPredicateMask>(); }
-
- //! Sets operation predicate of the register to `predicate` (ARM/AArch64).
- //!
- //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
- //! of the register.
- ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { _signature.setField<Signature::kPredicateMask>(predicate); }
-
- //! Resets shift operation type of the register to the default value (ARM/AArch64).
- ASMJIT_INLINE_NODEBUG void resetPredicate() noexcept { _signature.setField<Signature::kPredicateMask>(0); }
-
- //! Clones the register operand.
- ASMJIT_INLINE_NODEBUG constexpr BaseReg clone() const noexcept { return BaseReg(*this); }
-
- //! Casts this register to `RegT` by also changing its signature.
- //!
- //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors.
- template<typename RegT>
- ASMJIT_INLINE_NODEBUG constexpr RegT cloneAs() const noexcept { return RegT(Signature(RegT::kSignature), id()); }
-
- //! Casts this register to `other` by also changing its signature.
- //!
- //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors.
- template<typename RegT>
- ASMJIT_INLINE_NODEBUG constexpr RegT cloneAs(const RegT& other) const noexcept { return RegT(other.signature(), id()); }
-
- //! Sets the register id to `id`.
- ASMJIT_INLINE_NODEBUG void setId(uint32_t id) noexcept { _baseId = id; }
-
- //! Sets a 32-bit operand signature based on traits of `RegT`.
- template<typename RegT>
- ASMJIT_INLINE_NODEBUG void setSignatureT() noexcept { _signature = RegT::kSignature; }
-
- //! Sets the register `signature` and `id`.
- ASMJIT_INLINE_NODEBUG void setSignatureAndId(const OperandSignature& signature, uint32_t id) noexcept {
- _signature = signature;
- _baseId = id;
- }
-
- //! \}
-
- //! \name Static Functions
- //! \{
-
- //! Tests whether the `op` operand is a general purpose register.
- static ASMJIT_INLINE_NODEBUG bool isGp(const Operand_& op) noexcept {
- // Check operand type and register group. Not interested in register type and size.
- return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kGp));
- }
-
- //! Tests whether the `op` operand is a vector register.
- static ASMJIT_INLINE_NODEBUG bool isVec(const Operand_& op) noexcept {
- // Check operand type and register group. Not interested in register type and size.
- return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask) == (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kVec));
- }
-
- //! Tests whether the `op` is a general purpose register of the given `id`.
- static ASMJIT_INLINE_NODEBUG bool isGp(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isGp(op)) & unsigned(op.id() == id)); }
- //! Tests whether the `op` is a vector register of the given `id`.
- static ASMJIT_INLINE_NODEBUG bool isVec(const Operand_& op, uint32_t id) noexcept { return bool(unsigned(isVec(op)) & unsigned(op.id() == id)); }
-
- //! \}
-};
-
-//! RegOnly is 8-byte version of `BaseReg` that allows to store either register or nothing.
-//!
-//! It's designed to decrease the space consumed by an extra "operand" in \ref BaseEmitter and \ref InstNode.
-struct RegOnly {
- //! \name Types
- //! \{
-
- typedef OperandSignature Signature;
-
- //! \}
-
- //! Operand signature - only \ref OperandType::kNone and \ref OperandType::kReg are supported.
- Signature _signature;
- //! Physical or virtual register id.
- uint32_t _id;
-
- //! \name Construction & Destruction
- //! \{
-
- //! Initializes the `RegOnly` instance to hold register `signature` and `id`.
- ASMJIT_INLINE_NODEBUG void init(const OperandSignature& signature, uint32_t id) noexcept {
- _signature = signature;
- _id = id;
- }
-
- ASMJIT_INLINE_NODEBUG void init(const BaseReg& reg) noexcept { init(reg.signature(), reg.id()); }
- ASMJIT_INLINE_NODEBUG void init(const RegOnly& reg) noexcept { init(reg.signature(), reg.id()); }
-
- //! Resets the `RegOnly` members to zeros (none).
- ASMJIT_INLINE_NODEBUG void reset() noexcept { init(Signature::fromBits(0), 0); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether this ExtraReg is none (same as calling `Operand_::isNone()`).
- ASMJIT_INLINE_NODEBUG constexpr bool isNone() const noexcept { return _signature == 0; }
- //! Tests whether the register is valid (either virtual or physical).
- ASMJIT_INLINE_NODEBUG constexpr bool isReg() const noexcept { return _signature != 0; }
-
- //! Tests whether this is a physical register.
- ASMJIT_INLINE_NODEBUG constexpr bool isPhysReg() const noexcept { return _id < BaseReg::kIdBad; }
- //! Tests whether this is a virtual register (used by `BaseCompiler`).
- ASMJIT_INLINE_NODEBUG constexpr bool isVirtReg() const noexcept { return _id > BaseReg::kIdBad; }
-
- //! Returns the register signature or 0 if no register is assigned.
- ASMJIT_INLINE_NODEBUG constexpr OperandSignature signature() const noexcept { return _signature; }
- //! Returns the register id.
- //!
- //! \note Always check whether the register is assigned before using the returned identifier as
- //! non-assigned `RegOnly` instance would return zero id, which is still a valid register id.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t id() const noexcept { return _id; }
-
- //! Sets the register id.
- ASMJIT_INLINE_NODEBUG void setId(uint32_t id) noexcept { _id = id; }
-
- //! Returns the register type.
- ASMJIT_INLINE_NODEBUG constexpr RegType type() const noexcept { return _signature.regType(); }
- //! Returns the register group.
- ASMJIT_INLINE_NODEBUG constexpr RegGroup group() const noexcept { return _signature.regGroup(); }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Converts this ExtraReg to a real `RegT` operand.
- template<typename RegT>
- ASMJIT_INLINE_NODEBUG constexpr RegT toReg() const noexcept { return RegT(_signature, _id); }
-
- //! \}
-};
-
-//! \cond INTERNAL
-//! Adds a template specialization for `REG_TYPE` into the local `RegTraits`.
-#define ASMJIT_DEFINE_REG_TRAITS(REG_TYPE, GROUP, SIZE, TYPE_ID) \
-template<> \
-struct RegTraits<REG_TYPE> { \
- static constexpr uint32_t kValid = 1; \
- static constexpr RegType kType = REG_TYPE; \
- static constexpr RegGroup kGroup = GROUP; \
- static constexpr uint32_t kSize = SIZE; \
- static constexpr TypeId kTypeId = TYPE_ID; \
- \
- static constexpr uint32_t kSignature = \
- (OperandSignature::fromOpType(OperandType::kReg) | \
- OperandSignature::fromRegType(kType) | \
- OperandSignature::fromRegGroup(kGroup) | \
- OperandSignature::fromSize(kSize)).bits(); \
- \
-}
-
-//! Adds constructors and member functions to a class that implements abstract register. Abstract register is register
-//! that doesn't have type or signature yet, it's a base class like `x86::Reg` or `arm::Reg`.
-#define ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
-public: \
- /*! Default constructor that only setups basics. */ \
- ASMJIT_INLINE_NODEBUG constexpr REG() noexcept \
- : BASE(Signature{kSignature}, kIdBad) {} \
- \
- /*! Makes a copy of the `other` register operand. */ \
- ASMJIT_INLINE_NODEBUG constexpr REG(const REG& other) noexcept \
- : BASE(other) {} \
- \
- /*! Makes a copy of the `other` register having id set to `id` */ \
- ASMJIT_INLINE_NODEBUG constexpr REG(const BaseReg& other, uint32_t id) noexcept \
- : BASE(other, id) {} \
- \
- /*! Creates a register based on `signature` and `id`. */ \
- ASMJIT_INLINE_NODEBUG constexpr REG(const OperandSignature& sgn, uint32_t id) noexcept \
- : BASE(sgn, id) {} \
- \
- /*! Creates a completely uninitialized REG register operand (garbage). */ \
- ASMJIT_INLINE_NODEBUG explicit REG(Globals::NoInit_) noexcept \
- : BASE(Globals::NoInit) {} \
- \
- /*! Creates a new register from register type and id. */ \
- static ASMJIT_INLINE_NODEBUG REG fromTypeAndId(RegType type, uint32_t id) noexcept { \
- return REG(signatureOf(type), id); \
- } \
- \
- /*! Clones the register operand. */ \
- ASMJIT_INLINE_NODEBUG constexpr REG clone() const noexcept { return REG(*this); } \
- \
- ASMJIT_INLINE_NODEBUG REG& operator=(const REG& other) noexcept = default;
-
-//! Adds constructors and member functions to a class that implements final register. Final registers MUST HAVE a valid
-//! signature.
-#define ASMJIT_DEFINE_FINAL_REG(REG, BASE, TRAITS) \
-public: \
- static constexpr RegType kThisType = TRAITS::kType; \
- static constexpr RegGroup kThisGroup = TRAITS::kGroup; \
- static constexpr uint32_t kThisSize = TRAITS::kSize; \
- static constexpr uint32_t kSignature = TRAITS::kSignature; \
- \
- ASMJIT_DEFINE_ABSTRACT_REG(REG, BASE) \
- \
- /*! Creates a register operand having its id set to `id`. */ \
- ASMJIT_INLINE_NODEBUG constexpr explicit REG(uint32_t id) noexcept \
- : BASE(Signature{kSignature}, id) {}
-//! \endcond
-
-//! List of physical registers (base).
-//!
-//! \note List of registers is only used by some ARM instructions at the moment.
-class BaseRegList : public Operand {
-public:
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- kSignature = Signature::fromOpType(OperandType::kRegList).bits()
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a dummy register operand.
- ASMJIT_INLINE_NODEBUG constexpr BaseRegList() noexcept
- : Operand(Globals::Init, Signature::fromOpType(OperandType::kRegList), 0, 0, 0) {}
-
- //! Creates a new register operand which is the same as `other` .
- ASMJIT_INLINE_NODEBUG constexpr BaseRegList(const BaseRegList& other) noexcept
- : Operand(other) {}
-
- //! Creates a new register operand compatible with `other`, but with a different `id`.
- ASMJIT_INLINE_NODEBUG constexpr BaseRegList(const BaseRegList& other, RegMask regMask) noexcept
- : Operand(Globals::Init, other._signature, regMask, 0, 0) {}
-
- //! Creates a register initialized to the given `signature` and `id`.
- ASMJIT_INLINE_NODEBUG constexpr BaseRegList(const Signature& signature, RegMask regMask) noexcept
- : Operand(Globals::Init, signature, regMask, 0, 0) {}
-
- ASMJIT_INLINE_NODEBUG explicit BaseRegList(Globals::NoInit_) noexcept
- : Operand(Globals::NoInit) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG BaseRegList& operator=(const BaseRegList& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the register-list is valid, which means it has a type and at least a single register in the list.
- ASMJIT_INLINE_NODEBUG constexpr bool isValid() const noexcept { return bool(unsigned(_signature != 0u) & unsigned(_baseId != 0u)); }
-
- //! Tests whether the register type matches `type` - same as `isReg(type)`, provided for convenience.
- ASMJIT_INLINE_NODEBUG constexpr bool isType(RegType type) const noexcept { return _signature.subset(Signature::kRegTypeMask) == Signature::fromRegType(type); }
- //! Tests whether the register group matches `group`.
- ASMJIT_INLINE_NODEBUG constexpr bool isGroup(RegGroup group) const noexcept { return _signature.subset(Signature::kRegGroupMask) == Signature::fromRegGroup(group); }
-
- //! Tests whether the register is a general purpose register (any size).
- ASMJIT_INLINE_NODEBUG constexpr bool isGp() const noexcept { return isGroup(RegGroup::kGp); }
- //! Tests whether the register is a vector register.
- ASMJIT_INLINE_NODEBUG constexpr bool isVec() const noexcept { return isGroup(RegGroup::kVec); }
-
- //! Returns the register type.
- ASMJIT_INLINE_NODEBUG constexpr RegType type() const noexcept { return _signature.regType(); }
- //! Returns the register group.
- ASMJIT_INLINE_NODEBUG constexpr RegGroup group() const noexcept { return _signature.regGroup(); }
- //! Returns the size of a single register in this register-list or 0 if unspecified.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField<Signature::kSizeMask>(); }
-
- //! Returns the register list as a mask, where each bit represents one physical register.
- ASMJIT_INLINE_NODEBUG constexpr RegMask list() const noexcept { return _baseId; }
- //! Sets the register list to `mask`.
- ASMJIT_INLINE_NODEBUG void setList(RegMask mask) noexcept { _baseId = mask; }
- //! Remoes all registers from the register-list by making the underlying register-mask zero.
- ASMJIT_INLINE_NODEBUG void resetList() noexcept { _baseId = 0; }
-
- //! Adds registers passed by a register `mask` to the register-list.
- ASMJIT_INLINE_NODEBUG void addList(RegMask mask) noexcept { _baseId |= mask; }
- //! Removes registers passed by a register `mask` to the register-list.
- ASMJIT_INLINE_NODEBUG void clearList(RegMask mask) noexcept { _baseId &= ~mask; }
- //! Uses AND operator to combine the current register-list with other register `mask`.
- ASMJIT_INLINE_NODEBUG void andList(RegMask mask) noexcept { _baseId &= mask; }
- //! Uses XOR operator to combine the current register-list with other register `mask`.
- ASMJIT_INLINE_NODEBUG void xorList(RegMask mask) noexcept { _baseId ^= mask; }
-
- //! Checks whether a physical register `physId` is in the register-list.
- ASMJIT_INLINE_NODEBUG bool hasReg(uint32_t physId) const noexcept { return physId < 32u ? (_baseId & (1u << physId)) != 0 : false; }
- //! Adds a physical register `physId` to the register-list.
- ASMJIT_INLINE_NODEBUG void addReg(uint32_t physId) noexcept { addList(1u << physId); }
- //! Removes a physical register `physId` from the register-list.
- ASMJIT_INLINE_NODEBUG void clearReg(uint32_t physId) noexcept { clearList(1u << physId); }
-
- //! Clones the register-list operand.
- ASMJIT_INLINE_NODEBUG constexpr BaseRegList clone() const noexcept { return BaseRegList(*this); }
-
- //! Casts this register to `RegT` by also changing its signature.
- //!
- //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors.
- template<typename RegListT>
- ASMJIT_INLINE_NODEBUG constexpr RegListT cloneAs() const noexcept { return RegListT(Signature(RegListT::kSignature), list()); }
-
- //! Casts this register to `other` by also changing its signature.
- //!
- //! \note Improper use of `cloneAs()` can lead to hard-to-debug errors.
- template<typename RegListT>
- ASMJIT_INLINE_NODEBUG constexpr RegListT cloneAs(const RegListT& other) const noexcept { return RegListT(other.signature(), list()); }
-
- //! \}
-};
-
-template<typename RegT>
-class RegListT : public BaseRegList {
-public:
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a dummy register operand.
- ASMJIT_INLINE_NODEBUG constexpr RegListT() noexcept
- : BaseRegList() {}
-
- //! Creates a new register operand which is the same as `other` .
- ASMJIT_INLINE_NODEBUG constexpr RegListT(const RegListT& other) noexcept
- : BaseRegList(other) {}
-
- //! Creates a new register operand compatible with `other`, but with a different `id`.
- ASMJIT_INLINE_NODEBUG constexpr RegListT(const RegListT& other, RegMask regMask) noexcept
- : BaseRegList(other, regMask) {}
-
- //! Creates a register initialized to the given `signature` and `id`.
- ASMJIT_INLINE_NODEBUG constexpr RegListT(const Signature& signature, RegMask regMask) noexcept
- : BaseRegList(signature, regMask) {}
-
- //! Creates a register initialized to the given `signature` and `regs`.
- ASMJIT_INLINE_NODEBUG RegListT(const Signature& signature, std::initializer_list<RegT> regs) noexcept
- : BaseRegList(signature, RegMask(0)) { addRegs(regs); }
-
- ASMJIT_INLINE_NODEBUG explicit RegListT(Globals::NoInit_) noexcept
- : BaseRegList(Globals::NoInit) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG RegListT& operator=(const RegListT& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- using BaseRegList::addList;
- using BaseRegList::clearList;
- using BaseRegList::andList;
- using BaseRegList::xorList;
-
- //! Adds registers to this register-list as provided by `other` register-list.
- ASMJIT_INLINE_NODEBUG void addList(const RegListT<RegT>& other) noexcept { addList(other.list()); }
- //! Removes registers contained in `other` register-list.
- ASMJIT_INLINE_NODEBUG void clearList(const RegListT<RegT>& other) noexcept { clearList(other.list()); }
- //! Uses AND operator to combine the current register-list with `other` register-list.
- ASMJIT_INLINE_NODEBUG void andList(const RegListT<RegT>& other) noexcept { andList(other.list()); }
- //! Uses XOR operator to combine the current register-list with `other` register-list.
- ASMJIT_INLINE_NODEBUG void xorList(const RegListT<RegT>& other) noexcept { xorList(other.list()); }
-
- using BaseRegList::addReg;
- using BaseRegList::clearReg;
-
- ASMJIT_INLINE_NODEBUG void addReg(const RegT& reg) noexcept {
- if (reg.id() < 32u)
- addReg(reg.id());
- }
-
- ASMJIT_INLINE_NODEBUG void addRegs(std::initializer_list<RegT> regs) noexcept {
- for (const RegT& reg : regs)
- addReg(reg);
- }
-
- ASMJIT_INLINE_NODEBUG void clearReg(const RegT& reg) noexcept {
- if (reg.id() < 32u)
- clearReg(reg.id());
- }
-
- ASMJIT_INLINE_NODEBUG void clearRegs(std::initializer_list<RegT> regs) noexcept {
- for (const RegT& reg : regs)
- clearReg(reg);
- }
-
- //! \}
-};
-
-//! Base class for all memory operands.
-//!
-//! The data is split into the following parts:
-//!
-//! - BASE - Base register or label - requires 36 bits total. 4 bits are used to encode the type of the BASE operand
-//! (label vs. register type) and the remaining 32 bits define the BASE id, which can be a physical or virtual
-//! register index. If BASE type is zero, which is never used as a register type and label doesn't use it as well
-//! then BASE field contains a high DWORD of a possible 64-bit absolute address, which is possible on X64.
-//!
-//! - INDEX - Index register (or theoretically Label, which doesn't make sense). Encoding is similar to BASE - it
-//! also requires 36 bits and splits the encoding to INDEX type (4 bits defining the register type) and 32-bit id.
-//!
-//! - OFFSET - A relative offset of the address. Basically if BASE is specified the relative displacement adjusts
-//! BASE and an optional INDEX. if BASE is not specified then the OFFSET should be considered as ABSOLUTE address
-//! (at least on X86). In that case its low 32 bits are stored in DISPLACEMENT field and the remaining high 32
-//! bits are stored in BASE.
-//!
-//! - OTHER - There is rest 8 bits that can be used for whatever purpose. For example \ref x86::Mem operand uses
-//! these bits to store segment override prefix and index shift (or scale).
-class BaseMem : public Operand {
-public:
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a default `BaseMem` operand, that points to [0].
- ASMJIT_INLINE_NODEBUG constexpr BaseMem() noexcept
- : Operand(Globals::Init, Signature::fromOpType(OperandType::kMem), 0, 0, 0) {}
-
- //! Creates a `BaseMem` operand that is a clone of `other`.
- ASMJIT_INLINE_NODEBUG constexpr BaseMem(const BaseMem& other) noexcept
- : Operand(other) {}
-
- //! Creates a `BaseMem` operand from `baseReg` and `offset`.
- //!
- //! \note This is an architecture independent constructor that can be used to create an architecture
- //! independent memory operand to be used in portable code that can handle multiple architectures.
- ASMJIT_INLINE_NODEBUG constexpr explicit BaseMem(const BaseReg& baseReg, int32_t offset = 0) noexcept
- : Operand(Globals::Init,
- Signature::fromOpType(OperandType::kMem) | Signature::fromMemBaseType(baseReg.type()),
- baseReg.id(),
- 0,
- uint32_t(offset)) {}
-
- //! \cond INTERNAL
- //! Creates a `BaseMem` operand from 4 integers as used by `Operand_` struct.
- ASMJIT_INLINE_NODEBUG constexpr BaseMem(const OperandSignature& u0, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept
- : Operand(Globals::Init, u0, baseId, indexId, uint32_t(offset)) {}
- //! \endcond
-
- //! Creates a completely uninitialized `BaseMem` operand.
- ASMJIT_INLINE_NODEBUG explicit BaseMem(Globals::NoInit_) noexcept
- : Operand(Globals::NoInit) {}
-
- //! Resets the memory operand - after the reset the memory points to [0].
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _signature = Signature::fromOpType(OperandType::kMem);
- _baseId = 0;
- _data[0] = 0;
- _data[1] = 0;
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG BaseMem& operator=(const BaseMem& other) noexcept { copyFrom(other); return *this; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Clones the memory operand.
- ASMJIT_INLINE_NODEBUG constexpr BaseMem clone() const noexcept { return BaseMem(*this); }
-
- //! Creates a new copy of this memory operand adjusted by `off`.
- ASMJIT_INLINE_NODEBUG BaseMem cloneAdjusted(int64_t off) const noexcept {
- BaseMem result(*this);
- result.addOffset(off);
- return result;
- }
-
- //! Tests whether this memory operand is a register home (only used by \ref asmjit_compiler)
- ASMJIT_INLINE_NODEBUG constexpr bool isRegHome() const noexcept { return _signature.hasField<Signature::kMemRegHomeFlag>(); }
- //! Mark this memory operand as register home (only used by \ref asmjit_compiler).
- ASMJIT_INLINE_NODEBUG void setRegHome() noexcept { _signature |= Signature::kMemRegHomeFlag; }
- //! Marks this operand to not be a register home (only used by \ref asmjit_compiler).
- ASMJIT_INLINE_NODEBUG void clearRegHome() noexcept { _signature &= ~Signature::kMemRegHomeFlag; }
-
- //! Tests whether the memory operand has a BASE register or label specified.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBase() const noexcept {
- return (_signature & Signature::kMemBaseTypeMask) != 0;
- }
-
- //! Tests whether the memory operand has an INDEX register specified.
- ASMJIT_INLINE_NODEBUG constexpr bool hasIndex() const noexcept {
- return (_signature & Signature::kMemIndexTypeMask) != 0;
- }
-
- //! Tests whether the memory operand has BASE or INDEX register.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseOrIndex() const noexcept {
- return (_signature & Signature::kMemBaseIndexMask) != 0;
- }
-
- //! Tests whether the memory operand has BASE and INDEX register.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseAndIndex() const noexcept {
- return (_signature & Signature::kMemBaseTypeMask) != 0 && (_signature & Signature::kMemIndexTypeMask) != 0;
- }
-
- //! Tests whether the BASE operand is a label.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseLabel() const noexcept {
- return _signature.subset(Signature::kMemBaseTypeMask) == Signature::fromMemBaseType(RegType::kLabelTag);
- }
-
- //! Tests whether the BASE operand is a register (registers start after `RegType::kLabelTag`).
- ASMJIT_INLINE_NODEBUG constexpr bool hasBaseReg() const noexcept {
- return _signature.subset(Signature::kMemBaseTypeMask).bits() > Signature::fromMemBaseType(RegType::kLabelTag).bits();
- }
-
- //! Tests whether the INDEX operand is a register (registers start after `RegType::kLabelTag`).
- ASMJIT_INLINE_NODEBUG constexpr bool hasIndexReg() const noexcept {
- return _signature.subset(Signature::kMemIndexTypeMask).bits() > Signature::fromMemIndexType(RegType::kLabelTag).bits();
- }
-
- //! Returns the type of the BASE register (0 if this memory operand doesn't use the BASE register).
- //!
- //! \note If the returned type is one (a value never associated to a register type) the BASE is not register, but it
- //! is a label. One equals to `kLabelTag`. You should always check `hasBaseLabel()` before using `baseId()` result.
- ASMJIT_INLINE_NODEBUG constexpr RegType baseType() const noexcept { return _signature.memBaseType(); }
-
- //! Returns the type of an INDEX register (0 if this memory operand doesn't
- //! use the INDEX register).
- ASMJIT_INLINE_NODEBUG constexpr RegType indexType() const noexcept { return _signature.memIndexType(); }
-
- //! This is used internally for BASE+INDEX validation.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t baseAndIndexTypes() const noexcept { return _signature.getField<Signature::kMemBaseIndexMask>(); }
-
- //! Returns both BASE (4:0 bits) and INDEX (9:5 bits) types combined into a single value.
- //!
- //! \remarks Returns id of the BASE register or label (if the BASE was specified as label).
- ASMJIT_INLINE_NODEBUG constexpr uint32_t baseId() const noexcept { return _baseId; }
-
- //! Returns the id of the INDEX register.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t indexId() const noexcept { return _data[kDataMemIndexId]; }
-
- //! Sets the id of the BASE register (without modifying its type).
- ASMJIT_INLINE_NODEBUG void setBaseId(uint32_t id) noexcept { _baseId = id; }
- //! Sets the register type of the BASE register (without modifying its id).
- ASMJIT_INLINE_NODEBUG void setBaseType(RegType regType) noexcept { _signature.setMemBaseType(regType); }
-
- //! Sets the id of the INDEX register (without modifying its type).
- ASMJIT_INLINE_NODEBUG void setIndexId(uint32_t id) noexcept { _data[kDataMemIndexId] = id; }
- //! Sets the register type of the INDEX register (without modifying its id).
- ASMJIT_INLINE_NODEBUG void setIndexType(RegType regType) noexcept { _signature.setMemIndexType(regType); }
-
- //! Sets the base register to type and id of the given `base` operand.
- ASMJIT_INLINE_NODEBUG void setBase(const BaseReg& base) noexcept { return _setBase(base.type(), base.id()); }
- //! Sets the index register to type and id of the given `index` operand.
- ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index) noexcept { return _setIndex(index.type(), index.id()); }
-
- //! \cond INTERNAL
- ASMJIT_INLINE_NODEBUG void _setBase(RegType type, uint32_t id) noexcept {
- _signature.setField<Signature::kMemBaseTypeMask>(uint32_t(type));
- _baseId = id;
- }
-
- ASMJIT_INLINE_NODEBUG void _setIndex(RegType type, uint32_t id) noexcept {
- _signature.setField<Signature::kMemIndexTypeMask>(uint32_t(type));
- _data[kDataMemIndexId] = id;
- }
- //! \endcond
-
- //! Resets the memory operand's BASE register or label.
- ASMJIT_INLINE_NODEBUG void resetBase() noexcept { _setBase(RegType::kNone, 0); }
- //! Resets the memory operand's INDEX register.
- ASMJIT_INLINE_NODEBUG void resetIndex() noexcept { _setIndex(RegType::kNone, 0); }
-
- //! Sets the memory operand size (in bytes).
- ASMJIT_INLINE_NODEBUG void setSize(uint32_t size) noexcept { _signature.setField<Signature::kSizeMask>(size); }
-
- //! Tests whether the memory operand has a 64-bit offset or absolute address.
- //!
- //! If this is true then `hasBase()` must always report false.
- ASMJIT_INLINE_NODEBUG constexpr bool isOffset64Bit() const noexcept { return baseType() == RegType::kNone; }
-
- //! Tests whether the memory operand has a non-zero offset or absolute address.
- ASMJIT_INLINE_NODEBUG constexpr bool hasOffset() const noexcept {
- return (_data[kDataMemOffsetLo] | uint32_t(_baseId & Support::bitMaskFromBool<uint32_t>(isOffset64Bit()))) != 0;
- }
-
- //! Returns either relative offset or absolute address as 64-bit integer.
- ASMJIT_INLINE_NODEBUG constexpr int64_t offset() const noexcept {
- return isOffset64Bit() ? int64_t(uint64_t(_data[kDataMemOffsetLo]) | (uint64_t(_baseId) << 32))
- : int64_t(int32_t(_data[kDataMemOffsetLo])); // Sign extend 32-bit offset.
- }
-
- //! Returns a 32-bit low part of a 64-bit offset or absolute address.
- ASMJIT_INLINE_NODEBUG constexpr int32_t offsetLo32() const noexcept { return int32_t(_data[kDataMemOffsetLo]); }
- //! Returns a 32-but high part of a 64-bit offset or absolute address.
- //!
- //! \note This function is UNSAFE and returns garbage if `isOffset64Bit()`
- //! returns false. Never use it blindly without checking it first.
- ASMJIT_INLINE_NODEBUG constexpr int32_t offsetHi32() const noexcept { return int32_t(_baseId); }
-
- //! Sets a 64-bit offset or an absolute address to `offset`.
- //!
- //! \note This functions attempts to set both high and low parts of a 64-bit offset, however, if the operand has
- //! a BASE register it will store only the low 32 bits of the offset / address as there is no way to store both
- //! BASE and 64-bit offset, and there is currently no architecture that has such capability targeted by AsmJit.
- inline void setOffset(int64_t offset) noexcept {
- uint32_t lo = uint32_t(uint64_t(offset) & 0xFFFFFFFFu);
- uint32_t hi = uint32_t(uint64_t(offset) >> 32);
- uint32_t hiMsk = Support::bitMaskFromBool<uint32_t>(isOffset64Bit());
-
- _data[kDataMemOffsetLo] = lo;
- _baseId = (hi & hiMsk) | (_baseId & ~hiMsk);
- }
- //! Sets a low 32-bit offset to `offset` (don't use without knowing how BaseMem works).
- inline void setOffsetLo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] = uint32_t(offset); }
-
- //! Adjusts the offset by `offset`.
- //!
- //! \note This is a fast function that doesn't use the HI 32-bits of a 64-bit offset. Use it only if you know that
- //! there is a BASE register and the offset is only 32 bits anyway.
-
- //! Adjusts the memory operand offset by a `offset`.
- inline void addOffset(int64_t offset) noexcept {
- if (isOffset64Bit()) {
- int64_t result = offset + int64_t(uint64_t(_data[kDataMemOffsetLo]) | (uint64_t(_baseId) << 32));
- _data[kDataMemOffsetLo] = uint32_t(uint64_t(result) & 0xFFFFFFFFu);
- _baseId = uint32_t(uint64_t(result) >> 32);
- }
- else {
- _data[kDataMemOffsetLo] += uint32_t(uint64_t(offset) & 0xFFFFFFFFu);
- }
- }
-
- //! Adds `offset` to a low 32-bit offset part (don't use without knowing how BaseMem works).
- ASMJIT_INLINE_NODEBUG void addOffsetLo32(int32_t offset) noexcept { _data[kDataMemOffsetLo] += uint32_t(offset); }
-
- //! Resets the memory offset to zero.
- ASMJIT_INLINE_NODEBUG void resetOffset() noexcept { setOffset(0); }
-
- //! Resets the lo part of the memory offset to zero (don't use without knowing how BaseMem works).
- ASMJIT_INLINE_NODEBUG void resetOffsetLo32() noexcept { setOffsetLo32(0); }
-
- //! \}
-};
-
-//! Type of the an immediate value.
-enum class ImmType : uint32_t {
- //! Immediate is integer.
- kInt = 0,
- //! Immediate is a floating point stored as double-precision.
- kDouble = 1
-};
-
-//! Immediate operands are encoded with instruction data.
-class Imm : public Operand {
-public:
- //! \cond INTERNAL
- template<typename T>
- struct IsConstexprConstructibleAsImmType
- : public std::integral_constant<bool, std::is_enum<T>::value ||
- std::is_pointer<T>::value ||
- std::is_integral<T>::value ||
- std::is_function<T>::value> {};
-
- template<typename T>
- struct IsConvertibleToImmType
- : public std::integral_constant<bool, IsConstexprConstructibleAsImmType<T>::value ||
- std::is_floating_point<T>::value> {};
- //! \endcond
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new immediate value (initial value is 0).
- ASMJIT_INLINE_NODEBUG constexpr Imm() noexcept
- : Operand(Globals::Init, Signature::fromOpType(OperandType::kImm), 0, 0, 0) {}
-
- //! Creates a new immediate value from `other`.
- ASMJIT_INLINE_NODEBUG constexpr Imm(const Imm& other) noexcept
- : Operand(other) {}
-
- //! Creates a new immediate value from ARM/AArch64 specific `shift`.
- ASMJIT_INLINE_NODEBUG constexpr Imm(const arm::Shift& shift) noexcept
- : Operand(Globals::Init,
- Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(uint32_t(shift.op())),
- 0,
- Support::unpackU32At0(shift.value()),
- Support::unpackU32At1(shift.value())) {}
-
- //! Creates a new signed immediate value, assigning the value to `val` and an architecture-specific predicate
- //! to `predicate`.
- //!
- //! \note Predicate is currently only used by ARM architectures.
- template<typename T, typename = typename std::enable_if<IsConstexprConstructibleAsImmType<typename std::decay<T>::type>::value>::type>
- ASMJIT_INLINE_NODEBUG constexpr Imm(const T& val, const uint32_t predicate = 0) noexcept
- : Operand(Globals::Init,
- Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate),
- 0,
- Support::unpackU32At0(int64_t(val)),
- Support::unpackU32At1(int64_t(val))) {}
-
- ASMJIT_INLINE_NODEBUG Imm(const float& val, const uint32_t predicate = 0) noexcept
- : Operand(Globals::Init,
- Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate),
- 0,
- 0,
- 0) { setValue(val); }
-
- ASMJIT_INLINE_NODEBUG Imm(const double& val, const uint32_t predicate = 0) noexcept
- : Operand(Globals::Init,
- Signature::fromOpType(OperandType::kImm) | Signature::fromPredicate(predicate),
- 0,
- 0,
- 0) { setValue(val); }
-
- ASMJIT_INLINE_NODEBUG explicit Imm(Globals::NoInit_) noexcept
- : Operand(Globals::NoInit) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- //! Assigns the value of the `other` operand to this immediate.
- ASMJIT_INLINE_NODEBUG Imm& operator=(const Imm& other) noexcept { copyFrom(other); return *this; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns immediate type.
- ASMJIT_INLINE_NODEBUG constexpr ImmType type() const noexcept { return (ImmType)_signature.getField<Signature::kImmTypeMask>(); }
- //! Sets the immediate type to `type`.
- ASMJIT_INLINE_NODEBUG void setType(ImmType type) noexcept { _signature.setField<Signature::kImmTypeMask>(uint32_t(type)); }
- //! Resets immediate type to \ref ImmType::kInt.
- ASMJIT_INLINE_NODEBUG void resetType() noexcept { setType(ImmType::kInt); }
-
- //! Returns operation predicate of the immediate.
- //!
- //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
- //! of the immediate.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t predicate() const noexcept { return _signature.getField<Signature::kPredicateMask>(); }
-
- //! Sets operation predicate of the immediate to `predicate`.
- //!
- //! The meaning depends on architecture, for example on ARM hardware this describes \ref arm::ShiftOp
- //! of the immediate.
- ASMJIT_INLINE_NODEBUG void setPredicate(uint32_t predicate) noexcept { _signature.setField<Signature::kPredicateMask>(predicate); }
-
- //! Resets the shift operation type of the immediate to the default value (no operation).
- ASMJIT_INLINE_NODEBUG void resetPredicate() noexcept { _signature.setField<Signature::kPredicateMask>(0); }
-
- //! Returns the immediate value as `int64_t`, which is the internal format Imm uses.
- ASMJIT_INLINE_NODEBUG constexpr int64_t value() const noexcept {
- return int64_t((uint64_t(_data[kDataImmValueHi]) << 32) | _data[kDataImmValueLo]);
- }
-
- //! Tests whether this immediate value is integer of any size.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t isInt() const noexcept { return type() == ImmType::kInt; }
- //! Tests whether this immediate value is a double precision floating point value.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t isDouble() const noexcept { return type() == ImmType::kDouble; }
-
- //! Tests whether the immediate can be casted to 8-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr bool isInt8() const noexcept { return type() == ImmType::kInt && Support::isInt8(value()); }
- //! Tests whether the immediate can be casted to 8-bit unsigned integer.
- ASMJIT_INLINE_NODEBUG constexpr bool isUInt8() const noexcept { return type() == ImmType::kInt && Support::isUInt8(value()); }
- //! Tests whether the immediate can be casted to 16-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr bool isInt16() const noexcept { return type() == ImmType::kInt && Support::isInt16(value()); }
- //! Tests whether the immediate can be casted to 16-bit unsigned integer.
- ASMJIT_INLINE_NODEBUG constexpr bool isUInt16() const noexcept { return type() == ImmType::kInt && Support::isUInt16(value()); }
- //! Tests whether the immediate can be casted to 32-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr bool isInt32() const noexcept { return type() == ImmType::kInt && Support::isInt32(value()); }
- //! Tests whether the immediate can be casted to 32-bit unsigned integer.
- ASMJIT_INLINE_NODEBUG constexpr bool isUInt32() const noexcept { return type() == ImmType::kInt && _data[kDataImmValueHi] == 0; }
-
- //! Returns the immediate value casted to `T`.
- //!
- //! The value is masked before it's casted to `T` so the returned value is simply the representation of `T`
- //! considering the original value's lowest bits.
- template<typename T>
- ASMJIT_INLINE_NODEBUG T valueAs() const noexcept { return Support::immediateToT<T>(value()); }
-
- //! Returns low 32-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr int32_t int32Lo() const noexcept { return int32_t(_data[kDataImmValueLo]); }
- //! Returns high 32-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr int32_t int32Hi() const noexcept { return int32_t(_data[kDataImmValueHi]); }
- //! Returns low 32-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t uint32Lo() const noexcept { return _data[kDataImmValueLo]; }
- //! Returns high 32-bit signed integer.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t uint32Hi() const noexcept { return _data[kDataImmValueHi]; }
-
- //! Sets immediate value to `val`, the value is casted to a signed 64-bit integer.
- template<typename T>
- ASMJIT_INLINE_NODEBUG void setValue(const T& val) noexcept {
- _setValueInternal(Support::immediateFromT(val), std::is_floating_point<T>::value ? ImmType::kDouble : ImmType::kInt);
- }
-
- ASMJIT_INLINE_NODEBUG void _setValueInternal(int64_t val, ImmType type) noexcept {
- setType(type);
- _data[kDataImmValueHi] = uint32_t(uint64_t(val) >> 32);
- _data[kDataImmValueLo] = uint32_t(uint64_t(val) & 0xFFFFFFFFu);
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Clones the immediate operand.
- ASMJIT_INLINE_NODEBUG constexpr Imm clone() const noexcept { return Imm(*this); }
-
- ASMJIT_INLINE_NODEBUG void signExtend8Bits() noexcept { setValue(int64_t(valueAs<int8_t>())); }
- ASMJIT_INLINE_NODEBUG void signExtend16Bits() noexcept { setValue(int64_t(valueAs<int16_t>())); }
- ASMJIT_INLINE_NODEBUG void signExtend32Bits() noexcept { setValue(int64_t(valueAs<int32_t>())); }
-
- ASMJIT_INLINE_NODEBUG void zeroExtend8Bits() noexcept { setValue(valueAs<uint8_t>()); }
- ASMJIT_INLINE_NODEBUG void zeroExtend16Bits() noexcept { setValue(valueAs<uint16_t>()); }
- ASMJIT_INLINE_NODEBUG void zeroExtend32Bits() noexcept { _data[kDataImmValueHi] = 0u; }
-
- //! \}
-};
-
-//! Creates a new immediate operand.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr Imm imm(const T& val) noexcept { return Imm(val); }
-
-//! \}
-
-namespace Globals {
- //! \ingroup asmjit_assembler
- //!
- //! A default-constructed operand of `Operand_::kOpNone` type.
- static constexpr const Operand none;
-}
-
-//! \cond INTERNAL
-namespace Support {
-
-template<typename T, bool kIsImm>
-struct ForwardOpImpl {
- static ASMJIT_INLINE_NODEBUG const T& forward(const T& value) noexcept { return value; }
-};
-
-template<typename T>
-struct ForwardOpImpl<T, true> {
- static ASMJIT_INLINE_NODEBUG Imm forward(const T& value) noexcept { return Imm(value); }
-};
-
-//! Either forwards operand T or returns a new operand that wraps it if T is a type convertible to operand.
-//! At the moment this is only used to convert integers, floats, and enumarations to \ref Imm operands.
-template<typename T>
-struct ForwardOp : public ForwardOpImpl<T, Imm::IsConvertibleToImmType<typename std::decay<T>::type>::value> {};
-
-} // {Support}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/osutils.cpp b/3rdparty/asmjit/src/asmjit/core/osutils.cpp
deleted file mode 100644
index 2d390697f89..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/osutils.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/osutils_p.h"
-#include "../core/support.h"
-
-#if !defined(_WIN32)
- #include <fcntl.h>
- #include <unistd.h>
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-#if !defined(_WIN32)
-Error OSUtils::readFile(const char* name, String& dst, size_t maxSize) noexcept {
- char* buffer = dst.prepare(String::ModifyOp::kAssign, maxSize);
- if (ASMJIT_UNLIKELY(!buffer))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- int fd = ASMJIT_FILE64_API(::open)(name, O_RDONLY);
- if (fd < 0) {
- dst.clear();
- return DebugUtils::errored(kErrorFailedToOpenFile);
- }
-
- intptr_t len = ::read(fd, buffer, maxSize);
- if (len >= 0) {
- buffer[len] = '\0';
- dst._setSize(size_t(len));
- }
-
- ::close(fd);
- return kErrorOk;
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/raassignment_p.h b/3rdparty/asmjit/src/asmjit/core/raassignment_p.h
deleted file mode 100644
index 0865ece7548..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/raassignment_p.h
+++ /dev/null
@@ -1,418 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
-#define ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/radefs_p.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_ra
-//! \{
-
-//! Holds the current register assignment.
-//!
-//! Has two purposes:
-//!
-//! 1. Holds register assignment of a local register allocator (see \ref RALocalAllocator).
-//! 2. Holds register assignment of the entry of basic blocks (see \ref RABlock).
-class RAAssignment {
-public:
- ASMJIT_NONCOPYABLE(RAAssignment)
-
- enum Ids : uint32_t {
- kPhysNone = 0xFF,
- kWorkNone = RAWorkReg::kIdNone
- };
-
- enum DirtyBit : uint32_t {
- kClean = 0,
- kDirty = 1
- };
-
- struct Layout {
- //! Index of architecture registers per group.
- RARegIndex physIndex;
- //! Count of architecture registers per group.
- RARegCount physCount;
- //! Count of physical registers of all groups.
- uint32_t physTotal;
- //! Count of work registers.
- uint32_t workCount;
- //! WorkRegs data (vector).
- const RAWorkRegs* workRegs;
-
- inline void reset() noexcept {
- physIndex.reset();
- physCount.reset();
- physTotal = 0;
- workCount = 0;
- workRegs = nullptr;
- }
- };
-
- struct PhysToWorkMap {
- //! Assigned registers (each bit represents one physical reg).
- RARegMask assigned;
- //! Dirty registers (spill slot out of sync or no spill slot).
- RARegMask dirty;
- //! PhysReg to WorkReg mapping.
- uint32_t workIds[1 /* ... */];
-
- static ASMJIT_INLINE_NODEBUG size_t sizeOf(size_t count) noexcept {
- return sizeof(PhysToWorkMap) - sizeof(uint32_t) + count * sizeof(uint32_t);
- }
-
- inline void reset(size_t count) noexcept {
- assigned.reset();
- dirty.reset();
-
- for (size_t i = 0; i < count; i++)
- workIds[i] = kWorkNone;
- }
-
- inline void copyFrom(const PhysToWorkMap* other, size_t count) noexcept {
- size_t size = sizeOf(count);
- memcpy(this, other, size);
- }
-
- inline void unassign(RegGroup group, uint32_t physId, uint32_t indexInWorkIds) noexcept {
- assigned.clear(group, Support::bitMask(physId));
- dirty.clear(group, Support::bitMask(physId));
- workIds[indexInWorkIds] = kWorkNone;
- }
- };
-
- struct WorkToPhysMap {
- //! WorkReg to PhysReg mapping
- uint8_t physIds[1 /* ... */];
-
- static inline size_t sizeOf(size_t count) noexcept {
- return size_t(count) * sizeof(uint8_t);
- }
-
- inline void reset(size_t count) noexcept {
- for (size_t i = 0; i < count; i++)
- physIds[i] = kPhysNone;
- }
-
- inline void copyFrom(const WorkToPhysMap* other, size_t count) noexcept {
- size_t size = sizeOf(count);
- if (ASMJIT_LIKELY(size))
- memcpy(this, other, size);
- }
- };
-
- //! \name Members
- //! \{
-
- //! Physical registers layout.
- Layout _layout;
- //! WorkReg to PhysReg mapping.
- WorkToPhysMap* _workToPhysMap;
- //! PhysReg to WorkReg mapping and assigned/dirty bits.
- PhysToWorkMap* _physToWorkMap;
- //! Optimization to translate PhysRegs to WorkRegs faster.
- Support::Array<uint32_t*, Globals::kNumVirtGroups> _physToWorkIds;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- inline RAAssignment() noexcept {
- _layout.reset();
- resetMaps();
- }
-
- ASMJIT_FORCE_INLINE void initLayout(const RARegCount& physCount, const RAWorkRegs& workRegs) noexcept {
- // Layout must be initialized before data.
- ASMJIT_ASSERT(_physToWorkMap == nullptr);
- ASMJIT_ASSERT(_workToPhysMap == nullptr);
-
- _layout.physIndex.buildIndexes(physCount);
- _layout.physCount = physCount;
- _layout.physTotal = uint32_t(_layout.physIndex[RegGroup::kMaxVirt]) +
- uint32_t(_layout.physCount[RegGroup::kMaxVirt]) ;
- _layout.workCount = workRegs.size();
- _layout.workRegs = &workRegs;
- }
-
- ASMJIT_FORCE_INLINE void initMaps(PhysToWorkMap* physToWorkMap, WorkToPhysMap* workToPhysMap) noexcept {
- _physToWorkMap = physToWorkMap;
- _workToPhysMap = workToPhysMap;
- for (RegGroup group : RegGroupVirtValues{})
- _physToWorkIds[group] = physToWorkMap->workIds + _layout.physIndex.get(group);
- }
-
- ASMJIT_FORCE_INLINE void resetMaps() noexcept {
- _physToWorkMap = nullptr;
- _workToPhysMap = nullptr;
- _physToWorkIds.fill(nullptr);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; }
- ASMJIT_INLINE_NODEBUG WorkToPhysMap* workToPhysMap() const noexcept { return _workToPhysMap; }
-
- ASMJIT_INLINE_NODEBUG RARegMask& assigned() noexcept { return _physToWorkMap->assigned; }
- ASMJIT_INLINE_NODEBUG const RARegMask& assigned() const noexcept { return _physToWorkMap->assigned; }
- ASMJIT_INLINE_NODEBUG uint32_t assigned(RegGroup group) const noexcept { return _physToWorkMap->assigned[group]; }
-
- ASMJIT_INLINE_NODEBUG RARegMask& dirty() noexcept { return _physToWorkMap->dirty; }
- ASMJIT_INLINE_NODEBUG const RARegMask& dirty() const noexcept { return _physToWorkMap->dirty; }
- ASMJIT_INLINE_NODEBUG RegMask dirty(RegGroup group) const noexcept { return _physToWorkMap->dirty[group]; }
-
- inline uint32_t workToPhysId(RegGroup group, uint32_t workId) const noexcept {
- DebugUtils::unused(group);
- ASMJIT_ASSERT(workId != kWorkNone);
- ASMJIT_ASSERT(workId < _layout.workCount);
- return _workToPhysMap->physIds[workId];
- }
-
- inline uint32_t physToWorkId(RegGroup group, uint32_t physId) const noexcept {
- ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
- return _physToWorkIds[group][physId];
- }
-
- inline bool isPhysAssigned(RegGroup group, uint32_t physId) const noexcept {
- ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
- return Support::bitTest(_physToWorkMap->assigned[group], physId);
- }
-
- inline bool isPhysDirty(RegGroup group, uint32_t physId) const noexcept {
- ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
- return Support::bitTest(_physToWorkMap->dirty[group], physId);
- }
-
- //! \}
-
- //! \name Assignment
- //!
- //! These are low-level allocation helpers that are used to update the current mappings between physical and
- //! virt/work registers and also to update masks that represent allocated and dirty registers. These functions
- //! don't emit any code; they are only used to update and keep all mappings in sync.
- //!
- //! \{
-
- //! Assign [VirtReg/WorkReg] to a physical register.
- inline void assign(RegGroup group, uint32_t workId, uint32_t physId, bool dirty) noexcept {
- ASMJIT_ASSERT(workToPhysId(group, workId) == kPhysNone);
- ASMJIT_ASSERT(physToWorkId(group, physId) == kWorkNone);
- ASMJIT_ASSERT(!isPhysAssigned(group, physId));
- ASMJIT_ASSERT(!isPhysDirty(group, physId));
-
- _workToPhysMap->physIds[workId] = uint8_t(physId);
- _physToWorkIds[group][physId] = workId;
-
- RegMask regMask = Support::bitMask(physId);
- _physToWorkMap->assigned[group] |= regMask;
- _physToWorkMap->dirty[group] |= regMask & Support::bitMaskFromBool<RegMask>(dirty);
-
- verify();
- }
-
- //! Reassign [VirtReg/WorkReg] to `dstPhysId` from `srcPhysId`.
- inline void reassign(RegGroup group, uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
- ASMJIT_ASSERT(dstPhysId != srcPhysId);
- ASMJIT_ASSERT(workToPhysId(group, workId) == srcPhysId);
- ASMJIT_ASSERT(physToWorkId(group, srcPhysId) == workId);
- ASMJIT_ASSERT(isPhysAssigned(group, srcPhysId) == true);
- ASMJIT_ASSERT(isPhysAssigned(group, dstPhysId) == false);
-
- _workToPhysMap->physIds[workId] = uint8_t(dstPhysId);
- _physToWorkIds[group][srcPhysId] = kWorkNone;
- _physToWorkIds[group][dstPhysId] = workId;
-
- RegMask srcMask = Support::bitMask(srcPhysId);
- RegMask dstMask = Support::bitMask(dstPhysId);
-
- bool dirty = (_physToWorkMap->dirty[group] & srcMask) != 0;
- RegMask regMask = dstMask | srcMask;
-
- _physToWorkMap->assigned[group] ^= regMask;
- _physToWorkMap->dirty[group] ^= regMask & Support::bitMaskFromBool<RegMask>(dirty);
-
- verify();
- }
-
- inline void swap(RegGroup group, uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
- ASMJIT_ASSERT(aPhysId != bPhysId);
- ASMJIT_ASSERT(workToPhysId(group, aWorkId) == aPhysId);
- ASMJIT_ASSERT(workToPhysId(group, bWorkId) == bPhysId);
- ASMJIT_ASSERT(physToWorkId(group, aPhysId) == aWorkId);
- ASMJIT_ASSERT(physToWorkId(group, bPhysId) == bWorkId);
- ASMJIT_ASSERT(isPhysAssigned(group, aPhysId));
- ASMJIT_ASSERT(isPhysAssigned(group, bPhysId));
-
- _workToPhysMap->physIds[aWorkId] = uint8_t(bPhysId);
- _workToPhysMap->physIds[bWorkId] = uint8_t(aPhysId);
- _physToWorkIds[group][aPhysId] = bWorkId;
- _physToWorkIds[group][bPhysId] = aWorkId;
-
- RegMask aMask = Support::bitMask(aPhysId);
- RegMask bMask = Support::bitMask(bPhysId);
- RegMask flipMask = Support::bitMaskFromBool<RegMask>(((_physToWorkMap->dirty[group] & aMask) != 0) ^ ((_physToWorkMap->dirty[group] & bMask) != 0));
- RegMask regMask = aMask | bMask;
- _physToWorkMap->dirty[group] ^= regMask & flipMask;
-
- verify();
- }
-
- //! Unassign [VirtReg/WorkReg] from a physical register.
- inline void unassign(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- ASMJIT_ASSERT(physId < Globals::kMaxPhysRegs);
- ASMJIT_ASSERT(workToPhysId(group, workId) == physId);
- ASMJIT_ASSERT(physToWorkId(group, physId) == workId);
- ASMJIT_ASSERT(isPhysAssigned(group, physId));
-
- _workToPhysMap->physIds[workId] = kPhysNone;
- _physToWorkIds[group][physId] = kWorkNone;
-
- RegMask regMask = Support::bitMask(physId);
- _physToWorkMap->assigned[group] &= ~regMask;
- _physToWorkMap->dirty[group] &= ~regMask;
-
- verify();
- }
-
- inline void makeClean(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- DebugUtils::unused(workId);
- RegMask regMask = Support::bitMask(physId);
- _physToWorkMap->dirty[group] &= ~regMask;
- }
-
- inline void makeDirty(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- DebugUtils::unused(workId);
- RegMask regMask = Support::bitMask(physId);
- _physToWorkMap->dirty[group] |= regMask;
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_FORCE_INLINE void swap(RAAssignment& other) noexcept {
- std::swap(_workToPhysMap, other._workToPhysMap);
- std::swap(_physToWorkMap, other._physToWorkMap);
- _physToWorkIds.swap(other._physToWorkIds);
- }
-
- inline void assignWorkIdsFromPhysIds() noexcept {
- memset(_workToPhysMap, uint8_t(BaseReg::kIdBad), WorkToPhysMap::sizeOf(_layout.workCount));
-
- for (RegGroup group : RegGroupVirtValues{}) {
- uint32_t physBaseIndex = _layout.physIndex[group];
- Support::BitWordIterator<RegMask> it(_physToWorkMap->assigned[group]);
-
- while (it.hasNext()) {
- uint32_t physId = it.next();
- uint32_t workId = _physToWorkMap->workIds[physBaseIndex + physId];
-
- ASMJIT_ASSERT(workId != kWorkNone);
- _workToPhysMap->physIds[workId] = uint8_t(physId);
- }
- }
- }
-
- inline void copyFrom(const PhysToWorkMap* physToWorkMap) noexcept {
- memcpy(_physToWorkMap, physToWorkMap, PhysToWorkMap::sizeOf(_layout.physTotal));
- assignWorkIdsFromPhysIds();
- }
-
- inline void copyFrom(const PhysToWorkMap* physToWorkMap, const WorkToPhysMap* workToPhysMap) noexcept {
- memcpy(_physToWorkMap, physToWorkMap, PhysToWorkMap::sizeOf(_layout.physTotal));
- memcpy(_workToPhysMap, workToPhysMap, WorkToPhysMap::sizeOf(_layout.workCount));
- }
-
- inline void copyFrom(const RAAssignment& other) noexcept {
- copyFrom(other.physToWorkMap(), other.workToPhysMap());
- }
-
- // Not really useful outside of debugging.
- bool equals(const RAAssignment& other) const noexcept {
- // Layout should always match.
- if (_layout.physIndex != other._layout.physIndex ||
- _layout.physCount != other._layout.physCount ||
- _layout.physTotal != other._layout.physTotal ||
- _layout.workCount != other._layout.workCount ||
- _layout.workRegs != other._layout.workRegs)
- return false;
-
- uint32_t physTotal = _layout.physTotal;
- uint32_t workCount = _layout.workCount;
-
- for (uint32_t physId = 0; physId < physTotal; physId++) {
- uint32_t thisWorkId = _physToWorkMap->workIds[physId];
- uint32_t otherWorkId = other._physToWorkMap->workIds[physId];
- if (thisWorkId != otherWorkId)
- return false;
- }
-
- for (uint32_t workId = 0; workId < workCount; workId++) {
- uint32_t thisPhysId = _workToPhysMap->physIds[workId];
- uint32_t otherPhysId = other._workToPhysMap->physIds[workId];
- if (thisPhysId != otherPhysId)
- return false;
- }
-
- if (_physToWorkMap->assigned != other._physToWorkMap->assigned ||
- _physToWorkMap->dirty != other._physToWorkMap->dirty )
- return false;
-
- return true;
- }
-
-#if defined(ASMJIT_BUILD_DEBUG)
- ASMJIT_NOINLINE void verify() noexcept {
- // Verify WorkToPhysMap.
- {
- for (uint32_t workId = 0; workId < _layout.workCount; workId++) {
- uint32_t physId = _workToPhysMap->physIds[workId];
- if (physId != kPhysNone) {
- const RAWorkReg* workReg = _layout.workRegs->at(workId);
- RegGroup group = workReg->group();
- ASMJIT_ASSERT(_physToWorkIds[group][physId] == workId);
- }
- }
- }
-
- // Verify PhysToWorkMap.
- {
- for (RegGroup group : RegGroupVirtValues{}) {
- uint32_t physCount = _layout.physCount[group];
- for (uint32_t physId = 0; physId < physCount; physId++) {
- uint32_t workId = _physToWorkIds[group][physId];
- if (workId != kWorkNone) {
- ASMJIT_ASSERT(_workToPhysMap->physIds[workId] == physId);
- }
- }
- }
- }
- }
-#else
- inline void verify() noexcept {}
-#endif
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_CORE_RAASSIGNMENT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h b/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h
deleted file mode 100644
index 9d9b4282d2b..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/rabuilders_p.h
+++ /dev/null
@@ -1,612 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_RABUILDERS_P_H_INCLUDED
-#define ASMJIT_CORE_RABUILDERS_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/formatter.h"
-#include "../core/rapass_p.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_ra
-//! \{
-
-template<typename This>
-class RACFGBuilderT {
-public:
- enum : uint32_t {
- kRootIndentation = 2,
- kCodeIndentation = 4,
-
- // NOTE: This is a bit hacky. There are some nodes which are processed twice (see `onBeforeInvoke()` and
- // `onBeforeRet()`) as they can insert some nodes around them. Since we don't have any flags to mark these
- // we just use their position that is [at that time] unassigned.
- kNodePositionDidOnBefore = 0xFFFFFFFFu
- };
-
- //! \name Members
- //! \{
-
- BaseRAPass* _pass = nullptr;
- BaseCompiler* _cc = nullptr;
- RABlock* _curBlock = nullptr;
- RABlock* _retBlock = nullptr;
- FuncNode* _funcNode = nullptr;
- RARegsStats _blockRegStats {};
- uint32_t _exitLabelId = Globals::kInvalidId;
- ZoneVector<uint32_t> _sharedAssignmentsMap {};
-
- // Only used by logging, it's fine to be here to prevent more #ifdefs...
- bool _hasCode = false;
- RABlock* _lastLoggedBlock = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- Logger* _logger = nullptr;
- FormatOptions _formatOptions {};
- StringTmp<512> _sb;
-#endif
-
- //! \}
-
- inline RACFGBuilderT(BaseRAPass* pass) noexcept
- : _pass(pass),
- _cc(pass->cc()) {
-#ifndef ASMJIT_NO_LOGGING
- _logger = _pass->hasDiagnosticOption(DiagnosticOptions::kRADebugCFG) ? _pass->logger() : nullptr;
- if (_logger)
- _formatOptions = _logger->options();
-#endif
- }
-
- inline BaseCompiler* cc() const noexcept { return _cc; }
-
- //! \name Run
- //! \{
-
- //! Called per function by an architecture-specific CFG builder.
- Error run() noexcept {
- log("[BuildCFG]\n");
- ASMJIT_PROPAGATE(prepare());
-
- logNode(_funcNode, kRootIndentation);
- logBlock(_curBlock, kRootIndentation);
-
- RABlock* entryBlock = _curBlock;
- BaseNode* node = _funcNode->next();
- if (ASMJIT_UNLIKELY(!node))
- return DebugUtils::errored(kErrorInvalidState);
-
- _curBlock->setFirst(_funcNode);
- _curBlock->setLast(_funcNode);
-
- RAInstBuilder ib;
- ZoneVector<RABlock*> blocksWithUnknownJumps;
-
- for (;;) {
- BaseNode* next = node->next();
- ASMJIT_ASSERT(node->position() == 0 || node->position() == kNodePositionDidOnBefore);
-
- if (node->isInst()) {
- // Instruction | Jump | Invoke | Return
- // ------------------------------------
-
- // Handle `InstNode`, `InvokeNode`, and `FuncRetNode`. All of them share the same interface that provides
- // operands that have read/write semantics.
- if (ASMJIT_UNLIKELY(!_curBlock)) {
- // Unreachable code has to be removed, we cannot allocate registers in such code as we cannot do proper
- // liveness analysis in such case.
- removeNode(node);
- node = next;
- continue;
- }
-
- _hasCode = true;
-
- if (node->isInvoke() || node->isFuncRet()) {
- if (node->position() != kNodePositionDidOnBefore) {
- // Call and Reg are complicated as they may insert some surrounding code around them. The simplest
- // approach is to get the previous node, call the `onBefore()` handlers and then check whether
- // anything changed and restart if so. By restart we mean that the current `node` would go back to
- // the first possible inserted node by `onBeforeInvoke()` or `onBeforeRet()`.
- BaseNode* prev = node->prev();
-
- if (node->type() == NodeType::kInvoke)
- ASMJIT_PROPAGATE(static_cast<This*>(this)->onBeforeInvoke(node->as<InvokeNode>()));
- else
- ASMJIT_PROPAGATE(static_cast<This*>(this)->onBeforeRet(node->as<FuncRetNode>()));
-
- if (prev != node->prev()) {
- // If this was the first node in the block and something was
- // inserted before it then we have to update the first block.
- if (_curBlock->first() == node)
- _curBlock->setFirst(prev->next());
-
- node->setPosition(kNodePositionDidOnBefore);
- node = prev->next();
-
- // `onBeforeInvoke()` and `onBeforeRet()` can only insert instructions.
- ASMJIT_ASSERT(node->isInst());
- }
-
- // Necessary if something was inserted after `node`, but nothing before.
- next = node->next();
- }
- else {
- // Change the position back to its original value.
- node->setPosition(0);
- }
- }
-
- InstNode* inst = node->as<InstNode>();
- logNode(inst, kCodeIndentation);
-
- InstControlFlow cf = InstControlFlow::kRegular;
- ib.reset();
- ASMJIT_PROPAGATE(static_cast<This*>(this)->onInst(inst, cf, ib));
-
- if (node->isInvoke()) {
- ASMJIT_PROPAGATE(static_cast<This*>(this)->onInvoke(inst->as<InvokeNode>(), ib));
- }
-
- if (node->isFuncRet()) {
- ASMJIT_PROPAGATE(static_cast<This*>(this)->onRet(inst->as<FuncRetNode>(), ib));
- cf = InstControlFlow::kReturn;
- }
-
- if (cf == InstControlFlow::kJump) {
- uint32_t fixedRegCount = 0;
- for (RATiedReg& tiedReg : ib) {
- RAWorkReg* workReg = _pass->workRegById(tiedReg.workId());
- if (workReg->group() == RegGroup::kGp) {
- uint32_t useId = tiedReg.useId();
- if (useId == BaseReg::kIdBad) {
- useId = _pass->_scratchRegIndexes[fixedRegCount++];
- tiedReg.setUseId(useId);
- }
- _curBlock->addExitScratchGpRegs(Support::bitMask(useId));
- }
- }
- }
-
- ASMJIT_PROPAGATE(_pass->assignRAInst(inst, _curBlock, ib));
- _blockRegStats.combineWith(ib._stats);
-
- if (cf != InstControlFlow::kRegular) {
- // Support for conditional and unconditional jumps.
- if (cf == InstControlFlow::kJump || cf == InstControlFlow::kBranch) {
- _curBlock->setLast(node);
- _curBlock->addFlags(RABlockFlags::kHasTerminator);
- _curBlock->makeConstructed(_blockRegStats);
-
- if (!inst->hasOption(InstOptions::kUnfollow)) {
- // Jmp/Jcc/Call/Loop/etc...
- uint32_t opCount = inst->opCount();
- const Operand* opArray = inst->operands();
-
- // Cannot jump anywhere without operands.
- if (ASMJIT_UNLIKELY(!opCount))
- return DebugUtils::errored(kErrorInvalidState);
-
- if (opArray[opCount - 1].isLabel()) {
- // Labels are easy for constructing the control flow.
- LabelNode* labelNode;
- ASMJIT_PROPAGATE(cc()->labelNodeOf(&labelNode, opArray[opCount - 1].as<Label>()));
-
- RABlock* targetBlock = _pass->newBlockOrExistingAt(labelNode);
- if (ASMJIT_UNLIKELY(!targetBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- targetBlock->makeTargetable();
- ASMJIT_PROPAGATE(_curBlock->appendSuccessor(targetBlock));
- }
- else {
- // Not a label - could be jump with reg/mem operand, which means that it can go anywhere. Such jumps
- // must either be annotated so the CFG can be properly constructed, otherwise we assume the worst case
- // - can jump to any basic block.
- JumpAnnotation* jumpAnnotation = nullptr;
- _curBlock->addFlags(RABlockFlags::kHasJumpTable);
-
- if (inst->type() == NodeType::kJump)
- jumpAnnotation = inst->as<JumpNode>()->annotation();
-
- if (jumpAnnotation) {
- uint64_t timestamp = _pass->nextTimestamp();
- for (uint32_t id : jumpAnnotation->labelIds()) {
- LabelNode* labelNode;
- ASMJIT_PROPAGATE(cc()->labelNodeOf(&labelNode, id));
-
- RABlock* targetBlock = _pass->newBlockOrExistingAt(labelNode);
- if (ASMJIT_UNLIKELY(!targetBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // Prevents adding basic-block successors multiple times.
- if (!targetBlock->hasTimestamp(timestamp)) {
- targetBlock->setTimestamp(timestamp);
- targetBlock->makeTargetable();
- ASMJIT_PROPAGATE(_curBlock->appendSuccessor(targetBlock));
- }
- }
- ASMJIT_PROPAGATE(shareAssignmentAcrossSuccessors(_curBlock));
- }
- else {
- ASMJIT_PROPAGATE(blocksWithUnknownJumps.append(_pass->allocator(), _curBlock));
- }
- }
- }
-
- if (cf == InstControlFlow::kJump) {
- // Unconditional jump makes the code after the jump unreachable, which will be removed instantly during
- // the CFG construction; as we cannot allocate registers for instructions that are not part of any block.
- // Of course we can leave these instructions as they are, however, that would only postpone the problem
- // as assemblers can't encode instructions that use virtual registers.
- _curBlock = nullptr;
- }
- else {
- node = next;
- if (ASMJIT_UNLIKELY(!node))
- return DebugUtils::errored(kErrorInvalidState);
-
- RABlock* consecutiveBlock;
- if (node->type() == NodeType::kLabel) {
- if (node->hasPassData()) {
- consecutiveBlock = node->passData<RABlock>();
- }
- else {
- consecutiveBlock = _pass->newBlock(node);
- if (ASMJIT_UNLIKELY(!consecutiveBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
- node->setPassData<RABlock>(consecutiveBlock);
- }
- }
- else {
- consecutiveBlock = _pass->newBlock(node);
- if (ASMJIT_UNLIKELY(!consecutiveBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
- }
-
- _curBlock->addFlags(RABlockFlags::kHasConsecutive);
- ASMJIT_PROPAGATE(_curBlock->prependSuccessor(consecutiveBlock));
-
- _curBlock = consecutiveBlock;
- _hasCode = false;
- _blockRegStats.reset();
-
- if (_curBlock->isConstructed())
- break;
- ASMJIT_PROPAGATE(_pass->addBlock(consecutiveBlock));
-
- logBlock(_curBlock, kRootIndentation);
- continue;
- }
- }
-
- if (cf == InstControlFlow::kReturn) {
- _curBlock->setLast(node);
- _curBlock->makeConstructed(_blockRegStats);
- ASMJIT_PROPAGATE(_curBlock->appendSuccessor(_retBlock));
-
- _curBlock = nullptr;
- }
- }
- }
- else if (node->type() == NodeType::kLabel) {
- // Label - Basic-Block Management
- // ------------------------------
-
- if (!_curBlock) {
- // If the current code is unreachable the label makes it reachable again. We may remove the whole block in
- // the future if it's not referenced though.
- _curBlock = node->passData<RABlock>();
-
- if (_curBlock) {
- // If the label has a block assigned we can either continue with it or skip it if the block has been
- // constructed already.
- if (_curBlock->isConstructed())
- break;
- }
- else {
- // No block assigned - create a new one and assign it.
- _curBlock = _pass->newBlock(node);
- if (ASMJIT_UNLIKELY(!_curBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
- node->setPassData<RABlock>(_curBlock);
- }
-
- _curBlock->makeTargetable();
- _hasCode = false;
- _blockRegStats.reset();
- ASMJIT_PROPAGATE(_pass->addBlock(_curBlock));
- }
- else {
- if (node->hasPassData()) {
- RABlock* consecutive = node->passData<RABlock>();
- consecutive->makeTargetable();
-
- if (_curBlock == consecutive) {
- // The label currently processed is part of the current block. This is only possible for multiple labels
- // that are right next to each other or labels that are separated by non-code nodes like directives and
- // comments.
- if (ASMJIT_UNLIKELY(_hasCode))
- return DebugUtils::errored(kErrorInvalidState);
- }
- else {
- // Label makes the current block constructed. There is a chance that the Label is not used, but we don't
- // know that at this point. In the worst case there would be two blocks next to each other, it's just fine.
- ASMJIT_ASSERT(_curBlock->last() != node);
- _curBlock->setLast(node->prev());
- _curBlock->addFlags(RABlockFlags::kHasConsecutive);
- _curBlock->makeConstructed(_blockRegStats);
-
- ASMJIT_PROPAGATE(_curBlock->appendSuccessor(consecutive));
- ASMJIT_PROPAGATE(_pass->addBlock(consecutive));
-
- _curBlock = consecutive;
- _hasCode = false;
- _blockRegStats.reset();
- }
- }
- else {
- // First time we see this label.
- if (_hasCode || _curBlock == entryBlock) {
- // Cannot continue the current block if it already contains some code or it's a block entry. We need to
- // create a new block and make it a successor.
- ASMJIT_ASSERT(_curBlock->last() != node);
- _curBlock->setLast(node->prev());
- _curBlock->addFlags(RABlockFlags::kHasConsecutive);
- _curBlock->makeConstructed(_blockRegStats);
-
- RABlock* consecutive = _pass->newBlock(node);
- if (ASMJIT_UNLIKELY(!consecutive))
- return DebugUtils::errored(kErrorOutOfMemory);
- consecutive->makeTargetable();
-
- ASMJIT_PROPAGATE(_curBlock->appendSuccessor(consecutive));
- ASMJIT_PROPAGATE(_pass->addBlock(consecutive));
-
- _curBlock = consecutive;
- _hasCode = false;
- _blockRegStats.reset();
- }
-
- node->setPassData<RABlock>(_curBlock);
- }
- }
-
- if (_curBlock && _curBlock != _lastLoggedBlock)
- logBlock(_curBlock, kRootIndentation);
- logNode(node, kRootIndentation);
-
- // Unlikely: Assume that the exit label is reached only once per function.
- if (ASMJIT_UNLIKELY(node->as<LabelNode>()->labelId() == _exitLabelId)) {
- _curBlock->setLast(node);
- _curBlock->makeConstructed(_blockRegStats);
- ASMJIT_PROPAGATE(_pass->addExitBlock(_curBlock));
-
- _curBlock = nullptr;
- }
- }
- else {
- // Other Nodes | Function Exit
- // ---------------------------
-
- logNode(node, kCodeIndentation);
-
- if (node->type() == NodeType::kSentinel) {
- if (node == _funcNode->endNode()) {
- // Make sure we didn't flow here if this is the end of the function sentinel.
- if (ASMJIT_UNLIKELY(_curBlock && _hasCode))
- return DebugUtils::errored(kErrorInvalidState);
- break;
- }
- }
- else if (node->type() == NodeType::kFunc) {
- // RAPass can only compile a single function at a time. If we
- // encountered a function it must be the current one, bail if not.
- if (ASMJIT_UNLIKELY(node != _funcNode))
- return DebugUtils::errored(kErrorInvalidState);
- // PASS if this is the first node.
- }
- else {
- // PASS if this is a non-interesting or unknown node.
- }
- }
-
- // Advance to the next node.
- node = next;
-
- // NOTE: We cannot encounter a NULL node, because every function must be terminated by a sentinel (`stop`)
- // node. If we encountered a NULL node it means that something went wrong and this node list is corrupted;
- // bail in such case.
- if (ASMJIT_UNLIKELY(!node))
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- if (_pass->hasDanglingBlocks())
- return DebugUtils::errored(kErrorInvalidState);
-
- for (RABlock* block : blocksWithUnknownJumps)
- handleBlockWithUnknownJump(block);
-
- return _pass->initSharedAssignments(_sharedAssignmentsMap);
- }
-
- //! \}
-
- //! \name Prepare
- //! \{
-
- //! Prepares the CFG builder of the current function.
- Error prepare() noexcept {
- FuncNode* func = _pass->func();
- BaseNode* node = nullptr;
-
- // Create entry and exit blocks.
- _funcNode = func;
- _retBlock = _pass->newBlockOrExistingAt(func->exitNode(), &node);
-
- if (ASMJIT_UNLIKELY(!_retBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _retBlock->makeTargetable();
- ASMJIT_PROPAGATE(_pass->addExitBlock(_retBlock));
-
- if (node != func) {
- _curBlock = _pass->newBlock();
- if (ASMJIT_UNLIKELY(!_curBlock))
- return DebugUtils::errored(kErrorOutOfMemory);
- }
- else {
- // Function that has no code at all.
- _curBlock = _retBlock;
- }
-
- // Reset everything we may need.
- _blockRegStats.reset();
- _exitLabelId = func->exitNode()->labelId();
-
- // Initially we assume there is no code in the function body.
- _hasCode = false;
-
- return _pass->addBlock(_curBlock);
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Called when a `node` is removed, e.g. because of a dead code elimination.
- void removeNode(BaseNode* node) noexcept {
- logNode(node, kRootIndentation, "<Removed>");
- cc()->removeNode(node);
- }
-
- //! Handles block with unknown jump, which could be a jump to a jump table.
- //!
- //! If we encounter such block we basically insert all existing blocks as successors except the function entry
- //! block and a natural successor, if such block exists.
- Error handleBlockWithUnknownJump(RABlock* block) noexcept {
- RABlocks& blocks = _pass->blocks();
- size_t blockCount = blocks.size();
-
- // NOTE: Iterate from `1` as the first block is the entry block, we don't
- // allow the entry to be a successor of any block.
- RABlock* consecutive = block->consecutive();
- for (size_t i = 1; i < blockCount; i++) {
- RABlock* candidate = blocks[i];
- if (candidate == consecutive || !candidate->isTargetable())
- continue;
- block->appendSuccessor(candidate);
- }
-
- return shareAssignmentAcrossSuccessors(block);
- }
-
- Error shareAssignmentAcrossSuccessors(RABlock* block) noexcept {
- if (block->successors().size() <= 1)
- return kErrorOk;
-
- RABlock* consecutive = block->consecutive();
- uint32_t sharedAssignmentId = Globals::kInvalidId;
-
- for (RABlock* successor : block->successors()) {
- if (successor == consecutive)
- continue;
-
- if (successor->hasSharedAssignmentId()) {
- if (sharedAssignmentId == Globals::kInvalidId)
- sharedAssignmentId = successor->sharedAssignmentId();
- else
- _sharedAssignmentsMap[successor->sharedAssignmentId()] = sharedAssignmentId;
- }
- else {
- if (sharedAssignmentId == Globals::kInvalidId)
- ASMJIT_PROPAGATE(newSharedAssignmentId(&sharedAssignmentId));
- successor->setSharedAssignmentId(sharedAssignmentId);
- }
- }
- return kErrorOk;
- }
-
- Error newSharedAssignmentId(uint32_t* out) noexcept {
- uint32_t id = _sharedAssignmentsMap.size();
- ASMJIT_PROPAGATE(_sharedAssignmentsMap.append(_pass->allocator(), id));
-
- *out = id;
- return kErrorOk;
- }
-
- //! \}
-
- //! \name Logging
- //! \{
-
-#ifndef ASMJIT_NO_LOGGING
- template<typename... Args>
- inline void log(const char* fmt, Args&&... args) noexcept {
- if (_logger)
- _logger->logf(fmt, std::forward<Args>(args)...);
- }
-
- inline void logBlock(RABlock* block, uint32_t indentation = 0) noexcept {
- if (_logger)
- _logBlock(block, indentation);
- }
-
- inline void logNode(BaseNode* node, uint32_t indentation = 0, const char* action = nullptr) noexcept {
- if (_logger)
- _logNode(node, indentation, action);
- }
-
- void _logBlock(RABlock* block, uint32_t indentation) noexcept {
- _sb.clear();
- _sb.appendChars(' ', indentation);
- _sb.appendFormat("{#%u}\n", block->blockId());
- _logger->log(_sb);
- _lastLoggedBlock = block;
- }
-
- void _logNode(BaseNode* node, uint32_t indentation, const char* action) noexcept {
- _sb.clear();
- _sb.appendChars(' ', indentation);
- if (action) {
- _sb.append(action);
- _sb.append(' ');
- }
- Formatter::formatNode(_sb, _formatOptions, cc(), node);
- _sb.append('\n');
- _logger->log(_sb);
- }
-#else
- template<typename... Args>
- inline void log(const char* fmt, Args&&... args) noexcept {
- DebugUtils::unused(fmt);
- DebugUtils::unused(std::forward<Args>(args)...);
- }
-
- inline void logBlock(RABlock* block, uint32_t indentation = 0) noexcept {
- DebugUtils::unused(block, indentation);
- }
-
- inline void logNode(BaseNode* node, uint32_t indentation = 0, const char* action = nullptr) noexcept {
- DebugUtils::unused(node, indentation, action);
- }
-#endif
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_CORE_RABUILDERS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/radefs_p.h b/3rdparty/asmjit/src/asmjit/core/radefs_p.h
deleted file mode 100644
index 99e79be3ebb..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/radefs_p.h
+++ /dev/null
@@ -1,1212 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_RADEFS_P_H_INCLUDED
-#define ASMJIT_CORE_RADEFS_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#include "../core/archtraits.h"
-#include "../core/compilerdefs.h"
-#include "../core/logger.h"
-#include "../core/operand.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../core/zone.h"
-#include "../core/zonevector.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_ra
-//! \{
-
-#ifndef ASMJIT_NO_LOGGING
-# define ASMJIT_RA_LOG_FORMAT(...) \
- do { \
- if (logger) \
- logger->logf(__VA_ARGS__); \
- } while (0)
-# define ASMJIT_RA_LOG_COMPLEX(...) \
- do { \
- if (logger) { \
- __VA_ARGS__ \
- } \
- } while (0)
-#else
-# define ASMJIT_RA_LOG_FORMAT(...) ((void)0)
-# define ASMJIT_RA_LOG_COMPLEX(...) ((void)0)
-#endif
-
-class BaseRAPass;
-class RABlock;
-class BaseNode;
-struct RAStackSlot;
-
-typedef ZoneVector<RABlock*> RABlocks;
-typedef ZoneVector<RAWorkReg*> RAWorkRegs;
-
-//! Maximum number of consecutive registers aggregated from all supported backends.
-static constexpr uint32_t kMaxConsecutiveRegs = 4;
-
-//! Provides architecture constraints used by register allocator.
-class RAConstraints {
-public:
- //! \name Members
- //! \{
-
- Support::Array<RegMask, Globals::kNumVirtGroups> _availableRegs {};
-
- //! \}
-
- ASMJIT_NOINLINE Error init(Arch arch) noexcept {
- switch (arch) {
- case Arch::kX86:
- case Arch::kX64: {
- uint32_t registerCount = arch == Arch::kX86 ? 8 : 16;
- _availableRegs[RegGroup::kGp] = Support::lsbMask<RegMask>(registerCount) & ~Support::bitMask(4u);
- _availableRegs[RegGroup::kVec] = Support::lsbMask<RegMask>(registerCount);
- _availableRegs[RegGroup::kMask] = Support::lsbMask<RegMask>(8);
- _availableRegs[RegGroup::kExtraVirt3] = Support::lsbMask<RegMask>(8);
- return kErrorOk;
- }
-
- case Arch::kAArch64: {
- _availableRegs[RegGroup::kGp] = 0xFFFFFFFFu & ~Support::bitMask(18, 31u);
- _availableRegs[RegGroup::kVec] = 0xFFFFFFFFu;
- _availableRegs[RegGroup::kMask] = 0;
- _availableRegs[RegGroup::kExtraVirt3] = 0;
- return kErrorOk;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidArch);
- }
- }
-
- inline RegMask availableRegs(RegGroup group) const noexcept { return _availableRegs[group]; }
-};
-
-enum class RAStrategyType : uint8_t {
- kSimple = 0,
- kComplex = 1
-};
-ASMJIT_DEFINE_ENUM_COMPARE(RAStrategyType)
-
-enum class RAStrategyFlags : uint8_t {
- kNone = 0
-};
-ASMJIT_DEFINE_ENUM_FLAGS(RAStrategyFlags)
-
-//! Register allocation strategy.
-//!
-//! The idea is to select the best register allocation strategy for each virtual register group based on the
-//! complexity of the code.
-struct RAStrategy {
- //! \name Members
- //! \{
-
- RAStrategyType _type = RAStrategyType::kSimple;
- RAStrategyFlags _flags = RAStrategyFlags::kNone;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _type = RAStrategyType::kSimple;
- _flags = RAStrategyFlags::kNone;
- }
-
- ASMJIT_INLINE_NODEBUG RAStrategyType type() const noexcept { return _type; }
- ASMJIT_INLINE_NODEBUG void setType(RAStrategyType type) noexcept { _type = type; }
-
- ASMJIT_INLINE_NODEBUG bool isSimple() const noexcept { return _type == RAStrategyType::kSimple; }
- ASMJIT_INLINE_NODEBUG bool isComplex() const noexcept { return _type >= RAStrategyType::kComplex; }
-
- ASMJIT_INLINE_NODEBUG RAStrategyFlags flags() const noexcept { return _flags; }
- ASMJIT_INLINE_NODEBUG bool hasFlag(RAStrategyFlags flag) const noexcept { return Support::test(_flags, flag); }
- ASMJIT_INLINE_NODEBUG void addFlags(RAStrategyFlags flags) noexcept { _flags |= flags; }
-
- //! \}
-};
-
-//! Count of virtual or physical registers per group.
-//!
-//! \note This class uses 8-bit integers to represent counters, it's only used in places where this is sufficient,
-//! for example total count of machine's physical registers, count of virtual registers per instruction, etc...
-//! There is also `RALiveCount`, which uses 32-bit integers and is indeed much safer.
-struct RARegCount {
- //! \name Members
- //! \{
-
- union {
- uint8_t _regs[4];
- uint32_t _packed;
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Resets all counters to zero.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _packed = 0; }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- inline uint8_t& operator[](RegGroup group) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _regs[size_t(group)];
- }
-
- inline const uint8_t& operator[](RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- return _regs[size_t(group)];
- }
-
- ASMJIT_INLINE_NODEBUG bool operator==(const RARegCount& other) const noexcept { return _packed == other._packed; }
- ASMJIT_INLINE_NODEBUG bool operator!=(const RARegCount& other) const noexcept { return _packed != other._packed; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the count of registers by the given register `group`.
- inline uint32_t get(RegGroup group) const noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
-
- uint32_t shift = Support::byteShiftOfDWordStruct(uint32_t(group));
- return (_packed >> shift) & uint32_t(0xFF);
- }
-
- //! Sets the register count by a register `group`.
- inline void set(RegGroup group, uint32_t n) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- ASMJIT_ASSERT(n <= 0xFF);
-
- uint32_t shift = Support::byteShiftOfDWordStruct(uint32_t(group));
- _packed = (_packed & ~uint32_t(0xFF << shift)) + (n << shift);
- }
-
- //! Adds the register count by a register `group`.
- inline void add(RegGroup group, uint32_t n = 1) noexcept {
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
- ASMJIT_ASSERT(0xFF - uint32_t(_regs[size_t(group)]) >= n);
-
- uint32_t shift = Support::byteShiftOfDWordStruct(uint32_t(group));
- _packed += n << shift;
- }
-
- //! \}
-};
-
-//! Provides mapping that can be used to fast index architecture register groups.
-struct RARegIndex : public RARegCount {
- //! Build register indexes based on the given `count` of registers.
- ASMJIT_FORCE_INLINE void buildIndexes(const RARegCount& count) noexcept {
- uint32_t x = uint32_t(count._regs[0]);
- uint32_t y = uint32_t(count._regs[1]) + x;
- uint32_t z = uint32_t(count._regs[2]) + y;
-
- ASMJIT_ASSERT(y <= 0xFF);
- ASMJIT_ASSERT(z <= 0xFF);
- _packed = Support::bytepack32_4x8(0, x, y, z);
- }
-};
-
-//! Registers mask.
-struct RARegMask {
- //! \name Members
- //! \{
-
- Support::Array<RegMask, Globals::kNumVirtGroups> _masks;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG void init(const RARegMask& other) noexcept { _masks = other._masks; }
- //! Reset all register masks to zero.
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _masks.fill(0); }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool operator==(const RARegMask& other) const noexcept { return _masks == other._masks; }
- ASMJIT_INLINE_NODEBUG bool operator!=(const RARegMask& other) const noexcept { return _masks != other._masks; }
-
- template<typename Index>
- inline uint32_t& operator[](const Index& index) noexcept { return _masks[index]; }
-
- template<typename Index>
- inline const uint32_t& operator[](const Index& index) const noexcept { return _masks[index]; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Tests whether all register masks are zero (empty).
- inline bool empty() const noexcept {
- return _masks.aggregate<Support::Or>() == 0;
- }
-
- inline bool has(RegGroup group, RegMask mask = 0xFFFFFFFFu) const noexcept {
- return (_masks[group] & mask) != 0;
- }
-
- template<class Operator>
- inline void op(const RARegMask& other) noexcept {
- _masks.combine<Operator>(other._masks);
- }
-
- template<class Operator>
- inline void op(RegGroup group, RegMask mask) noexcept {
- _masks[group] = Operator::op(_masks[group], mask);
- }
-
- inline void clear(RegGroup group, RegMask mask) noexcept {
- _masks[group] = _masks[group] & ~mask;
- }
-
- //! \}
-};
-
-//! Information associated with each instruction, propagated to blocks, loops, and the whole function. This
-//! information can be used to do minor decisions before the register allocator tries to do its job. For
-//! example to use fast register allocation inside a block or loop it cannot have clobbered and/or fixed
-//! registers, etc...
-class RARegsStats {
-public:
- //! \name Constants
- //! \{
-
- enum Index : uint32_t {
- kIndexUsed = 0,
- kIndexFixed = 8,
- kIndexClobbered = 16
- };
-
- enum Mask : uint32_t {
- kMaskUsed = 0xFFu << kIndexUsed,
- kMaskFixed = 0xFFu << kIndexFixed,
- kMaskClobbered = 0xFFu << kIndexClobbered
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- uint32_t _packed = 0;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _packed = 0; }
- ASMJIT_INLINE_NODEBUG void combineWith(const RARegsStats& other) noexcept { _packed |= other._packed; }
-
- ASMJIT_INLINE_NODEBUG bool hasUsed() const noexcept { return (_packed & kMaskUsed) != 0u; }
- ASMJIT_INLINE_NODEBUG bool hasUsed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexUsed + uint32_t(group))) != 0u; }
- ASMJIT_INLINE_NODEBUG void makeUsed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexUsed + uint32_t(group)); }
-
- ASMJIT_INLINE_NODEBUG bool hasFixed() const noexcept { return (_packed & kMaskFixed) != 0u; }
- ASMJIT_INLINE_NODEBUG bool hasFixed(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexFixed + uint32_t(group))) != 0u; }
- ASMJIT_INLINE_NODEBUG void makeFixed(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexFixed + uint32_t(group)); }
-
- ASMJIT_INLINE_NODEBUG bool hasClobbered() const noexcept { return (_packed & kMaskClobbered) != 0u; }
- ASMJIT_INLINE_NODEBUG bool hasClobbered(RegGroup group) const noexcept { return (_packed & Support::bitMask(kIndexClobbered + uint32_t(group))) != 0u; }
- ASMJIT_INLINE_NODEBUG void makeClobbered(RegGroup group) noexcept { _packed |= Support::bitMask(kIndexClobbered + uint32_t(group)); }
-
- //! \}
-};
-
-//! Count of live registers, per group.
-class RALiveCount {
-public:
- //! \name Members
- //! \{
-
- Support::Array<uint32_t, Globals::kNumVirtGroups> n {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveCount() noexcept = default;
- ASMJIT_INLINE_NODEBUG RALiveCount(const RALiveCount& other) noexcept = default;
-
- ASMJIT_INLINE_NODEBUG void init(const RALiveCount& other) noexcept { n = other.n; }
- ASMJIT_INLINE_NODEBUG void reset() noexcept { n.fill(0); }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveCount& operator=(const RALiveCount& other) noexcept = default;
-
- inline uint32_t& operator[](RegGroup group) noexcept { return n[group]; }
- inline const uint32_t& operator[](RegGroup group) const noexcept { return n[group]; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- template<class Operator>
- inline void op(const RALiveCount& other) noexcept { n.combine<Operator>(other.n); }
-
- //! \}
-};
-
-struct RALiveInterval {
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- kNaN = 0,
- kInf = 0xFFFFFFFFu
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- uint32_t a, b;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveInterval() noexcept : a(0), b(0) {}
- ASMJIT_INLINE_NODEBUG RALiveInterval(uint32_t a, uint32_t b) noexcept : a(a), b(b) {}
- ASMJIT_INLINE_NODEBUG RALiveInterval(const RALiveInterval& other) noexcept : a(other.a), b(other.b) {}
-
- ASMJIT_INLINE_NODEBUG void init(uint32_t aVal, uint32_t bVal) noexcept {
- a = aVal;
- b = bVal;
- }
- ASMJIT_INLINE_NODEBUG void init(const RALiveInterval& other) noexcept { init(other.a, other.b); }
- ASMJIT_INLINE_NODEBUG void reset() noexcept { init(0, 0); }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveInterval& operator=(const RALiveInterval& other) = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool isValid() const noexcept { return a < b; }
- ASMJIT_INLINE_NODEBUG uint32_t width() const noexcept { return b - a; }
-
- //! \}
-};
-
-//! Live span with payload of type `T`.
-template<typename T>
-class RALiveSpan : public RALiveInterval, public T {
-public:
- //! \name Types
- //! \{
-
- typedef T DataType;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveSpan() noexcept : RALiveInterval(), T() {}
- ASMJIT_INLINE_NODEBUG RALiveSpan(const RALiveSpan<T>& other) noexcept : RALiveInterval(other), T() {}
- ASMJIT_INLINE_NODEBUG RALiveSpan(const RALiveInterval& interval, const T& data) noexcept : RALiveInterval(interval), T(data) {}
- ASMJIT_INLINE_NODEBUG RALiveSpan(uint32_t a, uint32_t b) noexcept : RALiveInterval(a, b), T() {}
- ASMJIT_INLINE_NODEBUG RALiveSpan(uint32_t a, uint32_t b, const T& data) noexcept : RALiveInterval(a, b), T(data) {}
-
- ASMJIT_INLINE_NODEBUG void init(const RALiveSpan<T>& other) noexcept {
- RALiveInterval::init(static_cast<const RALiveInterval&>(other));
- T::init(static_cast<const T&>(other));
- }
-
- ASMJIT_INLINE_NODEBUG void init(const RALiveSpan<T>& span, const T& data) noexcept {
- RALiveInterval::init(static_cast<const RALiveInterval&>(span));
- T::init(data);
- }
-
- ASMJIT_INLINE_NODEBUG void init(const RALiveInterval& interval, const T& data) noexcept {
- RALiveInterval::init(interval);
- T::init(data);
- }
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveSpan& operator=(const RALiveSpan& other) {
- init(other);
- return *this;
- }
-
- //! \}
-};
-
-//! Vector of `RALiveSpan<T>` with additional convenience API.
-template<typename T>
-class RALiveSpans {
-public:
- ASMJIT_NONCOPYABLE(RALiveSpans)
-
- typedef typename T::DataType DataType;
- ZoneVector<T> _data;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RALiveSpans() noexcept : _data() {}
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _data.reset(); }
- ASMJIT_INLINE_NODEBUG void release(ZoneAllocator* allocator) noexcept { _data.release(allocator); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _data.empty(); }
- ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _data.size(); }
-
- ASMJIT_INLINE_NODEBUG T* data() noexcept { return _data.data(); }
- ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return _data.data(); }
-
- ASMJIT_INLINE_NODEBUG bool isOpen() const noexcept {
- uint32_t size = _data.size();
- return size > 0 && _data[size - 1].b == RALiveInterval::kInf;
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_INLINE_NODEBUG void swap(RALiveSpans<T>& other) noexcept { _data.swap(other._data); }
-
- //! Open the current live span.
- ASMJIT_FORCE_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end) noexcept {
- bool wasOpen;
- return openAt(allocator, start, end, wasOpen);
- }
-
- ASMJIT_FORCE_INLINE Error openAt(ZoneAllocator* allocator, uint32_t start, uint32_t end, bool& wasOpen) noexcept {
- uint32_t size = _data.size();
- wasOpen = false;
-
- if (size > 0) {
- T& last = _data[size - 1];
- if (last.b >= start) {
- wasOpen = last.b > start;
- last.b = end;
- return kErrorOk;
- }
- }
-
- return _data.append(allocator, T(start, end));
- }
-
- ASMJIT_FORCE_INLINE void closeAt(uint32_t end) noexcept {
- ASMJIT_ASSERT(!empty());
-
- uint32_t size = _data.size();
- _data[size - 1].b = end;
- }
-
- //! Returns the sum of width of all spans.
- //!
- //! \note Don't overuse, this iterates over all spans so it's O(N). It should be only called once and then cached.
- inline uint32_t width() const noexcept {
- uint32_t width = 0;
- for (const T& span : _data)
- width += span.width();
- return width;
- }
-
- ASMJIT_INLINE_NODEBUG T& operator[](uint32_t index) noexcept { return _data[index]; }
- ASMJIT_INLINE_NODEBUG const T& operator[](uint32_t index) const noexcept { return _data[index]; }
-
- ASMJIT_INLINE_NODEBUG bool intersects(const RALiveSpans<T>& other) const noexcept {
- return intersects(*this, other);
- }
-
- ASMJIT_FORCE_INLINE Error nonOverlappingUnionOf(ZoneAllocator* allocator, const RALiveSpans<T>& x, const RALiveSpans<T>& y, const DataType& yData) noexcept {
- uint32_t finalSize = x.size() + y.size();
- ASMJIT_PROPAGATE(_data.reserve(allocator, finalSize));
-
- T* dstPtr = _data.data();
- const T* xSpan = x.data();
- const T* ySpan = y.data();
-
- const T* xEnd = xSpan + x.size();
- const T* yEnd = ySpan + y.size();
-
- // Loop until we have intersection or either `xSpan == xEnd` or `ySpan == yEnd`, which means that there is no
- // intersection. We advance either `xSpan` or `ySpan` depending on their ranges.
- if (xSpan != xEnd && ySpan != yEnd) {
- uint32_t xa, ya;
- xa = xSpan->a;
- for (;;) {
- while (ySpan->b <= xa) {
- dstPtr->init(*ySpan, yData);
- dstPtr++;
- if (++ySpan == yEnd)
- goto Done;
- }
-
- ya = ySpan->a;
- while (xSpan->b <= ya) {
- *dstPtr++ = *xSpan;
- if (++xSpan == xEnd)
- goto Done;
- }
-
- // We know that `xSpan->b > ySpan->a`, so check if `ySpan->b > xSpan->a`.
- xa = xSpan->a;
- if (ySpan->b > xa)
- return 0xFFFFFFFFu;
- }
- }
-
- Done:
- while (xSpan != xEnd) {
- *dstPtr++ = *xSpan++;
- }
-
- while (ySpan != yEnd) {
- dstPtr->init(*ySpan, yData);
- dstPtr++;
- ySpan++;
- }
-
- _data._setEndPtr(dstPtr);
- return kErrorOk;
- }
-
- static ASMJIT_FORCE_INLINE bool intersects(const RALiveSpans<T>& x, const RALiveSpans<T>& y) noexcept {
- const T* xSpan = x.data();
- const T* ySpan = y.data();
-
- const T* xEnd = xSpan + x.size();
- const T* yEnd = ySpan + y.size();
-
- // Loop until we have intersection or either `xSpan == xEnd` or `ySpan == yEnd`, which means that there is no
- // intersection. We advance either `xSpan` or `ySpan` depending on their end positions.
- if (xSpan == xEnd || ySpan == yEnd)
- return false;
-
- uint32_t xa, ya;
- xa = xSpan->a;
-
- for (;;) {
- while (ySpan->b <= xa)
- if (++ySpan == yEnd)
- return false;
-
- ya = ySpan->a;
- while (xSpan->b <= ya)
- if (++xSpan == xEnd)
- return false;
-
- // We know that `xSpan->b > ySpan->a`, so check if `ySpan->b > xSpan->a`.
- xa = xSpan->a;
- if (ySpan->b > xa)
- return true;
- }
- }
-
- //! \}
-};
-
-//! Statistics about a register liveness.
-class RALiveStats {
-public:
- uint32_t _width = 0;
- float _freq = 0.0f;
- float _priority = 0.0f;
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG uint32_t width() const noexcept { return _width; }
- ASMJIT_INLINE_NODEBUG float freq() const noexcept { return _freq; }
- ASMJIT_INLINE_NODEBUG float priority() const noexcept { return _priority; }
-
- //! \}
-};
-
-struct LiveRegData {
- uint32_t id;
-
- ASMJIT_INLINE_NODEBUG explicit LiveRegData(uint32_t id = BaseReg::kIdBad) noexcept : id(id) {}
- ASMJIT_INLINE_NODEBUG LiveRegData(const LiveRegData& other) noexcept = default;
-
- ASMJIT_INLINE_NODEBUG void init(const LiveRegData& other) noexcept { id = other.id; }
-
- ASMJIT_INLINE_NODEBUG bool operator==(const LiveRegData& other) const noexcept { return id == other.id; }
- ASMJIT_INLINE_NODEBUG bool operator!=(const LiveRegData& other) const noexcept { return id != other.id; }
-};
-
-typedef RALiveSpan<LiveRegData> LiveRegSpan;
-typedef RALiveSpans<LiveRegSpan> LiveRegSpans;
-
-//! Flags used by \ref RATiedReg.
-//!
-//! Register access information is encoded in 4 flags in total:
-//!
-//! - `kRead` - Register is Read (ReadWrite if combined with `kWrite`).
-//! - `kWrite` - Register is Written (ReadWrite if combined with `kRead`).
-//! - `kUse` - Encoded as Read or ReadWrite.
-//! - `kOut` - Encoded as WriteOnly.
-//!
-//! Let's describe all of these on two X86 instructions:
-//!
-//! - ADD x{R|W|Use}, x{R|Use} -> {x:R|W|Use }
-//! - LEA x{ W|Out}, [x{R|Use} + x{R|Out}] -> {x:R|W|Use|Out }
-//! - ADD x{R|W|Use}, y{R|Use} -> {x:R|W|Use y:R|Use}
-//! - LEA x{ W|Out}, [x{R|Use} + y{R|Out}] -> {x:R|W|Use|Out y:R|Use}
-//!
-//! It should be obvious from the example above how these flags get created. Each operand contains READ/WRITE
-//! information, which is then merged to RATiedReg's flags. However, we also need to represent the possitility
-//! to view the operation as two independent operations - USE and OUT, because the register allocator first
-//! allocates USE registers, and then assigns OUT registers independently of USE registers.
-enum class RATiedFlags : uint32_t {
- //! No flags.
- kNone = 0,
-
- // Access Flags
- // ------------
-
- //! Register is read.
- kRead = uint32_t(OpRWFlags::kRead),
- //! Register is written.
- kWrite = uint32_t(OpRWFlags::kWrite),
- //! Register both read and written.
- kRW = uint32_t(OpRWFlags::kRW),
-
- // Use / Out Flags
- // ---------------
-
- //! Register has a USE slot (read/rw).
- kUse = 0x00000004u,
- //! Register has an OUT slot (write-only).
- kOut = 0x00000008u,
- //! Register in USE slot can be patched to memory.
- kUseRM = 0x00000010u,
- //! Register in OUT slot can be patched to memory.
- kOutRM = 0x00000020u,
-
- //! Register has a fixed USE slot.
- kUseFixed = 0x00000040u,
- //! Register has a fixed OUT slot.
- kOutFixed = 0x00000080u,
- //! Register USE slot has been allocated.
- kUseDone = 0x00000100u,
- //! Register OUT slot has been allocated.
- kOutDone = 0x00000200u,
-
- // Consecutive Flags / Data
- // ------------------------
-
- kUseConsecutive = 0x00000400u,
- kOutConsecutive = 0x00000800u,
- kLeadConsecutive = 0x00001000u,
- kConsecutiveData = 0x00006000u,
-
- // Other Constraints
- // -----------------
-
- kUnique = 0x00008000u,
-
- // Liveness Flags
- // --------------
-
- //! Register must be duplicated (function call only).
- kDuplicate = 0x00010000u,
- //! Last occurrence of this VirtReg in basic block.
- kLast = 0x00020000u,
- //! Kill this VirtReg after use.
- kKill = 0x00040000u,
-
- // X86 Specific Flags
- // ------------------
-
- // Architecture specific flags are used during RATiedReg building to ensure that architecture-specific constraints
- // are handled properly. These flags are not really needed after RATiedReg[] is built and copied to `RAInst`.
-
- //! This RATiedReg references GPB-LO or GPB-HI.
- kX86_Gpb = 0x01000000u,
-
- // Instruction Flags (Never used by RATiedReg)
- // -------------------------------------------
-
- //! Instruction is transformable to another instruction if necessary.
- //!
- //! This is flag that is only used by \ref RAInst to inform register allocator that the instruction has some
- //! constraints that can only be solved by transforming the instruction into another instruction, most likely
- //! by changing its InstId.
- kInst_IsTransformable = 0x80000000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(RATiedFlags)
-
-static_assert(uint32_t(RATiedFlags::kRead ) == 0x1, "RATiedFlags::kRead must be 0x1");
-static_assert(uint32_t(RATiedFlags::kWrite) == 0x2, "RATiedFlags::kWrite must be 0x2");
-static_assert(uint32_t(RATiedFlags::kRW ) == 0x3, "RATiedFlags::kRW must be 0x3");
-
-//! Tied register merges one ore more register operand into a single entity. It contains information about its access
-//! (Read|Write) and allocation slots (Use|Out) that are used by the register allocator and liveness analysis.
-struct RATiedReg {
- //! \name Members
- //! \{
-
- //! WorkReg id.
- uint32_t _workId;
- //! WorkReg id that is an immediate consecutive parent of this register, or Globals::kInvalidId if it has no parent.
- uint32_t _consecutiveParent;
- //! Allocation flags.
- RATiedFlags _flags;
-
- union {
- struct {
- //! How many times the VirtReg is referenced in all operands.
- uint8_t _refCount;
- //! Size of a memory operand in case that it's use instead of the register.
- uint8_t _rmSize;
- //! Physical register for use operation (ReadOnly / ReadWrite).
- uint8_t _useId;
- //! Physical register for out operation (WriteOnly).
- uint8_t _outId;
- };
- //! Packed data.
- uint32_t _packed;
- };
-
- //! Registers where inputs {R|X} can be allocated to.
- RegMask _useRegMask;
- //! Registers where outputs {W} can be allocated to.
- RegMask _outRegMask;
- //! Indexes used to rewrite USE regs.
- uint32_t _useRewriteMask;
- //! Indexes used to rewrite OUT regs.
- uint32_t _outRewriteMask;
-
- //! \}
-
- //! \name Statics
- //! \{
-
- static inline RATiedFlags consecutiveDataToFlags(uint32_t offset) noexcept {
- ASMJIT_ASSERT(offset < 4);
- constexpr uint32_t kOffsetShift = Support::ConstCTZ<uint32_t(RATiedFlags::kConsecutiveData)>::value;
- return (RATiedFlags)(offset << kOffsetShift);
- }
-
- static inline uint32_t consecutiveDataFromFlags(RATiedFlags flags) noexcept {
- constexpr uint32_t kOffsetShift = Support::ConstCTZ<uint32_t(RATiedFlags::kConsecutiveData)>::value;
- return uint32_t(flags & RATiedFlags::kConsecutiveData) >> kOffsetShift;
- }
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- inline void init(uint32_t workId, RATiedFlags flags, RegMask useRegMask, uint32_t useId, uint32_t useRewriteMask, RegMask outRegMask, uint32_t outId, uint32_t outRewriteMask, uint32_t rmSize = 0, uint32_t consecutiveParent = Globals::kInvalidId) noexcept {
- _workId = workId;
- _consecutiveParent = consecutiveParent;
- _flags = flags;
- _refCount = 1;
- _rmSize = uint8_t(rmSize);
- _useId = uint8_t(useId);
- _outId = uint8_t(outId);
- _useRegMask = useRegMask;
- _outRegMask = outRegMask;
- _useRewriteMask = useRewriteMask;
- _outRewriteMask = outRewriteMask;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the associated WorkReg id.
- ASMJIT_INLINE_NODEBUG uint32_t workId() const noexcept { return _workId; }
-
- ASMJIT_INLINE_NODEBUG bool hasConsecutiveParent() const noexcept { return _consecutiveParent != Globals::kInvalidId; }
- ASMJIT_INLINE_NODEBUG uint32_t consecutiveParent() const noexcept { return _consecutiveParent; }
- ASMJIT_INLINE_NODEBUG uint32_t consecutiveData() const noexcept { return consecutiveDataFromFlags(_flags); }
-
- //! Returns TiedReg flags.
- ASMJIT_INLINE_NODEBUG RATiedFlags flags() const noexcept { return _flags; }
- //! Checks if the given `flag` is set.
- ASMJIT_INLINE_NODEBUG bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); }
- //! Adds tied register flags.
- ASMJIT_INLINE_NODEBUG void addFlags(RATiedFlags flags) noexcept { _flags |= flags; }
-
- //! Tests whether the register is read (writes `true` also if it's Read/Write).
- ASMJIT_INLINE_NODEBUG bool isRead() const noexcept { return hasFlag(RATiedFlags::kRead); }
- //! Tests whether the register is written (writes `true` also if it's Read/Write).
- ASMJIT_INLINE_NODEBUG bool isWrite() const noexcept { return hasFlag(RATiedFlags::kWrite); }
- //! Tests whether the register is read only.
- ASMJIT_INLINE_NODEBUG bool isReadOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRead; }
- //! Tests whether the register is write only.
- ASMJIT_INLINE_NODEBUG bool isWriteOnly() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kWrite; }
- //! Tests whether the register is read and written.
- ASMJIT_INLINE_NODEBUG bool isReadWrite() const noexcept { return (_flags & RATiedFlags::kRW) == RATiedFlags::kRW; }
-
- //! Tests whether the tied register has use operand (Read/ReadWrite).
- ASMJIT_INLINE_NODEBUG bool isUse() const noexcept { return hasFlag(RATiedFlags::kUse); }
- //! Tests whether the tied register has out operand (Write).
- ASMJIT_INLINE_NODEBUG bool isOut() const noexcept { return hasFlag(RATiedFlags::kOut); }
-
- //! Tests whether the tied register has \ref RATiedFlags::kLeadConsecutive flag set.
- ASMJIT_INLINE_NODEBUG bool isLeadConsecutive() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive); }
- //! Tests whether the tied register has \ref RATiedFlags::kUseConsecutive flag set.
- ASMJIT_INLINE_NODEBUG bool isUseConsecutive() const noexcept { return hasFlag(RATiedFlags::kUseConsecutive); }
- //! Tests whether the tied register has \ref RATiedFlags::kOutConsecutive flag set.
- ASMJIT_INLINE_NODEBUG bool isOutConsecutive() const noexcept { return hasFlag(RATiedFlags::kOutConsecutive); }
-
- //! Tests whether the tied register must be unique (cannot be allocated to any other allocated register).
- ASMJIT_INLINE_NODEBUG bool isUnique() const noexcept { return hasFlag(RATiedFlags::kUnique); }
-
- //! Tests whether the tied register has any consecutive flag.
- ASMJIT_INLINE_NODEBUG bool hasAnyConsecutiveFlag() const noexcept { return hasFlag(RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive); }
-
- //! Tests whether the USE slot can be patched to memory operand.
- ASMJIT_INLINE_NODEBUG bool hasUseRM() const noexcept { return hasFlag(RATiedFlags::kUseRM); }
- //! Tests whether the OUT slot can be patched to memory operand.
- ASMJIT_INLINE_NODEBUG bool hasOutRM() const noexcept { return hasFlag(RATiedFlags::kOutRM); }
-
- ASMJIT_INLINE_NODEBUG uint32_t rmSize() const noexcept { return _rmSize; }
-
- inline void makeReadOnly() noexcept {
- _flags = (_flags & ~(RATiedFlags::kOut | RATiedFlags::kWrite)) | RATiedFlags::kUse;
- _useRewriteMask |= _outRewriteMask;
- _outRewriteMask = 0;
- }
-
- inline void makeWriteOnly() noexcept {
- _flags = (_flags & ~(RATiedFlags::kUse | RATiedFlags::kRead)) | RATiedFlags::kOut;
- _outRewriteMask |= _useRewriteMask;
- _useRewriteMask = 0;
- }
-
- //! Tests whether the register would duplicate.
- ASMJIT_INLINE_NODEBUG bool isDuplicate() const noexcept { return hasFlag(RATiedFlags::kDuplicate); }
-
- //! Tests whether the register (and the instruction it's part of) appears last in the basic block.
- ASMJIT_INLINE_NODEBUG bool isLast() const noexcept { return hasFlag(RATiedFlags::kLast); }
- //! Tests whether the register should be killed after USEd and/or OUTed.
- ASMJIT_INLINE_NODEBUG bool isKill() const noexcept { return hasFlag(RATiedFlags::kKill); }
-
- //! Tests whether the register is OUT or KILL (used internally by local register allocator).
- ASMJIT_INLINE_NODEBUG bool isOutOrKill() const noexcept { return hasFlag(RATiedFlags::kOut | RATiedFlags::kKill); }
-
- //! Returns a register mask that describes allocable USE registers (Read/ReadWrite access).
- ASMJIT_INLINE_NODEBUG RegMask useRegMask() const noexcept { return _useRegMask; }
- //! Returns a register mask that describes allocable OUT registers (WriteOnly access).
- ASMJIT_INLINE_NODEBUG RegMask outRegMask() const noexcept { return _outRegMask; }
-
- ASMJIT_INLINE_NODEBUG uint32_t refCount() const noexcept { return _refCount; }
- ASMJIT_INLINE_NODEBUG void addRefCount(uint32_t n = 1) noexcept { _refCount = uint8_t(_refCount + n); }
-
- //! Tests whether the register must be allocated to a fixed physical register before it's used.
- ASMJIT_INLINE_NODEBUG bool hasUseId() const noexcept { return _useId != BaseReg::kIdBad; }
- //! Tests whether the register must be allocated to a fixed physical register before it's written.
- ASMJIT_INLINE_NODEBUG bool hasOutId() const noexcept { return _outId != BaseReg::kIdBad; }
-
- //! Returns a physical register id used for 'use' operation.
- ASMJIT_INLINE_NODEBUG uint32_t useId() const noexcept { return _useId; }
- //! Returns a physical register id used for 'out' operation.
- ASMJIT_INLINE_NODEBUG uint32_t outId() const noexcept { return _outId; }
-
- ASMJIT_INLINE_NODEBUG uint32_t useRewriteMask() const noexcept { return _useRewriteMask; }
- ASMJIT_INLINE_NODEBUG uint32_t outRewriteMask() const noexcept { return _outRewriteMask; }
-
- //! Sets a physical register used for 'use' operation.
- ASMJIT_INLINE_NODEBUG void setUseId(uint32_t index) noexcept { _useId = uint8_t(index); }
- //! Sets a physical register used for 'out' operation.
- ASMJIT_INLINE_NODEBUG void setOutId(uint32_t index) noexcept { _outId = uint8_t(index); }
-
- ASMJIT_INLINE_NODEBUG bool isUseDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); }
- ASMJIT_INLINE_NODEBUG bool isOutDone() const noexcept { return hasFlag(RATiedFlags::kUseDone); }
-
- ASMJIT_INLINE_NODEBUG void markUseDone() noexcept { addFlags(RATiedFlags::kUseDone); }
- ASMJIT_INLINE_NODEBUG void markOutDone() noexcept { addFlags(RATiedFlags::kUseDone); }
-
- //! \}
-};
-
-//! Flags used by \ref RAWorkReg.
-enum class RAWorkRegFlags : uint32_t {
- //! No flags.
- kNone = 0,
-
- //! This register has already been allocated.
- kAllocated = 0x00000001u,
- //! Has been coalesced to another WorkReg.
- kCoalesced = 0x00000002u,
-
- //! Set when this register is used as a LEAD consecutive register at least once.
- kLeadConsecutive = 0x00000004u,
- //! Used to mark consecutive registers during processing.
- kProcessedConsecutive = 0x00000008u,
-
- //! Stack slot has to be allocated.
- kStackUsed = 0x00000010u,
- //! Stack allocation is preferred.
- kStackPreferred = 0x00000020u,
- //! Marked for stack argument reassignment.
- kStackArgToStack = 0x00000040u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(RAWorkRegFlags)
-
-//! Work register provides additional data of \ref VirtReg that is used by register allocator.
-//!
-//! In general when a virtual register is found by register allocator it maps it to \ref RAWorkReg
-//! and then only works with it. The reason for such mapping is that users can create many virtual
-//! registers, which are not used inside a register allocation scope (which is currently always a
-//! function). So register allocator basically scans the function for virtual registers and maps
-//! them into WorkRegs, which receive a temporary ID (workId), which starts from zero. This WorkId
-//! is then used in bit-arrays and other mappings.
-class RAWorkReg {
-public:
- ASMJIT_NONCOPYABLE(RAWorkReg)
-
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- kIdNone = 0xFFFFFFFFu
- };
-
- enum : uint32_t {
- kNoArgIndex = 0xFFu
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! RAPass specific ID used during analysis and allocation.
- uint32_t _workId = 0;
- //! Copy of ID used by \ref VirtReg.
- uint32_t _virtId = 0;
-
- //! Permanent association with \ref VirtReg.
- VirtReg* _virtReg = nullptr;
- //! Temporary association with \ref RATiedReg.
- RATiedReg* _tiedReg = nullptr;
- //! Stack slot associated with the register.
- RAStackSlot* _stackSlot = nullptr;
-
- //! Copy of a signature used by \ref VirtReg.
- OperandSignature _signature {};
- //! RAPass specific flags used during analysis and allocation.
- RAWorkRegFlags _flags = RAWorkRegFlags::kNone;
-
- //! Constains all USE ids collected from all instructions.
- //!
- //! If this mask is non-zero and not a power of two, it means that the register is used multiple times in
- //! instructions where it requires to have a different use ID. This means that in general it's not possible
- //! to keep this register in a single home.
- RegMask _useIdMask = 0;
- //! Preferred mask of registers (if non-zero) to allocate this register to.
- //!
- //! If this mask is zero it means that either there is no intersection of preferred registers collected from all
- //! TiedRegs or there is no preference at all (the register can be allocated to any register all the time).
- RegMask _preferredMask = 0xFFFFFFFFu;
- //! Consecutive mask, which was collected from all instructions where this register was used as a lead consecutive
- //! register.
- RegMask _consecutiveMask = 0xFFFFFFFFu;
- //! IDs of all physical registers that are clobbered during the lifetime of this WorkReg.
- //!
- //! This mask should be updated by `RAPass::buildLiveness()`, because it's global and should
- //! be updated after unreachable code has been removed.
- RegMask _clobberSurvivalMask = 0;
- //! IDs of all physical registers this WorkReg has been allocated to.
- RegMask _allocatedMask = 0;
-
- //! A byte-mask where each bit represents one valid byte of the register.
- uint64_t _regByteMask = 0;
-
- //! Argument index (or `kNoArgIndex` if none).
- uint8_t _argIndex = kNoArgIndex;
- //! Argument value index in the pack (0 by default).
- uint8_t _argValueIndex = 0;
- //! Global home register ID (if any, assigned by RA).
- uint8_t _homeRegId = BaseReg::kIdBad;
- //! Global hint register ID (provided by RA or user).
- uint8_t _hintRegId = BaseReg::kIdBad;
-
- //! Live spans of the `VirtReg`.
- LiveRegSpans _liveSpans {};
- //! Live statistics.
- RALiveStats _liveStats {};
-
- //! All nodes that read/write this VirtReg/WorkReg.
- ZoneVector<BaseNode*> _refs {};
- //! All nodes that write to this VirtReg/WorkReg.
- ZoneVector<BaseNode*> _writes {};
-
- //! Contains work IDs of all immediate consecutive registers of this register.
- //!
- //! \note This bit array only contains immediate consecutives. This means that if this is a register that is
- //! followed by 3 more registers, then it would still have only a single immediate. The rest registers would
- //! have immediate consecutive registers as well, except the last one.
- ZoneBitVector _immediateConsecutives {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RAWorkReg(VirtReg* vReg, uint32_t workId) noexcept
- : _workId(workId),
- _virtId(vReg->id()),
- _virtReg(vReg),
- _signature(vReg->signature()) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG uint32_t workId() const noexcept { return _workId; }
- ASMJIT_INLINE_NODEBUG uint32_t virtId() const noexcept { return _virtId; }
-
- ASMJIT_INLINE_NODEBUG const char* name() const noexcept { return _virtReg->name(); }
- ASMJIT_INLINE_NODEBUG uint32_t nameSize() const noexcept { return _virtReg->nameSize(); }
-
- ASMJIT_INLINE_NODEBUG TypeId typeId() const noexcept { return _virtReg->typeId(); }
-
- ASMJIT_INLINE_NODEBUG RAWorkRegFlags flags() const noexcept { return _flags; }
- ASMJIT_INLINE_NODEBUG bool hasFlag(RAWorkRegFlags flag) const noexcept { return Support::test(_flags, flag); }
- ASMJIT_INLINE_NODEBUG void addFlags(RAWorkRegFlags flags) noexcept { _flags |= flags; }
-
- ASMJIT_INLINE_NODEBUG bool isAllocated() const noexcept { return hasFlag(RAWorkRegFlags::kAllocated); }
- ASMJIT_INLINE_NODEBUG void markAllocated() noexcept { addFlags(RAWorkRegFlags::kAllocated); }
-
- ASMJIT_INLINE_NODEBUG bool isLeadConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kLeadConsecutive); }
- ASMJIT_INLINE_NODEBUG void markLeadConsecutive() noexcept { addFlags(RAWorkRegFlags::kLeadConsecutive); }
-
- ASMJIT_INLINE_NODEBUG bool isProcessedConsecutive() const noexcept { return hasFlag(RAWorkRegFlags::kProcessedConsecutive); }
- ASMJIT_INLINE_NODEBUG void markProcessedConsecutive() noexcept { addFlags(RAWorkRegFlags::kProcessedConsecutive); }
-
- ASMJIT_INLINE_NODEBUG bool isStackUsed() const noexcept { return hasFlag(RAWorkRegFlags::kStackUsed); }
- ASMJIT_INLINE_NODEBUG void markStackUsed() noexcept { addFlags(RAWorkRegFlags::kStackUsed); }
-
- ASMJIT_INLINE_NODEBUG bool isStackPreferred() const noexcept { return hasFlag(RAWorkRegFlags::kStackPreferred); }
- ASMJIT_INLINE_NODEBUG void markStackPreferred() noexcept { addFlags(RAWorkRegFlags::kStackPreferred); }
-
- //! Tests whether this RAWorkReg has been coalesced with another one (cannot be used anymore).
- ASMJIT_INLINE_NODEBUG bool isCoalesced() const noexcept { return hasFlag(RAWorkRegFlags::kCoalesced); }
-
- ASMJIT_INLINE_NODEBUG OperandSignature signature() const noexcept { return _signature; }
- ASMJIT_INLINE_NODEBUG RegType type() const noexcept { return _signature.regType(); }
- ASMJIT_INLINE_NODEBUG RegGroup group() const noexcept { return _signature.regGroup(); }
-
- ASMJIT_INLINE_NODEBUG VirtReg* virtReg() const noexcept { return _virtReg; }
-
- ASMJIT_INLINE_NODEBUG bool hasTiedReg() const noexcept { return _tiedReg != nullptr; }
- ASMJIT_INLINE_NODEBUG RATiedReg* tiedReg() const noexcept { return _tiedReg; }
- ASMJIT_INLINE_NODEBUG void setTiedReg(RATiedReg* tiedReg) noexcept { _tiedReg = tiedReg; }
- ASMJIT_INLINE_NODEBUG void resetTiedReg() noexcept { _tiedReg = nullptr; }
-
- ASMJIT_INLINE_NODEBUG bool hasStackSlot() const noexcept { return _stackSlot != nullptr; }
- ASMJIT_INLINE_NODEBUG RAStackSlot* stackSlot() const noexcept { return _stackSlot; }
-
- ASMJIT_INLINE_NODEBUG LiveRegSpans& liveSpans() noexcept { return _liveSpans; }
- ASMJIT_INLINE_NODEBUG const LiveRegSpans& liveSpans() const noexcept { return _liveSpans; }
-
- ASMJIT_INLINE_NODEBUG RALiveStats& liveStats() noexcept { return _liveStats; }
- ASMJIT_INLINE_NODEBUG const RALiveStats& liveStats() const noexcept { return _liveStats; }
-
- ASMJIT_INLINE_NODEBUG bool hasArgIndex() const noexcept { return _argIndex != kNoArgIndex; }
- ASMJIT_INLINE_NODEBUG uint32_t argIndex() const noexcept { return _argIndex; }
- ASMJIT_INLINE_NODEBUG uint32_t argValueIndex() const noexcept { return _argValueIndex; }
-
- inline void setArgIndex(uint32_t argIndex, uint32_t valueIndex) noexcept {
- _argIndex = uint8_t(argIndex);
- _argValueIndex = uint8_t(valueIndex);
- }
-
- ASMJIT_INLINE_NODEBUG bool hasHomeRegId() const noexcept { return _homeRegId != BaseReg::kIdBad; }
- ASMJIT_INLINE_NODEBUG uint32_t homeRegId() const noexcept { return _homeRegId; }
- ASMJIT_INLINE_NODEBUG void setHomeRegId(uint32_t physId) noexcept { _homeRegId = uint8_t(physId); }
-
- ASMJIT_INLINE_NODEBUG bool hasHintRegId() const noexcept { return _hintRegId != BaseReg::kIdBad; }
- ASMJIT_INLINE_NODEBUG uint32_t hintRegId() const noexcept { return _hintRegId; }
- ASMJIT_INLINE_NODEBUG void setHintRegId(uint32_t physId) noexcept { _hintRegId = uint8_t(physId); }
-
- ASMJIT_INLINE_NODEBUG RegMask useIdMask() const noexcept { return _useIdMask; }
- ASMJIT_INLINE_NODEBUG bool hasUseIdMask() const noexcept { return _useIdMask != 0u; }
- ASMJIT_INLINE_NODEBUG bool hasMultipleUseIds() const noexcept { return _useIdMask != 0u && !Support::isPowerOf2(_useIdMask); }
- ASMJIT_INLINE_NODEBUG void addUseIdMask(RegMask mask) noexcept { _useIdMask |= mask; }
-
- ASMJIT_INLINE_NODEBUG RegMask preferredMask() const noexcept { return _preferredMask; }
- ASMJIT_INLINE_NODEBUG bool hasPreferredMask() const noexcept { return _preferredMask != 0xFFFFFFFFu; }
- ASMJIT_INLINE_NODEBUG void restrictPreferredMask(RegMask mask) noexcept { _preferredMask &= mask; }
-
- ASMJIT_INLINE_NODEBUG RegMask consecutiveMask() const noexcept { return _consecutiveMask; }
- ASMJIT_INLINE_NODEBUG bool hasConsecutiveMask() const noexcept { return _consecutiveMask != 0xFFFFFFFFu; }
- ASMJIT_INLINE_NODEBUG void restrictConsecutiveMask(RegMask mask) noexcept { _consecutiveMask &= mask; }
-
- ASMJIT_INLINE_NODEBUG RegMask clobberSurvivalMask() const noexcept { return _clobberSurvivalMask; }
- ASMJIT_INLINE_NODEBUG void addClobberSurvivalMask(RegMask mask) noexcept { _clobberSurvivalMask |= mask; }
-
- ASMJIT_INLINE_NODEBUG RegMask allocatedMask() const noexcept { return _allocatedMask; }
- ASMJIT_INLINE_NODEBUG void addAllocatedMask(RegMask mask) noexcept { _allocatedMask |= mask; }
-
- ASMJIT_INLINE_NODEBUG uint64_t regByteMask() const noexcept { return _regByteMask; }
- ASMJIT_INLINE_NODEBUG void setRegByteMask(uint64_t mask) noexcept { _regByteMask = mask; }
-
- ASMJIT_INLINE_NODEBUG bool hasImmediateConsecutives() const noexcept { return !_immediateConsecutives.empty(); }
- ASMJIT_INLINE_NODEBUG const ZoneBitVector& immediateConsecutives() const noexcept { return _immediateConsecutives; }
-
- inline Error addImmediateConsecutive(ZoneAllocator* allocator, uint32_t workId) noexcept {
- if (_immediateConsecutives.size() <= workId)
- ASMJIT_PROPAGATE(_immediateConsecutives.resize(allocator, workId + 1));
-
- _immediateConsecutives.setBit(workId, true);
- return kErrorOk;
- }
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_RADEFS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/ralocal.cpp b/3rdparty/asmjit/src/asmjit/core/ralocal.cpp
deleted file mode 100644
index 16f11a800c5..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/ralocal.cpp
+++ /dev/null
@@ -1,1170 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/ralocal_p.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// RALocalAllocator - Utilities
-// ============================
-
-static ASMJIT_FORCE_INLINE RATiedReg* RALocal_findTiedRegByWorkId(RATiedReg* tiedRegs, size_t count, uint32_t workId) noexcept {
- for (size_t i = 0; i < count; i++)
- if (tiedRegs[i].workId() == workId)
- return &tiedRegs[i];
- return nullptr;
-}
-
-// RALocalAllocator - Initialization & Reset
-// =========================================
-
-Error RALocalAllocator::init() noexcept {
- PhysToWorkMap* physToWorkMap;
- WorkToPhysMap* workToPhysMap;
-
- physToWorkMap = _pass->newPhysToWorkMap();
- workToPhysMap = _pass->newWorkToPhysMap();
- if (!physToWorkMap || !workToPhysMap)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _curAssignment.initLayout(_pass->_physRegCount, _pass->workRegs());
- _curAssignment.initMaps(physToWorkMap, workToPhysMap);
-
- physToWorkMap = _pass->newPhysToWorkMap();
- workToPhysMap = _pass->newWorkToPhysMap();
- _tmpWorkToPhysMap = _pass->newWorkToPhysMap();
-
- if (!physToWorkMap || !workToPhysMap || !_tmpWorkToPhysMap)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _tmpAssignment.initLayout(_pass->_physRegCount, _pass->workRegs());
- _tmpAssignment.initMaps(physToWorkMap, workToPhysMap);
-
- return kErrorOk;
-}
-
-// RALocalAllocator - Assignment
-// =============================
-
-Error RALocalAllocator::makeInitialAssignment() noexcept {
- FuncNode* func = _pass->func();
- RABlock* entry = _pass->entryBlock();
-
- ZoneBitVector& liveIn = entry->liveIn();
- uint32_t argCount = func->argCount();
- uint32_t numIter = 1;
-
- for (uint32_t iter = 0; iter < numIter; iter++) {
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- // Unassigned argument.
- const RegOnly& regArg = func->argPack(argIndex)[valueIndex];
- if (!regArg.isReg() || !_cc->isVirtIdValid(regArg.id()))
- continue;
-
- VirtReg* virtReg = _cc->virtRegById(regArg.id());
-
- // Unreferenced argument.
- RAWorkReg* workReg = virtReg->workReg();
- if (!workReg)
- continue;
-
- // Overwritten argument.
- uint32_t workId = workReg->workId();
- if (!liveIn.bitAt(workId))
- continue;
-
- RegGroup group = workReg->group();
- if (_curAssignment.workToPhysId(group, workId) != RAAssignment::kPhysNone)
- continue;
-
- RegMask allocableRegs = _availableRegs[group] & ~_curAssignment.assigned(group);
- if (iter == 0) {
- // First iteration: Try to allocate to home RegId.
- if (workReg->hasHomeRegId()) {
- uint32_t physId = workReg->homeRegId();
- if (Support::bitTest(allocableRegs, physId)) {
- _curAssignment.assign(group, workId, physId, true);
- _pass->_argsAssignment.assignRegInPack(argIndex, valueIndex, workReg->type(), physId, workReg->typeId());
- continue;
- }
- }
-
- numIter = 2;
- }
- else {
- // Second iteration: Pick any other register if the is an unassigned one or assign to stack.
- if (allocableRegs) {
- uint32_t physId = Support::ctz(allocableRegs);
- _curAssignment.assign(group, workId, physId, true);
- _pass->_argsAssignment.assignRegInPack(argIndex, valueIndex, workReg->type(), physId, workReg->typeId());
- }
- else {
- // This register will definitely need stack, create the slot now and assign also `argIndex`
- // to it. We will patch `_argsAssignment` later after RAStackAllocator finishes.
- RAStackSlot* slot = _pass->getOrCreateStackSlot(workReg);
- if (ASMJIT_UNLIKELY(!slot))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // This means STACK_ARG may be moved to STACK.
- workReg->addFlags(RAWorkRegFlags::kStackArgToStack);
- _pass->_numStackArgsToStackSlots++;
- }
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-Error RALocalAllocator::replaceAssignment(const PhysToWorkMap* physToWorkMap) noexcept {
- _curAssignment.copyFrom(physToWorkMap);
- return kErrorOk;
-}
-
-Error RALocalAllocator::switchToAssignment(PhysToWorkMap* dstPhysToWorkMap, const ZoneBitVector& liveIn, bool dstReadOnly, bool tryMode) noexcept {
- RAAssignment dst;
- RAAssignment& cur = _curAssignment;
-
- dst.initLayout(_pass->_physRegCount, _pass->workRegs());
- dst.initMaps(dstPhysToWorkMap, _tmpWorkToPhysMap);
- dst.assignWorkIdsFromPhysIds();
-
- if (tryMode)
- return kErrorOk;
-
- for (RegGroup group : RegGroupVirtValues{}) {
- // STEP 1
- // ------
- //
- // - KILL all registers that are not live at `dst`,
- // - SPILL all registers that are not assigned at `dst`.
-
- if (!tryMode) {
- Support::BitWordIterator<RegMask> it(cur.assigned(group));
- while (it.hasNext()) {
- uint32_t physId = it.next();
- uint32_t workId = cur.physToWorkId(group, physId);
-
- // Must be true as we iterate over assigned registers.
- ASMJIT_ASSERT(workId != RAAssignment::kWorkNone);
-
- // KILL if it's not live on entry.
- if (!liveIn.bitAt(workId)) {
- onKillReg(group, workId, physId);
- continue;
- }
-
- // SPILL if it's not assigned on entry.
- uint32_t altId = dst.workToPhysId(group, workId);
- if (altId == RAAssignment::kPhysNone) {
- ASMJIT_PROPAGATE(onSpillReg(group, workId, physId));
- }
- }
- }
-
- // STEP 2
- // ------
- //
- // - MOVE and SWAP registers from their current assignments into their DST assignments.
- // - Build `willLoadRegs` mask of registers scheduled for `onLoadReg()`.
-
- // Current run-id (1 means more aggressive decisions).
- int32_t runId = -1;
- // Remaining registers scheduled for `onLoadReg()`.
- RegMask willLoadRegs = 0;
- // Remaining registers to be allocated in this loop.
- RegMask affectedRegs = dst.assigned(group);
-
- while (affectedRegs) {
- if (++runId == 2) {
- if (!tryMode)
- return DebugUtils::errored(kErrorInvalidState);
-
- // Stop in `tryMode` if we haven't done anything in past two rounds.
- break;
- }
-
- Support::BitWordIterator<RegMask> it(affectedRegs);
- while (it.hasNext()) {
- uint32_t physId = it.next();
- RegMask physMask = Support::bitMask<RegMask>(physId);
-
- uint32_t curWorkId = cur.physToWorkId(group, physId);
- uint32_t dstWorkId = dst.physToWorkId(group, physId);
-
- // The register must have assigned `dstWorkId` as we only iterate over assigned regs.
- ASMJIT_ASSERT(dstWorkId != RAAssignment::kWorkNone);
-
- if (curWorkId != RAAssignment::kWorkNone) {
- // Both assigned.
- if (curWorkId != dstWorkId) {
- // Wait a bit if this is the first run, we may avoid this if `curWorkId` moves out.
- if (runId <= 0)
- continue;
-
- uint32_t altPhysId = cur.workToPhysId(group, dstWorkId);
- if (altPhysId == RAAssignment::kPhysNone)
- continue;
-
- // Reset as we will do some changes to the current assignment.
- runId = -1;
-
- if (_archTraits->hasInstRegSwap(group)) {
- ASMJIT_PROPAGATE(onSwapReg(group, curWorkId, physId, dstWorkId, altPhysId));
- }
- else {
- // SPILL the reg if it's not dirty in DST, otherwise try to MOVE.
- if (!cur.isPhysDirty(group, physId)) {
- ASMJIT_PROPAGATE(onKillReg(group, curWorkId, physId));
- }
- else {
- RegMask allocableRegs = _pass->_availableRegs[group] & ~cur.assigned(group);
-
- // If possible don't conflict with assigned regs at DST.
- if (allocableRegs & ~dst.assigned(group))
- allocableRegs &= ~dst.assigned(group);
-
- if (allocableRegs) {
- // MOVE is possible, thus preferred.
- uint32_t tmpPhysId = Support::ctz(allocableRegs);
-
- ASMJIT_PROPAGATE(onMoveReg(group, curWorkId, tmpPhysId, physId));
- _pass->_clobberedRegs[group] |= Support::bitMask(tmpPhysId);
- }
- else {
- // MOVE is impossible, must SPILL.
- ASMJIT_PROPAGATE(onSpillReg(group, curWorkId, physId));
- }
- }
-
- goto Cleared;
- }
- }
- }
- else {
-Cleared:
- // DST assigned, CUR unassigned.
- uint32_t altPhysId = cur.workToPhysId(group, dstWorkId);
- if (altPhysId == RAAssignment::kPhysNone) {
- if (liveIn.bitAt(dstWorkId))
- willLoadRegs |= physMask; // Scheduled for `onLoadReg()`.
- affectedRegs &= ~physMask; // Unaffected from now.
- continue;
- }
- ASMJIT_PROPAGATE(onMoveReg(group, dstWorkId, physId, altPhysId));
- }
-
- // Both DST and CUR assigned to the same reg or CUR just moved to DST.
- if ((dst.dirty(group) & physMask) != (cur.dirty(group) & physMask)) {
- if ((dst.dirty(group) & physMask) == 0) {
- // CUR dirty, DST not dirty (the assert is just to visualize the condition).
- ASMJIT_ASSERT(!dst.isPhysDirty(group, physId) && cur.isPhysDirty(group, physId));
-
- // If `dstReadOnly` is true it means that that block was already processed and we cannot change from
- // CLEAN to DIRTY. In that case the register has to be saved as it cannot enter the block DIRTY.
- if (dstReadOnly)
- ASMJIT_PROPAGATE(onSaveReg(group, dstWorkId, physId));
- else
- dst.makeDirty(group, dstWorkId, physId);
- }
- else {
- // DST dirty, CUR not dirty (the assert is just to visualize the condition).
- ASMJIT_ASSERT(dst.isPhysDirty(group, physId) && !cur.isPhysDirty(group, physId));
-
- cur.makeDirty(group, dstWorkId, physId);
- }
- }
-
- // Must match now...
- ASMJIT_ASSERT(dst.physToWorkId(group, physId) == cur.physToWorkId(group, physId));
- ASMJIT_ASSERT(dst.isPhysDirty(group, physId) == cur.isPhysDirty(group, physId));
-
- runId = -1;
- affectedRegs &= ~physMask;
- }
- }
-
- // STEP 3
- // ------
- //
- // - Load registers specified by `willLoadRegs`.
-
- {
- Support::BitWordIterator<RegMask> it(willLoadRegs);
- while (it.hasNext()) {
- uint32_t physId = it.next();
-
- if (!cur.isPhysAssigned(group, physId)) {
- uint32_t workId = dst.physToWorkId(group, physId);
-
- // The algorithm is broken if it tries to load a register that is not in LIVE-IN.
- ASMJIT_ASSERT(liveIn.bitAt(workId) == true);
-
- ASMJIT_PROPAGATE(onLoadReg(group, workId, physId));
- if (dst.isPhysDirty(group, physId))
- cur.makeDirty(group, workId, physId);
- ASMJIT_ASSERT(dst.isPhysDirty(group, physId) == cur.isPhysDirty(group, physId));
- }
- else {
- // Not possible otherwise.
- ASMJIT_ASSERT(tryMode == true);
- }
- }
- }
- }
-
- if (!tryMode) {
- // Here is a code that dumps the conflicting part if something fails here:
- // if (!dst.equals(cur)) {
- // uint32_t physTotal = dst._layout.physTotal;
- // uint32_t workCount = dst._layout.workCount;
- //
- // fprintf(stderr, "Dirty DST=0x%08X CUR=0x%08X\n", dst.dirty(RegGroup::kGp), cur.dirty(RegGroup::kGp));
- // fprintf(stderr, "Assigned DST=0x%08X CUR=0x%08X\n", dst.assigned(RegGroup::kGp), cur.assigned(RegGroup::kGp));
- //
- // for (uint32_t physId = 0; physId < physTotal; physId++) {
- // uint32_t dstWorkId = dst._physToWorkMap->workIds[physId];
- // uint32_t curWorkId = cur._physToWorkMap->workIds[physId];
- // if (dstWorkId != curWorkId)
- // fprintf(stderr, "[PhysIdWork] PhysId=%u WorkId[DST(%u) != CUR(%u)]\n", physId, dstWorkId, curWorkId);
- // }
- //
- // for (uint32_t workId = 0; workId < workCount; workId++) {
- // uint32_t dstPhysId = dst._workToPhysMap->physIds[workId];
- // uint32_t curPhysId = cur._workToPhysMap->physIds[workId];
- // if (dstPhysId != curPhysId)
- // fprintf(stderr, "[WorkToPhys] WorkId=%u PhysId[DST(%u) != CUR(%u)]\n", workId, dstPhysId, curPhysId);
- // }
- // }
- ASMJIT_ASSERT(dst.equals(cur));
- }
-
- return kErrorOk;
-}
-
-Error RALocalAllocator::spillScratchGpRegsBeforeEntry(RegMask scratchRegs) noexcept {
- RegGroup group = RegGroup::kGp;
- Support::BitWordIterator<RegMask> it(scratchRegs);
-
- while (it.hasNext()) {
- uint32_t physId = it.next();
- if (_curAssignment.isPhysAssigned(group, physId)) {
- uint32_t workId = _curAssignment.physToWorkId(group, physId);
- ASMJIT_PROPAGATE(onSpillReg(group, workId, physId));
- }
- }
-
- return kErrorOk;
-}
-
-// RALocalAllocator - Allocation
-// =============================
-
-Error RALocalAllocator::allocInst(InstNode* node) noexcept {
- RAInst* raInst = node->passData<RAInst>();
-
- RATiedReg* outTiedRegs[Globals::kMaxPhysRegs];
- RATiedReg* dupTiedRegs[Globals::kMaxPhysRegs];
- RATiedReg* consecutiveRegs[kMaxConsecutiveRegs];
-
- // The cursor must point to the previous instruction for a possible instruction insertion.
- _cc->_setCursor(node->prev());
-
- _node = node;
- _raInst = raInst;
- _tiedTotal = raInst->_tiedTotal;
- _tiedCount = raInst->_tiedCount;
-
- // Whether we already replaced register operand with memory operand.
- bool rmAllocated = false;
-
- for (RegGroup group : RegGroupVirtValues{}) {
- uint32_t i, count = this->tiedCount(group);
- RATiedReg* tiedRegs = this->tiedRegs(group);
-
- RegMask willUse = _raInst->_usedRegs[group];
- RegMask willOut = _raInst->_clobberedRegs[group];
- RegMask willFree = 0;
-
- uint32_t usePending = count;
- uint32_t outTiedCount = 0;
- uint32_t dupTiedCount = 0;
- uint32_t consecutiveMask = 0;
-
- // STEP 1
- // ------
- //
- // Calculate `willUse` and `willFree` masks based on tied registers we have. In addition, aggregate information
- // regarding consecutive registers used by this instruction. We need that to make USE/OUT assignments.
- //
- // We don't do any assignment decisions at this stage as we just need to collect some information first. Then,
- // after we populate all masks needed we can finally make some decisions in the second loop. The main reason
- // for this is that we really need `willFree` to make assignment decisions for `willUse`, because if we mark
- // some registers that will be freed, we can consider them in decision making afterwards.
-
- for (i = 0; i < count; i++) {
- RATiedReg* tiedReg = &tiedRegs[i];
-
- if (tiedReg->hasAnyConsecutiveFlag()) {
- uint32_t consecutiveOffset = tiedReg->isLeadConsecutive() ? uint32_t(0) : tiedReg->consecutiveData();
-
- if (ASMJIT_UNLIKELY(Support::bitTest(consecutiveMask, consecutiveOffset)))
- return DebugUtils::errored(kErrorInvalidState);
-
- consecutiveMask |= Support::bitMask(consecutiveOffset);
- consecutiveRegs[consecutiveOffset] = tiedReg;
- }
-
- // Add OUT and KILL to `outPending` for CLOBBERing and/or OUT assignment.
- if (tiedReg->isOutOrKill())
- outTiedRegs[outTiedCount++] = tiedReg;
-
- if (tiedReg->isDuplicate())
- dupTiedRegs[dupTiedCount++] = tiedReg;
-
- if (!tiedReg->isUse()) {
- tiedReg->markUseDone();
- usePending--;
- continue;
- }
-
- // Don't assign anything here if this is a consecutive USE - we will handle this in STEP 2 instead.
- if (tiedReg->isUseConsecutive())
- continue;
-
- uint32_t workId = tiedReg->workId();
- uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
-
- if (tiedReg->hasUseId()) {
- // If the register has `useId` it means it can only be allocated in that register.
- RegMask useMask = Support::bitMask(tiedReg->useId());
-
- // RAInstBuilder must have collected `usedRegs` on-the-fly.
- ASMJIT_ASSERT((willUse & useMask) != 0);
-
- if (assignedId == tiedReg->useId()) {
- // If the register is already allocated in this one, mark it done and continue.
- tiedReg->markUseDone();
- if (tiedReg->isWrite())
- _curAssignment.makeDirty(group, workId, assignedId);
- usePending--;
- willUse |= useMask;
- }
- else {
- willFree |= useMask & _curAssignment.assigned(group);
- }
- }
- else {
- // Check if the register must be moved to `allocableRegs`.
- RegMask allocableRegs = tiedReg->useRegMask();
- if (assignedId != RAAssignment::kPhysNone) {
- RegMask assignedMask = Support::bitMask(assignedId);
- if ((allocableRegs & ~willUse) & assignedMask) {
- tiedReg->setUseId(assignedId);
- tiedReg->markUseDone();
- if (tiedReg->isWrite())
- _curAssignment.makeDirty(group, workId, assignedId);
- usePending--;
- willUse |= assignedMask;
- }
- else {
- willFree |= assignedMask;
- }
- }
- }
- }
-
- // STEP 2
- // ------
- //
- // Verify that all the consecutive registers are really consecutive. Terminate if there is a gap. In addition,
- // decide which USE ids will be used in case that this consecutive sequence is USE (OUT registers are allocated
- // in a different step).
- uint32_t consecutiveCount = 0;
-
- if (consecutiveMask) {
- if ((consecutiveMask & (consecutiveMask + 1u)) != 0)
- return DebugUtils::errored(kErrorInvalidState);
-
- // Count of trailing ones is the count of consecutive registers. There cannot be gap.
- consecutiveCount = Support::ctz(~consecutiveMask);
-
- // Prioritize allocation that would result in least moves even when moving registers away from their homes.
- RATiedReg* lead = consecutiveRegs[0];
-
- // Assign the best possible USE Ids to all consecutives.
- if (lead->isUseConsecutive()) {
- uint32_t bestScore = 0;
- uint32_t bestLeadReg = 0xFFFFFFFF;
- RegMask allocableRegs = (_availableRegs[group] | willFree) & ~willUse;
-
- uint32_t assignments[kMaxConsecutiveRegs];
-
- for (i = 0; i < consecutiveCount; i++)
- assignments[i] = _curAssignment.workToPhysId(group, consecutiveRegs[i]->workId());
-
- Support::BitWordIterator<uint32_t> it(lead->useRegMask());
- while (it.hasNext()) {
- uint32_t regIndex = it.next();
- if (Support::bitTest(lead->useRegMask(), regIndex)) {
- uint32_t score = 15;
-
- for (i = 0; i < consecutiveCount; i++) {
- uint32_t consecutiveIndex = regIndex + i;
- if (!Support::bitTest(allocableRegs, consecutiveIndex)) {
- score = 0;
- break;
- }
-
- RAWorkReg* workReg = workRegById(consecutiveRegs[i]->workId());
- score += uint32_t(workReg->homeRegId() == consecutiveIndex);
- score += uint32_t(assignments[i] == consecutiveIndex) * 2;
- }
-
- if (score > bestScore) {
- bestScore = score;
- bestLeadReg = regIndex;
- }
- }
- }
-
- if (bestLeadReg == 0xFFFFFFFF)
- return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
-
- for (i = 0; i < consecutiveCount; i++) {
- uint32_t consecutiveIndex = bestLeadReg + i;
-
- RATiedReg* tiedReg = consecutiveRegs[i];
- RegMask useMask = Support::bitMask(consecutiveIndex);
-
- uint32_t workId = tiedReg->workId();
- uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
-
- tiedReg->setUseId(consecutiveIndex);
-
- if (assignedId == consecutiveIndex) {
- // If the register is already allocated in this one, mark it done and continue.
- tiedReg->markUseDone();
- if (tiedReg->isWrite())
- _curAssignment.makeDirty(group, workId, assignedId);
- usePending--;
- willUse |= useMask;
- }
- else {
- willUse |= useMask;
- willFree |= useMask & _curAssignment.assigned(group);
- }
- }
- }
- }
-
- // STEP 3
- // ------
- //
- // Do some decision making to find the best candidates of registers that need to be assigned, moved, and/or
- // spilled. Only USE registers are considered here, OUT will be decided later after all CLOBBERed and OUT
- // registers are unassigned.
-
- if (usePending) {
- // TODO: Not sure `liveRegs` should be used, maybe willUse and willFree would be enough and much more clear.
-
- // All registers that are currently alive without registers that will be freed.
- RegMask liveRegs = _curAssignment.assigned(group) & ~willFree;
-
- for (i = 0; i < count; i++) {
- RATiedReg* tiedReg = &tiedRegs[i];
- if (tiedReg->isUseDone())
- continue;
-
- uint32_t workId = tiedReg->workId();
- uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
-
- // REG/MEM: Patch register operand to memory operand if not allocated.
- if (!rmAllocated && tiedReg->hasUseRM()) {
- if (assignedId == RAAssignment::kPhysNone && Support::isPowerOf2(tiedReg->useRewriteMask())) {
- RAWorkReg* workReg = workRegById(tiedReg->workId());
- uint32_t opIndex = Support::ctz(tiedReg->useRewriteMask()) / uint32_t(sizeof(Operand) / sizeof(uint32_t));
- uint32_t rmSize = tiedReg->rmSize();
-
- if (rmSize <= workReg->virtReg()->virtSize()) {
- Operand& op = node->operands()[opIndex];
- op = _pass->workRegAsMem(workReg);
- op.as<BaseMem>().setSize(rmSize);
- tiedReg->_useRewriteMask = 0;
-
- tiedReg->markUseDone();
- usePending--;
-
- rmAllocated = true;
- continue;
- }
- }
- }
-
- if (!tiedReg->hasUseId()) {
- // DECIDE where to assign the USE register.
- RegMask allocableRegs = tiedReg->useRegMask() & ~(willFree | willUse);
- uint32_t useId = decideOnAssignment(group, workId, assignedId, allocableRegs);
-
- RegMask useMask = Support::bitMask(useId);
- willUse |= useMask;
- willFree |= useMask & liveRegs;
- tiedReg->setUseId(useId);
-
- if (assignedId != RAAssignment::kPhysNone) {
- RegMask assignedMask = Support::bitMask(assignedId);
-
- willFree |= assignedMask;
- liveRegs &= ~assignedMask;
-
- // OPTIMIZATION: Assign the USE register here if it's possible.
- if (!(liveRegs & useMask)) {
- ASMJIT_PROPAGATE(onMoveReg(group, workId, useId, assignedId));
- tiedReg->markUseDone();
- if (tiedReg->isWrite())
- _curAssignment.makeDirty(group, workId, useId);
- usePending--;
- }
- }
- else {
- // OPTIMIZATION: Assign the USE register here if it's possible.
- if (!(liveRegs & useMask)) {
- ASMJIT_PROPAGATE(onLoadReg(group, workId, useId));
- tiedReg->markUseDone();
- if (tiedReg->isWrite())
- _curAssignment.makeDirty(group, workId, useId);
- usePending--;
- }
- }
-
- liveRegs |= useMask;
- }
- }
- }
-
- // Initially all used regs will be marked as clobbered.
- RegMask clobberedByInst = willUse | willOut;
-
- // STEP 4
- // ------
- //
- // Free all registers that we marked as `willFree`. Only registers that are not USEd by the instruction are
- // considered as we don't want to free regs we need.
-
- if (willFree) {
- RegMask allocableRegs = _availableRegs[group] & ~(_curAssignment.assigned(group) | willFree | willUse | willOut);
- Support::BitWordIterator<RegMask> it(willFree);
-
- do {
- uint32_t assignedId = it.next();
- if (_curAssignment.isPhysAssigned(group, assignedId)) {
- uint32_t workId = _curAssignment.physToWorkId(group, assignedId);
-
- // DECIDE whether to MOVE or SPILL.
- if (allocableRegs) {
- uint32_t reassignedId = decideOnReassignment(group, workId, assignedId, allocableRegs);
- if (reassignedId != RAAssignment::kPhysNone) {
- ASMJIT_PROPAGATE(onMoveReg(group, workId, reassignedId, assignedId));
- allocableRegs ^= Support::bitMask(reassignedId);
- continue;
- }
- }
-
- ASMJIT_PROPAGATE(onSpillReg(group, workId, assignedId));
- }
- } while (it.hasNext());
- }
-
- // STEP 5
- // ------
- //
- // ALLOCATE / SHUFFLE all registers that we marked as `willUse` and weren't allocated yet. This is a bit
- // complicated as the allocation is iterative. In some cases we have to wait before allocating a particual
- // physical register as it's still occupied by some other one, which we need to move before we can use it.
- // In this case we skip it and allocate another some other instead (making it free for another iteration).
- //
- // NOTE: Iterations are mostly important for complicated allocations like function calls, where there can
- // be up to N registers used at once. Asm instructions won't run the loop more than once in 99.9% of cases
- // as they use 2..3 registers in average.
-
- if (usePending) {
- bool mustSwap = false;
- do {
- uint32_t oldPending = usePending;
-
- for (i = 0; i < count; i++) {
- RATiedReg* thisTiedReg = &tiedRegs[i];
- if (thisTiedReg->isUseDone())
- continue;
-
- uint32_t thisWorkId = thisTiedReg->workId();
- uint32_t thisPhysId = _curAssignment.workToPhysId(group, thisWorkId);
-
- // This would be a bug, fatal one!
- uint32_t targetPhysId = thisTiedReg->useId();
- ASMJIT_ASSERT(targetPhysId != thisPhysId);
-
- uint32_t targetWorkId = _curAssignment.physToWorkId(group, targetPhysId);
- if (targetWorkId != RAAssignment::kWorkNone) {
- RAWorkReg* targetWorkReg = workRegById(targetWorkId);
-
- // Swapping two registers can solve two allocation tasks by emitting just a single instruction. However,
- // swap is only available on few architectures and it's definitely not available for each register group.
- // Calling `onSwapReg()` before checking these would be fatal.
- if (_archTraits->hasInstRegSwap(group) && thisPhysId != RAAssignment::kPhysNone) {
- ASMJIT_PROPAGATE(onSwapReg(group, thisWorkId, thisPhysId, targetWorkId, targetPhysId));
-
- thisTiedReg->markUseDone();
- if (thisTiedReg->isWrite())
- _curAssignment.makeDirty(group, thisWorkId, targetPhysId);
- usePending--;
-
- // Double-hit.
- RATiedReg* targetTiedReg = RALocal_findTiedRegByWorkId(tiedRegs, count, targetWorkReg->workId());
- if (targetTiedReg && targetTiedReg->useId() == thisPhysId) {
- targetTiedReg->markUseDone();
- if (targetTiedReg->isWrite())
- _curAssignment.makeDirty(group, targetWorkId, thisPhysId);
- usePending--;
- }
- continue;
- }
-
- if (!mustSwap)
- continue;
-
- // Only branched here if the previous iteration did nothing. This is essentially a SWAP operation without
- // having a dedicated instruction for that purpose (vector registers, etc). The simplest way to handle
- // such case is to SPILL the target register.
- ASMJIT_PROPAGATE(onSpillReg(group, targetWorkId, targetPhysId));
- }
-
- if (thisPhysId != RAAssignment::kPhysNone) {
- ASMJIT_PROPAGATE(onMoveReg(group, thisWorkId, targetPhysId, thisPhysId));
-
- thisTiedReg->markUseDone();
- if (thisTiedReg->isWrite())
- _curAssignment.makeDirty(group, thisWorkId, targetPhysId);
- usePending--;
- }
- else {
- ASMJIT_PROPAGATE(onLoadReg(group, thisWorkId, targetPhysId));
-
- thisTiedReg->markUseDone();
- if (thisTiedReg->isWrite())
- _curAssignment.makeDirty(group, thisWorkId, targetPhysId);
- usePending--;
- }
- }
-
- mustSwap = (oldPending == usePending);
- } while (usePending);
- }
-
- // STEP 6
- // ------
- //
- // KILL registers marked as KILL/OUT.
-
- uint32_t outPending = outTiedCount;
- if (outTiedCount) {
- for (i = 0; i < outTiedCount; i++) {
- RATiedReg* tiedReg = outTiedRegs[i];
-
- uint32_t workId = tiedReg->workId();
- uint32_t physId = _curAssignment.workToPhysId(group, workId);
-
- // Must check if it's allocated as KILL can be related to OUT (like KILL immediately after OUT, which could
- // mean the register is not assigned).
- if (physId != RAAssignment::kPhysNone) {
- ASMJIT_PROPAGATE(onKillReg(group, workId, physId));
- willOut &= ~Support::bitMask(physId);
- }
-
- // We still maintain number of pending registers for OUT assignment. So, if this is only KILL, not OUT, we
- // can safely decrement it.
- outPending -= !tiedReg->isOut();
- }
- }
-
- // STEP 7
- // ------
- //
- // SPILL registers that will be CLOBBERed. Since OUT and KILL were already processed this is used mostly to
- // handle function CALLs.
-
- if (willOut) {
- Support::BitWordIterator<RegMask> it(willOut);
- do {
- uint32_t physId = it.next();
- uint32_t workId = _curAssignment.physToWorkId(group, physId);
-
- if (workId == RAAssignment::kWorkNone)
- continue;
-
- ASMJIT_PROPAGATE(onSpillReg(group, workId, physId));
- } while (it.hasNext());
- }
-
- // STEP 8
- // ------
- //
- // Duplication.
-
- for (i = 0; i < dupTiedCount; i++) {
- RATiedReg* tiedReg = dupTiedRegs[i];
- uint32_t workId = tiedReg->workId();
- uint32_t srcId = tiedReg->useId();
-
- Support::BitWordIterator<RegMask> it(tiedReg->useRegMask());
- while (it.hasNext()) {
- uint32_t dstId = it.next();
- if (dstId == srcId)
- continue;
- _pass->emitMove(workId, dstId, srcId);
- }
- }
-
- // STEP 9
- // ------
- //
- // Vector registers can be cloberred partially by invoke - find if that's the case and clobber when necessary.
-
- if (node->isInvoke() && group == RegGroup::kVec) {
- const InvokeNode* invokeNode = node->as<InvokeNode>();
-
- RegMask maybeClobberedRegs = invokeNode->detail().callConv().preservedRegs(group) & _curAssignment.assigned(group);
- if (maybeClobberedRegs) {
- uint32_t saveRestoreVecSize = invokeNode->detail().callConv().saveRestoreRegSize(group);
- Support::BitWordIterator<RegMask> it(maybeClobberedRegs);
-
- do {
- uint32_t physId = it.next();
- uint32_t workId = _curAssignment.physToWorkId(group, physId);
-
- RAWorkReg* workReg = workRegById(workId);
- uint32_t virtSize = workReg->virtReg()->virtSize();
-
- if (virtSize > saveRestoreVecSize) {
- ASMJIT_PROPAGATE(onSpillReg(group, workId, physId));
- }
-
- } while (it.hasNext());
- }
- }
-
- // STEP 10
- // -------
- //
- // Assign OUT registers.
-
- if (outPending) {
- // Live registers, we need a separate register (outside of `_curAssignment) to hold these because of KILLed
- // registers. If we KILL a register here it will go out from `_curAssignment`, but we cannot assign to it in
- // here.
- RegMask liveRegs = _curAssignment.assigned(group);
-
- // Must avoid as they have been already OUTed (added during the loop).
- RegMask outRegs = 0;
-
- // Must avoid as they collide with already allocated ones.
- RegMask avoidRegs = willUse & ~clobberedByInst;
-
- // Assign the best possible OUT ids of all consecutives.
- if (consecutiveCount) {
- RATiedReg* lead = consecutiveRegs[0];
- if (lead->isOutConsecutive()) {
- uint32_t bestScore = 0;
- uint32_t bestLeadReg = 0xFFFFFFFF;
- RegMask allocableRegs = _availableRegs[group] & ~(outRegs | avoidRegs);
-
- Support::BitWordIterator<uint32_t> it(lead->outRegMask());
- while (it.hasNext()) {
- uint32_t regIndex = it.next();
- if (Support::bitTest(lead->outRegMask(), regIndex)) {
- uint32_t score = 15;
-
- for (i = 0; i < consecutiveCount; i++) {
- uint32_t consecutiveIndex = regIndex + i;
- if (!Support::bitTest(allocableRegs, consecutiveIndex)) {
- score = 0;
- break;
- }
-
- RAWorkReg* workReg = workRegById(consecutiveRegs[i]->workId());
- score += uint32_t(workReg->homeRegId() == consecutiveIndex);
- }
-
- if (score > bestScore) {
- bestScore = score;
- bestLeadReg = regIndex;
- }
- }
- }
-
- if (bestLeadReg == 0xFFFFFFFF)
- return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
-
- for (i = 0; i < consecutiveCount; i++) {
- uint32_t consecutiveIndex = bestLeadReg + i;
- RATiedReg* tiedReg = consecutiveRegs[i];
- tiedReg->setOutId(consecutiveIndex);
- }
- }
- }
-
- // Allocate OUT registers.
- for (i = 0; i < outTiedCount; i++) {
- RATiedReg* tiedReg = outTiedRegs[i];
- if (!tiedReg->isOut())
- continue;
-
- RegMask avoidOut = avoidRegs;
- if (tiedReg->isUnique())
- avoidOut |= willUse;
-
- uint32_t workId = tiedReg->workId();
- uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
-
- if (assignedId != RAAssignment::kPhysNone)
- ASMJIT_PROPAGATE(onKillReg(group, workId, assignedId));
-
- uint32_t physId = tiedReg->outId();
- if (physId == RAAssignment::kPhysNone) {
- RegMask allocableRegs = tiedReg->outRegMask() & ~(outRegs | avoidOut);
-
- if (!(allocableRegs & ~liveRegs)) {
- // There are no more registers, decide which one to spill.
- uint32_t spillWorkId;
- physId = decideOnSpillFor(group, workId, allocableRegs & liveRegs, &spillWorkId);
- ASMJIT_PROPAGATE(onSpillReg(group, spillWorkId, physId));
- }
- else {
- physId = decideOnAssignment(group, workId, RAAssignment::kPhysNone, allocableRegs & ~liveRegs);
- }
- }
-
- // OUTs are CLOBBERed thus cannot be ASSIGNed right now.
- ASMJIT_ASSERT(!_curAssignment.isPhysAssigned(group, physId));
-
- if (!tiedReg->isKill())
- ASMJIT_PROPAGATE(onAssignReg(group, workId, physId, true));
-
- tiedReg->setOutId(physId);
- tiedReg->markOutDone();
-
- outRegs |= Support::bitMask(physId);
- liveRegs &= ~Support::bitMask(physId);
- outPending--;
- }
-
- clobberedByInst |= outRegs;
- ASMJIT_ASSERT(outPending == 0);
- }
-
- _clobberedRegs[group] |= clobberedByInst;
- }
-
- return kErrorOk;
-}
-
-Error RALocalAllocator::spillAfterAllocation(InstNode* node) noexcept {
- // This is experimental feature that would spill registers that don't have home-id and are last in this basic block.
- // This prevents saving these regs in other basic blocks and then restoring them (mostly relevant for loops).
- RAInst* raInst = node->passData<RAInst>();
- uint32_t count = raInst->tiedCount();
-
- for (uint32_t i = 0; i < count; i++) {
- RATiedReg* tiedReg = raInst->tiedAt(i);
- if (tiedReg->isLast()) {
- uint32_t workId = tiedReg->workId();
- RAWorkReg* workReg = workRegById(workId);
- if (!workReg->hasHomeRegId()) {
- RegGroup group = workReg->group();
- uint32_t assignedId = _curAssignment.workToPhysId(group, workId);
- if (assignedId != RAAssignment::kPhysNone) {
- _cc->_setCursor(node);
- ASMJIT_PROPAGATE(onSpillReg(group, workId, assignedId));
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-Error RALocalAllocator::allocBranch(InstNode* node, RABlock* target, RABlock* cont) noexcept {
- // TODO: This should be used to make the branch allocation better.
- DebugUtils::unused(cont);
-
- // The cursor must point to the previous instruction for a possible instruction insertion.
- _cc->_setCursor(node->prev());
-
- // Use TryMode of `switchToAssignment()` if possible.
- if (target->hasEntryAssignment()) {
- ASMJIT_PROPAGATE(switchToAssignment(target->entryPhysToWorkMap(), target->liveIn(), target->isAllocated(), true));
- }
-
- ASMJIT_PROPAGATE(allocInst(node));
- ASMJIT_PROPAGATE(spillRegsBeforeEntry(target));
-
- if (target->hasEntryAssignment()) {
- BaseNode* injectionPoint = _pass->extraBlock()->prev();
- BaseNode* prevCursor = _cc->setCursor(injectionPoint);
-
- _tmpAssignment.copyFrom(_curAssignment);
- ASMJIT_PROPAGATE(switchToAssignment(target->entryPhysToWorkMap(), target->liveIn(), target->isAllocated(), false));
-
- BaseNode* curCursor = _cc->cursor();
- if (curCursor != injectionPoint) {
- // Additional instructions emitted to switch from the current state to the `target` state. This means
- // that we have to move these instructions into an independent code block and patch the jump location.
- Operand& targetOp = node->op(node->opCount() - 1);
- if (ASMJIT_UNLIKELY(!targetOp.isLabel()))
- return DebugUtils::errored(kErrorInvalidState);
-
- Label trampoline = _cc->newLabel();
- Label savedTarget = targetOp.as<Label>();
-
- // Patch `target` to point to the `trampoline` we just created.
- targetOp = trampoline;
-
- // Clear a possible SHORT form as we have no clue now if the SHORT form would be encodable after patching
- // the target to `trampoline` (X86 specific).
- node->clearOptions(InstOptions::kShortForm);
-
- // Finalize the switch assignment sequence.
- ASMJIT_PROPAGATE(_pass->emitJump(savedTarget));
- _cc->_setCursor(injectionPoint);
- _cc->bind(trampoline);
- }
-
- _cc->_setCursor(prevCursor);
- _curAssignment.swap(_tmpAssignment);
- }
- else {
- ASMJIT_PROPAGATE(_pass->setBlockEntryAssignment(target, block(), _curAssignment));
- }
-
- return kErrorOk;
-}
-
-Error RALocalAllocator::allocJumpTable(InstNode* node, const RABlocks& targets, RABlock* cont) noexcept {
- // TODO: Do we really need to use `cont`?
- DebugUtils::unused(cont);
-
- if (targets.empty())
- return DebugUtils::errored(kErrorInvalidState);
-
- // The cursor must point to the previous instruction for a possible instruction insertion.
- _cc->_setCursor(node->prev());
-
- // All `targets` should have the same sharedAssignmentId, we just read the first.
- RABlock* anyTarget = targets[0];
- if (!anyTarget->hasSharedAssignmentId())
- return DebugUtils::errored(kErrorInvalidState);
-
- RASharedAssignment& sharedAssignment = _pass->_sharedAssignments[anyTarget->sharedAssignmentId()];
-
- ASMJIT_PROPAGATE(allocInst(node));
-
- if (!sharedAssignment.empty()) {
- ASMJIT_PROPAGATE(switchToAssignment(
- sharedAssignment.physToWorkMap(),
- sharedAssignment.liveIn(),
- true, // Read-only.
- false // Try-mode.
- ));
- }
-
- ASMJIT_PROPAGATE(spillRegsBeforeEntry(anyTarget));
-
- if (sharedAssignment.empty()) {
- ASMJIT_PROPAGATE(_pass->setBlockEntryAssignment(anyTarget, block(), _curAssignment));
- }
-
- return kErrorOk;
-}
-
-// RALocalAllocator - Decision Making
-// ==================================
-
-uint32_t RALocalAllocator::decideOnAssignment(RegGroup group, uint32_t workId, uint32_t physId, RegMask allocableRegs) const noexcept {
- ASMJIT_ASSERT(allocableRegs != 0);
- DebugUtils::unused(group, physId);
-
- RAWorkReg* workReg = workRegById(workId);
-
- // Prefer home register id, if possible.
- if (workReg->hasHomeRegId()) {
- uint32_t homeId = workReg->homeRegId();
- if (Support::bitTest(allocableRegs, homeId))
- return homeId;
- }
-
- // Prefer registers used upon block entries.
- RegMask previouslyAssignedRegs = workReg->allocatedMask();
- if (allocableRegs & previouslyAssignedRegs)
- allocableRegs &= previouslyAssignedRegs;
-
- return Support::ctz(allocableRegs);
-}
-
-uint32_t RALocalAllocator::decideOnReassignment(RegGroup group, uint32_t workId, uint32_t physId, RegMask allocableRegs) const noexcept {
- ASMJIT_ASSERT(allocableRegs != 0);
- DebugUtils::unused(group, physId);
-
- RAWorkReg* workReg = workRegById(workId);
-
- // Prefer allocating back to HomeId, if possible.
- if (workReg->hasHomeRegId()) {
- if (Support::bitTest(allocableRegs, workReg->homeRegId()))
- return workReg->homeRegId();
- }
-
- // TODO: [Register Allocator] This could be improved.
-
- // Decided to SPILL.
- return RAAssignment::kPhysNone;
-}
-
-uint32_t RALocalAllocator::decideOnSpillFor(RegGroup group, uint32_t workId, RegMask spillableRegs, uint32_t* spillWorkId) const noexcept {
- // May be used in the future to decide which register would be best to spill so `workId` can be assigned.
- DebugUtils::unused(workId);
- ASMJIT_ASSERT(spillableRegs != 0);
-
- Support::BitWordIterator<RegMask> it(spillableRegs);
- uint32_t bestPhysId = it.next();
- uint32_t bestWorkId = _curAssignment.physToWorkId(group, bestPhysId);
-
- // Avoid calculating the cost model if there is only one spillable register.
- if (it.hasNext()) {
- uint32_t bestCost = calculateSpillCost(group, bestWorkId, bestPhysId);
- do {
- uint32_t localPhysId = it.next();
- uint32_t localWorkId = _curAssignment.physToWorkId(group, localPhysId);
- uint32_t localCost = calculateSpillCost(group, localWorkId, localPhysId);
-
- if (localCost < bestCost) {
- bestCost = localCost;
- bestPhysId = localPhysId;
- bestWorkId = localWorkId;
- }
- } while (it.hasNext());
- }
-
- *spillWorkId = bestWorkId;
- return bestPhysId;
-}
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/core/ralocal_p.h b/3rdparty/asmjit/src/asmjit/core/ralocal_p.h
deleted file mode 100644
index 63fd1b78aba..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/ralocal_p.h
+++ /dev/null
@@ -1,247 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_RALOCAL_P_H_INCLUDED
-#define ASMJIT_CORE_RALOCAL_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/raassignment_p.h"
-#include "../core/radefs_p.h"
-#include "../core/rapass_p.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_ra
-//! \{
-
-//! Local register allocator.
-class RALocalAllocator {
-public:
- ASMJIT_NONCOPYABLE(RALocalAllocator)
-
- typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
- typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
-
- //! Link to `BaseRAPass`.
- BaseRAPass* _pass {};
- //! Link to `BaseCompiler`.
- BaseCompiler* _cc {};
-
- //! Architecture traits.
- const ArchTraits* _archTraits {};
- //! Registers available to the allocator.
- RARegMask _availableRegs {};
- //! Registers clobbered by the allocator.
- RARegMask _clobberedRegs {};
-
- //! Register assignment (current).
- RAAssignment _curAssignment {};
- //! Register assignment used temporarily during assignment switches.
- RAAssignment _tmpAssignment {};
-
- //! Link to the current `RABlock`.
- RABlock* _block {};
- //! InstNode.
- InstNode* _node {};
- //! RA instruction.
- RAInst* _raInst {};
-
- //! Count of all TiedReg's.
- uint32_t _tiedTotal {};
- //! TiedReg's total counter.
- RARegCount _tiedCount {};
-
- //! Temporary workToPhysMap that can be used freely by the allocator.
- WorkToPhysMap* _tmpWorkToPhysMap {};
-
- //! \name Construction & Destruction
- //! \{
-
- inline explicit RALocalAllocator(BaseRAPass* pass) noexcept
- : _pass(pass),
- _cc(pass->cc()),
- _archTraits(pass->_archTraits),
- _availableRegs(pass->_availableRegs) {}
-
- Error init() noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG RAWorkReg* workRegById(uint32_t workId) const noexcept { return _pass->workRegById(workId); }
- ASMJIT_INLINE_NODEBUG PhysToWorkMap* physToWorkMap() const noexcept { return _curAssignment.physToWorkMap(); }
- ASMJIT_INLINE_NODEBUG WorkToPhysMap* workToPhysMap() const noexcept { return _curAssignment.workToPhysMap(); }
-
- //! Returns the currently processed block.
- ASMJIT_INLINE_NODEBUG RABlock* block() const noexcept { return _block; }
- //! Sets the currently processed block.
- ASMJIT_INLINE_NODEBUG void setBlock(RABlock* block) noexcept { _block = block; }
-
- //! Returns the currently processed `InstNode`.
- ASMJIT_INLINE_NODEBUG InstNode* node() const noexcept { return _node; }
- //! Returns the currently processed `RAInst`.
- ASMJIT_INLINE_NODEBUG RAInst* raInst() const noexcept { return _raInst; }
-
- //! Returns all tied regs as `RATiedReg` array.
- ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs() const noexcept { return _raInst->tiedRegs(); }
- //! Returns tied registers grouped by the given `group`.
- ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs(RegGroup group) const noexcept { return _raInst->tiedRegs(group); }
-
- //! Returns count of all TiedRegs used by the instruction.
- ASMJIT_INLINE_NODEBUG uint32_t tiedCount() const noexcept { return _tiedTotal; }
- //! Returns count of TiedRegs used by the given register `group`.
- ASMJIT_INLINE_NODEBUG uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount.get(group); }
-
- ASMJIT_INLINE_NODEBUG bool isGroupUsed(RegGroup group) const noexcept { return _tiedCount[group] != 0; }
-
- //! \}
-
- //! \name Assignment
- //! \{
-
- Error makeInitialAssignment() noexcept;
-
- Error replaceAssignment(const PhysToWorkMap* physToWorkMap) noexcept;
-
- //! Switch to the given assignment by reassigning all register and emitting code that reassigns them.
- //! This is always used to switch to a previously stored assignment.
- //!
- //! If `tryMode` is true then the final assignment doesn't have to be exactly same as specified by `dstPhysToWorkMap`
- //! and `dstWorkToPhysMap`. This mode is only used before conditional jumps that already have assignment to generate
- //! a code sequence that is always executed regardless of the flow.
- Error switchToAssignment(PhysToWorkMap* dstPhysToWorkMap, const ZoneBitVector& liveIn, bool dstReadOnly, bool tryMode) noexcept;
-
- ASMJIT_INLINE_NODEBUG Error spillRegsBeforeEntry(RABlock* block) noexcept {
- return spillScratchGpRegsBeforeEntry(block->entryScratchGpRegs());
- }
-
- Error spillScratchGpRegsBeforeEntry(uint32_t scratchRegs) noexcept;
-
- //! \}
-
- //! \name Allocation
- //! \{
-
- Error allocInst(InstNode* node) noexcept;
- Error spillAfterAllocation(InstNode* node) noexcept;
-
- Error allocBranch(InstNode* node, RABlock* target, RABlock* cont) noexcept;
- Error allocJumpTable(InstNode* node, const RABlocks& targets, RABlock* cont) noexcept;
-
- //! \}
-
- //! \name Decision Making
- //! \{
-
- enum CostModel : uint32_t {
- kCostOfFrequency = 1048576,
- kCostOfDirtyFlag = kCostOfFrequency / 4
- };
-
- ASMJIT_INLINE_NODEBUG uint32_t costByFrequency(float freq) const noexcept {
- return uint32_t(int32_t(freq * float(kCostOfFrequency)));
- }
-
- inline uint32_t calculateSpillCost(RegGroup group, uint32_t workId, uint32_t assignedId) const noexcept {
- RAWorkReg* workReg = workRegById(workId);
- uint32_t cost = costByFrequency(workReg->liveStats().freq());
-
- if (_curAssignment.isPhysDirty(group, assignedId))
- cost += kCostOfDirtyFlag;
-
- return cost;
- }
-
- //! Decides on register assignment.
- uint32_t decideOnAssignment(RegGroup group, uint32_t workId, uint32_t assignedId, RegMask allocableRegs) const noexcept;
-
- //! Decides on whether to MOVE or SPILL the given WorkReg, because it's allocated in a physical register that have
- //! to be used by another WorkReg.
- //!
- //! The function must return either `RAAssignment::kPhysNone`, which means that the WorkReg of `workId` should be
- //! spilled, or a valid physical register ID, which means that the register should be moved to that physical register
- //! instead.
- uint32_t decideOnReassignment(RegGroup group, uint32_t workId, uint32_t assignedId, RegMask allocableRegs) const noexcept;
-
- //! Decides on best spill given a register mask `spillableRegs`
- uint32_t decideOnSpillFor(RegGroup group, uint32_t workId, RegMask spillableRegs, uint32_t* spillWorkId) const noexcept;
-
- //! \}
-
- //! \name Emit
- //! \{
-
- //! Emits a move between a destination and source register, and fixes the
- //! register assignment.
- inline Error onMoveReg(RegGroup group, uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
- if (dstPhysId == srcPhysId) return kErrorOk;
- _curAssignment.reassign(group, workId, dstPhysId, srcPhysId);
- return _pass->emitMove(workId, dstPhysId, srcPhysId);
- }
-
- //! Emits a swap between two physical registers and fixes their assignment.
- //!
- //! \note Target must support this operation otherwise this would ASSERT.
- inline Error onSwapReg(RegGroup group, uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
- _curAssignment.swap(group, aWorkId, aPhysId, bWorkId, bPhysId);
- return _pass->emitSwap(aWorkId, aPhysId, bWorkId, bPhysId);
- }
-
- //! Emits a load from [VirtReg/WorkReg]'s spill slot to a physical register
- //! and makes it assigned and clean.
- inline Error onLoadReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- _curAssignment.assign(group, workId, physId, RAAssignment::kClean);
- return _pass->emitLoad(workId, physId);
- }
-
- //! Emits a save a physical register to a [VirtReg/WorkReg]'s spill slot,
- //! keeps it assigned, and makes it clean.
- inline Error onSaveReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- ASMJIT_ASSERT(_curAssignment.workToPhysId(group, workId) == physId);
- ASMJIT_ASSERT(_curAssignment.physToWorkId(group, physId) == workId);
-
- _curAssignment.makeClean(group, workId, physId);
- return _pass->emitSave(workId, physId);
- }
-
- //! Assigns a register, the content of it is undefined at this point.
- inline Error onAssignReg(RegGroup group, uint32_t workId, uint32_t physId, bool dirty) noexcept {
- _curAssignment.assign(group, workId, physId, dirty);
- return kErrorOk;
- }
-
- //! Spills a variable/register, saves the content to the memory-home if modified.
- inline Error onSpillReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- if (_curAssignment.isPhysDirty(group, physId))
- ASMJIT_PROPAGATE(onSaveReg(group, workId, physId));
- return onKillReg(group, workId, physId);
- }
-
- inline Error onDirtyReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- _curAssignment.makeDirty(group, workId, physId);
- return kErrorOk;
- }
-
- inline Error onKillReg(RegGroup group, uint32_t workId, uint32_t physId) noexcept {
- _curAssignment.unassign(group, workId, physId);
- return kErrorOk;
- }
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_CORE_RALOCAL_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/rapass.cpp b/3rdparty/asmjit/src/asmjit/core/rapass.cpp
deleted file mode 100644
index 837cbe291cd..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/rapass.cpp
+++ /dev/null
@@ -1,2061 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/formatter.h"
-#include "../core/ralocal_p.h"
-#include "../core/rapass_p.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../core/zonestack.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// RABlock - Control Flow
-// ======================
-
-Error RABlock::appendSuccessor(RABlock* successor) noexcept {
- RABlock* predecessor = this;
-
- if (predecessor->hasSuccessor(successor))
- return kErrorOk;
-
- ASMJIT_PROPAGATE(successor->_predecessors.willGrow(allocator()));
- ASMJIT_PROPAGATE(predecessor->_successors.willGrow(allocator()));
-
- predecessor->_successors.appendUnsafe(successor);
- successor->_predecessors.appendUnsafe(predecessor);
-
- return kErrorOk;
-}
-
-Error RABlock::prependSuccessor(RABlock* successor) noexcept {
- RABlock* predecessor = this;
-
- if (predecessor->hasSuccessor(successor))
- return kErrorOk;
-
- ASMJIT_PROPAGATE(successor->_predecessors.willGrow(allocator()));
- ASMJIT_PROPAGATE(predecessor->_successors.willGrow(allocator()));
-
- predecessor->_successors.prependUnsafe(successor);
- successor->_predecessors.prependUnsafe(predecessor);
-
- return kErrorOk;
-}
-
-// BaseRAPass - Construction & Destruction
-// =======================================
-
-BaseRAPass::BaseRAPass() noexcept : FuncPass("BaseRAPass") {}
-BaseRAPass::~BaseRAPass() noexcept {}
-
-// BaseRAPass - RunOnFunction
-// ==========================
-
-static void BaseRAPass_reset(BaseRAPass* self, FuncDetail* funcDetail) noexcept {
- ZoneAllocator* allocator = self->allocator();
-
- self->_blocks.reset();
- self->_exits.reset();
- self->_pov.reset();
- self->_workRegs.reset();
- self->_instructionCount = 0;
- self->_createdBlockCount = 0;
-
- self->_sharedAssignments.reset();
- self->_lastTimestamp = 0;
-
- self->_archTraits = nullptr;
- self->_physRegIndex.reset();
- self->_physRegCount.reset();
- self->_physRegTotal = 0;
- self->_scratchRegIndexes.fill(BaseReg::kIdBad);
-
- self->_availableRegs.reset();
- self->_availableRegCount.reset();
- self->_clobberedRegs.reset();
-
- self->_workRegs.reset();
- self->_workRegsOfGroup.forEach([](RAWorkRegs& regs) { regs.reset(); });
- self->_strategy.forEach([](RAStrategy& strategy) { strategy.reset(); });
- self->_globalLiveSpans.fill(nullptr);
- self->_globalMaxLiveCount.reset();
- self->_temporaryMem.reset();
-
- self->_stackAllocator.reset(allocator);
- self->_argsAssignment.reset(funcDetail);
- self->_numStackArgsToStackSlots = 0;
- self->_maxWorkRegNameSize = 0;
-}
-
-static void BaseRAPass_resetVirtRegData(BaseRAPass* self) noexcept {
- for (RAWorkReg* wReg : self->_workRegs) {
- VirtReg* vReg = wReg->virtReg();
-
- // Update the information regarding the stack of the virtual register.
- if (wReg->hasStackSlot()) {
- RAStackSlot* slot = wReg->stackSlot();
- vReg->assignStackSlot(slot->offset());
- }
-
- // Reset work reg association so it cannot be used by accident (RAWorkReg data will be destroyed).
- vReg->_workReg = nullptr;
- }
-}
-
-Error BaseRAPass::runOnFunction(Zone* zone, Logger* logger, FuncNode* func) {
- _allocator.reset(zone);
-
-#ifndef ASMJIT_NO_LOGGING
- _logger = logger;
- _formatOptions.reset();
- _diagnosticOptions = _cb->diagnosticOptions();
-
- if (logger) {
- _formatOptions = logger->options();
- }
- else {
- _diagnosticOptions &= ~(DiagnosticOptions::kRADebugCFG |
- DiagnosticOptions::kRADebugUnreachable);
- }
-#else
- DebugUtils::unused(logger);
-#endif
-
- // Initialize all core structures to use `zone` and `func`.
- BaseNode* end = func->endNode();
- _func = func;
- _stop = end->next();
- _extraBlock = end;
-
- BaseRAPass_reset(this, &_func->_funcDetail);
-
- // Initialize architecture-specific members.
- onInit();
-
- // Perform all allocation steps required.
- Error err = onPerformAllSteps();
-
- // Must be called regardless of the allocation status.
- onDone();
-
- // Reset possible connections introduced by the register allocator.
- BaseRAPass_resetVirtRegData(this);
-
- // Reset all core structures and everything that depends on the passed `Zone`.
- BaseRAPass_reset(this, nullptr);
- _allocator.reset(nullptr);
-
-#ifndef ASMJIT_NO_LOGGING
- _logger = nullptr;
- _formatOptions.reset();
- _diagnosticOptions = DiagnosticOptions::kNone;
-#endif
-
- _func = nullptr;
- _stop = nullptr;
- _extraBlock = nullptr;
-
- // Reset `Zone` as nothing should persist between `runOnFunction()` calls.
- zone->reset();
-
- // We alter the compiler cursor, because it doesn't make sense to reference it after the compilation - some
- // nodes may disappear and the old cursor can go out anyway.
- cc()->_setCursor(cc()->lastNode());
-
- return err;
-}
-
-Error BaseRAPass::onPerformAllSteps() noexcept {
- ASMJIT_PROPAGATE(buildCFG());
- ASMJIT_PROPAGATE(buildCFGViews());
- ASMJIT_PROPAGATE(removeUnreachableCode());
-
- ASMJIT_PROPAGATE(buildCFGDominators());
- ASMJIT_PROPAGATE(buildLiveness());
- ASMJIT_PROPAGATE(assignArgIndexToWorkRegs());
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate))
- ASMJIT_PROPAGATE(annotateCode());
-#endif
-
- ASMJIT_PROPAGATE(runGlobalAllocator());
- ASMJIT_PROPAGATE(runLocalAllocator());
-
- ASMJIT_PROPAGATE(updateStackFrame());
- ASMJIT_PROPAGATE(insertPrologEpilog());
-
- ASMJIT_PROPAGATE(rewrite());
-
- return kErrorOk;
-}
-
-// BaseRAPass - Events
-// ===================
-
-void BaseRAPass::onInit() noexcept {}
-void BaseRAPass::onDone() noexcept {}
-
-// BaseRAPass - CFG - Basic Block Management
-// =========================================
-
-RABlock* BaseRAPass::newBlock(BaseNode* initialNode) noexcept {
- RABlock* block = zone()->newT<RABlock>(this);
- if (ASMJIT_UNLIKELY(!block))
- return nullptr;
-
- block->setFirst(initialNode);
- block->setLast(initialNode);
-
- _createdBlockCount++;
- return block;
-}
-
-RABlock* BaseRAPass::newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt) noexcept {
- if (cbLabel->hasPassData())
- return cbLabel->passData<RABlock>();
-
- FuncNode* func = this->func();
- BaseNode* node = cbLabel->prev();
- RABlock* block = nullptr;
-
- // Try to find some label, but terminate the loop on any code. We try hard to coalesce code that contains two
- // consecutive labels or a combination of non-code nodes between 2 or more labels.
- //
- // Possible cases that would share the same basic block:
- //
- // 1. Two or more consecutive labels:
- // Label1:
- // Label2:
- //
- // 2. Two or more labels separated by non-code nodes:
- // Label1:
- // ; Some comment...
- // .align 16
- // Label2:
- size_t nPendingLabels = 0;
-
- while (node) {
- if (node->type() == NodeType::kLabel) {
- // Function has a different NodeType, just make sure this was not messed up as we must never associate
- // BasicBlock with a `func` itself.
- ASMJIT_ASSERT(node != func);
-
- block = node->passData<RABlock>();
- if (block) {
- // Exit node has always a block associated with it. If we went here it means that `cbLabel` passed here
- // is after the end of the function and cannot be merged with the function exit block.
- if (node == func->exitNode())
- block = nullptr;
- break;
- }
-
- nPendingLabels++;
- }
- else if (node->type() == NodeType::kAlign) {
- // Align node is fine.
- }
- else {
- break;
- }
-
- node = node->prev();
- }
-
- if (stoppedAt)
- *stoppedAt = node;
-
- if (!block) {
- block = newBlock();
- if (ASMJIT_UNLIKELY(!block))
- return nullptr;
- }
-
- cbLabel->setPassData<RABlock>(block);
- node = cbLabel;
-
- while (nPendingLabels) {
- node = node->prev();
- for (;;) {
- if (node->type() == NodeType::kLabel) {
- node->setPassData<RABlock>(block);
- nPendingLabels--;
- break;
- }
-
- node = node->prev();
- ASMJIT_ASSERT(node != nullptr);
- }
- }
-
- if (!block->first()) {
- block->setFirst(node);
- block->setLast(cbLabel);
- }
-
- return block;
-}
-
-Error BaseRAPass::addBlock(RABlock* block) noexcept {
- ASMJIT_PROPAGATE(_blocks.willGrow(allocator()));
-
- block->_blockId = blockCount();
- _blocks.appendUnsafe(block);
- return kErrorOk;
-}
-
-// BaseRAPass - CFG - Build
-// ========================
-
-// [[pure virtual]]
-Error BaseRAPass::buildCFG() noexcept {
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error BaseRAPass::initSharedAssignments(const ZoneVector<uint32_t>& sharedAssignmentsMap) noexcept {
- if (sharedAssignmentsMap.empty())
- return kErrorOk;
-
- uint32_t count = 0;
- for (RABlock* block : _blocks) {
- if (block->hasSharedAssignmentId()) {
- uint32_t sharedAssignmentId = sharedAssignmentsMap[block->sharedAssignmentId()];
- block->setSharedAssignmentId(sharedAssignmentId);
- count = Support::max(count, sharedAssignmentId + 1);
- }
- }
-
- ASMJIT_PROPAGATE(_sharedAssignments.resize(allocator(), count));
-
- // Aggregate all entry scratch GP regs from blocks of the same assignment to the assignment itself. It will then be
- // used instead of RABlock's own scratch regs mask, as shared assignments have precedence.
- for (RABlock* block : _blocks) {
- if (block->hasJumpTable()) {
- const RABlocks& successors = block->successors();
- if (!successors.empty()) {
- RABlock* firstSuccessor = successors[0];
- // NOTE: Shared assignments connect all possible successors so we only need the first to propagate exit scratch
- // GP registers.
- if (firstSuccessor->hasSharedAssignmentId()) {
- RASharedAssignment& sa = _sharedAssignments[firstSuccessor->sharedAssignmentId()];
- sa.addEntryScratchGpRegs(block->exitScratchGpRegs());
- }
- else {
- // This is only allowed if there is a single successor - in that case shared assignment is not necessary.
- ASMJIT_ASSERT(successors.size() == 1u);
- }
- }
- }
- if (block->hasSharedAssignmentId()) {
- RASharedAssignment& sa = _sharedAssignments[block->sharedAssignmentId()];
- sa.addEntryScratchGpRegs(block->_entryScratchGpRegs);
- }
- }
-
- return kErrorOk;
-}
-
-// BaseRAPass - CFG - Views Order
-// ==============================
-
-class RABlockVisitItem {
-public:
- RABlock* _block {};
- uint32_t _index {};
-
- inline RABlockVisitItem(RABlock* block, uint32_t index) noexcept
- : _block(block),
- _index(index) {}
-
- inline RABlockVisitItem(const RABlockVisitItem& other) noexcept = default;
- inline RABlockVisitItem& operator=(const RABlockVisitItem& other) noexcept = default;
-
- inline RABlock* block() const noexcept { return _block; }
- inline uint32_t index() const noexcept { return _index; }
-};
-
-Error BaseRAPass::buildCFGViews() noexcept {
-#ifndef ASMJIT_NO_LOGGING
- Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugCFG);
- ASMJIT_RA_LOG_FORMAT("[BuildCFGViews]\n");
-#endif
-
- uint32_t count = blockCount();
- if (ASMJIT_UNLIKELY(!count)) return kErrorOk;
-
- ASMJIT_PROPAGATE(_pov.reserve(allocator(), count));
-
- ZoneStack<RABlockVisitItem> stack;
- ASMJIT_PROPAGATE(stack.init(allocator()));
-
- ZoneBitVector visited;
- ASMJIT_PROPAGATE(visited.resize(allocator(), count));
-
- RABlock* current = _blocks[0];
- uint32_t i = 0;
-
- for (;;) {
- for (;;) {
- if (i >= current->successors().size())
- break;
-
- // Skip if already visited.
- RABlock* child = current->successors()[i++];
- if (visited.bitAt(child->blockId()))
- continue;
-
- // Mark as visited to prevent visiting the same block multiple times.
- visited.setBit(child->blockId(), true);
-
- // Add the current block on the stack, we will get back to it later.
- ASMJIT_PROPAGATE(stack.append(RABlockVisitItem(current, i)));
- current = child;
- i = 0;
- }
-
- current->makeReachable();
- current->_povOrder = _pov.size();
- _pov.appendUnsafe(current);
-
- if (stack.empty())
- break;
-
- RABlockVisitItem top = stack.pop();
- current = top.block();
- i = top.index();
- }
-
- ASMJIT_RA_LOG_COMPLEX({
- StringTmp<1024> sb;
- for (RABlock* block : blocks()) {
- sb.clear();
- if (block->hasSuccessors()) {
- sb.appendFormat(" #%u -> {", block->blockId());
- _dumpBlockIds(sb, block->successors());
- sb.append("}\n");
- }
- else {
- sb.appendFormat(" #%u -> {Exit}\n", block->blockId());
- }
- logger->log(sb);
- }
- });
-
- visited.release(allocator());
- return kErrorOk;
-}
-
-// BaseRAPass - CFG - Dominators
-// =============================
-
-static ASMJIT_FORCE_INLINE RABlock* intersectBlocks(RABlock* b1, RABlock* b2) noexcept {
- while (b1 != b2) {
- while (b2->povOrder() > b1->povOrder()) b1 = b1->iDom();
- while (b1->povOrder() > b2->povOrder()) b2 = b2->iDom();
- }
- return b1;
-}
-
-// Based on "A Simple, Fast Dominance Algorithm".
-Error BaseRAPass::buildCFGDominators() noexcept {
-#ifndef ASMJIT_NO_LOGGING
- Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugCFG);
- ASMJIT_RA_LOG_FORMAT("[BuildCFGDominators]\n");
-#endif
-
- if (_blocks.empty())
- return kErrorOk;
-
- RABlock* entryBlock = this->entryBlock();
- entryBlock->setIDom(entryBlock);
-
- bool changed = true;
-
-#ifndef ASMJIT_NO_LOGGING
- uint32_t numIters = 0;
-#endif
-
- while (changed) {
- changed = false;
-
-#ifndef ASMJIT_NO_LOGGING
- numIters++;
-#endif
-
- uint32_t i = _pov.size();
- while (i) {
- RABlock* block = _pov[--i];
- if (block == entryBlock)
- continue;
-
- RABlock* iDom = nullptr;
- const RABlocks& preds = block->predecessors();
-
- uint32_t j = preds.size();
- while (j) {
- RABlock* p = preds[--j];
- if (!p->iDom())
- continue;
- iDom = !iDom ? p : intersectBlocks(iDom, p);
- }
-
- if (block->iDom() != iDom) {
- ASMJIT_ASSUME(iDom != nullptr);
- ASMJIT_RA_LOG_FORMAT(" IDom of #%u -> #%u\n", block->blockId(), iDom->blockId());
- block->setIDom(iDom);
- changed = true;
- }
- }
- }
-
- ASMJIT_RA_LOG_FORMAT(" Done (%u iterations)\n", numIters);
- return kErrorOk;
-}
-
-bool BaseRAPass::_strictlyDominates(const RABlock* a, const RABlock* b) const noexcept {
- ASMJIT_ASSERT(a != nullptr); // There must be at least one block if this function is
- ASMJIT_ASSERT(b != nullptr); // called, as both `a` and `b` must be valid blocks.
- ASMJIT_ASSERT(a != b); // Checked by `dominates()` and `strictlyDominates()`.
-
- // Nothing strictly dominates the entry block.
- const RABlock* entryBlock = this->entryBlock();
- if (a == entryBlock)
- return false;
-
- const RABlock* iDom = b->iDom();
- while (iDom != a && iDom != entryBlock)
- iDom = iDom->iDom();
-
- return iDom != entryBlock;
-}
-
-const RABlock* BaseRAPass::_nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept {
- ASMJIT_ASSERT(a != nullptr); // There must be at least one block if this function is
- ASMJIT_ASSERT(b != nullptr); // called, as both `a` and `b` must be valid blocks.
- ASMJIT_ASSERT(a != b); // Checked by `dominates()` and `properlyDominates()`.
-
- if (a == b)
- return a;
-
- // If `a` strictly dominates `b` then `a` is the nearest common dominator.
- if (_strictlyDominates(a, b))
- return a;
-
- // If `b` strictly dominates `a` then `b` is the nearest common dominator.
- if (_strictlyDominates(b, a))
- return b;
-
- const RABlock* entryBlock = this->entryBlock();
- uint64_t timestamp = nextTimestamp();
-
- // Mark all A's dominators.
- const RABlock* block = a->iDom();
- while (block != entryBlock) {
- block->setTimestamp(timestamp);
- block = block->iDom();
- }
-
- // Check all B's dominators against marked dominators of A.
- block = b->iDom();
- while (block != entryBlock) {
- if (block->hasTimestamp(timestamp))
- return block;
- block = block->iDom();
- }
-
- return entryBlock;
-}
-
-// BaseRAPass - CFG - Utilities
-// ============================
-
-Error BaseRAPass::removeUnreachableCode() noexcept {
- uint32_t numAllBlocks = blockCount();
- uint32_t numReachableBlocks = reachableBlockCount();
-
- // All reachable -> nothing to do.
- if (numAllBlocks == numReachableBlocks)
- return kErrorOk;
-
-#ifndef ASMJIT_NO_LOGGING
- StringTmp<256> sb;
- Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugUnreachable);
- ASMJIT_RA_LOG_FORMAT("[RemoveUnreachableCode - detected %u of %u unreachable blocks]\n", numAllBlocks - numReachableBlocks, numAllBlocks);
-#endif
-
- for (uint32_t i = 0; i < numAllBlocks; i++) {
- RABlock* block = _blocks[i];
- if (block->isReachable())
- continue;
-
- ASMJIT_RA_LOG_FORMAT(" Removing code from unreachable block {%u}\n", i);
- BaseNode* first = block->first();
- BaseNode* last = block->last();
-
- BaseNode* beforeFirst = first->prev();
- BaseNode* afterLast = last->next();
-
- BaseNode* node = first;
- while (node != afterLast) {
- BaseNode* next = node->next();
-
- if (node->isCode() || node->isRemovable()) {
-#ifndef ASMJIT_NO_LOGGING
- if (logger) {
- sb.clear();
- Formatter::formatNode(sb, _formatOptions, cc(), node);
- logger->logf(" %s\n", sb.data());
- }
-#endif
- cc()->removeNode(node);
- }
- node = next;
- }
-
- if (beforeFirst->next() == afterLast) {
- block->setFirst(nullptr);
- block->setLast(nullptr);
- }
- else {
- block->setFirst(beforeFirst->next());
- block->setLast(afterLast->prev());
- }
- }
-
- return kErrorOk;
-}
-
-BaseNode* BaseRAPass::findSuccessorStartingAt(BaseNode* node) noexcept {
- while (node && (node->isInformative() || node->hasNoEffect()))
- node = node->next();
- return node;
-}
-
-bool BaseRAPass::isNextTo(BaseNode* node, BaseNode* target) noexcept {
- for (;;) {
- node = node->next();
- if (node == target)
- return true;
-
- if (!node)
- return false;
-
- if (node->isCode() || node->isData())
- return false;
- }
-}
-
-// BaseRAPass - Registers - VirtReg / WorkReg Mapping
-// ==================================================
-
-Error BaseRAPass::_asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept {
- // Checked by `asWorkReg()` - must be true.
- ASMJIT_ASSERT(vReg->_workReg == nullptr);
-
- RegGroup group = vReg->group();
- ASMJIT_ASSERT(group <= RegGroup::kMaxVirt);
-
- RAWorkRegs& wRegs = workRegs();
- RAWorkRegs& wRegsByGroup = workRegs(group);
-
- ASMJIT_PROPAGATE(wRegs.willGrow(allocator()));
- ASMJIT_PROPAGATE(wRegsByGroup.willGrow(allocator()));
-
- RAWorkReg* wReg = zone()->newT<RAWorkReg>(vReg, wRegs.size());
- if (ASMJIT_UNLIKELY(!wReg))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- vReg->setWorkReg(wReg);
- if (!vReg->isStack())
- wReg->setRegByteMask(Support::lsbMask<uint64_t>(vReg->virtSize()));
- wRegs.appendUnsafe(wReg);
- wRegsByGroup.appendUnsafe(wReg);
-
- // Only used by RA logging.
- _maxWorkRegNameSize = Support::max(_maxWorkRegNameSize, vReg->nameSize());
-
- *out = wReg;
- return kErrorOk;
-}
-
-RAAssignment::WorkToPhysMap* BaseRAPass::newWorkToPhysMap() noexcept {
- uint32_t count = workRegCount();
- size_t size = WorkToPhysMap::sizeOf(count);
-
- // If no registers are used it could be zero, in that case return a dummy
- // map instead of NULL.
- if (ASMJIT_UNLIKELY(!size)) {
- static const RAAssignment::WorkToPhysMap nullMap = {{ 0 }};
- return const_cast<RAAssignment::WorkToPhysMap*>(&nullMap);
- }
-
- WorkToPhysMap* map = zone()->allocT<WorkToPhysMap>(size);
- if (ASMJIT_UNLIKELY(!map))
- return nullptr;
-
- map->reset(count);
- return map;
-}
-
-RAAssignment::PhysToWorkMap* BaseRAPass::newPhysToWorkMap() noexcept {
- uint32_t count = physRegTotal();
- size_t size = PhysToWorkMap::sizeOf(count);
-
- PhysToWorkMap* map = zone()->allocT<PhysToWorkMap>(size);
- if (ASMJIT_UNLIKELY(!map))
- return nullptr;
-
- map->reset(count);
- return map;
-}
-
-// BaseRAPass - Registers - Liveness Analysis and Statistics
-// =========================================================
-
-namespace LiveOps {
- typedef ZoneBitVector::BitWord BitWord;
-
- struct In {
- static ASMJIT_FORCE_INLINE BitWord op(BitWord dst, BitWord out, BitWord gen, BitWord kill) noexcept {
- DebugUtils::unused(dst);
- return (out | gen) & ~kill;
- }
- };
-
- template<typename Operator>
- static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, uint32_t n) noexcept {
- BitWord changed = 0;
-
- for (uint32_t i = 0; i < n; i++) {
- BitWord before = dst[i];
- BitWord after = Operator::op(before, a[i]);
-
- dst[i] = after;
- changed |= (before ^ after);
- }
-
- return changed != 0;
- }
-
- template<typename Operator>
- static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, uint32_t n) noexcept {
- BitWord changed = 0;
-
- for (uint32_t i = 0; i < n; i++) {
- BitWord before = dst[i];
- BitWord after = Operator::op(before, a[i], b[i]);
-
- dst[i] = after;
- changed |= (before ^ after);
- }
-
- return changed != 0;
- }
-
- template<typename Operator>
- static ASMJIT_FORCE_INLINE bool op(BitWord* dst, const BitWord* a, const BitWord* b, const BitWord* c, uint32_t n) noexcept {
- BitWord changed = 0;
-
-#if defined(_MSC_VER) && _MSC_VER <= 1938
- // MSVC workaround (see #427).
- //
- // MSVC incorrectly auto-vectorizes this loop when used with <In> operator. For some reason it trashes a content
- // of a register, which causes the result to be incorrect. It's a compiler bug we have to prevent unfortunately.
- #pragma loop(no_vector)
-#endif
- for (uint32_t i = 0; i < n; i++) {
- BitWord before = dst[i];
- BitWord after = Operator::op(before, a[i], b[i], c[i]);
-
- dst[i] = after;
- changed |= (before ^ after);
- }
-
- return changed != 0;
- }
-
- static ASMJIT_NOINLINE bool recalcInOut(RABlock* block, uint32_t numBitWords, bool initial = false) noexcept {
- bool changed = initial;
-
- const RABlocks& successors = block->successors();
- uint32_t numSuccessors = successors.size();
-
- // Calculate `OUT` based on `IN` of all successors.
- for (uint32_t i = 0; i < numSuccessors; i++)
- changed |= op<Support::Or>(block->liveOut().data(), successors[i]->liveIn().data(), numBitWords);
-
- // Calculate `IN` based on `OUT`, `GEN`, and `KILL` bits.
- if (changed)
- changed = op<In>(block->liveIn().data(), block->liveOut().data(), block->gen().data(), block->kill().data(), numBitWords);
-
- return changed;
- }
-}
-
-ASMJIT_FAVOR_SPEED Error BaseRAPass::buildLiveness() noexcept {
-#ifndef ASMJIT_NO_LOGGING
- Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugLiveness);
- StringTmp<512> sb;
-#endif
-
- ASMJIT_RA_LOG_FORMAT("[BuildLiveness]\n");
-
- uint32_t i;
-
- uint32_t numAllBlocks = blockCount();
- uint32_t numReachableBlocks = reachableBlockCount();
-
- uint32_t numWorkRegs = workRegCount();
- uint32_t numBitWords = ZoneBitVector::_wordsPerBits(numWorkRegs);
-
- if (!numWorkRegs) {
- ASMJIT_RA_LOG_FORMAT(" Done (no virtual registers)\n");
- return kErrorOk;
- }
-
- ZoneVector<uint32_t> nUsesPerWorkReg; // Number of USEs of each RAWorkReg.
- ZoneVector<uint32_t> nOutsPerWorkReg; // Number of OUTs of each RAWorkReg.
- ZoneVector<uint32_t> nInstsPerBlock; // Number of instructions of each RABlock.
-
- ASMJIT_PROPAGATE(nUsesPerWorkReg.resize(allocator(), numWorkRegs));
- ASMJIT_PROPAGATE(nOutsPerWorkReg.resize(allocator(), numWorkRegs));
- ASMJIT_PROPAGATE(nInstsPerBlock.resize(allocator(), numAllBlocks));
-
- // Calculate GEN/KILL of Each Block
- // --------------------------------
-
- for (i = 0; i < numReachableBlocks; i++) {
- RABlock* block = _pov[i];
- ASMJIT_PROPAGATE(block->resizeLiveBits(numWorkRegs));
-
- BaseNode* node = block->last();
- BaseNode* stop = block->first();
-
- uint32_t nInsts = 0;
- for (;;) {
- if (node->isInst()) {
- InstNode* inst = node->as<InstNode>();
- RAInst* raInst = inst->passData<RAInst>();
- ASMJIT_ASSERT(raInst != nullptr);
-
- RATiedReg* tiedRegs = raInst->tiedRegs();
- uint32_t count = raInst->tiedCount();
-
- for (uint32_t j = 0; j < count; j++) {
- RATiedReg* tiedReg = &tiedRegs[j];
- uint32_t workId = tiedReg->workId();
-
- // Update `nUses` and `nOuts`.
- nUsesPerWorkReg[workId] += 1u;
- nOutsPerWorkReg[workId] += uint32_t(tiedReg->isWrite());
-
- // Mark as:
- // KILL - if this VirtReg is killed afterwards.
- // LAST - if this VirtReg is last in this basic block.
- if (block->kill().bitAt(workId))
- tiedReg->addFlags(RATiedFlags::kKill);
- else if (!block->gen().bitAt(workId))
- tiedReg->addFlags(RATiedFlags::kLast);
-
- if (tiedReg->isWriteOnly()) {
- // KILL.
- block->kill().setBit(workId, true);
- }
- else {
- // GEN.
- block->kill().setBit(workId, false);
- block->gen().setBit(workId, true);
- }
-
- if (tiedReg->isLeadConsecutive()) {
- RAWorkReg* workReg = workRegById(workId);
- workReg->markLeadConsecutive();
- }
-
- if (tiedReg->hasConsecutiveParent()) {
- RAWorkReg* consecutiveParentReg = workRegById(tiedReg->consecutiveParent());
- ASMJIT_PROPAGATE(consecutiveParentReg->addImmediateConsecutive(allocator(), workId));
- }
- }
-
- nInsts++;
- }
-
- if (node == stop)
- break;
-
- node = node->prev();
- ASMJIT_ASSERT(node != nullptr);
- }
-
- nInstsPerBlock[block->blockId()] = nInsts;
- }
-
- // Calculate IN/OUT of Each Block
- // ------------------------------
-
-#ifndef ASMJIT_NO_LOGGING
- uint32_t numVisits = numReachableBlocks;
-#endif
-
- {
- ZoneStack<RABlock*> workList;
- ZoneBitVector workBits;
-
- ASMJIT_PROPAGATE(workList.init(allocator()));
- ASMJIT_PROPAGATE(workBits.resize(allocator(), blockCount(), true));
-
- for (i = 0; i < numReachableBlocks; i++) {
- RABlock* block = _pov[i];
- LiveOps::recalcInOut(block, numBitWords, true);
- ASMJIT_PROPAGATE(workList.append(block));
- }
-
- while (!workList.empty()) {
- RABlock* block = workList.popFirst();
- uint32_t blockId = block->blockId();
-
- workBits.setBit(blockId, false);
- if (LiveOps::recalcInOut(block, numBitWords)) {
- const RABlocks& predecessors = block->predecessors();
- uint32_t numPredecessors = predecessors.size();
-
- for (uint32_t j = 0; j < numPredecessors; j++) {
- RABlock* pred = predecessors[j];
- if (!workBits.bitAt(pred->blockId())) {
- workBits.setBit(pred->blockId(), true);
- ASMJIT_PROPAGATE(workList.append(pred));
- }
- }
- }
-#ifndef ASMJIT_NO_LOGGING
- numVisits++;
-#endif
- }
-
- workList.reset();
- workBits.release(allocator());
- }
-
- ASMJIT_RA_LOG_COMPLEX({
- logger->logf(" LiveIn/Out Done (%u visits)\n", numVisits);
- for (i = 0; i < numAllBlocks; i++) {
- RABlock* block = _blocks[i];
-
- ASMJIT_PROPAGATE(sb.assignFormat(" {#%u}\n", block->blockId()));
- ASMJIT_PROPAGATE(_dumpBlockLiveness(sb, block));
-
- logger->log(sb);
- }
- });
-
- // Reserve the space in each `RAWorkReg` for references
- // ----------------------------------------------------
-
- for (i = 0; i < numWorkRegs; i++) {
- RAWorkReg* workReg = workRegById(i);
- ASMJIT_PROPAGATE(workReg->_refs.reserve(allocator(), nUsesPerWorkReg[i]));
- ASMJIT_PROPAGATE(workReg->_writes.reserve(allocator(), nOutsPerWorkReg[i]));
- }
-
- // Assign block and instruction positions, build LiveCount and LiveSpans
- // ---------------------------------------------------------------------
-
- uint32_t position = 2;
- for (i = 0; i < numAllBlocks; i++) {
- RABlock* block = _blocks[i];
- if (!block->isReachable())
- continue;
-
- BaseNode* node = block->first();
- BaseNode* stop = block->last();
-
- uint32_t endPosition = position + nInstsPerBlock[i] * 2;
- block->setFirstPosition(position);
- block->setEndPosition(endPosition);
-
- RALiveCount curLiveCount;
- RALiveCount maxLiveCount;
-
- // Process LIVE-IN.
- ZoneBitVector::ForEachBitSet it(block->liveIn());
- while (it.hasNext()) {
- RAWorkReg* workReg = _workRegs[uint32_t(it.next())];
- curLiveCount[workReg->group()]++;
- ASMJIT_PROPAGATE(workReg->liveSpans().openAt(allocator(), position, endPosition));
- }
-
- for (;;) {
- if (node->isInst()) {
- InstNode* inst = node->as<InstNode>();
- RAInst* raInst = inst->passData<RAInst>();
- ASMJIT_ASSERT(raInst != nullptr);
-
- RATiedReg* tiedRegs = raInst->tiedRegs();
- uint32_t count = raInst->tiedCount();
-
- inst->setPosition(position);
- raInst->_liveCount = curLiveCount;
-
- for (uint32_t j = 0; j < count; j++) {
- RATiedReg* tiedReg = &tiedRegs[j];
- uint32_t workId = tiedReg->workId();
-
- // Create refs and writes.
- RAWorkReg* workReg = workRegById(workId);
- workReg->_refs.appendUnsafe(node);
- if (tiedReg->isWrite())
- workReg->_writes.appendUnsafe(node);
-
- // We couldn't calculate this in previous steps, but since we know all LIVE-OUT at this point it becomes
- // trivial. If this is the last instruction that uses this `workReg` and it's not LIVE-OUT then it is
- // KILLed here.
- if (tiedReg->isLast() && !block->liveOut().bitAt(workId))
- tiedReg->addFlags(RATiedFlags::kKill);
-
- LiveRegSpans& liveSpans = workReg->liveSpans();
- bool wasOpen;
- ASMJIT_PROPAGATE(liveSpans.openAt(allocator(), position + !tiedReg->isRead(), endPosition, wasOpen));
-
- RegGroup group = workReg->group();
- if (!wasOpen) {
- curLiveCount[group]++;
- raInst->_liveCount[group]++;
- }
-
- if (tiedReg->isKill()) {
- liveSpans.closeAt(position + !tiedReg->isRead() + 1);
- curLiveCount[group]--;
- }
-
- // Update `RAWorkReg::useIdMask` and `RAWorkReg::hintRegId`.
- if (tiedReg->hasUseId()) {
- uint32_t useId = tiedReg->useId();
- workReg->addUseIdMask(Support::bitMask(useId));
- if (!workReg->hasHintRegId() && !Support::bitTest(raInst->_clobberedRegs[group], useId))
- workReg->setHintRegId(useId);
- }
-
- if (tiedReg->useRegMask()) {
- workReg->restrictPreferredMask(tiedReg->useRegMask());
- if (workReg->isLeadConsecutive())
- workReg->restrictConsecutiveMask(tiedReg->useRegMask());
- }
-
- if (tiedReg->outRegMask()) {
- workReg->restrictPreferredMask(tiedReg->outRegMask());
- if (workReg->isLeadConsecutive())
- workReg->restrictConsecutiveMask(tiedReg->outRegMask());
- }
-
- // Update `RAWorkReg::clobberedSurvivalMask`.
- if (raInst->_clobberedRegs[group] && !tiedReg->isOutOrKill()) {
- workReg->addClobberSurvivalMask(raInst->_clobberedRegs[group]);
- }
- }
-
- position += 2;
- maxLiveCount.op<Support::Max>(raInst->_liveCount);
- }
-
- if (node == stop)
- break;
-
- node = node->next();
- ASMJIT_ASSERT(node != nullptr);
- }
-
- block->_maxLiveCount = maxLiveCount;
- _globalMaxLiveCount.op<Support::Max>(maxLiveCount);
- ASMJIT_ASSERT(position == block->endPosition());
- }
-
- // Calculate WorkReg statistics
- // ----------------------------
-
- for (i = 0; i < numWorkRegs; i++) {
- RAWorkReg* workReg = _workRegs[i];
-
- LiveRegSpans& spans = workReg->liveSpans();
- uint32_t width = spans.width();
- float freq = width ? float(double(workReg->_refs.size()) / double(width)) : float(0);
-
- RALiveStats& stats = workReg->liveStats();
- stats._width = width;
- stats._freq = freq;
- stats._priority = freq + float(int(workReg->virtReg()->weight())) * 0.01f;
- }
-
- ASMJIT_RA_LOG_COMPLEX({
- sb.clear();
- _dumpLiveSpans(sb);
- logger->log(sb);
- });
-
- nUsesPerWorkReg.release(allocator());
- nOutsPerWorkReg.release(allocator());
- nInstsPerBlock.release(allocator());
-
- return kErrorOk;
-}
-
-Error BaseRAPass::assignArgIndexToWorkRegs() noexcept {
- ZoneBitVector& liveIn = entryBlock()->liveIn();
- uint32_t argCount = func()->argCount();
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- // Unassigned argument.
- const RegOnly& regArg = func()->argPack(argIndex)[valueIndex];
- if (!regArg.isReg() || !cc()->isVirtIdValid(regArg.id()))
- continue;
-
- VirtReg* virtReg = cc()->virtRegById(regArg.id());
- if (!virtReg)
- continue;
-
- // Unreferenced argument.
- RAWorkReg* workReg = virtReg->workReg();
- if (!workReg)
- continue;
-
- // Overwritten argument.
- uint32_t workId = workReg->workId();
- if (!liveIn.bitAt(workId))
- continue;
-
- workReg->setArgIndex(argIndex, valueIndex);
- const FuncValue& arg = func()->detail().arg(argIndex, valueIndex);
-
- if (arg.isReg() && _archTraits->regTypeToGroup(arg.regType()) == workReg->group()) {
- workReg->setHintRegId(arg.regId());
- }
- }
- }
-
- return kErrorOk;
-}
-
-// BaseRAPass - Allocation - Global
-// ================================
-
-#ifndef ASMJIT_NO_LOGGING
-static void RAPass_dumpSpans(String& sb, uint32_t index, const LiveRegSpans& liveSpans) noexcept {
- sb.appendFormat(" %02u: ", index);
-
- for (uint32_t i = 0; i < liveSpans.size(); i++) {
- const LiveRegSpan& liveSpan = liveSpans[i];
- if (i) sb.append(", ");
- sb.appendFormat("[%u:%u@%u]", liveSpan.a, liveSpan.b, liveSpan.id);
- }
-
- sb.append('\n');
-}
-#endif
-
-Error BaseRAPass::runGlobalAllocator() noexcept {
- ASMJIT_PROPAGATE(initGlobalLiveSpans());
-
- for (RegGroup group : RegGroupVirtValues{}) {
- ASMJIT_PROPAGATE(binPack(group));
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SPEED Error BaseRAPass::initGlobalLiveSpans() noexcept {
- for (RegGroup group : RegGroupVirtValues{}) {
- size_t physCount = _physRegCount[group];
- LiveRegSpans* liveSpans = nullptr;
-
- if (physCount) {
- liveSpans = allocator()->allocT<LiveRegSpans>(physCount * sizeof(LiveRegSpans));
- if (ASMJIT_UNLIKELY(!liveSpans))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- for (size_t physId = 0; physId < physCount; physId++)
- new(Support::PlacementNew{&liveSpans[physId]}) LiveRegSpans();
- }
-
- _globalLiveSpans[group] = liveSpans;
- }
-
- return kErrorOk;
-}
-
-struct RAConsecutiveReg {
- RAWorkReg* workReg;
- RAWorkReg* parentReg;
-};
-
-ASMJIT_FAVOR_SPEED Error BaseRAPass::binPack(RegGroup group) noexcept {
- if (workRegCount(group) == 0)
- return kErrorOk;
-
-#ifndef ASMJIT_NO_LOGGING
- Logger* logger = getLoggerIf(DiagnosticOptions::kRADebugAssignment);
- StringTmp<512> sb;
-
- ASMJIT_RA_LOG_FORMAT("[BinPack] Available=%u (0x%08X) Count=%u RegGroup=%u\n",
- Support::popcnt(_availableRegs[group]),
- _availableRegs[group],
- workRegCount(group),
- uint32_t(group));
-#endif
-
- uint32_t i;
- uint32_t physCount = _physRegCount[group];
-
- RAWorkRegs workRegs;
- ZoneVector<RAConsecutiveReg> consecutiveRegs;
- LiveRegSpans tmpSpans;
-
- ASMJIT_PROPAGATE(workRegs.concat(allocator(), this->workRegs(group)));
- workRegs.sort([](const RAWorkReg* a, const RAWorkReg* b) noexcept {
- return b->liveStats().priority() - a->liveStats().priority();
- });
-
- uint32_t numWorkRegs = workRegs.size();
- RegMask availableRegs = _availableRegs[group];
- RegMask preservedRegs = func()->frame().preservedRegs(group);
-
- // First try to pack everything that provides register-id hint as these are most likely function arguments and fixed
- // (precolored) virtual registers.
- if (!workRegs.empty()) {
- uint32_t dstIndex = 0;
-
- for (i = 0; i < numWorkRegs; i++) {
- RAWorkReg* workReg = workRegs[i];
-
- if (workReg->isLeadConsecutive()) {
- ASMJIT_PROPAGATE(consecutiveRegs.append(allocator(), RAConsecutiveReg{workReg, nullptr}));
- workReg->markProcessedConsecutive();
- }
-
- if (workReg->hasHintRegId()) {
- uint32_t physId = workReg->hintRegId();
- if (Support::bitTest(availableRegs, physId)) {
- LiveRegSpans& live = _globalLiveSpans[group][physId];
- Error err = tmpSpans.nonOverlappingUnionOf(allocator(), live, workReg->liveSpans(), LiveRegData(workReg->virtId()));
-
- if (err == kErrorOk) {
- live.swap(tmpSpans);
- workReg->setHomeRegId(physId);
- workReg->markAllocated();
- continue;
- }
-
- if (err != 0xFFFFFFFFu)
- return err;
- }
- }
-
- workRegs[dstIndex++] = workReg;
- }
-
- workRegs._setSize(dstIndex);
- numWorkRegs = dstIndex;
- }
-
- // Allocate consecutive registers - both leads and all consecutives. This is important and prioritized over the rest,
- // because once a lead is allocated we really need to allocate its consecutives, otherwise we may bin pack other
- // registers into their places, which would result in wrong hints to the local allocator, and then into many moves
- // or spills.
- if (!consecutiveRegs.empty()) {
- // This loop appends all other consecutive registers into `consecutiveRegs` array. Leads are at the beginning,
- // non-leads follow.
- i = 0;
- for (;;) {
- uint32_t stop = consecutiveRegs.size();
- if (i == stop)
- break;
-
- while (i < stop) {
- RAWorkReg* workReg = consecutiveRegs[i].workReg;
- if (workReg->hasImmediateConsecutives()) {
- ZoneBitVector::ForEachBitSet it(workReg->immediateConsecutives());
- while (it.hasNext()) {
- uint32_t consecutiveWorkId = uint32_t(it.next());
- RAWorkReg* consecutiveReg = workRegById(consecutiveWorkId);
- if (!consecutiveReg->isProcessedConsecutive()) {
- ASMJIT_PROPAGATE(consecutiveRegs.append(allocator(), RAConsecutiveReg{consecutiveReg, workReg}));
- consecutiveReg->markProcessedConsecutive();
- }
- }
- }
- i++;
- }
- }
-
- uint32_t numConsecutiveRegs = consecutiveRegs.size();
- for (i = 0; i < numConsecutiveRegs; i++) {
- RAWorkReg* workReg = consecutiveRegs[i].workReg;
- if (workReg->isAllocated())
- continue;
-
- RAWorkReg* parentReg = consecutiveRegs[i].parentReg;
- RegMask physRegs = 0;
-
- if (!parentReg) {
- physRegs = availableRegs & workReg->preferredMask();
- if (!physRegs) {
- physRegs = availableRegs & workReg->consecutiveMask();
-
- // NOTE: This should never be true as it would mean we would never allocate this virtual register
- // (not here, and not later when local register allocator processes RATiedReg sets).
- if (ASMJIT_UNLIKELY(!physRegs))
- return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
- }
- }
- else if (parentReg->hasHomeRegId()) {
- uint32_t consecutiveId = parentReg->homeRegId() + 1;
-
- // NOTE: We don't support wrapping. If this goes beyond all allocable registers there is something wrong.
- if (consecutiveId > 31 || !Support::bitTest(availableRegs, consecutiveId))
- return DebugUtils::errored(kErrorConsecutiveRegsAllocation);
-
- workReg->setHintRegId(consecutiveId);
- physRegs = Support::bitMask(consecutiveId);
- }
-
- while (physRegs) {
- uint32_t physId = Support::bitSizeOf<RegMask>() - 1 - Support::clz(physRegs);
-
- LiveRegSpans& live = _globalLiveSpans[group][physId];
- Error err = tmpSpans.nonOverlappingUnionOf(allocator(), live, workReg->liveSpans(), LiveRegData(workReg->virtId()));
-
- if (err == kErrorOk) {
- workReg->setHomeRegId(physId);
- workReg->markAllocated();
- live.swap(tmpSpans);
- break;
- }
-
- if (ASMJIT_UNLIKELY(err != 0xFFFFFFFFu))
- return err;
-
- physRegs ^= Support::bitMask(physId);
- }
- }
- }
-
- // Try to pack the rest.
- if (!workRegs.empty()) {
- uint32_t dstIndex = 0;
-
- for (i = 0; i < numWorkRegs; i++) {
- RAWorkReg* workReg = workRegs[i];
-
- if (workReg->isAllocated())
- continue;
-
- RegMask remainingPhysRegs = availableRegs;
- if (remainingPhysRegs & workReg->preferredMask())
- remainingPhysRegs &= workReg->preferredMask();
-
- RegMask physRegs = remainingPhysRegs & ~preservedRegs;
- remainingPhysRegs &= preservedRegs;
-
- for (;;) {
- if (!physRegs) {
- if (!remainingPhysRegs)
- break;
- physRegs = remainingPhysRegs;
- remainingPhysRegs = 0;
- }
-
- uint32_t physId = Support::ctz(physRegs);
-
- if (workReg->clobberSurvivalMask()) {
- RegMask preferredMask = (physRegs | remainingPhysRegs) & workReg->clobberSurvivalMask();
- if (preferredMask) {
- if (preferredMask & ~remainingPhysRegs)
- preferredMask &= ~remainingPhysRegs;
- physId = Support::ctz(preferredMask);
- }
- }
-
- LiveRegSpans& live = _globalLiveSpans[group][physId];
- Error err = tmpSpans.nonOverlappingUnionOf(allocator(), live, workReg->liveSpans(), LiveRegData(workReg->virtId()));
-
- if (err == kErrorOk) {
- workReg->setHomeRegId(physId);
- workReg->markAllocated();
- live.swap(tmpSpans);
- break;
- }
-
- if (ASMJIT_UNLIKELY(err != 0xFFFFFFFFu))
- return err;
-
- physRegs &= ~Support::bitMask(physId);
- remainingPhysRegs &= ~Support::bitMask(physId);
- }
-
- // Keep it in `workRegs` if it was not allocated.
- if (!physRegs)
- workRegs[dstIndex++] = workReg;
- }
-
- workRegs._setSize(dstIndex);
- numWorkRegs = dstIndex;
- }
-
- ASMJIT_RA_LOG_COMPLEX({
- for (uint32_t physId = 0; physId < physCount; physId++) {
- LiveRegSpans& live = _globalLiveSpans[group][physId];
- if (live.empty())
- continue;
-
- sb.clear();
- RAPass_dumpSpans(sb, physId, live);
- logger->log(sb);
- }
- });
-
- // Maybe unused if logging is disabled.
- DebugUtils::unused(physCount);
-
- if (workRegs.empty()) {
- ASMJIT_RA_LOG_FORMAT(" Completed.\n");
- }
- else {
- _strategy[group].setType(RAStrategyType::kComplex);
- for (RAWorkReg* workReg : workRegs)
- workReg->markStackPreferred();
-
- ASMJIT_RA_LOG_COMPLEX({
- uint32_t count = workRegs.size();
- sb.clear();
- sb.appendFormat(" Unassigned (%u): ", count);
- for (i = 0; i < numWorkRegs; i++) {
- RAWorkReg* workReg = workRegs[i];
- if (i) sb.append(", ");
- sb.append(workReg->name());
- }
- sb.append('\n');
- logger->log(sb);
- });
- }
-
- return kErrorOk;
-}
-
-// BaseRAPass - Allocation - Local
-// ===============================
-
-Error BaseRAPass::runLocalAllocator() noexcept {
- RALocalAllocator lra(this);
- ASMJIT_PROPAGATE(lra.init());
-
- if (!blockCount())
- return kErrorOk;
-
- // The allocation is done when this reaches zero.
- uint32_t blocksRemaining = reachableBlockCount();
-
- // Current block.
- uint32_t blockId = 0;
- RABlock* block = _blocks[blockId];
-
- // The first block (entry) must always be reachable.
- ASMJIT_ASSERT(block->isReachable());
-
- // Assign function arguments for the initial block. The `lra` is valid now.
- lra.makeInitialAssignment();
- ASMJIT_PROPAGATE(setBlockEntryAssignment(block, block, lra._curAssignment));
-
- // The loop starts from the first block and iterates blocks in order, however, the algorithm also allows to jump to
- // any other block when finished if it's a jump target. In-order iteration just makes sure that all blocks are visited.
- for (;;) {
- BaseNode* first = block->first();
- BaseNode* last = block->last();
- BaseNode* terminator = block->hasTerminator() ? last : nullptr;
-
- BaseNode* beforeFirst = first->prev();
- BaseNode* afterLast = last->next();
-
- bool unconditionalJump = false;
- RABlock* consecutive = nullptr;
-
- if (block->hasSuccessors())
- consecutive = block->successors()[0];
-
- lra.setBlock(block);
- block->makeAllocated();
-
- BaseNode* node = first;
- while (node != afterLast) {
- BaseNode* next = node->next();
- if (node->isInst()) {
- InstNode* inst = node->as<InstNode>();
-
- if (ASMJIT_UNLIKELY(inst == terminator)) {
- const RABlocks& successors = block->successors();
- if (block->hasConsecutive()) {
- ASMJIT_PROPAGATE(lra.allocBranch(inst, successors.last(), successors.first()));
-
- node = next;
- continue;
- }
- else if (successors.size() > 1) {
- RABlock* cont = block->hasConsecutive() ? successors.first() : nullptr;
- ASMJIT_PROPAGATE(lra.allocJumpTable(inst, successors, cont));
-
- node = next;
- continue;
- }
- else {
- // Otherwise this is an unconditional jump, special handling isn't required.
- unconditionalJump = true;
- }
- }
-
- ASMJIT_PROPAGATE(lra.allocInst(inst));
- if (inst->type() == NodeType::kInvoke)
- ASMJIT_PROPAGATE(emitPreCall(inst->as<InvokeNode>()));
- else
- ASMJIT_PROPAGATE(lra.spillAfterAllocation(inst));
- }
- node = next;
- }
-
- if (consecutive) {
- BaseNode* prev = afterLast ? afterLast->prev() : cc()->lastNode();
- cc()->_setCursor(unconditionalJump ? prev->prev() : prev);
-
- if (consecutive->hasEntryAssignment()) {
- ASMJIT_PROPAGATE(lra.switchToAssignment(consecutive->entryPhysToWorkMap(), consecutive->liveIn(), consecutive->isAllocated(), false));
- }
- else {
- ASMJIT_PROPAGATE(lra.spillRegsBeforeEntry(consecutive));
- ASMJIT_PROPAGATE(setBlockEntryAssignment(consecutive, block, lra._curAssignment));
- lra._curAssignment.copyFrom(consecutive->entryPhysToWorkMap());
- }
- }
-
- // Important as the local allocator can insert instructions before
- // and after any instruction within the basic block.
- block->setFirst(beforeFirst->next());
- block->setLast(afterLast ? afterLast->prev() : cc()->lastNode());
-
- if (--blocksRemaining == 0)
- break;
-
- // Switch to the next consecutive block, if any.
- if (consecutive) {
- block = consecutive;
- if (!block->isAllocated())
- continue;
- }
-
- // Get the next block.
- for (;;) {
- if (++blockId >= blockCount())
- blockId = 0;
-
- block = _blocks[blockId];
- if (!block->isReachable() || block->isAllocated() || !block->hasEntryAssignment())
- continue;
-
- break;
- }
-
- // If we switched to some block we have to update the local allocator.
- lra.replaceAssignment(block->entryPhysToWorkMap());
- }
-
- _clobberedRegs.op<Support::Or>(lra._clobberedRegs);
- return kErrorOk;
-}
-
-Error BaseRAPass::setBlockEntryAssignment(RABlock* block, const RABlock* fromBlock, const RAAssignment& fromAssignment) noexcept {
- if (block->hasSharedAssignmentId()) {
- uint32_t sharedAssignmentId = block->sharedAssignmentId();
-
- // Shouldn't happen. Entry assignment of a block that has a shared-state will assign to all blocks
- // with the same sharedAssignmentId. It's a bug if the shared state has been already assigned.
- if (!_sharedAssignments[sharedAssignmentId].empty())
- return DebugUtils::errored(kErrorInvalidState);
-
- return setSharedAssignment(sharedAssignmentId, fromAssignment);
- }
-
- PhysToWorkMap* physToWorkMap = clonePhysToWorkMap(fromAssignment.physToWorkMap());
- if (ASMJIT_UNLIKELY(!physToWorkMap))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- block->setEntryAssignment(physToWorkMap);
-
- // True if this is the first (entry) block, nothing to do in this case.
- if (block == fromBlock) {
- // Entry block should never have a shared state.
- if (block->hasSharedAssignmentId())
- return DebugUtils::errored(kErrorInvalidState);
-
- return kErrorOk;
- }
-
- const ZoneBitVector& liveOut = fromBlock->liveOut();
- const ZoneBitVector& liveIn = block->liveIn();
-
- // It's possible that `fromBlock` has LIVE-OUT regs that `block` doesn't
- // have in LIVE-IN, these have to be unassigned.
- {
- ZoneBitVector::ForEachBitOp<Support::AndNot> it(liveOut, liveIn);
- while (it.hasNext()) {
- uint32_t workId = uint32_t(it.next());
- RAWorkReg* workReg = workRegById(workId);
-
- RegGroup group = workReg->group();
- uint32_t physId = fromAssignment.workToPhysId(group, workId);
-
- if (physId != RAAssignment::kPhysNone)
- physToWorkMap->unassign(group, physId, _physRegIndex.get(group) + physId);
- }
- }
-
- return blockEntryAssigned(physToWorkMap);
-}
-
-Error BaseRAPass::setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignment& fromAssignment) noexcept {
- ASMJIT_ASSERT(_sharedAssignments[sharedAssignmentId].empty());
-
- PhysToWorkMap* physToWorkMap = clonePhysToWorkMap(fromAssignment.physToWorkMap());
- if (ASMJIT_UNLIKELY(!physToWorkMap))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _sharedAssignments[sharedAssignmentId].assignPhysToWorkMap(physToWorkMap);
-
- ZoneBitVector& sharedLiveIn = _sharedAssignments[sharedAssignmentId]._liveIn;
- ASMJIT_PROPAGATE(sharedLiveIn.resize(allocator(), workRegCount()));
-
- Support::Array<uint32_t, Globals::kNumVirtGroups> sharedAssigned {};
- for (RABlock* block : blocks()) {
- if (block->sharedAssignmentId() == sharedAssignmentId) {
- ASMJIT_ASSERT(!block->hasEntryAssignment());
-
- PhysToWorkMap* entryPhysToWorkMap = clonePhysToWorkMap(fromAssignment.physToWorkMap());
- if (ASMJIT_UNLIKELY(!entryPhysToWorkMap))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- block->setEntryAssignment(entryPhysToWorkMap);
-
- const ZoneBitVector& liveIn = block->liveIn();
- sharedLiveIn.or_(liveIn);
-
- for (RegGroup group : RegGroupVirtValues{}) {
- sharedAssigned[group] |= entryPhysToWorkMap->assigned[group];
-
- uint32_t physBaseIndex = _physRegIndex.get(group);
- Support::BitWordIterator<RegMask> it(entryPhysToWorkMap->assigned[group]);
-
- while (it.hasNext()) {
- uint32_t physId = it.next();
- uint32_t workId = entryPhysToWorkMap->workIds[physBaseIndex + physId];
-
- if (!liveIn.bitAt(workId))
- entryPhysToWorkMap->unassign(group, physId, physBaseIndex + physId);
- }
- }
- }
- }
-
- for (RegGroup group : RegGroupVirtValues{}) {
- uint32_t physBaseIndex = _physRegIndex.get(group);
- Support::BitWordIterator<RegMask> it(_availableRegs[group] & ~sharedAssigned[group]);
-
- while (it.hasNext()) {
- uint32_t physId = it.next();
- if (Support::bitTest(physToWorkMap->assigned[group], physId))
- physToWorkMap->unassign(group, physId, physBaseIndex + physId);
- }
- }
-
- return blockEntryAssigned(physToWorkMap);
-}
-
-Error BaseRAPass::blockEntryAssigned(const PhysToWorkMap* physToWorkMap) noexcept {
- // Complex allocation strategy requires to record register assignments upon block entry (or per shared state).
- for (RegGroup group : RegGroupVirtValues{}) {
- if (!_strategy[group].isComplex())
- continue;
-
- uint32_t physBaseIndex = _physRegIndex[group];
- Support::BitWordIterator<RegMask> it(physToWorkMap->assigned[group]);
-
- while (it.hasNext()) {
- uint32_t physId = it.next();
- uint32_t workId = physToWorkMap->workIds[physBaseIndex + physId];
-
- RAWorkReg* workReg = workRegById(workId);
- workReg->addAllocatedMask(Support::bitMask(physId));
- }
- }
-
- return kErrorOk;
-}
-
-// BaseRAPass - Allocation - Utilities
-// ===================================
-
-Error BaseRAPass::useTemporaryMem(BaseMem& out, uint32_t size, uint32_t alignment) noexcept {
- ASMJIT_ASSERT(alignment <= 64);
-
- if (_temporaryMem.isNone()) {
- ASMJIT_PROPAGATE(cc()->_newStack(&_temporaryMem.as<BaseMem>(), size, alignment));
- }
- else {
- ASMJIT_ASSERT(_temporaryMem.as<BaseMem>().isRegHome());
-
- uint32_t virtId = _temporaryMem.as<BaseMem>().baseId();
- VirtReg* virtReg = cc()->virtRegById(virtId);
-
- cc()->setStackSize(virtId, Support::max(virtReg->virtSize(), size),
- Support::max(virtReg->alignment(), alignment));
- }
-
- out = _temporaryMem.as<BaseMem>();
- return kErrorOk;
-}
-
-// BaseRAPass - Allocation - Prolog & Epilog
-// =========================================
-
-Error BaseRAPass::updateStackFrame() noexcept {
- // Update some StackFrame information that we updated during allocation. The only information we don't have at the
- // moment is final local stack size, which is calculated last.
- FuncFrame& frame = func()->frame();
- for (RegGroup group : RegGroupVirtValues{})
- frame.addDirtyRegs(group, _clobberedRegs[group]);
- frame.setLocalStackAlignment(_stackAllocator.alignment());
-
- // If there are stack arguments that are not assigned to registers upon entry and the function doesn't require
- // dynamic stack alignment we keep these arguments where they are. This will also mark all stack slots that match
- // these arguments as allocated.
- if (_numStackArgsToStackSlots)
- ASMJIT_PROPAGATE(_markStackArgsToKeep());
-
- // Calculate offsets of all stack slots and update StackSize to reflect the calculated local stack size.
- ASMJIT_PROPAGATE(_stackAllocator.calculateStackFrame());
- frame.setLocalStackSize(_stackAllocator.stackSize());
-
- // Update the stack frame based on `_argsAssignment` and finalize it. Finalization means to apply final calculation
- // to the stack layout.
- ASMJIT_PROPAGATE(_argsAssignment.updateFuncFrame(frame));
- ASMJIT_PROPAGATE(frame.finalize());
-
- // StackAllocator allocates all stots starting from [0], adjust them when necessary.
- if (frame.localStackOffset() != 0)
- ASMJIT_PROPAGATE(_stackAllocator.adjustSlotOffsets(int32_t(frame.localStackOffset())));
-
- // Again, if there are stack arguments allocated in function's stack we have to handle them. This handles all cases
- // (either regular or dynamic stack alignment).
- if (_numStackArgsToStackSlots)
- ASMJIT_PROPAGATE(_updateStackArgs());
-
- return kErrorOk;
-}
-
-Error BaseRAPass::_markStackArgsToKeep() noexcept {
- FuncFrame& frame = func()->frame();
- bool hasSAReg = frame.hasPreservedFP() || !frame.hasDynamicAlignment();
-
- RAWorkRegs& workRegs = _workRegs;
- uint32_t numWorkRegs = workRegCount();
-
- for (uint32_t workId = 0; workId < numWorkRegs; workId++) {
- RAWorkReg* workReg = workRegs[workId];
- if (workReg->hasFlag(RAWorkRegFlags::kStackArgToStack)) {
- ASMJIT_ASSERT(workReg->hasArgIndex());
- const FuncValue& srcArg = _func->detail().arg(workReg->argIndex());
-
- // If the register doesn't have stack slot then we failed. It doesn't make much sense as it was marked as
- // `kFlagStackArgToStack`, which requires the WorkReg was live-in upon function entry.
- RAStackSlot* slot = workReg->stackSlot();
- if (ASMJIT_UNLIKELY(!slot))
- return DebugUtils::errored(kErrorInvalidState);
-
- if (hasSAReg && srcArg.isStack() && !srcArg.isIndirect()) {
- uint32_t typeSize = TypeUtils::sizeOf(srcArg.typeId());
- if (typeSize == slot->size()) {
- slot->addFlags(RAStackSlot::kFlagStackArg);
- continue;
- }
- }
-
- // NOTE: Update StackOffset here so when `_argsAssignment.updateFuncFrame()` is called it will take into
- // consideration moving to stack slots. Without this we may miss some scratch registers later.
- FuncValue& dstArg = _argsAssignment.arg(workReg->argIndex(), workReg->argValueIndex());
- dstArg.assignStackOffset(0);
- }
- }
-
- return kErrorOk;
-}
-
-Error BaseRAPass::_updateStackArgs() noexcept {
- FuncFrame& frame = func()->frame();
- RAWorkRegs& workRegs = _workRegs;
- uint32_t numWorkRegs = workRegCount();
-
- for (uint32_t workId = 0; workId < numWorkRegs; workId++) {
- RAWorkReg* workReg = workRegs[workId];
- if (workReg->hasFlag(RAWorkRegFlags::kStackArgToStack)) {
- ASMJIT_ASSERT(workReg->hasArgIndex());
- RAStackSlot* slot = workReg->stackSlot();
-
- if (ASMJIT_UNLIKELY(!slot))
- return DebugUtils::errored(kErrorInvalidState);
-
- if (slot->isStackArg()) {
- const FuncValue& srcArg = _func->detail().arg(workReg->argIndex());
- if (frame.hasPreservedFP()) {
- slot->setBaseRegId(_fp.id());
- slot->setOffset(int32_t(frame.saOffsetFromSA()) + srcArg.stackOffset());
- }
- else {
- slot->setOffset(int32_t(frame.saOffsetFromSP()) + srcArg.stackOffset());
- }
- }
- else {
- FuncValue& dstArg = _argsAssignment.arg(workReg->argIndex(), workReg->argValueIndex());
- dstArg.setStackOffset(slot->offset());
- }
- }
- }
-
- return kErrorOk;
-}
-
-Error BaseRAPass::insertPrologEpilog() noexcept {
- FuncFrame& frame = _func->frame();
-
- cc()->_setCursor(func());
- ASMJIT_PROPAGATE(cc()->emitProlog(frame));
- ASMJIT_PROPAGATE(_iEmitHelper->emitArgsAssignment(frame, _argsAssignment));
-
- cc()->_setCursor(func()->exitNode());
- ASMJIT_PROPAGATE(cc()->emitEpilog(frame));
-
- return kErrorOk;
-}
-
-// BaseRAPass - Rewriter
-// =====================
-
-Error BaseRAPass::rewrite() noexcept {
- return _rewrite(_func, _stop);
-}
-
-// [[pure virtual]]
-Error BaseRAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept {
- DebugUtils::unused(first, stop);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// BaseRAPass - Emit
-// =================
-
-// [[pure virtual]]
-Error BaseRAPass::emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
- DebugUtils::unused(workId, dstPhysId, srcPhysId);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseRAPass::emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
- DebugUtils::unused(aWorkId, aPhysId, bWorkId, bPhysId);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseRAPass::emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept {
- DebugUtils::unused(workId, dstPhysId);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseRAPass::emitSave(uint32_t workId, uint32_t srcPhysId) noexcept {
- DebugUtils::unused(workId, srcPhysId);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// [[pure virtual]]
-Error BaseRAPass::emitJump(const Label& label) noexcept {
- DebugUtils::unused(label);
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-Error BaseRAPass::emitPreCall(InvokeNode* invokeNode) noexcept {
- DebugUtils::unused(invokeNode);
- return DebugUtils::errored(kErrorOk);
-}
-
-// BaseRAPass - Logging
-// ====================
-
-#ifndef ASMJIT_NO_LOGGING
-static void RAPass_formatLiveness(BaseRAPass* pass, String& sb, const RAInst* raInst) noexcept {
- const RATiedReg* tiedRegs = raInst->tiedRegs();
- uint32_t tiedCount = raInst->tiedCount();
-
- for (uint32_t i = 0; i < tiedCount; i++) {
- const RATiedReg& tiedReg = tiedRegs[i];
-
- if (i != 0)
- sb.append(' ');
-
- sb.appendFormat("%s{", pass->workRegById(tiedReg.workId())->name());
- sb.append(tiedReg.isReadWrite() ? 'X' :
- tiedReg.isRead() ? 'R' :
- tiedReg.isWrite() ? 'W' : '?');
-
- if (tiedReg.isLeadConsecutive())
- sb.appendFormat("|Lead[%u]", tiedReg.consecutiveData() + 1u);
-
- if (tiedReg.hasUseId())
- sb.appendFormat("|Use=%u", tiedReg.useId());
- else if (tiedReg.isUse())
- sb.append("|Use");
-
- if (tiedReg.isUseConsecutive() && !tiedReg.isLeadConsecutive())
- sb.appendFormat("+%u", tiedReg.consecutiveData());
-
- if (tiedReg.hasOutId())
- sb.appendFormat("|Out=%u", tiedReg.outId());
- else if (tiedReg.isOut())
- sb.append("|Out");
-
- if (tiedReg.isOutConsecutive() && !tiedReg.isLeadConsecutive())
- sb.appendFormat("+%u", tiedReg.consecutiveData());
-
- if (tiedReg.isLast())
- sb.append("|Last");
-
- if (tiedReg.isKill())
- sb.append("|Kill");
-
- sb.append("}");
- }
-}
-
-ASMJIT_FAVOR_SIZE Error BaseRAPass::annotateCode() noexcept {
- StringTmp<1024> sb;
-
- for (const RABlock* block : _blocks) {
- BaseNode* node = block->first();
- if (!node) continue;
-
- BaseNode* last = block->last();
- for (;;) {
- sb.clear();
- Formatter::formatNode(sb, _formatOptions, cc(), node);
-
- if (hasDiagnosticOption(DiagnosticOptions::kRADebugLiveness) && node->isInst() && node->hasPassData()) {
- const RAInst* raInst = node->passData<RAInst>();
- if (raInst->tiedCount() > 0) {
- sb.padEnd(40);
- sb.append(" | ");
- RAPass_formatLiveness(this, sb, raInst);
- }
- }
-
- node->setInlineComment(static_cast<char*>(cc()->_dataZone.dup(sb.data(), sb.size(), true)));
- if (node == last)
- break;
- node = node->next();
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error BaseRAPass::_dumpBlockIds(String& sb, const RABlocks& blocks) noexcept {
- for (uint32_t i = 0, size = blocks.size(); i < size; i++) {
- const RABlock* block = blocks[i];
- if (i != 0)
- ASMJIT_PROPAGATE(sb.appendFormat(", #%u", block->blockId()));
- else
- ASMJIT_PROPAGATE(sb.appendFormat("#%u", block->blockId()));
- }
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error BaseRAPass::_dumpBlockLiveness(String& sb, const RABlock* block) noexcept {
- for (uint32_t liveType = 0; liveType < RABlock::kLiveCount; liveType++) {
- const char* bitsName = liveType == RABlock::kLiveIn ? "IN " :
- liveType == RABlock::kLiveOut ? "OUT " :
- liveType == RABlock::kLiveGen ? "GEN " : "KILL";
-
- const ZoneBitVector& bits = block->_liveBits[liveType];
- uint32_t size = bits.size();
- ASMJIT_ASSERT(size <= workRegCount());
-
- uint32_t n = 0;
- for (uint32_t workId = 0; workId < size; workId++) {
- if (bits.bitAt(workId)) {
- RAWorkReg* wReg = workRegById(workId);
-
- if (!n)
- sb.appendFormat(" %s [", bitsName);
- else
- sb.append(", ");
-
- sb.append(wReg->name());
- n++;
- }
- }
-
- if (n)
- sb.append("]\n");
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error BaseRAPass::_dumpLiveSpans(String& sb) noexcept {
- uint32_t numWorkRegs = _workRegs.size();
- uint32_t maxSize = _maxWorkRegNameSize;
-
- for (uint32_t workId = 0; workId < numWorkRegs; workId++) {
- RAWorkReg* workReg = _workRegs[workId];
-
- sb.append(" ");
-
- size_t oldSize = sb.size();
- sb.append(workReg->name());
- sb.padEnd(oldSize + maxSize);
-
- RALiveStats& stats = workReg->liveStats();
- sb.appendFormat(" {id:%04u width: %-4u freq: %0.4f priority=%0.4f}",
- workReg->virtId(),
- stats.width(),
- stats.freq(),
- stats.priority());
- sb.append(": ");
-
- LiveRegSpans& liveSpans = workReg->liveSpans();
- for (uint32_t x = 0; x < liveSpans.size(); x++) {
- const LiveRegSpan& liveSpan = liveSpans[x];
- if (x)
- sb.append(", ");
- sb.appendFormat("[%u:%u]", liveSpan.a, liveSpan.b);
- }
-
- sb.append('\n');
- }
-
- return kErrorOk;
-}
-#endif
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/core/rapass_p.h b/3rdparty/asmjit/src/asmjit/core/rapass_p.h
deleted file mode 100644
index 90d4ae49be5..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/rapass_p.h
+++ /dev/null
@@ -1,1183 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_RAPASS_P_H_INCLUDED
-#define ASMJIT_CORE_RAPASS_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/compiler.h"
-#include "../core/emithelper_p.h"
-#include "../core/raassignment_p.h"
-#include "../core/radefs_p.h"
-#include "../core/rastack_p.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_ra
-//! \{
-
-//! Flags used by \ref RABlock.
-enum class RABlockFlags : uint32_t {
- //! No flags.
- kNone = 0,
-
- //! Block has been constructed from nodes.
- kIsConstructed = 0x00000001u,
- //! Block is reachable (set by `buildCFGViews()`).
- kIsReachable = 0x00000002u,
- //! Block is a target (has an associated label or multiple labels).
- kIsTargetable = 0x00000004u,
- //! Block has been allocated.
- kIsAllocated = 0x00000008u,
- //! Block is a function-exit.
- kIsFuncExit = 0x00000010u,
-
- //! Block has a terminator (jump, conditional jump, ret).
- kHasTerminator = 0x00000100u,
- //! Block naturally flows to the next block.
- kHasConsecutive = 0x00000200u,
- //! Block has a jump to a jump-table at the end.
- kHasJumpTable = 0x00000400u,
- //! Block contains fixed registers (precolored).
- kHasFixedRegs = 0x00000800u,
- //! Block contains function calls.
- kHasFuncCalls = 0x00001000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(RABlockFlags)
-
-//! Basic block used by register allocator pass.
-class RABlock {
-public:
- ASMJIT_NONCOPYABLE(RABlock)
-
- typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
- typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
-
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- //! Unassigned block id.
- kUnassignedId = 0xFFFFFFFFu
- };
-
- enum LiveType : uint32_t {
- kLiveIn = 0,
- kLiveOut = 1,
- kLiveGen = 2,
- kLiveKill = 3,
- kLiveCount = 4
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Register allocator pass.
- BaseRAPass* _ra;
-
- //! Block id (indexed from zero).
- uint32_t _blockId = kUnassignedId;
- //! Block flags, see `Flags`.
- RABlockFlags _flags = RABlockFlags::kNone;
-
- //! First `BaseNode` of this block (inclusive).
- BaseNode* _first = nullptr;
- //! Last `BaseNode` of this block (inclusive).
- BaseNode* _last = nullptr;
-
- //! Initial position of this block (inclusive).
- uint32_t _firstPosition = 0;
- //! End position of this block (exclusive).
- uint32_t _endPosition = 0;
-
- //! Weight of this block (default 0, each loop adds one).
- uint32_t _weight = 0;
- //! Post-order view order, used during POV construction.
- uint32_t _povOrder = 0;
-
- //! Basic statistics about registers.
- RARegsStats _regsStats = RARegsStats();
- //! Maximum live-count per register group.
- RALiveCount _maxLiveCount = RALiveCount();
-
- //! Timestamp (used by block visitors).
- mutable uint64_t _timestamp = 0;
- //! Immediate dominator of this block.
- RABlock* _idom = nullptr;
-
- //! Block predecessors.
- RABlocks _predecessors {};
- //! Block successors.
- RABlocks _successors {};
-
- //! Liveness in/out/use/kill.
- ZoneBitVector _liveBits[kLiveCount] {};
-
- //! Shared assignment it or `Globals::kInvalidId` if this block doesn't have shared assignment.
- //! See \ref RASharedAssignment for more details.
- uint32_t _sharedAssignmentId = Globals::kInvalidId;
- //! Scratch registers that cannot be allocated upon block entry.
- RegMask _entryScratchGpRegs = 0;
- //! Scratch registers used at exit, by a terminator instruction.
- RegMask _exitScratchGpRegs = 0;
-
- //! Register assignment on entry.
- PhysToWorkMap* _entryPhysToWorkMap = nullptr;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RABlock(BaseRAPass* ra) noexcept
- : _ra(ra) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG BaseRAPass* pass() const noexcept { return _ra; }
- ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept;
-
- ASMJIT_INLINE_NODEBUG uint32_t blockId() const noexcept { return _blockId; }
- ASMJIT_INLINE_NODEBUG RABlockFlags flags() const noexcept { return _flags; }
-
- ASMJIT_INLINE_NODEBUG bool hasFlag(RABlockFlags flag) const noexcept { return Support::test(_flags, flag); }
- ASMJIT_INLINE_NODEBUG void addFlags(RABlockFlags flags) noexcept { _flags |= flags; }
-
- ASMJIT_INLINE_NODEBUG bool isAssigned() const noexcept { return _blockId != kUnassignedId; }
-
- ASMJIT_INLINE_NODEBUG bool isConstructed() const noexcept { return hasFlag(RABlockFlags::kIsConstructed); }
- ASMJIT_INLINE_NODEBUG bool isReachable() const noexcept { return hasFlag(RABlockFlags::kIsReachable); }
- ASMJIT_INLINE_NODEBUG bool isTargetable() const noexcept { return hasFlag(RABlockFlags::kIsTargetable); }
- ASMJIT_INLINE_NODEBUG bool isAllocated() const noexcept { return hasFlag(RABlockFlags::kIsAllocated); }
- ASMJIT_INLINE_NODEBUG bool isFuncExit() const noexcept { return hasFlag(RABlockFlags::kIsFuncExit); }
- ASMJIT_INLINE_NODEBUG bool hasTerminator() const noexcept { return hasFlag(RABlockFlags::kHasTerminator); }
- ASMJIT_INLINE_NODEBUG bool hasConsecutive() const noexcept { return hasFlag(RABlockFlags::kHasConsecutive); }
- ASMJIT_INLINE_NODEBUG bool hasJumpTable() const noexcept { return hasFlag(RABlockFlags::kHasJumpTable); }
-
- ASMJIT_INLINE_NODEBUG void makeConstructed(const RARegsStats& regStats) noexcept {
- _flags |= RABlockFlags::kIsConstructed;
- _regsStats.combineWith(regStats);
- }
-
- ASMJIT_INLINE_NODEBUG void makeReachable() noexcept { _flags |= RABlockFlags::kIsReachable; }
- ASMJIT_INLINE_NODEBUG void makeTargetable() noexcept { _flags |= RABlockFlags::kIsTargetable; }
- ASMJIT_INLINE_NODEBUG void makeAllocated() noexcept { _flags |= RABlockFlags::kIsAllocated; }
-
- ASMJIT_INLINE_NODEBUG const RARegsStats& regsStats() const noexcept { return _regsStats; }
-
- ASMJIT_INLINE_NODEBUG bool hasPredecessors() const noexcept { return !_predecessors.empty(); }
- ASMJIT_INLINE_NODEBUG bool hasSuccessors() const noexcept { return !_successors.empty(); }
-
- ASMJIT_INLINE_NODEBUG bool hasSuccessor(RABlock* block) noexcept {
- if (block->_predecessors.size() < _successors.size())
- return block->_predecessors.contains(this);
- else
- return _successors.contains(block);
- }
-
- ASMJIT_INLINE_NODEBUG const RABlocks& predecessors() const noexcept { return _predecessors; }
- ASMJIT_INLINE_NODEBUG const RABlocks& successors() const noexcept { return _successors; }
-
- ASMJIT_INLINE_NODEBUG BaseNode* first() const noexcept { return _first; }
- ASMJIT_INLINE_NODEBUG BaseNode* last() const noexcept { return _last; }
-
- ASMJIT_INLINE_NODEBUG void setFirst(BaseNode* node) noexcept { _first = node; }
- ASMJIT_INLINE_NODEBUG void setLast(BaseNode* node) noexcept { _last = node; }
-
- ASMJIT_INLINE_NODEBUG uint32_t firstPosition() const noexcept { return _firstPosition; }
- ASMJIT_INLINE_NODEBUG void setFirstPosition(uint32_t position) noexcept { _firstPosition = position; }
-
- ASMJIT_INLINE_NODEBUG uint32_t endPosition() const noexcept { return _endPosition; }
- ASMJIT_INLINE_NODEBUG void setEndPosition(uint32_t position) noexcept { _endPosition = position; }
-
- ASMJIT_INLINE_NODEBUG uint32_t povOrder() const noexcept { return _povOrder; }
-
- ASMJIT_INLINE_NODEBUG RegMask entryScratchGpRegs() const noexcept;
- ASMJIT_INLINE_NODEBUG RegMask exitScratchGpRegs() const noexcept { return _exitScratchGpRegs; }
-
- ASMJIT_INLINE_NODEBUG void addEntryScratchGpRegs(RegMask regMask) noexcept { _entryScratchGpRegs |= regMask; }
- ASMJIT_INLINE_NODEBUG void addExitScratchGpRegs(RegMask regMask) noexcept { _exitScratchGpRegs |= regMask; }
-
- ASMJIT_INLINE_NODEBUG bool hasSharedAssignmentId() const noexcept { return _sharedAssignmentId != Globals::kInvalidId; }
- ASMJIT_INLINE_NODEBUG uint32_t sharedAssignmentId() const noexcept { return _sharedAssignmentId; }
- ASMJIT_INLINE_NODEBUG void setSharedAssignmentId(uint32_t id) noexcept { _sharedAssignmentId = id; }
-
- ASMJIT_INLINE_NODEBUG uint64_t timestamp() const noexcept { return _timestamp; }
- ASMJIT_INLINE_NODEBUG bool hasTimestamp(uint64_t ts) const noexcept { return _timestamp == ts; }
- ASMJIT_INLINE_NODEBUG void setTimestamp(uint64_t ts) const noexcept { _timestamp = ts; }
- ASMJIT_INLINE_NODEBUG void resetTimestamp() const noexcept { _timestamp = 0; }
-
- ASMJIT_INLINE_NODEBUG RABlock* consecutive() const noexcept { return hasConsecutive() ? _successors[0] : nullptr; }
-
- ASMJIT_INLINE_NODEBUG RABlock* iDom() noexcept { return _idom; }
- ASMJIT_INLINE_NODEBUG const RABlock* iDom() const noexcept { return _idom; }
- ASMJIT_INLINE_NODEBUG void setIDom(RABlock* block) noexcept { _idom = block; }
-
- ASMJIT_INLINE_NODEBUG ZoneBitVector& liveIn() noexcept { return _liveBits[kLiveIn]; }
- ASMJIT_INLINE_NODEBUG const ZoneBitVector& liveIn() const noexcept { return _liveBits[kLiveIn]; }
-
- ASMJIT_INLINE_NODEBUG ZoneBitVector& liveOut() noexcept { return _liveBits[kLiveOut]; }
- ASMJIT_INLINE_NODEBUG const ZoneBitVector& liveOut() const noexcept { return _liveBits[kLiveOut]; }
-
- ASMJIT_INLINE_NODEBUG ZoneBitVector& gen() noexcept { return _liveBits[kLiveGen]; }
- ASMJIT_INLINE_NODEBUG const ZoneBitVector& gen() const noexcept { return _liveBits[kLiveGen]; }
-
- ASMJIT_INLINE_NODEBUG ZoneBitVector& kill() noexcept { return _liveBits[kLiveKill]; }
- ASMJIT_INLINE_NODEBUG const ZoneBitVector& kill() const noexcept { return _liveBits[kLiveKill]; }
-
- inline Error resizeLiveBits(uint32_t size) noexcept {
- ASMJIT_PROPAGATE(_liveBits[kLiveIn ].resize(allocator(), size));
- ASMJIT_PROPAGATE(_liveBits[kLiveOut ].resize(allocator(), size));
- ASMJIT_PROPAGATE(_liveBits[kLiveGen ].resize(allocator(), size));
- ASMJIT_PROPAGATE(_liveBits[kLiveKill].resize(allocator(), size));
- return kErrorOk;
- }
-
- ASMJIT_INLINE_NODEBUG bool hasEntryAssignment() const noexcept { return _entryPhysToWorkMap != nullptr; }
- ASMJIT_INLINE_NODEBUG PhysToWorkMap* entryPhysToWorkMap() const noexcept { return _entryPhysToWorkMap; }
- ASMJIT_INLINE_NODEBUG void setEntryAssignment(PhysToWorkMap* physToWorkMap) noexcept { _entryPhysToWorkMap = physToWorkMap; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Adds a successor to this block, and predecessor to `successor`, making connection on both sides.
- //!
- //! This API must be used to manage successors and predecessors, never manage it manually.
- Error appendSuccessor(RABlock* successor) noexcept;
-
- //! Similar to `appendSuccessor()`, but does prepend instead append.
- //!
- //! This function is used to add a natural flow (always first) to the block.
- Error prependSuccessor(RABlock* successor) noexcept;
-
- //! \}
-};
-
-//! Register allocator's data associated with each `InstNode`.
-class RAInst {
-public:
- ASMJIT_NONCOPYABLE(RAInst)
-
- //! \name Members
- //! \{
-
- //! Parent block.
- RABlock* _block;
- //! Instruction RW flags.
- InstRWFlags _instRWFlags;
- //! Aggregated RATiedFlags from all operands & instruction specific flags.
- RATiedFlags _flags;
- //! Total count of RATiedReg's.
- uint32_t _tiedTotal;
- //! Index of RATiedReg's per register group.
- RARegIndex _tiedIndex;
- //! Count of RATiedReg's per register group.
- RARegCount _tiedCount;
- //! Number of live, and thus interfering VirtReg's at this point.
- RALiveCount _liveCount;
- //! Fixed physical registers used.
- RARegMask _usedRegs;
- //! Clobbered registers (by a function call).
- RARegMask _clobberedRegs;
- //! Tied registers.
- RATiedReg _tiedRegs[1];
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- inline RAInst(RABlock* block, InstRWFlags instRWFlags, RATiedFlags tiedFlags, uint32_t tiedTotal, const RARegMask& clobberedRegs) noexcept {
- _block = block;
- _instRWFlags = instRWFlags;
- _flags = tiedFlags;
- _tiedTotal = tiedTotal;
- _tiedIndex.reset();
- _tiedCount.reset();
- _liveCount.reset();
- _usedRegs.reset();
- _clobberedRegs = clobberedRegs;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns instruction RW flags.
- ASMJIT_INLINE_NODEBUG InstRWFlags instRWFlags() const noexcept { return _instRWFlags; };
- //! Tests whether the given `flag` is present in instruction RW flags.
- ASMJIT_INLINE_NODEBUG bool hasInstRWFlag(InstRWFlags flag) const noexcept { return Support::test(_instRWFlags, flag); }
- //! Adds `flags` to instruction RW flags.
- ASMJIT_INLINE_NODEBUG void addInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags |= flags; }
-
- //! Returns the instruction flags.
- ASMJIT_INLINE_NODEBUG RATiedFlags flags() const noexcept { return _flags; }
- //! Tests whether the instruction has flag `flag`.
- ASMJIT_INLINE_NODEBUG bool hasFlag(RATiedFlags flag) const noexcept { return Support::test(_flags, flag); }
- //! Replaces the existing instruction flags with `flags`.
- ASMJIT_INLINE_NODEBUG void setFlags(RATiedFlags flags) noexcept { _flags = flags; }
- //! Adds instruction `flags` to this RAInst.
- ASMJIT_INLINE_NODEBUG void addFlags(RATiedFlags flags) noexcept { _flags |= flags; }
- //! Clears instruction `flags` from this RAInst.
- ASMJIT_INLINE_NODEBUG void clearFlags(RATiedFlags flags) noexcept { _flags &= ~flags; }
-
- //! Tests whether this instruction can be transformed to another instruction if necessary.
- ASMJIT_INLINE_NODEBUG bool isTransformable() const noexcept { return hasFlag(RATiedFlags::kInst_IsTransformable); }
-
- //! Returns the associated block with this RAInst.
- ASMJIT_INLINE_NODEBUG RABlock* block() const noexcept { return _block; }
-
- //! Returns tied registers (all).
- ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs() const noexcept { return const_cast<RATiedReg*>(_tiedRegs); }
- //! Returns tied registers for a given `group`.
- ASMJIT_INLINE_NODEBUG RATiedReg* tiedRegs(RegGroup group) const noexcept { return const_cast<RATiedReg*>(_tiedRegs) + _tiedIndex.get(group); }
-
- //! Returns count of all tied registers.
- ASMJIT_INLINE_NODEBUG uint32_t tiedCount() const noexcept { return _tiedTotal; }
- //! Returns count of tied registers of a given `group`.
- ASMJIT_INLINE_NODEBUG uint32_t tiedCount(RegGroup group) const noexcept { return _tiedCount[group]; }
-
- //! Returns `RATiedReg` at the given `index`.
- inline RATiedReg* tiedAt(uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < _tiedTotal);
- return tiedRegs() + index;
- }
-
- //! Returns `RATiedReg` at the given `index` of the given register `group`.
- inline RATiedReg* tiedOf(RegGroup group, uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < _tiedCount.get(group));
- return tiedRegs(group) + index;
- }
-
- inline void setTiedAt(uint32_t index, RATiedReg& tied) noexcept {
- ASMJIT_ASSERT(index < _tiedTotal);
- _tiedRegs[index] = tied;
- }
-
- //! \name Static Functions
- //! \{
-
- static ASMJIT_INLINE_NODEBUG size_t sizeOf(uint32_t tiedRegCount) noexcept {
- return sizeof(RAInst) - sizeof(RATiedReg) + tiedRegCount * sizeof(RATiedReg);
- }
-
- //! \}
-};
-
-//! A helper class that is used to build an array of RATiedReg items that are then copied to `RAInst`.
-class RAInstBuilder {
-public:
- ASMJIT_NONCOPYABLE(RAInstBuilder)
-
- //! \name Members
- //! \{
-
- //! Instruction RW flags.
- InstRWFlags _instRWFlags;
-
- //! Flags combined from all RATiedReg's.
- RATiedFlags _aggregatedFlags;
- //! Flags that will be cleared before storing the aggregated flags to `RAInst`.
- RATiedFlags _forbiddenFlags;
- RARegCount _count;
- RARegsStats _stats;
-
- RARegMask _used;
- RARegMask _clobbered;
-
- //! Current tied register in `_tiedRegs`.
- RATiedReg* _cur;
- //! Array of temporary tied registers.
- RATiedReg _tiedRegs[128];
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RAInstBuilder() noexcept { reset(); }
-
- ASMJIT_INLINE_NODEBUG void init() noexcept { reset(); }
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _instRWFlags = InstRWFlags::kNone;
- _aggregatedFlags = RATiedFlags::kNone;
- _forbiddenFlags = RATiedFlags::kNone;
- _count.reset();
- _stats.reset();
- _used.reset();
- _clobbered.reset();
- _cur = _tiedRegs;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG InstRWFlags instRWFlags() const noexcept { return _instRWFlags; }
- ASMJIT_INLINE_NODEBUG bool hasInstRWFlag(InstRWFlags flag) const noexcept { return Support::test(_instRWFlags, flag); }
- ASMJIT_INLINE_NODEBUG void addInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags |= flags; }
- ASMJIT_INLINE_NODEBUG void clearInstRWFlags(InstRWFlags flags) noexcept { _instRWFlags &= ~flags; }
-
- ASMJIT_INLINE_NODEBUG RATiedFlags aggregatedFlags() const noexcept { return _aggregatedFlags; }
- ASMJIT_INLINE_NODEBUG void addAggregatedFlags(RATiedFlags flags) noexcept { _aggregatedFlags |= flags; }
-
- ASMJIT_INLINE_NODEBUG RATiedFlags forbiddenFlags() const noexcept { return _forbiddenFlags; }
- ASMJIT_INLINE_NODEBUG void addForbiddenFlags(RATiedFlags flags) noexcept { _forbiddenFlags |= flags; }
-
- //! Returns the number of tied registers added to the builder.
- ASMJIT_INLINE_NODEBUG uint32_t tiedRegCount() const noexcept { return uint32_t((size_t)(_cur - _tiedRegs)); }
-
- ASMJIT_INLINE_NODEBUG RATiedReg* begin() noexcept { return _tiedRegs; }
- ASMJIT_INLINE_NODEBUG RATiedReg* end() noexcept { return _cur; }
-
- ASMJIT_INLINE_NODEBUG const RATiedReg* begin() const noexcept { return _tiedRegs; }
- ASMJIT_INLINE_NODEBUG const RATiedReg* end() const noexcept { return _cur; }
-
- //! Returns `RATiedReg` at the given `index`.
- inline RATiedReg* operator[](uint32_t index) noexcept {
- ASMJIT_ASSERT(index < tiedRegCount());
- return &_tiedRegs[index];
- }
-
- //! Returns `RATiedReg` at the given `index`. (const).
- inline const RATiedReg* operator[](uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < tiedRegCount());
- return &_tiedRegs[index];
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- Error add(
- RAWorkReg* workReg,
- RATiedFlags flags,
- RegMask useRegMask, uint32_t useId, uint32_t useRewriteMask,
- RegMask outRegMask, uint32_t outId, uint32_t outRewriteMask,
- uint32_t rmSize = 0,
- uint32_t consecutiveParent = Globals::kInvalidId) noexcept {
-
- RegGroup group = workReg->group();
- RATiedReg* tiedReg = workReg->tiedReg();
-
- if (useId != BaseReg::kIdBad) {
- _stats.makeFixed(group);
- _used[group] |= Support::bitMask(useId);
- flags |= RATiedFlags::kUseFixed;
- }
-
- if (outId != BaseReg::kIdBad) {
- _clobbered[group] |= Support::bitMask(outId);
- flags |= RATiedFlags::kOutFixed;
- }
-
- _aggregatedFlags |= flags;
- _stats.makeUsed(group);
-
- if (!tiedReg) {
- // Could happen when the builder is not reset properly after each instruction.
- ASMJIT_ASSERT(tiedRegCount() < ASMJIT_ARRAY_SIZE(_tiedRegs));
-
- tiedReg = _cur++;
- tiedReg->init(workReg->workId(), flags, useRegMask, useId, useRewriteMask, outRegMask, outId, outRewriteMask, rmSize, consecutiveParent);
- workReg->setTiedReg(tiedReg);
-
- _count.add(group);
- return kErrorOk;
- }
- else {
- if (consecutiveParent != tiedReg->consecutiveParent()) {
- if (tiedReg->consecutiveParent() != Globals::kInvalidId)
- return DebugUtils::errored(kErrorInvalidState);
- tiedReg->_consecutiveParent = consecutiveParent;
- }
-
- if (useId != BaseReg::kIdBad) {
- if (ASMJIT_UNLIKELY(tiedReg->hasUseId()))
- return DebugUtils::errored(kErrorOverlappedRegs);
- tiedReg->setUseId(useId);
- }
-
- if (outId != BaseReg::kIdBad) {
- if (ASMJIT_UNLIKELY(tiedReg->hasOutId()))
- return DebugUtils::errored(kErrorOverlappedRegs);
- tiedReg->setOutId(outId);
- }
-
- tiedReg->addRefCount();
- tiedReg->addFlags(flags);
- tiedReg->_useRegMask &= useRegMask;
- tiedReg->_useRewriteMask |= useRewriteMask;
- tiedReg->_outRegMask &= outRegMask;
- tiedReg->_outRewriteMask |= outRewriteMask;
- tiedReg->_rmSize = uint8_t(Support::max<uint32_t>(tiedReg->rmSize(), rmSize));
- return kErrorOk;
- }
- }
-
- Error addCallArg(RAWorkReg* workReg, uint32_t useId) noexcept {
- ASMJIT_ASSERT(useId != BaseReg::kIdBad);
-
- RATiedFlags flags = RATiedFlags::kUse | RATiedFlags::kRead | RATiedFlags::kUseFixed;
- RegGroup group = workReg->group();
- RegMask allocable = Support::bitMask(useId);
-
- _aggregatedFlags |= flags;
- _used[group] |= allocable;
- _stats.makeFixed(group);
- _stats.makeUsed(group);
-
- RATiedReg* tiedReg = workReg->tiedReg();
- if (!tiedReg) {
- // Could happen when the builder is not reset properly after each instruction.
- ASMJIT_ASSERT(tiedRegCount() < ASMJIT_ARRAY_SIZE(_tiedRegs));
-
- tiedReg = _cur++;
- tiedReg->init(workReg->workId(), flags, allocable, useId, 0, allocable, BaseReg::kIdBad, 0);
- workReg->setTiedReg(tiedReg);
-
- _count.add(group);
- return kErrorOk;
- }
- else {
- if (tiedReg->hasUseId()) {
- flags |= RATiedFlags::kDuplicate;
- tiedReg->_useRegMask |= allocable;
- }
- else {
- tiedReg->setUseId(useId);
- tiedReg->_useRegMask &= allocable;
- }
-
- tiedReg->addRefCount();
- tiedReg->addFlags(flags);
- return kErrorOk;
- }
- }
-
- Error addCallRet(RAWorkReg* workReg, uint32_t outId) noexcept {
- ASMJIT_ASSERT(outId != BaseReg::kIdBad);
-
- RATiedFlags flags = RATiedFlags::kOut | RATiedFlags::kWrite | RATiedFlags::kOutFixed;
- RegGroup group = workReg->group();
- RegMask outRegs = Support::bitMask(outId);
-
- _aggregatedFlags |= flags;
- _used[group] |= outRegs;
- _stats.makeFixed(group);
- _stats.makeUsed(group);
-
- RATiedReg* tiedReg = workReg->tiedReg();
- if (!tiedReg) {
- // Could happen when the builder is not reset properly after each instruction.
- ASMJIT_ASSERT(tiedRegCount() < ASMJIT_ARRAY_SIZE(_tiedRegs));
-
- tiedReg = _cur++;
- tiedReg->init(workReg->workId(), flags, Support::allOnes<RegMask>(), BaseReg::kIdBad, 0, outRegs, outId, 0);
- workReg->setTiedReg(tiedReg);
-
- _count.add(group);
- return kErrorOk;
- }
- else {
- if (tiedReg->hasOutId())
- return DebugUtils::errored(kErrorOverlappedRegs);
-
- tiedReg->addRefCount();
- tiedReg->addFlags(flags);
- tiedReg->setOutId(outId);
- return kErrorOk;
- }
- }
-
- //! \}
-};
-
-//! Intersection of multiple register assignments.
-//!
-//! See \ref RAAssignment for more information about register assignments.
-class RASharedAssignment {
-public:
- typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
- typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
-
- //! \name Members
- //! \{
-
- //! Bit-mask of registers that cannot be used upon a block entry, for each block that has this shared assignment.
- //! Scratch registers can come from ISA limits (like jecx/loop instructions on x86) or because the registers are
- //! used by jump/branch instruction that uses registers to perform an indirect jump.
- RegMask _entryScratchGpRegs = 0;
- //! Union of all live-in registers.
- ZoneBitVector _liveIn {};
- //! Register assignment (PhysToWork).
- PhysToWorkMap* _physToWorkMap = nullptr;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _physToWorkMap == nullptr; }
-
- ASMJIT_INLINE_NODEBUG RegMask entryScratchGpRegs() const noexcept { return _entryScratchGpRegs; }
- ASMJIT_INLINE_NODEBUG void addEntryScratchGpRegs(RegMask mask) noexcept { _entryScratchGpRegs |= mask; }
-
- ASMJIT_INLINE_NODEBUG const ZoneBitVector& liveIn() const noexcept { return _liveIn; }
-
- ASMJIT_INLINE_NODEBUG PhysToWorkMap* physToWorkMap() const noexcept { return _physToWorkMap; }
- ASMJIT_INLINE_NODEBUG void assignPhysToWorkMap(PhysToWorkMap* physToWorkMap) noexcept { _physToWorkMap = physToWorkMap; }
-
- //! \}
-};
-
-//! Register allocation pass used by `BaseCompiler`.
-class BaseRAPass : public FuncPass {
-public:
- ASMJIT_NONCOPYABLE(BaseRAPass)
- typedef FuncPass Base;
-
- enum : uint32_t {
- kCallArgWeight = 80
- };
-
- typedef RAAssignment::PhysToWorkMap PhysToWorkMap;
- typedef RAAssignment::WorkToPhysMap WorkToPhysMap;
-
- //! \name Members
- //! \{
-
- //! Allocator that uses zone passed to `runOnFunction()`.
- ZoneAllocator _allocator {};
- //! Emit helper.
- BaseEmitHelper* _iEmitHelper = nullptr;
-
- //! Logger, disabled if null.
- Logger* _logger = nullptr;
- //! Format options, copied from Logger, or zeroed if there is no logger.
- FormatOptions _formatOptions {};
- //! Diagnostic options, copied from Emitter, or zeroed if there is no logger.
- DiagnosticOptions _diagnosticOptions {};
-
- //! Function being processed.
- FuncNode* _func = nullptr;
- //! Stop node.
- BaseNode* _stop = nullptr;
- //! Node that is used to insert extra code after the function body.
- BaseNode* _extraBlock = nullptr;
-
- //! Blocks (first block is the entry, always exists).
- RABlocks _blocks {};
- //! Function exit blocks (usually one, but can contain more).
- RABlocks _exits {};
- //! Post order view (POV).
- RABlocks _pov {};
-
- //! Number of instruction nodes.
- uint32_t _instructionCount = 0;
- //! Number of created blocks (internal).
- uint32_t _createdBlockCount = 0;
-
- //! Shared assignment blocks.
- ZoneVector<RASharedAssignment> _sharedAssignments {};
-
- //! Timestamp generator (incremental).
- mutable uint64_t _lastTimestamp = 0;
-
- //! Architecture traits.
- const ArchTraits* _archTraits = nullptr;
- //! Index to physical registers in `RAAssignment::PhysToWorkMap`.
- RARegIndex _physRegIndex = RARegIndex();
- //! Count of physical registers in `RAAssignment::PhysToWorkMap`.
- RARegCount _physRegCount = RARegCount();
- //! Total number of physical registers.
- uint32_t _physRegTotal = 0;
- //! Indexes of a possible scratch registers that can be selected if necessary.
- Support::Array<uint8_t, 2> _scratchRegIndexes {};
-
- //! Registers available for allocation.
- RARegMask _availableRegs = RARegMask();
- //! Count of physical registers per group.
- RARegCount _availableRegCount = RARegCount();
- //! Registers clobbered by the function.
- RARegMask _clobberedRegs = RARegMask();
-
- //! Work registers (registers used by the function).
- RAWorkRegs _workRegs;
- //! Work registers per register group.
- Support::Array<RAWorkRegs, Globals::kNumVirtGroups> _workRegsOfGroup;
-
- //! Register allocation strategy per register group.
- Support::Array<RAStrategy, Globals::kNumVirtGroups> _strategy;
- //! Global max live-count (from all blocks) per register group.
- RALiveCount _globalMaxLiveCount = RALiveCount();
- //! Global live spans per register group.
- Support::Array<LiveRegSpans*, Globals::kNumVirtGroups> _globalLiveSpans {};
- //! Temporary stack slot.
- Operand _temporaryMem = Operand();
-
- //! Stack pointer.
- BaseReg _sp = BaseReg();
- //! Frame pointer.
- BaseReg _fp = BaseReg();
- //! Stack manager.
- RAStackAllocator _stackAllocator {};
- //! Function arguments assignment.
- FuncArgsAssignment _argsAssignment {};
- //! Some StackArgs have to be assigned to StackSlots.
- uint32_t _numStackArgsToStackSlots = 0;
-
- //! Maximum name-size computed from all WorkRegs.
- uint32_t _maxWorkRegNameSize = 0;
- //! Temporary string builder used to format comments.
- StringTmp<80> _tmpString;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- BaseRAPass() noexcept;
- ~BaseRAPass() noexcept override;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns \ref Logger passed to \ref runOnFunction().
- ASMJIT_INLINE_NODEBUG Logger* logger() const noexcept { return _logger; }
-
- //! Returns either a valid logger if the given `option` is set and logging is enabled, or nullptr.
- ASMJIT_INLINE_NODEBUG Logger* getLoggerIf(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option) ? _logger : nullptr; }
-
- //! Returns whether the diagnostic `option` is enabled.
- //!
- //! \note Returns false if there is no logger (as diagnostics without logging make no sense).
- ASMJIT_INLINE_NODEBUG bool hasDiagnosticOption(DiagnosticOptions option) const noexcept { return Support::test(_diagnosticOptions, option); }
-
- //! Returns \ref Zone passed to \ref runOnFunction().
- ASMJIT_INLINE_NODEBUG Zone* zone() const noexcept { return _allocator.zone(); }
- //! Returns \ref ZoneAllocator used by the register allocator.
- ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return const_cast<ZoneAllocator*>(&_allocator); }
-
- ASMJIT_INLINE_NODEBUG const ZoneVector<RASharedAssignment>& sharedAssignments() const { return _sharedAssignments; }
- ASMJIT_INLINE_NODEBUG uint32_t sharedAssignmentCount() const noexcept { return _sharedAssignments.size(); }
-
- //! Returns the current function node.
- ASMJIT_INLINE_NODEBUG FuncNode* func() const noexcept { return _func; }
- //! Returns the stop of the current function.
- ASMJIT_INLINE_NODEBUG BaseNode* stop() const noexcept { return _stop; }
-
- //! Returns an extra block used by the current function being processed.
- ASMJIT_INLINE_NODEBUG BaseNode* extraBlock() const noexcept { return _extraBlock; }
- //! Sets an extra block, see `extraBlock()`.
- ASMJIT_INLINE_NODEBUG void setExtraBlock(BaseNode* node) noexcept { _extraBlock = node; }
-
- ASMJIT_INLINE_NODEBUG uint32_t endPosition() const noexcept { return _instructionCount * 2; }
-
- ASMJIT_INLINE_NODEBUG const RARegMask& availableRegs() const noexcept { return _availableRegs; }
- ASMJIT_INLINE_NODEBUG const RARegMask& clobberedRegs() const noexcept { return _clobberedRegs; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- inline void makeUnavailable(RegGroup group, uint32_t regId) noexcept {
- _availableRegs[group] &= ~Support::bitMask(regId);
- _availableRegCount[group]--;
- }
-
- //! Runs the register allocator for the given `func`.
- Error runOnFunction(Zone* zone, Logger* logger, FuncNode* func) override;
-
- //! Performs all allocation steps sequentially, called by `runOnFunction()`.
- Error onPerformAllSteps() noexcept;
-
- //! \}
-
- //! \name Events
- //! \{
-
- //! Called by \ref runOnFunction() before the register allocation to initialize
- //! architecture-specific data and constraints.
- virtual void onInit() noexcept;
-
- //! Called by \ref runOnFunction(` after register allocation to clean everything
- //! up. Called even if the register allocation failed.
- virtual void onDone() noexcept;
-
- //! \}
-
- //! \name CFG - Basic-Block Management
- //! \{
-
- //! Returns the function's entry block.
- inline RABlock* entryBlock() noexcept {
- ASMJIT_ASSERT(!_blocks.empty());
- return _blocks[0];
- }
-
- //! \overload
- inline const RABlock* entryBlock() const noexcept {
- ASMJIT_ASSERT(!_blocks.empty());
- return _blocks[0];
- }
-
- //! Returns all basic blocks of this function.
- ASMJIT_INLINE_NODEBUG RABlocks& blocks() noexcept { return _blocks; }
- //! \overload
- ASMJIT_INLINE_NODEBUG const RABlocks& blocks() const noexcept { return _blocks; }
-
- //! Returns the count of basic blocks (returns size of `_blocks` array).
- ASMJIT_INLINE_NODEBUG uint32_t blockCount() const noexcept { return _blocks.size(); }
- //! Returns the count of reachable basic blocks (returns size of `_pov` array).
- ASMJIT_INLINE_NODEBUG uint32_t reachableBlockCount() const noexcept { return _pov.size(); }
-
- //! Tests whether the CFG has dangling blocks - these were created by `newBlock()`, but not added to CFG through
- //! `addBlocks()`. If `true` is returned and the CFG is constructed it means that something is missing and it's
- //! incomplete.
- //!
- //! \note This is only used to check if the number of created blocks matches the number of added blocks.
- ASMJIT_INLINE_NODEBUG bool hasDanglingBlocks() const noexcept { return _createdBlockCount != blockCount(); }
-
- //! Gest a next timestamp to be used to mark CFG blocks.
- ASMJIT_INLINE_NODEBUG uint64_t nextTimestamp() const noexcept { return ++_lastTimestamp; }
-
- //! Creates a new `RABlock` instance.
- //!
- //! \note New blocks don't have ID assigned until they are added to the block array by calling `addBlock()`.
- RABlock* newBlock(BaseNode* initialNode = nullptr) noexcept;
-
- //! Tries to find a neighboring LabelNode (without going through code) that is already connected with `RABlock`.
- //! If no label is found then a new RABlock is created and assigned to all possible labels in a backward direction.
- RABlock* newBlockOrExistingAt(LabelNode* cbLabel, BaseNode** stoppedAt = nullptr) noexcept;
-
- //! Adds the given `block` to the block list and assign it a unique block id.
- Error addBlock(RABlock* block) noexcept;
-
- inline Error addExitBlock(RABlock* block) noexcept {
- block->addFlags(RABlockFlags::kIsFuncExit);
- return _exits.append(allocator(), block);
- }
-
- ASMJIT_FORCE_INLINE RAInst* newRAInst(RABlock* block, InstRWFlags instRWFlags, RATiedFlags flags, uint32_t tiedRegCount, const RARegMask& clobberedRegs) noexcept {
- void* p = zone()->alloc(RAInst::sizeOf(tiedRegCount));
- if (ASMJIT_UNLIKELY(!p))
- return nullptr;
- return new(Support::PlacementNew{p}) RAInst(block, instRWFlags, flags, tiedRegCount, clobberedRegs);
- }
-
- ASMJIT_FORCE_INLINE Error assignRAInst(BaseNode* node, RABlock* block, RAInstBuilder& ib) noexcept {
- uint32_t tiedRegCount = ib.tiedRegCount();
- RAInst* raInst = newRAInst(block, ib.instRWFlags(), ib.aggregatedFlags(), tiedRegCount, ib._clobbered);
-
- if (ASMJIT_UNLIKELY(!raInst))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- RARegIndex index;
- RATiedFlags flagsFilter = ~ib.forbiddenFlags();
-
- index.buildIndexes(ib._count);
- raInst->_tiedIndex = index;
- raInst->_tiedCount = ib._count;
-
- for (uint32_t i = 0; i < tiedRegCount; i++) {
- RATiedReg* tiedReg = ib[i];
- RAWorkReg* workReg = workRegById(tiedReg->workId());
-
- workReg->resetTiedReg();
- RegGroup group = workReg->group();
-
- if (tiedReg->hasUseId()) {
- block->addFlags(RABlockFlags::kHasFixedRegs);
- raInst->_usedRegs[group] |= Support::bitMask(tiedReg->useId());
- }
-
- if (tiedReg->hasOutId()) {
- block->addFlags(RABlockFlags::kHasFixedRegs);
- }
-
- RATiedReg& dst = raInst->_tiedRegs[index[group]++];
- dst = *tiedReg;
- dst._flags &= flagsFilter;
-
- if (!tiedReg->isDuplicate())
- dst._useRegMask &= ~ib._used[group];
- }
-
- node->setPassData<RAInst>(raInst);
- return kErrorOk;
- }
-
- //! \}
-
- //! \name CFG - Build CFG
- //! \{
-
- //! Traverse the whole function and do the following:
- //!
- //! 1. Construct CFG (represented by `RABlock`) by populating `_blocks` and `_exits`. Blocks describe the control
- //! flow of the function and contain some additional information that is used by the register allocator.
- //!
- //! 2. Remove unreachable code immediately. This is not strictly necessary for BaseCompiler itself as the register
- //! allocator cannot reach such nodes, but keeping instructions that use virtual registers would fail during
- //! instruction encoding phase (Assembler).
- //!
- //! 3. `RAInst` is created for each `InstNode` or compatible. It contains information that is essential for further
- //! analysis and register allocation.
- //!
- //! Use `RACFGBuilderT` template that provides the necessary boilerplate.
- virtual Error buildCFG() noexcept;
-
- //! Called after the CFG is built.
- Error initSharedAssignments(const ZoneVector<uint32_t>& sharedAssignmentsMap) noexcept;
-
- //! \}
-
- //! \name CFG - Views Order
- //! \{
-
- //! Constructs CFG views (only POV at the moment).
- Error buildCFGViews() noexcept;
-
- //! \}
-
- //! \name CFG - Dominators
- //! \{
-
- // Terminology:
- // - A node `X` dominates a node `Z` if any path from the entry point to `Z` has to go through `X`.
- // - A node `Z` post-dominates a node `X` if any path from `X` to the end of the graph has to go through `Z`.
-
- //! Constructs a dominator-tree from CFG.
- Error buildCFGDominators() noexcept;
-
- bool _strictlyDominates(const RABlock* a, const RABlock* b) const noexcept;
- const RABlock* _nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept;
-
- //! Tests whether the basic block `a` dominates `b` - non-strict, returns true when `a == b`.
- ASMJIT_INLINE_NODEBUG bool dominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? true : _strictlyDominates(a, b); }
- //! Tests whether the basic block `a` dominates `b` - strict dominance check, returns false when `a == b`.
- ASMJIT_INLINE_NODEBUG bool strictlyDominates(const RABlock* a, const RABlock* b) const noexcept { return a == b ? false : _strictlyDominates(a, b); }
-
- //! Returns a nearest common dominator of `a` and `b`.
- ASMJIT_INLINE_NODEBUG RABlock* nearestCommonDominator(RABlock* a, RABlock* b) const noexcept { return const_cast<RABlock*>(_nearestCommonDominator(a, b)); }
- //! Returns a nearest common dominator of `a` and `b` (const).
- ASMJIT_INLINE_NODEBUG const RABlock* nearestCommonDominator(const RABlock* a, const RABlock* b) const noexcept { return _nearestCommonDominator(a, b); }
-
- //! \}
-
- //! \name CFG - Utilities
- //! \{
-
- Error removeUnreachableCode() noexcept;
-
- //! Returns `node` or some node after that is ideal for beginning a new block. This function is mostly used after
- //! a conditional or unconditional jump to select the successor node. In some cases the next node could be a label,
- //! which means it could have assigned some block already.
- BaseNode* findSuccessorStartingAt(BaseNode* node) noexcept;
-
- //! Returns `true` of the `node` can flow to `target` without reaching code nor data. It's used to eliminate jumps
- //! to labels that are next right to them.
- bool isNextTo(BaseNode* node, BaseNode* target) noexcept;
-
- //! \}
-
- //! \name Virtual Register Management
- //! \{
-
- //! Returns a native size of the general-purpose register of the target architecture.
- ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return _sp.size(); }
- ASMJIT_INLINE_NODEBUG uint32_t availableRegCount(RegGroup group) const noexcept { return _availableRegCount[group]; }
-
- ASMJIT_INLINE_NODEBUG RAWorkReg* workRegById(uint32_t workId) const noexcept { return _workRegs[workId]; }
-
- ASMJIT_INLINE_NODEBUG RAWorkRegs& workRegs() noexcept { return _workRegs; }
- ASMJIT_INLINE_NODEBUG RAWorkRegs& workRegs(RegGroup group) noexcept { return _workRegsOfGroup[group]; }
-
- ASMJIT_INLINE_NODEBUG const RAWorkRegs& workRegs() const noexcept { return _workRegs; }
- ASMJIT_INLINE_NODEBUG const RAWorkRegs& workRegs(RegGroup group) const noexcept { return _workRegsOfGroup[group]; }
-
- ASMJIT_INLINE_NODEBUG uint32_t workRegCount() const noexcept { return _workRegs.size(); }
- ASMJIT_INLINE_NODEBUG uint32_t workRegCount(RegGroup group) const noexcept { return _workRegsOfGroup[group].size(); }
-
- inline void _buildPhysIndex() noexcept {
- _physRegIndex.buildIndexes(_physRegCount);
- _physRegTotal = uint32_t(_physRegIndex[RegGroup::kMaxVirt]) +
- uint32_t(_physRegCount[RegGroup::kMaxVirt]) ;
- }
- ASMJIT_INLINE_NODEBUG uint32_t physRegIndex(RegGroup group) const noexcept { return _physRegIndex[group]; }
- ASMJIT_INLINE_NODEBUG uint32_t physRegTotal() const noexcept { return _physRegTotal; }
-
- Error _asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept;
-
- //! Creates `RAWorkReg` data for the given `vReg`. The function does nothing
- //! if `vReg` already contains link to `RAWorkReg`. Called by `constructBlocks()`.
- inline Error asWorkReg(VirtReg* vReg, RAWorkReg** out) noexcept {
- *out = vReg->workReg();
- return *out ? kErrorOk : _asWorkReg(vReg, out);
- }
-
- ASMJIT_FORCE_INLINE Error virtIndexAsWorkReg(uint32_t vIndex, RAWorkReg** out) noexcept {
- const ZoneVector<VirtReg*>& virtRegs = cc()->virtRegs();
- if (ASMJIT_UNLIKELY(vIndex >= virtRegs.size()))
- return DebugUtils::errored(kErrorInvalidVirtId);
- return asWorkReg(virtRegs[vIndex], out);
- }
-
- inline RAStackSlot* getOrCreateStackSlot(RAWorkReg* workReg) noexcept {
- RAStackSlot* slot = workReg->stackSlot();
-
- if (slot)
- return slot;
-
- slot = _stackAllocator.newSlot(_sp.id(), workReg->virtReg()->virtSize(), workReg->virtReg()->alignment(), RAStackSlot::kFlagRegHome);
- workReg->_stackSlot = slot;
- workReg->markStackUsed();
- return slot;
- }
-
- inline BaseMem workRegAsMem(RAWorkReg* workReg) noexcept {
- getOrCreateStackSlot(workReg);
- return BaseMem(OperandSignature::fromOpType(OperandType::kMem) |
- OperandSignature::fromMemBaseType(_sp.type()) |
- OperandSignature::fromBits(OperandSignature::kMemRegHomeFlag),
- workReg->virtId(), 0, 0);
- }
-
- WorkToPhysMap* newWorkToPhysMap() noexcept;
- PhysToWorkMap* newPhysToWorkMap() noexcept;
-
- inline PhysToWorkMap* clonePhysToWorkMap(const PhysToWorkMap* map) noexcept {
- size_t size = PhysToWorkMap::sizeOf(_physRegTotal);
- return static_cast<PhysToWorkMap*>(zone()->dupAligned(map, size, sizeof(uint32_t)));
- }
-
- //! \name Liveness Analysis & Statistics
- //! \{
-
- //! 1. Calculates GEN/KILL/IN/OUT of each block.
- //! 2. Calculates live spans and basic statistics of each work register.
- Error buildLiveness() noexcept;
-
- //! Assigns argIndex to WorkRegs. Must be called after the liveness analysis
- //! finishes as it checks whether the argument is live upon entry.
- Error assignArgIndexToWorkRegs() noexcept;
-
- //! \}
-
- //! \name Register Allocation - Global
- //! \{
-
- //! Runs a global register allocator.
- Error runGlobalAllocator() noexcept;
-
- //! Initializes data structures used for global live spans.
- Error initGlobalLiveSpans() noexcept;
-
- Error binPack(RegGroup group) noexcept;
-
- //! \}
-
- //! \name Register Allocation - Local
- //! \{
-
- //! Runs a local register allocator.
- Error runLocalAllocator() noexcept;
- Error setBlockEntryAssignment(RABlock* block, const RABlock* fromBlock, const RAAssignment& fromAssignment) noexcept;
- Error setSharedAssignment(uint32_t sharedAssignmentId, const RAAssignment& fromAssignment) noexcept;
-
- //! Called after the RA assignment has been assigned to a block.
- //!
- //! This cannot change the assignment, but can examine it.
- Error blockEntryAssigned(const PhysToWorkMap* physToWorkMap) noexcept;
-
- //! \}
-
- //! \name Register Allocation Utilities
- //! \{
-
- Error useTemporaryMem(BaseMem& out, uint32_t size, uint32_t alignment) noexcept;
-
- //! \}
-
- //! \name Function Prolog & Epilog
- //! \{
-
- virtual Error updateStackFrame() noexcept;
- Error _markStackArgsToKeep() noexcept;
- Error _updateStackArgs() noexcept;
- Error insertPrologEpilog() noexcept;
-
- //! \}
-
- //! \name Instruction Rewriter
- //! \{
-
- Error rewrite() noexcept;
- virtual Error _rewrite(BaseNode* first, BaseNode* stop) noexcept;
-
- //! \}
-
-#ifndef ASMJIT_NO_LOGGING
- //! \name Logging
- //! \{
-
- Error annotateCode() noexcept;
-
- Error _dumpBlockIds(String& sb, const RABlocks& blocks) noexcept;
- Error _dumpBlockLiveness(String& sb, const RABlock* block) noexcept;
- Error _dumpLiveSpans(String& sb) noexcept;
-
- //! \}
-#endif
-
- //! \name Emit
- //! \{
-
- virtual Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept;
- virtual Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept;
-
- virtual Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept;
- virtual Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept;
-
- virtual Error emitJump(const Label& label) noexcept;
- virtual Error emitPreCall(InvokeNode* invokeNode) noexcept;
-
- //! \}
-};
-
-inline ZoneAllocator* RABlock::allocator() const noexcept { return _ra->allocator(); }
-
-inline RegMask RABlock::entryScratchGpRegs() const noexcept {
- RegMask regs = _entryScratchGpRegs;
- if (hasSharedAssignmentId())
- regs = _ra->_sharedAssignments[_sharedAssignmentId].entryScratchGpRegs();
- return regs;
-}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_CORE_RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/rastack.cpp b/3rdparty/asmjit/src/asmjit/core/rastack.cpp
deleted file mode 100644
index 318fbded4b3..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/rastack.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/rastack_p.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// RAStackAllocator - Slots
-// ========================
-
-RAStackSlot* RAStackAllocator::newSlot(uint32_t baseRegId, uint32_t size, uint32_t alignment, uint32_t flags) noexcept {
- if (ASMJIT_UNLIKELY(_slots.willGrow(allocator(), 1) != kErrorOk))
- return nullptr;
-
- RAStackSlot* slot = allocator()->allocT<RAStackSlot>();
- if (ASMJIT_UNLIKELY(!slot))
- return nullptr;
-
- slot->_baseRegId = uint8_t(baseRegId);
- slot->_alignment = uint8_t(Support::max<uint32_t>(alignment, 1));
- slot->_flags = uint16_t(flags);
- slot->_useCount = 0;
- slot->_size = size;
-
- slot->_weight = 0;
- slot->_offset = 0;
-
- _alignment = Support::max<uint32_t>(_alignment, alignment);
- _slots.appendUnsafe(slot);
- return slot;
-}
-
-// RAStackAllocator - Utilities
-// ============================
-
-struct RAStackGap {
- inline RAStackGap() noexcept
- : offset(0),
- size(0) {}
-
- inline RAStackGap(uint32_t offset, uint32_t size) noexcept
- : offset(offset),
- size(size) {}
-
- inline RAStackGap(const RAStackGap& other) noexcept
- : offset(other.offset),
- size(other.size) {}
-
- uint32_t offset;
- uint32_t size;
-};
-
-Error RAStackAllocator::calculateStackFrame() noexcept {
- // Base weight added to all registers regardless of their size and alignment.
- uint32_t kBaseRegWeight = 16;
-
- // STEP 1:
- //
- // Update usage based on the size of the slot. We boost smaller slots in a way that 32-bit register has a higher
- // priority than a 128-bit register, however, if one 128-bit register is used 4 times more than some other 32-bit
- // register it will overweight it.
- for (RAStackSlot* slot : _slots) {
- uint32_t alignment = slot->alignment();
- ASMJIT_ASSERT(alignment > 0);
-
- uint32_t power = Support::min<uint32_t>(Support::ctz(alignment), 6);
- uint64_t weight;
-
- if (slot->isRegHome())
- weight = kBaseRegWeight + (uint64_t(slot->useCount()) * (7 - power));
- else
- weight = power;
-
- // If overflown, which has less chance of winning a lottery, just use max possible weight. In such case it
- // probably doesn't matter at all.
- if (weight > 0xFFFFFFFFu)
- weight = 0xFFFFFFFFu;
-
- slot->setWeight(uint32_t(weight));
- }
-
- // STEP 2:
- //
- // Sort stack slots based on their newly calculated weight (in descending order).
- _slots.sort([](const RAStackSlot* a, const RAStackSlot* b) noexcept {
- return a->weight() > b->weight() ? 1 :
- a->weight() == b->weight() ? 0 : -1;
- });
-
- // STEP 3:
- //
- // Calculate offset of each slot. We start from the slot that has the highest weight and advance to slots with
- // lower weight. It could look that offsets start from the first slot in our list and then simply increase, but
- // it's not always the case as we also try to fill all gaps introduced by the fact that slots are sorted by
- // weight and not by size & alignment, so when we need to align some slot we distribute the gap caused by the
- // alignment to `gaps`.
- uint32_t offset = 0;
- ZoneVector<RAStackGap> gaps[kSizeCount - 1];
-
- for (RAStackSlot* slot : _slots) {
- if (slot->isStackArg())
- continue;
-
- uint32_t slotAlignment = slot->alignment();
- uint32_t alignedOffset = Support::alignUp(offset, slotAlignment);
-
- // Try to find a slot within gaps first, before advancing the `offset`.
- bool foundGap = false;
- uint32_t gapSize = 0;
- uint32_t gapOffset = 0;
-
- {
- uint32_t slotSize = slot->size();
- if (slotSize < (1u << uint32_t(ASMJIT_ARRAY_SIZE(gaps)))) {
- // Iterate from the lowest to the highest possible.
- uint32_t index = Support::ctz(slotSize);
- do {
- if (!gaps[index].empty()) {
- RAStackGap gap = gaps[index].pop();
-
- ASMJIT_ASSERT(Support::isAligned(gap.offset, slotAlignment));
- slot->setOffset(int32_t(gap.offset));
-
- gapSize = gap.size - slotSize;
- gapOffset = gap.offset - slotSize;
-
- foundGap = true;
- break;
- }
- } while (++index < uint32_t(ASMJIT_ARRAY_SIZE(gaps)));
- }
- }
-
- // No gap found, we may create a new one(s) if the current offset is not aligned.
- if (!foundGap && offset != alignedOffset) {
- gapSize = alignedOffset - offset;
- gapOffset = alignedOffset;
-
- offset = alignedOffset;
- }
-
- // True if we have found a gap and not filled all of it or we aligned the current offset.
- if (gapSize) {
- uint32_t gapEnd = gapSize + gapOffset;
- while (gapOffset < gapEnd) {
- uint32_t index = Support::ctz(gapOffset);
- uint32_t slotSize = 1u << index;
-
- // Weird case, better to bail...
- if (gapEnd - gapOffset < slotSize)
- break;
-
- ASMJIT_PROPAGATE(gaps[index].append(allocator(), RAStackGap(gapOffset, slotSize)));
- gapOffset += slotSize;
- }
- }
-
- if (!foundGap) {
- ASMJIT_ASSERT(Support::isAligned(offset, slotAlignment));
- slot->setOffset(int32_t(offset));
- offset += slot->size();
- }
- }
-
- _stackSize = Support::alignUp(offset, _alignment);
- return kErrorOk;
-}
-
-Error RAStackAllocator::adjustSlotOffsets(int32_t offset) noexcept {
- for (RAStackSlot* slot : _slots)
- if (!slot->isStackArg())
- slot->_offset += offset;
- return kErrorOk;
-}
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/core/rastack_p.h b/3rdparty/asmjit/src/asmjit/core/rastack_p.h
deleted file mode 100644
index 15db8e97948..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/rastack_p.h
+++ /dev/null
@@ -1,166 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_RASTACK_P_H_INCLUDED
-#define ASMJIT_CORE_RASTACK_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/radefs_p.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_ra
-//! \{
-
-//! Stack slot.
-struct RAStackSlot {
- //! Stack slot flags.
- //!
- //! TODO: kFlagStackArg is not used by the current implementation, do we need to keep it?
- enum Flags : uint16_t {
- //! Stack slot is register home slot.
- kFlagRegHome = 0x0001u,
- //! Stack slot position matches argument passed via stack.
- kFlagStackArg = 0x0002u
- };
-
- enum ArgIndex : uint32_t {
- kNoArgIndex = 0xFF
- };
-
- //! \name Members
- //! \{
-
- //! Base register used to address the stack.
- uint8_t _baseRegId;
- //! Minimum alignment required by the slot.
- uint8_t _alignment;
- //! Reserved for future use.
- uint16_t _flags;
- //! Size of memory required by the slot.
- uint32_t _size;
-
- //! Usage counter (one unit equals one memory access).
- uint32_t _useCount;
- //! Weight of the slot, calculated by \ref RAStackAllocator::calculateStackFrame().
- uint32_t _weight;
- //! Stack offset, calculated by \ref RAStackAllocator::calculateStackFrame().
- int32_t _offset;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- inline uint32_t baseRegId() const noexcept { return _baseRegId; }
- inline void setBaseRegId(uint32_t id) noexcept { _baseRegId = uint8_t(id); }
-
- inline uint32_t size() const noexcept { return _size; }
- inline uint32_t alignment() const noexcept { return _alignment; }
-
- inline uint32_t flags() const noexcept { return _flags; }
- inline bool hasFlag(uint32_t flag) const noexcept { return (_flags & flag) != 0; }
- inline void addFlags(uint32_t flags) noexcept { _flags = uint16_t(_flags | flags); }
-
- inline bool isRegHome() const noexcept { return hasFlag(kFlagRegHome); }
- inline bool isStackArg() const noexcept { return hasFlag(kFlagStackArg); }
-
- inline uint32_t useCount() const noexcept { return _useCount; }
- inline void addUseCount(uint32_t n = 1) noexcept { _useCount += n; }
-
- inline uint32_t weight() const noexcept { return _weight; }
- inline void setWeight(uint32_t weight) noexcept { _weight = weight; }
-
- inline int32_t offset() const noexcept { return _offset; }
- inline void setOffset(int32_t offset) noexcept { _offset = offset; }
-
- //! \}
-};
-
-typedef ZoneVector<RAStackSlot*> RAStackSlots;
-
-//! Stack allocator.
-class RAStackAllocator {
-public:
- ASMJIT_NONCOPYABLE(RAStackAllocator)
-
- enum Size : uint32_t {
- kSize1 = 0,
- kSize2 = 1,
- kSize4 = 2,
- kSize8 = 3,
- kSize16 = 4,
- kSize32 = 5,
- kSize64 = 6,
- kSizeCount = 7
- };
-
- //! \name Members
- //! \{
-
- //! Allocator used to allocate internal data.
- ZoneAllocator* _allocator {};
- //! Count of bytes used by all slots.
- uint32_t _bytesUsed {};
- //! Calculated stack size (can be a bit greater than `_bytesUsed`).
- uint32_t _stackSize {};
- //! Minimum stack alignment.
- uint32_t _alignment = 1;
- //! Stack slots vector.
- RAStackSlots _slots;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG RAStackAllocator() noexcept {}
-
- ASMJIT_INLINE_NODEBUG void reset(ZoneAllocator* allocator) noexcept {
- _allocator = allocator;
- _bytesUsed = 0;
- _stackSize = 0;
- _alignment = 1;
- _slots.reset();
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return _allocator; }
-
- ASMJIT_INLINE_NODEBUG uint32_t bytesUsed() const noexcept { return _bytesUsed; }
- ASMJIT_INLINE_NODEBUG uint32_t stackSize() const noexcept { return _stackSize; }
- ASMJIT_INLINE_NODEBUG uint32_t alignment() const noexcept { return _alignment; }
-
- ASMJIT_INLINE_NODEBUG RAStackSlots& slots() noexcept { return _slots; }
- ASMJIT_INLINE_NODEBUG const RAStackSlots& slots() const noexcept { return _slots; }
- ASMJIT_INLINE_NODEBUG uint32_t slotCount() const noexcept { return _slots.size(); }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- RAStackSlot* newSlot(uint32_t baseRegId, uint32_t size, uint32_t alignment, uint32_t flags = 0) noexcept;
-
- Error calculateStackFrame() noexcept;
- Error adjustSlotOffsets(int32_t offset) noexcept;
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_CORE_RASTACK_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/string.cpp b/3rdparty/asmjit/src/asmjit/core/string.cpp
deleted file mode 100644
index 123e861983c..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/string.cpp
+++ /dev/null
@@ -1,559 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/string.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// String - Globals
-// ================
-
-static const char String_baseN[] = "0123456789ABCDEF";
-
-constexpr size_t kMinAllocSize = 64;
-constexpr size_t kMaxAllocSize = SIZE_MAX - Globals::kGrowThreshold;
-
-// String - Clear & Reset
-// ======================
-
-Error String::reset() noexcept {
- if (_type == kTypeLarge)
- ::free(_large.data);
-
- _resetInternal();
- return kErrorOk;
-}
-
-Error String::clear() noexcept {
- if (isLargeOrExternal()) {
- _large.size = 0;
- _large.data[0] = '\0';
- }
- else {
- _raw.uptr[0] = 0;
- }
-
- return kErrorOk;
-}
-
-// String - Prepare
-// ================
-
-char* String::prepare(ModifyOp op, size_t size) noexcept {
- char* curData;
- size_t curSize;
- size_t curCapacity;
-
- if (isLargeOrExternal()) {
- curData = this->_large.data;
- curSize = this->_large.size;
- curCapacity = this->_large.capacity;
- }
- else {
- curData = this->_small.data;
- curSize = this->_small.type;
- curCapacity = kSSOCapacity;
- }
-
- if (op == ModifyOp::kAssign) {
- if (size > curCapacity) {
- // Prevent arithmetic overflow.
- if (ASMJIT_UNLIKELY(size >= kMaxAllocSize))
- return nullptr;
-
- size_t newCapacity = Support::alignUp<size_t>(size + 1, kMinAllocSize);
- char* newData = static_cast<char*>(::malloc(newCapacity));
-
- if (ASMJIT_UNLIKELY(!newData))
- return nullptr;
-
- if (_type == kTypeLarge)
- ::free(curData);
-
- _large.type = kTypeLarge;
- _large.size = size;
- _large.capacity = newCapacity - 1;
- _large.data = newData;
-
- newData[size] = '\0';
- return newData;
- }
- else {
- _setSize(size);
- curData[size] = '\0';
- return curData;
- }
- }
- else {
- // Prevent arithmetic overflow.
- if (ASMJIT_UNLIKELY(size >= kMaxAllocSize - curSize))
- return nullptr;
-
- size_t newSize = size + curSize;
- size_t newSizePlusOne = newSize + 1;
-
- if (newSizePlusOne > curCapacity) {
- size_t newCapacity = Support::max<size_t>(curCapacity + 1, kMinAllocSize);
-
- if (newCapacity < newSizePlusOne && newCapacity < Globals::kGrowThreshold)
- newCapacity = Support::alignUpPowerOf2(newCapacity);
-
- if (newCapacity < newSizePlusOne)
- newCapacity = Support::alignUp(newSizePlusOne, Globals::kGrowThreshold);
-
- if (ASMJIT_UNLIKELY(newCapacity < newSizePlusOne))
- return nullptr;
-
- char* newData = static_cast<char*>(::malloc(newCapacity));
- if (ASMJIT_UNLIKELY(!newData))
- return nullptr;
-
- memcpy(newData, curData, curSize);
-
- if (_type == kTypeLarge)
- ::free(curData);
-
- _large.type = kTypeLarge;
- _large.size = newSize;
- _large.capacity = newCapacity - 1;
- _large.data = newData;
-
- newData[newSize] = '\0';
- return newData + curSize;
- }
- else {
- _setSize(newSize);
- curData[newSize] = '\0';
- return curData + curSize;
- }
- }
-}
-
-// String - Assign
-// ===============
-
-Error String::assign(const char* data, size_t size) noexcept {
- char* dst = nullptr;
-
- // Null terminated string without `size` specified.
- if (size == SIZE_MAX)
- size = data ? strlen(data) : size_t(0);
-
- if (isLargeOrExternal()) {
- if (size <= _large.capacity) {
- dst = _large.data;
- _large.size = size;
- }
- else {
- size_t capacityPlusOne = Support::alignUp(size + 1, 32);
- if (ASMJIT_UNLIKELY(capacityPlusOne < size))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- dst = static_cast<char*>(::malloc(capacityPlusOne));
- if (ASMJIT_UNLIKELY(!dst))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- if (_type == kTypeLarge)
- ::free(_large.data);
-
- _large.type = kTypeLarge;
- _large.data = dst;
- _large.size = size;
- _large.capacity = capacityPlusOne - 1;
- }
- }
- else {
- if (size <= kSSOCapacity) {
- ASMJIT_ASSERT(size < 0xFFu);
-
- dst = _small.data;
- _small.type = uint8_t(size);
- }
- else {
- dst = static_cast<char*>(::malloc(size + 1));
- if (ASMJIT_UNLIKELY(!dst))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- _large.type = kTypeLarge;
- _large.data = dst;
- _large.size = size;
- _large.capacity = size;
- }
- }
-
- // Optionally copy data from `data` and null-terminate.
- if (data && size) {
- // NOTE: It's better to use `memmove()`. If, for any reason, somebody uses
- // this function to substring the same string it would work as expected.
- ::memmove(dst, data, size);
- }
-
- dst[size] = '\0';
- return kErrorOk;
-}
-
-// String - Operations
-// ===================
-
-Error String::_opString(ModifyOp op, const char* str, size_t size) noexcept {
- if (size == SIZE_MAX)
- size = str ? strlen(str) : size_t(0);
-
- if (!size)
- return kErrorOk;
-
- char* p = prepare(op, size);
- if (!p)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- memcpy(p, str, size);
- return kErrorOk;
-}
-
-Error String::_opChar(ModifyOp op, char c) noexcept {
- char* p = prepare(op, 1);
- if (!p)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- *p = c;
- return kErrorOk;
-}
-
-Error String::_opChars(ModifyOp op, char c, size_t n) noexcept {
- if (!n)
- return kErrorOk;
-
- char* p = prepare(op, n);
- if (!p)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- memset(p, c, n);
- return kErrorOk;
-}
-
-Error String::padEnd(size_t n, char c) noexcept {
- size_t size = this->size();
- return n > size ? appendChars(c, n - size) : kErrorOk;
-}
-
-Error String::_opNumber(ModifyOp op, uint64_t i, uint32_t base, size_t width, StringFormatFlags flags) noexcept {
- if (base == 0)
- base = 10;
-
- char buf[128];
- char* p = buf + ASMJIT_ARRAY_SIZE(buf);
-
- uint64_t orig = i;
- char sign = '\0';
-
- // Format Sign
- // -----------
-
- if (Support::test(flags, StringFormatFlags::kSigned) && int64_t(i) < 0) {
- i = uint64_t(-int64_t(i));
- sign = '-';
- }
- else if (Support::test(flags, StringFormatFlags::kShowSign)) {
- sign = '+';
- }
- else if (Support::test(flags, StringFormatFlags::kShowSpace)) {
- sign = ' ';
- }
-
- // Format Number
- // -------------
-
- switch (base) {
- case 2:
- case 8:
- case 16: {
- uint32_t shift = Support::ctz(base);
- uint32_t mask = base - 1;
-
- do {
- uint64_t d = i >> shift;
- size_t r = size_t(i & mask);
-
- *--p = String_baseN[r];
- i = d;
- } while (i);
-
- break;
- }
-
- case 10: {
- do {
- uint64_t d = i / 10;
- uint64_t r = i % 10;
-
- *--p = char(uint32_t('0') + uint32_t(r));
- i = d;
- } while (i);
-
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidArgument);
- }
-
- size_t numberSize = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p);
-
- // Alternate Form
- // --------------
-
- if (Support::test(flags, StringFormatFlags::kAlternate)) {
- if (base == 8) {
- if (orig != 0)
- *--p = '0';
- }
- if (base == 16) {
- *--p = 'x';
- *--p = '0';
- }
- }
-
- // String Width
- // ------------
-
- if (sign != 0)
- *--p = sign;
-
- if (width > 256)
- width = 256;
-
- if (width <= numberSize)
- width = 0;
- else
- width -= numberSize;
-
- // Finalize
- // --------
-
- size_t prefixSize = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p) - numberSize;
- char* data = prepare(op, prefixSize + width + numberSize);
-
- if (!data)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- memcpy(data, p, prefixSize);
- data += prefixSize;
-
- memset(data, '0', width);
- data += width;
-
- memcpy(data, p + prefixSize, numberSize);
- return kErrorOk;
-}
-
-Error String::_opHex(ModifyOp op, const void* data, size_t size, char separator) noexcept {
- char* dst;
- const uint8_t* src = static_cast<const uint8_t*>(data);
-
- if (!size)
- return kErrorOk;
-
- if (separator) {
- if (ASMJIT_UNLIKELY(size >= SIZE_MAX / 3))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- dst = prepare(op, size * 3 - 1);
- if (ASMJIT_UNLIKELY(!dst))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- size_t i = 0;
- for (;;) {
- dst[0] = String_baseN[(src[0] >> 4) & 0xF];
- dst[1] = String_baseN[(src[0] ) & 0xF];
- if (++i == size)
- break;
- // This makes sure that the separator is only put between two hexadecimal bytes.
- dst[2] = separator;
- dst += 3;
- src++;
- }
- }
- else {
- if (ASMJIT_UNLIKELY(size >= SIZE_MAX / 2))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- dst = prepare(op, size * 2);
- if (ASMJIT_UNLIKELY(!dst))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- for (size_t i = 0; i < size; i++, dst += 2, src++) {
- dst[0] = String_baseN[(src[0] >> 4) & 0xF];
- dst[1] = String_baseN[(src[0] ) & 0xF];
- }
- }
-
- return kErrorOk;
-}
-
-Error String::_opFormat(ModifyOp op, const char* fmt, ...) noexcept {
- Error err;
- va_list ap;
-
- va_start(ap, fmt);
- err = _opVFormat(op, fmt, ap);
- va_end(ap);
-
- return err;
-}
-
-Error String::_opVFormat(ModifyOp op, const char* fmt, va_list ap) noexcept {
- size_t startAt = (op == ModifyOp::kAssign) ? size_t(0) : size();
- size_t remainingCapacity = capacity() - startAt;
-
- char buf[1024];
- int fmtResult;
- size_t outputSize;
-
- va_list apCopy;
- va_copy(apCopy, ap);
-
- if (remainingCapacity >= 128) {
- fmtResult = vsnprintf(data() + startAt, remainingCapacity, fmt, ap);
- outputSize = size_t(fmtResult);
-
- if (ASMJIT_LIKELY(outputSize <= remainingCapacity)) {
- _setSize(startAt + outputSize);
- return kErrorOk;
- }
- }
- else {
- fmtResult = vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap);
- outputSize = size_t(fmtResult);
-
- if (ASMJIT_LIKELY(outputSize < ASMJIT_ARRAY_SIZE(buf)))
- return _opString(op, buf, outputSize);
- }
-
- if (ASMJIT_UNLIKELY(fmtResult < 0))
- return DebugUtils::errored(kErrorInvalidState);
-
- char* p = prepare(op, outputSize);
- if (ASMJIT_UNLIKELY(!p))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- fmtResult = vsnprintf(p, outputSize + 1, fmt, apCopy);
- ASMJIT_ASSERT(size_t(fmtResult) == outputSize);
-
- return kErrorOk;
-}
-
-Error String::truncate(size_t newSize) noexcept {
- if (isLargeOrExternal()) {
- if (newSize < _large.size) {
- _large.data[newSize] = '\0';
- _large.size = newSize;
- }
- }
- else {
- if (newSize < _type) {
- _small.data[newSize] = '\0';
- _small.type = uint8_t(newSize);
- }
- }
-
- return kErrorOk;
-}
-
-bool String::equals(const char* other, size_t size) const noexcept {
- const char* aData = data();
- const char* bData = other;
-
- size_t aSize = this->size();
- size_t bSize = size;
-
- if (bSize == SIZE_MAX) {
- size_t i;
- for (i = 0; i < aSize; i++)
- if (aData[i] != bData[i] || bData[i] == 0)
- return false;
- return bData[i] == 0;
- }
- else {
- if (aSize != bSize)
- return false;
- return ::memcmp(aData, bData, aSize) == 0;
- }
-}
-
-// String - Tests
-// ==============
-
-#if defined(ASMJIT_TEST)
-UNIT(core_string) {
- String s;
-
- EXPECT_FALSE(s.isLargeOrExternal());
- EXPECT_FALSE(s.isExternal());
-
- EXPECT_EQ(s.assign('a'), kErrorOk);
- EXPECT_EQ(s.size(), 1u);
- EXPECT_EQ(s.capacity(), String::kSSOCapacity);
- EXPECT_EQ(s.data()[0], 'a');
- EXPECT_EQ(s.data()[1], '\0');
- EXPECT_TRUE(s.equals("a"));
- EXPECT_TRUE(s.equals("a", 1));
-
- EXPECT_EQ(s.assignChars('b', 4), kErrorOk);
- EXPECT_EQ(s.size(), 4u);
- EXPECT_EQ(s.capacity(), String::kSSOCapacity);
- EXPECT_EQ(s.data()[0], 'b');
- EXPECT_EQ(s.data()[1], 'b');
- EXPECT_EQ(s.data()[2], 'b');
- EXPECT_EQ(s.data()[3], 'b');
- EXPECT_EQ(s.data()[4], '\0');
- EXPECT_TRUE(s.equals("bbbb"));
- EXPECT_TRUE(s.equals("bbbb", 4));
-
- EXPECT_EQ(s.assign("abc"), kErrorOk);
- EXPECT_EQ(s.size(), 3u);
- EXPECT_EQ(s.capacity(), String::kSSOCapacity);
- EXPECT_EQ(s.data()[0], 'a');
- EXPECT_EQ(s.data()[1], 'b');
- EXPECT_EQ(s.data()[2], 'c');
- EXPECT_EQ(s.data()[3], '\0');
- EXPECT_TRUE(s.equals("abc"));
- EXPECT_TRUE(s.equals("abc", 3));
-
- const char* large = "Large string that will not fit into SSO buffer";
- EXPECT_EQ(s.assign(large), kErrorOk);
- EXPECT_TRUE(s.isLargeOrExternal());
- EXPECT_EQ(s.size(), strlen(large));
- EXPECT_GT(s.capacity(), String::kSSOCapacity);
- EXPECT_TRUE(s.equals(large));
- EXPECT_TRUE(s.equals(large, strlen(large)));
-
- const char* additional = " (additional content)";
- EXPECT_TRUE(s.isLargeOrExternal());
- EXPECT_EQ(s.append(additional), kErrorOk);
- EXPECT_EQ(s.size(), strlen(large) + strlen(additional));
-
- EXPECT_EQ(s.clear(), kErrorOk);
- EXPECT_EQ(s.size(), 0u);
- EXPECT_TRUE(s.empty());
- EXPECT_EQ(s.data()[0], '\0');
- EXPECT_TRUE(s.isLargeOrExternal()); // Clear should never release the memory.
-
- EXPECT_EQ(s.appendUInt(1234), kErrorOk);
- EXPECT_TRUE(s.equals("1234"));
-
- EXPECT_EQ(s.assignUInt(0xFFFF, 16, 0, StringFormatFlags::kAlternate), kErrorOk);
- EXPECT_TRUE(s.equals("0xFFFF"));
-
- StringTmp<64> sTmp;
- EXPECT_TRUE(sTmp.isLargeOrExternal());
- EXPECT_TRUE(sTmp.isExternal());
- EXPECT_EQ(sTmp.appendChars(' ', 1000), kErrorOk);
- EXPECT_FALSE(sTmp.isExternal());
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/string.h b/3rdparty/asmjit/src/asmjit/core/string.h
deleted file mode 100644
index c4dee14b00e..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/string.h
+++ /dev/null
@@ -1,383 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_STRING_H_INCLUDED
-#define ASMJIT_CORE_STRING_H_INCLUDED
-
-#include "../core/support.h"
-#include "../core/zone.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_utilities
-//! \{
-
-//! Format flags used by \ref String API.
-enum class StringFormatFlags : uint32_t {
- //! No flags.
- kNone = 0x00000000u,
- //! Show sign.
- kShowSign = 0x00000001u,
- //! Show space.
- kShowSpace = 0x00000002u,
- //! Alternate form (use 0x when formatting HEX number).
- kAlternate = 0x00000004u,
- //! The input is signed.
- kSigned = 0x80000000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(StringFormatFlags)
-
-//! Fixed string - only useful for strings that would never exceed `N - 1` characters; always null-terminated.
-template<size_t N>
-union FixedString {
- //! \name Constants
- //! \{
-
- // This cannot be constexpr as GCC 4.8 refuses constexpr members of unions.
- enum : uint32_t {
- kNumUInt32Words = uint32_t((N + sizeof(uint32_t) - 1) / sizeof(uint32_t))
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- char str[kNumUInt32Words * sizeof(uint32_t)];
- uint32_t u32[kNumUInt32Words];
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- inline bool equals(const char* other) const noexcept { return strcmp(str, other) == 0; }
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ASMJIT_DEPRECATED("Use FixedString::equals() instead")
- inline bool eq(const char* other) const noexcept { return equals(other); }
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! \}
-};
-
-//! A simple non-reference counted string that uses small string optimization (SSO).
-//!
-//! This string has 3 allocation possibilities:
-//!
-//! 1. Small - embedded buffer is used for up to `kSSOCapacity` characters. This should handle most small
-//! strings and thus avoid dynamic memory allocation for most use-cases.
-//!
-//! 2. Large - string that doesn't fit into an embedded buffer (or string that was truncated from a larger
-//! buffer) and is owned by AsmJit. When you destroy the string AsmJit would automatically
-//! release the large buffer.
-//!
-//! 3. External - like Large (2), however, the large buffer is not owned by AsmJit and won't be released when
-//! the string is destroyed or reallocated. This is mostly useful for working with larger temporary
-//! strings allocated on stack or with immutable strings.
-class String {
-public:
- ASMJIT_NONCOPYABLE(String)
-
- //! String operation.
- enum class ModifyOp : uint32_t {
- //! Assignment - a new content replaces the current one.
- kAssign = 0,
- //! Append - a new content is appended to the string.
- kAppend = 1
- };
-
- //! \cond INTERNAL
- enum : uint32_t {
- kLayoutSize = 32,
- kSSOCapacity = kLayoutSize - 2
- };
-
- //! String type.
- enum Type : uint8_t {
- //! Large string (owned by String).
- kTypeLarge = 0x1Fu,
- //! External string (zone allocated or not owned by String).
- kTypeExternal = 0x20u
- };
-
- union Raw {
- uint8_t u8[kLayoutSize];
- uint64_t u64[kLayoutSize / sizeof(uint64_t)];
- uintptr_t uptr[kLayoutSize / sizeof(uintptr_t)];
- };
-
- struct Small {
- uint8_t type;
- char data[kSSOCapacity + 1u];
- };
-
- struct Large {
- uint8_t type;
- uint8_t reserved[sizeof(uintptr_t) - 1];
- size_t size;
- size_t capacity;
- char* data;
- };
-
- union {
- uint8_t _type;
- Raw _raw;
- Small _small;
- Large _large;
- };
- //! \endcond
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a default-initialized string if zero length.
- ASMJIT_INLINE_NODEBUG String() noexcept
- : _small {} {}
-
- //! Creates a string that takes ownership of the content of the `other` string.
- ASMJIT_INLINE_NODEBUG String(String&& other) noexcept {
- _raw = other._raw;
- other._resetInternal();
- }
-
- ASMJIT_INLINE_NODEBUG ~String() noexcept {
- reset();
- }
-
- //! Reset the string into a construction state.
- ASMJIT_API Error reset() noexcept;
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- inline String& operator=(String&& other) noexcept {
- swap(other);
- other.reset();
- return *this;
- }
-
- ASMJIT_INLINE_NODEBUG bool operator==(const char* other) const noexcept { return equals(other); }
- ASMJIT_INLINE_NODEBUG bool operator!=(const char* other) const noexcept { return !equals(other); }
-
- ASMJIT_INLINE_NODEBUG bool operator==(const String& other) const noexcept { return equals(other); }
- ASMJIT_INLINE_NODEBUG bool operator!=(const String& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool isExternal() const noexcept { return _type == kTypeExternal; }
- ASMJIT_INLINE_NODEBUG bool isLargeOrExternal() const noexcept { return _type >= kTypeLarge; }
-
- //! Tests whether the string is empty.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return size() == 0; }
- //! Returns the size of the string.
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return isLargeOrExternal() ? size_t(_large.size) : size_t(_type); }
- //! Returns the capacity of the string.
- ASMJIT_INLINE_NODEBUG size_t capacity() const noexcept { return isLargeOrExternal() ? _large.capacity : size_t(kSSOCapacity); }
-
- //! Returns the data of the string.
- ASMJIT_INLINE_NODEBUG char* data() noexcept { return isLargeOrExternal() ? _large.data : _small.data; }
- //! \overload
- ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return isLargeOrExternal() ? _large.data : _small.data; }
-
- ASMJIT_INLINE_NODEBUG char* start() noexcept { return data(); }
- ASMJIT_INLINE_NODEBUG const char* start() const noexcept { return data(); }
-
- ASMJIT_INLINE_NODEBUG char* end() noexcept { return data() + size(); }
- ASMJIT_INLINE_NODEBUG const char* end() const noexcept { return data() + size(); }
-
- //! \}
-
- //! \name String Operations
- //! \{
-
- //! Swaps the content of this string with `other`.
- ASMJIT_INLINE_NODEBUG void swap(String& other) noexcept {
- std::swap(_raw, other._raw);
- }
-
- //! Clears the content of the string.
- ASMJIT_API Error clear() noexcept;
-
- ASMJIT_API char* prepare(ModifyOp op, size_t size) noexcept;
-
- ASMJIT_API Error _opString(ModifyOp op, const char* str, size_t size = SIZE_MAX) noexcept;
- ASMJIT_API Error _opChar(ModifyOp op, char c) noexcept;
- ASMJIT_API Error _opChars(ModifyOp op, char c, size_t n) noexcept;
- ASMJIT_API Error _opNumber(ModifyOp op, uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept;
- ASMJIT_API Error _opHex(ModifyOp op, const void* data, size_t size, char separator = '\0') noexcept;
- ASMJIT_API Error _opFormat(ModifyOp op, const char* fmt, ...) noexcept;
- ASMJIT_API Error _opVFormat(ModifyOp op, const char* fmt, va_list ap) noexcept;
-
- //! Replaces the current of the string with `data` of the given `size`.
- //!
- //! Null terminated strings can set `size` to `SIZE_MAX`.
- ASMJIT_API Error assign(const char* data, size_t size = SIZE_MAX) noexcept;
-
- //! Replaces the current of the string with `other` string.
- ASMJIT_INLINE_NODEBUG Error assign(const String& other) noexcept {
- return assign(other.data(), other.size());
- }
-
- //! Replaces the current of the string by a single `c` character.
- ASMJIT_INLINE_NODEBUG Error assign(char c) noexcept {
- return _opChar(ModifyOp::kAssign, c);
- }
-
- //! Replaces the current of the string by a `c` character, repeated `n` times.
- ASMJIT_INLINE_NODEBUG Error assignChars(char c, size_t n) noexcept {
- return _opChars(ModifyOp::kAssign, c, n);
- }
-
- //! Replaces the current of the string by a formatted integer `i` (signed).
- ASMJIT_INLINE_NODEBUG Error assignInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
- return _opNumber(ModifyOp::kAssign, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
- }
-
- //! Replaces the current of the string by a formatted integer `i` (unsigned).
- ASMJIT_INLINE_NODEBUG Error assignUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
- return _opNumber(ModifyOp::kAssign, i, base, width, flags);
- }
-
- //! Replaces the current of the string by the given `data` converted to a HEX string.
- ASMJIT_INLINE_NODEBUG Error assignHex(const void* data, size_t size, char separator = '\0') noexcept {
- return _opHex(ModifyOp::kAssign, data, size, separator);
- }
-
- //! Replaces the current of the string by a formatted string `fmt`.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Error assignFormat(const char* fmt, Args&&... args) noexcept {
- return _opFormat(ModifyOp::kAssign, fmt, std::forward<Args>(args)...);
- }
-
- //! Replaces the current of the string by a formatted string `fmt` (va_list version).
- ASMJIT_INLINE_NODEBUG Error assignVFormat(const char* fmt, va_list ap) noexcept {
- return _opVFormat(ModifyOp::kAssign, fmt, ap);
- }
-
- //! Appends `str` having the given size `size` to the string.
- //!
- //! Null terminated strings can set `size` to `SIZE_MAX`.
- ASMJIT_INLINE_NODEBUG Error append(const char* str, size_t size = SIZE_MAX) noexcept {
- return _opString(ModifyOp::kAppend, str, size);
- }
-
- //! Appends `other` string to this string.
- ASMJIT_INLINE_NODEBUG Error append(const String& other) noexcept {
- return append(other.data(), other.size());
- }
-
- //! Appends a single `c` character.
- ASMJIT_INLINE_NODEBUG Error append(char c) noexcept {
- return _opChar(ModifyOp::kAppend, c);
- }
-
- //! Appends `c` character repeated `n` times.
- ASMJIT_INLINE_NODEBUG Error appendChars(char c, size_t n) noexcept {
- return _opChars(ModifyOp::kAppend, c, n);
- }
-
- //! Appends a formatted integer `i` (signed).
- ASMJIT_INLINE_NODEBUG Error appendInt(int64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
- return _opNumber(ModifyOp::kAppend, uint64_t(i), base, width, flags | StringFormatFlags::kSigned);
- }
-
- //! Appends a formatted integer `i` (unsigned).
- ASMJIT_INLINE_NODEBUG Error appendUInt(uint64_t i, uint32_t base = 0, size_t width = 0, StringFormatFlags flags = StringFormatFlags::kNone) noexcept {
- return _opNumber(ModifyOp::kAppend, i, base, width, flags);
- }
-
- //! Appends the given `data` converted to a HEX string.
- ASMJIT_INLINE_NODEBUG Error appendHex(const void* data, size_t size, char separator = '\0') noexcept {
- return _opHex(ModifyOp::kAppend, data, size, separator);
- }
-
- //! Appends a formatted string `fmt` with `args`.
- template<typename... Args>
- ASMJIT_INLINE_NODEBUG Error appendFormat(const char* fmt, Args&&... args) noexcept {
- return _opFormat(ModifyOp::kAppend, fmt, std::forward<Args>(args)...);
- }
-
- //! Appends a formatted string `fmt` (va_list version).
- ASMJIT_INLINE_NODEBUG Error appendVFormat(const char* fmt, va_list ap) noexcept {
- return _opVFormat(ModifyOp::kAppend, fmt, ap);
- }
-
- ASMJIT_API Error padEnd(size_t n, char c = ' ') noexcept;
-
- //! Truncate the string length into `newSize`.
- ASMJIT_API Error truncate(size_t newSize) noexcept;
-
- ASMJIT_API bool equals(const char* other, size_t size = SIZE_MAX) const noexcept;
- ASMJIT_INLINE_NODEBUG bool equals(const String& other) const noexcept { return equals(other.data(), other.size()); }
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ASMJIT_DEPRECATED("Use String::equals() instead")
- ASMJIT_INLINE_NODEBUG bool eq(const char* other, size_t size = SIZE_MAX) const noexcept { return equals(other, size); }
-
- ASMJIT_DEPRECATED("Use String::equals() instead")
- ASMJIT_INLINE_NODEBUG bool eq(const String& other) const noexcept { return equals(other.data(), other.size()); }
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! \}
-
- //! \name Internal Functions
- //! \{
-
- //! Resets string to embedded and makes it empty (zero length, zero first char)
- //!
- //! \note This is always called internally after an external buffer was released as it zeroes all bytes
- //! used by String's embedded storage.
- inline void _resetInternal() noexcept {
- for (size_t i = 0; i < ASMJIT_ARRAY_SIZE(_raw.uptr); i++)
- _raw.uptr[i] = 0;
- }
-
- inline void _setSize(size_t newSize) noexcept {
- if (isLargeOrExternal())
- _large.size = newSize;
- else
- _small.type = uint8_t(newSize);
- }
-
- //! \}
-};
-
-//! Temporary string builder, has statically allocated `N` bytes.
-template<size_t N>
-class StringTmp : public String {
-public:
- ASMJIT_NONCOPYABLE(StringTmp)
-
- //! Embedded data.
- char _embeddedData[Support::alignUp(N + 1, sizeof(size_t))];
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG StringTmp() noexcept {
- _resetToTemporary();
- }
-
- inline void _resetToTemporary() noexcept {
- _large.type = kTypeExternal;
- _large.capacity = ASMJIT_ARRAY_SIZE(_embeddedData) - 1;
- _large.data = _embeddedData;
- _embeddedData[0] = '\0';
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_STRING_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/support.cpp b/3rdparty/asmjit/src/asmjit/core/support.cpp
deleted file mode 100644
index bebabbcc2de..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/support.cpp
+++ /dev/null
@@ -1,496 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// Support - Tests
-// ===============
-
-#if defined(ASMJIT_TEST)
-template<typename T>
-static void testArrays(const T* a, const T* b, size_t size) noexcept {
- for (size_t i = 0; i < size; i++)
- EXPECT_EQ(a[i], b[i])
- .message("Mismatch at %u", unsigned(i));
-}
-
-static void testAlignment() noexcept {
- INFO("Support::isAligned()");
- EXPECT_FALSE(Support::isAligned<size_t>(0xFFFF, 4u));
- EXPECT_TRUE(Support::isAligned<size_t>(0xFFF4, 4u));
- EXPECT_TRUE(Support::isAligned<size_t>(0xFFF8, 8u));
- EXPECT_TRUE(Support::isAligned<size_t>(0xFFF0, 16u));
-
- INFO("Support::alignUp()");
- EXPECT_EQ(Support::alignUp<size_t>(0xFFFF, 4), 0x10000u);
- EXPECT_EQ(Support::alignUp<size_t>(0xFFF4, 4), 0x0FFF4u);
- EXPECT_EQ(Support::alignUp<size_t>(0xFFF8, 8), 0x0FFF8u);
- EXPECT_EQ(Support::alignUp<size_t>(0xFFF0, 16), 0x0FFF0u);
- EXPECT_EQ(Support::alignUp<size_t>(0xFFF0, 32), 0x10000u);
-
- INFO("Support::alignUpDiff()");
- EXPECT_EQ(Support::alignUpDiff<size_t>(0xFFFF, 4), 1u);
- EXPECT_EQ(Support::alignUpDiff<size_t>(0xFFF4, 4), 0u);
- EXPECT_EQ(Support::alignUpDiff<size_t>(0xFFF8, 8), 0u);
- EXPECT_EQ(Support::alignUpDiff<size_t>(0xFFF0, 16), 0u);
- EXPECT_EQ(Support::alignUpDiff<size_t>(0xFFF0, 32), 16u);
-
- INFO("Support::alignUpPowerOf2()");
- EXPECT_EQ(Support::alignUpPowerOf2<size_t>(0x0000), 0x00000u);
- EXPECT_EQ(Support::alignUpPowerOf2<size_t>(0xFFFF), 0x10000u);
- EXPECT_EQ(Support::alignUpPowerOf2<size_t>(0xF123), 0x10000u);
- EXPECT_EQ(Support::alignUpPowerOf2<size_t>(0x0F00), 0x01000u);
- EXPECT_EQ(Support::alignUpPowerOf2<size_t>(0x0100), 0x00100u);
- EXPECT_EQ(Support::alignUpPowerOf2<size_t>(0x1001), 0x02000u);
-}
-
-static void testBitUtils() noexcept {
- uint32_t i;
-
- INFO("Support::shl() / shr()");
- EXPECT_EQ(Support::shl(int32_t(0x00001111), 16), int32_t(0x11110000u));
- EXPECT_EQ(Support::shl(uint32_t(0x00001111), 16), uint32_t(0x11110000u));
- EXPECT_EQ(Support::shr(int32_t(0x11110000u), 16), int32_t(0x00001111u));
- EXPECT_EQ(Support::shr(uint32_t(0x11110000u), 16), uint32_t(0x00001111u));
- EXPECT_EQ(Support::sar(int32_t(0xFFFF0000u), 16), int32_t(0xFFFFFFFFu));
- EXPECT_EQ(Support::sar(uint32_t(0xFFFF0000u), 16), uint32_t(0xFFFFFFFFu));
-
- INFO("Support::blsi()");
- for (i = 0; i < 32; i++) EXPECT_EQ(Support::blsi(uint32_t(1) << i), uint32_t(1) << i);
- for (i = 0; i < 31; i++) EXPECT_EQ(Support::blsi(uint32_t(3) << i), uint32_t(1) << i);
- for (i = 0; i < 64; i++) EXPECT_EQ(Support::blsi(uint64_t(1) << i), uint64_t(1) << i);
- for (i = 0; i < 63; i++) EXPECT_EQ(Support::blsi(uint64_t(3) << i), uint64_t(1) << i);
-
- INFO("Support::ctz()");
- for (i = 0; i < 32; i++) EXPECT_EQ(Support::Internal::clzFallback(uint32_t(1) << i), 31 - i);
- for (i = 0; i < 64; i++) EXPECT_EQ(Support::Internal::clzFallback(uint64_t(1) << i), 63 - i);
- for (i = 0; i < 32; i++) EXPECT_EQ(Support::Internal::ctzFallback(uint32_t(1) << i), i);
- for (i = 0; i < 64; i++) EXPECT_EQ(Support::Internal::ctzFallback(uint64_t(1) << i), i);
- for (i = 0; i < 32; i++) EXPECT_EQ(Support::clz(uint32_t(1) << i), 31 - i);
- for (i = 0; i < 64; i++) EXPECT_EQ(Support::clz(uint64_t(1) << i), 63 - i);
- for (i = 0; i < 32; i++) EXPECT_EQ(Support::ctz(uint32_t(1) << i), i);
- for (i = 0; i < 64; i++) EXPECT_EQ(Support::ctz(uint64_t(1) << i), i);
-
- INFO("Support::bitMask()");
- EXPECT_EQ(Support::bitMask(0, 1, 7), 0x83u);
- for (i = 0; i < 32; i++)
- EXPECT_EQ(Support::bitMask(i), (1u << i));
-
- INFO("Support::bitTest()");
- for (i = 0; i < 32; i++) {
- EXPECT_TRUE(Support::bitTest((1 << i), i))
- .message("Support::bitTest(%X, %u) should return true", (1 << i), i);
- }
-
- INFO("Support::lsbMask<uint32_t>()");
- for (i = 0; i < 32; i++) {
- uint32_t expectedBits = 0;
- for (uint32_t b = 0; b < i; b++)
- expectedBits |= uint32_t(1) << b;
- EXPECT_EQ(Support::lsbMask<uint32_t>(i), expectedBits);
- }
-
- INFO("Support::lsbMask<uint64_t>()");
- for (i = 0; i < 64; i++) {
- uint64_t expectedBits = 0;
- for (uint32_t b = 0; b < i; b++)
- expectedBits |= uint64_t(1) << b;
- EXPECT_EQ(Support::lsbMask<uint64_t>(i), expectedBits);
- }
-
- INFO("Support::popcnt()");
- for (i = 0; i < 32; i++) EXPECT_EQ(Support::popcnt((uint32_t(1) << i)), 1u);
- for (i = 0; i < 64; i++) EXPECT_EQ(Support::popcnt((uint64_t(1) << i)), 1u);
- EXPECT_EQ(Support::popcnt(0x000000F0), 4u);
- EXPECT_EQ(Support::popcnt(0x10101010), 4u);
- EXPECT_EQ(Support::popcnt(0xFF000000), 8u);
- EXPECT_EQ(Support::popcnt(0xFFFFFFF7), 31u);
- EXPECT_EQ(Support::popcnt(0x7FFFFFFF), 31u);
-
- INFO("Support::isPowerOf2()");
- for (i = 0; i < 64; i++) {
- EXPECT_TRUE(Support::isPowerOf2(uint64_t(1) << i));
- EXPECT_FALSE(Support::isPowerOf2((uint64_t(1) << i) ^ 0x001101));
- }
-}
-
-static void testIntUtils() noexcept {
- INFO("Support::byteswap()");
- EXPECT_EQ(Support::byteswap16(0x0102), 0x0201u);
- EXPECT_EQ(Support::byteswap32(0x01020304), 0x04030201u);
- EXPECT_EQ(Support::byteswap32(0x01020304), 0x04030201u);
- EXPECT_EQ(Support::byteswap64(uint64_t(0x0102030405060708)), uint64_t(0x0807060504030201));
-
- INFO("Support::bytepack()");
- union BytePackData {
- uint8_t bytes[4];
- uint32_t u32;
- } bpdata;
-
- bpdata.u32 = Support::bytepack32_4x8(0x00, 0x11, 0x22, 0x33);
- EXPECT_EQ(bpdata.bytes[0], 0x00);
- EXPECT_EQ(bpdata.bytes[1], 0x11);
- EXPECT_EQ(bpdata.bytes[2], 0x22);
- EXPECT_EQ(bpdata.bytes[3], 0x33);
-
- INFO("Support::isBetween()");
- EXPECT_TRUE(Support::isBetween<int>(10 , 10, 20));
- EXPECT_TRUE(Support::isBetween<int>(11 , 10, 20));
- EXPECT_TRUE(Support::isBetween<int>(20 , 10, 20));
- EXPECT_FALSE(Support::isBetween<int>(9 , 10, 20));
- EXPECT_FALSE(Support::isBetween<int>(21 , 10, 20));
- EXPECT_FALSE(Support::isBetween<int>(101, 10, 20));
-
- INFO("Support::isInt8()");
- EXPECT_TRUE(Support::isInt8(-128));
- EXPECT_TRUE(Support::isInt8( 127));
- EXPECT_FALSE(Support::isInt8(-129));
- EXPECT_FALSE(Support::isInt8( 128));
-
- INFO("Support::isInt16()");
- EXPECT_TRUE(Support::isInt16(-32768));
- EXPECT_TRUE(Support::isInt16( 32767));
- EXPECT_FALSE(Support::isInt16(-32769));
- EXPECT_FALSE(Support::isInt16( 32768));
-
- INFO("Support::isInt32()");
- EXPECT_TRUE(Support::isInt32( 2147483647 ));
- EXPECT_TRUE(Support::isInt32(-2147483647 - 1));
- EXPECT_FALSE(Support::isInt32(uint64_t(2147483648u)));
- EXPECT_FALSE(Support::isInt32(uint64_t(0xFFFFFFFFu)));
- EXPECT_FALSE(Support::isInt32(uint64_t(0xFFFFFFFFu) + 1));
-
- INFO("Support::isUInt8()");
- EXPECT_TRUE(Support::isUInt8(0) );
- EXPECT_TRUE(Support::isUInt8(255));
- EXPECT_FALSE(Support::isUInt8(256));
- EXPECT_FALSE(Support::isUInt8(-1) );
-
- INFO("Support::isUInt12()");
- EXPECT_TRUE(Support::isUInt12(0) );
- EXPECT_TRUE(Support::isUInt12(4095));
- EXPECT_FALSE(Support::isUInt12(4096));
- EXPECT_FALSE(Support::isUInt12(-1) );
-
- INFO("Support::isUInt16()");
- EXPECT_TRUE(Support::isUInt16(0) );
- EXPECT_TRUE(Support::isUInt16(65535));
- EXPECT_FALSE(Support::isUInt16(65536));
- EXPECT_FALSE(Support::isUInt16(-1) );
-
- INFO("Support::isUInt32()");
- EXPECT_TRUE(Support::isUInt32(uint64_t(0xFFFFFFFF)));
- EXPECT_FALSE(Support::isUInt32(uint64_t(0xFFFFFFFF) + 1));
- EXPECT_FALSE(Support::isUInt32(-1));
-}
-
-static void testReadWrite() noexcept {
- INFO("Support::readX() / writeX()");
-
- uint8_t arr[32] = { 0 };
-
- Support::writeU16uBE(arr + 1, 0x0102u);
- Support::writeU16uBE(arr + 3, 0x0304u);
- EXPECT_EQ(Support::readU32uBE(arr + 1), 0x01020304u);
- EXPECT_EQ(Support::readU32uLE(arr + 1), 0x04030201u);
- EXPECT_EQ(Support::readU32uBE(arr + 2), 0x02030400u);
- EXPECT_EQ(Support::readU32uLE(arr + 2), 0x00040302u);
-
- Support::writeU32uLE(arr + 5, 0x05060708u);
- EXPECT_EQ(Support::readU64uBE(arr + 1), 0x0102030408070605u);
- EXPECT_EQ(Support::readU64uLE(arr + 1), 0x0506070804030201u);
-
- Support::writeU64uLE(arr + 7, 0x1122334455667788u);
- EXPECT_EQ(Support::readU32uBE(arr + 8), 0x77665544u);
-}
-
-static void testBitVector() noexcept {
- INFO("Support::bitVectorOp");
- {
- uint32_t vec[3] = { 0 };
- Support::bitVectorFill(vec, 1, 64);
- EXPECT_EQ(vec[0], 0xFFFFFFFEu);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0x00000001u);
-
- Support::bitVectorClear(vec, 1, 1);
- EXPECT_EQ(vec[0], 0xFFFFFFFCu);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0x00000001u);
-
- Support::bitVectorFill(vec, 0, 32);
- EXPECT_EQ(vec[0], 0xFFFFFFFFu);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0x00000001u);
-
- Support::bitVectorClear(vec, 0, 32);
- EXPECT_EQ(vec[0], 0x00000000u);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0x00000001u);
-
- Support::bitVectorFill(vec, 1, 30);
- EXPECT_EQ(vec[0], 0x7FFFFFFEu);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0x00000001u);
-
- Support::bitVectorClear(vec, 1, 95);
- EXPECT_EQ(vec[0], 0x00000000u);
- EXPECT_EQ(vec[1], 0x00000000u);
- EXPECT_EQ(vec[2], 0x00000000u);
-
- Support::bitVectorFill(vec, 32, 64);
- EXPECT_EQ(vec[0], 0x00000000u);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0xFFFFFFFFu);
-
- Support::bitVectorSetBit(vec, 1, true);
- EXPECT_EQ(vec[0], 0x00000002u);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0xFFFFFFFFu);
-
- Support::bitVectorSetBit(vec, 95, false);
- EXPECT_EQ(vec[0], 0x00000002u);
- EXPECT_EQ(vec[1], 0xFFFFFFFFu);
- EXPECT_EQ(vec[2], 0x7FFFFFFFu);
-
- Support::bitVectorClear(vec, 33, 32);
- EXPECT_EQ(vec[0], 0x00000002u);
- EXPECT_EQ(vec[1], 0x00000001u);
- EXPECT_EQ(vec[2], 0x7FFFFFFEu);
- }
-
- INFO("Support::bitVectorIndexOf");
- {
- uint32_t vec1[1] = { 0x80000000 };
- EXPECT_EQ(Support::bitVectorIndexOf(vec1, 0, true), 31u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec1, 1, true), 31u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec1, 31, true), 31u);
-
- uint32_t vec2[2] = { 0x00000000, 0x80000000 };
- EXPECT_EQ(Support::bitVectorIndexOf(vec2, 0, true), 63u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec2, 1, true), 63u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec2, 31, true), 63u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec2, 32, true), 63u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec2, 33, true), 63u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec2, 63, true), 63u);
-
- uint32_t vec3[3] = { 0x00000001, 0x00000000, 0x80000000 };
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 0, true), 0u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 1, true), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 2, true), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 31, true), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 32, true), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 63, true), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 64, true), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec3, 95, true), 95u);
-
- uint32_t vec4[3] = { ~vec3[0], ~vec3[1], ~vec3[2] };
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 0, false), 0u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 1, false), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 2, false), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 31, false), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 32, false), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 63, false), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 64, false), 95u);
- EXPECT_EQ(Support::bitVectorIndexOf(vec4, 95, false), 95u);
- }
-
- INFO("Support::BitWordIterator<uint32_t>");
- {
- Support::BitWordIterator<uint32_t> it(0x80000F01u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 0u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 8u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 9u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 10u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 11u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 31u);
- EXPECT_FALSE(it.hasNext());
-
- // No bits set.
- it.init(0x00000000u);
- EXPECT_FALSE(it.hasNext());
-
- // Only first bit set.
- it.init(0x00000001u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 0u);
- EXPECT_FALSE(it.hasNext());
-
- // Only last bit set (special case).
- it.init(0x80000000u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 31u);
- EXPECT_FALSE(it.hasNext());
- }
-
- INFO("Support::BitWordIterator<uint64_t>");
- {
- Support::BitWordIterator<uint64_t> it(uint64_t(1) << 63);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 63u);
- EXPECT_FALSE(it.hasNext());
- }
-
- INFO("Support::BitVectorIterator<uint32_t>");
- {
- // Border cases.
- static const uint32_t bitsNone[] = { 0xFFFFFFFFu };
- Support::BitVectorIterator<uint32_t> it(bitsNone, 0);
-
- EXPECT_FALSE(it.hasNext());
- it.init(bitsNone, 0, 1);
- EXPECT_FALSE(it.hasNext());
- it.init(bitsNone, 0, 128);
- EXPECT_FALSE(it.hasNext());
-
- static const uint32_t bits1[] = { 0x80000008u, 0x80000001u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x00003000u };
- it.init(bits1, ASMJIT_ARRAY_SIZE(bits1));
-
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 3u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 31u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 32u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 63u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 127u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 204u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 205u);
- EXPECT_FALSE(it.hasNext());
-
- it.init(bits1, ASMJIT_ARRAY_SIZE(bits1), 4);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 31u);
-
- it.init(bits1, ASMJIT_ARRAY_SIZE(bits1), 64);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 127u);
-
- it.init(bits1, ASMJIT_ARRAY_SIZE(bits1), 127);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 127u);
-
- static const uint32_t bits2[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u };
- it.init(bits2, ASMJIT_ARRAY_SIZE(bits2));
-
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 31u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 63u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 127u);
- EXPECT_FALSE(it.hasNext());
-
- static const uint32_t bits3[] = { 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u };
- it.init(bits3, ASMJIT_ARRAY_SIZE(bits3));
- EXPECT_FALSE(it.hasNext());
-
- static const uint32_t bits4[] = { 0x00000000u, 0x00000000u, 0x00000000u, 0x80000000u };
- it.init(bits4, ASMJIT_ARRAY_SIZE(bits4));
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 127u);
- EXPECT_FALSE(it.hasNext());
- }
-
- INFO("Support::BitVectorIterator<uint64_t>");
- {
- static const uint64_t bits1[] = { 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u };
- Support::BitVectorIterator<uint64_t> it(bits1, ASMJIT_ARRAY_SIZE(bits1));
-
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 31u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 95u);
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 223u);
- EXPECT_FALSE(it.hasNext());
-
- static const uint64_t bits2[] = { 0x8000000000000000u, 0, 0, 0 };
- it.init(bits2, ASMJIT_ARRAY_SIZE(bits2));
-
- EXPECT_TRUE(it.hasNext());
- EXPECT_EQ(it.next(), 63u);
- EXPECT_FALSE(it.hasNext());
- }
-}
-
-static void testSorting() noexcept {
- INFO("Support::qSort() - Testing qsort and isort of predefined arrays");
- {
- constexpr size_t kArraySize = 11;
-
- int ref_[kArraySize] = { -4, -2, -1, 0, 1, 9, 12, 13, 14, 19, 22 };
- int arr1[kArraySize] = { 0, 1, -1, 19, 22, 14, -4, 9, 12, 13, -2 };
- int arr2[kArraySize];
-
- memcpy(arr2, arr1, kArraySize * sizeof(int));
-
- Support::iSort(arr1, kArraySize);
- Support::qSort(arr2, kArraySize);
- testArrays(arr1, ref_, kArraySize);
- testArrays(arr2, ref_, kArraySize);
- }
-
- INFO("Support::qSort() - Testing qsort and isort of artificial arrays");
- {
- constexpr size_t kArraySize = 200;
-
- int arr1[kArraySize];
- int arr2[kArraySize];
- int ref_[kArraySize];
-
- for (size_t size = 2; size < kArraySize; size++) {
- for (size_t i = 0; i < size; i++) {
- arr1[i] = int(size - 1 - i);
- arr2[i] = int(size - 1 - i);
- ref_[i] = int(i);
- }
-
- Support::iSort(arr1, size);
- Support::qSort(arr2, size);
- testArrays(arr1, ref_, size);
- testArrays(arr2, ref_, size);
- }
- }
-
- INFO("Support::qSort() - Testing qsort and isort with an unstable compare function");
- {
- constexpr size_t kArraySize = 5;
-
- float arr1[kArraySize] = { 1.0f, 0.0f, 3.0f, -1.0f, std::numeric_limits<float>::quiet_NaN() };
- float arr2[kArraySize] = { };
-
- memcpy(arr2, arr1, kArraySize * sizeof(float));
-
- // We don't test as it's undefined where the NaN would be.
- Support::iSort(arr1, kArraySize);
- Support::qSort(arr2, kArraySize);
- }
-}
-
-UNIT(support) {
- testAlignment();
- testBitUtils();
- testIntUtils();
- testReadWrite();
- testBitVector();
- testSorting();
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/support.h b/3rdparty/asmjit/src/asmjit/core/support.h
deleted file mode 100644
index 345cf8cf4cd..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/support.h
+++ /dev/null
@@ -1,1818 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_SUPPORT_H_INCLUDED
-#define ASMJIT_CORE_SUPPORT_H_INCLUDED
-
-#include "../core/globals.h"
-
-#if defined(_MSC_VER)
- #include <intrin.h>
-#endif
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_utilities
-//! \{
-
-//! Contains support classes and functions that may be used by AsmJit source and header files. Anything defined
-//! here is considered internal and should not be used outside of AsmJit and related projects like AsmTK.
-namespace Support {
-
-// Support - Basic Traits
-// ======================
-
-#if ASMJIT_ARCH_X86
-typedef uint8_t FastUInt8;
-#else
-typedef uint32_t FastUInt8;
-#endif
-
-//! \cond INTERNAL
-namespace Internal {
- template<typename T, size_t Alignment>
- struct AliasedUInt {};
-
- template<> struct AliasedUInt<uint16_t, 2> { typedef uint16_t ASMJIT_MAY_ALIAS T; };
- template<> struct AliasedUInt<uint32_t, 4> { typedef uint32_t ASMJIT_MAY_ALIAS T; };
- template<> struct AliasedUInt<uint64_t, 8> { typedef uint64_t ASMJIT_MAY_ALIAS T; };
-
- template<> struct AliasedUInt<uint16_t, 1> { typedef uint16_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 1); };
- template<> struct AliasedUInt<uint32_t, 1> { typedef uint32_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 1); };
- template<> struct AliasedUInt<uint32_t, 2> { typedef uint32_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 2); };
- template<> struct AliasedUInt<uint64_t, 1> { typedef uint64_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 1); };
- template<> struct AliasedUInt<uint64_t, 2> { typedef uint64_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 2); };
- template<> struct AliasedUInt<uint64_t, 4> { typedef uint64_t ASMJIT_MAY_ALIAS ASMJIT_ALIGN_TYPE(T, 4); };
-
- // StdInt - Make an int-type by size (signed or unsigned) that is the
- // same as types defined by <stdint.h>.
- // Int32Or64 - Make an int-type that has at least 32 bits: [u]int[32|64]_t.
-
- template<size_t Size, unsigned Unsigned>
- struct StdInt {}; // Fail if not specialized.
-
- template<> struct StdInt<1, 0> { typedef int8_t Type; };
- template<> struct StdInt<1, 1> { typedef uint8_t Type; };
- template<> struct StdInt<2, 0> { typedef int16_t Type; };
- template<> struct StdInt<2, 1> { typedef uint16_t Type; };
- template<> struct StdInt<4, 0> { typedef int32_t Type; };
- template<> struct StdInt<4, 1> { typedef uint32_t Type; };
- template<> struct StdInt<8, 0> { typedef int64_t Type; };
- template<> struct StdInt<8, 1> { typedef uint64_t Type; };
-
- template<typename T, int Unsigned = std::is_unsigned<T>::value>
- struct Int32Or64 : public StdInt<sizeof(T) <= 4 ? size_t(4) : sizeof(T), Unsigned> {};
-}
-//! \endcond
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isUnsigned() noexcept { return std::is_unsigned<T>::value; }
-
-//! Casts an integer `x` to either `int32_t` or `int64_t` depending on `T`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr typename Internal::Int32Or64<T, 0>::Type asInt(const T& x) noexcept {
- return (typename Internal::Int32Or64<T, 0>::Type)x;
-}
-
-//! Casts an integer `x` to either `uint32_t` or `uint64_t` depending on `T`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr typename Internal::Int32Or64<T, 1>::Type asUInt(const T& x) noexcept {
- return (typename Internal::Int32Or64<T, 1>::Type)x;
-}
-
-//! Casts an integer `x` to either `int32_t`, uint32_t`, `int64_t`, or `uint64_t` depending on `T`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr typename Internal::Int32Or64<T>::Type asNormalized(const T& x) noexcept {
- return (typename Internal::Int32Or64<T>::Type)x;
-}
-
-//! Casts an integer `x` to the same type as defined by `<stdint.h>`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr typename Internal::StdInt<sizeof(T), isUnsigned<T>()>::Type asStdInt(const T& x) noexcept {
- return (typename Internal::StdInt<sizeof(T), isUnsigned<T>()>::Type)x;
-}
-
-//! A helper class that can be used to iterate over enum values.
-template<typename T, T from = (T)0, T to = T::kMaxValue>
-struct EnumValues {
- typedef typename std::underlying_type<T>::type ValueType;
-
- struct Iterator {
- ValueType value;
-
- ASMJIT_INLINE_NODEBUG T operator*() const { return (T)value; }
- ASMJIT_INLINE_NODEBUG void operator++() { ++value; }
-
- ASMJIT_INLINE_NODEBUG bool operator==(const Iterator& other) const noexcept { return value == other.value; }
- ASMJIT_INLINE_NODEBUG bool operator!=(const Iterator& other) const noexcept { return value != other.value; }
- };
-
- ASMJIT_INLINE_NODEBUG Iterator begin() const noexcept { return Iterator{ValueType(from)}; }
- ASMJIT_INLINE_NODEBUG Iterator end() const noexcept { return Iterator{ValueType(to) + 1}; }
-};
-
-// Support - BitCast
-// =================
-
-//! \cond
-namespace Internal {
- template<typename DstT, typename SrcT>
- union BitCastUnion {
- ASMJIT_INLINE_NODEBUG BitCastUnion(SrcT src) noexcept : src(src) {}
- SrcT src;
- DstT dst;
- };
-}
-//! \endcond
-
-//! Bit-casts from `Src` type to `Dst` type.
-//!
-//! Useful to bit-cast between integers and floating points.
-template<typename Dst, typename Src>
-static ASMJIT_INLINE_NODEBUG Dst bitCast(const Src& x) noexcept { return Internal::BitCastUnion<Dst, Src>(x).dst; }
-
-// Support - BitOps
-// ================
-
-//! Storage used to store a pack of bits (should by compatible with a machine word).
-typedef Internal::StdInt<sizeof(uintptr_t), 1>::Type BitWord;
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t bitSizeOf() noexcept { return uint32_t(sizeof(T) * 8u); }
-
-//! Number of bits stored in a single `BitWord`.
-static constexpr uint32_t kBitWordSizeInBits = bitSizeOf<BitWord>();
-
-//! Returns `0 - x` in a safe way (no undefined behavior), works for unsigned numbers as well.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T neg(const T& x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return T(U(0) - U(x));
-}
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T allOnes() noexcept { return neg<T>(T(1)); }
-
-//! Returns `x << y` (shift left logical) by explicitly casting `x` to an unsigned type and back.
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X shl(const X& x, const Y& y) noexcept {
- typedef typename std::make_unsigned<X>::type U;
- return X(U(x) << y);
-}
-
-//! Returns `x >> y` (shift right logical) by explicitly casting `x` to an unsigned type and back.
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X shr(const X& x, const Y& y) noexcept {
- typedef typename std::make_unsigned<X>::type U;
- return X(U(x) >> y);
-}
-
-//! Returns `x >> y` (shift right arithmetic) by explicitly casting `x` to a signed type and back.
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X sar(const X& x, const Y& y) noexcept {
- typedef typename std::make_signed<X>::type S;
- return X(S(x) >> y);
-}
-
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X ror(const X& x, const Y& y) noexcept {
- typedef typename std::make_unsigned<X>::type U;
- return X((U(x) >> y) | (U(x) << (bitSizeOf<U>() - U(y))));
-}
-
-//! Returns `x | (x >> y)` - helper used by some bit manipulation helpers.
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X or_shr(const X& x, const Y& y) noexcept { return X(x | shr(x, y)); }
-
-//! Returns `x & -x` - extracts lowest set isolated bit (like BLSI instruction).
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T blsi(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return T(U(x) & neg(U(x)));
-}
-
-//! Tests whether the given value `x` has `n`th bit set.
-template<typename T, typename IndexT>
-static ASMJIT_INLINE_NODEBUG constexpr bool bitTest(T x, IndexT n) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return (U(x) & (U(1) << asStdInt(n))) != 0;
-}
-
-// Tests whether the given `value` is a consecutive mask of bits that starts at
-// the least significant bit.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isLsbMask(const T& value) {
- typedef typename std::make_unsigned<T>::type U;
- return value && ((U(value) + 1u) & U(value)) == 0;
-}
-
-// Tests whether the given value contains at least one bit or whether it's a
-// bit-mask of consecutive bits.
-//
-// This function is similar to \ref isLsbMask(), but the mask doesn't have to
-// start at a least significant bit.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isConsecutiveMask(const T& value) {
- typedef typename std::make_unsigned<T>::type U;
- return value && isLsbMask((U(value) - 1u) | U(value));
-}
-
-//! Generates a trailing bit-mask that has `n` least significant (trailing) bits set.
-template<typename T, typename CountT>
-static ASMJIT_INLINE_NODEBUG constexpr T lsbMask(const CountT& n) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return (sizeof(U) < sizeof(uintptr_t))
- // Prevent undefined behavior by using a larger type than T.
- ? T(U((uintptr_t(1) << n) - uintptr_t(1)))
- // Prevent undefined behavior by checking `n` before shift.
- : n ? T(shr(allOnes<T>(), bitSizeOf<T>() - size_t(n))) : T(0);
-}
-
-//! Generates a leading bit-mask that has `n` most significant (leading) bits set.
-template<typename T, typename CountT>
-static ASMJIT_INLINE_NODEBUG constexpr T msbMask(const CountT& n) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return (sizeof(U) < sizeof(uintptr_t))
- // Prevent undefined behavior by using a larger type than T.
- ? T(allOnes<uintptr_t>() >> (bitSizeOf<uintptr_t>() - n))
- // Prevent undefined behavior by performing `n & (nBits - 1)` so it's always within the range.
- : T(sar(U(n != 0) << (bitSizeOf<U>() - 1), n ? uint32_t(n - 1) : uint32_t(0)));
-}
-
-//! Returns a bit-mask that has `x` bit set.
-template<typename Index>
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t bitMask(const Index& x) noexcept { return (1u << asUInt(x)); }
-
-//! Returns a bit-mask that has `x` bit set (multiple arguments).
-template<typename Index, typename... Args>
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t bitMask(const Index& x, Args... args) noexcept { return bitMask(x) | bitMask(args...); }
-
-//! Converts a boolean value `b` to zero or full mask (all bits set).
-template<typename DstT, typename SrcT>
-static ASMJIT_INLINE_NODEBUG constexpr DstT bitMaskFromBool(SrcT b) noexcept {
- typedef typename std::make_unsigned<DstT>::type U;
- return DstT(U(0) - U(b));
-}
-
-//! Tests whether `a & b` is non-zero.
-template<typename A, typename B>
-static inline constexpr bool test(A a, B b) noexcept { return (asUInt(a) & asUInt(b)) != 0; }
-
-//! \cond
-namespace Internal {
- // Fills all trailing bits right from the first most significant bit set.
- static ASMJIT_INLINE_NODEBUG constexpr uint8_t fillTrailingBitsImpl(uint8_t x) noexcept { return or_shr(or_shr(or_shr(x, 1), 2), 4); }
- // Fills all trailing bits right from the first most significant bit set.
- static ASMJIT_INLINE_NODEBUG constexpr uint16_t fillTrailingBitsImpl(uint16_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8); }
- // Fills all trailing bits right from the first most significant bit set.
- static ASMJIT_INLINE_NODEBUG constexpr uint32_t fillTrailingBitsImpl(uint32_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8), 16); }
- // Fills all trailing bits right from the first most significant bit set.
- static ASMJIT_INLINE_NODEBUG constexpr uint64_t fillTrailingBitsImpl(uint64_t x) noexcept { return or_shr(or_shr(or_shr(or_shr(or_shr(or_shr(x, 1), 2), 4), 8), 16), 32); }
-}
-//! \endcond
-
-// Fills all trailing bits right from the first most significant bit set.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T fillTrailingBits(const T& x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return T(Internal::fillTrailingBitsImpl(U(x)));
-}
-
-// Support - Count Leading/Trailing Zeros
-// ======================================
-
-//! \cond
-namespace Internal {
-namespace {
-
-template<typename T>
-struct BitScanData { T x; uint32_t n; };
-
-template<typename T, uint32_t N>
-struct BitScanCalc {
- static ASMJIT_INLINE_NODEBUG constexpr BitScanData<T> advanceLeft(const BitScanData<T>& data, uint32_t n) noexcept {
- return BitScanData<T> { data.x << n, data.n + n };
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr BitScanData<T> advanceRight(const BitScanData<T>& data, uint32_t n) noexcept {
- return BitScanData<T> { data.x >> n, data.n + n };
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr BitScanData<T> clz(const BitScanData<T>& data) noexcept {
- return BitScanCalc<T, N / 2>::clz(advanceLeft(data, data.x & (allOnes<T>() << (bitSizeOf<T>() - N)) ? uint32_t(0) : N));
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr BitScanData<T> ctz(const BitScanData<T>& data) noexcept {
- return BitScanCalc<T, N / 2>::ctz(advanceRight(data, data.x & (allOnes<T>() >> (bitSizeOf<T>() - N)) ? uint32_t(0) : N));
- }
-};
-
-template<typename T>
-struct BitScanCalc<T, 0> {
- static ASMJIT_INLINE_NODEBUG constexpr BitScanData<T> clz(const BitScanData<T>& ctx) noexcept {
- return BitScanData<T> { 0, ctx.n - uint32_t(ctx.x >> (bitSizeOf<T>() - 1)) };
- }
-
- static ASMJIT_INLINE_NODEBUG constexpr BitScanData<T> ctz(const BitScanData<T>& ctx) noexcept {
- return BitScanData<T> { 0, ctx.n - uint32_t(ctx.x & 0x1) };
- }
-};
-
-template<typename T>
-ASMJIT_INLINE_NODEBUG constexpr uint32_t clzFallback(const T& x) noexcept {
- return BitScanCalc<T, bitSizeOf<T>() / 2u>::clz(BitScanData<T>{x, 1}).n;
-}
-
-template<typename T>
-ASMJIT_INLINE_NODEBUG constexpr uint32_t ctzFallback(const T& x) noexcept {
- return BitScanCalc<T, bitSizeOf<T>() / 2u>::ctz(BitScanData<T>{x, 1}).n;
-}
-
-template<typename T> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const T& x) noexcept { return clzFallback(asUInt(x)); }
-template<typename T> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const T& x) noexcept { return ctzFallback(asUInt(x)); }
-
-#if !defined(ASMJIT_NO_INTRINSICS)
-# if defined(__GNUC__)
-template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_clz(x)); }
-template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_clzll(x)); }
-template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint32_t& x) noexcept { return uint32_t(__builtin_ctz(x)); }
-template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint64_t& x) noexcept { return uint32_t(__builtin_ctzll(x)); }
-# elif defined(_MSC_VER)
-template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanReverse(&i, x); return uint32_t(i ^ 31); }
-template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint32_t& x) noexcept { unsigned long i; _BitScanForward(&i, x); return uint32_t(i); }
-# if ASMJIT_ARCH_X86 == 64 || ASMJIT_ARCH_ARM == 64
-template<> ASMJIT_INLINE_NODEBUG uint32_t clzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanReverse64(&i, x); return uint32_t(i ^ 63); }
-template<> ASMJIT_INLINE_NODEBUG uint32_t ctzImpl(const uint64_t& x) noexcept { unsigned long i; _BitScanForward64(&i, x); return uint32_t(i); }
-# endif
-# endif
-#endif
-
-} // {anonymous}
-} // {Internal}
-//! \endcond
-
-//! Count leading zeros in `x` (returns a position of a first bit set in `x`).
-//!
-//! \note The input MUST NOT be zero, otherwise the result is undefined.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG uint32_t clz(T x) noexcept { return Internal::clzImpl(asUInt(x)); }
-
-//! Count trailing zeros in `x` (returns a position of a first bit set in `x`).
-//!
-//! \note The input MUST NOT be zero, otherwise the result is undefined.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG uint32_t ctz(T x) noexcept { return Internal::ctzImpl(asUInt(x)); }
-
-template<uint64_t kInput>
-struct ConstCTZ {
- static constexpr uint32_t value =
- (kInput & (uint64_t(1) << 0)) ? 0 :
- (kInput & (uint64_t(1) << 1)) ? 1 :
- (kInput & (uint64_t(1) << 2)) ? 2 :
- (kInput & (uint64_t(1) << 3)) ? 3 :
- (kInput & (uint64_t(1) << 4)) ? 4 :
- (kInput & (uint64_t(1) << 5)) ? 5 :
- (kInput & (uint64_t(1) << 6)) ? 6 :
- (kInput & (uint64_t(1) << 7)) ? 7 :
- (kInput & (uint64_t(1) << 8)) ? 8 :
- (kInput & (uint64_t(1) << 9)) ? 9 :
- (kInput & (uint64_t(1) << 10)) ? 10 :
- (kInput & (uint64_t(1) << 11)) ? 11 :
- (kInput & (uint64_t(1) << 12)) ? 12 :
- (kInput & (uint64_t(1) << 13)) ? 13 :
- (kInput & (uint64_t(1) << 14)) ? 14 :
- (kInput & (uint64_t(1) << 15)) ? 15 :
- (kInput & (uint64_t(1) << 16)) ? 16 :
- (kInput & (uint64_t(1) << 17)) ? 17 :
- (kInput & (uint64_t(1) << 18)) ? 18 :
- (kInput & (uint64_t(1) << 19)) ? 19 :
- (kInput & (uint64_t(1) << 20)) ? 20 :
- (kInput & (uint64_t(1) << 21)) ? 21 :
- (kInput & (uint64_t(1) << 22)) ? 22 :
- (kInput & (uint64_t(1) << 23)) ? 23 :
- (kInput & (uint64_t(1) << 24)) ? 24 :
- (kInput & (uint64_t(1) << 25)) ? 25 :
- (kInput & (uint64_t(1) << 26)) ? 26 :
- (kInput & (uint64_t(1) << 27)) ? 27 :
- (kInput & (uint64_t(1) << 28)) ? 28 :
- (kInput & (uint64_t(1) << 29)) ? 29 :
- (kInput & (uint64_t(1) << 30)) ? 30 :
- (kInput & (uint64_t(1) << 31)) ? 31 :
- (kInput & (uint64_t(1) << 32)) ? 32 :
- (kInput & (uint64_t(1) << 33)) ? 33 :
- (kInput & (uint64_t(1) << 34)) ? 34 :
- (kInput & (uint64_t(1) << 35)) ? 35 :
- (kInput & (uint64_t(1) << 36)) ? 36 :
- (kInput & (uint64_t(1) << 37)) ? 37 :
- (kInput & (uint64_t(1) << 38)) ? 38 :
- (kInput & (uint64_t(1) << 39)) ? 39 :
- (kInput & (uint64_t(1) << 40)) ? 40 :
- (kInput & (uint64_t(1) << 41)) ? 41 :
- (kInput & (uint64_t(1) << 42)) ? 42 :
- (kInput & (uint64_t(1) << 43)) ? 43 :
- (kInput & (uint64_t(1) << 44)) ? 44 :
- (kInput & (uint64_t(1) << 45)) ? 45 :
- (kInput & (uint64_t(1) << 46)) ? 46 :
- (kInput & (uint64_t(1) << 47)) ? 47 :
- (kInput & (uint64_t(1) << 48)) ? 48 :
- (kInput & (uint64_t(1) << 49)) ? 49 :
- (kInput & (uint64_t(1) << 50)) ? 50 :
- (kInput & (uint64_t(1) << 51)) ? 51 :
- (kInput & (uint64_t(1) << 52)) ? 52 :
- (kInput & (uint64_t(1) << 53)) ? 53 :
- (kInput & (uint64_t(1) << 54)) ? 54 :
- (kInput & (uint64_t(1) << 55)) ? 55 :
- (kInput & (uint64_t(1) << 56)) ? 56 :
- (kInput & (uint64_t(1) << 57)) ? 57 :
- (kInput & (uint64_t(1) << 58)) ? 58 :
- (kInput & (uint64_t(1) << 59)) ? 59 :
- (kInput & (uint64_t(1) << 60)) ? 60 :
- (kInput & (uint64_t(1) << 61)) ? 61 :
- (kInput & (uint64_t(1) << 62)) ? 62 :
- (kInput & (uint64_t(1) << 63)) ? 63 : 64;
-};
-
-// Support - PopCnt
-// ================
-
-// Based on the following resource:
-// http://graphics.stanford.edu/~seander/bithacks.html
-//
-// Alternatively, for a very small number of bits in `x`:
-// uint32_t n = 0;
-// while (x) {
-// x &= x - 1;
-// n++;
-// }
-// return n;
-
-//! \cond
-namespace Internal {
- static ASMJIT_INLINE_NODEBUG uint32_t constPopcntImpl(uint32_t x) noexcept {
- x = x - ((x >> 1) & 0x55555555u);
- x = (x & 0x33333333u) + ((x >> 2) & 0x33333333u);
- return (((x + (x >> 4)) & 0x0F0F0F0Fu) * 0x01010101u) >> 24;
- }
-
- static ASMJIT_INLINE_NODEBUG uint32_t constPopcntImpl(uint64_t x) noexcept {
-#if ASMJIT_ARCH_BITS >= 64
- x = x - ((x >> 1) & 0x5555555555555555u);
- x = (x & 0x3333333333333333u) + ((x >> 2) & 0x3333333333333333u);
- return uint32_t((((x + (x >> 4)) & 0x0F0F0F0F0F0F0F0Fu) * 0x0101010101010101u) >> 56);
-#else
- return constPopcntImpl(uint32_t(x >> 32)) +
- constPopcntImpl(uint32_t(x & 0xFFFFFFFFu));
-#endif
- }
-
- static ASMJIT_INLINE_NODEBUG uint32_t popcntImpl(uint32_t x) noexcept {
-#if defined(__GNUC__)
- return uint32_t(__builtin_popcount(x));
-#else
- return constPopcntImpl(asUInt(x));
-#endif
- }
-
- static ASMJIT_INLINE_NODEBUG uint32_t popcntImpl(uint64_t x) noexcept {
-#if defined(__GNUC__)
- return uint32_t(__builtin_popcountll(x));
-#else
- return constPopcntImpl(asUInt(x));
-#endif
- }
-}
-//! \endcond
-
-//! Calculates count of bits in `x`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG uint32_t popcnt(T x) noexcept { return Internal::popcntImpl(asUInt(x)); }
-
-//! Calculates count of bits in `x` (useful in constant expressions).
-template<typename T>
-static ASMJIT_INLINE_NODEBUG uint32_t constPopcnt(T x) noexcept { return Internal::constPopcntImpl(asUInt(x)); }
-
-// Support - Min/Max
-// =================
-
-// NOTE: These are constexpr `min()` and `max()` implementations that are not
-// exactly the same as `std::min()` and `std::max()`. The return value is not
-// a reference to `a` or `b` but it's a new value instead.
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T min(const T& a, const T& b) noexcept { return b < a ? b : a; }
-
-template<typename T, typename... Args>
-static ASMJIT_INLINE_NODEBUG constexpr T min(const T& a, const T& b, Args&&... args) noexcept { return min(min(a, b), std::forward<Args>(args)...); }
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T max(const T& a, const T& b) noexcept { return a < b ? b : a; }
-
-template<typename T, typename... Args>
-static ASMJIT_INLINE_NODEBUG constexpr T max(const T& a, const T& b, Args&&... args) noexcept { return max(max(a, b), std::forward<Args>(args)...); }
-
-// Support - Immediate Helpers
-// ===========================
-
-namespace Internal {
- template<typename T, bool IsFloat>
- struct ImmConv {
- static ASMJIT_INLINE_NODEBUG int64_t fromT(const T& x) noexcept { return int64_t(x); }
- static ASMJIT_INLINE_NODEBUG T toT(int64_t x) noexcept { return T(uint64_t(x) & Support::allOnes<typename std::make_unsigned<T>::type>()); }
- };
-
- template<typename T>
- struct ImmConv<T, true> {
- static ASMJIT_INLINE_NODEBUG int64_t fromT(const T& x) noexcept { return int64_t(bitCast<int64_t>(double(x))); }
- static ASMJIT_INLINE_NODEBUG T toT(int64_t x) noexcept { return T(bitCast<double>(x)); }
- };
-}
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG int64_t immediateFromT(const T& x) noexcept { return Internal::ImmConv<T, std::is_floating_point<T>::value>::fromT(x); }
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG T immediateToT(int64_t x) noexcept { return Internal::ImmConv<T, std::is_floating_point<T>::value>::toT(x); }
-
-// Support - Overflow Arithmetic
-// =============================
-
-//! \cond
-namespace Internal {
- template<typename T>
- inline T addOverflowFallback(T x, T y, FastUInt8* of) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- U result = U(x) + U(y);
- *of = FastUInt8(*of | FastUInt8(isUnsigned<T>() ? result < U(x) : T((U(x) ^ ~U(y)) & (U(x) ^ result)) < 0));
- return T(result);
- }
-
- template<typename T>
- inline T subOverflowFallback(T x, T y, FastUInt8* of) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- U result = U(x) - U(y);
- *of = FastUInt8(*of | FastUInt8(isUnsigned<T>() ? result > U(x) : T((U(x) ^ U(y)) & (U(x) ^ result)) < 0));
- return T(result);
- }
-
- template<typename T>
- inline T mulOverflowFallback(T x, T y, FastUInt8* of) noexcept {
- typedef typename Internal::StdInt<sizeof(T) * 2, isUnsigned<T>()>::Type I;
- typedef typename std::make_unsigned<I>::type U;
-
- U mask = allOnes<U>();
- if (std::is_signed<T>::value) {
- U prod = U(I(x)) * U(I(y));
- *of = FastUInt8(*of | FastUInt8(I(prod) < I(std::numeric_limits<T>::lowest()) || I(prod) > I(std::numeric_limits<T>::max())));
- return T(I(prod & mask));
- }
- else {
- U prod = U(x) * U(y);
- *of = FastUInt8(*of | FastUInt8((prod & ~mask) != 0));
- return T(prod & mask);
- }
- }
-
- template<>
- inline int64_t mulOverflowFallback(int64_t x, int64_t y, FastUInt8* of) noexcept {
- int64_t result = int64_t(uint64_t(x) * uint64_t(y));
- *of = FastUInt8(*of | FastUInt8(x && (result / x != y)));
- return result;
- }
-
- template<>
- inline uint64_t mulOverflowFallback(uint64_t x, uint64_t y, FastUInt8* of) noexcept {
- uint64_t result = x * y;
- *of = FastUInt8(*of | FastUInt8(y != 0 && allOnes<uint64_t>() / y < x));
- return result;
- }
-
- // These can be specialized.
- template<typename T> inline T addOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return addOverflowFallback(x, y, of); }
- template<typename T> inline T subOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return subOverflowFallback(x, y, of); }
- template<typename T> inline T mulOverflowImpl(const T& x, const T& y, FastUInt8* of) noexcept { return mulOverflowFallback(x, y, of); }
-
-#if defined(__GNUC__) && !defined(ASMJIT_NO_INTRINSICS)
-#if defined(__clang__) || __GNUC__ >= 5
-#define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, RESULT_T, BUILTIN) \
- template<> \
- inline T FUNC(const T& x, const T& y, FastUInt8* of) noexcept { \
- RESULT_T result; \
- *of = FastUInt8(*of | (BUILTIN((RESULT_T)x, (RESULT_T)y, &result))); \
- return T(result); \
- }
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, int32_t , int , __builtin_sadd_overflow )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint32_t, unsigned int , __builtin_uadd_overflow )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, int64_t , long long , __builtin_saddll_overflow)
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint64_t, unsigned long long, __builtin_uaddll_overflow)
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, int32_t , int , __builtin_ssub_overflow )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint32_t, unsigned int , __builtin_usub_overflow )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, int64_t , long long , __builtin_ssubll_overflow)
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint64_t, unsigned long long, __builtin_usubll_overflow)
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, int32_t , int , __builtin_smul_overflow )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, uint32_t, unsigned int , __builtin_umul_overflow )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, int64_t , long long , __builtin_smulll_overflow)
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(mulOverflowImpl, uint64_t, unsigned long long, __builtin_umulll_overflow)
-#undef ASMJIT_ARITH_OVERFLOW_SPECIALIZE
-#endif
-#endif
-
- // There is a bug in MSVC that makes these specializations unusable, maybe in the future...
-#if defined(_MSC_VER) && 0
-#define ASMJIT_ARITH_OVERFLOW_SPECIALIZE(FUNC, T, ALT_T, BUILTIN) \
- template<> \
- inline T FUNC(T x, T y, FastUInt8* of) noexcept { \
- ALT_T result; \
- *of = FastUInt8(*of | BUILTIN(0, (ALT_T)x, (ALT_T)y, &result)); \
- return T(result); \
- }
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint32_t, unsigned int , _addcarry_u32 )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint32_t, unsigned int , _subborrow_u32)
-#if ARCH_BITS >= 64
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(addOverflowImpl, uint64_t, unsigned __int64 , _addcarry_u64 )
- ASMJIT_ARITH_OVERFLOW_SPECIALIZE(subOverflowImpl, uint64_t, unsigned __int64 , _subborrow_u64)
-#endif
-#undef ASMJIT_ARITH_OVERFLOW_SPECIALIZE
-#endif
-} // {Internal}
-//! \endcond
-
-template<typename T>
-static inline T addOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::addOverflowImpl(asStdInt(x), asStdInt(y), of)); }
-
-template<typename T>
-static inline T subOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::subOverflowImpl(asStdInt(x), asStdInt(y), of)); }
-
-template<typename T>
-static inline T mulOverflow(const T& x, const T& y, FastUInt8* of) noexcept { return T(Internal::mulOverflowImpl(asStdInt(x), asStdInt(y), of)); }
-
-// Support - Alignment
-// ===================
-
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr bool isAligned(X base, Y alignment) noexcept {
- typedef typename Internal::StdInt<sizeof(X), 1>::Type U;
- return ((U)base % (U)alignment) == 0;
-}
-
-//! Tests whether the `x` is a power of two (only one bit is set).
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isPowerOf2(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
- return x && !(U(x) & (U(x) - U(1)));
-}
-
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X alignUp(X x, Y alignment) noexcept {
- typedef typename Internal::StdInt<sizeof(X), 1>::Type U;
- return (X)( ((U)x + ((U)(alignment) - 1u)) & ~((U)(alignment) - 1u) );
-}
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T alignUpPowerOf2(T x) noexcept {
- typedef typename Internal::StdInt<sizeof(T), 1>::Type U;
- return (T)(fillTrailingBits(U(x) - 1u) + 1u);
-}
-
-//! Returns either zero or a positive difference between `base` and `base` when
-//! aligned to `alignment`.
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr typename Internal::StdInt<sizeof(X), 1>::Type alignUpDiff(X base, Y alignment) noexcept {
- typedef typename Internal::StdInt<sizeof(X), 1>::Type U;
- return alignUp(U(base), alignment) - U(base);
-}
-
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X alignDown(X x, Y alignment) noexcept {
- typedef typename Internal::StdInt<sizeof(X), 1>::Type U;
- return (X)( (U)x & ~((U)(alignment) - 1u) );
-}
-
-// Support - NumGranularized
-// =========================
-
-//! Calculates the number of elements that would be required if `base` is
-//! granularized by `granularity`. This function can be used to calculate
-//! the number of BitWords to represent N bits, for example.
-template<typename X, typename Y>
-static ASMJIT_INLINE_NODEBUG constexpr X numGranularized(X base, Y granularity) noexcept {
- typedef typename Internal::StdInt<sizeof(X), 1>::Type U;
- return X((U(base) + U(granularity) - 1) / U(granularity));
-}
-
-// Support - IsBetween
-// ===================
-
-//! Checks whether `x` is greater than or equal to `a` and lesser than or equal to `b`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isBetween(const T& x, const T& a, const T& b) noexcept {
- return x >= a && x <= b;
-}
-
-// Support - IsInt & IsUInt
-// ========================
-
-//! Checks whether the given integer `x` can be casted to a 4-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt4(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? isBetween<S>(S(x), -8, 7) : U(x) <= U(7u);
-}
-
-//! Checks whether the given integer `x` can be casted to a 7-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt7(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? isBetween<S>(S(x), -64, 63) : U(x) <= U(63u);
-}
-
-//! Checks whether the given integer `x` can be casted to an 8-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt8(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -128, 127) : U(x) <= U(127u);
-}
-
-//! Checks whether the given integer `x` can be casted to a 9-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt9(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -256, 255)
- : sizeof(T) <= 1 || U(x) <= U(255u);
-}
-
-//! Checks whether the given integer `x` can be casted to a 10-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt10(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? sizeof(T) <= 1 || isBetween<S>(S(x), -512, 511)
- : sizeof(T) <= 1 || U(x) <= U(511u);
-}
-
-//! Checks whether the given integer `x` can be casted to a 16-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt16(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? sizeof(T) <= 2 || isBetween<S>(S(x), -32768, 32767)
- : sizeof(T) <= 1 || U(x) <= U(32767u);
-}
-
-//! Checks whether the given integer `x` can be casted to a 32-bit signed integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt32(T x) noexcept {
- typedef typename std::make_signed<T>::type S;
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? sizeof(T) <= 4 || isBetween<S>(S(x), -2147483647 - 1, 2147483647)
- : sizeof(T) <= 2 || U(x) <= U(2147483647u);
-}
-
-//! Checks whether the given integer `x` can be casted to a 4-bit unsigned integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt4(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? x >= T(0) && x <= T(15)
- : U(x) <= U(15u);
-}
-
-//! Checks whether the given integer `x` can be casted to an 8-bit unsigned integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt8(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? (sizeof(T) <= 1 || T(x) <= T(255)) && x >= T(0)
- : (sizeof(T) <= 1 || U(x) <= U(255u));
-}
-
-//! Checks whether the given integer `x` can be casted to a 12-bit unsigned integer (ARM specific).
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt12(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? (sizeof(T) <= 1 || T(x) <= T(4095)) && x >= T(0)
- : (sizeof(T) <= 1 || U(x) <= U(4095u));
-}
-
-//! Checks whether the given integer `x` can be casted to a 16-bit unsigned integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt16(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? (sizeof(T) <= 2 || T(x) <= T(65535)) && x >= T(0)
- : (sizeof(T) <= 2 || U(x) <= U(65535u));
-}
-
-//! Checks whether the given integer `x` can be casted to a 32-bit unsigned integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt32(T x) noexcept {
- typedef typename std::make_unsigned<T>::type U;
-
- return std::is_signed<T>::value ? (sizeof(T) <= 4 || T(x) <= T(4294967295u)) && x >= T(0)
- : (sizeof(T) <= 4 || U(x) <= U(4294967295u));
-}
-
-//! Checks whether the given integer `x` can be casted to a 32-bit unsigned integer.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr bool isIntOrUInt32(T x) noexcept {
- return sizeof(T) <= 4 ? true : (uint32_t(uint64_t(x) >> 32) + 1u) <= 1u;
-}
-
-static bool ASMJIT_INLINE_NODEBUG isEncodableOffset32(int32_t offset, uint32_t nBits) noexcept {
- uint32_t nRev = 32 - nBits;
- return Support::sar(Support::shl(offset, nRev), nRev) == offset;
-}
-
-static bool ASMJIT_INLINE_NODEBUG isEncodableOffset64(int64_t offset, uint32_t nBits) noexcept {
- uint32_t nRev = 64 - nBits;
- return Support::sar(Support::shl(offset, nRev), nRev) == offset;
-}
-
-// Support - ByteSwap
-// ==================
-
-static ASMJIT_INLINE_NODEBUG uint16_t byteswap16(uint16_t x) noexcept {
- return uint16_t(((x >> 8) & 0xFFu) | ((x & 0xFFu) << 8));
-}
-
-static ASMJIT_INLINE_NODEBUG uint32_t byteswap32(uint32_t x) noexcept {
- return (x << 24) | (x >> 24) | ((x << 8) & 0x00FF0000u) | ((x >> 8) & 0x0000FF00);
-}
-
-static ASMJIT_INLINE_NODEBUG uint64_t byteswap64(uint64_t x) noexcept {
-#if (defined(__GNUC__) || defined(__clang__)) && !defined(ASMJIT_NO_INTRINSICS)
- return uint64_t(__builtin_bswap64(uint64_t(x)));
-#elif defined(_MSC_VER) && !defined(ASMJIT_NO_INTRINSICS)
- return uint64_t(_byteswap_uint64(uint64_t(x)));
-#else
- return (uint64_t(byteswap32(uint32_t(uint64_t(x) >> 32 ))) ) |
- (uint64_t(byteswap32(uint32_t(uint64_t(x) & 0xFFFFFFFFu))) << 32) ;
-#endif
-}
-
-// Support - BytePack & Unpack
-// ===========================
-
-//! Pack four 8-bit integer into a 32-bit integer as it is an array of `{b0,b1,b2,b3}`.
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t bytepack32_4x8(uint32_t a, uint32_t b, uint32_t c, uint32_t d) noexcept {
- return ASMJIT_ARCH_LE ? (a | (b << 8) | (c << 16) | (d << 24))
- : (d | (c << 8) | (b << 16) | (a << 24));
-}
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t unpackU32At0(T x) noexcept { return ASMJIT_ARCH_LE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); }
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t unpackU32At1(T x) noexcept { return ASMJIT_ARCH_BE ? uint32_t(uint64_t(x) & 0xFFFFFFFFu) : uint32_t(uint64_t(x) >> 32); }
-
-// Support - Position of byte (in bit-shift)
-// =========================================
-
-static ASMJIT_INLINE_NODEBUG uint32_t byteShiftOfDWordStruct(uint32_t index) noexcept {
- return ASMJIT_ARCH_LE ? index * 8 : (uint32_t(sizeof(uint32_t)) - 1u - index) * 8;
-}
-
-// Support - String Utilities
-// ==========================
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T asciiToLower(T c) noexcept { return T(c ^ T(T(c >= T('A') && c <= T('Z')) << 5)); }
-
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr T asciiToUpper(T c) noexcept { return T(c ^ T(T(c >= T('a') && c <= T('z')) << 5)); }
-
-static ASMJIT_INLINE_NODEBUG size_t strLen(const char* s, size_t maxSize) noexcept {
- size_t i = 0;
- while (i < maxSize && s[i] != '\0')
- i++;
- return i;
-}
-
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t hashRound(uint32_t hash, uint32_t c) noexcept { return hash * 65599 + c; }
-
-// Gets a hash of the given string `data` of size `size`. Size must be valid
-// as this function doesn't check for a null terminator and allows it in the
-// middle of the string.
-static ASMJIT_INLINE_NODEBUG uint32_t hashString(const char* data, size_t size) noexcept {
- uint32_t hashCode = 0;
- for (uint32_t i = 0; i < size; i++)
- hashCode = hashRound(hashCode, uint8_t(data[i]));
- return hashCode;
-}
-
-static ASMJIT_INLINE_NODEBUG const char* findPackedString(const char* p, uint32_t id) noexcept {
- uint32_t i = 0;
- while (i < id) {
- while (p[0])
- p++;
- p++;
- i++;
- }
- return p;
-}
-
-//! Compares two string views.
-static ASMJIT_FORCE_INLINE int compareStringViews(const char* aData, size_t aSize, const char* bData, size_t bSize) noexcept {
- size_t size = Support::min(aSize, bSize);
-
- for (size_t i = 0; i < size; i++) {
- int c = int(uint8_t(aData[i])) - int(uint8_t(bData[i]));
- if (c != 0)
- return c;
- }
-
- return int(aSize) - int(bSize);
-}
-
-// Support - Memory Read Access - 8 Bits
-// =====================================
-
-static ASMJIT_INLINE_NODEBUG uint8_t readU8(const void* p) noexcept { return static_cast<const uint8_t*>(p)[0]; }
-static ASMJIT_INLINE_NODEBUG int8_t readI8(const void* p) noexcept { return static_cast<const int8_t*>(p)[0]; }
-
-// Support - Memory Read Access - 16 Bits
-// ======================================
-
-template<ByteOrder BO, size_t Alignment>
-static ASMJIT_INLINE_NODEBUG uint16_t readU16x(const void* p) noexcept {
- typedef typename Internal::AliasedUInt<uint16_t, Alignment>::T U16AlignedToN;
- uint16_t x = static_cast<const U16AlignedToN*>(p)[0];
- return BO == ByteOrder::kNative ? x : byteswap16(x);
-}
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint16_t readU16u(const void* p) noexcept { return readU16x<ByteOrder::kNative, Alignment>(p); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint16_t readU16uLE(const void* p) noexcept { return readU16x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint16_t readU16uBE(const void* p) noexcept { return readU16x<ByteOrder::kBE, Alignment>(p); }
-
-static ASMJIT_INLINE_NODEBUG uint16_t readU16a(const void* p) noexcept { return readU16x<ByteOrder::kNative, 2>(p); }
-static ASMJIT_INLINE_NODEBUG uint16_t readU16aLE(const void* p) noexcept { return readU16x<ByteOrder::kLE, 2>(p); }
-static ASMJIT_INLINE_NODEBUG uint16_t readU16aBE(const void* p) noexcept { return readU16x<ByteOrder::kBE, 2>(p); }
-
-template<ByteOrder BO, size_t Alignment>
-static ASMJIT_INLINE_NODEBUG int16_t readI16x(const void* p) noexcept { return int16_t(readU16x<BO, Alignment>(p)); }
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int16_t readI16u(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kNative, Alignment>(p)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int16_t readI16uLE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kLE, Alignment>(p)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int16_t readI16uBE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kBE, Alignment>(p)); }
-
-static ASMJIT_INLINE_NODEBUG int16_t readI16a(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kNative, 2>(p)); }
-static ASMJIT_INLINE_NODEBUG int16_t readI16aLE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kLE, 2>(p)); }
-static ASMJIT_INLINE_NODEBUG int16_t readI16aBE(const void* p) noexcept { return int16_t(readU16x<ByteOrder::kBE, 2>(p)); }
-
-// Support - Memory Read Access - 24 Bits
-// ======================================
-
-template<ByteOrder BO = ByteOrder::kNative>
-static inline uint32_t readU24u(const void* p) noexcept {
- uint32_t b0 = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 2u : 0u));
- uint32_t b1 = readU8(static_cast<const uint8_t*>(p) + 1u);
- uint32_t b2 = readU8(static_cast<const uint8_t*>(p) + (BO == ByteOrder::kLE ? 0u : 2u));
- return (b0 << 16) | (b1 << 8) | b2;
-}
-
-static inline uint32_t readU24uLE(const void* p) noexcept { return readU24u<ByteOrder::kLE>(p); }
-static inline uint32_t readU24uBE(const void* p) noexcept { return readU24u<ByteOrder::kBE>(p); }
-
-// Support - Memory Read Access - 32 Bits
-// ======================================
-
-template<ByteOrder BO, size_t Alignment>
-static ASMJIT_INLINE_NODEBUG uint32_t readU32x(const void* p) noexcept {
- typedef typename Internal::AliasedUInt<uint32_t, Alignment>::T U32AlignedToN;
- uint32_t x = static_cast<const U32AlignedToN*>(p)[0];
- return BO == ByteOrder::kNative ? x : byteswap32(x);
-}
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint32_t readU32u(const void* p) noexcept { return readU32x<ByteOrder::kNative, Alignment>(p); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint32_t readU32uLE(const void* p) noexcept { return readU32x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint32_t readU32uBE(const void* p) noexcept { return readU32x<ByteOrder::kBE, Alignment>(p); }
-
-static ASMJIT_INLINE_NODEBUG uint32_t readU32a(const void* p) noexcept { return readU32x<ByteOrder::kNative, 4>(p); }
-static ASMJIT_INLINE_NODEBUG uint32_t readU32aLE(const void* p) noexcept { return readU32x<ByteOrder::kLE, 4>(p); }
-static ASMJIT_INLINE_NODEBUG uint32_t readU32aBE(const void* p) noexcept { return readU32x<ByteOrder::kBE, 4>(p); }
-
-template<ByteOrder BO, size_t Alignment>
-static ASMJIT_INLINE_NODEBUG uint32_t readI32x(const void* p) noexcept { return int32_t(readU32x<BO, Alignment>(p)); }
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int32_t readI32u(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kNative, Alignment>(p)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int32_t readI32uLE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kLE, Alignment>(p)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int32_t readI32uBE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kBE, Alignment>(p)); }
-
-static ASMJIT_INLINE_NODEBUG int32_t readI32a(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kNative, 4>(p)); }
-static ASMJIT_INLINE_NODEBUG int32_t readI32aLE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kLE, 4>(p)); }
-static ASMJIT_INLINE_NODEBUG int32_t readI32aBE(const void* p) noexcept { return int32_t(readU32x<ByteOrder::kBE, 4>(p)); }
-
-// Support - Memory Read Access - 64 Bits
-// ======================================
-
-template<ByteOrder BO, size_t Alignment>
-static ASMJIT_INLINE_NODEBUG uint64_t readU64x(const void* p) noexcept {
- typedef typename Internal::AliasedUInt<uint64_t, Alignment>::T U64AlignedToN;
- uint64_t x = static_cast<const U64AlignedToN*>(p)[0];
- return BO == ByteOrder::kNative ? x : byteswap64(x);
-}
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint64_t readU64u(const void* p) noexcept { return readU64x<ByteOrder::kNative, Alignment>(p); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint64_t readU64uLE(const void* p) noexcept { return readU64x<ByteOrder::kLE, Alignment>(p); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG uint64_t readU64uBE(const void* p) noexcept { return readU64x<ByteOrder::kBE, Alignment>(p); }
-
-static ASMJIT_INLINE_NODEBUG uint64_t readU64a(const void* p) noexcept { return readU64x<ByteOrder::kNative, 8>(p); }
-static ASMJIT_INLINE_NODEBUG uint64_t readU64aLE(const void* p) noexcept { return readU64x<ByteOrder::kLE, 8>(p); }
-static ASMJIT_INLINE_NODEBUG uint64_t readU64aBE(const void* p) noexcept { return readU64x<ByteOrder::kBE, 8>(p); }
-
-template<ByteOrder BO, size_t Alignment>
-static ASMJIT_INLINE_NODEBUG int64_t readI64x(const void* p) noexcept { return int64_t(readU64x<BO, Alignment>(p)); }
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int64_t readI64u(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kNative, Alignment>(p)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int64_t readI64uLE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kLE, Alignment>(p)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG int64_t readI64uBE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kBE, Alignment>(p)); }
-
-static ASMJIT_INLINE_NODEBUG int64_t readI64a(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kNative, 8>(p)); }
-static ASMJIT_INLINE_NODEBUG int64_t readI64aLE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kLE, 8>(p)); }
-static ASMJIT_INLINE_NODEBUG int64_t readI64aBE(const void* p) noexcept { return int64_t(readU64x<ByteOrder::kBE, 8>(p)); }
-
-// Support - Memory Write Access - 8 Bits
-// ======================================
-
-static ASMJIT_INLINE_NODEBUG void writeU8(void* p, uint8_t x) noexcept { static_cast<uint8_t*>(p)[0] = x; }
-static ASMJIT_INLINE_NODEBUG void writeI8(void* p, int8_t x) noexcept { static_cast<int8_t*>(p)[0] = x; }
-
-// Support - Memory Write Access - 16 Bits
-// =======================================
-
-template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU16x(void* p, uint16_t x) noexcept {
- typedef typename Internal::AliasedUInt<uint16_t, Alignment>::T U16AlignedToN;
- static_cast<U16AlignedToN*>(p)[0] = BO == ByteOrder::kNative ? x : byteswap16(x);
-}
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU16uLE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU16uBE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kBE, Alignment>(p, x); }
-
-static ASMJIT_INLINE_NODEBUG void writeU16a(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kNative, 2>(p, x); }
-static ASMJIT_INLINE_NODEBUG void writeU16aLE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kLE, 2>(p, x); }
-static ASMJIT_INLINE_NODEBUG void writeU16aBE(void* p, uint16_t x) noexcept { writeU16x<ByteOrder::kBE, 2>(p, x); }
-
-
-template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI16x(void* p, int16_t x) noexcept { writeU16x<BO, Alignment>(p, uint16_t(x)); }
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI16uLE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kLE, Alignment>(p, uint16_t(x)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI16uBE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kBE, Alignment>(p, uint16_t(x)); }
-
-static ASMJIT_INLINE_NODEBUG void writeI16a(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kNative, 2>(p, uint16_t(x)); }
-static ASMJIT_INLINE_NODEBUG void writeI16aLE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kLE, 2>(p, uint16_t(x)); }
-static ASMJIT_INLINE_NODEBUG void writeI16aBE(void* p, int16_t x) noexcept { writeU16x<ByteOrder::kBE, 2>(p, uint16_t(x)); }
-
-// Support - Memory Write Access - 24 Bits
-// =======================================
-
-template<ByteOrder BO = ByteOrder::kNative>
-static inline void writeU24u(void* p, uint32_t v) noexcept {
- static_cast<uint8_t*>(p)[0] = uint8_t((v >> (BO == ByteOrder::kLE ? 0 : 16)) & 0xFFu);
- static_cast<uint8_t*>(p)[1] = uint8_t((v >> 8) & 0xFFu);
- static_cast<uint8_t*>(p)[2] = uint8_t((v >> (BO == ByteOrder::kLE ? 16 : 0)) & 0xFFu);
-}
-
-static inline void writeU24uLE(void* p, uint32_t v) noexcept { writeU24u<ByteOrder::kLE>(p, v); }
-static inline void writeU24uBE(void* p, uint32_t v) noexcept { writeU24u<ByteOrder::kBE>(p, v); }
-
-// Support - Memory Write Access - 32 Bits
-// =======================================
-
-template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU32x(void* p, uint32_t x) noexcept {
- typedef typename Internal::AliasedUInt<uint32_t, Alignment>::T U32AlignedToN;
- static_cast<U32AlignedToN*>(p)[0] = (BO == ByteOrder::kNative) ? x : Support::byteswap32(x);
-}
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU32u(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kNative, Alignment>(p, x); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU32uLE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU32uBE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kBE, Alignment>(p, x); }
-
-static ASMJIT_INLINE_NODEBUG void writeU32a(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kNative, 4>(p, x); }
-static ASMJIT_INLINE_NODEBUG void writeU32aLE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kLE, 4>(p, x); }
-static ASMJIT_INLINE_NODEBUG void writeU32aBE(void* p, uint32_t x) noexcept { writeU32x<ByteOrder::kBE, 4>(p, x); }
-
-template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI32x(void* p, int32_t x) noexcept { writeU32x<BO, Alignment>(p, uint32_t(x)); }
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI32u(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kNative, Alignment>(p, uint32_t(x)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI32uLE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kLE, Alignment>(p, uint32_t(x)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI32uBE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kBE, Alignment>(p, uint32_t(x)); }
-
-static ASMJIT_INLINE_NODEBUG void writeI32a(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kNative, 4>(p, uint32_t(x)); }
-static ASMJIT_INLINE_NODEBUG void writeI32aLE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kLE, 4>(p, uint32_t(x)); }
-static ASMJIT_INLINE_NODEBUG void writeI32aBE(void* p, int32_t x) noexcept { writeU32x<ByteOrder::kBE, 4>(p, uint32_t(x)); }
-
-// Support - Memory Write Access - 64 Bits
-// =======================================
-
-template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU64x(void* p, uint64_t x) noexcept {
- typedef typename Internal::AliasedUInt<uint64_t, Alignment>::T U64AlignedToN;
- static_cast<U64AlignedToN*>(p)[0] = BO == ByteOrder::kNative ? x : byteswap64(x);
-}
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU64u(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kNative, Alignment>(p, x); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU64uLE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kLE, Alignment>(p, x); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeU64uBE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kBE, Alignment>(p, x); }
-
-static ASMJIT_INLINE_NODEBUG void writeU64a(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kNative, 8>(p, x); }
-static ASMJIT_INLINE_NODEBUG void writeU64aLE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kLE, 8>(p, x); }
-static ASMJIT_INLINE_NODEBUG void writeU64aBE(void* p, uint64_t x) noexcept { writeU64x<ByteOrder::kBE, 8>(p, x); }
-
-template<ByteOrder BO = ByteOrder::kNative, size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI64x(void* p, int64_t x) noexcept { writeU64x<BO, Alignment>(p, uint64_t(x)); }
-
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI64u(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kNative, Alignment>(p, uint64_t(x)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI64uLE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kLE, Alignment>(p, uint64_t(x)); }
-template<size_t Alignment = 1>
-static ASMJIT_INLINE_NODEBUG void writeI64uBE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kBE, Alignment>(p, uint64_t(x)); }
-
-static ASMJIT_INLINE_NODEBUG void writeI64a(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kNative, 8>(p, uint64_t(x)); }
-static ASMJIT_INLINE_NODEBUG void writeI64aLE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kLE, 8>(p, uint64_t(x)); }
-static ASMJIT_INLINE_NODEBUG void writeI64aBE(void* p, int64_t x) noexcept { writeU64x<ByteOrder::kBE, 8>(p, uint64_t(x)); }
-
-// Support - Operators
-// ===================
-
-//! \cond INTERNAL
-struct Set { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { DebugUtils::unused(x); return y; } };
-struct SetNot { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { DebugUtils::unused(x); return ~y; } };
-struct And { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x & y; } };
-struct AndNot { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x & ~y; } };
-struct NotAnd { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return ~x & y; } };
-struct Or { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x | y; } };
-struct Xor { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x ^ y; } };
-struct Add { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x + y; } };
-struct Sub { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return x - y; } };
-struct Min { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return min<T>(x, y); } };
-struct Max { template<typename T> static ASMJIT_INLINE_NODEBUG T op(T x, T y) noexcept { return max<T>(x, y); } };
-//! \endcond
-
-// Support - BitWordIterator
-// =========================
-
-//! Iterates over each bit in a number which is set to 1.
-//!
-//! Example of use:
-//!
-//! ```
-//! uint32_t bitsToIterate = 0x110F;
-//! Support::BitWordIterator<uint32_t> it(bitsToIterate);
-//!
-//! while (it.hasNext()) {
-//! uint32_t bitIndex = it.next();
-//! std::printf("Bit at %u is set\n", unsigned(bitIndex));
-//! }
-//! ```
-template<typename T>
-class BitWordIterator {
-public:
- ASMJIT_INLINE_NODEBUG explicit BitWordIterator(T bitWord) noexcept
- : _bitWord(bitWord) {}
-
- ASMJIT_INLINE_NODEBUG void init(T bitWord) noexcept { _bitWord = bitWord; }
- ASMJIT_INLINE_NODEBUG bool hasNext() const noexcept { return _bitWord != 0; }
-
- ASMJIT_FORCE_INLINE uint32_t next() noexcept {
- ASMJIT_ASSERT(_bitWord != 0);
- uint32_t index = ctz(_bitWord);
- _bitWord &= T(_bitWord - 1);
- return index;
- }
-
- T _bitWord;
-};
-
-// Support - BitVectorOps
-// ======================
-
-//! \cond
-namespace Internal {
- template<typename T, class OperatorT, class FullWordOpT>
- static ASMJIT_FORCE_INLINE void bitVectorOp(T* buf, size_t index, size_t count) noexcept {
- if (count == 0)
- return;
-
- const size_t kTSizeInBits = bitSizeOf<T>();
- size_t vecIndex = index / kTSizeInBits; // T[]
- size_t bitIndex = index % kTSizeInBits; // T[][]
-
- buf += vecIndex;
-
- // The first BitWord requires special handling to preserve bits outside the fill region.
- const T kFillMask = allOnes<T>();
- size_t firstNBits = min<size_t>(kTSizeInBits - bitIndex, count);
-
- buf[0] = OperatorT::op(buf[0], (kFillMask >> (kTSizeInBits - firstNBits)) << bitIndex);
- buf++;
- count -= firstNBits;
-
- // All bits between the first and last affected BitWords can be just filled.
- while (count >= kTSizeInBits) {
- buf[0] = FullWordOpT::op(buf[0], kFillMask);
- buf++;
- count -= kTSizeInBits;
- }
-
- // The last BitWord requires special handling as well
- if (count)
- buf[0] = OperatorT::op(buf[0], kFillMask >> (kTSizeInBits - count));
- }
-}
-//! \endcond
-
-//! Sets bit in a bit-vector `buf` at `index`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG bool bitVectorGetBit(T* buf, size_t index) noexcept {
- const size_t kTSizeInBits = bitSizeOf<T>();
-
- size_t vecIndex = index / kTSizeInBits;
- size_t bitIndex = index % kTSizeInBits;
-
- return bool((buf[vecIndex] >> bitIndex) & 0x1u);
-}
-
-//! Sets bit in a bit-vector `buf` at `index` to `value`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG void bitVectorSetBit(T* buf, size_t index, bool value) noexcept {
- const size_t kTSizeInBits = bitSizeOf<T>();
-
- size_t vecIndex = index / kTSizeInBits;
- size_t bitIndex = index % kTSizeInBits;
-
- T bitMask = T(1u) << bitIndex;
- if (value)
- buf[vecIndex] |= bitMask;
- else
- buf[vecIndex] &= ~bitMask;
-}
-
-//! Sets bit in a bit-vector `buf` at `index` to `value`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG void bitVectorFlipBit(T* buf, size_t index) noexcept {
- const size_t kTSizeInBits = bitSizeOf<T>();
-
- size_t vecIndex = index / kTSizeInBits;
- size_t bitIndex = index % kTSizeInBits;
-
- T bitMask = T(1u) << bitIndex;
- buf[vecIndex] ^= bitMask;
-}
-
-//! Fills `count` bits in bit-vector `buf` starting at bit-index `index`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG void bitVectorFill(T* buf, size_t index, size_t count) noexcept { Internal::bitVectorOp<T, Or, Set>(buf, index, count); }
-
-//! Clears `count` bits in bit-vector `buf` starting at bit-index `index`.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG void bitVectorClear(T* buf, size_t index, size_t count) noexcept { Internal::bitVectorOp<T, AndNot, SetNot>(buf, index, count); }
-
-template<typename T>
-static ASMJIT_FORCE_INLINE size_t bitVectorIndexOf(T* buf, size_t start, bool value) noexcept {
- const size_t kTSizeInBits = bitSizeOf<T>();
- size_t vecIndex = start / kTSizeInBits; // T[]
- size_t bitIndex = start % kTSizeInBits; // T[][]
-
- T* p = buf + vecIndex;
-
- // We always look for zeros, if value is `true` we have to flip all bits before the search.
- const T kFillMask = allOnes<T>();
- const T kFlipMask = value ? T(0) : kFillMask;
-
- // The first BitWord requires special handling as there are some bits we want to ignore.
- T bits = (*p ^ kFlipMask) & (kFillMask << bitIndex);
- for (;;) {
- if (bits)
- return (size_t)(p - buf) * kTSizeInBits + ctz(bits);
- bits = *++p ^ kFlipMask;
- }
-}
-
-// Support - BitVectorIterator
-// ===========================
-
-template<typename T>
-class BitVectorIterator {
-public:
- const T* _ptr;
- size_t _idx;
- size_t _end;
- T _current;
-
- ASMJIT_INLINE_NODEBUG BitVectorIterator(const BitVectorIterator& other) noexcept = default;
-
- ASMJIT_INLINE_NODEBUG BitVectorIterator(const T* data, size_t numBitWords, size_t start = 0) noexcept {
- init(data, numBitWords, start);
- }
-
- ASMJIT_FORCE_INLINE void init(const T* data, size_t numBitWords, size_t start = 0) noexcept {
- const T* ptr = data + (start / bitSizeOf<T>());
- size_t idx = alignDown(start, bitSizeOf<T>());
- size_t end = numBitWords * bitSizeOf<T>();
-
- T bitWord = T(0);
- if (idx < end) {
- bitWord = *ptr++ & (allOnes<T>() << (start % bitSizeOf<T>()));
- while (!bitWord && (idx += bitSizeOf<T>()) < end)
- bitWord = *ptr++;
- }
-
- _ptr = ptr;
- _idx = idx;
- _end = end;
- _current = bitWord;
- }
-
- ASMJIT_INLINE_NODEBUG bool hasNext() const noexcept {
- return _current != T(0);
- }
-
- ASMJIT_FORCE_INLINE size_t next() noexcept {
- T bitWord = _current;
- ASMJIT_ASSERT(bitWord != T(0));
-
- uint32_t bit = ctz(bitWord);
- bitWord &= T(bitWord - 1u);
-
- size_t n = _idx + bit;
- while (!bitWord && (_idx += bitSizeOf<T>()) < _end)
- bitWord = *_ptr++;
-
- _current = bitWord;
- return n;
- }
-
- ASMJIT_FORCE_INLINE size_t peekNext() const noexcept {
- ASMJIT_ASSERT(_current != T(0));
- return _idx + ctz(_current);
- }
-};
-
-// Support - BitVectorOpIterator
-// =============================
-
-template<typename T, class OperatorT>
-class BitVectorOpIterator {
-public:
- enum : uint32_t {
- kTSizeInBits = bitSizeOf<T>()
- };
-
- const T* _aPtr;
- const T* _bPtr;
- size_t _idx;
- size_t _end;
- T _current;
-
- ASMJIT_INLINE_NODEBUG BitVectorOpIterator(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept {
- init(aData, bData, numBitWords, start);
- }
-
- ASMJIT_FORCE_INLINE void init(const T* aData, const T* bData, size_t numBitWords, size_t start = 0) noexcept {
- const T* aPtr = aData + (start / bitSizeOf<T>());
- const T* bPtr = bData + (start / bitSizeOf<T>());
- size_t idx = alignDown(start, bitSizeOf<T>());
- size_t end = numBitWords * bitSizeOf<T>();
-
- T bitWord = T(0);
- if (idx < end) {
- bitWord = OperatorT::op(*aPtr++, *bPtr++) & (allOnes<T>() << (start % bitSizeOf<T>()));
- while (!bitWord && (idx += kTSizeInBits) < end)
- bitWord = OperatorT::op(*aPtr++, *bPtr++);
- }
-
- _aPtr = aPtr;
- _bPtr = bPtr;
- _idx = idx;
- _end = end;
- _current = bitWord;
- }
-
- ASMJIT_INLINE_NODEBUG bool hasNext() noexcept {
- return _current != T(0);
- }
-
- ASMJIT_FORCE_INLINE size_t next() noexcept {
- T bitWord = _current;
- ASMJIT_ASSERT(bitWord != T(0));
-
- uint32_t bit = ctz(bitWord);
- bitWord &= T(bitWord - 1u);
-
- size_t n = _idx + bit;
- while (!bitWord && (_idx += kTSizeInBits) < _end)
- bitWord = OperatorT::op(*_aPtr++, *_bPtr++);
-
- _current = bitWord;
- return n;
- }
-};
-
-// Support - Sorting
-// =================
-
-//! Sort order.
-enum class SortOrder : uint32_t {
- //!< Ascending order.
- kAscending = 0,
- //!< Descending order.
- kDescending = 1
-};
-
-//! A helper class that provides comparison of any user-defined type that
-//! implements `<` and `>` operators (primitive types are supported as well).
-template<SortOrder kOrder = SortOrder::kAscending>
-struct Compare {
- template<typename A, typename B>
- ASMJIT_INLINE_NODEBUG int operator()(const A& a, const B& b) const noexcept {
- return kOrder == SortOrder::kAscending ? int(a > b) - int(a < b) : int(a < b) - int(a > b);
- }
-};
-
-//! Insertion sort.
-template<typename T, typename CompareT = Compare<SortOrder::kAscending>>
-static inline void iSort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept {
- for (T* pm = base + 1; pm < base + size; pm++)
- for (T* pl = pm; pl > base && cmp(pl[-1], pl[0]) > 0; pl--)
- std::swap(pl[-1], pl[0]);
-}
-
-//! \cond
-namespace Internal {
- //! Quick-sort implementation.
- template<typename T, class CompareT>
- struct QSortImpl {
- enum : size_t {
- kStackSize = 64 * 2,
- kISortThreshold = 7
- };
-
- // Based on "PDCLib - Public Domain C Library" and rewritten to C++.
- static void sort(T* base, size_t size, const CompareT& cmp) noexcept {
- T* end = base + size;
- T* stack[kStackSize];
- T** stackptr = stack;
-
- for (;;) {
- if ((size_t)(end - base) > kISortThreshold) {
- // We work from second to last - first will be pivot element.
- T* pi = base + 1;
- T* pj = end - 1;
- std::swap(base[(size_t)(end - base) / 2], base[0]);
-
- if (cmp(*pi , *pj ) > 0) std::swap(*pi , *pj );
- if (cmp(*base, *pj ) > 0) std::swap(*base, *pj );
- if (cmp(*pi , *base) > 0) std::swap(*pi , *base);
-
- // Now we have the median for pivot element, entering main loop.
- for (;;) {
- while (pi < pj && cmp(*++pi, *base) < 0) continue; // Move `i` right until `*i >= pivot`.
- while (pj > base && cmp(*--pj, *base) > 0) continue; // Move `j` left until `*j <= pivot`.
-
- if (pi > pj) break;
- std::swap(*pi, *pj);
- }
-
- // Move pivot into correct place.
- std::swap(*base, *pj);
-
- // Larger subfile base / end to stack, sort smaller.
- if (pj - base > end - pi) {
- // Left is larger.
- *stackptr++ = base;
- *stackptr++ = pj;
- base = pi;
- }
- else {
- // Right is larger.
- *stackptr++ = pi;
- *stackptr++ = end;
- end = pj;
- }
- ASMJIT_ASSERT(stackptr <= stack + kStackSize);
- }
- else {
- // UB sanitizer doesn't like applying offset to a nullptr base.
- if (base != end)
- iSort(base, (size_t)(end - base), cmp);
-
- if (stackptr == stack)
- break;
-
- end = *--stackptr;
- base = *--stackptr;
- }
- }
- }
- };
-}
-//! \endcond
-
-//! Quick sort implementation.
-//!
-//! The main reason to provide a custom qsort implementation is that we needed something that will
-//! never throw `bad_alloc` exception. This implementation doesn't use dynamic memory allocation.
-template<typename T, class CompareT = Compare<SortOrder::kAscending>>
-static ASMJIT_INLINE_NODEBUG void qSort(T* base, size_t size, const CompareT& cmp = CompareT()) noexcept {
- Internal::QSortImpl<T, CompareT>::sort(base, size, cmp);
-}
-
-// Support - ReverseIterator
-// =========================
-
-//! Reverse iterator to avoid including `<iterator>` header for iteration over arrays, specialized for
-//! AsmJit use (noexcept by design).
-template<typename T>
-class ArrayReverseIterator {
-public:
- //! \name Members
- //! \{
-
- T* _ptr {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator() noexcept = default;
- ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator(const ArrayReverseIterator& other) noexcept = default;
- ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator(T* ptr) noexcept : _ptr(ptr) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator=(const ArrayReverseIterator& other) noexcept = default;
-
- ASMJIT_INLINE_NODEBUG bool operator==(const T* other) const noexcept { return _ptr == other; }
- ASMJIT_INLINE_NODEBUG bool operator==(const ArrayReverseIterator& other) const noexcept { return _ptr == other._ptr; }
-
- ASMJIT_INLINE_NODEBUG bool operator!=(const T* other) const noexcept { return _ptr != other; }
- ASMJIT_INLINE_NODEBUG bool operator!=(const ArrayReverseIterator& other) const noexcept { return _ptr != other._ptr; }
-
- ASMJIT_INLINE_NODEBUG bool operator<(const T* other) const noexcept { return _ptr < other; }
- ASMJIT_INLINE_NODEBUG bool operator<(const ArrayReverseIterator& other) const noexcept { return _ptr < other._ptr; }
-
- ASMJIT_INLINE_NODEBUG bool operator<=(const T* other) const noexcept { return _ptr <= other; }
- ASMJIT_INLINE_NODEBUG bool operator<=(const ArrayReverseIterator& other) const noexcept { return _ptr <= other._ptr; }
-
- ASMJIT_INLINE_NODEBUG bool operator>(const T* other) const noexcept { return _ptr > other; }
- ASMJIT_INLINE_NODEBUG bool operator>(const ArrayReverseIterator& other) const noexcept { return _ptr > other._ptr; }
-
- ASMJIT_INLINE_NODEBUG bool operator>=(const T* other) const noexcept { return _ptr >= other; }
- ASMJIT_INLINE_NODEBUG bool operator>=(const ArrayReverseIterator& other) const noexcept { return _ptr >= other._ptr; }
-
- ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator++() noexcept { _ptr--; return *this; }
- ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator++(int) noexcept { ArrayReverseIterator prev(*this); _ptr--; return prev; }
-
- ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator--() noexcept { _ptr++; return *this; }
- ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator--(int) noexcept { ArrayReverseIterator prev(*this); _ptr++; return prev; }
-
- template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator operator+(const Diff& n) noexcept { return ArrayReverseIterator(_ptr -= n); }
- template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator operator-(const Diff& n) noexcept { return ArrayReverseIterator(_ptr += n); }
-
- template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator+=(const Diff& n) noexcept { _ptr -= n; return *this; }
- template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator-=(const Diff& n) noexcept { _ptr += n; return *this; }
-
- ASMJIT_INLINE_NODEBUG constexpr T& operator*() const noexcept { return _ptr[-1]; }
- ASMJIT_INLINE_NODEBUG constexpr T* operator->() const noexcept { return &_ptr[-1]; }
-
- template<typename Diff> ASMJIT_INLINE_NODEBUG T& operator[](const Diff& n) noexcept { return *(_ptr - n - 1); }
-
- ASMJIT_INLINE_NODEBUG operator T*() const noexcept { return _ptr; }
-
- //! \}
-};
-
-// Support - Array
-// ===============
-
-//! Array type, similar to std::array<T, N>, with the possibility to use enums in operator[].
-//!
-//! \note The array has C semantics - the elements in the array are not initialized.
-template<typename T, size_t N>
-struct Array {
- //! \name Members
- //! \{
-
- //! The underlying array data, use \ref data() to access it.
- T _data[N];
-
- //! \}
-
- //! \cond
- // std compatibility.
- typedef T value_type;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
-
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
-
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- //! \endcond
-
- //! \name Overloaded Operators
- //! \{
-
- template<typename Index>
- inline T& operator[](const Index& index) noexcept {
- typedef typename Internal::StdInt<sizeof(Index), 1>::Type U;
- ASMJIT_ASSERT(U(index) < N);
- return _data[U(index)];
- }
-
- template<typename Index>
- inline const T& operator[](const Index& index) const noexcept {
- typedef typename Internal::StdInt<sizeof(Index), 1>::Type U;
- ASMJIT_ASSERT(U(index) < N);
- return _data[U(index)];
- }
-
- inline bool operator==(const Array& other) const noexcept {
- for (size_t i = 0; i < N; i++)
- if (_data[i] != other._data[i])
- return false;
- return true;
- }
-
- inline bool operator!=(const Array& other) const noexcept {
- return !operator==(other);
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return false; }
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return N; }
-
- ASMJIT_INLINE_NODEBUG T* data() noexcept { return _data; }
- ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return _data; }
-
- ASMJIT_INLINE_NODEBUG T& front() noexcept { return _data[0]; }
- ASMJIT_INLINE_NODEBUG const T& front() const noexcept { return _data[0]; }
-
- ASMJIT_INLINE_NODEBUG T& back() noexcept { return _data[N - 1]; }
- ASMJIT_INLINE_NODEBUG const T& back() const noexcept { return _data[N - 1]; }
-
- ASMJIT_INLINE_NODEBUG T* begin() noexcept { return _data; }
- ASMJIT_INLINE_NODEBUG T* end() noexcept { return _data + N; }
-
- ASMJIT_INLINE_NODEBUG const T* begin() const noexcept { return _data; }
- ASMJIT_INLINE_NODEBUG const T* end() const noexcept { return _data + N; }
-
- ASMJIT_INLINE_NODEBUG const T* cbegin() const noexcept { return _data; }
- ASMJIT_INLINE_NODEBUG const T* cend() const noexcept { return _data + N; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- inline void swap(Array& other) noexcept {
- for (size_t i = 0; i < N; i++)
- std::swap(_data[i], other._data[i]);
- }
-
- inline void fill(const T& value) noexcept {
- for (size_t i = 0; i < N; i++)
- _data[i] = value;
- }
-
- inline void copyFrom(const Array& other) noexcept {
- for (size_t i = 0; i < N; i++)
- _data[i] = other._data[i];
- }
-
- template<typename Operator>
- inline void combine(const Array& other) noexcept {
- for (size_t i = 0; i < N; i++)
- _data[i] = Operator::op(_data[i], other._data[i]);
- }
-
- template<typename Operator>
- inline T aggregate(T initialValue = T()) const noexcept {
- T value = initialValue;
- for (size_t i = 0; i < N; i++)
- value = Operator::op(value, _data[i]);
- return value;
- }
-
- template<typename Fn>
- inline void forEach(Fn&& fn) noexcept {
- for (size_t i = 0; i < N; i++)
- fn(_data[i]);
- }
- //! \}
-};
-
-// Support::Temporary
-// ==================
-
-//! Used to pass a temporary buffer to:
-//!
-//! - Containers that use user-passed buffer as an initial storage (still can grow).
-//! - Zone allocator that would use the temporary buffer as a first block.
-struct Temporary {
- //! \name Members
- //! \{
-
- void* _data;
- size_t _size;
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG constexpr Temporary(const Temporary& other) noexcept = default;
- ASMJIT_INLINE_NODEBUG constexpr Temporary(void* data, size_t size) noexcept
- : _data(data),
- _size(size) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG Temporary& operator=(const Temporary& other) noexcept = default;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the data storage.
- template<typename T = void>
- ASMJIT_INLINE_NODEBUG constexpr T* data() const noexcept { return static_cast<T*>(_data); }
- //! Returns the data storage size in bytes.
- ASMJIT_INLINE_NODEBUG constexpr size_t size() const noexcept { return _size; }
-
- //! \}
-};
-
-} // {Support}
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_SUPPORT_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/support_p.h b/3rdparty/asmjit/src/asmjit/core/support_p.h
deleted file mode 100644
index 1caec9344a4..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/support_p.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_SUPPORT_P_H_INCLUDED
-#define ASMJIT_CORE_SUPPORT_P_H_INCLUDED
-
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_utilities
-//! \{
-
-namespace Support {
-
-//! \cond INTERNAL
-//! \endcond
-
-} // {Support}
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_SUPPORT_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/target.cpp b/3rdparty/asmjit/src/asmjit/core/target.cpp
deleted file mode 100644
index cbc6ab51092..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/target.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/target.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-Target::Target() noexcept
- : _environment{},
- _cpuFeatures{} {}
-Target::~Target() noexcept {}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/target.h b/3rdparty/asmjit/src/asmjit/core/target.h
deleted file mode 100644
index 4365be14011..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/target.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_TARGET_H_INCLUDED
-#define ASMJIT_CORE_TARGET_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/cpuinfo.h"
-#include "../core/func.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! Target is an abstract class that describes a machine code target.
-class ASMJIT_VIRTAPI Target {
-public:
- ASMJIT_BASE_CLASS(Target)
- ASMJIT_NONCOPYABLE(Target)
-
- //! Target environment information.
- Environment _environment;
- //! Target CPU features.
- CpuFeatures _cpuFeatures;
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a `Target` instance.
- ASMJIT_API Target() noexcept;
- //! Destroys the `Target` instance.
- ASMJIT_API virtual ~Target() noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns target's environment.
- ASMJIT_INLINE_NODEBUG const Environment& environment() const noexcept { return _environment; }
- //! Returns the target architecture.
- ASMJIT_INLINE_NODEBUG Arch arch() const noexcept { return _environment.arch(); }
- //! Returns the target sub-architecture.
- ASMJIT_INLINE_NODEBUG SubArch subArch() const noexcept { return _environment.subArch(); }
-
- //! Returns target CPU features.
- ASMJIT_INLINE_NODEBUG const CpuFeatures& cpuFeatures() const noexcept { return _cpuFeatures; }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_TARGET_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/type.cpp b/3rdparty/asmjit/src/asmjit/core/type.cpp
deleted file mode 100644
index 536fb8818f8..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/type.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/misc_p.h"
-#include "../core/type.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-namespace TypeUtils {
-
-template<uint32_t Index>
-struct ScalarOfTypeId {
- enum : uint32_t {
- kTypeId = uint32_t(
- isScalar(TypeId(Index)) ? TypeId(Index) :
- isMask8 (TypeId(Index)) ? TypeId::kUInt8 :
- isMask16(TypeId(Index)) ? TypeId::kUInt16 :
- isMask32(TypeId(Index)) ? TypeId::kUInt32 :
- isMask64(TypeId(Index)) ? TypeId::kUInt64 :
- isMmx32 (TypeId(Index)) ? TypeId::kUInt32 :
- isMmx64 (TypeId(Index)) ? TypeId::kUInt64 :
- isVec32 (TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec32Start ) + uint32_t(TypeId::kInt8)) & 0xFF) :
- isVec64 (TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec64Start ) + uint32_t(TypeId::kInt8)) & 0xFF) :
- isVec128(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec128Start) + uint32_t(TypeId::kInt8)) & 0xFF) :
- isVec256(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec256Start) + uint32_t(TypeId::kInt8)) & 0xFF) :
- isVec512(TypeId(Index)) ? TypeId((Index - uint32_t(TypeId::_kVec512Start) + uint32_t(TypeId::kInt8)) & 0xFF) : TypeId::kVoid)
- };
-};
-
-template<uint32_t Index>
-struct SizeOfTypeId {
- enum : uint32_t {
- kTypeSize =
- isInt8 (TypeId(Index)) ? 1 :
- isUInt8 (TypeId(Index)) ? 1 :
- isInt16 (TypeId(Index)) ? 2 :
- isUInt16 (TypeId(Index)) ? 2 :
- isInt32 (TypeId(Index)) ? 4 :
- isUInt32 (TypeId(Index)) ? 4 :
- isInt64 (TypeId(Index)) ? 8 :
- isUInt64 (TypeId(Index)) ? 8 :
- isFloat32(TypeId(Index)) ? 4 :
- isFloat64(TypeId(Index)) ? 8 :
- isFloat80(TypeId(Index)) ? 10 :
- isMask8 (TypeId(Index)) ? 1 :
- isMask16 (TypeId(Index)) ? 2 :
- isMask32 (TypeId(Index)) ? 4 :
- isMask64 (TypeId(Index)) ? 8 :
- isMmx32 (TypeId(Index)) ? 4 :
- isMmx64 (TypeId(Index)) ? 8 :
- isVec32 (TypeId(Index)) ? 4 :
- isVec64 (TypeId(Index)) ? 8 :
- isVec128 (TypeId(Index)) ? 16 :
- isVec256 (TypeId(Index)) ? 32 :
- isVec512 (TypeId(Index)) ? 64 : 0
- };
-};
-
-const TypeData _typeData = {
- #define VALUE(x) TypeId(ScalarOfTypeId<x>::kTypeId)
- { ASMJIT_LOOKUP_TABLE_256(VALUE, 0) },
- #undef VALUE
-
- #define VALUE(x) SizeOfTypeId<x>::kTypeSize
- { ASMJIT_LOOKUP_TABLE_256(VALUE, 0) }
- #undef VALUE
-};
-
-} // {TypeUtils}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/type.h b/3rdparty/asmjit/src/asmjit/core/type.h
deleted file mode 100644
index 415fe0a421d..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/type.h
+++ /dev/null
@@ -1,443 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_TYPE_H_INCLUDED
-#define ASMJIT_CORE_TYPE_H_INCLUDED
-
-#include "../core/globals.h"
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_core
-//! \{
-
-//! Type identifier provides a minimalist type system used across AsmJit library.
-//!
-//! This is an additional information that can be used to describe a value-type of physical or virtual register. It's
-//! used mostly by BaseCompiler to describe register representation (the group of data stored in the register and the
-//! width used) and it's also used by APIs that allow to describe and work with function signatures.
-enum class TypeId : uint8_t {
- //! Void type.
- kVoid = 0,
-
- _kBaseStart = 32,
- _kBaseEnd = 44,
-
- _kIntStart = 32,
- _kIntEnd = 41,
-
- //! Abstract signed integer type that has a native size.
- kIntPtr = 32,
- //! Abstract unsigned integer type that has a native size.
- kUIntPtr = 33,
-
- //! 8-bit signed integer type.
- kInt8 = 34,
- //! 8-bit unsigned integer type.
- kUInt8 = 35,
- //! 16-bit signed integer type.
- kInt16 = 36,
- //! 16-bit unsigned integer type.
- kUInt16 = 37,
- //! 32-bit signed integer type.
- kInt32 = 38,
- //! 32-bit unsigned integer type.
- kUInt32 = 39,
- //! 64-bit signed integer type.
- kInt64 = 40,
- //! 64-bit unsigned integer type.
- kUInt64 = 41,
-
- _kFloatStart = 42,
- _kFloatEnd = 44,
-
- //! 32-bit floating point type.
- kFloat32 = 42,
- //! 64-bit floating point type.
- kFloat64 = 43,
- //! 80-bit floating point type.
- kFloat80 = 44,
-
- _kMaskStart = 45,
- _kMaskEnd = 48,
-
- //! 8-bit opmask register (K).
- kMask8 = 45,
- //! 16-bit opmask register (K).
- kMask16 = 46,
- //! 32-bit opmask register (K).
- kMask32 = 47,
- //! 64-bit opmask register (K).
- kMask64 = 48,
-
- _kMmxStart = 49,
- _kMmxEnd = 50,
-
- //! 64-bit MMX register only used for 32 bits.
- kMmx32 = 49,
- //! 64-bit MMX register.
- kMmx64 = 50,
-
- _kVec32Start = 51,
- _kVec32End = 60,
-
- kInt8x4 = 51,
- kUInt8x4 = 52,
- kInt16x2 = 53,
- kUInt16x2 = 54,
- kInt32x1 = 55,
- kUInt32x1 = 56,
- kFloat32x1 = 59,
-
- _kVec64Start = 61,
- _kVec64End = 70,
-
- kInt8x8 = 61,
- kUInt8x8 = 62,
- kInt16x4 = 63,
- kUInt16x4 = 64,
- kInt32x2 = 65,
- kUInt32x2 = 66,
- kInt64x1 = 67,
- kUInt64x1 = 68,
- kFloat32x2 = 69,
- kFloat64x1 = 70,
-
- _kVec128Start = 71,
- _kVec128End = 80,
-
- kInt8x16 = 71,
- kUInt8x16 = 72,
- kInt16x8 = 73,
- kUInt16x8 = 74,
- kInt32x4 = 75,
- kUInt32x4 = 76,
- kInt64x2 = 77,
- kUInt64x2 = 78,
- kFloat32x4 = 79,
- kFloat64x2 = 80,
-
- _kVec256Start = 81,
- _kVec256End = 90,
-
- kInt8x32 = 81,
- kUInt8x32 = 82,
- kInt16x16 = 83,
- kUInt16x16 = 84,
- kInt32x8 = 85,
- kUInt32x8 = 86,
- kInt64x4 = 87,
- kUInt64x4 = 88,
- kFloat32x8 = 89,
- kFloat64x4 = 90,
-
- _kVec512Start = 91,
- _kVec512End = 100,
-
- kInt8x64 = 91,
- kUInt8x64 = 92,
- kInt16x32 = 93,
- kUInt16x32 = 94,
- kInt32x16 = 95,
- kUInt32x16 = 96,
- kInt64x8 = 97,
- kUInt64x8 = 98,
- kFloat32x16 = 99,
- kFloat64x8 = 100,
-
- kLastAssigned = kFloat64x8,
-
- kMaxValue = 255
-};
-ASMJIT_DEFINE_ENUM_COMPARE(TypeId)
-
-//! Type identifier utilities.
-namespace TypeUtils {
-
-struct TypeData {
- TypeId scalarOf[uint32_t(TypeId::kMaxValue) + 1];
- uint8_t sizeOf[uint32_t(TypeId::kMaxValue) + 1];
-};
-ASMJIT_VARAPI const TypeData _typeData;
-
-//! Returns the scalar type of `typeId`.
-static ASMJIT_INLINE_NODEBUG TypeId scalarOf(TypeId typeId) noexcept { return _typeData.scalarOf[uint32_t(typeId)]; }
-
-//! Returns the size [in bytes] of `typeId`.
-static ASMJIT_INLINE_NODEBUG uint32_t sizeOf(TypeId typeId) noexcept { return _typeData.sizeOf[uint32_t(typeId)]; }
-
-//! Tests whether a given type `typeId` is between `a` and `b`.
-static ASMJIT_INLINE_NODEBUG constexpr bool isBetween(TypeId typeId, TypeId a, TypeId b) noexcept {
- return Support::isBetween(uint32_t(typeId), uint32_t(a), uint32_t(b));
-}
-
-//! Tests whether a given type `typeId` is \ref TypeId::kVoid.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVoid(TypeId typeId) noexcept { return typeId == TypeId::kVoid; }
-//! Tests whether a given type `typeId` is a valid non-void type.
-static ASMJIT_INLINE_NODEBUG constexpr bool isValid(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kVec512End); }
-//! Tests whether a given type `typeId` is scalar (has no vector part).
-static ASMJIT_INLINE_NODEBUG constexpr bool isScalar(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kBaseStart, TypeId::_kBaseEnd); }
-//! Tests whether a given type `typeId` is abstract, which means that its size depends on register size.
-static ASMJIT_INLINE_NODEBUG constexpr bool isAbstract(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kIntPtr, TypeId::kUIntPtr); }
-
-//! Tests whether a given type is a scalar integer (signed or unsigned) of any size.
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kIntStart, TypeId::_kIntEnd); }
-//! Tests whether a given type is a scalar 8-bit integer (signed).
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt8(TypeId typeId) noexcept { return typeId == TypeId::kInt8; }
-//! Tests whether a given type is a scalar 8-bit integer (unsigned).
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt8(TypeId typeId) noexcept { return typeId == TypeId::kUInt8; }
-//! Tests whether a given type is a scalar 16-bit integer (signed).
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt16(TypeId typeId) noexcept { return typeId == TypeId::kInt16; }
-//! Tests whether a given type is a scalar 16-bit integer (unsigned).
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt16(TypeId typeId) noexcept { return typeId == TypeId::kUInt16; }
-//! Tests whether a given type is a scalar 32-bit integer (signed).
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt32(TypeId typeId) noexcept { return typeId == TypeId::kInt32; }
-//! Tests whether a given type is a scalar 32-bit integer (unsigned).
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt32(TypeId typeId) noexcept { return typeId == TypeId::kUInt32; }
-//! Tests whether a given type is a scalar 64-bit integer (signed).
-static ASMJIT_INLINE_NODEBUG constexpr bool isInt64(TypeId typeId) noexcept { return typeId == TypeId::kInt64; }
-//! Tests whether a given type is a scalar 64-bit integer (unsigned).
-static ASMJIT_INLINE_NODEBUG constexpr bool isUInt64(TypeId typeId) noexcept { return typeId == TypeId::kUInt64; }
-
-//! Tests whether a given type is an 8-bit general purpose register representing either signed or unsigned 8-bit integer.
-static ASMJIT_INLINE_NODEBUG constexpr bool isGp8(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt8, TypeId::kUInt8); }
-//! Tests whether a given type is a 16-bit general purpose register representing either signed or unsigned 16-bit integer
-static ASMJIT_INLINE_NODEBUG constexpr bool isGp16(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt16, TypeId::kUInt16); }
-//! Tests whether a given type is a 32-bit general purpose register representing either signed or unsigned 32-bit integer
-static ASMJIT_INLINE_NODEBUG constexpr bool isGp32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt32, TypeId::kUInt32); }
-//! Tests whether a given type is a 64-bit general purpose register representing either signed or unsigned 64-bit integer
-static ASMJIT_INLINE_NODEBUG constexpr bool isGp64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::kInt64, TypeId::kUInt64); }
-
-//! Tests whether a given type is a scalar floating point of any size.
-static ASMJIT_INLINE_NODEBUG constexpr bool isFloat(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kFloatStart, TypeId::_kFloatEnd); }
-//! Tests whether a given type is a scalar 32-bit float.
-static ASMJIT_INLINE_NODEBUG constexpr bool isFloat32(TypeId typeId) noexcept { return typeId == TypeId::kFloat32; }
-//! Tests whether a given type is a scalar 64-bit float.
-static ASMJIT_INLINE_NODEBUG constexpr bool isFloat64(TypeId typeId) noexcept { return typeId == TypeId::kFloat64; }
-//! Tests whether a given type is a scalar 80-bit float.
-static ASMJIT_INLINE_NODEBUG constexpr bool isFloat80(TypeId typeId) noexcept { return typeId == TypeId::kFloat80; }
-
-//! Tests whether a given type is a mask register of any size.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMask(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMaskStart, TypeId::_kMaskEnd); }
-//! Tests whether a given type is an 8-bit mask register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMask8(TypeId typeId) noexcept { return typeId == TypeId::kMask8; }
-//! Tests whether a given type is an 16-bit mask register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMask16(TypeId typeId) noexcept { return typeId == TypeId::kMask16; }
-//! Tests whether a given type is an 32-bit mask register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMask32(TypeId typeId) noexcept { return typeId == TypeId::kMask32; }
-//! Tests whether a given type is an 64-bit mask register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMask64(TypeId typeId) noexcept { return typeId == TypeId::kMask64; }
-
-//! Tests whether a given type is an MMX register.
-//!
-//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMmx(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kMmxStart, TypeId::_kMmxEnd); }
-//! Tests whether a given type is an MMX register, which only uses the low 32 bits of data (only specific cases).
-//!
-//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMmx32(TypeId typeId) noexcept { return typeId == TypeId::kMmx32; }
-//! Tests whether a given type is an MMX register, which uses 64 bits of data (default).
-//!
-//! \note MMX functionality is in general deprecated on X86 architecture. AsmJit provides it just for completeness.
-static ASMJIT_INLINE_NODEBUG constexpr bool isMmx64(TypeId typeId) noexcept { return typeId == TypeId::kMmx64; }
-
-//! Tests whether a given type is a vector register of any size.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVec(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec512End); }
-//! Tests whether a given type is a 32-bit or 32-bit view of a vector register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVec32(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec32Start, TypeId::_kVec32End); }
-//! Tests whether a given type is a 64-bit or 64-bit view of a vector register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVec64(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec64Start, TypeId::_kVec64End); }
-//! Tests whether a given type is a 128-bit or 128-bit view of a vector register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVec128(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec128Start, TypeId::_kVec128End); }
-//! Tests whether a given type is a 256-bit or 256-bit view of a vector register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVec256(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec256Start, TypeId::_kVec256End); }
-//! Tests whether a given type is a 512-bit or 512-bit view of a vector register.
-static ASMJIT_INLINE_NODEBUG constexpr bool isVec512(TypeId typeId) noexcept { return isBetween(typeId, TypeId::_kVec512Start, TypeId::_kVec512End); }
-
-//! \cond
-enum TypeCategory : uint32_t {
- kTypeCategoryUnknown = 0,
- kTypeCategoryEnum = 1,
- kTypeCategoryIntegral = 2,
- kTypeCategoryFloatingPoint = 3,
- kTypeCategoryFunction = 4
-};
-
-template<typename T, TypeCategory kCategory>
-struct TypeIdOfT_ByCategory {}; // Fails if not specialized.
-
-template<typename T>
-struct TypeIdOfT_ByCategory<T, kTypeCategoryIntegral> {
- enum : uint32_t {
- kTypeId = uint32_t(
- (sizeof(T) == 1 && std::is_signed<T>::value) ? TypeId::kInt8 :
- (sizeof(T) == 1 && !std::is_signed<T>::value) ? TypeId::kUInt8 :
- (sizeof(T) == 2 && std::is_signed<T>::value) ? TypeId::kInt16 :
- (sizeof(T) == 2 && !std::is_signed<T>::value) ? TypeId::kUInt16 :
- (sizeof(T) == 4 && std::is_signed<T>::value) ? TypeId::kInt32 :
- (sizeof(T) == 4 && !std::is_signed<T>::value) ? TypeId::kUInt32 :
- (sizeof(T) == 8 && std::is_signed<T>::value) ? TypeId::kInt64 :
- (sizeof(T) == 8 && !std::is_signed<T>::value) ? TypeId::kUInt64 : TypeId::kVoid)
- };
-};
-
-template<typename T>
-struct TypeIdOfT_ByCategory<T, kTypeCategoryFloatingPoint> {
- enum : uint32_t {
- kTypeId = uint32_t(
- (sizeof(T) == 4 ) ? TypeId::kFloat32 :
- (sizeof(T) == 8 ) ? TypeId::kFloat64 :
- (sizeof(T) >= 10) ? TypeId::kFloat80 : TypeId::kVoid)
- };
-};
-
-template<typename T>
-struct TypeIdOfT_ByCategory<T, kTypeCategoryEnum>
- : public TypeIdOfT_ByCategory<typename std::underlying_type<T>::type, kTypeCategoryIntegral> {};
-
-template<typename T>
-struct TypeIdOfT_ByCategory<T, kTypeCategoryFunction> {
- enum : uint32_t {
- kTypeId = uint32_t(TypeId::kUIntPtr)
- };
-};
-//! \endcond
-
-//! TypeIdOfT<> template allows to get a TypeId from a C++ type `T`.
-#ifdef _DOXYGEN
-template<typename T>
-struct TypeIdOfT {
- //! TypeId of C++ type `T`.
- static constexpr TypeId kTypeId = _TypeIdDeducedAtCompileTime_;
-};
-#else
-template<typename T>
-struct TypeIdOfT
- : public TypeIdOfT_ByCategory<T,
- std::is_enum<T>::value ? kTypeCategoryEnum :
- std::is_integral<T>::value ? kTypeCategoryIntegral :
- std::is_floating_point<T>::value ? kTypeCategoryFloatingPoint :
- std::is_function<T>::value ? kTypeCategoryFunction : kTypeCategoryUnknown> {};
-#endif
-
-//! \cond
-template<typename T>
-struct TypeIdOfT<T*> {
- enum : uint32_t {
- kTypeId = uint32_t(TypeId::kUIntPtr)
- };
-};
-
-template<typename T>
-struct TypeIdOfT<T&> {
- enum : uint32_t {
- kTypeId = uint32_t(TypeId::kUIntPtr)
- };
-};
-//! \endcond
-
-//! Returns a corresponding \ref TypeId of `T` type.
-template<typename T>
-static ASMJIT_INLINE_NODEBUG constexpr TypeId typeIdOfT() noexcept { return TypeId(TypeIdOfT<T>::kTypeId); }
-
-//! Returns offset needed to convert a `kIntPtr` and `kUIntPtr` TypeId into a type that matches `registerSize`
-//! (general-purpose register size). If you find such TypeId it's then only about adding the offset to it.
-//!
-//! For example:
-//!
-//! ```
-//! uint32_t registerSize = /* 4 or 8 */;
-//! uint32_t deabstractDelta = TypeUtils::deabstractDeltaOfSize(registerSize);
-//!
-//! TypeId typeId = 'some type-id';
-//!
-//! // Normalize some typeId into a non-abstract typeId.
-//! if (TypeUtils::isAbstract(typeId)) typeId += deabstractDelta;
-//!
-//! // The same, but by using TypeUtils::deabstract() function.
-//! typeId = TypeUtils::deabstract(typeId, deabstractDelta);
-//! ```
-static ASMJIT_INLINE_NODEBUG constexpr uint32_t deabstractDeltaOfSize(uint32_t registerSize) noexcept {
- return registerSize >= 8 ? uint32_t(TypeId::kInt64) - uint32_t(TypeId::kIntPtr)
- : uint32_t(TypeId::kInt32) - uint32_t(TypeId::kIntPtr);
-}
-
-//! Deabstracts a given `typeId` into a native type by using `deabstractDelta`, which was previously
-//! calculated by calling \ref deabstractDeltaOfSize() with a target native register size.
-static ASMJIT_INLINE_NODEBUG constexpr TypeId deabstract(TypeId typeId, uint32_t deabstractDelta) noexcept {
- return isAbstract(typeId) ? TypeId(uint32_t(typeId) + deabstractDelta) : typeId;
-}
-
-static ASMJIT_INLINE_NODEBUG constexpr TypeId scalarToVector(TypeId scalarTypeId, TypeId vecStartId) noexcept {
- return TypeId(uint32_t(vecStartId) + uint32_t(scalarTypeId) - uint32_t(TypeId::kInt8));
-}
-
-} // {TypeUtils}
-
-//! Provides type identifiers that can be used in templates instead of native types.
-namespace Type {
-
-//! bool as C++ type-name.
-struct Bool {};
-//! int8_t as C++ type-name.
-struct Int8 {};
-//! uint8_t as C++ type-name.
-struct UInt8 {};
-//! int16_t as C++ type-name.
-struct Int16 {};
-//! uint16_t as C++ type-name.
-struct UInt16 {};
-//! int32_t as C++ type-name.
-struct Int32 {};
-//! uint32_t as C++ type-name.
-struct UInt32 {};
-//! int64_t as C++ type-name.
-struct Int64 {};
-//! uint64_t as C++ type-name.
-struct UInt64 {};
-//! intptr_t as C++ type-name.
-struct IntPtr {};
-//! uintptr_t as C++ type-name.
-struct UIntPtr {};
-//! float as C++ type-name.
-struct Float32 {};
-//! double as C++ type-name.
-struct Float64 {};
-
-} // {Type}
-
-//! \cond
-#define ASMJIT_DEFINE_TYPE_ID(T, TYPE_ID) \
-namespace TypeUtils { \
- template<> \
- struct TypeIdOfT<T> { \
- enum : uint32_t { \
- kTypeId = uint32_t(TYPE_ID) \
- }; \
- }; \
-}
-
-ASMJIT_DEFINE_TYPE_ID(void , TypeId::kVoid);
-ASMJIT_DEFINE_TYPE_ID(Type::Bool , TypeId::kUInt8);
-ASMJIT_DEFINE_TYPE_ID(Type::Int8 , TypeId::kInt8);
-ASMJIT_DEFINE_TYPE_ID(Type::UInt8 , TypeId::kUInt8);
-ASMJIT_DEFINE_TYPE_ID(Type::Int16 , TypeId::kInt16);
-ASMJIT_DEFINE_TYPE_ID(Type::UInt16 , TypeId::kUInt16);
-ASMJIT_DEFINE_TYPE_ID(Type::Int32 , TypeId::kInt32);
-ASMJIT_DEFINE_TYPE_ID(Type::UInt32 , TypeId::kUInt32);
-ASMJIT_DEFINE_TYPE_ID(Type::Int64 , TypeId::kInt64);
-ASMJIT_DEFINE_TYPE_ID(Type::UInt64 , TypeId::kUInt64);
-ASMJIT_DEFINE_TYPE_ID(Type::IntPtr , TypeId::kIntPtr);
-ASMJIT_DEFINE_TYPE_ID(Type::UIntPtr, TypeId::kUIntPtr);
-ASMJIT_DEFINE_TYPE_ID(Type::Float32, TypeId::kFloat32);
-ASMJIT_DEFINE_TYPE_ID(Type::Float64, TypeId::kFloat64);
-//! \endcond
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_TYPE_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/virtmem.cpp b/3rdparty/asmjit/src/asmjit/core/virtmem.cpp
deleted file mode 100644
index 743847746af..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/virtmem.cpp
+++ /dev/null
@@ -1,1206 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#ifndef ASMJIT_NO_JIT
-
-#include "../core/osutils_p.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/virtmem.h"
-
-#if !defined(_WIN32)
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/mman.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <unistd.h>
-
- #if !ASMJIT_ARCH_X86
- #include <sys/time.h> // required by gettimeofday()
- #endif
-
- // Linux has a `memfd_create` syscall that we would like to use, if available.
- #if defined(__linux__)
- #include <sys/syscall.h>
- #include <sys/utsname.h>
-
- #ifndef MAP_HUGETLB
- #define MAP_HUGETLB 0x40000
- #endif // MAP_HUGETLB
-
- #ifndef MAP_HUGE_SHIFT
- #define MAP_HUGE_SHIFT 26
- #endif // MAP_HUGE_SHIFT
-
- #if !defined(MFD_CLOEXEC)
- #define MFD_CLOEXEC 0x0001u
- #endif // MFD_CLOEXEC
-
- #if !defined(MFD_NOEXEC_SEAL)
- #define MFD_NOEXEC_SEAL 0x0008u
- #endif // MFD_NOEXEC_SEAL
-
- #if !defined(MFD_EXEC)
- #define MFD_EXEC 0x0010u
- #endif // MFD_EXEC
-
- #ifndef MFD_HUGETLB
- #define MFD_HUGETLB 0x0004
- #endif // MFD_HUGETLB
-
- #ifndef MFD_HUGE_SHIFT
- #define MFD_HUGE_SHIFT 26
- #endif // MFD_HUGE_SHIFT
- #endif
-
- // Apple recently introduced MAP_JIT flag, which we want to use.
- #if defined(__APPLE__)
- #include <pthread.h>
- #include <TargetConditionals.h>
- #if TARGET_OS_OSX
- #include <sys/utsname.h>
- #include <libkern/OSCacheControl.h> // sys_icache_invalidate().
- #endif
- // Older SDK doesn't define `MAP_JIT`.
- #ifndef MAP_JIT
- #define MAP_JIT 0x800
- #endif
- #endif
-
- // BSD/MAC: `MAP_ANONYMOUS` is not defined, `MAP_ANON` is.
- #if !defined(MAP_ANONYMOUS)
- #define MAP_ANONYMOUS MAP_ANON
- #endif
-
- // Android NDK doesn't provide `shm_open()` and `shm_unlink()`.
- #if !defined(__BIONIC__) && !defined(ASMJIT_NO_SHM_OPEN)
- #define ASMJIT_HAS_SHM_OPEN
- #endif
-
- #if defined(__APPLE__) || defined(__BIONIC__) || !defined(ASMJIT_HAS_SHM_OPEN)
- #define ASMJIT_VM_SHM_DETECT 0
- #else
- #define ASMJIT_VM_SHM_DETECT 1
- #endif
-
- #if defined(__APPLE__) && TARGET_OS_OSX
- #if ASMJIT_ARCH_X86 != 0
- #define ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP
- #endif
- #if ASMJIT_ARCH_ARM >= 64
- #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP
- #endif
- #endif
-
- #if defined(__APPLE__) && ASMJIT_ARCH_X86 == 0
- #define ASMJIT_NO_DUAL_MAPPING
- #endif
-
- #if defined(__NetBSD__) && defined(MAP_REMAPDUP) && defined(PROT_MPROTECT)
- #define ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP
- #endif
-
- #if !defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP) && \
- !defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) && \
- !defined(ASMJIT_NO_DUAL_MAPPING)
- #define ASMJIT_ANONYMOUS_MEMORY_USE_FD
- #endif
-#endif
-
-#include <atomic>
-
-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
-#include <mach/mach.h>
-#include <mach/mach_time.h>
-
-extern "C" {
-
-#ifdef mig_external
-mig_external
-#else
-extern
-#endif
-kern_return_t mach_vm_remap(
- vm_map_t target_task,
- mach_vm_address_t *target_address,
- mach_vm_size_t size,
- mach_vm_offset_t mask,
- int flags,
- vm_map_t src_task,
- mach_vm_address_t src_address,
- boolean_t copy,
- vm_prot_t *cur_protection,
- vm_prot_t *max_protection,
- vm_inherit_t inheritance
-);
-
-} // {extern "C"}
-#endif
-
-ASMJIT_BEGIN_SUB_NAMESPACE(VirtMem)
-
-// Virtual Memory Utilities
-// ========================
-
-ASMJIT_MAYBE_UNUSED
-static const constexpr MemoryFlags dualMappingFilter[2] = {
- MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite,
- MemoryFlags::kAccessExecute | MemoryFlags::kMMapMaxAccessExecute
-};
-
-// Virtual Memory [Windows]
-// ========================
-
-#if defined(_WIN32)
-
-struct ScopedHandle {
- inline ScopedHandle() noexcept
- : value(nullptr) {}
-
- inline ~ScopedHandle() noexcept {
- if (value != nullptr)
- ::CloseHandle(value);
- }
-
- HANDLE value;
-};
-
-static void detectVMInfo(Info& vmInfo) noexcept {
- SYSTEM_INFO systemInfo;
-
- ::GetSystemInfo(&systemInfo);
- vmInfo.pageSize = Support::alignUpPowerOf2<uint32_t>(systemInfo.dwPageSize);
- vmInfo.pageGranularity = systemInfo.dwAllocationGranularity;
-}
-
-static size_t detectLargePageSize() noexcept {
- return ::GetLargePageMinimum();
-}
-
-static bool hasDualMappingSupport() noexcept {
- // TODO: This assumption works on X86 platforms, this may not work on AArch64.
- return true;
-}
-
-// Returns windows-specific protectFlags from \ref MemoryFlags.
-static DWORD protectFlagsFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
- DWORD protectFlags;
-
- // READ|WRITE|EXECUTE.
- if (Support::test(memoryFlags, MemoryFlags::kAccessExecute))
- protectFlags = Support::test(memoryFlags, MemoryFlags::kAccessWrite) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
- else if (Support::test(memoryFlags, MemoryFlags::kAccessRW))
- protectFlags = Support::test(memoryFlags, MemoryFlags::kAccessWrite) ? PAGE_READWRITE : PAGE_READONLY;
- else
- protectFlags = PAGE_NOACCESS;
-
- // Any other flags to consider?
- return protectFlags;
-}
-
-static DWORD desiredAccessFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
- DWORD access = Support::test(memoryFlags, MemoryFlags::kAccessWrite) ? FILE_MAP_WRITE : FILE_MAP_READ;
- if (Support::test(memoryFlags, MemoryFlags::kAccessExecute))
- access |= FILE_MAP_EXECUTE;
- return access;
-}
-
-static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept {
- HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone;
-
- if (hasDualMappingSupport())
- flags |= HardenedRuntimeFlags::kDualMapping;
-
- return flags;
-}
-
-Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept {
- *p = nullptr;
- if (size == 0)
- return DebugUtils::errored(kErrorInvalidArgument);
-
- DWORD allocationType = MEM_COMMIT | MEM_RESERVE;
- DWORD protectFlags = protectFlagsFromMemoryFlags(memoryFlags);
-
- if (Support::test(memoryFlags, MemoryFlags::kMMapLargePages)) {
- size_t lpSize = largePageSize();
-
- // Does it make sense to call VirtualAlloc() if we failed to query large page size?
- if (lpSize == 0)
- return DebugUtils::errored(kErrorFeatureNotEnabled);
-
- if (!Support::isAligned(size, lpSize))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- allocationType |= MEM_LARGE_PAGES;
- }
-
- void* result = ::VirtualAlloc(nullptr, size, allocationType, protectFlags);
- if (!result)
- return DebugUtils::errored(kErrorOutOfMemory);
-
- *p = result;
- return kErrorOk;
-}
-
-Error release(void* p, size_t size) noexcept {
- DebugUtils::unused(size);
- // NOTE: If the `dwFreeType` parameter is MEM_RELEASE, `size` parameter must be zero.
- constexpr DWORD dwFreeType = MEM_RELEASE;
- if (ASMJIT_UNLIKELY(!::VirtualFree(p, 0, dwFreeType)))
- return DebugUtils::errored(kErrorInvalidArgument);
- return kErrorOk;
-}
-
-Error protect(void* p, size_t size, MemoryFlags memoryFlags) noexcept {
- DWORD protectFlags = protectFlagsFromMemoryFlags(memoryFlags);
- DWORD oldFlags;
-
- if (::VirtualProtect(p, size, protectFlags, &oldFlags))
- return kErrorOk;
-
- return DebugUtils::errored(kErrorInvalidArgument);
-}
-
-Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
- dm->rx = nullptr;
- dm->rw = nullptr;
-
- if (size == 0)
- return DebugUtils::errored(kErrorInvalidArgument);
-
- ScopedHandle handle;
- handle.value = ::CreateFileMappingW(
- INVALID_HANDLE_VALUE,
- nullptr,
- PAGE_EXECUTE_READWRITE,
- (DWORD)(uint64_t(size) >> 32),
- (DWORD)(size & 0xFFFFFFFFu),
- nullptr);
-
- if (ASMJIT_UNLIKELY(!handle.value))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- void* ptr[2];
- for (uint32_t i = 0; i < 2; i++) {
- MemoryFlags accessFlags = memoryFlags & ~dualMappingFilter[i];
- DWORD desiredAccess = desiredAccessFromMemoryFlags(accessFlags);
- ptr[i] = ::MapViewOfFile(handle.value, desiredAccess, 0, 0, size);
-
- if (ptr[i] == nullptr) {
- if (i == 1u)
- ::UnmapViewOfFile(ptr[0]);
- return DebugUtils::errored(kErrorOutOfMemory);
- }
- }
-
- dm->rx = ptr[0];
- dm->rw = ptr[1];
- return kErrorOk;
-}
-
-Error releaseDualMapping(DualMapping* dm, size_t size) noexcept {
- DebugUtils::unused(size);
- bool failed = false;
-
- if (!::UnmapViewOfFile(dm->rx))
- failed = true;
-
- if (dm->rx != dm->rw && !UnmapViewOfFile(dm->rw))
- failed = true;
-
- if (failed)
- return DebugUtils::errored(kErrorInvalidArgument);
-
- dm->rx = nullptr;
- dm->rw = nullptr;
- return kErrorOk;
-}
-
-#endif
-
-// Virtual Memory [Unix]
-// =====================
-
-#if !defined(_WIN32)
-
-// Virtual Memory [Unix] - Utilities
-// =================================
-
-#if defined(__linux__) || (defined(__APPLE__) && TARGET_OS_OSX)
-struct KernelVersion {
- long ver[2];
-
- inline long major() const noexcept { return ver[0]; }
- inline long minor() const noexcept { return ver[1]; }
-
- inline bool eq(long major, long minor) const noexcept { return ver[0] == major && ver[1] == minor; }
- inline bool ge(long major, long minor) const noexcept { return ver[0] > major || (ver[0] == major && ver[1] >= minor); }
-};
-
-ASMJIT_MAYBE_UNUSED
-static KernelVersion getKernelVersion() noexcept {
- KernelVersion out {};
- struct utsname buf {};
-
- uname(&buf);
-
- size_t i = 0;
- char* p = buf.release;
-
- while (*p && i < 2u) {
- uint8_t c = uint8_t(*p);
- if (c >= uint8_t('0') && c <= uint8_t('9')) {
- out.ver[i] = strtol(p, &p, 10);
- i++;
- continue;
- }
-
- p++;
- }
-
- return out;
-}
-#endif // getKernelVersion
-
-// Translates libc errors specific to VirtualMemory mapping to `asmjit::Error`.
-ASMJIT_MAYBE_UNUSED
-static Error asmjitErrorFromErrno(int e) noexcept {
- switch (e) {
- case EACCES:
- case EAGAIN:
- case ENODEV:
- case EPERM:
- return kErrorInvalidState;
-
- case EFBIG:
- case ENOMEM:
- case EOVERFLOW:
- return kErrorOutOfMemory;
-
- case EMFILE:
- case ENFILE:
- return kErrorTooManyHandles;
-
- default:
- return kErrorInvalidArgument;
- }
-}
-
-ASMJIT_MAYBE_UNUSED
-static MemoryFlags maxAccessFlagsToRegularAccessFlags(MemoryFlags memoryFlags) noexcept {
- static constexpr uint32_t kMaxProtShift = Support::ConstCTZ<uint32_t(MemoryFlags::kMMapMaxAccessRead)>::value;
- return MemoryFlags(uint32_t(memoryFlags & MemoryFlags::kMMapMaxAccessRWX) >> kMaxProtShift);
-}
-
-ASMJIT_MAYBE_UNUSED
-static MemoryFlags regularAccessFlagsToMaxAccessFlags(MemoryFlags memoryFlags) noexcept {
- static constexpr uint32_t kMaxProtShift = Support::ConstCTZ<uint32_t(MemoryFlags::kMMapMaxAccessRead)>::value;
- return MemoryFlags(uint32_t(memoryFlags & MemoryFlags::kAccessRWX) << kMaxProtShift);
-}
-
-// Returns `mmap()` protection flags from \ref MemoryFlags.
-ASMJIT_MAYBE_UNUSED
-static int mmProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
- int protection = 0;
- if (Support::test(memoryFlags, MemoryFlags::kAccessRead)) protection |= PROT_READ;
- if (Support::test(memoryFlags, MemoryFlags::kAccessWrite)) protection |= PROT_READ | PROT_WRITE;
- if (Support::test(memoryFlags, MemoryFlags::kAccessExecute)) protection |= PROT_READ | PROT_EXEC;
- return protection;
-}
-
-// Returns maximum protection flags from `memoryFlags`.
-//
-// Uses:
-// - `PROT_MPROTECT()` on NetBSD.
-// - `PROT_MAX()` when available on other BSDs.
-ASMJIT_MAYBE_UNUSED
-static inline int mmMaxProtFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
- MemoryFlags acc = maxAccessFlagsToRegularAccessFlags(memoryFlags);
- if (acc != MemoryFlags::kNone) {
-#if defined(__NetBSD__) && defined(PROT_MPROTECT)
- return PROT_MPROTECT(mmProtFromMemoryFlags(acc));
-#elif defined(PROT_MAX)
- return PROT_MAX(mmProtFromMemoryFlags(acc));
-#else
- return 0;
-#endif
- }
-
- return 0;
-}
-
-static void detectVMInfo(Info& vmInfo) noexcept {
- uint32_t pageSize = uint32_t(::getpagesize());
-
- vmInfo.pageSize = pageSize;
- vmInfo.pageGranularity = Support::max<uint32_t>(pageSize, 65536);
-}
-
-static size_t detectLargePageSize() noexcept {
-#if defined(__APPLE__) && defined(VM_FLAGS_SUPERPAGE_SIZE_2MB) && ASMJIT_ARCH_X86
- return 2u * 1024u * 1024u;
-#elif defined(__FreeBSD__)
- Support::Array<size_t, 2> pageSize;
- // TODO: Does it return unsigned?
- return (getpagesizes(pageSize.data(), 2) < 2) ? 0 : uint32_t(pageSize[1]);
-#elif defined(__linux__)
- StringTmp<128> storage;
- if (OSUtils::readFile("/sys/kernel/mm/transparent_hugepage/hpage_pmd_size", storage, 16) != kErrorOk || storage.empty())
- return 0u;
-
- // The first value should be the size of the page (hpage_pmd_size).
- size_t largePageSize = 0;
-
- const char* buf = storage.data();
- size_t bufSize = storage.size();
-
- for (size_t i = 0; i < bufSize; i++) {
- uint32_t digit = uint32_t(uint8_t(buf[i]) - uint8_t('0'));
- if (digit >= 10u)
- break;
- largePageSize = largePageSize * 10 + digit;
- }
-
- if (Support::isPowerOf2(largePageSize))
- return largePageSize;
- else
- return 0u;
-#else
- return 0u;
-#endif
-}
-
-// Virtual Memory [Posix] - Anonymous Memory
-// =========================================
-
-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
-
-// Some operating systems don't allow /dev/shm to be executable. On Linux this happens when /dev/shm is mounted with
-// 'noexec', which is enforced by systemd. Other operating systems like MacOS also restrict executable permissions
-// regarding /dev/shm, so we use a runtime detection before attempting to allocate executable memory. Sometimes we
-// don't need the detection as we know it would always result in `AnonymousMemoryStrategy::kTmpDir`.
-enum class AnonymousMemoryStrategy : uint32_t {
- kUnknown = 0,
- kDevShm = 1,
- kTmpDir = 2
-};
-
-#if !defined(SHM_ANON)
-static const char* getTmpDir() noexcept {
- const char* tmpDir = getenv("TMPDIR");
- return tmpDir ? tmpDir : "/tmp";
-}
-#endif
-
-#if defined(__linux__) && defined(__NR_memfd_create)
-static uint32_t getMfdExecFlag() noexcept {
- static std::atomic<uint32_t> cachedMfdExecSupported;
- uint32_t val = cachedMfdExecSupported.load();
-
- if (val == 0u) {
- KernelVersion ver = getKernelVersion();
- val = uint32_t(ver.ge(6, 3)) + 1u;
- cachedMfdExecSupported.store(val);
- }
-
- return val == 2u ? uint32_t(MFD_EXEC) : uint32_t(0u);
-}
-#endif // __linux__ && __NR_memfd_create
-
-
-// It's not fully random, just to avoid collisions when opening TMP or SHM file.
-ASMJIT_MAYBE_UNUSED
-static uint64_t generateRandomBits(uintptr_t stackPtr, uint32_t attempt) noexcept {
- static std::atomic<uint32_t> internalCounter;
-
-#if defined(__GNUC__) && ASMJIT_ARCH_X86
- // Use RDTSC instruction to avoid gettimeofday() as we just need some "random" bits.
- uint64_t mix = __builtin_ia32_rdtsc();
-#else
- struct timeval tm {};
- uint64_t mix = 1; // only used when gettimeofday() fails, which is unlikely.
- if (gettimeofday(&tm, nullptr) == 0) {
- mix = uint64_t(tm.tv_usec) ^ uint64_t(tm.tv_sec);
- }
-#endif
-
- uint64_t bits = (uint64_t(stackPtr) & 0x1010505000055590u) - mix * 773703683;
- bits = (bits >> 33) ^ (bits << 7) ^ (attempt * 87178291199);
- return bits + uint64_t(++internalCounter) * 10619863;
-}
-
-class AnonymousMemory {
-public:
- enum FileType : uint32_t {
- kFileTypeNone,
- kFileTypeShm,
- kFileTypeTmp
- };
-
- int _fd;
- FileType _fileType;
- StringTmp<128> _tmpName;
-
- inline AnonymousMemory() noexcept
- : _fd(-1),
- _fileType(kFileTypeNone),
- _tmpName() {}
-
- inline ~AnonymousMemory() noexcept {
- unlink();
- close();
- }
-
- inline int fd() const noexcept { return _fd; }
-
- Error open(bool preferTmpOverDevShm) noexcept {
-#if defined(__linux__) && defined(__NR_memfd_create)
- // Linux specific 'memfd_create' - if the syscall returns `ENOSYS` it means
- // it's not available and we will never call it again (would be pointless).
- //
- // NOTE: There is also memfd_create() libc function in FreeBSD, but it internally
- // uses `shm_open(SHM_ANON, ...)` so it's not needed to add support for it (it's
- // not a syscall as in Linux).
-
- // Zero initialized, if ever changed to '1' that would mean the syscall is not
- // available and we must use `shm_open()` and `shm_unlink()` (or regular `open()`).
- static volatile uint32_t memfd_create_not_supported;
-
- if (!memfd_create_not_supported) {
- _fd = (int)syscall(__NR_memfd_create, "vmem", MFD_CLOEXEC | getMfdExecFlag());
- if (ASMJIT_LIKELY(_fd >= 0))
- return kErrorOk;
-
- int e = errno;
- if (e == ENOSYS)
- memfd_create_not_supported = 1;
- else
- return DebugUtils::errored(asmjitErrorFromErrno(e));
- }
-#endif // __linux__ && __NR_memfd_create
-
-#if defined(ASMJIT_HAS_SHM_OPEN) && defined(SHM_ANON)
- // Originally FreeBSD extension, apparently works in other BSDs too.
- DebugUtils::unused(preferTmpOverDevShm);
- _fd = ::shm_open(SHM_ANON, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
-
- if (ASMJIT_LIKELY(_fd >= 0))
- return kErrorOk;
- else
- return DebugUtils::errored(asmjitErrorFromErrno(errno));
-#else
- // POSIX API. We have to generate somehow a unique name, so use `generateRandomBits()` helper. To prevent
- // having file collisions we use `shm_open()` with flags that require creation of the file so we never open
- // an existing shared memory.
- static const char kShmFormat[] = "/shm-id-%016llX";
- uint32_t kRetryCount = 100;
-
- for (uint32_t i = 0; i < kRetryCount; i++) {
- bool useTmp = !ASMJIT_VM_SHM_DETECT || preferTmpOverDevShm;
- uint64_t bits = generateRandomBits((uintptr_t)this, i);
-
- if (useTmp) {
- _tmpName.assign(getTmpDir());
- _tmpName.appendFormat(kShmFormat, (unsigned long long)bits);
- _fd = ASMJIT_FILE64_API(::open)(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, 0);
- if (ASMJIT_LIKELY(_fd >= 0)) {
- _fileType = kFileTypeTmp;
- return kErrorOk;
- }
- }
-#if defined(ASMJIT_HAS_SHM_OPEN)
- else {
- _tmpName.assignFormat(kShmFormat, (unsigned long long)bits);
- _fd = ::shm_open(_tmpName.data(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
- if (ASMJIT_LIKELY(_fd >= 0)) {
- _fileType = kFileTypeShm;
- return kErrorOk;
- }
- }
-#endif
-
- int e = errno;
- if (e != EEXIST)
- return DebugUtils::errored(asmjitErrorFromErrno(e));
- }
-
- return DebugUtils::errored(kErrorFailedToOpenAnonymousMemory);
-#endif
- }
-
- void unlink() noexcept {
- FileType type = _fileType;
- _fileType = kFileTypeNone;
-
-#ifdef ASMJIT_HAS_SHM_OPEN
- if (type == kFileTypeShm) {
- ::shm_unlink(_tmpName.data());
- return;
- }
-#endif
-
- if (type == kFileTypeTmp) {
- ::unlink(_tmpName.data());
- return;
- }
- }
-
- void close() noexcept {
- if (_fd >= 0) {
- ::close(_fd);
- _fd = -1;
- }
- }
-
- Error allocate(size_t size) noexcept {
- // TODO: Improve this by using `posix_fallocate()` when available.
- if (ASMJIT_FILE64_API(ftruncate)(_fd, off_t(size)) != 0)
- return DebugUtils::errored(asmjitErrorFromErrno(errno));
-
- return kErrorOk;
- }
-};
-
-#if ASMJIT_VM_SHM_DETECT
-static Error detectAnonymousMemoryStrategy(AnonymousMemoryStrategy* strategyOut) noexcept {
- AnonymousMemory anonMem;
- Info vmInfo = info();
-
- ASMJIT_PROPAGATE(anonMem.open(false));
- ASMJIT_PROPAGATE(anonMem.allocate(vmInfo.pageSize));
-
- void* ptr = mmap(nullptr, vmInfo.pageSize, PROT_READ | PROT_EXEC, MAP_SHARED, anonMem.fd(), 0);
- if (ptr == MAP_FAILED) {
- int e = errno;
- if (e == EINVAL) {
- *strategyOut = AnonymousMemoryStrategy::kTmpDir;
- return kErrorOk;
- }
- return DebugUtils::errored(asmjitErrorFromErrno(e));
- }
- else {
- munmap(ptr, vmInfo.pageSize);
- *strategyOut = AnonymousMemoryStrategy::kDevShm;
- return kErrorOk;
- }
-}
-#endif
-
-static Error getAnonymousMemoryStrategy(AnonymousMemoryStrategy* strategyOut) noexcept {
-#if ASMJIT_VM_SHM_DETECT
- // Initially don't assume anything. It has to be tested whether '/dev/shm' was mounted with 'noexec' flag or not.
- static std::atomic<uint32_t> cachedStrategy;
-
- AnonymousMemoryStrategy strategy = static_cast<AnonymousMemoryStrategy>(cachedStrategy.load());
- if (strategy == AnonymousMemoryStrategy::kUnknown) {
- ASMJIT_PROPAGATE(detectAnonymousMemoryStrategy(&strategy));
- cachedStrategy.store(static_cast<uint32_t>(strategy));
- }
-
- *strategyOut = strategy;
- return kErrorOk;
-#else
- *strategyOut = AnonymousMemoryStrategy::kTmpDir;
- return kErrorOk;
-#endif
-}
-
-#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD
-
-// Virtual Memory [Posix] - Hardened Runtime & MAP_JIT
-// ===================================================
-
-// Detects whether the current process is hardened, which means that pages that have WRITE and EXECUTABLE flags
-// cannot be normally allocated. On OSX + AArch64 such allocation requires MAP_JIT flag, other platforms don't
-// support this combination.
-static bool hasHardenedRuntime() noexcept {
-#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64
- // OSX on AArch64 has always hardened runtime enabled.
- return true;
-#else
- static std::atomic<uint32_t> cachedHardenedFlag;
-
- enum HardenedFlag : uint32_t {
- kHardenedFlagUnknown = 0,
- kHardenedFlagDisabled = 1,
- kHardenedFlagEnabled = 2
- };
-
- uint32_t flag = cachedHardenedFlag.load();
- if (flag == kHardenedFlagUnknown) {
- size_t pageSize = size_t(::getpagesize());
- void* ptr = mmap(nullptr, pageSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-
- if (ptr == MAP_FAILED) {
- flag = kHardenedFlagEnabled;
- }
- else {
- flag = kHardenedFlagDisabled;
- munmap(ptr, pageSize);
- }
-
- cachedHardenedFlag.store(flag);
- }
-
- return flag == kHardenedFlagEnabled;
-#endif
-}
-
-// Detects whether MAP_JIT is available.
-static inline bool hasMapJitSupport() noexcept {
-#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_X86 == 0
- // Apple platforms always use hardened runtime + MAP_JIT on non-x86 hardware:
- // - https://developer.apple.com/documentation/apple_silicon/porting_just-in-time_compilers_to_apple_silicon
- return true;
-#elif defined(__APPLE__) && TARGET_OS_OSX
- // MAP_JIT flag required to run unsigned JIT code is only supported by kernel version 10.14+ (Mojave).
- static std::atomic<uint32_t> cachedMapJitSupport;
- uint32_t val = cachedMapJitSupport.load();
-
- if (val == 0u) {
- KernelVersion ver = getKernelVersion();
- val = uint32_t(ver.ge(18, 0)) + 1u;
- cachedMapJitSupport.store(val);
- }
-
- return val == 2u;
-#else
- // MAP_JIT is not available (it's only available on OSX).
- return false;
-#endif
-}
-
-// Returns either MAP_JIT or 0 based on `memoryFlags` and the host operating system.
-static inline int mmMapJitFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
-#if defined(__APPLE__)
- // Always use MAP_JIT flag if user asked for it (could be used for testing on non-hardened processes) and detect
- // whether it must be used when the process is actually hardened (in that case it doesn't make sense to rely on
- // user `memoryFlags`).
- //
- // MAP_JIT is not required when dual-mapping memory and is incompatible with MAP_SHARED, so it will not be
- // added when the latter is enabled.
- bool useMapJit = (Support::test(memoryFlags, MemoryFlags::kMMapEnableMapJit) || hasHardenedRuntime())
- && !Support::test(memoryFlags, MemoryFlags::kMapShared);
- if (useMapJit)
- return hasMapJitSupport() ? int(MAP_JIT) : 0;
- else
- return 0;
-#else
- DebugUtils::unused(memoryFlags);
- return 0;
-#endif
-}
-
-static inline bool hasDualMappingSupport() noexcept {
-#if defined(ASMJIT_NO_DUAL_MAPPING)
- return false;
-#else
- return true;
-#endif
-}
-
-static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept {
- HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone;
-
- if (hasHardenedRuntime())
- flags |= HardenedRuntimeFlags::kEnabled;
-
- if (hasMapJitSupport())
- flags |= HardenedRuntimeFlags::kMapJit;
-
- if (hasDualMappingSupport())
- flags |= HardenedRuntimeFlags::kDualMapping;
-
- return flags;
-}
-
-static Error mapMemory(void** p, size_t size, MemoryFlags memoryFlags, int fd = -1, off_t offset = 0) noexcept {
- *p = nullptr;
- if (size == 0)
- return DebugUtils::errored(kErrorInvalidArgument);
-
- int protection = mmProtFromMemoryFlags(memoryFlags) | mmMaxProtFromMemoryFlags(memoryFlags);
- int mmFlags = mmMapJitFromMemoryFlags(memoryFlags);
-
- mmFlags |= Support::test(memoryFlags, MemoryFlags::kMapShared) ? MAP_SHARED : MAP_PRIVATE;
- if (fd == -1)
- mmFlags |= MAP_ANONYMOUS;
-
- bool useLargePages = Support::test(memoryFlags, VirtMem::MemoryFlags::kMMapLargePages);
-
- if (useLargePages) {
-#if defined(__linux__)
- size_t lpSize = largePageSize();
- if (lpSize == 0)
- return DebugUtils::errored(kErrorFeatureNotEnabled);
-
- if (!Support::isAligned(size, lpSize))
- return DebugUtils::errored(kErrorInvalidArgument);
-
- unsigned lpSizeLog2 = Support::ctz(lpSize);
- mmFlags |= int(unsigned(MAP_HUGETLB) | (lpSizeLog2 << MAP_HUGE_SHIFT));
-#else
- return DebugUtils::errored(kErrorFeatureNotEnabled);
-#endif // __linux__
- }
-
- void* ptr = mmap(nullptr, size, protection, mmFlags, fd, offset);
- if (ptr == MAP_FAILED)
- return DebugUtils::errored(asmjitErrorFromErrno(errno));
-
-#if defined(MADV_HUGEPAGE)
- if (useLargePages) {
- madvise(ptr, size, MADV_HUGEPAGE);
- }
-#endif
-
- *p = ptr;
- return kErrorOk;
-}
-
-static Error unmapMemory(void* p, size_t size) noexcept {
- if (ASMJIT_UNLIKELY(munmap(p, size) != 0))
- return DebugUtils::errored(asmjitErrorFromErrno(errno));
-
- return kErrorOk;
-}
-
-Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept {
- return mapMemory(p, size, memoryFlags);
-}
-
-Error release(void* p, size_t size) noexcept {
- return unmapMemory(p, size);
-}
-
-Error protect(void* p, size_t size, MemoryFlags memoryFlags) noexcept {
- int protection = mmProtFromMemoryFlags(memoryFlags);
- if (mprotect(p, size, protection) == 0)
- return kErrorOk;
-
- return DebugUtils::errored(asmjitErrorFromErrno(errno));
-}
-
-// Virtual Memory [Posix] - Dual Mapping
-// =====================================
-
-#if !defined(ASMJIT_NO_DUAL_MAPPING)
-static Error unmapDualMapping(DualMapping* dm, size_t size) noexcept {
- Error err1 = unmapMemory(dm->rx, size);
- Error err2 = kErrorOk;
-
- if (dm->rx != dm->rw)
- err2 = unmapMemory(dm->rw, size);
-
- // We can report only one error, so report the first...
- if (err1 || err2)
- return DebugUtils::errored(err1 ? err1 : err2);
-
- dm->rx = nullptr;
- dm->rw = nullptr;
- return kErrorOk;
-}
-#endif // !ASMJIT_NO_DUAL_MAPPING
-
-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
-static Error allocDualMappingUsingRemapdup(DualMapping* dmOut, size_t size, MemoryFlags memoryFlags) noexcept {
- MemoryFlags maxAccessFlags = regularAccessFlagsToMaxAccessFlags(memoryFlags);
- MemoryFlags finalFlags = memoryFlags | maxAccessFlags | MemoryFlags::kMapShared;
-
- MemoryFlags rxFlags = finalFlags & ~(MemoryFlags::kAccessWrite | MemoryFlags::kMMapMaxAccessWrite);
- MemoryFlags rwFlags = finalFlags & ~(MemoryFlags::kAccessExecute);
-
- // Allocate RW mapping.
- DualMapping dm {};
- ASMJIT_PROPAGATE(mapMemory(&dm.rw, size, rwFlags));
-
- // Allocate RX mapping.
- dm.rx = mremap(dm.rw, size, nullptr, size, MAP_REMAPDUP);
- if (dm.rx == MAP_FAILED) {
- int e = errno;
- munmap(dm.rw, size);
- return DebugUtils::errored(asmjitErrorFromErrno(e));
- }
-
- if (mprotect(dm.rx, size, mmProtFromMemoryFlags(rxFlags)) != 0) {
- int e = errno;
- unmapDualMapping(&dm, size);
- return DebugUtils::errored(asmjitErrorFromErrno(e));
- }
-
- *dmOut = dm;
- return kErrorOk;
-}
-#endif
-
-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
-static Error asmjitErrorFromKernResult(kern_return_t result) noexcept {
- switch (result) {
- case KERN_PROTECTION_FAILURE:
- return DebugUtils::errored(kErrorProtectionFailure);
- case KERN_NO_SPACE:
- return DebugUtils::errored(kErrorOutOfMemory);
- case KERN_INVALID_ARGUMENT:
- return DebugUtils::errored(kErrorInvalidArgument);
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-}
-
-static Error allocDualMappingUsingMachVmRemap(DualMapping* dmOut, size_t size, MemoryFlags memoryFlags) noexcept {
- DualMapping dm {};
-
- MemoryFlags mmapFlags = MemoryFlags::kAccessReadWrite | (memoryFlags & MemoryFlags::kMapShared);
- ASMJIT_PROPAGATE(mapMemory(&dm.rx, size, mmapFlags));
-
- vm_prot_t curProt;
- vm_prot_t maxProt;
-
- int rwProtectFlags = VM_PROT_READ | VM_PROT_WRITE;
- int rxProtectFlags = VM_PROT_READ;
-
- if (Support::test(memoryFlags, MemoryFlags::kAccessExecute))
- rxProtectFlags |= VM_PROT_EXECUTE;
-
- kern_return_t result {};
- do {
- vm_map_t task = mach_task_self();
- mach_vm_address_t remappedAddr {};
-
-#if defined(VM_FLAGS_RANDOM_ADDR)
- int remapFlags = VM_FLAGS_ANYWHERE | VM_FLAGS_RANDOM_ADDR;
-#else
- int remapFlags = VM_FLAGS_ANYWHERE;
-#endif
-
- // Try to remap the existing memory into a different address.
- result = mach_vm_remap(
- task, // target_task
- &remappedAddr, // target_address
- size, // size
- 0, // mask
- remapFlags, // flags
- task, // src_task
- (mach_vm_address_t)dm.rx, // src_address
- false, // copy
- &curProt, // cur_protection
- &maxProt, // max_protection
- VM_INHERIT_DEFAULT); // inheritance
-
- if (result != KERN_SUCCESS)
- break;
-
- dm.rw = (void*)remappedAddr;
-
- // Now, try to change permissions of both map regions into RW and RX. The vm_protect()
- // API is used twice as we also want to set maximum permissions, so nobody would be
- // allowed to change the RX region back to RW or RWX (if RWX is allowed).
- uint32_t i;
- for (i = 0; i < 2; i++) {
- bool setMaximum = (i == 0);
-
- result = vm_protect(
- task, // target_task
- (vm_address_t)dm.rx, // address
- size, // size
- setMaximum, // set_maximum
- rxProtectFlags); // new_protection
-
- if (result != KERN_SUCCESS)
- break;
-
- result = vm_protect(task, // target_task
- (vm_address_t)dm.rw, // address
- size, // size
- setMaximum, // set_maximum
- rwProtectFlags); // new_protection
-
- if (result != KERN_SUCCESS)
- break;
- }
- } while (0);
-
- if (result != KERN_SUCCESS) {
- unmapDualMapping(&dm, size);
- return DebugUtils::errored(asmjitErrorFromKernResult(result));
- }
-
- *dmOut = dm;
- return kErrorOk;
-}
-#endif // ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP
-
-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
-static Error allocDualMappingUsingFile(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
- bool preferTmpOverDevShm = Support::test(memoryFlags, MemoryFlags::kMappingPreferTmp);
- if (!preferTmpOverDevShm) {
- AnonymousMemoryStrategy strategy;
- ASMJIT_PROPAGATE(getAnonymousMemoryStrategy(&strategy));
- preferTmpOverDevShm = (strategy == AnonymousMemoryStrategy::kTmpDir);
- }
-
- AnonymousMemory anonMem;
- ASMJIT_PROPAGATE(anonMem.open(preferTmpOverDevShm));
- ASMJIT_PROPAGATE(anonMem.allocate(size));
-
- void* ptr[2];
- for (uint32_t i = 0; i < 2; i++) {
- MemoryFlags restrictedMemoryFlags = memoryFlags & ~dualMappingFilter[i];
- Error err = mapMemory(&ptr[i], size, restrictedMemoryFlags | MemoryFlags::kMapShared, anonMem.fd(), 0);
- if (err != kErrorOk) {
- if (i == 1)
- unmapMemory(ptr[0], size);
- return err;
- }
- }
-
- dm->rx = ptr[0];
- dm->rw = ptr[1];
- return kErrorOk;
-}
-#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD
-
-Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
- dm->rx = nullptr;
- dm->rw = nullptr;
-
-#if defined(ASMJIT_NO_DUAL_MAPPING)
- DebugUtils::unused(size, memoryFlags);
- return DebugUtils::errored(kErrorFeatureNotEnabled);
-#else
- if (off_t(size) <= 0)
- return DebugUtils::errored(size == 0 ? kErrorInvalidArgument : kErrorTooLarge);
-
-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
- return allocDualMappingUsingRemapdup(dm, size, memoryFlags);
-#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
- return allocDualMappingUsingMachVmRemap(dm, size, memoryFlags);
-#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
- return allocDualMappingUsingFile(dm, size, memoryFlags);
-#else
- #error "[asmjit] VirtMem::allocDualMapping() doesn't have implementation for the target OS or architecture"
-#endif
-#endif // ASMJIT_NO_DUAL_MAPPING
-}
-
-Error releaseDualMapping(DualMapping* dm, size_t size) noexcept {
-#if defined(ASMJIT_NO_DUAL_MAPPING)
- DebugUtils::unused(dm, size);
- return DebugUtils::errored(kErrorFeatureNotEnabled);
-#else
- return unmapDualMapping(dm, size);
-#endif // ASMJIT_NO_DUAL_MAPPING
-}
-#endif
-
-// Virtual Memory - Flush Instruction Cache
-// ========================================
-
-void flushInstructionCache(void* p, size_t size) noexcept {
-#if ASMJIT_ARCH_X86 || defined(__EMSCRIPTEN__)
- // X86/X86_64 architecture doesn't require to do anything to flush instruction cache.
- DebugUtils::unused(p, size);
-#elif defined(__APPLE__)
- sys_icache_invalidate(p, size);
-#elif defined(_WIN32)
- // Windows has a built-in support in `kernel32.dll`.
- FlushInstructionCache(GetCurrentProcess(), p, size);
-#elif defined(__GNUC__)
- char* start = static_cast<char*>(p);
- char* end = start + size;
- __builtin___clear_cache(start, end);
-#else
- #pragma message("[asmjit] VirtMem::flushInstructionCache() doesn't have implementation for the target OS and compiler")
- DebugUtils::unused(p, size);
-#endif
-}
-
-// Virtual Memory - Memory Info
-// ============================
-
-Info info() noexcept {
- static std::atomic<uint32_t> vmInfoInitialized;
- static Info vmInfo;
-
- if (!vmInfoInitialized.load()) {
- Info localMemInfo;
- detectVMInfo(localMemInfo);
-
- vmInfo = localMemInfo;
- vmInfoInitialized.store(1u);
- }
-
- return vmInfo;
-}
-
-size_t largePageSize() noexcept {
- static std::atomic<size_t> largePageSize;
- static constexpr size_t kNotAvailable = 1;
-
- size_t size = largePageSize.load();
- if (ASMJIT_LIKELY(size > kNotAvailable))
- return size;
-
- if (size == kNotAvailable)
- return 0;
-
- size = detectLargePageSize();
- largePageSize.store(size != 0 ? size : kNotAvailable);
- return size;
-}
-
-// Virtual Memory - Hardened Runtime Info
-// ======================================
-
-HardenedRuntimeInfo hardenedRuntimeInfo() noexcept {
- return HardenedRuntimeInfo { getHardenedRuntimeFlags() };
-}
-
-// Virtual Memory - Project JIT Memory
-// ===================================
-
-void protectJitMemory(ProtectJitAccess access) noexcept {
-#if defined(ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP)
- pthread_jit_write_protect_np(static_cast<int>(access));
-#else
- DebugUtils::unused(access);
-#endif
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-// Virtual Memory - Tests
-// ======================
-
-#if defined(ASMJIT_TEST)
-ASMJIT_BEGIN_NAMESPACE
-
-UNIT(virt_mem) {
- VirtMem::Info vmInfo = VirtMem::info();
-
- INFO("VirtMem::info():");
- INFO(" pageSize: %zu", size_t(vmInfo.pageSize));
- INFO(" pageGranularity: %zu", size_t(vmInfo.pageGranularity));
-
- INFO("VirtMem::largePageSize():");
- INFO(" largePageSize: %zu", size_t(VirtMem::largePageSize()));
-
- VirtMem::HardenedRuntimeInfo hardenedRtInfo = VirtMem::hardenedRuntimeInfo();
- VirtMem::HardenedRuntimeFlags hardenedFlags = hardenedRtInfo.flags;
-
- INFO("VirtMem::hardenedRuntimeInfo():");
- INFO(" flags:");
- INFO(" kEnabled: %s" , Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kEnabled ) ? "true" : "false");
- INFO(" kMapJit: %s" , Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kMapJit ) ? "true" : "false");
- INFO(" kDualMapping: %s", Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kDualMapping) ? "true" : "false");
-}
-
-ASMJIT_END_NAMESPACE
-#endif // ASMJIT_TEST
-
-#endif // !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/src/asmjit/core/zone.cpp b/3rdparty/asmjit/src/asmjit/core/zone.cpp
deleted file mode 100644
index e1948ebb0c9..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zone.cpp
+++ /dev/null
@@ -1,353 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/support.h"
-#include "../core/zone.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// Zone - Globals
-// ==============
-
-// Zero size block used by `Zone` that doesn't have any memory allocated. Should be allocated in read-only memory
-// and should never be modified.
-const Zone::Block Zone::_zeroBlock = { nullptr, nullptr, 0 };
-
-// Zone - Initialization & Reset
-// =============================
-
-void Zone::_init(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept {
- ASMJIT_ASSERT(blockSize >= kMinBlockSize);
- ASMJIT_ASSERT(blockSize <= kMaxBlockSize);
- ASMJIT_ASSERT(blockAlignment <= 64);
-
- // Just to make the compiler happy...
- constexpr size_t kBlockSizeMask = (Support::allOnes<size_t>() >> 4);
- constexpr size_t kBlockAlignmentShiftMask = 0x7u;
-
- _assignZeroBlock();
- _blockSize = blockSize & kBlockSizeMask;
- _isTemporary = temporary != nullptr;
- _blockAlignmentShift = Support::ctz(blockAlignment) & kBlockAlignmentShiftMask;
-
- // Setup the first [temporary] block, if necessary.
- if (temporary) {
- Block* block = temporary->data<Block>();
- block->prev = nullptr;
- block->next = nullptr;
-
- ASMJIT_ASSERT(temporary->size() >= kBlockSize);
- block->size = temporary->size() - kBlockSize;
-
- _assignBlock(block);
- }
-}
-
-void Zone::reset(ResetPolicy resetPolicy) noexcept {
- Block* cur = _block;
-
- // Can't be altered.
- if (cur == &_zeroBlock)
- return;
-
- if (resetPolicy == ResetPolicy::kHard) {
- Block* initial = const_cast<Zone::Block*>(&_zeroBlock);
- _ptr = initial->data();
- _end = initial->data();
- _block = initial;
-
- // Since cur can be in the middle of the double-linked list, we have to traverse both directions (`prev` and
- // `next`) separately to visit all.
- Block* next = cur->next;
- do {
- Block* prev = cur->prev;
-
- // If this is the first block and this ZoneTmp is temporary then the first block is statically allocated.
- // We cannot free it and it makes sense to keep it even when this is hard reset.
- if (prev == nullptr && _isTemporary) {
- cur->prev = nullptr;
- cur->next = nullptr;
- _assignBlock(cur);
- break;
- }
-
- ::free(cur);
- cur = prev;
- } while (cur);
-
- cur = next;
- while (cur) {
- next = cur->next;
- ::free(cur);
- cur = next;
- }
- }
- else {
- while (cur->prev)
- cur = cur->prev;
- _assignBlock(cur);
- }
-}
-
-// Zone - Alloc
-// ============
-
-void* Zone::_alloc(size_t size, size_t alignment) noexcept {
- Block* curBlock = _block;
- Block* next = curBlock->next;
-
- size_t rawBlockAlignment = blockAlignment();
- size_t minimumAlignment = Support::max<size_t>(alignment, rawBlockAlignment);
-
- // If the `Zone` has been cleared the current block doesn't have to be the last one. Check if there is a block
- // that can be used instead of allocating a new one. If there is a `next` block it's completely unused, we don't
- // have to check for remaining bytes in that case.
- if (next) {
- uint8_t* ptr = Support::alignUp(next->data(), minimumAlignment);
- uint8_t* end = Support::alignDown(next->data() + next->size, rawBlockAlignment);
-
- if (size <= (size_t)(end - ptr)) {
- _block = next;
- _ptr = ptr + size;
- _end = Support::alignDown(next->data() + next->size, rawBlockAlignment);
- return static_cast<void*>(ptr);
- }
- }
-
- size_t blockAlignmentOverhead = alignment - Support::min<size_t>(alignment, Globals::kAllocAlignment);
- size_t newSize = Support::max(blockSize(), size);
-
- // Prevent arithmetic overflow.
- if (ASMJIT_UNLIKELY(newSize > SIZE_MAX - kBlockSize - blockAlignmentOverhead))
- return nullptr;
-
- // Allocate new block - we add alignment overhead to `newSize`, which becomes the new block size, and we also add
- // `kBlockOverhead` to the allocator as it includes members of `Zone::Block` structure.
- newSize += blockAlignmentOverhead;
- Block* newBlock = static_cast<Block*>(::malloc(newSize + kBlockSize));
-
- if (ASMJIT_UNLIKELY(!newBlock))
- return nullptr;
-
- // Align the pointer to `minimumAlignment` and adjust the size of this block accordingly. It's the same as using
- // `minimumAlignment - Support::alignUpDiff()`, just written differently.
- {
- newBlock->prev = nullptr;
- newBlock->next = nullptr;
- newBlock->size = newSize;
-
- if (curBlock != &_zeroBlock) {
- newBlock->prev = curBlock;
- curBlock->next = newBlock;
-
- // Does only happen if there is a next block, but the requested memory can't fit into it. In this case a new
- // buffer is allocated and inserted between the current block and the next one.
- if (next) {
- newBlock->next = next;
- next->prev = newBlock;
- }
- }
-
- uint8_t* ptr = Support::alignUp(newBlock->data(), minimumAlignment);
- uint8_t* end = Support::alignDown(newBlock->data() + newSize, rawBlockAlignment);
-
- _ptr = ptr + size;
- _end = end;
- _block = newBlock;
-
- ASMJIT_ASSERT(_ptr <= _end);
- return static_cast<void*>(ptr);
- }
-}
-
-void* Zone::allocZeroed(size_t size, size_t alignment) noexcept {
- void* p = alloc(size, alignment);
- if (ASMJIT_UNLIKELY(!p))
- return p;
- return memset(p, 0, size);
-}
-
-void* Zone::dup(const void* data, size_t size, bool nullTerminate) noexcept {
- if (ASMJIT_UNLIKELY(!data || !size))
- return nullptr;
-
- ASMJIT_ASSERT(size != SIZE_MAX);
- uint8_t* m = allocT<uint8_t>(size + nullTerminate);
- if (ASMJIT_UNLIKELY(!m)) return nullptr;
-
- memcpy(m, data, size);
- if (nullTerminate) m[size] = '\0';
-
- return static_cast<void*>(m);
-}
-
-char* Zone::sformat(const char* fmt, ...) noexcept {
- if (ASMJIT_UNLIKELY(!fmt))
- return nullptr;
-
- char buf[512];
- size_t size;
- va_list ap;
-
- va_start(ap, fmt);
- size = unsigned(vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf) - 1, fmt, ap));
- va_end(ap);
-
- buf[size++] = 0;
- return static_cast<char*>(dup(buf, size));
-}
-
-// ZoneAllocator - Utilities
-// =========================
-
-#if defined(ASMJIT_BUILD_DEBUG)
-static bool ZoneAllocator_hasDynamicBlock(ZoneAllocator* self, ZoneAllocator::DynamicBlock* block) noexcept {
- ZoneAllocator::DynamicBlock* cur = self->_dynamicBlocks;
- while (cur) {
- if (cur == block)
- return true;
- cur = cur->next;
- }
- return false;
-}
-#endif
-
-// ZoneAllocator - Initialization & Reset
-// ======================================
-
-void ZoneAllocator::reset(Zone* zone) noexcept {
- // Free dynamic blocks.
- DynamicBlock* block = _dynamicBlocks;
- while (block) {
- DynamicBlock* next = block->next;
- ::free(block);
- block = next;
- }
-
- _zone = zone;
- memset(_slots, 0, sizeof(_slots));
- _dynamicBlocks = nullptr;
-}
-
-// asmjit::ZoneAllocator - Alloc & Release
-// =======================================
-
-void* ZoneAllocator::_alloc(size_t size, size_t& allocatedSize) noexcept {
- ASMJIT_ASSERT(isInitialized());
-
- // Use the memory pool only if the requested block has a reasonable size.
- uint32_t slot;
- if (_getSlotIndex(size, slot, allocatedSize)) {
- // Slot reuse.
- uint8_t* p = reinterpret_cast<uint8_t*>(_slots[slot]);
- size = allocatedSize;
-
- if (p) {
- _slots[slot] = reinterpret_cast<Slot*>(p)->next;
- return p;
- }
-
- _zone->align(kBlockAlignment);
- p = _zone->ptr();
- size_t remain = (size_t)(_zone->end() - p);
-
- if (ASMJIT_LIKELY(remain >= size)) {
- _zone->setPtr(p + size);
- return p;
- }
- else {
- // Distribute the remaining memory to suitable slots, if possible.
- if (remain >= kLoGranularity) {
- do {
- size_t distSize = Support::min<size_t>(remain, kLoMaxSize);
- uint32_t distSlot = uint32_t((distSize - kLoGranularity) / kLoGranularity);
- ASMJIT_ASSERT(distSlot < kLoCount);
-
- reinterpret_cast<Slot*>(p)->next = _slots[distSlot];
- _slots[distSlot] = reinterpret_cast<Slot*>(p);
-
- p += distSize;
- remain -= distSize;
- } while (remain >= kLoGranularity);
- _zone->setPtr(p);
- }
-
- p = static_cast<uint8_t*>(_zone->_alloc(size, kBlockAlignment));
- if (ASMJIT_UNLIKELY(!p)) {
- allocatedSize = 0;
- return nullptr;
- }
-
- return p;
- }
- }
- else {
- // Allocate a dynamic block.
- size_t kBlockOverhead = sizeof(DynamicBlock) + sizeof(DynamicBlock*) + kBlockAlignment;
-
- // Handle a possible overflow.
- if (ASMJIT_UNLIKELY(kBlockOverhead >= SIZE_MAX - size))
- return nullptr;
-
- void* p = ::malloc(size + kBlockOverhead);
- if (ASMJIT_UNLIKELY(!p)) {
- allocatedSize = 0;
- return nullptr;
- }
-
- // Link as first in `_dynamicBlocks` double-linked list.
- DynamicBlock* block = static_cast<DynamicBlock*>(p);
- DynamicBlock* next = _dynamicBlocks;
-
- if (next)
- next->prev = block;
-
- block->prev = nullptr;
- block->next = next;
- _dynamicBlocks = block;
-
- // Align the pointer to the guaranteed alignment and store `DynamicBlock`
- // at the beginning of the memory block, so `_releaseDynamic()` can find it.
- p = Support::alignUp(static_cast<uint8_t*>(p) + sizeof(DynamicBlock) + sizeof(DynamicBlock*), kBlockAlignment);
- reinterpret_cast<DynamicBlock**>(p)[-1] = block;
-
- allocatedSize = size;
- return p;
- }
-}
-
-void* ZoneAllocator::_allocZeroed(size_t size, size_t& allocatedSize) noexcept {
- ASMJIT_ASSERT(isInitialized());
-
- void* p = _alloc(size, allocatedSize);
- if (ASMJIT_UNLIKELY(!p)) return p;
- return memset(p, 0, allocatedSize);
-}
-
-void ZoneAllocator::_releaseDynamic(void* p, size_t size) noexcept {
- DebugUtils::unused(size);
- ASMJIT_ASSERT(isInitialized());
-
- // Pointer to `DynamicBlock` is stored at [-1].
- DynamicBlock* block = reinterpret_cast<DynamicBlock**>(p)[-1];
- ASMJIT_ASSERT(ZoneAllocator_hasDynamicBlock(this, block));
-
- // Unlink and free.
- DynamicBlock* prev = block->prev;
- DynamicBlock* next = block->next;
-
- if (prev)
- prev->next = next;
- else
- _dynamicBlocks = next;
-
- if (next)
- next->prev = prev;
-
- ::free(block);
-}
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/zone.h b/3rdparty/asmjit/src/asmjit/core/zone.h
deleted file mode 100644
index b61a3d1292c..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zone.h
+++ /dev/null
@@ -1,611 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONE_H_INCLUDED
-#define ASMJIT_CORE_ZONE_H_INCLUDED
-
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! Zone memory.
-//!
-//! Zone is an incremental memory allocator that allocates memory by simply incrementing a pointer. It allocates
-//! blocks of memory by using C's `malloc()`, but divides these blocks into smaller segments requested by calling
-//! `Zone::alloc()` and friends.
-//!
-//! Zone has no function to release the allocated memory. It has to be released all at once by calling `reset()`.
-//! If you need a more friendly allocator that also supports `release()`, consider using `Zone` with `ZoneAllocator`.
-class Zone {
-public:
- ASMJIT_NONCOPYABLE(Zone)
-
- //! \cond INTERNAL
-
- //! A single block of memory managed by `Zone`.
- struct Block {
- inline uint8_t* data() const noexcept {
- return const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(this) + sizeof(*this));
- }
-
- //! Link to the previous block.
- Block* prev;
- //! Link to the next block.
- Block* next;
- //! Size of the block.
- size_t size;
- };
-
- enum Limits : size_t {
- kBlockSize = sizeof(Block),
- kBlockOverhead = Globals::kAllocOverhead + kBlockSize,
-
- kMinBlockSize = 64, // The number is ridiculously small, but still possible.
- kMaxBlockSize = size_t(1) << (sizeof(size_t) * 8 - 4 - 1),
- kMinAlignment = 1,
- kMaxAlignment = 64
- };
-
- //! Pointer in the current block.
- uint8_t* _ptr;
- //! End of the current block.
- uint8_t* _end;
- //! Current block.
- Block* _block;
-
- union {
- struct {
- //! Default block size.
- size_t _blockSize : Support::bitSizeOf<size_t>() - 4;
- //! First block is temporary (ZoneTmp).
- size_t _isTemporary : 1;
- //! Block alignment (1 << alignment).
- size_t _blockAlignmentShift : 3;
- };
- size_t _packedData;
- };
-
- static ASMJIT_API const Block _zeroBlock;
-
- //! \endcond
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new Zone.
- //!
- //! The `blockSize` parameter describes the default size of the block. If the `size` parameter passed to `alloc()`
- //! is greater than the default size `Zone` will allocate and use a larger block, but it will not change the
- //! default `blockSize`.
- //!
- //! It's not required, but it's good practice to set `blockSize` to a reasonable value that depends on the usage
- //! of `Zone`. Greater block sizes are generally safer and perform better than unreasonably low block sizes.
- ASMJIT_INLINE_NODEBUG explicit Zone(size_t blockSize, size_t blockAlignment = 1) noexcept {
- _init(blockSize, blockAlignment, nullptr);
- }
-
- //! Creates a new Zone with a first block pointing to a `temporary` memory.
- ASMJIT_INLINE_NODEBUG Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary& temporary) noexcept {
- _init(blockSize, blockAlignment, &temporary);
- }
-
- //! \overload
- ASMJIT_INLINE_NODEBUG Zone(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept {
- _init(blockSize, blockAlignment, temporary);
- }
-
- //! Moves an existing `Zone`.
- //!
- //! \note You cannot move an existing `ZoneTmp` as it uses embedded storage. Attempting to move `ZoneTmp` would
- //! result in assertion failure in debug mode and undefined behavior in release mode.
- inline Zone(Zone&& other) noexcept
- : _ptr(other._ptr),
- _end(other._end),
- _block(other._block),
- _packedData(other._packedData) {
- ASMJIT_ASSERT(!other.isTemporary());
- other._block = const_cast<Block*>(&_zeroBlock);
- other._ptr = other._block->data();
- other._end = other._block->data();
- }
-
- //! Destroys the `Zone` instance.
- //!
- //! This will destroy the `Zone` instance and release all blocks of memory allocated by it. It performs implicit
- //! `reset(ResetPolicy::kHard)`.
- ASMJIT_INLINE_NODEBUG ~Zone() noexcept { reset(ResetPolicy::kHard); }
-
- ASMJIT_API void _init(size_t blockSize, size_t blockAlignment, const Support::Temporary* temporary) noexcept;
-
- //! Resets the `Zone` invalidating all blocks allocated.
- //!
- //! See `Globals::ResetPolicy` for more details.
- ASMJIT_API void reset(ResetPolicy resetPolicy = ResetPolicy::kSoft) noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether this `Zone` is actually a `ZoneTmp` that uses temporary memory.
- ASMJIT_INLINE_NODEBUG bool isTemporary() const noexcept { return _isTemporary != 0; }
-
- //! Returns the default block size.
- ASMJIT_INLINE_NODEBUG size_t blockSize() const noexcept { return _blockSize; }
- //! Returns the default block alignment.
- ASMJIT_INLINE_NODEBUG size_t blockAlignment() const noexcept { return size_t(1) << _blockAlignmentShift; }
- //! Returns remaining size of the current block.
- ASMJIT_INLINE_NODEBUG size_t remainingSize() const noexcept { return (size_t)(_end - _ptr); }
-
- //! Returns the current zone cursor (dangerous).
- //!
- //! This is a function that can be used to get exclusive access to the current block's memory buffer.
- template<typename T = uint8_t>
- ASMJIT_INLINE_NODEBUG T* ptr() noexcept { return reinterpret_cast<T*>(_ptr); }
-
- //! Returns the end of the current zone block, only useful if you use `ptr()`.
- template<typename T = uint8_t>
- ASMJIT_INLINE_NODEBUG T* end() noexcept { return reinterpret_cast<T*>(_end); }
-
- //! Sets the current zone pointer to `ptr` (must be within the current block).
- template<typename T>
- inline void setPtr(T* ptr) noexcept {
- uint8_t* p = reinterpret_cast<uint8_t*>(ptr);
- ASMJIT_ASSERT(p >= _ptr && p <= _end);
- _ptr = p;
- }
-
- //! Sets the end zone pointer to `end` (must be within the current block).
- template<typename T>
- inline void setEnd(T* end) noexcept {
- uint8_t* p = reinterpret_cast<uint8_t*>(end);
- ASMJIT_ASSERT(p >= _ptr && p <= _end);
- _end = p;
- }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- inline void swap(Zone& other) noexcept {
- // This could lead to a disaster.
- ASMJIT_ASSERT(!this->isTemporary());
- ASMJIT_ASSERT(!other.isTemporary());
-
- std::swap(_ptr, other._ptr);
- std::swap(_end, other._end);
- std::swap(_block, other._block);
- std::swap(_packedData, other._packedData);
- }
-
- //! Aligns the current pointer to `alignment`.
- ASMJIT_INLINE_NODEBUG void align(size_t alignment) noexcept {
- _ptr = Support::min(Support::alignUp(_ptr, alignment), _end);
- }
-
- //! Ensures the remaining size is at least equal or greater than `size`.
- //!
- //! \note This function doesn't respect any alignment. If you need to ensure there is enough room for an aligned
- //! allocation you need to call `align()` before calling `ensure()`.
- ASMJIT_INLINE_NODEBUG Error ensure(size_t size) noexcept {
- if (size <= remainingSize())
- return kErrorOk;
- else
- return _alloc(0, 1) ? kErrorOk : DebugUtils::errored(kErrorOutOfMemory);
- }
-
- inline void _assignBlock(Block* block) noexcept {
- size_t alignment = blockAlignment();
- _ptr = Support::alignUp(block->data(), alignment);
- _end = Support::alignDown(block->data() + block->size, alignment);
- _block = block;
- }
-
- inline void _assignZeroBlock() noexcept {
- Block* block = const_cast<Block*>(&_zeroBlock);
- _ptr = block->data();
- _end = block->data();
- _block = block;
- }
-
- //! \}
-
- //! \name Allocation
- //! \{
-
- //! Allocates the requested memory specified by `size`.
- //!
- //! Pointer returned is valid until the `Zone` instance is destroyed or reset by calling `reset()`. If you plan to
- //! make an instance of C++ from the given pointer use placement `new` and `delete` operators:
- //!
- //! ```
- //! using namespace asmjit;
- //!
- //! class Object { ... };
- //!
- //! // Create Zone with default block size of approximately 65536 bytes.
- //! Zone zone(65536 - Zone::kBlockOverhead);
- //!
- //! // Create your objects using zone object allocating, for example:
- //! Object* obj = static_cast<Object*>( zone.alloc(sizeof(Object)) );
- //!
- //! if (!obj) {
- //! // Handle out of memory error.
- //! }
- //!
- //! // Placement `new` and `delete` operators can be used to instantiate it.
- //! new(obj) Object();
- //!
- //! // ... lifetime of your objects ...
- //!
- //! // To destroy the instance (if required).
- //! obj->~Object();
- //!
- //! // Reset or destroy `Zone`.
- //! zone.reset();
- //! ```
- inline void* alloc(size_t size) noexcept {
- if (ASMJIT_UNLIKELY(size > remainingSize()))
- return _alloc(size, 1);
-
- uint8_t* ptr = _ptr;
- _ptr += size;
- return static_cast<void*>(ptr);
- }
-
- //! Allocates the requested memory specified by `size` and `alignment`.
- inline void* alloc(size_t size, size_t alignment) noexcept {
- ASMJIT_ASSERT(Support::isPowerOf2(alignment));
- uint8_t* ptr = Support::alignUp(_ptr, alignment);
-
- if (ptr >= _end || size > (size_t)(_end - ptr))
- return _alloc(size, alignment);
-
- _ptr = ptr + size;
- return static_cast<void*>(ptr);
- }
-
- //! Allocates the requested memory specified by `size` without doing any checks.
- //!
- //! Can only be called if `remainingSize()` returns size at least equal to `size`.
- inline void* allocNoCheck(size_t size) noexcept {
- ASMJIT_ASSERT(remainingSize() >= size);
-
- uint8_t* ptr = _ptr;
- _ptr += size;
- return static_cast<void*>(ptr);
- }
-
- //! Allocates the requested memory specified by `size` and `alignment` without doing any checks.
- //!
- //! Performs the same operation as `Zone::allocNoCheck(size)` with `alignment` applied.
- inline void* allocNoCheck(size_t size, size_t alignment) noexcept {
- ASMJIT_ASSERT(Support::isPowerOf2(alignment));
-
- uint8_t* ptr = Support::alignUp(_ptr, alignment);
- ASMJIT_ASSERT(size <= (size_t)(_end - ptr));
-
- _ptr = ptr + size;
- return static_cast<void*>(ptr);
- }
-
- //! Allocates `size` bytes of zeroed memory. See `alloc()` for more details.
- ASMJIT_API void* allocZeroed(size_t size, size_t alignment = 1) noexcept;
-
- //! Like `alloc()`, but the return pointer is casted to `T*`.
- template<typename T>
- inline T* allocT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
- return static_cast<T*>(alloc(size, alignment));
- }
-
- //! Like `allocNoCheck()`, but the return pointer is casted to `T*`.
- template<typename T>
- inline T* allocNoCheckT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
- return static_cast<T*>(allocNoCheck(size, alignment));
- }
-
- //! Like `allocZeroed()`, but the return pointer is casted to `T*`.
- template<typename T>
- inline T* allocZeroedT(size_t size = sizeof(T), size_t alignment = alignof(T)) noexcept {
- return static_cast<T*>(allocZeroed(size, alignment));
- }
-
- //! Like `new(std::nothrow) T(...)`, but allocated by `Zone`.
- template<typename T>
- inline T* newT() noexcept {
- void* p = alloc(sizeof(T), alignof(T));
- if (ASMJIT_UNLIKELY(!p))
- return nullptr;
- return new(Support::PlacementNew{p}) T();
- }
-
- //! Like `new(std::nothrow) T(...)`, but allocated by `Zone`.
- template<typename T, typename... Args>
- inline T* newT(Args&&... args) noexcept {
- void* p = alloc(sizeof(T), alignof(T));
- if (ASMJIT_UNLIKELY(!p))
- return nullptr;
- return new(Support::PlacementNew{p}) T(std::forward<Args>(args)...);
- }
-
- //! \cond INTERNAL
- //!
- //! Internal alloc function used by other inlines.
- ASMJIT_API void* _alloc(size_t size, size_t alignment) noexcept;
- //! \endcond
-
- //! Helper to duplicate data.
- ASMJIT_API void* dup(const void* data, size_t size, bool nullTerminate = false) noexcept;
-
- //! Helper to duplicate data.
- inline void* dupAligned(const void* data, size_t size, size_t alignment, bool nullTerminate = false) noexcept {
- align(alignment);
- return dup(data, size, nullTerminate);
- }
-
- //! Helper to duplicate a formatted string, maximum size is 256 bytes.
- ASMJIT_API char* sformat(const char* str, ...) noexcept;
-
- //! \}
-};
-
-//! \ref Zone with `N` bytes of a static storage, used for the initial block.
-//!
-//! Temporary zones are used in cases where it's known that some memory will be required, but in many cases it won't
-//! exceed N bytes, so the whole operation can be performed without a dynamic memory allocation.
-template<size_t N>
-class ZoneTmp : public Zone {
-public:
- ASMJIT_NONCOPYABLE(ZoneTmp)
-
- //! Temporary storage, embedded after \ref Zone.
- struct Storage {
- char data[N];
- } _storage;
-
- //! Creates a temporary zone. Dynamic block size is specified by `blockSize`.
- inline explicit ZoneTmp(size_t blockSize, size_t blockAlignment = 1) noexcept
- : Zone(blockSize, blockAlignment, Support::Temporary(_storage.data, N)) {}
-};
-
-//! Zone-based memory allocator that uses an existing `Zone` and provides a `release()` functionality on top of it.
-//! It uses `Zone` only for chunks that can be pooled, and uses libc `malloc()` for chunks that are large.
-//!
-//! The advantage of ZoneAllocator is that it can allocate small chunks of memory really fast, and these chunks,
-//! when released, will be reused by consecutive calls to `alloc()`. Also, since ZoneAllocator uses `Zone`, you can
-//! turn any `Zone` into a `ZoneAllocator`, and use it in your `Pass` when necessary.
-//!
-//! ZoneAllocator is used by AsmJit containers to make containers having only few elements fast (and lightweight)
-//! and to allow them to grow and use dynamic blocks when require more storage.
-class ZoneAllocator {
-public:
- ASMJIT_NONCOPYABLE(ZoneAllocator)
-
- //! \cond INTERNAL
-
- // In short, we pool chunks of these sizes:
- // [32, 64, 96, 128, 192, 256, 320, 384, 448, 512]
-
- enum : uint32_t {
- //! How many bytes per a low granularity pool (has to be at least 16).
- kLoGranularity = 32,
- //! Number of slots of a low granularity pool.
- kLoCount = 4,
- //! Maximum size of a block that can be allocated in a low granularity pool.
- kLoMaxSize = kLoGranularity * kLoCount,
-
- //! How many bytes per a high granularity pool.
- kHiGranularity = 64,
- //! Number of slots of a high granularity pool.
- kHiCount = 6,
- //! Maximum size of a block that can be allocated in a high granularity pool.
- kHiMaxSize = kLoMaxSize + kHiGranularity * kHiCount,
-
- //! Alignment of every pointer returned by `alloc()`.
- kBlockAlignment = kLoGranularity
- };
-
- //! Single-linked list used to store unused chunks.
- struct Slot {
- //! Link to a next slot in a single-linked list.
- Slot* next;
- };
-
- //! A block of memory that has been allocated dynamically and is not part of block-list used by the allocator.
- //! This is used to keep track of all these blocks so they can be freed by `reset()` if not freed explicitly.
- struct DynamicBlock {
- DynamicBlock* prev;
- DynamicBlock* next;
- };
-
- //! \endcond
-
- //! \name Members
- //! \{
-
- //! Zone used to allocate memory that fits into slots.
- Zone* _zone {};
- //! Indexed slots containing released memory.
- Slot* _slots[kLoCount + kHiCount] {};
- //! Dynamic blocks for larger allocations (no slots).
- DynamicBlock* _dynamicBlocks {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new `ZoneAllocator`.
- //!
- //! \note To use it, you must first `init()` it.
- ASMJIT_INLINE_NODEBUG ZoneAllocator() noexcept {}
-
- //! Creates a new `ZoneAllocator` initialized to use `zone`.
- ASMJIT_INLINE_NODEBUG explicit ZoneAllocator(Zone* zone) noexcept
- : _zone(zone) {}
-
- //! Destroys the `ZoneAllocator`.
- ASMJIT_INLINE_NODEBUG ~ZoneAllocator() noexcept { reset(); }
-
- //! Tests whether the `ZoneAllocator` is initialized (i.e. has `Zone`).
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _zone != nullptr; }
-
- //! Convenience function to initialize the `ZoneAllocator` with `zone`.
- //!
- //! It's the same as calling `reset(zone)`.
- ASMJIT_INLINE_NODEBUG void init(Zone* zone) noexcept { reset(zone); }
-
- //! Resets this `ZoneAllocator` and also forget about the current `Zone` which is attached (if any). Reset
- //! optionally attaches a new `zone` passed, or keeps the `ZoneAllocator` in an uninitialized state, if
- //! `zone` is null.
- ASMJIT_API void reset(Zone* zone = nullptr) noexcept;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the assigned `Zone` of this allocator or null if this `ZoneAllocator` is not initialized.
- ASMJIT_INLINE_NODEBUG Zone* zone() const noexcept { return _zone; }
-
- //! \}
-
- //! \cond
- //! \name Internals
- //! \{
-
- //! Returns the slot index to be used for `size`. Returns `true` if a valid slot has been written to `slot` and
- //! `allocatedSize` has been filled with slot exact size (`allocatedSize` can be equal or slightly greater than
- //! `size`).
- static inline bool _getSlotIndex(size_t size, uint32_t& slot) noexcept {
- ASMJIT_ASSERT(size > 0);
- if (size > kHiMaxSize)
- return false;
-
- if (size <= kLoMaxSize)
- slot = uint32_t((size - 1) / kLoGranularity);
- else
- slot = uint32_t((size - kLoMaxSize - 1) / kHiGranularity) + kLoCount;
-
- return true;
- }
-
- //! \overload
- static inline bool _getSlotIndex(size_t size, uint32_t& slot, size_t& allocatedSize) noexcept {
- ASMJIT_ASSERT(size > 0);
- if (size > kHiMaxSize)
- return false;
-
- if (size <= kLoMaxSize) {
- slot = uint32_t((size - 1) / kLoGranularity);
- allocatedSize = Support::alignUp(size, kLoGranularity);
- }
- else {
- slot = uint32_t((size - kLoMaxSize - 1) / kHiGranularity) + kLoCount;
- allocatedSize = Support::alignUp(size, kHiGranularity);
- }
-
- return true;
- }
-
- //! \}
- //! \endcond
-
- //! \name Allocation
- //! \{
-
- //! \cond INTERNAL
- ASMJIT_API void* _alloc(size_t size, size_t& allocatedSize) noexcept;
- ASMJIT_API void* _allocZeroed(size_t size, size_t& allocatedSize) noexcept;
- ASMJIT_API void _releaseDynamic(void* p, size_t size) noexcept;
- //! \endcond
-
- //! Allocates `size` bytes of memory, ideally from an available pool.
- //!
- //! \note `size` can't be zero, it will assert in debug mode in such case.
- inline void* alloc(size_t size) noexcept {
- ASMJIT_ASSERT(isInitialized());
- size_t allocatedSize;
- return _alloc(size, allocatedSize);
- }
-
- //! Like `alloc(size)`, but provides a second argument `allocatedSize` that provides a way to know how big
- //! the block returned actually is. This is useful for containers to prevent growing too early.
- inline void* alloc(size_t size, size_t& allocatedSize) noexcept {
- ASMJIT_ASSERT(isInitialized());
- return _alloc(size, allocatedSize);
- }
-
- //! Like `alloc()`, but the return pointer is casted to `T*`.
- template<typename T>
- inline T* allocT(size_t size = sizeof(T)) noexcept {
- return static_cast<T*>(alloc(size));
- }
-
- //! Like `alloc(size)`, but returns zeroed memory.
- inline void* allocZeroed(size_t size) noexcept {
- ASMJIT_ASSERT(isInitialized());
- size_t allocatedSize;
- return _allocZeroed(size, allocatedSize);
- }
-
- //! Like `alloc(size, allocatedSize)`, but returns zeroed memory.
- inline void* allocZeroed(size_t size, size_t& allocatedSize) noexcept {
- ASMJIT_ASSERT(isInitialized());
- return _allocZeroed(size, allocatedSize);
- }
-
- //! Like `allocZeroed()`, but the return pointer is casted to `T*`.
- template<typename T>
- inline T* allocZeroedT(size_t size = sizeof(T)) noexcept {
- return static_cast<T*>(allocZeroed(size));
- }
-
- //! Like `new(std::nothrow) T(...)`, but allocated by `Zone`.
- template<typename T>
- inline T* newT() noexcept {
- void* p = allocT<T>();
- if (ASMJIT_UNLIKELY(!p))
- return nullptr;
- return new(Support::PlacementNew{p}) T();
- }
- //! Like `new(std::nothrow) T(...)`, but allocated by `Zone`.
- template<typename T, typename... Args>
- inline T* newT(Args&&... args) noexcept {
- void* p = allocT<T>();
- if (ASMJIT_UNLIKELY(!p))
- return nullptr;
- return new(Support::PlacementNew{p}) T(std::forward<Args>(args)...);
- }
-
- //! Releases the memory previously allocated by `alloc()`. The `size` argument has to be the same as used to call
- //! `alloc()` or `allocatedSize` returned by `alloc()`.
- inline void release(void* p, size_t size) noexcept {
- ASMJIT_ASSERT(isInitialized());
- ASMJIT_ASSERT(p != nullptr);
- ASMJIT_ASSERT(size != 0);
-
- uint32_t slot;
- if (_getSlotIndex(size, slot)) {
- static_cast<Slot*>(p)->next = static_cast<Slot*>(_slots[slot]);
- _slots[slot] = static_cast<Slot*>(p);
- }
- else {
- _releaseDynamic(p, size);
- }
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONE_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonehash.cpp b/3rdparty/asmjit/src/asmjit/core/zonehash.cpp
deleted file mode 100644
index 578b083680e..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonehash.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/support.h"
-#include "../core/zone.h"
-#include "../core/zonehash.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ZoneHashBase - Prime Numbers
-// ============================
-
-#define ASMJIT_POPULATE_PRIMES(ENTRY) \
- ENTRY(2 , 0x80000000, 32), /* [N * 0x80000000 >> 32] (rcp=2147483648) */ \
- ENTRY(11 , 0xBA2E8BA3, 35), /* [N * 0xBA2E8BA3 >> 35] (rcp=3123612579) */ \
- ENTRY(29 , 0x8D3DCB09, 36), /* [N * 0x8D3DCB09 >> 36] (rcp=2369637129) */ \
- ENTRY(41 , 0xC7CE0C7D, 37), /* [N * 0xC7CE0C7D >> 37] (rcp=3352169597) */ \
- ENTRY(59 , 0x8AD8F2FC, 37), /* [N * 0x8AD8F2FC >> 37] (rcp=2329473788) */ \
- ENTRY(83 , 0xC565C87C, 38), /* [N * 0xC565C87C >> 38] (rcp=3311782012) */ \
- ENTRY(131 , 0xFA232CF3, 39), /* [N * 0xFA232CF3 >> 39] (rcp=4196609267) */ \
- ENTRY(191 , 0xAB8F69E3, 39), /* [N * 0xAB8F69E3 >> 39] (rcp=2878302691) */ \
- ENTRY(269 , 0xF3A0D52D, 40), /* [N * 0xF3A0D52D >> 40] (rcp=4087403821) */ \
- ENTRY(383 , 0xAB1CBDD4, 40), /* [N * 0xAB1CBDD4 >> 40] (rcp=2870787540) */ \
- ENTRY(541 , 0xF246FACC, 41), /* [N * 0xF246FACC >> 41] (rcp=4064737996) */ \
- ENTRY(757 , 0xAD2589A4, 41), /* [N * 0xAD2589A4 >> 41] (rcp=2904918436) */ \
- ENTRY(1061 , 0xF7129426, 42), /* [N * 0xF7129426 >> 42] (rcp=4145189926) */ \
- ENTRY(1499 , 0xAEE116B7, 42), /* [N * 0xAEE116B7 >> 42] (rcp=2933986999) */ \
- ENTRY(2099 , 0xF9C7A737, 43), /* [N * 0xF9C7A737 >> 43] (rcp=4190611255) */ \
- ENTRY(2939 , 0xB263D25C, 43), /* [N * 0xB263D25C >> 43] (rcp=2992886364) */ \
- ENTRY(4111 , 0xFF10E02E, 44), /* [N * 0xFF10E02E >> 44] (rcp=4279296046) */ \
- ENTRY(5779 , 0xB5722823, 44), /* [N * 0xB5722823 >> 44] (rcp=3044157475) */ \
- ENTRY(8087 , 0x81A97405, 44), /* [N * 0x81A97405 >> 44] (rcp=2175366149) */ \
- ENTRY(11321 , 0xB93E91DB, 45), /* [N * 0xB93E91DB >> 45] (rcp=3107885531) */ \
- ENTRY(15859 , 0x843CC26B, 45), /* [N * 0x843CC26B >> 45] (rcp=2218574443) */ \
- ENTRY(22189 , 0xBD06B9EA, 46), /* [N * 0xBD06B9EA >> 46] (rcp=3171334634) */ \
- ENTRY(31051 , 0x8713F186, 46), /* [N * 0x8713F186 >> 46] (rcp=2266231174) */ \
- ENTRY(43451 , 0xC10F1CB9, 47), /* [N * 0xC10F1CB9 >> 47] (rcp=3238993081) */ \
- ENTRY(60869 , 0x89D06A86, 47), /* [N * 0x89D06A86 >> 47] (rcp=2312137350) */ \
- ENTRY(85159 , 0xC502AF3B, 48), /* [N * 0xC502AF3B >> 48] (rcp=3305287483) */ \
- ENTRY(102107 , 0xA44F65AE, 48), /* [N * 0xA44F65AE >> 48] (rcp=2756666798) */ \
- ENTRY(122449 , 0x89038F77, 48), /* [N * 0x89038F77 >> 48] (rcp=2298711927) */ \
- ENTRY(146819 , 0xE48AF7E9, 49), /* [N * 0xE48AF7E9 >> 49] (rcp=3834312681) */ \
- ENTRY(176041 , 0xBE9B145B, 49), /* [N * 0xBE9B145B >> 49] (rcp=3197834331) */ \
- ENTRY(211073 , 0x9EF882BA, 49), /* [N * 0x9EF882BA >> 49] (rcp=2667086522) */ \
- ENTRY(253081 , 0x849571AB, 49), /* [N * 0x849571AB >> 49] (rcp=2224386475) */ \
- ENTRY(303469 , 0xDD239C97, 50), /* [N * 0xDD239C97 >> 50] (rcp=3710098583) */ \
- ENTRY(363887 , 0xB86C196D, 50), /* [N * 0xB86C196D >> 50] (rcp=3094092141) */ \
- ENTRY(436307 , 0x99CFA4E9, 50), /* [N * 0x99CFA4E9 >> 50] (rcp=2580522217) */ \
- ENTRY(523177 , 0x804595C0, 50), /* [N * 0x804595C0 >> 50] (rcp=2152043968) */ \
- ENTRY(627293 , 0xD5F69FCF, 51), /* [N * 0xD5F69FCF >> 51] (rcp=3589709775) */ \
- ENTRY(752177 , 0xB27063BA, 51), /* [N * 0xB27063BA >> 51] (rcp=2993710010) */ \
- ENTRY(901891 , 0x94D170AC, 51), /* [N * 0x94D170AC >> 51] (rcp=2496753836) */ \
- ENTRY(1081369 , 0xF83C9767, 52), /* [N * 0xF83C9767 >> 52] (rcp=4164720487) */ \
- ENTRY(1296563 , 0xCF09435D, 52), /* [N * 0xCF09435D >> 52] (rcp=3473490781) */ \
- ENTRY(1554583 , 0xACAC7198, 52), /* [N * 0xACAC7198 >> 52] (rcp=2896982424) */ \
- ENTRY(1863971 , 0x90033EE3, 52), /* [N * 0x90033EE3 >> 52] (rcp=2416131811) */ \
- ENTRY(2234923 , 0xF0380EBD, 53), /* [N * 0xF0380EBD >> 53] (rcp=4030205629) */ \
- ENTRY(2679673 , 0xC859731E, 53), /* [N * 0xC859731E >> 53] (rcp=3361305374) */ \
- ENTRY(3212927 , 0xA718DE27, 53), /* [N * 0xA718DE27 >> 53] (rcp=2803424807) */ \
- ENTRY(3852301 , 0x8B5D1B4B, 53), /* [N * 0x8B5D1B4B >> 53] (rcp=2338134859) */ \
- ENTRY(4618921 , 0xE8774804, 54), /* [N * 0xE8774804 >> 54] (rcp=3900131332) */ \
- ENTRY(5076199 , 0xD386574E, 54), /* [N * 0xD386574E >> 54] (rcp=3548796750) */ \
- ENTRY(5578757 , 0xC0783FE1, 54), /* [N * 0xC0783FE1 >> 54] (rcp=3229106145) */ \
- ENTRY(6131057 , 0xAF21B08F, 54), /* [N * 0xAF21B08F >> 54] (rcp=2938220687) */ \
- ENTRY(6738031 , 0x9F5AFD6E, 54), /* [N * 0x9F5AFD6E >> 54] (rcp=2673540462) */ \
- ENTRY(7405163 , 0x90FFC3B9, 54), /* [N * 0x90FFC3B9 >> 54] (rcp=2432680889) */ \
- ENTRY(8138279 , 0x83EFECFC, 54), /* [N * 0x83EFECFC >> 54] (rcp=2213539068) */ \
- ENTRY(8943971 , 0xF01AA2EF, 55), /* [N * 0xF01AA2EF >> 55] (rcp=4028277487) */ \
- ENTRY(9829447 , 0xDA7979B2, 55), /* [N * 0xDA7979B2 >> 55] (rcp=3665394098) */ \
- ENTRY(10802581 , 0xC6CB2771, 55), /* [N * 0xC6CB2771 >> 55] (rcp=3335202673) */ \
- ENTRY(11872037 , 0xB4E2C7DD, 55), /* [N * 0xB4E2C7DD >> 55] (rcp=3034761181) */ \
- ENTRY(13047407 , 0xA4974124, 55), /* [N * 0xA4974124 >> 55] (rcp=2761376036) */ \
- ENTRY(14339107 , 0x95C39CF1, 55), /* [N * 0x95C39CF1 >> 55] (rcp=2512624881) */ \
- ENTRY(15758737 , 0x8845C763, 55), /* [N * 0x8845C763 >> 55] (rcp=2286274403) */ \
- ENTRY(17318867 , 0xF7FE593F, 56), /* [N * 0xF7FE593F >> 56] (rcp=4160641343) */ \
- ENTRY(19033439 , 0xE1A75D93, 56), /* [N * 0xE1A75D93 >> 56] (rcp=3785842067) */ \
- ENTRY(20917763 , 0xCD5389B3, 56), /* [N * 0xCD5389B3 >> 56] (rcp=3444804019) */ \
- ENTRY(22988621 , 0xBAD4841A, 56), /* [N * 0xBAD4841A >> 56] (rcp=3134489626) */ \
- ENTRY(25264543 , 0xA9FFF2FF, 56), /* [N * 0xA9FFF2FF >> 56] (rcp=2852123391) */ \
- ENTRY(27765763 , 0x9AAF8BF3, 56), /* [N * 0x9AAF8BF3 >> 56] (rcp=2595195891) */ \
- ENTRY(30514607 , 0x8CC04E18, 56), /* [N * 0x8CC04E18 >> 56] (rcp=2361413144) */ \
- ENTRY(33535561 , 0x80127068, 56), /* [N * 0x80127068 >> 56] (rcp=2148692072) */ \
- ENTRY(36855587 , 0xE911F0BB, 57), /* [N * 0xE911F0BB >> 57] (rcp=3910267067) */ \
- ENTRY(38661533 , 0xDE2ED7BE, 57), /* [N * 0xDE2ED7BE >> 57] (rcp=3727611838) */ \
- ENTRY(40555961 , 0xD3CDF2FD, 57), /* [N * 0xD3CDF2FD >> 57] (rcp=3553489661) */ \
- ENTRY(42543269 , 0xC9E9196C, 57), /* [N * 0xC9E9196C >> 57] (rcp=3387496812) */ \
- ENTRY(44627909 , 0xC07A9EB6, 57), /* [N * 0xC07A9EB6 >> 57] (rcp=3229261494) */ \
- ENTRY(46814687 , 0xB77CEF65, 57), /* [N * 0xB77CEF65 >> 57] (rcp=3078418277) */ \
- ENTRY(49108607 , 0xAEEAC65C, 57), /* [N * 0xAEEAC65C >> 57] (rcp=2934621788) */ \
- ENTRY(51514987 , 0xA6BF0EF0, 57), /* [N * 0xA6BF0EF0 >> 57] (rcp=2797539056) */ \
- ENTRY(54039263 , 0x9EF510B5, 57), /* [N * 0x9EF510B5 >> 57] (rcp=2666860725) */ \
- ENTRY(56687207 , 0x97883B42, 57), /* [N * 0x97883B42 >> 57] (rcp=2542287682) */ \
- ENTRY(59464897 , 0x907430ED, 57), /* [N * 0x907430ED >> 57] (rcp=2423533805) */ \
- ENTRY(62378699 , 0x89B4CA91, 57), /* [N * 0x89B4CA91 >> 57] (rcp=2310326929) */ \
- ENTRY(65435273 , 0x83461568, 57), /* [N * 0x83461568 >> 57] (rcp=2202408296) */ \
- ENTRY(68641607 , 0xFA489AA8, 58), /* [N * 0xFA489AA8 >> 58] (rcp=4199062184) */ \
- ENTRY(72005051 , 0xEE97B1C5, 58), /* [N * 0xEE97B1C5 >> 58] (rcp=4002918853) */ \
- ENTRY(75533323 , 0xE3729293, 58), /* [N * 0xE3729293 >> 58] (rcp=3815936659) */ \
- ENTRY(79234469 , 0xD8D2BBA3, 58), /* [N * 0xD8D2BBA3 >> 58] (rcp=3637689251) */ \
- ENTRY(83116967 , 0xCEB1F196, 58), /* [N * 0xCEB1F196 >> 58] (rcp=3467768214) */ \
- ENTRY(87189709 , 0xC50A4426, 58), /* [N * 0xC50A4426 >> 58] (rcp=3305784358) */ \
- ENTRY(91462061 , 0xBBD6052B, 58), /* [N * 0xBBD6052B >> 58] (rcp=3151365419) */ \
- ENTRY(95943737 , 0xB30FD999, 58), /* [N * 0xB30FD999 >> 58] (rcp=3004160409) */ \
- ENTRY(100644991 , 0xAAB29CED, 58), /* [N * 0xAAB29CED >> 58] (rcp=2863832301) */ \
- ENTRY(105576619 , 0xA2B96421, 58), /* [N * 0xA2B96421 >> 58] (rcp=2730058785) */ \
- ENTRY(110749901 , 0x9B1F8434, 58), /* [N * 0x9B1F8434 >> 58] (rcp=2602533940) */ \
- ENTRY(116176651 , 0x93E08B4A, 58), /* [N * 0x93E08B4A >> 58] (rcp=2480966474) */ \
- ENTRY(121869317 , 0x8CF837E0, 58), /* [N * 0x8CF837E0 >> 58] (rcp=2365077472) */ \
- ENTRY(127840913 , 0x86627F01, 58), /* [N * 0x86627F01 >> 58] (rcp=2254601985) */ \
- ENTRY(134105159 , 0x801B8178, 58), /* [N * 0x801B8178 >> 58] (rcp=2149286264) */ \
- ENTRY(140676353 , 0xF43F294F, 59), /* [N * 0xF43F294F >> 59] (rcp=4097780047) */ \
- ENTRY(147569509 , 0xE8D67089, 59), /* [N * 0xE8D67089 >> 59] (rcp=3906367625) */ \
- ENTRY(154800449 , 0xDDF6243C, 59), /* [N * 0xDDF6243C >> 59] (rcp=3723895868) */ \
- ENTRY(162385709 , 0xD397E6AE, 59), /* [N * 0xD397E6AE >> 59] (rcp=3549947566) */ \
- ENTRY(170342629 , 0xC9B5A65A, 59), /* [N * 0xC9B5A65A >> 59] (rcp=3384125018) */ \
- ENTRY(178689419 , 0xC0499865, 59), /* [N * 0xC0499865 >> 59] (rcp=3226048613) */ \
- ENTRY(187445201 , 0xB74E35FA, 59), /* [N * 0xB74E35FA >> 59] (rcp=3075356154) */ \
- ENTRY(196630033 , 0xAEBE3AC1, 59), /* [N * 0xAEBE3AC1 >> 59] (rcp=2931702465) */ \
- ENTRY(206264921 , 0xA694A37F, 59), /* [N * 0xA694A37F >> 59] (rcp=2794759039) */ \
- ENTRY(216371963 , 0x9ECCA59F, 59), /* [N * 0x9ECCA59F >> 59] (rcp=2664211871) */ \
- ENTRY(226974197 , 0x9761B6AE, 59), /* [N * 0x9761B6AE >> 59] (rcp=2539763374) */ \
- ENTRY(238095983 , 0x904F79A1, 59), /* [N * 0x904F79A1 >> 59] (rcp=2421127585) */ \
- ENTRY(249762697 , 0x8991CD1F, 59), /* [N * 0x8991CD1F >> 59] (rcp=2308033823) */ \
- ENTRY(262001071 , 0x8324BCA5, 59), /* [N * 0x8324BCA5 >> 59] (rcp=2200222885) */ \
- ENTRY(274839137 , 0xFA090732, 60), /* [N * 0xFA090732 >> 60] (rcp=4194895666) */ \
- ENTRY(288306269 , 0xEE5B16ED, 60), /* [N * 0xEE5B16ED >> 60] (rcp=3998947053) */ \
- ENTRY(302433337 , 0xE338CE49, 60), /* [N * 0xE338CE49 >> 60] (rcp=3812150857) */ \
- ENTRY(317252587 , 0xD89BABC0, 60), /* [N * 0xD89BABC0 >> 60] (rcp=3634080704) */ \
- ENTRY(374358107 , 0xB790EF43, 60), /* [N * 0xB790EF43 >> 60] (rcp=3079728963) */ \
- ENTRY(441742621 , 0x9B908414, 60), /* [N * 0x9B908414 >> 60] (rcp=2609939476) */ \
- ENTRY(521256293 , 0x83D596FA, 60), /* [N * 0x83D596FA >> 60] (rcp=2211813114) */ \
- ENTRY(615082441 , 0xDF72B16E, 61), /* [N * 0xDF72B16E >> 61] (rcp=3748835694) */ \
- ENTRY(725797313 , 0xBD5CDB3B, 61), /* [N * 0xBD5CDB3B >> 61] (rcp=3176979259) */ \
- ENTRY(856440829 , 0xA07A14E9, 61), /* [N * 0xA07A14E9 >> 61] (rcp=2692355305) */ \
- ENTRY(1010600209, 0x87FF5289, 61), /* [N * 0x87FF5289 >> 61] (rcp=2281656969) */ \
- ENTRY(1192508257, 0xE6810540, 62), /* [N * 0xE6810540 >> 62] (rcp=3867215168) */ \
- ENTRY(1407159797, 0xC357A480, 62), /* [N * 0xC357A480 >> 62] (rcp=3277300864) */ \
- ENTRY(1660448617, 0xA58B5B4F, 62), /* [N * 0xA58B5B4F >> 62] (rcp=2777373519) */ \
- ENTRY(1959329399, 0x8C4AB55F, 62), /* [N * 0x8C4AB55F >> 62] (rcp=2353706335) */ \
- ENTRY(2312008693, 0xEDC86320, 63), /* [N * 0xEDC86320 >> 63] (rcp=3989332768) */ \
- ENTRY(2728170257, 0xC982C4D2, 63), /* [N * 0xC982C4D2 >> 63] (rcp=3380790482) */ \
- ENTRY(3219240923, 0xAAC599B6, 63) /* [N * 0xAAC599B6 >> 63] (rcp=2865076662) */
-
-
-struct HashPrime {
- //! Prime number
- uint32_t prime;
- //! Reciprocal to turn division into multiplication.
- uint32_t rcp;
-};
-
-static const HashPrime ZoneHash_primeArray[] = {
- #define E(PRIME, RCP, SHIFT) { PRIME, RCP }
- ASMJIT_POPULATE_PRIMES(E)
- #undef E
-};
-
-static const uint8_t ZoneHash_primeShift[] = {
- #define E(PRIME, RCP, SHIFT) uint8_t(SHIFT)
- ASMJIT_POPULATE_PRIMES(E)
- #undef E
-};
-
-// ZoneHashBase - Rehash
-// =====================
-
-void ZoneHashBase::_rehash(ZoneAllocator* allocator, uint32_t primeIndex) noexcept {
- ASMJIT_ASSERT(primeIndex < ASMJIT_ARRAY_SIZE(ZoneHash_primeArray));
- uint32_t newCount = ZoneHash_primeArray[primeIndex].prime;
-
- ZoneHashNode** oldData = _data;
- ZoneHashNode** newData = reinterpret_cast<ZoneHashNode**>(
- allocator->allocZeroed(size_t(newCount) * sizeof(ZoneHashNode*)));
-
- // We can still store nodes into the table, but it will degrade.
- if (ASMJIT_UNLIKELY(newData == nullptr))
- return;
-
- uint32_t i;
- uint32_t oldCount = _bucketsCount;
-
- _data = newData;
- _bucketsCount = newCount;
- _bucketsGrow = uint32_t(newCount * 0.9);
- _rcpValue = ZoneHash_primeArray[primeIndex].rcp;
- _rcpShift = ZoneHash_primeShift[primeIndex];
- _primeIndex = uint8_t(primeIndex);
-
- for (i = 0; i < oldCount; i++) {
- ZoneHashNode* node = oldData[i];
- while (node) {
- ZoneHashNode* next = node->_hashNext;
- uint32_t hashMod = _calcMod(node->_hashCode);
-
- node->_hashNext = newData[hashMod];
- newData[hashMod] = node;
- node = next;
- }
- }
-
- if (oldData != _embedded)
- allocator->release(oldData, oldCount * sizeof(ZoneHashNode*));
-}
-
-// ZoneHashBase - Operations
-// =========================
-
-ZoneHashNode* ZoneHashBase::_insert(ZoneAllocator* allocator, ZoneHashNode* node) noexcept {
- uint32_t hashMod = _calcMod(node->_hashCode);
- ZoneHashNode* next = _data[hashMod];
-
- node->_hashNext = next;
- _data[hashMod] = node;
-
- if (++_size > _bucketsGrow) {
- uint32_t primeIndex = Support::min<uint32_t>(_primeIndex + 2, ASMJIT_ARRAY_SIZE(ZoneHash_primeArray) - 1);
- if (primeIndex > _primeIndex)
- _rehash(allocator, primeIndex);
- }
-
- return node;
-}
-
-ZoneHashNode* ZoneHashBase::_remove(ZoneAllocator* allocator, ZoneHashNode* node) noexcept {
- DebugUtils::unused(allocator);
- uint32_t hashMod = _calcMod(node->_hashCode);
-
- ZoneHashNode** pPrev = &_data[hashMod];
- ZoneHashNode* p = *pPrev;
-
- while (p) {
- if (p == node) {
- *pPrev = p->_hashNext;
- _size--;
- return node;
- }
-
- pPrev = &p->_hashNext;
- p = *pPrev;
- }
-
- return nullptr;
-}
-
-// ZoneHashBase - Tests
-// ====================
-
-#if defined(ASMJIT_TEST)
-struct MyHashNode : public ZoneHashNode {
- inline MyHashNode(uint32_t key) noexcept
- : ZoneHashNode(key),
- _key(key) {}
-
- uint32_t _key;
-};
-
-struct MyKeyMatcher {
- inline MyKeyMatcher(uint32_t key) noexcept
- : _key(key) {}
-
- inline uint32_t hashCode() const noexcept { return _key; }
- inline bool matches(const MyHashNode* node) const noexcept { return node->_key == _key; }
-
- uint32_t _key;
-};
-
-UNIT(zone_hash) {
- uint32_t kCount = BrokenAPI::hasArg("--quick") ? 1000 : 10000;
-
- Zone zone(4096);
- ZoneAllocator allocator(&zone);
-
- ZoneHash<MyHashNode> hashTable;
-
- uint32_t key;
- INFO("Inserting %u elements to HashTable", unsigned(kCount));
- for (key = 0; key < kCount; key++) {
- hashTable.insert(&allocator, zone.newT<MyHashNode>(key));
- }
-
- uint32_t count = kCount;
- INFO("Removing %u elements from HashTable and validating each operation", unsigned(kCount));
- do {
- MyHashNode* node;
-
- for (key = 0; key < count; key++) {
- node = hashTable.get(MyKeyMatcher(key));
- EXPECT_NOT_NULL(node);
- EXPECT_EQ(node->_key, key);
- }
-
- {
- count--;
- node = hashTable.get(MyKeyMatcher(count));
- hashTable.remove(&allocator, node);
-
- node = hashTable.get(MyKeyMatcher(count));
- EXPECT_NULL(node);
- }
- } while (count);
-
- EXPECT_TRUE(hashTable.empty());
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/zonehash.h b/3rdparty/asmjit/src/asmjit/core/zonehash.h
deleted file mode 100644
index d6cd2e31cb9..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonehash.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONEHASH_H_INCLUDED
-#define ASMJIT_CORE_ZONEHASH_H_INCLUDED
-
-#include "../core/zone.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! Node used by \ref ZoneHash template.
-//!
-//! You must provide function `bool eq(const Key& key)` in order to make `ZoneHash::get()` working.
-class ZoneHashNode {
-public:
- ASMJIT_NONCOPYABLE(ZoneHashNode)
-
- inline ZoneHashNode(uint32_t hashCode = 0) noexcept
- : _hashNext(nullptr),
- _hashCode(hashCode),
- _customData(0) {}
-
- //! Next node in the chain, null if it terminates the chain.
- ZoneHashNode* _hashNext;
- //! Precalculated hash-code of key.
- uint32_t _hashCode;
- //! Padding, can be reused by any Node that inherits `ZoneHashNode`.
- uint32_t _customData;
-};
-
-//! Base class used by \ref ZoneHash template
-class ZoneHashBase {
-public:
- ASMJIT_NONCOPYABLE(ZoneHashBase)
-
- //! Buckets data.
- ZoneHashNode** _data;
- //! Count of records inserted into the hash table.
- size_t _size;
- //! Count of hash buckets.
- uint32_t _bucketsCount;
- //! When buckets array should grow (only checked after insertion).
- uint32_t _bucketsGrow;
- //! Reciprocal value of `_bucketsCount`.
- uint32_t _rcpValue;
- //! How many bits to shift right when hash is multiplied with `_rcpValue`.
- uint8_t _rcpShift;
- //! Prime value index in internal prime array.
- uint8_t _primeIndex;
-
- //! Embedded data, used by empty hash tables.
- ZoneHashNode* _embedded[1];
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneHashBase() noexcept {
- reset();
- }
-
- inline ZoneHashBase(ZoneHashBase&& other) noexcept {
- _data = other._data;
- _size = other._size;
- _bucketsCount = other._bucketsCount;
- _bucketsGrow = other._bucketsGrow;
- _rcpValue = other._rcpValue;
- _rcpShift = other._rcpShift;
- _primeIndex = other._primeIndex;
- _embedded[0] = other._embedded[0];
-
- if (_data == other._embedded) _data = _embedded;
- }
-
- inline void reset() noexcept {
- _data = _embedded;
- _size = 0;
- _bucketsCount = 1;
- _bucketsGrow = 1;
- _rcpValue = 1;
- _rcpShift = 0;
- _primeIndex = 0;
- _embedded[0] = nullptr;
- }
-
- inline void release(ZoneAllocator* allocator) noexcept {
- ZoneHashNode** oldData = _data;
- if (oldData != _embedded)
- allocator->release(oldData, _bucketsCount * sizeof(ZoneHashNode*));
- reset();
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; }
- ASMJIT_INLINE_NODEBUG size_t size() const noexcept { return _size; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- inline void _swap(ZoneHashBase& other) noexcept {
- std::swap(_data, other._data);
- std::swap(_size, other._size);
- std::swap(_bucketsCount, other._bucketsCount);
- std::swap(_bucketsGrow, other._bucketsGrow);
- std::swap(_rcpValue, other._rcpValue);
- std::swap(_rcpShift, other._rcpShift);
- std::swap(_primeIndex, other._primeIndex);
- std::swap(_embedded[0], other._embedded[0]);
-
- if (_data == other._embedded) _data = _embedded;
- if (other._data == _embedded) other._data = other._embedded;
- }
-
- //! \cond INTERNAL
- inline uint32_t _calcMod(uint32_t hash) const noexcept {
- uint32_t x = uint32_t((uint64_t(hash) * _rcpValue) >> _rcpShift);
- return hash - x * _bucketsCount;
- }
-
- ASMJIT_API void _rehash(ZoneAllocator* allocator, uint32_t newCount) noexcept;
- ASMJIT_API ZoneHashNode* _insert(ZoneAllocator* allocator, ZoneHashNode* node) noexcept;
- ASMJIT_API ZoneHashNode* _remove(ZoneAllocator* allocator, ZoneHashNode* node) noexcept;
- //! \endcond
-
- //! \}
-};
-
-//! Low-level hash table specialized for storing string keys and POD values.
-//!
-//! This hash table allows duplicates to be inserted (the API is so low level that it's up to you if you allow it or
-//! not, as you should first `get()` the node and then modify it or insert a new node by using `insert()`, depending
-//! on the intention).
-template<typename NodeT>
-class ZoneHash : public ZoneHashBase {
-public:
- ASMJIT_NONCOPYABLE(ZoneHash)
-
- typedef NodeT Node;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneHash() noexcept
- : ZoneHashBase() {}
-
- ASMJIT_INLINE_NODEBUG ZoneHash(ZoneHash&& other) noexcept
- : ZoneHash(other) {}
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_INLINE_NODEBUG void swap(ZoneHash& other) noexcept { ZoneHashBase::_swap(other); }
-
- template<typename KeyT>
- inline NodeT* get(const KeyT& key) const noexcept {
- uint32_t hashMod = _calcMod(key.hashCode());
- NodeT* node = static_cast<NodeT*>(_data[hashMod]);
-
- while (node && !key.matches(node))
- node = static_cast<NodeT*>(node->_hashNext);
- return node;
- }
-
- ASMJIT_INLINE_NODEBUG NodeT* insert(ZoneAllocator* allocator, NodeT* node) noexcept { return static_cast<NodeT*>(_insert(allocator, node)); }
- ASMJIT_INLINE_NODEBUG NodeT* remove(ZoneAllocator* allocator, NodeT* node) noexcept { return static_cast<NodeT*>(_remove(allocator, node)); }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONEHASH_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonelist.cpp b/3rdparty/asmjit/src/asmjit/core/zonelist.cpp
deleted file mode 100644
index ff2c2cf1540..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonelist.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/zone.h"
-#include "../core/zonelist.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ZoneList - Tests
-// ================
-
-#if defined(ASMJIT_TEST)
-class MyListNode : public ZoneListNode<MyListNode> {};
-
-UNIT(zone_list) {
- Zone zone(4096);
- ZoneList<MyListNode> list;
-
- MyListNode* a = zone.newT<MyListNode>();
- MyListNode* b = zone.newT<MyListNode>();
- MyListNode* c = zone.newT<MyListNode>();
- MyListNode* d = zone.newT<MyListNode>();
-
- INFO("Append / Unlink");
-
- // []
- EXPECT_TRUE(list.empty());
-
- // [A]
- list.append(a);
- EXPECT_FALSE(list.empty());
- EXPECT_EQ(list.first(), a);
- EXPECT_EQ(list.last(), a);
- EXPECT_NULL(a->prev());
- EXPECT_NULL(a->next());
-
- // [A, B]
- list.append(b);
- EXPECT_EQ(list.first(), a);
- EXPECT_EQ(list.last(), b);
- EXPECT_NULL(a->prev());
- EXPECT_EQ(a->next(), b);
- EXPECT_EQ(b->prev(), a);
- EXPECT_NULL(b->next());
-
- // [A, B, C]
- list.append(c);
- EXPECT_EQ(list.first(), a);
- EXPECT_EQ(list.last(), c);
- EXPECT_NULL(a->prev());
- EXPECT_EQ(a->next(), b);
- EXPECT_EQ(b->prev(), a);
- EXPECT_EQ(b->next(), c);
- EXPECT_EQ(c->prev(), b);
- EXPECT_NULL(c->next());
-
- // [B, C]
- list.unlink(a);
- EXPECT_EQ(list.first(), b);
- EXPECT_EQ(list.last(), c);
- EXPECT_NULL(a->prev());
- EXPECT_NULL(a->next());
- EXPECT_NULL(b->prev());
- EXPECT_EQ(b->next(), c);
- EXPECT_EQ(c->prev(), b);
- EXPECT_NULL(c->next());
-
- // [B]
- list.unlink(c);
- EXPECT_EQ(list.first(), b);
- EXPECT_EQ(list.last(), b);
- EXPECT_NULL(b->prev());
- EXPECT_NULL(b->next());
- EXPECT_NULL(c->prev());
- EXPECT_NULL(c->next());
-
- // []
- list.unlink(b);
- EXPECT_TRUE(list.empty());
- EXPECT_NULL(list.first());
- EXPECT_NULL(list.last());
- EXPECT_NULL(b->prev());
- EXPECT_NULL(b->next());
-
- INFO("Prepend / Unlink");
-
- // [A]
- list.prepend(a);
- EXPECT_FALSE(list.empty());
- EXPECT_EQ(list.first(), a);
- EXPECT_EQ(list.last(), a);
- EXPECT_NULL(a->prev());
- EXPECT_NULL(a->next());
-
- // [B, A]
- list.prepend(b);
- EXPECT_EQ(list.first(), b);
- EXPECT_EQ(list.last(), a);
- EXPECT_NULL(b->prev());
- EXPECT_EQ(b->next(), a);
- EXPECT_EQ(a->prev(), b);
- EXPECT_NULL(a->next());
-
- INFO("InsertAfter / InsertBefore");
-
- // [B, A, C]
- list.insertAfter(a, c);
- EXPECT_EQ(list.first(), b);
- EXPECT_EQ(list.last(), c);
- EXPECT_NULL(b->prev());
- EXPECT_EQ(b->next(), a);
- EXPECT_EQ(a->prev(), b);
- EXPECT_EQ(a->next(), c);
- EXPECT_EQ(c->prev(), a);
- EXPECT_NULL(c->next());
-
- // [B, D, A, C]
- list.insertBefore(a, d);
- EXPECT_EQ(list.first(), b);
- EXPECT_EQ(list.last(), c);
- EXPECT_NULL(b->prev());
- EXPECT_EQ(b->next(), d);
- EXPECT_EQ(d->prev(), b);
- EXPECT_EQ(d->next(), a);
- EXPECT_EQ(a->prev(), d);
- EXPECT_EQ(a->next(), c);
- EXPECT_EQ(c->prev(), a);
- EXPECT_NULL(c->next());
-
- INFO("PopFirst / Pop");
-
- // [D, A, C]
- EXPECT_EQ(list.popFirst(), b);
- EXPECT_NULL(b->prev());
- EXPECT_NULL(b->next());
-
- EXPECT_EQ(list.first(), d);
- EXPECT_EQ(list.last(), c);
- EXPECT_NULL(d->prev());
- EXPECT_EQ(d->next(), a);
- EXPECT_EQ(a->prev(), d);
- EXPECT_EQ(a->next(), c);
- EXPECT_EQ(c->prev(), a);
- EXPECT_NULL(c->next());
-
- // [D, A]
- EXPECT_EQ(list.pop(), c);
- EXPECT_NULL(c->prev());
- EXPECT_NULL(c->next());
-
- EXPECT_EQ(list.first(), d);
- EXPECT_EQ(list.last(), a);
- EXPECT_NULL(d->prev());
- EXPECT_EQ(d->next(), a);
- EXPECT_EQ(a->prev(), d);
- EXPECT_NULL(a->next());
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/zonelist.h b/3rdparty/asmjit/src/asmjit/core/zonelist.h
deleted file mode 100644
index 8980240ef43..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonelist.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONELIST_H_INCLUDED
-#define ASMJIT_CORE_ZONELIST_H_INCLUDED
-
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! Node used by \ref ZoneList template.
-template<typename NodeT>
-class ZoneListNode {
-public:
- ASMJIT_NONCOPYABLE(ZoneListNode)
-
- //! \name Constants
- //! \{
-
- enum : size_t {
- kNodeIndexPrev = 0,
- kNodeIndexNext = 1
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- NodeT* _listNodes[2];
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneListNode() noexcept
- : _listNodes { nullptr, nullptr } {}
-
- ASMJIT_INLINE_NODEBUG ZoneListNode(ZoneListNode&& other) noexcept
- : _listNodes { other._listNodes[0], other._listNodes[1] } {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool hasPrev() const noexcept { return _listNodes[kNodeIndexPrev] != nullptr; }
- ASMJIT_INLINE_NODEBUG bool hasNext() const noexcept { return _listNodes[kNodeIndexNext] != nullptr; }
-
- ASMJIT_INLINE_NODEBUG NodeT* prev() const noexcept { return _listNodes[kNodeIndexPrev]; }
- ASMJIT_INLINE_NODEBUG NodeT* next() const noexcept { return _listNodes[kNodeIndexNext]; }
-
- //! \}
-};
-
-//! Zone allocated list container that uses nodes of `NodeT` type.
-template <typename NodeT>
-class ZoneList {
-public:
- ASMJIT_NONCOPYABLE(ZoneList)
-
- //! \name Constants
- //! \{
-
- enum : size_t {
- kNodeIndexFirst = 0,
- kNodeIndexLast = 1
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- NodeT* _nodes[2] {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneList() noexcept {}
-
- ASMJIT_INLINE_NODEBUG ZoneList(ZoneList&& other) noexcept
- : _nodes { other._nodes[0], other._nodes[1] } {}
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _nodes[0] = nullptr;
- _nodes[1] = nullptr;
- }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _nodes[0] == nullptr; }
- ASMJIT_INLINE_NODEBUG NodeT* first() const noexcept { return _nodes[kNodeIndexFirst]; }
- ASMJIT_INLINE_NODEBUG NodeT* last() const noexcept { return _nodes[kNodeIndexLast]; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_INLINE_NODEBUG void swap(ZoneList& other) noexcept {
- std::swap(_nodes[0], other._nodes[0]);
- std::swap(_nodes[1], other._nodes[1]);
- }
-
- // Can be used to both append and prepend.
- inline void _addNode(NodeT* node, size_t dir) noexcept {
- NodeT* prev = _nodes[dir];
-
- node->_listNodes[!dir] = prev;
- _nodes[dir] = node;
- if (prev)
- prev->_listNodes[dir] = node;
- else
- _nodes[!dir] = node;
- }
-
- // Can be used to both append and prepend.
- inline void _insertNode(NodeT* ref, NodeT* node, size_t dir) noexcept {
- ASMJIT_ASSERT(ref != nullptr);
-
- NodeT* prev = ref;
- NodeT* next = ref->_listNodes[dir];
-
- prev->_listNodes[dir] = node;
- if (next)
- next->_listNodes[!dir] = node;
- else
- _nodes[dir] = node;
-
- node->_listNodes[!dir] = prev;
- node->_listNodes[ dir] = next;
- }
-
- ASMJIT_INLINE_NODEBUG void append(NodeT* node) noexcept { _addNode(node, kNodeIndexLast); }
- ASMJIT_INLINE_NODEBUG void prepend(NodeT* node) noexcept { _addNode(node, kNodeIndexFirst); }
-
- ASMJIT_INLINE_NODEBUG void insertAfter(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexNext); }
- ASMJIT_INLINE_NODEBUG void insertBefore(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexPrev); }
-
- inline NodeT* unlink(NodeT* node) noexcept {
- NodeT* prev = node->prev();
- NodeT* next = node->next();
-
- if (prev) { prev->_listNodes[1] = next; node->_listNodes[0] = nullptr; } else { _nodes[0] = next; }
- if (next) { next->_listNodes[0] = prev; node->_listNodes[1] = nullptr; } else { _nodes[1] = prev; }
-
- node->_listNodes[0] = nullptr;
- node->_listNodes[1] = nullptr;
-
- return node;
- }
-
- inline NodeT* popFirst() noexcept {
- NodeT* node = _nodes[0];
- ASMJIT_ASSERT(node != nullptr);
-
- NodeT* next = node->next();
- _nodes[0] = next;
-
- if (next) {
- next->_listNodes[0] = nullptr;
- node->_listNodes[1] = nullptr;
- }
- else {
- _nodes[1] = nullptr;
- }
-
- return node;
- }
-
- inline NodeT* pop() noexcept {
- NodeT* node = _nodes[1];
- ASMJIT_ASSERT(node != nullptr);
-
- NodeT* prev = node->prev();
- _nodes[1] = prev;
-
- if (prev) {
- prev->_listNodes[1] = nullptr;
- node->_listNodes[0] = nullptr;
- }
- else {
- _nodes[0] = nullptr;
- }
-
- return node;
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONELIST_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonestack.cpp b/3rdparty/asmjit/src/asmjit/core/zonestack.cpp
deleted file mode 100644
index 7d66670935b..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonestack.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/zone.h"
-#include "../core/zonestack.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ZoneStackBase - Initialization & Reset
-// ======================================
-
-Error ZoneStackBase::_init(ZoneAllocator* allocator, size_t middleIndex) noexcept {
- ZoneAllocator* oldAllocator = _allocator;
-
- if (oldAllocator) {
- Block* block = _block[kBlockIndexFirst];
- while (block) {
- Block* next = block->next();
- oldAllocator->release(block, kBlockSize);
- block = next;
- }
-
- _allocator = nullptr;
- _block[kBlockIndexFirst] = nullptr;
- _block[kBlockIndexLast] = nullptr;
- }
-
- if (allocator) {
- Block* block = static_cast<Block*>(allocator->alloc(kBlockSize));
- if (ASMJIT_UNLIKELY(!block))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- block->_link[kBlockIndexPrev] = nullptr;
- block->_link[kBlockIndexNext] = nullptr;
- block->_start = (uint8_t*)block + middleIndex;
- block->_end = (uint8_t*)block + middleIndex;
-
- _allocator = allocator;
- _block[kBlockIndexFirst] = block;
- _block[kBlockIndexLast] = block;
- }
-
- return kErrorOk;
-}
-
-// ZoneStackBase - Operations
-// ==========================
-
-Error ZoneStackBase::_prepareBlock(uint32_t side, size_t initialIndex) noexcept {
- ASMJIT_ASSERT(isInitialized());
-
- Block* prev = _block[side];
- ASMJIT_ASSERT(!prev->empty());
-
- Block* block = _allocator->allocT<Block>(kBlockSize);
- if (ASMJIT_UNLIKELY(!block))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- block->_link[ side] = nullptr;
- block->_link[!side] = prev;
- block->_start = (uint8_t*)block + initialIndex;
- block->_end = (uint8_t*)block + initialIndex;
-
- prev->_link[side] = block;
- _block[side] = block;
-
- return kErrorOk;
-}
-
-void ZoneStackBase::_cleanupBlock(uint32_t side, size_t middleIndex) noexcept {
- Block* block = _block[side];
- ASMJIT_ASSERT(block->empty());
-
- Block* prev = block->_link[!side];
- if (prev) {
- ASMJIT_ASSERT(prev->_link[side] == block);
- _allocator->release(block, kBlockSize);
-
- prev->_link[side] = nullptr;
- _block[side] = prev;
- }
- else if (_block[!side] == block) {
- // If the container becomes empty center both pointers in the remaining block.
- block->_start = (uint8_t*)block + middleIndex;
- block->_end = (uint8_t*)block + middleIndex;
- }
-}
-
-// ZoneStack - Tests
-// =================
-
-#if defined(ASMJIT_TEST)
-template<typename T>
-static void test_zone_stack(ZoneAllocator* allocator, const char* typeName) {
- ZoneStack<T> stack;
-
- INFO("Testing ZoneStack<%s>", typeName);
- INFO(" (%d items per one Block)", ZoneStack<T>::kNumBlockItems);
-
- EXPECT_EQ(stack.init(allocator), kErrorOk);
- EXPECT_TRUE(stack.empty());
-
- EXPECT_EQ(stack.append(42), kErrorOk);
- EXPECT_FALSE(stack.empty())
- .message("Stack must not be empty after an item has been appended");
- EXPECT_EQ(stack.pop(), 42)
- .message("Stack.pop() must return the item that has been appended last");
- EXPECT_TRUE(stack.empty())
- .message("Stack must be empty after the last item has been removed");
-
- EXPECT_EQ(stack.prepend(43), kErrorOk);
- EXPECT_FALSE(stack.empty())
- .message("Stack must not be empty after an item has been prepended");
- EXPECT_EQ(stack.popFirst(), 43)
- .message("Stack.popFirst() must return the item that has been prepended last");
- EXPECT_TRUE(stack.empty())
- .message("Stack must be empty after the last item has been removed");
-
- int i;
- int iMin =-100000;
- int iMax = 100000;
-
- INFO("Validating prepend() & popFirst()");
- for (i = iMax; i >= 0; i--) stack.prepend(T(i));
- for (i = 0; i <= iMax; i++) {
- T item = stack.popFirst();
- EXPECT_EQ(i, item)
- .message("Item '%d' didn't match the item '%lld' popped", i, (long long)item);
- if (!stack.empty()) {
- item = stack.popFirst();
- EXPECT_EQ(i + 1, item)
- .message("Item '%d' didn't match the item '%lld' popped", i + 1, (long long)item);
- stack.prepend(item);
- }
- }
- EXPECT_TRUE(stack.empty());
-
- INFO("Validating append() & pop()");
- for (i = 0; i <= iMax; i++) stack.append(T(i));
- for (i = iMax; i >= 0; i--) {
- T item = stack.pop();
- EXPECT_EQ(i, item)
- .message("Item '%d' didn't match the item '%lld' popped", i, (long long)item);
- if (!stack.empty()) {
- item = stack.pop();
- EXPECT_EQ(i - 1, item)
- .message("Item '%d' didn't match the item '%lld' popped", i - 1, (long long)item);
- stack.append(item);
- }
- }
- EXPECT_TRUE(stack.empty());
-
- INFO("Validating append()/prepend() & popFirst()");
- for (i = 1; i <= iMax; i++) stack.append(T(i));
- for (i = 0; i >= iMin; i--) stack.prepend(T(i));
-
- for (i = iMin; i <= iMax; i++) {
- T item = stack.popFirst();
- EXPECT_EQ(i, item);
- }
- EXPECT_TRUE(stack.empty());
-
- INFO("Validating append()/prepend() & pop()");
- for (i = 0; i >= iMin; i--) stack.prepend(T(i));
- for (i = 1; i <= iMax; i++) stack.append(T(i));
-
- for (i = iMax; i >= iMin; i--) {
- T item = stack.pop();
- EXPECT_EQ(i, item);
- }
- EXPECT_TRUE(stack.empty());
-}
-
-UNIT(zone_stack) {
- Zone zone(8096 - Zone::kBlockOverhead);
- ZoneAllocator allocator(&zone);
-
- test_zone_stack<int>(&allocator, "int");
- test_zone_stack<int64_t>(&allocator, "int64_t");
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/zonestack.h b/3rdparty/asmjit/src/asmjit/core/zonestack.h
deleted file mode 100644
index 2cf078b3d21..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonestack.h
+++ /dev/null
@@ -1,235 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONESTACK_H_INCLUDED
-#define ASMJIT_CORE_ZONESTACK_H_INCLUDED
-
-#include "../core/zone.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! Base class used by \ref ZoneStack.
-class ZoneStackBase {
-public:
- ASMJIT_NONCOPYABLE(ZoneStackBase)
-
- //! \name Constants
- //! \{
-
- enum : size_t {
- kBlockIndexPrev = 0,
- kBlockIndexNext = 1,
-
- kBlockIndexFirst = 0,
- kBlockIndexLast = 1,
-
- kBlockSize = ZoneAllocator::kHiMaxSize
- };
-
- //! \}
-
- //! \name Types
- //! \{
-
- struct Block {
- //! Next and previous blocks.
- Block* _link[2];
- //! Pointer to the start of the array.
- void* _start;
- //! Pointer to the end of the array.
- void* _end;
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _start == _end; }
- ASMJIT_INLINE_NODEBUG Block* prev() const noexcept { return _link[kBlockIndexPrev]; }
- ASMJIT_INLINE_NODEBUG Block* next() const noexcept { return _link[kBlockIndexNext]; }
-
- ASMJIT_INLINE_NODEBUG void setPrev(Block* block) noexcept { _link[kBlockIndexPrev] = block; }
- ASMJIT_INLINE_NODEBUG void setNext(Block* block) noexcept { _link[kBlockIndexNext] = block; }
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* start() const noexcept { return static_cast<T*>(_start); }
- template<typename T>
- ASMJIT_INLINE_NODEBUG void setStart(T* start) noexcept { _start = static_cast<void*>(start); }
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* end() const noexcept { return (T*)_end; }
- template<typename T>
- ASMJIT_INLINE_NODEBUG void setEnd(T* end) noexcept { _end = (void*)end; }
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG T* data() const noexcept { return (T*)((uint8_t*)(this) + sizeof(Block)); }
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG bool canPrepend() const noexcept { return _start > data<void>(); }
-
- template<typename T>
- ASMJIT_INLINE_NODEBUG bool canAppend() const noexcept {
- size_t kNumBlockItems = (kBlockSize - sizeof(Block)) / sizeof(T);
- size_t kStartBlockIndex = sizeof(Block);
- size_t kEndBlockIndex = kStartBlockIndex + kNumBlockItems * sizeof(T);
-
- return (uintptr_t)_end <= ((uintptr_t)this + kEndBlockIndex - sizeof(T));
- }
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Allocator used to allocate data.
- ZoneAllocator* _allocator {};
- //! First and last blocks.
- Block* _block[2] {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneStackBase() noexcept {}
- ASMJIT_INLINE_NODEBUG ~ZoneStackBase() noexcept { reset(); }
-
- ASMJIT_INLINE_NODEBUG bool isInitialized() const noexcept { return _allocator != nullptr; }
- ASMJIT_API Error _init(ZoneAllocator* allocator, size_t middleIndex) noexcept;
- ASMJIT_INLINE_NODEBUG Error reset() noexcept { return _init(nullptr, 0); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns `ZoneAllocator` attached to this container.
- ASMJIT_INLINE_NODEBUG ZoneAllocator* allocator() const noexcept { return _allocator; }
-
- inline bool empty() const noexcept {
- ASMJIT_ASSERT(isInitialized());
- return _block[0]->start<void>() == _block[1]->end<void>();
- }
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal
- //! \{
-
- ASMJIT_API Error _prepareBlock(uint32_t side, size_t initialIndex) noexcept;
- ASMJIT_API void _cleanupBlock(uint32_t side, size_t middleIndex) noexcept;
-
- //! \}
- //! \endcond
-};
-
-//! Zone allocated stack container.
-template<typename T>
-class ZoneStack : public ZoneStackBase {
-public:
- ASMJIT_NONCOPYABLE(ZoneStack)
-
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- kNumBlockItems = uint32_t((kBlockSize - sizeof(Block)) / sizeof(T)),
- kStartBlockIndex = uint32_t(sizeof(Block)),
- kMidBlockIndex = uint32_t(kStartBlockIndex + (kNumBlockItems / 2) * sizeof(T)),
- kEndBlockIndex = uint32_t(kStartBlockIndex + (kNumBlockItems ) * sizeof(T))
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- inline ZoneStack() noexcept {}
- inline ~ZoneStack() noexcept {}
-
- inline Error init(ZoneAllocator* allocator) noexcept { return _init(allocator, kMidBlockIndex); }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- inline Error prepend(T item) noexcept {
- ASMJIT_ASSERT(isInitialized());
- Block* block = _block[kBlockIndexFirst];
-
- if (!block->canPrepend<T>()) {
- ASMJIT_PROPAGATE(_prepareBlock(kBlockIndexFirst, kEndBlockIndex));
- block = _block[kBlockIndexFirst];
- }
-
- T* ptr = block->start<T>() - 1;
- ASMJIT_ASSERT(ptr >= block->data<T>() && ptr <= block->data<T>() + (kNumBlockItems - 1));
- *ptr = item;
- block->setStart<T>(ptr);
- return kErrorOk;
- }
-
- inline Error append(T item) noexcept {
- ASMJIT_ASSERT(isInitialized());
- Block* block = _block[kBlockIndexLast];
-
- if (!block->canAppend<T>()) {
- ASMJIT_PROPAGATE(_prepareBlock(kBlockIndexLast, kStartBlockIndex));
- block = _block[kBlockIndexLast];
- }
-
- T* ptr = block->end<T>();
- ASMJIT_ASSERT(ptr >= block->data<T>() && ptr <= block->data<T>() + (kNumBlockItems - 1));
-
- *ptr++ = item;
- block->setEnd(ptr);
- return kErrorOk;
- }
-
- inline T popFirst() noexcept {
- ASMJIT_ASSERT(isInitialized());
- ASMJIT_ASSERT(!empty());
-
- Block* block = _block[kBlockIndexFirst];
- ASMJIT_ASSERT(!block->empty());
-
- T* ptr = block->start<T>();
- T item = *ptr++;
-
- block->setStart(ptr);
- if (block->empty())
- _cleanupBlock(kBlockIndexFirst, kMidBlockIndex);
-
- return item;
- }
-
- inline T pop() noexcept {
- ASMJIT_ASSERT(isInitialized());
- ASMJIT_ASSERT(!empty());
-
- Block* block = _block[kBlockIndexLast];
- ASMJIT_ASSERT(!block->empty());
-
- T* ptr = block->end<T>();
- T item = *--ptr;
- ASMJIT_ASSERT(ptr >= block->data<T>());
- ASMJIT_ASSERT(ptr >= block->start<T>());
-
- block->setEnd(ptr);
- if (block->empty())
- _cleanupBlock(kBlockIndexLast, kMidBlockIndex);
-
- return item;
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONESTACK_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonestring.h b/3rdparty/asmjit/src/asmjit/core/zonestring.h
deleted file mode 100644
index e62ac50f287..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonestring.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONESTRING_H_INCLUDED
-#define ASMJIT_CORE_ZONESTRING_H_INCLUDED
-
-#include "../core/globals.h"
-#include "../core/zone.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! A helper class used by \ref ZoneString implementation.
-struct ZoneStringBase {
- union {
- struct {
- uint32_t _size;
- char _embedded[sizeof(void*) * 2 - 4];
- };
- struct {
- void* _dummy;
- char* _external;
- };
- };
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _dummy = nullptr;
- _external = nullptr;
- }
-
- Error setData(Zone* zone, uint32_t maxEmbeddedSize, const char* str, size_t size) noexcept {
- if (size == SIZE_MAX)
- size = strlen(str);
-
- if (size <= maxEmbeddedSize) {
- memcpy(_embedded, str, size);
- _embedded[size] = '\0';
- }
- else {
- char* external = static_cast<char*>(zone->dup(str, size, true));
- if (ASMJIT_UNLIKELY(!external))
- return DebugUtils::errored(kErrorOutOfMemory);
- _external = external;
- }
-
- _size = uint32_t(size);
- return kErrorOk;
- }
-};
-
-//! A string template that can be zone allocated.
-//!
-//! Helps with creating strings that can be either statically allocated if they are small, or externally allocated
-//! in case their size exceeds the limit. The `N` represents the size of the whole `ZoneString` structure, based on
-//! that size the maximum size of the internal buffer is determined.
-template<size_t N>
-class ZoneString {
-public:
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- kWholeSize = (N > sizeof(ZoneStringBase)) ? uint32_t(N) : uint32_t(sizeof(ZoneStringBase)),
- kMaxEmbeddedSize = kWholeSize - 5
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- union {
- ZoneStringBase _base;
- char _wholeData[kWholeSize];
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneString() noexcept { reset(); }
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _base.reset(); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the string is empty.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _base._size == 0; }
-
- //! Returns the string data.
- ASMJIT_INLINE_NODEBUG const char* data() const noexcept { return _base._size <= kMaxEmbeddedSize ? _base._embedded : _base._external; }
- //! Returns the string size.
- ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _base._size; }
-
- //! Tests whether the string is embedded (e.g. no dynamically allocated).
- ASMJIT_INLINE_NODEBUG bool isEmbedded() const noexcept { return _base._size <= kMaxEmbeddedSize; }
-
- //! Copies a new `data` of the given `size` to the string.
- //!
- //! If the `size` exceeds the internal buffer the given `zone` will be used to duplicate the data, otherwise
- //! the internal buffer will be used as a storage.
- ASMJIT_INLINE_NODEBUG Error setData(Zone* zone, const char* data, size_t size) noexcept {
- return _base.setData(zone, kMaxEmbeddedSize, data, size);
- }
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONESTRING_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonetree.cpp b/3rdparty/asmjit/src/asmjit/core/zonetree.cpp
deleted file mode 100644
index e8a0e111440..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonetree.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/support.h"
-#include "../core/zone.h"
-#include "../core/zonetree.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ZoneTreeBase - Tests
-// ====================
-
-#if defined(ASMJIT_TEST)
-template<typename NodeT>
-struct ZoneRBUnit {
- typedef ZoneTree<NodeT> Tree;
-
- static void verifyTree(Tree& tree) noexcept {
- EXPECT_GT(checkHeight(static_cast<NodeT*>(tree._root)), 0);
- }
-
- // Check whether the Red-Black tree is valid.
- static int checkHeight(NodeT* node) noexcept {
- if (!node) return 1;
-
- NodeT* ln = node->left();
- NodeT* rn = node->right();
-
- // Invalid tree.
- EXPECT_TRUE(ln == nullptr || *ln < *node);
- EXPECT_TRUE(rn == nullptr || *rn > *node);
-
- // Red violation.
- EXPECT_TRUE(!node->isRed() || (!ZoneTreeNode::_isValidRed(ln) && !ZoneTreeNode::_isValidRed(rn)));
-
- // Black violation.
- int lh = checkHeight(ln);
- int rh = checkHeight(rn);
- EXPECT_TRUE(!lh || !rh || lh == rh);
-
- // Only count black links.
- return (lh && rh) ? lh + !node->isRed() : 0;
- }
-};
-
-class MyRBNode : public ZoneTreeNodeT<MyRBNode> {
-public:
- ASMJIT_NONCOPYABLE(MyRBNode)
-
- inline explicit MyRBNode(uint32_t key) noexcept
- : _key(key) {}
-
- inline bool operator<(const MyRBNode& other) const noexcept { return _key < other._key; }
- inline bool operator>(const MyRBNode& other) const noexcept { return _key > other._key; }
-
- inline bool operator<(uint32_t queryKey) const noexcept { return _key < queryKey; }
- inline bool operator>(uint32_t queryKey) const noexcept { return _key > queryKey; }
-
- uint32_t _key;
-};
-
-UNIT(zone_rbtree) {
- uint32_t kCount = BrokenAPI::hasArg("--quick") ? 1000 : 10000;
-
- Zone zone(4096);
- ZoneTree<MyRBNode> rbTree;
-
- uint32_t key;
- INFO("Inserting %u elements to RBTree and validating each operation", unsigned(kCount));
- for (key = 0; key < kCount; key++) {
- rbTree.insert(zone.newT<MyRBNode>(key));
- ZoneRBUnit<MyRBNode>::verifyTree(rbTree);
- }
-
- uint32_t count = kCount;
- INFO("Removing %u elements from RBTree and validating each operation", unsigned(kCount));
- do {
- MyRBNode* node;
-
- for (key = 0; key < count; key++) {
- node = rbTree.get(key);
- EXPECT_NOT_NULL(node);
- EXPECT_EQ(node->_key, key);
- }
-
- node = rbTree.get(--count);
- rbTree.remove(node);
- ZoneRBUnit<MyRBNode>::verifyTree(rbTree);
- } while (count);
-
- EXPECT_TRUE(rbTree.empty());
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/zonetree.h b/3rdparty/asmjit/src/asmjit/core/zonetree.h
deleted file mode 100644
index ffeb674cfe2..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonetree.h
+++ /dev/null
@@ -1,376 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONETREE_H_INCLUDED
-#define ASMJIT_CORE_ZONETREE_H_INCLUDED
-
-#include "../core/support.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! RB-Tree node.
-//!
-//! The color is stored in a least significant bit of the `left` node.
-//!
-//! WARNING: Always use accessors to access left and right children.
-class ZoneTreeNode {
-public:
- ASMJIT_NONCOPYABLE(ZoneTreeNode)
-
- //! \name Constants
- //! \{
-
- enum : uintptr_t {
- kRedMask = 0x1,
- kPtrMask = ~kRedMask
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- uintptr_t _rbNodeData[2] {};
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneTreeNode() noexcept {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool isRed() const noexcept { return static_cast<bool>(_rbNodeData[0] & kRedMask); }
-
- ASMJIT_INLINE_NODEBUG bool hasChild(size_t i) const noexcept { return _rbNodeData[i] > kRedMask; }
- ASMJIT_INLINE_NODEBUG bool hasLeft() const noexcept { return _rbNodeData[0] > kRedMask; }
- ASMJIT_INLINE_NODEBUG bool hasRight() const noexcept { return _rbNodeData[1] != 0; }
-
- template<typename T = ZoneTreeNode>
- ASMJIT_INLINE_NODEBUG T* child(size_t i) const noexcept { return static_cast<T*>(_getChild(i)); }
- template<typename T = ZoneTreeNode>
- ASMJIT_INLINE_NODEBUG T* left() const noexcept { return static_cast<T*>(_getLeft()); }
- template<typename T = ZoneTreeNode>
- ASMJIT_INLINE_NODEBUG T* right() const noexcept { return static_cast<T*>(_getRight()); }
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneTreeNode* _getChild(size_t i) const noexcept { return (ZoneTreeNode*)(_rbNodeData[i] & kPtrMask); }
- ASMJIT_INLINE_NODEBUG ZoneTreeNode* _getLeft() const noexcept { return (ZoneTreeNode*)(_rbNodeData[0] & kPtrMask); }
- ASMJIT_INLINE_NODEBUG ZoneTreeNode* _getRight() const noexcept { return (ZoneTreeNode*)(_rbNodeData[1]); }
-
- ASMJIT_INLINE_NODEBUG void _setChild(size_t i, ZoneTreeNode* node) noexcept { _rbNodeData[i] = (_rbNodeData[i] & kRedMask) | (uintptr_t)node; }
- ASMJIT_INLINE_NODEBUG void _setLeft(ZoneTreeNode* node) noexcept { _rbNodeData[0] = (_rbNodeData[0] & kRedMask) | (uintptr_t)node; }
- ASMJIT_INLINE_NODEBUG void _setRight(ZoneTreeNode* node) noexcept { _rbNodeData[1] = (uintptr_t)node; }
-
- ASMJIT_INLINE_NODEBUG void _makeRed() noexcept { _rbNodeData[0] |= kRedMask; }
- ASMJIT_INLINE_NODEBUG void _makeBlack() noexcept { _rbNodeData[0] &= kPtrMask; }
-
- //! Tests whether the node is RED (RED node must be non-null and must have RED flag set).
- static ASMJIT_INLINE_NODEBUG bool _isValidRed(ZoneTreeNode* node) noexcept { return node && node->isRed(); }
-
- //! \}
- //! \endcond
-};
-
-//! RB-Tree node casted to `NodeT`.
-template<typename NodeT>
-class ZoneTreeNodeT : public ZoneTreeNode {
-public:
- ASMJIT_NONCOPYABLE(ZoneTreeNodeT)
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneTreeNodeT() noexcept
- : ZoneTreeNode() {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG NodeT* child(size_t i) const noexcept { return static_cast<NodeT*>(_getChild(i)); }
- ASMJIT_INLINE_NODEBUG NodeT* left() const noexcept { return static_cast<NodeT*>(_getLeft()); }
- ASMJIT_INLINE_NODEBUG NodeT* right() const noexcept { return static_cast<NodeT*>(_getRight()); }
-
- //! \}
-};
-
-//! RB-Tree.
-template<typename NodeT>
-class ZoneTree {
-public:
- ASMJIT_NONCOPYABLE(ZoneTree)
-
- typedef NodeT Node;
- NodeT* _root {};
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneTree() noexcept {}
- ASMJIT_INLINE_NODEBUG ZoneTree(ZoneTree&& other) noexcept
- : _root(other._root) {}
- ASMJIT_INLINE_NODEBUG void reset() noexcept { _root = nullptr; }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _root == nullptr; }
- ASMJIT_INLINE_NODEBUG NodeT* root() const noexcept { return static_cast<NodeT*>(_root); }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_INLINE_NODEBUG void swap(ZoneTree& other) noexcept {
- std::swap(_root, other._root);
- }
-
- template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
- void insert(NodeT* ASMJIT_NONNULL(node), const CompareT& cmp = CompareT()) noexcept {
- // Node to insert must not contain garbage.
- ASMJIT_ASSERT(!node->hasLeft());
- ASMJIT_ASSERT(!node->hasRight());
- ASMJIT_ASSERT(!node->isRed());
-
- if (!_root) {
- _root = node;
- return;
- }
-
- ZoneTreeNode head; // False root node,
- head._setRight(_root); // having root on the right.
-
- ZoneTreeNode* g = nullptr; // Grandparent.
- ZoneTreeNode* p = nullptr; // Parent.
- ZoneTreeNode* t = &head; // Iterator.
- ZoneTreeNode* q = _root; // Query.
-
- size_t dir = 0; // Direction for accessing child nodes.
- size_t last = 0; // Not needed to initialize, but makes some tools happy.
-
- node->_makeRed(); // New nodes are always red and violations fixed appropriately.
-
- // Search down the tree.
- for (;;) {
- if (!q) {
- // Insert new node at the bottom.
- q = node;
- p->_setChild(dir, node);
- }
- else if (_isValidRed(q->_getLeft()) && _isValidRed(q->_getRight())) {
- // Color flip.
- q->_makeRed();
- q->_getLeft()->_makeBlack();
- q->_getRight()->_makeBlack();
- }
-
- // Fix red violation.
- if (_isValidRed(q) && _isValidRed(p)) {
- ASMJIT_ASSUME(g != nullptr);
- ASMJIT_ASSUME(p != nullptr);
- t->_setChild(t->_getRight() == g,
- q == p->_getChild(last) ? _singleRotate(g, !last) : _doubleRotate(g, !last));
- }
-
- // Stop if found.
- if (q == node)
- break;
-
- last = dir;
- dir = cmp(*static_cast<NodeT*>(q), *static_cast<NodeT*>(node)) < 0;
-
- // Update helpers.
- if (g) t = g;
-
- g = p;
- p = q;
- q = q->_getChild(dir);
- }
-
- // Update root and make it black.
- _root = static_cast<NodeT*>(head._getRight());
- _root->_makeBlack();
- }
-
- //! Remove node from RBTree.
- template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
- void remove(ZoneTreeNode* ASMJIT_NONNULL(node), const CompareT& cmp = CompareT()) noexcept {
- ZoneTreeNode head; // False root node,
- head._setRight(_root); // having root on the right.
-
- ZoneTreeNode* g = nullptr; // Grandparent.
- ZoneTreeNode* p = nullptr; // Parent.
- ZoneTreeNode* q = &head; // Query.
-
- ZoneTreeNode* f = nullptr; // Found item.
- ZoneTreeNode* gf = nullptr; // Found grandparent.
- size_t dir = 1; // Direction (0 or 1).
-
- // Search and push a red down.
- while (q->hasChild(dir)) {
- size_t last = dir;
-
- // Update helpers.
- g = p;
- p = q;
- q = q->_getChild(dir);
- dir = cmp(*static_cast<NodeT*>(q), *static_cast<NodeT*>(node)) < 0;
-
- // Save found node.
- if (q == node) {
- f = q;
- gf = g;
- }
-
- // Push the red node down.
- if (!_isValidRed(q) && !_isValidRed(q->_getChild(dir))) {
- if (_isValidRed(q->_getChild(!dir))) {
- ZoneTreeNode* child = _singleRotate(q, dir);
- p->_setChild(last, child);
- p = child;
- }
- else if (!_isValidRed(q->_getChild(!dir)) && p->_getChild(!last)) {
- ZoneTreeNode* s = p->_getChild(!last);
- if (!_isValidRed(s->_getChild(!last)) && !_isValidRed(s->_getChild(last))) {
- // Color flip.
- p->_makeBlack();
- s->_makeRed();
- q->_makeRed();
- }
- else {
- ASMJIT_ASSUME(g != nullptr);
- ASMJIT_ASSUME(s != nullptr);
-
- size_t dir2 = g->_getRight() == p;
- ZoneTreeNode* child = g->_getChild(dir2);
-
- if (_isValidRed(s->_getChild(last))) {
- child = _doubleRotate(p, last);
- g->_setChild(dir2, child);
- }
- else if (_isValidRed(s->_getChild(!last))) {
- child = _singleRotate(p, last);
- g->_setChild(dir2, child);
- }
-
- // Ensure correct coloring.
- q->_makeRed();
- child->_makeRed();
- child->_getLeft()->_makeBlack();
- child->_getRight()->_makeBlack();
- }
- }
- }
- }
-
- // Replace and remove.
- ASMJIT_ASSERT(f != nullptr);
- ASMJIT_ASSERT(f != &head);
- ASMJIT_ASSERT(q != &head);
-
- p->_setChild(p->_getRight() == q,
- q->_getChild(q->_getLeft() == nullptr));
-
- // NOTE: The original algorithm used a trick to just copy 'key/value' to `f` and mark `q` for deletion. But this
- // is unacceptable here as we really want to destroy the passed `node`. So, we have to make sure that we have
- // really removed `f` and not `q`.
- if (f != q) {
- ASMJIT_ASSERT(f != &head);
- ASMJIT_ASSERT(f != gf);
-
- ZoneTreeNode* n = gf ? gf : &head;
- dir = (n == &head) ? 1 : cmp(*static_cast<NodeT*>(n), *static_cast<NodeT*>(node)) < 0;
-
- for (;;) {
- if (n->_getChild(dir) == f) {
- n->_setChild(dir, q);
- // RAW copy, including the color.
- q->_rbNodeData[0] = f->_rbNodeData[0];
- q->_rbNodeData[1] = f->_rbNodeData[1];
- break;
- }
-
- n = n->_getChild(dir);
-
- // Cannot be true as we know that it must reach `f` in few iterations.
- ASMJIT_ASSERT(n != nullptr);
- dir = cmp(*static_cast<NodeT*>(n), *static_cast<NodeT*>(node)) < 0;
- }
- }
-
- // Update root and make it black.
- _root = static_cast<NodeT*>(head._getRight());
- if (_root) _root->_makeBlack();
- }
-
- template<typename KeyT, typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
- inline NodeT* get(const KeyT& key, const CompareT& cmp = CompareT()) const noexcept {
- ZoneTreeNode* node = _root;
- while (node) {
- auto result = cmp(*static_cast<const NodeT*>(node), key);
- if (result == 0) break;
-
- // Go left or right depending on the `result`.
- node = node->_getChild(result < 0);
- }
- return static_cast<NodeT*>(node);
- }
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal
- //! \{
-
- static inline bool _isValidRed(ZoneTreeNode* node) noexcept { return ZoneTreeNode::_isValidRed(node); }
-
- //! Single rotation.
- static inline ZoneTreeNode* _singleRotate(ZoneTreeNode* ASMJIT_NONNULL(root), size_t dir) noexcept {
- ZoneTreeNode* save = root->_getChild(!dir);
- ASMJIT_ASSUME(save != nullptr);
-
- ZoneTreeNode* saveChild = save->_getChild(dir);
- root->_setChild(!dir, saveChild);
- save->_setChild( dir, root);
- root->_makeRed();
- save->_makeBlack();
- return save;
- }
-
- //! Double rotation.
- static inline ZoneTreeNode* _doubleRotate(ZoneTreeNode* ASMJIT_NONNULL(root), size_t dir) noexcept {
- ZoneTreeNode* child = root->_getChild(!dir);
- ASMJIT_ASSUME(child != nullptr);
-
- root->_setChild(!dir, _singleRotate(child, !dir));
- return _singleRotate(root, dir);
- }
-
- //! \}
- //! \endcond
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONETREE_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/core/zonevector.cpp b/3rdparty/asmjit/src/asmjit/core/zonevector.cpp
deleted file mode 100644
index 24860219de2..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonevector.cpp
+++ /dev/null
@@ -1,369 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#include "../core/support.h"
-#include "../core/zone.h"
-#include "../core/zonevector.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-// ZoneVectorBase - Helpers
-// ========================
-
-Error ZoneVectorBase::_grow(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept {
- uint32_t threshold = Globals::kGrowThreshold / sizeOfT;
- uint32_t capacity = _capacity;
- uint32_t after = _size;
-
- if (ASMJIT_UNLIKELY(std::numeric_limits<uint32_t>::max() - n < after))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- after += n;
- if (capacity >= after)
- return kErrorOk;
-
- // ZoneVector is used as an array to hold short-lived data structures used
- // during code generation. The growing strategy is simple - use small capacity
- // at the beginning (very good for ZoneAllocator) and then grow quicker to
- // prevent successive reallocations.
- if (capacity < 4)
- capacity = 4;
- else if (capacity < 8)
- capacity = 8;
- else if (capacity < 16)
- capacity = 16;
- else if (capacity < 64)
- capacity = 64;
- else if (capacity < 256)
- capacity = 256;
-
- while (capacity < after) {
- if (capacity < threshold)
- capacity *= 2;
- else
- capacity += threshold;
- }
-
- return _reserve(allocator, sizeOfT, capacity);
-}
-
-Error ZoneVectorBase::_reserve(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept {
- uint32_t oldCapacity = _capacity;
- if (oldCapacity >= n)
- return kErrorOk;
-
- uint32_t nBytes = n * sizeOfT;
- if (ASMJIT_UNLIKELY(nBytes < n))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- size_t allocatedBytes;
- uint8_t* newData = static_cast<uint8_t*>(allocator->alloc(nBytes, allocatedBytes));
-
- if (ASMJIT_UNLIKELY(!newData))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- void* oldData = _data;
- if (oldData && _size) {
- memcpy(newData, oldData, size_t(_size) * sizeOfT);
- allocator->release(oldData, size_t(oldCapacity) * sizeOfT);
- }
-
- _capacity = uint32_t(allocatedBytes / sizeOfT);
- ASMJIT_ASSERT(_capacity >= n);
-
- _data = newData;
- return kErrorOk;
-}
-
-Error ZoneVectorBase::_resize(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept {
- uint32_t size = _size;
-
- if (_capacity < n) {
- ASMJIT_PROPAGATE(_grow(allocator, sizeOfT, n - size));
- ASMJIT_ASSERT(_capacity >= n);
- }
-
- if (size < n)
- memset(static_cast<uint8_t*>(_data) + size_t(size) * sizeOfT, 0, size_t(n - size) * sizeOfT);
-
- _size = n;
- return kErrorOk;
-}
-
-// ZoneBitVector - Operations
-// ==========================
-
-Error ZoneBitVector::copyFrom(ZoneAllocator* allocator, const ZoneBitVector& other) noexcept {
- BitWord* data = _data;
- uint32_t newSize = other.size();
-
- if (!newSize) {
- _size = 0;
- return kErrorOk;
- }
-
- if (newSize > _capacity) {
- // Realloc needed... Calculate the minimum capacity (in bytes) required.
- uint32_t minimumCapacityInBits = Support::alignUp<uint32_t>(newSize, kBitWordSizeInBits);
- if (ASMJIT_UNLIKELY(minimumCapacityInBits < newSize))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // Normalize to bytes.
- uint32_t minimumCapacity = minimumCapacityInBits / 8;
- size_t allocatedCapacity;
-
- BitWord* newData = static_cast<BitWord*>(allocator->alloc(minimumCapacity, allocatedCapacity));
- if (ASMJIT_UNLIKELY(!newData))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // `allocatedCapacity` now contains number in bytes, we need bits.
- size_t allocatedCapacityInBits = allocatedCapacity * 8;
-
- // Arithmetic overflow should normally not happen. If it happens we just
- // change the `allocatedCapacityInBits` to the `minimumCapacityInBits` as
- // this value is still safe to be used to call `_allocator->release(...)`.
- if (ASMJIT_UNLIKELY(allocatedCapacityInBits < allocatedCapacity))
- allocatedCapacityInBits = minimumCapacityInBits;
-
- if (data)
- allocator->release(data, _capacity / 8);
- data = newData;
-
- _data = data;
- _capacity = uint32_t(allocatedCapacityInBits);
- }
-
- _size = newSize;
- _copyBits(data, other.data(), _wordsPerBits(newSize));
-
- return kErrorOk;
-}
-
-Error ZoneBitVector::_resize(ZoneAllocator* allocator, uint32_t newSize, uint32_t idealCapacity, bool newBitsValue) noexcept {
- ASMJIT_ASSERT(idealCapacity >= newSize);
-
- if (newSize <= _size) {
- // The size after the resize is lesser than or equal to the current size.
- uint32_t idx = newSize / kBitWordSizeInBits;
- uint32_t bit = newSize % kBitWordSizeInBits;
-
- // Just set all bits outside of the new size in the last word to zero.
- // There is a case that there are not bits to set if `bit` is zero. This
- // happens when `newSize` is a multiply of `kBitWordSizeInBits` like 64, 128,
- // and so on. In that case don't change anything as that would mean settings
- // bits outside of the `_size`.
- if (bit)
- _data[idx] &= (BitWord(1) << bit) - 1u;
-
- _size = newSize;
- return kErrorOk;
- }
-
- uint32_t oldSize = _size;
- BitWord* data = _data;
-
- if (newSize > _capacity) {
- // Realloc needed, calculate the minimum capacity (in bytes) required.
- uint32_t minimumCapacityInBits = Support::alignUp<uint32_t>(idealCapacity, kBitWordSizeInBits);
-
- if (ASMJIT_UNLIKELY(minimumCapacityInBits < newSize))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // Normalize to bytes.
- uint32_t minimumCapacity = minimumCapacityInBits / 8;
- size_t allocatedCapacity;
-
- BitWord* newData = static_cast<BitWord*>(allocator->alloc(minimumCapacity, allocatedCapacity));
- if (ASMJIT_UNLIKELY(!newData))
- return DebugUtils::errored(kErrorOutOfMemory);
-
- // `allocatedCapacity` now contains number in bytes, we need bits.
- size_t allocatedCapacityInBits = allocatedCapacity * 8;
-
- // Arithmetic overflow should normally not happen. If it happens we just
- // change the `allocatedCapacityInBits` to the `minimumCapacityInBits` as
- // this value is still safe to be used to call `_allocator->release(...)`.
- if (ASMJIT_UNLIKELY(allocatedCapacityInBits < allocatedCapacity))
- allocatedCapacityInBits = minimumCapacityInBits;
-
- _copyBits(newData, data, _wordsPerBits(oldSize));
-
- if (data)
- allocator->release(data, _capacity / 8);
- data = newData;
-
- _data = data;
- _capacity = uint32_t(allocatedCapacityInBits);
- }
-
- // Start (of the old size) and end (of the new size) bits
- uint32_t idx = oldSize / kBitWordSizeInBits;
- uint32_t startBit = oldSize % kBitWordSizeInBits;
- uint32_t endBit = newSize % kBitWordSizeInBits;
-
- // Set new bits to either 0 or 1. The `pattern` is used to set multiple
- // bits per bit-word and contains either all zeros or all ones.
- BitWord pattern = Support::bitMaskFromBool<BitWord>(newBitsValue);
-
- // First initialize the last bit-word of the old size.
- if (startBit) {
- uint32_t nBits = 0;
-
- if (idx == (newSize / kBitWordSizeInBits)) {
- // The number of bit-words is the same after the resize. In that case
- // we need to set only bits necessary in the current last bit-word.
- ASMJIT_ASSERT(startBit < endBit);
- nBits = endBit - startBit;
- }
- else {
- // There is be more bit-words after the resize. In that case we don't
- // have to be extra careful about the last bit-word of the old size.
- nBits = kBitWordSizeInBits - startBit;
- }
-
- data[idx++] |= pattern << nBits;
- }
-
- // Initialize all bit-words after the last bit-word of the old size.
- uint32_t endIdx = _wordsPerBits(newSize);
- while (idx < endIdx) data[idx++] = pattern;
-
- // Clear unused bits of the last bit-word.
- if (endBit)
- data[endIdx - 1] = pattern & ((BitWord(1) << endBit) - 1);
-
- _size = newSize;
- return kErrorOk;
-}
-
-Error ZoneBitVector::_append(ZoneAllocator* allocator, bool value) noexcept {
- uint32_t kThreshold = Globals::kGrowThreshold * 8;
- uint32_t newSize = _size + 1;
- uint32_t idealCapacity = _capacity;
-
- if (idealCapacity < 128)
- idealCapacity = 128;
- else if (idealCapacity <= kThreshold)
- idealCapacity *= 2;
- else
- idealCapacity += kThreshold;
-
- if (ASMJIT_UNLIKELY(idealCapacity < _capacity)) {
- if (ASMJIT_UNLIKELY(_size == std::numeric_limits<uint32_t>::max()))
- return DebugUtils::errored(kErrorOutOfMemory);
- idealCapacity = newSize;
- }
-
- return _resize(allocator, newSize, idealCapacity, value);
-}
-
-// ZoneVector / ZoneBitVector - Tests
-// ==================================
-
-#if defined(ASMJIT_TEST)
-template<typename T>
-static void test_zone_vector(ZoneAllocator* allocator, const char* typeName) {
- int i;
- int kMax = 100000;
-
- ZoneVector<T> vec;
-
- INFO("ZoneVector<%s> basic tests", typeName);
- EXPECT_EQ(vec.append(allocator, 0), kErrorOk);
- EXPECT_FALSE(vec.empty());
- EXPECT_EQ(vec.size(), 1u);
- EXPECT_GE(vec.capacity(), 1u);
- EXPECT_EQ(vec.indexOf(0), 0u);
- EXPECT_EQ(vec.indexOf(-11), Globals::kNotFound);
-
- vec.clear();
- EXPECT_TRUE(vec.empty());
- EXPECT_EQ(vec.size(), 0u);
- EXPECT_EQ(vec.indexOf(0), Globals::kNotFound);
-
- for (i = 0; i < kMax; i++) {
- EXPECT_EQ(vec.append(allocator, T(i)), kErrorOk);
- }
- EXPECT_FALSE(vec.empty());
- EXPECT_EQ(vec.size(), uint32_t(kMax));
- EXPECT_EQ(vec.indexOf(T(0)), uint32_t(0));
- EXPECT_EQ(vec.indexOf(T(kMax - 1)), uint32_t(kMax - 1));
-
- EXPECT_EQ(vec.begin()[0], 0);
- EXPECT_EQ(vec.end()[-1], kMax - 1);
-
- EXPECT_EQ(vec.rbegin()[0], kMax - 1);
- EXPECT_EQ(vec.rend()[-1], 0);
-
- int64_t fsum = 0;
- int64_t rsum = 0;
-
- for (const T& item : vec) { fsum += item; }
- for (auto it = vec.rbegin(); it != vec.rend(); ++it) { rsum += *it; }
-
- EXPECT_EQ(fsum, rsum);
-
- vec.release(allocator);
-}
-
-static void test_zone_bitvector(ZoneAllocator* allocator) {
- Zone zone(8096 - Zone::kBlockOverhead);
-
- uint32_t i, count;
- uint32_t kMaxCount = 100;
-
- ZoneBitVector vec;
- EXPECT_TRUE(vec.empty());
- EXPECT_EQ(vec.size(), 0u);
-
- INFO("ZoneBitVector::resize()");
- for (count = 1; count < kMaxCount; count++) {
- vec.clear();
- EXPECT_EQ(vec.resize(allocator, count, false), kErrorOk);
- EXPECT_EQ(vec.size(), count);
-
- for (i = 0; i < count; i++)
- EXPECT_FALSE(vec.bitAt(i));
-
- vec.clear();
- EXPECT_EQ(vec.resize(allocator, count, true), kErrorOk);
- EXPECT_EQ(vec.size(), count);
-
- for (i = 0; i < count; i++)
- EXPECT_TRUE(vec.bitAt(i));
- }
-
- INFO("ZoneBitVector::fillBits() / clearBits()");
- for (count = 1; count < kMaxCount; count += 2) {
- vec.clear();
- EXPECT_EQ(vec.resize(allocator, count), kErrorOk);
- EXPECT_EQ(vec.size(), count);
-
- for (i = 0; i < (count + 1) / 2; i++) {
- bool value = bool(i & 1);
- if (value)
- vec.fillBits(i, count - i * 2);
- else
- vec.clearBits(i, count - i * 2);
- }
-
- for (i = 0; i < count; i++) {
- EXPECT_EQ(vec.bitAt(i), bool(i & 1));
- }
- }
-}
-
-UNIT(zone_vector) {
- Zone zone(8096 - Zone::kBlockOverhead);
- ZoneAllocator allocator(&zone);
-
- test_zone_vector<int>(&allocator, "int");
- test_zone_vector<int64_t>(&allocator, "int64_t");
- test_zone_bitvector(&allocator);
-}
-#endif
-
-ASMJIT_END_NAMESPACE
diff --git a/3rdparty/asmjit/src/asmjit/core/zonevector.h b/3rdparty/asmjit/src/asmjit/core/zonevector.h
deleted file mode 100644
index 13d28bbefa2..00000000000
--- a/3rdparty/asmjit/src/asmjit/core/zonevector.h
+++ /dev/null
@@ -1,729 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_CORE_ZONEVECTOR_H_INCLUDED
-#define ASMJIT_CORE_ZONEVECTOR_H_INCLUDED
-
-#include "../core/support.h"
-#include "../core/zone.h"
-
-ASMJIT_BEGIN_NAMESPACE
-
-//! \addtogroup asmjit_zone
-//! \{
-
-//! Base class used by \ref ZoneVector template.
-class ZoneVectorBase {
-public:
- ASMJIT_NONCOPYABLE(ZoneVectorBase)
-
- // STL compatibility;
- typedef uint32_t size_type;
- typedef ptrdiff_t difference_type;
-
- //! Vector data (untyped).
- void* _data = nullptr;
- //! Size of the vector.
- size_type _size = 0;
- //! Capacity of the vector.
- size_type _capacity = 0;
-
-protected:
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a new instance of `ZoneVectorBase`.
- inline ZoneVectorBase() noexcept {}
-
- inline ZoneVectorBase(ZoneVectorBase&& other) noexcept
- : _data(other._data),
- _size(other._size),
- _capacity(other._capacity) {}
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal
- //! \{
-
- inline void _release(ZoneAllocator* allocator, uint32_t sizeOfT) noexcept {
- if (_data != nullptr) {
- allocator->release(_data, _capacity * sizeOfT);
- reset();
- }
- }
-
- ASMJIT_API Error _grow(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept;
- ASMJIT_API Error _resize(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept;
- ASMJIT_API Error _reserve(ZoneAllocator* allocator, uint32_t sizeOfT, uint32_t n) noexcept;
-
- inline void _swap(ZoneVectorBase& other) noexcept {
- std::swap(_data, other._data);
- std::swap(_size, other._size);
- std::swap(_capacity, other._capacity);
- }
-
- //! \}
- //! \endcond
-
-public:
- //! \name Accessors
- //! \{
-
- //! Tests whether the vector is empty.
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; }
- //! Returns the vector size.
- ASMJIT_INLINE_NODEBUG size_type size() const noexcept { return _size; }
- //! Returns the vector capacity.
- ASMJIT_INLINE_NODEBUG size_type capacity() const noexcept { return _capacity; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Makes the vector empty (won't change the capacity or data pointer).
- ASMJIT_INLINE_NODEBUG void clear() noexcept { _size = 0; }
- //! Resets the vector data and set its `size` to zero.
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _data = nullptr;
- _size = 0;
- _capacity = 0;
- }
-
- //! Truncates the vector to at most `n` items.
- ASMJIT_INLINE_NODEBUG void truncate(size_type n) noexcept {
- _size = Support::min(_size, n);
- }
-
- //! Sets size of the vector to `n`. Used internally by some algorithms.
- inline void _setSize(size_type n) noexcept {
- ASMJIT_ASSERT(n <= _capacity);
- _size = n;
- }
-
- //! \}
-};
-
-//! Template used to store and manage array of Zone allocated data.
-//!
-//! This template has these advantages over other std::vector<>:
-//! - Always non-copyable (designed to be non-copyable, we want it).
-//! - Optimized for working only with POD types.
-//! - Uses ZoneAllocator, thus small vectors are almost for free.
-//! - Explicit allocation, ZoneAllocator is not part of the data.
-template <typename T>
-class ZoneVector : public ZoneVectorBase {
-public:
- ASMJIT_NONCOPYABLE(ZoneVector)
-
- // STL compatibility;
- typedef T value_type;
- typedef T* pointer;
- typedef const T* const_pointer;
- typedef T& reference;
- typedef const T& const_reference;
-
- typedef T* iterator;
- typedef const T* const_iterator;
- typedef Support::ArrayReverseIterator<T> reverse_iterator;
- typedef Support::ArrayReverseIterator<const T> const_reverse_iterator;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneVector() noexcept : ZoneVectorBase() {}
- ASMJIT_INLINE_NODEBUG ZoneVector(ZoneVector&& other) noexcept : ZoneVector(other) {}
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns vector data.
- ASMJIT_INLINE_NODEBUG T* data() noexcept { return static_cast<T*>(_data); }
- //! Returns vector data (const)
- ASMJIT_INLINE_NODEBUG const T* data() const noexcept { return static_cast<const T*>(_data); }
-
- //! Returns item at the given index `i` (const).
- inline const T& at(size_t i) const noexcept {
- ASMJIT_ASSERT(i < _size);
- return data()[i];
- }
-
- inline void _setEndPtr(T* p) noexcept {
- ASMJIT_ASSERT(p >= data() && p <= data() + _capacity);
- _setSize(uint32_t((uintptr_t)(p - data())));
- }
-
- //! \}
-
- //! \name STL Compatibility (Iterators)
- //! \{
-
- ASMJIT_INLINE_NODEBUG iterator begin() noexcept { return iterator(data()); };
- ASMJIT_INLINE_NODEBUG const_iterator begin() const noexcept { return const_iterator(data()); };
-
- ASMJIT_INLINE_NODEBUG iterator end() noexcept { return iterator(data() + _size); };
- ASMJIT_INLINE_NODEBUG const_iterator end() const noexcept { return const_iterator(data() + _size); };
-
- ASMJIT_INLINE_NODEBUG reverse_iterator rbegin() noexcept { return reverse_iterator(end()); };
- ASMJIT_INLINE_NODEBUG const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); };
-
- ASMJIT_INLINE_NODEBUG reverse_iterator rend() noexcept { return reverse_iterator(begin()); };
- ASMJIT_INLINE_NODEBUG const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); };
-
- ASMJIT_INLINE_NODEBUG const_iterator cbegin() const noexcept { return const_iterator(data()); };
- ASMJIT_INLINE_NODEBUG const_iterator cend() const noexcept { return const_iterator(data() + _size); };
-
- ASMJIT_INLINE_NODEBUG const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); };
- ASMJIT_INLINE_NODEBUG const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); };
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- //! Swaps this vector with `other`.
- ASMJIT_FORCE_INLINE void swap(ZoneVector<T>& other) noexcept { _swap(other); }
-
- //! Prepends `item` to the vector.
- ASMJIT_FORCE_INLINE Error prepend(ZoneAllocator* allocator, const T& item) noexcept {
- if (ASMJIT_UNLIKELY(_size == _capacity))
- ASMJIT_PROPAGATE(grow(allocator, 1));
-
- memmove(static_cast<void*>(static_cast<T*>(_data) + 1),
- static_cast<const void*>(_data),
- size_t(_size) * sizeof(T));
-
- memcpy(static_cast<void*>(_data),
- static_cast<const void*>(&item),
- sizeof(T));
-
- _size++;
- return kErrorOk;
- }
-
- //! Inserts an `item` at the specified `index`.
- ASMJIT_FORCE_INLINE Error insert(ZoneAllocator* allocator, size_t index, const T& item) noexcept {
- ASMJIT_ASSERT(index <= _size);
-
- if (ASMJIT_UNLIKELY(_size == _capacity))
- ASMJIT_PROPAGATE(grow(allocator, 1));
-
- T* dst = static_cast<T*>(_data) + index;
- memmove(static_cast<void*>(dst + 1),
- static_cast<const void*>(dst),
- size_t(_size - index) * sizeof(T));
-
- memcpy(static_cast<void*>(dst),
- static_cast<const void*>(&item),
- sizeof(T));
-
- _size++;
- return kErrorOk;
- }
-
- //! Appends `item` to the vector.
- ASMJIT_FORCE_INLINE Error append(ZoneAllocator* allocator, const T& item) noexcept {
- if (ASMJIT_UNLIKELY(_size == _capacity))
- ASMJIT_PROPAGATE(grow(allocator, 1));
-
- memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
- static_cast<const void*>(&item),
- sizeof(T));
-
- _size++;
- return kErrorOk;
- }
-
- //! Appends `other` vector at the end of this vector.
- ASMJIT_FORCE_INLINE Error concat(ZoneAllocator* allocator, const ZoneVector<T>& other) noexcept {
- uint32_t size = other._size;
- if (_capacity - _size < size)
- ASMJIT_PROPAGATE(grow(allocator, size));
-
- if (size) {
- memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
- static_cast<const void*>(other._data),
- size_t(size) * sizeof(T));
- _size += size;
- }
-
- return kErrorOk;
- }
-
- //! Prepends `item` to the vector (unsafe case).
- //!
- //! Can only be used together with `willGrow()`. If `willGrow(N)` returns `kErrorOk` then N elements
- //! can be added to the vector without checking if there is a place for them. Used mostly internally.
- ASMJIT_FORCE_INLINE void prependUnsafe(const T& item) noexcept {
- ASMJIT_ASSERT(_size < _capacity);
- T* data = static_cast<T*>(_data);
-
- if (_size) {
- memmove(static_cast<void*>(data + 1),
- static_cast<const void*>(data),
- size_t(_size) * sizeof(T));
- }
-
- memcpy(static_cast<void*>(data),
- static_cast<const void*>(&item),
- sizeof(T));
- _size++;
- }
-
- //! Append s`item` to the vector (unsafe case).
- //!
- //! Can only be used together with `willGrow()`. If `willGrow(N)` returns `kErrorOk` then N elements
- //! can be added to the vector without checking if there is a place for them. Used mostly internally.
- ASMJIT_FORCE_INLINE void appendUnsafe(const T& item) noexcept {
- ASMJIT_ASSERT(_size < _capacity);
-
- memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
- static_cast<const void*>(&item),
- sizeof(T));
- _size++;
- }
-
- //! Inserts an `item` at the specified `index` (unsafe case).
- ASMJIT_FORCE_INLINE void insertUnsafe(size_t index, const T& item) noexcept {
- ASMJIT_ASSERT(_size < _capacity);
- ASMJIT_ASSERT(index <= _size);
-
- T* dst = static_cast<T*>(_data) + index;
- memmove(static_cast<void*>(dst + 1),
- static_cast<const void*>(dst),
- size_t(_size - index) * sizeof(T));
-
- memcpy(static_cast<void*>(dst),
- static_cast<const void*>(&item),
- sizeof(T));
-
- _size++;
- }
-
- //! Concatenates all items of `other` at the end of the vector.
- ASMJIT_FORCE_INLINE void concatUnsafe(const ZoneVector<T>& other) noexcept {
- uint32_t size = other._size;
- ASMJIT_ASSERT(_capacity - _size >= size);
-
- if (size) {
- memcpy(static_cast<void*>(static_cast<T*>(_data) + _size),
- static_cast<const void*>(other._data),
- size_t(size) * sizeof(T));
- _size += size;
- }
- }
-
- //! Returns index of the given `val` or `Globals::kNotFound` if it doesn't exist.
- ASMJIT_FORCE_INLINE uint32_t indexOf(const T& val) const noexcept {
- const T* data = static_cast<const T*>(_data);
- uint32_t size = _size;
-
- for (uint32_t i = 0; i < size; i++)
- if (data[i] == val)
- return i;
- return Globals::kNotFound;
- }
-
- //! Tests whether the vector contains `val`.
- inline bool contains(const T& val) const noexcept {
- return indexOf(val) != Globals::kNotFound;
- }
-
- //! Removes item at index `i`.
- inline void removeAt(size_t i) noexcept {
- ASMJIT_ASSERT(i < _size);
-
- T* data = static_cast<T*>(_data) + i;
- size_t size = --_size - i;
-
- if (size) {
- memmove(static_cast<void*>(data),
- static_cast<const void*>(data + 1),
- size_t(size) * sizeof(T));
- }
- }
-
- //! Pops the last element from the vector and returns it.
- inline T pop() noexcept {
- ASMJIT_ASSERT(_size > 0);
-
- uint32_t index = --_size;
- return data()[index];
- }
-
- template<typename CompareT = Support::Compare<Support::SortOrder::kAscending>>
- inline void sort(const CompareT& cmp = CompareT()) noexcept {
- Support::qSort<T, CompareT>(data(), size(), cmp);
- }
-
- //! Returns item at index `i`.
- inline T& operator[](size_t i) noexcept {
- ASMJIT_ASSERT(i < _size);
- return data()[i];
- }
-
- //! Returns item at index `i`.
- inline const T& operator[](size_t i) const noexcept {
- ASMJIT_ASSERT(i < _size);
- return data()[i];
- }
-
- //! Returns a reference to the first element of the vector.
- //!
- //! \note The vector must have at least one element. Attempting to use `first()` on empty vector will trigger
- //! an assertion failure in debug builds.
- ASMJIT_INLINE_NODEBUG T& first() noexcept { return operator[](0); }
- //! \overload
- ASMJIT_INLINE_NODEBUG const T& first() const noexcept { return operator[](0); }
-
- //! Returns a reference to the last element of the vector.
- //!
- //! \note The vector must have at least one element. Attempting to use `last()` on empty vector will trigger
- //! an assertion failure in debug builds.
- inline T& last() noexcept { return operator[](_size - 1); }
- //! \overload
- inline const T& last() const noexcept { return operator[](_size - 1); }
-
- //! \}
-
- //! \name Memory Management
- //! \{
-
- //! Releases the memory held by `ZoneVector<T>` back to the `allocator`.
- inline void release(ZoneAllocator* allocator) noexcept {
- _release(allocator, sizeof(T));
- }
-
- //! Called to grow the buffer to fit at least `n` elements more.
- inline Error grow(ZoneAllocator* allocator, uint32_t n) noexcept {
- return ZoneVectorBase::_grow(allocator, sizeof(T), n);
- }
-
- //! Resizes the vector to hold `n` elements.
- //!
- //! If `n` is greater than the current size then the additional elements' content will be initialized to zero.
- //! If `n` is less than the current size then the vector will be truncated to exactly `n` elements.
- inline Error resize(ZoneAllocator* allocator, uint32_t n) noexcept {
- return ZoneVectorBase::_resize(allocator, sizeof(T), n);
- }
-
- //! Reallocates the internal array to fit at least `n` items.
- inline Error reserve(ZoneAllocator* allocator, uint32_t n) noexcept {
- return n > _capacity ? ZoneVectorBase::_reserve(allocator, sizeof(T), n) : Error(kErrorOk);
- }
-
- inline Error willGrow(ZoneAllocator* allocator, uint32_t n = 1) noexcept {
- return _capacity - _size < n ? grow(allocator, n) : Error(kErrorOk);
- }
-
- //! \}
-};
-
-//! Zone-allocated bit vector.
-class ZoneBitVector {
-public:
- typedef Support::BitWord BitWord;
-
- ASMJIT_NONCOPYABLE(ZoneBitVector)
-
- //! \name Constants
- //! \{
-
- enum : uint32_t {
- kBitWordSizeInBits = Support::kBitWordSizeInBits
- };
-
- //! \}
-
- //! \name Members
- //! \{
-
- //! Bits.
- BitWord* _data = nullptr;
- //! Size of the bit-vector (in bits).
- uint32_t _size = 0;
- //! Capacity of the bit-vector (in bits).
- uint32_t _capacity = 0;
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal
- //! \{
-
- static ASMJIT_INLINE_NODEBUG uint32_t _wordsPerBits(uint32_t nBits) noexcept {
- return ((nBits + kBitWordSizeInBits - 1) / kBitWordSizeInBits);
- }
-
- static ASMJIT_INLINE_NODEBUG void _zeroBits(BitWord* dst, uint32_t nBitWords) noexcept {
- for (uint32_t i = 0; i < nBitWords; i++)
- dst[i] = 0;
- }
-
- static ASMJIT_INLINE_NODEBUG void _fillBits(BitWord* dst, uint32_t nBitWords) noexcept {
- for (uint32_t i = 0; i < nBitWords; i++)
- dst[i] = ~BitWord(0);
- }
-
- static ASMJIT_INLINE_NODEBUG void _copyBits(BitWord* dst, const BitWord* src, uint32_t nBitWords) noexcept {
- for (uint32_t i = 0; i < nBitWords; i++)
- dst[i] = src[i];
- }
-
- //! \}
- //! \endcond
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_INLINE_NODEBUG ZoneBitVector() noexcept {}
-
- ASMJIT_INLINE_NODEBUG ZoneBitVector(ZoneBitVector&& other) noexcept
- : _data(other._data),
- _size(other._size),
- _capacity(other._capacity) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG bool operator==(const ZoneBitVector& other) const noexcept { return equals(other); }
- ASMJIT_INLINE_NODEBUG bool operator!=(const ZoneBitVector& other) const noexcept { return !equals(other); }
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Tests whether the bit-vector is empty (has no bits).
- ASMJIT_INLINE_NODEBUG bool empty() const noexcept { return _size == 0; }
- //! Returns the size of this bit-vector (in bits).
- ASMJIT_INLINE_NODEBUG uint32_t size() const noexcept { return _size; }
- //! Returns the capacity of this bit-vector (in bits).
- ASMJIT_INLINE_NODEBUG uint32_t capacity() const noexcept { return _capacity; }
-
- //! Returns the size of the `BitWord[]` array in `BitWord` units.
- ASMJIT_INLINE_NODEBUG uint32_t sizeInBitWords() const noexcept { return _wordsPerBits(_size); }
- //! Returns the capacity of the `BitWord[]` array in `BitWord` units.
- ASMJIT_INLINE_NODEBUG uint32_t capacityInBitWords() const noexcept { return _wordsPerBits(_capacity); }
-
- //! Returns bit-vector data as `BitWord[]`.
- ASMJIT_INLINE_NODEBUG BitWord* data() noexcept { return _data; }
- //! \overload
- ASMJIT_INLINE_NODEBUG const BitWord* data() const noexcept { return _data; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_INLINE_NODEBUG void swap(ZoneBitVector& other) noexcept {
- std::swap(_data, other._data);
- std::swap(_size, other._size);
- std::swap(_capacity, other._capacity);
- }
-
- ASMJIT_INLINE_NODEBUG void clear() noexcept {
- _size = 0;
- }
-
- ASMJIT_INLINE_NODEBUG void reset() noexcept {
- _data = nullptr;
- _size = 0;
- _capacity = 0;
- }
-
- ASMJIT_INLINE_NODEBUG void truncate(uint32_t newSize) noexcept {
- _size = Support::min(_size, newSize);
- _clearUnusedBits();
- }
-
- inline bool bitAt(uint32_t index) const noexcept {
- ASMJIT_ASSERT(index < _size);
- return Support::bitVectorGetBit(_data, index);
- }
-
- inline void setBit(uint32_t index, bool value) noexcept {
- ASMJIT_ASSERT(index < _size);
- Support::bitVectorSetBit(_data, index, value);
- }
-
- inline void flipBit(uint32_t index) noexcept {
- ASMJIT_ASSERT(index < _size);
- Support::bitVectorFlipBit(_data, index);
- }
-
- ASMJIT_FORCE_INLINE Error append(ZoneAllocator* allocator, bool value) noexcept {
- uint32_t index = _size;
- if (ASMJIT_UNLIKELY(index >= _capacity))
- return _append(allocator, value);
-
- uint32_t idx = index / kBitWordSizeInBits;
- uint32_t bit = index % kBitWordSizeInBits;
-
- if (bit == 0)
- _data[idx] = BitWord(value) << bit;
- else
- _data[idx] |= BitWord(value) << bit;
-
- _size++;
- return kErrorOk;
- }
-
- ASMJIT_API Error copyFrom(ZoneAllocator* allocator, const ZoneBitVector& other) noexcept;
-
- ASMJIT_FORCE_INLINE void clearAll() noexcept {
- _zeroBits(_data, _wordsPerBits(_size));
- }
-
- ASMJIT_FORCE_INLINE void fillAll() noexcept {
- _fillBits(_data, _wordsPerBits(_size));
- _clearUnusedBits();
- }
-
- ASMJIT_FORCE_INLINE void clearBits(uint32_t start, uint32_t count) noexcept {
- ASMJIT_ASSERT(start <= _size);
- ASMJIT_ASSERT(_size - start >= count);
-
- Support::bitVectorClear(_data, start, count);
- }
-
- ASMJIT_FORCE_INLINE void fillBits(uint32_t start, uint32_t count) noexcept {
- ASMJIT_ASSERT(start <= _size);
- ASMJIT_ASSERT(_size - start >= count);
-
- Support::bitVectorFill(_data, start, count);
- }
-
- //! Performs a logical bitwise AND between bits specified in this array and bits in `other`. If `other` has less
- //! bits than `this` then all remaining bits are set to zero.
- //!
- //! \note The size of the BitVector is unaffected by this operation.
- ASMJIT_FORCE_INLINE void and_(const ZoneBitVector& other) noexcept {
- BitWord* dst = _data;
- const BitWord* src = other._data;
-
- uint32_t thisBitWordCount = sizeInBitWords();
- uint32_t otherBitWordCount = other.sizeInBitWords();
- uint32_t commonBitWordCount = Support::min(thisBitWordCount, otherBitWordCount);
-
- uint32_t i = 0;
- while (i < commonBitWordCount) {
- dst[i] = dst[i] & src[i];
- i++;
- }
-
- while (i < thisBitWordCount) {
- dst[i] = 0;
- i++;
- }
- }
-
- //! Performs a logical bitwise AND between bits specified in this array and negated bits in `other`. If `other`
- //! has less bits than `this` then all remaining bits are kept intact.
- //!
- //! \note The size of the BitVector is unaffected by this operation.
- ASMJIT_FORCE_INLINE void andNot(const ZoneBitVector& other) noexcept {
- BitWord* dst = _data;
- const BitWord* src = other._data;
-
- uint32_t commonBitWordCount = _wordsPerBits(Support::min(_size, other._size));
- for (uint32_t i = 0; i < commonBitWordCount; i++)
- dst[i] = dst[i] & ~src[i];
- }
-
- //! Performs a logical bitwise OP between bits specified in this array and bits in `other`. If `other` has less
- //! bits than `this` then all remaining bits are kept intact.
- //!
- //! \note The size of the BitVector is unaffected by this operation.
- ASMJIT_FORCE_INLINE void or_(const ZoneBitVector& other) noexcept {
- BitWord* dst = _data;
- const BitWord* src = other._data;
-
- uint32_t commonBitWordCount = _wordsPerBits(Support::min(_size, other._size));
- for (uint32_t i = 0; i < commonBitWordCount; i++)
- dst[i] = dst[i] | src[i];
- _clearUnusedBits();
- }
-
- ASMJIT_FORCE_INLINE void _clearUnusedBits() noexcept {
- uint32_t idx = _size / kBitWordSizeInBits;
- uint32_t bit = _size % kBitWordSizeInBits;
-
- if (!bit)
- return;
- _data[idx] &= (BitWord(1) << bit) - 1u;
- }
-
- ASMJIT_FORCE_INLINE bool equals(const ZoneBitVector& other) const noexcept {
- if (_size != other._size)
- return false;
-
- const BitWord* aData = _data;
- const BitWord* bData = other._data;
- uint32_t numBitWords = _wordsPerBits(_size);
-
- for (uint32_t i = 0; i < numBitWords; i++)
- if (aData[i] != bData[i])
- return false;
- return true;
- }
-
-#if !defined(ASMJIT_NO_DEPRECATED)
- ASMJIT_DEPRECATED("Use ZoneVector::equals() instead")
- ASMJIT_FORCE_INLINE bool eq(const ZoneBitVector& other) const noexcept { return equals(other); }
-#endif // !ASMJIT_NO_DEPRECATED
-
- //! \}
-
- //! \name Memory Management
- //! \{
-
- inline void release(ZoneAllocator* allocator) noexcept {
- if (!_data)
- return;
- allocator->release(_data, _capacity / 8);
- reset();
- }
-
- ASMJIT_INLINE_NODEBUG Error resize(ZoneAllocator* allocator, uint32_t newSize, bool newBitsValue = false) noexcept {
- return _resize(allocator, newSize, newSize, newBitsValue);
- }
-
- ASMJIT_API Error _resize(ZoneAllocator* allocator, uint32_t newSize, uint32_t idealCapacity, bool newBitsValue) noexcept;
- ASMJIT_API Error _append(ZoneAllocator* allocator, bool value) noexcept;
-
- //! \}
-
- //! \name Iterators
- //! \{
-
- class ForEachBitSet : public Support::BitVectorIterator<BitWord> {
- public:
- inline explicit ForEachBitSet(const ZoneBitVector& bitVector) noexcept
- : Support::BitVectorIterator<BitWord>(bitVector.data(), bitVector.sizeInBitWords()) {}
- };
-
- template<class Operator>
- class ForEachBitOp : public Support::BitVectorOpIterator<BitWord, Operator> {
- public:
- inline ForEachBitOp(const ZoneBitVector& a, const ZoneBitVector& b) noexcept
- : Support::BitVectorOpIterator<BitWord, Operator>(a.data(), b.data(), a.sizeInBitWords()) {
- ASMJIT_ASSERT(a.size() == b.size());
- }
- };
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_NAMESPACE
-
-#endif // ASMJIT_CORE_ZONEVECTOR_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86.h b/3rdparty/asmjit/src/asmjit/x86.h
deleted file mode 100644
index 84bc84bb2d9..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_H_INCLUDED
-#define ASMJIT_X86_H_INCLUDED
-
-//! \addtogroup asmjit_x86
-//!
-//! ### Namespace
-//!
-//! - \ref x86 - x86 namespace provides support for X86/X64 code generation.
-//!
-//! ### Emitters
-//!
-//! - \ref x86::Assembler - X86/X64 assembler (must read, provides examples).
-//! - \ref x86::Builder - X86/X64 builder.
-//! - \ref x86::Compiler - X86/X64 compiler.
-//! - \ref x86::Emitter - X86/X64 emitter (abstract).
-//!
-//! ### Supported Instructions
-//!
-//! - Emitters:
-//! - \ref x86::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility
-//! functions. The member functions provided are part of all X86 emitters.
-//! - \ref x86::EmitterImplicitT - Provides all instructions that use implicit operands, these cannot be used
-//! with \ref x86::Compiler.
-//!
-//! - Instruction representation:
-//! - \ref x86::Inst::Id - Provides instruction identifiers for both X86/X86_64 architectures.
-//! - \ref InstOptions - Provides generic and X86/X86_64 specific options.
-//!
-//! ### Register Operands
-//!
-//! - \ref x86::Reg - Base class for any X86 register.
-//! - \ref x86::Gp - General purpose register:
-//! - \ref x86::GpbLo - 8-bit low register.
-//! - \ref x86::GpbHi - 8-bit high register.
-//! - \ref x86::Gpw - 16-bit register.
-//! - \ref x86::Gpd - 32-bit register.
-//! - \ref x86::Gpq - 64-bit register (X64 only).
-//! - \ref x86::Vec - Vector (SIMD) register:
-//! - \ref x86::Xmm - 128-bit SIMD register (SSE+).
-//! - \ref x86::Ymm - 256-bit SIMD register (AVX+).
-//! - \ref x86::Zmm - 512-bit SIMD register (AVX512+).
-//! - \ref x86::Mm - 64-bit MMX register.
-//! - \ref x86::St - 80-bit FPU register.
-//! - \ref x86::KReg - opmask registers (AVX512+).
-//! - \ref x86::SReg - segment register.
-//! - \ref x86::CReg - control register.
-//! - \ref x86::DReg - debug register.
-//! - \ref x86::Bnd - bound register (discontinued).
-//! - \ref x86::Rip - relative instruction pointer.
-//!
-//! ### Memory Operands
-//!
-//! - \ref x86::Mem - X86/X64 memory operand that provides support for all X86 and X64 addressing features
-//! including absolute addresses, index scales, and segment override prefixes.
-//!
-//! ### Status and Control Words
-//!
-//! - \ref x86::FpuStatusWord - FPU status word bits / decomposition.
-//! - \ref x86::FpuControlWord - FPU control word bits / decomposition.
-//!
-//! ### Predicates (immediate values)
-//!
-//! - \ref x86::CmpImm - `CMP[PD|PS|SD|SS]` predicate (SSE+).
-//! - \ref x86::PCmpStrImm - `[V]PCMP[I|E]STR[I|M]` predicate (SSE4.1+, AVX+).
-//! - \ref x86::RoundImm - `[V]ROUND[PD|PS|SD|SS]` predicate (SSE+, AVX+).
-//! - \ref x86::VCmpImm - `VCMP[PD|PS|SD|SS]` predicate (AVX+).
-//! - \ref x86::VFixupImm - `VFIXUPIMM[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::VFPClassImm - `VFPCLASS[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::VGetMantImm - `VGETMANT[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::VPCmpImm - `VPCMP[U][B|W|D|Q]` predicate (AVX512+).
-//! - \ref x86::VPComImm - `VPCOM[U][B|W|D|Q]` predicate (XOP).
-//! - \ref x86::VRangeImm - `VRANGE[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::VReduceImm - `REDUCE[PD|PS|SD|SS]` predicate (AVX512+).
-//! - \ref x86::TLogImm - `VPTERNLOG[D|Q]` predicate and operations (AVX512+).
-
-#include "core.h"
-
-#include "asmjit-scope-begin.h"
-#include "x86/x86assembler.h"
-#include "x86/x86builder.h"
-#include "x86/x86compiler.h"
-#include "x86/x86emitter.h"
-#include "x86/x86globals.h"
-#include "x86/x86instdb.h"
-#include "x86/x86operand.h"
-#include "asmjit-scope-end.h"
-
-#endif // ASMJIT_X86_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h b/3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h
deleted file mode 100644
index 90ae5d54f2b..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86archtraits_p.h
+++ /dev/null
@@ -1,148 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
-#define ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/misc_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-//! X86 architecture traits (internal).
-static const constexpr ArchTraits x86ArchTraits = {
- // SP/FP/LR/PC.
- Gp::kIdSp, Gp::kIdBp, 0xFF, 0xFF,
-
- // Reserved.
- { 0, 0, 0 },
-
- // HW stack alignment.
- 1,
-
- // Min/Max stack offset
- 0x7FFFFFFFu, 0x7FFFFFFFu,
-
- // ISA features [Gp, Vec, Other0, Other1].
- {{
- InstHints::kRegSwap | InstHints::kPushPop,
- InstHints::kNoHints,
- InstHints::kNoHints,
- InstHints::kNoHints
- }},
-
- // Register signatures.
- #define V(index) OperandSignature{x86::RegTraits<RegType(index)>::kSignature}
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // RegTypeToTypeId.
- #define V(index) TypeId(x86::RegTraits<RegType(index)>::kTypeId)
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // TypeIdToRegType.
- #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kX86_GpbLo : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kX86_GpbLo : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kX86_Gpw : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kX86_Gpw : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kX86_Xmm : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kX86_Xmm : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask8) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask16) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask32) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask64) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx32) ? RegType::kX86_Mm : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx64) ? RegType::kX86_Mm : RegType::kNone)
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
- {
- ArchTypeNameId::kDB,
- ArchTypeNameId::kDW,
- ArchTypeNameId::kDD,
- ArchTypeNameId::kDQ
- }
-};
-
-//! X64 architecture traits (internal).
-static const constexpr ArchTraits x64ArchTraits = {
- // SP/FP/LR/PC.
- Gp::kIdSp, Gp::kIdBp, 0xFF, 0xFF,
-
- // Reserved.
- { 0, 0, 0 },
-
- // HW stack alignment.
- 1,
-
- // Min/Max stack offset
- 0x7FFFFFFFu, 0x7FFFFFFFu,
-
- // ISA features [Gp, Vec, Other0, Other1].
- {{
- InstHints::kRegSwap | InstHints::kPushPop,
- InstHints::kNoHints,
- InstHints::kNoHints,
- InstHints::kNoHints
- }},
-
- // Register signatures.
- #define V(index) OperandSignature{x86::RegTraits<RegType(index)>::kSignature}
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // RegTypeToTypeId.
- #define V(index) TypeId(x86::RegTraits<RegType(index)>::kTypeId)
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // TypeIdToRegType.
- #define V(index) (index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt8) ? RegType::kX86_GpbLo : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt8) ? RegType::kX86_GpbLo : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt16) ? RegType::kX86_Gpw : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt16) ? RegType::kX86_Gpw : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt32) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt32) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kInt64) ? RegType::kX86_Gpq : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUInt64) ? RegType::kX86_Gpq : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kIntPtr) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kUIntPtr) ? RegType::kX86_Gpd : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat32) ? RegType::kX86_Xmm : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kFloat64) ? RegType::kX86_Xmm : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask8) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask16) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask32) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMask64) ? RegType::kX86_KReg : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx32) ? RegType::kX86_Mm : \
- index + uint32_t(TypeId::_kBaseStart) == uint32_t(TypeId::kMmx64) ? RegType::kX86_Mm : RegType::kNone)
- {{ ASMJIT_LOOKUP_TABLE_32(V, 0) }},
- #undef V
-
- // Word names of 8-bit, 16-bit, 32-bit, and 64-bit quantities.
- {
- ArchTypeNameId::kDB,
- ArchTypeNameId::kDW,
- ArchTypeNameId::kDD,
- ArchTypeNameId::kDQ
- }
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86ARCHTRAITS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp b/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp
deleted file mode 100644
index f48c3b2c3b5..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86assembler.cpp
+++ /dev/null
@@ -1,5114 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86)
-
-#include "../core/assembler.h"
-#include "../core/codewriter_p.h"
-#include "../core/cpuinfo.h"
-#include "../core/emitterutils_p.h"
-#include "../core/formatter.h"
-#include "../core/logger.h"
-#include "../core/misc_p.h"
-#include "../core/support.h"
-#include "../x86/x86assembler.h"
-#include "../x86/x86emithelper_p.h"
-#include "../x86/x86instapi_p.h"
-#include "../x86/x86instdb_p.h"
-#include "../x86/x86formatter_p.h"
-#include "../x86/x86opcode_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-typedef Support::FastUInt8 FastUInt8;
-
-// x86::Assembler - Constants
-// ==========================
-
-//! X86 bytes used to encode important prefixes.
-enum X86Byte : uint32_t {
- //! 1-byte REX prefix mask.
- kX86ByteRex = 0x40,
-
- //! 1-byte REX.W component.
- kX86ByteRexW = 0x08,
-
- kX86ByteInvalidRex = 0x80,
-
- //! 2-byte VEX prefix:
- //! - `[0]` - `0xC5`.
- //! - `[1]` - `RvvvvLpp`.
- kX86ByteVex2 = 0xC5,
-
- //! 3-byte VEX prefix:
- //! - `[0]` - `0xC4`.
- //! - `[1]` - `RXBmmmmm`.
- //! - `[2]` - `WvvvvLpp`.
- kX86ByteVex3 = 0xC4,
-
- //! 3-byte XOP prefix:
- //! - `[0]` - `0x8F`.
- //! - `[1]` - `RXBmmmmm`.
- //! - `[2]` - `WvvvvLpp`.
- kX86ByteXop3 = 0x8F,
-
- //! 4-byte EVEX prefix:
- //! - `[0]` - `0x62`.
- //! - `[1]` - Payload0 or `P[ 7: 0]` - `[R X B R' 0 m m m]`.
- //! - `[2]` - Payload1 or `P[15: 8]` - `[W v v v v 1 p p]`.
- //! - `[3]` - Payload2 or `P[23:16]` - `[z L' L b V' a a a]`.
- //!
- //! Payload:
- //! - `P[ 2: 0]` - OPCODE: EVEX.mmmmm, only lowest 3 bits [2:0] used.
- //! - `P[ 3]` - ______: Must be 0.
- //! - `P[ 4]` - REG-ID: EVEX.R' - 5th bit of 'RRRRR'.
- //! - `P[ 5]` - REG-ID: EVEX.B - 4th bit of 'BBBBB'.
- //! - `P[ 6]` - REG-ID: EVEX.X - 5th bit of 'BBBBB' or 4th bit of 'XXXX' (with SIB).
- //! - `P[ 7]` - REG-ID: EVEX.R - 4th bit of 'RRRRR'.
- //! - `P[ 9: 8]` - OPCODE: EVEX.pp.
- //! - `P[ 10]` - ______: Must be 1.
- //! - `P[14:11]` - REG-ID: 4 bits of 'VVVV'.
- //! - `P[ 15]` - OPCODE: EVEX.W.
- //! - `P[18:16]` - REG-ID: K register k0...k7 (Merging/Zeroing Vector Ops).
- //! - `P[ 19]` - REG-ID: 5th bit of 'VVVVV'.
- //! - `P[ 20]` - OPCODE: Broadcast/Rounding Control/SAE bit.
- //! - `P[22.21]` - OPCODE: Vector Length (L' and L) / Rounding Control.
- //! - `P[ 23]` - OPCODE: Zeroing/Merging.
- kX86ByteEvex = 0x62
-};
-
-// AsmJit specific (used to encode VVVVV field in XOP/VEX/EVEX).
-enum VexVVVVV : uint32_t {
- kVexVVVVVShift = 7,
- kVexVVVVVMask = 0x1F << kVexVVVVVShift
-};
-
-//! Instruction 2-byte/3-byte opcode prefix definition.
-struct X86OpcodeMM {
- uint8_t size;
- uint8_t data[3];
-};
-
-//! Mandatory prefixes used to encode legacy [66, F3, F2] or [9B] byte.
-static const uint8_t x86OpcodePP[8] = { 0x00, 0x66, 0xF3, 0xF2, 0x00, 0x00, 0x00, 0x9B };
-
-//! Instruction 2-byte/3-byte opcode prefix data.
-static const X86OpcodeMM x86OpcodeMM[] = {
- { 0, { 0x00, 0x00, 0 } }, // #00 (0b0000).
- { 1, { 0x0F, 0x00, 0 } }, // #01 (0b0001).
- { 2, { 0x0F, 0x38, 0 } }, // #02 (0b0010).
- { 2, { 0x0F, 0x3A, 0 } }, // #03 (0b0011).
- { 2, { 0x0F, 0x01, 0 } }, // #04 (0b0100).
- { 0, { 0x00, 0x00, 0 } }, // #05 (0b0101).
- { 0, { 0x00, 0x00, 0 } }, // #06 (0b0110).
- { 0, { 0x00, 0x00, 0 } }, // #07 (0b0111).
- { 0, { 0x00, 0x00, 0 } }, // #08 (0b1000).
- { 0, { 0x00, 0x00, 0 } }, // #09 (0b1001).
- { 0, { 0x00, 0x00, 0 } }, // #0A (0b1010).
- { 0, { 0x00, 0x00, 0 } }, // #0B (0b1011).
- { 0, { 0x00, 0x00, 0 } }, // #0C (0b1100).
- { 0, { 0x00, 0x00, 0 } }, // #0D (0b1101).
- { 0, { 0x00, 0x00, 0 } }, // #0E (0b1110).
- { 0, { 0x00, 0x00, 0 } } // #0F (0b1111).
-};
-
-static const uint8_t x86SegmentPrefix[8] = {
- 0x00, // None.
- 0x26, // ES.
- 0x2E, // CS.
- 0x36, // SS.
- 0x3E, // DS.
- 0x64, // FS.
- 0x65 // GS.
-};
-
-static const uint32_t x86OpcodePushSReg[8] = {
- Opcode::k000000 | 0x00, // None.
- Opcode::k000000 | 0x06, // Push ES.
- Opcode::k000000 | 0x0E, // Push CS.
- Opcode::k000000 | 0x16, // Push SS.
- Opcode::k000000 | 0x1E, // Push DS.
- Opcode::k000F00 | 0xA0, // Push FS.
- Opcode::k000F00 | 0xA8 // Push GS.
-};
-
-static const uint32_t x86OpcodePopSReg[8] = {
- Opcode::k000000 | 0x00, // None.
- Opcode::k000000 | 0x07, // Pop ES.
- Opcode::k000000 | 0x00, // Pop CS.
- Opcode::k000000 | 0x17, // Pop SS.
- Opcode::k000000 | 0x1F, // Pop DS.
- Opcode::k000F00 | 0xA1, // Pop FS.
- Opcode::k000F00 | 0xA9 // Pop GS.
-};
-
-// x86::Assembler - X86MemInfo | X86VEXPrefix | X86LLByRegType | X86CDisp8Table
-// ============================================================================
-
-//! Memory operand's info bits.
-//!
-//! A lookup table that contains various information based on the BASE and INDEX information of a memory operand. This
-//! is much better and safer than playing with IFs in the code and can check for errors must faster and better.
-enum X86MemInfo_Enum {
- kX86MemInfo_0 = 0x00,
-
- kX86MemInfo_BaseGp = 0x01, //!< Has BASE reg, REX.B can be 1, compatible with REX.B byte.
- kX86MemInfo_Index = 0x02, //!< Has INDEX reg, REX.X can be 1, compatible with REX.X byte.
-
- kX86MemInfo_BaseLabel = 0x10, //!< Base is Label.
- kX86MemInfo_BaseRip = 0x20, //!< Base is RIP.
-
- kX86MemInfo_67H_X86 = 0x40, //!< Address-size override in 32-bit mode.
- kX86MemInfo_67H_X64 = 0x80, //!< Address-size override in 64-bit mode.
- kX86MemInfo_67H_Mask = 0xC0 //!< Contains all address-size override bits.
-};
-
-template<uint32_t X>
-struct X86MemInfo_T {
- enum : uint32_t {
- B = (X ) & 0x1F,
- I = (X >> 5) & 0x1F,
-
- kBase = (B >= uint32_t(RegType::kX86_Gpw) && B <= uint32_t(RegType::kX86_Gpq)) ? kX86MemInfo_BaseGp :
- (B == uint32_t(RegType::kX86_Rip) ) ? kX86MemInfo_BaseRip :
- (B == uint32_t(RegType::kLabelTag) ) ? kX86MemInfo_BaseLabel : 0,
-
- kIndex = (I >= uint32_t(RegType::kX86_Gpw) && I <= uint32_t(RegType::kX86_Gpq)) ? kX86MemInfo_Index :
- (I >= uint32_t(RegType::kX86_Xmm) && I <= uint32_t(RegType::kX86_Zmm)) ? kX86MemInfo_Index : 0,
-
- k67H = (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kNone) ) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kNone) ) ? kX86MemInfo_67H_X64 :
- (B == uint32_t(RegType::kNone) && I == uint32_t(RegType::kX86_Gpw)) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kNone) && I == uint32_t(RegType::kX86_Gpd)) ? kX86MemInfo_67H_X64 :
- (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Gpw)) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Gpd)) ? kX86MemInfo_67H_X64 :
- (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Xmm)) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Xmm)) ? kX86MemInfo_67H_X64 :
- (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Ymm)) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Ymm)) ? kX86MemInfo_67H_X64 :
- (B == uint32_t(RegType::kX86_Gpw) && I == uint32_t(RegType::kX86_Zmm)) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kX86_Gpd) && I == uint32_t(RegType::kX86_Zmm)) ? kX86MemInfo_67H_X64 :
- (B == uint32_t(RegType::kLabelTag) && I == uint32_t(RegType::kX86_Gpw)) ? kX86MemInfo_67H_X86 :
- (B == uint32_t(RegType::kLabelTag) && I == uint32_t(RegType::kX86_Gpd)) ? kX86MemInfo_67H_X64 : 0,
-
- kValue = kBase | kIndex | k67H | 0x04 | 0x08
- };
-};
-
-// The result stored in the LUT is a combination of
-// - 67H - Address override prefix - depends on BASE+INDEX register types and the target architecture.
-// - REX - A possible combination of REX.[B|X|R|W] bits in REX prefix where REX.B and REX.X are possibly
-// masked out, but REX.R and REX.W are kept as is.
-#define VALUE(x) X86MemInfo_T<x>::kValue
-static const uint8_t x86MemInfo[] = { ASMJIT_LOOKUP_TABLE_1024(VALUE, 0) };
-#undef VALUE
-
-// VEX3 or XOP xor bits applied to the opcode before emitted. The index to this table is 'mmmmm' value, which
-// contains all we need. This is only used by a 3 BYTE VEX and XOP prefixes, 2 BYTE VEX prefix is handled differently.
-// The idea is to minimize the difference between VEX3 vs XOP when encoding VEX or XOP instruction. This should
-// minimize the code required to emit such instructions and should also make it faster as we don't need any branch to
-// decide between VEX3 vs XOP.
-// ____ ___
-// [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP]
-#define VALUE(x) ((x & 0x08) ? kX86ByteXop3 : kX86ByteVex3) | (0xF << 19) | (0x7 << 13)
-static const uint32_t x86VEXPrefix[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
-#undef VALUE
-
-// Table that contains LL opcode field addressed by a register size / 16. It's used to propagate L.256 or L.512 when
-// YMM or ZMM registers are used, respectively.
-#define VALUE(x) (x & (64 >> 4)) ? Opcode::kLL_2 : \
- (x & (32 >> 4)) ? Opcode::kLL_1 : Opcode::kLL_0
-static const uint32_t x86LLBySizeDiv16[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
-#undef VALUE
-
-// Table that contains LL opcode field addressed by a register size / 16. It's used to propagate L.256 or L.512 when
-// YMM or ZMM registers are used, respectively.
-#define VALUE(x) x == uint32_t(RegType::kX86_Zmm) ? Opcode::kLL_2 : \
- x == uint32_t(RegType::kX86_Ymm) ? Opcode::kLL_1 : Opcode::kLL_0
-static const uint32_t x86LLByRegType[] = { ASMJIT_LOOKUP_TABLE_16(VALUE, 0) };
-#undef VALUE
-
-// Table that contains a scale (shift left) based on 'TTWLL' field and the instruction's tuple-type (TT) field. The
-// scale is then applied to the BASE-N stored in each opcode to calculate the final compressed displacement used by
-// all EVEX encoded instructions.
-template<uint32_t X>
-struct X86CDisp8SHL_T {
- enum {
- TT = (X >> 3) << Opcode::kCDTT_Shift,
- LL = (X >> 0) & 0x3,
- W = (X >> 2) & 0x1,
-
- kValue = (TT == Opcode::kCDTT_None ? ((LL==0) ? 0 : (LL==1) ? 0 : 0 ) :
- TT == Opcode::kCDTT_ByLL ? ((LL==0) ? 0 : (LL==1) ? 1 : 2 ) :
- TT == Opcode::kCDTT_T1W ? ((LL==0) ? W : (LL==1) ? 1+W : 2+W) :
- TT == Opcode::kCDTT_DUP ? ((LL==0) ? 0 : (LL==1) ? 2 : 3 ) : 0) << Opcode::kCDSHL_Shift
- };
-};
-
-#define VALUE(x) X86CDisp8SHL_T<x>::kValue
-static const uint32_t x86CDisp8SHL[] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
-#undef VALUE
-
-// Table that contains MOD byte of a 16-bit [BASE + disp] address.
-// 0xFF == Invalid.
-static const uint8_t x86Mod16BaseTable[8] = {
- 0xFF, // AX -> N/A.
- 0xFF, // CX -> N/A.
- 0xFF, // DX -> N/A.
- 0x07, // BX -> 111.
- 0xFF, // SP -> N/A.
- 0x06, // BP -> 110.
- 0x04, // SI -> 100.
- 0x05 // DI -> 101.
-};
-
-// Table that contains MOD byte of a 16-bit [BASE + INDEX + disp] combination.
-// 0xFF == Invalid.
-template<uint32_t X>
-struct X86Mod16BaseIndexTable_T {
- enum {
- B = X >> 3,
- I = X & 0x7,
-
- kValue = ((B == Gp::kIdBx && I == Gp::kIdSi) || (B == Gp::kIdSi && I == Gp::kIdBx)) ? 0x00 :
- ((B == Gp::kIdBx && I == Gp::kIdDi) || (B == Gp::kIdDi && I == Gp::kIdBx)) ? 0x01 :
- ((B == Gp::kIdBp && I == Gp::kIdSi) || (B == Gp::kIdSi && I == Gp::kIdBp)) ? 0x02 :
- ((B == Gp::kIdBp && I == Gp::kIdDi) || (B == Gp::kIdDi && I == Gp::kIdBp)) ? 0x03 : 0xFF
- };
-};
-
-#define VALUE(x) X86Mod16BaseIndexTable_T<x>::kValue
-static const uint8_t x86Mod16BaseIndexTable[] = { ASMJIT_LOOKUP_TABLE_64(VALUE, 0) };
-#undef VALUE
-
-// x86::Assembler - Helpers
-// ========================
-
-static ASMJIT_FORCE_INLINE bool x86IsJmpOrCall(InstId instId) noexcept {
- return instId == Inst::kIdJmp || instId == Inst::kIdCall;
-}
-
-static ASMJIT_FORCE_INLINE bool x86IsImplicitMem(const Operand_& op, uint32_t base) noexcept {
- return op.isMem() && op.as<Mem>().baseId() == base && !op.as<Mem>().hasOffset();
-}
-
-//! Combine `regId` and `vvvvvId` into a single value (used by AVX and AVX-512).
-static ASMJIT_FORCE_INLINE uint32_t x86PackRegAndVvvvv(uint32_t regId, uint32_t vvvvvId) noexcept {
- return regId + (vvvvvId << kVexVVVVVShift);
-}
-
-static ASMJIT_FORCE_INLINE uint32_t x86OpcodeLByVMem(const Operand_& op) noexcept {
- return x86LLByRegType[size_t(op.as<Mem>().indexType())];
-}
-
-static ASMJIT_FORCE_INLINE uint32_t x86OpcodeLBySize(uint32_t size) noexcept {
- return x86LLBySizeDiv16[size / 16];
-}
-
-//! Encode MOD byte.
-static ASMJIT_FORCE_INLINE uint32_t x86EncodeMod(uint32_t m, uint32_t o, uint32_t rm) noexcept {
- ASMJIT_ASSERT(m <= 3);
- ASMJIT_ASSERT(o <= 7);
- ASMJIT_ASSERT(rm <= 7);
- return (m << 6) + (o << 3) + rm;
-}
-
-//! Encode SIB byte.
-static ASMJIT_FORCE_INLINE uint32_t x86EncodeSib(uint32_t s, uint32_t i, uint32_t b) noexcept {
- ASMJIT_ASSERT(s <= 3);
- ASMJIT_ASSERT(i <= 7);
- ASMJIT_ASSERT(b <= 7);
- return (s << 6) + (i << 3) + b;
-}
-
-static ASMJIT_FORCE_INLINE bool x86IsRexInvalid(uint32_t rex) noexcept {
- // Validates the following possibilities:
- // REX == 0x00 -> OKAY (X86_32 / X86_64).
- // REX == 0x40-0x4F -> OKAY (X86_64).
- // REX == 0x80 -> OKAY (X86_32 mode, rex prefix not used).
- // REX == 0x81-0xCF -> BAD (X86_32 mode, rex prefix used).
- return rex > kX86ByteInvalidRex;
-}
-
-static ASMJIT_FORCE_INLINE uint32_t x86GetForceEvex3MaskInLastBit(InstOptions options) noexcept {
- constexpr uint32_t kVex3Bit = Support::ConstCTZ<uint32_t(InstOptions::kX86_Vex3)>::value;
- return uint32_t(options & InstOptions::kX86_Vex3) << (31 - kVex3Bit);
-}
-
-template<typename T>
-static ASMJIT_FORCE_INLINE constexpr T x86SignExtendI32(T imm) noexcept { return T(int64_t(int32_t(imm & T(0xFFFFFFFF)))); }
-
-static ASMJIT_FORCE_INLINE uint32_t x86AltOpcodeOf(const InstDB::InstInfo* info) noexcept {
- return InstDB::_altOpcodeTable[info->_altOpcodeIndex];
-}
-
-// x86::Assembler - X86BufferWriter
-// ================================
-
-class X86BufferWriter : public CodeWriter {
-public:
- ASMJIT_FORCE_INLINE explicit X86BufferWriter(Assembler* a) noexcept
- : CodeWriter(a) {}
-
- ASMJIT_FORCE_INLINE void emitPP(uint32_t opcode) noexcept {
- uint32_t ppIndex = (opcode >> Opcode::kPP_Shift) &
- (Opcode::kPP_FPUMask >> Opcode::kPP_Shift) ;
- emit8If(x86OpcodePP[ppIndex], ppIndex != 0);
- }
-
- ASMJIT_FORCE_INLINE void emitMMAndOpcode(uint32_t opcode) noexcept {
- uint32_t mmIndex = (opcode & Opcode::kMM_Mask) >> Opcode::kMM_Shift;
- const X86OpcodeMM& mmCode = x86OpcodeMM[mmIndex];
-
- emit8If(mmCode.data[0], mmCode.size > 0);
- emit8If(mmCode.data[1], mmCode.size > 1);
- emit8(opcode);
- }
-
- ASMJIT_FORCE_INLINE void emitSegmentOverride(uint32_t segmentId) noexcept {
- ASMJIT_ASSERT(segmentId < ASMJIT_ARRAY_SIZE(x86SegmentPrefix));
-
- FastUInt8 prefix = x86SegmentPrefix[segmentId];
- emit8If(prefix, prefix != 0);
- }
-
- template<typename CondT>
- ASMJIT_FORCE_INLINE void emitAddressOverride(CondT condition) noexcept {
- emit8If(0x67, condition);
- }
-
- ASMJIT_FORCE_INLINE void emitImmByteOrDWord(uint64_t immValue, FastUInt8 immSize) noexcept {
- if (!immSize)
- return;
-
- ASMJIT_ASSERT(immSize == 1 || immSize == 4);
-
-#if ASMJIT_ARCH_BITS >= 64
- uint64_t imm = uint64_t(immValue);
-#else
- uint32_t imm = uint32_t(immValue & 0xFFFFFFFFu);
-#endif
-
- // Many instructions just use a single byte immediate, so make it fast.
- emit8(imm & 0xFFu);
- if (immSize == 1) return;
-
- imm >>= 8;
- emit8(imm & 0xFFu);
- imm >>= 8;
- emit8(imm & 0xFFu);
- imm >>= 8;
- emit8(imm & 0xFFu);
- }
-
- ASMJIT_FORCE_INLINE void emitImmediate(uint64_t immValue, FastUInt8 immSize) noexcept {
-#if ASMJIT_ARCH_BITS >= 64
- uint64_t imm = immValue;
- if (immSize >= 4) {
- emit32uLE(imm & 0xFFFFFFFFu);
- imm >>= 32;
- immSize = FastUInt8(immSize - 4u);
- }
-#else
- uint32_t imm = uint32_t(immValue & 0xFFFFFFFFu);
- if (immSize >= 4) {
- emit32uLE(imm);
- imm = uint32_t(immValue >> 32);
- immSize = FastUInt8(immSize - 4u);
- }
-#endif
-
- if (!immSize)
- return;
- emit8(imm & 0xFFu);
- imm >>= 8;
-
- if (--immSize == 0)
- return;
- emit8(imm & 0xFFu);
- imm >>= 8;
-
- if (--immSize == 0)
- return;
- emit8(imm & 0xFFu);
- imm >>= 8;
-
- if (--immSize == 0)
- return;
- emit8(imm & 0xFFu);
- }
-};
-
-// If the operand is BPL|SPL|SIL|DIL|R8B-15B
-// - Force REX prefix
-// If the operand is AH|BH|CH|DH
-// - patch its index from 0..3 to 4..7 as encoded by X86.
-// - Disallow REX prefix.
-#define FIXUP_GPB(REG_OP, REG_ID) \
- do { \
- if (!static_cast<const Gp&>(REG_OP).isGpbHi()) { \
- options |= (REG_ID) >= 4 ? InstOptions::kX86_Rex \
- : InstOptions::kNone; \
- } \
- else { \
- options |= InstOptions::kX86_InvalidRex; \
- REG_ID += 4; \
- } \
- } while (0)
-
-#define ENC_OPS1(OP0) \
- (uint32_t(OperandType::k##OP0))
-
-#define ENC_OPS2(OP0, OP1) \
- (uint32_t(OperandType::k##OP0) + \
- (uint32_t(OperandType::k##OP1) << 3))
-
-#define ENC_OPS3(OP0, OP1, OP2) \
- (uint32_t(OperandType::k##OP0) + \
- (uint32_t(OperandType::k##OP1) << 3) + \
- (uint32_t(OperandType::k##OP2) << 6))
-
-#define ENC_OPS4(OP0, OP1, OP2, OP3) \
- (uint32_t(OperandType::k##OP0) + \
- (uint32_t(OperandType::k##OP1) << 3) + \
- (uint32_t(OperandType::k##OP2) << 6) + \
- (uint32_t(OperandType::k##OP3) << 9))
-
-// x86::Assembler - Movabs Heuristics
-// ==================================
-
-static ASMJIT_FORCE_INLINE uint32_t x86GetMovAbsInstSize64Bit(uint32_t regSize, InstOptions options, const Mem& rmRel) noexcept {
- uint32_t segmentPrefixSize = rmRel.segmentId() != 0;
- uint32_t _66hPrefixSize = regSize == 2;
- uint32_t rexPrefixSize = regSize == 8 || Support::test(options, InstOptions::kX86_Rex);
- uint32_t opCodeByteSize = 1;
- uint32_t immediateSize = 8;
-
- return segmentPrefixSize + _66hPrefixSize + rexPrefixSize + opCodeByteSize + immediateSize;
-}
-
-static ASMJIT_FORCE_INLINE bool x86ShouldUseMovabs(Assembler* self, X86BufferWriter& writer, uint32_t regSize, InstOptions options, const Mem& rmRel) noexcept {
- if (self->is32Bit()) {
- // There is no relative addressing, just decide whether to use MOV encoded with MOD R/M or absolute.
- return !Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModRM);
- }
- else {
- // If the addressing type is REL or MOD R/M was specified then absolute mov won't be used.
- if (rmRel.addrType() == Mem::AddrType::kRel || Support::test(options, InstOptions::kX86_ModMR | InstOptions::kX86_ModRM))
- return false;
-
- int64_t addrValue = rmRel.offset();
- uint64_t baseAddress = self->code()->baseAddress();
-
- // If the address type is default, it means to basically check whether relative addressing is possible. However,
- // this is only possible when the base address is known - relative encoding uses RIP+N it has to be calculated.
- if (rmRel.addrType() == Mem::AddrType::kDefault && baseAddress != Globals::kNoBaseAddress && !rmRel.hasSegment()) {
- uint32_t instructionSize = x86GetMovAbsInstSize64Bit(regSize, options, rmRel);
- uint64_t virtualOffset = uint64_t(writer.offsetFrom(self->_bufferData));
- uint64_t rip64 = baseAddress + self->_section->offset() + virtualOffset + instructionSize;
- uint64_t rel64 = uint64_t(addrValue) - rip64;
-
- if (Support::isInt32(int64_t(rel64)))
- return false;
- }
- else {
- if (Support::isInt32(addrValue))
- return false;
- }
-
- return uint64_t(addrValue) > 0xFFFFFFFFu;
- }
-}
-
-// x86::Assembler - Construction & Destruction
-// ===========================================
-
-Assembler::Assembler(CodeHolder* code) noexcept : BaseAssembler() {
- _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) |
- (uint64_t(1) << uint32_t(Arch::kX64)) ;
- if (code)
- code->attach(this);
-}
-Assembler::~Assembler() noexcept {}
-
-// x86::Assembler - Emit (Low-Level)
-// =================================
-
-ASMJIT_FAVOR_SPEED Error Assembler::_emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) {
- constexpr uint32_t kVSHR_W = Opcode::kW_Shift - 23;
- constexpr uint32_t kVSHR_PP = Opcode::kPP_Shift - 16;
- constexpr uint32_t kVSHR_PP_EW = Opcode::kPP_Shift - 16;
-
- constexpr InstOptions kRequiresSpecialHandling =
- InstOptions::kReserved | // Logging/Validation/Error.
- InstOptions::kX86_Rep | // REP/REPE prefix.
- InstOptions::kX86_Repne | // REPNE prefix.
- InstOptions::kX86_Lock | // LOCK prefix.
- InstOptions::kX86_XAcquire | // XACQUIRE prefix.
- InstOptions::kX86_XRelease ; // XRELEASE prefix.
-
- Error err;
-
- Opcode opcode; // Instruction opcode.
- InstOptions options; // Instruction options.
- uint32_t isign3; // A combined signature of first 3 operands.
-
- const Operand_* rmRel; // Memory operand or operand that holds Label|Imm.
- uint32_t rmInfo; // Memory operand's info based on x86MemInfo.
- uint32_t rbReg = 0; // Memory base or modRM register.
- uint32_t rxReg; // Memory index register.
- uint32_t opReg; // ModR/M opcode or register id.
-
- LabelEntry* label; // Label entry.
- RelocEntry* re = nullptr; // Relocation entry.
- int32_t relOffset; // Relative offset
- FastUInt8 relSize = 0; // Relative size.
- uint8_t* memOpAOMark = nullptr; // Marker that points before 'address-override prefix' is emitted.
-
- int64_t immValue = 0; // Immediate value (must be 64-bit).
- FastUInt8 immSize = 0; // Immediate size.
-
- X86BufferWriter writer(this);
-
- if (instId >= Inst::_kIdCount)
- instId = 0;
-
- const InstDB::InstInfo* instInfo = &InstDB::_instInfoTable[instId];
- const InstDB::CommonInfo* commonInfo = &instInfo->commonInfo();
-
- // Signature of the first 3 operands.
- isign3 = (uint32_t(o0.opType()) ) +
- (uint32_t(o1.opType()) << 3) +
- (uint32_t(o2.opType()) << 6);
-
- // Combine all instruction options and also check whether the instruction is valid. All options
- // that require special handling (including invalid instruction) are handled by the next branch.
- options = InstOptions((instId == 0) | ((size_t)(_bufferEnd - writer.cursor()) < 16)) | instOptions() | forcedInstOptions();
-
- // Handle failure and rare cases first.
- if (ASMJIT_UNLIKELY(Support::test(options, kRequiresSpecialHandling))) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- // Unknown instruction.
- if (ASMJIT_UNLIKELY(instId == 0))
- goto InvalidInstruction;
-
- // Grow request, happens rarely.
- err = writer.ensureSpace(this, 16);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
-#ifndef ASMJIT_NO_VALIDATION
- // Strict validation.
- if (hasDiagnosticOption(DiagnosticOptions::kValidateAssembler)) {
- Operand_ opArray[Globals::kMaxOpCount];
- EmitterUtils::opArrayFromEmitArgs(opArray, o0, o1, o2, opExt);
-
- err = _funcs.validate(BaseInst(instId, options, _extraReg), opArray, Globals::kMaxOpCount, ValidationFlags::kNone);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
- }
-#endif
-
- InstDB::InstFlags iFlags = instInfo->flags();
-
- // LOCK, XACQUIRE, and XRELEASE prefixes.
- if (Support::test(options, InstOptions::kX86_Lock)) {
- bool xAcqRel = Support::test(options, InstOptions::kX86_XAcquire | InstOptions::kX86_XRelease);
-
- if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kLock) && !xAcqRel))
- goto InvalidLockPrefix;
-
- if (xAcqRel) {
- if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XAcquire) && !Support::test(iFlags, InstDB::InstFlags::kXAcquire)))
- goto InvalidXAcquirePrefix;
-
- if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XRelease) && !Support::test(iFlags, InstDB::InstFlags::kXRelease)))
- goto InvalidXReleasePrefix;
-
- writer.emit8(Support::test(options, InstOptions::kX86_XAcquire) ? 0xF2 : 0xF3);
- }
-
- writer.emit8(0xF0);
- }
-
- // REP and REPNE prefixes.
- if (Support::test(options, InstOptions::kX86_Rep | InstOptions::kX86_Repne)) {
- if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kRep)))
- goto InvalidRepPrefix;
-
- if (ASMJIT_UNLIKELY(_extraReg.isReg() && (_extraReg.group() != RegGroup::kGp || _extraReg.id() != Gp::kIdCx)))
- goto InvalidRepPrefix;
-
- writer.emit8(Support::test(options, InstOptions::kX86_Repne) ? 0xF2 : 0xF3);
- }
- }
-
- // This sequence seems to be the fastest.
- opcode = InstDB::_mainOpcodeTable[instInfo->_mainOpcodeIndex];
- opReg = opcode.extractModO();
- opcode |= instInfo->_mainOpcodeValue;
-
- // Encoding Scope
- // --------------
-
- // How it works? Each case here represents a unique encoding of a group of instructions, which is handled
- // separately. The handlers check instruction signature, possibly register types, etc, and process this
- // information by writing some bits to opcode, opReg/rbReg, immValue/immSize, etc, and then at the end of
- // the sequence it uses goto to jump into a lower level handler, that actually encodes the instruction.
-
- switch (instInfo->_encoding) {
- case InstDB::kEncodingNone:
- goto EmitDone;
-
- // Base Instructions
- // -----------------
-
- case InstDB::kEncodingX86Op:
- goto EmitX86Op;
-
- case InstDB::kEncodingX86Op_Mod11RM:
- rbReg = opcode.extractModRM();
- goto EmitX86R;
-
- case InstDB::kEncodingX86Op_Mod11RM_I8:
- // The first operand must be immediate, we don't care of other operands as they could be implicit.
- if (!o0.isImm())
- goto InvalidInstruction;
-
- rbReg = opcode.extractModRM();
- immValue = o0.as<Imm>().valueAs<uint8_t>();
- immSize = 1;
- goto EmitX86R;
-
- case InstDB::kEncodingX86Op_xAddr:
- if (ASMJIT_UNLIKELY(!o0.isReg()))
- goto InvalidInstruction;
-
- rmInfo = x86MemInfo[size_t(o0.as<Reg>().type())];
- writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
- goto EmitX86Op;
-
- case InstDB::kEncodingX86Op_xAX:
- if (isign3 == 0)
- goto EmitX86Op;
-
- if (isign3 == ENC_OPS1(Reg) && o0.id() == Gp::kIdAx)
- goto EmitX86Op;
- break;
-
- case InstDB::kEncodingX86Op_xDX_xAX:
- if (isign3 == 0)
- goto EmitX86Op;
-
- if (isign3 == ENC_OPS2(Reg, Reg) && o0.id() == Gp::kIdDx && o1.id() == Gp::kIdAx)
- goto EmitX86Op;
- break;
-
- case InstDB::kEncodingX86Op_MemZAX:
- if (isign3 == 0)
- goto EmitX86Op;
-
- rmRel = &o0;
- if (isign3 == ENC_OPS1(Mem) && x86IsImplicitMem(o0, Gp::kIdAx))
- goto EmitX86OpImplicitMem;
-
- break;
-
- case InstDB::kEncodingX86I_xAX:
- // Implicit form.
- if (isign3 == ENC_OPS1(Imm)) {
- immValue = o0.as<Imm>().valueAs<uint8_t>();
- immSize = 1;
- goto EmitX86Op;
- }
-
- // Explicit form.
- if (isign3 == ENC_OPS2(Reg, Imm) && o0.id() == Gp::kIdAx) {
- immValue = o1.as<Imm>().valueAs<uint8_t>();
- immSize = 1;
- goto EmitX86Op;
- }
- break;
-
- case InstDB::kEncodingX86M_NoMemSize:
- if (o0.isReg())
- opcode.addPrefixBySize(o0.x86RmSize());
- goto CaseX86M_NoSize;
-
- case InstDB::kEncodingX86M:
- opcode.addPrefixBySize(o0.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86M_NoSize:
-CaseX86M_NoSize:
- rbReg = o0.id();
- if (isign3 == ENC_OPS1(Reg))
- goto EmitX86R;
-
- rmRel = &o0;
- if (isign3 == ENC_OPS1(Mem))
- goto EmitX86M;
- break;
-
- case InstDB::kEncodingX86M_GPB_MulDiv:
-CaseX86M_GPB_MulDiv:
- // Explicit form?
- if (isign3 > 0x7) {
- // [AX] <- [AX] div|mul r8.
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (ASMJIT_UNLIKELY(!Reg::isGpw(o0, Gp::kIdAx) || !Reg::isGpb(o1)))
- goto InvalidInstruction;
-
- rbReg = o1.id();
- FIXUP_GPB(o1, rbReg);
- goto EmitX86R;
- }
-
- // [AX] <- [AX] div|mul m8.
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- if (ASMJIT_UNLIKELY(!Reg::isGpw(o0, Gp::kIdAx)))
- goto InvalidInstruction;
-
- rmRel = &o1;
- goto EmitX86M;
- }
-
- // [?DX:?AX] <- [?DX:?AX] div|mul r16|r32|r64
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() != o1.x86RmSize()))
- goto InvalidInstruction;
-
- opcode.addArithBySize(o0.x86RmSize());
- rbReg = o2.id();
- goto EmitX86R;
- }
-
- // [?DX:?AX] <- [?DX:?AX] div|mul m16|m32|m64
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() != o1.x86RmSize()))
- goto InvalidInstruction;
-
- opcode.addArithBySize(o0.x86RmSize());
- rmRel = &o2;
- goto EmitX86M;
- }
-
- goto InvalidInstruction;
- }
-
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86M_GPB:
- if (isign3 == ENC_OPS1(Reg)) {
- opcode.addArithBySize(o0.x86RmSize());
- rbReg = o0.id();
-
- if (o0.x86RmSize() != 1)
- goto EmitX86R;
-
- FIXUP_GPB(o0, rbReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0))
- goto AmbiguousOperandSize;
-
- opcode.addArithBySize(o0.x86RmSize());
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86M_Only_EDX_EAX:
- if (isign3 == ENC_OPS3(Mem, Reg, Reg) && Reg::isGpd(o1, Gp::kIdDx) && Reg::isGpd(o2, Gp::kIdAx)) {
- rmRel = &o0;
- goto EmitX86M;
- }
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86M_Only:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86M_Nop:
- if (isign3 == ENC_OPS1(None))
- goto EmitX86Op;
-
- // Single operand NOP instruction "0F 1F /0".
- opcode = Opcode::k000F00 | 0x1F;
- opReg = 0;
-
- if (isign3 == ENC_OPS1(Reg)) {
- opcode.addPrefixBySize(o0.x86RmSize());
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- opcode.addPrefixBySize(o0.x86RmSize());
- rmRel = &o0;
- goto EmitX86M;
- }
-
- // Two operand NOP instruction "0F 1F /r".
- opReg = o1.id();
- opcode.addPrefixBySize(o1.x86RmSize());
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86R_FromM:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- rbReg = o0.id();
- goto EmitX86RFromM;
- }
- break;
-
- case InstDB::kEncodingX86R32_EDX_EAX:
- // Explicit form: R32, EDX, EAX.
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- if (!Reg::isGpd(o1, Gp::kIdDx) || !Reg::isGpd(o2, Gp::kIdAx))
- goto InvalidInstruction;
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- // Implicit form: R32.
- if (isign3 == ENC_OPS1(Reg)) {
- if (!Reg::isGpd(o0))
- goto InvalidInstruction;
- rbReg = o0.id();
- goto EmitX86R;
- }
- break;
-
- case InstDB::kEncodingX86R_Native:
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
- goto EmitX86R;
- }
- break;
-
- case InstDB::kEncodingX86Rm:
- opcode.addPrefixBySize(o0.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86Rm_NoSize:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Rm_Raw66H:
- // We normally emit either [66|F2|F3], this instruction requires 66+[F2|F3].
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- if (o0.x86RmSize() == 2)
- writer.emit8(0x66);
- else
- opcode.addWBySize(o0.x86RmSize());
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
-
- if (o0.x86RmSize() == 2)
- writer.emit8(0x66);
- else
- opcode.addWBySize(o0.x86RmSize());
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Mr:
- opcode.addPrefixBySize(o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86Mr_NoSize:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- rbReg = o0.id();
- opReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- rmRel = &o0;
- opReg = o1.id();
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Arith:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opcode.addArithBySize(o0.x86RmSize());
-
- if (o0.x86RmSize() != o1.x86RmSize())
- goto OperandSizeMismatch;
-
- rbReg = o0.id();
- opReg = o1.id();
-
- if (o0.x86RmSize() == 1) {
- FIXUP_GPB(o0, rbReg);
- FIXUP_GPB(o1, opReg);
- }
-
- // MOD/MR: The default encoding used if not instructed otherwise..
- if (!Support::test(options, InstOptions::kX86_ModRM))
- goto EmitX86R;
-
- // MOD/RM: Alternative encoding selected via instruction options.
- opcode += 2u;
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode += 2u;
- opcode.addArithBySize(o0.x86RmSize());
-
- opReg = o0.id();
- rmRel = &o1;
-
- if (o0.x86RmSize() != 1)
- goto EmitX86M;
-
- FIXUP_GPB(o0, opReg);
- goto EmitX86M;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.addArithBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
-
- if (o1.x86RmSize() != 1)
- goto EmitX86M;
-
- FIXUP_GPB(o1, opReg);
- goto EmitX86M;
- }
-
- // The remaining instructions use 0x80 opcode.
- opcode = 0x80;
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- uint32_t size = o0.x86RmSize();
-
- rbReg = o0.id();
- immValue = o1.as<Imm>().value();
-
- if (size == 1) {
- FIXUP_GPB(o0, rbReg);
- immSize = 1;
- }
- else {
- if (size == 2) {
- opcode |= Opcode::kPP_66;
- }
- else if (size == 4) {
- // Sign extend so isInt8 returns the right result.
- immValue = x86SignExtendI32<int64_t>(immValue);
- }
- else if (size == 8) {
- bool canTransformTo32Bit = instId == Inst::kIdAnd && Support::isUInt32(immValue);
-
- if (!Support::isInt32(immValue)) {
- // We would do this by default when `kOptionOptimizedForSize` is
- // enabled, however, in this case we just force this as otherwise
- // we would have to fail.
- if (canTransformTo32Bit)
- size = 4;
- else
- goto InvalidImmediate;
- }
- else if (canTransformTo32Bit && hasEncodingOption(EncodingOptions::kOptimizeForSize)) {
- size = 4;
- }
-
- opcode.addWBySize(size);
- }
-
- immSize = FastUInt8(Support::min<uint32_t>(size, 4));
- if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm))
- immSize = 1;
- }
-
- // Short form - AL, AX, EAX, RAX.
- if (rbReg == 0 && (size == 1 || immSize != 1) && !Support::test(options, InstOptions::kLongForm)) {
- opcode &= Opcode::kPP_66 | Opcode::kW;
- opcode |= ((opReg << 3) | (0x04 + (size != 1)));
- immSize = FastUInt8(Support::min<uint32_t>(size, 4));
- goto EmitX86Op;
- }
-
- opcode += size != 1 ? (immSize != 1 ? 1u : 3u) : 0u;
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Imm)) {
- uint32_t memSize = o0.x86RmSize();
-
- if (ASMJIT_UNLIKELY(memSize == 0))
- goto AmbiguousOperandSize;
-
- immValue = o1.as<Imm>().value();
- immSize = FastUInt8(Support::min<uint32_t>(memSize, 4));
-
- // Sign extend so isInt8 returns the right result.
- if (memSize == 4)
- immValue = x86SignExtendI32<int64_t>(immValue);
-
- if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm))
- immSize = 1;
-
- opcode += memSize != 1 ? (immSize != 1 ? 1u : 3u) : 0u;
- opcode.addPrefixBySize(memSize);
-
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Bswap:
- if (isign3 == ENC_OPS1(Reg)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() == 1))
- goto InvalidInstruction;
-
- opReg = o0.id();
- opcode.addPrefixBySize(o0.x86RmSize());
- goto EmitX86OpReg;
- }
- break;
-
- case InstDB::kEncodingX86Bt:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
-
- // The remaining instructions use the secondary opcode/r.
- immValue = o1.as<Imm>().value();
- immSize = 1;
-
- opcode = x86AltOpcodeOf(instInfo);
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg = opcode.extractModO();
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Imm)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0))
- goto AmbiguousOperandSize;
-
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Call:
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- rmRel = &o0;
- if (isign3 == ENC_OPS1(Mem))
- goto EmitX86M;
-
- // Call with 32-bit displacement use 0xE8 opcode. Call with 8-bit displacement is not encodable so the
- // alternative opcode field in X86DB must be zero.
- opcode = 0xE8;
- opReg = 0;
- goto EmitJmpCall;
-
- case InstDB::kEncodingX86Cmpxchg: {
- // Convert explicit to implicit.
- if (isign3 & (0x7 << 6)) {
- if (!Reg::isGp(o2) || o2.id() != Gp::kIdAx)
- goto InvalidInstruction;
- isign3 &= 0x3F;
- }
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (o0.x86RmSize() != o1.x86RmSize())
- goto OperandSizeMismatch;
-
- opcode.addArithBySize(o0.x86RmSize());
- rbReg = o0.id();
- opReg = o1.id();
-
- if (o0.x86RmSize() != 1)
- goto EmitX86R;
-
- FIXUP_GPB(o0, rbReg);
- FIXUP_GPB(o1, opReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.addArithBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
-
- if (o1.x86RmSize() != 1)
- goto EmitX86M;
-
- FIXUP_GPB(o1, opReg);
- goto EmitX86M;
- }
- break;
- }
-
- case InstDB::kEncodingX86Cmpxchg8b_16b: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
-
- if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
- if (o3.isReg() && o4.isReg()) {
- rmRel = &o0;
- goto EmitX86M;
- }
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
- }
-
- case InstDB::kEncodingX86Crc:
- opReg = o0.id();
- opcode.addWBySize(o0.x86RmSize());
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- rbReg = o1.id();
-
- if (o1.x86RmSize() == 1) {
- FIXUP_GPB(o1, rbReg);
- goto EmitX86R;
- }
- else {
- // This seems to be the only exception of encoding '66F2' prefix.
- if (o1.x86RmSize() == 2) writer.emit8(0x66);
-
- opcode.add(1);
- goto EmitX86R;
- }
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- rmRel = &o1;
- if (o1.x86RmSize() == 0)
- goto AmbiguousOperandSize;
-
- // This seems to be the only exception of encoding '66F2' prefix.
- if (o1.x86RmSize() == 2) writer.emit8(0x66);
-
- opcode += uint32_t(o1.x86RmSize() != 1u);
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Enter:
- if (isign3 == ENC_OPS2(Imm, Imm)) {
- uint32_t iw = o0.as<Imm>().valueAs<uint16_t>();
- uint32_t ib = o1.as<Imm>().valueAs<uint8_t>();
-
- immValue = iw | (ib << 16);
- immSize = 3;
- goto EmitX86Op;
- }
- break;
-
- case InstDB::kEncodingX86Imul:
- // First process all forms distinct of `kEncodingX86M_OptB_MulDiv`.
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opcode = 0x6B;
- opcode.addPrefixBySize(o0.x86RmSize());
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) {
- opcode -= 2;
- immSize = o0.x86RmSize() == 2 ? 2 : 4;
- }
-
- opReg = o0.id();
- rbReg = o1.id();
-
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opcode = 0x6B;
- opcode.addPrefixBySize(o0.x86RmSize());
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- // Sign extend so isInt8 returns the right result.
- if (o0.x86RmSize() == 4)
- immValue = x86SignExtendI32<int64_t>(immValue);
-
- if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) {
- opcode -= 2;
- immSize = o0.x86RmSize() == 2 ? 2 : 4;
- }
-
- opReg = o0.id();
- rmRel = &o1;
-
- goto EmitX86M;
- }
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- // Must be explicit 'ax, r8' form.
- if (o1.x86RmSize() == 1)
- goto CaseX86M_GPB_MulDiv;
-
- if (o0.x86RmSize() != o1.x86RmSize())
- goto OperandSizeMismatch;
-
- opReg = o0.id();
- rbReg = o1.id();
-
- opcode = Opcode::k000F00 | 0xAF;
- opcode.addPrefixBySize(o0.x86RmSize());
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- // Must be explicit 'ax, m8' form.
- if (o1.x86RmSize() == 1)
- goto CaseX86M_GPB_MulDiv;
-
- opReg = o0.id();
- rmRel = &o1;
-
- opcode = Opcode::k000F00 | 0xAF;
- opcode.addPrefixBySize(o0.x86RmSize());
- goto EmitX86M;
- }
-
- // Shorthand to imul 'reg, reg, imm'.
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- opcode = 0x6B;
- opcode.addPrefixBySize(o0.x86RmSize());
-
- immValue = o1.as<Imm>().value();
- immSize = 1;
-
- // Sign extend so isInt8 returns the right result.
- if (o0.x86RmSize() == 4)
- immValue = x86SignExtendI32<int64_t>(immValue);
-
- if (!Support::isInt8(immValue) || Support::test(options, InstOptions::kLongForm)) {
- opcode -= 2;
- immSize = o0.x86RmSize() == 2 ? 2 : 4;
- }
-
- opReg = rbReg = o0.id();
- goto EmitX86R;
- }
-
- // Try implicit form.
- goto CaseX86M_GPB_MulDiv;
-
- case InstDB::kEncodingX86In:
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx))
- goto InvalidInstruction;
-
- immValue = o1.as<Imm>().valueAs<uint8_t>();
- immSize = 1;
-
- opcode = x86AltOpcodeOf(instInfo) + (o0.x86RmSize() != 1);
- opcode.add66hBySize(o0.x86RmSize());
- goto EmitX86Op;
- }
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx || o1.id() != Gp::kIdDx))
- goto InvalidInstruction;
-
- opcode += uint32_t(o0.x86RmSize() != 1u);
- opcode.add66hBySize(o0.x86RmSize());
- goto EmitX86Op;
- }
- break;
-
- case InstDB::kEncodingX86Ins:
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- if (ASMJIT_UNLIKELY(!x86IsImplicitMem(o0, Gp::kIdDi) || o1.id() != Gp::kIdDx))
- goto InvalidInstruction;
-
- uint32_t size = o0.x86RmSize();
- if (ASMJIT_UNLIKELY(size == 0))
- goto AmbiguousOperandSize;
-
- rmRel = &o0;
- opcode += uint32_t(size != 1u);
-
- opcode.add66hBySize(size);
- goto EmitX86OpImplicitMem;
- }
- break;
-
- case InstDB::kEncodingX86IncDec:
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
-
- if (o0.x86RmSize() == 1) {
- FIXUP_GPB(o0, rbReg);
- goto EmitX86R;
- }
-
- if (is32Bit()) {
- // INC r16|r32 is only encodable in 32-bit mode (collides with REX).
- opcode = x86AltOpcodeOf(instInfo) + (rbReg & 0x07);
- opcode.add66hBySize(o0.x86RmSize());
- goto EmitX86Op;
- }
- else {
- opcode.addArithBySize(o0.x86RmSize());
- goto EmitX86R;
- }
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- if (!o0.x86RmSize())
- goto AmbiguousOperandSize;
- opcode.addArithBySize(o0.x86RmSize());
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Int:
- if (isign3 == ENC_OPS1(Imm)) {
- immValue = o0.as<Imm>().value();
- immSize = 1;
- goto EmitX86Op;
- }
- break;
-
- case InstDB::kEncodingX86Jcc:
- if (Support::test(options, InstOptions::kTaken | InstOptions::kNotTaken) && hasEncodingOption(EncodingOptions::kPredictedJumps)) {
- uint8_t prefix = Support::test(options, InstOptions::kTaken) ? uint8_t(0x3E) : uint8_t(0x2E);
- writer.emit8(prefix);
- }
-
- rmRel = &o0;
- opReg = 0;
- goto EmitJmpCall;
-
- case InstDB::kEncodingX86JecxzLoop:
- rmRel = &o0;
- // Explicit jecxz|loop [r|e]cx, dst
- if (o0.isReg()) {
- if (ASMJIT_UNLIKELY(!Reg::isGp(o0, Gp::kIdCx)))
- goto InvalidInstruction;
-
- writer.emitAddressOverride((is32Bit() && o0.x86RmSize() == 2) || (is64Bit() && o0.x86RmSize() == 4));
- rmRel = &o1;
- }
-
- opReg = 0;
- goto EmitJmpCall;
-
- case InstDB::kEncodingX86Jmp:
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- rmRel = &o0;
- if (isign3 == ENC_OPS1(Mem))
- goto EmitX86M;
-
- // Jump encoded with 32-bit displacement use 0xE9 opcode. Jump encoded with 8-bit displacement's opcode is
- // stored as an alternative opcode.
- opcode = 0xE9;
- opReg = 0;
- goto EmitJmpCall;
-
- case InstDB::kEncodingX86JmpRel:
- rmRel = &o0;
- goto EmitJmpCall;
-
- case InstDB::kEncodingX86LcallLjmp:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- uint32_t mSize = rmRel->as<Mem>().size();
- if (mSize == 0) {
- mSize = registerSize();
- }
- else {
- mSize -= 2;
- if (mSize != 2 && mSize != 4 && mSize != registerSize())
- goto InvalidAddress;
- }
- opcode.addPrefixBySize(mSize);
- goto EmitX86M;
- }
-
- if (isign3 == ENC_OPS2(Imm, Imm)) {
- if (!is32Bit())
- goto InvalidInstruction;
-
- const Imm& imm0 = o0.as<Imm>();
- const Imm& imm1 = o1.as<Imm>();
-
- if (imm0.value() > 0xFFFFu || imm1.value() > 0xFFFFFFFFu)
- goto InvalidImmediate;
-
- opcode = x86AltOpcodeOf(instInfo);
- immValue = imm1.value() | (imm0.value() << 32);
- immSize = 6;
- goto EmitX86Op;
- }
- break;
-
- case InstDB::kEncodingX86Lea:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Mov:
- // Reg <- Reg
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- // Asmjit uses segment registers indexed from 1 to 6, leaving zero as "no segment register used". We have to
- // fix this (decrement the index of the register) when emitting MOV instructions which move to/from a segment
- // register. The segment register is always `opReg`, because the MOV instruction uses either RM or MR encoding.
-
- // GP <- ??
- if (Reg::isGp(o0)) {
- rbReg = o0.id();
- opReg = o1.id();
-
- // GP <- GP
- if (Reg::isGp(o1)) {
- uint32_t opSize = o0.x86RmSize();
- if (opSize != o1.x86RmSize())
- goto InvalidInstruction;
-
- if (opSize == 1) {
- FIXUP_GPB(o0, rbReg);
- FIXUP_GPB(o1, opReg);
- opcode = 0x88;
-
- if (!Support::test(options, InstOptions::kX86_ModRM))
- goto EmitX86R;
-
- opcode += 2u;
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
- else {
- opcode = 0x89;
- opcode.addPrefixBySize(opSize);
-
- if (!Support::test(options, InstOptions::kX86_ModRM))
- goto EmitX86R;
-
- opcode += 2u;
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
- }
-
- // GP <- SReg
- if (Reg::isSReg(o1)) {
- opcode = 0x8C;
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg--;
- goto EmitX86R;
- }
-
- // GP <- CReg
- if (Reg::isCReg(o1)) {
- opcode = Opcode::k000F00 | 0x20;
-
- // Use `LOCK MOV` in 32-bit mode if CR8+ register is accessed (AMD extension).
- if ((opReg & 0x8) && is32Bit()) {
- writer.emit8(0xF0);
- opReg &= 0x7;
- }
- goto EmitX86R;
- }
-
- // GP <- DReg
- if (Reg::isDReg(o1)) {
- opcode = Opcode::k000F00 | 0x21;
- goto EmitX86R;
- }
- }
- else {
- opReg = o0.id();
- rbReg = o1.id();
-
- // ?? <- GP
- if (!Reg::isGp(o1))
- goto InvalidInstruction;
-
- // SReg <- GP
- if (Reg::isSReg(o0)) {
- opcode = 0x8E;
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg--;
- goto EmitX86R;
- }
-
- // CReg <- GP
- if (Reg::isCReg(o0)) {
- opcode = Opcode::k000F00 | 0x22;
-
- // Use `LOCK MOV` in 32-bit mode if CR8+ register is accessed (AMD extension).
- if ((opReg & 0x8) && is32Bit()) {
- writer.emit8(0xF0);
- opReg &= 0x7;
- }
- goto EmitX86R;
- }
-
- // DReg <- GP
- if (Reg::isDReg(o0)) {
- opcode = Opcode::k000F00 | 0x23;
- goto EmitX86R;
- }
- }
-
- goto InvalidInstruction;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
-
- // SReg <- Mem
- if (Reg::isSReg(o0)) {
- opcode = 0x8E;
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg--;
- goto EmitX86M;
- }
- // Reg <- Mem
- else {
- opcode = 0;
- opcode.addArithBySize(o0.x86RmSize());
-
- // Handle a special form of `mov al|ax|eax|rax, [ptr64]` that doesn't use MOD.
- if (opReg == Gp::kIdAx && !rmRel->as<Mem>().hasBaseOrIndex()) {
- if (x86ShouldUseMovabs(this, writer, o0.x86RmSize(), options, rmRel->as<Mem>())) {
- opcode += 0xA0u;
- immValue = rmRel->as<Mem>().offset();
- goto EmitX86OpMovAbs;
- }
- }
-
- if (o0.x86RmSize() == 1)
- FIXUP_GPB(o0, opReg);
-
- opcode += 0x8Au;
- goto EmitX86M;
- }
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
-
- // Mem <- SReg
- if (Reg::isSReg(o1)) {
- opcode = 0x8C;
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg--;
- goto EmitX86M;
- }
- // Mem <- Reg
- else {
- opcode = 0;
- opcode.addArithBySize(o1.x86RmSize());
-
- // Handle a special form of `mov [ptr64], al|ax|eax|rax` that doesn't use MOD.
- if (opReg == Gp::kIdAx && !rmRel->as<Mem>().hasBaseOrIndex()) {
- if (x86ShouldUseMovabs(this, writer, o1.x86RmSize(), options, rmRel->as<Mem>())) {
- opcode += 0xA2u;
- immValue = rmRel->as<Mem>().offset();
- goto EmitX86OpMovAbs;
- }
- }
-
- if (o1.x86RmSize() == 1)
- FIXUP_GPB(o1, opReg);
-
- opcode += 0x88u;
- goto EmitX86M;
- }
- }
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- opReg = o0.id();
- immSize = FastUInt8(o0.x86RmSize());
-
- if (immSize == 1) {
- FIXUP_GPB(o0, opReg);
-
- opcode = 0xB0;
- immValue = o1.as<Imm>().valueAs<uint8_t>();
- goto EmitX86OpReg;
- }
- else {
- // 64-bit immediate in 64-bit mode is allowed.
- immValue = o1.as<Imm>().value();
-
- // Optimize the instruction size by using a 32-bit immediate if possible.
- if (immSize == 8 && !Support::test(options, InstOptions::kLongForm)) {
- if (Support::isUInt32(immValue) && hasEncodingOption(EncodingOptions::kOptimizeForSize)) {
- // Zero-extend by using a 32-bit GPD destination instead of a 64-bit GPQ.
- immSize = 4;
- }
- else if (Support::isInt32(immValue)) {
- // Sign-extend, uses 'C7 /0' opcode.
- rbReg = opReg;
-
- opcode = Opcode::kW | 0xC7;
- opReg = 0;
-
- immSize = 4;
- goto EmitX86R;
- }
- }
-
- opcode = 0xB8;
- opcode.addPrefixBySize(immSize);
- goto EmitX86OpReg;
- }
- }
-
- if (isign3 == ENC_OPS2(Mem, Imm)) {
- uint32_t memSize = o0.x86RmSize();
- if (ASMJIT_UNLIKELY(memSize == 0))
- goto AmbiguousOperandSize;
-
- opcode = 0xC6 + (memSize != 1);
- opcode.addPrefixBySize(memSize);
- opReg = 0;
- rmRel = &o0;
-
- immValue = o1.as<Imm>().value();
- immSize = FastUInt8(Support::min<uint32_t>(memSize, 4));
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Movabs:
- // Reg <- Mem
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
-
- opcode = 0xA0;
- opcode.addArithBySize(o0.x86RmSize());
-
- if (ASMJIT_UNLIKELY(!o0.as<Reg>().isGp()) || opReg != Gp::kIdAx)
- goto InvalidInstruction;
-
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasBaseOrIndex()))
- goto InvalidAddress;
-
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().addrType() == Mem::AddrType::kRel))
- goto InvalidAddress;
-
- immValue = rmRel->as<Mem>().offset();
- goto EmitX86OpMovAbs;
- }
-
- // Mem <- Reg
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
-
- opcode = 0xA2;
- opcode.addArithBySize(o1.x86RmSize());
-
- if (ASMJIT_UNLIKELY(!o1.as<Reg>().isGp()) || opReg != Gp::kIdAx)
- goto InvalidInstruction;
-
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasBaseOrIndex()))
- goto InvalidAddress;
-
- immValue = rmRel->as<Mem>().offset();
- goto EmitX86OpMovAbs;
- }
-
- // Reg <- Imm.
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- if (ASMJIT_UNLIKELY(!o0.as<Reg>().isGpq()))
- goto InvalidInstruction;
-
- opReg = o0.id();
- opcode = 0xB8;
-
- immSize = 8;
- immValue = o1.as<Imm>().value();
-
- opcode.addPrefixBySize(8);
- goto EmitX86OpReg;
- }
- break;
-
- case InstDB::kEncodingX86MovsxMovzx:
- opcode.add(o1.x86RmSize() != 1);
- opcode.addPrefixBySize(o0.x86RmSize());
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- if (o1.x86RmSize() != 1)
- goto EmitX86R;
-
- FIXUP_GPB(o1, rbReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86MovntiMovdiri:
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.addWIf(Reg::isGpq(o1));
-
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86EnqcmdMovdir64b:
- if (isign3 == ENC_OPS2(Mem, Mem)) {
- const Mem& m0 = o0.as<Mem>();
- // This is the only required validation, the rest is handled afterwards.
- if (ASMJIT_UNLIKELY(m0.baseType() != o1.as<Mem>().baseType() ||
- m0.hasIndex() ||
- m0.hasOffset() ||
- (m0.hasSegment() && m0.segmentId() != SReg::kIdEs)))
- goto InvalidInstruction;
-
- // The first memory operand is passed via register, the second memory operand is RM.
- opReg = o0.as<Mem>().baseId();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Out:
- if (isign3 == ENC_OPS2(Imm, Reg)) {
- if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdAx))
- goto InvalidInstruction;
-
- opcode = x86AltOpcodeOf(instInfo) + (o1.x86RmSize() != 1);
- opcode.add66hBySize(o1.x86RmSize());
-
- immValue = o0.as<Imm>().valueAs<uint8_t>();
- immSize = 1;
- goto EmitX86Op;
- }
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdDx || o1.id() != Gp::kIdAx))
- goto InvalidInstruction;
-
- opcode.add(o1.x86RmSize() != 1);
- opcode.add66hBySize(o1.x86RmSize());
- goto EmitX86Op;
- }
- break;
-
- case InstDB::kEncodingX86Outs:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdDx || !x86IsImplicitMem(o1, Gp::kIdSi)))
- goto InvalidInstruction;
-
- uint32_t size = o1.x86RmSize();
- if (ASMJIT_UNLIKELY(size == 0))
- goto AmbiguousOperandSize;
-
- rmRel = &o1;
- opcode.add(size != 1);
- opcode.add66hBySize(size);
- goto EmitX86OpImplicitMem;
- }
- break;
-
- case InstDB::kEncodingX86Push:
- if (isign3 == ENC_OPS1(Reg)) {
- if (Reg::isSReg(o0)) {
- uint32_t segment = o0.id();
- if (ASMJIT_UNLIKELY(segment >= SReg::kIdCount))
- goto InvalidSegment;
-
- opcode = x86OpcodePushSReg[segment];
- goto EmitX86Op;
- }
- else {
- goto CaseX86PushPop_Gp;
- }
- }
-
- if (isign3 == ENC_OPS1(Imm)) {
- immValue = o0.as<Imm>().value();
- immSize = 4;
-
- if (Support::isInt8(immValue) && !Support::test(options, InstOptions::kLongForm))
- immSize = 1;
-
- opcode = immSize == 1 ? 0x6A : 0x68;
- goto EmitX86Op;
- }
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86Pop:
- if (isign3 == ENC_OPS1(Reg)) {
- if (Reg::isSReg(o0)) {
- uint32_t segment = o0.id();
- if (ASMJIT_UNLIKELY(segment == SReg::kIdCs || segment >= SReg::kIdCount))
- goto InvalidSegment;
-
- opcode = x86OpcodePopSReg[segment];
- goto EmitX86Op;
- }
- else {
-CaseX86PushPop_Gp:
- // We allow 2 byte, 4 byte, and 8 byte register sizes, although PUSH and POP only allow 2 bytes or
- // native size. On 64-bit we simply PUSH/POP 64-bit register even if 32-bit register was given.
- if (ASMJIT_UNLIKELY(o0.x86RmSize() < 2))
- goto InvalidInstruction;
-
- opcode = x86AltOpcodeOf(instInfo);
- opcode.add66hBySize(o0.x86RmSize());
- opReg = o0.id();
- goto EmitX86OpReg;
- }
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0))
- goto AmbiguousOperandSize;
-
- if (ASMJIT_UNLIKELY(o0.x86RmSize() != 2 && o0.x86RmSize() != registerSize()))
- goto InvalidInstruction;
-
- opcode.add66hBySize(o0.x86RmSize());
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Ret:
- if (isign3 == 0) {
- // 'ret' without immediate, change C2 to C3.
- opcode.add(1);
- goto EmitX86Op;
- }
-
- if (isign3 == ENC_OPS1(Imm)) {
- immValue = o0.as<Imm>().value();
- if (immValue == 0 && !Support::test(options, InstOptions::kLongForm)) {
- // 'ret' without immediate, change C2 to C3.
- opcode.add(1);
- goto EmitX86Op;
- }
- else {
- immSize = 2;
- goto EmitX86Op;
- }
- }
- break;
-
- case InstDB::kEncodingX86Rot:
- if (o0.isReg()) {
- opcode.addArithBySize(o0.x86RmSize());
- rbReg = o0.id();
-
- if (o0.x86RmSize() == 1)
- FIXUP_GPB(o0, rbReg);
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdCx))
- goto InvalidInstruction;
-
- opcode += 2u;
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- immValue = o1.as<Imm>().value() & 0xFF;
- immSize = 0;
-
- if (immValue == 1 && !Support::test(options, InstOptions::kLongForm))
- goto EmitX86R;
-
- opcode -= 0x10;
- immSize = 1;
- goto EmitX86R;
- }
- }
- else {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0))
- goto AmbiguousOperandSize;
- opcode.addArithBySize(o0.x86RmSize());
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- if (ASMJIT_UNLIKELY(o1.id() != Gp::kIdCx))
- goto InvalidInstruction;
-
- opcode += 2u;
- rmRel = &o0;
- goto EmitX86M;
- }
-
- if (isign3 == ENC_OPS2(Mem, Imm)) {
- rmRel = &o0;
- immValue = o1.as<Imm>().value() & 0xFF;
- immSize = 0;
-
- if (immValue == 1 && !Support::test(options, InstOptions::kLongForm))
- goto EmitX86M;
-
- opcode -= 0x10;
- immSize = 1;
- goto EmitX86M;
- }
- }
- break;
-
- case InstDB::kEncodingX86Set:
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
- FIXUP_GPB(o0, rbReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86ShldShrd:
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg = o1.id();
- rbReg = o0.id();
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
- goto EmitX86M;
- }
-
- // The following instructions use opcode + 1.
- opcode.add(1);
-
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- if (ASMJIT_UNLIKELY(o2.id() != Gp::kIdCx))
- goto InvalidInstruction;
-
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
- if (ASMJIT_UNLIKELY(o2.id() != Gp::kIdCx))
- goto InvalidInstruction;
-
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86StrRm:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- rmRel = &o1;
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().offsetLo32() || !Reg::isGp(o0.as<Reg>(), Gp::kIdAx)))
- goto InvalidInstruction;
-
- uint32_t size = o0.x86RmSize();
- if (o1.x86RmSize() != 0u && ASMJIT_UNLIKELY(o1.x86RmSize() != size))
- goto OperandSizeMismatch;
-
- opcode.addArithBySize(size);
- goto EmitX86OpImplicitMem;
- }
- break;
-
- case InstDB::kEncodingX86StrMr:
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- rmRel = &o0;
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().offsetLo32() || !Reg::isGp(o1.as<Reg>(), Gp::kIdAx)))
- goto InvalidInstruction;
-
- uint32_t size = o1.x86RmSize();
- if (o0.x86RmSize() != 0u && ASMJIT_UNLIKELY(o0.x86RmSize() != size))
- goto OperandSizeMismatch;
-
- opcode.addArithBySize(size);
- goto EmitX86OpImplicitMem;
- }
- break;
-
- case InstDB::kEncodingX86StrMm:
- if (isign3 == ENC_OPS2(Mem, Mem)) {
- if (ASMJIT_UNLIKELY(o0.as<Mem>().baseAndIndexTypes() !=
- o1.as<Mem>().baseAndIndexTypes()))
- goto InvalidInstruction;
-
- rmRel = &o1;
- if (ASMJIT_UNLIKELY(o0.as<Mem>().hasOffset()))
- goto InvalidInstruction;
-
- uint32_t size = o1.x86RmSize();
- if (ASMJIT_UNLIKELY(size == 0))
- goto AmbiguousOperandSize;
-
- if (ASMJIT_UNLIKELY(o0.x86RmSize() != size))
- goto OperandSizeMismatch;
-
- opcode.addArithBySize(size);
- goto EmitX86OpImplicitMem;
- }
- break;
-
- case InstDB::kEncodingX86Test:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (o0.x86RmSize() != o1.x86RmSize())
- goto OperandSizeMismatch;
-
- opcode.addArithBySize(o0.x86RmSize());
- rbReg = o0.id();
- opReg = o1.id();
-
- if (o0.x86RmSize() != 1)
- goto EmitX86R;
-
- FIXUP_GPB(o0, rbReg);
- FIXUP_GPB(o1, opReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.addArithBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
-
- if (o1.x86RmSize() != 1)
- goto EmitX86M;
-
- FIXUP_GPB(o1, opReg);
- goto EmitX86M;
- }
-
- // The following instructions use the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractModO();
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- opcode.addArithBySize(o0.x86RmSize());
- rbReg = o0.id();
-
- if (o0.x86RmSize() == 1) {
- FIXUP_GPB(o0, rbReg);
- immValue = o1.as<Imm>().valueAs<uint8_t>();
- immSize = 1;
- }
- else {
- immValue = o1.as<Imm>().value();
- immSize = FastUInt8(Support::min<uint32_t>(o0.x86RmSize(), 4));
- }
-
- // Short form - AL, AX, EAX, RAX.
- if (rbReg == 0 && !Support::test(options, InstOptions::kLongForm)) {
- opcode &= Opcode::kPP_66 | Opcode::kW;
- opcode |= 0xA8 + (o0.x86RmSize() != 1);
- goto EmitX86Op;
- }
-
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Imm)) {
- if (ASMJIT_UNLIKELY(o0.x86RmSize() == 0))
- goto AmbiguousOperandSize;
-
- opcode.addArithBySize(o0.x86RmSize());
- rmRel = &o0;
-
- immValue = o1.as<Imm>().value();
- immSize = FastUInt8(Support::min<uint32_t>(o0.x86RmSize(), 4));
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Xchg:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode.addArithBySize(o0.x86RmSize());
- opReg = o0.id();
- rmRel = &o1;
-
- if (o0.x86RmSize() != 1)
- goto EmitX86M;
-
- FIXUP_GPB(o0, opReg);
- goto EmitX86M;
- }
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingX86Xadd:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- rbReg = o0.id();
- opReg = o1.id();
-
- uint32_t opSize = o0.x86RmSize();
- if (opSize != o1.x86RmSize())
- goto OperandSizeMismatch;
-
- if (opSize == 1) {
- FIXUP_GPB(o0, rbReg);
- FIXUP_GPB(o1, opReg);
- goto EmitX86R;
- }
-
- // Special cases for 'xchg ?ax, reg'.
- if (instId == Inst::kIdXchg && (opReg == 0 || rbReg == 0)) {
- if (is64Bit() && opReg == rbReg && opSize >= 4) {
- if (opSize == 8) {
- // Encode 'xchg rax, rax' as '90' (REX and other prefixes are optional).
- opcode &= Opcode::kW;
- opcode |= 0x90;
- goto EmitX86OpReg;
- }
- else {
- // Encode 'xchg eax, eax' by using a generic path.
- }
- }
- else if (!Support::test(options, InstOptions::kLongForm)) {
- // The special encoding encodes only one register, which is non-zero.
- opReg += rbReg;
-
- opcode.addArithBySize(opSize);
- opcode &= Opcode::kW | Opcode::kPP_66;
- opcode |= 0x90;
- goto EmitX86OpReg;
- }
- }
-
- opcode.addArithBySize(opSize);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.addArithBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
-
- if (o1.x86RmSize() == 1) {
- FIXUP_GPB(o1, opReg);
- }
-
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingX86Fence:
- rbReg = 0;
- goto EmitX86R;
-
- case InstDB::kEncodingX86Bndmov:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- // ModRM encoding:
- if (!Support::test(options, InstOptions::kX86_ModMR))
- goto EmitX86R;
-
- // ModMR encoding:
- opcode = x86AltOpcodeOf(instInfo);
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode = x86AltOpcodeOf(instInfo);
-
- rmRel = &o0;
- opReg = o1.id();
- goto EmitX86M;
- }
- break;
-
- // FPU Instructions
- // ----------------
-
- case InstDB::kEncodingFpuOp:
- goto EmitFpuOp;
-
- case InstDB::kEncodingFpuArith:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- // We switch to the alternative opcode if the first operand is zero.
- if (opReg == 0) {
-CaseFpuArith_Reg:
- opcode = ((0xD8 << Opcode::kFPU_2B_Shift) ) +
- ((opcode >> Opcode::kFPU_2B_Shift) & 0xFF) + rbReg;
- goto EmitFpuOp;
- }
- else if (rbReg == 0) {
- rbReg = opReg;
- opcode = ((0xDC << Opcode::kFPU_2B_Shift) ) +
- ((opcode ) & 0xFF) + rbReg;
- goto EmitFpuOp;
- }
- else {
- goto InvalidInstruction;
- }
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
-CaseFpuArith_Mem:
- // 0xD8/0xDC, depends on the size of the memory operand; opReg is valid.
- opcode = (o0.x86RmSize() == 4) ? 0xD8 : 0xDC;
- // Clear compressed displacement before going to EmitX86M.
- opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
-
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingFpuCom:
- if (isign3 == 0) {
- rbReg = 1;
- goto CaseFpuArith_Reg;
- }
-
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
- goto CaseFpuArith_Reg;
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- goto CaseFpuArith_Mem;
- }
- break;
-
- case InstDB::kEncodingFpuFldFst:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
-
- if (o0.x86RmSize() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) {
- goto EmitX86M;
- }
-
- if (o0.x86RmSize() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) {
- opcode += 4u;
- goto EmitX86M;
- }
-
- if (o0.x86RmSize() == 10 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM80)) {
- opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractModO();
- goto EmitX86M;
- }
- }
-
- if (isign3 == ENC_OPS1(Reg)) {
- if (instId == Inst::kIdFld ) { opcode = (0xD9 << Opcode::kFPU_2B_Shift) + 0xC0 + o0.id(); goto EmitFpuOp; }
- if (instId == Inst::kIdFst ) { opcode = (0xDD << Opcode::kFPU_2B_Shift) + 0xD0 + o0.id(); goto EmitFpuOp; }
- if (instId == Inst::kIdFstp) { opcode = (0xDD << Opcode::kFPU_2B_Shift) + 0xD8 + o0.id(); goto EmitFpuOp; }
- }
- break;
-
- case InstDB::kEncodingFpuM:
- if (isign3 == ENC_OPS1(Mem)) {
- // Clear compressed displacement before going to EmitX86M.
- opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
-
- rmRel = &o0;
- if (o0.x86RmSize() == 2 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM16)) {
- opcode += 4u;
- goto EmitX86M;
- }
-
- if (o0.x86RmSize() == 4 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM32)) {
- goto EmitX86M;
- }
-
- if (o0.x86RmSize() == 8 && commonInfo->hasFlag(InstDB::InstFlags::kFpuM64)) {
- opcode = x86AltOpcodeOf(instInfo) & ~uint32_t(Opcode::kCDSHL_Mask);
- opReg = opcode.extractModO();
- goto EmitX86M;
- }
- }
- break;
-
- case InstDB::kEncodingFpuRDef:
- if (isign3 == 0) {
- opcode += 1u;
- goto EmitFpuOp;
- }
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingFpuR:
- if (isign3 == ENC_OPS1(Reg)) {
- opcode += o0.id();
- goto EmitFpuOp;
- }
- break;
-
- case InstDB::kEncodingFpuStsw:
- if (isign3 == ENC_OPS1(Reg)) {
- if (ASMJIT_UNLIKELY(o0.id() != Gp::kIdAx))
- goto InvalidInstruction;
-
- opcode = x86AltOpcodeOf(instInfo);
- goto EmitFpuOp;
- }
-
- if (isign3 == ENC_OPS1(Mem)) {
- // Clear compressed displacement before going to EmitX86M.
- opcode &= ~uint32_t(Opcode::kCDSHL_Mask);
-
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- // Ext Instructions (Legacy Extensions)
- // ------------------------------------
-
- case InstDB::kEncodingExtPextrw:
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opcode.add66hIf(Reg::isXmm(o1));
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
- // Secondary opcode of 'pextrw' instruction (SSE4.1).
- opcode = x86AltOpcodeOf(instInfo);
- opcode.add66hIf(Reg::isXmm(o1));
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtExtract:
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opcode.add66hIf(Reg::isXmm(o1));
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
- opcode.add66hIf(Reg::isXmm(o1));
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtMov:
- // GP|MM|XMM <- GP|MM|XMM
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- if (!Support::test(options, InstOptions::kX86_ModMR) || !instInfo->_altOpcodeIndex)
- goto EmitX86R;
-
- opcode = x86AltOpcodeOf(instInfo);
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
-
- // GP|MM|XMM <- Mem
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
-
- // The following instruction uses opcode[1].
- opcode = x86AltOpcodeOf(instInfo);
-
- // Mem <- GP|MM|XMM
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtMovbe:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- if (o0.x86RmSize() == 1)
- goto InvalidInstruction;
-
- opcode.addPrefixBySize(o0.x86RmSize());
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
-
- // The following instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- if (o1.x86RmSize() == 1)
- goto InvalidInstruction;
-
- opcode.addPrefixBySize(o1.x86RmSize());
- opReg = o1.id();
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtMovd:
-CaseExtMovd:
- opReg = o0.id();
- opcode.add66hIf(Reg::isXmm(o0));
-
- // MM/XMM <- Gp
- if (isign3 == ENC_OPS2(Reg, Reg) && Reg::isGp(o1)) {
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- // MM/XMM <- Mem
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- rmRel = &o1;
- goto EmitX86M;
- }
-
- // The following instructions use the secondary opcode.
- opcode &= Opcode::kW;
- opcode |= x86AltOpcodeOf(instInfo);
- opReg = o1.id();
- opcode.add66hIf(Reg::isXmm(o1));
-
- // GP <- MM/XMM
- if (isign3 == ENC_OPS2(Reg, Reg) && Reg::isGp(o0)) {
- rbReg = o0.id();
- goto EmitX86R;
- }
-
- // Mem <- MM/XMM
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- rmRel = &o0;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtMovq:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- // MM <- MM
- if (Reg::isMm(o0) && Reg::isMm(o1)) {
- opcode = Opcode::k000F00 | 0x6F;
-
- if (!Support::test(options, InstOptions::kX86_ModMR))
- goto EmitX86R;
-
- opcode += 0x10u;
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
-
- // XMM <- XMM
- if (Reg::isXmm(o0) && Reg::isXmm(o1)) {
- opcode = Opcode::kF30F00 | 0x7E;
-
- if (!Support::test(options, InstOptions::kX86_ModMR))
- goto EmitX86R;
-
- opcode = Opcode::k660F00 | 0xD6;
- std::swap(opReg, rbReg);
- goto EmitX86R;
- }
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
-
- // MM <- Mem
- if (Reg::isMm(o0)) {
- opcode = Opcode::k000F00 | 0x6F;
- goto EmitX86M;
- }
-
- // XMM <- Mem
- if (Reg::isXmm(o0)) {
- opcode = Opcode::kF30F00 | 0x7E;
- goto EmitX86M;
- }
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
-
- // Mem <- MM
- if (Reg::isMm(o1)) {
- opcode = Opcode::k000F00 | 0x7F;
- goto EmitX86M;
- }
-
- // Mem <- XMM
- if (Reg::isXmm(o1)) {
- opcode = Opcode::k660F00 | 0xD6;
- goto EmitX86M;
- }
- }
-
- // MOVQ in other case is simply a MOVD instruction promoted to 64-bit.
- opcode |= Opcode::kW;
- goto CaseExtMovd;
-
- case InstDB::kEncodingExtRm_XMM0:
- if (ASMJIT_UNLIKELY(!o2.isNone() && !Reg::isXmm(o2, 0)))
- goto InvalidInstruction;
-
- isign3 &= 0x3F;
- goto CaseExtRm;
-
- case InstDB::kEncodingExtRm_ZDI:
- if (ASMJIT_UNLIKELY(!o2.isNone() && !x86IsImplicitMem(o2, Gp::kIdDi)))
- goto InvalidInstruction;
-
- isign3 &= 0x3F;
- goto CaseExtRm;
-
- case InstDB::kEncodingExtRm_Wx:
- opcode.addWIf(o1.x86RmSize() == 8);
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingExtRm_Wx_GpqOnly:
- opcode.addWIf(Reg::isGpq(o0));
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingExtRm:
-CaseExtRm:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtRm_P:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opcode.add66hIf(unsigned(Reg::isXmm(o0)) | unsigned(Reg::isXmm(o1)));
-
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode.add66hIf(Reg::isXmm(o0));
-
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtRmRi:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
-
- // The following instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractModO();
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- immValue = o1.as<Imm>().value();
- immSize = 1;
-
- rbReg = o0.id();
- goto EmitX86R;
- }
- break;
-
- case InstDB::kEncodingExtRmRi_P:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opcode.add66hIf(unsigned(Reg::isXmm(o0)) | unsigned(Reg::isXmm(o1)));
-
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode.add66hIf(Reg::isXmm(o0));
-
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
-
- // The following instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
- opReg = opcode.extractModO();
-
- if (isign3 == ENC_OPS2(Reg, Imm)) {
- opcode.add66hIf(Reg::isXmm(o0));
-
- immValue = o1.as<Imm>().value();
- immSize = 1;
-
- rbReg = o0.id();
- goto EmitX86R;
- }
- break;
-
- case InstDB::kEncodingExtRmi:
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- case InstDB::kEncodingExtRmi_P:
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opcode.add66hIf(unsigned(Reg::isXmm(o0)) | unsigned(Reg::isXmm(o1)));
-
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opcode.add66hIf(Reg::isXmm(o0));
-
- opReg = o0.id();
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- // Extrq & Insertq (SSE4A)
- // -----------------------
-
- case InstDB::kEncodingExtExtrq:
- opReg = o0.id();
- rbReg = o1.id();
-
- if (isign3 == ENC_OPS2(Reg, Reg))
- goto EmitX86R;
-
- if (isign3 == ENC_OPS3(Reg, Imm, Imm)) {
- // This variant of the instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
- rbReg = opReg;
- opReg = opcode.extractModO();
-
- immValue = (uint32_t(o1.as<Imm>().valueAs<uint8_t>()) ) +
- (uint32_t(o2.as<Imm>().valueAs<uint8_t>()) << 8) ;
- immSize = 2;
- goto EmitX86R;
- }
- break;
-
- case InstDB::kEncodingExtInsertq: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
-
- opReg = o0.id();
- rbReg = o1.id();
-
- if (isign4 == ENC_OPS2(Reg, Reg))
- goto EmitX86R;
-
- if (isign4 == ENC_OPS4(Reg, Reg, Imm, Imm)) {
- // This variant of the instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
- immValue = (uint32_t(o2.as<Imm>().valueAs<uint8_t>()) ) +
- (uint32_t(o3.as<Imm>().valueAs<uint8_t>()) << 8) ;
- immSize = 2;
- goto EmitX86R;
- }
- break;
- }
-
- // 3DNOW Instructions
- // ------------------
-
- case InstDB::kEncodingExt3dNow:
- // Every 3dNow instruction starts with 0x0F0F and the actual opcode is
- // stored as 8-bit immediate.
- immValue = opcode.v & 0xFFu;
- immSize = 1;
-
- opcode = Opcode::k000F00 | 0x0F;
- opReg = o0.id();
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- rbReg = o1.id();
- goto EmitX86R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- rmRel = &o1;
- goto EmitX86M;
- }
- break;
-
- // VEX/EVEX Instructions
- // ---------------------
-
- case InstDB::kEncodingVexOp:
- goto EmitVexOp;
-
- case InstDB::kEncodingVexOpMod:
- rbReg = 0;
- goto EmitVexEvexR;
-
- case InstDB::kEncodingVexKmov:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
-
- // Form 'k, reg'.
- if (Reg::isGp(o1)) {
- opcode = x86AltOpcodeOf(instInfo);
- goto EmitVexEvexR;
- }
-
- // Form 'reg, k'.
- if (Reg::isGp(o0)) {
- opcode = x86AltOpcodeOf(instInfo) + 1;
- goto EmitVexEvexR;
- }
-
- // Form 'k, k'.
- if (!Support::test(options, InstOptions::kX86_ModMR))
- goto EmitVexEvexR;
-
- opcode.add(1);
- std::swap(opReg, rbReg);
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
-
- goto EmitVexEvexM;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode.add(1);
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexR_Wx:
- if (isign3 == ENC_OPS1(Reg)) {
- rbReg = o0.id();
- opcode.addWIf(o0.as<Reg>().isGpq());
- goto EmitVexEvexR;
- }
- break;
-
- case InstDB::kEncodingVexM:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexM_VM:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexMr_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexMr_VM:
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode |= Support::max(x86OpcodeLByVMem(o0), x86OpcodeLBySize(o1.x86RmSize()));
-
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexMri_Vpextrw:
- // Use 'vpextrw reg, xmm1, i8' when possible.
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opcode = Opcode::k660F00 | 0xC5;
-
- opReg = o0.id();
- rbReg = o1.id();
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
- goto EmitVexEvexR;
- }
-
- goto CaseVexMri;
-
- case InstDB::kEncodingVexMvr_Wx:
- if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
- opcode.addWIf(unsigned(Reg::isGpq(o1)));
- opReg = x86PackRegAndVvvvv(o1.id(), o2.id());
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexMri_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexMri:
-CaseVexMri:
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Mem, Reg, Imm)) {
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRm_ZDI:
- if (ASMJIT_UNLIKELY(!o2.isNone() && !x86IsImplicitMem(o2, Gp::kIdDi)))
- goto InvalidInstruction;
-
- isign3 &= 0x3F;
- goto CaseVexRm;
-
- case InstDB::kEncodingVexRm_Wx:
- opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o1)));
- goto CaseVexRm;
-
- case InstDB::kEncodingVexRm_Lx_Narrow:
- if (o1.x86RmSize())
- opcode |= x86OpcodeLBySize(o1.x86RmSize());
- else if (o0.x86RmSize() == 32)
- opcode |= Opcode::kLL_2;
- goto CaseVexRm;
-
- case InstDB::kEncodingVexRm_Lx_Bcst:
- if (isign3 == ENC_OPS2(Reg, Reg) && Reg::isGp(o1.as<Reg>())) {
- opcode = x86AltOpcodeOf(instInfo) | x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRm_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRm:
-CaseVexRm:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRm_VM:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.x86RmSize()));
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRm_T1_4X: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
- const Operand_& o5 = opExt[EmitterUtils::kOp5];
-
- if (Reg::isVec(o0) && Reg::isVec(o1) && Reg::isVec(o2) && Reg::isVec(o3) && Reg::isVec(o4) && o5.isMem()) {
- // Registers [o1, o2, o3, o4] must start aligned and must be consecutive.
- uint32_t i1 = o1.id();
- uint32_t i2 = o2.id();
- uint32_t i3 = o3.id();
- uint32_t i4 = o4.id();
-
- if (ASMJIT_UNLIKELY((i1 & 0x3) != 0 || i2 != i1 + 1 || i3 != i1 + 2 || i4 != i1 + 3))
- goto NotConsecutiveRegs;
-
- opReg = x86PackRegAndVvvvv(o0.id(), i1);
- rmRel = &o5;
- goto EmitVexEvexM;
- }
- break;
- }
-
- case InstDB::kEncodingVexRmi_Wx:
- opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o1)));
- goto CaseVexRmi;
-
- case InstDB::kEncodingVexRmi_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRmi:
-CaseVexRmi:
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvm:
-CaseVexRvm:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
-CaseVexRvm_R:
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvm_ZDX_Wx: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- if (ASMJIT_UNLIKELY(!o3.isNone() && !Reg::isGp(o3, Gp::kIdDx)))
- goto InvalidInstruction;
- ASMJIT_FALLTHROUGH;
- }
-
- case InstDB::kEncodingVexRvm_Wx: {
- opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned((o2.x86RmSize() == 8)));
- goto CaseVexRvm;
- }
-
- case InstDB::kEncodingVexRvm_Lx_KEvex: {
- opcode.forceEvexIf(Reg::isKReg(o0));
- ASMJIT_FALLTHROUGH;
- }
-
- case InstDB::kEncodingVexRvm_Lx: {
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- goto CaseVexRvm;
- }
-
- case InstDB::kEncodingVexRvm_Lx_2xK: {
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- // Two registers are encoded as a single register.
- // - First K register must be even.
- // - Second K register must be first+1.
- if ((o0.id() & 1) != 0 || o0.id() + 1 != o1.id())
- goto InvalidPhysId;
-
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
-
- opcode |= x86OpcodeLBySize(o2.x86RmSize());
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
-
- if (o3.isReg()) {
- rbReg = o3.id();
- goto EmitVexEvexR;
- }
-
- if (o3.isMem()) {
- rmRel = &o3;
- goto EmitVexEvexM;
- }
- }
- break;
- }
-
- case InstDB::kEncodingVexRvmr_Lx: {
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
- }
-
- case InstDB::kEncodingVexRvmr: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
-
- immValue = o3.id() << 4;
- immSize = 1;
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
- break;
- }
-
- case InstDB::kEncodingVexRvmi_KEvex:
- opcode.forceEvexIf(Reg::isKReg(o0));
- goto VexRvmi;
-
- case InstDB::kEncodingVexRvmi_Lx_KEvex:
- opcode.forceEvexIf(Reg::isKReg(o0));
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvmi_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvmi:
-VexRvmi:
- {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
-
- immValue = o3.as<Imm>().value();
- immSize = 1;
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Mem, Imm)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
- break;
- }
-
- case InstDB::kEncodingVexRmv_Wx:
- opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o2)));
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRmv:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRmvRm_VM:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opcode = x86AltOpcodeOf(instInfo);
- opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.x86RmSize()));
-
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRmv_VM:
- if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
- opcode |= Support::max(x86OpcodeLByVMem(o1), x86OpcodeLBySize(o0.x86RmSize() | o2.x86RmSize()));
-
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
-
- case InstDB::kEncodingVexRmvi: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
-
- immValue = o3.as<Imm>().value();
- immSize = 1;
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Imm)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign4 == ENC_OPS4(Reg, Mem, Reg, Imm)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
- }
-
- case InstDB::kEncodingVexMovdMovq:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- if (Reg::isGp(o0)) {
- opcode = x86AltOpcodeOf(instInfo);
- opcode.addWBySize(o0.x86RmSize());
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitVexEvexR;
- }
-
- if (Reg::isGp(o1)) {
- opcode.addWBySize(o1.x86RmSize());
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- // If this is a 'W' version (movq) then allow also vmovq 'xmm|xmm' form.
- if (opcode & Opcode::kEvex_W_1) {
- opcode &= ~(Opcode::kPP_VEXMask | Opcode::kMM_Mask | 0xFF);
- opcode |= (Opcode::kF30F00 | 0x7E);
-
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- if (opcode & Opcode::kEvex_W_1) {
- opcode &= ~(Opcode::kPP_VEXMask | Opcode::kMM_Mask | 0xFF);
- opcode |= (Opcode::kF30F00 | 0x7E);
- }
-
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
-
- // The following instruction uses the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- if (opcode & Opcode::kEvex_W_1) {
- opcode &= ~(Opcode::kPP_VEXMask | Opcode::kMM_Mask | 0xFF);
- opcode |= (Opcode::k660F00 | 0xD6);
- }
-
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRmMr_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRmMr:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
-
- // The following instruction uses the secondary opcode.
- opcode &= Opcode::kLL_Mask;
- opcode |= x86AltOpcodeOf(instInfo);
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvmRmv:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rbReg = o1.id();
-
- if (!Support::test(options, InstOptions::kX86_ModMR))
- goto EmitVexEvexR;
-
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvmRmi_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvmRmi:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
-
- // The following instructions use the secondary opcode.
- opcode &= Opcode::kLL_Mask;
- opcode |= x86AltOpcodeOf(instInfo);
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvmRmvRmi:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rbReg = o1.id();
-
- if (!Support::test(options, InstOptions::kX86_ModMR))
- goto EmitVexEvexR;
-
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
-
- // The following instructions use the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = o0.id();
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvmMr:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
-
- // The following instructions use the secondary opcode.
- opcode = x86AltOpcodeOf(instInfo);
-
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = o1.id();
- rbReg = o0.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvmMvr_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvmMvr:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
-
- // The following instruction uses the secondary opcode.
- opcode &= Opcode::kLL_Mask;
- opcode |= x86AltOpcodeOf(instInfo);
-
- if (isign3 == ENC_OPS3(Mem, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o2.id(), o1.id());
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexRvmVmi_Lx_MEvex:
- opcode.forceEvexIf(o1.isMem());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvmVmi_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvmVmi:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Reg, Mem)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
- goto EmitVexEvexM;
- }
-
- // The following instruction uses the secondary opcode.
- opcode &= Opcode::kLL_Mask | Opcode::kMM_ForceEvex;
- opcode |= x86AltOpcodeOf(instInfo);
- opReg = opcode.extractModO();
-
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = x86PackRegAndVvvvv(opReg, o0.id());
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opReg = x86PackRegAndVvvvv(opReg, o0.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexVm_Wx:
- opcode.addWIf(unsigned(Reg::isGpq(o0)) | unsigned(Reg::isGpq(o1)));
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexVm:
- if (isign3 == ENC_OPS2(Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(opReg, o0.id());
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = x86PackRegAndVvvvv(opReg, o0.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexVmi_Lx_MEvex:
- if (isign3 == ENC_OPS3(Reg, Mem, Imm))
- opcode.forceEvex();
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexVmi_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexVmi:
- immValue = o2.as<Imm>().value();
- immSize = 1;
-
-CaseVexVmi_AfterImm:
- if (isign3 == ENC_OPS3(Reg, Reg, Imm)) {
- opReg = x86PackRegAndVvvvv(opReg, o0.id());
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
-
- if (isign3 == ENC_OPS3(Reg, Mem, Imm)) {
- opReg = x86PackRegAndVvvvv(opReg, o0.id());
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingVexVmi4_Wx:
- opcode.addWIf(Reg::isGpq(o0) || o1.x86RmSize() == 8);
- immValue = o2.as<Imm>().value();
- immSize = 4;
- goto CaseVexVmi_AfterImm;
-
- case InstDB::kEncodingVexRvrmRvmr_Lx:
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingVexRvrmRvmr: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
-
- immValue = o3.id() << 4;
- immSize = 1;
- goto EmitVexEvexR;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o3;
-
- immValue = o2.id() << 4;
- immSize = 1;
- goto EmitVexEvexM;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
-
- immValue = o3.id() << 4;
- immSize = 1;
- goto EmitVexEvexM;
- }
- break;
- }
-
- case InstDB::kEncodingVexRvrmiRvmri_Lx: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const Operand_& o4 = opExt[EmitterUtils::kOp4];
-
- if (ASMJIT_UNLIKELY(!o4.isImm()))
- goto InvalidInstruction;
-
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize() | o2.x86RmSize() | o3.x86RmSize());
-
- immValue = o4.as<Imm>().valueAs<uint8_t>() & 0x0F;
- immSize = 1;
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rbReg = o2.id();
-
- immValue |= o3.id() << 4;
- goto EmitVexEvexR;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o3;
-
- immValue |= o2.id() << 4;
- goto EmitVexEvexM;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
-
- immValue |= o3.id() << 4;
- goto EmitVexEvexM;
- }
- break;
- }
-
- case InstDB::kEncodingVexMovssMovsd:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- goto CaseVexRvm_R;
- }
-
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
-
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opcode = x86AltOpcodeOf(instInfo);
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- // FMA4 Instructions
- // -----------------
-
- case InstDB::kEncodingFma4_Lx:
- // It's fine to just check the first operand, second is just for sanity.
- opcode |= x86OpcodeLBySize(o0.x86RmSize() | o1.x86RmSize());
- ASMJIT_FALLTHROUGH;
-
- case InstDB::kEncodingFma4: {
- const Operand_& o3 = opExt[EmitterUtils::kOp3];
- const uint32_t isign4 = isign3 + (uint32_t(o3.opType()) << 9);
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
-
- if (!Support::test(options, InstOptions::kX86_ModMR)) {
- // MOD/RM - Encoding preferred by LLVM.
- opcode.addW();
- rbReg = o3.id();
-
- immValue = o2.id() << 4;
- immSize = 1;
- goto EmitVexEvexR;
- }
- else {
- // MOD/MR - Alternative encoding.
- rbReg = o2.id();
-
- immValue = o3.id() << 4;
- immSize = 1;
- goto EmitVexEvexR;
- }
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Reg, Mem)) {
- opcode.addW();
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o3;
-
- immValue = o2.id() << 4;
- immSize = 1;
- goto EmitVexEvexM;
- }
-
- if (isign4 == ENC_OPS4(Reg, Reg, Mem, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o1.id());
- rmRel = &o2;
-
- immValue = o3.id() << 4;
- immSize = 1;
- goto EmitVexEvexM;
- }
- break;
- }
-
- // AMX Instructions
- // ----------------
-
- case InstDB::kEncodingAmxCfg:
- if (isign3 == ENC_OPS1(Mem)) {
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingAmxR:
- if (isign3 == ENC_OPS1(Reg)) {
- opReg = o0.id();
- rbReg = 0;
- goto EmitVexEvexR;
- }
- break;
-
- case InstDB::kEncodingAmxRm:
- if (isign3 == ENC_OPS2(Reg, Mem)) {
- opReg = o0.id();
- rmRel = &o1;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingAmxMr:
- if (isign3 == ENC_OPS2(Mem, Reg)) {
- opReg = o1.id();
- rmRel = &o0;
- goto EmitVexEvexM;
- }
- break;
-
- case InstDB::kEncodingAmxRmv:
- if (isign3 == ENC_OPS3(Reg, Reg, Reg)) {
- opReg = x86PackRegAndVvvvv(o0.id(), o2.id());
- rbReg = o1.id();
- goto EmitVexEvexR;
- }
- break;
- }
-
- goto InvalidInstruction;
-
- // Emit - X86 Opcode
- // -----------------
-
-EmitX86OpMovAbs:
- immSize = FastUInt8(registerSize());
- writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
-
-EmitX86Op:
- // Emit mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // Emit REX prefix (64-bit only).
- {
- uint32_t rex = opcode.extractRex(options);
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
- }
-
- // Emit instruction opcodes.
- writer.emitMMAndOpcode(opcode.v);
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
-
- // Emit - X86 - Opcode + Reg
- // -------------------------
-
-EmitX86OpReg:
- // Emit mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // Emit REX prefix (64-bit only).
- {
- uint32_t rex = opcode.extractRex(options) | (opReg >> 3); // Rex.B (0x01).
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
-
- opReg &= 0x7;
- }
-
- // Emit instruction opcodes.
- opcode += opReg;
- writer.emitMMAndOpcode(opcode.v);
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
-
- // Emit - X86 - Opcode with Implicit <mem> Operand
- // -----------------------------------------------
-
-EmitX86OpImplicitMem:
- rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasOffset() || (rmInfo & kX86MemInfo_Index)))
- goto InvalidInstruction;
-
- // Emit mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // Emit REX prefix (64-bit only).
- {
- uint32_t rex = opcode.extractRex(options);
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
- }
-
- // Emit override prefixes.
- writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
- writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
-
- // Emit instruction opcodes.
- writer.emitMMAndOpcode(opcode.v);
-
- // Emit immediate value.
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
-
- // Emit - X86 - Opcode /r - Register
- // ---------------------------------
-
-EmitX86R:
- // Mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // Emit REX prefix (64-bit only).
- {
- uint32_t rex = opcode.extractRex(options) |
- ((opReg & 0x08) >> 1) | // REX.R (0x04).
- ((rbReg & 0x08) >> 3) ; // REX.B (0x01).
-
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
-
- opReg &= 0x07;
- rbReg &= 0x07;
- }
-
- // Emit instruction opcodes.
- writer.emitMMAndOpcode(opcode.v);
-
- // Emit ModR.
- writer.emit8(x86EncodeMod(3, opReg, rbReg));
-
- // Emit immediate value.
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
-
- // Emit - X86 - Opcode /r - Memory Base
- // ------------------------------------
-
-EmitX86RFromM:
- rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().hasOffset() || (rmInfo & kX86MemInfo_Index)))
- goto InvalidInstruction;
-
- // Emit mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // Emit REX prefix (64-bit only).
- {
- uint32_t rex = opcode.extractRex(options) |
- ((opReg & 0x08) >> 1) | // REX.R (0x04).
- ((rbReg ) >> 3) ; // REX.B (0x01).
-
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
-
- opReg &= 0x07;
- rbReg &= 0x07;
- }
-
- // Emit override prefixes.
- writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
- writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
-
- // Emit instruction opcodes.
- writer.emitMMAndOpcode(opcode.v);
-
- // Emit ModR/M.
- writer.emit8(x86EncodeMod(3, opReg, rbReg));
-
- // Emit immediate value.
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
-
- // Emit - X86 - Opcode /r - memory Operand
- // ---------------------------------------
-
-EmitX86M:
- // `rmRel` operand must be memory.
- ASMJIT_ASSERT(rmRel != nullptr);
- ASMJIT_ASSERT(rmRel->opType() == OperandType::kMem);
- ASMJIT_ASSERT((opcode & Opcode::kCDSHL_Mask) == 0);
-
- // Emit override prefixes.
- rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
- writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
-
- memOpAOMark = writer.cursor();
- writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
-
- // Emit mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // Emit REX prefix (64-bit only).
- rbReg = rmRel->as<Mem>().baseId();
- rxReg = rmRel->as<Mem>().indexId();
- {
- uint32_t rex;
-
- rex = (rbReg >> 3) & 0x01; // REX.B (0x01).
- rex |= (rxReg >> 2) & 0x02; // REX.X (0x02).
- rex |= (opReg >> 1) & 0x04; // REX.R (0x04).
-
- rex &= rmInfo;
- rex |= opcode.extractRex(options);
-
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
-
- opReg &= 0x07;
- }
-
- // Emit instruction opcodes.
- writer.emitMMAndOpcode(opcode.v);
-
- // ... Fall through ...
-
- // Emit - MOD/SIB
- // --------------
-
-EmitModSib:
- if (!(rmInfo & (kX86MemInfo_Index | kX86MemInfo_67H_X86))) {
- // ==========|> [BASE + DISP8|DISP32].
- if (rmInfo & kX86MemInfo_BaseGp) {
- rbReg &= 0x7;
- relOffset = rmRel->as<Mem>().offsetLo32();
-
- uint32_t mod = x86EncodeMod(0, opReg, rbReg);
- bool forceSIB = commonInfo->isTsibOp();
-
- if (rbReg == Gp::kIdSp || forceSIB) {
- // TSIB or [XSP|R12].
- mod = (mod & 0xF8u) | 0x04u;
- if (rbReg != Gp::kIdBp && relOffset == 0) {
- writer.emit8(mod);
- writer.emit8(x86EncodeSib(0, 4, rbReg));
- }
- // TSIB or [XSP|R12 + DISP8|DISP32].
- else {
- uint32_t cdShift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
- int32_t cdOffset = relOffset >> cdShift;
-
- if (Support::isInt8(cdOffset) && relOffset == int32_t(uint32_t(cdOffset) << cdShift)) {
- writer.emit8(mod + 0x40); // <- MOD(1, opReg, rbReg).
- writer.emit8(x86EncodeSib(0, 4, rbReg));
- writer.emit8(cdOffset & 0xFF);
- }
- else {
- writer.emit8(mod + 0x80); // <- MOD(2, opReg, rbReg).
- writer.emit8(x86EncodeSib(0, 4, rbReg));
- writer.emit32uLE(uint32_t(relOffset));
- }
- }
- }
- else if (rbReg != Gp::kIdBp && relOffset == 0) {
- // [BASE].
- writer.emit8(mod);
- }
- else {
- // [BASE + DISP8|DISP32].
- uint32_t cdShift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
- int32_t cdOffset = relOffset >> cdShift;
-
- if (Support::isInt8(cdOffset) && relOffset == int32_t(uint32_t(cdOffset) << cdShift)) {
- writer.emit8(mod + 0x40);
- writer.emit8(cdOffset & 0xFF);
- }
- else {
- writer.emit8(mod + 0x80);
- writer.emit32uLE(uint32_t(relOffset));
- }
- }
- }
- // ==========|> [ABSOLUTE | DISP32].
- else if (!(rmInfo & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
- Mem::AddrType addrType = rmRel->as<Mem>().addrType();
- relOffset = rmRel->as<Mem>().offsetLo32();
-
- if (is32Bit()) {
- // Explicit relative addressing doesn't work in 32-bit mode.
- if (ASMJIT_UNLIKELY(addrType == Mem::AddrType::kRel))
- goto InvalidAddress;
-
- writer.emit8(x86EncodeMod(0, opReg, 5));
- writer.emit32uLE(uint32_t(relOffset));
- }
- else {
- bool isOffsetI32 = rmRel->as<Mem>().offsetHi32() == (relOffset >> 31);
- bool isOffsetU32 = rmRel->as<Mem>().offsetHi32() == 0;
- uint64_t baseAddress = code()->baseAddress();
-
- // If relative addressing was not explicitly set then we can try to guess. By guessing we check some
- // properties of the memory operand and try to base the decision on the segment prefix and the address type.
- if (addrType == Mem::AddrType::kDefault) {
- if (baseAddress == Globals::kNoBaseAddress) {
- // Prefer absolute addressing mode if the offset is 32-bit.
- addrType = isOffsetI32 || isOffsetU32 ? Mem::AddrType::kAbs
- : Mem::AddrType::kRel;
- }
- else {
- // Prefer absolute addressing mode if FS|GS segment override is present.
- bool hasFsGs = rmRel->as<Mem>().segmentId() >= SReg::kIdFs;
- // Prefer absolute addressing mode if this is LEA with 32-bit immediate.
- bool isLea32 = (instId == Inst::kIdLea) && (isOffsetI32 || isOffsetU32);
-
- addrType = hasFsGs || isLea32 ? Mem::AddrType::kAbs
- : Mem::AddrType::kRel;
- }
- }
-
- if (addrType == Mem::AddrType::kRel) {
- uint32_t kModRel32Size = 5;
- uint64_t virtualOffset = uint64_t(writer.offsetFrom(_bufferData)) + immSize + kModRel32Size;
-
- if (baseAddress == Globals::kNoBaseAddress || _section->id() != 0) {
- // Create a new RelocEntry as we cannot calculate the offset right now.
- err = _code->newRelocEntry(&re, RelocType::kAbsToRel);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
- writer.emit8(x86EncodeMod(0, opReg, 5));
-
- re->_sourceSectionId = _section->id();
- re->_sourceOffset = offset();
- re->_format.resetToSimpleValue(OffsetType::kSignedOffset, 4);
- re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
- re->_payload = uint64_t(rmRel->as<Mem>().offset());
-
- writer.emit32uLE(0);
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
- }
- else {
- uint64_t rip64 = baseAddress + _section->offset() + virtualOffset;
- uint64_t rel64 = uint64_t(rmRel->as<Mem>().offset()) - rip64;
-
- if (Support::isInt32(int64_t(rel64))) {
- writer.emit8(x86EncodeMod(0, opReg, 5));
- writer.emit32uLE(uint32_t(rel64 & 0xFFFFFFFFu));
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
- }
- else {
- // We must check the original address type as we have modified
- // `addrType`. We failed if the original address type is 'rel'.
- if (ASMJIT_UNLIKELY(rmRel->as<Mem>().isRel()))
- goto InvalidAddress;
- }
- }
- }
-
- // Handle unsigned 32-bit address that doesn't work with sign extension. Consider the following instructions:
- //
- // 1. lea rax, [-1] - Sign extended to 0xFFFFFFFFFFFFFFFF
- // 2. lea rax, [0xFFFFFFFF] - Zero extended to 0x00000000FFFFFFFF
- // 3. add rax, [-1] - Sign extended to 0xFFFFFFFFFFFFFFFF
- // 4. add rax, [0xFFFFFFFF] - Zero extended to 0x00000000FFFFFFFF
- //
- // Sign extension is naturally performed by the CPU so we don't have to bother, however, zero extension
- // requires address-size override prefix, which we probably don't have at this moment. So to make the address
- // valid we need to insert it at `memOpAOMark` if it's not already there.
- //
- // If this is 'lea' instruction then it's possible to remove REX.W part from REX prefix (if it's there), which
- // would be one-byte shorter than inserting address-size override.
- //
- // NOTE: If we don't do this then these instructions are unencodable.
- if (!isOffsetI32) {
- // 64-bit absolute address is unencodable.
- if (ASMJIT_UNLIKELY(!isOffsetU32))
- goto InvalidAddress64Bit;
-
- // We only patch the existing code if we don't have address-size override.
- if (*memOpAOMark != 0x67) {
- if (instId == Inst::kIdLea) {
- // LEA: Remove REX.W, if present. This is easy as we know that 'lea' doesn't use any PP prefix so if REX
- // prefix was emitted it would be at `memOpAOMark`.
- uint32_t rex = *memOpAOMark;
- if (rex & kX86ByteRex) {
- rex &= (~kX86ByteRexW) & 0xFF;
- *memOpAOMark = uint8_t(rex);
-
- // We can remove the REX prefix completely if it was not forced.
- if (rex == kX86ByteRex && !Support::test(options, InstOptions::kX86_Rex))
- writer.remove8(memOpAOMark);
- }
- }
- else {
- // Any other instruction: Insert address-size override prefix.
- writer.insert8(memOpAOMark, 0x67);
- }
- }
- }
-
- // Emit 32-bit absolute address.
- writer.emit8(x86EncodeMod(0, opReg, 4));
- writer.emit8(x86EncodeSib(0, 4, 5));
- writer.emit32uLE(uint32_t(relOffset));
- }
- }
- // ==========|> [LABEL|RIP + DISP32]
- else {
- writer.emit8(x86EncodeMod(0, opReg, 5));
-
- if (is32Bit()) {
-EmitModSib_LabelRip_X86:
- if (ASMJIT_UNLIKELY(_code->_relocations.willGrow(_code->allocator()) != kErrorOk))
- goto OutOfMemory;
-
- relOffset = rmRel->as<Mem>().offsetLo32();
- if (rmInfo & kX86MemInfo_BaseLabel) {
- // [LABEL->ABS].
- label = _code->labelEntry(rmRel->as<Mem>().baseId());
- if (ASMJIT_UNLIKELY(!label))
- goto InvalidLabel;
-
- err = _code->newRelocEntry(&re, RelocType::kRelToAbs);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
- re->_sourceSectionId = _section->id();
- re->_sourceOffset = offset();
- re->_format.resetToSimpleValue(OffsetType::kUnsignedOffset, 4);
- re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
- re->_payload = uint64_t(int64_t(relOffset));
-
- if (label->isBound()) {
- // Label bound to the current section.
- re->_payload += label->offset();
- re->_targetSectionId = label->section()->id();
- writer.emit32uLE(0);
- }
- else {
- // Non-bound label or label bound to a different section.
- relOffset = -4 - int32_t(immSize);
- relSize = 4;
- goto EmitRel;
- }
- }
- else {
- // [RIP->ABS].
- err = _code->newRelocEntry(&re, RelocType::kRelToAbs);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
- re->_sourceSectionId = _section->id();
- re->_targetSectionId = _section->id();
- re->_format.resetToSimpleValue(OffsetType::kUnsignedOffset, 4);
- re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
- re->_sourceOffset = offset();
- re->_payload = re->_sourceOffset + re->_format.regionSize() + uint64_t(int64_t(relOffset));
-
- writer.emit32uLE(0);
- }
- }
- else {
- relOffset = rmRel->as<Mem>().offsetLo32();
- if (rmInfo & kX86MemInfo_BaseLabel) {
- // [RIP].
- label = _code->labelEntry(rmRel->as<Mem>().baseId());
- if (ASMJIT_UNLIKELY(!label))
- goto InvalidLabel;
-
- relOffset -= (4 + immSize);
- if (label->isBoundTo(_section)) {
- // Label bound to the current section.
- relOffset += int32_t(label->offset() - writer.offsetFrom(_bufferData));
- writer.emit32uLE(uint32_t(relOffset));
- }
- else {
- // Non-bound label or label bound to a different section.
- relSize = 4;
- goto EmitRel;
- }
- }
- else {
- // [RIP].
- writer.emit32uLE(uint32_t(relOffset));
- }
- }
- }
- }
- else if (!(rmInfo & kX86MemInfo_67H_X86)) {
- // ESP|RSP can't be used as INDEX in pure SIB mode, however, VSIB mode allows XMM4|YMM4|ZMM4 (that's why the
- // check is before the label).
- if (ASMJIT_UNLIKELY(rxReg == Gp::kIdSp))
- goto InvalidAddressIndex;
-
-EmitModVSib:
- rxReg &= 0x7;
-
- // ==========|> [BASE + INDEX + DISP8|DISP32].
- if (rmInfo & kX86MemInfo_BaseGp) {
- rbReg &= 0x7;
- relOffset = rmRel->as<Mem>().offsetLo32();
-
- uint32_t mod = x86EncodeMod(0, opReg, 4);
- uint32_t sib = x86EncodeSib(rmRel->as<Mem>().shift(), rxReg, rbReg);
-
- if (relOffset == 0 && rbReg != Gp::kIdBp) {
- // [BASE + INDEX << SHIFT].
- writer.emit8(mod);
- writer.emit8(sib);
- }
- else {
- uint32_t cdShift = (opcode & Opcode::kCDSHL_Mask) >> Opcode::kCDSHL_Shift;
- int32_t cdOffset = relOffset >> cdShift;
-
- if (Support::isInt8(cdOffset) && relOffset == int32_t(uint32_t(cdOffset) << cdShift)) {
- // [BASE + INDEX << SHIFT + DISP8].
- writer.emit8(mod + 0x40); // <- MOD(1, opReg, 4).
- writer.emit8(sib);
- writer.emit8(uint32_t(cdOffset));
- }
- else {
- // [BASE + INDEX << SHIFT + DISP32].
- writer.emit8(mod + 0x80); // <- MOD(2, opReg, 4).
- writer.emit8(sib);
- writer.emit32uLE(uint32_t(relOffset));
- }
- }
- }
- // ==========|> [INDEX + DISP32].
- else if (!(rmInfo & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
- // [INDEX << SHIFT + DISP32].
- writer.emit8(x86EncodeMod(0, opReg, 4));
- writer.emit8(x86EncodeSib(rmRel->as<Mem>().shift(), rxReg, 5));
-
- relOffset = rmRel->as<Mem>().offsetLo32();
- writer.emit32uLE(uint32_t(relOffset));
- }
- // ==========|> [LABEL|RIP + INDEX + DISP32].
- else {
- if (is32Bit()) {
- writer.emit8(x86EncodeMod(0, opReg, 4));
- writer.emit8(x86EncodeSib(rmRel->as<Mem>().shift(), rxReg, 5));
- goto EmitModSib_LabelRip_X86;
- }
- else {
- // NOTE: This also handles VSIB+RIP, which is not allowed in 64-bit mode.
- goto InvalidAddress;
- }
- }
- }
- else {
- // 16-bit address mode (32-bit mode with 67 override prefix).
- relOffset = (int32_t(rmRel->as<Mem>().offsetLo32()) << 16) >> 16;
-
- // NOTE: 16-bit addresses don't use SIB byte and their encoding differs. We use a table-based approach to
- // calculate the proper MOD byte as it's easier. Also, not all BASE [+ INDEX] combinations are supported
- // in 16-bit mode, so this may fail.
- const uint32_t kBaseGpIdx = (kX86MemInfo_BaseGp | kX86MemInfo_Index);
-
- if (rmInfo & kBaseGpIdx) {
- // ==========|> [BASE + INDEX + DISP16].
- uint32_t mod;
-
- rbReg &= 0x7;
- rxReg &= 0x7;
-
- if ((rmInfo & kBaseGpIdx) == kBaseGpIdx) {
- uint32_t shf = rmRel->as<Mem>().shift();
- if (ASMJIT_UNLIKELY(shf != 0))
- goto InvalidAddress;
- mod = x86Mod16BaseIndexTable[(rbReg << 3) + rxReg];
- }
- else {
- if (rmInfo & kX86MemInfo_Index)
- rbReg = rxReg;
- mod = x86Mod16BaseTable[rbReg];
- }
-
- if (ASMJIT_UNLIKELY(mod == 0xFF))
- goto InvalidAddress;
-
- mod += opReg << 3;
- if (relOffset == 0 && mod != 0x06) {
- writer.emit8(mod);
- }
- else if (Support::isInt8(relOffset)) {
- writer.emit8(mod + 0x40);
- writer.emit8(uint32_t(relOffset));
- }
- else {
- writer.emit8(mod + 0x80);
- writer.emit16uLE(uint32_t(relOffset));
- }
- }
- else {
- // Not supported in 16-bit addresses.
- if (rmInfo & (kX86MemInfo_BaseRip | kX86MemInfo_BaseLabel))
- goto InvalidAddress;
-
- // ==========|> [DISP16].
- writer.emit8(opReg | 0x06);
- writer.emit16uLE(uint32_t(relOffset));
- }
- }
-
- writer.emitImmediate(uint64_t(immValue), immSize);
- goto EmitDone;
-
- // Emit - FPU
- // ----------
-
-EmitFpuOp:
- // Mandatory instruction prefix.
- writer.emitPP(opcode.v);
-
- // FPU instructions consist of two opcodes.
- writer.emit8(opcode.v >> Opcode::kFPU_2B_Shift);
- writer.emit8(opcode.v);
- goto EmitDone;
-
- // Emit - VEX Opcode
- // -----------------
-
-EmitVexOp:
- {
- // These don't use immediate.
- ASMJIT_ASSERT(immSize == 0);
-
- // Only 'vzeroall' and 'vzeroupper' instructions use this encoding, they don't define 'W' to be '1' so we can
- // just check the 'mmmmm' field. Both functions can encode by using VEX2 prefix so VEX3 is basically only used
- // when specified as instruction option.
- ASMJIT_ASSERT((opcode & Opcode::kW) == 0);
-
- uint32_t x = (uint32_t(opcode & Opcode::kMM_Mask ) >> (Opcode::kMM_Shift )) |
- (uint32_t(opcode & Opcode::kLL_Mask ) >> (Opcode::kLL_Shift - 10)) |
- (uint32_t(opcode & Opcode::kPP_VEXMask ) >> (Opcode::kPP_Shift - 8)) ;
-
- if (Support::test(options, InstOptions::kX86_Vex3)) {
- x = (x & 0xFFFF) << 8; // [00000000|00000Lpp|000mmmmm|00000000].
- x ^= (kX86ByteVex3) | // [........|00000Lpp|000mmmmm|__VEX3__].
- (0x07u << 13) | // [........|00000Lpp|111mmmmm|__VEX3__].
- (0x0Fu << 19) | // [........|01111Lpp|111mmmmm|__VEX3__].
- (opcode << 24) ; // [_OPCODE_|01111Lpp|111mmmmm|__VEX3__].
-
- writer.emit32uLE(x);
- goto EmitDone;
- }
- else {
- x = ((x >> 8) ^ x) ^ 0xF9;
- writer.emit8(kX86ByteVex2);
- writer.emit8(x);
- writer.emit8(opcode.v);
- goto EmitDone;
- }
- }
-
- // Emit - VEX|EVEX - /r - Register
- // -------------------------------
-
-EmitVexEvexR:
- {
- // Construct `x` - a complete EVEX|VEX prefix.
- uint32_t x = ((opReg << 4) & 0xF980u) | // [........|........|Vvvvv..R|R.......].
- ((rbReg << 2) & 0x0060u) | // [........|........|........|.BB.....].
- (opcode.extractLLMMMMM(options)) | // [........|.LL.....|Vvvvv..R|RBBmmmmm].
- (_extraReg.id() << 16); // [........|.LL..aaa|Vvvvv..R|RBBmmmmm].
- opReg &= 0x7;
-
- // Handle AVX512 options by a single branch.
- const InstOptions kAvx512Options = InstOptions::kX86_ZMask | InstOptions::kX86_ER | InstOptions::kX86_SAE;
- if (Support::test(options, kAvx512Options)) {
- static constexpr uint32_t kBcstMask = 0x1 << 20;
- static constexpr uint32_t kLLMask10 = 0x2 << 21;
- static constexpr uint32_t kLLMask11 = 0x3 << 21;
-
- // Designed to be easily encodable so the position must be exact. The {rz-sae} is encoded as {11},
- // so it should match the mask.
- static_assert(uint32_t(InstOptions::kX86_RZ_SAE) == kLLMask11,
- "This code requires InstOptions::X86_RZ_SAE to match kLLMask11 to work properly");
-
- x |= uint32_t(options & InstOptions::kX86_ZMask); // [........|zLLb.aaa|Vvvvv..R|RBBmmmmm].
-
- // Support embedded-rounding {er} and suppress-all-exceptions {sae}.
- if (Support::test(options, InstOptions::kX86_ER | InstOptions::kX86_SAE)) {
- // Embedded rounding is only encodable if the instruction is either scalar or it's a 512-bit
- // operation as the {er} rounding predicate collides with LL part of the instruction.
- if ((x & kLLMask11) != kLLMask10) {
- // Ok, so LL is not 10, thus the instruction must be scalar. Scalar instructions don't
- // support broadcast so if this instruction supports it {er} nor {sae} would be encodable.
- if (ASMJIT_UNLIKELY(commonInfo->hasAvx512B()))
- goto InvalidEROrSAE;
- }
-
- if (Support::test(options, InstOptions::kX86_ER)) {
- if (ASMJIT_UNLIKELY(!commonInfo->hasAvx512ER()))
- goto InvalidEROrSAE;
-
- x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
- x |= kBcstMask | (uint32_t(options) & kLLMask11); // [........|.LLb.aaa|Vvvvv..R|RBBmmmmm].
- }
- else {
- if (ASMJIT_UNLIKELY(!commonInfo->hasAvx512SAE()))
- goto InvalidEROrSAE;
-
- x &=~kLLMask11; // [........|.00..aaa|Vvvvv..R|RBBmmmmm].
- x |= kBcstMask; // [........|.00b.aaa|Vvvvv..R|RBBmmmmm].
- }
- }
- }
-
- // These bits would force EVEX prefix.
- constexpr uint32_t kEvexForce = 0x00000010u; // [........|........|........|...x....].
- constexpr uint32_t kEvexBits = 0x00D78150u; // [........|xx.x.xxx|x......x|.x.x....].
-
- // Force EVEX prefix even in case the instruction has VEX encoding, because EVEX encoding is preferred. At the
- // moment this is only required by AVX_VNNI instructions, which were added after AVX512_VNNI instructions. If
- // such instruction doesn't specify prefix, EVEX (AVX512_VNNI) is selected by default.
- if (commonInfo->preferEvex()) {
- if ((x & kEvexBits) == 0 && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) {
- x |= kEvexForce;
- }
- }
-
- // Check if EVEX is required by checking bits in `x` : [........|xx.x.xxx|x......x|.x.x....].
- if (x & kEvexBits) {
- uint32_t y = ((x << 4) & 0x00080000u) | // [........|...bV...|........|........].
- ((x >> 4) & 0x00000010u) ; // [........|...bV...|........|...R....].
- x = (x & 0x00FF78EFu) | y; // [........|zLLbVaaa|0vvvv000|RBBRmmmm].
- x = x << 8; // [zLLbVaaa|0vvvv000|RBBRmmmm|00000000].
- x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBRmmmm|00000000].
- x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBRmmmm|00000000] (added PP and EVEX.W).
- // _ ____ ____
- x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBRmmmm|01100010].
-
- writer.emit32uLE(x);
- writer.emit8(opcode.v);
-
- rbReg &= 0x7;
- writer.emit8(x86EncodeMod(3, opReg, rbReg));
- writer.emitImmByteOrDWord(uint64_t(immValue), immSize);
- goto EmitDone;
- }
-
- // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|R0Bmmmmm].
- x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|R0Bmmmmm].
- ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|0vvvv0pp|R0Bmmmmm].
- ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|R0Bmmmmm].
- x |= x86GetForceEvex3MaskInLastBit(options); // [x0000000|00L00000|WvvvvLpp|R0Bmmmmm].
-
- // Check if VEX3 is required / forced: [x.......|........|x.......|..xxxxx.].
- if (x & 0x8000803Eu) {
- uint32_t xorMsk = x86VEXPrefix[x & 0xF] | (opcode << 24);
-
- // Clear all high bits.
- x = (x & 0xFFFF) << 8; // [00000000|WvvvvLpp|R0Bmmmmm|00000000].
- // ____ _ _
- x ^= xorMsk; // [_OPCODE_|WvvvvLpp|R1Bmmmmm|VEX3|XOP].
- writer.emit32uLE(x);
-
- rbReg &= 0x7;
- writer.emit8(x86EncodeMod(3, opReg, rbReg));
- writer.emitImmByteOrDWord(uint64_t(immValue), immSize);
- goto EmitDone;
- }
- else {
- // 'mmmmm' must be '00001'.
- ASMJIT_ASSERT((x & 0x1F) == 0x01);
-
- x = ((x >> 8) ^ x) ^ 0xF9;
- writer.emit8(kX86ByteVex2);
- writer.emit8(x);
- writer.emit8(opcode.v);
-
- rbReg &= 0x7;
- writer.emit8(x86EncodeMod(3, opReg, rbReg));
- writer.emitImmByteOrDWord(uint64_t(immValue), immSize);
- goto EmitDone;
- }
- }
-
- // Emit - VEX|EVEX - /r - Memory
- // -----------------------------
-
-EmitVexEvexM:
- ASMJIT_ASSERT(rmRel != nullptr);
- ASMJIT_ASSERT(rmRel->opType() == OperandType::kMem);
-
- rmInfo = x86MemInfo[rmRel->as<Mem>().baseAndIndexTypes()];
- writer.emitSegmentOverride(rmRel->as<Mem>().segmentId());
-
- memOpAOMark = writer.cursor();
- writer.emitAddressOverride((rmInfo & _addressOverrideMask()) != 0);
-
- rbReg = rmRel->as<Mem>().hasBaseReg() ? rmRel->as<Mem>().baseId() : uint32_t(0);
- rxReg = rmRel->as<Mem>().hasIndexReg() ? rmRel->as<Mem>().indexId() : uint32_t(0);
-
- {
- uint32_t broadcastBit = uint32_t(rmRel->as<Mem>().hasBroadcast());
-
- // Construct `x` - a complete EVEX|VEX prefix.
- uint32_t x = ((opReg << 4) & 0x0000F980u) | // [........|........|Vvvvv..R|R.......].
- ((rxReg << 3) & 0x00000040u) | // [........|........|........|.X......].
- ((rxReg << 15) & 0x00080000u) | // [........|....X...|........|........].
- ((rbReg << 2) & 0x00000020u) | // [........|........|........|..B.....].
- opcode.extractLLMMMMM(options) | // [........|.LL.X...|Vvvvv..R|RXBmmmmm].
- (_extraReg.id() << 16) | // [........|.LL.Xaaa|Vvvvv..R|RXBmmmmm].
- (broadcastBit << 20) ; // [........|.LLbXaaa|Vvvvv..R|RXBmmmmm].
- opReg &= 0x07u;
-
- // Mark invalid VEX (force EVEX) case: // [@.......|.LLbXaaa|Vvvvv..R|RXBmmmmm].
- x |= uint32_t(~commonInfo->flags() & InstDB::InstFlags::kVex) << (31 - Support::ConstCTZ<uint32_t(InstDB::InstFlags::kVex)>::value);
-
- // Handle AVX512 options by a single branch.
- const InstOptions kAvx512Options = InstOptions::kX86_ZMask |
- InstOptions::kX86_ER |
- InstOptions::kX86_SAE ;
- if (Support::test(options, kAvx512Options)) {
- // {er} and {sae} are both invalid if memory operand is used.
- if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_ER | InstOptions::kX86_SAE)))
- goto InvalidEROrSAE;
-
- x |= uint32_t(options & InstOptions::kX86_ZMask); // [@.......|zLLbXaaa|Vvvvv..R|RXBmmmmm].
- }
-
- // If these bits are used then EVEX prefix is required.
- constexpr uint32_t kEvexForce = 0x00000010u; // [........|........|........|...x....].
- constexpr uint32_t kEvexBits = 0x80DF8110u; // [@.......|xx.xxxxx|x......x|...x....].
-
- // Force EVEX prefix even in case the instruction has VEX encoding, because EVEX encoding is preferred. At the
- // moment this is only required for AVX_VNNI instructions, which were added after AVX512_VNNI instructions. If
- // such instruction doesn't specify prefix, EVEX (AVX512_VNNI) would be used by default,
- if (commonInfo->preferEvex()) {
- if ((x & kEvexBits) == 0 && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3)) {
- x |= kEvexForce;
- }
- }
-
- // Check if EVEX is required by checking bits in `x` : [@.......|xx.xxxxx|x......x|...x....].
- if (x & kEvexBits) {
- uint32_t y = ((x << 4) & 0x00080000u) | // [@.......|....V...|........|........].
- ((x >> 4) & 0x00000010u) ; // [@.......|....V...|........|...R....].
- x = (x & 0x00FF78EFu) | y; // [........|zLLbVaaa|0vvvv000|RXBRmmmm].
- x = x << 8; // [zLLbVaaa|0vvvv000|RBBRmmmm|00000000].
- x |= (opcode >> kVSHR_W ) & 0x00800000u; // [zLLbVaaa|Wvvvv000|RBBRmmmm|00000000].
- x |= (opcode >> kVSHR_PP_EW) & 0x00830000u; // [zLLbVaaa|Wvvvv0pp|RBBRmmmm|00000000] (added PP and EVEX.W).
- // _ ____ ____
- x ^= 0x087CF000u | kX86ByteEvex; // [zLLbVaaa|Wvvvv1pp|RBBRmmmm|01100010].
-
- if (x & 0x10000000u) {
- // Broadcast support.
- //
- // 1. Verify our LL field is correct as broadcast changes the "size" of the source operand. For example if
- // a broadcasted operand is qword_ptr[X] {1to8} the source size becomes 64 and not 8 as the memory operand
- // would report.
- //
- // 2. Change the compressed displacement scale to either x2 (SHL1), x4 (SHL 2), or x8 (SHL 3) depending on
- // the broadcast unit/element size.
- uint32_t broadcastUnitSize = commonInfo->broadcastSize();
- uint32_t broadcastVectorSize = broadcastUnitSize << uint32_t(rmRel->as<Mem>().getBroadcast());
-
- if (ASMJIT_UNLIKELY(broadcastUnitSize == 0))
- goto InvalidBroadcast;
-
- // LL was already shifted 8 bits right.
- constexpr uint32_t kLLShift = 21 + 8;
-
- uint32_t currentLL = x & (0x3u << kLLShift);
- uint32_t broadcastLL = (Support::max<uint32_t>(Support::ctz(broadcastVectorSize), 4) - 4) << kLLShift;
-
- if (broadcastLL > (2u << kLLShift))
- goto InvalidBroadcast;
-
- uint32_t newLL = Support::max(currentLL, broadcastLL);
- x = (x & ~(uint32_t(0x3) << kLLShift)) | newLL;
-
- opcode &=~uint32_t(Opcode::kCDSHL_Mask);
- opcode |= Support::ctz(broadcastUnitSize) << Opcode::kCDSHL_Shift;
- }
- else {
- // Add the compressed displacement 'SHF' to the opcode based on 'TTWLL'.
- // The index to `x86CDisp8SHL` is composed as `CDTT[4:3] | W[2] | LL[1:0]`.
- uint32_t TTWLL = ((opcode >> (Opcode::kCDTT_Shift - 3)) & 0x18) +
- ((opcode >> (Opcode::kW_Shift - 2)) & 0x04) +
- ((x >> 29) & 0x3);
- opcode += x86CDisp8SHL[TTWLL];
- }
-
- writer.emit32uLE(x);
- writer.emit8(opcode.v);
- }
- else {
- // Not EVEX, prepare `x` for VEX2 or VEX3: x = [........|00L00000|0vvvv000|RXBmmmmm].
- x |= ((opcode >> (kVSHR_W + 8)) & 0x8000u) | // [00000000|00L00000|Wvvvv000|RXBmmmmm].
- ((opcode >> (kVSHR_PP + 8)) & 0x0300u) | // [00000000|00L00000|Wvvvv0pp|RXBmmmmm].
- ((x >> 11 ) & 0x0400u) ; // [00000000|00L00000|WvvvvLpp|RXBmmmmm].
- x |= x86GetForceEvex3MaskInLastBit(options); // [x0000000|00L00000|WvvvvLpp|RXBmmmmm].
-
- // Clear a possible CDisp specified by EVEX.
- opcode &= ~Opcode::kCDSHL_Mask;
-
- // Check if VEX3 is required / forced: [x.......|........|x.......|.xxxxxx.].
- if (x & 0x8000807Eu) {
- uint32_t xorMsk = x86VEXPrefix[x & 0xF] | (opcode << 24);
-
- // Clear all high bits.
- x = (x & 0xFFFF) << 8; // [00000000|WvvvvLpp|RXBmmmmm|00000000].
- // ____ ___
- x ^= xorMsk; // [_OPCODE_|WvvvvLpp|RXBmmmmm|VEX3_XOP].
- writer.emit32uLE(x);
- }
- else {
- // 'mmmmm' must be '00001'.
- ASMJIT_ASSERT((x & 0x1F) == 0x01);
-
- x = ((x >> 8) ^ x) ^ 0xF9;
- writer.emit8(kX86ByteVex2);
- writer.emit8(x);
- writer.emit8(opcode.v);
- }
- }
- }
-
- // MOD|SIB address.
- if (!commonInfo->hasFlag(InstDB::InstFlags::kVsib))
- goto EmitModSib;
-
- // MOD|VSIB address without INDEX is invalid.
- if (rmInfo & kX86MemInfo_Index)
- goto EmitModVSib;
- goto InvalidInstruction;
-
- // Emit - Jmp/Jcc/Call
- // -------------------
-
-EmitJmpCall:
- {
- // Emit REX prefix if asked for (64-bit only).
- uint32_t rex = opcode.extractRex(options);
- if (ASMJIT_UNLIKELY(x86IsRexInvalid(rex)))
- goto InvalidRexPrefix;
- rex &= ~kX86ByteInvalidRex & 0xFF;
- writer.emit8If(rex | kX86ByteRex, rex != 0);
-
- uint64_t ip = uint64_t(writer.offsetFrom(_bufferData));
- uint32_t rel32 = 0;
- uint32_t opCode8 = x86AltOpcodeOf(instInfo);
-
- uint32_t inst8Size = 1 + 1; // OPCODE + REL8 .
- uint32_t inst32Size = 1 + 4; // [PREFIX] OPCODE + REL32.
-
- // Jcc instructions with 32-bit displacement use 0x0F prefix,
- // other instructions don't. No other prefixes are used by X86.
- ASMJIT_ASSERT((opCode8 & Opcode::kMM_Mask) == 0);
- ASMJIT_ASSERT((opcode & Opcode::kMM_Mask) == 0 ||
- (opcode & Opcode::kMM_Mask) == Opcode::kMM_0F);
-
- // Only one of these should be used at the same time.
- inst32Size += uint32_t(opReg != 0);
- inst32Size += uint32_t((opcode & Opcode::kMM_Mask) == Opcode::kMM_0F);
-
- if (rmRel->isLabel()) {
- label = _code->labelEntry(rmRel->as<Label>());
- if (ASMJIT_UNLIKELY(!label))
- goto InvalidLabel;
-
- if (label->isBoundTo(_section)) {
- // Label bound to the current section.
- rel32 = uint32_t((label->offset() - ip - inst32Size) & 0xFFFFFFFFu);
- goto EmitJmpCallRel;
- }
- else {
- // Non-bound label or label bound to a different section.
- if (opCode8 && (!opcode.v || Support::test(options, InstOptions::kShortForm))) {
- writer.emit8(opCode8);
-
- // Record DISP8 (non-bound label).
- relOffset = -1;
- relSize = 1;
- goto EmitRel;
- }
- else {
- // Refuse also 'short' prefix, if specified.
- if (ASMJIT_UNLIKELY(!opcode.v || Support::test(options, InstOptions::kShortForm)))
- goto InvalidDisplacement;
-
- writer.emit8If(0x0F, (opcode & Opcode::kMM_Mask) != 0);// Emit 0F prefix.
- writer.emit8(opcode.v); // Emit opcode.
- writer.emit8If(x86EncodeMod(3, opReg, 0), opReg != 0); // Emit MOD.
-
- // Record DISP32 (non-bound label).
- relOffset = -4;
- relSize = 4;
- goto EmitRel;
- }
- }
- }
-
- if (rmRel->isImm()) {
- uint64_t baseAddress = code()->baseAddress();
- uint64_t jumpAddress = rmRel->as<Imm>().valueAs<uint64_t>();
-
- // If the base-address is known calculate a relative displacement and check if it fits in 32 bits (which is
- // always true in 32-bit mode). Emit relative displacement as it was a bound label if all checks are ok.
- if (baseAddress != Globals::kNoBaseAddress) {
- uint64_t rel64 = jumpAddress - (ip + baseAddress) - inst32Size;
- if (Environment::is32Bit(arch()) || Support::isInt32(int64_t(rel64))) {
- rel32 = uint32_t(rel64 & 0xFFFFFFFFu);
- goto EmitJmpCallRel;
- }
- else {
- // Relative displacement exceeds 32-bits - relocator can only insert trampoline for jmp/call, but not
- // for jcc/jecxz.
- if (ASMJIT_UNLIKELY(!x86IsJmpOrCall(instId)))
- goto InvalidDisplacement;
- }
- }
-
- err = _code->newRelocEntry(&re, RelocType::kAbsToRel);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
- re->_sourceOffset = offset();
- re->_sourceSectionId = _section->id();
- re->_payload = jumpAddress;
-
- if (ASMJIT_LIKELY(opcode.v)) {
- // 64-bit: Emit REX prefix so the instruction can be patched later. REX prefix does nothing if not patched,
- // but allows to patch the instruction to use MOD/M and to point to a memory where the final 64-bit address
- // is stored.
- if (Environment::is64Bit(arch()) && x86IsJmpOrCall(instId)) {
- if (!rex)
- writer.emit8(kX86ByteRex);
-
- err = _code->addAddressToAddressTable(jumpAddress);
- if (ASMJIT_UNLIKELY(err))
- goto Failed;
-
- re->_relocType = RelocType::kX64AddressEntry;
- }
-
- writer.emit8If(0x0F, (opcode & Opcode::kMM_Mask) != 0); // Emit 0F prefix.
- writer.emit8(opcode.v); // Emit opcode.
- writer.emit8If(x86EncodeMod(3, opReg, 0), opReg != 0); // Emit MOD.
- re->_format.resetToSimpleValue(OffsetType::kSignedOffset, 4);
- re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
- writer.emit32uLE(0); // Emit DISP32.
- }
- else {
- writer.emit8(opCode8); // Emit opcode.
- re->_format.resetToSimpleValue(OffsetType::kSignedOffset, 1);
- re->_format.setLeadingAndTrailingSize(writer.offsetFrom(_bufferPtr), immSize);
- writer.emit8(0); // Emit DISP8 (zero).
- }
- goto EmitDone;
- }
-
- // Not Label|Imm -> Invalid.
- goto InvalidInstruction;
-
- // Emit jmp/call with relative displacement known at assembly-time. Decide between 8-bit and 32-bit displacement
- // encoding. Some instructions only allow either 8-bit or 32-bit encoding, others allow both encodings.
-EmitJmpCallRel:
- if (Support::isInt8(int32_t(rel32 + inst32Size - inst8Size)) && opCode8 && !Support::test(options, InstOptions::kLongForm)) {
- options |= InstOptions::kShortForm;
- writer.emit8(opCode8); // Emit opcode
- writer.emit8(rel32 + inst32Size - inst8Size); // Emit DISP8.
- goto EmitDone;
- }
- else {
- if (ASMJIT_UNLIKELY(!opcode.v || Support::test(options, InstOptions::kShortForm)))
- goto InvalidDisplacement;
-
- options &= ~InstOptions::kShortForm;
- writer.emit8If(0x0F, (opcode & Opcode::kMM_Mask) != 0); // Emit 0x0F prefix.
- writer.emit8(opcode.v); // Emit Opcode.
- writer.emit8If(x86EncodeMod(3, opReg, 0), opReg != 0); // Emit MOD.
- writer.emit32uLE(rel32); // Emit DISP32.
- goto EmitDone;
- }
- }
-
- // Emit - Relative
- // ---------------
-
-EmitRel:
- {
- ASMJIT_ASSERT(relSize == 1 || relSize == 4);
-
- // Chain with label.
- size_t offset = size_t(writer.offsetFrom(_bufferData));
- OffsetFormat of;
- of.resetToSimpleValue(OffsetType::kSignedOffset, relSize);
-
- LabelLink* link = _code->newLabelLink(label, _section->id(), offset, relOffset, of);
- if (ASMJIT_UNLIKELY(!link))
- goto OutOfMemory;
-
- if (re)
- link->relocId = re->id();
-
- // Emit dummy zeros, must be patched later when the reference becomes known.
- writer.emitZeros(relSize);
- }
- writer.emitImmediate(uint64_t(immValue), immSize);
-
- // Emit - Done
- // -----------
-
-EmitDone:
- if (Support::test(options, InstOptions::kReserved)) {
-#ifndef ASMJIT_NO_LOGGING
- if (_logger)
- EmitterUtils::logInstructionEmitted(this, instId, options, o0, o1, o2, opExt, relSize, immSize, writer.cursor());
-#endif
- }
-
- resetState();
- writer.done(this);
- return kErrorOk;
-
- // Error Handler
- // -------------
-
-#define ERROR_HANDLER(ERR) ERR: err = DebugUtils::errored(kError##ERR); goto Failed;
- ERROR_HANDLER(OutOfMemory)
- ERROR_HANDLER(InvalidLabel)
- ERROR_HANDLER(InvalidInstruction)
- ERROR_HANDLER(InvalidLockPrefix)
- ERROR_HANDLER(InvalidXAcquirePrefix)
- ERROR_HANDLER(InvalidXReleasePrefix)
- ERROR_HANDLER(InvalidRepPrefix)
- ERROR_HANDLER(InvalidRexPrefix)
- ERROR_HANDLER(InvalidEROrSAE)
- ERROR_HANDLER(InvalidAddress)
- ERROR_HANDLER(InvalidAddressIndex)
- ERROR_HANDLER(InvalidAddress64Bit)
- ERROR_HANDLER(InvalidDisplacement)
- ERROR_HANDLER(InvalidPhysId)
- ERROR_HANDLER(InvalidSegment)
- ERROR_HANDLER(InvalidImmediate)
- ERROR_HANDLER(InvalidBroadcast)
- ERROR_HANDLER(OperandSizeMismatch)
- ERROR_HANDLER(AmbiguousOperandSize)
- ERROR_HANDLER(NotConsecutiveRegs)
-#undef ERROR_HANDLER
-
-Failed:
-#ifndef ASMJIT_NO_LOGGING
- return EmitterUtils::logInstructionFailed(this, err, instId, options, o0, o1, o2, opExt);
-#else
- resetState();
- return reportError(err);
-#endif
-}
-
-//x86::Assembler - Align
-// =====================
-
-Error Assembler::align(AlignMode alignMode, uint32_t alignment) {
- if (ASMJIT_UNLIKELY(!_code))
- return reportError(DebugUtils::errored(kErrorNotInitialized));
-
- if (ASMJIT_UNLIKELY(uint32_t(alignMode) > uint32_t(AlignMode::kMaxValue)))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- if (alignment <= 1)
- return kErrorOk;
-
- if (ASMJIT_UNLIKELY(!Support::isPowerOf2(alignment) || alignment > Globals::kMaxAlignment))
- return reportError(DebugUtils::errored(kErrorInvalidArgument));
-
- uint32_t i = uint32_t(Support::alignUpDiff<size_t>(offset(), alignment));
- if (i > 0) {
- CodeWriter writer(this);
- ASMJIT_PROPAGATE(writer.ensureSpace(this, i));
-
- uint8_t pattern = 0x00;
- switch (alignMode) {
- case AlignMode::kCode: {
- if (hasEncodingOption(EncodingOptions::kOptimizedAlign)) {
- // Intel 64 and IA-32 Architectures Software Developer's Manual - Volume 2B (NOP).
- enum { kMaxNopSize = 9 };
-
- static const uint8_t nopData[kMaxNopSize][kMaxNopSize] = {
- { 0x90 },
- { 0x66, 0x90 },
- { 0x0F, 0x1F, 0x00 },
- { 0x0F, 0x1F, 0x40, 0x00 },
- { 0x0F, 0x1F, 0x44, 0x00, 0x00 },
- { 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00 },
- { 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00 },
- { 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 },
- { 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }
- };
-
- do {
- uint32_t n = Support::min<uint32_t>(i, kMaxNopSize);
- const uint8_t* src = nopData[n - 1];
-
- i -= n;
- do {
- writer.emit8(*src++);
- } while (--n);
- } while (i);
- }
-
- pattern = 0x90;
- break;
- }
-
- case AlignMode::kData:
- pattern = 0xCC;
- break;
-
- case AlignMode::kZero:
- // Pattern already set to zero.
- break;
- }
-
- while (i) {
- writer.emit8(pattern);
- i--;
- }
-
- writer.done(this);
- }
-
-#ifndef ASMJIT_NO_LOGGING
- if (_logger) {
- StringTmp<128> sb;
- sb.appendChars(' ', _logger->indentation(FormatIndentationGroup::kCode));
- sb.appendFormat("align %u\n", alignment);
- _logger->log(sb);
- }
-#endif
-
- return kErrorOk;
-}
-
-// x86::Assembler - Events
-// =======================
-
-Error Assembler::onAttach(CodeHolder* code) noexcept {
- Arch arch = code->arch();
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- _instructionAlignment = uint8_t(1);
- assignEmitterFuncs(this);
-
- if (Environment::is32Bit(arch)) {
- // 32 bit architecture - X86.
- _forcedInstOptions |= InstOptions::kX86_InvalidRex;
- _setAddressOverrideMask(kX86MemInfo_67H_X86);
- }
- else {
- // 64 bit architecture - X64.
- _forcedInstOptions &= ~InstOptions::kX86_InvalidRex;
- _setAddressOverrideMask(kX86MemInfo_67H_X64);
- }
-
- return kErrorOk;
-}
-
-Error Assembler::onDetach(CodeHolder* code) noexcept {
- _forcedInstOptions &= ~InstOptions::kX86_InvalidRex;
- _setAddressOverrideMask(0);
- return Base::onDetach(code);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86assembler.h b/3rdparty/asmjit/src/asmjit/x86/x86assembler.h
deleted file mode 100644
index dd980a72692..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86assembler.h
+++ /dev/null
@@ -1,695 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
-#define ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
-
-#include "../core/assembler.h"
-#include "../x86/x86emitter.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \addtogroup asmjit_x86
-//! \{
-
-//! X86/X64 assembler implementation.
-//!
-//! x86::Assembler is a code emitter that emits machine code directly into the \ref CodeBuffer. The assembler is capable
-//! of targeting both 32-bit and 64-bit instruction sets, the instruction set can be configured through \ref CodeHolder.
-//!
-//! ### Basics
-//!
-//! The following example shows a basic use of `x86::Assembler`, how to generate a function that works in both 32-bit
-//! and 64-bit modes, and how to connect \ref JitRuntime, \ref CodeHolder, and `x86::Assembler`.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef int (*SumFunc)(const int* arr, size_t count);
-//!
-//! int main() {
-//! JitRuntime rt; // Create a runtime specialized for JIT.
-//! CodeHolder code; // Create a CodeHolder.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
-//!
-//! // Decide between 32-bit CDECL, WIN64, and SysV64 calling conventions:
-//! // 32-BIT - passed all arguments by stack.
-//! // WIN64 - passes first 4 arguments by RCX, RDX, R8, and R9.
-//! // UNIX64 - passes first 6 arguments by RDI, RSI, RDX, RCX, R8, and R9.
-//! x86::Gp arr, cnt;
-//! x86::Gp sum = x86::eax; // Use EAX as 'sum' as it's a return register.
-//!
-//! if (ASMJIT_ARCH_BITS == 64) {
-//! #if defined(_WIN32)
-//! arr = x86::rcx; // First argument (array ptr).
-//! cnt = x86::rdx; // Second argument (number of elements)
-//! #else
-//! arr = x86::rdi; // First argument (array ptr).
-//! cnt = x86::rsi; // Second argument (number of elements)
-//! #endif
-//! }
-//! else {
-//! arr = x86::edx; // Use EDX to hold the array pointer.
-//! cnt = x86::ecx; // Use ECX to hold the counter.
-//! // Fetch first and second arguments from [ESP + 4] and [ESP + 8].
-//! a.mov(arr, x86::ptr(x86::esp, 4));
-//! a.mov(cnt, x86::ptr(x86::esp, 8));
-//! }
-//!
-//! Label Loop = a.newLabel(); // To construct the loop, we need some labels.
-//! Label Exit = a.newLabel();
-//!
-//! a.xor_(sum, sum); // Clear 'sum' register (shorter than 'mov').
-//! a.test(cnt, cnt); // Border case:
-//! a.jz(Exit); // If 'cnt' is zero jump to 'Exit' now.
-//!
-//! a.bind(Loop); // Start of a loop iteration.
-//! a.add(sum, x86::dword_ptr(arr)); // Add int at [arr] to 'sum'.
-//! a.add(arr, 4); // Increment 'arr' pointer.
-//! a.dec(cnt); // Decrease 'cnt'.
-//! a.jnz(Loop); // If not zero jump to 'Loop'.
-//!
-//! a.bind(Exit); // Exit to handle the border case.
-//! a.ret(); // Return from function ('sum' == 'eax').
-//! // ----> x86::Assembler is no longer needed from here and can be destroyed <----
-//!
-//! SumFunc fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//!
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
-//!
-//! static const int array[6] = { 4, 8, 15, 16, 23, 42 };
-//!
-//! int result = fn(array, 6); // Execute the generated code.
-//! printf("%d\n", result); // Print sum of array (108).
-//!
-//! rt.release(fn); // Explicitly remove the function from the runtime
-//! return 0; // Everything successful...
-//! }
-//! ```
-//!
-//! The example should be self-explanatory. It shows how to work with labels, how to use operands, and how to emit
-//! instructions that can use different registers based on runtime selection. It implements 32-bit CDECL, WIN64,
-//! and SysV64 calling conventions and will work on most X86/X64 environments.
-//!
-//! Although functions prologs / epilogs can be implemented manually, AsmJit provides utilities that can be used
-//! to create function prologs and epilogs automatically, see \ref asmjit_function for more details.
-//!
-//! ### Instruction Validation
-//!
-//! Assembler prefers speed over strictness by default. The implementation checks the type of operands and fails
-//! if the signature of types is invalid, however, it does only basic checks regarding registers and their groups
-//! used in instructions. It's possible to pass operands that don't form any valid signature to the implementation
-//! and succeed. This is usually not a problem as Assembler provides typed API so operand types are normally checked
-//! by C++ compiler at compile time, however, Assembler is fully dynamic and its \ref emit() function can be called
-//! with any instruction id, options, and operands. Moreover, it's also possible to form instructions that will be
-//! accepted by the typed API, for example by calling `mov(x86::eax, x86::al)` - the C++ compiler won't see a problem
-//! as both EAX and AL are \ref Gp registers.
-//!
-//! To help with common mistakes AsmJit allows to activate instruction validation. This feature instruments
-//! the Assembler to call \ref InstAPI::validate() before it attempts to encode any instruction.
-//!
-//! The example below illustrates how validation can be turned on:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! int main(int argc, char* argv[]) {
-//! JitRuntime rt; // Create a runtime specialized for JIT.
-//! CodeHolder code; // Create a CodeHolder.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
-//!
-//! // Enable strict validation.
-//! a.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
-//!
-//! // Try to encode invalid or ill-formed instructions.
-//! Error err;
-//!
-//! // Invalid instruction.
-//! err = a.mov(x86::eax, x86::al);
-//! printf("Status: %s\n", DebugUtils::errorAsString(err));
-//!
-//! // Invalid instruction.
-//! err = a.emit(x86::Inst::kIdMovss, x86::eax, x86::xmm0);
-//! printf("Status: %s\n", DebugUtils::errorAsString(err));
-//!
-//! // Ambiguous operand size - the pointer requires size.
-//! err = a.inc(x86::ptr(x86::rax));
-//! printf("Status: %s\n", DebugUtils::errorAsString(err));
-//!
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Native Registers
-//!
-//! All emitters provide functions to construct machine-size registers depending on the target. This feature is
-//! for users that want to write code targeting both 32-bit and 64-bit architectures at the same time. In AsmJit
-//! terminology such registers have prefix `z`, so for example on X86 architecture the following native registers
-//! are provided:
-//!
-//! - `zax` - mapped to either `eax` or `rax`
-//! - `zbx` - mapped to either `ebx` or `rbx`
-//! - `zcx` - mapped to either `ecx` or `rcx`
-//! - `zdx` - mapped to either `edx` or `rdx`
-//! - `zsp` - mapped to either `esp` or `rsp`
-//! - `zbp` - mapped to either `ebp` or `rbp`
-//! - `zsi` - mapped to either `esi` or `rsi`
-//! - `zdi` - mapped to either `edi` or `rdi`
-//!
-//! They are accessible through \ref x86::Assembler, \ref x86::Builder, and \ref x86::Compiler. The example below
-//! illustrates how to use this feature:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! typedef int (*Func)(void);
-//!
-//! int main(int argc, char* argv[]) {
-//! JitRuntime rt; // Create a runtime specialized for JIT.
-//! CodeHolder code; // Create a CodeHolder.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
-//!
-//! // Let's get these registers from x86::Assembler.
-//! x86::Gp zbp = a.zbp();
-//! x86::Gp zsp = a.zsp();
-//!
-//! int stackSize = 32;
-//!
-//! // Function prolog.
-//! a.push(zbp);
-//! a.mov(zbp, zsp);
-//! a.sub(zsp, stackSize);
-//!
-//! // ... emit some code (this just sets return value to zero) ...
-//! a.xor_(x86::eax, x86::eax);
-//!
-//! // Function epilog and return.
-//! a.mov(zsp, zbp);
-//! a.pop(zbp);
-//! a.ret();
-//!
-//! // To make the example complete let's call it.
-//! Func fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//!
-//! int result = fn(); // Execute the generated code.
-//! printf("%d\n", result); // Print the resulting "0".
-//!
-//! rt.release(fn); // Remove the function from the runtime.
-//! return 0;
-//! }
-//! ```
-//!
-//! The example just returns `0`, but the function generated contains a standard prolog and epilog sequence and the
-//! function itself reserves 32 bytes of local stack. The advantage is clear - a single code-base can handle multiple
-//! targets easily. If you want to create a register of native size dynamically by specifying its id it's also possible:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! using namespace asmjit;
-//!
-//! void example(x86::Assembler& a) {
-//! x86::Gp zax = a.gpz(x86::Gp::kIdAx);
-//! x86::Gp zbx = a.gpz(x86::Gp::kIdBx);
-//! x86::Gp zcx = a.gpz(x86::Gp::kIdCx);
-//! x86::Gp zdx = a.gpz(x86::Gp::kIdDx);
-//!
-//! // You can also change register's id easily.
-//! x86::Gp zsp = zax;
-//! zsp.setId(4); // or x86::Gp::kIdSp.
-//! }
-//! ```
-//!
-//! ### Data Embedding
-//!
-//! x86::Assembler extends the standard \ref BaseAssembler with X86/X64 specific conventions that are often used by
-//! assemblers to embed data next to the code. The following functions can be used to embed data:
-//!
-//! - \ref BaseAssembler::embedInt8() - embeds int8_t (portable naming).
-//! - \ref BaseAssembler::embedUInt8() - embeds uint8_t (portable naming).
-//! - \ref BaseAssembler::embedInt16() - embeds int16_t (portable naming).
-//! - \ref BaseAssembler::embedUInt16() - embeds uint16_t (portable naming).
-//! - \ref BaseAssembler::embedInt32() - embeds int32_t (portable naming).
-//! - \ref BaseAssembler::embedUInt32() - embeds uint32_t (portable naming).
-//! - \ref BaseAssembler::embedInt64() - embeds int64_t (portable naming).
-//! - \ref BaseAssembler::embedUInt64() - embeds uint64_t (portable naming).
-//! - \ref BaseAssembler::embedFloat() - embeds float (portable naming).
-//! - \ref BaseAssembler::embedDouble() - embeds double (portable naming).
-//!
-//! - \ref x86::Assembler::db() - embeds byte (8 bits) (x86 naming).
-//! - \ref x86::Assembler::dw() - embeds word (16 bits) (x86 naming).
-//! - \ref x86::Assembler::dd() - embeds dword (32 bits) (x86 naming).
-//! - \ref x86::Assembler::dq() - embeds qword (64 bits) (x86 naming).
-//!
-//! The following example illustrates how embed works:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! using namespace asmjit;
-//!
-//! void embedData(x86::Assembler& a) {
-//! a.db(0xFF); // Embeds 0xFF byte.
-//! a.dw(0xFF00); // Embeds 0xFF00 word (little-endian).
-//! a.dd(0xFF000000); // Embeds 0xFF000000 dword (little-endian).
-//! a.embedFloat(0.4f); // Embeds 0.4f (32-bit float, little-endian).
-//! }
-//! ```
-//!
-//! Sometimes it's required to read the data that is embedded after code, for example. This can be done through
-//! \ref Label as shown below:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! using namespace asmjit;
-//!
-//! void processData(x86::Assembler& a, const Label& L_Data) {
-//! x86::Gp addr = a.zax(); // EAX or RAX.
-//! x86::Gp val = x86::edi; // Where to store some value...
-//!
-//! // Approach 1 - Load the address to register through LEA. This approach
-//! // is flexible as the address can be then manipulated, for
-//! // example if you have a data array, which would need index.
-//! a.lea(addr, x86::ptr(L_Data));
-//! a.mov(val, x86::dword_ptr(addr));
-//!
-//! // Approach 2 - Load the data directly by using L_Data in address. It's
-//! // worth noting that this doesn't work with indexes in X64
-//! // mode. It will use absolute address in 32-bit mode and
-//! // relative address (RIP) in 64-bit mode.
-//! a.mov(val, x86::dword_ptr(L_Data));
-//! }
-//! ```
-//!
-//! ### Label Embedding
-//!
-//! It's also possible to embed labels. In general AsmJit provides the following options:
-//!
-//! - \ref BaseEmitter::embedLabel() - Embeds absolute address of a label. This is target dependent and would
-//! embed either 32-bit or 64-bit data that embeds absolute label address. This kind of embedding cannot be
-//! used in a position independent code.
-//!
-//! - \ref BaseEmitter::embedLabelDelta() - Embeds a difference between two labels. The size of the difference
-//! can be specified so it's possible to embed 8-bit, 16-bit, 32-bit, and 64-bit difference, which is sufficient
-//! for most purposes.
-//!
-//! The following example demonstrates how to embed labels and their differences:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! using namespace asmjit;
-//!
-//! void embedLabel(x86::Assembler& a, const Label& L_Data) {
-//! // [1] Embed L_Data - the size of the data will be dependent on the target.
-//! a.embedLabel(L_Data);
-//!
-//! // [2] Embed a 32-bit difference of two labels.
-//! Label L_Here = a.newLabel();
-//! a.bind(L_Here);
-//! // Embeds int32_t(L_Data - L_Here).
-//! a.embedLabelDelta(L_Data, L_Here, 4);
-//! }
-//! ```
-//!
-//! ### Using FuncFrame and FuncDetail with x86::Assembler
-//!
-//! The example below demonstrates how \ref FuncFrame and \ref FuncDetail can be used together with \ref x86::Assembler
-//! to generate a function that will use platform dependent calling conventions automatically depending on the target:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! typedef void (*SumIntsFunc)(int* dst, const int* a, const int* b);
-//!
-//! int main(int argc, char* argv[]) {
-//! JitRuntime rt; // Create JIT Runtime.
-//! CodeHolder code; // Create a CodeHolder.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
-//!
-//! // Decide which registers will be mapped to function arguments. Try changing
-//! // registers of dst, src_a, and src_b and see what happens in function's
-//! // prolog and epilog.
-//! x86::Gp dst = a.zax();
-//! x86::Gp src_a = a.zcx();
-//! x86::Gp src_b = a.zdx();
-//!
-//! x86::Xmm vec0 = x86::xmm0;
-//! x86::Xmm vec1 = x86::xmm1;
-//!
-//! // Create/initialize FuncDetail and FuncFrame.
-//! FuncDetail func;
-//! func.init(FuncSignature::build<void, int*, const int*, const int*>(),
-//! rt.environment());
-//!
-//! FuncFrame frame;
-//! frame.init(func);
-//!
-//! // Make XMM0 and XMM1 dirty - RegGroup::kVec describes XMM|YMM|ZMM registers.
-//! frame.setDirtyRegs(RegGroup::kVec, Support::bitMask(0, 1));
-//!
-//! // Alternatively, if you don't want to use register masks you can pass BaseReg
-//! // to addDirtyRegs(). The following code would add both xmm0 and xmm1.
-//! frame.addDirtyRegs(x86::xmm0, x86::xmm1);
-//!
-//! FuncArgsAssignment args(&func); // Create arguments assignment context.
-//! args.assignAll(dst, src_a, src_b);// Assign our registers to arguments.
-//! args.updateFuncFrame(frame); // Reflect our args in FuncFrame.
-//! frame.finalize(); // Finalize the FuncFrame (updates it).
-//!
-//! a.emitProlog(frame); // Emit function prolog.
-//! a.emitArgsAssignment(frame, args);// Assign arguments to registers.
-//! a.movdqu(vec0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
-//! a.movdqu(vec1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
-//! a.paddd(vec0, vec1); // Add 4 ints in XMM1 to XMM0.
-//! a.movdqu(x86::ptr(dst), vec0); // Store the result to [dst].
-//! a.emitEpilog(frame); // Emit function epilog and return.
-//!
-//! SumIntsFunc fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error case.
-//!
-//! // Execute the generated function.
-//! int inA[4] = { 4, 3, 2, 1 };
-//! int inB[4] = { 1, 5, 2, 8 };
-//! int out[4];
-//! fn(out, inA, inB);
-//!
-//! // Prints {5 8 4 9}
-//! printf("{%d %d %d %d}\n", out[0], out[1], out[2], out[3]);
-//!
-//! rt.release(fn);
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Using x86::Assembler as Code-Patcher
-//!
-//! This is an advanced topic that is sometimes unavoidable. AsmJit by default appends machine code it generates
-//! into a \ref CodeBuffer, however, it also allows to set the offset in \ref CodeBuffer explicitly and to overwrite
-//! its content. This technique is extremely dangerous as X86 instructions have variable length (see below), so you
-//! should in general only patch code to change instruction's immediate values or some other details not known the
-//! at a time the instruction was emitted. A typical scenario that requires code-patching is when you start emitting
-//! function and you don't know how much stack you want to reserve for it.
-//!
-//! Before we go further it's important to introduce instruction options, because they can help with code-patching
-//! (and not only patching, but that will be explained in AVX-512 section):
-//!
-//! - Many general-purpose instructions (especially arithmetic ones) on X86 have multiple encodings - in AsmJit
-//! this is usually called 'short form' and 'long form'.
-//!
-//! - AsmJit always tries to use 'short form' as it makes the resulting machine-code smaller, which is always
-//! good - this decision is used by majority of assemblers out there.
-//!
-//! - AsmJit allows to override the default decision by using `short_()` and `long_()` instruction options to force
-//! short or long form, respectively. The most useful is `long_()` as it basically forces AsmJit to always emit
-//! the longest form. The `short_()` is not that useful as it's automatic (except jumps to non-bound labels). Note
-//! that the underscore after each function name avoids collision with built-in C++ types.
-//!
-//! To illustrate what short form and long form means in binary let's assume we want to emit "add esp, 16" instruction,
-//! which has two possible binary encodings:
-//!
-//! - `83C410` - This is a short form aka `short add esp, 16` - You can see opcode byte (0x8C), MOD/RM byte (0xC4)
-//! and an 8-bit immediate value representing `16`.
-//!
-//! - `81C410000000` - This is a long form aka `long add esp, 16` - You can see a different opcode byte (0x81), the
-//! same Mod/RM byte (0xC4) and a 32-bit immediate in little-endian representing `16`.
-//!
-//! It should be obvious that patching an existing instruction into an instruction having a different size may create
-//! various problems. So it's recommended to be careful and to only patch instructions into instructions having the
-//! same size. The example below demonstrates how instruction options can be used to guarantee the size of an
-//! instruction by forcing the assembler to use long-form encoding:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! typedef int (*Func)(void);
-//!
-//! int main(int argc, char* argv[]) {
-//! JitRuntime rt; // Create a runtime specialized for JIT.
-//! CodeHolder code; // Create a CodeHolder.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Assembler a(&code); // Create and attach x86::Assembler to code.
-//!
-//! // Let's get these registers from x86::Assembler.
-//! x86::Gp zbp = a.zbp();
-//! x86::Gp zsp = a.zsp();
-//!
-//! // Function prolog.
-//! a.push(zbp);
-//! a.mov(zbp, zsp);
-//!
-//! // This is where we are gonna patch the code later, so let's get the offset
-//! // (the current location) from the beginning of the code-buffer.
-//! size_t patchOffset = a.offset();
-//! // Let's just emit 'sub zsp, 0' for now, but don't forget to use LONG form.
-//! a.long_().sub(zsp, 0);
-//!
-//! // ... emit some code (this just sets return value to zero) ...
-//! a.xor_(x86::eax, x86::eax);
-//!
-//! // Function epilog and return.
-//! a.mov(zsp, zbp);
-//! a.pop(zbp);
-//! a.ret();
-//!
-//! // Now we know how much stack size we want to reserve. I have chosen 128
-//! // bytes on purpose as it's encodable only in long form that we have used.
-//!
-//! int stackSize = 128; // Number of bytes to reserve on the stack.
-//! a.setOffset(patchOffset); // Move the current cursor to `patchOffset`.
-//! a.long_().sub(zsp, stackSize); // Patch the code; don't forget to use LONG form.
-//!
-//! // Now the code is ready to be called
-//! Func fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//!
-//! int result = fn(); // Execute the generated code.
-//! printf("%d\n", result); // Print the resulting "0".
-//!
-//! rt.release(fn); // Remove the function from the runtime.
-//! return 0;
-//! }
-//! ```
-//!
-//! If you run the example it will just work, because both instructions have the same size. As an experiment you can
-//! try removing `long_()` form to see what happens when wrong code is generated.
-//!
-//! ### Code Patching and REX Prefix
-//!
-//! In 64-bit mode there is one more thing to worry about when patching code: REX prefix. It's a single byte prefix
-//! designed to address registers with ids from 9 to 15 and to override the default width of operation from 32 to 64
-//! bits. AsmJit, like other assemblers, only emits REX prefix when it's necessary. If the patched code only changes
-//! the immediate value as shown in the previous example then there is nothing to worry about as it doesn't change
-//! the logic behind emitting REX prefix, however, if the patched code changes register id or overrides the operation
-//! width then it's important to take care of REX prefix as well.
-//!
-//! AsmJit contains another instruction option that controls (forces) REX prefix - `rex()`. If you use it the
-//! instruction emitted will always use REX prefix even when it's encodable without it. The following list contains
-//! some instructions and their binary representations to illustrate when it's emitted:
-//!
-//! - `__83C410` - `add esp, 16` - 32-bit operation in 64-bit mode doesn't require REX prefix.
-//! - `4083C410` - `rex add esp, 16` - 32-bit operation in 64-bit mode with forced REX prefix (0x40).
-//! - `4883C410` - `add rsp, 16` - 64-bit operation in 64-bit mode requires REX prefix (0x48).
-//! - `4183C410` - `add r12d, 16` - 32-bit operation in 64-bit mode using R12D requires REX prefix (0x41).
-//! - `4983C410` - `add r12, 16` - 64-bit operation in 64-bit mode using R12 requires REX prefix (0x49).
-//!
-//! ### More Prefixes
-//!
-//! X86 architecture is known for its prefixes. AsmJit supports all prefixes
-//! that can affect how the instruction is encoded:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! void prefixesExample(x86::Assembler& a) {
-//! // Lock prefix for implementing atomics:
-//! // lock add dword ptr [rdi], 1
-//! a.lock().add(x86::dword_ptr(x86::rdi), 1);
-//!
-//! // Similarly, XAcquire/XRelease prefixes are also available:
-//! // xacquire add dword ptr [rdi], 1
-//! a.xacquire().add(x86::dword_ptr(x86::rdi), 1);
-//!
-//! // Rep prefix (see also repe/repz and repne/repnz):
-//! // rep movs byte ptr [rdi], byte ptr [rsi]
-//! a.rep().movs(x86::byte_ptr(x86::rdi), x86::byte_ptr(x86::rsi));
-//!
-//! // Forcing REX prefix in 64-bit mode.
-//! // rex mov eax, 1
-//! a.rex().mov(x86::eax, 1);
-//!
-//! // AVX instruction without forced prefix uses the shortest encoding:
-//! // vaddpd xmm0, xmm1, xmm2 -> [C5|F1|58|C2]
-//! a.vaddpd(x86::xmm0, x86::xmm1, x86::xmm2);
-//!
-//! // Forcing VEX3 prefix (AVX):
-//! // vex3 vaddpd xmm0, xmm1, xmm2 -> [C4|E1|71|58|C2]
-//! a.vex3().vaddpd(x86::xmm0, x86::xmm1, x86::xmm2);
-//!
-//! // Forcing EVEX prefix (AVX512):
-//! // evex vaddpd xmm0, xmm1, xmm2 -> [62|F1|F5|08|58|C2]
-//! a.evex().vaddpd(x86::xmm0, x86::xmm1, x86::xmm2);
-//!
-//! // Some instructions accept prefixes not originally intended to:
-//! // rep ret
-//! a.rep().ret();
-//! }
-//! ```
-//!
-//! It's important to understand that prefixes are part of instruction options. When a member function that involves
-//! adding a prefix is called the prefix is combined with existing instruction options, which will affect the next
-//! instruction generated.
-//!
-//! ### Generating AVX512 code.
-//!
-//! x86::Assembler can generate AVX512+ code including the use of opmask registers. Opmask can be specified through
-//! \ref x86::Assembler::k() function, which stores it as an extra register, which will be used by the next
-//! instruction. AsmJit uses such concept for manipulating instruction options as well.
-//!
-//! The following AVX512 features are supported:
-//!
-//! - Opmask selector {k} and zeroing {z}.
-//! - Rounding modes {rn|rd|ru|rz} and suppress-all-exceptions {sae} option.
-//! - AVX512 broadcasts {1toN}.
-//!
-//! The following example demonstrates how AVX512 features can be used:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! void generateAVX512Code(x86::Assembler& a) {
-//! using namespace x86;
-//!
-//! // Opmask Selectors
-//! // ----------------
-//! //
-//! // - Opmask / zeroing is part of the instruction options / extraReg.
-//! // - k(reg) is like {kreg} in Intel syntax.
-//! // - z() is like {z} in Intel syntax.
-//!
-//! // vaddpd zmm {k1} {z}, zmm1, zmm2
-//! a.k(k1).z().vaddpd(zmm0, zmm1, zmm2);
-//!
-//! // Memory Broadcasts
-//! // -----------------
-//! //
-//! // - Broadcast data is part of memory operand.
-//! // - Use x86::Mem::_1to2(), x86::Mem::_1to4(), etc..., which returns a new x86::Mem operand with broadcast.
-//!
-//! // vaddpd zmm0 {k1} {z}, zmm1, [rcx] {1to8}
-//! a.k(k1).z().vaddpd(zmm0, zmm1, x86::ptr(rcx)._1to8());
-//!
-//! // Embedded Rounding & Suppress-All-Exceptions
-//! // -------------------------------------------
-//! //
-//! // - Rounding mode and {sae} are part of instruction options.
-//! // - Use sae() to enable exception suppression.
-//! // - Use rn_sae(), rd_sae(), ru_sae(), and rz_sae() - to enable rounding.
-//! // - Embedded rounding implicitly sets {sae} as well, that's why the API
-//! // also has sae() suffix, to make it clear.
-//!
-//! // vcmppd k1, zmm1, zmm2, 0x00 {sae}
-//! a.sae().vcmppd(k1, zmm1, zmm2, 0);
-//!
-//! // vaddpd zmm0, zmm1, zmm2 {rz}
-//! a.rz_sae().vaddpd(zmm0, zmm1, zmm2);
-//! }
-//! ```
-class ASMJIT_VIRTAPI Assembler
- : public BaseAssembler,
- public EmitterImplicitT<Assembler> {
-public:
- ASMJIT_NONCOPYABLE(Assembler)
- typedef BaseAssembler Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API explicit Assembler(CodeHolder* code = nullptr) noexcept;
- ASMJIT_API ~Assembler() noexcept override;
-
- //! \}
-
- //! \cond INTERNAL
- //! \name Internal
- //! \{
-
- // NOTE: x86::Assembler uses _privateData to store 'address-override' bit that is used to decide whether to emit
- // address-override (67H) prefix based on the memory BASE+INDEX registers. It's either `kX86MemInfo_67H_X86` or
- // `kX86MemInfo_67H_X64`.
- ASMJIT_INLINE_NODEBUG uint32_t _addressOverrideMask() const noexcept { return _privateData; }
- ASMJIT_INLINE_NODEBUG void _setAddressOverrideMask(uint32_t m) noexcept { _privateData = m; }
-
- //! \}
- //! \endcond
-
- //! \cond INTERNAL
- //! \name Emit
- //! \{
-
- ASMJIT_API Error _emit(InstId instId, const Operand_& o0, const Operand_& o1, const Operand_& o2, const Operand_* opExt) override;
-
- //! \}
- //! \endcond
-
- //! \name Align
- //! \{
-
- ASMJIT_API Error align(AlignMode alignMode, uint32_t alignment) override;
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp b/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp
deleted file mode 100644
index 9f025a15bc0..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86builder.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_BUILDER)
-
-#include "../x86/x86assembler.h"
-#include "../x86/x86builder.h"
-#include "../x86/x86emithelper_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::Builder - Construction & Destruction
-// =========================================
-
-Builder::Builder(CodeHolder* code) noexcept : BaseBuilder() {
- _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) |
- (uint64_t(1) << uint32_t(Arch::kX64)) ;
- if (code)
- code->attach(this);
-}
-Builder::~Builder() noexcept {}
-
-// x86::Builder - Events
-// =====================
-
-Error Builder::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
-
- _instructionAlignment = uint8_t(1);
- assignEmitterFuncs(this);
-
- return kErrorOk;
-}
-
-Error Builder::onDetach(CodeHolder* code) noexcept {
- return Base::onDetach(code);
-}
-
-// x86::Builder - Finalize
-// =======================
-
-Error Builder::finalize() {
- ASMJIT_PROPAGATE(runPasses());
- Assembler a(_code);
- a.addEncodingOptions(encodingOptions());
- a.addDiagnosticOptions(diagnosticOptions());
- return serializeTo(&a);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_BUILDER
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86builder.h b/3rdparty/asmjit/src/asmjit/x86/x86builder.h
deleted file mode 100644
index 194c1402f11..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86builder.h
+++ /dev/null
@@ -1,354 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86BUILDER_H_INCLUDED
-#define ASMJIT_X86_X86BUILDER_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_BUILDER
-
-#include "../core/builder.h"
-#include "../x86/x86emitter.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \addtogroup asmjit_x86
-//! \{
-
-//! X86/X64 builder implementation.
-//!
-//! The code representation used by \ref BaseBuilder is compatible with everything AsmJit provides. Each instruction
-//! is stored as \ref InstNode, which contains instruction id, options, and operands. Each instruction emitted will
-//! create a new \ref InstNode instance and add it to the current cursor in the double-linked list of nodes. Since
-//! the instruction stream used by \ref BaseBuilder can be manipulated, we can rewrite the SumInts example from
-//! \ref asmjit_assembler into the following:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! typedef void (*SumIntsFunc)(int* dst, const int* a, const int* b);
-//!
-//! // Small helper function to print the current content of `cb`.
-//! static void dumpCode(BaseBuilder& builder, const char* phase) {
-//! String sb;
-//! formatOptions formatOptions {};
-//!
-//! Formatter::formatNodeList(sb, formatOptions, &builder);
-//! printf("%s:\n%s\n", phase, sb.data());
-//! }
-//!
-//! int main() {
-//! JitRuntime rt; // Create JIT Runtime.
-//! CodeHolder code; // Create a CodeHolder.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Builder cb(&code); // Create and attach x86::Builder to `code`.
-//!
-//! // Decide which registers will be mapped to function arguments. Try changing registers
-//! // of `dst`, `srcA`, and `srcB` and see what happens in function's prolog and epilog.
-//! x86::Gp dst = cb.zax();
-//! x86::Gp srcA = cb.zcx();
-//! x86::Gp srcB = cb.zdx();
-//!
-//! X86::Xmm vec0 = x86::xmm0;
-//! X86::Xmm vec1 = x86::xmm1;
-//!
-//! // Create and initialize `FuncDetail`.
-//! FuncDetail func;
-//! func.init(FuncSignature::build<void, int*, const int*, const int*>());
-//!
-//! // Remember prolog insertion point.
-//! BaseNode* prologInsertionPoint = cb.cursor();
-//!
-//! // Emit function body:
-//! cb.movdqu(vec0, x86::ptr(srcA)); // Load 4 ints from [srcA] to XMM0.
-//! cb.movdqu(vec1, x86::ptr(srcB)); // Load 4 ints from [srcB] to XMM1.
-//! cb.paddd(vec0, vec1); // Add 4 ints in XMM1 to XMM0.
-//! cb.movdqu(x86::ptr(dst), vec0); // Store the result to [dst].
-//!
-//! // Remember epilog insertion point.
-//! BaseNode* epilogInsertionPoint = cb.cursor();
-//!
-//! // Let's see what we have now.
-//! dumpCode(cb, "Raw Function");
-//!
-//! // Now, after we emitted the function body, we can insert the prolog, arguments
-//! // allocation, and epilog. This is not possible with using pure x86::Assembler.
-//! FuncFrame frame;
-//! frame.init(func);
-//!
-//! // Make XMM0 and XMM1 dirty; RegGroup::kVec describes XMM|YMM|ZMM registers.
-//! frame.setDirtyRegs(RegGroup::kVec, IntUtils::mask(0, 1));
-//!
-//! FuncArgsAssignment args(&func); // Create arguments assignment context.
-//! args.assignAll(dst, srcA, srcB); // Assign our registers to arguments.
-//! args.updateFrame(frame); // Reflect our args in FuncFrame.
-//! frame.finalize(); // Finalize the FuncFrame (updates it).
-//!
-//! // Insert function prolog and allocate arguments to registers.
-//! cb.setCursor(prologInsertionPoint);
-//! cb.emitProlog(frame);
-//! cb.emitArgsAssignment(frame, args);
-//!
-//! // Insert function epilog.
-//! cb.setCursor(epilogInsertionPoint);
-//! cb.emitEpilog(frame);
-//!
-//! // Let's see how the function's prolog and epilog looks.
-//! dumpCode(cb, "Prolog & Epilog");
-//!
-//! // IMPORTANT: Builder requires finalize() to be called to serialize its
-//! // code to the Assembler (it automatically creates one if not attached).
-//! cb.finalize();
-//!
-//! SumIntsFunc fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error case.
-//!
-//! // Execute the generated function.
-//! int inA[4] = { 4, 3, 2, 1 };
-//! int inB[4] = { 1, 5, 2, 8 };
-//! int out[4];
-//! fn(out, inA, inB);
-//!
-//! // Prints {5 8 4 9}
-//! printf("{%d %d %d %d}\n", out[0], out[1], out[2], out[3]);
-//!
-//! rt.release(fn); // Explicitly remove the function from the runtime.
-//! return 0;
-//! }
-//! ```
-//!
-//! When the example is executed it should output the following (this one using AMD64-SystemV ABI):
-//!
-//! ```
-//! Raw Function:
-//! movdqu xmm0, [rcx]
-//! movdqu xmm1, [rdx]
-//! paddd xmm0, xmm1
-//! movdqu [rax], xmm0
-//!
-//! Prolog & Epilog:
-//! mov rax, rdi
-//! mov rcx, rsi
-//! movdqu xmm0, [rcx]
-//! movdqu xmm1, [rdx]
-//! paddd xmm0, xmm1
-//! movdqu [rax], xmm0
-//! ret
-//!
-//! {5 8 4 9}
-//! ```
-//!
-//! The number of use-cases of \ref BaseBuilder is not limited and highly depends on your creativity and experience.
-//! The previous example can be easily improved to collect all dirty registers inside the function programmatically
-//! and to pass them to \ref FuncFrame::setDirtyRegs().
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! // NOTE: This function doesn't cover all possible constructs. It ignores instructions that write
-//! // to implicit registers that are not part of the operand list. It also counts read-only registers.
-//! // Real implementation would be a bit more complicated, but still relatively easy to implement.
-//! static void collectDirtyRegs(const BaseNode* first,
-//! const BaseNode* last,
-//! Support::Array<RegMask, Globals::kNumVirtGroups>& regMask) {
-//! const BaseNode* node = first;
-//! while (node) {
-//! if (node->actsAsInst()) {
-//! const InstNode* inst = node->as<InstNode>();
-//! const Operand* opArray = inst->operands();
-//!
-//! for (uint32_t i = 0, opCount = inst->opCount(); i < opCount; i++) {
-//! const Operand& op = opArray[i];
-//! if (op.isReg()) {
-//! const x86::Reg& reg = op.as<x86::Reg>();
-//! if (reg.group() <= RegGroup::kMaxVirt) {
-//! regMask[reg.group()] |= 1u << reg.id();
-//! }
-//! }
-//! }
-//! }
-//!
-//! if (node == last)
-//! break;
-//! node = node->next();
-//! }
-//! }
-//!
-//! static void setDirtyRegsOfFuncFrame(const x86::Builder& builder, FuncFrame& frame) {
-//! Support::Array<RegMask, Globals::kNumVirtGroups> regMask {};
-//! collectDirtyRegs(builder.firstNode(), builder.lastNode(), regMask);
-//!
-//! // X86/X64 ABIs only require to save GP/XMM registers:
-//! frame.setDirtyRegs(RegGroup::kGp, regMask[RegGroup::kGp]);
-//! frame.setDirtyRegs(RegGroup::kVec, regMask[RegGroup::kVec]);
-//! }
-//! ```
-//!
-//! ### Casting Between Various Emitters
-//!
-//! Even when \ref BaseAssembler and \ref BaseBuilder provide the same interface as defined by \ref BaseEmitter their
-//! platform dependent variants like \ref x86::Assembler and \ref x86::Builder cannot be interchanged or casted to each
-//! other by using a C++ `static_cast<>`. The main reason is the inheritance graph of these classes is different and
-//! cast-incompatible, as illustrated below:
-//!
-//! ```
-//! +--------------+ +=========================+
-//! +----------------------->| x86::Emitter |<--+--# x86::EmitterImplicitT<> #<--+
-//! | +--------------+ | +=========================+ |
-//! | (abstract) | (mixin) |
-//! | +--------------+ +~~~~~~~~~~~~~~+ | |
-//! +-->| BaseAssembler|---->|x86::Assembler|<--+ |
-//! | +--------------+ +~~~~~~~~~~~~~~+ | |
-//! | (abstract) (final) | |
-//! +===============+ | +--------------+ +~~~~~~~~~~~~~~+ | |
-//! # BaseEmitter #--+-->| BaseBuilder |--+->| x86::Builder |<--+ |
-//! +===============+ +--------------+ | +~~~~~~~~~~~~~~+ |
-//! (abstract) (abstract) | (final) |
-//! +---------------------+ |
-//! | |
-//! | +--------------+ +~~~~~~~~~~~~~~+ +=========================+ |
-//! +-->| BaseCompiler |---->| x86::Compiler|<-----# x86::EmitterExplicitT<> #---+
-//! +--------------+ +~~~~~~~~~~~~~~+ +=========================+
-//! (abstract) (final) (mixin)
-//! ```
-//!
-//! The graph basically shows that it's not possible to cast between \ref x86::Assembler and \ref x86::Builder.
-//! However, since both share the base interface (\ref BaseEmitter) it's possible to cast them to a class that
-//! cannot be instantiated, but defines the same interface - the class is called \ref x86::Emitter and was
-//! introduced to make it possible to write a function that can emit to both \ref x86::Assembler and \ref
-//! x86::Builder. Note that \ref x86::Emitter cannot be created, it's abstract and has private constructors and
-//! destructors; it was only designed to be casted to and used as an interface.
-//!
-//! Each architecture-specific emitter implements a member function called
-//! `as<arch::Emitter>()`, which casts the instance to the architecture
-//! specific emitter as illustrated below:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! static void emitSomething(x86::Emitter* e) {
-//! e->mov(x86::eax, x86::ebx);
-//! }
-//!
-//! static void assemble(CodeHolder& code, bool useAsm) {
-//! if (useAsm) {
-//! x86::Assembler assembler(&code);
-//! emitSomething(assembler.as<x86::Emitter>());
-//! }
-//! else {
-//! x86::Builder builder(&code);
-//! emitSomething(builder.as<x86::Emitter>());
-//!
-//! // NOTE: Builder requires `finalize()` to be called to serialize its
-//! // content to Assembler (it automatically creates one if not attached).
-//! builder.finalize();
-//! }
-//! }
-//! ```
-//!
-//! The example above shows how to create a function that can emit code to either \ref x86::Assembler or \ref
-//! x86::Builder through \ref x86::Emitter, which provides emitter-neutral functionality. \ref x86::Emitter,
-//! however, doesn't provide any emitter-specific functionality like `setCursor()`.
-//!
-//! ### Code Injection and Manipulation
-//!
-//! \ref BaseBuilder emitter stores its nodes in a double-linked list, which makes it easy to manipulate that
-//! list during the code generation or afterwards. Each node is always emitted next to the current cursor and
-//! the cursor is advanced to that newly emitted node. The cursor can be retrieved and changed by \ref
-//! BaseBuilder::cursor() and \ref BaseBuilder::setCursor(), respectively.
-//!
-//! The example below demonstrates how to remember a node and inject something
-//! next to it.
-//!
-//! ```
-//! static void example(x86::Builder& builder) {
-//! // Emit something, after it returns the cursor would point at the last
-//! // emitted node.
-//! builder.mov(x86::rax, x86::rdx); // [1]
-//!
-//! // We can retrieve the node.
-//! BaseNode* node = builder.cursor();
-//!
-//! // Change the instruction we just emitted, just for fun...
-//! if (node->isInst()) {
-//! InstNode* inst = node->as<InstNode>();
-//! // Changes the operands at index [1] to RCX.
-//! inst->setOp(1, x86::rcx);
-//! }
-//!
-//! // ------------------------- Generate Some Code -------------------------
-//! builder.add(x86::rax, x86::rdx); // [2]
-//! builder.shr(x86::rax, 3); // [3]
-//! // ----------------------------------------------------------------------
-//!
-//! // Now, we know where our node is, and we can simply change the cursor
-//! // and start emitting something after it. The setCursor() function
-//! // returns the previous cursor, and it's always a good practice to remember
-//! // it, because you never know if you are not already injecting the code
-//! // somewhere else...
-//! BaseNode* oldCursor = builder.setCursor(node);
-//!
-//! builder.mul(x86::rax, 8); // [4]
-//!
-//! // Restore the cursor
-//! builder.setCursor(oldCursor);
-//! }
-//! ```
-//!
-//! The function above would actually emit the following:
-//!
-//! ```
-//! mov rax, rcx ; [1] Patched at the beginning.
-//! mul rax, 8 ; [4] Injected.
-//! add rax, rdx ; [2] Followed [1] initially.
-//! shr rax, 3 ; [3] Follows [2].
-//! ```
-class ASMJIT_VIRTAPI Builder
- : public BaseBuilder,
- public EmitterImplicitT<Builder> {
-public:
- ASMJIT_NONCOPYABLE(Builder)
- typedef BaseBuilder Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API explicit Builder(CodeHolder* code = nullptr) noexcept;
- ASMJIT_API ~Builder() noexcept override;
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-
- //! \name Finalize
- //! \{
-
- ASMJIT_API Error finalize() override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_BUILDER
-#endif // ASMJIT_X86_X86BUILDER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp b/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp
deleted file mode 100644
index 830600edabc..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86compiler.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
-
-#include "../x86/x86assembler.h"
-#include "../x86/x86compiler.h"
-#include "../x86/x86instapi_p.h"
-#include "../x86/x86rapass_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::Compiler - Construction & Destruction
-// ==========================================
-
-Compiler::Compiler(CodeHolder* code) noexcept : BaseCompiler() {
- _archMask = (uint64_t(1) << uint32_t(Arch::kX86)) |
- (uint64_t(1) << uint32_t(Arch::kX64)) ;
- if (code)
- code->attach(this);
-}
-Compiler::~Compiler() noexcept {}
-
-// x86::Compiler - Events
-// ======================
-
-Error Compiler::onAttach(CodeHolder* code) noexcept {
- ASMJIT_PROPAGATE(Base::onAttach(code));
- Error err = addPassT<X86RAPass>();
-
- if (ASMJIT_UNLIKELY(err)) {
- onDetach(code);
- return err;
- }
-
- _instructionAlignment = uint8_t(1);
- assignEmitterFuncs(this);
-
- return kErrorOk;
-}
-
-Error Compiler::onDetach(CodeHolder* code) noexcept {
- return Base::onDetach(code);
-}
-
-// x86::Compiler - Finalize
-// ========================
-
-Error Compiler::finalize() {
- ASMJIT_PROPAGATE(runPasses());
- Assembler a(_code);
- a.addEncodingOptions(encodingOptions());
- a.addDiagnosticOptions(diagnosticOptions());
- return serializeTo(&a);
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86compiler.h b/3rdparty/asmjit/src/asmjit/x86/x86compiler.h
deleted file mode 100644
index b281e208879..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86compiler.h
+++ /dev/null
@@ -1,726 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86COMPILER_H_INCLUDED
-#define ASMJIT_X86_X86COMPILER_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/compiler.h"
-#include "../core/type.h"
-#include "../x86/x86emitter.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \addtogroup asmjit_x86
-//! \{
-
-//! X86/X64 compiler implementation.
-//!
-//! ### Compiler Basics
-//!
-//! The first \ref x86::Compiler example shows how to generate a function that simply returns an integer value. It's
-//! an analogy to the first Assembler example:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef int (*Func)(void);
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! CodeHolder code; // Holds code and relocation information.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
-//!
-//! cc.addFunc(FuncSignature::build<int>()); // Begin a function of `int fn(void)` signature.
-//!
-//! x86::Gp vReg = cc.newGpd(); // Create a 32-bit general purpose register.
-//! cc.mov(vReg, 1); // Move one to our virtual register `vReg`.
-//! cc.ret(vReg); // Return `vReg` from the function.
-//!
-//! cc.endFunc(); // End of the function body.
-//! cc.finalize(); // Translate and assemble the whole 'cc' content.
-//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
-//!
-//! Func fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
-//!
-//! int result = fn(); // Execute the generated code.
-//! printf("%d\n", result); // Print the resulting "1".
-//!
-//! rt.release(fn); // Explicitly remove the function from the runtime.
-//! return 0;
-//! }
-//! ```
-//!
-//! The \ref BaseCompiler::addFunc() and \ref BaseCompiler::endFunc() functions are used to define the function and
-//! its end. Both must be called per function, but the body doesn't have to be generated in sequence. An example of
-//! generating two functions will be shown later. The next example shows more complicated code that contain a loop
-//! and generates a simple memory copy function that uses `uint32_t` items:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef void (*MemCpy32)(uint32_t* dst, const uint32_t* src, size_t count);
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! CodeHolder code; // Holds code and relocation information.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
-//!
-//! FuncNode* funcNode = cc.addFunc ( // Begin the function of the following signature:
-//! FuncSignature::build<void, // Return value - void (no return value).
-//! uint32_t*, // 1st argument - uint32_t* (machine reg-size).
-//! const uint32_t*, // 2nd argument - uint32_t* (machine reg-size).
-//! size_t>()); // 3rd argument - size_t (machine reg-size).
-//!
-//! Label L_Loop = cc.newLabel(); // Start of the loop.
-//! Label L_Exit = cc.newLabel(); // Used to exit early.
-//!
-//! x86::Gp dst = cc.newIntPtr("dst"); // Create `dst` register (destination pointer).
-//! x86::Gp src = cc.newIntPtr("src"); // Create `src` register (source pointer).
-//! x86::Gp i = cc.newUIntPtr("i"); // Create `i` register (loop counter).
-//!
-//! funcNode->setArg(0, dst); // Assign `dst` argument.
-//! funcNode->setArg(1, src); // Assign `src` argument.
-//! funcNode->setArg(2, i); // Assign `i` argument.
-//!
-//! cc.test(i, i); // Early exit if length is zero.
-//! cc.jz(L_Exit);
-//!
-//! cc.bind(L_Loop); // Bind the beginning of the loop here.
-//!
-//! x86::Gp tmp = cc.newInt32("tmp"); // Copy a single dword (4 bytes).
-//! cc.mov(tmp, x86::dword_ptr(src)); // Load DWORD from [src] address.
-//! cc.mov(x86::dword_ptr(dst), tmp); // Store DWORD to [dst] address.
-//!
-//! cc.add(src, 4); // Increment `src`.
-//! cc.add(dst, 4); // Increment `dst`.
-//!
-//! cc.dec(i); // Loop until `i` is non-zero.
-//! cc.jnz(L_Loop);
-//!
-//! cc.bind(L_Exit); // Label used by early exit.
-//! cc.endFunc(); // End of the function body.
-//!
-//! cc.finalize(); // Translate and assemble the whole 'cc' content.
-//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
-//!
-//! // Add the generated code to the runtime.
-//! MemCpy32 memcpy32;
-//! Error err = rt.add(&memcpy32, &code);
-//!
-//! // Handle a possible error returned by AsmJit.
-//! if (err)
-//! return 1;
-//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
-//!
-//! // Test the generated code.
-//! uint32_t input[6] = { 1, 2, 3, 5, 8, 13 };
-//! uint32_t output[6];
-//! memcpy32(output, input, 6);
-//!
-//! for (uint32_t i = 0; i < 6; i++)
-//! printf("%d\n", output[i]);
-//!
-//! rt.release(memcpy32);
-//! return 0;
-//! }
-//! ```
-//!
-//! ### AVX and AVX-512
-//!
-//! AVX and AVX-512 code generation must be explicitly enabled via \ref FuncFrame to work properly. If it's not setup
-//! correctly then Prolog & Epilog would use SSE instead of AVX instructions to work with SIMD registers. In addition,
-//! Compiler requires explicitly enable AVX-512 via \ref FuncFrame in order to use all 32 SIMD registers.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef void (*Func)(void*);
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! CodeHolder code; // Holds code and relocation information.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
-//!
-//! FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*>());
-//!
-//! // Use the following to enable AVX and/or AVX-512.
-//! funcNode->frame().setAvxEnabled();
-//! funcNode->frame().setAvx512Enabled();
-//!
-//! // Do something with the input pointer.
-//! x86::Gp addr = cc.newIntPtr("addr");
-//! x86::Zmm vreg = cc.newZmm("vreg");
-//!
-//! funcNode->setArg(0, addr);
-//!
-//! cc.vmovdqu32(vreg, x86::ptr(addr));
-//! cc.vpaddq(vreg, vreg, vreg);
-//! cc.vmovdqu32(x86::ptr(addr), vreg);
-//!
-//! cc.endFunc(); // End of the function body.
-//! cc.finalize(); // Translate and assemble the whole 'cc' content.
-//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
-//!
-//! Func fn;
-//! Error err = rt.add(&fn, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
-//!
-//! // Execute the generated code and print some output.
-//! uint64_t data[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
-//! fn(data);
-//! printf("%llu\n", (unsigned long long)data[0]);
-//!
-//! rt.release(fn); // Explicitly remove the function from the runtime.
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Recursive Functions
-//!
-//! It's possible to create more functions by using the same \ref x86::Compiler instance and make links between them.
-//! In such case it's important to keep the pointer to \ref FuncNode.
-//!
-//! The example below creates a simple Fibonacci function that calls itself recursively:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef uint32_t (*Fibonacci)(uint32_t x);
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! CodeHolder code; // Holds code and relocation information.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
-//!
-//! FuncNode* funcNode = cc.addFunc( // Begin of the Fibonacci function, addFunc()
-//! FuncSignature::build<int, int>()); // Returns a pointer to the FuncNode node.
-//!
-//! Label L_Exit = cc.newLabel(); // Exit label.
-//! x86::Gp x = cc.newUInt32(); // Function x argument.
-//! x86::Gp y = cc.newUInt32(); // Temporary.
-//!
-//! funcNode->setArg(0, x);
-//!
-//! cc.cmp(x, 3); // Return x if less than 3.
-//! cc.jb(L_Exit);
-//!
-//! cc.mov(y, x); // Make copy of the original x.
-//! cc.dec(x); // Decrease x.
-//!
-//! InvokeNode* invokeNode; // Function invocation:
-//! cc.invoke(&invokeNode, // - InvokeNode (output).
-//! funcNode->label(), // - Function address or Label.
-//! FuncSignature::build<int, int>()); // - Function signature.
-//!
-//! invokeNode->setArg(0, x); // Assign x as the first argument.
-//! invokeNode->setRet(0, x); // Assign x as a return value as well.
-//!
-//! cc.add(x, y); // Combine the return value with y.
-//!
-//! cc.bind(L_Exit);
-//! cc.ret(x); // Return x.
-//! cc.endFunc(); // End of the function body.
-//!
-//! cc.finalize(); // Translate and assemble the whole 'cc' content.
-//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
-//!
-//! Fibonacci fib;
-//! Error err = rt.add(&fib, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
-//!
-//! // Test the generated code.
-//! printf("Fib(%u) -> %u\n", 8, fib(8));
-//!
-//! rt.release(fib);
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Stack Management
-//!
-//! Function's stack-frame is managed automatically, which is used by the register allocator to spill virtual
-//! registers. It also provides an interface to allocate user-defined block of the stack, which can be used as
-//! a temporary storage by the generated function. In the following example a stack of 256 bytes size is allocated,
-//! filled by bytes starting from 0 to 255 and then iterated again to sum all the values.
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//! #include <stdio.h>
-//!
-//! using namespace asmjit;
-//!
-//! // Signature of the generated function.
-//! typedef int (*Func)(void);
-//!
-//! int main() {
-//! JitRuntime rt; // Runtime specialized for JIT code execution.
-//! CodeHolder code; // Holds code and relocation information.
-//!
-//! code.init(rt.environment(), // Initialize code to match the JIT environment.
-//! rt.cpuFeatures());
-//! x86::Compiler cc(&code); // Create and attach x86::Compiler to code.
-//!
-//! cc.addFunc(FuncSignature::build<int>()); // Create a function that returns int.
-//!
-//! x86::Gp p = cc.newIntPtr("p");
-//! x86::Gp i = cc.newIntPtr("i");
-//!
-//! // Allocate 256 bytes on the stack aligned to 4 bytes.
-//! x86::Mem stack = cc.newStack(256, 4);
-//!
-//! x86::Mem stackIdx(stack); // Copy of stack with i added.
-//! stackIdx.setIndex(i); // stackIdx <- stack[i].
-//! stackIdx.setSize(1); // stackIdx <- byte ptr stack[i].
-//!
-//! // Load a stack address to `p`. This step is purely optional and shows
-//! // that `lea` is useful to load a memory operands address (even absolute)
-//! // to a general purpose register.
-//! cc.lea(p, stack);
-//!
-//! // Clear i (xor is a C++ keyword, hence 'xor_' is used instead).
-//! cc.xor_(i, i);
-//!
-//! Label L1 = cc.newLabel();
-//! Label L2 = cc.newLabel();
-//!
-//! cc.bind(L1); // First loop, fill the stack.
-//! cc.mov(stackIdx, i.r8()); // stack[i] = uint8_t(i).
-//!
-//! cc.inc(i); // i++;
-//! cc.cmp(i, 256); // if (i < 256)
-//! cc.jb(L1); // goto L1;
-//!
-//! // Second loop, sum all bytes stored in `stack`.
-//! x86::Gp sum = cc.newInt32("sum");
-//! x86::Gp val = cc.newInt32("val");
-//!
-//! cc.xor_(i, i);
-//! cc.xor_(sum, sum);
-//!
-//! cc.bind(L2);
-//!
-//! cc.movzx(val, stackIdx); // val = uint32_t(stack[i]);
-//! cc.add(sum, val); // sum += val;
-//!
-//! cc.inc(i); // i++;
-//! cc.cmp(i, 256); // if (i < 256)
-//! cc.jb(L2); // goto L2;
-//!
-//! cc.ret(sum); // Return the `sum` of all values.
-//! cc.endFunc(); // End of the function body.
-//!
-//! cc.finalize(); // Translate and assemble the whole 'cc' content.
-//! // ----> x86::Compiler is no longer needed from here and can be destroyed <----
-//!
-//! Func func;
-//! Error err = rt.add(&func, &code); // Add the generated code to the runtime.
-//! if (err) return 1; // Handle a possible error returned by AsmJit.
-//! // ----> CodeHolder is no longer needed from here and can be destroyed <----
-//!
-//! printf("Func() -> %d\n", func()); // Test the generated code.
-//!
-//! rt.release(func);
-//! return 0;
-//! }
-//! ```
-//!
-//! ### Constant Pool
-//!
-//! Compiler provides two constant pools for a general purpose code generation:
-//!
-//! - Local constant pool - Part of \ref FuncNode, can be only used by a single function and added after the
-//! function epilog sequence (after `ret` instruction).
-//!
-//! - Global constant pool - Part of \ref BaseCompiler, flushed at the end of the generated code by \ref
-//! BaseEmitter::finalize().
-//!
-//! The example below illustrates how a built-in constant pool can be used:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! static void exampleUseOfConstPool(x86::Compiler& cc) {
-//! cc.addFunc(FuncSignature::build<int>());
-//!
-//! x86::Gp v0 = cc.newGpd("v0");
-//! x86::Gp v1 = cc.newGpd("v1");
-//!
-//! x86::Mem c0 = cc.newInt32Const(ConstPoolScope::kLocal, 200);
-//! x86::Mem c1 = cc.newInt32Const(ConstPoolScope::kLocal, 33);
-//!
-//! cc.mov(v0, c0);
-//! cc.mov(v1, c1);
-//! cc.add(v0, v1);
-//!
-//! cc.ret(v0);
-//! cc.endFunc();
-//! }
-//! ```
-//!
-//! ### Jump Tables
-//!
-//! x86::Compiler supports `jmp` instruction with reg/mem operand, which is a commonly used pattern to implement
-//! indirect jumps within a function, for example to implement `switch()` statement in a programming languages.
-//! By default AsmJit assumes that every basic block can be a possible jump target as it's unable to deduce targets
-//! from instruction's operands. This is a very pessimistic default that should be avoided if possible as it's costly
-//! and very unfriendly to liveness analysis and register allocation.
-//!
-//! Instead of relying on such pessimistic default behavior, let's use \ref JumpAnnotation to annotate a jump where
-//! all targets are known:
-//!
-//! ```
-//! #include <asmjit/x86.h>
-//!
-//! using namespace asmjit;
-//!
-//! static void exampleUseOfIndirectJump(x86::Compiler& cc) {
-//! FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float, uint32_t>());
-//!
-//! // Function arguments
-//! x86::Xmm a = cc.newXmmSs("a");
-//! x86::Xmm b = cc.newXmmSs("b");
-//! x86::Gp op = cc.newUInt32("op");
-//!
-//! x86::Gp target = cc.newIntPtr("target");
-//! x86::Gp offset = cc.newIntPtr("offset");
-//!
-//! Label L_Table = cc.newLabel();
-//! Label L_Add = cc.newLabel();
-//! Label L_Sub = cc.newLabel();
-//! Label L_Mul = cc.newLabel();
-//! Label L_Div = cc.newLabel();
-//! Label L_End = cc.newLabel();
-//!
-//! funcNode->setArg(0, a);
-//! funcNode->setArg(1, b);
-//! funcNode->setArg(2, op);
-//!
-//! // Jump annotation is a building block that allows to annotate all possible targets where `jmp()` can
-//! // jump. It then drives the CFG construction and liveness analysis, which impacts register allocation.
-//! JumpAnnotation* annotation = cc.newJumpAnnotation();
-//! annotation->addLabel(L_Add);
-//! annotation->addLabel(L_Sub);
-//! annotation->addLabel(L_Mul);
-//! annotation->addLabel(L_Div);
-//!
-//! // Most likely not the common indirect jump approach, but it
-//! // doesn't really matter how final address is calculated. The
-//! // most important path using JumpAnnotation with `jmp()`.
-//! cc.lea(offset, x86::ptr(L_Table));
-//! if (cc.is64Bit())
-//! cc.movsxd(target, x86::dword_ptr(offset, op.cloneAs(offset), 2));
-//! else
-//! cc.mov(target, x86::dword_ptr(offset, op.cloneAs(offset), 2));
-//! cc.add(target, offset);
-//! cc.jmp(target, annotation);
-//!
-//! // Acts like a switch() statement in C.
-//! cc.bind(L_Add);
-//! cc.addss(a, b);
-//! cc.jmp(L_End);
-//!
-//! cc.bind(L_Sub);
-//! cc.subss(a, b);
-//! cc.jmp(L_End);
-//!
-//! cc.bind(L_Mul);
-//! cc.mulss(a, b);
-//! cc.jmp(L_End);
-//!
-//! cc.bind(L_Div);
-//! cc.divss(a, b);
-//!
-//! cc.bind(L_End);
-//! cc.ret(a);
-//!
-//! cc.endFunc();
-//!
-//! // Relative int32_t offsets of `L_XXX - L_Table`.
-//! cc.bind(L_Table);
-//! cc.embedLabelDelta(L_Add, L_Table, 4);
-//! cc.embedLabelDelta(L_Sub, L_Table, 4);
-//! cc.embedLabelDelta(L_Mul, L_Table, 4);
-//! cc.embedLabelDelta(L_Div, L_Table, 4);
-//! }
-//! ```
-class ASMJIT_VIRTAPI Compiler
- : public BaseCompiler,
- public EmitterExplicitT<Compiler> {
-public:
- ASMJIT_NONCOPYABLE(Compiler)
- typedef BaseCompiler Base;
-
- //! \name Construction & Destruction
- //! \{
-
- ASMJIT_API explicit Compiler(CodeHolder* code = nullptr) noexcept;
- ASMJIT_API ~Compiler() noexcept override;
-
- //! \}
-
- //! \name Virtual Registers
- //! \{
-
-#ifndef ASMJIT_NO_LOGGING
-# define ASMJIT_NEW_REG_FMT(OUT, PARAM, FORMAT, ARGS) \
- _newRegFmt(&OUT, PARAM, FORMAT, ARGS)
-#else
-# define ASMJIT_NEW_REG_FMT(OUT, PARAM, FORMAT, ARGS) \
- DebugUtils::unused(FORMAT); \
- DebugUtils::unused(std::forward<Args>(args)...); \
- _newReg(&OUT, PARAM)
-#endif
-
-#define ASMJIT_NEW_REG_CUSTOM(FUNC, REG) \
- ASMJIT_INLINE_NODEBUG REG FUNC(TypeId typeId) { \
- REG reg(Globals::NoInit); \
- _newReg(&reg, typeId); \
- return reg; \
- } \
- \
- template<typename... Args> \
- ASMJIT_INLINE_NODEBUG REG FUNC(TypeId typeId, const char* fmt, Args&&... args) { \
- REG reg(Globals::NoInit); \
- ASMJIT_NEW_REG_FMT(reg, typeId, fmt, std::forward<Args>(args)...); \
- return reg; \
- }
-
-#define ASMJIT_NEW_REG_TYPED(FUNC, REG, TYPE_ID) \
- ASMJIT_INLINE_NODEBUG REG FUNC() { \
- REG reg(Globals::NoInit); \
- _newReg(&reg, TYPE_ID); \
- return reg; \
- } \
- \
- template<typename... Args> \
- ASMJIT_INLINE_NODEBUG REG FUNC(const char* fmt, Args&&... args) { \
- REG reg(Globals::NoInit); \
- ASMJIT_NEW_REG_FMT(reg, TYPE_ID, fmt, std::forward<Args>(args)...); \
- return reg; \
- }
-
- template<typename RegT>
- ASMJIT_INLINE_NODEBUG RegT newSimilarReg(const RegT& ref) {
- RegT reg(Globals::NoInit);
- _newReg(&reg, ref);
- return reg;
- }
-
- template<typename RegT, typename... Args>
- ASMJIT_INLINE_NODEBUG RegT newSimilarReg(const RegT& ref, const char* fmt, Args&&... args) {
- RegT reg(Globals::NoInit);
- ASMJIT_NEW_REG_FMT(reg, ref, fmt, std::forward<Args>(args)...);
- return reg;
- }
-
- ASMJIT_NEW_REG_CUSTOM(newReg , Reg )
- ASMJIT_NEW_REG_CUSTOM(newGp , Gp )
- ASMJIT_NEW_REG_CUSTOM(newVec , Vec )
- ASMJIT_NEW_REG_CUSTOM(newK , KReg)
-
- ASMJIT_NEW_REG_TYPED(newInt8 , Gp , TypeId::kInt8)
- ASMJIT_NEW_REG_TYPED(newUInt8 , Gp , TypeId::kUInt8)
- ASMJIT_NEW_REG_TYPED(newInt16 , Gp , TypeId::kInt16)
- ASMJIT_NEW_REG_TYPED(newUInt16 , Gp , TypeId::kUInt16)
- ASMJIT_NEW_REG_TYPED(newInt32 , Gp , TypeId::kInt32)
- ASMJIT_NEW_REG_TYPED(newUInt32 , Gp , TypeId::kUInt32)
- ASMJIT_NEW_REG_TYPED(newInt64 , Gp , TypeId::kInt64)
- ASMJIT_NEW_REG_TYPED(newUInt64 , Gp , TypeId::kUInt64)
- ASMJIT_NEW_REG_TYPED(newIntPtr , Gp , TypeId::kIntPtr)
- ASMJIT_NEW_REG_TYPED(newUIntPtr, Gp , TypeId::kUIntPtr)
-
- ASMJIT_NEW_REG_TYPED(newGpb , Gp , TypeId::kUInt8)
- ASMJIT_NEW_REG_TYPED(newGpw , Gp , TypeId::kUInt16)
- ASMJIT_NEW_REG_TYPED(newGpd , Gp , TypeId::kUInt32)
- ASMJIT_NEW_REG_TYPED(newGpq , Gp , TypeId::kUInt64)
- ASMJIT_NEW_REG_TYPED(newGpz , Gp , TypeId::kUIntPtr)
- ASMJIT_NEW_REG_TYPED(newXmm , Xmm , TypeId::kInt32x4)
- ASMJIT_NEW_REG_TYPED(newXmmSs , Xmm , TypeId::kFloat32x1)
- ASMJIT_NEW_REG_TYPED(newXmmSd , Xmm , TypeId::kFloat64x1)
- ASMJIT_NEW_REG_TYPED(newXmmPs , Xmm , TypeId::kFloat32x4)
- ASMJIT_NEW_REG_TYPED(newXmmPd , Xmm , TypeId::kFloat64x2)
- ASMJIT_NEW_REG_TYPED(newYmm , Ymm , TypeId::kInt32x8)
- ASMJIT_NEW_REG_TYPED(newYmmPs , Ymm , TypeId::kFloat32x8)
- ASMJIT_NEW_REG_TYPED(newYmmPd , Ymm , TypeId::kFloat64x4)
- ASMJIT_NEW_REG_TYPED(newZmm , Zmm , TypeId::kInt32x16)
- ASMJIT_NEW_REG_TYPED(newZmmPs , Zmm , TypeId::kFloat32x16)
- ASMJIT_NEW_REG_TYPED(newZmmPd , Zmm , TypeId::kFloat64x8)
- ASMJIT_NEW_REG_TYPED(newMm , Mm , TypeId::kMmx64)
- ASMJIT_NEW_REG_TYPED(newKb , KReg, TypeId::kMask8)
- ASMJIT_NEW_REG_TYPED(newKw , KReg, TypeId::kMask16)
- ASMJIT_NEW_REG_TYPED(newKd , KReg, TypeId::kMask32)
- ASMJIT_NEW_REG_TYPED(newKq , KReg, TypeId::kMask64)
-
-#undef ASMJIT_NEW_REG_TYPED
-#undef ASMJIT_NEW_REG_CUSTOM
-#undef ASMJIT_NEW_REG_FMT
-
- //! \}
-
- //! \name Stack
- //! \{
-
- //! Creates a new memory chunk allocated on the current function's stack.
- ASMJIT_INLINE_NODEBUG Mem newStack(uint32_t size, uint32_t alignment, const char* name = nullptr) {
- Mem m(Globals::NoInit);
- _newStack(&m, size, alignment, name);
- return m;
- }
-
- //! \}
-
- //! \name Constants
- //! \{
-
- //! Put data to a constant-pool and get a memory reference to it.
- ASMJIT_INLINE_NODEBUG Mem newConst(ConstPoolScope scope, const void* data, size_t size) {
- Mem m(Globals::NoInit);
- _newConst(&m, scope, data, size);
- return m;
- }
-
- //! Put a BYTE `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newByteConst(ConstPoolScope scope, uint8_t val) noexcept { return newConst(scope, &val, 1); }
- //! Put a WORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newWordConst(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
- //! Put a DWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newDWordConst(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
- //! Put a QWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newQWordConst(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
-
- //! Put a WORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newInt16Const(ConstPoolScope scope, int16_t val) noexcept { return newConst(scope, &val, 2); }
- //! Put a WORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newUInt16Const(ConstPoolScope scope, uint16_t val) noexcept { return newConst(scope, &val, 2); }
- //! Put a DWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newInt32Const(ConstPoolScope scope, int32_t val) noexcept { return newConst(scope, &val, 4); }
- //! Put a DWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newUInt32Const(ConstPoolScope scope, uint32_t val) noexcept { return newConst(scope, &val, 4); }
- //! Put a QWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newInt64Const(ConstPoolScope scope, int64_t val) noexcept { return newConst(scope, &val, 8); }
- //! Put a QWORD `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newUInt64Const(ConstPoolScope scope, uint64_t val) noexcept { return newConst(scope, &val, 8); }
-
- //! Put a SP-FP `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newFloatConst(ConstPoolScope scope, float val) noexcept { return newConst(scope, &val, 4); }
- //! Put a DP-FP `val` to a constant-pool.
- ASMJIT_INLINE_NODEBUG Mem newDoubleConst(ConstPoolScope scope, double val) noexcept { return newConst(scope, &val, 8); }
-
- //! \}
-
- //! \name Instruction Options
- //! \{
-
- //! Force the compiler to not follow the conditional or unconditional jump.
- ASMJIT_INLINE_NODEBUG Compiler& unfollow() noexcept { addInstOptions(InstOptions::kUnfollow); return *this; }
- //! Tell the compiler that the destination variable will be overwritten.
- ASMJIT_INLINE_NODEBUG Compiler& overwrite() noexcept { addInstOptions(InstOptions::kOverwrite); return *this; }
-
- //! \}
-
- //! \name Function Call & Ret Intrinsics
- //! \{
-
- //! Invoke a function call without `target` type enforcement.
- ASMJIT_INLINE_NODEBUG Error invoke_(InvokeNode** out, const Operand_& target, const FuncSignature& signature) {
- return addInvokeNode(out, Inst::kIdCall, target, signature);
- }
-
- //! Invoke a function call of the given `target` and `signature` and store the added node to `out`.
- //!
- //! Creates a new \ref InvokeNode, initializes all the necessary members to match the given function `signature`,
- //! adds the node to the compiler, and stores its pointer to `out`. The operation is atomic, if anything fails
- //! nullptr is stored in `out` and error code is returned.
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Gp& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Mem& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Label& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, const Imm& target, const FuncSignature& signature) { return invoke_(out, target, signature); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error invoke(InvokeNode** out, uint64_t target, const FuncSignature& signature) { return invoke_(out, Imm(int64_t(target)), signature); }
-
- //! Return from function.
- ASMJIT_INLINE_NODEBUG Error ret() { return addRet(Operand(), Operand()); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0) { return addRet(o0, Operand()); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error ret(const BaseReg& o0, const BaseReg& o1) { return addRet(o0, o1); }
-
- //! \}
-
- //! \name Jump Tables Support
- //! \{
-
- using EmitterExplicitT<Compiler>::jmp;
-
- //! Adds a jump to the given `target` with the provided jump `annotation`.
- ASMJIT_INLINE_NODEBUG Error jmp(const BaseReg& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdJmp, target, annotation); }
- //! \overload
- ASMJIT_INLINE_NODEBUG Error jmp(const BaseMem& target, JumpAnnotation* annotation) { return emitAnnotatedJump(Inst::kIdJmp, target, annotation); }
-
- //! \}
-
- //! \name Events
- //! \{
-
- ASMJIT_API Error onAttach(CodeHolder* code) noexcept override;
- ASMJIT_API Error onDetach(CodeHolder* code) noexcept override;
-
- //! \}
-
- //! \name Finalize
- //! \{
-
- ASMJIT_API Error finalize() override;
-
- //! \}
-};
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_X86_X86COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp b/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp
deleted file mode 100644
index 9cd1db68423..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86emithelper.cpp
+++ /dev/null
@@ -1,640 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86)
-
-#include "../core/formatter.h"
-#include "../core/funcargscontext_p.h"
-#include "../core/string.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../core/radefs_p.h"
-#include "../x86/x86emithelper_p.h"
-#include "../x86/x86emitter.h"
-#include "../x86/x86formatter_p.h"
-#include "../x86/x86instapi_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::EmitHelper - Utilities
-// ===========================
-
-static constexpr OperandSignature regSizeToGpSignature[8 + 1] = {
- OperandSignature{0},
- OperandSignature{RegTraits<RegType::kX86_GpbLo>::kSignature},
- OperandSignature{RegTraits<RegType::kX86_Gpw>::kSignature},
- OperandSignature{0},
- OperandSignature{RegTraits<RegType::kX86_Gpd>::kSignature},
- OperandSignature{0},
- OperandSignature{0},
- OperandSignature{0},
- OperandSignature{RegTraits<RegType::kX86_Gpq>::kSignature}
-};
-
-static inline uint32_t getXmmMovInst(const FuncFrame& frame) {
- bool avx = frame.isAvxEnabled();
- bool aligned = frame.hasAlignedVecSR();
-
- return aligned ? (avx ? Inst::kIdVmovaps : Inst::kIdMovaps)
- : (avx ? Inst::kIdVmovups : Inst::kIdMovups);
-}
-
-//! Converts `size` to a 'kmov?' instruction.
-static inline uint32_t kmovInstFromSize(uint32_t size) noexcept {
- switch (size) {
- case 1: return Inst::kIdKmovb;
- case 2: return Inst::kIdKmovw;
- case 4: return Inst::kIdKmovd;
- case 8: return Inst::kIdKmovq;
- default: return Inst::kIdNone;
- }
-}
-
-static inline uint32_t makeCastOp(TypeId dst, TypeId src) noexcept {
- return (uint32_t(dst) << 8) | uint32_t(src);
-}
-
-// x86::EmitHelper - Emit Reg Move
-// ===============================
-
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitRegMove(
- const Operand_& dst_,
- const Operand_& src_, TypeId typeId, const char* comment) {
-
- // Invalid or abstract TypeIds are not allowed.
- ASMJIT_ASSERT(TypeUtils::isValid(typeId) && !TypeUtils::isAbstract(typeId));
-
- Operand dst(dst_);
- Operand src(src_);
-
- InstId instId = Inst::kIdNone;
- uint32_t memFlags = 0;
- uint32_t overrideMemSize = 0;
-
- enum MemFlags : uint32_t {
- kDstMem = 0x1,
- kSrcMem = 0x2
- };
-
- // Detect memory operands and patch them to have the same size as the register. BaseCompiler always sets memory size
- // of allocs and spills, so it shouldn't be really necessary, however, after this function was separated from Compiler
- // it's better to make sure that the size is always specified, as we can use 'movzx' and 'movsx' that rely on it.
- if (dst.isMem()) { memFlags |= kDstMem; dst.as<Mem>().setSize(src.as<Mem>().size()); }
- if (src.isMem()) { memFlags |= kSrcMem; src.as<Mem>().setSize(dst.as<Mem>().size()); }
-
- switch (typeId) {
- case TypeId::kInt8:
- case TypeId::kUInt8:
- case TypeId::kInt16:
- case TypeId::kUInt16:
- // Special case - 'movzx' load.
- if (memFlags & kSrcMem) {
- instId = Inst::kIdMovzx;
- dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- break;
- }
-
- if (!memFlags) {
- // Change both destination and source registers to GPD (safer, no dependencies).
- dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- }
- ASMJIT_FALLTHROUGH;
-
- case TypeId::kInt32:
- case TypeId::kUInt32:
- case TypeId::kInt64:
- case TypeId::kUInt64:
- instId = Inst::kIdMov;
- break;
-
- case TypeId::kMmx32:
- instId = Inst::kIdMovd;
- if (memFlags) break;
- ASMJIT_FALLTHROUGH;
-
- case TypeId::kMmx64 : instId = Inst::kIdMovq ; break;
- case TypeId::kMask8 : instId = Inst::kIdKmovb; break;
- case TypeId::kMask16: instId = Inst::kIdKmovw; break;
- case TypeId::kMask32: instId = Inst::kIdKmovd; break;
- case TypeId::kMask64: instId = Inst::kIdKmovq; break;
-
- default: {
- TypeId scalarTypeId = TypeUtils::scalarOf(typeId);
- if (TypeUtils::isVec32(typeId) && memFlags) {
- overrideMemSize = 4;
- if (scalarTypeId == TypeId::kFloat32)
- instId = _avxEnabled ? Inst::kIdVmovss : Inst::kIdMovss;
- else
- instId = _avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
- break;
- }
-
- if (TypeUtils::isVec64(typeId) && memFlags) {
- overrideMemSize = 8;
- if (scalarTypeId == TypeId::kFloat64)
- instId = _avxEnabled ? Inst::kIdVmovsd : Inst::kIdMovsd;
- else
- instId = _avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
- break;
- }
-
- if (scalarTypeId == TypeId::kFloat32)
- instId = _avxEnabled ? Inst::kIdVmovaps : Inst::kIdMovaps;
- else if (scalarTypeId == TypeId::kFloat64)
- instId = _avxEnabled ? Inst::kIdVmovapd : Inst::kIdMovapd;
- else if (!_avx512Enabled)
- instId = _avxEnabled ? Inst::kIdVmovdqa : Inst::kIdMovdqa;
- else
- instId = Inst::kIdVmovdqa32;
- break;
- }
- }
-
- if (!instId)
- return DebugUtils::errored(kErrorInvalidState);
-
- if (overrideMemSize) {
- if (dst.isMem()) dst.as<Mem>().setSize(overrideMemSize);
- if (src.isMem()) src.as<Mem>().setSize(overrideMemSize);
- }
-
- _emitter->setInlineComment(comment);
- return _emitter->emit(instId, dst, src);
-}
-
-// x86::EmitHelper - Emit Arg Move
-// ===============================
-
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitArgMove(
- const BaseReg& dst_, TypeId dstTypeId,
- const Operand_& src_, TypeId srcTypeId, const char* comment) {
-
- // Deduce optional `dstTypeId`, which may be `TypeId::kVoid` in some cases.
- if (dstTypeId == TypeId::kVoid) {
- const ArchTraits& archTraits = ArchTraits::byArch(_emitter->arch());
- dstTypeId = archTraits.regTypeToTypeId(dst_.type());
- }
-
- // Invalid or abstract TypeIds are not allowed.
- ASMJIT_ASSERT(TypeUtils::isValid(dstTypeId) && !TypeUtils::isAbstract(dstTypeId));
- ASMJIT_ASSERT(TypeUtils::isValid(srcTypeId) && !TypeUtils::isAbstract(srcTypeId));
-
- Reg dst(dst_.as<Reg>());
- Operand src(src_);
-
- uint32_t dstSize = TypeUtils::sizeOf(dstTypeId);
- uint32_t srcSize = TypeUtils::sizeOf(srcTypeId);
-
- InstId instId = Inst::kIdNone;
-
- // Not a real loop, just 'break' is nicer than 'goto'.
- for (;;) {
- if (TypeUtils::isInt(dstTypeId)) {
- // Sign extend.
- if (TypeUtils::isInt(srcTypeId)) {
- uint32_t castOp = makeCastOp(dstTypeId, srcTypeId);
-
- if (castOp == makeCastOp(TypeId::kInt16, TypeId::kInt8 ) ||
- castOp == makeCastOp(TypeId::kInt32, TypeId::kInt8 ) ||
- castOp == makeCastOp(TypeId::kInt64, TypeId::kInt8 ) ||
- castOp == makeCastOp(TypeId::kInt32, TypeId::kInt16) ||
- castOp == makeCastOp(TypeId::kInt64, TypeId::kInt16) ||
- castOp == makeCastOp(TypeId::kInt64, TypeId::kInt32)) {
- // Sign extend by using 'movsx' or 'movsxd'.
- instId =
- castOp == makeCastOp(TypeId::kInt64, TypeId::kInt32)
- ? Inst::kIdMovsxd
- : Inst::kIdMovsx;
-
- dst.setSignature(regSizeToGpSignature[dstSize]);
- if (src.isReg())
- src.setSignature(regSizeToGpSignature[srcSize]);
- break;
- }
- }
-
- // Zero extend.
- if (TypeUtils::isInt(srcTypeId) || src_.isMem()) {
- uint32_t movSize = Support::min(srcSize, dstSize);
- if (movSize <= 4)
- dstSize = 4;
-
- // Zero extend by using 'movzx' or 'mov'.
- instId = movSize < 4 ? Inst::kIdMovzx : Inst::kIdMov;
- srcSize = Support::min(srcSize, movSize);
-
- dst.setSignature(regSizeToGpSignature[dstSize]);
- if (src.isReg())
- src.setSignature(regSizeToGpSignature[srcSize]);
- break;
- }
-
- // NOTE: The previous branch caught all memory sources, from here it's always register to register conversion,
- // so catch the remaining cases.
- srcSize = Support::min(srcSize, dstSize);
-
- if (TypeUtils::isMmx(srcTypeId)) {
- // 64-bit move.
- instId = Inst::kIdMovq;
- if (srcSize == 8)
- break;
-
- // 32-bit move.
- instId = Inst::kIdMovd;
- dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- break;
- }
-
- if (TypeUtils::isMask(srcTypeId)) {
- instId = kmovInstFromSize(srcSize);
- dst.setSignature(srcSize <= 4 ? Reg::signatureOfT<RegType::kX86_Gpd>()
- : Reg::signatureOfT<RegType::kX86_Gpq>());
- break;
- }
-
- if (TypeUtils::isVec(srcTypeId)) {
- // 64-bit move.
- instId = _avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
- if (srcSize == 8)
- break;
-
- // 32-bit move.
- instId = _avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
- dst.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- break;
- }
- }
-
- if (TypeUtils::isMmx(dstTypeId)) {
- instId = Inst::kIdMovq;
- srcSize = Support::min(srcSize, dstSize);
-
- if (TypeUtils::isInt(srcTypeId) || src.isMem()) {
- // 64-bit move.
- if (srcSize == 8)
- break;
-
- // 32-bit move.
- instId = Inst::kIdMovd;
- if (src.isReg())
- src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- break;
- }
-
- if (TypeUtils::isMmx(srcTypeId))
- break;
-
- // This will hurt if AVX is enabled.
- instId = Inst::kIdMovdq2q;
- if (TypeUtils::isVec(srcTypeId))
- break;
- }
-
- if (TypeUtils::isMask(dstTypeId)) {
- srcSize = Support::min(srcSize, dstSize);
-
- if (TypeUtils::isInt(srcTypeId) || TypeUtils::isMask(srcTypeId) || src.isMem()) {
- instId = kmovInstFromSize(srcSize);
- if (Reg::isGp(src) && srcSize <= 4)
- src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- break;
- }
- }
-
- if (TypeUtils::isVec(dstTypeId)) {
- // By default set destination to XMM, will be set to YMM|ZMM if needed.
- dst.setSignature(Reg::signatureOfT<RegType::kX86_Xmm>());
-
- // This will hurt if AVX is enabled.
- if (Reg::isMm(src)) {
- // 64-bit move.
- instId = Inst::kIdMovq2dq;
- break;
- }
-
- // Argument conversion.
- TypeId dstScalarId = TypeUtils::scalarOf(dstTypeId);
- TypeId srcScalarId = TypeUtils::scalarOf(srcTypeId);
-
- if (dstScalarId == TypeId::kFloat32 && srcScalarId == TypeId::kFloat64) {
- srcSize = Support::min(dstSize * 2, srcSize);
- dstSize = srcSize / 2;
-
- if (srcSize <= 8)
- instId = _avxEnabled ? Inst::kIdVcvtss2sd : Inst::kIdCvtss2sd;
- else
- instId = _avxEnabled ? Inst::kIdVcvtps2pd : Inst::kIdCvtps2pd;
-
- if (dstSize == 32)
- dst.setSignature(Reg::signatureOfT<RegType::kX86_Ymm>());
- if (src.isReg())
- src.setSignature(Reg::signatureOfVecBySize(srcSize));
- break;
- }
-
- if (dstScalarId == TypeId::kFloat64 && srcScalarId == TypeId::kFloat32) {
- srcSize = Support::min(dstSize, srcSize * 2) / 2;
- dstSize = srcSize * 2;
-
- if (srcSize <= 4)
- instId = _avxEnabled ? Inst::kIdVcvtsd2ss : Inst::kIdCvtsd2ss;
- else
- instId = _avxEnabled ? Inst::kIdVcvtpd2ps : Inst::kIdCvtpd2ps;
-
- dst.setSignature(Reg::signatureOfVecBySize(dstSize));
- if (src.isReg() && srcSize >= 32)
- src.setSignature(Reg::signatureOfT<RegType::kX86_Ymm>());
- break;
- }
-
- srcSize = Support::min(srcSize, dstSize);
- if (Reg::isGp(src) || src.isMem()) {
- // 32-bit move.
- if (srcSize <= 4) {
- instId = _avxEnabled ? Inst::kIdVmovd : Inst::kIdMovd;
- if (src.isReg())
- src.setSignature(Reg::signatureOfT<RegType::kX86_Gpd>());
- break;
- }
-
- // 64-bit move.
- if (srcSize == 8) {
- instId = _avxEnabled ? Inst::kIdVmovq : Inst::kIdMovq;
- break;
- }
- }
-
- if (Reg::isVec(src) || src.isMem()) {
- instId = _avxEnabled ? Inst::kIdVmovaps : Inst::kIdMovaps;
-
- if (src.isMem() && srcSize < _emitter->environment().stackAlignment())
- instId = _avxEnabled ? Inst::kIdVmovups : Inst::kIdMovups;
-
- OperandSignature signature = Reg::signatureOfVecBySize(srcSize);
- dst.setSignature(signature);
- if (src.isReg())
- src.setSignature(signature);
- break;
- }
- }
-
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- if (src.isMem())
- src.as<Mem>().setSize(srcSize);
-
- _emitter->setInlineComment(comment);
- return _emitter->emit(instId, dst, src);
-}
-
-Error EmitHelper::emitRegSwap(
- const BaseReg& a,
- const BaseReg& b, const char* comment) {
-
- if (a.isGp() && b.isGp()) {
- _emitter->setInlineComment(comment);
- return _emitter->emit(Inst::kIdXchg, a, b);
- }
- else
- return DebugUtils::errored(kErrorInvalidState);
-}
-
-// x86::EmitHelper - Emit Prolog & Epilog
-// ======================================
-
-static inline Error X86Internal_setupSaveRestoreInfo(RegGroup group, const FuncFrame& frame, Reg& xReg, uint32_t& xInst, uint32_t& xSize) noexcept {
- switch (group) {
- case RegGroup::kVec:
- xReg = xmm(0);
- xInst = getXmmMovInst(frame);
- xSize = xReg.size();
- return kErrorOk;
-
- case RegGroup::kX86_K:
- xReg = k(0);
- xInst = Inst::kIdKmovq;
- xSize = xReg.size();
- return kErrorOk;
-
- case RegGroup::kX86_MM:
- xReg = mm(0);
- xInst = Inst::kIdMovq;
- xSize = xReg.size();
- return kErrorOk;
-
- default:
- // This would be a bug in AsmJit if hit.
- return DebugUtils::errored(kErrorInvalidState);
- }
-}
-
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitProlog(const FuncFrame& frame) {
- Emitter* emitter = _emitter->as<Emitter>();
- uint32_t gpSaved = frame.savedRegs(RegGroup::kGp);
-
- Gp zsp = emitter->zsp(); // ESP|RSP register.
- Gp zbp = emitter->zbp(); // EBP|RBP register.
- Gp gpReg = zsp; // General purpose register (temporary).
- Gp saReg = zsp; // Stack-arguments base pointer.
-
- // Emit: 'endbr32' or 'endbr64' (indirect branch protection).
- if (frame.hasIndirectBranchProtection()) {
- InstId instId = emitter->is32Bit() ? Inst::kIdEndbr32 : Inst::kIdEndbr64;
- ASMJIT_PROPAGATE(emitter->emit(instId));
- }
-
- // Emit: 'push zbp'
- // 'mov zbp, zsp'.
- if (frame.hasPreservedFP()) {
- gpSaved &= ~Support::bitMask(Gp::kIdBp);
- ASMJIT_PROPAGATE(emitter->push(zbp));
- ASMJIT_PROPAGATE(emitter->mov(zbp, zsp));
- }
-
- // Emit: 'push gp' sequence.
- {
- Support::BitWordIterator<RegMask> it(gpSaved);
- while (it.hasNext()) {
- gpReg.setId(it.next());
- ASMJIT_PROPAGATE(emitter->push(gpReg));
- }
- }
-
- // Emit: 'mov saReg, zsp'.
- uint32_t saRegId = frame.saRegId();
- if (saRegId != BaseReg::kIdBad && saRegId != Gp::kIdSp) {
- saReg.setId(saRegId);
- if (frame.hasPreservedFP()) {
- if (saRegId != Gp::kIdBp)
- ASMJIT_PROPAGATE(emitter->mov(saReg, zbp));
- }
- else {
- ASMJIT_PROPAGATE(emitter->mov(saReg, zsp));
- }
- }
-
- // Emit: 'and zsp, StackAlignment'.
- if (frame.hasDynamicAlignment()) {
- ASMJIT_PROPAGATE(emitter->and_(zsp, -int32_t(frame.finalStackAlignment())));
- }
-
- // Emit: 'sub zsp, StackAdjustment'.
- if (frame.hasStackAdjustment()) {
- ASMJIT_PROPAGATE(emitter->sub(zsp, frame.stackAdjustment()));
- }
-
- // Emit: 'mov [zsp + DAOffset], saReg'.
- if (frame.hasDynamicAlignment() && frame.hasDAOffset()) {
- Mem saMem = ptr(zsp, int32_t(frame.daOffset()));
- ASMJIT_PROPAGATE(emitter->mov(saMem, saReg));
- }
-
- // Emit 'movxxx [zsp + X], {[x|y|z]mm, k}'.
- {
- Mem xBase = ptr(zsp, int32_t(frame.extraRegSaveOffset()));
-
- for (RegGroup group : Support::EnumValues<RegGroup, RegGroup(1), RegGroup::kMaxVirt>{}) {
- Support::BitWordIterator<RegMask> it(frame.savedRegs(group));
- if (it.hasNext()) {
- Reg xReg;
- uint32_t xInst = 0;
- uint32_t xSize = 0;
- ASMJIT_PROPAGATE(X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize));
- do {
- xReg.setId(it.next());
- ASMJIT_PROPAGATE(emitter->emit(xInst, xBase, xReg));
- xBase.addOffsetLo32(int32_t(xSize));
- } while (it.hasNext());
- }
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE Error EmitHelper::emitEpilog(const FuncFrame& frame) {
- Emitter* emitter = _emitter->as<Emitter>();
-
- uint32_t i;
- uint32_t regId;
-
- uint32_t registerSize = emitter->registerSize();
- uint32_t gpSaved = frame.savedRegs(RegGroup::kGp);
-
- Gp zsp = emitter->zsp(); // ESP|RSP register.
- Gp zbp = emitter->zbp(); // EBP|RBP register.
- Gp gpReg = emitter->zsp(); // General purpose register (temporary).
-
- // Don't emit 'pop zbp' in the pop sequence, this case is handled separately.
- if (frame.hasPreservedFP())
- gpSaved &= ~Support::bitMask(Gp::kIdBp);
-
- // Emit 'movxxx {[x|y|z]mm, k}, [zsp + X]'.
- {
- Mem xBase = ptr(zsp, int32_t(frame.extraRegSaveOffset()));
-
- for (RegGroup group : Support::EnumValues<RegGroup, RegGroup(1), RegGroup::kMaxVirt>{}) {
- Support::BitWordIterator<RegMask> it(frame.savedRegs(group));
- if (it.hasNext()) {
- Reg xReg;
- uint32_t xInst;
- uint32_t xSize;
- ASMJIT_PROPAGATE(X86Internal_setupSaveRestoreInfo(group, frame, xReg, xInst, xSize));
- do {
- xReg.setId(it.next());
- ASMJIT_PROPAGATE(emitter->emit(xInst, xReg, xBase));
- xBase.addOffsetLo32(int32_t(xSize));
- } while (it.hasNext());
- }
- }
- }
-
- // Emit 'emms' and/or 'vzeroupper'.
- if (frame.hasMmxCleanup()) ASMJIT_PROPAGATE(emitter->emms());
- if (frame.hasAvxCleanup()) ASMJIT_PROPAGATE(emitter->vzeroupper());
-
- if (frame.hasPreservedFP()) {
- // Emit 'mov zsp, zbp' or 'lea zsp, [zbp - x]'
- int32_t count = int32_t(frame.pushPopSaveSize() - registerSize);
- if (!count)
- ASMJIT_PROPAGATE(emitter->mov(zsp, zbp));
- else
- ASMJIT_PROPAGATE(emitter->lea(zsp, ptr(zbp, -count)));
- }
- else {
- if (frame.hasDynamicAlignment() && frame.hasDAOffset()) {
- // Emit 'mov zsp, [zsp + DsaSlot]'.
- Mem saMem = ptr(zsp, int32_t(frame.daOffset()));
- ASMJIT_PROPAGATE(emitter->mov(zsp, saMem));
- }
- else if (frame.hasStackAdjustment()) {
- // Emit 'add zsp, StackAdjustment'.
- ASMJIT_PROPAGATE(emitter->add(zsp, int32_t(frame.stackAdjustment())));
- }
- }
-
- // Emit 'pop gp' sequence.
- if (gpSaved) {
- i = gpSaved;
- regId = 16;
-
- do {
- regId--;
- if (i & 0x8000) {
- gpReg.setId(regId);
- ASMJIT_PROPAGATE(emitter->pop(gpReg));
- }
- i <<= 1;
- } while (regId != 0);
- }
-
- // Emit 'pop zbp'.
- if (frame.hasPreservedFP())
- ASMJIT_PROPAGATE(emitter->pop(zbp));
-
- // Emit 'ret' or 'ret x'.
- if (frame.hasCalleeStackCleanup())
- ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet, int(frame.calleeStackCleanup())));
- else
- ASMJIT_PROPAGATE(emitter->emit(Inst::kIdRet));
-
- return kErrorOk;
-}
-
-static Error ASMJIT_CDECL Emitter_emitProlog(BaseEmitter* emitter, const FuncFrame& frame) {
- EmitHelper emitHelper(emitter, frame.isAvxEnabled(), frame.isAvx512Enabled());
- return emitHelper.emitProlog(frame);
-}
-
-static Error ASMJIT_CDECL Emitter_emitEpilog(BaseEmitter* emitter, const FuncFrame& frame) {
- EmitHelper emitHelper(emitter, frame.isAvxEnabled(), frame.isAvx512Enabled());
- return emitHelper.emitEpilog(frame);
-}
-
-static Error ASMJIT_CDECL Emitter_emitArgsAssignment(BaseEmitter* emitter, const FuncFrame& frame, const FuncArgsAssignment& args) {
- EmitHelper emitHelper(emitter, frame.isAvxEnabled(), frame.isAvx512Enabled());
- return emitHelper.emitArgsAssignment(frame, args);
-}
-
-void assignEmitterFuncs(BaseEmitter* emitter) {
- emitter->_funcs.emitProlog = Emitter_emitProlog;
- emitter->_funcs.emitEpilog = Emitter_emitEpilog;
- emitter->_funcs.emitArgsAssignment = Emitter_emitArgsAssignment;
-
-#ifndef ASMJIT_NO_LOGGING
- emitter->_funcs.formatInstruction = FormatterInternal::formatInstruction;
-#endif
-
-#ifndef ASMJIT_NO_VALIDATION
- emitter->_funcs.validate = emitter->is32Bit() ? InstInternal::validateX86 : InstInternal::validateX64;
-#endif
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h b/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h
deleted file mode 100644
index e09d084a097..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86emithelper_p.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
-#define ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
-
-#include "../core/api-config.h"
-
-#include "../core/emithelper_p.h"
-#include "../core/func.h"
-#include "../x86/x86emitter.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-static ASMJIT_INLINE_NODEBUG RegType vecTypeIdToRegType(TypeId typeId) noexcept {
- return uint32_t(typeId) <= uint32_t(TypeId::_kVec128End) ? RegType::kX86_Xmm :
- uint32_t(typeId) <= uint32_t(TypeId::_kVec256End) ? RegType::kX86_Ymm : RegType::kX86_Zmm;
-}
-
-class EmitHelper : public BaseEmitHelper {
-public:
- bool _avxEnabled;
- bool _avx512Enabled;
-
- ASMJIT_INLINE_NODEBUG explicit EmitHelper(BaseEmitter* emitter = nullptr, bool avxEnabled = false, bool avx512Enabled = false) noexcept
- : BaseEmitHelper(emitter),
- _avxEnabled(avxEnabled || avx512Enabled),
- _avx512Enabled(avx512Enabled) {}
-
- Error emitRegMove(
- const Operand_& dst_,
- const Operand_& src_, TypeId typeId, const char* comment = nullptr) override;
-
- Error emitArgMove(
- const BaseReg& dst_, TypeId dstTypeId,
- const Operand_& src_, TypeId srcTypeId, const char* comment = nullptr) override;
-
- Error emitRegSwap(
- const BaseReg& a,
- const BaseReg& b, const char* comment = nullptr) override;
-
- Error emitProlog(const FuncFrame& frame);
- Error emitEpilog(const FuncFrame& frame);
-};
-
-void assignEmitterFuncs(BaseEmitter* emitter);
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86EMITHELPER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp b/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp
deleted file mode 100644
index 67b38dfa779..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86formatter.cpp
+++ /dev/null
@@ -1,992 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_LOGGING)
-
-#include "../core/cpuinfo.h"
-#include "../core/misc_p.h"
-#include "../core/support.h"
-#include "../x86/x86formatter_p.h"
-#include "../x86/x86instapi_p.h"
-#include "../x86/x86instdb_p.h"
-#include "../x86/x86operand.h"
-
-#ifndef ASMJIT_NO_COMPILER
- #include "../core/compiler.h"
-#endif
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::FormatterInternal - Constants
-// ==================================
-
-struct RegFormatInfo {
- struct TypeEntry {
- uint8_t index;
- };
-
- struct NameEntry {
- uint8_t count;
- uint8_t formatIndex;
- uint8_t specialIndex;
- uint8_t specialCount;
- };
-
- TypeEntry typeEntries[uint32_t(RegType::kMaxValue) + 1];
- char typeStrings[128 - 32];
-
- NameEntry nameEntries[uint32_t(RegType::kMaxValue) + 1];
- char nameStrings[280];
-};
-
-template<uint32_t X>
-struct RegFormatInfo_T {
- enum {
- kTypeIndex = X == uint32_t(RegType::kX86_GpbLo) ? 1 :
- X == uint32_t(RegType::kX86_GpbHi) ? 8 :
- X == uint32_t(RegType::kX86_Gpw ) ? 15 :
- X == uint32_t(RegType::kX86_Gpd ) ? 19 :
- X == uint32_t(RegType::kX86_Gpq ) ? 23 :
- X == uint32_t(RegType::kX86_Xmm ) ? 27 :
- X == uint32_t(RegType::kX86_Ymm ) ? 31 :
- X == uint32_t(RegType::kX86_Zmm ) ? 35 :
- X == uint32_t(RegType::kX86_Mm ) ? 50 :
- X == uint32_t(RegType::kX86_KReg ) ? 53 :
- X == uint32_t(RegType::kX86_SReg ) ? 43 :
- X == uint32_t(RegType::kX86_CReg ) ? 59 :
- X == uint32_t(RegType::kX86_DReg ) ? 62 :
- X == uint32_t(RegType::kX86_St ) ? 47 :
- X == uint32_t(RegType::kX86_Bnd ) ? 55 :
- X == uint32_t(RegType::kX86_Tmm ) ? 65 :
- X == uint32_t(RegType::kX86_Rip ) ? 39 : 0,
-
- kFormatIndex = X == uint32_t(RegType::kX86_GpbLo) ? 1 :
- X == uint32_t(RegType::kX86_GpbHi) ? 6 :
- X == uint32_t(RegType::kX86_Gpw ) ? 11 :
- X == uint32_t(RegType::kX86_Gpd ) ? 16 :
- X == uint32_t(RegType::kX86_Gpq ) ? 21 :
- X == uint32_t(RegType::kX86_Xmm ) ? 25 :
- X == uint32_t(RegType::kX86_Ymm ) ? 31 :
- X == uint32_t(RegType::kX86_Zmm ) ? 37 :
- X == uint32_t(RegType::kX86_Mm ) ? 60 :
- X == uint32_t(RegType::kX86_KReg ) ? 65 :
- X == uint32_t(RegType::kX86_SReg ) ? 49 :
- X == uint32_t(RegType::kX86_CReg ) ? 75 :
- X == uint32_t(RegType::kX86_DReg ) ? 80 :
- X == uint32_t(RegType::kX86_St ) ? 55 :
- X == uint32_t(RegType::kX86_Bnd ) ? 69 :
- X == uint32_t(RegType::kX86_Tmm ) ? 89 :
- X == uint32_t(RegType::kX86_Rip ) ? 43 : 0,
-
- kSpecialIndex = X == uint32_t(RegType::kX86_GpbLo) ? 96 :
- X == uint32_t(RegType::kX86_GpbHi) ? 128 :
- X == uint32_t(RegType::kX86_Gpw ) ? 161 :
- X == uint32_t(RegType::kX86_Gpd ) ? 160 :
- X == uint32_t(RegType::kX86_Gpq ) ? 192 :
- X == uint32_t(RegType::kX86_SReg ) ? 224 :
- X == uint32_t(RegType::kX86_Rip ) ? 85 : 0,
-
- kSpecialCount = X == uint32_t(RegType::kX86_GpbLo) ? 8 :
- X == uint32_t(RegType::kX86_GpbHi) ? 4 :
- X == uint32_t(RegType::kX86_Gpw ) ? 8 :
- X == uint32_t(RegType::kX86_Gpd ) ? 8 :
- X == uint32_t(RegType::kX86_Gpq ) ? 8 :
- X == uint32_t(RegType::kX86_SReg ) ? 7 :
- X == uint32_t(RegType::kX86_Rip ) ? 1 : 0,
-
- kRegCount = X == uint32_t(RegType::kX86_GpbLo) ? 32 :
- X == uint32_t(RegType::kX86_GpbHi) ? 4 :
- X == uint32_t(RegType::kX86_Gpw ) ? 32 :
- X == uint32_t(RegType::kX86_Gpd ) ? 32 :
- X == uint32_t(RegType::kX86_Gpq ) ? 32 :
- X == uint32_t(RegType::kX86_Xmm ) ? 32 :
- X == uint32_t(RegType::kX86_Ymm ) ? 32 :
- X == uint32_t(RegType::kX86_Zmm ) ? 32 :
- X == uint32_t(RegType::kX86_Mm ) ? 8 :
- X == uint32_t(RegType::kX86_KReg ) ? 8 :
- X == uint32_t(RegType::kX86_SReg ) ? 7 :
- X == uint32_t(RegType::kX86_CReg ) ? 16 :
- X == uint32_t(RegType::kX86_DReg ) ? 16 :
- X == uint32_t(RegType::kX86_St ) ? 8 :
- X == uint32_t(RegType::kX86_Bnd ) ? 4 :
- X == uint32_t(RegType::kX86_Tmm ) ? 8 :
- X == uint32_t(RegType::kX86_Rip ) ? 1 : 0
- };
-};
-
-#define ASMJIT_REG_TYPE_ENTRY(TYPE) { \
- RegFormatInfo_T<TYPE>::kTypeIndex \
-}
-
-#define ASMJIT_REG_NAME_ENTRY(TYPE) { \
- RegFormatInfo_T<TYPE>::kRegCount, \
- RegFormatInfo_T<TYPE>::kFormatIndex, \
- RegFormatInfo_T<TYPE>::kSpecialIndex, \
- RegFormatInfo_T<TYPE>::kSpecialCount \
-}
-
-static const RegFormatInfo x86RegFormatInfo = {
- // Register type entries and strings.
- { ASMJIT_LOOKUP_TABLE_32(ASMJIT_REG_TYPE_ENTRY, 0) },
-
- "\0" // #0
- "gpb\0\0\0\0" // #1
- "gpb.hi\0" // #8
- "gpw\0" // #15
- "gpd\0" // #19
- "gpq\0" // #23
- "xmm\0" // #27
- "ymm\0" // #31
- "zmm\0" // #35
- "rip\0" // #39
- "seg\0" // #43
- "st\0" // #47
- "mm\0" // #50
- "k\0" // #53
- "bnd\0" // #55
- "cr\0" // #59
- "dr\0" // #62
- "tmm\0" // #65
- ,
-
- // Register name entries and strings.
- { ASMJIT_LOOKUP_TABLE_32(ASMJIT_REG_NAME_ENTRY, 0) },
-
- "\0"
- "r%ub\0" // #1
- "r%uh\0" // #6
- "r%uw\0" // #11
- "r%ud\0" // #16
- "r%u\0" // #21
- "xmm%u\0" // #25
- "ymm%u\0" // #31
- "zmm%u\0" // #37
- "rip%u\0" // #43
- "seg%u\0" // #49
- "st%u\0" // #55
- "mm%u\0" // #60
- "k%u\0" // #65
- "bnd%u\0" // #69
- "cr%u\0" // #75
- "dr%u\0" // #80
-
- "rip\0" // #85
- "tmm%u\0" // #89
- "\0" // #95
-
- "al\0\0" "cl\0\0" "dl\0\0" "bl\0\0" "spl\0" "bpl\0" "sil\0" "dil\0" // #96
- "ah\0\0" "ch\0\0" "dh\0\0" "bh\0\0" "n/a\0" "n/a\0" "n/a\0" "n/a\0" // #128
- "eax\0" "ecx\0" "edx\0" "ebx\0" "esp\0" "ebp\0" "esi\0" "edi\0" // #160
- "rax\0" "rcx\0" "rdx\0" "rbx\0" "rsp\0" "rbp\0" "rsi\0" "rdi\0" // #192
- "n/a\0" "es\0\0" "cs\0\0" "ss\0\0" "ds\0\0" "fs\0\0" "gs\0\0" "n/a\0" // #224
-};
-#undef ASMJIT_REG_NAME_ENTRY
-#undef ASMJIT_REG_TYPE_ENTRY
-
-static const char* x86GetAddressSizeString(uint32_t size) noexcept {
- switch (size) {
- case 1 : return "byte ptr ";
- case 2 : return "word ptr ";
- case 4 : return "dword ptr ";
- case 6 : return "fword ptr ";
- case 8 : return "qword ptr ";
- case 10: return "tbyte ptr ";
- case 16: return "xmmword ptr ";
- case 32: return "ymmword ptr ";
- case 64: return "zmmword ptr ";
- default: return "";
- }
-}
-
-// x86::FormatterInternal - Format FeatureId
-// =========================================
-
-Error FormatterInternal::formatFeature(String& sb, uint32_t featureId) noexcept {
- // @EnumStringBegin{"enum": "CpuFeatures::X86", "output": "sFeature", "strip": "k"}@
- static const char sFeatureString[] =
- "None\0"
- "MT\0"
- "NX\0"
- "3DNOW\0"
- "3DNOW2\0"
- "ADX\0"
- "AESNI\0"
- "ALTMOVCR8\0"
- "AMX_BF16\0"
- "AMX_COMPLEX\0"
- "AMX_FP16\0"
- "AMX_INT8\0"
- "AMX_TILE\0"
- "APX_F\0"
- "AVX\0"
- "AVX2\0"
- "AVX512_4FMAPS\0"
- "AVX512_4VNNIW\0"
- "AVX512_BF16\0"
- "AVX512_BITALG\0"
- "AVX512_BW\0"
- "AVX512_CD\0"
- "AVX512_DQ\0"
- "AVX512_ER\0"
- "AVX512_F\0"
- "AVX512_FP16\0"
- "AVX512_IFMA\0"
- "AVX512_PF\0"
- "AVX512_VBMI\0"
- "AVX512_VBMI2\0"
- "AVX512_VL\0"
- "AVX512_VNNI\0"
- "AVX512_VP2INTERSECT\0"
- "AVX512_VPOPCNTDQ\0"
- "AVX_IFMA\0"
- "AVX_NE_CONVERT\0"
- "AVX_VNNI\0"
- "AVX_VNNI_INT16\0"
- "AVX_VNNI_INT8\0"
- "BMI\0"
- "BMI2\0"
- "CET_IBT\0"
- "CET_SS\0"
- "CET_SSS\0"
- "CLDEMOTE\0"
- "CLFLUSH\0"
- "CLFLUSHOPT\0"
- "CLWB\0"
- "CLZERO\0"
- "CMOV\0"
- "CMPCCXADD\0"
- "CMPXCHG16B\0"
- "CMPXCHG8B\0"
- "ENCLV\0"
- "ENQCMD\0"
- "ERMS\0"
- "F16C\0"
- "FMA\0"
- "FMA4\0"
- "FPU\0"
- "FSGSBASE\0"
- "FSRM\0"
- "FSRC\0"
- "FSRS\0"
- "FXSR\0"
- "FXSROPT\0"
- "FZRM\0"
- "GEODE\0"
- "GFNI\0"
- "HLE\0"
- "HRESET\0"
- "I486\0"
- "INVLPGB\0"
- "LAHFSAHF\0"
- "LAM\0"
- "LWP\0"
- "LZCNT\0"
- "MCOMMIT\0"
- "MMX\0"
- "MMX2\0"
- "MONITOR\0"
- "MONITORX\0"
- "MOVBE\0"
- "MOVDIR64B\0"
- "MOVDIRI\0"
- "MPX\0"
- "MSR\0"
- "MSRLIST\0"
- "MSSE\0"
- "OSXSAVE\0"
- "OSPKE\0"
- "PCLMULQDQ\0"
- "PCONFIG\0"
- "POPCNT\0"
- "PREFETCHI\0"
- "PREFETCHW\0"
- "PREFETCHWT1\0"
- "PTWRITE\0"
- "RAO_INT\0"
- "RMPQUERY\0"
- "RDPID\0"
- "RDPRU\0"
- "RDRAND\0"
- "RDSEED\0"
- "RDTSC\0"
- "RDTSCP\0"
- "RTM\0"
- "SEAM\0"
- "SERIALIZE\0"
- "SEV\0"
- "SEV_ES\0"
- "SEV_SNP\0"
- "SHA\0"
- "SHA512\0"
- "SKINIT\0"
- "SM3\0"
- "SM4\0"
- "SMAP\0"
- "SME\0"
- "SMEP\0"
- "SMX\0"
- "SSE\0"
- "SSE2\0"
- "SSE3\0"
- "SSE4_1\0"
- "SSE4_2\0"
- "SSE4A\0"
- "SSSE3\0"
- "SVM\0"
- "TBM\0"
- "TSE\0"
- "TSX\0"
- "TSXLDTRK\0"
- "UINTR\0"
- "VAES\0"
- "VMX\0"
- "VPCLMULQDQ\0"
- "WAITPKG\0"
- "WBNOINVD\0"
- "WRMSRNS\0"
- "XOP\0"
- "XSAVE\0"
- "XSAVEC\0"
- "XSAVEOPT\0"
- "XSAVES\0"
- "<Unknown>\0";
-
- static const uint16_t sFeatureIndex[] = {
- 0, 5, 8, 11, 17, 24, 28, 34, 44, 53, 65, 74, 83, 92, 98, 102, 107, 121, 135,
- 147, 161, 171, 181, 191, 201, 210, 222, 234, 244, 256, 269, 279, 291, 311,
- 328, 337, 352, 361, 376, 390, 394, 399, 407, 414, 422, 431, 439, 450, 455,
- 462, 467, 477, 488, 498, 504, 511, 516, 521, 525, 530, 534, 543, 548, 553,
- 558, 563, 571, 576, 582, 587, 591, 598, 603, 611, 620, 624, 628, 634, 642,
- 646, 651, 659, 668, 674, 684, 692, 696, 700, 708, 713, 721, 727, 737, 745,
- 752, 762, 772, 784, 792, 800, 809, 815, 821, 828, 835, 841, 848, 852, 857,
- 867, 871, 878, 886, 890, 897, 904, 908, 912, 917, 921, 926, 930, 934, 939,
- 944, 951, 958, 964, 970, 974, 978, 982, 986, 995, 1001, 1006, 1010, 1021,
- 1029, 1038, 1046, 1050, 1056, 1063, 1072, 1079
- };
- // @EnumStringEnd@
-
- return sb.append(sFeatureString + sFeatureIndex[Support::min<uint32_t>(featureId, uint32_t(CpuFeatures::X86::kMaxValue) + 1)]);
-}
-
-// x86::FormatterInternal - Format Register
-// ========================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatRegister(String& sb, FormatFlags formatFlags, const BaseEmitter* emitter, Arch arch, RegType type, uint32_t id) noexcept {
- DebugUtils::unused(arch);
- const RegFormatInfo& info = x86RegFormatInfo;
-
-#ifndef ASMJIT_NO_COMPILER
- if (Operand::isVirtId(id)) {
- if (emitter && emitter->emitterType() == EmitterType::kCompiler) {
- const BaseCompiler* cc = static_cast<const BaseCompiler*>(emitter);
- if (cc->isVirtIdValid(id)) {
- VirtReg* vReg = cc->virtRegById(id);
- ASMJIT_ASSERT(vReg != nullptr);
-
- const char* name = vReg->name();
- if (name && name[0] != '\0')
- ASMJIT_PROPAGATE(sb.append(name));
- else
- ASMJIT_PROPAGATE(sb.appendFormat("%%%u", unsigned(Operand::virtIdToIndex(id))));
-
- bool formatType = (Support::test(formatFlags, FormatFlags::kRegType)) ||
- (Support::test(formatFlags, FormatFlags::kRegCasts) && vReg->type() != type);
-
- if (formatType && uint32_t(type) <= uint32_t(RegType::kMaxValue)) {
- const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[size_t(type)];
- if (typeEntry.index)
- ASMJIT_PROPAGATE(sb.appendFormat("@%s", info.typeStrings + typeEntry.index));
- }
-
- return kErrorOk;
- }
- }
- }
-#else
- DebugUtils::unused(emitter, formatFlags);
-#endif
-
- if (uint32_t(type) <= uint32_t(RegType::kMaxValue)) {
- const RegFormatInfo::NameEntry& nameEntry = info.nameEntries[size_t(type)];
-
- if (id < nameEntry.specialCount)
- return sb.append(info.nameStrings + nameEntry.specialIndex + id * 4);
-
- if (id < nameEntry.count)
- return sb.appendFormat(info.nameStrings + nameEntry.formatIndex, unsigned(id));
-
- const RegFormatInfo::TypeEntry& typeEntry = info.typeEntries[size_t(type)];
- if (typeEntry.index)
- return sb.appendFormat("%s@%u", info.typeStrings + typeEntry.index, id);
- }
-
- return sb.appendFormat("<Reg-%u>?%u", uint32_t(type), id);
-}
-
-// x86::FormatterInternal - Format Operand
-// =======================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatOperand(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const Operand_& op) noexcept {
-
- if (op.isReg())
- return formatRegister(sb, formatFlags, emitter, arch, op.as<BaseReg>().type(), op.as<BaseReg>().id());
-
- if (op.isMem()) {
- const Mem& m = op.as<Mem>();
- ASMJIT_PROPAGATE(sb.append(x86GetAddressSizeString(m.size())));
-
- // Segment override prefix.
- uint32_t seg = m.segmentId();
- if (seg != SReg::kIdNone && seg < SReg::kIdCount)
- ASMJIT_PROPAGATE(sb.appendFormat("%s:", x86RegFormatInfo.nameStrings + 224 + size_t(seg) * 4));
-
- ASMJIT_PROPAGATE(sb.append('['));
- switch (m.addrType()) {
- case Mem::AddrType::kDefault:
- break;
- case Mem::AddrType::kAbs:
- ASMJIT_PROPAGATE(sb.append("abs "));
- break;
- case Mem::AddrType::kRel:
- ASMJIT_PROPAGATE(sb.append("rel "));
- break;
- }
-
- char opSign = '\0';
- if (m.hasBase()) {
- opSign = '+';
- if (m.hasBaseLabel()) {
- ASMJIT_PROPAGATE(Formatter::formatLabel(sb, formatFlags, emitter, m.baseId()));
- }
- else {
- FormatFlags modifiedFlags = formatFlags;
- if (m.isRegHome()) {
- ASMJIT_PROPAGATE(sb.append("&"));
- modifiedFlags &= ~FormatFlags::kRegCasts;
- }
- ASMJIT_PROPAGATE(formatRegister(sb, modifiedFlags, emitter, arch, m.baseType(), m.baseId()));
- }
- }
-
- if (m.hasIndex()) {
- if (opSign)
- ASMJIT_PROPAGATE(sb.append(opSign));
-
- opSign = '+';
- ASMJIT_PROPAGATE(formatRegister(sb, formatFlags, emitter, arch, m.indexType(), m.indexId()));
- if (m.hasShift())
- ASMJIT_PROPAGATE(sb.appendFormat("*%u", 1 << m.shift()));
- }
-
- uint64_t off = uint64_t(m.offset());
- if (off || !m.hasBaseOrIndex()) {
- if (int64_t(off) < 0) {
- opSign = '-';
- off = ~off + 1;
- }
-
- if (opSign)
- ASMJIT_PROPAGATE(sb.append(opSign));
-
- uint32_t base = 10;
- if (Support::test(formatFlags, FormatFlags::kHexOffsets) && off > 9) {
- ASMJIT_PROPAGATE(sb.append("0x", 2));
- base = 16;
- }
-
- ASMJIT_PROPAGATE(sb.appendUInt(off, base));
- }
-
- return sb.append(']');
- }
-
- if (op.isImm()) {
- const Imm& i = op.as<Imm>();
- int64_t val = i.value();
-
- if (Support::test(formatFlags, FormatFlags::kHexImms) && uint64_t(val) > 9) {
- ASMJIT_PROPAGATE(sb.append("0x", 2));
- return sb.appendUInt(uint64_t(val), 16);
- }
- else {
- return sb.appendInt(val, 10);
- }
- }
-
- if (op.isLabel()) {
- return Formatter::formatLabel(sb, formatFlags, emitter, op.id());
- }
-
- return sb.append("<None>");
-}
-
-// x86::FormatterInternal - Format Immediate (Extension)
-// =====================================================
-
-static constexpr char kImmCharStart = '{';
-static constexpr char kImmCharEnd = '}';
-static constexpr char kImmCharOr = '|';
-
-struct ImmBits {
- enum Mode : uint32_t {
- kModeLookup = 0,
- kModeFormat = 1
- };
-
- uint8_t mask;
- uint8_t shift;
- uint8_t mode;
- char text[48 - 3];
-};
-
-ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmShuf(String& sb, uint32_t imm8, uint32_t bits, uint32_t count) noexcept {
- uint32_t mask = (1 << bits) - 1;
- uint32_t lastPredicateShift = bits * (count - 1u);
-
- for (uint32_t i = 0; i < count; i++, imm8 <<= bits) {
- uint32_t index = (imm8 >> lastPredicateShift) & mask;
- ASMJIT_PROPAGATE(sb.append(i == 0 ? kImmCharStart : kImmCharOr));
- ASMJIT_PROPAGATE(sb.appendUInt(index));
- }
-
- ASMJIT_PROPAGATE(sb.append(kImmCharEnd));
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmBits(String& sb, uint32_t imm8, const ImmBits* bits, uint32_t count) noexcept {
- uint32_t n = 0;
- char buf[64];
-
- for (uint32_t i = 0; i < count; i++) {
- const ImmBits& spec = bits[i];
-
- uint32_t value = (imm8 & uint32_t(spec.mask)) >> spec.shift;
- const char* str = nullptr;
-
- switch (spec.mode) {
- case ImmBits::kModeLookup:
- str = Support::findPackedString(spec.text, value);
- break;
-
- case ImmBits::kModeFormat:
- snprintf(buf, sizeof(buf), spec.text, unsigned(value));
- str = buf;
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- if (!str[0])
- continue;
-
- ASMJIT_PROPAGATE(sb.append(++n == 1 ? kImmCharStart : kImmCharOr));
- ASMJIT_PROPAGATE(sb.append(str));
- }
-
- if (n)
- ASMJIT_PROPAGATE(sb.append(kImmCharEnd));
-
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE static Error FormatterInternal_formatImmText(String& sb, uint32_t imm8, uint32_t bits, uint32_t advance, const char* text, uint32_t count = 1) noexcept {
- uint32_t mask = (1u << bits) - 1;
- uint32_t pos = 0;
-
- for (uint32_t i = 0; i < count; i++, imm8 >>= bits, pos += advance) {
- uint32_t value = (imm8 & mask) + pos;
- ASMJIT_PROPAGATE(sb.append(i == 0 ? kImmCharStart : kImmCharOr));
- ASMJIT_PROPAGATE(sb.append(Support::findPackedString(text, value)));
- }
-
- return sb.append(kImmCharEnd);
-}
-
-ASMJIT_FAVOR_SIZE static Error FormatterInternal_explainConst(
- String& sb,
- FormatFlags formatFlags,
- InstId instId,
- uint32_t vecSize,
- const Imm& imm) noexcept {
-
- DebugUtils::unused(formatFlags);
-
- static const char vcmpx[] =
- "EQ_OQ\0" "LT_OS\0" "LE_OS\0" "UNORD_Q\0" "NEQ_UQ\0" "NLT_US\0" "NLE_US\0" "ORD_Q\0"
- "EQ_UQ\0" "NGE_US\0" "NGT_US\0" "FALSE_OQ\0" "NEQ_OQ\0" "GE_OS\0" "GT_OS\0" "TRUE_UQ\0"
- "EQ_OS\0" "LT_OQ\0" "LE_OQ\0" "UNORD_S\0" "NEQ_US\0" "NLT_UQ\0" "NLE_UQ\0" "ORD_S\0"
- "EQ_US\0" "NGE_UQ\0" "NGT_UQ\0" "FALSE_OS\0" "NEQ_OS\0" "GE_OQ\0" "GT_OQ\0" "TRUE_US\0";
-
- // Why to make it compatible...
- static const char vpcmpx[] = "EQ\0" "LT\0" "LE\0" "FALSE\0" "NEQ\0" "GE\0" "GT\0" "TRUE\0";
- static const char vpcomx[] = "LT\0" "LE\0" "GT\0" "GE\0" "EQ\0" "NEQ\0" "FALSE\0" "TRUE\0";
-
- static const char vshufpd[] = "A0\0" "A1\0" "B0\0" "B1\0" "A2\0" "A3\0" "B2\0" "B3\0" "A4\0" "A5\0" "B4\0" "B5\0" "A6\0" "A7\0" "B6\0" "B7\0";
- static const char vshufps[] = "A0\0" "A1\0" "A2\0" "A3\0" "A0\0" "A1\0" "A2\0" "A3\0" "B0\0" "B1\0" "B2\0" "B3\0" "B0\0" "B1\0" "B2\0" "B3\0";
-
- static const ImmBits vfpclassxx[] = {
- { 0x07u, 0, ImmBits::kModeLookup, "QNAN\0" "+0\0" "-0\0" "+INF\0" "-INF\0" "DENORMAL\0" "-FINITE\0" "SNAN\0" }
- };
-
- static const ImmBits vfixupimmxx[] = {
- { 0x01u, 0, ImmBits::kModeLookup, "\0" "+INF_IE\0" },
- { 0x02u, 1, ImmBits::kModeLookup, "\0" "-VE_IE\0" },
- { 0x04u, 2, ImmBits::kModeLookup, "\0" "-INF_IE\0" },
- { 0x08u, 3, ImmBits::kModeLookup, "\0" "SNAN_IE\0" },
- { 0x10u, 4, ImmBits::kModeLookup, "\0" "ONE_IE\0" },
- { 0x20u, 5, ImmBits::kModeLookup, "\0" "ONE_ZE\0" },
- { 0x40u, 6, ImmBits::kModeLookup, "\0" "ZERO_IE\0" },
- { 0x80u, 7, ImmBits::kModeLookup, "\0" "ZERO_ZE\0" }
- };
-
- static const ImmBits vgetmantxx[] = {
- { 0x03u, 0, ImmBits::kModeLookup, "[1, 2)\0" "[.5, 2)\0" "[.5, 1)\0" "[.75, 1.5)\0" },
- { 0x04u, 2, ImmBits::kModeLookup, "\0" "NO_SIGN\0" },
- { 0x08u, 3, ImmBits::kModeLookup, "\0" "QNAN_IF_SIGN\0" }
- };
-
- static const ImmBits vmpsadbw[] = {
- { 0x40u, 6, ImmBits::kModeLookup, "BLK1[4]\0" "BLK1[5]\0" },
- { 0x30u, 4, ImmBits::kModeLookup, "BLK2[4]\0" "BLK2[5]\0" "BLK2[6]\0" "BLK2[7]\0" },
- { 0x04u, 2, ImmBits::kModeLookup, "BLK1[0]\0" "BLK1[1]\0" },
- { 0x03u, 0, ImmBits::kModeLookup, "BLK2[0]\0" "BLK2[1]\0" "BLK2[2]\0" "BLK2[3]\0" }
- };
-
- static const ImmBits vpclmulqdq[] = {
- { 0x10u, 4, ImmBits::kModeLookup, "LQ\0" "HQ\0" },
- { 0x01u, 0, ImmBits::kModeLookup, "LQ\0" "HQ\0" }
- };
-
- static const ImmBits vperm2x128[] = {
- { 0xB0u, 4, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" },
- { 0x0Bu, 0, ImmBits::kModeLookup, "A0\0" "A1\0" "B0\0" "B1\0" "\0" "\0" "\0" "\0" "0\0" "0\0" "0\0" "0\0" }
- };
-
- static const ImmBits vrangexx[] = {
- { 0x0Cu, 2, ImmBits::kModeLookup, "SIGN_A\0" "SIGN_B\0" "SIGN_0\0" "SIGN_1\0" },
- { 0x03u, 0, ImmBits::kModeLookup, "MIN\0" "MAX\0" "MIN_ABS\0" "MAX_ABS\0" }
- };
-
- static const ImmBits vreducexx_vrndscalexx[] = {
- { 0x07u, 0, ImmBits::kModeLookup, "\0" "\0" "\0" "\0" "ROUND\0" "FLOOR\0" "CEIL\0" "TRUNC\0" },
- { 0x08u, 3, ImmBits::kModeLookup, "\0" "SAE\0" },
- { 0xF0u, 4, ImmBits::kModeFormat, "LEN=%d" }
- };
-
- static const ImmBits vroundxx[] = {
- { 0x07u, 0, ImmBits::kModeLookup, "ROUND\0" "FLOOR\0" "CEIL\0" "TRUNC\0" "\0" "\0" "\0" "\0" },
- { 0x08u, 3, ImmBits::kModeLookup, "\0" "INEXACT\0" }
- };
-
- uint32_t u8 = imm.valueAs<uint8_t>();
- switch (instId) {
- case Inst::kIdVblendpd:
- case Inst::kIdBlendpd:
- return FormatterInternal_formatImmShuf(sb, u8, 1, vecSize / 8);
-
- case Inst::kIdVblendps:
- case Inst::kIdBlendps:
- return FormatterInternal_formatImmShuf(sb, u8, 1, vecSize / 4);
-
- case Inst::kIdVcmppd:
- case Inst::kIdVcmpps:
- case Inst::kIdVcmpsd:
- case Inst::kIdVcmpss:
- return FormatterInternal_formatImmText(sb, u8, 5, 0, vcmpx);
-
- case Inst::kIdCmppd:
- case Inst::kIdCmpps:
- case Inst::kIdCmpsd:
- case Inst::kIdCmpss:
- return FormatterInternal_formatImmText(sb, u8, 3, 0, vcmpx);
-
- case Inst::kIdVdbpsadbw:
- return FormatterInternal_formatImmShuf(sb, u8, 2, 4);
-
- case Inst::kIdVdppd:
- case Inst::kIdVdpps:
- case Inst::kIdDppd:
- case Inst::kIdDpps:
- return FormatterInternal_formatImmShuf(sb, u8, 1, 8);
-
- case Inst::kIdVmpsadbw:
- case Inst::kIdMpsadbw:
- return FormatterInternal_formatImmBits(sb, u8, vmpsadbw, Support::min<uint32_t>(vecSize / 8, 4));
-
- case Inst::kIdVpblendw:
- case Inst::kIdPblendw:
- return FormatterInternal_formatImmShuf(sb, u8, 1, 8);
-
- case Inst::kIdVpblendd:
- return FormatterInternal_formatImmShuf(sb, u8, 1, Support::min<uint32_t>(vecSize / 4, 8));
-
- case Inst::kIdVpclmulqdq:
- case Inst::kIdPclmulqdq:
- return FormatterInternal_formatImmBits(sb, u8, vpclmulqdq, ASMJIT_ARRAY_SIZE(vpclmulqdq));
-
- case Inst::kIdVroundpd:
- case Inst::kIdVroundps:
- case Inst::kIdVroundsd:
- case Inst::kIdVroundss:
- case Inst::kIdRoundpd:
- case Inst::kIdRoundps:
- case Inst::kIdRoundsd:
- case Inst::kIdRoundss:
- return FormatterInternal_formatImmBits(sb, u8, vroundxx, ASMJIT_ARRAY_SIZE(vroundxx));
-
- case Inst::kIdVshufpd:
- case Inst::kIdShufpd:
- return FormatterInternal_formatImmText(sb, u8, 1, 2, vshufpd, Support::min<uint32_t>(vecSize / 8, 8));
-
- case Inst::kIdVshufps:
- case Inst::kIdShufps:
- return FormatterInternal_formatImmText(sb, u8, 2, 4, vshufps, 4);
-
- case Inst::kIdVcvtps2ph:
- return FormatterInternal_formatImmBits(sb, u8, vroundxx, 1);
-
- case Inst::kIdVperm2f128:
- case Inst::kIdVperm2i128:
- return FormatterInternal_formatImmBits(sb, u8, vperm2x128, ASMJIT_ARRAY_SIZE(vperm2x128));
-
- case Inst::kIdVpermilpd:
- return FormatterInternal_formatImmShuf(sb, u8, 1, vecSize / 8);
-
- case Inst::kIdVpermilps:
- return FormatterInternal_formatImmShuf(sb, u8, 2, 4);
-
- case Inst::kIdVpshufd:
- case Inst::kIdPshufd:
- return FormatterInternal_formatImmShuf(sb, u8, 2, 4);
-
- case Inst::kIdVpshufhw:
- case Inst::kIdVpshuflw:
- case Inst::kIdPshufhw:
- case Inst::kIdPshuflw:
- case Inst::kIdPshufw:
- return FormatterInternal_formatImmShuf(sb, u8, 2, 4);
-
- case Inst::kIdVfixupimmpd:
- case Inst::kIdVfixupimmps:
- case Inst::kIdVfixupimmsd:
- case Inst::kIdVfixupimmss:
- return FormatterInternal_formatImmBits(sb, u8, vfixupimmxx, ASMJIT_ARRAY_SIZE(vfixupimmxx));
-
- case Inst::kIdVfpclasspd:
- case Inst::kIdVfpclassps:
- case Inst::kIdVfpclasssd:
- case Inst::kIdVfpclassss:
- return FormatterInternal_formatImmBits(sb, u8, vfpclassxx, ASMJIT_ARRAY_SIZE(vfpclassxx));
-
- case Inst::kIdVgetmantpd:
- case Inst::kIdVgetmantps:
- case Inst::kIdVgetmantsd:
- case Inst::kIdVgetmantss:
- return FormatterInternal_formatImmBits(sb, u8, vgetmantxx, ASMJIT_ARRAY_SIZE(vgetmantxx));
-
- case Inst::kIdVpcmpb:
- case Inst::kIdVpcmpd:
- case Inst::kIdVpcmpq:
- case Inst::kIdVpcmpw:
- case Inst::kIdVpcmpub:
- case Inst::kIdVpcmpud:
- case Inst::kIdVpcmpuq:
- case Inst::kIdVpcmpuw:
- return FormatterInternal_formatImmText(sb, u8, 3, 0, vpcmpx);
-
- case Inst::kIdVpcomb:
- case Inst::kIdVpcomd:
- case Inst::kIdVpcomq:
- case Inst::kIdVpcomw:
- case Inst::kIdVpcomub:
- case Inst::kIdVpcomud:
- case Inst::kIdVpcomuq:
- case Inst::kIdVpcomuw:
- return FormatterInternal_formatImmText(sb, u8, 3, 0, vpcomx);
-
- case Inst::kIdVpermq:
- case Inst::kIdVpermpd:
- return FormatterInternal_formatImmShuf(sb, u8, 2, 4);
-
- case Inst::kIdVpternlogd:
- case Inst::kIdVpternlogq:
- return FormatterInternal_formatImmShuf(sb, u8, 1, 8);
-
- case Inst::kIdVrangepd:
- case Inst::kIdVrangeps:
- case Inst::kIdVrangesd:
- case Inst::kIdVrangess:
- return FormatterInternal_formatImmBits(sb, u8, vrangexx, ASMJIT_ARRAY_SIZE(vrangexx));
-
- case Inst::kIdVreducepd:
- case Inst::kIdVreduceps:
- case Inst::kIdVreducesd:
- case Inst::kIdVreducess:
- case Inst::kIdVrndscalepd:
- case Inst::kIdVrndscaleps:
- case Inst::kIdVrndscalesd:
- case Inst::kIdVrndscaless:
- return FormatterInternal_formatImmBits(sb, u8, vreducexx_vrndscalexx, ASMJIT_ARRAY_SIZE(vreducexx_vrndscalexx));
-
- case Inst::kIdVshuff32x4:
- case Inst::kIdVshuff64x2:
- case Inst::kIdVshufi32x4:
- case Inst::kIdVshufi64x2: {
- uint32_t count = Support::max<uint32_t>(vecSize / 16, 2u);
- uint32_t bits = count <= 2 ? 1u : 2u;
- return FormatterInternal_formatImmShuf(sb, u8, bits, count);
- }
-
- default:
- return kErrorOk;
- }
-}
-
-// x86::FormatterInternal - Format Instruction
-// ===========================================
-
-ASMJIT_FAVOR_SIZE Error FormatterInternal::formatInstruction(
- String& sb,
- FormatFlags formatFlags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept {
-
- InstId instId = inst.id();
- InstOptions options = inst.options();
-
- // Format instruction options and instruction mnemonic.
- if (instId < Inst::_kIdCount) {
- // VEX|EVEX options.
- if (Support::test(options, InstOptions::kX86_Vex))
- ASMJIT_PROPAGATE(sb.append("{vex} "));
-
- if (Support::test(options, InstOptions::kX86_Vex3))
- ASMJIT_PROPAGATE(sb.append("{vex3} "));
-
- if (Support::test(options, InstOptions::kX86_Evex))
- ASMJIT_PROPAGATE(sb.append("{evex} "));
-
- // MOD/RM and MOD/MR options
- if (Support::test(options, InstOptions::kX86_ModRM))
- ASMJIT_PROPAGATE(sb.append("{modrm} "));
- else if (Support::test(options, InstOptions::kX86_ModMR))
- ASMJIT_PROPAGATE(sb.append("{modmr} "));
-
- // SHORT|LONG options.
- if (Support::test(options, InstOptions::kShortForm))
- ASMJIT_PROPAGATE(sb.append("short "));
-
- if (Support::test(options, InstOptions::kLongForm))
- ASMJIT_PROPAGATE(sb.append("long "));
-
- // LOCK|XACQUIRE|XRELEASE options.
- if (Support::test(options, InstOptions::kX86_XAcquire))
- ASMJIT_PROPAGATE(sb.append("xacquire "));
-
- if (Support::test(options, InstOptions::kX86_XRelease))
- ASMJIT_PROPAGATE(sb.append("xrelease "));
-
- if (Support::test(options, InstOptions::kX86_Lock))
- ASMJIT_PROPAGATE(sb.append("lock "));
-
- // REP|REPNE options.
- if (Support::test(options, InstOptions::kX86_Rep | InstOptions::kX86_Repne)) {
- sb.append(Support::test(options, InstOptions::kX86_Rep) ? "rep " : "repnz ");
- if (inst.hasExtraReg()) {
- ASMJIT_PROPAGATE(sb.append("{"));
- ASMJIT_PROPAGATE(formatOperand(sb, formatFlags, emitter, arch, inst.extraReg().toReg<BaseReg>()));
- ASMJIT_PROPAGATE(sb.append("} "));
- }
- }
-
- // REX options.
- if (Support::test(options, InstOptions::kX86_Rex)) {
- const InstOptions kRXBWMask = InstOptions::kX86_OpCodeR |
- InstOptions::kX86_OpCodeX |
- InstOptions::kX86_OpCodeB |
- InstOptions::kX86_OpCodeW ;
- if (Support::test(options, kRXBWMask)) {
- ASMJIT_PROPAGATE(sb.append("rex."));
- if (Support::test(options, InstOptions::kX86_OpCodeR)) sb.append('r');
- if (Support::test(options, InstOptions::kX86_OpCodeX)) sb.append('x');
- if (Support::test(options, InstOptions::kX86_OpCodeB)) sb.append('b');
- if (Support::test(options, InstOptions::kX86_OpCodeW)) sb.append('w');
- sb.append(' ');
- }
- else {
- ASMJIT_PROPAGATE(sb.append("rex "));
- }
- }
-
- ASMJIT_PROPAGATE(InstInternal::instIdToString(instId, sb));
- }
- else {
- ASMJIT_PROPAGATE(sb.appendFormat("[InstId=#%u]", unsigned(instId)));
- }
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand_& op = operands[i];
- if (op.isNone()) break;
-
- ASMJIT_PROPAGATE(sb.append(i == 0 ? " " : ", "));
- ASMJIT_PROPAGATE(formatOperand(sb, formatFlags, emitter, arch, op));
-
- if (op.isImm() && uint32_t(formatFlags & FormatFlags::kExplainImms)) {
- uint32_t vecSize = 16;
- for (uint32_t j = 0; j < opCount; j++)
- if (operands[j].isReg())
- vecSize = Support::max<uint32_t>(vecSize, operands[j].as<Reg>().size());
- ASMJIT_PROPAGATE(FormatterInternal_explainConst(sb, formatFlags, instId, vecSize, op.as<Imm>()));
- }
-
- // Support AVX-512 masking - {k}{z}.
- if (i == 0) {
- if (inst.extraReg().group() == RegGroup::kX86_K) {
- ASMJIT_PROPAGATE(sb.append(" {"));
- ASMJIT_PROPAGATE(formatRegister(sb, formatFlags, emitter, arch, inst.extraReg().type(), inst.extraReg().id()));
- ASMJIT_PROPAGATE(sb.append('}'));
-
- if (Support::test(options, InstOptions::kX86_ZMask))
- ASMJIT_PROPAGATE(sb.append("{z}"));
- }
- else if (Support::test(options, InstOptions::kX86_ZMask)) {
- ASMJIT_PROPAGATE(sb.append(" {z}"));
- }
- }
-
- // Support AVX-512 broadcast - {1tox}.
- if (op.isMem() && op.as<Mem>().hasBroadcast()) {
- ASMJIT_PROPAGATE(sb.appendFormat(" {1to%u}", Support::bitMask(uint32_t(op.as<Mem>().getBroadcast()))));
- }
- }
-
- // Support AVX-512 embedded rounding and suppress-all-exceptions {sae}.
- if (inst.hasOption(InstOptions::kX86_ER | InstOptions::kX86_SAE)) {
- if (inst.hasOption(InstOptions::kX86_ER)) {
- uint32_t bits = uint32_t(inst.options() & InstOptions::kX86_ERMask) >> Support::ConstCTZ<uint32_t(InstOptions::kX86_ERMask)>::value;
-
- const char roundingModes[] = "rn\0rd\0ru\0rz";
- ASMJIT_PROPAGATE(sb.appendFormat(", {%s-sae}", roundingModes + bits * 3));
- }
- else {
- ASMJIT_PROPAGATE(sb.append(", {sae}"));
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_LOGGING
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h b/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h
deleted file mode 100644
index f37a8f6db14..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86formatter_p.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
-#define ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_LOGGING
-
-#include "../core/formatter.h"
-#include "../core/string.h"
-#include "../x86/x86globals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-namespace FormatterInternal {
-
-Error ASMJIT_CDECL formatFeature(
- String& sb,
- uint32_t featureId) noexcept;
-
-Error ASMJIT_CDECL formatRegister(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- RegType regType,
- uint32_t regId) noexcept;
-
-Error ASMJIT_CDECL formatOperand(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- const Operand_& op) noexcept;
-
-Error ASMJIT_CDECL formatInstruction(
- String& sb,
- FormatFlags flags,
- const BaseEmitter* emitter,
- Arch arch,
- const BaseInst& inst, const Operand_* operands, size_t opCount) noexcept;
-
-} // {FormatterInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_LOGGING
-#endif // ASMJIT_X86_X86FORMATTER_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86func.cpp b/3rdparty/asmjit/src/asmjit/x86/x86func.cpp
deleted file mode 100644
index db5b30f86eb..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86func.cpp
+++ /dev/null
@@ -1,504 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86)
-
-#include "../x86/x86func_p.h"
-#include "../x86/x86emithelper_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-namespace FuncInternal {
-
-static inline bool shouldThreatAsCDeclIn64BitMode(CallConvId ccId) noexcept {
- return ccId == CallConvId::kCDecl ||
- ccId == CallConvId::kStdCall ||
- ccId == CallConvId::kThisCall ||
- ccId == CallConvId::kFastCall ||
- ccId == CallConvId::kRegParm1 ||
- ccId == CallConvId::kRegParm2 ||
- ccId == CallConvId::kRegParm3;
-}
-
-ASMJIT_FAVOR_SIZE Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept {
- constexpr uint32_t kZax = Gp::kIdAx;
- constexpr uint32_t kZbx = Gp::kIdBx;
- constexpr uint32_t kZcx = Gp::kIdCx;
- constexpr uint32_t kZdx = Gp::kIdDx;
- constexpr uint32_t kZsp = Gp::kIdSp;
- constexpr uint32_t kZbp = Gp::kIdBp;
- constexpr uint32_t kZsi = Gp::kIdSi;
- constexpr uint32_t kZdi = Gp::kIdDi;
-
- bool winABI = environment.isPlatformWindows() || environment.isMSVC();
-
- cc.setArch(environment.arch());
- cc.setSaveRestoreRegSize(RegGroup::kVec, 16);
- cc.setSaveRestoreRegSize(RegGroup::kX86_MM, 8);
- cc.setSaveRestoreRegSize(RegGroup::kX86_K, 8);
- cc.setSaveRestoreAlignment(RegGroup::kVec, 16);
- cc.setSaveRestoreAlignment(RegGroup::kX86_MM, 8);
- cc.setSaveRestoreAlignment(RegGroup::kX86_K, 8);
-
- if (environment.is32Bit()) {
- bool isStandardCallConv = true;
-
- cc.setSaveRestoreRegSize(RegGroup::kGp, 4);
- cc.setSaveRestoreAlignment(RegGroup::kGp, 4);
-
- cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(Gp::kIdBx, Gp::kIdSp, Gp::kIdBp, Gp::kIdSi, Gp::kIdDi));
- cc.setNaturalStackAlignment(4);
-
- switch (ccId) {
- case CallConvId::kCDecl:
- break;
-
- case CallConvId::kStdCall:
- cc.setFlags(CallConvFlags::kCalleePopsStack);
- break;
-
- case CallConvId::kFastCall:
- cc.setFlags(CallConvFlags::kCalleePopsStack);
- cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx);
- break;
-
- case CallConvId::kVectorCall:
- cc.setFlags(CallConvFlags::kCalleePopsStack);
- cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5);
- break;
-
- case CallConvId::kThisCall:
- // NOTE: Even MINGW (starting with GCC 4.7.0) now uses __thiscall on MS Windows, so we won't bail to any
- // other calling convention if __thiscall was specified.
- if (winABI) {
- cc.setFlags(CallConvFlags::kCalleePopsStack);
- cc.setPassedOrder(RegGroup::kGp, kZcx);
- }
- else {
- ccId = CallConvId::kCDecl;
- }
- break;
-
- case CallConvId::kRegParm1:
- cc.setPassedOrder(RegGroup::kGp, kZax);
- break;
-
- case CallConvId::kRegParm2:
- cc.setPassedOrder(RegGroup::kGp, kZax, kZdx);
- break;
-
- case CallConvId::kRegParm3:
- cc.setPassedOrder(RegGroup::kGp, kZax, kZdx, kZcx);
- break;
-
- case CallConvId::kLightCall2:
- case CallConvId::kLightCall3:
- case CallConvId::kLightCall4: {
- uint32_t n = uint32_t(ccId) - uint32_t(CallConvId::kLightCall2) + 2;
-
- cc.setFlags(CallConvFlags::kPassFloatsByVec);
- cc.setPassedOrder(RegGroup::kGp, kZax, kZdx, kZcx, kZsi, kZdi);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(RegGroup::kX86_K, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(RegGroup::kX86_MM, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPreservedRegs(RegGroup::kGp, Support::lsbMask<uint32_t>(8));
- cc.setPreservedRegs(RegGroup::kVec, Support::lsbMask<uint32_t>(8) & ~Support::lsbMask<uint32_t>(n));
-
- cc.setNaturalStackAlignment(16);
- isStandardCallConv = false;
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidArgument);
- }
-
- if (isStandardCallConv) {
- // MMX arguments is something where compiler vendors disagree. For example GCC and MSVC would pass first three
- // via registers and the rest via stack, however Clang passes all via stack. Returning MMX registers is even
- // more fun, where GCC uses MM0, but Clang uses EAX:EDX pair. I'm not sure it's something we should be worried
- // about as MMX is deprecated anyway.
- cc.setPassedOrder(RegGroup::kX86_MM, 0, 1, 2);
-
- // Vector arguments (XMM|YMM|ZMM) are passed via registers. However, if the function is variadic then they have
- // to be passed via stack.
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2);
-
- // Functions with variable arguments always use stack for MM and vector arguments.
- cc.addFlags(CallConvFlags::kPassVecByStackIfVA);
- }
-
- if (ccId == CallConvId::kCDecl) {
- cc.addFlags(CallConvFlags::kVarArgCompatible);
- }
- }
- else {
- cc.setSaveRestoreRegSize(RegGroup::kGp, 8);
- cc.setSaveRestoreAlignment(RegGroup::kGp, 8);
-
- // Preprocess the calling convention into a common id as many conventions are normally ignored even by C/C++
- // compilers and treated as `__cdecl`.
- if (shouldThreatAsCDeclIn64BitMode(ccId))
- ccId = winABI ? CallConvId::kX64Windows : CallConvId::kX64SystemV;
-
- switch (ccId) {
- case CallConvId::kX64SystemV: {
- cc.setFlags(CallConvFlags::kPassFloatsByVec |
- CallConvFlags::kPassMmxByXmm |
- CallConvFlags::kVarArgCompatible);
- cc.setNaturalStackAlignment(16);
- cc.setRedZoneSize(128);
- cc.setPassedOrder(RegGroup::kGp, kZdi, kZsi, kZdx, kZcx, 8, 9);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(kZbx, kZsp, kZbp, 12, 13, 14, 15));
- break;
- }
-
- case CallConvId::kX64Windows: {
- cc.setStrategy(CallConvStrategy::kX64Windows);
- cc.setFlags(CallConvFlags::kPassFloatsByVec |
- CallConvFlags::kIndirectVecArgs |
- CallConvFlags::kPassMmxByGp |
- CallConvFlags::kVarArgCompatible);
- cc.setNaturalStackAlignment(16);
- // Maximum 4 arguments in registers, each adds 8 bytes to the spill zone.
- cc.setSpillZoneSize(4 * 8);
- cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx, 8, 9);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3);
- cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
- cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
- break;
- }
-
- case CallConvId::kVectorCall: {
- cc.setStrategy(CallConvStrategy::kX64VectorCall);
- cc.setFlags(CallConvFlags::kPassFloatsByVec |
- CallConvFlags::kPassMmxByGp );
- cc.setNaturalStackAlignment(16);
- // Maximum 6 arguments in registers, each adds 8 bytes to the spill zone.
- cc.setSpillZoneSize(6 * 8);
- cc.setPassedOrder(RegGroup::kGp, kZcx, kZdx, 8, 9);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5);
- cc.setPreservedRegs(RegGroup::kGp, Support::bitMask(kZbx, kZsp, kZbp, kZsi, kZdi, 12, 13, 14, 15));
- cc.setPreservedRegs(RegGroup::kVec, Support::bitMask(6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
- break;
- }
-
- case CallConvId::kLightCall2:
- case CallConvId::kLightCall3:
- case CallConvId::kLightCall4: {
- uint32_t n = uint32_t(ccId) - uint32_t(CallConvId::kLightCall2) + 2;
-
- cc.setFlags(CallConvFlags::kPassFloatsByVec);
- cc.setNaturalStackAlignment(16);
- cc.setPassedOrder(RegGroup::kGp, kZax, kZdx, kZcx, kZsi, kZdi);
- cc.setPassedOrder(RegGroup::kVec, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(RegGroup::kX86_K, 0, 1, 2, 3, 4, 5, 6, 7);
- cc.setPassedOrder(RegGroup::kX86_MM, 0, 1, 2, 3, 4, 5, 6, 7);
-
- cc.setPreservedRegs(RegGroup::kGp, Support::lsbMask<uint32_t>(16));
- cc.setPreservedRegs(RegGroup::kVec, ~Support::lsbMask<uint32_t>(n));
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidArgument);
- }
- }
-
- cc.setId(ccId);
- return kErrorOk;
-}
-
-ASMJIT_FAVOR_SIZE void unpackValues(FuncDetail& func, FuncValuePack& pack) noexcept {
- TypeId typeId = pack[0].typeId();
- switch (typeId) {
- case TypeId::kInt64:
- case TypeId::kUInt64: {
- if (Environment::is32Bit(func.callConv().arch())) {
- // Convert a 64-bit return value to two 32-bit return values.
- pack[0].initTypeId(TypeId::kUInt32);
- pack[1].initTypeId(TypeId(uint32_t(typeId) - 2));
- break;
- }
- break;
- }
-
- default: {
- break;
- }
- }
-}
-
-ASMJIT_FAVOR_SIZE Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept {
- const CallConv& cc = func.callConv();
- Arch arch = cc.arch();
- uint32_t stackOffset = cc._spillZoneSize;
- uint32_t argCount = func.argCount();
-
- // Up to two return values can be returned in GP registers.
- static const uint8_t gpReturnIndexes[4] = {
- uint8_t(Gp::kIdAx),
- uint8_t(Gp::kIdDx),
- uint8_t(BaseReg::kIdBad),
- uint8_t(BaseReg::kIdBad)
- };
-
- if (func.hasRet()) {
- unpackValues(func, func._rets);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- TypeId typeId = func._rets[valueIndex].typeId();
-
- // Terminate at the first void type (end of the pack).
- if (typeId == TypeId::kVoid)
- break;
-
- switch (typeId) {
- case TypeId::kInt64:
- case TypeId::kUInt64: {
- if (gpReturnIndexes[valueIndex] != BaseReg::kIdBad)
- func._rets[valueIndex].initReg(RegType::kX86_Gpq, gpReturnIndexes[valueIndex], typeId);
- else
- return DebugUtils::errored(kErrorInvalidState);
- break;
- }
-
- case TypeId::kInt8:
- case TypeId::kInt16:
- case TypeId::kInt32: {
- if (gpReturnIndexes[valueIndex] != BaseReg::kIdBad)
- func._rets[valueIndex].initReg(RegType::kX86_Gpd, gpReturnIndexes[valueIndex], TypeId::kInt32);
- else
- return DebugUtils::errored(kErrorInvalidState);
- break;
- }
-
- case TypeId::kUInt8:
- case TypeId::kUInt16:
- case TypeId::kUInt32: {
- if (gpReturnIndexes[valueIndex] != BaseReg::kIdBad)
- func._rets[valueIndex].initReg(RegType::kX86_Gpd, gpReturnIndexes[valueIndex], TypeId::kUInt32);
- else
- return DebugUtils::errored(kErrorInvalidState);
- break;
- }
-
- case TypeId::kFloat32:
- case TypeId::kFloat64: {
- RegType regType = Environment::is32Bit(arch) ? RegType::kX86_St : RegType::kX86_Xmm;
- func._rets[valueIndex].initReg(regType, valueIndex, typeId);
- break;
- }
-
- case TypeId::kFloat80: {
- // 80-bit floats are always returned by FP0.
- func._rets[valueIndex].initReg(RegType::kX86_St, valueIndex, typeId);
- break;
- }
-
- case TypeId::kMmx32:
- case TypeId::kMmx64: {
- // MM registers are returned through XMM (SystemV) or GPQ (Win64).
- RegType regType = RegType::kX86_Mm;
- uint32_t regIndex = valueIndex;
- if (Environment::is64Bit(arch)) {
- regType = cc.strategy() == CallConvStrategy::kDefault ? RegType::kX86_Xmm : RegType::kX86_Gpq;
- regIndex = cc.strategy() == CallConvStrategy::kDefault ? valueIndex : gpReturnIndexes[valueIndex];
-
- if (regIndex == BaseReg::kIdBad)
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- func._rets[valueIndex].initReg(regType, regIndex, typeId);
- break;
- }
-
- default: {
- func._rets[valueIndex].initReg(vecTypeIdToRegType(typeId), valueIndex, typeId);
- break;
- }
- }
- }
- }
-
- switch (cc.strategy()) {
- case CallConvStrategy::kDefault:
- default: {
- uint32_t gpzPos = 0;
- uint32_t vecPos = 0;
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- unpackValues(func, func._args[argIndex]);
-
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- FuncValue& arg = func._args[argIndex][valueIndex];
-
- // Terminate if there are no more arguments in the pack.
- if (!arg)
- break;
-
- TypeId typeId = arg.typeId();
-
- if (TypeUtils::isInt(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (gpzPos < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[RegGroup::kGp].id[gpzPos];
-
- if (regId != BaseReg::kIdBad) {
- RegType regType = typeId <= TypeId::kUInt32 ? RegType::kX86_Gpd : RegType::kX86_Gpq;
- arg.assignRegData(regType, regId);
- func.addUsedRegs(RegGroup::kGp, Support::bitMask(regId));
- gpzPos++;
- }
- else {
- uint32_t size = Support::max<uint32_t>(TypeUtils::sizeOf(typeId), registerSize);
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += size;
- }
- continue;
- }
-
- if (TypeUtils::isFloat(typeId) || TypeUtils::isVec(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (vecPos < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[RegGroup::kVec].id[vecPos];
-
- if (TypeUtils::isFloat(typeId)) {
- // If this is a float, but `kFlagPassFloatsByVec` is false, we have to use stack instead. This should
- // be only used by 32-bit calling conventions.
- if (!cc.hasFlag(CallConvFlags::kPassFloatsByVec))
- regId = BaseReg::kIdBad;
- }
- else {
- // Pass vector registers via stack if this is a variable arguments function. This should be only used
- // by 32-bit calling conventions.
- if (signature.hasVarArgs() && cc.hasFlag(CallConvFlags::kPassVecByStackIfVA))
- regId = BaseReg::kIdBad;
- }
-
- if (regId != BaseReg::kIdBad) {
- arg.initTypeId(typeId);
- arg.assignRegData(vecTypeIdToRegType(typeId), regId);
- func.addUsedRegs(RegGroup::kVec, Support::bitMask(regId));
- vecPos++;
- }
- else {
- uint32_t size = TypeUtils::sizeOf(typeId);
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += size;
- }
- continue;
- }
- }
- }
- break;
- }
-
- case CallConvStrategy::kX64Windows:
- case CallConvStrategy::kX64VectorCall: {
- // Both X64 and VectorCall behave similarly - arguments are indexed from left to right. The position of the
- // argument determines in which register the argument is allocated, so it's either GP or one of XMM/YMM/ZMM
- // registers.
- //
- // [ X64 ] [VecCall]
- // Index: #0 #1 #2 #3 #4 #5
- //
- // GP : RCX RDX R8 R9
- // VEC : XMM0 XMM1 XMM2 XMM3 XMM4 XMM5
- //
- // For example function `f(int a, double b, int c, double d)` will be:
- //
- // (a) (b) (c) (d)
- // RCX XMM1 R8 XMM3
- //
- // Unused vector registers are used by HVA.
- bool isVectorCall = (cc.strategy() == CallConvStrategy::kX64VectorCall);
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- unpackValues(func, func._args[argIndex]);
-
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- FuncValue& arg = func._args[argIndex][valueIndex];
-
- // Terminate if there are no more arguments in the pack.
- if (!arg)
- break;
-
- TypeId typeId = arg.typeId();
- uint32_t size = TypeUtils::sizeOf(typeId);
-
- if (TypeUtils::isInt(typeId) || TypeUtils::isMmx(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (argIndex < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[RegGroup::kGp].id[argIndex];
-
- if (regId != BaseReg::kIdBad) {
- RegType regType = size <= 4 && !TypeUtils::isMmx(typeId) ? RegType::kX86_Gpd : RegType::kX86_Gpq;
- arg.assignRegData(regType, regId);
- func.addUsedRegs(RegGroup::kGp, Support::bitMask(regId));
- }
- else {
- arg.assignStackOffset(int32_t(stackOffset));
- stackOffset += 8;
- }
- continue;
- }
-
- if (TypeUtils::isFloat(typeId) || TypeUtils::isVec(typeId)) {
- uint32_t regId = BaseReg::kIdBad;
-
- if (argIndex < CallConv::kMaxRegArgsPerGroup)
- regId = cc._passedOrder[RegGroup::kVec].id[argIndex];
-
- if (regId != BaseReg::kIdBad) {
- // X64-ABI doesn't allow vector types (XMM|YMM|ZMM) to be passed via registers, however, VectorCall
- // was designed for that purpose.
- if (TypeUtils::isFloat(typeId) || isVectorCall) {
- RegType regType = vecTypeIdToRegType(typeId);
- arg.assignRegData(regType, regId);
- func.addUsedRegs(RegGroup::kVec, Support::bitMask(regId));
- continue;
- }
- }
-
- // Passed via stack if the argument is float/double or indirectly. The trap is - if the argument is
- // passed indirectly, the address can be passed via register, if the argument's index has GP one.
- if (TypeUtils::isFloat(typeId)) {
- arg.assignStackOffset(int32_t(stackOffset));
- }
- else {
- uint32_t gpRegId = cc._passedOrder[RegGroup::kGp].id[argIndex];
- if (gpRegId != BaseReg::kIdBad)
- arg.assignRegData(RegType::kX86_Gpq, gpRegId);
- else
- arg.assignStackOffset(int32_t(stackOffset));
- arg.addFlags(FuncValue::kFlagIsIndirect);
- }
-
- // Always 8 bytes (float/double/pointer).
- stackOffset += 8;
- continue;
- }
- }
- }
- break;
- }
- }
-
- func._argStackSize = stackOffset;
- return kErrorOk;
-}
-
-} // {FuncInternal}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86func_p.h b/3rdparty/asmjit/src/asmjit/x86/x86func_p.h
deleted file mode 100644
index 0fe1da14d98..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86func_p.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86FUNC_P_H_INCLUDED
-#define ASMJIT_X86_X86FUNC_P_H_INCLUDED
-
-#include "../core/func.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-//! X86-specific function API (calling conventions and other utilities).
-namespace FuncInternal {
-
-//! Initialize `CallConv` structure (X86 specific).
-Error initCallConv(CallConv& cc, CallConvId ccId, const Environment& environment) noexcept;
-
-//! Initialize `FuncDetail` (X86 specific).
-Error initFuncDetail(FuncDetail& func, const FuncSignature& signature, uint32_t registerSize) noexcept;
-
-} // {FuncInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86FUNC_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp b/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp
deleted file mode 100644
index 27671b3adc5..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86instapi.cpp
+++ /dev/null
@@ -1,1830 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86)
-
-#include "../core/cpuinfo.h"
-#include "../core/instdb_p.h"
-#include "../core/misc_p.h"
-#include "../x86/x86instapi_p.h"
-#include "../x86/x86instdb_p.h"
-#include "../x86/x86opcode_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-namespace InstInternal {
-
-// x86::InstInternal - Text
-// ========================
-
-#ifndef ASMJIT_NO_TEXT
-Error instIdToString(InstId instId, String& output) noexcept {
- if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
- return DebugUtils::errored(kErrorInvalidInstruction);
-
- return InstNameUtils::decode(output, InstDB::_instNameIndexTable[instId], InstDB::_instNameStringTable);
-}
-
-InstId stringToInstId(const char* s, size_t len) noexcept {
- return InstNameUtils::find(s, len, InstDB::instNameIndex, InstDB::_instNameIndexTable, InstDB::_instNameStringTable);
-}
-#endif // !ASMJIT_NO_TEXT
-
-// x86::InstInternal - Validate
-// ============================
-
-#ifndef ASMJIT_NO_VALIDATION
-struct X86ValidationData {
- //! Allowed registers by \ref RegType.
- RegMask allowedRegMask[uint32_t(RegType::kMaxValue) + 1];
- uint32_t allowedMemBaseRegs;
- uint32_t allowedMemIndexRegs;
-};
-
-#define VALUE(x) \
- (x == uint32_t(RegType::kX86_GpbLo)) ? InstDB::OpFlags::kRegGpbLo : \
- (x == uint32_t(RegType::kX86_GpbHi)) ? InstDB::OpFlags::kRegGpbHi : \
- (x == uint32_t(RegType::kX86_Gpw )) ? InstDB::OpFlags::kRegGpw : \
- (x == uint32_t(RegType::kX86_Gpd )) ? InstDB::OpFlags::kRegGpd : \
- (x == uint32_t(RegType::kX86_Gpq )) ? InstDB::OpFlags::kRegGpq : \
- (x == uint32_t(RegType::kX86_Xmm )) ? InstDB::OpFlags::kRegXmm : \
- (x == uint32_t(RegType::kX86_Ymm )) ? InstDB::OpFlags::kRegYmm : \
- (x == uint32_t(RegType::kX86_Zmm )) ? InstDB::OpFlags::kRegZmm : \
- (x == uint32_t(RegType::kX86_Mm )) ? InstDB::OpFlags::kRegMm : \
- (x == uint32_t(RegType::kX86_KReg )) ? InstDB::OpFlags::kRegKReg : \
- (x == uint32_t(RegType::kX86_SReg )) ? InstDB::OpFlags::kRegSReg : \
- (x == uint32_t(RegType::kX86_CReg )) ? InstDB::OpFlags::kRegCReg : \
- (x == uint32_t(RegType::kX86_DReg )) ? InstDB::OpFlags::kRegDReg : \
- (x == uint32_t(RegType::kX86_St )) ? InstDB::OpFlags::kRegSt : \
- (x == uint32_t(RegType::kX86_Bnd )) ? InstDB::OpFlags::kRegBnd : \
- (x == uint32_t(RegType::kX86_Tmm )) ? InstDB::OpFlags::kRegTmm : \
- (x == uint32_t(RegType::kX86_Rip )) ? InstDB::OpFlags::kNone : InstDB::OpFlags::kNone
-static const InstDB::OpFlags _x86OpFlagFromRegType[uint32_t(RegType::kMaxValue) + 1] = { ASMJIT_LOOKUP_TABLE_32(VALUE, 0) };
-#undef VALUE
-
-#define REG_MASK_FROM_REG_TYPE_X86(x) \
- (x == uint32_t(RegType::kX86_GpbLo)) ? 0x0000000Fu : \
- (x == uint32_t(RegType::kX86_GpbHi)) ? 0x0000000Fu : \
- (x == uint32_t(RegType::kX86_Gpw )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Gpd )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Gpq )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Xmm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Ymm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Zmm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Mm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_KReg )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_SReg )) ? 0x0000007Eu : \
- (x == uint32_t(RegType::kX86_CReg )) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_DReg )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_St )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Bnd )) ? 0x0000000Fu : \
- (x == uint32_t(RegType::kX86_Tmm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Rip )) ? 0x00000001u : 0u
-
-#define REG_MASK_FROM_REG_TYPE_X64(x) \
- (x == uint32_t(RegType::kX86_GpbLo)) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_GpbHi)) ? 0x0000000Fu : \
- (x == uint32_t(RegType::kX86_Gpw )) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_Gpd )) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_Gpq )) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_Xmm )) ? 0xFFFFFFFFu : \
- (x == uint32_t(RegType::kX86_Ymm )) ? 0xFFFFFFFFu : \
- (x == uint32_t(RegType::kX86_Zmm )) ? 0xFFFFFFFFu : \
- (x == uint32_t(RegType::kX86_Mm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_KReg )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_SReg )) ? 0x0000007Eu : \
- (x == uint32_t(RegType::kX86_CReg )) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_DReg )) ? 0x0000FFFFu : \
- (x == uint32_t(RegType::kX86_St )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Bnd )) ? 0x0000000Fu : \
- (x == uint32_t(RegType::kX86_Tmm )) ? 0x000000FFu : \
- (x == uint32_t(RegType::kX86_Rip )) ? 0x00000001u : 0u
-
-#define B(RegType) (uint32_t(1) << uint32_t(RegType))
-
-static const X86ValidationData _x86ValidationData = {
- { ASMJIT_LOOKUP_TABLE_32(REG_MASK_FROM_REG_TYPE_X86, 0) },
- B(RegType::kX86_Gpw) | B(RegType::kX86_Gpd) | B(RegType::kX86_Rip) | B(RegType::kLabelTag),
- B(RegType::kX86_Gpw) | B(RegType::kX86_Gpd) | B(RegType::kX86_Xmm) | B(RegType::kX86_Ymm) | B(RegType::kX86_Zmm)
-};
-
-static const X86ValidationData _x64ValidationData = {
- { ASMJIT_LOOKUP_TABLE_32(REG_MASK_FROM_REG_TYPE_X64, 0) },
- B(RegType::kX86_Gpd) | B(RegType::kX86_Gpq) | B(RegType::kX86_Rip) | B(RegType::kLabelTag),
- B(RegType::kX86_Gpd) | B(RegType::kX86_Gpq) | B(RegType::kX86_Xmm) | B(RegType::kX86_Ymm) | B(RegType::kX86_Zmm)
-};
-
-#undef B
-
-#undef REG_MASK_FROM_REG_TYPE_X64
-#undef REG_MASK_FROM_REG_TYPE_X86
-
-static ASMJIT_FORCE_INLINE bool x86IsZmmOrM512(const Operand_& op) noexcept {
- return Reg::isZmm(op) || (op.isMem() && op.x86RmSize() == 64);
-}
-
-static ASMJIT_FORCE_INLINE bool x86CheckOSig(const InstDB::OpSignature& op, const InstDB::OpSignature& ref, bool& immOutOfRange) noexcept {
- // Fail if operand types are incompatible.
- InstDB::OpFlags commonFlags = op.flags() & ref.flags();
-
- if (!Support::test(commonFlags, InstDB::OpFlags::kOpMask)) {
- // Mark temporarily `immOutOfRange` so we can return a more descriptive error later.
- if (op.hasImm() && ref.hasImm()) {
- immOutOfRange = true;
- return true;
- }
-
- return false;
- }
-
- // Fail if some memory specific flags do not match.
- if (Support::test(commonFlags, InstDB::OpFlags::kMemMask)) {
- if (ref.hasFlag(InstDB::OpFlags::kFlagMemBase) && !op.hasFlag(InstDB::OpFlags::kFlagMemBase))
- return false;
- }
-
- // Fail if register indexes do not match.
- if (Support::test(commonFlags, InstDB::OpFlags::kRegMask)) {
- if (ref.regMask() && !Support::test(op.regMask(), ref.regMask()))
- return false;
- }
-
- return true;
-}
-
-static ASMJIT_FAVOR_SIZE Error validate(InstDB::Mode mode, const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
- uint32_t i;
-
- // Get the instruction data.
- const X86ValidationData* vd = (mode == InstDB::Mode::kX86) ? &_x86ValidationData : &_x64ValidationData;
- InstId instId = inst.id();
- InstOptions options = inst.options();
-
- if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
- return DebugUtils::errored(kErrorInvalidInstruction);
-
- const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
- const InstDB::CommonInfo& commonInfo = instInfo.commonInfo();
-
- InstDB::InstFlags iFlags = instInfo.flags();
-
- constexpr InstOptions kRepAny = InstOptions::kX86_Rep | InstOptions::kX86_Repne;
- constexpr InstOptions kXAcqXRel = InstOptions::kX86_XAcquire | InstOptions::kX86_XRelease;
- constexpr InstOptions kAvx512Options = InstOptions::kX86_ZMask | InstOptions::kX86_ER | InstOptions::kX86_SAE;
-
- // Validate LOCK|XACQUIRE|XRELEASE Prefixes
- // ----------------------------------------
-
- if (Support::test(options, InstOptions::kX86_Lock | kXAcqXRel)) {
- if (Support::test(options, InstOptions::kX86_Lock)) {
- if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kLock) && !Support::test(options, kXAcqXRel)))
- return DebugUtils::errored(kErrorInvalidLockPrefix);
-
- if (ASMJIT_UNLIKELY(opCount < 1 || !operands[0].isMem()))
- return DebugUtils::errored(kErrorInvalidLockPrefix);
- }
-
- if (Support::test(options, kXAcqXRel)) {
- if (ASMJIT_UNLIKELY(!Support::test(options, InstOptions::kX86_Lock) || (options & kXAcqXRel) == kXAcqXRel))
- return DebugUtils::errored(kErrorInvalidPrefixCombination);
-
- if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XAcquire) && !Support::test(iFlags, InstDB::InstFlags::kXAcquire)))
- return DebugUtils::errored(kErrorInvalidXAcquirePrefix);
-
- if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_XRelease) && !Support::test(iFlags, InstDB::InstFlags::kXRelease)))
- return DebugUtils::errored(kErrorInvalidXReleasePrefix);
- }
- }
-
- // Validate REP and REPNE Prefixes
- // -------------------------------
-
- if (Support::test(options, kRepAny)) {
- if (ASMJIT_UNLIKELY((options & kRepAny) == kRepAny))
- return DebugUtils::errored(kErrorInvalidPrefixCombination);
-
- if (ASMJIT_UNLIKELY(!Support::test(iFlags, InstDB::InstFlags::kRep)))
- return DebugUtils::errored(kErrorInvalidRepPrefix);
- }
-
- // Translate Each Operand to the Corresponding OpSignature
- // -------------------------------------------------------
-
- InstDB::OpSignature oSigTranslated[Globals::kMaxOpCount];
- InstDB::OpFlags combinedOpFlags = InstDB::OpFlags::kNone;
- uint32_t combinedRegMask = 0;
- const Mem* memOp = nullptr;
-
- for (i = 0; i < opCount; i++) {
- const Operand_& op = operands[i];
- if (op.opType() == OperandType::kNone)
- break;
-
- InstDB::OpFlags opFlags = InstDB::OpFlags::kNone;
- RegMask regMask = 0;
-
- switch (op.opType()) {
- case OperandType::kReg: {
- RegType regType = op.as<BaseReg>().type();
- opFlags = _x86OpFlagFromRegType[size_t(regType)];
-
- if (ASMJIT_UNLIKELY(opFlags == InstDB::OpFlags::kNone))
- return DebugUtils::errored(kErrorInvalidRegType);
-
- // If `regId` is equal or greater than Operand::kVirtIdMin it means that the register is virtual and its
- // index will be assigned later by the register allocator. We must pass unless asked to disallow virtual
- // registers.
- uint32_t regId = op.id();
- if (regId < Operand::kVirtIdMin) {
- if (ASMJIT_UNLIKELY(regId >= 32))
- return DebugUtils::errored(kErrorInvalidPhysId);
-
- if (ASMJIT_UNLIKELY(Support::bitTest(vd->allowedRegMask[size_t(regType)], regId) == 0))
- return DebugUtils::errored(kErrorInvalidPhysId);
-
- regMask = Support::bitMask(regId);
- combinedRegMask |= regMask;
- }
- else {
- if (uint32_t(validationFlags & ValidationFlags::kEnableVirtRegs) == 0)
- return DebugUtils::errored(kErrorIllegalVirtReg);
- regMask = 0xFFFFFFFFu;
- }
- break;
- }
-
- // TODO: Validate base and index and combine these with `combinedRegMask`.
- case OperandType::kMem: {
- const Mem& m = op.as<Mem>();
- memOp = &m;
-
- uint32_t memSize = m.size();
- RegType baseType = m.baseType();
- RegType indexType = m.indexType();
-
- if (m.segmentId() > 6)
- return DebugUtils::errored(kErrorInvalidSegment);
-
- // Validate AVX-512 broadcast {1tox}.
- if (m.hasBroadcast()) {
- if (memSize != 0) {
- // If the size is specified it has to match the broadcast size.
- if (ASMJIT_UNLIKELY(commonInfo.hasAvx512B32() && memSize != 4))
- return DebugUtils::errored(kErrorInvalidBroadcast);
-
- if (ASMJIT_UNLIKELY(commonInfo.hasAvx512B64() && memSize != 8))
- return DebugUtils::errored(kErrorInvalidBroadcast);
- }
- else {
- // If there is no size we implicitly calculate it so we can validate N in {1toN} properly.
- memSize = commonInfo.hasAvx512B64() ? 8 :
- commonInfo.hasAvx512B32() ? 4 : 2;
- }
-
- memSize <<= uint32_t(m.getBroadcast());
- }
-
- if (baseType != RegType::kNone && baseType > RegType::kLabelTag) {
- uint32_t baseId = m.baseId();
-
- if (m.isRegHome()) {
- // Home address of a virtual register. In such case we don't want to validate the type of the
- // base register as it will always be patched to ESP|RSP.
- }
- else {
- if (ASMJIT_UNLIKELY(!Support::bitTest(vd->allowedMemBaseRegs, baseType)))
- return DebugUtils::errored(kErrorInvalidAddress);
- }
-
- // Create information that will be validated only if this is an implicit memory operand. Basically
- // only usable for string instructions and other instructions where memory operand is implicit and
- // has 'seg:[reg]' form.
- if (baseId < Operand::kVirtIdMin) {
- if (ASMJIT_UNLIKELY(baseId >= 32))
- return DebugUtils::errored(kErrorInvalidPhysId);
-
- // Physical base id.
- regMask = Support::bitMask(baseId);
- combinedRegMask |= regMask;
- }
- else {
- // Virtual base id - fill the whole mask for implicit mem validation. The register is not assigned
- // yet, so we cannot predict the phys id.
- if (uint32_t(validationFlags & ValidationFlags::kEnableVirtRegs) == 0)
- return DebugUtils::errored(kErrorIllegalVirtReg);
- regMask = 0xFFFFFFFFu;
- }
-
- if (indexType == RegType::kNone && !m.offsetLo32())
- opFlags |= InstDB::OpFlags::kFlagMemBase;
- }
- else if (baseType == RegType::kLabelTag) {
- // [Label] - there is no need to validate the base as it's label.
- }
- else {
- // Base is a 64-bit address.
- int64_t offset = m.offset();
- if (!Support::isInt32(offset)) {
- if (mode == InstDB::Mode::kX86) {
- // 32-bit mode: Make sure that the address is either `int32_t` or `uint32_t`.
- if (!Support::isUInt32(offset))
- return DebugUtils::errored(kErrorInvalidAddress64Bit);
- }
- else {
- // 64-bit mode: Zero extension is allowed if the address has 32-bit index register or the address
- // has no index register (it's still encodable).
- if (indexType != RegType::kNone) {
- if (!Support::isUInt32(offset))
- return DebugUtils::errored(kErrorInvalidAddress64Bit);
-
- if (indexType != RegType::kX86_Gpd)
- return DebugUtils::errored(kErrorInvalidAddress64BitZeroExtension);
- }
- else {
- // We don't validate absolute 64-bit addresses without an index register as this also depends
- // on the target's base address. We don't have the information to do it at this moment.
- }
- }
- }
- }
-
- if (indexType != RegType::kNone) {
- if (ASMJIT_UNLIKELY(!Support::bitTest(vd->allowedMemIndexRegs, indexType)))
- return DebugUtils::errored(kErrorInvalidAddress);
-
- if (indexType == RegType::kX86_Xmm) {
- opFlags |= InstDB::OpFlags::kVm32x | InstDB::OpFlags::kVm64x;
- }
- else if (indexType == RegType::kX86_Ymm) {
- opFlags |= InstDB::OpFlags::kVm32y | InstDB::OpFlags::kVm64y;
- }
- else if (indexType == RegType::kX86_Zmm) {
- opFlags |= InstDB::OpFlags::kVm32z | InstDB::OpFlags::kVm64z;
- }
- else {
- if (baseType != RegType::kNone)
- opFlags |= InstDB::OpFlags::kFlagMib;
- }
-
- // [RIP + {XMM|YMM|ZMM}] is not allowed.
- if (baseType == RegType::kX86_Rip && Support::test(opFlags, InstDB::OpFlags::kVmMask))
- return DebugUtils::errored(kErrorInvalidAddress);
-
- uint32_t indexId = m.indexId();
- if (indexId < Operand::kVirtIdMin) {
- if (ASMJIT_UNLIKELY(indexId >= 32))
- return DebugUtils::errored(kErrorInvalidPhysId);
-
- combinedRegMask |= Support::bitMask(indexId);
- }
- else {
- if (uint32_t(validationFlags & ValidationFlags::kEnableVirtRegs) == 0)
- return DebugUtils::errored(kErrorIllegalVirtReg);
- }
-
- // Only used for implicit memory operands having 'seg:[reg]' form, so clear it.
- regMask = 0;
- }
-
- switch (memSize) {
- case 0: opFlags |= InstDB::OpFlags::kMemUnspecified; break;
- case 1: opFlags |= InstDB::OpFlags::kMem8; break;
- case 2: opFlags |= InstDB::OpFlags::kMem16; break;
- case 4: opFlags |= InstDB::OpFlags::kMem32; break;
- case 6: opFlags |= InstDB::OpFlags::kMem48; break;
- case 8: opFlags |= InstDB::OpFlags::kMem64; break;
- case 10: opFlags |= InstDB::OpFlags::kMem80; break;
- case 16: opFlags |= InstDB::OpFlags::kMem128; break;
- case 32: opFlags |= InstDB::OpFlags::kMem256; break;
- case 64: opFlags |= InstDB::OpFlags::kMem512; break;
-
- default:
- return DebugUtils::errored(kErrorInvalidOperandSize);
- }
-
- break;
- }
-
- case OperandType::kImm: {
- uint64_t immValue = op.as<Imm>().valueAs<uint64_t>();
-
- if (int64_t(immValue) >= 0) {
- if (immValue <= 0x7u)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
- InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 |
- InstDB::OpFlags::kImmI4 | InstDB::OpFlags::kImmU4 ;
- else if (immValue <= 0xFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
- InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 |
- InstDB::OpFlags::kImmU4 ;
- else if (immValue <= 0x7Fu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
- InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmU8 ;
- else if (immValue <= 0xFFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
- InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 | InstDB::OpFlags::kImmU8 ;
- else if (immValue <= 0x7FFFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
- InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmU16 ;
- else if (immValue <= 0xFFFFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32 |
- InstDB::OpFlags::kImmU16 ;
- else if (immValue <= 0x7FFFFFFFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmU32;
- else if (immValue <= 0xFFFFFFFFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64 | InstDB::OpFlags::kImmU32;
- else if (immValue <= 0x7FFFFFFFFFFFFFFFu)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmU64;
- else
- opFlags = InstDB::OpFlags::kImmU64;
- }
- else {
- immValue = Support::neg(immValue);
- if (immValue <= 0x8u)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmI8 | InstDB::OpFlags::kImmI4;
- else if (immValue <= 0x80u)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16 | InstDB::OpFlags::kImmI8;
- else if (immValue <= 0x8000u)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32 | InstDB::OpFlags::kImmI16;
- else if (immValue <= 0x80000000u)
- opFlags = InstDB::OpFlags::kImmI64 | InstDB::OpFlags::kImmI32;
- else
- opFlags = InstDB::OpFlags::kImmI64;
- }
- break;
- }
-
- case OperandType::kLabel: {
- opFlags |= InstDB::OpFlags::kRel8 | InstDB::OpFlags::kRel32;
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
-
- InstDB::OpSignature& oSigDst = oSigTranslated[i];
- oSigDst._flags = uint64_t(opFlags) & 0x00FFFFFFFFFFFFFFu;
- oSigDst._regMask = uint8_t(regMask & 0xFFu);
- combinedOpFlags |= opFlags;
- }
-
- // Decrease the number of operands of those that are none. This is important as Assembler and Compiler may just pass
- // more operands padded with none (which means that no operand is given at that index). However, validate that there
- // are no gaps (like [reg, none, reg] or [none, reg]).
- if (i < opCount) {
- while (--opCount > i)
- if (ASMJIT_UNLIKELY(!operands[opCount].isNone()))
- return DebugUtils::errored(kErrorInvalidInstruction);
- }
-
- // Validate X86 and X64 specific cases.
- if (mode == InstDB::Mode::kX86) {
- // Illegal use of 64-bit register in 32-bit mode.
- if (ASMJIT_UNLIKELY(Support::test(combinedOpFlags, InstDB::OpFlags::kRegGpq)))
- return DebugUtils::errored(kErrorInvalidUseOfGpq);
- }
- else {
- // Illegal use of a high 8-bit register with REX prefix.
- bool hasREX = inst.hasOption(InstOptions::kX86_Rex) || (combinedRegMask & 0xFFFFFF00u) != 0;
- if (ASMJIT_UNLIKELY(hasREX && Support::test(combinedOpFlags, InstDB::OpFlags::kRegGpbHi)))
- return DebugUtils::errored(kErrorInvalidUseOfGpbHi);
- }
-
- // Validate Instruction Signature by Comparing Against All `iSig` Rows
- // -------------------------------------------------------------------
-
- const InstDB::InstSignature* iSig = InstDB::_instSignatureTable + commonInfo._iSignatureIndex;
- const InstDB::InstSignature* iEnd = iSig + commonInfo._iSignatureCount;
-
- if (iSig != iEnd) {
- const InstDB::OpSignature* opSignatureTable = InstDB::_opSignatureTable;
-
- // If set it means that we matched a signature where only immediate value
- // was out of bounds. We can return a more descriptive error if we know this.
- bool globalImmOutOfRange = false;
-
- do {
- // Check if the architecture is compatible.
- if (!iSig->supportsMode(mode))
- continue;
-
- // Compare the operands table with reference operands.
- uint32_t j = 0;
- uint32_t iSigCount = iSig->opCount();
- bool localImmOutOfRange = false;
-
- if (iSigCount == opCount) {
- for (j = 0; j < opCount; j++)
- if (!x86CheckOSig(oSigTranslated[j], iSig->opSignature(j), localImmOutOfRange))
- break;
- }
- else if (iSigCount - iSig->implicitOpCount() == opCount) {
- uint32_t r = 0;
- for (j = 0; j < opCount && r < iSigCount; j++, r++) {
- const InstDB::OpSignature* oChk = oSigTranslated + j;
- const InstDB::OpSignature* oRef;
-Next:
- oRef = opSignatureTable + iSig->opSignatureIndex(r);
- // Skip implicit operands.
- if (oRef->isImplicit()) {
- if (++r >= iSigCount)
- break;
- else
- goto Next;
- }
-
- if (!x86CheckOSig(*oChk, *oRef, localImmOutOfRange))
- break;
- }
- }
-
- if (j == opCount) {
- if (!localImmOutOfRange) {
- // Match, must clear possible `globalImmOutOfRange`.
- globalImmOutOfRange = false;
- break;
- }
- globalImmOutOfRange = localImmOutOfRange;
- }
- } while (++iSig != iEnd);
-
- if (iSig == iEnd) {
- if (globalImmOutOfRange)
- return DebugUtils::errored(kErrorInvalidImmediate);
- else
- return DebugUtils::errored(kErrorInvalidInstruction);
- }
- }
-
- // Validate AVX512 Options
- // -----------------------
-
- const RegOnly& extraReg = inst.extraReg();
-
- if (Support::test(options, kAvx512Options)) {
- if (commonInfo.hasFlag(InstDB::InstFlags::kEvex)) {
- // Validate AVX-512 {z}.
- if (Support::test(options, InstOptions::kX86_ZMask)) {
- if (ASMJIT_UNLIKELY(Support::test(options, InstOptions::kX86_ZMask) && !commonInfo.hasAvx512Z()))
- return DebugUtils::errored(kErrorInvalidKZeroUse);
- }
-
- // Validate AVX-512 {sae} and {er}.
- if (Support::test(options, InstOptions::kX86_SAE | InstOptions::kX86_ER)) {
- // Rounding control is impossible if the instruction is not reg-to-reg.
- if (ASMJIT_UNLIKELY(memOp))
- return DebugUtils::errored(kErrorInvalidEROrSAE);
-
- // Check if {sae} or {er} is supported by the instruction.
- if (Support::test(options, InstOptions::kX86_ER)) {
- // NOTE: if both {sae} and {er} are set, we don't care, as {sae} is implied.
- if (ASMJIT_UNLIKELY(!commonInfo.hasAvx512ER()))
- return DebugUtils::errored(kErrorInvalidEROrSAE);
- }
- else {
- if (ASMJIT_UNLIKELY(!commonInfo.hasAvx512SAE()))
- return DebugUtils::errored(kErrorInvalidEROrSAE);
- }
-
- // {sae} and {er} are defined for either scalar ops or vector ops that require LL to be 10 (512-bit vector
- // operations). We don't need any more bits in the instruction database to be able to validate this, as
- // each AVX512 instruction that has broadcast is vector instruction (in this case we require zmm registers),
- // otherwise it's a scalar instruction, which is valid.
- if (commonInfo.hasAvx512B()) {
- // Supports broadcast, thus we require LL to be '10', which means there have to be ZMM registers used. We
- // don't calculate LL here, but we know that it would be '10' if there is at least one ZMM register used.
-
- // There is no {er}/{sae}-enabled instruction with less than two operands.
- ASMJIT_ASSERT(opCount >= 2);
- if (ASMJIT_UNLIKELY(!x86IsZmmOrM512(operands[0]) && !x86IsZmmOrM512(operands[1])))
- return DebugUtils::errored(kErrorInvalidEROrSAE);
- }
- }
- }
- else {
- // Not an AVX512 instruction - maybe OpExtra is xCX register used by REP/REPNE prefix.
- if (Support::test(options, kAvx512Options) || !Support::test(options, kRepAny))
- return DebugUtils::errored(kErrorInvalidInstruction);
- }
- }
-
- // Validate {Extra} Register
- // -------------------------
-
- if (extraReg.isReg()) {
- if (Support::test(options, kRepAny)) {
- // Validate REP|REPNE {cx|ecx|rcx}.
- if (ASMJIT_UNLIKELY(Support::test(iFlags, InstDB::InstFlags::kRepIgnored)))
- return DebugUtils::errored(kErrorInvalidExtraReg);
-
- if (extraReg.isPhysReg()) {
- if (ASMJIT_UNLIKELY(extraReg.id() != Gp::kIdCx))
- return DebugUtils::errored(kErrorInvalidExtraReg);
- }
-
- // The type of the {...} register must match the type of the base register
- // of memory operand. So if the memory operand uses 32-bit register the
- // count register must also be 32-bit, etc...
- if (ASMJIT_UNLIKELY(!memOp || extraReg.type() != memOp->baseType()))
- return DebugUtils::errored(kErrorInvalidExtraReg);
- }
- else if (commonInfo.hasFlag(InstDB::InstFlags::kEvex)) {
- // Validate AVX-512 {k}.
- if (ASMJIT_UNLIKELY(extraReg.type() != RegType::kX86_KReg))
- return DebugUtils::errored(kErrorInvalidExtraReg);
-
- if (ASMJIT_UNLIKELY(extraReg.id() == 0 || !commonInfo.hasAvx512K()))
- return DebugUtils::errored(kErrorInvalidKMaskUse);
- }
- else {
- return DebugUtils::errored(kErrorInvalidExtraReg);
- }
- }
-
- return kErrorOk;
-}
-
-Error validateX86(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
- return validate(InstDB::Mode::kX86, inst, operands, opCount, validationFlags);
-}
-
-Error validateX64(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept {
- return validate(InstDB::Mode::kX64, inst, operands, opCount, validationFlags);
-}
-
-#endif // !ASMJIT_NO_VALIDATION
-
-// x86::InstInternal - QueryRWInfo
-// ===============================
-
-#ifndef ASMJIT_NO_INTROSPECTION
-static const Support::Array<uint64_t, uint32_t(RegGroup::kMaxValue) + 1> rwRegGroupByteMask = {{
- 0x00000000000000FFu, // GP.
- 0xFFFFFFFFFFFFFFFFu, // XMM|YMM|ZMM.
- 0x00000000000000FFu, // MM.
- 0x00000000000000FFu, // KReg.
- 0x0000000000000003u, // SReg.
- 0x00000000000000FFu, // CReg.
- 0x00000000000000FFu, // DReg.
- 0x00000000000003FFu, // St().
- 0x000000000000FFFFu, // BND.
- 0x00000000000000FFu // RIP.
-}};
-
-static ASMJIT_FORCE_INLINE void rwZeroExtendGp(OpRWInfo& opRwInfo, const Gp& reg, uint32_t nativeGpSize) noexcept {
- ASMJIT_ASSERT(BaseReg::isGp(reg.as<Operand>()));
- if (reg.size() + 4 == nativeGpSize) {
- opRwInfo.addOpFlags(OpRWFlags::kZExt);
- opRwInfo.setExtendByteMask(~opRwInfo.writeByteMask() & 0xFFu);
- }
-}
-
-static ASMJIT_FORCE_INLINE void rwZeroExtendAvxVec(OpRWInfo& opRwInfo, const Vec& reg) noexcept {
- DebugUtils::unused(reg);
-
- uint64_t msk = ~Support::fillTrailingBits(opRwInfo.writeByteMask());
- if (msk) {
- opRwInfo.addOpFlags(OpRWFlags::kZExt);
- opRwInfo.setExtendByteMask(msk);
- }
-}
-
-static ASMJIT_FORCE_INLINE void rwZeroExtendNonVec(OpRWInfo& opRwInfo, const Reg& reg) noexcept {
- uint64_t msk = ~Support::fillTrailingBits(opRwInfo.writeByteMask()) & rwRegGroupByteMask[reg.group()];
- if (msk) {
- opRwInfo.addOpFlags(OpRWFlags::kZExt);
- opRwInfo.setExtendByteMask(msk);
- }
-}
-
-static ASMJIT_FORCE_INLINE Error rwHandleAVX512(const BaseInst& inst, const InstDB::CommonInfo& commonInfo, InstRWInfo* out) noexcept {
- if (inst.hasExtraReg() && inst.extraReg().type() == RegType::kX86_KReg && out->opCount() > 0) {
- // AVX-512 instruction that uses a destination with {k} register (zeroing vs masking).
- out->_extraReg.addOpFlags(OpRWFlags::kRead);
- out->_extraReg.setReadByteMask(0xFF);
- if (!inst.hasOption(InstOptions::kX86_ZMask) && !commonInfo.hasAvx512Flag(InstDB::Avx512Flags::kImplicitZ)) {
- out->_operands[0].addOpFlags(OpRWFlags::kRead);
- out->_operands[0]._readByteMask |= out->_operands[0]._writeByteMask;
- }
- }
-
- return kErrorOk;
-}
-
-static ASMJIT_FORCE_INLINE bool hasSameRegType(const BaseReg* regs, size_t opCount) noexcept {
- ASMJIT_ASSERT(opCount > 0);
- RegType regType = regs[0].type();
- for (size_t i = 1; i < opCount; i++)
- if (regs[i].type() != regType)
- return false;
- return true;
-}
-
-Error queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept {
- // Only called when `arch` matches X86 family.
- ASMJIT_ASSERT(Environment::isFamilyX86(arch));
-
- // Get the instruction data.
- InstId instId = inst.id();
- if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
- return DebugUtils::errored(kErrorInvalidInstruction);
-
- // Read/Write flags.
- const InstDB::InstInfo& instInfo = InstDB::_instInfoTable[instId];
- const InstDB::CommonInfo& commonInfo = InstDB::_commonInfoTable[instInfo._commonInfoIndex];
- const InstDB::AdditionalInfo& additionalInfo = InstDB::_additionalInfoTable[instInfo._additionalInfoIndex];
- const InstDB::RWFlagsInfoTable& rwFlags = InstDB::_rwFlagsInfoTable[additionalInfo._rwFlagsIndex];
-
- // There are two data tables, one for `opCount == 2` and the second for
- // `opCount != 2`. There are two reasons for that:
- // - There are instructions that share the same name that have both 2 or 3 operands, which have different
- // RW information / semantics.
- // - There must be 2 tables otherwise the lookup index won't fit into 8 bits (there is more than 256 records
- // of combined rwInfo A and B).
- const InstDB::RWInfo& instRwInfo = opCount == 2 ? InstDB::rwInfoA[InstDB::rwInfoIndexA[instId]]
- : InstDB::rwInfoB[InstDB::rwInfoIndexB[instId]];
- const InstDB::RWInfoRm& instRmInfo = InstDB::rwInfoRm[instRwInfo.rmInfo];
-
- out->_instFlags = InstDB::_instFlagsTable[additionalInfo._instFlagsIndex];
- out->_opCount = uint8_t(opCount);
- out->_rmFeature = instRmInfo.rmFeature;
- out->_extraReg.reset();
- out->_readFlags = CpuRWFlags(rwFlags.readFlags);
- out->_writeFlags = CpuRWFlags(rwFlags.writeFlags);
-
- uint32_t opTypeMask = 0u;
- uint32_t nativeGpSize = Environment::registerSizeFromArch(arch);
-
- constexpr OpRWFlags R = OpRWFlags::kRead;
- constexpr OpRWFlags W = OpRWFlags::kWrite;
- constexpr OpRWFlags X = OpRWFlags::kRW;
- constexpr OpRWFlags RegM = OpRWFlags::kRegMem;
- constexpr OpRWFlags RegPhys = OpRWFlags::kRegPhysId;
- constexpr OpRWFlags MibRead = OpRWFlags::kMemBaseRead | OpRWFlags::kMemIndexRead;
-
- if (instRwInfo.category <= uint32_t(InstDB::RWInfo::kCategoryGenericEx)) {
- uint32_t i;
- uint32_t rmOpsMask = 0;
- uint32_t rmMaxSize = 0;
-
- for (i = 0; i < opCount; i++) {
- OpRWInfo& op = out->_operands[i];
- const Operand_& srcOp = operands[i];
- const InstDB::RWInfoOp& rwOpData = InstDB::rwInfoOp[instRwInfo.opInfoIndex[i]];
-
- opTypeMask |= Support::bitMask(srcOp.opType());
-
- if (!srcOp.isRegOrMem()) {
- op.reset();
- continue;
- }
-
- op._opFlags = rwOpData.flags & ~OpRWFlags::kZExt;
- op._physId = rwOpData.physId;
- op._rmSize = 0;
- op._resetReserved();
-
- uint64_t rByteMask = rwOpData.rByteMask;
- uint64_t wByteMask = rwOpData.wByteMask;
-
- if (op.isRead() && !rByteMask) rByteMask = Support::lsbMask<uint64_t>(srcOp.x86RmSize());
- if (op.isWrite() && !wByteMask) wByteMask = Support::lsbMask<uint64_t>(srcOp.x86RmSize());
-
- op._readByteMask = rByteMask;
- op._writeByteMask = wByteMask;
- op._extendByteMask = 0;
- op._consecutiveLeadCount = rwOpData.consecutiveLeadCount;
-
- if (srcOp.isReg()) {
- // Zero extension.
- if (op.isWrite()) {
- if (srcOp.as<Reg>().isGp()) {
- // GP registers on X64 are special:
- // - 8-bit and 16-bit writes aren't zero extended.
- // - 32-bit writes ARE zero extended.
- rwZeroExtendGp(op, srcOp.as<Gp>(), nativeGpSize);
- }
- else if (Support::test(rwOpData.flags, OpRWFlags::kZExt)) {
- // Otherwise follow ZExt.
- rwZeroExtendNonVec(op, srcOp.as<Gp>());
- }
- }
-
- // Aggregate values required to calculate valid Reg/M info.
- rmMaxSize = Support::max(rmMaxSize, srcOp.x86RmSize());
- rmOpsMask |= Support::bitMask<uint32_t>(i);
- }
- else {
- const x86::Mem& memOp = srcOp.as<x86::Mem>();
- // The RW flags of BASE+INDEX are either provided by the data, which means
- // that the instruction is border-case, or they are deduced from the operand.
- if (memOp.hasBaseReg() && !op.hasOpFlag(OpRWFlags::kMemBaseRW))
- op.addOpFlags(OpRWFlags::kMemBaseRead);
- if (memOp.hasIndexReg() && !op.hasOpFlag(OpRWFlags::kMemIndexRW))
- op.addOpFlags(OpRWFlags::kMemIndexRead);
- }
- }
-
- // Only keep kMovOp if the instruction is actually register to register move of the same kind.
- if (out->hasInstFlag(InstRWFlags::kMovOp)) {
- if (!(opCount >= 2 && opTypeMask == Support::bitMask(OperandType::kReg) && hasSameRegType(reinterpret_cast<const BaseReg*>(operands), opCount)))
- out->_instFlags &= ~InstRWFlags::kMovOp;
- }
-
- // Special cases require more logic.
- if (instRmInfo.flags & (InstDB::RWInfoRm::kFlagMovssMovsd | InstDB::RWInfoRm::kFlagPextrw | InstDB::RWInfoRm::kFlagFeatureIfRMI)) {
- if (instRmInfo.flags & InstDB::RWInfoRm::kFlagMovssMovsd) {
- if (opCount == 2) {
- if (operands[0].isReg() && operands[1].isReg()) {
- // Doesn't zero extend the destination.
- out->_operands[0]._extendByteMask = 0;
- }
- }
- }
- else if (instRmInfo.flags & InstDB::RWInfoRm::kFlagPextrw) {
- if (opCount == 3 && Reg::isMm(operands[1])) {
- out->_rmFeature = 0;
- rmOpsMask = 0;
- }
- }
- else if (instRmInfo.flags & InstDB::RWInfoRm::kFlagFeatureIfRMI) {
- if (opCount != 3 || !operands[2].isImm()) {
- out->_rmFeature = 0;
- }
- }
- }
-
- rmOpsMask &= uint32_t(instRmInfo.rmOpsMask);
- if (rmOpsMask && !inst.hasOption(InstOptions::kX86_ER)) {
- Support::BitWordIterator<uint32_t> it(rmOpsMask);
- do {
- i = it.next();
-
- OpRWInfo& op = out->_operands[i];
- op.addOpFlags(RegM);
-
- switch (instRmInfo.category) {
- case InstDB::RWInfoRm::kCategoryFixed:
- op.setRmSize(instRmInfo.fixedSize);
- break;
- case InstDB::RWInfoRm::kCategoryConsistent:
- op.setRmSize(operands[i].x86RmSize());
- break;
- case InstDB::RWInfoRm::kCategoryHalf:
- op.setRmSize(rmMaxSize / 2u);
- break;
- case InstDB::RWInfoRm::kCategoryQuarter:
- op.setRmSize(rmMaxSize / 4u);
- break;
- case InstDB::RWInfoRm::kCategoryEighth:
- op.setRmSize(rmMaxSize / 8u);
- break;
- }
- } while (it.hasNext());
- }
-
- // Special cases per instruction.
- if (instRwInfo.category == InstDB::RWInfo::kCategoryGenericEx) {
- switch (inst.id()) {
- case Inst::kIdVpternlogd:
- case Inst::kIdVpternlogq: {
- if (opCount == 4 && operands[3].isImm()) {
- uint32_t predicate = operands[3].as<Imm>().valueAs<uint8_t>();
- if ((predicate >> 4) == (predicate & 0xF)) {
- out->_operands[0].clearOpFlags(OpRWFlags::kRead);
- }
- }
- break;
- }
-
- default:
- break;
- }
- }
-
- return rwHandleAVX512(inst, commonInfo, out);
- }
-
- switch (instRwInfo.category) {
- case InstDB::RWInfo::kCategoryMov: {
- // Special case for 'mov' instruction. Here there are some variants that we have to handle as 'mov' can be
- // used to move between GP, segment, control and debug registers. Moving between GP registers also allow to
- // use memory operand.
-
- // We will again set the flag if it's actually a move from GP to GP register, otherwise this flag cannot be set.
- out->_instFlags &= ~InstRWFlags::kMovOp;
-
- if (opCount == 2) {
- if (operands[0].isReg() && operands[1].isReg()) {
- const Reg& o0 = operands[0].as<Reg>();
- const Reg& o1 = operands[1].as<Reg>();
-
- if (o0.isGp() && o1.isGp()) {
- out->_operands[0].reset(W | RegM, operands[0].x86RmSize());
- out->_operands[1].reset(R | RegM, operands[1].x86RmSize());
-
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- out->_instFlags |= InstRWFlags::kMovOp;
- return kErrorOk;
- }
-
- if (o0.isGp() && o1.isSReg()) {
- out->_operands[0].reset(W | RegM, nativeGpSize);
- out->_operands[0].setRmSize(2);
- out->_operands[1].reset(R, 2);
- return kErrorOk;
- }
-
- if (o0.isSReg() && o1.isGp()) {
- out->_operands[0].reset(W, 2);
- out->_operands[1].reset(R | RegM, 2);
- out->_operands[1].setRmSize(2);
- return kErrorOk;
- }
-
- if (o0.isGp() && (o1.isCReg() || o1.isDReg())) {
- out->_operands[0].reset(W, nativeGpSize);
- out->_operands[1].reset(R, nativeGpSize);
- out->_writeFlags = CpuRWFlags::kX86_OF |
- CpuRWFlags::kX86_SF |
- CpuRWFlags::kX86_ZF |
- CpuRWFlags::kX86_AF |
- CpuRWFlags::kX86_PF |
- CpuRWFlags::kX86_CF;
- return kErrorOk;
- }
-
- if ((o0.isCReg() || o0.isDReg()) && o1.isGp()) {
- out->_operands[0].reset(W, nativeGpSize);
- out->_operands[1].reset(R, nativeGpSize);
- out->_writeFlags = CpuRWFlags::kX86_OF |
- CpuRWFlags::kX86_SF |
- CpuRWFlags::kX86_ZF |
- CpuRWFlags::kX86_AF |
- CpuRWFlags::kX86_PF |
- CpuRWFlags::kX86_CF;
- return kErrorOk;
- }
- }
-
- if (operands[0].isReg() && operands[1].isMem()) {
- const Reg& o0 = operands[0].as<Reg>();
- const Mem& o1 = operands[1].as<Mem>();
-
- if (o0.isGp()) {
- if (!o1.isOffset64Bit())
- out->_operands[0].reset(W, o0.size());
- else
- out->_operands[0].reset(W | RegPhys, o0.size(), Gp::kIdAx);
-
- out->_operands[1].reset(R | MibRead, o0.size());
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- return kErrorOk;
- }
-
- if (o0.isSReg()) {
- out->_operands[0].reset(W, 2);
- out->_operands[1].reset(R, 2);
- return kErrorOk;
- }
- }
-
- if (operands[0].isMem() && operands[1].isReg()) {
- const Mem& o0 = operands[0].as<Mem>();
- const Reg& o1 = operands[1].as<Reg>();
-
- if (o1.isGp()) {
- out->_operands[0].reset(W | MibRead, o1.size());
- if (!o0.isOffset64Bit())
- out->_operands[1].reset(R, o1.size());
- else
- out->_operands[1].reset(R | RegPhys, o1.size(), Gp::kIdAx);
- return kErrorOk;
- }
-
- if (o1.isSReg()) {
- out->_operands[0].reset(W | MibRead, 2);
- out->_operands[1].reset(R, 2);
- return kErrorOk;
- }
- }
-
- if (Reg::isGp(operands[0]) && operands[1].isImm()) {
- const Reg& o0 = operands[0].as<Reg>();
- out->_operands[0].reset(W | RegM, o0.size());
- out->_operands[1].reset();
-
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- return kErrorOk;
- }
-
- if (operands[0].isMem() && operands[1].isImm()) {
- const Reg& o0 = operands[0].as<Reg>();
- out->_operands[0].reset(W | MibRead, o0.size());
- out->_operands[1].reset();
- return kErrorOk;
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryMovabs: {
- if (opCount == 2) {
- if (Reg::isGp(operands[0]) && operands[1].isMem()) {
- const Reg& o0 = operands[0].as<Reg>();
- out->_operands[0].reset(W | RegPhys, o0.size(), Gp::kIdAx);
- out->_operands[1].reset(R | MibRead, o0.size());
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- return kErrorOk;
- }
-
- if (operands[0].isMem() && Reg::isGp(operands[1])) {
- const Reg& o1 = operands[1].as<Reg>();
- out->_operands[0].reset(W | MibRead, o1.size());
- out->_operands[1].reset(R | RegPhys, o1.size(), Gp::kIdAx);
- return kErrorOk;
- }
-
- if (Reg::isGp(operands[0]) && operands[1].isImm()) {
- const Reg& o0 = operands[0].as<Reg>();
- out->_operands[0].reset(W, o0.size());
- out->_operands[1].reset();
-
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- return kErrorOk;
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryImul: {
- // Special case for 'imul' instruction.
- //
- // There are 3 variants in general:
- //
- // 1. Standard multiplication: 'A = A * B'.
- // 2. Multiplication with imm: 'A = B * C'.
- // 3. Extended multiplication: 'A:B = B * C'.
-
- if (opCount == 2) {
- if (operands[0].isReg() && operands[1].isImm()) {
- out->_operands[0].reset(X, operands[0].as<Reg>().size());
- out->_operands[1].reset();
-
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- return kErrorOk;
- }
-
- if (Reg::isGpw(operands[0]) && operands[1].x86RmSize() == 1) {
- // imul ax, r8/m8 <- AX = AL * r8/m8
- out->_operands[0].reset(X | RegPhys, 2, Gp::kIdAx);
- out->_operands[0].setReadByteMask(Support::lsbMask<uint64_t>(1));
- out->_operands[1].reset(R | RegM, 1);
- }
- else {
- // imul r?, r?/m?
- out->_operands[0].reset(X, operands[0].as<Gp>().size());
- out->_operands[1].reset(R | RegM, operands[0].as<Gp>().size());
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- }
-
- if (operands[1].isMem())
- out->_operands[1].addOpFlags(MibRead);
- return kErrorOk;
- }
-
- if (opCount == 3) {
- if (operands[2].isImm()) {
- out->_operands[0].reset(W, operands[0].x86RmSize());
- out->_operands[1].reset(R | RegM, operands[1].x86RmSize());
- out->_operands[2].reset();
-
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- if (operands[1].isMem())
- out->_operands[1].addOpFlags(MibRead);
- return kErrorOk;
- }
- else {
- out->_operands[0].reset(W | RegPhys, operands[0].x86RmSize(), Gp::kIdDx);
- out->_operands[1].reset(X | RegPhys, operands[1].x86RmSize(), Gp::kIdAx);
- out->_operands[2].reset(R | RegM, operands[2].x86RmSize());
-
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
- rwZeroExtendGp(out->_operands[1], operands[1].as<Gp>(), nativeGpSize);
- if (operands[2].isMem())
- out->_operands[2].addOpFlags(MibRead);
- return kErrorOk;
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryMovh64: {
- // Special case for 'movhpd|movhps' instructions. Note that this is only required for legacy (non-AVX)
- // variants as AVX instructions use either 2 or 3 operands that are in `kCategoryGeneric` category.
- if (opCount == 2) {
- if (BaseReg::isVec(operands[0]) && operands[1].isMem()) {
- out->_operands[0].reset(W, 8);
- out->_operands[0].setWriteByteMask(Support::lsbMask<uint64_t>(8) << 8);
- out->_operands[1].reset(R | MibRead, 8);
- return kErrorOk;
- }
-
- if (operands[0].isMem() && BaseReg::isVec(operands[1])) {
- out->_operands[0].reset(W | MibRead, 8);
- out->_operands[1].reset(R, 8);
- out->_operands[1].setReadByteMask(Support::lsbMask<uint64_t>(8) << 8);
- return kErrorOk;
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryPunpcklxx: {
- // Special case for 'punpcklbw|punpckldq|punpcklwd' instructions.
- if (opCount == 2) {
- if (Reg::isXmm(operands[0])) {
- out->_operands[0].reset(X, 16);
- out->_operands[0].setReadByteMask(0x0F0Fu);
- out->_operands[0].setWriteByteMask(0xFFFFu);
- out->_operands[1].reset(R, 16);
- out->_operands[1].setWriteByteMask(0x0F0Fu);
-
- if (Reg::isXmm(operands[1])) {
- return kErrorOk;
- }
-
- if (operands[1].isMem()) {
- out->_operands[1].addOpFlags(MibRead);
- return kErrorOk;
- }
- }
-
- if (Reg::isMm(operands[0])) {
- out->_operands[0].reset(X, 8);
- out->_operands[0].setReadByteMask(0x0Fu);
- out->_operands[0].setWriteByteMask(0xFFu);
- out->_operands[1].reset(R, 4);
- out->_operands[1].setReadByteMask(0x0Fu);
-
- if (Reg::isMm(operands[1])) {
- return kErrorOk;
- }
-
- if (operands[1].isMem()) {
- out->_operands[1].addOpFlags(MibRead);
- return kErrorOk;
- }
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryVmaskmov: {
- // Special case for 'vmaskmovpd|vmaskmovps|vpmaskmovd|vpmaskmovq' instructions.
- if (opCount == 3) {
- if (BaseReg::isVec(operands[0]) && BaseReg::isVec(operands[1]) && operands[2].isMem()) {
- out->_operands[0].reset(W, operands[0].x86RmSize());
- out->_operands[1].reset(R, operands[1].x86RmSize());
- out->_operands[2].reset(R | MibRead, operands[1].x86RmSize());
-
- rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
- return kErrorOk;
- }
-
- if (operands[0].isMem() && BaseReg::isVec(operands[1]) && BaseReg::isVec(operands[2])) {
- out->_operands[0].reset(X | MibRead, operands[1].x86RmSize());
- out->_operands[1].reset(R, operands[1].x86RmSize());
- out->_operands[2].reset(R, operands[2].x86RmSize());
- return kErrorOk;
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryVmovddup: {
- // Special case for 'vmovddup' instruction. This instruction has an interesting semantic as 128-bit XMM
- // version only uses 64-bit memory operand (m64), however, 256/512-bit versions use 256/512-bit memory
- // operand, respectively.
- if (opCount == 2) {
- if (BaseReg::isVec(operands[0]) && BaseReg::isVec(operands[1])) {
- uint32_t o0Size = operands[0].x86RmSize();
- uint32_t o1Size = o0Size == 16 ? 8 : o0Size;
-
- out->_operands[0].reset(W, o0Size);
- out->_operands[1].reset(R | RegM, o1Size);
- out->_operands[1]._readByteMask &= 0x00FF00FF00FF00FFu;
-
- rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
- return rwHandleAVX512(inst, commonInfo, out);
- }
-
- if (BaseReg::isVec(operands[0]) && operands[1].isMem()) {
- uint32_t o0Size = operands[0].x86RmSize();
- uint32_t o1Size = o0Size == 16 ? 8 : o0Size;
-
- out->_operands[0].reset(W, o0Size);
- out->_operands[1].reset(R | MibRead, o1Size);
-
- rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
- return rwHandleAVX512(inst, commonInfo, out);
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryVmovmskpd:
- case InstDB::RWInfo::kCategoryVmovmskps: {
- // Special case for 'vmovmskpd|vmovmskps' instructions.
- if (opCount == 2) {
- if (BaseReg::isGp(operands[0]) && BaseReg::isVec(operands[1])) {
- out->_operands[0].reset(W, 1);
- out->_operands[0].setExtendByteMask(Support::lsbMask<uint32_t>(nativeGpSize - 1) << 1);
- out->_operands[1].reset(R, operands[1].x86RmSize());
- return kErrorOk;
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryVmov1_2:
- case InstDB::RWInfo::kCategoryVmov1_4:
- case InstDB::RWInfo::kCategoryVmov1_8: {
- // Special case for instructions where the destination is 1:N (narrowing).
- //
- // Vmov1_2:
- // vcvtpd2dq|vcvttpd2dq
- // vcvtpd2udq|vcvttpd2udq
- // vcvtpd2ps|vcvtps2ph
- // vcvtqq2ps|vcvtuqq2ps
- // vpmovwb|vpmovswb|vpmovuswb
- // vpmovdw|vpmovsdw|vpmovusdw
- // vpmovqd|vpmovsqd|vpmovusqd
- //
- // Vmov1_4:
- // vpmovdb|vpmovsdb|vpmovusdb
- // vpmovqw|vpmovsqw|vpmovusqw
- //
- // Vmov1_8:
- // pmovmskb|vpmovmskb
- // vpmovqb|vpmovsqb|vpmovusqb
- uint32_t shift = instRwInfo.category - InstDB::RWInfo::kCategoryVmov1_2 + 1;
-
- if (opCount >= 2) {
- if (opCount >= 3) {
- if (opCount > 3)
- return DebugUtils::errored(kErrorInvalidInstruction);
- out->_operands[2].reset();
- }
-
- if (operands[0].isReg() && operands[1].isReg()) {
- uint32_t size1 = operands[1].x86RmSize();
- uint32_t size0 = size1 >> shift;
-
- out->_operands[0].reset(W, size0);
- out->_operands[1].reset(R, size1);
-
- if (instRmInfo.rmOpsMask & 0x1) {
- out->_operands[0].addOpFlags(RegM);
- out->_operands[0].setRmSize(size0);
- }
-
- if (instRmInfo.rmOpsMask & 0x2) {
- out->_operands[1].addOpFlags(RegM);
- out->_operands[1].setRmSize(size1);
- }
-
- // Handle 'pmovmskb|vpmovmskb'.
- if (BaseReg::isGp(operands[0]))
- rwZeroExtendGp(out->_operands[0], operands[0].as<Gp>(), nativeGpSize);
-
- if (BaseReg::isVec(operands[0]))
- rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
-
- return rwHandleAVX512(inst, commonInfo, out);
- }
-
- if (operands[0].isReg() && operands[1].isMem()) {
- uint32_t size1 = operands[1].x86RmSize() ? operands[1].x86RmSize() : uint32_t(16);
- uint32_t size0 = size1 >> shift;
-
- out->_operands[0].reset(W, size0);
- out->_operands[1].reset(R | MibRead, size1);
-
- if (BaseReg::isVec(operands[0]))
- rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
-
- return kErrorOk;
- }
-
- if (operands[0].isMem() && operands[1].isReg()) {
- uint32_t size1 = operands[1].x86RmSize();
- uint32_t size0 = size1 >> shift;
-
- out->_operands[0].reset(W | MibRead, size0);
- out->_operands[1].reset(R, size1);
-
- return rwHandleAVX512(inst, commonInfo, out);
- }
- }
- break;
- }
-
- case InstDB::RWInfo::kCategoryVmov2_1:
- case InstDB::RWInfo::kCategoryVmov4_1:
- case InstDB::RWInfo::kCategoryVmov8_1: {
- // Special case for instructions where the destination is N:1 (widening).
- //
- // Vmov2_1:
- // vcvtdq2pd|vcvtudq2pd
- // vcvtps2pd|vcvtph2ps
- // vcvtps2qq|vcvtps2uqq
- // vcvttps2qq|vcvttps2uqq
- // vpmovsxbw|vpmovzxbw
- // vpmovsxwd|vpmovzxwd
- // vpmovsxdq|vpmovzxdq
- //
- // Vmov4_1:
- // vpmovsxbd|vpmovzxbd
- // vpmovsxwq|vpmovzxwq
- //
- // Vmov8_1:
- // vpmovsxbq|vpmovzxbq
- uint32_t shift = instRwInfo.category - InstDB::RWInfo::kCategoryVmov2_1 + 1;
-
- if (opCount >= 2) {
- if (opCount >= 3) {
- if (opCount > 3)
- return DebugUtils::errored(kErrorInvalidInstruction);
- out->_operands[2].reset();
- }
-
- uint32_t size0 = operands[0].x86RmSize();
- uint32_t size1 = size0 >> shift;
-
- out->_operands[0].reset(W, size0);
- out->_operands[1].reset(R, size1);
-
- if (BaseReg::isVec(operands[0]))
- rwZeroExtendAvxVec(out->_operands[0], operands[0].as<Vec>());
-
- if (operands[0].isReg() && operands[1].isReg()) {
- if (instRmInfo.rmOpsMask & 0x1) {
- out->_operands[0].addOpFlags(RegM);
- out->_operands[0].setRmSize(size0);
- }
-
- if (instRmInfo.rmOpsMask & 0x2) {
- out->_operands[1].addOpFlags(RegM);
- out->_operands[1].setRmSize(size1);
- }
-
- return rwHandleAVX512(inst, commonInfo, out);
- }
-
- if (operands[0].isReg() && operands[1].isMem()) {
- out->_operands[1].addOpFlags(MibRead);
-
- return rwHandleAVX512(inst, commonInfo, out);
- }
- }
- break;
- }
- }
-
- return DebugUtils::errored(kErrorInvalidInstruction);
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-// x86::InstInternal - QueryFeatures
-// =================================
-
-#ifndef ASMJIT_NO_INTROSPECTION
-struct RegAnalysis {
- uint32_t regTypeMask;
- uint32_t highVecUsed;
-
- inline bool hasRegType(RegType regType) const noexcept {
- return Support::bitTest(regTypeMask, regType);
- }
-};
-
-static RegAnalysis InstInternal_regAnalysis(const Operand_* operands, size_t opCount) noexcept {
- uint32_t mask = 0;
- uint32_t highVecUsed = 0;
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand_& op = operands[i];
- if (op.isReg()) {
- const BaseReg& reg = op.as<BaseReg>();
- mask |= Support::bitMask(reg.type());
- if (reg.isVec())
- highVecUsed |= uint32_t(reg.id() >= 16 && reg.id() < 32);
- }
- else if (op.isMem()) {
- const BaseMem& mem = op.as<BaseMem>();
- if (mem.hasBaseReg()) mask |= Support::bitMask(mem.baseType());
- if (mem.hasIndexReg()) {
- mask |= Support::bitMask(mem.indexType());
- highVecUsed |= uint32_t(mem.indexId() >= 16 && mem.indexId() < 32);
- }
- }
- }
-
- return RegAnalysis { mask, highVecUsed };
-}
-
-static inline uint32_t InstInternal_usesAvx512(InstOptions instOptions, const RegOnly& extraReg, const RegAnalysis& regAnalysis) noexcept {
- uint32_t hasEvex = uint32_t(instOptions & (InstOptions::kX86_Evex | InstOptions::kX86_AVX512Mask));
- uint32_t hasKMask = extraReg.type() == RegType::kX86_KReg;
- uint32_t hasKOrZmm = regAnalysis.regTypeMask & Support::bitMask(RegType::kX86_Zmm, RegType::kX86_KReg);
-
- return hasEvex | hasKMask | hasKOrZmm;
-}
-
-Error queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept {
- typedef CpuFeatures::X86 Ext;
-
- // Only called when `arch` matches X86 family.
- DebugUtils::unused(arch);
- ASMJIT_ASSERT(Environment::isFamilyX86(arch));
-
- // Get the instruction data.
- InstId instId = inst.id();
- InstOptions options = inst.options();
-
- if (ASMJIT_UNLIKELY(!Inst::isDefinedId(instId)))
- return DebugUtils::errored(kErrorInvalidInstruction);
-
- const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
- const InstDB::AdditionalInfo& additionalInfo = InstDB::_additionalInfoTable[instInfo._additionalInfoIndex];
-
- const uint8_t* fData = additionalInfo.featuresBegin();
- const uint8_t* fEnd = additionalInfo.featuresEnd();
-
- // Copy all features to `out`.
- out->reset();
- do {
- uint32_t feature = fData[0];
- if (!feature)
- break;
- out->add(feature);
- } while (++fData != fEnd);
-
- // Since AsmJit aggregates instructions that share the same name we have to
- // deal with some special cases and also with MMX/SSE and AVX/AVX2 overlaps.
- if (fData != additionalInfo.featuresBegin()) {
- RegAnalysis regAnalysis = InstInternal_regAnalysis(operands, opCount);
-
- // Handle MMX vs SSE overlap.
- if (out->has(Ext::kMMX) || out->has(Ext::kMMX2)) {
- // Only instructions defined by SSE and SSE2 overlap. Instructions introduced by newer instruction sets like
- // SSE3+ don't state MMX as they require SSE3+.
- if (out->has(Ext::kSSE) || out->has(Ext::kSSE2)) {
- if (!regAnalysis.hasRegType(RegType::kX86_Xmm)) {
- // The instruction doesn't use XMM register(s), thus it's MMX/MMX2 only.
- out->remove(Ext::kSSE);
- out->remove(Ext::kSSE2);
- out->remove(Ext::kSSE4_1);
- }
- else {
- out->remove(Ext::kMMX);
- out->remove(Ext::kMMX2);
- }
-
- // Special case: PEXTRW instruction is MMX/SSE2 instruction. However, MMX/SSE version cannot access memory
- // (only register to register extract) so when SSE4.1 introduced the whole family of PEXTR/PINSR instructions
- // they also introduced PEXTRW with a new opcode 0x15 that can extract directly to memory. This instruction
- // is, of course, not compatible with MMX/SSE2 and would #UD if SSE4.1 is not supported.
- if (instId == Inst::kIdPextrw) {
- if (opCount >= 1 && operands[0].isMem())
- out->remove(Ext::kSSE2);
- else
- out->remove(Ext::kSSE4_1);
- }
- }
- }
-
- // Handle PCLMULQDQ vs VPCLMULQDQ.
- if (out->has(Ext::kVPCLMULQDQ)) {
- if (regAnalysis.hasRegType(RegType::kX86_Zmm) || Support::test(options, InstOptions::kX86_Evex)) {
- // AVX512_F & VPCLMULQDQ.
- out->remove(Ext::kAVX, Ext::kPCLMULQDQ);
- }
- else if (regAnalysis.hasRegType(RegType::kX86_Ymm)) {
- out->remove(Ext::kAVX512_F, Ext::kAVX512_VL);
- }
- else {
- // AVX & PCLMULQDQ.
- out->remove(Ext::kAVX512_F, Ext::kAVX512_VL, Ext::kVPCLMULQDQ);
- }
- }
-
- // Handle AVX vs AVX2 overlap.
- if (out->has(Ext::kAVX) && out->has(Ext::kAVX2)) {
- bool isAVX2 = true;
- // Special case: VBROADCASTSS and VBROADCASTSD were introduced in AVX, but only version that uses memory as a
- // source operand. AVX2 then added support for register source operand.
- if (instId == Inst::kIdVbroadcastss || instId == Inst::kIdVbroadcastsd) {
- if (opCount > 1 && operands[1].isMem())
- isAVX2 = false;
- }
- else {
- // AVX instruction set doesn't support integer operations on YMM registers as these were later introcuced by
- // AVX2. In our case we have to check if YMM register(s) are in use and if that is the case this is an AVX2
- // instruction.
- if (!(regAnalysis.regTypeMask & Support::bitMask(RegType::kX86_Ymm, RegType::kX86_Zmm)))
- isAVX2 = false;
- }
-
- if (isAVX2)
- out->remove(Ext::kAVX);
- else
- out->remove(Ext::kAVX2);
- }
-
- // Handle AVX vs AVX512 overlap.
- //
- // In general, non-AVX encoding is preferred, however, AVX encoded instructions that were initially provided
- // as AVX-512 instructions must naturally prefer AVX-512 encoding, as that was the first one provided.
- if (out->hasAny(Ext::kAVX,
- Ext::kAVX_IFMA,
- Ext::kAVX_NE_CONVERT,
- Ext::kAVX_VNNI,
- Ext::kAVX2,
- Ext::kF16C,
- Ext::kFMA)
- &&
- out->hasAny(Ext::kAVX512_BF16,
- Ext::kAVX512_BW,
- Ext::kAVX512_DQ,
- Ext::kAVX512_F,
- Ext::kAVX512_IFMA,
- Ext::kAVX512_VNNI)) {
-
- uint32_t useEvex = InstInternal_usesAvx512(options, inst.extraReg(), regAnalysis) | regAnalysis.highVecUsed;
- switch (instId) {
- // Special case: VPBROADCAST[B|D|Q|W] only supports r32/r64 with EVEX prefix.
- case Inst::kIdVpbroadcastb:
- case Inst::kIdVpbroadcastd:
- case Inst::kIdVpbroadcastq:
- case Inst::kIdVpbroadcastw:
- useEvex |= uint32_t(opCount >= 2 && x86::Reg::isGp(operands[1]));
- break;
-
- case Inst::kIdVcvtpd2dq:
- case Inst::kIdVcvtpd2ps:
- case Inst::kIdVcvttpd2dq:
- useEvex |= uint32_t(opCount >= 2 && Reg::isYmm(operands[0]));
- break;
-
- case Inst::kIdVgatherdpd:
- case Inst::kIdVgatherdps:
- case Inst::kIdVgatherqpd:
- case Inst::kIdVgatherqps:
- case Inst::kIdVpgatherdd:
- case Inst::kIdVpgatherdq:
- case Inst::kIdVpgatherqd:
- case Inst::kIdVpgatherqq:
- useEvex |= uint32_t(opCount == 2);
- break;
-
- // Special case: These instructions only allow `reg, reg. imm` combination in AVX|AVX2 mode, then
- // AVX-512 introduced `reg, reg/mem, imm` combination that uses EVEX prefix. This means that if
- // the second operand is memory then this is AVX-512_BW instruction and not AVX/AVX2 instruction.
- case Inst::kIdVpslldq:
- case Inst::kIdVpslld:
- case Inst::kIdVpsllq:
- case Inst::kIdVpsllw:
- case Inst::kIdVpsrad:
- case Inst::kIdVpsraq:
- case Inst::kIdVpsraw:
- case Inst::kIdVpsrld:
- case Inst::kIdVpsrldq:
- case Inst::kIdVpsrlq:
- case Inst::kIdVpsrlw:
- useEvex |= uint32_t(opCount >= 2 && operands[1].isMem());
- break;
-
- // Special case: VPERMPD - AVX2 vs AVX512-F case.
- case Inst::kIdVpermpd:
- useEvex |= uint32_t(opCount >= 3 && !operands[2].isImm());
- break;
-
- // Special case: VPERMQ - AVX2 vs AVX512-F case.
- case Inst::kIdVpermq:
- useEvex |= uint32_t(opCount >= 3 && (operands[1].isMem() || !operands[2].isImm()));
- break;
- }
-
- if (instInfo.commonInfo().preferEvex() && !Support::test(options, InstOptions::kX86_Vex | InstOptions::kX86_Vex3))
- useEvex = 1;
-
- if (useEvex) {
- out->remove(Ext::kAVX,
- Ext::kAVX_IFMA,
- Ext::kAVX_NE_CONVERT,
- Ext::kAVX_VNNI,
- Ext::kAVX2,
- Ext::kF16C,
- Ext::kFMA);
- }
- else {
- out->remove(Ext::kAVX512_BF16,
- Ext::kAVX512_BW,
- Ext::kAVX512_DQ,
- Ext::kAVX512_F,
- Ext::kAVX512_IFMA,
- Ext::kAVX512_VL,
- Ext::kAVX512_VNNI);
- }
- }
-
- // Clear AVX512_VL if ZMM register is used.
- if (regAnalysis.hasRegType(RegType::kX86_Zmm))
- out->remove(Ext::kAVX512_VL);
- }
-
- return kErrorOk;
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-} // {InstInternal}
-
-// x86::InstInternal - Tests
-// =========================
-
-#if defined(ASMJIT_TEST)
-#ifndef ASMJIT_NO_TEXT
-UNIT(x86_inst_api_text) {
- // All known instructions should be matched.
- INFO("Matching all X86 instructions");
- for (uint32_t a = 1; a < Inst::_kIdCount; a++) {
- StringTmp<128> aName;
- EXPECT_EQ(InstInternal::instIdToString(a, aName), kErrorOk)
- .message("Failed to get the name of instruction #%u", a);
-
- uint32_t b = InstInternal::stringToInstId(aName.data(), aName.size());
- StringTmp<128> bName;
- InstInternal::instIdToString(b, bName);
- EXPECT_EQ(a, b)
- .message("Instructions do not match \"%s\" (#%u) != \"%s\" (#%u)", aName.data(), a, bName.data(), b);
- }
-}
-#endif // !ASMJIT_NO_TEXT
-
-#ifndef ASMJIT_NO_INTROSPECTION
-template<typename... Args>
-static Error queryFeaturesInline(CpuFeatures* out, Arch arch, BaseInst inst, Args&&... args) {
- Operand_ opArray[] = { std::forward<Args>(args)... };
- return InstInternal::queryFeatures(arch, inst, opArray, sizeof...(args), out);
-}
-
-UNIT(x86_inst_api_cpu_features) {
- INFO("Verifying whether SSE2+ features are reported correctly for legacy instructions");
- {
- CpuFeatures f;
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdPaddd), xmm1, xmm2);
- EXPECT_TRUE(f.x86().hasSSE2());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdAddsubpd), xmm1, xmm2);
- EXPECT_TRUE(f.x86().hasSSE3());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdPshufb), xmm1, xmm2);
- EXPECT_TRUE(f.x86().hasSSSE3());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdBlendpd), xmm1, xmm2, Imm(1));
- EXPECT_TRUE(f.x86().hasSSE4_1());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdCrc32), eax, al);
- EXPECT_TRUE(f.x86().hasSSE4_2());
- }
-
- INFO("Verifying whether AVX+ features are reported correctly for AVX instructions");
- {
- CpuFeatures f;
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpaddd), xmm1, xmm2, xmm3);
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpaddd), ymm1, ymm2, ymm3);
- EXPECT_TRUE(f.x86().hasAVX2());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVaddsubpd), xmm1, xmm2, xmm3);
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVaddsubpd), ymm1, ymm2, ymm3);
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpshufb), xmm1, xmm2, xmm3);
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpshufb), ymm1, ymm2, ymm3);
- EXPECT_TRUE(f.x86().hasAVX2());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVblendpd), xmm1, xmm2, xmm3, Imm(1));
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVblendpd), ymm1, ymm2, ymm3, Imm(1));
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpunpcklbw), xmm1, xmm2, xmm3);
- EXPECT_TRUE(f.x86().hasAVX());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpunpcklbw), ymm1, ymm2, ymm3);
- EXPECT_TRUE(f.x86().hasAVX2());
- }
-
- INFO("Verifying whether AVX2 / AVX512 features are reported correctly for vpgatherxx instructions");
- {
- CpuFeatures f;
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd), xmm1, ptr(rax, xmm2), xmm3);
- EXPECT_TRUE(f.x86().hasAVX2());
- EXPECT_FALSE(f.x86().hasAVX512_F());
-
- // NOTE: This instruction is unencodable, but sometimes this signature is used to check the support (without the {k}).
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd), xmm1, ptr(rax, xmm2));
- EXPECT_FALSE(f.x86().hasAVX2());
- EXPECT_TRUE(f.x86().hasAVX512_F());
-
- queryFeaturesInline(&f, Arch::kX64, BaseInst(Inst::kIdVpgatherdd, InstOptions::kNone, k1), xmm1, ptr(rax, xmm2));
- EXPECT_FALSE(f.x86().hasAVX2());
- EXPECT_TRUE(f.x86().hasAVX512_F());
- }
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-#ifndef ASMJIT_NO_INTROSPECTION
-template<typename... Args>
-static Error queryRWInfoInline(InstRWInfo* out, Arch arch, BaseInst inst, Args&&... args) {
- Operand_ opArray[] = { std::forward<Args>(args)... };
- return InstInternal::queryRWInfo(arch, inst, opArray, sizeof...(args), out);
-}
-
-UNIT(x86_inst_api_rm_features) {
- INFO("Verifying whether RM/feature is reported correctly for PEXTRW instruction");
- {
- InstRWInfo rwi;
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdPextrw), eax, mm1, imm(1));
- EXPECT_EQ(rwi.rmFeature(), 0u);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdPextrw), eax, xmm1, imm(1));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kSSE4_1);
- }
-
- INFO("Verifying whether RM/feature is reported correctly for AVX512 shift instructions");
- {
- InstRWInfo rwi;
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslld), xmm1, xmm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllq), ymm1, ymm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrad), xmm1, xmm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrld), ymm1, ymm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrlq), xmm1, xmm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_F);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslldq), xmm1, xmm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllw), ymm1, ymm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsraw), xmm1, xmm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrldq), ymm1, ymm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsrlw), xmm1, xmm2, imm(8));
- EXPECT_EQ(rwi.rmFeature(), CpuFeatures::X86::kAVX512_BW);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpslld), xmm1, xmm2, xmm3);
- EXPECT_EQ(rwi.rmFeature(), 0u);
-
- queryRWInfoInline(&rwi, Arch::kX64, BaseInst(Inst::kIdVpsllw), xmm1, xmm2, xmm3);
- EXPECT_EQ(rwi.rmFeature(), 0u);
- }
-}
-#endif // !ASMJIT_NO_INTROSPECTION
-
-#endif // ASMJIT_TEST
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h b/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h
deleted file mode 100644
index e0866ea702e..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86instapi_p.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
-#define ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
-
-#include "../core/inst.h"
-#include "../core/operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-namespace InstInternal {
-
-#ifndef ASMJIT_NO_TEXT
-Error ASMJIT_CDECL instIdToString(InstId instId, String& output) noexcept;
-InstId ASMJIT_CDECL stringToInstId(const char* s, size_t len) noexcept;
-#endif // !ASMJIT_NO_TEXT
-
-#ifndef ASMJIT_NO_VALIDATION
-Error ASMJIT_CDECL validateX86(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
-Error ASMJIT_CDECL validateX64(const BaseInst& inst, const Operand_* operands, size_t opCount, ValidationFlags validationFlags) noexcept;
-#endif // !ASMJIT_NO_VALIDATION
-
-#ifndef ASMJIT_NO_INTROSPECTION
-Error ASMJIT_CDECL queryRWInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, InstRWInfo* out) noexcept;
-Error ASMJIT_CDECL queryFeatures(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount, CpuFeatures* out) noexcept;
-#endif // !ASMJIT_NO_INTROSPECTION
-
-} // {InstInternal}
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86INSTAPI_P_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp b/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp
deleted file mode 100644
index 4269076f1c4..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86instdb.cpp
+++ /dev/null
@@ -1,6187 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86)
-
-#include "../core/cpuinfo.h"
-#include "../core/misc_p.h"
-#include "../core/support.h"
-#include "../x86/x86instdb_p.h"
-#include "../x86/x86opcode_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::InstDB - InstInfo
-// ======================
-
-// Instruction opcode definitions:
-// - `O` encodes X86|MMX|SSE instructions.
-// - `V` encodes VEX|XOP|EVEX instructions.
-// - `E` encodes EVEX instructions only.
-#define O_ENCODE(PREFIX, OPCODE, O, L, W, EvexW, N, TT) ((PREFIX) | (OPCODE) | (O) | (L) | (W) | (EvexW) | (N) | (TT))
-
-#define O(PREFIX, OPCODE, ModO, LL, W, EvexW, N, ModRM) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kModRM_##ModRM))
-#define V(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT))
-#define E(PREFIX, OPCODE, ModO, LL, W, EvexW, N, TT) (O_ENCODE(Opcode::k##PREFIX, 0x##OPCODE, Opcode::kModO_##ModO, Opcode::kLL_##LL, Opcode::kW_##W, Opcode::kEvex_W_##EvexW, Opcode::kCDSHL_##N, Opcode::kCDTT_##TT) | Opcode::kMM_ForceEvex)
-#define O_FPU(PREFIX, OPCODE, ModO) (Opcode::kFPU_##PREFIX | (0x##OPCODE & 0xFFu) | ((0x##OPCODE >> 8) << Opcode::kFPU_2B_Shift) | Opcode::kModO_##ModO)
-
-// Defines an X86 instruction.
-#define INST(id, encoding, opcode0, opcode1, mainOpcodeIndex, altOpcodeIndex, commomInfoIndex, additionalInfoIndex) { \
- uint32_t(0), \
- uint32_t(commomInfoIndex), \
- uint32_t(additionalInfoIndex), \
- uint8_t(InstDB::kEncoding##encoding), \
- uint8_t((opcode0) & 0xFFu), \
- uint8_t(mainOpcodeIndex), \
- uint8_t(altOpcodeIndex) \
-}
-
-const InstDB::InstInfo InstDB::_instInfoTable[] = {
- /*--------------------+--------------------+------------------+--------+------------------+--------+----+----+----+----+
- | Instruction | Instruction | Main Opcode | EVEX |Alternative Opcode| EVEX |Op0X|Op1X|IdxA|IdxB|
- | Id & Name | Encoding | (pp+mmm|op/o|L|w|W|N|TT.)|--(pp+mmm|op/o|L|w|W|N|TT.)| (auto-generated) |
- +---------------------+--------------------+---------+----+-+-+-+-+----+---------+----+-+-+-+-+----+----+----+----+---*/
- // ${InstInfo:Begin}
- INST(None , None , 0 , 0 , 0 , 0 , 0 , 0 ), // #0
- INST(Aaa , X86Op_xAX , O(000000,37,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #1
- INST(Aad , X86I_xAX , O(000000,D5,_,_,_,_,_,_ ), 0 , 0 , 0 , 2 , 1 ), // #2
- INST(Aadd , X86Mr , O(000F38,FC,_,_,_,_,_,_ ), 0 , 1 , 0 , 3 , 2 ), // #3
- INST(Aam , X86I_xAX , O(000000,D4,_,_,_,_,_,_ ), 0 , 0 , 0 , 2 , 1 ), // #4
- INST(Aand , X86Mr , O(660F38,FC,_,_,_,_,_,_ ), 0 , 2 , 0 , 3 , 2 ), // #5
- INST(Aas , X86Op_xAX , O(000000,3F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #6
- INST(Adc , X86Arith , O(000000,10,2,_,x,_,_,_ ), 0 , 3 , 0 , 4 , 3 ), // #7
- INST(Adcx , X86Rm , O(660F38,F6,_,_,x,_,_,_ ), 0 , 2 , 0 , 5 , 4 ), // #8
- INST(Add , X86Arith , O(000000,00,0,_,x,_,_,_ ), 0 , 0 , 0 , 4 , 1 ), // #9
- INST(Addpd , ExtRm , O(660F00,58,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #10
- INST(Addps , ExtRm , O(000F00,58,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #11
- INST(Addsd , ExtRm , O(F20F00,58,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #12
- INST(Addss , ExtRm , O(F30F00,58,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #13
- INST(Addsubpd , ExtRm , O(660F00,D0,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #14
- INST(Addsubps , ExtRm , O(F20F00,D0,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #15
- INST(Adox , X86Rm , O(F30F38,F6,_,_,x,_,_,_ ), 0 , 8 , 0 , 5 , 8 ), // #16
- INST(Aesdec , ExtRm , O(660F38,DE,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #17
- INST(Aesdeclast , ExtRm , O(660F38,DF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #18
- INST(Aesenc , ExtRm , O(660F38,DC,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #19
- INST(Aesenclast , ExtRm , O(660F38,DD,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #20
- INST(Aesimc , ExtRm , O(660F38,DB,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 9 ), // #21
- INST(Aeskeygenassist , ExtRmi , O(660F3A,DF,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 9 ), // #22
- INST(And , X86Arith , O(000000,20,4,_,x,_,_,_ ), 0 , 10 , 0 , 10 , 1 ), // #23
- INST(Andn , VexRvm_Wx , V(000F38,F2,_,0,x,_,_,_ ), 0 , 11 , 0 , 11 , 10 ), // #24
- INST(Andnpd , ExtRm , O(660F00,55,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #25
- INST(Andnps , ExtRm , O(000F00,55,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #26
- INST(Andpd , ExtRm , O(660F00,54,_,_,_,_,_,_ ), 0 , 4 , 0 , 12 , 5 ), // #27
- INST(Andps , ExtRm , O(000F00,54,_,_,_,_,_,_ ), 0 , 5 , 0 , 12 , 6 ), // #28
- INST(Aor , X86Mr , O(F20F38,FC,_,_,_,_,_,_ ), 0 , 12 , 0 , 3 , 2 ), // #29
- INST(Arpl , X86Mr_NoSize , O(000000,63,_,_,_,_,_,_ ), 0 , 0 , 0 , 13 , 11 ), // #30
- INST(Axor , X86Mr , O(F30F38,FC,_,_,_,_,_,_ ), 0 , 8 , 0 , 3 , 2 ), // #31
- INST(Bextr , VexRmv_Wx , V(000F38,F7,_,0,x,_,_,_ ), 0 , 11 , 0 , 14 , 10 ), // #32
- INST(Blcfill , VexVm_Wx , V(XOP_M9,01,1,0,x,_,_,_ ), 0 , 13 , 0 , 15 , 12 ), // #33
- INST(Blci , VexVm_Wx , V(XOP_M9,02,6,0,x,_,_,_ ), 0 , 14 , 0 , 15 , 12 ), // #34
- INST(Blcic , VexVm_Wx , V(XOP_M9,01,5,0,x,_,_,_ ), 0 , 15 , 0 , 15 , 12 ), // #35
- INST(Blcmsk , VexVm_Wx , V(XOP_M9,02,1,0,x,_,_,_ ), 0 , 13 , 0 , 15 , 12 ), // #36
- INST(Blcs , VexVm_Wx , V(XOP_M9,01,3,0,x,_,_,_ ), 0 , 16 , 0 , 15 , 12 ), // #37
- INST(Blendpd , ExtRmi , O(660F3A,0D,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #38
- INST(Blendps , ExtRmi , O(660F3A,0C,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #39
- INST(Blendvpd , ExtRm_XMM0 , O(660F38,15,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #40
- INST(Blendvps , ExtRm_XMM0 , O(660F38,14,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #41
- INST(Blsfill , VexVm_Wx , V(XOP_M9,01,2,0,x,_,_,_ ), 0 , 17 , 0 , 15 , 12 ), // #42
- INST(Blsi , VexVm_Wx , V(000F38,F3,3,0,x,_,_,_ ), 0 , 18 , 0 , 15 , 10 ), // #43
- INST(Blsic , VexVm_Wx , V(XOP_M9,01,6,0,x,_,_,_ ), 0 , 14 , 0 , 15 , 12 ), // #44
- INST(Blsmsk , VexVm_Wx , V(000F38,F3,2,0,x,_,_,_ ), 0 , 19 , 0 , 15 , 10 ), // #45
- INST(Blsr , VexVm_Wx , V(000F38,F3,1,0,x,_,_,_ ), 0 , 20 , 0 , 15 , 10 ), // #46
- INST(Bndcl , X86Rm , O(F30F00,1A,_,_,_,_,_,_ ), 0 , 7 , 0 , 17 , 14 ), // #47
- INST(Bndcn , X86Rm , O(F20F00,1B,_,_,_,_,_,_ ), 0 , 6 , 0 , 17 , 14 ), // #48
- INST(Bndcu , X86Rm , O(F20F00,1A,_,_,_,_,_,_ ), 0 , 6 , 0 , 17 , 14 ), // #49
- INST(Bndldx , X86Rm , O(000F00,1A,_,_,_,_,_,_ ), 0 , 5 , 0 , 18 , 14 ), // #50
- INST(Bndmk , X86Rm , O(F30F00,1B,_,_,_,_,_,_ ), 0 , 7 , 0 , 19 , 14 ), // #51
- INST(Bndmov , X86Bndmov , O(660F00,1A,_,_,_,_,_,_ ), O(660F00,1B,_,_,_,_,_,_ ), 4 , 1 , 20 , 14 ), // #52
- INST(Bndstx , X86Mr , O(000F00,1B,_,_,_,_,_,_ ), 0 , 5 , 0 , 21 , 14 ), // #53
- INST(Bound , X86Rm , O(000000,62,_,_,_,_,_,_ ), 0 , 0 , 0 , 22 , 0 ), // #54
- INST(Bsf , X86Rm , O(000F00,BC,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 1 ), // #55
- INST(Bsr , X86Rm , O(000F00,BD,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 1 ), // #56
- INST(Bswap , X86Bswap , O(000F00,C8,_,_,x,_,_,_ ), 0 , 5 , 0 , 24 , 0 ), // #57
- INST(Bt , X86Bt , O(000F00,A3,_,_,x,_,_,_ ), O(000F00,BA,4,_,x,_,_,_ ), 5 , 2 , 25 , 15 ), // #58
- INST(Btc , X86Bt , O(000F00,BB,_,_,x,_,_,_ ), O(000F00,BA,7,_,x,_,_,_ ), 5 , 3 , 26 , 15 ), // #59
- INST(Btr , X86Bt , O(000F00,B3,_,_,x,_,_,_ ), O(000F00,BA,6,_,x,_,_,_ ), 5 , 4 , 26 , 15 ), // #60
- INST(Bts , X86Bt , O(000F00,AB,_,_,x,_,_,_ ), O(000F00,BA,5,_,x,_,_,_ ), 5 , 5 , 26 , 15 ), // #61
- INST(Bzhi , VexRmv_Wx , V(000F38,F5,_,0,x,_,_,_ ), 0 , 11 , 0 , 14 , 16 ), // #62
- INST(Call , X86Call , O(000000,FF,2,_,_,_,_,_ ), 0 , 3 , 0 , 27 , 1 ), // #63
- INST(Cbw , X86Op_xAX , O(660000,98,_,_,_,_,_,_ ), 0 , 21 , 0 , 28 , 0 ), // #64
- INST(Cdq , X86Op_xDX_xAX , O(000000,99,_,_,_,_,_,_ ), 0 , 0 , 0 , 29 , 0 ), // #65
- INST(Cdqe , X86Op_xAX , O(000000,98,_,_,1,_,_,_ ), 0 , 22 , 0 , 30 , 0 ), // #66
- INST(Clac , X86Op , O(000F01,CA,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 17 ), // #67
- INST(Clc , X86Op , O(000000,F8,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 18 ), // #68
- INST(Cld , X86Op , O(000000,FC,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 19 ), // #69
- INST(Cldemote , X86M_Only , O(000F00,1C,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 20 ), // #70
- INST(Clflush , X86M_Only , O(000F00,AE,7,_,_,_,_,_ ), 0 , 24 , 0 , 32 , 21 ), // #71
- INST(Clflushopt , X86M_Only , O(660F00,AE,7,_,_,_,_,_ ), 0 , 25 , 0 , 32 , 22 ), // #72
- INST(Clgi , X86Op , O(000F01,DD,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 23 ), // #73
- INST(Cli , X86Op , O(000000,FA,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 24 ), // #74
- INST(Clrssbsy , X86M_Only , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 33 , 25 ), // #75
- INST(Clts , X86Op , O(000F00,06,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #76
- INST(Clui , X86Op , O(F30F01,EE,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #77
- INST(Clwb , X86M_Only , O(660F00,AE,6,_,_,_,_,_ ), 0 , 28 , 0 , 32 , 27 ), // #78
- INST(Clzero , X86Op_MemZAX , O(000F01,FC,_,_,_,_,_,_ ), 0 , 23 , 0 , 35 , 28 ), // #79
- INST(Cmc , X86Op , O(000000,F5,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 29 ), // #80
- INST(Cmova , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #81
- INST(Cmovae , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #82
- INST(Cmovb , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #83
- INST(Cmovbe , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #84
- INST(Cmovc , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #85
- INST(Cmove , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #86
- INST(Cmovg , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #87
- INST(Cmovge , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #88
- INST(Cmovl , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #89
- INST(Cmovle , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #90
- INST(Cmovna , X86Rm , O(000F00,46,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #91
- INST(Cmovnae , X86Rm , O(000F00,42,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #92
- INST(Cmovnb , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #93
- INST(Cmovnbe , X86Rm , O(000F00,47,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 30 ), // #94
- INST(Cmovnc , X86Rm , O(000F00,43,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 31 ), // #95
- INST(Cmovne , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #96
- INST(Cmovng , X86Rm , O(000F00,4E,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #97
- INST(Cmovnge , X86Rm , O(000F00,4C,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #98
- INST(Cmovnl , X86Rm , O(000F00,4D,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 34 ), // #99
- INST(Cmovnle , X86Rm , O(000F00,4F,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 33 ), // #100
- INST(Cmovno , X86Rm , O(000F00,41,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 35 ), // #101
- INST(Cmovnp , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #102
- INST(Cmovns , X86Rm , O(000F00,49,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 37 ), // #103
- INST(Cmovnz , X86Rm , O(000F00,45,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #104
- INST(Cmovo , X86Rm , O(000F00,40,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 35 ), // #105
- INST(Cmovp , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #106
- INST(Cmovpe , X86Rm , O(000F00,4A,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #107
- INST(Cmovpo , X86Rm , O(000F00,4B,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 36 ), // #108
- INST(Cmovs , X86Rm , O(000F00,48,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 37 ), // #109
- INST(Cmovz , X86Rm , O(000F00,44,_,_,x,_,_,_ ), 0 , 5 , 0 , 23 , 32 ), // #110
- INST(Cmp , X86Arith , O(000000,38,7,_,x,_,_,_ ), 0 , 29 , 0 , 36 , 1 ), // #111
- INST(Cmpbexadd , VexMvr_Wx , V(660F38,E6,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #112
- INST(Cmpbxadd , VexMvr_Wx , V(660F38,E2,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #113
- INST(Cmplexadd , VexMvr_Wx , V(660F38,EE,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #114
- INST(Cmplxadd , VexMvr_Wx , V(660F38,EC,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #115
- INST(Cmpnbexadd , VexMvr_Wx , V(660F38,E7,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #116
- INST(Cmpnbxadd , VexMvr_Wx , V(660F38,E3,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #117
- INST(Cmpnlexadd , VexMvr_Wx , V(660F38,EF,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #118
- INST(Cmpnlxadd , VexMvr_Wx , V(660F38,ED,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #119
- INST(Cmpnoxadd , VexMvr_Wx , V(660F38,E1,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #120
- INST(Cmpnpxadd , VexMvr_Wx , V(660F38,EB,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #121
- INST(Cmpnsxadd , VexMvr_Wx , V(660F38,E9,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #122
- INST(Cmpnzxadd , VexMvr_Wx , V(660F38,E5,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #123
- INST(Cmpoxadd , VexMvr_Wx , V(660F38,E0,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #124
- INST(Cmppd , ExtRmi , O(660F00,C2,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #125
- INST(Cmpps , ExtRmi , O(000F00,C2,_,_,_,_,_,_ ), 0 , 5 , 0 , 9 , 6 ), // #126
- INST(Cmppxadd , VexMvr_Wx , V(660F38,EA,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #127
- INST(Cmps , X86StrMm , O(000000,A6,_,_,_,_,_,_ ), 0 , 0 , 0 , 38 , 39 ), // #128
- INST(Cmpsd , ExtRmi , O(F20F00,C2,_,_,_,_,_,_ ), 0 , 6 , 0 , 39 , 5 ), // #129
- INST(Cmpss , ExtRmi , O(F30F00,C2,_,_,_,_,_,_ ), 0 , 7 , 0 , 40 , 6 ), // #130
- INST(Cmpsxadd , VexMvr_Wx , V(660F38,E8,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #131
- INST(Cmpxchg , X86Cmpxchg , O(000F00,B0,_,_,x,_,_,_ ), 0 , 5 , 0 , 41 , 40 ), // #132
- INST(Cmpxchg16b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,1,_,_,_ ), 0 , 31 , 0 , 42 , 41 ), // #133
- INST(Cmpxchg8b , X86Cmpxchg8b_16b , O(000F00,C7,1,_,_,_,_,_ ), 0 , 32 , 0 , 43 , 42 ), // #134
- INST(Cmpzxadd , VexMvr_Wx , V(660F38,E4,_,0,x,_,_,_ ), 0 , 30 , 0 , 37 , 38 ), // #135
- INST(Comisd , ExtRm , O(660F00,2F,_,_,_,_,_,_ ), 0 , 4 , 0 , 7 , 43 ), // #136
- INST(Comiss , ExtRm , O(000F00,2F,_,_,_,_,_,_ ), 0 , 5 , 0 , 8 , 44 ), // #137
- INST(Cpuid , X86Op , O(000F00,A2,_,_,_,_,_,_ ), 0 , 5 , 0 , 44 , 45 ), // #138
- INST(Cqo , X86Op_xDX_xAX , O(000000,99,_,_,1,_,_,_ ), 0 , 22 , 0 , 45 , 0 ), // #139
- INST(Crc32 , X86Crc , O(F20F38,F0,_,_,x,_,_,_ ), 0 , 12 , 0 , 46 , 46 ), // #140
- INST(Cvtdq2pd , ExtRm , O(F30F00,E6,_,_,_,_,_,_ ), 0 , 7 , 0 , 7 , 5 ), // #141
- INST(Cvtdq2ps , ExtRm , O(000F00,5B,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 5 ), // #142
- INST(Cvtpd2dq , ExtRm , O(F20F00,E6,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 5 ), // #143
- INST(Cvtpd2pi , ExtRm , O(660F00,2D,_,_,_,_,_,_ ), 0 , 4 , 0 , 47 , 5 ), // #144
- INST(Cvtpd2ps , ExtRm , O(660F00,5A,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #145
- INST(Cvtpi2pd , ExtRm , O(660F00,2A,_,_,_,_,_,_ ), 0 , 4 , 0 , 48 , 5 ), // #146
- INST(Cvtpi2ps , ExtRm , O(000F00,2A,_,_,_,_,_,_ ), 0 , 5 , 0 , 48 , 6 ), // #147
- INST(Cvtps2dq , ExtRm , O(660F00,5B,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #148
- INST(Cvtps2pd , ExtRm , O(000F00,5A,_,_,_,_,_,_ ), 0 , 5 , 0 , 7 , 5 ), // #149
- INST(Cvtps2pi , ExtRm , O(000F00,2D,_,_,_,_,_,_ ), 0 , 5 , 0 , 49 , 6 ), // #150
- INST(Cvtsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2D,_,_,x,_,_,_ ), 0 , 6 , 0 , 50 , 5 ), // #151
- INST(Cvtsd2ss , ExtRm , O(F20F00,5A,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #152
- INST(Cvtsi2sd , ExtRm_Wx , O(F20F00,2A,_,_,x,_,_,_ ), 0 , 6 , 0 , 51 , 5 ), // #153
- INST(Cvtsi2ss , ExtRm_Wx , O(F30F00,2A,_,_,x,_,_,_ ), 0 , 7 , 0 , 52 , 6 ), // #154
- INST(Cvtss2sd , ExtRm , O(F30F00,5A,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 5 ), // #155
- INST(Cvtss2si , ExtRm_Wx_GpqOnly , O(F30F00,2D,_,_,x,_,_,_ ), 0 , 7 , 0 , 53 , 6 ), // #156
- INST(Cvttpd2dq , ExtRm , O(660F00,E6,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #157
- INST(Cvttpd2pi , ExtRm , O(660F00,2C,_,_,_,_,_,_ ), 0 , 4 , 0 , 47 , 5 ), // #158
- INST(Cvttps2dq , ExtRm , O(F30F00,5B,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 5 ), // #159
- INST(Cvttps2pi , ExtRm , O(000F00,2C,_,_,_,_,_,_ ), 0 , 5 , 0 , 49 , 6 ), // #160
- INST(Cvttsd2si , ExtRm_Wx_GpqOnly , O(F20F00,2C,_,_,x,_,_,_ ), 0 , 6 , 0 , 50 , 5 ), // #161
- INST(Cvttss2si , ExtRm_Wx_GpqOnly , O(F30F00,2C,_,_,x,_,_,_ ), 0 , 7 , 0 , 54 , 6 ), // #162
- INST(Cwd , X86Op_xDX_xAX , O(660000,99,_,_,_,_,_,_ ), 0 , 21 , 0 , 55 , 0 ), // #163
- INST(Cwde , X86Op_xAX , O(000000,98,_,_,_,_,_,_ ), 0 , 0 , 0 , 56 , 0 ), // #164
- INST(Daa , X86Op , O(000000,27,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #165
- INST(Das , X86Op , O(000000,2F,_,_,_,_,_,_ ), 0 , 0 , 0 , 1 , 1 ), // #166
- INST(Dec , X86IncDec , O(000000,FE,1,_,x,_,_,_ ), O(000000,48,_,_,x,_,_,_ ), 33 , 6 , 57 , 47 ), // #167
- INST(Div , X86M_GPB_MulDiv , O(000000,F6,6,_,x,_,_,_ ), 0 , 34 , 0 , 58 , 1 ), // #168
- INST(Divpd , ExtRm , O(660F00,5E,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #169
- INST(Divps , ExtRm , O(000F00,5E,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #170
- INST(Divsd , ExtRm , O(F20F00,5E,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #171
- INST(Divss , ExtRm , O(F30F00,5E,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #172
- INST(Dppd , ExtRmi , O(660F3A,41,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #173
- INST(Dpps , ExtRmi , O(660F3A,40,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #174
- INST(Emms , X86Op , O(000F00,77,_,_,_,_,_,_ ), 0 , 5 , 0 , 59 , 48 ), // #175
- INST(Endbr32 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,3 ), 0 , 35 , 0 , 31 , 49 ), // #176
- INST(Endbr64 , X86Op_Mod11RM , O(F30F00,1E,7,_,_,_,_,2 ), 0 , 36 , 0 , 31 , 49 ), // #177
- INST(Enqcmd , X86EnqcmdMovdir64b , O(F20F38,F8,_,_,_,_,_,_ ), 0 , 12 , 0 , 60 , 50 ), // #178
- INST(Enqcmds , X86EnqcmdMovdir64b , O(F30F38,F8,_,_,_,_,_,_ ), 0 , 8 , 0 , 60 , 50 ), // #179
- INST(Enter , X86Enter , O(000000,C8,_,_,_,_,_,_ ), 0 , 0 , 0 , 61 , 0 ), // #180
- INST(Extractps , ExtExtract , O(660F3A,17,_,_,_,_,_,_ ), 0 , 9 , 0 , 62 , 13 ), // #181
- INST(Extrq , ExtExtrq , O(660F00,79,_,_,_,_,_,_ ), O(660F00,78,0,_,_,_,_,_ ), 4 , 7 , 63 , 51 ), // #182
- INST(F2xm1 , FpuOp , O_FPU(00,D9F0,_) , 0 , 37 , 0 , 31 , 52 ), // #183
- INST(Fabs , FpuOp , O_FPU(00,D9E1,_) , 0 , 37 , 0 , 31 , 52 ), // #184
- INST(Fadd , FpuArith , O_FPU(00,C0C0,0) , 0 , 38 , 0 , 64 , 52 ), // #185
- INST(Faddp , FpuRDef , O_FPU(00,DEC0,_) , 0 , 39 , 0 , 65 , 52 ), // #186
- INST(Fbld , X86M_Only , O_FPU(00,00DF,4) , 0 , 40 , 0 , 66 , 52 ), // #187
- INST(Fbstp , X86M_Only , O_FPU(00,00DF,6) , 0 , 41 , 0 , 66 , 52 ), // #188
- INST(Fchs , FpuOp , O_FPU(00,D9E0,_) , 0 , 37 , 0 , 31 , 52 ), // #189
- INST(Fclex , FpuOp , O_FPU(9B,DBE2,_) , 0 , 42 , 0 , 31 , 52 ), // #190
- INST(Fcmovb , FpuR , O_FPU(00,DAC0,_) , 0 , 43 , 0 , 67 , 53 ), // #191
- INST(Fcmovbe , FpuR , O_FPU(00,DAD0,_) , 0 , 43 , 0 , 67 , 54 ), // #192
- INST(Fcmove , FpuR , O_FPU(00,DAC8,_) , 0 , 43 , 0 , 67 , 55 ), // #193
- INST(Fcmovnb , FpuR , O_FPU(00,DBC0,_) , 0 , 44 , 0 , 67 , 53 ), // #194
- INST(Fcmovnbe , FpuR , O_FPU(00,DBD0,_) , 0 , 44 , 0 , 67 , 54 ), // #195
- INST(Fcmovne , FpuR , O_FPU(00,DBC8,_) , 0 , 44 , 0 , 67 , 55 ), // #196
- INST(Fcmovnu , FpuR , O_FPU(00,DBD8,_) , 0 , 44 , 0 , 67 , 56 ), // #197
- INST(Fcmovu , FpuR , O_FPU(00,DAD8,_) , 0 , 43 , 0 , 67 , 56 ), // #198
- INST(Fcom , FpuCom , O_FPU(00,D0D0,2) , 0 , 45 , 0 , 68 , 52 ), // #199
- INST(Fcomi , FpuR , O_FPU(00,DBF0,_) , 0 , 44 , 0 , 67 , 57 ), // #200
- INST(Fcomip , FpuR , O_FPU(00,DFF0,_) , 0 , 46 , 0 , 67 , 57 ), // #201
- INST(Fcomp , FpuCom , O_FPU(00,D8D8,3) , 0 , 47 , 0 , 68 , 52 ), // #202
- INST(Fcompp , FpuOp , O_FPU(00,DED9,_) , 0 , 39 , 0 , 31 , 52 ), // #203
- INST(Fcos , FpuOp , O_FPU(00,D9FF,_) , 0 , 37 , 0 , 31 , 52 ), // #204
- INST(Fdecstp , FpuOp , O_FPU(00,D9F6,_) , 0 , 37 , 0 , 31 , 52 ), // #205
- INST(Fdiv , FpuArith , O_FPU(00,F0F8,6) , 0 , 48 , 0 , 64 , 52 ), // #206
- INST(Fdivp , FpuRDef , O_FPU(00,DEF8,_) , 0 , 39 , 0 , 65 , 52 ), // #207
- INST(Fdivr , FpuArith , O_FPU(00,F8F0,7) , 0 , 49 , 0 , 64 , 52 ), // #208
- INST(Fdivrp , FpuRDef , O_FPU(00,DEF0,_) , 0 , 39 , 0 , 65 , 52 ), // #209
- INST(Femms , X86Op , O(000F00,0E,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 58 ), // #210
- INST(Ffree , FpuR , O_FPU(00,DDC0,_) , 0 , 50 , 0 , 67 , 52 ), // #211
- INST(Fiadd , FpuM , O_FPU(00,00DA,0) , 0 , 51 , 0 , 69 , 52 ), // #212
- INST(Ficom , FpuM , O_FPU(00,00DA,2) , 0 , 52 , 0 , 69 , 52 ), // #213
- INST(Ficomp , FpuM , O_FPU(00,00DA,3) , 0 , 53 , 0 , 69 , 52 ), // #214
- INST(Fidiv , FpuM , O_FPU(00,00DA,6) , 0 , 41 , 0 , 69 , 52 ), // #215
- INST(Fidivr , FpuM , O_FPU(00,00DA,7) , 0 , 54 , 0 , 69 , 52 ), // #216
- INST(Fild , FpuM , O_FPU(00,00DB,0) , O_FPU(00,00DF,5) , 51 , 8 , 70 , 52 ), // #217
- INST(Fimul , FpuM , O_FPU(00,00DA,1) , 0 , 55 , 0 , 69 , 52 ), // #218
- INST(Fincstp , FpuOp , O_FPU(00,D9F7,_) , 0 , 37 , 0 , 31 , 52 ), // #219
- INST(Finit , FpuOp , O_FPU(9B,DBE3,_) , 0 , 42 , 0 , 31 , 52 ), // #220
- INST(Fist , FpuM , O_FPU(00,00DB,2) , 0 , 52 , 0 , 69 , 52 ), // #221
- INST(Fistp , FpuM , O_FPU(00,00DB,3) , O_FPU(00,00DF,7) , 53 , 9 , 70 , 52 ), // #222
- INST(Fisttp , FpuM , O_FPU(00,00DB,1) , O_FPU(00,00DD,1) , 55 , 10 , 70 , 59 ), // #223
- INST(Fisub , FpuM , O_FPU(00,00DA,4) , 0 , 40 , 0 , 69 , 52 ), // #224
- INST(Fisubr , FpuM , O_FPU(00,00DA,5) , 0 , 56 , 0 , 69 , 52 ), // #225
- INST(Fld , FpuFldFst , O_FPU(00,00D9,0) , O_FPU(00,00DB,5) , 51 , 11 , 71 , 52 ), // #226
- INST(Fld1 , FpuOp , O_FPU(00,D9E8,_) , 0 , 37 , 0 , 31 , 52 ), // #227
- INST(Fldcw , X86M_Only , O_FPU(00,00D9,5) , 0 , 56 , 0 , 72 , 52 ), // #228
- INST(Fldenv , X86M_Only , O_FPU(00,00D9,4) , 0 , 40 , 0 , 32 , 52 ), // #229
- INST(Fldl2e , FpuOp , O_FPU(00,D9EA,_) , 0 , 37 , 0 , 31 , 52 ), // #230
- INST(Fldl2t , FpuOp , O_FPU(00,D9E9,_) , 0 , 37 , 0 , 31 , 52 ), // #231
- INST(Fldlg2 , FpuOp , O_FPU(00,D9EC,_) , 0 , 37 , 0 , 31 , 52 ), // #232
- INST(Fldln2 , FpuOp , O_FPU(00,D9ED,_) , 0 , 37 , 0 , 31 , 52 ), // #233
- INST(Fldpi , FpuOp , O_FPU(00,D9EB,_) , 0 , 37 , 0 , 31 , 52 ), // #234
- INST(Fldz , FpuOp , O_FPU(00,D9EE,_) , 0 , 37 , 0 , 31 , 52 ), // #235
- INST(Fmul , FpuArith , O_FPU(00,C8C8,1) , 0 , 57 , 0 , 64 , 52 ), // #236
- INST(Fmulp , FpuRDef , O_FPU(00,DEC8,_) , 0 , 39 , 0 , 65 , 52 ), // #237
- INST(Fnclex , FpuOp , O_FPU(00,DBE2,_) , 0 , 44 , 0 , 31 , 52 ), // #238
- INST(Fninit , FpuOp , O_FPU(00,DBE3,_) , 0 , 44 , 0 , 31 , 52 ), // #239
- INST(Fnop , FpuOp , O_FPU(00,D9D0,_) , 0 , 37 , 0 , 31 , 52 ), // #240
- INST(Fnsave , X86M_Only , O_FPU(00,00DD,6) , 0 , 41 , 0 , 32 , 52 ), // #241
- INST(Fnstcw , X86M_Only , O_FPU(00,00D9,7) , 0 , 54 , 0 , 72 , 52 ), // #242
- INST(Fnstenv , X86M_Only , O_FPU(00,00D9,6) , 0 , 41 , 0 , 32 , 52 ), // #243
- INST(Fnstsw , FpuStsw , O_FPU(00,00DD,7) , O_FPU(00,DFE0,_) , 54 , 12 , 73 , 52 ), // #244
- INST(Fpatan , FpuOp , O_FPU(00,D9F3,_) , 0 , 37 , 0 , 31 , 52 ), // #245
- INST(Fprem , FpuOp , O_FPU(00,D9F8,_) , 0 , 37 , 0 , 31 , 52 ), // #246
- INST(Fprem1 , FpuOp , O_FPU(00,D9F5,_) , 0 , 37 , 0 , 31 , 52 ), // #247
- INST(Fptan , FpuOp , O_FPU(00,D9F2,_) , 0 , 37 , 0 , 31 , 52 ), // #248
- INST(Frndint , FpuOp , O_FPU(00,D9FC,_) , 0 , 37 , 0 , 31 , 52 ), // #249
- INST(Frstor , X86M_Only , O_FPU(00,00DD,4) , 0 , 40 , 0 , 32 , 52 ), // #250
- INST(Fsave , X86M_Only , O_FPU(9B,00DD,6) , 0 , 58 , 0 , 32 , 52 ), // #251
- INST(Fscale , FpuOp , O_FPU(00,D9FD,_) , 0 , 37 , 0 , 31 , 52 ), // #252
- INST(Fsin , FpuOp , O_FPU(00,D9FE,_) , 0 , 37 , 0 , 31 , 52 ), // #253
- INST(Fsincos , FpuOp , O_FPU(00,D9FB,_) , 0 , 37 , 0 , 31 , 52 ), // #254
- INST(Fsqrt , FpuOp , O_FPU(00,D9FA,_) , 0 , 37 , 0 , 31 , 52 ), // #255
- INST(Fst , FpuFldFst , O_FPU(00,00D9,2) , 0 , 52 , 0 , 74 , 52 ), // #256
- INST(Fstcw , X86M_Only , O_FPU(9B,00D9,7) , 0 , 59 , 0 , 72 , 52 ), // #257
- INST(Fstenv , X86M_Only , O_FPU(9B,00D9,6) , 0 , 58 , 0 , 32 , 52 ), // #258
- INST(Fstp , FpuFldFst , O_FPU(00,00D9,3) , O(000000,DB,7,_,_,_,_,_ ), 53 , 13 , 71 , 52 ), // #259
- INST(Fstsw , FpuStsw , O_FPU(9B,00DD,7) , O_FPU(9B,DFE0,_) , 59 , 14 , 73 , 52 ), // #260
- INST(Fsub , FpuArith , O_FPU(00,E0E8,4) , 0 , 60 , 0 , 64 , 52 ), // #261
- INST(Fsubp , FpuRDef , O_FPU(00,DEE8,_) , 0 , 39 , 0 , 65 , 52 ), // #262
- INST(Fsubr , FpuArith , O_FPU(00,E8E0,5) , 0 , 61 , 0 , 64 , 52 ), // #263
- INST(Fsubrp , FpuRDef , O_FPU(00,DEE0,_) , 0 , 39 , 0 , 65 , 52 ), // #264
- INST(Ftst , FpuOp , O_FPU(00,D9E4,_) , 0 , 37 , 0 , 31 , 52 ), // #265
- INST(Fucom , FpuRDef , O_FPU(00,DDE0,_) , 0 , 50 , 0 , 65 , 52 ), // #266
- INST(Fucomi , FpuR , O_FPU(00,DBE8,_) , 0 , 44 , 0 , 67 , 57 ), // #267
- INST(Fucomip , FpuR , O_FPU(00,DFE8,_) , 0 , 46 , 0 , 67 , 57 ), // #268
- INST(Fucomp , FpuRDef , O_FPU(00,DDE8,_) , 0 , 50 , 0 , 65 , 52 ), // #269
- INST(Fucompp , FpuOp , O_FPU(00,DAE9,_) , 0 , 43 , 0 , 31 , 52 ), // #270
- INST(Fwait , X86Op , O_FPU(00,009B,_) , 0 , 51 , 0 , 31 , 52 ), // #271
- INST(Fxam , FpuOp , O_FPU(00,D9E5,_) , 0 , 37 , 0 , 31 , 52 ), // #272
- INST(Fxch , FpuR , O_FPU(00,D9C8,_) , 0 , 37 , 0 , 65 , 52 ), // #273
- INST(Fxrstor , X86M_Only , O(000F00,AE,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 60 ), // #274
- INST(Fxrstor64 , X86M_Only , O(000F00,AE,1,_,1,_,_,_ ), 0 , 31 , 0 , 75 , 60 ), // #275
- INST(Fxsave , X86M_Only , O(000F00,AE,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 61 ), // #276
- INST(Fxsave64 , X86M_Only , O(000F00,AE,0,_,1,_,_,_ ), 0 , 62 , 0 , 75 , 61 ), // #277
- INST(Fxtract , FpuOp , O_FPU(00,D9F4,_) , 0 , 37 , 0 , 31 , 52 ), // #278
- INST(Fyl2x , FpuOp , O_FPU(00,D9F1,_) , 0 , 37 , 0 , 31 , 52 ), // #279
- INST(Fyl2xp1 , FpuOp , O_FPU(00,D9F9,_) , 0 , 37 , 0 , 31 , 52 ), // #280
- INST(Getsec , X86Op , O(000F00,37,_,_,_,_,_,_ ), 0 , 5 , 0 , 56 , 62 ), // #281
- INST(Gf2p8affineinvqb , ExtRmi , O(660F3A,CF,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 63 ), // #282
- INST(Gf2p8affineqb , ExtRmi , O(660F3A,CE,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 63 ), // #283
- INST(Gf2p8mulb , ExtRm , O(660F38,CF,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 63 ), // #284
- INST(Haddpd , ExtRm , O(660F00,7C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #285
- INST(Haddps , ExtRm , O(F20F00,7C,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #286
- INST(Hlt , X86Op , O(000000,F4,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #287
- INST(Hreset , X86Op_Mod11RM_I8 , O(F30F3A,F0,0,_,_,_,_,_ ), 0 , 63 , 0 , 76 , 64 ), // #288
- INST(Hsubpd , ExtRm , O(660F00,7D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 7 ), // #289
- INST(Hsubps , ExtRm , O(F20F00,7D,_,_,_,_,_,_ ), 0 , 6 , 0 , 6 , 7 ), // #290
- INST(Idiv , X86M_GPB_MulDiv , O(000000,F6,7,_,x,_,_,_ ), 0 , 29 , 0 , 58 , 1 ), // #291
- INST(Imul , X86Imul , O(000000,F6,5,_,x,_,_,_ ), 0 , 64 , 0 , 77 , 1 ), // #292
- INST(In , X86In , O(000000,EC,_,_,_,_,_,_ ), O(000000,E4,_,_,_,_,_,_ ), 0 , 15 , 78 , 0 ), // #293
- INST(Inc , X86IncDec , O(000000,FE,0,_,x,_,_,_ ), O(000000,40,_,_,x,_,_,_ ), 0 , 16 , 79 , 47 ), // #294
- INST(Incsspd , X86M , O(F30F00,AE,5,_,0,_,_,_ ), 0 , 65 , 0 , 80 , 65 ), // #295
- INST(Incsspq , X86M , O(F30F00,AE,5,_,1,_,_,_ ), 0 , 66 , 0 , 81 , 65 ), // #296
- INST(Ins , X86Ins , O(000000,6C,_,_,_,_,_,_ ), 0 , 0 , 0 , 82 , 0 ), // #297
- INST(Insertps , ExtRmi , O(660F3A,21,_,_,_,_,_,_ ), 0 , 9 , 0 , 40 , 13 ), // #298
- INST(Insertq , ExtInsertq , O(F20F00,79,_,_,_,_,_,_ ), O(F20F00,78,_,_,_,_,_,_ ), 6 , 17 , 83 , 51 ), // #299
- INST(Int , X86Int , O(000000,CD,_,_,_,_,_,_ ), 0 , 0 , 0 , 84 , 0 ), // #300
- INST(Int3 , X86Op , O(000000,CC,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #301
- INST(Into , X86Op , O(000000,CE,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 66 ), // #302
- INST(Invd , X86Op , O(000F00,08,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 45 ), // #303
- INST(Invept , X86Rm_NoSize , O(660F38,80,_,_,_,_,_,_ ), 0 , 2 , 0 , 86 , 67 ), // #304
- INST(Invlpg , X86M_Only , O(000F00,01,7,_,_,_,_,_ ), 0 , 24 , 0 , 32 , 45 ), // #305
- INST(Invlpga , X86Op_xAddr , O(000F01,DF,_,_,_,_,_,_ ), 0 , 23 , 0 , 87 , 23 ), // #306
- INST(Invlpgb , X86Op , O(000F01,FE,_,_,_,_,_,_ ), 0 , 23 , 0 , 88 , 68 ), // #307
- INST(Invpcid , X86Rm_NoSize , O(660F38,82,_,_,_,_,_,_ ), 0 , 2 , 0 , 86 , 45 ), // #308
- INST(Invvpid , X86Rm_NoSize , O(660F38,81,_,_,_,_,_,_ ), 0 , 2 , 0 , 86 , 67 ), // #309
- INST(Iret , X86Op , O(660000,CF,_,_,_,_,_,_ ), 0 , 21 , 0 , 89 , 1 ), // #310
- INST(Iretd , X86Op , O(000000,CF,_,_,_,_,_,_ ), 0 , 0 , 0 , 89 , 1 ), // #311
- INST(Iretq , X86Op , O(000000,CF,_,_,1,_,_,_ ), 0 , 22 , 0 , 90 , 1 ), // #312
- INST(Ja , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 5 , 18 , 91 , 69 ), // #313
- INST(Jae , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 19 , 91 , 70 ), // #314
- INST(Jb , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 20 , 91 , 70 ), // #315
- INST(Jbe , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 5 , 21 , 91 , 69 ), // #316
- INST(Jc , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 20 , 91 , 70 ), // #317
- INST(Je , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 5 , 22 , 91 , 71 ), // #318
- INST(Jecxz , X86JecxzLoop , 0 , O(000000,E3,_,_,_,_,_,_ ), 0 , 23 , 92 , 0 ), // #319
- INST(Jg , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 5 , 24 , 91 , 72 ), // #320
- INST(Jge , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 5 , 25 , 91 , 73 ), // #321
- INST(Jl , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 5 , 26 , 91 , 73 ), // #322
- INST(Jle , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 5 , 27 , 91 , 72 ), // #323
- INST(Jmp , X86Jmp , O(000000,FF,4,_,_,_,_,_ ), O(000000,EB,_,_,_,_,_,_ ), 10 , 28 , 93 , 0 ), // #324
- INST(Jna , X86Jcc , O(000F00,86,_,_,_,_,_,_ ), O(000000,76,_,_,_,_,_,_ ), 5 , 21 , 91 , 69 ), // #325
- INST(Jnae , X86Jcc , O(000F00,82,_,_,_,_,_,_ ), O(000000,72,_,_,_,_,_,_ ), 5 , 20 , 91 , 70 ), // #326
- INST(Jnb , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 19 , 91 , 70 ), // #327
- INST(Jnbe , X86Jcc , O(000F00,87,_,_,_,_,_,_ ), O(000000,77,_,_,_,_,_,_ ), 5 , 18 , 91 , 69 ), // #328
- INST(Jnc , X86Jcc , O(000F00,83,_,_,_,_,_,_ ), O(000000,73,_,_,_,_,_,_ ), 5 , 19 , 91 , 70 ), // #329
- INST(Jne , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 5 , 29 , 91 , 71 ), // #330
- INST(Jng , X86Jcc , O(000F00,8E,_,_,_,_,_,_ ), O(000000,7E,_,_,_,_,_,_ ), 5 , 27 , 91 , 72 ), // #331
- INST(Jnge , X86Jcc , O(000F00,8C,_,_,_,_,_,_ ), O(000000,7C,_,_,_,_,_,_ ), 5 , 26 , 91 , 73 ), // #332
- INST(Jnl , X86Jcc , O(000F00,8D,_,_,_,_,_,_ ), O(000000,7D,_,_,_,_,_,_ ), 5 , 25 , 91 , 73 ), // #333
- INST(Jnle , X86Jcc , O(000F00,8F,_,_,_,_,_,_ ), O(000000,7F,_,_,_,_,_,_ ), 5 , 24 , 91 , 72 ), // #334
- INST(Jno , X86Jcc , O(000F00,81,_,_,_,_,_,_ ), O(000000,71,_,_,_,_,_,_ ), 5 , 30 , 91 , 66 ), // #335
- INST(Jnp , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 5 , 31 , 91 , 74 ), // #336
- INST(Jns , X86Jcc , O(000F00,89,_,_,_,_,_,_ ), O(000000,79,_,_,_,_,_,_ ), 5 , 32 , 91 , 75 ), // #337
- INST(Jnz , X86Jcc , O(000F00,85,_,_,_,_,_,_ ), O(000000,75,_,_,_,_,_,_ ), 5 , 29 , 91 , 71 ), // #338
- INST(Jo , X86Jcc , O(000F00,80,_,_,_,_,_,_ ), O(000000,70,_,_,_,_,_,_ ), 5 , 33 , 91 , 66 ), // #339
- INST(Jp , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 5 , 34 , 91 , 74 ), // #340
- INST(Jpe , X86Jcc , O(000F00,8A,_,_,_,_,_,_ ), O(000000,7A,_,_,_,_,_,_ ), 5 , 34 , 91 , 74 ), // #341
- INST(Jpo , X86Jcc , O(000F00,8B,_,_,_,_,_,_ ), O(000000,7B,_,_,_,_,_,_ ), 5 , 31 , 91 , 74 ), // #342
- INST(Js , X86Jcc , O(000F00,88,_,_,_,_,_,_ ), O(000000,78,_,_,_,_,_,_ ), 5 , 35 , 91 , 75 ), // #343
- INST(Jz , X86Jcc , O(000F00,84,_,_,_,_,_,_ ), O(000000,74,_,_,_,_,_,_ ), 5 , 22 , 91 , 71 ), // #344
- INST(Kaddb , VexRvm , V(660F00,4A,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #345
- INST(Kaddd , VexRvm , V(660F00,4A,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #346
- INST(Kaddq , VexRvm , V(000F00,4A,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #347
- INST(Kaddw , VexRvm , V(000F00,4A,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 76 ), // #348
- INST(Kandb , VexRvm , V(660F00,41,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #349
- INST(Kandd , VexRvm , V(660F00,41,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #350
- INST(Kandnb , VexRvm , V(660F00,42,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #351
- INST(Kandnd , VexRvm , V(660F00,42,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #352
- INST(Kandnq , VexRvm , V(000F00,42,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #353
- INST(Kandnw , VexRvm , V(000F00,42,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 78 ), // #354
- INST(Kandq , VexRvm , V(000F00,41,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #355
- INST(Kandw , VexRvm , V(000F00,41,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 78 ), // #356
- INST(Kmovb , VexKmov , V(660F00,90,_,0,0,_,_,_ ), V(660F00,92,_,0,0,_,_,_ ), 71 , 36 , 95 , 79 ), // #357
- INST(Kmovd , VexKmov , V(660F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,0,_,_,_ ), 72 , 37 , 96 , 80 ), // #358
- INST(Kmovq , VexKmov , V(000F00,90,_,0,1,_,_,_ ), V(F20F00,92,_,0,1,_,_,_ ), 73 , 38 , 97 , 80 ), // #359
- INST(Kmovw , VexKmov , V(000F00,90,_,0,0,_,_,_ ), V(000F00,92,_,0,0,_,_,_ ), 74 , 39 , 98 , 81 ), // #360
- INST(Knotb , VexRm , V(660F00,44,_,0,0,_,_,_ ), 0 , 71 , 0 , 99 , 76 ), // #361
- INST(Knotd , VexRm , V(660F00,44,_,0,1,_,_,_ ), 0 , 72 , 0 , 99 , 77 ), // #362
- INST(Knotq , VexRm , V(000F00,44,_,0,1,_,_,_ ), 0 , 73 , 0 , 99 , 77 ), // #363
- INST(Knotw , VexRm , V(000F00,44,_,0,0,_,_,_ ), 0 , 74 , 0 , 99 , 78 ), // #364
- INST(Korb , VexRvm , V(660F00,45,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 76 ), // #365
- INST(Kord , VexRvm , V(660F00,45,_,1,1,_,_,_ ), 0 , 68 , 0 , 94 , 77 ), // #366
- INST(Korq , VexRvm , V(000F00,45,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #367
- INST(Kortestb , VexRm , V(660F00,98,_,0,0,_,_,_ ), 0 , 71 , 0 , 99 , 82 ), // #368
- INST(Kortestd , VexRm , V(660F00,98,_,0,1,_,_,_ ), 0 , 72 , 0 , 99 , 83 ), // #369
- INST(Kortestq , VexRm , V(000F00,98,_,0,1,_,_,_ ), 0 , 73 , 0 , 99 , 83 ), // #370
- INST(Kortestw , VexRm , V(000F00,98,_,0,0,_,_,_ ), 0 , 74 , 0 , 99 , 84 ), // #371
- INST(Korw , VexRvm , V(000F00,45,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 78 ), // #372
- INST(Kshiftlb , VexRmi , V(660F3A,32,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 76 ), // #373
- INST(Kshiftld , VexRmi , V(660F3A,33,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 77 ), // #374
- INST(Kshiftlq , VexRmi , V(660F3A,33,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 77 ), // #375
- INST(Kshiftlw , VexRmi , V(660F3A,32,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 78 ), // #376
- INST(Kshiftrb , VexRmi , V(660F3A,30,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 76 ), // #377
- INST(Kshiftrd , VexRmi , V(660F3A,31,_,0,0,_,_,_ ), 0 , 75 , 0 , 100, 77 ), // #378
- INST(Kshiftrq , VexRmi , V(660F3A,31,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 77 ), // #379
- INST(Kshiftrw , VexRmi , V(660F3A,30,_,0,1,_,_,_ ), 0 , 76 , 0 , 100, 78 ), // #380
- INST(Ktestb , VexRm , V(660F00,99,_,0,0,_,_,_ ), 0 , 71 , 0 , 99 , 82 ), // #381
- INST(Ktestd , VexRm , V(660F00,99,_,0,1,_,_,_ ), 0 , 72 , 0 , 99 , 83 ), // #382
- INST(Ktestq , VexRm , V(000F00,99,_,0,1,_,_,_ ), 0 , 73 , 0 , 99 , 83 ), // #383
- INST(Ktestw , VexRm , V(000F00,99,_,0,0,_,_,_ ), 0 , 74 , 0 , 99 , 82 ), // #384
- INST(Kunpckbw , VexRvm , V(660F00,4B,_,1,0,_,_,_ ), 0 , 67 , 0 , 94 , 78 ), // #385
- INST(Kunpckdq , VexRvm , V(000F00,4B,_,1,1,_,_,_ ), 0 , 69 , 0 , 94 , 77 ), // #386
- INST(Kunpckwd , VexRvm , V(000F00,4B,_,1,0,_,_,_ ), 0 , 70 , 0 , 94 , 77 ), // #387
- INST(Kxnorb , VexRvm , V(660F00,46,_,1,0,_,_,_ ), 0 , 67 , 0 , 101, 76 ), // #388
- INST(Kxnord , VexRvm , V(660F00,46,_,1,1,_,_,_ ), 0 , 68 , 0 , 101, 77 ), // #389
- INST(Kxnorq , VexRvm , V(000F00,46,_,1,1,_,_,_ ), 0 , 69 , 0 , 101, 77 ), // #390
- INST(Kxnorw , VexRvm , V(000F00,46,_,1,0,_,_,_ ), 0 , 70 , 0 , 101, 78 ), // #391
- INST(Kxorb , VexRvm , V(660F00,47,_,1,0,_,_,_ ), 0 , 67 , 0 , 101, 76 ), // #392
- INST(Kxord , VexRvm , V(660F00,47,_,1,1,_,_,_ ), 0 , 68 , 0 , 101, 77 ), // #393
- INST(Kxorq , VexRvm , V(000F00,47,_,1,1,_,_,_ ), 0 , 69 , 0 , 101, 77 ), // #394
- INST(Kxorw , VexRvm , V(000F00,47,_,1,0,_,_,_ ), 0 , 70 , 0 , 101, 78 ), // #395
- INST(Lahf , X86Op , O(000000,9F,_,_,_,_,_,_ ), 0 , 0 , 0 , 102, 85 ), // #396
- INST(Lar , X86Rm , O(000F00,02,_,_,_,_,_,_ ), 0 , 5 , 0 , 103, 11 ), // #397
- INST(Lcall , X86LcallLjmp , O(000000,FF,3,_,_,_,_,_ ), O(000000,9A,_,_,_,_,_,_ ), 77 , 40 , 104, 1 ), // #398
- INST(Lddqu , ExtRm , O(F20F00,F0,_,_,_,_,_,_ ), 0 , 6 , 0 , 105, 7 ), // #399
- INST(Ldmxcsr , X86M_Only , O(000F00,AE,2,_,_,_,_,_ ), 0 , 78 , 0 , 106, 6 ), // #400
- INST(Lds , X86Rm , O(000000,C5,_,_,_,_,_,_ ), 0 , 0 , 0 , 107, 0 ), // #401
- INST(Ldtilecfg , AmxCfg , V(000F38,49,_,0,0,_,_,_ ), 0 , 11 , 0 , 108, 86 ), // #402
- INST(Lea , X86Lea , O(000000,8D,_,_,x,_,_,_ ), 0 , 0 , 0 , 109, 0 ), // #403
- INST(Leave , X86Op , O(000000,C9,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #404
- INST(Les , X86Rm , O(000000,C4,_,_,_,_,_,_ ), 0 , 0 , 0 , 107, 0 ), // #405
- INST(Lfence , X86Fence , O(000F00,AE,5,_,_,_,_,_ ), 0 , 79 , 0 , 31 , 5 ), // #406
- INST(Lfs , X86Rm , O(000F00,B4,_,_,_,_,_,_ ), 0 , 5 , 0 , 110, 0 ), // #407
- INST(Lgdt , X86M_Only , O(000F00,01,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 0 ), // #408
- INST(Lgs , X86Rm , O(000F00,B5,_,_,_,_,_,_ ), 0 , 5 , 0 , 110, 0 ), // #409
- INST(Lidt , X86M_Only , O(000F00,01,3,_,_,_,_,_ ), 0 , 80 , 0 , 32 , 0 ), // #410
- INST(Ljmp , X86LcallLjmp , O(000000,FF,5,_,_,_,_,_ ), O(000000,EA,_,_,_,_,_,_ ), 64 , 41 , 111, 0 ), // #411
- INST(Lldt , X86M_NoSize , O(000F00,00,2,_,_,_,_,_ ), 0 , 78 , 0 , 112, 0 ), // #412
- INST(Llwpcb , VexR_Wx , V(XOP_M9,12,0,0,x,_,_,_ ), 0 , 81 , 0 , 113, 87 ), // #413
- INST(Lmsw , X86M_NoSize , O(000F00,01,6,_,_,_,_,_ ), 0 , 82 , 0 , 112, 0 ), // #414
- INST(Lods , X86StrRm , O(000000,AC,_,_,_,_,_,_ ), 0 , 0 , 0 , 114, 88 ), // #415
- INST(Loop , X86JecxzLoop , 0 , O(000000,E2,_,_,_,_,_,_ ), 0 , 42 , 115, 0 ), // #416
- INST(Loope , X86JecxzLoop , 0 , O(000000,E1,_,_,_,_,_,_ ), 0 , 43 , 115, 71 ), // #417
- INST(Loopne , X86JecxzLoop , 0 , O(000000,E0,_,_,_,_,_,_ ), 0 , 44 , 115, 71 ), // #418
- INST(Lsl , X86Rm , O(000F00,03,_,_,_,_,_,_ ), 0 , 5 , 0 , 116, 11 ), // #419
- INST(Lss , X86Rm , O(000F00,B2,_,_,_,_,_,_ ), 0 , 5 , 0 , 110, 0 ), // #420
- INST(Ltr , X86M_NoSize , O(000F00,00,3,_,_,_,_,_ ), 0 , 80 , 0 , 112, 0 ), // #421
- INST(Lwpins , VexVmi4_Wx , V(XOP_MA,12,0,0,x,_,_,_ ), 0 , 83 , 0 , 117, 87 ), // #422
- INST(Lwpval , VexVmi4_Wx , V(XOP_MA,12,1,0,x,_,_,_ ), 0 , 84 , 0 , 117, 87 ), // #423
- INST(Lzcnt , X86Rm_Raw66H , O(F30F00,BD,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 89 ), // #424
- INST(Maskmovdqu , ExtRm_ZDI , O(660F00,F7,_,_,_,_,_,_ ), 0 , 4 , 0 , 118, 5 ), // #425
- INST(Maskmovq , ExtRm_ZDI , O(000F00,F7,_,_,_,_,_,_ ), 0 , 5 , 0 , 119, 90 ), // #426
- INST(Maxpd , ExtRm , O(660F00,5F,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #427
- INST(Maxps , ExtRm , O(000F00,5F,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #428
- INST(Maxsd , ExtRm , O(F20F00,5F,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #429
- INST(Maxss , ExtRm , O(F30F00,5F,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #430
- INST(Mcommit , X86Op , O(F30F01,FA,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 91 ), // #431
- INST(Mfence , X86Fence , O(000F00,AE,6,_,_,_,_,_ ), 0 , 82 , 0 , 31 , 5 ), // #432
- INST(Minpd , ExtRm , O(660F00,5D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #433
- INST(Minps , ExtRm , O(000F00,5D,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #434
- INST(Minsd , ExtRm , O(F20F00,5D,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #435
- INST(Minss , ExtRm , O(F30F00,5D,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #436
- INST(Monitor , X86Op , O(000F01,C8,_,_,_,_,_,_ ), 0 , 23 , 0 , 120, 92 ), // #437
- INST(Monitorx , X86Op , O(000F01,FA,_,_,_,_,_,_ ), 0 , 23 , 0 , 120, 93 ), // #438
- INST(Mov , X86Mov , 0 , 0 , 0 , 0 , 121, 94 ), // #439
- INST(Movabs , X86Movabs , 0 , 0 , 0 , 0 , 122, 0 ), // #440
- INST(Movapd , ExtMov , O(660F00,28,_,_,_,_,_,_ ), O(660F00,29,_,_,_,_,_,_ ), 4 , 45 , 123, 95 ), // #441
- INST(Movaps , ExtMov , O(000F00,28,_,_,_,_,_,_ ), O(000F00,29,_,_,_,_,_,_ ), 5 , 46 , 123, 96 ), // #442
- INST(Movbe , ExtMovbe , O(000F38,F0,_,_,x,_,_,_ ), O(000F38,F1,_,_,x,_,_,_ ), 1 , 47 , 124, 97 ), // #443
- INST(Movd , ExtMovd , O(000F00,6E,_,_,_,_,_,_ ), O(000F00,7E,_,_,_,_,_,_ ), 5 , 48 , 125, 98 ), // #444
- INST(Movddup , ExtMov , O(F20F00,12,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 7 ), // #445
- INST(Movdir64b , X86EnqcmdMovdir64b , O(660F38,F8,_,_,_,_,_,_ ), 0 , 2 , 0 , 126, 99 ), // #446
- INST(Movdiri , X86MovntiMovdiri , O(000F38,F9,_,_,_,_,_,_ ), 0 , 1 , 0 , 3 , 100), // #447
- INST(Movdq2q , ExtMov , O(F20F00,D6,_,_,_,_,_,_ ), 0 , 6 , 0 , 127, 5 ), // #448
- INST(Movdqa , ExtMov , O(660F00,6F,_,_,_,_,_,_ ), O(660F00,7F,_,_,_,_,_,_ ), 4 , 49 , 123, 95 ), // #449
- INST(Movdqu , ExtMov , O(F30F00,6F,_,_,_,_,_,_ ), O(F30F00,7F,_,_,_,_,_,_ ), 7 , 50 , 123, 95 ), // #450
- INST(Movhlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), 0 , 5 , 0 , 128, 6 ), // #451
- INST(Movhpd , ExtMov , O(660F00,16,_,_,_,_,_,_ ), O(660F00,17,_,_,_,_,_,_ ), 4 , 51 , 129, 5 ), // #452
- INST(Movhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), O(000F00,17,_,_,_,_,_,_ ), 5 , 52 , 129, 6 ), // #453
- INST(Movlhps , ExtMov , O(000F00,16,_,_,_,_,_,_ ), 0 , 5 , 0 , 128, 6 ), // #454
- INST(Movlpd , ExtMov , O(660F00,12,_,_,_,_,_,_ ), O(660F00,13,_,_,_,_,_,_ ), 4 , 53 , 129, 5 ), // #455
- INST(Movlps , ExtMov , O(000F00,12,_,_,_,_,_,_ ), O(000F00,13,_,_,_,_,_,_ ), 5 , 54 , 129, 6 ), // #456
- INST(Movmskpd , ExtMov , O(660F00,50,_,_,_,_,_,_ ), 0 , 4 , 0 , 130, 5 ), // #457
- INST(Movmskps , ExtMov , O(000F00,50,_,_,_,_,_,_ ), 0 , 5 , 0 , 130, 6 ), // #458
- INST(Movntdq , ExtMov , 0 , O(660F00,E7,_,_,_,_,_,_ ), 0 , 55 , 131, 5 ), // #459
- INST(Movntdqa , ExtMov , O(660F38,2A,_,_,_,_,_,_ ), 0 , 2 , 0 , 105, 13 ), // #460
- INST(Movnti , X86MovntiMovdiri , O(000F00,C3,_,_,x,_,_,_ ), 0 , 5 , 0 , 3 , 5 ), // #461
- INST(Movntpd , ExtMov , 0 , O(660F00,2B,_,_,_,_,_,_ ), 0 , 56 , 131, 5 ), // #462
- INST(Movntps , ExtMov , 0 , O(000F00,2B,_,_,_,_,_,_ ), 0 , 57 , 131, 6 ), // #463
- INST(Movntq , ExtMov , 0 , O(000F00,E7,_,_,_,_,_,_ ), 0 , 58 , 132, 90 ), // #464
- INST(Movntsd , ExtMov , 0 , O(F20F00,2B,_,_,_,_,_,_ ), 0 , 59 , 133, 51 ), // #465
- INST(Movntss , ExtMov , 0 , O(F30F00,2B,_,_,_,_,_,_ ), 0 , 60 , 134, 51 ), // #466
- INST(Movq , ExtMovq , O(000F00,6E,_,_,x,_,_,_ ), O(000F00,7E,_,_,x,_,_,_ ), 5 , 48 , 135, 101), // #467
- INST(Movq2dq , ExtRm , O(F30F00,D6,_,_,_,_,_,_ ), 0 , 7 , 0 , 136, 5 ), // #468
- INST(Movs , X86StrMm , O(000000,A4,_,_,_,_,_,_ ), 0 , 0 , 0 , 137, 88 ), // #469
- INST(Movsd , ExtMov , O(F20F00,10,_,_,_,_,_,_ ), O(F20F00,11,_,_,_,_,_,_ ), 6 , 61 , 138, 95 ), // #470
- INST(Movshdup , ExtRm , O(F30F00,16,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 7 ), // #471
- INST(Movsldup , ExtRm , O(F30F00,12,_,_,_,_,_,_ ), 0 , 7 , 0 , 6 , 7 ), // #472
- INST(Movss , ExtMov , O(F30F00,10,_,_,_,_,_,_ ), O(F30F00,11,_,_,_,_,_,_ ), 7 , 62 , 139, 96 ), // #473
- INST(Movsx , X86MovsxMovzx , O(000F00,BE,_,_,x,_,_,_ ), 0 , 5 , 0 , 140, 0 ), // #474
- INST(Movsxd , X86Rm , O(000000,63,_,_,x,_,_,_ ), 0 , 0 , 0 , 141, 0 ), // #475
- INST(Movupd , ExtMov , O(660F00,10,_,_,_,_,_,_ ), O(660F00,11,_,_,_,_,_,_ ), 4 , 63 , 123, 95 ), // #476
- INST(Movups , ExtMov , O(000F00,10,_,_,_,_,_,_ ), O(000F00,11,_,_,_,_,_,_ ), 5 , 64 , 123, 96 ), // #477
- INST(Movzx , X86MovsxMovzx , O(000F00,B6,_,_,x,_,_,_ ), 0 , 5 , 0 , 140, 0 ), // #478
- INST(Mpsadbw , ExtRmi , O(660F3A,42,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #479
- INST(Mul , X86M_GPB_MulDiv , O(000000,F6,4,_,x,_,_,_ ), 0 , 10 , 0 , 58 , 1 ), // #480
- INST(Mulpd , ExtRm , O(660F00,59,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #481
- INST(Mulps , ExtRm , O(000F00,59,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #482
- INST(Mulsd , ExtRm , O(F20F00,59,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #483
- INST(Mulss , ExtRm , O(F30F00,59,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #484
- INST(Mulx , VexRvm_ZDX_Wx , V(F20F38,F6,_,0,x,_,_,_ ), 0 , 85 , 0 , 142, 102), // #485
- INST(Mwait , X86Op , O(000F01,C9,_,_,_,_,_,_ ), 0 , 23 , 0 , 143, 92 ), // #486
- INST(Mwaitx , X86Op , O(000F01,FB,_,_,_,_,_,_ ), 0 , 23 , 0 , 144, 93 ), // #487
- INST(Neg , X86M_GPB , O(000000,F6,3,_,x,_,_,_ ), 0 , 77 , 0 , 145, 1 ), // #488
- INST(Nop , X86M_Nop , O(000000,90,_,_,_,_,_,_ ), 0 , 0 , 0 , 146, 0 ), // #489
- INST(Not , X86M_GPB , O(000000,F6,2,_,x,_,_,_ ), 0 , 3 , 0 , 145, 0 ), // #490
- INST(Or , X86Arith , O(000000,08,1,_,x,_,_,_ ), 0 , 33 , 0 , 147, 1 ), // #491
- INST(Orpd , ExtRm , O(660F00,56,_,_,_,_,_,_ ), 0 , 4 , 0 , 12 , 5 ), // #492
- INST(Orps , ExtRm , O(000F00,56,_,_,_,_,_,_ ), 0 , 5 , 0 , 12 , 6 ), // #493
- INST(Out , X86Out , O(000000,EE,_,_,_,_,_,_ ), O(000000,E6,_,_,_,_,_,_ ), 0 , 65 , 148, 0 ), // #494
- INST(Outs , X86Outs , O(000000,6E,_,_,_,_,_,_ ), 0 , 0 , 0 , 149, 0 ), // #495
- INST(Pabsb , ExtRm_P , O(000F38,1C,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #496
- INST(Pabsd , ExtRm_P , O(000F38,1E,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #497
- INST(Pabsw , ExtRm_P , O(000F38,1D,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #498
- INST(Packssdw , ExtRm_P , O(000F00,6B,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #499
- INST(Packsswb , ExtRm_P , O(000F00,63,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #500
- INST(Packusdw , ExtRm , O(660F38,2B,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #501
- INST(Packuswb , ExtRm_P , O(000F00,67,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #502
- INST(Paddb , ExtRm_P , O(000F00,FC,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #503
- INST(Paddd , ExtRm_P , O(000F00,FE,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #504
- INST(Paddq , ExtRm_P , O(000F00,D4,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 5 ), // #505
- INST(Paddsb , ExtRm_P , O(000F00,EC,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #506
- INST(Paddsw , ExtRm_P , O(000F00,ED,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #507
- INST(Paddusb , ExtRm_P , O(000F00,DC,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #508
- INST(Paddusw , ExtRm_P , O(000F00,DD,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #509
- INST(Paddw , ExtRm_P , O(000F00,FD,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #510
- INST(Palignr , ExtRmi_P , O(000F3A,0F,_,_,_,_,_,_ ), 0 , 86 , 0 , 151, 103), // #511
- INST(Pand , ExtRm_P , O(000F00,DB,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #512
- INST(Pandn , ExtRm_P , O(000F00,DF,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #513
- INST(Pause , X86Op , O(F30000,90,_,_,_,_,_,_ ), 0 , 87 , 0 , 31 , 0 ), // #514
- INST(Pavgb , ExtRm_P , O(000F00,E0,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #515
- INST(Pavgusb , Ext3dNow , O(000F0F,BF,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #516
- INST(Pavgw , ExtRm_P , O(000F00,E3,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #517
- INST(Pblendvb , ExtRm_XMM0 , O(660F38,10,_,_,_,_,_,_ ), 0 , 2 , 0 , 16 , 13 ), // #518
- INST(Pblendw , ExtRmi , O(660F3A,0E,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #519
- INST(Pclmulqdq , ExtRmi , O(660F3A,44,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 105), // #520
- INST(Pcmpeqb , ExtRm_P , O(000F00,74,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #521
- INST(Pcmpeqd , ExtRm_P , O(000F00,76,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #522
- INST(Pcmpeqq , ExtRm , O(660F38,29,_,_,_,_,_,_ ), 0 , 2 , 0 , 155, 13 ), // #523
- INST(Pcmpeqw , ExtRm_P , O(000F00,75,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #524
- INST(Pcmpestri , ExtRmi , O(660F3A,61,_,_,_,_,_,_ ), 0 , 9 , 0 , 156, 106), // #525
- INST(Pcmpestrm , ExtRmi , O(660F3A,60,_,_,_,_,_,_ ), 0 , 9 , 0 , 157, 106), // #526
- INST(Pcmpgtb , ExtRm_P , O(000F00,64,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #527
- INST(Pcmpgtd , ExtRm_P , O(000F00,66,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #528
- INST(Pcmpgtq , ExtRm , O(660F38,37,_,_,_,_,_,_ ), 0 , 2 , 0 , 155, 46 ), // #529
- INST(Pcmpgtw , ExtRm_P , O(000F00,65,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #530
- INST(Pcmpistri , ExtRmi , O(660F3A,63,_,_,_,_,_,_ ), 0 , 9 , 0 , 158, 106), // #531
- INST(Pcmpistrm , ExtRmi , O(660F3A,62,_,_,_,_,_,_ ), 0 , 9 , 0 , 159, 106), // #532
- INST(Pconfig , X86Op , O(000F01,C5,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 107), // #533
- INST(Pdep , VexRvm_Wx , V(F20F38,F5,_,0,x,_,_,_ ), 0 , 85 , 0 , 11 , 102), // #534
- INST(Pext , VexRvm_Wx , V(F30F38,F5,_,0,x,_,_,_ ), 0 , 89 , 0 , 11 , 102), // #535
- INST(Pextrb , ExtExtract , O(000F3A,14,_,_,_,_,_,_ ), 0 , 86 , 0 , 160, 13 ), // #536
- INST(Pextrd , ExtExtract , O(000F3A,16,_,_,_,_,_,_ ), 0 , 86 , 0 , 62 , 13 ), // #537
- INST(Pextrq , ExtExtract , O(000F3A,16,_,_,1,_,_,_ ), 0 , 90 , 0 , 161, 13 ), // #538
- INST(Pextrw , ExtPextrw , O(000F00,C5,_,_,_,_,_,_ ), O(000F3A,15,_,_,_,_,_,_ ), 5 , 66 , 162, 108), // #539
- INST(Pf2id , Ext3dNow , O(000F0F,1D,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #540
- INST(Pf2iw , Ext3dNow , O(000F0F,1C,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #541
- INST(Pfacc , Ext3dNow , O(000F0F,AE,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #542
- INST(Pfadd , Ext3dNow , O(000F0F,9E,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #543
- INST(Pfcmpeq , Ext3dNow , O(000F0F,B0,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #544
- INST(Pfcmpge , Ext3dNow , O(000F0F,90,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #545
- INST(Pfcmpgt , Ext3dNow , O(000F0F,A0,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #546
- INST(Pfmax , Ext3dNow , O(000F0F,A4,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #547
- INST(Pfmin , Ext3dNow , O(000F0F,94,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #548
- INST(Pfmul , Ext3dNow , O(000F0F,B4,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #549
- INST(Pfnacc , Ext3dNow , O(000F0F,8A,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #550
- INST(Pfpnacc , Ext3dNow , O(000F0F,8E,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #551
- INST(Pfrcp , Ext3dNow , O(000F0F,96,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #552
- INST(Pfrcpit1 , Ext3dNow , O(000F0F,A6,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #553
- INST(Pfrcpit2 , Ext3dNow , O(000F0F,B6,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #554
- INST(Pfrcpv , Ext3dNow , O(000F0F,86,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 110), // #555
- INST(Pfrsqit1 , Ext3dNow , O(000F0F,A7,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #556
- INST(Pfrsqrt , Ext3dNow , O(000F0F,97,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #557
- INST(Pfrsqrtv , Ext3dNow , O(000F0F,87,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 110), // #558
- INST(Pfsub , Ext3dNow , O(000F0F,9A,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #559
- INST(Pfsubr , Ext3dNow , O(000F0F,AA,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #560
- INST(Phaddd , ExtRm_P , O(000F38,02,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #561
- INST(Phaddsw , ExtRm_P , O(000F38,03,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #562
- INST(Phaddw , ExtRm_P , O(000F38,01,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #563
- INST(Phminposuw , ExtRm , O(660F38,41,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #564
- INST(Phsubd , ExtRm_P , O(000F38,06,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #565
- INST(Phsubsw , ExtRm_P , O(000F38,07,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #566
- INST(Phsubw , ExtRm_P , O(000F38,05,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #567
- INST(Pi2fd , Ext3dNow , O(000F0F,0D,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #568
- INST(Pi2fw , Ext3dNow , O(000F0F,0C,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #569
- INST(Pinsrb , ExtRmi , O(660F3A,20,_,_,_,_,_,_ ), 0 , 9 , 0 , 163, 13 ), // #570
- INST(Pinsrd , ExtRmi , O(660F3A,22,_,_,_,_,_,_ ), 0 , 9 , 0 , 164, 13 ), // #571
- INST(Pinsrq , ExtRmi , O(660F3A,22,_,_,1,_,_,_ ), 0 , 91 , 0 , 165, 13 ), // #572
- INST(Pinsrw , ExtRmi_P , O(000F00,C4,_,_,_,_,_,_ ), 0 , 5 , 0 , 166, 104), // #573
- INST(Pmaddubsw , ExtRm_P , O(000F38,04,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #574
- INST(Pmaddwd , ExtRm_P , O(000F00,F5,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #575
- INST(Pmaxsb , ExtRm , O(660F38,3C,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #576
- INST(Pmaxsd , ExtRm , O(660F38,3D,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #577
- INST(Pmaxsw , ExtRm_P , O(000F00,EE,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #578
- INST(Pmaxub , ExtRm_P , O(000F00,DE,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #579
- INST(Pmaxud , ExtRm , O(660F38,3F,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #580
- INST(Pmaxuw , ExtRm , O(660F38,3E,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #581
- INST(Pminsb , ExtRm , O(660F38,38,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #582
- INST(Pminsd , ExtRm , O(660F38,39,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #583
- INST(Pminsw , ExtRm_P , O(000F00,EA,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #584
- INST(Pminub , ExtRm_P , O(000F00,DA,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 104), // #585
- INST(Pminud , ExtRm , O(660F38,3B,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #586
- INST(Pminuw , ExtRm , O(660F38,3A,_,_,_,_,_,_ ), 0 , 2 , 0 , 12 , 13 ), // #587
- INST(Pmovmskb , ExtRm_P , O(000F00,D7,_,_,_,_,_,_ ), 0 , 5 , 0 , 167, 104), // #588
- INST(Pmovsxbd , ExtRm , O(660F38,21,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #589
- INST(Pmovsxbq , ExtRm , O(660F38,22,_,_,_,_,_,_ ), 0 , 2 , 0 , 168, 13 ), // #590
- INST(Pmovsxbw , ExtRm , O(660F38,20,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #591
- INST(Pmovsxdq , ExtRm , O(660F38,25,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #592
- INST(Pmovsxwd , ExtRm , O(660F38,23,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #593
- INST(Pmovsxwq , ExtRm , O(660F38,24,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #594
- INST(Pmovzxbd , ExtRm , O(660F38,31,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #595
- INST(Pmovzxbq , ExtRm , O(660F38,32,_,_,_,_,_,_ ), 0 , 2 , 0 , 168, 13 ), // #596
- INST(Pmovzxbw , ExtRm , O(660F38,30,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #597
- INST(Pmovzxdq , ExtRm , O(660F38,35,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #598
- INST(Pmovzxwd , ExtRm , O(660F38,33,_,_,_,_,_,_ ), 0 , 2 , 0 , 7 , 13 ), // #599
- INST(Pmovzxwq , ExtRm , O(660F38,34,_,_,_,_,_,_ ), 0 , 2 , 0 , 8 , 13 ), // #600
- INST(Pmuldq , ExtRm , O(660F38,28,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #601
- INST(Pmulhrsw , ExtRm_P , O(000F38,0B,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #602
- INST(Pmulhrw , Ext3dNow , O(000F0F,B7,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 58 ), // #603
- INST(Pmulhuw , ExtRm_P , O(000F00,E4,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #604
- INST(Pmulhw , ExtRm_P , O(000F00,E5,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #605
- INST(Pmulld , ExtRm , O(660F38,40,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 13 ), // #606
- INST(Pmullw , ExtRm_P , O(000F00,D5,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #607
- INST(Pmuludq , ExtRm_P , O(000F00,F4,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 5 ), // #608
- INST(Pop , X86Pop , O(000000,8F,0,_,_,_,_,_ ), O(000000,58,_,_,_,_,_,_ ), 0 , 67 , 169, 0 ), // #609
- INST(Popa , X86Op , O(660000,61,_,_,_,_,_,_ ), 0 , 21 , 0 , 85 , 0 ), // #610
- INST(Popad , X86Op , O(000000,61,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 0 ), // #611
- INST(Popcnt , X86Rm_Raw66H , O(F30F00,B8,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 111), // #612
- INST(Popf , X86Op , O(660000,9D,_,_,_,_,_,_ ), 0 , 21 , 0 , 31 , 112), // #613
- INST(Popfd , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 112), // #614
- INST(Popfq , X86Op , O(000000,9D,_,_,_,_,_,_ ), 0 , 0 , 0 , 34 , 112), // #615
- INST(Por , ExtRm_P , O(000F00,EB,_,_,_,_,_,_ ), 0 , 5 , 0 , 152, 98 ), // #616
- INST(Prefetch , X86M_Only , O(000F00,0D,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 58 ), // #617
- INST(Prefetchit0 , X86M_Only , O(000F00,18,7,_,_,_,_,_ ), 0 , 24 , 0 , 75 , 113), // #618
- INST(Prefetchit1 , X86M_Only , O(000F00,18,6,_,_,_,_,_ ), 0 , 82 , 0 , 75 , 113), // #619
- INST(Prefetchnta , X86M_Only , O(000F00,18,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 6 ), // #620
- INST(Prefetcht0 , X86M_Only , O(000F00,18,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 6 ), // #621
- INST(Prefetcht1 , X86M_Only , O(000F00,18,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 6 ), // #622
- INST(Prefetcht2 , X86M_Only , O(000F00,18,3,_,_,_,_,_ ), 0 , 80 , 0 , 32 , 6 ), // #623
- INST(Prefetchw , X86M_Only , O(000F00,0D,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 114), // #624
- INST(Prefetchwt1 , X86M_Only , O(000F00,0D,2,_,_,_,_,_ ), 0 , 78 , 0 , 32 , 115), // #625
- INST(Psadbw , ExtRm_P , O(000F00,F6,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 104), // #626
- INST(Pshufb , ExtRm_P , O(000F38,00,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #627
- INST(Pshufd , ExtRmi , O(660F00,70,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #628
- INST(Pshufhw , ExtRmi , O(F30F00,70,_,_,_,_,_,_ ), 0 , 7 , 0 , 9 , 5 ), // #629
- INST(Pshuflw , ExtRmi , O(F20F00,70,_,_,_,_,_,_ ), 0 , 6 , 0 , 9 , 5 ), // #630
- INST(Pshufw , ExtRmi_P , O(000F00,70,_,_,_,_,_,_ ), 0 , 5 , 0 , 170, 90 ), // #631
- INST(Psignb , ExtRm_P , O(000F38,08,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #632
- INST(Psignd , ExtRm_P , O(000F38,0A,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #633
- INST(Psignw , ExtRm_P , O(000F38,09,_,_,_,_,_,_ ), 0 , 1 , 0 , 150, 103), // #634
- INST(Pslld , ExtRmRi_P , O(000F00,F2,_,_,_,_,_,_ ), O(000F00,72,6,_,_,_,_,_ ), 5 , 68 , 171, 98 ), // #635
- INST(Pslldq , ExtRmRi , 0 , O(660F00,73,7,_,_,_,_,_ ), 0 , 69 , 172, 5 ), // #636
- INST(Psllq , ExtRmRi_P , O(000F00,F3,_,_,_,_,_,_ ), O(000F00,73,6,_,_,_,_,_ ), 5 , 70 , 171, 98 ), // #637
- INST(Psllw , ExtRmRi_P , O(000F00,F1,_,_,_,_,_,_ ), O(000F00,71,6,_,_,_,_,_ ), 5 , 71 , 171, 98 ), // #638
- INST(Psmash , X86Op , O(F30F01,FF,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 116), // #639
- INST(Psrad , ExtRmRi_P , O(000F00,E2,_,_,_,_,_,_ ), O(000F00,72,4,_,_,_,_,_ ), 5 , 72 , 171, 98 ), // #640
- INST(Psraw , ExtRmRi_P , O(000F00,E1,_,_,_,_,_,_ ), O(000F00,71,4,_,_,_,_,_ ), 5 , 73 , 171, 98 ), // #641
- INST(Psrld , ExtRmRi_P , O(000F00,D2,_,_,_,_,_,_ ), O(000F00,72,2,_,_,_,_,_ ), 5 , 74 , 171, 98 ), // #642
- INST(Psrldq , ExtRmRi , 0 , O(660F00,73,3,_,_,_,_,_ ), 0 , 75 , 172, 5 ), // #643
- INST(Psrlq , ExtRmRi_P , O(000F00,D3,_,_,_,_,_,_ ), O(000F00,73,2,_,_,_,_,_ ), 5 , 76 , 171, 98 ), // #644
- INST(Psrlw , ExtRmRi_P , O(000F00,D1,_,_,_,_,_,_ ), O(000F00,71,2,_,_,_,_,_ ), 5 , 77 , 171, 98 ), // #645
- INST(Psubb , ExtRm_P , O(000F00,F8,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #646
- INST(Psubd , ExtRm_P , O(000F00,FA,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #647
- INST(Psubq , ExtRm_P , O(000F00,FB,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 5 ), // #648
- INST(Psubsb , ExtRm_P , O(000F00,E8,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #649
- INST(Psubsw , ExtRm_P , O(000F00,E9,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #650
- INST(Psubusb , ExtRm_P , O(000F00,D8,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #651
- INST(Psubusw , ExtRm_P , O(000F00,D9,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #652
- INST(Psubw , ExtRm_P , O(000F00,F9,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #653
- INST(Pswapd , Ext3dNow , O(000F0F,BB,_,_,_,_,_,_ ), 0 , 88 , 0 , 154, 109), // #654
- INST(Ptest , ExtRm , O(660F38,17,_,_,_,_,_,_ ), 0 , 2 , 0 , 6 , 117), // #655
- INST(Ptwrite , X86M , O(F30F00,AE,4,_,_,_,_,_ ), 0 , 92 , 0 , 173, 118), // #656
- INST(Punpckhbw , ExtRm_P , O(000F00,68,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #657
- INST(Punpckhdq , ExtRm_P , O(000F00,6A,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #658
- INST(Punpckhqdq , ExtRm , O(660F00,6D,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #659
- INST(Punpckhwd , ExtRm_P , O(000F00,69,_,_,_,_,_,_ ), 0 , 5 , 0 , 150, 98 ), // #660
- INST(Punpcklbw , ExtRm_P , O(000F00,60,_,_,_,_,_,_ ), 0 , 5 , 0 , 174, 98 ), // #661
- INST(Punpckldq , ExtRm_P , O(000F00,62,_,_,_,_,_,_ ), 0 , 5 , 0 , 174, 98 ), // #662
- INST(Punpcklqdq , ExtRm , O(660F00,6C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #663
- INST(Punpcklwd , ExtRm_P , O(000F00,61,_,_,_,_,_,_ ), 0 , 5 , 0 , 174, 98 ), // #664
- INST(Push , X86Push , O(000000,FF,6,_,_,_,_,_ ), O(000000,50,_,_,_,_,_,_ ), 34 , 78 , 175, 0 ), // #665
- INST(Pusha , X86Op , O(660000,60,_,_,_,_,_,_ ), 0 , 21 , 0 , 85 , 0 ), // #666
- INST(Pushad , X86Op , O(000000,60,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 0 ), // #667
- INST(Pushf , X86Op , O(660000,9C,_,_,_,_,_,_ ), 0 , 21 , 0 , 31 , 119), // #668
- INST(Pushfd , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 85 , 119), // #669
- INST(Pushfq , X86Op , O(000000,9C,_,_,_,_,_,_ ), 0 , 0 , 0 , 34 , 119), // #670
- INST(Pvalidate , X86Op , O(F20F01,FF,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 120), // #671
- INST(Pxor , ExtRm_P , O(000F00,EF,_,_,_,_,_,_ ), 0 , 5 , 0 , 153, 98 ), // #672
- INST(Rcl , X86Rot , O(000000,D0,2,_,x,_,_,_ ), 0 , 3 , 0 , 176, 121), // #673
- INST(Rcpps , ExtRm , O(000F00,53,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #674
- INST(Rcpss , ExtRm , O(F30F00,53,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #675
- INST(Rcr , X86Rot , O(000000,D0,3,_,x,_,_,_ ), 0 , 77 , 0 , 176, 121), // #676
- INST(Rdfsbase , X86M , O(F30F00,AE,0,_,x,_,_,_ ), 0 , 7 , 0 , 177, 122), // #677
- INST(Rdgsbase , X86M , O(F30F00,AE,1,_,x,_,_,_ ), 0 , 94 , 0 , 177, 122), // #678
- INST(Rdmsr , X86Op , O(000F00,32,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 123), // #679
- INST(Rdpid , X86R_Native , O(F30F00,C7,7,_,_,_,_,_ ), 0 , 95 , 0 , 179, 124), // #680
- INST(Rdpkru , X86Op , O(000F01,EE,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 125), // #681
- INST(Rdpmc , X86Op , O(000F00,33,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 0 ), // #682
- INST(Rdpru , X86Op , O(000F01,FD,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 126), // #683
- INST(Rdrand , X86M , O(000F00,C7,6,_,x,_,_,_ ), 0 , 82 , 0 , 24 , 127), // #684
- INST(Rdseed , X86M , O(000F00,C7,7,_,x,_,_,_ ), 0 , 24 , 0 , 24 , 128), // #685
- INST(Rdsspd , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 94 , 0 , 80 , 65 ), // #686
- INST(Rdsspq , X86M , O(F30F00,1E,1,_,_,_,_,_ ), 0 , 94 , 0 , 81 , 65 ), // #687
- INST(Rdtsc , X86Op , O(000F00,31,_,_,_,_,_,_ ), 0 , 5 , 0 , 29 , 129), // #688
- INST(Rdtscp , X86Op , O(000F01,F9,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 130), // #689
- INST(Ret , X86Ret , O(000000,C2,_,_,_,_,_,_ ), 0 , 0 , 0 , 180, 0 ), // #690
- INST(Retf , X86Ret , O(000000,CA,_,_,x,_,_,_ ), 0 , 0 , 0 , 181, 0 ), // #691
- INST(Rmpadjust , X86Op , O(F30F01,FE,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 116), // #692
- INST(Rmpupdate , X86Op , O(F20F01,FE,_,_,_,_,_,_ ), 0 , 93 , 0 , 34 , 116), // #693
- INST(Rol , X86Rot , O(000000,D0,0,_,x,_,_,_ ), 0 , 0 , 0 , 176, 131), // #694
- INST(Ror , X86Rot , O(000000,D0,1,_,x,_,_,_ ), 0 , 33 , 0 , 176, 131), // #695
- INST(Rorx , VexRmi_Wx , V(F20F3A,F0,_,0,x,_,_,_ ), 0 , 96 , 0 , 182, 102), // #696
- INST(Roundpd , ExtRmi , O(660F3A,09,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #697
- INST(Roundps , ExtRmi , O(660F3A,08,_,_,_,_,_,_ ), 0 , 9 , 0 , 9 , 13 ), // #698
- INST(Roundsd , ExtRmi , O(660F3A,0B,_,_,_,_,_,_ ), 0 , 9 , 0 , 39 , 13 ), // #699
- INST(Roundss , ExtRmi , O(660F3A,0A,_,_,_,_,_,_ ), 0 , 9 , 0 , 40 , 13 ), // #700
- INST(Rsm , X86Op , O(000F00,AA,_,_,_,_,_,_ ), 0 , 5 , 0 , 85 , 1 ), // #701
- INST(Rsqrtps , ExtRm , O(000F00,52,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #702
- INST(Rsqrtss , ExtRm , O(F30F00,52,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #703
- INST(Rstorssp , X86M_Only , O(F30F00,01,5,_,_,_,_,_ ), 0 , 65 , 0 , 33 , 25 ), // #704
- INST(Sahf , X86Op , O(000000,9E,_,_,_,_,_,_ ), 0 , 0 , 0 , 102, 132), // #705
- INST(Sal , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 10 , 0 , 176, 1 ), // #706
- INST(Sar , X86Rot , O(000000,D0,7,_,x,_,_,_ ), 0 , 29 , 0 , 176, 1 ), // #707
- INST(Sarx , VexRmv_Wx , V(F30F38,F7,_,0,x,_,_,_ ), 0 , 89 , 0 , 14 , 102), // #708
- INST(Saveprevssp , X86Op , O(F30F01,EA,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 25 ), // #709
- INST(Sbb , X86Arith , O(000000,18,3,_,x,_,_,_ ), 0 , 77 , 0 , 183, 3 ), // #710
- INST(Scas , X86StrRm , O(000000,AE,_,_,_,_,_,_ ), 0 , 0 , 0 , 184, 39 ), // #711
- INST(Seamcall , X86Op , O(660F01,CF,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #712
- INST(Seamops , X86Op , O(660F01,CE,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #713
- INST(Seamret , X86Op , O(660F01,CD,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #714
- INST(Senduipi , X86M_NoSize , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 81 , 26 ), // #715
- INST(Serialize , X86Op , O(000F01,E8,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 134), // #716
- INST(Seta , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #717
- INST(Setae , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #718
- INST(Setb , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #719
- INST(Setbe , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #720
- INST(Setc , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #721
- INST(Sete , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #722
- INST(Setg , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #723
- INST(Setge , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #724
- INST(Setl , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #725
- INST(Setle , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #726
- INST(Setna , X86Set , O(000F00,96,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #727
- INST(Setnae , X86Set , O(000F00,92,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #728
- INST(Setnb , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #729
- INST(Setnbe , X86Set , O(000F00,97,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 69 ), // #730
- INST(Setnc , X86Set , O(000F00,93,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 70 ), // #731
- INST(Setne , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #732
- INST(Setng , X86Set , O(000F00,9E,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #733
- INST(Setnge , X86Set , O(000F00,9C,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #734
- INST(Setnl , X86Set , O(000F00,9D,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 73 ), // #735
- INST(Setnle , X86Set , O(000F00,9F,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 72 ), // #736
- INST(Setno , X86Set , O(000F00,91,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 66 ), // #737
- INST(Setnp , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #738
- INST(Setns , X86Set , O(000F00,99,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 75 ), // #739
- INST(Setnz , X86Set , O(000F00,95,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #740
- INST(Seto , X86Set , O(000F00,90,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 66 ), // #741
- INST(Setp , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #742
- INST(Setpe , X86Set , O(000F00,9A,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #743
- INST(Setpo , X86Set , O(000F00,9B,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 74 ), // #744
- INST(Sets , X86Set , O(000F00,98,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 75 ), // #745
- INST(Setssbsy , X86Op , O(F30F01,E8,_,_,_,_,_,_ ), 0 , 27 , 0 , 31 , 65 ), // #746
- INST(Setz , X86Set , O(000F00,94,_,_,_,_,_,_ ), 0 , 5 , 0 , 185, 71 ), // #747
- INST(Sfence , X86Fence , O(000F00,AE,7,_,_,_,_,_ ), 0 , 24 , 0 , 31 , 6 ), // #748
- INST(Sgdt , X86M_Only , O(000F00,01,0,_,_,_,_,_ ), 0 , 5 , 0 , 32 , 0 ), // #749
- INST(Sha1msg1 , ExtRm , O(000F38,C9,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #750
- INST(Sha1msg2 , ExtRm , O(000F38,CA,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #751
- INST(Sha1nexte , ExtRm , O(000F38,C8,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #752
- INST(Sha1rnds4 , ExtRmi , O(000F3A,CC,_,_,_,_,_,_ ), 0 , 86 , 0 , 9 , 135), // #753
- INST(Sha256msg1 , ExtRm , O(000F38,CC,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #754
- INST(Sha256msg2 , ExtRm , O(000F38,CD,_,_,_,_,_,_ ), 0 , 1 , 0 , 6 , 135), // #755
- INST(Sha256rnds2 , ExtRm_XMM0 , O(000F38,CB,_,_,_,_,_,_ ), 0 , 1 , 0 , 16 , 135), // #756
- INST(Shl , X86Rot , O(000000,D0,4,_,x,_,_,_ ), 0 , 10 , 0 , 176, 1 ), // #757
- INST(Shld , X86ShldShrd , O(000F00,A4,_,_,x,_,_,_ ), 0 , 5 , 0 , 186, 1 ), // #758
- INST(Shlx , VexRmv_Wx , V(660F38,F7,_,0,x,_,_,_ ), 0 , 30 , 0 , 14 , 102), // #759
- INST(Shr , X86Rot , O(000000,D0,5,_,x,_,_,_ ), 0 , 64 , 0 , 176, 1 ), // #760
- INST(Shrd , X86ShldShrd , O(000F00,AC,_,_,x,_,_,_ ), 0 , 5 , 0 , 186, 1 ), // #761
- INST(Shrx , VexRmv_Wx , V(F20F38,F7,_,0,x,_,_,_ ), 0 , 85 , 0 , 14 , 102), // #762
- INST(Shufpd , ExtRmi , O(660F00,C6,_,_,_,_,_,_ ), 0 , 4 , 0 , 9 , 5 ), // #763
- INST(Shufps , ExtRmi , O(000F00,C6,_,_,_,_,_,_ ), 0 , 5 , 0 , 9 , 6 ), // #764
- INST(Sidt , X86M_Only , O(000F00,01,1,_,_,_,_,_ ), 0 , 32 , 0 , 32 , 0 ), // #765
- INST(Skinit , X86Op_xAX , O(000F01,DE,_,_,_,_,_,_ ), 0 , 23 , 0 , 56 , 136), // #766
- INST(Sldt , X86M_NoMemSize , O(000F00,00,0,_,_,_,_,_ ), 0 , 5 , 0 , 187, 0 ), // #767
- INST(Slwpcb , VexR_Wx , V(XOP_M9,12,1,0,x,_,_,_ ), 0 , 13 , 0 , 113, 87 ), // #768
- INST(Smsw , X86M_NoMemSize , O(000F00,01,4,_,_,_,_,_ ), 0 , 98 , 0 , 187, 0 ), // #769
- INST(Sqrtpd , ExtRm , O(660F00,51,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #770
- INST(Sqrtps , ExtRm , O(000F00,51,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #771
- INST(Sqrtsd , ExtRm , O(F20F00,51,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #772
- INST(Sqrtss , ExtRm , O(F30F00,51,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #773
- INST(Stac , X86Op , O(000F01,CB,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 17 ), // #774
- INST(Stc , X86Op , O(000000,F9,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 18 ), // #775
- INST(Std , X86Op , O(000000,FD,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 19 ), // #776
- INST(Stgi , X86Op , O(000F01,DC,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 136), // #777
- INST(Sti , X86Op , O(000000,FB,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 24 ), // #778
- INST(Stmxcsr , X86M_Only , O(000F00,AE,3,_,_,_,_,_ ), 0 , 80 , 0 , 106, 6 ), // #779
- INST(Stos , X86StrMr , O(000000,AA,_,_,_,_,_,_ ), 0 , 0 , 0 , 188, 88 ), // #780
- INST(Str , X86M_NoMemSize , O(000F00,00,1,_,_,_,_,_ ), 0 , 32 , 0 , 187, 0 ), // #781
- INST(Sttilecfg , AmxCfg , V(660F38,49,_,0,0,_,_,_ ), 0 , 30 , 0 , 108, 86 ), // #782
- INST(Stui , X86Op , O(F30F01,EF,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #783
- INST(Sub , X86Arith , O(000000,28,5,_,x,_,_,_ ), 0 , 64 , 0 , 183, 1 ), // #784
- INST(Subpd , ExtRm , O(660F00,5C,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #785
- INST(Subps , ExtRm , O(000F00,5C,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #786
- INST(Subsd , ExtRm , O(F20F00,5C,_,_,_,_,_,_ ), 0 , 6 , 0 , 7 , 5 ), // #787
- INST(Subss , ExtRm , O(F30F00,5C,_,_,_,_,_,_ ), 0 , 7 , 0 , 8 , 6 ), // #788
- INST(Swapgs , X86Op , O(000F01,F8,_,_,_,_,_,_ ), 0 , 23 , 0 , 34 , 0 ), // #789
- INST(Syscall , X86Op , O(000F00,05,_,_,_,_,_,_ ), 0 , 5 , 0 , 34 , 0 ), // #790
- INST(Sysenter , X86Op , O(000F00,34,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #791
- INST(Sysexit , X86Op , O(000F00,35,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #792
- INST(Sysexitq , X86Op , O(000F00,35,_,_,1,_,_,_ ), 0 , 62 , 0 , 34 , 0 ), // #793
- INST(Sysret , X86Op , O(000F00,07,_,_,_,_,_,_ ), 0 , 5 , 0 , 34 , 0 ), // #794
- INST(Sysretq , X86Op , O(000F00,07,_,_,1,_,_,_ ), 0 , 62 , 0 , 34 , 0 ), // #795
- INST(T1mskc , VexVm_Wx , V(XOP_M9,01,7,0,x,_,_,_ ), 0 , 99 , 0 , 15 , 12 ), // #796
- INST(Tcmmimfp16ps , AmxRmv , V(660F38,6C,_,0,0,_,_,_ ), 0 , 30 , 0 , 189, 137), // #797
- INST(Tcmmrlfp16ps , AmxRmv , V(000F38,6C,_,0,0,_,_,_ ), 0 , 11 , 0 , 189, 137), // #798
- INST(Tdcall , X86Op , O(660F01,CC,_,_,_,_,_,_ ), 0 , 97 , 0 , 31 , 133), // #799
- INST(Tdpbf16ps , AmxRmv , V(F30F38,5C,_,0,0,_,_,_ ), 0 , 89 , 0 , 189, 138), // #800
- INST(Tdpbssd , AmxRmv , V(F20F38,5E,_,0,0,_,_,_ ), 0 , 85 , 0 , 189, 139), // #801
- INST(Tdpbsud , AmxRmv , V(F30F38,5E,_,0,0,_,_,_ ), 0 , 89 , 0 , 189, 139), // #802
- INST(Tdpbusd , AmxRmv , V(660F38,5E,_,0,0,_,_,_ ), 0 , 30 , 0 , 189, 139), // #803
- INST(Tdpbuud , AmxRmv , V(000F38,5E,_,0,0,_,_,_ ), 0 , 11 , 0 , 189, 139), // #804
- INST(Tdpfp16ps , AmxRmv , V(F20F38,5C,_,0,0,_,_,_ ), 0 , 85 , 0 , 189, 140), // #805
- INST(Test , X86Test , O(000000,84,_,_,x,_,_,_ ), O(000000,F6,_,_,x,_,_,_ ), 0 , 79 , 190, 1 ), // #806
- INST(Testui , X86Op , O(F30F01,ED,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 141), // #807
- INST(Tileloadd , AmxRm , V(F20F38,4B,_,0,0,_,_,_ ), 0 , 85 , 0 , 191, 86 ), // #808
- INST(Tileloaddt1 , AmxRm , V(660F38,4B,_,0,0,_,_,_ ), 0 , 30 , 0 , 191, 86 ), // #809
- INST(Tilerelease , VexOpMod , V(000F38,49,0,0,0,_,_,_ ), 0 , 11 , 0 , 192, 86 ), // #810
- INST(Tilestored , AmxMr , V(F30F38,4B,_,0,0,_,_,_ ), 0 , 89 , 0 , 193, 86 ), // #811
- INST(Tilezero , AmxR , V(F20F38,49,_,0,0,_,_,_ ), 0 , 85 , 0 , 194, 86 ), // #812
- INST(Tlbsync , X86Op , O(000F01,FF,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 68 ), // #813
- INST(Tpause , X86R32_EDX_EAX , O(660F00,AE,6,_,_,_,_,_ ), 0 , 28 , 0 , 195, 142), // #814
- INST(Tzcnt , X86Rm_Raw66H , O(F30F00,BC,_,_,x,_,_,_ ), 0 , 7 , 0 , 23 , 10 ), // #815
- INST(Tzmsk , VexVm_Wx , V(XOP_M9,01,4,0,x,_,_,_ ), 0 , 100, 0 , 15 , 12 ), // #816
- INST(Ucomisd , ExtRm , O(660F00,2E,_,_,_,_,_,_ ), 0 , 4 , 0 , 7 , 43 ), // #817
- INST(Ucomiss , ExtRm , O(000F00,2E,_,_,_,_,_,_ ), 0 , 5 , 0 , 8 , 44 ), // #818
- INST(Ud0 , X86Rm , O(000F00,FF,_,_,_,_,_,_ ), 0 , 5 , 0 , 196, 0 ), // #819
- INST(Ud1 , X86Rm , O(000F00,B9,_,_,_,_,_,_ ), 0 , 5 , 0 , 196, 0 ), // #820
- INST(Ud2 , X86Op , O(000F00,0B,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 0 ), // #821
- INST(Uiret , X86Op , O(F30F01,EC,_,_,_,_,_,_ ), 0 , 27 , 0 , 34 , 26 ), // #822
- INST(Umonitor , X86R_FromM , O(F30F00,AE,6,_,_,_,_,_ ), 0 , 26 , 0 , 197, 143), // #823
- INST(Umwait , X86R32_EDX_EAX , O(F20F00,AE,6,_,_,_,_,_ ), 0 , 101, 0 , 195, 142), // #824
- INST(Unpckhpd , ExtRm , O(660F00,15,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #825
- INST(Unpckhps , ExtRm , O(000F00,15,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #826
- INST(Unpcklpd , ExtRm , O(660F00,14,_,_,_,_,_,_ ), 0 , 4 , 0 , 6 , 5 ), // #827
- INST(Unpcklps , ExtRm , O(000F00,14,_,_,_,_,_,_ ), 0 , 5 , 0 , 6 , 6 ), // #828
- INST(V4fmaddps , VexRm_T1_4X , E(F20F38,9A,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 144), // #829
- INST(V4fmaddss , VexRm_T1_4X , E(F20F38,9B,_,0,_,0,4,T4X), 0 , 103, 0 , 199, 144), // #830
- INST(V4fnmaddps , VexRm_T1_4X , E(F20F38,AA,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 144), // #831
- INST(V4fnmaddss , VexRm_T1_4X , E(F20F38,AB,_,0,_,0,4,T4X), 0 , 103, 0 , 199, 144), // #832
- INST(Vaddpd , VexRvm_Lx , V(660F00,58,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #833
- INST(Vaddph , VexRvm_Lx , E(00MAP5,58,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #834
- INST(Vaddps , VexRvm_Lx , V(000F00,58,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #835
- INST(Vaddsd , VexRvm , V(F20F00,58,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #836
- INST(Vaddsh , VexRvm , E(F3MAP5,58,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #837
- INST(Vaddss , VexRvm , V(F30F00,58,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #838
- INST(Vaddsubpd , VexRvm_Lx , V(660F00,D0,_,x,I,_,_,_ ), 0 , 71 , 0 , 206, 149), // #839
- INST(Vaddsubps , VexRvm_Lx , V(F20F00,D0,_,x,I,_,_,_ ), 0 , 110, 0 , 206, 149), // #840
- INST(Vaesdec , VexRvm_Lx , V(660F38,DE,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #841
- INST(Vaesdeclast , VexRvm_Lx , V(660F38,DF,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #842
- INST(Vaesenc , VexRvm_Lx , V(660F38,DC,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #843
- INST(Vaesenclast , VexRvm_Lx , V(660F38,DD,_,x,I,_,4,FVM), 0 , 111, 0 , 207, 150), // #844
- INST(Vaesimc , VexRm , V(660F38,DB,_,0,I,_,_,_ ), 0 , 30 , 0 , 208, 151), // #845
- INST(Vaeskeygenassist , VexRmi , V(660F3A,DF,_,0,I,_,_,_ ), 0 , 75 , 0 , 209, 151), // #846
- INST(Valignd , VexRvmi_Lx , E(660F3A,03,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 152), // #847
- INST(Valignq , VexRvmi_Lx , E(660F3A,03,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 152), // #848
- INST(Vandnpd , VexRvm_Lx , V(660F00,55,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 153), // #849
- INST(Vandnps , VexRvm_Lx , V(000F00,55,_,x,I,0,4,FV ), 0 , 106, 0 , 213, 153), // #850
- INST(Vandpd , VexRvm_Lx , V(660F00,54,_,x,I,1,4,FV ), 0 , 104, 0 , 214, 153), // #851
- INST(Vandps , VexRvm_Lx , V(000F00,54,_,x,I,0,4,FV ), 0 , 106, 0 , 215, 153), // #852
- INST(Vbcstnebf162ps , VexRm_Lx , V(F30F38,B1,_,x,0,_,_,_ ), 0 , 89 , 0 , 216, 154), // #853
- INST(Vbcstnesh2ps , VexRm_Lx , V(660F38,B1,_,x,0,_,_,_ ), 0 , 30 , 0 , 216, 154), // #854
- INST(Vblendmpd , VexRvm_Lx , E(660F38,65,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #855
- INST(Vblendmps , VexRvm_Lx , E(660F38,65,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #856
- INST(Vblendpd , VexRvmi_Lx , V(660F3A,0D,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 149), // #857
- INST(Vblendps , VexRvmi_Lx , V(660F3A,0C,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 149), // #858
- INST(Vblendvpd , VexRvmr_Lx , V(660F3A,4B,_,x,0,_,_,_ ), 0 , 75 , 0 , 220, 149), // #859
- INST(Vblendvps , VexRvmr_Lx , V(660F3A,4A,_,x,0,_,_,_ ), 0 , 75 , 0 , 220, 149), // #860
- INST(Vbroadcastf128 , VexRm , V(660F38,1A,_,1,0,_,_,_ ), 0 , 116, 0 , 221, 149), // #861
- INST(Vbroadcastf32x2 , VexRm_Lx , E(660F38,19,_,x,_,0,3,T2 ), 0 , 117, 0 , 222, 155), // #862
- INST(Vbroadcastf32x4 , VexRm_Lx , E(660F38,1A,_,x,_,0,4,T4 ), 0 , 118, 0 , 223, 78 ), // #863
- INST(Vbroadcastf32x8 , VexRm , E(660F38,1B,_,2,_,0,5,T8 ), 0 , 119, 0 , 224, 76 ), // #864
- INST(Vbroadcastf64x2 , VexRm_Lx , E(660F38,1A,_,x,_,1,4,T2 ), 0 , 120, 0 , 223, 155), // #865
- INST(Vbroadcastf64x4 , VexRm , E(660F38,1B,_,2,_,1,5,T4 ), 0 , 121, 0 , 224, 78 ), // #866
- INST(Vbroadcasti128 , VexRm , V(660F38,5A,_,1,0,_,_,_ ), 0 , 116, 0 , 221, 156), // #867
- INST(Vbroadcasti32x2 , VexRm_Lx , E(660F38,59,_,x,_,0,3,T2 ), 0 , 117, 0 , 225, 155), // #868
- INST(Vbroadcasti32x4 , VexRm_Lx , E(660F38,5A,_,x,_,0,4,T4 ), 0 , 118, 0 , 223, 152), // #869
- INST(Vbroadcasti32x8 , VexRm , E(660F38,5B,_,2,_,0,5,T8 ), 0 , 119, 0 , 224, 76 ), // #870
- INST(Vbroadcasti64x2 , VexRm_Lx , E(660F38,5A,_,x,_,1,4,T2 ), 0 , 120, 0 , 223, 155), // #871
- INST(Vbroadcasti64x4 , VexRm , E(660F38,5B,_,2,_,1,5,T4 ), 0 , 121, 0 , 224, 78 ), // #872
- INST(Vbroadcastsd , VexRm_Lx , V(660F38,19,_,x,0,1,3,T1S), 0 , 122, 0 , 226, 157), // #873
- INST(Vbroadcastss , VexRm_Lx , V(660F38,18,_,x,0,0,2,T1S), 0 , 123, 0 , 227, 157), // #874
- INST(Vcmppd , VexRvmi_Lx_KEvex , V(660F00,C2,_,x,I,1,4,FV ), 0 , 104, 0 , 228, 145), // #875
- INST(Vcmpph , VexRvmi_Lx_KEvex , E(000F3A,C2,_,_,_,0,4,FV ), 0 , 124, 0 , 229, 146), // #876
- INST(Vcmpps , VexRvmi_Lx_KEvex , V(000F00,C2,_,x,I,0,4,FV ), 0 , 106, 0 , 230, 145), // #877
- INST(Vcmpsd , VexRvmi_KEvex , V(F20F00,C2,_,I,I,1,3,T1S), 0 , 107, 0 , 231, 147), // #878
- INST(Vcmpsh , VexRvmi_KEvex , E(F30F3A,C2,_,_,_,0,1,T1S), 0 , 125, 0 , 232, 148), // #879
- INST(Vcmpss , VexRvmi_KEvex , V(F30F00,C2,_,I,I,0,2,T1S), 0 , 109, 0 , 233, 147), // #880
- INST(Vcomisd , VexRm , V(660F00,2F,_,I,I,1,3,T1S), 0 , 126, 0 , 234, 158), // #881
- INST(Vcomish , VexRm , E(00MAP5,2F,_,_,_,0,1,T1S), 0 , 127, 0 , 235, 159), // #882
- INST(Vcomiss , VexRm , V(000F00,2F,_,I,I,0,2,T1S), 0 , 128, 0 , 236, 158), // #883
- INST(Vcompresspd , VexMr_Lx , E(660F38,8A,_,x,_,1,3,T1S), 0 , 129, 0 , 237, 152), // #884
- INST(Vcompressps , VexMr_Lx , E(660F38,8A,_,x,_,0,2,T1S), 0 , 130, 0 , 237, 152), // #885
- INST(Vcvtdq2pd , VexRm_Lx , V(F30F00,E6,_,x,I,0,3,HV ), 0 , 131, 0 , 238, 145), // #886
- INST(Vcvtdq2ph , VexRm_Lx_Narrow , E(00MAP5,5B,_,x,0,0,4,FV ), 0 , 105, 0 , 239, 146), // #887
- INST(Vcvtdq2ps , VexRm_Lx , V(000F00,5B,_,x,I,0,4,FV ), 0 , 106, 0 , 240, 145), // #888
- INST(Vcvtne2ps2bf16 , VexRvm_Lx , E(F20F38,72,_,_,_,0,4,FV ), 0 , 132, 0 , 218, 160), // #889
- INST(Vcvtneebf162ps , VexRm_Lx , V(F30F38,B0,_,x,0,_,_,_ ), 0 , 89 , 0 , 241, 154), // #890
- INST(Vcvtneeph2ps , VexRm_Lx , V(660F38,B0,_,x,0,_,_,_ ), 0 , 30 , 0 , 241, 154), // #891
- INST(Vcvtneobf162ps , VexRm_Lx , V(F20F38,B0,_,x,0,_,_,_ ), 0 , 85 , 0 , 241, 154), // #892
- INST(Vcvtneoph2ps , VexRm_Lx , V(000F38,B0,_,x,0,_,_,_ ), 0 , 11 , 0 , 241, 154), // #893
- INST(Vcvtneps2bf16 , VexRm_Lx_Narrow , V(F30F38,72,_,_,_,0,4,FV ), 0 , 133, 0 , 242, 161), // #894
- INST(Vcvtpd2dq , VexRm_Lx_Narrow , V(F20F00,E6,_,x,I,1,4,FV ), 0 , 134, 0 , 243, 145), // #895
- INST(Vcvtpd2ph , VexRm_Lx , E(66MAP5,5A,_,_,_,1,4,FV ), 0 , 135, 0 , 244, 146), // #896
- INST(Vcvtpd2ps , VexRm_Lx_Narrow , V(660F00,5A,_,x,I,1,4,FV ), 0 , 104, 0 , 243, 145), // #897
- INST(Vcvtpd2qq , VexRm_Lx , E(660F00,7B,_,x,_,1,4,FV ), 0 , 136, 0 , 245, 155), // #898
- INST(Vcvtpd2udq , VexRm_Lx_Narrow , E(000F00,79,_,x,_,1,4,FV ), 0 , 137, 0 , 246, 152), // #899
- INST(Vcvtpd2uqq , VexRm_Lx , E(660F00,79,_,x,_,1,4,FV ), 0 , 136, 0 , 245, 155), // #900
- INST(Vcvtph2dq , VexRm_Lx , E(66MAP5,5B,_,_,_,0,3,HV ), 0 , 138, 0 , 247, 146), // #901
- INST(Vcvtph2pd , VexRm_Lx , E(00MAP5,5A,_,_,_,0,2,QV ), 0 , 139, 0 , 248, 146), // #902
- INST(Vcvtph2ps , VexRm_Lx , V(660F38,13,_,x,0,0,3,HVM), 0 , 140, 0 , 249, 162), // #903
- INST(Vcvtph2psx , VexRm_Lx , E(66MAP6,13,_,_,_,0,3,HV ), 0 , 141, 0 , 250, 146), // #904
- INST(Vcvtph2qq , VexRm_Lx , E(66MAP5,7B,_,_,_,0,2,QV ), 0 , 142, 0 , 251, 146), // #905
- INST(Vcvtph2udq , VexRm_Lx , E(00MAP5,79,_,_,_,0,3,HV ), 0 , 143, 0 , 247, 146), // #906
- INST(Vcvtph2uqq , VexRm_Lx , E(66MAP5,79,_,_,_,0,2,QV ), 0 , 142, 0 , 251, 146), // #907
- INST(Vcvtph2uw , VexRm_Lx , E(00MAP5,7D,_,_,_,0,4,FV ), 0 , 105, 0 , 252, 146), // #908
- INST(Vcvtph2w , VexRm_Lx , E(66MAP5,7D,_,_,_,0,4,FV ), 0 , 144, 0 , 252, 146), // #909
- INST(Vcvtps2dq , VexRm_Lx , V(660F00,5B,_,x,I,0,4,FV ), 0 , 145, 0 , 240, 145), // #910
- INST(Vcvtps2pd , VexRm_Lx , V(000F00,5A,_,x,I,0,3,HV ), 0 , 146, 0 , 253, 145), // #911
- INST(Vcvtps2ph , VexMri_Lx , V(660F3A,1D,_,x,0,0,3,HVM), 0 , 147, 0 , 254, 162), // #912
- INST(Vcvtps2phx , VexRm_Lx_Narrow , E(66MAP5,1D,_,_,_,0,4,FV ), 0 , 144, 0 , 239, 146), // #913
- INST(Vcvtps2qq , VexRm_Lx , E(660F00,7B,_,x,_,0,3,HV ), 0 , 148, 0 , 255, 155), // #914
- INST(Vcvtps2udq , VexRm_Lx , E(000F00,79,_,x,_,0,4,FV ), 0 , 149, 0 , 256, 152), // #915
- INST(Vcvtps2uqq , VexRm_Lx , E(660F00,79,_,x,_,0,3,HV ), 0 , 148, 0 , 255, 155), // #916
- INST(Vcvtqq2pd , VexRm_Lx , E(F30F00,E6,_,x,_,1,4,FV ), 0 , 150, 0 , 245, 155), // #917
- INST(Vcvtqq2ph , VexRm_Lx , E(00MAP5,5B,_,_,_,1,4,FV ), 0 , 151, 0 , 244, 146), // #918
- INST(Vcvtqq2ps , VexRm_Lx_Narrow , E(000F00,5B,_,x,_,1,4,FV ), 0 , 137, 0 , 246, 155), // #919
- INST(Vcvtsd2sh , VexRvm , E(F2MAP5,5A,_,_,_,1,3,T1S), 0 , 152, 0 , 257, 148), // #920
- INST(Vcvtsd2si , VexRm_Wx , V(F20F00,2D,_,I,x,x,3,T1F), 0 , 153, 0 , 258, 147), // #921
- INST(Vcvtsd2ss , VexRvm , V(F20F00,5A,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #922
- INST(Vcvtsd2usi , VexRm_Wx , E(F20F00,79,_,I,_,x,3,T1F), 0 , 154, 0 , 259, 78 ), // #923
- INST(Vcvtsh2sd , VexRvm , E(F3MAP5,5A,_,_,_,0,1,T1S), 0 , 108, 0 , 260, 148), // #924
- INST(Vcvtsh2si , VexRm_Wx , E(F3MAP5,2D,_,_,_,x,1,T1S), 0 , 108, 0 , 261, 148), // #925
- INST(Vcvtsh2ss , VexRvm , E(00MAP6,13,_,_,_,0,1,T1S), 0 , 155, 0 , 260, 148), // #926
- INST(Vcvtsh2usi , VexRm_Wx , E(F3MAP5,79,_,_,_,x,1,T1S), 0 , 108, 0 , 261, 148), // #927
- INST(Vcvtsi2sd , VexRvm_Wx , V(F20F00,2A,_,I,x,x,2,T1W), 0 , 156, 0 , 262, 147), // #928
- INST(Vcvtsi2sh , VexRvm_Wx , E(F3MAP5,2A,_,_,_,x,2,T1W), 0 , 157, 0 , 263, 148), // #929
- INST(Vcvtsi2ss , VexRvm_Wx , V(F30F00,2A,_,I,x,x,2,T1W), 0 , 158, 0 , 262, 147), // #930
- INST(Vcvtss2sd , VexRvm , V(F30F00,5A,_,I,I,0,2,T1S), 0 , 109, 0 , 264, 147), // #931
- INST(Vcvtss2sh , VexRvm , E(00MAP5,1D,_,_,_,0,2,T1S), 0 , 159, 0 , 265, 148), // #932
- INST(Vcvtss2si , VexRm_Wx , V(F30F00,2D,_,I,x,x,2,T1F), 0 , 109, 0 , 266, 147), // #933
- INST(Vcvtss2usi , VexRm_Wx , E(F30F00,79,_,I,_,x,2,T1F), 0 , 160, 0 , 267, 78 ), // #934
- INST(Vcvttpd2dq , VexRm_Lx_Narrow , V(660F00,E6,_,x,I,1,4,FV ), 0 , 104, 0 , 268, 145), // #935
- INST(Vcvttpd2qq , VexRm_Lx , E(660F00,7A,_,x,_,1,4,FV ), 0 , 136, 0 , 269, 152), // #936
- INST(Vcvttpd2udq , VexRm_Lx_Narrow , E(000F00,78,_,x,_,1,4,FV ), 0 , 137, 0 , 270, 152), // #937
- INST(Vcvttpd2uqq , VexRm_Lx , E(660F00,78,_,x,_,1,4,FV ), 0 , 136, 0 , 269, 155), // #938
- INST(Vcvttph2dq , VexRm_Lx , E(F3MAP5,5B,_,_,_,0,3,HV ), 0 , 161, 0 , 250, 146), // #939
- INST(Vcvttph2qq , VexRm_Lx , E(66MAP5,7A,_,_,_,0,2,QV ), 0 , 142, 0 , 248, 146), // #940
- INST(Vcvttph2udq , VexRm_Lx , E(00MAP5,78,_,_,_,0,3,HV ), 0 , 143, 0 , 250, 146), // #941
- INST(Vcvttph2uqq , VexRm_Lx , E(66MAP5,78,_,_,_,0,2,QV ), 0 , 142, 0 , 248, 146), // #942
- INST(Vcvttph2uw , VexRm_Lx , E(00MAP5,7C,_,_,_,0,4,FV ), 0 , 105, 0 , 271, 146), // #943
- INST(Vcvttph2w , VexRm_Lx , E(66MAP5,7C,_,_,_,0,4,FV ), 0 , 144, 0 , 271, 146), // #944
- INST(Vcvttps2dq , VexRm_Lx , V(F30F00,5B,_,x,I,0,4,FV ), 0 , 162, 0 , 272, 145), // #945
- INST(Vcvttps2qq , VexRm_Lx , E(660F00,7A,_,x,_,0,3,HV ), 0 , 148, 0 , 273, 155), // #946
- INST(Vcvttps2udq , VexRm_Lx , E(000F00,78,_,x,_,0,4,FV ), 0 , 149, 0 , 274, 152), // #947
- INST(Vcvttps2uqq , VexRm_Lx , E(660F00,78,_,x,_,0,3,HV ), 0 , 148, 0 , 273, 155), // #948
- INST(Vcvttsd2si , VexRm_Wx , V(F20F00,2C,_,I,x,x,3,T1F), 0 , 153, 0 , 275, 147), // #949
- INST(Vcvttsd2usi , VexRm_Wx , E(F20F00,78,_,I,_,x,3,T1F), 0 , 154, 0 , 276, 78 ), // #950
- INST(Vcvttsh2si , VexRm_Wx , E(F3MAP5,2C,_,_,_,x,1,T1S), 0 , 108, 0 , 277, 148), // #951
- INST(Vcvttsh2usi , VexRm_Wx , E(F3MAP5,78,_,_,_,x,1,T1S), 0 , 108, 0 , 277, 148), // #952
- INST(Vcvttss2si , VexRm_Wx , V(F30F00,2C,_,I,x,x,2,T1F), 0 , 109, 0 , 278, 147), // #953
- INST(Vcvttss2usi , VexRm_Wx , E(F30F00,78,_,I,_,x,2,T1F), 0 , 160, 0 , 279, 78 ), // #954
- INST(Vcvtudq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,0,3,HV ), 0 , 163, 0 , 280, 152), // #955
- INST(Vcvtudq2ph , VexRm_Lx_Narrow , E(F2MAP5,7A,_,_,_,0,4,FV ), 0 , 164, 0 , 239, 146), // #956
- INST(Vcvtudq2ps , VexRm_Lx , E(F20F00,7A,_,x,_,0,4,FV ), 0 , 165, 0 , 256, 152), // #957
- INST(Vcvtuqq2pd , VexRm_Lx , E(F30F00,7A,_,x,_,1,4,FV ), 0 , 150, 0 , 245, 155), // #958
- INST(Vcvtuqq2ph , VexRm_Lx , E(F2MAP5,7A,_,_,_,1,4,FV ), 0 , 166, 0 , 244, 146), // #959
- INST(Vcvtuqq2ps , VexRm_Lx_Narrow , E(F20F00,7A,_,x,_,1,4,FV ), 0 , 167, 0 , 246, 155), // #960
- INST(Vcvtusi2sd , VexRvm_Wx , E(F20F00,7B,_,I,_,x,2,T1W), 0 , 168, 0 , 281, 78 ), // #961
- INST(Vcvtusi2sh , VexRvm_Wx , E(F3MAP5,7B,_,_,_,x,2,T1W), 0 , 157, 0 , 263, 148), // #962
- INST(Vcvtusi2ss , VexRvm_Wx , E(F30F00,7B,_,I,_,x,2,T1W), 0 , 169, 0 , 281, 78 ), // #963
- INST(Vcvtuw2ph , VexRm_Lx , E(F2MAP5,7D,_,_,_,0,4,FV ), 0 , 164, 0 , 252, 146), // #964
- INST(Vcvtw2ph , VexRm_Lx , E(F3MAP5,7D,_,_,_,0,4,FV ), 0 , 170, 0 , 252, 146), // #965
- INST(Vdbpsadbw , VexRvmi_Lx , E(660F3A,42,_,x,_,0,4,FVM), 0 , 112, 0 , 282, 163), // #966
- INST(Vdivpd , VexRvm_Lx , V(660F00,5E,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #967
- INST(Vdivph , VexRvm_Lx , E(00MAP5,5E,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #968
- INST(Vdivps , VexRvm_Lx , V(000F00,5E,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #969
- INST(Vdivsd , VexRvm , V(F20F00,5E,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #970
- INST(Vdivsh , VexRvm , E(F3MAP5,5E,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #971
- INST(Vdivss , VexRvm , V(F30F00,5E,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #972
- INST(Vdpbf16ps , VexRvm_Lx , E(F30F38,52,_,_,_,0,4,FV ), 0 , 171, 0 , 218, 160), // #973
- INST(Vdppd , VexRvmi_Lx , V(660F3A,41,_,x,I,_,_,_ ), 0 , 75 , 0 , 283, 149), // #974
- INST(Vdpps , VexRvmi_Lx , V(660F3A,40,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 149), // #975
- INST(Verr , X86M_NoSize , O(000F00,00,4,_,_,_,_,_ ), 0 , 98 , 0 , 112, 11 ), // #976
- INST(Verw , X86M_NoSize , O(000F00,00,5,_,_,_,_,_ ), 0 , 79 , 0 , 112, 11 ), // #977
- INST(Vexp2pd , VexRm , E(660F38,C8,_,2,_,1,4,FV ), 0 , 172, 0 , 284, 164), // #978
- INST(Vexp2ps , VexRm , E(660F38,C8,_,2,_,0,4,FV ), 0 , 173, 0 , 285, 164), // #979
- INST(Vexpandpd , VexRm_Lx , E(660F38,88,_,x,_,1,3,T1S), 0 , 129, 0 , 286, 152), // #980
- INST(Vexpandps , VexRm_Lx , E(660F38,88,_,x,_,0,2,T1S), 0 , 130, 0 , 286, 152), // #981
- INST(Vextractf128 , VexMri , V(660F3A,19,_,1,0,_,_,_ ), 0 , 174, 0 , 287, 149), // #982
- INST(Vextractf32x4 , VexMri_Lx , E(660F3A,19,_,x,_,0,4,T4 ), 0 , 175, 0 , 288, 152), // #983
- INST(Vextractf32x8 , VexMri , E(660F3A,1B,_,2,_,0,5,T8 ), 0 , 176, 0 , 289, 76 ), // #984
- INST(Vextractf64x2 , VexMri_Lx , E(660F3A,19,_,x,_,1,4,T2 ), 0 , 177, 0 , 288, 155), // #985
- INST(Vextractf64x4 , VexMri , E(660F3A,1B,_,2,_,1,5,T4 ), 0 , 178, 0 , 289, 78 ), // #986
- INST(Vextracti128 , VexMri , V(660F3A,39,_,1,0,_,_,_ ), 0 , 174, 0 , 287, 156), // #987
- INST(Vextracti32x4 , VexMri_Lx , E(660F3A,39,_,x,_,0,4,T4 ), 0 , 175, 0 , 288, 152), // #988
- INST(Vextracti32x8 , VexMri , E(660F3A,3B,_,2,_,0,5,T8 ), 0 , 176, 0 , 289, 76 ), // #989
- INST(Vextracti64x2 , VexMri_Lx , E(660F3A,39,_,x,_,1,4,T2 ), 0 , 177, 0 , 288, 155), // #990
- INST(Vextracti64x4 , VexMri , E(660F3A,3B,_,2,_,1,5,T4 ), 0 , 178, 0 , 289, 78 ), // #991
- INST(Vextractps , VexMri , V(660F3A,17,_,0,I,I,2,T1S), 0 , 179, 0 , 290, 147), // #992
- INST(Vfcmaddcph , VexRvm_Lx , E(F2MAP6,56,_,_,_,0,4,FV ), 0 , 180, 0 , 291, 146), // #993
- INST(Vfcmaddcsh , VexRvm , E(F2MAP6,57,_,_,_,0,2,T1S), 0 , 181, 0 , 265, 148), // #994
- INST(Vfcmulcph , VexRvm_Lx , E(F2MAP6,D6,_,_,_,0,4,FV ), 0 , 180, 0 , 291, 146), // #995
- INST(Vfcmulcsh , VexRvm , E(F2MAP6,D7,_,_,_,0,2,T1S), 0 , 181, 0 , 265, 148), // #996
- INST(Vfixupimmpd , VexRvmi_Lx , E(660F3A,54,_,x,_,1,4,FV ), 0 , 113, 0 , 292, 152), // #997
- INST(Vfixupimmps , VexRvmi_Lx , E(660F3A,54,_,x,_,0,4,FV ), 0 , 112, 0 , 293, 152), // #998
- INST(Vfixupimmsd , VexRvmi , E(660F3A,55,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 78 ), // #999
- INST(Vfixupimmss , VexRvmi , E(660F3A,55,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 78 ), // #1000
- INST(Vfmadd132pd , VexRvm_Lx , V(660F38,98,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1001
- INST(Vfmadd132ph , VexRvm_Lx , E(66MAP6,98,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1002
- INST(Vfmadd132ps , VexRvm_Lx , V(660F38,98,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1003
- INST(Vfmadd132sd , VexRvm , V(660F38,99,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1004
- INST(Vfmadd132sh , VexRvm , E(66MAP6,99,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1005
- INST(Vfmadd132ss , VexRvm , V(660F38,99,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1006
- INST(Vfmadd213pd , VexRvm_Lx , V(660F38,A8,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1007
- INST(Vfmadd213ph , VexRvm_Lx , E(66MAP6,A8,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1008
- INST(Vfmadd213ps , VexRvm_Lx , V(660F38,A8,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1009
- INST(Vfmadd213sd , VexRvm , V(660F38,A9,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1010
- INST(Vfmadd213sh , VexRvm , E(66MAP6,A9,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1011
- INST(Vfmadd213ss , VexRvm , V(660F38,A9,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1012
- INST(Vfmadd231pd , VexRvm_Lx , V(660F38,B8,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1013
- INST(Vfmadd231ph , VexRvm_Lx , E(66MAP6,B8,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1014
- INST(Vfmadd231ps , VexRvm_Lx , V(660F38,B8,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1015
- INST(Vfmadd231sd , VexRvm , V(660F38,B9,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1016
- INST(Vfmadd231sh , VexRvm , E(66MAP6,B9,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1017
- INST(Vfmadd231ss , VexRvm , V(660F38,B9,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1018
- INST(Vfmaddcph , VexRvm_Lx , E(F3MAP6,56,_,_,_,0,4,FV ), 0 , 188, 0 , 291, 146), // #1019
- INST(Vfmaddcsh , VexRvm , E(F3MAP6,57,_,_,_,0,2,T1S), 0 , 189, 0 , 265, 148), // #1020
- INST(Vfmaddpd , Fma4_Lx , V(660F3A,69,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1021
- INST(Vfmaddps , Fma4_Lx , V(660F3A,68,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1022
- INST(Vfmaddsd , Fma4 , V(660F3A,6B,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1023
- INST(Vfmaddss , Fma4 , V(660F3A,6A,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1024
- INST(Vfmaddsub132pd , VexRvm_Lx , V(660F38,96,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1025
- INST(Vfmaddsub132ph , VexRvm_Lx , E(66MAP6,96,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1026
- INST(Vfmaddsub132ps , VexRvm_Lx , V(660F38,96,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1027
- INST(Vfmaddsub213pd , VexRvm_Lx , V(660F38,A6,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1028
- INST(Vfmaddsub213ph , VexRvm_Lx , E(66MAP6,A6,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1029
- INST(Vfmaddsub213ps , VexRvm_Lx , V(660F38,A6,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1030
- INST(Vfmaddsub231pd , VexRvm_Lx , V(660F38,B6,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1031
- INST(Vfmaddsub231ph , VexRvm_Lx , E(66MAP6,B6,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1032
- INST(Vfmaddsub231ps , VexRvm_Lx , V(660F38,B6,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1033
- INST(Vfmaddsubpd , Fma4_Lx , V(660F3A,5D,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1034
- INST(Vfmaddsubps , Fma4_Lx , V(660F3A,5C,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1035
- INST(Vfmsub132pd , VexRvm_Lx , V(660F38,9A,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1036
- INST(Vfmsub132ph , VexRvm_Lx , E(66MAP6,9A,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1037
- INST(Vfmsub132ps , VexRvm_Lx , V(660F38,9A,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1038
- INST(Vfmsub132sd , VexRvm , V(660F38,9B,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1039
- INST(Vfmsub132sh , VexRvm , E(66MAP6,9B,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1040
- INST(Vfmsub132ss , VexRvm , V(660F38,9B,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1041
- INST(Vfmsub213pd , VexRvm_Lx , V(660F38,AA,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1042
- INST(Vfmsub213ph , VexRvm_Lx , E(66MAP6,AA,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1043
- INST(Vfmsub213ps , VexRvm_Lx , V(660F38,AA,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1044
- INST(Vfmsub213sd , VexRvm , V(660F38,AB,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1045
- INST(Vfmsub213sh , VexRvm , E(66MAP6,AB,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1046
- INST(Vfmsub213ss , VexRvm , V(660F38,AB,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1047
- INST(Vfmsub231pd , VexRvm_Lx , V(660F38,BA,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1048
- INST(Vfmsub231ph , VexRvm_Lx , E(66MAP6,BA,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1049
- INST(Vfmsub231ps , VexRvm_Lx , V(660F38,BA,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1050
- INST(Vfmsub231sd , VexRvm , V(660F38,BB,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1051
- INST(Vfmsub231sh , VexRvm , E(66MAP6,BB,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1052
- INST(Vfmsub231ss , VexRvm , V(660F38,BB,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1053
- INST(Vfmsubadd132pd , VexRvm_Lx , V(660F38,97,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1054
- INST(Vfmsubadd132ph , VexRvm_Lx , E(66MAP6,97,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1055
- INST(Vfmsubadd132ps , VexRvm_Lx , V(660F38,97,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1056
- INST(Vfmsubadd213pd , VexRvm_Lx , V(660F38,A7,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1057
- INST(Vfmsubadd213ph , VexRvm_Lx , E(66MAP6,A7,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1058
- INST(Vfmsubadd213ps , VexRvm_Lx , V(660F38,A7,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1059
- INST(Vfmsubadd231pd , VexRvm_Lx , V(660F38,B7,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1060
- INST(Vfmsubadd231ph , VexRvm_Lx , E(66MAP6,B7,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1061
- INST(Vfmsubadd231ps , VexRvm_Lx , V(660F38,B7,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1062
- INST(Vfmsubaddpd , Fma4_Lx , V(660F3A,5F,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1063
- INST(Vfmsubaddps , Fma4_Lx , V(660F3A,5E,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1064
- INST(Vfmsubpd , Fma4_Lx , V(660F3A,6D,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1065
- INST(Vfmsubps , Fma4_Lx , V(660F3A,6C,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1066
- INST(Vfmsubsd , Fma4 , V(660F3A,6F,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1067
- INST(Vfmsubss , Fma4 , V(660F3A,6E,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1068
- INST(Vfmulcph , VexRvm_Lx , E(F3MAP6,D6,_,_,_,0,4,FV ), 0 , 188, 0 , 291, 146), // #1069
- INST(Vfmulcsh , VexRvm , E(F3MAP6,D7,_,_,_,0,2,T1S), 0 , 189, 0 , 265, 146), // #1070
- INST(Vfnmadd132pd , VexRvm_Lx , V(660F38,9C,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1071
- INST(Vfnmadd132ph , VexRvm_Lx , E(66MAP6,9C,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1072
- INST(Vfnmadd132ps , VexRvm_Lx , V(660F38,9C,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1073
- INST(Vfnmadd132sd , VexRvm , V(660F38,9D,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1074
- INST(Vfnmadd132sh , VexRvm , E(66MAP6,9D,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1075
- INST(Vfnmadd132ss , VexRvm , V(660F38,9D,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1076
- INST(Vfnmadd213pd , VexRvm_Lx , V(660F38,AC,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1077
- INST(Vfnmadd213ph , VexRvm_Lx , E(66MAP6,AC,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1078
- INST(Vfnmadd213ps , VexRvm_Lx , V(660F38,AC,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1079
- INST(Vfnmadd213sd , VexRvm , V(660F38,AD,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1080
- INST(Vfnmadd213sh , VexRvm , E(66MAP6,AD,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1081
- INST(Vfnmadd213ss , VexRvm , V(660F38,AD,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1082
- INST(Vfnmadd231pd , VexRvm_Lx , V(660F38,BC,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1083
- INST(Vfnmadd231ph , VexRvm_Lx , E(66MAP6,BC,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1084
- INST(Vfnmadd231ps , VexRvm_Lx , V(660F38,BC,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1085
- INST(Vfnmadd231sd , VexRvm , V(660F38,BD,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1086
- INST(Vfnmadd231sh , VexRvm , E(66MAP6,BD,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1087
- INST(Vfnmadd231ss , VexRvm , V(660F38,BD,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1088
- INST(Vfnmaddpd , Fma4_Lx , V(660F3A,79,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1089
- INST(Vfnmaddps , Fma4_Lx , V(660F3A,78,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1090
- INST(Vfnmaddsd , Fma4 , V(660F3A,7B,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1091
- INST(Vfnmaddss , Fma4 , V(660F3A,7A,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1092
- INST(Vfnmsub132pd , VexRvm_Lx , V(660F38,9E,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1093
- INST(Vfnmsub132ph , VexRvm_Lx , E(66MAP6,9E,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1094
- INST(Vfnmsub132ps , VexRvm_Lx , V(660F38,9E,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1095
- INST(Vfnmsub132sd , VexRvm , V(660F38,9F,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1096
- INST(Vfnmsub132sh , VexRvm , E(66MAP6,9F,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1097
- INST(Vfnmsub132ss , VexRvm , V(660F38,9F,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1098
- INST(Vfnmsub213pd , VexRvm_Lx , V(660F38,AE,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1099
- INST(Vfnmsub213ph , VexRvm_Lx , E(66MAP6,AE,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1100
- INST(Vfnmsub213ps , VexRvm_Lx , V(660F38,AE,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1101
- INST(Vfnmsub213sd , VexRvm , V(660F38,AF,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1102
- INST(Vfnmsub213sh , VexRvm , E(66MAP6,AF,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1103
- INST(Vfnmsub213ss , VexRvm , V(660F38,AF,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1104
- INST(Vfnmsub231pd , VexRvm_Lx , V(660F38,BE,_,x,1,1,4,FV ), 0 , 184, 0 , 200, 165), // #1105
- INST(Vfnmsub231ph , VexRvm_Lx , E(66MAP6,BE,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1106
- INST(Vfnmsub231ps , VexRvm_Lx , V(660F38,BE,_,x,0,0,4,FV ), 0 , 111, 0 , 202, 165), // #1107
- INST(Vfnmsub231sd , VexRvm , V(660F38,BF,_,I,1,1,3,T1S), 0 , 186, 0 , 203, 166), // #1108
- INST(Vfnmsub231sh , VexRvm , E(66MAP6,BF,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1109
- INST(Vfnmsub231ss , VexRvm , V(660F38,BF,_,I,0,0,2,T1S), 0 , 123, 0 , 205, 166), // #1110
- INST(Vfnmsubpd , Fma4_Lx , V(660F3A,7D,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1111
- INST(Vfnmsubps , Fma4_Lx , V(660F3A,7C,_,x,x,_,_,_ ), 0 , 75 , 0 , 296, 167), // #1112
- INST(Vfnmsubsd , Fma4 , V(660F3A,7F,_,0,x,_,_,_ ), 0 , 75 , 0 , 297, 167), // #1113
- INST(Vfnmsubss , Fma4 , V(660F3A,7E,_,0,x,_,_,_ ), 0 , 75 , 0 , 298, 167), // #1114
- INST(Vfpclasspd , VexRmi_Lx , E(660F3A,66,_,x,_,1,4,FV ), 0 , 113, 0 , 299, 155), // #1115
- INST(Vfpclassph , VexRmi_Lx , E(000F3A,66,_,_,_,0,4,FV ), 0 , 124, 0 , 300, 146), // #1116
- INST(Vfpclassps , VexRmi_Lx , E(660F3A,66,_,x,_,0,4,FV ), 0 , 112, 0 , 301, 155), // #1117
- INST(Vfpclasssd , VexRmi , E(660F3A,67,_,I,_,1,3,T1S), 0 , 182, 0 , 302, 76 ), // #1118
- INST(Vfpclasssh , VexRmi , E(000F3A,67,_,_,_,0,1,T1S), 0 , 190, 0 , 303, 148), // #1119
- INST(Vfpclassss , VexRmi , E(660F3A,67,_,I,_,0,2,T1S), 0 , 183, 0 , 304, 76 ), // #1120
- INST(Vfrczpd , VexRm_Lx , V(XOP_M9,81,_,x,0,_,_,_ ), 0 , 81 , 0 , 305, 168), // #1121
- INST(Vfrczps , VexRm_Lx , V(XOP_M9,80,_,x,0,_,_,_ ), 0 , 81 , 0 , 305, 168), // #1122
- INST(Vfrczsd , VexRm , V(XOP_M9,83,_,0,0,_,_,_ ), 0 , 81 , 0 , 306, 168), // #1123
- INST(Vfrczss , VexRm , V(XOP_M9,82,_,0,0,_,_,_ ), 0 , 81 , 0 , 307, 168), // #1124
- INST(Vgatherdpd , VexRmvRm_VM , V(660F38,92,_,x,1,_,_,_ ), E(660F38,92,_,x,_,1,3,T1S), 191, 80 , 308, 169), // #1125
- INST(Vgatherdps , VexRmvRm_VM , V(660F38,92,_,x,0,_,_,_ ), E(660F38,92,_,x,_,0,2,T1S), 30 , 81 , 309, 169), // #1126
- INST(Vgatherpf0dpd , VexM_VM , E(660F38,C6,1,2,_,1,3,T1S), 0 , 192, 0 , 310, 170), // #1127
- INST(Vgatherpf0dps , VexM_VM , E(660F38,C6,1,2,_,0,2,T1S), 0 , 193, 0 , 311, 170), // #1128
- INST(Vgatherpf0qpd , VexM_VM , E(660F38,C7,1,2,_,1,3,T1S), 0 , 192, 0 , 312, 170), // #1129
- INST(Vgatherpf0qps , VexM_VM , E(660F38,C7,1,2,_,0,2,T1S), 0 , 193, 0 , 312, 170), // #1130
- INST(Vgatherpf1dpd , VexM_VM , E(660F38,C6,2,2,_,1,3,T1S), 0 , 194, 0 , 310, 170), // #1131
- INST(Vgatherpf1dps , VexM_VM , E(660F38,C6,2,2,_,0,2,T1S), 0 , 195, 0 , 311, 170), // #1132
- INST(Vgatherpf1qpd , VexM_VM , E(660F38,C7,2,2,_,1,3,T1S), 0 , 194, 0 , 312, 170), // #1133
- INST(Vgatherpf1qps , VexM_VM , E(660F38,C7,2,2,_,0,2,T1S), 0 , 195, 0 , 312, 170), // #1134
- INST(Vgatherqpd , VexRmvRm_VM , V(660F38,93,_,x,1,_,_,_ ), E(660F38,93,_,x,_,1,3,T1S), 191, 82 , 313, 169), // #1135
- INST(Vgatherqps , VexRmvRm_VM , V(660F38,93,_,x,0,_,_,_ ), E(660F38,93,_,x,_,0,2,T1S), 30 , 83 , 314, 169), // #1136
- INST(Vgetexppd , VexRm_Lx , E(660F38,42,_,x,_,1,4,FV ), 0 , 114, 0 , 269, 152), // #1137
- INST(Vgetexpph , VexRm_Lx , E(66MAP6,42,_,_,_,0,4,FV ), 0 , 185, 0 , 271, 146), // #1138
- INST(Vgetexpps , VexRm_Lx , E(660F38,42,_,x,_,0,4,FV ), 0 , 115, 0 , 274, 152), // #1139
- INST(Vgetexpsd , VexRvm , E(660F38,43,_,I,_,1,3,T1S), 0 , 129, 0 , 315, 78 ), // #1140
- INST(Vgetexpsh , VexRvm , E(66MAP6,43,_,_,_,0,1,T1S), 0 , 187, 0 , 260, 148), // #1141
- INST(Vgetexpss , VexRvm , E(660F38,43,_,I,_,0,2,T1S), 0 , 130, 0 , 316, 78 ), // #1142
- INST(Vgetmantpd , VexRmi_Lx , E(660F3A,26,_,x,_,1,4,FV ), 0 , 113, 0 , 317, 152), // #1143
- INST(Vgetmantph , VexRmi_Lx , E(000F3A,26,_,_,_,0,4,FV ), 0 , 124, 0 , 318, 146), // #1144
- INST(Vgetmantps , VexRmi_Lx , E(660F3A,26,_,x,_,0,4,FV ), 0 , 112, 0 , 319, 152), // #1145
- INST(Vgetmantsd , VexRvmi , E(660F3A,27,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 78 ), // #1146
- INST(Vgetmantsh , VexRvmi , E(000F3A,27,_,_,_,0,1,T1S), 0 , 190, 0 , 320, 148), // #1147
- INST(Vgetmantss , VexRvmi , E(660F3A,27,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 78 ), // #1148
- INST(Vgf2p8affineinvqb, VexRvmi_Lx , V(660F3A,CF,_,x,1,1,4,FV ), 0 , 196, 0 , 321, 171), // #1149
- INST(Vgf2p8affineqb , VexRvmi_Lx , V(660F3A,CE,_,x,1,1,4,FV ), 0 , 196, 0 , 321, 171), // #1150
- INST(Vgf2p8mulb , VexRvm_Lx , V(660F38,CF,_,x,0,0,4,FV ), 0 , 111, 0 , 322, 171), // #1151
- INST(Vhaddpd , VexRvm_Lx , V(660F00,7C,_,x,I,_,_,_ ), 0 , 71 , 0 , 206, 149), // #1152
- INST(Vhaddps , VexRvm_Lx , V(F20F00,7C,_,x,I,_,_,_ ), 0 , 110, 0 , 206, 149), // #1153
- INST(Vhsubpd , VexRvm_Lx , V(660F00,7D,_,x,I,_,_,_ ), 0 , 71 , 0 , 206, 149), // #1154
- INST(Vhsubps , VexRvm_Lx , V(F20F00,7D,_,x,I,_,_,_ ), 0 , 110, 0 , 206, 149), // #1155
- INST(Vinsertf128 , VexRvmi , V(660F3A,18,_,1,0,_,_,_ ), 0 , 174, 0 , 323, 149), // #1156
- INST(Vinsertf32x4 , VexRvmi_Lx , E(660F3A,18,_,x,_,0,4,T4 ), 0 , 175, 0 , 324, 152), // #1157
- INST(Vinsertf32x8 , VexRvmi , E(660F3A,1A,_,2,_,0,5,T8 ), 0 , 176, 0 , 325, 76 ), // #1158
- INST(Vinsertf64x2 , VexRvmi_Lx , E(660F3A,18,_,x,_,1,4,T2 ), 0 , 177, 0 , 324, 155), // #1159
- INST(Vinsertf64x4 , VexRvmi , E(660F3A,1A,_,2,_,1,5,T4 ), 0 , 178, 0 , 325, 78 ), // #1160
- INST(Vinserti128 , VexRvmi , V(660F3A,38,_,1,0,_,_,_ ), 0 , 174, 0 , 323, 156), // #1161
- INST(Vinserti32x4 , VexRvmi_Lx , E(660F3A,38,_,x,_,0,4,T4 ), 0 , 175, 0 , 324, 152), // #1162
- INST(Vinserti32x8 , VexRvmi , E(660F3A,3A,_,2,_,0,5,T8 ), 0 , 176, 0 , 325, 76 ), // #1163
- INST(Vinserti64x2 , VexRvmi_Lx , E(660F3A,38,_,x,_,1,4,T2 ), 0 , 177, 0 , 324, 155), // #1164
- INST(Vinserti64x4 , VexRvmi , E(660F3A,3A,_,2,_,1,5,T4 ), 0 , 178, 0 , 325, 78 ), // #1165
- INST(Vinsertps , VexRvmi , V(660F3A,21,_,0,I,0,2,T1S), 0 , 179, 0 , 326, 147), // #1166
- INST(Vlddqu , VexRm_Lx , V(F20F00,F0,_,x,I,_,_,_ ), 0 , 110, 0 , 241, 149), // #1167
- INST(Vldmxcsr , VexM , V(000F00,AE,2,0,I,_,_,_ ), 0 , 197, 0 , 327, 149), // #1168
- INST(Vmaskmovdqu , VexRm_ZDI , V(660F00,F7,_,0,I,_,_,_ ), 0 , 71 , 0 , 328, 149), // #1169
- INST(Vmaskmovpd , VexRvmMvr_Lx , V(660F38,2D,_,x,0,_,_,_ ), V(660F38,2F,_,x,0,_,_,_ ), 30 , 84 , 329, 149), // #1170
- INST(Vmaskmovps , VexRvmMvr_Lx , V(660F38,2C,_,x,0,_,_,_ ), V(660F38,2E,_,x,0,_,_,_ ), 30 , 85 , 329, 149), // #1171
- INST(Vmaxpd , VexRvm_Lx , V(660F00,5F,_,x,I,1,4,FV ), 0 , 104, 0 , 330, 145), // #1172
- INST(Vmaxph , VexRvm_Lx , E(00MAP5,5F,_,_,_,0,4,FV ), 0 , 105, 0 , 331, 146), // #1173
- INST(Vmaxps , VexRvm_Lx , V(000F00,5F,_,x,I,0,4,FV ), 0 , 106, 0 , 332, 145), // #1174
- INST(Vmaxsd , VexRvm , V(F20F00,5F,_,I,I,1,3,T1S), 0 , 107, 0 , 333, 147), // #1175
- INST(Vmaxsh , VexRvm , E(F3MAP5,5F,_,_,_,0,1,T1S), 0 , 108, 0 , 260, 148), // #1176
- INST(Vmaxss , VexRvm , V(F30F00,5F,_,I,I,0,2,T1S), 0 , 109, 0 , 264, 147), // #1177
- INST(Vmcall , X86Op , O(000F01,C1,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1178
- INST(Vmclear , X86M_Only , O(660F00,C7,6,_,_,_,_,_ ), 0 , 28 , 0 , 33 , 67 ), // #1179
- INST(Vmfunc , X86Op , O(000F01,D4,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1180
- INST(Vmgexit , X86Op , O(F20F01,D9,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 172), // #1181
- INST(Vminpd , VexRvm_Lx , V(660F00,5D,_,x,I,1,4,FV ), 0 , 104, 0 , 330, 145), // #1182
- INST(Vminph , VexRvm_Lx , E(00MAP5,5D,_,_,_,0,4,FV ), 0 , 105, 0 , 331, 146), // #1183
- INST(Vminps , VexRvm_Lx , V(000F00,5D,_,x,I,0,4,FV ), 0 , 106, 0 , 332, 145), // #1184
- INST(Vminsd , VexRvm , V(F20F00,5D,_,I,I,1,3,T1S), 0 , 107, 0 , 333, 147), // #1185
- INST(Vminsh , VexRvm , E(F3MAP5,5D,_,_,_,0,1,T1S), 0 , 108, 0 , 260, 148), // #1186
- INST(Vminss , VexRvm , V(F30F00,5D,_,I,I,0,2,T1S), 0 , 109, 0 , 264, 147), // #1187
- INST(Vmlaunch , X86Op , O(000F01,C2,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1188
- INST(Vmload , X86Op_xAX , O(000F01,DA,_,_,_,_,_,_ ), 0 , 23 , 0 , 334, 23 ), // #1189
- INST(Vmmcall , X86Op , O(000F01,D9,_,_,_,_,_,_ ), 0 , 23 , 0 , 335, 23 ), // #1190
- INST(Vmovapd , VexRmMr_Lx , V(660F00,28,_,x,I,1,4,FVM), V(660F00,29,_,x,I,1,4,FVM), 104, 86 , 336, 173), // #1191
- INST(Vmovaps , VexRmMr_Lx , V(000F00,28,_,x,I,0,4,FVM), V(000F00,29,_,x,I,0,4,FVM), 106, 87 , 336, 173), // #1192
- INST(Vmovd , VexMovdMovq , V(660F00,6E,_,0,0,0,2,T1S), V(660F00,7E,_,0,0,0,2,T1S), 198, 88 , 337, 147), // #1193
- INST(Vmovddup , VexRm_Lx , V(F20F00,12,_,x,I,1,3,DUP), 0 , 199, 0 , 338, 145), // #1194
- INST(Vmovdqa , VexRmMr_Lx , V(660F00,6F,_,x,I,_,_,_ ), V(660F00,7F,_,x,I,_,_,_ ), 71 , 89 , 339, 174), // #1195
- INST(Vmovdqa32 , VexRmMr_Lx , E(660F00,6F,_,x,_,0,4,FVM), E(660F00,7F,_,x,_,0,4,FVM), 200, 90 , 340, 175), // #1196
- INST(Vmovdqa64 , VexRmMr_Lx , E(660F00,6F,_,x,_,1,4,FVM), E(660F00,7F,_,x,_,1,4,FVM), 136, 91 , 340, 175), // #1197
- INST(Vmovdqu , VexRmMr_Lx , V(F30F00,6F,_,x,I,_,_,_ ), V(F30F00,7F,_,x,I,_,_,_ ), 201, 92 , 339, 174), // #1198
- INST(Vmovdqu16 , VexRmMr_Lx , E(F20F00,6F,_,x,_,1,4,FVM), E(F20F00,7F,_,x,_,1,4,FVM), 167, 93 , 340, 176), // #1199
- INST(Vmovdqu32 , VexRmMr_Lx , E(F30F00,6F,_,x,_,0,4,FVM), E(F30F00,7F,_,x,_,0,4,FVM), 202, 94 , 340, 175), // #1200
- INST(Vmovdqu64 , VexRmMr_Lx , E(F30F00,6F,_,x,_,1,4,FVM), E(F30F00,7F,_,x,_,1,4,FVM), 150, 95 , 340, 175), // #1201
- INST(Vmovdqu8 , VexRmMr_Lx , E(F20F00,6F,_,x,_,0,4,FVM), E(F20F00,7F,_,x,_,0,4,FVM), 165, 96 , 340, 176), // #1202
- INST(Vmovhlps , VexRvm , V(000F00,12,_,0,I,0,_,_ ), 0 , 74 , 0 , 341, 147), // #1203
- INST(Vmovhpd , VexRvmMr , V(660F00,16,_,0,I,1,3,T1S), V(660F00,17,_,0,I,1,3,T1S), 126, 97 , 342, 147), // #1204
- INST(Vmovhps , VexRvmMr , V(000F00,16,_,0,I,0,3,T2 ), V(000F00,17,_,0,I,0,3,T2 ), 203, 98 , 342, 147), // #1205
- INST(Vmovlhps , VexRvm , V(000F00,16,_,0,I,0,_,_ ), 0 , 74 , 0 , 341, 147), // #1206
- INST(Vmovlpd , VexRvmMr , V(660F00,12,_,0,I,1,3,T1S), V(660F00,13,_,0,I,1,3,T1S), 126, 99 , 342, 147), // #1207
- INST(Vmovlps , VexRvmMr , V(000F00,12,_,0,I,0,3,T2 ), V(000F00,13,_,0,I,0,3,T2 ), 203, 100, 342, 147), // #1208
- INST(Vmovmskpd , VexRm_Lx , V(660F00,50,_,x,I,_,_,_ ), 0 , 71 , 0 , 343, 149), // #1209
- INST(Vmovmskps , VexRm_Lx , V(000F00,50,_,x,I,_,_,_ ), 0 , 74 , 0 , 343, 149), // #1210
- INST(Vmovntdq , VexMr_Lx , V(660F00,E7,_,x,I,0,4,FVM), 0 , 145, 0 , 344, 145), // #1211
- INST(Vmovntdqa , VexRm_Lx , V(660F38,2A,_,x,I,0,4,FVM), 0 , 111, 0 , 345, 157), // #1212
- INST(Vmovntpd , VexMr_Lx , V(660F00,2B,_,x,I,1,4,FVM), 0 , 104, 0 , 344, 145), // #1213
- INST(Vmovntps , VexMr_Lx , V(000F00,2B,_,x,I,0,4,FVM), 0 , 106, 0 , 344, 145), // #1214
- INST(Vmovq , VexMovdMovq , V(660F00,6E,_,0,I,1,3,T1S), V(660F00,7E,_,0,I,1,3,T1S), 126, 101, 346, 177), // #1215
- INST(Vmovsd , VexMovssMovsd , V(F20F00,10,_,I,I,1,3,T1S), V(F20F00,11,_,I,I,1,3,T1S), 107, 102, 347, 177), // #1216
- INST(Vmovsh , VexMovssMovsd , E(F3MAP5,10,_,I,_,0,1,T1S), E(F3MAP5,11,_,I,_,0,1,T1S), 108, 103, 348, 148), // #1217
- INST(Vmovshdup , VexRm_Lx , V(F30F00,16,_,x,I,0,4,FVM), 0 , 162, 0 , 349, 145), // #1218
- INST(Vmovsldup , VexRm_Lx , V(F30F00,12,_,x,I,0,4,FVM), 0 , 162, 0 , 349, 145), // #1219
- INST(Vmovss , VexMovssMovsd , V(F30F00,10,_,I,I,0,2,T1S), V(F30F00,11,_,I,I,0,2,T1S), 109, 104, 350, 177), // #1220
- INST(Vmovupd , VexRmMr_Lx , V(660F00,10,_,x,I,1,4,FVM), V(660F00,11,_,x,I,1,4,FVM), 104, 105, 336, 173), // #1221
- INST(Vmovups , VexRmMr_Lx , V(000F00,10,_,x,I,0,4,FVM), V(000F00,11,_,x,I,0,4,FVM), 106, 106, 336, 173), // #1222
- INST(Vmovw , VexMovdMovq , E(66MAP5,6E,_,0,_,I,1,T1S), E(66MAP5,7E,_,0,_,I,1,T1S), 204, 107, 351, 148), // #1223
- INST(Vmpsadbw , VexRvmi_Lx , V(660F3A,42,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 178), // #1224
- INST(Vmptrld , X86M_Only , O(000F00,C7,6,_,_,_,_,_ ), 0 , 82 , 0 , 33 , 67 ), // #1225
- INST(Vmptrst , X86M_Only , O(000F00,C7,7,_,_,_,_,_ ), 0 , 24 , 0 , 33 , 67 ), // #1226
- INST(Vmread , X86Mr_NoSize , O(000F00,78,_,_,_,_,_,_ ), 0 , 5 , 0 , 352, 67 ), // #1227
- INST(Vmresume , X86Op , O(000F01,C3,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1228
- INST(Vmrun , X86Op_xAX , O(000F01,D8,_,_,_,_,_,_ ), 0 , 23 , 0 , 334, 23 ), // #1229
- INST(Vmsave , X86Op_xAX , O(000F01,DB,_,_,_,_,_,_ ), 0 , 23 , 0 , 334, 23 ), // #1230
- INST(Vmulpd , VexRvm_Lx , V(660F00,59,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #1231
- INST(Vmulph , VexRvm_Lx , E(00MAP5,59,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #1232
- INST(Vmulps , VexRvm_Lx , V(000F00,59,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #1233
- INST(Vmulsd , VexRvm , V(F20F00,59,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #1234
- INST(Vmulsh , VexRvm , E(F3MAP5,59,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #1235
- INST(Vmulss , VexRvm , V(F30F00,59,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #1236
- INST(Vmwrite , X86Rm_NoSize , O(000F00,79,_,_,_,_,_,_ ), 0 , 5 , 0 , 353, 67 ), // #1237
- INST(Vmxoff , X86Op , O(000F01,C4,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 67 ), // #1238
- INST(Vmxon , X86M_Only , O(F30F00,C7,6,_,_,_,_,_ ), 0 , 26 , 0 , 33 , 67 ), // #1239
- INST(Vorpd , VexRvm_Lx , V(660F00,56,_,x,I,1,4,FV ), 0 , 104, 0 , 214, 153), // #1240
- INST(Vorps , VexRvm_Lx , V(000F00,56,_,x,I,0,4,FV ), 0 , 106, 0 , 215, 153), // #1241
- INST(Vp2intersectd , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,0,4,FV ), 0 , 132, 0 , 354, 179), // #1242
- INST(Vp2intersectq , VexRvm_Lx_2xK , E(F20F38,68,_,_,_,1,4,FV ), 0 , 205, 0 , 355, 179), // #1243
- INST(Vp4dpwssd , VexRm_T1_4X , E(F20F38,52,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 180), // #1244
- INST(Vp4dpwssds , VexRm_T1_4X , E(F20F38,53,_,2,_,0,4,T4X), 0 , 102, 0 , 198, 180), // #1245
- INST(Vpabsb , VexRm_Lx , V(660F38,1C,_,x,I,_,4,FVM), 0 , 111, 0 , 349, 181), // #1246
- INST(Vpabsd , VexRm_Lx , V(660F38,1E,_,x,I,0,4,FV ), 0 , 111, 0 , 356, 157), // #1247
- INST(Vpabsq , VexRm_Lx , E(660F38,1F,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 152), // #1248
- INST(Vpabsw , VexRm_Lx , V(660F38,1D,_,x,I,_,4,FVM), 0 , 111, 0 , 349, 181), // #1249
- INST(Vpackssdw , VexRvm_Lx , V(660F00,6B,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 181), // #1250
- INST(Vpacksswb , VexRvm_Lx , V(660F00,63,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1251
- INST(Vpackusdw , VexRvm_Lx , V(660F38,2B,_,x,I,0,4,FV ), 0 , 111, 0 , 213, 181), // #1252
- INST(Vpackuswb , VexRvm_Lx , V(660F00,67,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1253
- INST(Vpaddb , VexRvm_Lx , V(660F00,FC,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1254
- INST(Vpaddd , VexRvm_Lx , V(660F00,FE,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 157), // #1255
- INST(Vpaddq , VexRvm_Lx , V(660F00,D4,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1256
- INST(Vpaddsb , VexRvm_Lx , V(660F00,EC,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1257
- INST(Vpaddsw , VexRvm_Lx , V(660F00,ED,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1258
- INST(Vpaddusb , VexRvm_Lx , V(660F00,DC,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1259
- INST(Vpaddusw , VexRvm_Lx , V(660F00,DD,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1260
- INST(Vpaddw , VexRvm_Lx , V(660F00,FD,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1261
- INST(Vpalignr , VexRvmi_Lx , V(660F3A,0F,_,x,I,I,4,FVM), 0 , 206, 0 , 321, 181), // #1262
- INST(Vpand , VexRvm_Lx , V(660F00,DB,_,x,I,_,_,_ ), 0 , 71 , 0 , 358, 178), // #1263
- INST(Vpandd , VexRvm_Lx , E(660F00,DB,_,x,_,0,4,FV ), 0 , 200, 0 , 359, 152), // #1264
- INST(Vpandn , VexRvm_Lx , V(660F00,DF,_,x,I,_,_,_ ), 0 , 71 , 0 , 360, 178), // #1265
- INST(Vpandnd , VexRvm_Lx , E(660F00,DF,_,x,_,0,4,FV ), 0 , 200, 0 , 361, 152), // #1266
- INST(Vpandnq , VexRvm_Lx , E(660F00,DF,_,x,_,1,4,FV ), 0 , 136, 0 , 362, 152), // #1267
- INST(Vpandq , VexRvm_Lx , E(660F00,DB,_,x,_,1,4,FV ), 0 , 136, 0 , 363, 152), // #1268
- INST(Vpavgb , VexRvm_Lx , V(660F00,E0,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1269
- INST(Vpavgw , VexRvm_Lx , V(660F00,E3,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1270
- INST(Vpblendd , VexRvmi_Lx , V(660F3A,02,_,x,0,_,_,_ ), 0 , 75 , 0 , 219, 156), // #1271
- INST(Vpblendmb , VexRvm_Lx , E(660F38,66,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 163), // #1272
- INST(Vpblendmd , VexRvm_Lx , E(660F38,64,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1273
- INST(Vpblendmq , VexRvm_Lx , E(660F38,64,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1274
- INST(Vpblendmw , VexRvm_Lx , E(660F38,66,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1275
- INST(Vpblendvb , VexRvmr_Lx , V(660F3A,4C,_,x,0,_,_,_ ), 0 , 75 , 0 , 220, 178), // #1276
- INST(Vpblendw , VexRvmi_Lx , V(660F3A,0E,_,x,I,_,_,_ ), 0 , 75 , 0 , 219, 178), // #1277
- INST(Vpbroadcastb , VexRm_Lx_Bcst , V(660F38,78,_,x,0,0,0,T1S), E(660F38,7A,_,x,0,0,0,T1S), 30 , 108, 365, 182), // #1278
- INST(Vpbroadcastd , VexRm_Lx_Bcst , V(660F38,58,_,x,0,0,2,T1S), E(660F38,7C,_,x,0,0,0,T1S), 123, 109, 366, 169), // #1279
- INST(Vpbroadcastmb2q , VexRm_Lx , E(F30F38,2A,_,x,_,1,_,_ ), 0 , 207, 0 , 367, 183), // #1280
- INST(Vpbroadcastmw2d , VexRm_Lx , E(F30F38,3A,_,x,_,0,_,_ ), 0 , 208, 0 , 367, 183), // #1281
- INST(Vpbroadcastq , VexRm_Lx_Bcst , V(660F38,59,_,x,0,1,3,T1S), E(660F38,7C,_,x,0,1,0,T1S), 122, 110, 368, 169), // #1282
- INST(Vpbroadcastw , VexRm_Lx_Bcst , V(660F38,79,_,x,0,0,1,T1S), E(660F38,7B,_,x,0,0,0,T1S), 209, 111, 369, 182), // #1283
- INST(Vpclmulqdq , VexRvmi_Lx , V(660F3A,44,_,x,I,_,4,FVM), 0 , 206, 0 , 370, 184), // #1284
- INST(Vpcmov , VexRvrmRvmr_Lx , V(XOP_M8,A2,_,x,x,_,_,_ ), 0 , 210, 0 , 296, 168), // #1285
- INST(Vpcmpb , VexRvmi_Lx , E(660F3A,3F,_,x,_,0,4,FVM), 0 , 112, 0 , 371, 163), // #1286
- INST(Vpcmpd , VexRvmi_Lx , E(660F3A,1F,_,x,_,0,4,FV ), 0 , 112, 0 , 372, 152), // #1287
- INST(Vpcmpeqb , VexRvm_Lx_KEvex , V(660F00,74,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1288
- INST(Vpcmpeqd , VexRvm_Lx_KEvex , V(660F00,76,_,x,I,0,4,FVM), 0 , 145, 0 , 374, 157), // #1289
- INST(Vpcmpeqq , VexRvm_Lx_KEvex , V(660F38,29,_,x,I,1,4,FVM), 0 , 211, 0 , 375, 157), // #1290
- INST(Vpcmpeqw , VexRvm_Lx_KEvex , V(660F00,75,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1291
- INST(Vpcmpestri , VexRmi , V(660F3A,61,_,0,I,_,_,_ ), 0 , 75 , 0 , 376, 185), // #1292
- INST(Vpcmpestrm , VexRmi , V(660F3A,60,_,0,I,_,_,_ ), 0 , 75 , 0 , 377, 185), // #1293
- INST(Vpcmpgtb , VexRvm_Lx_KEvex , V(660F00,64,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1294
- INST(Vpcmpgtd , VexRvm_Lx_KEvex , V(660F00,66,_,x,I,0,4,FVM), 0 , 145, 0 , 374, 157), // #1295
- INST(Vpcmpgtq , VexRvm_Lx_KEvex , V(660F38,37,_,x,I,1,4,FVM), 0 , 211, 0 , 375, 157), // #1296
- INST(Vpcmpgtw , VexRvm_Lx_KEvex , V(660F00,65,_,x,I,I,4,FV ), 0 , 145, 0 , 373, 181), // #1297
- INST(Vpcmpistri , VexRmi , V(660F3A,63,_,0,I,_,_,_ ), 0 , 75 , 0 , 378, 185), // #1298
- INST(Vpcmpistrm , VexRmi , V(660F3A,62,_,0,I,_,_,_ ), 0 , 75 , 0 , 379, 185), // #1299
- INST(Vpcmpq , VexRvmi_Lx , E(660F3A,1F,_,x,_,1,4,FV ), 0 , 113, 0 , 380, 152), // #1300
- INST(Vpcmpub , VexRvmi_Lx , E(660F3A,3E,_,x,_,0,4,FVM), 0 , 112, 0 , 371, 163), // #1301
- INST(Vpcmpud , VexRvmi_Lx , E(660F3A,1E,_,x,_,0,4,FV ), 0 , 112, 0 , 372, 152), // #1302
- INST(Vpcmpuq , VexRvmi_Lx , E(660F3A,1E,_,x,_,1,4,FV ), 0 , 113, 0 , 380, 152), // #1303
- INST(Vpcmpuw , VexRvmi_Lx , E(660F3A,3E,_,x,_,1,4,FVM), 0 , 113, 0 , 380, 163), // #1304
- INST(Vpcmpw , VexRvmi_Lx , E(660F3A,3F,_,x,_,1,4,FVM), 0 , 113, 0 , 380, 163), // #1305
- INST(Vpcomb , VexRvmi , V(XOP_M8,CC,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1306
- INST(Vpcomd , VexRvmi , V(XOP_M8,CE,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1307
- INST(Vpcompressb , VexMr_Lx , E(660F38,63,_,x,_,0,0,T1S), 0 , 212, 0 , 237, 186), // #1308
- INST(Vpcompressd , VexMr_Lx , E(660F38,8B,_,x,_,0,2,T1S), 0 , 130, 0 , 237, 152), // #1309
- INST(Vpcompressq , VexMr_Lx , E(660F38,8B,_,x,_,1,3,T1S), 0 , 129, 0 , 237, 152), // #1310
- INST(Vpcompressw , VexMr_Lx , E(660F38,63,_,x,_,1,1,T1S), 0 , 213, 0 , 237, 186), // #1311
- INST(Vpcomq , VexRvmi , V(XOP_M8,CF,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1312
- INST(Vpcomub , VexRvmi , V(XOP_M8,EC,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1313
- INST(Vpcomud , VexRvmi , V(XOP_M8,EE,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1314
- INST(Vpcomuq , VexRvmi , V(XOP_M8,EF,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1315
- INST(Vpcomuw , VexRvmi , V(XOP_M8,ED,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1316
- INST(Vpcomw , VexRvmi , V(XOP_M8,CD,_,0,0,_,_,_ ), 0 , 210, 0 , 283, 168), // #1317
- INST(Vpconflictd , VexRm_Lx , E(660F38,C4,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 183), // #1318
- INST(Vpconflictq , VexRm_Lx , E(660F38,C4,_,x,_,1,4,FV ), 0 , 114, 0 , 381, 183), // #1319
- INST(Vpdpbssd , VexRvm_Lx , V(F20F38,50,_,x,0,_,_,_ ), 0 , 85 , 0 , 206, 187), // #1320
- INST(Vpdpbssds , VexRvm_Lx , V(F20F38,51,_,x,0,_,_,_ ), 0 , 85 , 0 , 206, 187), // #1321
- INST(Vpdpbsud , VexRvm_Lx , V(F30F38,50,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 187), // #1322
- INST(Vpdpbsuds , VexRvm_Lx , V(F30F38,51,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 187), // #1323
- INST(Vpdpbusd , VexRvm_Lx , V(660F38,50,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1324
- INST(Vpdpbusds , VexRvm_Lx , V(660F38,51,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1325
- INST(Vpdpbuud , VexRvm_Lx , V(000F38,50,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 187), // #1326
- INST(Vpdpbuuds , VexRvm_Lx , V(000F38,51,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 187), // #1327
- INST(Vpdpwssd , VexRvm_Lx , V(660F38,52,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1328
- INST(Vpdpwssds , VexRvm_Lx , V(660F38,53,_,x,_,0,4,FV ), 0 , 111, 0 , 382, 188), // #1329
- INST(Vpdpwsud , VexRvm_Lx , V(F30F38,D2,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 189), // #1330
- INST(Vpdpwsuds , VexRvm_Lx , V(F30F38,D3,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 189), // #1331
- INST(Vpdpwusd , VexRvm_Lx , V(660F38,D2,_,x,0,_,_,_ ), 0 , 30 , 0 , 206, 189), // #1332
- INST(Vpdpwusds , VexRvm_Lx , V(660F38,D3,_,x,0,_,_,_ ), 0 , 30 , 0 , 206, 189), // #1333
- INST(Vpdpwuud , VexRvm_Lx , V(000F38,D2,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 189), // #1334
- INST(Vpdpwuuds , VexRvm_Lx , V(000F38,D3,_,x,0,_,_,_ ), 0 , 11 , 0 , 206, 189), // #1335
- INST(Vperm2f128 , VexRvmi , V(660F3A,06,_,1,0,_,_,_ ), 0 , 174, 0 , 383, 149), // #1336
- INST(Vperm2i128 , VexRvmi , V(660F3A,46,_,1,0,_,_,_ ), 0 , 174, 0 , 383, 156), // #1337
- INST(Vpermb , VexRvm_Lx , E(660F38,8D,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 190), // #1338
- INST(Vpermd , VexRvm_Lx , V(660F38,36,_,x,0,0,4,FV ), 0 , 111, 0 , 384, 169), // #1339
- INST(Vpermi2b , VexRvm_Lx , E(660F38,75,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 190), // #1340
- INST(Vpermi2d , VexRvm_Lx , E(660F38,76,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1341
- INST(Vpermi2pd , VexRvm_Lx , E(660F38,77,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1342
- INST(Vpermi2ps , VexRvm_Lx , E(660F38,77,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1343
- INST(Vpermi2q , VexRvm_Lx , E(660F38,76,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1344
- INST(Vpermi2w , VexRvm_Lx , E(660F38,75,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1345
- INST(Vpermil2pd , VexRvrmiRvmri_Lx , V(660F3A,49,_,x,x,_,_,_ ), 0 , 75 , 0 , 385, 168), // #1346
- INST(Vpermil2ps , VexRvrmiRvmri_Lx , V(660F3A,48,_,x,x,_,_,_ ), 0 , 75 , 0 , 385, 168), // #1347
- INST(Vpermilpd , VexRvmRmi_Lx , V(660F38,0D,_,x,0,1,4,FV ), V(660F3A,05,_,x,0,1,4,FV ), 211, 112, 386, 145), // #1348
- INST(Vpermilps , VexRvmRmi_Lx , V(660F38,0C,_,x,0,0,4,FV ), V(660F3A,04,_,x,0,0,4,FV ), 111, 113, 387, 145), // #1349
- INST(Vpermpd , VexRvmRmi_Lx , E(660F38,16,_,x,1,1,4,FV ), V(660F3A,01,_,x,1,1,4,FV ), 214, 114, 388, 169), // #1350
- INST(Vpermps , VexRvm_Lx , V(660F38,16,_,x,0,0,4,FV ), 0 , 111, 0 , 384, 169), // #1351
- INST(Vpermq , VexRvmRmi_Lx , E(660F38,36,_,x,_,1,4,FV ), V(660F3A,00,_,x,1,1,4,FV ), 114, 115, 388, 169), // #1352
- INST(Vpermt2b , VexRvm_Lx , E(660F38,7D,_,x,_,0,4,FVM), 0 , 115, 0 , 364, 190), // #1353
- INST(Vpermt2d , VexRvm_Lx , E(660F38,7E,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1354
- INST(Vpermt2pd , VexRvm_Lx , E(660F38,7F,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1355
- INST(Vpermt2ps , VexRvm_Lx , E(660F38,7F,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1356
- INST(Vpermt2q , VexRvm_Lx , E(660F38,7E,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1357
- INST(Vpermt2w , VexRvm_Lx , E(660F38,7D,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1358
- INST(Vpermw , VexRvm_Lx , E(660F38,8D,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1359
- INST(Vpexpandb , VexRm_Lx , E(660F38,62,_,x,_,0,0,T1S), 0 , 212, 0 , 286, 186), // #1360
- INST(Vpexpandd , VexRm_Lx , E(660F38,89,_,x,_,0,2,T1S), 0 , 130, 0 , 286, 152), // #1361
- INST(Vpexpandq , VexRm_Lx , E(660F38,89,_,x,_,1,3,T1S), 0 , 129, 0 , 286, 152), // #1362
- INST(Vpexpandw , VexRm_Lx , E(660F38,62,_,x,_,1,1,T1S), 0 , 213, 0 , 286, 186), // #1363
- INST(Vpextrb , VexMri , V(660F3A,14,_,0,0,I,0,T1S), 0 , 75 , 0 , 389, 191), // #1364
- INST(Vpextrd , VexMri , V(660F3A,16,_,0,0,0,2,T1S), 0 , 179, 0 , 290, 192), // #1365
- INST(Vpextrq , VexMri , V(660F3A,16,_,0,1,1,3,T1S), 0 , 215, 0 , 390, 192), // #1366
- INST(Vpextrw , VexMri_Vpextrw , V(660F3A,15,_,0,0,I,1,T1S), 0 , 216, 0 , 391, 191), // #1367
- INST(Vpgatherdd , VexRmvRm_VM , V(660F38,90,_,x,0,_,_,_ ), E(660F38,90,_,x,_,0,2,T1S), 30 , 116, 309, 169), // #1368
- INST(Vpgatherdq , VexRmvRm_VM , V(660F38,90,_,x,1,_,_,_ ), E(660F38,90,_,x,_,1,3,T1S), 191, 117, 308, 169), // #1369
- INST(Vpgatherqd , VexRmvRm_VM , V(660F38,91,_,x,0,_,_,_ ), E(660F38,91,_,x,_,0,2,T1S), 30 , 118, 314, 169), // #1370
- INST(Vpgatherqq , VexRmvRm_VM , V(660F38,91,_,x,1,_,_,_ ), E(660F38,91,_,x,_,1,3,T1S), 191, 119, 313, 169), // #1371
- INST(Vphaddbd , VexRm , V(XOP_M9,C2,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1372
- INST(Vphaddbq , VexRm , V(XOP_M9,C3,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1373
- INST(Vphaddbw , VexRm , V(XOP_M9,C1,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1374
- INST(Vphaddd , VexRvm_Lx , V(660F38,02,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1375
- INST(Vphadddq , VexRm , V(XOP_M9,CB,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1376
- INST(Vphaddsw , VexRvm_Lx , V(660F38,03,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1377
- INST(Vphaddubd , VexRm , V(XOP_M9,D2,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1378
- INST(Vphaddubq , VexRm , V(XOP_M9,D3,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1379
- INST(Vphaddubw , VexRm , V(XOP_M9,D1,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1380
- INST(Vphaddudq , VexRm , V(XOP_M9,DB,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1381
- INST(Vphadduwd , VexRm , V(XOP_M9,D6,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1382
- INST(Vphadduwq , VexRm , V(XOP_M9,D7,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1383
- INST(Vphaddw , VexRvm_Lx , V(660F38,01,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1384
- INST(Vphaddwd , VexRm , V(XOP_M9,C6,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1385
- INST(Vphaddwq , VexRm , V(XOP_M9,C7,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1386
- INST(Vphminposuw , VexRm , V(660F38,41,_,0,I,_,_,_ ), 0 , 30 , 0 , 208, 149), // #1387
- INST(Vphsubbw , VexRm , V(XOP_M9,E1,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1388
- INST(Vphsubd , VexRvm_Lx , V(660F38,06,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1389
- INST(Vphsubdq , VexRm , V(XOP_M9,E3,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1390
- INST(Vphsubsw , VexRvm_Lx , V(660F38,07,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1391
- INST(Vphsubw , VexRvm_Lx , V(660F38,05,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1392
- INST(Vphsubwd , VexRm , V(XOP_M9,E2,_,0,0,_,_,_ ), 0 , 81 , 0 , 208, 168), // #1393
- INST(Vpinsrb , VexRvmi , V(660F3A,20,_,0,0,I,0,T1S), 0 , 75 , 0 , 392, 191), // #1394
- INST(Vpinsrd , VexRvmi , V(660F3A,22,_,0,0,0,2,T1S), 0 , 179, 0 , 393, 192), // #1395
- INST(Vpinsrq , VexRvmi , V(660F3A,22,_,0,1,1,3,T1S), 0 , 215, 0 , 394, 192), // #1396
- INST(Vpinsrw , VexRvmi , V(660F00,C4,_,0,0,I,1,T1S), 0 , 217, 0 , 395, 191), // #1397
- INST(Vplzcntd , VexRm_Lx , E(660F38,44,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 183), // #1398
- INST(Vplzcntq , VexRm_Lx , E(660F38,44,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 183), // #1399
- INST(Vpmacsdd , VexRvmr , V(XOP_M8,9E,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1400
- INST(Vpmacsdqh , VexRvmr , V(XOP_M8,9F,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1401
- INST(Vpmacsdql , VexRvmr , V(XOP_M8,97,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1402
- INST(Vpmacssdd , VexRvmr , V(XOP_M8,8E,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1403
- INST(Vpmacssdqh , VexRvmr , V(XOP_M8,8F,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1404
- INST(Vpmacssdql , VexRvmr , V(XOP_M8,87,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1405
- INST(Vpmacsswd , VexRvmr , V(XOP_M8,86,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1406
- INST(Vpmacssww , VexRvmr , V(XOP_M8,85,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1407
- INST(Vpmacswd , VexRvmr , V(XOP_M8,96,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1408
- INST(Vpmacsww , VexRvmr , V(XOP_M8,95,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1409
- INST(Vpmadcsswd , VexRvmr , V(XOP_M8,A6,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1410
- INST(Vpmadcswd , VexRvmr , V(XOP_M8,B6,_,0,0,_,_,_ ), 0 , 210, 0 , 396, 168), // #1411
- INST(Vpmadd52huq , VexRvm_Lx , V(660F38,B5,_,x,1,1,4,FV ), 0 , 184, 0 , 397, 193), // #1412
- INST(Vpmadd52luq , VexRvm_Lx , V(660F38,B4,_,x,1,1,4,FV ), 0 , 184, 0 , 397, 193), // #1413
- INST(Vpmaddubsw , VexRvm_Lx , V(660F38,04,_,x,I,I,4,FVM), 0 , 111, 0 , 322, 181), // #1414
- INST(Vpmaddwd , VexRvm_Lx , V(660F00,F5,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1415
- INST(Vpmaskmovd , VexRvmMvr_Lx , V(660F38,8C,_,x,0,_,_,_ ), V(660F38,8E,_,x,0,_,_,_ ), 30 , 120, 329, 156), // #1416
- INST(Vpmaskmovq , VexRvmMvr_Lx , V(660F38,8C,_,x,1,_,_,_ ), V(660F38,8E,_,x,1,_,_,_ ), 191, 121, 329, 156), // #1417
- INST(Vpmaxsb , VexRvm_Lx , V(660F38,3C,_,x,I,I,4,FVM), 0 , 111, 0 , 398, 181), // #1418
- INST(Vpmaxsd , VexRvm_Lx , V(660F38,3D,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1419
- INST(Vpmaxsq , VexRvm_Lx , E(660F38,3D,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1420
- INST(Vpmaxsw , VexRvm_Lx , V(660F00,EE,_,x,I,I,4,FVM), 0 , 145, 0 , 398, 181), // #1421
- INST(Vpmaxub , VexRvm_Lx , V(660F00,DE,_,x,I,I,4,FVM), 0 , 145, 0 , 398, 181), // #1422
- INST(Vpmaxud , VexRvm_Lx , V(660F38,3F,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1423
- INST(Vpmaxuq , VexRvm_Lx , E(660F38,3F,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1424
- INST(Vpmaxuw , VexRvm_Lx , V(660F38,3E,_,x,I,I,4,FVM), 0 , 111, 0 , 398, 181), // #1425
- INST(Vpminsb , VexRvm_Lx , V(660F38,38,_,x,I,I,4,FVM), 0 , 111, 0 , 398, 181), // #1426
- INST(Vpminsd , VexRvm_Lx , V(660F38,39,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1427
- INST(Vpminsq , VexRvm_Lx , E(660F38,39,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1428
- INST(Vpminsw , VexRvm_Lx , V(660F00,EA,_,x,I,I,4,FVM), 0 , 145, 0 , 398, 181), // #1429
- INST(Vpminub , VexRvm_Lx , V(660F00,DA,_,x,I,_,4,FVM), 0 , 145, 0 , 398, 181), // #1430
- INST(Vpminud , VexRvm_Lx , V(660F38,3B,_,x,I,0,4,FV ), 0 , 111, 0 , 215, 157), // #1431
- INST(Vpminuq , VexRvm_Lx , E(660F38,3B,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1432
- INST(Vpminuw , VexRvm_Lx , V(660F38,3A,_,x,I,_,4,FVM), 0 , 111, 0 , 398, 181), // #1433
- INST(Vpmovb2m , VexRm_Lx , E(F30F38,29,_,x,_,0,_,_ ), 0 , 208, 0 , 399, 163), // #1434
- INST(Vpmovd2m , VexRm_Lx , E(F30F38,39,_,x,_,0,_,_ ), 0 , 208, 0 , 399, 155), // #1435
- INST(Vpmovdb , VexMr_Lx , E(F30F38,31,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1436
- INST(Vpmovdw , VexMr_Lx , E(F30F38,33,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1437
- INST(Vpmovm2b , VexRm_Lx , E(F30F38,28,_,x,_,0,_,_ ), 0 , 208, 0 , 367, 163), // #1438
- INST(Vpmovm2d , VexRm_Lx , E(F30F38,38,_,x,_,0,_,_ ), 0 , 208, 0 , 367, 155), // #1439
- INST(Vpmovm2q , VexRm_Lx , E(F30F38,38,_,x,_,1,_,_ ), 0 , 207, 0 , 367, 155), // #1440
- INST(Vpmovm2w , VexRm_Lx , E(F30F38,28,_,x,_,1,_,_ ), 0 , 207, 0 , 367, 163), // #1441
- INST(Vpmovmskb , VexRm_Lx , V(660F00,D7,_,x,I,_,_,_ ), 0 , 71 , 0 , 343, 178), // #1442
- INST(Vpmovq2m , VexRm_Lx , E(F30F38,39,_,x,_,1,_,_ ), 0 , 207, 0 , 399, 155), // #1443
- INST(Vpmovqb , VexMr_Lx , E(F30F38,32,_,x,_,0,1,OVM), 0 , 220, 0 , 402, 152), // #1444
- INST(Vpmovqd , VexMr_Lx , E(F30F38,35,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1445
- INST(Vpmovqw , VexMr_Lx , E(F30F38,34,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1446
- INST(Vpmovsdb , VexMr_Lx , E(F30F38,21,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1447
- INST(Vpmovsdw , VexMr_Lx , E(F30F38,23,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1448
- INST(Vpmovsqb , VexMr_Lx , E(F30F38,22,_,x,_,0,1,OVM), 0 , 220, 0 , 402, 152), // #1449
- INST(Vpmovsqd , VexMr_Lx , E(F30F38,25,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1450
- INST(Vpmovsqw , VexMr_Lx , E(F30F38,24,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1451
- INST(Vpmovswb , VexMr_Lx , E(F30F38,20,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 163), // #1452
- INST(Vpmovsxbd , VexRm_Lx , V(660F38,21,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1453
- INST(Vpmovsxbq , VexRm_Lx , V(660F38,22,_,x,I,I,1,OVM), 0 , 222, 0 , 404, 157), // #1454
- INST(Vpmovsxbw , VexRm_Lx , V(660F38,20,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 181), // #1455
- INST(Vpmovsxdq , VexRm_Lx , V(660F38,25,_,x,I,0,3,HVM), 0 , 140, 0 , 405, 157), // #1456
- INST(Vpmovsxwd , VexRm_Lx , V(660F38,23,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 157), // #1457
- INST(Vpmovsxwq , VexRm_Lx , V(660F38,24,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1458
- INST(Vpmovusdb , VexMr_Lx , E(F30F38,11,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1459
- INST(Vpmovusdw , VexMr_Lx , E(F30F38,13,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1460
- INST(Vpmovusqb , VexMr_Lx , E(F30F38,12,_,x,_,0,1,OVM), 0 , 220, 0 , 402, 152), // #1461
- INST(Vpmovusqd , VexMr_Lx , E(F30F38,15,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 152), // #1462
- INST(Vpmovusqw , VexMr_Lx , E(F30F38,14,_,x,_,0,2,QVM), 0 , 218, 0 , 400, 152), // #1463
- INST(Vpmovuswb , VexMr_Lx , E(F30F38,10,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 163), // #1464
- INST(Vpmovw2m , VexRm_Lx , E(F30F38,29,_,x,_,1,_,_ ), 0 , 207, 0 , 399, 163), // #1465
- INST(Vpmovwb , VexMr_Lx , E(F30F38,30,_,x,_,0,3,HVM), 0 , 219, 0 , 401, 163), // #1466
- INST(Vpmovzxbd , VexRm_Lx , V(660F38,31,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1467
- INST(Vpmovzxbq , VexRm_Lx , V(660F38,32,_,x,I,I,1,OVM), 0 , 222, 0 , 404, 157), // #1468
- INST(Vpmovzxbw , VexRm_Lx , V(660F38,30,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 181), // #1469
- INST(Vpmovzxdq , VexRm_Lx , V(660F38,35,_,x,I,0,3,HVM), 0 , 140, 0 , 405, 157), // #1470
- INST(Vpmovzxwd , VexRm_Lx , V(660F38,33,_,x,I,I,3,HVM), 0 , 140, 0 , 405, 157), // #1471
- INST(Vpmovzxwq , VexRm_Lx , V(660F38,34,_,x,I,I,2,QVM), 0 , 221, 0 , 403, 157), // #1472
- INST(Vpmuldq , VexRvm_Lx , V(660F38,28,_,x,I,1,4,FV ), 0 , 211, 0 , 212, 157), // #1473
- INST(Vpmulhrsw , VexRvm_Lx , V(660F38,0B,_,x,I,I,4,FVM), 0 , 111, 0 , 322, 181), // #1474
- INST(Vpmulhuw , VexRvm_Lx , V(660F00,E4,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1475
- INST(Vpmulhw , VexRvm_Lx , V(660F00,E5,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1476
- INST(Vpmulld , VexRvm_Lx , V(660F38,40,_,x,I,0,4,FV ), 0 , 111, 0 , 213, 157), // #1477
- INST(Vpmullq , VexRvm_Lx , E(660F38,40,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 155), // #1478
- INST(Vpmullw , VexRvm_Lx , V(660F00,D5,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1479
- INST(Vpmultishiftqb , VexRvm_Lx , E(660F38,83,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 190), // #1480
- INST(Vpmuludq , VexRvm_Lx , V(660F00,F4,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1481
- INST(Vpopcntb , VexRm_Lx , E(660F38,54,_,x,_,0,4,FV ), 0 , 115, 0 , 286, 194), // #1482
- INST(Vpopcntd , VexRm_Lx , E(660F38,55,_,x,_,0,4,FVM), 0 , 115, 0 , 381, 195), // #1483
- INST(Vpopcntq , VexRm_Lx , E(660F38,55,_,x,_,1,4,FVM), 0 , 114, 0 , 357, 195), // #1484
- INST(Vpopcntw , VexRm_Lx , E(660F38,54,_,x,_,1,4,FV ), 0 , 114, 0 , 286, 194), // #1485
- INST(Vpor , VexRvm_Lx , V(660F00,EB,_,x,I,_,_,_ ), 0 , 71 , 0 , 358, 178), // #1486
- INST(Vpord , VexRvm_Lx , E(660F00,EB,_,x,_,0,4,FV ), 0 , 200, 0 , 359, 152), // #1487
- INST(Vporq , VexRvm_Lx , E(660F00,EB,_,x,_,1,4,FV ), 0 , 136, 0 , 363, 152), // #1488
- INST(Vpperm , VexRvrmRvmr , V(XOP_M8,A3,_,0,x,_,_,_ ), 0 , 210, 0 , 406, 168), // #1489
- INST(Vprold , VexVmi_Lx , E(660F00,72,1,x,_,0,4,FV ), 0 , 223, 0 , 407, 152), // #1490
- INST(Vprolq , VexVmi_Lx , E(660F00,72,1,x,_,1,4,FV ), 0 , 224, 0 , 408, 152), // #1491
- INST(Vprolvd , VexRvm_Lx , E(660F38,15,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1492
- INST(Vprolvq , VexRvm_Lx , E(660F38,15,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1493
- INST(Vprord , VexVmi_Lx , E(660F00,72,0,x,_,0,4,FV ), 0 , 200, 0 , 407, 152), // #1494
- INST(Vprorq , VexVmi_Lx , E(660F00,72,0,x,_,1,4,FV ), 0 , 136, 0 , 408, 152), // #1495
- INST(Vprorvd , VexRvm_Lx , E(660F38,14,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 152), // #1496
- INST(Vprorvq , VexRvm_Lx , E(660F38,14,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1497
- INST(Vprotb , VexRvmRmvRmi , V(XOP_M9,90,_,0,x,_,_,_ ), V(XOP_M8,C0,_,0,x,_,_,_ ), 81 , 122, 409, 168), // #1498
- INST(Vprotd , VexRvmRmvRmi , V(XOP_M9,92,_,0,x,_,_,_ ), V(XOP_M8,C2,_,0,x,_,_,_ ), 81 , 123, 409, 168), // #1499
- INST(Vprotq , VexRvmRmvRmi , V(XOP_M9,93,_,0,x,_,_,_ ), V(XOP_M8,C3,_,0,x,_,_,_ ), 81 , 124, 409, 168), // #1500
- INST(Vprotw , VexRvmRmvRmi , V(XOP_M9,91,_,0,x,_,_,_ ), V(XOP_M8,C1,_,0,x,_,_,_ ), 81 , 125, 409, 168), // #1501
- INST(Vpsadbw , VexRvm_Lx , V(660F00,F6,_,x,I,I,4,FVM), 0 , 145, 0 , 207, 181), // #1502
- INST(Vpscatterdd , VexMr_VM , E(660F38,A0,_,x,_,0,2,T1S), 0 , 130, 0 , 410, 152), // #1503
- INST(Vpscatterdq , VexMr_VM , E(660F38,A0,_,x,_,1,3,T1S), 0 , 129, 0 , 411, 152), // #1504
- INST(Vpscatterqd , VexMr_VM , E(660F38,A1,_,x,_,0,2,T1S), 0 , 130, 0 , 412, 152), // #1505
- INST(Vpscatterqq , VexMr_VM , E(660F38,A1,_,x,_,1,3,T1S), 0 , 129, 0 , 413, 152), // #1506
- INST(Vpshab , VexRvmRmv , V(XOP_M9,98,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1507
- INST(Vpshad , VexRvmRmv , V(XOP_M9,9A,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1508
- INST(Vpshaq , VexRvmRmv , V(XOP_M9,9B,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1509
- INST(Vpshaw , VexRvmRmv , V(XOP_M9,99,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1510
- INST(Vpshlb , VexRvmRmv , V(XOP_M9,94,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1511
- INST(Vpshld , VexRvmRmv , V(XOP_M9,96,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1512
- INST(Vpshldd , VexRvmi_Lx , E(660F3A,71,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 186), // #1513
- INST(Vpshldq , VexRvmi_Lx , E(660F3A,71,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 186), // #1514
- INST(Vpshldvd , VexRvm_Lx , E(660F38,71,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 186), // #1515
- INST(Vpshldvq , VexRvm_Lx , E(660F38,71,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 186), // #1516
- INST(Vpshldvw , VexRvm_Lx , E(660F38,70,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 186), // #1517
- INST(Vpshldw , VexRvmi_Lx , E(660F3A,70,_,x,_,1,4,FVM), 0 , 113, 0 , 282, 186), // #1518
- INST(Vpshlq , VexRvmRmv , V(XOP_M9,97,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1519
- INST(Vpshlw , VexRvmRmv , V(XOP_M9,95,_,0,x,_,_,_ ), 0 , 81 , 0 , 414, 168), // #1520
- INST(Vpshrdd , VexRvmi_Lx , E(660F3A,73,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 186), // #1521
- INST(Vpshrdq , VexRvmi_Lx , E(660F3A,73,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 186), // #1522
- INST(Vpshrdvd , VexRvm_Lx , E(660F38,73,_,x,_,0,4,FV ), 0 , 115, 0 , 218, 186), // #1523
- INST(Vpshrdvq , VexRvm_Lx , E(660F38,73,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 186), // #1524
- INST(Vpshrdvw , VexRvm_Lx , E(660F38,72,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 186), // #1525
- INST(Vpshrdw , VexRvmi_Lx , E(660F3A,72,_,x,_,1,4,FVM), 0 , 113, 0 , 282, 186), // #1526
- INST(Vpshufb , VexRvm_Lx , V(660F38,00,_,x,I,I,4,FVM), 0 , 111, 0 , 322, 181), // #1527
- INST(Vpshufbitqmb , VexRvm_Lx , E(660F38,8F,_,x,0,0,4,FVM), 0 , 115, 0 , 415, 194), // #1528
- INST(Vpshufd , VexRmi_Lx , V(660F00,70,_,x,I,0,4,FV ), 0 , 145, 0 , 416, 157), // #1529
- INST(Vpshufhw , VexRmi_Lx , V(F30F00,70,_,x,I,I,4,FVM), 0 , 162, 0 , 417, 181), // #1530
- INST(Vpshuflw , VexRmi_Lx , V(F20F00,70,_,x,I,I,4,FVM), 0 , 225, 0 , 417, 181), // #1531
- INST(Vpsignb , VexRvm_Lx , V(660F38,08,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1532
- INST(Vpsignd , VexRvm_Lx , V(660F38,0A,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1533
- INST(Vpsignw , VexRvm_Lx , V(660F38,09,_,x,I,_,_,_ ), 0 , 30 , 0 , 206, 178), // #1534
- INST(Vpslld , VexRvmVmi_Lx_MEvex , V(660F00,F2,_,x,I,0,4,128), V(660F00,72,6,x,I,0,4,FV ), 226, 126, 418, 157), // #1535
- INST(Vpslldq , VexVmi_Lx_MEvex , V(660F00,73,7,x,I,I,4,FVM), 0 , 227, 0 , 419, 181), // #1536
- INST(Vpsllq , VexRvmVmi_Lx_MEvex , V(660F00,F3,_,x,I,1,4,128), V(660F00,73,6,x,I,1,4,FV ), 228, 127, 420, 157), // #1537
- INST(Vpsllvd , VexRvm_Lx , V(660F38,47,_,x,0,0,4,FV ), 0 , 111, 0 , 213, 169), // #1538
- INST(Vpsllvq , VexRvm_Lx , V(660F38,47,_,x,1,1,4,FV ), 0 , 184, 0 , 212, 169), // #1539
- INST(Vpsllvw , VexRvm_Lx , E(660F38,12,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1540
- INST(Vpsllw , VexRvmVmi_Lx_MEvex , V(660F00,F1,_,x,I,I,4,128), V(660F00,71,6,x,I,I,4,FVM), 226, 128, 421, 181), // #1541
- INST(Vpsrad , VexRvmVmi_Lx_MEvex , V(660F00,E2,_,x,I,0,4,128), V(660F00,72,4,x,I,0,4,FV ), 226, 129, 418, 157), // #1542
- INST(Vpsraq , VexRvmVmi_Lx_MEvex , E(660F00,E2,_,x,_,1,4,128), E(660F00,72,4,x,_,1,4,FV ), 229, 130, 422, 152), // #1543
- INST(Vpsravd , VexRvm_Lx , V(660F38,46,_,x,0,0,4,FV ), 0 , 111, 0 , 213, 169), // #1544
- INST(Vpsravq , VexRvm_Lx , E(660F38,46,_,x,_,1,4,FV ), 0 , 114, 0 , 217, 152), // #1545
- INST(Vpsravw , VexRvm_Lx , E(660F38,11,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1546
- INST(Vpsraw , VexRvmVmi_Lx_MEvex , V(660F00,E1,_,x,I,I,4,128), V(660F00,71,4,x,I,I,4,FVM), 226, 131, 421, 181), // #1547
- INST(Vpsrld , VexRvmVmi_Lx_MEvex , V(660F00,D2,_,x,I,0,4,128), V(660F00,72,2,x,I,0,4,FV ), 226, 132, 418, 157), // #1548
- INST(Vpsrldq , VexVmi_Lx_MEvex , V(660F00,73,3,x,I,I,4,FVM), 0 , 230, 0 , 419, 181), // #1549
- INST(Vpsrlq , VexRvmVmi_Lx_MEvex , V(660F00,D3,_,x,I,1,4,128), V(660F00,73,2,x,I,1,4,FV ), 228, 133, 420, 157), // #1550
- INST(Vpsrlvd , VexRvm_Lx , V(660F38,45,_,x,0,0,4,FV ), 0 , 111, 0 , 213, 169), // #1551
- INST(Vpsrlvq , VexRvm_Lx , V(660F38,45,_,x,1,1,4,FV ), 0 , 184, 0 , 212, 169), // #1552
- INST(Vpsrlvw , VexRvm_Lx , E(660F38,10,_,x,_,1,4,FVM), 0 , 114, 0 , 364, 163), // #1553
- INST(Vpsrlw , VexRvmVmi_Lx_MEvex , V(660F00,D1,_,x,I,I,4,128), V(660F00,71,2,x,I,I,4,FVM), 226, 134, 421, 181), // #1554
- INST(Vpsubb , VexRvm_Lx , V(660F00,F8,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1555
- INST(Vpsubd , VexRvm_Lx , V(660F00,FA,_,x,I,0,4,FV ), 0 , 145, 0 , 424, 157), // #1556
- INST(Vpsubq , VexRvm_Lx , V(660F00,FB,_,x,I,1,4,FV ), 0 , 104, 0 , 425, 157), // #1557
- INST(Vpsubsb , VexRvm_Lx , V(660F00,E8,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1558
- INST(Vpsubsw , VexRvm_Lx , V(660F00,E9,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1559
- INST(Vpsubusb , VexRvm_Lx , V(660F00,D8,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1560
- INST(Vpsubusw , VexRvm_Lx , V(660F00,D9,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1561
- INST(Vpsubw , VexRvm_Lx , V(660F00,F9,_,x,I,I,4,FVM), 0 , 145, 0 , 423, 181), // #1562
- INST(Vpternlogd , VexRvmi_Lx , E(660F3A,25,_,x,_,0,4,FV ), 0 , 112, 0 , 210, 152), // #1563
- INST(Vpternlogq , VexRvmi_Lx , E(660F3A,25,_,x,_,1,4,FV ), 0 , 113, 0 , 211, 152), // #1564
- INST(Vptest , VexRm_Lx , V(660F38,17,_,x,I,_,_,_ ), 0 , 30 , 0 , 305, 185), // #1565
- INST(Vptestmb , VexRvm_Lx , E(660F38,26,_,x,_,0,4,FVM), 0 , 115, 0 , 415, 163), // #1566
- INST(Vptestmd , VexRvm_Lx , E(660F38,27,_,x,_,0,4,FV ), 0 , 115, 0 , 426, 152), // #1567
- INST(Vptestmq , VexRvm_Lx , E(660F38,27,_,x,_,1,4,FV ), 0 , 114, 0 , 427, 152), // #1568
- INST(Vptestmw , VexRvm_Lx , E(660F38,26,_,x,_,1,4,FVM), 0 , 114, 0 , 415, 163), // #1569
- INST(Vptestnmb , VexRvm_Lx , E(F30F38,26,_,x,_,0,4,FVM), 0 , 171, 0 , 415, 163), // #1570
- INST(Vptestnmd , VexRvm_Lx , E(F30F38,27,_,x,_,0,4,FV ), 0 , 171, 0 , 426, 152), // #1571
- INST(Vptestnmq , VexRvm_Lx , E(F30F38,27,_,x,_,1,4,FV ), 0 , 231, 0 , 427, 152), // #1572
- INST(Vptestnmw , VexRvm_Lx , E(F30F38,26,_,x,_,1,4,FVM), 0 , 231, 0 , 415, 163), // #1573
- INST(Vpunpckhbw , VexRvm_Lx , V(660F00,68,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1574
- INST(Vpunpckhdq , VexRvm_Lx , V(660F00,6A,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 157), // #1575
- INST(Vpunpckhqdq , VexRvm_Lx , V(660F00,6D,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1576
- INST(Vpunpckhwd , VexRvm_Lx , V(660F00,69,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1577
- INST(Vpunpcklbw , VexRvm_Lx , V(660F00,60,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1578
- INST(Vpunpckldq , VexRvm_Lx , V(660F00,62,_,x,I,0,4,FV ), 0 , 145, 0 , 213, 157), // #1579
- INST(Vpunpcklqdq , VexRvm_Lx , V(660F00,6C,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 157), // #1580
- INST(Vpunpcklwd , VexRvm_Lx , V(660F00,61,_,x,I,I,4,FVM), 0 , 145, 0 , 322, 181), // #1581
- INST(Vpxor , VexRvm_Lx , V(660F00,EF,_,x,I,_,_,_ ), 0 , 71 , 0 , 360, 178), // #1582
- INST(Vpxord , VexRvm_Lx , E(660F00,EF,_,x,_,0,4,FV ), 0 , 200, 0 , 361, 152), // #1583
- INST(Vpxorq , VexRvm_Lx , E(660F00,EF,_,x,_,1,4,FV ), 0 , 136, 0 , 362, 152), // #1584
- INST(Vrangepd , VexRvmi_Lx , E(660F3A,50,_,x,_,1,4,FV ), 0 , 113, 0 , 292, 155), // #1585
- INST(Vrangeps , VexRvmi_Lx , E(660F3A,50,_,x,_,0,4,FV ), 0 , 112, 0 , 293, 155), // #1586
- INST(Vrangesd , VexRvmi , E(660F3A,51,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 76 ), // #1587
- INST(Vrangess , VexRvmi , E(660F3A,51,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 76 ), // #1588
- INST(Vrcp14pd , VexRm_Lx , E(660F38,4C,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 152), // #1589
- INST(Vrcp14ps , VexRm_Lx , E(660F38,4C,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 152), // #1590
- INST(Vrcp14sd , VexRvm , E(660F38,4D,_,I,_,1,3,T1S), 0 , 129, 0 , 428, 78 ), // #1591
- INST(Vrcp14ss , VexRvm , E(660F38,4D,_,I,_,0,2,T1S), 0 , 130, 0 , 429, 78 ), // #1592
- INST(Vrcp28pd , VexRm , E(660F38,CA,_,2,_,1,4,FV ), 0 , 172, 0 , 284, 164), // #1593
- INST(Vrcp28ps , VexRm , E(660F38,CA,_,2,_,0,4,FV ), 0 , 173, 0 , 285, 164), // #1594
- INST(Vrcp28sd , VexRvm , E(660F38,CB,_,I,_,1,3,T1S), 0 , 129, 0 , 315, 164), // #1595
- INST(Vrcp28ss , VexRvm , E(660F38,CB,_,I,_,0,2,T1S), 0 , 130, 0 , 316, 164), // #1596
- INST(Vrcpph , VexRm_Lx , E(66MAP6,4C,_,_,_,0,4,FV ), 0 , 185, 0 , 430, 148), // #1597
- INST(Vrcpps , VexRm_Lx , V(000F00,53,_,x,I,_,_,_ ), 0 , 74 , 0 , 305, 149), // #1598
- INST(Vrcpsh , VexRvm , E(66MAP6,4D,_,_,_,0,1,T1S), 0 , 187, 0 , 431, 148), // #1599
- INST(Vrcpss , VexRvm , V(F30F00,53,_,I,I,_,_,_ ), 0 , 201, 0 , 432, 149), // #1600
- INST(Vreducepd , VexRmi_Lx , E(660F3A,56,_,x,_,1,4,FV ), 0 , 113, 0 , 408, 155), // #1601
- INST(Vreduceph , VexRmi_Lx , E(000F3A,56,_,_,_,0,4,FV ), 0 , 124, 0 , 318, 146), // #1602
- INST(Vreduceps , VexRmi_Lx , E(660F3A,56,_,x,_,0,4,FV ), 0 , 112, 0 , 407, 155), // #1603
- INST(Vreducesd , VexRvmi , E(660F3A,57,_,I,_,1,3,T1S), 0 , 182, 0 , 433, 76 ), // #1604
- INST(Vreducesh , VexRvmi , E(000F3A,57,_,_,_,0,1,T1S), 0 , 190, 0 , 320, 148), // #1605
- INST(Vreducess , VexRvmi , E(660F3A,57,_,I,_,0,2,T1S), 0 , 183, 0 , 434, 76 ), // #1606
- INST(Vrndscalepd , VexRmi_Lx , E(660F3A,09,_,x,_,1,4,FV ), 0 , 113, 0 , 317, 152), // #1607
- INST(Vrndscaleph , VexRmi_Lx , E(000F3A,08,_,_,_,0,4,FV ), 0 , 124, 0 , 318, 146), // #1608
- INST(Vrndscaleps , VexRmi_Lx , E(660F3A,08,_,x,_,0,4,FV ), 0 , 112, 0 , 319, 152), // #1609
- INST(Vrndscalesd , VexRvmi , E(660F3A,0B,_,I,_,1,3,T1S), 0 , 182, 0 , 294, 78 ), // #1610
- INST(Vrndscalesh , VexRvmi , E(000F3A,0A,_,_,_,0,1,T1S), 0 , 190, 0 , 320, 148), // #1611
- INST(Vrndscaless , VexRvmi , E(660F3A,0A,_,I,_,0,2,T1S), 0 , 183, 0 , 295, 78 ), // #1612
- INST(Vroundpd , VexRmi_Lx , V(660F3A,09,_,x,I,_,_,_ ), 0 , 75 , 0 , 435, 149), // #1613
- INST(Vroundps , VexRmi_Lx , V(660F3A,08,_,x,I,_,_,_ ), 0 , 75 , 0 , 435, 149), // #1614
- INST(Vroundsd , VexRvmi , V(660F3A,0B,_,I,I,_,_,_ ), 0 , 75 , 0 , 436, 149), // #1615
- INST(Vroundss , VexRvmi , V(660F3A,0A,_,I,I,_,_,_ ), 0 , 75 , 0 , 437, 149), // #1616
- INST(Vrsqrt14pd , VexRm_Lx , E(660F38,4E,_,x,_,1,4,FV ), 0 , 114, 0 , 357, 152), // #1617
- INST(Vrsqrt14ps , VexRm_Lx , E(660F38,4E,_,x,_,0,4,FV ), 0 , 115, 0 , 381, 152), // #1618
- INST(Vrsqrt14sd , VexRvm , E(660F38,4F,_,I,_,1,3,T1S), 0 , 129, 0 , 428, 78 ), // #1619
- INST(Vrsqrt14ss , VexRvm , E(660F38,4F,_,I,_,0,2,T1S), 0 , 130, 0 , 429, 78 ), // #1620
- INST(Vrsqrt28pd , VexRm , E(660F38,CC,_,2,_,1,4,FV ), 0 , 172, 0 , 284, 164), // #1621
- INST(Vrsqrt28ps , VexRm , E(660F38,CC,_,2,_,0,4,FV ), 0 , 173, 0 , 285, 164), // #1622
- INST(Vrsqrt28sd , VexRvm , E(660F38,CD,_,I,_,1,3,T1S), 0 , 129, 0 , 315, 164), // #1623
- INST(Vrsqrt28ss , VexRvm , E(660F38,CD,_,I,_,0,2,T1S), 0 , 130, 0 , 316, 164), // #1624
- INST(Vrsqrtph , VexRm_Lx , E(66MAP6,4E,_,_,_,0,4,FV ), 0 , 185, 0 , 430, 146), // #1625
- INST(Vrsqrtps , VexRm_Lx , V(000F00,52,_,x,I,_,_,_ ), 0 , 74 , 0 , 305, 149), // #1626
- INST(Vrsqrtsh , VexRvm , E(66MAP6,4F,_,_,_,0,1,T1S), 0 , 187, 0 , 431, 148), // #1627
- INST(Vrsqrtss , VexRvm , V(F30F00,52,_,I,I,_,_,_ ), 0 , 201, 0 , 432, 149), // #1628
- INST(Vscalefpd , VexRvm_Lx , E(660F38,2C,_,x,_,1,4,FV ), 0 , 114, 0 , 438, 152), // #1629
- INST(Vscalefph , VexRvm_Lx , E(66MAP6,2C,_,_,_,0,4,FV ), 0 , 185, 0 , 201, 146), // #1630
- INST(Vscalefps , VexRvm_Lx , E(660F38,2C,_,x,_,0,4,FV ), 0 , 115, 0 , 291, 152), // #1631
- INST(Vscalefsd , VexRvm , E(660F38,2D,_,I,_,1,3,T1S), 0 , 129, 0 , 257, 78 ), // #1632
- INST(Vscalefsh , VexRvm , E(66MAP6,2D,_,_,_,0,1,T1S), 0 , 187, 0 , 204, 148), // #1633
- INST(Vscalefss , VexRvm , E(660F38,2D,_,I,_,0,2,T1S), 0 , 130, 0 , 265, 78 ), // #1634
- INST(Vscatterdpd , VexMr_VM , E(660F38,A2,_,x,_,1,3,T1S), 0 , 129, 0 , 411, 152), // #1635
- INST(Vscatterdps , VexMr_VM , E(660F38,A2,_,x,_,0,2,T1S), 0 , 130, 0 , 410, 152), // #1636
- INST(Vscatterpf0dpd , VexM_VM , E(660F38,C6,5,2,_,1,3,T1S), 0 , 232, 0 , 310, 170), // #1637
- INST(Vscatterpf0dps , VexM_VM , E(660F38,C6,5,2,_,0,2,T1S), 0 , 233, 0 , 311, 170), // #1638
- INST(Vscatterpf0qpd , VexM_VM , E(660F38,C7,5,2,_,1,3,T1S), 0 , 232, 0 , 312, 170), // #1639
- INST(Vscatterpf0qps , VexM_VM , E(660F38,C7,5,2,_,0,2,T1S), 0 , 233, 0 , 312, 170), // #1640
- INST(Vscatterpf1dpd , VexM_VM , E(660F38,C6,6,2,_,1,3,T1S), 0 , 234, 0 , 310, 170), // #1641
- INST(Vscatterpf1dps , VexM_VM , E(660F38,C6,6,2,_,0,2,T1S), 0 , 235, 0 , 311, 170), // #1642
- INST(Vscatterpf1qpd , VexM_VM , E(660F38,C7,6,2,_,1,3,T1S), 0 , 234, 0 , 312, 170), // #1643
- INST(Vscatterpf1qps , VexM_VM , E(660F38,C7,6,2,_,0,2,T1S), 0 , 235, 0 , 312, 170), // #1644
- INST(Vscatterqpd , VexMr_VM , E(660F38,A3,_,x,_,1,3,T1S), 0 , 129, 0 , 413, 152), // #1645
- INST(Vscatterqps , VexMr_VM , E(660F38,A3,_,x,_,0,2,T1S), 0 , 130, 0 , 412, 152), // #1646
- INST(Vsha512msg1 , VexRm , V(F20F38,CC,_,1,0,_,_,_ ), 0 , 236, 0 , 439, 196), // #1647
- INST(Vsha512msg2 , VexRm , V(F20F38,CD,_,1,0,_,_,_ ), 0 , 236, 0 , 440, 196), // #1648
- INST(Vsha512rnds2 , VexRvm , V(F20F38,CB,_,1,0,_,_,_ ), 0 , 236, 0 , 441, 196), // #1649
- INST(Vshuff32x4 , VexRvmi_Lx , E(660F3A,23,_,x,_,0,4,FV ), 0 , 112, 0 , 442, 152), // #1650
- INST(Vshuff64x2 , VexRvmi_Lx , E(660F3A,23,_,x,_,1,4,FV ), 0 , 113, 0 , 443, 152), // #1651
- INST(Vshufi32x4 , VexRvmi_Lx , E(660F3A,43,_,x,_,0,4,FV ), 0 , 112, 0 , 442, 152), // #1652
- INST(Vshufi64x2 , VexRvmi_Lx , E(660F3A,43,_,x,_,1,4,FV ), 0 , 113, 0 , 443, 152), // #1653
- INST(Vshufpd , VexRvmi_Lx , V(660F00,C6,_,x,I,1,4,FV ), 0 , 104, 0 , 444, 145), // #1654
- INST(Vshufps , VexRvmi_Lx , V(000F00,C6,_,x,I,0,4,FV ), 0 , 106, 0 , 445, 145), // #1655
- INST(Vsm3msg1 , VexRvm , V(000F38,DA,_,0,0,_,_,_ ), 0 , 11 , 0 , 446, 197), // #1656
- INST(Vsm3msg2 , VexRvm , V(660F38,DA,_,0,0,_,_,_ ), 0 , 30 , 0 , 446, 197), // #1657
- INST(Vsm3rnds2 , VexRvmi , V(660F3A,DE,_,0,0,_,_,_ ), 0 , 75 , 0 , 283, 197), // #1658
- INST(Vsm4key4 , VexRvm_Lx , V(F30F38,DA,_,x,0,_,_,_ ), 0 , 89 , 0 , 206, 198), // #1659
- INST(Vsm4rnds4 , VexRvm_Lx , V(F20F38,DA,_,x,0,_,_,_ ), 0 , 85 , 0 , 206, 198), // #1660
- INST(Vsqrtpd , VexRm_Lx , V(660F00,51,_,x,I,1,4,FV ), 0 , 104, 0 , 447, 145), // #1661
- INST(Vsqrtph , VexRm_Lx , E(00MAP5,51,_,_,_,0,4,FV ), 0 , 105, 0 , 252, 146), // #1662
- INST(Vsqrtps , VexRm_Lx , V(000F00,51,_,x,I,0,4,FV ), 0 , 106, 0 , 240, 145), // #1663
- INST(Vsqrtsd , VexRvm , V(F20F00,51,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #1664
- INST(Vsqrtsh , VexRvm , E(F3MAP5,51,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #1665
- INST(Vsqrtss , VexRvm , V(F30F00,51,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #1666
- INST(Vstmxcsr , VexM , V(000F00,AE,3,0,I,_,_,_ ), 0 , 237, 0 , 327, 149), // #1667
- INST(Vsubpd , VexRvm_Lx , V(660F00,5C,_,x,I,1,4,FV ), 0 , 104, 0 , 200, 145), // #1668
- INST(Vsubph , VexRvm_Lx , E(00MAP5,5C,_,_,_,0,4,FV ), 0 , 105, 0 , 201, 146), // #1669
- INST(Vsubps , VexRvm_Lx , V(000F00,5C,_,x,I,0,4,FV ), 0 , 106, 0 , 202, 145), // #1670
- INST(Vsubsd , VexRvm , V(F20F00,5C,_,I,I,1,3,T1S), 0 , 107, 0 , 203, 147), // #1671
- INST(Vsubsh , VexRvm , E(F3MAP5,5C,_,_,_,0,1,T1S), 0 , 108, 0 , 204, 148), // #1672
- INST(Vsubss , VexRvm , V(F30F00,5C,_,I,I,0,2,T1S), 0 , 109, 0 , 205, 147), // #1673
- INST(Vtestpd , VexRm_Lx , V(660F38,0F,_,x,0,_,_,_ ), 0 , 30 , 0 , 305, 185), // #1674
- INST(Vtestps , VexRm_Lx , V(660F38,0E,_,x,0,_,_,_ ), 0 , 30 , 0 , 305, 185), // #1675
- INST(Vucomisd , VexRm , V(660F00,2E,_,I,I,1,3,T1S), 0 , 126, 0 , 234, 158), // #1676
- INST(Vucomish , VexRm , E(00MAP5,2E,_,_,_,0,1,T1S), 0 , 127, 0 , 235, 159), // #1677
- INST(Vucomiss , VexRm , V(000F00,2E,_,I,I,0,2,T1S), 0 , 128, 0 , 236, 158), // #1678
- INST(Vunpckhpd , VexRvm_Lx , V(660F00,15,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 145), // #1679
- INST(Vunpckhps , VexRvm_Lx , V(000F00,15,_,x,I,0,4,FV ), 0 , 106, 0 , 213, 145), // #1680
- INST(Vunpcklpd , VexRvm_Lx , V(660F00,14,_,x,I,1,4,FV ), 0 , 104, 0 , 212, 145), // #1681
- INST(Vunpcklps , VexRvm_Lx , V(000F00,14,_,x,I,0,4,FV ), 0 , 106, 0 , 213, 145), // #1682
- INST(Vxorpd , VexRvm_Lx , V(660F00,57,_,x,I,1,4,FV ), 0 , 104, 0 , 425, 153), // #1683
- INST(Vxorps , VexRvm_Lx , V(000F00,57,_,x,I,0,4,FV ), 0 , 106, 0 , 424, 153), // #1684
- INST(Vzeroall , VexOp , V(000F00,77,_,1,I,_,_,_ ), 0 , 70 , 0 , 448, 149), // #1685
- INST(Vzeroupper , VexOp , V(000F00,77,_,0,I,_,_,_ ), 0 , 74 , 0 , 448, 149), // #1686
- INST(Wbinvd , X86Op , O(000F00,09,_,_,_,_,_,_ ), 0 , 5 , 0 , 31 , 45 ), // #1687
- INST(Wbnoinvd , X86Op , O(F30F00,09,_,_,_,_,_,_ ), 0 , 7 , 0 , 31 , 199), // #1688
- INST(Wrfsbase , X86M , O(F30F00,AE,2,_,x,_,_,_ ), 0 , 238, 0 , 177, 122), // #1689
- INST(Wrgsbase , X86M , O(F30F00,AE,3,_,x,_,_,_ ), 0 , 239, 0 , 177, 122), // #1690
- INST(Wrmsr , X86Op , O(000F00,30,_,_,_,_,_,_ ), 0 , 5 , 0 , 178, 123), // #1691
- INST(Wrssd , X86Mr , O(000F38,F6,_,_,_,_,_,_ ), 0 , 1 , 0 , 449, 65 ), // #1692
- INST(Wrssq , X86Mr , O(000F38,F6,_,_,1,_,_,_ ), 0 , 240, 0 , 450, 65 ), // #1693
- INST(Wrussd , X86Mr , O(660F38,F5,_,_,_,_,_,_ ), 0 , 2 , 0 , 449, 65 ), // #1694
- INST(Wrussq , X86Mr , O(660F38,F5,_,_,1,_,_,_ ), 0 , 241, 0 , 450, 65 ), // #1695
- INST(Xabort , X86Op_Mod11RM_I8 , O(000000,C6,7,_,_,_,_,_ ), 0 , 29 , 0 , 84 , 200), // #1696
- INST(Xadd , X86Xadd , O(000F00,C0,_,_,x,_,_,_ ), 0 , 5 , 0 , 451, 40 ), // #1697
- INST(Xbegin , X86JmpRel , O(000000,C7,7,_,_,_,_,_ ), 0 , 29 , 0 , 452, 200), // #1698
- INST(Xchg , X86Xchg , O(000000,86,_,_,x,_,_,_ ), 0 , 0 , 0 , 453, 0 ), // #1699
- INST(Xend , X86Op , O(000F01,D5,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 200), // #1700
- INST(Xgetbv , X86Op , O(000F01,D0,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 201), // #1701
- INST(Xlatb , X86Op , O(000000,D7,_,_,_,_,_,_ ), 0 , 0 , 0 , 31 , 0 ), // #1702
- INST(Xor , X86Arith , O(000000,30,6,_,x,_,_,_ ), 0 , 34 , 0 , 183, 1 ), // #1703
- INST(Xorpd , ExtRm , O(660F00,57,_,_,_,_,_,_ ), 0 , 4 , 0 , 155, 5 ), // #1704
- INST(Xorps , ExtRm , O(000F00,57,_,_,_,_,_,_ ), 0 , 5 , 0 , 155, 6 ), // #1705
- INST(Xresldtrk , X86Op , O(F20F01,E9,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 202), // #1706
- INST(Xrstor , X86M_Only_EDX_EAX , O(000F00,AE,5,_,_,_,_,_ ), 0 , 79 , 0 , 454, 201), // #1707
- INST(Xrstor64 , X86M_Only_EDX_EAX , O(000F00,AE,5,_,1,_,_,_ ), 0 , 242, 0 , 455, 201), // #1708
- INST(Xrstors , X86M_Only_EDX_EAX , O(000F00,C7,3,_,_,_,_,_ ), 0 , 80 , 0 , 454, 203), // #1709
- INST(Xrstors64 , X86M_Only_EDX_EAX , O(000F00,C7,3,_,1,_,_,_ ), 0 , 243, 0 , 455, 203), // #1710
- INST(Xsave , X86M_Only_EDX_EAX , O(000F00,AE,4,_,_,_,_,_ ), 0 , 98 , 0 , 454, 201), // #1711
- INST(Xsave64 , X86M_Only_EDX_EAX , O(000F00,AE,4,_,1,_,_,_ ), 0 , 244, 0 , 455, 201), // #1712
- INST(Xsavec , X86M_Only_EDX_EAX , O(000F00,C7,4,_,_,_,_,_ ), 0 , 98 , 0 , 454, 204), // #1713
- INST(Xsavec64 , X86M_Only_EDX_EAX , O(000F00,C7,4,_,1,_,_,_ ), 0 , 244, 0 , 455, 204), // #1714
- INST(Xsaveopt , X86M_Only_EDX_EAX , O(000F00,AE,6,_,_,_,_,_ ), 0 , 82 , 0 , 454, 205), // #1715
- INST(Xsaveopt64 , X86M_Only_EDX_EAX , O(000F00,AE,6,_,1,_,_,_ ), 0 , 245, 0 , 455, 205), // #1716
- INST(Xsaves , X86M_Only_EDX_EAX , O(000F00,C7,5,_,_,_,_,_ ), 0 , 79 , 0 , 454, 203), // #1717
- INST(Xsaves64 , X86M_Only_EDX_EAX , O(000F00,C7,5,_,1,_,_,_ ), 0 , 242, 0 , 455, 203), // #1718
- INST(Xsetbv , X86Op , O(000F01,D1,_,_,_,_,_,_ ), 0 , 23 , 0 , 178, 201), // #1719
- INST(Xsusldtrk , X86Op , O(F20F01,E8,_,_,_,_,_,_ ), 0 , 93 , 0 , 31 , 202), // #1720
- INST(Xtest , X86Op , O(000F01,D6,_,_,_,_,_,_ ), 0 , 23 , 0 , 31 , 206) // #1721
- // ${InstInfo:End}
-};
-#undef NAME_DATA_INDEX
-#undef INST
-
-// x86::InstDB - Opcode Tables
-// ===========================
-
-// ${MainOpcodeTable:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-const uint32_t InstDB::_mainOpcodeTable[] = {
- O(000000,00,0,0,0,0,0,0 ), // #0 [ref=56x]
- O(000F38,00,0,0,0,0,0,0 ), // #1 [ref=25x]
- O(660F38,00,0,0,0,0,0,0 ), // #2 [ref=44x]
- O(000000,00,2,0,0,0,0,0 ), // #3 [ref=4x]
- O(660F00,00,0,0,0,0,0,0 ), // #4 [ref=38x]
- O(000F00,00,0,0,0,0,0,0 ), // #5 [ref=231x]
- O(F20F00,00,0,0,0,0,0,0 ), // #6 [ref=24x]
- O(F30F00,00,0,0,0,0,0,0 ), // #7 [ref=29x]
- O(F30F38,00,0,0,0,0,0,0 ), // #8 [ref=3x]
- O(660F3A,00,0,0,0,0,0,0 ), // #9 [ref=22x]
- O(000000,00,4,0,0,0,0,0 ), // #10 [ref=5x]
- V(000F38,00,0,0,0,0,0,None), // #11 [ref=13x]
- O(F20F38,00,0,0,0,0,0,0 ), // #12 [ref=3x]
- V(XOP_M9,00,1,0,0,0,0,None), // #13 [ref=3x]
- V(XOP_M9,00,6,0,0,0,0,None), // #14 [ref=2x]
- V(XOP_M9,00,5,0,0,0,0,None), // #15 [ref=1x]
- V(XOP_M9,00,3,0,0,0,0,None), // #16 [ref=1x]
- V(XOP_M9,00,2,0,0,0,0,None), // #17 [ref=1x]
- V(000F38,00,3,0,0,0,0,None), // #18 [ref=1x]
- V(000F38,00,2,0,0,0,0,None), // #19 [ref=1x]
- V(000F38,00,1,0,0,0,0,None), // #20 [ref=1x]
- O(660000,00,0,0,0,0,0,0 ), // #21 [ref=7x]
- O(000000,00,0,0,1,0,0,0 ), // #22 [ref=3x]
- O(000F01,00,0,0,0,0,0,0 ), // #23 [ref=32x]
- O(000F00,00,7,0,0,0,0,0 ), // #24 [ref=6x]
- O(660F00,00,7,0,0,0,0,0 ), // #25 [ref=1x]
- O(F30F00,00,6,0,0,0,0,0 ), // #26 [ref=4x]
- O(F30F01,00,0,0,0,0,0,0 ), // #27 [ref=9x]
- O(660F00,00,6,0,0,0,0,0 ), // #28 [ref=3x]
- O(000000,00,7,0,0,0,0,0 ), // #29 [ref=5x]
- V(660F38,00,0,0,0,0,0,None), // #30 [ref=48x]
- O(000F00,00,1,0,1,0,0,0 ), // #31 [ref=2x]
- O(000F00,00,1,0,0,0,0,0 ), // #32 [ref=6x]
- O(000000,00,1,0,0,0,0,0 ), // #33 [ref=3x]
- O(000000,00,6,0,0,0,0,0 ), // #34 [ref=3x]
- O(F30F00,00,7,0,0,0,0,3 ), // #35 [ref=1x]
- O(F30F00,00,7,0,0,0,0,2 ), // #36 [ref=1x]
- O_FPU(00,D900,0) , // #37 [ref=29x]
- O_FPU(00,C000,0) , // #38 [ref=1x]
- O_FPU(00,DE00,0) , // #39 [ref=7x]
- O_FPU(00,0000,4) , // #40 [ref=4x]
- O_FPU(00,0000,6) , // #41 [ref=4x]
- O_FPU(9B,DB00,0) , // #42 [ref=2x]
- O_FPU(00,DA00,0) , // #43 [ref=5x]
- O_FPU(00,DB00,0) , // #44 [ref=8x]
- O_FPU(00,D000,2) , // #45 [ref=1x]
- O_FPU(00,DF00,0) , // #46 [ref=2x]
- O_FPU(00,D800,3) , // #47 [ref=1x]
- O_FPU(00,F000,6) , // #48 [ref=1x]
- O_FPU(00,F800,7) , // #49 [ref=1x]
- O_FPU(00,DD00,0) , // #50 [ref=3x]
- O_FPU(00,0000,0) , // #51 [ref=4x]
- O_FPU(00,0000,2) , // #52 [ref=3x]
- O_FPU(00,0000,3) , // #53 [ref=3x]
- O_FPU(00,0000,7) , // #54 [ref=3x]
- O_FPU(00,0000,1) , // #55 [ref=2x]
- O_FPU(00,0000,5) , // #56 [ref=2x]
- O_FPU(00,C800,1) , // #57 [ref=1x]
- O_FPU(9B,0000,6) , // #58 [ref=2x]
- O_FPU(9B,0000,7) , // #59 [ref=2x]
- O_FPU(00,E000,4) , // #60 [ref=1x]
- O_FPU(00,E800,5) , // #61 [ref=1x]
- O(000F00,00,0,0,1,0,0,0 ), // #62 [ref=3x]
- O(F30F3A,00,0,0,0,0,0,0 ), // #63 [ref=1x]
- O(000000,00,5,0,0,0,0,0 ), // #64 [ref=4x]
- O(F30F00,00,5,0,0,0,0,0 ), // #65 [ref=2x]
- O(F30F00,00,5,0,1,0,0,0 ), // #66 [ref=1x]
- V(660F00,00,0,1,0,0,0,None), // #67 [ref=7x]
- V(660F00,00,0,1,1,0,0,None), // #68 [ref=6x]
- V(000F00,00,0,1,1,0,0,None), // #69 [ref=7x]
- V(000F00,00,0,1,0,0,0,None), // #70 [ref=8x]
- V(660F00,00,0,0,0,0,0,None), // #71 [ref=15x]
- V(660F00,00,0,0,1,0,0,None), // #72 [ref=4x]
- V(000F00,00,0,0,1,0,0,None), // #73 [ref=4x]
- V(000F00,00,0,0,0,0,0,None), // #74 [ref=10x]
- V(660F3A,00,0,0,0,0,0,None), // #75 [ref=48x]
- V(660F3A,00,0,0,1,0,0,None), // #76 [ref=4x]
- O(000000,00,3,0,0,0,0,0 ), // #77 [ref=4x]
- O(000F00,00,2,0,0,0,0,0 ), // #78 [ref=5x]
- O(000F00,00,5,0,0,0,0,0 ), // #79 [ref=4x]
- O(000F00,00,3,0,0,0,0,0 ), // #80 [ref=5x]
- V(XOP_M9,00,0,0,0,0,0,None), // #81 [ref=32x]
- O(000F00,00,6,0,0,0,0,0 ), // #82 [ref=6x]
- V(XOP_MA,00,0,0,0,0,0,None), // #83 [ref=1x]
- V(XOP_MA,00,1,0,0,0,0,None), // #84 [ref=1x]
- V(F20F38,00,0,0,0,0,0,None), // #85 [ref=11x]
- O(000F3A,00,0,0,0,0,0,0 ), // #86 [ref=4x]
- O(F30000,00,0,0,0,0,0,0 ), // #87 [ref=1x]
- O(000F0F,00,0,0,0,0,0,0 ), // #88 [ref=26x]
- V(F30F38,00,0,0,0,0,0,None), // #89 [ref=12x]
- O(000F3A,00,0,0,1,0,0,0 ), // #90 [ref=1x]
- O(660F3A,00,0,0,1,0,0,0 ), // #91 [ref=1x]
- O(F30F00,00,4,0,0,0,0,0 ), // #92 [ref=1x]
- O(F20F01,00,0,0,0,0,0,0 ), // #93 [ref=5x]
- O(F30F00,00,1,0,0,0,0,0 ), // #94 [ref=3x]
- O(F30F00,00,7,0,0,0,0,0 ), // #95 [ref=1x]
- V(F20F3A,00,0,0,0,0,0,None), // #96 [ref=1x]
- O(660F01,00,0,0,0,0,0,0 ), // #97 [ref=4x]
- O(000F00,00,4,0,0,0,0,0 ), // #98 [ref=4x]
- V(XOP_M9,00,7,0,0,0,0,None), // #99 [ref=1x]
- V(XOP_M9,00,4,0,0,0,0,None), // #100 [ref=1x]
- O(F20F00,00,6,0,0,0,0,0 ), // #101 [ref=1x]
- E(F20F38,00,0,2,0,0,4,None), // #102 [ref=4x]
- E(F20F38,00,0,0,0,0,4,None), // #103 [ref=2x]
- V(660F00,00,0,0,0,1,4,ByLL), // #104 [ref=25x]
- E(00MAP5,00,0,0,0,0,4,ByLL), // #105 [ref=10x]
- V(000F00,00,0,0,0,0,4,ByLL), // #106 [ref=19x]
- V(F20F00,00,0,0,0,1,3,None), // #107 [ref=10x]
- E(F3MAP5,00,0,0,0,0,1,None), // #108 [ref=13x]
- V(F30F00,00,0,0,0,0,2,None), // #109 [ref=12x]
- V(F20F00,00,0,0,0,0,0,None), // #110 [ref=4x]
- V(660F38,00,0,0,0,0,4,ByLL), // #111 [ref=50x]
- E(660F3A,00,0,0,0,0,4,ByLL), // #112 [ref=17x]
- E(660F3A,00,0,0,0,1,4,ByLL), // #113 [ref=18x]
- E(660F38,00,0,0,0,1,4,ByLL), // #114 [ref=38x]
- E(660F38,00,0,0,0,0,4,ByLL), // #115 [ref=25x]
- V(660F38,00,0,1,0,0,0,None), // #116 [ref=2x]
- E(660F38,00,0,0,0,0,3,None), // #117 [ref=2x]
- E(660F38,00,0,0,0,0,4,None), // #118 [ref=2x]
- E(660F38,00,0,2,0,0,5,None), // #119 [ref=2x]
- E(660F38,00,0,0,0,1,4,None), // #120 [ref=2x]
- E(660F38,00,0,2,0,1,5,None), // #121 [ref=2x]
- V(660F38,00,0,0,0,1,3,None), // #122 [ref=2x]
- V(660F38,00,0,0,0,0,2,None), // #123 [ref=14x]
- E(000F3A,00,0,0,0,0,4,ByLL), // #124 [ref=5x]
- E(F30F3A,00,0,0,0,0,1,None), // #125 [ref=1x]
- V(660F00,00,0,0,0,1,3,None), // #126 [ref=5x]
- E(00MAP5,00,0,0,0,0,1,None), // #127 [ref=2x]
- V(000F00,00,0,0,0,0,2,None), // #128 [ref=2x]
- E(660F38,00,0,0,0,1,3,None), // #129 [ref=14x]
- E(660F38,00,0,0,0,0,2,None), // #130 [ref=14x]
- V(F30F00,00,0,0,0,0,3,ByLL), // #131 [ref=1x]
- E(F20F38,00,0,0,0,0,4,ByLL), // #132 [ref=2x]
- V(F30F38,00,0,0,0,0,4,ByLL), // #133 [ref=1x]
- V(F20F00,00,0,0,0,1,4,ByLL), // #134 [ref=1x]
- E(66MAP5,00,0,0,0,1,4,ByLL), // #135 [ref=1x]
- E(660F00,00,0,0,0,1,4,ByLL), // #136 [ref=10x]
- E(000F00,00,0,0,0,1,4,ByLL), // #137 [ref=3x]
- E(66MAP5,00,0,0,0,0,3,ByLL), // #138 [ref=1x]
- E(00MAP5,00,0,0,0,0,2,ByLL), // #139 [ref=1x]
- V(660F38,00,0,0,0,0,3,ByLL), // #140 [ref=7x]
- E(66MAP6,00,0,0,0,0,3,ByLL), // #141 [ref=1x]
- E(66MAP5,00,0,0,0,0,2,ByLL), // #142 [ref=4x]
- E(00MAP5,00,0,0,0,0,3,ByLL), // #143 [ref=2x]
- E(66MAP5,00,0,0,0,0,4,ByLL), // #144 [ref=3x]
- V(660F00,00,0,0,0,0,4,ByLL), // #145 [ref=43x]
- V(000F00,00,0,0,0,0,3,ByLL), // #146 [ref=1x]
- V(660F3A,00,0,0,0,0,3,ByLL), // #147 [ref=1x]
- E(660F00,00,0,0,0,0,3,ByLL), // #148 [ref=4x]
- E(000F00,00,0,0,0,0,4,ByLL), // #149 [ref=2x]
- E(F30F00,00,0,0,0,1,4,ByLL), // #150 [ref=3x]
- E(00MAP5,00,0,0,0,1,4,ByLL), // #151 [ref=1x]
- E(F2MAP5,00,0,0,0,1,3,None), // #152 [ref=1x]
- V(F20F00,00,0,0,0,0,3,None), // #153 [ref=2x]
- E(F20F00,00,0,0,0,0,3,None), // #154 [ref=2x]
- E(00MAP6,00,0,0,0,0,1,None), // #155 [ref=1x]
- V(F20F00,00,0,0,0,0,2,T1W ), // #156 [ref=1x]
- E(F3MAP5,00,0,0,0,0,2,T1W ), // #157 [ref=2x]
- V(F30F00,00,0,0,0,0,2,T1W ), // #158 [ref=1x]
- E(00MAP5,00,0,0,0,0,2,None), // #159 [ref=1x]
- E(F30F00,00,0,0,0,0,2,None), // #160 [ref=2x]
- E(F3MAP5,00,0,0,0,0,3,ByLL), // #161 [ref=1x]
- V(F30F00,00,0,0,0,0,4,ByLL), // #162 [ref=4x]
- E(F30F00,00,0,0,0,0,3,ByLL), // #163 [ref=1x]
- E(F2MAP5,00,0,0,0,0,4,ByLL), // #164 [ref=2x]
- E(F20F00,00,0,0,0,0,4,ByLL), // #165 [ref=2x]
- E(F2MAP5,00,0,0,0,1,4,ByLL), // #166 [ref=1x]
- E(F20F00,00,0,0,0,1,4,ByLL), // #167 [ref=2x]
- E(F20F00,00,0,0,0,0,2,T1W ), // #168 [ref=1x]
- E(F30F00,00,0,0,0,0,2,T1W ), // #169 [ref=1x]
- E(F3MAP5,00,0,0,0,0,4,ByLL), // #170 [ref=1x]
- E(F30F38,00,0,0,0,0,4,ByLL), // #171 [ref=3x]
- E(660F38,00,0,2,0,1,4,ByLL), // #172 [ref=3x]
- E(660F38,00,0,2,0,0,4,ByLL), // #173 [ref=3x]
- V(660F3A,00,0,1,0,0,0,None), // #174 [ref=6x]
- E(660F3A,00,0,0,0,0,4,None), // #175 [ref=4x]
- E(660F3A,00,0,2,0,0,5,None), // #176 [ref=4x]
- E(660F3A,00,0,0,0,1,4,None), // #177 [ref=4x]
- E(660F3A,00,0,2,0,1,5,None), // #178 [ref=4x]
- V(660F3A,00,0,0,0,0,2,None), // #179 [ref=4x]
- E(F2MAP6,00,0,0,0,0,4,ByLL), // #180 [ref=2x]
- E(F2MAP6,00,0,0,0,0,2,None), // #181 [ref=2x]
- E(660F3A,00,0,0,0,1,3,None), // #182 [ref=6x]
- E(660F3A,00,0,0,0,0,2,None), // #183 [ref=6x]
- V(660F38,00,0,0,1,1,4,ByLL), // #184 [ref=22x]
- E(66MAP6,00,0,0,0,0,4,ByLL), // #185 [ref=22x]
- V(660F38,00,0,0,1,1,3,None), // #186 [ref=12x]
- E(66MAP6,00,0,0,0,0,1,None), // #187 [ref=16x]
- E(F3MAP6,00,0,0,0,0,4,ByLL), // #188 [ref=2x]
- E(F3MAP6,00,0,0,0,0,2,None), // #189 [ref=2x]
- E(000F3A,00,0,0,0,0,1,None), // #190 [ref=4x]
- V(660F38,00,0,0,1,0,0,None), // #191 [ref=5x]
- E(660F38,00,1,2,0,1,3,None), // #192 [ref=2x]
- E(660F38,00,1,2,0,0,2,None), // #193 [ref=2x]
- E(660F38,00,2,2,0,1,3,None), // #194 [ref=2x]
- E(660F38,00,2,2,0,0,2,None), // #195 [ref=2x]
- V(660F3A,00,0,0,1,1,4,ByLL), // #196 [ref=2x]
- V(000F00,00,2,0,0,0,0,None), // #197 [ref=1x]
- V(660F00,00,0,0,0,0,2,None), // #198 [ref=1x]
- V(F20F00,00,0,0,0,1,3,DUP ), // #199 [ref=1x]
- E(660F00,00,0,0,0,0,4,ByLL), // #200 [ref=6x]
- V(F30F00,00,0,0,0,0,0,None), // #201 [ref=3x]
- E(F30F00,00,0,0,0,0,4,ByLL), // #202 [ref=1x]
- V(000F00,00,0,0,0,0,3,None), // #203 [ref=2x]
- E(66MAP5,00,0,0,0,0,1,None), // #204 [ref=1x]
- E(F20F38,00,0,0,0,1,4,ByLL), // #205 [ref=1x]
- V(660F3A,00,0,0,0,0,4,ByLL), // #206 [ref=2x]
- E(F30F38,00,0,0,0,1,0,None), // #207 [ref=5x]
- E(F30F38,00,0,0,0,0,0,None), // #208 [ref=5x]
- V(660F38,00,0,0,0,0,1,None), // #209 [ref=1x]
- V(XOP_M8,00,0,0,0,0,0,None), // #210 [ref=22x]
- V(660F38,00,0,0,0,1,4,ByLL), // #211 [ref=4x]
- E(660F38,00,0,0,0,0,0,None), // #212 [ref=2x]
- E(660F38,00,0,0,0,1,1,None), // #213 [ref=2x]
- E(660F38,00,0,0,1,1,4,ByLL), // #214 [ref=1x]
- V(660F3A,00,0,0,1,1,3,None), // #215 [ref=2x]
- V(660F3A,00,0,0,0,0,1,None), // #216 [ref=1x]
- V(660F00,00,0,0,0,0,1,None), // #217 [ref=1x]
- E(F30F38,00,0,0,0,0,2,ByLL), // #218 [ref=6x]
- E(F30F38,00,0,0,0,0,3,ByLL), // #219 [ref=9x]
- E(F30F38,00,0,0,0,0,1,ByLL), // #220 [ref=3x]
- V(660F38,00,0,0,0,0,2,ByLL), // #221 [ref=4x]
- V(660F38,00,0,0,0,0,1,ByLL), // #222 [ref=2x]
- E(660F00,00,1,0,0,0,4,ByLL), // #223 [ref=1x]
- E(660F00,00,1,0,0,1,4,ByLL), // #224 [ref=1x]
- V(F20F00,00,0,0,0,0,4,ByLL), // #225 [ref=1x]
- V(660F00,00,0,0,0,0,4,None), // #226 [ref=6x]
- V(660F00,00,7,0,0,0,4,ByLL), // #227 [ref=1x]
- V(660F00,00,0,0,0,1,4,None), // #228 [ref=2x]
- E(660F00,00,0,0,0,1,4,None), // #229 [ref=1x]
- V(660F00,00,3,0,0,0,4,ByLL), // #230 [ref=1x]
- E(F30F38,00,0,0,0,1,4,ByLL), // #231 [ref=2x]
- E(660F38,00,5,2,0,1,3,None), // #232 [ref=2x]
- E(660F38,00,5,2,0,0,2,None), // #233 [ref=2x]
- E(660F38,00,6,2,0,1,3,None), // #234 [ref=2x]
- E(660F38,00,6,2,0,0,2,None), // #235 [ref=2x]
- V(F20F38,00,0,1,0,0,0,None), // #236 [ref=3x]
- V(000F00,00,3,0,0,0,0,None), // #237 [ref=1x]
- O(F30F00,00,2,0,0,0,0,0 ), // #238 [ref=1x]
- O(F30F00,00,3,0,0,0,0,0 ), // #239 [ref=1x]
- O(000F38,00,0,0,1,0,0,0 ), // #240 [ref=1x]
- O(660F38,00,0,0,1,0,0,0 ), // #241 [ref=1x]
- O(000F00,00,5,0,1,0,0,0 ), // #242 [ref=2x]
- O(000F00,00,3,0,1,0,0,0 ), // #243 [ref=1x]
- O(000F00,00,4,0,1,0,0,0 ), // #244 [ref=2x]
- O(000F00,00,6,0,1,0,0,0 ) // #245 [ref=1x]
-};
-// ----------------------------------------------------------------------------
-// ${MainOpcodeTable:End}
-
-// ${AltOpcodeTable:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-const uint32_t InstDB::_altOpcodeTable[] = {
- O(000000,00,0,0,0,0,0,0 ), // #0 [ref=1573x]
- O(660F00,1B,0,0,0,0,0,0 ), // #1 [ref=1x]
- O(000F00,BA,4,0,0,0,0,0 ), // #2 [ref=1x]
- O(000F00,BA,7,0,0,0,0,0 ), // #3 [ref=1x]
- O(000F00,BA,6,0,0,0,0,0 ), // #4 [ref=1x]
- O(000F00,BA,5,0,0,0,0,0 ), // #5 [ref=1x]
- O(000000,48,0,0,0,0,0,0 ), // #6 [ref=1x]
- O(660F00,78,0,0,0,0,0,0 ), // #7 [ref=1x]
- O_FPU(00,00DF,5) , // #8 [ref=1x]
- O_FPU(00,00DF,7) , // #9 [ref=1x]
- O_FPU(00,00DD,1) , // #10 [ref=1x]
- O_FPU(00,00DB,5) , // #11 [ref=1x]
- O_FPU(00,DFE0,0) , // #12 [ref=1x]
- O(000000,DB,7,0,0,0,0,0 ), // #13 [ref=1x]
- O_FPU(9B,DFE0,0) , // #14 [ref=1x]
- O(000000,E4,0,0,0,0,0,0 ), // #15 [ref=1x]
- O(000000,40,0,0,0,0,0,0 ), // #16 [ref=1x]
- O(F20F00,78,0,0,0,0,0,0 ), // #17 [ref=1x]
- O(000000,77,0,0,0,0,0,0 ), // #18 [ref=2x]
- O(000000,73,0,0,0,0,0,0 ), // #19 [ref=3x]
- O(000000,72,0,0,0,0,0,0 ), // #20 [ref=3x]
- O(000000,76,0,0,0,0,0,0 ), // #21 [ref=2x]
- O(000000,74,0,0,0,0,0,0 ), // #22 [ref=2x]
- O(000000,E3,0,0,0,0,0,0 ), // #23 [ref=1x]
- O(000000,7F,0,0,0,0,0,0 ), // #24 [ref=2x]
- O(000000,7D,0,0,0,0,0,0 ), // #25 [ref=2x]
- O(000000,7C,0,0,0,0,0,0 ), // #26 [ref=2x]
- O(000000,7E,0,0,0,0,0,0 ), // #27 [ref=2x]
- O(000000,EB,0,0,0,0,0,0 ), // #28 [ref=1x]
- O(000000,75,0,0,0,0,0,0 ), // #29 [ref=2x]
- O(000000,71,0,0,0,0,0,0 ), // #30 [ref=1x]
- O(000000,7B,0,0,0,0,0,0 ), // #31 [ref=2x]
- O(000000,79,0,0,0,0,0,0 ), // #32 [ref=1x]
- O(000000,70,0,0,0,0,0,0 ), // #33 [ref=1x]
- O(000000,7A,0,0,0,0,0,0 ), // #34 [ref=2x]
- O(000000,78,0,0,0,0,0,0 ), // #35 [ref=1x]
- V(660F00,92,0,0,0,0,0,None), // #36 [ref=1x]
- V(F20F00,92,0,0,0,0,0,None), // #37 [ref=1x]
- V(F20F00,92,0,0,1,0,0,None), // #38 [ref=1x]
- V(000F00,92,0,0,0,0,0,None), // #39 [ref=1x]
- O(000000,9A,0,0,0,0,0,0 ), // #40 [ref=1x]
- O(000000,EA,0,0,0,0,0,0 ), // #41 [ref=1x]
- O(000000,E2,0,0,0,0,0,0 ), // #42 [ref=1x]
- O(000000,E1,0,0,0,0,0,0 ), // #43 [ref=1x]
- O(000000,E0,0,0,0,0,0,0 ), // #44 [ref=1x]
- O(660F00,29,0,0,0,0,0,0 ), // #45 [ref=1x]
- O(000F00,29,0,0,0,0,0,0 ), // #46 [ref=1x]
- O(000F38,F1,0,0,0,0,0,0 ), // #47 [ref=1x]
- O(000F00,7E,0,0,0,0,0,0 ), // #48 [ref=2x]
- O(660F00,7F,0,0,0,0,0,0 ), // #49 [ref=1x]
- O(F30F00,7F,0,0,0,0,0,0 ), // #50 [ref=1x]
- O(660F00,17,0,0,0,0,0,0 ), // #51 [ref=1x]
- O(000F00,17,0,0,0,0,0,0 ), // #52 [ref=1x]
- O(660F00,13,0,0,0,0,0,0 ), // #53 [ref=1x]
- O(000F00,13,0,0,0,0,0,0 ), // #54 [ref=1x]
- O(660F00,E7,0,0,0,0,0,0 ), // #55 [ref=1x]
- O(660F00,2B,0,0,0,0,0,0 ), // #56 [ref=1x]
- O(000F00,2B,0,0,0,0,0,0 ), // #57 [ref=1x]
- O(000F00,E7,0,0,0,0,0,0 ), // #58 [ref=1x]
- O(F20F00,2B,0,0,0,0,0,0 ), // #59 [ref=1x]
- O(F30F00,2B,0,0,0,0,0,0 ), // #60 [ref=1x]
- O(F20F00,11,0,0,0,0,0,0 ), // #61 [ref=1x]
- O(F30F00,11,0,0,0,0,0,0 ), // #62 [ref=1x]
- O(660F00,11,0,0,0,0,0,0 ), // #63 [ref=1x]
- O(000F00,11,0,0,0,0,0,0 ), // #64 [ref=1x]
- O(000000,E6,0,0,0,0,0,0 ), // #65 [ref=1x]
- O(000F3A,15,0,0,0,0,0,0 ), // #66 [ref=1x]
- O(000000,58,0,0,0,0,0,0 ), // #67 [ref=1x]
- O(000F00,72,6,0,0,0,0,0 ), // #68 [ref=1x]
- O(660F00,73,7,0,0,0,0,0 ), // #69 [ref=1x]
- O(000F00,73,6,0,0,0,0,0 ), // #70 [ref=1x]
- O(000F00,71,6,0,0,0,0,0 ), // #71 [ref=1x]
- O(000F00,72,4,0,0,0,0,0 ), // #72 [ref=1x]
- O(000F00,71,4,0,0,0,0,0 ), // #73 [ref=1x]
- O(000F00,72,2,0,0,0,0,0 ), // #74 [ref=1x]
- O(660F00,73,3,0,0,0,0,0 ), // #75 [ref=1x]
- O(000F00,73,2,0,0,0,0,0 ), // #76 [ref=1x]
- O(000F00,71,2,0,0,0,0,0 ), // #77 [ref=1x]
- O(000000,50,0,0,0,0,0,0 ), // #78 [ref=1x]
- O(000000,F6,0,0,0,0,0,0 ), // #79 [ref=1x]
- E(660F38,92,0,0,0,1,3,None), // #80 [ref=1x]
- E(660F38,92,0,0,0,0,2,None), // #81 [ref=1x]
- E(660F38,93,0,0,0,1,3,None), // #82 [ref=1x]
- E(660F38,93,0,0,0,0,2,None), // #83 [ref=1x]
- V(660F38,2F,0,0,0,0,0,None), // #84 [ref=1x]
- V(660F38,2E,0,0,0,0,0,None), // #85 [ref=1x]
- V(660F00,29,0,0,0,1,4,ByLL), // #86 [ref=1x]
- V(000F00,29,0,0,0,0,4,ByLL), // #87 [ref=1x]
- V(660F00,7E,0,0,0,0,2,None), // #88 [ref=1x]
- V(660F00,7F,0,0,0,0,0,None), // #89 [ref=1x]
- E(660F00,7F,0,0,0,0,4,ByLL), // #90 [ref=1x]
- E(660F00,7F,0,0,0,1,4,ByLL), // #91 [ref=1x]
- V(F30F00,7F,0,0,0,0,0,None), // #92 [ref=1x]
- E(F20F00,7F,0,0,0,1,4,ByLL), // #93 [ref=1x]
- E(F30F00,7F,0,0,0,0,4,ByLL), // #94 [ref=1x]
- E(F30F00,7F,0,0,0,1,4,ByLL), // #95 [ref=1x]
- E(F20F00,7F,0,0,0,0,4,ByLL), // #96 [ref=1x]
- V(660F00,17,0,0,0,1,3,None), // #97 [ref=1x]
- V(000F00,17,0,0,0,0,3,None), // #98 [ref=1x]
- V(660F00,13,0,0,0,1,3,None), // #99 [ref=1x]
- V(000F00,13,0,0,0,0,3,None), // #100 [ref=1x]
- V(660F00,7E,0,0,0,1,3,None), // #101 [ref=1x]
- V(F20F00,11,0,0,0,1,3,None), // #102 [ref=1x]
- E(F3MAP5,11,0,0,0,0,1,None), // #103 [ref=1x]
- V(F30F00,11,0,0,0,0,2,None), // #104 [ref=1x]
- V(660F00,11,0,0,0,1,4,ByLL), // #105 [ref=1x]
- V(000F00,11,0,0,0,0,4,ByLL), // #106 [ref=1x]
- E(66MAP5,7E,0,0,0,0,1,None), // #107 [ref=1x]
- E(660F38,7A,0,0,0,0,0,None), // #108 [ref=1x]
- E(660F38,7C,0,0,0,0,0,None), // #109 [ref=1x]
- E(660F38,7C,0,0,0,1,0,None), // #110 [ref=1x]
- E(660F38,7B,0,0,0,0,0,None), // #111 [ref=1x]
- V(660F3A,05,0,0,0,1,4,ByLL), // #112 [ref=1x]
- V(660F3A,04,0,0,0,0,4,ByLL), // #113 [ref=1x]
- V(660F3A,01,0,0,1,1,4,ByLL), // #114 [ref=1x]
- V(660F3A,00,0,0,1,1,4,ByLL), // #115 [ref=1x]
- E(660F38,90,0,0,0,0,2,None), // #116 [ref=1x]
- E(660F38,90,0,0,0,1,3,None), // #117 [ref=1x]
- E(660F38,91,0,0,0,0,2,None), // #118 [ref=1x]
- E(660F38,91,0,0,0,1,3,None), // #119 [ref=1x]
- V(660F38,8E,0,0,0,0,0,None), // #120 [ref=1x]
- V(660F38,8E,0,0,1,0,0,None), // #121 [ref=1x]
- V(XOP_M8,C0,0,0,0,0,0,None), // #122 [ref=1x]
- V(XOP_M8,C2,0,0,0,0,0,None), // #123 [ref=1x]
- V(XOP_M8,C3,0,0,0,0,0,None), // #124 [ref=1x]
- V(XOP_M8,C1,0,0,0,0,0,None), // #125 [ref=1x]
- V(660F00,72,6,0,0,0,4,ByLL), // #126 [ref=1x]
- V(660F00,73,6,0,0,1,4,ByLL), // #127 [ref=1x]
- V(660F00,71,6,0,0,0,4,ByLL), // #128 [ref=1x]
- V(660F00,72,4,0,0,0,4,ByLL), // #129 [ref=1x]
- E(660F00,72,4,0,0,1,4,ByLL), // #130 [ref=1x]
- V(660F00,71,4,0,0,0,4,ByLL), // #131 [ref=1x]
- V(660F00,72,2,0,0,0,4,ByLL), // #132 [ref=1x]
- V(660F00,73,2,0,0,1,4,ByLL), // #133 [ref=1x]
- V(660F00,71,2,0,0,0,4,ByLL) // #134 [ref=1x]
-};
-// ----------------------------------------------------------------------------
-// ${AltOpcodeTable:End}
-
-#undef O
-#undef V
-#undef E
-#undef O_FPU
-
-// x86::InstDB - CommonInfoTable
-// =============================
-
-// ${InstCommonTable:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-#define F(VAL) uint32_t(InstDB::InstFlags::k##VAL)
-#define X(VAL) uint32_t(InstDB::Avx512Flags::k##VAL)
-#define CONTROL_FLOW(VAL) uint8_t(InstControlFlow::k##VAL)
-#define SAME_REG_HINT(VAL) uint8_t(InstSameRegHint::k##VAL)
-const InstDB::CommonInfo InstDB::_commonInfoTable[] = {
- { 0 , 0 , 0 , 0 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #0 [ref=1x]
- { 0 , 0 , 457, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #1 [ref=4x]
- { 0 , 0 , 458, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #2 [ref=2x]
- { 0 , 0 , 108, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #3 [ref=6x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #4 [ref=2x]
- { 0 , 0 , 50 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #5 [ref=2x]
- { F(Vec) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #6 [ref=54x]
- { F(Vec) , 0 , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #7 [ref=19x]
- { F(Vec) , 0 , 283, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #8 [ref=16x]
- { F(Vec) , 0 , 292, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #9 [ref=20x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 33 , 12, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #10 [ref=1x]
- { F(Vex) , 0 , 325, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #11 [ref=3x]
- { F(Vec) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #12 [ref=12x]
- { 0 , 0 , 459, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #13 [ref=1x]
- { F(Vex) , 0 , 327, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #14 [ref=5x]
- { F(Vex) , 0 , 50 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #15 [ref=12x]
- { F(Vec) , 0 , 460, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #16 [ref=4x]
- { 0 , 0 , 329, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #17 [ref=3x]
- { F(Mib) , 0 , 461, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #18 [ref=1x]
- { 0 , 0 , 462, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #19 [ref=1x]
- { 0 , 0 , 331, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #20 [ref=1x]
- { F(Mib) , 0 , 463, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #21 [ref=1x]
- { 0 , 0 , 333, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #22 [ref=1x]
- { 0 , 0 , 49 , 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #23 [ref=35x]
- { 0 , 0 , 335, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #24 [ref=3x]
- { 0 , 0 , 134, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #25 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 134, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #26 [ref=3x]
- { F(Rep)|F(RepIgnored) , 0 , 235, 3 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #27 [ref=1x]
- { 0 , 0 , 464, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #28 [ref=1x]
- { 0 , 0 , 465, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #29 [ref=2x]
- { 0 , 0 , 436, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #30 [ref=1x]
- { 0 , 0 , 110, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #31 [ref=87x]
- { 0 , 0 , 466, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #32 [ref=24x]
- { 0 , 0 , 467, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #33 [ref=6x]
- { 0 , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #34 [ref=14x]
- { 0 , 0 , 469, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #35 [ref=1x]
- { 0 , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #36 [ref=1x]
- { F(Vex) , 0 , 337, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #37 [ref=16x]
- { F(Rep) , 0 , 179, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #38 [ref=1x]
- { F(Vec) , 0 , 470, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #39 [ref=2x]
- { F(Vec) , 0 , 471, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #40 [ref=3x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 183, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #41 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 472, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #42 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 473, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #43 [ref=1x]
- { 0 , 0 , 474, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #44 [ref=1x]
- { 0 , 0 , 475, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #45 [ref=1x]
- { 0 , 0 , 339, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #46 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 476, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #47 [ref=2x]
- { F(Mmx)|F(Vec) , 0 , 477, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #48 [ref=2x]
- { F(Mmx)|F(Vec) , 0 , 478, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #49 [ref=2x]
- { F(Vec) , 0 , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #50 [ref=2x]
- { F(Vec) , 0 , 343, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #51 [ref=1x]
- { F(Vec) , 0 , 345, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #52 [ref=1x]
- { F(Vec) , 0 , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #53 [ref=1x]
- { F(Vec) , 0 , 349, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #54 [ref=1x]
- { 0 , 0 , 479, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #55 [ref=1x]
- { 0 , 0 , 480, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #56 [ref=3x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 238, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #57 [ref=1x]
- { 0 , 0 , 45 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #58 [ref=3x]
- { F(Mmx) , 0 , 110, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #59 [ref=1x]
- { 0 , 0 , 351, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #60 [ref=2x]
- { 0 , 0 , 481, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #61 [ref=1x]
- { F(Vec) , 0 , 482, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #62 [ref=2x]
- { F(Vec) , 0 , 353, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #63 [ref=1x]
- { F(FpuM32)|F(FpuM64) , 0 , 241, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #64 [ref=6x]
- { 0 , 0 , 355, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #65 [ref=9x]
- { F(FpuM80) , 0 , 483, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #66 [ref=2x]
- { 0 , 0 , 356, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #67 [ref=13x]
- { F(FpuM32)|F(FpuM64) , 0 , 357, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #68 [ref=2x]
- { F(FpuM16)|F(FpuM32) , 0 , 484, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #69 [ref=9x]
- { F(FpuM16)|F(FpuM32)|F(FpuM64) , 0 , 485, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #70 [ref=3x]
- { F(FpuM32)|F(FpuM64)|F(FpuM80) , 0 , 486, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #71 [ref=2x]
- { F(FpuM16) , 0 , 487, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #72 [ref=3x]
- { F(FpuM16) , 0 , 488, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #73 [ref=2x]
- { F(FpuM32)|F(FpuM64) , 0 , 358, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #74 [ref=1x]
- { 0 , 0 , 489, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #75 [ref=4x]
- { 0 , 0 , 490, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #76 [ref=1x]
- { 0 , 0 , 45 , 10, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #77 [ref=1x]
- { 0 , 0 , 491, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #78 [ref=1x]
- { F(Lock) , 0 , 238, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #79 [ref=1x]
- { 0 , 0 , 379, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #80 [ref=2x]
- { 0 , 0 , 336, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #81 [ref=3x]
- { F(Rep) , 0 , 492, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #82 [ref=1x]
- { F(Vec) , 0 , 359, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #83 [ref=1x]
- { 0 , 0 , 493, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #84 [ref=2x]
- { 0 , 0 , 494, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #85 [ref=8x]
- { 0 , 0 , 361, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #86 [ref=3x]
- { 0 , 0 , 363, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #87 [ref=1x]
- { 0 , 0 , 365, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #88 [ref=1x]
- { 0 , 0 , 110, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #89 [ref=2x]
- { 0 , 0 , 468, 1 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #90 [ref=1x]
- { F(Rep) , 0 , 244, 1 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #91 [ref=30x]
- { F(Rep) , 0 , 367, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #92 [ref=1x]
- { F(Rep) , 0 , 244, 3 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #93 [ref=1x]
- { F(Vex) , 0 , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #94 [ref=19x]
- { F(Vex) , 0 , 369, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #95 [ref=1x]
- { F(Vex) , 0 , 371, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #96 [ref=1x]
- { F(Vex) , 0 , 187, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #97 [ref=1x]
- { F(Vex) , 0 , 373, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #98 [ref=1x]
- { F(Vex) , 0 , 496, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #99 [ref=12x]
- { F(Vex) , 0 , 497, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #100 [ref=8x]
- { F(Vex) , 0 , 495, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #101 [ref=8x]
- { 0 , 0 , 498, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #102 [ref=2x]
- { 0 , 0 , 253, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #103 [ref=1x]
- { 0 , 0 , 247, 3 , CONTROL_FLOW(Call), SAME_REG_HINT(None)}, // #104 [ref=1x]
- { F(Vec) , 0 , 169, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #105 [ref=2x]
- { 0 , 0 , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #106 [ref=2x]
- { 0 , 0 , 375, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #107 [ref=2x]
- { F(Vex) , 0 , 500, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #108 [ref=2x]
- { 0 , 0 , 377, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #109 [ref=1x]
- { 0 , 0 , 250, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #110 [ref=3x]
- { 0 , 0 , 247, 3 , CONTROL_FLOW(Jump), SAME_REG_HINT(None)}, // #111 [ref=1x]
- { 0 , 0 , 501, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #112 [ref=5x]
- { F(Vex) , 0 , 379, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #113 [ref=2x]
- { F(Rep) , 0 , 191, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #114 [ref=1x]
- { 0 , 0 , 367, 2 , CONTROL_FLOW(Branch), SAME_REG_HINT(None)}, // #115 [ref=3x]
- { 0 , 0 , 253, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #116 [ref=1x]
- { F(Vex) , 0 , 381, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #117 [ref=2x]
- { F(Vec) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #118 [ref=1x]
- { F(Mmx) , 0 , 503, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #119 [ref=1x]
- { 0 , 0 , 504, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #120 [ref=2x]
- { F(XRelease) , 0 , 0 , 20, CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #121 [ref=1x]
- { 0 , 0 , 55 , 9 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #122 [ref=1x]
- { F(Vec) , 0 , 72 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #123 [ref=6x]
- { 0 , 0 , 104, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #124 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 383, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #125 [ref=1x]
- { 0 , 0 , 385, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #126 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 505, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #127 [ref=1x]
- { F(Vec) , 0 , 354, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #128 [ref=2x]
- { F(Vec) , 0 , 80 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #129 [ref=4x]
- { F(Vec) , 0 , 506, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #130 [ref=2x]
- { F(Vec) , 0 , 73 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #131 [ref=3x]
- { F(Mmx) , 0 , 507, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #132 [ref=1x]
- { F(Vec) , 0 , 80 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #133 [ref=1x]
- { F(Vec) , 0 , 88 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #134 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 139, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #135 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 508, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #136 [ref=1x]
- { F(Rep) , 0 , 195, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #137 [ref=1x]
- { F(Vec) , 0 , 387, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #138 [ref=1x]
- { F(Vec) , 0 , 389, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #139 [ref=1x]
- { 0 , 0 , 256, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #140 [ref=2x]
- { 0 , 0 , 391, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #141 [ref=1x]
- { F(Vex) , 0 , 393, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #142 [ref=1x]
- { 0 , 0 , 509, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #143 [ref=1x]
- { 0 , 0 , 510, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #144 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 239, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #145 [ref=2x]
- { 0 , 0 , 110, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #146 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #147 [ref=1x]
- { 0 , 0 , 511, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #148 [ref=1x]
- { F(Rep) , 0 , 512, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #149 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 395, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #150 [ref=37x]
- { F(Mmx)|F(Vec) , 0 , 397, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #151 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 395, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #152 [ref=6x]
- { F(Mmx)|F(Vec) , 0 , 395, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #153 [ref=16x]
- { F(Mmx) , 0 , 139, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #154 [ref=26x]
- { F(Vec) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #155 [ref=4x]
- { F(Vec) , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #156 [ref=1x]
- { F(Vec) , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #157 [ref=1x]
- { F(Vec) , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #158 [ref=1x]
- { F(Vec) , 0 , 516, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #159 [ref=1x]
- { F(Vec) , 0 , 517, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #160 [ref=1x]
- { F(Vec) , 0 , 518, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #161 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 399, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #162 [ref=1x]
- { F(Vec) , 0 , 519, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #163 [ref=1x]
- { F(Vec) , 0 , 520, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #164 [ref=1x]
- { F(Vec) , 0 , 521, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #165 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 522, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #166 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 523, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #167 [ref=1x]
- { F(Vec) , 0 , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #168 [ref=2x]
- { 0 , 0 , 144, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #169 [ref=1x]
- { F(Mmx) , 0 , 397, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #170 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 401, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #171 [ref=8x]
- { F(Vec) , 0 , 524, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #172 [ref=2x]
- { 0 , 0 , 403, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #173 [ref=1x]
- { F(Mmx)|F(Vec) , 0 , 405, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #174 [ref=3x]
- { 0 , 0 , 149, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #175 [ref=1x]
- { 0 , 0 , 407, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #176 [ref=8x]
- { 0 , 0 , 525, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #177 [ref=4x]
- { 0 , 0 , 526, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #178 [ref=8x]
- { 0 , 0 , 409, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #179 [ref=1x]
- { F(Rep)|F(RepIgnored) , 0 , 411, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #180 [ref=1x]
- { 0 , 0 , 411, 2 , CONTROL_FLOW(Return), SAME_REG_HINT(None)}, // #181 [ref=1x]
- { F(Vex) , 0 , 413, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #182 [ref=1x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 20 , 13, CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #183 [ref=3x]
- { F(Rep) , 0 , 199, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #184 [ref=1x]
- { 0 , 0 , 527, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #185 [ref=30x]
- { 0 , 0 , 259, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #186 [ref=2x]
- { 0 , 0 , 415, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #187 [ref=3x]
- { F(Rep) , 0 , 203, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #188 [ref=1x]
- { F(Vex) , 0 , 528, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #189 [ref=8x]
- { 0 , 0 , 64 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #190 [ref=1x]
- { F(Tsib)|F(Vex) , 0 , 529, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #191 [ref=2x]
- { F(Vex) , 0 , 468, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #192 [ref=1x]
- { F(Tsib)|F(Vex) , 0 , 530, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #193 [ref=1x]
- { F(Vex) , 0 , 531, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #194 [ref=1x]
- { 0 , 0 , 532, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #195 [ref=2x]
- { 0 , 0 , 50 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #196 [ref=2x]
- { 0 , 0 , 417, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #197 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 533, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #198 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(T4X)|X(Z) , 534, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #199 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #200 [ref=22x]
- { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #201 [ref=23x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #202 [ref=22x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #203 [ref=18x]
- { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #204 [ref=18x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #205 [ref=17x]
- { F(Vec)|F(Vex) , 0 , 262, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #206 [ref=29x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #207 [ref=5x]
- { F(Vec)|F(Vex) , 0 , 72 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #208 [ref=17x]
- { F(Vec)|F(Vex) , 0 , 292, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #209 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #210 [ref=4x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #211 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #212 [ref=10x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #213 [ref=12x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #214 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #215 [ref=6x]
- { F(Vec)|F(Vex) , 0 , 538, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #216 [ref=2x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #217 [ref=17x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #218 [ref=12x]
- { F(Vec)|F(Vex) , 0 , 265, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #219 [ref=6x]
- { F(Vec)|F(Vex) , 0 , 419, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #220 [ref=3x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 539, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #221 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 540, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #222 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 541, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #223 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 542, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #224 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 447, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #225 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 540, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #226 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 543, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #227 [ref=1x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE) , 268, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #228 [ref=1x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #229 [ref=1x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE) , 268, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #230 [ref=1x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K)|X(SAE) , 544, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #231 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(SAE) , 545, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #232 [ref=1x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K)|X(SAE) , 546, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #233 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #234 [ref=2x]
- { F(Evex)|F(Vec) , X(SAE) , 313, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #235 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 283, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #236 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 274, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #237 [ref=6x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #238 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #239 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #240 [ref=3x]
- { F(Vec)|F(Vex) , 0 , 169, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #241 [ref=5x]
- { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #242 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #243 [ref=2x]
- { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 547, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #244 [ref=3x]
- { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #245 [ref=4x]
- { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #246 [ref=3x]
- { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #247 [ref=2x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #248 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #249 [ref=1x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #250 [ref=3x]
- { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #251 [ref=2x]
- { F(Evex)|F(Vec) , X(B16)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #252 [ref=5x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #253 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 286, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #254 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #255 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #256 [ref=2x]
- { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #257 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #258 [ref=1x]
- { F(Evex)|F(Vec) , X(ER)|X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #259 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #260 [ref=5x]
- { F(Evex)|F(Vec) , X(ER)|X(SAE) , 423, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #261 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #262 [ref=2x]
- { F(Evex)|F(Vec) , X(ER)|X(SAE) , 427, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #263 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #264 [ref=3x]
- { F(Evex)|F(Vec) , X(ER)|X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #265 [ref=6x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(ER)|X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #266 [ref=1x]
- { F(Evex)|F(Vec) , X(ER)|X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #267 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #268 [ref=1x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #269 [ref=3x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 421, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #270 [ref=1x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #271 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #272 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #273 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #274 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #275 [ref=1x]
- { F(Evex)|F(Vec) , X(SAE) , 341, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #276 [ref=1x]
- { F(Evex)|F(Vec) , X(SAE) , 423, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #277 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #278 [ref=1x]
- { F(Evex)|F(Vec) , X(SAE) , 347, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #279 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #280 [ref=1x]
- { F(Evex)|F(Vec) , X(ER)|X(SAE) , 425, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #281 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #282 [ref=3x]
- { F(Vec)|F(Vex) , 0 , 265, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #283 [ref=10x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 78 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #284 [ref=3x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 78 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #285 [ref=3x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #286 [ref=8x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 287, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #287 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 548, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #288 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 288, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #289 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 482, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #290 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #291 [ref=5x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #292 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #293 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #294 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #295 [ref=4x]
- { F(Vec)|F(Vex) , 0 , 207, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #296 [ref=13x]
- { F(Vec)|F(Vex) , 0 , 429, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #297 [ref=4x]
- { F(Vec)|F(Vex) , 0 , 431, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #298 [ref=4x]
- { F(Evex)|F(Vec) , X(B64)|X(K) , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #299 [ref=1x]
- { F(Evex)|F(Vec) , X(B16)|X(K) , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #300 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(K) , 551, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #301 [ref=1x]
- { F(Evex)|F(Vec) , X(K) , 552, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #302 [ref=1x]
- { F(Evex)|F(Vec) , X(K) , 553, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #303 [ref=1x]
- { F(Evex)|F(Vec) , X(K) , 554, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #304 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 280, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #305 [ref=7x]
- { F(Vec)|F(Vex) , 0 , 143, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #306 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 283, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #307 [ref=1x]
- { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 211, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #308 [ref=2x]
- { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 154, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #309 [ref=2x]
- { F(Evex)|F(Vsib) , X(K) , 555, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #310 [ref=4x]
- { F(Evex)|F(Vsib) , X(K) , 556, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #311 [ref=4x]
- { F(Evex)|F(Vsib) , X(K) , 557, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #312 [ref=8x]
- { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 159, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #313 [ref=2x]
- { F(Evex)|F(EvexTwoOp)|F(Vec)|F(Vex)|F(Vsib) , X(K) , 289, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #314 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #315 [ref=3x]
- { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #316 [ref=3x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(SAE)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #317 [ref=2x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #318 [ref=3x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(SAE)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #319 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(SAE)|X(Z) , 558, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #320 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #321 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #322 [ref=22x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 433, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #323 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 433, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #324 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 559, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #325 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #326 [ref=1x]
- { F(Vex) , 0 , 499, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #327 [ref=2x]
- { F(Vec)|F(Vex) , 0 , 502, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #328 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 215, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #329 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #330 [ref=2x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #331 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #332 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(SAE)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #333 [ref=2x]
- { 0 , 0 , 435, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #334 [ref=3x]
- { 0 , 0 , 437, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #335 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 72 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #336 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 439, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #337 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 295, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #338 [ref=1x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 72 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #339 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 116, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #340 [ref=6x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 82 , 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #341 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 219, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #342 [ref=4x]
- { F(Vec)|F(Vex) , 0 , 560, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #343 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 164, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #344 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 169, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #345 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 174, 5 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #346 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 80 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #347 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 223, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #348 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #349 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 88 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #350 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 441, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #351 [ref=1x]
- { 0 , 0 , 443, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #352 [ref=1x]
- { 0 , 0 , 445, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #353 [ref=1x]
- { F(Evex)|F(Vec) , X(B32) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #354 [ref=1x]
- { F(Evex)|F(Vec) , X(B64) , 298, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #355 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #356 [ref=1x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #357 [ref=5x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 262, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #358 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #359 [ref=2x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 262, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #360 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #361 [ref=2x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #362 [ref=2x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #363 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #364 [ref=13x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 561, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #365 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 562, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #366 [ref=1x]
- { F(Evex)|F(Vec) , 0 , 563, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #367 [ref=6x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 447, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #368 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 564, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #369 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #370 [ref=1x]
- { F(Evex)|F(Vec) , X(K) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #371 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(K) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #372 [ref=2x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(K) , 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #373 [ref=4x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B32)|X(K) , 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #374 [ref=2x]
- { F(Evex)|F(EvexKReg)|F(Vec)|F(Vex) , X(B64)|X(K) , 301, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #375 [ref=2x]
- { F(Vec)|F(Vex) , 0 , 513, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #376 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 514, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #377 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 515, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #378 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 516, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #379 [ref=1x]
- { F(Evex)|F(Vec) , X(B64)|X(K) , 271, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #380 [ref=4x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #381 [ref=6x]
- { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #382 [ref=4x]
- { F(Vec)|F(Vex) , 0 , 266, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #383 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 263, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #384 [ref=2x]
- { F(Vec)|F(Vex) , 0 , 227, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #385 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 96 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #386 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 96 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #387 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 231, 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #388 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 517, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #389 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 518, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #390 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 565, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #391 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 566, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #392 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 567, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #393 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 568, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #394 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 569, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #395 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 419, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #396 [ref=12x]
- { F(Evex)|F(EvexCompat)|F(PreferEvex)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #397 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #398 [ref=8x]
- { F(Evex)|F(Vec) , 0 , 570, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #399 [ref=4x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 304, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #400 [ref=6x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 307, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #401 [ref=9x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 310, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #402 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 283, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #403 [ref=4x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 313, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #404 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 277, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #405 [ref=6x]
- { F(Vec)|F(Vex) , 0 , 207, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #406 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #407 [ref=3x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #408 [ref=3x]
- { F(Vec)|F(Vex) , 0 , 449, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #409 [ref=4x]
- { F(Evex)|F(Vec)|F(Vsib) , X(K) , 316, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #410 [ref=2x]
- { F(Evex)|F(Vec)|F(Vsib) , X(K) , 451, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #411 [ref=2x]
- { F(Evex)|F(Vec)|F(Vsib) , X(K) , 453, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #412 [ref=2x]
- { F(Evex)|F(Vec)|F(Vsib) , X(K) , 319, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #413 [ref=2x]
- { F(Vec)|F(Vex) , 0 , 455, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #414 [ref=8x]
- { F(Evex)|F(Vec) , X(K) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #415 [ref=5x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #416 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #417 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 122, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #418 [ref=3x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , 0 , 292, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #419 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 122, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #420 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 122, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #421 [ref=3x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 128, 6 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #422 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #423 [ref=6x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #424 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(WO)}, // #425 [ref=2x]
- { F(Evex)|F(Vec) , X(B32)|X(K) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #426 [ref=2x]
- { F(Evex)|F(Vec) , X(B64)|X(K) , 322, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #427 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 535, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #428 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #429 [ref=2x]
- { F(Evex)|F(Vec) , X(B16)|X(K)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #430 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 536, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #431 [ref=2x]
- { F(Vec)|F(Vex) , 0 , 537, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #432 [ref=2x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #433 [ref=1x]
- { F(Evex)|F(Vec) , X(K)|X(Z) , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #434 [ref=1x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 292, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #435 [ref=2x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 549, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #436 [ref=1x]
- { F(EvexTransformable)|F(Vec)|F(Vex) , 0 , 550, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #437 [ref=1x]
- { F(Evex)|F(Vec) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 262, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #438 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 571, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #439 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 572, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #440 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 573, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #441 [ref=1x]
- { F(Evex)|F(Vec) , X(B32)|X(K)|X(Z) , 266, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #442 [ref=2x]
- { F(Evex)|F(Vec) , X(B64)|X(K)|X(Z) , 266, 2 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #443 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #444 [ref=1x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B32)|X(K)|X(Z) , 265, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #445 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 262, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #446 [ref=2x]
- { F(Evex)|F(EvexCompat)|F(Vec)|F(Vex) , X(B64)|X(ER)|X(K)|X(SAE)|X(Z) , 280, 3 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #447 [ref=1x]
- { F(Vec)|F(Vex) , 0 , 110, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #448 [ref=2x]
- { 0 , 0 , 27 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #449 [ref=2x]
- { 0 , 0 , 28 , 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #450 [ref=2x]
- { F(Lock)|F(XAcquire)|F(XRelease) , 0 , 25 , 4 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #451 [ref=1x]
- { 0 , 0 , 236, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #452 [ref=1x]
- { F(XAcquire) , 0 , 25 , 8 , CONTROL_FLOW(Regular), SAME_REG_HINT(RO)}, // #453 [ref=1x]
- { 0 , 0 , 574, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)}, // #454 [ref=6x]
- { 0 , 0 , 575, 1 , CONTROL_FLOW(Regular), SAME_REG_HINT(None)} // #455 [ref=6x]
-};
-#undef SAME_REG_HINT
-#undef CONTROL_FLOW
-#undef X
-#undef F
-// ----------------------------------------------------------------------------
-// ${InstCommonTable:End}
-
-// x86::InstDB - AdditionalInfoTable
-// =================================
-
-// ${AdditionalInfoTable:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)
-const InstDB::AdditionalInfo InstDB::_additionalInfoTable[] = {
- { 0, 0, { 0 } }, // #0 [ref=67x]
- { 0, 1, { 0 } }, // #1 [ref=32x]
- { 0, 0, { EXT(RAO_INT) } }, // #2 [ref=4x]
- { 0, 2, { 0 } }, // #3 [ref=2x]
- { 0, 3, { EXT(ADX) } }, // #4 [ref=1x]
- { 0, 0, { EXT(SSE2) } }, // #5 [ref=60x]
- { 0, 0, { EXT(SSE) } }, // #6 [ref=46x]
- { 0, 0, { EXT(SSE3) } }, // #7 [ref=10x]
- { 0, 4, { EXT(ADX) } }, // #8 [ref=1x]
- { 0, 0, { EXT(AESNI) } }, // #9 [ref=6x]
- { 0, 1, { EXT(BMI) } }, // #10 [ref=6x]
- { 0, 5, { 0 } }, // #11 [ref=5x]
- { 0, 0, { EXT(TBM) } }, // #12 [ref=9x]
- { 0, 0, { EXT(SSE4_1) } }, // #13 [ref=47x]
- { 0, 0, { EXT(MPX) } }, // #14 [ref=7x]
- { 0, 6, { 0 } }, // #15 [ref=4x]
- { 0, 1, { EXT(BMI2) } }, // #16 [ref=1x]
- { 0, 7, { EXT(SMAP) } }, // #17 [ref=2x]
- { 0, 8, { 0 } }, // #18 [ref=2x]
- { 0, 9, { 0 } }, // #19 [ref=2x]
- { 0, 0, { EXT(CLDEMOTE) } }, // #20 [ref=1x]
- { 0, 0, { EXT(CLFLUSH) } }, // #21 [ref=1x]
- { 0, 0, { EXT(CLFLUSHOPT) } }, // #22 [ref=1x]
- { 0, 0, { EXT(SVM) } }, // #23 [ref=6x]
- { 0, 10, { 0 } }, // #24 [ref=2x]
- { 0, 1, { EXT(CET_SS) } }, // #25 [ref=3x]
- { 0, 0, { EXT(UINTR) } }, // #26 [ref=4x]
- { 0, 0, { EXT(CLWB) } }, // #27 [ref=1x]
- { 0, 0, { EXT(CLZERO) } }, // #28 [ref=1x]
- { 0, 3, { 0 } }, // #29 [ref=1x]
- { 0, 11, { EXT(CMOV) } }, // #30 [ref=4x]
- { 0, 12, { EXT(CMOV) } }, // #31 [ref=6x]
- { 0, 13, { EXT(CMOV) } }, // #32 [ref=4x]
- { 0, 14, { EXT(CMOV) } }, // #33 [ref=4x]
- { 0, 15, { EXT(CMOV) } }, // #34 [ref=4x]
- { 0, 16, { EXT(CMOV) } }, // #35 [ref=2x]
- { 0, 17, { EXT(CMOV) } }, // #36 [ref=4x]
- { 0, 18, { EXT(CMOV) } }, // #37 [ref=2x]
- { 0, 1, { EXT(CMPCCXADD) } }, // #38 [ref=16x]
- { 0, 19, { 0 } }, // #39 [ref=2x]
- { 0, 1, { EXT(I486) } }, // #40 [ref=2x]
- { 0, 5, { EXT(CMPXCHG16B) } }, // #41 [ref=1x]
- { 0, 5, { EXT(CMPXCHG8B) } }, // #42 [ref=1x]
- { 0, 1, { EXT(SSE2) } }, // #43 [ref=2x]
- { 0, 1, { EXT(SSE) } }, // #44 [ref=2x]
- { 0, 0, { EXT(I486) } }, // #45 [ref=5x]
- { 0, 0, { EXT(SSE4_2) } }, // #46 [ref=2x]
- { 0, 20, { 0 } }, // #47 [ref=2x]
- { 0, 0, { EXT(MMX) } }, // #48 [ref=1x]
- { 0, 0, { EXT(CET_IBT) } }, // #49 [ref=2x]
- { 0, 1, { EXT(ENQCMD) } }, // #50 [ref=2x]
- { 0, 0, { EXT(SSE4A) } }, // #51 [ref=4x]
- { 0, 21, { EXT(FPU) } }, // #52 [ref=80x]
- { 0, 22, { EXT(CMOV), EXT(FPU) } }, // #53 [ref=2x]
- { 0, 23, { EXT(CMOV), EXT(FPU) } }, // #54 [ref=2x]
- { 0, 24, { EXT(CMOV), EXT(FPU) } }, // #55 [ref=2x]
- { 0, 25, { EXT(CMOV), EXT(FPU) } }, // #56 [ref=2x]
- { 0, 26, { EXT(FPU) } }, // #57 [ref=4x]
- { 0, 0, { EXT(3DNOW) } }, // #58 [ref=21x]
- { 0, 21, { EXT(SSE3), EXT(FPU) } }, // #59 [ref=1x]
- { 0, 21, { EXT(FXSR) } }, // #60 [ref=2x]
- { 0, 27, { EXT(FXSR) } }, // #61 [ref=2x]
- { 0, 0, { EXT(SMX) } }, // #62 [ref=1x]
- { 0, 0, { EXT(GFNI) } }, // #63 [ref=3x]
- { 0, 0, { EXT(HRESET) } }, // #64 [ref=1x]
- { 0, 0, { EXT(CET_SS) } }, // #65 [ref=9x]
- { 0, 16, { 0 } }, // #66 [ref=5x]
- { 0, 0, { EXT(VMX) } }, // #67 [ref=13x]
- { 0, 0, { EXT(INVLPGB) } }, // #68 [ref=2x]
- { 0, 11, { 0 } }, // #69 [ref=8x]
- { 0, 12, { 0 } }, // #70 [ref=12x]
- { 0, 13, { 0 } }, // #71 [ref=10x]
- { 0, 14, { 0 } }, // #72 [ref=8x]
- { 0, 15, { 0 } }, // #73 [ref=8x]
- { 0, 17, { 0 } }, // #74 [ref=8x]
- { 0, 18, { 0 } }, // #75 [ref=4x]
- { 0, 0, { EXT(AVX512_DQ) } }, // #76 [ref=22x]
- { 0, 0, { EXT(AVX512_BW) } }, // #77 [ref=20x]
- { 0, 0, { EXT(AVX512_F) } }, // #78 [ref=36x]
- { 1, 0, { EXT(AVX512_DQ) } }, // #79 [ref=1x]
- { 1, 0, { EXT(AVX512_BW) } }, // #80 [ref=2x]
- { 1, 0, { EXT(AVX512_F) } }, // #81 [ref=1x]
- { 0, 1, { EXT(AVX512_DQ) } }, // #82 [ref=3x]
- { 0, 1, { EXT(AVX512_BW) } }, // #83 [ref=4x]
- { 0, 1, { EXT(AVX512_F) } }, // #84 [ref=1x]
- { 0, 28, { EXT(LAHFSAHF) } }, // #85 [ref=1x]
- { 0, 0, { EXT(AMX_TILE) } }, // #86 [ref=7x]
- { 0, 0, { EXT(LWP) } }, // #87 [ref=4x]
- { 0, 29, { 0 } }, // #88 [ref=3x]
- { 0, 1, { EXT(LZCNT) } }, // #89 [ref=1x]
- { 0, 0, { EXT(MMX2) } }, // #90 [ref=3x]
- { 0, 1, { EXT(MCOMMIT) } }, // #91 [ref=1x]
- { 0, 0, { EXT(MONITOR) } }, // #92 [ref=2x]
- { 0, 0, { EXT(MONITORX) } }, // #93 [ref=2x]
- { 1, 0, { 0 } }, // #94 [ref=1x]
- { 1, 0, { EXT(SSE2) } }, // #95 [ref=5x]
- { 1, 0, { EXT(SSE) } }, // #96 [ref=3x]
- { 0, 0, { EXT(MOVBE) } }, // #97 [ref=1x]
- { 0, 0, { EXT(MMX), EXT(SSE2) } }, // #98 [ref=45x]
- { 0, 0, { EXT(MOVDIR64B) } }, // #99 [ref=1x]
- { 0, 0, { EXT(MOVDIRI) } }, // #100 [ref=1x]
- { 1, 0, { EXT(MMX), EXT(SSE2) } }, // #101 [ref=1x]
- { 0, 0, { EXT(BMI2) } }, // #102 [ref=7x]
- { 0, 0, { EXT(SSSE3) } }, // #103 [ref=16x]
- { 0, 0, { EXT(MMX2), EXT(SSE2) } }, // #104 [ref=10x]
- { 0, 0, { EXT(PCLMULQDQ) } }, // #105 [ref=1x]
- { 0, 1, { EXT(SSE4_2) } }, // #106 [ref=4x]
- { 0, 0, { EXT(PCONFIG) } }, // #107 [ref=1x]
- { 0, 0, { EXT(MMX2), EXT(SSE2), EXT(SSE4_1) } }, // #108 [ref=1x]
- { 0, 0, { EXT(3DNOW2) } }, // #109 [ref=5x]
- { 0, 0, { EXT(GEODE) } }, // #110 [ref=2x]
- { 0, 1, { EXT(POPCNT) } }, // #111 [ref=1x]
- { 0, 30, { 0 } }, // #112 [ref=3x]
- { 0, 0, { EXT(PREFETCHI) } }, // #113 [ref=2x]
- { 0, 1, { EXT(PREFETCHW) } }, // #114 [ref=1x]
- { 0, 1, { EXT(PREFETCHWT1) } }, // #115 [ref=1x]
- { 0, 20, { EXT(SEV_SNP) } }, // #116 [ref=3x]
- { 0, 1, { EXT(SSE4_1) } }, // #117 [ref=1x]
- { 0, 0, { EXT(PTWRITE) } }, // #118 [ref=1x]
- { 0, 31, { 0 } }, // #119 [ref=3x]
- { 0, 1, { EXT(SEV_SNP) } }, // #120 [ref=1x]
- { 0, 32, { 0 } }, // #121 [ref=2x]
- { 0, 0, { EXT(FSGSBASE) } }, // #122 [ref=4x]
- { 0, 0, { EXT(MSR) } }, // #123 [ref=2x]
- { 0, 0, { EXT(RDPID) } }, // #124 [ref=1x]
- { 0, 0, { EXT(OSPKE) } }, // #125 [ref=1x]
- { 0, 0, { EXT(RDPRU) } }, // #126 [ref=1x]
- { 0, 1, { EXT(RDRAND) } }, // #127 [ref=1x]
- { 0, 1, { EXT(RDSEED) } }, // #128 [ref=1x]
- { 0, 0, { EXT(RDTSC) } }, // #129 [ref=1x]
- { 0, 0, { EXT(RDTSCP) } }, // #130 [ref=1x]
- { 0, 33, { 0 } }, // #131 [ref=2x]
- { 0, 34, { EXT(LAHFSAHF) } }, // #132 [ref=1x]
- { 0, 0, { EXT(SEAM) } }, // #133 [ref=4x]
- { 0, 0, { EXT(SERIALIZE) } }, // #134 [ref=1x]
- { 0, 0, { EXT(SHA) } }, // #135 [ref=7x]
- { 0, 0, { EXT(SKINIT) } }, // #136 [ref=2x]
- { 0, 0, { EXT(AMX_COMPLEX) } }, // #137 [ref=2x]
- { 0, 0, { EXT(AMX_BF16) } }, // #138 [ref=1x]
- { 0, 0, { EXT(AMX_INT8) } }, // #139 [ref=4x]
- { 0, 0, { EXT(AMX_FP16) } }, // #140 [ref=1x]
- { 0, 1, { EXT(UINTR) } }, // #141 [ref=1x]
- { 0, 1, { EXT(WAITPKG) } }, // #142 [ref=2x]
- { 0, 0, { EXT(WAITPKG) } }, // #143 [ref=1x]
- { 0, 0, { EXT(AVX512_4FMAPS) } }, // #144 [ref=4x]
- { 0, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #145 [ref=38x]
- { 0, 0, { EXT(AVX512_FP16), EXT(AVX512_VL) } }, // #146 [ref=60x]
- { 0, 0, { EXT(AVX), EXT(AVX512_F) } }, // #147 [ref=33x]
- { 0, 0, { EXT(AVX512_FP16) } }, // #148 [ref=44x]
- { 0, 0, { EXT(AVX) } }, // #149 [ref=35x]
- { 0, 0, { EXT(AESNI), EXT(VAES), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #150 [ref=4x]
- { 0, 0, { EXT(AESNI), EXT(AVX) } }, // #151 [ref=2x]
- { 0, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #152 [ref=108x]
- { 0, 0, { EXT(AVX), EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #153 [ref=8x]
- { 0, 0, { EXT(AVX_NE_CONVERT) } }, // #154 [ref=6x]
- { 0, 0, { EXT(AVX512_DQ), EXT(AVX512_VL) } }, // #155 [ref=30x]
- { 0, 0, { EXT(AVX2) } }, // #156 [ref=7x]
- { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #157 [ref=39x]
- { 0, 1, { EXT(AVX), EXT(AVX512_F) } }, // #158 [ref=4x]
- { 0, 1, { EXT(AVX512_FP16) } }, // #159 [ref=2x]
- { 0, 0, { EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #160 [ref=2x]
- { 0, 0, { EXT(AVX_NE_CONVERT), EXT(AVX512_BF16), EXT(AVX512_VL) } }, // #161 [ref=1x]
- { 0, 0, { EXT(F16C), EXT(AVX512_F), EXT(AVX512_VL) } }, // #162 [ref=2x]
- { 0, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #163 [ref=24x]
- { 0, 0, { EXT(AVX512_ER) } }, // #164 [ref=10x]
- { 0, 0, { EXT(FMA), EXT(AVX512_F), EXT(AVX512_VL) } }, // #165 [ref=36x]
- { 0, 0, { EXT(FMA), EXT(AVX512_F) } }, // #166 [ref=24x]
- { 0, 0, { EXT(FMA4) } }, // #167 [ref=20x]
- { 0, 0, { EXT(XOP) } }, // #168 [ref=55x]
- { 0, 0, { EXT(AVX2), EXT(AVX512_F), EXT(AVX512_VL) } }, // #169 [ref=19x]
- { 0, 0, { EXT(AVX512_PF) } }, // #170 [ref=16x]
- { 0, 0, { EXT(GFNI), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #171 [ref=3x]
- { 0, 0, { EXT(SEV_ES) } }, // #172 [ref=1x]
- { 1, 0, { EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #173 [ref=4x]
- { 1, 0, { EXT(AVX) } }, // #174 [ref=2x]
- { 1, 0, { EXT(AVX512_F), EXT(AVX512_VL) } }, // #175 [ref=4x]
- { 1, 0, { EXT(AVX512_BW), EXT(AVX512_VL) } }, // #176 [ref=2x]
- { 1, 0, { EXT(AVX), EXT(AVX512_F) } }, // #177 [ref=3x]
- { 0, 0, { EXT(AVX), EXT(AVX2) } }, // #178 [ref=17x]
- { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VP2INTERSECT) } }, // #179 [ref=2x]
- { 0, 0, { EXT(AVX512_4VNNIW) } }, // #180 [ref=2x]
- { 0, 0, { EXT(AVX), EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #181 [ref=54x]
- { 0, 0, { EXT(AVX2), EXT(AVX512_BW), EXT(AVX512_VL) } }, // #182 [ref=2x]
- { 0, 0, { EXT(AVX512_CD), EXT(AVX512_VL) } }, // #183 [ref=6x]
- { 0, 0, { EXT(PCLMULQDQ), EXT(VPCLMULQDQ), EXT(AVX), EXT(AVX512_F), EXT(AVX512_VL) } }, // #184 [ref=1x]
- { 0, 1, { EXT(AVX) } }, // #185 [ref=7x]
- { 0, 0, { EXT(AVX512_VBMI2), EXT(AVX512_VL) } }, // #186 [ref=16x]
- { 0, 0, { EXT(AVX_VNNI_INT8) } }, // #187 [ref=6x]
- { 0, 0, { EXT(AVX_VNNI), EXT(AVX512_VL), EXT(AVX512_VNNI) } }, // #188 [ref=4x]
- { 0, 0, { EXT(AVX_VNNI_INT16) } }, // #189 [ref=6x]
- { 0, 0, { EXT(AVX512_VBMI), EXT(AVX512_VL) } }, // #190 [ref=4x]
- { 0, 0, { EXT(AVX), EXT(AVX512_BW) } }, // #191 [ref=4x]
- { 0, 0, { EXT(AVX), EXT(AVX512_DQ) } }, // #192 [ref=4x]
- { 0, 0, { EXT(AVX_IFMA), EXT(AVX512_IFMA), EXT(AVX512_VL) } }, // #193 [ref=2x]
- { 0, 0, { EXT(AVX512_BITALG), EXT(AVX512_VL) } }, // #194 [ref=3x]
- { 0, 0, { EXT(AVX512_VL), EXT(AVX512_VPOPCNTDQ) } }, // #195 [ref=2x]
- { 0, 0, { EXT(SHA512), EXT(AVX) } }, // #196 [ref=3x]
- { 0, 0, { EXT(SM3), EXT(AVX) } }, // #197 [ref=3x]
- { 0, 0, { EXT(SM4), EXT(AVX) } }, // #198 [ref=2x]
- { 0, 0, { EXT(WBNOINVD) } }, // #199 [ref=1x]
- { 0, 0, { EXT(RTM) } }, // #200 [ref=3x]
- { 0, 0, { EXT(XSAVE) } }, // #201 [ref=6x]
- { 0, 0, { EXT(TSXLDTRK) } }, // #202 [ref=2x]
- { 0, 0, { EXT(XSAVES) } }, // #203 [ref=4x]
- { 0, 0, { EXT(XSAVEC) } }, // #204 [ref=2x]
- { 0, 0, { EXT(XSAVEOPT) } }, // #205 [ref=2x]
- { 0, 1, { EXT(TSX) } } // #206 [ref=1x]
-};
-#undef EXT
-
-#define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL)
-const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {
- { 0, 0 }, // #0 [ref=1383x]
- { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #1 [ref=104x]
- { FLAG(CF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #2 [ref=2x]
- { FLAG(CF), FLAG(CF) }, // #3 [ref=2x]
- { FLAG(OF), FLAG(OF) }, // #4 [ref=1x]
- { 0, FLAG(ZF) }, // #5 [ref=7x]
- { 0, FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) }, // #6 [ref=4x]
- { 0, FLAG(AC) }, // #7 [ref=2x]
- { 0, FLAG(CF) }, // #8 [ref=2x]
- { 0, FLAG(DF) }, // #9 [ref=2x]
- { 0, FLAG(IF) }, // #10 [ref=2x]
- { FLAG(CF) | FLAG(ZF), 0 }, // #11 [ref=12x]
- { FLAG(CF), 0 }, // #12 [ref=18x]
- { FLAG(ZF), 0 }, // #13 [ref=14x]
- { FLAG(OF) | FLAG(SF) | FLAG(ZF), 0 }, // #14 [ref=12x]
- { FLAG(OF) | FLAG(SF), 0 }, // #15 [ref=12x]
- { FLAG(OF), 0 }, // #16 [ref=7x]
- { FLAG(PF), 0 }, // #17 [ref=12x]
- { FLAG(SF), 0 }, // #18 [ref=6x]
- { FLAG(DF), FLAG(AF) | FLAG(CF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #19 [ref=2x]
- { 0, FLAG(AF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #20 [ref=5x]
- { 0, FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #21 [ref=83x]
- { FLAG(CF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #22 [ref=2x]
- { FLAG(CF) | FLAG(ZF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #23 [ref=2x]
- { FLAG(ZF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #24 [ref=2x]
- { FLAG(PF), FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3) }, // #25 [ref=2x]
- { 0, FLAG(C1) | FLAG(CF) | FLAG(PF) | FLAG(ZF) }, // #26 [ref=4x]
- { FLAG(C0) | FLAG(C1) | FLAG(C2) | FLAG(C3), 0 }, // #27 [ref=2x]
- { FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #28 [ref=1x]
- { FLAG(DF), 0 }, // #29 [ref=3x]
- { 0, FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) }, // #30 [ref=3x]
- { FLAG(AF) | FLAG(CF) | FLAG(DF) | FLAG(IF) | FLAG(OF) | FLAG(PF) | FLAG(SF) | FLAG(ZF), 0 }, // #31 [ref=3x]
- { FLAG(CF) | FLAG(OF), FLAG(CF) | FLAG(OF) }, // #32 [ref=2x]
- { 0, FLAG(CF) | FLAG(OF) }, // #33 [ref=2x]
- { 0, FLAG(AF) | FLAG(CF) | FLAG(PF) | FLAG(SF) | FLAG(ZF) } // #34 [ref=1x]
-};
-#undef FLAG
-
-#define FLAG(VAL) uint32_t(InstRWFlags::k##VAL)
-const InstRWFlags InstDB::_instFlagsTable[] = {
- InstRWFlags(FLAG(None)), // #0 [ref=1693x]
- InstRWFlags(FLAG(MovOp)) // #1 [ref=29x]
-};
-#undef FLAG
-// ----------------------------------------------------------------------------
-// ${AdditionalInfoTable:End}
-
-// Inst - NameData
-// ===============
-
-#ifndef ASMJIT_NO_TEXT
-// ${NameData:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-const InstNameIndex InstDB::instNameIndex = {{
- { Inst::kIdAaa , Inst::kIdAxor + 1 },
- { Inst::kIdBextr , Inst::kIdBzhi + 1 },
- { Inst::kIdCall , Inst::kIdCwde + 1 },
- { Inst::kIdDaa , Inst::kIdDpps + 1 },
- { Inst::kIdEmms , Inst::kIdExtrq + 1 },
- { Inst::kIdF2xm1 , Inst::kIdFyl2xp1 + 1 },
- { Inst::kIdGetsec , Inst::kIdGf2p8mulb + 1 },
- { Inst::kIdHaddpd , Inst::kIdHsubps + 1 },
- { Inst::kIdIdiv , Inst::kIdIretq + 1 },
- { Inst::kIdJa , Inst::kIdJz + 1 },
- { Inst::kIdKaddb , Inst::kIdKxorw + 1 },
- { Inst::kIdLahf , Inst::kIdLzcnt + 1 },
- { Inst::kIdMaskmovdqu , Inst::kIdMwaitx + 1 },
- { Inst::kIdNeg , Inst::kIdNot + 1 },
- { Inst::kIdOr , Inst::kIdOuts + 1 },
- { Inst::kIdPabsb , Inst::kIdPxor + 1 },
- { Inst::kIdNone , Inst::kIdNone + 1 },
- { Inst::kIdRcl , Inst::kIdRstorssp + 1 },
- { Inst::kIdSahf , Inst::kIdSysretq + 1 },
- { Inst::kIdT1mskc , Inst::kIdTzmsk + 1 },
- { Inst::kIdUcomisd , Inst::kIdUnpcklps + 1 },
- { Inst::kIdV4fmaddps , Inst::kIdVzeroupper + 1 },
- { Inst::kIdWbinvd , Inst::kIdWrussq + 1 },
- { Inst::kIdXabort , Inst::kIdXtest + 1 },
- { Inst::kIdNone , Inst::kIdNone + 1 },
- { Inst::kIdNone , Inst::kIdNone + 1 }
-}, uint16_t(17)};
-
-const char InstDB::_instNameStringTable[] =
- "vgf2p8affineinvqbvaeskeygenassistvbroadcastf32x464x264x4i32x2i32x4i32x8i64x2i64x"
- "4vpbroadcastmb2w2dvbcstnebf162p128i128vcvtne2ps2vcvtneebf16vcvtneobf16vfmaddsub1"
- "32ph213pd213ph213ps231pd231ph231psvfmsubadd132vpmultishiftvscatterpf0dqpdqps1dpd"
- "1dps1qpd1qpsvcvtneps2vextracvextractfvgatherpf0vp2intersecttcmmimfp16tcmmrlfp16s"
- "h2pssdph2psvfnmadd132213sd213sh213ss231sd231sh231ssvfnmsub132vinservinsertfvpshu"
- "fbitqvsha512rndprefetchitntawt1saveprevsssha256rndtileloaddtilereleavaesdeclvaes"
- "enclvcompressvcvttpd2uqqvcvttph2uvcvttps2uvcvttsd2uvcvttsh2uvcvttss2uvfixupimmvf"
- "madd132vfmsub132vmaskmovdqvpcompressvpconflictvphminposuvpmadd52hluqvpscatterqdv"
- "punpckhqlqdqvrndscalemsg1msg2clflushopcmpnbexcmpnlexcmpxchg16t0t2tilestorev4fnma"
- "ddssvcvtpd2uvcvtph2psudqvcvtps2phvcvtsd2uvcvtsh2uvcvtss2uvcvtudq2vcvtuqq2vcvtusi"
- "2vfcmaddcvfpclassvgetmanmulbvp4dpwssvpclmuvpcmpestrvpcmpistrvperm2fvpermil2vpgat"
- "hervpmacssdqvpmadcsswubswvpmaskmovpternlogbwwdlbwldqlwdvrsqrt1428pd28ps28sd28ssv"
- "shufvshuffvzeroupxsaveoptcmpbexcmplexcmpnbxcmpnlxcmpnoxcmpnpxcmpnsxcmpnzx8bfxrst"
- "orldtilecfmovdir64pvalidarmpadjurmpupdaserialisha1nexsha1rndssttilecftdpbf16tdpf"
- "p16v4fmadvaddsubvblendmvpdvcvtdq2uwvcvtqq2vcvtsi2vcvtuwvdbpsadvdpbf16vexpanvfcmu"
- "lccphcshvgetexpvmovdqau16u32u64vmovmskvmovntvmovshdvmovsldvpackssdwbvpackuswbvpb"
- "lendmdvpdpbssudsvpdpbusvpdpwssvpdpwus2pdvpermtvpexpanvphaddubwqdqhvpmovmskvpmovs"
- "xbvpmovusqwvpmovzxbvpmulhrvptestnmqvreducevscalefvsm3rndvsm4rndsvunpckhlpdlpsxre"
- "sldtrs64xsusldtrcldemoclrssbscmpbxcmplxcmpoxcmppxcmpsxcmpzxcvtpifcmovfxsavekorte"
- "stkshiftrbkunpckmonitorpfrcpipfrsqirtvrdfsbrdgsbsspseamcalsenduisetssbssysesysex"
- "vcvtwvfmulvldmxcsvmlaundupu8vmovhvmovlhvmpsadvmresumvpadduvpaligngtbgtdgtqgtw2b2"
- "qbdbqvphsubvplzcnb2md2mq2mw2mvpopcnvpshldvqvpshrdvwhwvpsubuvrangevrcp14vroundsdv"
- "sm4keyvstmxcsvucomiallwbnoinwrfsbwrgsbc64blcfiblsficmovnendbrenqcmnufdecsfincsfn"
- "stefrndfsincfucomfyl2xincsspqinvlinvlpinvpcinvvpmcommmovq2pavgupfcmpepfpnaptwris"
- "eamoseamrsyscsysretdpbutlbsyvaesivaligvandnvcomivfrczvhadvhsubvmclevmgexvmmcvmov"
- "avmovuvmptvmwrivpandvpextrwvpinsvpmaxvpminvprolvprorvpsadvpsigvpslvpsllvpsravpsr"
- "lvsqrvtes";
-
-
-const uint32_t InstDB::_instNameIndexTable[] = {
- 0x80000000, // Small ''.
- 0x80000421, // Small 'aaa'.
- 0x80001021, // Small 'aad'.
- 0x80021021, // Small 'aadd'.
- 0x80003421, // Small 'aam'.
- 0x80023821, // Small 'aand'.
- 0x80004C21, // Small 'aas'.
- 0x80000C81, // Small 'adc'.
- 0x800C0C81, // Small 'adcx'.
- 0x80001081, // Small 'add'.
- 0x80481081, // Small 'addpd'.
- 0x81381081, // Small 'addps'.
- 0x80499081, // Small 'addsd'.
- 0x81399081, // Small 'addss'.
- 0x20A76099, // Large 'addsub|pd'.
- 0x207D6099, // Large 'addsub|ps'.
- 0x800C3C81, // Small 'adox'.
- 0x86524CA1, // Small 'aesdec'.
- 0x302871D5, // Large 'aesdecl|ast'.
- 0x86E2CCA1, // Small 'aesenc'.
- 0x302871DD, // Large 'aesencl|ast'.
- 0x86D4CCA1, // Small 'aesimc'.
- 0x0000F012, // Large 'aeskeygenassist'.
- 0x800011C1, // Small 'and'.
- 0x800711C1, // Small 'andn'.
- 0x890711C1, // Small 'andnpd'.
- 0xA70711C1, // Small 'andnps'.
- 0x804811C1, // Small 'andpd'.
- 0x813811C1, // Small 'andps'.
- 0x800049E1, // Small 'aor'.
- 0x80064241, // Small 'arpl'.
- 0x80093F01, // Small 'axor'.
- 0x812A60A2, // Small 'bextr'.
- 0x26F45709, // Large 'blcfi|ll'.
- 0x80048D82, // Small 'blci'.
- 0x80348D82, // Small 'blcic'.
- 0x97368D82, // Small 'blcmsk'.
- 0x80098D82, // Small 'blcs'.
- 0x20A75471, // Large 'blend|pd'.
- 0x207D5471, // Large 'blend|ps'.
- 0x34775471, // Large 'blend|vpd'.
- 0x318B5471, // Large 'blend|vps'.
- 0x26F4570E, // Large 'blsfi|ll'.
- 0x8004CD82, // Small 'blsi'.
- 0x8034CD82, // Small 'blsic'.
- 0x9736CD82, // Small 'blsmsk'.
- 0x80094D82, // Small 'blsr'.
- 0x80C191C2, // Small 'bndcl'.
- 0x80E191C2, // Small 'bndcn'.
- 0x815191C2, // Small 'bndcu'.
- 0xB04611C2, // Small 'bndldx'.
- 0x80B691C2, // Small 'bndmk'.
- 0xACF691C2, // Small 'bndmov'.
- 0xB14991C2, // Small 'bndstx'.
- 0x804755E2, // Small 'bound'.
- 0x80001A62, // Small 'bsf'.
- 0x80004A62, // Small 'bsr'.
- 0x8100DE62, // Small 'bswap'.
- 0x80000282, // Small 'bt'.
- 0x80000E82, // Small 'btc'.
- 0x80004A82, // Small 'btr'.
- 0x80004E82, // Small 'bts'.
- 0x8004A342, // Small 'bzhi'.
- 0x80063023, // Small 'call'.
- 0x80005C43, // Small 'cbw'.
- 0x80004483, // Small 'cdq'.
- 0x8002C483, // Small 'cdqe'.
- 0x80018583, // Small 'clac'.
- 0x80000D83, // Small 'clc'.
- 0x80001183, // Small 'cld'.
- 0x20DF65B0, // Large 'cldemo|te'.
- 0x0000729D, // Large 'clflush'.
- 0x1020929D, // Large 'clflushop|t'.
- 0x80049D83, // Small 'clgi'.
- 0x80002583, // Small 'cli'.
- 0x101775B6, // Large 'clrssbs|y'.
- 0x8009D183, // Small 'clts'.
- 0x8004D583, // Small 'clui'.
- 0x80015D83, // Small 'clwb'.
- 0x9F22E983, // Small 'clzero'.
- 0x80000DA3, // Small 'cmc'.
- 0x801B3DA3, // Small 'cmova'.
- 0x8A1B3DA3, // Small 'cmovae'.
- 0x802B3DA3, // Small 'cmovb'.
- 0x8A2B3DA3, // Small 'cmovbe'.
- 0x803B3DA3, // Small 'cmovc'.
- 0x805B3DA3, // Small 'cmove'.
- 0x807B3DA3, // Small 'cmovg'.
- 0x8A7B3DA3, // Small 'cmovge'.
- 0x80CB3DA3, // Small 'cmovl'.
- 0x8ACB3DA3, // Small 'cmovle'.
- 0x82EB3DA3, // Small 'cmovna'.
- 0x20125713, // Large 'cmovn|ae'.
- 0x84EB3DA3, // Small 'cmovnb'.
- 0x22AA5713, // Large 'cmovn|be'.
- 0x86EB3DA3, // Small 'cmovnc'.
- 0x8AEB3DA3, // Small 'cmovne'.
- 0x8EEB3DA3, // Small 'cmovng'.
- 0x20185713, // Large 'cmovn|ge'.
- 0x98EB3DA3, // Small 'cmovnl'.
- 0x21C45713, // Large 'cmovn|le'.
- 0x9EEB3DA3, // Small 'cmovno'.
- 0xA0EB3DA3, // Small 'cmovnp'.
- 0xA6EB3DA3, // Small 'cmovns'.
- 0xB4EB3DA3, // Small 'cmovnz'.
- 0x80FB3DA3, // Small 'cmovo'.
- 0x810B3DA3, // Small 'cmovp'.
- 0x8B0B3DA3, // Small 'cmovpe'.
- 0x9F0B3DA3, // Small 'cmovpo'.
- 0x813B3DA3, // Small 'cmovs'.
- 0x81AB3DA3, // Small 'cmovz'.
- 0x800041A3, // Small 'cmp'.
- 0x309963D9, // Large 'cmpbex|add'.
- 0x309955BD, // Large 'cmpbx|add'.
- 0x309963DF, // Large 'cmplex|add'.
- 0x309955C2, // Large 'cmplx|add'.
- 0x309972A6, // Large 'cmpnbex|add'.
- 0x309963E5, // Large 'cmpnbx|add'.
- 0x309972AD, // Large 'cmpnlex|add'.
- 0x309963EB, // Large 'cmpnlx|add'.
- 0x309963F1, // Large 'cmpnox|add'.
- 0x309963F7, // Large 'cmpnpx|add'.
- 0x309963FD, // Large 'cmpnsx|add'.
- 0x30996403, // Large 'cmpnzx|add'.
- 0x309955C7, // Large 'cmpox|add'.
- 0x804841A3, // Small 'cmppd'.
- 0x813841A3, // Small 'cmpps'.
- 0x309955CC, // Large 'cmppx|add'.
- 0x8009C1A3, // Small 'cmps'.
- 0x8049C1A3, // Small 'cmpsd'.
- 0x8139C1A3, // Small 'cmpss'.
- 0x309955D1, // Large 'cmpsx|add'.
- 0x000072B4, // Large 'cmpxchg'.
- 0x101092B4, // Large 'cmpxchg16|b'.
- 0x240972B4, // Large 'cmpxchg|8b'.
- 0x309955D6, // Large 'cmpzx|add'.
- 0x8934B5E3, // Small 'comisd'.
- 0xA734B5E3, // Small 'comiss'.
- 0x8044D603, // Small 'cpuid'.
- 0x80003E23, // Small 'cqo'.
- 0x81DF0E43, // Small 'crc32'.
- 0x20A7647B, // Large 'cvtdq2|pd'.
- 0x207D647B, // Large 'cvtdq2|ps'.
- 0x20E562D5, // Large 'cvtpd2|dq'.
- 0x222A62D5, // Large 'cvtpd2|pi'.
- 0x207D62D5, // Large 'cvtpd2|ps'.
- 0x352555DB, // Large 'cvtpi|2pd'.
- 0x307C55DB, // Large 'cvtpi|2ps'.
- 0x20E562E9, // Large 'cvtps2|dq'.
- 0x102672E9, // Large 'cvtps2p|d'.
- 0x100972E9, // Large 'cvtps2p|i'.
- 0x201D62F2, // Large 'cvtsd2|si'.
- 0x201C62F2, // Large 'cvtsd2|ss'.
- 0x2144648B, // Large 'cvtsi2|sd'.
- 0x201C648B, // Large 'cvtsi2|ss'.
- 0x21446302, // Large 'cvtss2|sd'.
- 0x201D6302, // Large 'cvtss2|si'.
- 0x20E571EE, // Large 'cvttpd2|dq'.
- 0x222A71EE, // Large 'cvttpd2|pi'.
- 0x20E57202, // Large 'cvttps2|dq'.
- 0x222A7202, // Large 'cvttps2|pi'.
- 0x201D720B, // Large 'cvttsd2|si'.
- 0x201D721D, // Large 'cvttss2|si'.
- 0x800012E3, // Small 'cwd'.
- 0x800292E3, // Small 'cwde'.
- 0x80000424, // Small 'daa'.
- 0x80004C24, // Small 'das'.
- 0x80000CA4, // Small 'dec'.
- 0x80005924, // Small 'div'.
- 0x80485924, // Small 'divpd'.
- 0x81385924, // Small 'divps'.
- 0x8049D924, // Small 'divsd'.
- 0x8139D924, // Small 'divss'.
- 0x80024204, // Small 'dppd'.
- 0x8009C204, // Small 'dpps'.
- 0x8009B5A5, // Small 'emms'.
- 0x202C5718, // Large 'endbr|32'.
- 0x20305718, // Large 'endbr|64'.
- 0x88D1C5C5, // Small 'enqcmd'.
- 0x209B571D, // Large 'enqcm|ds'.
- 0x8122D1C5, // Small 'enter'.
- 0x207D710D, // Large 'extract|ps'.
- 0x81195305, // Small 'extrq'.
- 0x81C6E3A6, // Small 'f2xm1'.
- 0x80098826, // Small 'fabs'.
- 0x80021026, // Small 'fadd'.
- 0x81021026, // Small 'faddp'.
- 0x80023046, // Small 'fbld'.
- 0x810A4C46, // Small 'fbstp'.
- 0x8009A066, // Small 'fchs'.
- 0x8182B066, // Small 'fclex'.
- 0x8567B466, // Small 'fcmovb'.
- 0x22AA55E0, // Large 'fcmov|be'.
- 0x8B67B466, // Small 'fcmove'.
- 0x22A955E0, // Large 'fcmov|nb'.
- 0x32A955E0, // Large 'fcmov|nbe'.
- 0x200A55E0, // Large 'fcmov|ne'.
- 0x272255E0, // Large 'fcmov|nu'.
- 0xAB67B466, // Small 'fcmovu'.
- 0x8006BC66, // Small 'fcom'.
- 0x8096BC66, // Small 'fcomi'.
- 0xA096BC66, // Small 'fcomip'.
- 0x8106BC66, // Small 'fcomp'.
- 0xA106BC66, // Small 'fcompp'.
- 0x8009BC66, // Small 'fcos'.
- 0x21F15724, // Large 'fdecs|tp'.
- 0x800B2486, // Small 'fdiv'.
- 0x810B2486, // Small 'fdivp'.
- 0x812B2486, // Small 'fdivr'.
- 0xA12B2486, // Small 'fdivrp'.
- 0x8136B4A6, // Small 'femms'.
- 0x8052C8C6, // Small 'ffree'.
- 0x80420526, // Small 'fiadd'.
- 0x80D78D26, // Small 'ficom'.
- 0xA0D78D26, // Small 'ficomp'.
- 0x81649126, // Small 'fidiv'.
- 0xA5649126, // Small 'fidivr'.
- 0x80023126, // Small 'fild'.
- 0x80CAB526, // Small 'fimul'.
- 0x21F15729, // Large 'fincs|tp'.
- 0x8144B926, // Small 'finit'.
- 0x800A4D26, // Small 'fist'.
- 0x810A4D26, // Small 'fistp'.
- 0xA14A4D26, // Small 'fisttp'.
- 0x802ACD26, // Small 'fisub'.
- 0xA42ACD26, // Small 'fisubr'.
- 0x80001186, // Small 'fld'.
- 0x800E1186, // Small 'fld1'.
- 0x81719186, // Small 'fldcw'.
- 0xACE29186, // Small 'fldenv'.
- 0x8BD61186, // Small 'fldl2e'.
- 0xA9D61186, // Small 'fldl2t'.
- 0xBA761186, // Small 'fldlg2'.
- 0xBAE61186, // Small 'fldln2'.
- 0x80981186, // Small 'fldpi'.
- 0x800D1186, // Small 'fldz'.
- 0x800655A6, // Small 'fmul'.
- 0x810655A6, // Small 'fmulp'.
- 0xB0560DC6, // Small 'fnclex'.
- 0xA89725C6, // Small 'fninit'.
- 0x80083DC6, // Small 'fnop'.
- 0x8B60CDC6, // Small 'fnsave'.
- 0xAE3A4DC6, // Small 'fnstcw'.
- 0x200D572E, // Large 'fnste|nv'.
- 0xAF3A4DC6, // Small 'fnstsw'.
- 0x9C1A0606, // Small 'fpatan'.
- 0x80D2CA06, // Small 'fprem'.
- 0xB8D2CA06, // Small 'fprem1'.
- 0x80E0D206, // Small 'fptan'.
- 0x31224733, // Large 'frnd|int'.
- 0xA4FA4E46, // Small 'frstor'.
- 0x805B0666, // Small 'fsave'.
- 0x8AC08E66, // Small 'fscale'.
- 0x80072666, // Small 'fsin'.
- 0x22655737, // Large 'fsinc|os'.
- 0x81494666, // Small 'fsqrt'.
- 0x80005266, // Small 'fst'.
- 0x8171D266, // Small 'fstcw'.
- 0xACE2D266, // Small 'fstenv'.
- 0x80085266, // Small 'fstp'.
- 0x8179D266, // Small 'fstsw'.
- 0x80015666, // Small 'fsub'.
- 0x81015666, // Small 'fsubp'.
- 0x81215666, // Small 'fsubr'.
- 0xA1215666, // Small 'fsubrp'.
- 0x800A4E86, // Small 'ftst'.
- 0x80D78EA6, // Small 'fucom'.
- 0x92D78EA6, // Small 'fucomi'.
- 0x260C573C, // Large 'fucom|ip'.
- 0xA0D78EA6, // Small 'fucomp'.
- 0x25CE573C, // Large 'fucom|pp'.
- 0x814486E6, // Small 'fwait'.
- 0x80068706, // Small 'fxam'.
- 0x80040F06, // Small 'fxch'.
- 0x0000740B, // Large 'fxrstor'.
- 0x2030740B, // Large 'fxrstor|64'.
- 0x8B60CF06, // Small 'fxsave'.
- 0x203065E5, // Large 'fxsave|64'.
- 0x510F240B, // Large 'fx|tract'.
- 0x818EB326, // Small 'fyl2x'.
- 0x206E5741, // Large 'fyl2x|p1'.
- 0x8659D0A7, // Small 'getsec'.
- 0x1010F001, // Large 'gf2p8affineinvq|b'.
- 0x200FB001, // Large 'gf2p8affine|qb'.
- 0x43385001, // Large 'gf2p8|mulb'.
- 0x89021028, // Small 'haddpd'.
- 0xA7021028, // Small 'haddps'.
- 0x80005188, // Small 'hlt'.
- 0xA8599648, // Small 'hreset'.
- 0x89015668, // Small 'hsubpd'.
- 0xA7015668, // Small 'hsubps'.
- 0x800B2489, // Small 'idiv'.
- 0x800655A9, // Small 'imul'.
- 0x800001C9, // Small 'in'.
- 0x80000DC9, // Small 'inc'.
- 0x20A75746, // Large 'incss|pd'.
- 0x274B5746, // Large 'incss|pq'.
- 0x80004DC9, // Small 'ins'.
- 0x207D6184, // Large 'insert|ps'.
- 0x100F6184, // Large 'insert|q'.
- 0x800051C9, // Small 'int'.
- 0x800F51C9, // Small 'int3'.
- 0x8007D1C9, // Small 'into'.
- 0x800259C9, // Small 'invd'.
- 0xA902D9C9, // Small 'invept'.
- 0x8F0659C9, // Small 'invlpg'.
- 0x336C474D, // Large 'invl|pga'.
- 0x23995751, // Large 'invlp|gb'.
- 0x24265756, // Large 'invpc|id'.
- 0x2426575B, // Large 'invvp|id'.
- 0x800A1649, // Small 'iret'.
- 0x804A1649, // Small 'iretd'.
- 0x811A1649, // Small 'iretq'.
- 0x8000002A, // Small 'ja'.
- 0x8000142A, // Small 'jae'.
- 0x8000004A, // Small 'jb'.
- 0x8000144A, // Small 'jbe'.
- 0x8000006A, // Small 'jc'.
- 0x800000AA, // Small 'je'.
- 0x81AC0CAA, // Small 'jecxz'.
- 0x800000EA, // Small 'jg'.
- 0x800014EA, // Small 'jge'.
- 0x8000018A, // Small 'jl'.
- 0x8000158A, // Small 'jle'.
- 0x800041AA, // Small 'jmp'.
- 0x800005CA, // Small 'jna'.
- 0x800285CA, // Small 'jnae'.
- 0x800009CA, // Small 'jnb'.
- 0x800289CA, // Small 'jnbe'.
- 0x80000DCA, // Small 'jnc'.
- 0x800015CA, // Small 'jne'.
- 0x80001DCA, // Small 'jng'.
- 0x80029DCA, // Small 'jnge'.
- 0x800031CA, // Small 'jnl'.
- 0x8002B1CA, // Small 'jnle'.
- 0x80003DCA, // Small 'jno'.
- 0x800041CA, // Small 'jnp'.
- 0x80004DCA, // Small 'jns'.
- 0x800069CA, // Small 'jnz'.
- 0x800001EA, // Small 'jo'.
- 0x8000020A, // Small 'jp'.
- 0x8000160A, // Small 'jpe'.
- 0x80003E0A, // Small 'jpo'.
- 0x8000026A, // Small 'js'.
- 0x8000034A, // Small 'jz'.
- 0x8022102B, // Small 'kaddb'.
- 0x8042102B, // Small 'kaddd'.
- 0x8112102B, // Small 'kaddq'.
- 0x8172102B, // Small 'kaddw'.
- 0x8022382B, // Small 'kandb'.
- 0x8042382B, // Small 'kandd'.
- 0x84E2382B, // Small 'kandnb'.
- 0x88E2382B, // Small 'kandnd'.
- 0xA2E2382B, // Small 'kandnq'.
- 0xAEE2382B, // Small 'kandnw'.
- 0x8112382B, // Small 'kandq'.
- 0x8172382B, // Small 'kandw'.
- 0x802B3DAB, // Small 'kmovb'.
- 0x804B3DAB, // Small 'kmovd'.
- 0x811B3DAB, // Small 'kmovq'.
- 0x817B3DAB, // Small 'kmovw'.
- 0x802A3DCB, // Small 'knotb'.
- 0x804A3DCB, // Small 'knotd'.
- 0x811A3DCB, // Small 'knotq'.
- 0x817A3DCB, // Small 'knotw'.
- 0x800149EB, // Small 'korb'.
- 0x800249EB, // Small 'kord'.
- 0x8008C9EB, // Small 'korq'.
- 0x101075EB, // Large 'kortest|b'.
- 0x102675EB, // Large 'kortest|d'.
- 0x100F75EB, // Large 'kortest|q'.
- 0x105F75EB, // Large 'kortest|w'.
- 0x800BC9EB, // Small 'korw'.
- 0x233A65F2, // Large 'kshift|lb'.
- 0x23A165F2, // Large 'kshift|ld'.
- 0x228865F2, // Large 'kshift|lq'.
- 0x23A465F2, // Large 'kshift|lw'.
- 0x25F865F2, // Large 'kshift|rb'.
- 0x102675F2, // Large 'kshiftr|d'.
- 0x100F75F2, // Large 'kshiftr|q'.
- 0x105F75F2, // Large 'kshiftr|w'.
- 0x8549968B, // Small 'ktestb'.
- 0x8949968B, // Small 'ktestd'.
- 0xA349968B, // Small 'ktestq'.
- 0xAF49968B, // Small 'ktestw'.
- 0x239A65FA, // Large 'kunpck|bw'.
- 0x20E565FA, // Large 'kunpck|dq'.
- 0x239C65FA, // Large 'kunpck|wd'.
- 0x8527BB0B, // Small 'kxnorb'.
- 0x8927BB0B, // Small 'kxnord'.
- 0xA327BB0B, // Small 'kxnorq'.
- 0xAF27BB0B, // Small 'kxnorw'.
- 0x80293F0B, // Small 'kxorb'.
- 0x80493F0B, // Small 'kxord'.
- 0x81193F0B, // Small 'kxorq'.
- 0x81793F0B, // Small 'kxorw'.
- 0x8003202C, // Small 'lahf'.
- 0x8000482C, // Small 'lar'.
- 0x80C6046C, // Small 'lcall'.
- 0x8158908C, // Small 'lddqu'.
- 0x1023664B, // Large 'ldmxcs|r'.
- 0x80004C8C, // Small 'lds'.
- 0x10018412, // Large 'ldtilecf|g'.
- 0x800004AC, // Small 'lea'.
- 0x805B04AC, // Small 'leave'.
- 0x80004CAC, // Small 'les'.
- 0x8A3714CC, // Small 'lfence'.
- 0x80004CCC, // Small 'lfs'.
- 0x800A10EC, // Small 'lgdt'.
- 0x80004CEC, // Small 'lgs'.
- 0x800A112C, // Small 'lidt'.
- 0x8008354C, // Small 'ljmp'.
- 0x800A118C, // Small 'lldt'.
- 0x84385D8C, // Small 'llwpcb'.
- 0x800BCDAC, // Small 'lmsw'.
- 0x800991EC, // Small 'lods'.
- 0x80083DEC, // Small 'loop'.
- 0x80583DEC, // Small 'loope'.
- 0x8AE83DEC, // Small 'loopne'.
- 0x8000326C, // Small 'lsl'.
- 0x80004E6C, // Small 'lss'.
- 0x80004A8C, // Small 'ltr'.
- 0xA6E4C2EC, // Small 'lwpins'.
- 0x981B42EC, // Small 'lwpval'.
- 0x81470F4C, // Small 'lzcnt'.
- 0x109D9241, // Large 'maskmovdq|u'.
- 0x100F7241, // Large 'maskmov|q'.
- 0x8048602D, // Small 'maxpd'.
- 0x8138602D, // Small 'maxps'.
- 0x8049E02D, // Small 'maxsd'.
- 0x8139E02D, // Small 'maxss'.
- 0x21925760, // Large 'mcomm|it'.
- 0x8A3714CD, // Small 'mfence'.
- 0x8048392D, // Small 'minpd'.
- 0x8138392D, // Small 'minps'.
- 0x8049B92D, // Small 'minsd'.
- 0x8139B92D, // Small 'minss'.
- 0x00007600, // Large 'monitor'.
- 0x102E7600, // Large 'monitor|x'.
- 0x800059ED, // Small 'mov'.
- 0xA620D9ED, // Small 'movabs'.
- 0x8900D9ED, // Small 'movapd'.
- 0xA700D9ED, // Small 'movaps'.
- 0x805159ED, // Small 'movbe'.
- 0x800259ED, // Small 'movd'.
- 0x36574245, // Large 'movd|dup'.
- 0x1010841A, // Large 'movdir64|b'.
- 0x1009641A, // Large 'movdir|i'.
- 0x268F5245, // Large 'movdq|2q'.
- 0x831259ED, // Small 'movdqa'.
- 0xAB1259ED, // Small 'movdqu'.
- 0x359A465D, // Large 'movh|lps'.
- 0x890459ED, // Small 'movhpd'.
- 0xA70459ED, // Small 'movhps'.
- 0x207D5662, // Large 'movlh|ps'.
- 0x890659ED, // Small 'movlpd'.
- 0xA70659ED, // Small 'movlps'.
- 0x20A764D0, // Large 'movmsk|pd'.
- 0x207D64D0, // Large 'movmsk|ps'.
- 0x20E554D7, // Large 'movnt|dq'.
- 0x34C354D7, // Large 'movnt|dqa'.
- 0x934759ED, // Small 'movnti'.
- 0x20A754D7, // Large 'movnt|pd'.
- 0x207D54D7, // Large 'movnt|ps'.
- 0xA34759ED, // Small 'movntq'.
- 0x214454D7, // Large 'movnt|sd'.
- 0x201C54D7, // Large 'movnt|ss'.
- 0x8008D9ED, // Small 'movq'.
- 0x20E55765, // Large 'movq2|dq'.
- 0x8009D9ED, // Small 'movs'.
- 0x8049D9ED, // Small 'movsd'.
- 0x222964DD, // Large 'movshd|up'.
- 0x222964E4, // Large 'movsld|up'.
- 0x8139D9ED, // Small 'movss'.
- 0x8189D9ED, // Small 'movsx'.
- 0x8989D9ED, // Small 'movsxd'.
- 0x890AD9ED, // Small 'movupd'.
- 0xA70AD9ED, // Small 'movups'.
- 0x818D59ED, // Small 'movzx'.
- 0x239A5668, // Large 'mpsad|bw'.
- 0x800032AD, // Small 'mul'.
- 0x804832AD, // Small 'mulpd'.
- 0x813832AD, // Small 'mulps'.
- 0x8049B2AD, // Small 'mulsd'.
- 0x8139B2AD, // Small 'mulss'.
- 0x800C32AD, // Small 'mulx'.
- 0x814486ED, // Small 'mwait'.
- 0xB14486ED, // Small 'mwaitx'.
- 0x80001CAE, // Small 'neg'.
- 0x800041EE, // Small 'nop'.
- 0x800051EE, // Small 'not'.
- 0x8000024F, // Small 'or'.
- 0x8002424F, // Small 'orpd'.
- 0x8009C24F, // Small 'orps'.
- 0x800052AF, // Small 'out'.
- 0x8009D2AF, // Small 'outs'.
- 0x80298830, // Small 'pabsb'.
- 0x80498830, // Small 'pabsd'.
- 0x81798830, // Small 'pabsw'.
- 0x000084EB, // Large 'packssdw'.
- 0x24F264EB, // Large 'packss|wb'.
- 0x24F164F5, // Large 'packus|dw'.
- 0x000084F5, // Large 'packuswb'.
- 0x80221030, // Small 'paddb'.
- 0x80421030, // Small 'paddd'.
- 0x81121030, // Small 'paddq'.
- 0x85321030, // Small 'paddsb'.
- 0xAF321030, // Small 'paddsw'.
- 0x25BA5675, // Large 'paddu|sb'.
- 0x23835675, // Large 'paddu|sw'.
- 0x81721030, // Small 'paddw'.
- 0x1023667B, // Large 'palign|r'.
- 0x80023830, // Small 'pand'.
- 0x80E23830, // Small 'pandn'.
- 0x8059D430, // Small 'pause'.
- 0x8023D830, // Small 'pavgb'.
- 0x25BA576A, // Large 'pavgu|sb'.
- 0x8173D830, // Small 'pavgw'.
- 0x202164FE, // Large 'pblend|vb'.
- 0x105F64FE, // Large 'pblend|w'.
- 0x42885345, // Large 'pclmu|lqdq'.
- 0x200F534B, // Large 'pcmpe|qb'.
- 0x227D534B, // Large 'pcmpe|qd'.
- 0x21F6534B, // Large 'pcmpe|qq'.
- 0x2559534B, // Large 'pcmpe|qw'.
- 0x1009834B, // Large 'pcmpestr|i'.
- 0x105C834B, // Large 'pcmpestr|m'.
- 0x368142A5, // Large 'pcmp|gtb'.
- 0x368442A5, // Large 'pcmp|gtd'.
- 0x368742A5, // Large 'pcmp|gtq'.
- 0x368A42A5, // Large 'pcmp|gtw'.
- 0x10098354, // Large 'pcmpistr|i'.
- 0x105C8354, // Large 'pcmpistr|m'.
- 0x267E5255, // Large 'pconf|ig'.
- 0x80081490, // Small 'pdep'.
- 0x800A60B0, // Small 'pext'.
- 0x852A60B0, // Small 'pextrb'.
- 0x892A60B0, // Small 'pextrd'.
- 0xA32A60B0, // Small 'pextrq'.
- 0xAF2A60B0, // Small 'pextrw'.
- 0x8044F4D0, // Small 'pf2id'.
- 0x8174F4D0, // Small 'pf2iw'.
- 0x803184D0, // Small 'pfacc'.
- 0x804204D0, // Small 'pfadd'.
- 0x100F676F, // Large 'pfcmpe|q'.
- 0x2018576F, // Large 'pfcmp|ge'.
- 0x2681576F, // Large 'pfcmp|gt'.
- 0x8180B4D0, // Small 'pfmax'.
- 0x80E4B4D0, // Small 'pfmin'.
- 0x80CAB4D0, // Small 'pfmul'.
- 0x8630B8D0, // Small 'pfnacc'.
- 0x24B15775, // Large 'pfpna|cc'.
- 0x8101C8D0, // Small 'pfrcp'.
- 0x21AD6607, // Large 'pfrcpi|t1'.
- 0x22BF6607, // Large 'pfrcpi|t2'.
- 0xAD01C8D0, // Small 'pfrcpv'.
- 0x21AD660D, // Large 'pfrsqi|t1'.
- 0x2188560D, // Large 'pfrsq|rt'.
- 0x3613560D, // Large 'pfrsq|rtv'.
- 0x802ACCD0, // Small 'pfsub'.
- 0xA42ACCD0, // Small 'pfsubr'.
- 0x88420510, // Small 'phaddd'.
- 0x23835536, // Large 'phadd|sw'.
- 0xAE420510, // Small 'phaddw'.
- 0x105F925F, // Large 'phminposu|w'.
- 0x882ACD10, // Small 'phsubd'.
- 0x23835696, // Large 'phsub|sw'.
- 0xAE2ACD10, // Small 'phsubw'.
- 0x80437530, // Small 'pi2fd'.
- 0x81737530, // Small 'pi2fw'.
- 0x8529B930, // Small 'pinsrb'.
- 0x8929B930, // Small 'pinsrd'.
- 0xA329B930, // Small 'pinsrq'.
- 0xAF29B930, // Small 'pinsrw'.
- 0x43855269, // Large 'pmadd|ubsw'.
- 0x239C5269, // Large 'pmadd|wd'.
- 0x853C05B0, // Small 'pmaxsb'.
- 0x893C05B0, // Small 'pmaxsd'.
- 0xAF3C05B0, // Small 'pmaxsw'.
- 0x855C05B0, // Small 'pmaxub'.
- 0x895C05B0, // Small 'pmaxud'.
- 0xAF5C05B0, // Small 'pmaxuw'.
- 0x853725B0, // Small 'pminsb'.
- 0x893725B0, // Small 'pminsd'.
- 0xAF3725B0, // Small 'pminsw'.
- 0x855725B0, // Small 'pminub'.
- 0x895725B0, // Small 'pminud'.
- 0xAF5725B0, // Small 'pminuw'.
- 0x10107543, // Large 'pmovmsk|b'.
- 0x1026754B, // Large 'pmovsxb|d'.
- 0x100F754B, // Large 'pmovsxb|q'.
- 0x105F754B, // Large 'pmovsxb|w'.
- 0x20E5654B, // Large 'pmovsx|dq'.
- 0x239C654B, // Large 'pmovsx|wd'.
- 0x253D654B, // Large 'pmovsx|wq'.
- 0x1026755C, // Large 'pmovzxb|d'.
- 0x100F755C, // Large 'pmovzxb|q'.
- 0x105F755C, // Large 'pmovzxb|w'.
- 0x20E5655C, // Large 'pmovzx|dq'.
- 0x239C655C, // Large 'pmovzx|wd'.
- 0x253D655C, // Large 'pmovzx|wq'.
- 0xA24655B0, // Small 'pmuldq'.
- 0x23836564, // Large 'pmulhr|sw'.
- 0x105F6564, // Large 'pmulhr|w'.
- 0x24815564, // Large 'pmulh|uw'.
- 0xAE8655B0, // Small 'pmulhw'.
- 0x88C655B0, // Small 'pmulld'.
- 0xAEC655B0, // Small 'pmullw'.
- 0x32E540CF, // Large 'pmul|udq'.
- 0x800041F0, // Small 'pop'.
- 0x8000C1F0, // Small 'popa'.
- 0x8040C1F0, // Small 'popad'.
- 0xA8E1C1F0, // Small 'popcnt'.
- 0x800341F0, // Small 'popf'.
- 0x804341F0, // Small 'popfd'.
- 0x811341F0, // Small 'popfq'.
- 0x800049F0, // Small 'por'.
- 0x0000819F, // Large 'prefetch'.
- 0x10E4A19F, // Large 'prefetchit|0'.
- 0x106BA19F, // Large 'prefetchit|1'.
- 0x31A9819F, // Large 'prefetch|nta'.
- 0x22BD819F, // Large 'prefetch|t0'.
- 0x21AD819F, // Large 'prefetch|t1'.
- 0x22BF819F, // Large 'prefetch|t2'.
- 0x105F819F, // Large 'prefetch|w'.
- 0x31AC819F, // Large 'prefetch|wt1'.
- 0xAE220670, // Small 'psadbw'.
- 0x846AA270, // Small 'pshufb'.
- 0x886AA270, // Small 'pshufd'.
- 0x26C3518C, // Large 'pshuf|hw'.
- 0x23A4518C, // Large 'pshuf|lw'.
- 0xAE6AA270, // Small 'pshufw'.
- 0x84E3A670, // Small 'psignb'.
- 0x88E3A670, // Small 'psignd'.
- 0xAEE3A670, // Small 'psignw'.
- 0x80463270, // Small 'pslld'.
- 0xA2463270, // Small 'pslldq'.
- 0x81163270, // Small 'psllq'.
- 0x81763270, // Small 'psllw'.
- 0x9130B670, // Small 'psmash'.
- 0x8040CA70, // Small 'psrad'.
- 0x8170CA70, // Small 'psraw'.
- 0x80464A70, // Small 'psrld'.
- 0xA2464A70, // Small 'psrldq'.
- 0x81164A70, // Small 'psrlq'.
- 0x81764A70, // Small 'psrlw'.
- 0x80215670, // Small 'psubb'.
- 0x80415670, // Small 'psubd'.
- 0x81115670, // Small 'psubq'.
- 0x85315670, // Small 'psubsb'.
- 0xAF315670, // Small 'psubsw'.
- 0x25BA56C6, // Large 'psubu|sb'.
- 0x238356C6, // Large 'psubu|sw'.
- 0x81715670, // Small 'psubw'.
- 0x8900DE70, // Small 'pswapd'.
- 0x81499690, // Small 'ptest'.
- 0x20DF577A, // Large 'ptwri|te'.
- 0x239A7280, // Large 'punpckh|bw'.
- 0x20E57280, // Large 'punpckh|dq'.
- 0x20E58280, // Large 'punpckhq|dq'.
- 0x239C7280, // Large 'punpckh|wd'.
- 0x339E6280, // Large 'punpck|lbw'.
- 0x33A16280, // Large 'punpck|ldq'.
- 0x42886280, // Large 'punpck|lqdq'.
- 0x33A46280, // Large 'punpck|lwd'.
- 0x80044EB0, // Small 'push'.
- 0x80144EB0, // Small 'pusha'.
- 0x88144EB0, // Small 'pushad'.
- 0x80644EB0, // Small 'pushf'.
- 0x88644EB0, // Small 'pushfd'.
- 0xA2644EB0, // Small 'pushfq'.
- 0x20DF7422, // Large 'pvalida|te'.
- 0x80093F10, // Small 'pxor'.
- 0x80003072, // Small 'rcl'.
- 0x81384072, // Small 'rcpps'.
- 0x8139C072, // Small 'rcpss'.
- 0x80004872, // Small 'rcr'.
- 0x34365616, // Large 'rdfsb|ase'.
- 0x3436561B, // Large 'rdgsb|ase'.
- 0x8129B492, // Small 'rdmsr'.
- 0x8044C092, // Small 'rdpid'.
- 0xAB25C092, // Small 'rdpkru'.
- 0x8036C092, // Small 'rdpmc'.
- 0x81594092, // Small 'rdpru'.
- 0x88E0C892, // Small 'rdrand'.
- 0x8852CC92, // Small 'rdseed'.
- 0x8909CC92, // Small 'rdsspd'.
- 0xA309CC92, // Small 'rdsspq'.
- 0x8039D092, // Small 'rdtsc'.
- 0xA039D092, // Small 'rdtscp'.
- 0x800050B2, // Small 'ret'.
- 0x800350B2, // Small 'retf'.
- 0x201F7429, // Large 'rmpadju|st'.
- 0x20DF7430, // Large 'rmpupda|te'.
- 0x800031F2, // Small 'rol'.
- 0x800049F2, // Small 'ror'.
- 0x800C49F2, // Small 'rorx'.
- 0x20A756D8, // Large 'round|pd'.
- 0x207D56D8, // Large 'round|ps'.
- 0x000076D8, // Large 'roundsd'.
- 0x101466D8, // Large 'rounds|s'.
- 0x80003672, // Small 'rsm'.
- 0x207D53A8, // Large 'rsqrt|ps'.
- 0x201C53A8, // Large 'rsqrt|ss'.
- 0x3620540D, // Large 'rstor|ssp'.
- 0x80032033, // Small 'sahf'.
- 0x80003033, // Small 'sal'.
- 0x80004833, // Small 'sar'.
- 0x800C4833, // Small 'sarx'.
- 0x1004A1AF, // Large 'saveprevss|p'.
- 0x80000853, // Small 'sbb'.
- 0x80098473, // Small 'scas'.
- 0x10D27623, // Large 'seamcal|l'.
- 0x207D577F, // Large 'seamo|ps'.
- 0x21A35784, // Large 'seamr|et'.
- 0x222A662A, // Large 'sendui|pi'.
- 0x23CB7437, // Large 'seriali|ze'.
- 0x8000D0B3, // Small 'seta'.
- 0x8050D0B3, // Small 'setae'.
- 0x800150B3, // Small 'setb'.
- 0x805150B3, // Small 'setbe'.
- 0x8001D0B3, // Small 'setc'.
- 0x8002D0B3, // Small 'sete'.
- 0x8003D0B3, // Small 'setg'.
- 0x8053D0B3, // Small 'setge'.
- 0x800650B3, // Small 'setl'.
- 0x805650B3, // Small 'setle'.
- 0x801750B3, // Small 'setna'.
- 0x8A1750B3, // Small 'setnae'.
- 0x802750B3, // Small 'setnb'.
- 0x8A2750B3, // Small 'setnbe'.
- 0x803750B3, // Small 'setnc'.
- 0x805750B3, // Small 'setne'.
- 0x807750B3, // Small 'setng'.
- 0x8A7750B3, // Small 'setnge'.
- 0x80C750B3, // Small 'setnl'.
- 0x8AC750B3, // Small 'setnle'.
- 0x80F750B3, // Small 'setno'.
- 0x810750B3, // Small 'setnp'.
- 0x813750B3, // Small 'setns'.
- 0x81A750B3, // Small 'setnz'.
- 0x8007D0B3, // Small 'seto'.
- 0x800850B3, // Small 'setp'.
- 0x805850B3, // Small 'setpe'.
- 0x80F850B3, // Small 'setpo'.
- 0x8009D0B3, // Small 'sets'.
- 0x10177630, // Large 'setssbs|y'.
- 0x800D50B3, // Small 'setz'.
- 0x8A3714D3, // Small 'sfence'.
- 0x800A10F3, // Small 'sgdt'.
- 0x4295443E, // Large 'sha1|msg1'.
- 0x4299443E, // Large 'sha1|msg2'.
- 0x20DF743E, // Large 'sha1nex|te'.
- 0x102F8445, // Large 'sha1rnds|4'.
- 0x429561B9, // Large 'sha256|msg1'.
- 0x429961B9, // Large 'sha256|msg2'.
- 0x207E91B9, // Large 'sha256rnd|s2'.
- 0x80003113, // Small 'shl'.
- 0x80023113, // Small 'shld'.
- 0x800C3113, // Small 'shlx'.
- 0x80004913, // Small 'shr'.
- 0x80024913, // Small 'shrd'.
- 0x800C4913, // Small 'shrx'.
- 0x89035513, // Small 'shufpd'.
- 0xA7035513, // Small 'shufps'.
- 0x800A1133, // Small 'sidt'.
- 0xA8972573, // Small 'skinit'.
- 0x800A1193, // Small 'sldt'.
- 0x84385D93, // Small 'slwpcb'.
- 0x800BCDB3, // Small 'smsw'.
- 0x890A4A33, // Small 'sqrtpd'.
- 0xA70A4A33, // Small 'sqrtps'.
- 0x893A4A33, // Small 'sqrtsd'.
- 0xA73A4A33, // Small 'sqrtss'.
- 0x80018693, // Small 'stac'.
- 0x80000E93, // Small 'stc'.
- 0x80001293, // Small 'std'.
- 0x80049E93, // Small 'stgi'.
- 0x80002693, // Small 'sti'.
- 0x102366E7, // Large 'stmxcs|r'.
- 0x8009BE93, // Small 'stos'.
- 0x80004A93, // Small 'str'.
- 0x1001844D, // Large 'sttilecf|g'.
- 0x8004D693, // Small 'stui'.
- 0x80000AB3, // Small 'sub'.
- 0x80480AB3, // Small 'subpd'.
- 0x81380AB3, // Small 'subps'.
- 0x80498AB3, // Small 'subsd'.
- 0x81398AB3, // Small 'subss'.
- 0xA67806F3, // Small 'swapgs'.
- 0x36F34789, // Large 'sysc|all'.
- 0x41234637, // Large 'syse|nter'.
- 0x2192563B, // Large 'sysex|it'.
- 0x3192563B, // Large 'sysex|itq'.
- 0xA8594F33, // Small 'sysret'.
- 0x2193578D, // Large 'sysre|tq'.
- 0x86B9B794, // Small 't1mskc'.
- 0x207DA12B, // Large 'tcmmimfp16|ps'.
- 0x207DA135, // Large 'tcmmrlfp16|ps'.
- 0x98C08C94, // Small 'tdcall'.
- 0x207D7455, // Large 'tdpbf16|ps'.
- 0x31434455, // Large 'tdpb|ssd'.
- 0x32E44455, // Large 'tdpb|sud'.
- 0x21445792, // Large 'tdpbu|sd'.
- 0x22E55792, // Large 'tdpbu|ud'.
- 0x207D745C, // Large 'tdpfp16|ps'.
- 0x800A4CB4, // Small 'test'.
- 0x935A4CB4, // Small 'testui'.
- 0x000091C2, // Large 'tileloadd'.
- 0x21AD91C2, // Large 'tileloadd|t1'.
- 0x212791CB, // Large 'tilerelea|se'.
- 0x102692C1, // Large 'tilestore|d'.
- 0x43CB41C2, // Large 'tile|zero'.
- 0x21E15797, // Large 'tlbsy|nc'.
- 0x8B3A8614, // Small 'tpause'.
- 0x81470F54, // Small 'tzcnt'.
- 0x80B9B754, // Small 'tzmsk'.
- 0x214456EE, // Large 'ucomi|sd'.
- 0x201C56EE, // Large 'ucomi|ss'.
- 0x80006C95, // Small 'ud0'.
- 0x80007095, // Small 'ud1'.
- 0x80007495, // Small 'ud2'.
- 0x8142C935, // Small 'uiret'.
- 0x7600109D, // Large 'u|monitor'.
- 0xA890DDB5, // Small 'umwait'.
- 0x20A76281, // Large 'unpckh|pd'.
- 0x207D6281, // Large 'unpckh|ps'.
- 0x35975281, // Large 'unpck|lpd'.
- 0x359A5281, // Large 'unpck|lps'.
- 0x30F16463, // Large 'v4fmad|dps'.
- 0x32D16463, // Large 'v4fmad|dss'.
- 0x30F172CA, // Large 'v4fnmad|dps'.
- 0x32D172CA, // Large 'v4fnmad|dss'.
- 0x89021036, // Small 'vaddpd'.
- 0x91021036, // Small 'vaddph'.
- 0xA7021036, // Small 'vaddps'.
- 0x89321036, // Small 'vaddsd'.
- 0x91321036, // Small 'vaddsh'.
- 0xA7321036, // Small 'vaddss'.
- 0x20A77469, // Large 'vaddsub|pd'.
- 0x207D7469, // Large 'vaddsub|ps'.
- 0x000071D4, // Large 'vaesdec'.
- 0x302881D4, // Large 'vaesdecl|ast'.
- 0x000071DC, // Large 'vaesenc'.
- 0x302881DC, // Large 'vaesencl|ast'.
- 0x2626579C, // Large 'vaesi|mc'.
- 0x1020F011, // Large 'vaeskeygenassis|t'.
- 0x219D57A1, // Large 'valig|nd'.
- 0x271E57A1, // Large 'valig|nq'.
- 0x20A757A6, // Large 'vandn|pd'.
- 0x207D57A6, // Large 'vandn|ps'.
- 0x89023836, // Small 'vandpd'.
- 0xA7023836, // Small 'vandps'.
- 0x1014D062, // Large 'vbcstnebf162p|s'.
- 0x513F7062, // Large 'vbcstne|sh2ps'.
- 0x20A77470, // Large 'vblendm|pd'.
- 0x207D7470, // Large 'vblendm|ps'.
- 0x20A76470, // Large 'vblend|pd'.
- 0x207D6470, // Large 'vblend|ps'.
- 0x34776470, // Large 'vblend|vpd'.
- 0x318B6470, // Large 'vblend|vps'.
- 0x306FB021, // Large 'vbroadcastf|128'.
- 0x1003E021, // Large 'vbroadcastf32x|2'.
- 0x102FE021, // Large 'vbroadcastf32x|4'.
- 0x1005E021, // Large 'vbroadcastf32x|8'.
- 0x4030B021, // Large 'vbroadcastf|64x2'.
- 0x4034B021, // Large 'vbroadcastf|64x4'.
- 0x4072A021, // Large 'vbroadcast|i128'.
- 0x5038A021, // Large 'vbroadcast|i32x2'.
- 0x503DA021, // Large 'vbroadcast|i32x4'.
- 0x5042A021, // Large 'vbroadcast|i32x8'.
- 0x5047A021, // Large 'vbroadcast|i64x2'.
- 0x504CA021, // Large 'vbroadcast|i64x4'.
- 0x2144A021, // Large 'vbroadcast|sd'.
- 0x201CA021, // Large 'vbroadcast|ss'.
- 0x89083476, // Small 'vcmppd'.
- 0x91083476, // Small 'vcmpph'.
- 0xA7083476, // Small 'vcmpps'.
- 0x89383476, // Small 'vcmpsd'.
- 0x91383476, // Small 'vcmpsh'.
- 0xA7383476, // Small 'vcmpss'.
- 0x214457AB, // Large 'vcomi|sd'.
- 0x20D557AB, // Large 'vcomi|sh'.
- 0x201C57AB, // Large 'vcomi|ss'.
- 0x20A791E4, // Large 'vcompress|pd'.
- 0x207D91E4, // Large 'vcompress|ps'.
- 0x20A7747A, // Large 'vcvtdq2|pd'.
- 0x20A2747A, // Large 'vcvtdq2|ph'.
- 0x207D747A, // Large 'vcvtdq2|ps'.
- 0x4069A076, // Large 'vcvtne2ps2|bf16'.
- 0x307CB080, // Large 'vcvtneebf16|2ps'.
- 0x51467080, // Large 'vcvtnee|ph2ps'.
- 0x307CB08B, // Large 'vcvtneobf16|2ps'.
- 0x5146708B, // Large 'vcvtneo|ph2ps'.
- 0x406990FC, // Large 'vcvtneps2|bf16'.
- 0x20E572D4, // Large 'vcvtpd2|dq'.
- 0x20A272D4, // Large 'vcvtpd2|ph'.
- 0x207D72D4, // Large 'vcvtpd2|ps'.
- 0x21F672D4, // Large 'vcvtpd2|qq'.
- 0x20E582D4, // Large 'vcvtpd2u|dq'.
- 0x21F682D4, // Large 'vcvtpd2u|qq'.
- 0x20E572DC, // Large 'vcvtph2|dq'.
- 0x102682DC, // Large 'vcvtph2p|d'.
- 0x000092DC, // Large 'vcvtph2ps'.
- 0x102E92DC, // Large 'vcvtph2ps|x'.
- 0x21F672DC, // Large 'vcvtph2|qq'.
- 0x32E572DC, // Large 'vcvtph2|udq'.
- 0x31F572DC, // Large 'vcvtph2|uqq'.
- 0x248172DC, // Large 'vcvtph2|uw'.
- 0x105F72DC, // Large 'vcvtph2|w'.
- 0x20E572E8, // Large 'vcvtps2|dq'.
- 0x102682E8, // Large 'vcvtps2p|d'.
- 0x000092E8, // Large 'vcvtps2ph'.
- 0x102E92E8, // Large 'vcvtps2ph|x'.
- 0x21F672E8, // Large 'vcvtps2|qq'.
- 0x32E572E8, // Large 'vcvtps2|udq'.
- 0x31F572E8, // Large 'vcvtps2|uqq'.
- 0x20A77483, // Large 'vcvtqq2|pd'.
- 0x20A27483, // Large 'vcvtqq2|ph'.
- 0x207D7483, // Large 'vcvtqq2|ps'.
- 0x20D572F1, // Large 'vcvtsd2|sh'.
- 0x201D72F1, // Large 'vcvtsd2|si'.
- 0x201C72F1, // Large 'vcvtsd2|ss'.
- 0x201D82F1, // Large 'vcvtsd2u|si'.
- 0x214472F9, // Large 'vcvtsh2|sd'.
- 0x201D72F9, // Large 'vcvtsh2|si'.
- 0x201C72F9, // Large 'vcvtsh2|ss'.
- 0x201D82F9, // Large 'vcvtsh2u|si'.
- 0x2144748A, // Large 'vcvtsi2|sd'.
- 0x20D5748A, // Large 'vcvtsi2|sh'.
- 0x201C748A, // Large 'vcvtsi2|ss'.
- 0x21447301, // Large 'vcvtss2|sd'.
- 0x20D57301, // Large 'vcvtss2|sh'.
- 0x201D7301, // Large 'vcvtss2|si'.
- 0x201D8301, // Large 'vcvtss2u|si'.
- 0x20E581ED, // Large 'vcvttpd2|dq'.
- 0x21F681ED, // Large 'vcvttpd2|qq'.
- 0x20E591ED, // Large 'vcvttpd2u|dq'.
- 0x21F691ED, // Large 'vcvttpd2u|qq'.
- 0x20E581F8, // Large 'vcvttph2|dq'.
- 0x21F681F8, // Large 'vcvttph2|qq'.
- 0x20E591F8, // Large 'vcvttph2u|dq'.
- 0x21F691F8, // Large 'vcvttph2u|qq'.
- 0x105F91F8, // Large 'vcvttph2u|w'.
- 0x105F81F8, // Large 'vcvttph2|w'.
- 0x20E58201, // Large 'vcvttps2|dq'.
- 0x21F68201, // Large 'vcvttps2|qq'.
- 0x20E59201, // Large 'vcvttps2u|dq'.
- 0x21F69201, // Large 'vcvttps2u|qq'.
- 0x201D820A, // Large 'vcvttsd2|si'.
- 0x201D920A, // Large 'vcvttsd2u|si'.
- 0x201D8213, // Large 'vcvttsh2|si'.
- 0x201D9213, // Large 'vcvttsh2u|si'.
- 0x201D821C, // Large 'vcvttss2|si'.
- 0x201D921C, // Large 'vcvttss2u|si'.
- 0x20A78309, // Large 'vcvtudq2|pd'.
- 0x20A28309, // Large 'vcvtudq2|ph'.
- 0x207D8309, // Large 'vcvtudq2|ps'.
- 0x20A78311, // Large 'vcvtuqq2|pd'.
- 0x20A28311, // Large 'vcvtuqq2|ph'.
- 0x207D8311, // Large 'vcvtuqq2|ps'.
- 0x21448319, // Large 'vcvtusi2|sd'.
- 0x20D58319, // Large 'vcvtusi2|sh'.
- 0x201C8319, // Large 'vcvtusi2|ss'.
- 0x30A16491, // Large 'vcvtuw|2ph'.
- 0x30A15640, // Large 'vcvtw|2ph'.
- 0x239A7497, // Large 'vdbpsad|bw'.
- 0x890B2496, // Small 'vdivpd'.
- 0x910B2496, // Small 'vdivph'.
- 0xA70B2496, // Small 'vdivps'.
- 0x893B2496, // Small 'vdivsd'.
- 0x913B2496, // Small 'vdivsh'.
- 0xA73B2496, // Small 'vdivss'.
- 0x207D749E, // Large 'vdpbf16|ps'.
- 0x80484096, // Small 'vdppd'.
- 0x81384096, // Small 'vdpps'.
- 0x800948B6, // Small 'verr'.
- 0x800BC8B6, // Small 'verw'.
- 0x352544A5, // Large 'vexp|2pd'.
- 0x307C44A5, // Large 'vexp|2ps'.
- 0x30ED64A5, // Large 'vexpan|dpd'.
- 0x30F164A5, // Large 'vexpan|dps'.
- 0x306F910C, // Large 'vextractf|128'.
- 0x602A7105, // Large 'vextrac|tf32x4'.
- 0x4043910C, // Large 'vextractf|32x8'.
- 0x4030910C, // Large 'vextractf|64x2'.
- 0x4034910C, // Large 'vextractf|64x4'.
- 0x4072810C, // Large 'vextract|i128'.
- 0x503D810C, // Large 'vextract|i32x4'.
- 0x5042810C, // Large 'vextract|i32x8'.
- 0x5047810C, // Large 'vextract|i64x2'.
- 0x504C810C, // Large 'vextract|i64x4'.
- 0x207D810C, // Large 'vextract|ps'.
- 0x20A28321, // Large 'vfcmaddc|ph'.
- 0x20D58321, // Large 'vfcmaddc|sh'.
- 0x20A274AB, // Large 'vfcmulc|ph'.
- 0x20D574AB, // Large 'vfcmulc|sh'.
- 0x20A79225, // Large 'vfixupimm|pd'.
- 0x207D9225, // Large 'vfixupimm|ps'.
- 0x21449225, // Large 'vfixupimm|sd'.
- 0x201C9225, // Large 'vfixupimm|ss'.
- 0x20A7922E, // Large 'vfmadd132|pd'.
- 0x20A2922E, // Large 'vfmadd132|ph'.
- 0x207D922E, // Large 'vfmadd132|ps'.
- 0x2144922E, // Large 'vfmadd132|sd'.
- 0x20D5922E, // Large 'vfmadd132|sh'.
- 0x201C922E, // Large 'vfmadd132|ss'.
- 0x50A46096, // Large 'vfmadd|213pd'.
- 0x50A96096, // Large 'vfmadd|213ph'.
- 0x50AE6096, // Large 'vfmadd|213ps'.
- 0x51556096, // Large 'vfmadd|213sd'.
- 0x515A6096, // Large 'vfmadd|213sh'.
- 0x515F6096, // Large 'vfmadd|213ss'.
- 0x50B36096, // Large 'vfmadd|231pd'.
- 0x50B86096, // Large 'vfmadd|231ph'.
- 0x50BD6096, // Large 'vfmadd|231ps'.
- 0x51646096, // Large 'vfmadd|231sd'.
- 0x51696096, // Large 'vfmadd|231sh'.
- 0x516E6096, // Large 'vfmadd|231ss'.
- 0x34B26096, // Large 'vfmadd|cph'.
- 0x34B56096, // Large 'vfmadd|csh'.
- 0x20A76096, // Large 'vfmadd|pd'.
- 0x207D6096, // Large 'vfmadd|ps'.
- 0x10267096, // Large 'vfmadds|d'.
- 0x10147096, // Large 'vfmadds|s'.
- 0x1026D096, // Large 'vfmaddsub132p|d'.
- 0x10A3D096, // Large 'vfmaddsub132p|h'.
- 0x1014D096, // Large 'vfmaddsub132p|s'.
- 0x50A49096, // Large 'vfmaddsub|213pd'.
- 0x50A99096, // Large 'vfmaddsub|213ph'.
- 0x50AE9096, // Large 'vfmaddsub|213ps'.
- 0x50B39096, // Large 'vfmaddsub|231pd'.
- 0x50B89096, // Large 'vfmaddsub|231ph'.
- 0x50BD9096, // Large 'vfmaddsub|231ps'.
- 0x20A79096, // Large 'vfmaddsub|pd'.
- 0x207D9096, // Large 'vfmaddsub|ps'.
- 0x20A79237, // Large 'vfmsub132|pd'.
- 0x20A29237, // Large 'vfmsub132|ph'.
- 0x207D9237, // Large 'vfmsub132|ps'.
- 0x21449237, // Large 'vfmsub132|sd'.
- 0x20D59237, // Large 'vfmsub132|sh'.
- 0x201C9237, // Large 'vfmsub132|ss'.
- 0x50A460C2, // Large 'vfmsub|213pd'.
- 0x50A960C2, // Large 'vfmsub|213ph'.
- 0x50AE60C2, // Large 'vfmsub|213ps'.
- 0x515560C2, // Large 'vfmsub|213sd'.
- 0x515A60C2, // Large 'vfmsub|213sh'.
- 0x515F60C2, // Large 'vfmsub|213ss'.
- 0x50B360C2, // Large 'vfmsub|231pd'.
- 0x50B860C2, // Large 'vfmsub|231ph'.
- 0x50BD60C2, // Large 'vfmsub|231ps'.
- 0x516460C2, // Large 'vfmsub|231sd'.
- 0x516960C2, // Large 'vfmsub|231sh'.
- 0x516E60C2, // Large 'vfmsub|231ss'.
- 0x20A7C0C2, // Large 'vfmsubadd132|pd'.
- 0x20A2C0C2, // Large 'vfmsubadd132|ph'.
- 0x207DC0C2, // Large 'vfmsubadd132|ps'.
- 0x50A490C2, // Large 'vfmsubadd|213pd'.
- 0x50A990C2, // Large 'vfmsubadd|213ph'.
- 0x50AE90C2, // Large 'vfmsubadd|213ps'.
- 0x50B390C2, // Large 'vfmsubadd|231pd'.
- 0x50B890C2, // Large 'vfmsubadd|231ph'.
- 0x50BD90C2, // Large 'vfmsubadd|231ps'.
- 0x20A790C2, // Large 'vfmsubadd|pd'.
- 0x207D90C2, // Large 'vfmsubadd|ps'.
- 0x20A760C2, // Large 'vfmsub|pd'.
- 0x207D60C2, // Large 'vfmsub|ps'.
- 0x214460C2, // Large 'vfmsub|sd'.
- 0x201C60C2, // Large 'vfmsub|ss'.
- 0x34B25645, // Large 'vfmul|cph'.
- 0x34B55645, // Large 'vfmul|csh'.
- 0x20A7A14B, // Large 'vfnmadd132|pd'.
- 0x20A2A14B, // Large 'vfnmadd132|ph'.
- 0x207DA14B, // Large 'vfnmadd132|ps'.
- 0x2144A14B, // Large 'vfnmadd132|sd'.
- 0x20D5A14B, // Large 'vfnmadd132|sh'.
- 0x201CA14B, // Large 'vfnmadd132|ss'.
- 0x50A4714B, // Large 'vfnmadd|213pd'.
- 0x50A9714B, // Large 'vfnmadd|213ph'.
- 0x50AE714B, // Large 'vfnmadd|213ps'.
- 0x5155714B, // Large 'vfnmadd|213sd'.
- 0x515A714B, // Large 'vfnmadd|213sh'.
- 0x515F714B, // Large 'vfnmadd|213ss'.
- 0x50B3714B, // Large 'vfnmadd|231pd'.
- 0x50B8714B, // Large 'vfnmadd|231ph'.
- 0x50BD714B, // Large 'vfnmadd|231ps'.
- 0x5164714B, // Large 'vfnmadd|231sd'.
- 0x5169714B, // Large 'vfnmadd|231sh'.
- 0x516E714B, // Large 'vfnmadd|231ss'.
- 0x20A7714B, // Large 'vfnmadd|pd'.
- 0x207D714B, // Large 'vfnmadd|ps'.
- 0x2144714B, // Large 'vfnmadd|sd'.
- 0x201C714B, // Large 'vfnmadd|ss'.
- 0x20A7A173, // Large 'vfnmsub132|pd'.
- 0x20A2A173, // Large 'vfnmsub132|ph'.
- 0x207DA173, // Large 'vfnmsub132|ps'.
- 0x2144A173, // Large 'vfnmsub132|sd'.
- 0x20D5A173, // Large 'vfnmsub132|sh'.
- 0x201CA173, // Large 'vfnmsub132|ss'.
- 0x50A47173, // Large 'vfnmsub|213pd'.
- 0x50A97173, // Large 'vfnmsub|213ph'.
- 0x50AE7173, // Large 'vfnmsub|213ps'.
- 0x51557173, // Large 'vfnmsub|213sd'.
- 0x515A7173, // Large 'vfnmsub|213sh'.
- 0x515F7173, // Large 'vfnmsub|213ss'.
- 0x50B37173, // Large 'vfnmsub|231pd'.
- 0x50B87173, // Large 'vfnmsub|231ph'.
- 0x50BD7173, // Large 'vfnmsub|231ps'.
- 0x51647173, // Large 'vfnmsub|231sd'.
- 0x51697173, // Large 'vfnmsub|231sh'.
- 0x516E7173, // Large 'vfnmsub|231ss'.
- 0x20A77173, // Large 'vfnmsub|pd'.
- 0x207D7173, // Large 'vfnmsub|ps'.
- 0x21447173, // Large 'vfnmsub|sd'.
- 0x201C7173, // Large 'vfnmsub|ss'.
- 0x20A78329, // Large 'vfpclass|pd'.
- 0x20A28329, // Large 'vfpclass|ph'.
- 0x207D8329, // Large 'vfpclass|ps'.
- 0x21448329, // Large 'vfpclass|sd'.
- 0x20D58329, // Large 'vfpclass|sh'.
- 0x201C8329, // Large 'vfpclass|ss'.
- 0x20A757B0, // Large 'vfrcz|pd'.
- 0x207D57B0, // Large 'vfrcz|ps'.
- 0x214457B0, // Large 'vfrcz|sd'.
- 0x201C57B0, // Large 'vfrcz|ss'.
- 0x30ED7115, // Large 'vgather|dpd'.
- 0x30F17115, // Large 'vgather|dps'.
- 0x30EDA115, // Large 'vgatherpf0|dpd'.
- 0x30F1A115, // Large 'vgatherpf0|dps'.
- 0x30E6A115, // Large 'vgatherpf0|qpd'.
- 0x30E9A115, // Large 'vgatherpf0|qps'.
- 0x40EC9115, // Large 'vgatherpf|1dpd'.
- 0x40F09115, // Large 'vgatherpf|1dps'.
- 0x40F49115, // Large 'vgatherpf|1qpd'.
- 0x40F89115, // Large 'vgatherpf|1qps'.
- 0x30E67115, // Large 'vgather|qpd'.
- 0x30E97115, // Large 'vgather|qps'.
- 0x20A774B8, // Large 'vgetexp|pd'.
- 0x20A274B8, // Large 'vgetexp|ph'.
- 0x207D74B8, // Large 'vgetexp|ps'.
- 0x214474B8, // Large 'vgetexp|sd'.
- 0x20D574B8, // Large 'vgetexp|sh'.
- 0x201C74B8, // Large 'vgetexp|ss'.
- 0x31F17331, // Large 'vgetman|tpd'.
- 0x31FC7331, // Large 'vgetman|tph'.
- 0x32057331, // Large 'vgetman|tps'.
- 0x320E7331, // Large 'vgetman|tsd'.
- 0x32177331, // Large 'vgetman|tsh'.
- 0x32207331, // Large 'vgetman|tss'.
- 0x200FF000, // Large 'vgf2p8affineinv|qb'.
- 0x200FC000, // Large 'vgf2p8affine|qb'.
- 0x43386000, // Large 'vgf2p8|mulb'.
- 0x30ED47B5, // Large 'vhad|dpd'.
- 0x30F147B5, // Large 'vhad|dps'.
- 0x20A757B9, // Large 'vhsub|pd'.
- 0x207D57B9, // Large 'vhsub|ps'.
- 0x306F8183, // Large 'vinsertf|128'.
- 0x602A617D, // Large 'vinser|tf32x4'.
- 0x40438183, // Large 'vinsertf|32x8'.
- 0x40308183, // Large 'vinsertf|64x2'.
- 0x40348183, // Large 'vinsertf|64x4'.
- 0x40727183, // Large 'vinsert|i128'.
- 0x503D7183, // Large 'vinsert|i32x4'.
- 0x50427183, // Large 'vinsert|i32x8'.
- 0x50477183, // Large 'vinsert|i64x2'.
- 0x504C7183, // Large 'vinsert|i64x4'.
- 0x207D7183, // Large 'vinsert|ps'.
- 0xAB121196, // Small 'vlddqu'.
- 0x1023764A, // Large 'vldmxcs|r'.
- 0x109DA240, // Large 'vmaskmovdq|u'.
- 0x20A78240, // Large 'vmaskmov|pd'.
- 0x207D8240, // Large 'vmaskmov|ps'.
- 0x890C05B6, // Small 'vmaxpd'.
- 0x910C05B6, // Small 'vmaxph'.
- 0xA70C05B6, // Small 'vmaxps'.
- 0x893C05B6, // Small 'vmaxsd'.
- 0x913C05B6, // Small 'vmaxsh'.
- 0xA73C05B6, // Small 'vmaxss'.
- 0x98C08DB6, // Small 'vmcall'.
- 0x242857BE, // Large 'vmcle|ar'.
- 0x86EA99B6, // Small 'vmfunc'.
- 0x219257C3, // Large 'vmgex|it'.
- 0x890725B6, // Small 'vminpd'.
- 0x910725B6, // Small 'vminph'.
- 0xA70725B6, // Small 'vminps'.
- 0x893725B6, // Small 'vminsd'.
- 0x913725B6, // Small 'vminsh'.
- 0xA73725B6, // Small 'vminss'.
- 0x21A56651, // Large 'vmlaun|ch'.
- 0x8817B1B6, // Small 'vmload'.
- 0x36F347C8, // Large 'vmmc|all'.
- 0x20A757CC, // Large 'vmova|pd'.
- 0x207D57CC, // Large 'vmova|ps'.
- 0x804B3DB6, // Small 'vmovd'.
- 0x365754BF, // Large 'vmovd|dup'.
- 0x000074BF, // Large 'vmovdqa'.
- 0x202C74BF, // Large 'vmovdqa|32'.
- 0x203074BF, // Large 'vmovdqa|64'.
- 0x109D64BF, // Large 'vmovdq|u'.
- 0x34C664BF, // Large 'vmovdq|u16'.
- 0x34C964BF, // Large 'vmovdq|u32'.
- 0x34CC64BF, // Large 'vmovdq|u64'.
- 0x265A64BF, // Large 'vmovdq|u8'.
- 0x359A565C, // Large 'vmovh|lps'.
- 0x20A7565C, // Large 'vmovh|pd'.
- 0x207D565C, // Large 'vmovh|ps'.
- 0x207D6661, // Large 'vmovlh|ps'.
- 0x20A75661, // Large 'vmovl|pd'.
- 0x207D5661, // Large 'vmovl|ps'.
- 0x20A774CF, // Large 'vmovmsk|pd'.
- 0x207D74CF, // Large 'vmovmsk|ps'.
- 0x20E564D6, // Large 'vmovnt|dq'.
- 0x34C364D6, // Large 'vmovnt|dqa'.
- 0x20A764D6, // Large 'vmovnt|pd'.
- 0x207D64D6, // Large 'vmovnt|ps'.
- 0x811B3DB6, // Small 'vmovq'.
- 0x893B3DB6, // Small 'vmovsd'.
- 0x913B3DB6, // Small 'vmovsh'.
- 0x222974DC, // Large 'vmovshd|up'.
- 0x222974E3, // Large 'vmovsld|up'.
- 0xA73B3DB6, // Small 'vmovss'.
- 0x343344BF, // Large 'vmov|upd'.
- 0x207D57D1, // Large 'vmovu|ps'.
- 0x817B3DB6, // Small 'vmovw'.
- 0x239A6667, // Large 'vmpsad|bw'.
- 0x341147D6, // Large 'vmpt|rld'.
- 0x340D47D6, // Large 'vmpt|rst'.
- 0x8812C9B6, // Small 'vmread'.
- 0x100B766D, // Large 'vmresum|e'.
- 0x80EAC9B6, // Small 'vmrun'.
- 0x8B60CDB6, // Small 'vmsave'.
- 0x890655B6, // Small 'vmulpd'.
- 0x910655B6, // Small 'vmulph'.
- 0xA70655B6, // Small 'vmulps'.
- 0x893655B6, // Small 'vmulsd'.
- 0x913655B6, // Small 'vmulsh'.
- 0xA73655B6, // Small 'vmulss'.
- 0x20DF57DA, // Large 'vmwri|te'.
- 0x8C67E1B6, // Small 'vmxoff'.
- 0x80E7E1B6, // Small 'vmxon'.
- 0x804849F6, // Small 'vorpd'.
- 0x813849F6, // Small 'vorps'.
- 0x1026C11F, // Large 'vp2intersect|d'.
- 0x100FC11F, // Large 'vp2intersect|q'.
- 0x1026833C, // Large 'vp4dpwss|d'.
- 0x209B833C, // Large 'vp4dpwss|ds'.
- 0x85310616, // Small 'vpabsb'.
- 0x89310616, // Small 'vpabsd'.
- 0xA3310616, // Small 'vpabsq'.
- 0xAF310616, // Small 'vpabsw'.
- 0x105F84EA, // Large 'vpackssd|w'.
- 0x24F274EA, // Large 'vpackss|wb'.
- 0x34F064F4, // Large 'vpacku|sdw'.
- 0x34FA64F4, // Large 'vpacku|swb'.
- 0x84420616, // Small 'vpaddb'.
- 0x88420616, // Small 'vpaddd'.
- 0xA2420616, // Small 'vpaddq'.
- 0x25BA5674, // Large 'vpadd|sb'.
- 0x23835674, // Large 'vpadd|sw'.
- 0x25BA6674, // Large 'vpaddu|sb'.
- 0x23836674, // Large 'vpaddu|sw'.
- 0xAE420616, // Small 'vpaddw'.
- 0x1023767A, // Large 'vpalign|r'.
- 0x80470616, // Small 'vpand'.
- 0x88470616, // Small 'vpandd'.
- 0x9C470616, // Small 'vpandn'.
- 0x219D57DF, // Large 'vpand|nd'.
- 0x271E57DF, // Large 'vpand|nq'.
- 0xA2470616, // Small 'vpandq'.
- 0x847B0616, // Small 'vpavgb'.
- 0xAE7B0616, // Small 'vpavgw'.
- 0x102674FD, // Large 'vpblend|d'.
- 0x205C74FD, // Large 'vpblend|mb'.
- 0x250474FD, // Large 'vpblend|md'.
- 0x100F84FD, // Large 'vpblendm|q'.
- 0x105F84FD, // Large 'vpblendm|w'.
- 0x202174FD, // Large 'vpblend|vb'.
- 0x105F74FD, // Large 'vpblend|w'.
- 0x1010B051, // Large 'vpbroadcast|b'.
- 0x1026B051, // Large 'vpbroadcast|d'.
- 0x100FE051, // Large 'vpbroadcastmb2|q'.
- 0x305FC051, // Large 'vpbroadcastm|w2d'.
- 0x100FB051, // Large 'vpbroadcast|q'.
- 0x105FB051, // Large 'vpbroadcast|w'.
- 0x42886344, // Large 'vpclmu|lqdq'.
- 0xACF68E16, // Small 'vpcmov'.
- 0x85068E16, // Small 'vpcmpb'.
- 0x89068E16, // Small 'vpcmpd'.
- 0x200F634A, // Large 'vpcmpe|qb'.
- 0x227D634A, // Large 'vpcmpe|qd'.
- 0x21F6634A, // Large 'vpcmpe|qq'.
- 0x2559634A, // Large 'vpcmpe|qw'.
- 0x1009934A, // Large 'vpcmpestr|i'.
- 0x105C934A, // Large 'vpcmpestr|m'.
- 0x3681534A, // Large 'vpcmp|gtb'.
- 0x3684534A, // Large 'vpcmp|gtd'.
- 0x3687534A, // Large 'vpcmp|gtq'.
- 0x368A534A, // Large 'vpcmp|gtw'.
- 0x10099353, // Large 'vpcmpistr|i'.
- 0x105C9353, // Large 'vpcmpistr|m'.
- 0xA3068E16, // Small 'vpcmpq'.
- 0x209D534A, // Large 'vpcmp|ub'.
- 0x22E5534A, // Large 'vpcmp|ud'.
- 0x21F5534A, // Large 'vpcmp|uq'.
- 0x2481534A, // Large 'vpcmp|uw'.
- 0xAF068E16, // Small 'vpcmpw'.
- 0x84D78E16, // Small 'vpcomb'.
- 0x88D78E16, // Small 'vpcomd'.
- 0x1010A24A, // Large 'vpcompress|b'.
- 0x1026A24A, // Large 'vpcompress|d'.
- 0x100FA24A, // Large 'vpcompress|q'.
- 0x105FA24A, // Large 'vpcompress|w'.
- 0xA2D78E16, // Small 'vpcomq'.
- 0x209D524A, // Large 'vpcom|ub'.
- 0x22E5524A, // Large 'vpcom|ud'.
- 0x21F5524A, // Large 'vpcom|uq'.
- 0x2481524A, // Large 'vpcom|uw'.
- 0xAED78E16, // Small 'vpcomw'.
- 0x1026A254, // Large 'vpconflict|d'.
- 0x100FA254, // Large 'vpconflict|q'.
- 0x10267506, // Large 'vpdpbss|d'.
- 0x209B7506, // Large 'vpdpbss|ds'.
- 0x22E56506, // Large 'vpdpbs|ud'.
- 0x350D6506, // Large 'vpdpbs|uds'.
- 0x10267510, // Large 'vpdpbus|d'.
- 0x209B7510, // Large 'vpdpbus|ds'.
- 0x22E56510, // Large 'vpdpbu|ud'.
- 0x350D6510, // Large 'vpdpbu|uds'.
- 0x10267517, // Large 'vpdpwss|d'.
- 0x209B7517, // Large 'vpdpwss|ds'.
- 0x22E56517, // Large 'vpdpws|ud'.
- 0x350D6517, // Large 'vpdpws|uds'.
- 0x1026751E, // Large 'vpdpwus|d'.
- 0x209B751E, // Large 'vpdpwus|ds'.
- 0x22E5651E, // Large 'vpdpwu|ud'.
- 0x350D651E, // Large 'vpdpwu|uds'.
- 0x306F735C, // Large 'vperm2f|128'.
- 0x4072635C, // Large 'vperm2|i128'.
- 0x84D91616, // Small 'vpermb'.
- 0x88D91616, // Small 'vpermd'.
- 0x268D6363, // Large 'vpermi|2b'.
- 0x20606363, // Large 'vpermi|2d'.
- 0x35256363, // Large 'vpermi|2pd'.
- 0x307C6363, // Large 'vpermi|2ps'.
- 0x268F6363, // Large 'vpermi|2q'.
- 0x205E6363, // Large 'vpermi|2w'.
- 0x20A78363, // Large 'vpermil2|pd'.
- 0x207D8363, // Large 'vpermil2|ps'.
- 0x20A77363, // Large 'vpermil|pd'.
- 0x207D7363, // Large 'vpermil|ps'.
- 0x20A7535C, // Large 'vperm|pd'.
- 0x207D535C, // Large 'vperm|ps'.
- 0xA2D91616, // Small 'vpermq'.
- 0x268D6528, // Large 'vpermt|2b'.
- 0x20606528, // Large 'vpermt|2d'.
- 0x35256528, // Large 'vpermt|2pd'.
- 0x307C6528, // Large 'vpermt|2ps'.
- 0x268F6528, // Large 'vpermt|2q'.
- 0x205E6528, // Large 'vpermt|2w'.
- 0xAED91616, // Small 'vpermw'.
- 0x2498752E, // Large 'vpexpan|db'.
- 0x209A752E, // Large 'vpexpan|dd'.
- 0x20E5752E, // Large 'vpexpan|dq'.
- 0x24F1752E, // Large 'vpexpan|dw'.
- 0x35F7452E, // Large 'vpex|trb'.
- 0x261657E4, // Large 'vpext|rd'.
- 0x227C57E4, // Large 'vpext|rq'.
- 0x27E957E4, // Large 'vpext|rw'.
- 0x209A836B, // Large 'vpgather|dd'.
- 0x20E5836B, // Large 'vpgather|dq'.
- 0x227D836B, // Large 'vpgather|qd'.
- 0x21F6836B, // Large 'vpgather|qq'.
- 0x26916535, // Large 'vphadd|bd'.
- 0x26936535, // Large 'vphadd|bq'.
- 0x239A6535, // Large 'vphadd|bw'.
- 0x10266535, // Large 'vphadd|d'.
- 0x20E56535, // Large 'vphadd|dq'.
- 0x23836535, // Large 'vphadd|sw'.
- 0x10268535, // Large 'vphaddub|d'.
- 0x100F8535, // Large 'vphaddub|q'.
- 0x105F8535, // Large 'vphaddub|w'.
- 0x20E57535, // Large 'vphaddu|dq'.
- 0x239C7535, // Large 'vphaddu|wd'.
- 0x253D7535, // Large 'vphaddu|wq'.
- 0x105F6535, // Large 'vphadd|w'.
- 0x239C6535, // Large 'vphadd|wd'.
- 0x253D6535, // Large 'vphadd|wq'.
- 0x105FA25E, // Large 'vphminposu|w'.
- 0x239A6695, // Large 'vphsub|bw'.
- 0x10266695, // Large 'vphsub|d'.
- 0x20E56695, // Large 'vphsub|dq'.
- 0x23836695, // Large 'vphsub|sw'.
- 0x105F6695, // Large 'vphsub|w'.
- 0x239C6695, // Large 'vphsub|wd'.
- 0x25F857EB, // Large 'vpins|rb'.
- 0x261657EB, // Large 'vpins|rd'.
- 0x227C57EB, // Large 'vpins|rq'.
- 0x27E957EB, // Large 'vpins|rw'.
- 0x2455669B, // Large 'vplzcn|td'.
- 0x2193669B, // Large 'vplzcn|tq'.
- 0x209A6373, // Large 'vpmacs|dd'.
- 0x353F6373, // Large 'vpmacs|dqh'.
- 0x33A26373, // Large 'vpmacs|dql'.
- 0x10268373, // Large 'vpmacssd|d'.
- 0x10A39373, // Large 'vpmacssdq|h'.
- 0x10D29373, // Large 'vpmacssdq|l'.
- 0x239C7373, // Large 'vpmacss|wd'.
- 0x239B7373, // Large 'vpmacss|ww'.
- 0x239C6373, // Large 'vpmacs|wd'.
- 0x239B6373, // Large 'vpmacs|ww'.
- 0x1026937C, // Large 'vpmadcssw|d'.
- 0x239C737C, // Large 'vpmadcs|wd'.
- 0x21F59268, // Large 'vpmadd52h|uq'.
- 0x32718268, // Large 'vpmadd52|luq'.
- 0x43856268, // Large 'vpmadd|ubsw'.
- 0x239C6268, // Large 'vpmadd|wd'.
- 0x62434268, // Large 'vpma|skmovd'.
- 0x200E8389, // Large 'vpmaskmo|vq'.
- 0x25BA57F0, // Large 'vpmax|sb'.
- 0x214457F0, // Large 'vpmax|sd'.
- 0x23A957F0, // Large 'vpmax|sq'.
- 0x238357F0, // Large 'vpmax|sw'.
- 0x209D57F0, // Large 'vpmax|ub'.
- 0x22E557F0, // Large 'vpmax|ud'.
- 0x21F557F0, // Large 'vpmax|uq'.
- 0x248157F0, // Large 'vpmax|uw'.
- 0x25BA57F5, // Large 'vpmin|sb'.
- 0x214457F5, // Large 'vpmin|sd'.
- 0x23A957F5, // Large 'vpmin|sq'.
- 0x238357F5, // Large 'vpmin|sw'.
- 0x209D57F5, // Large 'vpmin|ub'.
- 0x22E557F5, // Large 'vpmin|ud'.
- 0x21F557F5, // Large 'vpmin|uq'.
- 0x248157F5, // Large 'vpmin|uw'.
- 0x36A15542, // Large 'vpmov|b2m'.
- 0x36A45542, // Large 'vpmov|d2m'.
- 0x24985542, // Large 'vpmov|db'.
- 0x24F15542, // Large 'vpmov|dw'.
- 0x268D6542, // Large 'vpmovm|2b'.
- 0x20606542, // Large 'vpmovm|2d'.
- 0x268F6542, // Large 'vpmovm|2q'.
- 0x205E6542, // Large 'vpmovm|2w'.
- 0x10108542, // Large 'vpmovmsk|b'.
- 0x36A75542, // Large 'vpmov|q2m'.
- 0x200F5542, // Large 'vpmov|qb'.
- 0x227D5542, // Large 'vpmov|qd'.
- 0x25595542, // Large 'vpmov|qw'.
- 0x2498654A, // Large 'vpmovs|db'.
- 0x24F1654A, // Large 'vpmovs|dw'.
- 0x200F654A, // Large 'vpmovs|qb'.
- 0x227D654A, // Large 'vpmovs|qd'.
- 0x2559654A, // Large 'vpmovs|qw'.
- 0x24F2654A, // Large 'vpmovs|wb'.
- 0x1026854A, // Large 'vpmovsxb|d'.
- 0x100F854A, // Large 'vpmovsxb|q'.
- 0x105F854A, // Large 'vpmovsxb|w'.
- 0x20E5754A, // Large 'vpmovsx|dq'.
- 0x239C754A, // Large 'vpmovsx|wd'.
- 0x253D754A, // Large 'vpmovsx|wq'.
- 0x24987552, // Large 'vpmovus|db'.
- 0x24F17552, // Large 'vpmovus|dw'.
- 0x200F7552, // Large 'vpmovus|qb'.
- 0x227D7552, // Large 'vpmovus|qd'.
- 0x25597552, // Large 'vpmovus|qw'.
- 0x24F27552, // Large 'vpmovus|wb'.
- 0x36AA5542, // Large 'vpmov|w2m'.
- 0x24F25542, // Large 'vpmov|wb'.
- 0x1026855B, // Large 'vpmovzxb|d'.
- 0x100F855B, // Large 'vpmovzxb|q'.
- 0x105F855B, // Large 'vpmovzxb|w'.
- 0x20E5755B, // Large 'vpmovzx|dq'.
- 0x239C755B, // Large 'vpmovzx|wd'.
- 0x253D755B, // Large 'vpmovzx|wq'.
- 0x20E550CE, // Large 'vpmul|dq'.
- 0x23837563, // Large 'vpmulhr|sw'.
- 0x24816563, // Large 'vpmulh|uw'.
- 0x105F6563, // Large 'vpmulh|w'.
- 0x23A150CE, // Large 'vpmul|ld'.
- 0x228850CE, // Large 'vpmul|lq'.
- 0x23A450CE, // Large 'vpmul|lw'.
- 0x200FC0CE, // Large 'vpmultishift|qb'.
- 0x32E550CE, // Large 'vpmul|udq'.
- 0x268266AD, // Large 'vpopcn|tb'.
- 0x245566AD, // Large 'vpopcn|td'.
- 0x219366AD, // Large 'vpopcn|tq'.
- 0x264366AD, // Large 'vpopcn|tw'.
- 0x80093E16, // Small 'vpor'.
- 0x80493E16, // Small 'vpord'.
- 0x81193E16, // Small 'vporq'.
- 0x9B22C216, // Small 'vpperm'.
- 0x88C7CA16, // Small 'vprold'.
- 0xA2C7CA16, // Small 'vprolq'.
- 0x224757FA, // Large 'vprol|vd'.
- 0x200E57FA, // Large 'vprol|vq'.
- 0x8927CA16, // Small 'vprord'.
- 0xA327CA16, // Small 'vprorq'.
- 0x224757FF, // Large 'vpror|vd'.
- 0x200E57FF, // Large 'vpror|vq'.
- 0x8547CA16, // Small 'vprotb'.
- 0x8947CA16, // Small 'vprotd'.
- 0xA347CA16, // Small 'vprotq'.
- 0xAF47CA16, // Small 'vprotw'.
- 0x239A5804, // Large 'vpsad|bw'.
- 0x209A9274, // Large 'vpscatter|dd'.
- 0x20E59274, // Large 'vpscatter|dq'.
- 0x227D9274, // Large 'vpscatter|qd'.
- 0x100FA274, // Large 'vpscatterq|q'.
- 0x84144E16, // Small 'vpshab'.
- 0x88144E16, // Small 'vpshad'.
- 0xA2144E16, // Small 'vpshaq'.
- 0xAE144E16, // Small 'vpshaw'.
- 0x84C44E16, // Small 'vpshlb'.
- 0x88C44E16, // Small 'vpshld'.
- 0x102666B3, // Large 'vpshld|d'.
- 0x100F66B3, // Large 'vpshld|q'.
- 0x349D56B3, // Large 'vpshl|dvd'.
- 0x36B856B3, // Large 'vpshl|dvq'.
- 0x105F76B3, // Large 'vpshldv|w'.
- 0x105F66B3, // Large 'vpshld|w'.
- 0xA2C44E16, // Small 'vpshlq'.
- 0xAEC44E16, // Small 'vpshlw'.
- 0x102666BB, // Large 'vpshrd|d'.
- 0x100F66BB, // Large 'vpshrd|q'.
- 0x349D56BB, // Large 'vpshr|dvd'.
- 0x36B856BB, // Large 'vpshr|dvq'.
- 0x36C056BB, // Large 'vpshr|dvw'.
- 0x105F66BB, // Large 'vpshrd|w'.
- 0x0000718B, // Large 'vpshufb'.
- 0x205CA18B, // Large 'vpshufbitq|mb'.
- 0x1026618B, // Large 'vpshuf|d'.
- 0x26C3618B, // Large 'vpshuf|hw'.
- 0x23A4618B, // Large 'vpshuf|lw'.
- 0x22A95809, // Large 'vpsig|nb'.
- 0x219D5809, // Large 'vpsig|nd'.
- 0x26FB5809, // Large 'vpsig|nw'.
- 0x88C64E16, // Small 'vpslld'.
- 0x33A1480E, // Large 'vpsl|ldq'.
- 0xA2C64E16, // Small 'vpsllq'.
- 0x22475812, // Large 'vpsll|vd'.
- 0x200E5812, // Large 'vpsll|vq'.
- 0x26C15812, // Large 'vpsll|vw'.
- 0xAEC64E16, // Small 'vpsllw'.
- 0x88194E16, // Small 'vpsrad'.
- 0xA2194E16, // Small 'vpsraq'.
- 0x22475817, // Large 'vpsra|vd'.
- 0x200E5817, // Large 'vpsra|vq'.
- 0x26C15817, // Large 'vpsra|vw'.
- 0xAE194E16, // Small 'vpsraw'.
- 0x88C94E16, // Small 'vpsrld'.
- 0x33A14817, // Large 'vpsr|ldq'.
- 0xA2C94E16, // Small 'vpsrlq'.
- 0x2247581C, // Large 'vpsrl|vd'.
- 0x200E581C, // Large 'vpsrl|vq'.
- 0x26C1581C, // Large 'vpsrl|vw'.
- 0xAEC94E16, // Small 'vpsrlw'.
- 0x842ACE16, // Small 'vpsubb'.
- 0x882ACE16, // Small 'vpsubd'.
- 0xA22ACE16, // Small 'vpsubq'.
- 0x25BA56C5, // Large 'vpsub|sb'.
- 0x238356C5, // Large 'vpsub|sw'.
- 0x25BA66C5, // Large 'vpsubu|sb'.
- 0x238366C5, // Large 'vpsubu|sw'.
- 0xAE2ACE16, // Small 'vpsubw'.
- 0x10269391, // Large 'vpternlog|d'.
- 0x100F9391, // Large 'vpternlog|q'.
- 0xA932D216, // Small 'vptest'.
- 0x205C656A, // Large 'vptest|mb'.
- 0x2504656A, // Large 'vptest|md'.
- 0x2571656A, // Large 'vptest|mq'.
- 0x26A9656A, // Large 'vptest|mw'.
- 0x205C756A, // Large 'vptestn|mb'.
- 0x2504756A, // Large 'vptestn|md'.
- 0x2571756A, // Large 'vptestn|mq'.
- 0x105F856A, // Large 'vptestnm|w'.
- 0x239A827F, // Large 'vpunpckh|bw'.
- 0x20E5827F, // Large 'vpunpckh|dq'.
- 0x20E5927F, // Large 'vpunpckhq|dq'.
- 0x239C827F, // Large 'vpunpckh|wd'.
- 0x339E727F, // Large 'vpunpck|lbw'.
- 0x33A1727F, // Large 'vpunpck|ldq'.
- 0x4288727F, // Large 'vpunpck|lqdq'.
- 0x33A4727F, // Large 'vpunpck|lwd'.
- 0x8127E216, // Small 'vpxor'.
- 0x8927E216, // Small 'vpxord'.
- 0xA327E216, // Small 'vpxorq'.
- 0x20A766CB, // Large 'vrange|pd'.
- 0x207D66CB, // Large 'vrange|ps'.
- 0x214466CB, // Large 'vrange|sd'.
- 0x201C66CB, // Large 'vrange|ss'.
- 0x20A766D1, // Large 'vrcp14|pd'.
- 0x207D66D1, // Large 'vrcp14|ps'.
- 0x214466D1, // Large 'vrcp14|sd'.
- 0x201C66D1, // Large 'vrcp14|ss'.
- 0x43AF46D1, // Large 'vrcp|28pd'.
- 0x43B346D1, // Large 'vrcp|28ps'.
- 0x43B746D1, // Large 'vrcp|28sd'.
- 0x43BB46D1, // Large 'vrcp|28ss'.
- 0x91080E56, // Small 'vrcpph'.
- 0xA7080E56, // Small 'vrcpps'.
- 0x91380E56, // Small 'vrcpsh'.
- 0xA7380E56, // Small 'vrcpss'.
- 0x20A77573, // Large 'vreduce|pd'.
- 0x20A27573, // Large 'vreduce|ph'.
- 0x207D7573, // Large 'vreduce|ps'.
- 0x21447573, // Large 'vreduce|sd'.
- 0x20D57573, // Large 'vreduce|sh'.
- 0x201C7573, // Large 'vreduce|ss'.
- 0x20A7928C, // Large 'vrndscale|pd'.
- 0x20A2928C, // Large 'vrndscale|ph'.
- 0x207D928C, // Large 'vrndscale|ps'.
- 0x2144928C, // Large 'vrndscale|sd'.
- 0x20D5928C, // Large 'vrndscale|sh'.
- 0x201C928C, // Large 'vrndscale|ss'.
- 0x30ED56D7, // Large 'vroun|dpd'.
- 0x30F156D7, // Large 'vroun|dps'.
- 0x36DC56D7, // Large 'vroun|dsd'.
- 0x101476D7, // Large 'vrounds|s'.
- 0x20A783A7, // Large 'vrsqrt14|pd'.
- 0x207D83A7, // Large 'vrsqrt14|ps'.
- 0x214483A7, // Large 'vrsqrt14|sd'.
- 0x201C83A7, // Large 'vrsqrt14|ss'.
- 0x43AF63A7, // Large 'vrsqrt|28pd'.
- 0x43B363A7, // Large 'vrsqrt|28ps'.
- 0x43B763A7, // Large 'vrsqrt|28sd'.
- 0x43BB63A7, // Large 'vrsqrt|28ss'.
- 0x20A263A7, // Large 'vrsqrt|ph'.
- 0x207D63A7, // Large 'vrsqrt|ps'.
- 0x20D563A7, // Large 'vrsqrt|sh'.
- 0x201C63A7, // Large 'vrsqrt|ss'.
- 0x20A7757A, // Large 'vscalef|pd'.
- 0x20A2757A, // Large 'vscalef|ph'.
- 0x207D757A, // Large 'vscalef|ps'.
- 0x2144757A, // Large 'vscalef|sd'.
- 0x20D5757A, // Large 'vscalef|sh'.
- 0x201C757A, // Large 'vscalef|ss'.
- 0x30ED80DA, // Large 'vscatter|dpd'.
- 0x30F180DA, // Large 'vscatter|dps'.
- 0x20A7C0DA, // Large 'vscatterpf0d|pd'.
- 0x207DC0DA, // Large 'vscatterpf0d|ps'.
- 0x30E6B0DA, // Large 'vscatterpf0|qpd'.
- 0x30E9B0DA, // Large 'vscatterpf0|qps'.
- 0x40ECA0DA, // Large 'vscatterpf|1dpd'.
- 0x40F0A0DA, // Large 'vscatterpf|1dps'.
- 0x40F4A0DA, // Large 'vscatterpf|1qpd'.
- 0x40F8A0DA, // Large 'vscatterpf|1qps'.
- 0x30E680DA, // Large 'vscatter|qpd'.
- 0x30E980DA, // Large 'vscatter|qps'.
- 0x42957195, // Large 'vsha512|msg1'.
- 0x42997195, // Large 'vsha512|msg2'.
- 0x207EA195, // Large 'vsha512rnd|s2'.
- 0x502B53BF, // Large 'vshuf|f32x4'.
- 0x403063C4, // Large 'vshuff|64x2'.
- 0x503D53BF, // Large 'vshuf|i32x4'.
- 0x504753BF, // Large 'vshuf|i64x2'.
- 0x20A753BF, // Large 'vshuf|pd'.
- 0x207D53BF, // Large 'vshuf|ps'.
- 0x42954581, // Large 'vsm3|msg1'.
- 0x42994581, // Large 'vsm3|msg2'.
- 0x207E7581, // Large 'vsm3rnd|s2'.
- 0x102F76DF, // Large 'vsm4key|4'.
- 0x102F8588, // Large 'vsm4rnds|4'.
- 0x31F14821, // Large 'vsqr|tpd'.
- 0x31FC4821, // Large 'vsqr|tph'.
- 0x32054821, // Large 'vsqr|tps'.
- 0x320E4821, // Large 'vsqr|tsd'.
- 0x32174821, // Large 'vsqr|tsh'.
- 0x32204821, // Large 'vsqr|tss'.
- 0x102376E6, // Large 'vstmxcs|r'.
- 0x89015676, // Small 'vsubpd'.
- 0x91015676, // Small 'vsubph'.
- 0xA7015676, // Small 'vsubps'.
- 0x89315676, // Small 'vsubsd'.
- 0x91315676, // Small 'vsubsh'.
- 0xA7315676, // Small 'vsubss'.
- 0x31F14825, // Large 'vtes|tpd'.
- 0x32054825, // Large 'vtes|tps'.
- 0x214466ED, // Large 'vucomi|sd'.
- 0x20D566ED, // Large 'vucomi|sh'.
- 0x201C66ED, // Large 'vucomi|ss'.
- 0x20A77590, // Large 'vunpckh|pd'.
- 0x207D7590, // Large 'vunpckh|ps'.
- 0x35976590, // Large 'vunpck|lpd'.
- 0x359A6590, // Large 'vunpck|lps'.
- 0x89093F16, // Small 'vxorpd'.
- 0xA7093F16, // Small 'vxorps'.
- 0x36F353CA, // Large 'vzero|all'.
- 0x335D73CA, // Large 'vzeroup|per'.
- 0x89672457, // Small 'wbinvd'.
- 0x224766F6, // Large 'wbnoin|vd'.
- 0x343656FC, // Large 'wrfsb|ase'.
- 0x34365701, // Large 'wrgsb|ase'.
- 0x8129B657, // Small 'wrmsr'.
- 0x8049CE57, // Small 'wrssd'.
- 0x8119CE57, // Small 'wrssq'.
- 0x8939D657, // Small 'wrussd'.
- 0xA339D657, // Small 'wrussq'.
- 0xA9278838, // Small 'xabort'.
- 0x80021038, // Small 'xadd'.
- 0x9C939458, // Small 'xbegin'.
- 0x8003A078, // Small 'xchg'.
- 0x800238B8, // Small 'xend'.
- 0xAC2A14F8, // Small 'xgetbv'.
- 0x802A0598, // Small 'xlatb'.
- 0x800049F8, // Small 'xor'.
- 0x804849F8, // Small 'xorpd'.
- 0x813849F8, // Small 'xorps'.
- 0x1015859D, // Large 'xresldtr|k'.
- 0xA4FA4E58, // Small 'xrstor'.
- 0x2030640C, // Large 'xrstor|64'.
- 0x1014640C, // Large 'xrstor|s'.
- 0x35A5640C, // Large 'xrstor|s64'.
- 0x805B0678, // Small 'xsave'.
- 0x203053D1, // Large 'xsave|64'.
- 0x865B0678, // Small 'xsavec'.
- 0x370653D1, // Large 'xsave|c64'.
- 0x000083D1, // Large 'xsaveopt'.
- 0x203083D1, // Large 'xsaveopt|64'.
- 0xA65B0678, // Small 'xsaves'.
- 0x35A553D1, // Large 'xsave|s64'.
- 0xAC2A1678, // Small 'xsetbv'.
- 0x101585A8, // Large 'xsusldtr|k'.
- 0x81499698 // Small 'xtest'.
-};
-// ----------------------------------------------------------------------------
-// ${NameData:End}
-#endif // !ASMJIT_NO_TEXT
-
-// x86::InstDB - InstSignature & OpSignature
-// =========================================
-
-#ifndef ASMJIT_NO_VALIDATION
-// ${InstSignatureTable:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \
- { count, uint8_t(x86 ? uint8_t(InstDB::Mode::kX86) : uint8_t(0)) | \
- (x64 ? uint8_t(InstDB::Mode::kX64) : uint8_t(0)) , \
- implicit, \
- 0, \
- { o0, o1, o2, o3, o4, o5 } \
- }
-const InstDB::InstSignature InstDB::_instSignatureTable[] = {
- ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #0 {r8lo|r8hi|m8|mem, r8lo|r8hi}
- ROW(2, 1, 1, 0, 3 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem|sreg, r16}
- ROW(2, 1, 1, 0, 5 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem|sreg, r32}
- ROW(2, 0, 1, 0, 7 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem|sreg|creg|dreg, r64}
- ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8, i8|u8}
- ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
- ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
- ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64, i32}
- ROW(2, 0, 1, 0, 8 , 17 , 0 , 0 , 0 , 0 ), // {r64, i64|u64|m64|mem|sreg|creg|dreg}
- ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
- ROW(2, 1, 1, 0, 4 , 19 , 0 , 0 , 0 , 0 ), // {r16, m16|mem|sreg}
- ROW(2, 1, 1, 0, 6 , 20 , 0 , 0 , 0 , 0 ), // {r32, m32|mem|sreg}
- ROW(2, 1, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg}
- ROW(2, 1, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg}
- ROW(2, 0, 1, 0, 21 , 22 , 0 , 0 , 0 , 0 ), // {m16|mem, sreg}
- ROW(2, 1, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem}
- ROW(2, 1, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem}
- ROW(2, 0, 1, 0, 22 , 21 , 0 , 0 , 0 , 0 ), // {sreg, m16|mem}
- ROW(2, 1, 0, 0, 6 , 23 , 0 , 0 , 0 , 0 ), // {r32, creg|dreg}
- ROW(2, 1, 0, 0, 23 , 6 , 0 , 0 , 0 , 0 ), // {creg|dreg, r32}
- ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #20 {r8lo|r8hi|m8, i8|u8}
- ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
- ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
- ROW(2, 0, 1, 0, 15 , 24 , 0 , 0 , 0 , 0 ), // {r64|m64, i32|i8}
- ROW(2, 1, 1, 0, 25 , 26 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32, i8}
- ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // #25 {r8lo|r8hi|m8|mem, r8lo|r8hi}
- ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
- ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #27 {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // #28 {r64|m64|mem, r64}
- ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
- ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
- ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
- ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
- ROW(2, 1, 1, 0, 32 , 10 , 0 , 0 , 0 , 0 ), // #33 {r8lo|r8hi|m8|r16|m16|r32|m32, i8|u8}
- ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
- ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
- ROW(2, 0, 1, 0, 8 , 33 , 0 , 0 , 0 , 0 ), // {r64, u32|i32|i8|u8|r64|m64|mem}
- ROW(2, 0, 1, 0, 34 , 35 , 0 , 0 , 0 , 0 ), // {m64, i32|i8|u8}
- ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi}
- ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
- ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 31 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64}
- ROW(2, 1, 1, 0, 2 , 18 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi, m8|mem}
- ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // {r16, m16|mem}
- ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
- ROW(2, 1, 1, 1, 36 , 1 , 0 , 0 , 0 , 0 ), // #45 {<ax>, r8lo|r8hi|m8|mem}
- ROW(3, 1, 1, 2, 37 , 36 , 27 , 0 , 0 , 0 ), // {<dx>, <ax>, r16|m16|mem}
- ROW(3, 1, 1, 2, 38 , 39 , 28 , 0 , 0 , 0 ), // {<edx>, <eax>, r32|m32|mem}
- ROW(3, 0, 1, 2, 40 , 41 , 29 , 0 , 0 , 0 ), // {<rdx>, <rax>, r64|m64|mem}
- ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #49 {r16, r16|m16|mem}
- ROW(2, 1, 1, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #50 {r32, r32|m32|mem}
- ROW(2, 0, 1, 0, 8 , 29 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem}
- ROW(3, 1, 1, 0, 4 , 27 , 42 , 0 , 0 , 0 ), // {r16, r16|m16|mem, i8|i16|u16}
- ROW(3, 1, 1, 0, 6 , 28 , 43 , 0 , 0 , 0 ), // {r32, r32|m32|mem, i8|i32|u32}
- ROW(3, 0, 1, 0, 8 , 29 , 24 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|i32}
- ROW(2, 0, 1, 0, 8 , 44 , 0 , 0 , 0 , 0 ), // #55 {r64, i64|u64}
- ROW(2, 1, 1, 0, 45 , 18 , 0 , 0 , 0 , 0 ), // {al, m8|mem}
- ROW(2, 1, 1, 0, 46 , 21 , 0 , 0 , 0 , 0 ), // {ax, m16|mem}
- ROW(2, 1, 1, 0, 47 , 30 , 0 , 0 , 0 , 0 ), // {eax, m32|mem}
- ROW(2, 0, 1, 0, 48 , 31 , 0 , 0 , 0 , 0 ), // {rax, m64|mem}
- ROW(2, 1, 1, 0, 18 , 45 , 0 , 0 , 0 , 0 ), // {m8|mem, al}
- ROW(2, 1, 1, 0, 21 , 46 , 0 , 0 , 0 , 0 ), // {m16|mem, ax}
- ROW(2, 1, 1, 0, 30 , 47 , 0 , 0 , 0 , 0 ), // {m32|mem, eax}
- ROW(2, 0, 1, 0, 31 , 48 , 0 , 0 , 0 , 0 ), // {m64|mem, rax}
- ROW(2, 1, 1, 0, 9 , 10 , 0 , 0 , 0 , 0 ), // #64 {r8lo|r8hi|m8, i8|u8}
- ROW(2, 1, 1, 0, 11 , 12 , 0 , 0 , 0 , 0 ), // {r16|m16, i16|u16}
- ROW(2, 1, 1, 0, 13 , 14 , 0 , 0 , 0 , 0 ), // {r32|m32, i32|u32}
- ROW(2, 0, 1, 0, 15 , 16 , 0 , 0 , 0 , 0 ), // {r64|m64, i32}
- ROW(2, 1, 1, 0, 1 , 2 , 0 , 0 , 0 , 0 ), // {r8lo|r8hi|m8|mem, r8lo|r8hi}
- ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
- ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
- ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // #72 {xmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // #73 {m128|mem, xmm}
- ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
- ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // #78 {zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // #80 {m64|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 31 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // #82 {xmm, xmm, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 31 , 0 , 0 , 0 , 0 ), // {xmm, m64|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(2, 1, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // #88 {m32|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(2, 1, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 30 , 0 , 0 , 0 , 0 ), // {xmm, m32|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #96 {xmm, xmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 52 , 52 , 59 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem|i8|u8}
- ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 55 , 55 , 60 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
- ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 4 , 21 , 0 , 0 , 0 , 0 ), // #104 {r16, m16|mem}
- ROW(2, 1, 1, 0, 6 , 30 , 0 , 0 , 0 , 0 ), // {r32, m32|mem}
- ROW(2, 0, 1, 0, 8 , 31 , 0 , 0 , 0 , 0 ), // {r64, m64|mem}
- ROW(2, 1, 1, 0, 21 , 4 , 0 , 0 , 0 , 0 ), // {m16|mem, r16}
- ROW(2, 1, 1, 0, 30 , 6 , 0 , 0 , 0 , 0 ), // #108 {m32|mem, r32}
- ROW(2, 0, 1, 0, 31 , 8 , 0 , 0 , 0 , 0 ), // {m64|mem, r64}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #110 {}
- ROW(1, 1, 1, 0, 25 , 0 , 0 , 0 , 0 , 0 ), // {r16|m16|r32|m32}
- ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
- ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
- ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
- ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // #116 {xmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
- ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
- ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #122 {xmm, xmm, i8|u8|xmm|m128|mem}
- ROW(3, 1, 1, 0, 52 , 52 , 58 , 0 , 0 , 0 ), // {ymm, ymm, i8|u8|xmm|m128|mem}
- ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 55 , 55 , 58 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #128 {xmm, xmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 49 , 51 , 10 , 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 52 , 52 , 58 , 0 , 0 , 0 ), // {ymm, ymm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 52 , 54 , 10 , 0 , 0 , 0 ), // {ymm, m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 55 , 55 , 58 , 0 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 25 , 10 , 0 , 0 , 0 , 0 ), // #134 {r16|m16|r32|m32, i8|u8}
- ROW(2, 0, 1, 0, 15 , 10 , 0 , 0 , 0 , 0 ), // {r64|m64, i8|u8}
- ROW(2, 1, 1, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // {r16|m16|mem, r16}
- ROW(2, 1, 1, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
- ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // #139 {mm, mm|m64|mem}
- ROW(2, 0, 1, 0, 63 , 29 , 0 , 0 , 0 , 0 ), // {mm|xmm, r64|m64|mem}
- ROW(2, 1, 1, 0, 31 , 63 , 0 , 0 , 0 , 0 ), // {m64|mem, mm|xmm}
- ROW(2, 0, 1, 0, 29 , 63 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, mm|xmm}
- ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #143 {xmm, xmm|m64|mem}
- ROW(1, 1, 1, 0, 11 , 0 , 0 , 0 , 0 , 0 ), // #144 {r16|m16}
- ROW(1, 1, 0, 0, 13 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32}
- ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
- ROW(1, 1, 0, 0, 65 , 0 , 0 , 0 , 0 , 0 ), // {ds|es|ss}
- ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
- ROW(1, 1, 1, 0, 67 , 0 , 0 , 0 , 0 , 0 ), // #149 {r16|m16|i8|i16}
- ROW(1, 1, 0, 0, 68 , 0 , 0 , 0 , 0 , 0 ), // {r32|m32|i32|u32}
- ROW(1, 0, 1, 0, 69 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|i32}
- ROW(1, 1, 0, 0, 70 , 0 , 0 , 0 , 0 , 0 ), // {cs|ss|ds|es}
- ROW(1, 1, 1, 0, 66 , 0 , 0 , 0 , 0 , 0 ), // {fs|gs}
- ROW(3, 1, 1, 0, 49 , 71 , 49 , 0 , 0 , 0 ), // #154 {xmm, vm32x, xmm}
- ROW(3, 1, 1, 0, 52 , 72 , 52 , 0 , 0 , 0 ), // {ymm, vm32y, ymm}
- ROW(2, 1, 1, 0, 49 , 71 , 0 , 0 , 0 , 0 ), // {xmm, vm32x}
- ROW(2, 1, 1, 0, 52 , 72 , 0 , 0 , 0 , 0 ), // {ymm, vm32y}
- ROW(2, 1, 1, 0, 55 , 73 , 0 , 0 , 0 , 0 ), // {zmm, vm32z}
- ROW(3, 1, 1, 0, 49 , 74 , 49 , 0 , 0 , 0 ), // #159 {xmm, vm64x, xmm}
- ROW(3, 1, 1, 0, 52 , 75 , 52 , 0 , 0 , 0 ), // {ymm, vm64y, ymm}
- ROW(2, 1, 1, 0, 49 , 74 , 0 , 0 , 0 , 0 ), // {xmm, vm64x}
- ROW(2, 1, 1, 0, 52 , 75 , 0 , 0 , 0 , 0 ), // {ymm, vm64y}
- ROW(2, 1, 1, 0, 55 , 76 , 0 , 0 , 0 , 0 ), // {zmm, vm64z}
- ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // #164 {m128|mem, xmm}
- ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 51 , 49 , 0 , 0 , 0 , 0 ), // {m128|mem, xmm}
- ROW(2, 1, 1, 0, 54 , 52 , 0 , 0 , 0 , 0 ), // {m256|mem, ymm}
- ROW(2, 1, 1, 0, 57 , 55 , 0 , 0 , 0 , 0 ), // {m512|mem, zmm}
- ROW(2, 1, 1, 0, 49 , 51 , 0 , 0 , 0 , 0 ), // #169 {xmm, m128|mem}
- ROW(2, 1, 1, 0, 52 , 54 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem}
- ROW(2, 1, 1, 0, 49 , 51 , 0 , 0 , 0 , 0 ), // {xmm, m128|mem}
- ROW(2, 1, 1, 0, 52 , 54 , 0 , 0 , 0 , 0 ), // {ymm, m256|mem}
- ROW(2, 1, 1, 0, 55 , 57 , 0 , 0 , 0 , 0 ), // {zmm, m512|mem}
- ROW(2, 0, 1, 0, 29 , 49 , 0 , 0 , 0 , 0 ), // #174 {r64|m64|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m64|mem}
- ROW(2, 0, 1, 0, 49 , 29 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
- ROW(2, 1, 1, 0, 77 , 78 , 0 , 0 , 0 , 0 ), // #179 {ds:[memBase|zsi|m8], es:[memBase|zdi|m8]}
- ROW(2, 1, 1, 0, 79 , 80 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m16], es:[memBase|zdi|m16]}
- ROW(2, 1, 1, 0, 81 , 82 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m32], es:[memBase|zdi|m32]}
- ROW(2, 0, 1, 0, 83 , 84 , 0 , 0 , 0 , 0 ), // {ds:[memBase|zsi|m64], es:[memBase|zdi|m64]}
- ROW(3, 1, 1, 1, 1 , 2 , 85 , 0 , 0 , 0 ), // #183 {r8lo|r8hi|m8|mem, r8lo|r8hi, <al>}
- ROW(3, 1, 1, 1, 27 , 4 , 36 , 0 , 0 , 0 ), // {r16|m16|mem, r16, <ax>}
- ROW(3, 1, 1, 1, 28 , 6 , 39 , 0 , 0 , 0 ), // {r32|m32|mem, r32, <eax>}
- ROW(3, 0, 1, 1, 29 , 8 , 41 , 0 , 0 , 0 ), // {r64|m64|mem, r64, <rax>}
- ROW(2, 1, 1, 0, 86 , 87 , 0 , 0 , 0 , 0 ), // #187 {k, k|m64|mem}
- ROW(2, 0, 1, 0, 86 , 8 , 0 , 0 , 0 , 0 ), // {k, r64}
- ROW(2, 1, 1, 0, 31 , 86 , 0 , 0 , 0 , 0 ), // {m64|mem, k}
- ROW(2, 0, 1, 0, 8 , 86 , 0 , 0 , 0 , 0 ), // {r64, k}
- ROW(2, 1, 1, 0, 45 , 88 , 0 , 0 , 0 , 0 ), // #191 {al, ds:[memBase|zsi|m8|mem]}
- ROW(2, 1, 1, 0, 46 , 89 , 0 , 0 , 0 , 0 ), // {ax, ds:[memBase|zsi|m16|mem]}
- ROW(2, 1, 1, 0, 47 , 90 , 0 , 0 , 0 , 0 ), // {eax, ds:[memBase|zsi|m32|mem]}
- ROW(2, 0, 1, 0, 48 , 91 , 0 , 0 , 0 , 0 ), // {rax, ds:[memBase|zsi|m64|mem]}
- ROW(2, 1, 1, 0, 78 , 77 , 0 , 0 , 0 , 0 ), // #195 {es:[memBase|zdi|m8], ds:[memBase|zsi|m8]}
- ROW(2, 1, 1, 0, 80 , 79 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m16], ds:[memBase|zsi|m16]}
- ROW(2, 1, 1, 0, 82 , 81 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m32], ds:[memBase|zsi|m32]}
- ROW(2, 0, 1, 0, 84 , 83 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m64], ds:[memBase|zsi|m64]}
- ROW(2, 1, 1, 0, 45 , 92 , 0 , 0 , 0 , 0 ), // #199 {al, es:[memBase|zdi|m8|mem]}
- ROW(2, 1, 1, 0, 46 , 93 , 0 , 0 , 0 , 0 ), // {ax, es:[memBase|zdi|m16|mem]}
- ROW(2, 1, 1, 0, 47 , 94 , 0 , 0 , 0 , 0 ), // {eax, es:[memBase|zdi|m32|mem]}
- ROW(2, 0, 1, 0, 48 , 95 , 0 , 0 , 0 , 0 ), // {rax, es:[memBase|zdi|m64|mem]}
- ROW(2, 1, 1, 0, 92 , 45 , 0 , 0 , 0 , 0 ), // #203 {es:[memBase|zdi|m8|mem], al}
- ROW(2, 1, 1, 0, 93 , 46 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m16|mem], ax}
- ROW(2, 1, 1, 0, 94 , 47 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m32|mem], eax}
- ROW(2, 0, 1, 0, 95 , 48 , 0 , 0 , 0 , 0 ), // {es:[memBase|zdi|m64|mem], rax}
- ROW(4, 1, 1, 0, 49 , 49 , 49 , 50 , 0 , 0 ), // #207 {xmm, xmm, xmm, xmm|m128|mem}
- ROW(4, 1, 1, 0, 49 , 49 , 51 , 49 , 0 , 0 ), // {xmm, xmm, m128|mem, xmm}
- ROW(4, 1, 1, 0, 52 , 52 , 52 , 53 , 0 , 0 ), // {ymm, ymm, ymm, ymm|m256|mem}
- ROW(4, 1, 1, 0, 52 , 52 , 54 , 52 , 0 , 0 ), // {ymm, ymm, m256|mem, ymm}
- ROW(3, 1, 1, 0, 49 , 71 , 49 , 0 , 0 , 0 ), // #211 {xmm, vm32x, xmm}
- ROW(3, 1, 1, 0, 52 , 71 , 52 , 0 , 0 , 0 ), // {ymm, vm32x, ymm}
- ROW(2, 1, 1, 0, 96 , 71 , 0 , 0 , 0 , 0 ), // {xmm|ymm, vm32x}
- ROW(2, 1, 1, 0, 55 , 72 , 0 , 0 , 0 , 0 ), // {zmm, vm32y}
- ROW(3, 1, 1, 0, 51 , 49 , 49 , 0 , 0 , 0 ), // #215 {m128|mem, xmm, xmm}
- ROW(3, 1, 1, 0, 54 , 52 , 52 , 0 , 0 , 0 ), // {m256|mem, ymm, ymm}
- ROW(3, 1, 1, 0, 49 , 49 , 51 , 0 , 0 , 0 ), // {xmm, xmm, m128|mem}
- ROW(3, 1, 1, 0, 52 , 52 , 54 , 0 , 0 , 0 ), // {ymm, ymm, m256|mem}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // #219 {m64|mem, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 31 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 31 , 0 , 0 , 0 ), // {xmm, xmm, m64|mem}
- ROW(2, 1, 1, 0, 21 , 49 , 0 , 0 , 0 , 0 ), // #223 {m16|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 21 , 0 , 0 , 0 , 0 ), // {xmm, m16|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(3, 1, 1, 0, 49 , 49 , 49 , 0 , 0 , 0 ), // {xmm, xmm, xmm}
- ROW(5, 1, 1, 0, 49 , 49 , 50 , 49 , 97 , 0 ), // #227 {xmm, xmm, xmm|m128|mem, xmm, i4|u4}
- ROW(5, 1, 1, 0, 49 , 49 , 49 , 51 , 97 , 0 ), // {xmm, xmm, xmm, m128|mem, i4|u4}
- ROW(5, 1, 1, 0, 52 , 52 , 53 , 52 , 97 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm, i4|u4}
- ROW(5, 1, 1, 0, 52 , 52 , 52 , 54 , 97 , 0 ), // {ymm, ymm, ymm, m256|mem, i4|u4}
- ROW(3, 1, 1, 0, 52 , 53 , 10 , 0 , 0 , 0 ), // #231 {ymm, ymm|m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 52 , 52 , 53 , 0 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 55 , 55 , 60 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem|i8|u8}
- ROW(3, 1, 1, 0, 55 , 57 , 10 , 0 , 0 , 0 ), // {zmm, m512|mem, i8|u8}
- ROW(1, 1, 0, 0, 98 , 0 , 0 , 0 , 0 , 0 ), // #235 {rel16|r16|m16|mem|r32|m32}
- ROW(1, 1, 1, 0, 99 , 0 , 0 , 0 , 0 , 0 ), // #236 {rel32}
- ROW(1, 0, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|mem}
- ROW(1, 1, 0, 0, 100, 0 , 0 , 0 , 0 , 0 ), // #238 {r16|r32}
- ROW(1, 1, 1, 0, 32 , 0 , 0 , 0 , 0 , 0 ), // #239 {r8lo|r8hi|m8|r16|m16|r32|m32}
- ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
- ROW(1, 1, 1, 0, 101, 0 , 0 , 0 , 0 , 0 ), // #241 {m32|m64}
- ROW(2, 1, 1, 0, 102, 103, 0 , 0 , 0 , 0 ), // {st0, st}
- ROW(2, 1, 1, 0, 103, 102, 0 , 0 , 0 , 0 ), // {st, st0}
- ROW(1, 1, 1, 0, 104, 0 , 0 , 0 , 0 , 0 ), // #244 {rel8|rel32}
- ROW(1, 1, 0, 0, 105, 0 , 0 , 0 , 0 , 0 ), // {rel16|r32|m32}
- ROW(1, 0, 1, 0, 15 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64}
- ROW(2, 1, 0, 0, 106, 107, 0 , 0 , 0 , 0 ), // #247 {i16, i16|i32}
- ROW(1, 1, 1, 0, 108, 0 , 0 , 0 , 0 , 0 ), // {m32|mem|m48}
- ROW(1, 0, 1, 0, 109, 0 , 0 , 0 , 0 , 0 ), // {m80|mem}
- ROW(2, 1, 1, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #250 {r16, m32|mem}
- ROW(2, 1, 1, 0, 6 , 110, 0 , 0 , 0 , 0 ), // {r32, m48|mem}
- ROW(2, 0, 1, 0, 8 , 109, 0 , 0 , 0 , 0 ), // {r64, m80|mem}
- ROW(2, 1, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #253 {r16, r16|m16|mem}
- ROW(2, 1, 1, 0, 6 , 111, 0 , 0 , 0 , 0 ), // {r32, r32|m16|mem}
- ROW(2, 0, 1, 0, 8 , 111, 0 , 0 , 0 , 0 ), // {r64, r32|m16|mem}
- ROW(2, 1, 1, 0, 4 , 9 , 0 , 0 , 0 , 0 ), // #256 {r16, r8lo|r8hi|m8}
- ROW(2, 1, 1, 0, 6 , 112, 0 , 0 , 0 , 0 ), // {r32, r8lo|r8hi|m8|r16|m16}
- ROW(2, 0, 1, 0, 8 , 113, 0 , 0 , 0 , 0 ), // {r64, r8lo|m8|r16|m16}
- ROW(3, 1, 1, 0, 27 , 4 , 114, 0 , 0 , 0 ), // #259 {r16|m16|mem, r16, cl|i8|u8}
- ROW(3, 1, 1, 0, 28 , 6 , 114, 0 , 0 , 0 ), // {r32|m32|mem, r32, cl|i8|u8}
- ROW(3, 0, 1, 0, 29 , 8 , 114, 0 , 0 , 0 ), // {r64|m64|mem, r64, cl|i8|u8}
- ROW(3, 1, 1, 0, 49 , 49 , 50 , 0 , 0 , 0 ), // #262 {xmm, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 52 , 52 , 53 , 0 , 0 , 0 ), // #263 {ymm, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 55 , 55 , 56 , 0 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem}
- ROW(4, 1, 1, 0, 49 , 49 , 50 , 10 , 0 , 0 ), // #265 {xmm, xmm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 52 , 52 , 53 , 10 , 0 , 0 ), // #266 {ymm, ymm, ymm|m256|mem, i8|u8}
- ROW(4, 1, 1, 0, 55 , 55 , 56 , 10 , 0 , 0 ), // {zmm, zmm, zmm|m512|mem, i8|u8}
- ROW(4, 1, 1, 0, 115, 49 , 50 , 10 , 0 , 0 ), // #268 {xmm|k, xmm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 116, 52 , 53 , 10 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem, i8|u8}
- ROW(4, 1, 1, 0, 86 , 55 , 56 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
- ROW(4, 1, 1, 0, 86 , 49 , 50 , 10 , 0 , 0 ), // #271 {k, xmm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 86 , 52 , 53 , 10 , 0 , 0 ), // {k, ymm, ymm|m256|mem, i8|u8}
- ROW(4, 1, 1, 0, 86 , 55 , 56 , 10 , 0 , 0 ), // {k, zmm, zmm|m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 50 , 49 , 0 , 0 , 0 , 0 ), // #274 {xmm|m128|mem, xmm}
- ROW(2, 1, 1, 0, 53 , 52 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, ymm}
- ROW(2, 1, 1, 0, 56 , 55 , 0 , 0 , 0 , 0 ), // {zmm|m512|mem, zmm}
- ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #277 {xmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 52 , 50 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 55 , 53 , 0 , 0 , 0 , 0 ), // {zmm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // #280 {xmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 49 , 117, 0 , 0 , 0 , 0 ), // #283 {xmm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 52 , 64 , 0 , 0 , 0 , 0 ), // {ymm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 55 , 50 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 64 , 49 , 10 , 0 , 0 , 0 ), // #286 {xmm|m64|mem, xmm, i8|u8}
- ROW(3, 1, 1, 0, 50 , 52 , 10 , 0 , 0 , 0 ), // #287 {xmm|m128|mem, ymm, i8|u8}
- ROW(3, 1, 1, 0, 53 , 55 , 10 , 0 , 0 , 0 ), // #288 {ymm|m256|mem, zmm, i8|u8}
- ROW(3, 1, 1, 0, 49 , 118, 49 , 0 , 0 , 0 ), // #289 {xmm, vm64x|vm64y, xmm}
- ROW(2, 1, 1, 0, 49 , 118, 0 , 0 , 0 , 0 ), // {xmm, vm64x|vm64y}
- ROW(2, 1, 1, 0, 52 , 76 , 0 , 0 , 0 , 0 ), // {ymm, vm64z}
- ROW(3, 1, 1, 0, 49 , 50 , 10 , 0 , 0 , 0 ), // #292 {xmm, xmm|m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 52 , 53 , 10 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem, i8|u8}
- ROW(3, 1, 1, 0, 55 , 56 , 10 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem, i8|u8}
- ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #295 {xmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 52 , 53 , 0 , 0 , 0 , 0 ), // {ymm, ymm|m256|mem}
- ROW(2, 1, 1, 0, 55 , 56 , 0 , 0 , 0 , 0 ), // {zmm, zmm|m512|mem}
- ROW(4, 1, 1, 0, 86 , 86 , 49 , 50 , 0 , 0 ), // #298 {k, k, xmm, xmm|m128|mem}
- ROW(4, 1, 1, 0, 86 , 86 , 52 , 53 , 0 , 0 ), // {k, k, ymm, ymm|m256|mem}
- ROW(4, 1, 1, 0, 86 , 86 , 55 , 56 , 0 , 0 ), // {k, k, zmm, zmm|m512|mem}
- ROW(3, 1, 1, 0, 115, 49 , 50 , 0 , 0 , 0 ), // #301 {xmm|k, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 116, 52 , 53 , 0 , 0 , 0 ), // {ymm|k, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 86 , 55 , 56 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 117, 49 , 0 , 0 , 0 , 0 ), // #304 {xmm|m32|mem, xmm}
- ROW(2, 1, 1, 0, 64 , 52 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, ymm}
- ROW(2, 1, 1, 0, 50 , 55 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, zmm}
- ROW(2, 1, 1, 0, 64 , 49 , 0 , 0 , 0 , 0 ), // #307 {xmm|m64|mem, xmm}
- ROW(2, 1, 1, 0, 50 , 52 , 0 , 0 , 0 , 0 ), // {xmm|m128|mem, ymm}
- ROW(2, 1, 1, 0, 53 , 55 , 0 , 0 , 0 , 0 ), // {ymm|m256|mem, zmm}
- ROW(2, 1, 1, 0, 119, 49 , 0 , 0 , 0 , 0 ), // #310 {xmm|m16|mem, xmm}
- ROW(2, 1, 1, 0, 117, 52 , 0 , 0 , 0 , 0 ), // {xmm|m32|mem, ymm}
- ROW(2, 1, 1, 0, 64 , 55 , 0 , 0 , 0 , 0 ), // {xmm|m64|mem, zmm}
- ROW(2, 1, 1, 0, 49 , 119, 0 , 0 , 0 , 0 ), // #313 {xmm, xmm|m16|mem}
- ROW(2, 1, 1, 0, 52 , 117, 0 , 0 , 0 , 0 ), // {ymm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 55 , 64 , 0 , 0 , 0 , 0 ), // {zmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 71 , 49 , 0 , 0 , 0 , 0 ), // #316 {vm32x, xmm}
- ROW(2, 1, 1, 0, 72 , 52 , 0 , 0 , 0 , 0 ), // {vm32y, ymm}
- ROW(2, 1, 1, 0, 73 , 55 , 0 , 0 , 0 , 0 ), // {vm32z, zmm}
- ROW(2, 1, 1, 0, 74 , 49 , 0 , 0 , 0 , 0 ), // #319 {vm64x, xmm}
- ROW(2, 1, 1, 0, 75 , 52 , 0 , 0 , 0 , 0 ), // {vm64y, ymm}
- ROW(2, 1, 1, 0, 76 , 55 , 0 , 0 , 0 , 0 ), // {vm64z, zmm}
- ROW(3, 1, 1, 0, 86 , 49 , 50 , 0 , 0 , 0 ), // #322 {k, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 86 , 52 , 53 , 0 , 0 , 0 ), // {k, ymm, ymm|m256|mem}
- ROW(3, 1, 1, 0, 86 , 55 , 56 , 0 , 0 , 0 ), // {k, zmm, zmm|m512|mem}
- ROW(3, 1, 1, 0, 6 , 6 , 28 , 0 , 0 , 0 ), // #325 {r32, r32, r32|m32|mem}
- ROW(3, 0, 1, 0, 8 , 8 , 29 , 0 , 0 , 0 ), // {r64, r64, r64|m64|mem}
- ROW(3, 1, 1, 0, 6 , 28 , 6 , 0 , 0 , 0 ), // #327 {r32, r32|m32|mem, r32}
- ROW(3, 0, 1, 0, 8 , 29 , 8 , 0 , 0 , 0 ), // {r64, r64|m64|mem, r64}
- ROW(2, 1, 0, 0, 120, 28 , 0 , 0 , 0 , 0 ), // #329 {bnd, r32|m32|mem}
- ROW(2, 0, 1, 0, 120, 29 , 0 , 0 , 0 , 0 ), // {bnd, r64|m64|mem}
- ROW(2, 1, 1, 0, 120, 121, 0 , 0 , 0 , 0 ), // #331 {bnd, bnd|mem}
- ROW(2, 1, 1, 0, 122, 120, 0 , 0 , 0 , 0 ), // {mem, bnd}
- ROW(2, 1, 0, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #333 {r16, m32|mem}
- ROW(2, 1, 0, 0, 6 , 31 , 0 , 0 , 0 , 0 ), // {r32, m64|mem}
- ROW(1, 1, 1, 0, 100, 0 , 0 , 0 , 0 , 0 ), // #335 {r16|r32}
- ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // #336 {r64}
- ROW(3, 1, 1, 0, 30 , 6 , 6 , 0 , 0 , 0 ), // #337 {m32|mem, r32, r32}
- ROW(3, 0, 1, 0, 31 , 8 , 8 , 0 , 0 , 0 ), // {m64|mem, r64, r64}
- ROW(2, 1, 1, 0, 6 , 32 , 0 , 0 , 0 , 0 ), // #339 {r32, r8lo|r8hi|m8|r16|m16|r32|m32}
- ROW(2, 0, 1, 0, 8 , 123, 0 , 0 , 0 , 0 ), // {r64, r8lo|m8|r64|m64}
- ROW(2, 1, 1, 0, 6 , 64 , 0 , 0 , 0 , 0 ), // #341 {r32, xmm|m64|mem}
- ROW(2, 0, 1, 0, 8 , 64 , 0 , 0 , 0 , 0 ), // {r64, xmm|m64|mem}
- ROW(2, 1, 1, 0, 49 , 28 , 0 , 0 , 0 , 0 ), // #343 {xmm, r32|m32|mem}
- ROW(2, 0, 1, 0, 49 , 29 , 0 , 0 , 0 , 0 ), // {xmm, r64|m64|mem}
- ROW(2, 0, 1, 0, 49 , 29 , 0 , 0 , 0 , 0 ), // #345 {xmm, r64|m64|mem}
- ROW(2, 1, 1, 0, 49 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem}
- ROW(2, 1, 1, 0, 6 , 117, 0 , 0 , 0 , 0 ), // #347 {r32, xmm|m32|mem}
- ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // {r64, xmm|m32|mem}
- ROW(2, 0, 1, 0, 8 , 117, 0 , 0 , 0 , 0 ), // #349 {r64, xmm|m32|mem}
- ROW(2, 1, 1, 0, 6 , 117, 0 , 0 , 0 , 0 ), // {r32, xmm|m32|mem}
- ROW(2, 1, 0, 0, 124, 57 , 0 , 0 , 0 , 0 ), // #351 {es:[mem|m512|memBase], m512|mem}
- ROW(2, 0, 1, 0, 124, 57 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem}
- ROW(3, 1, 1, 0, 49 , 10 , 10 , 0 , 0 , 0 ), // #353 {xmm, i8|u8, i8|u8}
- ROW(2, 1, 1, 0, 49 , 49 , 0 , 0 , 0 , 0 ), // #354 {xmm, xmm}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #355 {}
- ROW(1, 1, 1, 0, 103, 0 , 0 , 0 , 0 , 0 ), // #356 {st}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #357 {}
- ROW(1, 1, 1, 0, 125, 0 , 0 , 0 , 0 , 0 ), // #358 {m32|m64|st}
- ROW(2, 1, 1, 0, 49 , 49 , 0 , 0 , 0 , 0 ), // #359 {xmm, xmm}
- ROW(4, 1, 1, 0, 49 , 49 , 10 , 10 , 0 , 0 ), // {xmm, xmm, i8|u8, i8|u8}
- ROW(2, 1, 0, 0, 6 , 51 , 0 , 0 , 0 , 0 ), // #361 {r32, m128|mem}
- ROW(2, 0, 1, 0, 8 , 51 , 0 , 0 , 0 , 0 ), // {r64, m128|mem}
- ROW(2, 1, 0, 2, 39 , 126, 0 , 0 , 0 , 0 ), // #363 {<eax>, <ecx>}
- ROW(2, 0, 1, 2, 127, 126, 0 , 0 , 0 , 0 ), // {<eax|rax>, <ecx>}
- ROW(3, 1, 0, 3, 39 , 38 , 126, 0 , 0 , 0 ), // #365 {<eax>, <edx>, <ecx>}
- ROW(3, 0, 1, 3, 127, 38 , 126, 0 , 0 , 0 ), // {<eax|rax>, <edx>, <ecx>}
- ROW(2, 1, 0, 1, 128, 129, 0 , 0 , 0 , 0 ), // #367 {<cx|ecx>, rel8}
- ROW(2, 0, 1, 1, 130, 129, 0 , 0 , 0 , 0 ), // {<ecx|rcx>, rel8}
- ROW(2, 1, 1, 0, 86 , 131, 0 , 0 , 0 , 0 ), // #369 {k, k|m8|mem|r32}
- ROW(2, 1, 1, 0, 132, 86 , 0 , 0 , 0 , 0 ), // {m8|mem|r32, k}
- ROW(2, 1, 1, 0, 86 , 133, 0 , 0 , 0 , 0 ), // #371 {k, k|m32|mem|r32}
- ROW(2, 1, 1, 0, 28 , 86 , 0 , 0 , 0 , 0 ), // {m32|mem|r32, k}
- ROW(2, 1, 1, 0, 86 , 134, 0 , 0 , 0 , 0 ), // #373 {k, k|m16|mem|r32}
- ROW(2, 1, 1, 0, 111, 86 , 0 , 0 , 0 , 0 ), // {m16|mem|r32, k}
- ROW(2, 1, 0, 0, 4 , 30 , 0 , 0 , 0 , 0 ), // #375 {r16, m32|mem}
- ROW(2, 1, 0, 0, 6 , 110, 0 , 0 , 0 , 0 ), // {r32, m48|mem}
- ROW(2, 1, 1, 0, 100, 135, 0 , 0 , 0 , 0 ), // #377 {r16|r32, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
- ROW(2, 0, 1, 0, 8 , 135, 0 , 0 , 0 , 0 ), // {r64, mem|m8|m16|m32|m48|m64|m80|m128|m256|m512|m1024}
- ROW(1, 1, 1, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #379 {r32}
- ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64}
- ROW(3, 1, 1, 0, 6 , 28 , 14 , 0 , 0 , 0 ), // #381 {r32, r32|m32|mem, i32|u32}
- ROW(3, 0, 1, 0, 8 , 28 , 14 , 0 , 0 , 0 ), // {r64, r32|m32|mem, i32|u32}
- ROW(2, 1, 1, 0, 63 , 28 , 0 , 0 , 0 , 0 ), // #383 {mm|xmm, r32|m32|mem}
- ROW(2, 1, 1, 0, 28 , 63 , 0 , 0 , 0 , 0 ), // {r32|m32|mem, mm|xmm}
- ROW(2, 1, 1, 0, 124, 57 , 0 , 0 , 0 , 0 ), // #385 {es:[mem|m512|memBase], m512|mem}
- ROW(2, 1, 1, 0, 124, 57 , 0 , 0 , 0 , 0 ), // {es:[mem|m512|memBase], m512|mem}
- ROW(2, 1, 1, 0, 49 , 64 , 0 , 0 , 0 , 0 ), // #387 {xmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 31 , 49 , 0 , 0 , 0 , 0 ), // {m64|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 117, 0 , 0 , 0 , 0 ), // #389 {xmm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 30 , 49 , 0 , 0 , 0 , 0 ), // {m32|mem, xmm}
- ROW(2, 0, 1, 0, 4 , 27 , 0 , 0 , 0 , 0 ), // #391 {r16, r16|m16|mem}
- ROW(2, 0, 1, 0, 136, 28 , 0 , 0 , 0 , 0 ), // {r32|r64, r32|m32|mem}
- ROW(4, 1, 1, 1, 6 , 6 , 28 , 38 , 0 , 0 ), // #393 {r32, r32, r32|m32|mem, <edx>}
- ROW(4, 0, 1, 1, 8 , 8 , 29 , 40 , 0 , 0 ), // {r64, r64, r64|m64|mem, <rdx>}
- ROW(2, 1, 1, 0, 61 , 62 , 0 , 0 , 0 , 0 ), // #395 {mm, mm|m64|mem}
- ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 61 , 62 , 10 , 0 , 0 , 0 ), // #397 {mm, mm|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 49 , 50 , 10 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem, i8|u8}
- ROW(3, 1, 1, 0, 6 , 63 , 10 , 0 , 0 , 0 ), // #399 {r32, mm|xmm, i8|u8}
- ROW(3, 1, 1, 0, 21 , 49 , 10 , 0 , 0 , 0 ), // {m16|mem, xmm, i8|u8}
- ROW(2, 1, 1, 0, 61 , 137, 0 , 0 , 0 , 0 ), // #401 {mm, i8|u8|mm|m64|mem}
- ROW(2, 1, 1, 0, 49 , 58 , 0 , 0 , 0 , 0 ), // {xmm, i8|u8|xmm|m128|mem}
- ROW(1, 1, 1, 0, 28 , 0 , 0 , 0 , 0 , 0 ), // #403 {r32|m32|mem}
- ROW(1, 0, 1, 0, 29 , 0 , 0 , 0 , 0 , 0 ), // {r64|m64|mem}
- ROW(2, 1, 1, 0, 61 , 138, 0 , 0 , 0 , 0 ), // #405 {mm, mm|m32|mem}
- ROW(2, 1, 1, 0, 49 , 50 , 0 , 0 , 0 , 0 ), // {xmm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 32 , 114, 0 , 0 , 0 , 0 ), // #407 {r8lo|r8hi|m8|r16|m16|r32|m32, cl|i8|u8}
- ROW(2, 0, 1, 0, 15 , 114, 0 , 0 , 0 , 0 ), // {r64|m64, cl|i8|u8}
- ROW(1, 1, 0, 0, 6 , 0 , 0 , 0 , 0 , 0 ), // #409 {r32}
- ROW(1, 0, 1, 0, 8 , 0 , 0 , 0 , 0 , 0 ), // {r64}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #411 {}
- ROW(1, 1, 1, 0, 139, 0 , 0 , 0 , 0 , 0 ), // {u16}
- ROW(3, 1, 1, 0, 6 , 28 , 10 , 0 , 0 , 0 ), // #413 {r32, r32|m32|mem, i8|u8}
- ROW(3, 0, 1, 0, 8 , 29 , 10 , 0 , 0 , 0 ), // {r64, r64|m64|mem, i8|u8}
- ROW(1, 1, 1, 0, 140, 0 , 0 , 0 , 0 , 0 ), // #415 {r16|m16|mem|r32}
- ROW(1, 0, 1, 0, 141, 0 , 0 , 0 , 0 , 0 ), // {r64|m16|mem}
- ROW(1, 1, 0, 0, 142, 0 , 0 , 0 , 0 , 0 ), // #417 {ds:[mem|memBase]}
- ROW(1, 0, 1, 0, 142, 0 , 0 , 0 , 0 , 0 ), // {ds:[mem|memBase]}
- ROW(4, 1, 1, 0, 49 , 49 , 50 , 49 , 0 , 0 ), // #419 {xmm, xmm, xmm|m128|mem, xmm}
- ROW(4, 1, 1, 0, 52 , 52 , 53 , 52 , 0 , 0 ), // {ymm, ymm, ymm|m256|mem, ymm}
- ROW(2, 1, 1, 0, 49 , 143, 0 , 0 , 0 , 0 ), // #421 {xmm, xmm|m128|ymm|m256}
- ROW(2, 1, 1, 0, 52 , 56 , 0 , 0 , 0 , 0 ), // {ymm, zmm|m512|mem}
- ROW(2, 1, 1, 0, 6 , 119, 0 , 0 , 0 , 0 ), // #423 {r32, xmm|m16|mem}
- ROW(2, 0, 1, 0, 8 , 119, 0 , 0 , 0 , 0 ), // {r64, xmm|m16|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 28 , 0 , 0 , 0 ), // #425 {xmm, xmm, r32|m32|mem}
- ROW(3, 0, 1, 0, 49 , 49 , 29 , 0 , 0 , 0 ), // {xmm, xmm, r64|m64|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 13 , 0 , 0 , 0 ), // #427 {xmm, xmm, r32|m32}
- ROW(3, 0, 1, 0, 49 , 49 , 15 , 0 , 0 , 0 ), // {xmm, xmm, r64|m64}
- ROW(4, 1, 1, 0, 49 , 49 , 49 , 64 , 0 , 0 ), // #429 {xmm, xmm, xmm, xmm|m64|mem}
- ROW(4, 1, 1, 0, 49 , 49 , 31 , 49 , 0 , 0 ), // {xmm, xmm, m64|mem, xmm}
- ROW(4, 1, 1, 0, 49 , 49 , 49 , 117, 0 , 0 ), // #431 {xmm, xmm, xmm, xmm|m32|mem}
- ROW(4, 1, 1, 0, 49 , 49 , 30 , 49 , 0 , 0 ), // {xmm, xmm, m32|mem, xmm}
- ROW(4, 1, 1, 0, 52 , 52 , 50 , 10 , 0 , 0 ), // #433 {ymm, ymm, xmm|m128|mem, i8|u8}
- ROW(4, 1, 1, 0, 55 , 55 , 50 , 10 , 0 , 0 ), // {zmm, zmm, xmm|m128|mem, i8|u8}
- ROW(1, 1, 0, 1, 39 , 0 , 0 , 0 , 0 , 0 ), // #435 {<eax>}
- ROW(1, 0, 1, 1, 41 , 0 , 0 , 0 , 0 , 0 ), // #436 {<rax>}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #437 {}
- ROW(0, 1, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // {}
- ROW(2, 1, 1, 0, 28 , 49 , 0 , 0 , 0 , 0 ), // #439 {r32|m32|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 28 , 0 , 0 , 0 , 0 ), // {xmm, r32|m32|mem}
- ROW(2, 1, 1, 0, 111, 49 , 0 , 0 , 0 , 0 ), // #441 {r32|m16|mem, xmm}
- ROW(2, 1, 1, 0, 49 , 111, 0 , 0 , 0 , 0 ), // {xmm, r32|m16|mem}
- ROW(2, 1, 0, 0, 28 , 6 , 0 , 0 , 0 , 0 ), // #443 {r32|m32|mem, r32}
- ROW(2, 0, 1, 0, 29 , 8 , 0 , 0 , 0 , 0 ), // {r64|m64|mem, r64}
- ROW(2, 1, 0, 0, 6 , 28 , 0 , 0 , 0 , 0 ), // #445 {r32, r32|m32|mem}
- ROW(2, 0, 1, 0, 8 , 29 , 0 , 0 , 0 , 0 ), // {r64, r64|m64|mem}
- ROW(2, 1, 1, 0, 144, 64 , 0 , 0 , 0 , 0 ), // #447 {xmm|ymm|zmm, xmm|m64|mem}
- ROW(2, 0, 1, 0, 144, 8 , 0 , 0 , 0 , 0 ), // {xmm|ymm|zmm, r64}
- ROW(3, 1, 1, 0, 49 , 49 , 58 , 0 , 0 , 0 ), // #449 {xmm, xmm, xmm|m128|mem|i8|u8}
- ROW(3, 1, 1, 0, 49 , 51 , 145, 0 , 0 , 0 ), // {xmm, m128|mem, i8|u8|xmm}
- ROW(2, 1, 1, 0, 71 , 96 , 0 , 0 , 0 , 0 ), // #451 {vm32x, xmm|ymm}
- ROW(2, 1, 1, 0, 72 , 55 , 0 , 0 , 0 , 0 ), // {vm32y, zmm}
- ROW(2, 1, 1, 0, 118, 49 , 0 , 0 , 0 , 0 ), // #453 {vm64x|vm64y, xmm}
- ROW(2, 1, 1, 0, 76 , 52 , 0 , 0 , 0 , 0 ), // {vm64z, ymm}
- ROW(3, 1, 1, 0, 49 , 49 , 50 , 0 , 0 , 0 ), // #455 {xmm, xmm, xmm|m128|mem}
- ROW(3, 1, 1, 0, 49 , 51 , 49 , 0 , 0 , 0 ), // {xmm, m128|mem, xmm}
- ROW(1, 1, 0, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #457 {<ax>}
- ROW(2, 1, 0, 1, 36 , 10 , 0 , 0 , 0 , 0 ), // #458 {<ax>, i8|u8}
- ROW(2, 1, 0, 0, 27 , 4 , 0 , 0 , 0 , 0 ), // #459 {r16|m16|mem, r16}
- ROW(3, 1, 1, 1, 49 , 50 , 146, 0 , 0 , 0 ), // #460 {xmm, xmm|m128|mem, <xmm0>}
- ROW(2, 1, 1, 0, 120, 147, 0 , 0 , 0 , 0 ), // #461 {bnd, mib}
- ROW(2, 1, 1, 0, 120, 122, 0 , 0 , 0 , 0 ), // #462 {bnd, mem}
- ROW(2, 1, 1, 0, 147, 120, 0 , 0 , 0 , 0 ), // #463 {mib, bnd}
- ROW(1, 1, 1, 1, 36 , 0 , 0 , 0 , 0 , 0 ), // #464 {<ax>}
- ROW(2, 1, 1, 2, 38 , 39 , 0 , 0 , 0 , 0 ), // #465 {<edx>, <eax>}
- ROW(1, 1, 1, 0, 122, 0 , 0 , 0 , 0 , 0 ), // #466 {mem}
- ROW(1, 1, 1, 0, 31 , 0 , 0 , 0 , 0 , 0 ), // #467 {m64|mem}
- ROW(0, 0, 1, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #468 {}
- ROW(1, 1, 1, 1, 148, 0 , 0 , 0 , 0 , 0 ), // #469 {<ds:[mem|m512|memBase|zax]>}
- ROW(3, 1, 1, 0, 49 , 64 , 10 , 0 , 0 , 0 ), // #470 {xmm, xmm|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 49 , 117, 10 , 0 , 0 , 0 ), // #471 {xmm, xmm|m32|mem, i8|u8}
- ROW(5, 0, 1, 4, 51 , 40 , 41 , 149, 150, 0 ), // #472 {m128|mem, <rdx>, <rax>, <rcx>, <rbx>}
- ROW(5, 1, 1, 4, 31 , 38 , 39 , 126, 151, 0 ), // #473 {m64|mem, <edx>, <eax>, <ecx>, <ebx>}
- ROW(4, 1, 1, 4, 39 , 151, 126, 38 , 0 , 0 ), // #474 {<eax>, <ebx>, <ecx>, <edx>}
- ROW(2, 0, 1, 2, 40 , 41 , 0 , 0 , 0 , 0 ), // #475 {<rdx>, <rax>}
- ROW(2, 1, 1, 0, 61 , 50 , 0 , 0 , 0 , 0 ), // #476 {mm, xmm|m128|mem}
- ROW(2, 1, 1, 0, 49 , 62 , 0 , 0 , 0 , 0 ), // #477 {xmm, mm|m64|mem}
- ROW(2, 1, 1, 0, 61 , 64 , 0 , 0 , 0 , 0 ), // #478 {mm, xmm|m64|mem}
- ROW(2, 1, 1, 2, 37 , 36 , 0 , 0 , 0 , 0 ), // #479 {<dx>, <ax>}
- ROW(1, 1, 1, 1, 39 , 0 , 0 , 0 , 0 , 0 ), // #480 {<eax>}
- ROW(2, 1, 1, 0, 12 , 10 , 0 , 0 , 0 , 0 ), // #481 {i16|u16, i8|u8}
- ROW(3, 1, 1, 0, 28 , 49 , 10 , 0 , 0 , 0 ), // #482 {r32|m32|mem, xmm, i8|u8}
- ROW(1, 1, 1, 0, 109, 0 , 0 , 0 , 0 , 0 ), // #483 {m80|mem}
- ROW(1, 1, 1, 0, 152, 0 , 0 , 0 , 0 , 0 ), // #484 {m16|m32}
- ROW(1, 1, 1, 0, 153, 0 , 0 , 0 , 0 , 0 ), // #485 {m16|m32|m64}
- ROW(1, 1, 1, 0, 154, 0 , 0 , 0 , 0 , 0 ), // #486 {m32|m64|m80|st}
- ROW(1, 1, 1, 0, 21 , 0 , 0 , 0 , 0 , 0 ), // #487 {m16|mem}
- ROW(1, 1, 1, 0, 155, 0 , 0 , 0 , 0 , 0 ), // #488 {ax|m16|mem}
- ROW(1, 0, 1, 0, 122, 0 , 0 , 0 , 0 , 0 ), // #489 {mem}
- ROW(2, 1, 1, 1, 10 , 39 , 0 , 0 , 0 , 0 ), // #490 {i8|u8, <eax>}
- ROW(2, 1, 1, 0, 156, 157, 0 , 0 , 0 , 0 ), // #491 {al|ax|eax, i8|u8|dx}
- ROW(2, 1, 1, 0, 158, 159, 0 , 0 , 0 , 0 ), // #492 {es:[memBase|zdi|m8|m16|m32], dx}
- ROW(1, 1, 1, 0, 10 , 0 , 0 , 0 , 0 , 0 ), // #493 {i8|u8}
- ROW(0, 1, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 ), // #494 {}
- ROW(3, 1, 1, 0, 86 , 86 , 86 , 0 , 0 , 0 ), // #495 {k, k, k}
- ROW(2, 1, 1, 0, 86 , 86 , 0 , 0 , 0 , 0 ), // #496 {k, k}
- ROW(3, 1, 1, 0, 86 , 86 , 10 , 0 , 0 , 0 ), // #497 {k, k, i8|u8}
- ROW(1, 1, 1, 1, 160, 0 , 0 , 0 , 0 , 0 ), // #498 {<ah>}
- ROW(1, 1, 1, 0, 30 , 0 , 0 , 0 , 0 , 0 ), // #499 {m32|mem}
- ROW(1, 0, 1, 0, 57 , 0 , 0 , 0 , 0 , 0 ), // #500 {m512|mem}
- ROW(1, 1, 1, 0, 27 , 0 , 0 , 0 , 0 , 0 ), // #501 {r16|m16|mem}
- ROW(3, 1, 1, 1, 49 , 49 , 161, 0 , 0 , 0 ), // #502 {xmm, xmm, <ds:[mem|m128|memBase|zdi]>}
- ROW(3, 1, 1, 1, 61 , 61 , 162, 0 , 0 , 0 ), // #503 {mm, mm, <ds:[mem|m64|memBase|zdi]>}
- ROW(3, 1, 1, 3, 163, 126, 38 , 0 , 0 , 0 ), // #504 {<ds:[mem|memBase|zax]>, <ecx>, <edx>}
- ROW(2, 1, 1, 0, 61 , 49 , 0 , 0 , 0 , 0 ), // #505 {mm, xmm}
- ROW(2, 1, 1, 0, 6 , 49 , 0 , 0 , 0 , 0 ), // #506 {r32, xmm}
- ROW(2, 1, 1, 0, 31 , 61 , 0 , 0 , 0 , 0 ), // #507 {m64|mem, mm}
- ROW(2, 1, 1, 0, 49 , 61 , 0 , 0 , 0 , 0 ), // #508 {xmm, mm}
- ROW(2, 1, 1, 2, 39 , 126, 0 , 0 , 0 , 0 ), // #509 {<eax>, <ecx>}
- ROW(3, 1, 1, 3, 39 , 126, 151, 0 , 0 , 0 ), // #510 {<eax>, <ecx>, <ebx>}
- ROW(2, 1, 1, 0, 164, 156, 0 , 0 , 0 , 0 ), // #511 {u8|dx, al|ax|eax}
- ROW(2, 1, 1, 0, 159, 165, 0 , 0 , 0 , 0 ), // #512 {dx, ds:[memBase|zsi|m8|m16|m32]}
- ROW(6, 1, 1, 3, 49 , 50 , 10 , 126, 39 , 38 ), // #513 {xmm, xmm|m128|mem, i8|u8, <ecx>, <eax>, <edx>}
- ROW(6, 1, 1, 3, 49 , 50 , 10 , 146, 39 , 38 ), // #514 {xmm, xmm|m128|mem, i8|u8, <xmm0>, <eax>, <edx>}
- ROW(4, 1, 1, 1, 49 , 50 , 10 , 126, 0 , 0 ), // #515 {xmm, xmm|m128|mem, i8|u8, <ecx>}
- ROW(4, 1, 1, 1, 49 , 50 , 10 , 146, 0 , 0 ), // #516 {xmm, xmm|m128|mem, i8|u8, <xmm0>}
- ROW(3, 1, 1, 0, 132, 49 , 10 , 0 , 0 , 0 ), // #517 {r32|m8|mem, xmm, i8|u8}
- ROW(3, 0, 1, 0, 29 , 49 , 10 , 0 , 0 , 0 ), // #518 {r64|m64|mem, xmm, i8|u8}
- ROW(3, 1, 1, 0, 49 , 132, 10 , 0 , 0 , 0 ), // #519 {xmm, r32|m8|mem, i8|u8}
- ROW(3, 1, 1, 0, 49 , 28 , 10 , 0 , 0 , 0 ), // #520 {xmm, r32|m32|mem, i8|u8}
- ROW(3, 0, 1, 0, 49 , 29 , 10 , 0 , 0 , 0 ), // #521 {xmm, r64|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 63 , 111, 10 , 0 , 0 , 0 ), // #522 {mm|xmm, r32|m16|mem, i8|u8}
- ROW(2, 1, 1, 0, 6 , 63 , 0 , 0 , 0 , 0 ), // #523 {r32, mm|xmm}
- ROW(2, 1, 1, 0, 49 , 10 , 0 , 0 , 0 , 0 ), // #524 {xmm, i8|u8}
- ROW(1, 0, 1, 0, 136, 0 , 0 , 0 , 0 , 0 ), // #525 {r32|r64}
- ROW(3, 1, 1, 3, 38 , 39 , 126, 0 , 0 , 0 ), // #526 {<edx>, <eax>, <ecx>}
- ROW(1, 1, 1, 0, 1 , 0 , 0 , 0 , 0 , 0 ), // #527 {r8lo|r8hi|m8|mem}
- ROW(3, 0, 1, 0, 166, 166, 166, 0 , 0 , 0 ), // #528 {tmm, tmm, tmm}
- ROW(2, 0, 1, 0, 166, 167, 0 , 0 , 0 , 0 ), // #529 {tmm, tmem}
- ROW(2, 0, 1, 0, 167, 166, 0 , 0 , 0 , 0 ), // #530 {tmem, tmm}
- ROW(1, 0, 1, 0, 166, 0 , 0 , 0 , 0 , 0 ), // #531 {tmm}
- ROW(3, 1, 1, 2, 6 , 38 , 39 , 0 , 0 , 0 ), // #532 {r32, <edx>, <eax>}
- ROW(6, 1, 1, 0, 55 , 55 , 55 , 55 , 55 , 51 ), // #533 {zmm, zmm, zmm, zmm, zmm, m128|mem}
- ROW(6, 1, 1, 0, 49 , 49 , 49 , 49 , 49 , 51 ), // #534 {xmm, xmm, xmm, xmm, xmm, m128|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 64 , 0 , 0 , 0 ), // #535 {xmm, xmm, xmm|m64|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 119, 0 , 0 , 0 ), // #536 {xmm, xmm, xmm|m16|mem}
- ROW(3, 1, 1, 0, 49 , 49 , 117, 0 , 0 , 0 ), // #537 {xmm, xmm, xmm|m32|mem}
- ROW(2, 1, 1, 0, 96 , 21 , 0 , 0 , 0 , 0 ), // #538 {xmm|ymm, m16|mem}
- ROW(2, 1, 1, 0, 52 , 51 , 0 , 0 , 0 , 0 ), // #539 {ymm, m128|mem}
- ROW(2, 1, 1, 0, 168, 64 , 0 , 0 , 0 , 0 ), // #540 {ymm|zmm, xmm|m64|mem}
- ROW(2, 1, 1, 0, 168, 51 , 0 , 0 , 0 , 0 ), // #541 {ymm|zmm, m128|mem}
- ROW(2, 1, 1, 0, 55 , 54 , 0 , 0 , 0 , 0 ), // #542 {zmm, m256|mem}
- ROW(2, 1, 1, 0, 144, 117, 0 , 0 , 0 , 0 ), // #543 {xmm|ymm|zmm, m32|mem|xmm}
- ROW(4, 1, 1, 0, 115, 49 , 64 , 10 , 0 , 0 ), // #544 {xmm|k, xmm, xmm|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 86 , 49 , 119, 10 , 0 , 0 ), // #545 {k, xmm, xmm|m16|mem, i8|u8}
- ROW(4, 1, 1, 0, 115, 49 , 117, 10 , 0 , 0 ), // #546 {xmm|k, xmm, xmm|m32|mem, i8|u8}
- ROW(2, 1, 1, 0, 49 , 169, 0 , 0 , 0 , 0 ), // #547 {xmm, xmm|m128|ymm|m256|zmm|m512}
- ROW(3, 1, 1, 0, 50 , 168, 10 , 0 , 0 , 0 ), // #548 {xmm|m128|mem, ymm|zmm, i8|u8}
- ROW(4, 1, 1, 0, 49 , 49 , 64 , 10 , 0 , 0 ), // #549 {xmm, xmm, xmm|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 49 , 49 , 117, 10 , 0 , 0 ), // #550 {xmm, xmm, xmm|m32|mem, i8|u8}
- ROW(3, 1, 1, 0, 86 , 169, 10 , 0 , 0 , 0 ), // #551 {k, xmm|m128|ymm|m256|zmm|m512, i8|u8}
- ROW(3, 1, 1, 0, 86 , 64 , 10 , 0 , 0 , 0 ), // #552 {k, xmm|m64|mem, i8|u8}
- ROW(3, 1, 1, 0, 86 , 119, 10 , 0 , 0 , 0 ), // #553 {k, xmm|m16|mem, i8|u8}
- ROW(3, 1, 1, 0, 86 , 117, 10 , 0 , 0 , 0 ), // #554 {k, xmm|m32|mem, i8|u8}
- ROW(1, 1, 1, 0, 72 , 0 , 0 , 0 , 0 , 0 ), // #555 {vm32y}
- ROW(1, 1, 1, 0, 73 , 0 , 0 , 0 , 0 , 0 ), // #556 {vm32z}
- ROW(1, 1, 1, 0, 76 , 0 , 0 , 0 , 0 , 0 ), // #557 {vm64z}
- ROW(4, 1, 1, 0, 49 , 49 , 119, 10 , 0 , 0 ), // #558 {xmm, xmm, xmm|m16|mem, i8|u8}
- ROW(4, 1, 1, 0, 55 , 55 , 53 , 10 , 0 , 0 ), // #559 {zmm, zmm, ymm|m256|mem, i8|u8}
- ROW(2, 1, 1, 0, 6 , 96 , 0 , 0 , 0 , 0 ), // #560 {r32, xmm|ymm}
- ROW(2, 1, 1, 0, 144, 170, 0 , 0 , 0 , 0 ), // #561 {xmm|ymm|zmm, xmm|m8|mem|r32}
- ROW(2, 1, 1, 0, 144, 171, 0 , 0 , 0 , 0 ), // #562 {xmm|ymm|zmm, xmm|m32|mem|r32}
- ROW(2, 1, 1, 0, 144, 86 , 0 , 0 , 0 , 0 ), // #563 {xmm|ymm|zmm, k}
- ROW(2, 1, 1, 0, 144, 172, 0 , 0 , 0 , 0 ), // #564 {xmm|ymm|zmm, xmm|m16|mem|r32}
- ROW(3, 1, 1, 0, 111, 49 , 10 , 0 , 0 , 0 ), // #565 {r32|m16|mem, xmm, i8|u8}
- ROW(4, 1, 1, 0, 49 , 49 , 132, 10 , 0 , 0 ), // #566 {xmm, xmm, r32|m8|mem, i8|u8}
- ROW(4, 1, 1, 0, 49 , 49 , 28 , 10 , 0 , 0 ), // #567 {xmm, xmm, r32|m32|mem, i8|u8}
- ROW(4, 0, 1, 0, 49 , 49 , 29 , 10 , 0 , 0 ), // #568 {xmm, xmm, r64|m64|mem, i8|u8}
- ROW(4, 1, 1, 0, 49 , 49 , 111, 10 , 0 , 0 ), // #569 {xmm, xmm, r32|m16|mem, i8|u8}
- ROW(2, 1, 1, 0, 86 , 144, 0 , 0 , 0 , 0 ), // #570 {k, xmm|ymm|zmm}
- ROW(2, 1, 1, 0, 52 , 49 , 0 , 0 , 0 , 0 ), // #571 {ymm, xmm}
- ROW(2, 1, 1, 0, 52 , 52 , 0 , 0 , 0 , 0 ), // #572 {ymm, ymm}
- ROW(3, 1, 1, 0, 52 , 52 , 49 , 0 , 0 , 0 ), // #573 {ymm, ymm, xmm}
- ROW(3, 1, 1, 2, 122, 38 , 39 , 0 , 0 , 0 ), // #574 {mem, <edx>, <eax>}
- ROW(3, 0, 1, 2, 122, 38 , 39 , 0 , 0 , 0 ) // #575 {mem, <edx>, <eax>}
-};
-#undef ROW
-
-#define ROW(opFlags, regId) { opFlags, uint8_t(regId) }
-#define F(VAL) uint64_t(InstDB::OpFlags::k##VAL)
-const InstDB::OpSignature InstDB::_opSignatureTable[] = {
- ROW(0, 0xFF),
- ROW(F(RegGpbLo) | F(RegGpbHi) | F(MemUnspecified) | F(Mem8), 0x00),
- ROW(F(RegGpbLo) | F(RegGpbHi), 0x00),
- ROW(F(RegGpw) | F(RegSReg) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegGpw), 0x00),
- ROW(F(RegGpd) | F(RegSReg) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(RegGpd), 0x00),
- ROW(F(RegGpq) | F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64), 0x00),
- ROW(F(RegGpq), 0x00),
- ROW(F(RegGpbLo) | F(RegGpbHi) | F(Mem8), 0x00),
- ROW(F(ImmI8) | F(ImmU8), 0x00),
- ROW(F(RegGpw) | F(Mem16), 0x00),
- ROW(F(ImmI16) | F(ImmU16), 0x00),
- ROW(F(RegGpd) | F(Mem32), 0x00),
- ROW(F(ImmI32) | F(ImmU32), 0x00),
- ROW(F(RegGpq) | F(Mem64), 0x00),
- ROW(F(ImmI32), 0x00),
- ROW(F(RegSReg) | F(RegCReg) | F(RegDReg) | F(MemUnspecified) | F(Mem64) | F(ImmI64) | F(ImmU64), 0x00),
- ROW(F(MemUnspecified) | F(Mem8), 0x00),
- ROW(F(RegSReg) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegSReg) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegSReg), 0x00),
- ROW(F(RegCReg) | F(RegDReg), 0x00),
- ROW(F(ImmI8) | F(ImmI32), 0x00),
- ROW(F(RegGpw) | F(RegGpd) | F(Mem16) | F(Mem32), 0x00),
- ROW(F(ImmI8), 0x00),
- ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegGpd) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64), 0x00),
- ROW(F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(MemUnspecified) | F(Mem64), 0x00),
- ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(RegGpd) | F(Mem8) | F(Mem16) | F(Mem32), 0x00),
- ROW(F(RegGpq) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmU8) | F(ImmI32) | F(ImmU32), 0x00),
- ROW(F(Mem64), 0x00),
- ROW(F(ImmI8) | F(ImmU8) | F(ImmI32), 0x00),
- ROW(F(RegGpw) | F(FlagImplicit), 0x01),
- ROW(F(RegGpw) | F(FlagImplicit), 0x04),
- ROW(F(RegGpd) | F(FlagImplicit), 0x04),
- ROW(F(RegGpd) | F(FlagImplicit), 0x01),
- ROW(F(RegGpq) | F(FlagImplicit), 0x04),
- ROW(F(RegGpq) | F(FlagImplicit), 0x01),
- ROW(F(ImmI8) | F(ImmI16) | F(ImmU16), 0x00),
- ROW(F(ImmI8) | F(ImmI32) | F(ImmU32), 0x00),
- ROW(F(ImmI64) | F(ImmU64), 0x00),
- ROW(F(RegGpbLo), 0x01),
- ROW(F(RegGpw), 0x01),
- ROW(F(RegGpd), 0x01),
- ROW(F(RegGpq), 0x01),
- ROW(F(RegXmm), 0x00),
- ROW(F(RegXmm) | F(MemUnspecified) | F(Mem128), 0x00),
- ROW(F(MemUnspecified) | F(Mem128), 0x00),
- ROW(F(RegYmm), 0x00),
- ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256), 0x00),
- ROW(F(MemUnspecified) | F(Mem256), 0x00),
- ROW(F(RegZmm), 0x00),
- ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512), 0x00),
- ROW(F(MemUnspecified) | F(Mem512), 0x00),
- ROW(F(RegXmm) | F(MemUnspecified) | F(Mem128) | F(ImmI8) | F(ImmU8), 0x00),
- ROW(F(RegYmm) | F(MemUnspecified) | F(Mem256) | F(ImmI8) | F(ImmU8), 0x00),
- ROW(F(RegZmm) | F(MemUnspecified) | F(Mem512) | F(ImmI8) | F(ImmU8), 0x00),
- ROW(F(RegMm), 0x00),
- ROW(F(RegMm) | F(MemUnspecified) | F(Mem64), 0x00),
- ROW(F(RegXmm) | F(RegMm), 0x00),
- ROW(F(RegXmm) | F(MemUnspecified) | F(Mem64), 0x00),
- ROW(F(RegSReg), 0x1A),
- ROW(F(RegSReg), 0x60),
- ROW(F(RegGpw) | F(Mem16) | F(ImmI8) | F(ImmI16), 0x00),
- ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmU32), 0x00),
- ROW(F(RegGpq) | F(Mem64) | F(ImmI32), 0x00),
- ROW(F(RegSReg), 0x1E),
- ROW(F(Vm32x), 0x00),
- ROW(F(Vm32y), 0x00),
- ROW(F(Vm32z), 0x00),
- ROW(F(Vm64x), 0x00),
- ROW(F(Vm64y), 0x00),
- ROW(F(Vm64z), 0x00),
- ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(Mem8) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(Mem16) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(Mem64) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(RegGpbLo) | F(FlagImplicit), 0x01),
- ROW(F(RegKReg), 0x00),
- ROW(F(RegKReg) | F(MemUnspecified) | F(Mem64), 0x00),
- ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(MemUnspecified) | F(Mem8) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(MemUnspecified) | F(Mem16) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(MemUnspecified) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(RegXmm) | F(RegYmm), 0x00),
- ROW(F(ImmI4) | F(ImmU4), 0x00),
- ROW(F(RegGpw) | F(RegGpd) | F(MemUnspecified) | F(Mem16) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
- ROW(F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
- ROW(F(RegGpw) | F(RegGpd), 0x00),
- ROW(F(Mem32) | F(Mem64), 0x00),
- ROW(F(RegSt), 0x01),
- ROW(F(RegSt), 0x00),
- ROW(F(ImmI32) | F(ImmI64) | F(Rel8) | F(Rel32), 0x00),
- ROW(F(RegGpd) | F(Mem32) | F(ImmI32) | F(ImmI64) | F(Rel32), 0x00),
- ROW(F(ImmI16), 0x00),
- ROW(F(ImmI16) | F(ImmI32), 0x00),
- ROW(F(MemUnspecified) | F(Mem32) | F(Mem48), 0x00),
- ROW(F(MemUnspecified) | F(Mem80), 0x00),
- ROW(F(MemUnspecified) | F(Mem48), 0x00),
- ROW(F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegGpbLo) | F(RegGpbHi) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00),
- ROW(F(RegGpbLo) | F(RegGpw) | F(Mem8) | F(Mem16), 0x00),
- ROW(F(RegGpbLo) | F(ImmI8) | F(ImmU8), 0x02),
- ROW(F(RegXmm) | F(RegKReg), 0x00),
- ROW(F(RegYmm) | F(RegKReg), 0x00),
- ROW(F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(Vm64x) | F(Vm64y), 0x00),
- ROW(F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegBnd), 0x00),
- ROW(F(RegBnd) | F(MemUnspecified), 0x00),
- ROW(F(MemUnspecified), 0x00),
- ROW(F(RegGpbLo) | F(RegGpq) | F(Mem8) | F(Mem64), 0x00),
- ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemEs), 0x00),
- ROW(F(RegSt) | F(Mem32) | F(Mem64), 0x00),
- ROW(F(RegGpd) | F(FlagImplicit), 0x02),
- ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x01),
- ROW(F(RegGpw) | F(RegGpd) | F(FlagImplicit), 0x02),
- ROW(F(ImmI32) | F(ImmI64) | F(Rel8), 0x00),
- ROW(F(RegGpd) | F(RegGpq) | F(FlagImplicit), 0x02),
- ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem8), 0x00),
- ROW(F(RegGpd) | F(MemUnspecified) | F(Mem8), 0x00),
- ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(RegGpd) | F(RegKReg) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(MemUnspecified) | F(Mem8) | F(Mem16) | F(Mem32) | F(Mem48) | F(Mem64) | F(Mem80) | F(Mem128) | F(Mem256) | F(Mem512) | F(Mem1024), 0x00),
- ROW(F(RegGpd) | F(RegGpq), 0x00),
- ROW(F(RegMm) | F(MemUnspecified) | F(Mem64) | F(ImmI8) | F(ImmU8), 0x00),
- ROW(F(RegMm) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(ImmU16), 0x00),
- ROW(F(RegGpw) | F(RegGpd) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(RegGpq) | F(MemUnspecified) | F(Mem16), 0x00),
- ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs), 0x00),
- ROW(F(RegXmm) | F(RegYmm) | F(Mem128) | F(Mem256), 0x00),
- ROW(F(RegXmm) | F(RegYmm) | F(RegZmm), 0x00),
- ROW(F(RegXmm) | F(ImmI8) | F(ImmU8), 0x00),
- ROW(F(RegXmm) | F(FlagImplicit), 0x01),
- ROW(F(MemUnspecified) | F(FlagMib), 0x00),
- ROW(F(MemUnspecified) | F(Mem512) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01),
- ROW(F(RegGpq) | F(FlagImplicit), 0x02),
- ROW(F(RegGpq) | F(FlagImplicit), 0x08),
- ROW(F(RegGpd) | F(FlagImplicit), 0x08),
- ROW(F(Mem16) | F(Mem32), 0x00),
- ROW(F(Mem16) | F(Mem32) | F(Mem64), 0x00),
- ROW(F(RegSt) | F(Mem32) | F(Mem64) | F(Mem80), 0x00),
- ROW(F(RegGpw) | F(MemUnspecified) | F(Mem16), 0x01),
- ROW(F(RegGpbLo) | F(RegGpw) | F(RegGpd), 0x01),
- ROW(F(RegGpw) | F(ImmI8) | F(ImmU8), 0x04),
- ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemEs), 0x80),
- ROW(F(RegGpw), 0x04),
- ROW(F(RegGpbHi) | F(FlagImplicit), 0x01),
- ROW(F(MemUnspecified) | F(Mem128) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x80),
- ROW(F(MemUnspecified) | F(Mem64) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x80),
- ROW(F(MemUnspecified) | F(FlagMemBase) | F(FlagMemDs) | F(FlagImplicit), 0x01),
- ROW(F(RegGpw) | F(ImmU8), 0x04),
- ROW(F(Mem8) | F(Mem16) | F(Mem32) | F(FlagMemBase) | F(FlagMemDs), 0x40),
- ROW(F(RegTmm), 0x00),
- ROW(F(MemUnspecified) | F(FlagTMem), 0x00),
- ROW(F(RegYmm) | F(RegZmm), 0x00),
- ROW(F(RegXmm) | F(RegYmm) | F(RegZmm) | F(Mem128) | F(Mem256) | F(Mem512), 0x00),
- ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem8), 0x00),
- ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem32), 0x00),
- ROW(F(RegGpd) | F(RegXmm) | F(MemUnspecified) | F(Mem16), 0x00)
-};
-#undef F
-#undef ROW
-// ----------------------------------------------------------------------------
-// ${InstSignatureTable:End}
-#endif // !ASMJIT_NO_VALIDATION
-
-// x86::InstInternal - QueryRWInfo
-// ===============================
-
-// ${InstRWInfoTable:Begin}
-// ------------------- Automatically generated, do not edit -------------------
-const uint8_t InstDB::rwInfoIndexA[Inst::_kIdCount] = {
- 0, 0, 1, 2, 1, 2, 0, 3, 4, 3, 5, 5, 6, 7, 5, 5, 4, 5, 5, 5, 5, 8, 0, 3, 0, 5,
- 5, 5, 5, 2, 9, 2, 0, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 10, 10, 10, 10, 11, 11,
- 11, 12, 12, 13, 14, 15, 10, 10, 0, 16, 17, 17, 17, 0, 0, 0, 18, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 21, 22, 0, 23, 24, 25, 8, 26, 26,
- 26, 25, 27, 8, 25, 28, 29, 30, 31, 32, 33, 34, 26, 26, 8, 28, 29, 34, 35, 0,
- 0, 0, 0, 36, 5, 5, 6, 7, 0, 0, 0, 0, 0, 37, 37, 0, 0, 38, 0, 0, 39, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 39, 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, 39, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 39, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 40, 5, 5, 36,
- 41, 42, 0, 0, 0, 43, 0, 38, 0, 0, 0, 0, 44, 0, 45, 0, 44, 44, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 46, 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, 0, 0, 0, 0, 0, 47, 48, 49, 50, 51, 52, 53,
- 54, 0, 0, 0, 55, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, 58, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 60, 0, 2, 0, 61, 0, 2, 0, 2, 0, 2, 0, 0,
- 0, 0, 0, 62, 63, 63, 63, 59, 2, 0, 0, 0, 10, 0, 0, 5, 5, 6, 7, 0, 0, 5, 5, 6,
- 7, 0, 0, 64, 65, 66, 66, 67, 48, 25, 37, 67, 53, 66, 66, 68, 69, 69, 70, 71,
- 71, 72, 72, 60, 60, 67, 60, 60, 71, 71, 73, 49, 53, 74, 75, 8, 8, 76, 77, 10,
- 66, 66, 77, 0, 36, 5, 5, 6, 7, 0, 78, 0, 0, 79, 0, 3, 5, 5, 80, 81, 10, 10, 10,
- 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4, 82, 4, 0, 0, 0, 4, 4, 5,
- 4, 0, 0, 4, 4, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 83, 28, 28, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 28, 82, 82, 82, 28, 28, 82, 82, 82, 4, 4, 4, 84, 4, 4, 4, 28,
- 28, 0, 0, 0, 0, 4, 4, 5, 5, 4, 4, 5, 5, 5, 5, 4, 4, 5, 5, 85, 86, 87, 25, 25,
- 25, 86, 86, 87, 25, 25, 25, 86, 5, 4, 82, 4, 4, 5, 4, 4, 0, 0, 0, 10, 0, 0,
- 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 88, 4, 4, 0, 4,
- 4, 4, 88, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 28, 89, 0, 4, 4, 5, 4, 90, 90, 5, 90,
- 0, 0, 0, 0, 0, 0, 0, 4, 91, 8, 92, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93,
- 0, 0, 0, 0, 0, 91, 91, 0, 0, 0, 0, 0, 0, 8, 92, 0, 0, 91, 91, 0, 0, 3, 94, 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, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 0, 91, 0, 0, 91, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 8, 8, 27, 92, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 3, 5, 5, 6, 7, 0,
- 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 96, 96, 0, 97, 0, 0,
- 0, 10, 10, 21, 22, 98, 98, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 99, 99, 0, 0, 0, 0, 0, 0, 100, 29,
- 101, 102, 101, 102, 100, 29, 101, 102, 101, 102, 103, 104, 0, 0, 0, 0, 0, 0,
- 21, 105, 22, 106, 106, 107, 77, 10, 0, 67, 67, 67, 67, 77, 108, 109, 108, 10,
- 108, 10, 110, 111, 107, 110, 111, 110, 111, 10, 10, 10, 107, 0, 77, 107, 10,
- 107, 10, 109, 108, 0, 29, 0, 29, 0, 112, 0, 112, 0, 0, 0, 0, 0, 34, 34, 108,
- 10, 108, 10, 110, 111, 110, 111, 10, 10, 10, 107, 10, 107, 29, 29, 112, 112, 34,
- 34, 107, 77, 10, 10, 109, 108, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 113, 113, 10, 10, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 28, 114, 2, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 2, 115, 10, 10, 10, 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, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 116, 48, 117, 116, 116, 116, 116,
- 116, 116, 116, 116, 0, 118, 118, 0, 71, 71, 119, 120, 67, 67, 67, 67, 121, 71,
- 122, 10, 10, 73, 116, 116, 50, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123,
- 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 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, 124, 34, 125, 125, 29, 126, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 106,
- 106, 106, 0, 0, 0, 0, 0, 0, 10, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 0, 0, 0, 0, 2, 2, 115, 2, 8, 8, 8, 0, 8, 0, 8, 8, 8, 8, 8, 8,
- 0, 8, 8, 84, 8, 0, 8, 0, 0, 8, 0, 0, 0, 0, 10, 10, 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, 0, 0, 127,
- 127, 128, 129, 125, 125, 125, 125, 85, 127, 130, 129, 128, 128, 129, 130,
- 129, 128, 129, 131, 132, 107, 107, 107, 131, 128, 129, 130, 129, 128, 129, 127,
- 129, 131, 132, 107, 107, 107, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 133, 67, 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, 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, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10, 10, 0, 0, 113, 113, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 113, 113, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 67, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 123, 21, 105, 22,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 136, 137, 0, 138, 0, 139, 0,
- 0, 0, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-const uint8_t InstDB::rwInfoIndexB[Inst::_kIdCount] = {
- 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0,
- 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 4, 8, 1, 0, 9, 0, 0, 0, 10, 10, 10, 0, 0, 11, 0,
- 0, 10, 12, 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, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 5, 5, 13, 0, 14, 15, 13, 16, 17, 18, 13, 0, 0, 19, 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, 20, 1, 1, 21, 22, 0, 0, 0,
- 0, 5, 5, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0, 25, 26, 27, 28, 0, 0, 26, 26, 26, 26,
- 26, 26, 26, 26, 29, 30, 30, 29, 0, 0, 0, 25, 26, 25, 26, 0, 26, 25, 25, 25,
- 25, 25, 25, 25, 0, 0, 31, 31, 31, 25, 25, 29, 0, 32, 10, 0, 0, 0, 0, 0, 0, 25,
- 26, 0, 0, 0, 33, 34, 33, 35, 0, 0, 0, 0, 0, 10, 33, 0, 0, 0, 0, 36, 34, 33, 36,
- 35, 25, 26, 25, 26, 0, 30, 30, 30, 30, 0, 0, 0, 26, 10, 10, 33, 33, 0, 0, 0,
- 20, 5, 5, 0, 0, 0, 0, 0, 0, 0, 22, 37, 0, 21, 38, 39, 0, 40, 41, 0, 0, 0, 0,
- 0, 10, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 43, 44, 43, 44,
- 45, 46, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 46, 47, 48,
- 49, 50, 47, 48, 49, 50, 0, 0, 0, 0, 51, 52, 53, 43, 44, 45, 46, 43, 44, 45, 46,
- 54, 0, 25, 0, 55, 0, 56, 0, 0, 0, 0, 0, 10, 0, 10, 25, 57, 58, 57, 0, 0, 0,
- 0, 0, 0, 57, 59, 59, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 62, 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, 63, 0, 0, 63, 0, 0, 0, 0, 0, 5, 64, 0, 0, 0, 0, 65, 0, 66, 21, 67, 21,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0,
- 0, 6, 5, 5, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 71, 72, 0, 3, 3, 73, 23, 74, 75,
- 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, 76, 40, 77, 78, 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, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 2, 2, 2, 80, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0,
- 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 82, 81, 82, 82, 82, 81, 81, 83,
- 84, 0, 85, 0, 0, 0, 0, 0, 0, 86, 2, 2, 87, 88, 0, 0, 0, 11, 89, 0, 0, 4, 0, 0,
- 0, 0, 0, 0, 90, 0, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
- 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 91, 0, 33, 0, 0,
- 0, 5, 0, 0, 6, 0, 92, 4, 0, 92, 4, 5, 5, 33, 20, 93, 81, 93, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 94, 0, 93, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 0,
- 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 97, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 10,
- 98, 0, 0, 0, 0, 99, 100, 99, 100, 3, 3, 3, 101, 102, 103, 3, 3, 3, 3, 3, 3,
- 0, 2, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 3, 105, 3, 106, 107, 108, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0,
- 0, 0, 110, 0, 111, 0, 112, 0, 112, 0, 113, 114, 115, 116, 117, 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, 113, 114,
- 115, 0, 0, 3, 3, 3, 3, 101, 112, 103, 3, 118, 3, 57, 57, 0, 0, 0, 0, 119, 120,
- 121, 120, 121, 119, 120, 121, 120, 121, 23, 122, 123, 122, 123, 124, 124, 125,
- 126, 124, 124, 124, 127, 128, 129, 124, 124, 124, 127, 128, 129, 124, 124,
- 124, 127, 128, 129, 122, 123, 130, 130, 131, 132, 124, 124, 124, 124, 124, 124,
- 124, 124, 124, 130, 130, 124, 124, 124, 127, 133, 129, 124, 124, 124, 127, 133,
- 129, 124, 124, 124, 127, 133, 129, 124, 124, 124, 124, 124, 124, 124, 124,
- 124, 130, 130, 130, 130, 131, 132, 122, 123, 124, 124, 124, 127, 128, 129, 124,
- 124, 124, 127, 128, 129, 124, 124, 124, 127, 128, 129, 130, 130, 131, 132,
- 124, 124, 124, 127, 133, 129, 124, 124, 124, 127, 133, 129, 124, 124, 124, 134,
- 133, 135, 130, 130, 131, 132, 136, 136, 136, 80, 137, 138, 0, 0, 0, 0, 139,
- 140, 10, 10, 10, 10, 10, 10, 10, 10, 140, 141, 0, 0, 0, 142, 143, 144, 86, 86,
- 86, 142, 143, 144, 3, 3, 3, 3, 3, 3, 3, 145, 146, 147, 146, 147, 145, 146, 147,
- 146, 147, 103, 0, 55, 60, 148, 148, 3, 3, 3, 101, 102, 103, 0, 149, 0, 0, 3,
- 3, 3, 101, 102, 103, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 152,
- 152, 153, 154, 154, 0, 0, 0, 0, 0, 0, 0, 155, 156, 0, 0, 157, 0, 0, 0, 3, 11,
- 149, 0, 0, 158, 150, 3, 3, 3, 101, 102, 103, 0, 0, 11, 3, 3, 159, 159, 160,
- 160, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 104, 3, 0, 0, 0, 0, 0, 0, 3, 130, 105, 105, 3, 3, 3, 3, 69, 70,
- 3, 3, 3, 3, 71, 72, 105, 105, 105, 105, 105, 105, 118, 118, 0, 0, 0, 0, 118,
- 118, 118, 118, 118, 118, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- 124, 124, 124, 124, 124, 124, 124, 161, 161, 3, 3, 3, 124, 3, 3, 124, 124, 130,
- 130, 162, 162, 162, 3, 162, 3, 124, 124, 124, 124, 124, 3, 0, 0, 0, 0, 73, 23,
- 74, 163, 140, 139, 141, 140, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 3, 0, 3, 3, 0, 164, 103, 101, 102, 0, 0, 165, 165, 165, 165, 165, 165, 165,
- 165, 165, 165, 165, 165, 124, 124, 3, 3, 148, 148, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 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, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 166, 86, 86, 3, 3, 86, 86, 3, 3, 167, 167, 167,
- 167, 3, 0, 0, 0, 0, 167, 167, 167, 167, 167, 167, 3, 3, 124, 124, 124, 3, 167,
- 167, 3, 3, 124, 124, 124, 3, 3, 105, 86, 86, 86, 3, 3, 3, 168, 169, 168, 3,
- 3, 3, 170, 168, 171, 3, 3, 3, 170, 168, 169, 168, 3, 3, 3, 170, 3, 3, 3, 3,
- 3, 3, 3, 3, 172, 172, 0, 105, 105, 105, 105, 105, 105, 105, 105, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 142, 144, 0, 0, 142, 144, 0, 0, 142, 144, 0, 0, 143,
- 144, 86, 86, 86, 142, 143, 144, 86, 86, 86, 142, 143, 144, 86, 86, 142, 144,
- 0, 0, 142, 144, 0, 0, 142, 144, 0, 0, 143, 144, 3, 3, 3, 101, 102, 103, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 173, 3, 3, 3, 3, 3, 3, 174, 174, 174,
- 3, 3, 0, 0, 0, 142, 143, 144, 94, 3, 3, 3, 101, 102, 103, 0, 0, 0, 0, 0, 3,
- 3, 3, 3, 3, 3, 0, 0, 0, 0, 58, 58, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0,
- 0, 0, 0, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 175, 0,
- 0
-};
-
-const InstDB::RWInfo InstDB::rwInfoA[] = {
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=1054x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #2 [ref=15x]
- { InstDB::RWInfo::kCategoryGeneric , 1 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #3 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #4 [ref=96x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=55x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #6 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #7 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #8 [ref=26x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 12, 13, 0 , 0 , 0 , 0 } }, // #9 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #10 [ref=75x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 5 , 3 , 0 , 0 , 0 , 0 } }, // #11 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 10, 3 , 0 , 0 , 0 , 0 } }, // #12 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 9 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #13 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 15, 5 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #16 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #17 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 17, 0 , 0 , 0 , 0 } }, // #18 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 1 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #19 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 20, 21, 0 , 0 , 0 , 0 } }, // #20 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #22 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 33, 34, 0 , 0 , 0 , 0 } }, // #23 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #24 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 10, 7 , 0 , 0 , 0 , 0 } }, // #25 [ref=10x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 35, 5 , 0 , 0 , 0 , 0 } }, // #26 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #27 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #28 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #29 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 37, 7 , 0 , 0 , 0 , 0 } }, // #30 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 36, 3 , 0 , 0 , 0 , 0 } }, // #31 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 37, 3 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 36, 9 , 0 , 0 , 0 , 0 } }, // #33 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 11, 9 , 0 , 0 , 0 , 0 } }, // #34 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 38, 39, 0 , 0 , 0 , 0 } }, // #35 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 17, { 1 , 40, 0 , 0 , 0 , 0 } }, // #36 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 43, 44, 0 , 0 , 0 , 0 } }, // #37 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #38 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 47, 0 , 0 , 0 , 0 } }, // #39 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 51, 0 , 0 , 0 , 0 } }, // #40 [ref=1x]
- { InstDB::RWInfo::kCategoryImul , 2 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #41 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 53, 0 , 0 , 0 , 0 } }, // #42 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 55, 53, 0 , 0 , 0 , 0 } }, // #43 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 3 , 5 , 0 , 0 , 0 , 0 } }, // #44 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 29, 0 , 0 , 0 , 0 } }, // #45 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 57, 0 , 0 , 0 , 0 , 0 } }, // #46 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 23, { 58, 40, 0 , 0 , 0 , 0 } }, // #47 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 24, { 45, 9 , 0 , 0 , 0 , 0 } }, // #48 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 25, { 35, 7 , 0 , 0 , 0 , 0 } }, // #49 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 26, { 49, 13, 0 , 0 , 0 , 0 } }, // #50 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 40, 0 , 0 , 0 , 0 } }, // #51 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #52 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #53 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 0 , 0 , 0 , 0 } }, // #54 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 40, 40, 0 , 0 , 0 , 0 } }, // #55 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 9 , 0 , 0 , 0 , 0 } }, // #56 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 7 , 0 , 0 , 0 , 0 } }, // #57 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 13, 13, 0 , 0 , 0 , 0 } }, // #58 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 3 , 0 , 0 , 0 , 0 } }, // #59 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 10, 5 , 0 , 0 , 0 , 0 } }, // #60 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #61 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 52, 20, 0 , 0 , 0 , 0 } }, // #62 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 60, 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=3x]
- { InstDB::RWInfo::kCategoryMov , 29, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #64 [ref=1x]
- { InstDB::RWInfo::kCategoryMovabs , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #65 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 30, { 10, 5 , 0 , 0 , 0 , 0 } }, // #66 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #67 [ref=18x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 36, 64, 0 , 0 , 0 , 0 } }, // #68 [ref=1x]
- { InstDB::RWInfo::kCategoryMovh64 , 12, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #69 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 65, 7 , 0 , 0 , 0 , 0 } }, // #70 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 7 , 0 , 0 , 0 , 0 } }, // #71 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 5 , 0 , 0 , 0 , 0 } }, // #72 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 28, { 45, 9 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 66, 20, 0 , 0 , 0 , 0 } }, // #74 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 31, { 35, 7 , 0 , 0 , 0 , 0 } }, // #75 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 33, { 45, 9 , 0 , 0 , 0 , 0 } }, // #76 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 11, 3 , 0 , 0 , 0 , 0 } }, // #77 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 0 , 0 , 0 , 0 } }, // #78 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 3 , 0 , 0 , 0 , 0 } }, // #79 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 53, 22, 0 , 0 , 0 , 0 } }, // #80 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 53, 69, 0 , 0 , 0 , 0 } }, // #81 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 26, 7 , 0 , 0 , 0 , 0 } }, // #82 [ref=18x]
- { InstDB::RWInfo::kCategoryGeneric , 36, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #83 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 72, 5 , 0 , 0 , 0 , 0 } }, // #84 [ref=2x]
- { InstDB::RWInfo::kCategoryVmov1_8 , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #85 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 10, 9 , 0 , 0 , 0 , 0 } }, // #86 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 10, 13, 0 , 0 , 0 , 0 } }, // #87 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #88 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 0 , 0 , 0 } }, // #89 [ref=1x]
- { InstDB::RWInfo::kCategoryPunpcklxx , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #90 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 73, 0 , 0 , 0 , 0 } }, // #91 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #92 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 0 , 0 , 0 , 0 } }, // #93 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 21, 0 , 0 , 0 , 0 } }, // #94 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 66, 22, 0 , 0 , 0 , 0 } }, // #95 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 43, 3 , 0 , 0 , 0 , 0 } }, // #96 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 44, 0 , 0 , 0 , 0 } }, // #97 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 54, 9 , 0 , 0 , 0 , 0 } }, // #98 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 21, { 11, 13, 0 , 0 , 0 , 0 } }, // #99 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 81, 5 , 0 , 0 , 0 , 0 } }, // #100 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 11, 5 , 0 , 0 , 0 , 0 } }, // #101 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 43, { 43, 82, 0 , 0 , 0 , 0 } }, // #102 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 44, { 11, 7 , 0 , 0 , 0 , 0 } }, // #103 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 45, { 11, 9 , 0 , 0 , 0 , 0 } }, // #104 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 13, 13, 0 , 0 , 0 , 0 } }, // #105 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 11, 3 , 0 , 0 , 0 , 0 } }, // #106 [ref=7x]
- { InstDB::RWInfo::kCategoryVmov2_1 , 46, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #107 [ref=14x]
- { InstDB::RWInfo::kCategoryVmov1_2 , 16, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #108 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 10, 3 , 0 , 0 , 0 , 0 } }, // #109 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 46, { 11, 3 , 0 , 0 , 0 , 0 } }, // #110 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 47, { 11, 5 , 0 , 0 , 0 , 0 } }, // #111 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 5 , 0 , 0 , 0 , 0 } }, // #112 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 51, { 43, 44, 0 , 0 , 0 , 0 } }, // #113 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #114 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 2 , 3 , 0 , 0 , 0 , 0 } }, // #115 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 58, { 11, 3 , 0 , 0 , 0 , 0 } }, // #116 [ref=12x]
- { InstDB::RWInfo::kCategoryVmovddup , 38, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #117 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 64, 0 , 0 , 0 , 0 } }, // #118 [ref=2x]
- { InstDB::RWInfo::kCategoryVmovmskpd , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #119 [ref=1x]
- { InstDB::RWInfo::kCategoryVmovmskps , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #120 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 59, { 35, 7 , 0 , 0 , 0 , 0 } }, // #121 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 21, { 49, 13, 0 , 0 , 0 , 0 } }, // #122 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 3 , 3 , 0 , 0 , 0 , 0 } }, // #123 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 17, { 11, 40, 0 , 0 , 0 , 0 } }, // #124 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 7 , 0 , 0 , 0 , 0 } }, // #125 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 11, 13, 0 , 0 , 0 , 0 } }, // #126 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 3 , 0 , 0 , 0 , 0 } }, // #127 [ref=4x]
- { InstDB::RWInfo::kCategoryVmov1_4 , 62, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #128 [ref=6x]
- { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #129 [ref=9x]
- { InstDB::RWInfo::kCategoryVmov1_8 , 63, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #130 [ref=3x]
- { InstDB::RWInfo::kCategoryVmov4_1 , 47, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #131 [ref=4x]
- { InstDB::RWInfo::kCategoryVmov8_1 , 64, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #132 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 3 , 0 , 0 , 0 , 0 } }, // #133 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 90, 5 , 0 , 0 , 0 , 0 } }, // #134 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 90, 82, 0 , 0 , 0 , 0 } }, // #135 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 18, { 45, 9 , 0 , 0 , 0 , 0 } }, // #136 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 7 , 0 , 0 , 0 , 0 } }, // #137 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 2 , 0 , 0 , 0 , 0 } }, // #138 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 58, { 2 , 2 , 0 , 0 , 0 , 0 } } // #139 [ref=1x]
-};
-
-const InstDB::RWInfo InstDB::rwInfoB[] = {
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #0 [ref=791x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 1 , 0 , 0 , 0 , 0 , 0 } }, // #1 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 10, 5 , 0 , 0 , 0 , 0 } }, // #2 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #3 [ref=195x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 3 , 0 , 0 , 0 } }, // #4 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #5 [ref=14x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 4 , 5 , 14, 0 , 0 , 0 } }, // #6 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 0 , 0 , 0 , 0 , 0 } }, // #7 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #8 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 18, 0 , 0 , 0 , 0 , 0 } }, // #9 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #10 [ref=37x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 0 , 0 , 0 , 0 , 0 } }, // #11 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 19, 0 , 0 , 0 , 0 , 0 } }, // #12 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 2 , 3 , 0 , 0 , 0 } }, // #13 [ref=16x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 6 , 7 , 0 , 0 , 0 , 0 } }, // #14 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 8 , 9 , 0 , 0 , 0 , 0 } }, // #15 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 22, 0 , 0 , 0 } }, // #16 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 23, 18, 24, 25, 0 } }, // #17 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 26, 27, 28, 29, 30, 0 } }, // #18 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 31, 32, 16, 0 , 0 } }, // #19 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 28, 0 , 0 , 0 , 0 , 0 } }, // #20 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 2 , 0 , 0 , 0 , 0 , 0 } }, // #21 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 41, 42, 3 , 0 , 0 , 0 } }, // #22 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 18, { 45, 5 , 0 , 0 , 0 , 0 } }, // #23 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 0 , 0 , 0 , 0 , 0 } }, // #24 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #25 [ref=17x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 46, 0 , 0 , 0 , 0 , 0 } }, // #26 [ref=16x]
- { InstDB::RWInfo::kCategoryGeneric , 19, { 47, 0 , 0 , 0 , 0 , 0 } }, // #27 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 19, { 48, 0 , 0 , 0 , 0 , 0 } }, // #28 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 20, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #29 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 47, 0 , 0 , 0 , 0 , 0 } }, // #30 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 11, 0 , 0 , 0 , 0 , 0 } }, // #31 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 21, { 13, 0 , 0 , 0 , 0 , 0 } }, // #32 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #33 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 21, { 49, 0 , 0 , 0 , 0 , 0 } }, // #34 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 50, 0 , 0 , 0 , 0 , 0 } }, // #35 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 20, { 11, 0 , 0 , 0 , 0 , 0 } }, // #36 [ref=2x]
- { InstDB::RWInfo::kCategoryImul , 22, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #37 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 54, 0 , 0 , 0 , 0 , 0 } }, // #38 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 26, 0 , 0 , 0 , 0 , 0 } }, // #39 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 4 , 9 , 0 , 0 , 0 , 0 } }, // #40 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 4 , 5 , 0 , 0 , 0 , 0 } }, // #41 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 56, 57, 0 , 0 , 0 } }, // #42 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 40, 40, 0 , 0 , 0 } }, // #43 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 9 , 0 , 0 , 0 } }, // #44 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 7 , 0 , 0 , 0 } }, // #45 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 13, 0 , 0 , 0 } }, // #46 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 58, 40, 0 , 0 , 0 , 0 } }, // #47 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 9 , 0 , 0 , 0 , 0 } }, // #48 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #49 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 13, 0 , 0 , 0 , 0 } }, // #50 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 49, 40, 40, 0 , 0 , 0 } }, // #51 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 9 , 9 , 0 , 0 , 0 } }, // #52 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 13, 13, 0 , 0 , 0 } }, // #53 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 59, 0 , 0 , 0 , 0 , 0 } }, // #54 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 28, { 9 , 0 , 0 , 0 , 0 , 0 } }, // #55 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 44, 0 , 0 , 0 , 0 , 0 } }, // #56 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 13, 0 , 0 , 0 , 0 , 0 } }, // #57 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 3 , 0 , 0 , 0 , 0 , 0 } }, // #58 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 3 , 9 , 0 , 0 , 0 , 0 } }, // #59 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 5 , 5 , 61, 0 , 0 , 0 } }, // #60 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 7 , 7 , 62, 0 , 0 , 0 } }, // #61 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 63, 29, 56, 0 , 0 , 0 } }, // #62 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 32, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #63 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 67, 42, 3 , 0 , 0 , 0 } }, // #64 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 11, 3 , 68, 0 , 0 } }, // #65 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 17, 29, 30, 0 , 0 , 0 } }, // #66 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 3 , 0 , 0 , 0 , 0 , 0 } }, // #67 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 2 , 3 , 0 , 0 , 0 , 0 } }, // #68 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 70, 17, 56 } }, // #69 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 71, 17, 56 } }, // #70 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 70, 0 , 0 } }, // #71 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 3 , { 5 , 5 , 0 , 71, 0 , 0 } }, // #72 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 34, { 58, 5 , 0 , 0 , 0 , 0 } }, // #73 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 35, { 35, 5 , 0 , 0 , 0 , 0 } }, // #74 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 37, { 49, 3 , 0 , 0 , 0 , 0 } }, // #75 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 17, { 4 , 40, 0 , 0 , 0 , 0 } }, // #76 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 4 , 7 , 0 , 0 , 0 , 0 } }, // #77 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 2 , 13, 0 , 0 , 0 , 0 } }, // #78 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 10, { 11, 0 , 0 , 0 , 0 , 0 } }, // #79 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 35, 7 , 0 , 0 , 0 , 0 } }, // #80 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 11, 0 , 0 , 0 , 0 , 0 } }, // #81 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 29, 0 , 0 , 0 } }, // #82 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 45, 0 , 0 , 0 , 0 , 0 } }, // #83 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 35, 0 , 0 , 0 , 0 , 0 } }, // #84 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 16, 51, 70, 0 , 0 , 0 } }, // #85 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 2 , { 11, 3 , 0 , 0 , 0 , 0 } }, // #86 [ref=19x]
- { InstDB::RWInfo::kCategoryGeneric , 4 , { 36, 7 , 0 , 0 , 0 , 0 } }, // #87 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 37, 9 , 0 , 0 , 0 , 0 } }, // #88 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 74, 0 , 0 , 0 , 0 , 0 } }, // #89 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 7 , 0 , 0 , 0 , 0 , 0 } }, // #90 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 34, { 75, 0 , 0 , 0 , 0 , 0 } }, // #91 [ref=30x]
- { InstDB::RWInfo::kCategoryGeneric , 11, { 2 , 3 , 73, 0 , 0 , 0 } }, // #92 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 39, { 11, 0 , 0 , 0 , 0 , 0 } }, // #93 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 28, { 45, 0 , 0 , 0 , 0 , 0 } }, // #94 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 13, { 43, 0 , 0 , 0 , 0 , 0 } }, // #95 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 76, 44, 44, 0 , 0 , 0 } }, // #96 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 43, 0 , 0 , 0 , 0 , 0 } }, // #97 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 9 , 56, 17, 0 , 0 , 0 } }, // #98 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 76, 77, 78, 78, 78, 5 } }, // #99 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 4 , 79, 80, 80, 80, 5 } }, // #100 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 7 , 0 , 0 , 0 } }, // #101 [ref=8x]
- { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 13, 0 , 0 , 0 } }, // #102 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 9 , 0 , 0 , 0 } }, // #103 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 11, 3 , 3 , 3 , 0 , 0 } }, // #104 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 35, 3 , 3 , 0 , 0 , 0 } }, // #105 [ref=18x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 11, 5 , 7 , 0 , 0 , 0 } }, // #106 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 41, { 35, 13, 13, 0 , 0 , 0 } }, // #107 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 11, 5 , 9 , 0 , 0 , 0 } }, // #108 [ref=1x]
- { InstDB::RWInfo::kCategoryVmov1_2 , 48, { 0 , 0 , 0 , 0 , 0 , 0 } }, // #109 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 5 , 5 , 0 , 0 , 0 } }, // #110 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 83, 7 , 0 , 0 , 0 } }, // #111 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 5 , 5 , 0 , 0 , 0 } }, // #112 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 64, 3 , 0 , 0 , 0 } }, // #113 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 3 , 3 , 0 , 0 , 0 } }, // #114 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 49, { 10, 83, 3 , 0 , 0 , 0 } }, // #115 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 64, 9 , 0 , 0 , 0 } }, // #116 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 5 , 5 , 0 , 0 , 0 } }, // #117 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 0 , 0 , 0 } }, // #118 [ref=9x]
- { InstDB::RWInfo::kCategoryGeneric , 52, { 10, 82, 0 , 0 , 0 , 0 } }, // #119 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 52, { 10, 3 , 0 , 0 , 0 , 0 } }, // #120 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 53, { 81, 44, 0 , 0 , 0 , 0 } }, // #121 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 84, 3 , 3 , 0 , 0 , 0 } }, // #122 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 85, 5 , 5 , 0 , 0 , 0 } }, // #123 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #124 [ref=88x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 4 , 64, 7 , 0 , 0 , 0 } }, // #125 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 83, 9 , 0 , 0 , 0 } }, // #126 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 6 , 7 , 7 , 0 , 0 , 0 } }, // #127 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 41, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #128 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 8 , 9 , 9 , 0 , 0 , 0 } }, // #129 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 54, { 11, 3 , 3 , 3 , 0 , 0 } }, // #130 [ref=15x]
- { InstDB::RWInfo::kCategoryGeneric , 55, { 35, 7 , 7 , 7 , 0 , 0 } }, // #131 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 56, { 45, 9 , 9 , 9 , 0 , 0 } }, // #132 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 41, { 4 , 5 , 13, 0 , 0 , 0 } }, // #133 [ref=6x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 26, 7 , 7 , 0 , 0 , 0 } }, // #134 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 54, 9 , 9 , 0 , 0 , 0 } }, // #135 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 16, { 35, 3 , 0 , 0 , 0 , 0 } }, // #136 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 27, { 35, 13, 0 , 0 , 0 , 0 } }, // #137 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 5 , { 35, 9 , 0 , 0 , 0 , 0 } }, // #138 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #139 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 2 , 3 , 2 , 0 , 0 , 0 } }, // #140 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 14, { 4 , 3 , 4 , 0 , 0 , 0 } }, // #141 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 40, { 10, 64, 7 , 0 , 0 , 0 } }, // #142 [ref=11x]
- { InstDB::RWInfo::kCategoryGeneric , 41, { 10, 86, 13, 0 , 0 , 0 } }, // #143 [ref=7x]
- { InstDB::RWInfo::kCategoryGeneric , 42, { 10, 83, 9 , 0 , 0 , 0 } }, // #144 [ref=13x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 81, 82, 5 , 0 , 0 , 0 } }, // #145 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 11, 3 , 5 , 0 , 0 , 0 } }, // #146 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 57, { 43, 44, 82, 0 , 0 , 0 } }, // #147 [ref=4x]
- { InstDB::RWInfo::kCategoryVmaskmov , 0 , { 0 , 0 , 0 , 0 , 0 , 0 } }, // #148 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 35, 0 , 0 , 0 , 0 , 0 } }, // #149 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 22, 0 , 0 , 0 , 0 , 0 } }, // #150 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 64, 64, 0 , 0 , 0 } }, // #151 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 7 , 7 , 0 , 0 , 0 } }, // #152 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 7 , 7 , 0 , 0 , 0 } }, // #153 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 12, { 10, 64, 7 , 0 , 0 , 0 } }, // #154 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 64, 7 , 0 , 0 , 0 } }, // #155 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 86, 13, 0 , 0 , 0 } }, // #156 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 10, 83, 9 , 0 , 0 , 0 } }, // #157 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 87, 0 , 0 , 0 , 0 , 0 } }, // #158 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 60, { 88, 89, 3 , 3 , 0 , 0 } }, // #159 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 15, { 43, 77, 78, 78, 78, 5 } }, // #160 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 57, { 81, 82, 82, 0 , 0 , 0 } }, // #161 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 3 , 0 , 0 , 0 } }, // #162 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 7 , { 49, 5 , 0 , 0 , 0 , 0 } }, // #163 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 61, { 10, 5 , 40, 0 , 0 , 0 } }, // #164 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 10, 5 , 5 , 5 , 0 , 0 } }, // #165 [ref=12x]
- { InstDB::RWInfo::kCategoryGeneric , 65, { 10, 5 , 5 , 5 , 0 , 0 } }, // #166 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 66, { 10, 5 , 5 , 0 , 0 , 0 } }, // #167 [ref=12x]
- { InstDB::RWInfo::kCategoryGeneric , 67, { 11, 3 , 5 , 0 , 0 , 0 } }, // #168 [ref=5x]
- { InstDB::RWInfo::kCategoryGeneric , 68, { 11, 3 , 0 , 0 , 0 , 0 } }, // #169 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 69, { 11, 3 , 5 , 0 , 0 , 0 } }, // #170 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #171 [ref=1x]
- { InstDB::RWInfo::kCategoryGenericEx , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #172 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 90, 82, 5 , 0 , 0 , 0 } }, // #173 [ref=1x]
- { InstDB::RWInfo::kCategoryGeneric , 50, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #174 [ref=3x]
- { InstDB::RWInfo::kCategoryGeneric , 0 , { 56, 17, 29, 0 , 0 , 0 } }, // #175 [ref=2x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 56, 17, 0 , 0 , 0 } }, // #176 [ref=4x]
- { InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 56, 17, 0 , 0 , 0 } } // #177 [ref=8x]
-};
-
-const InstDB::RWInfoOp InstDB::rwInfoOp[] = {
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kNone }, // #0 [ref=17086x]
- { 0x0000000000000003u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId }, // #1 [ref=10x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #2 [ref=280x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #3 [ref=1132x]
- { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #4 [ref=107x]
- { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #5 [ref=356x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #6 [ref=18x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #7 [ref=186x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #8 [ref=18x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #9 [ref=135x]
- { 0x0000000000000000u, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #10 [ref=184x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #11 [ref=461x]
- { 0x0000000000000003u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kRW }, // #12 [ref=1x]
- { 0x0000000000000003u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #13 [ref=65x]
- { 0x000000000000FFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #14 [ref=4x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseWrite | OpRWFlags::kMemIndexWrite }, // #15 [ref=1x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #16 [ref=9x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #17 [ref=23x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #18 [ref=2x]
- { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #19 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #20 [ref=3x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #21 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #22 [ref=8x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #23 [ref=1x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #24 [ref=1x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #25 [ref=1x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #26 [ref=21x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #27 [ref=1x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #28 [ref=5x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #29 [ref=13x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x03, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #30 [ref=2x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x03, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #31 [ref=1x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #32 [ref=1x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #33 [ref=1x]
- { 0x00000000000000FFu, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #34 [ref=1x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #35 [ref=82x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #36 [ref=6x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #37 [ref=6x]
- { 0x0000000000000000u, 0x0000000000000003u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #38 [ref=1x]
- { 0x0000000000000003u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #39 [ref=1x]
- { 0x0000000000000001u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #40 [ref=28x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #41 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #42 [ref=3x]
- { 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #43 [ref=23x]
- { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #44 [ref=35x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #45 [ref=30x]
- { 0x00000000000003FFu, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #46 [ref=22x]
- { 0x00000000000003FFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #47 [ref=13x]
- { 0x0000000000000000u, 0x00000000000003FFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #48 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000003u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #49 [ref=17x]
- { 0x0000000000000000u, 0x0000000000000003u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #50 [ref=2x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #51 [ref=8x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #52 [ref=2x]
- { 0x0000000000000003u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #53 [ref=4x]
- { 0x000000000000000Fu, 0x000000000000000Fu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #54 [ref=4x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #55 [ref=1x]
- { 0x000000000000000Fu, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #56 [ref=23x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #57 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #58 [ref=14x]
- { 0x0000000000000000u, 0x0000000000000001u, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId }, // #59 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #60 [ref=3x]
- { 0x000000000000FFFFu, 0x000000000000FFFFu, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #61 [ref=2x]
- { 0x00000000000000FFu, 0x00000000000000FFu, 0x07, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kMemPhysId }, // #62 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #63 [ref=2x]
- { 0x000000000000FF00u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #64 [ref=23x]
- { 0x0000000000000000u, 0x000000000000FF00u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #65 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x07, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kMemBaseRW | OpRWFlags::kMemBasePostModify | OpRWFlags::kMemPhysId }, // #66 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kRegPhysId | OpRWFlags::kZExt }, // #67 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x02, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #68 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x06, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kMemPhysId }, // #69 [ref=1x]
- { 0x0000000000000000u, 0x000000000000000Fu, 0x01, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #70 [ref=5x]
- { 0x0000000000000000u, 0x000000000000FFFFu, 0x00, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #71 [ref=4x]
- { 0x0000000000000000u, 0x0000000000000007u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #72 [ref=2x]
- { 0x0000000000000001u, 0x0000000000000000u, 0x01, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #73 [ref=10x]
- { 0x0000000000000001u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kRegPhysId }, // #74 [ref=1x]
- { 0x0000000000000000u, 0x0000000000000001u, 0xFF, 0, { 0 }, OpRWFlags::kWrite }, // #75 [ref=30x]
- { 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt }, // #76 [ref=10x]
- { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #77 [ref=4x]
- { 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #78 [ref=12x]
- { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 4, { 0 }, OpRWFlags::kRead }, // #79 [ref=2x]
- { 0x000000000000FFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead | OpRWFlags::kConsecutive }, // #80 [ref=6x]
- { 0x0000000000000000u, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #81 [ref=10x]
- { 0x00000000FFFFFFFFu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #82 [ref=18x]
- { 0x000000000000FFF0u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #83 [ref=18x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique | OpRWFlags::kZExt }, // #84 [ref=4x]
- { 0x000000000000FFFFu, 0x000000000000FFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kUnique | OpRWFlags::kZExt }, // #85 [ref=4x]
- { 0x000000000000FFFCu, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kRead }, // #86 [ref=8x]
- { 0x0000000000000000u, 0x0000000000000000u, 0x00, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt | OpRWFlags::kRegPhysId }, // #87 [ref=1x]
- { 0x0000000000000000u, 0x00000000000000FFu, 0xFF, 2, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt }, // #88 [ref=2x]
- { 0x0000000000000000u, 0x0000000000000000u, 0xFF, 0, { 0 }, OpRWFlags::kWrite | OpRWFlags::kZExt | OpRWFlags::kConsecutive }, // #89 [ref=2x]
- { 0x00000000FFFFFFFFu, 0x00000000FFFFFFFFu, 0xFF, 0, { 0 }, OpRWFlags::kRW | OpRWFlags::kZExt } // #90 [ref=3x]
-};
-
-const InstDB::RWInfoRm InstDB::rwInfoRm[] = {
- { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , 0, 0 }, // #0 [ref=2083x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #1 [ref=8x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , 0, 0 }, // #2 [ref=204x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 16, 0, 0 }, // #3 [ref=122x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , 0, 0 }, // #4 [ref=66x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , 0, 0 }, // #5 [ref=35x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , 0, 0 }, // #6 [ref=314x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , 0, 0 }, // #7 [ref=9x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 0 , 0, 0 }, // #8 [ref=68x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 0 , 0, 0 }, // #9 [ref=1x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #10 [ref=21x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x01, 0 , 0, 0 }, // #11 [ref=14x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 8 , 0, 0 }, // #12 [ref=23x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 64, 0, 0 }, // #13 [ref=6x]
- { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #14 [ref=30x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 16, 0, 0 }, // #15 [ref=23x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #16 [ref=22x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 1 , 0, 0 }, // #17 [ref=5x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 4 , 0, 0 }, // #18 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 10, 0, 0 }, // #19 [ref=2x]
- { InstDB::RWInfoRm::kCategoryNone , 0x01, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #20 [ref=5x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 2 , 0, 0 }, // #21 [ref=6x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , 0, 0 }, // #22 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 1 , 0, 0 }, // #23 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 4 , 0, 0 }, // #24 [ref=3x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , 0, 0 }, // #25 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 2 , 0, 0 }, // #26 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 2 , 0, 0 }, // #27 [ref=13x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 4 , 0, 0 }, // #28 [ref=6x]
- { InstDB::RWInfoRm::kCategoryNone , 0x03, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #29 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 16, 0, 0 }, // #30 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , InstDB::RWInfoRm::kFlagMovssMovsd, 0 }, // #31 [ref=1x]
- { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagMovssMovsd, 0 }, // #32 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 4 , InstDB::RWInfoRm::kFlagMovssMovsd, 0 }, // #33 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 1 , 0, 0 }, // #34 [ref=32x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 8 , 0, 0 }, // #35 [ref=4x]
- { InstDB::RWInfoRm::kCategoryNone , 0x00, 0 , InstDB::RWInfoRm::kFlagPextrw, 0 }, // #36 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , InstDB::RWInfoRm::kFlagPextrw, uint32_t(CpuFeatures::X86::kSSE4_1) }, // #37 [ref=1x]
- { InstDB::RWInfoRm::kCategoryNone , 0x02, 0 , 0, 0 }, // #38 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 2 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #39 [ref=3x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 8 , 0, 0 }, // #40 [ref=35x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 2 , 0, 0 }, // #41 [ref=30x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 4 , 0, 0 }, // #42 [ref=42x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x00, 32, 0, 0 }, // #43 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #44 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 4 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #45 [ref=1x]
- { InstDB::RWInfoRm::kCategoryHalf , 0x02, 0 , 0, 0 }, // #46 [ref=19x]
- { InstDB::RWInfoRm::kCategoryQuarter , 0x02, 0 , 0, 0 }, // #47 [ref=9x]
- { InstDB::RWInfoRm::kCategoryHalf , 0x01, 0 , 0, 0 }, // #48 [ref=10x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x04, 0 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #49 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 16, 0, 0 }, // #50 [ref=30x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x02, 64, 0, 0 }, // #51 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 16, 0, 0 }, // #52 [ref=6x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x01, 32, 0, 0 }, // #53 [ref=4x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x0C, 0 , 0, 0 }, // #54 [ref=15x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 8 , 0, 0 }, // #55 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 4 , 0, 0 }, // #56 [ref=4x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 32, 0, 0 }, // #57 [ref=6x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x03, 0 , 0, 0 }, // #58 [ref=13x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x03, 8 , InstDB::RWInfoRm::kFlagAmbiguous, 0 }, // #59 [ref=1x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x08, 0 , 0, 0 }, // #60 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x04, 1 , 0, 0 }, // #61 [ref=1x]
- { InstDB::RWInfoRm::kCategoryQuarter , 0x01, 0 , 0, 0 }, // #62 [ref=6x]
- { InstDB::RWInfoRm::kCategoryEighth , 0x01, 0 , 0, 0 }, // #63 [ref=3x]
- { InstDB::RWInfoRm::kCategoryEighth , 0x02, 0 , 0, 0 }, // #64 [ref=2x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x0C, 16, 0, 0 }, // #65 [ref=1x]
- { InstDB::RWInfoRm::kCategoryFixed , 0x06, 16, 0, 0 }, // #66 [ref=12x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , InstDB::RWInfoRm::kFlagFeatureIfRMI, uint32_t(CpuFeatures::X86::kAVX512_F) }, // #67 [ref=5x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x02, 0 , InstDB::RWInfoRm::kFlagFeatureIfRMI, uint32_t(CpuFeatures::X86::kAVX512_BW) }, // #68 [ref=2x]
- { InstDB::RWInfoRm::kCategoryConsistent, 0x06, 0 , InstDB::RWInfoRm::kFlagFeatureIfRMI, uint32_t(CpuFeatures::X86::kAVX512_BW) } // #69 [ref=3x]
-};
-// ----------------------------------------------------------------------------
-// ${InstRWInfoTable:End}
-
-// x86::InstDB - Tests
-// ===================
-
-#if defined(ASMJIT_TEST)
-UNIT(x86_inst_db) {
- INFO("Checking validity of Inst enums");
-
- // Cross-validate prefixes.
- EXPECT_EQ(uint32_t(InstOptions::kX86_Rex ), 0x40000000u)
- .message("REX prefix must be at 0x40000000");
-
- EXPECT_EQ(uint32_t(InstOptions::kX86_Evex), 0x00001000u)
- .message("EVEX prefix must be at 0x00001000");
-
- // These could be combined together to form a valid REX prefix, they must match.
- EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeB), uint32_t(Opcode::kB))
- .message("Opcode::kB must match InstOptions::kX86_OpCodeB");
-
- EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeX), uint32_t(Opcode::kX))
- .message("Opcode::kX must match InstOptions::kX86_OpCodeX");
-
- EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeR), uint32_t(Opcode::kR))
- .message("Opcode::kR must match InstOptions::kX86_OpCodeR");
-
- EXPECT_EQ(uint32_t(InstOptions::kX86_OpCodeW), uint32_t(Opcode::kW))
- .message("Opcode::kW must match InstOptions::kX86_OpCodeW");
-
- uint32_t rex_rb = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kB >> Opcode::kREX_Shift) | 0x40;
- uint32_t rex_rw = (Opcode::kR >> Opcode::kREX_Shift) | (Opcode::kW >> Opcode::kREX_Shift) | 0x40;
-
- EXPECT_EQ(rex_rb, 0x45u)
- .message("Opcode::kR|B must form a valid REX prefix (0x45) if combined with 0x40");
-
- EXPECT_EQ(rex_rw, 0x4Cu)
- .message("Opcode::kR|W must form a valid REX prefix (0x4C) if combined with 0x40");
-}
-#endif
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86instdb.h b/3rdparty/asmjit/src/asmjit/x86/x86instdb.h
deleted file mode 100644
index 2bf7d148957..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86instdb.h
+++ /dev/null
@@ -1,563 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86INSTDB_H_INCLUDED
-#define ASMJIT_X86_X86INSTDB_H_INCLUDED
-
-#include "../x86/x86globals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \addtogroup asmjit_x86
-//! \{
-
-//! Instruction database (X86).
-namespace InstDB {
-
-//! Describes which operation mode is supported by an instruction.
-enum class Mode : uint8_t {
- //! Invalid mode.
- kNone = 0x00u,
- //! X86 mode supported.
- kX86 = 0x01u,
- //! X64 mode supported.
- kX64 = 0x02u,
- //! Both X86 and X64 modes supported.
- kAny = 0x03u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(Mode)
-
-//! Converts architecture to operation mode, see \ref Mode.
-static ASMJIT_INLINE_NODEBUG constexpr Mode modeFromArch(Arch arch) noexcept {
- return arch == Arch::kX86 ? Mode::kX86 :
- arch == Arch::kX64 ? Mode::kX64 : Mode::kNone;
-}
-
-//! Operand signature flags used by \ref OpSignature.
-enum class OpFlags : uint64_t {
- //! No operand flags.
- kNone = 0u,
-
- kRegGpbLo = 0x0000000000000001u, //!< Operand can be low 8-bit GPB register.
- kRegGpbHi = 0x0000000000000002u, //!< Operand can be high 8-bit GPB register.
- kRegGpw = 0x0000000000000004u, //!< Operand can be 16-bit GPW register.
- kRegGpd = 0x0000000000000008u, //!< Operand can be 32-bit GPD register.
- kRegGpq = 0x0000000000000010u, //!< Operand can be 64-bit GPQ register.
- kRegXmm = 0x0000000000000020u, //!< Operand can be 128-bit XMM register.
- kRegYmm = 0x0000000000000040u, //!< Operand can be 256-bit YMM register.
- kRegZmm = 0x0000000000000080u, //!< Operand can be 512-bit ZMM register.
- kRegMm = 0x0000000000000100u, //!< Operand can be 64-bit MM register.
- kRegKReg = 0x0000000000000200u, //!< Operand can be 64-bit K register.
- kRegSReg = 0x0000000000000400u, //!< Operand can be SReg (segment register).
- kRegCReg = 0x0000000000000800u, //!< Operand can be CReg (control register).
- kRegDReg = 0x0000000000001000u, //!< Operand can be DReg (debug register).
- kRegSt = 0x0000000000002000u, //!< Operand can be 80-bit ST register (X87).
- kRegBnd = 0x0000000000004000u, //!< Operand can be 128-bit BND register.
- kRegTmm = 0x0000000000008000u, //!< Operand can be 0..8192-bit TMM register.
- kRegMask = 0x000000000000FFFFu, //!< Mask of all possible register types.
-
- kMemUnspecified = 0x0000000000040000u, //!< Operand can be a scalar memory pointer without size.
- kMem8 = 0x0000000000080000u, //!< Operand can be an 8-bit memory pointer.
- kMem16 = 0x0000000000100000u, //!< Operand can be a 16-bit memory pointer.
- kMem32 = 0x0000000000200000u, //!< Operand can be a 32-bit memory pointer.
- kMem48 = 0x0000000000400000u, //!< Operand can be a 48-bit memory pointer (FAR pointers only).
- kMem64 = 0x0000000000800000u, //!< Operand can be a 64-bit memory pointer.
- kMem80 = 0x0000000001000000u, //!< Operand can be an 80-bit memory pointer.
- kMem128 = 0x0000000002000000u, //!< Operand can be a 128-bit memory pointer.
- kMem256 = 0x0000000004000000u, //!< Operand can be a 256-bit memory pointer.
- kMem512 = 0x0000000008000000u, //!< Operand can be a 512-bit memory pointer.
- kMem1024 = 0x0000000010000000u, //!< Operand can be a 1024-bit memory pointer.
- kMemMask = 0x000000001FFC0000u, //!< Mask of all possible scalar memory types.
-
- kVm32x = 0x0000000040000000u, //!< Operand can be a vm32x (vector) pointer.
- kVm32y = 0x0000000080000000u, //!< Operand can be a vm32y (vector) pointer.
- kVm32z = 0x0000000100000000u, //!< Operand can be a vm32z (vector) pointer.
- kVm64x = 0x0000000200000000u, //!< Operand can be a vm64x (vector) pointer.
- kVm64y = 0x0000000400000000u, //!< Operand can be a vm64y (vector) pointer.
- kVm64z = 0x0000000800000000u, //!< Operand can be a vm64z (vector) pointer.
- kVmMask = 0x0000000FC0000000u, //!< Mask of all possible vector memory types.
-
- kImmI4 = 0x0000001000000000u, //!< Operand can be signed 4-bit immediate.
- kImmU4 = 0x0000002000000000u, //!< Operand can be unsigned 4-bit immediate.
- kImmI8 = 0x0000004000000000u, //!< Operand can be signed 8-bit immediate.
- kImmU8 = 0x0000008000000000u, //!< Operand can be unsigned 8-bit immediate.
- kImmI16 = 0x0000010000000000u, //!< Operand can be signed 16-bit immediate.
- kImmU16 = 0x0000020000000000u, //!< Operand can be unsigned 16-bit immediate.
- kImmI32 = 0x0000040000000000u, //!< Operand can be signed 32-bit immediate.
- kImmU32 = 0x0000080000000000u, //!< Operand can be unsigned 32-bit immediate.
- kImmI64 = 0x0000100000000000u, //!< Operand can be signed 64-bit immediate.
- kImmU64 = 0x0000200000000000u, //!< Operand can be unsigned 64-bit immediate.
- kImmMask = 0x00003FF000000000u, //!< Mask of all immediate types.
-
- kRel8 = 0x0000400000000000u, //!< Operand can be relative 8-bit displacement.
- kRel32 = 0x0000800000000000u, //!< Operand can be relative 32-bit displacement.
- kRelMask = 0x0000C00000000000u, //!< Mask of all relative displacement types.
-
- kFlagMemBase = 0x0001000000000000u, //!< Flag: Only memory base is allowed (no index, no offset).
- kFlagMemDs = 0x0002000000000000u, //!< Flag: Implicit memory operand's DS segment.
- kFlagMemEs = 0x0004000000000000u, //!< Flag: Implicit memory operand's ES segment.
-
- kFlagMib = 0x0008000000000000u, //!< Flag: Operand is MIB (base+index) pointer.
- kFlagTMem = 0x0010000000000000u, //!< Flag: Operand is TMEM (sib_mem), AMX memory pointer.
-
- kFlagImplicit = 0x0080000000000000u, //!< Flag: Operand is implicit.
- kFlagMask = 0x009F000000000000u, //!< Mask of all flags.
-
- //! Contains mask of all registers, memory operands, immediate operands, and displacement operands.
- kOpMask = kRegMask | kMemMask | kVmMask | kImmMask | kRelMask
-};
-ASMJIT_DEFINE_ENUM_FLAGS(OpFlags)
-
-//! Operand signature.
-//!
-//! Contains all possible operand combinations, memory size information, and a fixed register id (or `BaseReg::kIdBad`
-//! if fixed id isn't required).
-struct OpSignature {
- //! \name Members
- //! \{
-
- uint64_t _flags : 56;
- uint64_t _regMask : 8;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns operand signature flags.
- inline OpFlags flags() const noexcept { return (OpFlags)_flags; }
-
- //! Tests whether the given `flag` is set.
- inline bool hasFlag(OpFlags flag) const noexcept { return (_flags & uint64_t(flag)) != 0; }
-
- //! Tests whether this signature contains at least one register operand of any type.
- inline bool hasReg() const noexcept { return hasFlag(OpFlags::kRegMask); }
- //! Tests whether this signature contains at least one scalar memory operand of any type.
- inline bool hasMem() const noexcept { return hasFlag(OpFlags::kMemMask); }
- //! Tests whether this signature contains at least one vector memory operand of any type.
- inline bool hasVm() const noexcept { return hasFlag(OpFlags::kVmMask); }
- //! Tests whether this signature contains at least one immediate operand of any type.
- inline bool hasImm() const noexcept { return hasFlag(OpFlags::kImmMask); }
- //! Tests whether this signature contains at least one relative displacement operand of any type.
- inline bool hasRel() const noexcept { return hasFlag(OpFlags::kRelMask); }
-
- //! Tests whether the operand is implicit.
- inline bool isImplicit() const noexcept { return hasFlag(OpFlags::kFlagImplicit); }
-
- //! Returns a physical register mask.
- inline RegMask regMask() const noexcept { return _regMask; }
-
- //! \}
-};
-
-ASMJIT_VARAPI const OpSignature _opSignatureTable[];
-
-//! Instruction signature.
-//!
-//! Contains a sequence of operands' combinations and other metadata that defines a single instruction. This data is
-//! used by instruction validator.
-struct InstSignature {
- //! \name Members
- //! \{
-
- //! Count of operands in `opIndex` (0..6).
- uint8_t _opCount : 3;
- //! Architecture modes supported (X86 / X64).
- uint8_t _mode : 2;
- //! Number of implicit operands.
- uint8_t _implicitOpCount : 3;
- //! Reserved for future use.
- uint8_t _reserved;
- //! Indexes to `OpSignature` table.
- uint8_t _opSignatureIndexes[Globals::kMaxOpCount];
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns instruction operation mode.
- inline Mode mode() const noexcept { return (Mode)_mode; }
- //! Tests whether the instruction supports the given operating mode.
- inline bool supportsMode(Mode mode) const noexcept { return (uint8_t(_mode) & uint8_t(mode)) != 0; }
-
- //! Returns the number of operands of this signature.
- inline uint32_t opCount() const noexcept { return _opCount; }
- //! Returns the number of implicit operands this signature has.
- inline uint32_t implicitOpCount() const noexcept { return _implicitOpCount; }
- //! Tests whether this instruction signature has at least one implicit operand.
- inline bool hasImplicitOperands() const noexcept { return _implicitOpCount != 0; }
-
- //! Returns indexes to \ref _opSignatureTable for each operand of the instruction.
- //!
- //! \note The returned array always provides indexes for all operands (see \ref Globals::kMaxOpCount) even if the
- //! instruction provides less operands. Undefined operands have always index of zero.
- inline const uint8_t* opSignatureIndexes() const noexcept { return _opSignatureIndexes; }
-
- //! Returns index to \ref _opSignatureTable, corresponding to the requested operand `index` of the instruction.
- inline uint8_t opSignatureIndex(size_t index) const noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxOpCount);
- return _opSignatureIndexes[index];
- }
-
- //! Returns \ref OpSignature corresponding to the requested operand `index` of the instruction.
- inline const OpSignature& opSignature(size_t index) const noexcept {
- ASMJIT_ASSERT(index < Globals::kMaxOpCount);
- return _opSignatureTable[_opSignatureIndexes[index]];
- }
-
- //! \}
-};
-
-ASMJIT_VARAPI const InstSignature _instSignatureTable[];
-
-//! Instruction flags.
-//!
-//! Details about instruction encoding, operation, features, and some limitations.
-enum class InstFlags : uint32_t {
- //! No flags.
- kNone = 0x00000000u,
-
- // Instruction Family
- // ------------------
- //
- // Instruction family information.
-
- //! Instruction that accesses FPU registers.
- kFpu = 0x00000100u,
- //! Instruction that accesses MMX registers (including 3DNOW and GEODE) and EMMS.
- kMmx = 0x00000200u,
- //! Instruction that accesses XMM registers (SSE, AVX, AVX512).
- kVec = 0x00000400u,
-
- // FPU Flags
- // ---------
- //
- // Used to tell the encoder which memory operand sizes are encodable.
-
- //! FPU instruction can address `word_ptr` (shared with M80).
- kFpuM16 = 0x00000800u,
- //! FPU instruction can address `dword_ptr`.
- kFpuM32 = 0x00001000u,
- //! FPU instruction can address `qword_ptr`.
- kFpuM64 = 0x00002000u,
- //! FPU instruction can address `tword_ptr` (shared with M16).
- kFpuM80 = 0x00000800u,
-
- // Prefixes and Encoding Flags
- // ---------------------------
- //
- // These describe optional X86 prefixes that can be used to change the instruction's operation.
-
- //! Instruction can be prefixed with using the REP(REPE) or REPNE prefix.
- kRep = 0x00004000u,
- //! Rep prefix is accepted, but it has no effect other than being emitted with the instruction (as an extra byte).
- kRepIgnored = 0x00008000u,
- //! Instruction can be prefixed with using the LOCK prefix.
- kLock = 0x00010000u,
- //! Instruction can be prefixed with using the XACQUIRE prefix.
- kXAcquire = 0x00020000u,
- //! Instruction can be prefixed with using the XRELEASE prefix.
- kXRelease = 0x00040000u,
- //! Instruction uses MIB (BNDLDX|BNDSTX) to encode two registers.
- kMib = 0x00080000u,
- //! Instruction uses VSIB instead of legacy SIB.
- kVsib = 0x00100000u,
- //! Instruction uses TSIB (or SIB_MEM) encoding (MODRM followed by SIB).
- kTsib = 0x00200000u,
-
- // If both `kPrefixVex` and `kPrefixEvex` flags are specified it means that the instructions can be encoded
- // by either VEX or EVEX prefix. In that case AsmJit checks global options and also instruction options to decide
- // whether to emit VEX or EVEX prefix.
-
- //! Instruction can be encoded by VEX|XOP (AVX|AVX2|BMI|XOP|...).
- kVex = 0x00400000u,
- //! Instruction can be encoded by EVEX (AVX512).
- kEvex = 0x00800000u,
- //! EVEX encoding is preferred over VEX encoding (AVX515_VNNI vs AVX_VNNI).
- kPreferEvex = 0x01000000u,
- //! EVEX and VEX signatures are compatible.
- kEvexCompat = 0x02000000u,
- //! EVEX instruction requires K register in the first operand (compare instructions).
- kEvexKReg = 0x04000000u,
- //! EVEX instruction requires two operands and K register as a selector (gather instructions).
- kEvexTwoOp = 0x08000000u,
- //! VEX instruction that can be transformed to a compatible EVEX instruction.
- kEvexTransformable = 0x10000000u,
-
- // Other Flags
- // -----------
-
- //! Instruction uses consecutive registers.
- //!
- //! Used by V4FMADDPS, V4FMADDSS, V4FNMADDPS, V4FNMADDSS, VP4DPWSSD, VP4DPWSSDS, VP2INTERSECTD, and VP2INTERSECTQ
- //! instructions
- kConsecutiveRegs = 0x20000000u
-};
-ASMJIT_DEFINE_ENUM_FLAGS(InstFlags)
-
-//! AVX-512 flags.
-enum class Avx512Flags : uint32_t {
- //! No AVX-512 flags.
- kNone = 0,
-
- //! Internally used in tables, has no meaning.
- k_ = 0x00000000u,
- //! Supports masking {k1..k7}.
- kK = 0x00000001u,
- //! Supports zeroing {z}, must be used together with `kAvx512k`.
- kZ = 0x00000002u,
- //! Supports 'embedded-rounding' {er} with implicit {sae},
- kER = 0x00000004u,
- //! Supports 'suppress-all-exceptions' {sae}.
- kSAE = 0x00000008u,
- //! Supports 16-bit broadcast 'b16'.
- kB16 = 0x00000010u,
- //! Supports 32-bit broadcast 'b32'.
- kB32 = 0x00000020u,
- //! Supports 64-bit broadcast 'b64'.
- kB64 = 0x00000040u,
- //! Operates on a vector of consecutive registers (AVX512_4FMAPS and AVX512_4VNNIW).
- kT4X = 0x00000080u,
-
- //! Implicit zeroing if {k} masking is used. Using {z} is not valid in this case as it's implicit.
- kImplicitZ = 0x00000100,
-};
-ASMJIT_DEFINE_ENUM_FLAGS(Avx512Flags)
-
-//! Instruction common information.
-//!
-//! Aggregated information shared across one or more instruction.
-struct CommonInfo {
- //! Instruction flags.
- uint32_t _flags;
- //! Reserved for future use.
- uint32_t _avx512Flags : 11;
- //! First `InstSignature` entry in the database.
- uint32_t _iSignatureIndex : 11;
- //! Number of relevant `ISignature` entries.
- uint32_t _iSignatureCount : 5;
- //! Instruction control flow category, see \ref InstControlFlow.
- uint32_t _controlFlow : 3;
- //! Specifies what happens if all source operands share the same register.
- uint32_t _sameRegHint : 2;
-
- //! \name Accessors
- //! \{
-
- //! Returns instruction flags.
- ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return (InstFlags)_flags; }
- //! Tests whether the instruction has a `flag`.
- ASMJIT_INLINE_NODEBUG bool hasFlag(InstFlags flag) const noexcept { return Support::test(_flags, flag); }
-
- //! Returns instruction AVX-512 flags.
- ASMJIT_INLINE_NODEBUG Avx512Flags avx512Flags() const noexcept { return (Avx512Flags)_avx512Flags; }
- //! Tests whether the instruction has an AVX-512 `flag`.
- ASMJIT_INLINE_NODEBUG bool hasAvx512Flag(Avx512Flags flag) const noexcept { return Support::test(_avx512Flags, flag); }
-
- //! Tests whether the instruction is FPU instruction.
- ASMJIT_INLINE_NODEBUG bool isFpu() const noexcept { return hasFlag(InstFlags::kFpu); }
- //! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS).
- ASMJIT_INLINE_NODEBUG bool isMmx() const noexcept { return hasFlag(InstFlags::kMmx); }
- //! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers.
- ASMJIT_INLINE_NODEBUG bool isVec() const noexcept { return hasFlag(InstFlags::kVec); }
- //! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers.
- ASMJIT_INLINE_NODEBUG bool isSse() const noexcept { return (flags() & (InstFlags::kVec | InstFlags::kVex | InstFlags::kEvex)) == InstFlags::kVec; }
- //! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers.
- ASMJIT_INLINE_NODEBUG bool isAvx() const noexcept { return isVec() && isVexOrEvex(); }
-
- //! Tests whether the instruction can be prefixed with LOCK prefix.
- ASMJIT_INLINE_NODEBUG bool hasLockPrefix() const noexcept { return hasFlag(InstFlags::kLock); }
- //! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix.
- ASMJIT_INLINE_NODEBUG bool hasRepPrefix() const noexcept { return hasFlag(InstFlags::kRep); }
- //! Tests whether the instruction can be prefixed with XACQUIRE prefix.
- ASMJIT_INLINE_NODEBUG bool hasXAcquirePrefix() const noexcept { return hasFlag(InstFlags::kXAcquire); }
- //! Tests whether the instruction can be prefixed with XRELEASE prefix.
- ASMJIT_INLINE_NODEBUG bool hasXReleasePrefix() const noexcept { return hasFlag(InstFlags::kXRelease); }
-
- //! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect).
- ASMJIT_INLINE_NODEBUG bool isRepIgnored() const noexcept { return hasFlag(InstFlags::kRepIgnored); }
- //! Tests whether the instruction uses MIB.
- ASMJIT_INLINE_NODEBUG bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); }
- //! Tests whether the instruction uses VSIB.
- ASMJIT_INLINE_NODEBUG bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); }
- //! Tests whether the instruction uses TSIB (AMX, instruction requires MOD+SIB).
- ASMJIT_INLINE_NODEBUG bool isTsibOp() const noexcept { return hasFlag(InstFlags::kTsib); }
- //! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable).
- ASMJIT_INLINE_NODEBUG bool isVex() const noexcept { return hasFlag(InstFlags::kVex); }
- //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- ASMJIT_INLINE_NODEBUG bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); }
- //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- ASMJIT_INLINE_NODEBUG bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); }
-
- //! Tests whether the instruction should prefer EVEX prefix instead of VEX prefix.
- ASMJIT_INLINE_NODEBUG bool preferEvex() const noexcept { return hasFlag(InstFlags::kPreferEvex); }
-
- ASMJIT_INLINE_NODEBUG bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); }
- ASMJIT_INLINE_NODEBUG bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); }
- ASMJIT_INLINE_NODEBUG bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); }
- ASMJIT_INLINE_NODEBUG bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); }
-
- //! Tests whether the instruction supports AVX512 masking {k}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); }
- //! Tests whether the instruction supports AVX512 zeroing {k}{z}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); }
- //! Tests whether the instruction supports AVX512 embedded-rounding {er}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); }
- //! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); }
- //! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
- //! Tests whether the instruction supports AVX512 broadcast (16-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); }
- //! Tests whether the instruction supports AVX512 broadcast (32-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); }
- //! Tests whether the instruction supports AVX512 broadcast (64-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); }
-
- // Returns the size of the broadcast - either 2, 4, or 8, or 0 if broadcast is not supported.
- ASMJIT_INLINE_NODEBUG uint32_t broadcastSize() const noexcept {
- constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(Avx512Flags::kB16)>::value;
- return (uint32_t(_avx512Flags) & uint32_t(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64)) >> (kShift - 1);
- }
-
- ASMJIT_INLINE_NODEBUG uint32_t signatureIndex() const noexcept { return _iSignatureIndex; }
- ASMJIT_INLINE_NODEBUG uint32_t signatureCount() const noexcept { return _iSignatureCount; }
-
- ASMJIT_INLINE_NODEBUG const InstSignature* signatureData() const noexcept { return _instSignatureTable + _iSignatureIndex; }
- ASMJIT_INLINE_NODEBUG const InstSignature* signatureEnd() const noexcept { return _instSignatureTable + _iSignatureIndex + _iSignatureCount; }
-
- //! Returns a control flow category of the instruction.
- ASMJIT_INLINE_NODEBUG InstControlFlow controlFlow() const noexcept { return (InstControlFlow)_controlFlow; }
-
- //! Returns a hint that can be used when both inputs are the same register.
- ASMJIT_INLINE_NODEBUG InstSameRegHint sameRegHint() const noexcept { return (InstSameRegHint)_sameRegHint; }
-
- //! \}
-};
-
-ASMJIT_VARAPI const CommonInfo _commonInfoTable[];
-
-//! Instruction information.
-struct InstInfo {
- //! Reserved for future use.
- uint32_t _reserved : 14;
- //! Index to \ref _commonInfoTable.
- uint32_t _commonInfoIndex : 10;
- //! Index to \ref _additionalInfoTable.
- uint32_t _additionalInfoIndex : 8;
-
- //! Instruction encoding (internal encoding identifier used by \ref Assembler).
- uint8_t _encoding;
- //! Main opcode value (0..255).
- uint8_t _mainOpcodeValue;
- //! Index to \ref _mainOpcodeTable` that is combined with \ref _mainOpcodeValue to form the final opcode.
- uint8_t _mainOpcodeIndex;
- //! Index to \ref _altOpcodeTable that contains a full alternative opcode.
- uint8_t _altOpcodeIndex;
-
- //! \name Accessors
- //! \{
-
- //! Returns common information, see \ref CommonInfo.
- ASMJIT_INLINE_NODEBUG const CommonInfo& commonInfo() const noexcept { return _commonInfoTable[_commonInfoIndex]; }
-
- //! Returns instruction flags, see \ref InstFlags.
- ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return commonInfo().flags(); }
- //! Tests whether the instruction has flag `flag`, see \ref InstFlags.
- ASMJIT_INLINE_NODEBUG bool hasFlag(InstFlags flag) const noexcept { return commonInfo().hasFlag(flag); }
-
- //! Returns instruction AVX-512 flags, see \ref Avx512Flags.
- ASMJIT_INLINE_NODEBUG Avx512Flags avx512Flags() const noexcept { return commonInfo().avx512Flags(); }
- //! Tests whether the instruction has an AVX-512 `flag`, see \ref Avx512Flags.
- ASMJIT_INLINE_NODEBUG bool hasAvx512Flag(Avx512Flags flag) const noexcept { return commonInfo().hasAvx512Flag(flag); }
-
- //! Tests whether the instruction is FPU instruction.
- ASMJIT_INLINE_NODEBUG bool isFpu() const noexcept { return commonInfo().isFpu(); }
- //! Tests whether the instruction is MMX/3DNOW instruction that accesses MMX registers (includes EMMS and FEMMS).
- ASMJIT_INLINE_NODEBUG bool isMmx() const noexcept { return commonInfo().isMmx(); }
- //! Tests whether the instruction is SSE|AVX|AVX512 instruction that accesses XMM|YMM|ZMM registers.
- ASMJIT_INLINE_NODEBUG bool isVec() const noexcept { return commonInfo().isVec(); }
- //! Tests whether the instruction is SSE+ (SSE4.2, AES, SHA included) instruction that accesses XMM registers.
- ASMJIT_INLINE_NODEBUG bool isSse() const noexcept { return commonInfo().isSse(); }
- //! Tests whether the instruction is AVX+ (FMA included) instruction that accesses XMM|YMM|ZMM registers.
- ASMJIT_INLINE_NODEBUG bool isAvx() const noexcept { return commonInfo().isAvx(); }
-
- //! Tests whether the instruction can be prefixed with LOCK prefix.
- ASMJIT_INLINE_NODEBUG bool hasLockPrefix() const noexcept { return commonInfo().hasLockPrefix(); }
- //! Tests whether the instruction can be prefixed with REP (REPE|REPZ) prefix.
- ASMJIT_INLINE_NODEBUG bool hasRepPrefix() const noexcept { return commonInfo().hasRepPrefix(); }
- //! Tests whether the instruction can be prefixed with XACQUIRE prefix.
- ASMJIT_INLINE_NODEBUG bool hasXAcquirePrefix() const noexcept { return commonInfo().hasXAcquirePrefix(); }
- //! Tests whether the instruction can be prefixed with XRELEASE prefix.
- ASMJIT_INLINE_NODEBUG bool hasXReleasePrefix() const noexcept { return commonInfo().hasXReleasePrefix(); }
-
- //! Tests whether the rep prefix is supported by the instruction, but ignored (has no effect).
- ASMJIT_INLINE_NODEBUG bool isRepIgnored() const noexcept { return commonInfo().isRepIgnored(); }
- //! Tests whether the instruction uses MIB.
- ASMJIT_INLINE_NODEBUG bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); }
- //! Tests whether the instruction uses VSIB.
- ASMJIT_INLINE_NODEBUG bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); }
- //! Tests whether the instruction uses VEX (can be set together with EVEX if both are encodable).
- ASMJIT_INLINE_NODEBUG bool isVex() const noexcept { return hasFlag(InstFlags::kVex); }
- //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- ASMJIT_INLINE_NODEBUG bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); }
- //! Tests whether the instruction uses EVEX (can be set together with VEX if both are encodable).
- ASMJIT_INLINE_NODEBUG bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); }
-
- ASMJIT_INLINE_NODEBUG bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); }
- ASMJIT_INLINE_NODEBUG bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); }
- ASMJIT_INLINE_NODEBUG bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); }
- ASMJIT_INLINE_NODEBUG bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); }
-
- //! Tests whether the instruction supports AVX512 masking {k}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); }
- //! Tests whether the instruction supports AVX512 zeroing {k}{z}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); }
- //! Tests whether the instruction supports AVX512 embedded-rounding {er}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); }
- //! Tests whether the instruction supports AVX512 suppress-all-exceptions {sae}.
- ASMJIT_INLINE_NODEBUG bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); }
- //! Tests whether the instruction supports AVX512 broadcast (either 32-bit or 64-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
- //! Tests whether the instruction supports AVX512 broadcast (16-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); }
- //! Tests whether the instruction supports AVX512 broadcast (32-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); }
- //! Tests whether the instruction supports AVX512 broadcast (64-bit).
- ASMJIT_INLINE_NODEBUG bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); }
-
- //! Returns a control flow category of the instruction.
- ASMJIT_INLINE_NODEBUG InstControlFlow controlFlow() const noexcept { return commonInfo().controlFlow(); }
- //! Returns a hint that can be used when both inputs are the same register.
- ASMJIT_INLINE_NODEBUG InstSameRegHint sameRegHint() const noexcept { return commonInfo().sameRegHint(); }
-
- ASMJIT_INLINE_NODEBUG uint32_t signatureIndex() const noexcept { return commonInfo().signatureIndex(); }
- ASMJIT_INLINE_NODEBUG uint32_t signatureCount() const noexcept { return commonInfo().signatureCount(); }
-
- ASMJIT_INLINE_NODEBUG const InstSignature* signatureData() const noexcept { return commonInfo().signatureData(); }
- ASMJIT_INLINE_NODEBUG const InstSignature* signatureEnd() const noexcept { return commonInfo().signatureEnd(); }
-
- //! \}
-};
-
-ASMJIT_VARAPI const InstInfo _instInfoTable[];
-
-static inline const InstInfo& infoById(InstId instId) noexcept {
- ASMJIT_ASSERT(Inst::isDefinedId(instId));
- return _instInfoTable[instId];
-}
-
-//! \cond INTERNAL
-static_assert(sizeof(OpSignature) == 8, "InstDB::OpSignature must be 8 bytes long");
-//! \endcond
-
-} // {InstDB}
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // ASMJIT_X86_X86INSTDB_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp b/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp
deleted file mode 100644
index 5ab50de570e..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86operand.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86)
-
-#include "../core/misc_p.h"
-#include "../x86/x86operand.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::Operand - Tests
-// ====================
-
-#if defined(ASMJIT_TEST)
-UNIT(x86_operand) {
- Label L(1000); // Label with some ID.
-
- INFO("Checking basic properties of built-in X86 registers");
- EXPECT_EQ(gpb(Gp::kIdAx), al);
- EXPECT_EQ(gpb(Gp::kIdBx), bl);
- EXPECT_EQ(gpb(Gp::kIdCx), cl);
- EXPECT_EQ(gpb(Gp::kIdDx), dl);
-
- EXPECT_EQ(gpb_lo(Gp::kIdAx), al);
- EXPECT_EQ(gpb_lo(Gp::kIdBx), bl);
- EXPECT_EQ(gpb_lo(Gp::kIdCx), cl);
- EXPECT_EQ(gpb_lo(Gp::kIdDx), dl);
-
- EXPECT_EQ(gpb_hi(Gp::kIdAx), ah);
- EXPECT_EQ(gpb_hi(Gp::kIdBx), bh);
- EXPECT_EQ(gpb_hi(Gp::kIdCx), ch);
- EXPECT_EQ(gpb_hi(Gp::kIdDx), dh);
-
- EXPECT_EQ(gpw(Gp::kIdAx), ax);
- EXPECT_EQ(gpw(Gp::kIdBx), bx);
- EXPECT_EQ(gpw(Gp::kIdCx), cx);
- EXPECT_EQ(gpw(Gp::kIdDx), dx);
-
- EXPECT_EQ(gpd(Gp::kIdAx), eax);
- EXPECT_EQ(gpd(Gp::kIdBx), ebx);
- EXPECT_EQ(gpd(Gp::kIdCx), ecx);
- EXPECT_EQ(gpd(Gp::kIdDx), edx);
-
- EXPECT_EQ(gpq(Gp::kIdAx), rax);
- EXPECT_EQ(gpq(Gp::kIdBx), rbx);
- EXPECT_EQ(gpq(Gp::kIdCx), rcx);
- EXPECT_EQ(gpq(Gp::kIdDx), rdx);
-
- EXPECT_NE(gpb(Gp::kIdAx), dl);
- EXPECT_NE(gpw(Gp::kIdBx), cx);
- EXPECT_NE(gpd(Gp::kIdCx), ebx);
- EXPECT_NE(gpq(Gp::kIdDx), rax);
-
- INFO("Checking if x86::reg(...) matches built-in IDs");
- EXPECT_EQ(gpb(5), bpl);
- EXPECT_EQ(gpw(5), bp);
- EXPECT_EQ(gpd(5), ebp);
- EXPECT_EQ(gpq(5), rbp);
- EXPECT_EQ(st(5) , st5);
- EXPECT_EQ(mm(5) , mm5);
- EXPECT_EQ(k(5) , k5);
- EXPECT_EQ(cr(5) , cr5);
- EXPECT_EQ(dr(5) , dr5);
- EXPECT_EQ(xmm(5), xmm5);
- EXPECT_EQ(ymm(5), ymm5);
- EXPECT_EQ(zmm(5), zmm5);
-
- INFO("Checking x86::Gp register properties");
- EXPECT_TRUE(Gp().isReg());
- EXPECT_TRUE(eax.isReg());
- EXPECT_EQ(eax.id(), 0u);
- EXPECT_EQ(eax.size(), 4u);
- EXPECT_EQ(eax.type(), RegType::kX86_Gpd);
- EXPECT_EQ(eax.group(), RegGroup::kGp);
-
- INFO("Checking x86::Xmm register properties");
- EXPECT_TRUE(Xmm().isReg());
- EXPECT_TRUE(xmm4.isReg());
- EXPECT_EQ(xmm4.id(), 4u);
- EXPECT_EQ(xmm4.size(), 16u);
- EXPECT_EQ(xmm4.type(), RegType::kX86_Xmm);
- EXPECT_EQ(xmm4.group(), RegGroup::kVec);
- EXPECT_TRUE(xmm4.isVec());
-
- INFO("Checking x86::Ymm register properties");
- EXPECT_TRUE(Ymm().isReg());
- EXPECT_TRUE(ymm5.isReg());
- EXPECT_EQ(ymm5.id(), 5u);
- EXPECT_EQ(ymm5.size(), 32u);
- EXPECT_EQ(ymm5.type(), RegType::kX86_Ymm);
- EXPECT_EQ(ymm5.group(), RegGroup::kVec);
- EXPECT_TRUE(ymm5.isVec());
-
- INFO("Checking x86::Zmm register properties");
- EXPECT_TRUE(Zmm().isReg());
- EXPECT_TRUE(zmm6.isReg());
- EXPECT_EQ(zmm6.id(), 6u);
- EXPECT_EQ(zmm6.size(), 64u);
- EXPECT_EQ(zmm6.type(), RegType::kX86_Zmm);
- EXPECT_EQ(zmm6.group(), RegGroup::kVec);
- EXPECT_TRUE(zmm6.isVec());
-
- INFO("Checking x86::Vec register properties");
- EXPECT_TRUE(Vec().isReg());
- // Converts a VEC register to a type of the passed register, but keeps the ID.
- EXPECT_EQ(xmm4.cloneAs(ymm10), ymm4);
- EXPECT_EQ(xmm4.cloneAs(zmm11), zmm4);
- EXPECT_EQ(ymm5.cloneAs(xmm12), xmm5);
- EXPECT_EQ(ymm5.cloneAs(zmm13), zmm5);
- EXPECT_EQ(zmm6.cloneAs(xmm14), xmm6);
- EXPECT_EQ(zmm6.cloneAs(ymm15), ymm6);
-
- EXPECT_EQ(xmm7.xmm(), xmm7);
- EXPECT_EQ(xmm7.ymm(), ymm7);
- EXPECT_EQ(xmm7.zmm(), zmm7);
-
- EXPECT_EQ(ymm7.xmm(), xmm7);
- EXPECT_EQ(ymm7.ymm(), ymm7);
- EXPECT_EQ(ymm7.zmm(), zmm7);
-
- EXPECT_EQ(zmm7.xmm(), xmm7);
- EXPECT_EQ(zmm7.ymm(), ymm7);
- EXPECT_EQ(zmm7.zmm(), zmm7);
-
- INFO("Checking x86::Mm register properties");
- EXPECT_TRUE(Mm().isReg());
- EXPECT_TRUE(mm2.isReg());
- EXPECT_EQ(mm2.id(), 2u);
- EXPECT_EQ(mm2.size(), 8u);
- EXPECT_EQ(mm2.type(), RegType::kX86_Mm);
- EXPECT_EQ(mm2.group(), RegGroup::kX86_MM);
-
- INFO("Checking x86::KReg register properties");
- EXPECT_TRUE(KReg().isReg());
- EXPECT_TRUE(k3.isReg());
- EXPECT_EQ(k3.id(), 3u);
- EXPECT_EQ(k3.size(), 0u);
- EXPECT_EQ(k3.type(), RegType::kX86_KReg);
- EXPECT_EQ(k3.group(), RegGroup::kX86_K);
-
- INFO("Checking x86::St register properties");
- EXPECT_TRUE(St().isReg());
- EXPECT_TRUE(st1.isReg());
- EXPECT_EQ(st1.id(), 1u);
- EXPECT_EQ(st1.size(), 10u);
- EXPECT_EQ(st1.type(), RegType::kX86_St);
- EXPECT_EQ(st1.group(), RegGroup::kX86_St);
-
- INFO("Checking if default constructed regs behave as expected");
- EXPECT_FALSE(Reg().isValid());
- EXPECT_FALSE(Gp().isValid());
- EXPECT_FALSE(Xmm().isValid());
- EXPECT_FALSE(Ymm().isValid());
- EXPECT_FALSE(Zmm().isValid());
- EXPECT_FALSE(Mm().isValid());
- EXPECT_FALSE(KReg().isValid());
- EXPECT_FALSE(SReg().isValid());
- EXPECT_FALSE(CReg().isValid());
- EXPECT_FALSE(DReg().isValid());
- EXPECT_FALSE(St().isValid());
- EXPECT_FALSE(Bnd().isValid());
-
- INFO("Checking x86::Mem operand");
- Mem m;
- EXPECT_EQ(m, Mem());
-
- m = ptr(L);
- EXPECT_TRUE(m.hasBase());
- EXPECT_FALSE(m.hasBaseReg());
- EXPECT_TRUE(m.hasBaseLabel());
- EXPECT_FALSE(m.hasOffset());
- EXPECT_FALSE(m.isOffset64Bit());
- EXPECT_EQ(m.offset(), 0);
- EXPECT_EQ(m.offsetLo32(), 0);
-
- m = ptr(0x0123456789ABCDEFu);
- EXPECT_FALSE(m.hasBase());
- EXPECT_FALSE(m.hasBaseReg());
- EXPECT_FALSE(m.hasIndex());
- EXPECT_FALSE(m.hasIndexReg());
- EXPECT_TRUE(m.hasOffset());
- EXPECT_TRUE(m.isOffset64Bit());
- EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDEFu));
- EXPECT_EQ(m.offsetLo32(), int32_t(0x89ABCDEFu));
- m.addOffset(1);
- EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDF0u));
-
- m = ptr(0x0123456789ABCDEFu, rdi, 3);
- EXPECT_FALSE(m.hasSegment());
- EXPECT_FALSE(m.hasBase());
- EXPECT_FALSE(m.hasBaseReg());
- EXPECT_TRUE(m.hasIndex());
- EXPECT_TRUE(m.hasIndexReg());
- EXPECT_EQ(m.indexType(), rdi.type());
- EXPECT_EQ(m.indexId(), rdi.id());
- EXPECT_EQ(m.shift(), 3u);
- EXPECT_TRUE(m.hasOffset());
- EXPECT_TRUE(m.isOffset64Bit());
- EXPECT_EQ(m.offset(), int64_t(0x0123456789ABCDEFu));
- EXPECT_EQ(m.offsetLo32(), int32_t(0x89ABCDEFu));
- m.resetIndex();
- EXPECT_FALSE(m.hasIndex());
- EXPECT_FALSE(m.hasIndexReg());
-
- m = ptr(rax);
- EXPECT_TRUE(m.hasBase());
- EXPECT_TRUE(m.hasBaseReg());
- EXPECT_EQ(m.baseType(), rax.type());
- EXPECT_EQ(m.baseId(), rax.id());
- EXPECT_FALSE(m.hasIndex());
- EXPECT_FALSE(m.hasIndexReg());
- EXPECT_EQ(m.indexType(), RegType::kNone);
- EXPECT_EQ(m.indexId(), 0u);
- EXPECT_FALSE(m.hasOffset());
- EXPECT_FALSE(m.isOffset64Bit());
- EXPECT_EQ(m.offset(), 0);
- EXPECT_EQ(m.offsetLo32(), 0);
- m.setIndex(rsi);
- EXPECT_TRUE(m.hasIndex());
- EXPECT_TRUE(m.hasIndexReg());
- EXPECT_EQ(m.indexType(), rsi.type());
- EXPECT_EQ(m.indexId(), rsi.id());
-}
-#endif
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86operand.h b/3rdparty/asmjit/src/asmjit/x86/x86operand.h
deleted file mode 100644
index ac56731c982..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86operand.h
+++ /dev/null
@@ -1,1145 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86OPERAND_H_INCLUDED
-#define ASMJIT_X86_X86OPERAND_H_INCLUDED
-
-#include "../core/archtraits.h"
-#include "../core/operand.h"
-#include "../core/type.h"
-#include "../x86/x86globals.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \addtogroup asmjit_x86
-//! \{
-
-class Reg;
-class Mem;
-
-class Gp;
-class Gpb;
-class GpbLo;
-class GpbHi;
-class Gpw;
-class Gpd;
-class Gpq;
-class Vec;
-class Xmm;
-class Ymm;
-class Zmm;
-class Mm;
-class KReg;
-class SReg;
-class CReg;
-class DReg;
-class St;
-class Bnd;
-class Tmm;
-class Rip;
-
-//! Register traits (X86).
-//!
-//! Register traits contains information about a particular register type. It's used by asmjit to setup register
-//! information on-the-fly and to populate tables that contain register information (this way it's possible to change
-//! register types and groups without having to reorder these tables).
-template<RegType kRegType>
-struct RegTraits : public BaseRegTraits {};
-
-//! \cond
-// <--------------------+------------------------+------------------------+---+------------------+
-// | Reg-Type | Reg-Group |Sz | TypeId |
-// <--------------------+------------------------+------------------------+---+------------------+
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Rip , RegGroup::kX86_Rip , 0 , TypeId::kVoid );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_GpbLo , RegGroup::kGp , 1 , TypeId::kInt8 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_GpbHi , RegGroup::kGp , 1 , TypeId::kInt8 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Gpw , RegGroup::kGp , 2 , TypeId::kInt16 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Gpd , RegGroup::kGp , 4 , TypeId::kInt32 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Gpq , RegGroup::kGp , 8 , TypeId::kInt64 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Xmm , RegGroup::kVec , 16, TypeId::kInt32x4 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Ymm , RegGroup::kVec , 32, TypeId::kInt32x8 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Zmm , RegGroup::kVec , 64, TypeId::kInt32x16);
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_KReg , RegGroup::kX86_K , 0 , TypeId::kVoid );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Mm , RegGroup::kX86_MM , 8 , TypeId::kMmx64 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_SReg , RegGroup::kX86_SReg , 2 , TypeId::kVoid );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_CReg , RegGroup::kX86_CReg , 0 , TypeId::kVoid );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_DReg , RegGroup::kX86_DReg , 0 , TypeId::kVoid );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_St , RegGroup::kX86_St , 10, TypeId::kFloat80 );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Bnd , RegGroup::kX86_Bnd , 16, TypeId::kVoid );
-ASMJIT_DEFINE_REG_TRAITS(RegType::kX86_Tmm , RegGroup::kX86_Tmm , 0 , TypeId::kVoid );
-//! \endcond
-
-//! Register (X86).
-class Reg : public BaseReg {
-public:
- ASMJIT_DEFINE_ABSTRACT_REG(Reg, BaseReg)
-
- //! Tests whether the register is a GPB register (8-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpb() const noexcept { return size() == 1; }
- //! Tests whether the register is a low GPB register (8-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpbLo() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_GpbLo>::kSignature); }
- //! Tests whether the register is a high GPB register (8-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpbHi() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_GpbHi>::kSignature); }
- //! Tests whether the register is a GPW register (16-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpw() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpw>::kSignature); }
- //! Tests whether the register is a GPD register (32-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpd() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpd>::kSignature); }
- //! Tests whether the register is a GPQ register (64-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isGpq() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpq>::kSignature); }
-
- //! Tests whether the register is a 32-bit general purpose register, alias of \ref isGpd().
- ASMJIT_INLINE_NODEBUG constexpr bool isGp32() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpd>::kSignature); }
- //! Tests whether the register is a 64-bit general purpose register, alias of \ref isGpq()
- ASMJIT_INLINE_NODEBUG constexpr bool isGp64() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Gpq>::kSignature); }
-
- //! Tests whether the register is an XMM register (128-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isXmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Xmm>::kSignature); }
- //! Tests whether the register is a YMM register (256-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isYmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Ymm>::kSignature); }
- //! Tests whether the register is a ZMM register (512-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isZmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Zmm>::kSignature); }
-
- //! Tests whether the register is a 128-bit vector register, alias of \ref isXmm().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec128() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Xmm>::kSignature); }
- //! Tests whether the register is a 256-bit vector register, alias of \ref isYmm().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec256() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Ymm>::kSignature); }
- //! Tests whether the register is a 512-bit vector register, alias of \ref isZmm().
- ASMJIT_INLINE_NODEBUG constexpr bool isVec512() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Zmm>::kSignature); }
-
- //! Tests whether the register is an MMX register (64-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isMm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Mm>::kSignature); }
- //! Tests whether the register is a K register (64-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isKReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_KReg>::kSignature); }
- //! Tests whether the register is a segment register.
- ASMJIT_INLINE_NODEBUG constexpr bool isSReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_SReg>::kSignature); }
- //! Tests whether the register is a control register.
- ASMJIT_INLINE_NODEBUG constexpr bool isCReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_CReg>::kSignature); }
- //! Tests whether the register is a debug register.
- ASMJIT_INLINE_NODEBUG constexpr bool isDReg() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_DReg>::kSignature); }
- //! Tests whether the register is an FPU register (80-bit).
- ASMJIT_INLINE_NODEBUG constexpr bool isSt() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_St>::kSignature); }
- //! Tests whether the register is a bound register.
- ASMJIT_INLINE_NODEBUG constexpr bool isBnd() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Bnd>::kSignature); }
- //! Tests whether the register is a TMM register.
- ASMJIT_INLINE_NODEBUG constexpr bool isTmm() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Tmm>::kSignature); }
- //! Tests whether the register is RIP.
- ASMJIT_INLINE_NODEBUG constexpr bool isRip() const noexcept { return hasBaseSignature(RegTraits<RegType::kX86_Rip>::kSignature); }
-
- template<RegType REG_TYPE>
- ASMJIT_INLINE_NODEBUG void setRegT(uint32_t rId) noexcept {
- setSignature(OperandSignature{RegTraits<REG_TYPE>::kSignature});
- setId(rId);
- }
-
- ASMJIT_INLINE_NODEBUG void setTypeAndId(RegType type, uint32_t id) noexcept {
- setSignature(signatureOf(type));
- setId(id);
- }
-
- static ASMJIT_INLINE_NODEBUG RegGroup groupOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToGroup(type); }
- static ASMJIT_INLINE_NODEBUG TypeId typeIdOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToTypeId(type); }
- static ASMJIT_INLINE_NODEBUG OperandSignature signatureOf(RegType type) noexcept { return ArchTraits::byArch(Arch::kX86).regTypeToSignature(type); }
-
- template<RegType REG_TYPE>
- static ASMJIT_INLINE_NODEBUG RegGroup groupOfT() noexcept { return RegGroup(RegTraits<REG_TYPE>::kGroup); }
-
- template<RegType REG_TYPE>
- static ASMJIT_INLINE_NODEBUG TypeId typeIdOfT() noexcept { return TypeId(RegTraits<REG_TYPE>::kTypeId); }
-
- template<RegType REG_TYPE>
- static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfT() noexcept { return OperandSignature{RegTraits<REG_TYPE>::kSignature}; }
-
- static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfVecByType(TypeId typeId) noexcept {
- return OperandSignature{typeId <= TypeId::_kVec128End ? uint32_t(RegTraits<RegType::kX86_Xmm>::kSignature) :
- typeId <= TypeId::_kVec256End ? uint32_t(RegTraits<RegType::kX86_Ymm>::kSignature) :
- uint32_t(RegTraits<RegType::kX86_Zmm>::kSignature)};
- }
-
- static ASMJIT_INLINE_NODEBUG OperandSignature signatureOfVecBySize(uint32_t size) noexcept {
- return OperandSignature{size <= 16 ? uint32_t(RegTraits<RegType::kX86_Xmm>::kSignature) :
- size <= 32 ? uint32_t(RegTraits<RegType::kX86_Ymm>::kSignature) :
- uint32_t(RegTraits<RegType::kX86_Zmm>::kSignature)};
- }
-
- //! Tests whether the `op` operand is either a low or high 8-bit GPB register.
- static ASMJIT_INLINE_NODEBUG bool isGpb(const Operand_& op) noexcept {
- // Check operand type, register group, and size. Not interested in register type.
- return op.signature().subset(Signature::kOpTypeMask | Signature::kRegGroupMask | Signature::kSizeMask) ==
- (Signature::fromOpType(OperandType::kReg) | Signature::fromRegGroup(RegGroup::kGp) | Signature::fromSize(1));
- }
-
- static ASMJIT_INLINE_NODEBUG bool isGpbLo(const Operand_& op) noexcept { return op.as<Reg>().isGpbLo(); }
- static ASMJIT_INLINE_NODEBUG bool isGpbHi(const Operand_& op) noexcept { return op.as<Reg>().isGpbHi(); }
- static ASMJIT_INLINE_NODEBUG bool isGpw(const Operand_& op) noexcept { return op.as<Reg>().isGpw(); }
- static ASMJIT_INLINE_NODEBUG bool isGpd(const Operand_& op) noexcept { return op.as<Reg>().isGpd(); }
- static ASMJIT_INLINE_NODEBUG bool isGpq(const Operand_& op) noexcept { return op.as<Reg>().isGpq(); }
- static ASMJIT_INLINE_NODEBUG bool isXmm(const Operand_& op) noexcept { return op.as<Reg>().isXmm(); }
- static ASMJIT_INLINE_NODEBUG bool isYmm(const Operand_& op) noexcept { return op.as<Reg>().isYmm(); }
- static ASMJIT_INLINE_NODEBUG bool isZmm(const Operand_& op) noexcept { return op.as<Reg>().isZmm(); }
- static ASMJIT_INLINE_NODEBUG bool isMm(const Operand_& op) noexcept { return op.as<Reg>().isMm(); }
- static ASMJIT_INLINE_NODEBUG bool isKReg(const Operand_& op) noexcept { return op.as<Reg>().isKReg(); }
- static ASMJIT_INLINE_NODEBUG bool isSReg(const Operand_& op) noexcept { return op.as<Reg>().isSReg(); }
- static ASMJIT_INLINE_NODEBUG bool isCReg(const Operand_& op) noexcept { return op.as<Reg>().isCReg(); }
- static ASMJIT_INLINE_NODEBUG bool isDReg(const Operand_& op) noexcept { return op.as<Reg>().isDReg(); }
- static ASMJIT_INLINE_NODEBUG bool isSt(const Operand_& op) noexcept { return op.as<Reg>().isSt(); }
- static ASMJIT_INLINE_NODEBUG bool isBnd(const Operand_& op) noexcept { return op.as<Reg>().isBnd(); }
- static ASMJIT_INLINE_NODEBUG bool isTmm(const Operand_& op) noexcept { return op.as<Reg>().isTmm(); }
- static ASMJIT_INLINE_NODEBUG bool isRip(const Operand_& op) noexcept { return op.as<Reg>().isRip(); }
-
- static ASMJIT_INLINE_NODEBUG bool isGpb(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpb(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isGpbLo(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpbLo(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isGpbHi(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpbHi(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isGpw(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpw(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isGpd(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpd(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isGpq(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isGpq(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isXmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isXmm(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isYmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isYmm(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isZmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isZmm(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isMm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isMm(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isKReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isKReg(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isSReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isSReg(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isCReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isCReg(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isDReg(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isDReg(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isSt(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isSt(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isBnd(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isBnd(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isTmm(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isTmm(op)) & unsigned(op.id() == rId)); }
- static ASMJIT_INLINE_NODEBUG bool isRip(const Operand_& op, uint32_t rId) noexcept { return bool(unsigned(isRip(op)) & unsigned(op.id() == rId)); }
-};
-
-//! General purpose register (X86).
-class Gp : public Reg {
-public:
- ASMJIT_DEFINE_ABSTRACT_REG(Gp, Reg)
-
- //! Physical id (X86).
- //!
- //! \note Register indexes have been reduced to only support general purpose registers. There is no need to
- //! have enumerations with number suffix that expands to the exactly same value as the suffix value itself.
- enum Id : uint32_t {
- kIdAx = 0, //!< Physical id of AL|AH|AX|EAX|RAX registers.
- kIdCx = 1, //!< Physical id of CL|CH|CX|ECX|RCX registers.
- kIdDx = 2, //!< Physical id of DL|DH|DX|EDX|RDX registers.
- kIdBx = 3, //!< Physical id of BL|BH|BX|EBX|RBX registers.
- kIdSp = 4, //!< Physical id of SPL|SP|ESP|RSP registers.
- kIdBp = 5, //!< Physical id of BPL|BP|EBP|RBP registers.
- kIdSi = 6, //!< Physical id of SIL|SI|ESI|RSI registers.
- kIdDi = 7, //!< Physical id of DIL|DI|EDI|RDI registers.
- kIdR8 = 8, //!< Physical id of R8B|R8W|R8D|R8 registers (64-bit only).
- kIdR9 = 9, //!< Physical id of R9B|R9W|R9D|R9 registers (64-bit only).
- kIdR10 = 10, //!< Physical id of R10B|R10W|R10D|R10 registers (64-bit only).
- kIdR11 = 11, //!< Physical id of R11B|R11W|R11D|R11 registers (64-bit only).
- kIdR12 = 12, //!< Physical id of R12B|R12W|R12D|R12 registers (64-bit only).
- kIdR13 = 13, //!< Physical id of R13B|R13W|R13D|R13 registers (64-bit only).
- kIdR14 = 14, //!< Physical id of R14B|R14W|R14D|R14 registers (64-bit only).
- kIdR15 = 15 //!< Physical id of R15B|R15W|R15D|R15 registers (64-bit only).
- };
-
- //! Casts this register to 8-bit (LO) part.
- ASMJIT_INLINE_NODEBUG GpbLo r8() const noexcept;
- //! Casts this register to 8-bit (LO) part.
- ASMJIT_INLINE_NODEBUG GpbLo r8Lo() const noexcept;
- //! Casts this register to 8-bit (HI) part.
- ASMJIT_INLINE_NODEBUG GpbHi r8Hi() const noexcept;
- //! Casts this register to 16-bit.
- ASMJIT_INLINE_NODEBUG Gpw r16() const noexcept;
- //! Casts this register to 32-bit.
- ASMJIT_INLINE_NODEBUG Gpd r32() const noexcept;
- //! Casts this register to 64-bit.
- ASMJIT_INLINE_NODEBUG Gpq r64() const noexcept;
-};
-
-//! Vector register (XMM|YMM|ZMM) (X86).
-class Vec : public Reg {
- ASMJIT_DEFINE_ABSTRACT_REG(Vec, Reg)
-
- //! Casts this register to XMM (clone).
- ASMJIT_INLINE_NODEBUG Xmm xmm() const noexcept;
- //! Casts this register to YMM (clone).
- ASMJIT_INLINE_NODEBUG Ymm ymm() const noexcept;
- //! Casts this register to ZMM (clone).
- ASMJIT_INLINE_NODEBUG Zmm zmm() const noexcept;
-
- //! Casts this register to XMM (clone).
- ASMJIT_INLINE_NODEBUG Vec v128() const noexcept;
- //! Casts this register to YMM (clone).
- ASMJIT_INLINE_NODEBUG Vec v256() const noexcept;
- //! Casts this register to ZMM (clone).
- ASMJIT_INLINE_NODEBUG Vec v512() const noexcept;
-
- //! Casts this register to a register that has half the size (or XMM if it's already XMM).
- ASMJIT_INLINE_NODEBUG Vec half() const noexcept {
- return Vec(type() == RegType::kX86_Zmm ? signatureOfT<RegType::kX86_Ymm>() : signatureOfT<RegType::kX86_Xmm>(), id());
- }
-};
-
-//! Segment register (X86).
-class SReg : public Reg {
- ASMJIT_DEFINE_FINAL_REG(SReg, Reg, RegTraits<RegType::kX86_SReg>)
-
- //! X86 segment id.
- enum Id : uint32_t {
- //! No segment (default).
- kIdNone = 0,
- //! ES segment.
- kIdEs = 1,
- //! CS segment.
- kIdCs = 2,
- //! SS segment.
- kIdSs = 3,
- //! DS segment.
- kIdDs = 4,
- //! FS segment.
- kIdFs = 5,
- //! GS segment.
- kIdGs = 6,
-
- //! Count of X86 segment registers supported by AsmJit.
- //!
- //! \note X86 architecture has 6 segment registers - ES, CS, SS, DS, FS, GS. X64 architecture lowers them down to
- //! just FS and GS. AsmJit supports 7 segment registers - all addressable in both X86 and X64 modes and one extra
- //! called `SReg::kIdNone`, which is AsmJit specific and means that there is no segment register specified.
- kIdCount = 7
- };
-};
-
-//! GPB low or high register (X86).
-class Gpb : public Gp { ASMJIT_DEFINE_ABSTRACT_REG(Gpb, Gp) };
-//! GPB low register (X86).
-class GpbLo : public Gpb { ASMJIT_DEFINE_FINAL_REG(GpbLo, Gpb, RegTraits<RegType::kX86_GpbLo>) };
-//! GPB high register (X86).
-class GpbHi : public Gpb { ASMJIT_DEFINE_FINAL_REG(GpbHi, Gpb, RegTraits<RegType::kX86_GpbHi>) };
-//! GPW register (X86).
-class Gpw : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpw, Gp, RegTraits<RegType::kX86_Gpw>) };
-//! GPD register (X86).
-class Gpd : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpd, Gp, RegTraits<RegType::kX86_Gpd>) };
-//! GPQ register (X86_64).
-class Gpq : public Gp { ASMJIT_DEFINE_FINAL_REG(Gpq, Gp, RegTraits<RegType::kX86_Gpq>) };
-
-//! 128-bit XMM register (SSE+).
-class Xmm : public Vec {
- ASMJIT_DEFINE_FINAL_REG(Xmm, Vec, RegTraits<RegType::kX86_Xmm>)
- //! Casts this register to a register that has half the size (XMM).
- ASMJIT_INLINE_NODEBUG Xmm half() const noexcept { return Xmm(id()); }
-};
-
-//! 256-bit YMM register (AVX+).
-class Ymm : public Vec {
- ASMJIT_DEFINE_FINAL_REG(Ymm, Vec, RegTraits<RegType::kX86_Ymm>)
- //! Casts this register to a register that has half the size (XMM).
- ASMJIT_INLINE_NODEBUG Xmm half() const noexcept { return Xmm(id()); }
-};
-
-//! 512-bit ZMM register (AVX512+).
-class Zmm : public Vec {
- ASMJIT_DEFINE_FINAL_REG(Zmm, Vec, RegTraits<RegType::kX86_Zmm>)
- //! Casts this register to a register that has half the size (YMM).
- ASMJIT_INLINE_NODEBUG Ymm half() const noexcept { return Ymm(id()); }
-};
-
-//! 64-bit MMX register (MMX+).
-class Mm : public Reg { ASMJIT_DEFINE_FINAL_REG(Mm, Reg, RegTraits<RegType::kX86_Mm>) };
-//! 64-bit K register (AVX512+).
-class KReg : public Reg { ASMJIT_DEFINE_FINAL_REG(KReg, Reg, RegTraits<RegType::kX86_KReg>) };
-//! 32-bit or 64-bit control register (X86).
-class CReg : public Reg { ASMJIT_DEFINE_FINAL_REG(CReg, Reg, RegTraits<RegType::kX86_CReg>) };
-//! 32-bit or 64-bit debug register (X86).
-class DReg : public Reg { ASMJIT_DEFINE_FINAL_REG(DReg, Reg, RegTraits<RegType::kX86_DReg>) };
-//! 80-bit FPU register (X86).
-class St : public Reg { ASMJIT_DEFINE_FINAL_REG(St, Reg, RegTraits<RegType::kX86_St>) };
-//! 128-bit BND register (BND+).
-class Bnd : public Reg { ASMJIT_DEFINE_FINAL_REG(Bnd, Reg, RegTraits<RegType::kX86_Bnd>) };
-//! 8192-bit TMM register (AMX).
-class Tmm : public Reg { ASMJIT_DEFINE_FINAL_REG(Tmm, Reg, RegTraits<RegType::kX86_Tmm>) };
-//! RIP register (X86).
-class Rip : public Reg { ASMJIT_DEFINE_FINAL_REG(Rip, Reg, RegTraits<RegType::kX86_Rip>) };
-
-//! \cond
-ASMJIT_INLINE_NODEBUG GpbLo Gp::r8() const noexcept { return GpbLo(id()); }
-ASMJIT_INLINE_NODEBUG GpbLo Gp::r8Lo() const noexcept { return GpbLo(id()); }
-ASMJIT_INLINE_NODEBUG GpbHi Gp::r8Hi() const noexcept { return GpbHi(id()); }
-ASMJIT_INLINE_NODEBUG Gpw Gp::r16() const noexcept { return Gpw(id()); }
-ASMJIT_INLINE_NODEBUG Gpd Gp::r32() const noexcept { return Gpd(id()); }
-ASMJIT_INLINE_NODEBUG Gpq Gp::r64() const noexcept { return Gpq(id()); }
-ASMJIT_INLINE_NODEBUG Xmm Vec::xmm() const noexcept { return Xmm(id()); }
-ASMJIT_INLINE_NODEBUG Ymm Vec::ymm() const noexcept { return Ymm(id()); }
-ASMJIT_INLINE_NODEBUG Zmm Vec::zmm() const noexcept { return Zmm(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v128() const noexcept { return Xmm(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v256() const noexcept { return Ymm(id()); }
-ASMJIT_INLINE_NODEBUG Vec Vec::v512() const noexcept { return Zmm(id()); }
-//! \endcond
-
-//! \namespace asmjit::x86::regs
-//!
-//! Registers provided by X86 and X64 ISAs are in both `asmjit::x86` and `asmjit::x86::regs` namespaces so they can
-//! be included with using directive. For example `using namespace asmjit::x86::regs` would include all registers,
-//! but not other X86-specific API, whereas `using namespace asmjit::x86` would include everything X86-specific.
-#ifndef _DOXYGEN
-namespace regs {
-#endif
-
-//! Creates an 8-bit low GPB register operand.
-static ASMJIT_INLINE_NODEBUG constexpr GpbLo gpb(uint32_t rId) noexcept { return GpbLo(rId); }
-//! Creates an 8-bit low GPB register operand.
-static ASMJIT_INLINE_NODEBUG constexpr GpbLo gpb_lo(uint32_t rId) noexcept { return GpbLo(rId); }
-//! Creates an 8-bit high GPB register operand.
-static ASMJIT_INLINE_NODEBUG constexpr GpbHi gpb_hi(uint32_t rId) noexcept { return GpbHi(rId); }
-//! Creates a 16-bit GPW register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Gpw gpw(uint32_t rId) noexcept { return Gpw(rId); }
-//! Creates a 32-bit GPD register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Gpd gpd(uint32_t rId) noexcept { return Gpd(rId); }
-//! Creates a 64-bit GPQ register operand (64-bit).
-static ASMJIT_INLINE_NODEBUG constexpr Gpq gpq(uint32_t rId) noexcept { return Gpq(rId); }
-//! Creates a 128-bit XMM register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Xmm xmm(uint32_t rId) noexcept { return Xmm(rId); }
-//! Creates a 256-bit YMM register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Ymm ymm(uint32_t rId) noexcept { return Ymm(rId); }
-//! Creates a 512-bit ZMM register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Zmm zmm(uint32_t rId) noexcept { return Zmm(rId); }
-//! Creates a 64-bit Mm register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mm mm(uint32_t rId) noexcept { return Mm(rId); }
-//! Creates a 64-bit K register operand.
-static ASMJIT_INLINE_NODEBUG constexpr KReg k(uint32_t rId) noexcept { return KReg(rId); }
-//! Creates a 32-bit or 64-bit control register operand.
-static ASMJIT_INLINE_NODEBUG constexpr CReg cr(uint32_t rId) noexcept { return CReg(rId); }
-//! Creates a 32-bit or 64-bit debug register operand.
-static ASMJIT_INLINE_NODEBUG constexpr DReg dr(uint32_t rId) noexcept { return DReg(rId); }
-//! Creates an 80-bit st register operand.
-static ASMJIT_INLINE_NODEBUG constexpr St st(uint32_t rId) noexcept { return St(rId); }
-//! Creates a 128-bit bound register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Bnd bnd(uint32_t rId) noexcept { return Bnd(rId); }
-//! Creates a TMM register operand.
-static ASMJIT_INLINE_NODEBUG constexpr Tmm tmm(uint32_t rId) noexcept { return Tmm(rId); }
-
-static constexpr GpbLo al = GpbLo(Gp::kIdAx);
-static constexpr GpbLo bl = GpbLo(Gp::kIdBx);
-static constexpr GpbLo cl = GpbLo(Gp::kIdCx);
-static constexpr GpbLo dl = GpbLo(Gp::kIdDx);
-static constexpr GpbLo spl = GpbLo(Gp::kIdSp);
-static constexpr GpbLo bpl = GpbLo(Gp::kIdBp);
-static constexpr GpbLo sil = GpbLo(Gp::kIdSi);
-static constexpr GpbLo dil = GpbLo(Gp::kIdDi);
-static constexpr GpbLo r8b = GpbLo(Gp::kIdR8);
-static constexpr GpbLo r9b = GpbLo(Gp::kIdR9);
-static constexpr GpbLo r10b = GpbLo(Gp::kIdR10);
-static constexpr GpbLo r11b = GpbLo(Gp::kIdR11);
-static constexpr GpbLo r12b = GpbLo(Gp::kIdR12);
-static constexpr GpbLo r13b = GpbLo(Gp::kIdR13);
-static constexpr GpbLo r14b = GpbLo(Gp::kIdR14);
-static constexpr GpbLo r15b = GpbLo(Gp::kIdR15);
-
-static constexpr GpbHi ah = GpbHi(Gp::kIdAx);
-static constexpr GpbHi bh = GpbHi(Gp::kIdBx);
-static constexpr GpbHi ch = GpbHi(Gp::kIdCx);
-static constexpr GpbHi dh = GpbHi(Gp::kIdDx);
-
-static constexpr Gpw ax = Gpw(Gp::kIdAx);
-static constexpr Gpw bx = Gpw(Gp::kIdBx);
-static constexpr Gpw cx = Gpw(Gp::kIdCx);
-static constexpr Gpw dx = Gpw(Gp::kIdDx);
-static constexpr Gpw sp = Gpw(Gp::kIdSp);
-static constexpr Gpw bp = Gpw(Gp::kIdBp);
-static constexpr Gpw si = Gpw(Gp::kIdSi);
-static constexpr Gpw di = Gpw(Gp::kIdDi);
-static constexpr Gpw r8w = Gpw(Gp::kIdR8);
-static constexpr Gpw r9w = Gpw(Gp::kIdR9);
-static constexpr Gpw r10w = Gpw(Gp::kIdR10);
-static constexpr Gpw r11w = Gpw(Gp::kIdR11);
-static constexpr Gpw r12w = Gpw(Gp::kIdR12);
-static constexpr Gpw r13w = Gpw(Gp::kIdR13);
-static constexpr Gpw r14w = Gpw(Gp::kIdR14);
-static constexpr Gpw r15w = Gpw(Gp::kIdR15);
-
-static constexpr Gpd eax = Gpd(Gp::kIdAx);
-static constexpr Gpd ebx = Gpd(Gp::kIdBx);
-static constexpr Gpd ecx = Gpd(Gp::kIdCx);
-static constexpr Gpd edx = Gpd(Gp::kIdDx);
-static constexpr Gpd esp = Gpd(Gp::kIdSp);
-static constexpr Gpd ebp = Gpd(Gp::kIdBp);
-static constexpr Gpd esi = Gpd(Gp::kIdSi);
-static constexpr Gpd edi = Gpd(Gp::kIdDi);
-static constexpr Gpd r8d = Gpd(Gp::kIdR8);
-static constexpr Gpd r9d = Gpd(Gp::kIdR9);
-static constexpr Gpd r10d = Gpd(Gp::kIdR10);
-static constexpr Gpd r11d = Gpd(Gp::kIdR11);
-static constexpr Gpd r12d = Gpd(Gp::kIdR12);
-static constexpr Gpd r13d = Gpd(Gp::kIdR13);
-static constexpr Gpd r14d = Gpd(Gp::kIdR14);
-static constexpr Gpd r15d = Gpd(Gp::kIdR15);
-
-static constexpr Gpq rax = Gpq(Gp::kIdAx);
-static constexpr Gpq rbx = Gpq(Gp::kIdBx);
-static constexpr Gpq rcx = Gpq(Gp::kIdCx);
-static constexpr Gpq rdx = Gpq(Gp::kIdDx);
-static constexpr Gpq rsp = Gpq(Gp::kIdSp);
-static constexpr Gpq rbp = Gpq(Gp::kIdBp);
-static constexpr Gpq rsi = Gpq(Gp::kIdSi);
-static constexpr Gpq rdi = Gpq(Gp::kIdDi);
-static constexpr Gpq r8 = Gpq(Gp::kIdR8);
-static constexpr Gpq r9 = Gpq(Gp::kIdR9);
-static constexpr Gpq r10 = Gpq(Gp::kIdR10);
-static constexpr Gpq r11 = Gpq(Gp::kIdR11);
-static constexpr Gpq r12 = Gpq(Gp::kIdR12);
-static constexpr Gpq r13 = Gpq(Gp::kIdR13);
-static constexpr Gpq r14 = Gpq(Gp::kIdR14);
-static constexpr Gpq r15 = Gpq(Gp::kIdR15);
-
-static constexpr Xmm xmm0 = Xmm(0);
-static constexpr Xmm xmm1 = Xmm(1);
-static constexpr Xmm xmm2 = Xmm(2);
-static constexpr Xmm xmm3 = Xmm(3);
-static constexpr Xmm xmm4 = Xmm(4);
-static constexpr Xmm xmm5 = Xmm(5);
-static constexpr Xmm xmm6 = Xmm(6);
-static constexpr Xmm xmm7 = Xmm(7);
-static constexpr Xmm xmm8 = Xmm(8);
-static constexpr Xmm xmm9 = Xmm(9);
-static constexpr Xmm xmm10 = Xmm(10);
-static constexpr Xmm xmm11 = Xmm(11);
-static constexpr Xmm xmm12 = Xmm(12);
-static constexpr Xmm xmm13 = Xmm(13);
-static constexpr Xmm xmm14 = Xmm(14);
-static constexpr Xmm xmm15 = Xmm(15);
-static constexpr Xmm xmm16 = Xmm(16);
-static constexpr Xmm xmm17 = Xmm(17);
-static constexpr Xmm xmm18 = Xmm(18);
-static constexpr Xmm xmm19 = Xmm(19);
-static constexpr Xmm xmm20 = Xmm(20);
-static constexpr Xmm xmm21 = Xmm(21);
-static constexpr Xmm xmm22 = Xmm(22);
-static constexpr Xmm xmm23 = Xmm(23);
-static constexpr Xmm xmm24 = Xmm(24);
-static constexpr Xmm xmm25 = Xmm(25);
-static constexpr Xmm xmm26 = Xmm(26);
-static constexpr Xmm xmm27 = Xmm(27);
-static constexpr Xmm xmm28 = Xmm(28);
-static constexpr Xmm xmm29 = Xmm(29);
-static constexpr Xmm xmm30 = Xmm(30);
-static constexpr Xmm xmm31 = Xmm(31);
-
-static constexpr Ymm ymm0 = Ymm(0);
-static constexpr Ymm ymm1 = Ymm(1);
-static constexpr Ymm ymm2 = Ymm(2);
-static constexpr Ymm ymm3 = Ymm(3);
-static constexpr Ymm ymm4 = Ymm(4);
-static constexpr Ymm ymm5 = Ymm(5);
-static constexpr Ymm ymm6 = Ymm(6);
-static constexpr Ymm ymm7 = Ymm(7);
-static constexpr Ymm ymm8 = Ymm(8);
-static constexpr Ymm ymm9 = Ymm(9);
-static constexpr Ymm ymm10 = Ymm(10);
-static constexpr Ymm ymm11 = Ymm(11);
-static constexpr Ymm ymm12 = Ymm(12);
-static constexpr Ymm ymm13 = Ymm(13);
-static constexpr Ymm ymm14 = Ymm(14);
-static constexpr Ymm ymm15 = Ymm(15);
-static constexpr Ymm ymm16 = Ymm(16);
-static constexpr Ymm ymm17 = Ymm(17);
-static constexpr Ymm ymm18 = Ymm(18);
-static constexpr Ymm ymm19 = Ymm(19);
-static constexpr Ymm ymm20 = Ymm(20);
-static constexpr Ymm ymm21 = Ymm(21);
-static constexpr Ymm ymm22 = Ymm(22);
-static constexpr Ymm ymm23 = Ymm(23);
-static constexpr Ymm ymm24 = Ymm(24);
-static constexpr Ymm ymm25 = Ymm(25);
-static constexpr Ymm ymm26 = Ymm(26);
-static constexpr Ymm ymm27 = Ymm(27);
-static constexpr Ymm ymm28 = Ymm(28);
-static constexpr Ymm ymm29 = Ymm(29);
-static constexpr Ymm ymm30 = Ymm(30);
-static constexpr Ymm ymm31 = Ymm(31);
-
-static constexpr Zmm zmm0 = Zmm(0);
-static constexpr Zmm zmm1 = Zmm(1);
-static constexpr Zmm zmm2 = Zmm(2);
-static constexpr Zmm zmm3 = Zmm(3);
-static constexpr Zmm zmm4 = Zmm(4);
-static constexpr Zmm zmm5 = Zmm(5);
-static constexpr Zmm zmm6 = Zmm(6);
-static constexpr Zmm zmm7 = Zmm(7);
-static constexpr Zmm zmm8 = Zmm(8);
-static constexpr Zmm zmm9 = Zmm(9);
-static constexpr Zmm zmm10 = Zmm(10);
-static constexpr Zmm zmm11 = Zmm(11);
-static constexpr Zmm zmm12 = Zmm(12);
-static constexpr Zmm zmm13 = Zmm(13);
-static constexpr Zmm zmm14 = Zmm(14);
-static constexpr Zmm zmm15 = Zmm(15);
-static constexpr Zmm zmm16 = Zmm(16);
-static constexpr Zmm zmm17 = Zmm(17);
-static constexpr Zmm zmm18 = Zmm(18);
-static constexpr Zmm zmm19 = Zmm(19);
-static constexpr Zmm zmm20 = Zmm(20);
-static constexpr Zmm zmm21 = Zmm(21);
-static constexpr Zmm zmm22 = Zmm(22);
-static constexpr Zmm zmm23 = Zmm(23);
-static constexpr Zmm zmm24 = Zmm(24);
-static constexpr Zmm zmm25 = Zmm(25);
-static constexpr Zmm zmm26 = Zmm(26);
-static constexpr Zmm zmm27 = Zmm(27);
-static constexpr Zmm zmm28 = Zmm(28);
-static constexpr Zmm zmm29 = Zmm(29);
-static constexpr Zmm zmm30 = Zmm(30);
-static constexpr Zmm zmm31 = Zmm(31);
-
-static constexpr Mm mm0 = Mm(0);
-static constexpr Mm mm1 = Mm(1);
-static constexpr Mm mm2 = Mm(2);
-static constexpr Mm mm3 = Mm(3);
-static constexpr Mm mm4 = Mm(4);
-static constexpr Mm mm5 = Mm(5);
-static constexpr Mm mm6 = Mm(6);
-static constexpr Mm mm7 = Mm(7);
-
-static constexpr KReg k0 = KReg(0);
-static constexpr KReg k1 = KReg(1);
-static constexpr KReg k2 = KReg(2);
-static constexpr KReg k3 = KReg(3);
-static constexpr KReg k4 = KReg(4);
-static constexpr KReg k5 = KReg(5);
-static constexpr KReg k6 = KReg(6);
-static constexpr KReg k7 = KReg(7);
-
-static constexpr SReg no_seg = SReg(SReg::kIdNone);
-static constexpr SReg es = SReg(SReg::kIdEs);
-static constexpr SReg cs = SReg(SReg::kIdCs);
-static constexpr SReg ss = SReg(SReg::kIdSs);
-static constexpr SReg ds = SReg(SReg::kIdDs);
-static constexpr SReg fs = SReg(SReg::kIdFs);
-static constexpr SReg gs = SReg(SReg::kIdGs);
-
-static constexpr CReg cr0 = CReg(0);
-static constexpr CReg cr1 = CReg(1);
-static constexpr CReg cr2 = CReg(2);
-static constexpr CReg cr3 = CReg(3);
-static constexpr CReg cr4 = CReg(4);
-static constexpr CReg cr5 = CReg(5);
-static constexpr CReg cr6 = CReg(6);
-static constexpr CReg cr7 = CReg(7);
-static constexpr CReg cr8 = CReg(8);
-static constexpr CReg cr9 = CReg(9);
-static constexpr CReg cr10 = CReg(10);
-static constexpr CReg cr11 = CReg(11);
-static constexpr CReg cr12 = CReg(12);
-static constexpr CReg cr13 = CReg(13);
-static constexpr CReg cr14 = CReg(14);
-static constexpr CReg cr15 = CReg(15);
-
-static constexpr DReg dr0 = DReg(0);
-static constexpr DReg dr1 = DReg(1);
-static constexpr DReg dr2 = DReg(2);
-static constexpr DReg dr3 = DReg(3);
-static constexpr DReg dr4 = DReg(4);
-static constexpr DReg dr5 = DReg(5);
-static constexpr DReg dr6 = DReg(6);
-static constexpr DReg dr7 = DReg(7);
-static constexpr DReg dr8 = DReg(8);
-static constexpr DReg dr9 = DReg(9);
-static constexpr DReg dr10 = DReg(10);
-static constexpr DReg dr11 = DReg(11);
-static constexpr DReg dr12 = DReg(12);
-static constexpr DReg dr13 = DReg(13);
-static constexpr DReg dr14 = DReg(14);
-static constexpr DReg dr15 = DReg(15);
-
-static constexpr St st0 = St(0);
-static constexpr St st1 = St(1);
-static constexpr St st2 = St(2);
-static constexpr St st3 = St(3);
-static constexpr St st4 = St(4);
-static constexpr St st5 = St(5);
-static constexpr St st6 = St(6);
-static constexpr St st7 = St(7);
-
-static constexpr Bnd bnd0 = Bnd(0);
-static constexpr Bnd bnd1 = Bnd(1);
-static constexpr Bnd bnd2 = Bnd(2);
-static constexpr Bnd bnd3 = Bnd(3);
-
-static constexpr Tmm tmm0 = Tmm(0);
-static constexpr Tmm tmm1 = Tmm(1);
-static constexpr Tmm tmm2 = Tmm(2);
-static constexpr Tmm tmm3 = Tmm(3);
-static constexpr Tmm tmm4 = Tmm(4);
-static constexpr Tmm tmm5 = Tmm(5);
-static constexpr Tmm tmm6 = Tmm(6);
-static constexpr Tmm tmm7 = Tmm(7);
-
-static constexpr Rip rip = Rip(0);
-
-#ifndef _DOXYGEN
-} // {regs}
-
-// Make `x86::regs` accessible through `x86` namespace as well.
-using namespace regs;
-#endif
-
-//! Memory operand specific to X86 and X86_64 architecture.
-class Mem : public BaseMem {
-public:
- //! \name Constants
- //! \{
-
- //! Additional bits of operand's signature used by `x86::Mem`.
- enum AdditionalBits : uint32_t {
- // Memory address type (2 bits).
- // |........|........|XX......|........|
- kSignatureMemAddrTypeShift = 14,
- kSignatureMemAddrTypeMask = 0x03u << kSignatureMemAddrTypeShift,
-
- // Memory shift amount (2 bits).
- // |........|......XX|........|........|
- kSignatureMemShiftValueShift = 16,
- kSignatureMemShiftValueMask = 0x03u << kSignatureMemShiftValueShift,
-
- // Memory segment reg (3 bits).
- // |........|...XXX..|........|........|
- kSignatureMemSegmentShift = 18,
- kSignatureMemSegmentMask = 0x07u << kSignatureMemSegmentShift,
-
- // Memory broadcast type (3 bits).
- // |........|XXX.....|........|........|
- kSignatureMemBroadcastShift = 21,
- kSignatureMemBroadcastMask = 0x7u << kSignatureMemBroadcastShift
- };
-
- //! Address type.
- enum class AddrType : uint32_t {
- //! Default address type, Assembler will select the best type when necessary.
- kDefault = 0,
- //! Absolute address type.
- kAbs = 1,
- //! Relative address type.
- kRel = 2,
-
- //! Maximum value of `AddrType`.
- kMaxValue = kRel
- };
-
- //! Memory broadcast type.
- enum class Broadcast : uint32_t {
- //! No broadcast (regular memory operand).
- kNone = 0,
- //! Broadcast {1to2}.
- k1To2 = 1,
- //! Broadcast {1to4}.
- k1To4 = 2,
- //! Broadcast {1to8}.
- k1To8 = 3,
- //! Broadcast {1to16}.
- k1To16 = 4,
- //! Broadcast {1to32}.
- k1To32 = 5,
- //! Broadcast {1to64}.
- k1To64 = 6,
-
- //! Maximum value of `Broadcast`.
- kMaxValue = k1To64
- };
-
- //! \}
-
- //! \name Construction & Destruction
- //! \{
-
- //! Creates a default `Mem` operand that points to [0].
- ASMJIT_INLINE_NODEBUG constexpr Mem() noexcept
- : BaseMem() {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const Mem& other) noexcept
- : BaseMem(other) {}
-
- ASMJIT_INLINE_NODEBUG explicit Mem(Globals::NoInit_) noexcept
- : BaseMem(Globals::NoInit) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const Signature& signature, uint32_t baseId, uint32_t indexId, int32_t offset) noexcept
- : BaseMem(signature, baseId, indexId, offset) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const Label& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(RegType::kLabelTag) |
- Signature::fromSize(size) |
- signature, base.id(), 0, off) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const Label& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(RegType::kLabelTag) |
- Signature::fromMemIndexType(index.type()) |
- Signature::fromValue<kSignatureMemShiftValueMask>(shift) |
- Signature::fromSize(size) |
- signature, base.id(), index.id(), off) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(base.type()) |
- Signature::fromSize(size) |
- signature, base.id(), 0, off) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(const BaseReg& base, const BaseReg& index, uint32_t shift, int32_t off, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemBaseType(base.type()) |
- Signature::fromMemIndexType(index.type()) |
- Signature::fromValue<kSignatureMemShiftValueMask>(shift) |
- Signature::fromSize(size) |
- signature, base.id(), index.id(), off) {}
-
- ASMJIT_INLINE_NODEBUG constexpr explicit Mem(uint64_t base, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromSize(size) |
- signature, uint32_t(base >> 32), 0, int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
-
- ASMJIT_INLINE_NODEBUG constexpr Mem(uint64_t base, const BaseReg& index, uint32_t shift = 0, uint32_t size = 0, Signature signature = OperandSignature{0}) noexcept
- : BaseMem(Signature::fromOpType(OperandType::kMem) |
- Signature::fromMemIndexType(index.type()) |
- Signature::fromValue<kSignatureMemShiftValueMask>(shift) |
- Signature::fromSize(size) |
- signature, uint32_t(base >> 32), index.id(), int32_t(uint32_t(base & 0xFFFFFFFFu))) {}
-
- //! \}
-
- //! \name Overloaded Operators
- //! \{
-
- ASMJIT_INLINE_NODEBUG Mem& operator=(const Mem& other) noexcept = default;
-
- //! \}
-
- //! \name Clone
- //! \{
-
- //! Clones the memory operand.
- ASMJIT_INLINE_NODEBUG constexpr Mem clone() const noexcept { return Mem(*this); }
-
- //! Creates a copy of this memory operand adjusted by `off`.
- inline Mem cloneAdjusted(int64_t off) const noexcept {
- Mem result(*this);
- result.addOffset(off);
- return result;
- }
-
- //! Creates a copy of this memory operand resized to `size`.
- inline Mem cloneResized(uint32_t size) const noexcept {
- Mem result(*this);
- result.setSize(size);
- return result;
- }
-
- //! Creates a copy of this memory operand with a broadcast `bcst`.
- ASMJIT_INLINE_NODEBUG constexpr Mem cloneBroadcasted(Broadcast bcst) const noexcept {
- return Mem((_signature & ~Signature{kSignatureMemBroadcastMask}) | Signature::fromValue<kSignatureMemBroadcastMask>(bcst), _baseId, _data[0], int32_t(_data[1]));
- }
-
- //! \}
-
- //! \name Base & Index
- //! \{
-
- //! Converts memory `baseType` and `baseId` to `x86::Reg` instance.
- //!
- //! The memory must have a valid base register otherwise the result will be wrong.
- ASMJIT_INLINE_NODEBUG Reg baseReg() const noexcept { return Reg::fromTypeAndId(baseType(), baseId()); }
-
- //! Converts memory `indexType` and `indexId` to `x86::Reg` instance.
- //!
- //! The memory must have a valid index register otherwise the result will be wrong.
- ASMJIT_INLINE_NODEBUG Reg indexReg() const noexcept { return Reg::fromTypeAndId(indexType(), indexId()); }
-
- using BaseMem::setIndex;
-
- ASMJIT_INLINE_NODEBUG void setIndex(const BaseReg& index, uint32_t shift) noexcept {
- setIndex(index);
- setShift(shift);
- }
-
- //! \}
-
- //! \name Memory Size
- //! \{
-
- //! Tests whether the memory operand specifies a size (i.e. the size is not zero).
- ASMJIT_INLINE_NODEBUG constexpr bool hasSize() const noexcept { return _signature.hasField<Signature::kSizeMask>(); }
- //! Tests whether the memory operand size matches size `s`.
- ASMJIT_INLINE_NODEBUG constexpr bool hasSize(uint32_t s) const noexcept { return size() == s; }
-
- //! Returns the size of the memory operand in bytes.
- //!
- //! \note Most instructions would deduce the size of the memory operand, so in most cases it's expected that the
- //! returned value would be zero. However, some instruction require the size to select between multiple variations,
- //! so in some cases size is required would be non-zero (for example `inc [mem], immediate` requires size to
- //! distinguish between 8-bit, 16-bit, 32-bit, and 64-bit increments.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t size() const noexcept { return _signature.getField<Signature::kSizeMask>(); }
-
- //! \}
-
- //! \name Address Type
- //! \{
-
- //! Returns the address type of the memory operand.
- //!
- //! By default, address type of newly created memory operands is always \ref AddrType::kDefault.
- ASMJIT_INLINE_NODEBUG constexpr AddrType addrType() const noexcept { return (AddrType)_signature.getField<kSignatureMemAddrTypeMask>(); }
- //! Sets the address type to `addrType`.
- ASMJIT_INLINE_NODEBUG void setAddrType(AddrType addrType) noexcept { _signature.setField<kSignatureMemAddrTypeMask>(uint32_t(addrType)); }
- //! Resets the address type to \ref AddrType::kDefault.
- ASMJIT_INLINE_NODEBUG void resetAddrType() noexcept { _signature.setField<kSignatureMemAddrTypeMask>(uint32_t(AddrType::kDefault)); }
-
- //! Tests whether the address type is \ref AddrType::kAbs.
- ASMJIT_INLINE_NODEBUG constexpr bool isAbs() const noexcept { return addrType() == AddrType::kAbs; }
- //! Sets the address type to \ref AddrType::kAbs.
- ASMJIT_INLINE_NODEBUG void setAbs() noexcept { setAddrType(AddrType::kAbs); }
-
- //! Tests whether the address type is \ref AddrType::kRel.
- ASMJIT_INLINE_NODEBUG constexpr bool isRel() const noexcept { return addrType() == AddrType::kRel; }
- //! Sets the address type to \ref AddrType::kRel.
- ASMJIT_INLINE_NODEBUG void setRel() noexcept { setAddrType(AddrType::kRel); }
-
- //! \}
-
- //! \name Segment
- //! \{
-
- //! Tests whether the memory operand has a segment override.
- ASMJIT_INLINE_NODEBUG constexpr bool hasSegment() const noexcept { return _signature.hasField<kSignatureMemSegmentMask>(); }
- //! Returns the associated segment override as `SReg` operand.
- ASMJIT_INLINE_NODEBUG constexpr SReg segment() const noexcept { return SReg(segmentId()); }
- //! Returns segment override register id, see `SReg::Id`.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t segmentId() const noexcept { return _signature.getField<kSignatureMemSegmentMask>(); }
-
- //! Sets the segment override to `seg`.
- ASMJIT_INLINE_NODEBUG void setSegment(const SReg& seg) noexcept { setSegment(seg.id()); }
- //! Sets the segment override to `id`.
- ASMJIT_INLINE_NODEBUG void setSegment(uint32_t rId) noexcept { _signature.setField<kSignatureMemSegmentMask>(rId); }
- //! Resets the segment override.
- ASMJIT_INLINE_NODEBUG void resetSegment() noexcept { _signature.setField<kSignatureMemSegmentMask>(0); }
-
- //! \}
-
- //! \name Shift
- //! \{
-
- //! Tests whether the memory operand has shift (aka scale) value.
- ASMJIT_INLINE_NODEBUG constexpr bool hasShift() const noexcept { return _signature.hasField<kSignatureMemShiftValueMask>(); }
- //! Returns the memory operand's shift (aka scale) value.
- ASMJIT_INLINE_NODEBUG constexpr uint32_t shift() const noexcept { return _signature.getField<kSignatureMemShiftValueMask>(); }
- //! Sets the memory operand's shift (aka scale) value.
- ASMJIT_INLINE_NODEBUG void setShift(uint32_t shift) noexcept { _signature.setField<kSignatureMemShiftValueMask>(shift); }
- //! Resets the memory operand's shift (aka scale) value to zero.
- ASMJIT_INLINE_NODEBUG void resetShift() noexcept { _signature.setField<kSignatureMemShiftValueMask>(0); }
-
- //! \}
-
- //! \name Broadcast
- //! \{
-
- //! Tests whether the memory operand has broadcast {1tox}.
- ASMJIT_INLINE_NODEBUG constexpr bool hasBroadcast() const noexcept { return _signature.hasField<kSignatureMemBroadcastMask>(); }
- //! Returns the memory operand's broadcast.
- ASMJIT_INLINE_NODEBUG constexpr Broadcast getBroadcast() const noexcept { return (Broadcast)_signature.getField<kSignatureMemBroadcastMask>(); }
- //! Sets the memory operand's broadcast.
- ASMJIT_INLINE_NODEBUG void setBroadcast(Broadcast b) noexcept { _signature.setField<kSignatureMemBroadcastMask>(uint32_t(b)); }
- //! Resets the memory operand's broadcast to none.
- ASMJIT_INLINE_NODEBUG void resetBroadcast() noexcept { _signature.setField<kSignatureMemBroadcastMask>(0); }
-
- //! Returns a new `Mem` without a broadcast (the possible broadcast is cleared).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to1() const noexcept { return cloneBroadcasted(Broadcast::kNone); }
- //! Returns a new `Mem` with {1to2} broadcast (AVX-512).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to2() const noexcept { return cloneBroadcasted(Broadcast::k1To2); }
- //! Returns a new `Mem` with {1to4} broadcast (AVX-512).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to4() const noexcept { return cloneBroadcasted(Broadcast::k1To4); }
- //! Returns a new `Mem` with {1to8} broadcast (AVX-512).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to8() const noexcept { return cloneBroadcasted(Broadcast::k1To8); }
- //! Returns a new `Mem` with {1to16} broadcast (AVX-512).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to16() const noexcept { return cloneBroadcasted(Broadcast::k1To16); }
- //! Returns a new `Mem` with {1to32} broadcast (AVX-512).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to32() const noexcept { return cloneBroadcasted(Broadcast::k1To32); }
- //! Returns a new `Mem` with {1to64} broadcast (AVX-512).
- ASMJIT_INLINE_NODEBUG constexpr Mem _1to64() const noexcept { return cloneBroadcasted(Broadcast::k1To64); }
-
- //! \}
-};
-
-//! Creates `[base.reg + offset]` memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(base, offset, size);
-}
-//! Creates `[base.reg + (index << shift) + offset]` memory operand (scalar index).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, offset, size);
-}
-//! Creates `[base.reg + (index << shift) + offset]` memory operand (vector index).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, offset, size);
-}
-
-//! Creates `[base + offset]` memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(base, offset, size);
-}
-//! Creates `[base + (index << shift) + offset]` memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, offset, size);
-}
-//! Creates `[base + (index << shift) + offset]` memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Label& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, offset, size);
-}
-
-//! Creates `[rip + offset]` memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(const Rip& rip_, int32_t offset = 0, uint32_t size = 0) noexcept {
- return Mem(rip_, offset, size);
-}
-
-//! Creates `[base]` absolute memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base, uint32_t size = 0) noexcept {
- return Mem(base, size);
-}
-//! Creates `[base + (index.reg << shift)]` absolute memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size);
-}
-//! Creates `[base + (index.reg << shift)]` absolute memory operand.
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size);
-}
-
-//! Creates `[base]` absolute memory operand (absolute).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_abs(uint64_t base, uint32_t size = 0) noexcept {
- return Mem(base, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
-}
-//! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_abs(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
-}
-//! Creates `[base + (index.reg << shift)]` absolute memory operand (absolute).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_abs(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs));
-}
-
-//! Creates `[base]` relative memory operand (relative).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_rel(uint64_t base, uint32_t size = 0) noexcept {
- return Mem(base, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
-}
-//! Creates `[base + (index.reg << shift)]` relative memory operand (relative).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_rel(uint64_t base, const Reg& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
-}
-//! Creates `[base + (index.reg << shift)]` relative memory operand (relative).
-static ASMJIT_INLINE_NODEBUG constexpr Mem ptr_rel(uint64_t base, const Vec& index, uint32_t shift = 0, uint32_t size = 0) noexcept {
- return Mem(base, index, shift, size, OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel));
-}
-
-#define ASMJIT_MEM_PTR(FUNC, SIZE) \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- const Gp& base, int32_t offset = 0) noexcept \
- { return Mem(base, offset, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- const Gp& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept \
- { return Mem(base, index, shift, offset, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- const Gp& base, const Vec& index, uint32_t shift = 0, int32_t offset = 0) noexcept \
- { return Mem(base, index, shift, offset, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- const Label& base, int32_t offset = 0) noexcept \
- { return Mem(base, offset, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- const Label& base, const Gp& index, uint32_t shift = 0, int32_t offset = 0) noexcept \
- { return Mem(base, index, shift, offset, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- const Rip& rip_, int32_t offset = 0) noexcept \
- { return Mem(rip_, offset, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- uint64_t base) noexcept \
- { return Mem(base, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \
- { return Mem(base, index, shift, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC( \
- uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \
- { return Mem(base, index, shift, SIZE); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_abs( \
- uint64_t base) noexcept \
- { return Mem(base, SIZE, \
- OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_abs( \
- uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \
- { return Mem(base, index, shift, SIZE, \
- OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_abs( \
- uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \
- { return Mem(base, index, shift, SIZE, \
- OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kAbs)); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_rel( \
- uint64_t base) noexcept \
- { return Mem(base, SIZE, \
- OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_rel( \
- uint64_t base, const Gp& index, uint32_t shift = 0) noexcept \
- { return Mem(base, index, shift, SIZE, \
- OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); } \
- \
- static ASMJIT_INLINE_NODEBUG constexpr Mem FUNC##_rel( \
- uint64_t base, const Vec& index, uint32_t shift = 0) noexcept \
- { return Mem(base, index, shift, SIZE, \
- OperandSignature::fromValue<Mem::kSignatureMemAddrTypeMask>(Mem::AddrType::kRel)); }
-
-// Definition of memory operand constructors that use platform independent naming.
-ASMJIT_MEM_PTR(ptr_8, 1)
-ASMJIT_MEM_PTR(ptr_16, 2)
-ASMJIT_MEM_PTR(ptr_32, 4)
-ASMJIT_MEM_PTR(ptr_48, 6)
-ASMJIT_MEM_PTR(ptr_64, 8)
-ASMJIT_MEM_PTR(ptr_80, 10)
-ASMJIT_MEM_PTR(ptr_128, 16)
-ASMJIT_MEM_PTR(ptr_256, 32)
-ASMJIT_MEM_PTR(ptr_512, 64)
-
-// Definition of memory operand constructors that use X86-specific convention.
-ASMJIT_MEM_PTR(byte_ptr, 1)
-ASMJIT_MEM_PTR(word_ptr, 2)
-ASMJIT_MEM_PTR(dword_ptr, 4)
-ASMJIT_MEM_PTR(fword_ptr, 6)
-ASMJIT_MEM_PTR(qword_ptr, 8)
-ASMJIT_MEM_PTR(tbyte_ptr, 10)
-ASMJIT_MEM_PTR(tword_ptr, 10)
-ASMJIT_MEM_PTR(oword_ptr, 16)
-ASMJIT_MEM_PTR(dqword_ptr, 16)
-ASMJIT_MEM_PTR(qqword_ptr, 32)
-ASMJIT_MEM_PTR(xmmword_ptr, 16)
-ASMJIT_MEM_PTR(ymmword_ptr, 32)
-ASMJIT_MEM_PTR(zmmword_ptr, 64)
-
-#undef ASMJIT_MEM_PTR
-
-//! \}
-
-ASMJIT_END_SUB_NAMESPACE
-
-//! \cond INTERNAL
-ASMJIT_BEGIN_NAMESPACE
-ASMJIT_DEFINE_TYPE_ID(x86::Gpb, TypeId::kInt8);
-ASMJIT_DEFINE_TYPE_ID(x86::Gpw, TypeId::kInt16);
-ASMJIT_DEFINE_TYPE_ID(x86::Gpd, TypeId::kInt32);
-ASMJIT_DEFINE_TYPE_ID(x86::Gpq, TypeId::kInt64);
-ASMJIT_DEFINE_TYPE_ID(x86::Mm , TypeId::kMmx64);
-ASMJIT_DEFINE_TYPE_ID(x86::Xmm, TypeId::kInt32x4);
-ASMJIT_DEFINE_TYPE_ID(x86::Ymm, TypeId::kInt32x8);
-ASMJIT_DEFINE_TYPE_ID(x86::Zmm, TypeId::kInt32x16);
-ASMJIT_END_NAMESPACE
-//! \endcond
-
-#endif // ASMJIT_X86_X86OPERAND_H_INCLUDED
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp b/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp
deleted file mode 100644
index 88a8b39a0b0..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86rapass.cpp
+++ /dev/null
@@ -1,1514 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include "../core/api-build_p.h"
-#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
-
-#include "../core/cpuinfo.h"
-#include "../core/support.h"
-#include "../core/type.h"
-#include "../x86/x86assembler.h"
-#include "../x86/x86compiler.h"
-#include "../x86/x86instapi_p.h"
-#include "../x86/x86instdb_p.h"
-#include "../x86/x86emithelper_p.h"
-#include "../x86/x86rapass_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-// x86::X86RAPass - Utilities
-// ==========================
-
-static ASMJIT_FORCE_INLINE uint64_t raImmMaskFromSize(uint32_t size) noexcept {
- ASMJIT_ASSERT(size > 0 && size < 256);
- static constexpr uint64_t masks[] = {
- 0x00000000000000FFu, // 1
- 0x000000000000FFFFu, // 2
- 0x00000000FFFFFFFFu, // 4
- 0xFFFFFFFFFFFFFFFFu, // 8
- 0x0000000000000000u, // 16
- 0x0000000000000000u, // 32
- 0x0000000000000000u, // 64
- 0x0000000000000000u, // 128
- 0x0000000000000000u // 256
- };
- return masks[Support::ctz(size)];
-}
-
-static const RegMask raConsecutiveLeadCountToRegMaskFilter[5] = {
- 0xFFFFFFFFu, // [0] No consecutive.
- 0x00000000u, // [1] Invalid, never used.
- 0x55555555u, // [2] Even registers.
- 0x00000000u, // [3] Invalid, never used.
- 0x11111111u // [4] Every fourth register.
-};
-
-static ASMJIT_FORCE_INLINE RATiedFlags raUseOutFlagsFromRWFlags(OpRWFlags rwFlags) noexcept {
- static constexpr RATiedFlags map[] = {
- RATiedFlags::kNone,
- RATiedFlags::kRead | RATiedFlags::kUse, // kRead
- RATiedFlags::kWrite | RATiedFlags::kOut, // kWrite
- RATiedFlags::kRW | RATiedFlags::kUse, // kRW
- RATiedFlags::kNone,
- RATiedFlags::kRead | RATiedFlags::kUse | RATiedFlags::kUseRM, // kRead | kRegMem
- RATiedFlags::kWrite | RATiedFlags::kOut | RATiedFlags::kOutRM, // kWrite | kRegMem
- RATiedFlags::kRW | RATiedFlags::kUse | RATiedFlags::kUseRM // kRW | kRegMem
- };
-
- return map[uint32_t(rwFlags & (OpRWFlags::kRW | OpRWFlags::kRegMem))];
-}
-
-static ASMJIT_FORCE_INLINE RATiedFlags raRegRwFlags(OpRWFlags flags) noexcept {
- return (RATiedFlags)raUseOutFlagsFromRWFlags(flags);
-}
-
-static ASMJIT_FORCE_INLINE RATiedFlags raMemBaseRwFlags(OpRWFlags flags) noexcept {
- constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemBaseRW)>::value;
- return (RATiedFlags)raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> kShift) & OpRWFlags::kRW);
-}
-
-static ASMJIT_FORCE_INLINE RATiedFlags raMemIndexRwFlags(OpRWFlags flags) noexcept {
- constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(OpRWFlags::kMemIndexRW)>::value;
- return (RATiedFlags)raUseOutFlagsFromRWFlags(OpRWFlags(uint32_t(flags) >> kShift) & OpRWFlags::kRW);
-}
-
-// x86::RACFGBuilder
-// =================
-
-class RACFGBuilder : public RACFGBuilderT<RACFGBuilder> {
-public:
- Arch _arch;
- bool _is64Bit;
- bool _avxEnabled;
-
- inline RACFGBuilder(X86RAPass* pass) noexcept
- : RACFGBuilderT<RACFGBuilder>(pass),
- _arch(pass->cc()->arch()),
- _is64Bit(pass->registerSize() == 8),
- _avxEnabled(pass->avxEnabled()) {
- }
-
- inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cc); }
-
- inline uint32_t choose(uint32_t sseInst, uint32_t avxInst) const noexcept {
- return _avxEnabled ? avxInst : sseInst;
- }
-
- Error onInst(InstNode* inst, InstControlFlow& cf, RAInstBuilder& ib) noexcept;
-
- Error onBeforeInvoke(InvokeNode* invokeNode) noexcept;
- Error onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept;
-
- Error moveVecToPtr(InvokeNode* invokeNode, const FuncValue& arg, const Vec& src, BaseReg* out) noexcept;
- Error moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept;
- Error moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept;
- Error moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept;
-
- Error onBeforeRet(FuncRetNode* funcRet) noexcept;
- Error onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept;
-};
-
-// x86::RACFGBuilder - OnInst
-// ==========================
-
-Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& cf, RAInstBuilder& ib) noexcept {
- InstRWInfo rwInfo;
-
- InstId instId = inst->id();
- if (Inst::isDefinedId(instId)) {
- uint32_t opCount = inst->opCount();
- const Operand* opArray = inst->operands();
- ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo));
-
- const InstDB::InstInfo& instInfo = InstDB::infoById(instId);
- bool hasGpbHiConstraint = false;
- uint32_t singleRegOps = 0;
-
- // Copy instruction RW flags to instruction builder except kMovOp, which is propagated manually later.
- ib.addInstRWFlags(rwInfo.instFlags() & ~InstRWFlags::kMovOp);
-
- // Mask of all operand types used by the instruction - can be used as an optimization later.
- uint32_t opTypesMask = 0u;
-
- if (opCount) {
- // The mask is for all registers, but we are mostly interested in AVX-512 registers at the moment. The mask
- // will be combined with all available registers of the Compiler at the end so we it never use more registers
- // than available.
- RegMask instructionAllowedRegs = 0xFFFFFFFFu;
-
- uint32_t consecutiveOffset = 0;
- uint32_t consecutiveLeadId = Globals::kInvalidId;
- uint32_t consecutiveParent = Globals::kInvalidId;
-
- if (instInfo.isEvex()) {
- // EVEX instruction and VEX instructions that can be encoded with EVEX have the possibility to use 32 SIMD
- // registers (XMM/YMM/ZMM).
- if (instInfo.isVex() && !instInfo.isEvexCompatible()) {
- if (instInfo.isEvexKRegOnly()) {
- // EVEX encodable only if the first operand is K register (compare instructions).
- if (!Reg::isKReg(opArray[0]))
- instructionAllowedRegs = 0xFFFFu;
- }
- else if (instInfo.isEvexTwoOpOnly()) {
- // EVEX encodable only if the instruction has two operands (gather instructions).
- if (opCount != 2)
- instructionAllowedRegs = 0xFFFFu;
- }
- else {
- instructionAllowedRegs = 0xFFFFu;
- }
- }
- }
- else if (instInfo.isEvexTransformable()) {
- ib.addAggregatedFlags(RATiedFlags::kInst_IsTransformable);
- }
- else {
- // Not EVEX, restrict everything to [0-15] registers.
- instructionAllowedRegs = 0xFFFFu;
- }
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand& op = opArray[i];
- const OpRWInfo& opRwInfo = rwInfo.operand(i);
-
- opTypesMask |= 1u << uint32_t(op.opType());
-
- if (op.isReg()) {
- // Register Operand
- // ----------------
- const Reg& reg = op.as<Reg>();
-
- RATiedFlags flags = raRegRwFlags(opRwInfo.opFlags());
- RegMask allowedRegs = instructionAllowedRegs;
-
- if (opRwInfo.isUnique())
- flags |= RATiedFlags::kUnique;
-
- // X86-specific constraints related to LO|HI general purpose registers. This is only required when the
- // register is part of the encoding. If the register is fixed we won't restrict anything as it doesn't
- // restrict encoding of other registers.
- if (reg.isGpb() && !opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
- flags |= RATiedFlags::kX86_Gpb;
- if (!_is64Bit) {
- // Restrict to first four - AL|AH|BL|BH|CL|CH|DL|DH. In 32-bit mode it's not possible to access
- // SIL|DIL, etc, so this is just enough.
- allowedRegs = 0x0Fu;
- }
- else {
- // If we encountered GPB-HI register the situation is much more complicated than in 32-bit mode.
- // We need to patch all registers to not use ID higher than 7 and all GPB-LO registers to not use
- // index higher than 3. Instead of doing the patching here we just set a flag and will do it later,
- // to not complicate this loop.
- if (reg.isGpbHi()) {
- hasGpbHiConstraint = true;
- allowedRegs = 0x0Fu;
- }
- }
- }
-
- uint32_t vIndex = Operand::virtIdToIndex(reg.id());
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- // Use RW instead of Write in case that not the whole register is overwritten. This is important
- // for liveness as we cannot kill a register that will be used. For example `mov al, 0xFF` is not
- // a write-only operation if user allocated the whole `rax` register.
- if ((flags & RATiedFlags::kRW) == RATiedFlags::kWrite) {
- if (workReg->regByteMask() & ~(opRwInfo.writeByteMask() | opRwInfo.extendByteMask())) {
- // Not write-only operation.
- flags = (flags & ~RATiedFlags::kOut) | (RATiedFlags::kRead | RATiedFlags::kUse);
- }
- }
-
- // Do not use RegMem flag if changing Reg to Mem requires a CPU feature that is not available.
- if (rwInfo.rmFeature() && Support::test(flags, RATiedFlags::kUseRM | RATiedFlags::kOutRM)) {
- if (!cc()->code()->cpuFeatures().has(rwInfo.rmFeature())) {
- flags &= ~(RATiedFlags::kUseRM | RATiedFlags::kOutRM);
- }
- }
-
- RegGroup group = workReg->group();
- RegMask useRegs = _pass->_availableRegs[group] & allowedRegs;
- RegMask outRegs = useRegs;
-
- uint32_t useId = BaseReg::kIdBad;
- uint32_t outId = BaseReg::kIdBad;
-
- uint32_t useRewriteMask = 0;
- uint32_t outRewriteMask = 0;
-
- if (opRwInfo.consecutiveLeadCount()) {
- // There must be a single consecutive register lead, otherwise the RW data is invalid.
- if (consecutiveLeadId != Globals::kInvalidId)
- return DebugUtils::errored(kErrorInvalidState);
-
- // A consecutive lead register cannot be used as a consecutive +1/+2/+3 register, the registers must be distinct.
- if (RATiedReg::consecutiveDataFromFlags(flags) != 0)
- return DebugUtils::errored(kErrorNotConsecutiveRegs);
-
- flags |= RATiedFlags::kLeadConsecutive | RATiedReg::consecutiveDataToFlags(opRwInfo.consecutiveLeadCount() - 1);
- consecutiveLeadId = workReg->workId();
-
- RegMask filter = raConsecutiveLeadCountToRegMaskFilter[opRwInfo.consecutiveLeadCount()];
- if (Support::test(flags, RATiedFlags::kUse)) {
- flags |= RATiedFlags::kUseConsecutive;
- useRegs &= filter;
- }
- else {
- flags |= RATiedFlags::kOutConsecutive;
- outRegs &= filter;
- }
- }
-
- if (Support::test(flags, RATiedFlags::kUse)) {
- useRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
- if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
- useId = opRwInfo.physId();
- flags |= RATiedFlags::kUseFixed;
- }
- else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
- if (consecutiveLeadId == Globals::kInvalidId)
- return DebugUtils::errored(kErrorInvalidState);
-
- if (consecutiveLeadId == workReg->workId())
- return DebugUtils::errored(kErrorOverlappedRegs);
-
- flags |= RATiedFlags::kUseConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
- }
- }
- else {
- outRewriteMask = Support::bitMask(inst->getRewriteIndex(&reg._baseId));
- if (opRwInfo.hasOpFlag(OpRWFlags::kRegPhysId)) {
- outId = opRwInfo.physId();
- flags |= RATiedFlags::kOutFixed;
- }
- else if (opRwInfo.hasOpFlag(OpRWFlags::kConsecutive)) {
- if (consecutiveLeadId == Globals::kInvalidId)
- return DebugUtils::errored(kErrorInvalidState);
-
- if (consecutiveLeadId == workReg->workId())
- return DebugUtils::errored(kErrorOverlappedRegs);
-
- flags |= RATiedFlags::kOutConsecutive | RATiedReg::consecutiveDataToFlags(++consecutiveOffset);
- }
- }
-
- ASMJIT_PROPAGATE(ib.add(workReg, flags, useRegs, useId, useRewriteMask, outRegs, outId, outRewriteMask, opRwInfo.rmSize(), consecutiveParent));
- if (singleRegOps == i)
- singleRegOps++;
-
- if (Support::test(flags, RATiedFlags::kLeadConsecutive | RATiedFlags::kUseConsecutive | RATiedFlags::kOutConsecutive))
- consecutiveParent = workReg->workId();
- }
- }
- else if (op.isMem()) {
- // Memory Operand
- // --------------
- const Mem& mem = op.as<Mem>();
- ib.addForbiddenFlags(RATiedFlags::kUseRM | RATiedFlags::kOutRM);
-
- if (mem.isRegHome()) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(mem.baseId()), &workReg));
- _pass->getOrCreateStackSlot(workReg);
- }
- else if (mem.hasBaseReg()) {
- uint32_t vIndex = Operand::virtIdToIndex(mem.baseId());
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RATiedFlags flags = raMemBaseRwFlags(opRwInfo.opFlags());
- RegGroup group = workReg->group();
- RegMask inOutRegs = _pass->_availableRegs[group];
-
- uint32_t useId = BaseReg::kIdBad;
- uint32_t outId = BaseReg::kIdBad;
-
- uint32_t useRewriteMask = 0;
- uint32_t outRewriteMask = 0;
-
- if (Support::test(flags, RATiedFlags::kUse)) {
- useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
- if (opRwInfo.hasOpFlag(OpRWFlags::kMemPhysId)) {
- useId = opRwInfo.physId();
- flags |= RATiedFlags::kUseFixed;
- }
- }
- else {
- outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._baseId));
- if (opRwInfo.hasOpFlag(OpRWFlags::kMemPhysId)) {
- outId = opRwInfo.physId();
- flags |= RATiedFlags::kOutFixed;
- }
- }
-
- ASMJIT_PROPAGATE(ib.add(workReg, flags, inOutRegs, useId, useRewriteMask, inOutRegs, outId, outRewriteMask));
- }
- }
-
- if (mem.hasIndexReg()) {
- uint32_t vIndex = Operand::virtIdToIndex(mem.indexId());
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RATiedFlags flags = raMemIndexRwFlags(opRwInfo.opFlags());
- RegGroup group = workReg->group();
- RegMask inOutRegs = _pass->_availableRegs[group] & instructionAllowedRegs;
-
- // Index registers have never fixed id on X86/x64.
- const uint32_t useId = BaseReg::kIdBad;
- const uint32_t outId = BaseReg::kIdBad;
-
- uint32_t useRewriteMask = 0;
- uint32_t outRewriteMask = 0;
-
- if (Support::test(flags, RATiedFlags::kUse))
- useRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
- else
- outRewriteMask = Support::bitMask(inst->getRewriteIndex(&mem._data[Operand::kDataMemIndexId]));
-
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, inOutRegs, useId, useRewriteMask, inOutRegs, outId, outRewriteMask));
- }
- }
- }
- }
- }
-
- // Handle extra operand (either REP {cx|ecx|rcx} or AVX-512 {k} selector).
- if (inst->hasExtraReg()) {
- uint32_t vIndex = Operand::virtIdToIndex(inst->extraReg().id());
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RegGroup group = workReg->group();
- RegMask inOutRegs = _pass->_availableRegs[group];
- uint32_t rewriteMask = Support::bitMask(inst->getRewriteIndex(&inst->extraReg()._id));
-
- if (group == RegGroup::kX86_K) {
- // AVX-512 mask selector {k} register - read-only, allocable to any register except {k0}.
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, inOutRegs, BaseReg::kIdBad, rewriteMask, inOutRegs, BaseReg::kIdBad, 0));
- singleRegOps = 0;
- }
- else {
- // REP {cx|ecx|rcx} register - read & write, allocable to {cx|ecx|rcx} only.
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRW, inOutRegs, Gp::kIdCx, rewriteMask, inOutRegs, Gp::kIdBad, 0));
- }
- }
- else {
- RegGroup group = inst->extraReg().group();
- if (group == RegGroup::kX86_K && inst->extraReg().id() != 0)
- singleRegOps = 0;
- }
- }
-
- // If this instruction has move semantics then check whether it could be eliminated if all virtual registers
- // are allocated into the same register. Take into account the virtual size of the destination register as that's
- // more important than a physical register size in this case.
- if (rwInfo.hasInstFlag(InstRWFlags::kMovOp) && !inst->hasExtraReg() && Support::bitTest(opTypesMask, uint32_t(OperandType::kReg))) {
- // AVX+ move instructions have 3 operand form - the first two operands must be the same to guarantee move semantics.
- if (opCount == 2 || (opCount == 3 && opArray[0] == opArray[1])) {
- uint32_t vIndex = Operand::virtIdToIndex(opArray[0].as<Reg>().id());
- if (vIndex < Operand::kVirtIdCount) {
- const VirtReg* vReg = _cc->virtRegByIndex(vIndex);
- const OpRWInfo& opRwInfo = rwInfo.operand(0);
-
- uint64_t remainingByteMask = vReg->workReg()->regByteMask() & ~opRwInfo.writeByteMask();
- if (remainingByteMask == 0u || (remainingByteMask & opRwInfo.extendByteMask()) == 0)
- ib.addInstRWFlags(InstRWFlags::kMovOp);
- }
- }
- }
-
- // Handle X86 constraints.
- if (hasGpbHiConstraint) {
- for (RATiedReg& tiedReg : ib) {
- RegMask filter = tiedReg.hasFlag(RATiedFlags::kX86_Gpb) ? 0x0Fu : 0xFFu;
- tiedReg._useRegMask &= filter;
- tiedReg._outRegMask &= filter;
- }
- }
-
- if (ib.tiedRegCount() == 1) {
- // Handle special cases of some instructions where all operands share the same
- // register. In such case the single operand becomes read-only or write-only.
- InstSameRegHint sameRegHint = InstSameRegHint::kNone;
- if (singleRegOps == opCount) {
- sameRegHint = instInfo.sameRegHint();
- }
- else if (opCount == 2 && inst->op(1).isImm()) {
- // Handle some tricks used by X86 asm.
- const BaseReg& reg = inst->op(0).as<BaseReg>();
- const Imm& imm = inst->op(1).as<Imm>();
-
- const RAWorkReg* workReg = _pass->workRegById(ib[0]->workId());
- uint32_t workRegSize = workReg->signature().size();
-
- switch (inst->id()) {
- case Inst::kIdOr: {
- // Sets the value of the destination register to -1, previous content unused.
- if (reg.size() >= 4 || reg.size() >= workRegSize) {
- if (imm.value() == -1 || imm.valueAs<uint64_t>() == raImmMaskFromSize(reg.size()))
- sameRegHint = InstSameRegHint::kWO;
- }
- ASMJIT_FALLTHROUGH;
- }
-
- case Inst::kIdAdd:
- case Inst::kIdAnd:
- case Inst::kIdRol:
- case Inst::kIdRor:
- case Inst::kIdSar:
- case Inst::kIdShl:
- case Inst::kIdShr:
- case Inst::kIdSub:
- case Inst::kIdXor: {
- // Updates [E|R]FLAGS without changing the content.
- if (reg.size() != 4 || reg.size() >= workRegSize) {
- if (imm.value() == 0)
- sameRegHint = InstSameRegHint::kRO;
- }
- break;
- }
- }
- }
-
- switch (sameRegHint) {
- case InstSameRegHint::kNone:
- break;
- case InstSameRegHint::kRO:
- ib[0]->makeReadOnly();
- break;
- case InstSameRegHint::kWO:
- ib[0]->makeWriteOnly();
- break;
- }
- }
-
- cf = instInfo.controlFlow();
- }
-
- return kErrorOk;
-}
-
-// x86::RACFGBuilder - OnInvoke
-// ============================
-
-Error RACFGBuilder::onBeforeInvoke(InvokeNode* invokeNode) noexcept {
- const FuncDetail& fd = invokeNode->detail();
- uint32_t argCount = invokeNode->argCount();
-
- cc()->_setCursor(invokeNode->prev());
- RegType nativeRegType = cc()->_gpSignature.regType();
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- const FuncValuePack& argPack = fd.argPack(argIndex);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- if (!argPack[valueIndex])
- break;
-
- const FuncValue& arg = argPack[valueIndex];
- const Operand& op = invokeNode->arg(argIndex, valueIndex);
-
- if (op.isNone())
- continue;
-
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (arg.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup argGroup = Reg::groupOf(arg.regType());
-
- if (arg.isIndirect()) {
- if (reg.isGp()) {
- if (reg.type() != nativeRegType)
- return DebugUtils::errored(kErrorInvalidAssignment);
- // It's considered allocated if this is an indirect argument and the user used GP.
- continue;
- }
-
- BaseReg indirectReg;
- moveVecToPtr(invokeNode, arg, reg.as<Vec>(), &indirectReg);
- invokeNode->_args[argIndex][valueIndex] = indirectReg;
- }
- else {
- if (regGroup != argGroup) {
- // TODO: Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- }
- else {
- if (arg.isIndirect()) {
- if (reg.isGp()) {
- if (reg.type() != nativeRegType)
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, reg));
- continue;
- }
-
- BaseReg indirectReg;
- moveVecToPtr(invokeNode, arg, reg.as<Vec>(), &indirectReg);
- ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, indirectReg));
- }
- else {
- ASMJIT_PROPAGATE(moveRegToStackArg(invokeNode, arg, reg));
- }
- }
- }
- else if (op.isImm()) {
- if (arg.isReg()) {
- BaseReg reg;
- ASMJIT_PROPAGATE(moveImmToRegArg(invokeNode, arg, op.as<Imm>(), &reg));
- invokeNode->_args[argIndex][valueIndex] = reg;
- }
- else {
- ASMJIT_PROPAGATE(moveImmToStackArg(invokeNode, arg, op.as<Imm>()));
- }
- }
- }
- }
-
- cc()->_setCursor(invokeNode);
- if (fd.hasFlag(CallConvFlags::kCalleePopsStack) && fd.argStackSize() != 0)
- ASMJIT_PROPAGATE(cc()->sub(cc()->zsp(), fd.argStackSize()));
-
- if (fd.hasRet()) {
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- const FuncValue& ret = fd.ret(valueIndex);
- if (!ret)
- break;
-
- const Operand& op = invokeNode->ret(valueIndex);
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (ret.isReg()) {
- if (ret.regType() == RegType::kX86_St) {
- if (workReg->group() != RegGroup::kVec)
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- Reg dst(workReg->signature(), workReg->virtId());
- Mem mem;
-
- TypeId typeId = TypeUtils::scalarOf(workReg->typeId());
- if (ret.hasTypeId())
- typeId = ret.typeId();
-
- switch (typeId) {
- case TypeId::kFloat32:
- ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 4, 4));
- mem.setSize(4);
- ASMJIT_PROPAGATE(cc()->fstp(mem));
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), dst.as<Xmm>(), mem));
- break;
-
- case TypeId::kFloat64:
- ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 8, 4));
- mem.setSize(8);
- ASMJIT_PROPAGATE(cc()->fstp(mem));
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovsd, Inst::kIdVmovsd), dst.as<Xmm>(), mem));
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- else {
- RegGroup regGroup = workReg->group();
- RegGroup retGroup = Reg::groupOf(ret.regType());
-
- if (regGroup != retGroup) {
- // TODO: Conversion is not supported.
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- }
- }
- }
- }
-
- // This block has function call(s).
- _curBlock->addFlags(RABlockFlags::kHasFuncCalls);
- _pass->func()->frame().addAttributes(FuncAttributes::kHasFuncCalls);
- _pass->func()->frame().updateCallStackSize(fd.argStackSize());
-
- return kErrorOk;
-}
-
-Error RACFGBuilder::onInvoke(InvokeNode* invokeNode, RAInstBuilder& ib) noexcept {
- uint32_t argCount = invokeNode->argCount();
- const FuncDetail& fd = invokeNode->detail();
-
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- const FuncValuePack& argPack = fd.argPack(argIndex);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- if (!argPack[valueIndex])
- continue;
-
- const FuncValue& arg = argPack[valueIndex];
- const Operand& op = invokeNode->arg(argIndex, valueIndex);
-
- if (op.isNone())
- continue;
-
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (arg.isIndirect()) {
- RegGroup regGroup = workReg->group();
- if (regGroup != RegGroup::kGp)
- return DebugUtils::errored(kErrorInvalidState);
- ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
- }
- else if (arg.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup argGroup = Reg::groupOf(arg.regType());
-
- if (regGroup == argGroup) {
- ASMJIT_PROPAGATE(ib.addCallArg(workReg, arg.regId()));
- }
- }
- }
- }
- }
-
- for (uint32_t retIndex = 0; retIndex < Globals::kMaxValuePack; retIndex++) {
- const FuncValue& ret = fd.ret(retIndex);
- if (!ret)
- break;
-
- // Not handled here...
- const Operand& op = invokeNode->ret(retIndex);
- if (ret.regType() == RegType::kX86_St)
- continue;
-
- if (op.isReg()) {
- const Reg& reg = op.as<Reg>();
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(Operand::virtIdToIndex(reg.id()), &workReg));
-
- if (ret.isReg()) {
- RegGroup regGroup = workReg->group();
- RegGroup retGroup = Reg::groupOf(ret.regType());
-
- if (regGroup == retGroup) {
- ASMJIT_PROPAGATE(ib.addCallRet(workReg, ret.regId()));
- }
- }
- else {
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- }
-
- // Setup clobbered registers.
- for (RegGroup group : RegGroupVirtValues{})
- ib._clobbered[group] = Support::lsbMask<RegMask>(_pass->_physRegCount[group]) & ~fd.preservedRegs(group);
-
- return kErrorOk;
-}
-
-// x86::RACFGBuilder - MoveVecToPtr
-// ================================
-
-static inline OperandSignature x86VecRegSignatureBySize(uint32_t size) noexcept {
- return OperandSignature{size >= 64 ? uint32_t(Zmm::kSignature) :
- size >= 32 ? uint32_t(Ymm::kSignature) : uint32_t(Xmm::kSignature)};
-}
-
-Error RACFGBuilder::moveVecToPtr(InvokeNode* invokeNode, const FuncValue& arg, const Vec& src, BaseReg* out) noexcept {
- DebugUtils::unused(invokeNode);
- ASMJIT_ASSERT(arg.isReg());
-
- uint32_t argSize = TypeUtils::sizeOf(arg.typeId());
- if (argSize == 0)
- return DebugUtils::errored(kErrorInvalidState);
-
- if (argSize < 16)
- argSize = 16;
-
- uint32_t argStackOffset = Support::alignUp(invokeNode->detail()._argStackSize, argSize);
- _funcNode->frame().updateCallStackAlignment(argSize);
- invokeNode->detail()._argStackSize = argStackOffset + argSize;
-
- Vec vecReg(x86VecRegSignatureBySize(argSize), src.id());
- Mem vecPtr = ptr(_pass->_sp.as<Gp>(), int32_t(argStackOffset));
-
- uint32_t vMovInstId = choose(Inst::kIdMovaps, Inst::kIdVmovaps);
- if (argSize > 16)
- vMovInstId = Inst::kIdVmovaps;
-
- ASMJIT_PROPAGATE(cc()->_newReg(out, ArchTraits::byArch(cc()->arch()).regTypeToTypeId(cc()->_gpSignature.regType()), nullptr));
-
- VirtReg* vReg = cc()->virtRegById(out->id());
- vReg->setWeight(BaseRAPass::kCallArgWeight);
-
- ASMJIT_PROPAGATE(cc()->lea(out->as<Gp>(), vecPtr));
- ASMJIT_PROPAGATE(cc()->emit(vMovInstId, ptr(out->as<Gp>()), vecReg));
-
- if (arg.isStack()) {
- Mem stackPtr = ptr(_pass->_sp.as<Gp>(), arg.stackOffset());
- ASMJIT_PROPAGATE(cc()->mov(stackPtr, out->as<Gp>()));
- }
-
- return kErrorOk;
-}
-
-// x86::RACFGBuilder - MoveImmToRegArg
-// ===================================
-
-Error RACFGBuilder::moveImmToRegArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_, BaseReg* out) noexcept {
- DebugUtils::unused(invokeNode);
- ASMJIT_ASSERT(arg.isReg());
-
- Imm imm(imm_);
- TypeId rTypeId = TypeId::kUInt32;
-
- switch (arg.typeId()) {
- case TypeId::kInt8: imm.signExtend8Bits(); goto MovU32;
- case TypeId::kUInt8: imm.zeroExtend8Bits(); goto MovU32;
- case TypeId::kInt16: imm.signExtend16Bits(); goto MovU32;
- case TypeId::kUInt16: imm.zeroExtend16Bits(); goto MovU32;
-
- case TypeId::kInt32:
- case TypeId::kUInt32:
-MovU32:
- imm.zeroExtend32Bits();
- break;
-
- case TypeId::kInt64:
- case TypeId::kUInt64:
- // Moving to GPD automatically zero extends in 64-bit mode.
- if (imm.isUInt32()) {
- imm.zeroExtend32Bits();
- break;
- }
-
- rTypeId = TypeId::kUInt64;
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
-
- ASMJIT_PROPAGATE(cc()->_newReg(out, rTypeId, nullptr));
- cc()->virtRegById(out->id())->setWeight(BaseRAPass::kCallArgWeight);
-
- return cc()->mov(out->as<x86::Gp>(), imm);
-}
-
-// x86::RACFGBuilder - MoveImmToStackArg
-// =====================================
-
-Error RACFGBuilder::moveImmToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const Imm& imm_) noexcept {
- DebugUtils::unused(invokeNode);
- ASMJIT_ASSERT(arg.isStack());
-
- Mem stackPtr = ptr(_pass->_sp.as<Gp>(), arg.stackOffset());
- Imm imm[2];
-
- stackPtr.setSize(4);
- imm[0] = imm_;
- uint32_t movCount = 0;
-
- // One stack entry has the same size as the native register size. That means that if we want to move a 32-bit
- // integer on the stack in 64-bit mode, we need to extend it to a 64-bit integer first. In 32-bit mode, pushing
- // a 64-bit on stack is done in two steps by pushing low and high parts separately.
- switch (arg.typeId()) {
- case TypeId::kInt8: imm[0].signExtend8Bits(); goto MovU32;
- case TypeId::kUInt8: imm[0].zeroExtend8Bits(); goto MovU32;
- case TypeId::kInt16: imm[0].signExtend16Bits(); goto MovU32;
- case TypeId::kUInt16: imm[0].zeroExtend16Bits(); goto MovU32;
-
- case TypeId::kInt32:
- case TypeId::kUInt32:
- case TypeId::kFloat32:
-MovU32:
- imm[0].zeroExtend32Bits();
- movCount = 1;
- break;
-
- case TypeId::kInt64:
- case TypeId::kUInt64:
- case TypeId::kFloat64:
- case TypeId::kMmx32:
- case TypeId::kMmx64:
- if (_is64Bit && imm[0].isInt32()) {
- stackPtr.setSize(8);
- movCount = 1;
- break;
- }
-
- imm[1].setValue(imm[0].uint32Hi());
- imm[0].zeroExtend32Bits();
- movCount = 2;
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
-
- for (uint32_t i = 0; i < movCount; i++) {
- ASMJIT_PROPAGATE(cc()->mov(stackPtr, imm[i]));
- stackPtr.addOffsetLo32(int32_t(stackPtr.size()));
- }
-
- return kErrorOk;
-}
-
-// x86::RACFGBuilder - MoveRegToStackArg
-// =====================================
-
-Error RACFGBuilder::moveRegToStackArg(InvokeNode* invokeNode, const FuncValue& arg, const BaseReg& reg) noexcept {
- DebugUtils::unused(invokeNode);
- ASMJIT_ASSERT(arg.isStack());
-
- Mem stackPtr = ptr(_pass->_sp.as<Gp>(), arg.stackOffset());
- Reg r0, r1;
-
- VirtReg* vr = cc()->virtRegById(reg.id());
- uint32_t registerSize = cc()->registerSize();
- InstId instId = 0;
-
- TypeId dstTypeId = arg.typeId();
- TypeId srcTypeId = vr->typeId();
-
- switch (dstTypeId) {
- case TypeId::kInt64:
- case TypeId::kUInt64:
- // Extend BYTE->QWORD (GP).
- if (TypeUtils::isGp8(srcTypeId)) {
- r1.setRegT<RegType::kX86_GpbLo>(reg.id());
-
- instId = (dstTypeId == TypeId::kInt64 && srcTypeId == TypeId::kInt8) ? Inst::kIdMovsx : Inst::kIdMovzx;
- goto ExtendMovGpXQ;
- }
-
- // Extend WORD->QWORD (GP).
- if (TypeUtils::isGp16(srcTypeId)) {
- r1.setRegT<RegType::kX86_Gpw>(reg.id());
-
- instId = (dstTypeId == TypeId::kInt64 && srcTypeId == TypeId::kInt16) ? Inst::kIdMovsx : Inst::kIdMovzx;
- goto ExtendMovGpXQ;
- }
-
- // Extend DWORD->QWORD (GP).
- if (TypeUtils::isGp32(srcTypeId)) {
- r1.setRegT<RegType::kX86_Gpd>(reg.id());
-
- instId = Inst::kIdMovsxd;
- if (dstTypeId == TypeId::kInt64 && srcTypeId == TypeId::kInt32)
- goto ExtendMovGpXQ;
- else
- goto ZeroExtendGpDQ;
- }
-
- // Move QWORD (GP).
- if (TypeUtils::isGp64(srcTypeId)) goto MovGpQ;
- if (TypeUtils::isMmx(srcTypeId)) goto MovMmQ;
- if (TypeUtils::isVec(srcTypeId)) goto MovXmmQ;
- break;
-
- case TypeId::kInt32:
- case TypeId::kUInt32:
- case TypeId::kInt16:
- case TypeId::kUInt16:
- // DWORD <- WORD (Zero|Sign Extend).
- if (TypeUtils::isGp16(srcTypeId)) {
- bool isDstSigned = dstTypeId == TypeId::kInt16 || dstTypeId == TypeId::kInt32;
- bool isSrcSigned = srcTypeId == TypeId::kInt8 || srcTypeId == TypeId::kInt16;
-
- r1.setRegT<RegType::kX86_Gpw>(reg.id());
- instId = isDstSigned && isSrcSigned ? Inst::kIdMovsx : Inst::kIdMovzx;
- goto ExtendMovGpD;
- }
-
- // DWORD <- BYTE (Zero|Sign Extend).
- if (TypeUtils::isGp8(srcTypeId)) {
- bool isDstSigned = dstTypeId == TypeId::kInt16 || dstTypeId == TypeId::kInt32;
- bool isSrcSigned = srcTypeId == TypeId::kInt8 || srcTypeId == TypeId::kInt16;
-
- r1.setRegT<RegType::kX86_GpbLo>(reg.id());
- instId = isDstSigned && isSrcSigned ? Inst::kIdMovsx : Inst::kIdMovzx;
- goto ExtendMovGpD;
- }
- ASMJIT_FALLTHROUGH;
-
- case TypeId::kInt8:
- case TypeId::kUInt8:
- if (TypeUtils::isInt(srcTypeId)) goto MovGpD;
- if (TypeUtils::isMmx(srcTypeId)) goto MovMmD;
- if (TypeUtils::isVec(srcTypeId)) goto MovXmmD;
- break;
-
- case TypeId::kMmx32:
- case TypeId::kMmx64:
- // Extend BYTE->QWORD (GP).
- if (TypeUtils::isGp8(srcTypeId)) {
- r1.setRegT<RegType::kX86_GpbLo>(reg.id());
-
- instId = Inst::kIdMovzx;
- goto ExtendMovGpXQ;
- }
-
- // Extend WORD->QWORD (GP).
- if (TypeUtils::isGp16(srcTypeId)) {
- r1.setRegT<RegType::kX86_Gpw>(reg.id());
-
- instId = Inst::kIdMovzx;
- goto ExtendMovGpXQ;
- }
-
- if (TypeUtils::isGp32(srcTypeId)) goto ExtendMovGpDQ;
- if (TypeUtils::isGp64(srcTypeId)) goto MovGpQ;
- if (TypeUtils::isMmx(srcTypeId)) goto MovMmQ;
- if (TypeUtils::isVec(srcTypeId)) goto MovXmmQ;
- break;
-
- case TypeId::kFloat32:
- case TypeId::kFloat32x1:
- if (TypeUtils::isVec(srcTypeId)) goto MovXmmD;
- break;
-
- case TypeId::kFloat64:
- case TypeId::kFloat64x1:
- if (TypeUtils::isVec(srcTypeId)) goto MovXmmQ;
- break;
-
- default:
- if (TypeUtils::isVec(dstTypeId) && reg.as<Reg>().isVec()) {
- stackPtr.setSize(TypeUtils::sizeOf(dstTypeId));
- uint32_t vMovInstId = choose(Inst::kIdMovaps, Inst::kIdVmovaps);
-
- if (TypeUtils::isVec128(dstTypeId))
- r0.setRegT<RegType::kX86_Xmm>(reg.id());
- else if (TypeUtils::isVec256(dstTypeId))
- r0.setRegT<RegType::kX86_Ymm>(reg.id());
- else if (TypeUtils::isVec512(dstTypeId))
- r0.setRegT<RegType::kX86_Zmm>(reg.id());
- else
- break;
-
- return cc()->emit(vMovInstId, stackPtr, r0);
- }
- break;
- }
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- // Extend+Move Gp.
-ExtendMovGpD:
- stackPtr.setSize(4);
- r0.setRegT<RegType::kX86_Gpd>(reg.id());
-
- ASMJIT_PROPAGATE(cc()->emit(instId, r0, r1));
- ASMJIT_PROPAGATE(cc()->emit(Inst::kIdMov, stackPtr, r0));
- return kErrorOk;
-
-ExtendMovGpXQ:
- if (registerSize == 8) {
- stackPtr.setSize(8);
- r0.setRegT<RegType::kX86_Gpq>(reg.id());
-
- ASMJIT_PROPAGATE(cc()->emit(instId, r0, r1));
- ASMJIT_PROPAGATE(cc()->emit(Inst::kIdMov, stackPtr, r0));
- }
- else {
- stackPtr.setSize(4);
- r0.setRegT<RegType::kX86_Gpd>(reg.id());
-
- ASMJIT_PROPAGATE(cc()->emit(instId, r0, r1));
-
-ExtendMovGpDQ:
- ASMJIT_PROPAGATE(cc()->emit(Inst::kIdMov, stackPtr, r0));
- stackPtr.addOffsetLo32(4);
- ASMJIT_PROPAGATE(cc()->emit(Inst::kIdAnd, stackPtr, 0));
- }
- return kErrorOk;
-
-ZeroExtendGpDQ:
- stackPtr.setSize(4);
- r0.setRegT<RegType::kX86_Gpd>(reg.id());
- goto ExtendMovGpDQ;
-
-MovGpD:
- stackPtr.setSize(4);
- r0.setRegT<RegType::kX86_Gpd>(reg.id());
- return cc()->emit(Inst::kIdMov, stackPtr, r0);
-
-MovGpQ:
- stackPtr.setSize(8);
- r0.setRegT<RegType::kX86_Gpq>(reg.id());
- return cc()->emit(Inst::kIdMov, stackPtr, r0);
-
-MovMmD:
- stackPtr.setSize(4);
- r0.setRegT<RegType::kX86_Mm>(reg.id());
- return cc()->emit(choose(Inst::kIdMovd, Inst::kIdVmovd), stackPtr, r0);
-
-MovMmQ:
- stackPtr.setSize(8);
- r0.setRegT<RegType::kX86_Mm>(reg.id());
- return cc()->emit(choose(Inst::kIdMovq, Inst::kIdVmovq), stackPtr, r0);
-
-MovXmmD:
- stackPtr.setSize(4);
- r0.setRegT<RegType::kX86_Xmm>(reg.id());
- return cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), stackPtr, r0);
-
-MovXmmQ:
- stackPtr.setSize(8);
- r0.setRegT<RegType::kX86_Xmm>(reg.id());
- return cc()->emit(choose(Inst::kIdMovlps, Inst::kIdVmovlps), stackPtr, r0);
-}
-
-// x86::RACFGBuilder - OnReg
-// =========================
-
-Error RACFGBuilder::onBeforeRet(FuncRetNode* funcRet) noexcept {
- const FuncDetail& funcDetail = _pass->func()->detail();
- const Operand* opArray = funcRet->operands();
- uint32_t opCount = funcRet->opCount();
-
- cc()->_setCursor(funcRet->prev());
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand& op = opArray[i];
- const FuncValue& ret = funcDetail.ret(i);
-
- if (!op.isReg())
- continue;
-
- if (ret.regType() == RegType::kX86_St) {
- const Reg& reg = op.as<Reg>();
- uint32_t vIndex = Operand::virtIdToIndex(reg.id());
-
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- if (workReg->group() != RegGroup::kVec)
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- Reg src(workReg->signature(), workReg->virtId());
- Mem mem;
-
- TypeId typeId = TypeUtils::scalarOf(workReg->typeId());
- if (ret.hasTypeId())
- typeId = ret.typeId();
-
- switch (typeId) {
- case TypeId::kFloat32:
- ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 4, 4));
- mem.setSize(4);
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovss, Inst::kIdVmovss), mem, src.as<Xmm>()));
- ASMJIT_PROPAGATE(cc()->fld(mem));
- break;
-
- case TypeId::kFloat64:
- ASMJIT_PROPAGATE(_pass->useTemporaryMem(mem, 8, 4));
- mem.setSize(8);
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovsd, Inst::kIdVmovsd), mem, src.as<Xmm>()));
- ASMJIT_PROPAGATE(cc()->fld(mem));
- break;
-
- default:
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
- }
- }
-
- return kErrorOk;
-}
-
-Error RACFGBuilder::onRet(FuncRetNode* funcRet, RAInstBuilder& ib) noexcept {
- const FuncDetail& funcDetail = _pass->func()->detail();
- const Operand* opArray = funcRet->operands();
- uint32_t opCount = funcRet->opCount();
-
- for (uint32_t i = 0; i < opCount; i++) {
- const Operand& op = opArray[i];
- if (op.isNone()) continue;
-
- const FuncValue& ret = funcDetail.ret(i);
- if (ASMJIT_UNLIKELY(!ret.isReg()))
- return DebugUtils::errored(kErrorInvalidAssignment);
-
- // Not handled here...
- if (ret.regType() == RegType::kX86_St)
- continue;
-
- if (op.isReg()) {
- // Register return value.
- const Reg& reg = op.as<Reg>();
- uint32_t vIndex = Operand::virtIdToIndex(reg.id());
-
- if (vIndex < Operand::kVirtIdCount) {
- RAWorkReg* workReg;
- ASMJIT_PROPAGATE(_pass->virtIndexAsWorkReg(vIndex, &workReg));
-
- RegGroup group = workReg->group();
- RegMask inOutRegs = _pass->_availableRegs[group];
- ASMJIT_PROPAGATE(ib.add(workReg, RATiedFlags::kUse | RATiedFlags::kRead, inOutRegs, ret.regId(), 0, inOutRegs, BaseReg::kIdBad, 0));
- }
- }
- else {
- return DebugUtils::errored(kErrorInvalidAssignment);
- }
- }
-
- return kErrorOk;
-}
-
-// x86::X86RAPass - Construction & Destruction
-// ===========================================
-
-X86RAPass::X86RAPass() noexcept
- : BaseRAPass() { _iEmitHelper = &_emitHelper; }
-X86RAPass::~X86RAPass() noexcept {}
-
-// x86::X86RAPass - OnInit & OnDone
-// ================================
-
-void X86RAPass::onInit() noexcept {
- Arch arch = cc()->arch();
- uint32_t baseRegCount = Environment::is32Bit(arch) ? 8u : 16u;
- uint32_t simdRegCount = baseRegCount;
-
- if (Environment::is64Bit(arch) && _func->frame().isAvx512Enabled())
- simdRegCount = 32u;
-
- bool avxEnabled = _func->frame().isAvxEnabled();
- bool avx512Enabled = _func->frame().isAvx512Enabled();
-
- _emitHelper._emitter = _cb;
- _emitHelper._avxEnabled = avxEnabled || avx512Enabled;
- _emitHelper._avx512Enabled = avx512Enabled;
-
- _archTraits = &ArchTraits::byArch(arch);
- _physRegCount.set(RegGroup::kGp, baseRegCount);
- _physRegCount.set(RegGroup::kVec, simdRegCount);
- _physRegCount.set(RegGroup::kX86_K, 8);
- _physRegCount.set(RegGroup::kX86_MM, 8);
- _buildPhysIndex();
-
- _availableRegCount = _physRegCount;
- _availableRegs[RegGroup::kGp] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kGp));
- _availableRegs[RegGroup::kVec] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kVec));
- _availableRegs[RegGroup::kX86_K] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kX86_K)) ^ 1u;
- _availableRegs[RegGroup::kX86_MM] = Support::lsbMask<RegMask>(_physRegCount.get(RegGroup::kX86_MM));
-
- _scratchRegIndexes[0] = uint8_t(Gp::kIdCx);
- _scratchRegIndexes[1] = uint8_t(baseRegCount - 1);
-
- // The architecture specific setup makes implicitly all registers available. So
- // make unavailable all registers that are special and cannot be used in general.
- bool hasFP = _func->frame().hasPreservedFP();
-
- makeUnavailable(RegGroup::kGp, Gp::kIdSp); // ESP|RSP used as a stack-pointer (SP).
- if (hasFP) makeUnavailable(RegGroup::kGp, Gp::kIdBp); // EBP|RBP used as a frame-pointer (FP).
-
- _sp = cc()->zsp();
- _fp = cc()->zbp();
-}
-
-void X86RAPass::onDone() noexcept {}
-
-// x86::X86RAPass - BuildCFG
-// =========================
-
-Error X86RAPass::buildCFG() noexcept {
- return RACFGBuilder(this).run();
-}
-
-// x86::X86RAPass - Rewrite
-// ========================
-
-static InstId transformVexToEvex(InstId instId) {
- switch (instId) {
- case Inst::kIdVbroadcastf128: return Inst::kIdVbroadcastf32x4;
- case Inst::kIdVbroadcasti128: return Inst::kIdVbroadcasti32x4;
- case Inst::kIdVextractf128: return Inst::kIdVextractf32x4;
- case Inst::kIdVextracti128: return Inst::kIdVextracti32x4;
- case Inst::kIdVinsertf128: return Inst::kIdVinsertf32x4;
- case Inst::kIdVinserti128: return Inst::kIdVinserti32x4;
- case Inst::kIdVmovdqa: return Inst::kIdVmovdqa32;
- case Inst::kIdVmovdqu: return Inst::kIdVmovdqu32;
- case Inst::kIdVpand: return Inst::kIdVpandd;
- case Inst::kIdVpandn: return Inst::kIdVpandnd;
- case Inst::kIdVpor: return Inst::kIdVpord;
- case Inst::kIdVpxor: return Inst::kIdVpxord;
- case Inst::kIdVroundpd: return Inst::kIdVrndscalepd;
- case Inst::kIdVroundps: return Inst::kIdVrndscaleps;
- case Inst::kIdVroundsd: return Inst::kIdVrndscalesd;
- case Inst::kIdVroundss: return Inst::kIdVrndscaless;
-
- default:
- // This should never happen as only transformable instructions should go this path.
- ASMJIT_ASSERT(false);
- return 0;
- }
-}
-
-ASMJIT_FAVOR_SPEED Error X86RAPass::_rewrite(BaseNode* first, BaseNode* stop) noexcept {
- uint32_t virtCount = cc()->_vRegArray.size();
-
- BaseNode* node = first;
- while (node != stop) {
- BaseNode* next = node->next();
- if (node->isInst()) {
- InstNode* inst = node->as<InstNode>();
- RAInst* raInst = node->passData<RAInst>();
-
- Operand* operands = inst->operands();
- uint32_t opCount = inst->opCount();
- uint32_t maxRegId = 0;
-
- uint32_t i;
-
- // Rewrite virtual registers into physical registers.
- if (raInst) {
- // This data is allocated by Zone passed to `runOnFunction()`, which will be reset after the RA pass finishes.
- // So reset this data to prevent having a dead pointer after the RA pass is complete.
- node->resetPassData();
-
- // If the instruction contains pass data (raInst) then it was a subject for register allocation and must be
- // rewritten to use physical regs.
- RATiedReg* tiedRegs = raInst->tiedRegs();
- uint32_t tiedCount = raInst->tiedCount();
-
- for (i = 0; i < tiedCount; i++) {
- RATiedReg* tiedReg = &tiedRegs[i];
-
- Support::BitWordIterator<uint32_t> useIt(tiedReg->useRewriteMask());
- uint32_t useId = tiedReg->useId();
- while (useIt.hasNext()) {
- maxRegId = Support::max(maxRegId, useId);
- inst->rewriteIdAtIndex(useIt.next(), useId);
- }
-
- Support::BitWordIterator<uint32_t> outIt(tiedReg->outRewriteMask());
- uint32_t outId = tiedReg->outId();
- while (outIt.hasNext()) {
- maxRegId = Support::max(maxRegId, outId);
- inst->rewriteIdAtIndex(outIt.next(), outId);
- }
- }
-
- // Transform VEX instruction to EVEX when necessary.
- if (raInst->isTransformable()) {
- if (maxRegId > 15) {
- inst->setId(transformVexToEvex(inst->id()));
- }
- }
-
- // Remove moves that do not do anything.
- //
- // Usually these moves are inserted during code generation and originally they used different registers. If RA
- // allocated these into the same register such redundant mov would appear.
- if (raInst->hasInstRWFlag(InstRWFlags::kMovOp) && !inst->hasExtraReg()) {
- if (inst->opCount() == 2) {
- if (inst->op(0) == inst->op(1)) {
- cc()->removeNode(node);
- goto Next;
- }
- }
- }
-
- if (ASMJIT_UNLIKELY(node->type() != NodeType::kInst)) {
- // FuncRet terminates the flow, it must either be removed if the exit label is next to it (optimization) or
- // patched to an architecture dependent jump instruction that jumps to the function's exit before the epilog.
- if (node->type() == NodeType::kFuncRet) {
- RABlock* block = raInst->block();
- if (!isNextTo(node, _func->exitNode())) {
- cc()->_setCursor(node->prev());
- ASMJIT_PROPAGATE(emitJump(_func->exitNode()->label()));
- }
-
- BaseNode* prev = node->prev();
- cc()->removeNode(node);
- block->setLast(prev);
- }
- }
- }
-
- // Rewrite stack slot addresses.
- for (i = 0; i < opCount; i++) {
- Operand& op = operands[i];
- if (op.isMem()) {
- BaseMem& mem = op.as<BaseMem>();
- if (mem.isRegHome()) {
- uint32_t virtIndex = Operand::virtIdToIndex(mem.baseId());
- if (ASMJIT_UNLIKELY(virtIndex >= virtCount))
- return DebugUtils::errored(kErrorInvalidVirtId);
-
- VirtReg* virtReg = cc()->virtRegByIndex(virtIndex);
- RAWorkReg* workReg = virtReg->workReg();
- ASMJIT_ASSERT(workReg != nullptr);
-
- RAStackSlot* slot = workReg->stackSlot();
- int32_t offset = slot->offset();
-
- mem._setBase(_sp.type(), slot->baseRegId());
- mem.clearRegHome();
- mem.addOffsetLo32(offset);
- }
- }
- }
- }
-
-Next:
- node = next;
- }
-
- return kErrorOk;
-}
-
-// x86::X86RAPass - OnEmit
-// =======================
-
-Error X86RAPass::emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept {
- RAWorkReg* wReg = workRegById(workId);
- BaseReg dst(wReg->signature(), dstPhysId);
- BaseReg src(wReg->signature(), srcPhysId);
-
- const char* comment = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<MOVE> %s", workRegById(workId)->name());
- comment = _tmpString.data();
- }
-#endif
-
- return _emitHelper.emitRegMove(dst, src, wReg->typeId(), comment);
-}
-
-Error X86RAPass::emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept {
- RAWorkReg* waReg = workRegById(aWorkId);
- RAWorkReg* wbReg = workRegById(bWorkId);
-
- bool is64Bit = Support::max(waReg->typeId(), wbReg->typeId()) >= TypeId::kInt64;
- OperandSignature sign = is64Bit ? OperandSignature{RegTraits<RegType::kX86_Gpq>::kSignature}
- : OperandSignature{RegTraits<RegType::kX86_Gpd>::kSignature};
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<SWAP> %s, %s", waReg->name(), wbReg->name());
- cc()->setInlineComment(_tmpString.data());
- }
-#endif
-
- return cc()->emit(Inst::kIdXchg, Reg(sign, aPhysId), Reg(sign, bPhysId));
-}
-
-Error X86RAPass::emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept {
- RAWorkReg* wReg = workRegById(workId);
- BaseReg dstReg(wReg->signature(), dstPhysId);
- BaseMem srcMem(workRegAsMem(wReg));
-
- const char* comment = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<LOAD> %s", workRegById(workId)->name());
- comment = _tmpString.data();
- }
-#endif
-
- return _emitHelper.emitRegMove(dstReg, srcMem, wReg->typeId(), comment);
-}
-
-Error X86RAPass::emitSave(uint32_t workId, uint32_t srcPhysId) noexcept {
- RAWorkReg* wReg = workRegById(workId);
- BaseMem dstMem(workRegAsMem(wReg));
- BaseReg srcReg(wReg->signature(), srcPhysId);
-
- const char* comment = nullptr;
-
-#ifndef ASMJIT_NO_LOGGING
- if (hasDiagnosticOption(DiagnosticOptions::kRAAnnotate)) {
- _tmpString.assignFormat("<SAVE> %s", workRegById(workId)->name());
- comment = _tmpString.data();
- }
-#endif
-
- return _emitHelper.emitRegMove(dstMem, srcReg, wReg->typeId(), comment);
-}
-
-Error X86RAPass::emitJump(const Label& label) noexcept {
- return cc()->jmp(label);
-}
-
-Error X86RAPass::emitPreCall(InvokeNode* invokeNode) noexcept {
- if (invokeNode->detail().hasVarArgs() && cc()->is64Bit()) {
- const FuncDetail& fd = invokeNode->detail();
- uint32_t argCount = invokeNode->argCount();
-
- switch (invokeNode->detail().callConv().id()) {
- case CallConvId::kX64SystemV: {
- // AL register contains the number of arguments passed in XMM register(s).
- uint32_t n = 0;
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- const FuncValuePack& argPack = fd.argPack(argIndex);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- const FuncValue& arg = argPack[valueIndex];
- if (!arg)
- break;
-
- if (arg.isReg() && Reg::groupOf(arg.regType()) == RegGroup::kVec)
- n++;
- }
- }
-
- if (!n)
- ASMJIT_PROPAGATE(cc()->xor_(eax, eax));
- else
- ASMJIT_PROPAGATE(cc()->mov(eax, n));
- break;
- }
-
- case CallConvId::kX64Windows: {
- // Each double-precision argument passed in XMM must be also passed in GP.
- for (uint32_t argIndex = 0; argIndex < argCount; argIndex++) {
- const FuncValuePack& argPack = fd.argPack(argIndex);
- for (uint32_t valueIndex = 0; valueIndex < Globals::kMaxValuePack; valueIndex++) {
- const FuncValue& arg = argPack[valueIndex];
- if (!arg)
- break;
-
- if (arg.isReg() && Reg::groupOf(arg.regType()) == RegGroup::kVec) {
- Gp dst = gpq(fd.callConv().passedOrder(RegGroup::kGp)[argIndex]);
- Xmm src = xmm(arg.regId());
- ASMJIT_PROPAGATE(cc()->emit(choose(Inst::kIdMovq, Inst::kIdVmovq), dst, src));
- }
- }
- }
- break;
- }
-
- default:
- return DebugUtils::errored(kErrorInvalidState);
- }
- }
-
- return kErrorOk;
-}
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h b/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h
deleted file mode 100644
index 67227a1a619..00000000000
--- a/3rdparty/asmjit/src/asmjit/x86/x86rapass_p.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_X86_X86RAPASS_P_H_INCLUDED
-#define ASMJIT_X86_X86RAPASS_P_H_INCLUDED
-
-#include "../core/api-config.h"
-#ifndef ASMJIT_NO_COMPILER
-
-#include "../core/compiler.h"
-#include "../core/rabuilders_p.h"
-#include "../core/rapass_p.h"
-#include "../x86/x86assembler.h"
-#include "../x86/x86compiler.h"
-#include "../x86/x86emithelper_p.h"
-
-ASMJIT_BEGIN_SUB_NAMESPACE(x86)
-
-//! \cond INTERNAL
-//! \addtogroup asmjit_x86
-//! \{
-
-//! X86 register allocation pass.
-//!
-//! Takes care of generating function prologs and epilogs, and also performs register allocation.
-class X86RAPass : public BaseRAPass {
-public:
- ASMJIT_NONCOPYABLE(X86RAPass)
- typedef BaseRAPass Base;
-
- EmitHelper _emitHelper;
-
- //! \name Construction & Destruction
- //! \{
-
- X86RAPass() noexcept;
- ~X86RAPass() noexcept override;
-
- //! \}
-
- //! \name Accessors
- //! \{
-
- //! Returns the compiler casted to `x86::Compiler`.
- ASMJIT_INLINE_NODEBUG Compiler* cc() const noexcept { return static_cast<Compiler*>(_cb); }
-
- //! Returns emit helper.
- ASMJIT_INLINE_NODEBUG EmitHelper* emitHelper() noexcept { return &_emitHelper; }
-
- ASMJIT_INLINE_NODEBUG bool avxEnabled() const noexcept { return _emitHelper._avxEnabled; }
- ASMJIT_INLINE_NODEBUG bool avx512Enabled() const noexcept { return _emitHelper._avx512Enabled; }
-
- //! \}
-
- //! \name Utilities
- //! \{
-
- ASMJIT_INLINE_NODEBUG InstId choose(InstId sseInstId, InstId avxInstId) noexcept {
- return avxEnabled() ? avxInstId : sseInstId;
- }
-
- //! \}
-
- //! \name Interface
- //! \{
-
- void onInit() noexcept override;
- void onDone() noexcept override;
-
- Error buildCFG() noexcept override;
-
- Error _rewrite(BaseNode* first, BaseNode* stop) noexcept override;
-
- Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept override;
- Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept override;
-
- Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept override;
- Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept override;
-
- Error emitJump(const Label& label) noexcept override;
- Error emitPreCall(InvokeNode* invokeNode) noexcept override;
-
- //! \}
-};
-
-//! \}
-//! \endcond
-
-ASMJIT_END_SUB_NAMESPACE
-
-#endif // !ASMJIT_NO_COMPILER
-#endif // ASMJIT_X86_X86RAPASS_P_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler.cpp b/3rdparty/asmjit/test/asmjit_test_assembler.cpp
deleted file mode 100644
index 6a56b67a80c..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_assembler.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "asmjit_test_assembler.h"
-#include "cmdline.h"
-
-using namespace asmjit;
-
-#if !defined(ASMJIT_NO_X86)
-bool testX86Assembler(const TestSettings& settings) noexcept;
-bool testX64Assembler(const TestSettings& settings) noexcept;
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
-bool testA64Assembler(const TestSettings& settings) noexcept;
-#endif
-
-int main(int argc, char* argv[]) {
- CmdLine cmdLine(argc, argv);
-
- TestSettings settings {};
- settings.verbose = cmdLine.hasArg("--verbose");
- settings.validate = cmdLine.hasArg("--validate");
-
- printf("AsmJit Assembler Test-Suite v%u.%u.%u:\n\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
-
- printf("Usage:\n");
- printf(" --help Show usage only\n");
- printf(" --verbose Show only assembling errors [%s]\n", settings.verbose ? "x" : " ");
- printf(" --validate Use instruction validation [%s]\n", settings.validate ? "x" : " ");
- printf(" --arch=<ARCH> Select architecture to run ('all' by default)\n");
- printf("\n");
-
- printf("Architectures:\n");
-#if !defined(ASMJIT_NO_X86)
- printf(" --arch=x86 32-bit X86 architecture (X86)\n");
- printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
-#endif
-#if !defined(ASMJIT_NO_AARCH64)
- printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
-#endif
- printf("\n");
- if (cmdLine.hasArg("--help"))
- return 0;
-
- const char* arch = cmdLine.valueOf("--arch", "all");
- bool x86Failed = false;
- bool x64Failed = false;
- bool aarch64Failed = false;
-
-#if !defined(ASMJIT_NO_X86)
- if ((strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0))
- x86Failed = !testX86Assembler(settings);
-
- if ((strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0))
- x64Failed = !testX64Assembler(settings);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0))
- aarch64Failed = !testA64Assembler(settings);
-#endif
-
- bool failed = x86Failed || x64Failed || aarch64Failed;
-
- if (failed) {
- if (x86Failed)
- printf("** X86 test suite failed **\n");
-
- if (x64Failed)
- printf("** X64 test suite failed **\n");
-
- if (aarch64Failed)
- printf("** AArch64 test suite failed **\n");
-
- printf("** FAILURE **\n");
- }
- else {
- printf("** SUCCESS **\n");
- }
-
- return failed ? 1 : 0;
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_assembler.h b/3rdparty/asmjit/test/asmjit_test_assembler.h
deleted file mode 100644
index 26f2c97ed98..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_assembler.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_TEST_ASSEMBLER_H_INCLUDED
-#define ASMJIT_TEST_ASSEMBLER_H_INCLUDED
-
-#include <asmjit/core.h>
-#include <stdio.h>
-
-struct TestSettings {
- bool verbose;
- bool validate;
-};
-
-template<typename AssemblerType>
-class AssemblerTester {
-public:
- asmjit::Environment env {};
- asmjit::CodeHolder code {};
- AssemblerType assembler {};
- asmjit::Label L0 {};
- const TestSettings& settings;
-
- size_t passed {};
- size_t count {};
-
- AssemblerTester(asmjit::Arch arch, const TestSettings& settings) noexcept
- : env(arch),
- settings(settings) {
- prepare();
- }
-
- void printHeader(const char* archName) noexcept {
- printf("%s assembler tests:\n", archName);
- }
-
- void printSummary() noexcept {
- printf(" Passed: %zu / %zu tests\n\n", passed, count);
- }
-
- bool didPass() const noexcept { return passed == count; }
-
- void prepare() noexcept {
- code.reset();
- code.init(env, 0);
- code.attach(&assembler);
- L0 = assembler.newLabel();
-
- if (settings.validate)
- assembler.addDiagnosticOptions(asmjit::DiagnosticOptions::kValidateAssembler);
- }
-
- ASMJIT_NOINLINE bool testValidInstruction(const char* s, const char* expectedOpcode, asmjit::Error err = asmjit::kErrorOk) noexcept {
- count++;
-
- if (err) {
- printf(" !! %s\n"
- " <%s>\n", s, asmjit::DebugUtils::errorAsString(err));
- prepare();
- return false;
- }
-
- asmjit::String encodedOpcode;
- asmjit::Section* text = code.textSection();
-
- encodedOpcode.appendHex(text->data(), text->bufferSize());
- if (encodedOpcode != expectedOpcode) {
- printf(" !! [%s] <- %s\n"
- " [%s] (Expected)\n", encodedOpcode.data(), s, expectedOpcode);
- prepare();
- return false;
- }
-
- if (settings.verbose)
- printf(" OK [%s] <- %s\n", encodedOpcode.data(), s);
-
- passed++;
- prepare();
- return true;
- }
-
- ASMJIT_NOINLINE bool testInvalidInstruction(const char* s, asmjit::Error expectedError, asmjit::Error err) noexcept {
- count++;
-
- if (err == asmjit::kErrorOk) {
- printf(" !! %s passed, but should have failed with <%s> error\n", s, asmjit::DebugUtils::errorAsString(expectedError));
- prepare();
- return false;
- }
-
- if (err != asmjit::kErrorOk) {
- printf(" !! %s failed with <%s>, but should have failed with <%s>\n", s, asmjit::DebugUtils::errorAsString(err), asmjit::DebugUtils::errorAsString(expectedError));
- prepare();
- return false;
- }
-
- if (settings.verbose)
- printf(" OK [%s] <- %s\n", asmjit::DebugUtils::errorAsString(err), s);
-
- passed++;
- prepare();
- return true;
- }
-};
-
-#endif // ASMJIT_TEST_ASSEMBLER_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler.cpp b/3rdparty/asmjit/test/asmjit_test_compiler.cpp
deleted file mode 100644
index cfbb7ede6d9..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_compiler.cpp
+++ /dev/null
@@ -1,403 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <memory>
-#include <vector>
-#include <chrono>
-
-#if !defined(ASMJIT_NO_COMPILER)
-
-#include "cmdline.h"
-#include "asmjitutils.h"
-#include "performancetimer.h"
-#include "asmjit_test_compiler.h"
-
-#if !defined(ASMJIT_NO_X86)
- #include <asmjit/x86.h>
- void compiler_add_x86_tests(TestApp& app);
-#endif // !ASMJIT_NO_X86
-
-#if !defined(ASMJIT_NO_AARCH64)
- #include <asmjit/a64.h>
- void compiler_add_a64_tests(TestApp& app);
-#endif // !ASMJIT_NO_AARCH64
-
-using namespace asmjit;
-
-int TestApp::handleArgs(int argc, const char* const* argv) {
- CmdLine cmd(argc, argv);
- _arch = cmd.valueOf("--arch", "all");
- _filter = cmd.valueOf("--filter", nullptr);
-
- if (cmd.hasArg("--help")) _helpOnly = true;
- if (cmd.hasArg("--verbose")) _verbose = true;
-
-#ifndef ASMJIT_NO_LOGGING
- if (cmd.hasArg("--dump-asm")) _dumpAsm = true;
-#endif // !ASMJIT_NO_LOGGING
-
- if (cmd.hasArg("--dump-hex")) _dumpHex = true;
-
- return 0;
-}
-
-void TestApp::showInfo() {
- printf("AsmJit Compiler Test-Suite v%u.%u.%u (Arch=%s):\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
- asmjitArchAsString(Arch::kHost));
-
- printf("Usage:\n");
- printf(" --help Show usage only\n");
- printf(" --arch=<NAME> Select architecture to run ('all' by default)\n");
- printf(" --filter=<NAME> Use a filter to restrict which test is called\n");
- printf(" --verbose Verbose output\n");
- printf(" --dump-asm Assembler output\n");
- printf(" --dump-hex Hexadecimal output (relocated, only for host arch)\n");
- printf("\n");
-}
-
-#ifndef ASMJIT_NO_LOGGING
-class IndentedStdoutLogger : public Logger {
-public:
- ASMJIT_NONCOPYABLE(IndentedStdoutLogger)
-
- size_t _indentation = 0;
-
- explicit IndentedStdoutLogger(size_t indentation) noexcept
- : _indentation(indentation) {}
-
- Error _log(const char* data, size_t size = SIZE_MAX) noexcept override {
- asmjit::DebugUtils::unused(size);
- printIndented(data, _indentation);
- return kErrorOk;
- }
-};
-#endif // !ASMJIT_NO_LOGGING
-
-bool TestApp::shouldRun(const TestCase* tc) {
- if (!_filter)
- return true;
-
- return strstr(tc->name(), _filter) != nullptr;
-}
-
-int TestApp::run() {
-#ifndef ASMJIT_NO_LOGGING
- FormatOptions formatOptions;
- formatOptions.addFlags(
- FormatFlags::kMachineCode |
- FormatFlags::kExplainImms |
- FormatFlags::kRegCasts );
- formatOptions.setIndentation(FormatIndentationGroup::kCode, 2);
-
- IndentedStdoutLogger printLogger(4);
- printLogger.setOptions(formatOptions);
-
- StringLogger stringLogger;
- stringLogger.setOptions(formatOptions);
-
- auto printStringLoggerContent = [&]() {
- if (!_verbose) {
- printf("%s", stringLogger.data());
- fflush(stdout);
- }
- };
-#else
- auto printStringLoggerContent = [&]() {};
-#endif // !ASMJIT_NO_LOGGING
-
- // maybe unused...
- DebugUtils::unused(printStringLoggerContent);
-
-#ifndef ASMJIT_NO_JIT
- JitRuntime runtime;
-#endif // !ASMJIT_NO_JIT
-
- PerformanceTimer compileTimer;
- PerformanceTimer finalizeTimer;
- double compileTime = 0;
- double finalizeTime = 0;
-
- for (std::unique_ptr<TestCase>& test : _tests) {
- if (!shouldRun(test.get()))
- continue;
-
- _numTests++;
-
- for (uint32_t pass = 0; pass < 2; pass++) {
- bool runnable = false;
- CodeHolder code;
- SimpleErrorHandler errorHandler;
-
- const char* statusSeparator = " ";
-
- // Filter architecture to run.
- if (strcmp(_arch, "all") != 0) {
- switch (test->arch()) {
- case Arch::kX86:
- if (strcmp(_arch, "x86") == 0)
- break;
- continue;
- case Arch::kX64:
- if (strcmp(_arch, "x64") == 0)
- break;
- continue;
- case Arch::kAArch64:
- if (strcmp(_arch, "aarch64") == 0)
- break;
- continue;
- default:
- continue;
- }
- }
-
- // Use platform environment and CPU features when the test can run on the arch.
-#ifndef ASMJIT_NO_JIT
- if (runtime.arch() == test->arch()) {
- code.init(runtime.environment(), runtime.cpuFeatures());
- runnable = true;
- }
-#endif // !ASMJIT_NO_JIT
-
- if (!code.isInitialized()) {
- Environment customEnv;
- CpuFeatures features;
-
- switch (test->arch()) {
- case Arch::kX86:
- case Arch::kX64:
- features.add(CpuFeatures::X86::kADX,
- CpuFeatures::X86::kAVX,
- CpuFeatures::X86::kAVX2,
- CpuFeatures::X86::kBMI,
- CpuFeatures::X86::kBMI2,
- CpuFeatures::X86::kCMOV,
- CpuFeatures::X86::kF16C,
- CpuFeatures::X86::kFMA,
- CpuFeatures::X86::kFPU,
- CpuFeatures::X86::kI486,
- CpuFeatures::X86::kLZCNT,
- CpuFeatures::X86::kMMX,
- CpuFeatures::X86::kMMX2,
- CpuFeatures::X86::kPOPCNT,
- CpuFeatures::X86::kSSE,
- CpuFeatures::X86::kSSE2,
- CpuFeatures::X86::kSSE3,
- CpuFeatures::X86::kSSSE3,
- CpuFeatures::X86::kSSE4_1,
- CpuFeatures::X86::kSSE4_2);
- break;
-
- case Arch::kAArch64:
- features.add(CpuFeatures::ARM::kAES,
- CpuFeatures::ARM::kASIMD,
- CpuFeatures::ARM::kIDIVA,
- CpuFeatures::ARM::kIDIVT,
- CpuFeatures::ARM::kPMULL);
- break;
-
- default:
- break;
- }
-
- customEnv.init(test->arch());
- code.init(customEnv, features);
- }
-
- code.setErrorHandler(&errorHandler);
-
- if (pass != 0) {
- printf("[Test:%s] %s", asmjitArchAsString(test->arch()), test->name());
- fflush(stdout);
-
-#ifndef ASMJIT_NO_LOGGING
- if (_verbose || _dumpAsm || _dumpHex) {
- printf("\n");
- statusSeparator = " ";
- }
-
- if (_verbose) {
- printf(" [Log]\n");
- code.setLogger(&printLogger);
- }
- else {
- stringLogger.clear();
- code.setLogger(&stringLogger);
- }
-#endif // !ASMJIT_NO_LOGGING
- }
-
- std::unique_ptr<BaseCompiler> cc;
-
-#ifndef ASMJIT_NO_X86
- if (code.arch() == Arch::kX86 || code.arch() == Arch::kX64)
- cc = std::unique_ptr<x86::Compiler>(new x86::Compiler(&code));
-#endif // !ASMJIT_NO_X86
-
-#ifndef ASMJIT_NO_AARCH64
- if (code.arch() == Arch::kAArch64)
- cc = std::unique_ptr<a64::Compiler>(new a64::Compiler(&code));
-#endif // !ASMJIT_NO_AARCH64
-
- if (!cc)
- continue;
-
-#ifndef ASMJIT_NO_LOGGING
- cc->addDiagnosticOptions(DiagnosticOptions::kRAAnnotate | DiagnosticOptions::kRADebugAll);
-#endif // !ASMJIT_NO_LOGGING
-
- compileTimer.start();
- test->compile(*cc);
- compileTimer.stop();
-
- Error err = errorHandler._err;
- if (err == kErrorOk) {
- finalizeTimer.start();
- err = cc->finalize();
- finalizeTimer.stop();
- }
-
- // The first pass is only used for timing of serialization and compilation, because otherwise it would be
- // biased by logging, which takes much more time than finalize() does. We want to benchmark Compiler the
- // way it would be used in the production.
- if (pass == 0) {
- _outputSize += code.codeSize();
- compileTime += compileTimer.duration();
- finalizeTime += finalizeTimer.duration();
- continue;
- }
-
-#ifndef ASMJIT_NO_LOGGING
- if (_dumpAsm) {
- String sb;
- Formatter::formatNodeList(sb, formatOptions, cc.get());
- printf(" [Assembly]\n");
- printIndented(sb.data(), 4);
- }
-#endif // !ASMJIT_NO_LOGGING
-
-#ifndef ASMJIT_NO_JIT
- if (runnable) {
- void* func = nullptr;
- if (err == kErrorOk)
- err = runtime.add(&func, &code);
-
- if (err == kErrorOk && _dumpHex) {
- String sb;
- sb.appendHex((void*)func, code.codeSize());
- printf(" [Hex Dump]:\n");
- for (size_t i = 0; i < sb.size(); i += 76) {
- printf(" %.60s\n", sb.data() + i);
- }
- }
-
- if (_verbose)
- fflush(stdout);
-
- if (err == kErrorOk) {
- StringTmp<128> result;
- StringTmp<128> expect;
-
- if (test->run(func, result, expect)) {
- if (!_verbose)
- printf("%s[RUN OK]\n", statusSeparator);
- }
- else {
- if (!_verbose)
- printf("%s[RUN FAILED]\n", statusSeparator);
-
- printStringLoggerContent();
- printf(" [Output]\n");
- printf(" Returned: %s\n", result.data());
- printf(" Expected: %s\n", expect.data());
- _numFailed++;
- }
-
- if (_dumpAsm)
- printf("\n");
-
- runtime.release(func);
- }
- else {
- if (!_verbose)
- printf("%s[COMPILE FAILED]\n", statusSeparator);
-
- printStringLoggerContent();
- printf(" [Status]\n");
- printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data());
- _numFailed++;
- }
- }
-#endif // !ASMJIT_NO_JIT
-
- if (!runnable) {
- if (err) {
- printf(" [Status]\n");
- printf(" ERROR 0x%08X: %s\n", unsigned(err), errorHandler._message.data());
- _numFailed++;
- }
- else {
- printf("%s[COMPILE OK]\n", statusSeparator);
- }
- }
-
-#ifndef ASMJIT_NO_LOGGING
- if (_verbose || _dumpAsm || _dumpHex) {
- printf("\n");
- }
-#endif // !ASMJIT_NO_LOGGING
- }
- }
-
- printf("\n");
- printf("Summary:\n");
- printf(" OutputSize: %zu bytes\n", _outputSize);
- printf(" CompileTime: %.2f ms\n", compileTime);
- printf(" FinalizeTime: %.2f ms\n", finalizeTime);
- printf("\n");
-
- if (_numFailed == 0)
- printf("** SUCCESS: All %u tests passed **\n", _numTests);
- else
- printf("** FAILURE: %u of %u tests failed **\n", _numFailed, _numTests);
-
- return _numFailed == 0 ? 0 : 1;
-}
-
-int main(int argc, char* argv[]) {
- TestApp app;
-
- app.handleArgs(argc, argv);
- app.showInfo();
-
-#if !defined(ASMJIT_NO_X86)
- compiler_add_x86_tests(app);
-#endif // !ASMJIT_NO_X86
-
-#if !defined(ASMJIT_NO_AARCH64)
- compiler_add_a64_tests(app);
-#endif // !ASMJIT_NO_AARCH64
-
- return app.run();
-}
-
-#else
-
-int main(int argc, char* argv[]) {
- DebugUtils::unused(argc, argv);
-
- printf("AsmJit Compiler Test suite is disabled when compiling with ASMJIT_NO_COMPILER\n\n");
- return 0;
-}
-
-#endif // !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler.h b/3rdparty/asmjit/test/asmjit_test_compiler.h
deleted file mode 100644
index 433d47953dd..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_compiler.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_TEST_COMPILER_H_INCLUDED
-#define ASMJIT_TEST_COMPILER_H_INCLUDED
-
-#include <asmjit/core.h>
-
-#include <memory>
-#include <vector>
-
-class SimpleErrorHandler : public asmjit::ErrorHandler {
-public:
- SimpleErrorHandler()
- : _err(asmjit::kErrorOk) {}
-
- virtual void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) {
- asmjit::DebugUtils::unused(origin);
- _err = err;
- _message.assign(message);
- }
-
- asmjit::Error _err;
- asmjit::String _message;
-};
-
-//! A test case interface for testing AsmJit's Compiler.
-class TestCase {
-public:
- TestCase(const char* name, asmjit::Arch arch) {
- if (name)
- _name.assign(name);
- _arch = arch;
- }
-
- virtual ~TestCase() {}
-
- inline const char* name() const { return _name.data(); }
- inline asmjit::Arch arch() const { return _arch; }
-
- virtual void compile(asmjit::BaseCompiler& cc) = 0;
- virtual bool run(void* func, asmjit::String& result, asmjit::String& expect) = 0;
-
- asmjit::String _name;
- asmjit::Arch _arch;
-};
-
-class TestApp {
-public:
- std::vector<std::unique_ptr<TestCase>> _tests;
-
- const char* _arch = nullptr;
- const char* _filter = nullptr;
- bool _helpOnly = false;
- bool _verbose = false;
- bool _dumpAsm = false;
- bool _dumpHex = false;
-
- unsigned _numTests = 0;
- unsigned _numFailed = 0;
- size_t _outputSize = 0;
-
- TestApp() noexcept
- : _arch("all") {}
- ~TestApp() noexcept {}
-
- void add(TestCase* test) noexcept {
- _tests.push_back(std::unique_ptr<TestCase>(test));
- }
-
- template<class T>
- inline void addT() { T::add(*this); }
-
- int handleArgs(int argc, const char* const* argv);
- void showInfo();
-
- bool shouldRun(const TestCase* tc);
- int run();
-};
-
-#endif // ASMJIT_TEST_COMPILER_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp
deleted file mode 100644
index 4d8cd5e8b2d..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_compiler_a64.cpp
+++ /dev/null
@@ -1,687 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-#if !defined(ASMJIT_NO_COMPILER) && !defined(ASMJIT_NO_AARCH64)
-
-#include <asmjit/a64.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "./asmjit_test_compiler.h"
-
-using namespace asmjit;
-
-// a64::Compiler - A64TestCase
-// ===========================
-
-class A64TestCase : public TestCase {
-public:
- A64TestCase(const char* name = nullptr)
- : TestCase(name, Arch::kAArch64) {}
-
- virtual void compile(BaseCompiler& cc) override {
- compile(static_cast<a64::Compiler&>(cc));
- }
-
- virtual void compile(a64::Compiler& cc) = 0;
-};
-
-// a64::Compiler - A64Test_GpArgs
-// ==============================
-
-class A64Test_GpArgs : public A64TestCase {
-public:
- uint32_t _argCount;
- bool _preserveFP;
-
- A64Test_GpArgs(uint32_t argCount, bool preserveFP)
- : _argCount(argCount),
- _preserveFP(preserveFP) {
- _name.assignFormat("GpArgs {NumArgs=%u PreserveFP=%c}", argCount, preserveFP ? 'Y' : 'N');
- }
-
- static void add(TestApp& app) {
- for (uint32_t i = 0; i <= 16; i++) {
- app.add(new A64Test_GpArgs(i, true));
- app.add(new A64Test_GpArgs(i, false));
- }
- }
-
- virtual void compile(a64::Compiler& cc) {
- uint32_t i;
- uint32_t argCount = _argCount;
-
- FuncSignature signature;
- signature.setRetT<int>();
- for (i = 0; i < argCount; i++)
- signature.addArgT<int>();
-
- FuncNode* funcNode = cc.addFunc(signature);
- if (_preserveFP)
- funcNode->frame().setPreservedFP();
-
- a64::Gp sum;
-
- if (argCount) {
- for (i = 0; i < argCount; i++) {
- a64::Gp iReg = cc.newInt32("i%u", i);
- funcNode->setArg(i, iReg);
-
- if (i == 0)
- sum = iReg;
- else
- cc.add(sum, sum, iReg);
- }
- }
- else {
- sum = cc.newInt32("i");
- cc.mov(sum, 0);
- }
-
- cc.ret(sum);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef unsigned int U;
-
- typedef U (*Func0)();
- typedef U (*Func1)(U);
- typedef U (*Func2)(U, U);
- typedef U (*Func3)(U, U, U);
- typedef U (*Func4)(U, U, U, U);
- typedef U (*Func5)(U, U, U, U, U);
- typedef U (*Func6)(U, U, U, U, U, U);
- typedef U (*Func7)(U, U, U, U, U, U, U);
- typedef U (*Func8)(U, U, U, U, U, U, U, U);
- typedef U (*Func9)(U, U, U, U, U, U, U, U, U);
- typedef U (*Func10)(U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func11)(U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func12)(U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func13)(U, U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func14)(U, U, U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func15)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func16)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
-
- unsigned int resultRet = 0;
- unsigned int expectRet = 0;
-
- switch (_argCount) {
- case 0:
- resultRet = ptr_as_func<Func0>(_func)();
- expectRet = 0;
- break;
- case 1:
- resultRet = ptr_as_func<Func1>(_func)(1);
- expectRet = 1;
- break;
- case 2:
- resultRet = ptr_as_func<Func2>(_func)(1, 2);
- expectRet = 1 + 2;
- break;
- case 3:
- resultRet = ptr_as_func<Func3>(_func)(1, 2, 3);
- expectRet = 1 + 2 + 3;
- break;
- case 4:
- resultRet = ptr_as_func<Func4>(_func)(1, 2, 3, 4);
- expectRet = 1 + 2 + 3 + 4;
- break;
- case 5:
- resultRet = ptr_as_func<Func5>(_func)(1, 2, 3, 4, 5);
- expectRet = 1 + 2 + 3 + 4 + 5;
- break;
- case 6:
- resultRet = ptr_as_func<Func6>(_func)(1, 2, 3, 4, 5, 6);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6;
- break;
- case 7:
- resultRet = ptr_as_func<Func7>(_func)(1, 2, 3, 4, 5, 6, 7);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7;
- break;
- case 8:
- resultRet = ptr_as_func<Func8>(_func)(1, 2, 3, 4, 5, 6, 7, 8);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8;
- break;
- case 9:
- resultRet = ptr_as_func<Func9>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9;
- break;
- case 10:
- resultRet = ptr_as_func<Func10>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
- break;
- case 11:
- resultRet = ptr_as_func<Func11>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11;
- break;
- case 12:
- resultRet = ptr_as_func<Func12>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
- break;
- case 13:
- resultRet = ptr_as_func<Func13>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13;
- break;
- case 14:
- resultRet = ptr_as_func<Func14>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14;
- break;
- case 15:
- resultRet = ptr_as_func<Func15>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15;
- break;
- case 16:
- resultRet = ptr_as_func<Func16>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16;
- break;
- }
-
- result.assignFormat("ret={%u, %u}", resultRet >> 28, resultRet & 0x0FFFFFFFu);
- expect.assignFormat("ret={%u, %u}", expectRet >> 28, expectRet & 0x0FFFFFFFu);
-
- return result == expect;
- }
-};
-
-// a64::Compiler - A64Test_Simd1
-// =============================
-
-class A64Test_Simd1 : public A64TestCase {
-public:
- A64Test_Simd1()
- : A64TestCase("Simd1") {}
-
- static void add(TestApp& app) {
- app.add(new A64Test_Simd1());
- }
-
- virtual void compile(a64::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, const void*, const void*>());
-
- a64::Gp dst = cc.newUIntPtr("dst");
- a64::Gp src1 = cc.newUIntPtr("src1");
- a64::Gp src2 = cc.newUIntPtr("src2");
-
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src1);
- funcNode->setArg(2, src2);
-
- a64::Vec v1 = cc.newVecQ("vec1");
- a64::Vec v2 = cc.newVecQ("vec2");
- a64::Vec v3 = cc.newVecQ("vec3");
-
- cc.ldr(v2, a64::ptr(src1));
- cc.ldr(v3, a64::ptr(src2));
- cc.add(v1.b16(), v2.b16(), v3.b16());
- cc.str(v1, a64::ptr(dst));
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void*, const void*, const void*);
-
- uint32_t dst[4];
- uint32_t aSrc[4] = { 0 , 1 , 2 , 255 };
- uint32_t bSrc[4] = { 99, 17, 33, 1 };
-
- // NOTE: It's a byte-add, so uint8_t(255+1) == 0.
- uint32_t ref[4] = { 99, 18, 35, 0 };
-
- ptr_as_func<Func>(_func)(dst, aSrc, bSrc);
-
- result.assignFormat("ret={%u, %u, %u, %u}", dst[0], dst[1], dst[2], dst[3]);
- expect.assignFormat("ret={%u, %u, %u, %u}", ref[0], ref[1], ref[2], ref[3]);
-
- return result == expect;
- }
-};
-
-// a64::Compiler - A64Test_ManyRegs
-// ================================
-
-class A64Test_ManyRegs : public A64TestCase {
-public:
- uint32_t _regCount;
-
- A64Test_ManyRegs(uint32_t n)
- : A64TestCase(),
- _regCount(n) {
- _name.assignFormat("GpRegs {NumRegs=%u}", n);
- }
-
- static void add(TestApp& app) {
- for (uint32_t i = 2; i < 64; i++)
- app.add(new A64Test_ManyRegs(i));
- }
-
- virtual void compile(a64::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- a64::Gp* regs = static_cast<a64::Gp*>(malloc(_regCount * sizeof(a64::Gp)));
-
- for (uint32_t i = 0; i < _regCount; i++) {
- regs[i] = cc.newUInt32("reg%u", i);
- cc.mov(regs[i], i + 1);
- }
-
- a64::Gp sum = cc.newUInt32("sum");
- cc.mov(sum, 0);
-
- for (uint32_t i = 0; i < _regCount; i++) {
- cc.add(sum, sum, regs[i]);
- }
-
- cc.ret(sum);
- cc.endFunc();
-
- free(regs);
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- result.assignFormat("ret={%d}", func());
- expect.assignFormat("ret={%d}", calcSum());
-
- return result == expect;
- }
-
- uint32_t calcSum() const {
- return (_regCount | 1) * ((_regCount + 1) / 2);
- }
-};
-
-// a64::Compiler - A64Test_Adr
-// ===========================
-
-class A64Test_Adr : public A64TestCase {
-public:
- A64Test_Adr()
- : A64TestCase("Adr") {}
-
- static void add(TestApp& app) {
- app.add(new A64Test_Adr());
- }
-
- virtual void compile(a64::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- a64::Gp addr = cc.newIntPtr("addr");
- a64::Gp val = cc.newIntPtr("val");
-
- Label L_Table = cc.newLabel();
-
- cc.adr(addr, L_Table);
- cc.ldrsw(val, a64::ptr(addr, 8));
- cc.ret(val);
- cc.endFunc();
-
- cc.bind(L_Table);
- cc.embedInt32(1);
- cc.embedInt32(2);
- cc.embedInt32(3);
- cc.embedInt32(4);
- cc.embedInt32(5);
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- result.assignFormat("ret={%d}", func());
- expect.assignFormat("ret={%d}", 3);
-
- return result == expect;
- }
-};
-
-// a64::Compiler - A64Test_Branch1
-// ===============================
-
-class A64Test_Branch1 : public A64TestCase {
-public:
- A64Test_Branch1()
- : A64TestCase("Branch1") {}
-
- static void add(TestApp& app) {
- app.add(new A64Test_Branch1());
- }
-
- virtual void compile(a64::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, size_t>());
-
- a64::Gp p = cc.newIntPtr("p");
- a64::Gp count = cc.newIntPtr("count");
- a64::Gp i = cc.newIntPtr("i");
- Label L = cc.newLabel();
-
- funcNode->setArg(0, p);
- funcNode->setArg(1, count);
-
- cc.mov(i, 0);
-
- cc.bind(L);
- cc.strb(i.w(), a64::ptr(p, i));
- cc.add(i, i, 1);
- cc.cmp(i, count);
- cc.b_ne(L);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void* p, size_t n);
- Func func = ptr_as_func<Func>(_func);
-
- uint8_t array[16];
- func(array, 16);
-
- expect.assign("ret={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}");
-
- result.assign("ret={");
- for (size_t i = 0; i < 16; i++) {
- if (i)
- result.append(", ");
- result.appendFormat("%d", int(array[i]));
- }
- result.append("}");
-
- return result == expect;
- }
-};
-
-// a64::Compiler - A64Test_Invoke1
-// ===============================
-
-class A64Test_Invoke1 : public A64TestCase {
-public:
- A64Test_Invoke1()
- : A64TestCase("Invoke1") {}
-
- static void add(TestApp& app) {
- app.add(new A64Test_Invoke1());
- }
-
- virtual void compile(a64::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t, uint32_t>());
-
- a64::Gp x = cc.newUInt32("x");
- a64::Gp y = cc.newUInt32("y");
- a64::Gp r = cc.newUInt32("r");
- a64::Gp fn = cc.newUIntPtr("fn");
-
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
-
- cc.mov(fn, (uint64_t)calledFunc);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, fn, FuncSignature::build<uint32_t, uint32_t, uint32_t>());
- invokeNode->setArg(0, x);
- invokeNode->setArg(1, y);
- invokeNode->setRet(0, r);
-
- cc.ret(r);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef uint32_t (*Func)(uint32_t, uint32_t);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t x = 49;
- uint32_t y = 7;
-
- result.assignFormat("ret={%u}", func(x, y));
- expect.assignFormat("ret={%u}", x - y);
-
- return result == expect;
- }
-
- static uint32_t calledFunc(uint32_t x, uint32_t y) {
- return x - y;
- }
-};
-
-// a64::Compiler - A64Test_Invoke2
-// ===============================
-
-class A64Test_Invoke2 : public A64TestCase {
-public:
- A64Test_Invoke2()
- : A64TestCase("Invoke2") {}
-
- static void add(TestApp& app) {
- app.add(new A64Test_Invoke2());
- }
-
- virtual void compile(a64::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double>());
-
- a64::Vec x = cc.newVecD("x");
- a64::Vec y = cc.newVecD("y");
- a64::Vec r = cc.newVecD("r");
- a64::Gp fn = cc.newUIntPtr("fn");
-
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
- cc.mov(fn, (uint64_t)calledFunc);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, fn, FuncSignature::build<double, double, double>());
- invokeNode->setArg(0, x);
- invokeNode->setArg(1, y);
- invokeNode->setRet(0, r);
-
- cc.ret(r);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(double, double);
- Func func = ptr_as_func<Func>(_func);
-
- double x = 49;
- double y = 7;
-
- result.assignFormat("ret={%f}", func(x, y));
- expect.assignFormat("ret={%f}", calledFunc(x, y));
-
- return result == expect;
- }
-
- static double calledFunc(double x, double y) {
- return x - y;
- }
-};
-
-// a64::Compiler - A64Test_Invoke3
-// ===============================
-
-class A64Test_Invoke3 : public A64TestCase {
-public:
- A64Test_Invoke3()
- : A64TestCase("Invoke3") {}
-
- static void add(TestApp& app) {
- app.add(new A64Test_Invoke3());
- }
-
- virtual void compile(a64::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double>());
-
- a64::Vec x = cc.newVecD("x");
- a64::Vec y = cc.newVecD("y");
- a64::Vec r = cc.newVecD("r");
- a64::Gp fn = cc.newUIntPtr("fn");
-
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
- cc.mov(fn, (uint64_t)calledFunc);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, fn, FuncSignature::build<double, double, double>());
- invokeNode->setArg(0, y);
- invokeNode->setArg(1, x);
- invokeNode->setRet(0, r);
-
- cc.ret(r);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(double, double);
- Func func = ptr_as_func<Func>(_func);
-
- double x = 49;
- double y = 7;
-
- result.assignFormat("ret={%f}", func(x, y));
- expect.assignFormat("ret={%f}", calledFunc(y, x));
-
- return result == expect;
- }
-
- static double calledFunc(double x, double y) {
- return x - y;
- }
-};
-
-// a64::Compiler - A64Test_JumpTable
-// =================================
-
-class A64Test_JumpTable : public A64TestCase {
-public:
- bool _annotated;
-
- A64Test_JumpTable(bool annotated)
- : A64TestCase("A64Test_JumpTable"),
- _annotated(annotated) {
- _name.assignFormat("JumpTable {%s}", annotated ? "Annotated" : "Unknown Target");
- }
-
- enum Operator {
- kOperatorAdd = 0,
- kOperatorSub = 1,
- kOperatorMul = 2,
- kOperatorDiv = 3
- };
-
- static void add(TestApp& app) {
- app.add(new A64Test_JumpTable(false));
- app.add(new A64Test_JumpTable(true));
- }
-
- virtual void compile(a64::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float, uint32_t>());
-
- a64::Vec a = cc.newVecS("a");
- a64::Vec b = cc.newVecS("b");
- a64::Gp op = cc.newUInt32("op");
-
- a64::Gp target = cc.newIntPtr("target");
- a64::Gp offset = cc.newIntPtr("offset");
-
- Label L_End = cc.newLabel();
-
- Label L_Table = cc.newLabel();
- Label L_Add = cc.newLabel();
- Label L_Sub = cc.newLabel();
- Label L_Mul = cc.newLabel();
- Label L_Div = cc.newLabel();
-
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
- funcNode->setArg(2, op);
-
- cc.adr(target, L_Table);
- cc.ldrsw(offset, a64::ptr(target, op, a64::sxtw(2)));
- cc.add(target, target, offset);
-
- // JumpAnnotation allows to annotate all possible jump targets of
- // instructions where it cannot be deduced from operands.
- if (_annotated) {
- JumpAnnotation* annotation = cc.newJumpAnnotation();
- annotation->addLabel(L_Add);
- annotation->addLabel(L_Sub);
- annotation->addLabel(L_Mul);
- annotation->addLabel(L_Div);
- cc.br(target, annotation);
- }
- else {
- cc.br(target);
- }
-
- cc.bind(L_Add);
- cc.fadd(a, a, b);
- cc.b(L_End);
-
- cc.bind(L_Sub);
- cc.fsub(a, a, b);
- cc.b(L_End);
-
- cc.bind(L_Mul);
- cc.fmul(a, a, b);
- cc.b(L_End);
-
- cc.bind(L_Div);
- cc.fdiv(a, a, b);
-
- cc.bind(L_End);
- cc.ret(a);
- cc.endFunc();
-
- cc.bind(L_Table);
- cc.embedLabelDelta(L_Add, L_Table, 4);
- cc.embedLabelDelta(L_Sub, L_Table, 4);
- cc.embedLabelDelta(L_Mul, L_Table, 4);
- cc.embedLabelDelta(L_Div, L_Table, 4);
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef float (*Func)(float, float, uint32_t);
- Func func = ptr_as_func<Func>(_func);
-
- float dst[4];
- float ref[4];
-
- dst[0] = func(33.0f, 14.0f, kOperatorAdd);
- dst[1] = func(33.0f, 14.0f, kOperatorSub);
- dst[2] = func(10.0f, 6.0f, kOperatorMul);
- dst[3] = func(80.0f, 8.0f, kOperatorDiv);
-
- ref[0] = 47.0f;
- ref[1] = 19.0f;
- ref[2] = 60.0f;
- ref[3] = 10.0f;
-
- result.assignFormat("ret={%f, %f, %f, %f}", dst[0], dst[1], dst[2], dst[3]);
- expect.assignFormat("ret={%f, %f, %f, %f}", ref[0], ref[1], ref[2], ref[3]);
-
- return result == expect;
- }
-};
-
-// a64::Compiler - Export
-// ======================
-
-void compiler_add_a64_tests(TestApp& app) {
- app.addT<A64Test_GpArgs>();
- app.addT<A64Test_ManyRegs>();
- app.addT<A64Test_Simd1>();
- app.addT<A64Test_Adr>();
- app.addT<A64Test_Branch1>();
- app.addT<A64Test_Invoke1>();
- app.addT<A64Test_Invoke2>();
- app.addT<A64Test_Invoke3>();
- app.addT<A64Test_JumpTable>();
-}
-
-#endif // !ASMJIT_NO_COMPILER && !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp b/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
deleted file mode 100644
index 54442efb915..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_compiler_x86.cpp
+++ /dev/null
@@ -1,4522 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-#if !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_COMPILER)
-
-#include <asmjit/x86.h>
-#include <setjmp.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if ASMJIT_ARCH_X86
- // Required for function tests that pass / return XMM registers.
- #include <emmintrin.h>
-#endif
-
-#include "asmjit_test_misc.h"
-#include "asmjit_test_compiler.h"
-
-#ifdef _MSC_VER
-// Interaction between '_setjmp' and C++ object destruction is non-portable.
-#pragma warning(disable: 4611)
-#endif
-
-using namespace asmjit;
-
-// x86::Compiler - X86TestCase
-// ===========================
-
-class X86TestCase : public TestCase {
-public:
- X86TestCase(const char* name = nullptr)
- : TestCase(name, Arch::kHost == Arch::kX86 ? Arch::kX86 : Arch::kX64) {}
-
- virtual void compile(BaseCompiler& cc) override {
- compile(static_cast<x86::Compiler&>(cc));
- }
-
- virtual void compile(x86::Compiler& cc) = 0;
-};
-
-// x86::Compiler - X86Test_AlignBase
-// =================================
-
-class X86Test_AlignBase : public X86TestCase {
-public:
- X86Test_AlignBase(uint32_t argCount, uint32_t alignment, bool preserveFP)
- : _argCount(argCount),
- _alignment(alignment),
- _preserveFP(preserveFP) {
- _name.assignFormat("AlignBase {NumArgs=%u Alignment=%u PreserveFP=%c}", argCount, alignment, preserveFP ? 'Y' : 'N');
- }
-
- static void add(TestApp& app) {
- for (uint32_t i = 0; i <= 16; i++) {
- for (uint32_t a = 16; a <= 32; a += 16) {
- app.add(new X86Test_AlignBase(i, a, true));
- app.add(new X86Test_AlignBase(i, a, false));
- }
- }
- }
-
- virtual void compile(x86::Compiler& cc) {
- uint32_t i;
- uint32_t argCount = _argCount;
-
- FuncSignature signature(CallConvId::kCDecl);
- signature.setRetT<int>();
- for (i = 0; i < argCount; i++)
- signature.addArgT<int>();
-
- FuncNode* funcNode = cc.addFunc(signature);
- if (_preserveFP)
- funcNode->frame().setPreservedFP();
-
- x86::Gp gpVar = cc.newIntPtr("gpVar");
- x86::Gp gpSum;
- x86::Mem stack = cc.newStack(_alignment, _alignment);
-
- // Do a sum of arguments to verify a possible relocation when misaligned.
- if (argCount) {
- for (i = 0; i < argCount; i++) {
- x86::Gp gpArg = cc.newInt32("gpArg%u", i);
- funcNode->setArg(i, gpArg);
-
- if (i == 0)
- gpSum = gpArg;
- else
- cc.add(gpSum, gpArg);
- }
- }
-
- // Check alignment of xmmVar (has to be 16).
- cc.lea(gpVar, stack);
- cc.and_(gpVar, _alignment - 1);
-
- // Add a sum of all arguments to check if they are correct.
- if (argCount)
- cc.or_(gpVar.r32(), gpSum);
-
- cc.ret(gpVar);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef unsigned int U;
-
- typedef U (*Func0)();
- typedef U (*Func1)(U);
- typedef U (*Func2)(U, U);
- typedef U (*Func3)(U, U, U);
- typedef U (*Func4)(U, U, U, U);
- typedef U (*Func5)(U, U, U, U, U);
- typedef U (*Func6)(U, U, U, U, U, U);
- typedef U (*Func7)(U, U, U, U, U, U, U);
- typedef U (*Func8)(U, U, U, U, U, U, U, U);
- typedef U (*Func9)(U, U, U, U, U, U, U, U, U);
- typedef U (*Func10)(U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func11)(U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func12)(U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func13)(U, U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func14)(U, U, U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func15)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
- typedef U (*Func16)(U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U);
-
- unsigned int resultRet = 0;
- unsigned int expectRet = 0;
-
- switch (_argCount) {
- case 0:
- resultRet = ptr_as_func<Func0>(_func)();
- expectRet = 0;
- break;
- case 1:
- resultRet = ptr_as_func<Func1>(_func)(1);
- expectRet = 1;
- break;
- case 2:
- resultRet = ptr_as_func<Func2>(_func)(1, 2);
- expectRet = 1 + 2;
- break;
- case 3:
- resultRet = ptr_as_func<Func3>(_func)(1, 2, 3);
- expectRet = 1 + 2 + 3;
- break;
- case 4:
- resultRet = ptr_as_func<Func4>(_func)(1, 2, 3, 4);
- expectRet = 1 + 2 + 3 + 4;
- break;
- case 5:
- resultRet = ptr_as_func<Func5>(_func)(1, 2, 3, 4, 5);
- expectRet = 1 + 2 + 3 + 4 + 5;
- break;
- case 6:
- resultRet = ptr_as_func<Func6>(_func)(1, 2, 3, 4, 5, 6);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6;
- break;
- case 7:
- resultRet = ptr_as_func<Func7>(_func)(1, 2, 3, 4, 5, 6, 7);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7;
- break;
- case 8:
- resultRet = ptr_as_func<Func8>(_func)(1, 2, 3, 4, 5, 6, 7, 8);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8;
- break;
- case 9:
- resultRet = ptr_as_func<Func9>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9;
- break;
- case 10:
- resultRet = ptr_as_func<Func10>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
- break;
- case 11:
- resultRet = ptr_as_func<Func11>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11;
- break;
- case 12:
- resultRet = ptr_as_func<Func12>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
- break;
- case 13:
- resultRet = ptr_as_func<Func13>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13;
- break;
- case 14:
- resultRet = ptr_as_func<Func14>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14;
- break;
- case 15:
- resultRet = ptr_as_func<Func15>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15;
- break;
- case 16:
- resultRet = ptr_as_func<Func16>(_func)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
- expectRet = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16;
- break;
- }
-
- result.assignFormat("ret={%u, %u}", resultRet >> 28, resultRet & 0x0FFFFFFFu);
- expect.assignFormat("ret={%u, %u}", expectRet >> 28, expectRet & 0x0FFFFFFFu);
-
- return result == expect;
- }
-
- uint32_t _argCount;
- uint32_t _alignment;
- bool _preserveFP;
-};
-
-// x86::Compiler - X86Test_NoCode
-// ==============================
-
-class X86Test_NoCode : public X86TestCase {
-public:
- X86Test_NoCode() : X86TestCase("NoCode") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_NoCode());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<void>());
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- DebugUtils::unused(result, expect);
-
- typedef void(*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- func();
- return true;
- }
-};
-
-// x86::Compiler - X86Test_NoAlign
-// ===============================
-
-class X86Test_NoAlign : public X86TestCase {
-public:
- X86Test_NoAlign() : X86TestCase("NoAlign") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_NoAlign());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<void>());
- cc.align(AlignMode::kCode, 0);
- cc.align(AlignMode::kCode, 1);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- DebugUtils::unused(result, expect);
-
- typedef void (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- func();
- return true;
- }
-};
-
-// x86::Compiler - X86Test_IndirectBranchProtection
-// ================================================
-
-class X86Test_IndirectBranchProtection : public X86TestCase {
-public:
- X86Test_IndirectBranchProtection() : X86TestCase("IndirectBranchProtection") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_IndirectBranchProtection());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* func = cc.addFunc(FuncSignature::build<void>());
- func->addAttributes(FuncAttributes::kIndirectBranchProtection);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- DebugUtils::unused(result, expect);
-
- typedef void (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- func();
- return true;
- }
-};
-
-
-// x86::Compiler - X86Test_JumpMerge
-// =================================
-
-class X86Test_JumpMerge : public X86TestCase {
-public:
- X86Test_JumpMerge() : X86TestCase("JumpMerge") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpMerge());
- }
-
- virtual void compile(x86::Compiler& cc) {
- Label L0 = cc.newLabel();
- Label L1 = cc.newLabel();
- Label L2 = cc.newLabel();
- Label LEnd = cc.newLabel();
-
- x86::Gp dst = cc.newIntPtr("dst");
- x86::Gp val = cc.newInt32("val");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, val);
-
- cc.cmp(val, 0);
- cc.je(L2);
-
- cc.cmp(val, 1);
- cc.je(L1);
-
- cc.cmp(val, 2);
- cc.je(L0);
-
- cc.mov(x86::dword_ptr(dst), val);
- cc.jmp(LEnd);
-
- // On purpose. This tests whether the CFG constructs a single basic-block
- // from multiple labels next to each other.
- cc.bind(L0);
- cc.bind(L1);
- cc.bind(L2);
- cc.mov(x86::dword_ptr(dst), 0);
-
- cc.bind(LEnd);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void(*Func)(int*, int);
- Func func = ptr_as_func<Func>(_func);
-
- int arr[5] = { -1, -1, -1, -1, -1 };
- int exp[5] = { 0, 0, 0, 3, 4 };
-
- for (int i = 0; i < 5; i++)
- func(&arr[i], i);
-
- result.assignFormat("ret={%d, %d, %d, %d, %d}", arr[0], arr[1], arr[2], arr[3], arr[4]);
- expect.assignFormat("ret={%d, %d, %d, %d, %d}", exp[0], exp[1], exp[2], exp[3], exp[4]);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_JumpCross
-// =================================
-
-class X86Test_JumpCross : public X86TestCase {
-public:
- X86Test_JumpCross() : X86TestCase("JumpCross") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpCross());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<void>());
-
- Label L1 = cc.newLabel();
- Label L2 = cc.newLabel();
- Label L3 = cc.newLabel();
-
- cc.jmp(L2);
-
- cc.bind(L1);
- cc.jmp(L3);
-
- cc.bind(L2);
- cc.jmp(L1);
-
- cc.bind(L3);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- DebugUtils::unused(result, expect);
-
- typedef void (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- func();
- return true;
- }
-};
-
-// x86::Compiler - X86Test_JumpMany
-// ================================
-
-class X86Test_JumpMany : public X86TestCase {
-public:
- X86Test_JumpMany() : X86TestCase("JumpMany") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpMany());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
- for (uint32_t i = 0; i < 1000; i++) {
- Label L = cc.newLabel();
- cc.jmp(L);
- cc.bind(L);
- }
-
- x86::Gp ret = cc.newInt32("ret");
- cc.xor_(ret, ret);
- cc.ret(ret);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
-
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 0;
-
- result.assignFormat("ret={%d}", resultRet);
- expect.assignFormat("ret={%d}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_JumpUnreachable1
-// ========================================
-
-class X86Test_JumpUnreachable1 : public X86TestCase {
-public:
- X86Test_JumpUnreachable1() : X86TestCase("JumpUnreachable1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpUnreachable1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<void>());
-
- Label L_1 = cc.newLabel();
- Label L_2 = cc.newLabel();
- Label L_3 = cc.newLabel();
- Label L_4 = cc.newLabel();
- Label L_5 = cc.newLabel();
- Label L_6 = cc.newLabel();
- Label L_7 = cc.newLabel();
-
- x86::Gp v0 = cc.newUInt32("v0");
- x86::Gp v1 = cc.newUInt32("v1");
-
- cc.bind(L_2);
- cc.bind(L_3);
-
- cc.jmp(L_1);
-
- cc.bind(L_5);
- cc.mov(v0, 0);
-
- cc.bind(L_6);
- cc.jmp(L_3);
- cc.mov(v1, 1);
- cc.jmp(L_1);
-
- cc.bind(L_4);
- cc.jmp(L_2);
- cc.bind(L_7);
- cc.add(v0, v1);
-
- cc.align(AlignMode::kCode, 16);
- cc.bind(L_1);
- cc.ret();
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- func();
-
- result.append("ret={}");
- expect.append("ret={}");
-
- return true;
- }
-};
-
-// x86::Compiler - X86Test_JumpUnreachable2
-// ========================================
-
-class X86Test_JumpUnreachable2 : public X86TestCase {
-public:
- X86Test_JumpUnreachable2() : X86TestCase("JumpUnreachable2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpUnreachable2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<void>());
-
- Label L_1 = cc.newLabel();
- Label L_2 = cc.newLabel();
-
- x86::Gp v0 = cc.newUInt32("v0");
- x86::Gp v1 = cc.newUInt32("v1");
-
- cc.jmp(L_1);
- cc.bind(L_2);
- cc.mov(v0, 1);
- cc.mov(v1, 2);
- cc.cmp(v0, v1);
- cc.jz(L_2);
- cc.jmp(L_1);
-
- cc.bind(L_1);
- cc.ret();
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- func();
-
- result.append("ret={}");
- expect.append("ret={}");
-
- return true;
- }
-};
-
-// x86::Compiler - X86Test_JumpTable1
-// ==================================
-
-class X86Test_JumpTable1 : public X86TestCase {
-public:
- bool _annotated;
-
- X86Test_JumpTable1(bool annotated)
- : X86TestCase("X86Test_JumpTable1"),
- _annotated(annotated) {
- _name.assignFormat("JumpTable {%s}", annotated ? "Annotated" : "Unknown Reg/Mem");
- }
-
- enum Operator {
- kOperatorAdd = 0,
- kOperatorSub = 1,
- kOperatorMul = 2,
- kOperatorDiv = 3
- };
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpTable1(false));
- app.add(new X86Test_JumpTable1(true));
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Xmm a = cc.newXmmSs("a");
- x86::Xmm b = cc.newXmmSs("b");
- x86::Gp op = cc.newUInt32("op");
- x86::Gp target = cc.newIntPtr("target");
- x86::Gp offset = cc.newIntPtr("offset");
-
- Label L_Table = cc.newLabel();
- Label L_Add = cc.newLabel();
- Label L_Sub = cc.newLabel();
- Label L_Mul = cc.newLabel();
- Label L_Div = cc.newLabel();
- Label L_End = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float, uint32_t>());
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
- funcNode->setArg(2, op);
-
- cc.lea(offset, x86::ptr(L_Table));
- if (cc.is64Bit())
- cc.movsxd(target, x86::dword_ptr(offset, op.cloneAs(offset), 2));
- else
- cc.mov(target, x86::dword_ptr(offset, op.cloneAs(offset), 2));
- cc.add(target, offset);
-
- // JumpAnnotation allows to annotate all possible jump targets of
- // instructions where it cannot be deduced from operands.
- if (_annotated) {
- JumpAnnotation* annotation = cc.newJumpAnnotation();
- annotation->addLabel(L_Add);
- annotation->addLabel(L_Sub);
- annotation->addLabel(L_Mul);
- annotation->addLabel(L_Div);
- cc.jmp(target, annotation);
- }
- else {
- cc.jmp(target);
- }
-
- cc.bind(L_Add);
- cc.addss(a, b);
- cc.jmp(L_End);
-
- cc.bind(L_Sub);
- cc.subss(a, b);
- cc.jmp(L_End);
-
- cc.bind(L_Mul);
- cc.mulss(a, b);
- cc.jmp(L_End);
-
- cc.bind(L_Div);
- cc.divss(a, b);
-
- cc.bind(L_End);
- cc.ret(a);
-
- cc.endFunc();
-
- cc.bind(L_Table);
- cc.embedLabelDelta(L_Add, L_Table, 4);
- cc.embedLabelDelta(L_Sub, L_Table, 4);
- cc.embedLabelDelta(L_Mul, L_Table, 4);
- cc.embedLabelDelta(L_Div, L_Table, 4);
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef float (*Func)(float, float, uint32_t);
- Func func = ptr_as_func<Func>(_func);
-
- float results[4];
- float expected[4];
-
- results[0] = func(33.0f, 14.0f, kOperatorAdd);
- results[1] = func(33.0f, 14.0f, kOperatorSub);
- results[2] = func(10.0f, 6.0f, kOperatorMul);
- results[3] = func(80.0f, 8.0f, kOperatorDiv);
-
- expected[0] = 47.0f;
- expected[1] = 19.0f;
- expected[2] = 60.0f;
- expected[3] = 10.0f;
-
- result.assignFormat("ret={%f, %f, %f, %f}", results[0], results[1], results[2], results[3]);
- expect.assignFormat("ret={%f, %f, %f, %f}", expected[0], expected[1], expected[2], expected[3]);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_JumpTable2
-// ==================================
-
-class X86Test_JumpTable2 : public X86TestCase {
-public:
- X86Test_JumpTable2()
- : X86TestCase("JumpTable {Jumping to Begin}") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpTable2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp result = cc.newUInt32("result");
- x86::Gp value = cc.newUInt32("value");
- x86::Gp target = cc.newIntPtr("target");
- x86::Gp offset = cc.newIntPtr("offset");
-
- Label L_Table = cc.newLabel();
- Label L_Begin = cc.newLabel();
- Label L_Case0 = cc.newLabel();
- Label L_Case1 = cc.newLabel();
- Label L_End = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int>());
- funcNode->setArg(0, value);
-
- cc.bind(L_Begin);
- cc.lea(offset, x86::ptr(L_Table));
- if (cc.is64Bit())
- cc.movsxd(target, x86::dword_ptr(offset, value.cloneAs(offset), 2));
- else
- cc.mov(target, x86::dword_ptr(offset, value.cloneAs(offset), 2));
- cc.add(target, offset);
-
- {
- JumpAnnotation* annotation = cc.newJumpAnnotation();
- annotation->addLabel(L_Case0);
- annotation->addLabel(L_Case1);
- annotation->addLabel(L_Begin); // Never used, just for the purpose of the test.
- cc.jmp(target, annotation);
-
- cc.bind(L_Case0);
- cc.mov(result, 0);
- cc.jmp(L_End);
-
- cc.bind(L_Case1);
- cc.mov(result, 1);
- cc.jmp(L_End);
- }
-
- cc.bind(L_End);
- cc.ret(result);
-
- cc.endFunc();
-
- cc.bind(L_Table);
- cc.embedLabelDelta(L_Case0, L_Table, 4);
- cc.embedLabelDelta(L_Case1, L_Table, 4);
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int);
- Func func = ptr_as_func<Func>(_func);
-
- int results[2];
- int expected[2];
-
- results[0] = func(0);
- results[1] = func(1);
-
- expected[0] = 0;
- expected[1] = 1;
-
- result.assignFormat("ret={%d, %d}", results[0], results[1]);
- expect.assignFormat("ret={%d, %d}", expected[0], expected[1]);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_JumpTable3
-// ==================================
-
-class X86Test_JumpTable3 : public X86TestCase {
-public:
- X86Test_JumpTable3()
- : X86TestCase("JumpTable {Jumping to a single label}") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpTable3());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- Label L_Target = cc.newLabel();
- x86::Gp target = cc.newUIntPtr("target");
- x86::Gp result = cc.newUInt32("result");
-
- JumpAnnotation* annotation = cc.newJumpAnnotation();
- annotation->addLabel(L_Target);
-
- cc.lea(target, x86::ptr(L_Target));
- cc.jmp(target, annotation);
-
- cc.bind(L_Target);
- cc.mov(result, 1234);
- cc.ret(result);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int out = func();
- int expected = 1234;
-
- result.assignFormat("ret=%d", out);
- expect.assignFormat("ret=%d", expected);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_JumpTable4
-// ==================================
-
-class X86Test_JumpTable4 : public X86TestCase {
-public:
- X86Test_JumpTable4()
- : X86TestCase("JumpTable {Jumping to a single label and multiple labels}") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_JumpTable4());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp result = cc.newUInt32("result");
- x86::Gp condition = cc.newUInt32("condition");
-
- FuncNode* func = cc.addFunc(FuncSignature::build<int, int>());
- func->setArg(0, condition);
-
- Label L_NonZero = cc.newLabel();
- cc.test(condition, condition);
- cc.jnz(L_NonZero);
-
- {
- JumpAnnotation* annotation = cc.newJumpAnnotation();
- Label L_Target = cc.newLabel();
- annotation->addLabel(L_Target);
-
- x86::Gp target = cc.newUIntPtr("target");
- cc.lea(target, x86::ptr(L_Target));
- cc.jmp(target, annotation);
- cc.bind(L_Target);
- cc.mov(result, 1234);
- cc.ret(result);
- }
-
- {
- JumpAnnotation* annotation = cc.newJumpAnnotation();
- Label L_Target1 = cc.newLabel();
- Label L_Target2 = cc.newLabel();
- annotation->addLabel(L_Target1);
- annotation->addLabel(L_Target2);
-
- cc.bind(L_NonZero);
- x86::Gp target = cc.newUIntPtr("target");
- cc.lea(target, x86::ptr(L_Target1));
- cc.jmp(target, annotation);
-
- cc.bind(L_Target1);
- cc.mov(result, 4321);
- cc.ret(result);
-
- // Never executed.
- cc.bind(L_Target2);
- cc.mov(result, 0);
- cc.ret(result);
- }
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int);
- Func func = ptr_as_func<Func>(_func);
-
- int results[2] = { func(0), func(1) };
- int expected[2] = { 1234, 4321 };
-
- result.assignFormat("ret={%d, %d}", results[0], results[1]);
- expect.assignFormat("ret={%d, %d}", expected[0], expected[1]);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocBase
-// =================================
-
-class X86Test_AllocBase : public X86TestCase {
-public:
- X86Test_AllocBase() : X86TestCase("AllocBase") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocBase());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- x86::Gp v0 = cc.newInt32("v0");
- x86::Gp v1 = cc.newInt32("v1");
- x86::Gp v2 = cc.newInt32("v2");
- x86::Gp v3 = cc.newInt32("v3");
- x86::Gp v4 = cc.newInt32("v4");
-
- cc.xor_(v0, v0);
-
- cc.mov(v1, 1);
- cc.mov(v2, 2);
- cc.mov(v3, 3);
- cc.mov(v4, 4);
-
- cc.add(v0, v1);
- cc.add(v0, v2);
- cc.add(v0, v3);
- cc.add(v0, v4);
-
- cc.ret(v0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 1 + 2 + 3 + 4;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocMany1
-// ==================================
-
-class X86Test_AllocMany1 : public X86TestCase {
-public:
- X86Test_AllocMany1() : X86TestCase("AllocMany1") {}
-
- enum { kCount = 8 };
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocMany1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp a0 = cc.newIntPtr("a0");
- x86::Gp a1 = cc.newIntPtr("a1");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int*>());
- funcNode->setArg(0, a0);
- funcNode->setArg(1, a1);
-
- // Create some variables.
- x86::Gp t = cc.newInt32("t");
- x86::Gp x[kCount];
-
- uint32_t i;
-
- // Setup variables (use mov with reg/imm to se if register allocator works).
- for (i = 0; i < kCount; i++) x[i] = cc.newInt32("x%u", i);
- for (i = 0; i < kCount; i++) cc.mov(x[i], int(i + 1));
-
- // Make sum (addition).
- cc.xor_(t, t);
- for (i = 0; i < kCount; i++) cc.add(t, x[i]);
-
- // Store result to a given pointer in first argument.
- cc.mov(x86::dword_ptr(a0), t);
-
- // Clear t.
- cc.xor_(t, t);
-
- // Make sum (subtraction).
- for (i = 0; i < kCount; i++) cc.sub(t, x[i]);
-
- // Store result to a given pointer in second argument.
- cc.mov(x86::dword_ptr(a1), t);
-
- // End of function.
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(int*, int*);
- Func func = ptr_as_func<Func>(_func);
-
- int resultX = 0;
- int resultY = 0;
-
- int expectX = 36;
- int expectY = -36;
-
- func(&resultX, &resultY);
-
- result.assignFormat("ret={x=%d, y=%d}", resultX, resultY);
- expect.assignFormat("ret={x=%d, y=%d}", expectX, expectY);
-
- return resultX == expectX && resultY == expectY;
- }
-};
-
-// x86::Compiler - X86Test_AllocMany2
-// ==================================
-
-class X86Test_AllocMany2 : public X86TestCase {
-public:
- X86Test_AllocMany2() : X86TestCase("AllocMany2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocMany2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp a = cc.newIntPtr("a");
- x86::Gp v[32];
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, uint32_t*>());
- funcNode->setArg(0, a);
-
- for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) v[i] = cc.newInt32("v%d", i);
- for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.xor_(v[i], v[i]);
-
- x86::Gp x = cc.newInt32("x");
- Label L = cc.newLabel();
-
- cc.mov(x, 32);
- cc.bind(L);
- for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.add(v[i], i);
-
- cc.dec(x);
- cc.jnz(L);
- for (uint32_t i = 0; i < ASMJIT_ARRAY_SIZE(v); i++) cc.mov(x86::dword_ptr(a, int(i * 4)), v[i]);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(uint32_t*);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t i;
- uint32_t resultBuf[32] {};
- uint32_t expectBuf[32] {};
-
- for (i = 0; i < ASMJIT_ARRAY_SIZE(resultBuf); i++)
- expectBuf[i] = i * 32;
- func(resultBuf);
-
- for (i = 0; i < ASMJIT_ARRAY_SIZE(resultBuf); i++) {
- if (i != 0) {
- result.append(',');
- expect.append(',');
- }
-
- result.appendFormat("%u", resultBuf[i]);
- expect.appendFormat("%u", expectBuf[i]);
- }
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocImul1
-// ==================================
-
-class X86Test_AllocImul1 : public X86TestCase {
-public:
- X86Test_AllocImul1() : X86TestCase("AllocImul1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocImul1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp dstHi = cc.newIntPtr("dstHi");
- x86::Gp dstLo = cc.newIntPtr("dstLo");
-
- x86::Gp vHi = cc.newInt32("vHi");
- x86::Gp vLo = cc.newInt32("vLo");
- x86::Gp src = cc.newInt32("src");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int*, int, int>());
- funcNode->setArg(0, dstHi);
- funcNode->setArg(1, dstLo);
- funcNode->setArg(2, vLo);
- funcNode->setArg(3, src);
-
- cc.imul(vHi, vLo, src);
- cc.mov(x86::dword_ptr(dstHi), vHi);
- cc.mov(x86::dword_ptr(dstLo), vLo);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(int*, int*, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int v0 = 4;
- int v1 = 4;
-
- int resultHi = 0;
- int resultLo = 0;
-
- int expectHi = 0;
- int expectLo = v0 * v1;
-
- func(&resultHi, &resultLo, v0, v1);
-
- result.assignFormat("hi=%d, lo=%d", resultHi, resultLo);
- expect.assignFormat("hi=%d, lo=%d", expectHi, expectLo);
-
- return resultHi == expectHi && resultLo == expectLo;
- }
-};
-
-// x86::Compiler - X86Test_AllocImul2
-// ==================================
-
-class X86Test_AllocImul2 : public X86TestCase {
-public:
- X86Test_AllocImul2() : X86TestCase("AllocImul2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocImul2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp dst = cc.newIntPtr("dst");
- x86::Gp src = cc.newIntPtr("src");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, const int*>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src);
-
- for (unsigned int i = 0; i < 4; i++) {
- x86::Gp x = cc.newInt32("x");
- x86::Gp y = cc.newInt32("y");
- x86::Gp hi = cc.newInt32("hi");
-
- cc.mov(x, x86::dword_ptr(src, 0));
- cc.mov(y, x86::dword_ptr(src, 4));
-
- cc.imul(hi, x, y);
- cc.add(x86::dword_ptr(dst, 0), hi);
- cc.add(x86::dword_ptr(dst, 4), x);
- }
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(int*, const int*);
- Func func = ptr_as_func<Func>(_func);
-
- int src[2] = { 4, 9 };
- int resultRet[2] = { 0, 0 };
- int expectRet[2] = { 0, (4 * 9) * 4 };
-
- func(resultRet, src);
-
- result.assignFormat("ret={%d, %d}", resultRet[0], resultRet[1]);
- expect.assignFormat("ret={%d, %d}", expectRet[0], expectRet[1]);
-
- return resultRet[0] == expectRet[0] && resultRet[1] == expectRet[1];
- }
-};
-
-// x86::Compiler - X86Test_AllocIdiv1
-// ==================================
-
-class X86Test_AllocIdiv1 : public X86TestCase {
-public:
- X86Test_AllocIdiv1() : X86TestCase("AllocIdiv1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocIdiv1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
- x86::Gp dummy = cc.newInt32("dummy");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
-
- cc.xor_(dummy, dummy);
- cc.idiv(dummy, a, b);
-
- cc.ret(a);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int v0 = 2999;
- int v1 = 245;
-
- int resultRet = func(v0, v1);
- int expectRet = 2999 / 245;
-
- result.assignFormat("result=%d", resultRet);
- expect.assignFormat("result=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocSetz
-// =================================
-
-class X86Test_AllocSetz : public X86TestCase {
-public:
- X86Test_AllocSetz() : X86TestCase("AllocSetz") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocSetz());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp src0 = cc.newInt32("src0");
- x86::Gp src1 = cc.newInt32("src1");
- x86::Gp dst0 = cc.newIntPtr("dst0");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int, int, char*>());
- funcNode->setArg(0, src0);
- funcNode->setArg(1, src1);
- funcNode->setArg(2, dst0);
-
- cc.cmp(src0, src1);
- cc.setz(x86::byte_ptr(dst0));
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(int, int, char*);
- Func func = ptr_as_func<Func>(_func);
-
- char resultBuf[4] {};
- char expectBuf[4] = { 1, 0, 0, 1 };
-
- func(0, 0, &resultBuf[0]); // We are expecting 1 (0 == 0).
- func(0, 1, &resultBuf[1]); // We are expecting 0 (0 != 1).
- func(1, 0, &resultBuf[2]); // We are expecting 0 (1 != 0).
- func(1, 1, &resultBuf[3]); // We are expecting 1 (1 == 1).
-
- result.assignFormat("out={%d, %d, %d, %d}", resultBuf[0], resultBuf[1], resultBuf[2], resultBuf[3]);
- expect.assignFormat("out={%d, %d, %d, %d}", expectBuf[0], expectBuf[1], expectBuf[2], expectBuf[3]);
-
- return resultBuf[0] == expectBuf[0] &&
- resultBuf[1] == expectBuf[1] &&
- resultBuf[2] == expectBuf[2] &&
- resultBuf[3] == expectBuf[3] ;
- }
-};
-
-// x86::Compiler - X86Test_AllocShlRor
-// ===================================
-
-class X86Test_AllocShlRor : public X86TestCase {
-public:
- X86Test_AllocShlRor() : X86TestCase("AllocShlRor") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocShlRor());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp dst = cc.newIntPtr("dst");
- x86::Gp var = cc.newInt32("var");
- x86::Gp vShlParam = cc.newInt32("vShlParam");
- x86::Gp vRorParam = cc.newInt32("vRorParam");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, int*, int, int, int>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, var);
- funcNode->setArg(2, vShlParam);
- funcNode->setArg(3, vRorParam);
-
- cc.shl(var, vShlParam);
- cc.ror(var, vRorParam);
- cc.mov(x86::dword_ptr(dst), var);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(int*, int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int v0 = 0x000000FF;
-
- int resultRet = 0;
- int expectRet = 0x0000FF00;
-
- func(&resultRet, v0, 16, 8);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocGpbLo
-// ==================================
-
-class X86Test_AllocGpbLo1 : public X86TestCase {
-public:
- X86Test_AllocGpbLo1() : X86TestCase("AllocGpbLo1") {}
-
- enum : uint32_t { kCount = 32 };
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocGpbLo1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp rPtr = cc.newUIntPtr("rPtr");
- x86::Gp rSum = cc.newUInt32("rSum");
- x86::Gp x[kCount];
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t*>());
- funcNode->setArg(0, rPtr);
-
- for (uint32_t i = 0; i < kCount; i++) {
- x[i] = cc.newUInt32("x%u", i);
- }
-
- // Init pseudo-regs with values from our array.
- for (uint32_t i = 0; i < kCount; i++) {
- cc.mov(x[i], x86::dword_ptr(rPtr, int(i * 4)));
- }
-
- for (uint32_t i = 2; i < kCount; i++) {
- // Add and truncate to 8 bit; no purpose, just mess with jit.
- cc.add (x[i ], x[i-1]);
- cc.movzx(x[i ], x[i ].r8());
- cc.movzx(x[i-2], x[i-1].r8());
- cc.movzx(x[i-1], x[i-2].r8());
- }
-
- // Sum up all computed values.
- cc.mov(rSum, 0);
- for (uint32_t i = 0; i < kCount; i++) {
- cc.add(rSum, x[i]);
- }
-
- // Return the sum.
- cc.ret(rSum);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef uint32_t (*Func)(uint32_t*);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t i;
- uint32_t buf[kCount];
- uint32_t resultRet = 0;
- uint32_t expectRet = 0;
-
- for (i = 0; i < kCount; i++) {
- buf[i] = 1;
- }
-
- for (i = 2; i < kCount; i++) {
- buf[i ]+= buf[i-1];
- buf[i ] = buf[i ] & 0xFF;
- buf[i-2] = buf[i-1] & 0xFF;
- buf[i-1] = buf[i-2] & 0xFF;
- }
-
- for (i = 0; i < kCount; i++) {
- expectRet += buf[i];
- }
-
- for (i = 0; i < kCount; i++) {
- buf[i] = 1;
- }
- resultRet = func(buf);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocGpbLo2
-// ===================================
-
-class X86Test_AllocGpbLo2 : public X86TestCase {
-public:
- X86Test_AllocGpbLo2() : X86TestCase("AllocGpbLo2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocGpbLo2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v = cc.newUInt32("v");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t>());
- funcNode->setArg(0, v);
-
- cc.mov(v.r8(), 0xFF);
- cc.ret(v);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef uint32_t (*Func)(uint32_t);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t resultRet = func(0x12345678u);
- uint32_t expectRet = 0x123456FFu;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocRepMovsb
-// =====================================
-
-class X86Test_AllocRepMovsb : public X86TestCase {
-public:
- X86Test_AllocRepMovsb() : X86TestCase("AllocRepMovsb") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocRepMovsb());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp dst = cc.newIntPtr("dst");
- x86::Gp src = cc.newIntPtr("src");
- x86::Gp cnt = cc.newIntPtr("cnt");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, void*, size_t>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src);
- funcNode->setArg(2, cnt);
-
- cc.rep(cnt).movs(x86::byte_ptr(dst), x86::byte_ptr(src));
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void*, void*, size_t);
- Func func = ptr_as_func<Func>(_func);
-
- char dst[20] = { 0 };
- char src[20] = "Hello AsmJit!";
- func(dst, src, strlen(src) + 1);
-
- result.assignFormat("ret=\"%s\"", dst);
- expect.assignFormat("ret=\"%s\"", src);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocIfElse1
-// ====================================
-
-class X86Test_AllocIfElse1 : public X86TestCase {
-public:
- X86Test_AllocIfElse1() : X86TestCase("AllocIfElse1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocIfElse1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v1 = cc.newInt32("v1");
- x86::Gp v2 = cc.newInt32("v2");
-
- Label L_1 = cc.newLabel();
- Label L_2 = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
- funcNode->setArg(0, v1);
- funcNode->setArg(1, v2);
-
- cc.cmp(v1, v2);
- cc.jg(L_1);
-
- cc.mov(v1, 1);
- cc.jmp(L_2);
-
- cc.bind(L_1);
- cc.mov(v1, 2);
-
- cc.bind(L_2);
- cc.ret(v1);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int a = func(0, 1);
- int b = func(1, 0);
-
- result.appendFormat("ret={%d, %d}", a, b);
- expect.appendFormat("ret={%d, %d}", 1, 2);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocIfElse2
-// ====================================
-
-class X86Test_AllocIfElse2 : public X86TestCase {
-public:
- X86Test_AllocIfElse2() : X86TestCase("AllocIfElse2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocIfElse2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v1 = cc.newInt32("v1");
- x86::Gp v2 = cc.newInt32("v2");
-
- Label L_1 = cc.newLabel();
- Label L_2 = cc.newLabel();
- Label L_3 = cc.newLabel();
- Label L_4 = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
- funcNode->setArg(0, v1);
- funcNode->setArg(1, v2);
-
- cc.jmp(L_1);
- cc.bind(L_2);
- cc.jmp(L_4);
- cc.bind(L_1);
-
- cc.cmp(v1, v2);
- cc.jg(L_3);
-
- cc.mov(v1, 1);
- cc.jmp(L_2);
-
- cc.bind(L_3);
- cc.mov(v1, 2);
- cc.jmp(L_2);
-
- cc.bind(L_4);
-
- cc.ret(v1);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int a = func(0, 1);
- int b = func(1, 0);
-
- result.appendFormat("ret={%d, %d}", a, b);
- expect.appendFormat("ret={%d, %d}", 1, 2);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocIfElse3
-// ====================================
-
-class X86Test_AllocIfElse3 : public X86TestCase {
-public:
- X86Test_AllocIfElse3() : X86TestCase("AllocIfElse3") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocIfElse3());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v1 = cc.newInt32("v1");
- x86::Gp v2 = cc.newInt32("v2");
- x86::Gp counter = cc.newInt32("counter");
-
- Label L_1 = cc.newLabel();
- Label L_Loop = cc.newLabel();
- Label L_Exit = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
- funcNode->setArg(0, v1);
- funcNode->setArg(1, v2);
-
- cc.cmp(v1, v2);
- cc.jg(L_1);
-
- cc.mov(counter, 0);
-
- cc.bind(L_Loop);
- cc.mov(v1, counter);
-
- cc.inc(counter);
- cc.cmp(counter, 1);
- cc.jle(L_Loop);
- cc.jmp(L_Exit);
-
- cc.bind(L_1);
- cc.mov(v1, 2);
-
- cc.bind(L_Exit);
- cc.ret(v1);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int a = func(0, 1);
- int b = func(1, 0);
-
- result.appendFormat("ret={%d, %d}", a, b);
- expect.appendFormat("ret={%d, %d}", 1, 2);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocIfElse4
-// ====================================
-
-class X86Test_AllocIfElse4 : public X86TestCase {
-public:
- X86Test_AllocIfElse4() : X86TestCase("AllocIfElse4") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocIfElse4());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v1 = cc.newInt32("v1");
- x86::Gp v2 = cc.newInt32("v2");
- x86::Gp counter = cc.newInt32("counter");
-
- Label L_1 = cc.newLabel();
- Label L_Loop1 = cc.newLabel();
- Label L_Loop2 = cc.newLabel();
- Label L_Exit = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
- funcNode->setArg(0, v1);
- funcNode->setArg(1, v2);
-
- cc.mov(counter, 0);
- cc.cmp(v1, v2);
- cc.jg(L_1);
-
- cc.bind(L_Loop1);
- cc.mov(v1, counter);
-
- cc.inc(counter);
- cc.cmp(counter, 1);
- cc.jle(L_Loop1);
- cc.jmp(L_Exit);
-
- cc.bind(L_1);
- cc.bind(L_Loop2);
- cc.mov(v1, counter);
- cc.inc(counter);
- cc.cmp(counter, 2);
- cc.jle(L_Loop2);
-
- cc.bind(L_Exit);
- cc.ret(v1);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int a = func(0, 1);
- int b = func(1, 0);
-
- result.appendFormat("ret={%d, %d}", a, b);
- expect.appendFormat("ret={%d, %d}", 1, 2);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocInt8
-// =================================
-
-class X86Test_AllocInt8 : public X86TestCase {
-public:
- X86Test_AllocInt8() : X86TestCase("AllocInt8") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocInt8());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp x = cc.newInt8("x");
- x86::Gp y = cc.newInt32("y");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int8_t>());
- funcNode->setArg(0, x);
-
- cc.movsx(y, x);
-
- cc.ret(y);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int8_t);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(int8_t(-13));
- int expectRet = -13;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocUnhandledArg
-// =========================================
-
-class X86Test_AllocUnhandledArg : public X86TestCase {
-public:
- X86Test_AllocUnhandledArg() : X86TestCase("AllocUnhandledArg") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocUnhandledArg());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp x = cc.newInt32("x");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
- funcNode->setArg(2, x);
-
- cc.ret(x);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(42, 155, 199);
- int expectRet = 199;
-
- result.assignFormat("ret={%d}", resultRet);
- expect.assignFormat("ret={%d}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocArgsIntPtr
-// =======================================
-
-class X86Test_AllocArgsIntPtr : public X86TestCase {
-public:
- X86Test_AllocArgsIntPtr() : X86TestCase("AllocArgsIntPtr") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocArgsIntPtr());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, void*, void*, void*, void*, void*, void*, void*>());
- x86::Gp var[8];
-
- for (uint32_t i = 0; i < 8; i++) {
- var[i] = cc.newIntPtr("var%u", i);
- funcNode->setArg(i, var[i]);
- }
-
- for (uint32_t i = 0; i < 8; i++) {
- cc.add(var[i], int(i + 1));
- }
-
- // Move some data into buffer provided by arguments so we can verify if it
- // really works without looking into assembler output.
- for (uint32_t i = 0; i < 8; i++) {
- cc.add(x86::byte_ptr(var[i]), int(i + 1));
- }
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void*, void*, void*, void*, void*, void*, void*, void*);
- Func func = ptr_as_func<Func>(_func);
-
- uint8_t resultBuf[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- uint8_t expectBuf[9] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
-
- func(resultBuf, resultBuf, resultBuf, resultBuf,
- resultBuf, resultBuf, resultBuf, resultBuf);
-
- result.assignFormat("buf={%d, %d, %d, %d, %d, %d, %d, %d, %d}",
- resultBuf[0], resultBuf[1], resultBuf[2], resultBuf[3],
- resultBuf[4], resultBuf[5], resultBuf[6], resultBuf[7],
- resultBuf[8]);
- expect.assignFormat("buf={%d, %d, %d, %d, %d, %d, %d, %d, %d}",
- expectBuf[0], expectBuf[1], expectBuf[2], expectBuf[3],
- expectBuf[4], expectBuf[5], expectBuf[6], expectBuf[7],
- expectBuf[8]);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocArgsFloat
-// ======================================
-
-class X86Test_AllocArgsFloat : public X86TestCase {
-public:
- X86Test_AllocArgsFloat() : X86TestCase("AllocArgsFloat") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocArgsFloat());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, float, float, float, float, float, float, float, void*>());
-
- x86::Gp p = cc.newIntPtr("p");
- x86::Xmm xv[7];
-
- for (uint32_t i = 0; i < 7; i++) {
- xv[i] = cc.newXmmSs("xv%u", i);
- funcNode->setArg(i, xv[i]);
- }
-
- funcNode->setArg(7, p);
-
- cc.addss(xv[0], xv[1]);
- cc.addss(xv[0], xv[2]);
- cc.addss(xv[0], xv[3]);
- cc.addss(xv[0], xv[4]);
- cc.addss(xv[0], xv[5]);
- cc.addss(xv[0], xv[6]);
-
- cc.movss(x86::ptr(p), xv[0]);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(float, float, float, float, float, float, float, float*);
- Func func = ptr_as_func<Func>(_func);
-
- float resultRet = 0;
- float expectRet = 1.0f + 2.0f + 3.0f + 4.0f + 5.0f + 6.0f + 7.0f;
-
- func(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, &resultRet);
-
- result.assignFormat("ret={%g}", resultRet);
- expect.assignFormat("ret={%g}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocArgsDouble
-// =======================================
-
-class X86Test_AllocArgsDouble : public X86TestCase {
-public:
- X86Test_AllocArgsDouble() : X86TestCase("AllocArgsDouble") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocArgsDouble());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, double, double, double, double, double, double, double, void*>());
-
- x86::Gp p = cc.newIntPtr("p");
- x86::Xmm xv[7];
-
- for (uint32_t i = 0; i < 7; i++) {
- xv[i] = cc.newXmmSd("xv%u", i);
- funcNode->setArg(i, xv[i]);
- }
-
- funcNode->setArg(7, p);
-
- cc.addsd(xv[0], xv[1]);
- cc.addsd(xv[0], xv[2]);
- cc.addsd(xv[0], xv[3]);
- cc.addsd(xv[0], xv[4]);
- cc.addsd(xv[0], xv[5]);
- cc.addsd(xv[0], xv[6]);
-
- cc.movsd(x86::ptr(p), xv[0]);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(double, double, double, double, double, double, double, double*);
- Func func = ptr_as_func<Func>(_func);
-
- double resultRet = 0;
- double expectRet = 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0;
-
- func(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, &resultRet);
-
- result.assignFormat("ret={%g}", resultRet);
- expect.assignFormat("ret={%g}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocArgsVec
-// ====================================
-
-#if ASMJIT_ARCH_X86
-class X86Test_AllocArgsVec : public X86TestCase {
-public:
- X86Test_AllocArgsVec() : X86TestCase("AllocArgsVec") {}
-
- static void add(TestApp& app) {
- // Not supported on Windows.
-#ifndef _WIN32
- app.add(new X86Test_AllocArgsVec());
-#else
- DebugUtils::unused(app);
-#endif
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Xmm a = cc.newXmm("aXmm");
- x86::Xmm b = cc.newXmm("bXmm");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<x86::Xmm, x86::Xmm, x86::Xmm>());
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
-
- cc.paddb(a, b);
- cc.ret(a);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef __m128i (*Func)(__m128i, __m128i);
- Func func = ptr_as_func<Func>(_func);
-
- uint8_t aData[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
- uint8_t bData[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
-
- uint8_t rData[16] {};
- uint8_t eData[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
-
- __m128i aVec = _mm_loadu_si128(reinterpret_cast<const __m128i*>(aData));
- __m128i bVec = _mm_loadu_si128(reinterpret_cast<const __m128i*>(bData));
-
- __m128i rVec = func(aVec, bVec);
- _mm_storeu_si128(reinterpret_cast<__m128i*>(rData), rVec);
-
- result.appendHex(rData, 16);
- expect.appendHex(eData, 16);
-
- return result == expect;
- }
-};
-#endif // ASMJIT_ARCH_X86
-
-// x86::Compiler - X86Test_AllocRetFloat1
-// ======================================
-
-class X86Test_AllocRetFloat1 : public X86TestCase {
-public:
- X86Test_AllocRetFloat1() : X86TestCase("AllocRetFloat1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocRetFloat1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Xmm x = cc.newXmmSs("x");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float>());
- funcNode->setArg(0, x);
-
- cc.ret(x);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef float (*Func)(float);
- Func func = ptr_as_func<Func>(_func);
-
- float resultRet = func(42.0f);
- float expectRet = 42.0f;
-
- result.assignFormat("ret={%g}", resultRet);
- expect.assignFormat("ret={%g}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocRetFloat2
-// ======================================
-
-class X86Test_AllocRetFloat2 : public X86TestCase {
-public:
- X86Test_AllocRetFloat2() : X86TestCase("AllocRetFloat2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocRetFloat2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Xmm x = cc.newXmmSs("x");
- x86::Xmm y = cc.newXmmSs("y");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float>());
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
-
- cc.addss(x, y);
- cc.ret(x);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef float (*Func)(float, float);
- Func func = ptr_as_func<Func>(_func);
-
- float resultRet = func(1.0f, 2.0f);
- float expectRet = 1.0f + 2.0f;
-
- result.assignFormat("ret={%g}", resultRet);
- expect.assignFormat("ret={%g}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocRetDouble1
-// =======================================
-
-class X86Test_AllocRetDouble1 : public X86TestCase {
-public:
- X86Test_AllocRetDouble1() : X86TestCase("AllocRetDouble1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocRetDouble1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Xmm x = cc.newXmmSd("x");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double>());
- funcNode->setArg(0, x);
-
- cc.ret(x);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(double);
- Func func = ptr_as_func<Func>(_func);
-
- double resultRet = func(42.0);
- double expectRet = 42.0;
-
- result.assignFormat("ret={%g}", resultRet);
- expect.assignFormat("ret={%g}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocRetDouble2
-// =======================================
-
-class X86Test_AllocRetDouble2 : public X86TestCase {
-public:
- X86Test_AllocRetDouble2() : X86TestCase("AllocRetDouble2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocRetDouble2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Xmm x = cc.newXmmSd("x");
- x86::Xmm y = cc.newXmmSd("y");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double>());
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
-
- cc.addsd(x, y);
- cc.ret(x);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(double, double);
- Func func = ptr_as_func<Func>(_func);
-
- double resultRet = func(1.0, 2.0);
- double expectRet = 1.0 + 2.0;
-
- result.assignFormat("ret={%g}", resultRet);
- expect.assignFormat("ret={%g}", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocStack
-// ==================================
-
-class X86Test_AllocStack : public X86TestCase {
-public:
- X86Test_AllocStack() : X86TestCase("AllocStack") {}
-
- enum { kSize = 256 };
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocStack());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- x86::Mem stack = cc.newStack(kSize, 1);
- stack.setSize(1);
-
- x86::Gp i = cc.newIntPtr("i");
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
-
- Label L_1 = cc.newLabel();
- Label L_2 = cc.newLabel();
-
- // Fill stack by sequence [0, 1, 2, 3 ... 255].
- cc.xor_(i, i);
-
- x86::Mem stackWithIndex = stack.clone();
- stackWithIndex.setIndex(i, 0);
-
- cc.bind(L_1);
- cc.mov(stackWithIndex, i.r8());
- cc.inc(i);
- cc.cmp(i, 255);
- cc.jle(L_1);
-
- // Sum sequence in stack.
- cc.xor_(i, i);
- cc.xor_(a, a);
-
- cc.bind(L_2);
- cc.movzx(b, stackWithIndex);
- cc.add(a, b);
- cc.inc(i);
- cc.cmp(i, 255);
- cc.jle(L_2);
-
- cc.ret(a);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 32640;
-
- result.assignInt(resultRet);
- expect.assignInt(expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocMemcpy
-// ===================================
-
-class X86Test_AllocMemcpy : public X86TestCase {
-public:
- X86Test_AllocMemcpy() : X86TestCase("AllocMemcpy") {}
-
- enum { kCount = 32 };
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocMemcpy());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp dst = cc.newIntPtr("dst");
- x86::Gp src = cc.newIntPtr("src");
- x86::Gp cnt = cc.newUIntPtr("cnt");
-
- Label L_Loop = cc.newLabel(); // Create base labels we use
- Label L_Exit = cc.newLabel(); // in our function.
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, uint32_t*, const uint32_t*, size_t>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src);
- funcNode->setArg(2, cnt);
-
- cc.test(cnt, cnt); // Exit if the size is zero.
- cc.jz(L_Exit);
-
- cc.bind(L_Loop); // Bind the loop label here.
-
- x86::Gp tmp = cc.newInt32("tmp"); // Copy a single dword (4 bytes).
- cc.mov(tmp, x86::dword_ptr(src));
- cc.mov(x86::dword_ptr(dst), tmp);
-
- cc.add(src, 4); // Increment dst/src pointers.
- cc.add(dst, 4);
-
- cc.dec(cnt); // Loop until cnt isn't zero.
- cc.jnz(L_Loop);
-
- cc.bind(L_Exit); // Bind the exit label here.
- cc.endFunc(); // End of function.
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(uint32_t*, const uint32_t*, size_t);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t i;
-
- uint32_t dstBuffer[kCount];
- uint32_t srcBuffer[kCount];
-
- for (i = 0; i < kCount; i++) {
- dstBuffer[i] = 0;
- srcBuffer[i] = i;
- }
-
- func(dstBuffer, srcBuffer, kCount);
-
- result.assign("buf={");
- expect.assign("buf={");
-
- for (i = 0; i < kCount; i++) {
- if (i != 0) {
- result.append(", ");
- expect.append(", ");
- }
-
- result.appendFormat("%u", unsigned(dstBuffer[i]));
- expect.appendFormat("%u", unsigned(srcBuffer[i]));
- }
-
- result.append("}");
- expect.append("}");
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocExtraBlock
-// =======================================
-
-class X86Test_AllocExtraBlock : public X86TestCase {
-public:
- X86Test_AllocExtraBlock() : X86TestCase("AllocExtraBlock") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocExtraBlock());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp cond = cc.newInt32("cond");
- x86::Gp ret = cc.newInt32("ret");
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
- funcNode->setArg(0, cond);
- funcNode->setArg(1, a);
- funcNode->setArg(2, b);
-
- Label L_Ret = cc.newLabel();
- Label L_Extra = cc.newLabel();
-
- cc.test(cond, cond);
- cc.jnz(L_Extra);
-
- cc.mov(ret, a);
- cc.add(ret, b);
-
- cc.bind(L_Ret);
- cc.ret(ret);
-
- // Emit code sequence at the end of the function.
- BaseNode* prevCursor = cc.setCursor(funcNode->endNode()->prev());
- cc.bind(L_Extra);
- cc.mov(ret, a);
- cc.sub(ret, b);
- cc.jmp(L_Ret);
- cc.setCursor(prevCursor);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int ret1 = func(0, 4, 5);
- int ret2 = func(1, 4, 5);
-
- int exp1 = 4 + 5;
- int exp2 = 4 - 5;
-
- result.assignFormat("ret={%d, %d}", ret1, ret2);
- expect.assignFormat("ret={%d, %d}", exp1, exp2);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_AllocAlphaBlend
-// =======================================
-
-class X86Test_AllocAlphaBlend : public X86TestCase {
-public:
- X86Test_AllocAlphaBlend() : X86TestCase("AllocAlphaBlend") {}
-
- enum { kCount = 17 };
-
- static void add(TestApp& app) {
- app.add(new X86Test_AllocAlphaBlend());
- }
-
- static uint32_t blendSrcOver(uint32_t d, uint32_t s) {
- uint32_t saInv = ~s >> 24;
-
- uint32_t d_20 = (d ) & 0x00FF00FF;
- uint32_t d_31 = (d >> 8) & 0x00FF00FF;
-
- d_20 *= saInv;
- d_31 *= saInv;
-
- d_20 = ((d_20 + ((d_20 >> 8) & 0x00FF00FFu) + 0x00800080u) & 0xFF00FF00u) >> 8;
- d_31 = ((d_31 + ((d_31 >> 8) & 0x00FF00FFu) + 0x00800080u) & 0xFF00FF00u);
-
- return d_20 + d_31 + s;
- }
-
- virtual void compile(x86::Compiler& cc) {
- asmtest::generateSseAlphaBlend(cc, true);
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void*, const void*, size_t);
- Func func = ptr_as_func<Func>(_func);
-
- static const uint32_t dstConstData[] = { 0x00000000, 0x10101010, 0x20100804, 0x30200003, 0x40204040, 0x5000004D, 0x60302E2C, 0x706F6E6D, 0x807F4F2F, 0x90349001, 0xA0010203, 0xB03204AB, 0xC023AFBD, 0xD0D0D0C0, 0xE0AABBCC, 0xFFFFFFFF, 0xF8F4F2F1 };
- static const uint32_t srcConstData[] = { 0xE0E0E0E0, 0xA0008080, 0x341F1E1A, 0xFEFEFEFE, 0x80302010, 0x49490A0B, 0x998F7798, 0x00000000, 0x01010101, 0xA0264733, 0xBAB0B1B9, 0xFF000000, 0xDAB0A0C1, 0xE0BACFDA, 0x99887766, 0xFFFFFF80, 0xEE0A5FEC };
-
- uint32_t _dstBuffer[kCount + 3];
- uint32_t _srcBuffer[kCount + 3];
-
- // Has to be aligned.
- uint32_t* dstBuffer = (uint32_t*)Support::alignUp<intptr_t>((intptr_t)_dstBuffer, 16);
- uint32_t* srcBuffer = (uint32_t*)Support::alignUp<intptr_t>((intptr_t)_srcBuffer, 16);
-
- memcpy(dstBuffer, dstConstData, sizeof(dstConstData));
- memcpy(srcBuffer, srcConstData, sizeof(srcConstData));
-
- uint32_t i;
- uint32_t expBuffer[kCount];
-
- for (i = 0; i < kCount; i++) {
- expBuffer[i] = blendSrcOver(dstBuffer[i], srcBuffer[i]);
- }
-
- func(dstBuffer, srcBuffer, kCount);
-
- result.assign("buf={");
- expect.assign("buf={");
-
- for (i = 0; i < kCount; i++) {
- if (i != 0) {
- result.append(", ");
- expect.append(", ");
- }
-
- result.appendFormat("%08X", unsigned(dstBuffer[i]));
- expect.appendFormat("%08X", unsigned(expBuffer[i]));
- }
-
- result.append("}");
- expect.append("}");
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncArgInt8
-// ===================================
-
-class X86Test_FuncArgInt8 : public X86TestCase {
-public:
- X86Test_FuncArgInt8() : X86TestCase("FuncArgInt8") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncArgInt8());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v0 = cc.newUInt32("v0");
- x86::Gp v1 = cc.newUInt32("v1");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<unsigned, uint8_t, uint8_t, uint32_t>());
- funcNode->setArg(0, v0);
- funcNode->setArg(1, v1);
-
- cc.add(v0, v1);
-
- cc.ret(v0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef uint32_t (*Func)(uint8_t, uint8_t, uint32_t);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t arg = uint32_t(uintptr_t(_func) & 0xFFFFFFFF);
-
- unsigned resultRet = func(uint8_t(arg & 0xFF), uint8_t(arg & 0xFF), arg);
- unsigned expectRet = (arg & 0xFF) * 2;
-
- result.assignFormat("ret=%u", resultRet);
- expect.assignFormat("ret=%u", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallBase1
-// =====================================
-
-class X86Test_FuncCallBase1 : public X86TestCase {
-public:
- X86Test_FuncCallBase1() : X86TestCase("FuncCallBase1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallBase1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp v0 = cc.newInt32("v0");
- x86::Gp v1 = cc.newInt32("v1");
- x86::Gp v2 = cc.newInt32("v2");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
- funcNode->setArg(0, v0);
- funcNode->setArg(1, v1);
- funcNode->setArg(2, v2);
-
- // Just do something.
- cc.shl(v0, 1);
- cc.shl(v1, 1);
- cc.shl(v2, 1);
-
- // Call a function.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<int, int, int, int>());
- invokeNode->setArg(0, v2);
- invokeNode->setArg(1, v1);
- invokeNode->setArg(2, v0);
- invokeNode->setRet(0, v0);
-
- cc.ret(v0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(3, 2, 1);
- int expectRet = 36;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-
- static int calledFunc(int a, int b, int c) { return (a + b) * c; }
-};
-
-// x86::Compiler - X86Test_FuncCallBase2
-// =====================================
-
-class X86Test_FuncCallBase2 : public X86TestCase {
-public:
- X86Test_FuncCallBase2() : X86TestCase("FuncCallBase2") {}
-
- enum { kSize = 256 };
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallBase2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- const int kTokenSize = 32;
-
- x86::Mem s1 = cc.newStack(kTokenSize, 32);
- x86::Mem s2 = cc.newStack(kTokenSize, 32);
-
- x86::Gp p1 = cc.newIntPtr("p1");
- x86::Gp p2 = cc.newIntPtr("p2");
-
- x86::Gp ret = cc.newInt32("ret");
- Label L_Exit = cc.newLabel();
-
- static const char token[kTokenSize] = "-+:|abcdefghijklmnopqrstuvwxyz|";
- InvokeNode* invokeNode;
-
- cc.lea(p1, s1);
- cc.lea(p2, s2);
-
- // Try to corrupt the stack if wrongly allocated.
- cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignature::build<void*, void*, void*, size_t>());
- invokeNode->setArg(0, p1);
- invokeNode->setArg(1, imm(token));
- invokeNode->setArg(2, imm(kTokenSize));
- invokeNode->setRet(0, p1);
-
- cc.invoke(&invokeNode, imm((void*)memcpy), FuncSignature::build<void*, void*, void*, size_t>());
- invokeNode->setArg(0, p2);
- invokeNode->setArg(1, imm(token));
- invokeNode->setArg(2, imm(kTokenSize));
- invokeNode->setRet(0, p2);
-
- cc.invoke(&invokeNode, imm((void*)memcmp), FuncSignature::build<int, void*, void*, size_t>());
- invokeNode->setArg(0, p1);
- invokeNode->setArg(1, p2);
- invokeNode->setArg(2, imm(kTokenSize));
- invokeNode->setRet(0, ret);
-
- // This should be 0 on success, however, if both `p1` and `p2` were
- // allocated in the same address this check will still pass.
- cc.cmp(ret, 0);
- cc.jnz(L_Exit);
-
- // Checks whether `p1` and `p2` are different (must be).
- cc.xor_(ret, ret);
- cc.cmp(p1, p2);
- cc.setz(ret.r8());
-
- cc.bind(L_Exit);
- cc.ret(ret);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 0; // Must be zero, stack addresses must be different.
-
- result.assignInt(resultRet);
- expect.assignInt(expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallStd
-// ===================================
-
-class X86Test_FuncCallStd : public X86TestCase {
-public:
- X86Test_FuncCallStd() : X86TestCase("FuncCallStd") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallStd());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp x = cc.newInt32("x");
- x86::Gp y = cc.newInt32("y");
- x86::Gp z = cc.newInt32("z");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
- funcNode->setArg(2, z);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<int, int, int, int>(CallConvId::kStdCall));
- invokeNode->setArg(0, x);
- invokeNode->setArg(1, y);
- invokeNode->setArg(2, z);
- invokeNode->setRet(0, x);
-
- cc.ret(x);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(1, 42, 3);
- int expectRet = calledFunc(1, 42, 3);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-
- // STDCALL function that is called inside the generated one.
- static int ASMJIT_STDCALL calledFunc(int a, int b, int c) noexcept {
- return (a + b) * c;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallFast
-// ====================================
-
-class X86Test_FuncCallFast : public X86TestCase {
-public:
- X86Test_FuncCallFast() : X86TestCase("FuncCallFast") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallFast());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp var = cc.newInt32("var");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int>());
- funcNode->setArg(0, var);
-
- InvokeNode* invokeNode;
-
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<int, int>(CallConvId::kFastCall));
- invokeNode->setArg(0, var);
- invokeNode->setRet(0, var);
-
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<int, int>(CallConvId::kFastCall));
- invokeNode->setArg(0, var);
- invokeNode->setRet(0, var);
-
- cc.ret(var);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(9);
- int expectRet = (9 * 9) * (9 * 9);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-
- // FASTCALL function that is called inside the generated one.
- static int ASMJIT_FASTCALL calledFunc(int a) noexcept {
- return a * a;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallSIMD
-// ====================================
-
-#if ASMJIT_ARCH_X86
-class X86Test_FuncCallSIMD : public X86TestCase {
-public:
- bool _useVectorCall;
-
- X86Test_FuncCallSIMD(bool useVectorCall)
- : X86TestCase(),
- _useVectorCall(useVectorCall) {
- _name.assignFormat("FuncCallSIMD {%s}", _useVectorCall ? "__vectorcall" : "__cdecl");
- }
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallSIMD(false));
-#ifdef _MSC_VER
- app.add(new X86Test_FuncCallSIMD(true));
-#endif
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, const void*, const void*>());
-
- x86::Gp resultPtr = cc.newIntPtr("resultPtr");
- x86::Gp aPtr = cc.newIntPtr("aPtr");
- x86::Gp bPtr = cc.newIntPtr("bPtr");
- x86::Gp pFn = cc.newIntPtr("pFn");
-
- x86::Xmm aXmm = cc.newXmm("aXmm");
- x86::Xmm bXmm = cc.newXmm("bXmm");
-
- funcNode->setArg(0, resultPtr);
- funcNode->setArg(1, aPtr);
- funcNode->setArg(2, bPtr);
-
- CallConvId ccId = CallConvId::kCDecl;
- Imm pFnImm = imm((void*)calledFunc_cdecl);
-
-#ifdef _MSC_VER
- if (_useVectorCall) {
- ccId = CallConvId::kVectorCall;
- pFnImm = imm((void*)calledFunc_vcall);
- }
-#endif
-
- cc.mov(pFn, pFnImm);
- cc.movdqu(aXmm, x86::ptr(aPtr));
- cc.movdqu(bXmm, x86::ptr(bPtr));
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, pFn, FuncSignature::build<x86::Xmm, x86::Xmm, x86::Xmm>(ccId));
-
- invokeNode->setArg(0, aXmm);
- invokeNode->setArg(1, bXmm);
- invokeNode->setRet(0, aXmm);
-
- cc.movdqu(x86::ptr(resultPtr), aXmm);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void*, const void*, const void*);
- Func func = ptr_as_func<Func>(_func);
-
- uint8_t aData[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
- uint8_t bData[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
-
- uint8_t rData[16] {};
- uint8_t eData[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
-
- func(rData, aData, bData);
-
- result.appendHex(rData, 16);
- expect.appendHex(eData, 16);
-
- return result == expect;
- }
-
- static __m128i calledFunc_cdecl(__m128i a, __m128i b) {
- return _mm_add_epi8(a, b);
- }
-
-#ifdef _MSC_VER
- static __m128i __vectorcall calledFunc_vcall(__m128i a, __m128i b) {
- return _mm_add_epi8(a, b);
- }
-#endif
-};
-#endif // ASMJIT_ARCH_X86
-
-// x86::Compiler - X86Test_FuncCallLight
-// =====================================
-
-class X86Test_FuncCallLight : public X86TestCase {
-public:
- X86Test_FuncCallLight() : X86TestCase("FuncCallLight") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallLight());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncSignature f1Sig = FuncSignature::build<void, const void*, const void*, const void*, const void*, void*>();
- FuncSignature f2Sig = FuncSignature::build<x86::Xmm, x86::Xmm, x86::Xmm>(CallConvId::kLightCall2);
-
- FuncNode* f1Node = cc.newFunc(f1Sig);
- FuncNode* f2Node = cc.newFunc(f2Sig);
-
- {
- x86::Gp aPtr = cc.newIntPtr("aPtr");
- x86::Gp bPtr = cc.newIntPtr("bPtr");
- x86::Gp cPtr = cc.newIntPtr("cPtr");
- x86::Gp dPtr = cc.newIntPtr("dPtr");
- x86::Gp pOut = cc.newIntPtr("pOut");
-
- x86::Xmm aXmm = cc.newXmm("aXmm");
- x86::Xmm bXmm = cc.newXmm("bXmm");
- x86::Xmm cXmm = cc.newXmm("cXmm");
- x86::Xmm dXmm = cc.newXmm("dXmm");
-
- cc.addFunc(f1Node);
- f1Node->setArg(0, aPtr);
- f1Node->setArg(1, bPtr);
- f1Node->setArg(2, cPtr);
- f1Node->setArg(3, dPtr);
- f1Node->setArg(4, pOut);
-
- cc.movups(aXmm, x86::ptr(aPtr));
- cc.movups(bXmm, x86::ptr(bPtr));
- cc.movups(cXmm, x86::ptr(cPtr));
- cc.movups(dXmm, x86::ptr(dPtr));
-
- x86::Xmm xXmm = cc.newXmm("xXmm");
- x86::Xmm yXmm = cc.newXmm("yXmm");
-
- InvokeNode* invokeNode;
-
- cc.invoke(&invokeNode, f2Node->label(), f2Sig);
- invokeNode->setArg(0, aXmm);
- invokeNode->setArg(1, bXmm);
- invokeNode->setRet(0, xXmm);
-
- cc.invoke(&invokeNode, f2Node->label(), f2Sig);
- invokeNode->setArg(0, cXmm);
- invokeNode->setArg(1, dXmm);
- invokeNode->setRet(0, yXmm);
-
- cc.pmullw(xXmm, yXmm);
- cc.movups(x86::ptr(pOut), xXmm);
-
- cc.endFunc();
- }
-
- {
- x86::Xmm aXmm = cc.newXmm("aXmm");
- x86::Xmm bXmm = cc.newXmm("bXmm");
-
- cc.addFunc(f2Node);
- f2Node->setArg(0, aXmm);
- f2Node->setArg(1, bXmm);
- cc.paddw(aXmm, bXmm);
- cc.ret(aXmm);
- cc.endFunc();
- }
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(const void*, const void*, const void*, const void*, void*);
-
- Func func = ptr_as_func<Func>(_func);
-
- int16_t a[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
- int16_t b[8] = { 7, 6, 5, 4, 3, 2, 1, 0 };
- int16_t c[8] = { 1, 3, 9, 7, 5, 4, 2, 1 };
- int16_t d[8] = { 2, 0,-6,-4,-2,-1, 1, 2 };
-
- int16_t o[8] {};
- int oExp = 7 * 3;
-
- func(a, b, c, d, o);
-
- result.assignFormat("ret={%02X %02X %02X %02X %02X %02X %02X %02X}", o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7]);
- expect.assignFormat("ret={%02X %02X %02X %02X %02X %02X %02X %02X}", oExp, oExp, oExp, oExp, oExp, oExp, oExp, oExp);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallManyArgs
-// ========================================
-
-class X86Test_FuncCallManyArgs : public X86TestCase {
-public:
- X86Test_FuncCallManyArgs() : X86TestCase("FuncCallManyArgs") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallManyArgs());
- }
-
- static int calledFunc(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {
- return (a * b * c * d * e) + (f * g * h * i * j);
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- // Prepare.
- x86::Gp va = cc.newInt32("va");
- x86::Gp vb = cc.newInt32("vb");
- x86::Gp vc = cc.newInt32("vc");
- x86::Gp vd = cc.newInt32("vd");
- x86::Gp ve = cc.newInt32("ve");
- x86::Gp vf = cc.newInt32("vf");
- x86::Gp vg = cc.newInt32("vg");
- x86::Gp vh = cc.newInt32("vh");
- x86::Gp vi = cc.newInt32("vi");
- x86::Gp vj = cc.newInt32("vj");
-
- cc.mov(va, 0x03);
- cc.mov(vb, 0x12);
- cc.mov(vc, 0xA0);
- cc.mov(vd, 0x0B);
- cc.mov(ve, 0x2F);
- cc.mov(vf, 0x02);
- cc.mov(vg, 0x0C);
- cc.mov(vh, 0x12);
- cc.mov(vi, 0x18);
- cc.mov(vj, 0x1E);
-
- // Function call.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
- invokeNode->setArg(0, va);
- invokeNode->setArg(1, vb);
- invokeNode->setArg(2, vc);
- invokeNode->setArg(3, vd);
- invokeNode->setArg(4, ve);
- invokeNode->setArg(5, vf);
- invokeNode->setArg(6, vg);
- invokeNode->setArg(7, vh);
- invokeNode->setArg(8, vi);
- invokeNode->setArg(9, vj);
- invokeNode->setRet(0, va);
-
- cc.ret(va);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = calledFunc(0x03, 0x12, 0xA0, 0x0B, 0x2F, 0x02, 0x0C, 0x12, 0x18, 0x1E);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallDuplicateArgs
-// =============================================
-
-class X86Test_FuncCallDuplicateArgs : public X86TestCase {
-public:
- X86Test_FuncCallDuplicateArgs() : X86TestCase("FuncCallDuplicateArgs") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallDuplicateArgs());
- }
-
- static int calledFunc(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {
- return (a * b * c * d * e) + (f * g * h * i * j);
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- // Prepare.
- x86::Gp a = cc.newInt32("a");
- cc.mov(a, 3);
-
- // Call function.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
- invokeNode->setArg(0, a);
- invokeNode->setArg(1, a);
- invokeNode->setArg(2, a);
- invokeNode->setArg(3, a);
- invokeNode->setArg(4, a);
- invokeNode->setArg(5, a);
- invokeNode->setArg(6, a);
- invokeNode->setArg(7, a);
- invokeNode->setArg(8, a);
- invokeNode->setArg(9, a);
- invokeNode->setRet(0, a);
-
- cc.ret(a);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = calledFunc(3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallImmArgs
-// =======================================
-
-class X86Test_FuncCallImmArgs : public X86TestCase {
-public:
- X86Test_FuncCallImmArgs() : X86TestCase("FuncCallImmArgs") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallImmArgs());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- // Prepare.
- x86::Gp rv = cc.newInt32("rv");
-
- // Call function.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)X86Test_FuncCallManyArgs::calledFunc),
- FuncSignature::build<int, int, int, int, int, int, int, int, int, int, int>());
-
- invokeNode->setArg(0, imm(0x03));
- invokeNode->setArg(1, imm(0x12));
- invokeNode->setArg(2, imm(0xA0));
- invokeNode->setArg(3, imm(0x0B));
- invokeNode->setArg(4, imm(0x2F));
- invokeNode->setArg(5, imm(0x02));
- invokeNode->setArg(6, imm(0x0C));
- invokeNode->setArg(7, imm(0x12));
- invokeNode->setArg(8, imm(0x18));
- invokeNode->setArg(9, imm(0x1E));
- invokeNode->setRet(0, rv);
-
- cc.ret(rv);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = X86Test_FuncCallManyArgs::calledFunc(0x03, 0x12, 0xA0, 0x0B, 0x2F, 0x02, 0x0C, 0x12, 0x18, 0x1E);
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallPtrArgs
-// =======================================
-
-class X86Test_FuncCallPtrArgs : public X86TestCase {
-public:
- X86Test_FuncCallPtrArgs() : X86TestCase("FuncCallPtrArgs") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallPtrArgs());
- }
-
- static int calledFunc(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j) {
- return int((intptr_t)a) +
- int((intptr_t)b) +
- int((intptr_t)c) +
- int((intptr_t)d) +
- int((intptr_t)e) +
- int((intptr_t)f) +
- int((intptr_t)g) +
- int((intptr_t)h) +
- int((intptr_t)i) +
- int((intptr_t)j) ;
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- // Prepare.
- x86::Gp rv = cc.newInt32("rv");
-
- // Call function.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<int, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*>());
-
- invokeNode->setArg(0, imm(0x01));
- invokeNode->setArg(1, imm(0x02));
- invokeNode->setArg(2, imm(0x03));
- invokeNode->setArg(3, imm(0x04));
- invokeNode->setArg(4, imm(0x05));
- invokeNode->setArg(5, imm(0x06));
- invokeNode->setArg(6, imm(0x07));
- invokeNode->setArg(7, imm(0x08));
- invokeNode->setArg(8, imm(0x09));
- invokeNode->setArg(9, imm(0x0A));
- invokeNode->setRet(0, rv);
-
- cc.ret(rv);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 55;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallRefArgs
-// =======================================
-
-class X86Test_FuncCallRefArgs : public X86TestCase {
-public:
- X86Test_FuncCallRefArgs() : X86TestCase("FuncCallRefArgs") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallRefArgs());
- }
-
- static int calledFunc(int& a, int& b, int& c, int& d) {
- a += a;
- b += b;
- c += c;
- d += d;
- return a + b + c + d;
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int&, int&, int&, int&>());
-
- // Prepare.
- x86::Gp arg1 = cc.newInt32();
- x86::Gp arg2 = cc.newInt32();
- x86::Gp arg3 = cc.newInt32();
- x86::Gp arg4 = cc.newInt32();
- x86::Gp rv = cc.newInt32("rv");
-
- funcNode->setArg(0, arg1);
- funcNode->setArg(1, arg2);
- funcNode->setArg(2, arg3);
- funcNode->setArg(3, arg4);
-
- // Call function.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<int, int&, int&, int&, int&>());
-
- invokeNode->setArg(0, arg1);
- invokeNode->setArg(1, arg2);
- invokeNode->setArg(2, arg3);
- invokeNode->setArg(3, arg4);
- invokeNode->setRet(0, rv);
-
- cc.ret(rv);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int&, int&, int&, int&);
- Func func = ptr_as_func<Func>(_func);
-
- int inputs[4] = { 1, 2, 3, 4 };
- int outputs[4] = { 2, 4, 6, 8 };
- int resultRet = func(inputs[0], inputs[1], inputs[2], inputs[3]);
- int expectRet = 20;
-
- result.assignFormat("ret={%08X %08X %08X %08X %08X}", resultRet, inputs[0], inputs[1], inputs[2], inputs[3]);
- expect.assignFormat("ret={%08X %08X %08X %08X %08X}", expectRet, outputs[0], outputs[1], outputs[2], outputs[3]);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallFloatAsXmmRet
-// =============================================
-
-class X86Test_FuncCallFloatAsXmmRet : public X86TestCase {
-public:
- X86Test_FuncCallFloatAsXmmRet() : X86TestCase("FuncCallFloatAsXmmRet") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallFloatAsXmmRet());
- }
-
- static float calledFunc(float a, float b) {
- return a * b;
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<float, float, float>());
-
- x86::Xmm a = cc.newXmmSs("a");
- x86::Xmm b = cc.newXmmSs("b");
- x86::Xmm ret = cc.newXmmSs("ret");
-
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
-
- // Call function.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<float, float, float>());
- invokeNode->setArg(0, a);
- invokeNode->setArg(1, b);
- invokeNode->setRet(0, ret);
-
- cc.ret(ret);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef float (*Func)(float, float);
- Func func = ptr_as_func<Func>(_func);
-
- float resultRet = func(15.5f, 2.0f);
- float expectRet = calledFunc(15.5f, 2.0f);
-
- result.assignFormat("ret=%g", resultRet);
- expect.assignFormat("ret=%g", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallDoubleAsXmmRet
-// ==============================================
-
-class X86Test_FuncCallDoubleAsXmmRet : public X86TestCase {
-public:
- X86Test_FuncCallDoubleAsXmmRet() : X86TestCase("FuncCallDoubleAsXmmRet") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallDoubleAsXmmRet());
- }
-
- static double calledFunc(double a, double b) {
- return a * b;
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double>());
-
- x86::Xmm a = cc.newXmmSd("a");
- x86::Xmm b = cc.newXmmSd("b");
- x86::Xmm ret = cc.newXmmSd("ret");
-
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<double, double, double>());
- invokeNode->setArg(0, a);
- invokeNode->setArg(1, b);
- invokeNode->setRet(0, ret);
-
- cc.ret(ret);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(double, double);
- Func func = ptr_as_func<Func>(_func);
-
- double resultRet = func(15.5, 2.0);
- double expectRet = calledFunc(15.5, 2.0);
-
- result.assignFormat("ret=%g", resultRet);
- expect.assignFormat("ret=%g", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallConditional
-// ===========================================
-
-class X86Test_FuncCallConditional : public X86TestCase {
-public:
- X86Test_FuncCallConditional() : X86TestCase("FuncCallConditional") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallConditional());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp x = cc.newInt32("x");
- x86::Gp y = cc.newInt32("y");
- x86::Gp op = cc.newInt32("op");
-
- InvokeNode* invokeNode;
- x86::Gp result;
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
- funcNode->setArg(0, x);
- funcNode->setArg(1, y);
- funcNode->setArg(2, op);
-
- Label opAdd = cc.newLabel();
- Label opMul = cc.newLabel();
-
- cc.cmp(op, 0);
- cc.jz(opAdd);
- cc.cmp(op, 1);
- cc.jz(opMul);
-
- result = cc.newInt32("result_0");
- cc.mov(result, 0);
- cc.ret(result);
-
- cc.bind(opAdd);
- result = cc.newInt32("result_1");
-
- cc.invoke(&invokeNode, (uint64_t)calledFuncAdd, FuncSignature::build<int, int, int>());
- invokeNode->setArg(0, x);
- invokeNode->setArg(1, y);
- invokeNode->setRet(0, result);
- cc.ret(result);
-
- cc.bind(opMul);
- result = cc.newInt32("result_2");
-
- cc.invoke(&invokeNode, (uint64_t)calledFuncMul, FuncSignature::build<int, int, int>());
- invokeNode->setArg(0, x);
- invokeNode->setArg(1, y);
- invokeNode->setRet(0, result);
-
- cc.ret(result);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int arg1 = 4;
- int arg2 = 8;
-
- int resultAdd = func(arg1, arg2, 0);
- int expectAdd = calledFuncAdd(arg1, arg2);
-
- int resultMul = func(arg1, arg2, 1);
- int expectMul = calledFuncMul(arg1, arg2);
-
- result.assignFormat("ret={add=%d, mul=%d}", resultAdd, resultMul);
- expect.assignFormat("ret={add=%d, mul=%d}", expectAdd, expectMul);
-
- return (resultAdd == expectAdd) && (resultMul == expectMul);
- }
-
- static int calledFuncAdd(int x, int y) { return x + y; }
- static int calledFuncMul(int x, int y) { return x * y; }
-};
-
-// x86::Compiler - X86Test_FuncCallMultiple
-// ========================================
-
-class X86Test_FuncCallMultiple : public X86TestCase {
-public:
- X86Test_FuncCallMultiple() : X86TestCase("FuncCallMultiple") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMultiple());
- }
-
- static int ASMJIT_FASTCALL calledFunc(int* pInt, int index) {
- return pInt[index];
- }
-
- virtual void compile(x86::Compiler& cc) {
- unsigned int i;
-
- x86::Gp buf = cc.newIntPtr("buf");
- x86::Gp acc0 = cc.newInt32("acc0");
- x86::Gp acc1 = cc.newInt32("acc1");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int*>());
- funcNode->setArg(0, buf);
-
- cc.mov(acc0, 0);
- cc.mov(acc1, 0);
-
- for (i = 0; i < 4; i++) {
- x86::Gp ret = cc.newInt32("ret");
- x86::Gp ptr = cc.newIntPtr("ptr");
- x86::Gp idx = cc.newInt32("idx");
- InvokeNode* invokeNode;
-
- cc.mov(ptr, buf);
- cc.mov(idx, int(i));
-
- cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignature::build<int, int*, int>(CallConvId::kFastCall));
- invokeNode->setArg(0, ptr);
- invokeNode->setArg(1, idx);
- invokeNode->setRet(0, ret);
-
- cc.add(acc0, ret);
-
- cc.mov(ptr, buf);
- cc.mov(idx, int(i));
-
- cc.invoke(&invokeNode, (uint64_t)calledFunc, FuncSignature::build<int, int*, int>(CallConvId::kFastCall));
- invokeNode->setArg(0, ptr);
- invokeNode->setArg(1, idx);
- invokeNode->setRet(0, ret);
-
- cc.sub(acc1, ret);
- }
-
- cc.add(acc0, acc1);
- cc.ret(acc0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int*);
- Func func = ptr_as_func<Func>(_func);
-
- int buffer[4] = { 127, 87, 23, 17 };
-
- int resultRet = func(buffer);
- int expectRet = 0;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallRecursive
-// =========================================
-
-class X86Test_FuncCallRecursive : public X86TestCase {
-public:
- X86Test_FuncCallRecursive() : X86TestCase("FuncCallRecursive") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallRecursive());
- }
-
- virtual void compile(x86::Compiler& cc) {
- x86::Gp val = cc.newInt32("val");
- Label skip = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int>());
- funcNode->setArg(0, val);
-
- cc.cmp(val, 1);
- cc.jle(skip);
-
- x86::Gp tmp = cc.newInt32("tmp");
- cc.mov(tmp, val);
- cc.dec(tmp);
-
- InvokeNode* invokeNode;
-
- cc.invoke(&invokeNode, funcNode->label(), FuncSignature::build<int, int>());
- invokeNode->setArg(0, tmp);
- invokeNode->setRet(0, tmp);
- cc.mul(cc.newInt32(), val, tmp);
-
- cc.bind(skip);
- cc.ret(val);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(5);
- int expectRet = 1 * 2 * 3 * 4 * 5;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallVarArg1
-// =======================================
-
-class X86Test_FuncCallVarArg1 : public X86TestCase {
-public:
- X86Test_FuncCallVarArg1() : X86TestCase("FuncCallVarArg1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallVarArg1());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int, int>());
-
- x86::Gp a0 = cc.newInt32("a0");
- x86::Gp a1 = cc.newInt32("a1");
- x86::Gp a2 = cc.newInt32("a2");
- x86::Gp a3 = cc.newInt32("a3");
-
- funcNode->setArg(0, a0);
- funcNode->setArg(1, a1);
- funcNode->setArg(2, a2);
- funcNode->setArg(3, a3);
-
- // We call `int func(size_t, ...)`
- // - The `vaIndex` must be 1 (first argument after size_t).
- // - The full signature of varargs (int, int, int, int) must follow.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<int, size_t, int, int, int, int>(CallConvId::kCDecl, 1));
- invokeNode->setArg(0, imm(4));
- invokeNode->setArg(1, a0);
- invokeNode->setArg(2, a1);
- invokeNode->setArg(3, a2);
- invokeNode->setArg(4, a3);
- invokeNode->setRet(0, a0);
-
- cc.ret(a0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(1, 2, 3, 4);
- int expectRet = 1 + 2 + 3 + 4;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-
- static int calledFunc(size_t n, ...) {
- int sum = 0;
- va_list ap;
- va_start(ap, n);
- for (size_t i = 0; i < n; i++) {
- int arg = va_arg(ap, int);
- sum += arg;
- }
- va_end(ap);
- return sum;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallVarArg2
-// =======================================
-
-class X86Test_FuncCallVarArg2 : public X86TestCase {
-public:
- X86Test_FuncCallVarArg2() : X86TestCase("FuncCallVarArg2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallVarArg2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, double, double, double, double>());
-
- x86::Xmm a0 = cc.newXmmSd("a0");
- x86::Xmm a1 = cc.newXmmSd("a1");
- x86::Xmm a2 = cc.newXmmSd("a2");
- x86::Xmm a3 = cc.newXmmSd("a3");
-
- funcNode->setArg(0, a0);
- funcNode->setArg(1, a1);
- funcNode->setArg(2, a2);
- funcNode->setArg(3, a3);
-
- // We call `double func(size_t, ...)`
- // - The `vaIndex` must be 1 (first argument after size_t).
- // - The full signature of varargs (double, double, double, double) must follow.
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)calledFunc),
- FuncSignature::build<double, size_t, double, double, double, double>(CallConvId::kCDecl, 1));
- invokeNode->setArg(0, imm(4));
- invokeNode->setArg(1, a0);
- invokeNode->setArg(2, a1);
- invokeNode->setArg(3, a2);
- invokeNode->setArg(4, a3);
- invokeNode->setRet(0, a0);
-
- cc.ret(a0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(double, double, double, double);
- Func func = ptr_as_func<Func>(_func);
-
- double resultRet = func(1.0, 2.0, 3.0, 4.0);
- double expectRet = 1.0 + 2.0 + 3.0 + 4.0;
-
- result.assignFormat("ret=%f", resultRet);
- expect.assignFormat("ret=%f", expectRet);
-
- return result == expect;
- }
-
- static double calledFunc(size_t n, ...) {
- double sum = 0;
- va_list ap;
- va_start(ap, n);
- for (size_t i = 0; i < n; i++) {
- double arg = va_arg(ap, double);
- sum += arg;
- }
- va_end(ap);
- return sum;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallInt64Arg
-// ========================================
-
-class X86Test_FuncCallInt64Arg : public X86TestCase {
-public:
- X86Test_FuncCallInt64Arg() : X86TestCase("FuncCallInt64Arg") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallInt64Arg());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint64_t, uint64_t>());
-
- if (cc.is64Bit()) {
- x86::Gp reg = cc.newUInt64();
- funcNode->setArg(0, reg);
- cc.add(reg, 1);
- cc.ret(reg);
- }
- else {
- x86::Gp hi = cc.newUInt32("hi");
- x86::Gp lo = cc.newUInt32("lo");
-
- funcNode->setArg(0, 0, lo);
- funcNode->setArg(0, 1, hi);
-
- cc.add(lo, 1);
- cc.adc(hi, 0);
- cc.ret(lo, hi);
- }
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef uint64_t (*Func)(uint64_t);
- Func func = ptr_as_func<Func>(_func);
-
- uint64_t resultRet = func(uint64_t(0xFFFFFFFF));
- uint64_t expectRet = 0x100000000;
-
- result.assignFormat("ret=%llu", (unsigned long long)resultRet);
- expect.assignFormat("ret=%llu", (unsigned long long)expectRet);
-
- return result == expect;
- }
-
- static double calledFunc(size_t n, ...) {
- double sum = 0;
- va_list ap;
- va_start(ap, n);
- for (size_t i = 0; i < n; i++) {
- double arg = va_arg(ap, double);
- sum += arg;
- }
- va_end(ap);
- return sum;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallMisc1
-// =====================================
-
-class X86Test_FuncCallMisc1 : public X86TestCase {
-public:
- X86Test_FuncCallMisc1() : X86TestCase("FuncCallMisc1") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMisc1());
- }
-
- static void dummy(int, int) {}
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int>());
-
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
- x86::Gp r = cc.newInt32("r");
-
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)dummy),
- FuncSignature::build<void, int, int>());
- invokeNode->setArg(0, a);
- invokeNode->setArg(1, b);
-
- cc.lea(r, x86::ptr(a, b));
- cc.ret(r);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(44, 199);
- int expectRet = 243;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_FuncCallMisc2
-// =====================================
-
-class X86Test_FuncCallMisc2 : public X86TestCase {
-public:
- X86Test_FuncCallMisc2() : X86TestCase("FuncCallMisc2") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMisc2());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, const double*>());
-
- x86::Gp p = cc.newIntPtr("p");
- x86::Xmm arg = cc.newXmmSd("arg");
- x86::Xmm ret = cc.newXmmSd("ret");
-
- funcNode->setArg(0, p);
- cc.movsd(arg, x86::ptr(p));
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)op),
- FuncSignature::build<double, double>());
- invokeNode->setArg(0, arg);
- invokeNode->setRet(0, ret);
-
- cc.ret(ret);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(const double*);
- Func func = ptr_as_func<Func>(_func);
-
- double arg = 2;
-
- double resultRet = func(&arg);
- double expectRet = op(arg);
-
- result.assignFormat("ret=%g", resultRet);
- expect.assignFormat("ret=%g", expectRet);
-
- return result == expect;
- }
-
- static double op(double a) { return a * a; }
-};
-
-// x86::Compiler - X86Test_FuncCallMisc3
-// =====================================
-
-class X86Test_FuncCallMisc3 : public X86TestCase {
-public:
- X86Test_FuncCallMisc3() : X86TestCase("FuncCallMisc3") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMisc3());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<double, const double*>());
-
- x86::Gp p = cc.newIntPtr("p");
- x86::Xmm arg = cc.newXmmSd("arg");
- x86::Xmm ret = cc.newXmmSd("ret");
-
- funcNode->setArg(0, p);
- cc.movsd(arg, x86::ptr(p));
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- imm((void*)op),
- FuncSignature::build<double, double>());
- invokeNode->setArg(0, arg);
- invokeNode->setRet(0, ret);
-
- cc.xorps(arg, arg);
- cc.subsd(arg, ret);
-
- cc.ret(arg);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(const double*);
- Func func = ptr_as_func<Func>(_func);
-
- double arg = 2;
-
- double resultRet = func(&arg);
- double expectRet = -op(arg);
-
- result.assignFormat("ret=%g", resultRet);
- expect.assignFormat("ret=%g", expectRet);
-
- return result == expect;
- }
-
- static double op(double a) { return a * a; }
-};
-
-// x86::Compiler - X86Test_FuncCallMisc4
-// =====================================
-
-class X86Test_FuncCallMisc4 : public X86TestCase {
-public:
- X86Test_FuncCallMisc4() : X86TestCase("FuncCallMisc4") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMisc4());
- }
-
- virtual void compile(x86::Compiler& cc) {
- InvokeNode* invokeNode;
-
- FuncSignature funcSignature;
- funcSignature.setCallConvId(CallConvId::kCDecl);
- funcSignature.setRet(TypeId::kFloat64);
- cc.addFunc(funcSignature);
-
- FuncSignature invokeSignature;
- invokeSignature.setCallConvId(CallConvId::kCDecl);
- invokeSignature.setRet(TypeId::kFloat64);
-
- cc.invoke(&invokeNode, imm((void*)calledFunc), invokeSignature);
- x86::Xmm ret = cc.newXmmSd("ret");
- invokeNode->setRet(0, ret);
- cc.ret(ret);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef double (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- double resultRet = func();
- double expectRet = 3.14;
-
- result.assignFormat("ret=%g", resultRet);
- expect.assignFormat("ret=%g", expectRet);
-
- return result == expect;
- }
-
- static double calledFunc() { return 3.14; }
-};
-
-// x86::Compiler - X86Test_FuncCallMisc5
-// =====================================
-
-// The register allocator should clobber the register used by the `call` itself.
-class X86Test_FuncCallMisc5 : public X86TestCase {
-public:
- X86Test_FuncCallMisc5() : X86TestCase("FuncCallMisc5") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMisc5());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- x86::Gp pFn = cc.newIntPtr("pFn");
- x86::Gp vars[16];
-
- uint32_t i, regCount = cc.arch() == Arch::kX86 ? 8 : 16;
- ASMJIT_ASSERT(regCount <= ASMJIT_ARRAY_SIZE(vars));
-
- cc.mov(pFn, imm((void*)calledFunc));
-
- for (i = 0; i < regCount; i++) {
- if (i == x86::Gp::kIdBp || i == x86::Gp::kIdSp)
- continue;
-
- vars[i] = cc.newInt32("%%%u", unsigned(i));
- cc.mov(vars[i], 1);
- }
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, pFn, FuncSignature::build<void>());
-
- for (i = 1; i < regCount; i++)
- if (vars[i].isValid())
- cc.add(vars[0], vars[i]);
- cc.ret(vars[0]);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = sizeof(void*) == 4 ? 6 : 14;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-
- static void calledFunc() {}
-};
-
-// x86::Compiler - X86Test_FuncCallMisc6
-// =====================================
-
-class X86Test_FuncCallMisc6 : public X86TestCase {
-public:
- X86Test_FuncCallMisc6() : X86TestCase("FuncCallMisc6") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_FuncCallMisc6());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<uint32_t, uint32_t>());
-
- constexpr uint32_t kCount = 16;
-
- x86::Gp v[kCount];
- x86::Gp argVal = cc.newUInt32("argVal");
- x86::Gp retVal = cc.newUInt32("retVal");
- uint32_t i;
-
- funcNode->setArg(0, argVal);
- cc.add(argVal, 1);
-
- for (i = 0; i < kCount; i++)
- v[i] = cc.newUInt32("v%u", i);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, imm((void*)calledFunc), FuncSignature::build<uint32_t, uint32_t>());
- invokeNode->setArg(0, argVal);
- invokeNode->setRet(0, retVal);
-
- for (i = 0; i < kCount; i++)
- cc.mov(v[i], i + 1);
-
- for (i = 0; i < kCount; i++)
- cc.add(argVal, v[i]);
-
- cc.add(retVal, argVal);
- cc.ret(retVal);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef uint32_t (*Func)(uint32_t x);
- Func func = ptr_as_func<Func>(_func);
-
- uint32_t resultRet = func(111);
- uint32_t expectRet = 111 + 112 + 2 + (1 + 16) * 8;
-
- result.assignFormat("ret=%u", resultRet);
- expect.assignFormat("ret=%u", expectRet);
-
- return result == expect;
- }
-
- static uint32_t calledFunc(uint32_t x) { return x + 1; }
-};
-
-// x86::Compiler - X86Test_FuncCallAVXClobber
-// ==========================================
-
-class X86Test_FuncCallAVXClobber : public X86TestCase {
-public:
- X86Test_FuncCallAVXClobber() : X86TestCase("FuncCallAVXClobber") {}
-
- static void add(TestApp& app) {
- const CpuInfo& cpuInfo = CpuInfo::host();
-
- if (cpuInfo.features().x86().hasAVX2() && sizeof(void*) == 8)
- app.add(new X86Test_FuncCallAVXClobber());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* mainFunc = cc.addFunc(FuncSignature::build<void, void*, const void*, const void*>());
- mainFunc->frame().setAvxEnabled();
- mainFunc->frame().setAvxCleanup();
-
- // We need a Windows calling convention to test this properly also on a non-Windows machine.
- FuncNode* helperFunc = cc.newFunc(FuncSignature::build<void, void*, const void*>(CallConvId::kX64Windows));
- helperFunc->frame().setAvxEnabled();
- helperFunc->frame().setAvxCleanup();
-
- {
- size_t i;
-
- x86::Gp dPtr = cc.newIntPtr("dPtr");
- x86::Gp aPtr = cc.newIntPtr("aPtr");
- x86::Gp bPtr = cc.newIntPtr("bPtr");
- x86::Gp tPtr = cc.newIntPtr("tPtr");
- x86::Ymm acc[8];
- x86::Mem stack = cc.newStack(32, 1, "stack");
-
- mainFunc->setArg(0, dPtr);
- mainFunc->setArg(1, aPtr);
- mainFunc->setArg(2, bPtr);
-
- cc.lea(tPtr, stack);
- for (i = 0; i < 8; i++) {
- acc[i] = cc.newYmm("acc%zu", i);
- cc.vmovdqu(acc[i], x86::ptr(aPtr));
- }
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode,
- helperFunc->label(),
- FuncSignature::build<void, void*, const void*>(CallConvId::kX64Windows));
- invokeNode->setArg(0, tPtr);
- invokeNode->setArg(1, bPtr);
-
- for (i = 1; i < 8; i++) {
- cc.vpaddd(acc[0], acc[0], acc[i]);
- }
-
- cc.vpaddd(acc[0], acc[0], x86::ptr(tPtr));
- cc.vmovdqu(x86::ptr(dPtr), acc[0]);
-
- cc.endFunc();
- }
-
- {
- cc.addFunc(helperFunc);
-
- x86::Gp dPtr = cc.newIntPtr("dPtr");
- x86::Gp aPtr = cc.newIntPtr("aPtr");
-
- helperFunc->setArg(0, dPtr);
- helperFunc->setArg(1, aPtr);
-
- x86::Gp tmp = cc.newIntPtr("tmp");
- x86::Ymm acc = cc.newYmm("acc");
-
- cc.mov(tmp, 1);
- cc.vmovd(acc.xmm(), tmp);
- cc.vpbroadcastd(acc, acc.xmm());
- cc.vpaddd(acc, acc, x86::ptr(aPtr));
- cc.vmovdqu(x86::ptr(dPtr), acc);
-
- cc.endFunc();
- }
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef void (*Func)(void*, const void*, const void*);
- Func func = ptr_as_func<Func>(_func);
-
- size_t i;
-
- static const uint32_t aData[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
- static const uint32_t bData[8] = { 6, 3, 5, 9, 1, 8, 7, 2 };
-
- uint32_t resultData[8] {};
- uint32_t expectData[8] {};
-
- for (i = 0; i < 8; i++)
- expectData[i] = aData[i] * 8 + bData[i] + 1;
-
- func(resultData, aData, bData);
-
- result.assign("{");
- expect.assign("{");
-
- for (i = 0; i < 8; i++) {
- result.appendFormat("%u", resultData[i]);
- expect.appendFormat("%u", expectData[i]);
-
- if (i != 7) result.append(", ");
- if (i != 7) expect.append(", ");
- }
-
- result.append("}");
- expect.append("}");
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_MiscLocalConstPool
-// ==========================================
-
-class X86Test_MiscLocalConstPool : public X86TestCase {
-public:
- X86Test_MiscLocalConstPool() : X86TestCase("MiscLocalConstPool") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_MiscLocalConstPool());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- x86::Gp v0 = cc.newInt32("v0");
- x86::Gp v1 = cc.newInt32("v1");
-
- x86::Mem c0 = cc.newInt32Const(ConstPoolScope::kLocal, 200);
- x86::Mem c1 = cc.newInt32Const(ConstPoolScope::kLocal, 33);
-
- cc.mov(v0, c0);
- cc.mov(v1, c1);
- cc.add(v0, v1);
-
- cc.ret(v0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 233;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_MiscGlobalConstPool
-// ===========================================
-
-class X86Test_MiscGlobalConstPool : public X86TestCase {
-public:
- X86Test_MiscGlobalConstPool() : X86TestCase("MiscGlobalConstPool") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_MiscGlobalConstPool());
- }
-
- virtual void compile(x86::Compiler& cc) {
- cc.addFunc(FuncSignature::build<int>());
-
- x86::Gp v0 = cc.newInt32("v0");
- x86::Gp v1 = cc.newInt32("v1");
-
- x86::Mem c0 = cc.newInt32Const(ConstPoolScope::kGlobal, 200);
- x86::Mem c1 = cc.newInt32Const(ConstPoolScope::kGlobal, 33);
-
- cc.mov(v0, c0);
- cc.mov(v1, c1);
- cc.add(v0, v1);
-
- cc.ret(v0);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(void);
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func();
- int expectRet = 233;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_MiscMultiRet
-// ====================================
-
-struct X86Test_MiscMultiRet : public X86TestCase {
- X86Test_MiscMultiRet() : X86TestCase("MiscMultiRet") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_MiscMultiRet());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, int, int>());
-
- x86::Gp op = cc.newInt32("op");
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
-
- Label L_Zero = cc.newLabel();
- Label L_Add = cc.newLabel();
- Label L_Sub = cc.newLabel();
- Label L_Mul = cc.newLabel();
- Label L_Div = cc.newLabel();
-
- funcNode->setArg(0, op);
- funcNode->setArg(1, a);
- funcNode->setArg(2, b);
-
- cc.cmp(op, 0);
- cc.jz(L_Add);
-
- cc.cmp(op, 1);
- cc.jz(L_Sub);
-
- cc.cmp(op, 2);
- cc.jz(L_Mul);
-
- cc.cmp(op, 3);
- cc.jz(L_Div);
-
- cc.bind(L_Zero);
- cc.xor_(a, a);
- cc.ret(a);
-
- cc.bind(L_Add);
- cc.add(a, b);
- cc.ret(a);
-
- cc.bind(L_Sub);
- cc.sub(a, b);
- cc.ret(a);
-
- cc.bind(L_Mul);
- cc.imul(a, b);
- cc.ret(a);
-
- cc.bind(L_Div);
- cc.cmp(b, 0);
- cc.jz(L_Zero);
-
- x86::Gp zero = cc.newInt32("zero");
- cc.xor_(zero, zero);
- cc.idiv(zero, a, b);
- cc.ret(a);
-
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int, int);
-
- Func func = ptr_as_func<Func>(_func);
-
- int a = 44;
- int b = 3;
-
- int r0 = func(0, a, b);
- int r1 = func(1, a, b);
- int r2 = func(2, a, b);
- int r3 = func(3, a, b);
- int e0 = a + b;
- int e1 = a - b;
- int e2 = a * b;
- int e3 = a / b;
-
- result.assignFormat("ret={%d %d %d %d}", r0, r1, r2, r3);
- expect.assignFormat("ret={%d %d %d %d}", e0, e1, e2, e3);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_MiscMultiFunc
-// =====================================
-
-class X86Test_MiscMultiFunc : public X86TestCase {
-public:
- X86Test_MiscMultiFunc() : X86TestCase("MiscMultiFunc") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_MiscMultiFunc());
- }
-
- virtual void compile(x86::Compiler& cc) {
- FuncNode* f1Node = cc.newFunc(FuncSignature::build<int, int, int>());
- FuncNode* f2Node = cc.newFunc(FuncSignature::build<int, int, int>());
-
- {
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
-
- cc.addFunc(f1Node);
- f1Node->setArg(0, a);
- f1Node->setArg(1, b);
-
- InvokeNode* invokeNode;
- cc.invoke(&invokeNode, f2Node->label(), FuncSignature::build<int, int, int>());
- invokeNode->setArg(0, a);
- invokeNode->setArg(1, b);
- invokeNode->setRet(0, a);
-
- cc.ret(a);
- cc.endFunc();
- }
-
- {
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newInt32("b");
-
- cc.addFunc(f2Node);
- f2Node->setArg(0, a);
- f2Node->setArg(1, b);
-
- cc.add(a, b);
- cc.ret(a);
- cc.endFunc();
- }
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (*Func)(int, int);
-
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = func(56, 22);
- int expectRet = 56 + 22;
-
- result.assignFormat("ret=%d", resultRet);
- expect.assignFormat("ret=%d", expectRet);
-
- return result == expect;
- }
-};
-
-// x86::Compiler - X86Test_MiscUnfollow
-// ====================================
-
-// Global (I didn't find a better way to test this).
-static jmp_buf globalJmpBuf;
-
-class X86Test_MiscUnfollow : public X86TestCase {
-public:
- X86Test_MiscUnfollow() : X86TestCase("MiscUnfollow") {}
-
- static void add(TestApp& app) {
- app.add(new X86Test_MiscUnfollow());
- }
-
- virtual void compile(x86::Compiler& cc) {
- // NOTE: Fastcall calling convention is the most appropriate here as all arguments are passed via registers and
- // there won't be any stack misalignment in the `handler()`. This was failing on MacOS when targeting 32-bit mode.
- x86::Gp a = cc.newInt32("a");
- x86::Gp b = cc.newIntPtr("b");
- Label tramp = cc.newLabel();
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<int, int, void*>(CallConvId::kFastCall));
- funcNode->setArg(0, a);
- funcNode->setArg(1, b);
-
- cc.cmp(a, 0);
- cc.jz(tramp);
- cc.ret(a);
- cc.bind(tramp);
- cc.unfollow().jmp(b);
- cc.endFunc();
- }
-
- virtual bool run(void* _func, String& result, String& expect) {
- typedef int (ASMJIT_FASTCALL *Func)(int, void*);
-
- Func func = ptr_as_func<Func>(_func);
-
- int resultRet = 0;
- int expectRet = 1;
-
- if (!setjmp(globalJmpBuf))
- resultRet = func(0, (void*)handler);
- else
- resultRet = 1;
-
- result.assignFormat("ret={%d}", resultRet);
- expect.assignFormat("ret={%d}", expectRet);
-
- return result == expect;
- }
-
- static void ASMJIT_FASTCALL handler() { longjmp(globalJmpBuf, 1); }
-};
-
-// x86::Compiler - Tests
-// =====================
-
-void compiler_add_x86_tests(TestApp& app) {
- // Base tests.
- app.addT<X86Test_NoCode>();
- app.addT<X86Test_NoAlign>();
- app.addT<X86Test_IndirectBranchProtection>();
- app.addT<X86Test_AlignBase>();
-
- // Jump tests.
- app.addT<X86Test_JumpMerge>();
- app.addT<X86Test_JumpCross>();
- app.addT<X86Test_JumpMany>();
- app.addT<X86Test_JumpUnreachable1>();
- app.addT<X86Test_JumpUnreachable2>();
- app.addT<X86Test_JumpTable1>();
- app.addT<X86Test_JumpTable2>();
- app.addT<X86Test_JumpTable3>();
- app.addT<X86Test_JumpTable4>();
-
- // Alloc tests.
- app.addT<X86Test_AllocBase>();
- app.addT<X86Test_AllocMany1>();
- app.addT<X86Test_AllocMany2>();
- app.addT<X86Test_AllocImul1>();
- app.addT<X86Test_AllocImul2>();
- app.addT<X86Test_AllocIdiv1>();
- app.addT<X86Test_AllocSetz>();
- app.addT<X86Test_AllocShlRor>();
- app.addT<X86Test_AllocGpbLo1>();
- app.addT<X86Test_AllocGpbLo2>();
- app.addT<X86Test_AllocRepMovsb>();
- app.addT<X86Test_AllocIfElse1>();
- app.addT<X86Test_AllocIfElse2>();
- app.addT<X86Test_AllocIfElse3>();
- app.addT<X86Test_AllocIfElse4>();
- app.addT<X86Test_AllocInt8>();
- app.addT<X86Test_AllocUnhandledArg>();
- app.addT<X86Test_AllocArgsIntPtr>();
- app.addT<X86Test_AllocArgsFloat>();
- app.addT<X86Test_AllocArgsDouble>();
-#if ASMJIT_ARCH_X86
- app.addT<X86Test_AllocArgsVec>();
-#endif
- app.addT<X86Test_AllocRetFloat1>();
- app.addT<X86Test_AllocRetFloat2>();
- app.addT<X86Test_AllocRetDouble1>();
- app.addT<X86Test_AllocRetDouble2>();
- app.addT<X86Test_AllocStack>();
- app.addT<X86Test_AllocMemcpy>();
- app.addT<X86Test_AllocExtraBlock>();
- app.addT<X86Test_AllocAlphaBlend>();
-
- // Function arguments handling tests.
- app.addT<X86Test_FuncArgInt8>();
-
- // Function call tests.
- app.addT<X86Test_FuncCallBase1>();
- app.addT<X86Test_FuncCallBase2>();
- app.addT<X86Test_FuncCallStd>();
- app.addT<X86Test_FuncCallFast>();
-#if ASMJIT_ARCH_X86
- app.addT<X86Test_FuncCallSIMD>();
-#endif
- app.addT<X86Test_FuncCallLight>();
- app.addT<X86Test_FuncCallManyArgs>();
- app.addT<X86Test_FuncCallDuplicateArgs>();
- app.addT<X86Test_FuncCallImmArgs>();
- app.addT<X86Test_FuncCallPtrArgs>();
- app.addT<X86Test_FuncCallRefArgs>();
- app.addT<X86Test_FuncCallFloatAsXmmRet>();
- app.addT<X86Test_FuncCallDoubleAsXmmRet>();
- app.addT<X86Test_FuncCallConditional>();
- app.addT<X86Test_FuncCallMultiple>();
- app.addT<X86Test_FuncCallRecursive>();
- app.addT<X86Test_FuncCallVarArg1>();
- app.addT<X86Test_FuncCallVarArg2>();
- app.addT<X86Test_FuncCallInt64Arg>();
- app.addT<X86Test_FuncCallMisc1>();
- app.addT<X86Test_FuncCallMisc2>();
- app.addT<X86Test_FuncCallMisc3>();
- app.addT<X86Test_FuncCallMisc4>();
- app.addT<X86Test_FuncCallMisc5>();
- app.addT<X86Test_FuncCallMisc6>();
- app.addT<X86Test_FuncCallAVXClobber>();
-
- // Miscellaneous tests.
- app.addT<X86Test_MiscLocalConstPool>();
- app.addT<X86Test_MiscGlobalConstPool>();
- app.addT<X86Test_MiscMultiRet>();
- app.addT<X86Test_MiscMultiFunc>();
- app.addT<X86Test_MiscUnfollow>();
-}
-
-#endif // !ASMJIT_NO_X86 && !ASMJIT_NO_COMPILER
diff --git a/3rdparty/asmjit/test/asmjit_test_emitters.cpp b/3rdparty/asmjit/test/asmjit_test_emitters.cpp
deleted file mode 100644
index 47fcaff39d5..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_emitters.cpp
+++ /dev/null
@@ -1,325 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-static void printInfo() noexcept {
- printf("AsmJit Emitters Test-Suite v%u.%u.%u\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
-}
-
-#if !defined(ASMJIT_NO_JIT) && ( \
- (ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86 )) || \
- (ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)) )
-
-#if ASMJIT_ARCH_X86 != 0
-#include <asmjit/x86.h>
-#endif
-
-#if ASMJIT_ARCH_ARM == 64
-#include <asmjit/a64.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-using namespace asmjit;
-
-// Signature of the generated function.
-typedef void (*SumIntsFunc)(int* dst, const int* a, const int* b);
-
-// X86 Backend
-// -----------
-
-#if ASMJIT_ARCH_X86 != 0
-// This function works with both x86::Assembler and x86::Builder. It shows how
-// `x86::Emitter` can be used to make your code more generic.
-static void generateFuncWithEmitter(x86::Emitter* emitter) noexcept {
- // Decide which registers will be mapped to function arguments. Try changing
- // registers of `dst`, `src_a`, and `src_b` and see what happens in function's
- // prolog and epilog.
- x86::Gp dst = emitter->zax();
- x86::Gp src_a = emitter->zcx();
- x86::Gp src_b = emitter->zdx();
-
- // Decide which vector registers to use. We use these to keep the code generic,
- // you can switch to any other registers when needed.
- x86::Xmm vec0 = x86::xmm0;
- x86::Xmm vec1 = x86::xmm1;
-
- // Create and initialize `FuncDetail` and `FuncFrame`.
- FuncDetail func;
- func.init(FuncSignature::build<void, int*, const int*, const int*>(), emitter->environment());
-
- FuncFrame frame;
- frame.init(func);
-
- // Make or registers dirty.
- frame.addDirtyRegs(vec0, vec1);
-
- FuncArgsAssignment args(&func); // Create arguments assignment context.
- args.assignAll(dst, src_a, src_b); // Assign our registers to arguments.
- args.updateFuncFrame(frame); // Reflect our args in FuncFrame.
- frame.finalize();
-
- // Emit prolog and allocate arguments to registers.
- emitter->emitProlog(frame);
- emitter->emitArgsAssignment(frame, args);
-
- emitter->movdqu(vec0, x86::ptr(src_a)); // Load 4 ints from [src_a] to XMM0.
- emitter->movdqu(vec1, x86::ptr(src_b)); // Load 4 ints from [src_b] to XMM1.
-
- emitter->paddd(vec0, vec1); // Add 4 ints in XMM1 to XMM0.
- emitter->movdqu(x86::ptr(dst), vec0); // Store the result to [dst].
-
- // Emit epilog and return.
- emitter->emitEpilog(frame);
-}
-
-#ifndef ASMJIT_NO_COMPILER
-// This function works with x86::Compiler, provided for comparison.
-static void generateFuncWithCompiler(x86::Compiler* cc) noexcept {
- x86::Gp dst = cc->newIntPtr("dst");
- x86::Gp src_a = cc->newIntPtr("src_a");
- x86::Gp src_b = cc->newIntPtr("src_b");
- x86::Xmm vec0 = cc->newXmm("vec0");
- x86::Xmm vec1 = cc->newXmm("vec1");
-
- FuncNode* funcNode = cc->addFunc(FuncSignature::build<void, int*, const int*, const int*>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src_a);
- funcNode->setArg(2, src_b);
-
- cc->movdqu(vec0, x86::ptr(src_a));
- cc->movdqu(vec1, x86::ptr(src_b));
- cc->paddd(vec0, vec1);
- cc->movdqu(x86::ptr(dst), vec0);
- cc->endFunc();
-}
-#endif
-
-static Error generateFunc(CodeHolder& code, EmitterType emitterType) noexcept {
- switch (emitterType) {
- case EmitterType::kAssembler: {
- printf("Using x86::Assembler:\n");
- x86::Assembler a(&code);
- generateFuncWithEmitter(a.as<x86::Emitter>());
- return kErrorOk;
- }
-
-#ifndef ASMJIT_NO_BUILDER
- case EmitterType::kBuilder: {
- printf("Using x86::Builder:\n");
- x86::Builder cb(&code);
- generateFuncWithEmitter(cb.as<x86::Emitter>());
-
- return cb.finalize();
- }
-#endif
-
-#ifndef ASMJIT_NO_COMPILER
- case EmitterType::kCompiler: {
- printf("Using x86::Compiler:\n");
- x86::Compiler cc(&code);
- generateFuncWithCompiler(&cc);
-
- return cc.finalize();
- }
-#endif
-
- default: {
- printf("** FAILURE: No emitter to use **\n");
- exit(1);
- }
- }
-}
-#endif
-
-// AArch64 Backend
-// ---------------
-
-#if ASMJIT_ARCH_ARM == 64
-// This function works with both a64::Assembler and a64::Builder. It shows how
-// `a64::Emitter` can be used to make your code more generic.
-static void generateFuncWithEmitter(a64::Emitter* emitter) noexcept {
- // Decide which registers will be mapped to function arguments. Try changing
- // registers of `dst`, `src_a`, and `src_b` and see what happens in function's
- // prolog and epilog.
- a64::Gp dst = a64::x0;
- a64::Gp src_a = a64::x1;
- a64::Gp src_b = a64::x2;
-
- // Decide which vector registers to use. We use these to keep the code generic,
- // you can switch to any other registers when needed.
- a64::Vec vec0 = a64::v0;
- a64::Vec vec1 = a64::v1;
- a64::Vec vec2 = a64::v2;
-
- // Create and initialize `FuncDetail` and `FuncFrame`.
- FuncDetail func;
- func.init(FuncSignature::build<void, int*, const int*, const int*>(), emitter->environment());
-
- FuncFrame frame;
- frame.init(func);
-
- // Make XMM0 and XMM1 dirty. VEC group includes XMM|YMM|ZMM registers.
- frame.addDirtyRegs(vec0, vec1, vec2);
-
- FuncArgsAssignment args(&func); // Create arguments assignment context.
- args.assignAll(dst, src_a, src_b); // Assign our registers to arguments.
- args.updateFuncFrame(frame); // Reflect our args in FuncFrame.
- frame.finalize();
-
- // Emit prolog and allocate arguments to registers.
- emitter->emitProlog(frame);
- emitter->emitArgsAssignment(frame, args);
-
- emitter->ld1(vec0.b16(), a64::ptr(src_a)); // Load 4 ints from [src_a] to vec0.
- emitter->ld1(vec1.b16(), a64::ptr(src_b)); // Load 4 ints from [src_b] to vec1.
- emitter->add(vec2.s4(), vec0.s4(), vec1.s4()); // Add 4 ints of vec0 and vec1 and store to vec2.
- emitter->st1(vec2.b16(), a64::ptr(dst)); // Store the result (vec2) to [dst].
-
- // Emit epilog and return.
- emitter->emitEpilog(frame);
-}
-
-#ifndef ASMJIT_NO_COMPILER
-// This function works with x86::Compiler, provided for comparison.
-static void generateFuncWithCompiler(a64::Compiler* cc) noexcept {
- a64::Gp dst = cc->newIntPtr("dst");
- a64::Gp src_a = cc->newIntPtr("src_a");
- a64::Gp src_b = cc->newIntPtr("src_b");
- a64::Vec vec0 = cc->newVecQ("vec0");
- a64::Vec vec1 = cc->newVecQ("vec1");
- a64::Vec vec2 = cc->newVecQ("vec2");
-
- FuncNode* funcNode = cc->addFunc(FuncSignature::build<void, int*, const int*, const int*>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src_a);
- funcNode->setArg(2, src_b);
-
- cc->ld1(vec0.b16(), a64::ptr(src_a)); // Load 4 ints from [src_a] to vec0.
- cc->ld1(vec1.b16(), a64::ptr(src_b)); // Load 4 ints from [src_b] to vec1.
- cc->add(vec2.s4(), vec0.s4(), vec1.s4()); // Add 4 ints of vec0 and vec1 and store to vec2.
- cc->st1(vec2.b16(), a64::ptr(dst)); // Store the result (vec2) to [dst].
- cc->endFunc();
-}
-#endif
-
-static Error generateFunc(CodeHolder& code, EmitterType emitterType) noexcept {
- switch (emitterType) {
- case EmitterType::kAssembler: {
- printf("Using a64::Assembler:\n");
- a64::Assembler a(&code);
- generateFuncWithEmitter(a.as<a64::Emitter>());
- return kErrorOk;
- }
-
-#ifndef ASMJIT_NO_BUILDER
- case EmitterType::kBuilder: {
- printf("Using a64::Builder:\n");
- a64::Builder cb(&code);
- generateFuncWithEmitter(cb.as<a64::Emitter>());
-
- return cb.finalize();
- }
-#endif
-
-#ifndef ASMJIT_NO_COMPILER
- case EmitterType::kCompiler: {
- printf("Using a64::Compiler:\n");
- a64::Compiler cc(&code);
- generateFuncWithCompiler(&cc);
-
- return cc.finalize();
- }
-#endif
-
- default: {
- printf("** FAILURE: No emitter to use **\n");
- exit(1);
- }
- }
-}
-#endif
-
-// Testing
-// -------
-
-static uint32_t testFunc(JitRuntime& rt, EmitterType emitterType) noexcept {
-#ifndef ASMJIT_NO_LOGGING
- FileLogger logger(stdout);
- logger.setIndentation(FormatIndentationGroup::kCode, 2);
-#endif
-
- CodeHolder code;
- code.init(rt.environment(), rt.cpuFeatures());
-
-#ifndef ASMJIT_NO_LOGGING
- code.setLogger(&logger);
-#endif
-
- Error err = generateFunc(code, emitterType);
- if (err) {
- printf("** FAILURE: Failed to generate a function: %s **\n", DebugUtils::errorAsString(err));
- return 1;
- }
-
- // Add the code generated to the runtime.
- SumIntsFunc fn;
- err = rt.add(&fn, &code);
-
- if (err) {
- printf("** FAILURE: JitRuntime::add() failed: %s **\n", DebugUtils::errorAsString(err));
- return 1;
- }
-
- // Execute the generated function.
- static const int inA[4] = { 4, 3, 2, 1 };
- static const int inB[4] = { 1, 5, 2, 8 };
- int out[4] {};
- fn(out, inA, inB);
-
- // Should print {5 8 4 9}.
- printf("Result = { %d %d %d %d }\n\n", out[0], out[1], out[2], out[3]);
-
- rt.release(fn);
- return out[0] == 5 && out[1] == 8 && out[2] == 4 && out[3] == 9;
-}
-
-int main() {
- printInfo();
- printf("\n");
-
- JitRuntime rt;
- unsigned nFailed = 0;
-
- nFailed += !testFunc(rt, EmitterType::kAssembler);
-
-#ifndef ASMJIT_NO_BUILDER
- nFailed += !testFunc(rt, EmitterType::kBuilder);
-#endif
-
-#ifndef ASMJIT_NO_COMPILER
- nFailed += !testFunc(rt, EmitterType::kCompiler);
-#endif
-
- if (!nFailed)
- printf("** SUCCESS **\n");
- else
- printf("** FAILURE - %u %s failed ** \n", nFailed, nFailed == 1 ? "test" : "tests");
-
- return nFailed ? 1 : 0;
-}
-#else
-int main() {
- printInfo();
- printf("\nThis test is currently disabled - no JIT or no support for the target architecture\n");
- return 0;
-}
-#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/test/asmjit_test_execute.cpp b/3rdparty/asmjit/test/asmjit_test_execute.cpp
deleted file mode 100644
index ce002dc5a6b..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_execute.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-static void printInfo() noexcept {
- printf("AsmJit Execute Test-Suite v%u.%u.%u\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
-}
-
-#if !defined(ASMJIT_NO_JIT) && ( \
- (ASMJIT_ARCH_X86 != 0 && !defined(ASMJIT_NO_X86 )) || \
- (ASMJIT_ARCH_ARM == 64 && !defined(ASMJIT_NO_AARCH64)) )
-
-#if ASMJIT_ARCH_X86 != 0
-#include <asmjit/x86.h>
-#endif
-
-#if ASMJIT_ARCH_ARM == 64
-#include <asmjit/a64.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-using namespace asmjit;
-
-// Signature of the generated function.
-typedef void (*EmptyFunc)(void);
-
-// Generate Empty Function
-// -----------------------
-
-#if ASMJIT_ARCH_X86 != 0
-static void generateEmptyFunc(CodeHolder& code) noexcept {
- x86::Assembler a(&code);
- a.ret();
-}
-#endif
-
-#if ASMJIT_ARCH_ARM == 64
-static void generateEmptyFunc(CodeHolder& code) noexcept {
- a64::Assembler a(&code);
- a.ret(a64::x30);
-}
-#endif
-
-// Testing
-// -------
-
-static void executeEmptyFunc(JitRuntime& rt) noexcept {
- CodeHolder code;
- code.init(rt.environment(), rt.cpuFeatures());
-
- EmptyFunc fn;
-
- generateEmptyFunc(code);
- Error err = rt.add(&fn, &code);
-
- if (err) {
- printf("** FAILURE: JitRuntime::add() failed: %s **\n", DebugUtils::errorAsString(err));
- exit(1);
- }
-
- fn();
-
- rt.release(&fn);
-}
-
-int main() {
- printInfo();
- printf("\n");
-
- {
- printf("Trying to execute empty function with JitRuntime (default settings)\n");
- JitRuntime rt;
- executeEmptyFunc(rt);
- }
-
- if (VirtMem::hardenedRuntimeInfo().hasFlag(VirtMem::HardenedRuntimeFlags::kDualMapping)) {
- printf("Trying to execute empty function with JitRuntime (dual-mapped)\n");
- JitAllocator::CreateParams params {};
- params.options |= JitAllocatorOptions::kUseDualMapping;
- JitRuntime rt;
- executeEmptyFunc(rt);
- }
-
- // If we are here we were successful, otherwise the process would crash.
- printf("** SUCCESS **\n");
- return 0;
-}
-#else
-int main() {
- printInfo();
- printf("\nThis test is currently disabled - no JIT or no support for the target architecture\n");
- return 0;
-}
-#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/test/asmjit_test_instinfo.cpp b/3rdparty/asmjit/test/asmjit_test_instinfo.cpp
deleted file mode 100644
index 466d8a55951..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_instinfo.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-#if !defined(ASMJIT_NO_X86)
-#include <asmjit/x86.h>
-#endif
-
-#include <stdio.h>
-
-using namespace asmjit;
-
-namespace {
-
-#if !defined(ASMJIT_NO_X86)
-static char accessLetter(bool r, bool w) noexcept {
- return r && w ? 'X' : r ? 'R' : w ? 'W' : '_';
-}
-
-static void printInfo(Arch arch, const BaseInst& inst, const Operand_* operands, size_t opCount) {
- StringTmp<512> sb;
-
- // Read & Write Information
- // ------------------------
-
- InstRWInfo rw;
- InstAPI::queryRWInfo(arch, inst, operands, opCount, &rw);
-
-#ifndef ASMJIT_NO_LOGGING
- Formatter::formatInstruction(sb, FormatFlags::kNone, nullptr, arch, inst, operands, opCount);
-#else
- sb.append("<Logging-Not-Available>");
-#endif
- sb.append("\n");
-
- sb.append(" Operands:\n");
- for (uint32_t i = 0; i < rw.opCount(); i++) {
- const OpRWInfo& op = rw.operand(i);
-
- sb.appendFormat(" [%u] Op=%c Read=%016llX Write=%016llX Extend=%016llX",
- i,
- accessLetter(op.isRead(), op.isWrite()),
- op.readByteMask(),
- op.writeByteMask(),
- op.extendByteMask());
-
- if (op.isMemBaseUsed()) {
- sb.appendFormat(" Base=%c", accessLetter(op.isMemBaseRead(), op.isMemBaseWrite()));
- if (op.isMemBasePreModify())
- sb.appendFormat(" <PRE>");
- if (op.isMemBasePostModify())
- sb.appendFormat(" <POST>");
- }
-
- if (op.isMemIndexUsed()) {
- sb.appendFormat(" Index=%c", accessLetter(op.isMemIndexRead(), op.isMemIndexWrite()));
- }
-
- sb.append("\n");
- }
-
- // CPU Flags (Read/Write)
- // ----------------------
-
- if ((rw.readFlags() | rw.writeFlags()) != CpuRWFlags::kNone) {
- sb.append(" Flags: \n");
-
- struct FlagMap {
- CpuRWFlags flag;
- char name[4];
- };
-
- static const FlagMap flagMap[] = {
- { CpuRWFlags::kX86_CF, "CF" },
- { CpuRWFlags::kX86_OF, "OF" },
- { CpuRWFlags::kX86_SF, "SF" },
- { CpuRWFlags::kX86_ZF, "ZF" },
- { CpuRWFlags::kX86_AF, "AF" },
- { CpuRWFlags::kX86_PF, "PF" },
- { CpuRWFlags::kX86_DF, "DF" },
- { CpuRWFlags::kX86_IF, "IF" },
- { CpuRWFlags::kX86_AC, "AC" },
- { CpuRWFlags::kX86_C0, "C0" },
- { CpuRWFlags::kX86_C1, "C1" },
- { CpuRWFlags::kX86_C2, "C2" },
- { CpuRWFlags::kX86_C3, "C3" }
- };
-
- sb.append(" ");
- for (uint32_t f = 0; f < 13; f++) {
- char c = accessLetter((rw.readFlags() & flagMap[f].flag) != CpuRWFlags::kNone,
- (rw.writeFlags() & flagMap[f].flag) != CpuRWFlags::kNone);
- if (c != '_')
- sb.appendFormat("%s=%c ", flagMap[f].name, c);
- }
-
- sb.append("\n");
- }
-
- // CPU Features
- // ------------
-
- CpuFeatures features;
- InstAPI::queryFeatures(arch, inst, operands, opCount, &features);
-
-#ifndef ASMJIT_NO_LOGGING
- if (!features.empty()) {
- sb.append(" Features:\n");
- sb.append(" ");
-
- bool first = true;
- CpuFeatures::Iterator it(features.iterator());
- while (it.hasNext()) {
- uint32_t featureId = uint32_t(it.next());
- if (!first)
- sb.append(" & ");
- Formatter::formatFeature(sb, arch, featureId);
- first = false;
- }
- sb.append("\n");
- }
-#endif
-
- printf("%s\n", sb.data());
-}
-
-template<typename... Args>
-static void printInfoSimple(Arch arch,InstId instId, InstOptions options, Args&&... args) {
- BaseInst inst(instId);
- inst.addOptions(options);
- Operand_ opArray[] = { std::forward<Args>(args)... };
- printInfo(arch, inst, opArray, sizeof...(args));
-}
-
-template<typename... Args>
-static void printInfoExtra(Arch arch, InstId instId, InstOptions options, const BaseReg& extraReg, Args&&... args) {
- BaseInst inst(instId);
- inst.addOptions(options);
- inst.setExtraReg(extraReg);
- Operand_ opArray[] = { std::forward<Args>(args)... };
- printInfo(arch, inst, opArray, sizeof...(args));
-}
-#endif // !ASMJIT_NO_X86
-
-static void testX86Arch() {
-#if !defined(ASMJIT_NO_X86)
- using namespace x86;
- Arch arch = Arch::kX64;
-
- printInfoSimple(arch, Inst::kIdAdd, InstOptions::kNone, eax, ebx);
- printInfoSimple(arch, Inst::kIdLods, InstOptions::kNone, eax, dword_ptr(rsi));
-
- printInfoSimple(arch, Inst::kIdPshufd, InstOptions::kNone, xmm0, xmm1, imm(0));
- printInfoSimple(arch, Inst::kIdPabsb, InstOptions::kNone, mm1, mm2);
- printInfoSimple(arch, Inst::kIdPabsb, InstOptions::kNone, xmm1, xmm2);
- printInfoSimple(arch, Inst::kIdPextrw, InstOptions::kNone, eax, mm1, imm(0));
- printInfoSimple(arch, Inst::kIdPextrw, InstOptions::kNone, eax, xmm1, imm(0));
- printInfoSimple(arch, Inst::kIdPextrw, InstOptions::kNone, ptr(rax), xmm1, imm(0));
-
- printInfoSimple(arch, Inst::kIdVpdpbusd, InstOptions::kNone, xmm0, xmm1, xmm2);
- printInfoSimple(arch, Inst::kIdVpdpbusd, InstOptions::kX86_Vex, xmm0, xmm1, xmm2);
-
- printInfoSimple(arch, Inst::kIdVaddpd, InstOptions::kNone, ymm0, ymm1, ymm2);
- printInfoSimple(arch, Inst::kIdVaddpd, InstOptions::kNone, ymm0, ymm30, ymm31);
- printInfoSimple(arch, Inst::kIdVaddpd, InstOptions::kNone, zmm0, zmm1, zmm2);
-
- printInfoExtra(arch, Inst::kIdVaddpd, InstOptions::kNone, k1, zmm0, zmm1, zmm2);
- printInfoExtra(arch, Inst::kIdVaddpd, InstOptions::kX86_ZMask, k1, zmm0, zmm1, zmm2);
-#endif // !ASMJIT_NO_X86
-}
-
-} // {anonymous}
-
-int main() {
- printf("AsmJit Instruction Info Test-Suite v%u.%u.%u\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
- printf("\n");
-
- testX86Arch();
-
- return 0;
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_misc.h b/3rdparty/asmjit/test/asmjit_test_misc.h
deleted file mode 100644
index 6231971f01f..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_misc.h
+++ /dev/null
@@ -1,257 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_TEST_MISC_H_INCLUDED
-#define ASMJIT_TEST_MISC_H_INCLUDED
-
-#include <asmjit/x86.h>
-
-namespace asmtest {
-
-using namespace asmjit;
-
-// Generates a typical alpha blend function that uses SSE2 instruction set.
-// This function combines emitting instructions with control flow constructs
-// like binding Labels and jumping to them. This should be pretty representative.
-template<typename Emitter>
-static void generateSseAlphaBlendInternal(
- Emitter& cc,
- const x86::Gp& dst, const x86::Gp& src, const x86::Gp& n,
- const x86::Gp& gp0,
- const x86::Xmm& simd0, const x86::Xmm& simd1, const x86::Xmm& simd2, const x86::Xmm& simd3,
- const x86::Xmm& simd4, const x86::Xmm& simd5, const x86::Xmm& simd6, const x86::Xmm& simd7) {
-
- x86::Gp i = n;
- x86::Gp j = gp0;
-
- x86::Xmm vzero = simd0;
- x86::Xmm v0080 = simd1;
- x86::Xmm v0101 = simd2;
-
- Label L_SmallLoop = cc.newLabel();
- Label L_SmallEnd = cc.newLabel();
- Label L_LargeLoop = cc.newLabel();
- Label L_LargeEnd = cc.newLabel();
- Label L_Done = cc.newLabel();
-
- // Load SIMD Constants.
- cc.xorps(vzero, vzero);
- cc.mov(gp0.r32(), 0x00800080);
- cc.movd(v0080, gp0.r32());
- cc.mov(gp0.r32(), 0x01010101);
- cc.movd(v0101, gp0.r32());
- cc.pshufd(v0080, v0080, x86::shuffleImm(0, 0, 0, 0));
- cc.pshufd(v0101, v0101, x86::shuffleImm(0, 0, 0, 0));
-
- // How many pixels have to be processed to make the loop aligned.
- cc.xor_(j, j);
- cc.sub(j, dst);
- cc.and_(j, 15);
- cc.shr(j, 2);
- cc.jz(L_SmallEnd);
-
- cc.cmp(j, i);
- cc.cmovg(j, i); // j = min(i, j)
- cc.sub(i, j); // i -= j
-
- // Small loop.
- cc.bind(L_SmallLoop);
- {
- x86::Xmm x0 = simd3;
- x86::Xmm y0 = simd4;
- x86::Xmm a0 = simd5;
-
- cc.movd(y0, x86::ptr(src));
- cc.movd(x0, x86::ptr(dst));
-
- cc.pcmpeqb(a0, a0);
- cc.pxor(a0, y0);
- cc.psrlw(a0, 8);
- cc.punpcklbw(x0, vzero);
-
- cc.pshuflw(a0, a0, x86::shuffleImm(1, 1, 1, 1));
- cc.punpcklbw(y0, vzero);
-
- cc.pmullw(x0, a0);
- cc.paddsw(x0, v0080);
- cc.pmulhuw(x0, v0101);
-
- cc.paddw(x0, y0);
- cc.packuswb(x0, x0);
-
- cc.movd(x86::ptr(dst), x0);
-
- cc.add(dst, 4);
- cc.add(src, 4);
-
- cc.dec(j);
- cc.jnz(L_SmallLoop);
- }
-
- // Second section, prepare for an aligned loop.
- cc.bind(L_SmallEnd);
-
- cc.test(i, i);
- cc.mov(j, i);
- cc.jz(L_Done);
-
- cc.and_(j, 3);
- cc.shr(i, 2);
- cc.jz(L_LargeEnd);
-
- // Aligned loop.
- cc.bind(L_LargeLoop);
- {
- x86::Xmm x0 = simd3;
- x86::Xmm x1 = simd4;
- x86::Xmm y0 = simd5;
- x86::Xmm a0 = simd6;
- x86::Xmm a1 = simd7;
-
- cc.movups(y0, x86::ptr(src));
- cc.movaps(x0, x86::ptr(dst));
-
- cc.pcmpeqb(a0, a0);
- cc.xorps(a0, y0);
- cc.movaps(x1, x0);
-
- cc.psrlw(a0, 8);
- cc.punpcklbw(x0, vzero);
-
- cc.movaps(a1, a0);
- cc.punpcklwd(a0, a0);
-
- cc.punpckhbw(x1, vzero);
- cc.punpckhwd(a1, a1);
-
- cc.pshufd(a0, a0, x86::shuffleImm(3, 3, 1, 1));
- cc.pshufd(a1, a1, x86::shuffleImm(3, 3, 1, 1));
-
- cc.pmullw(x0, a0);
- cc.pmullw(x1, a1);
-
- cc.paddsw(x0, v0080);
- cc.paddsw(x1, v0080);
-
- cc.pmulhuw(x0, v0101);
- cc.pmulhuw(x1, v0101);
-
- cc.add(src, 16);
- cc.packuswb(x0, x1);
-
- cc.paddw(x0, y0);
- cc.movaps(x86::ptr(dst), x0);
-
- cc.add(dst, 16);
-
- cc.dec(i);
- cc.jnz(L_LargeLoop);
- }
-
- cc.bind(L_LargeEnd);
- cc.test(j, j);
- cc.jnz(L_SmallLoop);
-
- cc.bind(L_Done);
-}
-
-static void generateSseAlphaBlend(asmjit::BaseEmitter& emitter, bool emitPrologEpilog) {
- using namespace asmjit::x86;
-
- if (emitter.isAssembler()) {
- Assembler& cc = *emitter.as<Assembler>();
-
- x86::Gp dst = cc.zax();
- x86::Gp src = cc.zcx();
- x86::Gp i = cc.zdx();
- x86::Gp j = cc.zdi();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(dst, src, i, j);
- frame.addDirtyRegs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
-
- FuncArgsAssignment args(&func);
- args.assignAll(dst, src, i);
- args.updateFuncFrame(frame);
- frame.finalize();
-
- cc.emitProlog(frame);
- cc.emitArgsAssignment(frame, args);
- generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
- cc.emitEpilog(frame);
- }
- else {
- generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
- }
- }
-#ifndef ASMJIT_NO_BUILDER
- else if (emitter.isBuilder()) {
- Builder& cc = *emitter.as<Builder>();
-
- x86::Gp dst = cc.zax();
- x86::Gp src = cc.zcx();
- x86::Gp i = cc.zdx();
- x86::Gp j = cc.zdi();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(dst, src, i, j);
- frame.addDirtyRegs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
-
- FuncArgsAssignment args(&func);
- args.assignAll(dst, src, i);
- args.updateFuncFrame(frame);
- frame.finalize();
-
- cc.emitProlog(frame);
- cc.emitArgsAssignment(frame, args);
- generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
- cc.emitEpilog(frame);
- }
- else {
- generateSseAlphaBlendInternal(cc, dst, src, i, j, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
- }
- }
-#endif
-#ifndef ASMJIT_NO_COMPILER
- else if (emitter.isCompiler()) {
- Compiler& cc = *emitter.as<Compiler>();
-
- Gp dst = cc.newIntPtr("dst");
- Gp src = cc.newIntPtr("src");
- Gp i = cc.newIntPtr("i");
- Gp j = cc.newIntPtr("j");
-
- Xmm v0 = cc.newXmm("v0");
- Xmm v1 = cc.newXmm("v1");
- Xmm v2 = cc.newXmm("v2");
- Xmm v3 = cc.newXmm("v3");
- Xmm v4 = cc.newXmm("v4");
- Xmm v5 = cc.newXmm("v5");
- Xmm v6 = cc.newXmm("v6");
- Xmm v7 = cc.newXmm("v7");
-
- FuncNode* funcNode = cc.addFunc(FuncSignature::build<void, void*, const void*, size_t>());
- funcNode->setArg(0, dst);
- funcNode->setArg(1, src);
- funcNode->setArg(2, i);
- generateSseAlphaBlendInternal(cc, dst, src, i, j, v0, v1, v2, v3, v4, v5, v6, v7);
- cc.endFunc();
- }
-#endif
-}
-
-} // {asmtest}
-
-#endif // ASMJIT_TEST_MISC_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_perf.cpp b/3rdparty/asmjit/test/asmjit_test_perf.cpp
deleted file mode 100644
index 98353fd147d..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_perf.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "cmdline.h"
-
-using namespace asmjit;
-
-#if !defined(ASMJIT_NO_X86)
-void benchmarkX86Emitters(uint32_t numIterations, bool testX86, bool testX64) noexcept;
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
-void benchmarkA64Emitters(uint32_t numIterations);
-#endif
-
-int main(int argc, char* argv[]) {
- CmdLine cmdLine(argc, argv);
- uint32_t numIterations = 20000;
-
- printf("AsmJit Performance Suite v%u.%u.%u:\n\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
-
- printf("Usage:\n");
- printf(" --help Show usage only\n");
- printf(" --quick Decrease the number of iterations to make tests quicker\n");
- printf(" --arch=<ARCH> Select architecture(s) to run ('all' by default)\n");
- printf("\n");
-
- printf("Architectures:\n");
-#if !defined(ASMJIT_NO_X86)
- printf(" --arch=x86 32-bit X86 architecture (X86)\n");
- printf(" --arch=x64 64-bit X86 architecture (X86_64)\n");
-#endif
-#if !defined(ASMJIT_NO_AARCH64)
- printf(" --arch=aarch64 64-bit ARM architecture (AArch64)\n");
-#endif
- printf("\n");
-
- if (cmdLine.hasArg("--help"))
- return 0;
-
- if (cmdLine.hasArg("--quick"))
- numIterations = 1000;
-
- const char* arch = cmdLine.valueOf("--arch", "all");
-
-#if !defined(ASMJIT_NO_X86)
- bool testX86 = strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0;
- bool testX64 = strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0;
-
- if (testX86 || testX64)
- benchmarkX86Emitters(numIterations, testX86, testX64);
-#endif
-
-#if !defined(ASMJIT_NO_AARCH64)
- bool testAArch64 = strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0;
-
- if (testAArch64)
- benchmarkA64Emitters(numIterations);
-#endif
-
- return 0;
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_perf.h b/3rdparty/asmjit/test/asmjit_test_perf.h
deleted file mode 100644
index f637013985b..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_perf.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJIT_TEST_PERF_H_INCLUDED
-#define ASMJIT_TEST_PERF_H_INCLUDED
-
-#include <asmjit/core.h>
-#include "asmjitutils.h"
-#include "performancetimer.h"
-
-namespace asmjit_perf_utils {
-
-class TestErrorHandler : public asmjit::ErrorHandler {
- void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) {
- (void)err;
- (void)origin;
- printf("ERROR: %s\n", message);
- abort();
- }
-};
-
-#ifndef ASMJIT_NO_BUILDER
-template<typename BuilderT, typename FuncT>
-static uint32_t calculateInstructionCount(asmjit::CodeHolder& code, asmjit::Arch arch, const FuncT& func) noexcept {
- BuilderT builder;
- TestErrorHandler eh;
-
- asmjit::Environment env(arch);
- code.init(env);
- code.setErrorHandler(&eh);
- code.attach(&builder);
- func(builder);
-
- uint32_t count = 0;
- asmjit::BaseNode* node = builder.firstNode();
-
- while (node) {
- count += uint32_t(node->isInst());
- node = node->next();
- }
-
- code.reset();
- return count;
-}
-#endif
-
-static inline double calculateMBPS(double duration, uint64_t outputSize) noexcept {
- if (duration == 0)
- return 0.0;
-
- double bytesTotal = double(outputSize);
- return (bytesTotal * 1000) / (duration * 1024 * 1024);
-}
-
-static inline double calculateMIPS(double duration, uint64_t instCount) noexcept {
- if (duration == 0)
- return 0.0;
-
- return double(instCount) * 1000.0 / (duration * 1e6);
-}
-
-template<typename EmitterT, typename FuncT>
-static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numIterations, const char* testName, uint32_t instCount, const FuncT& func) noexcept {
- EmitterT emitter;
- TestErrorHandler eh;
-
- const char* archName = asmjitArchAsString(arch);
- const char* emitterName =
- emitter.isAssembler() ? "Assembler" :
- emitter.isCompiler() ? "Compiler" :
- emitter.isBuilder() ? "Builder" : "Unknown";
-
- uint64_t codeSize = 0;
- asmjit::Environment env(arch);
-
- PerformanceTimer timer;
- double duration = std::numeric_limits<double>::infinity();
-
- for (uint32_t r = 0; r < numIterations; r++) {
- codeSize = 0;
- code.init(env);
- code.setErrorHandler(&eh);
- code.attach(&emitter);
-
- timer.start();
- func(emitter);
- timer.stop();
-
- codeSize += code.codeSize();
-
- code.reset();
- duration = asmjit::Support::min(duration, timer.duration());
- }
-
- printf(" [%s] %-9s %-16s | CodeSize:%5llu [B] | Time:%8.4f [ms]", archName, emitterName, testName, (unsigned long long)codeSize, duration);
- if (codeSize) {
- printf(" | Speed:%7.1f [MiB/s]", calculateMBPS(duration, codeSize));
- }
- else {
- printf(" | Speed: N/A ");
- }
-
- if (instCount) {
- printf(", %8.1f [MInst/s]", calculateMIPS(duration, instCount));
- }
-
- printf("\n");
-}
-
-} // {asmjit_perf_utils}
-
-#endif // ASMJIT_TEST_PERF_H_INCLUDED
diff --git a/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp b/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp
deleted file mode 100644
index 36d23a42d9b..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_perf_a64.cpp
+++ /dev/null
@@ -1,707 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-#if !defined(ASMJIT_NO_AARCH64)
-#include <asmjit/a64.h>
-
-#include <limits>
-#include <stdio.h>
-#include <string.h>
-
-#include "asmjit_test_perf.h"
-
-using namespace asmjit;
-
-// Generates a long sequence of GP instructions.
-template<typename Emitter>
-static void generateGpSequenceInternal(
- Emitter& cc,
- const a64::Gp& a, const a64::Gp& b, const a64::Gp& c, const a64::Gp& d) {
-
- using namespace asmjit::a64;
-
- Gp wA = a.w();
- Gp wB = b.w();
- Gp wC = c.w();
- Gp wD = d.w();
-
- Gp xA = a.x();
- Gp xB = b.x();
- Gp xC = c.x();
- Gp xD = d.x();
-
- Mem m = ptr(xD);
-
- cc.mov(wA, 0);
- cc.mov(wB, 1);
- cc.mov(wC, 2);
- cc.mov(wD, 3);
-
- cc.adc(wA, wB, wC);
- cc.adc(xA, xB, xC);
- cc.adc(wA, wzr, wC);
- cc.adc(xA, xzr, xC);
- cc.adc(wzr, wB, wC);
- cc.adc(xzr, xB, xC);
- cc.adcs(wA, wB, wC);
- cc.adcs(xA, xB, xC);
- cc.add(wA, wB, wC);
- cc.add(xA, xB, xC);
- cc.add(wA, wB, wC, lsl(3));
- cc.add(xA, xB, xC, lsl(3));
- cc.add(wA, wzr, wC);
- cc.add(xA, xzr, xC);
- cc.add(wzr, wB, wC);
- cc.add(xzr, xB, xC);
- cc.add(wC, wD, 0, lsl(12));
- cc.add(xC, xD, 0, lsl(12));
- cc.add(wC, wD, 1024, lsl(12));
- cc.add(xC, xD, 1024, lsl(12));
- cc.add(wC, wD, 1024, lsl(12));
- cc.add(xC, xD, 1024, lsl(12));
- cc.adds(wA, wB, wC);
- cc.adds(xA, xB, xC);
- cc.adr(xA, 0);
- cc.adr(xA, 256);
- cc.adrp(xA, 4096);
- cc.and_(wA, wB, wC);
- cc.and_(xA, xB, xC);
- cc.and_(wA, wB, 1);
- cc.and_(xA, xB, 1);
- cc.and_(wA, wB, 15);
- cc.and_(xA, xB, 15);
- cc.and_(wA, wzr, wC);
- cc.and_(xA, xzr, xC);
- cc.and_(wzr, wB, wC);
- cc.and_(xzr, xB, xC);
- cc.and_(wA, wB, 0x1);
- cc.and_(xA, xB, 0x1);
- cc.and_(wA, wB, 0xf);
- cc.and_(xA, xB, 0xf);
- cc.ands(wA, wB, wC);
- cc.ands(xA, xB, xC);
- cc.ands(wA, wzr, wC);
- cc.ands(xA, xzr, xC);
- cc.ands(wzr, wB, wC);
- cc.ands(xzr, xB, xC);
- cc.ands(wA, wB, 0x1);
- cc.ands(xA, xB, 0x1);
- cc.ands(wA, wB, 0xf);
- cc.ands(xA, xB, 0xf);
- cc.asr(wA, wB, 15);
- cc.asr(xA, xB, 15);
- cc.asrv(wA, wB, wC);
- cc.asrv(xA, xB, xC);
- cc.bfc(wA, 8, 16);
- cc.bfc(xA, 8, 16);
- cc.bfi(wA, wB, 8, 16);
- cc.bfi(xA, xB, 8, 16);
- cc.bfm(wA, wB, 8, 16);
- cc.bfm(xA, xB, 8, 16);
- cc.bfxil(wA, wB, 8, 16);
- cc.bfxil(xA, xB, 8, 16);
- cc.bic(wA, wB, wC, lsl(4));
- cc.bic(xA, xB, xC, lsl(4));
- cc.bic(wA, wzr, wC);
- cc.bic(xA, xzr, xC);
- cc.bics(wA, wB, wC, lsl(4));
- cc.bics(xA, xB, xC, lsl(4));
- cc.bics(wA, wzr, wC);
- cc.bics(xA, xzr, xC);
- cc.cas(wA, wB, m);
- cc.cas(xA, xB, m);
- cc.casa(wA, wB, m);
- cc.casa(xA, xB, m);
- cc.casab(wA, wB, m);
- cc.casah(wA, wB, m);
- cc.casal(wA, wB, m);
- cc.casal(xA, xB, m);
- cc.casalb(wA, wB, m);
- cc.casalh(wA, wB, m);
- cc.casb(wA, wB, m);
- cc.cash(wA, wB, m);
- cc.casl(wA, wB, m);
- cc.casl(xA, xB, m);
- cc.caslb(wA, wB, m);
- cc.caslh(wA, wB, m);
- cc.casp(wA, wB, wC, wD, m);
- cc.casp(xA, xB, xC, xD, m);
- cc.caspa(wA, wB, wC, wD, m);
- cc.caspa(xA, xB, xC, xD, m);
- cc.caspal(wA, wB, wC, wD, m);
- cc.caspal(xA, xB, xC, xD, m);
- cc.caspl(wA, wB, wC, wD, m);
- cc.caspl(xA, xB, xC, xD, m);
- cc.ccmn(wA, wB, 3, CondCode::kEQ);
- cc.ccmn(xA, xB, 3, CondCode::kEQ);
- cc.ccmn(wA, 2, 3, CondCode::kEQ);
- cc.ccmn(xA, 2, 3, CondCode::kEQ);
- cc.ccmn(wA, wzr, 3, CondCode::kEQ);
- cc.ccmn(xA, xzr, 3, CondCode::kEQ);
- cc.ccmp(wA, wB, 3, CondCode::kEQ);
- cc.ccmp(xA, xB, 3, CondCode::kEQ);
- cc.ccmp(wA, 2, 3, CondCode::kEQ);
- cc.ccmp(xA, 2, 3, CondCode::kEQ);
- cc.ccmp(wA, wzr, 3, CondCode::kEQ);
- cc.ccmp(xA, xzr, 3, CondCode::kEQ);
- cc.cinc(wA, wB, CondCode::kEQ);
- cc.cinc(xA, xB, CondCode::kEQ);
- cc.cinc(wzr, wB, CondCode::kEQ);
- cc.cinc(wA, wzr, CondCode::kEQ);
- cc.cinc(xzr, xB, CondCode::kEQ);
- cc.cinc(xA, xzr, CondCode::kEQ);
- cc.cinv(wA, wB, CondCode::kEQ);
- cc.cinv(xA, xB, CondCode::kEQ);
- cc.cinv(wzr, wB, CondCode::kEQ);
- cc.cinv(wA, wzr, CondCode::kEQ);
- cc.cinv(xzr, xB, CondCode::kEQ);
- cc.cinv(xA, xzr, CondCode::kEQ);
- cc.cls(wA, wB);
- cc.cls(xA, xB);
- cc.cls(wA, wzr);
- cc.cls(xA, xzr);
- cc.cls(wzr, wB);
- cc.cls(xzr, xB);
- cc.clz(wA, wB);
- cc.clz(xA, xB);
- cc.clz(wA, wzr);
- cc.clz(xA, xzr);
- cc.clz(wzr, wB);
- cc.clz(xzr, xB);
- cc.cmn(wA, 33);
- cc.cmn(xA, 33);
- cc.cmn(wA, wB);
- cc.cmn(xA, xB);
- cc.cmn(wA, wB, uxtb(2));
- cc.cmn(xA, xB, uxtb(2));
- cc.cmp(wA, 33);
- cc.cmp(xA, 33);
- cc.cmp(wA, wB);
- cc.cmp(xA, xB);
- cc.cmp(wA, wB, uxtb(2));
- cc.cmp(xA, xB, uxtb(2));
- cc.crc32b(wA, wB, wC);
- cc.crc32b(wzr, wB, wC);
- cc.crc32b(wA, wzr, wC);
- cc.crc32b(wA, wB, wzr);
- cc.crc32cb(wA, wB, wC);
- cc.crc32cb(wzr, wB, wC);
- cc.crc32cb(wA, wzr, wC);
- cc.crc32cb(wA, wB, wzr);
- cc.crc32ch(wA, wB, wC);
- cc.crc32ch(wzr, wB, wC);
- cc.crc32ch(wA, wzr, wC);
- cc.crc32ch(wA, wB, wzr);
- cc.crc32cw(wA, wB, wC);
- cc.crc32cw(wzr, wB, wC);
- cc.crc32cw(wA, wzr, wC);
- cc.crc32cw(wA, wB, wzr);
- cc.crc32cx(wA, wB, xC);
- cc.crc32cx(wzr, wB, xC);
- cc.crc32cx(wA, wzr, xC);
- cc.crc32cx(wA, wB, xzr);
- cc.crc32h(wA, wB, wC);
- cc.crc32h(wzr, wB, wC);
- cc.crc32h(wA, wzr, wC);
- cc.crc32h(wA, wB, wzr);
- cc.crc32w(wA, wB, wC);
- cc.crc32w(wzr, wB, wC);
- cc.crc32w(wA, wzr, wC);
- cc.crc32w(wA, wB, wzr);
- cc.crc32x(wA, wB, xC);
- cc.crc32x(wzr, wB, xC);
- cc.crc32x(wA, wzr, xC);
- cc.crc32x(wA, wB, xzr);
- cc.csel(wA, wB, wC, CondCode::kEQ);
- cc.csel(xA, xB, xC, CondCode::kEQ);
- cc.cset(wA, CondCode::kEQ);
- cc.cset(xA, CondCode::kEQ);
- cc.cset(wA, CondCode::kEQ);
- cc.cset(xA, CondCode::kEQ);
- cc.csetm(wA, CondCode::kEQ);
- cc.csetm(xA, CondCode::kEQ);
- cc.csinc(wA, wB, wC, CondCode::kEQ);
- cc.csinc(xA, xB, xC, CondCode::kEQ);
- cc.csinv(wA, wB, wC, CondCode::kEQ);
- cc.csinv(xA, xB, xC, CondCode::kEQ);
- cc.csneg(wA, wB, wC, CondCode::kEQ);
- cc.csneg(xA, xB, xC, CondCode::kEQ);
- cc.eon(wA, wB, wC);
- cc.eon(wzr, wB, wC);
- cc.eon(wA, wzr, wC);
- cc.eon(wA, wB, wzr);
- cc.eon(wA, wB, wC, lsl(4));
- cc.eon(xA, xB, xC);
- cc.eon(xzr, xB, xC);
- cc.eon(xA, xzr, xC);
- cc.eon(xA, xB, xzr);
- cc.eon(xA, xB, xC, lsl(4));
- cc.eor(wA, wB, wC);
- cc.eor(wzr, wB, wC);
- cc.eor(wA, wzr, wC);
- cc.eor(wA, wB, wzr);
- cc.eor(xA, xB, xC);
- cc.eor(xzr, xB, xC);
- cc.eor(xA, xzr, xC);
- cc.eor(xA, xB, xzr);
- cc.eor(wA, wB, wC, lsl(4));
- cc.eor(xA, xB, xC, lsl(4));
- cc.eor(wA, wB, 0x4000);
- cc.eor(xA, xB, 0x8000);
- cc.extr(wA, wB, wC, 15);
- cc.extr(wzr, wB, wC, 15);
- cc.extr(wA, wzr, wC, 15);
- cc.extr(wA, wB, wzr, 15);
- cc.extr(xA, xB, xC, 15);
- cc.extr(xzr, xB, xC, 15);
- cc.extr(xA, xzr, xC, 15);
- cc.extr(xA, xB, xzr, 15);
- cc.ldadd(wA, wB, m);
- cc.ldadd(xA, xB, m);
- cc.ldadda(wA, wB, m);
- cc.ldadda(xA, xB, m);
- cc.ldaddab(wA, wB, m);
- cc.ldaddah(wA, wB, m);
- cc.ldaddal(wA, wB, m);
- cc.ldaddal(xA, xB, m);
- cc.ldaddalb(wA, wB, m);
- cc.ldaddalh(wA, wB, m);
- cc.ldaddb(wA, wB, m);
- cc.ldaddh(wA, wB, m);
- cc.ldaddl(wA, wB, m);
- cc.ldaddl(xA, xB, m);
- cc.ldaddlb(wA, wB, m);
- cc.ldaddlh(wA, wB, m);
- cc.ldclr(wA, wB, m);
- cc.ldclr(xA, xB, m);
- cc.ldclra(wA, wB, m);
- cc.ldclra(xA, xB, m);
- cc.ldclrab(wA, wB, m);
- cc.ldclrah(wA, wB, m);
- cc.ldclral(wA, wB, m);
- cc.ldclral(xA, xB, m);
- cc.ldclralb(wA, wB, m);
- cc.ldclralh(wA, wB, m);
- cc.ldclrb(wA, wB, m);
- cc.ldclrh(wA, wB, m);
- cc.ldclrl(wA, wB, m);
- cc.ldclrl(xA, xB, m);
- cc.ldclrlb(wA, wB, m);
- cc.ldclrlh(wA, wB, m);
- cc.ldeor(wA, wB, m);
- cc.ldeor(xA, xB, m);
- cc.ldeora(wA, wB, m);
- cc.ldeora(xA, xB, m);
- cc.ldeorab(wA, wB, m);
- cc.ldeorah(wA, wB, m);
- cc.ldeoral(wA, wB, m);
- cc.ldeoral(xA, xB, m);
- cc.ldeoralb(wA, wB, m);
- cc.ldeoralh(wA, wB, m);
- cc.ldeorb(wA, wB, m);
- cc.ldeorh(wA, wB, m);
- cc.ldeorl(wA, wB, m);
- cc.ldeorl(xA, xB, m);
- cc.ldeorlb(wA, wB, m);
- cc.ldeorlh(wA, wB, m);
- cc.ldlar(wA, m);
- cc.ldlar(xA, m);
- cc.ldlarb(wA, m);
- cc.ldlarh(wA, m);
- cc.ldnp(wA, wB, m);
- cc.ldnp(xA, xB, m);
- cc.ldp(wA, wB, m);
- cc.ldp(xA, xB, m);
- cc.ldpsw(xA, xB, m);
- cc.ldr(wA, m);
- cc.ldr(xA, m);
- cc.ldrb(wA, m);
- cc.ldrh(wA, m);
- cc.ldrsw(xA, m);
- cc.ldraa(xA, m);
- cc.ldrab(xA, m);
- cc.ldset(wA, wB, m);
- cc.ldset(xA, xB, m);
- cc.ldseta(wA, wB, m);
- cc.ldseta(xA, xB, m);
- cc.ldsetab(wA, wB, m);
- cc.ldsetah(wA, wB, m);
- cc.ldsetal(wA, wB, m);
- cc.ldsetal(xA, xB, m);
- cc.ldsetalh(wA, wB, m);
- cc.ldsetalb(wA, wB, m);
- cc.ldsetb(wA, wB, m);
- cc.ldseth(wA, wB, m);
- cc.ldsetl(wA, wB, m);
- cc.ldsetl(xA, xB, m);
- cc.ldsetlb(wA, wB, m);
- cc.ldsetlh(wA, wB, m);
- cc.ldsmax(wA, wB, m);
- cc.ldsmax(xA, xB, m);
- cc.ldsmaxa(wA, wB, m);
- cc.ldsmaxa(xA, xB, m);
- cc.ldsmaxab(wA, wB, m);
- cc.ldsmaxah(wA, wB, m);
- cc.ldsmaxal(wA, wB, m);
- cc.ldsmaxal(xA, xB, m);
- cc.ldsmaxalb(wA, wB, m);
- cc.ldsmaxalh(wA, wB, m);
- cc.ldsmaxb(wA, wB, m);
- cc.ldsmaxh(wA, wB, m);
- cc.ldsmaxl(wA, wB, m);
- cc.ldsmaxl(xA, xB, m);
- cc.ldsmaxlb(wA, wB, m);
- cc.ldsmaxlh(wA, wB, m);
- cc.ldsmin(wA, wB, m);
- cc.ldsmin(xA, xB, m);
- cc.ldsmina(wA, wB, m);
- cc.ldsmina(xA, xB, m);
- cc.ldsminab(wA, wB, m);
- cc.ldsminah(wA, wB, m);
- cc.ldsminal(wA, wB, m);
- cc.ldsminal(xA, xB, m);
- cc.ldsminalb(wA, wB, m);
- cc.ldsminalh(wA, wB, m);
- cc.ldsminb(wA, wB, m);
- cc.ldsminh(wA, wB, m);
- cc.ldsminl(wA, wB, m);
- cc.ldsminl(xA, xB, m);
- cc.ldsminlb(wA, wB, m);
- cc.ldsminlh(wA, wB, m);
- cc.ldtr(wA, m);
- cc.ldtr(xA, m);
- cc.ldtrb(wA, m);
- cc.ldtrh(wA, m);
- cc.ldtrsb(wA, m);
- cc.ldtrsh(wA, m);
- cc.ldtrsw(xA, m);
- cc.ldumax(wA, wB, m);
- cc.ldumax(xA, xB, m);
- cc.ldumaxa(wA, wB, m);
- cc.ldumaxa(xA, xB, m);
- cc.ldumaxab(wA, wB, m);
- cc.ldumaxah(wA, wB, m);
- cc.ldumaxal(wA, wB, m);
- cc.ldumaxal(xA, xB, m);
- cc.ldumaxalb(wA, wB, m);
- cc.ldumaxalh(wA, wB, m);
- cc.ldumaxb(wA, wB, m);
- cc.ldumaxh(wA, wB, m);
- cc.ldumaxl(wA, wB, m);
- cc.ldumaxl(xA, xB, m);
- cc.ldumaxlb(wA, wB, m);
- cc.ldumaxlh(wA, wB, m);
- cc.ldumin(wA, wB, m);
- cc.ldumin(xA, xB, m);
- cc.ldumina(wA, wB, m);
- cc.ldumina(xA, xB, m);
- cc.lduminab(wA, wB, m);
- cc.lduminah(wA, wB, m);
- cc.lduminal(wA, wB, m);
- cc.lduminal(xA, xB, m);
- cc.lduminalb(wA, wB, m);
- cc.lduminalh(wA, wB, m);
- cc.lduminb(wA, wB, m);
- cc.lduminh(wA, wB, m);
- cc.lduminl(wA, wB, m);
- cc.lduminl(xA, xB, m);
- cc.lduminlb(wA, wB, m);
- cc.lduminlh(wA, wB, m);
- cc.ldur(wA, m);
- cc.ldur(xA, m);
- cc.ldurb(wA, m);
- cc.ldurh(wA, m);
- cc.ldursb(wA, m);
- cc.ldursh(wA, m);
- cc.ldursw(xA, m);
- cc.ldxp(wA, wB, m);
- cc.ldxp(xA, xB, m);
- cc.ldxr(wA, m);
- cc.ldxr(xA, m);
- cc.ldxrb(wA, m);
- cc.ldxrh(wA, m);
- cc.lsl(wA, wB, wC);
- cc.lsl(xA, xB, xC);
- cc.lsl(wA, wB, 15);
- cc.lsl(xA, xB, 15);
- cc.lslv(wA, wB, wC);
- cc.lslv(xA, xB, xC);
- cc.lsr(wA, wB, wC);
- cc.lsr(xA, xB, xC);
- cc.lsr(wA, wB, 15);
- cc.lsr(xA, xB, 15);
- cc.lsrv(wA, wB, wC);
- cc.lsrv(xA, xB, xC);
- cc.madd(wA, wB, wC, wD);
- cc.madd(xA, xB, xC, xD);
- cc.mneg(wA, wB, wC);
- cc.mneg(xA, xB, xC);
- cc.mov(wA, wB);
- cc.mov(xA, xB);
- cc.mov(wA, 0);
- cc.mov(wA, 1);
- cc.mov(wA, 2);
- cc.mov(wA, 3);
- cc.mov(wA, 4);
- cc.mov(wA, 5);
- cc.mov(wA, 6);
- cc.mov(wA, 7);
- cc.mov(wA, 8);
- cc.mov(wA, 9);
- cc.mov(wA, 10);
- cc.mov(wA, 0xA234);
- cc.mov(xA, 0xA23400000000);
- cc.msub(wA, wB, wC, wD);
- cc.msub(xA, xB, xC, xD);
- cc.mul(wA, wB, wC);
- cc.mul(xA, xB, xC);
- cc.mvn(wA, wB);
- cc.mvn(xA, xB);
- cc.mvn(wA, wB, lsl(4));
- cc.mvn(xA, xB, lsl(4));
- cc.neg(wA, wB);
- cc.neg(xA, xB);
- cc.neg(wA, wB, lsl(4));
- cc.neg(xA, xB, lsl(4));
- cc.negs(wA, wB);
- cc.negs(xA, xB);
- cc.negs(wA, wB, lsl(4));
- cc.negs(xA, xB, lsl(4));
- cc.ngc(wA, wB);
- cc.ngc(xA, xB);
- cc.ngcs(wA, wB);
- cc.ngcs(xA, xB);
- cc.orn(wA, wB, wC);
- cc.orn(xA, xB, xC);
- cc.orn(wA, wB, wC, lsl(4));
- cc.orn(xA, xB, xC, lsl(4));
- cc.orr(wA, wB, wC);
- cc.orr(xA, xB, xC);
- cc.orr(wA, wB, wC, lsl(4));
- cc.orr(xA, xB, xC, lsl(4));
- cc.orr(wA, wB, 0x4000);
- cc.orr(xA, xB, 0x8000);
- cc.rbit(wA, wB);
- cc.rbit(xA, xB);
- cc.rev(wA, wB);
- cc.rev(xA, xB);
- cc.rev16(wA, wB);
- cc.rev16(xA, xB);
- cc.rev32(xA, xB);
- cc.rev64(xA, xB);
- cc.ror(wA, wB, wC);
- cc.ror(xA, xB, xC);
- cc.ror(wA, wB, 15);
- cc.ror(xA, xB, 15);
- cc.rorv(wA, wB, wC);
- cc.rorv(xA, xB, xC);
- cc.sbc(wA, wB, wC);
- cc.sbc(xA, xB, xC);
- cc.sbcs(wA, wB, wC);
- cc.sbcs(xA, xB, xC);
- cc.sbfiz(wA, wB, 5, 10);
- cc.sbfiz(xA, xB, 5, 10);
- cc.sbfm(wA, wB, 5, 10);
- cc.sbfm(xA, xB, 5, 10);
- cc.sbfx(wA, wB, 5, 10);
- cc.sbfx(xA, xB, 5, 10);
- cc.sdiv(wA, wB, wC);
- cc.sdiv(xA, xB, xC);
- cc.smaddl(xA, wB, wC, xD);
- cc.smnegl(xA, wB, wC);
- cc.smsubl(xA, wB, wC, xD);
- cc.smulh(xA, xB, xC);
- cc.smull(xA, wB, wC);
- cc.stp(wA, wB, m);
- cc.stp(xA, xB, m);
- cc.sttr(wA, m);
- cc.sttr(xA, m);
- cc.sttrb(wA, m);
- cc.sttrh(wA, m);
- cc.stur(wA, m);
- cc.stur(xA, m);
- cc.sturb(wA, m);
- cc.sturh(wA, m);
- cc.stxp(wA, wB, wC, m);
- cc.stxp(wA, xB, xC, m);
- cc.stxr(wA, wB, m);
- cc.stxr(wA, xB, m);
- cc.stxrb(wA, wB, m);
- cc.stxrh(wA, wB, m);
- cc.sub(wA, wB, wC);
- cc.sub(xA, xB, xC);
- cc.sub(wA, wB, wC, lsl(3));
- cc.sub(xA, xB, xC, lsl(3));
- cc.subg(xA, xB, 32, 11);
- cc.subp(xA, xB, xC);
- cc.subps(xA, xB, xC);
- cc.subs(wA, wB, wC);
- cc.subs(xA, xB, xC);
- cc.subs(wA, wB, wC, lsl(3));
- cc.subs(xA, xB, xC, lsl(3));
- cc.sxtb(wA, wB);
- cc.sxtb(xA, wB);
- cc.sxth(wA, wB);
- cc.sxth(xA, wB);
- cc.sxtw(xA, wB);
- cc.tst(wA, 1);
- cc.tst(xA, 1);
- cc.tst(wA, wB);
- cc.tst(xA, xB);
- cc.tst(wA, wB, lsl(4));
- cc.tst(xA, xB, lsl(4));
- cc.udiv(wA, wB, wC);
- cc.udiv(xA, xB, xC);
- cc.ubfiz(wA, wB, 5, 10);
- cc.ubfiz(xA, xB, 5, 10);
- cc.ubfm(wA, wB, 5, 10);
- cc.ubfm(xA, xB, 5, 10);
- cc.ubfx(wA, wB, 5, 10);
- cc.ubfx(xA, xB, 5, 10);
- cc.umaddl(xA, wB, wC, xD);
- cc.umnegl(xA, wB, wC);
- cc.umsubl(xA, wB, wC, xD);
- cc.umulh(xA, xB, xC);
- cc.umull(xA, wB, wC);
- cc.uxtb(wA, wB);
- cc.uxth(wA, wB);
-}
-
-static void generateGpSequence(BaseEmitter& emitter, bool emitPrologEpilog) {
- if (emitter.isAssembler()) {
- a64::Assembler& cc = *emitter.as<a64::Assembler>();
-
- a64::Gp a = a64::x0;
- a64::Gp b = a64::x1;
- a64::Gp c = a64::x2;
- a64::Gp d = a64::x3;
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(a, b, c, d);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateGpSequenceInternal(cc, a, b, c, d);
- cc.emitEpilog(frame);
- }
- else {
- generateGpSequenceInternal(cc, a, b, c, d);
- }
- }
-#ifndef ASMJIT_NO_BUILDER
- else if (emitter.isBuilder()) {
- a64::Builder& cc = *emitter.as<a64::Builder>();
-
- a64::Gp a = a64::x0;
- a64::Gp b = a64::x1;
- a64::Gp c = a64::x2;
- a64::Gp d = a64::x3;
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(a, b, c, d);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateGpSequenceInternal(cc, a, b, c, d);
- cc.emitEpilog(frame);
- }
- else {
- generateGpSequenceInternal(cc, a, b, c, d);
- }
- }
-#endif
-#ifndef ASMJIT_NO_COMPILER
- else if (emitter.isCompiler()) {
- a64::Compiler& cc = *emitter.as<a64::Compiler>();
-
- a64::Gp a = cc.newIntPtr("a");
- a64::Gp b = cc.newIntPtr("b");
- a64::Gp c = cc.newIntPtr("c");
- a64::Gp d = cc.newIntPtr("d");
-
- cc.addFunc(FuncSignature::build<void>());
- generateGpSequenceInternal(cc, a, b, c, d);
- cc.endFunc();
- }
-#endif
-}
-
-template<typename EmitterFn>
-static void benchmarkA64Function(Arch arch, uint32_t numIterations, const char* description, const EmitterFn& emitterFn) noexcept {
- CodeHolder code;
- printf("%s:\n", description);
-
- uint32_t instCount = 0;
-
-#ifndef ASMJIT_NO_BUILDER
- instCount = asmjit_perf_utils::calculateInstructionCount<a64::Builder>(code, arch, [&](a64::Builder& cc) {
- emitterFn(cc, false);
- });
-#endif
-
- asmjit_perf_utils::bench<a64::Assembler>(code, arch, numIterations, "[raw]", instCount, [&](a64::Assembler& cc) {
- emitterFn(cc, false);
- });
-
- asmjit_perf_utils::bench<a64::Assembler>(code, arch, numIterations, "[validated]", instCount, [&](a64::Assembler& cc) {
- cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
- emitterFn(cc, false);
- });
-
- asmjit_perf_utils::bench<a64::Assembler>(code, arch, numIterations, "[prolog/epilog]", instCount, [&](a64::Assembler& cc) {
- cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
- emitterFn(cc, true);
- });
-
-#ifndef ASMJIT_NO_BUILDER
- asmjit_perf_utils::bench<a64::Builder>(code, arch, numIterations, "[no-asm]", instCount, [&](a64::Builder& cc) {
- emitterFn(cc, false);
- });
-
- asmjit_perf_utils::bench<a64::Builder>(code, arch, numIterations, "[finalized]", instCount, [&](a64::Builder& cc) {
- emitterFn(cc, false);
- cc.finalize();
- });
-
- asmjit_perf_utils::bench<a64::Builder>(code, arch, numIterations, "[prolog/epilog]", instCount, [&](a64::Builder& cc) {
- emitterFn(cc, true);
- cc.finalize();
- });
-#endif
-
-#ifndef ASMJIT_NO_COMPILER
- asmjit_perf_utils::bench<a64::Compiler>(code, arch, numIterations, "[no-asm]", instCount, [&](a64::Compiler& cc) {
- emitterFn(cc, true);
- });
-
- asmjit_perf_utils::bench<a64::Compiler>(code, arch, numIterations, "[finalized]", instCount, [&](a64::Compiler& cc) {
- emitterFn(cc, true);
- cc.finalize();
- });
-#endif
-
- printf("\n");
-}
-
-void benchmarkA64Emitters(uint32_t numIterations) {
- static const char description[] = "GpSequence (Sequence of GP instructions - reg/mem)";
- benchmarkA64Function(Arch::kAArch64, numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateGpSequence(emitter, emitPrologEpilog);
- });
-}
-
-#endif // !ASMJIT_NO_AARCH64
diff --git a/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp b/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp
deleted file mode 100644
index 4ff74818939..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_perf_x86.cpp
+++ /dev/null
@@ -1,5118 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-#if !defined(ASMJIT_NO_X86)
-#include <asmjit/x86.h>
-
-#include <limits>
-#include <stdio.h>
-#include <string.h>
-
-#include "asmjit_test_misc.h"
-#include "asmjit_test_perf.h"
-
-using namespace asmjit;
-
-enum class InstForm {
- kReg,
- kMem
-};
-
-// Generates a long sequence of GP instructions.
-template<typename Emitter>
-static void generateGpSequenceInternal(
- Emitter& cc,
- InstForm form,
- const x86::Gp& a, const x86::Gp& b, const x86::Gp& c, const x86::Gp& d) {
-
- cc.mov(a, 0xAAAAAAAA);
- cc.mov(b, 0xBBBBBBBB);
- cc.mov(c, 0xCCCCCCCC);
- cc.mov(d, 0xFFFFFFFF);
-
- if (form == InstForm::kReg) {
- cc.adc(a, b);
- cc.adc(b, c);
- cc.adc(c, d);
- cc.add(a, b);
- cc.add(b, c);
- cc.add(c, d);
- cc.and_(a, b);
- cc.and_(b, c);
- cc.and_(c, d);
- cc.bsf(a, b);
- cc.bsf(b, c);
- cc.bsf(c, d);
- cc.bsr(a, b);
- cc.bsr(b, c);
- cc.bsr(c, d);
- cc.bswap(a);
- cc.bswap(b);
- cc.bswap(c);
- cc.bt(a, b);
- cc.bt(b, c);
- cc.bt(c, d);
- cc.btc(a, b);
- cc.btc(b, c);
- cc.btc(c, d);
- cc.btr(a, b);
- cc.btr(b, c);
- cc.btr(c, d);
- cc.bts(a, b);
- cc.bts(b, c);
- cc.bts(c, d);
- cc.cmp(a, b);
- cc.cmovc(a, b);
- cc.cmp(b, c);
- cc.cmovc(b, c);
- cc.cmp(c, d);
- cc.cmovc(c, d);
- cc.dec(a);
- cc.dec(b);
- cc.dec(c);
- cc.imul(a, b);
- cc.imul(b, c);
- cc.imul(c, d);
- cc.movsx(a, b.r8Lo());
- cc.movsx(b, c.r8Lo());
- cc.movsx(c, d.r8Lo());
- cc.movzx(a, b.r8Lo());
- cc.movzx(b, c.r8Lo());
- cc.movzx(c, d.r8Lo());
- cc.neg(a);
- cc.neg(b);
- cc.neg(c);
- cc.not_(a);
- cc.not_(b);
- cc.not_(c);
- cc.or_(a, b);
- cc.or_(b, c);
- cc.or_(c, d);
- cc.sbb(a, b);
- cc.sbb(b, c);
- cc.sbb(c, d);
- cc.sub(a, b);
- cc.sub(b, c);
- cc.sub(c, d);
- cc.test(a, b);
- cc.test(b, c);
- cc.test(c, d);
- cc.xchg(a, b);
- cc.xchg(b, c);
- cc.xchg(c, d);
- cc.xor_(a, b);
- cc.xor_(b, c);
- cc.xor_(c, d);
-
- cc.rcl(a, c.r8Lo());
- cc.rcl(b, c.r8Lo());
- cc.rcl(d, c.r8Lo());
- cc.rcr(a, c.r8Lo());
- cc.rcr(b, c.r8Lo());
- cc.rcr(d, c.r8Lo());
- cc.rol(a, c.r8Lo());
- cc.rol(b, c.r8Lo());
- cc.rol(d, c.r8Lo());
- cc.ror(a, c.r8Lo());
- cc.ror(b, c.r8Lo());
- cc.ror(d, c.r8Lo());
- cc.shl(a, c.r8Lo());
- cc.shl(b, c.r8Lo());
- cc.shl(d, c.r8Lo());
- cc.shr(a, c.r8Lo());
- cc.shr(b, c.r8Lo());
- cc.shr(d, c.r8Lo());
- cc.sar(a, c.r8Lo());
- cc.sar(b, c.r8Lo());
- cc.sar(d, c.r8Lo());
- cc.shld(a, b, c.r8Lo());
- cc.shld(b, d, c.r8Lo());
- cc.shld(d, a, c.r8Lo());
- cc.shrd(a, b, c.r8Lo());
- cc.shrd(b, d, c.r8Lo());
- cc.shrd(d, a, c.r8Lo());
-
- cc.adcx(a, b);
- cc.adox(a, b);
- cc.adcx(b, c);
- cc.adox(b, c);
- cc.adcx(c, d);
- cc.adox(c, d);
- cc.andn(a, b, c);
- cc.andn(b, c, d);
- cc.andn(c, d, a);
- cc.bextr(a, b, c);
- cc.bextr(b, c, d);
- cc.bextr(c, d, a);
- cc.blsi(a, b);
- cc.blsi(b, c);
- cc.blsi(c, d);
- cc.blsmsk(a, b);
- cc.blsmsk(b, c);
- cc.blsmsk(c, d);
- cc.blsr(a, b);
- cc.blsr(b, c);
- cc.blsr(c, d);
- cc.bzhi(a, b, c);
- cc.bzhi(b, c, d);
- cc.bzhi(c, d, a);
- cc.lzcnt(a, b);
- cc.lzcnt(b, c);
- cc.lzcnt(c, d);
- cc.pdep(a, b, c);
- cc.pdep(b, c, d);
- cc.pdep(c, d, a);
- cc.pext(a, b, c);
- cc.pext(b, c, d);
- cc.pext(c, d, a);
- cc.popcnt(a, b);
- cc.popcnt(b, c);
- cc.popcnt(c, d);
- cc.rorx(a, b, 8);
- cc.rorx(b, c, 8);
- cc.rorx(c, d, 8);
- cc.sarx(a, b, c);
- cc.sarx(b, c, d);
- cc.sarx(c, d, a);
- cc.shlx(a, b, c);
- cc.shlx(b, c, d);
- cc.shlx(c, d, a);
- cc.shrx(a, b, c);
- cc.shrx(b, c, d);
- cc.shrx(c, d, a);
- cc.tzcnt(a, b);
- cc.tzcnt(b, c);
- cc.tzcnt(c, d);
- }
- else {
- uint32_t regSize = cc.registerSize();
- x86::Mem m = x86::ptr(c, 0, regSize);
- x86::Mem m8 = x86::byte_ptr(c);
-
- cc.adc(a, m);
- cc.adc(b, m);
- cc.adc(c, m);
- cc.add(a, m);
- cc.add(b, m);
- cc.add(c, m);
- cc.and_(a, m);
- cc.and_(b, m);
- cc.and_(c, m);
- cc.bsf(a, m);
- cc.bsf(b, m);
- cc.bsf(c, m);
- cc.bsr(a, m);
- cc.bsr(b, m);
- cc.bsr(c, m);
- cc.bt(m, a);
- cc.bt(m, b);
- cc.bt(m, c);
- cc.btc(m, a);
- cc.btc(m, b);
- cc.btc(m, c);
- cc.btr(m, a);
- cc.btr(m, b);
- cc.btr(m, c);
- cc.bts(m, a);
- cc.bts(m, b);
- cc.bts(m, c);
- cc.cmp(a, m);
- cc.cmovc(a, m);
- cc.cmp(b, m);
- cc.cmovc(b, m);
- cc.cmp(c, m);
- cc.cmovc(c, m);
- cc.dec(m);
- cc.movsx(a, m8);
- cc.movsx(b, m8);
- cc.movsx(c, m8);
- cc.movzx(a, m8);
- cc.movzx(b, m8);
- cc.movzx(c, m8);
- cc.neg(m);
- cc.not_(m);
- cc.or_(a, m);
- cc.or_(b, m);
- cc.or_(c, m);
- cc.sbb(a, m);
- cc.sbb(b, m);
- cc.sbb(c, m);
- cc.sub(a, m);
- cc.sub(b, m);
- cc.sub(c, m);
- cc.test(m, a);
- cc.test(m, b);
- cc.test(m, c);
- cc.xchg(a, m);
- cc.xchg(b, m);
- cc.xchg(c, m);
- cc.xor_(a, m);
- cc.xor_(b, m);
- cc.xor_(c, m);
-
- cc.rcl(m, c.r8Lo());
- cc.rcr(m, c.r8Lo());
- cc.rol(m, c.r8Lo());
- cc.ror(m, c.r8Lo());
- cc.shl(m, c.r8Lo());
- cc.shr(m, c.r8Lo());
- cc.sar(m, c.r8Lo());
- cc.shld(m, b, c.r8Lo());
- cc.shld(m, d, c.r8Lo());
- cc.shld(m, a, c.r8Lo());
- cc.shrd(m, b, c.r8Lo());
- cc.shrd(m, d, c.r8Lo());
- cc.shrd(m, a, c.r8Lo());
-
- cc.adcx(a, m);
- cc.adox(a, m);
- cc.adcx(b, m);
- cc.adox(b, m);
- cc.adcx(c, m);
- cc.adox(c, m);
- cc.andn(a, b, m);
- cc.andn(b, c, m);
- cc.andn(c, d, m);
- cc.bextr(a, m, c);
- cc.bextr(b, m, d);
- cc.bextr(c, m, a);
- cc.blsi(a, m);
- cc.blsi(b, m);
- cc.blsi(c, m);
- cc.blsmsk(a, m);
- cc.blsmsk(b, m);
- cc.blsmsk(c, m);
- cc.blsr(a, m);
- cc.blsr(b, m);
- cc.blsr(c, m);
- cc.bzhi(a, m, c);
- cc.bzhi(b, m, d);
- cc.bzhi(c, m, a);
- cc.lzcnt(a, m);
- cc.lzcnt(b, m);
- cc.lzcnt(c, m);
- cc.pdep(a, b, m);
- cc.pdep(b, c, m);
- cc.pdep(c, d, m);
- cc.pext(a, b, m);
- cc.pext(b, c, m);
- cc.pext(c, d, m);
- cc.popcnt(a, m);
- cc.popcnt(b, m);
- cc.popcnt(c, m);
- cc.rorx(a, m, 8);
- cc.rorx(b, m, 8);
- cc.rorx(c, m, 8);
- cc.sarx(a, m, c);
- cc.sarx(b, m, d);
- cc.sarx(c, m, a);
- cc.shlx(a, m, c);
- cc.shlx(b, m, d);
- cc.shlx(c, m, a);
- cc.shrx(a, m, c);
- cc.shrx(b, m, d);
- cc.shrx(c, m, a);
- cc.tzcnt(a, m);
- cc.tzcnt(b, m);
- cc.tzcnt(c, m);
- }
-}
-
-static void generateGpSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
- using namespace asmjit::x86;
-
- if (emitter.isAssembler()) {
- Assembler& cc = *emitter.as<Assembler>();
-
- x86::Gp a = cc.zax();
- x86::Gp b = cc.zbx();
- x86::Gp c = cc.zcx();
- x86::Gp d = cc.zdx();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(a, b, c, d);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateGpSequenceInternal(cc, form, a, b, c, d);
- cc.emitEpilog(frame);
- }
- else {
- generateGpSequenceInternal(cc, form, a, b, c, d);
- }
- }
-#ifndef ASMJIT_NO_BUILDER
- else if (emitter.isBuilder()) {
- Builder& cc = *emitter.as<Builder>();
-
- x86::Gp a = cc.zax();
- x86::Gp b = cc.zbx();
- x86::Gp c = cc.zcx();
- x86::Gp d = cc.zdx();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(a, b, c, d);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateGpSequenceInternal(cc, form, a, b, c, d);
- cc.emitEpilog(frame);
- }
- else {
- generateGpSequenceInternal(cc, form, a, b, c, d);
- }
- }
-#endif
-#ifndef ASMJIT_NO_COMPILER
- else if (emitter.isCompiler()) {
- Compiler& cc = *emitter.as<Compiler>();
-
- Gp a = cc.newIntPtr("a");
- Gp b = cc.newIntPtr("b");
- Gp c = cc.newIntPtr("c");
- Gp d = cc.newIntPtr("d");
-
- cc.addFunc(FuncSignature::build<void>());
- generateGpSequenceInternal(cc, form, a, b, c, d);
- cc.endFunc();
- }
-#endif
-}
-
-// Generates a long sequence of SSE instructions using only registers.
-template<typename Emitter>
-static void generateSseSequenceInternal(
- Emitter& cc,
- InstForm form,
- const x86::Gp& gp,
- const x86::Xmm& xmmA, const x86::Xmm& xmmB, const x86::Xmm& xmmC, const x86::Xmm& xmmD) {
-
- x86::Gp gpd = gp.r32();
- x86::Gp gpq = gp.r64();
- x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
-
- cc.xor_(gpd, gpd);
- cc.xorps(xmmA, xmmA);
- cc.xorps(xmmB, xmmB);
- cc.xorps(xmmC, xmmC);
- cc.xorps(xmmD, xmmD);
-
- if (form == InstForm::kReg) {
- // SSE.
- cc.addps(xmmA, xmmB);
- cc.addss(xmmA, xmmB);
- cc.andnps(xmmA, xmmB);
- cc.andps(xmmA, xmmB);
- cc.cmpps(xmmA, xmmB, 0);
- cc.cmpss(xmmA, xmmB, 0);
- cc.comiss(xmmA, xmmB);
- cc.cvtsi2ss(xmmA, gpd);
- cc.cvtsi2ss(xmmA, gpz);
- cc.cvtss2si(gpd, xmmB);
- cc.cvtss2si(gpz, xmmB);
- cc.cvttss2si(gpd, xmmB);
- cc.cvttss2si(gpz, xmmB);
- cc.divps(xmmA, xmmB);
- cc.divss(xmmA, xmmB);
- cc.maxps(xmmA, xmmB);
- cc.maxss(xmmA, xmmB);
- cc.minps(xmmA, xmmB);
- cc.minss(xmmA, xmmB);
- cc.movaps(xmmA, xmmB);
- cc.movd(gpd, xmmB);
- cc.movd(xmmA, gpd);
- cc.movq(xmmA, xmmB);
- cc.movhlps(xmmA, xmmB);
- cc.movlhps(xmmA, xmmB);
- cc.movups(xmmA, xmmB);
- cc.mulps(xmmA, xmmB);
- cc.mulss(xmmA, xmmB);
- cc.orps(xmmA, xmmB);
- cc.rcpps(xmmA, xmmB);
- cc.rcpss(xmmA, xmmB);
- cc.psadbw(xmmA, xmmB);
- cc.rsqrtps(xmmA, xmmB);
- cc.rsqrtss(xmmA, xmmB);
- cc.sfence();
- cc.shufps(xmmA, xmmB, 0);
- cc.sqrtps(xmmA, xmmB);
- cc.sqrtss(xmmA, xmmB);
- cc.subps(xmmA, xmmB);
- cc.subss(xmmA, xmmB);
- cc.ucomiss(xmmA, xmmB);
- cc.unpckhps(xmmA, xmmB);
- cc.unpcklps(xmmA, xmmB);
- cc.xorps(xmmA, xmmB);
-
- // SSE2.
- cc.addpd(xmmA, xmmB);
- cc.addsd(xmmA, xmmB);
- cc.andnpd(xmmA, xmmB);
- cc.andpd(xmmA, xmmB);
- cc.cmppd(xmmA, xmmB, 0);
- cc.cmpsd(xmmA, xmmB, 0);
- cc.comisd(xmmA, xmmB);
- cc.cvtdq2pd(xmmA, xmmB);
- cc.cvtdq2ps(xmmA, xmmB);
- cc.cvtpd2dq(xmmA, xmmB);
- cc.cvtpd2ps(xmmA, xmmB);
- cc.cvtps2dq(xmmA, xmmB);
- cc.cvtps2pd(xmmA, xmmB);
- cc.cvtsd2si(gpd, xmmB);
- cc.cvtsd2si(gpz, xmmB);
- cc.cvtsd2ss(xmmA, xmmB);
- cc.cvtsi2sd(xmmA, gpd);
- cc.cvtsi2sd(xmmA, gpz);
- cc.cvtss2sd(xmmA, xmmB);
- cc.cvtss2si(gpd, xmmB);
- cc.cvtss2si(gpz, xmmB);
- cc.cvttpd2dq(xmmA, xmmB);
- cc.cvttps2dq(xmmA, xmmB);
- cc.cvttsd2si(gpd, xmmB);
- cc.cvttsd2si(gpz, xmmB);
- cc.divpd(xmmA, xmmB);
- cc.divsd(xmmA, xmmB);
- cc.maxpd(xmmA, xmmB);
- cc.maxsd(xmmA, xmmB);
- cc.minpd(xmmA, xmmB);
- cc.minsd(xmmA, xmmB);
- cc.movdqa(xmmA, xmmB);
- cc.movdqu(xmmA, xmmB);
- cc.movmskps(gpd, xmmB);
- cc.movmskpd(gpd, xmmB);
- cc.movsd(xmmA, xmmB);
- cc.mulpd(xmmA, xmmB);
- cc.mulsd(xmmA, xmmB);
- cc.orpd(xmmA, xmmB);
- cc.packsswb(xmmA, xmmB);
- cc.packssdw(xmmA, xmmB);
- cc.packuswb(xmmA, xmmB);
- cc.paddb(xmmA, xmmB);
- cc.paddw(xmmA, xmmB);
- cc.paddd(xmmA, xmmB);
- cc.paddq(xmmA, xmmB);
- cc.paddsb(xmmA, xmmB);
- cc.paddsw(xmmA, xmmB);
- cc.paddusb(xmmA, xmmB);
- cc.paddusw(xmmA, xmmB);
- cc.pand(xmmA, xmmB);
- cc.pandn(xmmA, xmmB);
- cc.pavgb(xmmA, xmmB);
- cc.pavgw(xmmA, xmmB);
- cc.pcmpeqb(xmmA, xmmB);
- cc.pcmpeqw(xmmA, xmmB);
- cc.pcmpeqd(xmmA, xmmB);
- cc.pcmpgtb(xmmA, xmmB);
- cc.pcmpgtw(xmmA, xmmB);
- cc.pcmpgtd(xmmA, xmmB);
- cc.pmaxsw(xmmA, xmmB);
- cc.pmaxub(xmmA, xmmB);
- cc.pminsw(xmmA, xmmB);
- cc.pminub(xmmA, xmmB);
- cc.pmovmskb(gpd, xmmB);
- cc.pmulhw(xmmA, xmmB);
- cc.pmulhuw(xmmA, xmmB);
- cc.pmullw(xmmA, xmmB);
- cc.pmuludq(xmmA, xmmB);
- cc.por(xmmA, xmmB);
- cc.pslld(xmmA, xmmB);
- cc.pslld(xmmA, 0);
- cc.psllq(xmmA, xmmB);
- cc.psllq(xmmA, 0);
- cc.psllw(xmmA, xmmB);
- cc.psllw(xmmA, 0);
- cc.pslldq(xmmA, 0);
- cc.psrad(xmmA, xmmB);
- cc.psrad(xmmA, 0);
- cc.psraw(xmmA, xmmB);
- cc.psraw(xmmA, 0);
- cc.psubb(xmmA, xmmB);
- cc.psubw(xmmA, xmmB);
- cc.psubd(xmmA, xmmB);
- cc.psubq(xmmA, xmmB);
- cc.pmaddwd(xmmA, xmmB);
- cc.pshufd(xmmA, xmmB, 0);
- cc.pshufhw(xmmA, xmmB, 0);
- cc.pshuflw(xmmA, xmmB, 0);
- cc.psrld(xmmA, xmmB);
- cc.psrld(xmmA, 0);
- cc.psrlq(xmmA, xmmB);
- cc.psrlq(xmmA, 0);
- cc.psrldq(xmmA, 0);
- cc.psrlw(xmmA, xmmB);
- cc.psrlw(xmmA, 0);
- cc.psubsb(xmmA, xmmB);
- cc.psubsw(xmmA, xmmB);
- cc.psubusb(xmmA, xmmB);
- cc.psubusw(xmmA, xmmB);
- cc.punpckhbw(xmmA, xmmB);
- cc.punpckhwd(xmmA, xmmB);
- cc.punpckhdq(xmmA, xmmB);
- cc.punpckhqdq(xmmA, xmmB);
- cc.punpcklbw(xmmA, xmmB);
- cc.punpcklwd(xmmA, xmmB);
- cc.punpckldq(xmmA, xmmB);
- cc.punpcklqdq(xmmA, xmmB);
- cc.pxor(xmmA, xmmB);
- cc.sqrtpd(xmmA, xmmB);
- cc.sqrtsd(xmmA, xmmB);
- cc.subpd(xmmA, xmmB);
- cc.subsd(xmmA, xmmB);
- cc.ucomisd(xmmA, xmmB);
- cc.unpckhpd(xmmA, xmmB);
- cc.unpcklpd(xmmA, xmmB);
- cc.xorpd(xmmA, xmmB);
-
- // SSE3.
- cc.addsubpd(xmmA, xmmB);
- cc.addsubps(xmmA, xmmB);
- cc.haddpd(xmmA, xmmB);
- cc.haddps(xmmA, xmmB);
- cc.hsubpd(xmmA, xmmB);
- cc.hsubps(xmmA, xmmB);
- cc.movddup(xmmA, xmmB);
- cc.movshdup(xmmA, xmmB);
- cc.movsldup(xmmA, xmmB);
-
- // SSSE3.
- cc.psignb(xmmA, xmmB);
- cc.psignw(xmmA, xmmB);
- cc.psignd(xmmA, xmmB);
- cc.phaddw(xmmA, xmmB);
- cc.phaddd(xmmA, xmmB);
- cc.phaddsw(xmmA, xmmB);
- cc.phsubw(xmmA, xmmB);
- cc.phsubd(xmmA, xmmB);
- cc.phsubsw(xmmA, xmmB);
- cc.pmaddubsw(xmmA, xmmB);
- cc.pabsb(xmmA, xmmB);
- cc.pabsw(xmmA, xmmB);
- cc.pabsd(xmmA, xmmB);
- cc.pmulhrsw(xmmA, xmmB);
- cc.pshufb(xmmA, xmmB);
- cc.palignr(xmmA, xmmB, 0);
-
- // SSE4.1.
- cc.blendpd(xmmA, xmmB, 0);
- cc.blendps(xmmA, xmmB, 0);
- cc.blendvpd(xmmA, xmmB, xmmA);
- cc.blendvps(xmmA, xmmB, xmmA);
-
- cc.dppd(xmmA, xmmB, 0);
- cc.dpps(xmmA, xmmB, 0);
- cc.extractps(gpd, xmmB, 0);
- cc.insertps(xmmA, xmmB, 0);
- cc.mpsadbw(xmmA, xmmB, 0);
- cc.packusdw(xmmA, xmmB);
- cc.pblendvb(xmmA, xmmB, xmmA);
- cc.pblendw(xmmA, xmmB, 0);
- cc.pcmpeqq(xmmA, xmmB);
- cc.pextrb(gpd, xmmB, 0);
- cc.pextrd(gpd, xmmB, 0);
- if (cc.is64Bit()) cc.pextrq(gpq, xmmB, 0);
- cc.pextrw(gpd, xmmB, 0);
- cc.phminposuw(xmmA, xmmB);
- cc.pinsrb(xmmA, gpd, 0);
- cc.pinsrd(xmmA, gpd, 0);
- cc.pinsrw(xmmA, gpd, 0);
- cc.pmaxuw(xmmA, xmmB);
- cc.pmaxsb(xmmA, xmmB);
- cc.pmaxsd(xmmA, xmmB);
- cc.pmaxud(xmmA, xmmB);
- cc.pminsb(xmmA, xmmB);
- cc.pminuw(xmmA, xmmB);
- cc.pminud(xmmA, xmmB);
- cc.pminsd(xmmA, xmmB);
- cc.pmovsxbw(xmmA, xmmB);
- cc.pmovsxbd(xmmA, xmmB);
- cc.pmovsxbq(xmmA, xmmB);
- cc.pmovsxwd(xmmA, xmmB);
- cc.pmovsxwq(xmmA, xmmB);
- cc.pmovsxdq(xmmA, xmmB);
- cc.pmovzxbw(xmmA, xmmB);
- cc.pmovzxbd(xmmA, xmmB);
- cc.pmovzxbq(xmmA, xmmB);
- cc.pmovzxwd(xmmA, xmmB);
- cc.pmovzxwq(xmmA, xmmB);
- cc.pmovzxdq(xmmA, xmmB);
- cc.pmuldq(xmmA, xmmB);
- cc.pmulld(xmmA, xmmB);
- cc.ptest(xmmA, xmmB);
- cc.roundps(xmmA, xmmB, 0);
- cc.roundss(xmmA, xmmB, 0);
- cc.roundpd(xmmA, xmmB, 0);
- cc.roundsd(xmmA, xmmB, 0);
- }
- else {
- x86::Mem m = x86::ptr(gpz);
-
- cc.addps(xmmA, m);
- cc.addss(xmmA, m);
- cc.andnps(xmmA, m);
- cc.andps(xmmA, m);
- cc.cmpps(xmmA, m, 0);
- cc.cmpss(xmmA, m, 0);
- cc.comiss(xmmA, m);
- cc.cvtpi2ps(xmmA, m);
- cc.cvtsi2ss(xmmA, m);
- cc.cvtss2si(gpd, m);
- cc.cvtss2si(gpz, m);
- cc.cvttss2si(gpd, m);
- cc.cvttss2si(gpz, m);
- cc.divps(xmmA, m);
- cc.divss(xmmA, m);
- cc.maxps(xmmA, m);
- cc.maxss(xmmA, m);
- cc.minps(xmmA, m);
- cc.minss(xmmA, m);
- cc.movaps(xmmA, m);
- cc.movaps(m, xmmB);
- cc.movd(m, xmmB);
- cc.movd(xmmA, m);
- cc.movq(m, xmmB);
- cc.movq(xmmA, m);
- cc.movhps(xmmA, m);
- cc.movhps(m, xmmB);
- cc.movlps(xmmA, m);
- cc.movlps(m, xmmB);
- cc.movntps(m, xmmB);
- cc.movss(xmmA, m);
- cc.movss(m, xmmB);
- cc.movups(xmmA, m);
- cc.movups(m, xmmB);
- cc.mulps(xmmA, m);
- cc.mulss(xmmA, m);
- cc.orps(xmmA, m);
- cc.rcpps(xmmA, m);
- cc.rcpss(xmmA, m);
- cc.psadbw(xmmA, m);
- cc.rsqrtps(xmmA, m);
- cc.rsqrtss(xmmA, m);
- cc.shufps(xmmA, m, 0);
- cc.sqrtps(xmmA, m);
- cc.sqrtss(xmmA, m);
- cc.stmxcsr(m);
- cc.subps(xmmA, m);
- cc.subss(xmmA, m);
- cc.ucomiss(xmmA, m);
- cc.unpckhps(xmmA, m);
- cc.unpcklps(xmmA, m);
- cc.xorps(xmmA, m);
-
- // SSE2.
- cc.addpd(xmmA, m);
- cc.addsd(xmmA, m);
- cc.andnpd(xmmA, m);
- cc.andpd(xmmA, m);
- cc.cmppd(xmmA, m, 0);
- cc.cmpsd(xmmA, m, 0);
- cc.comisd(xmmA, m);
- cc.cvtdq2pd(xmmA, m);
- cc.cvtdq2ps(xmmA, m);
- cc.cvtpd2dq(xmmA, m);
- cc.cvtpd2ps(xmmA, m);
- cc.cvtpi2pd(xmmA, m);
- cc.cvtps2dq(xmmA, m);
- cc.cvtps2pd(xmmA, m);
- cc.cvtsd2si(gpd, m);
- cc.cvtsd2si(gpz, m);
- cc.cvtsd2ss(xmmA, m);
- cc.cvtsi2sd(xmmA, m);
- cc.cvtss2sd(xmmA, m);
- cc.cvtss2si(gpd, m);
- cc.cvtss2si(gpz, m);
- cc.cvttpd2dq(xmmA, m);
- cc.cvttps2dq(xmmA, m);
- cc.cvttsd2si(gpd, m);
- cc.cvttsd2si(gpz, m);
- cc.divpd(xmmA, m);
- cc.divsd(xmmA, m);
- cc.maxpd(xmmA, m);
- cc.maxsd(xmmA, m);
- cc.minpd(xmmA, m);
- cc.minsd(xmmA, m);
- cc.movdqa(xmmA, m);
- cc.movdqa(m, xmmB);
- cc.movdqu(xmmA, m);
- cc.movdqu(m, xmmB);
- cc.movsd(xmmA, m);
- cc.movsd(m, xmmB);
- cc.movapd(xmmA, m);
- cc.movapd(m, xmmB);
- cc.movhpd(xmmA, m);
- cc.movhpd(m, xmmB);
- cc.movlpd(xmmA, m);
- cc.movlpd(m, xmmB);
- cc.movntdq(m, xmmB);
- cc.movntpd(m, xmmB);
- cc.movupd(xmmA, m);
- cc.movupd(m, xmmB);
- cc.mulpd(xmmA, m);
- cc.mulsd(xmmA, m);
- cc.orpd(xmmA, m);
- cc.packsswb(xmmA, m);
- cc.packssdw(xmmA, m);
- cc.packuswb(xmmA, m);
- cc.paddb(xmmA, m);
- cc.paddw(xmmA, m);
- cc.paddd(xmmA, m);
- cc.paddq(xmmA, m);
- cc.paddsb(xmmA, m);
- cc.paddsw(xmmA, m);
- cc.paddusb(xmmA, m);
- cc.paddusw(xmmA, m);
- cc.pand(xmmA, m);
- cc.pandn(xmmA, m);
- cc.pavgb(xmmA, m);
- cc.pavgw(xmmA, m);
- cc.pcmpeqb(xmmA, m);
- cc.pcmpeqw(xmmA, m);
- cc.pcmpeqd(xmmA, m);
- cc.pcmpgtb(xmmA, m);
- cc.pcmpgtw(xmmA, m);
- cc.pcmpgtd(xmmA, m);
- cc.pmaxsw(xmmA, m);
- cc.pmaxub(xmmA, m);
- cc.pminsw(xmmA, m);
- cc.pminub(xmmA, m);
- cc.pmulhw(xmmA, m);
- cc.pmulhuw(xmmA, m);
- cc.pmullw(xmmA, m);
- cc.pmuludq(xmmA, m);
- cc.por(xmmA, m);
- cc.pslld(xmmA, m);
- cc.psllq(xmmA, m);
- cc.psllw(xmmA, m);
- cc.psrad(xmmA, m);
- cc.psraw(xmmA, m);
- cc.psubb(xmmA, m);
- cc.psubw(xmmA, m);
- cc.psubd(xmmA, m);
- cc.psubq(xmmA, m);
- cc.pmaddwd(xmmA, m);
- cc.pshufd(xmmA, m, 0);
- cc.pshufhw(xmmA, m, 0);
- cc.pshuflw(xmmA, m, 0);
- cc.psrld(xmmA, m);
- cc.psrlq(xmmA, m);
- cc.psrlw(xmmA, m);
- cc.psubsb(xmmA, m);
- cc.psubsw(xmmA, m);
- cc.psubusb(xmmA, m);
- cc.psubusw(xmmA, m);
- cc.punpckhbw(xmmA, m);
- cc.punpckhwd(xmmA, m);
- cc.punpckhdq(xmmA, m);
- cc.punpckhqdq(xmmA, m);
- cc.punpcklbw(xmmA, m);
- cc.punpcklwd(xmmA, m);
- cc.punpckldq(xmmA, m);
- cc.punpcklqdq(xmmA, m);
- cc.pxor(xmmA, m);
- cc.sqrtpd(xmmA, m);
- cc.sqrtsd(xmmA, m);
- cc.subpd(xmmA, m);
- cc.subsd(xmmA, m);
- cc.ucomisd(xmmA, m);
- cc.unpckhpd(xmmA, m);
- cc.unpcklpd(xmmA, m);
- cc.xorpd(xmmA, m);
-
- // SSE3.
- cc.addsubpd(xmmA, m);
- cc.addsubps(xmmA, m);
- cc.haddpd(xmmA, m);
- cc.haddps(xmmA, m);
- cc.hsubpd(xmmA, m);
- cc.hsubps(xmmA, m);
- cc.lddqu(xmmA, m);
- cc.movddup(xmmA, m);
- cc.movshdup(xmmA, m);
- cc.movsldup(xmmA, m);
-
- // SSSE3.
- cc.psignb(xmmA, m);
- cc.psignw(xmmA, m);
- cc.psignd(xmmA, m);
- cc.phaddw(xmmA, m);
- cc.phaddd(xmmA, m);
- cc.phaddsw(xmmA, m);
- cc.phsubw(xmmA, m);
- cc.phsubd(xmmA, m);
- cc.phsubsw(xmmA, m);
- cc.pmaddubsw(xmmA, m);
- cc.pabsb(xmmA, m);
- cc.pabsw(xmmA, m);
- cc.pabsd(xmmA, m);
- cc.pmulhrsw(xmmA, m);
- cc.pshufb(xmmA, m);
- cc.palignr(xmmA, m, 0);
-
- // SSE4.1.
- cc.blendpd(xmmA, m, 0);
- cc.blendps(xmmA, m, 0);
- cc.blendvpd(xmmA, m, xmmA);
- cc.blendvps(xmmA, m, xmmA);
-
- cc.dppd(xmmA, m, 0);
- cc.dpps(xmmA, m, 0);
- cc.extractps(m, xmmB, 0);
- cc.insertps(xmmA, m, 0);
- cc.movntdqa(xmmA, m);
- cc.mpsadbw(xmmA, m, 0);
- cc.packusdw(xmmA, m);
- cc.pblendvb(xmmA, m, xmmA);
- cc.pblendw(xmmA, m, 0);
- cc.pcmpeqq(xmmA, m);
- cc.pextrb(m, xmmB, 0);
- cc.pextrd(m, xmmB, 0);
- if (cc.is64Bit()) cc.pextrq(m, xmmB, 0);
- cc.pextrw(m, xmmB, 0);
- cc.phminposuw(xmmA, m);
- cc.pinsrb(xmmA, m, 0);
- cc.pinsrd(xmmA, m, 0);
- cc.pinsrw(xmmA, m, 0);
- cc.pmaxuw(xmmA, m);
- cc.pmaxsb(xmmA, m);
- cc.pmaxsd(xmmA, m);
- cc.pmaxud(xmmA, m);
- cc.pminsb(xmmA, m);
- cc.pminuw(xmmA, m);
- cc.pminud(xmmA, m);
- cc.pminsd(xmmA, m);
- cc.pmovsxbw(xmmA, m);
- cc.pmovsxbd(xmmA, m);
- cc.pmovsxbq(xmmA, m);
- cc.pmovsxwd(xmmA, m);
- cc.pmovsxwq(xmmA, m);
- cc.pmovsxdq(xmmA, m);
- cc.pmovzxbw(xmmA, m);
- cc.pmovzxbd(xmmA, m);
- cc.pmovzxbq(xmmA, m);
- cc.pmovzxwd(xmmA, m);
- cc.pmovzxwq(xmmA, m);
- cc.pmovzxdq(xmmA, m);
- cc.pmuldq(xmmA, m);
- cc.pmulld(xmmA, m);
- cc.ptest(xmmA, m);
- cc.roundps(xmmA, m, 0);
- cc.roundss(xmmA, m, 0);
- cc.roundpd(xmmA, m, 0);
- cc.roundsd(xmmA, m, 0);
-
- // SSE4.2.
- cc.pcmpgtq(xmmA, m);
- }
-}
-
-static void generateSseSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
- using namespace asmjit::x86;
-
- if (emitter.isAssembler()) {
- Assembler& cc = *emitter.as<Assembler>();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(eax, xmm0, xmm1, xmm2, xmm3);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
- cc.emitEpilog(frame);
- }
- else {
- generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
- }
- }
-#ifndef ASMJIT_NO_BUILDER
- else if (emitter.isBuilder()) {
- Builder& cc = *emitter.as<Builder>();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(eax, xmm0, xmm1, xmm2, xmm3);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
- cc.emitEpilog(frame);
- }
- else {
- generateSseSequenceInternal(cc, form, eax, xmm0, xmm1, xmm2, xmm3);
- }
- }
-#endif
-#ifndef ASMJIT_NO_COMPILER
- else if (emitter.isCompiler()) {
- Compiler& cc = *emitter.as<Compiler>();
-
- Gp gp = cc.newGpz("gp");
- Xmm a = cc.newXmm("a");
- Xmm b = cc.newXmm("b");
- Xmm c = cc.newXmm("c");
- Xmm d = cc.newXmm("d");
-
- cc.addFunc(FuncSignature::build<void>());
- generateSseSequenceInternal(cc, form, gp, a, b, c, d);
- cc.endFunc();
- }
-#endif
-}
-
-// Generates a long sequence of AVX instructions.
-template<typename Emitter>
-static void generateAvxSequenceInternalRegOnly(
- Emitter& cc,
- const x86::Gp& gp,
- const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
-
- x86::Gp gpd = gp.r32();
- x86::Gp gpq = gp.r64();
- x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
-
- x86::Xmm xmmA = vecA.xmm();
- x86::Xmm xmmB = vecB.xmm();
- x86::Xmm xmmC = vecC.xmm();
- x86::Xmm xmmD = vecD.xmm();
-
- x86::Ymm ymmA = vecA.ymm();
- x86::Ymm ymmB = vecB.ymm();
- x86::Ymm ymmC = vecC.ymm();
-
- cc.xor_(gpd, gpd);
- cc.vxorps(xmmA, xmmA, xmmA);
- cc.vxorps(xmmB, xmmB, xmmB);
- cc.vxorps(xmmC, xmmC, xmmC);
- cc.vxorps(xmmD, xmmD, xmmD);
-
- cc.vaddpd(xmmA, xmmB, xmmC);
- cc.vaddpd(ymmA, ymmB, ymmC);
- cc.vaddps(xmmA, xmmB, xmmC);
- cc.vaddps(ymmA, ymmB, ymmC);
- cc.vaddsd(xmmA, xmmB, xmmC);
- cc.vaddss(xmmA, xmmB, xmmC);
- cc.vaddsubpd(xmmA, xmmB, xmmC);
- cc.vaddsubpd(ymmA, ymmB, ymmC);
- cc.vaddsubps(xmmA, xmmB, xmmC);
- cc.vaddsubps(ymmA, ymmB, ymmC);
- cc.vandpd(xmmA, xmmB, xmmC);
- cc.vandpd(ymmA, ymmB, ymmC);
- cc.vandps(xmmA, xmmB, xmmC);
- cc.vandps(ymmA, ymmB, ymmC);
- cc.vandnpd(xmmA, xmmB, xmmC);
- cc.vandnpd(ymmA, ymmB, ymmC);
- cc.vandnps(xmmA, xmmB, xmmC);
- cc.vandnps(ymmA, ymmB, ymmC);
- cc.vblendpd(xmmA, xmmB, xmmC, 0);
- cc.vblendpd(ymmA, ymmB, ymmC, 0);
- cc.vblendps(xmmA, xmmB, xmmC, 0);
- cc.vblendps(ymmA, ymmB, ymmC, 0);
- cc.vblendvpd(xmmA, xmmB, xmmC, xmmA);
- cc.vblendvpd(ymmA, ymmB, ymmC, ymmA);
- cc.vcmppd(xmmA, xmmB, xmmC, 0);
- cc.vcmppd(ymmA, ymmB, ymmC, 0);
- cc.vcmpps(xmmA, xmmB, xmmC, 0);
- cc.vcmpps(ymmA, ymmB, ymmC, 0);
- cc.vcmpsd(xmmA, xmmB, xmmC, 0);
- cc.vcmpss(xmmA, xmmB, xmmC, 0);
- cc.vcomisd(xmmA, xmmB);
- cc.vcomiss(xmmA, xmmB);
- cc.vcvtdq2pd(xmmA, xmmB);
- cc.vcvtdq2pd(ymmA, xmmB);
- cc.vcvtdq2ps(xmmA, xmmB);
- cc.vcvtdq2ps(ymmA, ymmB);
- cc.vcvtpd2dq(xmmA, xmmB);
- cc.vcvtpd2dq(xmmA, ymmB);
- cc.vcvtpd2ps(xmmA, xmmB);
- cc.vcvtpd2ps(xmmA, ymmB);
- cc.vcvtps2dq(xmmA, xmmB);
- cc.vcvtps2dq(ymmA, ymmB);
- cc.vcvtps2pd(xmmA, xmmB);
- cc.vcvtps2pd(ymmA, xmmB);
- cc.vcvtsd2si(gpd, xmmB);
- cc.vcvtsd2si(gpz, xmmB);
- cc.vcvtsd2ss(xmmA, xmmB, xmmC);
- cc.vcvtsi2sd(xmmA, xmmB, gpd);
- cc.vcvtsi2sd(xmmA, xmmB, gpz);
- cc.vcvtsi2ss(xmmA, xmmB, gpd);
- cc.vcvtsi2ss(xmmA, xmmB, gpz);
- cc.vcvtss2sd(xmmA, xmmB, xmmC);
- cc.vcvtss2si(gpd, xmmB);
- cc.vcvttpd2dq(xmmA, xmmB);
- cc.vcvttpd2dq(xmmA, ymmB);
- cc.vcvttps2dq(xmmA, xmmB);
- cc.vcvttps2dq(ymmA, ymmB);
- cc.vcvttsd2si(gpd, xmmB);
- cc.vcvttss2si(gpz, xmmB);
- cc.vdivpd(xmmA, xmmB, xmmC);
- cc.vdivpd(ymmA, ymmB, ymmC);
- cc.vdivps(xmmA, xmmB, xmmC);
- cc.vdivps(ymmA, ymmB, ymmC);
- cc.vdivsd(xmmA, xmmB, xmmC);
- cc.vdivss(xmmA, xmmB, xmmC);
- cc.vdppd(xmmA, xmmB, xmmC, 0);
- cc.vdpps(xmmA, xmmB, xmmC, 0);
- cc.vdpps(ymmA, ymmB, ymmC, 0);
- cc.vextractf128(xmmA, ymmB, 0);
- cc.vextractps(gpd, xmmB, 0);
- cc.vhaddpd(xmmA, xmmB, xmmC);
- cc.vhaddpd(ymmA, ymmB, ymmC);
- cc.vhaddps(xmmA, xmmB, xmmC);
- cc.vhaddps(ymmA, ymmB, ymmC);
- cc.vhsubpd(xmmA, xmmB, xmmC);
- cc.vhsubpd(ymmA, ymmB, ymmC);
- cc.vhsubps(xmmA, xmmB, xmmC);
- cc.vhsubps(ymmA, ymmB, ymmC);
- cc.vinsertf128(ymmA, ymmB, xmmC, 0);
- cc.vinsertps(xmmA, xmmB, xmmC, 0);
- cc.vmaxpd(xmmA, xmmB, xmmC);
- cc.vmaxpd(ymmA, ymmB, ymmC);
- cc.vmaxps(xmmA, xmmB, xmmC);
- cc.vmaxps(ymmA, ymmB, ymmC);
- cc.vmaxsd(xmmA, xmmB, xmmC);
- cc.vmaxss(xmmA, xmmB, xmmC);
- cc.vminpd(xmmA, xmmB, xmmC);
- cc.vminpd(ymmA, ymmB, ymmC);
- cc.vminps(xmmA, xmmB, xmmC);
- cc.vminps(ymmA, ymmB, ymmC);
- cc.vminsd(xmmA, xmmB, xmmC);
- cc.vminss(xmmA, xmmB, xmmC);
- cc.vmovapd(xmmA, xmmB);
- cc.vmovapd(ymmA, ymmB);
- cc.vmovaps(xmmA, xmmB);
- cc.vmovaps(ymmA, ymmB);
- cc.vmovd(xmmA, gpd);
- cc.vmovd(gpd, xmmB);
- cc.vmovddup(xmmA, xmmB);
- cc.vmovddup(ymmA, ymmB);
- cc.vmovdqa(xmmA, xmmB);
- cc.vmovdqa(ymmA, ymmB);
- cc.vmovdqu(xmmA, xmmB);
- cc.vmovdqu(ymmA, ymmB);
- cc.vmovhlps(xmmA, xmmB, xmmC);
- cc.vmovlhps(xmmA, xmmB, xmmC);
- cc.vmovmskpd(gpd, xmmB);
- cc.vmovmskpd(gpd, ymmB);
- cc.vmovmskps(gpd, xmmB);
- cc.vmovmskps(gpd, ymmB);
- cc.vmovsd(xmmA, xmmB, xmmC);
- cc.vmovshdup(xmmA, xmmB);
- cc.vmovshdup(ymmA, ymmB);
- cc.vmovsldup(xmmA, xmmB);
- cc.vmovsldup(ymmA, ymmB);
- cc.vmovss(xmmA, xmmB, xmmC);
- cc.vmovupd(xmmA, xmmB);
- cc.vmovupd(ymmA, ymmB);
- cc.vmovups(xmmA, xmmB);
- cc.vmovups(ymmA, ymmB);
- cc.vmpsadbw(xmmA, xmmB, xmmC, 0);
- cc.vmulpd(xmmA, xmmB, xmmC);
- cc.vmulpd(ymmA, ymmB, ymmC);
- cc.vmulps(xmmA, xmmB, xmmC);
- cc.vmulps(ymmA, ymmB, ymmC);
- cc.vmulsd(xmmA, xmmB, xmmC);
- cc.vmulss(xmmA, xmmB, xmmC);
- cc.vorpd(xmmA, xmmB, xmmC);
- cc.vorpd(ymmA, ymmB, ymmC);
- cc.vorps(xmmA, xmmB, xmmC);
- cc.vorps(ymmA, ymmB, ymmC);
- cc.vpabsb(xmmA, xmmB);
- cc.vpabsd(xmmA, xmmB);
- cc.vpabsw(xmmA, xmmB);
- cc.vpackssdw(xmmA, xmmB, xmmC);
- cc.vpacksswb(xmmA, xmmB, xmmC);
- cc.vpackusdw(xmmA, xmmB, xmmC);
- cc.vpackuswb(xmmA, xmmB, xmmC);
- cc.vpaddb(xmmA, xmmB, xmmC);
- cc.vpaddd(xmmA, xmmB, xmmC);
- cc.vpaddq(xmmA, xmmB, xmmC);
- cc.vpaddw(xmmA, xmmB, xmmC);
- cc.vpaddsb(xmmA, xmmB, xmmC);
- cc.vpaddsw(xmmA, xmmB, xmmC);
- cc.vpaddusb(xmmA, xmmB, xmmC);
- cc.vpaddusw(xmmA, xmmB, xmmC);
- cc.vpalignr(xmmA, xmmB, xmmC, 0);
- cc.vpand(xmmA, xmmB, xmmC);
- cc.vpandn(xmmA, xmmB, xmmC);
- cc.vpavgb(xmmA, xmmB, xmmC);
- cc.vpavgw(xmmA, xmmB, xmmC);
- cc.vpblendvb(xmmA, xmmB, xmmC, xmmA);
- cc.vpblendw(xmmA, xmmB, xmmC, 0);
- cc.vpcmpeqb(xmmA, xmmB, xmmC);
- cc.vpcmpeqd(xmmA, xmmB, xmmC);
- cc.vpcmpeqq(xmmA, xmmB, xmmC);
- cc.vpcmpeqw(xmmA, xmmB, xmmC);
- cc.vpcmpgtb(xmmA, xmmB, xmmC);
- cc.vpcmpgtd(xmmA, xmmB, xmmC);
- cc.vpcmpgtq(xmmA, xmmB, xmmC);
- cc.vpcmpgtw(xmmA, xmmB, xmmC);
- cc.vpermilpd(xmmA, xmmB, xmmC);
- cc.vpermilpd(ymmA, ymmB, ymmC);
- cc.vpermilpd(xmmA, xmmB, 0);
- cc.vpermilpd(ymmA, ymmB, 0);
- cc.vpermilps(xmmA, xmmB, xmmC);
- cc.vpermilps(ymmA, ymmB, ymmC);
- cc.vpermilps(xmmA, xmmB, 0);
- cc.vpermilps(ymmA, ymmB, 0);
- cc.vperm2f128(ymmA, ymmB, ymmC, 0);
- cc.vpextrb(gpd, xmmB, 0);
- cc.vpextrd(gpd, xmmB, 0);
- if (cc.is64Bit()) cc.vpextrq(gpq, xmmB, 0);
- cc.vpextrw(gpd, xmmB, 0);
- cc.vphaddd(xmmA, xmmB, xmmC);
- cc.vphaddsw(xmmA, xmmB, xmmC);
- cc.vphaddw(xmmA, xmmB, xmmC);
- cc.vphminposuw(xmmA, xmmB);
- cc.vphsubd(xmmA, xmmB, xmmC);
- cc.vphsubsw(xmmA, xmmB, xmmC);
- cc.vphsubw(xmmA, xmmB, xmmC);
- cc.vpinsrb(xmmA, xmmB, gpd, 0);
- cc.vpinsrd(xmmA, xmmB, gpd, 0);
- cc.vpinsrw(xmmA, xmmB, gpd, 0);
- cc.vpmaddubsw(xmmA, xmmB, xmmC);
- cc.vpmaddwd(xmmA, xmmB, xmmC);
- cc.vpmaxsb(xmmA, xmmB, xmmC);
- cc.vpmaxsd(xmmA, xmmB, xmmC);
- cc.vpmaxsw(xmmA, xmmB, xmmC);
- cc.vpmaxub(xmmA, xmmB, xmmC);
- cc.vpmaxud(xmmA, xmmB, xmmC);
- cc.vpmaxuw(xmmA, xmmB, xmmC);
- cc.vpminsb(xmmA, xmmB, xmmC);
- cc.vpminsd(xmmA, xmmB, xmmC);
- cc.vpminsw(xmmA, xmmB, xmmC);
- cc.vpminub(xmmA, xmmB, xmmC);
- cc.vpminud(xmmA, xmmB, xmmC);
- cc.vpminuw(xmmA, xmmB, xmmC);
- cc.vpmovmskb(gpd, xmmB);
- cc.vpmovsxbd(xmmA, xmmB);
- cc.vpmovsxbq(xmmA, xmmB);
- cc.vpmovsxbw(xmmA, xmmB);
- cc.vpmovsxdq(xmmA, xmmB);
- cc.vpmovsxwd(xmmA, xmmB);
- cc.vpmovsxwq(xmmA, xmmB);
- cc.vpmovzxbd(xmmA, xmmB);
- cc.vpmovzxbq(xmmA, xmmB);
- cc.vpmovzxbw(xmmA, xmmB);
- cc.vpmovzxdq(xmmA, xmmB);
- cc.vpmovzxwd(xmmA, xmmB);
- cc.vpmovzxwq(xmmA, xmmB);
- cc.vpmuldq(xmmA, xmmB, xmmC);
- cc.vpmulhrsw(xmmA, xmmB, xmmC);
- cc.vpmulhuw(xmmA, xmmB, xmmC);
- cc.vpmulhw(xmmA, xmmB, xmmC);
- cc.vpmulld(xmmA, xmmB, xmmC);
- cc.vpmullw(xmmA, xmmB, xmmC);
- cc.vpmuludq(xmmA, xmmB, xmmC);
- cc.vpor(xmmA, xmmB, xmmC);
- cc.vpsadbw(xmmA, xmmB, xmmC);
- cc.vpshufb(xmmA, xmmB, xmmC);
- cc.vpshufd(xmmA, xmmB, 0);
- cc.vpshufhw(xmmA, xmmB, 0);
- cc.vpshuflw(xmmA, xmmB, 0);
- cc.vpsignb(xmmA, xmmB, xmmC);
- cc.vpsignd(xmmA, xmmB, xmmC);
- cc.vpsignw(xmmA, xmmB, xmmC);
- cc.vpslld(xmmA, xmmB, xmmC);
- cc.vpslld(xmmA, xmmB, 0);
- cc.vpslldq(xmmA, xmmB, 0);
- cc.vpsllq(xmmA, xmmB, xmmC);
- cc.vpsllq(xmmA, xmmB, 0);
- cc.vpsllw(xmmA, xmmB, xmmC);
- cc.vpsllw(xmmA, xmmB, 0);
- cc.vpsrad(xmmA, xmmB, xmmC);
- cc.vpsrad(xmmA, xmmB, 0);
- cc.vpsraw(xmmA, xmmB, xmmC);
- cc.vpsraw(xmmA, xmmB, 0);
- cc.vpsrld(xmmA, xmmB, xmmC);
- cc.vpsrld(xmmA, xmmB, 0);
- cc.vpsrldq(xmmA, xmmB, 0);
- cc.vpsrlq(xmmA, xmmB, xmmC);
- cc.vpsrlq(xmmA, xmmB, 0);
- cc.vpsrlw(xmmA, xmmB, xmmC);
- cc.vpsrlw(xmmA, xmmB, 0);
- cc.vpsubb(xmmA, xmmB, xmmC);
- cc.vpsubd(xmmA, xmmB, xmmC);
- cc.vpsubq(xmmA, xmmB, xmmC);
- cc.vpsubw(xmmA, xmmB, xmmC);
- cc.vpsubsb(xmmA, xmmB, xmmC);
- cc.vpsubsw(xmmA, xmmB, xmmC);
- cc.vpsubusb(xmmA, xmmB, xmmC);
- cc.vpsubusw(xmmA, xmmB, xmmC);
- cc.vptest(xmmA, xmmB);
- cc.vptest(ymmA, ymmB);
- cc.vpunpckhbw(xmmA, xmmB, xmmC);
- cc.vpunpckhdq(xmmA, xmmB, xmmC);
- cc.vpunpckhqdq(xmmA, xmmB, xmmC);
- cc.vpunpckhwd(xmmA, xmmB, xmmC);
- cc.vpunpcklbw(xmmA, xmmB, xmmC);
- cc.vpunpckldq(xmmA, xmmB, xmmC);
- cc.vpunpcklqdq(xmmA, xmmB, xmmC);
- cc.vpunpcklwd(xmmA, xmmB, xmmC);
- cc.vpxor(xmmA, xmmB, xmmC);
- cc.vrcpps(xmmA, xmmB);
- cc.vrcpps(ymmA, ymmB);
- cc.vrcpss(xmmA, xmmB, xmmC);
- cc.vrsqrtps(xmmA, xmmB);
- cc.vrsqrtps(ymmA, ymmB);
- cc.vrsqrtss(xmmA, xmmB, xmmC);
- cc.vroundpd(xmmA, xmmB, 0);
- cc.vroundpd(ymmA, ymmB, 0);
- cc.vroundps(xmmA, xmmB, 0);
- cc.vroundps(ymmA, ymmB, 0);
- cc.vroundsd(xmmA, xmmB, xmmC, 0);
- cc.vroundss(xmmA, xmmB, xmmC, 0);
- cc.vshufpd(xmmA, xmmB, xmmC, 0);
- cc.vshufpd(ymmA, ymmB, ymmC, 0);
- cc.vshufps(xmmA, xmmB, xmmC, 0);
- cc.vshufps(ymmA, ymmB, ymmC, 0);
- cc.vsqrtpd(xmmA, xmmB);
- cc.vsqrtpd(ymmA, ymmB);
- cc.vsqrtps(xmmA, xmmB);
- cc.vsqrtps(ymmA, ymmB);
- cc.vsqrtsd(xmmA, xmmB, xmmC);
- cc.vsqrtss(xmmA, xmmB, xmmC);
- cc.vsubpd(xmmA, xmmB, xmmC);
- cc.vsubpd(ymmA, ymmB, ymmC);
- cc.vsubps(xmmA, xmmB, xmmC);
- cc.vsubps(ymmA, ymmB, ymmC);
- cc.vsubsd(xmmA, xmmB, xmmC);
- cc.vsubss(xmmA, xmmB, xmmC);
- cc.vtestps(xmmA, xmmB);
- cc.vtestps(ymmA, ymmB);
- cc.vtestpd(xmmA, xmmB);
- cc.vtestpd(ymmA, ymmB);
- cc.vucomisd(xmmA, xmmB);
- cc.vucomiss(xmmA, xmmB);
- cc.vunpckhpd(xmmA, xmmB, xmmC);
- cc.vunpckhpd(ymmA, ymmB, ymmC);
- cc.vunpckhps(xmmA, xmmB, xmmC);
- cc.vunpckhps(ymmA, ymmB, ymmC);
- cc.vunpcklpd(xmmA, xmmB, xmmC);
- cc.vunpcklpd(ymmA, ymmB, ymmC);
- cc.vunpcklps(xmmA, xmmB, xmmC);
- cc.vunpcklps(ymmA, ymmB, ymmC);
- cc.vxorpd(xmmA, xmmB, xmmC);
- cc.vxorpd(ymmA, ymmB, ymmC);
- cc.vxorps(xmmA, xmmB, xmmC);
- cc.vxorps(ymmA, ymmB, ymmC);
-
- // AVX+AESNI.
- cc.vaesdec(xmmA, xmmB, xmmC);
- cc.vaesdeclast(xmmA, xmmB, xmmC);
- cc.vaesenc(xmmA, xmmB, xmmC);
- cc.vaesenclast(xmmA, xmmB, xmmC);
- cc.vaesimc(xmmA, xmmB);
- cc.vaeskeygenassist(xmmA, xmmB, 0);
-
- // AVX+PCLMULQDQ.
- cc.vpclmulqdq(xmmA, xmmB, xmmC, 0);
-
- // AVX2.
- cc.vbroadcastsd(ymmA, xmmB);
- cc.vbroadcastss(xmmA, xmmB);
- cc.vbroadcastss(ymmA, xmmB);
- cc.vextracti128(xmmA, ymmB, 0);
- cc.vinserti128(ymmA, ymmB, xmmC, 0);
- cc.vmpsadbw(ymmA, ymmB, ymmC, 0);
- cc.vpabsb(ymmA, ymmB);
- cc.vpabsd(ymmA, ymmB);
- cc.vpabsw(ymmA, ymmB);
- cc.vpackssdw(ymmA, ymmB, ymmC);
- cc.vpacksswb(ymmA, ymmB, ymmC);
- cc.vpackusdw(ymmA, ymmB, ymmC);
- cc.vpackuswb(ymmA, ymmB, ymmC);
- cc.vpaddb(ymmA, ymmB, ymmC);
- cc.vpaddd(ymmA, ymmB, ymmC);
- cc.vpaddq(ymmA, ymmB, ymmC);
- cc.vpaddw(ymmA, ymmB, ymmC);
- cc.vpaddsb(ymmA, ymmB, ymmC);
- cc.vpaddsw(ymmA, ymmB, ymmC);
- cc.vpaddusb(ymmA, ymmB, ymmC);
- cc.vpaddusw(ymmA, ymmB, ymmC);
- cc.vpalignr(ymmA, ymmB, ymmC, 0);
- cc.vpand(ymmA, ymmB, ymmC);
- cc.vpandn(ymmA, ymmB, ymmC);
- cc.vpavgb(ymmA, ymmB, ymmC);
- cc.vpavgw(ymmA, ymmB, ymmC);
- cc.vpblendd(xmmA, xmmB, xmmC, 0);
- cc.vpblendd(ymmA, ymmB, ymmC, 0);
- cc.vpblendvb(ymmA, ymmB, ymmC, ymmA);
- cc.vpblendw(ymmA, ymmB, ymmC, 0);
- cc.vpbroadcastb(xmmA, xmmB);
- cc.vpbroadcastb(ymmA, xmmB);
- cc.vpbroadcastd(xmmA, xmmB);
- cc.vpbroadcastd(ymmA, xmmB);
- cc.vpbroadcastq(xmmA, xmmB);
- cc.vpbroadcastq(ymmA, xmmB);
- cc.vpbroadcastw(xmmA, xmmB);
- cc.vpbroadcastw(ymmA, xmmB);
- cc.vpcmpeqb(ymmA, ymmB, ymmC);
- cc.vpcmpeqd(ymmA, ymmB, ymmC);
- cc.vpcmpeqq(ymmA, ymmB, ymmC);
- cc.vpcmpeqw(ymmA, ymmB, ymmC);
- cc.vpcmpgtb(ymmA, ymmB, ymmC);
- cc.vpcmpgtd(ymmA, ymmB, ymmC);
- cc.vpcmpgtq(ymmA, ymmB, ymmC);
- cc.vpcmpgtw(ymmA, ymmB, ymmC);
- cc.vperm2i128(ymmA, ymmB, ymmC, 0);
- cc.vpermd(ymmA, ymmB, ymmC);
- cc.vpermps(ymmA, ymmB, ymmC);
- cc.vpermpd(ymmA, ymmB, 0);
- cc.vpermq(ymmA, ymmB, 0);
- cc.vpmovmskb(gpd, ymmB);
- cc.vpmovsxbd(ymmA, xmmB);
- cc.vpmovsxbq(ymmA, xmmB);
- cc.vpmovsxbw(ymmA, xmmB);
- cc.vpmovsxdq(ymmA, xmmB);
- cc.vpmovsxwd(ymmA, xmmB);
- cc.vpmovsxwq(ymmA, xmmB);
- cc.vpmovzxbd(ymmA, xmmB);
- cc.vpmovzxbq(ymmA, xmmB);
- cc.vpmovzxbw(ymmA, xmmB);
- cc.vpmovzxdq(ymmA, xmmB);
- cc.vpmovzxwd(ymmA, xmmB);
- cc.vpmovzxwq(ymmA, xmmB);
- cc.vpshufd(ymmA, ymmB, 0);
- cc.vpshufhw(ymmA, ymmB, 0);
- cc.vpshuflw(ymmA, ymmB, 0);
- cc.vpslld(ymmA, ymmB, 0);
- cc.vpslldq(ymmA, ymmB, 0);
- cc.vpsllq(ymmA, ymmB, 0);
- cc.vpsllw(ymmA, ymmB, 0);
- cc.vpsrad(ymmA, ymmB, 0);
- cc.vpsraw(ymmA, ymmB, 0);
- cc.vpsrld(ymmA, ymmB, 0);
- cc.vpsrldq(ymmA, ymmB, 0);
- cc.vpsrlq(ymmA, ymmB, 0);
- cc.vpsrlw(ymmA, ymmB, 0);
- cc.vphaddd(ymmA, ymmB, ymmC);
- cc.vphaddsw(ymmA, ymmB, ymmC);
- cc.vphaddw(ymmA, ymmB, ymmC);
- cc.vphsubd(ymmA, ymmB, ymmC);
- cc.vphsubsw(ymmA, ymmB, ymmC);
- cc.vphsubw(ymmA, ymmB, ymmC);
- cc.vpmaddubsw(ymmA, ymmB, ymmC);
- cc.vpmaddwd(ymmA, ymmB, ymmC);
- cc.vpmaxsb(ymmA, ymmB, ymmC);
- cc.vpmaxsd(ymmA, ymmB, ymmC);
- cc.vpmaxsw(ymmA, ymmB, ymmC);
- cc.vpmaxub(ymmA, ymmB, ymmC);
- cc.vpmaxud(ymmA, ymmB, ymmC);
- cc.vpmaxuw(ymmA, ymmB, ymmC);
- cc.vpminsb(ymmA, ymmB, ymmC);
- cc.vpminsd(ymmA, ymmB, ymmC);
- cc.vpminsw(ymmA, ymmB, ymmC);
- cc.vpminub(ymmA, ymmB, ymmC);
- cc.vpminud(ymmA, ymmB, ymmC);
- cc.vpminuw(ymmA, ymmB, ymmC);
- cc.vpmuldq(ymmA, ymmB, ymmC);
- cc.vpmulhrsw(ymmA, ymmB, ymmC);
- cc.vpmulhuw(ymmA, ymmB, ymmC);
- cc.vpmulhw(ymmA, ymmB, ymmC);
- cc.vpmulld(ymmA, ymmB, ymmC);
- cc.vpmullw(ymmA, ymmB, ymmC);
- cc.vpmuludq(ymmA, ymmB, ymmC);
- cc.vpor(ymmA, ymmB, ymmC);
- cc.vpsadbw(ymmA, ymmB, ymmC);
- cc.vpshufb(ymmA, ymmB, ymmC);
- cc.vpsignb(ymmA, ymmB, ymmC);
- cc.vpsignd(ymmA, ymmB, ymmC);
- cc.vpsignw(ymmA, ymmB, ymmC);
- cc.vpslld(ymmA, ymmB, xmmC);
- cc.vpsllq(ymmA, ymmB, xmmC);
- cc.vpsllvd(xmmA, xmmB, xmmC);
- cc.vpsllvd(ymmA, ymmB, ymmC);
- cc.vpsllvq(xmmA, xmmB, xmmC);
- cc.vpsllvq(ymmA, ymmB, ymmC);
- cc.vpsllw(ymmA, ymmB, xmmC);
- cc.vpsrad(ymmA, ymmB, xmmC);
- cc.vpsravd(xmmA, xmmB, xmmC);
- cc.vpsravd(ymmA, ymmB, ymmC);
- cc.vpsraw(ymmA, ymmB, xmmC);
- cc.vpsrld(ymmA, ymmB, xmmC);
- cc.vpsrlq(ymmA, ymmB, xmmC);
- cc.vpsrlvd(xmmA, xmmB, xmmC);
- cc.vpsrlvd(ymmA, ymmB, ymmC);
- cc.vpsrlvq(xmmA, xmmB, xmmC);
- cc.vpsrlvq(ymmA, ymmB, ymmC);
- cc.vpsrlw(ymmA, ymmB, xmmC);
- cc.vpsubb(ymmA, ymmB, ymmC);
- cc.vpsubd(ymmA, ymmB, ymmC);
- cc.vpsubq(ymmA, ymmB, ymmC);
- cc.vpsubsb(ymmA, ymmB, ymmC);
- cc.vpsubsw(ymmA, ymmB, ymmC);
- cc.vpsubusb(ymmA, ymmB, ymmC);
- cc.vpsubusw(ymmA, ymmB, ymmC);
- cc.vpsubw(ymmA, ymmB, ymmC);
- cc.vpunpckhbw(ymmA, ymmB, ymmC);
- cc.vpunpckhdq(ymmA, ymmB, ymmC);
- cc.vpunpckhqdq(ymmA, ymmB, ymmC);
- cc.vpunpckhwd(ymmA, ymmB, ymmC);
- cc.vpunpcklbw(ymmA, ymmB, ymmC);
- cc.vpunpckldq(ymmA, ymmB, ymmC);
- cc.vpunpcklqdq(ymmA, ymmB, ymmC);
- cc.vpunpcklwd(ymmA, ymmB, ymmC);
- cc.vpxor(ymmA, ymmB, ymmC);
-
- // FMA.
- cc.vfmadd132pd(xmmA, xmmB, xmmC);
- cc.vfmadd132pd(ymmA, ymmB, ymmC);
- cc.vfmadd132ps(xmmA, xmmB, xmmC);
- cc.vfmadd132ps(ymmA, ymmB, ymmC);
- cc.vfmadd132sd(xmmA, xmmB, xmmC);
- cc.vfmadd132ss(xmmA, xmmB, xmmC);
- cc.vfmadd213pd(xmmA, xmmB, xmmC);
- cc.vfmadd213pd(ymmA, ymmB, ymmC);
- cc.vfmadd213ps(xmmA, xmmB, xmmC);
- cc.vfmadd213ps(ymmA, ymmB, ymmC);
- cc.vfmadd213sd(xmmA, xmmB, xmmC);
- cc.vfmadd213ss(xmmA, xmmB, xmmC);
- cc.vfmadd231pd(xmmA, xmmB, xmmC);
- cc.vfmadd231pd(ymmA, ymmB, ymmC);
- cc.vfmadd231ps(xmmA, xmmB, xmmC);
- cc.vfmadd231ps(ymmA, ymmB, ymmC);
- cc.vfmadd231sd(xmmA, xmmB, xmmC);
- cc.vfmadd231ss(xmmA, xmmB, xmmC);
- cc.vfmaddsub132pd(xmmA, xmmB, xmmC);
- cc.vfmaddsub132pd(ymmA, ymmB, ymmC);
- cc.vfmaddsub132ps(xmmA, xmmB, xmmC);
- cc.vfmaddsub132ps(ymmA, ymmB, ymmC);
- cc.vfmaddsub213pd(xmmA, xmmB, xmmC);
- cc.vfmaddsub213pd(ymmA, ymmB, ymmC);
- cc.vfmaddsub213ps(xmmA, xmmB, xmmC);
- cc.vfmaddsub213ps(ymmA, ymmB, ymmC);
- cc.vfmaddsub231pd(xmmA, xmmB, xmmC);
- cc.vfmaddsub231pd(ymmA, ymmB, ymmC);
- cc.vfmaddsub231ps(xmmA, xmmB, xmmC);
- cc.vfmaddsub231ps(ymmA, ymmB, ymmC);
- cc.vfmsub132pd(xmmA, xmmB, xmmC);
- cc.vfmsub132pd(ymmA, ymmB, ymmC);
- cc.vfmsub132ps(xmmA, xmmB, xmmC);
- cc.vfmsub132ps(ymmA, ymmB, ymmC);
- cc.vfmsub132sd(xmmA, xmmB, xmmC);
- cc.vfmsub132ss(xmmA, xmmB, xmmC);
- cc.vfmsub213pd(xmmA, xmmB, xmmC);
- cc.vfmsub213pd(ymmA, ymmB, ymmC);
- cc.vfmsub213ps(xmmA, xmmB, xmmC);
- cc.vfmsub213ps(ymmA, ymmB, ymmC);
- cc.vfmsub213sd(xmmA, xmmB, xmmC);
- cc.vfmsub213ss(xmmA, xmmB, xmmC);
- cc.vfmsub231pd(xmmA, xmmB, xmmC);
- cc.vfmsub231pd(ymmA, ymmB, ymmC);
- cc.vfmsub231ps(xmmA, xmmB, xmmC);
- cc.vfmsub231ps(ymmA, ymmB, ymmC);
- cc.vfmsub231sd(xmmA, xmmB, xmmC);
- cc.vfmsub231ss(xmmA, xmmB, xmmC);
- cc.vfmsubadd132pd(xmmA, xmmB, xmmC);
- cc.vfmsubadd132pd(ymmA, ymmB, ymmC);
- cc.vfmsubadd132ps(xmmA, xmmB, xmmC);
- cc.vfmsubadd132ps(ymmA, ymmB, ymmC);
- cc.vfmsubadd213pd(xmmA, xmmB, xmmC);
- cc.vfmsubadd213pd(ymmA, ymmB, ymmC);
- cc.vfmsubadd213ps(xmmA, xmmB, xmmC);
- cc.vfmsubadd213ps(ymmA, ymmB, ymmC);
- cc.vfmsubadd231pd(xmmA, xmmB, xmmC);
- cc.vfmsubadd231pd(ymmA, ymmB, ymmC);
- cc.vfmsubadd231ps(xmmA, xmmB, xmmC);
- cc.vfmsubadd231ps(ymmA, ymmB, ymmC);
- cc.vfnmadd132pd(xmmA, xmmB, xmmC);
- cc.vfnmadd132pd(ymmA, ymmB, ymmC);
- cc.vfnmadd132ps(xmmA, xmmB, xmmC);
- cc.vfnmadd132ps(ymmA, ymmB, ymmC);
- cc.vfnmadd132sd(xmmA, xmmB, xmmC);
- cc.vfnmadd132ss(xmmA, xmmB, xmmC);
- cc.vfnmadd213pd(xmmA, xmmB, xmmC);
- cc.vfnmadd213pd(ymmA, ymmB, ymmC);
- cc.vfnmadd213ps(xmmA, xmmB, xmmC);
- cc.vfnmadd213ps(ymmA, ymmB, ymmC);
- cc.vfnmadd213sd(xmmA, xmmB, xmmC);
- cc.vfnmadd213ss(xmmA, xmmB, xmmC);
- cc.vfnmadd231pd(xmmA, xmmB, xmmC);
- cc.vfnmadd231pd(ymmA, ymmB, ymmC);
- cc.vfnmadd231ps(xmmA, xmmB, xmmC);
- cc.vfnmadd231ps(ymmA, ymmB, ymmC);
- cc.vfnmadd231sd(xmmA, xmmB, xmmC);
- cc.vfnmadd231ss(xmmA, xmmB, xmmC);
- cc.vfnmsub132pd(xmmA, xmmB, xmmC);
- cc.vfnmsub132pd(ymmA, ymmB, ymmC);
- cc.vfnmsub132ps(xmmA, xmmB, xmmC);
- cc.vfnmsub132ps(ymmA, ymmB, ymmC);
- cc.vfnmsub132sd(xmmA, xmmB, xmmC);
- cc.vfnmsub132ss(xmmA, xmmB, xmmC);
- cc.vfnmsub213pd(xmmA, xmmB, xmmC);
- cc.vfnmsub213pd(ymmA, ymmB, ymmC);
- cc.vfnmsub213ps(xmmA, xmmB, xmmC);
- cc.vfnmsub213ps(ymmA, ymmB, ymmC);
- cc.vfnmsub213sd(xmmA, xmmB, xmmC);
- cc.vfnmsub213ss(xmmA, xmmB, xmmC);
- cc.vfnmsub231pd(xmmA, xmmB, xmmC);
- cc.vfnmsub231pd(ymmA, ymmB, ymmC);
- cc.vfnmsub231ps(xmmA, xmmB, xmmC);
- cc.vfnmsub231ps(ymmA, ymmB, ymmC);
- cc.vfnmsub231sd(xmmA, xmmB, xmmC);
- cc.vfnmsub231ss(xmmA, xmmB, xmmC);
-}
-
-// Generates a long sequence of AVX instructions.
-template<typename Emitter>
-static void generateAvxSequenceInternalRegMem(
- Emitter& cc,
- const x86::Gp& gp,
- const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
-
- x86::Gp gpd = gp.r32();
- x86::Gp gpq = gp.r64();
- x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
-
- x86::Xmm xmmA = vecA.xmm();
- x86::Xmm xmmB = vecB.xmm();
- x86::Xmm xmmC = vecC.xmm();
- x86::Xmm xmmD = vecD.xmm();
-
- x86::Ymm ymmA = vecA.ymm();
- x86::Ymm ymmB = vecB.ymm();
- x86::Ymm ymmC = vecC.ymm();
- x86::Ymm ymmD = vecD.ymm();
-
- x86::Mem m = x86::ptr(gpz);
- x86::Mem m128 = x86::xmmword_ptr(gpz);
- x86::Mem m256 = x86::xmmword_ptr(gpz);
- x86::Mem vx_ptr = x86::ptr(gpz, xmmD);
- x86::Mem vy_ptr = x86::ptr(gpz, ymmD);
-
- cc.xor_(gpd, gpd);
- cc.vxorps(xmmA, xmmA, xmmA);
- cc.vxorps(xmmB, xmmB, xmmB);
- cc.vxorps(xmmC, xmmC, xmmC);
- cc.vxorps(xmmD, xmmD, xmmD);
-
- cc.vaddpd(xmmA, xmmB, m);
- cc.vaddpd(ymmA, ymmB, m);
- cc.vaddps(xmmA, xmmB, m);
- cc.vaddps(ymmA, ymmB, m);
- cc.vaddsd(xmmA, xmmB, m);
- cc.vaddss(xmmA, xmmB, m);
- cc.vaddsubpd(xmmA, xmmB, m);
- cc.vaddsubpd(ymmA, ymmB, m);
- cc.vaddsubps(xmmA, xmmB, m);
- cc.vaddsubps(ymmA, ymmB, m);
- cc.vandpd(xmmA, xmmB, m);
- cc.vandpd(ymmA, ymmB, m);
- cc.vandps(xmmA, xmmB, m);
- cc.vandps(ymmA, ymmB, m);
- cc.vandnpd(xmmA, xmmB, m);
- cc.vandnpd(ymmA, ymmB, m);
- cc.vandnps(xmmA, xmmB, m);
- cc.vandnps(ymmA, ymmB, m);
- cc.vblendpd(xmmA, xmmB, m, 0);
- cc.vblendpd(ymmA, ymmB, m, 0);
- cc.vblendps(xmmA, xmmB, m, 0);
- cc.vblendps(ymmA, ymmB, m, 0);
- cc.vblendvpd(xmmA, xmmB, m, xmmA);
- cc.vblendvpd(ymmA, ymmB, m, ymmA);
- cc.vbroadcastf128(ymmA, m);
- cc.vbroadcastsd(ymmA, m);
- cc.vbroadcastss(xmmA, m);
- cc.vbroadcastss(ymmA, m);
- cc.vcmppd(xmmA, xmmB, m, 0);
- cc.vcmppd(ymmA, ymmB, m, 0);
- cc.vcmpps(xmmA, xmmB, m, 0);
- cc.vcmpps(ymmA, ymmB, m, 0);
- cc.vcmpsd(xmmA, xmmB, m, 0);
- cc.vcmpss(xmmA, xmmB, m, 0);
- cc.vcomisd(xmmA, m);
- cc.vcomiss(xmmA, m);
- cc.vcvtdq2pd(xmmA, m);
- cc.vcvtdq2pd(ymmA, m);
- cc.vcvtdq2ps(xmmA, m);
- cc.vcvtdq2ps(ymmA, m);
- cc.vcvtpd2dq(xmmA, m128);
- cc.vcvtpd2dq(xmmA, m256);
- cc.vcvtpd2ps(xmmA, m128);
- cc.vcvtpd2ps(xmmA, m256);
- cc.vcvtps2dq(xmmA, m);
- cc.vcvtps2dq(ymmA, m);
- cc.vcvtps2pd(xmmA, m);
- cc.vcvtps2pd(ymmA, m);
- cc.vcvtsd2si(gpd, m);
- cc.vcvtsd2ss(xmmA, xmmB, m);
- cc.vcvtsi2sd(xmmA, xmmB, m);
- cc.vcvtsi2ss(xmmA, xmmB, m);
- cc.vcvtss2sd(xmmA, xmmB, m);
- cc.vcvtss2si(gpd, m);
- cc.vcvttpd2dq(xmmA, m128);
- cc.vcvttpd2dq(xmmA, m256);
- cc.vcvttps2dq(xmmA, m);
- cc.vcvttps2dq(ymmA, m);
- cc.vcvttsd2si(gpd, m);
- cc.vcvttss2si(gpd, m);
- cc.vdivpd(xmmA, xmmB, m);
- cc.vdivpd(ymmA, ymmB, m);
- cc.vdivps(xmmA, xmmB, m);
- cc.vdivps(ymmA, ymmB, m);
- cc.vdivsd(xmmA, xmmB, m);
- cc.vdivss(xmmA, xmmB, m);
- cc.vdppd(xmmA, xmmB, m, 0);
- cc.vdpps(xmmA, xmmB, m, 0);
- cc.vdpps(ymmA, ymmB, m, 0);
- cc.vextractf128(m, ymmB, 0);
- cc.vextractps(m, xmmB, 0);
- cc.vhaddpd(xmmA, xmmB, m);
- cc.vhaddpd(ymmA, ymmB, m);
- cc.vhaddps(xmmA, xmmB, m);
- cc.vhaddps(ymmA, ymmB, m);
- cc.vhsubpd(xmmA, xmmB, m);
- cc.vhsubpd(ymmA, ymmB, m);
- cc.vhsubps(xmmA, xmmB, m);
- cc.vhsubps(ymmA, ymmB, m);
- cc.vinsertf128(ymmA, ymmB, m, 0);
- cc.vinsertps(xmmA, xmmB, m, 0);
- cc.vlddqu(xmmA, m);
- cc.vlddqu(ymmA, m);
- cc.vmaskmovps(xmmA, xmmB, m);
- cc.vmaskmovps(ymmA, ymmB, m);
- cc.vmaskmovps(m, xmmB, xmmC);
- cc.vmaskmovps(m, ymmB, ymmC);
- cc.vmaskmovpd(xmmA, xmmB, m);
- cc.vmaskmovpd(ymmA, ymmB, m);
- cc.vmaskmovpd(m, xmmB, xmmC);
- cc.vmaskmovpd(m, ymmB, ymmC);
- cc.vmaxpd(xmmA, xmmB, m);
- cc.vmaxpd(ymmA, ymmB, m);
- cc.vmaxps(xmmA, xmmB, m);
- cc.vmaxps(ymmA, ymmB, m);
- cc.vmaxsd(xmmA, xmmB, m);
- cc.vmaxss(xmmA, xmmB, m);
- cc.vminpd(xmmA, xmmB, m);
- cc.vminpd(ymmA, ymmB, m);
- cc.vminps(xmmA, xmmB, m);
- cc.vminps(ymmA, ymmB, m);
- cc.vminsd(xmmA, xmmB, m);
- cc.vminss(xmmA, xmmB, m);
- cc.vmovapd(xmmA, m);
- cc.vmovapd(m, xmmB);
- cc.vmovapd(ymmA, m);
- cc.vmovapd(m, ymmB);
- cc.vmovaps(xmmA, m);
- cc.vmovaps(m, xmmB);
- cc.vmovaps(ymmA, m);
- cc.vmovaps(m, ymmB);
- cc.vmovd(xmmA, m);
- cc.vmovd(m, xmmB);
- cc.vmovddup(xmmA, m);
- cc.vmovddup(ymmA, m);
- cc.vmovdqa(xmmA, m);
- cc.vmovdqa(m, xmmB);
- cc.vmovdqa(ymmA, m);
- cc.vmovdqa(m, ymmB);
- cc.vmovdqu(xmmA, m);
- cc.vmovdqu(m, xmmB);
- cc.vmovdqu(ymmA, m);
- cc.vmovdqu(m, ymmB);
- cc.vmovhpd(xmmA, xmmB, m);
- cc.vmovhps(xmmA, xmmB, m);
- cc.vmovhps(m, xmmB);
- cc.vmovlpd(xmmA, xmmB, m);
- cc.vmovlpd(m, xmmB);
- cc.vmovlps(xmmA, xmmB, m);
- cc.vmovlps(m, xmmB);
- cc.vmovntdq(m, xmmB);
- cc.vmovntdq(m, ymmB);
- cc.vmovntdqa(xmmA, m);
- cc.vmovntpd(m, xmmB);
- cc.vmovntpd(m, ymmB);
- cc.vmovntps(m, xmmB);
- cc.vmovntps(m, ymmB);
- cc.vmovsd(xmmA, m);
- cc.vmovsd(m, xmmB);
- cc.vmovshdup(xmmA, m);
- cc.vmovshdup(ymmA, m);
- cc.vmovsldup(xmmA, m);
- cc.vmovsldup(ymmA, m);
- cc.vmovss(xmmA, m);
- cc.vmovss(m, xmmB);
- cc.vmovupd(xmmA, m);
- cc.vmovupd(m, xmmB);
- cc.vmovupd(ymmA, m);
- cc.vmovupd(m, ymmB);
- cc.vmovups(xmmA, m);
- cc.vmovups(m, xmmB);
- cc.vmovups(ymmA, m);
- cc.vmovups(m, ymmB);
- cc.vmpsadbw(xmmA, xmmB, m, 0);
- cc.vmulpd(xmmA, xmmB, m);
- cc.vmulpd(ymmA, ymmB, m);
- cc.vmulps(xmmA, xmmB, m);
- cc.vmulps(ymmA, ymmB, m);
- cc.vmulsd(xmmA, xmmB, m);
- cc.vmulss(xmmA, xmmB, m);
- cc.vorpd(xmmA, xmmB, m);
- cc.vorpd(ymmA, ymmB, m);
- cc.vorps(xmmA, xmmB, m);
- cc.vorps(ymmA, ymmB, m);
- cc.vpabsb(xmmA, m);
- cc.vpabsd(xmmA, m);
- cc.vpabsw(xmmA, m);
- cc.vpackssdw(xmmA, xmmB, m);
- cc.vpacksswb(xmmA, xmmB, m);
- cc.vpackusdw(xmmA, xmmB, m);
- cc.vpackuswb(xmmA, xmmB, m);
- cc.vpaddb(xmmA, xmmB, m);
- cc.vpaddd(xmmA, xmmB, m);
- cc.vpaddq(xmmA, xmmB, m);
- cc.vpaddw(xmmA, xmmB, m);
- cc.vpaddsb(xmmA, xmmB, m);
- cc.vpaddsw(xmmA, xmmB, m);
- cc.vpaddusb(xmmA, xmmB, m);
- cc.vpaddusw(xmmA, xmmB, m);
- cc.vpalignr(xmmA, xmmB, m, 0);
- cc.vpand(xmmA, xmmB, m);
- cc.vpandn(xmmA, xmmB, m);
- cc.vpavgb(xmmA, xmmB, m);
- cc.vpavgw(xmmA, xmmB, m);
- cc.vpblendvb(xmmA, xmmB, m, xmmA);
- cc.vpblendw(xmmA, xmmB, m, 0);
- cc.vpcmpeqb(xmmA, xmmB, m);
- cc.vpcmpeqd(xmmA, xmmB, m);
- cc.vpcmpeqq(xmmA, xmmB, m);
- cc.vpcmpeqw(xmmA, xmmB, m);
- cc.vpcmpgtb(xmmA, xmmB, m);
- cc.vpcmpgtd(xmmA, xmmB, m);
- cc.vpcmpgtq(xmmA, xmmB, m);
- cc.vpcmpgtw(xmmA, xmmB, m);
- cc.vpermilpd(xmmA, xmmB, m);
- cc.vpermilpd(ymmA, ymmB, m);
- cc.vpermilpd(xmmA, m, 0);
- cc.vpermilpd(ymmA, m, 0);
- cc.vpermilps(xmmA, xmmB, m);
- cc.vpermilps(ymmA, ymmB, m);
- cc.vpermilps(xmmA, m, 0);
- cc.vpermilps(ymmA, m, 0);
- cc.vperm2f128(ymmA, ymmB, m, 0);
- cc.vpextrb(m, xmmB, 0);
- cc.vpextrd(m, xmmB, 0);
- if (cc.is64Bit()) cc.vpextrq(m, xmmB, 0);
- cc.vpextrw(m, xmmB, 0);
- cc.vphaddd(xmmA, xmmB, m);
- cc.vphaddsw(xmmA, xmmB, m);
- cc.vphaddw(xmmA, xmmB, m);
- cc.vphminposuw(xmmA, m);
- cc.vphsubd(xmmA, xmmB, m);
- cc.vphsubsw(xmmA, xmmB, m);
- cc.vphsubw(xmmA, xmmB, m);
- cc.vpinsrb(xmmA, xmmB, m, 0);
- cc.vpinsrd(xmmA, xmmB, m, 0);
- cc.vpinsrw(xmmA, xmmB, m, 0);
- cc.vpmaddubsw(xmmA, xmmB, m);
- cc.vpmaddwd(xmmA, xmmB, m);
- cc.vpmaxsb(xmmA, xmmB, m);
- cc.vpmaxsd(xmmA, xmmB, m);
- cc.vpmaxsw(xmmA, xmmB, m);
- cc.vpmaxub(xmmA, xmmB, m);
- cc.vpmaxud(xmmA, xmmB, m);
- cc.vpmaxuw(xmmA, xmmB, m);
- cc.vpminsb(xmmA, xmmB, m);
- cc.vpminsd(xmmA, xmmB, m);
- cc.vpminsw(xmmA, xmmB, m);
- cc.vpminub(xmmA, xmmB, m);
- cc.vpminud(xmmA, xmmB, m);
- cc.vpminuw(xmmA, xmmB, m);
- cc.vpmovsxbd(xmmA, m);
- cc.vpmovsxbq(xmmA, m);
- cc.vpmovsxbw(xmmA, m);
- cc.vpmovsxdq(xmmA, m);
- cc.vpmovsxwd(xmmA, m);
- cc.vpmovsxwq(xmmA, m);
- cc.vpmovzxbd(xmmA, m);
- cc.vpmovzxbq(xmmA, m);
- cc.vpmovzxbw(xmmA, m);
- cc.vpmovzxdq(xmmA, m);
- cc.vpmovzxwd(xmmA, m);
- cc.vpmovzxwq(xmmA, m);
- cc.vpmuldq(xmmA, xmmB, m);
- cc.vpmulhrsw(xmmA, xmmB, m);
- cc.vpmulhuw(xmmA, xmmB, m);
- cc.vpmulhw(xmmA, xmmB, m);
- cc.vpmulld(xmmA, xmmB, m);
- cc.vpmullw(xmmA, xmmB, m);
- cc.vpmuludq(xmmA, xmmB, m);
- cc.vpor(xmmA, xmmB, m);
- cc.vpsadbw(xmmA, xmmB, m);
- cc.vpshufb(xmmA, xmmB, m);
- cc.vpshufd(xmmA, m, 0);
- cc.vpshufhw(xmmA, m, 0);
- cc.vpshuflw(xmmA, m, 0);
- cc.vpsignb(xmmA, xmmB, m);
- cc.vpsignd(xmmA, xmmB, m);
- cc.vpsignw(xmmA, xmmB, m);
- cc.vpslld(xmmA, xmmB, m);
- cc.vpsllq(xmmA, xmmB, m);
- cc.vpsllw(xmmA, xmmB, m);
- cc.vpsrad(xmmA, xmmB, m);
- cc.vpsraw(xmmA, xmmB, m);
- cc.vpsrld(xmmA, xmmB, m);
- cc.vpsrlq(xmmA, xmmB, m);
- cc.vpsrlw(xmmA, xmmB, m);
- cc.vpsubb(xmmA, xmmB, m);
- cc.vpsubd(xmmA, xmmB, m);
- cc.vpsubq(xmmA, xmmB, m);
- cc.vpsubw(xmmA, xmmB, m);
- cc.vpsubsb(xmmA, xmmB, m);
- cc.vpsubsw(xmmA, xmmB, m);
- cc.vpsubusb(xmmA, xmmB, m);
- cc.vpsubusw(xmmA, xmmB, m);
- cc.vptest(xmmA, m);
- cc.vptest(ymmA, m);
- cc.vpunpckhbw(xmmA, xmmB, m);
- cc.vpunpckhdq(xmmA, xmmB, m);
- cc.vpunpckhqdq(xmmA, xmmB, m);
- cc.vpunpckhwd(xmmA, xmmB, m);
- cc.vpunpcklbw(xmmA, xmmB, m);
- cc.vpunpckldq(xmmA, xmmB, m);
- cc.vpunpcklqdq(xmmA, xmmB, m);
- cc.vpunpcklwd(xmmA, xmmB, m);
- cc.vpxor(xmmA, xmmB, m);
- cc.vrcpps(xmmA, m);
- cc.vrcpps(ymmA, m);
- cc.vrcpss(xmmA, xmmB, m);
- cc.vrsqrtps(xmmA, m);
- cc.vrsqrtps(ymmA, m);
- cc.vrsqrtss(xmmA, xmmB, m);
- cc.vroundpd(xmmA, m, 0);
- cc.vroundpd(ymmA, m, 0);
- cc.vroundps(xmmA, m, 0);
- cc.vroundps(ymmA, m, 0);
- cc.vroundsd(xmmA, xmmB, m, 0);
- cc.vroundss(xmmA, xmmB, m, 0);
- cc.vshufpd(xmmA, xmmB, m, 0);
- cc.vshufpd(ymmA, ymmB, m, 0);
- cc.vshufps(xmmA, xmmB, m, 0);
- cc.vshufps(ymmA, ymmB, m, 0);
- cc.vsqrtpd(xmmA, m);
- cc.vsqrtpd(ymmA, m);
- cc.vsqrtps(xmmA, m);
- cc.vsqrtps(ymmA, m);
- cc.vsqrtsd(xmmA, xmmB, m);
- cc.vsqrtss(xmmA, xmmB, m);
- cc.vsubpd(xmmA, xmmB, m);
- cc.vsubpd(ymmA, ymmB, m);
- cc.vsubps(xmmA, xmmB, m);
- cc.vsubps(ymmA, ymmB, m);
- cc.vsubsd(xmmA, xmmB, m);
- cc.vsubss(xmmA, xmmB, m);
- cc.vtestps(xmmA, m);
- cc.vtestps(ymmA, m);
- cc.vtestpd(xmmA, m);
- cc.vtestpd(ymmA, m);
- cc.vucomisd(xmmA, m);
- cc.vucomiss(xmmA, m);
- cc.vunpckhpd(xmmA, xmmB, m);
- cc.vunpckhpd(ymmA, ymmB, m);
- cc.vunpckhps(xmmA, xmmB, m);
- cc.vunpckhps(ymmA, ymmB, m);
- cc.vunpcklpd(xmmA, xmmB, m);
- cc.vunpcklpd(ymmA, ymmB, m);
- cc.vunpcklps(xmmA, xmmB, m);
- cc.vunpcklps(ymmA, ymmB, m);
- cc.vxorpd(xmmA, xmmB, m);
- cc.vxorpd(ymmA, ymmB, m);
- cc.vxorps(xmmA, xmmB, m);
- cc.vxorps(ymmA, ymmB, m);
-
- // AVX+AESNI.
- cc.vaesdec(xmmA, xmmB, m);
- cc.vaesdeclast(xmmA, xmmB, m);
- cc.vaesenc(xmmA, xmmB, m);
- cc.vaesenclast(xmmA, xmmB, m);
- cc.vaesimc(xmmA, m);
- cc.vaeskeygenassist(xmmA, m, 0);
-
- // AVX+PCLMULQDQ.
- cc.vpclmulqdq(xmmA, xmmB, m, 0);
-
- // AVX2.
- cc.vbroadcasti128(ymmA, m);
- cc.vextracti128(m, ymmB, 0);
- cc.vgatherdpd(xmmA, vx_ptr, xmmC);
- cc.vgatherdpd(ymmA, vx_ptr, ymmC);
- cc.vgatherdps(xmmA, vx_ptr, xmmC);
- cc.vgatherdps(ymmA, vy_ptr, ymmC);
- cc.vgatherqpd(xmmA, vx_ptr, xmmC);
- cc.vgatherqpd(ymmA, vy_ptr, ymmC);
- cc.vgatherqps(xmmA, vx_ptr, xmmC);
- cc.vgatherqps(xmmA, vy_ptr, xmmC);
- cc.vinserti128(ymmA, ymmB, m, 0);
- cc.vmovntdqa(ymmA, m);
- cc.vmpsadbw(ymmA, ymmB, m, 0);
- cc.vpabsb(ymmA, m);
- cc.vpabsd(ymmA, m);
- cc.vpabsw(ymmA, m);
- cc.vpackssdw(ymmA, ymmB, m);
- cc.vpacksswb(ymmA, ymmB, m);
- cc.vpackusdw(ymmA, ymmB, m);
- cc.vpackuswb(ymmA, ymmB, m);
- cc.vpaddb(ymmA, ymmB, m);
- cc.vpaddd(ymmA, ymmB, m);
- cc.vpaddq(ymmA, ymmB, m);
- cc.vpaddw(ymmA, ymmB, m);
- cc.vpaddsb(ymmA, ymmB, m);
- cc.vpaddsw(ymmA, ymmB, m);
- cc.vpaddusb(ymmA, ymmB, m);
- cc.vpaddusw(ymmA, ymmB, m);
- cc.vpalignr(ymmA, ymmB, m, 0);
- cc.vpand(ymmA, ymmB, m);
- cc.vpandn(ymmA, ymmB, m);
- cc.vpavgb(ymmA, ymmB, m);
- cc.vpavgw(ymmA, ymmB, m);
- cc.vpblendd(xmmA, xmmB, m, 0);
- cc.vpblendd(ymmA, ymmB, m, 0);
- cc.vpblendvb(ymmA, ymmB, m, ymmA);
- cc.vpblendw(ymmA, ymmB, m, 0);
- cc.vpbroadcastb(xmmA, m);
- cc.vpbroadcastb(ymmA, m);
- cc.vpbroadcastd(xmmA, m);
- cc.vpbroadcastd(ymmA, m);
- cc.vpbroadcastq(xmmA, m);
- cc.vpbroadcastq(ymmA, m);
- cc.vpbroadcastw(xmmA, m);
- cc.vpbroadcastw(ymmA, m);
- cc.vpcmpeqb(ymmA, ymmB, m);
- cc.vpcmpeqd(ymmA, ymmB, m);
- cc.vpcmpeqq(ymmA, ymmB, m);
- cc.vpcmpeqw(ymmA, ymmB, m);
- cc.vpcmpgtb(ymmA, ymmB, m);
- cc.vpcmpgtd(ymmA, ymmB, m);
- cc.vpcmpgtq(ymmA, ymmB, m);
- cc.vpcmpgtw(ymmA, ymmB, m);
- cc.vperm2i128(ymmA, ymmB, m, 0);
- cc.vpermd(ymmA, ymmB, m);
- cc.vpermps(ymmA, ymmB, m);
- cc.vpermpd(ymmA, m, 0);
- cc.vpermq(ymmA, m, 0);
- cc.vpgatherdd(xmmA, vx_ptr, xmmC);
- cc.vpgatherdd(ymmA, vy_ptr, ymmC);
- cc.vpgatherdq(xmmA, vx_ptr, xmmC);
- cc.vpgatherdq(ymmA, vx_ptr, ymmC);
- cc.vpgatherqd(xmmA, vx_ptr, xmmC);
- cc.vpgatherqd(xmmA, vy_ptr, xmmC);
- cc.vpgatherqq(xmmA, vx_ptr, xmmC);
- cc.vpgatherqq(ymmA, vy_ptr, ymmC);
- cc.vpmovsxbd(ymmA, m);
- cc.vpmovsxbq(ymmA, m);
- cc.vpmovsxbw(ymmA, m);
- cc.vpmovsxdq(ymmA, m);
- cc.vpmovsxwd(ymmA, m);
- cc.vpmovsxwq(ymmA, m);
- cc.vpmovzxbd(ymmA, m);
- cc.vpmovzxbq(ymmA, m);
- cc.vpmovzxbw(ymmA, m);
- cc.vpmovzxdq(ymmA, m);
- cc.vpmovzxwd(ymmA, m);
- cc.vpmovzxwq(ymmA, m);
- cc.vpshufd(ymmA, m, 0);
- cc.vpshufhw(ymmA, m, 0);
- cc.vpshuflw(ymmA, m, 0);
- cc.vphaddd(ymmA, ymmB, m);
- cc.vphaddsw(ymmA, ymmB, m);
- cc.vphaddw(ymmA, ymmB, m);
- cc.vphsubd(ymmA, ymmB, m);
- cc.vphsubsw(ymmA, ymmB, m);
- cc.vphsubw(ymmA, ymmB, m);
- cc.vpmaddubsw(ymmA, ymmB, m);
- cc.vpmaddwd(ymmA, ymmB, m);
- cc.vpmaskmovd(m, xmmB, xmmC);
- cc.vpmaskmovd(m, ymmB, ymmC);
- cc.vpmaskmovd(xmmA, xmmB, m);
- cc.vpmaskmovd(ymmA, ymmB, m);
- cc.vpmaskmovq(m, xmmB, xmmC);
- cc.vpmaskmovq(m, ymmB, ymmC);
- cc.vpmaskmovq(xmmA, xmmB, m);
- cc.vpmaskmovq(ymmA, ymmB, m);
- cc.vpmaxsb(ymmA, ymmB, m);
- cc.vpmaxsd(ymmA, ymmB, m);
- cc.vpmaxsw(ymmA, ymmB, m);
- cc.vpmaxub(ymmA, ymmB, m);
- cc.vpmaxud(ymmA, ymmB, m);
- cc.vpmaxuw(ymmA, ymmB, m);
- cc.vpminsb(ymmA, ymmB, m);
- cc.vpminsd(ymmA, ymmB, m);
- cc.vpminsw(ymmA, ymmB, m);
- cc.vpminub(ymmA, ymmB, m);
- cc.vpminud(ymmA, ymmB, m);
- cc.vpminuw(ymmA, ymmB, m);
- cc.vpmuldq(ymmA, ymmB, m);
- cc.vpmulhrsw(ymmA, ymmB, m);
- cc.vpmulhuw(ymmA, ymmB, m);
- cc.vpmulhw(ymmA, ymmB, m);
- cc.vpmulld(ymmA, ymmB, m);
- cc.vpmullw(ymmA, ymmB, m);
- cc.vpmuludq(ymmA, ymmB, m);
- cc.vpor(ymmA, ymmB, m);
- cc.vpsadbw(ymmA, ymmB, m);
- cc.vpshufb(ymmA, ymmB, m);
- cc.vpsignb(ymmA, ymmB, m);
- cc.vpsignd(ymmA, ymmB, m);
- cc.vpsignw(ymmA, ymmB, m);
- cc.vpslld(ymmA, ymmB, m);
- cc.vpsllq(ymmA, ymmB, m);
- cc.vpsllvd(xmmA, xmmB, m);
- cc.vpsllvd(ymmA, ymmB, m);
- cc.vpsllvq(xmmA, xmmB, m);
- cc.vpsllvq(ymmA, ymmB, m);
- cc.vpsllw(ymmA, ymmB, m);
- cc.vpsrad(ymmA, ymmB, m);
- cc.vpsravd(xmmA, xmmB, m);
- cc.vpsravd(ymmA, ymmB, m);
- cc.vpsraw(ymmA, ymmB, m);
- cc.vpsrld(ymmA, ymmB, m);
- cc.vpsrlq(ymmA, ymmB, m);
- cc.vpsrlvd(xmmA, xmmB, m);
- cc.vpsrlvd(ymmA, ymmB, m);
- cc.vpsrlvq(xmmA, xmmB, m);
- cc.vpsrlvq(ymmA, ymmB, m);
- cc.vpsrlw(ymmA, ymmB, m);
- cc.vpsubb(ymmA, ymmB, m);
- cc.vpsubd(ymmA, ymmB, m);
- cc.vpsubq(ymmA, ymmB, m);
- cc.vpsubsb(ymmA, ymmB, m);
- cc.vpsubsw(ymmA, ymmB, m);
- cc.vpsubusb(ymmA, ymmB, m);
- cc.vpsubusw(ymmA, ymmB, m);
- cc.vpsubw(ymmA, ymmB, m);
- cc.vpunpckhbw(ymmA, ymmB, m);
- cc.vpunpckhdq(ymmA, ymmB, m);
- cc.vpunpckhqdq(ymmA, ymmB, m);
- cc.vpunpckhwd(ymmA, ymmB, m);
- cc.vpunpcklbw(ymmA, ymmB, m);
- cc.vpunpckldq(ymmA, ymmB, m);
- cc.vpunpcklqdq(ymmA, ymmB, m);
- cc.vpunpcklwd(ymmA, ymmB, m);
- cc.vpxor(ymmA, ymmB, m);
-}
-
-// Generates a long sequence of AVX instructions.
-template<typename Emitter>
-static void generateAvxSequenceInternal(
- Emitter& cc,
- InstForm form,
- const x86::Gp& gp,
- const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
-
- if (form == InstForm::kReg)
- generateAvxSequenceInternalRegOnly(cc, gp, vecA, vecB, vecC, vecD);
- else
- generateAvxSequenceInternalRegMem(cc, gp, vecA, vecB, vecC, vecD);
-}
-
-static void generateAvxSequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
- using namespace asmjit::x86;
-
- if (emitter.isAssembler()) {
- Assembler& cc = *emitter.as<Assembler>();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(eax, ymm0, ymm1, ymm2, ymm3);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
- cc.emitEpilog(frame);
- }
- else {
- generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
- }
- }
-#ifndef ASMJIT_NO_BUILDER
- else if (emitter.isBuilder()) {
- Builder& cc = *emitter.as<Builder>();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(eax, ymm0, ymm1, ymm2, ymm3);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
- cc.emitEpilog(frame);
- }
- else {
- generateAvxSequenceInternal(cc, form, eax, ymm0, ymm1, ymm2, ymm3);
- }
- }
-#endif
-#ifndef ASMJIT_NO_COMPILER
- else if (emitter.isCompiler()) {
- Compiler& cc = *emitter.as<Compiler>();
-
- Gp gp = cc.newGpz("gp");
- Ymm a = cc.newYmm("a");
- Ymm b = cc.newYmm("b");
- Ymm c = cc.newYmm("c");
- Ymm d = cc.newYmm("d");
-
- cc.addFunc(FuncSignature::build<void>());
- generateAvxSequenceInternal(cc, form, gp, a, b, c, d);
- cc.endFunc();
- }
-#endif
-}
-
-// Generates a long sequence of AVX512 instructions.
-template<typename Emitter>
-static void generateAvx512SequenceInternalRegOnly(
- Emitter& cc,
- const x86::Gp& gp,
- const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
- const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
-
- x86::Gp gpd = gp.r32();
- x86::Gp gpq = gp.r64();
- x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
-
- x86::Xmm xmmA = vecA.xmm();
- x86::Xmm xmmB = vecB.xmm();
- x86::Xmm xmmC = vecC.xmm();
- x86::Xmm xmmD = vecD.xmm();
-
- x86::Ymm ymmA = vecA.ymm();
- x86::Ymm ymmB = vecB.ymm();
- x86::Ymm ymmC = vecC.ymm();
-
- x86::Zmm zmmA = vecA.zmm();
- x86::Zmm zmmB = vecB.zmm();
- x86::Zmm zmmC = vecC.zmm();
-
- cc.xor_(gpd, gpd);
- cc.vxorps(xmmA, xmmA, xmmA);
- cc.vxorps(xmmB, xmmB, xmmB);
- cc.vxorps(xmmC, xmmC, xmmC);
- cc.vxorps(xmmD, xmmD, xmmD);
-
- cc.kaddb(kA, kB, kC);
- cc.kaddd(kA, kB, kC);
- cc.kaddq(kA, kB, kC);
- cc.kaddw(kA, kB, kC);
- cc.kandb(kA, kB, kC);
- cc.kandd(kA, kB, kC);
- cc.kandnb(kA, kB, kC);
- cc.kandnd(kA, kB, kC);
- cc.kandnq(kA, kB, kC);
- cc.kandnw(kA, kB, kC);
- cc.kandq(kA, kB, kC);
- cc.kandw(kA, kB, kC);
- cc.kmovb(kA, kB);
- cc.kmovb(kA, gpd);
- cc.kmovb(gpd, kB);
- cc.kmovd(kA, kB);
- cc.kmovd(kA, gpd);
- cc.kmovd(gpd, kB);
- cc.kmovq(kA, kB);
- if (cc.is64Bit()) cc.kmovq(kA, gpq);
- if (cc.is64Bit()) cc.kmovq(gpq, kB);
- cc.kmovw(kA, kB);
- cc.kmovw(kA, gpd);
- cc.kmovw(gpd, kB);
- cc.knotb(kA, kB);
- cc.knotd(kA, kB);
- cc.knotq(kA, kB);
- cc.knotw(kA, kB);
- cc.korb(kA, kB, kC);
- cc.kord(kA, kB, kC);
- cc.korq(kA, kB, kC);
- cc.kortestb(kA, kB);
- cc.kortestd(kA, kB);
- cc.kortestq(kA, kB);
- cc.kortestw(kA, kB);
- cc.korw(kA, kB, kC);
- cc.kshiftlb(kA, kB, 0);
- cc.kshiftld(kA, kB, 0);
- cc.kshiftlq(kA, kB, 0);
- cc.kshiftlw(kA, kB, 0);
- cc.kshiftrb(kA, kB, 0);
- cc.kshiftrd(kA, kB, 0);
- cc.kshiftrq(kA, kB, 0);
- cc.kshiftrw(kA, kB, 0);
- cc.ktestb(kA, kB);
- cc.ktestd(kA, kB);
- cc.ktestq(kA, kB);
- cc.ktestw(kA, kB);
- cc.kunpckbw(kA, kB, kC);
- cc.kunpckdq(kA, kB, kC);
- cc.kunpckwd(kA, kB, kC);
- cc.kxnorb(kA, kB, kC);
- cc.kxnord(kA, kB, kC);
- cc.kxnorq(kA, kB, kC);
- cc.kxnorw(kA, kB, kC);
- cc.kxorb(kA, kB, kC);
- cc.kxord(kA, kB, kC);
- cc.kxorq(kA, kB, kC);
- cc.kxorw(kA, kB, kC);
- cc.nop();
-
- cc.evex().vaddpd(xmmA, xmmB, xmmC);
- cc.evex().vaddpd(ymmA, ymmB, ymmC);
- cc.evex().vaddpd(zmmA, zmmB, zmmC);
- cc.evex().vaddps(xmmA, xmmB, xmmC);
- cc.evex().vaddps(ymmA, ymmB, ymmC);
- cc.evex().vaddps(zmmA, zmmB, zmmC);
- cc.evex().vaddsd(xmmA, xmmB, xmmC);
- cc.evex().vaddss(xmmA, xmmB, xmmC);
- cc.evex().valignd(xmmA, xmmB, xmmC, 0);
- cc.evex().valignd(ymmA, ymmB, ymmC, 0);
- cc.evex().valignd(zmmA, zmmB, zmmC, 0);
- cc.evex().valignq(xmmA, xmmB, xmmC, 0);
- cc.evex().valignq(ymmA, ymmB, ymmC, 0);
- cc.evex().valignq(zmmA, zmmB, zmmC, 0);
- cc.evex().vandnpd(xmmA, xmmB, xmmC);
- cc.evex().vandnpd(ymmA, ymmB, ymmC);
- cc.evex().vandnpd(zmmA, zmmB, zmmC);
- cc.evex().vandnps(xmmA, xmmB, xmmC);
- cc.evex().vandnps(ymmA, ymmB, ymmC);
- cc.evex().vandnps(zmmA, zmmB, zmmC);
- cc.evex().vandpd(xmmA, xmmB, xmmC);
- cc.evex().vandpd(ymmA, ymmB, ymmC);
- cc.evex().vandpd(zmmA, zmmB, zmmC);
- cc.evex().vandps(xmmA, xmmB, xmmC);
- cc.evex().vandps(ymmA, ymmB, ymmC);
- cc.evex().vandps(zmmA, zmmB, zmmC);
- cc.evex().vblendmpd(xmmA, xmmB, xmmC);
- cc.evex().vblendmpd(ymmA, ymmB, ymmC);
- cc.evex().vblendmpd(zmmA, zmmB, zmmC);
- cc.evex().vblendmps(xmmA, xmmB, xmmC);
- cc.evex().vblendmps(ymmA, ymmB, ymmC);
- cc.evex().vblendmps(zmmA, zmmB, zmmC);
- cc.evex().vbroadcastf32x2(ymmA, xmmB);
- cc.evex().vbroadcastf32x2(zmmA, xmmB);
- cc.evex().vbroadcasti32x2(xmmA, xmmB);
- cc.evex().vbroadcasti32x2(ymmA, xmmB);
- cc.evex().vbroadcasti32x2(zmmA, xmmB);
- cc.evex().vbroadcastsd(ymmA, xmmB);
- cc.evex().vbroadcastsd(zmmA, xmmB);
- cc.evex().vbroadcastss(xmmA, xmmB);
- cc.evex().vbroadcastss(ymmA, xmmB);
- cc.evex().vbroadcastss(zmmA, xmmB);
- cc.evex().vcmppd(kA, xmmB, xmmC, 0);
- cc.evex().vcmppd(kA, ymmB, ymmC, 0);
- cc.evex().vcmppd(kA, zmmB, zmmC, 0);
- cc.evex().vcmpps(kA, xmmB, xmmC, 0);
- cc.evex().vcmpps(kA, ymmB, ymmC, 0);
- cc.evex().vcmpps(kA, zmmB, zmmC, 0);
- cc.evex().vcmpsd(kA, xmmB, xmmC, 0);
- cc.evex().vcmpss(kA, xmmB, xmmC, 0);
- cc.evex().vcomisd(xmmA, xmmB);
- cc.evex().vcomiss(xmmA, xmmB);
- cc.evex().vcompresspd(xmmA, xmmB);
- cc.evex().vcompresspd(ymmA, ymmB);
- cc.evex().vcompresspd(zmmA, zmmB);
- cc.evex().vcompressps(xmmA, xmmB);
- cc.evex().vcompressps(ymmA, ymmB);
- cc.evex().vcompressps(zmmA, zmmB);
- cc.evex().vcvtdq2pd(xmmA, xmmB);
- cc.evex().vcvtdq2pd(ymmA, xmmB);
- cc.evex().vcvtdq2pd(zmmA, ymmB);
- cc.evex().vcvtdq2ps(xmmA, xmmB);
- cc.evex().vcvtdq2ps(ymmA, ymmB);
- cc.evex().vcvtdq2ps(zmmA, zmmB);
- cc.evex().vcvtpd2dq(xmmA, xmmB);
- cc.evex().vcvtpd2dq(xmmA, ymmB);
- cc.evex().vcvtpd2dq(ymmA, zmmB);
- cc.evex().vcvtpd2qq(xmmA, xmmB);
- cc.evex().vcvtpd2qq(ymmA, ymmB);
- cc.evex().vcvtpd2qq(zmmA, zmmB);
- cc.evex().vcvtpd2udq(xmmA, xmmB);
- cc.evex().vcvtpd2udq(xmmA, ymmB);
- cc.evex().vcvtpd2udq(ymmA, zmmB);
- cc.evex().vcvtpd2uqq(xmmA, xmmB);
- cc.evex().vcvtpd2uqq(ymmA, ymmB);
- cc.evex().vcvtpd2uqq(zmmA, zmmB);
- cc.evex().vcvtph2ps(xmmA, xmmB);
- cc.evex().vcvtph2ps(ymmA, xmmB);
- cc.evex().vcvtph2ps(zmmA, ymmB);
- cc.evex().vcvtps2dq(xmmA, xmmB);
- cc.evex().vcvtps2dq(ymmA, ymmB);
- cc.evex().vcvtps2dq(zmmA, zmmB);
- cc.evex().vcvtps2pd(xmmA, xmmB);
- cc.evex().vcvtps2pd(ymmA, xmmB);
- cc.evex().vcvtps2pd(zmmA, ymmB);
- cc.evex().vcvtps2ph(xmmA, xmmB, 0);
- cc.evex().vcvtps2ph(xmmA, ymmB, 0);
- cc.evex().vcvtps2ph(ymmA, zmmB, 0);
- cc.evex().vcvtps2qq(xmmA, xmmB);
- cc.evex().vcvtps2qq(ymmA, xmmB);
- cc.evex().vcvtps2qq(zmmA, ymmB);
- cc.evex().vcvtps2udq(xmmA, xmmB);
- cc.evex().vcvtps2udq(ymmA, ymmB);
- cc.evex().vcvtps2udq(zmmA, zmmB);
- cc.evex().vcvtps2uqq(xmmA, xmmB);
- cc.evex().vcvtps2uqq(ymmA, xmmB);
- cc.evex().vcvtps2uqq(zmmA, ymmB);
- cc.evex().vcvtqq2pd(xmmA, xmmB);
- cc.evex().vcvtqq2pd(ymmA, ymmB);
- cc.evex().vcvtqq2pd(zmmA, zmmB);
- cc.evex().vcvtqq2ps(xmmA, xmmB);
- cc.evex().vcvtqq2ps(xmmA, ymmB);
- cc.evex().vcvtqq2ps(ymmA, zmmB);
- cc.evex().vcvtsd2si(gpd, xmmB);
- cc.evex().vcvtsd2si(gpz, xmmB);
- cc.evex().vcvtsd2ss(xmmA, xmmB, xmmC);
- cc.evex().vcvtsd2usi(gpd, xmmB);
- cc.evex().vcvtsd2usi(gpz, xmmB);
- cc.evex().vcvtsi2sd(xmmA, xmmB, gpd);
- cc.evex().vcvtsi2sd(xmmA, xmmB, gpz);
- cc.evex().vcvtsi2ss(xmmA, xmmB, gpd);
- cc.evex().vcvtsi2ss(xmmA, xmmB, gpz);
- cc.evex().vcvtss2sd(xmmA, xmmB, xmmC);
- cc.evex().vcvtss2si(gpd, xmmB);
- cc.evex().vcvtss2si(gpz, xmmB);
- cc.evex().vcvtss2usi(gpd, xmmB);
- cc.evex().vcvtss2usi(gpz, xmmB);
- cc.evex().vcvttpd2dq(xmmA, xmmB);
- cc.evex().vcvttpd2dq(xmmA, ymmB);
- cc.evex().vcvttpd2dq(ymmA, zmmB);
- cc.evex().vcvttpd2qq(xmmA, xmmB);
- cc.evex().vcvttpd2qq(ymmA, ymmB);
- cc.evex().vcvttpd2qq(zmmA, zmmB);
- cc.evex().vcvttpd2udq(xmmA, xmmB);
- cc.evex().vcvttpd2udq(xmmA, ymmB);
- cc.evex().vcvttpd2udq(ymmA, zmmB);
- cc.evex().vcvttpd2uqq(xmmA, xmmB);
- cc.evex().vcvttpd2uqq(ymmA, ymmB);
- cc.evex().vcvttpd2uqq(zmmA, zmmB);
- cc.evex().vcvttps2dq(xmmA, xmmB);
- cc.evex().vcvttps2dq(ymmA, ymmB);
- cc.evex().vcvttps2dq(zmmA, zmmB);
- cc.evex().vcvttps2qq(xmmA, xmmB);
- cc.evex().vcvttps2qq(ymmA, xmmB);
- cc.evex().vcvttps2qq(zmmA, ymmB);
- cc.evex().vcvttps2udq(xmmA, xmmB);
- cc.evex().vcvttps2udq(ymmA, ymmB);
- cc.evex().vcvttps2udq(zmmA, zmmB);
- cc.evex().vcvttps2uqq(xmmA, xmmB);
- cc.evex().vcvttps2uqq(ymmA, xmmB);
- cc.evex().vcvttps2uqq(zmmA, ymmB);
- cc.evex().vcvttsd2si(gpd, xmmB);
- cc.evex().vcvttsd2si(gpz, xmmB);
- cc.evex().vcvttsd2usi(gpd, xmmB);
- cc.evex().vcvttsd2usi(gpz, xmmB);
- cc.evex().vcvttss2si(gpd, xmmB);
- cc.evex().vcvttss2si(gpz, xmmB);
- cc.evex().vcvttss2usi(gpd, xmmB);
- cc.evex().vcvttss2usi(gpz, xmmB);
- cc.evex().vcvtudq2pd(xmmA, xmmB);
- cc.evex().vcvtudq2pd(ymmA, xmmB);
- cc.evex().vcvtudq2pd(zmmA, ymmB);
- cc.evex().vcvtudq2ps(xmmA, xmmB);
- cc.evex().vcvtudq2ps(ymmA, ymmB);
- cc.evex().vcvtudq2ps(zmmA, zmmB);
- cc.evex().vcvtuqq2pd(xmmA, xmmB);
- cc.evex().vcvtuqq2pd(ymmA, ymmB);
- cc.evex().vcvtuqq2pd(zmmA, zmmB);
- cc.evex().vcvtuqq2ps(xmmA, xmmB);
- cc.evex().vcvtuqq2ps(xmmA, ymmB);
- cc.evex().vcvtuqq2ps(ymmA, zmmB);
- cc.evex().vcvtusi2sd(xmmA, xmmB, gpd);
- cc.evex().vcvtusi2sd(xmmA, xmmB, gpz);
- cc.evex().vcvtusi2ss(xmmA, xmmB, gpd);
- cc.evex().vcvtusi2ss(xmmA, xmmB, gpz);
- cc.evex().vdbpsadbw(xmmA, xmmB, xmmC, 0);
- cc.evex().vdbpsadbw(ymmA, ymmB, ymmC, 0);
- cc.evex().vdbpsadbw(zmmA, zmmB, zmmC, 0);
- cc.evex().vdivpd(xmmA, xmmB, xmmC);
- cc.evex().vdivpd(ymmA, ymmB, ymmC);
- cc.evex().vdivpd(zmmA, zmmB, zmmC);
- cc.evex().vdivps(xmmA, xmmB, xmmC);
- cc.evex().vdivps(ymmA, ymmB, ymmC);
- cc.evex().vdivps(zmmA, zmmB, zmmC);
- cc.evex().vdivsd(xmmA, xmmB, xmmC);
- cc.evex().vdivss(xmmA, xmmB, xmmC);
- cc.evex().vexp2pd(zmmA, zmmB);
- cc.evex().vexp2ps(zmmA, zmmB);
- cc.evex().vexpandpd(xmmA, xmmB);
- cc.evex().vexpandpd(ymmA, ymmB);
- cc.evex().vexpandpd(zmmA, zmmB);
- cc.evex().vexpandps(xmmA, xmmB);
- cc.evex().vexpandps(ymmA, ymmB);
- cc.evex().vexpandps(zmmA, zmmB);
- cc.evex().vextractf32x4(xmmA, ymmB, 0);
- cc.evex().vextractf32x4(xmmA, zmmB, 0);
- cc.evex().vextractf32x8(ymmA, zmmB, 0);
- cc.evex().vextractf64x2(xmmA, ymmB, 0);
- cc.evex().vextractf64x2(xmmA, zmmB, 0);
- cc.evex().vextractf64x4(ymmA, zmmB, 0);
- cc.evex().vextracti32x4(xmmA, ymmB, 0);
- cc.evex().vextracti32x4(xmmA, zmmB, 0);
- cc.evex().vextracti32x8(ymmA, zmmB, 0);
- cc.evex().vextracti64x2(xmmA, ymmB, 0);
- cc.evex().vextracti64x2(xmmA, zmmB, 0);
- cc.evex().vextracti64x4(ymmA, zmmB, 0);
- cc.evex().vextractps(gpd, xmmB, 0);
- cc.evex().vfixupimmpd(xmmA, xmmB, xmmC, 0);
- cc.evex().vfixupimmpd(ymmA, ymmB, ymmC, 0);
- cc.evex().vfixupimmpd(zmmA, zmmB, zmmC, 0);
- cc.evex().vfixupimmps(xmmA, xmmB, xmmC, 0);
- cc.evex().vfixupimmps(ymmA, ymmB, ymmC, 0);
- cc.evex().vfixupimmps(zmmA, zmmB, zmmC, 0);
- cc.evex().vfixupimmsd(xmmA, xmmB, xmmC, 0);
- cc.evex().vfixupimmss(xmmA, xmmB, xmmC, 0);
- cc.evex().vfmadd132pd(xmmA, xmmB, xmmC);
- cc.evex().vfmadd132pd(ymmA, ymmB, ymmC);
- cc.evex().vfmadd132pd(zmmA, zmmB, zmmC);
- cc.evex().vfmadd132ps(xmmA, xmmB, xmmC);
- cc.evex().vfmadd132ps(ymmA, ymmB, ymmC);
- cc.evex().vfmadd132ps(zmmA, zmmB, zmmC);
- cc.evex().vfmadd132sd(xmmA, xmmB, xmmC);
- cc.evex().vfmadd132ss(xmmA, xmmB, xmmC);
- cc.evex().vfmadd213pd(xmmA, xmmB, xmmC);
- cc.evex().vfmadd213pd(ymmA, ymmB, ymmC);
- cc.evex().vfmadd213pd(zmmA, zmmB, zmmC);
- cc.evex().vfmadd213ps(xmmA, xmmB, xmmC);
- cc.evex().vfmadd213ps(ymmA, ymmB, ymmC);
- cc.evex().vfmadd213ps(zmmA, zmmB, zmmC);
- cc.evex().vfmadd213sd(xmmA, xmmB, xmmC);
- cc.evex().vfmadd213ss(xmmA, xmmB, xmmC);
- cc.evex().vfmadd231pd(xmmA, xmmB, xmmC);
- cc.evex().vfmadd231pd(ymmA, ymmB, ymmC);
- cc.evex().vfmadd231pd(zmmA, zmmB, zmmC);
- cc.evex().vfmadd231ps(xmmA, xmmB, xmmC);
- cc.evex().vfmadd231ps(ymmA, ymmB, ymmC);
- cc.evex().vfmadd231ps(zmmA, zmmB, zmmC);
- cc.evex().vfmadd231sd(xmmA, xmmB, xmmC);
- cc.evex().vfmadd231ss(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub132pd(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub132pd(ymmA, ymmB, ymmC);
- cc.evex().vfmaddsub132pd(zmmA, zmmB, zmmC);
- cc.evex().vfmaddsub132ps(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub132ps(ymmA, ymmB, ymmC);
- cc.evex().vfmaddsub132ps(zmmA, zmmB, zmmC);
- cc.evex().vfmaddsub213pd(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub213pd(ymmA, ymmB, ymmC);
- cc.evex().vfmaddsub213pd(zmmA, zmmB, zmmC);
- cc.evex().vfmaddsub213ps(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub213ps(ymmA, ymmB, ymmC);
- cc.evex().vfmaddsub213ps(zmmA, zmmB, zmmC);
- cc.evex().vfmaddsub231pd(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub231pd(ymmA, ymmB, ymmC);
- cc.evex().vfmaddsub231pd(zmmA, zmmB, zmmC);
- cc.evex().vfmaddsub231ps(xmmA, xmmB, xmmC);
- cc.evex().vfmaddsub231ps(ymmA, ymmB, ymmC);
- cc.evex().vfmaddsub231ps(zmmA, zmmB, zmmC);
- cc.evex().vfmsub132pd(xmmA, xmmB, xmmC);
- cc.evex().vfmsub132pd(ymmA, ymmB, ymmC);
- cc.evex().vfmsub132pd(zmmA, zmmB, zmmC);
- cc.evex().vfmsub132ps(xmmA, xmmB, xmmC);
- cc.evex().vfmsub132ps(ymmA, ymmB, ymmC);
- cc.evex().vfmsub132ps(zmmA, zmmB, zmmC);
- cc.evex().vfmsub132sd(xmmA, xmmB, xmmC);
- cc.evex().vfmsub132ss(xmmA, xmmB, xmmC);
- cc.evex().vfmsub213pd(xmmA, xmmB, xmmC);
- cc.evex().vfmsub213pd(ymmA, ymmB, ymmC);
- cc.evex().vfmsub213pd(zmmA, zmmB, zmmC);
- cc.evex().vfmsub213ps(xmmA, xmmB, xmmC);
- cc.evex().vfmsub213ps(ymmA, ymmB, ymmC);
- cc.evex().vfmsub213ps(zmmA, zmmB, zmmC);
- cc.evex().vfmsub213sd(xmmA, xmmB, xmmC);
- cc.evex().vfmsub213ss(xmmA, xmmB, xmmC);
- cc.evex().vfmsub231pd(xmmA, xmmB, xmmC);
- cc.evex().vfmsub231pd(ymmA, ymmB, ymmC);
- cc.evex().vfmsub231pd(zmmA, zmmB, zmmC);
- cc.evex().vfmsub231ps(xmmA, xmmB, xmmC);
- cc.evex().vfmsub231ps(ymmA, ymmB, ymmC);
- cc.evex().vfmsub231ps(zmmA, zmmB, zmmC);
- cc.evex().vfmsub231sd(xmmA, xmmB, xmmC);
- cc.evex().vfmsub231ss(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd132pd(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd132pd(ymmA, ymmB, ymmC);
- cc.evex().vfmsubadd132pd(zmmA, zmmB, zmmC);
- cc.evex().vfmsubadd132ps(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd132ps(ymmA, ymmB, ymmC);
- cc.evex().vfmsubadd132ps(zmmA, zmmB, zmmC);
- cc.evex().vfmsubadd213pd(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd213pd(ymmA, ymmB, ymmC);
- cc.evex().vfmsubadd213pd(zmmA, zmmB, zmmC);
- cc.evex().vfmsubadd213ps(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd213ps(ymmA, ymmB, ymmC);
- cc.evex().vfmsubadd213ps(zmmA, zmmB, zmmC);
- cc.evex().vfmsubadd231pd(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd231pd(ymmA, ymmB, ymmC);
- cc.evex().vfmsubadd231pd(zmmA, zmmB, zmmC);
- cc.evex().vfmsubadd231ps(xmmA, xmmB, xmmC);
- cc.evex().vfmsubadd231ps(ymmA, ymmB, ymmC);
- cc.evex().vfmsubadd231ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd132pd(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd132pd(ymmA, ymmB, ymmC);
- cc.evex().vfnmadd132pd(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd132ps(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd132ps(ymmA, ymmB, ymmC);
- cc.evex().vfnmadd132ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd132sd(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd132ss(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd213pd(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd213pd(ymmA, ymmB, ymmC);
- cc.evex().vfnmadd213pd(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd213ps(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd213ps(ymmA, ymmB, ymmC);
- cc.evex().vfnmadd213ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd213sd(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd213ss(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd231pd(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd231pd(ymmA, ymmB, ymmC);
- cc.evex().vfnmadd231pd(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd231ps(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd231ps(ymmA, ymmB, ymmC);
- cc.evex().vfnmadd231ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmadd231sd(xmmA, xmmB, xmmC);
- cc.evex().vfnmadd231ss(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub132pd(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub132pd(ymmA, ymmB, ymmC);
- cc.evex().vfnmsub132pd(zmmA, zmmB, zmmC);
- cc.evex().vfnmsub132ps(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub132ps(ymmA, ymmB, ymmC);
- cc.evex().vfnmsub132ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmsub132sd(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub132ss(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub213pd(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub213pd(ymmA, ymmB, ymmC);
- cc.evex().vfnmsub213pd(zmmA, zmmB, zmmC);
- cc.evex().vfnmsub213ps(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub213ps(ymmA, ymmB, ymmC);
- cc.evex().vfnmsub213ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmsub213sd(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub213ss(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub231pd(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub231pd(ymmA, ymmB, ymmC);
- cc.evex().vfnmsub231pd(zmmA, zmmB, zmmC);
- cc.evex().vfnmsub231ps(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub231ps(ymmA, ymmB, ymmC);
- cc.evex().vfnmsub231ps(zmmA, zmmB, zmmC);
- cc.evex().vfnmsub231sd(xmmA, xmmB, xmmC);
- cc.evex().vfnmsub231ss(xmmA, xmmB, xmmC);
- cc.evex().vfpclasspd(kA, xmmB, 0);
- cc.evex().vfpclasspd(kA, ymmB, 0);
- cc.evex().vfpclasspd(kA, zmmB, 0);
- cc.evex().vfpclassps(kA, xmmB, 0);
- cc.evex().vfpclassps(kA, ymmB, 0);
- cc.evex().vfpclassps(kA, zmmB, 0);
- cc.evex().vfpclasssd(kA, xmmB, 0);
- cc.evex().vfpclassss(kA, xmmB, 0);
- cc.evex().vgetexppd(xmmA, xmmB);
- cc.evex().vgetexppd(ymmA, ymmB);
- cc.evex().vgetexppd(zmmA, zmmB);
- cc.evex().vgetexpps(xmmA, xmmB);
- cc.evex().vgetexpps(ymmA, ymmB);
- cc.evex().vgetexpps(zmmA, zmmB);
- cc.evex().vgetexpsd(xmmA, xmmB, xmmC);
- cc.evex().vgetexpss(xmmA, xmmB, xmmC);
- cc.evex().vgetmantpd(xmmA, xmmB, 0);
- cc.evex().vgetmantpd(ymmA, ymmB, 0);
- cc.evex().vgetmantpd(zmmA, zmmB, 0);
- cc.evex().vgetmantps(xmmA, xmmB, 0);
- cc.evex().vgetmantps(ymmA, ymmB, 0);
- cc.evex().vgetmantps(zmmA, zmmB, 0);
- cc.evex().vgetmantsd(xmmA, xmmB, xmmC, 0);
- cc.evex().vgetmantss(xmmA, xmmB, xmmC, 0);
- cc.evex().vinsertf32x4(ymmA, ymmB, xmmC, 0);
- cc.evex().vinsertf32x4(zmmA, zmmB, xmmC, 0);
- cc.evex().vinsertf32x8(zmmA, zmmB, ymmC, 0);
- cc.evex().vinsertf64x2(ymmA, ymmB, xmmC, 0);
- cc.evex().vinsertf64x2(zmmA, zmmB, xmmC, 0);
- cc.evex().vinsertf64x4(zmmA, zmmB, ymmC, 0);
- cc.evex().vinserti32x4(ymmA, ymmB, xmmC, 0);
- cc.evex().vinserti32x4(zmmA, zmmB, xmmC, 0);
- cc.evex().vinserti32x8(zmmA, zmmB, ymmC, 0);
- cc.evex().vinserti64x2(ymmA, ymmB, xmmC, 0);
- cc.evex().vinserti64x2(zmmA, zmmB, xmmC, 0);
- cc.evex().vinserti64x4(zmmA, zmmB, ymmC, 0);
- cc.evex().vinsertps(xmmA, xmmB, xmmC, 0);
- cc.evex().vmaxpd(xmmA, xmmB, xmmC);
- cc.evex().vmaxpd(ymmA, ymmB, ymmC);
- cc.evex().vmaxpd(zmmA, zmmB, zmmC);
- cc.evex().vmaxps(xmmA, xmmB, xmmC);
- cc.evex().vmaxps(ymmA, ymmB, ymmC);
- cc.evex().vmaxps(zmmA, zmmB, zmmC);
- cc.evex().vmaxsd(xmmA, xmmB, xmmC);
- cc.evex().vmaxss(xmmA, xmmB, xmmC);
- cc.evex().vminpd(xmmA, xmmB, xmmC);
- cc.evex().vminpd(ymmA, ymmB, ymmC);
- cc.evex().vminpd(zmmA, zmmB, zmmC);
- cc.evex().vminps(xmmA, xmmB, xmmC);
- cc.evex().vminps(ymmA, ymmB, ymmC);
- cc.evex().vminps(zmmA, zmmB, zmmC);
- cc.evex().vminsd(xmmA, xmmB, xmmC);
- cc.evex().vminss(xmmA, xmmB, xmmC);
- cc.evex().vmovapd(xmmA, xmmB);
- cc.evex().vmovapd(xmmA, xmmB);
- cc.evex().vmovapd(ymmA, ymmB);
- cc.evex().vmovapd(ymmA, ymmB);
- cc.evex().vmovapd(zmmA, zmmB);
- cc.evex().vmovapd(zmmA, zmmB);
- cc.evex().vmovaps(xmmA, xmmB);
- cc.evex().vmovaps(xmmA, xmmB);
- cc.evex().vmovaps(ymmA, ymmB);
- cc.evex().vmovaps(ymmA, ymmB);
- cc.evex().vmovaps(zmmA, zmmB);
- cc.evex().vmovaps(zmmA, zmmB);
- cc.evex().vmovd(gpd, xmmB);
- cc.evex().vmovd(xmmA, gpd);
- cc.evex().vmovddup(xmmA, xmmB);
- cc.evex().vmovddup(ymmA, ymmB);
- cc.evex().vmovddup(zmmA, zmmB);
- cc.evex().vmovdqa32(xmmA, xmmB);
- cc.evex().vmovdqa32(xmmA, xmmB);
- cc.evex().vmovdqa32(ymmA, ymmB);
- cc.evex().vmovdqa32(ymmA, ymmB);
- cc.evex().vmovdqa32(zmmA, zmmB);
- cc.evex().vmovdqa32(zmmA, zmmB);
- cc.evex().vmovdqa64(xmmA, xmmB);
- cc.evex().vmovdqa64(xmmA, xmmB);
- cc.evex().vmovdqa64(ymmA, ymmB);
- cc.evex().vmovdqa64(ymmA, ymmB);
- cc.evex().vmovdqa64(zmmA, zmmB);
- cc.evex().vmovdqa64(zmmA, zmmB);
- cc.evex().vmovdqu16(xmmA, xmmB);
- cc.evex().vmovdqu16(xmmA, xmmB);
- cc.evex().vmovdqu16(ymmA, ymmB);
- cc.evex().vmovdqu16(ymmA, ymmB);
- cc.evex().vmovdqu16(zmmA, zmmB);
- cc.evex().vmovdqu16(zmmA, zmmB);
- cc.evex().vmovdqu32(xmmA, xmmB);
- cc.evex().vmovdqu32(xmmA, xmmB);
- cc.evex().vmovdqu32(ymmA, ymmB);
- cc.evex().vmovdqu32(ymmA, ymmB);
- cc.evex().vmovdqu32(zmmA, zmmB);
- cc.evex().vmovdqu32(zmmA, zmmB);
- cc.evex().vmovdqu64(xmmA, xmmB);
- cc.evex().vmovdqu64(xmmA, xmmB);
- cc.evex().vmovdqu64(ymmA, ymmB);
- cc.evex().vmovdqu64(ymmA, ymmB);
- cc.evex().vmovdqu64(zmmA, zmmB);
- cc.evex().vmovdqu64(zmmA, zmmB);
- cc.evex().vmovdqu8(xmmA, xmmB);
- cc.evex().vmovdqu8(xmmA, xmmB);
- cc.evex().vmovdqu8(ymmA, ymmB);
- cc.evex().vmovdqu8(ymmA, ymmB);
- cc.evex().vmovdqu8(zmmA, zmmB);
- cc.evex().vmovdqu8(zmmA, zmmB);
- cc.evex().vmovhlps(xmmA, xmmB, xmmC);
- if (cc.is64Bit()) cc.evex().vmovq(gpq, xmmB);
- if (cc.is64Bit()) cc.evex().vmovq(xmmA, gpq);
- cc.evex().vmovq(xmmA, xmmB);
- cc.evex().vmovsd(xmmA, xmmB, xmmC);
- cc.evex().vmovshdup(xmmA, xmmB);
- cc.evex().vmovshdup(ymmA, ymmB);
- cc.evex().vmovshdup(zmmA, zmmB);
- cc.evex().vmovsldup(xmmA, xmmB);
- cc.evex().vmovsldup(ymmA, ymmB);
- cc.evex().vmovsldup(zmmA, zmmB);
- cc.evex().vmovss(xmmA, xmmB, xmmC);
- cc.evex().vmovupd(xmmA, xmmB);
- cc.evex().vmovupd(xmmA, xmmB);
- cc.evex().vmovupd(ymmA, ymmB);
- cc.evex().vmovupd(ymmA, ymmB);
- cc.evex().vmovupd(zmmA, zmmB);
- cc.evex().vmovupd(zmmA, zmmB);
- cc.evex().vmovups(xmmA, xmmB);
- cc.evex().vmovups(xmmA, xmmB);
- cc.evex().vmovups(ymmA, ymmB);
- cc.evex().vmovups(ymmA, ymmB);
- cc.evex().vmovups(zmmA, zmmB);
- cc.evex().vmovups(zmmA, zmmB);
- cc.evex().vmulpd(xmmA, xmmB, xmmC);
- cc.evex().vmulpd(ymmA, ymmB, ymmC);
- cc.evex().vmulpd(zmmA, zmmB, zmmC);
- cc.evex().vmulps(xmmA, xmmB, xmmC);
- cc.evex().vmulps(ymmA, ymmB, ymmC);
- cc.evex().vmulps(zmmA, zmmB, zmmC);
- cc.evex().vmulsd(xmmA, xmmB, xmmC);
- cc.evex().vmulss(xmmA, xmmB, xmmC);
- cc.evex().vorpd(xmmA, xmmB, xmmC);
- cc.evex().vorpd(ymmA, ymmB, ymmC);
- cc.evex().vorpd(zmmA, zmmB, zmmC);
- cc.evex().vorps(xmmA, xmmB, xmmC);
- cc.evex().vorps(ymmA, ymmB, ymmC);
- cc.evex().vorps(zmmA, zmmB, zmmC);
- cc.evex().vpabsb(xmmA, xmmB);
- cc.evex().vpabsb(ymmA, ymmB);
- cc.evex().vpabsb(zmmA, zmmB);
- cc.evex().vpabsd(xmmA, xmmB);
- cc.evex().vpabsd(ymmA, ymmB);
- cc.evex().vpabsd(zmmA, zmmB);
- cc.evex().vpabsq(xmmA, xmmB);
- cc.evex().vpabsq(ymmA, ymmB);
- cc.evex().vpabsq(zmmA, zmmB);
- cc.evex().vpabsw(xmmA, xmmB);
- cc.evex().vpabsw(ymmA, ymmB);
- cc.evex().vpabsw(zmmA, zmmB);
- cc.evex().vpackssdw(xmmA, xmmB, xmmC);
- cc.evex().vpackssdw(ymmA, ymmB, ymmC);
- cc.evex().vpackssdw(zmmA, zmmB, zmmC);
- cc.evex().vpacksswb(xmmA, xmmB, xmmC);
- cc.evex().vpacksswb(ymmA, ymmB, ymmC);
- cc.evex().vpacksswb(zmmA, zmmB, zmmC);
- cc.evex().vpackusdw(xmmA, xmmB, xmmC);
- cc.evex().vpackusdw(ymmA, ymmB, ymmC);
- cc.evex().vpackusdw(zmmA, zmmB, zmmC);
- cc.evex().vpackuswb(xmmA, xmmB, xmmC);
- cc.evex().vpackuswb(ymmA, ymmB, ymmC);
- cc.evex().vpackuswb(zmmA, zmmB, zmmC);
- cc.evex().vpaddb(xmmA, xmmB, xmmC);
- cc.evex().vpaddb(ymmA, ymmB, ymmC);
- cc.evex().vpaddb(zmmA, zmmB, zmmC);
- cc.evex().vpaddd(xmmA, xmmB, xmmC);
- cc.evex().vpaddd(ymmA, ymmB, ymmC);
- cc.evex().vpaddd(zmmA, zmmB, zmmC);
- cc.evex().vpaddq(xmmA, xmmB, xmmC);
- cc.evex().vpaddq(ymmA, ymmB, ymmC);
- cc.evex().vpaddq(zmmA, zmmB, zmmC);
- cc.evex().vpaddsb(xmmA, xmmB, xmmC);
- cc.evex().vpaddsb(ymmA, ymmB, ymmC);
- cc.evex().vpaddsb(zmmA, zmmB, zmmC);
- cc.evex().vpaddsw(xmmA, xmmB, xmmC);
- cc.evex().vpaddsw(ymmA, ymmB, ymmC);
- cc.evex().vpaddsw(zmmA, zmmB, zmmC);
- cc.evex().vpaddusb(xmmA, xmmB, xmmC);
- cc.evex().vpaddusb(ymmA, ymmB, ymmC);
- cc.evex().vpaddusb(zmmA, zmmB, zmmC);
- cc.evex().vpaddusw(xmmA, xmmB, xmmC);
- cc.evex().vpaddusw(ymmA, ymmB, ymmC);
- cc.evex().vpaddusw(zmmA, zmmB, zmmC);
- cc.evex().vpaddw(xmmA, xmmB, xmmC);
- cc.evex().vpaddw(ymmA, ymmB, ymmC);
- cc.evex().vpaddw(zmmA, zmmB, zmmC);
- cc.evex().vpalignr(xmmA, xmmB, xmmC, 0);
- cc.evex().vpalignr(ymmA, ymmB, ymmC, 0);
- cc.evex().vpalignr(zmmA, zmmB, zmmC, 0);
- cc.evex().vpandd(xmmA, xmmB, xmmC);
- cc.evex().vpandd(ymmA, ymmB, ymmC);
- cc.evex().vpandd(zmmA, zmmB, zmmC);
- cc.evex().vpandnd(xmmA, xmmB, xmmC);
- cc.evex().vpandnd(ymmA, ymmB, ymmC);
- cc.evex().vpandnd(zmmA, zmmB, zmmC);
- cc.evex().vpandnq(xmmA, xmmB, xmmC);
- cc.evex().vpandnq(ymmA, ymmB, ymmC);
- cc.evex().vpandnq(zmmA, zmmB, zmmC);
- cc.evex().vpandq(xmmA, xmmB, xmmC);
- cc.evex().vpandq(ymmA, ymmB, ymmC);
- cc.evex().vpandq(zmmA, zmmB, zmmC);
- cc.evex().vpavgb(xmmA, xmmB, xmmC);
- cc.evex().vpavgb(ymmA, ymmB, ymmC);
- cc.evex().vpavgb(zmmA, zmmB, zmmC);
- cc.evex().vpavgw(xmmA, xmmB, xmmC);
- cc.evex().vpavgw(ymmA, ymmB, ymmC);
- cc.evex().vpavgw(zmmA, zmmB, zmmC);
- cc.evex().vpblendmb(xmmA, xmmB, xmmC);
- cc.evex().vpblendmb(ymmA, ymmB, ymmC);
- cc.evex().vpblendmb(zmmA, zmmB, zmmC);
- cc.evex().vpblendmd(xmmA, xmmB, xmmC);
- cc.evex().vpblendmd(ymmA, ymmB, ymmC);
- cc.evex().vpblendmd(zmmA, zmmB, zmmC);
- cc.evex().vpblendmq(xmmA, xmmB, xmmC);
- cc.evex().vpblendmq(ymmA, ymmB, ymmC);
- cc.evex().vpblendmq(zmmA, zmmB, zmmC);
- cc.evex().vpblendmw(xmmA, xmmB, xmmC);
- cc.evex().vpblendmw(ymmA, ymmB, ymmC);
- cc.evex().vpblendmw(zmmA, zmmB, zmmC);
- cc.evex().vpbroadcastb(xmmA, gpd);
- cc.evex().vpbroadcastb(xmmA, xmmB);
- cc.evex().vpbroadcastb(ymmA, gpd);
- cc.evex().vpbroadcastb(ymmA, xmmB);
- cc.evex().vpbroadcastb(zmmA, gpd);
- cc.evex().vpbroadcastb(zmmA, xmmB);
- cc.evex().vpbroadcastd(xmmA, gpd);
- cc.evex().vpbroadcastd(xmmA, xmmB);
- cc.evex().vpbroadcastd(ymmA, gpd);
- cc.evex().vpbroadcastd(ymmA, xmmB);
- cc.evex().vpbroadcastd(zmmA, gpd);
- cc.evex().vpbroadcastd(zmmA, xmmB);
- cc.evex().vpbroadcastmb2q(xmmA, kB);
- cc.evex().vpbroadcastmb2q(ymmA, kB);
- cc.evex().vpbroadcastmb2q(zmmA, kB);
- cc.evex().vpbroadcastmw2d(xmmA, kB);
- cc.evex().vpbroadcastmw2d(ymmA, kB);
- cc.evex().vpbroadcastmw2d(zmmA, kB);
- if (cc.is64Bit()) cc.evex().vpbroadcastq(xmmA, gpq);
- cc.evex().vpbroadcastq(xmmA, xmmB);
- if (cc.is64Bit()) cc.evex().vpbroadcastq(ymmA, gpq);
- cc.evex().vpbroadcastq(ymmA, xmmB);
- if (cc.is64Bit()) cc.evex().vpbroadcastq(zmmA, gpq);
- cc.evex().vpbroadcastq(zmmA, xmmB);
- cc.evex().vpbroadcastw(xmmA, gpd);
- cc.evex().vpbroadcastw(xmmA, xmmB);
- cc.evex().vpbroadcastw(ymmA, gpd);
- cc.evex().vpbroadcastw(ymmA, xmmB);
- cc.evex().vpbroadcastw(zmmA, gpd);
- cc.evex().vpbroadcastw(zmmA, xmmB);
- cc.evex().vpcmpb(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpb(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpb(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpd(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpd(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpd(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpeqb(kA, xmmB, xmmC);
- cc.evex().vpcmpeqb(kA, ymmB, ymmC);
- cc.evex().vpcmpeqb(kA, zmmB, zmmC);
- cc.evex().vpcmpeqd(kA, xmmB, xmmC);
- cc.evex().vpcmpeqd(kA, ymmB, ymmC);
- cc.evex().vpcmpeqd(kA, zmmB, zmmC);
- cc.evex().vpcmpeqq(kA, xmmB, xmmC);
- cc.evex().vpcmpeqq(kA, ymmB, ymmC);
- cc.evex().vpcmpeqq(kA, zmmB, zmmC);
- cc.evex().vpcmpeqw(kA, xmmB, xmmC);
- cc.evex().vpcmpeqw(kA, ymmB, ymmC);
- cc.evex().vpcmpeqw(kA, zmmB, zmmC);
- cc.evex().vpcmpgtb(kA, xmmB, xmmC);
- cc.evex().vpcmpgtb(kA, ymmB, ymmC);
- cc.evex().vpcmpgtb(kA, zmmB, zmmC);
- cc.evex().vpcmpgtd(kA, xmmB, xmmC);
- cc.evex().vpcmpgtd(kA, ymmB, ymmC);
- cc.evex().vpcmpgtd(kA, zmmB, zmmC);
- cc.evex().vpcmpgtq(kA, xmmB, xmmC);
- cc.evex().vpcmpgtq(kA, ymmB, ymmC);
- cc.evex().vpcmpgtq(kA, zmmB, zmmC);
- cc.evex().vpcmpgtw(kA, xmmB, xmmC);
- cc.evex().vpcmpgtw(kA, ymmB, ymmC);
- cc.evex().vpcmpgtw(kA, zmmB, zmmC);
- cc.evex().vpcmpq(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpq(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpq(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpub(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpub(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpub(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpud(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpud(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpud(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpuq(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpuq(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpuq(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpuw(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpuw(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpuw(kA, zmmB, zmmC, 0);
- cc.evex().vpcmpw(kA, xmmB, xmmC, 0);
- cc.evex().vpcmpw(kA, ymmB, ymmC, 0);
- cc.evex().vpcmpw(kA, zmmB, zmmC, 0);
- cc.evex().vpcompressd(xmmA, xmmB);
- cc.evex().vpcompressd(ymmA, ymmB);
- cc.evex().vpcompressd(zmmA, zmmB);
- cc.evex().vpcompressq(xmmA, xmmB);
- cc.evex().vpcompressq(ymmA, ymmB);
- cc.evex().vpcompressq(zmmA, zmmB);
- cc.evex().vpconflictd(xmmA, xmmB);
- cc.evex().vpconflictd(ymmA, ymmB);
- cc.evex().vpconflictd(zmmA, zmmB);
- cc.evex().vpconflictq(xmmA, xmmB);
- cc.evex().vpconflictq(ymmA, ymmB);
- cc.evex().vpconflictq(zmmA, zmmB);
- cc.evex().vpermb(xmmA, xmmB, xmmC);
- cc.evex().vpermb(ymmA, ymmB, ymmC);
- cc.evex().vpermb(zmmA, zmmB, zmmC);
- cc.evex().vpermd(ymmA, ymmB, ymmC);
- cc.evex().vpermd(zmmA, zmmB, zmmC);
- cc.evex().vpermi2b(xmmA, xmmB, xmmC);
- cc.evex().vpermi2b(ymmA, ymmB, ymmC);
- cc.evex().vpermi2b(zmmA, zmmB, zmmC);
- cc.evex().vpermi2d(xmmA, xmmB, xmmC);
- cc.evex().vpermi2d(ymmA, ymmB, ymmC);
- cc.evex().vpermi2d(zmmA, zmmB, zmmC);
- cc.evex().vpermi2pd(xmmA, xmmB, xmmC);
- cc.evex().vpermi2pd(ymmA, ymmB, ymmC);
- cc.evex().vpermi2pd(zmmA, zmmB, zmmC);
- cc.evex().vpermi2ps(xmmA, xmmB, xmmC);
- cc.evex().vpermi2ps(ymmA, ymmB, ymmC);
- cc.evex().vpermi2ps(zmmA, zmmB, zmmC);
- cc.evex().vpermi2q(xmmA, xmmB, xmmC);
- cc.evex().vpermi2q(ymmA, ymmB, ymmC);
- cc.evex().vpermi2q(zmmA, zmmB, zmmC);
- cc.evex().vpermi2w(xmmA, xmmB, xmmC);
- cc.evex().vpermi2w(ymmA, ymmB, ymmC);
- cc.evex().vpermi2w(zmmA, zmmB, zmmC);
- cc.evex().vpermilpd(xmmA, xmmB, xmmC);
- cc.evex().vpermilpd(ymmA, ymmB, ymmC);
- cc.evex().vpermilpd(zmmA, zmmB, zmmC);
- cc.evex().vpermilpd(xmmA, xmmB, 0);
- cc.evex().vpermilpd(ymmA, ymmB, 0);
- cc.evex().vpermilpd(zmmA, zmmB, 0);
- cc.evex().vpermilps(xmmA, xmmB, xmmC);
- cc.evex().vpermilps(ymmA, ymmB, ymmC);
- cc.evex().vpermilps(zmmA, zmmB, zmmC);
- cc.evex().vpermilps(xmmA, xmmB, 0);
- cc.evex().vpermilps(ymmA, ymmB, 0);
- cc.evex().vpermilps(zmmA, zmmB, 0);
- cc.evex().vpermq(ymmA, ymmB, ymmC);
- cc.evex().vpermq(zmmA, zmmB, zmmC);
- cc.evex().vpermq(ymmA, ymmB, 0);
- cc.evex().vpermq(zmmA, zmmB, 0);
- cc.evex().vpermt2b(xmmA, xmmB, xmmC);
- cc.evex().vpermt2b(ymmA, ymmB, ymmC);
- cc.evex().vpermt2b(zmmA, zmmB, zmmC);
- cc.evex().vpermt2d(xmmA, xmmB, xmmC);
- cc.evex().vpermt2d(ymmA, ymmB, ymmC);
- cc.evex().vpermt2d(zmmA, zmmB, zmmC);
- cc.evex().vpermt2pd(xmmA, xmmB, xmmC);
- cc.evex().vpermt2pd(ymmA, ymmB, ymmC);
- cc.evex().vpermt2pd(zmmA, zmmB, zmmC);
- cc.evex().vpermt2ps(xmmA, xmmB, xmmC);
- cc.evex().vpermt2ps(ymmA, ymmB, ymmC);
- cc.evex().vpermt2ps(zmmA, zmmB, zmmC);
- cc.evex().vpermt2q(xmmA, xmmB, xmmC);
- cc.evex().vpermt2q(ymmA, ymmB, ymmC);
- cc.evex().vpermt2q(zmmA, zmmB, zmmC);
- cc.evex().vpermt2w(xmmA, xmmB, xmmC);
- cc.evex().vpermt2w(ymmA, ymmB, ymmC);
- cc.evex().vpermt2w(zmmA, zmmB, zmmC);
- cc.evex().vpermw(xmmA, xmmB, xmmC);
- cc.evex().vpermw(ymmA, ymmB, ymmC);
- cc.evex().vpermw(zmmA, zmmB, zmmC);
- cc.evex().vpexpandd(xmmA, xmmB);
- cc.evex().vpexpandd(ymmA, ymmB);
- cc.evex().vpexpandd(zmmA, zmmB);
- cc.evex().vpexpandq(xmmA, xmmB);
- cc.evex().vpexpandq(ymmA, ymmB);
- cc.evex().vpexpandq(zmmA, zmmB);
- cc.evex().vpextrb(gpd, xmmB, 0);
- cc.evex().vpextrd(gpd, xmmB, 0);
- if (cc.is64Bit()) cc.evex().vpextrq(gpq, xmmB, 0);
- cc.evex().vpextrw(gpd, xmmB, 0);
- cc.evex().vpinsrb(xmmA, xmmB, gpd, 0);
- cc.evex().vpinsrd(xmmA, xmmB, gpd, 0);
- if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, gpq, 0);
- cc.evex().vpinsrw(xmmA, xmmB, gpd, 0);
- cc.evex().vplzcntd(xmmA, xmmB);
- cc.evex().vplzcntd(ymmA, ymmB);
- cc.evex().vplzcntd(zmmA, zmmB);
- cc.evex().vplzcntq(xmmA, xmmB);
- cc.evex().vplzcntq(ymmA, ymmB);
- cc.evex().vplzcntq(zmmA, zmmB);
- cc.evex().vpmadd52huq(xmmA, xmmB, xmmC);
- cc.evex().vpmadd52huq(ymmA, ymmB, ymmC);
- cc.evex().vpmadd52huq(zmmA, zmmB, zmmC);
- cc.evex().vpmadd52luq(xmmA, xmmB, xmmC);
- cc.evex().vpmadd52luq(ymmA, ymmB, ymmC);
- cc.evex().vpmadd52luq(zmmA, zmmB, zmmC);
- cc.evex().vpmaddubsw(xmmA, xmmB, xmmC);
- cc.evex().vpmaddubsw(ymmA, ymmB, ymmC);
- cc.evex().vpmaddubsw(zmmA, zmmB, zmmC);
- cc.evex().vpmaddwd(xmmA, xmmB, xmmC);
- cc.evex().vpmaddwd(ymmA, ymmB, ymmC);
- cc.evex().vpmaddwd(zmmA, zmmB, zmmC);
- cc.evex().vpmaxsb(xmmA, xmmB, xmmC);
- cc.evex().vpmaxsb(ymmA, ymmB, ymmC);
- cc.evex().vpmaxsb(zmmA, zmmB, zmmC);
- cc.evex().vpmaxsd(xmmA, xmmB, xmmC);
- cc.evex().vpmaxsd(ymmA, ymmB, ymmC);
- cc.evex().vpmaxsd(zmmA, zmmB, zmmC);
- cc.evex().vpmaxsq(xmmA, xmmB, xmmC);
- cc.evex().vpmaxsq(ymmA, ymmB, ymmC);
- cc.evex().vpmaxsq(zmmA, zmmB, zmmC);
- cc.evex().vpmaxsw(xmmA, xmmB, xmmC);
- cc.evex().vpmaxsw(ymmA, ymmB, ymmC);
- cc.evex().vpmaxsw(zmmA, zmmB, zmmC);
- cc.evex().vpmaxub(xmmA, xmmB, xmmC);
- cc.evex().vpmaxub(ymmA, ymmB, ymmC);
- cc.evex().vpmaxub(zmmA, zmmB, zmmC);
- cc.evex().vpmaxud(xmmA, xmmB, xmmC);
- cc.evex().vpmaxud(ymmA, ymmB, ymmC);
- cc.evex().vpmaxud(zmmA, zmmB, zmmC);
- cc.evex().vpmaxuq(xmmA, xmmB, xmmC);
- cc.evex().vpmaxuq(ymmA, ymmB, ymmC);
- cc.evex().vpmaxuq(zmmA, zmmB, zmmC);
- cc.evex().vpmaxuw(xmmA, xmmB, xmmC);
- cc.evex().vpmaxuw(ymmA, ymmB, ymmC);
- cc.evex().vpmaxuw(zmmA, zmmB, zmmC);
- cc.evex().vpminsb(xmmA, xmmB, xmmC);
- cc.evex().vpminsb(ymmA, ymmB, ymmC);
- cc.evex().vpminsb(zmmA, zmmB, zmmC);
- cc.evex().vpminsd(xmmA, xmmB, xmmC);
- cc.evex().vpminsd(ymmA, ymmB, ymmC);
- cc.evex().vpminsd(zmmA, zmmB, zmmC);
- cc.evex().vpminsq(xmmA, xmmB, xmmC);
- cc.evex().vpminsq(ymmA, ymmB, ymmC);
- cc.evex().vpminsq(zmmA, zmmB, zmmC);
- cc.evex().vpminsw(xmmA, xmmB, xmmC);
- cc.evex().vpminsw(ymmA, ymmB, ymmC);
- cc.evex().vpminsw(zmmA, zmmB, zmmC);
- cc.evex().vpminub(xmmA, xmmB, xmmC);
- cc.evex().vpminub(ymmA, ymmB, ymmC);
- cc.evex().vpminub(zmmA, zmmB, zmmC);
- cc.evex().vpminud(xmmA, xmmB, xmmC);
- cc.evex().vpminud(ymmA, ymmB, ymmC);
- cc.evex().vpminud(zmmA, zmmB, zmmC);
- cc.evex().vpminuq(xmmA, xmmB, xmmC);
- cc.evex().vpminuq(ymmA, ymmB, ymmC);
- cc.evex().vpminuq(zmmA, zmmB, zmmC);
- cc.evex().vpminuw(xmmA, xmmB, xmmC);
- cc.evex().vpminuw(ymmA, ymmB, ymmC);
- cc.evex().vpminuw(zmmA, zmmB, zmmC);
- cc.evex().vpmovb2m(kA, xmmB);
- cc.evex().vpmovb2m(kA, ymmB);
- cc.evex().vpmovb2m(kA, zmmB);
- cc.evex().vpmovd2m(kA, xmmB);
- cc.evex().vpmovd2m(kA, ymmB);
- cc.evex().vpmovd2m(kA, zmmB);
- cc.evex().vpmovdb(xmmA, xmmB);
- cc.evex().vpmovdb(xmmA, ymmB);
- cc.evex().vpmovdb(xmmA, zmmB);
- cc.evex().vpmovdw(xmmA, xmmB);
- cc.evex().vpmovdw(xmmA, ymmB);
- cc.evex().vpmovdw(ymmA, zmmB);
- cc.evex().vpmovm2b(xmmA, kB);
- cc.evex().vpmovm2b(ymmA, kB);
- cc.evex().vpmovm2b(zmmA, kB);
- cc.evex().vpmovm2d(xmmA, kB);
- cc.evex().vpmovm2d(ymmA, kB);
- cc.evex().vpmovm2d(zmmA, kB);
- cc.evex().vpmovm2q(xmmA, kB);
- cc.evex().vpmovm2q(ymmA, kB);
- cc.evex().vpmovm2q(zmmA, kB);
- cc.evex().vpmovm2w(xmmA, kB);
- cc.evex().vpmovm2w(ymmA, kB);
- cc.evex().vpmovm2w(zmmA, kB);
- cc.evex().vpmovq2m(kA, xmmB);
- cc.evex().vpmovq2m(kA, ymmB);
- cc.evex().vpmovq2m(kA, zmmB);
- cc.evex().vpmovqb(xmmA, xmmB);
- cc.evex().vpmovqb(xmmA, ymmB);
- cc.evex().vpmovqb(xmmA, zmmB);
- cc.evex().vpmovqd(xmmA, xmmB);
- cc.evex().vpmovqd(xmmA, ymmB);
- cc.evex().vpmovqd(ymmA, zmmB);
- cc.evex().vpmovqw(xmmA, xmmB);
- cc.evex().vpmovqw(xmmA, ymmB);
- cc.evex().vpmovqw(xmmA, zmmB);
- cc.evex().vpmovsdb(xmmA, xmmB);
- cc.evex().vpmovsdb(xmmA, ymmB);
- cc.evex().vpmovsdb(xmmA, zmmB);
- cc.evex().vpmovsdw(xmmA, xmmB);
- cc.evex().vpmovsdw(xmmA, ymmB);
- cc.evex().vpmovsdw(ymmA, zmmB);
- cc.evex().vpmovsqb(xmmA, xmmB);
- cc.evex().vpmovsqb(xmmA, ymmB);
- cc.evex().vpmovsqb(xmmA, zmmB);
- cc.evex().vpmovsqd(xmmA, xmmB);
- cc.evex().vpmovsqd(xmmA, ymmB);
- cc.evex().vpmovsqd(ymmA, zmmB);
- cc.evex().vpmovsqw(xmmA, xmmB);
- cc.evex().vpmovsqw(xmmA, ymmB);
- cc.evex().vpmovsqw(xmmA, zmmB);
- cc.evex().vpmovswb(xmmA, xmmB);
- cc.evex().vpmovswb(xmmA, ymmB);
- cc.evex().vpmovswb(ymmA, zmmB);
- cc.evex().vpmovsxbd(xmmA, xmmB);
- cc.evex().vpmovsxbd(ymmA, xmmB);
- cc.evex().vpmovsxbd(zmmA, xmmB);
- cc.evex().vpmovsxbq(xmmA, xmmB);
- cc.evex().vpmovsxbq(ymmA, xmmB);
- cc.evex().vpmovsxbq(zmmA, xmmB);
- cc.evex().vpmovsxbw(xmmA, xmmB);
- cc.evex().vpmovsxbw(ymmA, xmmB);
- cc.evex().vpmovsxbw(zmmA, ymmB);
- cc.evex().vpmovsxdq(xmmA, xmmB);
- cc.evex().vpmovsxdq(ymmA, xmmB);
- cc.evex().vpmovsxdq(zmmA, ymmB);
- cc.evex().vpmovsxwd(xmmA, xmmB);
- cc.evex().vpmovsxwd(ymmA, xmmB);
- cc.evex().vpmovsxwd(zmmA, ymmB);
- cc.evex().vpmovsxwq(xmmA, xmmB);
- cc.evex().vpmovsxwq(ymmA, xmmB);
- cc.evex().vpmovsxwq(zmmA, xmmB);
- cc.evex().vpmovusdb(xmmA, xmmB);
- cc.evex().vpmovusdb(xmmA, ymmB);
- cc.evex().vpmovusdb(xmmA, zmmB);
- cc.evex().vpmovusdw(xmmA, xmmB);
- cc.evex().vpmovusdw(xmmA, ymmB);
- cc.evex().vpmovusdw(ymmA, zmmB);
- cc.evex().vpmovusqb(xmmA, xmmB);
- cc.evex().vpmovusqb(xmmA, ymmB);
- cc.evex().vpmovusqb(xmmA, zmmB);
- cc.evex().vpmovusqd(xmmA, xmmB);
- cc.evex().vpmovusqd(xmmA, ymmB);
- cc.evex().vpmovusqd(ymmA, zmmB);
- cc.evex().vpmovusqw(xmmA, xmmB);
- cc.evex().vpmovusqw(xmmA, ymmB);
- cc.evex().vpmovusqw(xmmA, zmmB);
- cc.evex().vpmovuswb(xmmA, xmmB);
- cc.evex().vpmovuswb(xmmA, ymmB);
- cc.evex().vpmovuswb(ymmA, zmmB);
- cc.evex().vpmovw2m(kA, xmmB);
- cc.evex().vpmovw2m(kA, ymmB);
- cc.evex().vpmovw2m(kA, zmmB);
- cc.evex().vpmovwb(xmmA, xmmB);
- cc.evex().vpmovwb(xmmA, ymmB);
- cc.evex().vpmovwb(ymmA, zmmB);
- cc.evex().vpmovzxbd(xmmA, xmmB);
- cc.evex().vpmovzxbd(ymmA, xmmB);
- cc.evex().vpmovzxbd(zmmA, xmmB);
- cc.evex().vpmovzxbq(xmmA, xmmB);
- cc.evex().vpmovzxbq(ymmA, xmmB);
- cc.evex().vpmovzxbq(zmmA, xmmB);
- cc.evex().vpmovzxbw(xmmA, xmmB);
- cc.evex().vpmovzxbw(ymmA, xmmB);
- cc.evex().vpmovzxbw(zmmA, ymmB);
- cc.evex().vpmovzxdq(xmmA, xmmB);
- cc.evex().vpmovzxdq(ymmA, xmmB);
- cc.evex().vpmovzxdq(zmmA, ymmB);
- cc.evex().vpmovzxwd(xmmA, xmmB);
- cc.evex().vpmovzxwd(ymmA, xmmB);
- cc.evex().vpmovzxwd(zmmA, ymmB);
- cc.evex().vpmovzxwq(xmmA, xmmB);
- cc.evex().vpmovzxwq(ymmA, xmmB);
- cc.evex().vpmovzxwq(zmmA, xmmB);
- cc.evex().vpmuldq(xmmA, xmmB, xmmC);
- cc.evex().vpmuldq(ymmA, ymmB, ymmC);
- cc.evex().vpmuldq(zmmA, zmmB, zmmC);
- cc.evex().vpmulhrsw(xmmA, xmmB, xmmC);
- cc.evex().vpmulhrsw(ymmA, ymmB, ymmC);
- cc.evex().vpmulhrsw(zmmA, zmmB, zmmC);
- cc.evex().vpmulhuw(xmmA, xmmB, xmmC);
- cc.evex().vpmulhuw(ymmA, ymmB, ymmC);
- cc.evex().vpmulhuw(zmmA, zmmB, zmmC);
- cc.evex().vpmulhw(xmmA, xmmB, xmmC);
- cc.evex().vpmulhw(ymmA, ymmB, ymmC);
- cc.evex().vpmulhw(zmmA, zmmB, zmmC);
- cc.evex().vpmulld(xmmA, xmmB, xmmC);
- cc.evex().vpmulld(ymmA, ymmB, ymmC);
- cc.evex().vpmulld(zmmA, zmmB, zmmC);
- cc.evex().vpmullq(xmmA, xmmB, xmmC);
- cc.evex().vpmullq(ymmA, ymmB, ymmC);
- cc.evex().vpmullq(zmmA, zmmB, zmmC);
- cc.evex().vpmullw(xmmA, xmmB, xmmC);
- cc.evex().vpmullw(ymmA, ymmB, ymmC);
- cc.evex().vpmullw(zmmA, zmmB, zmmC);
- cc.evex().vpmultishiftqb(xmmA, xmmB, xmmC);
- cc.evex().vpmultishiftqb(ymmA, ymmB, ymmC);
- cc.evex().vpmultishiftqb(zmmA, zmmB, zmmC);
- cc.evex().vpmuludq(xmmA, xmmB, xmmC);
- cc.evex().vpmuludq(ymmA, ymmB, ymmC);
- cc.evex().vpmuludq(zmmA, zmmB, zmmC);
- cc.evex().vpopcntd(zmmA, zmmB);
- cc.evex().vpopcntq(zmmA, zmmB);
- cc.evex().vpord(xmmA, xmmB, xmmC);
- cc.evex().vpord(ymmA, ymmB, ymmC);
- cc.evex().vpord(zmmA, zmmB, zmmC);
- cc.evex().vporq(xmmA, xmmB, xmmC);
- cc.evex().vporq(ymmA, ymmB, ymmC);
- cc.evex().vporq(zmmA, zmmB, zmmC);
- cc.evex().vprold(xmmA, xmmB, 0);
- cc.evex().vprold(ymmA, ymmB, 0);
- cc.evex().vprold(zmmA, zmmB, 0);
- cc.evex().vprolq(xmmA, xmmB, 0);
- cc.evex().vprolq(ymmA, ymmB, 0);
- cc.evex().vprolq(zmmA, zmmB, 0);
- cc.evex().vprolvd(xmmA, xmmB, xmmC);
- cc.evex().vprolvd(ymmA, ymmB, ymmC);
- cc.evex().vprolvd(zmmA, zmmB, zmmC);
- cc.evex().vprolvq(xmmA, xmmB, xmmC);
- cc.evex().vprolvq(ymmA, ymmB, ymmC);
- cc.evex().vprolvq(zmmA, zmmB, zmmC);
- cc.evex().vprord(xmmA, xmmB, 0);
- cc.evex().vprord(ymmA, ymmB, 0);
- cc.evex().vprord(zmmA, zmmB, 0);
- cc.evex().vprorq(xmmA, xmmB, 0);
- cc.evex().vprorq(ymmA, ymmB, 0);
- cc.evex().vprorq(zmmA, zmmB, 0);
- cc.evex().vprorvd(xmmA, xmmB, xmmC);
- cc.evex().vprorvd(ymmA, ymmB, ymmC);
- cc.evex().vprorvd(zmmA, zmmB, zmmC);
- cc.evex().vprorvq(xmmA, xmmB, xmmC);
- cc.evex().vprorvq(ymmA, ymmB, ymmC);
- cc.evex().vprorvq(zmmA, zmmB, zmmC);
- cc.evex().vpsadbw(xmmA, xmmB, xmmC);
- cc.evex().vpsadbw(ymmA, ymmB, ymmC);
- cc.evex().vpsadbw(zmmA, zmmB, zmmC);
- cc.evex().vpshufb(xmmA, xmmB, xmmC);
- cc.evex().vpshufb(ymmA, ymmB, ymmC);
- cc.evex().vpshufb(zmmA, zmmB, zmmC);
- cc.evex().vpshufd(xmmA, xmmB, 0);
- cc.evex().vpshufd(ymmA, ymmB, 0);
- cc.evex().vpshufd(zmmA, zmmB, 0);
- cc.evex().vpshufhw(xmmA, xmmB, 0);
- cc.evex().vpshufhw(ymmA, ymmB, 0);
- cc.evex().vpshufhw(zmmA, zmmB, 0);
- cc.evex().vpshuflw(xmmA, xmmB, 0);
- cc.evex().vpshuflw(ymmA, ymmB, 0);
- cc.evex().vpshuflw(zmmA, zmmB, 0);
- cc.evex().vpslld(xmmA, xmmB, xmmC);
- cc.evex().vpslld(xmmA, xmmB, 0);
- cc.evex().vpslld(ymmA, ymmB, xmmC);
- cc.evex().vpslld(ymmA, ymmB, 0);
- cc.evex().vpslld(zmmA, zmmB, xmmC);
- cc.evex().vpslld(zmmA, zmmB, 0);
- cc.evex().vpslldq(xmmA, xmmB, 0);
- cc.evex().vpslldq(ymmA, ymmB, 0);
- cc.evex().vpslldq(zmmA, zmmB, 0);
- cc.evex().vpsllq(xmmA, xmmB, xmmC);
- cc.evex().vpsllq(xmmA, xmmB, 0);
- cc.evex().vpsllq(ymmA, ymmB, xmmC);
- cc.evex().vpsllq(ymmA, ymmB, 0);
- cc.evex().vpsllq(zmmA, zmmB, xmmC);
- cc.evex().vpsllq(zmmA, zmmB, 0);
- cc.evex().vpsllvd(xmmA, xmmB, xmmC);
- cc.evex().vpsllvd(ymmA, ymmB, ymmC);
- cc.evex().vpsllvd(zmmA, zmmB, zmmC);
- cc.evex().vpsllvq(xmmA, xmmB, xmmC);
- cc.evex().vpsllvq(ymmA, ymmB, ymmC);
- cc.evex().vpsllvq(zmmA, zmmB, zmmC);
- cc.evex().vpsllvw(xmmA, xmmB, xmmC);
- cc.evex().vpsllvw(ymmA, ymmB, ymmC);
- cc.evex().vpsllvw(zmmA, zmmB, zmmC);
- cc.evex().vpsllw(xmmA, xmmB, xmmC);
- cc.evex().vpsllw(xmmA, xmmB, 0);
- cc.evex().vpsllw(ymmA, ymmB, xmmC);
- cc.evex().vpsllw(ymmA, ymmB, 0);
- cc.evex().vpsllw(zmmA, zmmB, xmmC);
- cc.evex().vpsllw(zmmA, zmmB, 0);
- cc.evex().vpsrad(xmmA, xmmB, xmmC);
- cc.evex().vpsrad(xmmA, xmmB, 0);
- cc.evex().vpsrad(ymmA, ymmB, xmmC);
- cc.evex().vpsrad(ymmA, ymmB, 0);
- cc.evex().vpsrad(zmmA, zmmB, xmmC);
- cc.evex().vpsrad(zmmA, zmmB, 0);
- cc.evex().vpsraq(xmmA, xmmB, xmmC);
- cc.evex().vpsraq(xmmA, xmmB, 0);
- cc.evex().vpsraq(ymmA, ymmB, xmmC);
- cc.evex().vpsraq(ymmA, ymmB, 0);
- cc.evex().vpsraq(zmmA, zmmB, xmmC);
- cc.evex().vpsraq(zmmA, zmmB, 0);
- cc.evex().vpsravd(xmmA, xmmB, xmmC);
- cc.evex().vpsravd(ymmA, ymmB, ymmC);
- cc.evex().vpsravd(zmmA, zmmB, zmmC);
- cc.evex().vpsravq(xmmA, xmmB, xmmC);
- cc.evex().vpsravq(ymmA, ymmB, ymmC);
- cc.evex().vpsravq(zmmA, zmmB, zmmC);
- cc.evex().vpsravw(xmmA, xmmB, xmmC);
- cc.evex().vpsravw(ymmA, ymmB, ymmC);
- cc.evex().vpsravw(zmmA, zmmB, zmmC);
- cc.evex().vpsraw(xmmA, xmmB, xmmC);
- cc.evex().vpsraw(xmmA, xmmB, 0);
- cc.evex().vpsraw(ymmA, ymmB, xmmC);
- cc.evex().vpsraw(ymmA, ymmB, 0);
- cc.evex().vpsraw(zmmA, zmmB, xmmC);
- cc.evex().vpsraw(zmmA, zmmB, 0);
- cc.evex().vpsrld(xmmA, xmmB, xmmC);
- cc.evex().vpsrld(xmmA, xmmB, 0);
- cc.evex().vpsrld(ymmA, ymmB, xmmC);
- cc.evex().vpsrld(ymmA, ymmB, 0);
- cc.evex().vpsrld(zmmA, zmmB, xmmC);
- cc.evex().vpsrld(zmmA, zmmB, 0);
- cc.evex().vpsrldq(xmmA, xmmB, 0);
- cc.evex().vpsrldq(ymmA, ymmB, 0);
- cc.evex().vpsrldq(zmmA, zmmB, 0);
- cc.evex().vpsrlq(xmmA, xmmB, xmmC);
- cc.evex().vpsrlq(xmmA, xmmB, 0);
- cc.evex().vpsrlq(ymmA, ymmB, xmmC);
- cc.evex().vpsrlq(ymmA, ymmB, 0);
- cc.evex().vpsrlq(zmmA, zmmB, xmmC);
- cc.evex().vpsrlq(zmmA, zmmB, 0);
- cc.evex().vpsrlvd(xmmA, xmmB, xmmC);
- cc.evex().vpsrlvd(ymmA, ymmB, ymmC);
- cc.evex().vpsrlvd(zmmA, zmmB, zmmC);
- cc.evex().vpsrlvq(xmmA, xmmB, xmmC);
- cc.evex().vpsrlvq(ymmA, ymmB, ymmC);
- cc.evex().vpsrlvq(zmmA, zmmB, zmmC);
- cc.evex().vpsrlvw(xmmA, xmmB, xmmC);
- cc.evex().vpsrlvw(ymmA, ymmB, ymmC);
- cc.evex().vpsrlvw(zmmA, zmmB, zmmC);
- cc.evex().vpsrlw(xmmA, xmmB, xmmC);
- cc.evex().vpsrlw(xmmA, xmmB, 0);
- cc.evex().vpsrlw(ymmA, ymmB, xmmC);
- cc.evex().vpsrlw(ymmA, ymmB, 0);
- cc.evex().vpsrlw(zmmA, zmmB, xmmC);
- cc.evex().vpsrlw(zmmA, zmmB, 0);
- cc.evex().vpsubb(xmmA, xmmB, xmmC);
- cc.evex().vpsubb(ymmA, ymmB, ymmC);
- cc.evex().vpsubb(zmmA, zmmB, zmmC);
- cc.evex().vpsubd(xmmA, xmmB, xmmC);
- cc.evex().vpsubd(ymmA, ymmB, ymmC);
- cc.evex().vpsubd(zmmA, zmmB, zmmC);
- cc.evex().vpsubq(xmmA, xmmB, xmmC);
- cc.evex().vpsubq(ymmA, ymmB, ymmC);
- cc.evex().vpsubq(zmmA, zmmB, zmmC);
- cc.evex().vpsubsb(xmmA, xmmB, xmmC);
- cc.evex().vpsubsb(ymmA, ymmB, ymmC);
- cc.evex().vpsubsb(zmmA, zmmB, zmmC);
- cc.evex().vpsubsw(xmmA, xmmB, xmmC);
- cc.evex().vpsubsw(ymmA, ymmB, ymmC);
- cc.evex().vpsubsw(zmmA, zmmB, zmmC);
- cc.evex().vpsubusb(xmmA, xmmB, xmmC);
- cc.evex().vpsubusb(ymmA, ymmB, ymmC);
- cc.evex().vpsubusb(zmmA, zmmB, zmmC);
- cc.evex().vpsubusw(xmmA, xmmB, xmmC);
- cc.evex().vpsubusw(ymmA, ymmB, ymmC);
- cc.evex().vpsubusw(zmmA, zmmB, zmmC);
- cc.evex().vpsubw(xmmA, xmmB, xmmC);
- cc.evex().vpsubw(ymmA, ymmB, ymmC);
- cc.evex().vpsubw(zmmA, zmmB, zmmC);
- cc.evex().vpternlogd(xmmA, xmmB, xmmC, 0);
- cc.evex().vpternlogd(ymmA, ymmB, ymmC, 0);
- cc.evex().vpternlogd(zmmA, zmmB, zmmC, 0);
- cc.evex().vpternlogq(xmmA, xmmB, xmmC, 0);
- cc.evex().vpternlogq(ymmA, ymmB, ymmC, 0);
- cc.evex().vpternlogq(zmmA, zmmB, zmmC, 0);
- cc.evex().vptestmb(kA, xmmB, xmmC);
- cc.evex().vptestmb(kA, ymmB, ymmC);
- cc.evex().vptestmb(kA, zmmB, zmmC);
- cc.evex().vptestmd(kA, xmmB, xmmC);
- cc.evex().vptestmd(kA, ymmB, ymmC);
- cc.evex().vptestmd(kA, zmmB, zmmC);
- cc.evex().vptestmq(kA, xmmB, xmmC);
- cc.evex().vptestmq(kA, ymmB, ymmC);
- cc.evex().vptestmq(kA, zmmB, zmmC);
- cc.evex().vptestmw(kA, xmmB, xmmC);
- cc.evex().vptestmw(kA, ymmB, ymmC);
- cc.evex().vptestmw(kA, zmmB, zmmC);
- cc.evex().vptestnmb(kA, xmmB, xmmC);
- cc.evex().vptestnmb(kA, ymmB, ymmC);
- cc.evex().vptestnmb(kA, zmmB, zmmC);
- cc.evex().vptestnmd(kA, xmmB, xmmC);
- cc.evex().vptestnmd(kA, ymmB, ymmC);
- cc.evex().vptestnmd(kA, zmmB, zmmC);
- cc.evex().vptestnmq(kA, xmmB, xmmC);
- cc.evex().vptestnmq(kA, ymmB, ymmC);
- cc.evex().vptestnmq(kA, zmmB, zmmC);
- cc.evex().vptestnmw(kA, xmmB, xmmC);
- cc.evex().vptestnmw(kA, ymmB, ymmC);
- cc.evex().vptestnmw(kA, zmmB, zmmC);
- cc.evex().vpunpckhbw(xmmA, xmmB, xmmC);
- cc.evex().vpunpckhbw(ymmA, ymmB, ymmC);
- cc.evex().vpunpckhbw(zmmA, zmmB, zmmC);
- cc.evex().vpunpckhdq(xmmA, xmmB, xmmC);
- cc.evex().vpunpckhdq(ymmA, ymmB, ymmC);
- cc.evex().vpunpckhdq(zmmA, zmmB, zmmC);
- cc.evex().vpunpckhqdq(xmmA, xmmB, xmmC);
- cc.evex().vpunpckhqdq(ymmA, ymmB, ymmC);
- cc.evex().vpunpckhqdq(zmmA, zmmB, zmmC);
- cc.evex().vpunpckhwd(xmmA, xmmB, xmmC);
- cc.evex().vpunpckhwd(ymmA, ymmB, ymmC);
- cc.evex().vpunpckhwd(zmmA, zmmB, zmmC);
- cc.evex().vpunpcklbw(xmmA, xmmB, xmmC);
- cc.evex().vpunpcklbw(ymmA, ymmB, ymmC);
- cc.evex().vpunpcklbw(zmmA, zmmB, zmmC);
- cc.evex().vpunpckldq(xmmA, xmmB, xmmC);
- cc.evex().vpunpckldq(ymmA, ymmB, ymmC);
- cc.evex().vpunpckldq(zmmA, zmmB, zmmC);
- cc.evex().vpunpcklqdq(xmmA, xmmB, xmmC);
- cc.evex().vpunpcklqdq(ymmA, ymmB, ymmC);
- cc.evex().vpunpcklqdq(zmmA, zmmB, zmmC);
- cc.evex().vpunpcklwd(xmmA, xmmB, xmmC);
- cc.evex().vpunpcklwd(ymmA, ymmB, ymmC);
- cc.evex().vpunpcklwd(zmmA, zmmB, zmmC);
- cc.evex().vpxord(xmmA, xmmB, xmmC);
- cc.evex().vpxord(ymmA, ymmB, ymmC);
- cc.evex().vpxord(zmmA, zmmB, zmmC);
- cc.evex().vpxorq(xmmA, xmmB, xmmC);
- cc.evex().vpxorq(ymmA, ymmB, ymmC);
- cc.evex().vpxorq(zmmA, zmmB, zmmC);
- cc.evex().vrangepd(xmmA, xmmB, xmmC, 0);
- cc.evex().vrangepd(ymmA, ymmB, ymmC, 0);
- cc.evex().vrangepd(zmmA, zmmB, zmmC, 0);
- cc.evex().vrangeps(xmmA, xmmB, xmmC, 0);
- cc.evex().vrangeps(ymmA, ymmB, ymmC, 0);
- cc.evex().vrangeps(zmmA, zmmB, zmmC, 0);
- cc.evex().vrangesd(xmmA, xmmB, xmmC, 0);
- cc.evex().vrangess(xmmA, xmmB, xmmC, 0);
- cc.evex().vrcp14pd(xmmA, xmmB);
- cc.evex().vrcp14pd(ymmA, ymmB);
- cc.evex().vrcp14pd(zmmA, zmmB);
- cc.evex().vrcp14ps(xmmA, xmmB);
- cc.evex().vrcp14ps(ymmA, ymmB);
- cc.evex().vrcp14ps(zmmA, zmmB);
- cc.evex().vrcp14sd(xmmA, xmmB, xmmC);
- cc.evex().vrcp14ss(xmmA, xmmB, xmmC);
- cc.evex().vrcp28pd(zmmA, zmmB);
- cc.evex().vrcp28ps(zmmA, zmmB);
- cc.evex().vrcp28sd(xmmA, xmmB, xmmC);
- cc.evex().vrcp28ss(xmmA, xmmB, xmmC);
- cc.evex().vreducepd(xmmA, xmmB, 0);
- cc.evex().vreducepd(ymmA, ymmB, 0);
- cc.evex().vreducepd(zmmA, zmmB, 0);
- cc.evex().vreduceps(xmmA, xmmB, 0);
- cc.evex().vreduceps(ymmA, ymmB, 0);
- cc.evex().vreduceps(zmmA, zmmB, 0);
- cc.evex().vreducesd(xmmA, xmmB, xmmC, 0);
- cc.evex().vreducess(xmmA, xmmB, xmmC, 0);
- cc.evex().vrndscalepd(xmmA, xmmB, 0);
- cc.evex().vrndscalepd(ymmA, ymmB, 0);
- cc.evex().vrndscalepd(zmmA, zmmB, 0);
- cc.evex().vrndscaleps(xmmA, xmmB, 0);
- cc.evex().vrndscaleps(ymmA, ymmB, 0);
- cc.evex().vrndscaleps(zmmA, zmmB, 0);
- cc.evex().vrndscalesd(xmmA, xmmB, xmmC, 0);
- cc.evex().vrndscaless(xmmA, xmmB, xmmC, 0);
- cc.evex().vrsqrt14pd(xmmA, xmmB);
- cc.evex().vrsqrt14pd(ymmA, ymmB);
- cc.evex().vrsqrt14pd(zmmA, zmmB);
- cc.evex().vrsqrt14ps(xmmA, xmmB);
- cc.evex().vrsqrt14ps(ymmA, ymmB);
- cc.evex().vrsqrt14ps(zmmA, zmmB);
- cc.evex().vrsqrt14sd(xmmA, xmmB, xmmC);
- cc.evex().vrsqrt14ss(xmmA, xmmB, xmmC);
- cc.evex().vrsqrt28pd(zmmA, zmmB);
- cc.evex().vrsqrt28ps(zmmA, zmmB);
- cc.evex().vrsqrt28sd(xmmA, xmmB, xmmC);
- cc.evex().vrsqrt28ss(xmmA, xmmB, xmmC);
- cc.evex().vscalefpd(xmmA, xmmB, xmmC);
- cc.evex().vscalefpd(ymmA, ymmB, ymmC);
- cc.evex().vscalefpd(zmmA, zmmB, zmmC);
- cc.evex().vscalefps(xmmA, xmmB, xmmC);
- cc.evex().vscalefps(ymmA, ymmB, ymmC);
- cc.evex().vscalefps(zmmA, zmmB, zmmC);
- cc.evex().vscalefsd(xmmA, xmmB, xmmC);
- cc.evex().vscalefss(xmmA, xmmB, xmmC);
- cc.evex().vshuff32x4(ymmA, ymmB, ymmC, 0);
- cc.evex().vshuff32x4(zmmA, zmmB, zmmC, 0);
- cc.evex().vshuff64x2(ymmA, ymmB, ymmC, 0);
- cc.evex().vshuff64x2(zmmA, zmmB, zmmC, 0);
- cc.evex().vshufi32x4(ymmA, ymmB, ymmC, 0);
- cc.evex().vshufi32x4(zmmA, zmmB, zmmC, 0);
- cc.evex().vshufi64x2(ymmA, ymmB, ymmC, 0);
- cc.evex().vshufi64x2(zmmA, zmmB, zmmC, 0);
- cc.evex().vshufpd(xmmA, xmmB, xmmC, 0);
- cc.evex().vshufpd(ymmA, ymmB, ymmC, 0);
- cc.evex().vshufpd(zmmA, zmmB, zmmC, 0);
- cc.evex().vshufps(xmmA, xmmB, xmmC, 0);
- cc.evex().vshufps(ymmA, ymmB, ymmC, 0);
- cc.evex().vshufps(zmmA, zmmB, zmmC, 0);
- cc.evex().vsqrtpd(xmmA, xmmB);
- cc.evex().vsqrtpd(ymmA, ymmB);
- cc.evex().vsqrtpd(zmmA, zmmB);
- cc.evex().vsqrtps(xmmA, xmmB);
- cc.evex().vsqrtps(ymmA, ymmB);
- cc.evex().vsqrtps(zmmA, zmmB);
- cc.evex().vsqrtsd(xmmA, xmmB, xmmC);
- cc.evex().vsqrtss(xmmA, xmmB, xmmC);
- cc.evex().vsubpd(xmmA, xmmB, xmmC);
- cc.evex().vsubpd(ymmA, ymmB, ymmC);
- cc.evex().vsubpd(zmmA, zmmB, zmmC);
- cc.evex().vsubps(xmmA, xmmB, xmmC);
- cc.evex().vsubps(ymmA, ymmB, ymmC);
- cc.evex().vsubps(zmmA, zmmB, zmmC);
- cc.evex().vsubsd(xmmA, xmmB, xmmC);
- cc.evex().vsubss(xmmA, xmmB, xmmC);
- cc.evex().vucomisd(xmmA, xmmB);
- cc.evex().vucomiss(xmmA, xmmB);
- cc.evex().vunpckhpd(xmmA, xmmB, xmmC);
- cc.evex().vunpckhpd(ymmA, ymmB, ymmC);
- cc.evex().vunpckhpd(zmmA, zmmB, zmmC);
- cc.evex().vunpckhps(xmmA, xmmB, xmmC);
- cc.evex().vunpckhps(ymmA, ymmB, ymmC);
- cc.evex().vunpckhps(zmmA, zmmB, zmmC);
- cc.evex().vunpcklpd(xmmA, xmmB, xmmC);
- cc.evex().vunpcklpd(ymmA, ymmB, ymmC);
- cc.evex().vunpcklpd(zmmA, zmmB, zmmC);
- cc.evex().vunpcklps(xmmA, xmmB, xmmC);
- cc.evex().vunpcklps(ymmA, ymmB, ymmC);
- cc.evex().vunpcklps(zmmA, zmmB, zmmC);
- cc.evex().vxorpd(xmmA, xmmB, xmmC);
- cc.evex().vxorpd(ymmA, ymmB, ymmC);
- cc.evex().vxorpd(zmmA, zmmB, zmmC);
- cc.evex().vxorps(xmmA, xmmB, xmmC);
- cc.evex().vxorps(ymmA, ymmB, ymmC);
- cc.evex().vxorps(zmmA, zmmB, zmmC);
-}
-
-template<typename Emitter>
-static void generateAvx512SequenceInternalRegMem(
- Emitter& cc,
- const x86::Gp& gp,
- const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
- const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
-
- DebugUtils::unused(kC);
-
- x86::Gp gpd = gp.r32();
- x86::Gp gpq = gp.r64();
- x86::Gp gpz = cc.is32Bit() ? gpd : gpq;
-
- x86::Xmm xmmA = vecA.xmm();
- x86::Xmm xmmB = vecB.xmm();
- x86::Xmm xmmC = vecC.xmm();
- x86::Xmm xmmD = vecD.xmm();
-
- x86::Ymm ymmA = vecA.ymm();
- x86::Ymm ymmB = vecB.ymm();
- x86::Ymm ymmD = vecD.ymm();
-
- x86::Zmm zmmA = vecA.zmm();
- x86::Zmm zmmB = vecB.zmm();
- x86::Zmm zmmD = vecD.zmm();
-
- x86::Mem m = x86::ptr(gpz);
- x86::Mem m32 = x86::dword_ptr(gpz);
- x86::Mem m64 = x86::qword_ptr(gpz);
- x86::Mem m128 = x86::xmmword_ptr(gpz);
- x86::Mem m256 = x86::ymmword_ptr(gpz);
- x86::Mem m512 = x86::zmmword_ptr(gpz);
- x86::Mem vx_ptr = x86::ptr(gpz, xmmD);
- x86::Mem vy_ptr = x86::ptr(gpz, ymmD);
- x86::Mem vz_ptr = x86::ptr(gpz, zmmD);
-
- cc.xor_(gpd, gpd);
- cc.vxorps(xmmA, xmmA, xmmA);
- cc.vxorps(xmmB, xmmB, xmmB);
- cc.vxorps(xmmC, xmmC, xmmC);
- cc.vxorps(xmmD, xmmD, xmmD);
-
- cc.kmovb(kA, m);
- cc.kmovb(m, kB);
- cc.kmovd(kA, m);
- cc.kmovd(m, kB);
- cc.kmovq(kA, m);
- cc.kmovq(m, kB);
- cc.kmovw(kA, m);
- cc.kmovw(m, kB);
-
- cc.evex().vaddpd(xmmA, xmmB, m);
- cc.evex().vaddpd(ymmA, ymmB, m);
- cc.evex().vaddpd(zmmA, zmmB, m);
- cc.evex().vaddps(xmmA, xmmB, m);
- cc.evex().vaddps(ymmA, ymmB, m);
- cc.evex().vaddps(zmmA, zmmB, m);
- cc.evex().vaddsd(xmmA, xmmB, m);
- cc.evex().vaddss(xmmA, xmmB, m);
- cc.evex().valignd(xmmA, xmmB, m, 0);
- cc.evex().valignd(ymmA, ymmB, m, 0);
- cc.evex().valignd(zmmA, zmmB, m, 0);
- cc.evex().valignq(xmmA, xmmB, m, 0);
- cc.evex().valignq(ymmA, ymmB, m, 0);
- cc.evex().valignq(zmmA, zmmB, m, 0);
- cc.evex().vandnpd(xmmA, xmmB, m);
- cc.evex().vandnpd(ymmA, ymmB, m);
- cc.evex().vandnpd(zmmA, zmmB, m);
- cc.evex().vandnps(xmmA, xmmB, m);
- cc.evex().vandnps(ymmA, ymmB, m);
- cc.evex().vandnps(zmmA, zmmB, m);
- cc.evex().vandpd(xmmA, xmmB, m);
- cc.evex().vandpd(ymmA, ymmB, m);
- cc.evex().vandpd(zmmA, zmmB, m);
- cc.evex().vandps(xmmA, xmmB, m);
- cc.evex().vandps(ymmA, ymmB, m);
- cc.evex().vandps(zmmA, zmmB, m);
- cc.evex().vblendmpd(xmmA, xmmB, m);
- cc.evex().vblendmpd(ymmA, ymmB, m);
- cc.evex().vblendmpd(zmmA, zmmB, m);
- cc.evex().vblendmps(xmmA, xmmB, m);
- cc.evex().vblendmps(ymmA, ymmB, m);
- cc.evex().vblendmps(zmmA, zmmB, m);
- cc.evex().vbroadcastf32x2(ymmA, m);
- cc.evex().vbroadcastf32x2(zmmA, m);
- cc.evex().vbroadcastf32x4(ymmA, m);
- cc.evex().vbroadcastf32x4(zmmA, m);
- cc.evex().vbroadcastf32x8(zmmA, m);
- cc.evex().vbroadcastf64x2(ymmA, m);
- cc.evex().vbroadcastf64x2(zmmA, m);
- cc.evex().vbroadcastf64x4(zmmA, m);
- cc.evex().vbroadcasti32x2(xmmA, m);
- cc.evex().vbroadcasti32x2(ymmA, m);
- cc.evex().vbroadcasti32x2(zmmA, m);
- cc.evex().vbroadcasti32x4(ymmA, m);
- cc.evex().vbroadcasti32x4(zmmA, m);
- cc.evex().vbroadcasti32x8(zmmA, m);
- cc.evex().vbroadcasti64x2(ymmA, m);
- cc.evex().vbroadcasti64x2(zmmA, m);
- cc.evex().vbroadcasti64x4(zmmA, m);
- cc.evex().vbroadcastsd(ymmA, m);
- cc.evex().vbroadcastsd(zmmA, m);
- cc.evex().vbroadcastss(xmmA, m);
- cc.evex().vbroadcastss(ymmA, m);
- cc.evex().vbroadcastss(zmmA, m);
- cc.evex().vcmppd(kA, xmmB, m, 0);
- cc.evex().vcmppd(kA, ymmB, m, 0);
- cc.evex().vcmppd(kA, zmmB, m, 0);
- cc.evex().vcmpps(kA, xmmB, m, 0);
- cc.evex().vcmpps(kA, ymmB, m, 0);
- cc.evex().vcmpps(kA, zmmB, m, 0);
- cc.evex().vcmpsd(kA, xmmB, m, 0);
- cc.evex().vcmpss(kA, xmmB, m, 0);
- cc.evex().vcomisd(xmmA, m);
- cc.evex().vcomiss(xmmA, m);
- cc.evex().vcompresspd(m, xmmB);
- cc.evex().vcompresspd(m, ymmB);
- cc.evex().vcompresspd(m, zmmB);
- cc.evex().vcompressps(m, xmmB);
- cc.evex().vcompressps(m, ymmB);
- cc.evex().vcompressps(m, zmmB);
- cc.evex().vcvtdq2pd(xmmA, m);
- cc.evex().vcvtdq2pd(ymmA, m);
- cc.evex().vcvtdq2pd(zmmA, m);
- cc.evex().vcvtdq2ps(xmmA, m);
- cc.evex().vcvtdq2ps(ymmA, m);
- cc.evex().vcvtdq2ps(zmmA, m);
- cc.evex().vcvtpd2dq(xmmA, m128);
- cc.evex().vcvtpd2dq(xmmA, m256);
- cc.evex().vcvtpd2dq(ymmA, m512);
- cc.evex().vcvtpd2qq(xmmA, m);
- cc.evex().vcvtpd2qq(ymmA, m);
- cc.evex().vcvtpd2qq(zmmA, m);
- cc.evex().vcvtpd2udq(xmmA, m128);
- cc.evex().vcvtpd2udq(xmmA, m256);
- cc.evex().vcvtpd2udq(ymmA, m512);
- cc.evex().vcvtpd2uqq(xmmA, m);
- cc.evex().vcvtpd2uqq(ymmA, m);
- cc.evex().vcvtpd2uqq(zmmA, m);
- cc.evex().vcvtph2ps(xmmA, m);
- cc.evex().vcvtph2ps(ymmA, m);
- cc.evex().vcvtph2ps(zmmA, m);
- cc.evex().vcvtps2dq(xmmA, m);
- cc.evex().vcvtps2dq(ymmA, m);
- cc.evex().vcvtps2dq(zmmA, m);
- cc.evex().vcvtps2pd(xmmA, m);
- cc.evex().vcvtps2pd(ymmA, m);
- cc.evex().vcvtps2pd(zmmA, m);
- cc.evex().vcvtps2ph(m, xmmB, 0);
- cc.evex().vcvtps2ph(m, ymmB, 0);
- cc.evex().vcvtps2ph(m, zmmB, 0);
- cc.evex().vcvtps2qq(xmmA, m);
- cc.evex().vcvtps2qq(ymmA, m);
- cc.evex().vcvtps2qq(zmmA, m);
- cc.evex().vcvtps2udq(xmmA, m);
- cc.evex().vcvtps2udq(ymmA, m);
- cc.evex().vcvtps2udq(zmmA, m);
- cc.evex().vcvtps2uqq(xmmA, m);
- cc.evex().vcvtps2uqq(ymmA, m);
- cc.evex().vcvtps2uqq(zmmA, m);
- cc.evex().vcvtqq2pd(xmmA, m);
- cc.evex().vcvtqq2pd(ymmA, m);
- cc.evex().vcvtqq2pd(zmmA, m);
- cc.evex().vcvtqq2ps(xmmA, m128);
- cc.evex().vcvtqq2ps(xmmA, m256);
- cc.evex().vcvtqq2ps(ymmA, m512);
- cc.evex().vcvtsd2si(gpd, m);
- cc.evex().vcvtsd2si(gpz, m);
- cc.evex().vcvtsd2ss(xmmA, xmmB, m);
- cc.evex().vcvtsd2usi(gpd, m);
- cc.evex().vcvtsd2usi(gpz, m);
- cc.evex().vcvtsi2sd(xmmA, xmmB, m32);
- if (cc.is64Bit()) cc.evex().vcvtsi2sd(xmmA, xmmB, m64);
- cc.evex().vcvtsi2ss(xmmA, xmmB, m32);
- if (cc.is64Bit()) cc.evex().vcvtsi2ss(xmmA, xmmB, m64);
- cc.evex().vcvtss2sd(xmmA, xmmB, m);
- cc.evex().vcvtss2si(gpd, m);
- cc.evex().vcvtss2si(gpz, m);
- cc.evex().vcvtss2usi(gpd, m);
- cc.evex().vcvtss2usi(gpz, m);
- cc.evex().vcvttpd2dq(xmmA, m128);
- cc.evex().vcvttpd2dq(xmmA, m256);
- cc.evex().vcvttpd2dq(ymmA, m512);
- cc.evex().vcvttpd2qq(xmmA, m);
- cc.evex().vcvttpd2qq(ymmA, m);
- cc.evex().vcvttpd2qq(zmmA, m);
- cc.evex().vcvttpd2udq(xmmA, m128);
- cc.evex().vcvttpd2udq(xmmA, m256);
- cc.evex().vcvttpd2udq(ymmA, m512);
- cc.evex().vcvttpd2uqq(xmmA, m);
- cc.evex().vcvttpd2uqq(ymmA, m);
- cc.evex().vcvttpd2uqq(zmmA, m);
- cc.evex().vcvttps2dq(xmmA, m);
- cc.evex().vcvttps2dq(ymmA, m);
- cc.evex().vcvttps2dq(zmmA, m);
- cc.evex().vcvttps2qq(xmmA, m);
- cc.evex().vcvttps2qq(ymmA, m);
- cc.evex().vcvttps2qq(zmmA, m);
- cc.evex().vcvttps2udq(xmmA, m);
- cc.evex().vcvttps2udq(ymmA, m);
- cc.evex().vcvttps2udq(zmmA, m);
- cc.evex().vcvttps2uqq(xmmA, m);
- cc.evex().vcvttps2uqq(ymmA, m);
- cc.evex().vcvttps2uqq(zmmA, m);
- cc.evex().vcvttsd2si(gpd, m);
- cc.evex().vcvttsd2si(gpz, m);
- cc.evex().vcvttsd2usi(gpd, m);
- cc.evex().vcvttsd2usi(gpz, m);
- cc.evex().vcvttss2si(gpd, m);
- cc.evex().vcvttss2si(gpz, m);
- cc.evex().vcvttss2usi(gpd, m);
- cc.evex().vcvttss2usi(gpz, m);
- cc.evex().vcvtudq2pd(xmmA, m);
- cc.evex().vcvtudq2pd(ymmA, m);
- cc.evex().vcvtudq2pd(zmmA, m);
- cc.evex().vcvtudq2ps(xmmA, m);
- cc.evex().vcvtudq2ps(ymmA, m);
- cc.evex().vcvtudq2ps(zmmA, m);
- cc.evex().vcvtuqq2pd(xmmA, m);
- cc.evex().vcvtuqq2pd(ymmA, m);
- cc.evex().vcvtuqq2pd(zmmA, m);
- cc.evex().vcvtuqq2ps(xmmA, m128);
- cc.evex().vcvtuqq2ps(xmmA, m256);
- cc.evex().vcvtuqq2ps(ymmA, m512);
- cc.evex().vcvtusi2sd(xmmA, xmmB, m32);
- if (cc.is64Bit()) cc.evex().vcvtusi2sd(xmmA, xmmB, m64);
- cc.evex().vcvtusi2ss(xmmA, xmmB, m32);
- if (cc.is64Bit()) cc.evex().vcvtusi2ss(xmmA, xmmB, m64);
- cc.evex().vdbpsadbw(xmmA, xmmB, m, 0);
- cc.evex().vdbpsadbw(ymmA, ymmB, m, 0);
- cc.evex().vdbpsadbw(zmmA, zmmB, m, 0);
- cc.evex().vdivpd(xmmA, xmmB, m);
- cc.evex().vdivpd(ymmA, ymmB, m);
- cc.evex().vdivpd(zmmA, zmmB, m);
- cc.evex().vdivps(xmmA, xmmB, m);
- cc.evex().vdivps(ymmA, ymmB, m);
- cc.evex().vdivps(zmmA, zmmB, m);
- cc.evex().vdivsd(xmmA, xmmB, m);
- cc.evex().vdivss(xmmA, xmmB, m);
- cc.evex().vexp2pd(zmmA, m);
- cc.evex().vexp2ps(zmmA, m);
- cc.evex().vexpandpd(xmmA, m);
- cc.evex().vexpandpd(ymmA, m);
- cc.evex().vexpandpd(zmmA, m);
- cc.evex().vexpandps(xmmA, m);
- cc.evex().vexpandps(ymmA, m);
- cc.evex().vexpandps(zmmA, m);
- cc.evex().vextractf32x4(m, ymmB, 0);
- cc.evex().vextractf32x4(m, zmmB, 0);
- cc.evex().vextractf32x8(m, zmmB, 0);
- cc.evex().vextractf64x2(m, ymmB, 0);
- cc.evex().vextractf64x2(m, zmmB, 0);
- cc.evex().vextractf64x4(m, zmmB, 0);
- cc.evex().vextracti32x4(m, ymmB, 0);
- cc.evex().vextracti32x4(m, zmmB, 0);
- cc.evex().vextracti32x8(m, zmmB, 0);
- cc.evex().vextracti64x2(m, ymmB, 0);
- cc.evex().vextracti64x2(m, zmmB, 0);
- cc.evex().vextracti64x4(m, zmmB, 0);
- cc.evex().vextractps(m, xmmB, 0);
- cc.evex().vfixupimmpd(xmmA, xmmB, m, 0);
- cc.evex().vfixupimmpd(ymmA, ymmB, m, 0);
- cc.evex().vfixupimmpd(zmmA, zmmB, m, 0);
- cc.evex().vfixupimmps(xmmA, xmmB, m, 0);
- cc.evex().vfixupimmps(ymmA, ymmB, m, 0);
- cc.evex().vfixupimmps(zmmA, zmmB, m, 0);
- cc.evex().vfixupimmsd(xmmA, xmmB, m, 0);
- cc.evex().vfixupimmss(xmmA, xmmB, m, 0);
- cc.evex().vfmadd132pd(xmmA, xmmB, m);
- cc.evex().vfmadd132pd(ymmA, ymmB, m);
- cc.evex().vfmadd132pd(zmmA, zmmB, m);
- cc.evex().vfmadd132ps(xmmA, xmmB, m);
- cc.evex().vfmadd132ps(ymmA, ymmB, m);
- cc.evex().vfmadd132ps(zmmA, zmmB, m);
- cc.evex().vfmadd132sd(xmmA, xmmB, m);
- cc.evex().vfmadd132ss(xmmA, xmmB, m);
- cc.evex().vfmadd213pd(xmmA, xmmB, m);
- cc.evex().vfmadd213pd(ymmA, ymmB, m);
- cc.evex().vfmadd213pd(zmmA, zmmB, m);
- cc.evex().vfmadd213ps(xmmA, xmmB, m);
- cc.evex().vfmadd213ps(ymmA, ymmB, m);
- cc.evex().vfmadd213ps(zmmA, zmmB, m);
- cc.evex().vfmadd213sd(xmmA, xmmB, m);
- cc.evex().vfmadd213ss(xmmA, xmmB, m);
- cc.evex().vfmadd231pd(xmmA, xmmB, m);
- cc.evex().vfmadd231pd(ymmA, ymmB, m);
- cc.evex().vfmadd231pd(zmmA, zmmB, m);
- cc.evex().vfmadd231ps(xmmA, xmmB, m);
- cc.evex().vfmadd231ps(ymmA, ymmB, m);
- cc.evex().vfmadd231ps(zmmA, zmmB, m);
- cc.evex().vfmadd231sd(xmmA, xmmB, m);
- cc.evex().vfmadd231ss(xmmA, xmmB, m);
- cc.evex().vfmaddsub132pd(xmmA, xmmB, m);
- cc.evex().vfmaddsub132pd(ymmA, ymmB, m);
- cc.evex().vfmaddsub132pd(zmmA, zmmB, m);
- cc.evex().vfmaddsub132ps(xmmA, xmmB, m);
- cc.evex().vfmaddsub132ps(ymmA, ymmB, m);
- cc.evex().vfmaddsub132ps(zmmA, zmmB, m);
- cc.evex().vfmaddsub213pd(xmmA, xmmB, m);
- cc.evex().vfmaddsub213pd(ymmA, ymmB, m);
- cc.evex().vfmaddsub213pd(zmmA, zmmB, m);
- cc.evex().vfmaddsub213ps(xmmA, xmmB, m);
- cc.evex().vfmaddsub213ps(ymmA, ymmB, m);
- cc.evex().vfmaddsub213ps(zmmA, zmmB, m);
- cc.evex().vfmaddsub231pd(xmmA, xmmB, m);
- cc.evex().vfmaddsub231pd(ymmA, ymmB, m);
- cc.evex().vfmaddsub231pd(zmmA, zmmB, m);
- cc.evex().vfmaddsub231ps(xmmA, xmmB, m);
- cc.evex().vfmaddsub231ps(ymmA, ymmB, m);
- cc.evex().vfmaddsub231ps(zmmA, zmmB, m);
- cc.evex().vfmsub132pd(xmmA, xmmB, m);
- cc.evex().vfmsub132pd(ymmA, ymmB, m);
- cc.evex().vfmsub132pd(zmmA, zmmB, m);
- cc.evex().vfmsub132ps(xmmA, xmmB, m);
- cc.evex().vfmsub132ps(ymmA, ymmB, m);
- cc.evex().vfmsub132ps(zmmA, zmmB, m);
- cc.evex().vfmsub132sd(xmmA, xmmB, m);
- cc.evex().vfmsub132ss(xmmA, xmmB, m);
- cc.evex().vfmsub213pd(xmmA, xmmB, m);
- cc.evex().vfmsub213pd(ymmA, ymmB, m);
- cc.evex().vfmsub213pd(zmmA, zmmB, m);
- cc.evex().vfmsub213ps(xmmA, xmmB, m);
- cc.evex().vfmsub213ps(ymmA, ymmB, m);
- cc.evex().vfmsub213ps(zmmA, zmmB, m);
- cc.evex().vfmsub213sd(xmmA, xmmB, m);
- cc.evex().vfmsub213ss(xmmA, xmmB, m);
- cc.evex().vfmsub231pd(xmmA, xmmB, m);
- cc.evex().vfmsub231pd(ymmA, ymmB, m);
- cc.evex().vfmsub231pd(zmmA, zmmB, m);
- cc.evex().vfmsub231ps(xmmA, xmmB, m);
- cc.evex().vfmsub231ps(ymmA, ymmB, m);
- cc.evex().vfmsub231ps(zmmA, zmmB, m);
- cc.evex().vfmsub231sd(xmmA, xmmB, m);
- cc.evex().vfmsub231ss(xmmA, xmmB, m);
- cc.evex().vfmsubadd132pd(xmmA, xmmB, m);
- cc.evex().vfmsubadd132pd(ymmA, ymmB, m);
- cc.evex().vfmsubadd132pd(zmmA, zmmB, m);
- cc.evex().vfmsubadd132ps(xmmA, xmmB, m);
- cc.evex().vfmsubadd132ps(ymmA, ymmB, m);
- cc.evex().vfmsubadd132ps(zmmA, zmmB, m);
- cc.evex().vfmsubadd213pd(xmmA, xmmB, m);
- cc.evex().vfmsubadd213pd(ymmA, ymmB, m);
- cc.evex().vfmsubadd213pd(zmmA, zmmB, m);
- cc.evex().vfmsubadd213ps(xmmA, xmmB, m);
- cc.evex().vfmsubadd213ps(ymmA, ymmB, m);
- cc.evex().vfmsubadd213ps(zmmA, zmmB, m);
- cc.evex().vfmsubadd231pd(xmmA, xmmB, m);
- cc.evex().vfmsubadd231pd(ymmA, ymmB, m);
- cc.evex().vfmsubadd231pd(zmmA, zmmB, m);
- cc.evex().vfmsubadd231ps(xmmA, xmmB, m);
- cc.evex().vfmsubadd231ps(ymmA, ymmB, m);
- cc.evex().vfmsubadd231ps(zmmA, zmmB, m);
- cc.evex().vfnmadd132pd(xmmA, xmmB, m);
- cc.evex().vfnmadd132pd(ymmA, ymmB, m);
- cc.evex().vfnmadd132pd(zmmA, zmmB, m);
- cc.evex().vfnmadd132ps(xmmA, xmmB, m);
- cc.evex().vfnmadd132ps(ymmA, ymmB, m);
- cc.evex().vfnmadd132ps(zmmA, zmmB, m);
- cc.evex().vfnmadd132sd(xmmA, xmmB, m);
- cc.evex().vfnmadd132ss(xmmA, xmmB, m);
- cc.evex().vfnmadd213pd(xmmA, xmmB, m);
- cc.evex().vfnmadd213pd(ymmA, ymmB, m);
- cc.evex().vfnmadd213pd(zmmA, zmmB, m);
- cc.evex().vfnmadd213ps(xmmA, xmmB, m);
- cc.evex().vfnmadd213ps(ymmA, ymmB, m);
- cc.evex().vfnmadd213ps(zmmA, zmmB, m);
- cc.evex().vfnmadd213sd(xmmA, xmmB, m);
- cc.evex().vfnmadd213ss(xmmA, xmmB, m);
- cc.evex().vfnmadd231pd(xmmA, xmmB, m);
- cc.evex().vfnmadd231pd(ymmA, ymmB, m);
- cc.evex().vfnmadd231pd(zmmA, zmmB, m);
- cc.evex().vfnmadd231ps(xmmA, xmmB, m);
- cc.evex().vfnmadd231ps(ymmA, ymmB, m);
- cc.evex().vfnmadd231ps(zmmA, zmmB, m);
- cc.evex().vfnmadd231sd(xmmA, xmmB, m);
- cc.evex().vfnmadd231ss(xmmA, xmmB, m);
- cc.evex().vfnmsub132pd(xmmA, xmmB, m);
- cc.evex().vfnmsub132pd(ymmA, ymmB, m);
- cc.evex().vfnmsub132pd(zmmA, zmmB, m);
- cc.evex().vfnmsub132ps(xmmA, xmmB, m);
- cc.evex().vfnmsub132ps(ymmA, ymmB, m);
- cc.evex().vfnmsub132ps(zmmA, zmmB, m);
- cc.evex().vfnmsub132sd(xmmA, xmmB, m);
- cc.evex().vfnmsub132ss(xmmA, xmmB, m);
- cc.evex().vfnmsub213pd(xmmA, xmmB, m);
- cc.evex().vfnmsub213pd(ymmA, ymmB, m);
- cc.evex().vfnmsub213pd(zmmA, zmmB, m);
- cc.evex().vfnmsub213ps(xmmA, xmmB, m);
- cc.evex().vfnmsub213ps(ymmA, ymmB, m);
- cc.evex().vfnmsub213ps(zmmA, zmmB, m);
- cc.evex().vfnmsub213sd(xmmA, xmmB, m);
- cc.evex().vfnmsub213ss(xmmA, xmmB, m);
- cc.evex().vfnmsub231pd(xmmA, xmmB, m);
- cc.evex().vfnmsub231pd(ymmA, ymmB, m);
- cc.evex().vfnmsub231pd(zmmA, zmmB, m);
- cc.evex().vfnmsub231ps(xmmA, xmmB, m);
- cc.evex().vfnmsub231ps(ymmA, ymmB, m);
- cc.evex().vfnmsub231ps(zmmA, zmmB, m);
- cc.evex().vfnmsub231sd(xmmA, xmmB, m);
- cc.evex().vfnmsub231ss(xmmA, xmmB, m);
- cc.evex().vfpclasspd(kA, m128, 0);
- cc.evex().vfpclasspd(kA, m256, 0);
- cc.evex().vfpclasspd(kA, m512, 0);
- cc.evex().vfpclassps(kA, m128, 0);
- cc.evex().vfpclassps(kA, m256, 0);
- cc.evex().vfpclassps(kA, m512, 0);
- cc.evex().vfpclasssd(kA, m, 0);
- cc.evex().vfpclassss(kA, m, 0);
- cc.evex().k(kA).vgatherdpd(xmmA, vx_ptr);
- cc.evex().k(kA).vgatherdpd(ymmA, vx_ptr);
- cc.evex().k(kA).vgatherdpd(zmmA, vy_ptr);
- cc.evex().k(kA).vgatherdps(xmmA, vx_ptr);
- cc.evex().k(kA).vgatherdps(ymmA, vy_ptr);
- cc.evex().k(kA).vgatherdps(zmmA, vz_ptr);
- cc.evex().k(kA).vgatherpf0dpd(vy_ptr);
- cc.evex().k(kA).vgatherpf0dps(vz_ptr);
- cc.evex().k(kA).vgatherpf0qpd(vz_ptr);
- cc.evex().k(kA).vgatherpf0qps(vz_ptr);
- cc.evex().k(kA).vgatherpf1dpd(vy_ptr);
- cc.evex().k(kA).vgatherpf1dps(vz_ptr);
- cc.evex().k(kA).vgatherpf1qpd(vz_ptr);
- cc.evex().k(kA).vgatherpf1qps(vz_ptr);
- cc.evex().k(kA).vgatherqpd(xmmA, vx_ptr);
- cc.evex().k(kA).vgatherqpd(ymmA, vy_ptr);
- cc.evex().k(kA).vgatherqpd(zmmA, vz_ptr);
- cc.evex().k(kA).vgatherqps(xmmA, vx_ptr);
- cc.evex().k(kA).vgatherqps(xmmA, vy_ptr);
- cc.evex().k(kA).vgatherqps(ymmA, vz_ptr);
- cc.evex().vgetexppd(xmmA, m);
- cc.evex().vgetexppd(ymmA, m);
- cc.evex().vgetexppd(zmmA, m);
- cc.evex().vgetexpps(xmmA, m);
- cc.evex().vgetexpps(ymmA, m);
- cc.evex().vgetexpps(zmmA, m);
- cc.evex().vgetexpsd(xmmA, xmmB, m);
- cc.evex().vgetexpss(xmmA, xmmB, m);
- cc.evex().vgetmantpd(xmmA, m, 0);
- cc.evex().vgetmantpd(ymmA, m, 0);
- cc.evex().vgetmantpd(zmmA, m, 0);
- cc.evex().vgetmantps(xmmA, m, 0);
- cc.evex().vgetmantps(ymmA, m, 0);
- cc.evex().vgetmantps(zmmA, m, 0);
- cc.evex().vgetmantsd(xmmA, xmmB, m, 0);
- cc.evex().vgetmantss(xmmA, xmmB, m, 0);
- cc.evex().vinsertf32x4(ymmA, ymmB, m, 0);
- cc.evex().vinsertf32x4(zmmA, zmmB, m, 0);
- cc.evex().vinsertf32x8(zmmA, zmmB, m, 0);
- cc.evex().vinsertf64x2(ymmA, ymmB, m, 0);
- cc.evex().vinsertf64x2(zmmA, zmmB, m, 0);
- cc.evex().vinsertf64x4(zmmA, zmmB, m, 0);
- cc.evex().vinserti32x4(ymmA, ymmB, m, 0);
- cc.evex().vinserti32x4(zmmA, zmmB, m, 0);
- cc.evex().vinserti32x8(zmmA, zmmB, m, 0);
- cc.evex().vinserti64x2(ymmA, ymmB, m, 0);
- cc.evex().vinserti64x2(zmmA, zmmB, m, 0);
- cc.evex().vinserti64x4(zmmA, zmmB, m, 0);
- cc.evex().vinsertps(xmmA, xmmB, m, 0);
- cc.evex().vmaxpd(xmmA, xmmB, m);
- cc.evex().vmaxpd(ymmA, ymmB, m);
- cc.evex().vmaxpd(zmmA, zmmB, m);
- cc.evex().vmaxps(xmmA, xmmB, m);
- cc.evex().vmaxps(ymmA, ymmB, m);
- cc.evex().vmaxps(zmmA, zmmB, m);
- cc.evex().vmaxsd(xmmA, xmmB, m);
- cc.evex().vmaxss(xmmA, xmmB, m);
- cc.evex().vminpd(xmmA, xmmB, m);
- cc.evex().vminpd(ymmA, ymmB, m);
- cc.evex().vminpd(zmmA, zmmB, m);
- cc.evex().vminps(xmmA, xmmB, m);
- cc.evex().vminps(ymmA, ymmB, m);
- cc.evex().vminps(zmmA, zmmB, m);
- cc.evex().vminsd(xmmA, xmmB, m);
- cc.evex().vminss(xmmA, xmmB, m);
- cc.evex().vmovapd(xmmA, m);
- cc.evex().vmovapd(m, xmmB);
- cc.evex().vmovapd(ymmA, m);
- cc.evex().vmovapd(m, ymmB);
- cc.evex().vmovapd(zmmA, m);
- cc.evex().vmovapd(m, zmmB);
- cc.evex().vmovaps(xmmA, m);
- cc.evex().vmovaps(m, xmmB);
- cc.evex().vmovaps(ymmA, m);
- cc.evex().vmovaps(m, ymmB);
- cc.evex().vmovaps(zmmA, m);
- cc.evex().vmovaps(m, zmmB);
- cc.evex().vmovd(m, xmmB);
- cc.evex().vmovd(xmmA, m);
- cc.evex().vmovddup(xmmA, m);
- cc.evex().vmovddup(ymmA, m);
- cc.evex().vmovddup(zmmA, m);
- cc.evex().vmovdqa32(xmmA, m);
- cc.evex().vmovdqa32(m, xmmB);
- cc.evex().vmovdqa32(ymmA, m);
- cc.evex().vmovdqa32(m, ymmB);
- cc.evex().vmovdqa32(zmmA, m);
- cc.evex().vmovdqa32(m, zmmB);
- cc.evex().vmovdqa64(xmmA, m);
- cc.evex().vmovdqa64(m, xmmB);
- cc.evex().vmovdqa64(ymmA, m);
- cc.evex().vmovdqa64(m, ymmB);
- cc.evex().vmovdqa64(zmmA, m);
- cc.evex().vmovdqa64(m, zmmB);
- cc.evex().vmovdqu16(xmmA, m);
- cc.evex().vmovdqu16(m, xmmB);
- cc.evex().vmovdqu16(ymmA, m);
- cc.evex().vmovdqu16(m, ymmB);
- cc.evex().vmovdqu16(zmmA, m);
- cc.evex().vmovdqu16(m, zmmB);
- cc.evex().vmovdqu32(xmmA, m);
- cc.evex().vmovdqu32(m, xmmB);
- cc.evex().vmovdqu32(ymmA, m);
- cc.evex().vmovdqu32(m, ymmB);
- cc.evex().vmovdqu32(zmmA, m);
- cc.evex().vmovdqu32(m, zmmB);
- cc.evex().vmovdqu64(xmmA, m);
- cc.evex().vmovdqu64(m, xmmB);
- cc.evex().vmovdqu64(ymmA, m);
- cc.evex().vmovdqu64(m, ymmB);
- cc.evex().vmovdqu64(zmmA, m);
- cc.evex().vmovdqu64(m, zmmB);
- cc.evex().vmovdqu8(xmmA, m);
- cc.evex().vmovdqu8(m, xmmB);
- cc.evex().vmovdqu8(ymmA, m);
- cc.evex().vmovdqu8(m, ymmB);
- cc.evex().vmovdqu8(zmmA, m);
- cc.evex().vmovdqu8(m, zmmB);
- cc.evex().vmovhpd(m, xmmB);
- cc.evex().vmovhpd(xmmA, xmmB, m);
- cc.evex().vmovhps(m, xmmB);
- cc.evex().vmovhps(xmmA, xmmB, m);
- cc.evex().vmovlpd(m, xmmB);
- cc.evex().vmovlpd(xmmA, xmmB, m);
- cc.evex().vmovlps(m, xmmB);
- cc.evex().vmovlps(xmmA, xmmB, m);
- cc.evex().vmovntdq(m, xmmB);
- cc.evex().vmovntdq(m, ymmB);
- cc.evex().vmovntdq(m, zmmB);
- cc.evex().vmovntdqa(xmmA, m);
- cc.evex().vmovntdqa(ymmA, m);
- cc.evex().vmovntdqa(zmmA, m);
- cc.evex().vmovntpd(m, xmmB);
- cc.evex().vmovntpd(m, ymmB);
- cc.evex().vmovntpd(m, zmmB);
- cc.evex().vmovntps(m, xmmB);
- cc.evex().vmovntps(m, ymmB);
- cc.evex().vmovntps(m, zmmB);
- cc.evex().vmovq(m, xmmB);
- cc.evex().vmovq(xmmA, m);
- cc.evex().vmovq(xmmA, m);
- cc.evex().vmovq(m, xmmB);
- cc.evex().vmovsd(m, xmmB);
- cc.evex().vmovsd(xmmA, m);
- cc.evex().vmovshdup(xmmA, m);
- cc.evex().vmovshdup(ymmA, m);
- cc.evex().vmovshdup(zmmA, m);
- cc.evex().vmovsldup(xmmA, m);
- cc.evex().vmovsldup(ymmA, m);
- cc.evex().vmovsldup(zmmA, m);
- cc.evex().vmovss(m, xmmB);
- cc.evex().vmovss(xmmA, m);
- cc.evex().vmovupd(xmmA, m);
- cc.evex().vmovupd(m, xmmB);
- cc.evex().vmovupd(ymmA, m);
- cc.evex().vmovupd(m, ymmB);
- cc.evex().vmovupd(zmmA, m);
- cc.evex().vmovupd(m, zmmB);
- cc.evex().vmovups(xmmA, m);
- cc.evex().vmovups(m, xmmB);
- cc.evex().vmovups(ymmA, m);
- cc.evex().vmovups(m, ymmB);
- cc.evex().vmovups(zmmA, m);
- cc.evex().vmovups(m, zmmB);
- cc.evex().vmulpd(xmmA, xmmB, m);
- cc.evex().vmulpd(ymmA, ymmB, m);
- cc.evex().vmulpd(zmmA, zmmB, m);
- cc.evex().vmulps(xmmA, xmmB, m);
- cc.evex().vmulps(ymmA, ymmB, m);
- cc.evex().vmulps(zmmA, zmmB, m);
- cc.evex().vmulsd(xmmA, xmmB, m);
- cc.evex().vmulss(xmmA, xmmB, m);
- cc.evex().vorpd(xmmA, xmmB, m);
- cc.evex().vorpd(ymmA, ymmB, m);
- cc.evex().vorpd(zmmA, zmmB, m);
- cc.evex().vorps(xmmA, xmmB, m);
- cc.evex().vorps(ymmA, ymmB, m);
- cc.evex().vorps(zmmA, zmmB, m);
- cc.evex().vpabsb(xmmA, m);
- cc.evex().vpabsb(ymmA, m);
- cc.evex().vpabsb(zmmA, m);
- cc.evex().vpabsd(xmmA, m);
- cc.evex().vpabsd(ymmA, m);
- cc.evex().vpabsd(zmmA, m);
- cc.evex().vpabsq(xmmA, m);
- cc.evex().vpabsq(ymmA, m);
- cc.evex().vpabsq(zmmA, m);
- cc.evex().vpabsw(xmmA, m);
- cc.evex().vpabsw(ymmA, m);
- cc.evex().vpabsw(zmmA, m);
- cc.evex().vpackssdw(xmmA, xmmB, m);
- cc.evex().vpackssdw(ymmA, ymmB, m);
- cc.evex().vpackssdw(zmmA, zmmB, m);
- cc.evex().vpacksswb(xmmA, xmmB, m);
- cc.evex().vpacksswb(ymmA, ymmB, m);
- cc.evex().vpacksswb(zmmA, zmmB, m);
- cc.evex().vpackusdw(xmmA, xmmB, m);
- cc.evex().vpackusdw(ymmA, ymmB, m);
- cc.evex().vpackusdw(zmmA, zmmB, m);
- cc.evex().vpackuswb(xmmA, xmmB, m);
- cc.evex().vpackuswb(ymmA, ymmB, m);
- cc.evex().vpackuswb(zmmA, zmmB, m);
- cc.evex().vpaddb(xmmA, xmmB, m);
- cc.evex().vpaddb(ymmA, ymmB, m);
- cc.evex().vpaddb(zmmA, zmmB, m);
- cc.evex().vpaddd(xmmA, xmmB, m);
- cc.evex().vpaddd(ymmA, ymmB, m);
- cc.evex().vpaddd(zmmA, zmmB, m);
- cc.evex().vpaddq(xmmA, xmmB, m);
- cc.evex().vpaddq(ymmA, ymmB, m);
- cc.evex().vpaddq(zmmA, zmmB, m);
- cc.evex().vpaddsb(xmmA, xmmB, m);
- cc.evex().vpaddsb(ymmA, ymmB, m);
- cc.evex().vpaddsb(zmmA, zmmB, m);
- cc.evex().vpaddsw(xmmA, xmmB, m);
- cc.evex().vpaddsw(ymmA, ymmB, m);
- cc.evex().vpaddsw(zmmA, zmmB, m);
- cc.evex().vpaddusb(xmmA, xmmB, m);
- cc.evex().vpaddusb(ymmA, ymmB, m);
- cc.evex().vpaddusb(zmmA, zmmB, m);
- cc.evex().vpaddusw(xmmA, xmmB, m);
- cc.evex().vpaddusw(ymmA, ymmB, m);
- cc.evex().vpaddusw(zmmA, zmmB, m);
- cc.evex().vpaddw(xmmA, xmmB, m);
- cc.evex().vpaddw(ymmA, ymmB, m);
- cc.evex().vpaddw(zmmA, zmmB, m);
- cc.evex().vpalignr(xmmA, xmmB, m, 0);
- cc.evex().vpalignr(ymmA, ymmB, m, 0);
- cc.evex().vpalignr(zmmA, zmmB, m, 0);
- cc.evex().vpandd(xmmA, xmmB, m);
- cc.evex().vpandd(ymmA, ymmB, m);
- cc.evex().vpandd(zmmA, zmmB, m);
- cc.evex().vpandnd(xmmA, xmmB, m);
- cc.evex().vpandnd(ymmA, ymmB, m);
- cc.evex().vpandnd(zmmA, zmmB, m);
- cc.evex().vpandnq(xmmA, xmmB, m);
- cc.evex().vpandnq(ymmA, ymmB, m);
- cc.evex().vpandnq(zmmA, zmmB, m);
- cc.evex().vpandq(xmmA, xmmB, m);
- cc.evex().vpandq(ymmA, ymmB, m);
- cc.evex().vpandq(zmmA, zmmB, m);
- cc.evex().vpavgb(xmmA, xmmB, m);
- cc.evex().vpavgb(ymmA, ymmB, m);
- cc.evex().vpavgb(zmmA, zmmB, m);
- cc.evex().vpavgw(xmmA, xmmB, m);
- cc.evex().vpavgw(ymmA, ymmB, m);
- cc.evex().vpavgw(zmmA, zmmB, m);
- cc.evex().vpblendmb(xmmA, xmmB, m);
- cc.evex().vpblendmb(ymmA, ymmB, m);
- cc.evex().vpblendmb(zmmA, zmmB, m);
- cc.evex().vpblendmd(xmmA, xmmB, m);
- cc.evex().vpblendmd(ymmA, ymmB, m);
- cc.evex().vpblendmd(zmmA, zmmB, m);
- cc.evex().vpblendmq(xmmA, xmmB, m);
- cc.evex().vpblendmq(ymmA, ymmB, m);
- cc.evex().vpblendmq(zmmA, zmmB, m);
- cc.evex().vpblendmw(xmmA, xmmB, m);
- cc.evex().vpblendmw(ymmA, ymmB, m);
- cc.evex().vpblendmw(zmmA, zmmB, m);
- cc.evex().vpbroadcastb(xmmA, m);
- cc.evex().vpbroadcastb(ymmA, m);
- cc.evex().vpbroadcastb(zmmA, m);
- cc.evex().vpbroadcastd(xmmA, m);
- cc.evex().vpbroadcastd(ymmA, m);
- cc.evex().vpbroadcastd(zmmA, m);
- cc.evex().vpbroadcastq(xmmA, m);
- cc.evex().vpbroadcastq(ymmA, m);
- cc.evex().vpbroadcastq(zmmA, m);
- cc.evex().vpbroadcastw(xmmA, m);
- cc.evex().vpbroadcastw(ymmA, m);
- cc.evex().vpbroadcastw(zmmA, m);
- cc.evex().vpcmpb(kA, xmmB, m, 0);
- cc.evex().vpcmpb(kA, ymmB, m, 0);
- cc.evex().vpcmpb(kA, zmmB, m, 0);
- cc.evex().vpcmpd(kA, xmmB, m, 0);
- cc.evex().vpcmpd(kA, ymmB, m, 0);
- cc.evex().vpcmpd(kA, zmmB, m, 0);
- cc.evex().vpcmpeqb(kA, xmmB, m);
- cc.evex().vpcmpeqb(kA, ymmB, m);
- cc.evex().vpcmpeqb(kA, zmmB, m);
- cc.evex().vpcmpeqd(kA, xmmB, m);
- cc.evex().vpcmpeqd(kA, ymmB, m);
- cc.evex().vpcmpeqd(kA, zmmB, m);
- cc.evex().vpcmpeqq(kA, xmmB, m);
- cc.evex().vpcmpeqq(kA, ymmB, m);
- cc.evex().vpcmpeqq(kA, zmmB, m);
- cc.evex().vpcmpeqw(kA, xmmB, m);
- cc.evex().vpcmpeqw(kA, ymmB, m);
- cc.evex().vpcmpeqw(kA, zmmB, m);
- cc.evex().vpcmpgtb(kA, xmmB, m);
- cc.evex().vpcmpgtb(kA, ymmB, m);
- cc.evex().vpcmpgtb(kA, zmmB, m);
- cc.evex().vpcmpgtd(kA, xmmB, m);
- cc.evex().vpcmpgtd(kA, ymmB, m);
- cc.evex().vpcmpgtd(kA, zmmB, m);
- cc.evex().vpcmpgtq(kA, xmmB, m);
- cc.evex().vpcmpgtq(kA, ymmB, m);
- cc.evex().vpcmpgtq(kA, zmmB, m);
- cc.evex().vpcmpgtw(kA, xmmB, m);
- cc.evex().vpcmpgtw(kA, ymmB, m);
- cc.evex().vpcmpgtw(kA, zmmB, m);
- cc.evex().vpcmpq(kA, xmmB, m, 0);
- cc.evex().vpcmpq(kA, ymmB, m, 0);
- cc.evex().vpcmpq(kA, zmmB, m, 0);
- cc.evex().vpcmpub(kA, xmmB, m, 0);
- cc.evex().vpcmpub(kA, ymmB, m, 0);
- cc.evex().vpcmpub(kA, zmmB, m, 0);
- cc.evex().vpcmpud(kA, xmmB, m, 0);
- cc.evex().vpcmpud(kA, ymmB, m, 0);
- cc.evex().vpcmpud(kA, zmmB, m, 0);
- cc.evex().vpcmpuq(kA, xmmB, m, 0);
- cc.evex().vpcmpuq(kA, ymmB, m, 0);
- cc.evex().vpcmpuq(kA, zmmB, m, 0);
- cc.evex().vpcmpuw(kA, xmmB, m, 0);
- cc.evex().vpcmpuw(kA, ymmB, m, 0);
- cc.evex().vpcmpuw(kA, zmmB, m, 0);
- cc.evex().vpcmpw(kA, xmmB, m, 0);
- cc.evex().vpcmpw(kA, ymmB, m, 0);
- cc.evex().vpcmpw(kA, zmmB, m, 0);
- cc.evex().vpcompressd(m, xmmB);
- cc.evex().vpcompressd(m, ymmB);
- cc.evex().vpcompressd(m, zmmB);
- cc.evex().vpcompressq(m, xmmB);
- cc.evex().vpcompressq(m, ymmB);
- cc.evex().vpcompressq(m, zmmB);
- cc.evex().vpconflictd(xmmA, m);
- cc.evex().vpconflictd(ymmA, m);
- cc.evex().vpconflictd(zmmA, m);
- cc.evex().vpconflictq(xmmA, m);
- cc.evex().vpconflictq(ymmA, m);
- cc.evex().vpconflictq(zmmA, m);
- cc.evex().vpermb(xmmA, xmmB, m);
- cc.evex().vpermb(ymmA, ymmB, m);
- cc.evex().vpermb(zmmA, zmmB, m);
- cc.evex().vpermd(ymmA, ymmB, m);
- cc.evex().vpermd(zmmA, zmmB, m);
- cc.evex().vpermi2b(xmmA, xmmB, m);
- cc.evex().vpermi2b(ymmA, ymmB, m);
- cc.evex().vpermi2b(zmmA, zmmB, m);
- cc.evex().vpermi2d(xmmA, xmmB, m);
- cc.evex().vpermi2d(ymmA, ymmB, m);
- cc.evex().vpermi2d(zmmA, zmmB, m);
- cc.evex().vpermi2pd(xmmA, xmmB, m);
- cc.evex().vpermi2pd(ymmA, ymmB, m);
- cc.evex().vpermi2pd(zmmA, zmmB, m);
- cc.evex().vpermi2ps(xmmA, xmmB, m);
- cc.evex().vpermi2ps(ymmA, ymmB, m);
- cc.evex().vpermi2ps(zmmA, zmmB, m);
- cc.evex().vpermi2q(xmmA, xmmB, m);
- cc.evex().vpermi2q(ymmA, ymmB, m);
- cc.evex().vpermi2q(zmmA, zmmB, m);
- cc.evex().vpermi2w(xmmA, xmmB, m);
- cc.evex().vpermi2w(ymmA, ymmB, m);
- cc.evex().vpermi2w(zmmA, zmmB, m);
- cc.evex().vpermilpd(xmmA, xmmB, m);
- cc.evex().vpermilpd(ymmA, ymmB, m);
- cc.evex().vpermilpd(zmmA, zmmB, m);
- cc.evex().vpermilpd(xmmA, m, 0);
- cc.evex().vpermilpd(ymmA, m, 0);
- cc.evex().vpermilpd(zmmA, m, 0);
- cc.evex().vpermilps(xmmA, xmmB, m);
- cc.evex().vpermilps(ymmA, ymmB, m);
- cc.evex().vpermilps(zmmA, zmmB, m);
- cc.evex().vpermilps(xmmA, m, 0);
- cc.evex().vpermilps(ymmA, m, 0);
- cc.evex().vpermilps(zmmA, m, 0);
- cc.evex().vpermq(ymmA, ymmB, m);
- cc.evex().vpermq(zmmA, zmmB, m);
- cc.evex().vpermq(ymmA, m, 0);
- cc.evex().vpermq(zmmA, m, 0);
- cc.evex().vpermt2b(xmmA, xmmB, m);
- cc.evex().vpermt2b(ymmA, ymmB, m);
- cc.evex().vpermt2b(zmmA, zmmB, m);
- cc.evex().vpermt2d(xmmA, xmmB, m);
- cc.evex().vpermt2d(ymmA, ymmB, m);
- cc.evex().vpermt2d(zmmA, zmmB, m);
- cc.evex().vpermt2pd(xmmA, xmmB, m);
- cc.evex().vpermt2pd(ymmA, ymmB, m);
- cc.evex().vpermt2pd(zmmA, zmmB, m);
- cc.evex().vpermt2ps(xmmA, xmmB, m);
- cc.evex().vpermt2ps(ymmA, ymmB, m);
- cc.evex().vpermt2ps(zmmA, zmmB, m);
- cc.evex().vpermt2q(xmmA, xmmB, m);
- cc.evex().vpermt2q(ymmA, ymmB, m);
- cc.evex().vpermt2q(zmmA, zmmB, m);
- cc.evex().vpermt2w(xmmA, xmmB, m);
- cc.evex().vpermt2w(ymmA, ymmB, m);
- cc.evex().vpermt2w(zmmA, zmmB, m);
- cc.evex().vpermw(xmmA, xmmB, m);
- cc.evex().vpermw(ymmA, ymmB, m);
- cc.evex().vpermw(zmmA, zmmB, m);
- cc.evex().vpexpandd(xmmA, m);
- cc.evex().vpexpandd(ymmA, m);
- cc.evex().vpexpandd(zmmA, m);
- cc.evex().vpexpandq(xmmA, m);
- cc.evex().vpexpandq(ymmA, m);
- cc.evex().vpexpandq(zmmA, m);
- cc.evex().vpextrb(m, xmmB, 0);
- cc.evex().vpextrd(m, xmmB, 0);
- if (cc.is64Bit()) cc.evex().vpextrq(m, xmmB, 0);
- cc.evex().vpextrw(m, xmmB, 0);
- cc.evex().k(kA).vpgatherdd(xmmA, vx_ptr);
- cc.evex().k(kA).vpgatherdd(ymmA, vy_ptr);
- cc.evex().k(kA).vpgatherdd(zmmA, vz_ptr);
- cc.evex().k(kA).vpgatherdq(xmmA, vx_ptr);
- cc.evex().k(kA).vpgatherdq(ymmA, vx_ptr);
- cc.evex().k(kA).vpgatherdq(zmmA, vy_ptr);
- cc.evex().k(kA).vpgatherqd(xmmA, vx_ptr);
- cc.evex().k(kA).vpgatherqd(xmmA, vy_ptr);
- cc.evex().k(kA).vpgatherqd(ymmA, vz_ptr);
- cc.evex().k(kA).vpgatherqq(xmmA, vx_ptr);
- cc.evex().k(kA).vpgatherqq(ymmA, vy_ptr);
- cc.evex().k(kA).vpgatherqq(zmmA, vz_ptr);
- cc.evex().vpinsrb(xmmA, xmmB, m, 0);
- cc.evex().vpinsrd(xmmA, xmmB, m, 0);
- if (cc.is64Bit()) cc.evex().vpinsrq(xmmA, xmmB, m, 0);
- cc.evex().vpinsrw(xmmA, xmmB, m, 0);
- cc.evex().vplzcntd(xmmA, m);
- cc.evex().vplzcntd(ymmA, m);
- cc.evex().vplzcntd(zmmA, m);
- cc.evex().vplzcntq(xmmA, m);
- cc.evex().vplzcntq(ymmA, m);
- cc.evex().vplzcntq(zmmA, m);
- cc.evex().vpmadd52huq(xmmA, xmmB, m);
- cc.evex().vpmadd52huq(ymmA, ymmB, m);
- cc.evex().vpmadd52huq(zmmA, zmmB, m);
- cc.evex().vpmadd52luq(xmmA, xmmB, m);
- cc.evex().vpmadd52luq(ymmA, ymmB, m);
- cc.evex().vpmadd52luq(zmmA, zmmB, m);
- cc.evex().vpmaddubsw(xmmA, xmmB, m);
- cc.evex().vpmaddubsw(ymmA, ymmB, m);
- cc.evex().vpmaddubsw(zmmA, zmmB, m);
- cc.evex().vpmaddwd(xmmA, xmmB, m);
- cc.evex().vpmaddwd(ymmA, ymmB, m);
- cc.evex().vpmaddwd(zmmA, zmmB, m);
- cc.evex().vpmaxsb(xmmA, xmmB, m);
- cc.evex().vpmaxsb(ymmA, ymmB, m);
- cc.evex().vpmaxsb(zmmA, zmmB, m);
- cc.evex().vpmaxsd(xmmA, xmmB, m);
- cc.evex().vpmaxsd(ymmA, ymmB, m);
- cc.evex().vpmaxsd(zmmA, zmmB, m);
- cc.evex().vpmaxsq(xmmA, xmmB, m);
- cc.evex().vpmaxsq(ymmA, ymmB, m);
- cc.evex().vpmaxsq(zmmA, zmmB, m);
- cc.evex().vpmaxsw(xmmA, xmmB, m);
- cc.evex().vpmaxsw(ymmA, ymmB, m);
- cc.evex().vpmaxsw(zmmA, zmmB, m);
- cc.evex().vpmaxub(xmmA, xmmB, m);
- cc.evex().vpmaxub(ymmA, ymmB, m);
- cc.evex().vpmaxub(zmmA, zmmB, m);
- cc.evex().vpmaxud(xmmA, xmmB, m);
- cc.evex().vpmaxud(ymmA, ymmB, m);
- cc.evex().vpmaxud(zmmA, zmmB, m);
- cc.evex().vpmaxuq(xmmA, xmmB, m);
- cc.evex().vpmaxuq(ymmA, ymmB, m);
- cc.evex().vpmaxuq(zmmA, zmmB, m);
- cc.evex().vpmaxuw(xmmA, xmmB, m);
- cc.evex().vpmaxuw(ymmA, ymmB, m);
- cc.evex().vpmaxuw(zmmA, zmmB, m);
- cc.evex().vpminsb(xmmA, xmmB, m);
- cc.evex().vpminsb(ymmA, ymmB, m);
- cc.evex().vpminsb(zmmA, zmmB, m);
- cc.evex().vpminsd(xmmA, xmmB, m);
- cc.evex().vpminsd(ymmA, ymmB, m);
- cc.evex().vpminsd(zmmA, zmmB, m);
- cc.evex().vpminsq(xmmA, xmmB, m);
- cc.evex().vpminsq(ymmA, ymmB, m);
- cc.evex().vpminsq(zmmA, zmmB, m);
- cc.evex().vpminsw(xmmA, xmmB, m);
- cc.evex().vpminsw(ymmA, ymmB, m);
- cc.evex().vpminsw(zmmA, zmmB, m);
- cc.evex().vpminub(xmmA, xmmB, m);
- cc.evex().vpminub(ymmA, ymmB, m);
- cc.evex().vpminub(zmmA, zmmB, m);
- cc.evex().vpminud(xmmA, xmmB, m);
- cc.evex().vpminud(ymmA, ymmB, m);
- cc.evex().vpminud(zmmA, zmmB, m);
- cc.evex().vpminuq(xmmA, xmmB, m);
- cc.evex().vpminuq(ymmA, ymmB, m);
- cc.evex().vpminuq(zmmA, zmmB, m);
- cc.evex().vpminuw(xmmA, xmmB, m);
- cc.evex().vpminuw(ymmA, ymmB, m);
- cc.evex().vpminuw(zmmA, zmmB, m);
- cc.evex().vpmovdb(m, xmmB);
- cc.evex().vpmovdb(m, ymmB);
- cc.evex().vpmovdb(m, zmmB);
- cc.evex().vpmovdw(m, xmmB);
- cc.evex().vpmovdw(m, ymmB);
- cc.evex().vpmovdw(m, zmmB);
- cc.evex().vpmovqb(m, xmmB);
- cc.evex().vpmovqb(m, ymmB);
- cc.evex().vpmovqb(m, zmmB);
- cc.evex().vpmovqd(m, xmmB);
- cc.evex().vpmovqd(m, ymmB);
- cc.evex().vpmovqd(m, zmmB);
- cc.evex().vpmovqw(m, xmmB);
- cc.evex().vpmovqw(m, ymmB);
- cc.evex().vpmovqw(m, zmmB);
- cc.evex().vpmovsdb(m, xmmB);
- cc.evex().vpmovsdb(m, ymmB);
- cc.evex().vpmovsdb(m, zmmB);
- cc.evex().vpmovsdw(m, xmmB);
- cc.evex().vpmovsdw(m, ymmB);
- cc.evex().vpmovsdw(m, zmmB);
- cc.evex().vpmovsqb(m, xmmB);
- cc.evex().vpmovsqb(m, ymmB);
- cc.evex().vpmovsqb(m, zmmB);
- cc.evex().vpmovsqd(m, xmmB);
- cc.evex().vpmovsqd(m, ymmB);
- cc.evex().vpmovsqd(m, zmmB);
- cc.evex().vpmovsqw(m, xmmB);
- cc.evex().vpmovsqw(m, ymmB);
- cc.evex().vpmovsqw(m, zmmB);
- cc.evex().vpmovswb(m, xmmB);
- cc.evex().vpmovswb(m, ymmB);
- cc.evex().vpmovswb(m, zmmB);
- cc.evex().vpmovsxbd(xmmA, m);
- cc.evex().vpmovsxbd(ymmA, m);
- cc.evex().vpmovsxbd(zmmA, m);
- cc.evex().vpmovsxbq(xmmA, m);
- cc.evex().vpmovsxbq(ymmA, m);
- cc.evex().vpmovsxbq(zmmA, m);
- cc.evex().vpmovsxbw(xmmA, m);
- cc.evex().vpmovsxbw(ymmA, m);
- cc.evex().vpmovsxbw(zmmA, m);
- cc.evex().vpmovsxdq(xmmA, m);
- cc.evex().vpmovsxdq(ymmA, m);
- cc.evex().vpmovsxdq(zmmA, m);
- cc.evex().vpmovsxwd(xmmA, m);
- cc.evex().vpmovsxwd(ymmA, m);
- cc.evex().vpmovsxwd(zmmA, m);
- cc.evex().vpmovsxwq(xmmA, m);
- cc.evex().vpmovsxwq(ymmA, m);
- cc.evex().vpmovsxwq(zmmA, m);
- cc.evex().vpmovusdb(m, xmmB);
- cc.evex().vpmovusdb(m, ymmB);
- cc.evex().vpmovusdb(m, zmmB);
- cc.evex().vpmovusdw(m, xmmB);
- cc.evex().vpmovusdw(m, ymmB);
- cc.evex().vpmovusdw(m, zmmB);
- cc.evex().vpmovusqb(m, xmmB);
- cc.evex().vpmovusqb(m, ymmB);
- cc.evex().vpmovusqb(m, zmmB);
- cc.evex().vpmovusqd(m, xmmB);
- cc.evex().vpmovusqd(m, ymmB);
- cc.evex().vpmovusqd(m, zmmB);
- cc.evex().vpmovusqw(m, xmmB);
- cc.evex().vpmovusqw(m, ymmB);
- cc.evex().vpmovusqw(m, zmmB);
- cc.evex().vpmovuswb(m, xmmB);
- cc.evex().vpmovuswb(m, ymmB);
- cc.evex().vpmovuswb(m, zmmB);
- cc.evex().vpmovwb(m, xmmB);
- cc.evex().vpmovwb(m, ymmB);
- cc.evex().vpmovwb(m, zmmB);
- cc.evex().vpmovzxbd(xmmA, m);
- cc.evex().vpmovzxbd(ymmA, m);
- cc.evex().vpmovzxbd(zmmA, m);
- cc.evex().vpmovzxbq(xmmA, m);
- cc.evex().vpmovzxbq(ymmA, m);
- cc.evex().vpmovzxbq(zmmA, m);
- cc.evex().vpmovzxbw(xmmA, m);
- cc.evex().vpmovzxbw(ymmA, m);
- cc.evex().vpmovzxbw(zmmA, m);
- cc.evex().vpmovzxdq(xmmA, m);
- cc.evex().vpmovzxdq(ymmA, m);
- cc.evex().vpmovzxdq(zmmA, m);
- cc.evex().vpmovzxwd(xmmA, m);
- cc.evex().vpmovzxwd(ymmA, m);
- cc.evex().vpmovzxwd(zmmA, m);
- cc.evex().vpmovzxwq(xmmA, m);
- cc.evex().vpmovzxwq(ymmA, m);
- cc.evex().vpmovzxwq(zmmA, m);
- cc.evex().vpmuldq(xmmA, xmmB, m);
- cc.evex().vpmuldq(ymmA, ymmB, m);
- cc.evex().vpmuldq(zmmA, zmmB, m);
- cc.evex().vpmulhrsw(xmmA, xmmB, m);
- cc.evex().vpmulhrsw(ymmA, ymmB, m);
- cc.evex().vpmulhrsw(zmmA, zmmB, m);
- cc.evex().vpmulhuw(xmmA, xmmB, m);
- cc.evex().vpmulhuw(ymmA, ymmB, m);
- cc.evex().vpmulhuw(zmmA, zmmB, m);
- cc.evex().vpmulhw(xmmA, xmmB, m);
- cc.evex().vpmulhw(ymmA, ymmB, m);
- cc.evex().vpmulhw(zmmA, zmmB, m);
- cc.evex().vpmulld(xmmA, xmmB, m);
- cc.evex().vpmulld(ymmA, ymmB, m);
- cc.evex().vpmulld(zmmA, zmmB, m);
- cc.evex().vpmullq(xmmA, xmmB, m);
- cc.evex().vpmullq(ymmA, ymmB, m);
- cc.evex().vpmullq(zmmA, zmmB, m);
- cc.evex().vpmullw(xmmA, xmmB, m);
- cc.evex().vpmullw(ymmA, ymmB, m);
- cc.evex().vpmullw(zmmA, zmmB, m);
- cc.evex().vpmultishiftqb(xmmA, xmmB, m);
- cc.evex().vpmultishiftqb(ymmA, ymmB, m);
- cc.evex().vpmultishiftqb(zmmA, zmmB, m);
- cc.evex().vpmuludq(xmmA, xmmB, m);
- cc.evex().vpmuludq(ymmA, ymmB, m);
- cc.evex().vpmuludq(zmmA, zmmB, m);
- cc.evex().vpopcntd(zmmA, m);
- cc.evex().vpopcntq(zmmA, m);
- cc.evex().vpord(xmmA, xmmB, m);
- cc.evex().vpord(ymmA, ymmB, m);
- cc.evex().vpord(zmmA, zmmB, m);
- cc.evex().vporq(xmmA, xmmB, m);
- cc.evex().vporq(ymmA, ymmB, m);
- cc.evex().vporq(zmmA, zmmB, m);
- cc.evex().vprold(xmmA, m, 0);
- cc.evex().vprold(ymmA, m, 0);
- cc.evex().vprold(zmmA, m, 0);
- cc.evex().vprolq(xmmA, m, 0);
- cc.evex().vprolq(ymmA, m, 0);
- cc.evex().vprolq(zmmA, m, 0);
- cc.evex().vprolvd(xmmA, xmmB, m);
- cc.evex().vprolvd(ymmA, ymmB, m);
- cc.evex().vprolvd(zmmA, zmmB, m);
- cc.evex().vprolvq(xmmA, xmmB, m);
- cc.evex().vprolvq(ymmA, ymmB, m);
- cc.evex().vprolvq(zmmA, zmmB, m);
- cc.evex().vprord(xmmA, m, 0);
- cc.evex().vprord(ymmA, m, 0);
- cc.evex().vprord(zmmA, m, 0);
- cc.evex().vprorq(xmmA, m, 0);
- cc.evex().vprorq(ymmA, m, 0);
- cc.evex().vprorq(zmmA, m, 0);
- cc.evex().vprorvd(xmmA, xmmB, m);
- cc.evex().vprorvd(ymmA, ymmB, m);
- cc.evex().vprorvd(zmmA, zmmB, m);
- cc.evex().vprorvq(xmmA, xmmB, m);
- cc.evex().vprorvq(ymmA, ymmB, m);
- cc.evex().vprorvq(zmmA, zmmB, m);
- cc.evex().vpsadbw(xmmA, xmmB, m);
- cc.evex().vpsadbw(ymmA, ymmB, m);
- cc.evex().vpsadbw(zmmA, zmmB, m);
- cc.evex().k(kA).vpscatterdd(vx_ptr, xmmB);
- cc.evex().k(kA).vpscatterdd(vy_ptr, ymmB);
- cc.evex().k(kA).vpscatterdd(vz_ptr, zmmB);
- cc.evex().k(kA).vpscatterdq(vx_ptr, xmmB);
- cc.evex().k(kA).vpscatterdq(vx_ptr, ymmB);
- cc.evex().k(kA).vpscatterdq(vy_ptr, zmmB);
- cc.evex().k(kA).vpscatterqd(vx_ptr, xmmB);
- cc.evex().k(kA).vpscatterqd(vy_ptr, xmmB);
- cc.evex().k(kA).vpscatterqd(vz_ptr, ymmB);
- cc.evex().k(kA).vpscatterqq(vx_ptr, xmmB);
- cc.evex().k(kA).vpscatterqq(vy_ptr, ymmB);
- cc.evex().k(kA).vpscatterqq(vz_ptr, zmmB);
- cc.evex().vpshufb(xmmA, xmmB, m);
- cc.evex().vpshufb(ymmA, ymmB, m);
- cc.evex().vpshufb(zmmA, zmmB, m);
- cc.evex().vpshufd(xmmA, m, 0);
- cc.evex().vpshufd(ymmA, m, 0);
- cc.evex().vpshufd(zmmA, m, 0);
- cc.evex().vpshufhw(xmmA, m, 0);
- cc.evex().vpshufhw(ymmA, m, 0);
- cc.evex().vpshufhw(zmmA, m, 0);
- cc.evex().vpshuflw(xmmA, m, 0);
- cc.evex().vpshuflw(ymmA, m, 0);
- cc.evex().vpshuflw(zmmA, m, 0);
- cc.evex().vpslld(xmmA, xmmB, m);
- cc.evex().vpslld(xmmA, m, 0);
- cc.evex().vpslld(ymmA, ymmB, m);
- cc.evex().vpslld(ymmA, m, 0);
- cc.evex().vpslld(zmmA, zmmB, m);
- cc.evex().vpslld(zmmA, m, 0);
- cc.evex().vpslldq(xmmA, m, 0);
- cc.evex().vpslldq(ymmA, m, 0);
- cc.evex().vpslldq(zmmA, m, 0);
- cc.evex().vpsllq(xmmA, xmmB, m);
- cc.evex().vpsllq(xmmA, m, 0);
- cc.evex().vpsllq(ymmA, ymmB, m);
- cc.evex().vpsllq(ymmA, m, 0);
- cc.evex().vpsllq(zmmA, zmmB, m);
- cc.evex().vpsllq(zmmA, m, 0);
- cc.evex().vpsllvd(xmmA, xmmB, m);
- cc.evex().vpsllvd(ymmA, ymmB, m);
- cc.evex().vpsllvd(zmmA, zmmB, m);
- cc.evex().vpsllvq(xmmA, xmmB, m);
- cc.evex().vpsllvq(ymmA, ymmB, m);
- cc.evex().vpsllvq(zmmA, zmmB, m);
- cc.evex().vpsllvw(xmmA, xmmB, m);
- cc.evex().vpsllvw(ymmA, ymmB, m);
- cc.evex().vpsllvw(zmmA, zmmB, m);
- cc.evex().vpsllw(xmmA, xmmB, m);
- cc.evex().vpsllw(xmmA, m, 0);
- cc.evex().vpsllw(ymmA, ymmB, m);
- cc.evex().vpsllw(ymmA, m, 0);
- cc.evex().vpsllw(zmmA, zmmB, m);
- cc.evex().vpsllw(zmmA, m, 0);
- cc.evex().vpsrad(xmmA, xmmB, m);
- cc.evex().vpsrad(xmmA, m, 0);
- cc.evex().vpsrad(ymmA, ymmB, m);
- cc.evex().vpsrad(ymmA, m, 0);
- cc.evex().vpsrad(zmmA, zmmB, m);
- cc.evex().vpsrad(zmmA, m, 0);
- cc.evex().vpsraq(xmmA, xmmB, m);
- cc.evex().vpsraq(xmmA, m, 0);
- cc.evex().vpsraq(ymmA, ymmB, m);
- cc.evex().vpsraq(ymmA, m, 0);
- cc.evex().vpsraq(zmmA, zmmB, m);
- cc.evex().vpsraq(zmmA, m, 0);
- cc.evex().vpsravd(xmmA, xmmB, m);
- cc.evex().vpsravd(ymmA, ymmB, m);
- cc.evex().vpsravd(zmmA, zmmB, m);
- cc.evex().vpsravq(xmmA, xmmB, m);
- cc.evex().vpsravq(ymmA, ymmB, m);
- cc.evex().vpsravq(zmmA, zmmB, m);
- cc.evex().vpsravw(xmmA, xmmB, m);
- cc.evex().vpsravw(ymmA, ymmB, m);
- cc.evex().vpsravw(zmmA, zmmB, m);
- cc.evex().vpsraw(xmmA, xmmB, m);
- cc.evex().vpsraw(xmmA, m, 0);
- cc.evex().vpsraw(ymmA, ymmB, m);
- cc.evex().vpsraw(ymmA, m, 0);
- cc.evex().vpsraw(zmmA, zmmB, m);
- cc.evex().vpsraw(zmmA, m, 0);
- cc.evex().vpsrld(xmmA, xmmB, m);
- cc.evex().vpsrld(xmmA, m, 0);
- cc.evex().vpsrld(ymmA, ymmB, m);
- cc.evex().vpsrld(ymmA, m, 0);
- cc.evex().vpsrld(zmmA, zmmB, m);
- cc.evex().vpsrld(zmmA, m, 0);
- cc.evex().vpsrldq(xmmA, m, 0);
- cc.evex().vpsrldq(ymmA, m, 0);
- cc.evex().vpsrldq(zmmA, m, 0);
- cc.evex().vpsrlq(xmmA, xmmB, m);
- cc.evex().vpsrlq(xmmA, m, 0);
- cc.evex().vpsrlq(ymmA, ymmB, m);
- cc.evex().vpsrlq(ymmA, m, 0);
- cc.evex().vpsrlq(zmmA, zmmB, m);
- cc.evex().vpsrlq(zmmA, m, 0);
- cc.evex().vpsrlvd(xmmA, xmmB, m);
- cc.evex().vpsrlvd(ymmA, ymmB, m);
- cc.evex().vpsrlvd(zmmA, zmmB, m);
- cc.evex().vpsrlvq(xmmA, xmmB, m);
- cc.evex().vpsrlvq(ymmA, ymmB, m);
- cc.evex().vpsrlvq(zmmA, zmmB, m);
- cc.evex().vpsrlvw(xmmA, xmmB, m);
- cc.evex().vpsrlvw(ymmA, ymmB, m);
- cc.evex().vpsrlvw(zmmA, zmmB, m);
- cc.evex().vpsrlw(xmmA, xmmB, m);
- cc.evex().vpsrlw(xmmA, m, 0);
- cc.evex().vpsrlw(ymmA, ymmB, m);
- cc.evex().vpsrlw(ymmA, m, 0);
- cc.evex().vpsrlw(zmmA, zmmB, m);
- cc.evex().vpsrlw(zmmA, m, 0);
- cc.evex().vpsubb(xmmA, xmmB, m);
- cc.evex().vpsubb(ymmA, ymmB, m);
- cc.evex().vpsubb(zmmA, zmmB, m);
- cc.evex().vpsubd(xmmA, xmmB, m);
- cc.evex().vpsubd(ymmA, ymmB, m);
- cc.evex().vpsubd(zmmA, zmmB, m);
- cc.evex().vpsubq(xmmA, xmmB, m);
- cc.evex().vpsubq(ymmA, ymmB, m);
- cc.evex().vpsubq(zmmA, zmmB, m);
- cc.evex().vpsubsb(xmmA, xmmB, m);
- cc.evex().vpsubsb(ymmA, ymmB, m);
- cc.evex().vpsubsb(zmmA, zmmB, m);
- cc.evex().vpsubsw(xmmA, xmmB, m);
- cc.evex().vpsubsw(ymmA, ymmB, m);
- cc.evex().vpsubsw(zmmA, zmmB, m);
- cc.evex().vpsubusb(xmmA, xmmB, m);
- cc.evex().vpsubusb(ymmA, ymmB, m);
- cc.evex().vpsubusb(zmmA, zmmB, m);
- cc.evex().vpsubusw(xmmA, xmmB, m);
- cc.evex().vpsubusw(ymmA, ymmB, m);
- cc.evex().vpsubusw(zmmA, zmmB, m);
- cc.evex().vpsubw(xmmA, xmmB, m);
- cc.evex().vpsubw(ymmA, ymmB, m);
- cc.evex().vpsubw(zmmA, zmmB, m);
- cc.evex().vpternlogd(xmmA, xmmB, m, 0);
- cc.evex().vpternlogd(ymmA, ymmB, m, 0);
- cc.evex().vpternlogd(zmmA, zmmB, m, 0);
- cc.evex().vpternlogq(xmmA, xmmB, m, 0);
- cc.evex().vpternlogq(ymmA, ymmB, m, 0);
- cc.evex().vpternlogq(zmmA, zmmB, m, 0);
- cc.evex().vptestmb(kA, xmmB, m);
- cc.evex().vptestmb(kA, ymmB, m);
- cc.evex().vptestmb(kA, zmmB, m);
- cc.evex().vptestmd(kA, xmmB, m);
- cc.evex().vptestmd(kA, ymmB, m);
- cc.evex().vptestmd(kA, zmmB, m);
- cc.evex().vptestmq(kA, xmmB, m);
- cc.evex().vptestmq(kA, ymmB, m);
- cc.evex().vptestmq(kA, zmmB, m);
- cc.evex().vptestmw(kA, xmmB, m);
- cc.evex().vptestmw(kA, ymmB, m);
- cc.evex().vptestmw(kA, zmmB, m);
- cc.evex().vptestnmb(kA, xmmB, m);
- cc.evex().vptestnmb(kA, ymmB, m);
- cc.evex().vptestnmb(kA, zmmB, m);
- cc.evex().vptestnmd(kA, xmmB, m);
- cc.evex().vptestnmd(kA, ymmB, m);
- cc.evex().vptestnmd(kA, zmmB, m);
- cc.evex().vptestnmq(kA, xmmB, m);
- cc.evex().vptestnmq(kA, ymmB, m);
- cc.evex().vptestnmq(kA, zmmB, m);
- cc.evex().vptestnmw(kA, xmmB, m);
- cc.evex().vptestnmw(kA, ymmB, m);
- cc.evex().vptestnmw(kA, zmmB, m);
- cc.evex().vpunpckhbw(xmmA, xmmB, m);
- cc.evex().vpunpckhbw(ymmA, ymmB, m);
- cc.evex().vpunpckhbw(zmmA, zmmB, m);
- cc.evex().vpunpckhdq(xmmA, xmmB, m);
- cc.evex().vpunpckhdq(ymmA, ymmB, m);
- cc.evex().vpunpckhdq(zmmA, zmmB, m);
- cc.evex().vpunpckhqdq(xmmA, xmmB, m);
- cc.evex().vpunpckhqdq(ymmA, ymmB, m);
- cc.evex().vpunpckhqdq(zmmA, zmmB, m);
- cc.evex().vpunpckhwd(xmmA, xmmB, m);
- cc.evex().vpunpckhwd(ymmA, ymmB, m);
- cc.evex().vpunpckhwd(zmmA, zmmB, m);
- cc.evex().vpunpcklbw(xmmA, xmmB, m);
- cc.evex().vpunpcklbw(ymmA, ymmB, m);
- cc.evex().vpunpcklbw(zmmA, zmmB, m);
- cc.evex().vpunpckldq(xmmA, xmmB, m);
- cc.evex().vpunpckldq(ymmA, ymmB, m);
- cc.evex().vpunpckldq(zmmA, zmmB, m);
- cc.evex().vpunpcklqdq(xmmA, xmmB, m);
- cc.evex().vpunpcklqdq(ymmA, ymmB, m);
- cc.evex().vpunpcklqdq(zmmA, zmmB, m);
- cc.evex().vpunpcklwd(xmmA, xmmB, m);
- cc.evex().vpunpcklwd(ymmA, ymmB, m);
- cc.evex().vpunpcklwd(zmmA, zmmB, m);
- cc.evex().vpxord(xmmA, xmmB, m);
- cc.evex().vpxord(ymmA, ymmB, m);
- cc.evex().vpxord(zmmA, zmmB, m);
- cc.evex().vpxorq(xmmA, xmmB, m);
- cc.evex().vpxorq(ymmA, ymmB, m);
- cc.evex().vpxorq(zmmA, zmmB, m);
- cc.evex().vrangepd(xmmA, xmmB, m, 0);
- cc.evex().vrangepd(ymmA, ymmB, m, 0);
- cc.evex().vrangepd(zmmA, zmmB, m, 0);
- cc.evex().vrangeps(xmmA, xmmB, m, 0);
- cc.evex().vrangeps(ymmA, ymmB, m, 0);
- cc.evex().vrangeps(zmmA, zmmB, m, 0);
- cc.evex().vrangesd(xmmA, xmmB, m, 0);
- cc.evex().vrangess(xmmA, xmmB, m, 0);
- cc.evex().vrcp14pd(xmmA, m);
- cc.evex().vrcp14pd(ymmA, m);
- cc.evex().vrcp14pd(zmmA, m);
- cc.evex().vrcp14ps(xmmA, m);
- cc.evex().vrcp14ps(ymmA, m);
- cc.evex().vrcp14ps(zmmA, m);
- cc.evex().vrcp14sd(xmmA, xmmB, m);
- cc.evex().vrcp14ss(xmmA, xmmB, m);
- cc.evex().vrcp28pd(zmmA, m);
- cc.evex().vrcp28ps(zmmA, m);
- cc.evex().vrcp28sd(xmmA, xmmB, m);
- cc.evex().vrcp28ss(xmmA, xmmB, m);
- cc.evex().vreducepd(xmmA, m, 0);
- cc.evex().vreducepd(ymmA, m, 0);
- cc.evex().vreducepd(zmmA, m, 0);
- cc.evex().vreduceps(xmmA, m, 0);
- cc.evex().vreduceps(ymmA, m, 0);
- cc.evex().vreduceps(zmmA, m, 0);
- cc.evex().vreducesd(xmmA, xmmB, m, 0);
- cc.evex().vreducess(xmmA, xmmB, m, 0);
- cc.evex().vrndscalepd(xmmA, m, 0);
- cc.evex().vrndscalepd(ymmA, m, 0);
- cc.evex().vrndscalepd(zmmA, m, 0);
- cc.evex().vrndscaleps(xmmA, m, 0);
- cc.evex().vrndscaleps(ymmA, m, 0);
- cc.evex().vrndscaleps(zmmA, m, 0);
- cc.evex().vrndscalesd(xmmA, xmmB, m, 0);
- cc.evex().vrndscaless(xmmA, xmmB, m, 0);
- cc.evex().vrsqrt14pd(xmmA, m);
- cc.evex().vrsqrt14pd(ymmA, m);
- cc.evex().vrsqrt14pd(zmmA, m);
- cc.evex().vrsqrt14ps(xmmA, m);
- cc.evex().vrsqrt14ps(ymmA, m);
- cc.evex().vrsqrt14ps(zmmA, m);
- cc.evex().vrsqrt14sd(xmmA, xmmB, m);
- cc.evex().vrsqrt14ss(xmmA, xmmB, m);
- cc.evex().vrsqrt28pd(zmmA, m);
- cc.evex().vrsqrt28ps(zmmA, m);
- cc.evex().vrsqrt28sd(xmmA, xmmB, m);
- cc.evex().vrsqrt28ss(xmmA, xmmB, m);
- cc.evex().vscalefpd(xmmA, xmmB, m);
- cc.evex().vscalefpd(ymmA, ymmB, m);
- cc.evex().vscalefpd(zmmA, zmmB, m);
- cc.evex().vscalefps(xmmA, xmmB, m);
- cc.evex().vscalefps(ymmA, ymmB, m);
- cc.evex().vscalefps(zmmA, zmmB, m);
- cc.evex().vscalefsd(xmmA, xmmB, m);
- cc.evex().vscalefss(xmmA, xmmB, m);
- cc.evex().k(kA).vscatterdpd(vx_ptr, xmmB);
- cc.evex().k(kA).vscatterdpd(vx_ptr, ymmB);
- cc.evex().k(kA).vscatterdpd(vy_ptr, zmmB);
- cc.evex().k(kA).vscatterdps(vx_ptr, xmmB);
- cc.evex().k(kA).vscatterdps(vy_ptr, ymmB);
- cc.evex().k(kA).vscatterdps(vz_ptr, zmmB);
- cc.evex().k(kA).vscatterpf0dpd(vy_ptr);
- cc.evex().k(kA).vscatterpf0dps(vz_ptr);
- cc.evex().k(kA).vscatterpf0qpd(vz_ptr);
- cc.evex().k(kA).vscatterpf0qps(vz_ptr);
- cc.evex().k(kA).vscatterpf1dpd(vy_ptr);
- cc.evex().k(kA).vscatterpf1dps(vz_ptr);
- cc.evex().k(kA).vscatterpf1qpd(vz_ptr);
- cc.evex().k(kA).vscatterpf1qps(vz_ptr);
- cc.evex().k(kA).vscatterqpd(vx_ptr, xmmB);
- cc.evex().k(kA).vscatterqpd(vy_ptr, ymmB);
- cc.evex().k(kA).vscatterqpd(vz_ptr, zmmB);
- cc.evex().k(kA).vscatterqps(vx_ptr, xmmB);
- cc.evex().k(kA).vscatterqps(vy_ptr, xmmB);
- cc.evex().k(kA).vscatterqps(vz_ptr, ymmB);
- cc.evex().vshuff32x4(ymmA, ymmB, m, 0);
- cc.evex().vshuff32x4(zmmA, zmmB, m, 0);
- cc.evex().vshuff64x2(ymmA, ymmB, m, 0);
- cc.evex().vshuff64x2(zmmA, zmmB, m, 0);
- cc.evex().vshufi32x4(ymmA, ymmB, m, 0);
- cc.evex().vshufi32x4(zmmA, zmmB, m, 0);
- cc.evex().vshufi64x2(ymmA, ymmB, m, 0);
- cc.evex().vshufi64x2(zmmA, zmmB, m, 0);
- cc.evex().vshufpd(xmmA, xmmB, m, 0);
- cc.evex().vshufpd(ymmA, ymmB, m, 0);
- cc.evex().vshufpd(zmmA, zmmB, m, 0);
- cc.evex().vshufps(xmmA, xmmB, m, 0);
- cc.evex().vshufps(ymmA, ymmB, m, 0);
- cc.evex().vshufps(zmmA, zmmB, m, 0);
- cc.evex().vsqrtpd(xmmA, m);
- cc.evex().vsqrtpd(ymmA, m);
- cc.evex().vsqrtpd(zmmA, m);
- cc.evex().vsqrtps(xmmA, m);
- cc.evex().vsqrtps(ymmA, m);
- cc.evex().vsqrtps(zmmA, m);
- cc.evex().vsqrtsd(xmmA, xmmB, m);
- cc.evex().vsqrtss(xmmA, xmmB, m);
- cc.evex().vsubpd(xmmA, xmmB, m);
- cc.evex().vsubpd(ymmA, ymmB, m);
- cc.evex().vsubpd(zmmA, zmmB, m);
- cc.evex().vsubps(xmmA, xmmB, m);
- cc.evex().vsubps(ymmA, ymmB, m);
- cc.evex().vsubps(zmmA, zmmB, m);
- cc.evex().vsubsd(xmmA, xmmB, m);
- cc.evex().vsubss(xmmA, xmmB, m);
- cc.evex().vucomisd(xmmA, m);
- cc.evex().vucomiss(xmmA, m);
- cc.evex().vunpckhpd(xmmA, xmmB, m);
- cc.evex().vunpckhpd(ymmA, ymmB, m);
- cc.evex().vunpckhpd(zmmA, zmmB, m);
- cc.evex().vunpckhps(xmmA, xmmB, m);
- cc.evex().vunpckhps(ymmA, ymmB, m);
- cc.evex().vunpckhps(zmmA, zmmB, m);
- cc.evex().vunpcklpd(xmmA, xmmB, m);
- cc.evex().vunpcklpd(ymmA, ymmB, m);
- cc.evex().vunpcklpd(zmmA, zmmB, m);
- cc.evex().vunpcklps(xmmA, xmmB, m);
- cc.evex().vunpcklps(ymmA, ymmB, m);
- cc.evex().vunpcklps(zmmA, zmmB, m);
- cc.evex().vxorpd(xmmA, xmmB, m);
- cc.evex().vxorpd(ymmA, ymmB, m);
- cc.evex().vxorpd(zmmA, zmmB, m);
- cc.evex().vxorps(xmmA, xmmB, m);
- cc.evex().vxorps(ymmA, ymmB, m);
- cc.evex().vxorps(zmmA, zmmB, m);
-}
-
-// Generates a long sequence of AVX512 instructions.
-template<typename Emitter>
-static void generateAvx512SequenceInternal(
- Emitter& cc,
- InstForm form,
- const x86::Gp& gp,
- const x86::KReg& kA, const x86::KReg& kB, const x86::KReg& kC,
- const x86::Vec& vecA, const x86::Vec& vecB, const x86::Vec& vecC, const x86::Vec& vecD) {
-
- if (form == InstForm::kReg)
- generateAvx512SequenceInternalRegOnly(cc, gp, kA, kB, kC, vecA, vecB, vecC, vecD);
- else
- generateAvx512SequenceInternalRegMem(cc, gp, kA, kB, kC, vecA, vecB, vecC, vecD);
-}
-
-static void generateAvx512Sequence(BaseEmitter& emitter, InstForm form, bool emitPrologEpilog) {
- using namespace asmjit::x86;
-
- if (emitter.isAssembler()) {
- Assembler& cc = *emitter.as<Assembler>();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
- cc.emitEpilog(frame);
- }
- else {
- generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
- }
- }
-#ifndef ASMJIT_NO_BUILDER
- else if (emitter.isBuilder()) {
- Builder& cc = *emitter.as<Builder>();
-
- if (emitPrologEpilog) {
- FuncDetail func;
- func.init(FuncSignature::build<void, void*, const void*, size_t>(), cc.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
- frame.finalize();
-
- cc.emitProlog(frame);
- generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
- cc.emitEpilog(frame);
- }
- else {
- generateAvx512SequenceInternal(cc, form, eax, k1, k2, k3, zmm0, zmm1, zmm2, zmm3);
- }
- }
-#endif
-#ifndef ASMJIT_NO_COMPILER
- else if (emitter.isCompiler()) {
- Compiler& cc = *emitter.as<Compiler>();
-
- Gp gp = cc.newGpz("gp");
- Zmm vecA = cc.newZmm("vecA");
- Zmm vecB = cc.newZmm("vecB");
- Zmm vecC = cc.newZmm("vecC");
- Zmm vecD = cc.newZmm("vecD");
-
- KReg kA = cc.newKq("kA");
- KReg kB = cc.newKq("kB");
- KReg kC = cc.newKq("kC");
-
- cc.addFunc(FuncSignature::build<void>());
- generateAvx512SequenceInternal(cc, form, gp, kA, kB, kC, vecA, vecB, vecC, vecD);
- cc.endFunc();
- }
-#endif
-}
-
-template<typename EmitterFn>
-static void benchmarkX86Function(Arch arch, uint32_t numIterations, const char* description, const EmitterFn& emitterFn) noexcept {
- CodeHolder code;
- printf("%s:\n", description);
-
- uint32_t instCount = 0;
-
-#ifndef ASMJIT_NO_BUILDER
- instCount = asmjit_perf_utils::calculateInstructionCount<x86::Builder>(code, arch, [&](x86::Builder& cc) {
- emitterFn(cc, false);
- });
-#endif
-
- asmjit_perf_utils::bench<x86::Assembler>(code, arch, numIterations, "[raw]", instCount, [&](x86::Assembler& cc) {
- emitterFn(cc, false);
- });
-
- asmjit_perf_utils::bench<x86::Assembler>(code, arch, numIterations, "[validated]", instCount, [&](x86::Assembler& cc) {
- cc.addDiagnosticOptions(DiagnosticOptions::kValidateAssembler);
- emitterFn(cc, false);
- });
-
- asmjit_perf_utils::bench<x86::Assembler>(code, arch, numIterations, "[prolog/epilog]", instCount, [&](x86::Assembler& cc) {
- emitterFn(cc, true);
- });
-
-#ifndef ASMJIT_NO_BUILDER
- asmjit_perf_utils::bench<x86::Builder>(code, arch, numIterations, "[no-asm]", instCount, [&](x86::Builder& cc) {
- emitterFn(cc, false);
- });
-
- asmjit_perf_utils::bench<x86::Builder>(code, arch, numIterations, "[finalized]", instCount, [&](x86::Builder& cc) {
- emitterFn(cc, false);
- cc.finalize();
- });
-
- asmjit_perf_utils::bench<x86::Builder>(code, arch, numIterations, "[prolog/epilog]", instCount, [&](x86::Builder& cc) {
- emitterFn(cc, true);
- cc.finalize();
- });
-#endif
-
-#ifndef ASMJIT_NO_COMPILER
- asmjit_perf_utils::bench<x86::Compiler>(code, arch, numIterations, "[no-asm]", instCount, [&](x86::Compiler& cc) {
- emitterFn(cc, true);
- });
-
- asmjit_perf_utils::bench<x86::Compiler>(code, arch, numIterations, "[finalized]", instCount, [&](x86::Compiler& cc) {
- emitterFn(cc, true);
- cc.finalize();
- });
-#endif
-
- printf("\n");
-}
-
-void benchmarkX86Emitters(uint32_t numIterations, bool testX86, bool testX64) {
- uint32_t i = 0;
- uint32_t n = 0;
-
- Arch archs[2] {};
-
- if (testX86) archs[n++] = Arch::kX86;
- if (testX64) archs[n++] = Arch::kX64;
-
- for (i = 0; i < n; i++) {
- static const char description[] = "GpSequence<Reg> (Sequence of GP instructions - reg-only)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateGpSequence(emitter, InstForm::kReg, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "GpSequence<Mem> (Sequence of GP instructions - reg/mem)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateGpSequence(emitter, InstForm::kMem, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "SseSequence<Reg> (sequence of SSE+ instructions - reg-only)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateSseSequence(emitter, InstForm::kReg, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "SseSequence<Mem> (sequence of SSE+ instructions - reg/mem)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateSseSequence(emitter, InstForm::kMem, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "AvxSequence<Reg> (sequence of AVX+ instructions - reg-only)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateAvxSequence(emitter, InstForm::kReg, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "AvxSequence<Mem> (sequence of AVX+ instructions - reg/mem)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateAvxSequence(emitter, InstForm::kMem, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "Avx512Sequence<Reg> (sequence of AVX512+ instructions - reg-only)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateAvx512Sequence(emitter, InstForm::kReg, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "Avx512Sequence<Mem> (sequence of AVX512+ instructions - reg/mem)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- generateAvx512Sequence(emitter, InstForm::kMem, emitPrologEpilog);
- });
- }
-
- for (i = 0; i < n; i++) {
- static const char description[] = "SseAlphaBlend (alpha-blend function with labels and jumps)";
- benchmarkX86Function(archs[i], numIterations, description, [](BaseEmitter& emitter, bool emitPrologEpilog) {
- asmtest::generateSseAlphaBlend(emitter, emitPrologEpilog);
- });
- }
-}
-
-#endif // !ASMJIT_NO_X86
diff --git a/3rdparty/asmjit/test/asmjit_test_unit.cpp b/3rdparty/asmjit/test/asmjit_test_unit.cpp
deleted file mode 100644
index 86d1f1a91fa..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_unit.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#include <asmjit/core.h>
-
-#if !defined(ASMJIT_NO_X86)
-#include <asmjit/x86.h>
-#endif
-
-#include "asmjitutils.h"
-#include "broken.h"
-
-using namespace asmjit;
-
-static void dumpCpu(void) noexcept {
- const CpuInfo& cpu = CpuInfo::host();
-
- // CPU Information
- // ---------------
-
- INFO("CPU Info:");
- INFO(" Vendor : %s", cpu.vendor());
- INFO(" Brand : %s", cpu.brand());
- INFO(" Model ID : %u", cpu.modelId());
- INFO(" Brand ID : %u", cpu.brandId());
- INFO(" Family ID : %u", cpu.familyId());
- INFO(" Stepping : %u", cpu.stepping());
- INFO(" Processor Type : %u", cpu.processorType());
- INFO(" Max logical Processors : %u", cpu.maxLogicalProcessors());
- INFO(" Cache-Line Size : %u", cpu.cacheLineSize());
- INFO(" HW-Thread Count : %u", cpu.hwThreadCount());
- INFO("");
-
- // CPU Features
- // ------------
-
-#ifndef ASMJIT_NO_LOGGING
- INFO("CPU Features:");
- CpuFeatures::Iterator it(cpu.features().iterator());
- while (it.hasNext()) {
- uint32_t featureId = uint32_t(it.next());
- StringTmp<64> featureString;
- Formatter::formatFeature(featureString, cpu.arch(), featureId);
- INFO(" %s\n", featureString.data());
- };
- INFO("");
-#endif // !ASMJIT_NO_LOGGING
-}
-
-#define DUMP_TYPE(...) \
- INFO(" %-26s: %u", #__VA_ARGS__, uint32_t(sizeof(__VA_ARGS__)))
-
-static void dumpSizeOf(void) noexcept {
- INFO("Size of C++ types:");
- DUMP_TYPE(int8_t);
- DUMP_TYPE(int16_t);
- DUMP_TYPE(int32_t);
- DUMP_TYPE(int64_t);
- DUMP_TYPE(int);
- DUMP_TYPE(long);
- DUMP_TYPE(size_t);
- DUMP_TYPE(intptr_t);
- DUMP_TYPE(float);
- DUMP_TYPE(double);
- DUMP_TYPE(void*);
- INFO("");
-
- INFO("Size of base classes:");
- DUMP_TYPE(BaseAssembler);
- DUMP_TYPE(BaseEmitter);
- DUMP_TYPE(CodeBuffer);
- DUMP_TYPE(CodeHolder);
- DUMP_TYPE(ConstPool);
- DUMP_TYPE(LabelEntry);
- DUMP_TYPE(RelocEntry);
- DUMP_TYPE(Section);
- DUMP_TYPE(String);
- DUMP_TYPE(Target);
- DUMP_TYPE(Zone);
- DUMP_TYPE(ZoneAllocator);
- DUMP_TYPE(ZoneBitVector);
- DUMP_TYPE(ZoneHashNode);
- DUMP_TYPE(ZoneHash<ZoneHashNode>);
- DUMP_TYPE(ZoneList<int>);
- DUMP_TYPE(ZoneVector<int>);
- INFO("");
-
- INFO("Size of operand classes:");
- DUMP_TYPE(Operand);
- DUMP_TYPE(BaseReg);
- DUMP_TYPE(BaseMem);
- DUMP_TYPE(Imm);
- DUMP_TYPE(Label);
- INFO("");
-
- INFO("Size of function classes:");
- DUMP_TYPE(CallConv);
- DUMP_TYPE(FuncFrame);
- DUMP_TYPE(FuncValue);
- DUMP_TYPE(FuncDetail);
- DUMP_TYPE(FuncSignature);
- DUMP_TYPE(FuncArgsAssignment);
- INFO("");
-
-#if !defined(ASMJIT_NO_BUILDER)
- INFO("Size of builder classes:");
- DUMP_TYPE(BaseBuilder);
- DUMP_TYPE(BaseNode);
- DUMP_TYPE(InstNode);
- DUMP_TYPE(InstNodeWithOperands<InstNode::kBaseOpCapacity>);
- DUMP_TYPE(InstNodeWithOperands<InstNode::kFullOpCapacity>);
- DUMP_TYPE(AlignNode);
- DUMP_TYPE(LabelNode);
- DUMP_TYPE(EmbedDataNode);
- DUMP_TYPE(EmbedLabelNode);
- DUMP_TYPE(ConstPoolNode);
- DUMP_TYPE(CommentNode);
- DUMP_TYPE(SentinelNode);
- INFO("");
-#endif
-
-#if !defined(ASMJIT_NO_COMPILER)
- INFO("Size of compiler classes:");
- DUMP_TYPE(BaseCompiler);
- DUMP_TYPE(FuncNode);
- DUMP_TYPE(FuncRetNode);
- DUMP_TYPE(InvokeNode);
- INFO("");
-#endif
-
-#if !defined(ASMJIT_NO_X86)
- INFO("Size of x86-specific classes:");
- DUMP_TYPE(x86::Assembler);
- #if !defined(ASMJIT_NO_BUILDER)
- DUMP_TYPE(x86::Builder);
- #endif
- #if !defined(ASMJIT_NO_COMPILER)
- DUMP_TYPE(x86::Compiler);
- #endif
- DUMP_TYPE(x86::InstDB::InstInfo);
- DUMP_TYPE(x86::InstDB::CommonInfo);
- DUMP_TYPE(x86::InstDB::OpSignature);
- DUMP_TYPE(x86::InstDB::InstSignature);
- INFO("");
-#endif
-}
-
-#undef DUMP_TYPE
-
-static void onBeforeRun(void) noexcept {
- dumpCpu();
- dumpSizeOf();
-}
-
-int main(int argc, const char* argv[]) {
-#if defined(ASMJIT_BUILD_DEBUG)
- const char buildType[] = "Debug";
-#else
- const char buildType[] = "Release";
-#endif
-
- INFO("AsmJit Unit-Test v%u.%u.%u [Arch=%s] [Mode=%s]\n\n",
- unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
- unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
- unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF),
- asmjitArchAsString(Arch::kHost),
- buildType
- );
-
- return BrokenAPI::run(argc, argv, onBeforeRun);
-}
diff --git a/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp b/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp
deleted file mode 100644
index df763224d9b..00000000000
--- a/3rdparty/asmjit/test/asmjit_test_x86_sections.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-// ----------------------------------------------------------------------------
-// This is a working example that demonstrates how multiple sections can be
-// used in a JIT-based code generator. It shows also the necessary tooling
-// that is expected to be done by the user when the feature is used. It's
-// important to handle the following cases:
-//
-// - Assign offsets to sections when the code generation is finished.
-// - Tell the CodeHolder to resolve unresolved links and check whether
-// all links were resolved.
-// - Relocate the code
-// - Copy the code to the destination address.
-// ----------------------------------------------------------------------------
-
-#include <asmjit/core.h>
-#if ASMJIT_ARCH_X86 && !defined(ASMJIT_NO_X86) && !defined(ASMJIT_NO_JIT)
-
-#include <asmjit/x86.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-using namespace asmjit;
-
-// The generated function is very simple, it only accesses the built-in data
-// (from .data section) at the index as provided by its first argument. This
-// data is inlined into the resulting function so we can use it this array
-// for verification that the function returns correct values.
-static const uint8_t dataArray[] = { 2, 9, 4, 7, 1, 3, 8, 5, 6, 0 };
-
-static void fail(const char* message, Error err) {
- printf("** FAILURE: %s (%s) **\n", message, DebugUtils::errorAsString(err));
- exit(1);
-}
-
-int main() {
- printf("AsmJit X86 Sections Test\n\n");
-
- Environment env = Environment::host();
- JitAllocator allocator;
-
-#ifndef ASMJIT_NO_LOGGING
- FileLogger logger(stdout);
- logger.setIndentation(FormatIndentationGroup::kCode, 2);
-#endif
-
- CodeHolder code;
- code.init(env);
-
-#ifndef ASMJIT_NO_LOGGING
- code.setLogger(&logger);
-#endif
-
- Section* dataSection;
- Error err = code.newSection(&dataSection, ".data", SIZE_MAX, SectionFlags::kNone, 8);
-
- if (err) {
- fail("Failed to create a .data section", err);
- }
- else {
- printf("Generating code:\n");
- x86::Assembler a(&code);
- x86::Gp idx = a.zax();
- x86::Gp addr = a.zcx();
-
- Label data = a.newLabel();
-
- FuncDetail func;
- func.init(FuncSignature::build<size_t, size_t>(), code.environment());
-
- FuncFrame frame;
- frame.init(func);
- frame.addDirtyRegs(idx, addr);
-
- FuncArgsAssignment args(&func);
- args.assignAll(idx);
- args.updateFuncFrame(frame);
- frame.finalize();
-
- a.emitProlog(frame);
- a.emitArgsAssignment(frame, args);
-
- a.lea(addr, x86::ptr(data));
- a.movzx(idx, x86::byte_ptr(addr, idx));
-
- a.emitEpilog(frame);
-
- a.section(dataSection);
- a.bind(data);
-
- a.embed(dataArray, sizeof(dataArray));
- }
-
- // Manually change he offsets of each section, start at 0. This code is very
- // similar to what `CodeHolder::flatten()` does, however, it's shown here
- // how to do it explicitly.
- printf("\nCalculating section offsets:\n");
- uint64_t offset = 0;
- for (Section* section : code.sectionsByOrder()) {
- offset = Support::alignUp(offset, section->alignment());
- section->setOffset(offset);
- offset += section->realSize();
-
- printf(" [0x%08X %s] {Id=%u Size=%u}\n",
- uint32_t(section->offset()),
- section->name(),
- section->id(),
- uint32_t(section->realSize()));
- }
- size_t codeSize = size_t(offset);
- printf(" Final code size: %zu\n", codeSize);
-
- // Resolve cross-section links (if any). On 32-bit X86 this is not necessary
- // as this is handled through relocations as the addressing is different.
- if (code.hasUnresolvedLinks()) {
- printf("\nResolving cross-section links:\n");
- printf(" Before 'resolveUnresolvedLinks()': %zu\n", code.unresolvedLinkCount());
-
- err = code.resolveUnresolvedLinks();
- if (err)
- fail("Failed to resolve cross-section links", err);
- printf(" After 'resolveUnresolvedLinks()': %zu\n", code.unresolvedLinkCount());
- }
-
- // Allocate memory for the function and relocate it there.
- JitAllocator::Span span;
- err = allocator.alloc(span, codeSize);
- if (err)
- fail("Failed to allocate executable memory", err);
-
- // Relocate to the base-address of the allocated memory.
- code.relocateToBase(uint64_t(uintptr_t(span.rx())));
-
- allocator.write(span, [&](JitAllocator::Span& span) noexcept -> Error {
- // Copy the flattened code into `mem.rw`. There are two ways. You can either copy
- // everything manually by iterating over all sections or use `copyFlattenedData`.
- // This code is similar to what `copyFlattenedData(p, codeSize, 0)` would do:
- for (Section* section : code.sectionsByOrder())
- memcpy(static_cast<uint8_t*>(span.rw()) + size_t(section->offset()), section->data(), section->bufferSize());
- return kErrorOk;
- });
-
- // Execute the function and test whether it works.
- typedef size_t (*Func)(size_t idx);
- Func fn = (Func)span.rx();
-
- printf("\n");
- if (fn(0) != dataArray[0] ||
- fn(3) != dataArray[3] ||
- fn(6) != dataArray[6] ||
- fn(9) != dataArray[9] ) {
- printf("** FAILURE: The generated function returned incorrect result(s) **\n");
- return 1;
- }
-
- printf("** SUCCESS **\n");
- return 0;
-}
-
-#else
-int main() {
- printf("AsmJit X86 Sections Test is disabled on non-x86 host or when compiled with ASMJIT_NO_JIT\n\n");
- return 0;
-}
-#endif // ASMJIT_ARCH_X86 && !ASMJIT_NO_X86 && !ASMJIT_NO_JIT
diff --git a/3rdparty/asmjit/test/asmjitutils.h b/3rdparty/asmjit/test/asmjitutils.h
deleted file mode 100644
index 288801538af..00000000000
--- a/3rdparty/asmjit/test/asmjitutils.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef ASMJITUTILS_H_INCLUDED
-#define ASMJITUTILS_H_INCLUDED
-
-#include <asmjit/core.h>
-
-namespace {
-
-ASMJIT_MAYBE_UNUSED
-static inline const char* asmjitArchAsString(asmjit::Arch arch) noexcept {
- switch (arch) {
- case asmjit::Arch::kX86 : return "X86";
- case asmjit::Arch::kX64 : return "X64";
-
- case asmjit::Arch::kRISCV32 : return "RISCV32";
- case asmjit::Arch::kRISCV64 : return "RISCV64";
-
- case asmjit::Arch::kARM : return "ARM";
- case asmjit::Arch::kAArch64 : return "AArch64";
- case asmjit::Arch::kThumb : return "Thumb";
-
- case asmjit::Arch::kMIPS32_LE : return "MIPS_LE";
- case asmjit::Arch::kMIPS64_LE : return "MIPS64_LE";
-
- case asmjit::Arch::kARM_BE : return "ARM_BE";
- case asmjit::Arch::kThumb_BE : return "Thumb_BE";
- case asmjit::Arch::kAArch64_BE: return "AArch64_BE";
-
- case asmjit::Arch::kMIPS32_BE : return "MIPS_BE";
- case asmjit::Arch::kMIPS64_BE : return "MIPS64_BE";
-
- default:
- return "<Unknown>";
- }
-}
-
-ASMJIT_MAYBE_UNUSED
-static inline void printIndented(const char* str, size_t indent) noexcept {
- const char* start = str;
- while (*str) {
- if (*str == '\n') {
- size_t size = (size_t)(str - start);
- printf("%*s%.*s\n", size ? int(indent) : 0, "", int(size), start);
- start = str + 1;
- }
- str++;
- }
-
- size_t size = (size_t)(str - start);
- if (size)
- printf("%*s%.*s\n", int(indent), "", int(size), start);
-}
-
-} // {anonymous}
-
-#endif // ASMJITUTILS_H_INCLUDED
diff --git a/3rdparty/asmjit/test/cmdline.h b/3rdparty/asmjit/test/cmdline.h
deleted file mode 100644
index 4da0d2ed559..00000000000
--- a/3rdparty/asmjit/test/cmdline.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef CMDLINE_H_INCLUDED
-#define CMDLINE_H_INCLUDED
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-class CmdLine {
-public:
- int _argc;
- const char* const* _argv;
-
- CmdLine(int argc, const char* const* argv)
- : _argc(argc),
- _argv(argv) {}
-
- bool hasArg(const char* key) const {
- for (int i = 1; i < _argc; i++)
- if (strcmp(key, _argv[i]) == 0)
- return true;
- return false;
- }
-
- const char* valueOf(const char* key, const char* defaultValue) const {
- size_t keySize = strlen(key);
- for (int i = 1; i < _argc; i++) {
- const char* val = _argv[i];
- if (strlen(val) >= keySize + 1 && val[keySize] == '=' && memcmp(val, key, keySize) == 0)
- return val + keySize + 1;
- }
-
- return defaultValue;
- }
-
- int valueAsInt(const char* key, int defaultValue) const {
- const char* val = valueOf(key, nullptr);
- if (val == nullptr || val[0] == '\0')
- return defaultValue;
-
- return atoi(val);
- }
-
- unsigned valueAsUInt(const char* key, unsigned defaultValue) const {
- const char* val = valueOf(key, nullptr);
- if (val == nullptr || val[0] == '\0')
- return defaultValue;
-
- int v = atoi(val);
- if (v < 0)
- return defaultValue;
- else
- return unsigned(v);
- }
-};
-
-#endif // CMDLINE_H_INCLUDED
diff --git a/3rdparty/asmjit/test/performancetimer.h b/3rdparty/asmjit/test/performancetimer.h
deleted file mode 100644
index c7a8ebe5d18..00000000000
--- a/3rdparty/asmjit/test/performancetimer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is part of AsmJit project <https://asmjit.com>
-//
-// See asmjit.h or LICENSE.md for license and copyright information
-// SPDX-License-Identifier: Zlib
-
-#ifndef PERFORMANCETIMER_H_INCLUDED
-#define PERFORMANCETIMER_H_INCLUDED
-
-#include <asmjit/core.h>
-#include <chrono>
-
-class PerformanceTimer {
-public:
- typedef std::chrono::high_resolution_clock::time_point TimePoint;
-
- TimePoint _startTime {};
- TimePoint _endTime {};
-
- inline void start() {
- _startTime = std::chrono::high_resolution_clock::now();
- }
-
- inline void stop() {
- _endTime = std::chrono::high_resolution_clock::now();
- }
-
- inline double duration() const {
- std::chrono::duration<double> elapsed = _endTime - _startTime;
- return elapsed.count() * 1000;
- }
-};
-
-#endif // PERFORMANCETIMER_H_INCLUDED
diff --git a/3rdparty/asmjit/tools/configure-makefiles.sh b/3rdparty/asmjit/tools/configure-makefiles.sh
deleted file mode 100644
index 69503dc28ef..00000000000
--- a/3rdparty/asmjit/tools/configure-makefiles.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-
-CURRENT_DIR="`pwd`"
-BUILD_DIR="${CURRENT_DIR}/../build"
-BUILD_OPTIONS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-
-echo "== [Configuring Build - Debug] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Debug" -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS}
-echo ""
-
-echo "== [Configuring Build - Release] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release" -DCMAKE_BUILD_TYPE=Release ${BUILD_OPTIONS}
-echo ""
diff --git a/3rdparty/asmjit/tools/configure-ninja.sh b/3rdparty/asmjit/tools/configure-ninja.sh
deleted file mode 100644
index 84808d24363..00000000000
--- a/3rdparty/asmjit/tools/configure-ninja.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-
-CURRENT_DIR="`pwd`"
-BUILD_DIR="${CURRENT_DIR}/../build"
-BUILD_OPTIONS="-G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-
-echo "== [Configuring Build - Debug] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Debug" -DCMAKE_BUILD_TYPE=Debug ${BUILD_OPTIONS}
-echo ""
-
-echo "== [Configuring Build - Release] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release" -DCMAKE_BUILD_TYPE=Release ${BUILD_OPTIONS}
-echo ""
diff --git a/3rdparty/asmjit/tools/configure-sanitizers.sh b/3rdparty/asmjit/tools/configure-sanitizers.sh
deleted file mode 100644
index d35b9a4cad3..00000000000
--- a/3rdparty/asmjit/tools/configure-sanitizers.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-
-CURRENT_DIR="`pwd`"
-BUILD_DIR="${CURRENT_DIR}/../build"
-BUILD_OPTIONS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-
-echo "== [Configuring Build - Release_ASAN] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_ASAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=address
-echo ""
-
-echo "== [Configuring Build - Release_UBSAN] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_UBSAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=undefined
-echo ""
-
-echo "== [Configuring Build - Release_MSAN] =="
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}/Release_MSAN" ${BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DASMJIT_SANITIZE=memory
-echo ""
diff --git a/3rdparty/asmjit/tools/configure-vs2019-x64.bat b/3rdparty/asmjit/tools/configure-vs2019-x64.bat
deleted file mode 100644
index 05bc31e4fc4..00000000000
--- a/3rdparty/asmjit/tools/configure-vs2019-x64.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-cmake .. -B "..\build_vs2019_x64" -G"Visual Studio 16" -A x64 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-vs2019-x86.bat b/3rdparty/asmjit/tools/configure-vs2019-x86.bat
deleted file mode 100644
index a0e266395a4..00000000000
--- a/3rdparty/asmjit/tools/configure-vs2019-x86.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-cmake .. -B "..\build_vs2019_x86" -G"Visual Studio 16" -A Win32 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-vs2022-x64.bat b/3rdparty/asmjit/tools/configure-vs2022-x64.bat
deleted file mode 100644
index b33f5411de5..00000000000
--- a/3rdparty/asmjit/tools/configure-vs2022-x64.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-cmake .. -B "..\build_vs2022_x64" -G"Visual Studio 17" -A x64 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-vs2022-x86.bat b/3rdparty/asmjit/tools/configure-vs2022-x86.bat
deleted file mode 100644
index 0ba350531d9..00000000000
--- a/3rdparty/asmjit/tools/configure-vs2022-x86.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-cmake .. -B "..\build_vs2022_x86" -G"Visual Studio 17" -A Win32 -DASMJIT_TEST=1
diff --git a/3rdparty/asmjit/tools/configure-xcode.sh b/3rdparty/asmjit/tools/configure-xcode.sh
deleted file mode 100644
index d9c7d983d75..00000000000
--- a/3rdparty/asmjit/tools/configure-xcode.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-CURRENT_DIR="`pwd`"
-BUILD_DIR="${CURRENT_DIR}/../build"
-BUILD_OPTIONS="-G Xcode -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DASMJIT_TEST=1"
-
-mkdir -p "${BUILD_DIR}"
-eval cmake "${CURRENT_DIR}/.." -B "${BUILD_DIR}" ${BUILD_OPTIONS}
diff --git a/3rdparty/asmjit/tools/enumgen.js b/3rdparty/asmjit/tools/enumgen.js
index b9d57e3dac9..3823b803d88 100644
--- a/3rdparty/asmjit/tools/enumgen.js
+++ b/3rdparty/asmjit/tools/enumgen.js
@@ -3,8 +3,6 @@
const fs = require("fs");
const path = require("path");
-const hasOwn = Object.prototype.hasOwnProperty;
-
// ============================================================================
// [Tokenizer]
// ============================================================================
@@ -82,7 +80,6 @@ class Tokenizer {
function parseEnum(input) {
const map = Object.create(null);
- const hasOwn = Object.prototype.hasOwnProperty;
const tokenizer = new Tokenizer(input, tokenizerPatterns);
var value = -1;
@@ -105,7 +102,7 @@ function parseEnum(input) {
value++;
}
- if (!hasOwn.call(map, symbol))
+ if (!Object.hasOwn(map, symbol))
map[symbol] = value;
else
console.log(`${symbol} already defined, skipping...`);
@@ -173,7 +170,7 @@ function stringifyEnum(map, options) {
if (name.startsWith(stripPrefix))
name = name.substring(stripPrefix.length);
else
- throw Error(`Cannot strip prefix '${stripPrefix}' in '${key}'`);
+ throw Error(`Cannot strip prefix '${stripPrefix}' in '${k}'`);
}
table.push({ name: name, value: map[k] });
@@ -231,8 +228,8 @@ function stringifyEnum(map, options) {
return s;
}
- output += `static const char ${outputPrefix}String[] =\n` + buildStringData() + `\n`;
- output += `static const ${indexType} ${outputPrefix}Index[] = {\n` + buildIndexData() + `};\n`;
+ output += `static const char ${outputPrefix}_data[] =\n` + buildStringData() + `\n`;
+ output += `static const ${indexType} ${outputPrefix}_index[] = {\n` + buildIndexData() + `};\n`;
return output;
}
@@ -336,7 +333,7 @@ class Generator {
if (!enumName)
throw Error(`Missing 'enum' in '${def[0]}`);
- if (hasOwn.call(this.enumMap, enumName))
+ if (Object.hasOwn(this.enumMap, enumName))
throw new Error(`Enumeration '${enumName}' is already defined`);
const startIndex = src.lastIndexOf("\n", def.index) + 1;
@@ -378,7 +375,7 @@ class Generator {
if (!enumName)
throwError(`Missing 'name' in '${def[0]}`);
- if (!hasOwn.call(this.enumMap, enumName))
+ if (!Object.hasOwn(this.enumMap, enumName))
throw new Error(`Enumeration '${enumName}' not found`);
console.log(` Injecting Enum: ${enumName}`);
@@ -408,7 +405,7 @@ class Generator {
}
const generator = new Generator({
- baseDir : path.resolve(__dirname, "../src"),
+ baseDir : path.resolve(__dirname, ".."),
verify : process.argv.indexOf("--verify") !== -1,
noBackup: process.argv.indexOf("--no-backup") !== -1
});
diff --git a/3rdparty/asmjit/tools/enumgen.sh b/3rdparty/asmjit/tools/enumgen.sh
index 4783db2449d..4783db2449d 100644..100755
--- a/3rdparty/asmjit/tools/enumgen.sh
+++ b/3rdparty/asmjit/tools/enumgen.sh
diff --git a/3rdparty/asmjit/tools/generator-commons.js b/3rdparty/asmjit/tools/generator-commons.js
index eb3a0721ccc..45eec3b2bf6 100644
--- a/3rdparty/asmjit/tools/generator-commons.js
+++ b/3rdparty/asmjit/tools/generator-commons.js
@@ -1,9 +1,8 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
-const hasOwn = Object.prototype.hasOwnProperty;
function nop(x) { return x; }
// Generator - Constants
@@ -93,11 +92,11 @@ class ObjectUtils {
return a === b;
for (let k in a)
- if (!hasOwn.call(b, k) || !ObjectUtils.equals(a[k], b[k]))
+ if (!Object.hasOwn(b, k) || !ObjectUtils.equals(a[k], b[k]))
return false;
for (let k in b)
- if (!hasOwn.call(a, k))
+ if (!Object.hasOwn(a, k))
return false;
}
@@ -112,11 +111,11 @@ class ObjectUtils {
return ObjectUtils.equals(a, b);
for (let k in a)
- if (!hasOwn.call(except, k) && (!hasOwn.call(b, k) || !ObjectUtils.equals(a[k], b[k])))
+ if (!Object.hasOwn(except, k) && (!Object.hasOwn(b, k) || !ObjectUtils.equals(a[k], b[k])))
return false;
for (let k in b)
- if (!hasOwn.call(except, k) && !hasOwn.call(a, k))
+ if (!Object.hasOwn(except, k) && !Object.hasOwn(a, k))
return false;
return true;
@@ -124,14 +123,14 @@ class ObjectUtils {
static findKey(map, keys) {
for (let key in keys)
- if (hasOwn.call(map, key))
+ if (Object.hasOwn(map, key))
return key;
return undefined;
}
static hasAny(map, keys) {
for (let key in keys)
- if (hasOwn.call(map, key))
+ if (Object.hasOwn(map, key))
return true;
return false;
}
@@ -139,15 +138,15 @@ class ObjectUtils {
static and(a, b) {
const out = Object.create(null);
for (let k in a)
- if (hasOwn.call(b, k))
+ if (Object.hasOwn(b, k))
out[k] = true;
return out;
}
static xor(a, b) {
const out = Object.create(null);
- for (let k in a) if (!hasOwn.call(b, k)) out[k] = true;
- for (let k in b) if (!hasOwn.call(a, k)) out[k] = true;
+ for (let k in a) if (!Object.hasOwn(b, k)) out[k] = true;
+ for (let k in b) if (!Object.hasOwn(a, k)) out[k] = true;
return out;
}
}
@@ -215,6 +214,9 @@ exports.ArrayUtils = ArrayUtils;
class StringUtils {
static asString(x) { return String(x); }
+ static makeEnumName(name) {
+ return name ? name.charAt(0).toUpperCase() + name.substring(1) : "";
+ }
static countOf(s, pattern) {
if (!pattern)
FATAL(`Pattern cannot be empty`);
@@ -421,8 +423,8 @@ class StringUtils {
priorityArray.forEach((str, index) => { map[str] = index; });
return function(a, b) {
- const ax = hasOwn.call(map, a) ? map[a] : Infinity;
- const bx = hasOwn.call(map, b) ? map[b] : Infinity;
+ const ax = Object.hasOwn(map, a) ? map[a] : Infinity;
+ const bx = Object.hasOwn(map, b) ? map[b] : Infinity;
return ax != bx ? ax - bx : a < b ? -1 : a > b ? 1 : 0;
}
}
@@ -481,7 +483,7 @@ exports.IndexedArray = IndexedArray;
// a) static const char* const* instNames = { "add", "mov", "vpunpcklbw" };
//
// b) static const char instNames[] = { "add\0" "mov\0" "vpunpcklbw\0" };
-// static const uint16_t instNameIndex[] = { 0, 4, 8 };
+// static const uint16_t _inst_name_index[] = { 0, 4, 8 };
//
// The latter (b) has an advantage that it doesn't have to be relocated by the linker, which saves
// a lot of space in the resulting binary and a lot of CPU cycles (and memory) when the linker loads
@@ -513,8 +515,8 @@ class IndexedString {
}
else {
for (i = 0, len = k.length; i < len; i++) {
- kp = k.substr(i);
- if (!hasOwn.call(partialMap, kp) || partialMap[kp].length < len)
+ kp = k.substring(i);
+ if (!Object.hasOwn(partialMap, kp) || partialMap[kp].length < len)
partialMap[kp] = k;
}
}
@@ -583,7 +585,7 @@ class IndexedString {
if (this.size === -1)
FATAL(`IndexedString.getIndex(): Not indexed yet, call index()`);
- if (!hasOwn.call(this.map, k))
+ if (!Object.hasOwn(this.map, k))
FATAL(`IndexedString.getIndex(): Key '${k}' not found.`);
return this.map[k];
diff --git a/3rdparty/asmjit/tools/generator-cxx.js b/3rdparty/asmjit/tools/generator-cxx.js
index b1b1d946cae..7ab71c10810 100644
--- a/3rdparty/asmjit/tools/generator-cxx.js
+++ b/3rdparty/asmjit/tools/generator-cxx.js
@@ -1,6 +1,6 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
// C++ code generation helpers.
@@ -9,7 +9,7 @@ const FATAL = commons.FATAL;
// Utilities to convert primitives to C++ code.
class Utils {
- static toHex(val, pad) {
+ static toHexRaw(val, pad) {
if (val < 0)
val = 0xFFFFFFFF + val + 1;
@@ -17,7 +17,11 @@ class Utils {
if (pad != null && s.length < pad)
s = "0".repeat(pad - s.length) + s;
- return "0x" + s.toUpperCase();
+ return s.toUpperCase();
+ }
+
+ static toHex(val, pad) {
+ return "0x" + Utils.toHexRaw(val, pad);
}
static capitalize(s) {
diff --git a/3rdparty/asmjit/tools/tablegen-a64.js b/3rdparty/asmjit/tools/tablegen-a64.js
index 1466fc63b01..363a47da364 100644
--- a/3rdparty/asmjit/tools/tablegen-a64.js
+++ b/3rdparty/asmjit/tools/tablegen-a64.js
@@ -1,13 +1,12 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
"use strict";
const core = require("./tablegen.js");
const commons = require("./generator-commons.js");
-const hasOwn = Object.prototype.hasOwnProperty;
const asmdb = core.asmdb;
const kIndent = commons.kIndent;
@@ -84,7 +83,7 @@ class ArmTableGen extends core.TableGen {
// --------------------------------------------------------------------------
parse() {
- const rawData = this.dataOfFile("src/asmjit/arm/a64instdb.cpp");
+ const rawData = this.dataOfFile("asmjit/arm/a64instdb.cpp");
const stringData = StringUtils.extract(rawData, "// ${InstInfo:Begin}", "// ${InstInfo:End");
const re = new RegExp(
@@ -132,8 +131,8 @@ class ArmTableGen extends core.TableGen {
var m;
while ((m = re.exec(stringData)) !== null) {
- var enum_ = m[1];
- var name = enum_ === "None" ? "" : enum_.toLowerCase();
+ var enumName = m[1];
+ var name = enumName === "None" ? "" : enumName.toLowerCase();
var encoding = m[2].trim();
var opcodeData = m[3].trim();
var rwInfo = m[4].trim();
@@ -149,11 +148,11 @@ class ArmTableGen extends core.TableGen {
encodingDataIndex === "encodingDataIndex")
continue;
- this.addInst({
+ this.addInstruction({
id : 0, // Instruction id (numeric value).
name : name, // Instruction name.
displayName : displayName, // Instruction name to display.
- enum : enum_, // Instruction enum without `kId` prefix.
+ enum : enumName, // Instruction enum without `kId` prefix.
encoding : encoding, // Opcode encoding.
opcodeData : opcodeData, // Opcode data.
opcodeDataIndex : -1, // Opcode data index.
@@ -187,11 +186,11 @@ class ArmTableGen extends core.TableGen {
onBeforeRun() {
this.load([
- "src/asmjit/arm/a64emitter.h",
- "src/asmjit/arm/a64globals.h",
- "src/asmjit/arm/a64instdb.cpp",
- "src/asmjit/arm/a64instdb.h",
- "src/asmjit/arm/a64instdb_p.h"
+ "asmjit/arm/a64emitter.h",
+ "asmjit/arm/a64globals.h",
+ "asmjit/arm/a64instdb.cpp",
+ "asmjit/arm/a64instdb.h",
+ "asmjit/arm/a64instdb_p.h"
]);
this.parse();
}
@@ -258,7 +257,7 @@ class EncodingTable extends core.Task {
const encoding = inst.encoding;
const opcodeData = inst.opcodeData.replace(/\(/g, "{ ").replace(/\)/g, " }");
- if (!hasOwn.call(map, encoding))
+ if (!Object.hasOwn(map, encoding))
map[encoding] = [];
if (inst.opcodeData === "(_)") {
diff --git a/3rdparty/asmjit/tools/tablegen-a64.sh b/3rdparty/asmjit/tools/tablegen-a64.sh
index 2cbd85ece16..2cbd85ece16 100644..100755
--- a/3rdparty/asmjit/tools/tablegen-a64.sh
+++ b/3rdparty/asmjit/tools/tablegen-a64.sh
diff --git a/3rdparty/asmjit/tools/tablegen-x86.js b/3rdparty/asmjit/tools/tablegen-x86.js
index 377a71045e7..e58328e52b4 100644
--- a/3rdparty/asmjit/tools/tablegen-x86.js
+++ b/3rdparty/asmjit/tools/tablegen-x86.js
@@ -1,6 +1,6 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
"use strict";
@@ -22,9 +22,7 @@ const IndexedArray = commons.IndexedArray;
const ObjectUtils = commons.ObjectUtils;
const StringUtils = commons.StringUtils;
-const hasOwn = Object.prototype.hasOwnProperty;
const disclaimer = StringUtils.disclaimer;
-
const decToHex = StringUtils.decToHex;
function readJSON(fileName) {
@@ -50,7 +48,7 @@ class Filter {
const result = [];
const known = {};
- for (var i = 0; i < instArray.length; i++) {
+ for (let i = 0; i < instArray.length; i++) {
const inst = instArray[i];
if (inst.altForm)
continue;
@@ -68,9 +66,9 @@ class Filter {
static noAltForm(instArray) {
const result = [];
- for (var i = 0; i < instArray.length; i++) {
+ for (let i = 0; i < instArray.length; i++) {
const inst = instArray[i];
- if (inst.altForm)
+ if (inst.alt)
continue;
result.push(inst);
}
@@ -109,11 +107,11 @@ const VexToEvexMap = {
class GenUtils {
static cpuArchOf(dbInsts) {
- var anyArch = false;
- var x86Arch = false;
- var x64Arch = false;
+ let anyArch = false;
+ let x86Arch = false;
+ let x64Arch = false;
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
if (dbInst.arch === "ANY") anyArch = true;
if (dbInst.arch === "X86") x86Arch = true;
@@ -203,16 +201,15 @@ class GenUtils {
static flagsOf(dbInsts) {
const f = Object.create(null);
- var i, j;
- var mib = dbInsts.length > 0 && /^(?:bndldx|bndstx)$/.test(dbInsts[0].name);
+ let mib = dbInsts.length > 0 && /^(?:bndldx|bndstx)$/.test(dbInsts[0].name);
if (mib)
f.Mib = true;
- var mmx = false;
- var vec = false;
+ let mmx = false;
+ let vec = false;
- for (i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
@@ -222,7 +219,7 @@ class GenUtils {
if (dbInst.name === "vzeroall" || dbInst.name === "vzeroupper")
vec = true;
- for (j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (op.reg === "mm")
mmx = true;
@@ -235,7 +232,7 @@ class GenUtils {
if (mmx) f.Mmx = true;
if (vec) f.Vec = true;
- for (i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
@@ -249,7 +246,7 @@ class GenUtils {
if (dbInst.k === "zeroing" ) f.Avx512ImplicitZ = true;
if (dbInst.category.FPU) {
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (op.memSize === 16) f.FpuM16 = true;
if (op.memSize === 32) f.FpuM32 = true;
@@ -296,7 +293,7 @@ class GenUtils {
}
static eqOps(aOps, aFrom, bOps, bFrom) {
- var x = 0;
+ let x = 0;
for (;;) {
const aIndex = x + aFrom;
const bIndex = x + bFrom;
@@ -462,7 +459,9 @@ class X86TableGen extends core.TableGen {
// Get instructions (dbInsts) having the same name as understood by AsmJit.
query(name) {
- return x86isa.query(name);
+ return x86isa.query({ name: name, filter: function(inst) {
+ return !inst.ext.APX_F && !inst.ext.AVX10_1 && !inst.ext.AVX10_2;
+ }});
}
// --------------------------------------------------------------------------
@@ -470,7 +469,7 @@ class X86TableGen extends core.TableGen {
// --------------------------------------------------------------------------
parse() {
- const data = this.dataOfFile("src/asmjit/x86/x86instdb.cpp");
+ const data = this.dataOfFile("asmjit/x86/x86instdb.cpp");
const re = new RegExp(
"INST\\(" +
"([A-Za-z0-9_]+)\\s*" + "," + // [01] Instruction.
@@ -484,13 +483,13 @@ class X86TableGen extends core.TableGen {
"([^\\)]+)" + "\\)", // [08] OperationDataIndex.
"g");
- var m;
+ let m;
while ((m = re.exec(data)) !== null) {
- var enum_ = m[1];
- var name = enum_ === "None" ? "" : enum_.toLowerCase();
- var encoding = m[2].trim();
- var opcode0 = m[3].trim();
- var opcode1 = m[4].trim();
+ let enum_ = m[1];
+ let name = enum_ === "None" ? "" : enum_.toLowerCase();
+ let encoding = m[2].trim();
+ let opcode0 = m[3].trim();
+ let opcode1 = m[4].trim();
const dbInsts = this.query(name);
if (name && !dbInsts.length)
@@ -500,7 +499,9 @@ class X86TableGen extends core.TableGen {
const controlFlow = GenUtils.controlFlow(dbInsts);
const singleRegCase = GenUtils.singleRegCase(name);
- this.addInst({
+ const aliasData = x86isa.aliasData(name);
+
+ this.addInstruction({
id : 0, // Instruction id (numeric value).
name : name, // Instruction name.
displayName : name, // Instruction name to display.
@@ -514,9 +515,11 @@ class X86TableGen extends core.TableGen {
controlFlow : controlFlow,
singleRegCase : singleRegCase,
+ aliases : aliasData,
+
mainOpcodeValue : -1, // Main opcode value (0.255 hex).
- mainOpcodeIndex : -1, // Index to InstDB::_mainOpcodeTable.
- altOpcodeIndex : -1, // Index to InstDB::_altOpcodeTable.
+ mainOpcodeIndex : -1, // Index to InstDB::main_opcode_table.
+ altOpcodeIndex : -1, // Index to InstDB::alt_opcode_table.
nameIndex : -1, // Index to InstDB::_nameData.
commonInfoIndex : -1,
additionalInfoIndex: -1,
@@ -533,7 +536,7 @@ class X86TableGen extends core.TableGen {
}
merge() {
- var s = StringUtils.format(this.insts, "", true, function(inst) {
+ let s = StringUtils.format(this.insts, "", true, function(inst) {
return "INST(" +
String(inst.enum ).padEnd(17) + ", " +
String(inst.encoding ).padEnd(19) + ", " +
@@ -563,12 +566,12 @@ class X86TableGen extends core.TableGen {
"wait" // Maps to `fwait`, which AsmJit uses instead.
]);
- var out = "";
+ let out = "";
x86isa.instructionNames.forEach(function(name) {
- var dbInsts = x86isa.query(name);
+ let dbInsts = x86isa.query(name);
if (!this.instMap[name] && ignored[name] !== true) {
console.log(`MISSING INSTRUCTION '${name}'`);
- var inst = this.newInstFromGroup(dbInsts);
+ let inst = this.newInstFromGroup(dbInsts);
if (inst) {
out += " INST(" +
String(inst.enum ).padEnd(17) + ", " +
@@ -593,10 +596,10 @@ class X86TableGen extends core.TableGen {
}
function GetAccess(dbInst) {
- var operands = dbInst.operands;
+ let operands = dbInst.operands;
if (!operands.length) return "";
- var op = operands[0];
+ let op = operands[0];
if (op.read && op.write)
return "RW";
else if (op.read)
@@ -618,8 +621,8 @@ class X86TableGen extends core.TableGen {
for (let j = 0; j < dbi.operands.length; j++) {
s += ", ";
const op = dbi.operands[j];
- var reg = op.reg;
- var mem = op.mem;
+ let reg = op.reg;
+ let mem = op.mem;
if (op.isReg() && op.isMem()) {
if (choice == 0) mem = null;
@@ -653,27 +656,27 @@ class X86TableGen extends core.TableGen {
return results;
}
- var dbi = dbInsts[0];
+ let dbi = dbInsts[0];
- var id = this.insts.length;
- var name = dbi.name;
- var enum_ = name[0].toUpperCase() + name.substr(1);
+ let id = this.insts.length;
+ let name = dbi.name;
+ let enum_ = name[0].toUpperCase() + name.substr(1);
- var opcode = dbi.opcodeHex;
- var modR = dbi.modR;
- var mm = dbi.mm;
- var pp = dbi.pp;
- var encoding = dbi.encoding;
- var isVec = isVecPrefix(dbi.prefix);
- var evexCount = 0;
+ let opcode = dbi.opcode.byte;
+ let modR = dbi.opcode.modr;
+ let mm = dbi.opcode.mm;
+ let pp = dbi.opcode.pp;
+ let encoding = dbi.encoding;
+ let isVec = isVecPrefix(dbi.prefix);
+ let evexCount = 0;
- var access = GetAccess(dbi);
+ let access = GetAccess(dbi);
- var vexL = undefined;
- var vexW = undefined;
- var evexW = undefined;
- var cdshl = "_";
- var tupleType = "_";
+ let vexL = undefined;
+ let vexW = undefined;
+ let evexW = undefined;
+ let cdshl = "_";
+ let tupleType = "_";
const tupleTypeToCDSHL = {
"FVM": "4",
@@ -687,12 +690,12 @@ class X86TableGen extends core.TableGen {
const emitMap = {};
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
dbi = dbInsts[i];
if (dbi.prefix === "VEX" || dbi.prefix === "XOP") {
- var newVexL = String(dbi.l === "128" ? 0 : dbi.l === "256" ? 1 : dbi.l === "512" ? 2 : "_");
- var newVexW = String(dbi.w === "W0" ? 0 : dbi.w === "W1" ? 1 : "_");
+ let newVexL = String(dbi.opcode.l === "128" ? 0 : dbi.opcode.l === "256" ? 1 : dbi.opcode.l === "512" ? 2 : "_");
+ let newVexW = String(dbi.opcode.w === "W0" ? 0 : dbi.opcode.w === "W1" ? 1 : "_");
if (vexL !== undefined && vexL !== newVexL)
vexL = "x";
@@ -706,7 +709,7 @@ class X86TableGen extends core.TableGen {
if (dbi.prefix === "EVEX") {
evexCount++;
- var newEvexW = String(dbi.w === "W0" ? 0 : dbi.w === "W1" ? 1 : "_");
+ let newEvexW = String(dbi.opcode.w === "W0" ? 0 : dbi.opcode.w === "W1" ? 1 : "_");
if (evexW !== undefined && evexW !== newEvexW)
evexW = "x";
else
@@ -721,12 +724,12 @@ class X86TableGen extends core.TableGen {
}
}
- if (opcode !== dbi.opcodeHex ) { console.log(`${dbi.name}: ISSUE: Opcode ${opcode} != ${dbi.opcodeHex}`); return null; }
- if (modR !== dbi.modR ) { console.log(`${dbi.name}: ISSUE: ModR ${modR} != ${dbi.modR}`); return null; }
- if (mm !== dbi.mm ) { console.log(`${dbi.name}: ISSUE: MM ${mm} != ${dbi.mm}`); return null; }
- if (pp !== dbi.pp ) { console.log(`${dbi.name}: ISSUE: PP ${pp} != ${dbi.pp}`); return null; }
- if (encoding !== dbi.encoding ) { console.log(`${dbi.name}: ISSUE: Enc ${encoding} != ${dbi.encoding}`); return null; }
- if (access !== GetAccess(dbi)) { console.log(`${dbi.name}: ISSUE: Access ${access} != ${GetAccess(dbi)}`); return null; }
+ if (opcode !== dbi.opcode.byte) { console.log(`${dbi.name}: ISSUE: Opcode ${opcode} != ${dbi.opcode.byte}`); return null; }
+ if (modR !== dbi.opcode.modr) { console.log(`${dbi.name}: ISSUE: ModR ${modR} != ${dbi.opcode.modr}`); return null; }
+ if (mm !== dbi.opcode.mm ) { console.log(`${dbi.name}: ISSUE: MM ${mm} != ${dbi.opcode.mm}`); return null; }
+ if (pp !== dbi.opcode.pp ) { console.log(`${dbi.name}: ISSUE: PP ${pp} != ${dbi.opcode.pp}`); return null; }
+ if (encoding !== dbi.encoding ) { console.log(`${dbi.name}: ISSUE: Enc ${encoding} != ${dbi.encoding}`); return null; }
+ if (access !== GetAccess(dbi) ) { console.log(`${dbi.name}: ISSUE: Access ${access} != ${GetAccess(dbi)}`); return null; }
if (isVec != isVecPrefix(dbi.prefix)) { console.log(`${dbi.name}: ISSUE: Vex/Non-Vex mismatch`); return null; }
formatEmit(dbi).forEach((emit) => {
@@ -740,10 +743,10 @@ class X86TableGen extends core.TableGen {
if (tupleType !== "_")
cdshl = tupleTypeToCDSHL[tupleType] || "?";
- var ppmm = pp.padEnd(2).replace(/ /g, "0") +
+ let ppmm = pp.padEnd(2).replace(/ /g, "0") +
mm.padEnd(4).replace(/ /g, "0") ;
- var composed = composeOpCode({
+ let composed = composeOpCode({
type : evexCount == dbInsts.length ? "E" : isVec ? "V" : "O",
prefix: ppmm,
opcode: opcode,
@@ -774,10 +777,10 @@ class X86TableGen extends core.TableGen {
onBeforeRun() {
this.load([
- "src/asmjit/x86/x86globals.h",
- "src/asmjit/x86/x86instdb.cpp",
- "src/asmjit/x86/x86instdb.h",
- "src/asmjit/x86/x86instdb_p.h"
+ "asmjit/x86/x86globals.h",
+ "asmjit/x86/x86instdb.cpp",
+ "asmjit/x86/x86instdb.h",
+ "asmjit/x86/x86instdb_p.h"
]);
this.parse();
}
@@ -804,11 +807,11 @@ class IdEnum extends core.IdEnum {
return features.filter(function(item) { return /^(AVX|FMA)/.test(item) === avx; });
}
- var dbInsts = inst.dbInsts;
+ let dbInsts = inst.dbInsts;
if (!dbInsts.length) return "Invalid instruction id.";
- var text = "";
- var features = GenUtils.cpuFeaturesOf(dbInsts);
+ let text = "";
+ let features = GenUtils.cpuFeaturesOf(dbInsts);
const priorityFeatures = ["AVX_VNNI", "AVX_VNNI_INT8", "AVX_IFMA", "AVX_NE_CONVERT"];
@@ -840,7 +843,7 @@ class IdEnum extends core.IdEnum {
text += "}";
}
- var arch = GenUtils.cpuArchOf(dbInsts);
+ let arch = GenUtils.cpuArchOf(dbInsts);
if (arch)
text += (text ? " " : "") + arch;
@@ -854,7 +857,7 @@ class IdEnum extends core.IdEnum {
class NameTable extends core.NameTable {
constructor() {
- super("NameTable");
+ super("NameTable", null, true);
}
}
@@ -934,7 +937,7 @@ class AltOpcodeTable extends core.Task {
if (opcode === "0")
return ["00", 0];
- var opcodeByte = "";
+ let opcodeByte = "";
const components = normalizeOpcodeComponents(splitOpcodeToComponents(opcode));
if (components[0] === "O_FPU") {
@@ -974,11 +977,11 @@ class AltOpcodeTable extends core.Task {
// console.log(StringUtils.format(mainOpcodeTable, kIndent, true));
this.inject("MainOpcodeTable",
- disclaimer(`const uint32_t InstDB::_mainOpcodeTable[] = {\n${StringUtils.format(mainOpcodeTable, kIndent, true)}\n};\n`),
+ disclaimer(`const uint32_t InstDB::main_opcode_table[] = {\n${StringUtils.format(mainOpcodeTable, kIndent, true)}\n};\n`),
mainOpcodeTable.length * 4);
this.inject("AltOpcodeTable",
- disclaimer(`const uint32_t InstDB::_altOpcodeTable[] = {\n${StringUtils.format(altOpcodeTable, kIndent, true)}\n};\n`),
+ disclaimer(`const uint32_t InstDB::alt_opcode_table[] = {\n${StringUtils.format(altOpcodeTable, kIndent, true)}\n};\n`),
altOpcodeTable.length * 4);
}
}
@@ -1006,13 +1009,13 @@ const cmpOp = StringUtils.makePriorityCompare([
]);
function StringifyOpArray(a, map) {
- var s = "";
- for (var i = 0; i < a.length; i++) {
+ let s = "";
+ for (let i = 0; i < a.length; i++) {
const op = a[i];
- var mapped = null;
+ let mapped = null;
if (typeof map === "function")
mapped = map(op);
- else if (hasOwn.call(map, op))
+ else if (Object.hasOwn(map, op))
mapped = map[op];
else
FATAL(`UNHANDLED OPERAND '${op}'`);
@@ -1039,11 +1042,10 @@ class OSignature {
const af = this.flags;
const bf = other.flags;
- var k;
- var indexKind = "";
- var hasReg = false;
+ let hasReg = false;
+ let indexKind = "";
- for (k in af) {
+ for (let k in af) {
const index = asmdb.x86.Utils.regIndexOf(k);
const kind = asmdb.x86.Utils.regKindOf(k);
@@ -1055,7 +1057,7 @@ class OSignature {
}
if (hasReg) {
- for (k in bf) {
+ for (let k in bf) {
const index = asmdb.x86.Utils.regIndexOf(k);
if (index !== null && index !== -1) {
const kind = asmdb.x86.Utils.regKindOf(k);
@@ -1066,20 +1068,20 @@ class OSignature {
}
// Can merge...
- for (k in bf)
+ for (let k in bf)
af[k] = true;
return true;
}
toString() {
- var s = "";
- var flags = this.flags;
+ let s = "";
+ let flags = this.flags;
- for (var k in flags) {
+ for (let k in flags) {
if (k === "read" || k === "write" || k === "implicit" || k === "memDS" || k === "memES")
continue;
- var x = k;
+ let x = k;
if (x === "memZAX") x = "zax";
if (x === "memZDI") x = "zdi";
if (x === "memZSI") x = "zsi";
@@ -1096,10 +1098,10 @@ class OSignature {
}
toAsmJitOpData() {
- var opFlags = Object.create(null);
- var regMask = 0;
+ let opFlags = Object.create(null);
+ let regMask = 0;
- for (var k in this.flags) {
+ for (let k in this.flags) {
switch (k) {
case "r8lo" : opFlags.RegGpbLo = true; break;
case "r8hi" : opFlags.RegGpbHi = true; break;
@@ -1223,7 +1225,7 @@ class ISignature extends Array {
const len = this.length;
if (len !== other.length) return false;
- for (var i = 0; i < len; i++)
+ for (let i = 0; i < len; i++)
if (!this[i].equals(other[i]))
return false;
@@ -1239,8 +1241,9 @@ class ISignature extends Array {
// ok = true;
// It's not ok if both signatures have different number of implicit operands.
- if (!sameArch || this.implicit !== other.implicit)
+ if (!sameArch || this.implicit !== other.implicit) {
return false;
+ }
// It's not ok if both signatures have different number of operands.
const len = this.length;
@@ -1250,7 +1253,8 @@ class ISignature extends Array {
let xorIndex = -1;
for (let i = 0; i < len; i++) {
const xor = this[i].xor(other[i]);
- if (xor === null) continue;
+ if (xor === null)
+ continue;
if (xorIndex === -1)
xorIndex = i;
@@ -1258,7 +1262,7 @@ class ISignature extends Array {
return false;
}
- // Bail if mergeWidth at operand-level failed.
+ // Bail if mergeWith at operand-level failed.
if (xorIndex === -1 || !this[xorIndex].mergeWith(other[xorIndex]))
return false;
@@ -1271,12 +1275,16 @@ class ISignature extends Array {
}
class SignatureArray extends Array {
+ constructor(instructionName) {
+ super();
+ this.instructionName = instructionName;
+ }
// Iterate over all signatures and check which operands don't need explicit memory size.
calcImplicitMemSize(instName) {
// Calculates a hash-value (aka key) of all register operands specified by `regOps` in `inst`.
function keyOf(inst, regOps) {
- var s = "";
- for (var i = 0; i < inst.length; i++) {
+ let s = "";
+ for (let i = 0; i < inst.length; i++) {
const op = inst[i];
if (regOps & (1 << i))
s += "{" + ArrayUtils.sorted(ObjectUtils.and(op.flags, RegOp)).join("|") + "}";
@@ -1284,19 +1292,16 @@ class SignatureArray extends Array {
return s || "?";
}
- var i;
- var aIndex, bIndex;
-
- for (aIndex = 0; aIndex < this.length; aIndex++) {
+ for (let aIndex = 0; aIndex < this.length; aIndex++) {
const aInst = this[aIndex];
const len = aInst.length;
- var memOp = "";
- var memPos = -1;
- var regOps = 0;
+ let memOp = "";
+ let memPos = -1;
+ let regOps = 0;
// Check if this instruction signature has a memory operand of explicit size.
- for (i = 0; i < len; i++) {
+ for (let i = 0; i < len; i++) {
const aOp = aInst[i];
const mem = ObjectUtils.findKey(aOp.flags, MemOp);
@@ -1328,12 +1333,12 @@ class SignatureArray extends Array {
const diffSizeSet = [];
const diffSizeHash = Object.create(null);
- for (bIndex = 0; bIndex < this.length; bIndex++) {
+ for (let bIndex = 0; bIndex < this.length; bIndex++) {
const bInst = this[bIndex];
if (aIndex === bIndex || len !== bInst.length) continue;
- var hasMatch = 1;
- for (i = 0; i < len; i++) {
+ let hasMatch = 1;
+ for (let i = 0; i < len; i++) {
if (i === memPos) continue;
const reg = ObjectUtils.hasAny(bInst[i].flags, RegOp);
@@ -1368,14 +1373,14 @@ class SignatureArray extends Array {
//
// B) The memory operand has implicit-size if `diffSizeSet` contains different
// register signatures than `sameSizeSet`.
- var implicit = true;
+ let implicit = true;
if (!diffSizeSet.length) {
// Case A:
}
else {
// Case B: Find collisions in `sameSizeSet` and `diffSizeSet`.
- for (bIndex = 0; bIndex < sameSizeSet.length; bIndex++) {
+ for (let bIndex = 0; bIndex < sameSizeSet.length; bIndex++) {
const bInst = sameSizeSet[bIndex];
const key = keyOf(bInst, regOps);
@@ -1399,25 +1404,26 @@ class SignatureArray extends Array {
}
// Patch all instructions to accept implicit-size memory operand.
- for (bIndex = 0; bIndex < sameSizeSet.length; bIndex++) {
+ for (let bIndex = 0; bIndex < sameSizeSet.length; bIndex++) {
const bInst = sameSizeSet[bIndex];
if (implicit) {
bInst[memPos].flags.mem = true;
}
- if (!implicit)
+ if (!implicit) {
DEBUG(`${this.name}: Explicit: ${bInst}`);
+ }
}
}
}
compact() {
- var didSomething = true;
+ let didSomething = true;
while (didSomething) {
didSomething = false;
- for (var i = 0; i < this.length; i++) {
- var row = this[i];
- var j = i + 1;
+ for (let i = 0; i < this.length; i++) {
+ let row = this[i];
+ let j = i + 1;
while (j < this.length) {
if (row.mergeWith(this[j])) {
this.splice(j, 1);
@@ -1431,7 +1437,7 @@ class SignatureArray extends Array {
}
toString() {
- return `[${this.join(", ")}]`;
+ return `[${this.join(",\n")}]`;
}
}
@@ -1467,12 +1473,12 @@ class InstSignatureTable extends core.Task {
const indexes = iSignatureMap[rows[0].data];
if (indexes === undefined) return -1;
- for (var i = 0; i < indexes.length; i++) {
+ for (let i = 0; i < indexes.length; i++) {
const index = indexes[i];
if (index + len > iSignatureArr.length) continue;
- var ok = true;
- for (var j = 0; j < len; j++) {
+ let ok = true;
+ for (let j = 0; j < len; j++) {
if (iSignatureArr[index + j].data !== rows[j].data) {
ok = false;
break;
@@ -1489,11 +1495,11 @@ class InstSignatureTable extends core.Task {
function indexSignatures(signatures) {
const result = iSignatureArr.length;
- for (var i = 0; i < signatures.length; i++) {
+ for (let i = 0; i < signatures.length; i++) {
const signature = signatures[i];
const idx = iSignatureArr.length;
- if (!hasOwn.call(iSignatureMap, signature.data))
+ if (!Object.hasOwn(iSignatureMap, signature.data))
iSignatureMap[signature.data] = [];
iSignatureMap[signature.data].push(idx);
@@ -1503,22 +1509,22 @@ class InstSignatureTable extends core.Task {
return result;
}
- for (var len = this.maxOpRows; len >= 0; len--) {
+ for (let len = this.maxOpRows; len >= 0; len--) {
insts.forEach((inst) => {
const signatures = inst.signatures;
if (signatures.length === len) {
const signatureEntries = [];
- for (var j = 0; j < len; j++) {
+ for (let j = 0; j < len; j++) {
const signature = signatures[j];
- var signatureEntry = `ROW(${signature.length}, ${signature.x86 ? 1 : 0}, ${signature.x64 ? 1 : 0}, ${signature.implicit}`;
- var signatureComment = signature.toString();
+ let signatureEntry = `ROW(${signature.length}, ${signature.x86 ? 1 : 0}, ${signature.x64 ? 1 : 0}, ${signature.implicit}`;
+ let signatureComment = signature.toString();
- var x = 0;
+ let x = 0;
while (x < signature.length) {
const h = signature[x].toAsmJitOpData();
- var index = -1;
- if (!hasOwn.call(oSignatureMap, h)) {
+ let index = -1;
+ if (!Object.hasOwn(oSignatureMap, h)) {
index = oSignatureArr.length;
oSignatureMap[h] = index;
oSignatureArr.push(h);
@@ -1540,8 +1546,8 @@ class InstSignatureTable extends core.Task {
signatureEntries.push({ data: signatureEntry, comment: signatureComment, refs: 0 });
}
- var count = signatureEntries.length;
- var index = findSignaturesIndex(signatureEntries);
+ let count = signatureEntries.length;
+ let index = findSignaturesIndex(signatureEntries);
if (index === -1)
index = indexSignatures(signatureEntries);
@@ -1553,19 +1559,19 @@ class InstSignatureTable extends core.Task {
});
}
- var s = `#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \\\n` +
+ let s = `#define ROW(count, x86, x64, implicit, o0, o1, o2, o3, o4, o5) \\\n` +
` { count, uint8_t(x86 ? uint8_t(InstDB::Mode::kX86) : uint8_t(0)) | \\\n` +
` (x64 ? uint8_t(InstDB::Mode::kX64) : uint8_t(0)) , \\\n` +
` implicit, \\\n` +
` 0, \\\n` +
` { o0, o1, o2, o3, o4, o5 } \\\n` +
` }\n` +
- StringUtils.makeCxxArrayWithComment(iSignatureArr, "const InstDB::InstSignature InstDB::_instSignatureTable[]") +
+ StringUtils.makeCxxArrayWithComment(iSignatureArr, "const InstDB::InstSignature InstDB::_inst_signature_table[]") +
`#undef ROW\n` +
`\n` +
- `#define ROW(opFlags, regId) { opFlags, uint8_t(regId) }\n` +
+ `#define ROW(op_flags, reg_id) { op_flags, uint8_t(reg_id) }\n` +
`#define F(VAL) uint64_t(InstDB::OpFlags::k##VAL)\n` +
- StringUtils.makeCxxArray(oSignatureArr, "const InstDB::OpSignature InstDB::_opSignatureTable[]") +
+ StringUtils.makeCxxArray(oSignatureArr, "const InstDB::OpSignature InstDB::_op_signature_table[]") +
`#undef F\n` +
`#undef ROW\n`;
this.inject("InstSignatureTable", disclaimer(s), oSignatureArr.length * 8 + iSignatureArr.length * 8);
@@ -1573,9 +1579,9 @@ class InstSignatureTable extends core.Task {
makeSignatures(dbInsts) {
const instName = dbInsts.length ? dbInsts[0].name : "";
- const signatures = new SignatureArray();
+ const signatures = new SignatureArray(instName);
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const inst = dbInsts[i];
const ops = inst.operands;
@@ -1598,19 +1604,21 @@ class InstSignatureTable extends core.Task {
// 1a. mov reg, reg
// 1b. mov reg, mem
// 2b. mov mem, reg
- var modrmCount = 1;
- for (var modrm = 0; modrm < modrmCount; modrm++) {
- var row = new ISignature(inst.name);
+ let modrmCount = 1;
+ for (let modrm = 0; modrm < modrmCount; modrm++) {
+ let row = new ISignature(inst.name);
+
row.x86 = (inst.arch === "ANY" || inst.arch === "X86");
row.x64 = (inst.arch === "ANY" || inst.arch === "X64");
- for (var j = 0; j < ops.length; j++) {
- var iop = ops[j];
+ let j;
+ for (j = 0; j < ops.length; j++) {
+ let iop = ops[j];
- var reg = iop.reg;
- var mem = iop.mem;
- var imm = iop.imm;
- var rel = iop.rel;
+ let reg = iop.reg;
+ let mem = iop.mem;
+ let imm = iop.imm;
+ let rel = iop.rel;
// Skip all instructions having implicit `imm` operand of `1`.
if (iop.immValue !== null)
@@ -1731,8 +1739,9 @@ class InstSignatureTable extends core.Task {
}
// Not equal if we terminated the loop.
- if (j === ops.length)
+ if (j === ops.length) {
signatures.push(row);
+ }
}
}
@@ -1765,10 +1774,10 @@ class AdditionalInfoTable extends core.Task {
insts.forEach((inst) => {
const dbInsts = inst.dbInsts;
- var features = GenUtils.cpuFeaturesOf(dbInsts).map(function(f) { return `EXT(${f})`; }).join(", ");
+ let features = GenUtils.cpuFeaturesOf(dbInsts).map(function(f) { return `EXT(${f})`; }).join(", ");
if (!features) features = "0";
- var [r, w] = this.rwFlagsOf(dbInsts);
+ let [r, w] = this.rwFlagsOf(dbInsts);
const rData = r.map(function(flag) { return `FLAG(${flag})`; }).join(" | ") || "0";
const wData = w.map(function(flag) { return `FLAG(${flag})`; }).join(" | ") || "0";
const instFlags = Object.create(null);
@@ -1815,16 +1824,16 @@ class AdditionalInfoTable extends core.Task {
inst.additionalInfoIndex = additionaInfoTable.addIndexed(`{ ${instFlagsIndex}, ${rwInfoIndex}, { ${features} } }`);
});
- var s = `#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)\n` +
- `const InstDB::AdditionalInfo InstDB::_additionalInfoTable[] = {\n${StringUtils.format(additionaInfoTable, kIndent, true)}\n};\n` +
+ let s = `#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)\n` +
+ `const InstDB::AdditionalInfo InstDB::additional_info_table[] = {\n${StringUtils.format(additionaInfoTable, kIndent, true)}\n};\n` +
`#undef EXT\n` +
`\n` +
`#define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL)\n` +
- `const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {\n${StringUtils.format(rwInfoTable, kIndent, true)}\n};\n` +
+ `const InstDB::RWFlagsInfoTable InstDB::rw_flags_info_table[] = {\n${StringUtils.format(rwInfoTable, kIndent, true)}\n};\n` +
`#undef FLAG\n` +
`\n` +
`#define FLAG(VAL) uint32_t(InstRWFlags::k##VAL)\n` +
- `const InstRWFlags InstDB::_instFlagsTable[] = {\n${StringUtils.format(instFlagsTable, kIndent, true)}\n};\n` +
+ `const InstRWFlags InstDB::inst_flags_table[] = {\n${StringUtils.format(instFlagsTable, kIndent, true)}\n};\n` +
`#undef FLAG\n`;
this.inject("AdditionalInfoTable", disclaimer(s), additionaInfoTable.length * 8 + rwInfoTable.length * 8 + instFlagsTable.length * 4);
}
@@ -1833,7 +1842,7 @@ class AdditionalInfoTable extends core.Task {
const r = Object.create(null);
const w = Object.create(null);
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
// Omit special cases, this is handled well in C++ code.
@@ -1848,8 +1857,8 @@ class AdditionalInfoTable extends core.Task {
if (dbInst.name === "mov")
continue;
- for (var reg in regs) {
- var flag = "";
+ for (let reg in regs) {
+ let flag = "";
switch (reg) {
case "CF": flag = "CF"; break;
case "OF": flag = "OF"; break;
@@ -2000,13 +2009,13 @@ class InstRWInfoTable extends core.Task {
const rwInfoArray = [this.rwInfo(inst, o2Insts), this.rwInfo(inst, oxInsts)];
const rmInfoArray = [this.rmInfo(inst, o2Insts), this.rmInfo(inst, oxInsts)];
- for (var i = 0; i < 2; i++) {
+ for (let i = 0; i < 2; i++) {
const rwInfo = rwInfoArray[i];
const rmInfo = rmInfoArray[i];
const rwOps = rwInfo.rwOps;
const rwOpsIndex = [];
- for (var j = 0; j < rwOps.length; j++) {
+ for (let j = 0; j < rwOps.length; j++) {
const op = rwOps[j];
if (!op) {
rwOpsIndex.push(this.opInfoTable.addIndexed(noOpInfo));
@@ -2066,18 +2075,18 @@ class InstRWInfoTable extends core.Task {
}
});
- var s = "";
- s += "const uint8_t InstDB::rwInfoIndexA[Inst::_kIdCount] = {\n" + StringUtils.format(this.rwInfoIndexA, kIndent, -1) + "\n};\n";
+ let s = "";
+ s += "const uint8_t InstDB::rw_info_index_a_table[Inst::_kIdCount] = {\n" + StringUtils.format(this.rwInfoIndexA, kIndent, -1) + "\n};\n";
s += "\n";
- s += "const uint8_t InstDB::rwInfoIndexB[Inst::_kIdCount] = {\n" + StringUtils.format(this.rwInfoIndexB, kIndent, -1) + "\n};\n";
+ s += "const uint8_t InstDB::rw_info_index_b_table[Inst::_kIdCount] = {\n" + StringUtils.format(this.rwInfoIndexB, kIndent, -1) + "\n};\n";
s += "\n";
- s += "const InstDB::RWInfo InstDB::rwInfoA[] = {\n" + StringUtils.format(this.rwInfoTableA, kIndent, true) + "\n};\n";
+ s += "const InstDB::RWInfo InstDB::rw_info_a_table[] = {\n" + StringUtils.format(this.rwInfoTableA, kIndent, true) + "\n};\n";
s += "\n";
- s += "const InstDB::RWInfo InstDB::rwInfoB[] = {\n" + StringUtils.format(this.rwInfoTableB, kIndent, true) + "\n};\n";
+ s += "const InstDB::RWInfo InstDB::rw_info_b_table[] = {\n" + StringUtils.format(this.rwInfoTableB, kIndent, true) + "\n};\n";
s += "\n";
- s += "const InstDB::RWInfoOp InstDB::rwInfoOp[] = {\n" + StringUtils.format(this.opInfoTable, kIndent, true) + "\n};\n";
+ s += "const InstDB::RWInfoOp InstDB::rw_info_op_table[] = {\n" + StringUtils.format(this.opInfoTable, kIndent, true) + "\n};\n";
s += "\n";
- s += "const InstDB::RWInfoRm InstDB::rwInfoRm[] = {\n" + StringUtils.format(this.rmInfoTable, kIndent, true) + "\n};\n";
+ s += "const InstDB::RWInfoRm InstDB::rw_info_rm_table[] = {\n" + StringUtils.format(this.rmInfoTable, kIndent, true) + "\n};\n";
const size = this.rwInfoIndexA.length +
this.rwInfoIndexB.length +
@@ -2091,17 +2100,17 @@ class InstRWInfoTable extends core.Task {
byteMaskFromBitRanges(ranges) {
const arr = [];
- for (var i = 0; i < 64; i++)
+ for (let i = 0; i < 64; i++)
arr.push(0);
- for (var i = 0; i < ranges.length; i++) {
+ for (let i = 0; i < ranges.length; i++) {
const start = ranges[i].start;
const end = ranges[i].end;
if (start < 0)
continue;
- for (var j = start; j <= end; j++) {
+ for (let j = start; j <= end; j++) {
const bytePos = j >> 3;
if (bytePos < 0 || bytePos >= arr.length)
FATAL(`Range ${start}:${end} cannot be used to create a byte-mask`);
@@ -2109,8 +2118,8 @@ class InstRWInfoTable extends core.Task {
}
}
- var s = "0x";
- for (var i = arr.length - 4; i >= 0; i -= 4) {
+ let s = "0x";
+ for (let i = arr.length - 4; i >= 0; i -= 4) {
const value = (arr[i + 3] << 3) | (arr[i + 2] << 2) | (arr[i + 1] << 1) | arr[i];
s += value.toString(16).toUpperCase();
}
@@ -2142,18 +2151,18 @@ class InstRWInfoTable extends core.Task {
}
function queryRwGeneric(dbInsts, step) {
- var rwOps = nullOps();
- for (var i = 0; i < dbInsts.length; i++) {
+ let rwOps = nullOps();
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (!op.isRegOrMem())
continue;
const opSize = op.isReg() ? op.regSize : op.memSize;
- var d = {
+ let d = {
access: op.read && op.write ? "X" : op.read ? "R" : op.write ? "W" : "?",
clc: 0,
flags: {},
@@ -2192,7 +2201,7 @@ class InstRWInfoTable extends core.Task {
if (op.regIndexRel)
d.flags.Consecutive = true;
- for (var k in self.rwOpFlagsForInstruction(asmInst.name, j))
+ for (let k in self.rwOpFlagsForInstruction(asmInst.name, j))
d.flags[k] = true;
if ((step === -1 || step === j) || op.rwxIndex !== 0 || op.rwxWidth !== opSize) {
@@ -2234,17 +2243,17 @@ class InstRWInfoTable extends core.Task {
}
function queryRwByData(dbInsts, rwOpsArray) {
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
const rwOps = nullOps();
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
rwOps[j] = makeRwFromOp(operands[j])
}
- var match = 0;
- for (var j = 0; j < rwOpsArray.length; j++)
+ let match = 0;
+ for (let j = 0; j < rwOpsArray.length; j++)
match |= ObjectUtils.equals(rwOps, rwOpsArray[j]);
if (!match)
@@ -2256,12 +2265,12 @@ class InstRWInfoTable extends core.Task {
function dumpRwToData(dbInsts) {
const out = [];
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
const rwOps = nullOps();
- for (var j = 0; j < operands.length; j++)
+ for (let j = 0; j < operands.length; j++)
rwOps[j] = makeRwFromOp(operands[j])
if (ArrayUtils.deepIndexOf(out, rwOps) !== -1)
@@ -2278,18 +2287,18 @@ class InstRWInfoTable extends core.Task {
return { category: this.rwCategoryByName[name], rwOps: nullOps() };
// Generic rules.
- for (var i = -1; i <= 6; i++) {
+ for (let i = -1; i <= 6; i++) {
const rwInfo = queryRwGeneric(dbInsts, i);
if (rwInfo)
return rwInfo;
}
// Specific rules.
- for (var k in this.rwCategoryByData)
+ for (let k in this.rwCategoryByData)
if (queryRwByData(dbInsts, this.rwCategoryByData[k]))
return { category: k, rwOps: nullOps() };
- // FATALURE: Missing data to categorize this instruction.
+ // FATAL: Missing data to categorize this instruction.
if (name) {
const items = dumpRwToData(dbInsts)
console.log(`RW: ${dbInsts.length ? dbInsts[0].name : ""}:`);
@@ -2345,16 +2354,16 @@ class InstRWInfoTable extends core.Task {
}
rmReplaceableCategory(dbInsts) {
- var category = null;
+ let category = null;
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
- var rs = -1;
- var ms = -1;
+ let rs = -1;
+ let ms = -1;
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (op.isMem())
ms = op.memSize;
@@ -2362,7 +2371,7 @@ class InstRWInfoTable extends core.Task {
rs = Math.max(rs, op.regSize);
}
- var c = (rs === -1 ) ? "None" :
+ let c = (rs === -1 ) ? "None" :
(ms === -1 ) ? "None" :
(ms === rs ) ? "Fixed" :
(ms === rs / 2) ? "Half" :
@@ -2391,9 +2400,9 @@ class InstRWInfoTable extends core.Task {
rmReplaceableIndexes(dbInsts) {
function maskOf(inst, fn) {
- var m = 0;
- var operands = inst.operands;
- for (var i = 0; i < operands.length; i++)
+ let m = 0;
+ let operands = inst.operands;
+ for (let i = 0; i < operands.length; i++)
if (fn(operands[i]))
m |= (1 << i);
return m;
@@ -2402,19 +2411,19 @@ class InstRWInfoTable extends core.Task {
function getRegIndexes(inst) { return maskOf(inst, function(op) { return op.isReg(); }); };
function getMemIndexes(inst) { return maskOf(inst, function(op) { return op.isMem(); }); };
- var mask = 0;
+ let mask = 0;
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
- var mi = getMemIndexes(dbInst);
- var ri = getRegIndexes(dbInst) & ~mi;
+ let mi = getMemIndexes(dbInst);
+ let ri = getRegIndexes(dbInst) & ~mi;
if (!mi)
continue;
const match = dbInsts.some((inst) => {
- var ti = getRegIndexes(inst);
+ let ti = getRegIndexes(inst);
return ((ri & ti) === ri && (mi & ti) === mi);
});
@@ -2427,13 +2436,13 @@ class InstRWInfoTable extends core.Task {
}
rmFixedSize(insts) {
- var savedOp = null;
+ let savedOp = null;
- for (var i = 0; i < insts.length; i++) {
+ for (let i = 0; i < insts.length; i++) {
const inst = insts[i];
const operands = inst.operands;
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (op.mem) {
if (savedOp && savedOp.mem !== op.mem)
@@ -2447,11 +2456,11 @@ class InstRWInfoTable extends core.Task {
}
rmIsConsistent(insts) {
- var hasMem = 0;
- for (var i = 0; i < insts.length; i++) {
+ let hasMem = 0;
+ for (let i = 0; i < insts.length; i++) {
const inst = insts[i];
const operands = inst.operands;
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (op.mem) {
hasMem = 1;
@@ -2470,16 +2479,16 @@ class InstRWInfoTable extends core.Task {
const memMap = {};
const immMap = {};
- for (var i = 0; i < dbInsts.length; i++) {
+ for (let i = 0; i < dbInsts.length; i++) {
const dbInst = dbInsts[i];
const operands = dbInst.operands;
- var memStr = "";
- var immStr = "";
- var hasMem = false;
- var hasImm = false;
+ let memStr = "";
+ let immStr = "";
+ let hasMem = false;
+ let hasImm = false;
- for (var j = 0; j < operands.length; j++) {
+ for (let j = 0; j < operands.length; j++) {
const op = operands[j];
if (j) {
memStr += ", ";
@@ -2607,11 +2616,11 @@ class InstCommonTable extends core.Task {
inst.commonInfoIndex = table.addIndexed(row);
});
- var s = `#define F(VAL) uint32_t(InstDB::InstFlags::k##VAL)\n` +
+ let s = `#define F(VAL) uint32_t(InstDB::InstFlags::k##VAL)\n` +
`#define X(VAL) uint32_t(InstDB::Avx512Flags::k##VAL)\n` +
`#define CONTROL_FLOW(VAL) uint8_t(InstControlFlow::k##VAL)\n` +
`#define SAME_REG_HINT(VAL) uint8_t(InstSameRegHint::k##VAL)\n` +
- `const InstDB::CommonInfo InstDB::_commonInfoTable[] = {\n${StringUtils.format(table, kIndent, true)}\n};\n` +
+ `const InstDB::CommonInfo InstDB::_inst_common_info_table[] = {\n${StringUtils.format(table, kIndent, true)}\n};\n` +
`#undef SAME_REG_HINT\n` +
`#undef CONTROL_FLOW\n` +
`#undef X\n` +
diff --git a/3rdparty/asmjit/tools/tablegen-x86.sh b/3rdparty/asmjit/tools/tablegen-x86.sh
index 40facf326dc..40facf326dc 100644..100755
--- a/3rdparty/asmjit/tools/tablegen-x86.sh
+++ b/3rdparty/asmjit/tools/tablegen-x86.sh
diff --git a/3rdparty/asmjit/tools/tablegen.js b/3rdparty/asmjit/tools/tablegen.js
index a151805675b..cb1494dfa62 100644
--- a/3rdparty/asmjit/tools/tablegen.js
+++ b/3rdparty/asmjit/tools/tablegen.js
@@ -1,6 +1,6 @@
// This file is part of AsmJit project <https://asmjit.com>
//
-// See asmjit.h or LICENSE.md for license and copyright information
+// See <asmjit/core.h> or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib
// ============================================================================
@@ -25,8 +25,6 @@ const asmdb = require("../db");
exports.asmdb = asmdb;
exports.exp = asmdb.base.exp;
-const hasOwn = Object.prototype.hasOwnProperty;
-
const FATAL = commons.FATAL;
const StringUtils = commons.StringUtils;
@@ -56,35 +54,50 @@ class InstructionNameData {
this.maxNameLength = 0;
}
- add(s) {
+ add(name, alt) {
+ if (name === alt) {
+ alt = "";
+ }
+
+ if (this.maxNameLength < name.length) {
+ this.maxNameLength = name.length;
+ }
+
+ this.names.push(name);
+
// First try to encode the string with 5-bit characters that fit into a 32-bit int.
- if (/^[a-z0-4]{0,6}$/.test(s)) {
+ if (/^[a-z0-4]{0,6}$/.test(name) && !alt) {
let index = 0;
- for (let i = 0; i < s.length; i++)
- index |= charTo5Bit(s[i]) << (i * 5);
+ for (let i = 0; i < name.length; i++) {
+ index |= charTo5Bit(name[i]) << (i * 5);
+ }
- this.names.push(s);
+ this.indexComment.push(`Small '${name}'.`);
this.primaryTable.push(index | (1 << 31));
- this.indexComment.push(`Small '${s}'.`);
+ }
+ else if (alt) {
+ const prefixIndex = this.addOrReferenceString(name + String.fromCharCode(alt.length) + alt);
+
+ if (name === "jz") {
+ console.log(`jz prefix: ${prefixIndex}`);
+ }
+
+ this.indexComment.push(`Large '${name}' + '${alt}'`);
+ this.primaryTable.push(prefixIndex | (name.length << 12) | (0xFFF << 16) | 0);
}
else {
- // Put the string into a string table.
- this.names.push(s);
- this.primaryTable.push(-1);
this.indexComment.push(``);
+ this.primaryTable.push(0);
}
-
- if (this.maxNameLength < s.length)
- this.maxNameLength = s.length;
}
index() {
const kMaxPrefixSize = 15;
- const kMaxSuffixSize = 7;
+ const kMaxSuffixSize = 6;
const names = [];
for (let idx = 0; idx < this.primaryTable.length; idx++) {
- if (this.primaryTable[idx] === -1) {
+ if (this.primaryTable[idx] === 0) {
names.push({ name: this.names[idx], index: idx });
}
}
@@ -205,11 +218,20 @@ class InstructionNameData {
FATAL(`IndexedString.formatStringTable(): Not indexed yet, call index()`);
let s = "";
- for (let i = 0; i < this.stringTable.length; i += 80) {
- if (s)
- s += "\n"
- s += '"' + this.stringTable.substring(i, i + 80) + '"';
+ let line = "";
+
+ for (let i = 0; i < this.stringTable.length; i++) {
+ const c = this.stringTable.charCodeAt(i);
+ line += "\\x" + cxx.Utils.toHexRaw(c, 2);
+
+ if (line.length >= 115 || i === this.stringTable.length - 1) {
+ if (s)
+ s += "\n"
+ s += `"${line}"`;
+ line = "";
+ }
}
+
s += ";\n";
return `const char ${tableName}[] =\n${StringUtils.indent(s, " ")}\n`;
@@ -226,7 +248,7 @@ class InstructionNameData {
if (this.size === -1)
FATAL(`IndexedString.getIndex(): Not indexed yet, call index()`);
- if (!hasOwn.call(this.map, k))
+ if (!Object.hasOwn(this.map, k))
FATAL(`IndexedString.getIndex(): Key '${k}' not found.`);
return this.map[k];
@@ -288,7 +310,9 @@ class Injector {
const path = kAsmJitRoot + "/" + file;
console.log(`MODIFIED '${file}'`);
- fs.writeFileSync(path + ".backup", obj.prev, "utf8");
+ if (!fs.existsSync(path + ".backup")) {
+ fs.writeFileSync(path + ".backup", obj.prev, "utf8");
+ }
fs.writeFileSync(path, obj.data, "utf8");
}
}
@@ -346,7 +370,7 @@ exports.Injector = Injector;
// Main context used to load, generate, and store instruction tables. The idea
// is to be extensible, so it stores 'Task's to be executed with minimal deps
// management.
-class TableGen extends Injector{
+class TableGen extends Injector {
constructor(arch) {
super();
@@ -418,7 +442,7 @@ class TableGen extends Injector{
// [Instruction Management]
// --------------------------------------------------------------------------
- addInst(inst) {
+ addInstruction(inst) {
if (this.instMap[inst.name])
FATAL(`TableGen.addInst(): Instruction '${inst.name}' already added`);
@@ -471,19 +495,35 @@ class IdEnum extends Task {
run() {
const insts = this.ctx.insts;
- var s = "";
- for (var i = 0; i < insts.length; i++) {
+ let s = "";
+ let aliases = "";
+
+ for (let i = 0; i < insts.length; i++) {
const inst = insts[i];
- var line = "kId" + inst.enum + (i ? "" : " = 0") + ",";
- var text = this.comment(inst);
+ let line = "kId" + inst.enum + (i ? "" : " = 0") + ",";
+ let text = this.comment(inst);
if (text)
line = line.padEnd(37) + "//!< " + text;
s += line + "\n";
+
+ if (inst.aliases) {
+ for (let aliasName of inst.aliases.aliasNames) {
+ if (aliases) aliases += ",\n";
+ aliases += `kId${StringUtils.makeEnumName(aliasName)} = kId${inst.enum}`;
+ }
+ }
+ }
+ s += "_kIdCount";
+
+ if (aliases) {
+ s += ",\n\n" + "// Aliases.\n" + aliases + "\n";
+ }
+ else {
+ s += "\n";
}
- s += "_kIdCount\n";
return this.ctx.inject("InstId", s);
}
@@ -507,16 +547,43 @@ class Output {
};
exports.Output = Output;
-function generateNameData(out, instructions) {
+function cmp(a, b) { return (a < b) ? -1 : a > b ? 1 : 0; }
+
+function generateNameData(out, instructions, generateAliases) {
const none = "Inst::kIdNone";
+ const aliases = [];
+ const aliasNameData = new InstructionNameData();
+ const aliasLinkData = [];
+
const instFirst = new Array(26);
const instLast = new Array(26);
const instNameData = new InstructionNameData();
- for (let i = 0; i < instructions.length; i++)
- instNameData.add(instructions[i].displayName);
+ for (let i = 0; i < instructions.length; i++) {
+ const instruction = instructions[i];
+
+ if (instruction.aliases) {
+ instNameData.add(instruction.displayName, instruction.aliases.format);
+ for (let aliasName of instruction.aliases.aliasNames) {
+ aliases.push({ name: instruction.name, alt: aliasName });
+ }
+ }
+ else {
+ instNameData.add(instruction.displayName);
+ }
+ }
+
+ aliases.sort(function(a, b) { return cmp(a.alt, b.alt); });
+
+ for (let i = 0; i < aliases.length; i++) {
+ const alias = aliases[i];
+ aliasNameData.add(alias.alt);
+ aliasLinkData.push(`Inst::kId${StringUtils.makeEnumName(alias.name)}`);
+ }
+
instNameData.index();
+ aliasNameData.index();
for (let i = 0; i < instructions.length; i++) {
const inst = instructions[i];
@@ -532,7 +599,7 @@ function generateNameData(out, instructions) {
}
var s = "";
- s += `const InstNameIndex InstDB::instNameIndex = {{\n`;
+ s += `const InstNameIndex InstDB::_inst_name_index = {{\n`;
for (var i = 0; i < instFirst.length; i++) {
const firstId = instFirst[i] || none;
const lastId = instLast[i] || none;
@@ -544,25 +611,45 @@ function generateNameData(out, instructions) {
}
s += `}, uint16_t(${instNameData.maxNameLength})};\n`;
s += `\n`;
- s += instNameData.formatStringTable("InstDB::_instNameStringTable");
+ s += instNameData.formatStringTable("InstDB::_inst_name_string_table");
s += `\n`;
- s += instNameData.formatIndexTable("InstDB::_instNameIndexTable");
+ s += instNameData.formatIndexTable("InstDB::_inst_name_index_table");
+
+ let dataSize = instNameData.getSize() + 26 * 4;
+
+ if (generateAliases) {
+ s += `\n`;
+ s += aliasNameData.formatStringTable("InstDB::alias_name_string_table");
+ s += `\n`;
+ s += aliasNameData.formatIndexTable("InstDB::alias_name_index_table");
+ s += "\n";
+ s += "const uint32_t InstDB::alias_index_to_inst_id_table[] = {\n" + StringUtils.format(aliasLinkData, " ", true, null) + "\n};\n";
+
+ dataSize += aliasNameData.getSize();
+ let info = `static constexpr uint32_t kAliasTableSize = ${aliasLinkData.length};\n`;
+ out.add("NameDataInfo", StringUtils.disclaimer(info), 0);
+ }
- const dataSize = instNameData.getSize() + 26 * 4;
out.add("NameData", StringUtils.disclaimer(s), dataSize);
return out;
}
exports.generateNameData = generateNameData;
class NameTable extends Task {
- constructor(name, deps) {
+ constructor(name, deps, generateAliases) {
super(name || "NameTable", deps);
+ this.generateAliases = generateAliases;
}
run() {
const output = new Output();
- generateNameData(output, this.ctx.insts);
+ generateNameData(output, this.ctx.insts, this.generateAliases);
+
this.ctx.inject("NameData", output.content["NameData"], output.tableSize["NameData"]);
+
+ if (this.generateAliases) {
+ this.ctx.inject("NameDataInfo", output.content["NameDataInfo"], output.tableSize["NameDataInfo"]);
+ }
}
}
exports.NameTable = NameTable;
diff --git a/3rdparty/asmjit/tools/tablegen.sh b/3rdparty/asmjit/tools/tablegen.sh
index 0ef1e580634..0ef1e580634 100644..100755
--- a/3rdparty/asmjit/tools/tablegen.sh
+++ b/3rdparty/asmjit/tools/tablegen.sh
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/LICENSE.txt b/3rdparty/bgfx/3rdparty/dear-imgui/LICENSE.txt
index 4023e0caa85..00ae473abe6 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/LICENSE.txt
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/LICENSE.txt
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2014-2022 Omar Cornut
+Copyright (c) 2014-2025 Omar Cornut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imconfig.h b/3rdparty/bgfx/3rdparty/dear-imgui/imconfig.h
index bb52b2380ec..11de530acbb 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imconfig.h
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imconfig.h
@@ -1,67 +1,145 @@
//-----------------------------------------------------------------------------
-// USER IMPLEMENTATION
-// This file contains compile-time options for ImGui.
-// Other options (memory allocation overrides, callbacks, etc.) can be set at runtime via the ImGuiIO structure - ImGui::GetIO().
+// DEAR IMGUI COMPILE-TIME OPTIONS
+// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
+// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
+//-----------------------------------------------------------------------------
+// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it)
+// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template.
+//-----------------------------------------------------------------------------
+// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp
+// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures.
+// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
+// Call IMGUI_CHECKVERSION() from your .cpp file to verify that the data structures your files are using are matching the ones imgui.cpp is using.
//-----------------------------------------------------------------------------
#pragma once
+//---- Define assertion handler. Defaults to calling assert().
+// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
+//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
+//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
+
+//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
+// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
+// - Windows DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
+// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
+//#define IMGUI_API __declspec(dllexport) // MSVC Windows: DLL export
+//#define IMGUI_API __declspec(dllimport) // MSVC Windows: DLL import
+//#define IMGUI_API __attribute__((visibility("default"))) // GCC/Clang: override visibility when set is hidden
+
+//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to clean your code of obsolete function/names.
#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-#define IMGUI_DISABLE_OBSOLETE_KEYIO
#define IMGUI_DISABLE_DEFAULT_ALLOCATORS
-//---- Define your own ImVector<> type if you don't want to use the provided implementation defined in imgui.h
-//#include <vector>
-//#define ImVector std::vector
-//#define ImVector MyVector
+//---- Disable all of Dear ImGui or don't implement standard windows/tools.
+// It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp.
+//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty.
+//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty.
+//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowIDStackToolWindow() will be empty.
-//---- Define assertion handler. Defaults to calling assert().
-#include <assert.h>
-#define IM_ASSERT(_EXPR) assert(_EXPR)
+//---- Don't implement some functions to reduce linkage requirements.
+#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
+//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW)
+#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
+//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, IME).
+//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
+//#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS // Don't implement default platform_io.Platform_OpenInShellFn() handler (Win32: ShellExecute(), require shell32.lib/.a, Mac/Linux: use system("")).
+//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
+//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
+//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
+//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
+//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
+//#define IMGUI_DISABLE_DEFAULT_FONT // Disable default embedded font (ProggyClean.ttf), remove ~9.5 KB from output binary. AddFontDefault() will assert.
+//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available
-//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows.
-//#define IMGUI_API __declspec( dllexport )
-//#define IMGUI_API __declspec( dllimport )
+//---- Enable Test Engine / Automation features.
+//#define IMGUI_ENABLE_TEST_ENGINE // Enable imgui_test_engine hooks. Generally set automatically by include "imgui_te_config.h", see Test Engine for details.
-//---- Don't implement default handlers for Windows (so as not to link with OpenClipboard() and others Win32 functions)
-#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
-#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
+//---- Include imgui_user.h at the end of imgui.h as a convenience
+// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included.
+#define IMGUI_INCLUDE_IMGUI_USER_H
+//#define IMGUI_USER_H_FILENAME "my_folder/my_imgui_user.h"
//---- Include imgui_user.inl at the end of imgui.cpp so you can include code that extends ImGui using its private data/functions.
#define IMGUI_INCLUDE_IMGUI_USER_INL
-//---- Include imgui_user.h at the end of imgui.h
-#define IMGUI_INCLUDE_IMGUI_USER_H
+//---- Pack vertex colors as BGRA8 instead of RGBA8 (to avoid converting from one to another). Need dedicated backend support.
+//#define IMGUI_USE_BGRA_PACKED_COLOR
-//---- Don't implement default handlers for Windows (so as not to link with OpenClipboard() and others Win32 functions)
-#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
-#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
+//---- Use legacy CRC32-adler tables (used before 1.91.6), in order to preserve old .ini data that you cannot afford to invalidate.
+//#define IMGUI_USE_LEGACY_CRC32_ADLER
+
+//---- Use 32-bit for ImWchar (default is 16-bit) to support Unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
+//#define IMGUI_USE_WCHAR32
+
+//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
+// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files.
+//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h"
+//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h"
+//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if IMGUI_USE_STB_SPRINTF is defined.
+#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
+#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
+//#define IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION // only disabled if IMGUI_USE_STB_SPRINTF is defined.
+
+//---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined)
+// Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h.
+//#define IMGUI_USE_STB_SPRINTF
-//---- Don't implement help and test window functionality (ShowUserGuide()/ShowStyleEditor()/ShowTestWindow() methods will be empty)
-//#define IMGUI_DISABLE_TEST_WINDOWS
+//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui)
+// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided).
+// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
+//#define IMGUI_ENABLE_FREETYPE
-//---- Implement STB libraries in a namespace to avoid conflicts
-//#define IMGUI_STB_NAMESPACE ImStb
+//---- Use FreeType + plutosvg or lunasvg to render OpenType SVG fonts (SVGinOT)
+// Only works in combination with IMGUI_ENABLE_FREETYPE.
+// - plutosvg is currently easier to install, as e.g. it is part of vcpkg. It will support more fonts and may load them faster. See misc/freetype/README for instructions.
+// - Both require headers to be available in the include path + program to be linked with the library code (not provided).
+// - (note: lunasvg implementation is based on Freetype's rsvg-port.c which is licensed under CeCILL-C Free Software License Agreement)
+//#define IMGUI_ENABLE_FREETYPE_PLUTOSVG
+//#define IMGUI_ENABLE_FREETYPE_LUNASVG
-//---- Define constructor and implicit cast operators to convert back<>forth from your math types and ImVec2/ImVec4.
+//---- Use stb_truetype to build and rasterize the font atlas (default)
+// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend.
+//#define IMGUI_ENABLE_STB_TRUETYPE
+
+//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
+// This will be inlined as part of ImVec2 and ImVec4 class declarations.
/*
-#define IM_VEC2_CLASS_EXTRA \
- ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \
+#define IM_VEC2_CLASS_EXTRA \
+ constexpr ImVec2(const MyVec2& f) : x(f.x), y(f.y) {} \
operator MyVec2() const { return MyVec2(x,y); }
-#define IM_VEC4_CLASS_EXTRA \
- ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \
+#define IM_VEC4_CLASS_EXTRA \
+ constexpr ImVec4(const MyVec4& f) : x(f.x), y(f.y), z(f.z), w(f.w) {} \
operator MyVec4() const { return MyVec4(x,y,z,w); }
*/
+//---- ...Or use Dear ImGui's own very basic math operators.
+//#define IMGUI_DEFINE_MATH_OPERATORS
+
+//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices.
+// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices).
+// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
+// Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
+//#define ImDrawIdx unsigned int
+
+//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly)
+//struct ImDrawList;
+//struct ImDrawCmd;
+//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data);
+//#define ImDrawCallback MyImDrawCallback
-//---- Freely implement extra functions within the ImGui:: namespace.
-//---- Declare helpers or widgets implemented in imgui_user.inl or elsewhere, so end-user doesn't need to include multiple files.
-//---- e.g. you can create variants of the ImGui::Value() helper for your low-level math types, or your own widgets/helpers.
+//---- Debug Tools: Macro to break in Debugger (we provide a default implementation of this in the codebase)
+// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.)
+//#define IM_DEBUG_BREAK IM_ASSERT(0)
+//#define IM_DEBUG_BREAK __debugbreak()
+
+//---- Debug Tools: Enable slower asserts
+//#define IMGUI_DEBUG_PARANOID
+
+//---- Tip: You can add extra functions within the ImGui:: namespace from anywhere (e.g. your own sources/header files)
/*
namespace ImGui
{
- void Value(const char* prefix, const MyVec2& v, const char* float_format = NULL);
- void Value(const char* prefix, const MyVec4& v, const char* float_format = NULL);
+ void MyFunction(const char* name, MyMatrix44* mtx);
}
*/
-
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui.cpp b/3rdparty/bgfx/3rdparty/dear-imgui/imgui.cpp
index bd3f95d77ae..7ec19227897 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui.cpp
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui.cpp
@@ -1,30 +1,37 @@
-// dear imgui, v1.90 WIP
+// dear imgui, v1.91.9b
// (main code and documentation)
// Help:
-// - Read FAQ at http://dearimgui.org/faq
-// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase.
+// - See links below.
// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that.
-// Read imgui.cpp for details, links and comments.
+// - Read top of imgui.cpp for more details, links and comments.
// Resources:
-// - FAQ http://dearimgui.org/faq
-// - Homepage & latest https://github.com/ocornut/imgui
-// - Releases & changelog https://github.com/ocornut/imgui/releases
-// - Gallery https://github.com/ocornut/imgui/issues/5243 (please post your screenshots/video there!)
-// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there)
-// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
-// - Issues & support https://github.com/ocornut/imgui/issues
-
-// Getting Started?
-// - For first-time users having issues compiling/linking/running or issues loading fonts:
-// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
-
+// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md)
+// - Homepage ................... https://github.com/ocornut/imgui
+// - Releases & changelog ....... https://github.com/ocornut/imgui/releases
+// - Gallery .................... https://github.com/ocornut/imgui/issues?q=label%3Agallery (please post your screenshots/video there!)
+// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there)
+// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code)
+// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more)
+// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines)
+// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
+// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools
+// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui
+// - Issues & support ........... https://github.com/ocornut/imgui/issues
+// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps)
+
+// For first-time users having issues compiling/linking/running/loading fonts:
+// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
+// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there.
+
+// Copyright (c) 2014-2025 Omar Cornut
// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.
// See LICENSE.txt for copyright and licensing details (standard MIT License).
// This library is free but needs your support to sustain development and maintenance.
-// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.com".
-// Individuals: you can support continued development via donations. See docs/README or web page.
+// Businesses: you can support continued development via B2B invoiced technical support, maintenance and sponsoring contracts.
+// PLEASE reach out at omar AT dearimgui DOT com. See https://github.com/ocornut/imgui/wiki/Funding
+// Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine.
// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library.
// Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without
@@ -39,17 +46,16 @@ Index of this file:
DOCUMENTATION
- MISSION STATEMENT
-- END-USER GUIDE
+- CONTROLS GUIDE
- PROGRAMMER GUIDE
- READ FIRST
- HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
- GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
- HOW A SIMPLE APPLICATION MAY LOOK LIKE
- HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
- - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
- API BREAKING CHANGES (read me when you update!)
- FREQUENTLY ASKED QUESTIONS (FAQ)
- - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer)
+ - Read all answers online: https://www.dearimgui.com/faq, or in docs/FAQ.md (with a Markdown viewer)
CODE
(search for "[SECTION]" in the code to find them)
@@ -57,7 +63,7 @@ CODE
// [SECTION] INCLUDES
// [SECTION] FORWARD DECLARATIONS
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
-// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
+// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO, ImGuiPlatformIO)
// [SECTION] MISC HELPERS/UTILITIES (Geometry functions)
// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions)
// [SECTION] MISC HELPERS/UTILITIES (File functions)
@@ -69,13 +75,17 @@ CODE
// [SECTION] ImGuiListClipper
// [SECTION] STYLING
// [SECTION] RENDER HELPERS
+// [SECTION] INITIALIZATION, SHUTDOWN
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
+// [SECTION] ID STACK
// [SECTION] INPUTS
-// [SECTION] ERROR CHECKING
+// [SECTION] ERROR CHECKING, STATE RECOVERY
+// [SECTION] ITEM SUBMISSION
// [SECTION] LAYOUT
// [SECTION] SCROLLING
// [SECTION] TOOLTIPS
// [SECTION] POPUPS
+// [SECTION] WINDOW FOCUS
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
// [SECTION] DRAG AND DROP
// [SECTION] LOGGING/CAPTURING
@@ -85,7 +95,7 @@ CODE
// [SECTION] PLATFORM DEPENDENT HELPERS
// [SECTION] METRICS/DEBUGGER WINDOW
// [SECTION] DEBUG LOG WINDOW
-// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL)
+// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, ID STACK TOOL)
*/
@@ -107,33 +117,80 @@ CODE
- Portable, minimize dependencies, run on target (consoles, phones, etc.).
- Efficient runtime and memory consumption.
- Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes:
+ Designed primarily for developers and content-creators, not the typical end-user!
+ Some of the current weaknesses (which we aim to address in the future) includes:
- - Doesn't look fancy, doesn't animate.
+ - Doesn't look fancy.
- Limited layout features, intricate layouts are typically crafted in code.
- END-USER GUIDE
+ CONTROLS GUIDE
==============
- - Double-click on title bar to collapse window.
- - Click upper right corner to close a window, available when 'bool* p_open' is passed to ImGui::Begin().
- - Click and drag on lower right corner to resize window (double-click to auto fit window to its contents).
- - Click and drag on any empty space to move window.
- - TAB/SHIFT+TAB to cycle through keyboard editable fields.
- - CTRL+Click on a slider or drag box to input value as text.
- - Use mouse wheel to scroll.
- - Text editor:
- - Hold SHIFT or use mouse to select text.
- - CTRL+Left/Right to word jump.
- - CTRL+Shift+Left/Right to select words.
- - CTRL+A or Double-Click to select all.
- - CTRL+X,CTRL+C,CTRL+V to use OS clipboard/
- - CTRL+Z,CTRL+Y to undo/redo.
- - ESCAPE to revert text to its original value.
- - Controls are automatically adjusted for OSX to match standard OSX text editing operations.
- - General Keyboard controls: enable with ImGuiConfigFlags_NavEnableKeyboard.
- - General Gamepad controls: enable with ImGuiConfigFlags_NavEnableGamepad. Download controller mapping PNG/PSD at http://dearimgui.org/controls_sheets
+ - MOUSE CONTROLS
+ - Mouse wheel: Scroll vertically.
+ - SHIFT+Mouse wheel: Scroll horizontally.
+ - Click [X]: Close a window, available when 'bool* p_open' is passed to ImGui::Begin().
+ - Click ^, Double-Click title: Collapse window.
+ - Drag on corner/border: Resize window (double-click to auto fit window to its contents).
+ - Drag on any empty space: Move window (unless io.ConfigWindowsMoveFromTitleBarOnly = true).
+ - Left-click outside popup: Close popup stack (right-click over underlying popup: Partially close popup stack).
+
+ - TEXT EDITOR
+ - Hold SHIFT or Drag Mouse: Select text.
+ - CTRL+Left/Right: Word jump.
+ - CTRL+Shift+Left/Right: Select words.
+ - CTRL+A or Double-Click: Select All.
+ - CTRL+X, CTRL+C, CTRL+V: Use OS clipboard.
+ - CTRL+Z Undo.
+ - CTRL+Y or CTRL+Shift+Z: Redo.
+ - ESCAPE: Revert text to its original value.
+ - On OSX, controls are automatically adjusted to match standard OSX text editing 2ts and behaviors.
+
+ - KEYBOARD CONTROLS
+ - Basic:
+ - Tab, SHIFT+Tab Cycle through text editable fields.
+ - CTRL+Tab, CTRL+Shift+Tab Cycle through windows.
+ - CTRL+Click Input text into a Slider or Drag widget.
+ - Extended features with `io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard`:
+ - Tab, SHIFT+Tab: Cycle through every items.
+ - Arrow keys Move through items using directional navigation. Tweak value.
+ - Arrow keys + Alt, Shift Tweak slower, tweak faster (when using arrow keys).
+ - Enter Activate item (prefer text input when possible).
+ - Space Activate item (prefer tweaking with arrows when possible).
+ - Escape Deactivate item, leave child window, close popup.
+ - Page Up, Page Down Previous page, next page.
+ - Home, End Scroll to top, scroll to bottom.
+ - Alt Toggle between scrolling layer and menu layer.
+ - CTRL+Tab then Ctrl+Arrows Move window. Hold SHIFT to resize instead of moving.
+ - Output when ImGuiConfigFlags_NavEnableKeyboard set,
+ - io.WantCaptureKeyboard flag is set when keyboard is claimed.
+ - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set.
+ - io.NavVisible: true when the navigation cursor is visible (usually goes to back false when mouse is used).
+
+ - GAMEPAD CONTROLS
+ - Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
+ - Particularly useful to use Dear ImGui on a console system (e.g. PlayStation, Switch, Xbox) without a mouse!
+ - Download controller mapping PNG/PSD at http://dearimgui.com/controls_sheets
+ - Backend support: backend needs to:
+ - Set 'io.BackendFlags |= ImGuiBackendFlags_HasGamepad' + call io.AddKeyEvent/AddKeyAnalogEvent() with ImGuiKey_Gamepad_XXX keys.
+ - For analog values (0.0f to 1.0f), backend is responsible to handling a dead-zone and rescaling inputs accordingly.
+ Backend code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.).
+ - If you need to share inputs between your game and the Dear ImGui interface, the easiest approach is to go all-or-nothing,
+ with a buttons combo to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved.
+
+ - REMOTE INPUTS SHARING & MOUSE EMULATION
+ - PS4/PS5 users: Consider emulating a mouse cursor with DualShock touch pad or a spare analog stick as a mouse-emulation fallback.
+ - Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + run examples/libs/synergy/uSynergy.c (on your console/tablet/phone app)
+ in order to share your PC mouse/keyboard.
+ - See https://github.com/ocornut/imgui/wiki/Useful-Extensions#remoting for other remoting solutions.
+ - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the io.ConfigNavMoveSetMousePos flag.
+ Enabling io.ConfigNavMoveSetMousePos + ImGuiBackendFlags_HasSetMousePos instructs Dear ImGui to move your mouse cursor along with navigation movements.
+ When enabled, the NewFrame() function may alter 'io.MousePos' and set 'io.WantSetMousePos' to notify you that it wants the mouse cursor to be moved.
+ When that happens your backend NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the backends in examples/ do that.
+ (If you set the NavEnableSetMousePos flag but don't honor 'io.WantSetMousePos' properly, Dear ImGui will misbehave as it will see your mouse moving back & forth!)
+ (In a setup when you may not have easy control over the mouse cursor, e.g. uSynergy.c doesn't expose moving remote mouse cursor, you may want
+ to set a boolean to ignore your other external mouse positions until the external source is moved again.)
PROGRAMMER GUIDE
@@ -142,9 +199,11 @@ CODE
READ FIRST
----------
- Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki)
- - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or
- destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, fewer bugs.
+ - Your code creates the UI every frame of your application loop, if your code doesn't run the UI is gone!
+ The UI can be highly dynamic, there are no construction or destruction steps, less superfluous
+ data retention on your side, less state duplication, less state synchronization, fewer bugs.
- Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features.
+ Or browse https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html for interactive web version.
- The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build.
- Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori).
You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in Wiki.
@@ -152,18 +211,38 @@ CODE
For every application frame, your UI code will be called only once. This is in contrast to e.g. Unity's implementation of an IMGUI,
where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches.
- Our origin is on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right.
- - This codebase is also optimized to yield decent performances with typical "Debug" builds settings.
- Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected).
If you get an assert, read the messages and comments around the assert.
- - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace.
- - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types.
- See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that.
- However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase.
- - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!).
+ - This codebase aims to be highly optimized:
+ - A typical idle frame should never call malloc/free.
+ - We rely on a maximum of constant-time or O(N) algorithms. Limiting searches/scans as much as possible.
+ - We put particular energy in making sure performances are decent with typical "Debug" build settings as well.
+ Which mean we tend to avoid over-relying on "zero-cost abstraction" as they aren't zero-cost at all.
+ - This codebase aims to be both highly opinionated and highly flexible:
+ - This code works because of the things it choose to solve or not solve.
+ - C++: this is a pragmatic C-ish codebase: we don't use fancy C++ features, we don't include C++ headers,
+ and ImGui:: is a namespace. We rarely use member functions (and when we did, I am mostly regretting it now).
+ This is to increase compatibility, increase maintainability and facilitate use from other languages.
+ - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types.
+ See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that.
+ We can can optionally export math operators for ImVec2/ImVec4 using IMGUI_DEFINE_MATH_OPERATORS, which we use internally.
+ - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction
+ (so don't use ImVector in your code or at our own risk!).
+ - Building: We don't use nor mandate a build system for the main library.
+ This is in an effort to ensure that it works in the real world aka with any esoteric build setup.
+ This is also because providing a build system for the main library would be of little-value.
+ The build problems are almost never coming from the main library but from specific backends.
HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
----------------------------------------------
+ - Update submodule or copy/overwrite every file.
+ - About imconfig.h:
+ - You may modify your copy of imconfig.h, in this case don't overwrite it.
+ - or you may locally branch to modify imconfig.h and merge/rebase latest.
+ - or you may '#define IMGUI_USER_CONFIG "my_config_file.h"' globally from your build system to
+ specify a custom path for your imconfig.h file and instead not have to modify the default one.
+
- Overwrite all the sources files except for imconfig.h (if you have modified your copy of imconfig.h)
- Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over "master".
- You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file.
@@ -172,11 +251,12 @@ CODE
from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will
likely be a comment about it. Please report any issue to the GitHub page!
- To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file.
- - Try to keep your copy of Dear ImGui reasonably up to date.
+ - Try to keep your copy of Dear ImGui reasonably up to date!
GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
---------------------------------------------------------------
+ - See https://github.com/ocornut/imgui/wiki/Getting-Started.
- Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library.
- In the majority of cases you should be able to use unmodified backends files available in the backends/ folder.
- Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system.
@@ -240,7 +320,7 @@ CODE
// Build and load the texture atlas into a texture
// (In the examples/ app this is usually done within the ImGui_ImplXXX_Init() function from one of the demo Renderer)
int width, height;
- unsigned char* pixels = NULL;
+ unsigned char* pixels = nullptr;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// At this point you've got the texture data and you need to upload that to your graphic system:
@@ -284,7 +364,7 @@ CODE
To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application,
you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags!
- Please read the FAQ and example applications for details about this!
+ Please read the FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" about this.
HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
@@ -343,40 +423,6 @@ CODE
}
- USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
- ------------------------------------------
- - The gamepad/keyboard navigation is fairly functional and keeps being improved.
- - Gamepad support is particularly useful to use Dear ImGui on a console system (e.g. PlayStation, Switch, Xbox) without a mouse!
- - The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable.
- - Keyboard:
- - Application: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable.
- - When keyboard navigation is active (io.NavActive + ImGuiConfigFlags_NavEnableKeyboard),
- the io.WantCaptureKeyboard flag will be set. For more advanced uses, you may want to read from:
- - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set.
- - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used).
- - or query focus information with e.g. IsWindowFocused(ImGuiFocusedFlags_AnyWindow), IsItemFocused() etc. functions.
- Please reach out if you think the game vs navigation input sharing could be improved.
- - Gamepad:
- - Application: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable.
- - Backend: Set io.BackendFlags |= ImGuiBackendFlags_HasGamepad + call io.AddKeyEvent/AddKeyAnalogEvent() with ImGuiKey_Gamepad_XXX keys.
- For analog values (0.0f to 1.0f), backend is responsible to handling a dead-zone and rescaling inputs accordingly.
- Backend code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.).
- - BEFORE 1.87, BACKENDS USED TO WRITE TO io.NavInputs[]. This is now obsolete. Please call io functions instead!
- - You can download PNG/PSD files depicting the gamepad controls for common controllers at: http://dearimgui.org/controls_sheets
- - If you need to share inputs between your game and the Dear ImGui interface, the easiest approach is to go all-or-nothing,
- with a buttons combo to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved.
- - Mouse:
- - PS4/PS5 users: Consider emulating a mouse cursor with DualShock4 touch pad or a spare analog stick as a mouse-emulation fallback.
- - Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + uSynergy.c (on your console/tablet/phone app) to share your PC mouse/keyboard.
- - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the ImGuiConfigFlags_NavEnableSetMousePos flag.
- Enabling ImGuiConfigFlags_NavEnableSetMousePos + ImGuiBackendFlags_HasSetMousePos instructs dear imgui to move your mouse cursor along with navigation movements.
- When enabled, the NewFrame() function may alter 'io.MousePos' and set 'io.WantSetMousePos' to notify you that it wants the mouse cursor to be moved.
- When that happens your backend NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the backends in examples/ do that.
- (If you set the NavEnableSetMousePos flag but don't honor 'io.WantSetMousePos' properly, imgui will misbehave as it will see your mouse moving back and forth!)
- (In a setup when you may not have easy control over the mouse cursor, e.g. uSynergy.c doesn't expose moving remote mouse cursor, you may want
- to set a boolean to ignore your other external mouse positions until the external source is moved again.)
-
-
API BREAKING CHANGES
====================
@@ -385,16 +431,196 @@ CODE
When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
- - 2022/10/26 (1.89) - commented out redirecting OpenPopupContextItem() which was briefly the name of OpenPopupOnItemClick() from 1.77 to 1.79.
- - 2022/10/12 (1.89) - removed runtime patching of invalid "%f"/"%0.f" format strings for DragInt()/SliderInt(). This was obsoleted in 1.61 (May 2018). See 1.61 changelog for details.
- - 2022/09/26 (1.89) - renamed and merged keyboard modifiers key enums and flags into a same set. Kept inline redirection enums (will obsolete).
- - ImGuiKey_ModCtrl and ImGuiModFlags_Ctrl -> ImGuiMod_Ctrl
- - ImGuiKey_ModShift and ImGuiModFlags_Shift -> ImGuiMod_Shift
- - ImGuiKey_ModAlt and ImGuiModFlags_Alt -> ImGuiMod_Alt
- - ImGuiKey_ModSuper and ImGuiModFlags_Super -> ImGuiMod_Super
- the ImGuiKey_ModXXX were introduced in 1.87 and mostly used by backends.
- the ImGuiModFlags_XXX have been exposed in imgui.h but not really used by any public api only by third-party extensions.
- exceptionally commenting out the older ImGuiKeyModFlags_XXX names ahead of obsolescence schedule to reduce confusion and because they were not meant to be used anyway.
+ - 2025/03/05 (1.91.9) - BeginMenu(): Internals: reworked mangling of menu windows to use "###Menu_00" etc. instead of "##Menu_00", allowing them to also store the menu name before it. This shouldn't affect code unless directly accessing menu window from their mangled name.
+ - 2025/02/27 (1.91.9) - Image(): removed 'tint_col' and 'border_col' parameter from Image() function. Added ImageWithBg() replacement. (#8131, #8238)
+ - old: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1), ImVec4 tint_col = (1,1,1,1), ImVec4 border_col = (0,0,0,0));
+ - new: void Image (ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1));
+ - new: void ImageWithBg(ImTextureID tex_id, ImVec2 image_size, ImVec2 uv0 = (0,0), ImVec2 uv1 = (1,1), ImVec4 bg_col = (0,0,0,0), ImVec4 tint_col = (1,1,1,1));
+ - TL;DR: 'border_col' had misleading side-effect on layout, 'bg_col' was missing, parameter order couldn't be consistent with ImageButton().
+ - new behavior always use ImGuiCol_Border color + style.ImageBorderSize / ImGuiStyleVar_ImageBorderSize.
+ - old behavior altered border size (and therefore layout) based on border color's alpha, which caused variety of problems + old behavior a fixed 1.0f for border size which was not tweakable.
+ - kept legacy signature (will obsolete), which mimics the old behavior, but uses Max(1.0f, style.ImageBorderSize) when border_col is specified.
+ - added ImageWithBg() function which has both 'bg_col' (which was missing) and 'tint_col'. It was impossible to add 'bg_col' to Image() with a parameter order consistent with other functions, so we decided to remove 'tint_col' and introduce ImageWithBg().
+ - 2025/02/25 (1.91.9) - internals: fonts: ImFontAtlas::ConfigData[] has been renamed to ImFontAtlas::Sources[]. ImFont::ConfigData[], ConfigDataCount has been renamed to Sources[], SourcesCount.
+ - 2025/02/06 (1.91.9) - renamed ImFontConfig::GlyphExtraSpacing.x to ImFontConfig::GlyphExtraAdvanceX.
+ - 2025/01/22 (1.91.8) - removed ImGuiColorEditFlags_AlphaPreview (made value 0): it is now the default behavior.
+ prior to 1.91.8: alpha was made opaque in the preview by default _unless_ using ImGuiColorEditFlags_AlphaPreview. We now display the preview as transparent by default. You can use ImGuiColorEditFlags_AlphaOpaque to use old behavior.
+ the new flags (ImGuiColorEditFlags_AlphaOpaque, ImGuiColorEditFlags_AlphaNoBg + existing ImGuiColorEditFlags_AlphaPreviewHalf) may be combined better and allow finer controls:
+ - 2025/01/14 (1.91.7) - renamed ImGuiTreeNodeFlags_SpanTextWidth to ImGuiTreeNodeFlags_SpanLabelWidth for consistency with other names. Kept redirection enum (will obsolete). (#6937)
+ - 2024/11/27 (1.91.6) - changed CRC32 table from CRC32-adler to CRC32c polynomial in order to be compatible with the result of SSE 4.2 instructions.
+ As a result, old .ini data may be partially lost (docking and tables information particularly).
+ Because some users have crafted and storing .ini data as a way to workaround limitations of the docking API, we are providing a '#define IMGUI_USE_LEGACY_CRC32_ADLER' compile-time option to keep using old CRC32 tables if you cannot afford invalidating old .ini data.
+ - 2024/11/06 (1.91.5) - commented/obsoleted out pre-1.87 IO system (equivalent to using IMGUI_DISABLE_OBSOLETE_KEYIO or IMGUI_DISABLE_OBSOLETE_FUNCTIONS before)
+ - io.KeyMap[] and io.KeysDown[] are removed (obsoleted February 2022).
+ - io.NavInputs[] and ImGuiNavInput are removed (obsoleted July 2022).
+ - pre-1.87 backends are not supported:
+ - backends need to call io.AddKeyEvent(), io.AddMouseEvent() instead of writing to io.KeysDown[], io.MouseDown[] fields.
+ - backends need to call io.AddKeyAnalogEvent() for gamepad values instead of writing to io.NavInputs[] fields.
+ - for more reference:
+ - read 1.87 and 1.88 part of this section or read Changelog for 1.87 and 1.88.
+ - read https://github.com/ocornut/imgui/issues/4921
+ - if you have trouble updating a very old codebase using legacy backend-specific key codes: consider updating to 1.91.4 first, then #define IMGUI_DISABLE_OBSOLETE_KEYIO, then update to latest.
+ - obsoleted ImGuiKey_COUNT (it is unusually error-prone/misleading since valid keys don't start at 0). probably use ImGuiKey_NamedKey_BEGIN/ImGuiKey_NamedKey_END?
+ - fonts: removed const qualifiers from most font functions in prevision for upcoming font improvements.
+ - 2024/10/18 (1.91.4) - renamed ImGuiCol_NavHighlight to ImGuiCol_NavCursor (for consistency with newly exposed and reworked features). Kept inline redirection enum (will obsolete).
+ - 2024/10/14 (1.91.4) - moved ImGuiConfigFlags_NavEnableSetMousePos to standalone io.ConfigNavMoveSetMousePos bool.
+ moved ImGuiConfigFlags_NavNoCaptureKeyboard to standalone io.ConfigNavCaptureKeyboard bool (note the inverted value!).
+ kept legacy names (will obsolete) + code that copies settings once the first time. Dynamically changing the old value won't work. Switch to using the new value!
+ - 2024/10/10 (1.91.4) - the typedef for ImTextureID now defaults to ImU64 instead of void*. (#1641)
+ this removes the requirement to redefine it for backends which are e.g. storing descriptor sets or other 64-bits structures when building on 32-bits archs. It therefore simplify various building scripts/helpers.
+ you may have compile-time issues if you were casting to 'void*' instead of 'ImTextureID' when passing your types to functions taking ImTextureID values, e.g. ImGui::Image().
+ in doubt it is almost always better to do an intermediate intptr_t cast, since it allows casting any pointer/integer type without warning:
+ - May warn: ImGui::Image((void*)MyTextureData, ...);
+ - May warn: ImGui::Image((void*)(intptr_t)MyTextureData, ...);
+ - Won't warn: ImGui::Image((ImTextureID)(intptr_t)MyTextureData), ...);
+ - note that you can always define ImTextureID to be your own high-level structures (with dedicated constructors) if you like.
+ - 2024/10/03 (1.91.3) - drags: treat v_min==v_max as a valid clamping range when != 0.0f. Zero is a still special value due to legacy reasons, unless using ImGuiSliderFlags_ClampZeroRange. (#7968, #3361, #76)
+ - drags: extended behavior of ImGuiSliderFlags_AlwaysClamp to include _ClampZeroRange. It considers v_min==v_max==0.0f as a valid clamping range (aka edits not allowed).
+ although unlikely, it you wish to only clamp on text input but want v_min==v_max==0.0f to mean unclamped drags, you can use _ClampOnInput instead of _AlwaysClamp. (#7968, #3361, #76)
+ - 2024/09/10 (1.91.2) - internals: using multiple overlayed ButtonBehavior() with same ID will now have io.ConfigDebugHighlightIdConflicts=true feature emit a warning. (#8030)
+ it was one of the rare case where using same ID is legal. workarounds: (1) use single ButtonBehavior() call with multiple _MouseButton flags, or (2) surround the calls with PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true); ... PopItemFlag()
+ - 2024/08/23 (1.91.1) - renamed ImGuiChildFlags_Border to ImGuiChildFlags_Borders for consistency. kept inline redirection flag.
+ - 2024/08/22 (1.91.1) - moved some functions from ImGuiIO to ImGuiPlatformIO structure:
+ - io.GetClipboardTextFn -> platform_io.Platform_GetClipboardTextFn + changed 'void* user_data' to 'ImGuiContext* ctx'. Pull your user data from platform_io.ClipboardUserData.
+ - io.SetClipboardTextFn -> platform_io.Platform_SetClipboardTextFn + same as above line.
+ - io.PlatformOpenInShellFn -> platform_io.Platform_OpenInShellFn (#7660)
+ - io.PlatformSetImeDataFn -> platform_io.Platform_SetImeDataFn
+ - io.PlatformLocaleDecimalPoint -> platform_io.Platform_LocaleDecimalPoint (#7389, #6719, #2278)
+ - access those via GetPlatformIO() instead of GetIO().
+ some were introduced very recently and often automatically setup by core library and backends, so for those we are exceptionally not maintaining a legacy redirection symbol.
+ - commented the old ImageButton() signature obsoleted in 1.89 (~August 2022). As a reminder:
+ - old ImageButton() before 1.89 used ImTextureId as item id (created issue with e.g. multiple buttons in same scope, transient texture id values, opaque computation of ID)
+ - new ImageButton() since 1.89 requires an explicit 'const char* str_id'
+ - old ImageButton() before 1.89 had frame_padding' override argument.
+ - new ImageButton() since 1.89 always use style.FramePadding, which you can freely override with PushStyleVar()/PopStyleVar().
+ - 2024/07/25 (1.91.0) - obsoleted GetContentRegionMax(), GetWindowContentRegionMin() and GetWindowContentRegionMax(). (see #7838 on GitHub for more info)
+ you should never need those functions. you can do everything with GetCursorScreenPos() and GetContentRegionAvail() in a more simple way.
+ - instead of: GetWindowContentRegionMax().x - GetCursorPos().x
+ - you can use: GetContentRegionAvail().x
+ - instead of: GetWindowContentRegionMax().x + GetWindowPos().x
+ - you can use: GetCursorScreenPos().x + GetContentRegionAvail().x // when called from left edge of window
+ - instead of: GetContentRegionMax()
+ - you can use: GetContentRegionAvail() + GetCursorScreenPos() - GetWindowPos() // right edge in local coordinates
+ - instead of: GetWindowContentRegionMax().x - GetWindowContentRegionMin().x
+ - you can use: GetContentRegionAvail() // when called from left edge of window
+ - 2024/07/15 (1.91.0) - renamed ImGuiSelectableFlags_DontClosePopups to ImGuiSelectableFlags_NoAutoClosePopups. (#1379, #1468, #2200, #4936, #5216, #7302, #7573)
+ (internals: also renamed ImGuiItemFlags_SelectableDontClosePopup into ImGuiItemFlags_AutoClosePopups with inverted behaviors)
+ - 2024/07/15 (1.91.0) - obsoleted PushButtonRepeat()/PopButtonRepeat() in favor of using new PushItemFlag(ImGuiItemFlags_ButtonRepeat, ...)/PopItemFlag().
+ - 2024/07/02 (1.91.0) - commented out obsolete ImGuiModFlags (renamed to ImGuiKeyChord in 1.89). (#4921, #456)
+ - commented out obsolete ImGuiModFlags_XXX values (renamed to ImGuiMod_XXX in 1.89). (#4921, #456)
+ - ImGuiModFlags_Ctrl -> ImGuiMod_Ctrl, ImGuiModFlags_Shift -> ImGuiMod_Shift etc.
+ - 2024/07/02 (1.91.0) - IO, IME: renamed platform IME hook and added explicit context for consistency and future-proofness.
+ - old: io.SetPlatformImeDataFn(ImGuiViewport* viewport, ImGuiPlatformImeData* data);
+ - new: io.PlatformSetImeDataFn(ImGuiContext* ctx, ImGuiViewport* viewport, ImGuiPlatformImeData* data);
+ - 2024/06/21 (1.90.9) - BeginChild: added ImGuiChildFlags_NavFlattened as a replacement for the window flag ImGuiWindowFlags_NavFlattened: the feature only ever made sense for BeginChild() anyhow.
+ - old: BeginChild("Name", size, 0, ImGuiWindowFlags_NavFlattened);
+ - new: BeginChild("Name", size, ImGuiChildFlags_NavFlattened, 0);
+ - 2024/06/21 (1.90.9) - io: ClearInputKeys() (first exposed in 1.89.8) doesn't clear mouse data, newly added ClearInputMouse() does.
+ - 2024/06/20 (1.90.9) - renamed ImGuiDragDropFlags_SourceAutoExpirePayload to ImGuiDragDropFlags_PayloadAutoExpire.
+ - 2024/06/18 (1.90.9) - style: renamed ImGuiCol_TabActive -> ImGuiCol_TabSelected, ImGuiCol_TabUnfocused -> ImGuiCol_TabDimmed, ImGuiCol_TabUnfocusedActive -> ImGuiCol_TabDimmedSelected.
+ - 2024/06/10 (1.90.9) - removed old nested structure: renaming ImGuiStorage::ImGuiStoragePair type to ImGuiStoragePair (simpler for many languages).
+ - 2024/06/06 (1.90.8) - reordered ImGuiInputTextFlags values. This should not be breaking unless you are using generated headers that have values not matching the main library.
+ - 2024/06/06 (1.90.8) - removed 'ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft', was mostly unused and misleading.
+ - 2024/05/27 (1.90.7) - commented out obsolete symbols marked obsolete in 1.88 (May 2022):
+ - old: CaptureKeyboardFromApp(bool)
+ - new: SetNextFrameWantCaptureKeyboard(bool)
+ - old: CaptureMouseFromApp(bool)
+ - new: SetNextFrameWantCaptureMouse(bool)
+ - 2024/05/22 (1.90.7) - inputs (internals): renamed ImGuiKeyOwner_None to ImGuiKeyOwner_NoOwner, to make use more explicit and reduce confusion with the default it is a non-zero value and cannot be the default value (never made public, but disclosing as I expect a few users caught on owner-aware inputs).
+ - inputs (internals): renamed ImGuiInputFlags_RouteGlobalLow -> ImGuiInputFlags_RouteGlobal, ImGuiInputFlags_RouteGlobal -> ImGuiInputFlags_RouteGlobalOverFocused, ImGuiInputFlags_RouteGlobalHigh -> ImGuiInputFlags_RouteGlobalHighest.
+ - inputs (internals): Shortcut(), SetShortcutRouting(): swapped last two parameters order in function signatures:
+ - old: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
+ - new: Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0);
+ - inputs (internals): owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(): swapped last two parameters order in function signatures.
+ - old: IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
+ - new: IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0);
+ - old: IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0);
+ - new: IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);
+ for various reasons those changes makes sense. They are being made because making some of those API public.
+ only past users of imgui_internal.h with the extra parameters will be affected. Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL.
+ - 2024/05/16 (1.90.7) - inputs: on macOS X, Cmd and Ctrl keys are now automatically swapped by io.AddKeyEvent() as this naturally align with how macOS X uses those keys.
+ - it shouldn't really affect you unless you had custom shortcut swapping in place for macOS X apps.
+ - removed ImGuiMod_Shortcut which was previously dynamically remapping to Ctrl or Cmd/Super. It is now unnecessary to specific cross-platform idiomatic shortcuts. (#2343, #4084, #5923, #456)
+ - 2024/05/14 (1.90.7) - backends: SDL_Renderer2 and SDL_Renderer3 backend now take a SDL_Renderer* in their RenderDrawData() functions.
+ - 2024/04/18 (1.90.6) - TreeNode: Fixed a layout inconsistency when using an empty/hidden label followed by a SameLine() call. (#7505, #282)
+ - old: TreeNode("##Hidden"); SameLine(); Text("Hello"); // <-- This was actually incorrect! BUT appeared to look ok with the default style where ItemSpacing.x == FramePadding.x * 2 (it didn't look aligned otherwise).
+ - new: TreeNode("##Hidden"); SameLine(0, 0); Text("Hello"); // <-- This is correct for all styles values.
+ with the fix, IF you were successfully using TreeNode("")+SameLine(); you will now have extra spacing between your TreeNode and the following item.
+ You'll need to change the SameLine() call to SameLine(0,0) to remove this extraneous spacing. This seemed like the more sensible fix that's not making things less consistent.
+ (Note: when using this idiom you are likely to also use ImGuiTreeNodeFlags_SpanAvailWidth).
+ - 2024/03/18 (1.90.5) - merged the radius_x/radius_y parameters in ImDrawList::AddEllipse(), AddEllipseFilled() and PathEllipticalArcTo() into a single ImVec2 parameter. Exceptionally, because those functions were added in 1.90, we are not adding inline redirection functions. The transition is easy and should affect few users. (#2743, #7417)
+ - 2024/03/08 (1.90.5) - inputs: more formally obsoleted GetKeyIndex() when IMGUI_DISABLE_OBSOLETE_FUNCTIONS is set. It has been unnecessary and a no-op since 1.87 (it returns the same value as passed when used with a 1.87+ backend using io.AddKeyEvent() function). (#4921)
+ - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
+ - 2024/01/15 (1.90.2) - commented out obsolete ImGuiIO::ImeWindowHandle marked obsolete in 1.87, favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'.
+ - 2023/12/19 (1.90.1) - commented out obsolete ImGuiKey_KeyPadEnter redirection to ImGuiKey_KeypadEnter.
+ - 2023/11/06 (1.90.1) - removed CalcListClipping() marked obsolete in 1.86. Prefer using ImGuiListClipper which can return non-contiguous ranges.
+ - 2023/11/05 (1.90.1) - imgui_freetype: commented out ImGuiFreeType::BuildFontAtlas() obsoleted in 1.81. prefer using #define IMGUI_ENABLE_FREETYPE or see commented code for manual calls.
+ - 2023/11/05 (1.90.1) - internals,columns: commented out legacy ImGuiColumnsFlags_XXX symbols redirecting to ImGuiOldColumnsFlags_XXX, obsoleted from imgui_internal.h in 1.80.
+ - 2023/11/09 (1.90.0) - removed IM_OFFSETOF() macro in favor of using offsetof() available in C++11. Kept redirection define (will obsolete).
+ - 2023/11/07 (1.90.0) - removed BeginChildFrame()/EndChildFrame() in favor of using BeginChild() with the ImGuiChildFlags_FrameStyle flag. kept inline redirection function (will obsolete).
+ those functions were merely PushStyle/PopStyle helpers, the removal isn't so much motivated by needing to add the feature in BeginChild(), but by the necessity to avoid BeginChildFrame() signature mismatching BeginChild() signature and features.
+ - 2023/11/02 (1.90.0) - BeginChild: upgraded 'bool border = true' parameter to 'ImGuiChildFlags flags' type, added ImGuiChildFlags_Border equivalent. As with our prior "bool-to-flags" API updates, the ImGuiChildFlags_Border value is guaranteed to be == true forever to ensure a smoother transition, meaning all existing calls will still work.
+ - old: BeginChild("Name", size, true)
+ - new: BeginChild("Name", size, ImGuiChildFlags_Border)
+ - old: BeginChild("Name", size, false)
+ - new: BeginChild("Name", size) or BeginChild("Name", 0) or BeginChild("Name", size, ImGuiChildFlags_None)
+ **AMEND FROM THE FUTURE: from 1.91.1, 'ImGuiChildFlags_Border' is called 'ImGuiChildFlags_Borders'**
+ - 2023/11/02 (1.90.0) - BeginChild: added child-flag ImGuiChildFlags_AlwaysUseWindowPadding as a replacement for the window-flag ImGuiWindowFlags_AlwaysUseWindowPadding: the feature only ever made sense for BeginChild() anyhow.
+ - old: BeginChild("Name", size, 0, ImGuiWindowFlags_AlwaysUseWindowPadding);
+ - new: BeginChild("Name", size, ImGuiChildFlags_AlwaysUseWindowPadding, 0);
+ - 2023/09/27 (1.90.0) - io: removed io.MetricsActiveAllocations introduced in 1.63. Same as 'g.DebugMemAllocCount - g.DebugMemFreeCount' (still displayed in Metrics, unlikely to be accessed by end-user).
+ - 2023/09/26 (1.90.0) - debug tools: Renamed ShowStackToolWindow() ("Stack Tool") to ShowIDStackToolWindow() ("ID Stack Tool"), as earlier name was misleading. Kept inline redirection function. (#4631)
+ - 2023/09/15 (1.90.0) - ListBox, Combo: changed signature of "name getter" callback in old one-liner ListBox()/Combo() apis. kept inline redirection function (will obsolete).
+ - old: bool Combo(const char* label, int* current_item, bool (*getter)(void* user_data, int idx, const char** out_text), ...)
+ - new: bool Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), ...);
+ - old: bool ListBox(const char* label, int* current_item, bool (*getting)(void* user_data, int idx, const char** out_text), ...);
+ - new: bool ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), ...);
+ - 2023/09/08 (1.90.0) - commented out obsolete redirecting functions:
+ - GetWindowContentRegionWidth() -> use GetWindowContentRegionMax().x - GetWindowContentRegionMin().x. Consider that generally 'GetContentRegionAvail().x' is more useful.
+ - ImDrawCornerFlags_XXX -> use ImDrawFlags_RoundCornersXXX flags. Read 1.82 Changelog for details + grep commented names in sources.
+ - commented out runtime support for hardcoded ~0 or 0x01..0x0F rounding flags values for AddRect()/AddRectFilled()/PathRect()/AddImageRounded() -> use ImDrawFlags_RoundCornersXXX flags. Read 1.82 Changelog for details
+ - 2023/08/25 (1.89.9) - clipper: Renamed IncludeRangeByIndices() (also called ForceDisplayRangeByIndices() before 1.89.6) to IncludeItemsByIndex(). Kept inline redirection function. Sorry!
+ - 2023/07/12 (1.89.8) - ImDrawData: CmdLists now owned, changed from ImDrawList** to ImVector<ImDrawList*>. Majority of users shouldn't be affected, but you cannot compare to NULL nor reassign manually anymore. Instead use AddDrawList(). (#6406, #4879, #1878)
+ - 2023/06/28 (1.89.7) - overlapping items: obsoleted 'SetItemAllowOverlap()' (called after item) in favor of calling 'SetNextItemAllowOverlap()' (called before item). 'SetItemAllowOverlap()' didn't and couldn't work reliably since 1.89 (2022-11-15).
+ - 2023/06/28 (1.89.7) - overlapping items: renamed 'ImGuiTreeNodeFlags_AllowItemOverlap' to 'ImGuiTreeNodeFlags_AllowOverlap', 'ImGuiSelectableFlags_AllowItemOverlap' to 'ImGuiSelectableFlags_AllowOverlap'. Kept redirecting enums (will obsolete).
+ - 2023/06/28 (1.89.7) - overlapping items: IsItemHovered() now by default return false when querying an item using AllowOverlap mode which is being overlapped. Use ImGuiHoveredFlags_AllowWhenOverlappedByItem to revert to old behavior.
+ - 2023/06/28 (1.89.7) - overlapping items: Selectable and TreeNode don't allow overlap when active so overlapping widgets won't appear as hovered. While this fixes a common small visual issue, it also means that calling IsItemHovered() after a non-reactive elements - e.g. Text() - overlapping an active one may fail if you don't use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem). (#6610)
+ - 2023/06/20 (1.89.7) - moved io.HoverDelayShort/io.HoverDelayNormal to style.HoverDelayShort/style.HoverDelayNormal. As the fields were added in 1.89 and expected to be left unchanged by most users, or only tweaked once during app initialization, we are exceptionally accepting the breakage.
+ - 2023/05/30 (1.89.6) - backends: renamed "imgui_impl_sdlrenderer.cpp" to "imgui_impl_sdlrenderer2.cpp" and "imgui_impl_sdlrenderer.h" to "imgui_impl_sdlrenderer2.h". This is in prevision for the future release of SDL3.
+ - 2023/05/22 (1.89.6) - listbox: commented out obsolete/redirecting functions that were marked obsolete more than two years ago:
+ - ListBoxHeader() -> use BeginListBox() (note how two variants of ListBoxHeader() existed. Check commented versions in imgui.h for reference)
+ - ListBoxFooter() -> use EndListBox()
+ - 2023/05/15 (1.89.6) - clipper: commented out obsolete redirection constructor 'ImGuiListClipper(int items_count, float items_height = -1.0f)' that was marked obsolete in 1.79. Use default constructor + clipper.Begin().
+ - 2023/05/15 (1.89.6) - clipper: renamed ImGuiListClipper::ForceDisplayRangeByIndices() to ImGuiListClipper::IncludeRangeByIndices().
+ - 2023/03/14 (1.89.4) - commented out redirecting enums/functions names that were marked obsolete two years ago:
+ - ImGuiSliderFlags_ClampOnInput -> use ImGuiSliderFlags_AlwaysClamp
+ - ImGuiInputTextFlags_AlwaysInsertMode -> use ImGuiInputTextFlags_AlwaysOverwrite
+ - ImDrawList::AddBezierCurve() -> use ImDrawList::AddBezierCubic()
+ - ImDrawList::PathBezierCurveTo() -> use ImDrawList::PathBezierCubicCurveTo()
+ - 2023/03/09 (1.89.4) - renamed PushAllowKeyboardFocus()/PopAllowKeyboardFocus() to PushTabStop()/PopTabStop(). Kept inline redirection functions (will obsolete).
+ - 2023/03/09 (1.89.4) - tooltips: Added 'bool' return value to BeginTooltip() for API consistency. Please only submit contents and call EndTooltip() if BeginTooltip() returns true. In reality the function will _currently_ always return true, but further changes down the line may change this, best to clarify API sooner.
+ - 2023/02/15 (1.89.4) - moved the optional "courtesy maths operators" implementation from imgui_internal.h in imgui.h.
+ Even though we encourage using your own maths types and operators by setting up IM_VEC2_CLASS_EXTRA,
+ it has been frequently requested by people to use our own. We had an opt-in define which was
+ previously fulfilled in imgui_internal.h. It is now fulfilled in imgui.h. (#6164)
+ - OK: #define IMGUI_DEFINE_MATH_OPERATORS / #include "imgui.h" / #include "imgui_internal.h"
+ - Error: #include "imgui.h" / #define IMGUI_DEFINE_MATH_OPERATORS / #include "imgui_internal.h"
+ - 2023/02/07 (1.89.3) - backends: renamed "imgui_impl_sdl.cpp" to "imgui_impl_sdl2.cpp" and "imgui_impl_sdl.h" to "imgui_impl_sdl2.h". (#6146) This is in prevision for the future release of SDL3.
+ - 2022/10/26 (1.89) - commented out redirecting OpenPopupContextItem() which was briefly the name of OpenPopupOnItemClick() from 1.77 to 1.79.
+ - 2022/10/12 (1.89) - removed runtime patching of invalid "%f"/"%0.f" format strings for DragInt()/SliderInt(). This was obsoleted in 1.61 (May 2018). See 1.61 changelog for details.
+ - 2022/09/26 (1.89) - renamed and merged keyboard modifiers key enums and flags into a same set. Kept inline redirection enums (will obsolete).
+ - ImGuiKey_ModCtrl and ImGuiModFlags_Ctrl -> ImGuiMod_Ctrl
+ - ImGuiKey_ModShift and ImGuiModFlags_Shift -> ImGuiMod_Shift
+ - ImGuiKey_ModAlt and ImGuiModFlags_Alt -> ImGuiMod_Alt
+ - ImGuiKey_ModSuper and ImGuiModFlags_Super -> ImGuiMod_Super
+ the ImGuiKey_ModXXX were introduced in 1.87 and mostly used by backends.
+ the ImGuiModFlags_XXX have been exposed in imgui.h but not really used by any public api only by third-party extensions.
+ exceptionally commenting out the older ImGuiKeyModFlags_XXX names ahead of obsolescence schedule to reduce confusion and because they were not meant to be used anyway.
+ - 2022/09/20 (1.89) - ImGuiKey is now a typed enum, allowing ImGuiKey_XXX symbols to be named in debuggers.
+ this will require uses of legacy backend-dependent indices to be casted, e.g.
+ - with imgui_impl_glfw: IsKeyPressed(GLFW_KEY_A) -> IsKeyPressed((ImGuiKey)GLFW_KEY_A);
+ - with imgui_impl_win32: IsKeyPressed('A') -> IsKeyPressed((ImGuiKey)'A')
+ - etc. However if you are upgrading code you might well use the better, backend-agnostic IsKeyPressed(ImGuiKey_A) now!
- 2022/09/12 (1.89) - removed the bizarre legacy default argument for 'TreePush(const void* ptr = NULL)', always pass a pointer value explicitly. NULL/nullptr is ok but require cast, e.g. TreePush((void*)nullptr);
- 2022/09/05 (1.89) - commented out redirecting functions/enums names that were marked obsolete in 1.77 and 1.78 (June 2020):
- DragScalar(), DragScalarN(), DragFloat(), DragFloat2(), DragFloat3(), DragFloat4(): For old signatures ending with (..., const char* format, float power = 1.0f) -> use (..., format ImGuiSliderFlags_Logarithmic) if power != 1.0f.
@@ -430,7 +656,7 @@ CODE
- 2022/04/05 (1.88) - inputs: renamed ImGuiKeyModFlags to ImGuiModFlags. Kept inline redirection enums (will obsolete). This was never used in public API functions but technically present in imgui.h and ImGuiIO.
- 2022/01/20 (1.87) - inputs: reworded gamepad IO.
- Backend writing to io.NavInputs[] -> backend should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values.
- - 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputing text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used).
+ - 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputting text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used).
- 2022/01/17 (1.87) - inputs: reworked mouse IO.
- Backend writing to io.MousePos -> backend should call io.AddMousePosEvent()
- Backend writing to io.MouseDown[] -> backend should call io.AddMouseButtonEvent()
@@ -438,7 +664,7 @@ CODE
- Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only]
note: for all calls to IO new functions, the Dear ImGui context should be bound/current.
read https://github.com/ocornut/imgui/issues/4921 for details.
- - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
+ - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(), ImGui::IsKeyDown(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
- Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes).
@@ -752,7 +978,7 @@ CODE
================================
Read all answers online:
- https://www.dearimgui.org/faq or https://github.com/ocornut/imgui/blob/master/docs/FAQ.md (same url)
+ https://www.dearimgui.com/faq or https://github.com/ocornut/imgui/blob/master/docs/FAQ.md (same url)
Read all answers locally (with a text editor or ideally a Markdown viewer):
docs/FAQ.md
Some answers are copied down here to facilitate searching in code.
@@ -762,11 +988,12 @@ CODE
Q: Where is the documentation?
A: This library is poorly documented at the moment and expects the user to be acquainted with C/C++.
- - Run the examples/ and explore them.
+ - Run the examples/ applications and explore them.
+ - Read Getting Started (https://github.com/ocornut/imgui/wiki/Getting-Started) guide.
- See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function.
- The demo covers most features of Dear ImGui, so you can read the code and see its output.
- See documentation and comments at the top of imgui.cpp + effectively imgui.h.
- - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the
+ - 20+ standalone example applications using e.g. OpenGL/DirectX are provided in the
examples/ folder to explain how to integrate Dear ImGui with your own engine/application.
- The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links.
- The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful.
@@ -776,24 +1003,24 @@ CODE
Q: What is this library called?
Q: Which version should I get?
>> This library is called "Dear ImGui", please don't call it "ImGui" :)
- >> See https://www.dearimgui.org/faq for details.
+ >> See https://www.dearimgui.com/faq for details.
Q&A: Integration
================
Q: How to get started?
- A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt.
+ A: Read https://github.com/ocornut/imgui/wiki/Getting-Started. Read 'PROGRAMMER GUIDE' above. Read examples/README.txt.
Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?
A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags!
- >> See https://www.dearimgui.org/faq for a fully detailed answer. You really want to read this.
+ >> See https://www.dearimgui.com/faq for a fully detailed answer. You really want to read this.
- Q. How can I enable keyboard controls?
- Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display)
+ Q. How can I enable keyboard or gamepad controls?
+ Q: How can I use this on a machine without mouse, keyboard or screen? (input share, remote display)
Q: I integrated Dear ImGui in my engine and little squares are showing instead of text...
Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around...
Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries...
- >> See https://www.dearimgui.org/faq
+ >> See https://www.dearimgui.com/faq
Q&A: Usage
----------
@@ -804,10 +1031,10 @@ CODE
- How can I have multiple widgets with the same label?
- How can I have multiple windows with the same label?
Q: How can I display an image? What is ImTextureID, how does it work?
- Q: How can I use my own math types instead of ImVec2/ImVec4?
+ Q: How can I use my own math types instead of ImVec2?
Q: How can I interact with standard C++ types (such as std::string and std::vector)?
Q: How can I display custom shapes? (using low-level ImDrawList API)
- >> See https://www.dearimgui.org/faq
+ >> See https://www.dearimgui.com/faq
Q&A: Fonts, Text
================
@@ -817,7 +1044,7 @@ CODE
Q: How can I easily use icons in my application?
Q: How can I load multiple fonts?
Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
- >> See https://www.dearimgui.org/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md
+ >> See https://www.dearimgui.com/faq and https://github.com/ocornut/imgui/blob/master/docs/FONTS.md
Q&A: Concerns
=============
@@ -826,18 +1053,18 @@ CODE
Q: Can you create elaborate/serious tools with Dear ImGui?
Q: Can you reskin the look of Dear ImGui?
Q: Why using C++ (as opposed to C)?
- >> See https://www.dearimgui.org/faq
+ >> See https://www.dearimgui.com/faq
Q&A: Community
==============
Q: How can I help?
- A: - Businesses: please reach out to "contact AT dearimgui.com" if you work in a place using Dear ImGui!
+ A: - Businesses: please reach out to "omar AT dearimgui DOT com" if you work in a place using Dear ImGui!
We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts.
- This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project.
- - Individuals: you can support continued development via PayPal donations. See README.
- - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, read docs/TODO.txt
- and see how you want to help and can help!
+ This is among the most useful thing you can do for Dear ImGui. With increased funding, we sustain and grow work on this project.
+ >>> See https://github.com/ocornut/imgui/wiki/Funding
+ - Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine.
+ - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, and see how you want to help and can help!
- Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
You may post screenshot or links in the gallery threads. Visuals are ideal as they inspire other programmers.
But even without visuals, disclosing your use of dear imgui helps the library grow credibility, and help other teams and programmers with taking decisions.
@@ -853,21 +1080,17 @@ CODE
#define _CRT_SECURE_NO_WARNINGS
#endif
-#include "imgui.h"
-#ifndef IMGUI_DISABLE
-
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
+
+#include "imgui.h"
+#ifndef IMGUI_DISABLE
#include "imgui_internal.h"
// System includes
#include <stdio.h> // vsnprintf, sscanf, printf
-#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
-#include <stddef.h> // intptr_t
-#else
#include <stdint.h> // intptr_t
-#endif
// [Windows] On non-Visual Studio compilers, we default to IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS unless explicitly enabled
#if defined(_WIN32) && !defined(_MSC_VER) && !defined(IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)
@@ -875,7 +1098,7 @@ CODE
#endif
// [Windows] OS specific includes (optional)
-#if defined(_WIN32) && defined(IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
+#if defined(_WIN32) && defined(IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) && defined(IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
#define IMGUI_DISABLE_WIN32_FUNCTIONS
#endif
#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
@@ -890,9 +1113,11 @@ CODE
#else
#include <windows.h>
#endif
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions
+#if defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_APP) && WINAPI_FAMILY == WINAPI_FAMILY_APP) || (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES))
+// The UWP and GDK Win32 API subsets don't support clipboard nor IME functions
#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
+#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
#endif
#endif
@@ -904,8 +1129,6 @@ CODE
// Visual Studio warnings
#ifdef _MSC_VER
#pragma warning (disable: 4127) // condition expression is constant
-#pragma warning (disable: 4201) // nonstandard extension used: nameless struct/union
-#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types
@@ -923,52 +1146,58 @@ CODE
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok.
+#pragma clang diagnostic ignored "-Wformat" // warning: format specifies type 'int' but the argument has type 'unsigned int'
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
+#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic.
#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.
#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
-#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic.
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type 'int'
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
+#pragma clang diagnostic ignored "-Wswitch-default" // warning: 'switch' missing 'default' label
#elif defined(__GNUC__)
// We disable -Wpragmas because GCC doesn't provide a has_warning equivalent and some forks/patches may not follow the warning/version association.
-#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
-#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
-#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
-#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*'
-#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
-#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
-#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
-#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
+#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
+#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'int'/'void*', but argument X has type 'unsigned int'/'ImGuiWindow*'
+#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
+#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
+#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
+#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
#endif
// Debug options
-#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL
+#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Hold CTRL to display for all candidates. CTRL+Arrow to change last direction.
#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window
-#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower)
// When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch.
static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in
static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear
-
-// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend)
-static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow().
+static const float NAV_ACTIVATE_HIGHLIGHT_TIMER = 0.10f; // Time to highlight an item activated by a shortcut.
static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time.
static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 0.70f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved.
+// Tooltip offset
+static const ImVec2 TOOLTIP_DEFAULT_OFFSET_MOUSE = ImVec2(16, 10); // Multiplied by g.Style.MouseCursorScale
+static const ImVec2 TOOLTIP_DEFAULT_OFFSET_TOUCH = ImVec2(0, -20); // Multiplied by g.Style.MouseCursorScale
+static const ImVec2 TOOLTIP_DEFAULT_PIVOT_TOUCH = ImVec2(0.5f, 1.0f); // Multiplied by g.Style.MouseCursorScale
+
//-------------------------------------------------------------------------
// [SECTION] FORWARD DECLARATIONS
//-------------------------------------------------------------------------
static void SetCurrentWindow(ImGuiWindow* window);
-static void FindHoveredWindow();
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags);
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window);
-static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window);
// Settings
@@ -978,16 +1207,25 @@ static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSetti
static void WindowSettingsHandler_ApplyAll(ImGuiContext*, ImGuiSettingsHandler*);
static void WindowSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf);
-// Platform Dependents default implementation for IO functions
-static const char* GetClipboardTextFn_DefaultImpl(void* user_data);
-static void SetClipboardTextFn_DefaultImpl(void* user_data, const char* text);
-static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data);
+// Platform Dependents default implementation for ImGuiPlatformIO functions
+static const char* Platform_GetClipboardTextFn_DefaultImpl(ImGuiContext* ctx);
+static void Platform_SetClipboardTextFn_DefaultImpl(ImGuiContext* ctx, const char* text);
+static void Platform_SetImeDataFn_DefaultImpl(ImGuiContext* ctx, ImGuiViewport* viewport, ImGuiPlatformImeData* data);
+static bool Platform_OpenInShellFn_DefaultImpl(ImGuiContext* ctx, const char* path);
namespace ImGui
{
+// Item
+static void ItemHandleShortcut(ImGuiID id);
+
+// Window Focus
+static int FindWindowFocusIndex(ImGuiWindow* window);
+static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags);
+
// Navigation
static void NavUpdate();
static void NavUpdateWindowing();
+static void NavUpdateWindowingApplyFocus(ImGuiWindow* window);
static void NavUpdateWindowingOverlay();
static void NavUpdateCancelRequest();
static void NavUpdateCreateMoveRequest();
@@ -999,34 +1237,41 @@ static void NavEndFrame();
static bool NavScoreItem(ImGuiNavItemData* result);
static void NavApplyItemToResult(ImGuiNavItemData* result);
static void NavProcessItem();
-static void NavProcessItemForTabbingRequest(ImGuiID id);
+static void NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flags, ImGuiNavMoveFlags move_flags);
+static ImGuiInputSource NavCalcPreferredRefPosSource();
static ImVec2 NavCalcPreferredRefPos();
static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window);
static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window);
static void NavRestoreLayer(ImGuiNavLayer layer);
-static void NavRestoreHighlightAfterMove();
-static int FindWindowFocusIndex(ImGuiWindow* window);
// Error Checking and Debug Tools
static void ErrorCheckNewFrameSanityChecks();
static void ErrorCheckEndFrameSanityChecks();
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
static void UpdateDebugToolItemPicker();
static void UpdateDebugToolStackQueries();
+static void UpdateDebugToolFlashStyleColor();
+#endif
-// Misc
-static void UpdateSettings();
+// Inputs
static void UpdateKeyboardInputs();
static void UpdateMouseInputs();
static void UpdateMouseWheel();
-static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect);
+static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt);
+
+// Misc
+static void UpdateSettings();
+static int UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect);
static void RenderWindowOuterBorders(ImGuiWindow* window);
-static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size);
+static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size);
static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open);
static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col);
static void RenderDimmedBackgrounds();
-static ImGuiWindow* FindBlockingModal(ImGuiWindow* window);
+static void SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect);
+static void SetLastItemDataForChildWindowItem(ImGuiWindow* window, const ImRect& rect);
// Viewports
+const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbitrary constant instead of e.g. ImHashStr("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter.
static void UpdateViewportsNewFrame();
}
@@ -1074,51 +1319,68 @@ static ImGuiMemFreeFunc GImAllocatorFreeFunc = FreeWrapper;
static void* GImAllocatorUserData = NULL;
//-----------------------------------------------------------------------------
-// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
+// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO, ImGuiPlatformIO)
//-----------------------------------------------------------------------------
ImGuiStyle::ImGuiStyle()
{
- Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui.
- DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha.
- WindowPadding = ImVec2(8,8); // Padding within a window
- WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended.
- WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested.
- WindowMinSize = ImVec2(32,32); // Minimum window size
- WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text
- WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left.
- ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows
- ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested.
- PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows
- PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested.
- FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets)
- FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets).
- FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested.
- ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines
- ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
- CellPadding = ImVec2(4,2); // Padding within a table cell
- TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
- IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
- ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
- ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar
- ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar
- GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar
- GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
- LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero.
- TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs.
- TabBorderSize = 0.0f; // Thickness of border around tabs.
- TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected.
- ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right.
- ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text.
- SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line.
- DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows.
- DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.
- MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
- AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU.
- AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering).
- AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.).
- CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
- CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
+ Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui.
+ DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha.
+ WindowPadding = ImVec2(8,8); // Padding within a window
+ WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended.
+ WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested.
+ WindowBorderHoverPadding = 4.0f; // Hit-testing extent outside/inside resizing border. Also extend determination of hovered window. Generally meaningfully larger than WindowBorderSize to make it easy to reach borders.
+ WindowMinSize = ImVec2(32,32); // Minimum window size
+ WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text
+ WindowMenuButtonPosition = ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left.
+ ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows
+ ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested.
+ PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows
+ PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested.
+ FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets)
+ FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets).
+ FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested.
+ ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines
+ ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
+ CellPadding = ImVec2(4,2); // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows.
+ TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
+ IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
+ ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
+ ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar
+ ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar
+ GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar
+ GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
+ LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero.
+ ImageBorderSize = 0.0f; // Thickness of border around tabs.
+ TabRounding = 5.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs.
+ TabBorderSize = 0.0f; // Thickness of border around tabs.
+ TabCloseButtonMinWidthSelected = -1.0f; // -1: always visible. 0.0f: visible when hovered. >0.0f: visible when hovered if minimum width.
+ TabCloseButtonMinWidthUnselected = 0.0f; // -1: always visible. 0.0f: visible when hovered. >0.0f: visible when hovered if minimum width. FLT_MAX: never show close button when unselected.
+ TabBarBorderSize = 1.0f; // Thickness of tab-bar separator, which takes on the tab active color to denote focus.
+ TabBarOverlineSize = 1.0f; // Thickness of tab-bar overline, which highlights the selected tab-bar.
+ TableAngledHeadersAngle = 35.0f * (IM_PI / 180.0f); // Angle of angled headers (supported values range from -50 degrees to +50 degrees).
+ TableAngledHeadersTextAlign = ImVec2(0.5f,0.0f);// Alignment of angled headers within the cell
+ ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right.
+ ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text.
+ SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line.
+ SeparatorTextBorderSize = 3.0f; // Thickness of border in SeparatorText()
+ SeparatorTextAlign = ImVec2(0.0f,0.5f);// Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center).
+ SeparatorTextPadding = ImVec2(20.0f,3.f);// Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y.
+ DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows.
+ DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.
+ MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
+ AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU.
+ AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering).
+ AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.).
+ CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
+ CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
+
+ // Behaviors
+ HoverStationaryDelay = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary.
+ HoverDelayShort = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay.
+ HoverDelayNormal = 0.40f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayNormal). "
+ HoverFlagsForTooltipMouse = ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_AllowWhenDisabled; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using mouse.
+ HoverFlagsForTooltipNav = ImGuiHoveredFlags_NoSharedDelay | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_AllowWhenDisabled; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using keyboard/gamepad.
// Default theme
ImGui::StyleColorsDark(this);
@@ -1128,29 +1390,34 @@ ImGuiStyle::ImGuiStyle()
// Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times.
void ImGuiStyle::ScaleAllSizes(float scale_factor)
{
- WindowPadding = ImFloor(WindowPadding * scale_factor);
- WindowRounding = ImFloor(WindowRounding * scale_factor);
- WindowMinSize = ImFloor(WindowMinSize * scale_factor);
- ChildRounding = ImFloor(ChildRounding * scale_factor);
- PopupRounding = ImFloor(PopupRounding * scale_factor);
- FramePadding = ImFloor(FramePadding * scale_factor);
- FrameRounding = ImFloor(FrameRounding * scale_factor);
- ItemSpacing = ImFloor(ItemSpacing * scale_factor);
- ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor);
- CellPadding = ImFloor(CellPadding * scale_factor);
- TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor);
- IndentSpacing = ImFloor(IndentSpacing * scale_factor);
- ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor);
- ScrollbarSize = ImFloor(ScrollbarSize * scale_factor);
- ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor);
- GrabMinSize = ImFloor(GrabMinSize * scale_factor);
- GrabRounding = ImFloor(GrabRounding * scale_factor);
- LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor);
- TabRounding = ImFloor(TabRounding * scale_factor);
- TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor) : FLT_MAX;
- DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor);
- DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor);
- MouseCursorScale = ImFloor(MouseCursorScale * scale_factor);
+ WindowPadding = ImTrunc(WindowPadding * scale_factor);
+ WindowRounding = ImTrunc(WindowRounding * scale_factor);
+ WindowMinSize = ImTrunc(WindowMinSize * scale_factor);
+ WindowBorderHoverPadding = ImTrunc(WindowBorderHoverPadding * scale_factor);
+ ChildRounding = ImTrunc(ChildRounding * scale_factor);
+ PopupRounding = ImTrunc(PopupRounding * scale_factor);
+ FramePadding = ImTrunc(FramePadding * scale_factor);
+ FrameRounding = ImTrunc(FrameRounding * scale_factor);
+ ItemSpacing = ImTrunc(ItemSpacing * scale_factor);
+ ItemInnerSpacing = ImTrunc(ItemInnerSpacing * scale_factor);
+ CellPadding = ImTrunc(CellPadding * scale_factor);
+ TouchExtraPadding = ImTrunc(TouchExtraPadding * scale_factor);
+ IndentSpacing = ImTrunc(IndentSpacing * scale_factor);
+ ColumnsMinSpacing = ImTrunc(ColumnsMinSpacing * scale_factor);
+ ScrollbarSize = ImTrunc(ScrollbarSize * scale_factor);
+ ScrollbarRounding = ImTrunc(ScrollbarRounding * scale_factor);
+ GrabMinSize = ImTrunc(GrabMinSize * scale_factor);
+ GrabRounding = ImTrunc(GrabRounding * scale_factor);
+ LogSliderDeadzone = ImTrunc(LogSliderDeadzone * scale_factor);
+ ImageBorderSize = ImTrunc(ImageBorderSize * scale_factor);
+ TabRounding = ImTrunc(TabRounding * scale_factor);
+ TabCloseButtonMinWidthSelected = (TabCloseButtonMinWidthSelected > 0.0f && TabCloseButtonMinWidthSelected != FLT_MAX) ? ImTrunc(TabCloseButtonMinWidthSelected * scale_factor) : TabCloseButtonMinWidthSelected;
+ TabCloseButtonMinWidthUnselected = (TabCloseButtonMinWidthUnselected > 0.0f && TabCloseButtonMinWidthUnselected != FLT_MAX) ? ImTrunc(TabCloseButtonMinWidthUnselected * scale_factor) : TabCloseButtonMinWidthUnselected;
+ TabBarOverlineSize = ImTrunc(TabBarOverlineSize * scale_factor);
+ SeparatorTextPadding = ImTrunc(SeparatorTextPadding * scale_factor);
+ DisplayWindowPadding = ImTrunc(DisplayWindowPadding * scale_factor);
+ DisplaySafeAreaPadding = ImTrunc(DisplaySafeAreaPadding * scale_factor);
+ MouseCursorScale = ImTrunc(MouseCursorScale * scale_factor);
}
ImGuiIO::ImGuiIO()
@@ -1167,16 +1434,6 @@ ImGuiIO::ImGuiIO()
IniSavingRate = 5.0f;
IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables).
LogFilename = "imgui_log.txt";
- MouseDoubleClickTime = 0.30f;
- MouseDoubleClickMaxDist = 6.0f;
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- for (int i = 0; i < ImGuiKey_COUNT; i++)
- KeyMap[i] = -1;
-#endif
- KeyRepeatDelay = 0.275f;
- KeyRepeatRate = 0.050f;
- HoverDelayNormal = 0.30f;
- HoverDelayShort = 0.10f;
UserData = NULL;
Fonts = NULL;
@@ -1185,6 +1442,15 @@ ImGuiIO::ImGuiIO()
FontAllowUserScaling = false;
DisplayFramebufferScale = ImVec2(1.0f, 1.0f);
+ // Keyboard/Gamepad Navigation options
+ ConfigNavSwapGamepadButtons = false;
+ ConfigNavMoveSetMousePos = false;
+ ConfigNavCaptureKeyboard = true;
+ ConfigNavEscapeClearFocusItem = true;
+ ConfigNavEscapeClearFocusWindow = false;
+ ConfigNavCursorVisibleAuto = true;
+ ConfigNavCursorVisibleAlways = false;
+
// Miscellaneous options
MouseDrawCursor = false;
#ifdef __APPLE__
@@ -1198,25 +1464,39 @@ ImGuiIO::ImGuiIO()
ConfigDragClickToInputText = false;
ConfigWindowsResizeFromEdges = true;
ConfigWindowsMoveFromTitleBarOnly = false;
+ ConfigWindowsCopyContentsWithCtrlC = false;
+ ConfigScrollbarScrollByPage = true;
ConfigMemoryCompactTimer = 60.0f;
+ ConfigDebugIsDebuggerPresent = false;
+ ConfigDebugHighlightIdConflicts = true;
+ ConfigDebugHighlightIdConflictsShowItemPicker = true;
+ ConfigDebugBeginReturnValueOnce = false;
+ ConfigDebugBeginReturnValueLoop = false;
+
+ ConfigErrorRecovery = true;
+ ConfigErrorRecoveryEnableAssert = true;
+ ConfigErrorRecoveryEnableDebugLog = true;
+ ConfigErrorRecoveryEnableTooltip = true;
+
+ // Inputs Behaviors
+ MouseDoubleClickTime = 0.30f;
+ MouseDoubleClickMaxDist = 6.0f;
+ MouseDragThreshold = 6.0f;
+ KeyRepeatDelay = 0.275f;
+ KeyRepeatRate = 0.050f;
// Platform Functions
+ // Note: Initialize() will setup default clipboard/ime handlers.
BackendPlatformName = BackendRendererName = NULL;
BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL;
- GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations
- SetClipboardTextFn = SetClipboardTextFn_DefaultImpl;
- ClipboardUserData = NULL;
- SetPlatformImeDataFn = SetPlatformImeDataFn_DefaultImpl;
// Input (NB: we already have memset zero the entire structure!)
MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX);
- MouseDragThreshold = 6.0f;
+ MouseSource = ImGuiMouseSource_Mouse;
for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f;
for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; }
AppAcceptingEvents = true;
- BackendUsingLegacyKeyArrays = (ImS8)-1;
- BackendUsingLegacyNavInputArray = true; // assume using legacy array until proven wrong
}
// Pass in translated ASCII characters for text input.
@@ -1225,14 +1505,15 @@ ImGuiIO::ImGuiIO()
// FIXME: Should in theory be called "AddCharacterEvent()" to be consistent with new API
void ImGuiIO::AddInputCharacter(unsigned int c)
{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(&g.IO == this && "Can only add events to current context.");
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
if (c == 0 || !AppAcceptingEvents)
return;
ImGuiInputEvent e;
e.Type = ImGuiInputEventType_Text;
e.Source = ImGuiInputSource_Keyboard;
+ e.EventId = g.InputEventsNextEventId++;
e.Text.Char = c;
g.InputEventsQueue.push_back(e);
}
@@ -1281,31 +1562,45 @@ void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars)
{
unsigned int c = 0;
utf8_chars += ImTextCharFromUtf8(&c, utf8_chars, NULL);
- if (c != 0)
- AddInputCharacter(c);
+ AddInputCharacter(c);
}
}
-// FIXME: Perhaps we could clear queued events as well?
-void ImGuiIO::ClearInputCharacters()
+// Clear all incoming events.
+void ImGuiIO::ClearEventsQueue()
{
- InputQueueCharacters.resize(0);
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
+ g.InputEventsQueue.clear();
}
-// FIXME: Perhaps we could clear queued events as well?
+// Clear current keyboard/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons.
void ImGuiIO::ClearInputKeys()
{
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- memset(KeysDown, 0, sizeof(KeysDown));
-#endif
- for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++)
+ ImGuiContext& g = *Ctx;
+ for (int key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key++)
{
- KeysData[n].Down = false;
- KeysData[n].DownDuration = -1.0f;
- KeysData[n].DownDurationPrev = -1.0f;
+ if (ImGui::IsMouseKey((ImGuiKey)key))
+ continue;
+ ImGuiKeyData* key_data = &g.IO.KeysData[key - ImGuiKey_NamedKey_BEGIN];
+ key_data->Down = false;
+ key_data->DownDuration = -1.0f;
+ key_data->DownDurationPrev = -1.0f;
}
KeyCtrl = KeyShift = KeyAlt = KeySuper = false;
KeyMods = ImGuiMod_None;
+ InputQueueCharacters.resize(0); // Behavior of old ClearInputCharacters().
+}
+
+void ImGuiIO::ClearInputMouse()
+{
+ for (ImGuiKey key = ImGuiKey_Mouse_BEGIN; key < ImGuiKey_Mouse_END; key = (ImGuiKey)(key + 1))
+ {
+ ImGuiKeyData* key_data = &KeysData[key - ImGuiKey_NamedKey_BEGIN];
+ key_data->Down = false;
+ key_data->DownDuration = -1.0f;
+ key_data->DownDurationPrev = -1.0f;
+ }
MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
for (int n = 0; n < IM_ARRAYSIZE(MouseDown); n++)
{
@@ -1315,9 +1610,18 @@ void ImGuiIO::ClearInputKeys()
MouseWheel = MouseWheelH = 0.0f;
}
-static ImGuiInputEvent* FindLatestInputEvent(ImGuiInputEventType type, int arg = -1)
+// Removed this as it is ambiguous/misleading and generally incorrect to use with the existence of a higher-level input queue.
+// Current frame character buffer is now also cleared by ClearInputKeys().
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+void ImGuiIO::ClearInputCharacters()
{
- ImGuiContext& g = *GImGui;
+ InputQueueCharacters.resize(0);
+}
+#endif
+
+static ImGuiInputEvent* FindLatestInputEvent(ImGuiContext* ctx, ImGuiInputEventType type, int arg = -1)
+{
+ ImGuiContext& g = *ctx;
for (int n = g.InputEventsQueue.Size - 1; n >= 0; n--)
{
ImGuiInputEvent* e = &g.InputEventsQueue[n];
@@ -1336,30 +1640,32 @@ static ImGuiInputEvent* FindLatestInputEvent(ImGuiInputEventType type, int arg =
// - ImGuiKey key: Translated key (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character)
// - bool down: Is the key down? use false to signify a key release.
// - float analog_value: 0.0f..1.0f
+// IMPORTANT: THIS FUNCTION AND OTHER "ADD" GRABS THE CONTEXT FROM OUR INSTANCE.
+// WE NEED TO ENSURE THAT ALL FUNCTION CALLS ARE FULFILLING THIS, WHICH IS WHY GetKeyData() HAS AN EXPLICIT CONTEXT.
void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value)
{
//if (e->Down) { IMGUI_DEBUG_LOG_IO("AddKeyEvent() Key='%s' %d, NativeKeycode = %d, NativeScancode = %d\n", ImGui::GetKeyName(e->Key), e->Down, e->NativeKeycode, e->NativeScancode); }
+ IM_ASSERT(Ctx != NULL);
if (key == ImGuiKey_None || !AppAcceptingEvents)
return;
- ImGuiContext& g = *GImGui;
- IM_ASSERT(&g.IO == this && "Can only add events to current context.");
- IM_ASSERT(ImGui::IsNamedKeyOrModKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API.
- IM_ASSERT(!ImGui::IsAliasKey(key)); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events.
-
- // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data.
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- IM_ASSERT((BackendUsingLegacyKeyArrays == -1 || BackendUsingLegacyKeyArrays == 0) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
- if (BackendUsingLegacyKeyArrays == -1)
- for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++)
- IM_ASSERT(KeyMap[n] == -1 && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
- BackendUsingLegacyKeyArrays = 0;
-#endif
- if (ImGui::IsGamepadKey(key))
- BackendUsingLegacyNavInputArray = false;
+ ImGuiContext& g = *Ctx;
+ IM_ASSERT(ImGui::IsNamedKeyOrMod(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API.
+ IM_ASSERT(ImGui::IsAliasKey(key) == false); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events.
+
+ // MacOS: swap Cmd(Super) and Ctrl
+ if (g.IO.ConfigMacOSXBehaviors)
+ {
+ if (key == ImGuiMod_Super) { key = ImGuiMod_Ctrl; }
+ else if (key == ImGuiMod_Ctrl) { key = ImGuiMod_Super; }
+ else if (key == ImGuiKey_LeftSuper) { key = ImGuiKey_LeftCtrl; }
+ else if (key == ImGuiKey_RightSuper){ key = ImGuiKey_RightCtrl; }
+ else if (key == ImGuiKey_LeftCtrl) { key = ImGuiKey_LeftSuper; }
+ else if (key == ImGuiKey_RightCtrl) { key = ImGuiKey_RightSuper; }
+ }
// Filter duplicate (in particular: key mods and gamepad analog values are commonly spammed)
- const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_Key, (int)key);
- const ImGuiKeyData* key_data = ImGui::GetKeyData(key);
+ const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_Key, (int)key);
+ const ImGuiKeyData* key_data = ImGui::GetKeyData(&g, key);
const bool latest_key_down = latest_event ? latest_event->Key.Down : key_data->Down;
const float latest_key_analog = latest_event ? latest_event->Key.AnalogValue : key_data->AnalogValue;
if (latest_key_down == down && latest_key_analog == analog_value)
@@ -1369,6 +1675,7 @@ void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value)
ImGuiInputEvent e;
e.Type = ImGuiInputEventType_Key;
e.Source = ImGui::IsGamepadKey(key) ? ImGuiInputSource_Gamepad : ImGuiInputSource_Keyboard;
+ e.EventId = g.InputEventsNextEventId++;
e.Key.Key = key;
e.Key.Down = down;
e.Key.AnalogValue = analog_value;
@@ -1391,20 +1698,10 @@ void ImGuiIO::SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native
return;
IM_ASSERT(ImGui::IsNamedKey(key)); // >= 512
IM_ASSERT(native_legacy_index == -1 || ImGui::IsLegacyKey((ImGuiKey)native_legacy_index)); // >= 0 && <= 511
- IM_UNUSED(native_keycode); // Yet unused
- IM_UNUSED(native_scancode); // Yet unused
-
- // Build native->imgui map so old user code can still call key functions with native 0..511 values.
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode;
- if (!ImGui::IsLegacyKey((ImGuiKey)legacy_key))
- return;
- KeyMap[legacy_key] = key;
- KeyMap[key] = legacy_key;
-#else
- IM_UNUSED(key);
- IM_UNUSED(native_legacy_index);
-#endif
+ IM_UNUSED(key); // Yet unused
+ IM_UNUSED(native_keycode); // Yet unused
+ IM_UNUSED(native_scancode); // Yet unused
+ IM_UNUSED(native_legacy_index); // Yet unused
}
// Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen.
@@ -1416,16 +1713,16 @@ void ImGuiIO::SetAppAcceptingEvents(bool accepting_events)
// Queue a mouse move event
void ImGuiIO::AddMousePosEvent(float x, float y)
{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(&g.IO == this && "Can only add events to current context.");
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
if (!AppAcceptingEvents)
return;
// Apply same flooring as UpdateMouseInputs()
- ImVec2 pos((x > -FLT_MAX) ? ImFloorSigned(x) : x, (y > -FLT_MAX) ? ImFloorSigned(y) : y);
+ ImVec2 pos((x > -FLT_MAX) ? ImFloor(x) : x, (y > -FLT_MAX) ? ImFloor(y) : y);
// Filter duplicate
- const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_MousePos);
+ const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_MousePos);
const ImVec2 latest_pos = latest_event ? ImVec2(latest_event->MousePos.PosX, latest_event->MousePos.PosY) : g.IO.MousePos;
if (latest_pos.x == pos.x && latest_pos.y == pos.y)
return;
@@ -1433,38 +1730,66 @@ void ImGuiIO::AddMousePosEvent(float x, float y)
ImGuiInputEvent e;
e.Type = ImGuiInputEventType_MousePos;
e.Source = ImGuiInputSource_Mouse;
+ e.EventId = g.InputEventsNextEventId++;
e.MousePos.PosX = pos.x;
e.MousePos.PosY = pos.y;
+ e.MousePos.MouseSource = g.InputEventsNextMouseSource;
g.InputEventsQueue.push_back(e);
}
void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down)
{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(&g.IO == this && "Can only add events to current context.");
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT);
if (!AppAcceptingEvents)
return;
+ // On MacOS X: Convert Ctrl(Super)+Left click into Right-click: handle held button.
+ if (ConfigMacOSXBehaviors && mouse_button == 0 && MouseCtrlLeftAsRightClick)
+ {
+ // Order of both statements matterns: this event will still release mouse button 1
+ mouse_button = 1;
+ if (!down)
+ MouseCtrlLeftAsRightClick = false;
+ }
+
// Filter duplicate
- const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_MouseButton, (int)mouse_button);
+ const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_MouseButton, (int)mouse_button);
const bool latest_button_down = latest_event ? latest_event->MouseButton.Down : g.IO.MouseDown[mouse_button];
if (latest_button_down == down)
return;
+ // On MacOS X: Convert Ctrl(Super)+Left click into Right-click.
+ // - Note that this is actual physical Ctrl which is ImGuiMod_Super for us.
+ // - At this point we want from !down to down, so this is handling the initial press.
+ if (ConfigMacOSXBehaviors && mouse_button == 0 && down)
+ {
+ const ImGuiInputEvent* latest_super_event = FindLatestInputEvent(&g, ImGuiInputEventType_Key, (int)ImGuiMod_Super);
+ if (latest_super_event ? latest_super_event->Key.Down : g.IO.KeySuper)
+ {
+ IMGUI_DEBUG_LOG_IO("[io] Super+Left Click aliased into Right Click\n");
+ MouseCtrlLeftAsRightClick = true;
+ AddMouseButtonEvent(1, true); // This is just quicker to write that passing through, as we need to filter duplicate again.
+ return;
+ }
+ }
+
ImGuiInputEvent e;
e.Type = ImGuiInputEventType_MouseButton;
e.Source = ImGuiInputSource_Mouse;
+ e.EventId = g.InputEventsNextEventId++;
e.MouseButton.Button = mouse_button;
e.MouseButton.Down = down;
+ e.MouseButton.MouseSource = g.InputEventsNextMouseSource;
g.InputEventsQueue.push_back(e);
}
-// Queue a mouse wheel event (most mouse/API will only have a Y component)
+// Queue a mouse wheel event (some mouse/API may only have a Y component)
void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y)
{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(&g.IO == this && "Can only add events to current context.");
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
// Filter duplicate (unlike most events, wheel values are relative and easy to filter)
if (!AppAcceptingEvents || (wheel_x == 0.0f && wheel_y == 0.0f))
@@ -1473,28 +1798,47 @@ void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y)
ImGuiInputEvent e;
e.Type = ImGuiInputEventType_MouseWheel;
e.Source = ImGuiInputSource_Mouse;
+ e.EventId = g.InputEventsNextEventId++;
e.MouseWheel.WheelX = wheel_x;
e.MouseWheel.WheelY = wheel_y;
+ e.MouseWheel.MouseSource = g.InputEventsNextMouseSource;
g.InputEventsQueue.push_back(e);
}
+// This is not a real event, the data is latched in order to be stored in actual Mouse events.
+// This is so that duplicate events (e.g. Windows sending extraneous WM_MOUSEMOVE) gets filtered and are not leading to actual source changes.
+void ImGuiIO::AddMouseSourceEvent(ImGuiMouseSource source)
+{
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
+ g.InputEventsNextMouseSource = source;
+}
+
void ImGuiIO::AddFocusEvent(bool focused)
{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(&g.IO == this && "Can only add events to current context.");
+ IM_ASSERT(Ctx != NULL);
+ ImGuiContext& g = *Ctx;
// Filter duplicate
- const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_Focus);
+ const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_Focus);
const bool latest_focused = latest_event ? latest_event->AppFocused.Focused : !g.IO.AppFocusLost;
- if (latest_focused == focused)
+ if (latest_focused == focused || (ConfigDebugIgnoreFocusLoss && !focused))
return;
ImGuiInputEvent e;
e.Type = ImGuiInputEventType_Focus;
+ e.EventId = g.InputEventsNextEventId++;
e.AppFocused.Focused = focused;
g.InputEventsQueue.push_back(e);
}
+ImGuiPlatformIO::ImGuiPlatformIO()
+{
+ // Most fields are initialized with zero
+ memset(this, 0, sizeof(*this));
+ Platform_LocaleDecimalPoint = '.';
+}
+
//-----------------------------------------------------------------------------
// [SECTION] MISC HELPERS/UTILITIES (Geometry functions)
//-----------------------------------------------------------------------------
@@ -1645,15 +1989,15 @@ void ImStrncpy(char* dst, const char* src, size_t count)
char* ImStrdup(const char* str)
{
- size_t len = strlen(str);
+ size_t len = ImStrlen(str);
void* buf = IM_ALLOC(len + 1);
return (char*)memcpy(buf, (const void*)str, len + 1);
}
char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src)
{
- size_t dst_buf_size = p_dst_size ? *p_dst_size : strlen(dst) + 1;
- size_t src_size = strlen(src) + 1;
+ size_t dst_buf_size = p_dst_size ? *p_dst_size : ImStrlen(dst) + 1;
+ size_t src_size = ImStrlen(src) + 1;
if (dst_buf_size < src_size)
{
IM_FREE(dst);
@@ -1666,7 +2010,7 @@ char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src)
const char* ImStrchrRange(const char* str, const char* str_end, char c)
{
- const char* p = (const char*)memchr(str, (int)c, str_end - str);
+ const char* p = (const char*)ImMemchr(str, (int)c, str_end - str);
return p;
}
@@ -1681,12 +2025,13 @@ int ImStrlenW(const ImWchar* str)
// Find end-of-line. Return pointer will point to either first \n, either str_end.
const char* ImStreolRange(const char* str, const char* str_end)
{
- const char* p = (const char*)memchr(str, '\n', str_end - str);
+ const char* p = (const char*)ImMemchr(str, '\n', str_end - str);
return p ? p : str_end;
}
-const ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin) // find beginning-of-line
+const char* ImStrbol(const char* buf_mid_line, const char* buf_begin) // find beginning-of-line
{
+ IM_ASSERT_PARANOID(buf_mid_line >= buf_begin && buf_mid_line <= buf_begin + ImStrlen(buf_begin));
while (buf_mid_line > buf_begin && buf_mid_line[-1] != '\n')
buf_mid_line--;
return buf_mid_line;
@@ -1695,7 +2040,7 @@ const ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin)
const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end)
{
if (!needle_end)
- needle_end = needle + strlen(needle);
+ needle_end = needle + ImStrlen(needle);
const char un0 = (char)ImToUpper(*needle);
while ((!haystack_end && *haystack) || (haystack_end && haystack < haystack_end))
@@ -1747,13 +2092,15 @@ const char* ImStrSkipBlank(const char* str)
// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are
// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.)
#ifdef IMGUI_USE_STB_SPRINTF
+#ifndef IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION
#define STB_SPRINTF_IMPLEMENTATION
+#endif
#ifdef IMGUI_STB_SPRINTF_FILENAME
#include IMGUI_STB_SPRINTF_FILENAME
#else
#include "stb_sprintf.h"
#endif
-#endif
+#endif // #ifdef IMGUI_USE_STB_SPRINTF
#if defined(_MSC_VER) && !defined(vsnprintf)
#define vsnprintf _vsnprintf
@@ -1795,28 +2142,55 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args)
void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...)
{
- ImGuiContext& g = *GImGui;
va_list args;
va_start(args, fmt);
- int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args);
- *out_buf = g.TempBuffer.Data;
- if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; }
+ ImFormatStringToTempBufferV(out_buf, out_buf_end, fmt, args);
va_end(args);
}
+// FIXME: Should rework API toward allowing multiple in-flight temp buffers (easier and safer for caller)
+// by making the caller acquire a temp buffer token, with either explicit or destructor release, e.g.
+// ImGuiTempBufferToken token;
+// ImFormatStringToTempBuffer(token, ...);
void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args)
{
ImGuiContext& g = *GImGui;
- int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args);
- *out_buf = g.TempBuffer.Data;
- if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; }
+ if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0)
+ {
+ const char* buf = va_arg(args, const char*); // Skip formatting when using "%s"
+ if (buf == NULL)
+ buf = "(null)";
+ *out_buf = buf;
+ if (out_buf_end) { *out_buf_end = buf + ImStrlen(buf); }
+ }
+ else if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '*' && fmt[3] == 's' && fmt[4] == 0)
+ {
+ int buf_len = va_arg(args, int); // Skip formatting when using "%.*s"
+ const char* buf = va_arg(args, const char*);
+ if (buf == NULL)
+ {
+ buf = "(null)";
+ buf_len = ImMin(buf_len, 6);
+ }
+ *out_buf = buf;
+ *out_buf_end = buf + buf_len; // Disallow not passing 'out_buf_end' here. User is expected to use it.
+ }
+ else
+ {
+ int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args);
+ *out_buf = g.TempBuffer.Data;
+ if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; }
+ }
}
+#ifndef IMGUI_ENABLE_SSE4_2_CRC
// CRC32 needs a 1KB lookup table (not cache friendly)
// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily:
// - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe.
static const ImU32 GCrc32LookupTable[256] =
{
+#ifdef IMGUI_USE_LEGACY_CRC32_ADLER
+ // Legacy CRC32-adler table used pre 1.91.6 (before 2024/11/27). Only use if you cannot afford invalidating old .ini data.
0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
@@ -1833,19 +2207,51 @@ static const ImU32 GCrc32LookupTable[256] =
0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D,
+#else
+ // CRC32c table compatible with SSE 4.2 instructions
+ 0x00000000,0xF26B8303,0xE13B70F7,0x1350F3F4,0xC79A971F,0x35F1141C,0x26A1E7E8,0xD4CA64EB,0x8AD958CF,0x78B2DBCC,0x6BE22838,0x9989AB3B,0x4D43CFD0,0xBF284CD3,0xAC78BF27,0x5E133C24,
+ 0x105EC76F,0xE235446C,0xF165B798,0x030E349B,0xD7C45070,0x25AFD373,0x36FF2087,0xC494A384,0x9A879FA0,0x68EC1CA3,0x7BBCEF57,0x89D76C54,0x5D1D08BF,0xAF768BBC,0xBC267848,0x4E4DFB4B,
+ 0x20BD8EDE,0xD2D60DDD,0xC186FE29,0x33ED7D2A,0xE72719C1,0x154C9AC2,0x061C6936,0xF477EA35,0xAA64D611,0x580F5512,0x4B5FA6E6,0xB93425E5,0x6DFE410E,0x9F95C20D,0x8CC531F9,0x7EAEB2FA,
+ 0x30E349B1,0xC288CAB2,0xD1D83946,0x23B3BA45,0xF779DEAE,0x05125DAD,0x1642AE59,0xE4292D5A,0xBA3A117E,0x4851927D,0x5B016189,0xA96AE28A,0x7DA08661,0x8FCB0562,0x9C9BF696,0x6EF07595,
+ 0x417B1DBC,0xB3109EBF,0xA0406D4B,0x522BEE48,0x86E18AA3,0x748A09A0,0x67DAFA54,0x95B17957,0xCBA24573,0x39C9C670,0x2A993584,0xD8F2B687,0x0C38D26C,0xFE53516F,0xED03A29B,0x1F682198,
+ 0x5125DAD3,0xA34E59D0,0xB01EAA24,0x42752927,0x96BF4DCC,0x64D4CECF,0x77843D3B,0x85EFBE38,0xDBFC821C,0x2997011F,0x3AC7F2EB,0xC8AC71E8,0x1C661503,0xEE0D9600,0xFD5D65F4,0x0F36E6F7,
+ 0x61C69362,0x93AD1061,0x80FDE395,0x72966096,0xA65C047D,0x5437877E,0x4767748A,0xB50CF789,0xEB1FCBAD,0x197448AE,0x0A24BB5A,0xF84F3859,0x2C855CB2,0xDEEEDFB1,0xCDBE2C45,0x3FD5AF46,
+ 0x7198540D,0x83F3D70E,0x90A324FA,0x62C8A7F9,0xB602C312,0x44694011,0x5739B3E5,0xA55230E6,0xFB410CC2,0x092A8FC1,0x1A7A7C35,0xE811FF36,0x3CDB9BDD,0xCEB018DE,0xDDE0EB2A,0x2F8B6829,
+ 0x82F63B78,0x709DB87B,0x63CD4B8F,0x91A6C88C,0x456CAC67,0xB7072F64,0xA457DC90,0x563C5F93,0x082F63B7,0xFA44E0B4,0xE9141340,0x1B7F9043,0xCFB5F4A8,0x3DDE77AB,0x2E8E845F,0xDCE5075C,
+ 0x92A8FC17,0x60C37F14,0x73938CE0,0x81F80FE3,0x55326B08,0xA759E80B,0xB4091BFF,0x466298FC,0x1871A4D8,0xEA1A27DB,0xF94AD42F,0x0B21572C,0xDFEB33C7,0x2D80B0C4,0x3ED04330,0xCCBBC033,
+ 0xA24BB5A6,0x502036A5,0x4370C551,0xB11B4652,0x65D122B9,0x97BAA1BA,0x84EA524E,0x7681D14D,0x2892ED69,0xDAF96E6A,0xC9A99D9E,0x3BC21E9D,0xEF087A76,0x1D63F975,0x0E330A81,0xFC588982,
+ 0xB21572C9,0x407EF1CA,0x532E023E,0xA145813D,0x758FE5D6,0x87E466D5,0x94B49521,0x66DF1622,0x38CC2A06,0xCAA7A905,0xD9F75AF1,0x2B9CD9F2,0xFF56BD19,0x0D3D3E1A,0x1E6DCDEE,0xEC064EED,
+ 0xC38D26C4,0x31E6A5C7,0x22B65633,0xD0DDD530,0x0417B1DB,0xF67C32D8,0xE52CC12C,0x1747422F,0x49547E0B,0xBB3FFD08,0xA86F0EFC,0x5A048DFF,0x8ECEE914,0x7CA56A17,0x6FF599E3,0x9D9E1AE0,
+ 0xD3D3E1AB,0x21B862A8,0x32E8915C,0xC083125F,0x144976B4,0xE622F5B7,0xF5720643,0x07198540,0x590AB964,0xAB613A67,0xB831C993,0x4A5A4A90,0x9E902E7B,0x6CFBAD78,0x7FAB5E8C,0x8DC0DD8F,
+ 0xE330A81A,0x115B2B19,0x020BD8ED,0xF0605BEE,0x24AA3F05,0xD6C1BC06,0xC5914FF2,0x37FACCF1,0x69E9F0D5,0x9B8273D6,0x88D28022,0x7AB90321,0xAE7367CA,0x5C18E4C9,0x4F48173D,0xBD23943E,
+ 0xF36E6F75,0x0105EC76,0x12551F82,0xE03E9C81,0x34F4F86A,0xC69F7B69,0xD5CF889D,0x27A40B9E,0x79B737BA,0x8BDCB4B9,0x988C474D,0x6AE7C44E,0xBE2DA0A5,0x4C4623A6,0x5F16D052,0xAD7D5351
+#endif
};
+#endif
// Known size hash
// It is ok to call ImHashData on a string with known length but the ### operator won't be supported.
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
-ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed)
+ImGuiID ImHashData(const void* data_p, size_t data_size, ImGuiID seed)
{
ImU32 crc = ~seed;
const unsigned char* data = (const unsigned char*)data_p;
+ const unsigned char *data_end = (const unsigned char*)data_p + data_size;
+#ifndef IMGUI_ENABLE_SSE4_2_CRC
const ImU32* crc32_lut = GCrc32LookupTable;
- while (data_size-- != 0)
+ while (data < data_end)
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *data++];
return ~crc;
+#else
+ while (data + 4 <= data_end)
+ {
+ crc = _mm_crc32_u32(crc, *(ImU32*)data);
+ data += 4;
+ }
+ while (data < data_end)
+ crc = _mm_crc32_u8(crc, *data++);
+ return ~crc;
+#endif
}
// Zero-terminated string hash, with support for ### to reset back to seed value
@@ -1854,12 +2260,14 @@ ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed)
// - If we reach ### in the string we discard the hash so far and reset to the seed.
// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build)
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
-ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
+ImGuiID ImHashStr(const char* data_p, size_t data_size, ImGuiID seed)
{
seed = ~seed;
ImU32 crc = seed;
const unsigned char* data = (const unsigned char*)data_p;
+#ifndef IMGUI_ENABLE_SSE4_2_CRC
const ImU32* crc32_lut = GCrc32LookupTable;
+#endif
if (data_size != 0)
{
while (data_size-- != 0)
@@ -1867,7 +2275,11 @@ ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
unsigned char c = *data++;
if (c == '#' && data_size >= 2 && data[0] == '#' && data[1] == '#')
crc = seed;
+#ifndef IMGUI_ENABLE_SSE4_2_CRC
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c];
+#else
+ crc = _mm_crc32_u8(crc, c);
+#endif
}
}
else
@@ -1876,7 +2288,11 @@ ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
{
if (c == '#' && data[0] == '#' && data[1] == '#')
crc = seed;
+#ifndef IMGUI_ENABLE_SSE4_2_CRC
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c];
+#else
+ crc = _mm_crc32_u8(crc, c);
+#endif
}
}
return ~crc;
@@ -1891,16 +2307,23 @@ ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
ImFileHandle ImFileOpen(const char* filename, const char* mode)
{
-#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__)
+#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && (defined(__MINGW32__) || (!defined(__CYGWIN__) && !defined(__GNUC__)))
// We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames.
// Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32!
const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0);
- ImVector<ImWchar> buf;
- buf.resize(filename_wsize + mode_wsize);
- ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize);
- ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize);
- return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]);
+
+ // Use stack buffer if possible, otherwise heap buffer. Sizes include zero terminator.
+ // We don't rely on current ImGuiContext as this is implied to be a helper function which doesn't depend on it (see #7314).
+ wchar_t local_temp_stack[FILENAME_MAX];
+ ImVector<wchar_t> local_temp_heap;
+ if (filename_wsize + mode_wsize > IM_ARRAYSIZE(local_temp_stack))
+ local_temp_heap.resize(filename_wsize + mode_wsize);
+ wchar_t* filename_wbuf = local_temp_heap.Data ? local_temp_heap.Data : local_temp_stack;
+ wchar_t* mode_wbuf = filename_wbuf + filename_wsize;
+ ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, filename_wbuf, filename_wsize);
+ ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, mode_wbuf, mode_wsize);
+ return ::_wfopen(filename_wbuf, mode_wbuf);
#else
return fopen(filename, mode);
#endif
@@ -1959,6 +2382,8 @@ void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_f
// [SECTION] MISC HELPERS/UTILITIES (ImText* functions)
//-----------------------------------------------------------------------------
+IM_MSVC_RUNTIME_CHECKS_OFF
+
// Convert UTF-8 to 32-bit character, process single character input.
// A nearly-branchless UTF-8 decoder, based on work of Christopher Wellons (https://github.com/skeeto/branchless-utf8).
// We handle UTF-8 decoding error by skipping forward.
@@ -1970,7 +2395,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
static const int shiftc[] = { 0, 18, 12, 6, 0 };
static const int shifte[] = { 0, 6, 4, 2, 0 };
int len = lengths[*(const unsigned char*)in_text >> 3];
- int wanted = len + !len;
+ int wanted = len + (len ? 0 : 1);
if (in_text_end == NULL)
in_text_end = in_text + wanted; // Max length, nulls will be taken into account.
@@ -1994,7 +2419,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
int e = 0;
e = (*out_char < mins[len]) << 6; // non-canonical encoding
e |= ((*out_char >> 11) == 0x1b) << 7; // surrogate half?
- e |= (*out_char > IM_UNICODE_CODEPOINT_MAX) << 8; // out of range?
+ e |= (*out_char > IM_UNICODE_CODEPOINT_MAX) << 8; // out of range we can store in ImWchar (FIXME: May evolve)
e |= (s[1] & 0xc0) >> 2;
e |= (s[2] & 0xc0) >> 4;
e |= (s[3] ) >> 6;
@@ -2022,8 +2447,6 @@ int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const cha
{
unsigned int c;
in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);
- if (c == 0)
- break;
*buf_out++ = (ImWchar)c;
}
*buf_out = 0;
@@ -2039,8 +2462,6 @@ int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end)
{
unsigned int c;
in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);
- if (c == 0)
- break;
char_count++;
}
return char_count;
@@ -2135,6 +2556,33 @@ int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_e
return bytes_count;
}
+const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr)
+{
+ while (in_text_curr > in_text_start)
+ {
+ in_text_curr--;
+ if ((*in_text_curr & 0xC0) != 0x80)
+ return in_text_curr;
+ }
+ return in_text_start;
+}
+
+int ImTextCountLines(const char* in_text, const char* in_text_end)
+{
+ if (in_text_end == NULL)
+ in_text_end = in_text + ImStrlen(in_text); // FIXME-OPT: Not optimal approach, discourage use for now.
+ int count = 0;
+ while (in_text < in_text_end)
+ {
+ const char* line_end = (const char*)ImMemchr(in_text, '\n', in_text_end - in_text);
+ in_text = line_end ? line_end + 1 : in_text_end;
+ count++;
+ }
+ return count;
+}
+
+IM_MSVC_RUNTIME_CHECKS_RESTORE
+
//-----------------------------------------------------------------------------
// [SECTION] MISC HELPERS/UTILITIES (Color functions)
// Note: The Convert functions are early design which are not consistent with other API.
@@ -2226,18 +2674,16 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float&
//-----------------------------------------------------------------------------
// std::lower_bound but without the bullshit
-static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiStoragePair>& data, ImGuiID key)
+ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key)
{
- ImGuiStorage::ImGuiStoragePair* first = data.Data;
- ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size;
- size_t count = (size_t)(last - first);
- while (count > 0)
+ ImGuiStoragePair* in_p = in_begin;
+ for (size_t count = (size_t)(in_end - in_p); count > 0; )
{
size_t count2 = count >> 1;
- ImGuiStorage::ImGuiStoragePair* mid = first + count2;
+ ImGuiStoragePair* mid = in_p + count2;
if (mid->key < key)
{
- first = ++mid;
+ in_p = ++mid;
count -= count2 + 1;
}
else
@@ -2245,29 +2691,28 @@ static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiSt
count = count2;
}
}
- return first;
+ return in_p;
+}
+
+IM_MSVC_RUNTIME_CHECKS_OFF
+static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs)
+{
+ // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.
+ ImGuiID lhs_v = ((const ImGuiStoragePair*)lhs)->key;
+ ImGuiID rhs_v = ((const ImGuiStoragePair*)rhs)->key;
+ return (lhs_v > rhs_v ? +1 : lhs_v < rhs_v ? -1 : 0);
}
// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
void ImGuiStorage::BuildSortByKey()
{
- struct StaticFunc
- {
- static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs)
- {
- // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.
- if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1;
- if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1;
- return 0;
- }
- };
- ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairComparerByID);
+ ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), PairComparerByID);
}
int ImGuiStorage::GetInt(ImGuiID key, int default_val) const
{
- ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
- if (it == Data.end() || it->key != key)
+ ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
+ if (it == Data.Data + Data.Size || it->key != key)
return default_val;
return it->val_i;
}
@@ -2279,16 +2724,16 @@ bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const
float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
{
- ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
- if (it == Data.end() || it->key != key)
+ ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
+ if (it == Data.Data + Data.Size || it->key != key)
return default_val;
return it->val_f;
}
void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
{
- ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
- if (it == Data.end() || it->key != key)
+ ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
+ if (it == Data.Data + Data.Size || it->key != key)
return NULL;
return it->val_p;
}
@@ -2296,8 +2741,8 @@ void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val)
{
- ImGuiStoragePair* it = LowerBound(Data, key);
- if (it == Data.end() || it->key != key)
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
+ if (it == Data.Data + Data.Size || it->key != key)
it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_i;
}
@@ -2309,16 +2754,16 @@ bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val)
float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val)
{
- ImGuiStoragePair* it = LowerBound(Data, key);
- if (it == Data.end() || it->key != key)
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
+ if (it == Data.Data + Data.Size || it->key != key)
it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_f;
}
void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)
{
- ImGuiStoragePair* it = LowerBound(Data, key);
- if (it == Data.end() || it->key != key)
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
+ if (it == Data.Data + Data.Size || it->key != key)
it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_p;
}
@@ -2326,13 +2771,11 @@ void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)
// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame)
void ImGuiStorage::SetInt(ImGuiID key, int val)
{
- ImGuiStoragePair* it = LowerBound(Data, key);
- if (it == Data.end() || it->key != key)
- {
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
+ if (it == Data.Data + Data.Size || it->key != key)
Data.insert(it, ImGuiStoragePair(key, val));
- return;
- }
- it->val_i = val;
+ else
+ it->val_i = val;
}
void ImGuiStorage::SetBool(ImGuiID key, bool val)
@@ -2342,24 +2785,20 @@ void ImGuiStorage::SetBool(ImGuiID key, bool val)
void ImGuiStorage::SetFloat(ImGuiID key, float val)
{
- ImGuiStoragePair* it = LowerBound(Data, key);
- if (it == Data.end() || it->key != key)
- {
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
+ if (it == Data.Data + Data.Size || it->key != key)
Data.insert(it, ImGuiStoragePair(key, val));
- return;
- }
- it->val_f = val;
+ else
+ it->val_f = val;
}
void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val)
{
- ImGuiStoragePair* it = LowerBound(Data, key);
- if (it == Data.end() || it->key != key)
- {
+ ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
+ if (it == Data.Data + Data.Size || it->key != key)
Data.insert(it, ImGuiStoragePair(key, val));
- return;
- }
- it->val_p = val;
+ else
+ it->val_p = val;
}
void ImGuiStorage::SetAllInt(int v)
@@ -2367,6 +2806,7 @@ void ImGuiStorage::SetAllInt(int v)
for (int i = 0; i < Data.Size; i++)
Data[i].val_i = v;
}
+IM_MSVC_RUNTIME_CHECKS_RESTORE
//-----------------------------------------------------------------------------
// [SECTION] ImGuiTextFilter
@@ -2415,36 +2855,34 @@ void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector<ImGuiTextRa
void ImGuiTextFilter::Build()
{
Filters.resize(0);
- ImGuiTextRange input_range(InputBuf, InputBuf + strlen(InputBuf));
+ ImGuiTextRange input_range(InputBuf, InputBuf + ImStrlen(InputBuf));
input_range.split(',', &Filters);
CountGrep = 0;
- for (int i = 0; i != Filters.Size; i++)
+ for (ImGuiTextRange& f : Filters)
{
- ImGuiTextRange& f = Filters[i];
while (f.b < f.e && ImCharIsBlankA(f.b[0]))
f.b++;
while (f.e > f.b && ImCharIsBlankA(f.e[-1]))
f.e--;
if (f.empty())
continue;
- if (Filters[i].b[0] != '-')
+ if (f.b[0] != '-')
CountGrep += 1;
}
}
bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
{
- if (Filters.empty())
+ if (Filters.Size == 0)
return true;
if (text == NULL)
- text = "";
+ text = text_end = "";
- for (int i = 0; i != Filters.Size; i++)
+ for (const ImGuiTextRange& f : Filters)
{
- const ImGuiTextRange& f = Filters[i];
- if (f.empty())
+ if (f.b == f.e)
continue;
if (f.b[0] == '-')
{
@@ -2485,7 +2923,7 @@ char ImGuiTextBuffer::EmptyString[1] = { 0 };
void ImGuiTextBuffer::append(const char* str, const char* str_end)
{
- int len = str_end ? (int)(str_end - str) : (int)strlen(str);
+ int len = str_end ? (int)(str_end - str) : (int)ImStrlen(str);
// Add zero-terminator the first time
const int write_off = (Buf.Size != 0) ? Buf.Size : 1;
@@ -2544,7 +2982,7 @@ void ImGuiTextIndex::append(const char* base, int old_size, int new_size)
if (EndOffset == 0 || base[EndOffset - 1] == '\n')
LineOffsets.push_back(EndOffset);
const char* base_end = base + new_size;
- for (const char* p = base + old_size; (p = (const char*)memchr(p, '\n', base_end - p)) != 0; )
+ for (const char* p = base + old_size; (p = (const char*)ImMemchr(p, '\n', base_end - p)) != 0; )
if (++p < base_end) // Don't push a trailing offset on last \n
LineOffsets.push_back((int)(intptr_t)(p - base));
EndOffset = ImMax(EndOffset, new_size);
@@ -2552,8 +2990,6 @@ void ImGuiTextIndex::append(const char* base, int old_size, int new_size)
//-----------------------------------------------------------------------------
// [SECTION] ImGuiListClipper
-// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed
-// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO)
//-----------------------------------------------------------------------------
// FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell.
@@ -2564,54 +3000,6 @@ static bool GetSkipItemForListClipping()
return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems);
}
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-// Legacy helper to calculate coarse clipping of large list of evenly sized items.
-// This legacy API is not ideal because it assumes we will return a single contiguous rectangle.
-// Prefer using ImGuiListClipper which can returns non-contiguous ranges.
-void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end)
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- if (g.LogEnabled)
- {
- // If logging is active, do not perform any clipping
- *out_items_display_start = 0;
- *out_items_display_end = items_count;
- return;
- }
- if (GetSkipItemForListClipping())
- {
- *out_items_display_start = *out_items_display_end = 0;
- return;
- }
-
- // We create the union of the ClipRect and the scoring rect which at worst should be 1 page away from ClipRect
- // We don't include g.NavId's rectangle in there (unless g.NavJustMovedToId is set) because the rectangle enlargement can get costly.
- ImRect rect = window->ClipRect;
- if (g.NavMoveScoringItems)
- rect.Add(g.NavScoringNoClipRect);
- if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId)
- rect.Add(WindowRectRelToAbs(window, window->NavRectRel[0])); // Could store and use NavJustMovedToRectRel
-
- const ImVec2 pos = window->DC.CursorPos;
- int start = (int)((rect.Min.y - pos.y) / items_height);
- int end = (int)((rect.Max.y - pos.y) / items_height);
-
- // When performing a navigation request, ensure we have one item extra in the direction we are moving to
- // FIXME: Verify this works with tabbing
- const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav);
- if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up)
- start--;
- if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down)
- end++;
-
- start = ImClamp(start, 0, items_count);
- end = ImClamp(end + 1, start, items_count);
- *out_items_display_start = start;
- *out_items_display_end = end;
-}
-#endif
-
static void ImGuiListClipper_SortAndFuseRanges(ImVector<ImGuiListClipperRange>& ranges, int offset = 0)
{
if (ranges.Size - offset <= 1)
@@ -2661,19 +3049,9 @@ static void ImGuiListClipper_SeekCursorAndSetupPrevLine(float pos_y, float line_
}
}
-static void ImGuiListClipper_SeekCursorForItem(ImGuiListClipper* clipper, int item_n)
-{
- // StartPosY starts from ItemsFrozen hence the subtraction
- // Perform the add and multiply with double to allow seeking through larger ranges
- ImGuiListClipperData* data = (ImGuiListClipperData*)clipper->TempData;
- float pos_y = (float)((double)clipper->StartPosY + data->LossynessOffset + (double)(item_n - data->ItemsFrozen) * clipper->ItemsHeight);
- ImGuiListClipper_SeekCursorAndSetupPrevLine(pos_y, clipper->ItemsHeight);
-}
-
ImGuiListClipper::ImGuiListClipper()
{
memset(this, 0, sizeof(*this));
- ItemsCount = -1;
}
ImGuiListClipper::~ImGuiListClipper()
@@ -2683,7 +3061,10 @@ ImGuiListClipper::~ImGuiListClipper()
void ImGuiListClipper::Begin(int items_count, float items_height)
{
- ImGuiContext& g = *GImGui;
+ if (Ctx == NULL)
+ Ctx = ImGui::GetCurrentContext();
+
+ ImGuiContext& g = *Ctx;
ImGuiWindow* window = g.CurrentWindow;
IMGUI_DEBUG_LOG_CLIPPER("Clipper: Begin(%d,%.2f) in '%s'\n", items_count, items_height, window->Name);
@@ -2704,17 +3085,18 @@ void ImGuiListClipper::Begin(int items_count, float items_height)
data->Reset(this);
data->LossynessOffset = window->DC.CursorStartPosLossyness.y;
TempData = data;
+ StartSeekOffsetY = data->LossynessOffset;
}
void ImGuiListClipper::End()
{
- ImGuiContext& g = *GImGui;
if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData)
{
// In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user.
+ ImGuiContext& g = *Ctx;
IMGUI_DEBUG_LOG_CLIPPER("Clipper: End() in '%s'\n", g.CurrentWindow->Name);
if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0)
- ImGuiListClipper_SeekCursorForItem(this, ItemsCount);
+ SeekCursorForItem(ItemsCount);
// Restore temporary buffer and fix back pointers which may be invalidated when nesting
IM_ASSERT(data->ListClipper == this);
@@ -2729,18 +3111,29 @@ void ImGuiListClipper::End()
ItemsCount = -1;
}
-void ImGuiListClipper::ForceDisplayRangeByIndices(int item_min, int item_max)
+void ImGuiListClipper::IncludeItemsByIndex(int item_begin, int item_end)
{
ImGuiListClipperData* data = (ImGuiListClipperData*)TempData;
IM_ASSERT(DisplayStart < 0); // Only allowed after Begin() and if there has not been a specified range yet.
- IM_ASSERT(item_min <= item_max);
- if (item_min < item_max)
- data->Ranges.push_back(ImGuiListClipperRange::FromIndices(item_min, item_max));
+ IM_ASSERT(item_begin <= item_end);
+ if (item_begin < item_end)
+ data->Ranges.push_back(ImGuiListClipperRange::FromIndices(item_begin, item_end));
+}
+
+// This is already called while stepping.
+// The ONLY reason you may want to call this is if you passed INT_MAX to ImGuiListClipper::Begin() because you couldn't step item count beforehand.
+void ImGuiListClipper::SeekCursorForItem(int item_n)
+{
+ // - Perform the add and multiply with double to allow seeking through larger ranges.
+ // - StartPosY starts from ItemsFrozen, by adding SeekOffsetY we generally cancel that out (SeekOffsetY == LossynessOffset - ItemsFrozen * ItemsHeight).
+ // - The reason we store SeekOffsetY instead of inferring it, is because we want to allow user to perform Seek after the last step, where ImGuiListClipperData is already done.
+ float pos_y = (float)((double)StartPosY + StartSeekOffsetY + (double)item_n * ItemsHeight);
+ ImGuiListClipper_SeekCursorAndSetupPrevLine(pos_y, ItemsHeight);
}
static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper)
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *clipper->Ctx;
ImGuiWindow* window = g.CurrentWindow;
ImGuiListClipperData* data = (ImGuiListClipperData*)clipper->TempData;
IM_ASSERT(data != NULL && "Called ImGuiListClipper::Step() too many times, or before ImGuiListClipper::Begin() ?");
@@ -2792,7 +3185,8 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper)
bool affected_by_floating_point_precision = ImIsFloatAboveGuaranteedIntegerPrecision(clipper->StartPosY) || ImIsFloatAboveGuaranteedIntegerPrecision(window->DC.CursorPos.y);
if (affected_by_floating_point_precision)
clipper->ItemsHeight = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y; // FIXME: Technically wouldn't allow multi-line entries.
-
+ if (clipper->ItemsHeight == 0.0f && clipper->ItemsCount == INT_MAX) // Accept that no item have been submitted if in indeterminate mode.
+ return false;
IM_ASSERT(clipper->ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!");
calc_clipping = true; // If item height had to be calculated, calculate clipping afterwards.
}
@@ -2801,6 +3195,9 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper)
const int already_submitted = clipper->DisplayEnd;
if (calc_clipping)
{
+ // Record seek offset, this is so ImGuiListClipper::Seek() can be called after ImGuiListClipperData is done
+ clipper->StartSeekOffsetY = (double)data->LossynessOffset - data->ItemsFrozen * (double)clipper->ItemsHeight;
+
if (g.LogEnabled)
{
// If logging is active, do not perform any clipping
@@ -2812,7 +3209,7 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper)
const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav);
if (is_nav_request)
data->Ranges.push_back(ImGuiListClipperRange::FromPositions(g.NavScoringNoClipRect.Min.y, g.NavScoringNoClipRect.Max.y, 0, 0));
- if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && g.NavTabbingDir == -1)
+ if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && g.NavTabbingDir == -1)
data->Ranges.push_back(ImGuiListClipperRange::FromIndices(clipper->ItemsCount - 1, clipper->ItemsCount));
// Add focused/active item
@@ -2821,63 +3218,86 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper)
data->Ranges.push_back(ImGuiListClipperRange::FromPositions(nav_rect_abs.Min.y, nav_rect_abs.Max.y, 0, 0));
// Add visible range
+ float min_y = window->ClipRect.Min.y;
+ float max_y = window->ClipRect.Max.y;
+
+ // Add box selection range
+ ImGuiBoxSelectState* bs = &g.BoxSelectState;
+ if (bs->IsActive && bs->Window == window)
+ {
+ // FIXME: Selectable() use of half-ItemSpacing isn't consistent in matter of layout, as ItemAdd(bb) stray above ItemSize()'s CursorPos.
+ // RangeSelect's BoxSelect relies on comparing overlap of previous and current rectangle and is sensitive to that.
+ // As a workaround we currently half ItemSpacing worth on each side.
+ min_y -= g.Style.ItemSpacing.y;
+ max_y += g.Style.ItemSpacing.y;
+
+ // Box-select on 2D area requires different clipping.
+ if (bs->UnclipMode)
+ data->Ranges.push_back(ImGuiListClipperRange::FromPositions(bs->UnclipRect.Min.y, bs->UnclipRect.Max.y, 0, 0));
+ }
+
const int off_min = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) ? -1 : 0;
const int off_max = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) ? 1 : 0;
- data->Ranges.push_back(ImGuiListClipperRange::FromPositions(window->ClipRect.Min.y, window->ClipRect.Max.y, off_min, off_max));
+ data->Ranges.push_back(ImGuiListClipperRange::FromPositions(min_y, max_y, off_min, off_max));
}
// Convert position ranges to item index ranges
// - Very important: when a starting position is after our maximum item, we set Min to (ItemsCount - 1). This allows us to handle most forms of wrapping.
// - Due to how Selectable extra padding they tend to be "unaligned" with exact unit in the item list,
// which with the flooring/ceiling tend to lead to 2 items instead of one being submitted.
- for (int i = 0; i < data->Ranges.Size; i++)
- if (data->Ranges[i].PosToIndexConvert)
+ for (ImGuiListClipperRange& range : data->Ranges)
+ if (range.PosToIndexConvert)
{
- int m1 = (int)(((double)data->Ranges[i].Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight);
- int m2 = (int)((((double)data->Ranges[i].Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f);
- data->Ranges[i].Min = ImClamp(already_submitted + m1 + data->Ranges[i].PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1);
- data->Ranges[i].Max = ImClamp(already_submitted + m2 + data->Ranges[i].PosToIndexOffsetMax, data->Ranges[i].Min + 1, clipper->ItemsCount);
- data->Ranges[i].PosToIndexConvert = false;
+ int m1 = (int)(((double)range.Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight);
+ int m2 = (int)((((double)range.Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f);
+ range.Min = ImClamp(already_submitted + m1 + range.PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1);
+ range.Max = ImClamp(already_submitted + m2 + range.PosToIndexOffsetMax, range.Min + 1, clipper->ItemsCount);
+ range.PosToIndexConvert = false;
}
ImGuiListClipper_SortAndFuseRanges(data->Ranges, data->StepNo);
}
// Step 0+ (if item height is given in advance) or 1+: Display the next range in line.
- if (data->StepNo < data->Ranges.Size)
+ while (data->StepNo < data->Ranges.Size)
{
clipper->DisplayStart = ImMax(data->Ranges[data->StepNo].Min, already_submitted);
clipper->DisplayEnd = ImMin(data->Ranges[data->StepNo].Max, clipper->ItemsCount);
- if (clipper->DisplayStart > already_submitted) //-V1051
- ImGuiListClipper_SeekCursorForItem(clipper, clipper->DisplayStart);
data->StepNo++;
+ if (clipper->DisplayStart >= clipper->DisplayEnd)
+ continue;
+ if (clipper->DisplayStart > already_submitted)
+ clipper->SeekCursorForItem(clipper->DisplayStart);
return true;
}
// After the last step: Let the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd),
// Advance the cursor to the end of the list and then returns 'false' to end the loop.
if (clipper->ItemsCount < INT_MAX)
- ImGuiListClipper_SeekCursorForItem(clipper, clipper->ItemsCount);
+ clipper->SeekCursorForItem(clipper->ItemsCount);
return false;
}
bool ImGuiListClipper::Step()
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *Ctx;
bool need_items_height = (ItemsHeight <= 0.0f);
bool ret = ImGuiListClipper_StepInternal(this);
- if (ret && (DisplayStart == DisplayEnd))
+ if (ret && (DisplayStart >= DisplayEnd))
ret = false;
if (g.CurrentTable && g.CurrentTable->IsUnfrozenRows == false)
IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): inside frozen table row.\n");
if (need_items_height && ItemsHeight > 0.0f)
IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): computed ItemsHeight: %.2f.\n", ItemsHeight);
if (ret)
+ {
IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): display %d to %d.\n", DisplayStart, DisplayEnd);
+ }
else
+ {
IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): End.\n");
- if (!ret)
End();
+ }
return ret;
}
@@ -2913,13 +3333,14 @@ const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx)
return style.Colors[idx];
}
-ImU32 ImGui::GetColorU32(ImU32 col)
+ImU32 ImGui::GetColorU32(ImU32 col, float alpha_mul)
{
ImGuiStyle& style = GImGui->Style;
- if (style.Alpha >= 1.0f)
+ alpha_mul *= style.Alpha;
+ if (alpha_mul >= 1.0f)
return col;
ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT;
- a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range.
+ a = (ImU32)(a * alpha_mul); // We don't need to clamp 0..255 because alpha is in 0..1 range.
return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);
}
@@ -2931,7 +3352,8 @@ void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col)
backup.Col = idx;
backup.BackupValue = g.Style.Colors[idx];
g.ColorStack.push_back(backup);
- g.Style.Colors[idx] = ColorConvertU32ToFloat4(col);
+ if (g.DebugFlashStyleColorIdx != idx)
+ g.Style.Colors[idx] = ColorConvertU32ToFloat4(col);
}
void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col)
@@ -2941,7 +3363,8 @@ void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col)
backup.Col = idx;
backup.BackupValue = g.Style.Colors[idx];
g.ColorStack.push_back(backup);
- g.Style.Colors[idx] = col;
+ if (g.DebugFlashStyleColorIdx != idx)
+ g.Style.Colors[idx] = col;
}
void ImGui::PopStyleColor(int count)
@@ -2949,7 +3372,7 @@ void ImGui::PopStyleColor(int count)
ImGuiContext& g = *GImGui;
if (g.ColorStack.Size < count)
{
- IM_ASSERT_USER_ERROR(g.ColorStack.Size > count, "Calling PopStyleColor() too many times: stack underflow.");
+ IM_ASSERT_USER_ERROR(0, "Calling PopStyleColor() too many times!");
count = g.ColorStack.Size;
}
while (count > 0)
@@ -2961,76 +3384,105 @@ void ImGui::PopStyleColor(int count)
}
}
-struct ImGuiStyleVarInfo
-{
- ImGuiDataType Type;
- ImU32 Count;
- ImU32 Offset;
- void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); }
-};
-
-static const ImGuiStyleVarInfo GStyleVarInfo[] =
-{
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
+static const ImGuiStyleVarInfo GStyleVarsInfo[] =
+{
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ImageBorderSize) }, // ImGuiStyleVar_ImageBorderSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, TabBorderSize) }, // ImGuiStyleVar_TabBorderSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, TabBarBorderSize) }, // ImGuiStyleVar_TabBarBorderSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, TabBarOverlineSize) }, // ImGuiStyleVar_TabBarOverlineSize
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersAngle)}, // ImGuiStyleVar_TableAngledHeadersAngle
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersTextAlign)},// ImGuiStyleVar_TableAngledHeadersTextAlign
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
+ { 1, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, SeparatorTextBorderSize)}, // ImGuiStyleVar_SeparatorTextBorderSize
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, SeparatorTextAlign) }, // ImGuiStyleVar_SeparatorTextAlign
+ { 2, ImGuiDataType_Float, (ImU32)offsetof(ImGuiStyle, SeparatorTextPadding) }, // ImGuiStyleVar_SeparatorTextPadding
};
-static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx)
+const ImGuiStyleVarInfo* ImGui::GetStyleVarInfo(ImGuiStyleVar idx)
{
IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT);
- IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT);
- return &GStyleVarInfo[idx];
+ IM_STATIC_ASSERT(IM_ARRAYSIZE(GStyleVarsInfo) == ImGuiStyleVar_COUNT);
+ return &GStyleVarsInfo[idx];
}
void ImGui::PushStyleVar(ImGuiStyleVar idx, float val)
{
+ ImGuiContext& g = *GImGui;
const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
- if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1)
+ if (var_info->DataType != ImGuiDataType_Float || var_info->Count != 1)
{
- ImGuiContext& g = *GImGui;
- float* pvar = (float*)var_info->GetVarPtr(&g.Style);
- g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar));
- *pvar = val;
+ IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!");
+ return;
+ }
+ float* pvar = (float*)var_info->GetVarPtr(&g.Style);
+ g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar));
+ *pvar = val;
+}
+
+void ImGui::PushStyleVarX(ImGuiStyleVar idx, float val_x)
+{
+ ImGuiContext& g = *GImGui;
+ const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
+ if (var_info->DataType != ImGuiDataType_Float || var_info->Count != 2)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!");
+ return;
+ }
+ ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);
+ g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar));
+ pvar->x = val_x;
+}
+
+void ImGui::PushStyleVarY(ImGuiStyleVar idx, float val_y)
+{
+ ImGuiContext& g = *GImGui;
+ const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
+ if (var_info->DataType != ImGuiDataType_Float || var_info->Count != 2)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!");
return;
}
- IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!");
+ ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);
+ g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar));
+ pvar->y = val_y;
}
void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val)
{
+ ImGuiContext& g = *GImGui;
const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);
- if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2)
+ if (var_info->DataType != ImGuiDataType_Float || var_info->Count != 2)
{
- ImGuiContext& g = *GImGui;
- ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);
- g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar));
- *pvar = val;
+ IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!");
return;
}
- IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!");
+ ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);
+ g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar));
+ *pvar = val;
}
void ImGui::PopStyleVar(int count)
@@ -3038,17 +3490,17 @@ void ImGui::PopStyleVar(int count)
ImGuiContext& g = *GImGui;
if (g.StyleVarStack.Size < count)
{
- IM_ASSERT_USER_ERROR(g.StyleVarStack.Size > count, "Calling PopStyleVar() too many times: stack underflow.");
+ IM_ASSERT_USER_ERROR(0, "Calling PopStyleVar() too many times!");
count = g.StyleVarStack.Size;
}
while (count > 0)
{
// We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it.
ImGuiStyleMod& backup = g.StyleVarStack.back();
- const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx);
- void* data = info->GetVarPtr(&g.Style);
- if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; }
- else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; }
+ const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(backup.VarIdx);
+ void* data = var_info->GetVarPtr(&g.Style);
+ if (var_info->DataType == ImGuiDataType_Float && var_info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; }
+ else if (var_info->DataType == ImGuiDataType_Float && var_info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; }
g.StyleVarStack.pop_back();
count--;
}
@@ -3092,11 +3544,13 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
case ImGuiCol_ResizeGrip: return "ResizeGrip";
case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered";
case ImGuiCol_ResizeGripActive: return "ResizeGripActive";
- case ImGuiCol_Tab: return "Tab";
case ImGuiCol_TabHovered: return "TabHovered";
- case ImGuiCol_TabActive: return "TabActive";
- case ImGuiCol_TabUnfocused: return "TabUnfocused";
- case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive";
+ case ImGuiCol_Tab: return "Tab";
+ case ImGuiCol_TabSelected: return "TabSelected";
+ case ImGuiCol_TabSelectedOverline: return "TabSelectedOverline";
+ case ImGuiCol_TabDimmed: return "TabDimmed";
+ case ImGuiCol_TabDimmedSelected: return "TabDimmedSelected";
+ case ImGuiCol_TabDimmedSelectedOverline: return "TabDimmedSelectedOverline";
case ImGuiCol_PlotLines: return "PlotLines";
case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered";
case ImGuiCol_PlotHistogram: return "PlotHistogram";
@@ -3106,9 +3560,10 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
case ImGuiCol_TableBorderLight: return "TableBorderLight";
case ImGuiCol_TableRowBg: return "TableRowBg";
case ImGuiCol_TableRowBgAlt: return "TableRowBgAlt";
+ case ImGuiCol_TextLink: return "TextLink";
case ImGuiCol_TextSelectedBg: return "TextSelectedBg";
case ImGuiCol_DragDropTarget: return "DragDropTarget";
- case ImGuiCol_NavHighlight: return "NavHighlight";
+ case ImGuiCol_NavCursor: return "NavCursor";
case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight";
case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg";
case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg";
@@ -3117,7 +3572,6 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
return "Unknown";
}
-
//-----------------------------------------------------------------------------
// [SECTION] RENDER HELPERS
// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change,
@@ -3152,7 +3606,7 @@ void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool
else
{
if (!text_end)
- text_end = text + strlen(text); // FIXME-OPT
+ text_end = text + ImStrlen(text); // FIXME-OPT
text_display_end = text_end;
}
@@ -3170,7 +3624,7 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
ImGuiWindow* window = g.CurrentWindow;
if (!text_end)
- text_end = text + strlen(text); // FIXME-OPT
+ text_end = text + ImStrlen(text); // FIXME-OPT
if (text != text_end)
{
@@ -3182,6 +3636,9 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
// Default clip_rect uses (pos_min,pos_max)
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
+// FIXME-OPT: Since we have or calculate text_size we could coarse clip whole block immediately, especally for text above draw_list->DrawList.
+// Effectively as this is called from widget doing their own coarse clipping it's not very valuable presently. Next time function will take
+// better advantage of the render function taking size into account for coarse clipping.
void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
{
// Perform CPU side clipping for single clipped element to avoid using scissor state
@@ -3225,7 +3682,6 @@ void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons
LogRenderedText(&pos_min, text, text_display_end);
}
-
// Another overly complex function until we reorganize everything into a nice all-in-one helper.
// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display.
// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move.
@@ -3247,32 +3703,14 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, con
// min max ellipsis_max
// <-> this is generally some padding value
- const ImFont* font = draw_list->_Data->Font;
+ ImFont* font = draw_list->_Data->Font;
const float font_size = draw_list->_Data->FontSize;
+ const float font_scale = draw_list->_Data->FontScale;
const char* text_end_ellipsis = NULL;
-
- ImWchar ellipsis_char = font->EllipsisChar;
- int ellipsis_char_count = 1;
- if (ellipsis_char == (ImWchar)-1)
- {
- ellipsis_char = font->DotChar;
- ellipsis_char_count = 3;
- }
- const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char);
-
- float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side
- float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis
-
- if (ellipsis_char_count > 1)
- {
- // Full ellipsis size without free spacing after it.
- const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize);
- ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots;
- ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots;
- }
+ const float ellipsis_width = font->EllipsisWidth * font_scale;
// We can now claim the space between pos_max.x and ellipsis_max.x
- const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f);
+ const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_width) - pos_min.x, 1.0f);
float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x;
if (text == text_end_ellipsis && text_end_ellipsis < text_end_full)
{
@@ -3289,13 +3727,10 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, con
// Render text, render ellipsis
RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f));
- float ellipsis_x = pos_min.x + text_size_clipped_x;
- if (ellipsis_x + ellipsis_total_width <= ellipsis_max_x)
- for (int i = 0; i < ellipsis_char_count; i++)
- {
- font->RenderChar(draw_list, font_size, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_char);
- ellipsis_x += ellipsis_glyph_width;
- }
+ ImVec2 ellipsis_pos = ImTrunc(ImVec2(pos_min.x + text_size_clipped_x, pos_min.y));
+ if (ellipsis_pos.x + ellipsis_width <= ellipsis_max_x)
+ for (int i = 0; i < font->EllipsisCharCount; i++, ellipsis_pos.x += font->EllipsisCharStep * font_scale)
+ font->RenderChar(draw_list, font_size, ellipsis_pos, GetColorU32(ImGuiCol_Text), font->EllipsisChar);
}
else
{
@@ -3307,13 +3742,13 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, con
}
// Render a rectangle shaped with optional rounding and borders
-void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding)
+void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool borders, float rounding)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding);
const float border_size = g.Style.FrameBorderSize;
- if (border && border_size > 0.0f)
+ if (borders && border_size > 0.0f)
{
window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size);
window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size);
@@ -3332,74 +3767,537 @@ void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding)
}
}
-void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags)
+void ImGui::RenderNavCursor(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags)
{
ImGuiContext& g = *GImGui;
if (id != g.NavId)
return;
- if (g.NavDisableHighlight && !(flags & ImGuiNavHighlightFlags_AlwaysDraw))
+ if (!g.NavCursorVisible && !(flags & ImGuiNavRenderCursorFlags_AlwaysDraw))
+ return;
+ if (id == g.LastItemData.ID && (g.LastItemData.ItemFlags & ImGuiItemFlags_NoNav))
return;
ImGuiWindow* window = g.CurrentWindow;
if (window->DC.NavHideHighlightOneFrame)
return;
- float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding;
+ float rounding = (flags & ImGuiNavRenderCursorFlags_NoRounding) ? 0.0f : g.Style.FrameRounding;
ImRect display_rect = bb;
display_rect.ClipWith(window->ClipRect);
- if (flags & ImGuiNavHighlightFlags_TypeDefault)
+ const float thickness = 2.0f;
+ if (flags & ImGuiNavRenderCursorFlags_Compact)
+ {
+ window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavCursor), rounding, 0, thickness);
+ }
+ else
{
- const float THICKNESS = 2.0f;
- const float DISTANCE = 3.0f + THICKNESS * 0.5f;
- display_rect.Expand(ImVec2(DISTANCE, DISTANCE));
+ const float distance = 3.0f + thickness * 0.5f;
+ display_rect.Expand(ImVec2(distance, distance));
bool fully_visible = window->ClipRect.Contains(display_rect);
if (!fully_visible)
window->DrawList->PushClipRect(display_rect.Min, display_rect.Max);
- window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS);
+ window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavCursor), rounding, 0, thickness);
if (!fully_visible)
window->DrawList->PopClipRect();
}
- if (flags & ImGuiNavHighlightFlags_TypeThin)
- {
- window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f);
- }
}
void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
{
ImGuiContext& g = *GImGui;
- IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT);
- for (int n = 0; n < g.Viewports.Size; n++)
+ if (mouse_cursor <= ImGuiMouseCursor_None || mouse_cursor >= ImGuiMouseCursor_COUNT) // We intentionally accept out of bound values.
+ mouse_cursor = ImGuiMouseCursor_Arrow;
+ ImFontAtlas* font_atlas = g.DrawListSharedData.Font->ContainerAtlas;
+ for (ImGuiViewportP* viewport : g.Viewports)
{
- ImGuiViewportP* viewport = g.Viewports[n];
- ImDrawList* draw_list = GetForegroundDrawList(viewport);
- ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas;
+ // We scale cursor with current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor.
ImVec2 offset, size, uv[4];
- if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
+ if (!ImFontAtlasGetMouseCursorTexData(font_atlas, mouse_cursor, &offset, &size, &uv[0], &uv[2]))
+ continue;
+ const ImVec2 pos = base_pos - offset;
+ const float scale = base_scale;
+ if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale)))
+ continue;
+ ImDrawList* draw_list = GetForegroundDrawList(viewport);
+ ImTextureID tex_id = font_atlas->TexID;
+ draw_list->PushTextureID(tex_id);
+ draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
+ draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
+ draw_list->AddImage(tex_id, pos, pos + size * scale, uv[2], uv[3], col_border);
+ draw_list->AddImage(tex_id, pos, pos + size * scale, uv[0], uv[1], col_fill);
+ if (mouse_cursor == ImGuiMouseCursor_Wait || mouse_cursor == ImGuiMouseCursor_Progress)
{
- const ImVec2 pos = base_pos - offset;
- const float scale = base_scale;
- ImTextureID tex_id = font_atlas->TexID;
- draw_list->PushTextureID(tex_id);
- draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow);
- draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow);
- draw_list->AddImage(tex_id, pos, pos + size * scale, uv[2], uv[3], col_border);
- draw_list->AddImage(tex_id, pos, pos + size * scale, uv[0], uv[1], col_fill);
- draw_list->PopTextureID();
+ float a_min = ImFmod((float)g.Time * 5.0f, 2.0f * IM_PI);
+ float a_max = a_min + IM_PI * 1.65f;
+ draw_list->PathArcTo(pos + ImVec2(14, -1) * scale, 6.0f * scale, a_min, a_max);
+ draw_list->PathStroke(col_fill, ImDrawFlags_None, 3.0f * scale);
}
+ draw_list->PopTextureID();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] INITIALIZATION, SHUTDOWN
+//-----------------------------------------------------------------------------
+
+// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself
+// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module
+ImGuiContext* ImGui::GetCurrentContext()
+{
+ return GImGui;
+}
+
+void ImGui::SetCurrentContext(ImGuiContext* ctx)
+{
+#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC
+ IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this.
+#else
+ GImGui = ctx;
+#endif
+}
+
+void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data)
+{
+ GImAllocatorAllocFunc = alloc_func;
+ GImAllocatorFreeFunc = free_func;
+ GImAllocatorUserData = user_data;
+}
+
+// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space)
+void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data)
+{
+ *p_alloc_func = GImAllocatorAllocFunc;
+ *p_free_func = GImAllocatorFreeFunc;
+ *p_user_data = GImAllocatorUserData;
+}
+
+ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas)
+{
+ ImGuiContext* prev_ctx = GetCurrentContext();
+ ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas);
+ SetCurrentContext(ctx);
+ Initialize();
+ if (prev_ctx != NULL)
+ SetCurrentContext(prev_ctx); // Restore previous context if any, else keep new one.
+ return ctx;
+}
+
+void ImGui::DestroyContext(ImGuiContext* ctx)
+{
+ ImGuiContext* prev_ctx = GetCurrentContext();
+ if (ctx == NULL) //-V1051
+ ctx = prev_ctx;
+ SetCurrentContext(ctx);
+ Shutdown();
+ SetCurrentContext((prev_ctx != ctx) ? prev_ctx : NULL);
+ IM_DELETE(ctx);
+}
+
+// IMPORTANT: interactive elements requires a fixed ###xxx suffix, it must be same in ALL languages to allow for automation.
+static const ImGuiLocEntry GLocalizationEntriesEnUS[] =
+{
+ { ImGuiLocKey_VersionStr, "Dear ImGui " IMGUI_VERSION " (" IM_STRINGIFY(IMGUI_VERSION_NUM) ")" },
+ { ImGuiLocKey_TableSizeOne, "Size column to fit###SizeOne" },
+ { ImGuiLocKey_TableSizeAllFit, "Size all columns to fit###SizeAll" },
+ { ImGuiLocKey_TableSizeAllDefault, "Size all columns to default###SizeAll" },
+ { ImGuiLocKey_TableResetOrder, "Reset order###ResetOrder" },
+ { ImGuiLocKey_WindowingMainMenuBar, "(Main menu bar)" },
+ { ImGuiLocKey_WindowingPopup, "(Popup)" },
+ { ImGuiLocKey_WindowingUntitled, "(Untitled)" },
+ { ImGuiLocKey_OpenLink_s, "Open '%s'" },
+ { ImGuiLocKey_CopyLink, "Copy Link###CopyLink" },
+};
+
+ImGuiContext::ImGuiContext(ImFontAtlas* shared_font_atlas)
+{
+ IO.Ctx = this;
+ InputTextState.Ctx = this;
+
+ Initialized = false;
+ FontAtlasOwnedByContext = shared_font_atlas ? false : true;
+ Font = NULL;
+ FontSize = FontBaseSize = FontScale = CurrentDpiScale = 0.0f;
+ IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
+ Time = 0.0f;
+ FrameCount = 0;
+ FrameCountEnded = FrameCountRendered = -1;
+ WithinEndChildID = 0;
+ WithinFrameScope = WithinFrameScopeWithImplicitWindow = false;
+ GcCompactAll = false;
+ TestEngineHookItems = false;
+ TestEngine = NULL;
+ memset(ContextName, 0, sizeof(ContextName));
+
+ InputEventsNextMouseSource = ImGuiMouseSource_Mouse;
+ InputEventsNextEventId = 1;
+
+ WindowsActiveCount = 0;
+ WindowsBorderHoverPadding = 0.0f;
+ CurrentWindow = NULL;
+ HoveredWindow = NULL;
+ HoveredWindowUnderMovingWindow = NULL;
+ HoveredWindowBeforeClear = NULL;
+ MovingWindow = NULL;
+ WheelingWindow = NULL;
+ WheelingWindowStartFrame = WheelingWindowScrolledFrame = -1;
+ WheelingWindowReleaseTimer = 0.0f;
+
+ DebugDrawIdConflicts = 0;
+ DebugHookIdInfo = 0;
+ HoveredId = HoveredIdPreviousFrame = 0;
+ HoveredIdPreviousFrameItemCount = 0;
+ HoveredIdAllowOverlap = false;
+ HoveredIdIsDisabled = false;
+ HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
+ ItemUnclipByLog = false;
+ ActiveId = 0;
+ ActiveIdIsAlive = 0;
+ ActiveIdTimer = 0.0f;
+ ActiveIdIsJustActivated = false;
+ ActiveIdAllowOverlap = false;
+ ActiveIdNoClearOnFocusLoss = false;
+ ActiveIdHasBeenPressedBefore = false;
+ ActiveIdHasBeenEditedBefore = false;
+ ActiveIdHasBeenEditedThisFrame = false;
+ ActiveIdFromShortcut = false;
+ ActiveIdClickOffset = ImVec2(-1, -1);
+ ActiveIdWindow = NULL;
+ ActiveIdSource = ImGuiInputSource_None;
+ ActiveIdMouseButton = -1;
+ ActiveIdPreviousFrame = 0;
+ memset(&DeactivatedItemData, 0, sizeof(DeactivatedItemData));
+ memset(&ActiveIdValueOnActivation, 0, sizeof(ActiveIdValueOnActivation));
+ LastActiveId = 0;
+ LastActiveIdTimer = 0.0f;
+
+ LastKeyboardKeyPressTime = LastKeyModsChangeTime = LastKeyModsChangeFromNoneTime = -1.0;
+
+ ActiveIdUsingNavDirMask = 0x00;
+ ActiveIdUsingAllKeyboardKeys = false;
+
+ CurrentFocusScopeId = 0;
+ CurrentItemFlags = ImGuiItemFlags_None;
+ DebugShowGroupRects = false;
+
+ NavCursorVisible = false;
+ NavHighlightItemUnderNav = false;
+ NavMousePosDirty = false;
+ NavIdIsAlive = false;
+ NavId = 0;
+ NavWindow = NULL;
+ NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = 0;
+ NavLayer = ImGuiNavLayer_Main;
+ NavNextActivateId = 0;
+ NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None;
+ NavHighlightActivatedId = 0;
+ NavHighlightActivatedTimer = 0.0f;
+ NavInputSource = ImGuiInputSource_Keyboard;
+ NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
+ NavCursorHideFrames = 0;
+
+ NavAnyRequest = false;
+ NavInitRequest = false;
+ NavInitRequestFromMove = false;
+ NavMoveSubmitted = false;
+ NavMoveScoringItems = false;
+ NavMoveForwardToNextFrame = false;
+ NavMoveFlags = ImGuiNavMoveFlags_None;
+ NavMoveScrollFlags = ImGuiScrollFlags_None;
+ NavMoveKeyMods = ImGuiMod_None;
+ NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None;
+ NavScoringDebugCount = 0;
+ NavTabbingDir = 0;
+ NavTabbingCounter = 0;
+
+ NavJustMovedFromFocusScopeId = NavJustMovedToId = NavJustMovedToFocusScopeId = 0;
+ NavJustMovedToKeyMods = ImGuiMod_None;
+ NavJustMovedToIsTabbing = false;
+ NavJustMovedToHasSelectionData = false;
+
+ // All platforms use Ctrl+Tab but Ctrl<>Super are swapped on Mac...
+ // FIXME: Because this value is stored, it annoyingly interfere with toggling io.ConfigMacOSXBehaviors updating this..
+ ConfigNavWindowingKeyNext = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiKey_Tab);
+ ConfigNavWindowingKeyPrev = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab);
+ NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
+ NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
+ NavWindowingToggleLayer = false;
+ NavWindowingToggleKey = ImGuiKey_None;
+
+ DimBgRatio = 0.0f;
+
+ DragDropActive = DragDropWithinSource = DragDropWithinTarget = false;
+ DragDropSourceFlags = ImGuiDragDropFlags_None;
+ DragDropSourceFrameCount = -1;
+ DragDropMouseButton = -1;
+ DragDropTargetId = 0;
+ DragDropAcceptFlags = ImGuiDragDropFlags_None;
+ DragDropAcceptIdCurrRectSurface = 0.0f;
+ DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
+ DragDropAcceptFrameCount = -1;
+ DragDropHoldJustPressedId = 0;
+ memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
+
+ ClipperTempDataStacked = 0;
+
+ CurrentTable = NULL;
+ TablesTempDataStacked = 0;
+ CurrentTabBar = NULL;
+ CurrentMultiSelect = NULL;
+ MultiSelectTempDataStacked = 0;
+
+ HoverItemDelayId = HoverItemDelayIdPreviousFrame = HoverItemUnlockedStationaryId = HoverWindowUnlockedStationaryId = 0;
+ HoverItemDelayTimer = HoverItemDelayClearTimer = 0.0f;
+
+ MouseCursor = ImGuiMouseCursor_Arrow;
+ MouseStationaryTimer = 0.0f;
+
+ TempInputId = 0;
+ memset(&DataTypeZeroValue, 0, sizeof(DataTypeZeroValue));
+ BeginMenuDepth = BeginComboDepth = 0;
+ ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
+ ColorEditCurrentID = ColorEditSavedID = 0;
+ ColorEditSavedHue = ColorEditSavedSat = 0.0f;
+ ColorEditSavedColor = 0;
+ WindowResizeRelativeMode = false;
+ ScrollbarSeekMode = 0;
+ ScrollbarClickDeltaToGrabCenter = 0.0f;
+ SliderGrabClickOffset = 0.0f;
+ SliderCurrentAccum = 0.0f;
+ SliderCurrentAccumDirty = false;
+ DragCurrentAccumDirty = false;
+ DragCurrentAccum = 0.0f;
+ DragSpeedDefaultRatio = 1.0f / 100.0f;
+ DisabledAlphaBackup = 0.0f;
+ DisabledStackSize = 0;
+ TooltipOverrideCount = 0;
+ TooltipPreviousWindow = NULL;
+
+ PlatformImeData.InputPos = ImVec2(0.0f, 0.0f);
+ PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission
+
+ SettingsLoaded = false;
+ SettingsDirtyTimer = 0.0f;
+ HookIdNext = 0;
+
+ memset(LocalizationTable, 0, sizeof(LocalizationTable));
+
+ LogEnabled = false;
+ LogFlags = ImGuiLogFlags_None;
+ LogWindow = NULL;
+ LogNextPrefix = LogNextSuffix = NULL;
+ LogFile = NULL;
+ LogLinePosY = FLT_MAX;
+ LogLineFirstItem = false;
+ LogDepthRef = 0;
+ LogDepthToExpand = LogDepthToExpandDefault = 2;
+
+ ErrorCallback = NULL;
+ ErrorCallbackUserData = NULL;
+ ErrorFirst = true;
+ ErrorCountCurrentFrame = 0;
+ StackSizesInBeginForCurrentWindow = NULL;
+
+ DebugDrawIdConflictsCount = 0;
+ DebugLogFlags = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_OutputToTTY;
+ DebugLocateId = 0;
+ DebugLogSkippedErrors = 0;
+ DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None;
+ DebugLogAutoDisableFrames = 0;
+ DebugLocateFrames = 0;
+ DebugBeginReturnValueCullDepth = -1;
+ DebugItemPickerActive = false;
+ DebugItemPickerMouseButton = ImGuiMouseButton_Left;
+ DebugItemPickerBreakId = 0;
+ DebugFlashStyleColorTime = 0.0f;
+ DebugFlashStyleColorIdx = ImGuiCol_COUNT;
+
+ // Same as DebugBreakClearData(). Those fields are scattered in their respective subsystem to stay in hot-data locations
+ DebugBreakInWindow = 0;
+ DebugBreakInTable = 0;
+ DebugBreakInLocateId = false;
+ DebugBreakKeyChord = ImGuiKey_Pause;
+ DebugBreakInShortcutRouting = ImGuiKey_None;
+
+ memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
+ FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0;
+ FramerateSecPerFrameAccum = 0.0f;
+ WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
+ memset(TempKeychordName, 0, sizeof(TempKeychordName));
+}
+
+void ImGui::Initialize()
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
+
+ // Add .ini handle for ImGuiWindow and ImGuiTable types
+ {
+ ImGuiSettingsHandler ini_handler;
+ ini_handler.TypeName = "Window";
+ ini_handler.TypeHash = ImHashStr("Window");
+ ini_handler.ClearAllFn = WindowSettingsHandler_ClearAll;
+ ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen;
+ ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine;
+ ini_handler.ApplyAllFn = WindowSettingsHandler_ApplyAll;
+ ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll;
+ AddSettingsHandler(&ini_handler);
+ }
+ TableSettingsAddSettingsHandler();
+
+ // Setup default localization table
+ LocalizeRegisterEntries(GLocalizationEntriesEnUS, IM_ARRAYSIZE(GLocalizationEntriesEnUS));
+
+ // Setup default ImGuiPlatformIO clipboard/IME handlers.
+ g.PlatformIO.Platform_GetClipboardTextFn = Platform_GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations
+ g.PlatformIO.Platform_SetClipboardTextFn = Platform_SetClipboardTextFn_DefaultImpl;
+ g.PlatformIO.Platform_OpenInShellFn = Platform_OpenInShellFn_DefaultImpl;
+ g.PlatformIO.Platform_SetImeDataFn = Platform_SetImeDataFn_DefaultImpl;
+
+ // Create default viewport
+ ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)();
+ viewport->ID = IMGUI_VIEWPORT_DEFAULT_ID;
+ g.Viewports.push_back(viewport);
+ g.TempBuffer.resize(1024 * 3 + 1, 0);
+
+ // Build KeysMayBeCharInput[] lookup table (1 bool per named key)
+ for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
+ if ((key >= ImGuiKey_0 && key <= ImGuiKey_9) || (key >= ImGuiKey_A && key <= ImGuiKey_Z) || (key >= ImGuiKey_Keypad0 && key <= ImGuiKey_Keypad9)
+ || key == ImGuiKey_Tab || key == ImGuiKey_Space || key == ImGuiKey_Apostrophe || key == ImGuiKey_Comma || key == ImGuiKey_Minus || key == ImGuiKey_Period
+ || key == ImGuiKey_Slash || key == ImGuiKey_Semicolon || key == ImGuiKey_Equal || key == ImGuiKey_LeftBracket || key == ImGuiKey_RightBracket || key == ImGuiKey_GraveAccent
+ || key == ImGuiKey_KeypadDecimal || key == ImGuiKey_KeypadDivide || key == ImGuiKey_KeypadMultiply || key == ImGuiKey_KeypadSubtract || key == ImGuiKey_KeypadAdd || key == ImGuiKey_KeypadEqual)
+ g.KeysMayBeCharInput.SetBit(key);
+
+#ifdef IMGUI_HAS_DOCK
+#endif
+
+ g.Initialized = true;
+}
+
+// This function is merely here to free heap allocations.
+void ImGui::Shutdown()
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT_USER_ERROR(g.IO.BackendPlatformUserData == NULL, "Forgot to shutdown Platform backend?");
+ IM_ASSERT_USER_ERROR(g.IO.BackendRendererUserData == NULL, "Forgot to shutdown Renderer backend?");
+
+ // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)
+ if (g.IO.Fonts && g.FontAtlasOwnedByContext)
+ {
+ g.IO.Fonts->Locked = false;
+ IM_DELETE(g.IO.Fonts);
+ }
+ g.IO.Fonts = NULL;
+ g.DrawListSharedData.TempBuffer.clear();
+
+ // Cleanup of other data are conditional on actually having initialized Dear ImGui.
+ if (!g.Initialized)
+ return;
+
+ // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file)
+ if (g.SettingsLoaded && g.IO.IniFilename != NULL)
+ SaveIniSettingsToDisk(g.IO.IniFilename);
+
+ CallContextHooks(&g, ImGuiContextHookType_Shutdown);
+
+ // Clear everything else
+ g.Windows.clear_delete();
+ g.WindowsFocusOrder.clear();
+ g.WindowsTempSortBuffer.clear();
+ g.CurrentWindow = NULL;
+ g.CurrentWindowStack.clear();
+ g.WindowsById.Clear();
+ g.NavWindow = NULL;
+ g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL;
+ g.ActiveIdWindow = NULL;
+ g.MovingWindow = NULL;
+
+ g.KeysRoutingTable.Clear();
+
+ g.ColorStack.clear();
+ g.StyleVarStack.clear();
+ g.FontStack.clear();
+ g.OpenPopupStack.clear();
+ g.BeginPopupStack.clear();
+ g.TreeNodeStack.clear();
+
+ g.Viewports.clear_delete();
+
+ g.TabBars.Clear();
+ g.CurrentTabBarStack.clear();
+ g.ShrinkWidthBuffer.clear();
+
+ g.ClipperTempData.clear_destruct();
+
+ g.Tables.Clear();
+ g.TablesTempData.clear_destruct();
+ g.DrawChannelsTempMergeBuffer.clear();
+
+ g.MultiSelectStorage.Clear();
+ g.MultiSelectTempData.clear_destruct();
+
+ g.ClipboardHandlerData.clear();
+ g.MenusIdSubmittedThisFrame.clear();
+ g.InputTextState.ClearFreeMemory();
+ g.InputTextDeactivatedState.ClearFreeMemory();
+
+ g.SettingsWindows.clear();
+ g.SettingsHandlers.clear();
+
+ if (g.LogFile)
+ {
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
+ if (g.LogFile != stdout)
+#endif
+ ImFileClose(g.LogFile);
+ g.LogFile = NULL;
}
+ g.LogBuffer.clear();
+ g.DebugLogBuf.clear();
+ g.DebugLogIndex.clear();
+
+ g.Initialized = false;
}
+// No specific ordering/dependency support, will see as needed
+ImGuiID ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook)
+{
+ ImGuiContext& g = *ctx;
+ IM_ASSERT(hook->Callback != NULL && hook->HookId == 0 && hook->Type != ImGuiContextHookType_PendingRemoval_);
+ g.Hooks.push_back(*hook);
+ g.Hooks.back().HookId = ++g.HookIdNext;
+ return g.HookIdNext;
+}
+
+// Deferred removal, avoiding issue with changing vector while iterating it
+void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id)
+{
+ ImGuiContext& g = *ctx;
+ IM_ASSERT(hook_id != 0);
+ for (ImGuiContextHook& hook : g.Hooks)
+ if (hook.HookId == hook_id)
+ hook.Type = ImGuiContextHookType_PendingRemoval_;
+}
+
+// Call context hooks (used by e.g. test engine)
+// We assume a small number of hooks so all stored in same array
+void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type)
+{
+ ImGuiContext& g = *ctx;
+ for (ImGuiContextHook& hook : g.Hooks)
+ if (hook.Type == hook_type)
+ hook.Callback(&g, &hook);
+}
//-----------------------------------------------------------------------------
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
//-----------------------------------------------------------------------------
// ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods
-ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst(NULL)
+ImGuiWindow::ImGuiWindow(ImGuiContext* ctx, const char* name) : DrawListInst(NULL)
{
memset(this, 0, sizeof(*this));
+ Ctx = ctx;
Name = ImStrdup(name);
- NameBufLen = (int)strlen(name) + 1;
+ NameBufLen = (int)ImStrlen(name) + 1;
ID = ImHashStr(name);
IDStack.push_back(ID);
MoveId = GetID("#MOVE");
@@ -3407,15 +4305,17 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst
ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f);
AutoFitFramesX = AutoFitFramesY = -1;
AutoPosLastDirection = ImGuiDir_None;
- SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing;
+ SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = 0;
SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX);
LastFrameActive = -1;
LastTimeActive = -1.0f;
- FontWindowScale = 1.0f;
+ FontRefSize = 0.0f;
+ FontWindowScale = FontWindowScaleParents = 1.0f;
SettingsOffset = -1;
DrawList = &DrawListInst;
- DrawList->_Data = &context->DrawListSharedData;
DrawList->_OwnerName = Name;
+ DrawList->_Data = &Ctx->DrawListSharedData;
+ NavPreferredScoringPosRel[0] = NavPreferredScoringPosRel[1] = ImVec2(FLT_MAX, FLT_MAX);
}
ImGuiWindow::~ImGuiWindow()
@@ -3425,52 +4325,19 @@ ImGuiWindow::~ImGuiWindow()
ColumnsStorage.clear_destruct();
}
-ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
-{
- ImGuiID seed = IDStack.back();
- ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
- ImGuiContext& g = *GImGui;
- if (g.DebugHookIdInfo == id)
- ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
- return id;
-}
-
-ImGuiID ImGuiWindow::GetID(const void* ptr)
-{
- ImGuiID seed = IDStack.back();
- ImGuiID id = ImHashData(&ptr, sizeof(void*), seed);
- ImGuiContext& g = *GImGui;
- if (g.DebugHookIdInfo == id)
- ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL);
- return id;
-}
-
-ImGuiID ImGuiWindow::GetID(int n)
-{
- ImGuiID seed = IDStack.back();
- ImGuiID id = ImHashData(&n, sizeof(n), seed);
- ImGuiContext& g = *GImGui;
- if (g.DebugHookIdInfo == id)
- ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
- return id;
-}
-
-// This is only used in rare/specific situations to manufacture an ID out of nowhere.
-ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs)
-{
- ImGuiID seed = IDStack.back();
- ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs);
- ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed);
- return id;
-}
-
static void SetCurrentWindow(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
g.CurrentWindow = window;
+ g.StackSizesInBeginForCurrentWindow = g.CurrentWindow ? &g.CurrentWindowStack.back().StackSizesInBegin : NULL;
g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL;
+ g.CurrentDpiScale = 1.0f; // FIXME-DPI: WIP this is modified in docking
if (window)
+ {
g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize();
+ g.FontScale = g.DrawListSharedData.FontScale = g.FontSize / g.Font->FontSize;
+ ImGui::NavUpdateCurrentWindowIsScrollPushableX();
+ }
}
void ImGui::GcCompactTransientMiscBuffers()
@@ -3478,6 +4345,8 @@ void ImGui::GcCompactTransientMiscBuffers()
ImGuiContext& g = *GImGui;
g.ItemFlagsStack.clear();
g.GroupStack.clear();
+ g.MultiSelectTempDataStacked = 0;
+ g.MultiSelectTempData.clear_destruct();
TableGcCompactSettings();
}
@@ -3511,13 +4380,30 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
- // While most behaved code would make an effort to not steal active id during window move/drag operations,
- // we at least need to be resilient to it. Cancelling the move is rather aggressive and users of 'master' branch
- // may prefer the weird ill-defined half working situation ('docking' did assert), so may need to rework that.
- if (g.MovingWindow != NULL && g.ActiveId == g.MovingWindow->MoveId)
+ // Clear previous active id
+ if (g.ActiveId != 0)
{
- IMGUI_DEBUG_LOG_ACTIVEID("SetActiveID() cancel MovingWindow\n");
- g.MovingWindow = NULL;
+ // While most behaved code would make an effort to not steal active id during window move/drag operations,
+ // we at least need to be resilient to it. Canceling the move is rather aggressive and users of 'master' branch
+ // may prefer the weird ill-defined half working situation ('docking' did assert), so may need to rework that.
+ if (g.MovingWindow != NULL && g.ActiveId == g.MovingWindow->MoveId)
+ {
+ IMGUI_DEBUG_LOG_ACTIVEID("SetActiveID() cancel MovingWindow\n");
+ g.MovingWindow = NULL;
+ }
+
+ // Store deactivate data
+ ImGuiDeactivatedItemData* deactivated_data = &g.DeactivatedItemData;
+ deactivated_data->ID = g.ActiveId;
+ deactivated_data->ElapseFrame = (g.LastItemData.ID == g.ActiveId) ? g.FrameCount : g.FrameCount + 1; // FIXME: OK to use LastItemData?
+ deactivated_data->HasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
+ deactivated_data->IsAlive = (g.ActiveIdIsAlive == g.ActiveId);
+
+ // This could be written in a more general way (e.g associate a hook to ActiveId),
+ // but since this is currently quite an exception we'll leave it as is.
+ // One common scenario leading to this is: pressing Key ->NavMoveRequestApplyResult() -> ClearActiveID()
+ if (g.InputTextState.ID == g.ActiveId)
+ InputTextDeactivateHook(g.ActiveId);
}
// Set active id
@@ -3540,19 +4426,18 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
g.ActiveIdNoClearOnFocusLoss = false;
g.ActiveIdWindow = window;
g.ActiveIdHasBeenEditedThisFrame = false;
+ g.ActiveIdFromShortcut = false;
if (id)
{
g.ActiveIdIsAlive = id;
- g.ActiveIdSource = (g.NavActivateId == id || g.NavActivateInputId == id || g.NavJustMovedToId == id) ? (ImGuiInputSource)ImGuiInputSource_Nav : ImGuiInputSource_Mouse;
+ g.ActiveIdSource = (g.NavActivateId == id || g.NavJustMovedToId == id) ? g.NavInputSource : ImGuiInputSource_Mouse;
+ IM_ASSERT(g.ActiveIdSource != ImGuiInputSource_None);
}
// Clear declaration of inputs claimed by the widget
// (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet)
g.ActiveIdUsingNavDirMask = 0x00;
g.ActiveIdUsingAllKeyboardKeys = false;
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- g.ActiveIdUsingNavInputMask = 0x00;
-#endif
}
void ImGui::ClearActiveID()
@@ -3575,31 +4460,31 @@ ImGuiID ImGui::GetHoveredID()
return g.HoveredId ? g.HoveredId : g.HoveredIdPreviousFrame;
}
-// This is called by ItemAdd().
-// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID().
-void ImGui::KeepAliveID(ImGuiID id)
-{
- ImGuiContext& g = *GImGui;
- if (g.ActiveId == id)
- g.ActiveIdIsAlive = id;
- if (g.ActiveIdPreviousFrame == id)
- g.ActiveIdPreviousFrameIsAlive = true;
-}
-
void ImGui::MarkItemEdited(ImGuiID id)
{
- // This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit().
+ // This marking is to be able to provide info for IsItemDeactivatedAfterEdit().
// ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need to fill the data.
ImGuiContext& g = *GImGui;
- IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive);
- IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out.
+ if (g.LastItemData.ItemFlags & ImGuiItemFlags_NoMarkEdited)
+ return;
+ if (g.ActiveId == id || g.ActiveId == 0)
+ {
+ // FIXME: Can't we fully rely on LastItemData yet?
+ g.ActiveIdHasBeenEditedThisFrame = true;
+ g.ActiveIdHasBeenEditedBefore = true;
+ if (g.DeactivatedItemData.ID == id)
+ g.DeactivatedItemData.HasBeenEditedBefore = true;
+ }
+
+ // We accept a MarkItemEdited() on drag and drop targets (see https://github.com/ocornut/imgui/issues/1875#issuecomment-978243343)
+ // We accept 'ActiveIdPreviousFrame == id' for InputText() returning an edit after it has been taken ActiveId away (#4714)
+ IM_ASSERT(g.DragDropActive || g.ActiveId == id || g.ActiveId == 0 || g.ActiveIdPreviousFrame == id || (g.CurrentMultiSelect != NULL && g.BoxSelectState.IsActive));
+
//IM_ASSERT(g.CurrentWindow->DC.LastItemId == id);
- g.ActiveIdHasBeenEditedThisFrame = true;
- g.ActiveIdHasBeenEditedBefore = true;
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited;
}
-static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags)
+bool ImGui::IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags)
{
// An active popup disable hovering on other windows (apart from its own children)
// FIXME-OPT: This could be cached/stored within the window.
@@ -3618,12 +4503,30 @@ static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFla
// Inhibit hover unless the window is within the stack of our modal/popup
if (want_inhibit)
- if (!ImGui::IsWindowWithinBeginStackOf(window->RootWindow, focused_root_window))
+ if (!IsWindowWithinBeginStackOf(window->RootWindow, focused_root_window))
return false;
}
return true;
}
+static inline float CalcDelayFromHoveredFlags(ImGuiHoveredFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ if (flags & ImGuiHoveredFlags_DelayNormal)
+ return g.Style.HoverDelayNormal;
+ if (flags & ImGuiHoveredFlags_DelayShort)
+ return g.Style.HoverDelayShort;
+ return 0.0f;
+}
+
+static ImGuiHoveredFlags ApplyHoverFlagsForTooltip(ImGuiHoveredFlags user_flags, ImGuiHoveredFlags shared_flags)
+{
+ // Allow instance flags to override shared flags
+ if (user_flags & (ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal))
+ shared_flags &= ~(ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal);
+ return user_flags | shared_flags;
+}
+
// This is roughly matching the behavior of internal-facing ItemHoverable()
// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered()
// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId
@@ -3631,12 +4534,17 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- if (g.NavDisableMouseHover && !g.NavDisableHighlight && !(flags & ImGuiHoveredFlags_NoNavOverride))
+ IM_ASSERT_USER_ERROR((flags & ~ImGuiHoveredFlags_AllowedMaskForIsItemHovered) == 0, "Invalid flags for IsItemHovered()!");
+
+ if (g.NavHighlightItemUnderNav && g.NavCursorVisible && !(flags & ImGuiHoveredFlags_NoNavOverride))
{
- if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled))
- return false;
if (!IsItemFocused())
return false;
+ if ((g.LastItemData.ItemFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled))
+ return false;
+
+ if (flags & ImGuiHoveredFlags_ForTooltip)
+ flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipNav);
}
else
{
@@ -3644,7 +4552,9 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
ImGuiItemStatusFlags status_flags = g.LastItemData.StatusFlags;
if (!(status_flags & ImGuiItemStatusFlags_HoveredRect))
return false;
- IM_ASSERT((flags & (ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy)) == 0); // Flags not supported by this function
+
+ if (flags & ImGuiHoveredFlags_ForTooltip)
+ flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipMouse);
// Done with rectangle culling so we can perform heavier checks now
// Test if we are hovering the right window (our window could be behind another window)
@@ -3653,127 +4563,190 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
// to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was
// the test that has been running for a long while.
if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0)
- if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0)
+ if ((flags & ImGuiHoveredFlags_AllowWhenOverlappedByWindow) == 0)
return false;
// Test if another item is active (e.g. being dragged)
+ const ImGuiID id = g.LastItemData.ID;
if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0)
- if (g.ActiveId != 0 && g.ActiveId != g.LastItemData.ID && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId)
- return false;
+ if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap)
+ if (g.ActiveId != window->MoveId)
+ return false;
// Test if interactions on this window are blocked by an active popup or modal.
// The ImGuiHoveredFlags_AllowWhenBlockedByPopup flag will be tested here.
- if (!IsWindowContentHoverable(window, flags) && !(g.LastItemData.InFlags & ImGuiItemFlags_NoWindowHoverableCheck))
+ if (!IsWindowContentHoverable(window, flags) && !(g.LastItemData.ItemFlags & ImGuiItemFlags_NoWindowHoverableCheck))
return false;
// Test if the item is disabled
- if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled))
+ if ((g.LastItemData.ItemFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled))
return false;
// Special handling for calling after Begin() which represent the title bar or tab.
- // When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case.
- if (g.LastItemData.ID == window->MoveId && window->WriteAccessed)
+ // When the window is skipped/collapsed (SkipItems==true) that last item (always ->MoveId submitted by Begin)
+ // will never be overwritten so we need to detect the case.
+ if (id == window->MoveId && window->WriteAccessed)
return false;
+
+ // Test if using AllowOverlap and overlapped
+ if ((g.LastItemData.ItemFlags & ImGuiItemFlags_AllowOverlap) && id != 0)
+ if ((flags & ImGuiHoveredFlags_AllowWhenOverlappedByItem) == 0)
+ if (g.HoveredIdPreviousFrame != g.LastItemData.ID)
+ return false;
}
// Handle hover delay
// (some ideas: https://www.nngroup.com/articles/timing-exposing-content)
- float delay;
- if (flags & ImGuiHoveredFlags_DelayNormal)
- delay = g.IO.HoverDelayNormal;
- else if (flags & ImGuiHoveredFlags_DelayShort)
- delay = g.IO.HoverDelayShort;
- else
- delay = 0.0f;
- if (delay > 0.0f)
- {
- ImGuiID hover_delay_id = (g.LastItemData.ID != 0) ? g.LastItemData.ID : window->GetIDFromRectangle(g.LastItemData.Rect);
- if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverDelayIdPreviousFrame != hover_delay_id))
- g.HoverDelayTimer = 0.0f;
- g.HoverDelayId = hover_delay_id;
- return g.HoverDelayTimer >= delay;
+ const float delay = CalcDelayFromHoveredFlags(flags);
+ if (delay > 0.0f || (flags & ImGuiHoveredFlags_Stationary))
+ {
+ ImGuiID hover_delay_id = (g.LastItemData.ID != 0) ? g.LastItemData.ID : window->GetIDFromPos(g.LastItemData.Rect.Min);
+ if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverItemDelayIdPreviousFrame != hover_delay_id))
+ g.HoverItemDelayTimer = 0.0f;
+ g.HoverItemDelayId = hover_delay_id;
+
+ // When changing hovered item we requires a bit of stationary delay before activating hover timer,
+ // but once unlocked on a given item we also moving.
+ //if (g.HoverDelayTimer >= delay && (g.HoverDelayTimer - g.IO.DeltaTime < delay || g.MouseStationaryTimer - g.IO.DeltaTime < g.Style.HoverStationaryDelay)) { IMGUI_DEBUG_LOG("HoverDelayTimer = %f/%f, MouseStationaryTimer = %f\n", g.HoverDelayTimer, delay, g.MouseStationaryTimer); }
+ if ((flags & ImGuiHoveredFlags_Stationary) != 0 && g.HoverItemUnlockedStationaryId != hover_delay_id)
+ return false;
+
+ if (g.HoverItemDelayTimer < delay)
+ return false;
}
return true;
}
// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered().
-bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id)
+// (this does not rely on LastItemData it can be called from a ButtonBehavior() call not following an ItemAdd() call)
+// FIXME-LEGACY: the 'ImGuiItemFlags item_flags' parameter was added on 2023-06-28.
+// If you used this in your legacy/custom widgets code:
+// - Commonly: if your ItemHoverable() call comes after an ItemAdd() call: pass 'item_flags = g.LastItemData.ItemFlags'.
+// - Rare: otherwise you may pass 'item_flags = 0' (ImGuiItemFlags_None) unless you want to benefit from special behavior handled by ItemHoverable.
+bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags)
{
ImGuiContext& g = *GImGui;
- if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap)
- return false;
-
ImGuiWindow* window = g.CurrentWindow;
+
+ // Detect ID conflicts
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ if (id != 0 && g.HoveredIdPreviousFrame == id && (item_flags & ImGuiItemFlags_AllowDuplicateId) == 0)
+ {
+ g.HoveredIdPreviousFrameItemCount++;
+ if (g.DebugDrawIdConflicts == id)
+ window->DrawList->AddRect(bb.Min - ImVec2(1,1), bb.Max + ImVec2(1,1), IM_COL32(255, 0, 0, 255), 0.0f, ImDrawFlags_None, 2.0f);
+ }
+#endif
+
if (g.HoveredWindow != window)
return false;
- if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap)
- return false;
if (!IsMouseHoveringRect(bb.Min, bb.Max))
return false;
+ if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap)
+ return false;
+ if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap)
+ if (!g.ActiveIdFromShortcut)
+ return false;
+
// Done with rectangle culling so we can perform heavier checks now.
- ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags);
if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None))
{
- g.HoveredIdDisabled = true;
+ g.HoveredIdIsDisabled = true;
return false;
}
// We exceptionally allow this function to be called with id==0 to allow using it for easy high-level
// hover test in widgets code. We could also decide to split this function is two.
if (id != 0)
+ {
+ // Drag source doesn't report as hovered
+ if (g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover))
+ return false;
+
SetHoveredID(id);
+ // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match.
+ // This allows using patterns where a later submitted widget overlaps a previous one. Generally perceived as a front-to-back hit-test.
+ if (item_flags & ImGuiItemFlags_AllowOverlap)
+ {
+ g.HoveredIdAllowOverlap = true;
+ if (g.HoveredIdPreviousFrame != id)
+ return false;
+ }
+
+ // Display shortcut (only works with mouse)
+ // (ImGuiItemStatusFlags_HasShortcut in LastItemData denotes we want a tooltip)
+ if (id == g.LastItemData.ID && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasShortcut) && g.ActiveId != id)
+ if (IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_DelayNormal))
+ SetTooltip("%s", GetKeyChordName(g.LastItemData.Shortcut));
+ }
+
// When disabled we'll return false but still set HoveredId
if (item_flags & ImGuiItemFlags_Disabled)
{
// Release active id if turning disabled
- if (g.ActiveId == id)
+ if (g.ActiveId == id && id != 0)
ClearActiveID();
- g.HoveredIdDisabled = true;
+ g.HoveredIdIsDisabled = true;
return false;
}
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
if (id != 0)
{
// [DEBUG] Item Picker tool!
- // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making
- // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered
- // items if we performed the test in ItemAdd(), but that would incur a small runtime cost.
+ // We perform the check here because reaching is path is rare (1~ time a frame),
+ // making the cost of this tool near-zero! We could get better call-stack and support picking non-hovered
+ // items if we performed the test in ItemAdd(), but that would incur a bigger runtime cost.
if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id)
GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255));
if (g.DebugItemPickerBreakId == id)
IM_DEBUG_BREAK();
}
+#endif
- if (g.NavDisableMouseHover)
+ if (g.NavHighlightItemUnderNav && (item_flags & ImGuiItemFlags_NoNavDisableMouseHover) == 0)
return false;
return true;
}
// FIXME: This is inlined/duplicated in ItemAdd()
+// FIXME: The id != 0 path is not used by our codebase, may get rid of it?
bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
if (!bb.Overlaps(window->ClipRect))
- if (id == 0 || (id != g.ActiveId && id != g.NavId))
- if (!g.LogEnabled)
+ if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId))
+ if (!g.ItemUnclipByLog)
return true;
return false;
}
// This is also inlined in ItemAdd()
-// Note: if ImGuiItemStatusFlags_HasDisplayRect is set, user needs to set window->DC.LastItemDisplayRect!
-void ImGui::SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags item_flags, const ImRect& item_rect)
+// Note: if ImGuiItemStatusFlags_HasDisplayRect is set, user needs to set g.LastItemData.DisplayRect.
+void ImGui::SetLastItemData(ImGuiID item_id, ImGuiItemFlags item_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect)
{
ImGuiContext& g = *GImGui;
g.LastItemData.ID = item_id;
- g.LastItemData.InFlags = in_flags;
- g.LastItemData.StatusFlags = item_flags;
- g.LastItemData.Rect = item_rect;
+ g.LastItemData.ItemFlags = item_flags;
+ g.LastItemData.StatusFlags = status_flags;
+ g.LastItemData.Rect = g.LastItemData.NavRect = item_rect;
+}
+
+static void ImGui::SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect)
+{
+ ImGuiContext& g = *GImGui;
+ SetLastItemData(window->MoveId, g.CurrentItemFlags, window->DC.WindowItemStatusFlags, rect);
+}
+
+static void ImGui::SetLastItemDataForChildWindowItem(ImGuiWindow* window, const ImRect& rect)
+{
+ ImGuiContext& g = *GImGui;
+ SetLastItemData(window->ChildId, g.CurrentItemFlags, window->DC.ChildItemStatusFlags, rect);
}
float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
@@ -3803,31 +4776,62 @@ float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
// IM_ALLOC() == ImGui::MemAlloc()
void* ImGui::MemAlloc(size_t size)
{
+ void* ptr = (*GImAllocatorAllocFunc)(size, GImAllocatorUserData);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
if (ImGuiContext* ctx = GImGui)
- ctx->IO.MetricsActiveAllocations++;
- return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData);
+ DebugAllocHook(&ctx->DebugAllocInfo, ctx->FrameCount, ptr, size);
+#endif
+ return ptr;
}
// IM_FREE() == ImGui::MemFree()
void ImGui::MemFree(void* ptr)
{
- if (ptr)
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ if (ptr != NULL)
if (ImGuiContext* ctx = GImGui)
- ctx->IO.MetricsActiveAllocations--;
+ DebugAllocHook(&ctx->DebugAllocInfo, ctx->FrameCount, ptr, (size_t)-1);
+#endif
return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData);
}
+// We record the number of allocation in recent frames, as a way to audit/sanitize our guiding principles of "no allocations on idle/repeating frames"
+void ImGui::DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size)
+{
+ ImGuiDebugAllocEntry* entry = &info->LastEntriesBuf[info->LastEntriesIdx];
+ IM_UNUSED(ptr);
+ if (entry->FrameCount != frame_count)
+ {
+ info->LastEntriesIdx = (info->LastEntriesIdx + 1) % IM_ARRAYSIZE(info->LastEntriesBuf);
+ entry = &info->LastEntriesBuf[info->LastEntriesIdx];
+ entry->FrameCount = frame_count;
+ entry->AllocCount = entry->FreeCount = 0;
+ }
+ if (size != (size_t)-1)
+ {
+ //printf("[%05d] MemAlloc(%d) -> 0x%p\n", frame_count, (int)size, ptr);
+ entry->AllocCount++;
+ info->TotalAllocCount++;
+ }
+ else
+ {
+ //printf("[%05d] MemFree(0x%p)\n", frame_count, ptr);
+ entry->FreeCount++;
+ info->TotalFreeCount++;
+ }
+}
+
const char* ImGui::GetClipboardText()
{
ImGuiContext& g = *GImGui;
- return g.IO.GetClipboardTextFn ? g.IO.GetClipboardTextFn(g.IO.ClipboardUserData) : "";
+ return g.PlatformIO.Platform_GetClipboardTextFn ? g.PlatformIO.Platform_GetClipboardTextFn(&g) : "";
}
void ImGui::SetClipboardText(const char* text)
{
ImGuiContext& g = *GImGui;
- if (g.IO.SetClipboardTextFn)
- g.IO.SetClipboardTextFn(g.IO.ClipboardUserData, text);
+ if (g.PlatformIO.Platform_SetClipboardTextFn != NULL)
+ g.PlatformIO.Platform_SetClipboardTextFn(&g, text);
}
const char* ImGui::GetVersion()
@@ -3835,93 +4839,30 @@ const char* ImGui::GetVersion()
return IMGUI_VERSION;
}
-// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself
-// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module
-ImGuiContext* ImGui::GetCurrentContext()
-{
- return GImGui;
-}
-
-void ImGui::SetCurrentContext(ImGuiContext* ctx)
-{
-#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC
- IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this.
-#else
- GImGui = ctx;
-#endif
-}
-
-void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data)
-{
- GImAllocatorAllocFunc = alloc_func;
- GImAllocatorFreeFunc = free_func;
- GImAllocatorUserData = user_data;
-}
-
-// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space)
-void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data)
-{
- *p_alloc_func = GImAllocatorAllocFunc;
- *p_free_func = GImAllocatorFreeFunc;
- *p_user_data = GImAllocatorUserData;
-}
-
-ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas)
-{
- ImGuiContext* prev_ctx = GetCurrentContext();
- ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas);
- SetCurrentContext(ctx);
- Initialize();
- if (prev_ctx != NULL)
- SetCurrentContext(prev_ctx); // Restore previous context if any, else keep new one.
- return ctx;
-}
-
-void ImGui::DestroyContext(ImGuiContext* ctx)
-{
- ImGuiContext* prev_ctx = GetCurrentContext();
- if (ctx == NULL) //-V1051
- ctx = prev_ctx;
- SetCurrentContext(ctx);
- Shutdown();
- SetCurrentContext((prev_ctx != ctx) ? prev_ctx : NULL);
- IM_DELETE(ctx);
-}
-
-// No specific ordering/dependency support, will see as needed
-ImGuiID ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook)
+ImGuiIO& ImGui::GetIO()
{
- ImGuiContext& g = *ctx;
- IM_ASSERT(hook->Callback != NULL && hook->HookId == 0 && hook->Type != ImGuiContextHookType_PendingRemoval_);
- g.Hooks.push_back(*hook);
- g.Hooks.back().HookId = ++g.HookIdNext;
- return g.HookIdNext;
+ IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
+ return GImGui->IO;
}
-// Deferred removal, avoiding issue with changing vector while iterating it
-void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id)
+// This variant exists to facilitate backends experimenting with multi-threaded parallel context. (#8069, #6293, #5856)
+ImGuiIO& ImGui::GetIO(ImGuiContext* ctx)
{
- ImGuiContext& g = *ctx;
- IM_ASSERT(hook_id != 0);
- for (int n = 0; n < g.Hooks.Size; n++)
- if (g.Hooks[n].HookId == hook_id)
- g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_;
+ IM_ASSERT(ctx != NULL);
+ return ctx->IO;
}
-// Call context hooks (used by e.g. test engine)
-// We assume a small number of hooks so all stored in same array
-void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type)
+ImGuiPlatformIO& ImGui::GetPlatformIO()
{
- ImGuiContext& g = *ctx;
- for (int n = 0; n < g.Hooks.Size; n++)
- if (g.Hooks[n].Type == hook_type)
- g.Hooks[n].Callback(&g, &g.Hooks[n]);
+ IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext()?");
+ return GImGui->PlatformIO;
}
-ImGuiIO& ImGui::GetIO()
+// This variant exists to facilitate backends experimenting with multi-threaded parallel context. (#8069, #6293, #5856)
+ImGuiPlatformIO& ImGui::GetPlatformIO(ImGuiContext* ctx)
{
- IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
- return GImGui->IO;
+ IM_ASSERT(ctx != NULL);
+ return ctx->PlatformIO;
}
// Pass this to your backend rendering function! Valid after Render() and until the next call to NewFrame()
@@ -3942,33 +4883,33 @@ int ImGui::GetFrameCount()
return GImGui->FrameCount;
}
-static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name)
+static ImDrawList* GetViewportBgFgDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name)
{
// Create the draw list on demand, because they are not frequently used for all viewports
ImGuiContext& g = *GImGui;
- IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists));
- ImDrawList* draw_list = viewport->DrawLists[drawlist_no];
+ IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->BgFgDrawLists));
+ ImDrawList* draw_list = viewport->BgFgDrawLists[drawlist_no];
if (draw_list == NULL)
{
draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData);
draw_list->_OwnerName = drawlist_name;
- viewport->DrawLists[drawlist_no] = draw_list;
+ viewport->BgFgDrawLists[drawlist_no] = draw_list;
}
// Our ImDrawList system requires that there is always a command
- if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount)
+ if (viewport->BgFgDrawListsLastFrame[drawlist_no] != g.FrameCount)
{
draw_list->_ResetForNewFrame();
draw_list->PushTextureID(g.IO.Fonts->TexID);
draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false);
- viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount;
+ viewport->BgFgDrawListsLastFrame[drawlist_no] = g.FrameCount;
}
return draw_list;
}
ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport)
{
- return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background");
+ return GetViewportBgFgDrawList((ImGuiViewportP*)viewport, 0, "##Background");
}
ImDrawList* ImGui::GetBackgroundDrawList()
@@ -3979,7 +4920,7 @@ ImDrawList* ImGui::GetBackgroundDrawList()
ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport)
{
- return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground");
+ return GetViewportBgFgDrawList((ImGuiViewportP*)viewport, 1, "##Foreground");
}
ImDrawList* ImGui::GetForegroundDrawList()
@@ -4001,7 +4942,8 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window)
ImGuiContext& g = *GImGui;
FocusWindow(window);
SetActiveID(window->MoveId, window);
- g.NavDisableHighlight = true;
+ if (g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = false;
g.ActiveIdClickOffset = g.IO.MouseClickedPos[0] - window->RootWindow->Pos;
g.ActiveIdNoClearOnFocusLoss = true;
SetActiveIdUsingAllKeyboardKeys();
@@ -4015,7 +4957,7 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window)
// Handle mouse moving window
// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing()
-// FIXME: We don't have strong guarantee that g.MovingWindow stay synched with g.ActiveId == g.MovingWindow->MoveId.
+// FIXME: We don't have strong guarantee that g.MovingWindow stay synced with g.ActiveId == g.MovingWindow->MoveId.
// This is currently enforced by the fact that BeginDragDropSource() is setting all g.ActiveIdUsingXXXX flags to inhibit navigation inputs,
// but if we should more thoroughly test cases where g.ActiveId or g.MovingWindow gets changed and not the other.
void ImGui::UpdateMouseMovingWindowNewFrame()
@@ -4052,12 +4994,13 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
}
}
-// Initiate moving window when clicking on empty space or title bar.
+// Initiate focusing and moving window when clicking on empty space or title bar.
+// Initiate focusing window when clicking on a disabled item.
// Handle left-click and right-click focus.
void ImGui::UpdateMouseMovingWindowEndFrame()
{
ImGuiContext& g = *GImGui;
- if (g.ActiveId != 0 || g.HoveredId != 0)
+ if (g.ActiveId != 0 || (g.HoveredId != 0 && !g.HoveredIdIsDisabled))
return;
// Unless we just made a window/popup appear
@@ -4078,25 +5021,27 @@ void ImGui::UpdateMouseMovingWindowEndFrame()
StartMouseMovingWindow(g.HoveredWindow); //-V595
// Cancel moving if clicked outside of title bar
- if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(root_window->Flags & ImGuiWindowFlags_NoTitleBar))
- if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0]))
- g.MovingWindow = NULL;
-
- // Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already)
- if (g.HoveredIdDisabled)
+ if (g.IO.ConfigWindowsMoveFromTitleBarOnly)
+ if (!(root_window->Flags & ImGuiWindowFlags_NoTitleBar))
+ if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0]))
+ g.MovingWindow = NULL;
+
+ // Cancel moving if clicked over an item which was disabled or inhibited by popups
+ // (when g.HoveredIdIsDisabled == true && g.HoveredId == 0 we are inhibited by popups, when g.HoveredIdIsDisabled == true && g.HoveredId != 0 we are over a disabled item)0 already)
+ if (g.HoveredIdIsDisabled)
g.MovingWindow = NULL;
}
- else if (root_window == NULL && g.NavWindow != NULL && GetTopMostPopupModal() == NULL)
+ else if (root_window == NULL && g.NavWindow != NULL)
{
// Clicking on void disable focus
- FocusWindow(NULL);
+ FocusWindow(NULL, ImGuiFocusRequestFlags_UnlessBelowModal);
}
}
// With right mouse button we close popups without changing focus based on where the mouse is aimed
// Instead, focus will be restored to the window under the bottom-most closed popup.
// (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger)
- if (g.IO.MouseClicked[1])
+ if (g.IO.MouseClicked[1] && g.HoveredId == 0)
{
// Find the top-most window between HoveredWindow and the top-most Modal Window.
// This is where we can trim the popup stack.
@@ -4111,361 +5056,30 @@ static bool IsWindowActiveAndVisible(ImGuiWindow* window)
return (window->Active) && (!window->Hidden);
}
-static void UpdateAliasKey(ImGuiKey key, bool v, float analog_value)
-{
- IM_ASSERT(ImGui::IsAliasKey(key));
- ImGuiKeyData* key_data = ImGui::GetKeyData(key);
- key_data->Down = v;
- key_data->AnalogValue = analog_value;
-}
-
-// Rewrite routing data buffers to strip old entries + sort by key to make queries not touch scattered data.
-// Entries D,A,B,B,A,C,B --> A,A,B,B,B,C,D
-// Index A:1 B:2 C:5 D:0 --> A:0 B:2 C:5 D:6
-// See 'Metrics->Key Owners & Shortcut Routing' to visualize the result of that operation.
-static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt)
-{
- ImGuiContext& g = *GImGui;
- rt->EntriesNext.resize(0);
- for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
- {
- const int new_routing_start_idx = rt->EntriesNext.Size;
- ImGuiKeyRoutingData* routing_entry;
- for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex)
- {
- routing_entry = &rt->Entries[old_routing_idx];
- routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry
- routing_entry->RoutingNext = ImGuiKeyOwner_None;
- routing_entry->RoutingNextScore = 255;
- if (routing_entry->RoutingCurr == ImGuiKeyOwner_None)
- continue;
- rt->EntriesNext.push_back(*routing_entry); // Write alive ones into new buffer
-
- // Apply routing to owner if there's no owner already (RoutingCurr == None at this point)
- if (routing_entry->Mods == g.IO.KeyMods)
- {
- ImGuiKeyOwnerData* owner_data = ImGui::GetKeyOwnerData(key);
- if (owner_data->OwnerCurr == ImGuiKeyOwner_None)
- owner_data->OwnerCurr = routing_entry->RoutingCurr;
- }
- }
-
- // Rewrite linked-list
- rt->Index[key - ImGuiKey_NamedKey_BEGIN] = (ImGuiKeyRoutingIndex)(new_routing_start_idx < rt->EntriesNext.Size ? new_routing_start_idx : -1);
- for (int n = new_routing_start_idx; n < rt->EntriesNext.Size; n++)
- rt->EntriesNext[n].NextEntryIndex = (ImGuiKeyRoutingIndex)((n + 1 < rt->EntriesNext.Size) ? n + 1 : -1);
- }
- rt->Entries.swap(rt->EntriesNext); // Swap new and old indexes
-}
-
-// [Internal] Do not use directly (should read io.KeyMods instead)
-static ImGuiKeyChord GetMergedModsFromBools()
-{
- ImGuiContext& g = *GImGui;
- ImGuiKeyChord key_chord = 0;
- if (g.IO.KeyCtrl) { key_chord |= ImGuiMod_Ctrl; }
- if (g.IO.KeyShift) { key_chord |= ImGuiMod_Shift; }
- if (g.IO.KeyAlt) { key_chord |= ImGuiMod_Alt; }
- if (g.IO.KeySuper) { key_chord |= ImGuiMod_Super; }
- return key_chord;
-}
-
-static void ImGui::UpdateKeyboardInputs()
-{
- ImGuiContext& g = *GImGui;
- ImGuiIO& io = g.IO;
-
- // Import legacy keys or verify they are not used
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- if (io.BackendUsingLegacyKeyArrays == 0)
- {
- // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally.
- for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++)
- IM_ASSERT((io.KeysDown[n] == false || IsKeyDown((ImGuiKey)n)) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!");
- }
- else
- {
- if (g.FrameCount == 0)
- for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++)
- IM_ASSERT(g.IO.KeyMap[n] == -1 && "Backend is not allowed to write to io.KeyMap[0..511]!");
-
- // Build reverse KeyMap (Named -> Legacy)
- for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++)
- if (io.KeyMap[n] != -1)
- {
- IM_ASSERT(IsLegacyKey((ImGuiKey)io.KeyMap[n]));
- io.KeyMap[io.KeyMap[n]] = n;
- }
-
- // Import legacy keys into new ones
- for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++)
- if (io.KeysDown[n] || io.BackendUsingLegacyKeyArrays == 1)
- {
- const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n);
- IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key));
- io.KeysData[key].Down = io.KeysDown[n];
- if (key != n)
- io.KeysDown[key] = io.KeysDown[n]; // Allow legacy code using io.KeysDown[GetKeyIndex()] with old backends
- io.BackendUsingLegacyKeyArrays = 1;
- }
- if (io.BackendUsingLegacyKeyArrays == 1)
- {
- GetKeyData(ImGuiMod_Ctrl)->Down = io.KeyCtrl;
- GetKeyData(ImGuiMod_Shift)->Down = io.KeyShift;
- GetKeyData(ImGuiMod_Alt)->Down = io.KeyAlt;
- GetKeyData(ImGuiMod_Super)->Down = io.KeySuper;
- }
- }
-
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
- if (io.BackendUsingLegacyNavInputArray && nav_gamepad_active)
- {
- #define MAP_LEGACY_NAV_INPUT_TO_KEY1(_KEY, _NAV1) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f); io.KeysData[_KEY].AnalogValue = io.NavInputs[_NAV1]; } while (0)
- #define MAP_LEGACY_NAV_INPUT_TO_KEY2(_KEY, _NAV1, _NAV2) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f) || (io.NavInputs[_NAV2] > 0.0f); io.KeysData[_KEY].AnalogValue = ImMax(io.NavInputs[_NAV1], io.NavInputs[_NAV2]); } while (0)
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceDown, ImGuiNavInput_Activate);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceRight, ImGuiNavInput_Cancel);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceLeft, ImGuiNavInput_Menu);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceUp, ImGuiNavInput_Input);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadLeft, ImGuiNavInput_DpadLeft);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadRight, ImGuiNavInput_DpadRight);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadUp, ImGuiNavInput_DpadUp);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadDown, ImGuiNavInput_DpadDown);
- MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadL1, ImGuiNavInput_FocusPrev, ImGuiNavInput_TweakSlow);
- MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadR1, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakFast);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickLeft, ImGuiNavInput_LStickLeft);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickRight, ImGuiNavInput_LStickRight);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickUp, ImGuiNavInput_LStickUp);
- MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown);
- #undef NAV_MAP_KEY
- }
-#endif
-
-#endif
-
- // Synchronize io.KeyMods with individual modifiers io.KeyXXX bools, update aliases
- io.KeyMods = GetMergedModsFromBools();
- for (int n = 0; n < ImGuiMouseButton_COUNT; n++)
- UpdateAliasKey(MouseButtonToKey(n), io.MouseDown[n], io.MouseDown[n] ? 1.0f : 0.0f);
- UpdateAliasKey(ImGuiKey_MouseWheelX, io.MouseWheelH != 0.0f, io.MouseWheelH);
- UpdateAliasKey(ImGuiKey_MouseWheelY, io.MouseWheel != 0.0f, io.MouseWheel);
-
- // Clear gamepad data if disabled
- if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0)
- for (int i = ImGuiKey_Gamepad_BEGIN; i < ImGuiKey_Gamepad_END; i++)
- {
- io.KeysData[i - ImGuiKey_KeysData_OFFSET].Down = false;
- io.KeysData[i - ImGuiKey_KeysData_OFFSET].AnalogValue = 0.0f;
- }
-
- // Update keys
- for (int i = 0; i < ImGuiKey_KeysData_SIZE; i++)
- {
- ImGuiKeyData* key_data = &io.KeysData[i];
- key_data->DownDurationPrev = key_data->DownDuration;
- key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f;
- }
-
- // Update keys/input owner (named keys only): one entry per key
- for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
- {
- ImGuiKeyData* key_data = &io.KeysData[key - ImGuiKey_KeysData_OFFSET];
- ImGuiKeyOwnerData* owner_data = &g.KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN];
- owner_data->OwnerCurr = owner_data->OwnerNext;
- if (!key_data->Down) // Important: ownership is released on the frame after a release. Ensure a 'MouseDown -> CloseWindow -> MouseUp' chain doesn't lead to someone else seeing the MouseUp.
- owner_data->OwnerNext = ImGuiKeyOwner_None;
- owner_data->LockThisFrame = owner_data->LockUntilRelease = owner_data->LockUntilRelease && key_data->Down; // Clear LockUntilRelease when key is not Down anymore
- }
-
- UpdateKeyRoutingTable(&g.KeysRoutingTable);
-}
-
-static void ImGui::UpdateMouseInputs()
-{
- ImGuiContext& g = *GImGui;
- ImGuiIO& io = g.IO;
-
- // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well)
- if (IsMousePosValid(&io.MousePos))
- io.MousePos = g.MouseLastValidPos = ImFloorSigned(io.MousePos);
-
- // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta
- if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev))
- io.MouseDelta = io.MousePos - io.MousePosPrev;
- else
- io.MouseDelta = ImVec2(0.0f, 0.0f);
-
- // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true.
- if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f)
- g.NavDisableMouseHover = false;
-
- io.MousePosPrev = io.MousePos;
- for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
- {
- io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f;
- io.MouseClickedCount[i] = 0; // Will be filled below
- io.MouseReleased[i] = !io.MouseDown[i] && io.MouseDownDuration[i] >= 0.0f;
- io.MouseDownDurationPrev[i] = io.MouseDownDuration[i];
- io.MouseDownDuration[i] = io.MouseDown[i] ? (io.MouseDownDuration[i] < 0.0f ? 0.0f : io.MouseDownDuration[i] + io.DeltaTime) : -1.0f;
- if (io.MouseClicked[i])
- {
- bool is_repeated_click = false;
- if ((float)(g.Time - io.MouseClickedTime[i]) < io.MouseDoubleClickTime)
- {
- ImVec2 delta_from_click_pos = IsMousePosValid(&io.MousePos) ? (io.MousePos - io.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f);
- if (ImLengthSqr(delta_from_click_pos) < io.MouseDoubleClickMaxDist * io.MouseDoubleClickMaxDist)
- is_repeated_click = true;
- }
- if (is_repeated_click)
- io.MouseClickedLastCount[i]++;
- else
- io.MouseClickedLastCount[i] = 1;
- io.MouseClickedTime[i] = g.Time;
- io.MouseClickedPos[i] = io.MousePos;
- io.MouseClickedCount[i] = io.MouseClickedLastCount[i];
- io.MouseDragMaxDistanceSqr[i] = 0.0f;
- }
- else if (io.MouseDown[i])
- {
- // Maintain the maximum distance we reaching from the initial click position, which is used with dragging threshold
- float delta_sqr_click_pos = IsMousePosValid(&io.MousePos) ? ImLengthSqr(io.MousePos - io.MouseClickedPos[i]) : 0.0f;
- io.MouseDragMaxDistanceSqr[i] = ImMax(io.MouseDragMaxDistanceSqr[i], delta_sqr_click_pos);
- }
-
- // We provide io.MouseDoubleClicked[] as a legacy service
- io.MouseDoubleClicked[i] = (io.MouseClickedCount[i] == 2);
-
- // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation
- if (io.MouseClicked[i])
- g.NavDisableMouseHover = false;
- }
-}
-
-static void LockWheelingWindow(ImGuiWindow* window, float wheel_amount)
-{
- ImGuiContext& g = *GImGui;
- if (window)
- g.WheelingWindowReleaseTimer = ImMin(g.WheelingWindowReleaseTimer + ImAbs(wheel_amount) * WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER, WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER);
- else
- g.WheelingWindowReleaseTimer = 0.0f;
- if (g.WheelingWindow == window)
- return;
- IMGUI_DEBUG_LOG_IO("LockWheelingWindow() \"%s\"\n", window ? window->Name : "NULL");
- g.WheelingWindow = window;
- g.WheelingWindowRefMousePos = g.IO.MousePos;
-}
-
-void ImGui::UpdateMouseWheel()
-{
- ImGuiContext& g = *GImGui;
-
- // Reset the locked window if we move the mouse or after the timer elapses
- if (g.WheelingWindow != NULL)
- {
- g.WheelingWindowReleaseTimer -= g.IO.DeltaTime;
- if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold)
- g.WheelingWindowReleaseTimer = 0.0f;
- if (g.WheelingWindowReleaseTimer <= 0.0f)
- LockWheelingWindow(NULL, 0.0f);
- }
-
- ImVec2 wheel;
- wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_None) ? g.IO.MouseWheelH : 0.0f;
- wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_None) ? g.IO.MouseWheel : 0.0f;
- if (wheel.x == 0.0f && wheel.y == 0.0f)
- return;
-
- //IMGUI_DEBUG_LOG("MouseWheel X:%.3f Y:%.3f\n", wheel_x, wheel_y);
- ImGuiWindow* mouse_window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow;
- if (!mouse_window || mouse_window->Collapsed)
- return;
-
- // Zoom / Scale window
- // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned.
- if (wheel.y != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
- {
- LockWheelingWindow(mouse_window, wheel.y);
- ImGuiWindow* window = mouse_window;
- const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
- const float scale = new_font_scale / window->FontWindowScale;
- window->FontWindowScale = new_font_scale;
- if (window == window->RootWindow)
- {
- const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
- SetWindowPos(window, window->Pos + offset, 0);
- window->Size = ImFloor(window->Size * scale);
- window->SizeFull = ImFloor(window->SizeFull * scale);
- }
- return;
- }
- if (g.IO.KeyCtrl)
- return;
-
- // Mouse wheel scrolling
- // As a standard behavior holding SHIFT while using Vertical Mouse Wheel triggers Horizontal scroll instead
- // (we avoid doing it on OSX as it the OS input layer handles this already)
- const bool swap_axis = g.IO.KeyShift && !g.IO.ConfigMacOSXBehaviors;
- if (swap_axis)
- {
- wheel.x = wheel.y;
- wheel.y = 0.0f;
- }
-
- // Vertical Mouse Wheel scrolling
- // Bubble up into parent window if:
- // - a child window doesn't allow any scrolling.
- // - a child window doesn't need scrolling because it is already at the edge for the direction we are going in.
- // - a child window has the ImGuiWindowFlags_NoScrollWithMouse flag.
- if (wheel.y != 0.0f)
- {
- ImGuiWindow* window = mouse_window;
- while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))))
- window = window->ParentWindow;
- if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
- {
- LockWheelingWindow(mouse_window, wheel.y);
- float max_step = window->InnerRect.GetHeight() * 0.67f;
- float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step));
- SetScrollY(window, window->Scroll.y - wheel.y * scroll_step);
- }
- }
-
- // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held
- if (wheel.x != 0.0f)
- {
- ImGuiWindow* window = mouse_window;
- while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))))
- window = window->ParentWindow;
- if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
- {
- LockWheelingWindow(mouse_window, wheel.x);
- float max_step = window->InnerRect.GetWidth() * 0.67f;
- float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step));
- SetScrollX(window, window->Scroll.x - wheel.x * scroll_step);
- }
- }
-}
-
// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app)
void ImGui::UpdateHoveredWindowAndCaptureFlags()
{
ImGuiContext& g = *GImGui;
ImGuiIO& io = g.IO;
- g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING));
+
+ // FIXME-DPI: This storage was added on 2021/03/31 for test engine, but if we want to multiply WINDOWS_HOVER_PADDING
+ // by DpiScale, we need to make this window-agnostic anyhow, maybe need storing inside ImGuiWindow.
+ g.WindowsBorderHoverPadding = ImMax(ImMax(g.Style.TouchExtraPadding.x, g.Style.TouchExtraPadding.y), g.Style.WindowBorderHoverPadding);
// Find the window hovered by mouse:
// - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.
// - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame.
// - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms.
bool clear_hovered_windows = false;
- FindHoveredWindow();
+ FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow);
+ g.HoveredWindowBeforeClear = g.HoveredWindow;
// Modal windows prevents mouse from hovering behind them.
ImGuiWindow* modal_window = GetTopMostPopupModal();
if (modal_window && g.HoveredWindow && !IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, modal_window))
clear_hovered_windows = true;
- // Disabled mouse?
+ // Disabled mouse hovering (we don't currently clear MousePos, we could)
if (io.ConfigFlags & ImGuiConfigFlags_NoMouse)
clear_hovered_windows = true;
@@ -4483,7 +5097,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
io.MouseDownOwnedUnlessPopupClose[i] = (g.HoveredWindow != NULL) || has_open_modal;
}
mouse_any_down |= io.MouseDown[i];
- if (io.MouseDown[i])
+ if (io.MouseDown[i] || io.MouseReleased[i]) // Increase release frame for our evaluation of earliest button (#1392)
if (mouse_earliest_down == -1 || io.MouseClickedTime[i] < io.MouseClickedTime[mouse_earliest_down])
mouse_earliest_down = i;
}
@@ -4512,17 +5126,44 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
}
// Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to Dear ImGui only, false = dispatch keyboard info to Dear ImGui + underlying app)
- if (g.WantCaptureKeyboardNextFrame != -1)
+ io.WantCaptureKeyboard = false;
+ if ((io.ConfigFlags & ImGuiConfigFlags_NoKeyboard) == 0)
+ {
+ if ((g.ActiveId != 0) || (modal_window != NULL))
+ io.WantCaptureKeyboard = true;
+ else if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && io.ConfigNavCaptureKeyboard)
+ io.WantCaptureKeyboard = true;
+ }
+ if (g.WantCaptureKeyboardNextFrame != -1) // Manual override
io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0);
- else
- io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL);
- if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && !(io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard))
- io.WantCaptureKeyboard = true;
// Update io.WantTextInput flag, this is to allow systems without a keyboard (e.g. mobile, hand-held) to show a software keyboard if possible
io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false;
}
+// Called once a frame. Followed by SetCurrentFont() which sets up the remaining data.
+// FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal!
+static void SetupDrawListSharedData()
+{
+ ImGuiContext& g = *GImGui;
+ ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX);
+ for (ImGuiViewportP* viewport : g.Viewports)
+ virtual_space.Add(viewport->GetMainRect());
+ g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4();
+ g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol;
+ g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError);
+ g.DrawListSharedData.InitialFlags = ImDrawListFlags_None;
+ if (g.Style.AntiAliasedLines)
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines;
+ if (g.Style.AntiAliasedLinesUseTex && !(g.IO.Fonts->Flags & ImFontAtlasFlags_NoBakedLines))
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex;
+ if (g.Style.AntiAliasedFill)
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill;
+ if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset)
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset;
+ g.DrawListSharedData.InitialFringeScale = 1.0f; // FIXME-DPI: Change this for some DPI scaling experiments.
+}
+
void ImGui::NewFrame()
{
IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
@@ -4556,39 +5197,33 @@ void ImGui::NewFrame()
g.FramerateSecPerFrameCount = ImMin(g.FramerateSecPerFrameCount + 1, IM_ARRAYSIZE(g.FramerateSecPerFrame));
g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)g.FramerateSecPerFrameCount)) : FLT_MAX;
+ // Process input queue (trickle as many events as possible), turn events into writes to IO structure
+ g.InputEventsTrail.resize(0);
+ UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue);
+
+ // Update viewports (after processing input queue, so io.MouseHoveredViewport is set)
UpdateViewportsNewFrame();
// Setup current font and draw list shared data
g.IO.Fonts->Locked = true;
+ SetupDrawListSharedData();
SetCurrentFont(GetDefaultFont());
IM_ASSERT(g.Font->IsLoaded());
- ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX);
- for (int n = 0; n < g.Viewports.Size; n++)
- virtual_space.Add(g.Viewports[n]->GetMainRect());
- g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4();
- g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol;
- g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError);
- g.DrawListSharedData.InitialFlags = ImDrawListFlags_None;
- if (g.Style.AntiAliasedLines)
- g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines;
- if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines))
- g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex;
- if (g.Style.AntiAliasedFill)
- g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill;
- if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset)
- g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset;
// Mark rendering data as invalid to prevent user who may have a handle on it to use it.
- for (int n = 0; n < g.Viewports.Size; n++)
- {
- ImGuiViewportP* viewport = g.Viewports[n];
- viewport->DrawDataP.Clear();
- }
+ for (ImGuiViewportP* viewport : g.Viewports)
+ viewport->DrawDataP.Valid = false;
// Drag and drop keep the source ID alive so even if the source disappear our state is consistent
if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId)
KeepAliveID(g.DragDropPayload.SourceId);
+ // [DEBUG]
+ if (!g.IO.ConfigDebugHighlightIdConflicts || !g.IO.KeyCtrl) // Count is locked while holding CTRL
+ g.DebugDrawIdConflicts = 0;
+ if (g.IO.ConfigDebugHighlightIdConflicts && g.HoveredIdPreviousFrameItemCount > 1)
+ g.DebugDrawIdConflicts = g.HoveredIdPreviousFrame;
+
// Update HoveredId data
if (!g.HoveredIdPreviousFrame)
g.HoveredIdTimer = 0.0f;
@@ -4599,9 +5234,10 @@ void ImGui::NewFrame()
if (g.HoveredId && g.ActiveId != g.HoveredId)
g.HoveredIdNotActiveTimer += g.IO.DeltaTime;
g.HoveredIdPreviousFrame = g.HoveredId;
+ g.HoveredIdPreviousFrameItemCount = 0;
g.HoveredId = 0;
g.HoveredIdAllowOverlap = false;
- g.HoveredIdDisabled = false;
+ g.HoveredIdIsDisabled = false;
// Clear ActiveID if the item is not alive anymore.
// In 1.87, the common most call to KeepAliveID() was moved from GetID() to ItemAdd().
@@ -4617,11 +5253,8 @@ void ImGui::NewFrame()
g.ActiveIdTimer += g.IO.DeltaTime;
g.LastActiveIdTimer += g.IO.DeltaTime;
g.ActiveIdPreviousFrame = g.ActiveId;
- g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow;
- g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
g.ActiveIdIsAlive = 0;
g.ActiveIdHasBeenEditedThisFrame = false;
- g.ActiveIdPreviousFrameIsAlive = false;
g.ActiveIdIsJustActivated = false;
if (g.TempInputId != 0 && g.ActiveId != g.TempInputId)
g.TempInputId = 0;
@@ -4629,40 +5262,38 @@ void ImGui::NewFrame()
{
g.ActiveIdUsingNavDirMask = 0x00;
g.ActiveIdUsingAllKeyboardKeys = false;
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- g.ActiveIdUsingNavInputMask = 0x00;
-#endif
- }
-
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- if (g.ActiveId == 0)
- g.ActiveIdUsingNavInputMask = 0;
- else if (g.ActiveIdUsingNavInputMask != 0)
- {
- // If your custom widget code used: { g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel); }
- // Since IMGUI_VERSION_NUM >= 18804 it should be: { SetKeyOwner(ImGuiKey_Escape, g.ActiveId); SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId); }
- if (g.ActiveIdUsingNavInputMask & (1 << ImGuiNavInput_Cancel))
- SetKeyOwner(ImGuiKey_Escape, g.ActiveId);
- if (g.ActiveIdUsingNavInputMask & ~(1 << ImGuiNavInput_Cancel))
- IM_ASSERT(0); // Other values unsupported
}
-#endif
+ if (g.DeactivatedItemData.ElapseFrame < g.FrameCount)
+ g.DeactivatedItemData.ID = 0;
+ g.DeactivatedItemData.IsAlive = false;
+
+ // Record when we have been stationary as this state is preserved while over same item.
+ // FIXME: The way this is expressed means user cannot alter HoverStationaryDelay during the frame to use varying values.
+ // To allow this we should store HoverItemMaxStationaryTime+ID and perform the >= check in IsItemHovered() function.
+ if (g.HoverItemDelayId != 0 && g.MouseStationaryTimer >= g.Style.HoverStationaryDelay)
+ g.HoverItemUnlockedStationaryId = g.HoverItemDelayId;
+ else if (g.HoverItemDelayId == 0)
+ g.HoverItemUnlockedStationaryId = 0;
+ if (g.HoveredWindow != NULL && g.MouseStationaryTimer >= g.Style.HoverStationaryDelay)
+ g.HoverWindowUnlockedStationaryId = g.HoveredWindow->ID;
+ else if (g.HoveredWindow == NULL)
+ g.HoverWindowUnlockedStationaryId = 0;
// Update hover delay for IsItemHovered() with delays and tooltips
- g.HoverDelayIdPreviousFrame = g.HoverDelayId;
- if (g.HoverDelayId != 0)
+ g.HoverItemDelayIdPreviousFrame = g.HoverItemDelayId;
+ if (g.HoverItemDelayId != 0)
{
- //if (g.IO.MouseDelta.x == 0.0f && g.IO.MouseDelta.y == 0.0f) // Need design/flags
- g.HoverDelayTimer += g.IO.DeltaTime;
- g.HoverDelayClearTimer = 0.0f;
- g.HoverDelayId = 0;
+ g.HoverItemDelayTimer += g.IO.DeltaTime;
+ g.HoverItemDelayClearTimer = 0.0f;
+ g.HoverItemDelayId = 0;
}
- else if (g.HoverDelayTimer > 0.0f)
+ else if (g.HoverItemDelayTimer > 0.0f)
{
// This gives a little bit of leeway before clearing the hover timer, allowing mouse to cross gaps
- g.HoverDelayClearTimer += g.IO.DeltaTime;
- if (g.HoverDelayClearTimer >= ImMax(0.20f, g.IO.DeltaTime * 2.0f)) // ~6 frames at 30 Hz + allow for low framerate
- g.HoverDelayTimer = g.HoverDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer.
+ // We could expose 0.25f as style.HoverClearDelay but I am not sure of the logic yet, this is particularly subtle.
+ g.HoverItemDelayClearTimer += g.IO.DeltaTime;
+ if (g.HoverItemDelayClearTimer >= ImMax(0.25f, g.IO.DeltaTime * 2.0f)) // ~7 frames at 30 Hz + allow for low framerate
+ g.HoverItemDelayTimer = g.HoverItemDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer.
}
// Drag and drop
@@ -4672,15 +5303,12 @@ void ImGui::NewFrame()
g.DragDropWithinSource = false;
g.DragDropWithinTarget = false;
g.DragDropHoldJustPressedId = 0;
+ g.TooltipPreviousWindow = NULL;
// Close popups on focus lost (currently wip/opt-in)
//if (g.IO.AppFocusLost)
// ClosePopupsExceptModals();
- // Process input queue (trickle as many events as possible)
- g.InputEventsTrail.resize(0);
- UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue);
-
// Update keyboard input state
UpdateKeyboardInputs();
@@ -4689,14 +5317,31 @@ void ImGui::NewFrame()
//IM_ASSERT(g.IO.KeyAlt == IsKeyDown(ImGuiKey_LeftAlt) || IsKeyDown(ImGuiKey_RightAlt));
//IM_ASSERT(g.IO.KeySuper == IsKeyDown(ImGuiKey_LeftSuper) || IsKeyDown(ImGuiKey_RightSuper));
- // Update gamepad/keyboard navigation
+ // Update keyboard/gamepad navigation
NavUpdate();
// Update mouse input state
UpdateMouseInputs();
+ // Mark all windows as not visible and compact unused memory.
+ IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size);
+ const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer;
+ for (ImGuiWindow* window : g.Windows)
+ {
+ window->WasActive = window->Active;
+ window->Active = false;
+ window->WriteAccessed = false;
+ window->BeginCountPreviousFrame = window->BeginCount;
+ window->BeginCount = 0;
+
+ // Garbage collect transient buffers of recently unused windows
+ if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time)
+ GcCompactTransientWindowBuffers(window);
+ }
+
// Find hovered window
// (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame)
+ // (currently needs to be done after the WasActive=Active loop and FindHoveredWindowEx uses ->Active)
UpdateHoveredWindowAndCaptureFlags();
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
@@ -4718,51 +5363,47 @@ void ImGui::NewFrame()
// Mouse wheel scrolling, scale
UpdateMouseWheel();
- // Mark all windows as not visible and compact unused memory.
- IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size);
- const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer;
- for (int i = 0; i != g.Windows.Size; i++)
- {
- ImGuiWindow* window = g.Windows[i];
- window->WasActive = window->Active;
- window->Active = false;
- window->WriteAccessed = false;
- window->BeginCountPreviousFrame = window->BeginCount;
- window->BeginCount = 0;
-
- // Garbage collect transient buffers of recently unused windows
- if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time)
- GcCompactTransientWindowBuffers(window);
- }
-
// Garbage collect transient buffers of recently unused tables
for (int i = 0; i < g.TablesLastTimeActive.Size; i++)
if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time)
TableGcCompactTransientBuffers(g.Tables.GetByIndex(i));
- for (int i = 0; i < g.TablesTempData.Size; i++)
- if (g.TablesTempData[i].LastTimeActive >= 0.0f && g.TablesTempData[i].LastTimeActive < memory_compact_start_time)
- TableGcCompactTransientBuffers(&g.TablesTempData[i]);
+ for (ImGuiTableTempData& table_temp_data : g.TablesTempData)
+ if (table_temp_data.LastTimeActive >= 0.0f && table_temp_data.LastTimeActive < memory_compact_start_time)
+ TableGcCompactTransientBuffers(&table_temp_data);
if (g.GcCompactAll)
GcCompactTransientMiscBuffers();
g.GcCompactAll = false;
// Closing the focused window restore focus to the first active root window in descending z-order
if (g.NavWindow && !g.NavWindow->WasActive)
- FocusTopMostWindowUnderOne(NULL, NULL);
+ FocusTopMostWindowUnderOne(NULL, NULL, NULL, ImGuiFocusRequestFlags_RestoreFocusedChild);
// No window should be open at the beginning of the frame.
// But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear.
g.CurrentWindowStack.resize(0);
g.BeginPopupStack.resize(0);
g.ItemFlagsStack.resize(0);
- g.ItemFlagsStack.push_back(ImGuiItemFlags_None);
+ g.ItemFlagsStack.push_back(ImGuiItemFlags_AutoClosePopups); // Default flags
+ g.CurrentItemFlags = g.ItemFlagsStack.back();
g.GroupStack.resize(0);
// [DEBUG] Update debug features
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
UpdateDebugToolItemPicker();
UpdateDebugToolStackQueries();
+ UpdateDebugToolFlashStyleColor();
if (g.DebugLocateFrames > 0 && --g.DebugLocateFrames == 0)
+ {
g.DebugLocateId = 0;
+ g.DebugBreakInLocateId = false;
+ }
+ if (g.DebugLogAutoDisableFrames > 0 && --g.DebugLogAutoDisableFrames == 0)
+ {
+ DebugLog("(Debug Log: Auto-disabled some ImGuiDebugLogFlags after 2 frames)\n");
+ g.DebugLogFlags &= ~g.DebugLogAutoDisableFlags;
+ g.DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None;
+ }
+#endif
// Create implicit/fallback window - which we will only render it if the user has added something to it.
// We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags.
@@ -4772,129 +5413,20 @@ void ImGui::NewFrame()
Begin("Debug##Default");
IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true);
- CallContextHooks(&g, ImGuiContextHookType_NewFramePost);
-}
-
-// IMPORTANT: ###xxx suffixes must be same in ALL languages
-static const ImGuiLocEntry GLocalizationEntriesEnUS[] =
-{
- { ImGuiLocKey_TableSizeOne, "Size column to fit###SizeOne" },
- { ImGuiLocKey_TableSizeAllFit, "Size all columns to fit###SizeAll" },
- { ImGuiLocKey_TableSizeAllDefault, "Size all columns to default###SizeAll" },
- { ImGuiLocKey_TableResetOrder, "Reset order###ResetOrder" },
- { ImGuiLocKey_WindowingMainMenuBar, "(Main menu bar)" },
- { ImGuiLocKey_WindowingPopup, "(Popup)" },
- { ImGuiLocKey_WindowingUntitled, "(Untitled)" },
-};
-
-void ImGui::Initialize()
-{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
-
- // Add .ini handle for ImGuiWindow and ImGuiTable types
- {
- ImGuiSettingsHandler ini_handler;
- ini_handler.TypeName = "Window";
- ini_handler.TypeHash = ImHashStr("Window");
- ini_handler.ClearAllFn = WindowSettingsHandler_ClearAll;
- ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen;
- ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine;
- ini_handler.ApplyAllFn = WindowSettingsHandler_ApplyAll;
- ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll;
- AddSettingsHandler(&ini_handler);
- }
- TableSettingsAddSettingsHandler();
-
- // Setup default localization table
- LocalizeRegisterEntries(GLocalizationEntriesEnUS, IM_ARRAYSIZE(GLocalizationEntriesEnUS));
-
- // Create default viewport
- ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)();
- g.Viewports.push_back(viewport);
- g.TempBuffer.resize(1024 * 3 + 1, 0);
-
-#ifdef IMGUI_HAS_DOCK
-#endif
-
- g.Initialized = true;
-}
-
-// This function is merely here to free heap allocations.
-void ImGui::Shutdown()
-{
- // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)
- ImGuiContext& g = *GImGui;
- if (g.IO.Fonts && g.FontAtlasOwnedByContext)
- {
- g.IO.Fonts->Locked = false;
- IM_DELETE(g.IO.Fonts);
- }
- g.IO.Fonts = NULL;
- g.DrawListSharedData.TempBuffer.clear();
-
- // Cleanup of other data are conditional on actually having initialized Dear ImGui.
- if (!g.Initialized)
- return;
-
- // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file)
- if (g.SettingsLoaded && g.IO.IniFilename != NULL)
- SaveIniSettingsToDisk(g.IO.IniFilename);
-
- CallContextHooks(&g, ImGuiContextHookType_Shutdown);
-
- // Clear everything else
- g.Windows.clear_delete();
- g.WindowsFocusOrder.clear();
- g.WindowsTempSortBuffer.clear();
- g.CurrentWindow = NULL;
- g.CurrentWindowStack.clear();
- g.WindowsById.Clear();
- g.NavWindow = NULL;
- g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL;
- g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL;
- g.MovingWindow = NULL;
-
- g.KeysRoutingTable.Clear();
-
- g.ColorStack.clear();
- g.StyleVarStack.clear();
- g.FontStack.clear();
- g.OpenPopupStack.clear();
- g.BeginPopupStack.clear();
+ // Store stack sizes
+ g.ErrorCountCurrentFrame = 0;
+ ErrorRecoveryStoreState(&g.StackSizesInNewFrame);
- g.Viewports.clear_delete();
-
- g.TabBars.Clear();
- g.CurrentTabBarStack.clear();
- g.ShrinkWidthBuffer.clear();
-
- g.ClipperTempData.clear_destruct();
-
- g.Tables.Clear();
- g.TablesTempData.clear_destruct();
- g.DrawChannelsTempMergeBuffer.clear();
-
- g.ClipboardHandlerData.clear();
- g.MenusIdSubmittedThisFrame.clear();
- g.InputTextState.ClearFreeMemory();
-
- g.SettingsWindows.clear();
- g.SettingsHandlers.clear();
-
- if (g.LogFile)
- {
-#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
- if (g.LogFile != stdout)
+ // [DEBUG] When io.ConfigDebugBeginReturnValue is set, we make Begin()/BeginChild() return false at different level of the window-stack,
+ // allowing to validate correct Begin/End behavior in user code.
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ if (g.IO.ConfigDebugBeginReturnValueLoop)
+ g.DebugBeginReturnValueCullDepth = (g.DebugBeginReturnValueCullDepth == -1) ? 0 : ((g.DebugBeginReturnValueCullDepth + ((g.FrameCount % 4) == 0 ? 1 : 0)) % 10);
+ else
+ g.DebugBeginReturnValueCullDepth = -1;
#endif
- ImFileClose(g.LogFile);
- g.LogFile = NULL;
- }
- g.LogBuffer.clear();
- g.DebugLogBuf.clear();
- g.DebugLogIndex.clear();
- g.Initialized = false;
+ CallContextHooks(&g, ImGuiContextHookType_NewFramePost);
}
// FIXME: Add a more explicit sort order in the window structure.
@@ -4925,53 +5457,17 @@ static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, Im
}
}
-static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list)
-{
- if (draw_list->CmdBuffer.Size == 0)
- return;
- if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL)
- return;
-
- // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc.
- // May trigger for you if you are using PrimXXX functions incorrectly.
- IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size);
- IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size);
- if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset))
- IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size);
-
- // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window)
- // If this assert triggers because you are drawing lots of stuff manually:
- // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds.
- // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents.
- // - If you want large meshes with more than 64K vertices, you can either:
- // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'.
- // Most example backends already support this from 1.71. Pre-1.71 backends won't.
- // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them.
- // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h.
- // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time:
- // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
- // Your own engine or render API may use different parameters or function calls to specify index sizes.
- // 2 and 4 bytes indices are generally supported by most graphics API.
- // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching
- // the 64K limit to split your draw commands in multiple draw lists.
- if (sizeof(ImDrawIdx) == 2)
- IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above");
-
- out_list->push_back(draw_list);
-}
-
static void AddWindowToDrawData(ImGuiWindow* window, int layer)
{
ImGuiContext& g = *GImGui;
ImGuiViewportP* viewport = g.Viewports[0];
g.IO.MetricsRenderWindows++;
- AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList);
- for (int i = 0; i < window->DC.ChildWindows.Size; i++)
- {
- ImGuiWindow* child = window->DC.ChildWindows[i];
+ if (window->DrawList->_Splitter._Count > 1)
+ window->DrawList->ChannelsMerge(); // Merge if user forgot to merge back. Also required in Docking branch for ImGuiWindowFlags_DockNodeHost windows.
+ ImGui::AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[layer], window->DrawList);
+ for (ImGuiWindow* child : window->DC.ChildWindows)
if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active
AddWindowToDrawData(child, layer);
- }
}
static inline int GetWindowDisplayLayer(ImGuiWindow* window)
@@ -4985,42 +5481,41 @@ static inline void AddRootWindowToDrawData(ImGuiWindow* window)
AddWindowToDrawData(window, GetWindowDisplayLayer(window));
}
-void ImDrawDataBuilder::FlattenIntoSingleLayer()
+static void FlattenDrawDataIntoSingleLayer(ImDrawDataBuilder* builder)
{
- int n = Layers[0].Size;
- int size = n;
- for (int i = 1; i < IM_ARRAYSIZE(Layers); i++)
- size += Layers[i].Size;
- Layers[0].resize(size);
- for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++)
+ int n = builder->Layers[0]->Size;
+ int full_size = n;
+ for (int i = 1; i < IM_ARRAYSIZE(builder->Layers); i++)
+ full_size += builder->Layers[i]->Size;
+ builder->Layers[0]->resize(full_size);
+ for (int layer_n = 1; layer_n < IM_ARRAYSIZE(builder->Layers); layer_n++)
{
- ImVector<ImDrawList*>& layer = Layers[layer_n];
- if (layer.empty())
+ ImVector<ImDrawList*>* layer = builder->Layers[layer_n];
+ if (layer->empty())
continue;
- memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*));
- n += layer.Size;
- layer.resize(0);
+ memcpy(builder->Layers[0]->Data + n, layer->Data, layer->Size * sizeof(ImDrawList*));
+ n += layer->Size;
+ layer->resize(0);
}
}
-static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector<ImDrawList*>* draw_lists)
+static void InitViewportDrawData(ImGuiViewportP* viewport)
{
ImGuiIO& io = ImGui::GetIO();
ImDrawData* draw_data = &viewport->DrawDataP;
+
+ viewport->DrawDataBuilder.Layers[0] = &draw_data->CmdLists;
+ viewport->DrawDataBuilder.Layers[1] = &viewport->DrawDataBuilder.LayerData1;
+ viewport->DrawDataBuilder.Layers[0]->resize(0);
+ viewport->DrawDataBuilder.Layers[1]->resize(0);
+
draw_data->Valid = true;
- draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL;
- draw_data->CmdListsCount = draw_lists->Size;
+ draw_data->CmdListsCount = 0;
draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0;
draw_data->DisplayPos = viewport->Pos;
draw_data->DisplaySize = viewport->Size;
draw_data->FramebufferScale = io.DisplayFramebufferScale;
- for (int n = 0; n < draw_lists->Size; n++)
- {
- ImDrawList* draw_list = draw_lists->Data[n];
- draw_list->_PopUnusedDrawCmd();
- draw_data->TotalVtxCount += draw_list->VtxBuffer.Size;
- draw_data->TotalIdxCount += draw_list->IdxBuffer.Size;
- }
+ draw_data->OwnerViewport = viewport;
}
// Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering.
@@ -5029,6 +5524,8 @@ static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector<ImDrawList*
// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect():
// some frequently called functions which to modify both channels and clipping simultaneously tend to use the
// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds.
+// - This is analoguous to PushFont()/PopFont() in the sense that are a mixing a global stack and a window stack,
+// which in the case of ClipRect is not so problematic but tends to be more restrictive for fonts.
void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -5059,14 +5556,14 @@ static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32
ImDrawList* draw_list = window->RootWindow->DrawList;
if (draw_list->CmdBuffer.Size == 0)
draw_list->AddDrawCmd();
- draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // Ensure ImDrawCmd are not merged
+ draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // FIXME: Need to stricty ensure ImDrawCmd are not merged (ElemCount==6 checks below will verify that)
draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col);
ImDrawCmd cmd = draw_list->CmdBuffer.back();
IM_ASSERT(cmd.ElemCount == 6);
draw_list->CmdBuffer.pop_back();
draw_list->CmdBuffer.push_front(cmd);
- draw_list->PopClipRect();
draw_list->AddDrawCmd(); // We need to create a command as CmdBuffer.back().IdxOffset won't be correct if we append to same command.
+ draw_list->PopClipRect();
}
}
@@ -5102,11 +5599,11 @@ static void ImGui::RenderDimmedBackgrounds()
{
// Draw dimming behind modal or a begin stack child, whichever comes first in draw order.
ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window);
- RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio));
+ RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(modal_window->DC.ModalDimBgColor, g.DimBgRatio));
}
else if (dim_bg_for_window_list)
{
- // Draw dimming behind CTRL+Tab target window
+ // Draw dimming behind CTRL+Tab target window and behind CTRL+Tab UI window
RenderDimmedBackgroundBehindWindow(g.NavWindowingTargetAnim, GetColorU32(ImGuiCol_NavWindowingDimBg, g.DimBgRatio));
// Draw border around CTRL+Tab target window
@@ -5138,11 +5635,20 @@ void ImGui::EndFrame()
CallContextHooks(&g, ImGuiContextHookType_EndFramePre);
+ // [EXPERIMENTAL] Recover from errors
+ if (g.IO.ConfigErrorRecovery)
+ ErrorRecoveryTryToRecoverState(&g.StackSizesInNewFrame);
ErrorCheckEndFrameSanityChecks();
+ ErrorCheckEndFrameFinalizeErrorTooltip();
// Notify Platform/OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
- if (g.IO.SetPlatformImeDataFn && memcmp(&g.PlatformImeData, &g.PlatformImeDataPrev, sizeof(ImGuiPlatformImeData)) != 0)
- g.IO.SetPlatformImeDataFn(GetMainViewport(), &g.PlatformImeData);
+ ImGuiPlatformImeData* ime_data = &g.PlatformImeData;
+ if (g.PlatformIO.Platform_SetImeDataFn != NULL && memcmp(ime_data, &g.PlatformImeDataPrev, sizeof(ImGuiPlatformImeData)) != 0)
+ {
+ IMGUI_DEBUG_LOG_IO("[io] Calling Platform_SetImeDataFn(): WantVisible: %d, InputPos (%.2f,%.2f)\n", ime_data->WantVisible, ime_data->InputPos.x, ime_data->InputPos.y);
+ ImGuiViewport* viewport = GetMainViewport();
+ g.PlatformIO.Platform_SetImeDataFn(&g, viewport, ime_data);
+ }
// Hide implicit/fallback "Debug" window if it hasn't been used
g.WithinFrameScopeWithImplicitWindow = false;
@@ -5157,13 +5663,17 @@ void ImGui::EndFrame()
if (g.DragDropActive)
{
bool is_delivered = g.DragDropPayload.Delivery;
- bool is_elapsed = (g.DragDropPayload.DataFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceAutoExpirePayload) || !IsMouseDown(g.DragDropMouseButton));
+ bool is_elapsed = (g.DragDropSourceFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_PayloadAutoExpire) || g.DragDropMouseButton == -1 || !IsMouseDown(g.DragDropMouseButton));
if (is_delivered || is_elapsed)
ClearDragDrop();
}
- // Drag and Drop: Fallback for source tooltip. This is not ideal but better than nothing.
- if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
+ // Drag and Drop: Fallback for missing source tooltip. This is not ideal but better than nothing.
+ // If you want to handle source item disappearing: instead of submitting your description tooltip
+ // in the BeginDragDropSource() block of the dragged item, you can submit them from a safe single spot
+ // (e.g. end of your item loop, or before EndFrame) by reading payload data.
+ // In the typical case, the contents of drag tooltip should be possible to infer solely from payload data.
+ if (g.DragDropActive && g.DragDropSourceFrameCount + 1 < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
{
g.DragDropWithinSource = true;
SetTooltip("...");
@@ -5181,9 +5691,8 @@ void ImGui::EndFrame()
// We cannot do that on FocusWindow() because children may not exist yet
g.WindowsTempSortBuffer.resize(0);
g.WindowsTempSortBuffer.reserve(g.Windows.Size);
- for (int i = 0; i != g.Windows.Size; i++)
+ for (ImGuiWindow* window : g.Windows)
{
- ImGuiWindow* window = g.Windows[i];
if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it
continue;
AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window);
@@ -5198,6 +5707,7 @@ void ImGui::EndFrame()
g.IO.Fonts->Locked = false;
// Clear Input data for next frame
+ g.IO.MousePosPrev = g.IO.MousePos;
g.IO.AppFocusLost = false;
g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f;
g.IO.InputQueueCharacters.resize(0);
@@ -5215,32 +5725,30 @@ void ImGui::Render()
if (g.FrameCountEnded != g.FrameCount)
EndFrame();
- const bool first_render_of_frame = (g.FrameCountRendered != g.FrameCount);
+ if (g.FrameCountRendered == g.FrameCount)
+ return;
g.FrameCountRendered = g.FrameCount;
- g.IO.MetricsRenderWindows = 0;
+ g.IO.MetricsRenderWindows = 0;
CallContextHooks(&g, ImGuiContextHookType_RenderPre);
// Add background ImDrawList (for each active viewport)
- for (int n = 0; n != g.Viewports.Size; n++)
+ for (ImGuiViewportP* viewport : g.Viewports)
{
- ImGuiViewportP* viewport = g.Viewports[n];
- viewport->DrawDataBuilder.Clear();
- if (viewport->DrawLists[0] != NULL)
- AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport));
+ InitViewportDrawData(viewport);
+ if (viewport->BgFgDrawLists[0] != NULL)
+ AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport));
}
// Draw modal/window whitening backgrounds
- if (first_render_of_frame)
- RenderDimmedBackgrounds();
+ RenderDimmedBackgrounds();
// Add ImDrawList to render
ImGuiWindow* windows_to_render_top_most[2];
windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL;
windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL);
- for (int n = 0; n != g.Windows.Size; n++)
+ for (ImGuiWindow* window : g.Windows)
{
- ImGuiWindow* window = g.Windows[n];
IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'"
if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1])
AddRootWindowToDrawData(window);
@@ -5250,22 +5758,25 @@ void ImGui::Render()
AddRootWindowToDrawData(windows_to_render_top_most[n]);
// Draw software mouse cursor if requested by io.MouseDrawCursor flag
- if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None)
+ if (g.IO.MouseDrawCursor && g.MouseCursor != ImGuiMouseCursor_None)
RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48));
// Setup ImDrawData structures for end-user
g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0;
- for (int n = 0; n < g.Viewports.Size; n++)
+ for (ImGuiViewportP* viewport : g.Viewports)
{
- ImGuiViewportP* viewport = g.Viewports[n];
- viewport->DrawDataBuilder.FlattenIntoSingleLayer();
+ FlattenDrawDataIntoSingleLayer(&viewport->DrawDataBuilder);
// Add foreground ImDrawList (for each active viewport)
- if (viewport->DrawLists[1] != NULL)
- AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport));
+ if (viewport->BgFgDrawLists[1] != NULL)
+ AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport));
- SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]);
+ // We call _PopUnusedDrawCmd() last thing, as RenderDimmedBackgrounds() rely on a valid command being there (especially in docking branch).
ImDrawData* draw_data = &viewport->DrawDataP;
+ IM_ASSERT(draw_data->CmdLists.Size == draw_data->CmdListsCount);
+ for (ImDrawList* draw_list : draw_data->CmdLists)
+ draw_list->_PopUnusedDrawCmd();
+
g.IO.MetricsRenderVertices += draw_data->TotalVtxCount;
g.IO.MetricsRenderIndices += draw_data->TotalIdxCount;
}
@@ -5296,42 +5807,40 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
// FIXME: Investigate using ceilf or e.g.
// - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c
// - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html
- text_size.x = IM_FLOOR(text_size.x + 0.99999f);
+ text_size.x = IM_TRUNC(text_size.x + 0.99999f);
return text_size;
}
// Find window given position, search front-to-back
-// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically
-// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is
-// called, aka before the next Begin(). Moving window isn't affected.
-static void FindHoveredWindow()
+// - Typically write output back to g.HoveredWindow and g.HoveredWindowUnderMovingWindow.
+// - FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically
+// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is
+// called, aka before the next Begin(). Moving window isn't affected.
+// - The 'find_first_and_in_any_viewport = true' mode is only used by TestEngine. It is simpler to maintain here.
+void ImGui::FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window)
{
ImGuiContext& g = *GImGui;
-
ImGuiWindow* hovered_window = NULL;
- ImGuiWindow* hovered_window_ignoring_moving_window = NULL;
- if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs))
+ ImGuiWindow* hovered_window_under_moving_window = NULL;
+
+ if (find_first_and_in_any_viewport == false && g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs))
hovered_window = g.MovingWindow;
ImVec2 padding_regular = g.Style.TouchExtraPadding;
- ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular;
+ ImVec2 padding_for_resize = ImMax(g.Style.TouchExtraPadding, ImVec2(g.Style.WindowBorderHoverPadding, g.Style.WindowBorderHoverPadding));
for (int i = g.Windows.Size - 1; i >= 0; i--)
{
ImGuiWindow* window = g.Windows[i];
IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
- if (!window->Active || window->Hidden)
+ if (!window->WasActive || window->Hidden)
continue;
if (window->Flags & ImGuiWindowFlags_NoMouseInputs)
continue;
// Using the clipped AABB, a child window will typically be clipped by its parent (not always)
- ImRect bb(window->OuterRectClipped);
- if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize))
- bb.Expand(padding_regular);
- else
- bb.Expand(padding_for_resize);
- if (!bb.Contains(g.IO.MousePos))
+ ImVec2 hit_padding = (window->Flags & (ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) ? padding_regular : padding_for_resize;
+ if (!window->OuterRectClipped.ContainsWithPad(pos, hit_padding))
continue;
// Support for one rectangular hole in any given window
@@ -5340,21 +5849,30 @@ static void FindHoveredWindow()
{
ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y);
ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y);
- if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos))
+ if (ImRect(hole_pos, hole_pos + hole_size).Contains(pos))
continue;
}
- if (hovered_window == NULL)
+ if (find_first_and_in_any_viewport)
+ {
hovered_window = window;
- IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
- if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow))
- hovered_window_ignoring_moving_window = window;
- if (hovered_window && hovered_window_ignoring_moving_window)
break;
+ }
+ else
+ {
+ if (hovered_window == NULL)
+ hovered_window = window;
+ IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
+ if (hovered_window_under_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow))
+ hovered_window_under_moving_window = window;
+ if (hovered_window && hovered_window_under_moving_window)
+ break;
+ }
}
- g.HoveredWindow = hovered_window;
- g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window;
+ *out_hovered_window = hovered_window;
+ if (out_hovered_window_under_moving_window != NULL)
+ *out_hovered_window_under_moving_window = hovered_window_under_moving_window;
}
bool ImGui::IsItemActive()
@@ -5379,22 +5897,20 @@ bool ImGui::IsItemDeactivated()
ImGuiContext& g = *GImGui;
if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDeactivated)
return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Deactivated) != 0;
- return (g.ActiveIdPreviousFrame == g.LastItemData.ID && g.ActiveIdPreviousFrame != 0 && g.ActiveId != g.LastItemData.ID);
+ return (g.DeactivatedItemData.ID == g.LastItemData.ID && g.LastItemData.ID != 0 && g.DeactivatedItemData.ElapseFrame >= g.FrameCount);
}
bool ImGui::IsItemDeactivatedAfterEdit()
{
ImGuiContext& g = *GImGui;
- return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore));
+ return IsItemDeactivated() && g.DeactivatedItemData.HasBeenEditedBefore;
}
-// == GetItemID() == GetFocusID()
+// == (GetItemID() == GetFocusID() && GetFocusID() != 0)
bool ImGui::IsItemFocused()
{
ImGuiContext& g = *GImGui;
- if (g.NavId != g.LastItemData.ID || g.NavId == 0)
- return false;
- return true;
+ return g.NavId == g.LastItemData.ID && g.NavId != 0;
}
// Important: this can be useful but it is NOT equivalent to the behavior of e.g.Button()!
@@ -5410,12 +5926,21 @@ bool ImGui::IsItemToggledOpen()
return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false;
}
+// Call after a Selectable() or TreeNode() involved in multi-selection.
+// Useful if you need the per-item information before reaching EndMultiSelect(), e.g. for rendering purpose.
+// This is only meant to be called inside a BeginMultiSelect()/EndMultiSelect() block.
+// (Outside of multi-select, it would be misleading/ambiguous to report this signal, as widgets
+// return e.g. a pressed event and user code is in charge of altering selection in ways we cannot predict.)
bool ImGui::IsItemToggledSelection()
{
ImGuiContext& g = *GImGui;
+ IM_ASSERT(g.CurrentMultiSelect != NULL); // Can only be used inside a BeginMultiSelect()/EndMultiSelect()
return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false;
}
+// IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app,
+// you should not use this function! Use the 'io.WantCaptureMouse' boolean for that!
+// Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details.
bool ImGui::IsAnyItemHovered()
{
ImGuiContext& g = *GImGui;
@@ -5431,7 +5956,7 @@ bool ImGui::IsAnyItemActive()
bool ImGui::IsAnyItemFocused()
{
ImGuiContext& g = *GImGui;
- return g.NavId != 0 && !g.NavDisableHighlight;
+ return g.NavId != 0 && g.NavCursorVisible;
}
bool ImGui::IsItemVisible()
@@ -5446,19 +5971,31 @@ bool ImGui::IsItemEdited()
return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Edited) != 0;
}
+// Allow next item to be overlapped by subsequent items.
+// This works by requiring HoveredId to match for two subsequent frames,
+// so if a following items overwrite it our interactions will naturally be disabled.
+void ImGui::SetNextItemAllowOverlap()
+{
+ ImGuiContext& g = *GImGui;
+ g.NextItemData.ItemFlags |= ImGuiItemFlags_AllowOverlap;
+}
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority.
-// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework.
+// FIXME-LEGACY: Use SetNextItemAllowOverlap() *before* your item instead.
void ImGui::SetItemAllowOverlap()
{
ImGuiContext& g = *GImGui;
ImGuiID id = g.LastItemData.ID;
if (g.HoveredId == id)
g.HoveredIdAllowOverlap = true;
- if (g.ActiveId == id)
+ if (g.ActiveId == id) // Before we made this obsolete, most calls to SetItemAllowOverlap() used to avoid this path by testing g.ActiveId != id.
g.ActiveIdAllowOverlap = true;
}
+#endif
-// FIXME: It might be undesirable that this will likely disable KeyOwner-aware shortcuts systems. Consider a more fine-tuned version for the two users of this function.
+// This is a shortcut for not taking ownership of 100+ keys, frequently used by drag operations.
+// FIXME: It might be undesirable that this will likely disable KeyOwner-aware shortcuts systems. Consider a more fine-tuned version if needed?
void ImGui::SetActiveIdUsingAllKeyboardKeys()
{
ImGuiContext& g = *GImGui;
@@ -5468,6 +6005,12 @@ void ImGui::SetActiveIdUsingAllKeyboardKeys()
NavMoveRequestCancel();
}
+ImGuiID ImGui::GetItemID()
+{
+ ImGuiContext& g = *GImGui;
+ return g.LastItemData.ID;
+}
+
ImVec2 ImGui::GetItemRectMin()
{
ImGuiContext& g = *GImGui;
@@ -5486,40 +6029,127 @@ ImVec2 ImGui::GetItemRectSize()
return g.LastItemData.Rect.GetSize();
}
-bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags)
+// Prior to v1.90 2023/10/16, the BeginChild() function took a 'bool border = false' parameter instead of 'ImGuiChildFlags child_flags = 0'.
+// ImGuiChildFlags_Borders is defined as always == 1 in order to allow old code passing 'true'. Read comments in imgui.h for details!
+bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags)
+{
+ ImGuiID id = GetCurrentWindow()->GetID(str_id);
+ return BeginChildEx(str_id, id, size_arg, child_flags, window_flags);
+}
+
+bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags)
+{
+ return BeginChildEx(NULL, id, size_arg, child_flags, window_flags);
+}
+
+bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* parent_window = g.CurrentWindow;
+ IM_ASSERT(id != 0);
- flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow;
- flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag
-
- // Size
- const ImVec2 content_avail = GetContentRegionAvail();
- ImVec2 size = ImFloor(size_arg);
- const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00);
- if (size.x <= 0.0f)
- size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too many issues)
- if (size.y <= 0.0f)
- size.y = ImMax(content_avail.y + size.y, 4.0f);
+ // Sanity check as it is likely that some user will accidentally pass ImGuiWindowFlags into the ImGuiChildFlags argument.
+ const ImGuiChildFlags ImGuiChildFlags_SupportedMask_ = ImGuiChildFlags_Borders | ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_FrameStyle | ImGuiChildFlags_NavFlattened;
+ IM_UNUSED(ImGuiChildFlags_SupportedMask_);
+ IM_ASSERT((child_flags & ~ImGuiChildFlags_SupportedMask_) == 0 && "Illegal ImGuiChildFlags value. Did you pass ImGuiWindowFlags values instead of ImGuiChildFlags?");
+ IM_ASSERT((window_flags & ImGuiWindowFlags_AlwaysAutoResize) == 0 && "Cannot specify ImGuiWindowFlags_AlwaysAutoResize for BeginChild(). Use ImGuiChildFlags_AlwaysAutoResize!");
+ if (child_flags & ImGuiChildFlags_AlwaysAutoResize)
+ {
+ IM_ASSERT((child_flags & (ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY)) == 0 && "Cannot use ImGuiChildFlags_ResizeX or ImGuiChildFlags_ResizeY with ImGuiChildFlags_AlwaysAutoResize!");
+ IM_ASSERT((child_flags & (ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY)) != 0 && "Must use ImGuiChildFlags_AutoResizeX or ImGuiChildFlags_AutoResizeY with ImGuiChildFlags_AlwaysAutoResize!");
+ }
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ if (window_flags & ImGuiWindowFlags_AlwaysUseWindowPadding)
+ child_flags |= ImGuiChildFlags_AlwaysUseWindowPadding;
+ if (window_flags & ImGuiWindowFlags_NavFlattened)
+ child_flags |= ImGuiChildFlags_NavFlattened;
+#endif
+ if (child_flags & ImGuiChildFlags_AutoResizeX)
+ child_flags &= ~ImGuiChildFlags_ResizeX;
+ if (child_flags & ImGuiChildFlags_AutoResizeY)
+ child_flags &= ~ImGuiChildFlags_ResizeY;
+
+ // Set window flags
+ window_flags |= ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoTitleBar;
+ window_flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag
+ if (child_flags & (ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize))
+ window_flags |= ImGuiWindowFlags_AlwaysAutoResize;
+ if ((child_flags & (ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY)) == 0)
+ window_flags |= ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings;
+
+ // Special framed style
+ if (child_flags & ImGuiChildFlags_FrameStyle)
+ {
+ PushStyleColor(ImGuiCol_ChildBg, g.Style.Colors[ImGuiCol_FrameBg]);
+ PushStyleVar(ImGuiStyleVar_ChildRounding, g.Style.FrameRounding);
+ PushStyleVar(ImGuiStyleVar_ChildBorderSize, g.Style.FrameBorderSize);
+ PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.FramePadding);
+ child_flags |= ImGuiChildFlags_Borders | ImGuiChildFlags_AlwaysUseWindowPadding;
+ window_flags |= ImGuiWindowFlags_NoMove;
+ }
+
+ // Forward size
+ // Important: Begin() has special processing to switch condition to ImGuiCond_FirstUseEver for a given axis when ImGuiChildFlags_ResizeXXX is set.
+ // (the alternative would to store conditional flags per axis, which is possible but more code)
+ const ImVec2 size_avail = GetContentRegionAvail();
+ const ImVec2 size_default((child_flags & ImGuiChildFlags_AutoResizeX) ? 0.0f : size_avail.x, (child_flags & ImGuiChildFlags_AutoResizeY) ? 0.0f : size_avail.y);
+ ImVec2 size = CalcItemSize(size_arg, size_default.x, size_default.y);
+
+ // A SetNextWindowSize() call always has priority (#8020)
+ // (since the code in Begin() never supported SizeVal==0.0f aka auto-resize via SetNextWindowSize() call, we don't support it here for now)
+ // FIXME: We only support ImGuiCond_Always in this path. Supporting other paths would requires to obtain window pointer.
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSize) != 0 && (g.NextWindowData.SizeCond & ImGuiCond_Always) != 0)
+ {
+ if (g.NextWindowData.SizeVal.x > 0.0f)
+ {
+ size.x = g.NextWindowData.SizeVal.x;
+ child_flags &= ~ImGuiChildFlags_ResizeX;
+ }
+ if (g.NextWindowData.SizeVal.y > 0.0f)
+ {
+ size.y = g.NextWindowData.SizeVal.y;
+ child_flags &= ~ImGuiChildFlags_ResizeY;
+ }
+ }
SetNextWindowSize(size);
+ // Forward child flags (we allow prior settings to merge but it'll only work for adding flags)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasChildFlags)
+ g.NextWindowData.ChildFlags |= child_flags;
+ else
+ g.NextWindowData.ChildFlags = child_flags;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasChildFlags;
+
// Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value.
+ // FIXME: 2023/11/14: commented out shorted version. We had an issue with multiple ### in child window path names, which the trailing hash helped workaround.
+ // e.g. "ParentName###ParentIdentifier/ChildName###ChildIdentifier" would get hashed incorrectly by ImHashStr(), trailing _%08X somehow fixes it.
const char* temp_window_name;
+ /*if (name && parent_window->IDStack.back() == parent_window->ID)
+ ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s", parent_window->Name, name); // May omit ID if in root of ID stack
+ else*/
if (name)
ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s_%08X", parent_window->Name, name, id);
else
ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%08X", parent_window->Name, id);
+ // Set style
const float backup_border_size = g.Style.ChildBorderSize;
- if (!border)
+ if ((child_flags & ImGuiChildFlags_Borders) == 0)
g.Style.ChildBorderSize = 0.0f;
- bool ret = Begin(temp_window_name, NULL, flags);
+
+ // Begin into window
+ const bool ret = Begin(temp_window_name, NULL, window_flags);
+
+ // Restore style
g.Style.ChildBorderSize = backup_border_size;
+ if (child_flags & ImGuiChildFlags_FrameStyle)
+ {
+ PopStyleVar(3);
+ PopStyleColor();
+ }
ImGuiWindow* child_window = g.CurrentWindow;
child_window->ChildId = id;
- child_window->AutoFitChildAxises = (ImS8)auto_fit_axises;
// Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually.
// While this is not really documented/defined, it seems that the expected thing to do.
@@ -5527,92 +6157,69 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b
parent_window->DC.CursorPos = child_window->Pos;
// Process navigation-in immediately so NavInit can run on first frame
- if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavHasScroll))
+ // Can enter a child if (A) it has navigable items or (B) it can be scrolled.
+ const ImGuiID temp_id_for_activation = ImHashStr("##Child", 0, id);
+ if (g.ActiveId == temp_id_for_activation)
+ ClearActiveID();
+ if (g.NavActivateId == id && !(child_flags & ImGuiChildFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY))
{
FocusWindow(child_window);
NavInitWindow(child_window, false);
- SetActiveID(id + 1, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item
- g.ActiveIdSource = ImGuiInputSource_Nav;
+ SetActiveID(temp_id_for_activation, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item
+ g.ActiveIdSource = g.NavInputSource;
}
return ret;
}
-bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags)
-{
- ImGuiWindow* window = GetCurrentWindow();
- return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags);
-}
-
-bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags)
-{
- IM_ASSERT(id != 0);
- return BeginChildEx(NULL, id, size_arg, border, extra_flags);
-}
-
void ImGui::EndChild()
{
ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
+ ImGuiWindow* child_window = g.CurrentWindow;
- IM_ASSERT(g.WithinEndChild == false);
- IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls
+ const ImGuiID backup_within_end_child_id = g.WithinEndChildID;
+ IM_ASSERT(child_window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls
- g.WithinEndChild = true;
- if (window->BeginCount > 1)
- {
- End();
- }
- else
+ g.WithinEndChildID = child_window->ID;
+ ImVec2 child_size = child_window->Size;
+ End();
+ if (child_window->BeginCount == 1)
{
- ImVec2 sz = window->Size;
- if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f
- sz.x = ImMax(4.0f, sz.x);
- if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y))
- sz.y = ImMax(4.0f, sz.y);
- End();
-
ImGuiWindow* parent_window = g.CurrentWindow;
- ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz);
- ItemSize(sz);
- if ((window->DC.NavLayersActiveMask != 0 || window->DC.NavHasScroll) && !(window->Flags & ImGuiWindowFlags_NavFlattened))
+ ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + child_size);
+ ItemSize(child_size);
+ const bool nav_flattened = (child_window->ChildFlags & ImGuiChildFlags_NavFlattened) != 0;
+ if ((child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY) && !nav_flattened)
{
- ItemAdd(bb, window->ChildId);
- RenderNavHighlight(bb, window->ChildId);
+ ItemAdd(bb, child_window->ChildId);
+ RenderNavCursor(bb, child_window->ChildId);
// When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying)
- if (window->DC.NavLayersActiveMask == 0 && window == g.NavWindow)
- RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin);
+ if (child_window->DC.NavLayersActiveMask == 0 && child_window == g.NavWindow)
+ RenderNavCursor(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavRenderCursorFlags_Compact);
}
else
{
// Not navigable into
- ItemAdd(bb, 0);
+ // - This is a bit of a fringe use case, mostly useful for undecorated, non-scrolling contents childs, or empty childs.
+ // - We could later decide to not apply this path if ImGuiChildFlags_FrameStyle or ImGuiChildFlags_Borders is set.
+ ItemAdd(bb, child_window->ChildId, NULL, ImGuiItemFlags_NoNav);
+
+ // But when flattened we directly reach items, adjust active layer mask accordingly
+ if (nav_flattened)
+ parent_window->DC.NavLayersActiveMaskNext |= child_window->DC.NavLayersActiveMaskNext;
}
- if (g.HoveredWindow == window)
+ if (g.HoveredWindow == child_window)
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow;
+ child_window->DC.ChildItemStatusFlags = g.LastItemData.StatusFlags;
+ //SetLastItemDataForChildWindowItem(child_window, child_window->Rect()); // Not needed, effectively done by ItemAdd()
+ }
+ else
+ {
+ SetLastItemDataForChildWindowItem(child_window, child_window->Rect());
}
- g.WithinEndChild = false;
- g.LogLinePosY = -FLT_MAX; // To enforce a carriage return
-}
-
-// Helper to create a child window / scrolling region that looks like a normal widget frame.
-bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags)
-{
- ImGuiContext& g = *GImGui;
- const ImGuiStyle& style = g.Style;
- PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);
- PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);
- PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);
- PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding);
- bool ret = BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags);
- PopStyleVar(3);
- PopStyleColor();
- return ret;
-}
-void ImGui::EndChildFrame()
-{
- EndChild();
+ g.WithinEndChildID = backup_within_end_child_id;
+ g.LogLinePosY = -FLT_MAX; // To enforce a carriage return
}
static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled)
@@ -5636,61 +6243,29 @@ ImGuiWindow* ImGui::FindWindowByName(const char* name)
static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings)
{
- window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y));
+ window->Pos = ImTrunc(ImVec2(settings->Pos.x, settings->Pos.y));
if (settings->Size.x > 0 && settings->Size.y > 0)
- window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y));
+ window->Size = window->SizeFull = ImTrunc(ImVec2(settings->Size.x, settings->Size.y));
window->Collapsed = settings->Collapsed;
}
-static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags)
-{
- ImGuiContext& g = *GImGui;
-
- const bool new_is_explicit_child = (new_flags & ImGuiWindowFlags_ChildWindow) != 0 && ((new_flags & ImGuiWindowFlags_Popup) == 0 || (new_flags & ImGuiWindowFlags_ChildMenu) != 0);
- const bool child_flag_changed = new_is_explicit_child != window->IsExplicitChild;
- if ((just_created || child_flag_changed) && !new_is_explicit_child)
- {
- IM_ASSERT(!g.WindowsFocusOrder.contains(window));
- g.WindowsFocusOrder.push_back(window);
- window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1);
- }
- else if (!just_created && child_flag_changed && new_is_explicit_child)
- {
- IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window);
- for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++)
- g.WindowsFocusOrder[n]->FocusOrder--;
- g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder);
- window->FocusOrder = -1;
- }
- window->IsExplicitChild = new_is_explicit_child;
-}
-
-static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
+static void InitOrLoadWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings)
{
- ImGuiContext& g = *GImGui;
- //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
-
- // Create window the first time
- ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name);
- window->Flags = flags;
- g.WindowsById.SetVoidPtr(window->ID, window);
-
- // Default/arbitrary window position. Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window.
+ // Initial window state with e.g. default/arbitrary window position
+ // Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window.
const ImGuiViewport* main_viewport = ImGui::GetMainViewport();
window->Pos = main_viewport->Pos + ImVec2(60, 60);
+ window->Size = window->SizeFull = ImVec2(0, 0);
+ window->SetWindowPosAllowFlags = window->SetWindowSizeAllowFlags = window->SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing;
- // User can disable loading and saving of settings. Tooltip and child windows also don't store settings.
- if (!(flags & ImGuiWindowFlags_NoSavedSettings))
- if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID))
- {
- // Retrieve settings from .ini file
- window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings);
- SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
- ApplyWindowSettings(window, settings);
- }
+ if (settings != NULL)
+ {
+ SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
+ ApplyWindowSettings(window, settings);
+ }
window->DC.CursorStartPos = window->DC.CursorMaxPos = window->DC.IdealMaxPos = window->Pos; // So first call to CalcWindowContentSizes() doesn't return crazy values
- if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
+ if ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
{
window->AutoFitFramesX = window->AutoFitFramesY = 2;
window->AutoFitOnlyGrows = false;
@@ -5703,6 +6278,23 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
window->AutoFitFramesY = 2;
window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0);
}
+}
+
+static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
+{
+ // Create window the first time
+ //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name);
+ window->Flags = flags;
+ g.WindowsById.SetVoidPtr(window->ID, window);
+
+ ImGuiWindowSettings* settings = NULL;
+ if (!(flags & ImGuiWindowFlags_NoSavedSettings))
+ if ((settings = ImGui::FindWindowSettingsByWindow(window)) != 0)
+ window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings);
+
+ InitOrLoadWindowSettings(window, settings);
if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus)
g.Windows.push_front(window); // Quite slow but rare and only once
@@ -5712,13 +6304,37 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
return window;
}
+static inline ImVec2 CalcWindowMinSize(ImGuiWindow* window)
+{
+ // We give windows non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups)
+ // FIXME: Essentially we want to restrict manual resizing to WindowMinSize+Decoration, and allow api resizing to be smaller.
+ // Perhaps should tend further a neater test for this.
+ ImGuiContext& g = *GImGui;
+ ImVec2 size_min;
+ if ((window->Flags & ImGuiWindowFlags_ChildWindow) && !(window->Flags & ImGuiWindowFlags_Popup))
+ {
+ size_min.x = (window->ChildFlags & ImGuiChildFlags_ResizeX) ? g.Style.WindowMinSize.x : 4.0f;
+ size_min.y = (window->ChildFlags & ImGuiChildFlags_ResizeY) ? g.Style.WindowMinSize.y : 4.0f;
+ }
+ else
+ {
+ size_min.x = ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) == 0) ? g.Style.WindowMinSize.x : 4.0f;
+ size_min.y = ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) == 0) ? g.Style.WindowMinSize.y : 4.0f;
+ }
+
+ // Reduce artifacts with very small windows
+ ImGuiWindow* window_for_height = window;
+ size_min.y = ImMax(size_min.y, window_for_height->TitleBarHeight + window_for_height->MenuBarHeight + ImMax(0.0f, g.Style.WindowRounding - 1.0f));
+ return size_min;
+}
+
static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired)
{
ImGuiContext& g = *GImGui;
ImVec2 new_size = size_desired;
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSizeConstraint)
{
- // Using -1,-1 on either X/Y axis to preserve the current size.
+ // See comments in SetNextWindowSizeConstraints() for details about setting size_min an size_max.
ImRect cr = g.NextWindowData.SizeConstraintRect;
new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x;
new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y;
@@ -5732,19 +6348,13 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s
g.NextWindowData.SizeCallback(&data);
new_size = data.DesiredSize;
}
- new_size.x = IM_FLOOR(new_size.x);
- new_size.y = IM_FLOOR(new_size.y);
+ new_size.x = IM_TRUNC(new_size.x);
+ new_size.y = IM_TRUNC(new_size.y);
}
// Minimum size
- if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize)))
- {
- ImGuiWindow* window_for_height = window;
- const float decoration_up_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight();
- new_size = ImMax(new_size, g.Style.WindowMinSize);
- new_size.y = ImMax(new_size.y, decoration_up_height + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows
- }
- return new_size;
+ ImVec2 size_min = CalcWindowMinSize(window);
+ return ImMax(new_size, size_min);
}
static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal)
@@ -5761,19 +6371,20 @@ static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_cur
return;
}
- content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x);
- content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y);
- content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x);
- content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y);
+ content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_TRUNC(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x);
+ content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_TRUNC(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y);
+ content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_TRUNC(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x);
+ content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_TRUNC(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y);
}
static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents)
{
ImGuiContext& g = *GImGui;
ImGuiStyle& style = g.Style;
- const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
+ const float decoration_w_without_scrollbars = window->DecoOuterSizeX1 + window->DecoOuterSizeX2 - window->ScrollbarSizes.x;
+ const float decoration_h_without_scrollbars = window->DecoOuterSizeY1 + window->DecoOuterSizeY2 - window->ScrollbarSizes.y;
ImVec2 size_pad = window->WindowPadding * 2.0f;
- ImVec2 size_desired = size_contents + size_pad + ImVec2(0.0f, decoration_up_height);
+ ImVec2 size_desired = size_contents + size_pad + ImVec2(decoration_w_without_scrollbars, decoration_h_without_scrollbars);
if (window->Flags & ImGuiWindowFlags_Tooltip)
{
// Tooltip always resize
@@ -5782,20 +6393,23 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
else
{
// Maximum window size is determined by the viewport size or monitor size
- const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0;
- const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0;
- ImVec2 size_min = style.WindowMinSize;
- if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups)
- size_min = ImMin(size_min, ImVec2(4.0f, 4.0f));
-
- ImVec2 avail_size = ImGui::GetMainViewport()->WorkSize;
- ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f));
+ ImVec2 size_min = CalcWindowMinSize(window);
+ ImVec2 size_max = ((window->Flags & ImGuiWindowFlags_ChildWindow) && !(window->Flags & ImGuiWindowFlags_Popup)) ? ImVec2(FLT_MAX, FLT_MAX) : ImGui::GetMainViewport()->WorkSize - style.DisplaySafeAreaPadding * 2.0f;
+ ImVec2 size_auto_fit = ImClamp(size_desired, size_min, size_max);
+
+ // FIXME: CalcWindowAutoFitSize() doesn't take into account that only one axis may be auto-fit when calculating scrollbars,
+ // we may need to compute/store three variants of size_auto_fit, for x/y/xy.
+ // Here we implement a workaround for child windows only, but a full solution would apply to normal windows as well:
+ if ((window->ChildFlags & ImGuiChildFlags_ResizeX) && !(window->ChildFlags & ImGuiChildFlags_ResizeY))
+ size_auto_fit.y = window->SizeFull.y;
+ else if (!(window->ChildFlags & ImGuiChildFlags_ResizeX) && (window->ChildFlags & ImGuiChildFlags_ResizeY))
+ size_auto_fit.x = window->SizeFull.x;
// When the window cannot fit all contents (either because of constraints, either because screen is too small),
// we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit);
- bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - 0.0f < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
- bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_up_height < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
+ bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
+ bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_h_without_scrollbars < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
if (will_have_scrollbar_x)
size_auto_fit.y += style.ScrollbarSize;
if (will_have_scrollbar_y)
@@ -5837,7 +6451,7 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co
*out_size = size_constrained;
}
-// Data for resizing from corner
+// Data for resizing from resize grip / corner
struct ImGuiResizeGripDef
{
ImVec2 CornerPosN;
@@ -5855,9 +6469,9 @@ static const ImGuiResizeGripDef resize_grip_def[4] =
// Data for resizing from borders
struct ImGuiResizeBorderDef
{
- ImVec2 InnerDir;
- ImVec2 SegmentN1, SegmentN2;
- float OuterAngle;
+ ImVec2 InnerDir; // Normal toward inside
+ ImVec2 SegmentN1, SegmentN2; // End positions, normalized (0,0: upper left)
+ float OuterAngle; // Angle toward outside
};
static const ImGuiResizeBorderDef resize_border_def[4] =
{
@@ -5903,7 +6517,7 @@ ImGuiID ImGui::GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir)
// Handle resize for: Resize Grips, Borders, Gamepad
// Return true when using auto-fit (double-click on resize grip)
-static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect)
+static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect)
{
ImGuiContext& g = *GImGui;
ImGuiWindowFlags flags = window->Flags;
@@ -5913,11 +6527,15 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s
if (window->WasActive == false) // Early out to avoid running this code for e.g. a hidden implicit/fallback Debug window.
return false;
- bool ret_auto_fit = false;
- const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0;
- const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
- const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f);
- const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f;
+ int ret_auto_fit_mask = 0x00;
+ const float grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
+ const float grip_hover_inner_size = (resize_grip_count > 0) ? IM_TRUNC(grip_draw_size * 0.75f) : 0.0f;
+ const float grip_hover_outer_size = g.WindowsBorderHoverPadding;
+
+ ImRect clamp_rect = visibility_rect;
+ const bool window_move_from_title_bar = g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar);
+ if (window_move_from_title_bar)
+ clamp_rect.Min.y -= window->TitleBarHeight;
ImVec2 pos_target(FLT_MAX, FLT_MAX);
ImVec2 size_target(FLT_MAX, FLT_MAX);
@@ -5942,21 +6560,21 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s
ButtonBehavior(resize_rect, resize_grip_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus);
//GetForegroundDrawList(window)->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255));
if (hovered || held)
- g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE;
+ SetMouseCursor((resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE);
- if (held && g.IO.MouseClickedCount[0] == 2 && resize_grip_n == 0)
+ if (held && g.IO.MouseDoubleClicked[0])
{
- // Manual auto-fit when double-clicking
+ // Auto-fit when double-clicking
size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit);
- ret_auto_fit = true;
+ ret_auto_fit_mask = 0x03; // Both axes
ClearActiveID();
}
else if (held)
{
// Resize from any of the four corners
// We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position
- ImVec2 clamp_min = ImVec2(def.CornerPosN.x == 1.0f ? visibility_rect.Min.x : -FLT_MAX, def.CornerPosN.y == 1.0f ? visibility_rect.Min.y : -FLT_MAX);
- ImVec2 clamp_max = ImVec2(def.CornerPosN.x == 0.0f ? visibility_rect.Max.x : +FLT_MAX, def.CornerPosN.y == 0.0f ? visibility_rect.Max.y : +FLT_MAX);
+ ImVec2 clamp_min = ImVec2(def.CornerPosN.x == 1.0f ? clamp_rect.Min.x : -FLT_MAX, (def.CornerPosN.y == 1.0f || (def.CornerPosN.y == 0.0f && window_move_from_title_bar)) ? clamp_rect.Min.y : -FLT_MAX);
+ ImVec2 clamp_max = ImVec2(def.CornerPosN.x == 0.0f ? clamp_rect.Max.x : +FLT_MAX, def.CornerPosN.y == 0.0f ? clamp_rect.Max.y : +FLT_MAX);
ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(def.InnerDir * grip_hover_outer_size, def.InnerDir * -grip_hover_inner_size, def.CornerPosN); // Corner of the window corresponding to our corner grip
corner_target = ImClamp(corner_target, clamp_min, clamp_max);
CalcResizePosSizeFromAnyCorner(window, corner_target, def.CornerPosN, &pos_target, &size_target);
@@ -5966,32 +6584,96 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s
if (resize_grip_n == 0 || held || hovered)
resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
}
- for (int border_n = 0; border_n < resize_border_count; border_n++)
+
+ int resize_border_mask = 0x00;
+ if (window->Flags & ImGuiWindowFlags_ChildWindow)
+ resize_border_mask |= ((window->ChildFlags & ImGuiChildFlags_ResizeX) ? 0x02 : 0) | ((window->ChildFlags & ImGuiChildFlags_ResizeY) ? 0x08 : 0);
+ else
+ resize_border_mask = g.IO.ConfigWindowsResizeFromEdges ? 0x0F : 0x00;
+ for (int border_n = 0; border_n < 4; border_n++)
{
+ if ((resize_border_mask & (1 << border_n)) == 0)
+ continue;
const ImGuiResizeBorderDef& def = resize_border_def[border_n];
const ImGuiAxis axis = (border_n == ImGuiDir_Left || border_n == ImGuiDir_Right) ? ImGuiAxis_X : ImGuiAxis_Y;
bool hovered, held;
- ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, WINDOWS_HOVER_PADDING);
+ ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, g.WindowsBorderHoverPadding);
ImGuiID border_id = window->GetID(border_n + 4); // == GetWindowResizeBorderID()
ItemAdd(border_rect, border_id, NULL, ImGuiItemFlags_NoNav);
ButtonBehavior(border_rect, border_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus);
- //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255));
- if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held)
+ //GetForegroundDrawList(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255));
+ if (hovered && g.HoveredIdTimer <= WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER)
+ hovered = false;
+ if (hovered || held)
+ SetMouseCursor((axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS);
+ if (held && g.IO.MouseDoubleClicked[0])
{
- g.MouseCursor = (axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS;
- if (held)
- *border_held = border_n;
+ // Double-clicking bottom or right border auto-fit on this axis
+ // FIXME: CalcWindowAutoFitSize() doesn't take into account that only one side may be auto-fit when calculating scrollbars.
+ // FIXME: Support top and right borders: rework CalcResizePosSizeFromAnyCorner() to be reusable in both cases.
+ if (border_n == 1 || border_n == 3) // Right and bottom border
+ {
+ size_target[axis] = CalcWindowSizeAfterConstraint(window, size_auto_fit)[axis];
+ ret_auto_fit_mask |= (1 << axis);
+ hovered = held = false; // So border doesn't show highlighted at new position
+ }
+ ClearActiveID();
}
- if (held)
+ else if (held)
{
- ImVec2 clamp_min(border_n == ImGuiDir_Right ? visibility_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down ? visibility_rect.Min.y : -FLT_MAX);
- ImVec2 clamp_max(border_n == ImGuiDir_Left ? visibility_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? visibility_rect.Max.y : +FLT_MAX);
+ // Switch to relative resizing mode when border geometry moved (e.g. resizing a child altering parent scroll), in order to avoid resizing feedback loop.
+ // Currently only using relative mode on resizable child windows, as the problem to solve is more likely noticeable for them, but could apply for all windows eventually.
+ // FIXME: May want to generalize this idiom at lower-level, so more widgets can use it!
+ const bool just_scrolled_manually_while_resizing = (g.WheelingWindow != NULL && g.WheelingWindowScrolledFrame == g.FrameCount && IsWindowChildOf(window, g.WheelingWindow, false));
+ if (g.ActiveIdIsJustActivated || just_scrolled_manually_while_resizing)
+ {
+ g.WindowResizeBorderExpectedRect = border_rect;
+ g.WindowResizeRelativeMode = false;
+ }
+ if ((window->Flags & ImGuiWindowFlags_ChildWindow) && memcmp(&g.WindowResizeBorderExpectedRect, &border_rect, sizeof(ImRect)) != 0)
+ g.WindowResizeRelativeMode = true;
+
+ const ImVec2 border_curr = (window->Pos + ImMin(def.SegmentN1, def.SegmentN2) * window->Size);
+ const float border_target_rel_mode_for_axis = border_curr[axis] + g.IO.MouseDelta[axis];
+ const float border_target_abs_mode_for_axis = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + g.WindowsBorderHoverPadding; // Match ButtonBehavior() padding above.
+
+ // Use absolute mode position
ImVec2 border_target = window->Pos;
- border_target[axis] = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING;
+ border_target[axis] = border_target_abs_mode_for_axis;
+
+ // Use relative mode target for child window, ignore resize when moving back toward the ideal absolute position.
+ bool ignore_resize = false;
+ if (g.WindowResizeRelativeMode)
+ {
+ //GetForegroundDrawList()->AddText(GetMainViewport()->WorkPos, IM_COL32_WHITE, "Relative Mode");
+ border_target[axis] = border_target_rel_mode_for_axis;
+ if (g.IO.MouseDelta[axis] == 0.0f || (g.IO.MouseDelta[axis] > 0.0f) == (border_target_rel_mode_for_axis > border_target_abs_mode_for_axis))
+ ignore_resize = true;
+ }
+
+ // Clamp, apply
+ ImVec2 clamp_min(border_n == ImGuiDir_Right ? clamp_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down || (border_n == ImGuiDir_Up && window_move_from_title_bar) ? clamp_rect.Min.y : -FLT_MAX);
+ ImVec2 clamp_max(border_n == ImGuiDir_Left ? clamp_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? clamp_rect.Max.y : +FLT_MAX);
border_target = ImClamp(border_target, clamp_min, clamp_max);
- CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target);
+ if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent
+ {
+ ImGuiWindow* parent_window = window->ParentWindow;
+ ImGuiWindowFlags parent_flags = parent_window->Flags;
+ ImRect border_limit_rect = parent_window->InnerRect;
+ border_limit_rect.Expand(ImVec2(-ImMax(parent_window->WindowPadding.x, parent_window->WindowBorderSize), -ImMax(parent_window->WindowPadding.y, parent_window->WindowBorderSize)));
+ if ((axis == ImGuiAxis_X) && ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar)))
+ border_target.x = ImClamp(border_target.x, border_limit_rect.Min.x, border_limit_rect.Max.x);
+ if ((axis == ImGuiAxis_Y) && (parent_flags & ImGuiWindowFlags_NoScrollbar))
+ border_target.y = ImClamp(border_target.y, border_limit_rect.Min.y, border_limit_rect.Max.y);
+ }
+ if (!ignore_resize)
+ CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target);
}
+ if (hovered)
+ *border_hovered = border_n;
+ if (held)
+ *border_held = border_n;
}
PopID();
@@ -6005,19 +6687,19 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s
{
ImVec2 nav_resize_dir;
if (g.NavInputSource == ImGuiInputSource_Keyboard && g.IO.KeyShift)
- nav_resize_dir = GetKeyVector2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow);
+ nav_resize_dir = GetKeyMagnitude2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow);
if (g.NavInputSource == ImGuiInputSource_Gamepad)
- nav_resize_dir = GetKeyVector2d(ImGuiKey_GamepadDpadLeft, ImGuiKey_GamepadDpadRight, ImGuiKey_GamepadDpadUp, ImGuiKey_GamepadDpadDown);
+ nav_resize_dir = GetKeyMagnitude2d(ImGuiKey_GamepadDpadLeft, ImGuiKey_GamepadDpadRight, ImGuiKey_GamepadDpadUp, ImGuiKey_GamepadDpadDown);
if (nav_resize_dir.x != 0.0f || nav_resize_dir.y != 0.0f)
{
const float NAV_RESIZE_SPEED = 600.0f;
const float resize_step = NAV_RESIZE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y);
g.NavWindowingAccumDeltaSize += nav_resize_dir * resize_step;
- g.NavWindowingAccumDeltaSize = ImMax(g.NavWindowingAccumDeltaSize, visibility_rect.Min - window->Pos - window->Size); // We need Pos+Size >= visibility_rect.Min, so Size >= visibility_rect.Min - Pos, so size_delta >= visibility_rect.Min - window->Pos - window->Size
+ g.NavWindowingAccumDeltaSize = ImMax(g.NavWindowingAccumDeltaSize, clamp_rect.Min - window->Pos - window->Size); // We need Pos+Size >= clmap_rect.Min, so Size >= clmap_rect.Min - Pos, so size_delta >= clmap_rect.Min - window->Pos - window->Size
g.NavWindowingToggleLayer = false;
- g.NavDisableMouseHover = true;
+ g.NavHighlightItemUnderNav = true;
resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive);
- ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaSize);
+ ImVec2 accum_floored = ImTrunc(g.NavWindowingAccumDeltaSize);
if (accum_floored.x != 0.0f || accum_floored.y != 0.0f)
{
// FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck.
@@ -6028,19 +6710,24 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s
}
// Apply back modified position/size to window
- if (size_target.x != FLT_MAX)
- {
- window->SizeFull = size_target;
+ const ImVec2 curr_pos = window->Pos;
+ const ImVec2 curr_size = window->SizeFull;
+ if (size_target.x != FLT_MAX && (window->Size.x != size_target.x || window->SizeFull.x != size_target.x))
+ window->Size.x = window->SizeFull.x = size_target.x;
+ if (size_target.y != FLT_MAX && (window->Size.y != size_target.y || window->SizeFull.y != size_target.y))
+ window->Size.y = window->SizeFull.y = size_target.y;
+ if (pos_target.x != FLT_MAX && window->Pos.x != ImTrunc(pos_target.x))
+ window->Pos.x = ImTrunc(pos_target.x);
+ if (pos_target.y != FLT_MAX && window->Pos.y != ImTrunc(pos_target.y))
+ window->Pos.y = ImTrunc(pos_target.y);
+ if (curr_pos.x != window->Pos.x || curr_pos.y != window->Pos.y || curr_size.x != window->SizeFull.x || curr_size.y != window->SizeFull.y)
MarkIniSettingsDirty(window);
- }
- if (pos_target.x != FLT_MAX)
- {
- window->Pos = ImFloor(pos_target);
- MarkIniSettingsDirty(window);
- }
- window->Size = window->SizeFull;
- return ret_auto_fit;
+ // Recalculate next expected border expected coordinates
+ if (*border_held != -1)
+ g.WindowResizeBorderExpectedRect = GetResizeBorderRect(window, *border_held, grip_hover_inner_size, g.WindowsBorderHoverPadding);
+
+ return ret_auto_fit_mask;
}
static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_rect)
@@ -6048,45 +6735,59 @@ static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_
ImGuiContext& g = *GImGui;
ImVec2 size_for_clamping = window->Size;
if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar))
- size_for_clamping.y = window->TitleBarHeight();
+ size_for_clamping.y = window->TitleBarHeight;
window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max);
}
+static void RenderWindowOuterSingleBorder(ImGuiWindow* window, int border_n, ImU32 border_col, float border_size)
+{
+ const ImGuiResizeBorderDef& def = resize_border_def[border_n];
+ const float rounding = window->WindowRounding;
+ const ImRect border_r = GetResizeBorderRect(window, border_n, rounding, 0.0f);
+ window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle);
+ window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f);
+ window->DrawList->PathStroke(border_col, ImDrawFlags_None, border_size);
+}
+
static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
- float rounding = window->WindowRounding;
- float border_size = window->WindowBorderSize;
- if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground))
- window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size);
-
- int border_held = window->ResizeBorderHeld;
- if (border_held != -1)
+ const float border_size = window->WindowBorderSize;
+ const ImU32 border_col = GetColorU32(ImGuiCol_Border);
+ if (border_size > 0.0f && (window->Flags & ImGuiWindowFlags_NoBackground) == 0)
+ window->DrawList->AddRect(window->Pos, window->Pos + window->Size, border_col, window->WindowRounding, 0, window->WindowBorderSize);
+ else if (border_size > 0.0f)
+ {
+ if (window->ChildFlags & ImGuiChildFlags_ResizeX) // Similar code as 'resize_border_mask' computation in UpdateWindowManualResize() but we specifically only always draw explicit child resize border.
+ RenderWindowOuterSingleBorder(window, 1, border_col, border_size);
+ if (window->ChildFlags & ImGuiChildFlags_ResizeY)
+ RenderWindowOuterSingleBorder(window, 3, border_col, border_size);
+ }
+ if (window->ResizeBorderHovered != -1 || window->ResizeBorderHeld != -1)
{
- const ImGuiResizeBorderDef& def = resize_border_def[border_held];
- ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f);
- window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle);
- window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f);
- window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual
+ const int border_n = (window->ResizeBorderHeld != -1) ? window->ResizeBorderHeld : window->ResizeBorderHovered;
+ const ImU32 border_col_resizing = GetColorU32((window->ResizeBorderHeld != -1) ? ImGuiCol_SeparatorActive : ImGuiCol_SeparatorHovered);
+ RenderWindowOuterSingleBorder(window, border_n, border_col_resizing, ImMax(2.0f, window->WindowBorderSize)); // Thicker than usual
}
if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar))
{
- float y = window->Pos.y + window->TitleBarHeight() - 1;
- window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize);
+ float y = window->Pos.y + window->TitleBarHeight - 1;
+ window->DrawList->AddLine(ImVec2(window->Pos.x + border_size * 0.5f, y), ImVec2(window->Pos.x + window->Size.x - border_size * 0.5f, y), border_col, g.Style.FrameBorderSize);
}
}
// Draw background and borders
// Draw and handle scrollbars
-void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size)
+void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size)
{
ImGuiContext& g = *GImGui;
ImGuiStyle& style = g.Style;
ImGuiWindowFlags flags = window->Flags;
- // Ensure that ScrollBar doesn't read last frame's SkipItems
+ // Ensure that Scrollbar() doesn't read last frame's SkipItems
IM_ASSERT(window->BeginCount == 0);
window->SkipItems = false;
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Menu;
// Draw window + handle manual resize
// As we highlight the title bar when want_focus is set, multiple reappearing windows will have their title bar highlighted on their reappearing frame.
@@ -6095,9 +6796,9 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
if (window->Collapsed)
{
// Title bar only
- float backup_border_size = style.FrameBorderSize;
+ const float backup_border_size = style.FrameBorderSize;
g.Style.FrameBorderSize = window->WindowBorderSize;
- ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
+ ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && g.NavCursorVisible) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding);
g.Style.FrameBorderSize = backup_border_size;
}
@@ -6109,14 +6810,14 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
ImU32 bg_col = GetColorU32(GetWindowBgColorIdx(window));
bool override_alpha = false;
float alpha = 1.0f;
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasBgAlpha)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasBgAlpha)
{
alpha = g.NextWindowData.BgAlphaVal;
override_alpha = true;
}
if (override_alpha)
bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT);
- window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom);
+ window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom);
}
// Title bar
@@ -6131,9 +6832,9 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
{
ImRect menu_bar_rect = window->MenuBarRect();
menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them.
- window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawFlags_RoundCornersTop);
+ window->DrawList->AddRectFilled(menu_bar_rect.Min, menu_bar_rect.Max, GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawFlags_RoundCornersTop);
if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y)
- window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
+ window->DrawList->AddLine(menu_bar_rect.GetBL() + ImVec2(window_border_size * 0.5f, 0.0f), menu_bar_rect.GetBR() - ImVec2(window_border_size * 0.5f, 0.0f), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
}
// Scrollbars
@@ -6143,22 +6844,28 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
Scrollbar(ImGuiAxis_Y);
// Render resize grips (after their input handling so we don't have a frame of latency)
- if (!(flags & ImGuiWindowFlags_NoResize))
+ if (handle_borders_and_resize_grips && !(flags & ImGuiWindowFlags_NoResize))
{
for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
{
+ const ImU32 col = resize_grip_col[resize_grip_n];
+ if ((col & IM_COL32_A_MASK) == 0)
+ continue;
const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN);
- window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size)));
- window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size)));
- window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
- window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
+ const float border_inner = IM_ROUND(window_border_size * 0.5f);
+ window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(border_inner, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, border_inner)));
+ window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, border_inner) : ImVec2(border_inner, resize_grip_draw_size)));
+ window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + border_inner), corner.y + grip.InnerDir.y * (window_rounding + border_inner)), window_rounding, grip.AngleMin12, grip.AngleMax12);
+ window->DrawList->PathFillConvex(col);
}
}
// Borders
- RenderWindowOuterBorders(window);
+ if (handle_borders_and_resize_grips)
+ RenderWindowOuterBorders(window);
}
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
}
// Render title text, collapse button, close button
@@ -6186,18 +6893,18 @@ void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& titl
ImVec2 collapse_button_pos;
if (has_close_button)
{
- pad_r += button_sz;
- close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y);
+ close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - button_sz, title_bar_rect.Min.y + style.FramePadding.y);
+ pad_r += button_sz + style.ItemInnerSpacing.x;
}
if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right)
{
- pad_r += button_sz;
- collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y);
+ collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - button_sz, title_bar_rect.Min.y + style.FramePadding.y);
+ pad_r += button_sz + style.ItemInnerSpacing.x;
}
if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left)
{
- collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y);
- pad_l += button_sz;
+ collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y + style.FramePadding.y);
+ pad_l += button_sz + style.ItemInnerSpacing.x;
}
// Collapse button (submitting first so it gets priority when choosing a navigation init fallback)
@@ -6260,43 +6967,48 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
window->RootWindowPopupTree = parent_window->RootWindowPopupTree;
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
- while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
+ while (window->RootWindowForNav->ChildFlags & ImGuiChildFlags_NavFlattened)
{
IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL);
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
}
}
-// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing)
-// should be positioned behind that modal window, unless the window was created inside the modal begin-stack.
-// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent.
-// - Window // FindBlockingModal() returns Modal1
-// - Window // .. returns Modal1
-// - Modal1 // .. returns Modal2
-// - Window // .. returns Modal2
-// - Window // .. returns Modal2
-// - Modal2 // .. returns Modal2
-static ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window)
+// [EXPERIMENTAL] Called by Begin(). NextWindowData is valid at this point.
+// This is designed as a toy/test-bed for
+void ImGui::UpdateWindowSkipRefresh(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
- if (g.OpenPopupStack.Size <= 0)
- return NULL;
-
- // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal.
- for (int i = g.OpenPopupStack.Size - 1; i >= 0; i--)
+ window->SkipRefresh = false;
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasRefreshPolicy) == 0)
+ return;
+ if (g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_TryToAvoidRefresh)
{
- ImGuiWindow* popup_window = g.OpenPopupStack.Data[i].Window;
- if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal))
- continue;
- if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows.
- continue;
- if (IsWindowWithinBeginStackOf(window, popup_window)) // Window is rendered over last modal, no render order change needed.
- break;
- for (ImGuiWindow* parent = popup_window->ParentWindowInBeginStack->RootWindow; parent != NULL; parent = parent->ParentWindowInBeginStack->RootWindow)
- if (IsWindowWithinBeginStackOf(window, parent))
- return popup_window; // Place window above its begin stack parent.
+ // FIXME-IDLE: Tests for e.g. mouse clicks or keyboard while focused.
+ if (window->Appearing) // If currently appearing
+ return;
+ if (window->Hidden) // If was hidden (previous frame)
+ return;
+ if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnHover) && g.HoveredWindow)
+ if (window->RootWindow == g.HoveredWindow->RootWindow || IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, window))
+ return;
+ if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnFocus) && g.NavWindow)
+ if (window->RootWindow == g.NavWindow->RootWindow || IsWindowWithinBeginStackOf(g.NavWindow->RootWindow, window))
+ return;
+ window->DrawList = NULL;
+ window->SkipRefresh = true;
}
- return NULL;
+}
+
+static void SetWindowActiveForSkipRefresh(ImGuiWindow* window)
+{
+ window->Active = true;
+ for (ImGuiWindow* child : window->DC.ChildWindows)
+ if (!child->Hidden)
+ {
+ child->Active = child->SkipRefresh = true;
+ SetWindowActiveForSkipRefresh(child);
+ }
}
// Push a new Dear ImGui window to add widgets to.
@@ -6320,13 +7032,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
if (window_just_created)
window = CreateNewWindow(name, flags);
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInWindow == window->ID)
+ IM_DEBUG_BREAK();
+
// Automatically disable manual moving/resizing when NoInputs is set
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)
flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
- if (flags & ImGuiWindowFlags_NavFlattened)
- IM_ASSERT(flags & ImGuiWindowFlags_ChildWindow);
-
const int current_frame = g.FrameCount;
const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);
window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow);
@@ -6348,6 +7061,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
UpdateWindowInFocusOrderList(window, window_just_created, flags);
window->Flags = (ImGuiWindowFlags)flags;
+ window->ChildFlags = (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasChildFlags) ? g.NextWindowData.ChildFlags : 0;
window->LastFrameActive = current_frame;
window->LastTimeActive = (float)g.Time;
window->BeginOrderWithinParent = 0;
@@ -6368,29 +7082,37 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->IDStack.push_back(window->ID);
// Add to stack
- // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
g.CurrentWindow = window;
- ImGuiWindowStackData window_stack_data;
+ g.CurrentWindowStack.resize(g.CurrentWindowStack.Size + 1);
+ ImGuiWindowStackData& window_stack_data = g.CurrentWindowStack.back();
window_stack_data.Window = window;
window_stack_data.ParentLastItemDataBackup = g.LastItemData;
- window_stack_data.StackSizesOnBegin.SetToCurrentState();
- g.CurrentWindowStack.push_back(window_stack_data);
+ window_stack_data.DisabledOverrideReenable = (flags & ImGuiWindowFlags_Tooltip) && (g.CurrentItemFlags & ImGuiItemFlags_Disabled);
+ window_stack_data.DisabledOverrideReenableAlphaBackup = 0.0f;
+ ErrorRecoveryStoreState(&window_stack_data.StackSizesInBegin);
+ g.StackSizesInBeginForCurrentWindow = &window_stack_data.StackSizesInBegin;
if (flags & ImGuiWindowFlags_ChildMenu)
- g.BeginMenuCount++;
+ g.BeginMenuDepth++;
// Update ->RootWindow and others pointers (before any possible call to FocusWindow)
if (first_begin_of_the_frame)
{
UpdateWindowParentAndRootLinks(window, flags, parent_window);
window->ParentWindowInBeginStack = parent_window_in_stack;
+
+ // There's little point to expose a flag to set this: because the interesting cases won't be using parent_window_in_stack,
+ // e.g. linking a tool window in a standalone viewport to a document window, regardless of their Begin() stack parenting. (#6798)
+ window->ParentWindowForFocusRoute = (flags & ImGuiWindowFlags_ChildWindow) ? parent_window_in_stack : NULL;
+
+ // Inherent SetWindowFontScale() from parent until we fix this system...
+ window->FontWindowScaleParents = parent_window ? parent_window->FontWindowScaleParents * parent_window->FontWindowScale : 1.0f;
}
// Add to focus scope stack
- PushFocusScope(window->ID);
+ PushFocusScope((window->ChildFlags & ImGuiChildFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID);
window->NavRootFocusScopeId = g.CurrentFocusScopeId;
- g.CurrentWindow = NULL;
- // Add to popup stack
+ // Add to popup stacks: update OpenPopupStack[] data, push to BeginPopupStack[]
if (flags & ImGuiWindowFlags_Popup)
{
ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
@@ -6404,7 +7126,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// (FIXME: Consider splitting the HasXXX flags into X/Y components
bool window_pos_set_by_api = false;
bool window_size_x_set_by_api = false, window_size_y_set_by_api = false;
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasPos)
{
window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.NextWindowData.PosCond) != 0;
if (window_pos_set_by_api && ImLengthSqr(g.NextWindowData.PosPivotVal) > 0.00001f)
@@ -6420,13 +7142,17 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
SetWindowPos(window, g.NextWindowData.PosVal, g.NextWindowData.PosCond);
}
}
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSize)
{
window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f);
window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f);
+ if ((window->ChildFlags & ImGuiChildFlags_ResizeX) && (window->SetWindowSizeAllowFlags & ImGuiCond_FirstUseEver) == 0) // Axis-specific conditions for BeginChild()
+ g.NextWindowData.SizeVal.x = window->SizeFull.x;
+ if ((window->ChildFlags & ImGuiChildFlags_ResizeY) && (window->SetWindowSizeAllowFlags & ImGuiCond_FirstUseEver) == 0)
+ g.NextWindowData.SizeVal.y = window->SizeFull.y;
SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond);
}
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasScroll)
{
if (g.NextWindowData.ScrollVal.x >= 0.0f)
{
@@ -6439,19 +7165,29 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->ScrollTargetCenterRatio.y = 0.0f;
}
}
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasContentSize)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasContentSize)
window->ContentSizeExplicit = g.NextWindowData.ContentSizeVal;
else if (first_begin_of_the_frame)
window->ContentSizeExplicit = ImVec2(0.0f, 0.0f);
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasCollapsed)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasCollapsed)
SetWindowCollapsed(window, g.NextWindowData.CollapsedVal, g.NextWindowData.CollapsedCond);
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasFocus)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasFocus)
FocusWindow(window);
if (window->Appearing)
SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false);
+ // [EXPERIMENTAL] Skip Refresh mode
+ UpdateWindowSkipRefresh(window);
+
+ // Nested root windows (typically tooltips) override disabled state
+ if (window_stack_data.DisabledOverrideReenable && window->RootWindow == window)
+ BeginDisabledOverrideReenable();
+
+ // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
+ g.CurrentWindow = NULL;
+
// When reusing window again multiple times a frame, just append content (don't need to setup again)
- if (first_begin_of_the_frame)
+ if (first_begin_of_the_frame && !window->SkipRefresh)
{
// Initialize
const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345)
@@ -6470,7 +7206,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Update stored window name when it changes (which can _only_ happen with the "###" operator, so the ID would stay unchanged).
// The title bar always display the 'name' parameter, so we only update the string storage if it needs to be visible to the end-user elsewhere.
bool window_title_visible_elsewhere = false;
- if (g.NavWindowingListWindow != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB
+ if (g.NavWindowingListWindow != NULL && (flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB
+ window_title_visible_elsewhere = true;
+ if (flags & ImGuiWindowFlags_ChildMenu)
window_title_visible_elsewhere = true;
if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0)
{
@@ -6523,24 +7261,35 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
else
window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize;
window->WindowPadding = style.WindowPadding;
- if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f)
+ if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !(window->ChildFlags & ImGuiChildFlags_AlwaysUseWindowPadding) && window->WindowBorderSize == 0.0f)
window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f);
// Lock menu offset so size calculation can use it as menu-bar windows need a minimum size.
window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
+ window->TitleBarHeight = (flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : g.FontSize + g.Style.FramePadding.y * 2.0f;
+ window->MenuBarHeight = (flags & ImGuiWindowFlags_MenuBar) ? window->DC.MenuBarOffset.y + g.FontSize + g.Style.FramePadding.y * 2.0f : 0.0f;
+ window->FontRefSize = g.FontSize; // Lock this to discourage calling window->CalcFontSize() outside of current window.
+ // Depending on condition we use previous or current window size to compare against contents size to decide if a scrollbar should be visible.
+ // Those flags will be altered further down in the function depending on more conditions.
bool use_current_size_for_scrollbar_x = window_just_created;
bool use_current_size_for_scrollbar_y = window_just_created;
+ if (window_size_x_set_by_api && window->ContentSizeExplicit.x != 0.0f)
+ use_current_size_for_scrollbar_x = true;
+ if (window_size_y_set_by_api && window->ContentSizeExplicit.y != 0.0f) // #7252
+ use_current_size_for_scrollbar_y = true;
// Collapse window by double-clicking on title bar
// At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse))
{
- // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar.
+ // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed),
+ // so verify that we don't have items over the title bar.
ImRect title_bar_rect = window->TitleBarRect();
- if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2)
- window->WantCollapseToggle = true;
+ if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && g.ActiveId == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max))
+ if (g.IO.MouseClickedCount[0] == 2 && GetKeyOwner(ImGuiKey_MouseLeft) == ImGuiKeyOwner_NoOwner)
+ window->WantCollapseToggle = true;
if (window->WantCollapseToggle)
{
window->Collapsed = !window->Collapsed;
@@ -6557,6 +7306,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// SIZE
+ // Outer Decoration Sizes
+ // (we need to clear ScrollbarSize immediately as CalcWindowAutoFitSize() needs it and can be called from other locations).
+ const ImVec2 scrollbar_sizes_from_last_frame = window->ScrollbarSizes;
+ window->DecoOuterSizeX1 = 0.0f;
+ window->DecoOuterSizeX2 = 0.0f;
+ window->DecoOuterSizeY1 = window->TitleBarHeight + window->MenuBarHeight;
+ window->DecoOuterSizeY2 = 0.0f;
+ window->ScrollbarSizes = ImVec2(0.0f, 0.0f);
+
// Calculate auto-fit size, handle automatic resize
const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSizeIdeal);
if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed)
@@ -6595,9 +7353,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull);
window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull;
- // Decoration size
- const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
-
// POSITION
// Popup latch its initial position, will position itself when it appears next frame
@@ -6640,7 +7395,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow))
if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f)
ClampWindowPos(window, visibility_rect);
- window->Pos = ImFloor(window->Pos);
+ window->Pos = ImTrunc(window->Pos);
// Lock window rounding for the frame (so that altering them doesn't cause inconsistencies)
// Large values tend to lead to variety of artifacts and are not recommended.
@@ -6658,44 +7413,37 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
want_focus = true;
else if ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0)
want_focus = true;
-
- ImGuiWindow* modal = GetTopMostPopupModal();
- if (modal != NULL && !IsWindowWithinBeginStackOf(window, modal))
- {
- // Avoid focusing a window that is created outside of active modal. This will prevent active modal from being closed.
- // Since window is not focused it would reappear at the same display position like the last time it was visible.
- // In case of completely new windows it would go to the top (over current modal), but input to such window would still be blocked by modal.
- // Position window behind a modal that is not a begin-parent of this window.
- want_focus = false;
- if (window == window->RootWindow)
- {
- ImGuiWindow* blocking_modal = FindBlockingModal(window);
- IM_ASSERT(blocking_modal != NULL);
- BringWindowToDisplayBehind(window, blocking_modal);
- }
- }
}
- // [Test Engine] Register whole window in the item system
+ // [Test Engine] Register whole window in the item system (before submitting further decorations)
#ifdef IMGUI_ENABLE_TEST_ENGINE
if (g.TestEngineHookItems)
{
IM_ASSERT(window->IDStack.Size == 1);
window->IDStack.Size = 0; // As window->IDStack[0] == window->ID here, make sure TestEngine doesn't erroneously see window as parent of itself.
- IMGUI_TEST_ENGINE_ITEM_ADD(window->Rect(), window->ID);
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Menu;
+ IMGUI_TEST_ENGINE_ITEM_ADD(window->ID, window->Rect(), NULL);
IMGUI_TEST_ENGINE_ITEM_INFO(window->ID, window->Name, (g.HoveredWindow == window) ? ImGuiItemStatusFlags_HoveredRect : 0);
window->IDStack.Size = 1;
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
+
}
#endif
// Handle manual resize: Resize Grips, Borders, Gamepad
- int border_held = -1;
+ int border_hovered = -1, border_held = -1;
ImU32 resize_grip_col[4] = {};
- const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it.
- const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
+ const int resize_grip_count = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) ? 0 : g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it.
+ const float resize_grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
if (!window->Collapsed)
- if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect))
- use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true;
+ if (int auto_fit_mask = UpdateWindowManualResize(window, size_auto_fit, &border_hovered, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect))
+ {
+ if (auto_fit_mask & (1 << ImGuiAxis_X))
+ use_current_size_for_scrollbar_x = true;
+ if (auto_fit_mask & (1 << ImGuiAxis_Y))
+ use_current_size_for_scrollbar_y = true;
+ }
+ window->ResizeBorderHovered = (signed char)border_hovered;
window->ResizeBorderHeld = (signed char)border_held;
// SCROLLBAR VISIBILITY
@@ -6704,18 +7452,37 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
if (!window->Collapsed)
{
// When reading the current size we need to read it after size constraints have been applied.
- // When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again.
- ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - decoration_up_height);
- ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + window->ScrollbarSizes;
+ // Intentionally use previous frame values for InnerRect and ScrollbarSizes.
+ // And when we use window->DecorationUp here it doesn't have ScrollbarSizes.y applied yet.
+ ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2));
+ ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + scrollbar_sizes_from_last_frame;
ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f;
float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x;
float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y;
+ bool scrollbar_x_prev = window->ScrollbarX;
//bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons?
window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar));
window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
+
+ // Track when ScrollbarX visibility keeps toggling, which is a sign of a feedback loop, and stabilize by enforcing visibility (#3285, #8488)
+ // (Feedback loops of this sort can manifest in various situations, but combining horizontal + vertical scrollbar + using a clipper with varying width items is one frequent cause.
+ // The better solution is to, either (1) enforce visibility by using ImGuiWindowFlags_AlwaysHorizontalScrollbar or (2) declare stable contents width with SetNextWindowContentSize(), if you can compute it)
+ window->ScrollbarXStabilizeToggledHistory <<= 1;
+ window->ScrollbarXStabilizeToggledHistory |= (scrollbar_x_prev != window->ScrollbarX) ? 0x01 : 0x00;
+ const bool scrollbar_x_stabilize = (window->ScrollbarXStabilizeToggledHistory != 0) && ImCountSetBits(window->ScrollbarXStabilizeToggledHistory) >= 4; // 4 == half of bits in our U8 history.
+ if (scrollbar_x_stabilize)
+ window->ScrollbarX = true;
+ //if (scrollbar_x_stabilize && !window->ScrollbarXStabilizeEnabled)
+ // IMGUI_DEBUG_LOG("[scroll] Stabilize ScrollbarX for Window '%s'\n", window->Name);
+ window->ScrollbarXStabilizeEnabled = scrollbar_x_stabilize;
+
if (window->ScrollbarX && !window->ScrollbarY)
- window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar);
+ window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);
window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
+
+ // Amend the partially filled window->DecorationXXX values.
+ window->DecoOuterSizeX2 += window->ScrollbarSizes.x;
+ window->DecoOuterSizeY2 += window->ScrollbarSizes.y;
}
// UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING)
@@ -6739,30 +7506,36 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// - ScrollToRectEx()
// - NavUpdatePageUpPageDown()
// - Scrollbar()
- window->InnerRect.Min.x = window->Pos.x;
- window->InnerRect.Min.y = window->Pos.y + decoration_up_height;
- window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x;
- window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y;
+ window->InnerRect.Min.x = window->Pos.x + window->DecoOuterSizeX1;
+ window->InnerRect.Min.y = window->Pos.y + window->DecoOuterSizeY1;
+ window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->DecoOuterSizeX2;
+ window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->DecoOuterSizeY2;
// Inner clipping rectangle.
- // Will extend a little bit outside the normal work region.
- // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space.
- // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
+ // - Extend a outside of normal work region up to borders.
+ // - This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space.
+ // - It also makes clipped items be more noticeable.
+ // - And is consistent on both axis (prior to 2024/05/03 ClipRect used WindowPadding.x * 0.5f on left and right edge), see #3312
+ // - Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
// Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior.
// Affected by window/frame border size. Used by:
// - Begin() initial clip rect
float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize);
- window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize));
- window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size);
- window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize));
- window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize);
+
+ // Try to match the fact that our border is drawn centered over the window rectangle, rather than inner.
+ // This is why we do a *0.5f here. We don't currently even technically support large values for WindowBorderSize,
+ // see e.g #7887 #7888, but may do after we move the window border to become an inner border (and then we can remove the 0.5f here).
+ window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + window->WindowBorderSize * 0.5f);
+ window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size * 0.5f);
+ window->InnerClipRect.Max.x = ImFloor(window->InnerRect.Max.x - window->WindowBorderSize * 0.5f);
+ window->InnerClipRect.Max.y = ImFloor(window->InnerRect.Max.y - window->WindowBorderSize * 0.5f);
window->InnerClipRect.ClipWithFull(host_rect);
// Default item width. Make it proportional to window size if window manually resizes
if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize))
- window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f);
+ window->ItemWidthDefault = ImTrunc(window->Size.x * 0.65f);
else
- window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f);
+ window->ItemWidthDefault = ImTrunc(g.FontSize * 16.0f);
// SCROLLING
@@ -6775,6 +7548,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Apply scrolling
window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window);
window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);
+ window->DecoInnerSizeX1 = window->DecoInnerSizeY1 = 0.0f;
// DRAWING
@@ -6794,8 +7568,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// - We disable this when the parent window has zero vertices, which is a common pattern leading to laying out multiple overlapping childs
ImGuiWindow* previous_child = parent_window->DC.ChildWindows.Size >= 2 ? parent_window->DC.ChildWindows[parent_window->DC.ChildWindows.Size - 2] : NULL;
bool previous_child_overlapping = previous_child ? previous_child->Rect().Overlaps(window->Rect()) : false;
- bool parent_is_empty = parent_window->DrawList->VtxBuffer.Size > 0;
- if (window->DrawList->CmdBuffer.back().ElemCount == 0 && parent_is_empty && !previous_child_overlapping)
+ bool parent_is_empty = (parent_window->DrawList->VtxBuffer.Size == 0);
+ if (window->DrawList->CmdBuffer.back().ElemCount == 0 && !parent_is_empty && !previous_child_overlapping)
render_decorations_in_parent = true;
}
if (render_decorations_in_parent)
@@ -6804,7 +7578,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Handle title bar, scrollbar, resize grips and resize borders
const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow;
const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight);
- RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, resize_grip_count, resize_grip_col, resize_grip_draw_size);
+ const bool handle_borders_and_resize_grips = true; // This exists to facilitate merge with 'docking' branch.
+ RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, handle_borders_and_resize_grips, resize_grip_count, resize_grip_col, resize_grip_draw_size);
if (render_decorations_in_parent)
window->DrawList = &window->DrawListInst;
@@ -6819,33 +7594,34 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// - BeginTabBar() for right-most edge
const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar);
const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar);
- const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x));
- const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y));
- window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize));
- window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize));
+ const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2)));
+ const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2)));
+ window->WorkRect.Min.x = ImTrunc(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize));
+ window->WorkRect.Min.y = ImTrunc(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize));
window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x;
window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y;
window->ParentWorkRect = window->WorkRect;
// [LEGACY] Content Region
// FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
+ // Unless explicit content size is specified by user, this currently represent the region leading to no scrolling.
// Used by:
// - Mouse wheel scrolling + many other things
- window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
- window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + decoration_up_height;
- window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x));
- window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y));
+ window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x + window->DecoOuterSizeX1;
+ window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->DecoOuterSizeY1;
+ window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2)));
+ window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2)));
// Setup drawing context
// (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.)
- window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x;
+ window->DC.Indent.x = window->DecoOuterSizeX1 + window->WindowPadding.x - window->Scroll.x;
window->DC.GroupOffset.x = 0.0f;
window->DC.ColumnsOffset.x = 0.0f;
// Record the loss of precision of CursorStartPos which can happen due to really large scrolling amount.
// This is used by clipper to compensate and fix the most common use case of large scroll area. Easy and cheap, next best thing compared to switching everything to double or ImU64.
- double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DC.ColumnsOffset.x;
- double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + decoration_up_height;
+ double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DecoOuterSizeX1 + window->DC.ColumnsOffset.x;
+ double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + window->DecoOuterSizeY1;
window->DC.CursorStartPos = ImVec2((float)start_pos_highp_x, (float)start_pos_highp_y);
window->DC.CursorStartPosLossyness = ImVec2((float)(start_pos_highp_x - window->DC.CursorStartPos.x), (float)(start_pos_highp_y - window->DC.CursorStartPos.y));
window->DC.CursorPos = window->DC.CursorStartPos;
@@ -6859,13 +7635,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
window->DC.NavLayersActiveMask = window->DC.NavLayersActiveMaskNext;
window->DC.NavLayersActiveMaskNext = 0x00;
+ window->DC.NavIsScrollPushableX = true;
window->DC.NavHideHighlightOneFrame = false;
- window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f);
+ window->DC.NavWindowHasScrollY = (window->ScrollMax.y > 0.0f);
window->DC.MenuBarAppending = false;
window->DC.MenuColumns.Update(style.ItemSpacing.x, window_just_activated_by_user);
window->DC.TreeDepth = 0;
- window->DC.TreeJumpToParentOnPopMask = 0x00;
+ window->DC.TreeHasStackDataDepthMask = 0x00;
window->DC.ChildWindows.resize(0);
window->DC.StateStorage = &window->StateStorage;
window->DC.CurrentColumns = NULL;
@@ -6876,6 +7653,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->DC.TextWrapPos = -1.0f; // disabled
window->DC.ItemWidthStack.resize(0);
window->DC.TextWrapPosStack.resize(0);
+ if (flags & ImGuiWindowFlags_Modal)
+ window->DC.ModalDimBgColor = ColorConvertFloat4ToU32(GetStyleColorVec4(ImGuiCol_ModalWindowDimBg));
if (window->AutoFitFramesX > 0)
window->AutoFitFramesX--;
@@ -6883,11 +7662,20 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->AutoFitFramesY--;
// Apply focus (we need to call FocusWindow() AFTER setting DC.CursorStartPos so our initial navigation reference rectangle can start around there)
+ // We ImGuiFocusRequestFlags_UnlessBelowModal to:
+ // - Avoid focusing a window that is created outside of a modal. This will prevent active modal from being closed.
+ // - Position window behind the modal that is not a begin-parent of this window.
if (want_focus)
- {
- FocusWindow(window);
+ FocusWindow(window, ImGuiFocusRequestFlags_UnlessBelowModal);
+ if (want_focus && window == g.NavWindow)
NavInitWindow(window, false); // <-- this is in the way for us to be able to defer and sort reappearing FocusWindow() calls
- }
+
+ // Pressing CTRL+C copy window content into the clipboard
+ // [EXPERIMENTAL] Breaks on nested Begin/End pairs. We need to work that out and add better logging scope.
+ // [EXPERIMENTAL] Text outputs has many issues.
+ if (g.IO.ConfigWindowsCopyContentsWithCtrlC)
+ if (g.NavWindow && g.NavWindow->RootWindow == window && g.ActiveId == 0 && Shortcut(ImGuiMod_Ctrl | ImGuiKey_C))
+ LogToClipboard(0);
// Title bar
if (!(flags & ImGuiWindowFlags_NoTitleBar))
@@ -6896,19 +7684,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Clear hit test shape every frame
window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0;
- // Pressing CTRL+C while holding on a window copy its content to the clipboard
- // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope.
- // Maybe we can support CTRL+C on every element?
- /*
- //if (g.NavWindow == window && g.ActiveId == 0)
- if (g.ActiveId == window->MoveId)
- if (g.IO.KeyCtrl && IsKeyPressed(ImGuiKey_C))
- LogToClipboard();
- */
+ if (flags & ImGuiWindowFlags_Tooltip)
+ g.TooltipPreviousWindow = window;
// We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin().
// This is useful to allow creating context menus on title bar only, etc.
- SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect);
+ window->DC.WindowItemStatusFlags = ImGuiItemStatusFlags_None;
+ window->DC.WindowItemStatusFlags |= IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0;
+ SetLastItemDataForWindow(window, title_bar_rect);
// [DEBUG]
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
@@ -6916,19 +7699,29 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
DebugLocateItemResolveWithLastItem();
#endif
- // [Test Engine] Register title bar / tab
+ // [Test Engine] Register title bar / tab with MoveId.
#ifdef IMGUI_ENABLE_TEST_ENGINE
if (!(window->Flags & ImGuiWindowFlags_NoTitleBar))
- IMGUI_TEST_ENGINE_ITEM_ADD(g.LastItemData.Rect, g.LastItemData.ID);
+ {
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Menu;
+ IMGUI_TEST_ENGINE_ITEM_ADD(g.LastItemData.ID, g.LastItemData.Rect, &g.LastItemData);
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
+ }
#endif
}
else
{
+ // Skip refresh always mark active
+ if (window->SkipRefresh)
+ SetWindowActiveForSkipRefresh(window);
+
// Append
SetCurrentWindow(window);
+ SetLastItemDataForWindow(window, window->TitleBarRect());
}
- PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true);
+ if (!window->SkipRefresh)
+ PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true);
// Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused)
window->WriteAccessed = false;
@@ -6936,25 +7729,27 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
g.NextWindowData.ClearFlags();
// Update visibility
- if (first_begin_of_the_frame)
+ if (first_begin_of_the_frame && !window->SkipRefresh)
{
- if (flags & ImGuiWindowFlags_ChildWindow)
+ if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ChildMenu))
{
// Child window can be out of sight and have "negative" clip windows.
// Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar).
IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0);
- if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow??
- {
- const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav);
- if (!g.LogEnabled && !nav_request)
- if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y)
+ const bool nav_request = (window->ChildFlags & ImGuiChildFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav);
+ if (!g.LogEnabled && !nav_request)
+ if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y)
+ {
+ if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0)
+ window->HiddenFramesCannotSkipItems = 1;
+ else
window->HiddenFramesCanSkipItems = 1;
- }
+ }
// Hide along with parent or if parent is collapsed
if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0))
window->HiddenFramesCanSkipItems = 1;
- if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCannotSkipItems > 0))
+ if (parent_window && parent_window->HiddenFramesCannotSkipItems > 0)
window->HiddenFramesCannotSkipItems = 1;
}
@@ -6980,6 +7775,23 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
skip_items = true;
window->SkipItems = skip_items;
}
+ else if (first_begin_of_the_frame)
+ {
+ // Skip refresh mode
+ window->SkipItems = true;
+ }
+
+ // [DEBUG] io.ConfigDebugBeginReturnValue override return value to test Begin/End and BeginChild/EndChild behaviors.
+ // (The implicit fallback window is NOT automatically ended allowing it to always be able to receive commands without crashing)
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ if (!window->IsFallbackWindow)
+ if ((g.IO.ConfigDebugBeginReturnValueOnce && window_just_created) || (g.IO.ConfigDebugBeginReturnValueLoop && g.DebugBeginReturnValueCullDepth == g.CurrentWindowStack.Size))
+ {
+ if (window->AutoFitFramesX > 0) { window->AutoFitFramesX++; }
+ if (window->AutoFitFramesY > 0) { window->AutoFitFramesY++; }
+ return false;
+ }
+#endif
return !window->SkipItems;
}
@@ -6995,184 +7807,47 @@ void ImGui::End()
IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!");
return;
}
- IM_ASSERT(g.CurrentWindowStack.Size > 0);
+ ImGuiWindowStackData& window_stack_data = g.CurrentWindowStack.back();
// Error checking: verify that user doesn't directly call End() on a child window.
if (window->Flags & ImGuiWindowFlags_ChildWindow)
- IM_ASSERT_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!");
+ IM_ASSERT_USER_ERROR(g.WithinEndChildID == window->ID, "Must call EndChild() and not End()!");
// Close anything that is open
if (window->DC.CurrentColumns)
EndColumns();
- PopClipRect(); // Inner window clip rectangle
+ if (!window->SkipRefresh)
+ PopClipRect(); // Inner window clip rectangle
PopFocusScope();
+ if (window_stack_data.DisabledOverrideReenable && window->RootWindow == window)
+ EndDisabledOverrideReenable();
+
+ if (window->SkipRefresh)
+ {
+ IM_ASSERT(window->DrawList == NULL);
+ window->DrawList = &window->DrawListInst;
+ }
// Stop logging
- if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging
+ if (g.LogWindow == window) // FIXME: add more options for scope of logging
LogFinish();
if (window->DC.IsSetPos)
ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
// Pop from window stack
- g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup;
+ g.LastItemData = window_stack_data.ParentLastItemDataBackup;
if (window->Flags & ImGuiWindowFlags_ChildMenu)
- g.BeginMenuCount--;
+ g.BeginMenuDepth--;
if (window->Flags & ImGuiWindowFlags_Popup)
g.BeginPopupStack.pop_back();
- g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithCurrentState();
- g.CurrentWindowStack.pop_back();
- SetCurrentWindow(g.CurrentWindowStack.Size == 0 ? NULL : g.CurrentWindowStack.back().Window);
-}
-
-void ImGui::BringWindowToFocusFront(ImGuiWindow* window)
-{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(window == window->RootWindow);
-
- const int cur_order = window->FocusOrder;
- IM_ASSERT(g.WindowsFocusOrder[cur_order] == window);
- if (g.WindowsFocusOrder.back() == window)
- return;
-
- const int new_order = g.WindowsFocusOrder.Size - 1;
- for (int n = cur_order; n < new_order; n++)
- {
- g.WindowsFocusOrder[n] = g.WindowsFocusOrder[n + 1];
- g.WindowsFocusOrder[n]->FocusOrder--;
- IM_ASSERT(g.WindowsFocusOrder[n]->FocusOrder == n);
- }
- g.WindowsFocusOrder[new_order] = window;
- window->FocusOrder = (short)new_order;
-}
-
-void ImGui::BringWindowToDisplayFront(ImGuiWindow* window)
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* current_front_window = g.Windows.back();
- if (current_front_window == window || current_front_window->RootWindow == window) // Cheap early out (could be better)
- return;
- for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window
- if (g.Windows[i] == window)
- {
- memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*));
- g.Windows[g.Windows.Size - 1] = window;
- break;
- }
-}
-
-void ImGui::BringWindowToDisplayBack(ImGuiWindow* window)
-{
- ImGuiContext& g = *GImGui;
- if (g.Windows[0] == window)
- return;
- for (int i = 0; i < g.Windows.Size; i++)
- if (g.Windows[i] == window)
- {
- memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*));
- g.Windows[0] = window;
- break;
- }
-}
-
-void ImGui::BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* behind_window)
-{
- IM_ASSERT(window != NULL && behind_window != NULL);
- ImGuiContext& g = *GImGui;
- window = window->RootWindow;
- behind_window = behind_window->RootWindow;
- int pos_wnd = FindWindowDisplayIndex(window);
- int pos_beh = FindWindowDisplayIndex(behind_window);
- if (pos_wnd < pos_beh)
- {
- size_t copy_bytes = (pos_beh - pos_wnd - 1) * sizeof(ImGuiWindow*);
- memmove(&g.Windows.Data[pos_wnd], &g.Windows.Data[pos_wnd + 1], copy_bytes);
- g.Windows[pos_beh - 1] = window;
- }
- else
- {
- size_t copy_bytes = (pos_wnd - pos_beh) * sizeof(ImGuiWindow*);
- memmove(&g.Windows.Data[pos_beh + 1], &g.Windows.Data[pos_beh], copy_bytes);
- g.Windows[pos_beh] = window;
- }
-}
-int ImGui::FindWindowDisplayIndex(ImGuiWindow* window)
-{
- ImGuiContext& g = *GImGui;
- return g.Windows.index_from_ptr(g.Windows.find(window));
-}
+ // Error handling, state recovery
+ if (g.IO.ConfigErrorRecovery)
+ ErrorRecoveryTryToRecoverWindowState(&window_stack_data.StackSizesInBegin);
-// Moving window to front of display and set focus (which happens to be back of our sorted list)
-void ImGui::FocusWindow(ImGuiWindow* window)
-{
- ImGuiContext& g = *GImGui;
-
- if (g.NavWindow != window)
- {
- SetNavWindow(window);
- if (window && g.NavDisableMouseHover)
- g.NavMousePosDirty = true;
- g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId
- g.NavLayer = ImGuiNavLayer_Main;
- g.NavFocusScopeId = window ? window->NavRootFocusScopeId : 0;
- g.NavIdIsAlive = false;
-
- // Close popups if any
- ClosePopupsOverWindow(window, false);
- }
-
- // Move the root window to the top of the pile
- IM_ASSERT(window == NULL || window->RootWindow != NULL);
- ImGuiWindow* focus_front_window = window ? window->RootWindow : NULL; // NB: In docking branch this is window->RootWindowDockStop
- ImGuiWindow* display_front_window = window ? window->RootWindow : NULL;
-
- // Steal active widgets. Some of the cases it triggers includes:
- // - Focus a window while an InputText in another window is active, if focus happens before the old InputText can run.
- // - When using Nav to activate menu items (due to timing of activating on press->new window appears->losing ActiveId)
- if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window)
- if (!g.ActiveIdNoClearOnFocusLoss)
- ClearActiveID();
-
- // Passing NULL allow to disable keyboard focus
- if (!window)
- return;
-
- // Bring to front
- BringWindowToFocusFront(focus_front_window);
- if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0)
- BringWindowToDisplayFront(display_front_window);
-}
-
-void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window)
-{
- ImGuiContext& g = *GImGui;
- int start_idx = g.WindowsFocusOrder.Size - 1;
- if (under_this_window != NULL)
- {
- // Aim at root window behind us, if we are in a child window that's our own root (see #4640)
- int offset = -1;
- while (under_this_window->Flags & ImGuiWindowFlags_ChildWindow)
- {
- under_this_window = under_this_window->ParentWindow;
- offset = 0;
- }
- start_idx = FindWindowFocusIndex(under_this_window) + offset;
- }
- for (int i = start_idx; i >= 0; i--)
- {
- // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user.
- ImGuiWindow* window = g.WindowsFocusOrder[i];
- IM_ASSERT(window == window->RootWindow);
- if (window != ignore_window && window->WasActive)
- if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs))
- {
- ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window);
- FocusWindow(focus_window);
- return;
- }
- }
- FocusWindow(NULL);
+ g.CurrentWindowStack.pop_back();
+ SetCurrentWindow(g.CurrentWindowStack.Size == 0 ? NULL : g.CurrentWindowStack.back().Window);
}
// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only.
@@ -7184,30 +7859,45 @@ void ImGui::SetCurrentFont(ImFont* font)
g.Font = font;
g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
+ g.FontScale = g.FontSize / g.Font->FontSize;
ImFontAtlas* atlas = g.Font->ContainerAtlas;
g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel;
g.DrawListSharedData.TexUvLines = atlas->TexUvLines;
g.DrawListSharedData.Font = g.Font;
g.DrawListSharedData.FontSize = g.FontSize;
+ g.DrawListSharedData.FontScale = g.FontScale;
}
+// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authorative against window-local ImDrawList.
+// - Whereas ImDrawList::PushTextureID()/PopTextureID() is not to be used across Begin() calls.
+// - Note that we don't propagate current texture id when e.g. Begin()-ing into a new window, we never really did...
+// - Some code paths never really fully worked with multiple atlas textures.
+// - The right-ish solution may be to remove _SetTextureID() and make AddText/RenderText lazily call PushTextureID()/PopTextureID()
+// the same way AddImage() does, but then all other primitives would also need to? I don't think we should tackle this problem
+// because we have a concrete need and a test bed for multiple atlas textures.
void ImGui::PushFont(ImFont* font)
{
ImGuiContext& g = *GImGui;
- if (!font)
+ if (font == NULL)
font = GetDefaultFont();
- SetCurrentFont(font);
g.FontStack.push_back(font);
- g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID);
+ SetCurrentFont(font);
+ g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
}
void ImGui::PopFont()
{
ImGuiContext& g = *GImGui;
- g.CurrentWindow->DrawList->PopTextureID();
+ if (g.FontStack.Size <= 0)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PopFont() too many times!");
+ return;
+ }
g.FontStack.pop_back();
- SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.back());
+ ImFont* font = g.FontStack.Size == 0 ? GetDefaultFont() : g.FontStack.back();
+ SetCurrentFont(font);
+ g.CurrentWindow->DrawList->_SetTextureID(font->ContainerAtlas->TexID);
}
void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled)
@@ -7226,7 +7916,11 @@ void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled)
void ImGui::PopItemFlag()
{
ImGuiContext& g = *GImGui;
- IM_ASSERT(g.ItemFlagsStack.Size > 1); // Too many calls to PopItemFlag() - we always leave a 0 at the bottom of the stack.
+ if (g.ItemFlagsStack.Size <= 1)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PopItemFlag() too many times!");
+ return;
+ }
g.ItemFlagsStack.pop_back();
g.CurrentItemFlags = g.ItemFlagsStack.back();
}
@@ -7235,8 +7929,9 @@ void ImGui::PopItemFlag()
// - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled)
// - Visually this is currently altering alpha, but it is expected that in a future styling system this would work differently.
// - Feedback welcome at https://github.com/ocornut/imgui/issues/211
-// - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it.
-// - Optimized shortcuts instead of PushStyleVar() + PushItemFlag()
+// - BeginDisabled(false)/EndDisabled() essentially does nothing but is provided to facilitate use of boolean expressions.
+// (as a micro-optimization: if you have tens of thousands of BeginDisabled(false)/EndDisabled() pairs, you might want to reformulate your code to avoid making those calls)
+// - Note: mixing up BeginDisabled() and PushItemFlag(ImGuiItemFlags_Disabled) is currently NOT SUPPORTED.
void ImGui::BeginDisabled(bool disabled)
{
ImGuiContext& g = *GImGui;
@@ -7248,14 +7943,18 @@ void ImGui::BeginDisabled(bool disabled)
}
if (was_disabled || disabled)
g.CurrentItemFlags |= ImGuiItemFlags_Disabled;
- g.ItemFlagsStack.push_back(g.CurrentItemFlags);
+ g.ItemFlagsStack.push_back(g.CurrentItemFlags); // FIXME-OPT: can we simply skip this and use DisabledStackSize?
g.DisabledStackSize++;
}
void ImGui::EndDisabled()
{
ImGuiContext& g = *GImGui;
- IM_ASSERT(g.DisabledStackSize > 0);
+ if (g.DisabledStackSize <= 0)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling EndDisabled() too many times!");
+ return;
+ }
g.DisabledStackSize--;
bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0;
//PopItemFlag();
@@ -7265,37 +7964,47 @@ void ImGui::EndDisabled()
g.Style.Alpha = g.DisabledAlphaBackup; //PopStyleVar();
}
-// FIXME: Look into renaming this once we have settled the new Focus/Activation/TabStop system.
-void ImGui::PushAllowKeyboardFocus(bool allow_keyboard_focus)
-{
- PushItemFlag(ImGuiItemFlags_NoTabStop, !allow_keyboard_focus);
-}
-
-void ImGui::PopAllowKeyboardFocus()
+// Could have been called BeginDisabledDisable() but it didn't want to be award nominated for most awkward function name.
+// Ideally we would use a shared e.g. BeginDisabled()->BeginDisabledEx() but earlier needs to be optimal.
+// The whole code for this is awkward, will reevaluate if we find a way to implement SetNextItemDisabled().
+void ImGui::BeginDisabledOverrideReenable()
{
- PopItemFlag();
-}
-
-void ImGui::PushButtonRepeat(bool repeat)
-{
- PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat);
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(g.CurrentItemFlags & ImGuiItemFlags_Disabled);
+ g.CurrentWindowStack.back().DisabledOverrideReenableAlphaBackup = g.Style.Alpha;
+ g.Style.Alpha = g.DisabledAlphaBackup;
+ g.CurrentItemFlags &= ~ImGuiItemFlags_Disabled;
+ g.ItemFlagsStack.push_back(g.CurrentItemFlags);
+ g.DisabledStackSize++;
}
-void ImGui::PopButtonRepeat()
+void ImGui::EndDisabledOverrideReenable()
{
- PopItemFlag();
+ ImGuiContext& g = *GImGui;
+ g.DisabledStackSize--;
+ IM_ASSERT(g.DisabledStackSize > 0);
+ g.ItemFlagsStack.pop_back();
+ g.CurrentItemFlags = g.ItemFlagsStack.back();
+ g.Style.Alpha = g.CurrentWindowStack.back().DisabledOverrideReenableAlphaBackup;
}
void ImGui::PushTextWrapPos(float wrap_pos_x)
{
- ImGuiWindow* window = GetCurrentWindow();
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
window->DC.TextWrapPosStack.push_back(window->DC.TextWrapPos);
window->DC.TextWrapPos = wrap_pos_x;
}
void ImGui::PopTextWrapPos()
{
- ImGuiWindow* window = GetCurrentWindow();
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->DC.TextWrapPosStack.Size <= 0)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PopTextWrapPos() too many times!");
+ return;
+ }
window->DC.TextWrapPos = window->DC.TextWrapPosStack.back();
window->DC.TextWrapPosStack.pop_back();
}
@@ -7362,10 +8071,15 @@ bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_b
return false;
}
+// Is current window hovered and hoverable (e.g. not blocked by a popup/modal)? See ImGuiHoveredFlags_ for options.
+// IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app,
+// you should not use this function! Use the 'io.WantCaptureMouse' boolean for that!
+// Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details.
bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
{
- IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled)) == 0); // Flags not supported by this function
ImGuiContext& g = *GImGui;
+ IM_ASSERT_USER_ERROR((flags & ~ImGuiHoveredFlags_AllowedMaskForIsWindowHovered) == 0, "Invalid flags for IsWindowHovered()!");
+
ImGuiWindow* ref_window = g.HoveredWindow;
ImGuiWindow* cur_window = g.CurrentWindow;
if (ref_window == NULL)
@@ -7392,37 +8106,18 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != ref_window->MoveId)
return false;
- return true;
-}
-bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* ref_window = g.NavWindow;
- ImGuiWindow* cur_window = g.CurrentWindow;
-
- if (ref_window == NULL)
+ // When changing hovered window we requires a bit of stationary delay before activating hover timer.
+ // FIXME: We don't support delay other than stationary one for now, other delay would need a way
+ // to fulfill the possibility that multiple IsWindowHovered() with varying flag could return true
+ // for different windows of the hierarchy. Possibly need a Hash(Current+Flags) ==> (Timer) cache.
+ // We can implement this for _Stationary because the data is linked to HoveredWindow rather than CurrentWindow.
+ if (flags & ImGuiHoveredFlags_ForTooltip)
+ flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipMouse);
+ if ((flags & ImGuiHoveredFlags_Stationary) != 0 && g.HoverWindowUnlockedStationaryId != ref_window->ID)
return false;
- if (flags & ImGuiFocusedFlags_AnyWindow)
- return true;
-
- IM_ASSERT(cur_window); // Not inside a Begin()/End()
- const bool popup_hierarchy = (flags & ImGuiFocusedFlags_NoPopupHierarchy) == 0;
- if (flags & ImGuiHoveredFlags_RootWindow)
- cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy);
-
- if (flags & ImGuiHoveredFlags_ChildWindows)
- return IsWindowChildOf(ref_window, cur_window, popup_hierarchy);
- else
- return (ref_window == cur_window);
-}
-// Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext)
-// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmatically.
-// If you want a window to never be focused, you may use the e.g. NoInputs flag.
-bool ImGui::IsWindowNavFocusable(ImGuiWindow* window)
-{
- return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus);
+ return true;
}
float ImGui::GetWindowWidth()
@@ -7456,7 +8151,7 @@ void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond)
// Set
const ImVec2 old_pos = window->Pos;
- window->Pos = ImFloor(pos);
+ window->Pos = ImTrunc(pos);
ImVec2 offset = window->Pos - old_pos;
if (offset.x == 0.0f && offset.y == 0.0f)
return;
@@ -7494,18 +8189,22 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);
+ // Enable auto-fit (not done in BeginChild() path unless appearing or combined with ImGuiChildFlags_AlwaysAutoResize)
+ if ((window->Flags & ImGuiWindowFlags_ChildWindow) == 0 || window->Appearing || (window->ChildFlags & ImGuiChildFlags_AlwaysAutoResize) != 0)
+ window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0;
+ if ((window->Flags & ImGuiWindowFlags_ChildWindow) == 0 || window->Appearing || (window->ChildFlags & ImGuiChildFlags_AlwaysAutoResize) != 0)
+ window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0;
+
// Set
ImVec2 old_size = window->SizeFull;
- window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0;
- window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0;
if (size.x <= 0.0f)
window->AutoFitOnlyGrows = false;
else
- window->SizeFull.x = IM_FLOOR(size.x);
+ window->SizeFull.x = IM_TRUNC(size.x);
if (size.y <= 0.0f)
window->AutoFitOnlyGrows = false;
else
- window->SizeFull.y = IM_FLOOR(size.y);
+ window->SizeFull.y = IM_TRUNC(size.y);
if (old_size.x != window->SizeFull.x || old_size.y != window->SizeFull.y)
MarkIniSettingsDirty(window);
}
@@ -7539,6 +8238,12 @@ void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const I
window->HitTestHoleOffset = ImVec2ih(pos - window->Pos);
}
+void ImGui::SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window)
+{
+ window->Hidden = window->SkipItems = true;
+ window->HiddenFramesCanSkipItems = 1;
+}
+
void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond)
{
SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond);
@@ -7562,29 +8267,11 @@ void ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond)
SetWindowCollapsed(window, collapsed, cond);
}
-void ImGui::SetWindowFocus()
-{
- FocusWindow(GImGui->CurrentWindow);
-}
-
-void ImGui::SetWindowFocus(const char* name)
-{
- if (name)
- {
- if (ImGuiWindow* window = FindWindowByName(name))
- FocusWindow(window);
- }
- else
- {
- FocusWindow(NULL);
- }
-}
-
void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pivot)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasPos;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasPos;
g.NextWindowData.PosVal = pos;
g.NextWindowData.PosPivotVal = pivot;
g.NextWindowData.PosCond = cond ? cond : ImGuiCond_Always;
@@ -7594,15 +8281,19 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSize;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasSize;
g.NextWindowData.SizeVal = size;
g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always;
}
+// For each axis:
+// - Use 0.0f as min or FLT_MAX as max if you don't want limits, e.g. size_min = (500.0f, 0.0f), size_max = (FLT_MAX, FLT_MAX) sets a minimum width.
+// - Use -1 for both min and max of same axis to preserve current size which itself is a constraint.
+// - See "Demo->Examples->Constrained-resizing window" for examples.
void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasSizeConstraint;
g.NextWindowData.SizeConstraintRect = ImRect(size_min, size_max);
g.NextWindowData.SizeCallback = custom_callback;
g.NextWindowData.SizeCallbackUserData = custom_callback_user_data;
@@ -7613,14 +8304,14 @@ void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& s
void ImGui::SetNextWindowContentSize(const ImVec2& size)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize;
- g.NextWindowData.ContentSizeVal = ImFloor(size);
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasContentSize;
+ g.NextWindowData.ContentSizeVal = ImTrunc(size);
}
void ImGui::SetNextWindowScroll(const ImVec2& scroll)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasScroll;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasScroll;
g.NextWindowData.ScrollVal = scroll;
}
@@ -7628,22 +8319,24 @@ void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasCollapsed;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasCollapsed;
g.NextWindowData.CollapsedVal = collapsed;
g.NextWindowData.CollapsedCond = cond ? cond : ImGuiCond_Always;
}
-void ImGui::SetNextWindowFocus()
+void ImGui::SetNextWindowBgAlpha(float alpha)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasFocus;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasBgAlpha;
+ g.NextWindowData.BgAlphaVal = alpha;
}
-void ImGui::SetNextWindowBgAlpha(float alpha)
+// This is experimental and meant to be a toy for exploring a future/wider range of features.
+void ImGui::SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasBgAlpha;
- g.NextWindowData.BgAlphaVal = alpha;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasRefreshPolicy;
+ g.NextWindowData.RefreshFlagsVal = flags;
}
ImDrawList* ImGui::GetWindowDrawList()
@@ -7674,37 +8367,92 @@ void ImGui::SetWindowFontScale(float scale)
ImGuiWindow* window = GetCurrentWindow();
window->FontWindowScale = scale;
g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize();
-}
-
-void ImGui::ActivateItem(ImGuiID id)
-{
- ImGuiContext& g = *GImGui;
- g.NavNextActivateId = id;
- g.NavNextActivateFlags = ImGuiActivateFlags_None;
+ g.FontScale = g.DrawListSharedData.FontScale = g.FontSize / g.Font->FontSize;
}
void ImGui::PushFocusScope(ImGuiID id)
{
ImGuiContext& g = *GImGui;
- g.FocusScopeStack.push_back(id);
+ ImGuiFocusScopeData data;
+ data.ID = id;
+ data.WindowID = g.CurrentWindow->ID;
+ g.FocusScopeStack.push_back(data);
g.CurrentFocusScopeId = id;
}
void ImGui::PopFocusScope()
{
ImGuiContext& g = *GImGui;
- IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ?
+ if (g.FocusScopeStack.Size <= g.StackSizesInBeginForCurrentWindow->SizeOfFocusScopeStack)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PopFocusScope() too many times!");
+ return;
+ }
g.FocusScopeStack.pop_back();
- g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back() : 0;
+ g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back().ID : 0;
+}
+
+void ImGui::SetNavFocusScope(ImGuiID focus_scope_id)
+{
+ ImGuiContext& g = *GImGui;
+ g.NavFocusScopeId = focus_scope_id;
+ g.NavFocusRoute.resize(0); // Invalidate
+ if (focus_scope_id == 0)
+ return;
+ IM_ASSERT(g.NavWindow != NULL);
+
+ // Store current path (in reverse order)
+ if (focus_scope_id == g.CurrentFocusScopeId)
+ {
+ // Top of focus stack contains local focus scopes inside current window
+ for (int n = g.FocusScopeStack.Size - 1; n >= 0 && g.FocusScopeStack.Data[n].WindowID == g.CurrentWindow->ID; n--)
+ g.NavFocusRoute.push_back(g.FocusScopeStack.Data[n]);
+ }
+ else if (focus_scope_id == g.NavWindow->NavRootFocusScopeId)
+ g.NavFocusRoute.push_back({ focus_scope_id, g.NavWindow->ID });
+ else
+ return;
+
+ // Then follow on manually set ParentWindowForFocusRoute field (#6798)
+ for (ImGuiWindow* window = g.NavWindow->ParentWindowForFocusRoute; window != NULL; window = window->ParentWindowForFocusRoute)
+ g.NavFocusRoute.push_back({ window->NavRootFocusScopeId, window->ID });
+ IM_ASSERT(g.NavFocusRoute.Size < 100); // Maximum depth is technically 251 as per CalcRoutingScore(): 254 - 3
+}
+
+// Focus = move navigation cursor, set scrolling, set focus window.
+void ImGui::FocusItem()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ IMGUI_DEBUG_LOG_FOCUS("FocusItem(0x%08x) in window \"%s\"\n", g.LastItemData.ID, window->Name);
+ if (g.DragDropActive || g.MovingWindow != NULL) // FIXME: Opt-in flags for this?
+ {
+ IMGUI_DEBUG_LOG_FOCUS("FocusItem() ignored while DragDropActive!\n");
+ return;
+ }
+
+ ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_FocusApi | ImGuiNavMoveFlags_NoSetNavCursorVisible | ImGuiNavMoveFlags_NoSelect;
+ ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY;
+ SetNavWindow(window);
+ NavMoveRequestSubmit(ImGuiDir_None, ImGuiDir_Up, move_flags, scroll_flags);
+ NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal);
+}
+
+void ImGui::ActivateItemByID(ImGuiID id)
+{
+ ImGuiContext& g = *GImGui;
+ g.NavNextActivateId = id;
+ g.NavNextActivateFlags = ImGuiActivateFlags_None;
}
// Note: this will likely be called ActivateItem() once we rework our Focus/Activation system!
+// But ActivateItem() should function without altering scroll/focus?
void ImGui::SetKeyboardFocusHere(int offset)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
IM_ASSERT(offset >= -1); // -1 is allowed but not below
- IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name);
+ IMGUI_DEBUG_LOG_FOCUS("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name);
// It makes sense in the vast majority of cases to never interrupt a drag and drop.
// When we refactor this function into ActivateItem() we may want to make this an option.
@@ -7712,14 +8460,15 @@ void ImGui::SetKeyboardFocusHere(int offset)
// is also automatically dropped in the event g.ActiveId is stolen.
if (g.DragDropActive || g.MovingWindow != NULL)
{
- IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere() ignored while DragDropActive!\n");
+ IMGUI_DEBUG_LOG_FOCUS("SetKeyboardFocusHere() ignored while DragDropActive!\n");
return;
}
SetNavWindow(window);
+ ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_Activate | ImGuiNavMoveFlags_FocusApi | ImGuiNavMoveFlags_NoSetNavCursorVisible;
ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY;
- NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, ImGuiNavMoveFlags_Tabbing | ImGuiNavMoveFlags_FocusApi, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable.
+ NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, move_flags, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable.
if (offset == -1)
{
NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal);
@@ -7737,16 +8486,15 @@ void ImGui::SetItemDefaultFocus()
ImGuiWindow* window = g.CurrentWindow;
if (!window->Appearing)
return;
- if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResultId == 0) || g.NavLayer != window->DC.NavLayerCurrent)
+ if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResult.ID == 0) || g.NavLayer != window->DC.NavLayerCurrent)
return;
g.NavInitRequest = false;
- g.NavInitResultId = g.LastItemData.ID;
- g.NavInitResultRectRel = WindowRectAbsToRel(window, g.LastItemData.Rect);
+ NavApplyItemToResult(&g.NavInitResult);
NavUpdateAnyRequestFlag();
// Scroll could be done in NavInitRequestApplyResult() via an opt-in flag (we however don't want regular init requests to scroll)
- if (!IsItemVisible())
+ if (!window->ClipRect.Contains(g.LastItemData.Rect))
ScrollToRectEx(window, g.LastItemData.Rect, ImGuiScrollFlags_None);
}
@@ -7762,6 +8510,80 @@ ImGuiStorage* ImGui::GetStateStorage()
return window->DC.StateStorage;
}
+bool ImGui::IsRectVisible(const ImVec2& size)
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));
+}
+
+bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] ID STACK
+//-----------------------------------------------------------------------------
+
+// This is one of the very rare legacy case where we use ImGuiWindow methods,
+// it should ideally be flattened at some point but it's been used a lots by widgets.
+IM_MSVC_RUNTIME_CHECKS_OFF
+ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
+{
+ ImGuiID seed = IDStack.back();
+ ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ ImGuiContext& g = *Ctx;
+ if (g.DebugHookIdInfo == id)
+ ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
+#endif
+ return id;
+}
+
+ImGuiID ImGuiWindow::GetID(const void* ptr)
+{
+ ImGuiID seed = IDStack.back();
+ ImGuiID id = ImHashData(&ptr, sizeof(void*), seed);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ ImGuiContext& g = *Ctx;
+ if (g.DebugHookIdInfo == id)
+ ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL);
+#endif
+ return id;
+}
+
+ImGuiID ImGuiWindow::GetID(int n)
+{
+ ImGuiID seed = IDStack.back();
+ ImGuiID id = ImHashData(&n, sizeof(n), seed);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ ImGuiContext& g = *Ctx;
+ if (g.DebugHookIdInfo == id)
+ ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
+#endif
+ return id;
+}
+
+// This is only used in rare/specific situations to manufacture an ID out of nowhere.
+// FIXME: Consider instead storing last non-zero ID + count of successive zero-ID, and combine those?
+ImGuiID ImGuiWindow::GetIDFromPos(const ImVec2& p_abs)
+{
+ ImGuiID seed = IDStack.back();
+ ImVec2 p_rel = ImGui::WindowPosAbsToRel(this, p_abs);
+ ImGuiID id = ImHashData(&p_rel, sizeof(p_rel), seed);
+ return id;
+}
+
+// "
+ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs)
+{
+ ImGuiID seed = IDStack.back();
+ ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs);
+ ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed);
+ return id;
+}
+
void ImGui::PushID(const char* str_id)
{
ImGuiContext& g = *GImGui;
@@ -7799,27 +8621,46 @@ void ImGui::PushOverrideID(ImGuiID id)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
if (g.DebugHookIdInfo == id)
DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL);
+#endif
window->IDStack.push_back(id);
}
// Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call
-// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level.
+// (note that when using this pattern, ID Stack Tool will tend to not display the intermediate stack level.
// for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more)
ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed)
{
ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
ImGuiContext& g = *GImGui;
if (g.DebugHookIdInfo == id)
DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
+#endif
+ return id;
+}
+
+ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed)
+{
+ ImGuiID id = ImHashData(&n, sizeof(n), seed);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ ImGuiContext& g = *GImGui;
+ if (g.DebugHookIdInfo == id)
+ DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
+#endif
return id;
}
void ImGui::PopID()
{
ImGuiWindow* window = GImGui->CurrentWindow;
- IM_ASSERT(window->IDStack.Size > 1); // Too many PopID(), or could be popping in a wrong/different window?
+ if (window->IDStack.Size <= 1)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PopID() too many times!");
+ return;
+ }
window->IDStack.pop_back();
}
@@ -7841,75 +8682,114 @@ ImGuiID ImGui::GetID(const void* ptr_id)
return window->GetID(ptr_id);
}
-bool ImGui::IsRectVisible(const ImVec2& size)
-{
- ImGuiWindow* window = GImGui->CurrentWindow;
- return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));
-}
-
-bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
+ImGuiID ImGui::GetID(int int_id)
{
ImGuiWindow* window = GImGui->CurrentWindow;
- return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
+ return window->GetID(int_id);
}
-
+IM_MSVC_RUNTIME_CHECKS_RESTORE
//-----------------------------------------------------------------------------
// [SECTION] INPUTS
//-----------------------------------------------------------------------------
+// - GetModForLRModKey() [Internal]
+// - FixupKeyChord() [Internal]
+// - GetKeyData() [Internal]
+// - GetKeyIndex() [Internal]
+// - GetKeyName()
+// - GetKeyChordName() [Internal]
+// - CalcTypematicRepeatAmount() [Internal]
+// - GetTypematicRepeatRate() [Internal]
+// - GetKeyPressedAmount() [Internal]
+// - GetKeyMagnitude2d() [Internal]
+//-----------------------------------------------------------------------------
+// - UpdateKeyRoutingTable() [Internal]
+// - GetRoutingIdFromOwnerId() [Internal]
+// - GetShortcutRoutingData() [Internal]
+// - CalcRoutingScore() [Internal]
+// - SetShortcutRouting() [Internal]
+// - TestShortcutRouting() [Internal]
+//-----------------------------------------------------------------------------
+// - IsKeyDown()
+// - IsKeyPressed()
+// - IsKeyReleased()
+//-----------------------------------------------------------------------------
+// - IsMouseDown()
+// - IsMouseClicked()
+// - IsMouseReleased()
+// - IsMouseDoubleClicked()
+// - GetMouseClickedCount()
+// - IsMouseHoveringRect() [Internal]
+// - IsMouseDragPastThreshold() [Internal]
+// - IsMouseDragging()
+// - GetMousePos()
+// - SetMousePos() [Internal]
+// - GetMousePosOnOpeningCurrentPopup()
+// - IsMousePosValid()
+// - IsAnyMouseDown()
+// - GetMouseDragDelta()
+// - ResetMouseDragDelta()
+// - GetMouseCursor()
+// - SetMouseCursor()
+//-----------------------------------------------------------------------------
+// - UpdateAliasKey()
+// - GetMergedModsFromKeys()
+// - UpdateKeyboardInputs()
+// - UpdateMouseInputs()
+//-----------------------------------------------------------------------------
+// - LockWheelingWindow [Internal]
+// - FindBestWheelingWindow [Internal]
+// - UpdateMouseWheel() [Internal]
+//-----------------------------------------------------------------------------
+// - SetNextFrameWantCaptureKeyboard()
+// - SetNextFrameWantCaptureMouse()
+//-----------------------------------------------------------------------------
+// - GetInputSourceName() [Internal]
+// - DebugPrintInputEvent() [Internal]
+// - UpdateInputEvents() [Internal]
+//-----------------------------------------------------------------------------
+// - GetKeyOwner() [Internal]
+// - TestKeyOwner() [Internal]
+// - SetKeyOwner() [Internal]
+// - SetItemKeyOwner() [Internal]
+// - Shortcut() [Internal]
+//-----------------------------------------------------------------------------
-// Test if mouse cursor is hovering given rectangle
-// NB- Rectangle is clipped by our current clip setting
-// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding)
-bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip)
+static ImGuiKeyChord GetModForLRModKey(ImGuiKey key)
{
- ImGuiContext& g = *GImGui;
-
- // Clip
- ImRect rect_clipped(r_min, r_max);
- if (clip)
- rect_clipped.ClipWith(g.CurrentWindow->ClipRect);
+ if (key == ImGuiKey_LeftCtrl || key == ImGuiKey_RightCtrl)
+ return ImGuiMod_Ctrl;
+ if (key == ImGuiKey_LeftShift || key == ImGuiKey_RightShift)
+ return ImGuiMod_Shift;
+ if (key == ImGuiKey_LeftAlt || key == ImGuiKey_RightAlt)
+ return ImGuiMod_Alt;
+ if (key == ImGuiKey_LeftSuper || key == ImGuiKey_RightSuper)
+ return ImGuiMod_Super;
+ return ImGuiMod_None;
+}
- // Expand for touch input
- const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding);
- if (!rect_for_touch.Contains(g.IO.MousePos))
- return false;
- return true;
+ImGuiKeyChord ImGui::FixupKeyChord(ImGuiKeyChord key_chord)
+{
+ // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified.
+ ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
+ if (IsLRModKey(key))
+ key_chord |= GetModForLRModKey(key);
+ return key_chord;
}
-ImGuiKeyData* ImGui::GetKeyData(ImGuiKey key)
+ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key)
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *ctx;
// Special storage location for mods
if (key & ImGuiMod_Mask_)
key = ConvertSingleModFlagToKey(key);
- int index;
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END);
- if (IsLegacyKey(key))
- index = (g.IO.KeyMap[key] != -1) ? g.IO.KeyMap[key] : key; // Remap native->imgui or imgui->native
- else
- index = key;
-#else
IM_ASSERT(IsNamedKey(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend & user code.");
- index = key - ImGuiKey_NamedKey_BEGIN;
-#endif
- return &g.IO.KeysData[index];
+ return &g.IO.KeysData[key - ImGuiKey_NamedKey_BEGIN];
}
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
-ImGuiKey ImGui::GetKeyIndex(ImGuiKey key)
-{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(IsNamedKey(key));
- const ImGuiKeyData* key_data = GetKeyData(key);
- return (ImGuiKey)(key_data - g.IO.KeysData);
-}
-#endif
-
-// Those names a provided for debugging purpose and are not meant to be saved persistently not compared.
+// Those names are provided for debugging purpose and are not meant to be saved persistently nor compared.
static const char* const GKeyNames[] =
{
"Tab", "LeftArrow", "RightArrow", "UpArrow", "DownArrow", "PageUp", "PageDown",
@@ -7918,11 +8798,13 @@ static const char* const GKeyNames[] =
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
+ "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24",
"Apostrophe", "Comma", "Minus", "Period", "Slash", "Semicolon", "Equal", "LeftBracket",
"Backslash", "RightBracket", "GraveAccent", "CapsLock", "ScrollLock", "NumLock", "PrintScreen",
"Pause", "Keypad0", "Keypad1", "Keypad2", "Keypad3", "Keypad4", "Keypad5", "Keypad6",
"Keypad7", "Keypad8", "Keypad9", "KeypadDecimal", "KeypadDivide", "KeypadMultiply",
"KeypadSubtract", "KeypadAdd", "KeypadEnter", "KeypadEqual",
+ "AppBack", "AppForward", "Oem102",
"GamepadStart", "GamepadBack",
"GamepadFaceLeft", "GamepadFaceRight", "GamepadFaceUp", "GamepadFaceDown",
"GamepadDpadLeft", "GamepadDpadRight", "GamepadDpadUp", "GamepadDpadDown",
@@ -7936,20 +8818,9 @@ IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames));
const char* ImGui::GetKeyName(ImGuiKey key)
{
-#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
- IM_ASSERT((IsNamedKey(key) || key == ImGuiKey_None) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code.");
-#else
- if (IsLegacyKey(key))
- {
- ImGuiIO& io = GetIO();
- if (io.KeyMap[key] == -1)
- return "N/A";
- IM_ASSERT(IsNamedKey((ImGuiKey)io.KeyMap[key]));
- key = (ImGuiKey)io.KeyMap[key];
- }
-#endif
if (key == ImGuiKey_None)
return "None";
+ IM_ASSERT(IsNamedKeyOrMod(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code.");
if (key & ImGuiMod_Mask_)
key = ConvertSingleModFlagToKey(key);
if (!IsNamedKey(key))
@@ -7958,15 +8829,26 @@ const char* ImGui::GetKeyName(ImGuiKey key)
return GKeyNames[key - ImGuiKey_NamedKey_BEGIN];
}
-void ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size)
+// Return untranslated names: on macOS, Cmd key will show as Ctrl, Ctrl key will show as super.
+// Lifetime of return value: valid until next call to same function.
+const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord)
{
ImGuiContext& g = *GImGui;
- ImFormatString(out_buf, (size_t)out_buf_size, "%s%s%s%s%s",
+
+ const ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
+ if (IsLRModKey(key))
+ key_chord &= ~GetModForLRModKey(key); // Return "Ctrl+LeftShift" instead of "Ctrl+Shift+LeftShift"
+ ImFormatString(g.TempKeychordName, IM_ARRAYSIZE(g.TempKeychordName), "%s%s%s%s%s",
(key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "",
(key_chord & ImGuiMod_Shift) ? "Shift+" : "",
(key_chord & ImGuiMod_Alt) ? "Alt+" : "",
- (key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "",
- GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_)));
+ (key_chord & ImGuiMod_Super) ? "Super+" : "",
+ (key != ImGuiKey_None || key_chord == ImGuiKey_None) ? GetKeyName(key) : "");
+ size_t len;
+ if (key == ImGuiKey_None && key_chord != 0)
+ if ((len = ImStrlen(g.TempKeychordName)) != 0) // Remove trailing '+'
+ g.TempKeychordName[len - 1] = 0;
+ return g.TempKeychordName;
}
// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime)
@@ -8011,18 +8893,62 @@ int ImGui::GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float repeat_ra
}
// Return 2D vector representing the combination of four cardinal direction, with analog value support (for e.g. ImGuiKey_GamepadLStick* values).
-ImVec2 ImGui::GetKeyVector2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down)
+ImVec2 ImGui::GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down)
{
return ImVec2(
GetKeyData(key_right)->AnalogValue - GetKeyData(key_left)->AnalogValue,
GetKeyData(key_down)->AnalogValue - GetKeyData(key_up)->AnalogValue);
}
+// Rewrite routing data buffers to strip old entries + sort by key to make queries not touch scattered data.
+// Entries D,A,B,B,A,C,B --> A,A,B,B,B,C,D
+// Index A:1 B:2 C:5 D:0 --> A:0 B:2 C:5 D:6
+// See 'Metrics->Key Owners & Shortcut Routing' to visualize the result of that operation.
+static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt)
+{
+ ImGuiContext& g = *GImGui;
+ rt->EntriesNext.resize(0);
+ for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
+ {
+ const int new_routing_start_idx = rt->EntriesNext.Size;
+ ImGuiKeyRoutingData* routing_entry;
+ for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex)
+ {
+ routing_entry = &rt->Entries[old_routing_idx];
+ routing_entry->RoutingCurrScore = routing_entry->RoutingNextScore;
+ routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry
+ routing_entry->RoutingNext = ImGuiKeyOwner_NoOwner;
+ routing_entry->RoutingNextScore = 255;
+ if (routing_entry->RoutingCurr == ImGuiKeyOwner_NoOwner)
+ continue;
+ rt->EntriesNext.push_back(*routing_entry); // Write alive ones into new buffer
+
+ // Apply routing to owner if there's no owner already (RoutingCurr == None at this point)
+ // This is the result of previous frame's SetShortcutRouting() call.
+ if (routing_entry->Mods == g.IO.KeyMods)
+ {
+ ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
+ if (owner_data->OwnerCurr == ImGuiKeyOwner_NoOwner)
+ {
+ owner_data->OwnerCurr = routing_entry->RoutingCurr;
+ //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X) via Routing\n", GetKeyName(key), routing_entry->RoutingCurr);
+ }
+ }
+ }
+
+ // Rewrite linked-list
+ rt->Index[key - ImGuiKey_NamedKey_BEGIN] = (ImGuiKeyRoutingIndex)(new_routing_start_idx < rt->EntriesNext.Size ? new_routing_start_idx : -1);
+ for (int n = new_routing_start_idx; n < rt->EntriesNext.Size; n++)
+ rt->EntriesNext[n].NextEntryIndex = (ImGuiKeyRoutingIndex)((n + 1 < rt->EntriesNext.Size) ? n + 1 : -1);
+ }
+ rt->Entries.swap(rt->EntriesNext); // Swap new and old indexes
+}
+
// owner_id may be None/Any, but routing_id needs to be always be set, so we default to GetCurrentFocusScope().
static inline ImGuiID GetRoutingIdFromOwnerId(ImGuiID owner_id)
{
ImGuiContext& g = *GImGui;
- return (owner_id != ImGuiKeyOwner_None && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId;
+ return (owner_id != ImGuiKeyOwner_NoOwner && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId;
}
ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord)
@@ -8062,20 +8988,18 @@ ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord)
}
// Current score encoding (lower is highest priority):
-// - 0: ImGuiInputFlags_RouteGlobalHigh
-// - 1: ImGuiInputFlags_RouteFocused (if item active)
-// - 2: ImGuiInputFlags_RouteGlobal
+// - 0: ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverActive
+// - 1: ImGuiInputFlags_ActiveItem or ImGuiInputFlags_RouteFocused (if item active)
+// - 2: ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused
// - 3+: ImGuiInputFlags_RouteFocused (if window in focus-stack)
-// - 254: ImGuiInputFlags_RouteGlobalLow
+// - 254: ImGuiInputFlags_RouteGlobal
// - 255: never route
// 'flags' should include an explicit routing policy
-static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputFlags flags)
+static int CalcRoutingScore(ImGuiID focus_scope_id, ImGuiID owner_id, ImGuiInputFlags flags)
{
+ ImGuiContext& g = *GImGui;
if (flags & ImGuiInputFlags_RouteFocused)
{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* focused = g.NavWindow;
-
// ActiveID gets top priority
// (we don't check g.ActiveIdUsingAllKeys here. Routing is applied but if input ownership is tested later it may discard it)
if (owner_id != 0 && g.ActiveId == owner_id)
@@ -8087,65 +9011,139 @@ static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputF
// - When Window/ChildB is focused -> Window scores 4, Window/ChildB scores 3 (best)
// Assuming only WindowA is submitting a routing request,
// - When Window/ChildB is focused -> Window scores 4 (best), Window/ChildB doesn't have a score.
- if (focused != NULL && focused->RootWindow == location->RootWindow)
- for (int next_score = 3; focused != NULL; next_score++)
- {
- if (focused == location)
- {
- IM_ASSERT(next_score < 255);
- return next_score;
- }
- focused = (focused->RootWindow != focused) ? focused->ParentWindow : NULL; // FIXME: This could be later abstracted as a focus path
- }
+ // This essentially follow the window->ParentWindowForFocusRoute chain.
+ if (focus_scope_id == 0)
+ return 255;
+ for (int index_in_focus_path = 0; index_in_focus_path < g.NavFocusRoute.Size; index_in_focus_path++)
+ if (g.NavFocusRoute.Data[index_in_focus_path].ID == focus_scope_id)
+ return 3 + index_in_focus_path;
return 255;
}
-
- // ImGuiInputFlags_RouteGlobalHigh is default, so calls without flags are not conditional
- if (flags & ImGuiInputFlags_RouteGlobal)
- return 2;
- if (flags & ImGuiInputFlags_RouteGlobalLow)
+ else if (flags & ImGuiInputFlags_RouteActive)
+ {
+ if (owner_id != 0 && g.ActiveId == owner_id)
+ return 1;
+ return 255;
+ }
+ else if (flags & ImGuiInputFlags_RouteGlobal)
+ {
+ if (flags & ImGuiInputFlags_RouteOverActive)
+ return 0;
+ if (flags & ImGuiInputFlags_RouteOverFocused)
+ return 2;
return 254;
+ }
+ IM_ASSERT(0);
return 0;
}
+// - We need this to filter some Shortcut() routes when an item e.g. an InputText() is active
+// e.g. ImGuiKey_G won't be considered a shortcut when item is active, but ImGuiMod|ImGuiKey_G can be.
+// - This is also used by UpdateInputEvents() to avoid trickling in the most common case of e.g. pressing ImGuiKey_G also emitting a G character.
+static bool IsKeyChordPotentiallyCharInput(ImGuiKeyChord key_chord)
+{
+ // Mimic 'ignore_char_inputs' logic in InputText()
+ ImGuiContext& g = *GImGui;
+
+ // When the right mods are pressed it cannot be a char input so we won't filter the shortcut out.
+ ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_);
+ const bool ignore_char_inputs = ((mods & ImGuiMod_Ctrl) && !(mods & ImGuiMod_Alt)) || (g.IO.ConfigMacOSXBehaviors && (mods & ImGuiMod_Ctrl));
+ if (ignore_char_inputs)
+ return false;
+
+ // Return true for A-Z, 0-9 and other keys associated to char inputs. Other keys such as F1-F12 won't be filtered.
+ ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
+ if (key == ImGuiKey_None)
+ return false;
+ return g.KeysMayBeCharInput.TestBit(key);
+}
+
// Request a desired route for an input chord (key + mods).
// Return true if the route is available this frame.
// - Routes and key ownership are attributed at the beginning of next frame based on best score and mod state.
// (Conceptually this does a "Submit for next frame" + "Test for current frame".
// As such, it could be called TrySetXXX or SubmitXXX, or the Submit and Test operations should be separate.)
-// - Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default)
-// - Using 'owner_id == ImGuiKeyOwner_None': allows disabling/locking a shortcut.
-bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
+bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id)
{
ImGuiContext& g = *GImGui;
- if ((flags & ImGuiInputFlags_RouteMask_) == 0)
- flags |= ImGuiInputFlags_RouteGlobalHigh; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut()
+ if ((flags & ImGuiInputFlags_RouteTypeMask_) == 0)
+ flags |= ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut()
else
- IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteTypeMask_)); // Check that only 1 routing flag is used
+ IM_ASSERT(owner_id != ImGuiKeyOwner_Any && owner_id != ImGuiKeyOwner_NoOwner);
+ if (flags & (ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused))
+ IM_ASSERT(flags & ImGuiInputFlags_RouteGlobal);
+
+ // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified.
+ key_chord = FixupKeyChord(key_chord);
+
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInShortcutRouting == key_chord)
+ IM_DEBUG_BREAK();
if (flags & ImGuiInputFlags_RouteUnlessBgFocused)
if (g.NavWindow == NULL)
return false;
+
+ // Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this?
if (flags & ImGuiInputFlags_RouteAlways)
+ {
+ IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> always, no register\n", GetKeyChordName(key_chord), flags, owner_id);
return true;
+ }
+
+ // Specific culling when there's an active item.
+ if (g.ActiveId != 0 && g.ActiveId != owner_id)
+ {
+ if (flags & ImGuiInputFlags_RouteActive)
+ return false;
- const int score = CalcRoutingScore(g.CurrentWindow, owner_id, flags);
+ // Cull shortcuts with no modifiers when it could generate a character.
+ // e.g. Shortcut(ImGuiKey_G) also generates 'g' character, should not trigger when InputText() is active.
+ // but Shortcut(Ctrl+G) should generally trigger when InputText() is active.
+ // TL;DR: lettered shortcut with no mods or with only Alt mod will not trigger while an item reading text input is active.
+ // (We cannot filter based on io.InputQueueCharacters[] contents because of trickling and key<>chars submission order are undefined)
+ if (g.IO.WantTextInput && IsKeyChordPotentiallyCharInput(key_chord))
+ {
+ IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> filtered as potential char input\n", GetKeyChordName(key_chord), flags, owner_id);
+ return false;
+ }
+
+ // ActiveIdUsingAllKeyboardKeys trumps all for ActiveId
+ if ((flags & ImGuiInputFlags_RouteOverActive) == 0 && g.ActiveIdUsingAllKeyboardKeys)
+ {
+ ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
+ if (key == ImGuiKey_None)
+ key = ConvertSingleModFlagToKey((ImGuiKey)(key_chord & ImGuiMod_Mask_));
+ if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END)
+ return false;
+ }
+ }
+
+ // Where do we evaluate route for?
+ ImGuiID focus_scope_id = g.CurrentFocusScopeId;
+ if (flags & ImGuiInputFlags_RouteFromRootWindow)
+ focus_scope_id = g.CurrentWindow->RootWindow->ID; // See PushFocusScope() call in Begin()
+
+ const int score = CalcRoutingScore(focus_scope_id, owner_id, flags);
+ IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> score %d\n", GetKeyChordName(key_chord), flags, owner_id, score);
if (score == 255)
return false;
// Submit routing for NEXT frame (assuming score is sufficient)
// FIXME: Could expose a way to use a "serve last" policy for same score resolution (using <= instead of <).
ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord);
- const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id);
//const bool set_route = (flags & ImGuiInputFlags_ServeLast) ? (score <= routing_data->RoutingNextScore) : (score < routing_data->RoutingNextScore);
if (score < routing_data->RoutingNextScore)
{
- routing_data->RoutingNext = routing_id;
+ routing_data->RoutingNext = owner_id;
routing_data->RoutingNextScore = (ImU8)score;
}
// Return routing state for CURRENT frame
- return routing_data->RoutingCurr == routing_id;
+ if (routing_data->RoutingCurr == owner_id)
+ IMGUI_DEBUG_LOG_INPUTROUTING("--> granting current route\n");
+ return routing_data->RoutingCurr == owner_id;
}
// Currently unused by core (but used by tests)
@@ -8153,7 +9151,8 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI
bool ImGui::TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id)
{
const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id);
- ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord);
+ key_chord = FixupKeyChord(key_chord);
+ ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); // FIXME: Could avoid creating entry.
return routing_data->RoutingCurr == routing_id;
}
@@ -8176,11 +9175,11 @@ bool ImGui::IsKeyDown(ImGuiKey key, ImGuiID owner_id)
bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat)
{
- return IsKeyPressed(key, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None);
+ return IsKeyPressed(key, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any);
}
-// Important: unless legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat.
-bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
+// Important: unlike legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat.
+bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id)
{
const ImGuiKeyData* key_data = GetKeyData(key);
if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership)
@@ -8189,13 +9188,28 @@ bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
if (t < 0.0f)
return false;
IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function!
+ if (flags & (ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_)) // Setting any _RepeatXXX option enables _Repeat
+ flags |= ImGuiInputFlags_Repeat;
bool pressed = (t == 0.0f);
- if (!pressed && ((flags & ImGuiInputFlags_Repeat) != 0))
+ if (!pressed && (flags & ImGuiInputFlags_Repeat) != 0)
{
float repeat_delay, repeat_rate;
GetTypematicRepeatRate(flags, &repeat_delay, &repeat_rate);
pressed = (t > repeat_delay) && GetKeyPressedAmount(key, repeat_delay, repeat_rate) > 0;
+ if (pressed && (flags & ImGuiInputFlags_RepeatUntilMask_))
+ {
+ // Slightly bias 'key_pressed_time' as DownDuration is an accumulation of DeltaTime which we compare to an absolute time value.
+ // Ideally we'd replace DownDuration with KeyPressedTime but it would break user's code.
+ ImGuiContext& g = *GImGui;
+ double key_pressed_time = g.Time - t + 0.00001f;
+ if ((flags & ImGuiInputFlags_RepeatUntilKeyModsChange) && (g.LastKeyModsChangeTime > key_pressed_time))
+ pressed = false;
+ if ((flags & ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone) && (g.LastKeyModsChangeFromNoneTime > key_pressed_time))
+ pressed = false;
+ if ((flags & ImGuiInputFlags_RepeatUntilOtherKeyPress) && (g.LastKeyboardKeyPressTime > key_pressed_time))
+ pressed = false;
+ }
}
if (!pressed)
return false;
@@ -8235,10 +9249,10 @@ bool ImGui::IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id)
bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat)
{
- return IsMouseClicked(button, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None);
+ return IsMouseClicked(button, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any);
}
-bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags)
+bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
@@ -8247,7 +9261,7 @@ bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInput
const float t = g.IO.MouseDownDuration[button];
if (t < 0.0f)
return false;
- IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function!
+ IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsMouseClicked) == 0); // Passing flags not supported by this function! // FIXME: Could support RepeatRate and RepeatUntil flags here.
const bool repeat = (flags & ImGuiInputFlags_Repeat) != 0;
const bool pressed = (t == 0.0f) || (repeat && t > g.IO.KeyRepeatDelay && CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0);
@@ -8274,6 +9288,17 @@ bool ImGui::IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id)
return g.IO.MouseReleased[button] && TestKeyOwner(MouseButtonToKey(button), owner_id); // Should be same as IsKeyReleased(MouseButtonToKey(button), owner_id)
}
+// Use if you absolutely need to distinguish single-click from double-click by introducing a delay.
+// Generally use with 'delay >= io.MouseDoubleClickTime' + combined with a 'io.MouseClickedLastCount == 1' test.
+// This is a very rarely used UI idiom, but some apps use this: e.g. MS Explorer single click on an icon to rename.
+bool ImGui::IsMouseReleasedWithDelay(ImGuiMouseButton button, float delay)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
+ const float time_since_release = (float)(g.Time - g.IO.MouseReleasedTime[button]);
+ return !IsMouseDown(button) && (time_since_release - g.IO.DeltaTime < delay) && (time_since_release >= delay);
+}
+
bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button)
{
ImGuiContext& g = *GImGui;
@@ -8281,6 +9306,13 @@ bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button)
return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), ImGuiKeyOwner_Any);
}
+bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
+ return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), owner_id);
+}
+
int ImGui::GetMouseClickedCount(ImGuiMouseButton button)
{
ImGuiContext& g = *GImGui;
@@ -8288,6 +9320,24 @@ int ImGui::GetMouseClickedCount(ImGuiMouseButton button)
return g.IO.MouseClickedCount[button];
}
+// Test if mouse cursor is hovering given rectangle
+// NB- Rectangle is clipped by our current clip setting
+// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding)
+bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip)
+{
+ ImGuiContext& g = *GImGui;
+
+ // Clip
+ ImRect rect_clipped(r_min, r_max);
+ if (clip)
+ rect_clipped.ClipWith(g.CurrentWindow->ClipRect);
+
+ // Hit testing, expanded for touch input
+ if (!rect_clipped.ContainsWithPad(g.IO.MousePos, g.Style.TouchExtraPadding))
+ return false;
+ return true;
+}
+
// Return if a mouse click/drag went past the given threshold. Valid to call during the MouseReleased frame.
// [Internal] This doesn't test if the button is pressed
bool ImGui::IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold)
@@ -8314,6 +9364,17 @@ ImVec2 ImGui::GetMousePos()
return g.IO.MousePos;
}
+// This is called TeleportMousePos() and not SetMousePos() to emphasis that setting MousePosPrev will effectively clear mouse delta as well.
+// It is expected you only call this if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) is set and supported by backend.
+void ImGui::TeleportMousePos(const ImVec2& pos)
+{
+ ImGuiContext& g = *GImGui;
+ g.IO.MousePos = g.IO.MousePosPrev = pos;
+ g.IO.MouseDelta = ImVec2(0.0f, 0.0f);
+ g.IO.WantSetMousePos = true;
+ //IMGUI_DEBUG_LOG_IO("TeleportMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y);
+}
+
// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed!
ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup()
{
@@ -8378,12 +9439,324 @@ ImGuiMouseCursor ImGui::GetMouseCursor()
return g.MouseCursor;
}
+// We intentionally accept values of ImGuiMouseCursor that are outside our bounds, in case users needs to hack-in a custom cursor value.
+// Custom cursors may be handled by custom backends. If you are using a standard backend and want to hack in a custom cursor, you may
+// handle it before the backend _NewFrame() call and temporarily set ImGuiConfigFlags_NoMouseCursorChange during the backend _NewFrame() call.
void ImGui::SetMouseCursor(ImGuiMouseCursor cursor_type)
{
ImGuiContext& g = *GImGui;
g.MouseCursor = cursor_type;
}
+static void UpdateAliasKey(ImGuiKey key, bool v, float analog_value)
+{
+ IM_ASSERT(ImGui::IsAliasKey(key));
+ ImGuiKeyData* key_data = ImGui::GetKeyData(key);
+ key_data->Down = v;
+ key_data->AnalogValue = analog_value;
+}
+
+// [Internal] Do not use directly
+static ImGuiKeyChord GetMergedModsFromKeys()
+{
+ ImGuiKeyChord mods = 0;
+ if (ImGui::IsKeyDown(ImGuiMod_Ctrl)) { mods |= ImGuiMod_Ctrl; }
+ if (ImGui::IsKeyDown(ImGuiMod_Shift)) { mods |= ImGuiMod_Shift; }
+ if (ImGui::IsKeyDown(ImGuiMod_Alt)) { mods |= ImGuiMod_Alt; }
+ if (ImGui::IsKeyDown(ImGuiMod_Super)) { mods |= ImGuiMod_Super; }
+ return mods;
+}
+
+static void ImGui::UpdateKeyboardInputs()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiIO& io = g.IO;
+
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
+ io.ClearInputKeys();
+
+ // Update aliases
+ for (int n = 0; n < ImGuiMouseButton_COUNT; n++)
+ UpdateAliasKey(MouseButtonToKey(n), io.MouseDown[n], io.MouseDown[n] ? 1.0f : 0.0f);
+ UpdateAliasKey(ImGuiKey_MouseWheelX, io.MouseWheelH != 0.0f, io.MouseWheelH);
+ UpdateAliasKey(ImGuiKey_MouseWheelY, io.MouseWheel != 0.0f, io.MouseWheel);
+
+ // Synchronize io.KeyMods and io.KeyCtrl/io.KeyShift/etc. values.
+ // - New backends (1.87+): send io.AddKeyEvent(ImGuiMod_XXX) -> -> (here) deriving io.KeyMods + io.KeyXXX from key array.
+ // - Legacy backends: set io.KeyXXX bools -> (above) set key array from io.KeyXXX -> (here) deriving io.KeyMods + io.KeyXXX from key array.
+ // So with legacy backends the 4 values will do a unnecessary back-and-forth but it makes the code simpler and future facing.
+ const ImGuiKeyChord prev_key_mods = io.KeyMods;
+ io.KeyMods = GetMergedModsFromKeys();
+ io.KeyCtrl = (io.KeyMods & ImGuiMod_Ctrl) != 0;
+ io.KeyShift = (io.KeyMods & ImGuiMod_Shift) != 0;
+ io.KeyAlt = (io.KeyMods & ImGuiMod_Alt) != 0;
+ io.KeySuper = (io.KeyMods & ImGuiMod_Super) != 0;
+ if (prev_key_mods != io.KeyMods)
+ g.LastKeyModsChangeTime = g.Time;
+ if (prev_key_mods != io.KeyMods && prev_key_mods == 0)
+ g.LastKeyModsChangeFromNoneTime = g.Time;
+
+ // Clear gamepad data if disabled
+ if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0)
+ for (int key = ImGuiKey_Gamepad_BEGIN; key < ImGuiKey_Gamepad_END; key++)
+ {
+ io.KeysData[key - ImGuiKey_NamedKey_BEGIN].Down = false;
+ io.KeysData[key - ImGuiKey_NamedKey_BEGIN].AnalogValue = 0.0f;
+ }
+
+ // Update keys
+ for (int key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key++)
+ {
+ ImGuiKeyData* key_data = &io.KeysData[key - ImGuiKey_NamedKey_BEGIN];
+ key_data->DownDurationPrev = key_data->DownDuration;
+ key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f;
+ if (key_data->DownDuration == 0.0f)
+ {
+ if (IsKeyboardKey((ImGuiKey)key))
+ g.LastKeyboardKeyPressTime = g.Time;
+ else if (key == ImGuiKey_ReservedForModCtrl || key == ImGuiKey_ReservedForModShift || key == ImGuiKey_ReservedForModAlt || key == ImGuiKey_ReservedForModSuper)
+ g.LastKeyboardKeyPressTime = g.Time;
+ }
+ }
+
+ // Update keys/input owner (named keys only): one entry per key
+ for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
+ {
+ ImGuiKeyData* key_data = &io.KeysData[key - ImGuiKey_NamedKey_BEGIN];
+ ImGuiKeyOwnerData* owner_data = &g.KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN];
+ owner_data->OwnerCurr = owner_data->OwnerNext;
+ if (!key_data->Down) // Important: ownership is released on the frame after a release. Ensure a 'MouseDown -> CloseWindow -> MouseUp' chain doesn't lead to someone else seeing the MouseUp.
+ owner_data->OwnerNext = ImGuiKeyOwner_NoOwner;
+ owner_data->LockThisFrame = owner_data->LockUntilRelease = owner_data->LockUntilRelease && key_data->Down; // Clear LockUntilRelease when key is not Down anymore
+ }
+
+ // Update key routing (for e.g. shortcuts)
+ UpdateKeyRoutingTable(&g.KeysRoutingTable);
+}
+
+static void ImGui::UpdateMouseInputs()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiIO& io = g.IO;
+
+ // Mouse Wheel swapping flag
+ // As a standard behavior holding SHIFT while using Vertical Mouse Wheel triggers Horizontal scroll instead
+ // - We avoid doing it on OSX as it the OS input layer handles this already.
+ // - FIXME: However this means when running on OSX over Emscripten, Shift+WheelY will incur two swapping (1 in OS, 1 here), canceling the feature.
+ // - FIXME: When we can distinguish e.g. touchpad scroll events from mouse ones, we'll set this accordingly based on input source.
+ io.MouseWheelRequestAxisSwap = io.KeyShift && !io.ConfigMacOSXBehaviors;
+
+ // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well)
+ if (IsMousePosValid(&io.MousePos))
+ io.MousePos = g.MouseLastValidPos = ImFloor(io.MousePos);
+
+ // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta
+ if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev))
+ io.MouseDelta = io.MousePos - io.MousePosPrev;
+ else
+ io.MouseDelta = ImVec2(0.0f, 0.0f);
+
+ // Update stationary timer.
+ // FIXME: May need to rework again to have some tolerance for occasional small movement, while being functional on high-framerates.
+ const float mouse_stationary_threshold = (io.MouseSource == ImGuiMouseSource_Mouse) ? 2.0f : 3.0f; // Slightly higher threshold for ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen, may need rework.
+ const bool mouse_stationary = (ImLengthSqr(io.MouseDelta) <= mouse_stationary_threshold * mouse_stationary_threshold);
+ g.MouseStationaryTimer = mouse_stationary ? (g.MouseStationaryTimer + io.DeltaTime) : 0.0f;
+ //IMGUI_DEBUG_LOG("%.4f\n", g.MouseStationaryTimer);
+
+ // If mouse moved we re-enable mouse hovering in case it was disabled by keyboard/gamepad. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true.
+ if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f)
+ g.NavHighlightItemUnderNav = false;
+
+ for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
+ {
+ io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f;
+ io.MouseClickedCount[i] = 0; // Will be filled below
+ io.MouseReleased[i] = !io.MouseDown[i] && io.MouseDownDuration[i] >= 0.0f;
+ if (io.MouseReleased[i])
+ io.MouseReleasedTime[i] = g.Time;
+ io.MouseDownDurationPrev[i] = io.MouseDownDuration[i];
+ io.MouseDownDuration[i] = io.MouseDown[i] ? (io.MouseDownDuration[i] < 0.0f ? 0.0f : io.MouseDownDuration[i] + io.DeltaTime) : -1.0f;
+ if (io.MouseClicked[i])
+ {
+ bool is_repeated_click = false;
+ if ((float)(g.Time - io.MouseClickedTime[i]) < io.MouseDoubleClickTime)
+ {
+ ImVec2 delta_from_click_pos = IsMousePosValid(&io.MousePos) ? (io.MousePos - io.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f);
+ if (ImLengthSqr(delta_from_click_pos) < io.MouseDoubleClickMaxDist * io.MouseDoubleClickMaxDist)
+ is_repeated_click = true;
+ }
+ if (is_repeated_click)
+ io.MouseClickedLastCount[i]++;
+ else
+ io.MouseClickedLastCount[i] = 1;
+ io.MouseClickedTime[i] = g.Time;
+ io.MouseClickedPos[i] = io.MousePos;
+ io.MouseClickedCount[i] = io.MouseClickedLastCount[i];
+ io.MouseDragMaxDistanceSqr[i] = 0.0f;
+ }
+ else if (io.MouseDown[i])
+ {
+ // Maintain the maximum distance we reaching from the initial click position, which is used with dragging threshold
+ float delta_sqr_click_pos = IsMousePosValid(&io.MousePos) ? ImLengthSqr(io.MousePos - io.MouseClickedPos[i]) : 0.0f;
+ io.MouseDragMaxDistanceSqr[i] = ImMax(io.MouseDragMaxDistanceSqr[i], delta_sqr_click_pos);
+ }
+
+ // We provide io.MouseDoubleClicked[] as a legacy service
+ io.MouseDoubleClicked[i] = (io.MouseClickedCount[i] == 2);
+
+ // Clicking any mouse button reactivate mouse hovering which may have been deactivated by keyboard/gamepad navigation
+ if (io.MouseClicked[i])
+ g.NavHighlightItemUnderNav = false;
+ }
+}
+
+static void LockWheelingWindow(ImGuiWindow* window, float wheel_amount)
+{
+ ImGuiContext& g = *GImGui;
+ if (window)
+ g.WheelingWindowReleaseTimer = ImMin(g.WheelingWindowReleaseTimer + ImAbs(wheel_amount) * WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER, WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER);
+ else
+ g.WheelingWindowReleaseTimer = 0.0f;
+ if (g.WheelingWindow == window)
+ return;
+ IMGUI_DEBUG_LOG_IO("[io] LockWheelingWindow() \"%s\"\n", window ? window->Name : "NULL");
+ g.WheelingWindow = window;
+ g.WheelingWindowRefMousePos = g.IO.MousePos;
+ if (window == NULL)
+ {
+ g.WheelingWindowStartFrame = -1;
+ g.WheelingAxisAvg = ImVec2(0.0f, 0.0f);
+ }
+}
+
+static ImGuiWindow* FindBestWheelingWindow(const ImVec2& wheel)
+{
+ // For each axis, find window in the hierarchy that may want to use scrolling
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* windows[2] = { NULL, NULL };
+ for (int axis = 0; axis < 2; axis++)
+ if (wheel[axis] != 0.0f)
+ for (ImGuiWindow* window = windows[axis] = g.HoveredWindow; window->Flags & ImGuiWindowFlags_ChildWindow; window = windows[axis] = window->ParentWindow)
+ {
+ // Bubble up into parent window if:
+ // - a child window doesn't allow any scrolling.
+ // - a child window has the ImGuiWindowFlags_NoScrollWithMouse flag.
+ //// - a child window doesn't need scrolling because it is already at the edge for the direction we are going in (FIXME-WIP)
+ const bool has_scrolling = (window->ScrollMax[axis] != 0.0f);
+ const bool inputs_disabled = (window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs);
+ //const bool scrolling_past_limits = (wheel_v < 0.0f) ? (window->Scroll[axis] <= 0.0f) : (window->Scroll[axis] >= window->ScrollMax[axis]);
+ if (has_scrolling && !inputs_disabled) // && !scrolling_past_limits)
+ break; // select this window
+ }
+ if (windows[0] == NULL && windows[1] == NULL)
+ return NULL;
+
+ // If there's only one window or only one axis then there's no ambiguity
+ if (windows[0] == windows[1] || windows[0] == NULL || windows[1] == NULL)
+ return windows[1] ? windows[1] : windows[0];
+
+ // If candidate are different windows we need to decide which one to prioritize
+ // - First frame: only find a winner if one axis is zero.
+ // - Subsequent frames: only find a winner when one is more than the other.
+ if (g.WheelingWindowStartFrame == -1)
+ g.WheelingWindowStartFrame = g.FrameCount;
+ if ((g.WheelingWindowStartFrame == g.FrameCount && wheel.x != 0.0f && wheel.y != 0.0f) || (g.WheelingAxisAvg.x == g.WheelingAxisAvg.y))
+ {
+ g.WheelingWindowWheelRemainder = wheel;
+ return NULL;
+ }
+ return (g.WheelingAxisAvg.x > g.WheelingAxisAvg.y) ? windows[0] : windows[1];
+}
+
+// Called by NewFrame()
+void ImGui::UpdateMouseWheel()
+{
+ // Reset the locked window if we move the mouse or after the timer elapses.
+ // FIXME: Ideally we could refactor to have one timer for "changing window w/ same axis" and a shorter timer for "changing window or axis w/ other axis" (#3795)
+ ImGuiContext& g = *GImGui;
+ if (g.WheelingWindow != NULL)
+ {
+ g.WheelingWindowReleaseTimer -= g.IO.DeltaTime;
+ if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold)
+ g.WheelingWindowReleaseTimer = 0.0f;
+ if (g.WheelingWindowReleaseTimer <= 0.0f)
+ LockWheelingWindow(NULL, 0.0f);
+ }
+
+ ImVec2 wheel;
+ wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_NoOwner) ? g.IO.MouseWheelH : 0.0f;
+ wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_NoOwner) ? g.IO.MouseWheel : 0.0f;
+
+ //IMGUI_DEBUG_LOG("MouseWheel X:%.3f Y:%.3f\n", wheel_x, wheel_y);
+ ImGuiWindow* mouse_window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow;
+ if (!mouse_window || mouse_window->Collapsed)
+ return;
+
+ // Zoom / Scale window
+ // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned.
+ if (wheel.y != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
+ {
+ LockWheelingWindow(mouse_window, wheel.y);
+ ImGuiWindow* window = mouse_window;
+ const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
+ const float scale = new_font_scale / window->FontWindowScale;
+ window->FontWindowScale = new_font_scale;
+ if (window == window->RootWindow)
+ {
+ const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
+ SetWindowPos(window, window->Pos + offset, 0);
+ window->Size = ImTrunc(window->Size * scale);
+ window->SizeFull = ImTrunc(window->SizeFull * scale);
+ }
+ return;
+ }
+ if (g.IO.KeyCtrl)
+ return;
+
+ // Mouse wheel scrolling
+ // Read about io.MouseWheelRequestAxisSwap and its issue on Mac+Emscripten in UpdateMouseInputs()
+ if (g.IO.MouseWheelRequestAxisSwap)
+ wheel = ImVec2(wheel.y, 0.0f);
+
+ // Maintain a rough average of moving magnitude on both axes
+ // FIXME: should by based on wall clock time rather than frame-counter
+ g.WheelingAxisAvg.x = ImExponentialMovingAverage(g.WheelingAxisAvg.x, ImAbs(wheel.x), 30);
+ g.WheelingAxisAvg.y = ImExponentialMovingAverage(g.WheelingAxisAvg.y, ImAbs(wheel.y), 30);
+
+ // In the rare situation where FindBestWheelingWindow() had to defer first frame of wheeling due to ambiguous main axis, reinject it now.
+ wheel += g.WheelingWindowWheelRemainder;
+ g.WheelingWindowWheelRemainder = ImVec2(0.0f, 0.0f);
+ if (wheel.x == 0.0f && wheel.y == 0.0f)
+ return;
+
+ // Mouse wheel scrolling: find target and apply
+ // - don't renew lock if axis doesn't apply on the window.
+ // - select a main axis when both axes are being moved.
+ if (ImGuiWindow* window = (g.WheelingWindow ? g.WheelingWindow : FindBestWheelingWindow(wheel)))
+ if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
+ {
+ bool do_scroll[2] = { wheel.x != 0.0f && window->ScrollMax.x != 0.0f, wheel.y != 0.0f && window->ScrollMax.y != 0.0f };
+ if (do_scroll[ImGuiAxis_X] && do_scroll[ImGuiAxis_Y])
+ do_scroll[(g.WheelingAxisAvg.x > g.WheelingAxisAvg.y) ? ImGuiAxis_Y : ImGuiAxis_X] = false;
+ if (do_scroll[ImGuiAxis_X])
+ {
+ LockWheelingWindow(window, wheel.x);
+ float max_step = window->InnerRect.GetWidth() * 0.67f;
+ float scroll_step = ImTrunc(ImMin(2 * window->FontRefSize, max_step));
+ SetScrollX(window, window->Scroll.x - wheel.x * scroll_step);
+ g.WheelingWindowScrolledFrame = g.FrameCount;
+ }
+ if (do_scroll[ImGuiAxis_Y])
+ {
+ LockWheelingWindow(window, wheel.y);
+ float max_step = window->InnerRect.GetHeight() * 0.67f;
+ float scroll_step = ImTrunc(ImMin(5 * window->FontRefSize, max_step));
+ SetScrollY(window, window->Scroll.y - wheel.y * scroll_step);
+ g.WheelingWindowScrolledFrame = g.FrameCount;
+ }
+ }
+}
+
void ImGui::SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard)
{
ImGuiContext& g = *GImGui;
@@ -8399,19 +9772,25 @@ void ImGui::SetNextFrameWantCaptureMouse(bool want_capture_mouse)
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
static const char* GetInputSourceName(ImGuiInputSource source)
{
- const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Nav", "Clipboard" };
+ const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad" };
IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT);
return input_source_names[source];
}
+static const char* GetMouseSourceName(ImGuiMouseSource source)
+{
+ const char* mouse_source_names[] = { "Mouse", "TouchScreen", "Pen" };
+ IM_ASSERT(IM_ARRAYSIZE(mouse_source_names) == ImGuiMouseSource_COUNT && source >= 0 && source < ImGuiMouseSource_COUNT);
+ return mouse_source_names[source];
+}
static void DebugPrintInputEvent(const char* prefix, const ImGuiInputEvent* e)
{
ImGuiContext& g = *GImGui;
- if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("%s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("%s: MousePos (%.1f, %.1f)\n", prefix, e->MousePos.PosX, e->MousePos.PosY); return; }
- if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("%s: MouseButton %d %s\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up"); return; }
- if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG_IO("%s: MouseWheel (%.1f, %.1f)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY); return; }
- if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG_IO("%s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; }
- if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG_IO("%s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; }
- if (e->Type == ImGuiInputEventType_Focus) { IMGUI_DEBUG_LOG_IO("%s: AppFocused %d\n", prefix, e->AppFocused.Focused); return; }
+ if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (%.1f, %.1f) (%s)\n", prefix, e->MousePos.PosX, e->MousePos.PosY, GetMouseSourceName(e->MousePos.MouseSource)); return; }
+ if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseButton %d %s (%s)\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up", GetMouseSourceName(e->MouseButton.MouseSource)); return; }
+ if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseWheel (%.3f, %.3f) (%s)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY, GetMouseSourceName(e->MouseWheel.MouseSource)); return; }
+ if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG_IO("[io] %s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; }
+ if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG_IO("[io] %s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; }
+ if (e->Type == ImGuiInputEventType_Focus) { IMGUI_DEBUG_LOG_IO("[io] %s: AppFocused %d\n", prefix, e->AppFocused.Focused); return; }
}
#endif
@@ -8427,11 +9806,11 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
// Only trickle chars<>key when working with InputText()
// FIXME: InputText() could parse event trail?
// FIXME: Could specialize chars<>keys trickling rules for control keys (those not typically associated to characters)
- const bool trickle_interleaved_keys_and_text = (trickle_fast_inputs && g.WantTextInputNextFrame == 1);
+ const bool trickle_interleaved_nonchar_keys_and_text = (trickle_fast_inputs && g.WantTextInputNextFrame == 1);
- bool mouse_moved = false, mouse_wheeled = false, key_changed = false, text_inputted = false;
+ bool mouse_moved = false, mouse_wheeled = false, key_changed = false, key_changed_nonchar = false, text_inputted = false;
int mouse_button_changed = 0x00;
- ImBitArray<ImGuiKey_KeysData_SIZE> key_changed_mask;
+ ImBitArray<ImGuiKey_NamedKey_COUNT> key_changed_mask;
int event_n = 0;
for (; event_n < g.InputEventsQueue.Size; event_n++)
@@ -8439,11 +9818,14 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
ImGuiInputEvent* e = &g.InputEventsQueue[event_n];
if (e->Type == ImGuiInputEventType_MousePos)
{
+ if (g.IO.WantSetMousePos)
+ continue;
// Trickling Rule: Stop processing queued events if we already handled a mouse button change
ImVec2 event_pos(e->MousePos.PosX, e->MousePos.PosY);
if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted))
break;
io.MousePos = event_pos;
+ io.MouseSource = e->MousePos.MouseSource;
mouse_moved = true;
}
else if (e->Type == ImGuiInputEventType_MouseButton)
@@ -8453,7 +9835,10 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT);
if (trickle_fast_inputs && ((mouse_button_changed & (1 << button)) || mouse_wheeled))
break;
+ if (trickle_fast_inputs && e->MouseButton.MouseSource == ImGuiMouseSource_TouchScreen && mouse_moved) // #2702: TouchScreen have no initial hover.
+ break;
io.MouseDown[button] = e->MouseButton.Down;
+ io.MouseSource = e->MouseButton.MouseSource;
mouse_button_changed |= (1 << button);
}
else if (e->Type == ImGuiInputEventType_MouseWheel)
@@ -8463,46 +9848,44 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
break;
io.MouseWheelH += e->MouseWheel.WheelX;
io.MouseWheel += e->MouseWheel.WheelY;
+ io.MouseSource = e->MouseWheel.MouseSource;
mouse_wheeled = true;
}
else if (e->Type == ImGuiInputEventType_Key)
{
// Trickling Rule: Stop processing queued events if we got multiple action on the same button
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
+ continue;
ImGuiKey key = e->Key.Key;
IM_ASSERT(key != ImGuiKey_None);
ImGuiKeyData* key_data = GetKeyData(key);
const int key_data_index = (int)(key_data - g.IO.KeysData);
- if (trickle_fast_inputs && key_data->Down != e->Key.Down && (key_changed_mask.TestBit(key_data_index) || text_inputted || mouse_button_changed != 0))
+ if (trickle_fast_inputs && key_data->Down != e->Key.Down && (key_changed_mask.TestBit(key_data_index) || mouse_button_changed != 0))
break;
+
+ const bool key_is_potentially_for_char_input = IsKeyChordPotentiallyCharInput(GetMergedModsFromKeys() | key);
+ if (trickle_interleaved_nonchar_keys_and_text && (text_inputted && !key_is_potentially_for_char_input))
+ break;
+
key_data->Down = e->Key.Down;
key_data->AnalogValue = e->Key.AnalogValue;
key_changed = true;
key_changed_mask.SetBit(key_data_index);
-
- if (key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super)
- {
- if (key == ImGuiMod_Ctrl) { io.KeyCtrl = key_data->Down; }
- if (key == ImGuiMod_Shift) { io.KeyShift = key_data->Down; }
- if (key == ImGuiMod_Alt) { io.KeyAlt = key_data->Down; }
- if (key == ImGuiMod_Super) { io.KeySuper = key_data->Down; }
- io.KeyMods = GetMergedModsFromBools();
- }
-
- // Allow legacy code using io.KeysDown[GetKeyIndex()] with new backends
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- io.KeysDown[key_data_index] = key_data->Down;
- if (io.KeyMap[key_data_index] != -1)
- io.KeysDown[io.KeyMap[key_data_index]] = key_data->Down;
-#endif
+ if (trickle_interleaved_nonchar_keys_and_text && !key_is_potentially_for_char_input)
+ key_changed_nonchar = true;
}
else if (e->Type == ImGuiInputEventType_Text)
{
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard)
+ continue;
// Trickling Rule: Stop processing queued events if keys/mouse have been interacted with
- if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled))
+ if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_moved || mouse_wheeled))
+ break;
+ if (trickle_interleaved_nonchar_keys_and_text && key_changed_nonchar)
break;
unsigned int c = e->Text.Char;
io.InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID);
- if (trickle_interleaved_keys_and_text)
+ if (trickle_interleaved_nonchar_keys_and_text)
text_inputted = true;
}
else if (e->Type == ImGuiInputEventType_Focus)
@@ -8541,21 +9924,24 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
// - we clear in EndFrame() and not now in order allow application/user code polling this flag
// (e.g. custom backend may want to clear additional data, custom widgets may want to react with a "canceling" event).
if (g.IO.AppFocusLost)
+ {
g.IO.ClearInputKeys();
+ g.IO.ClearInputMouse();
+ }
}
ImGuiID ImGui::GetKeyOwner(ImGuiKey key)
{
- if (!IsNamedKeyOrModKey(key))
- return ImGuiKeyOwner_None;
+ if (!IsNamedKeyOrMod(key))
+ return ImGuiKeyOwner_NoOwner;
ImGuiContext& g = *GImGui;
- ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key);
+ ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
ImGuiID owner_id = owner_data->OwnerCurr;
if (g.ActiveIdUsingAllKeyboardKeys && owner_id != g.ActiveId && owner_id != ImGuiKeyOwner_Any)
if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END)
- return ImGuiKeyOwner_None;
+ return ImGuiKeyOwner_NoOwner;
return owner_id;
}
@@ -8566,7 +9952,7 @@ ImGuiID ImGui::GetKeyOwner(ImGuiKey key)
// All paths are also testing for key not being locked, for the rare cases that key have been locked with using ImGuiInputFlags_LockXXX flags.
bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id)
{
- if (!IsNamedKeyOrModKey(key))
+ if (!IsNamedKeyOrMod(key))
return true;
ImGuiContext& g = *GImGui;
@@ -8574,7 +9960,7 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id)
if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END)
return false;
- ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key);
+ ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
if (owner_id == ImGuiKeyOwner_Any)
return (owner_data->LockThisFrame == false);
@@ -8585,7 +9971,7 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id)
{
if (owner_data->LockThisFrame)
return false;
- if (owner_data->OwnerCurr != ImGuiKeyOwner_None)
+ if (owner_data->OwnerCurr != ImGuiKeyOwner_NoOwner)
return false;
}
@@ -8599,10 +9985,12 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id)
// - SetKeyOwner(..., Any or None, Lock) : set lock
void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
{
- IM_ASSERT(IsNamedKeyOrModKey(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it)
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(IsNamedKeyOrMod(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it)
IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetKeyOwner) == 0); // Passing flags not supported by this function!
+ //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X, flags=%08X)\n", GetKeyName(key), owner_id, flags);
- ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key);
+ ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
owner_data->OwnerCurr = owner_data->OwnerNext = owner_id;
// We cannot lock by default as it would likely break lots of legacy code.
@@ -8611,6 +9999,16 @@ void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
owner_data->LockThisFrame = (flags & ImGuiInputFlags_LockThisFrame) != 0 || (owner_data->LockUntilRelease);
}
+// Rarely used helper
+void ImGui::SetKeyOwnersForKeyChord(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
+{
+ if (key_chord & ImGuiMod_Ctrl) { SetKeyOwner(ImGuiMod_Ctrl, owner_id, flags); }
+ if (key_chord & ImGuiMod_Shift) { SetKeyOwner(ImGuiMod_Shift, owner_id, flags); }
+ if (key_chord & ImGuiMod_Alt) { SetKeyOwner(ImGuiMod_Alt, owner_id, flags); }
+ if (key_chord & ImGuiMod_Super) { SetKeyOwner(ImGuiMod_Super, owner_id, flags); }
+ if (key_chord & ~ImGuiMod_Mask_) { SetKeyOwner((ImGuiKey)(key_chord & ~ImGuiMod_Mask_), owner_id, flags); }
+}
+
// This is more or less equivalent to:
// if (IsItemHovered() || IsItemActive())
// SetKeyOwner(key, GetItemID());
@@ -8632,57 +10030,142 @@ void ImGui::SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags)
}
}
-// - Need to decide how to handle shortcut translations for Non-Mac <> Mac
-// - Ideas: https://github.com/ocornut/imgui/issues/456#issuecomment-264390864
-bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
+void ImGui::SetItemKeyOwner(ImGuiKey key)
{
- ImGuiContext& g = *GImGui;
+ SetItemKeyOwner(key, ImGuiInputFlags_None);
+}
- // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any.
- if ((flags & ImGuiInputFlags_RouteMask_) == 0)
- flags |= ImGuiInputFlags_RouteFocused;
- if (!SetShortcutRouting(key_chord, owner_id, flags))
- return false;
+// This is the only public API until we expose owner_id versions of the API as replacements.
+bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord)
+{
+ return IsKeyChordPressed(key_chord, ImGuiInputFlags_None, ImGuiKeyOwner_Any);
+}
- ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
+// This is equivalent to comparing KeyMods + doing a IsKeyPressed()
+bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id)
+{
+ ImGuiContext& g = *GImGui;
+ key_chord = FixupKeyChord(key_chord);
ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_);
if (g.IO.KeyMods != mods)
return false;
// Special storage location for mods
+ ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_);
if (key == ImGuiKey_None)
key = ConvertSingleModFlagToKey(mods);
+ if (!IsKeyPressed(key, (flags & ImGuiInputFlags_RepeatMask_), owner_id))
+ return false;
+ return true;
+}
+
+void ImGui::SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasShortcut;
+ g.NextItemData.Shortcut = key_chord;
+ g.NextItemData.ShortcutFlags = flags;
+}
+
+// Called from within ItemAdd: at this point we can read from NextItemData and write to LastItemData
+void ImGui::ItemHandleShortcut(ImGuiID id)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiInputFlags flags = g.NextItemData.ShortcutFlags;
+ IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetNextItemShortcut) == 0); // Passing flags not supported by SetNextItemShortcut()!
- if (!IsKeyPressed(key, owner_id, (flags & (ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_))))
+ if (g.LastItemData.ItemFlags & ImGuiItemFlags_Disabled)
+ return;
+ if (flags & ImGuiInputFlags_Tooltip)
+ {
+ g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasShortcut;
+ g.LastItemData.Shortcut = g.NextItemData.Shortcut;
+ }
+ if (!Shortcut(g.NextItemData.Shortcut, flags & ImGuiInputFlags_SupportedByShortcut, id) || g.NavActivateId != 0)
+ return;
+
+ // FIXME: Generalize Activation queue?
+ g.NavActivateId = id; // Will effectively disable clipping.
+ g.NavActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_FromShortcut;
+ //if (g.ActiveId == 0 || g.ActiveId == id)
+ g.NavActivateDownId = g.NavActivatePressedId = id;
+ NavHighlightActivated(id);
+}
+
+bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags)
+{
+ return Shortcut(key_chord, flags, ImGuiKeyOwner_Any);
+}
+
+bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id)
+{
+ ImGuiContext& g = *GImGui;
+ //IMGUI_DEBUG_LOG("Shortcut(%s, flags=%X, owner_id=0x%08X)\n", GetKeyChordName(key_chord, g.TempBuffer.Data, g.TempBuffer.Size), flags, owner_id);
+
+ // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any.
+ if ((flags & ImGuiInputFlags_RouteTypeMask_) == 0)
+ flags |= ImGuiInputFlags_RouteFocused;
+
+ // Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default)
+ // Effectively makes Shortcut() always input-owner aware.
+ if (owner_id == ImGuiKeyOwner_Any || owner_id == ImGuiKeyOwner_NoOwner)
+ owner_id = GetRoutingIdFromOwnerId(owner_id);
+
+ if (g.CurrentItemFlags & ImGuiItemFlags_Disabled)
return false;
- IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function!
+ // Submit route
+ if (!SetShortcutRouting(key_chord, flags, owner_id))
+ return false;
+
+ // Default repeat behavior for Shortcut()
+ // So e.g. pressing Ctrl+W and releasing Ctrl while holding W will not trigger the W shortcut.
+ if ((flags & ImGuiInputFlags_Repeat) != 0 && (flags & ImGuiInputFlags_RepeatUntilMask_) == 0)
+ flags |= ImGuiInputFlags_RepeatUntilKeyModsChange;
+
+ if (!IsKeyChordPressed(key_chord, flags, owner_id))
+ return false;
+
+ // Claim mods during the press
+ SetKeyOwnersForKeyChord(key_chord & ImGuiMod_Mask_, owner_id);
+
+ IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function!
return true;
}
-
//-----------------------------------------------------------------------------
-// [SECTION] ERROR CHECKING
+// [SECTION] ERROR CHECKING, STATE RECOVERY
+//-----------------------------------------------------------------------------
+// - DebugCheckVersionAndDataLayout() (called via IMGUI_CHECKVERSION() macros)
+// - ErrorCheckUsingSetCursorPosToExtendParentBoundaries()
+// - ErrorCheckNewFrameSanityChecks()
+// - ErrorCheckEndFrameSanityChecks()
+// - ErrorRecoveryStoreState()
+// - ErrorRecoveryTryToRecoverState()
+// - ErrorRecoveryTryToRecoverWindowState()
+// - ErrorLog()
//-----------------------------------------------------------------------------
-// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui.
+// Verify ABI compatibility between caller code and compiled version of Dear ImGui. This helps detects some build issues.
+// Called by IMGUI_CHECKVERSION().
// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit
-// If this triggers you have an issue:
-// - Most commonly: mismatched headers and compiled code version.
-// - Or: mismatched configuration #define, compilation settings, packing pragma etc.
-// The configuration settings mentioned in imconfig.h must be set for all compilation units involved with Dear ImGui,
-// which is way it is required you put them in your imconfig file (and not just before including imgui.h).
-// Otherwise it is possible that different compilation units would see different structure layout
+// If this triggers you have mismatched headers and compiled code versions.
+// - It could be because of a build issue (using new headers with old compiled code)
+// - It could be because of mismatched configuration #define, compilation settings, packing pragma etc.
+// THE CONFIGURATION SETTINGS MENTIONED IN imconfig.h MUST BE SET FOR ALL COMPILATION UNITS INVOLVED WITH DEAR IMGUI.
+// Which is why it is required you put them in your imconfig file (and NOT only before including imgui.h).
+// Otherwise it is possible that different compilation units would see different structure layout.
+// If you don't want to modify imconfig.h you can use the IMGUI_USER_CONFIG define to change filename.
bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx)
{
bool error = false;
if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); }
- if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); }
+ if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); }
if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); }
- if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
- if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
- if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
- if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
+ if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
+ if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
+ if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
+ if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
return !error;
}
@@ -8730,6 +10213,13 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
// #define IM_ASSERT(EXPR) do { if (SomeCode(EXPR)) SomeMoreCode(); } while (0) // Correct!
if (true) IM_ASSERT(1); else IM_ASSERT(0);
+ // Emscripten backends are often imprecise in their submission of DeltaTime. (#6114, #3644)
+ // Ideally the Emscripten app/backend should aim to fix or smooth this value and avoid feeding zero, but we tolerate it.
+#ifdef __EMSCRIPTEN__
+ if (g.IO.DeltaTime <= 0.0f && g.FrameCount > 0)
+ g.IO.DeltaTime = 0.00001f;
+#endif
+
// Check user data
// (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument)
IM_ASSERT(g.Initialized);
@@ -8740,264 +10230,346 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!");
IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!");
IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations
- IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting.");
+ IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting!");
+ IM_ASSERT(g.Style.WindowBorderHoverPadding > 0.0f && "Invalid style setting!"); // Required otherwise cannot resize from borders.
IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right);
IM_ASSERT(g.Style.ColorButtonPosition == ImGuiDir_Left || g.Style.ColorButtonPosition == ImGuiDir_Right);
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++)
- IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < ImGuiKey_LegacyNativeKey_END && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)");
- // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP)
- if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1)
- IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation.");
-#endif
+ // Error handling: we do not accept 100% silent recovery! Please contact me if you feel this is getting in your way.
+ if (g.IO.ConfigErrorRecovery)
+ IM_ASSERT(g.IO.ConfigErrorRecoveryEnableAssert || g.IO.ConfigErrorRecoveryEnableDebugLog || g.IO.ConfigErrorRecoveryEnableTooltip || g.ErrorCallback != NULL);
- // Check: the io.ConfigWindowsResizeFromEdges option requires backend to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly.
- if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors))
- g.IO.ConfigWindowsResizeFromEdges = false;
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ // Remap legacy names
+ if (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos)
+ {
+ g.IO.ConfigNavMoveSetMousePos = true;
+ g.IO.ConfigFlags &= ~ImGuiConfigFlags_NavEnableSetMousePos;
+ }
+ if (g.IO.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard)
+ {
+ g.IO.ConfigNavCaptureKeyboard = false;
+ g.IO.ConfigFlags &= ~ImGuiConfigFlags_NavNoCaptureKeyboard;
+ }
+
+ // Remap legacy clipboard handlers (OBSOLETED in 1.91.1, August 2024)
+ if (g.IO.GetClipboardTextFn != NULL && (g.PlatformIO.Platform_GetClipboardTextFn == NULL || g.PlatformIO.Platform_GetClipboardTextFn == Platform_GetClipboardTextFn_DefaultImpl))
+ g.PlatformIO.Platform_GetClipboardTextFn = [](ImGuiContext* ctx) { return ctx->IO.GetClipboardTextFn(ctx->IO.ClipboardUserData); };
+ if (g.IO.SetClipboardTextFn != NULL && (g.PlatformIO.Platform_SetClipboardTextFn == NULL || g.PlatformIO.Platform_SetClipboardTextFn == Platform_SetClipboardTextFn_DefaultImpl))
+ g.PlatformIO.Platform_SetClipboardTextFn = [](ImGuiContext* ctx, const char* text) { return ctx->IO.SetClipboardTextFn(ctx->IO.ClipboardUserData, text); };
+#endif
}
static void ImGui::ErrorCheckEndFrameSanityChecks()
{
- ImGuiContext& g = *GImGui;
-
// Verify that io.KeyXXX fields haven't been tampered with. Key mods should not be modified between NewFrame() and EndFrame()
// One possible reason leading to this assert is that your backends update inputs _AFTER_ NewFrame().
// It is known that when some modal native windows called mid-frame takes focus away, some backends such as GLFW will
// send key release events mid-frame. This would normally trigger this assertion and lead to sheared inputs.
- // We silently accommodate for this case by ignoring/ the case where all io.KeyXXX modifiers were released (aka key_mod_flags == 0),
+ // We silently accommodate for this case by ignoring the case where all io.KeyXXX modifiers were released (aka key_mod_flags == 0),
// while still correctly asserting on mid-frame key press events.
- const ImGuiKeyChord key_mods = GetMergedModsFromBools();
+ ImGuiContext& g = *GImGui;
+ const ImGuiKeyChord key_mods = GetMergedModsFromKeys();
+ IM_UNUSED(g);
+ IM_UNUSED(key_mods);
IM_ASSERT((key_mods == 0 || g.IO.KeyMods == key_mods) && "Mismatching io.KeyCtrl/io.KeyShift/io.KeyAlt/io.KeySuper vs io.KeyMods");
IM_UNUSED(key_mods);
- // [EXPERIMENTAL] Recover from errors: You may call this yourself before EndFrame().
- //ErrorCheckEndFrameRecover();
-
- // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you
- // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API).
- if (g.CurrentWindowStack.Size != 1)
- {
- if (g.CurrentWindowStack.Size > 1)
- {
- IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?");
- while (g.CurrentWindowStack.Size > 1)
- End();
- }
- else
- {
- IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?");
- }
- }
+ IM_ASSERT(g.CurrentWindowStack.Size == 1);
+ IM_ASSERT(g.CurrentWindowStack[0].Window->IsFallbackWindow);
+}
- IM_ASSERT_USER_ERROR(g.GroupStack.Size == 0, "Missing EndGroup call!");
+// Save current stack sizes. Called e.g. by NewFrame() and by Begin() but may be called for manual recovery.
+void ImGui::ErrorRecoveryStoreState(ImGuiErrorRecoveryState* state_out)
+{
+ ImGuiContext& g = *GImGui;
+ state_out->SizeOfWindowStack = (short)g.CurrentWindowStack.Size;
+ state_out->SizeOfIDStack = (short)g.CurrentWindow->IDStack.Size;
+ state_out->SizeOfTreeStack = (short)g.CurrentWindow->DC.TreeDepth; // NOT g.TreeNodeStack.Size which is a partial stack!
+ state_out->SizeOfColorStack = (short)g.ColorStack.Size;
+ state_out->SizeOfStyleVarStack = (short)g.StyleVarStack.Size;
+ state_out->SizeOfFontStack = (short)g.FontStack.Size;
+ state_out->SizeOfFocusScopeStack = (short)g.FocusScopeStack.Size;
+ state_out->SizeOfGroupStack = (short)g.GroupStack.Size;
+ state_out->SizeOfItemFlagsStack = (short)g.ItemFlagsStack.Size;
+ state_out->SizeOfBeginPopupStack = (short)g.BeginPopupStack.Size;
+ state_out->SizeOfDisabledStack = (short)g.DisabledStackSize;
}
-// Experimental recovery from incorrect usage of BeginXXX/EndXXX/PushXXX/PopXXX calls.
-// Must be called during or before EndFrame().
-// This is generally flawed as we are not necessarily End/Popping things in the right order.
-// FIXME: Can't recover from inside BeginTabItem/EndTabItem yet.
-// FIXME: Can't recover from interleaved BeginTabBar/Begin
-void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data)
+// Chosen name "Try to recover" over e.g. "Restore" to suggest this is not a 100% guaranteed recovery.
+// Called by e.g. EndFrame() but may be called for manual recovery.
+// Attempt to recover full window stack.
+void ImGui::ErrorRecoveryTryToRecoverState(const ImGuiErrorRecoveryState* state_in)
{
// PVS-Studio V1044 is "Loop break conditions do not depend on the number of iterations"
ImGuiContext& g = *GImGui;
- while (g.CurrentWindowStack.Size > 0) //-V1044
+ while (g.CurrentWindowStack.Size > state_in->SizeOfWindowStack) //-V1044
{
- ErrorCheckEndWindowRecover(log_callback, user_data);
+ // Recap:
+ // - Begin()/BeginChild() return false to indicate the window is collapsed or fully clipped.
+ // - Always call a matching End() for each Begin() call, regardless of its return value!
+ // - Begin/End and BeginChild/EndChild logic is KNOWN TO BE INCONSISTENT WITH ALL OTHER BEGIN/END FUNCTIONS.
+ // - We will fix that in a future major update.
ImGuiWindow* window = g.CurrentWindow;
- if (g.CurrentWindowStack.Size == 1)
- {
- IM_ASSERT(window->IsFallbackWindow);
- break;
- }
if (window->Flags & ImGuiWindowFlags_ChildWindow)
{
- if (log_callback) log_callback(user_data, "Recovered from missing EndChild() for '%s'", window->Name);
- EndChild();
+ if (g.CurrentTable != NULL && g.CurrentTable->InnerWindow == g.CurrentWindow)
+ {
+ IM_ASSERT_USER_ERROR(0, "Missing EndTable()");
+ EndTable();
+ }
+ else
+ {
+ IM_ASSERT_USER_ERROR(0, "Missing EndChild()");
+ EndChild();
+ }
}
else
{
- if (log_callback) log_callback(user_data, "Recovered from missing End() for '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing End()");
End();
}
}
+ if (g.CurrentWindowStack.Size == state_in->SizeOfWindowStack)
+ ErrorRecoveryTryToRecoverWindowState(state_in);
}
-// Must be called before End()/EndChild()
-void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data)
+// Called by e.g. End() but may be called for manual recovery.
+// Read '// Error Handling [BETA]' block in imgui_internal.h for details.
+// Attempt to recover from incorrect usage of BeginXXX/EndXXX/PushXXX/PopXXX calls.
+void ImGui::ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryState* state_in)
{
ImGuiContext& g = *GImGui;
- while (g.CurrentTable && (g.CurrentTable->OuterWindow == g.CurrentWindow || g.CurrentTable->InnerWindow == g.CurrentWindow))
+
+ while (g.CurrentTable != NULL && g.CurrentTable->InnerWindow == g.CurrentWindow) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing EndTable() in '%s'", g.CurrentTable->OuterWindow->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing EndTable()");
EndTable();
}
ImGuiWindow* window = g.CurrentWindow;
- ImGuiStackSizes* stack_sizes = &g.CurrentWindowStack.back().StackSizesOnBegin;
- IM_ASSERT(window != NULL);
- while (g.CurrentTabBar != NULL) //-V1044
+
+ // FIXME: Can't recover from inside BeginTabItem/EndTabItem yet.
+ while (g.CurrentTabBar != NULL && g.CurrentTabBar->Window == window) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing EndTabBar() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing EndTabBar()");
EndTabBar();
}
- while (window->DC.TreeDepth > 0)
+ while (g.CurrentMultiSelect != NULL && g.CurrentMultiSelect->Storage->Window == window) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing TreePop() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing EndMultiSelect()");
+ EndMultiSelect();
+ }
+ if (window->DC.MenuBarAppending) //-V1044
+ {
+ IM_ASSERT_USER_ERROR(0, "Missing EndMenuBar()");
+ EndMenuBar();
+ }
+ while (window->DC.TreeDepth > state_in->SizeOfTreeStack) //-V1044
+ {
+ IM_ASSERT_USER_ERROR(0, "Missing TreePop()");
TreePop();
}
- while (g.GroupStack.Size > stack_sizes->SizeOfGroupStack) //-V1044
+ while (g.GroupStack.Size > state_in->SizeOfGroupStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing EndGroup() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing EndGroup()");
EndGroup();
}
- while (window->IDStack.Size > 1)
+ IM_ASSERT(g.GroupStack.Size == state_in->SizeOfGroupStack);
+ while (window->IDStack.Size > state_in->SizeOfIDStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing PopID() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing PopID()");
PopID();
}
- while (g.DisabledStackSize > stack_sizes->SizeOfDisabledStack) //-V1044
+ while (g.DisabledStackSize > state_in->SizeOfDisabledStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing EndDisabled() in '%s'", window->Name);
- EndDisabled();
+ IM_ASSERT_USER_ERROR(0, "Missing EndDisabled()");
+ if (g.CurrentItemFlags & ImGuiItemFlags_Disabled)
+ EndDisabled();
+ else
+ {
+ EndDisabledOverrideReenable();
+ g.CurrentWindowStack.back().DisabledOverrideReenable = false;
+ }
}
- while (g.ColorStack.Size > stack_sizes->SizeOfColorStack)
+ IM_ASSERT(g.DisabledStackSize == state_in->SizeOfDisabledStack);
+ while (g.ColorStack.Size > state_in->SizeOfColorStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing PopStyleColor() in '%s' for ImGuiCol_%s", window->Name, GetStyleColorName(g.ColorStack.back().Col));
+ IM_ASSERT_USER_ERROR(0, "Missing PopStyleColor()");
PopStyleColor();
}
- while (g.ItemFlagsStack.Size > stack_sizes->SizeOfItemFlagsStack) //-V1044
+ while (g.ItemFlagsStack.Size > state_in->SizeOfItemFlagsStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing PopItemFlag() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing PopItemFlag()");
PopItemFlag();
}
- while (g.StyleVarStack.Size > stack_sizes->SizeOfStyleVarStack) //-V1044
+ while (g.StyleVarStack.Size > state_in->SizeOfStyleVarStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing PopStyleVar() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing PopStyleVar()");
PopStyleVar();
}
- while (g.FocusScopeStack.Size > stack_sizes->SizeOfFocusScopeStack + 1) //-V1044
+ while (g.FontStack.Size > state_in->SizeOfFontStack) //-V1044
+ {
+ IM_ASSERT_USER_ERROR(0, "Missing PopFont()");
+ PopFont();
+ }
+ while (g.FocusScopeStack.Size > state_in->SizeOfFocusScopeStack) //-V1044
{
- if (log_callback) log_callback(user_data, "Recovered from missing PopFocusScope() in '%s'", window->Name);
+ IM_ASSERT_USER_ERROR(0, "Missing PopFocusScope()");
PopFocusScope();
}
+ //IM_ASSERT(g.FocusScopeStack.Size == state_in->SizeOfFocusScopeStack);
}
-// Save current stack sizes for later compare
-void ImGuiStackSizes::SetToCurrentState()
+bool ImGui::ErrorLog(const char* msg)
{
ImGuiContext& g = *GImGui;
+
+ // Output to debug log
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
ImGuiWindow* window = g.CurrentWindow;
- SizeOfIDStack = (short)window->IDStack.Size;
- SizeOfColorStack = (short)g.ColorStack.Size;
- SizeOfStyleVarStack = (short)g.StyleVarStack.Size;
- SizeOfFontStack = (short)g.FontStack.Size;
- SizeOfFocusScopeStack = (short)g.FocusScopeStack.Size;
- SizeOfGroupStack = (short)g.GroupStack.Size;
- SizeOfItemFlagsStack = (short)g.ItemFlagsStack.Size;
- SizeOfBeginPopupStack = (short)g.BeginPopupStack.Size;
- SizeOfDisabledStack = (short)g.DisabledStackSize;
+
+ if (g.IO.ConfigErrorRecoveryEnableDebugLog)
+ {
+ if (g.ErrorFirst)
+ IMGUI_DEBUG_LOG_ERROR("[imgui-error] (current settings: Assert=%d, Log=%d, Tooltip=%d)\n",
+ g.IO.ConfigErrorRecoveryEnableAssert, g.IO.ConfigErrorRecoveryEnableDebugLog, g.IO.ConfigErrorRecoveryEnableTooltip);
+ IMGUI_DEBUG_LOG_ERROR("[imgui-error] In window '%s': %s\n", window ? window->Name : "NULL", msg);
+ }
+ g.ErrorFirst = false;
+
+ // Output to tooltip
+ if (g.IO.ConfigErrorRecoveryEnableTooltip)
+ {
+ if (g.WithinFrameScope && BeginErrorTooltip())
+ {
+ if (g.ErrorCountCurrentFrame < 20)
+ {
+ Text("In window '%s': %s", window ? window->Name : "NULL", msg);
+ if (window && (!window->IsFallbackWindow || window->WasActive))
+ GetForegroundDrawList(window)->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 0, 0, 255));
+ }
+ if (g.ErrorCountCurrentFrame == 20)
+ Text("(and more errors)");
+ // EndFrame() will amend debug buttons to this window, after all errors have been submitted.
+ EndErrorTooltip();
+ }
+ g.ErrorCountCurrentFrame++;
+ }
+#endif
+
+ // Output to callback
+ if (g.ErrorCallback != NULL)
+ g.ErrorCallback(&g, g.ErrorCallbackUserData, msg);
+
+ // Return whether we should assert
+ return g.IO.ConfigErrorRecoveryEnableAssert;
}
-// Compare to detect usage errors
-void ImGuiStackSizes::CompareWithCurrentState()
+void ImGui::ErrorCheckEndFrameFinalizeErrorTooltip()
{
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- IM_UNUSED(window);
+ if (g.DebugDrawIdConflicts != 0 && g.IO.KeyCtrl == false)
+ g.DebugDrawIdConflictsCount = g.HoveredIdPreviousFrameItemCount;
+ if (g.DebugDrawIdConflicts != 0 && g.DebugItemPickerActive == false && BeginErrorTooltip())
+ {
+ Text("Programmer error: %d visible items with conflicting ID!", g.DebugDrawIdConflictsCount);
+ BulletText("Code should use PushID()/PopID() in loops, or append \"##xx\" to same-label identifiers!");
+ BulletText("Empty label e.g. Button(\"\") == same ID as parent widget/node. Use Button(\"##xx\") instead!");
+ //BulletText("Code intending to use duplicate ID may use e.g. PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true); ... PopItemFlag()"); // Not making this too visible for fear of it being abused.
+ BulletText("Set io.ConfigDebugHighlightIdConflicts=false to disable this warning in non-programmers builds.");
+ Separator();
+ if (g.IO.ConfigDebugHighlightIdConflictsShowItemPicker)
+ {
+ Text("(Hold CTRL to: use ");
+ SameLine(0.0f, 0.0f);
+ if (SmallButton("Item Picker"))
+ DebugStartItemPicker();
+ SameLine(0.0f, 0.0f);
+ Text(" to break in item call-stack, or ");
+ }
+ else
+ {
+ Text("(Hold CTRL to ");
+ }
+ SameLine(0.0f, 0.0f);
+ if (SmallButton("Open FAQ->About ID Stack System") && g.PlatformIO.Platform_OpenInShellFn != NULL)
+ g.PlatformIO.Platform_OpenInShellFn(&g, "https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#qa-usage");
+ SameLine(0.0f, 0.0f);
+ Text(")");
+ EndErrorTooltip();
+ }
- // Window stacks
- // NOT checking: DC.ItemWidth, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
- IM_ASSERT(SizeOfIDStack == window->IDStack.Size && "PushID/PopID or TreeNode/TreePop Mismatch!");
+ if (g.ErrorCountCurrentFrame > 0 && BeginErrorTooltip()) // Amend at end of frame
+ {
+ Separator();
+ Text("(Hold CTRL to:");
+ SameLine();
+ if (SmallButton("Enable Asserts"))
+ g.IO.ConfigErrorRecoveryEnableAssert = true;
+ //SameLine();
+ //if (SmallButton("Hide Error Tooltips"))
+ // g.IO.ConfigErrorRecoveryEnableTooltip = false; // Too dangerous
+ SameLine(0, 0);
+ Text(")");
+ EndErrorTooltip();
+ }
+#endif
+}
- // Global stacks
- // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them.
- IM_ASSERT(SizeOfGroupStack == g.GroupStack.Size && "BeginGroup/EndGroup Mismatch!");
- IM_ASSERT(SizeOfBeginPopupStack == g.BeginPopupStack.Size && "BeginPopup/EndPopup or BeginMenu/EndMenu Mismatch!");
- IM_ASSERT(SizeOfDisabledStack == g.DisabledStackSize && "BeginDisabled/EndDisabled Mismatch!");
- IM_ASSERT(SizeOfItemFlagsStack >= g.ItemFlagsStack.Size && "PushItemFlag/PopItemFlag Mismatch!");
- IM_ASSERT(SizeOfColorStack >= g.ColorStack.Size && "PushStyleColor/PopStyleColor Mismatch!");
- IM_ASSERT(SizeOfStyleVarStack >= g.StyleVarStack.Size && "PushStyleVar/PopStyleVar Mismatch!");
- IM_ASSERT(SizeOfFontStack >= g.FontStack.Size && "PushFont/PopFont Mismatch!");
- IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!");
+// Pseudo-tooltip. Follow mouse until CTRL is held. When CTRL is held we lock position, allowing to click it.
+bool ImGui::BeginErrorTooltip()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = FindWindowByName("##Tooltip_Error");
+ const bool use_locked_pos = (g.IO.KeyCtrl && window && window->WasActive);
+ PushStyleColor(ImGuiCol_PopupBg, ImLerp(g.Style.Colors[ImGuiCol_PopupBg], ImVec4(1.0f, 0.0f, 0.0f, 1.0f), 0.15f));
+ if (use_locked_pos)
+ SetNextWindowPos(g.ErrorTooltipLockedPos);
+ bool is_visible = Begin("##Tooltip_Error", NULL, ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize);
+ PopStyleColor();
+ if (is_visible && g.CurrentWindow->BeginCount == 1)
+ {
+ SeparatorText("MESSAGE FROM DEAR IMGUI");
+ BringWindowToDisplayFront(g.CurrentWindow);
+ BringWindowToFocusFront(g.CurrentWindow);
+ g.ErrorTooltipLockedPos = GetWindowPos();
+ }
+ else if (!is_visible)
+ {
+ End();
+ }
+ return is_visible;
}
+void ImGui::EndErrorTooltip()
+{
+ End();
+}
//-----------------------------------------------------------------------------
-// [SECTION] LAYOUT
+// [SECTION] ITEM SUBMISSION
//-----------------------------------------------------------------------------
-// - ItemSize()
+// - KeepAliveID()
// - ItemAdd()
-// - SameLine()
-// - GetCursorScreenPos()
-// - SetCursorScreenPos()
-// - GetCursorPos(), GetCursorPosX(), GetCursorPosY()
-// - SetCursorPos(), SetCursorPosX(), SetCursorPosY()
-// - GetCursorStartPos()
-// - Indent()
-// - Unindent()
-// - SetNextItemWidth()
-// - PushItemWidth()
-// - PushMultiItemsWidths()
-// - PopItemWidth()
-// - CalcItemWidth()
-// - CalcItemSize()
-// - GetTextLineHeight()
-// - GetTextLineHeightWithSpacing()
-// - GetFrameHeight()
-// - GetFrameHeightWithSpacing()
-// - GetContentRegionMax()
-// - GetContentRegionMaxAbs() [Internal]
-// - GetContentRegionAvail(),
-// - GetWindowContentRegionMin(), GetWindowContentRegionMax()
-// - BeginGroup()
-// - EndGroup()
-// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns.
//-----------------------------------------------------------------------------
-// Advance cursor given item size for layout.
-// Register minimum needed size so it can extend the bounding box used for auto-fit calculation.
-// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different.
-void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
+// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID().
+void ImGui::KeepAliveID(ImGuiID id)
{
ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- if (window->SkipItems)
- return;
-
- // We increase the height in this function to accommodate for baseline offset.
- // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor,
- // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect.
- const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f;
-
- const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y;
- const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y);
-
- // Always align ourselves on pixel boundaries
- //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG]
- window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x;
- window->DC.CursorPosPrevLine.y = line_y1;
- window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line
- window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line
- window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
- window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
- //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
-
- window->DC.PrevLineSize.y = line_height;
- window->DC.CurrLineSize.y = 0.0f;
- window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y);
- window->DC.CurrLineTextBaseOffset = 0.0f;
- window->DC.IsSameLine = window->DC.IsSetPos = false;
-
- // Horizontal layout mode
- if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
- SameLine();
+ if (g.ActiveId == id)
+ g.ActiveIdIsAlive = id;
+ if (g.DeactivatedItemData.ID == id)
+ g.DeactivatedItemData.IsAlive = true;
}
// Declare item bounding box for clipping and interaction.
// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface
// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction.
+// THIS IS IN THE PERFORMANCE CRITICAL PATH (UNTIL THE CLIPPING TEST AND EARLY-RETURN)
+IM_MSVC_RUNTIME_CHECKS_OFF
bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags)
{
ImGuiContext& g = *GImGui;
@@ -9008,14 +10580,15 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
g.LastItemData.ID = id;
g.LastItemData.Rect = bb;
g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb;
- g.LastItemData.InFlags = g.CurrentItemFlags | extra_flags;
+ g.LastItemData.ItemFlags = g.CurrentItemFlags | g.NextItemData.ItemFlags | extra_flags;
g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None;
+ // Note: we don't copy 'g.NextItemData.SelectionUserData' to an hypothetical g.LastItemData.SelectionUserData: since the former is not cleared.
- // Directional navigation processing
if (id != 0)
{
KeepAliveID(id);
+ // Directional navigation processing
// Runs prior to clipping early-out
// (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget
// (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests
@@ -9025,44 +10598,57 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
// to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick).
// We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null.
// If we crash on a NULL g.NavWindow we need to fix the bug elsewhere.
- if (!(g.LastItemData.InFlags & ImGuiItemFlags_NoNav))
+ if (!(g.LastItemData.ItemFlags & ImGuiItemFlags_NoNav))
{
+ // FIMXE-NAV: investigate changing the window tests into a simple 'if (g.NavFocusScopeId == g.CurrentFocusScopeId)' test.
window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent);
if (g.NavId == id || g.NavAnyRequest)
if (g.NavWindow->RootWindowForNav == window->RootWindowForNav)
- if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened))
+ if (window == g.NavWindow || ((window->ChildFlags | g.NavWindow->ChildFlags) & ImGuiChildFlags_NavFlattened))
NavProcessItem();
}
- // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something".
- // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something".
- // READ THE FAQ: https://dearimgui.org/faq
- IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!");
+ if (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasShortcut)
+ ItemHandleShortcut(id);
}
- g.NextItemData.Flags = ImGuiNextItemDataFlags_None;
+
+ // Lightweight clear of SetNextItemXXX data.
+ g.NextItemData.HasFlags = ImGuiNextItemDataFlags_None;
+ g.NextItemData.ItemFlags = ImGuiItemFlags_None;
#ifdef IMGUI_ENABLE_TEST_ENGINE
if (id != 0)
- IMGUI_TEST_ENGINE_ITEM_ADD(nav_bb_arg ? *nav_bb_arg : bb, id);
+ IMGUI_TEST_ENGINE_ITEM_ADD(id, g.LastItemData.NavRect, &g.LastItemData);
#endif
// Clipping test
- // (FIXME: This is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value)
- //const bool is_clipped = IsClippedEx(bb, id);
- //if (is_clipped)
- // return false;
+ // (this is an inline copy of IsClippedEx() so we can reuse the is_rect_visible value, otherwise we'd do 'if (IsClippedEx(bb, id)) return false')
+ // g.NavActivateId is not necessarily == g.NavId, in the case of remote activation (e.g. shortcuts)
const bool is_rect_visible = bb.Overlaps(window->ClipRect);
if (!is_rect_visible)
- if (id == 0 || (id != g.ActiveId && id != g.NavId))
- if (!g.LogEnabled)
+ if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId))
+ if (!g.ItemUnclipByLog)
return false;
// [DEBUG]
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
- if (id != 0 && id == g.DebugLocateId)
- DebugLocateItemResolveWithLastItem();
-#endif
+ if (id != 0)
+ {
+ if (id == g.DebugLocateId)
+ DebugLocateItemResolveWithLastItem();
+
+ // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something".
+ // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something".
+ // READ THE FAQ: https://dearimgui.com/faq
+ IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!");
+ }
//if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG]
+ //if ((g.LastItemData.ItemFlags & ImGuiItemFlags_NoNav) == 0)
+ // window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG]
+#endif
+
+ if (id != 0 && g.DeactivatedItemData.ID == id)
+ g.DeactivatedItemData.ElapseFrame = g.FrameCount;
// We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them)
if (is_rect_visible)
@@ -9071,11 +10657,83 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect;
return true;
}
+IM_MSVC_RUNTIME_CHECKS_RESTORE
+
+//-----------------------------------------------------------------------------
+// [SECTION] LAYOUT
+//-----------------------------------------------------------------------------
+// - ItemSize()
+// - SameLine()
+// - GetCursorScreenPos()
+// - SetCursorScreenPos()
+// - GetCursorPos(), GetCursorPosX(), GetCursorPosY()
+// - SetCursorPos(), SetCursorPosX(), SetCursorPosY()
+// - GetCursorStartPos()
+// - Indent()
+// - Unindent()
+// - SetNextItemWidth()
+// - PushItemWidth()
+// - PushMultiItemsWidths()
+// - PopItemWidth()
+// - CalcItemWidth()
+// - CalcItemSize()
+// - GetTextLineHeight()
+// - GetTextLineHeightWithSpacing()
+// - GetFrameHeight()
+// - GetFrameHeightWithSpacing()
+// - GetContentRegionMax()
+// - GetContentRegionAvail(),
+// - BeginGroup()
+// - EndGroup()
+// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns.
+//-----------------------------------------------------------------------------
+
+// Advance cursor given item size for layout.
+// Register minimum needed size so it can extend the bounding box used for auto-fit calculation.
+// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different.
+// THIS IS IN THE PERFORMANCE CRITICAL PATH.
+IM_MSVC_RUNTIME_CHECKS_OFF
+void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return;
+
+ // We increase the height in this function to accommodate for baseline offset.
+ // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor,
+ // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect.
+ const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f;
+
+ const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y;
+ const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y);
+
+ // Always align ourselves on pixel boundaries
+ //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG]
+ window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x;
+ window->DC.CursorPosPrevLine.y = line_y1;
+ window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line
+ window->DC.CursorPos.y = IM_TRUNC(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line
+ window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
+ window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
+ //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
+
+ window->DC.PrevLineSize.y = line_height;
+ window->DC.CurrLineSize.y = 0.0f;
+ window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y);
+ window->DC.CurrLineTextBaseOffset = 0.0f;
+ window->DC.IsSameLine = window->DC.IsSetPos = false;
+
+ // Horizontal layout mode
+ if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
+ SameLine();
+}
+IM_MSVC_RUNTIME_CHECKS_RESTORE
// Gets back to previous line and continue with horizontal layout
// offset_from_start_x == 0 : follow right after previous item
// offset_from_start_x != 0 : align to specified x position (relative to window/group left)
-// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0
+// spacing_w < 0 : use default spacing if offset_from_start_x == 0, no spacing if offset_from_start_x != 0
// spacing_w >= 0 : enforce spacing amount
void ImGui::SameLine(float offset_from_start_x, float spacing_w)
{
@@ -9109,9 +10767,6 @@ ImVec2 ImGui::GetCursorScreenPos()
return window->DC.CursorPos;
}
-// 2022/08/05: Setting cursor position also extend boundaries (via modifying CursorMaxPos) used to compute window size, group size etc.
-// I believe this was is a judicious choice but it's probably being relied upon (it has been the case since 1.31 and 1.50)
-// It would be sane if we requested user to use SetCursorPos() + Dummy(ImVec2(0,0)) to extend CursorMaxPos...
void ImGui::SetCursorScreenPos(const ImVec2& pos)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -9190,7 +10845,7 @@ void ImGui::Unindent(float indent_w)
void ImGui::SetNextItemWidth(float item_width)
{
ImGuiContext& g = *GImGui;
- g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasWidth;
+ g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasWidth;
g.NextItemData.Width = item_width;
}
@@ -9201,27 +10856,37 @@ void ImGui::PushItemWidth(float item_width)
ImGuiWindow* window = g.CurrentWindow;
window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width
window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width);
- g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth;
+ g.NextItemData.HasFlags &= ~ImGuiNextItemDataFlags_HasWidth;
}
void ImGui::PushMultiItemsWidths(int components, float w_full)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
+ IM_ASSERT(components > 0);
const ImGuiStyle& style = g.Style;
- const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components));
- const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1)));
window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width
- window->DC.ItemWidthStack.push_back(w_item_last);
- for (int i = 0; i < components - 2; i++)
- window->DC.ItemWidthStack.push_back(w_item_one);
- window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one;
- g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth;
+ float w_items = w_full - style.ItemInnerSpacing.x * (components - 1);
+ float prev_split = w_items;
+ for (int i = components - 1; i > 0; i--)
+ {
+ float next_split = IM_TRUNC(w_items * i / components);
+ window->DC.ItemWidthStack.push_back(ImMax(prev_split - next_split, 1.0f));
+ prev_split = next_split;
+ }
+ window->DC.ItemWidth = ImMax(prev_split, 1.0f);
+ g.NextItemData.HasFlags &= ~ImGuiNextItemDataFlags_HasWidth;
}
void ImGui::PopItemWidth()
{
- ImGuiWindow* window = GetCurrentWindow();
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->DC.ItemWidthStack.Size <= 0)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling PopItemWidth() too many times!");
+ return;
+ }
window->DC.ItemWidth = window->DC.ItemWidthStack.back();
window->DC.ItemWidthStack.pop_back();
}
@@ -9233,16 +10898,16 @@ float ImGui::CalcItemWidth()
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
float w;
- if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth)
+ if (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasWidth)
w = g.NextItemData.Width;
else
w = window->DC.ItemWidth;
if (w < 0.0f)
{
- float region_max_x = GetContentRegionMaxAbs().x;
- w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w);
+ float region_avail_x = GetContentRegionAvail().x;
+ w = ImMax(1.0f, region_avail_x + w);
}
- w = IM_FLOOR(w);
+ w = IM_TRUNC(w);
return w;
}
@@ -9252,22 +10917,19 @@ float ImGui::CalcItemWidth()
// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable)
ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h)
{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
-
- ImVec2 region_max;
+ ImVec2 avail;
if (size.x < 0.0f || size.y < 0.0f)
- region_max = GetContentRegionMaxAbs();
+ avail = GetContentRegionAvail();
if (size.x == 0.0f)
size.x = default_w;
else if (size.x < 0.0f)
- size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x);
+ size.x = ImMax(4.0f, avail.x + size.x); // <-- size.x is negative here so we are subtracting
if (size.y == 0.0f)
size.y = default_h;
else if (size.y < 0.0f)
- size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y);
+ size.y = ImMax(4.0f, avail.y + size.y); // <-- size.y is negative here so we are subtracting
return size;
}
@@ -9296,37 +10958,23 @@ float ImGui::GetFrameHeightWithSpacing()
return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y;
}
-// FIXME: All the Contents Region function are messy or misleading. WE WILL AIM TO OBSOLETE ALL OF THEM WITH A NEW "WORK RECT" API. Thanks for your patience!
-
-// FIXME: This is in window space (not screen space!).
-ImVec2 ImGui::GetContentRegionMax()
+ImVec2 ImGui::GetContentRegionAvail()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- ImVec2 mx = window->ContentRegionRect.Max - window->Pos;
- if (window->DC.CurrentColumns || g.CurrentTable)
- mx.x = window->WorkRect.Max.x - window->Pos.x;
- return mx;
+ ImVec2 mx = (window->DC.CurrentColumns || g.CurrentTable) ? window->WorkRect.Max : window->ContentRegionRect.Max;
+ return mx - window->DC.CursorPos;
}
-// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features.
-ImVec2 ImGui::GetContentRegionMaxAbs()
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- ImVec2 mx = window->ContentRegionRect.Max;
- if (window->DC.CurrentColumns || g.CurrentTable)
- mx.x = window->WorkRect.Max.x;
- return mx;
-}
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-ImVec2 ImGui::GetContentRegionAvail()
+// You should never need those functions. Always use GetCursorScreenPos() and GetContentRegionAvail()!
+// They are bizarre local-coordinates which don't play well with scrolling.
+ImVec2 ImGui::GetContentRegionMax()
{
- ImGuiWindow* window = GImGui->CurrentWindow;
- return GetContentRegionMaxAbs() - window->DC.CursorPos;
+ return GetContentRegionAvail() + GetCursorScreenPos() - GetWindowPos();
}
-// In window space (not screen space!)
ImVec2 ImGui::GetWindowContentRegionMin()
{
ImGuiWindow* window = GImGui->CurrentWindow;
@@ -9338,6 +10986,7 @@ ImVec2 ImGui::GetWindowContentRegionMax()
ImGuiWindow* window = GImGui->CurrentWindow;
return window->ContentRegionRect.Max - window->Pos;
}
+#endif
// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
// Groups are currently a mishmash of functionalities which should perhaps be clarified and separated.
@@ -9351,6 +11000,7 @@ void ImGui::BeginGroup()
ImGuiGroupData& group_data = g.GroupStack.back();
group_data.WindowID = window->ID;
group_data.BackupCursorPos = window->DC.CursorPos;
+ group_data.BackupCursorPosPrevLine = window->DC.CursorPosPrevLine;
group_data.BackupCursorMaxPos = window->DC.CursorMaxPos;
group_data.BackupIndent = window->DC.Indent;
group_data.BackupGroupOffset = window->DC.GroupOffset;
@@ -9358,7 +11008,8 @@ void ImGui::BeginGroup()
group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset;
group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive;
group_data.BackupHoveredIdIsAlive = g.HoveredId != 0;
- group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive;
+ group_data.BackupIsSameLine = window->DC.IsSameLine;
+ group_data.BackupDeactivatedIdIsAlive = g.DeactivatedItemData.IsAlive;
group_data.EmitItem = true;
window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x;
@@ -9381,14 +11032,16 @@ void ImGui::EndGroup()
if (window->DC.IsSetPos)
ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
- ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos));
-
+ // Include LastItemData.Rect.Max as a workaround for e.g. EndTable() undershooting with CursorMaxPos report. (#7543)
+ ImRect group_bb(group_data.BackupCursorPos, ImMax(ImMax(window->DC.CursorMaxPos, g.LastItemData.Rect.Max), group_data.BackupCursorPos));
window->DC.CursorPos = group_data.BackupCursorPos;
- window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos);
+ window->DC.CursorPosPrevLine = group_data.BackupCursorPosPrevLine;
+ window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, group_bb.Max);
window->DC.Indent = group_data.BackupIndent;
window->DC.GroupOffset = group_data.BackupGroupOffset;
window->DC.CurrLineSize = group_data.BackupCurrLineSize;
window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset;
+ window->DC.IsSameLine = group_data.BackupIsSameLine;
if (g.LogEnabled)
g.LogLinePosY = -FLT_MAX; // To enforce a carriage return
@@ -9398,7 +11051,7 @@ void ImGui::EndGroup()
return;
}
- window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now.
+ window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now.
ItemSize(group_bb.GetSize());
ItemAdd(group_bb, 0, NULL, ImGuiItemFlags_NoTabStop);
@@ -9407,11 +11060,11 @@ void ImGui::EndGroup()
// Also if you grep for LastItemId you'll notice it is only used in that context.
// (The two tests not the same because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.)
const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId;
- const bool group_contains_prev_active_id = (group_data.BackupActiveIdPreviousFrameIsAlive == false) && (g.ActiveIdPreviousFrameIsAlive == true);
+ const bool group_contains_deactivated_id = (group_data.BackupDeactivatedIdIsAlive == false) && (g.DeactivatedItemData.IsAlive == true);
if (group_contains_curr_active_id)
g.LastItemData.ID = g.ActiveId;
- else if (group_contains_prev_active_id)
- g.LastItemData.ID = g.ActiveIdPreviousFrame;
+ else if (group_contains_deactivated_id)
+ g.LastItemData.ID = g.DeactivatedItemData.ID;
g.LastItemData.Rect = group_bb;
// Forward Hovered flag
@@ -9425,11 +11078,12 @@ void ImGui::EndGroup()
// Forward Deactivated flag
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDeactivated;
- if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame)
+ if (group_contains_deactivated_id)
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated;
g.GroupStack.pop_back();
- //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug]
+ if (g.DebugShowGroupRects)
+ window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug]
}
@@ -9453,38 +11107,24 @@ static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, fl
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
{
ImVec2 scroll = window->Scroll;
- if (window->ScrollTarget.x < FLT_MAX)
- {
- float decoration_total_width = window->ScrollbarSizes.x;
- float center_x_ratio = window->ScrollTargetCenterRatio.x;
- float scroll_target_x = window->ScrollTarget.x;
- if (window->ScrollTargetEdgeSnapDist.x > 0.0f)
- {
- float snap_x_min = 0.0f;
- float snap_x_max = window->ScrollMax.x + window->SizeFull.x - decoration_total_width;
- scroll_target_x = CalcScrollEdgeSnap(scroll_target_x, snap_x_min, snap_x_max, window->ScrollTargetEdgeSnapDist.x, center_x_ratio);
- }
- scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - decoration_total_width);
- }
- if (window->ScrollTarget.y < FLT_MAX)
+ ImVec2 decoration_size(window->DecoOuterSizeX1 + window->DecoInnerSizeX1 + window->DecoOuterSizeX2, window->DecoOuterSizeY1 + window->DecoInnerSizeY1 + window->DecoOuterSizeY2);
+ for (int axis = 0; axis < 2; axis++)
{
- float decoration_total_height = window->TitleBarHeight() + window->MenuBarHeight() + window->ScrollbarSizes.y;
- float center_y_ratio = window->ScrollTargetCenterRatio.y;
- float scroll_target_y = window->ScrollTarget.y;
- if (window->ScrollTargetEdgeSnapDist.y > 0.0f)
+ if (window->ScrollTarget[axis] < FLT_MAX)
{
- float snap_y_min = 0.0f;
- float snap_y_max = window->ScrollMax.y + window->SizeFull.y - decoration_total_height;
- scroll_target_y = CalcScrollEdgeSnap(scroll_target_y, snap_y_min, snap_y_max, window->ScrollTargetEdgeSnapDist.y, center_y_ratio);
+ float center_ratio = window->ScrollTargetCenterRatio[axis];
+ float scroll_target = window->ScrollTarget[axis];
+ if (window->ScrollTargetEdgeSnapDist[axis] > 0.0f)
+ {
+ float snap_min = 0.0f;
+ float snap_max = window->ScrollMax[axis] + window->SizeFull[axis] - decoration_size[axis];
+ scroll_target = CalcScrollEdgeSnap(scroll_target, snap_min, snap_max, window->ScrollTargetEdgeSnapDist[axis], center_ratio);
+ }
+ scroll[axis] = scroll_target - center_ratio * (window->SizeFull[axis] - decoration_size[axis]);
}
- scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - decoration_total_height);
- }
- scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f));
- scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f));
- if (!window->Collapsed && !window->SkipItems)
- {
- scroll.x = ImMin(scroll.x, window->ScrollMax.x);
- scroll.y = ImMin(scroll.y, window->ScrollMax.y);
+ scroll[axis] = IM_ROUND(ImMax(scroll[axis], 0.0f));
+ if (!window->Collapsed && !window->SkipItems)
+ scroll[axis] = ImMin(scroll[axis], window->ScrollMax[axis]);
}
return scroll;
}
@@ -9505,8 +11145,11 @@ void ImGui::ScrollToRect(ImGuiWindow* window, const ImRect& item_rect, ImGuiScro
ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags)
{
ImGuiContext& g = *GImGui;
- ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1));
- //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG]
+ ImRect scroll_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1));
+ scroll_rect.Min.x = ImMin(scroll_rect.Min.x + window->DecoInnerSizeX1, scroll_rect.Max.x);
+ scroll_rect.Min.y = ImMin(scroll_rect.Min.y + window->DecoInnerSizeY1, scroll_rect.Max.y);
+ //GetForegroundDrawList(window)->AddRect(item_rect.Min, item_rect.Max, IM_COL32(255,0,0,255), 0.0f, 0, 5.0f); // [DEBUG]
+ //GetForegroundDrawList(window)->AddRect(scroll_rect.Min, scroll_rect.Max, IM_COL32_WHITE); // [DEBUG]
// Check that only one behavior is selected per axis
IM_ASSERT((flags & ImGuiScrollFlags_MaskX_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskX_));
@@ -9519,35 +11162,39 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui
if ((flags & ImGuiScrollFlags_MaskY_) == 0)
flags |= window->Appearing ? ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeY;
- const bool fully_visible_x = item_rect.Min.x >= window_rect.Min.x && item_rect.Max.x <= window_rect.Max.x;
- const bool fully_visible_y = item_rect.Min.y >= window_rect.Min.y && item_rect.Max.y <= window_rect.Max.y;
- const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= window_rect.GetWidth();
- const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= window_rect.GetHeight();
+ const bool fully_visible_x = item_rect.Min.x >= scroll_rect.Min.x && item_rect.Max.x <= scroll_rect.Max.x;
+ const bool fully_visible_y = item_rect.Min.y >= scroll_rect.Min.y && item_rect.Max.y <= scroll_rect.Max.y;
+ const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= scroll_rect.GetWidth() || (window->AutoFitFramesX > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0;
+ const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= scroll_rect.GetHeight() || (window->AutoFitFramesY > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0;
if ((flags & ImGuiScrollFlags_KeepVisibleEdgeX) && !fully_visible_x)
{
- if (item_rect.Min.x < window_rect.Min.x || !can_be_fully_visible_x)
+ if (item_rect.Min.x < scroll_rect.Min.x || !can_be_fully_visible_x)
SetScrollFromPosX(window, item_rect.Min.x - g.Style.ItemSpacing.x - window->Pos.x, 0.0f);
- else if (item_rect.Max.x >= window_rect.Max.x)
+ else if (item_rect.Max.x >= scroll_rect.Max.x)
SetScrollFromPosX(window, item_rect.Max.x + g.Style.ItemSpacing.x - window->Pos.x, 1.0f);
}
else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX))
{
- float target_x = can_be_fully_visible_x ? ImFloor((item_rect.Min.x + item_rect.Max.x - window->InnerRect.GetWidth()) * 0.5f) : item_rect.Min.x;
- SetScrollFromPosX(window, target_x - window->Pos.x, 0.0f);
+ if (can_be_fully_visible_x)
+ SetScrollFromPosX(window, ImTrunc((item_rect.Min.x + item_rect.Max.x) * 0.5f) - window->Pos.x, 0.5f);
+ else
+ SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x, 0.0f);
}
if ((flags & ImGuiScrollFlags_KeepVisibleEdgeY) && !fully_visible_y)
{
- if (item_rect.Min.y < window_rect.Min.y || !can_be_fully_visible_y)
+ if (item_rect.Min.y < scroll_rect.Min.y || !can_be_fully_visible_y)
SetScrollFromPosY(window, item_rect.Min.y - g.Style.ItemSpacing.y - window->Pos.y, 0.0f);
- else if (item_rect.Max.y >= window_rect.Max.y)
+ else if (item_rect.Max.y >= scroll_rect.Max.y)
SetScrollFromPosY(window, item_rect.Max.y + g.Style.ItemSpacing.y - window->Pos.y, 1.0f);
}
else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY))
{
- float target_y = can_be_fully_visible_y ? ImFloor((item_rect.Min.y + item_rect.Max.y - window->InnerRect.GetHeight()) * 0.5f) : item_rect.Min.y;
- SetScrollFromPosY(window, target_y - window->Pos.y, 0.0f);
+ if (can_be_fully_visible_y)
+ SetScrollFromPosY(window, ImTrunc((item_rect.Min.y + item_rect.Max.y) * 0.5f) - window->Pos.y, 0.5f);
+ else
+ SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y, 0.0f);
}
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window);
@@ -9630,7 +11277,7 @@ void ImGui::SetScrollY(float scroll_y)
void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio)
{
IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f);
- window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x); // Convert local position to scroll offset
+ window->ScrollTarget.x = IM_TRUNC(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset
window->ScrollTargetCenterRatio.x = center_x_ratio;
window->ScrollTargetEdgeSnapDist.x = 0.0f;
}
@@ -9638,9 +11285,7 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x
void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio)
{
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
- const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect;
- local_y -= decoration_up_height;
- window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset
+ window->ScrollTarget.y = IM_TRUNC(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset
window->ScrollTargetCenterRatio.y = center_y_ratio;
window->ScrollTargetEdgeSnapDist.y = 0.0f;
}
@@ -9687,41 +11332,62 @@ void ImGui::SetScrollHereY(float center_y_ratio)
// [SECTION] TOOLTIPS
//-----------------------------------------------------------------------------
-void ImGui::BeginTooltip()
+bool ImGui::BeginTooltip()
{
- BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None);
+ return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None);
}
-void ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags)
+bool ImGui::BeginItemTooltip()
+{
+ if (!IsItemHovered(ImGuiHoveredFlags_ForTooltip))
+ return false;
+ return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None);
+}
+
+bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags)
{
ImGuiContext& g = *GImGui;
- if (g.DragDropWithinSource || g.DragDropWithinTarget)
+ const bool is_dragdrop_tooltip = g.DragDropWithinSource || g.DragDropWithinTarget;
+ if (is_dragdrop_tooltip)
{
- // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor)
- // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor.
- // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do.
+ // Drag and Drop tooltips are positioning differently than other tooltips:
+ // - offset visibility to increase visibility around mouse.
+ // - never clamp within outer viewport boundary.
+ // We call SetNextWindowPos() to enforce position and disable clamping.
+ // See FindBestWindowPosForPopup() for positionning logic of other tooltips (not drag and drop ones).
//ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding;
- ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale);
- SetNextWindowPos(tooltip_pos);
+ const bool is_touchscreen = (g.IO.MouseSource == ImGuiMouseSource_TouchScreen);
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasPos) == 0)
+ {
+ ImVec2 tooltip_pos = is_touchscreen ? (g.IO.MousePos + TOOLTIP_DEFAULT_OFFSET_TOUCH * g.Style.MouseCursorScale) : (g.IO.MousePos + TOOLTIP_DEFAULT_OFFSET_MOUSE * g.Style.MouseCursorScale);
+ ImVec2 tooltip_pivot = is_touchscreen ? TOOLTIP_DEFAULT_PIVOT_TOUCH : ImVec2(0.0f, 0.0f);
+ SetNextWindowPos(tooltip_pos, ImGuiCond_None, tooltip_pivot);
+ }
+
SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f);
//PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :(
- tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip;
+ tooltip_flags |= ImGuiTooltipFlags_OverridePrevious;
}
- char window_name[16];
- ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount);
- if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip)
- if (ImGuiWindow* window = FindWindowByName(window_name))
- if (window->Active)
- {
- // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one.
- window->Hidden = true;
- window->HiddenFramesCanSkipItems = 1; // FIXME: This may not be necessary?
- ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount);
- }
+ const char* window_name_template = is_dragdrop_tooltip ? "##Tooltip_DragDrop_%02d" : "##Tooltip_%02d";
+ char window_name[32];
+ ImFormatString(window_name, IM_ARRAYSIZE(window_name), window_name_template, g.TooltipOverrideCount);
+ if ((tooltip_flags & ImGuiTooltipFlags_OverridePrevious) && g.TooltipPreviousWindow != NULL && g.TooltipPreviousWindow->Active)
+ {
+ // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one.
+ //IMGUI_DEBUG_LOG("[tooltip] '%s' already active, using +1 for this frame\n", window_name);
+ SetWindowHiddenAndSkipItemsForCurrentFrame(g.TooltipPreviousWindow);
+ ImFormatString(window_name, IM_ARRAYSIZE(window_name), window_name_template, ++g.TooltipOverrideCount);
+ }
ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize;
Begin(window_name, NULL, flags | extra_window_flags);
+ // 2023-03-09: Added bool return value to the API, but currently always returning true.
+ // If this ever returns false we need to update BeginDragDropSource() accordingly.
+ //if (!ret)
+ // End();
+ //return ret;
+ return true;
}
void ImGui::EndTooltip()
@@ -9730,21 +11396,40 @@ void ImGui::EndTooltip()
End();
}
+void ImGui::SetTooltip(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ SetTooltipV(fmt, args);
+ va_end(args);
+}
+
void ImGui::SetTooltipV(const char* fmt, va_list args)
{
- BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None);
+ if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePrevious, ImGuiWindowFlags_None))
+ return;
TextV(fmt, args);
EndTooltip();
}
-void ImGui::SetTooltip(const char* fmt, ...)
+// Shortcut to use 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav'.
+// Defaults to == ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort when using the mouse.
+void ImGui::SetItemTooltip(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
- SetTooltipV(fmt, args);
+ if (IsItemHovered(ImGuiHoveredFlags_ForTooltip))
+ SetTooltipV(fmt, args);
va_end(args);
}
+void ImGui::SetItemTooltipV(const char* fmt, va_list args)
+{
+ if (IsItemHovered(ImGuiHoveredFlags_ForTooltip))
+ SetTooltipV(fmt, args);
+}
+
+
//-----------------------------------------------------------------------------
// [SECTION] POPUPS
//-----------------------------------------------------------------------------
@@ -9790,6 +11475,7 @@ bool ImGui::IsPopupOpen(const char* str_id, ImGuiPopupFlags popup_flags)
return IsPopupOpen(id, popup_flags);
}
+// Also see FindBlockingModal(NULL)
ImGuiWindow* ImGui::GetTopMostPopupModal()
{
ImGuiContext& g = *GImGui;
@@ -9800,6 +11486,7 @@ ImGuiWindow* ImGui::GetTopMostPopupModal()
return NULL;
}
+// See Demo->Stacked Modal to confirm what this is for.
ImGuiWindow* ImGui::GetTopMostAndVisiblePopupModal()
{
ImGuiContext& g = *GImGui;
@@ -9810,11 +11497,48 @@ ImGuiWindow* ImGui::GetTopMostAndVisiblePopupModal()
return NULL;
}
+
+// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing)
+// should be positioned behind that modal window, unless the window was created inside the modal begin-stack.
+// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent.
+// - WindowA // FindBlockingModal() returns Modal1
+// - WindowB // .. returns Modal1
+// - Modal1 // .. returns Modal2
+// - WindowC // .. returns Modal2
+// - WindowD // .. returns Modal2
+// - Modal2 // .. returns Modal2
+// - WindowE // .. returns NULL
+// Notes:
+// - FindBlockingModal(NULL) == NULL is generally equivalent to GetTopMostPopupModal() == NULL.
+// Only difference is here we check for ->Active/WasActive but it may be unnecessary.
+ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.OpenPopupStack.Size <= 0)
+ return NULL;
+
+ // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal.
+ for (ImGuiPopupData& popup_data : g.OpenPopupStack)
+ {
+ ImGuiWindow* popup_window = popup_data.Window;
+ if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal))
+ continue;
+ if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows.
+ continue;
+ if (window == NULL) // FindBlockingModal(NULL) test for if FocusWindow(NULL) is naturally possible via a mouse click.
+ return popup_window;
+ if (IsWindowWithinBeginStackOf(window, popup_window)) // Window may be over modal
+ continue;
+ return popup_window; // Place window right below first block modal
+ }
+ return NULL;
+}
+
void ImGui::OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags)
{
ImGuiContext& g = *GImGui;
ImGuiID id = g.CurrentWindow->GetID(str_id);
- IMGUI_DEBUG_LOG_POPUP("[popup] OpenPopup(\"%s\" -> 0x%08X\n", str_id, id);
+ IMGUI_DEBUG_LOG_POPUP("[popup] OpenPopup(\"%s\" -> 0x%08X)\n", str_id, id);
OpenPopupEx(id, popup_flags);
}
@@ -9834,13 +11558,13 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags)
const int current_stack_size = g.BeginPopupStack.Size;
if (popup_flags & ImGuiPopupFlags_NoOpenOverExistingPopup)
- if (IsPopupOpen(0u, ImGuiPopupFlags_AnyPopupId))
+ if (IsPopupOpen((ImGuiID)0, ImGuiPopupFlags_AnyPopupId))
return;
ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
popup_ref.PopupId = id;
popup_ref.Window = NULL;
- popup_ref.BackupNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type).
+ popup_ref.RestoreNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type).
popup_ref.OpenFrameCount = g.FrameCount;
popup_ref.OpenParentId = parent_window->IDStack.back();
popup_ref.OpenPopupPos = NavCalcPreferredRefPos();
@@ -9853,17 +11577,23 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags)
}
else
{
- // Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui
- // would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing
- // situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand.
- if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1)
+ // Gently handle the user mistakenly calling OpenPopup() every frames: it is likely a programming mistake!
+ // However, if we were to run the regular code path, the ui would become completely unusable because the popup will always be
+ // in hidden-while-calculating-size state _while_ claiming focus. Which is extremely confusing situation for the programmer.
+ // Instead, for successive frames calls to OpenPopup(), we silently avoid reopening even if ImGuiPopupFlags_NoReopen is not specified.
+ bool keep_existing = false;
+ if (g.OpenPopupStack[current_stack_size].PopupId == id)
+ if ((g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) || (popup_flags & ImGuiPopupFlags_NoReopen))
+ keep_existing = true;
+ if (keep_existing)
{
+ // No reopen
g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount;
}
else
{
- // Close child popups if any, then flag popup for open/reopen
- ClosePopupToLevel(current_stack_size, false);
+ // Reopen: close child popups if any, then flag popup for open/reopen (set position, focus, init navigation)
+ ClosePopupToLevel(current_stack_size, true);
g.OpenPopupStack.push_back(popup_ref);
}
@@ -9883,6 +11613,7 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to
return;
// Don't close our own child popup windows.
+ //IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupsOverWindow(\"%s\") restore_under=%d\n", ref_window ? ref_window->Name : "<NULL>", restore_focus_to_window_under_popup);
int popup_count_to_keep = 0;
if (ref_window)
{
@@ -9893,14 +11624,15 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to
if (!popup.Window)
continue;
IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
- if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow)
- continue;
// Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow)
- // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3:
- // Window -> Popup1 -> Popup2 -> Popup3
+ // - Clicking/Focusing Window2 won't close Popup1:
+ // Window -> Popup1 -> Window2(Ref)
+ // - Clicking/focusing Popup1 will close Popup2 and Popup3:
+ // Window -> Popup1(Ref) -> Popup2 -> Popup3
// - Each popups may contain child windows, which is why we compare ->RootWindow!
// Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child
+ // We step through every popup from bottom to top to validate their position relative to reference window.
bool ref_window_is_descendent_of_popup = false;
for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++)
if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window)
@@ -9928,7 +11660,7 @@ void ImGui::ClosePopupsExceptModals()
for (popup_count_to_keep = g.OpenPopupStack.Size; popup_count_to_keep > 0; popup_count_to_keep--)
{
ImGuiWindow* window = g.OpenPopupStack[popup_count_to_keep - 1].Window;
- if (!window || window->Flags & ImGuiWindowFlags_Modal)
+ if (!window || (window->Flags & ImGuiWindowFlags_Modal))
break;
}
if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below
@@ -9938,28 +11670,25 @@ void ImGui::ClosePopupsExceptModals()
void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup)
{
ImGuiContext& g = *GImGui;
- IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup);
+ IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_under=%d\n", remaining, restore_focus_to_window_under_popup);
IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size);
+ if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup)
+ for (int n = remaining; n < g.OpenPopupStack.Size; n++)
+ IMGUI_DEBUG_LOG_POPUP("[popup] - Closing PopupID 0x%08X Window \"%s\"\n", g.OpenPopupStack[n].PopupId, g.OpenPopupStack[n].Window ? g.OpenPopupStack[n].Window->Name : NULL);
// Trim open popup stack
- ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window;
- ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow;
+ ImGuiPopupData prev_popup = g.OpenPopupStack[remaining];
g.OpenPopupStack.resize(remaining);
- if (restore_focus_to_window_under_popup)
+ // Restore focus (unless popup window was not yet submitted, and didn't have a chance to take focus anyhow. See #7325 for an edge case)
+ if (restore_focus_to_window_under_popup && prev_popup.Window)
{
- ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window;
- if (focus_window && !focus_window->WasActive && popup_window)
- {
- // Fallback
- FocusTopMostWindowUnderOne(popup_window, NULL);
- }
+ ImGuiWindow* popup_window = prev_popup.Window;
+ ImGuiWindow* focus_window = (popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : prev_popup.RestoreNavWindow;
+ if (focus_window && !focus_window->WasActive)
+ FocusTopMostWindowUnderOne(popup_window, NULL, NULL, ImGuiFocusRequestFlags_RestoreFocusedChild); // Fallback
else
- {
- if (g.NavLayer == ImGuiNavLayer_Main && focus_window)
- focus_window = NavRestoreLastChildNavWindow(focus_window);
- FocusWindow(focus_window);
- }
+ FocusWindow(focus_window, (g.NavLayer == ImGuiNavLayer_Main) ? ImGuiFocusRequestFlags_RestoreFocusedChild : ImGuiFocusRequestFlags_None);
}
}
@@ -9994,8 +11723,8 @@ void ImGui::CloseCurrentPopup()
window->DC.NavHideHighlightOneFrame = true;
}
-// Attention! BeginPopup() adds default flags which BeginPopupEx()!
-bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags)
+// Attention! BeginPopup() adds default flags when calling BeginPopupEx()!
+bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags)
{
ImGuiContext& g = *GImGui;
if (!IsPopupOpen(id, ImGuiPopupFlags_None))
@@ -10005,16 +11734,32 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags)
}
char name[20];
- if (flags & ImGuiWindowFlags_ChildMenu)
- ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth
- else
- ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame
+ IM_ASSERT((extra_window_flags & ImGuiWindowFlags_ChildMenu) == 0); // Use BeginPopupMenuEx()
+ ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // No recycling, so we can close/open during the same frame
- flags |= ImGuiWindowFlags_Popup;
- bool is_open = Begin(name, NULL, flags);
+ bool is_open = Begin(name, NULL, extra_window_flags | ImGuiWindowFlags_Popup);
if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
EndPopup();
+ //g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack;
+ return is_open;
+}
+
+bool ImGui::BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags)
+{
+ ImGuiContext& g = *GImGui;
+ if (!IsPopupOpen(id, ImGuiPopupFlags_None))
+ {
+ g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
+ return false;
+ }
+ char name[128];
+ IM_ASSERT(extra_window_flags & ImGuiWindowFlags_ChildMenu);
+ ImFormatString(name, IM_ARRAYSIZE(name), "%s###Menu_%02d", label, g.BeginMenuDepth); // Recycle windows based on depth
+ bool is_open = Begin(name, NULL, extra_window_flags | ImGuiWindowFlags_Popup);
+ if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
+ EndPopup();
+ //g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack;
return is_open;
}
@@ -10032,7 +11777,9 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags)
}
// If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup.
-// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here.
+// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup).
+// - *p_open set back to false in BeginPopupModal() when popup is not open.
+// - if you set *p_open to false before calling BeginPopupModal(), it will close the popup.
bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
@@ -10041,13 +11788,15 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
if (!IsPopupOpen(id, ImGuiPopupFlags_None))
{
g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
+ if (p_open && *p_open)
+ *p_open = false;
return false;
}
// Center modal windows by default for increased visibility
// (this won't really last as settings will kick in, and is mostly for backward compatibility. user may do the same themselves)
// FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window.
- if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0)
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasPos) == 0)
{
const ImGuiViewport* viewport = GetMainViewport();
SetNextWindowPos(viewport->GetCenter(), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.5f));
@@ -10077,11 +11826,11 @@ void ImGui::EndPopup()
NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY);
// Child-popups don't need to be laid out
- IM_ASSERT(g.WithinEndChild == false);
+ const ImGuiID backup_within_end_child_id = g.WithinEndChildID;
if (window->Flags & ImGuiWindowFlags_ChildWindow)
- g.WithinEndChild = true;
+ g.WithinEndChildID = window->ID;
End();
- g.WithinEndChild = false;
+ g.WithinEndChildID = backup_within_end_child_id;
}
// Helper to open a popup if mouse button is released over the item
@@ -10272,21 +12021,305 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
}
if (window->Flags & ImGuiWindowFlags_Tooltip)
{
- // Position tooltip (always follows mouse)
- float sc = g.Style.MouseCursorScale;
- ImVec2 ref_pos = NavCalcPreferredRefPos();
+ // Position tooltip (always follows mouse + clamp within outer boundaries)
+ // FIXME:
+ // - Too many paths. One problem is that FindBestWindowPosForPopupEx() doesn't allow passing a suggested position (so touch screen path doesn't use it by default).
+ // - Drag and drop tooltips are not using this path either: BeginTooltipEx() manually sets their position.
+ // - Require some tidying up. In theory we could handle both cases in same location, but requires a bit of shuffling
+ // as drag and drop tooltips are calling SetNextWindowPos() leading to 'window_pos_set_by_api' being set in Begin().
+ IM_ASSERT(g.CurrentWindow == window);
+ const float scale = g.Style.MouseCursorScale;
+ const ImVec2 ref_pos = NavCalcPreferredRefPos();
+
+ if (g.IO.MouseSource == ImGuiMouseSource_TouchScreen && NavCalcPreferredRefPosSource() == ImGuiInputSource_Mouse)
+ {
+ ImVec2 tooltip_pos = ref_pos + TOOLTIP_DEFAULT_OFFSET_TOUCH * scale - (TOOLTIP_DEFAULT_PIVOT_TOUCH * window->Size);
+ if (r_outer.Contains(ImRect(tooltip_pos, tooltip_pos + window->Size)))
+ return tooltip_pos;
+ }
+
+ ImVec2 tooltip_pos = ref_pos + TOOLTIP_DEFAULT_OFFSET_MOUSE * scale;
ImRect r_avoid;
- if (!g.NavDisableHighlight && g.NavDisableMouseHover && !(g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos))
+ if (g.NavCursorVisible && g.NavHighlightItemUnderNav && !g.IO.ConfigNavMoveSetMousePos)
r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8);
else
- r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important.
- return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip);
+ r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * scale, ref_pos.y + 24 * scale); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important.
+ //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255, 0, 255, 255));
+
+ return FindBestWindowPosForPopupEx(tooltip_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip);
}
IM_ASSERT(0);
return window->Pos;
}
//-----------------------------------------------------------------------------
+// [SECTION] WINDOW FOCUS
+//----------------------------------------------------------------------------
+// - SetWindowFocus()
+// - SetNextWindowFocus()
+// - IsWindowFocused()
+// - UpdateWindowInFocusOrderList() [Internal]
+// - BringWindowToFocusFront() [Internal]
+// - BringWindowToDisplayFront() [Internal]
+// - BringWindowToDisplayBack() [Internal]
+// - BringWindowToDisplayBehind() [Internal]
+// - FindWindowDisplayIndex() [Internal]
+// - FocusWindow() [Internal]
+// - FocusTopMostWindowUnderOne() [Internal]
+//-----------------------------------------------------------------------------
+
+void ImGui::SetWindowFocus()
+{
+ FocusWindow(GImGui->CurrentWindow);
+}
+
+void ImGui::SetWindowFocus(const char* name)
+{
+ if (name)
+ {
+ if (ImGuiWindow* window = FindWindowByName(name))
+ FocusWindow(window);
+ }
+ else
+ {
+ FocusWindow(NULL);
+ }
+}
+
+void ImGui::SetNextWindowFocus()
+{
+ ImGuiContext& g = *GImGui;
+ g.NextWindowData.HasFlags |= ImGuiNextWindowDataFlags_HasFocus;
+}
+
+// Similar to IsWindowHovered()
+bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* ref_window = g.NavWindow;
+ ImGuiWindow* cur_window = g.CurrentWindow;
+
+ if (ref_window == NULL)
+ return false;
+ if (flags & ImGuiFocusedFlags_AnyWindow)
+ return true;
+
+ IM_ASSERT(cur_window); // Not inside a Begin()/End()
+ const bool popup_hierarchy = (flags & ImGuiFocusedFlags_NoPopupHierarchy) == 0;
+ if (flags & ImGuiHoveredFlags_RootWindow)
+ cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy);
+
+ if (flags & ImGuiHoveredFlags_ChildWindows)
+ return IsWindowChildOf(ref_window, cur_window, popup_hierarchy);
+ else
+ return (ref_window == cur_window);
+}
+
+static int ImGui::FindWindowFocusIndex(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ IM_UNUSED(g);
+ int order = window->FocusOrder;
+ IM_ASSERT(window->RootWindow == window); // No child window (not testing _ChildWindow because of docking)
+ IM_ASSERT(g.WindowsFocusOrder[order] == window);
+ return order;
+}
+
+static void ImGui::UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags)
+{
+ ImGuiContext& g = *GImGui;
+
+ const bool new_is_explicit_child = (new_flags & ImGuiWindowFlags_ChildWindow) != 0 && ((new_flags & ImGuiWindowFlags_Popup) == 0 || (new_flags & ImGuiWindowFlags_ChildMenu) != 0);
+ const bool child_flag_changed = new_is_explicit_child != window->IsExplicitChild;
+ if ((just_created || child_flag_changed) && !new_is_explicit_child)
+ {
+ IM_ASSERT(!g.WindowsFocusOrder.contains(window));
+ g.WindowsFocusOrder.push_back(window);
+ window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1);
+ }
+ else if (!just_created && child_flag_changed && new_is_explicit_child)
+ {
+ IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window);
+ for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++)
+ g.WindowsFocusOrder[n]->FocusOrder--;
+ g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder);
+ window->FocusOrder = -1;
+ }
+ window->IsExplicitChild = new_is_explicit_child;
+}
+
+void ImGui::BringWindowToFocusFront(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(window == window->RootWindow);
+
+ const int cur_order = window->FocusOrder;
+ IM_ASSERT(g.WindowsFocusOrder[cur_order] == window);
+ if (g.WindowsFocusOrder.back() == window)
+ return;
+
+ const int new_order = g.WindowsFocusOrder.Size - 1;
+ for (int n = cur_order; n < new_order; n++)
+ {
+ g.WindowsFocusOrder[n] = g.WindowsFocusOrder[n + 1];
+ g.WindowsFocusOrder[n]->FocusOrder--;
+ IM_ASSERT(g.WindowsFocusOrder[n]->FocusOrder == n);
+ }
+ g.WindowsFocusOrder[new_order] = window;
+ window->FocusOrder = (short)new_order;
+}
+
+// Note technically focus related but rather adjacent and close to BringWindowToFocusFront()
+void ImGui::BringWindowToDisplayFront(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* current_front_window = g.Windows.back();
+ if (current_front_window == window || current_front_window->RootWindow == window) // Cheap early out (could be better)
+ return;
+ for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window
+ if (g.Windows[i] == window)
+ {
+ memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*));
+ g.Windows[g.Windows.Size - 1] = window;
+ break;
+ }
+}
+
+void ImGui::BringWindowToDisplayBack(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.Windows[0] == window)
+ return;
+ for (int i = 0; i < g.Windows.Size; i++)
+ if (g.Windows[i] == window)
+ {
+ memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*));
+ g.Windows[0] = window;
+ break;
+ }
+}
+
+void ImGui::BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* behind_window)
+{
+ IM_ASSERT(window != NULL && behind_window != NULL);
+ ImGuiContext& g = *GImGui;
+ window = window->RootWindow;
+ behind_window = behind_window->RootWindow;
+ int pos_wnd = FindWindowDisplayIndex(window);
+ int pos_beh = FindWindowDisplayIndex(behind_window);
+ if (pos_wnd < pos_beh)
+ {
+ size_t copy_bytes = (pos_beh - pos_wnd - 1) * sizeof(ImGuiWindow*);
+ memmove(&g.Windows.Data[pos_wnd], &g.Windows.Data[pos_wnd + 1], copy_bytes);
+ g.Windows[pos_beh - 1] = window;
+ }
+ else
+ {
+ size_t copy_bytes = (pos_wnd - pos_beh) * sizeof(ImGuiWindow*);
+ memmove(&g.Windows.Data[pos_beh + 1], &g.Windows.Data[pos_beh], copy_bytes);
+ g.Windows[pos_beh] = window;
+ }
+}
+
+int ImGui::FindWindowDisplayIndex(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ return g.Windows.index_from_ptr(g.Windows.find(window));
+}
+
+// Moving window to front of display and set focus (which happens to be back of our sorted list)
+void ImGui::FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+
+ // Modal check?
+ if ((flags & ImGuiFocusRequestFlags_UnlessBelowModal) && (g.NavWindow != window)) // Early out in common case.
+ if (ImGuiWindow* blocking_modal = FindBlockingModal(window))
+ {
+ // This block would typically be reached in two situations:
+ // - API call to FocusWindow() with a window under a modal and ImGuiFocusRequestFlags_UnlessBelowModal flag.
+ // - User clicking on void or anything behind a modal while a modal is open (window == NULL)
+ IMGUI_DEBUG_LOG_FOCUS("[focus] FocusWindow(\"%s\", UnlessBelowModal): prevented by \"%s\".\n", window ? window->Name : "<NULL>", blocking_modal->Name);
+ if (window && window == window->RootWindow && (window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0)
+ BringWindowToDisplayBehind(window, blocking_modal); // Still bring right under modal. (FIXME: Could move in focus list too?)
+ ClosePopupsOverWindow(GetTopMostPopupModal(), false); // Note how we need to use GetTopMostPopupModal() aad NOT blocking_modal, to handle nested modals
+ return;
+ }
+
+ // Find last focused child (if any) and focus it instead.
+ if ((flags & ImGuiFocusRequestFlags_RestoreFocusedChild) && window != NULL)
+ window = NavRestoreLastChildNavWindow(window);
+
+ // Apply focus
+ if (g.NavWindow != window)
+ {
+ SetNavWindow(window);
+ if (window && g.NavHighlightItemUnderNav)
+ g.NavMousePosDirty = true;
+ g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId
+ g.NavLayer = ImGuiNavLayer_Main;
+ SetNavFocusScope(window ? window->NavRootFocusScopeId : 0);
+ g.NavIdIsAlive = false;
+ g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
+
+ // Close popups if any
+ ClosePopupsOverWindow(window, false);
+ }
+
+ // Move the root window to the top of the pile
+ IM_ASSERT(window == NULL || window->RootWindow != NULL);
+ ImGuiWindow* focus_front_window = window ? window->RootWindow : NULL; // NB: In docking branch this is window->RootWindowDockStop
+ ImGuiWindow* display_front_window = window ? window->RootWindow : NULL;
+
+ // Steal active widgets. Some of the cases it triggers includes:
+ // - Focus a window while an InputText in another window is active, if focus happens before the old InputText can run.
+ // - When using Nav to activate menu items (due to timing of activating on press->new window appears->losing ActiveId)
+ if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window)
+ if (!g.ActiveIdNoClearOnFocusLoss)
+ ClearActiveID();
+
+ // Passing NULL allow to disable keyboard focus
+ if (!window)
+ return;
+
+ // Bring to front
+ BringWindowToFocusFront(focus_front_window);
+ if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0)
+ BringWindowToDisplayFront(display_front_window);
+}
+
+void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport, ImGuiFocusRequestFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ IM_UNUSED(filter_viewport); // Unused in master branch.
+ int start_idx = g.WindowsFocusOrder.Size - 1;
+ if (under_this_window != NULL)
+ {
+ // Aim at root window behind us, if we are in a child window that's our own root (see #4640)
+ int offset = -1;
+ while (under_this_window->Flags & ImGuiWindowFlags_ChildWindow)
+ {
+ under_this_window = under_this_window->ParentWindow;
+ offset = 0;
+ }
+ start_idx = FindWindowFocusIndex(under_this_window) + offset;
+ }
+ for (int i = start_idx; i >= 0; i--)
+ {
+ // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user.
+ ImGuiWindow* window = g.WindowsFocusOrder[i];
+ if (window == ignore_window || !window->WasActive)
+ continue;
+ if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs))
+ {
+ FocusWindow(window, flags);
+ return;
+ }
+ }
+ FocusWindow(NULL, flags);
+}
+
+//-----------------------------------------------------------------------------
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
//-----------------------------------------------------------------------------
@@ -10294,6 +12327,23 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
// In our terminology those should be interchangeable, yet right now this is super confusing.
// Those two functions are merely a legacy artifact, so at minimum naming should be clarified.
+void ImGui::SetNavCursorVisible(bool visible)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.IO.ConfigNavCursorVisibleAlways)
+ visible = true;
+ g.NavCursorVisible = visible;
+}
+
+// (was called NavRestoreHighlightAfterMove() before 1.91.4)
+void ImGui::SetNavCursorVisibleAfterMove()
+{
+ ImGuiContext& g = *GImGui;
+ if (g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = true;
+ g.NavHighlightItemUnderNav = g.NavMousePosDirty = true;
+}
+
void ImGui::SetNavWindow(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
@@ -10301,11 +12351,25 @@ void ImGui::SetNavWindow(ImGuiWindow* window)
{
IMGUI_DEBUG_LOG_FOCUS("[focus] SetNavWindow(\"%s\")\n", window ? window->Name : "<NULL>");
g.NavWindow = window;
+ g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
}
g.NavInitRequest = g.NavMoveSubmitted = g.NavMoveScoringItems = false;
NavUpdateAnyRequestFlag();
}
+void ImGui::NavHighlightActivated(ImGuiID id)
+{
+ ImGuiContext& g = *GImGui;
+ g.NavHighlightActivatedId = id;
+ g.NavHighlightActivatedTimer = NAV_ACTIVATE_HIGHLIGHT_TIMER;
+}
+
+void ImGui::NavClearPreferredPosForAxis(ImGuiAxis axis)
+{
+ ImGuiContext& g = *GImGui;
+ g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer][axis] = FLT_MAX;
+}
+
void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel)
{
ImGuiContext& g = *GImGui;
@@ -10313,9 +12377,13 @@ void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id
IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu);
g.NavId = id;
g.NavLayer = nav_layer;
- g.NavFocusScopeId = focus_scope_id;
+ SetNavFocusScope(focus_scope_id);
g.NavWindow->NavLastIds[nav_layer] = id;
g.NavWindow->NavRectRel[nav_layer] = rect_rel;
+
+ // Clear preferred scoring position (NavMoveRequestApplyResult() will tend to restore it)
+ NavClearPreferredPosForAxis(ImGuiAxis_X);
+ NavClearPreferredPosForAxis(ImGuiAxis_Y);
}
void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window)
@@ -10331,48 +12399,38 @@ void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window)
const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent;
g.NavId = id;
g.NavLayer = nav_layer;
- g.NavFocusScopeId = g.CurrentFocusScopeId;
+ SetNavFocusScope(g.CurrentFocusScopeId);
window->NavLastIds[nav_layer] = id;
if (g.LastItemData.ID == id)
window->NavRectRel[nav_layer] = WindowRectAbsToRel(window, g.LastItemData.NavRect);
- if (g.ActiveIdSource == ImGuiInputSource_Nav)
- g.NavDisableMouseHover = true;
- else
- g.NavDisableHighlight = true;
+ if (g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad)
+ g.NavHighlightItemUnderNav = true;
+ else if (g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = false;
+
+ // Clear preferred scoring position (NavMoveRequestApplyResult() will tend to restore it)
+ NavClearPreferredPosForAxis(ImGuiAxis_X);
+ NavClearPreferredPosForAxis(ImGuiAxis_Y);
}
-ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy)
+static ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy)
{
if (ImFabs(dx) > ImFabs(dy))
return (dx > 0.0f) ? ImGuiDir_Right : ImGuiDir_Left;
return (dy > 0.0f) ? ImGuiDir_Down : ImGuiDir_Up;
}
-static float inline NavScoreItemDistInterval(float a0, float a1, float b0, float b1)
+static float inline NavScoreItemDistInterval(float cand_min, float cand_max, float curr_min, float curr_max)
{
- if (a1 < b0)
- return a1 - b0;
- if (b1 < a0)
- return a0 - b1;
+ if (cand_max < curr_min)
+ return cand_max - curr_min;
+ if (curr_max < cand_min)
+ return cand_min - curr_max;
return 0.0f;
}
-static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect& r, const ImRect& clip_rect)
-{
- if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right)
- {
- r.Min.y = ImClamp(r.Min.y, clip_rect.Min.y, clip_rect.Max.y);
- r.Max.y = ImClamp(r.Max.y, clip_rect.Min.y, clip_rect.Max.y);
- }
- else // FIXME: PageUp/PageDown are leaving move_dir == None
- {
- r.Min.x = ImClamp(r.Min.x, clip_rect.Min.x, clip_rect.Max.x);
- r.Max.x = ImClamp(r.Max.x, clip_rect.Min.x, clip_rect.Max.x);
- }
-}
-
-// Scoring function for gamepad/keyboard directional navigation. Based on https://gist.github.com/rygorous/6981057
+// Scoring function for keyboard/gamepad directional navigation. Based on https://gist.github.com/rygorous/6981057
static bool ImGui::NavScoreItem(ImGuiNavItemData* result)
{
ImGuiContext& g = *GImGui;
@@ -10388,16 +12446,12 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result)
// When entering through a NavFlattened border, we consider child window items as fully clipped for scoring
if (window->ParentWindow == g.NavWindow)
{
- IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened);
+ IM_ASSERT((window->ChildFlags | g.NavWindow->ChildFlags) & ImGuiChildFlags_NavFlattened);
if (!window->ClipRect.Overlaps(cand))
return false;
cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window
}
- // We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items)
- // For example, this ensures that items in one column are not reached when moving vertically from items in another column.
- NavClampRectToVisibleAreaForMoveDir(g.NavMoveClipDir, cand, window->ClipRect);
-
// Compute distance between boxes
// FIXME-NAV: Introducing biases for vertical navigation, needs to be removed.
float dbx = NavScoreItemDistInterval(cand.Min.x, cand.Max.x, curr.Min.x, curr.Max.x);
@@ -10417,6 +12471,9 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result)
if (dbx != 0.0f || dby != 0.0f)
{
// For non-overlapping boxes, use distance between boxes
+ // FIXME-NAV: Quadrant may be incorrect because of (1) dbx bias and (2) curr.Max.y bias applied by NavBiasScoringRect() where typically curr.Max.y==curr.Min.y
+ // One typical case where this happens, with style.WindowMenuButtonPosition == ImGuiDir_Right, pressing Left to navigate from Close to Collapse tends to fail.
+ // Also see #6344. Calling ImGetDirQuadrantFromDelta() with unbiased values may be good but side-effects are plenty.
dax = dbx;
day = dby;
dist_axial = dist_box;
@@ -10436,32 +12493,41 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result)
quadrant = (g.LastItemData.ID < g.NavId) ? ImGuiDir_Left : ImGuiDir_Right;
}
+ const ImGuiDir move_dir = g.NavMoveDir;
#if IMGUI_DEBUG_NAV_SCORING
- char buf[128];
- if (IsMouseHoveringRect(cand.Min, cand.Max))
- {
- ImFormatString(buf, IM_ARRAYSIZE(buf), "dbox (%.2f,%.2f->%.4f)\ndcen (%.2f,%.2f->%.4f)\nd (%.2f,%.2f->%.4f)\nnav %c, quadrant %c", dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "WENS"[g.NavMoveDir], "WENS"[quadrant]);
- ImDrawList* draw_list = GetForegroundDrawList(window);
- draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255,200,0,100));
- draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255,255,0,200));
- draw_list->AddRectFilled(cand.Max - ImVec2(4, 4), cand.Max + CalcTextSize(buf) + ImVec2(4, 4), IM_COL32(40,0,0,150));
- draw_list->AddText(cand.Max, ~0U, buf);
- }
- else if (g.IO.KeyCtrl) // Hold to preview score in matching quadrant. Press C to rotate.
+ char buf[200];
+ if (g.IO.KeyCtrl) // Hold CTRL to preview score in matching quadrant. CTRL+Arrow to rotate.
{
- if (quadrant == g.NavMoveDir)
+ if (quadrant == move_dir)
{
ImFormatString(buf, IM_ARRAYSIZE(buf), "%.0f/%.0f", dist_box, dist_center);
ImDrawList* draw_list = GetForegroundDrawList(window);
- draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 200));
+ draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 80));
+ draw_list->AddRectFilled(cand.Min, cand.Min + CalcTextSize(buf), IM_COL32(255, 0, 0, 200));
draw_list->AddText(cand.Min, IM_COL32(255, 255, 255, 255), buf);
}
}
+ const bool debug_hovering = IsMouseHoveringRect(cand.Min, cand.Max);
+ const bool debug_tty = (g.IO.KeyCtrl && IsKeyPressed(ImGuiKey_Space));
+ if (debug_hovering || debug_tty)
+ {
+ ImFormatString(buf, IM_ARRAYSIZE(buf),
+ "d-box (%7.3f,%7.3f) -> %7.3f\nd-center (%7.3f,%7.3f) -> %7.3f\nd-axial (%7.3f,%7.3f) -> %7.3f\nnav %c, quadrant %c",
+ dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "-WENS"[move_dir+1], "-WENS"[quadrant+1]);
+ if (debug_hovering)
+ {
+ ImDrawList* draw_list = GetForegroundDrawList(window);
+ draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255, 200, 0, 100));
+ draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255, 255, 0, 200));
+ draw_list->AddRectFilled(cand.Max - ImVec2(4, 4), cand.Max + CalcTextSize(buf) + ImVec2(4, 4), IM_COL32(40, 0, 0, 200));
+ draw_list->AddText(cand.Max, ~0U, buf);
+ }
+ if (debug_tty) { IMGUI_DEBUG_LOG_NAV("id 0x%08X\n%s\n", g.LastItemData.ID, buf); }
+ }
#endif
// Is it in the quadrant we're interested in moving to?
bool new_best = false;
- const ImGuiDir move_dir = g.NavMoveDir;
if (quadrant == move_dir)
{
// Does it beat the current best candidate?
@@ -10513,29 +12579,49 @@ static void ImGui::NavApplyItemToResult(ImGuiNavItemData* result)
result->Window = window;
result->ID = g.LastItemData.ID;
result->FocusScopeId = g.CurrentFocusScopeId;
- result->InFlags = g.LastItemData.InFlags;
+ result->ItemFlags = g.LastItemData.ItemFlags;
result->RectRel = WindowRectAbsToRel(window, g.LastItemData.NavRect);
+ if (result->ItemFlags & ImGuiItemFlags_HasSelectionUserData)
+ {
+ IM_ASSERT(g.NextItemData.SelectionUserData != ImGuiSelectionUserData_Invalid);
+ result->SelectionUserData = g.NextItemData.SelectionUserData; // INTENTIONAL: At this point this field is not cleared in NextItemData. Avoid unnecessary copy to LastItemData.
+ }
+}
+
+// True when current work location may be scrolled horizontally when moving left / right.
+// This is generally always true UNLESS within a column. We don't have a vertical equivalent.
+void ImGui::NavUpdateCurrentWindowIsScrollPushableX()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ window->DC.NavIsScrollPushableX = (g.CurrentTable == NULL && window->DC.CurrentColumns == NULL);
}
// We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above)
-// This is called after LastItemData is set.
+// This is called after LastItemData is set, but NextItemData is also still valid.
static void ImGui::NavProcessItem()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
const ImGuiID id = g.LastItemData.ID;
+ const ImGuiItemFlags item_flags = g.LastItemData.ItemFlags;
+
+ // When inside a container that isn't scrollable with Left<>Right, clip NavRect accordingly (#2221)
+ if (window->DC.NavIsScrollPushableX == false)
+ {
+ g.LastItemData.NavRect.Min.x = ImClamp(g.LastItemData.NavRect.Min.x, window->ClipRect.Min.x, window->ClipRect.Max.x);
+ g.LastItemData.NavRect.Max.x = ImClamp(g.LastItemData.NavRect.Max.x, window->ClipRect.Min.x, window->ClipRect.Max.x);
+ }
const ImRect nav_bb = g.LastItemData.NavRect;
- const ImGuiItemFlags item_flags = g.LastItemData.InFlags;
// Process Init Request
if (g.NavInitRequest && g.NavLayer == window->DC.NavLayerCurrent && (item_flags & ImGuiItemFlags_Disabled) == 0)
{
// Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback
const bool candidate_for_nav_default_focus = (item_flags & ImGuiItemFlags_NoNavDefaultFocus) == 0;
- if (candidate_for_nav_default_focus || g.NavInitResultId == 0)
+ if (candidate_for_nav_default_focus || g.NavInitResult.ID == 0)
{
- g.NavInitResultId = id;
- g.NavInitResultRectRel = WindowRectAbsToRel(window, nav_bb);
+ NavApplyItemToResult(&g.NavInitResult);
}
if (candidate_for_nav_default_focus)
{
@@ -10546,20 +12632,18 @@ static void ImGui::NavProcessItem()
// Process Move Request (scoring for navigation)
// FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy)
- if (g.NavMoveScoringItems)
+ if (g.NavMoveScoringItems && (item_flags & ImGuiItemFlags_Disabled) == 0)
{
- const bool is_tab_stop = (item_flags & ImGuiItemFlags_Inputable) && (item_flags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0;
- const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) != 0;
- if (is_tabbing)
+ if ((g.NavMoveFlags & ImGuiNavMoveFlags_FocusApi) || (window->Flags & ImGuiWindowFlags_NoNavInputs) == 0)
{
- if (is_tab_stop || (g.NavMoveFlags & ImGuiNavMoveFlags_FocusApi))
- NavProcessItemForTabbingRequest(id);
- }
- else if ((g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & ImGuiItemFlags_Disabled))
- {
- ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther;
- if (!is_tabbing)
+ const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0;
+ if (is_tabbing)
+ {
+ NavProcessItemForTabbingRequest(id, item_flags, g.NavMoveFlags);
+ }
+ else if (g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId))
{
+ ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther;
if (NavScoreItem(result))
NavApplyItemToResult(result);
@@ -10573,15 +12657,21 @@ static void ImGui::NavProcessItem()
}
}
- // Update window-relative bounding box of navigated item
+ // Update information for currently focused/navigated item
if (g.NavId == id)
{
if (g.NavWindow != window)
SetNavWindow(window); // Always refresh g.NavWindow, because some operations such as FocusItem() may not have a window.
g.NavLayer = window->DC.NavLayerCurrent;
+ SetNavFocusScope(g.CurrentFocusScopeId); // Will set g.NavFocusScopeId AND store g.NavFocusScopePath
g.NavFocusScopeId = g.CurrentFocusScopeId;
g.NavIdIsAlive = true;
- window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position)
+ if (g.LastItemData.ItemFlags & ImGuiItemFlags_HasSelectionUserData)
+ {
+ IM_ASSERT(g.NextItemData.SelectionUserData != ImGuiSelectionUserData_Invalid);
+ g.NavLastValidSelectionUserData = g.NextItemData.SelectionUserData; // INTENTIONAL: At this point this field is not cleared in NextItemData. Avoid unnecessary copy to LastItemData.
+ }
+ window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position)
}
}
@@ -10592,18 +12682,35 @@ static void ImGui::NavProcessItem()
// - Case 3: tab forward wrap: set result to first eligible item (preemptively), on ref id set counter, on next frame if counter hasn't elapsed store result. // FIXME-TABBING: Could be done as a next-frame forwarded request
// - Case 4: tab backward: store all results, on ref id pick prev, stop storing
// - Case 5: tab backward wrap: store all results, on ref id if no result keep storing until last // FIXME-TABBING: Could be done as next-frame forwarded requested
-void ImGui::NavProcessItemForTabbingRequest(ImGuiID id)
+void ImGui::NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flags, ImGuiNavMoveFlags move_flags)
{
ImGuiContext& g = *GImGui;
+ if ((move_flags & ImGuiNavMoveFlags_FocusApi) == 0)
+ {
+ if (g.NavLayer != g.CurrentWindow->DC.NavLayerCurrent)
+ return;
+ if (g.NavFocusScopeId != g.CurrentFocusScopeId)
+ return;
+ }
+
+ // - Can always land on an item when using API call.
+ // - Tabbing with _NavEnableKeyboard (space/enter/arrows): goes through every item.
+ // - Tabbing without _NavEnableKeyboard: goes through inputable items only.
+ bool can_stop;
+ if (move_flags & ImGuiNavMoveFlags_FocusApi)
+ can_stop = true;
+ else
+ can_stop = (item_flags & ImGuiItemFlags_NoTabStop) == 0 && ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) || (item_flags & ImGuiItemFlags_Inputable));
+
// Always store in NavMoveResultLocal (unlike directional request which uses NavMoveResultOther on sibling/flattened windows)
ImGuiNavItemData* result = &g.NavMoveResultLocal;
if (g.NavTabbingDir == +1)
{
// Tab Forward or SetKeyboardFocusHere() with >= 0
- if (g.NavTabbingResultFirst.ID == 0)
+ if (can_stop && g.NavTabbingResultFirst.ID == 0)
NavApplyItemToResult(&g.NavTabbingResultFirst);
- if (--g.NavTabbingCounter == 0)
+ if (can_stop && g.NavTabbingCounter > 0 && --g.NavTabbingCounter == 0)
NavMoveRequestResolveWithLastItem(result);
else if (g.NavId == id)
g.NavTabbingCounter = 1;
@@ -10619,16 +12726,18 @@ void ImGui::NavProcessItemForTabbingRequest(ImGuiID id)
NavUpdateAnyRequestFlag();
}
}
- else
+ else if (can_stop)
{
+ // Keep applying until reaching NavId
NavApplyItemToResult(result);
}
}
else if (g.NavTabbingDir == 0)
{
- // Tab Init
- if (g.NavTabbingResultFirst.ID == 0)
- NavMoveRequestResolveWithLastItem(&g.NavTabbingResultFirst);
+ if (can_stop && g.NavId == id)
+ NavMoveRequestResolveWithLastItem(result);
+ if (can_stop && g.NavTabbingResultFirst.ID == 0) // Tab init
+ NavApplyItemToResult(&g.NavTabbingResultFirst);
}
}
@@ -10643,8 +12752,9 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM
{
ImGuiContext& g = *GImGui;
IM_ASSERT(g.NavWindow != NULL);
+ //IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequestSubmit: dir %c, window \"%s\"\n", "-WENS"[move_dir + 1], g.NavWindow->Name);
- if (move_flags & ImGuiNavMoveFlags_Tabbing)
+ if (move_flags & ImGuiNavMoveFlags_IsTabbing)
move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId;
g.NavMoveSubmitted = g.NavMoveScoringItems = true;
@@ -10654,7 +12764,7 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM
g.NavMoveFlags = move_flags;
g.NavMoveScrollFlags = scroll_flags;
g.NavMoveForwardToNextFrame = false;
- g.NavMoveKeyMods = g.IO.KeyMods;
+ g.NavMoveKeyMods = (move_flags & ImGuiNavMoveFlags_FocusApi) ? 0 : g.IO.KeyMods;
g.NavMoveResultLocal.Clear();
g.NavMoveResultLocalVisible.Clear();
g.NavMoveResultOther.Clear();
@@ -10671,6 +12781,19 @@ void ImGui::NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result)
NavUpdateAnyRequestFlag();
}
+// Called by TreePop() to implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere
+void ImGui::NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiTreeNodeStackData* tree_node_data)
+{
+ ImGuiContext& g = *GImGui;
+ g.NavMoveScoringItems = false;
+ g.LastItemData.ID = tree_node_data->ID;
+ g.LastItemData.ItemFlags = tree_node_data->ItemFlags & ~ImGuiItemFlags_HasSelectionUserData; // Losing SelectionUserData, recovered next-frame (cheaper).
+ g.LastItemData.NavRect = tree_node_data->NavRect;
+ NavApplyItemToResult(result); // Result this instead of implementing a NavApplyPastTreeNodeToResult()
+ NavClearPreferredPosForAxis(ImGuiAxis_Y);
+ NavUpdateAnyRequestFlag();
+}
+
void ImGui::NavMoveRequestCancel()
{
ImGuiContext& g = *GImGui;
@@ -10696,10 +12819,12 @@ void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNav
void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags wrap_flags)
{
ImGuiContext& g = *GImGui;
- IM_ASSERT(wrap_flags != 0); // Call with _WrapX, _WrapY, _LoopX, _LoopY
- // In theory we should test for NavMoveRequestButNoResultYet() but there's no point doing it, NavEndFrame() will do the same test
+ IM_ASSERT((wrap_flags & ImGuiNavMoveFlags_WrapMask_ ) != 0 && (wrap_flags & ~ImGuiNavMoveFlags_WrapMask_) == 0); // Call with _WrapX, _WrapY, _LoopX, _LoopY
+
+ // In theory we should test for NavMoveRequestButNoResultYet() but there's no point doing it:
+ // as NavEndFrame() will do the same test. It will end up calling NavUpdateCreateWrappingRequest().
if (g.NavWindow == window && g.NavMoveScoringItems && g.NavLayer == ImGuiNavLayer_Main)
- g.NavMoveFlags |= wrap_flags;
+ g.NavMoveFlags = (g.NavMoveFlags & ~ImGuiNavMoveFlags_WrapMask_) | wrap_flags;
}
// FIXME: This could be replaced by updating a frame number in each window when (window == NavWindow) and (NavLayer == 0).
@@ -10729,6 +12854,7 @@ void ImGui::NavRestoreLayer(ImGuiNavLayer layer)
{
ImGuiWindow* prev_nav_window = g.NavWindow;
g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); // FIXME-NAV: Should clear ongoing nav requests?
+ g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
if (prev_nav_window)
IMGUI_DEBUG_LOG_FOCUS("[focus] NavRestoreLayer: from \"%s\" to SetNavWindow(\"%s\")\n", prev_nav_window->Name, g.NavWindow->Name);
}
@@ -10744,13 +12870,6 @@ void ImGui::NavRestoreLayer(ImGuiNavLayer layer)
}
}
-void ImGui::NavRestoreHighlightAfterMove()
-{
- ImGuiContext& g = *GImGui;
- g.NavDisableHighlight = false;
- g.NavDisableMouseHover = g.NavMousePosDirty = true;
-}
-
static inline void ImGui::NavUpdateAnyRequestFlag()
{
ImGuiContext& g = *GImGui;
@@ -10768,7 +12887,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit)
if (window->Flags & ImGuiWindowFlags_NoNavInputs)
{
g.NavId = 0;
- g.NavFocusScopeId = window->NavRootFocusScopeId;
+ SetNavFocusScope(window->NavRootFocusScopeId);
return;
}
@@ -10781,22 +12900,39 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit)
SetNavID(0, g.NavLayer, window->NavRootFocusScopeId, ImRect());
g.NavInitRequest = true;
g.NavInitRequestFromMove = false;
- g.NavInitResultId = 0;
- g.NavInitResultRectRel = ImRect();
+ g.NavInitResult.ID = 0;
NavUpdateAnyRequestFlag();
}
else
{
g.NavId = window->NavLastIds[0];
- g.NavFocusScopeId = window->NavRootFocusScopeId;
+ SetNavFocusScope(window->NavRootFocusScopeId);
}
}
+static ImGuiInputSource ImGui::NavCalcPreferredRefPosSource()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.NavWindow;
+ const bool activated_shortcut = g.ActiveId != 0 && g.ActiveIdFromShortcut && g.ActiveId == g.LastItemData.ID;
+
+ // Testing for !activated_shortcut here could in theory be removed if we decided that activating a remote shortcut altered one of the g.NavDisableXXX flag.
+ if ((!g.NavCursorVisible || !g.NavHighlightItemUnderNav || !window) && !activated_shortcut)
+ return ImGuiInputSource_Mouse;
+ else
+ return ImGuiInputSource_Keyboard; // or Nav in general
+}
+
static ImVec2 ImGui::NavCalcPreferredRefPos()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.NavWindow;
- if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window)
+ ImGuiInputSource source = NavCalcPreferredRefPosSource();
+
+ const bool activated_shortcut = g.ActiveId != 0 && g.ActiveIdFromShortcut && g.ActiveId == g.LastItemData.ID;
+
+ // Testing for !activated_shortcut here could in theory be removed if we decided that activating a remote shortcut altered one of the g.NavDisableXXX flag.
+ if (source == ImGuiInputSource_Mouse)
{
// Mouse (we need a fallback in case the mouse becomes invalid after being used)
// The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard.
@@ -10807,16 +12943,21 @@ static ImVec2 ImGui::NavCalcPreferredRefPos()
else
{
// When navigation is active and mouse is disabled, pick a position around the bottom left of the currently navigated item
+ ImRect ref_rect;
+ if (activated_shortcut)
+ ref_rect = g.LastItemData.NavRect;
+ else
+ ref_rect = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]);
+
// Take account of upcoming scrolling (maybe set mouse pos should be done in EndFrame?)
- ImRect rect_rel = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]);
if (window->LastFrameActive != g.FrameCount && (window->ScrollTarget.x != FLT_MAX || window->ScrollTarget.y != FLT_MAX))
{
ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window);
- rect_rel.Translate(window->Scroll - next_scroll);
+ ref_rect.Translate(window->Scroll - next_scroll);
}
- ImVec2 pos = ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight()));
+ ImVec2 pos = ImVec2(ref_rect.Min.x + ImMin(g.Style.FramePadding.x * 4, ref_rect.GetWidth()), ref_rect.Max.y - ImMin(g.Style.FramePadding.y, ref_rect.GetHeight()));
ImGuiViewport* viewport = GetMainViewport();
- return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta.
+ return ImTrunc(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImTrunc() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta.
}
}
@@ -10867,23 +13008,27 @@ static void ImGui::NavUpdate()
g.NavInputSource = ImGuiInputSource_Keyboard;
// Process navigation init request (select first/default focus)
- if (g.NavInitResultId != 0)
+ g.NavJustMovedToId = 0;
+ g.NavJustMovedToFocusScopeId = g.NavJustMovedFromFocusScopeId = 0;
+ if (g.NavInitResult.ID != 0)
NavInitRequestApplyResult();
g.NavInitRequest = false;
g.NavInitRequestFromMove = false;
- g.NavInitResultId = 0;
- g.NavJustMovedToId = 0;
+ g.NavInitResult.ID = 0;
// Process navigation move request
if (g.NavMoveSubmitted)
NavMoveRequestApplyResult();
g.NavTabbingCounter = 0;
g.NavMoveSubmitted = g.NavMoveScoringItems = false;
+ if (g.NavCursorHideFrames > 0)
+ if (--g.NavCursorHideFrames == 0)
+ g.NavCursorVisible = true;
// Schedule mouse position update (will be done at the bottom of this function, after 1) processing all move requests and 2) updating scrolling)
bool set_mouse_pos = false;
if (g.NavMousePosDirty && g.NavIdIsAlive)
- if (!g.NavDisableHighlight && g.NavDisableMouseHover && g.NavWindow)
+ if (g.NavCursorVisible && g.NavHighlightItemUnderNav && g.NavWindow)
set_mouse_pos = true;
g.NavMousePosDirty = false;
IM_ASSERT(g.NavLayer == ImGuiNavLayer_Main || g.NavLayer == ImGuiNavLayer_Menu);
@@ -10899,20 +13044,20 @@ static void ImGui::NavUpdate()
// Set output flags for user application
io.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs);
- io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL);
+ io.NavVisible = (io.NavActive && g.NavId != 0 && g.NavCursorVisible) || (g.NavWindowingTarget != NULL);
// Process NavCancel input (to close a popup, get back to parent, clear focus)
NavUpdateCancelRequest();
// Process manual activation request
- g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavActivateInputId = 0;
+ g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = 0;
g.NavActivateFlags = ImGuiActivateFlags_None;
- if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
+ if (g.NavId != 0 && g.NavCursorVisible && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
{
- const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate));
- const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, false)));
- const bool input_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Enter)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput));
- const bool input_pressed = input_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Enter, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, false)));
+ const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate, ImGuiKeyOwner_NoOwner));
+ const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, 0, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, 0, ImGuiKeyOwner_NoOwner)));
+ const bool input_down = (nav_keyboard_active && (IsKeyDown(ImGuiKey_Enter, ImGuiKeyOwner_NoOwner) || IsKeyDown(ImGuiKey_KeypadEnter, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput, ImGuiKeyOwner_NoOwner));
+ const bool input_pressed = input_down && ((nav_keyboard_active && (IsKeyPressed(ImGuiKey_Enter, 0, ImGuiKeyOwner_NoOwner) || IsKeyPressed(ImGuiKey_KeypadEnter, 0, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, 0, ImGuiKeyOwner_NoOwner)));
if (g.ActiveId == 0 && activate_pressed)
{
g.NavActivateId = g.NavId;
@@ -10920,27 +13065,35 @@ static void ImGui::NavUpdate()
}
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && input_pressed)
{
- g.NavActivateInputId = g.NavId;
+ g.NavActivateId = g.NavId;
g.NavActivateFlags = ImGuiActivateFlags_PreferInput;
}
- if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down)
+ if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_down || input_down))
g.NavActivateDownId = g.NavId;
- if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed)
+ if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_pressed || input_pressed))
+ {
g.NavActivatePressedId = g.NavId;
+ NavHighlightActivated(g.NavId);
+ }
}
if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
- g.NavDisableHighlight = true;
+ g.NavCursorVisible = false;
+ else if (g.IO.ConfigNavCursorVisibleAlways && g.NavCursorHideFrames == 0)
+ g.NavCursorVisible = true;
if (g.NavActivateId != 0)
IM_ASSERT(g.NavActivateDownId == g.NavActivateId);
+ // Highlight
+ if (g.NavHighlightActivatedTimer > 0.0f)
+ g.NavHighlightActivatedTimer = ImMax(0.0f, g.NavHighlightActivatedTimer - io.DeltaTime);
+ if (g.NavHighlightActivatedTimer == 0.0f)
+ g.NavHighlightActivatedId = 0;
+
// Process programmatic activation request
// FIXME-NAV: Those should eventually be queued (unlike focus they don't cancel each others)
if (g.NavNextActivateId != 0)
{
- if (g.NavNextActivateFlags & ImGuiActivateFlags_PreferInput)
- g.NavActivateInputId = g.NavNextActivateId;
- else
- g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavNextActivateId;
+ g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavNextActivateId;
g.NavActivateFlags = g.NavNextActivateFlags;
}
g.NavNextActivateId = 0;
@@ -10957,53 +13110,49 @@ static void ImGui::NavUpdate()
{
// *Fallback* manual-scroll with Nav directional keys when window has no navigable item
ImGuiWindow* window = g.NavWindow;
- const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * io.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported.
+ const float scroll_speed = IM_ROUND(window->FontRefSize * 100 * io.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported.
const ImGuiDir move_dir = g.NavMoveDir;
- if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll && move_dir != ImGuiDir_None)
+ if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY && move_dir != ImGuiDir_None)
{
if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right)
- SetScrollX(window, ImFloor(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed));
+ SetScrollX(window, ImTrunc(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed));
if (move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down)
- SetScrollY(window, ImFloor(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed));
+ SetScrollY(window, ImTrunc(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed));
}
// *Normal* Manual scroll with LStick
// Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds.
if (nav_gamepad_active)
{
- const ImVec2 scroll_dir = GetKeyVector2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown);
+ const ImVec2 scroll_dir = GetKeyMagnitude2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown);
const float tweak_factor = IsKeyDown(ImGuiKey_NavGamepadTweakSlow) ? 1.0f / 10.0f : IsKeyDown(ImGuiKey_NavGamepadTweakFast) ? 10.0f : 1.0f;
if (scroll_dir.x != 0.0f && window->ScrollbarX)
- SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor));
+ SetScrollX(window, ImTrunc(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor));
if (scroll_dir.y != 0.0f)
- SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor));
+ SetScrollY(window, ImTrunc(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor));
}
}
// Always prioritize mouse highlight if navigation is disabled
if (!nav_keyboard_active && !nav_gamepad_active)
{
- g.NavDisableHighlight = true;
- g.NavDisableMouseHover = set_mouse_pos = false;
+ g.NavCursorVisible = false;
+ g.NavHighlightItemUnderNav = set_mouse_pos = false;
}
// Update mouse position if requested
// (This will take into account the possibility that a Scroll was queued in the window to offset our absolute mouse position before scroll has been applied)
- if (set_mouse_pos && (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos))
- {
- io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos();
- io.WantSetMousePos = true;
- //IMGUI_DEBUG_LOG_IO("SetMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y);
- }
+ if (set_mouse_pos && io.ConfigNavMoveSetMousePos && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos))
+ TeleportMousePos(NavCalcPreferredRefPos());
// [DEBUG]
g.NavScoringDebugCount = 0;
#if IMGUI_DEBUG_NAV_RECTS
- if (g.NavWindow)
+ if (ImGuiWindow* debug_window = g.NavWindow)
{
- ImDrawList* draw_list = GetForegroundDrawList(g.NavWindow);
- if (1) { for (int layer = 0; layer < 2; layer++) { ImRect r = WindowRectRelToAbs(g.NavWindow, g.NavWindow->NavRectRel[layer]); draw_list->AddRect(r.Min, r.Max, IM_COL32(255,200,0,255)); } } // [DEBUG]
- if (1) { ImU32 col = (!g.NavWindow->Hidden) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); draw_list->AddCircleFilled(p, 3.0f, col); draw_list->AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); }
+ ImDrawList* draw_list = GetForegroundDrawList(debug_window);
+ int layer = g.NavLayer; /* for (int layer = 0; layer < 2; layer++)*/ { ImRect r = WindowRectRelToAbs(debug_window, debug_window->NavRectRel[layer]); draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 200, 0, 255)); }
+ //if (1) { ImU32 col = (!debug_window->Hidden) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); draw_list->AddCircleFilled(p, 3.0f, col); draw_list->AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); }
}
#endif
}
@@ -11015,13 +13164,51 @@ void ImGui::NavInitRequestApplyResult()
if (!g.NavWindow)
return;
+ ImGuiNavItemData* result = &g.NavInitResult;
+ if (g.NavId != result->ID)
+ {
+ g.NavJustMovedFromFocusScopeId = g.NavFocusScopeId;
+ g.NavJustMovedToId = result->ID;
+ g.NavJustMovedToFocusScopeId = result->FocusScopeId;
+ g.NavJustMovedToKeyMods = 0;
+ g.NavJustMovedToIsTabbing = false;
+ g.NavJustMovedToHasSelectionData = (result->ItemFlags & ImGuiItemFlags_HasSelectionUserData) != 0;
+ }
+
// Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called)
// FIXME-NAV: On _NavFlattened windows, g.NavWindow will only be updated during subsequent frame. Not a problem currently.
- IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name);
- SetNavID(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel);
+ IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name);
+ SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel);
g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result
+ if (result->SelectionUserData != ImGuiSelectionUserData_Invalid)
+ g.NavLastValidSelectionUserData = result->SelectionUserData;
if (g.NavInitRequestFromMove)
- NavRestoreHighlightAfterMove();
+ SetNavCursorVisibleAfterMove();
+}
+
+// Bias scoring rect ahead of scoring + update preferred pos (if missing) using source position
+static void NavBiasScoringRect(ImRect& r, ImVec2& preferred_pos_rel, ImGuiDir move_dir, ImGuiNavMoveFlags move_flags)
+{
+ // Bias initial rect
+ ImGuiContext& g = *GImGui;
+ const ImVec2 rel_to_abs_offset = g.NavWindow->DC.CursorStartPos;
+
+ // Initialize bias on departure if we don't have any. So mouse-click + arrow will record bias.
+ // - We default to L/U bias, so moving down from a large source item into several columns will land on left-most column.
+ // - But each successful move sets new bias on one axis, only cleared when using mouse.
+ if ((move_flags & ImGuiNavMoveFlags_Forwarded) == 0)
+ {
+ if (preferred_pos_rel.x == FLT_MAX)
+ preferred_pos_rel.x = ImMin(r.Min.x + 1.0f, r.Max.x) - rel_to_abs_offset.x;
+ if (preferred_pos_rel.y == FLT_MAX)
+ preferred_pos_rel.y = r.GetCenter().y - rel_to_abs_offset.y;
+ }
+
+ // Apply general bias on the other axis
+ if ((move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) && preferred_pos_rel.x != FLT_MAX)
+ r.Min.x = r.Max.x = preferred_pos_rel.x + rel_to_abs_offset.x;
+ else if ((move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) && preferred_pos_rel.y != FLT_MAX)
+ r.Min.y = r.Max.y = preferred_pos_rel.y + rel_to_abs_offset.y;
}
void ImGui::NavUpdateCreateMoveRequest()
@@ -11048,11 +13235,11 @@ void ImGui::NavUpdateCreateMoveRequest()
g.NavMoveScrollFlags = ImGuiScrollFlags_None;
if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs))
{
- const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateNavMove;
- if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Left; }
- if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Right; }
- if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Up; }
- if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Down; }
+ const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateNavMove;
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Left; }
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Right; }
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Up; }
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Down; }
}
g.NavMoveClipDir = g.NavMoveDir;
g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX);
@@ -11069,13 +13256,15 @@ void ImGui::NavUpdateCreateMoveRequest()
g.NavScoringNoClipRect.TranslateY(scoring_rect_offset_y);
}
- // [DEBUG] Always send a request
+ // [DEBUG] Always send a request when holding CTRL. Hold CTRL + Arrow change the direction.
#if IMGUI_DEBUG_NAV_SCORING
- if (io.KeyCtrl && IsKeyPressed(ImGuiKey_C))
- g.NavMoveDirForDebug = (ImGuiDir)((g.NavMoveDirForDebug + 1) & 3);
- if (io.KeyCtrl && g.NavMoveDir == ImGuiDir_None)
+ //if (io.KeyCtrl && IsKeyPressed(ImGuiKey_C))
+ // g.NavMoveDirForDebug = (ImGuiDir)((g.NavMoveDirForDebug + 1) & 3);
+ if (io.KeyCtrl)
{
- g.NavMoveDir = g.NavMoveDirForDebug;
+ if (g.NavMoveDir == ImGuiDir_None)
+ g.NavMoveDir = g.NavMoveDirForDebug;
+ g.NavMoveClipDir = g.NavMoveDir;
g.NavMoveFlags |= ImGuiNavMoveFlags_DebugNoResult;
}
#endif
@@ -11090,23 +13279,29 @@ void ImGui::NavUpdateCreateMoveRequest()
{
IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from move, window \"%s\", layer=%d\n", window ? window->Name : "<NULL>", g.NavLayer);
g.NavInitRequest = g.NavInitRequestFromMove = true;
- g.NavInitResultId = 0;
- g.NavDisableHighlight = false;
+ g.NavInitResult.ID = 0;
+ if (g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = true;
}
// When using gamepad, we project the reference nav bounding box into window visible area.
- // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad all movements are relative
- // (can't focus a visible object like we can with the mouse).
+ // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling,
+ // since with gamepad all movements are relative (can't focus a visible object like we can with the mouse).
if (g.NavMoveSubmitted && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main && window != NULL)// && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded))
{
bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 0;
bool clamp_y = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapY)) == 0;
ImRect inner_rect_rel = WindowRectAbsToRel(window, ImRect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)));
+
+ // Take account of changing scroll to handle triggering a new move request on a scrolling frame. (#6171)
+ // Otherwise 'inner_rect_rel' would be off on the move result frame.
+ inner_rect_rel.Translate(CalcNextScrollFromScrollTargetAndClamp(window) - window->Scroll);
+
if ((clamp_x || clamp_y) && !inner_rect_rel.Contains(window->NavRectRel[g.NavLayer]))
{
- //IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n");
- float pad_x = ImMin(inner_rect_rel.GetWidth(), window->CalcFontSize() * 0.5f);
- float pad_y = ImMin(inner_rect_rel.GetHeight(), window->CalcFontSize() * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item
+ IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n");
+ float pad_x = ImMin(inner_rect_rel.GetWidth(), window->FontRefSize * 0.5f);
+ float pad_y = ImMin(inner_rect_rel.GetHeight(), window->FontRefSize * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item
inner_rect_rel.Min.x = clamp_x ? (inner_rect_rel.Min.x + pad_x) : -FLT_MAX;
inner_rect_rel.Max.x = clamp_x ? (inner_rect_rel.Max.x - pad_x) : +FLT_MAX;
inner_rect_rel.Min.y = clamp_y ? (inner_rect_rel.Min.y + pad_y) : -FLT_MAX;
@@ -11123,9 +13318,9 @@ void ImGui::NavUpdateCreateMoveRequest()
ImRect nav_rect_rel = !window->NavRectRel[g.NavLayer].IsInverted() ? window->NavRectRel[g.NavLayer] : ImRect(0, 0, 0, 0);
scoring_rect = WindowRectRelToAbs(window, nav_rect_rel);
scoring_rect.TranslateY(scoring_rect_offset_y);
- scoring_rect.Min.x = ImMin(scoring_rect.Min.x + 1.0f, scoring_rect.Max.x);
- scoring_rect.Max.x = scoring_rect.Min.x;
- IM_ASSERT(!scoring_rect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem().
+ if (g.NavMoveSubmitted)
+ NavBiasScoringRect(scoring_rect, window->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer], g.NavMoveDir, g.NavMoveFlags);
+ IM_ASSERT(!scoring_rect.IsInverted()); // Ensure we have a non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem().
//GetForegroundDrawList()->AddRect(scoring_rect.Min, scoring_rect.Max, IM_COL32(255,200,0,255)); // [DEBUG]
//if (!g.NavScoringNoClipRect.IsInverted()) { GetForegroundDrawList()->AddRect(g.NavScoringNoClipRect.Min, g.NavScoringNoClipRect.Max, IM_COL32(255, 200, 0, 255)); } // [DEBUG]
}
@@ -11141,19 +13336,22 @@ void ImGui::NavUpdateCreateTabbingRequest()
if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs))
return;
- const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat) && !g.IO.KeyCtrl && !g.IO.KeyAlt;
+ const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner) && !g.IO.KeyCtrl && !g.IO.KeyAlt;
if (!tab_pressed)
return;
// Initiate tabbing request
// (this is ALWAYS ENABLED, regardless of ImGuiConfigFlags_NavEnableKeyboard flag!)
- // Initially this was designed to use counters and modulo arithmetic, but that could not work with unsubmitted items (list clipper). Instead we use a strategy close to other move requests.
// See NavProcessItemForTabbingRequest() for a description of the various forward/backward tabbing cases with and without wrapping.
- //// FIXME: We use (g.ActiveId == 0) but (g.NavDisableHighlight == false) might be righter once we can tab through anything
- g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1;
+ const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
+ if (nav_keyboard_active)
+ g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.NavCursorVisible == false && g.ActiveId == 0) ? 0 : +1;
+ else
+ g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1;
+ ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_Activate;
ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY;
ImGuiDir clip_dir = (g.NavTabbingDir < 0) ? ImGuiDir_Up : ImGuiDir_Down;
- NavMoveRequestSubmit(ImGuiDir_None, clip_dir, ImGuiNavMoveFlags_Tabbing, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable.
+ NavMoveRequestSubmit(ImGuiDir_None, clip_dir, move_flags, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable.
g.NavTabbingCounter = -1;
}
@@ -11170,17 +13368,20 @@ void ImGui::NavMoveRequestApplyResult()
ImGuiNavItemData* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : (g.NavMoveResultOther.ID != 0) ? &g.NavMoveResultOther : NULL;
// Tabbing forward wrap
- if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing)
+ if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && result == NULL)
if ((g.NavTabbingCounter == 1 || g.NavTabbingDir == 0) && g.NavTabbingResultFirst.ID)
result = &g.NavTabbingResultFirst;
// In a situation when there are no results but NavId != 0, re-enable the Navigation highlight (because g.NavId is not considered as a possible result)
+ const ImGuiAxis axis = (g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X;
if (result == NULL)
{
- if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing)
- g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight;
- if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0)
- NavRestoreHighlightAfterMove();
+ if (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing)
+ g.NavMoveFlags |= ImGuiNavMoveFlags_NoSetNavCursorVisible;
+ if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_NoSetNavCursorVisible) == 0)
+ SetNavCursorVisibleAfterMove();
+ NavClearPreferredPosForAxis(axis); // On a failed move, clear preferred pos for this axis.
+ IMGUI_DEBUG_LOG_NAV("[nav] NavMoveSubmitted but not led to a result!\n");
return;
}
@@ -11198,59 +13399,77 @@ void ImGui::NavMoveRequestApplyResult()
// Scroll to keep newly navigated item fully into view.
if (g.NavLayer == ImGuiNavLayer_Main)
{
+ ImRect rect_abs = WindowRectRelToAbs(result->Window, result->RectRel);
+ ScrollToRectEx(result->Window, rect_abs, g.NavMoveScrollFlags);
+
if (g.NavMoveFlags & ImGuiNavMoveFlags_ScrollToEdgeY)
{
- // FIXME: Should remove this
+ // FIXME: Should remove this? Or make more precise: use ScrollToRectEx() with edge?
float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f;
SetScrollY(result->Window, scroll_target);
}
- else
- {
- ImRect rect_abs = WindowRectRelToAbs(result->Window, result->RectRel);
- ScrollToRectEx(result->Window, rect_abs, g.NavMoveScrollFlags);
- }
}
if (g.NavWindow != result->Window)
{
IMGUI_DEBUG_LOG_FOCUS("[focus] NavMoveRequest: SetNavWindow(\"%s\")\n", result->Window->Name);
g.NavWindow = result->Window;
+ g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
}
- if (g.ActiveId != result->ID)
+
+ // Clear active id unless requested not to
+ // FIXME: ImGuiNavMoveFlags_NoClearActiveId is currently unused as we don't have a clear strategy to preserve active id after interaction,
+ // so this is mostly provided as a gateway for further experiments (see #1418, #2890)
+ if (g.ActiveId != result->ID && (g.NavMoveFlags & ImGuiNavMoveFlags_NoClearActiveId) == 0)
ClearActiveID();
- if (g.NavId != result->ID)
+
+ // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId)
+ // PageUp/PageDown however sets always set NavJustMovedTo (vs Home/End which doesn't) mimicking Windows behavior.
+ if ((g.NavId != result->ID || (g.NavMoveFlags & ImGuiNavMoveFlags_IsPageMove)) && (g.NavMoveFlags & ImGuiNavMoveFlags_NoSelect) == 0)
{
- // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId)
+ g.NavJustMovedFromFocusScopeId = g.NavFocusScopeId;
g.NavJustMovedToId = result->ID;
g.NavJustMovedToFocusScopeId = result->FocusScopeId;
g.NavJustMovedToKeyMods = g.NavMoveKeyMods;
+ g.NavJustMovedToIsTabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0;
+ g.NavJustMovedToHasSelectionData = (result->ItemFlags & ImGuiItemFlags_HasSelectionUserData) != 0;
+ //IMGUI_DEBUG_LOG_NAV("[nav] NavJustMovedFromFocusScopeId = 0x%08X, NavJustMovedToFocusScopeId = 0x%08X\n", g.NavJustMovedFromFocusScopeId, g.NavJustMovedToFocusScopeId);
}
- // Focus
+ // Apply new NavID/Focus
IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name);
+ ImVec2 preferred_scoring_pos_rel = g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer];
SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel);
+ if (result->SelectionUserData != ImGuiSelectionUserData_Invalid)
+ g.NavLastValidSelectionUserData = result->SelectionUserData;
- // Tabbing: Activates Inputable or Focus non-Inputable
- if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && (result->InFlags & ImGuiItemFlags_Inputable))
+ // Restore last preferred position for current axis
+ // (storing in RootWindowForNav-> as the info is desirable at the beginning of a Move Request. In theory all storage should use RootWindowForNav..)
+ if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) == 0)
{
- g.NavNextActivateId = result->ID;
- g.NavNextActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState;
- g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight;
+ preferred_scoring_pos_rel[axis] = result->RectRel.GetCenter()[axis];
+ g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer] = preferred_scoring_pos_rel;
}
+ // Tabbing: Activates Inputable, otherwise only Focus
+ if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && (result->ItemFlags & ImGuiItemFlags_Inputable) == 0)
+ g.NavMoveFlags &= ~ImGuiNavMoveFlags_Activate;
+
// Activate
if (g.NavMoveFlags & ImGuiNavMoveFlags_Activate)
{
g.NavNextActivateId = result->ID;
g.NavNextActivateFlags = ImGuiActivateFlags_None;
+ if (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing)
+ g.NavNextActivateFlags |= ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState | ImGuiActivateFlags_FromTabbing;
}
- // Enable nav highlight
- if ((g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0)
- NavRestoreHighlightAfterMove();
+ // Make nav cursor visible
+ if ((g.NavMoveFlags & ImGuiNavMoveFlags_NoSetNavCursorVisible) == 0)
+ SetNavCursorVisibleAfterMove();
}
-// Process NavCancel input (to close a popup, get back to parent, clear focus)
+// Process Escape/NavCancel input (to close a popup, get back to parent, clear focus)
// FIXME: In order to support e.g. Escape to clear a selection we'll need:
// - either to store the equivalent of ActiveIdUsingKeyInputMask for a FocusScope and test for it.
// - either to move most/all of those tests to the epilogue/end functions of the scope they are dealing with (e.g. exit child window in EndChild()) or in EndFrame(), to allow an earlier intercept
@@ -11259,7 +13478,7 @@ static void ImGui::NavUpdateCancelRequest()
ImGuiContext& g = *GImGui;
const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
- if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, ImGuiKeyOwner_None)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, ImGuiKeyOwner_None)))
+ if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, 0, ImGuiKeyOwner_NoOwner)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, 0, ImGuiKeyOwner_NoOwner)))
return;
IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n");
@@ -11271,18 +13490,17 @@ static void ImGui::NavUpdateCancelRequest()
{
// Leave the "menu" layer
NavRestoreLayer(ImGuiNavLayer_Main);
- NavRestoreHighlightAfterMove();
+ SetNavCursorVisibleAfterMove();
}
- else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow)
+ else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->RootWindowForNav->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->RootWindowForNav->ParentWindow)
{
// Exit child window
- ImGuiWindow* child_window = g.NavWindow;
- ImGuiWindow* parent_window = g.NavWindow->ParentWindow;
+ ImGuiWindow* child_window = g.NavWindow->RootWindowForNav;
+ ImGuiWindow* parent_window = child_window->ParentWindow;
IM_ASSERT(child_window->ChildId != 0);
- ImRect child_rect = child_window->Rect();
FocusWindow(parent_window);
- SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_rect));
- NavRestoreHighlightAfterMove();
+ SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_window->Rect()));
+ SetNavCursorVisibleAfterMove();
}
else if (g.OpenPopupStack.Size > 0 && g.OpenPopupStack.back().Window != NULL && !(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal))
{
@@ -11292,9 +13510,16 @@ static void ImGui::NavUpdateCancelRequest()
else
{
// Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were
- if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow)))
- g.NavWindow->NavLastIds[0] = 0;
- g.NavId = 0;
+ // FIXME-NAV: This should happen on window appearing.
+ if (g.IO.ConfigNavEscapeClearFocusItem || g.IO.ConfigNavEscapeClearFocusWindow)
+ if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup)))// || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow)))
+ g.NavWindow->NavLastIds[0] = 0;
+
+ // Clear nav focus
+ if (g.IO.ConfigNavEscapeClearFocusItem || g.IO.ConfigNavEscapeClearFocusWindow)
+ g.NavId = 0;
+ if (g.IO.ConfigNavEscapeClearFocusWindow)
+ FocusWindow(NULL);
}
}
@@ -11309,22 +13534,22 @@ static float ImGui::NavUpdatePageUpPageDown()
if ((window->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL)
return 0.0f;
- const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_None);
- const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_None);
- const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat);
- const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat);
+ const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_NoOwner);
+ const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_NoOwner);
+ const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner);
+ const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner);
if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out
return 0.0f;
if (g.NavLayer != ImGuiNavLayer_Main)
NavRestoreLayer(ImGuiNavLayer_Main);
- if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll)
+ if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY)
{
// Fallback manual-scroll when window has no navigable item
- if (IsKeyPressed(ImGuiKey_PageUp, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat))
+ if (IsKeyPressed(ImGuiKey_PageUp, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner))
SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight());
- else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat))
+ else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner))
SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight());
else if (home_pressed)
SetScrollY(window, 0.0f);
@@ -11334,21 +13559,21 @@ static float ImGui::NavUpdatePageUpPageDown()
else
{
ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer];
- const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight());
+ const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->FontRefSize * 1.0f + nav_rect_rel.GetHeight());
float nav_scoring_rect_offset_y = 0.0f;
if (IsKeyPressed(ImGuiKey_PageUp, true))
{
nav_scoring_rect_offset_y = -page_offset_y;
g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item)
g.NavMoveClipDir = ImGuiDir_Up;
- g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet;
+ g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet | ImGuiNavMoveFlags_IsPageMove;
}
else if (IsKeyPressed(ImGuiKey_PageDown, true))
{
nav_scoring_rect_offset_y = +page_offset_y;
g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item)
g.NavMoveClipDir = ImGuiDir_Down;
- g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet;
+ g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet | ImGuiNavMoveFlags_IsPageMove;
}
else if (home_pressed)
{
@@ -11387,8 +13612,7 @@ static void ImGui::NavEndFrame()
// Perform wrap-around in menus
// FIXME-NAV: Wrap may need to apply a weight bias on the other axis. e.g. 4x4 grid with 2 last items missing on last item won't handle LoopY/WrapY correctly.
// FIXME-NAV: Wrap (not Loop) support could be handled by the scoring function and then WrapX would function without an extra frame.
- const ImGuiNavMoveFlags wanted_flags = ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY;
- if (g.NavWindow && NavMoveRequestButNoResultYet() && (g.NavMoveFlags & wanted_flags) && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0)
+ if (g.NavWindow && NavMoveRequestButNoResultYet() && (g.NavMoveFlags & ImGuiNavMoveFlags_WrapMask_) && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0)
NavUpdateCreateWrappingRequest();
}
@@ -11400,7 +13624,9 @@ static void ImGui::NavUpdateCreateWrappingRequest()
bool do_forward = false;
ImRect bb_rel = window->NavRectRel[g.NavLayer];
ImGuiDir clip_dir = g.NavMoveDir;
+
const ImGuiNavMoveFlags move_flags = g.NavMoveFlags;
+ //const ImGuiAxis move_axis = (g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X;
if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX)))
{
bb_rel.Min.x = bb_rel.Max.x = window->ContentSize.x + window->WindowPadding.x;
@@ -11444,17 +13670,17 @@ static void ImGui::NavUpdateCreateWrappingRequest()
if (!do_forward)
return;
window->NavRectRel[g.NavLayer] = bb_rel;
+ NavClearPreferredPosForAxis(ImGuiAxis_X);
+ NavClearPreferredPosForAxis(ImGuiAxis_Y);
NavMoveRequestForward(g.NavMoveDir, clip_dir, move_flags, g.NavMoveScrollFlags);
}
-static int ImGui::FindWindowFocusIndex(ImGuiWindow* window)
+// Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext)
+// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmatically.
+// If you want a window to never be focused, you may use the e.g. NoInputs flag.
+bool ImGui::IsWindowNavFocusable(ImGuiWindow* window)
{
- ImGuiContext& g = *GImGui;
- IM_UNUSED(g);
- int order = window->FocusOrder;
- IM_ASSERT(window->RootWindow == window); // No child window (not testing _ChildWindow because of docking)
- IM_ASSERT(g.WindowsFocusOrder[order] == window);
- return order;
+ return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus);
}
static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) // FIXME-OPT O(N)
@@ -11466,7 +13692,7 @@ static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) //
return NULL;
}
-static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
+static void NavUpdateWindowingTarget(int focus_change_dir)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(g.NavWindowingTarget);
@@ -11485,6 +13711,33 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
g.NavWindowingToggleLayer = false;
}
+// Apply focus and close overlay
+static void ImGui::NavUpdateWindowingApplyFocus(ImGuiWindow* apply_focus_window)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow)
+ {
+ ClearActiveID();
+ SetNavCursorVisibleAfterMove();
+ ClosePopupsOverWindow(apply_focus_window, false);
+ FocusWindow(apply_focus_window, ImGuiFocusRequestFlags_RestoreFocusedChild);
+ apply_focus_window = g.NavWindow;
+ if (apply_focus_window->NavLastIds[0] == 0)
+ NavInitWindow(apply_focus_window, false);
+
+ // If the window has ONLY a menu layer (no main layer), select it directly
+ // Use NavLayersActiveMaskNext since windows didn't have a chance to be Begin()-ed on this frame,
+ // so CTRL+Tab where the keys are only held for 1 frame will be able to use correct layers mask since
+ // the target window as already been previewed once.
+ // FIXME-NAV: This should be done in NavInit.. or in FocusWindow... However in both of those cases,
+ // we won't have a guarantee that windows has been visible before and therefore NavLayersActiveMask*
+ // won't be valid.
+ if (apply_focus_window->DC.NavLayersActiveMaskNext == (1 << ImGuiNavLayer_Menu))
+ g.NavLayer = ImGuiNavLayer_Menu;
+ }
+ g.NavWindowingTarget = NULL;
+}
+
// Windowing management mode
// Keyboard: CTRL+Tab (change focus/move/resize), Alt (toggle menu layer)
// Gamepad: Hold Menu/Square (change focus/move/resize), Tap Menu/Square (toggle menu layer)
@@ -11497,7 +13750,7 @@ static void ImGui::NavUpdateWindowing()
bool apply_toggle_layer = false;
ImGuiWindow* modal_window = GetTopMostPopupModal();
- bool allow_windowing = (modal_window == NULL);
+ bool allow_windowing = (modal_window == NULL); // FIXME: This prevent CTRL+TAB from being usable with windows that are inside the Begin-stack of that modal.
if (!allow_windowing)
g.NavWindowingTarget = NULL;
@@ -11510,20 +13763,29 @@ static void ImGui::NavUpdateWindowing()
}
// Start CTRL+Tab or Square+L/R window selection
+ // (g.ConfigNavWindowingKeyNext/g.ConfigNavWindowingKeyPrev defaults are ImGuiMod_Ctrl|ImGuiKey_Tab and ImGuiMod_Ctrl|ImGuiMod_Shift|ImGuiKey_Tab)
+ const ImGuiID owner_id = ImHashStr("##NavUpdateWindowing");
const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
- const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways);
- const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways);
- const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, 0, ImGuiInputFlags_None);
+ const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id);
+ const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id);
+ const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, ImGuiInputFlags_None);
const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard!
+ bool just_started_windowing_from_null_focus = false;
if (start_windowing_with_gamepad || start_windowing_with_keyboard)
if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1))
{
- g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow;
+ g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; // Current location
g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f;
g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f);
g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer
g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad;
+ if (g.NavWindow == NULL)
+ just_started_windowing_from_null_focus = true;
+
+ // Manually register ownership of our mods. Using a global route in the Shortcut() calls instead would probably be correct but may have more side-effects.
+ if (keyboard_next_window || keyboard_prev_window)
+ SetKeyOwnersForKeyChord((g.ConfigNavWindowingKeyNext | g.ConfigNavWindowingKeyPrev) & ImGuiMod_Mask_, owner_id);
}
// Gamepad update
@@ -11535,9 +13797,9 @@ static void ImGui::NavUpdateWindowing()
// Select window to focus
const int focus_change_dir = (int)IsKeyPressed(ImGuiKey_GamepadL1) - (int)IsKeyPressed(ImGuiKey_GamepadR1);
- if (focus_change_dir != 0)
+ if (focus_change_dir != 0 && !just_started_windowing_from_null_focus)
{
- NavUpdateWindowingHighlightWindow(focus_change_dir);
+ NavUpdateWindowingTarget(focus_change_dir);
g.NavWindowingHighlightAlpha = 1.0f;
}
@@ -11560,35 +13822,45 @@ static void ImGui::NavUpdateWindowing()
ImGuiKeyChord shared_mods = ((g.ConfigNavWindowingKeyNext ? g.ConfigNavWindowingKeyNext : ImGuiMod_Mask_) & (g.ConfigNavWindowingKeyPrev ? g.ConfigNavWindowingKeyPrev : ImGuiMod_Mask_)) & ImGuiMod_Mask_;
IM_ASSERT(shared_mods != 0); // Next/Prev shortcut currently needs a shared modifier to "hold", otherwise Prev actions would keep cycling between two windows.
g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f
- if (keyboard_next_window || keyboard_prev_window)
- NavUpdateWindowingHighlightWindow(keyboard_next_window ? -1 : +1);
+ if ((keyboard_next_window || keyboard_prev_window) && !just_started_windowing_from_null_focus)
+ NavUpdateWindowingTarget(keyboard_next_window ? -1 : +1);
else if ((io.KeyMods & shared_mods) != shared_mods)
apply_focus_window = g.NavWindowingTarget;
}
// Keyboard: Press and Release ALT to toggle menu layer
- // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer.
- // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway.
- if (nav_keyboard_active && IsKeyPressed(ImGuiMod_Alt, ImGuiKeyOwner_None))
- {
- g.NavWindowingToggleLayer = true;
- g.NavInputSource = ImGuiInputSource_Keyboard;
- }
+ const ImGuiKey windowing_toggle_keys[] = { ImGuiKey_LeftAlt, ImGuiKey_RightAlt };
+ bool windowing_toggle_layer_start = false;
+ if (g.NavWindow != NULL && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
+ for (ImGuiKey windowing_toggle_key : windowing_toggle_keys)
+ if (nav_keyboard_active && IsKeyPressed(windowing_toggle_key, 0, ImGuiKeyOwner_NoOwner))
+ {
+ windowing_toggle_layer_start = true;
+ g.NavWindowingToggleLayer = true;
+ g.NavWindowingToggleKey = windowing_toggle_key;
+ g.NavInputSource = ImGuiInputSource_Keyboard;
+ break;
+ }
if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard)
{
// We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370)
// We cancel toggling nav layer when other modifiers are pressed. (See #4439)
+ // - AltGR is Alt+Ctrl on some layout but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl).
// We cancel toggling nav layer if an owner has claimed the key.
- if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_None) == false)
+ if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper)
+ g.NavWindowingToggleLayer = false;
+ else if (windowing_toggle_layer_start == false && g.LastKeyboardKeyPressTime == g.Time)
+ g.NavWindowingToggleLayer = false;
+ else if (TestKeyOwner(g.NavWindowingToggleKey, ImGuiKeyOwner_NoOwner) == false || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_NoOwner) == false)
g.NavWindowingToggleLayer = false;
- // Apply layer toggle on release
+ // Apply layer toggle on Alt release
// Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss.
- if (IsKeyReleased(ImGuiMod_Alt) && g.NavWindowingToggleLayer)
+ if (IsKeyReleased(g.NavWindowingToggleKey) && g.NavWindowingToggleLayer)
if (g.ActiveId == 0 || g.ActiveIdAllowOverlap)
if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev))
apply_toggle_layer = true;
- if (!IsKeyDown(ImGuiMod_Alt))
+ if (!IsKeyDown(g.NavWindowingToggleKey))
g.NavWindowingToggleLayer = false;
}
@@ -11597,16 +13869,16 @@ static void ImGui::NavUpdateWindowing()
{
ImVec2 nav_move_dir;
if (g.NavInputSource == ImGuiInputSource_Keyboard && !io.KeyShift)
- nav_move_dir = GetKeyVector2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow);
+ nav_move_dir = GetKeyMagnitude2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow);
if (g.NavInputSource == ImGuiInputSource_Gamepad)
- nav_move_dir = GetKeyVector2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown);
+ nav_move_dir = GetKeyMagnitude2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown);
if (nav_move_dir.x != 0.0f || nav_move_dir.y != 0.0f)
{
const float NAV_MOVE_SPEED = 800.0f;
const float move_step = NAV_MOVE_SPEED * io.DeltaTime * ImMin(io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
g.NavWindowingAccumDeltaPos += nav_move_dir * move_step;
- g.NavDisableMouseHover = true;
- ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaPos);
+ g.NavHighlightItemUnderNav = true;
+ ImVec2 accum_floored = ImTrunc(g.NavWindowingAccumDeltaPos);
if (accum_floored.x != 0.0f || accum_floored.y != 0.0f)
{
ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow;
@@ -11617,28 +13889,8 @@ static void ImGui::NavUpdateWindowing()
}
// Apply final focus
- if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow))
- {
- ClearActiveID();
- NavRestoreHighlightAfterMove();
- apply_focus_window = NavRestoreLastChildNavWindow(apply_focus_window);
- ClosePopupsOverWindow(apply_focus_window, false);
- FocusWindow(apply_focus_window);
- if (apply_focus_window->NavLastIds[0] == 0)
- NavInitWindow(apply_focus_window, false);
-
- // If the window has ONLY a menu layer (no main layer), select it directly
- // Use NavLayersActiveMaskNext since windows didn't have a chance to be Begin()-ed on this frame,
- // so CTRL+Tab where the keys are only held for 1 frame will be able to use correct layers mask since
- // the target window as already been previewed once.
- // FIXME-NAV: This should be done in NavInit.. or in FocusWindow... However in both of those cases,
- // we won't have a guarantee that windows has been visible before and therefore NavLayersActiveMask*
- // won't be valid.
- if (apply_focus_window->DC.NavLayersActiveMaskNext == (1 << ImGuiNavLayer_Menu))
- g.NavLayer = ImGuiNavLayer_Menu;
- }
if (apply_focus_window)
- g.NavWindowingTarget = NULL;
+ NavUpdateWindowingApplyFocus(apply_focus_window);
// Apply menu/layer toggle
if (apply_toggle_layer && g.NavWindow)
@@ -11667,7 +13919,7 @@ static void ImGui::NavUpdateWindowing()
if (new_nav_layer == ImGuiNavLayer_Menu)
g.NavWindow->NavLastIds[new_nav_layer] = 0;
NavRestoreLayer(new_nav_layer);
- NavRestoreHighlightAfterMove();
+ SetNavCursorVisibleAfterMove();
}
}
}
@@ -11692,12 +13944,14 @@ void ImGui::NavUpdateWindowingOverlay()
return;
if (g.NavWindowingListWindow == NULL)
- g.NavWindowingListWindow = FindWindowByName("###NavWindowingList");
+ g.NavWindowingListWindow = FindWindowByName("##NavWindowingOverlay");
const ImGuiViewport* viewport = GetMainViewport();
SetNextWindowSizeConstraints(ImVec2(viewport->Size.x * 0.20f, viewport->Size.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX));
SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f);
- Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings);
+ Begin("##NavWindowingOverlay", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings);
+ if (g.ContextName[0] != 0)
+ SeparatorText(g.ContextName);
for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--)
{
ImGuiWindow* window = g.WindowsFocusOrder[n];
@@ -11713,7 +13967,6 @@ void ImGui::NavUpdateWindowingOverlay()
PopStyleVar();
}
-
//-----------------------------------------------------------------------------
// [SECTION] DRAG AND DROP
//-----------------------------------------------------------------------------
@@ -11727,6 +13980,8 @@ bool ImGui::IsDragDropActive()
void ImGui::ClearDragDrop()
{
ImGuiContext& g = *GImGui;
+ if (g.DragDropActive)
+ IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] ClearDragDrop()\n");
g.DragDropActive = false;
g.DragDropPayload.Clear();
g.DragDropAcceptFlags = ImGuiDragDropFlags_None;
@@ -11738,6 +13993,14 @@ void ImGui::ClearDragDrop()
memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal));
}
+bool ImGui::BeginTooltipHidden()
+{
+ ImGuiContext& g = *GImGui;
+ bool ret = Begin("##Tooltip_Hidden", NULL, ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize);
+ SetWindowHiddenAndSkipItemsForCurrentFrame(g.CurrentWindow);
+ return ret;
+}
+
// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource()
// If the item has an identifier:
// - This assume/require the item to be activated (typically via ButtonBehavior).
@@ -11757,7 +14020,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
bool source_drag_active = false;
ImGuiID source_id = 0;
ImGuiID source_parent_id = 0;
- if (!(flags & ImGuiDragDropFlags_SourceExtern))
+ if ((flags & ImGuiDragDropFlags_SourceExtern) == 0)
{
source_id = g.LastItemData.ID;
if (source_id != 0)
@@ -11794,7 +14057,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
// Rely on keeping other window->LastItemXXX fields intact.
source_id = g.LastItemData.ID = window->GetIDFromRectangle(g.LastItemData.Rect);
KeepAliveID(source_id);
- bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id);
+ bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id, g.LastItemData.ItemFlags);
if (is_hovered && g.IO.MouseClicked[mouse_button])
{
SetActiveID(source_id, window);
@@ -11813,48 +14076,55 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
}
else
{
+ // When ImGuiDragDropFlags_SourceExtern is set:
window = NULL;
source_id = ImHashStr("#SourceExtern");
source_drag_active = true;
+ mouse_button = g.IO.MouseDown[0] ? 0 : -1;
+ KeepAliveID(source_id);
+ SetActiveID(source_id, NULL);
}
- if (source_drag_active)
- {
- if (!g.DragDropActive)
- {
- IM_ASSERT(source_id != 0);
- ClearDragDrop();
- ImGuiPayload& payload = g.DragDropPayload;
- payload.SourceId = source_id;
- payload.SourceParentId = source_parent_id;
- g.DragDropActive = true;
- g.DragDropSourceFlags = flags;
- g.DragDropMouseButton = mouse_button;
- if (payload.SourceId == g.ActiveId)
- g.ActiveIdNoClearOnFocusLoss = true;
- }
- g.DragDropSourceFrameCount = g.FrameCount;
- g.DragDropWithinSource = true;
+ IM_ASSERT(g.DragDropWithinTarget == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget()
+ if (!source_drag_active)
+ return false;
- if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
- {
- // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit)
- // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents.
- BeginTooltip();
- if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip))
- {
- ImGuiWindow* tooltip_window = g.CurrentWindow;
- tooltip_window->Hidden = tooltip_window->SkipItems = true;
- tooltip_window->HiddenFramesCanSkipItems = 1;
- }
- }
+ // Activate drag and drop
+ if (!g.DragDropActive)
+ {
+ IM_ASSERT(source_id != 0);
+ ClearDragDrop();
+ IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] BeginDragDropSource() DragDropActive = true, source_id = 0x%08X%s\n",
+ source_id, (flags & ImGuiDragDropFlags_SourceExtern) ? " (EXTERN)" : "");
+ ImGuiPayload& payload = g.DragDropPayload;
+ payload.SourceId = source_id;
+ payload.SourceParentId = source_parent_id;
+ g.DragDropActive = true;
+ g.DragDropSourceFlags = flags;
+ g.DragDropMouseButton = mouse_button;
+ if (payload.SourceId == g.ActiveId)
+ g.ActiveIdNoClearOnFocusLoss = true;
+ }
+ g.DragDropSourceFrameCount = g.FrameCount;
+ g.DragDropWithinSource = true;
+
+ if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
+ {
+ // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit)
+ // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents.
+ bool ret;
+ if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip))
+ ret = BeginTooltipHidden();
+ else
+ ret = BeginTooltip();
+ IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame().
+ IM_UNUSED(ret);
+ }
- if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern))
- g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect;
+ if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern))
+ g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect;
- return true;
- }
- return false;
+ return true;
}
void ImGui::EndDragDropSource()
@@ -11881,10 +14151,10 @@ bool ImGui::SetDragDropPayload(const char* type, const void* data, size_t data_s
cond = ImGuiCond_Always;
IM_ASSERT(type != NULL);
- IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long");
+ IM_ASSERT(ImStrlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long");
IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0));
IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once);
- IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource()
+ IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource()
if (cond == ImGuiCond_Always || payload.DataFrameCount == -1)
{
@@ -11933,15 +14203,16 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id)
if (window->SkipItems)
return false;
- IM_ASSERT(g.DragDropWithinTarget == false);
+ IM_ASSERT(g.DragDropWithinTarget == false && g.DragDropWithinSource == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget()
g.DragDropTargetRect = bb;
+ g.DragDropTargetClipRect = window->ClipRect; // May want to be overridden by user depending on use case?
g.DragDropTargetId = id;
g.DragDropWithinTarget = true;
return true;
}
// We don't use BeginDragDropTargetCustom() and duplicate its code because:
-// 1) we use LastItemRectHoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them.
+// 1) we use LastItemData's ImGuiItemStatusFlags_HoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them.
// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can.
// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case)
bool ImGui::BeginDragDropTarget()
@@ -11967,8 +14238,9 @@ bool ImGui::BeginDragDropTarget()
if (g.DragDropPayload.SourceId == id)
return false;
- IM_ASSERT(g.DragDropWithinTarget == false);
+ IM_ASSERT(g.DragDropWithinTarget == false && g.DragDropWithinSource == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget()
g.DragDropTargetRect = display_rect;
+ g.DragDropTargetClipRect = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasClipRect) ? g.LastItemData.ClipRect : window->ClipRect;
g.DragDropTargetId = id;
g.DragDropWithinTarget = true;
return true;
@@ -11983,7 +14255,6 @@ bool ImGui::IsDragDropPayloadBeingAccepted()
const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags)
{
ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
ImGuiPayload& payload = g.DragDropPayload;
IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ?
IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ?
@@ -11995,31 +14266,47 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop
const bool was_accepted_previously = (g.DragDropAcceptIdPrev == g.DragDropTargetId);
ImRect r = g.DragDropTargetRect;
float r_surface = r.GetWidth() * r.GetHeight();
- if (r_surface <= g.DragDropAcceptIdCurrRectSurface)
- {
- g.DragDropAcceptFlags = flags;
- g.DragDropAcceptIdCurr = g.DragDropTargetId;
- g.DragDropAcceptIdCurrRectSurface = r_surface;
- }
+ if (r_surface > g.DragDropAcceptIdCurrRectSurface)
+ return NULL;
+
+ g.DragDropAcceptFlags = flags;
+ g.DragDropAcceptIdCurr = g.DragDropTargetId;
+ g.DragDropAcceptIdCurrRectSurface = r_surface;
+ //IMGUI_DEBUG_LOG("AcceptDragDropPayload(): %08X: accept\n", g.DragDropTargetId);
// Render default drop visuals
payload.Preview = was_accepted_previously;
flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that live for 1 frame)
if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview)
- window->DrawList->AddRect(r.Min - ImVec2(3.5f,3.5f), r.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f);
+ RenderDragDropTargetRect(r, g.DragDropTargetClipRect);
g.DragDropAcceptFrameCount = g.FrameCount;
- payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting os window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased()
+ if ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) && g.DragDropMouseButton == -1)
+ payload.Delivery = was_accepted_previously && (g.DragDropSourceFrameCount < g.FrameCount);
+ else
+ payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting OS window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased()
if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery))
return NULL;
+ if (payload.Delivery)
+ IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] AcceptDragDropPayload(): 0x%08X: payload delivery\n", g.DragDropTargetId);
return &payload;
}
-// FIXME-DRAGDROP: Settle on a proper default visuals for drop target.
-void ImGui::RenderDragDropTargetRect(const ImRect& bb)
+// FIXME-STYLE FIXME-DRAGDROP: Settle on a proper default visuals for drop target.
+void ImGui::RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect)
{
- GetWindowDrawList()->AddRect(bb.Min - ImVec2(3.5f, 3.5f), bb.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f);
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImRect bb_display = bb;
+ bb_display.ClipWith(item_clip_rect); // Clip THEN expand so we have a way to visualize that target is not entirely visible.
+ bb_display.Expand(3.5f);
+ bool push_clip_rect = !window->ClipRect.Contains(bb_display);
+ if (push_clip_rect)
+ window->DrawList->PushClipRectFullScreen();
+ window->DrawList->AddRect(bb_display.Min, bb_display.Max, GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f);
+ if (push_clip_rect)
+ window->DrawList->PopClipRect();
}
const ImGuiPayload* ImGui::GetDragDropPayload()
@@ -12028,13 +14315,16 @@ const ImGuiPayload* ImGui::GetDragDropPayload()
return (g.DragDropActive && g.DragDropPayload.DataFrameCount != -1) ? &g.DragDropPayload : NULL;
}
-// We don't really use/need this now, but added it for the sake of consistency and because we might need it later.
void ImGui::EndDragDropTarget()
{
ImGuiContext& g = *GImGui;
IM_ASSERT(g.DragDropActive);
IM_ASSERT(g.DragDropWithinTarget);
g.DragDropWithinTarget = false;
+
+ // Clear drag and drop state payload right after delivery
+ if (g.DragDropPayload.Delivery)
+ ClearDragDrop();
}
//-----------------------------------------------------------------------------
@@ -12105,7 +14395,7 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
}
if (prefix)
- LogRenderedText(ref_pos, prefix, prefix + strlen(prefix)); // Calculate end ourself to ensure "##" are included here.
+ LogRenderedText(ref_pos, prefix, prefix + ImStrlen(prefix)); // Calculate end ourself to ensure "##" are included here.
// Re-adjust padding if we have popped out of our starting depth
if (g.LogDepthRef > window->DC.TreeDepth)
@@ -12138,19 +14428,21 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
}
if (suffix)
- LogRenderedText(ref_pos, suffix, suffix + strlen(suffix));
+ LogRenderedText(ref_pos, suffix, suffix + ImStrlen(suffix));
}
// Start logging/capturing text output
-void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth)
+void ImGui::LogBegin(ImGuiLogFlags flags, int auto_open_depth)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
IM_ASSERT(g.LogEnabled == false);
- IM_ASSERT(g.LogFile == NULL);
- IM_ASSERT(g.LogBuffer.empty());
- g.LogEnabled = true;
- g.LogType = type;
+ IM_ASSERT(g.LogFile == NULL && g.LogBuffer.empty());
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiLogFlags_OutputMask_)); // Check that only 1 type flag is used
+
+ g.LogEnabled = g.ItemUnclipByLog = true;
+ g.LogFlags = flags;
+ g.LogWindow = window;
g.LogNextPrefix = g.LogNextSuffix = NULL;
g.LogDepthRef = window->DC.TreeDepth;
g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault);
@@ -12173,7 +14465,7 @@ void ImGui::LogToTTY(int auto_open_depth)
return;
IM_UNUSED(auto_open_depth);
#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
- LogBegin(ImGuiLogType_TTY, auto_open_depth);
+ LogBegin(ImGuiLogFlags_OutputTTY, auto_open_depth);
g.LogFile = stdout;
#endif
}
@@ -12199,7 +14491,7 @@ void ImGui::LogToFile(int auto_open_depth, const char* filename)
return;
}
- LogBegin(ImGuiLogType_File, auto_open_depth);
+ LogBegin(ImGuiLogFlags_OutputFile, auto_open_depth);
g.LogFile = f;
}
@@ -12209,7 +14501,7 @@ void ImGui::LogToClipboard(int auto_open_depth)
ImGuiContext& g = *GImGui;
if (g.LogEnabled)
return;
- LogBegin(ImGuiLogType_Clipboard, auto_open_depth);
+ LogBegin(ImGuiLogFlags_OutputClipboard, auto_open_depth);
}
void ImGui::LogToBuffer(int auto_open_depth)
@@ -12217,7 +14509,7 @@ void ImGui::LogToBuffer(int auto_open_depth)
ImGuiContext& g = *GImGui;
if (g.LogEnabled)
return;
- LogBegin(ImGuiLogType_Buffer, auto_open_depth);
+ LogBegin(ImGuiLogFlags_OutputBuffer, auto_open_depth);
}
void ImGui::LogFinish()
@@ -12227,29 +14519,29 @@ void ImGui::LogFinish()
return;
LogText(IM_NEWLINE);
- switch (g.LogType)
+ switch (g.LogFlags & ImGuiLogFlags_OutputMask_)
{
- case ImGuiLogType_TTY:
+ case ImGuiLogFlags_OutputTTY:
#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
fflush(g.LogFile);
#endif
break;
- case ImGuiLogType_File:
+ case ImGuiLogFlags_OutputFile:
ImFileClose(g.LogFile);
break;
- case ImGuiLogType_Buffer:
+ case ImGuiLogFlags_OutputBuffer:
break;
- case ImGuiLogType_Clipboard:
+ case ImGuiLogFlags_OutputClipboard:
if (!g.LogBuffer.empty())
SetClipboardText(g.LogBuffer.begin());
break;
- case ImGuiLogType_None:
+ default:
IM_ASSERT(0);
break;
}
- g.LogEnabled = false;
- g.LogType = ImGuiLogType_None;
+ g.LogEnabled = g.ItemUnclipByLog = false;
+ g.LogFlags = ImGuiLogFlags_None;
g.LogFile = NULL;
g.LogBuffer.clear();
}
@@ -12268,10 +14560,10 @@ void ImGui::LogButtons()
#endif
const bool log_to_file = Button("Log To File"); SameLine();
const bool log_to_clipboard = Button("Log To Clipboard"); SameLine();
- PushAllowKeyboardFocus(false);
+ PushItemFlag(ImGuiItemFlags_NoTabStop, true);
SetNextItemWidth(80.0f);
SliderInt("Default Depth", &g.LogDepthToExpandDefault, 0, 9, NULL);
- PopAllowKeyboardFocus();
+ PopItemFlag();
PopID();
// Start logging at the end of the function so that the buttons don't appear in the log
@@ -12283,21 +14575,22 @@ void ImGui::LogButtons()
LogToClipboard();
}
-
//-----------------------------------------------------------------------------
// [SECTION] SETTINGS
//-----------------------------------------------------------------------------
// - UpdateSettings() [Internal]
// - MarkIniSettingsDirty() [Internal]
-// - CreateNewWindowSettings() [Internal]
-// - FindWindowSettings() [Internal]
-// - FindOrCreateWindowSettings() [Internal]
// - FindSettingsHandler() [Internal]
// - ClearIniSettings() [Internal]
// - LoadIniSettingsFromDisk()
// - LoadIniSettingsFromMemory()
// - SaveIniSettingsToDisk()
// - SaveIniSettingsToMemory()
+//-----------------------------------------------------------------------------
+// - CreateNewWindowSettings() [Internal]
+// - FindWindowSettingsByID() [Internal]
+// - FindWindowSettingsByWindow() [Internal]
+// - ClearWindowSettings() [Internal]
// - WindowSettingsHandler_***() [Internal]
//-----------------------------------------------------------------------------
@@ -12344,44 +14637,6 @@ void ImGui::MarkIniSettingsDirty(ImGuiWindow* window)
g.SettingsDirtyTimer = g.IO.IniSavingRate;
}
-ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name)
-{
- ImGuiContext& g = *GImGui;
-
-#if !IMGUI_DEBUG_INI_SETTINGS
- // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID()
- // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier.
- if (const char* p = strstr(name, "###"))
- name = p;
-#endif
- const size_t name_len = strlen(name);
-
- // Allocate chunk
- const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1;
- ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size);
- IM_PLACEMENT_NEW(settings) ImGuiWindowSettings();
- settings->ID = ImHashStr(name, name_len);
- memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator
-
- return settings;
-}
-
-ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id)
-{
- ImGuiContext& g = *GImGui;
- for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
- if (settings->ID == id)
- return settings;
- return NULL;
-}
-
-ImGuiWindowSettings* ImGui::FindOrCreateWindowSettings(const char* name)
-{
- if (ImGuiWindowSettings* settings = FindWindowSettings(ImHashStr(name)))
- return settings;
- return CreateNewWindowSettings(name);
-}
-
void ImGui::AddSettingsHandler(const ImGuiSettingsHandler* handler)
{
ImGuiContext& g = *GImGui;
@@ -12400,19 +14655,20 @@ ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name)
{
ImGuiContext& g = *GImGui;
const ImGuiID type_hash = ImHashStr(type_name);
- for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
- if (g.SettingsHandlers[handler_n].TypeHash == type_hash)
- return &g.SettingsHandlers[handler_n];
+ for (ImGuiSettingsHandler& handler : g.SettingsHandlers)
+ if (handler.TypeHash == type_hash)
+ return &handler;
return NULL;
}
+// Clear all settings (windows, tables, docking etc.)
void ImGui::ClearIniSettings()
{
ImGuiContext& g = *GImGui;
g.SettingsIniData.clear();
- for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
- if (g.SettingsHandlers[handler_n].ClearAllFn)
- g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]);
+ for (ImGuiSettingsHandler& handler : g.SettingsHandlers)
+ if (handler.ClearAllFn != NULL)
+ handler.ClearAllFn(&g, &handler);
}
void ImGui::LoadIniSettingsFromDisk(const char* ini_filename)
@@ -12427,6 +14683,7 @@ void ImGui::LoadIniSettingsFromDisk(const char* ini_filename)
}
// Zero-tolerance, no error reporting, cheap .ini parsing
+// Set ini_size==0 to let us use strlen(ini_data). Do not call this function with a 0 if your buffer is actually empty!
void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
{
ImGuiContext& g = *GImGui;
@@ -12437,7 +14694,7 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
// For user convenience, we allow passing a non zero-terminated string (hence the ini_size parameter).
// For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy..
if (ini_size == 0)
- ini_size = strlen(ini_data);
+ ini_size = ImStrlen(ini_data);
g.SettingsIniData.Buf.resize((int)ini_size + 1);
char* const buf = g.SettingsIniData.Buf.Data;
char* const buf_end = buf + ini_size;
@@ -12446,9 +14703,9 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
// Call pre-read handlers
// Some types will clear their data (e.g. dock information) some types will allow merge/override (window)
- for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
- if (g.SettingsHandlers[handler_n].ReadInitFn)
- g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]);
+ for (ImGuiSettingsHandler& handler : g.SettingsHandlers)
+ if (handler.ReadInitFn != NULL)
+ handler.ReadInitFn(&g, &handler);
void* entry_data = NULL;
ImGuiSettingsHandler* entry_handler = NULL;
@@ -12492,9 +14749,9 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
memcpy(buf, ini_data, ini_size);
// Call post-read handlers
- for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
- if (g.SettingsHandlers[handler_n].ApplyAllFn)
- g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]);
+ for (ImGuiSettingsHandler& handler : g.SettingsHandlers)
+ if (handler.ApplyAllFn != NULL)
+ handler.ApplyAllFn(&g, &handler);
}
void ImGui::SaveIniSettingsToDisk(const char* ini_filename)
@@ -12520,29 +14777,86 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size)
g.SettingsDirtyTimer = 0.0f;
g.SettingsIniData.Buf.resize(0);
g.SettingsIniData.Buf.push_back(0);
- for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
- {
- ImGuiSettingsHandler* handler = &g.SettingsHandlers[handler_n];
- handler->WriteAllFn(&g, handler, &g.SettingsIniData);
- }
+ for (ImGuiSettingsHandler& handler : g.SettingsHandlers)
+ handler.WriteAllFn(&g, &handler, &g.SettingsIniData);
if (out_size)
*out_size = (size_t)g.SettingsIniData.size();
return g.SettingsIniData.c_str();
}
+ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name)
+{
+ ImGuiContext& g = *GImGui;
+
+ if (g.IO.ConfigDebugIniSettings == false)
+ {
+ // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID()
+ // Preserve the full string when ConfigDebugVerboseIniSettings is set to make .ini inspection easier.
+ if (const char* p = strstr(name, "###"))
+ name = p;
+ }
+ const size_t name_len = ImStrlen(name);
+
+ // Allocate chunk
+ const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1;
+ ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size);
+ IM_PLACEMENT_NEW(settings) ImGuiWindowSettings();
+ settings->ID = ImHashStr(name, name_len);
+ memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator
+
+ return settings;
+}
+
+// We don't provide a FindWindowSettingsByName() because Docking system doesn't always hold on names.
+// This is called once per window .ini entry + once per newly instantiated window.
+ImGuiWindowSettings* ImGui::FindWindowSettingsByID(ImGuiID id)
+{
+ ImGuiContext& g = *GImGui;
+ for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
+ if (settings->ID == id && !settings->WantDelete)
+ return settings;
+ return NULL;
+}
+
+// This is faster if you are holding on a Window already as we don't need to perform a search.
+ImGuiWindowSettings* ImGui::FindWindowSettingsByWindow(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ if (window->SettingsOffset != -1)
+ return g.SettingsWindows.ptr_from_offset(window->SettingsOffset);
+ return FindWindowSettingsByID(window->ID);
+}
+
+// This will revert window to its initial state, including enabling the ImGuiCond_FirstUseEver/ImGuiCond_Once conditions once more.
+void ImGui::ClearWindowSettings(const char* name)
+{
+ //IMGUI_DEBUG_LOG("ClearWindowSettings('%s')\n", name);
+ ImGuiWindow* window = FindWindowByName(name);
+ if (window != NULL)
+ {
+ window->Flags |= ImGuiWindowFlags_NoSavedSettings;
+ InitOrLoadWindowSettings(window, NULL);
+ }
+ if (ImGuiWindowSettings* settings = window ? FindWindowSettingsByWindow(window) : FindWindowSettingsByID(ImHashStr(name)))
+ settings->WantDelete = true;
+}
+
static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*)
{
ImGuiContext& g = *ctx;
- for (int i = 0; i != g.Windows.Size; i++)
- g.Windows[i]->SettingsOffset = -1;
+ for (ImGuiWindow* window : g.Windows)
+ window->SettingsOffset = -1;
g.SettingsWindows.clear();
}
static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name)
{
- ImGuiWindowSettings* settings = ImGui::FindOrCreateWindowSettings(name);
- ImGuiID id = settings->ID;
- *settings = ImGuiWindowSettings(); // Clear existing if recycling previous entry
+ ImGuiID id = ImHashStr(name);
+ ImGuiWindowSettings* settings = ImGui::FindWindowSettingsByID(id);
+ if (settings)
+ *settings = ImGuiWindowSettings(); // Clear existing if recycling previous entry
+ else
+ settings = ImGui::CreateNewWindowSettings(name);
settings->ID = id;
settings->WantApply = true;
return (void*)settings;
@@ -12556,6 +14870,7 @@ static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*,
if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); }
else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); }
else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); }
+ else if (sscanf(line, "IsChild=%d", &i) == 1) { settings->IsChild = (i != 0); }
}
// Apply to existing windows (if any)
@@ -12576,13 +14891,12 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl
// Gather data from windows that were active during this session
// (if a window wasn't opened in this session we preserve its settings)
ImGuiContext& g = *ctx;
- for (int i = 0; i != g.Windows.Size; i++)
+ for (ImGuiWindow* window : g.Windows)
{
- ImGuiWindow* window = g.Windows[i];
if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
continue;
- ImGuiWindowSettings* settings = (window->SettingsOffset != -1) ? g.SettingsWindows.ptr_from_offset(window->SettingsOffset) : ImGui::FindWindowSettings(window->ID);
+ ImGuiWindowSettings* settings = ImGui::FindWindowSettingsByWindow(window);
if (!settings)
{
settings = ImGui::CreateNewWindowSettings(window->Name);
@@ -12591,24 +14905,35 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl
IM_ASSERT(settings->ID == window->ID);
settings->Pos = ImVec2ih(window->Pos);
settings->Size = ImVec2ih(window->SizeFull);
-
+ settings->IsChild = (window->Flags & ImGuiWindowFlags_ChildWindow) != 0;
settings->Collapsed = window->Collapsed;
+ settings->WantDelete = false;
}
// Write to text buffer
buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve
for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
{
+ if (settings->WantDelete)
+ continue;
const char* settings_name = settings->GetName();
buf->appendf("[%s][%s]\n", handler->TypeName, settings_name);
- buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y);
- buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y);
- buf->appendf("Collapsed=%d\n", settings->Collapsed);
+ if (settings->IsChild)
+ {
+ buf->appendf("IsChild=1\n");
+ buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y);
+ }
+ else
+ {
+ buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y);
+ buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y);
+ if (settings->Collapsed)
+ buf->appendf("Collapsed=1\n");
+ }
buf->append("\n");
}
}
-
//-----------------------------------------------------------------------------
// [SECTION] LOCALIZATION
//-----------------------------------------------------------------------------
@@ -12620,12 +14945,12 @@ void ImGui::LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count)
g.LocalizationTable[entries[n].Key] = entries[n].Text;
}
-
//-----------------------------------------------------------------------------
// [SECTION] VIEWPORTS, PLATFORM WINDOWS
//-----------------------------------------------------------------------------
// - GetMainViewport()
// - SetWindowViewport() [Internal]
+// - ScaleWindowsInViewport() [Internal]
// - UpdateViewportsNewFrame() [Internal]
// (this section is more complete in the 'docking' branch)
//-----------------------------------------------------------------------------
@@ -12641,6 +14966,24 @@ void ImGui::SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport)
window->Viewport = viewport;
}
+static void ScaleWindow(ImGuiWindow* window, float scale)
+{
+ ImVec2 origin = window->Viewport->Pos;
+ window->Pos = ImFloor((window->Pos - origin) * scale + origin);
+ window->Size = ImTrunc(window->Size * scale);
+ window->SizeFull = ImTrunc(window->SizeFull * scale);
+ window->ContentSize = ImTrunc(window->ContentSize * scale);
+}
+
+// Scale all windows (position, size). Use when e.g. changing DPI. (This is a lossy operation!)
+void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
+{
+ ImGuiContext& g = *GImGui;
+ for (ImGuiWindow* window : g.Windows)
+ if (window->Viewport == viewport)
+ ScaleWindow(window, scale);
+}
+
// Update viewports and monitor infos
static void ImGui::UpdateViewportsNewFrame()
{
@@ -12654,14 +14997,13 @@ static void ImGui::UpdateViewportsNewFrame()
main_viewport->Pos = ImVec2(0.0f, 0.0f);
main_viewport->Size = g.IO.DisplaySize;
- for (int n = 0; n < g.Viewports.Size; n++)
+ for (ImGuiViewportP* viewport : g.Viewports)
{
- ImGuiViewportP* viewport = g.Viewports[n];
-
- // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again.
- viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin;
- viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax;
- viewport->BuildWorkOffsetMin = viewport->BuildWorkOffsetMax = ImVec2(0.0f, 0.0f);
+ // Lock down space taken by menu bars and status bars
+ // Setup initial value for functions like BeginMainMenuBar(), DockSpaceOverViewport() etc.
+ viewport->WorkInsetMin = viewport->BuildWorkInsetMin;
+ viewport->WorkInsetMax = viewport->BuildWorkInsetMax;
+ viewport->BuildWorkInsetMin = viewport->BuildWorkInsetMax = ImVec2(0.0f, 0.0f);
viewport->UpdateWorkRect();
}
}
@@ -12676,6 +15018,10 @@ static void ImGui::UpdateViewportsNewFrame()
//-----------------------------------------------------------------------------
// [SECTION] PLATFORM DEPENDENT HELPERS
//-----------------------------------------------------------------------------
+// - Default clipboard handlers
+// - Default shell function handlers
+// - Default IME handlers
+//-----------------------------------------------------------------------------
#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS)
@@ -12686,9 +15032,9 @@ static void ImGui::UpdateViewportsNewFrame()
// Win32 clipboard implementation
// We use g.ClipboardHandlerData for temporary storage to ensure it is freed on Shutdown()
-static const char* GetClipboardTextFn_DefaultImpl(void*)
+static const char* Platform_GetClipboardTextFn_DefaultImpl(ImGuiContext* ctx)
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *ctx;
g.ClipboardHandlerData.clear();
if (!::OpenClipboard(NULL))
return NULL;
@@ -12709,7 +15055,7 @@ static const char* GetClipboardTextFn_DefaultImpl(void*)
return g.ClipboardHandlerData.Data;
}
-static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
+static void Platform_SetClipboardTextFn_DefaultImpl(ImGuiContext*, const char* text)
{
if (!::OpenClipboard(NULL))
return;
@@ -12736,12 +15082,12 @@ static PasteboardRef main_clipboard = 0;
// OSX clipboard implementation
// If you enable this you will need to add '-framework ApplicationServices' to your linker command-line!
-static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
+static void Platform_SetClipboardTextFn_DefaultImpl(ImGuiContext*, const char* text)
{
if (!main_clipboard)
PasteboardCreate(kPasteboardClipboard, &main_clipboard);
PasteboardClear(main_clipboard);
- CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, strlen(text));
+ CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, ImStrlen(text));
if (cf_data)
{
PasteboardPutItemFlavor(main_clipboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), cf_data, 0);
@@ -12749,8 +15095,9 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
}
}
-static const char* GetClipboardTextFn_DefaultImpl(void*)
+static const char* Platform_GetClipboardTextFn_DefaultImpl(ImGuiContext* ctx)
{
+ ImGuiContext& g = *ctx;
if (!main_clipboard)
PasteboardCreate(kPasteboardClipboard, &main_clipboard);
PasteboardSynchronize(main_clipboard);
@@ -12768,7 +15115,6 @@ static const char* GetClipboardTextFn_DefaultImpl(void*)
CFDataRef cf_data;
if (PasteboardCopyItemFlavorData(main_clipboard, item_id, CFSTR("public.utf8-plain-text"), &cf_data) == noErr)
{
- ImGuiContext& g = *GImGui;
g.ClipboardHandlerData.clear();
int length = (int)CFDataGetLength(cf_data);
g.ClipboardHandlerData.resize(length + 1);
@@ -12785,23 +15131,83 @@ static const char* GetClipboardTextFn_DefaultImpl(void*)
#else
// Local Dear ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers.
-static const char* GetClipboardTextFn_DefaultImpl(void*)
+static const char* Platform_GetClipboardTextFn_DefaultImpl(ImGuiContext* ctx)
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *ctx;
return g.ClipboardHandlerData.empty() ? NULL : g.ClipboardHandlerData.begin();
}
-static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
+static void Platform_SetClipboardTextFn_DefaultImpl(ImGuiContext* ctx, const char* text)
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *ctx;
g.ClipboardHandlerData.clear();
- const char* text_end = text + strlen(text);
+ const char* text_end = text + ImStrlen(text);
g.ClipboardHandlerData.resize((int)(text_end - text) + 1);
memcpy(&g.ClipboardHandlerData[0], text, (size_t)(text_end - text));
g.ClipboardHandlerData[(int)(text_end - text)] = 0;
}
+#endif // Default clipboard handlers
+
+//-----------------------------------------------------------------------------
+
+#ifndef IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+#if defined(__APPLE__) && TARGET_OS_IPHONE
+#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+#endif
+#if defined(__3DS__)
+#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+#endif
+#if defined(_WIN32) && defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
+#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+#endif
+#endif // #ifndef IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+
+#ifndef IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+#ifdef _WIN32
+#include <shellapi.h> // ShellExecuteA()
+#ifdef _MSC_VER
+#pragma comment(lib, "shell32")
+#endif
+static bool Platform_OpenInShellFn_DefaultImpl(ImGuiContext*, const char* path)
+{
+ const int path_wsize = ::MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
+ ImVector<wchar_t> path_wbuf;
+ path_wbuf.resize(path_wsize);
+ ::MultiByteToWideChar(CP_UTF8, 0, path, -1, path_wbuf.Data, path_wsize);
+ return (INT_PTR)::ShellExecuteW(NULL, L"open", path_wbuf.Data, NULL, NULL, SW_SHOWDEFAULT) > 32;
+}
+#else
+#include <sys/wait.h>
+#include <unistd.h>
+static bool Platform_OpenInShellFn_DefaultImpl(ImGuiContext*, const char* path)
+{
+#if defined(__APPLE__)
+ const char* args[] { "open", "--", path, NULL };
+#else
+ const char* args[] { "xdg-open", path, NULL };
#endif
+ pid_t pid = fork();
+ if (pid < 0)
+ return false;
+ if (!pid)
+ {
+ execvp(args[0], const_cast<char **>(args));
+ exit(-1);
+ }
+ else
+ {
+ int status;
+ waitpid(pid, &status, 0);
+ return WEXITSTATUS(status) == 0;
+ }
+}
+#endif
+#else
+static bool Platform_OpenInShellFn_DefaultImpl(ImGuiContext*, const char*) { return false; }
+#endif // Default shell handlers
+
+//-----------------------------------------------------------------------------
// Win32 API IME support (for Asian languages, etc.)
#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)
@@ -12811,14 +15217,10 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
#pragma comment(lib, "imm32")
#endif
-static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data)
+static void Platform_SetImeDataFn_DefaultImpl(ImGuiContext*, ImGuiViewport* viewport, ImGuiPlatformImeData* data)
{
// Notify OS Input Method Editor of text input position
HWND hwnd = (HWND)viewport->PlatformHandleRaw;
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- if (hwnd == 0)
- hwnd = (HWND)ImGui::GetIO().ImeWindowHandle;
-#endif
if (hwnd == 0)
return;
@@ -12841,14 +15243,14 @@ static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatf
#else
-static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeData*) {}
+static void Platform_SetImeDataFn_DefaultImpl(ImGuiContext*, ImGuiViewport*, ImGuiPlatformImeData*) {}
-#endif
+#endif // Default IME handlers
//-----------------------------------------------------------------------------
// [SECTION] METRICS/DEBUGGER WINDOW
//-----------------------------------------------------------------------------
-// - RenderViewportThumbnail() [Internal]
+// - DebugRenderViewportThumbnail() [Internal]
// - RenderViewportsThumbnails() [Internal]
// - DebugTextEncoding()
// - MetricsHelpMarker() [Internal]
@@ -12879,16 +15281,15 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP*
ImVec2 off = bb.Min - viewport->Pos * scale;
float alpha_mul = 1.0f;
window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f));
- for (int i = 0; i != g.Windows.Size; i++)
+ for (ImGuiWindow* thumb_window : g.Windows)
{
- ImGuiWindow* thumb_window = g.Windows[i];
if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow))
continue;
ImRect thumb_r = thumb_window->Rect();
ImRect title_r = thumb_window->TitleBarRect();
- thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale));
- title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height
+ thumb_r = ImRect(ImTrunc(off + thumb_r.Min * scale), ImTrunc(off + thumb_r.Max * scale));
+ title_r = ImRect(ImTrunc(off + title_r.Min * scale), ImTrunc(off + ImVec2(title_r.Max.x, title_r.Min.y + title_r.GetHeight() * 3.0f) * scale)); // Exaggerate title bar height
thumb_r.ClipWithFull(bb);
title_r.ClipWithFull(bb);
const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight);
@@ -12898,6 +15299,8 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP*
window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name));
}
draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul));
+ if (viewport->ID == g.DebugMetricsConfig.HighlightViewportID)
+ window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255));
}
static void RenderViewportsThumbnails()
@@ -12905,27 +15308,75 @@ static void RenderViewportsThumbnails()
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports.
float SCALE = 1.0f / 8.0f;
- ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX);
- for (int n = 0; n < g.Viewports.Size; n++)
- bb_full.Add(g.Viewports[n]->GetMainRect());
+ ImRect bb_full(g.Viewports[0]->Pos, g.Viewports[0]->Pos + g.Viewports[0]->Size);
ImVec2 p = window->DC.CursorPos;
ImVec2 off = p - bb_full.Min * SCALE;
- for (int n = 0; n < g.Viewports.Size; n++)
+
+ // Draw viewports
+ for (ImGuiViewportP* viewport : g.Viewports)
{
- ImGuiViewportP* viewport = g.Viewports[n];
ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE);
ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb);
}
ImGui::Dummy(bb_full.GetSize() * SCALE);
}
+// Draw an arbitrary US keyboard layout to visualize translated keys
+void ImGui::DebugRenderKeyboardPreview(ImDrawList* draw_list)
+{
+ const float scale = ImGui::GetFontSize() / 13.0f;
+ const ImVec2 key_size = ImVec2(35.0f, 35.0f) * scale;
+ const float key_rounding = 3.0f * scale;
+ const ImVec2 key_face_size = ImVec2(25.0f, 25.0f) * scale;
+ const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f) * scale;
+ const float key_face_rounding = 2.0f * scale;
+ const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f) * scale;
+ const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f);
+ const float key_row_offset = 9.0f * scale;
+
+ ImVec2 board_min = GetCursorScreenPos();
+ ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f);
+ ImVec2 start_pos = ImVec2(board_min.x + 5.0f - key_step.x, board_min.y);
+
+ struct KeyLayoutData { int Row, Col; const char* Label; ImGuiKey Key; };
+ const KeyLayoutData keys_to_display[] =
+ {
+ { 0, 0, "", ImGuiKey_Tab }, { 0, 1, "Q", ImGuiKey_Q }, { 0, 2, "W", ImGuiKey_W }, { 0, 3, "E", ImGuiKey_E }, { 0, 4, "R", ImGuiKey_R },
+ { 1, 0, "", ImGuiKey_CapsLock }, { 1, 1, "A", ImGuiKey_A }, { 1, 2, "S", ImGuiKey_S }, { 1, 3, "D", ImGuiKey_D }, { 1, 4, "F", ImGuiKey_F },
+ { 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V }
+ };
+
+ // Elements rendered manually via ImDrawList API are not clipped automatically.
+ // While not strictly necessary, here IsItemVisible() is used to avoid rendering these shapes when they are out of view.
+ Dummy(board_max - board_min);
+ if (!IsItemVisible())
+ return;
+ draw_list->PushClipRect(board_min, board_max, true);
+ for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++)
+ {
+ const KeyLayoutData* key_data = &keys_to_display[n];
+ ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y);
+ ImVec2 key_max = key_min + key_size;
+ draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding);
+ draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding);
+ ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y);
+ ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y);
+ draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f);
+ draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding);
+ ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y);
+ draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label);
+ if (IsKeyDown(key_data->Key))
+ draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding);
+ }
+ draw_list->PopClipRect();
+}
+
// Helper tool to diagnose between text encoding issues and font loading issues. Pass your UTF-8 string and verify that there are correct.
void ImGui::DebugTextEncoding(const char* str)
{
Text("Text: \"%s\"", str);
- if (!BeginTable("list", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit))
+ if (!BeginTable("##DebugTextEncoding", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable))
return;
TableSetupColumn("Offset");
TableSetupColumn("UTF-8");
@@ -12957,13 +15408,52 @@ void ImGui::DebugTextEncoding(const char* str)
EndTable();
}
+static void DebugFlashStyleColorStop()
+{
+ ImGuiContext& g = *GImGui;
+ if (g.DebugFlashStyleColorIdx != ImGuiCol_COUNT)
+ g.Style.Colors[g.DebugFlashStyleColorIdx] = g.DebugFlashStyleColorBackup;
+ g.DebugFlashStyleColorIdx = ImGuiCol_COUNT;
+}
+
+// Flash a given style color for some + inhibit modifications of this color via PushStyleColor() calls.
+void ImGui::DebugFlashStyleColor(ImGuiCol idx)
+{
+ ImGuiContext& g = *GImGui;
+ DebugFlashStyleColorStop();
+ g.DebugFlashStyleColorTime = 0.5f;
+ g.DebugFlashStyleColorIdx = idx;
+ g.DebugFlashStyleColorBackup = g.Style.Colors[idx];
+}
+
+void ImGui::UpdateDebugToolFlashStyleColor()
+{
+ ImGuiContext& g = *GImGui;
+ if (g.DebugFlashStyleColorTime <= 0.0f)
+ return;
+ ColorConvertHSVtoRGB(ImCos(g.DebugFlashStyleColorTime * 6.0f) * 0.5f + 0.5f, 0.5f, 0.5f, g.Style.Colors[g.DebugFlashStyleColorIdx].x, g.Style.Colors[g.DebugFlashStyleColorIdx].y, g.Style.Colors[g.DebugFlashStyleColorIdx].z);
+ g.Style.Colors[g.DebugFlashStyleColorIdx].w = 1.0f;
+ if ((g.DebugFlashStyleColorTime -= g.IO.DeltaTime) <= 0.0f)
+ DebugFlashStyleColorStop();
+}
+
+static const char* FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureID tex_id)
+{
+ union { void* ptr; int integer; } tex_id_opaque;
+ memcpy(&tex_id_opaque, &tex_id, ImMin(sizeof(void*), sizeof(tex_id)));
+ if (sizeof(tex_id) >= sizeof(void*))
+ ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr);
+ else
+ ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer);
+ return buf;
+}
+
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
static void MetricsHelpMarker(const char* desc)
{
ImGui::TextDisabled("(?)");
- if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort))
+ if (ImGui::BeginItemTooltip())
{
- ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
ImGui::TextUnformatted(desc);
ImGui::PopTextWrapPos();
@@ -12974,18 +15464,18 @@ static void MetricsHelpMarker(const char* desc)
// [DEBUG] List fonts in a font atlas and display its texture
void ImGui::ShowFontAtlas(ImFontAtlas* atlas)
{
- for (int i = 0; i < atlas->Fonts.Size; i++)
+ for (ImFont* font : atlas->Fonts)
{
- ImFont* font = atlas->Fonts[i];
PushID(font);
DebugNodeFont(font);
PopID();
}
- if (TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
+ if (TreeNode("Font Atlas", "Font Atlas (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
{
- ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
- ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f);
- Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), tint_col, border_col);
+ ImGuiContext& g = *GImGui;
+ PushStyleVar(ImGuiStyleVar_ImageBorderSize, ImMax(1.0f, g.Style.ImageBorderSize));
+ ImageWithBg(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
+ PopStyleVar();
TreePop();
}
}
@@ -12997,8 +15487,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig;
if (cfg->ShowDebugLog)
ShowDebugLogWindow(&cfg->ShowDebugLog);
- if (cfg->ShowStackTool)
- ShowStackToolWindow(&cfg->ShowStackTool);
+ if (cfg->ShowIDStackTool)
+ ShowIDStackToolWindow(&cfg->ShowIDStackTool);
if (!Begin("Dear ImGui Metrics/Debugger", p_open) || GetCurrentWindow()->BeginCount > 1)
{
@@ -13006,11 +15496,19 @@ void ImGui::ShowMetricsWindow(bool* p_open)
return;
}
+ // [DEBUG] Clear debug breaks hooks after exactly one cycle.
+ DebugBreakClearData();
+
// Basic info
- Text("Dear ImGui %s", GetVersion());
+ Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
+ if (g.ContextName[0] != 0)
+ {
+ SameLine();
+ Text("(Context Name: \"%s\")", g.ContextName);
+ }
Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3);
- Text("%d visible windows, %d active allocations", io.MetricsRenderWindows, io.MetricsActiveAllocations);
+ Text("%d visible windows, %d current allocations", io.MetricsRenderWindows, g.DebugAllocInfo.TotalAllocCount - g.DebugAllocInfo.TotalFreeCount);
//SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; }
Separator();
@@ -13039,10 +15537,10 @@ void ImGui::ShowMetricsWindow(bool* p_open)
else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table_instance->LastOuterHeight); }
else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); }
else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; }
- else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate
- else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); }
- else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); }
- else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); }
+ else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastTopHeadersRowHeight); } // Note: y1/y2 not always accurate
+ else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastTopHeadersRowHeight); }
+ else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight); }
+ else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); }
IM_ASSERT(0);
return ImRect();
}
@@ -13054,7 +15552,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
else if (rect_type == WRT_InnerRect) { return window->InnerRect; }
else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; }
else if (rect_type == WRT_WorkRect) { return window->WorkRect; }
- else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); }
+ else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); }
else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); }
else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; }
IM_ASSERT(0);
@@ -13065,34 +15563,24 @@ void ImGui::ShowMetricsWindow(bool* p_open)
// Tools
if (TreeNode("Tools"))
{
- bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer");
- SameLine();
- MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct.");
- if (show_encoding_viewer)
- {
- static char buf[100] = "";
- SetNextItemWidth(-FLT_MIN);
- InputText("##Text", buf, IM_ARRAYSIZE(buf));
- if (buf[0] != 0)
- DebugTextEncoding(buf);
- TreePop();
- }
-
+ // Debug Break features
// The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted.
- if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive)
- DebugStartItemPicker();
+ SeparatorTextEx(0, "Debug breaks", NULL, CalcTextSize("(?)").x + g.Style.SeparatorTextPadding.x);
SameLine();
MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash.");
+ if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive)
+ DebugStartItemPicker();
+ Checkbox("Show \"Debug Break\" buttons in other sections (io.ConfigDebugIsDebuggerPresent)", &g.IO.ConfigDebugIsDebuggerPresent);
+
+ SeparatorText("Visualize");
- // Stack Tool is your best friend!
Checkbox("Show Debug Log", &cfg->ShowDebugLog);
SameLine();
MetricsHelpMarker("You can also call ImGui::ShowDebugLogWindow() from your code.");
- // Stack Tool is your best friend!
- Checkbox("Show Stack Tool", &cfg->ShowStackTool);
+ Checkbox("Show ID Stack Tool", &cfg->ShowIDStackTool);
SameLine();
- MetricsHelpMarker("You can also call ImGui::ShowStackToolWindow() from your code.");
+ MetricsHelpMarker("You can also call ImGui::ShowIDStackToolWindow() from your code.");
Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder);
Checkbox("Show windows rectangles", &cfg->ShowWindowsRects);
@@ -13155,6 +15643,25 @@ void ImGui::ShowMetricsWindow(bool* p_open)
Unindent();
}
}
+ Checkbox("Show groups rectangles", &g.DebugShowGroupRects); // Storing in context as this is used by group code and prefers to be in hot-data
+
+ SeparatorText("Validate");
+
+ Checkbox("Debug Begin/BeginChild return value", &io.ConfigDebugBeginReturnValueLoop);
+ SameLine();
+ MetricsHelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running.");
+
+ Checkbox("UTF-8 Encoding viewer", &cfg->ShowTextEncodingViewer);
+ SameLine();
+ MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct.");
+ if (cfg->ShowTextEncodingViewer)
+ {
+ static char buf[64] = "";
+ SetNextItemWidth(-FLT_MIN);
+ InputText("##DebugTextEncodingBuf", buf, IM_ARRAYSIZE(buf));
+ if (buf[0] != 0)
+ DebugTextEncoding(buf);
+ }
TreePop();
}
@@ -13170,9 +15677,9 @@ void ImGui::ShowMetricsWindow(bool* p_open)
// Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship!
ImVector<ImGuiWindow*>& temp_buffer = g.WindowsTempSortBuffer;
temp_buffer.resize(0);
- for (int i = 0; i < g.Windows.Size; i++)
- if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount)
- temp_buffer.push_back(g.Windows[i]);
+ for (ImGuiWindow* window : g.Windows)
+ if (window->LastFrameActive + 1 >= g.FrameCount)
+ temp_buffer.push_back(window);
struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } };
ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder);
DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL);
@@ -13184,44 +15691,44 @@ void ImGui::ShowMetricsWindow(bool* p_open)
// DrawLists
int drawlist_count = 0;
- for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++)
- drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount();
+ for (ImGuiViewportP* viewport : g.Viewports)
+ drawlist_count += viewport->DrawDataP.CmdLists.Size;
if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count))
{
Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh);
Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes);
- for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++)
- {
- ImGuiViewportP* viewport = g.Viewports[viewport_i];
- for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++)
- for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++)
- DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList");
- }
+ for (ImGuiViewportP* viewport : g.Viewports)
+ for (ImDrawList* draw_list : viewport->DrawDataP.CmdLists)
+ DebugNodeDrawList(NULL, viewport, draw_list, "DrawList");
TreePop();
}
// Viewports
if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size))
{
- Indent(GetTreeNodeToLabelSpacing());
- RenderViewportsThumbnails();
- Unindent(GetTreeNodeToLabelSpacing());
- for (int i = 0; i < g.Viewports.Size; i++)
- DebugNodeViewport(g.Viewports[i]);
+ SetNextItemOpen(true, ImGuiCond_Once);
+ if (TreeNode("Windows Minimap"))
+ {
+ RenderViewportsThumbnails();
+ TreePop();
+ }
+ cfg->HighlightViewportID = 0;
+
+ for (ImGuiViewportP* viewport : g.Viewports)
+ DebugNodeViewport(viewport);
TreePop();
}
// Details for Popups
if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
{
- for (int i = 0; i < g.OpenPopupStack.Size; i++)
+ for (const ImGuiPopupData& popup_data : g.OpenPopupStack)
{
// As it's difficult to interact with tree nodes while popups are open, we display everything inline.
- const ImGuiPopupData* popup_data = &g.OpenPopupStack[i];
- ImGuiWindow* window = popup_data->Window;
- BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'",
- popup_data->PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "",
- popup_data->BackupNavWindow ? popup_data->BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL");
+ ImGuiWindow* window = popup_data.Window;
+ BulletText("PopupID: %08x, Window: '%s' (%s%s), RestoreNavWindow '%s', ParentWindow '%s'",
+ popup_data.PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "",
+ popup_data.RestoreNavWindow ? popup_data.RestoreNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL");
}
TreePop();
}
@@ -13263,6 +15770,24 @@ void ImGui::ShowMetricsWindow(bool* p_open)
TreePop();
}
+ // Details for TypingSelect
+ if (TreeNode("TypingSelect", "TypingSelect (%d)", g.TypingSelectState.SearchBuffer[0] != 0 ? 1 : 0))
+ {
+ DebugNodeTypingSelectState(&g.TypingSelectState);
+ TreePop();
+ }
+
+ // Details for MultiSelect
+ if (TreeNode("MultiSelect", "MultiSelect (%d)", g.MultiSelectStorage.GetAliveCount()))
+ {
+ ImGuiBoxSelectState* bs = &g.BoxSelectState;
+ BulletText("BoxSelect ID=0x%08X, Starting = %d, Active %d", bs->ID, bs->IsStarting, bs->IsActive);
+ for (int n = 0; n < g.MultiSelectStorage.GetMapSize(); n++)
+ if (ImGuiMultiSelectState* state = g.MultiSelectStorage.TryGetMapData(n))
+ DebugNodeMultiSelectState(state);
+ TreePop();
+ }
+
// Details for Docking
#ifdef IMGUI_HAS_DOCK
if (TreeNode("Docking"))
@@ -13287,11 +15812,12 @@ void ImGui::ShowMetricsWindow(bool* p_open)
Text("\"%s\"", g.IO.IniFilename);
else
TextUnformatted("<NULL>");
+ Checkbox("io.ConfigDebugIniSettings", &io.ConfigDebugIniSettings);
Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer);
if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size))
{
- for (int n = 0; n < g.SettingsHandlers.Size; n++)
- BulletText("%s", g.SettingsHandlers[n].TypeName);
+ for (ImGuiSettingsHandler& handler : g.SettingsHandlers)
+ BulletText("\"%s\"", handler.TypeName);
TreePop();
}
if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size()))
@@ -13319,41 +15845,114 @@ void ImGui::ShowMetricsWindow(bool* p_open)
TreePop();
}
- if (TreeNode("Key Owners & Shortcut Routing"))
- {
- TextUnformatted("Key Owners:");
- if (BeginListBox("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8)))
+ // Settings
+ if (TreeNode("Memory allocations"))
+ {
+ ImGuiDebugAllocInfo* info = &g.DebugAllocInfo;
+ Text("%d current allocations", info->TotalAllocCount - info->TotalFreeCount);
+ if (SmallButton("GC now")) { g.GcCompactAll = true; }
+ Text("Recent frames with allocations:");
+ int buf_size = IM_ARRAYSIZE(info->LastEntriesBuf);
+ for (int n = buf_size - 1; n >= 0; n--)
{
- for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
+ ImGuiDebugAllocEntry* entry = &info->LastEntriesBuf[(info->LastEntriesIdx - n + buf_size) % buf_size];
+ BulletText("Frame %06d: %+3d ( %2d alloc, %2d free )", entry->FrameCount, entry->AllocCount - entry->FreeCount, entry->AllocCount, entry->FreeCount);
+ if (n == 0)
{
- ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key);
- if (owner_data->OwnerCurr == ImGuiKeyOwner_None)
- continue;
- Text("%s: 0x%08X%s", GetKeyName(key), owner_data->OwnerCurr,
- owner_data->LockUntilRelease ? " LockUntilRelease" : owner_data->LockThisFrame ? " LockThisFrame" : "");
- DebugLocateItemOnHover(owner_data->OwnerCurr);
+ SameLine();
+ Text("<- %d frames ago", g.FrameCount - entry->FrameCount);
}
- EndListBox();
}
- TextUnformatted("Shortcut Routing:");
- if (BeginListBox("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8)))
+ TreePop();
+ }
+
+ if (TreeNode("Inputs"))
+ {
+ Text("KEYBOARD/GAMEPAD/MOUSE KEYS");
{
- for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
- {
- ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable;
- for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; )
+ // User code should never have to go through such hoops! You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END.
+ Indent();
+ Text("Keys down:"); for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { if (!IsKeyDown(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); SameLine(); Text("(%.02f)", GetKeyData(key)->DownDuration); }
+ Text("Keys pressed:"); for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { if (!IsKeyPressed(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); }
+ Text("Keys released:"); for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { if (!IsKeyReleased(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); }
+ Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : "");
+ Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; SameLine(); Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public.
+ DebugRenderKeyboardPreview(GetWindowDrawList());
+ Unindent();
+ }
+
+ Text("MOUSE STATE");
+ {
+ Indent();
+ if (IsMousePosValid())
+ Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y);
+ else
+ Text("Mouse pos: <INVALID>");
+ Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y);
+ int count = IM_ARRAYSIZE(io.MouseDown);
+ Text("Mouse down:"); for (int i = 0; i < count; i++) if (IsMouseDown(i)) { SameLine(); Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); }
+ Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (IsMouseClicked(i)) { SameLine(); Text("b%d (%d)", i, io.MouseClickedCount[i]); }
+ Text("Mouse released:"); for (int i = 0; i < count; i++) if (IsMouseReleased(i)) { SameLine(); Text("b%d", i); }
+ Text("Mouse wheel: %.1f", io.MouseWheel);
+ Text("MouseStationaryTimer: %.2f", g.MouseStationaryTimer);
+ Text("Mouse source: %s", GetMouseSourceName(io.MouseSource));
+ Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused
+ Unindent();
+ }
+
+ Text("MOUSE WHEELING");
+ {
+ Indent();
+ Text("WheelingWindow: '%s'", g.WheelingWindow ? g.WheelingWindow->Name : "NULL");
+ Text("WheelingWindowReleaseTimer: %.2f", g.WheelingWindowReleaseTimer);
+ Text("WheelingAxisAvg[] = { %.3f, %.3f }, Main Axis: %s", g.WheelingAxisAvg.x, g.WheelingAxisAvg.y, (g.WheelingAxisAvg.x > g.WheelingAxisAvg.y) ? "X" : (g.WheelingAxisAvg.x < g.WheelingAxisAvg.y) ? "Y" : "<none>");
+ Unindent();
+ }
+
+ Text("KEY OWNERS");
+ {
+ Indent();
+ if (BeginChild("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings))
+ for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
+ {
+ ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
+ if (owner_data->OwnerCurr == ImGuiKeyOwner_NoOwner)
+ continue;
+ Text("%s: 0x%08X%s", GetKeyName(key), owner_data->OwnerCurr,
+ owner_data->LockUntilRelease ? " LockUntilRelease" : owner_data->LockThisFrame ? " LockThisFrame" : "");
+ DebugLocateItemOnHover(owner_data->OwnerCurr);
+ }
+ EndChild();
+ Unindent();
+ }
+ Text("SHORTCUT ROUTING");
+ SameLine();
+ MetricsHelpMarker("Declared shortcut routes automatically set key owner when mods matches.");
+ {
+ Indent();
+ if (BeginChild("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings))
+ for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
{
- char key_chord_name[64];
- ImGuiKeyRoutingData* routing_data = &rt->Entries[idx];
- GetKeyChordName(key | routing_data->Mods, key_chord_name, IM_ARRAYSIZE(key_chord_name));
- Text("%s: 0x%08X", key_chord_name, routing_data->RoutingCurr);
- DebugLocateItemOnHover(routing_data->RoutingCurr);
- idx = routing_data->NextEntryIndex;
+ ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable;
+ for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; )
+ {
+ ImGuiKeyRoutingData* routing_data = &rt->Entries[idx];
+ ImGuiKeyChord key_chord = key | routing_data->Mods;
+ Text("%s: 0x%08X (scored %d)", GetKeyChordName(key_chord), routing_data->RoutingCurr, routing_data->RoutingCurrScore);
+ DebugLocateItemOnHover(routing_data->RoutingCurr);
+ if (g.IO.ConfigDebugIsDebuggerPresent)
+ {
+ SameLine();
+ if (DebugBreakButton("**DebugBreak**", "in SetShortcutRouting() for this KeyChord"))
+ g.DebugBreakInShortcutRouting = key_chord;
+ }
+ idx = routing_data->NextEntryIndex;
+ }
}
- }
- EndListBox();
+ EndChild();
+ Text("(ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: 0x%X)", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask);
+ Unindent();
}
- Text("(ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: 0x%X)", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask);
TreePop();
}
@@ -13374,7 +15973,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL");
Text("ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: %X", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask);
Text("HoveredId: 0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Not displaying g.HoveredId as it is update mid-frame
- Text("HoverDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverDelayId, g.HoverDelayTimer, g.HoverDelayClearTimer);
+ Text("HoverItemDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverItemDelayId, g.HoverItemDelayTimer, g.HoverItemDelayClearTimer);
Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize);
DebugLocateItemOnHover(g.DragDropPayload.SourceId);
Unindent();
@@ -13385,11 +15984,20 @@ void ImGui::ShowMetricsWindow(bool* p_open)
Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer);
DebugLocateItemOnHover(g.NavId);
Text("NavInputSource: %s", GetInputSourceName(g.NavInputSource));
+ Text("NavLastValidSelectionUserData = %" IM_PRId64 " (0x%" IM_PRIX64 ")", g.NavLastValidSelectionUserData, g.NavLastValidSelectionUserData);
Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible);
- Text("NavActivateId/DownId/PressedId/InputId: %08X/%08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId, g.NavActivateInputId);
+ Text("NavActivateId/DownId/PressedId: %08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId);
Text("NavActivateFlags: %04X", g.NavActivateFlags);
- Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover);
+ Text("NavCursorVisible: %d, NavHighlightItemUnderNav: %d", g.NavCursorVisible, g.NavHighlightItemUnderNav);
Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId);
+ Text("NavFocusRoute[] = ");
+ for (int path_n = g.NavFocusRoute.Size - 1; path_n >= 0; path_n--)
+ {
+ const ImGuiFocusScopeData& focus_scope = g.NavFocusRoute[path_n];
+ SameLine(0.0f, 0.0f);
+ Text("0x%08X/", focus_scope.ID);
+ SetItemTooltip("In window \"%s\"", FindWindowByID(focus_scope.WindowID)->Name);
+ }
Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL");
Unindent();
@@ -13399,9 +16007,8 @@ void ImGui::ShowMetricsWindow(bool* p_open)
// Overlay: Display windows Rectangles and Begin Order
if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder)
{
- for (int n = 0; n < g.Windows.Size; n++)
+ for (ImGuiWindow* window : g.Windows)
{
- ImGuiWindow* window = g.Windows[n];
if (!window->WasActive)
continue;
ImDrawList* draw_list = GetForegroundDrawList(window);
@@ -13458,21 +16065,80 @@ void ImGui::ShowMetricsWindow(bool* p_open)
End();
}
+void ImGui::DebugBreakClearData()
+{
+ // Those fields are scattered in their respective subsystem to stay in hot-data locations
+ ImGuiContext& g = *GImGui;
+ g.DebugBreakInWindow = 0;
+ g.DebugBreakInTable = 0;
+ g.DebugBreakInShortcutRouting = ImGuiKey_None;
+}
+
+void ImGui::DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location)
+{
+ if (!BeginItemTooltip())
+ return;
+ Text("To call IM_DEBUG_BREAK() %s:", description_of_location);
+ Separator();
+ TextUnformatted(keyboard_only ? "- Press 'Pause/Break' on keyboard." : "- Press 'Pause/Break' on keyboard.\n- or Click (may alter focus/active id).\n- or navigate using keyboard and press space.");
+ Separator();
+ TextUnformatted("Choose one way that doesn't interfere with what you are trying to debug!\nYou need a debugger attached or this will crash!");
+ EndTooltip();
+}
+
+// Special button that doesn't take focus, doesn't take input owner, and can be activated without a click etc.
+// In order to reduce interferences with the contents we are trying to debug into.
+bool ImGui::DebugBreakButton(const char* label, const char* description_of_location)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ if (window->SkipItems)
+ return false;
+
+ ImGuiContext& g = *GImGui;
+ const ImGuiID id = window->GetID(label);
+ const ImVec2 label_size = CalcTextSize(label, NULL, true);
+ ImVec2 pos = window->DC.CursorPos + ImVec2(0.0f, window->DC.CurrLineTextBaseOffset);
+ ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x * 2.0f, label_size.y);
+
+ const ImRect bb(pos, pos + size);
+ ItemSize(size, 0.0f);
+ if (!ItemAdd(bb, id))
+ return false;
+
+ // WE DO NOT USE ButtonEx() or ButtonBehavior() in order to reduce our side-effects.
+ bool hovered = ItemHoverable(bb, id, g.CurrentItemFlags);
+ bool pressed = hovered && (IsKeyChordPressed(g.DebugBreakKeyChord) || IsMouseClicked(0) || g.NavActivateId == id);
+ DebugBreakButtonTooltip(false, description_of_location);
+
+ ImVec4 col4f = GetStyleColorVec4(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ ImVec4 hsv;
+ ColorConvertRGBtoHSV(col4f.x, col4f.y, col4f.z, hsv.x, hsv.y, hsv.z);
+ ColorConvertHSVtoRGB(hsv.x + 0.20f, hsv.y, hsv.z, col4f.x, col4f.y, col4f.z);
+
+ RenderNavCursor(bb, id);
+ RenderFrame(bb.Min, bb.Max, GetColorU32(col4f), true, g.Style.FrameRounding);
+ RenderTextClipped(bb.Min, bb.Max, label, NULL, &label_size, g.Style.ButtonTextAlign, &bb);
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
+ return pressed;
+}
+
// [DEBUG] Display contents of Columns
void ImGui::DebugNodeColumns(ImGuiOldColumns* columns)
{
if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
return;
BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX);
- for (int column_n = 0; column_n < columns->Columns.Size; column_n++)
- BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm));
+ for (ImGuiOldColumnData& column : columns->Columns)
+ BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", (int)columns->Columns.index_from_ptr(&column), column.OffsetNorm, GetColumnOffsetFromNorm(columns, column.OffsetNorm));
TreePop();
}
// [DEBUG] Display contents of ImDrawList
-void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label)
+void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label)
{
ImGuiContext& g = *GImGui;
+ IM_UNUSED(viewport); // Used in docking branch
ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig;
int cmd_count = draw_list->CmdBuffer.Size;
if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL)
@@ -13504,10 +16170,11 @@ void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list,
continue;
}
+ char texid_desc[20];
+ FormatTextureIDForDebugDisplay(texid_desc, IM_ARRAYSIZE(texid_desc), pcmd->TextureId);
char buf[300];
- ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)",
- pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId,
- pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex %s, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)",
+ pcmd->ElemCount / 3, texid_desc, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf);
if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list)
DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes);
@@ -13587,8 +16254,8 @@ void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, co
// Draw bounding boxes
if (show_aabb)
{
- out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU
- out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles
+ out_draw_list->AddRect(ImTrunc(clip_rect.Min), ImTrunc(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU
+ out_draw_list->AddRect(ImTrunc(vtxs_rect.Min), ImTrunc(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles
}
out_draw_list->Flags = backup_flags;
}
@@ -13596,24 +16263,30 @@ void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, co
// [DEBUG] Display details for a single font, called by ShowStyleEditor().
void ImGui::DebugNodeFont(ImFont* font)
{
- bool opened = TreeNode(font, "Font: \"%s\"\n%.2f px, %d glyphs, %d file(s)",
- font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount);
- SameLine();
- if (SmallButton("Set as default"))
- GetIO().FontDefault = font;
- if (!opened)
- return;
+ bool opened = TreeNode(font, "Font: \"%s\": %.2f px, %d glyphs, %d sources(s)",
+ font->Sources ? font->Sources[0].Name : "", font->FontSize, font->Glyphs.Size, font->SourcesCount);
// Display preview text
+ if (!opened)
+ Indent();
+ Indent();
PushFont(font);
Text("The quick brown fox jumps over the lazy dog");
PopFont();
+ if (!opened)
+ {
+ Unindent();
+ Unindent();
+ return;
+ }
+ if (SmallButton("Set as default"))
+ GetIO().FontDefault = font;
// Display details
SetNextItemWidth(GetFontSize() * 8);
DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f");
SameLine(); MetricsHelpMarker(
- "Note than the default embedded font is NOT meant to be scaled.\n\n"
+ "Note that the default embedded font is NOT meant to be scaled.\n\n"
"Font are currently rendered into bitmaps at a given size at the time of building the atlas. "
"You may oversample them to get some flexibility with scaling. "
"You can also render at multiple sizes and select which one to use at runtime.\n\n"
@@ -13624,65 +16297,71 @@ void ImGui::DebugNodeFont(ImFont* font)
Text("Ellipsis character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->EllipsisChar), font->EllipsisChar);
const int surface_sqrt = (int)ImSqrt((float)font->MetricsTotalSurface);
Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt);
- for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)
- if (font->ConfigData)
- if (const ImFontConfig* cfg = &font->ConfigData[config_i])
- BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d, Offset: (%.1f,%.1f)",
- config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y);
+ for (int config_i = 0; config_i < font->SourcesCount; config_i++)
+ if (font->Sources)
+ {
+ const ImFontConfig* src = &font->Sources[config_i];
+ int oversample_h, oversample_v;
+ ImFontAtlasBuildGetOversampleFactors(src, &oversample_h, &oversample_v);
+ BulletText("Input %d: \'%s\', Oversample: (%d=>%d,%d=>%d), PixelSnapH: %d, Offset: (%.1f,%.1f)",
+ config_i, src->Name, src->OversampleH, oversample_h, src->OversampleV, oversample_v, src->PixelSnapH, src->GlyphOffset.x, src->GlyphOffset.y);
+ }
// Display all glyphs of the fonts in separate pages of 256 characters
- if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size))
- {
- ImDrawList* draw_list = GetWindowDrawList();
- const ImU32 glyph_col = GetColorU32(ImGuiCol_Text);
- const float cell_size = font->FontSize * 1;
- const float cell_spacing = GetStyle().ItemSpacing.y;
- for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256)
- {
- // Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k)
- // This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT
- // is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here)
- if (!(base & 4095) && font->IsGlyphRangeUnused(base, base + 4095))
+ {
+ if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size))
+ {
+ ImDrawList* draw_list = GetWindowDrawList();
+ const ImU32 glyph_col = GetColorU32(ImGuiCol_Text);
+ const float cell_size = font->FontSize * 1;
+ const float cell_spacing = GetStyle().ItemSpacing.y;
+ for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256)
{
- base += 4096 - 256;
- continue;
- }
-
- int count = 0;
- for (unsigned int n = 0; n < 256; n++)
- if (font->FindGlyphNoFallback((ImWchar)(base + n)))
- count++;
- if (count <= 0)
- continue;
- if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph"))
- continue;
+ // Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k)
+ // This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT
+ // is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here)
+ if (!(base & 8191) && font->IsGlyphRangeUnused(base, base + 8191))
+ {
+ base += 8192 - 256;
+ continue;
+ }
- // Draw a 16x16 grid of glyphs
- ImVec2 base_pos = GetCursorScreenPos();
- for (unsigned int n = 0; n < 256; n++)
- {
- // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions
- // available here and thus cannot easily generate a zero-terminated UTF-8 encoded string.
- ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing));
- ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
- const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n));
- draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50));
- if (!glyph)
+ int count = 0;
+ for (unsigned int n = 0; n < 256; n++)
+ if (font->FindGlyphNoFallback((ImWchar)(base + n)))
+ count++;
+ if (count <= 0)
+ continue;
+ if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph"))
continue;
- font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n));
- if (IsMouseHoveringRect(cell_p1, cell_p2))
+
+ // Draw a 16x16 grid of glyphs
+ ImVec2 base_pos = GetCursorScreenPos();
+ for (unsigned int n = 0; n < 256; n++)
{
- BeginTooltip();
- DebugNodeFontGlyph(font, glyph);
- EndTooltip();
+ // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions
+ // available here and thus cannot easily generate a zero-terminated UTF-8 encoded string.
+ ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing));
+ ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
+ const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n));
+ draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50));
+ if (!glyph)
+ continue;
+ font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n));
+ if (IsMouseHoveringRect(cell_p1, cell_p2) && BeginTooltip())
+ {
+ DebugNodeFontGlyph(font, glyph);
+ EndTooltip();
+ }
}
+ Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16));
+ TreePop();
}
- Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16));
TreePop();
}
- TreePop();
}
TreePop();
+ Unindent();
}
void ImGui::DebugNodeFontGlyph(ImFont*, const ImFontGlyph* glyph)
@@ -13700,10 +16379,10 @@ void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label)
{
if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes()))
return;
- for (int n = 0; n < storage->Data.Size; n++)
+ for (const ImGuiStoragePair& p : storage->Data)
{
- const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n];
BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer.
+ DebugLocateItemOnHover(p.key);
}
TreePop();
}
@@ -13716,13 +16395,11 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label)
char* p = buf;
const char* buf_end = buf + IM_ARRAYSIZE(buf);
const bool is_active = (tab_bar->PrevFrameVisible >= GetFrameCount() - 2);
- p += ImFormatString(p, buf_end - p, "%s 0x%08X (%d tabs)%s", label, tab_bar->ID, tab_bar->Tabs.Size, is_active ? "" : " *Inactive*");
- p += ImFormatString(p, buf_end - p, " { ");
+ p += ImFormatString(p, buf_end - p, "%s 0x%08X (%d tabs)%s {", label, tab_bar->ID, tab_bar->Tabs.Size, is_active ? "" : " *Inactive*");
for (int tab_n = 0; tab_n < ImMin(tab_bar->Tabs.Size, 3); tab_n++)
{
ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
- p += ImFormatString(p, buf_end - p, "%s'%s'",
- tab_n > 0 ? ", " : "", (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "???");
+ p += ImFormatString(p, buf_end - p, "%s'%s'", tab_n > 0 ? ", " : "", TabBarGetTabName(tab_bar, tab));
}
p += ImFormatString(p, buf_end - p, (tab_bar->Tabs.Size > 3) ? " ... }" : " } ");
if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); }
@@ -13739,12 +16416,12 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label)
{
for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
{
- const ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
PushID(tab);
if (SmallButton("<")) { TabBarQueueReorder(tab_bar, tab, -1); } SameLine(0, 2);
if (SmallButton(">")) { TabBarQueueReorder(tab_bar, tab, +1); } SameLine();
Text("%02d%c Tab 0x%08X '%s' Offset: %.2f, Width: %.2f/%.2f",
- tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "???", tab->Offset, tab->Width, tab->ContentWidth);
+ tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, TabBarGetTabName(tab_bar, tab), tab->Offset, tab->Width, tab->ContentWidth);
PopID();
}
TreePop();
@@ -13753,20 +16430,23 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label)
void ImGui::DebugNodeViewport(ImGuiViewportP* viewport)
{
+ ImGuiContext& g = *GImGui;
SetNextItemOpen(true, ImGuiCond_Once);
- if (TreeNode("viewport0", "Viewport #%d", 0))
+ bool open = TreeNode("viewport0", "Viewport #%d", 0);
+ if (IsItemHovered())
+ g.DebugMetricsConfig.HighlightViewportID = viewport->ID;
+ if (open)
{
ImGuiWindowFlags flags = viewport->Flags;
- BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f",
+ BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Inset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f",
viewport->Pos.x, viewport->Pos.y, viewport->Size.x, viewport->Size.y,
- viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y);
+ viewport->WorkInsetMin.x, viewport->WorkInsetMin.y, viewport->WorkInsetMax.x, viewport->WorkInsetMax.y);
BulletText("Flags: 0x%04X =%s%s%s", viewport->Flags,
(flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "",
(flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "",
(flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : "");
- for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++)
- for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++)
- DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList");
+ for (ImDrawList* draw_list : viewport->DrawDataP.CmdLists)
+ DebugNodeDrawList(NULL, viewport, draw_list, "DrawList");
TreePop();
}
}
@@ -13793,33 +16473,46 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label)
if (window->MemoryCompacted)
TextDisabled("Note: some memory buffers have been compacted/freed.");
+ if (g.IO.ConfigDebugIsDebuggerPresent && DebugBreakButton("**DebugBreak**", "in Begin()"))
+ g.DebugBreakInWindow = window->ID;
+
ImGuiWindowFlags flags = window->Flags;
- DebugNodeDrawList(window, window->DrawList, "DrawList");
+ DebugNodeDrawList(window, window->Viewport, window->DrawList, "DrawList");
BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y);
BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags,
(flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "",
(flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "",
(flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : "");
+ if (flags & ImGuiWindowFlags_ChildWindow)
+ BulletText("ChildFlags: 0x%08X (%s%s%s%s..)", window->ChildFlags,
+ (window->ChildFlags & ImGuiChildFlags_Borders) ? "Borders " : "",
+ (window->ChildFlags & ImGuiChildFlags_ResizeX) ? "ResizeX " : "",
+ (window->ChildFlags & ImGuiChildFlags_ResizeY) ? "ResizeY " : "",
+ (window->ChildFlags & ImGuiChildFlags_NavFlattened) ? "NavFlattened " : "");
BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : "");
BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1);
BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems);
for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++)
{
ImRect r = window->NavRectRel[layer];
- if (r.Min.x >= r.Max.y && r.Min.y >= r.Max.y)
+ if (r.Min.x >= r.Max.x && r.Min.y >= r.Max.y)
BulletText("NavLastIds[%d]: 0x%08X", layer, window->NavLastIds[layer]);
else
BulletText("NavLastIds[%d]: 0x%08X at +(%.1f,%.1f)(%.1f,%.1f)", layer, window->NavLastIds[layer], r.Min.x, r.Min.y, r.Max.x, r.Max.y);
DebugLocateItemOnHover(window->NavLastIds[layer]);
}
+ const ImVec2* pr = window->NavPreferredScoringPosRel;
+ for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++)
+ BulletText("NavPreferredScoringPosRel[%d] = {%.1f,%.1f)", layer, (pr[layer].x == FLT_MAX ? -99999.0f : pr[layer].x), (pr[layer].y == FLT_MAX ? -99999.0f : pr[layer].y)); // Display as 99999.0f so it looks neater.
BulletText("NavLayersActiveMask: %X, NavLastChildNavWindow: %s", window->DC.NavLayersActiveMask, window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL");
- if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); }
- if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); }
- if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); }
+ if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); }
+ if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); }
+ if (window->ParentWindowForFocusRoute != NULL) { DebugNodeWindow(window->ParentWindowForFocusRoute, "ParentWindowForFocusRoute"); }
+ if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); }
if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size))
{
- for (int n = 0; n < window->ColumnsStorage.Size; n++)
- DebugNodeColumns(&window->ColumnsStorage[n]);
+ for (ImGuiOldColumns& columns : window->ColumnsStorage)
+ DebugNodeColumns(&columns);
TreePop();
}
DebugNodeStorage(&window->StateStorage, "Storage");
@@ -13828,8 +16521,12 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label)
void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings* settings)
{
+ if (settings->WantDelete)
+ BeginDisabled();
Text("0x%08X \"%s\" Pos (%d,%d) Size (%d,%d) Collapsed=%d",
settings->ID, settings->GetName(), settings->Pos.x, settings->Pos.y, settings->Size.x, settings->Size.y, settings->Collapsed);
+ if (settings->WantDelete)
+ EndDisabled();
}
void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label)
@@ -13879,17 +16576,62 @@ void ImGui::DebugLogV(const char* fmt, va_list args)
{
ImGuiContext& g = *GImGui;
const int old_size = g.DebugLogBuf.size();
- g.DebugLogBuf.appendf("[%05d] ", g.FrameCount);
+ if (g.ContextName[0] != 0)
+ g.DebugLogBuf.appendf("[%s] [%05d] ", g.ContextName, g.FrameCount);
+ else
+ g.DebugLogBuf.appendf("[%05d] ", g.FrameCount);
g.DebugLogBuf.appendfv(fmt, args);
+ g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size());
if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY)
IMGUI_DEBUG_PRINTF("%s", g.DebugLogBuf.begin() + old_size);
- g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size());
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ // IMGUI_TEST_ENGINE_LOG() adds a trailing \n automatically
+ const int new_size = g.DebugLogBuf.size();
+ const bool trailing_carriage_return = (g.DebugLogBuf[new_size - 1] == '\n');
+ if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTestEngine)
+ IMGUI_TEST_ENGINE_LOG("%.*s", new_size - old_size - (trailing_carriage_return ? 1 : 0), g.DebugLogBuf.begin() + old_size);
+#endif
+}
+
+// FIXME-LAYOUT: To be done automatically via layout mode once we rework ItemSize/ItemAdd into ItemLayout.
+static void SameLineOrWrap(const ImVec2& size)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImVec2 pos(window->DC.CursorPosPrevLine.x + g.Style.ItemSpacing.x, window->DC.CursorPosPrevLine.y);
+ if (window->WorkRect.Contains(ImRect(pos, pos + size)))
+ ImGui::SameLine();
+}
+
+static void ShowDebugLogFlag(const char* name, ImGuiDebugLogFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImVec2 size(ImGui::GetFrameHeight() + g.Style.ItemInnerSpacing.x + ImGui::CalcTextSize(name).x, ImGui::GetFrameHeight());
+ SameLineOrWrap(size); // FIXME-LAYOUT: To be done automatically once we rework ItemSize/ItemAdd into ItemLayout.
+
+ bool highlight_errors = (flags == ImGuiDebugLogFlags_EventError && g.DebugLogSkippedErrors > 0);
+ if (highlight_errors)
+ ImGui::PushStyleColor(ImGuiCol_Text, ImLerp(g.Style.Colors[ImGuiCol_Text], ImVec4(1.0f, 0.0f, 0.0f, 1.0f), 0.30f));
+ if (ImGui::CheckboxFlags(name, &g.DebugLogFlags, flags) && g.IO.KeyShift && (g.DebugLogFlags & flags) != 0)
+ {
+ g.DebugLogAutoDisableFrames = 2;
+ g.DebugLogAutoDisableFlags |= flags;
+ }
+ if (highlight_errors)
+ {
+ ImGui::PopStyleColor();
+ ImGui::SetItemTooltip("%d past errors skipped.", g.DebugLogSkippedErrors);
+ }
+ else
+ {
+ ImGui::SetItemTooltip("Hold SHIFT when clicking to enable for 2 frames only (useful for spammy log entries)");
+ }
}
void ImGui::ShowDebugLogWindow(bool* p_open)
{
ImGuiContext& g = *GImGui;
- if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize))
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSize) == 0)
SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 12.0f), ImGuiCond_FirstUseEver);
if (!Begin("Dear ImGui Debug Log", p_open) || GetCurrentWindow()->BeginCount > 1)
{
@@ -13897,49 +16639,57 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
return;
}
- AlignTextToFramePadding();
- Text("Log events:");
- SameLine(); CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_);
- SameLine(); CheckboxFlags("ActiveId", &g.DebugLogFlags, ImGuiDebugLogFlags_EventActiveId);
- SameLine(); CheckboxFlags("Focus", &g.DebugLogFlags, ImGuiDebugLogFlags_EventFocus);
- SameLine(); CheckboxFlags("Popup", &g.DebugLogFlags, ImGuiDebugLogFlags_EventPopup);
- SameLine(); CheckboxFlags("Nav", &g.DebugLogFlags, ImGuiDebugLogFlags_EventNav);
- SameLine(); CheckboxFlags("Clipper", &g.DebugLogFlags, ImGuiDebugLogFlags_EventClipper);
- SameLine(); CheckboxFlags("IO", &g.DebugLogFlags, ImGuiDebugLogFlags_EventIO);
+ ImGuiDebugLogFlags all_enable_flags = ImGuiDebugLogFlags_EventMask_ & ~ImGuiDebugLogFlags_EventInputRouting;
+ CheckboxFlags("All", &g.DebugLogFlags, all_enable_flags);
+ SetItemTooltip("(except InputRouting which is spammy)");
+
+ ShowDebugLogFlag("Errors", ImGuiDebugLogFlags_EventError);
+ ShowDebugLogFlag("ActiveId", ImGuiDebugLogFlags_EventActiveId);
+ ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
+ ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
+ ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO);
+ //ShowDebugLogFlag("Font", ImGuiDebugLogFlags_EventFont);
+ ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
+ ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
+ ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
+ ShowDebugLogFlag("InputRouting", ImGuiDebugLogFlags_EventInputRouting);
if (SmallButton("Clear"))
{
g.DebugLogBuf.clear();
g.DebugLogIndex.clear();
+ g.DebugLogSkippedErrors = 0;
}
SameLine();
if (SmallButton("Copy"))
SetClipboardText(g.DebugLogBuf.c_str());
- BeginChild("##log", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar);
+ SameLine();
+ if (SmallButton("Configure Outputs.."))
+ OpenPopup("Outputs");
+ if (BeginPopup("Outputs"))
+ {
+ CheckboxFlags("OutputToTTY", &g.DebugLogFlags, ImGuiDebugLogFlags_OutputToTTY);
+#ifndef IMGUI_ENABLE_TEST_ENGINE
+ BeginDisabled();
+#endif
+ CheckboxFlags("OutputToTestEngine", &g.DebugLogFlags, ImGuiDebugLogFlags_OutputToTestEngine);
+#ifndef IMGUI_ENABLE_TEST_ENGINE
+ EndDisabled();
+#endif
+ EndPopup();
+ }
+
+ BeginChild("##log", ImVec2(0.0f, 0.0f), ImGuiChildFlags_Borders, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar);
+
+ const ImGuiDebugLogFlags backup_log_flags = g.DebugLogFlags;
+ g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper;
ImGuiListClipper clipper;
clipper.Begin(g.DebugLogIndex.size());
while (clipper.Step())
for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
- {
- const char* line_begin = g.DebugLogIndex.get_line_begin(g.DebugLogBuf.c_str(), line_no);
- const char* line_end = g.DebugLogIndex.get_line_end(g.DebugLogBuf.c_str(), line_no);
- TextUnformatted(line_begin, line_end);
- ImRect text_rect = g.LastItemData.Rect;
- if (IsItemHovered())
- for (const char* p = line_begin; p < line_end - 10; p++)
- {
- ImGuiID id = 0;
- if (p[0] != '0' || (p[1] != 'x' && p[1] != 'X') || sscanf(p + 2, "%X", &id) != 1)
- continue;
- ImVec2 p0 = CalcTextSize(line_begin, p);
- ImVec2 p1 = CalcTextSize(p, p + 10);
- g.LastItemData.Rect = ImRect(text_rect.Min + ImVec2(p0.x, 0.0f), text_rect.Min + ImVec2(p0.x + p1.x, p1.y));
- if (IsMouseHoveringRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, true))
- DebugLocateItemOnHover(id);
- p += 10;
- }
- }
+ DebugTextUnformattedWithLocateItem(g.DebugLogIndex.get_line_begin(g.DebugLogBuf.c_str(), line_no), g.DebugLogIndex.get_line_end(g.DebugLogBuf.c_str(), line_no));
+ g.DebugLogFlags = backup_log_flags;
if (GetScrollY() >= GetScrollMaxY())
SetScrollHereY(1.0f);
EndChild();
@@ -13947,10 +16697,64 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
End();
}
+// Display line, search for 0xXXXXXXXX identifiers and call DebugLocateItemOnHover() when hovered.
+void ImGui::DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end)
+{
+ TextUnformatted(line_begin, line_end);
+ if (!IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
+ return;
+ ImGuiContext& g = *GImGui;
+ ImRect text_rect = g.LastItemData.Rect;
+ for (const char* p = line_begin; p <= line_end - 10; p++)
+ {
+ ImGuiID id = 0;
+ if (p[0] != '0' || (p[1] != 'x' && p[1] != 'X') || sscanf(p + 2, "%X", &id) != 1 || ImCharIsXdigitA(p[10]))
+ continue;
+ ImVec2 p0 = CalcTextSize(line_begin, p);
+ ImVec2 p1 = CalcTextSize(p, p + 10);
+ g.LastItemData.Rect = ImRect(text_rect.Min + ImVec2(p0.x, 0.0f), text_rect.Min + ImVec2(p0.x + p1.x, p1.y));
+ if (IsMouseHoveringRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, true))
+ DebugLocateItemOnHover(id);
+ p += 10;
+ }
+}
+
//-----------------------------------------------------------------------------
-// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL)
+// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, ID STACK TOOL)
//-----------------------------------------------------------------------------
+// Draw a small cross at current CursorPos in current window's DrawList
+void ImGui::DebugDrawCursorPos(ImU32 col)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImVec2 pos = window->DC.CursorPos;
+ window->DrawList->AddLine(ImVec2(pos.x, pos.y - 3.0f), ImVec2(pos.x, pos.y + 4.0f), col, 1.0f);
+ window->DrawList->AddLine(ImVec2(pos.x - 3.0f, pos.y), ImVec2(pos.x + 4.0f, pos.y), col, 1.0f);
+}
+
+// Draw a 10px wide rectangle around CurposPos.x using Line Y1/Y2 in current window's DrawList
+void ImGui::DebugDrawLineExtents(ImU32 col)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ float curr_x = window->DC.CursorPos.x;
+ float line_y1 = (window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y);
+ float line_y2 = line_y1 + (window->DC.IsSameLine ? window->DC.PrevLineSize.y : window->DC.CurrLineSize.y);
+ window->DrawList->AddLine(ImVec2(curr_x - 5.0f, line_y1), ImVec2(curr_x + 5.0f, line_y1), col, 1.0f);
+ window->DrawList->AddLine(ImVec2(curr_x - 0.5f, line_y1), ImVec2(curr_x - 0.5f, line_y2), col, 1.0f);
+ window->DrawList->AddLine(ImVec2(curr_x - 5.0f, line_y2), ImVec2(curr_x + 5.0f, line_y2), col, 1.0f);
+}
+
+// Draw last item rect in ForegroundDrawList (so it is always visible)
+void ImGui::DebugDrawItemRect(ImU32 col)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col);
+}
+
+// [DEBUG] Locate item position/rectangle given an ID.
static const ImU32 DEBUG_LOCATE_ITEM_COLOR = IM_COL32(0, 255, 0, 255); // Green
void ImGui::DebugLocateItem(ImGuiID target_id)
@@ -13958,8 +16762,10 @@ void ImGui::DebugLocateItem(ImGuiID target_id)
ImGuiContext& g = *GImGui;
g.DebugLocateId = target_id;
g.DebugLocateFrames = 2;
+ g.DebugBreakInLocateId = false;
}
+// FIXME: Doesn't work over through a modal window, because they clear HoveredWindow.
void ImGui::DebugLocateItemOnHover(ImGuiID target_id)
{
if (target_id == 0 || !IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenBlockedByPopup))
@@ -13967,11 +16773,24 @@ void ImGui::DebugLocateItemOnHover(ImGuiID target_id)
ImGuiContext& g = *GImGui;
DebugLocateItem(target_id);
GetForegroundDrawList(g.CurrentWindow)->AddRect(g.LastItemData.Rect.Min - ImVec2(3.0f, 3.0f), g.LastItemData.Rect.Max + ImVec2(3.0f, 3.0f), DEBUG_LOCATE_ITEM_COLOR);
+
+ // Can't easily use a context menu here because it will mess with focus, active id etc.
+ if (g.IO.ConfigDebugIsDebuggerPresent && g.MouseStationaryTimer > 1.0f)
+ {
+ DebugBreakButtonTooltip(false, "in ItemAdd()");
+ if (IsKeyChordPressed(g.DebugBreakKeyChord))
+ g.DebugBreakInLocateId = true;
+ }
}
void ImGui::DebugLocateItemResolveWithLastItem()
{
ImGuiContext& g = *GImGui;
+
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInLocateId)
+ IM_DEBUG_BREAK();
+
ImGuiLastItemData item_data = g.LastItemData;
g.DebugLocateId = 0;
ImDrawList* draw_list = GetForegroundDrawList(g.CurrentWindow);
@@ -13983,6 +16802,12 @@ void ImGui::DebugLocateItemResolveWithLastItem()
draw_list->AddLine(p1, p2, DEBUG_LOCATE_ITEM_COLOR);
}
+void ImGui::DebugStartItemPicker()
+{
+ ImGuiContext& g = *GImGui;
+ g.DebugItemPickerActive = true;
+}
+
// [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack.
void ImGui::UpdateDebugToolItemPicker()
{
@@ -14005,7 +16830,8 @@ void ImGui::UpdateDebugToolItemPicker()
if (change_mapping && IsMouseClicked(mouse_button))
g.DebugItemPickerMouseButton = (ImU8)mouse_button;
SetNextWindowBgAlpha(0.70f);
- BeginTooltip();
+ if (!BeginTooltip())
+ return;
Text("HoveredId: 0x%08X", hovered_id);
Text("Press ESC to abort picking.");
const char* mouse_button_names[] = { "Left", "Right", "Middle" };
@@ -14016,13 +16842,13 @@ void ImGui::UpdateDebugToolItemPicker()
EndTooltip();
}
-// [DEBUG] Stack Tool: update queries. Called by NewFrame()
+// [DEBUG] ID Stack Tool: update queries. Called by NewFrame()
void ImGui::UpdateDebugToolStackQueries()
{
ImGuiContext& g = *GImGui;
- ImGuiStackTool* tool = &g.DebugStackTool;
+ ImGuiIDStackTool* tool = &g.DebugIDStackTool;
- // Clear hook when stack tool is not visible
+ // Clear hook when id stack tool is not visible
g.DebugHookIdInfo = 0;
if (g.FrameCount != tool->LastActiveFrame + 1)
return;
@@ -14056,12 +16882,12 @@ void ImGui::UpdateDebugToolStackQueries()
}
}
-// [DEBUG] Stack tool: hooks called by GetID() family functions
+// [DEBUG] ID Stack tool: hooks called by GetID() family functions
void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- ImGuiStackTool* tool = &g.DebugStackTool;
+ ImGuiIDStackTool* tool = &g.DebugIDStackTool;
// Step 0: stack query
// This assumes that the ID was computed with the current ID stack, which tends to be the case for our widget.
@@ -14087,7 +16913,7 @@ void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* dat
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%d", (int)(intptr_t)data_id);
break;
case ImGuiDataType_String:
- ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%.*s", data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)strlen((const char*)data_id), (const char*)data_id);
+ ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%.*s", data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)ImStrlen((const char*)data_id), (const char*)data_id);
break;
case ImGuiDataType_Pointer:
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "(void*)0x%p", data_id);
@@ -14104,7 +16930,7 @@ void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* dat
info->DataType = data_type;
}
-static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size)
+static int StackToolFormatLevelInfo(ImGuiIDStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size)
{
ImGuiStackLevelInfo* info = &tool->Results[n];
ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL;
@@ -14121,56 +16947,58 @@ static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for
return ImFormatString(buf, buf_size, "???");
}
-// Stack Tool: Display UI
-void ImGui::ShowStackToolWindow(bool* p_open)
+// ID Stack Tool: Display UI
+void ImGui::ShowIDStackToolWindow(bool* p_open)
{
ImGuiContext& g = *GImGui;
- if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize))
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSize) == 0)
SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 8.0f), ImGuiCond_FirstUseEver);
- if (!Begin("Dear ImGui Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1)
+ if (!Begin("Dear ImGui ID Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1)
{
End();
return;
}
// Display hovered/active status
- ImGuiStackTool* tool = &g.DebugStackTool;
- const ImGuiID hovered_id = g.HoveredIdPreviousFrame;
- const ImGuiID active_id = g.ActiveId;
-#ifdef IMGUI_ENABLE_TEST_ENGINE
- Text("HoveredId: 0x%08X (\"%s\"), ActiveId: 0x%08X (\"%s\")", hovered_id, hovered_id ? ImGuiTestEngine_FindItemDebugLabel(&g, hovered_id) : "", active_id, active_id ? ImGuiTestEngine_FindItemDebugLabel(&g, active_id) : "");
-#else
- Text("HoveredId: 0x%08X, ActiveId: 0x%08X", hovered_id, active_id);
-#endif
+ ImGuiIDStackTool* tool = &g.DebugIDStackTool;
+
+ // Build and display path
+ tool->ResultPathBuf.resize(0);
+ for (int stack_n = 0; stack_n < tool->Results.Size; stack_n++)
+ {
+ char level_desc[256];
+ StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc));
+ tool->ResultPathBuf.append(stack_n == 0 ? "//" : "/");
+ for (int n = 0; level_desc[n]; n++)
+ {
+ if (level_desc[n] == '/')
+ tool->ResultPathBuf.append("\\");
+ tool->ResultPathBuf.append(level_desc + n, level_desc + n + 1);
+ }
+ }
+ Text("0x%08X", tool->QueryId);
SameLine();
MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details.");
// CTRL+C to copy path
const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime;
- Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC);
+ SameLine();
+ PushStyleVarY(ImGuiStyleVar_FramePadding, 0.0f); Checkbox("Ctrl+C: copy path", &tool->CopyToClipboardOnCtrlC); PopStyleVar();
SameLine();
TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*");
- if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiMod_Ctrl) && IsKeyPressed(ImGuiKey_C))
+ if (tool->CopyToClipboardOnCtrlC && Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused))
{
tool->CopyToClipboardLastTime = (float)g.Time;
- char* p = g.TempBuffer.Data;
- char* p_end = p + g.TempBuffer.Size;
- for (int stack_n = 0; stack_n < tool->Results.Size && p + 3 < p_end; stack_n++)
- {
- *p++ = '/';
- char level_desc[256];
- StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc));
- for (int n = 0; level_desc[n] && p + 2 < p_end; n++)
- {
- if (level_desc[n] == '/')
- *p++ = '\\';
- *p++ = level_desc[n];
- }
- }
- *p = '\0';
- SetClipboardText(g.TempBuffer.Data);
+ SetClipboardText(tool->ResultPathBuf.c_str());
}
+ Text("- Path \"%s\"", tool->ResultPathBuf.c_str());
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ Text("- Label \"%s\"", tool->QueryId ? ImGuiTestEngine_FindItemDebugLabel(&g, tool->QueryId) : "");
+#endif
+
+ Separator();
+
// Display decorated stack
tool->LastActiveFrame = g.FrameCount;
if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders))
@@ -14203,7 +17031,7 @@ void ImGui::ShowStackToolWindow(bool* p_open)
void ImGui::ShowMetricsWindow(bool*) {}
void ImGui::ShowFontAtlas(ImFontAtlas*) {}
void ImGui::DebugNodeColumns(ImGuiOldColumns*) {}
-void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {}
+void ImGui::DebugNodeDrawList(ImGuiWindow*, ImGuiViewportP*, const ImDrawList*, const char*) {}
void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {}
void ImGui::DebugNodeFont(ImFont*) {}
void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {}
@@ -14213,13 +17041,10 @@ void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings*) {}
void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>*, const char*) {}
void ImGui::DebugNodeViewport(ImGuiViewportP*) {}
-void ImGui::DebugLog(const char*, ...) {}
-void ImGui::DebugLogV(const char*, va_list) {}
void ImGui::ShowDebugLogWindow(bool*) {}
-void ImGui::ShowStackToolWindow(bool*) {}
+void ImGui::ShowIDStackToolWindow(bool*) {}
+void ImGui::DebugStartItemPicker() {}
void ImGui::DebugHookIdInfo(ImGuiID, ImGuiDataType, const void*, const void*) {}
-void ImGui::UpdateDebugToolItemPicker() {}
-void ImGui::UpdateDebugToolStackQueries() {}
#endif // #ifndef IMGUI_DISABLE_DEBUG_TOOLS
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui.h b/3rdparty/bgfx/3rdparty/dear-imgui/imgui.h
index a626c79f4b0..75750ae1090 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui.h
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui.h
@@ -1,29 +1,35 @@
-// dear imgui, v1.89.1 WIP
+// dear imgui, v1.91.9b
// (headers)
// Help:
-// - Read FAQ at http://dearimgui.org/faq
-// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
+// - See links below.
// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that.
-// Read imgui.cpp for details, links and comments.
+// - Read top of imgui.cpp for more details, links and comments.
+// - Add '#define IMGUI_DEFINE_MATH_OPERATORS' before including this file (or in imconfig.h) to access courtesy maths operators for ImVec2 and ImVec4.
// Resources:
-// - FAQ http://dearimgui.org/faq
-// - Homepage & latest https://github.com/ocornut/imgui
-// - Releases & changelog https://github.com/ocornut/imgui/releases
-// - Gallery https://github.com/ocornut/imgui/issues/5243 (please post your screenshots/video there!)
-// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there)
-// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
-// - Issues & support https://github.com/ocornut/imgui/issues
-
-// Getting Started?
-// - For first-time users having issues compiling/linking/running or issues loading fonts:
-// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
+// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md)
+// - Homepage ................... https://github.com/ocornut/imgui
+// - Releases & changelog ....... https://github.com/ocornut/imgui/releases
+// - Gallery .................... https://github.com/ocornut/imgui/issues?q=label%3Agallery (please post your screenshots/video there!)
+// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there)
+// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code)
+// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more)
+// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines)
+// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
+// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools
+// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui
+// - Issues & support ........... https://github.com/ocornut/imgui/issues
+// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps)
+
+// For first-time users having issues compiling/linking/running/loading fonts:
+// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
+// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there.
// Library Version
-// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM > 12345')
-#define IMGUI_VERSION "1.89.1 WIP"
-#define IMGUI_VERSION_NUM 18903
+// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
+#define IMGUI_VERSION "1.91.9b"
+#define IMGUI_VERSION_NUM 19191
#define IMGUI_HAS_TABLE
/*
@@ -31,17 +37,20 @@
Index of this file:
// [SECTION] Header mess
// [SECTION] Forward declarations and basic types
+// [SECTION] Texture identifier (ImTextureID)
// [SECTION] Dear ImGui end-user API functions
// [SECTION] Flags & Enumerations
-// [SECTION] Helpers: Memory allocations macros, ImVector<>
+// [SECTION] Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs)
+// [SECTION] Helpers: Debug log, Memory allocations macros, ImVector<>
// [SECTION] ImGuiStyle
// [SECTION] ImGuiIO
-// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs)
-// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)
+// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload)
+// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor)
+// [SECTION] Multi-Select API flags and structures (ImGuiMultiSelectFlags, ImGuiMultiSelectIO, ImGuiSelectionRequest, ImGuiSelectionBasicStorage, ImGuiSelectionExternalStorage)
// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData)
// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport)
-// [SECTION] Platform Dependent Interfaces (ImGuiPlatformImeData)
+// [SECTION] ImGuiPlatformIO + other Platform Dependent Interfaces (ImGuiPlatformImeData)
// [SECTION] Obsolete functions and types
*/
@@ -49,7 +58,7 @@ Index of this file:
#pragma once
// Configuration file with compile-time options
-// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system')
+// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system)
#ifdef IMGUI_USER_CONFIG
#include IMGUI_USER_CONFIG
#endif
@@ -69,7 +78,7 @@ Index of this file:
// Define attributes of all API symbols declarations (e.g. for DLL under Windows)
// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h)
-// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API)
+// Using dear imgui via a shared library is not recommended: we don't guarantee backward nor forward ABI compatibility + this is a call-heavy library and function call overhead adds up.
#ifndef IMGUI_API
#define IMGUI_API
#endif
@@ -84,10 +93,13 @@ Index of this file:
#endif
#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers!
#define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds.
-#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11
+
+// Check that version and structures layouts are matching between compiled imgui code and caller. Read comments above DebugCheckVersionAndDataLayout() for details.
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
// Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions.
+// (MSVC provides an equivalent mechanism via SAL Annotations but it would require the macros in a different
+// location. e.g. #include <sal.h> + void myprintf(_Printf_format_string_ const char* format, ...))
#if !defined(IMGUI_USE_STB_SPRINTF) && defined(__MINGW32__) && !defined(__clang__)
#define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1)))
#define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0)))
@@ -115,21 +127,39 @@ Index of this file:
#endif
#if defined(__clang__)
#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wold-style-cast"
-#if __has_warning("-Wzero-as-null-pointer-constant")
-#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+#if __has_warning("-Wunknown-warning-option")
+#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
+#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
+#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant
+#pragma clang diagnostic ignored "-Wreserved-identifier" // warning: identifier '_Xxx' is reserved because it starts with '_' followed by a capital letter
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
#elif defined(__GNUC__)
#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#endif
//-----------------------------------------------------------------------------
// [SECTION] Forward declarations and basic types
//-----------------------------------------------------------------------------
-// Forward declarations
+// Scalar data types
+typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string)
+typedef signed char ImS8; // 8-bit signed integer
+typedef unsigned char ImU8; // 8-bit unsigned integer
+typedef signed short ImS16; // 16-bit signed integer
+typedef unsigned short ImU16; // 16-bit unsigned integer
+typedef signed int ImS32; // 32-bit signed integer == int
+typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors)
+typedef signed long long ImS64; // 64-bit signed integer
+typedef unsigned long long ImU64; // 64-bit unsigned integer
+
+// Forward declarations: ImDrawList, ImFontAtlas layer
struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit()
struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback)
struct ImDrawData; // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix.
@@ -144,16 +174,24 @@ struct ImFontConfig; // Configuration data when adding a font or
struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset)
struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data
struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using)
+
+// Forward declarations: ImGui layer
struct ImGuiContext; // Dear ImGui context (opaque structure, unless including imgui_internal.h)
-struct ImGuiIO; // Main configuration and I/O between your application and ImGui
+struct ImGuiIO; // Main configuration and I/O between your application and ImGui (also see: ImGuiPlatformIO)
struct ImGuiInputTextCallbackData; // Shared state of InputText() when using custom ImGuiInputTextCallback (rare/advanced use)
struct ImGuiKeyData; // Storage for ImGuiIO and IsKeyDown(), IsKeyPressed() etc functions.
struct ImGuiListClipper; // Helper to manually clip large list of items
+struct ImGuiMultiSelectIO; // Structure to interact with a BeginMultiSelect()/EndMultiSelect() block
struct ImGuiOnceUponAFrame; // Helper for running a block of code not more than once a frame
struct ImGuiPayload; // User data payload for drag and drop operations
-struct ImGuiPlatformImeData; // Platform IME data for io.SetPlatformImeDataFn() function.
+struct ImGuiPlatformIO; // Interface between platform/renderer backends and ImGui (e.g. Clipboard, IME hooks). Extends ImGuiIO. In docking branch, this gets extended to support multi-viewports.
+struct ImGuiPlatformImeData; // Platform IME data for io.PlatformSetImeDataFn() function.
+struct ImGuiSelectionBasicStorage; // Optional helper to store multi-selection state + apply multi-selection requests.
+struct ImGuiSelectionExternalStorage;//Optional helper to apply multi-selection requests to existing randomly accessible storage.
+struct ImGuiSelectionRequest; // A selection request (stored in ImGuiMultiSelectIO)
struct ImGuiSizeCallbackData; // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use)
-struct ImGuiStorage; // Helper for key->value storage
+struct ImGuiStorage; // Helper for key->value storage (container sorted by key)
+struct ImGuiStoragePair; // Helper for key->value storage (pair)
struct ImGuiStyle; // Runtime data for styling/colors
struct ImGuiTableSortSpecs; // Sorting specifications for a table (often handling sort specs for a single column, occasionally more)
struct ImGuiTableColumnSortSpecs; // Sorting specification for one column of a table
@@ -164,37 +202,44 @@ struct ImGuiViewport; // A Platform Window (always only one in 'ma
// Enumerations
// - We don't use strongly typed enums much because they add constraints (can't extend in private code, can't store typed in bit fields, extra casting on iteration)
// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
-// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
-// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
+// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
+// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
+// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
+enum ImGuiDir : int; // -> enum ImGuiDir // Enum: A cardinal direction (Left, Right, Up, Down)
enum ImGuiKey : int; // -> enum ImGuiKey // Enum: A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value)
+enum ImGuiMouseSource : int; // -> enum ImGuiMouseSource // Enum; A mouse input source identifier (Mouse, TouchScreen, Pen)
+enum ImGuiSortDirection : ImU8; // -> enum ImGuiSortDirection // Enum: A sorting direction (ascending or descending)
typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling
typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions
typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type
-typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction
typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle)
typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor shape
-typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A sorting direction (ascending or descending)
typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling
typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor()
-// Flags (declared as int for compatibility with old C++, to allow using as flags without overhead, and to not pollute the top of this file)
+// Flags (declared as int to allow using as flags without overhead, and to not pollute the top of this file)
// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
-// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
-// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
+// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
+// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
+// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions
typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance
typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build
typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags
typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton()
+typedef int ImGuiChildFlags; // -> enum ImGuiChildFlags_ // Flags: for BeginChild()
typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc.
typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags
typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo()
typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload()
typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused()
typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc.
+typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for Shortcut(), SetNextItemShortcut()
typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline()
-typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for storage only for now: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values.
+typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), shared by all items
+typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for IsKeyChordPressed(), Shortcut() etc. an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values.
typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen()
+typedef int ImGuiMultiSelectFlags; // -> enum ImGuiMultiSelectFlags_// Flags: for BeginMultiSelect()
typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable()
typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc.
typedef int ImGuiTabBarFlags; // -> enum ImGuiTabBarFlags_ // Flags: for BeginTabBar()
@@ -206,41 +251,21 @@ typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: f
typedef int ImGuiViewportFlags; // -> enum ImGuiViewportFlags_ // Flags: for ImGuiViewport
typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin(), BeginChild()
-// ImTexture: user data for renderer backend to identify a texture [Compile-time configurable type]
-// - To use something else than an opaque void* pointer: override with e.g. '#define ImTextureID MyTextureType*' in your imconfig.h file.
-// - This can be whatever to you want it to be! read the FAQ about ImTextureID for details.
-#ifndef ImTextureID
-typedef void* ImTextureID; // Default: store a pointer or an integer fitting in a pointer (most renderer backends are ok with that)
-#endif
-
-// ImDrawIdx: vertex index. [Compile-time configurable type]
-// - To use 16-bit indices + allow large meshes: backend need to set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset (recommended).
-// - To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in your imconfig.h file.
-#ifndef ImDrawIdx
-typedef unsigned short ImDrawIdx; // Default: 16-bit (for maximum compatibility with renderer backends)
-#endif
-
-// Scalar data types
-typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string)
-typedef signed char ImS8; // 8-bit signed integer
-typedef unsigned char ImU8; // 8-bit unsigned integer
-typedef signed short ImS16; // 16-bit signed integer
-typedef unsigned short ImU16; // 16-bit unsigned integer
-typedef signed int ImS32; // 32-bit signed integer == int
-typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors)
-typedef signed long long ImS64; // 64-bit signed integer
-typedef unsigned long long ImU64; // 64-bit unsigned integer
-
// Character types
// (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display)
-typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings.
typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings.
+typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings.
#ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16]
typedef ImWchar32 ImWchar;
#else
typedef ImWchar16 ImWchar;
#endif
+// Multi-Selection item index or identifier when using BeginMultiSelect()
+// - Used by SetNextItemSelectionUserData() + and inside ImGuiMultiSelectIO structure.
+// - Most users are likely to use this store an item INDEX but this may be used to store a POINTER/ID as well. Read comments near ImGuiMultiSelectIO for details.
+typedef ImS64 ImGuiSelectionUserData;
+
// Callback and functions types
typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData* data); // Callback function for ImGui::InputText()
typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); // Callback function for ImGui::SetNextWindowSizeConstraints()
@@ -248,15 +273,16 @@ typedef void* (*ImGuiMemAllocFunc)(size_t sz, void* user_data);
typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // Function signature for ImGui::SetAllocatorFunctions()
// ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type]
-// This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type.
+// - This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type.
+// - Add '#define IMGUI_DEFINE_MATH_OPERATORS' before including this file (or in imconfig.h) to access courtesy maths operators for ImVec2 and ImVec4.
IM_MSVC_RUNTIME_CHECKS_OFF
struct ImVec2
{
float x, y;
constexpr ImVec2() : x(0.0f), y(0.0f) { }
constexpr ImVec2(float _x, float _y) : x(_x), y(_y) { }
- float operator[] (size_t idx) const { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine.
- float& operator[] (size_t idx) { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine.
+ float& operator[] (size_t idx) { IM_ASSERT(idx == 0 || idx == 1); return ((float*)(void*)(char*)this)[idx]; } // We very rarely use this [] operator, so the assert overhead is fine.
+ float operator[] (size_t idx) const { IM_ASSERT(idx == 0 || idx == 1); return ((const float*)(const void*)(const char*)this)[idx]; }
#ifdef IM_VEC2_CLASS_EXTRA
IM_VEC2_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2.
#endif
@@ -275,6 +301,19 @@ struct ImVec4
IM_MSVC_RUNTIME_CHECKS_RESTORE
//-----------------------------------------------------------------------------
+// [SECTION] Texture identifier (ImTextureID)
+//-----------------------------------------------------------------------------
+
+// ImTexture: user data for renderer backend to identify a texture [Compile-time configurable type]
+// - To use something else than an opaque void* pointer: override with e.g. '#define ImTextureID MyTextureType*' in your imconfig.h file.
+// - This can be whatever to you want it to be! read the FAQ about ImTextureID for details.
+// - You can make this a structure with various constructors if you need. You will have to implement ==/!= operators.
+// - (note: before v1.91.4 (2024/10/08) the default type for ImTextureID was void*. Use intermediary intptr_t cast and read FAQ if you have casting warnings)
+#ifndef ImTextureID
+typedef ImU64 ImTextureID; // Default: store a pointer or an integer fitting in a pointer (most renderer backends are ok with that)
+#endif
+
+//-----------------------------------------------------------------------------
// [SECTION] Dear ImGui end-user API functions
// (Note that ImGui:: being a namespace, you can add extra ImGui:: functions in your own separate file. Please don't modify imgui source files!)
//-----------------------------------------------------------------------------
@@ -291,8 +330,9 @@ namespace ImGui
IMGUI_API void SetCurrentContext(ImGuiContext* ctx);
// Main
- IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags)
- IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame!
+ IMGUI_API ImGuiIO& GetIO(); // access the ImGuiIO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags)
+ IMGUI_API ImGuiPlatformIO& GetPlatformIO(); // access the ImGuiPlatformIO structure (mostly hooks/functions to connect to platform/renderer and OS Clipboard, IME etc.)
+ IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleColor(), PushStyleVar() to modify style mid-frame!
IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame().
IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all!
IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData().
@@ -302,7 +342,7 @@ namespace ImGui
IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application!
IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc.
IMGUI_API void ShowDebugLogWindow(bool* p_open = NULL); // create Debug Log window. display a simplified log of important dear imgui events.
- IMGUI_API void ShowStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID.
+ IMGUI_API void ShowIDStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID.
IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information.
IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style)
IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles.
@@ -323,23 +363,33 @@ namespace ImGui
// Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin().
// - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting
// anything to the window. Always call a matching End() for each Begin() call, regardless of its return value!
- // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu,
- // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function
- // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
+ // [Important: due to legacy reason, Begin/End and BeginChild/EndChild are inconsistent with all other functions
+ // such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding
+ // BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
// - Note that the bottom of window stack always contains a window called "Debug".
IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
IMGUI_API void End();
// Child Windows
// - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child.
- // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400).
- // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window.
- // Always call a matching EndChild() for each BeginChild() call, regardless of its return value.
- // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu,
- // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function
- // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
- IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0);
- IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0);
+ // - Before 1.90 (November 2023), the "ImGuiChildFlags child_flags = 0" parameter was "bool border = false".
+ // This API is backward compatible with old code, as we guarantee that ImGuiChildFlags_Borders == true.
+ // Consider updating your old code:
+ // BeginChild("Name", size, false) -> Begin("Name", size, 0); or Begin("Name", size, ImGuiChildFlags_None);
+ // BeginChild("Name", size, true) -> Begin("Name", size, ImGuiChildFlags_Borders);
+ // - Manual sizing (each axis can use a different setting e.g. ImVec2(0.0f, 400.0f)):
+ // == 0.0f: use remaining parent window size for this axis.
+ // > 0.0f: use specified size for this axis.
+ // < 0.0f: right/bottom-align to specified distance from available content boundaries.
+ // - Specifying ImGuiChildFlags_AutoResizeX or ImGuiChildFlags_AutoResizeY makes the sizing automatic based on child contents.
+ // Combining both ImGuiChildFlags_AutoResizeX _and_ ImGuiChildFlags_AutoResizeY defeats purpose of a scrolling region and is NOT recommended.
+ // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting
+ // anything to the window. Always call a matching EndChild() for each BeginChild() call, regardless of its return value.
+ // [Important: due to legacy reason, Begin/End and BeginChild/EndChild are inconsistent with all other functions
+ // such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding
+ // BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
+ IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), ImGuiChildFlags child_flags = 0, ImGuiWindowFlags window_flags = 0);
+ IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), ImGuiChildFlags child_flags = 0, ImGuiWindowFlags window_flags = 0);
IMGUI_API void EndChild();
// Windows Utilities
@@ -347,18 +397,18 @@ namespace ImGui
IMGUI_API bool IsWindowAppearing();
IMGUI_API bool IsWindowCollapsed();
IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options.
- IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ!
+ IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered and hoverable (e.g. not blocked by a popup/modal)? See ImGuiHoveredFlags_ for options. IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details.
IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives
- IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API)
- IMGUI_API ImVec2 GetWindowSize(); // get current window size
- IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x)
- IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y)
+ IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (IT IS UNLIKELY YOU EVER NEED TO USE THIS. Consider always using GetCursorScreenPos() and GetContentRegionAvail() instead)
+ IMGUI_API ImVec2 GetWindowSize(); // get current window size (IT IS UNLIKELY YOU EVER NEED TO USE THIS. Consider always using GetCursorScreenPos() and GetContentRegionAvail() instead)
+ IMGUI_API float GetWindowWidth(); // get current window width (IT IS UNLIKELY YOU EVER NEED TO USE THIS). Shortcut for GetWindowSize().x.
+ IMGUI_API float GetWindowHeight(); // get current window height (IT IS UNLIKELY YOU EVER NEED TO USE THIS). Shortcut for GetWindowSize().y.
// Window manipulation
// - Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin).
IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc.
IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin()
- IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints.
+ IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use 0.0f or FLT_MAX if you don't want limits. Use -1 for both min and max of same axis to preserve current size (which itself is a constraint). Use callback to apply non-trivial programmatic constraints.
IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin()
IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin()
IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin()
@@ -374,14 +424,6 @@ namespace ImGui
IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state
IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / top-most. use NULL to remove focus.
- // Content region
- // - Retrieve available space from a given point. GetContentRegionAvail() is frequently useful.
- // - Those functions are bound to be redesigned (they are confusing, incomplete and the Min/Max return values are in local window coordinates which increases confusion)
- IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos()
- IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
- IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min for the full window (roughly (0,0)-Scroll), in window coordinates
- IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max for the full window (roughly (0,0)+Size-Scroll) where Size can be overridden with SetNextWindowContentSize(), in window coordinates
-
// Windows Scrolling
// - Any change of Scroll will be applied at the beginning of next frame in the first call to Begin().
// - You may instead use SetNextWindowScroll() prior to calling Begin() to avoid this delay, as an alternative to using SetScrollX()/SetScrollY().
@@ -402,13 +444,13 @@ namespace ImGui
IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); // modify a style color. always use this if you modify the style after NewFrame().
IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4& col);
IMGUI_API void PopStyleColor(int count = 1);
- IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); // modify a style float variable. always use this if you modify the style after NewFrame().
- IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); // modify a style ImVec2 variable. always use this if you modify the style after NewFrame().
+ IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); // modify a style float variable. always use this if you modify the style after NewFrame()!
+ IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); // modify a style ImVec2 variable. "
+ IMGUI_API void PushStyleVarX(ImGuiStyleVar idx, float val_x); // modify X component of a style ImVec2 variable. "
+ IMGUI_API void PushStyleVarY(ImGuiStyleVar idx, float val_y); // modify Y component of a style ImVec2 variable. "
IMGUI_API void PopStyleVar(int count = 1);
- IMGUI_API void PushAllowKeyboardFocus(bool allow_keyboard_focus); // == tab stop enable. Allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets
- IMGUI_API void PopAllowKeyboardFocus();
- IMGUI_API void PushButtonRepeat(bool repeat); // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame.
- IMGUI_API void PopButtonRepeat();
+ IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); // modify specified shared item flag, e.g. PushItemFlag(ImGuiItemFlags_NoTabStop, true)
+ IMGUI_API void PopItemFlag();
// Parameters stacks (current window)
IMGUI_API void PushItemWidth(float item_width); // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side).
@@ -419,22 +461,37 @@ namespace ImGui
IMGUI_API void PopTextWrapPos();
// Style read access
- // - Use the style editor (ShowStyleEditor() function) to interactively see what the colors are)
+ // - Use the ShowStyleEditor() function to interactively see/edit the colors.
IMGUI_API ImFont* GetFont(); // get current font
IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied
- IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API
+ IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a white pixel, useful to draw custom shapes via the ImDrawList API
IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList
IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList
- IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList
+ IMGUI_API ImU32 GetColorU32(ImU32 col, float alpha_mul = 1.0f); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList
IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in.
- // Cursor / Layout
+ // Layout cursor positioning
// - By "cursor" we mean the current output position.
// - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down.
// - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget.
+ // - YOU CAN DO 99% OF WHAT YOU NEED WITH ONLY GetCursorScreenPos() and GetContentRegionAvail().
// - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API:
- // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos()
- // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions.
+ // - Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. -> this is the preferred way forward.
+ // - Window-local coordinates: SameLine(offset), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), PushTextWrapPos()
+ // - Window-local coordinates: GetContentRegionMax(), GetWindowContentRegionMin(), GetWindowContentRegionMax() --> all obsoleted. YOU DON'T NEED THEM.
+ // - GetCursorScreenPos() = GetCursorPos() + GetWindowPos(). GetWindowPos() is almost only ever useful to convert from window-local to absolute coordinates. Try not to use it.
+ IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position, absolute coordinates. THIS IS YOUR BEST FRIEND (prefer using this rather than GetCursorPos(), also more useful to work with ImDrawList API).
+ IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position, absolute coordinates. THIS IS YOUR BEST FRIEND.
+ IMGUI_API ImVec2 GetContentRegionAvail(); // available space from current position. THIS IS YOUR BEST FRIEND.
+ IMGUI_API ImVec2 GetCursorPos(); // [window-local] cursor position in window-local coordinates. This is not your best friend.
+ IMGUI_API float GetCursorPosX(); // [window-local] "
+ IMGUI_API float GetCursorPosY(); // [window-local] "
+ IMGUI_API void SetCursorPos(const ImVec2& local_pos); // [window-local] "
+ IMGUI_API void SetCursorPosX(float local_x); // [window-local] "
+ IMGUI_API void SetCursorPosY(float local_y); // [window-local] "
+ IMGUI_API ImVec2 GetCursorStartPos(); // [window-local] initial cursor position, in window-local coordinates. Call GetCursorScreenPos() after Begin() to get the absolute coordinates version.
+
+ // Other layout functions
IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator.
IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates.
IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in a horizontal-layout context.
@@ -444,15 +501,6 @@ namespace ImGui
IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0
IMGUI_API void BeginGroup(); // lock horizontal starting position
IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
- IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position)
- IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc.
- IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList::
- IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system.
- IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.)
- IMGUI_API void SetCursorPosY(float local_y); //
- IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates
- IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode.
- IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates
IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item)
IMGUI_API float GetTextLineHeight(); // ~ FontSize
IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text)
@@ -460,7 +508,7 @@ namespace ImGui
IMGUI_API float GetFrameHeightWithSpacing(); // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets)
// ID stack/scopes
- // Read the FAQ (docs/FAQ.md or http://dearimgui.org/faq) for more details about how ID are handled in dear imgui.
+ // Read the FAQ (docs/FAQ.md or http://dearimgui.com/faq) for more details about how ID are handled in dear imgui.
// - Those questions are answered and impacted by understanding of the ID stack system:
// - "Q: Why is my widget not reacting when I click on it?"
// - "Q: How can I have widgets with an empty label?"
@@ -478,6 +526,7 @@ namespace ImGui
IMGUI_API ImGuiID GetID(const char* str_id); // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself
IMGUI_API ImGuiID GetID(const char* str_id_begin, const char* str_id_end);
IMGUI_API ImGuiID GetID(const void* ptr_id);
+ IMGUI_API ImGuiID GetID(int int_id);
// Widgets: Text
IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
@@ -493,12 +542,13 @@ namespace ImGui
IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args) IM_FMTLIST(2);
IMGUI_API void BulletText(const char* fmt, ...) IM_FMTARGS(1); // shortcut for Bullet()+Text()
IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1);
+ IMGUI_API void SeparatorText(const char* label); // currently: formatted text with a horizontal line
// Widgets: Main
// - Most widgets return true when the value has been changed or when pressed/selected
// - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state.
IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button
- IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text
+ IMGUI_API bool SmallButton(const char* label); // button with (FramePadding.y == 0) to easily embed within text
IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.)
IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape
IMGUI_API bool Checkbox(const char* label, bool* v);
@@ -508,11 +558,17 @@ namespace ImGui
IMGUI_API bool RadioButton(const char* label, int* v, int v_button); // shortcut to handle the above pattern when value is an integer
IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-FLT_MIN, 0), const char* overlay = NULL);
IMGUI_API void Bullet(); // draw a small circle + keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses
+ IMGUI_API bool TextLink(const char* label); // hyperlink text button, return true when clicked
+ IMGUI_API void TextLinkOpenURL(const char* label, const char* url = NULL); // hyperlink text button, automatically open file/url when clicked
// Widgets: Images
// - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples
- IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0));
- IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1));
+ // - 'uv0' and 'uv1' are texture coordinates. Read about them from the same link above.
+ // - Image() pads adds style.ImageBorderSize on each side, ImageButton() adds style.FramePadding on each side.
+ // - ImageButton() draws a background based on regular Button() color + optionally an inner background if specified.
+ IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1));
+ IMGUI_API void ImageWithBg(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1));
+ IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1));
// Widgets: Combo Box (Dropdown)
// - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items.
@@ -521,7 +577,7 @@ namespace ImGui
IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true!
IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1);
IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0"
- IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1);
+ IMGUI_API bool Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items = -1);
// Widgets: Drag Sliders
// - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp.
@@ -529,7 +585,7 @@ namespace ImGui
// the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x
// - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
// - Format string may also be set to NULL or use the default format ("%f" or "%d").
- // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
+ // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For keyboard/gamepad navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
// - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits if ImGuiSliderFlags_AlwaysClamp is not used.
// - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum.
// - We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.
@@ -609,13 +665,14 @@ namespace ImGui
IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);
IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);
IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);
- IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired.
+ IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushID(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired.
IMGUI_API void TreePush(const void* ptr_id); // "
- IMGUI_API void TreePop(); // ~ Unindent()+PopId()
+ IMGUI_API void TreePop(); // ~ Unindent()+PopID()
IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode
IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop().
IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header.
IMGUI_API void SetNextItemOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state.
+ IMGUI_API void SetNextItemStorageID(ImGuiID storage_id); // set id to use for open/close storage (default to same as item id).
// Widgets: Selectables
// - A selectable highlights when hovered, and can display another color when selected.
@@ -623,23 +680,36 @@ namespace ImGui
IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper.
+ // Multi-selection system for Selectable(), Checkbox(), TreeNode() functions [BETA]
+ // - This enables standard multi-selection/range-selection idioms (CTRL+Mouse/Keyboard, SHIFT+Mouse/Keyboard, etc.) in a way that also allow a clipper to be used.
+ // - ImGuiSelectionUserData is often used to store your item index within the current view (but may store something else).
+ // - Read comments near ImGuiMultiSelectIO for instructions/details and see 'Demo->Widgets->Selection State & Multi-Select' for demo.
+ // - TreeNode() is technically supported but... using this correctly is more complicated. You need some sort of linear/random access to your tree,
+ // which is suited to advanced trees setups already implementing filters and clipper. We will work simplifying the current demo.
+ // - 'selection_size' and 'items_count' parameters are optional and used by a few features. If they are costly for you to compute, you may avoid them.
+ IMGUI_API ImGuiMultiSelectIO* BeginMultiSelect(ImGuiMultiSelectFlags flags, int selection_size = -1, int items_count = -1);
+ IMGUI_API ImGuiMultiSelectIO* EndMultiSelect();
+ IMGUI_API void SetNextItemSelectionUserData(ImGuiSelectionUserData selection_user_data);
+ IMGUI_API bool IsItemToggledSelection(); // Was the last item selection state toggled? Useful if you need the per-item information _before_ reaching EndMultiSelect(). We only returns toggle _event_ in order to handle clipping correctly.
+
// Widgets: List Boxes
- // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes.
- // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items.
+ // - This is essentially a thin wrapper to using BeginChild/EndChild with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label.
+ // - If you don't need a label you can probably simply use BeginChild() with the ImGuiChildFlags_FrameStyle flag for the same result.
+ // - You can submit contents and manage your selection state however you want it, by creating e.g. Selectable() or any other items.
// - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created.
// - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth
// - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items
IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region
IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true!
IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1);
- IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
+ IMGUI_API bool ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items = -1);
// Widgets: Data Plotting
// - Consider using ImPlot (https://github.com/epezent/implot) which is much better!
IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
- IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
+ IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
// Widgets: Value() Helpers.
// - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)
@@ -663,12 +733,22 @@ namespace ImGui
IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL
// Tooltips
- // - Tooltip are windows following the mouse. They do not take focus away.
- IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items).
- IMGUI_API void EndTooltip();
- IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip().
+ // - Tooltips are windows following the mouse. They do not take focus away.
+ // - A tooltip window can contain items of any types.
+ // - SetTooltip() is more or less a shortcut for the 'if (BeginTooltip()) { Text(...); EndTooltip(); }' idiom (with a subtlety that it discard any previously submitted tooltip)
+ IMGUI_API bool BeginTooltip(); // begin/append a tooltip window.
+ IMGUI_API void EndTooltip(); // only call EndTooltip() if BeginTooltip()/BeginItemTooltip() returns true!
+ IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip. Often used after a ImGui::IsItemHovered() check. Override any previous call to SetTooltip().
IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);
+ // Tooltips: helpers for showing a tooltip when hovering an item
+ // - BeginItemTooltip() is a shortcut for the 'if (IsItemHovered(ImGuiHoveredFlags_ForTooltip) && BeginTooltip())' idiom.
+ // - SetItemTooltip() is a shortcut for the 'if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) { SetTooltip(...); }' idiom.
+ // - Where 'ImGuiHoveredFlags_ForTooltip' itself is a shortcut to use 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' depending on active input type. For mouse it defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'.
+ IMGUI_API bool BeginItemTooltip(); // begin/append a tooltip window if preceding item was hovered.
+ IMGUI_API void SetItemTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip if preceding item was hovered. override any previous call to SetTooltip().
+ IMGUI_API void SetItemTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);
+
// Popups, Modals
// - They block normal mouse hovering detection (and therefore most mouse interactions) behind them.
// - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
@@ -677,9 +757,7 @@ namespace ImGui
// - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered().
// - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack.
// This is sometimes leading to confusing mistakes. May rework this in the future.
-
- // Popups: begin/end functions
- // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window.
+ // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards if returned true. ImGuiWindowFlags are forwarded to the window.
// - BeginPopupModal(): block every interaction behind the window, cannot be closed by user, add a dimming background, has a title bar.
IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it.
IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it.
@@ -729,14 +807,12 @@ namespace ImGui
// TableNextColumn() will automatically wrap-around into the next row if needed.
// - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column!
// - Summary of possible call flow:
- // --------------------------------------------------------------------------------------------------------
- // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK
- // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK
- // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row!
- // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear!
- // --------------------------------------------------------------------------------------------------------
+ // - TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK
+ // - TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK
+ // - TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row!
+ // - TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear!
// - 5. Call EndTable()
- IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f);
+ IMGUI_API bool BeginTable(const char* str_id, int columns, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f);
IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true!
IMGUI_API void TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row.
IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return true when column is visible.
@@ -752,8 +828,9 @@ namespace ImGui
// - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled.
IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0);
IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled.
- IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu
IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used)
+ IMGUI_API void TableHeadersRow(); // submit a row with headers cells based on data provided to TableSetupColumn() + submit context menu
+ IMGUI_API void TableAngledHeadersRow(); // submit a row with angled headers for every column with the ImGuiTableColumnFlags_AngledHeader flag. MUST BE FIRST ROW.
// Tables: Sorting & Miscellaneous functions
// - Sorting: call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting.
@@ -768,11 +845,12 @@ namespace ImGui
IMGUI_API const char* TableGetColumnName(int column_n = -1); // return "" if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column.
IMGUI_API ImGuiTableColumnFlags TableGetColumnFlags(int column_n = -1); // return column flags so you can query their Enabled/Visible/Sorted/Hovered status flags. Pass -1 to use current column.
IMGUI_API void TableSetColumnEnabled(int column_n, bool v);// change user accessible enabled/disabled state of a column. Set to false to hide the column. User can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody)
+ IMGUI_API int TableGetHoveredColumn(); // return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. Can also use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead.
IMGUI_API void TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n = -1); // change the color of a cell, row, or column. See ImGuiTableBgTarget_ flags for details.
// Legacy Columns API (prefer using Tables!)
// - You can also use SameLine(pos_x) to mimic simplified columns.
- IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true);
+ IMGUI_API void Columns(int count = 1, const char* id = NULL, bool borders = true);
IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished
IMGUI_API int GetColumnIndex(); // get current column index
IMGUI_API float GetColumnWidth(int column_index = -1); // get column width (in pixels). pass -1 to use current column
@@ -782,6 +860,7 @@ namespace ImGui
IMGUI_API int GetColumnsCount();
// Tab Bars, Tabs
+ // - Note: Tabs are automatically created by the docking system (when in 'docking' branch). Use this to create tab bars/tabs yourself.
IMGUI_API bool BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0); // create and append into a TabBar
IMGUI_API void EndTabBar(); // only call EndTabBar() if BeginTabBar() returns true!
IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0); // create a Tab. Returns true if the Tab is selected.
@@ -810,12 +889,13 @@ namespace ImGui
IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget()
IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released.
IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true!
- IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type.
+ IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. returns NULL when drag and drop is finished or inactive. use ImGuiPayload::IsDataType() to test for the payload type.
// Disabling [BETA API]
// - Disable all user interactions and dim items visuals (applying style.DisabledAlpha over current colors)
// - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled)
- // - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it.
+ // - Tooltips windows by exception are opted out of disabling.
+ // - BeginDisabled(false)/EndDisabled() essentially does nothing but is provided to facilitate use of boolean expressions (as a micro-optimization: if you have tens of thousands of BeginDisabled(false)/EndDisabled() pairs, you might want to reformulate your code to avoid making those calls)
IMGUI_API void BeginDisabled(bool disabled = true);
IMGUI_API void EndDisabled();
@@ -825,10 +905,15 @@ namespace ImGui
IMGUI_API void PopClipRect();
// Focus, Activation
- // - Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item"
- IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window.
+ IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a newly appearing window.
IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget.
+ // Keyboard/Gamepad Navigation
+ IMGUI_API void SetNavCursorVisible(bool visible); // alter visibility of keyboard/gamepad cursor. by default: show when using an arrow key, hide when clicking with mouse.
+
+ // Overlapping mode
+ IMGUI_API void SetNextItemAllowOverlap(); // allow next item to be overlapped by a subsequent item. Useful with invisible buttons, selectable, treenode covering an area where subsequent items may need to be added. Note that both Selectable() and TreeNode() have dedicated flags doing this.
+
// Item/Widgets Utilities and Query Functions
// - Most of the functions are referring to the previous Item that has been submitted.
// - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions.
@@ -845,10 +930,10 @@ namespace ImGui
IMGUI_API bool IsAnyItemHovered(); // is any item hovered?
IMGUI_API bool IsAnyItemActive(); // is any item active?
IMGUI_API bool IsAnyItemFocused(); // is any item focused?
+ IMGUI_API ImGuiID GetItemID(); // get ID of last item (~~ often same ImGui::GetID(label) beforehand)
IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space)
IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space)
IMGUI_API ImVec2 GetItemRectSize(); // get size of last item
- IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.
// Viewports
// - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows.
@@ -869,8 +954,6 @@ namespace ImGui
IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.).
IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it)
IMGUI_API ImGuiStorage* GetStateStorage();
- IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame
- IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window)
// Text Utilities
IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f);
@@ -881,19 +964,44 @@ namespace ImGui
IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v);
IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b);
- // Inputs Utilities: Keyboard
- // Without IMGUI_DISABLE_OBSOLETE_KEYIO: (legacy support)
- // - For 'ImGuiKey key' you can still use your legacy native/user indices according to how your backend/engine stored them in io.KeysDown[].
- // With IMGUI_DISABLE_OBSOLETE_KEYIO: (this is the way forward)
- // - Any use of 'ImGuiKey' will assert when key < 512 will be passed, previously reserved as native/user keys indices
- // - GetKeyIndex() is pass-through and therefore deprecated (gone if IMGUI_DISABLE_OBSOLETE_KEYIO is defined)
+ // Inputs Utilities: Keyboard/Mouse/Gamepad
+ // - the ImGuiKey enum contains all possible keyboard, mouse and gamepad inputs (e.g. ImGuiKey_A, ImGuiKey_MouseLeft, ImGuiKey_GamepadDpadUp...).
+ // - (legacy: before v1.87, we used ImGuiKey to carry native/user indices as defined by each backends. This was obsoleted in 1.87 (2022-02) and completely removed in 1.91.5 (2024-11). See https://github.com/ocornut/imgui/issues/4921)
+ // - (legacy: any use of ImGuiKey will assert when key < 512 to detect passing legacy native/user indices)
IMGUI_API bool IsKeyDown(ImGuiKey key); // is key being held.
IMGUI_API bool IsKeyPressed(ImGuiKey key, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate
IMGUI_API bool IsKeyReleased(ImGuiKey key); // was key released (went from Down to !Down)?
+ IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord); // was key chord (mods + key) pressed, e.g. you can pass 'ImGuiMod_Ctrl | ImGuiKey_S' as a key-chord. This doesn't do any routing or focus check, please consider using Shortcut() function instead.
IMGUI_API int GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate
- IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names a provided for debugging purpose and are not meant to be saved persistently not compared.
+ IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names are provided for debugging purpose and are not meant to be saved persistently nor compared.
IMGUI_API void SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard); // Override io.WantCaptureKeyboard flag next frame (said flag is left for your application to handle, typically when true it instructs your app to ignore inputs). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard"; after the next NewFrame() call.
+ // Inputs Utilities: Shortcut Testing & Routing [BETA]
+ // - ImGuiKeyChord = a ImGuiKey + optional ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super.
+ // ImGuiKey_C // Accepted by functions taking ImGuiKey or ImGuiKeyChord arguments)
+ // ImGuiMod_Ctrl | ImGuiKey_C // Accepted by functions taking ImGuiKeyChord arguments)
+ // only ImGuiMod_XXX values are legal to combine with an ImGuiKey. You CANNOT combine two ImGuiKey values.
+ // - The general idea is that several callers may register interest in a shortcut, and only one owner gets it.
+ // Parent -> call Shortcut(Ctrl+S) // When Parent is focused, Parent gets the shortcut.
+ // Child1 -> call Shortcut(Ctrl+S) // When Child1 is focused, Child1 gets the shortcut (Child1 overrides Parent shortcuts)
+ // Child2 -> no call // When Child2 is focused, Parent gets the shortcut.
+ // The whole system is order independent, so if Child1 makes its calls before Parent, results will be identical.
+ // This is an important property as it facilitate working with foreign code or larger codebase.
+ // - To understand the difference:
+ // - IsKeyChordPressed() compares mods and call IsKeyPressed() -> function has no side-effect.
+ // - Shortcut() submits a route, routes are resolved, if it currently can be routed it calls IsKeyChordPressed() -> function has (desirable) side-effects as it can prevents another call from getting the route.
+ // - Visualize registered routes in 'Metrics/Debugger->Inputs'.
+ IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0);
+ IMGUI_API void SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0);
+
+ // Inputs Utilities: Key/Input Ownership [BETA]
+ // - One common use case would be to allow your items to disable standard inputs behaviors such
+ // as Tab or Alt key handling, Mouse Wheel scrolling, etc.
+ // e.g. Button(...); SetItemKeyOwner(ImGuiKey_MouseWheelY); to make hovering/activating a button disable wheel for scrolling.
+ // - Reminder ImGuiKey enum include access to mouse buttons and gamepad, so key ownership can apply to them.
+ // - Many related features are still in imgui_internal.h. For instance, most IsKeyXXX()/IsMouseXXX() functions have an owner-id-aware version.
+ IMGUI_API void SetItemKeyOwner(ImGuiKey key); // Set key owner to last item ID if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
+
// Inputs Utilities: Mouse
// - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
// - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle.
@@ -902,14 +1010,15 @@ namespace ImGui
IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, bool repeat = false); // did mouse button clicked? (went from !Down to Down). Same as GetMouseClickedCount() == 1.
IMGUI_API bool IsMouseReleased(ImGuiMouseButton button); // did mouse button released? (went from Down to !Down)
IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button); // did mouse button double-clicked? Same as GetMouseClickedCount() == 2. (note that a double-click will also report IsMouseClicked() == true)
+ IMGUI_API bool IsMouseReleasedWithDelay(ImGuiMouseButton button, float delay); // delayed mouse release (use very sparingly!). Generally used with 'delay >= io.MouseDoubleClickTime' + combined with a 'io.MouseClickedLastCount==1' test. This is a very rarely used UI idiom, but some apps use this: e.g. MS Explorer single click on an icon to rename.
IMGUI_API int GetMouseClickedCount(ImGuiMouseButton button); // return the number of successive mouse-clicks at the time where a click happen (otherwise 0).
IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block.
IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available
IMGUI_API bool IsAnyMouseDown(); // [WILL OBSOLETE] is any mouse button held? This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid.
IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves)
- IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold)
- IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold)
+ IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (uses io.MouseDraggingThreshold if lock_threshold < 0.0f)
+ IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (uses io.MouseDraggingThreshold if lock_threshold < 0.0f)
IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); //
IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired mouse cursor shape. Important: reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired mouse cursor shape
@@ -930,8 +1039,15 @@ namespace ImGui
IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings.
// Debug Utilities
+ // - Your main debugging friend is the ShowMetricsWindow() function, which is also accessible from Demo->Tools->Metrics Debugger
IMGUI_API void DebugTextEncoding(const char* text);
+ IMGUI_API void DebugFlashStyleColor(ImGuiCol idx);
+ IMGUI_API void DebugStartItemPicker();
IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro.
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1); // Call via IMGUI_DEBUG_LOG() for maximum stripping in caller code!
+ IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1);
+#endif
// Memory Allocators
// - Those functions are not reliant on the current context.
@@ -969,54 +1085,109 @@ enum ImGuiWindowFlags_
ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus)
ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y)
ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x)
- ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)
- ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window
- ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB)
- ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar.
+ ImGuiWindowFlags_NoNavInputs = 1 << 16, // No keyboard/gamepad navigation within the window
+ ImGuiWindowFlags_NoNavFocus = 1 << 17, // No focusing toward this window with keyboard/gamepad navigation (e.g. skipped by CTRL+TAB)
+ ImGuiWindowFlags_UnsavedDocument = 1 << 18, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar.
ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse,
ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
// [Internal]
- ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows.
ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild()
ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip()
ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup()
ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal()
ImGuiWindowFlags_ChildMenu = 1 << 28, // Don't use! For internal use by BeginMenu()
+
+ // Obsolete names
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiWindowFlags_NavFlattened = 1 << 29, // Obsoleted in 1.90.9: Use ImGuiChildFlags_NavFlattened in BeginChild() call.
+ ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 30, // Obsoleted in 1.90.0: Use ImGuiChildFlags_AlwaysUseWindowPadding in BeginChild() call.
+#endif
+};
+
+// Flags for ImGui::BeginChild()
+// (Legacy: bit 0 must always correspond to ImGuiChildFlags_Borders to be backward compatible with old API using 'bool border = false'.
+// About using AutoResizeX/AutoResizeY flags:
+// - May be combined with SetNextWindowSizeConstraints() to set a min/max size for each axis (see "Demo->Child->Auto-resize with Constraints").
+// - Size measurement for a given axis is only performed when the child window is within visible boundaries, or is just appearing.
+// - This allows BeginChild() to return false when not within boundaries (e.g. when scrolling), which is more optimal. BUT it won't update its auto-size while clipped.
+// While not perfect, it is a better default behavior as the always-on performance gain is more valuable than the occasional "resizing after becoming visible again" glitch.
+// - You may also use ImGuiChildFlags_AlwaysAutoResize to force an update even when child window is not in view.
+// HOWEVER PLEASE UNDERSTAND THAT DOING SO WILL PREVENT BeginChild() FROM EVER RETURNING FALSE, disabling benefits of coarse clipping.
+enum ImGuiChildFlags_
+{
+ ImGuiChildFlags_None = 0,
+ ImGuiChildFlags_Borders = 1 << 0, // Show an outer border and enable WindowPadding. (IMPORTANT: this is always == 1 == true for legacy reason)
+ ImGuiChildFlags_AlwaysUseWindowPadding = 1 << 1, // Pad with style.WindowPadding even if no border are drawn (no padding by default for non-bordered child windows because it makes more sense)
+ ImGuiChildFlags_ResizeX = 1 << 2, // Allow resize from right border (layout direction). Enable .ini saving (unless ImGuiWindowFlags_NoSavedSettings passed to window flags)
+ ImGuiChildFlags_ResizeY = 1 << 3, // Allow resize from bottom border (layout direction). "
+ ImGuiChildFlags_AutoResizeX = 1 << 4, // Enable auto-resizing width. Read "IMPORTANT: Size measurement" details above.
+ ImGuiChildFlags_AutoResizeY = 1 << 5, // Enable auto-resizing height. Read "IMPORTANT: Size measurement" details above.
+ ImGuiChildFlags_AlwaysAutoResize = 1 << 6, // Combined with AutoResizeX/AutoResizeY. Always measure size even when child is hidden, always return true, always disable clipping optimization! NOT RECOMMENDED.
+ ImGuiChildFlags_FrameStyle = 1 << 7, // Style the child window like a framed item: use FrameBg, FrameRounding, FrameBorderSize, FramePadding instead of ChildBg, ChildRounding, ChildBorderSize, WindowPadding.
+ ImGuiChildFlags_NavFlattened = 1 << 8, // [BETA] Share focus scope, allow keyboard/gamepad navigation to cross over parent border to this child or between sibling child windows.
+
+ // Obsolete names
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiChildFlags_Border = ImGuiChildFlags_Borders, // Renamed in 1.91.1 (August 2024) for consistency.
+#endif
+};
+
+// Flags for ImGui::PushItemFlag()
+// (Those are shared by all items)
+enum ImGuiItemFlags_
+{
+ ImGuiItemFlags_None = 0, // (Default)
+ ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing. This is a "lighter" version of ImGuiItemFlags_NoNav.
+ ImGuiItemFlags_NoNav = 1 << 1, // false // Disable any form of focusing (keyboard/gamepad directional navigation and SetKeyboardFocusHere() calls).
+ ImGuiItemFlags_NoNavDefaultFocus = 1 << 2, // false // Disable item being a candidate for default focus (e.g. used by title bar items).
+ ImGuiItemFlags_ButtonRepeat = 1 << 3, // false // Any button-like behavior will have repeat mode enabled (based on io.KeyRepeatDelay and io.KeyRepeatRate values). Note that you can also call IsItemActive() after any button to tell if it is being held.
+ ImGuiItemFlags_AutoClosePopups = 1 << 4, // true // MenuItem()/Selectable() automatically close their parent popup window.
+ ImGuiItemFlags_AllowDuplicateId = 1 << 5, // false // Allow submitting an item with the same identifier as an item already submitted this frame without triggering a warning tooltip if io.ConfigDebugHighlightIdConflicts is set.
};
// Flags for ImGui::InputText()
// (Those are per-item flags. There are shared flags in ImGuiIO: io.ConfigInputTextCursorBlink and io.ConfigInputTextEnterKeepActive)
enum ImGuiInputTextFlags_
{
+ // Basic filters (also see ImGuiInputTextFlags_CallbackCharFilter)
ImGuiInputTextFlags_None = 0,
ImGuiInputTextFlags_CharsDecimal = 1 << 0, // Allow 0123456789.+-*/
ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, // Allow 0123456789ABCDEFabcdef
- ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z
- ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs
- ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus
- ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function.
- ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling)
- ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling)
- ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer.
- ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.
- ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field
- ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter).
- ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally
- ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode
- ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode
- ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*'
+ ImGuiInputTextFlags_CharsScientific = 1 << 2, // Allow 0123456789.+-*/eE (Scientific notation input)
+ ImGuiInputTextFlags_CharsUppercase = 1 << 3, // Turn a..z into A..Z
+ ImGuiInputTextFlags_CharsNoBlank = 1 << 4, // Filter out spaces, tabs
+
+ // Inputs
+ ImGuiInputTextFlags_AllowTabInput = 1 << 5, // Pressing TAB input a '\t' character into the text field
+ ImGuiInputTextFlags_EnterReturnsTrue = 1 << 6, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider using IsItemDeactivatedAfterEdit() instead!
+ ImGuiInputTextFlags_EscapeClearsAll = 1 << 7, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert)
+ ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 8, // In multi-line mode, validate with Enter, add new line with Ctrl+Enter (default is opposite: validate with Ctrl+Enter, add line with Enter).
+
+ // Other options
+ ImGuiInputTextFlags_ReadOnly = 1 << 9, // Read-only mode
+ ImGuiInputTextFlags_Password = 1 << 10, // Password mode, display all characters as '*', disable copy
+ ImGuiInputTextFlags_AlwaysOverwrite = 1 << 11, // Overwrite mode
+ ImGuiInputTextFlags_AutoSelectAll = 1 << 12, // Select entire text when first taking mouse focus
+ ImGuiInputTextFlags_ParseEmptyRefVal = 1 << 13, // InputFloat(), InputInt(), InputScalar() etc. only: parse empty string as zero value.
+ ImGuiInputTextFlags_DisplayEmptyRefVal = 1 << 14, // InputFloat(), InputInt(), InputScalar() etc. only: when value is zero, do not display it. Generally used with ImGuiInputTextFlags_ParseEmptyRefVal.
+ ImGuiInputTextFlags_NoHorizontalScroll = 1 << 15, // Disable following the cursor horizontally
ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID().
- ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input)
- ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this)
- ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
- ImGuiInputTextFlags_EscapeClearsAll = 1 << 20, // Escape key clears content if not empty, and deactivate otherwise (constrast to default behavior of Escape to revert)
- // Obsolete names (will be removed soon)
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior
-#endif
+ // Elide display / Alignment
+ ImGuiInputTextFlags_ElideLeft = 1 << 17, // When text doesn't fit, elide left side to ensure right side stays visible. Useful for path/filenames. Single-line only!
+
+ // Callback features
+ ImGuiInputTextFlags_CallbackCompletion = 1 << 18, // Callback on pressing TAB (for completion handling)
+ ImGuiInputTextFlags_CallbackHistory = 1 << 19, // Callback on pressing Up/Down arrows (for history handling)
+ ImGuiInputTextFlags_CallbackAlways = 1 << 20, // Callback on each iteration. User code may query cursor position, modify text buffer.
+ ImGuiInputTextFlags_CallbackCharFilter = 1 << 21, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.
+ ImGuiInputTextFlags_CallbackResize = 1 << 22, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this)
+ ImGuiInputTextFlags_CallbackEdit = 1 << 23, // Callback on any edit. Note that InputText() already returns true on edit + you can always use IsItemEdited(). The callback is useful to manipulate the underlying buffer while focus is active.
+
+ // Obsolete names
+ //ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior
};
// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*()
@@ -1025,25 +1196,33 @@ enum ImGuiTreeNodeFlags_
ImGuiTreeNodeFlags_None = 0,
ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected
ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader)
- ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one
+ ImGuiTreeNodeFlags_AllowOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one
ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack
ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes)
ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open
- ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node
- ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open.
+ ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Open on double-click instead of simple click (default for multi-select unless any _OpenOnXXX behavior is set explicitly). Both behaviors may be combined.
+ ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Open when clicking on the arrow part (default for multi-select unless any _OpenOnXXX behavior is set explicitly). Both behaviors may be combined.
ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes).
- ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow
- ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding().
- ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default.
- ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area).
- ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop)
- //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible
+ ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow. IMPORTANT: node can still be marked open/close if you don't set the _Leaf flag!
+ ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding() before the node.
+ ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line without using AllowOverlap mode.
+ ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (cover the indent area).
+ ImGuiTreeNodeFlags_SpanLabelWidth = 1 << 13, // Narrow hit box + narrow hovering highlight, will only cover the label text.
+ ImGuiTreeNodeFlags_SpanAllColumns = 1 << 14, // Frame will span all columns of its container table (label will still fit in current column)
+ ImGuiTreeNodeFlags_LabelSpanAllColumns = 1 << 15, // Label will span all columns of its container table
+ //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 16, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible
+ ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 17, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop)
ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog,
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiTreeNodeFlags_AllowItemOverlap = ImGuiTreeNodeFlags_AllowOverlap, // Renamed in 1.89.7
+ ImGuiTreeNodeFlags_SpanTextWidth = ImGuiTreeNodeFlags_SpanLabelWidth,// Renamed in 1.90.7
+#endif
};
// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions.
-// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat
-// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags.
+// - To be backward compatible with older API which took an 'int mouse_button = 1' argument instead of 'ImGuiPopupFlags flags',
+// we need to treat small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags.
// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags.
// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0.
// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter
@@ -1057,10 +1236,12 @@ enum ImGuiPopupFlags_
ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle)
ImGuiPopupFlags_MouseButtonMask_ = 0x1F,
ImGuiPopupFlags_MouseButtonDefault_ = 1,
- ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack
- ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space
- ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup.
- ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level)
+ ImGuiPopupFlags_NoReopen = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't reopen same popup if already open (won't reposition, won't reinitialize navigation)
+ //ImGuiPopupFlags_NoReopenAlwaysNavInit = 1 << 6, // For OpenPopup*(), BeginPopupContext*(): focus and initialize navigation even when not reopening.
+ ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 7, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack
+ ImGuiPopupFlags_NoOpenOverItems = 1 << 8, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space
+ ImGuiPopupFlags_AnyPopupId = 1 << 10, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup.
+ ImGuiPopupFlags_AnyPopupLevel = 1 << 11, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level)
ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel,
};
@@ -1068,11 +1249,17 @@ enum ImGuiPopupFlags_
enum ImGuiSelectableFlags_
{
ImGuiSelectableFlags_None = 0,
- ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this doesn't close parent popup window
- ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column)
+ ImGuiSelectableFlags_NoAutoClosePopups = 1 << 0, // Clicking this doesn't close parent popup window (overrides ImGuiItemFlags_AutoClosePopups)
+ ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Frame will span all columns of its container table (text will still fit in current column)
ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too
ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text
- ImGuiSelectableFlags_AllowItemOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one
+ ImGuiSelectableFlags_AllowOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one
+ ImGuiSelectableFlags_Highlight = 1 << 5, // Make the item be displayed as if it is hovered
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiSelectableFlags_DontClosePopups = ImGuiSelectableFlags_NoAutoClosePopups, // Renamed in 1.91.0
+ ImGuiSelectableFlags_AllowItemOverlap = ImGuiSelectableFlags_AllowOverlap, // Renamed in 1.89.7
+#endif
};
// Flags for ImGui::BeginCombo()
@@ -1086,6 +1273,7 @@ enum ImGuiComboFlags_
ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible
ImGuiComboFlags_NoArrowButton = 1 << 5, // Display on the preview box without the square arrow button
ImGuiComboFlags_NoPreview = 1 << 6, // Display only a square arrow button
+ ImGuiComboFlags_WidthFitPreview = 1 << 7, // Width dynamically calculated from preview contents
ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest,
};
@@ -1096,11 +1284,12 @@ enum ImGuiTabBarFlags_
ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list
ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear
ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup
- ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
+ ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You may handle this behavior manually on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll)
ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab
- ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit
- ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit
+ ImGuiTabBarFlags_DrawSelectedOverline = 1 << 6, // Draw selected overline markers over selected tab
+ ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 7, // Resize tabs when they don't fit
+ ImGuiTabBarFlags_FittingPolicyScroll = 1 << 8, // Add scroll buttons when tabs don't fit
ImGuiTabBarFlags_FittingPolicyMask_ = ImGuiTabBarFlags_FittingPolicyResizeDown | ImGuiTabBarFlags_FittingPolicyScroll,
ImGuiTabBarFlags_FittingPolicyDefault_ = ImGuiTabBarFlags_FittingPolicyResizeDown,
};
@@ -1109,147 +1298,15 @@ enum ImGuiTabBarFlags_
enum ImGuiTabItemFlags_
{
ImGuiTabItemFlags_None = 0,
- ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar.
+ ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + set ImGuiTabItemFlags_NoAssumedClosure.
ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem()
- ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
- ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem()
+ ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You may handle this behavior manually on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
+ ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID()/PopID() on BeginTabItem()/EndTabItem()
ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab
ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab
ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button)
ImGuiTabItemFlags_Trailing = 1 << 7, // Enforce the tab position to the right of the tab bar (before the scrolling buttons)
-};
-
-// Flags for ImGui::BeginTable()
-// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect.
-// Read comments/demos carefully + experiment with live demos to get acquainted with them.
-// - The DEFAULT sizing policies are:
-// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize.
-// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off.
-// - When ScrollX is off:
-// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight.
-// - Columns sizing policy allowed: Stretch (default), Fixed/Auto.
-// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all).
-// - Stretch Columns will share the remaining width according to their respective weight.
-// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors.
-// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns.
-// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing).
-// - When ScrollX is on:
-// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed
-// - Columns sizing policy allowed: Fixed/Auto mostly.
-// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed.
-// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop.
-// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable().
-// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again.
-// - Read on documentation at the top of imgui_tables.cpp for details.
-enum ImGuiTableFlags_
-{
- // Features
- ImGuiTableFlags_None = 0,
- ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns.
- ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers)
- ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu.
- ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate.
- ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file.
- ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow().
- // Decorations
- ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually)
- ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows.
- ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom.
- ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns.
- ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides.
- ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders.
- ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders.
- ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders.
- ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders.
- ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders.
- ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style
- ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style
- // Sizing Policy (read above for defaults)
- ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width.
- ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible.
- ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths.
- ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn().
- // Sizing Extra Options
- ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used.
- ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible.
- ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable.
- ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth.
- // Clipping
- ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze().
- // Padding
- ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers.
- ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding.
- ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off).
- // Scrolling
- ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX.
- ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size.
- // Sorting
- ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1).
- ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0).
-
- // [Internal] Combinations and masks
- ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame,
-};
-
-// Flags for ImGui::TableSetupColumn()
-enum ImGuiTableColumnFlags_
-{
- // Input configuration flags
- ImGuiTableColumnFlags_None = 0,
- ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state)
- ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column.
- ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column.
- ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp).
- ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable).
- ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing.
- ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column.
- ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column.
- ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command).
- ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table).
- ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction.
- ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction.
- ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit label for this column. Convenient for some small columns. Name will still appear in context menu.
- ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width.
- ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default).
- ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column.
- ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0).
- ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored.
-
- // Output status flags, read-only via TableGetColumnFlags()
- ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags.
- ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling.
- ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs
- ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse
-
- // [Internal] Combinations and masks
- ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed,
- ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable,
- ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered,
- ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge)
-};
-
-// Flags for ImGui::TableNextRow()
-enum ImGuiTableRowFlags_
-{
- ImGuiTableRowFlags_None = 0,
- ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width)
-};
-
-// Enum for ImGui::TableSetBgColor()
-// Background colors are rendering in 3 layers:
-// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set.
-// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set.
-// - Layer 2: draw with CellBg color if set.
-// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color.
-// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows.
-// If you set the color of RowBg0 target, your color will override the existing RowBg0 color.
-// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color.
-enum ImGuiTableBgTarget_
-{
- ImGuiTableBgTarget_None = 0,
- ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used)
- ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking)
- ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color)
+ ImGuiTabItemFlags_NoAssumedClosure = 1 << 8, // Tab is selected when trying to close + closure is not immediately assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar.
};
// Flags for ImGui::IsWindowFocused()
@@ -1278,16 +1335,30 @@ enum ImGuiHoveredFlags_
ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 5, // Return true even if a popup window is normally blocking access to this item/window
//ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 6, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet.
ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 7, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns.
- ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window
- ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled
- ImGuiHoveredFlags_NoNavOverride = 1 << 10, // Disable using gamepad/keyboard navigation state when active, always query mouse.
+ ImGuiHoveredFlags_AllowWhenOverlappedByItem = 1 << 8, // IsItemHovered() only: Return true even if the item uses AllowOverlap mode and is overlapped by another hoverable item.
+ ImGuiHoveredFlags_AllowWhenOverlappedByWindow = 1 << 9, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window.
+ ImGuiHoveredFlags_AllowWhenDisabled = 1 << 10, // IsItemHovered() only: Return true even if the item is disabled
+ ImGuiHoveredFlags_NoNavOverride = 1 << 11, // IsItemHovered() only: Disable using keyboard/gamepad navigation state when active, always query mouse
+ ImGuiHoveredFlags_AllowWhenOverlapped = ImGuiHoveredFlags_AllowWhenOverlappedByItem | ImGuiHoveredFlags_AllowWhenOverlappedByWindow,
ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped,
ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows,
- // Hovering delays (for tooltips)
- ImGuiHoveredFlags_DelayNormal = 1 << 11, // Return true after io.HoverDelayNormal elapsed (~0.30 sec)
- ImGuiHoveredFlags_DelayShort = 1 << 12, // Return true after io.HoverDelayShort elapsed (~0.10 sec)
- ImGuiHoveredFlags_NoSharedDelay = 1 << 13, // Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays)
+ // Tooltips mode
+ // - typically used in IsItemHovered() + SetTooltip() sequence.
+ // - this is a shortcut to pull flags from 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' where you can reconfigure desired behavior.
+ // e.g. 'TooltipHoveredFlagsForMouse' defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'.
+ // - for frequently actioned or hovered items providing a tooltip, you want may to use ImGuiHoveredFlags_ForTooltip (stationary + delay) so the tooltip doesn't show too often.
+ // - for items which main purpose is to be hovered, or items with low affordance, or in less consistent apps, prefer no delay or shorter delay.
+ ImGuiHoveredFlags_ForTooltip = 1 << 12, // Shortcut for standard flags when using IsItemHovered() + SetTooltip() sequence.
+
+ // (Advanced) Mouse Hovering delays.
+ // - generally you can use ImGuiHoveredFlags_ForTooltip to use application-standardized flags.
+ // - use those if you need specific overrides.
+ ImGuiHoveredFlags_Stationary = 1 << 13, // Require mouse to be stationary for style.HoverStationaryDelay (~0.15 sec) _at least one time_. After this, can move on same item/window. Using the stationary test tends to reduces the need for a long delay.
+ ImGuiHoveredFlags_DelayNone = 1 << 14, // IsItemHovered() only: Return true immediately (default). As this is the default you generally ignore this.
+ ImGuiHoveredFlags_DelayShort = 1 << 15, // IsItemHovered() only: Return true after style.HoverDelayShort elapsed (~0.15 sec) (shared between items) + requires mouse to be stationary for style.HoverStationaryDelay (once per item).
+ ImGuiHoveredFlags_DelayNormal = 1 << 16, // IsItemHovered() only: Return true after style.HoverDelayNormal elapsed (~0.40 sec) (shared between items) + requires mouse to be stationary for style.HoverStationaryDelay (once per item).
+ ImGuiHoveredFlags_NoSharedDelay = 1 << 17, // IsItemHovered() only: Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays)
};
// Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload()
@@ -1295,17 +1366,23 @@ enum ImGuiDragDropFlags_
{
ImGuiDragDropFlags_None = 0,
// BeginDragDropSource() flags
- ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0, // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disables this behavior.
+ ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0, // Disable preview tooltip. By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disables this behavior.
ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disables this behavior so you can still call IsItemHovered() on the source item.
ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit.
ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
- ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged)
+ ImGuiDragDropFlags_PayloadAutoExpire = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged)
+ ImGuiDragDropFlags_PayloadNoCrossContext = 1 << 6, // Hint to specify that the payload may not be copied outside current dear imgui context.
+ ImGuiDragDropFlags_PayloadNoCrossProcess = 1 << 7, // Hint to specify that the payload may not be copied outside current process.
// AcceptDragDropPayload() flags
ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target.
ImGuiDragDropFlags_AcceptNoPreviewTooltip = 1 << 12, // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site.
ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect, // For peeking ahead and inspecting the payload before delivery.
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiDragDropFlags_SourceAutoExpirePayload = ImGuiDragDropFlags_PayloadAutoExpire, // Renamed in 1.90.9
+#endif
};
// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui.
@@ -1325,11 +1402,13 @@ enum ImGuiDataType_
ImGuiDataType_U64, // unsigned long long / unsigned __int64
ImGuiDataType_Float, // float
ImGuiDataType_Double, // double
+ ImGuiDataType_Bool, // bool (provided for user convenience, not supported by scalar widgets)
+ ImGuiDataType_String, // char* (provided for user convenience, not supported by scalar widgets)
ImGuiDataType_COUNT
};
// A cardinal direction
-enum ImGuiDir_
+enum ImGuiDir : int
{
ImGuiDir_None = -1,
ImGuiDir_Left = 0,
@@ -1340,20 +1419,25 @@ enum ImGuiDir_
};
// A sorting direction
-enum ImGuiSortDirection_
+enum ImGuiSortDirection : ImU8
{
ImGuiSortDirection_None = 0,
ImGuiSortDirection_Ascending = 1, // Ascending = 0->9, A->Z etc.
ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc.
};
-// A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value)
-// All our named keys are >= 512. Keys value 0 to 511 are left unused as legacy native/opaque key values (< 1.87)
-// Since >= 1.89 we increased typing (went from int to enum), some legacy code may need a cast to ImGuiKey.
+// A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value): can represent Keyboard, Mouse and Gamepad values.
+// All our named keys are >= 512. Keys value 0 to 511 are left unused and were legacy native/opaque key values (< 1.87).
+// Support for legacy keys was completely removed in 1.91.5.
+// Read details about the 1.87+ transition : https://github.com/ocornut/imgui/issues/4921
+// Note that "Keys" related to physical keys and are not the same concept as input "Characters", the later are submitted via io.AddInputCharacter().
+// The keyboard key enum values are named after the keys on a standard US keyboard, and on other keyboard types the keys reported may not match the keycaps.
enum ImGuiKey : int
{
// Keyboard
ImGuiKey_None = 0,
+ ImGuiKey_NamedKey_BEGIN = 512, // First valid key value (other than 0)
+
ImGuiKey_Tab = 512, // == ImGuiKey_NamedKey_BEGIN
ImGuiKey_LeftArrow,
ImGuiKey_RightArrow,
@@ -1378,6 +1462,8 @@ enum ImGuiKey : int
ImGuiKey_U, ImGuiKey_V, ImGuiKey_W, ImGuiKey_X, ImGuiKey_Y, ImGuiKey_Z,
ImGuiKey_F1, ImGuiKey_F2, ImGuiKey_F3, ImGuiKey_F4, ImGuiKey_F5, ImGuiKey_F6,
ImGuiKey_F7, ImGuiKey_F8, ImGuiKey_F9, ImGuiKey_F10, ImGuiKey_F11, ImGuiKey_F12,
+ ImGuiKey_F13, ImGuiKey_F14, ImGuiKey_F15, ImGuiKey_F16, ImGuiKey_F17, ImGuiKey_F18,
+ ImGuiKey_F19, ImGuiKey_F20, ImGuiKey_F21, ImGuiKey_F22, ImGuiKey_F23, ImGuiKey_F24,
ImGuiKey_Apostrophe, // '
ImGuiKey_Comma, // ,
ImGuiKey_Minus, // -
@@ -1403,9 +1489,12 @@ enum ImGuiKey : int
ImGuiKey_KeypadAdd,
ImGuiKey_KeypadEnter,
ImGuiKey_KeypadEqual,
+ ImGuiKey_AppBack, // Available on some keyboard/mouses. Often referred as "Browser Back"
+ ImGuiKey_AppForward,
+ ImGuiKey_Oem102, // Non-US backslash.
- // Gamepad (some of those are analog values, 0.0f to 1.0f) // GAME NAVIGATION ACTION
- // (download controller mapping PNG/PSD at http://dearimgui.org/controls_sheets)
+ // Gamepad (some of those are analog values, 0.0f to 1.0f) // NAVIGATION ACTION
+ // (download controller mapping PNG/PSD at http://dearimgui.com/controls_sheets)
ImGuiKey_GamepadStart, // Menu (Xbox) + (Switch) Start/Options (PS)
ImGuiKey_GamepadBack, // View (Xbox) - (Switch) Share (PS)
ImGuiKey_GamepadFaceLeft, // X (Xbox) Y (Switch) Square (PS) // Tap: Toggle Menu. Hold: Windowing mode (Focus/Move/Resize windows)
@@ -1431,13 +1520,13 @@ enum ImGuiKey : int
ImGuiKey_GamepadRStickUp, // [Analog]
ImGuiKey_GamepadRStickDown, // [Analog]
- // Mouse Buttons (auto-submitted from AddMouseButtonEvent() calls)
+ // Aliases: Mouse Buttons (auto-submitted from AddMouseButtonEvent() calls)
// - This is mirroring the data also written to io.MouseDown[], io.MouseWheel, in a format allowing them to be accessed via standard key API.
ImGuiKey_MouseLeft, ImGuiKey_MouseRight, ImGuiKey_MouseMiddle, ImGuiKey_MouseX1, ImGuiKey_MouseX2, ImGuiKey_MouseWheelX, ImGuiKey_MouseWheelY,
// [Internal] Reserved for mod storage
ImGuiKey_ReservedForModCtrl, ImGuiKey_ReservedForModShift, ImGuiKey_ReservedForModAlt, ImGuiKey_ReservedForModSuper,
- ImGuiKey_COUNT,
+ ImGuiKey_NamedKey_END,
// Keyboard Modifiers (explicitly submitted by backend via AddKeyEvent() calls)
// - This is mirroring the data also written to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper, in a format allowing
@@ -1447,63 +1536,70 @@ enum ImGuiKey : int
// - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys.
// In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and
// backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user...
+ // - On macOS, we swap Cmd(Super) and Ctrl keys at the time of the io.AddKeyEvent() call.
ImGuiMod_None = 0,
- ImGuiMod_Ctrl = 1 << 12,
- ImGuiMod_Shift = 1 << 13,
+ ImGuiMod_Ctrl = 1 << 12, // Ctrl (non-macOS), Cmd (macOS)
+ ImGuiMod_Shift = 1 << 13, // Shift
ImGuiMod_Alt = 1 << 14, // Option/Menu
- ImGuiMod_Super = 1 << 15, // Cmd/Super/Windows
- ImGuiMod_Mask_ = 0xF000,
-#if defined(__APPLE__)
- ImGuiMod_Shortcut = ImGuiMod_Super,
-#else
- ImGuiMod_Shortcut = ImGuiMod_Ctrl,
-#endif
+ ImGuiMod_Super = 1 << 15, // Windows/Super (non-macOS), Ctrl (macOS)
+ ImGuiMod_Mask_ = 0xF000, // 4-bits
- // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + the io.KeyMap[] array.
- // We are ditching this method but keeping a legacy path for user code doing e.g. IsKeyPressed(MY_NATIVE_KEY_CODE)
- ImGuiKey_NamedKey_BEGIN = 512,
- ImGuiKey_NamedKey_END = ImGuiKey_COUNT,
+ // [Internal] If you need to iterate all keys (for e.g. an input mapper) you may use ImGuiKey_NamedKey_BEGIN..ImGuiKey_NamedKey_END.
ImGuiKey_NamedKey_COUNT = ImGuiKey_NamedKey_END - ImGuiKey_NamedKey_BEGIN,
-#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
- ImGuiKey_KeysData_SIZE = ImGuiKey_NamedKey_COUNT, // Size of KeysData[]: only hold named keys
- ImGuiKey_KeysData_OFFSET = ImGuiKey_NamedKey_BEGIN, // First key stored in io.KeysData[0]. Accesses to io.KeysData[] must use (key - ImGuiKey_KeysData_OFFSET).
-#else
- ImGuiKey_KeysData_SIZE = ImGuiKey_COUNT, // Size of KeysData[]: hold legacy 0..512 keycodes + named keys
- ImGuiKey_KeysData_OFFSET = 0, // First key stored in io.KeysData[0]. Accesses to io.KeysData[] must use (key - ImGuiKey_KeysData_OFFSET).
-#endif
+ //ImGuiKey_KeysData_SIZE = ImGuiKey_NamedKey_COUNT, // Size of KeysData[]: only hold named keys
+ //ImGuiKey_KeysData_OFFSET = ImGuiKey_NamedKey_BEGIN, // Accesses to io.KeysData[] must use (key - ImGuiKey_NamedKey_BEGIN) index.
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiKey_COUNT = ImGuiKey_NamedKey_END, // Obsoleted in 1.91.5 because it was extremely misleading (since named keys don't start at 0 anymore)
+ ImGuiMod_Shortcut = ImGuiMod_Ctrl, // Removed in 1.90.7, you can now simply use ImGuiMod_Ctrl
ImGuiKey_ModCtrl = ImGuiMod_Ctrl, ImGuiKey_ModShift = ImGuiMod_Shift, ImGuiKey_ModAlt = ImGuiMod_Alt, ImGuiKey_ModSuper = ImGuiMod_Super, // Renamed in 1.89
- ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87
+ //ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87
#endif
};
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
-// OBSOLETED in 1.88 (from July 2022): ImGuiNavInput and io.NavInputs[].
-// Official backends between 1.60 and 1.86: will keep working and feed gamepad inputs as long as IMGUI_DISABLE_OBSOLETE_KEYIO is not set.
-// Custom backends: feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums.
-enum ImGuiNavInput
+// Flags for Shortcut(), SetNextItemShortcut(),
+// (and for upcoming extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner() that are still in imgui_internal.h)
+// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)
+enum ImGuiInputFlags_
{
- ImGuiNavInput_Activate, ImGuiNavInput_Cancel, ImGuiNavInput_Input, ImGuiNavInput_Menu, ImGuiNavInput_DpadLeft, ImGuiNavInput_DpadRight, ImGuiNavInput_DpadUp, ImGuiNavInput_DpadDown,
- ImGuiNavInput_LStickLeft, ImGuiNavInput_LStickRight, ImGuiNavInput_LStickUp, ImGuiNavInput_LStickDown, ImGuiNavInput_FocusPrev, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakSlow, ImGuiNavInput_TweakFast,
- ImGuiNavInput_COUNT,
+ ImGuiInputFlags_None = 0,
+ ImGuiInputFlags_Repeat = 1 << 0, // Enable repeat. Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1.
+
+ // Flags for Shortcut(), SetNextItemShortcut()
+ // - Routing policies: RouteGlobal+OverActive >> RouteActive or RouteFocused (if owner is active item) >> RouteGlobal+OverFocused >> RouteFocused (if in focused window stack) >> RouteGlobal.
+ // - Default policy is RouteFocused. Can select only 1 policy among all available.
+ ImGuiInputFlags_RouteActive = 1 << 10, // Route to active item only.
+ ImGuiInputFlags_RouteFocused = 1 << 11, // Route to windows in the focus stack (DEFAULT). Deep-most focused window takes inputs. Active item takes inputs over deep-most focused window.
+ ImGuiInputFlags_RouteGlobal = 1 << 12, // Global route (unless a focused window or active item registered the route).
+ ImGuiInputFlags_RouteAlways = 1 << 13, // Do not register route, poll keys directly.
+ // - Routing options
+ ImGuiInputFlags_RouteOverFocused = 1 << 14, // Option: global route: higher priority than focused route (unless active item in focused route).
+ ImGuiInputFlags_RouteOverActive = 1 << 15, // Option: global route: higher priority than active item. Unlikely you need to use that: will interfere with every active items, e.g. CTRL+A registered by InputText will be overridden by this. May not be fully honored as user/internal code is likely to always assume they can access keys when active.
+ ImGuiInputFlags_RouteUnlessBgFocused = 1 << 16, // Option: global route: will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications.
+ ImGuiInputFlags_RouteFromRootWindow = 1 << 17, // Option: route evaluated from the point of view of root window rather than current window.
+
+ // Flags for SetNextItemShortcut()
+ ImGuiInputFlags_Tooltip = 1 << 18, // Automatically display a tooltip when hovering item [BETA] Unsure of right api (opt-in/opt-out)
};
-#endif
// Configuration flags stored in io.ConfigFlags. Set by user/application.
enum ImGuiConfigFlags_
{
ImGuiConfigFlags_None = 0,
- ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag.
+ ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag. Enable full Tabbing + directional arrows + space/enter to activate.
ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. Backend also needs to set ImGuiBackendFlags_HasGamepad.
- ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your backend, otherwise ImGui will react as if the mouse is jumping around back and forth.
- ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3, // Instruct navigation to not set the io.WantCaptureKeyboard flag when io.NavActive is set.
- ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the backend.
+ ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct dear imgui to disable mouse inputs and interactions.
ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct backend to not alter mouse cursor shape and visibility. Use if the backend cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead.
+ ImGuiConfigFlags_NoKeyboard = 1 << 6, // Instruct dear imgui to disable keyboard inputs and interactions. This is done by ignoring keyboard events and clearing existing states.
// User storage (to allow your backend/engine to communicate to code that may be shared between multiple projects. Those flags are NOT used by core Dear ImGui)
ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware.
ImGuiConfigFlags_IsTouchScreen = 1 << 21, // Application is using a touch screen instead of a mouse.
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // [moved/renamed in 1.91.4] -> use bool io.ConfigNavMoveSetMousePos
+ ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3, // [moved/renamed in 1.91.4] -> use bool io.ConfigNavCaptureKeyboard
+#endif
};
// Backend capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom backend.
@@ -1512,7 +1608,7 @@ enum ImGuiBackendFlags_
ImGuiBackendFlags_None = 0,
ImGuiBackendFlags_HasGamepad = 1 << 0, // Backend Platform supports gamepad and currently has one connected.
ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape.
- ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set).
+ ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if io.ConfigNavMoveSetMousePos is set).
ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3, // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices.
};
@@ -1529,15 +1625,15 @@ enum ImGuiCol_
ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input
ImGuiCol_FrameBgHovered,
ImGuiCol_FrameBgActive,
- ImGuiCol_TitleBg,
- ImGuiCol_TitleBgActive,
- ImGuiCol_TitleBgCollapsed,
+ ImGuiCol_TitleBg, // Title bar
+ ImGuiCol_TitleBgActive, // Title bar when focused
+ ImGuiCol_TitleBgCollapsed, // Title bar when collapsed
ImGuiCol_MenuBarBg,
ImGuiCol_ScrollbarBg,
ImGuiCol_ScrollbarGrab,
ImGuiCol_ScrollbarGrabHovered,
ImGuiCol_ScrollbarGrabActive,
- ImGuiCol_CheckMark,
+ ImGuiCol_CheckMark, // Checkbox tick and RadioButton circle
ImGuiCol_SliderGrab,
ImGuiCol_SliderGrabActive,
ImGuiCol_Button,
@@ -1552,11 +1648,13 @@ enum ImGuiCol_
ImGuiCol_ResizeGrip, // Resize grip in lower-right and lower-left corners of windows.
ImGuiCol_ResizeGripHovered,
ImGuiCol_ResizeGripActive,
- ImGuiCol_Tab, // TabItem in a TabBar
- ImGuiCol_TabHovered,
- ImGuiCol_TabActive,
- ImGuiCol_TabUnfocused,
- ImGuiCol_TabUnfocusedActive,
+ ImGuiCol_TabHovered, // Tab background, when hovered
+ ImGuiCol_Tab, // Tab background, when tab-bar is focused & tab is unselected
+ ImGuiCol_TabSelected, // Tab background, when tab-bar is focused & tab is selected
+ ImGuiCol_TabSelectedOverline, // Tab horizontal overline, when tab-bar is focused & tab is selected
+ ImGuiCol_TabDimmed, // Tab background, when tab-bar is unfocused & tab is unselected
+ ImGuiCol_TabDimmedSelected, // Tab background, when tab-bar is unfocused & tab is selected
+ ImGuiCol_TabDimmedSelectedOverline,//..horizontal overline, when tab-bar is unfocused & tab is selected
ImGuiCol_PlotLines,
ImGuiCol_PlotLinesHovered,
ImGuiCol_PlotHistogram,
@@ -1566,50 +1664,68 @@ enum ImGuiCol_
ImGuiCol_TableBorderLight, // Table inner borders (prefer using Alpha=1.0 here)
ImGuiCol_TableRowBg, // Table row background (even rows)
ImGuiCol_TableRowBgAlt, // Table row background (odd rows)
+ ImGuiCol_TextLink, // Hyperlink color
ImGuiCol_TextSelectedBg,
ImGuiCol_DragDropTarget, // Rectangle highlighting a drop target
- ImGuiCol_NavHighlight, // Gamepad/keyboard: current highlighted item
+ ImGuiCol_NavCursor, // Color of keyboard/gamepad navigation cursor/rectangle, when visible
ImGuiCol_NavWindowingHighlight, // Highlight window when using CTRL+TAB
ImGuiCol_NavWindowingDimBg, // Darken/colorize entire screen behind the CTRL+TAB window list, when active
ImGuiCol_ModalWindowDimBg, // Darken/colorize entire screen behind a modal window, when one is active
- ImGuiCol_COUNT
+ ImGuiCol_COUNT,
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiCol_TabActive = ImGuiCol_TabSelected, // [renamed in 1.90.9]
+ ImGuiCol_TabUnfocused = ImGuiCol_TabDimmed, // [renamed in 1.90.9]
+ ImGuiCol_TabUnfocusedActive = ImGuiCol_TabDimmedSelected, // [renamed in 1.90.9]
+ ImGuiCol_NavHighlight = ImGuiCol_NavCursor, // [renamed in 1.91.4]
+#endif
};
// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure.
// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code.
// During initialization or between frames, feel free to just poke into ImGuiStyle directly.
// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description.
-// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
-// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
+// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
+// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
+// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.
enum ImGuiStyleVar_
{
- // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions)
- ImGuiStyleVar_Alpha, // float Alpha
- ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha
- ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding
- ImGuiStyleVar_WindowRounding, // float WindowRounding
- ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize
- ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize
- ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign
- ImGuiStyleVar_ChildRounding, // float ChildRounding
- ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize
- ImGuiStyleVar_PopupRounding, // float PopupRounding
- ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize
- ImGuiStyleVar_FramePadding, // ImVec2 FramePadding
- ImGuiStyleVar_FrameRounding, // float FrameRounding
- ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize
- ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing
- ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing
- ImGuiStyleVar_IndentSpacing, // float IndentSpacing
- ImGuiStyleVar_CellPadding, // ImVec2 CellPadding
- ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize
- ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding
- ImGuiStyleVar_GrabMinSize, // float GrabMinSize
- ImGuiStyleVar_GrabRounding, // float GrabRounding
- ImGuiStyleVar_TabRounding, // float TabRounding
- ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign
- ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign
+ // Enum name -------------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions)
+ ImGuiStyleVar_Alpha, // float Alpha
+ ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha
+ ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding
+ ImGuiStyleVar_WindowRounding, // float WindowRounding
+ ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize
+ ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize
+ ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign
+ ImGuiStyleVar_ChildRounding, // float ChildRounding
+ ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize
+ ImGuiStyleVar_PopupRounding, // float PopupRounding
+ ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize
+ ImGuiStyleVar_FramePadding, // ImVec2 FramePadding
+ ImGuiStyleVar_FrameRounding, // float FrameRounding
+ ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize
+ ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing
+ ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing
+ ImGuiStyleVar_IndentSpacing, // float IndentSpacing
+ ImGuiStyleVar_CellPadding, // ImVec2 CellPadding
+ ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize
+ ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding
+ ImGuiStyleVar_GrabMinSize, // float GrabMinSize
+ ImGuiStyleVar_GrabRounding, // float GrabRounding
+ ImGuiStyleVar_ImageBorderSize, // float ImageBorderSize
+ ImGuiStyleVar_TabRounding, // float TabRounding
+ ImGuiStyleVar_TabBorderSize, // float TabBorderSize
+ ImGuiStyleVar_TabBarBorderSize, // float TabBarBorderSize
+ ImGuiStyleVar_TabBarOverlineSize, // float TabBarOverlineSize
+ ImGuiStyleVar_TableAngledHeadersAngle, // float TableAngledHeadersAngle
+ ImGuiStyleVar_TableAngledHeadersTextAlign,// ImVec2 TableAngledHeadersTextAlign
+ ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign
+ ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign
+ ImGuiStyleVar_SeparatorTextBorderSize, // float SeparatorTextBorderSize
+ ImGuiStyleVar_SeparatorTextAlign, // ImVec2 SeparatorTextAlign
+ ImGuiStyleVar_SeparatorTextPadding, // ImVec2 SeparatorTextPadding
ImGuiStyleVar_COUNT
};
@@ -1620,10 +1736,8 @@ enum ImGuiButtonFlags_
ImGuiButtonFlags_MouseButtonLeft = 1 << 0, // React on left mouse button (default)
ImGuiButtonFlags_MouseButtonRight = 1 << 1, // React on right mouse button
ImGuiButtonFlags_MouseButtonMiddle = 1 << 2, // React on center mouse button
-
- // [Internal]
- ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle,
- ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft,
+ ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, // [Internal]
+ ImGuiButtonFlags_EnableNav = 1 << 3, // InvisibleButton(): do not disable navigation/tabbing. Otherwise disabled by default.
};
// Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton()
@@ -1641,10 +1755,16 @@ enum ImGuiColorEditFlags_
ImGuiColorEditFlags_NoDragDrop = 1 << 9, // // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source.
ImGuiColorEditFlags_NoBorder = 1 << 10, // // ColorButton: disable border (which is enforced by default)
+ // Alpha preview
+ // - Prior to 1.91.8 (2025/01/21): alpha was made opaque in the preview by default using old name ImGuiColorEditFlags_AlphaPreview.
+ // - We now display the preview as transparent by default. You can use ImGuiColorEditFlags_AlphaOpaque to use old behavior.
+ // - The new flags may be combined better and allow finer controls.
+ ImGuiColorEditFlags_AlphaOpaque = 1 << 11, // // ColorEdit, ColorPicker, ColorButton: disable alpha in the preview,. Contrary to _NoAlpha it may still be edited when calling ColorEdit4()/ColorPicker4(). For ColorButton() this does the same as _NoAlpha.
+ ImGuiColorEditFlags_AlphaNoBg = 1 << 12, // // ColorEdit, ColorPicker, ColorButton: disable rendering a checkerboard background behind transparent color.
+ ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 13, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half transparent preview.
+
// User Options (right-click on widget to change some of them).
ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker.
- ImGuiColorEditFlags_AlphaPreview = 1 << 17, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque.
- ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque.
ImGuiColorEditFlags_HDR = 1 << 19, // // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well).
ImGuiColorEditFlags_DisplayRGB = 1 << 20, // [Display] // ColorEdit: override _display_ type among RGB/HSV/Hex. ColorPicker: select any combination using one or more of RGB/HSV/Hex.
ImGuiColorEditFlags_DisplayHSV = 1 << 21, // [Display] // "
@@ -1661,31 +1781,34 @@ enum ImGuiColorEditFlags_
ImGuiColorEditFlags_DefaultOptions_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar,
// [Internal] Masks
+ ImGuiColorEditFlags_AlphaMask_ = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaOpaque | ImGuiColorEditFlags_AlphaNoBg | ImGuiColorEditFlags_AlphaPreviewHalf,
ImGuiColorEditFlags_DisplayMask_ = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex,
ImGuiColorEditFlags_DataTypeMask_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float,
ImGuiColorEditFlags_PickerMask_ = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar,
ImGuiColorEditFlags_InputMask_ = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV,
- // Obsolete names (will be removed)
- // ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69]
+ // Obsolete names
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiColorEditFlags_AlphaPreview = 0, // [Removed in 1.91.8] This is the default now. Will display a checkerboard unless ImGuiColorEditFlags_AlphaNoBg is set.
+#endif
+ //ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69]
};
// Flags for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc.
// We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.
-// (Those are per-item flags. There are shared flags in ImGuiIO: io.ConfigDragClickToInputText)
+// (Those are per-item flags. There is shared behavior flag too: ImGuiIO: io.ConfigDragClickToInputText)
enum ImGuiSliderFlags_
{
- ImGuiSliderFlags_None = 0,
- ImGuiSliderFlags_AlwaysClamp = 1 << 4, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds.
- ImGuiSliderFlags_Logarithmic = 1 << 5, // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits.
- ImGuiSliderFlags_NoRoundToFormat = 1 << 6, // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits)
- ImGuiSliderFlags_NoInput = 1 << 7, // Disable CTRL+Click or Enter key allowing to input text directly into the widget
- ImGuiSliderFlags_InvalidMask_ = 0x7000000F, // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed.
-
- // Obsolete names (will be removed)
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- ImGuiSliderFlags_ClampOnInput = ImGuiSliderFlags_AlwaysClamp, // [renamed in 1.79]
-#endif
+ ImGuiSliderFlags_None = 0,
+ ImGuiSliderFlags_Logarithmic = 1 << 5, // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits.
+ ImGuiSliderFlags_NoRoundToFormat = 1 << 6, // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits).
+ ImGuiSliderFlags_NoInput = 1 << 7, // Disable CTRL+Click or Enter key allowing to input text directly into the widget.
+ ImGuiSliderFlags_WrapAround = 1 << 8, // Enable wrapping around from max to min and from min to max. Only supported by DragXXX() functions for now.
+ ImGuiSliderFlags_ClampOnInput = 1 << 9, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds.
+ ImGuiSliderFlags_ClampZeroRange = 1 << 10, // Clamp even if min==max==0.0f. Otherwise due to legacy reason DragXXX functions don't clamp with those values. When your clamping limits are dynamic you almost always want to use it.
+ ImGuiSliderFlags_NoSpeedTweaks = 1 << 11, // Disable keyboard modifiers altering tweak speed. Useful if you want to alter tweak speed yourself based on your own logic.
+ ImGuiSliderFlags_AlwaysClamp = ImGuiSliderFlags_ClampOnInput | ImGuiSliderFlags_ClampZeroRange,
+ ImGuiSliderFlags_InvalidMask_ = 0x7000000F, // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed.
};
// Identify a mouse button.
@@ -1711,11 +1834,25 @@ enum ImGuiMouseCursor_
ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window
ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window
ImGuiMouseCursor_Hand, // (Unused by Dear ImGui functions. Use for e.g. hyperlinks)
+ ImGuiMouseCursor_Wait, // When waiting for something to process/load.
+ ImGuiMouseCursor_Progress, // When waiting for something to process/load, but application is still interactive.
ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle.
ImGuiMouseCursor_COUNT
};
-// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions
+// Enumeration for AddMouseSourceEvent() actual source of Mouse Input data.
+// Historically we use "Mouse" terminology everywhere to indicate pointer data, e.g. MousePos, IsMousePressed(), io.AddMousePosEvent()
+// But that "Mouse" data can come from different source which occasionally may be useful for application to know about.
+// You can submit a change of pointer type using io.AddMouseSourceEvent().
+enum ImGuiMouseSource : int
+{
+ ImGuiMouseSource_Mouse = 0, // Input is coming from an actual mouse.
+ ImGuiMouseSource_TouchScreen, // Input is coming from a touch screen (no hovering prior to initial press, less precise initial press aiming, dual-axis wheeling possible).
+ ImGuiMouseSource_Pen, // Input is coming from a pressure/magnetic pen (often used in conjunction with high-sampling rates).
+ ImGuiMouseSource_COUNT
+};
+
+// Enumeration for ImGui::SetNextWindow***(), SetWindow***(), SetNextItem***() functions
// Represent a condition.
// Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always.
enum ImGuiCond_
@@ -1728,10 +1865,184 @@ enum ImGuiCond_
};
//-----------------------------------------------------------------------------
-// [SECTION] Helpers: Memory allocations macros, ImVector<>
+// [SECTION] Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs)
+//-----------------------------------------------------------------------------
+
+// Flags for ImGui::BeginTable()
+// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect.
+// Read comments/demos carefully + experiment with live demos to get acquainted with them.
+// - The DEFAULT sizing policies are:
+// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize.
+// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off.
+// - When ScrollX is off:
+// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight.
+// - Columns sizing policy allowed: Stretch (default), Fixed/Auto.
+// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all).
+// - Stretch Columns will share the remaining width according to their respective weight.
+// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors.
+// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns.
+// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing).
+// - When ScrollX is on:
+// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed
+// - Columns sizing policy allowed: Fixed/Auto mostly.
+// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed.
+// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop.
+// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable().
+// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again.
+// - Read on documentation at the top of imgui_tables.cpp for details.
+enum ImGuiTableFlags_
+{
+ // Features
+ ImGuiTableFlags_None = 0,
+ ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns.
+ ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers)
+ ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu.
+ ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate.
+ ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file.
+ ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow().
+ // Decorations
+ ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually)
+ ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows.
+ ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom.
+ ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns.
+ ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides.
+ ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders.
+ ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders.
+ ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders.
+ ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders.
+ ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders.
+ ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style
+ ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style
+ // Sizing Policy (read above for defaults)
+ ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width.
+ ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible.
+ ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths.
+ ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn().
+ // Sizing Extra Options
+ ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used.
+ ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible.
+ ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable.
+ ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth.
+ // Clipping
+ ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze().
+ // Padding
+ ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers.
+ ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding.
+ ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off).
+ // Scrolling
+ ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX.
+ ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size.
+ // Sorting
+ ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1).
+ ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0).
+ // Miscellaneous
+ ImGuiTableFlags_HighlightHoveredColumn = 1 << 28, // Highlight column headers when hovered (may evolve into a fuller highlight)
+
+ // [Internal] Combinations and masks
+ ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame,
+};
+
+// Flags for ImGui::TableSetupColumn()
+enum ImGuiTableColumnFlags_
+{
+ // Input configuration flags
+ ImGuiTableColumnFlags_None = 0,
+ ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state)
+ ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column.
+ ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column.
+ ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp).
+ ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable).
+ ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing.
+ ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column.
+ ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column.
+ ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command).
+ ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table).
+ ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction.
+ ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction.
+ ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will submit an empty label for this column. Convenient for some small columns. Name will still appear in context menu or in angled headers. You may append into this cell by calling TableSetColumnIndex() right after the TableHeadersRow() call.
+ ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width.
+ ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default).
+ ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column.
+ ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0).
+ ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored.
+ ImGuiTableColumnFlags_AngledHeader = 1 << 18, // TableHeadersRow() will submit an angled header row for this column. Note this will add an extra row.
+
+ // Output status flags, read-only via TableGetColumnFlags()
+ ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags.
+ ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling.
+ ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs
+ ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse
+
+ // [Internal] Combinations and masks
+ ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed,
+ ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable,
+ ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered,
+ ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge)
+};
+
+// Flags for ImGui::TableNextRow()
+enum ImGuiTableRowFlags_
+{
+ ImGuiTableRowFlags_None = 0,
+ ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width)
+};
+
+// Enum for ImGui::TableSetBgColor()
+// Background colors are rendering in 3 layers:
+// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set.
+// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set.
+// - Layer 2: draw with CellBg color if set.
+// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color.
+// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows.
+// If you set the color of RowBg0 target, your color will override the existing RowBg0 color.
+// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color.
+enum ImGuiTableBgTarget_
+{
+ ImGuiTableBgTarget_None = 0,
+ ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used)
+ ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking)
+ ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color)
+};
+
+// Sorting specifications for a table (often handling sort specs for a single column, occasionally more)
+// Obtained by calling TableGetSortSpecs().
+// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time.
+// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame!
+struct ImGuiTableSortSpecs
+{
+ const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array.
+ int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled.
+ bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag.
+
+ ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); }
+};
+
+// Sorting specification for one column of a table (sizeof == 12 bytes)
+struct ImGuiTableColumnSortSpecs
+{
+ ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call)
+ ImS16 ColumnIndex; // Index of the column
+ ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here)
+ ImGuiSortDirection SortDirection; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
+
+ ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); }
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Helpers: Debug log, memory allocations macros, ImVector<>
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
+// Debug Logging into ShowDebugLogWindow(), tty and more.
+//-----------------------------------------------------------------------------
+
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+#define IMGUI_DEBUG_LOG(...) ImGui::DebugLog(__VA_ARGS__)
+#else
+#define IMGUI_DEBUG_LOG(...) ((void)0)
+#endif
+
+//-----------------------------------------------------------------------------
// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE()
// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
// Defining a custom placement new() with a custom parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
@@ -1816,6 +2127,7 @@ struct ImVector
inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; }
inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; }
inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; }
+ inline int find_index(const T& v) const { const T* data_end = Data + Size; const T* it = find(v); if (it == data_end) return -1; const ptrdiff_t off = it - Data; return (int)off; }
inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; }
inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; }
inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; }
@@ -1837,6 +2149,7 @@ struct ImGuiStyle
ImVec2 WindowPadding; // Padding within a window.
float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended.
float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
+ float WindowBorderHoverPadding; // Hit-testing extent outside/inside resizing border. Also extend determination of hovered window. Generally meaningfully larger than WindowBorderSize to make it easy to reach borders.
ImVec2 WindowMinSize; // Minimum window size. This is a global setting. If you want to constrain individual windows, use SetNextWindowSizeConstraints().
ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.
ImGuiDir WindowMenuButtonPosition; // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left.
@@ -1849,7 +2162,7 @@ struct ImGuiStyle
float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines.
ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label).
- ImVec2 CellPadding; // Padding within a table cell
+ ImVec2 CellPadding; // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows.
ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
@@ -1858,24 +2171,48 @@ struct ImGuiStyle
float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar.
float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
float LogSliderDeadzone; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero.
+ float ImageBorderSize; // Thickness of border around Image() calls.
float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs.
float TabBorderSize; // Thickness of border around tabs.
- float TabMinWidthForCloseButton; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected.
+ float TabCloseButtonMinWidthSelected; // -1: always visible. 0.0f: visible when hovered. >0.0f: visible when hovered if minimum width.
+ float TabCloseButtonMinWidthUnselected; // -1: always visible. 0.0f: visible when hovered. >0.0f: visible when hovered if minimum width. FLT_MAX: never show close button when unselected.
+ float TabBarBorderSize; // Thickness of tab-bar separator, which takes on the tab active color to denote focus.
+ float TabBarOverlineSize; // Thickness of tab-bar overline, which highlights the selected tab-bar.
+ float TableAngledHeadersAngle; // Angle of angled headers (supported values range from -50.0f degrees to +50.0f degrees).
+ ImVec2 TableAngledHeadersTextAlign;// Alignment of angled headers within the cell
ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right.
ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered).
ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line.
- ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows.
- ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly!
- float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
+ float SeparatorTextBorderSize; // Thickness of border in SeparatorText()
+ ImVec2 SeparatorTextAlign; // Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center).
+ ImVec2 SeparatorTextPadding; // Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y.
+ ImVec2 DisplayWindowPadding; // Apply to regular windows: amount which we enforce to keep visible when moving near edges of your screen.
+ ImVec2 DisplaySafeAreaPadding; // Apply to every windows, menus, popups, tooltips: amount where we avoid displaying contents. Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured).
+ float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). We apply per-monitor DPI scaling over this scale. May be removed later.
bool AntiAliasedLines; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList).
bool AntiAliasedLinesUseTex; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). Latched at the beginning of the frame (copied to ImDrawList).
bool AntiAliasedFill; // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList).
float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
+
+ // Colors
ImVec4 Colors[ImGuiCol_COUNT];
+ // Behaviors
+ // (It is possible to modify those fields mid-frame if specific behavior need it, unlike e.g. configuration fields in ImGuiIO)
+ float HoverStationaryDelay; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary.
+ float HoverDelayShort; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay.
+ float HoverDelayNormal; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayNormal). "
+ ImGuiHoveredFlags HoverFlagsForTooltipMouse;// Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using mouse.
+ ImGuiHoveredFlags HoverFlagsForTooltipNav; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using keyboard/gamepad.
+
IMGUI_API ImGuiStyle();
IMGUI_API void ScaleAllSizes(float scale_factor);
+
+ // Obsolete names
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ // TabMinWidthForCloseButton = TabCloseButtonMinWidthUnselected // Renamed in 1.91.9.
+#endif
};
//-----------------------------------------------------------------------------
@@ -1883,6 +2220,11 @@ struct ImGuiStyle
//-----------------------------------------------------------------------------
// Communicate most settings and inputs/outputs to Dear ImGui using this structure.
// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
+// It is generally expected that:
+// - initialization: backends and user code writes to ImGuiIO.
+// - main loop: backends writes to ImGuiIO, user code and imgui code reads from ImGuiIO.
+//-----------------------------------------------------------------------------
+// Also see ImGui::GetPlatformIO() and ImGuiPlatformIO struct for OS/platform related functions: clipboard, IME etc.
//-----------------------------------------------------------------------------
// [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions.
@@ -1901,44 +2243,110 @@ struct ImGuiIO
// Configuration // Default value
//------------------------------------------------------------------
- ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
+ ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Keyboard/Gamepad navigation options, etc.
ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend.
ImVec2 DisplaySize; // <unset> // Main display size, in pixels (generally == GetMainViewport()->Size). May change every frame.
float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. May change every frame.
float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds.
const char* IniFilename; // = "imgui.ini" // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions.
const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
- float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds.
- float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels.
- float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging.
- float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).
- float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds.
- float HoverDelayNormal; // = 0.30 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayNormal) returns true.
- float HoverDelayShort; // = 0.10 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayShort) returns true.
- void* UserData; // = NULL // Store your own data for retrieval by callbacks.
+ void* UserData; // = NULL // Store your own data.
+ // Font system
ImFontAtlas*Fonts; // <auto> // Font atlas: load, rasterize and pack one or more fonts into a single texture.
float FontGlobalScale; // = 1.0f // Global scale all fonts
- bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel.
+ bool FontAllowUserScaling; // = false // [OBSOLETE] Allow user scaling text of individual window with CTRL+Wheel.
ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0].
ImVec2 DisplayFramebufferScale; // = (1, 1) // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale.
+ // Keyboard/Gamepad Navigation options
+ bool ConfigNavSwapGamepadButtons; // = false // Swap Activate<>Cancel (A<>B) buttons, matching typical "Nintendo/Japanese style" gamepad layout.
+ bool ConfigNavMoveSetMousePos; // = false // Directional/tabbing navigation teleports the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is difficult. Will update io.MousePos and set io.WantSetMousePos=true.
+ bool ConfigNavCaptureKeyboard; // = true // Sets io.WantCaptureKeyboard when io.NavActive is set.
+ bool ConfigNavEscapeClearFocusItem; // = true // Pressing Escape can clear focused item + navigation id/highlight. Set to false if you want to always keep highlight on.
+ bool ConfigNavEscapeClearFocusWindow;// = false // Pressing Escape can clear focused window as well (super set of io.ConfigNavEscapeClearFocusItem).
+ bool ConfigNavCursorVisibleAuto; // = true // Using directional navigation key makes the cursor visible. Mouse click hides the cursor.
+ bool ConfigNavCursorVisibleAlways; // = false // Navigation cursor is always visible.
+
// Miscellaneous options
+ // (you can visualize and interact with all options in 'Demo->Configuration')
bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations.
- bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl.
+ bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // Swap Cmd<>Ctrl keys + OS X style text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl.
bool ConfigInputTrickleEventQueue; // = true // Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates.
bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting).
bool ConfigInputTextEnterKeepActive; // = false // [BETA] Pressing Enter will keep item active and select contents (single-line only).
bool ConfigDragClickToInputText; // = false // [BETA] Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). Not desirable on devices without a keyboard.
- bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag)
- bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar.
+ bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires ImGuiBackendFlags_HasMouseCursors for better mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag)
+ bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar.
+ bool ConfigWindowsCopyContentsWithCtrlC; // = false // [EXPERIMENTAL] CTRL+C copy the contents of focused window into the clipboard. Experimental because: (1) has known issues with nested Begin/End pairs (2) text output quality varies (3) text output is in submission order rather than spatial order.
+ bool ConfigScrollbarScrollByPage; // = true // Enable scrolling page by page when clicking outside the scrollbar grab. When disabled, always scroll to clicked location. When enabled, Shift+Click scrolls to clicked location.
float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable.
+ // Inputs Behaviors
+ // (other variables, ones which are expected to be tweaked within UI code, are exposed in ImGuiStyle)
+ float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds.
+ float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels.
+ float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging.
+ float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).
+ float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds.
+
+ //------------------------------------------------------------------
+ // Debug options
+ //------------------------------------------------------------------
+
+ // Options to configure Error Handling and how we handle recoverable errors [EXPERIMENTAL]
+ // - Error recovery is provided as a way to facilitate:
+ // - Recovery after a programming error (native code or scripting language - the later tends to facilitate iterating on code while running).
+ // - Recovery after running an exception handler or any error processing which may skip code after an error has been detected.
+ // - Error recovery is not perfect nor guaranteed! It is a feature to ease development.
+ // You not are not supposed to rely on it in the course of a normal application run.
+ // - Functions that support error recovery are using IM_ASSERT_USER_ERROR() instead of IM_ASSERT().
+ // - By design, we do NOT allow error recovery to be 100% silent. One of the three options needs to be checked!
+ // - Always ensure that on programmers seats you have at minimum Asserts or Tooltips enabled when making direct imgui API calls!
+ // Otherwise it would severely hinder your ability to catch and correct mistakes!
+ // Read https://github.com/ocornut/imgui/wiki/Error-Handling for details.
+ // - Programmer seats: keep asserts (default), or disable asserts and keep error tooltips (new and nice!)
+ // - Non-programmer seats: maybe disable asserts, but make sure errors are resurfaced (tooltips, visible log entries, use callback etc.)
+ // - Recovery after error/exception: record stack sizes with ErrorRecoveryStoreState(), disable assert, set log callback (to e.g. trigger high-level breakpoint), recover with ErrorRecoveryTryToRecoverState(), restore settings.
+ bool ConfigErrorRecovery; // = true // Enable error recovery support. Some errors won't be detected and lead to direct crashes if recovery is disabled.
+ bool ConfigErrorRecoveryEnableAssert; // = true // Enable asserts on recoverable error. By default call IM_ASSERT() when returning from a failing IM_ASSERT_USER_ERROR()
+ bool ConfigErrorRecoveryEnableDebugLog; // = true // Enable debug log output on recoverable errors.
+ bool ConfigErrorRecoveryEnableTooltip; // = true // Enable tooltip on recoverable errors. The tooltip include a way to enable asserts if they were disabled.
+
+ // Option to enable various debug tools showing buttons that will call the IM_DEBUG_BREAK() macro.
+ // - The Item Picker tool will be available regardless of this being enabled, in order to maximize its discoverability.
+ // - Requires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application.
+ // e.g. io.ConfigDebugIsDebuggerPresent = ::IsDebuggerPresent() on Win32, or refer to ImOsIsDebuggerPresent() imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version).
+ bool ConfigDebugIsDebuggerPresent; // = false // Enable various tools calling IM_DEBUG_BREAK().
+
+ // Tools to detect code submitting items with conflicting/duplicate IDs
+ // - Code should use PushID()/PopID() in loops, or append "##xx" to same-label identifiers.
+ // - Empty label e.g. Button("") == same ID as parent widget/node. Use Button("##xx") instead!
+ // - See FAQ https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#q-about-the-id-stack-system
+ bool ConfigDebugHighlightIdConflicts;// = true // Highlight and show an error message popup when multiple items have conflicting identifiers.
+ bool ConfigDebugHighlightIdConflictsShowItemPicker;//=true // Show "Item Picker" button in aforementioned popup.
+
+ // Tools to test correct Begin/End and BeginChild/EndChild behaviors.
+ // - Presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX()
+ // - This is inconsistent with other BeginXXX functions and create confusion for many users.
+ // - We expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior.
+ bool ConfigDebugBeginReturnValueOnce;// = false // First-time calls to Begin()/BeginChild() will return false. NEEDS TO BE SET AT APPLICATION BOOT TIME if you don't want to miss windows.
+ bool ConfigDebugBeginReturnValueLoop;// = false // Some calls to Begin()/BeginChild() will return false. Will cycle through window depths then repeat. Suggested use: add "io.ConfigDebugBeginReturnValue = io.KeyShift" in your main loop then occasionally press SHIFT. Windows should be flickering while running.
+
+ // Option to deactivate io.AddFocusEvent(false) handling.
+ // - May facilitate interactions with a debugger when focus loss leads to clearing inputs data.
+ // - Backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them.
+ bool ConfigDebugIgnoreFocusLoss; // = false // Ignore io.AddFocusEvent(false), consequently not calling io.ClearInputKeys()/io.ClearInputMouse() in input processing.
+
+ // Option to audit .ini data
+ bool ConfigDebugIniSettings; // = false // Save .ini data with extra comments (particularly helpful for Docking, but makes saving slower)
+
//------------------------------------------------------------------
- // Platform Functions
+ // Platform Identifiers
// (the imgui_impl_xxxx backend files are setting those up for you)
//------------------------------------------------------------------
+ // Nowadays those would be stored in ImGuiPlatformIO but we are leaving them here for legacy reasons.
// Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff.
const char* BackendPlatformName; // = NULL
const char* BackendRendererName; // = NULL
@@ -1946,21 +2354,6 @@ struct ImGuiIO
void* BackendRendererUserData; // = NULL // User data for renderer backend
void* BackendLanguageUserData; // = NULL // User data for non C++ programming language backend
- // Optional: Access OS clipboard
- // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
- const char* (*GetClipboardTextFn)(void* user_data);
- void (*SetClipboardTextFn)(void* user_data, const char* text);
- void* ClipboardUserData;
-
- // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows)
- // (default to use native imm32 api on Windows)
- void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data);
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- void* ImeWindowHandle; // = NULL // [Obsolete] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning.
-#else
- void* _UnusedPadding; // Unused field to keep data structure the same size.
-#endif
-
//------------------------------------------------------------------
// Input - Call before calling NewFrame()
//------------------------------------------------------------------
@@ -1970,7 +2363,8 @@ struct ImGuiIO
IMGUI_API void AddKeyAnalogEvent(ImGuiKey key, bool down, float v); // Queue a new key down/up event for analog values (e.g. ImGuiKey_Gamepad_ values). Dead-zones should be handled by the backend.
IMGUI_API void AddMousePosEvent(float x, float y); // Queue a mouse position update. Use -FLT_MAX,-FLT_MAX to signify no mouse (e.g. app not focused and not hovered)
IMGUI_API void AddMouseButtonEvent(int button, bool down); // Queue a mouse button change
- IMGUI_API void AddMouseWheelEvent(float wh_x, float wh_y); // Queue a mouse wheel update
+ IMGUI_API void AddMouseWheelEvent(float wheel_x, float wheel_y); // Queue a mouse wheel update. wheel_y<0: scroll down, wheel_y>0: scroll up, wheel_x<0: scroll right, wheel_x>0: scroll left.
+ IMGUI_API void AddMouseSourceEvent(ImGuiMouseSource source); // Queue a mouse source change (Mouse/TouchScreen/Pen)
IMGUI_API void AddFocusEvent(bool focused); // Queue a gain/loss of focus for the application (generally based on OS/platform focus of your window)
IMGUI_API void AddInputCharacter(unsigned int c); // Queue a new character input
IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue a new character input from a UTF-16 character, it can be a surrogate
@@ -1978,8 +2372,12 @@ struct ImGuiIO
IMGUI_API void SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index = -1); // [Optional] Specify index for legacy <1.87 IsKeyXXX() functions with native indices + specify native keycode, scancode.
IMGUI_API void SetAppAcceptingEvents(bool accepting_events); // Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen.
- IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually
- IMGUI_API void ClearInputKeys(); // [Internal] Release all keys
+ IMGUI_API void ClearEventsQueue(); // Clear all incoming events.
+ IMGUI_API void ClearInputKeys(); // Clear current keyboard/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons.
+ IMGUI_API void ClearInputMouse(); // Clear current mouse state.
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ IMGUI_API void ClearInputCharacters(); // [Obsoleted in 1.89.8] Clear the current frame text input buffer. Now included within ClearInputKeys().
+#endif
//------------------------------------------------------------------
// Output - Updated by NewFrame() or EndFrame()/Render()
@@ -1990,46 +2388,39 @@ struct ImGuiIO
bool WantCaptureMouse; // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.).
bool WantCaptureKeyboard; // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.).
bool WantTextInput; // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active).
- bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled.
+ bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when io.ConfigNavMoveSetMousePos is enabled.
bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving!
bool NavActive; // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag.
- bool NavVisible; // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events).
+ bool NavVisible; // Keyboard/Gamepad navigation highlight is visible and allowed (will handle ImGuiKey_NavXXX events).
float Framerate; // Estimate of application framerate (rolling average over 60 frames, based on io.DeltaTime), in frame per second. Solely for convenience. Slow applications may not want to use a moving average or may want to reset underlying buffers occasionally.
int MetricsRenderVertices; // Vertices output during last call to Render()
int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3
int MetricsRenderWindows; // Number of visible windows
int MetricsActiveWindows; // Number of active windows
- int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts.
ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta.
- // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame.
- // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent().
- // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space)
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512.
- bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow.
- float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums.
-#endif
-
//------------------------------------------------------------------
// [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed!
//------------------------------------------------------------------
+ ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).
+
// Main Input State
// (this block used to be written by backend, since 1.87 it is best to NOT write to those directly, call the AddXXX functions above instead)
// (reading from those variables is fair game, as they are extremely unlikely to be moving anywhere)
ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.)
bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Other buttons allow us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
- float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text.
- float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with a horizontal wheel, may not be filled by all backends.
+ float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text. >0 scrolls Up, <0 scrolls Down. Hold SHIFT to turn vertical scroll into horizontal scroll.
+ float MouseWheelH; // Mouse wheel Horizontal. >0 scrolls Left, <0 scrolls Right. Most users don't have a mouse with a horizontal wheel, may not be filled by all backends.
+ ImGuiMouseSource MouseSource; // Mouse actual input peripheral (Mouse/TouchScreen/Pen).
bool KeyCtrl; // Keyboard modifier down: Control
bool KeyShift; // Keyboard modifier down: Shift
bool KeyAlt; // Keyboard modifier down: Alt
bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows
// Other state maintained from data above + IO function calls
- ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags). Read-only, updated by NewFrame()
- ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this.
+ ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags. Read-only, updated by NewFrame()
+ ImGuiKeyData KeysData[ImGuiKey_NamedKey_COUNT];// Key state for all known keys. Use IsKeyXXX() functions to access this.
bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup.
ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid)
ImVec2 MouseClickedPos[5]; // Position at time of clicking
@@ -2039,30 +2430,49 @@ struct ImGuiIO
ImU16 MouseClickedCount[5]; // == 0 (not clicked), == 1 (same as MouseClicked[]), == 2 (double-clicked), == 3 (triple-clicked) etc. when going from !Down to Down
ImU16 MouseClickedLastCount[5]; // Count successive number of clicks. Stays valid after mouse release. Reset after another click is done.
bool MouseReleased[5]; // Mouse button went from Down to !Down
+ double MouseReleasedTime[5]; // Time of last released (rarely used! but useful to handle delayed single-click when trying to disambiguate them from double-click).
bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds.
bool MouseDownOwnedUnlessPopupClose[5]; // Track if button was clicked inside a dear imgui window.
+ bool MouseWheelRequestAxisSwap; // On a non-Mac system, holding SHIFT requests WheelY to perform the equivalent of a WheelX event. On a Mac system this is already enforced by the system.
+ bool MouseCtrlLeftAsRightClick; // (OSX) Set to true when the current click was a Ctrl+click that spawned a simulated right click
float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked)
float MouseDownDurationPrev[5]; // Previous time the mouse button has been down
float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point (used for moving thresholds)
float PenPressure; // Touch/Pen pressure (0.0f to 1.0f, should be >0.0f only when MouseDown[0] == true). Helper storage currently unused by Dear ImGui.
bool AppFocusLost; // Only modify via AddFocusEvent()
bool AppAcceptingEvents; // Only modify via SetAppAcceptingEvents()
- ImS8 BackendUsingLegacyKeyArrays; // -1: unknown, 0: using AddKeyEvent(), 1: using legacy io.KeysDown[]
- bool BackendUsingLegacyNavInputArray; // 0: using AddKeyAnalogEvent(), 1: writing to legacy io.NavInputs[] directly
ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16()
ImVector<ImWchar> InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper.
+ // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame.
+ // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent().
+ // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space)
+ // Old (<1.87): ImGui::IsKeyPressed(MYPLATFORM_KEY_SPACE) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space)
+ // Read https://github.com/ocornut/imgui/issues/4921 for details.
+ //int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512.
+ //bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow.
+ //float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums.
+ //void* ImeWindowHandle; // [Obsoleted in 1.87] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning.
+
+ // Legacy: before 1.91.1, clipboard functions were stored in ImGuiIO instead of ImGuiPlatformIO.
+ // As this is will affect all users of custom engines/backends, we are providing proper legacy redirection (will obsolete).
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ const char* (*GetClipboardTextFn)(void* user_data);
+ void (*SetClipboardTextFn)(void* user_data, const char* text);
+ void* ClipboardUserData;
+#endif
+
IMGUI_API ImGuiIO();
};
//-----------------------------------------------------------------------------
-// [SECTION] Misc data structures
+// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload)
//-----------------------------------------------------------------------------
// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used.
// The callback function should return 0 by default.
// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details)
-// - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
+// - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit. Note that InputText() already returns true on edit + you can always use IsItemEdited(). The callback is useful to manipulate the underlying buffer while focus is active.
// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration
// - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB
// - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows
@@ -2070,11 +2480,14 @@ struct ImGuiIO
// - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow.
struct ImGuiInputTextCallbackData
{
+ ImGuiContext* Ctx; // Parent UI context
ImGuiInputTextFlags EventFlag; // One ImGuiInputTextFlags_Callback* // Read-only
ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only
void* UserData; // What user passed to InputText() // Read-only
// Arguments for the different callback events
+ // - During Resize callback, Buf will be same as your input buffer.
+ // - However, during Completion/History/Always callback, Buf always points to our own internal data (it is not the same as your buffer)! Changes to it will be reflected into your own buffer shortly after the callback.
// - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary.
// - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state.
ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0;
@@ -2129,32 +2542,8 @@ struct ImGuiPayload
bool IsDelivery() const { return Delivery; }
};
-// Sorting specification for one column of a table (sizeof == 12 bytes)
-struct ImGuiTableColumnSortSpecs
-{
- ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call)
- ImS16 ColumnIndex; // Index of the column
- ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here)
- ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function)
-
- ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); }
-};
-
-// Sorting specifications for a table (often handling sort specs for a single column, occasionally more)
-// Obtained by calling TableGetSortSpecs().
-// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time.
-// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame!
-struct ImGuiTableSortSpecs
-{
- const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array.
- int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled.
- bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag.
-
- ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); }
-};
-
//-----------------------------------------------------------------------------
-// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)
+// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor)
//-----------------------------------------------------------------------------
// Helper: Unicode defines
@@ -2210,10 +2599,11 @@ struct ImGuiTextBuffer
ImGuiTextBuffer() { }
inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; }
- const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator
+ const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator
int size() const { return Buf.Size ? Buf.Size - 1 : 0; }
bool empty() const { return Buf.Size <= 1; }
void clear() { Buf.clear(); }
+ void resize(int size) { if (Buf.Size > size) Buf.Data[size] = 0; Buf.resize(size ? size + 1 : 0, 0); } // Similar to resize(0) on ImVector: empty string but don't free buffer.
void reserve(int capacity) { Buf.reserve(capacity); }
const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; }
IMGUI_API void append(const char* str, const char* str_end = NULL);
@@ -2221,6 +2611,16 @@ struct ImGuiTextBuffer
IMGUI_API void appendfv(const char* fmt, va_list args) IM_FMTLIST(2);
};
+// [Internal] Key+Value for ImGuiStorage
+struct ImGuiStoragePair
+{
+ ImGuiID key;
+ union { int val_i; float val_f; void* val_p; };
+ ImGuiStoragePair(ImGuiID _key, int _val) { key = _key; val_i = _val; }
+ ImGuiStoragePair(ImGuiID _key, float _val) { key = _key; val_f = _val; }
+ ImGuiStoragePair(ImGuiID _key, void* _val) { key = _key; val_p = _val; }
+};
+
// Helper: Key->Value storage
// Typically you don't have to worry about this since a storage is held within each Window.
// We use it to e.g. store collapse state for a tree (Int 0/1)
@@ -2232,15 +2632,6 @@ struct ImGuiTextBuffer
struct ImGuiStorage
{
// [Internal]
- struct ImGuiStoragePair
- {
- ImGuiID key;
- union { int val_i; float val_f; void* val_p; };
- ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; }
- ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
- ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
- };
-
ImVector<ImGuiStoragePair> Data;
// - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
@@ -2265,11 +2656,14 @@ struct ImGuiStorage
IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f);
IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL);
- // Use on your own storage if you know only integer are being stored (open/close all tree nodes)
+ // Advanced: for quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
+ IMGUI_API void BuildSortByKey();
+ // Obsolete: use on your own storage if you know only integer are being stored (open/close all tree nodes)
IMGUI_API void SetAllInt(int val);
- // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.
- IMGUI_API void BuildSortByKey();
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ //typedef ::ImGuiStoragePair ImGuiStoragePair; // 1.90.8: moved type outside struct
+#endif
};
// Helper: Manually clip large list of items.
@@ -2294,14 +2688,16 @@ struct ImGuiStorage
// - The clipper also handles various subtleties related to keyboard/gamepad navigation, wrapping etc.
struct ImGuiListClipper
{
+ ImGuiContext* Ctx; // Parent UI context
int DisplayStart; // First item to display, updated by each call to Step()
int DisplayEnd; // End of items to display (exclusive)
int ItemsCount; // [Internal] Number of items
float ItemsHeight; // [Internal] Height of item after a first step and item submission can calculate it
float StartPosY; // [Internal] Cursor position at the time of Begin() or after table frozen rows are all processed
+ double StartSeekOffsetY; // [Internal] Account for frozen rows in a table and initial loss of precision in very large windows.
void* TempData; // [Internal] Internal data
- // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step)
+ // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step, and you can call SeekCursorForItem() manually if you need)
// items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing().
IMGUI_API ImGuiListClipper();
IMGUI_API ~ImGuiListClipper();
@@ -2309,16 +2705,57 @@ struct ImGuiListClipper
IMGUI_API void End(); // Automatically called on the last call of Step() that returns false.
IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items.
- // Call ForceDisplayRangeByIndices() before first call to Step() if you need a range of items to be displayed regardless of visibility.
- IMGUI_API void ForceDisplayRangeByIndices(int item_min, int item_max); // item_max is exclusive e.g. use (42, 42+1) to make item 42 always visible BUT due to alignment/padding of certain items it is likely that an extra item may be included on either end of the display range.
+ // Call IncludeItemByIndex() or IncludeItemsByIndex() *BEFORE* first call to Step() if you need a range of items to not be clipped, regardless of their visibility.
+ // (Due to alignment / padding of certain items it is possible that an extra item may be included on either end of the display range).
+ inline void IncludeItemByIndex(int item_index) { IncludeItemsByIndex(item_index, item_index + 1); }
+ IMGUI_API void IncludeItemsByIndex(int item_begin, int item_end); // item_end is exclusive e.g. use (42, 42+1) to make item 42 never clipped.
+
+ // Seek cursor toward given item. This is automatically called while stepping.
+ // - The only reason to call this is: you can use ImGuiListClipper::Begin(INT_MAX) if you don't know item count ahead of time.
+ // - In this case, after all steps are done, you'll want to call SeekCursorForItem(item_count).
+ IMGUI_API void SeekCursorForItem(int item_index);
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79]
+ inline void IncludeRangeByIndices(int item_begin, int item_end) { IncludeItemsByIndex(item_begin, item_end); } // [renamed in 1.89.9]
+ inline void ForceDisplayRangeByIndices(int item_begin, int item_end) { IncludeItemsByIndex(item_begin, item_end); } // [renamed in 1.89.6]
+ //inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79]
#endif
};
+// Helpers: ImVec2/ImVec4 operators
+// - It is important that we are keeping those disabled by default so they don't leak in user space.
+// - This is in order to allow user enabling implicit cast operators between ImVec2/ImVec4 and their own types (using IM_VEC2_CLASS_EXTRA in imconfig.h)
+// - Add '#define IMGUI_DEFINE_MATH_OPERATORS' before including this file (or in imconfig.h) to access courtesy maths operators for ImVec2 and ImVec4.
+// - We intentionally provide ImVec2*float but not float*ImVec2: this is rare enough and we want to reduce the surface for possible user mistake.
+#ifdef IMGUI_DEFINE_MATH_OPERATORS
+#define IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED
+IM_MSVC_RUNTIME_CHECKS_OFF
+static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); }
+static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); }
+static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); }
+static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); }
+static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
+static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); }
+static inline ImVec2 operator-(const ImVec2& lhs) { return ImVec2(-lhs.x, -lhs.y); }
+static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
+static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
+static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
+static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
+static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; }
+static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; }
+static inline bool operator==(const ImVec2& lhs, const ImVec2& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y; }
+static inline bool operator!=(const ImVec2& lhs, const ImVec2& rhs) { return lhs.x != rhs.x || lhs.y != rhs.y; }
+static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); }
+static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); }
+static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); }
+static inline bool operator==(const ImVec4& lhs, const ImVec4& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w; }
+static inline bool operator!=(const ImVec4& lhs, const ImVec4& rhs) { return lhs.x != rhs.x || lhs.y != rhs.y || lhs.z != rhs.z || lhs.w != rhs.w; }
+IM_MSVC_RUNTIME_CHECKS_RESTORE
+#endif
+
// Helpers macros to generate 32-bit encoded colors
-// User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file.
+// - User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file.
+// - Any setting other than the default will need custom backend support. The only standard backend that supports anything else than the default is DirectX9.
#ifndef IM_COL32_R_SHIFT
#ifdef IMGUI_USE_BGRA_PACKED_COLOR
#define IM_COL32_R_SHIFT 16
@@ -2350,8 +2787,8 @@ struct ImColor
constexpr ImColor() { }
constexpr ImColor(float r, float g, float b, float a = 1.0f) : Value(r, g, b, a) { }
constexpr ImColor(const ImVec4& col) : Value(col) {}
- ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f / 255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; }
- ImColor(ImU32 rgba) { float sc = 1.0f / 255.0f; Value.x = (float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; }
+ constexpr ImColor(int r, int g, int b, int a = 255) : Value((float)r * (1.0f / 255.0f), (float)g * (1.0f / 255.0f), (float)b * (1.0f / 255.0f), (float)a* (1.0f / 255.0f)) {}
+ constexpr ImColor(ImU32 rgba) : Value((float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * (1.0f / 255.0f)) {}
inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); }
inline operator ImVec4() const { return Value; }
@@ -2361,13 +2798,168 @@ struct ImColor
};
//-----------------------------------------------------------------------------
+// [SECTION] Multi-Select API flags and structures (ImGuiMultiSelectFlags, ImGuiSelectionRequestType, ImGuiSelectionRequest, ImGuiMultiSelectIO, ImGuiSelectionBasicStorage)
+//-----------------------------------------------------------------------------
+
+// Multi-selection system
+// Documentation at: https://github.com/ocornut/imgui/wiki/Multi-Select
+// - Refer to 'Demo->Widgets->Selection State & Multi-Select' for demos using this.
+// - This system implements standard multi-selection idioms (CTRL+Mouse/Keyboard, SHIFT+Mouse/Keyboard, etc)
+// with support for clipper (skipping non-visible items), box-select and many other details.
+// - Selectable(), Checkbox() are supported but custom widgets may use it as well.
+// - TreeNode() is technically supported but... using this correctly is more complicated: you need some sort of linear/random access to your tree,
+// which is suited to advanced trees setups also implementing filters and clipper. We will work toward simplifying and demoing it.
+// - In the spirit of Dear ImGui design, your code owns actual selection data.
+// This is designed to allow all kinds of selection storage you may use in your application e.g. set/map/hash.
+// About ImGuiSelectionBasicStorage:
+// - This is an optional helper to store a selection state and apply selection requests.
+// - It is used by our demos and provided as a convenience to quickly implement multi-selection.
+// Usage:
+// - Identify submitted items with SetNextItemSelectionUserData(), most likely using an index into your current data-set.
+// - Store and maintain actual selection data using persistent object identifiers.
+// - Usage flow:
+// BEGIN - (1) Call BeginMultiSelect() and retrieve the ImGuiMultiSelectIO* result.
+// - (2) Honor request list (SetAll/SetRange requests) by updating your selection data. Same code as Step 6.
+// - (3) [If using clipper] You need to make sure RangeSrcItem is always submitted. Calculate its index and pass to clipper.IncludeItemByIndex(). If storing indices in ImGuiSelectionUserData, a simple clipper.IncludeItemByIndex(ms_io->RangeSrcItem) call will work.
+// LOOP - (4) Submit your items with SetNextItemSelectionUserData() + Selectable()/TreeNode() calls.
+// END - (5) Call EndMultiSelect() and retrieve the ImGuiMultiSelectIO* result.
+// - (6) Honor request list (SetAll/SetRange requests) by updating your selection data. Same code as Step 2.
+// If you submit all items (no clipper), Step 2 and 3 are optional and will be handled by each item themselves. It is fine to always honor those steps.
+// About ImGuiSelectionUserData:
+// - This can store an application-defined identifier (e.g. index or pointer) submitted via SetNextItemSelectionUserData().
+// - In return we store them into RangeSrcItem/RangeFirstItem/RangeLastItem and other fields in ImGuiMultiSelectIO.
+// - Most applications will store an object INDEX, hence the chosen name and type. Storing an index is natural, because
+// SetRange requests will give you two end-points and you will need to iterate/interpolate between them to update your selection.
+// - However it is perfectly possible to store a POINTER or another IDENTIFIER inside ImGuiSelectionUserData.
+// Our system never assume that you identify items by indices, it never attempts to interpolate between two values.
+// - If you enable ImGuiMultiSelectFlags_NoRangeSelect then it is guaranteed that you will never have to interpolate
+// between two ImGuiSelectionUserData, which may be a convenient way to use part of the feature with less code work.
+// - As most users will want to store an index, for convenience and to reduce confusion we use ImS64 instead of void*,
+// being syntactically easier to downcast. Feel free to reinterpret_cast and store a pointer inside.
+
+// Flags for BeginMultiSelect()
+enum ImGuiMultiSelectFlags_
+{
+ ImGuiMultiSelectFlags_None = 0,
+ ImGuiMultiSelectFlags_SingleSelect = 1 << 0, // Disable selecting more than one item. This is available to allow single-selection code to share same code/logic if desired. It essentially disables the main purpose of BeginMultiSelect() tho!
+ ImGuiMultiSelectFlags_NoSelectAll = 1 << 1, // Disable CTRL+A shortcut to select all.
+ ImGuiMultiSelectFlags_NoRangeSelect = 1 << 2, // Disable Shift+selection mouse/keyboard support (useful for unordered 2D selection). With BoxSelect is also ensure contiguous SetRange requests are not combined into one. This allows not handling interpolation in SetRange requests.
+ ImGuiMultiSelectFlags_NoAutoSelect = 1 << 3, // Disable selecting items when navigating (useful for e.g. supporting range-select in a list of checkboxes).
+ ImGuiMultiSelectFlags_NoAutoClear = 1 << 4, // Disable clearing selection when navigating or selecting another one (generally used with ImGuiMultiSelectFlags_NoAutoSelect. useful for e.g. supporting range-select in a list of checkboxes).
+ ImGuiMultiSelectFlags_NoAutoClearOnReselect = 1 << 5, // Disable clearing selection when clicking/selecting an already selected item.
+ ImGuiMultiSelectFlags_BoxSelect1d = 1 << 6, // Enable box-selection with same width and same x pos items (e.g. full row Selectable()). Box-selection works better with little bit of spacing between items hit-box in order to be able to aim at empty space.
+ ImGuiMultiSelectFlags_BoxSelect2d = 1 << 7, // Enable box-selection with varying width or varying x pos items support (e.g. different width labels, or 2D layout/grid). This is slower: alters clipping logic so that e.g. horizontal movements will update selection of normally clipped items.
+ ImGuiMultiSelectFlags_BoxSelectNoScroll = 1 << 8, // Disable scrolling when box-selecting near edges of scope.
+ ImGuiMultiSelectFlags_ClearOnEscape = 1 << 9, // Clear selection when pressing Escape while scope is focused.
+ ImGuiMultiSelectFlags_ClearOnClickVoid = 1 << 10, // Clear selection when clicking on empty location within scope.
+ ImGuiMultiSelectFlags_ScopeWindow = 1 << 11, // Scope for _BoxSelect and _ClearOnClickVoid is whole window (Default). Use if BeginMultiSelect() covers a whole window or used a single time in same window.
+ ImGuiMultiSelectFlags_ScopeRect = 1 << 12, // Scope for _BoxSelect and _ClearOnClickVoid is rectangle encompassing BeginMultiSelect()/EndMultiSelect(). Use if BeginMultiSelect() is called multiple times in same window.
+ ImGuiMultiSelectFlags_SelectOnClick = 1 << 13, // Apply selection on mouse down when clicking on unselected item. (Default)
+ ImGuiMultiSelectFlags_SelectOnClickRelease = 1 << 14, // Apply selection on mouse release when clicking an unselected item. Allow dragging an unselected item without altering selection.
+ //ImGuiMultiSelectFlags_RangeSelect2d = 1 << 15, // Shift+Selection uses 2d geometry instead of linear sequence, so possible to use Shift+up/down to select vertically in grid. Analogous to what BoxSelect does.
+ ImGuiMultiSelectFlags_NavWrapX = 1 << 16, // [Temporary] Enable navigation wrapping on X axis. Provided as a convenience because we don't have a design for the general Nav API for this yet. When the more general feature be public we may obsolete this flag in favor of new one.
+};
+
+// Main IO structure returned by BeginMultiSelect()/EndMultiSelect().
+// This mainly contains a list of selection requests.
+// - Use 'Demo->Tools->Debug Log->Selection' to see requests as they happen.
+// - Some fields are only useful if your list is dynamic and allows deletion (getting post-deletion focus/state right is shown in the demo)
+// - Below: who reads/writes each fields? 'r'=read, 'w'=write, 'ms'=multi-select code, 'app'=application/user code.
+struct ImGuiMultiSelectIO
+{
+ //------------------------------------------// BeginMultiSelect / EndMultiSelect
+ ImVector<ImGuiSelectionRequest> Requests; // ms:w, app:r / ms:w app:r // Requests to apply to your selection data.
+ ImGuiSelectionUserData RangeSrcItem; // ms:w app:r / // (If using clipper) Begin: Source item (often the first selected item) must never be clipped: use clipper.IncludeItemByIndex() to ensure it is submitted.
+ ImGuiSelectionUserData NavIdItem; // ms:w, app:r / // (If using deletion) Last known SetNextItemSelectionUserData() value for NavId (if part of submitted items).
+ bool NavIdSelected; // ms:w, app:r / app:r // (If using deletion) Last known selection state for NavId (if part of submitted items).
+ bool RangeSrcReset; // app:w / ms:r // (If using deletion) Set before EndMultiSelect() to reset ResetSrcItem (e.g. if deleted selection).
+ int ItemsCount; // ms:w, app:r / app:r // 'int items_count' parameter to BeginMultiSelect() is copied here for convenience, allowing simpler calls to your ApplyRequests handler. Not used internally.
+};
+
+// Selection request type
+enum ImGuiSelectionRequestType
+{
+ ImGuiSelectionRequestType_None = 0,
+ ImGuiSelectionRequestType_SetAll, // Request app to clear selection (if Selected==false) or select all items (if Selected==true). We cannot set RangeFirstItem/RangeLastItem as its contents is entirely up to user (not necessarily an index)
+ ImGuiSelectionRequestType_SetRange, // Request app to select/unselect [RangeFirstItem..RangeLastItem] items (inclusive) based on value of Selected. Only EndMultiSelect() request this, app code can read after BeginMultiSelect() and it will always be false.
+};
+
+// Selection request item
+struct ImGuiSelectionRequest
+{
+ //------------------------------------------// BeginMultiSelect / EndMultiSelect
+ ImGuiSelectionRequestType Type; // ms:w, app:r / ms:w, app:r // Request type. You'll most often receive 1 Clear + 1 SetRange with a single-item range.
+ bool Selected; // ms:w, app:r / ms:w, app:r // Parameter for SetAll/SetRange requests (true = select, false = unselect)
+ ImS8 RangeDirection; // / ms:w app:r // Parameter for SetRange request: +1 when RangeFirstItem comes before RangeLastItem, -1 otherwise. Useful if you want to preserve selection order on a backward Shift+Click.
+ ImGuiSelectionUserData RangeFirstItem; // / ms:w, app:r // Parameter for SetRange request (this is generally == RangeSrcItem when shift selecting from top to bottom).
+ ImGuiSelectionUserData RangeLastItem; // / ms:w, app:r // Parameter for SetRange request (this is generally == RangeSrcItem when shift selecting from bottom to top). Inclusive!
+};
+
+// Optional helper to store multi-selection state + apply multi-selection requests.
+// - Used by our demos and provided as a convenience to easily implement basic multi-selection.
+// - Iterate selection with 'void* it = NULL; ImGuiID id; while (selection.GetNextSelectedItem(&it, &id)) { ... }'
+// Or you can check 'if (Contains(id)) { ... }' for each possible object if their number is not too high to iterate.
+// - USING THIS IS NOT MANDATORY. This is only a helper and not a required API.
+// To store a multi-selection, in your application you could:
+// - Use this helper as a convenience. We use our simple key->value ImGuiStorage as a std::set<ImGuiID> replacement.
+// - Use your own external storage: e.g. std::set<MyObjectId>, std::vector<MyObjectId>, interval trees, intrusively stored selection etc.
+// In ImGuiSelectionBasicStorage we:
+// - always use indices in the multi-selection API (passed to SetNextItemSelectionUserData(), retrieved in ImGuiMultiSelectIO)
+// - use the AdapterIndexToStorageId() indirection layer to abstract how persistent selection data is derived from an index.
+// - use decently optimized logic to allow queries and insertion of very large selection sets.
+// - do not preserve selection order.
+// Many combinations are possible depending on how you prefer to store your items and how you prefer to store your selection.
+// Large applications are likely to eventually want to get rid of this indirection layer and do their own thing.
+// See https://github.com/ocornut/imgui/wiki/Multi-Select for details and pseudo-code using this helper.
+struct ImGuiSelectionBasicStorage
+{
+ // Members
+ int Size; // // Number of selected items, maintained by this helper.
+ bool PreserveOrder; // = false // GetNextSelectedItem() will return ordered selection (currently implemented by two additional sorts of selection. Could be improved)
+ void* UserData; // = NULL // User data for use by adapter function // e.g. selection.UserData = (void*)my_items;
+ ImGuiID (*AdapterIndexToStorageId)(ImGuiSelectionBasicStorage* self, int idx); // e.g. selection.AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage* self, int idx) { return ((MyItems**)self->UserData)[idx]->ID; };
+ int _SelectionOrder;// [Internal] Increasing counter to store selection order
+ ImGuiStorage _Storage; // [Internal] Selection set. Think of this as similar to e.g. std::set<ImGuiID>. Prefer not accessing directly: iterate with GetNextSelectedItem().
+
+ // Methods
+ IMGUI_API ImGuiSelectionBasicStorage();
+ IMGUI_API void ApplyRequests(ImGuiMultiSelectIO* ms_io); // Apply selection requests coming from BeginMultiSelect() and EndMultiSelect() functions. It uses 'items_count' passed to BeginMultiSelect()
+ IMGUI_API bool Contains(ImGuiID id) const; // Query if an item id is in selection.
+ IMGUI_API void Clear(); // Clear selection
+ IMGUI_API void Swap(ImGuiSelectionBasicStorage& r); // Swap two selections
+ IMGUI_API void SetItemSelected(ImGuiID id, bool selected); // Add/remove an item from selection (generally done by ApplyRequests() function)
+ IMGUI_API bool GetNextSelectedItem(void** opaque_it, ImGuiID* out_id); // Iterate selection with 'void* it = NULL; ImGuiID id; while (selection.GetNextSelectedItem(&it, &id)) { ... }'
+ inline ImGuiID GetStorageIdFromIndex(int idx) { return AdapterIndexToStorageId(this, idx); } // Convert index to item id based on provided adapter.
+};
+
+// Optional helper to apply multi-selection requests to existing randomly accessible storage.
+// Convenient if you want to quickly wire multi-select API on e.g. an array of bool or items storing their own selection state.
+struct ImGuiSelectionExternalStorage
+{
+ // Members
+ void* UserData; // User data for use by adapter function // e.g. selection.UserData = (void*)my_items;
+ void (*AdapterSetItemSelected)(ImGuiSelectionExternalStorage* self, int idx, bool selected); // e.g. AdapterSetItemSelected = [](ImGuiSelectionExternalStorage* self, int idx, bool selected) { ((MyItems**)self->UserData)[idx]->Selected = selected; }
+
+ // Methods
+ IMGUI_API ImGuiSelectionExternalStorage();
+ IMGUI_API void ApplyRequests(ImGuiMultiSelectIO* ms_io); // Apply selection requests by using AdapterSetItemSelected() calls
+};
+
+//-----------------------------------------------------------------------------
// [SECTION] Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)
// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.
//-----------------------------------------------------------------------------
// The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking.
#ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX
-#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX (63)
+#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX (32)
+#endif
+
+// ImDrawIdx: vertex index. [Compile-time configurable type]
+// - To use 16-bit indices + allow large meshes: backend need to set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset (recommended).
+// - To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in your imconfig.h file.
+#ifndef ImDrawIdx
+typedef unsigned short ImDrawIdx; // Default: 16-bit (for maximum compatibility with renderer backends)
#endif
// ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h]
@@ -2383,9 +2975,9 @@ typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* c
// Special Draw callback value to request renderer backend to reset the graphics/render state.
// The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address.
-// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored.
-// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call).
-#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1)
+// This is useful, for example, if you submitted callbacks which you know have altered the render state and you want it to be restored.
+// Render state is not reset by default because they are many perfectly useful way of altering render state (e.g. changing shader/blending settings before an Image call).
+#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-8)
// Typically, 1 command = 1 GPU draw call (unless command is a callback)
// - VtxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled,
@@ -2400,9 +2992,11 @@ struct ImDrawCmd
unsigned int IdxOffset; // 4 // Start offset in index buffer.
unsigned int ElemCount; // 4 // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[].
ImDrawCallback UserCallback; // 4-8 // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
- void* UserCallbackData; // 4-8 // The draw callback code can access this.
+ void* UserCallbackData; // 4-8 // Callback user data (when UserCallback != NULL). If called AddCallback() with size == 0, this is a copy of the AddCallback() argument. If called AddCallback() with size > 0, this is pointing to a buffer where data is stored.
+ int UserCallbackDataSize; // 4 // Size of callback user data when using storage, otherwise 0.
+ int UserCallbackDataOffset;// 4 // [Internal] Offset of callback user data when using storage, otherwise -1.
- ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed
+ ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed
// Since 1.83: returns ImTextureID associated with this draw call. Warning: DO NOT assume this is always same as 'TextureId' (we will change this function for an upcoming feature)
inline ImTextureID GetTexID() const { return TextureId; }
@@ -2439,7 +3033,6 @@ struct ImDrawChannel
ImVector<ImDrawIdx> _IdxBuffer;
};
-
// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order.
// This is used by the Columns/Tables API, so items of each column can be batched together in a same draw call.
struct ImDrawListSplitter
@@ -2495,7 +3088,7 @@ enum ImDrawListFlags_
// access the current window draw list and draw custom primitives.
// You can interleave normal ImGui:: calls and adding primitives to the current draw list.
// In single viewport mode, top-left is == GetMainViewport()->Pos (generally 0,0), bottom-right is == GetMainViewport()->Pos+Size (generally io.DisplaySize).
-// You are totally free to apply whatever transformation matrix to want to the data (depending on the use of the transformation you may want to apply it to ClipRect as well!)
+// You are totally free to apply whatever transformation matrix you want to the data (depending on the use of the transformation you may want to apply it to ClipRect as well!)
// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects.
struct ImDrawList
{
@@ -2508,20 +3101,22 @@ struct ImDrawList
// [Internal, used while building lists]
unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0.
ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context)
- const char* _OwnerName; // Pointer to owner window's name for debugging
ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
- ImVector<ImVec4> _ClipRectStack; // [Internal]
- ImVector<ImTextureID> _TextureIdStack; // [Internal]
ImVector<ImVec2> _Path; // [Internal] current path building
ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back().
ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!)
+ ImVector<ImVec4> _ClipRectStack; // [Internal]
+ ImVector<ImTextureID> _TextureIdStack; // [Internal]
+ ImVector<ImU8> _CallbacksDataBuf; // [Internal]
float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content
+ const char* _OwnerName; // Pointer to owner window's name for debugging
- // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
- ImDrawList(ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; }
+ // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData().
+ // (advanced: you may create and use your own ImDrawListSharedData so you can use ImDrawList without ImGui, but that's more involved)
+ IMGUI_API ImDrawList(ImDrawListSharedData* shared_data);
+ IMGUI_API ~ImDrawList();
- ~ImDrawList() { _ClearFreeMemory(); }
IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
IMGUI_API void PushClipRectFullScreen();
IMGUI_API void PopClipRect();
@@ -2549,13 +3144,20 @@ struct ImDrawList
IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0);
IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f);
IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
+ IMGUI_API void AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f);
+ IMGUI_API void AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0);
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
- IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
- IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness);
- IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col);
+ IMGUI_API void AddText(ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points)
IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points)
+ // General polygon
+ // - Only simple polygons are supported by filling functions (no self-intersections, no holes).
+ // - Concave polygon fill is more expensive than convex one: it has O(N^2) complexity. Provided as a convenience for the user but not used by the main library.
+ IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness);
+ IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col);
+ IMGUI_API void AddConcavePolyFilled(const ImVec2* points, int num_points, ImU32 col);
+
// Image primitives
// - Read FAQ to understand what ImTextureID is.
// - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle.
@@ -2565,27 +3167,40 @@ struct ImDrawList
IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0);
// Stateful path API, add points then finish with PathFillConvex() or PathStroke()
- // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing.
+ // - Important: filled shapes must always use clockwise winding order! The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing.
+ // so e.g. 'PathArcTo(center, radius, PI * -0.5f, PI)' is ok, whereas 'PathArcTo(center, radius, PI, PI * -0.5f)' won't have correct anti-aliasing when followed by PathFillConvex().
inline void PathClear() { _Path.Size = 0; }
inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); }
inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; }
+ inline void PathFillConcave(ImU32 col) { AddConcavePolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; }
inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; }
IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0);
IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle
+ IMGUI_API void PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments = 0); // Ellipse
IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points)
IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points)
IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0);
- // Advanced
- IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles.
+ // Advanced: Draw Callbacks
+ // - May be used to alter render state (change sampler, blending, current shader). May be used to emit custom rendering commands (difficult to do correctly, but possible).
+ // - Use special ImDrawCallback_ResetRenderState callback to instruct backend to reset its render state to the default.
+ // - Your rendering loop must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles. All standard backends are honoring this.
+ // - For some backends, the callback may access selected render-states exposed by the backend in a ImGui_ImplXXXX_RenderState structure pointed to by platform_io.Renderer_RenderState.
+ // - IMPORTANT: please be mindful of the different level of indirection between using size==0 (copying argument) and using size>0 (copying pointed data into a buffer).
+ // - If userdata_size == 0: we copy/store the 'userdata' argument as-is. It will be available unmodified in ImDrawCmd::UserCallbackData during render.
+ // - If userdata_size > 0, we copy/store 'userdata_size' bytes pointed to by 'userdata'. We store them in a buffer stored inside the drawlist. ImDrawCmd::UserCallbackData will point inside that buffer so you have to retrieve data from there. Your callback may need to use ImDrawCmd::UserCallbackDataSize if you expect dynamically-sized data.
+ // - Support for userdata_size > 0 was added in v1.91.4, October 2024. So earlier code always only allowed to copy/store a simple void*.
+ IMGUI_API void AddCallback(ImDrawCallback callback, void* userdata, size_t userdata_size = 0);
+
+ // Advanced: Miscellaneous
IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible
IMGUI_API ImDrawList* CloneOutput() const; // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer.
// Advanced: Channels
// - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives)
// - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end)
- // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place!
+ // - This API shouldn't have been in ImDrawList in the first place!
// Prefer using your own persistent instance of ImDrawListSplitter as you can stack them.
// Using the ImDrawList::ChannelsXXXX you cannot stack a split over another.
inline void ChannelsSplit(int count) { _Splitter.Split(this, count); }
@@ -2604,10 +3219,12 @@ struct ImDrawList
inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; }
inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
- inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
-#endif
+ // Obsolete names
+ //inline void AddEllipse(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f) { AddEllipse(center, ImVec2(radius_x, radius_y), col, rot, num_segments, thickness); } // OBSOLETED in 1.90.5 (Mar 2024)
+ //inline void AddEllipseFilled(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0) { AddEllipseFilled(center, ImVec2(radius_x, radius_y), col, rot, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024)
+ //inline void PathEllipticalArcTo(const ImVec2& center, float radius_x, float radius_y, float rot, float a_min, float a_max, int num_segments = 0) { PathEllipticalArcTo(center, ImVec2(radius_x, radius_y), rot, a_min, a_max, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024)
+ //inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
+ //inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
// [Internal helpers]
IMGUI_API void _ResetForNewFrame();
@@ -2617,6 +3234,7 @@ struct ImDrawList
IMGUI_API void _OnChangedClipRect();
IMGUI_API void _OnChangedTextureID();
IMGUI_API void _OnChangedVtxOffset();
+ IMGUI_API void _SetTextureID(ImTextureID texture_id);
IMGUI_API int _CalcCircleAutoSegmentCount(float radius) const;
IMGUI_API void _PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step);
IMGUI_API void _PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments);
@@ -2627,18 +3245,20 @@ struct ImDrawList
// as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList)
struct ImDrawData
{
- bool Valid; // Only valid after Render() is called and before the next NewFrame() is called.
- int CmdListsCount; // Number of ImDrawList* to render
- int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size
- int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size
- ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here.
- ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications)
- ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications)
- ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display.
+ bool Valid; // Only valid after Render() is called and before the next NewFrame() is called.
+ int CmdListsCount; // Number of ImDrawList* to render (should always be == CmdLists.size)
+ int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size
+ int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size
+ ImVector<ImDrawList*> CmdLists; // Array of ImDrawList* to render. The ImDrawLists are owned by ImGuiContext and only pointed to from here.
+ ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications)
+ ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications)
+ ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display.
+ ImGuiViewport* OwnerViewport; // Viewport carrying the ImDrawData instance, might be of use to the renderer (generally not).
// Functions
ImDrawData() { Clear(); }
- void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext!
+ IMGUI_API void Clear();
+ IMGUI_API void AddDrawList(ImDrawList* draw_list); // Helper to add an external draw list into an existing ImDrawData.
IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
};
@@ -2647,25 +3267,28 @@ struct ImDrawData
// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont)
//-----------------------------------------------------------------------------
+// A font input/source (we may rename this to ImFontSource in the future)
struct ImFontConfig
{
void* FontData; // // TTF/OTF data
int FontDataSize; // // TTF/OTF data size
bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
+ bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
+ bool PixelSnapH; // false // Align every glyph AdvanceX to pixel boundaries. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
int FontNo; // 0 // Index of font within TTF/OTF file
+ int OversampleH; // 0 (2) // Rasterize at higher quality for sub-pixel positioning. 0 == auto == 1 or 2 depending on size. Note the difference between 2 and 3 is minimal. You can reduce this to 1 for large glyphs save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
+ int OversampleV; // 0 (1) // Rasterize at higher quality for sub-pixel positioning. 0 == auto == 1. This is not really useful as we don't use sub-pixel positions on the Y axis.
float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height).
- int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
- int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis.
- bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
- ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
+ //ImVec2 GlyphExtraSpacing; // 0, 0 // (REMOVED IN 1.91.9: use GlyphExtraAdvanceX)
ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input.
- const ImWchar* GlyphRanges; // NULL // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.
+ const ImWchar* GlyphRanges; // NULL // THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list).
float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font
float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs
- bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
+ float GlyphExtraAdvanceX; // 0 // Extra spacing (in pixels) between glyphs. Please contact us if you are using this.
unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure.
- float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.
- ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
+ float RasterizerMultiply; // 1.0f // Linearly brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. This is a silly thing we may remove in the future.
+ float RasterizerDensity; // 1.0f // DPI scale for rasterization, not altering other font metrics: make it easy to swap between e.g. a 100% and a 400% fonts for a zooming display. IMPORTANT: If you increase this it is expected that you increase font scale accordingly, otherwise quality may look lowered.
+ ImWchar EllipsisChar; // 0 // Explicitly specify Unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
// [Internal]
char Name[40]; // Name (strictly to ease debugging)
@@ -2681,7 +3304,7 @@ struct ImFontGlyph
unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops)
unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering.
unsigned int Codepoint : 30; // 0x0000..0x10FFFF
- float AdvanceX; // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in)
+ float AdvanceX; // Horizontal distance to advance layout with
float X0, Y0, X1, Y1; // Glyph corners
float U0, V0, U1, V1; // Texture coordinates
};
@@ -2705,13 +3328,16 @@ struct ImFontGlyphRangesBuilder
// See ImFontAtlas::AddCustomRectXXX functions.
struct ImFontAtlasCustomRect
{
- unsigned short Width, Height; // Input // Desired rectangle dimension
unsigned short X, Y; // Output // Packed position in Atlas
- unsigned int GlyphID; // Input // For custom font glyphs only (ID < 0x110000)
+
+ // [Internal]
+ unsigned short Width, Height; // Input // Desired rectangle dimension
+ unsigned int GlyphID : 31; // Input // For custom font glyphs only (ID < 0x110000)
+ unsigned int GlyphColored : 1; // Input // For custom font glyphs only: glyph is colored, removed tinting.
float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance
ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset
ImFont* Font; // Input // For custom font glyphs only: target font
- ImFontAtlasCustomRect() { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; }
+ ImFontAtlasCustomRect() { X = Y = 0xFFFF; Width = Height = 0; GlyphID = 0; GlyphColored = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; }
bool IsPacked() const { return X != 0xFFFF; }
};
@@ -2748,12 +3374,12 @@ struct ImFontAtlas
IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg);
IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL);
IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);
- IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
- IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
+ IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
+ IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts.
+ IMGUI_API void ClearFonts(); // Clear input+output font data (same as ClearInputData() + glyphs storage, UV coordinates).
IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory.
- IMGUI_API void ClearFonts(); // Clear output font data (glyphs storage, UV coordinates).
IMGUI_API void Clear(); // Clear all input and output.
// Build atlas, retrieve pixel data.
@@ -2772,7 +3398,8 @@ struct ImFontAtlas
//-------------------------------------------
// Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
- // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details.
+ // NB: Make sure that your string are UTF-8 and NOT in your local code page.
+ // Read https://github.com/ocornut/imgui/blob/master/docs/FONTS.md/#about-utf-8-encoding for details.
// NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data.
IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin
IMGUI_API const ImWchar* GetGlyphRangesGreek(); // Default + Greek and Coptic
@@ -2785,12 +3412,12 @@ struct ImFontAtlas
IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietnamese characters
//-------------------------------------------
- // [BETA] Custom Rectangles/Glyphs API
+ // [ALPHA] Custom Rectangles/Glyphs API
//-------------------------------------------
// You can request arbitrary rectangles to be packed into the atlas, for your own purposes.
// - After calling Build(), you can query the rectangle position and render your pixels.
- // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format.
+ // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of preferred texture format.
// - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point),
// so you can render e.g. custom colorful icons and use them as regular glyphs.
// - Read docs/FONTS.md for more details about using colorful icons.
@@ -2801,20 +3428,21 @@ struct ImFontAtlas
// [Internal]
IMGUI_API void CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const;
- IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
//-------------------------------------------
// Members
//-------------------------------------------
+ // Input
ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_)
ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
- int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false).
- bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
+ int TexGlyphPadding; // FIXME: Should be called "TexPackPadding". Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false).
+ void* UserData; // Store your own atlas related user-data (if e.g. you have multiple font atlas).
// [Internal]
// NB: Access texture data via GetTexData*() calls! Which will setup a default font for you.
+ bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
bool TexReady; // Set when texture was built matching current font input
bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format.
unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight
@@ -2825,7 +3453,7 @@ struct ImFontAtlas
ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel
ImVector<ImFont*> Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
ImVector<ImFontAtlasCustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas.
- ImVector<ImFontConfig> ConfigData; // Configuration data
+ ImVector<ImFontConfig> Sources; // Source/configuration data
ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines
// [Internal] Font builder
@@ -2837,52 +3465,56 @@ struct ImFontAtlas
int PackIdLines; // Custom texture rectangle ID for baked anti-aliased lines
// [Obsolete]
- //typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+
- //typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+
+ //typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+
+ //typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+
};
// Font runtime data and rendering
// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32().
struct ImFont
{
- // Members: Hot ~20/24 bytes (for CalcTextSize)
- ImVector<float> IndexAdvanceX; // 12-16 // out // // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this this info, and are often bottleneck in large UI).
+ // [Internal] Members: Hot ~20/24 bytes (for CalcTextSize)
+ ImVector<float> IndexAdvanceX; // 12-16 // out // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this info, and are often bottleneck in large UI).
float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX
- float FontSize; // 4 // in // // Height of characters/line, set during loading (don't change after loading)
-
- // Members: Hot ~28/40 bytes (for CalcTextSize + render loop)
- ImVector<ImWchar> IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point.
- ImVector<ImFontGlyph> Glyphs; // 12-16 // out // // All glyphs.
- const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar)
-
- // Members: Cold ~32/40 bytes
- ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into
- const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData
- short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
- ImWchar FallbackChar; // 2 // out // = FFFD/'?' // Character used if a glyph isn't found.
- ImWchar EllipsisChar; // 2 // out // = '...' // Character used for ellipsis rendering.
- ImWchar DotChar; // 2 // out // = '.' // Character used for ellipsis rendering (if a single '...' character isn't found)
+ float FontSize; // 4 // in // Height of characters/line, set during loading (don't change after loading)
+
+ // [Internal] Members: Hot ~28/40 bytes (for RenderText loop)
+ ImVector<ImU16> IndexLookup; // 12-16 // out // Sparse. Index glyphs by Unicode code-point.
+ ImVector<ImFontGlyph> Glyphs; // 12-16 // out // All glyphs.
+ ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar)
+
+ // [Internal] Members: Cold ~32/40 bytes
+ // Conceptually Sources[] is the list of font sources merged to create this font.
+ ImFontAtlas* ContainerAtlas; // 4-8 // out // What we has been loaded into
+ ImFontConfig* Sources; // 4-8 // in // Pointer within ContainerAtlas->Sources[], to SourcesCount instances
+ short SourcesCount; // 2 // in // Number of ImFontConfig involved in creating this font. Usually 1, or >1 when merging multiple font sources into one ImFont.
+ short EllipsisCharCount; // 1 // out // 1 or 3
+ ImWchar EllipsisChar; // 2-4 // out // Character used for ellipsis rendering ('...').
+ ImWchar FallbackChar; // 2-4 // out // Character used if a glyph isn't found (U+FFFD, '?')
+ float EllipsisWidth; // 4 // out // Total ellipsis Width
+ float EllipsisCharStep; // 4 // out // Step between characters when EllipsisCount > 0
+ float Scale; // 4 // in // Base font scale (1.0f), multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
+ float Ascent, Descent; // 4+4 // out // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] (unscaled)
+ int MetricsTotalSurface;// 4 // out // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
bool DirtyLookupTables; // 1 // out //
- float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
- float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
- int MetricsTotalSurface;// 4 // out // // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
- ImU8 Used4kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/4096/8]; // 2 bytes if ImWchar=ImWchar16, 34 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints.
+ ImU8 Used8kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/8192/8]; // 1 bytes if ImWchar=ImWchar16, 16 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints.
// Methods
IMGUI_API ImFont();
IMGUI_API ~ImFont();
- IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const;
- IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const;
- float GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }
- bool IsLoaded() const { return ContainerAtlas != NULL; }
- const char* GetDebugName() const { return ConfigData ? ConfigData->Name : "<unknown>"; }
+ IMGUI_API ImFontGlyph* FindGlyph(ImWchar c);
+ IMGUI_API ImFontGlyph* FindGlyphNoFallback(ImWchar c);
+ float GetCharAdvance(ImWchar c) { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }
+ bool IsLoaded() const { return ContainerAtlas != NULL; }
+ const char* GetDebugName() const { return Sources ? Sources->Name : "<unknown>"; }
+ // [Internal] Don't use!
// 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.
// 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.
- IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8
- IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const;
- IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const;
- IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
+ IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL); // utf8
+ IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width);
+ IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c);
+ IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false);
// [Internal] Don't use!
IMGUI_API void BuildLookupTable();
@@ -2890,7 +3522,6 @@ struct ImFont
IMGUI_API void GrowIndex(int new_size);
IMGUI_API void AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
- IMGUI_API void SetGlyphVisible(ImWchar c, bool visible);
IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last);
};
@@ -2904,7 +3535,7 @@ enum ImGuiViewportFlags_
ImGuiViewportFlags_None = 0,
ImGuiViewportFlags_IsPlatformWindow = 1 << 0, // Represent a Platform Window
ImGuiViewportFlags_IsPlatformMonitor = 1 << 1, // Represent a Platform Monitor (unused yet)
- ImGuiViewportFlags_OwnedByApp = 1 << 2, // Platform Window: is created/managed by the application (rather than a dear imgui backend)
+ ImGuiViewportFlags_OwnedByApp = 1 << 2, // Platform Window: Is created/managed by the application (rather than a dear imgui backend)
};
// - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows.
@@ -2916,6 +3547,7 @@ enum ImGuiViewportFlags_
// - Windows are generally trying to stay within the Work Area of their host viewport.
struct ImGuiViewport
{
+ ImGuiID ID; // Unique identifier for the viewport
ImGuiViewportFlags Flags; // See ImGuiViewportFlags_
ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates)
ImVec2 Size; // Main Area: Size of the viewport.
@@ -2923,6 +3555,7 @@ struct ImGuiViewport
ImVec2 WorkSize; // Work Area: Size of the viewport minus task bars, menu bars, status bars (<= Size)
// Platform/Backend Dependent Data
+ void* PlatformHandle; // void* to hold higher-level, platform window handle (e.g. HWND, GLFWWindow*, SDL_Window*)
void* PlatformHandleRaw; // void* to hold lower-level, platform-native window handle (under Win32 this is expected to be a HWND, unused for other platforms)
ImGuiViewport() { memset(this, 0, sizeof(*this)); }
@@ -2936,7 +3569,45 @@ struct ImGuiViewport
// [SECTION] Platform Dependent Interfaces
//-----------------------------------------------------------------------------
-// (Optional) Support for IME (Input Method Editor) via the io.SetPlatformImeDataFn() function.
+// Access via ImGui::GetPlatformIO()
+struct ImGuiPlatformIO
+{
+ IMGUI_API ImGuiPlatformIO();
+
+ //------------------------------------------------------------------
+ // Input - Interface with OS and Platform backend (most common stuff)
+ //------------------------------------------------------------------
+
+ // Optional: Access OS clipboard
+ // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
+ const char* (*Platform_GetClipboardTextFn)(ImGuiContext* ctx);
+ void (*Platform_SetClipboardTextFn)(ImGuiContext* ctx, const char* text);
+ void* Platform_ClipboardUserData;
+
+ // Optional: Open link/folder/file in OS Shell
+ // (default to use ShellExecuteW() on Windows, system() on Linux/Mac)
+ bool (*Platform_OpenInShellFn)(ImGuiContext* ctx, const char* path);
+ void* Platform_OpenInShellUserData;
+
+ // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows)
+ // (default to use native imm32 api on Windows)
+ void (*Platform_SetImeDataFn)(ImGuiContext* ctx, ImGuiViewport* viewport, ImGuiPlatformImeData* data);
+ void* Platform_ImeUserData;
+ //void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data); // [Renamed to platform_io.PlatformSetImeDataFn in 1.91.1]
+
+ // Optional: Platform locale
+ // [Experimental] Configure decimal point e.g. '.' or ',' useful for some languages (e.g. German), generally pulled from *localeconv()->decimal_point
+ ImWchar Platform_LocaleDecimalPoint; // '.'
+
+ //------------------------------------------------------------------
+ // Input - Interface with Renderer Backend
+ //------------------------------------------------------------------
+
+ // Written by some backends during ImGui_ImplXXXX_RenderDrawData() call to point backend_specific ImGui_ImplXXXX_RenderState* structure.
+ void* Renderer_RenderState;
+};
+
+// (Optional) Support for IME (Input Method Editor) via the platform_io.Platform_SetImeDataFn() function.
struct ImGuiPlatformImeData
{
bool WantVisible; // A widget wants the IME to be visible
@@ -2952,33 +3623,50 @@ struct ImGuiPlatformImeData
// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead.
//-----------------------------------------------------------------------------
-namespace ImGui
-{
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key]
-#else
- static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; }
-#endif
-}
-
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
namespace ImGui
{
- // OBSOLETED in 1.89 (from August 2022)
- IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // Use new ImageButton() signature (explicit item id, regular FramePadding)
- // OBSOLETED in 1.88 (from May 2022)
- static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value.
- static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value.
- // OBSOLETED in 1.86 (from November 2021)
- IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Calculate coarse clipping for large list of evenly sized items. Prefer using ImGuiListClipper.
- // OBSOLETED in 1.85 (from August 2021)
- static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; }
- // OBSOLETED in 1.81 (from February 2021)
- IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // Helper to calculate size from items_count and height_in_items
- static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); }
- static inline void ListBoxFooter() { EndListBox(); }
+ // OBSOLETED in 1.91.9 (from February 2025)
+ IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col); // <-- border_col was removed in favor of ImGuiCol_ImageBorder.
+ // OBSOLETED in 1.91.0 (from July 2024)
+ static inline void PushButtonRepeat(bool repeat) { PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat); }
+ static inline void PopButtonRepeat() { PopItemFlag(); }
+ static inline void PushTabStop(bool tab_stop) { PushItemFlag(ImGuiItemFlags_NoTabStop, !tab_stop); }
+ static inline void PopTabStop() { PopItemFlag(); }
+ IMGUI_API ImVec2 GetContentRegionMax(); // Content boundaries max (e.g. window boundaries including scrolling, or current column boundaries). You should never need this. Always use GetCursorScreenPos() and GetContentRegionAvail()!
+ IMGUI_API ImVec2 GetWindowContentRegionMin(); // Content boundaries min for the window (roughly (0,0)-Scroll), in window-local coordinates. You should never need this. Always use GetCursorScreenPos() and GetContentRegionAvail()!
+ IMGUI_API ImVec2 GetWindowContentRegionMax(); // Content boundaries max for the window (roughly (0,0)+Size-Scroll), in window-local coordinates. You should never need this. Always use GetCursorScreenPos() and GetContentRegionAvail()!
+ // OBSOLETED in 1.90.0 (from September 2023)
+ static inline bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags window_flags = 0) { return BeginChild(id, size, ImGuiChildFlags_FrameStyle, window_flags); }
+ static inline void EndChildFrame() { EndChild(); }
+ //static inline bool BeginChild(const char* str_id, const ImVec2& size_arg, bool borders, ImGuiWindowFlags window_flags){ return BeginChild(str_id, size_arg, borders ? ImGuiChildFlags_Borders : ImGuiChildFlags_None, window_flags); } // Unnecessary as true == ImGuiChildFlags_Borders
+ //static inline bool BeginChild(ImGuiID id, const ImVec2& size_arg, bool borders, ImGuiWindowFlags window_flags) { return BeginChild(id, size_arg, borders ? ImGuiChildFlags_Borders : ImGuiChildFlags_None, window_flags); } // Unnecessary as true == ImGuiChildFlags_Borders
+ static inline void ShowStackToolWindow(bool* p_open = NULL) { ShowIDStackToolWindow(p_open); }
+ IMGUI_API bool Combo(const char* label, int* current_item, bool (*old_callback)(void* user_data, int idx, const char** out_text), void* user_data, int items_count, int popup_max_height_in_items = -1);
+ IMGUI_API bool ListBox(const char* label, int* current_item, bool (*old_callback)(void* user_data, int idx, const char** out_text), void* user_data, int items_count, int height_in_items = -1);
+ // OBSOLETED in 1.89.7 (from June 2023)
+ IMGUI_API void SetItemAllowOverlap(); // Use SetNextItemAllowOverlap() before item.
+ // OBSOLETED in 1.89.4 (from March 2023)
+ static inline void PushAllowKeyboardFocus(bool tab_stop) { PushItemFlag(ImGuiItemFlags_NoTabStop, !tab_stop); }
+ static inline void PopAllowKeyboardFocus() { PopItemFlag(); }
// Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE)
+ //-- OBSOLETED in 1.89 (from August 2022)
+ //IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // --> Use new ImageButton() signature (explicit item id, regular FramePadding). Refer to code in 1.91 if you want to grab a copy of this version.
+ //-- OBSOLETED in 1.88 (from May 2022)
+ //static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value.
+ //static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value.
+ //-- OBSOLETED in 1.87 (from February 2022, more formally obsoleted April 2024)
+ //IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END); const ImGuiKeyData* key_data = GetKeyData(key); return (ImGuiKey)(key_data - g.IO.KeysData); } // Map ImGuiKey_* values into legacy native key index. == io.KeyMap[key]. When using a 1.87+ backend using io.AddKeyEvent(), calling GetKeyIndex() with ANY ImGuiKey_XXXX values will return the same value!
+ //static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END); return key; }
+ //-- OBSOLETED in 1.86 (from November 2021)
+ //IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Code removed, see 1.90 for last version of the code. Calculate range of visible items for large list of evenly sized items. Prefer using ImGuiListClipper.
+ //-- OBSOLETED in 1.85 (from August 2021)
+ //static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; }
+ //-- OBSOLETED in 1.81 (from February 2021)
+ //static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); }
+ //static inline bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1) { float height = GetTextLineHeightWithSpacing() * ((height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f) + GetStyle().FramePadding.y * 2.0f; return BeginListBox(label, ImVec2(0.0f, height)); } // Helper to calculate size from items_count and height_in_items
+ //static inline void ListBoxFooter() { EndListBox(); }
//-- OBSOLETED in 1.79 (from August 2020)
//static inline void OpenPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mb = 1) { OpenPopupOnItemClick(str_id, mb); } // Bool return value removed. Use IsWindowAppearing() in BeginPopup() instead. Renamed in 1.77, renamed back in 1.79. Sorry!
//-- OBSOLETED in 1.78 (from June 2020): Old drag/sliders functions that took a 'float power > 1.0f' argument instead of ImGuiSliderFlags_Logarithmic. See github.com/ocornut/imgui/issues/3361 for details.
@@ -3025,36 +3713,35 @@ namespace ImGui
//static inline void SetScrollPosHere() { SetScrollHere(); } // OBSOLETED in 1.42
}
-// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect()
-typedef ImDrawFlags ImDrawCornerFlags;
-enum ImDrawCornerFlags_
-{
- ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit
- ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally).
- ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82.
- ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82.
- ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82.
- ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82
- ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight,
- ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight,
- ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft,
- ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight,
-};
+//-- OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect()
+//typedef ImDrawFlags ImDrawCornerFlags;
+//enum ImDrawCornerFlags_
+//{
+// ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit
+// ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally).
+// ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82.
+// ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82.
+// ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82.
+// ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82
+// ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight,
+// ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight,
+// ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft,
+// ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight,
+//};
// RENAMED and MERGED both ImGuiKey_ModXXX and ImGuiModFlags_XXX into ImGuiMod_XXX (from September 2022)
// RENAMED ImGuiKeyModFlags -> ImGuiModFlags in 1.88 (from April 2022). Exceptionally commented out ahead of obscolescence schedule to reduce confusion and because they were not meant to be used in the first place.
-typedef ImGuiKeyChord ImGuiModFlags; // == int. We generally use ImGuiKeyChord to mean "a ImGuiKey or-ed with any number of ImGuiMod_XXX value", but you may store only mods in there.
-enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiModFlags_Shift = ImGuiMod_Shift, ImGuiModFlags_Alt = ImGuiMod_Alt, ImGuiModFlags_Super = ImGuiMod_Super };
+//typedef ImGuiKeyChord ImGuiModFlags; // == int. We generally use ImGuiKeyChord to mean "a ImGuiKey or-ed with any number of ImGuiMod_XXX value", so you may store mods in there.
+//enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiModFlags_Shift = ImGuiMod_Shift, ImGuiModFlags_Alt = ImGuiMod_Alt, ImGuiModFlags_Super = ImGuiMod_Super };
//typedef ImGuiKeyChord ImGuiKeyModFlags; // == int
//enum ImGuiKeyModFlags_ { ImGuiKeyModFlags_None = 0, ImGuiKeyModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiKeyModFlags_Shift = ImGuiMod_Shift, ImGuiKeyModFlags_Alt = ImGuiMod_Alt, ImGuiKeyModFlags_Super = ImGuiMod_Super };
+#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // OBSOLETED IN 1.90 (now using C++11 standard version)
+
#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
// RENAMED IMGUI_DISABLE_METRICS_WINDOW > IMGUI_DISABLE_DEBUG_TOOLS in 1.88 (from June 2022)
-#if defined(IMGUI_DISABLE_METRICS_WINDOW) && !defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && !defined(IMGUI_DISABLE_DEBUG_TOOLS)
-#define IMGUI_DISABLE_DEBUG_TOOLS
-#endif
-#if defined(IMGUI_DISABLE_METRICS_WINDOW) && defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS)
+#ifdef IMGUI_DISABLE_METRICS_WINDOW
#error IMGUI_DISABLE_METRICS_WINDOW was renamed to IMGUI_DISABLE_DEBUG_TOOLS, please use new name.
#endif
@@ -3070,9 +3757,14 @@ enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl
#pragma warning (pop)
#endif
-// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h)
+// Include imgui_user.h at the end of imgui.h
+// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included.
#ifdef IMGUI_INCLUDE_IMGUI_USER_H
+#ifdef IMGUI_USER_H_FILENAME
+#include IMGUI_USER_H_FILENAME
+#else
#include "imgui_user.h"
#endif
+#endif
#endif // #ifndef IMGUI_DISABLE
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_demo.cpp b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_demo.cpp
index 56058693377..10fa434dca7 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_demo.cpp
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_demo.cpp
@@ -1,16 +1,23 @@
-// dear imgui, v1.89.1 WIP
+// dear imgui, v1.91.9b
// (demo code)
// Help:
-// - Read FAQ at http://dearimgui.org/faq
-// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
+// - Read FAQ at http://dearimgui.com/faq
// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that.
-// Read imgui.cpp for more details, documentation and comments.
+// - Need help integrating Dear ImGui in your codebase?
+// - Read Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started
+// - Read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
+// Read top of imgui.cpp and imgui.h for many details, documentation, comments, links.
// Get the latest version at https://github.com/ocornut/imgui
-// -------------------------------------------------
+// How to easily locate code?
+// - Use Tools->Item Picker to debug break in code by clicking any widgets: https://github.com/ocornut/imgui/wiki/Debug-Tools
+// - Browse an online version the demo with code linked to hovered widgets: https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html
+// - Find a visible string and search for it in the code!
+
+//---------------------------------------------------
// PLEASE DO NOT REMOVE THIS FILE FROM YOUR PROJECT!
-// -------------------------------------------------
+//---------------------------------------------------
// Message to the person tempted to delete this file when integrating Dear ImGui into their codebase:
// Think again! It is the most useful reference code that you and other coders will want to refer to and call.
// Have the ImGui::ShowDemoWindow() function wired in an always-available debug menu of your game/app!
@@ -24,27 +31,38 @@
// Thank you,
// -Your beloved friend, imgui_demo.cpp (which you won't delete)
-// Message to beginner C/C++ programmers about the meaning of the 'static' keyword:
-// In this demo code, we frequently use 'static' variables inside functions. A static variable persists across calls,
-// so it is essentially like a global variable but declared inside the scope of the function. We do this as a way to
-// gather code and data in the same place, to make the demo source code faster to read, faster to write, and smaller
-// in size. It also happens to be a convenient way of storing simple UI related information as long as your function
-// doesn't need to be reentrant or used in multiple threads. This might be a pattern you will want to use in your code,
-// but most of the real data you would be editing is likely going to be stored outside your functions.
-
+//--------------------------------------------
+// ABOUT THE MEANING OF THE 'static' KEYWORD:
+//--------------------------------------------
+// In this demo code, we frequently use 'static' variables inside functions.
+// A static variable persists across calls. It is essentially a global variable but declared inside the scope of the function.
+// Think of "static int n = 0;" as "global int n = 0;" !
+// We do this IN THE DEMO because we want:
+// - to gather code and data in the same place.
+// - to make the demo source code faster to read, faster to change, smaller in size.
+// - it is also a convenient way of storing simple UI related information as long as your function
+// doesn't need to be reentrant or used in multiple threads.
+// This might be a pattern you will want to use in your code, but most of the data you would be working
+// with in a complex codebase is likely going to be stored outside your functions.
+
+//-----------------------------------------
+// ABOUT THE CODING STYLE OF OUR DEMO CODE
+//-----------------------------------------
// The Demo code in this file is designed to be easy to copy-and-paste into your application!
// Because of this:
// - We never omit the ImGui:: prefix when calling functions, even though most code here is in the same namespace.
// - We try to declare static variables in the local scope, as close as possible to the code using them.
// - We never use any of the helpers/facilities used internally by Dear ImGui, unless available in the public API.
// - We never use maths operators on ImVec2/ImVec4. For our other sources files we use them, and they are provided
-// by imgui_internal.h using the IMGUI_DEFINE_MATH_OPERATORS define. For your own sources file they are optional
+// by imgui.h using the IMGUI_DEFINE_MATH_OPERATORS define. For your own sources file they are optional
// and require you either enable those, either provide your own via IM_VEC2_CLASS_EXTRA in imconfig.h.
// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp.
// Navigating this file:
-// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
-// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
+// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
+// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
+// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
+// - You can search/grep for all sections listed in the index to find the section.
/*
@@ -53,12 +71,37 @@ Index of this file:
// [SECTION] Forward Declarations
// [SECTION] Helpers
// [SECTION] Demo Window / ShowDemoWindow()
-// - ShowDemoWindow()
-// - sub section: ShowDemoWindowWidgets()
-// - sub section: ShowDemoWindowLayout()
-// - sub section: ShowDemoWindowPopups()
-// - sub section: ShowDemoWindowTables()
-// - sub section: ShowDemoWindowInputs()
+// [SECTION] DemoWindowMenuBar()
+// [SECTION] Helpers: ExampleTreeNode, ExampleMemberInfo (for use by Property Editor & Multi-Select demos)
+// [SECTION] DemoWindowWidgetsBasic()
+// [SECTION] DemoWindowWidgetsBullets()
+// [SECTION] DemoWindowWidgetsCollapsingHeaders()
+// [SECTION] DemoWindowWidgetsComboBoxes()
+// [SECTION] DemoWindowWidgetsColorAndPickers()
+// [SECTION] DemoWindowWidgetsDataTypes()
+// [SECTION] DemoWindowWidgetsDisableBlocks()
+// [SECTION] DemoWindowWidgetsDragAndDrop()
+// [SECTION] DemoWindowWidgetsDragsAndSliders()
+// [SECTION] DemoWindowWidgetsImages()
+// [SECTION] DemoWindowWidgetsListBoxes()
+// [SECTION] DemoWindowWidgetsMultiComponents()
+// [SECTION] DemoWindowWidgetsPlotting()
+// [SECTION] DemoWindowWidgetsProgressBars()
+// [SECTION] DemoWindowWidgetsQueryingStatuses()
+// [SECTION] DemoWindowWidgetsSelectables()
+// [SECTION] DemoWindowWidgetsSelectionAndMultiSelect()
+// [SECTION] DemoWindowWidgetsTabs()
+// [SECTION] DemoWindowWidgetsText()
+// [SECTION] DemoWindowWidgetsTextFilter()
+// [SECTION] DemoWindowWidgetsTextInput()
+// [SECTION] DemoWindowWidgetsTooltips()
+// [SECTION] DemoWindowWidgetsTreeNodes()
+// [SECTION] DemoWindowWidgetsVerticalSliders()
+// [SECTION] DemoWindowWidgets()
+// [SECTION] DemoWindowLayout()
+// [SECTION] DemoWindowPopups()
+// [SECTION] DemoWindowTables()
+// [SECTION] DemoWindowInputs()
// [SECTION] About Window / ShowAboutWindow()
// [SECTION] Style Editor / ShowStyleEditor()
// [SECTION] User Guide / ShowUserGuide()
@@ -75,6 +118,7 @@ Index of this file:
// [SECTION] Example App: Manipulating window titles / ShowExampleAppWindowTitles()
// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering()
// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments()
+// [SECTION] Example App: Assets Browser / ShowExampleAppAssetsBrowser()
*/
@@ -91,10 +135,12 @@ Index of this file:
#include <math.h> // sqrtf, powf, cosf, sinf, floorf, ceilf
#include <stdio.h> // vsnprintf, sscanf, printf
#include <stdlib.h> // NULL, malloc, free, atoi
-#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
-#include <stddef.h> // intptr_t
-#else
#include <stdint.h> // intptr_t
+#if !defined(_MSC_VER) || _MSC_VER >= 1800
+#include <inttypes.h> // PRId64/PRIu64, not avail in some MinGW headers.
+#endif
+#ifdef __EMSCRIPTEN__
+#include <emscripten/version.h> // __EMSCRIPTEN_major__ etc.
#endif
// Visual Studio warnings
@@ -113,6 +159,7 @@ Index of this file:
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning: 'xx' is deprecated: The POSIX name for this.. // for strdup used in demo code (so user can copy & paste the code)
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type
+#pragma clang diagnostic ignored "-Wformat" // warning: format specifies type 'int' but the argument has type 'unsigned int'
#pragma clang diagnostic ignored "-Wformat-security" // warning: format string is not a string literal
#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.
#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used.
@@ -120,13 +167,19 @@ Index of this file:
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wswitch-default" // warning: 'switch' missing 'default' label
#elif defined(__GNUC__)
-#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
-#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
-#pragma GCC diagnostic ignored "-Wformat-security" // warning: format string is not a string literal (potentially insecure)
-#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
-#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
-#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub.
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
+#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
+#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'int'/'void*', but argument X has type 'unsigned int'/'ImGuiWindow*'
+#pragma GCC diagnostic ignored "-Wformat-security" // warning: format string is not a string literal (potentially insecure)
+#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
+#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
+#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub.
+#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when simplifying division / ..when changing X +- C1 cmp C2 to X cmp C2 -+ C1
+#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
#endif
// Play it nice with Windows users (Update: May 2018, Notepad now supports Unix-style carriage returns!)
@@ -144,14 +197,13 @@ Index of this file:
#define vsnprintf _vsnprintf
#endif
-// Format specifiers, printing 64-bit hasn't been decently standardized...
-// In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself.
-#ifdef _MSC_VER
-#define IM_PRId64 "I64d"
-#define IM_PRIu64 "I64u"
-#else
-#define IM_PRId64 "lld"
-#define IM_PRIu64 "llu"
+// Format specifiers for 64-bit values (hasn't been decently standardized before VS2013)
+#if !defined(PRId64) && defined(_MSC_VER)
+#define PRId64 "I64d"
+#define PRIu64 "I64u"
+#elif !defined(PRId64)
+#define PRId64 "lld"
+#define PRIu64 "llu"
#endif
// Helpers macros
@@ -162,7 +214,8 @@ Index of this file:
#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B))
#define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V))
-// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
+// Enforce cdecl calling convention for functions called by the standard library,
+// in case compilation settings changed the default to e.g. __vectorcall
#ifndef IMGUI_CDECL
#ifdef _MSC_VER
#define IMGUI_CDECL __cdecl
@@ -172,35 +225,43 @@ Index of this file:
#endif
//-----------------------------------------------------------------------------
-// [SECTION] Forward Declarations, Helpers
+// [SECTION] Forward Declarations
//-----------------------------------------------------------------------------
#if !defined(IMGUI_DISABLE_DEMO_WINDOWS)
// Forward Declarations
-static void ShowExampleAppDocuments(bool* p_open);
+struct ImGuiDemoWindowData;
static void ShowExampleAppMainMenuBar();
+static void ShowExampleAppAssetsBrowser(bool* p_open);
static void ShowExampleAppConsole(bool* p_open);
+static void ShowExampleAppCustomRendering(bool* p_open);
+static void ShowExampleAppDocuments(bool* p_open);
static void ShowExampleAppLog(bool* p_open);
static void ShowExampleAppLayout(bool* p_open);
-static void ShowExampleAppPropertyEditor(bool* p_open);
-static void ShowExampleAppLongText(bool* p_open);
+static void ShowExampleAppPropertyEditor(bool* p_open, ImGuiDemoWindowData* demo_data);
+static void ShowExampleAppSimpleOverlay(bool* p_open);
static void ShowExampleAppAutoResize(bool* p_open);
static void ShowExampleAppConstrainedResize(bool* p_open);
-static void ShowExampleAppSimpleOverlay(bool* p_open);
static void ShowExampleAppFullscreen(bool* p_open);
+static void ShowExampleAppLongText(bool* p_open);
static void ShowExampleAppWindowTitles(bool* p_open);
-static void ShowExampleAppCustomRendering(bool* p_open);
static void ShowExampleMenuFile();
// We split the contents of the big ShowDemoWindow() function into smaller functions
-// (because the link time of very large functions grow non-linearly)
-static void ShowDemoWindowWidgets();
-static void ShowDemoWindowLayout();
-static void ShowDemoWindowPopups();
-static void ShowDemoWindowTables();
-static void ShowDemoWindowColumns();
-static void ShowDemoWindowInputs();
+// (because the link time of very large functions tends to grow non-linearly)
+static void DemoWindowMenuBar(ImGuiDemoWindowData* demo_data);
+static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data);
+static void DemoWindowLayout();
+static void DemoWindowPopups();
+static void DemoWindowTables();
+static void DemoWindowColumns();
+static void DemoWindowInputs();
+
+// Helper tree functions used by Property Editor & Multi-Select demos
+struct ExampleTreeNode;
+static ExampleTreeNode* ExampleTree_CreateNode(const char* name, int uid, ExampleTreeNode* parent);
+static void ExampleTree_DestroyNode(ExampleTreeNode* node);
//-----------------------------------------------------------------------------
// [SECTION] Helpers
@@ -211,9 +272,8 @@ static void ShowDemoWindowInputs();
static void HelpMarker(const char* desc)
{
ImGui::TextDisabled("(?)");
- if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort))
+ if (ImGui::BeginItemTooltip())
{
- ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
ImGui::TextUnformatted(desc);
ImGui::PopTextWrapPos();
@@ -232,14 +292,39 @@ void* GImGuiDemoMarkerCallbackUserData = NULL;
//-----------------------------------------------------------------------------
// [SECTION] Demo Window / ShowDemoWindow()
//-----------------------------------------------------------------------------
-// - ShowDemoWindow()
-// - ShowDemoWindowWidgets()
-// - ShowDemoWindowLayout()
-// - ShowDemoWindowPopups()
-// - ShowDemoWindowTables()
-// - ShowDemoWindowColumns()
-// - ShowDemoWindowInputs()
-//-----------------------------------------------------------------------------
+
+// Data to be shared across different functions of the demo.
+struct ImGuiDemoWindowData
+{
+ // Examples Apps (accessible from the "Examples" menu)
+ bool ShowMainMenuBar = false;
+ bool ShowAppAssetsBrowser = false;
+ bool ShowAppConsole = false;
+ bool ShowAppCustomRendering = false;
+ bool ShowAppDocuments = false;
+ bool ShowAppLog = false;
+ bool ShowAppLayout = false;
+ bool ShowAppPropertyEditor = false;
+ bool ShowAppSimpleOverlay = false;
+ bool ShowAppAutoResize = false;
+ bool ShowAppConstrainedResize = false;
+ bool ShowAppFullscreen = false;
+ bool ShowAppLongText = false;
+ bool ShowAppWindowTitles = false;
+
+ // Dear ImGui Tools (accessible from the "Tools" menu)
+ bool ShowMetrics = false;
+ bool ShowDebugLog = false;
+ bool ShowIDStackTool = false;
+ bool ShowStyleEditor = false;
+ bool ShowAbout = false;
+
+ // Other data
+ bool DisableSections = false;
+ ExampleTreeNode* DemoTree = NULL;
+
+ ~ImGuiDemoWindowData() { if (DemoTree) ExampleTree_DestroyNode(DemoTree); }
+};
// Demonstrate most Dear ImGui features (this is big function!)
// You may execute this function to experiment with the UI and understand what it does.
@@ -247,56 +332,39 @@ void* GImGuiDemoMarkerCallbackUserData = NULL;
void ImGui::ShowDemoWindow(bool* p_open)
{
// Exceptionally add an extra assert here for people confused about initial Dear ImGui setup
- // Most functions would normally just crash if the context is missing.
- IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!");
+ // Most functions would normally just assert/crash if the context is missing.
+ IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing Dear ImGui context. Refer to examples app!");
+
+ // Verify ABI compatibility between caller code and compiled version of Dear ImGui. This helps detects some build issues.
+ IMGUI_CHECKVERSION();
+
+ // Stored data
+ static ImGuiDemoWindowData demo_data;
// Examples Apps (accessible from the "Examples" menu)
- static bool show_app_main_menu_bar = false;
- static bool show_app_documents = false;
- static bool show_app_console = false;
- static bool show_app_log = false;
- static bool show_app_layout = false;
- static bool show_app_property_editor = false;
- static bool show_app_long_text = false;
- static bool show_app_auto_resize = false;
- static bool show_app_constrained_resize = false;
- static bool show_app_simple_overlay = false;
- static bool show_app_fullscreen = false;
- static bool show_app_window_titles = false;
- static bool show_app_custom_rendering = false;
-
- if (show_app_main_menu_bar) ShowExampleAppMainMenuBar();
- if (show_app_documents) ShowExampleAppDocuments(&show_app_documents);
- if (show_app_console) ShowExampleAppConsole(&show_app_console);
- if (show_app_log) ShowExampleAppLog(&show_app_log);
- if (show_app_layout) ShowExampleAppLayout(&show_app_layout);
- if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor);
- if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text);
- if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize);
- if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize);
- if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay);
- if (show_app_fullscreen) ShowExampleAppFullscreen(&show_app_fullscreen);
- if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles);
- if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering);
-
- // Dear ImGui Tools/Apps (accessible from the "Tools" menu)
- static bool show_app_metrics = false;
- static bool show_app_debug_log = false;
- static bool show_app_stack_tool = false;
- static bool show_app_about = false;
- static bool show_app_style_editor = false;
-
- if (show_app_metrics)
- ImGui::ShowMetricsWindow(&show_app_metrics);
- if (show_app_debug_log)
- ImGui::ShowDebugLogWindow(&show_app_debug_log);
- if (show_app_stack_tool)
- ImGui::ShowStackToolWindow(&show_app_stack_tool);
- if (show_app_about)
- ImGui::ShowAboutWindow(&show_app_about);
- if (show_app_style_editor)
- {
- ImGui::Begin("Dear ImGui Style Editor", &show_app_style_editor);
+ if (demo_data.ShowMainMenuBar) { ShowExampleAppMainMenuBar(); }
+ if (demo_data.ShowAppDocuments) { ShowExampleAppDocuments(&demo_data.ShowAppDocuments); }
+ if (demo_data.ShowAppAssetsBrowser) { ShowExampleAppAssetsBrowser(&demo_data.ShowAppAssetsBrowser); }
+ if (demo_data.ShowAppConsole) { ShowExampleAppConsole(&demo_data.ShowAppConsole); }
+ if (demo_data.ShowAppCustomRendering) { ShowExampleAppCustomRendering(&demo_data.ShowAppCustomRendering); }
+ if (demo_data.ShowAppLog) { ShowExampleAppLog(&demo_data.ShowAppLog); }
+ if (demo_data.ShowAppLayout) { ShowExampleAppLayout(&demo_data.ShowAppLayout); }
+ if (demo_data.ShowAppPropertyEditor) { ShowExampleAppPropertyEditor(&demo_data.ShowAppPropertyEditor, &demo_data); }
+ if (demo_data.ShowAppSimpleOverlay) { ShowExampleAppSimpleOverlay(&demo_data.ShowAppSimpleOverlay); }
+ if (demo_data.ShowAppAutoResize) { ShowExampleAppAutoResize(&demo_data.ShowAppAutoResize); }
+ if (demo_data.ShowAppConstrainedResize) { ShowExampleAppConstrainedResize(&demo_data.ShowAppConstrainedResize); }
+ if (demo_data.ShowAppFullscreen) { ShowExampleAppFullscreen(&demo_data.ShowAppFullscreen); }
+ if (demo_data.ShowAppLongText) { ShowExampleAppLongText(&demo_data.ShowAppLongText); }
+ if (demo_data.ShowAppWindowTitles) { ShowExampleAppWindowTitles(&demo_data.ShowAppWindowTitles); }
+
+ // Dear ImGui Tools (accessible from the "Tools" menu)
+ if (demo_data.ShowMetrics) { ImGui::ShowMetricsWindow(&demo_data.ShowMetrics); }
+ if (demo_data.ShowDebugLog) { ImGui::ShowDebugLogWindow(&demo_data.ShowDebugLog); }
+ if (demo_data.ShowIDStackTool) { ImGui::ShowIDStackToolWindow(&demo_data.ShowIDStackTool); }
+ if (demo_data.ShowAbout) { ImGui::ShowAboutWindow(&demo_data.ShowAbout); }
+ if (demo_data.ShowStyleEditor)
+ {
+ ImGui::Begin("Dear ImGui Style Editor", &demo_data.ShowStyleEditor);
ImGui::ShowStyleEditor();
ImGui::End();
}
@@ -342,56 +410,11 @@ void ImGui::ShowDemoWindow(bool* p_open)
}
// Most "big" widgets share a common width settings by default. See 'Demo->Layout->Widgets Width' for details.
- // e.g. Use 2/3 of the space for widgets and 1/3 for labels (right align)
- //ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f);
- // e.g. Leave a fixed amount of width for labels (by passing a negative value), the rest goes to widgets.
- ImGui::PushItemWidth(ImGui::GetFontSize() * -12);
+ ImGui::PushItemWidth(ImGui::GetFontSize() * -12); // e.g. Leave a fixed amount of width for labels (by passing a negative value), the rest goes to widgets.
+ //ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); // e.g. Use 2/3 of the space for widgets and 1/3 for labels (right align)
// Menu Bar
- if (ImGui::BeginMenuBar())
- {
- if (ImGui::BeginMenu("Menu"))
- {
- IMGUI_DEMO_MARKER("Menu/File");
- ShowExampleMenuFile();
- ImGui::EndMenu();
- }
- if (ImGui::BeginMenu("Examples"))
- {
- IMGUI_DEMO_MARKER("Menu/Examples");
- ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar);
- ImGui::MenuItem("Console", NULL, &show_app_console);
- ImGui::MenuItem("Log", NULL, &show_app_log);
- ImGui::MenuItem("Simple layout", NULL, &show_app_layout);
- ImGui::MenuItem("Property editor", NULL, &show_app_property_editor);
- ImGui::MenuItem("Long text display", NULL, &show_app_long_text);
- ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize);
- ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize);
- ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay);
- ImGui::MenuItem("Fullscreen window", NULL, &show_app_fullscreen);
- ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles);
- ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering);
- ImGui::MenuItem("Documents", NULL, &show_app_documents);
- ImGui::EndMenu();
- }
- //if (ImGui::MenuItem("MenuItem")) {} // You can also use MenuItem() inside a menu bar!
- if (ImGui::BeginMenu("Tools"))
- {
- IMGUI_DEMO_MARKER("Menu/Tools");
-#ifndef IMGUI_DISABLE_DEBUG_TOOLS
- const bool has_debug_tools = true;
-#else
- const bool has_debug_tools = false;
-#endif
- ImGui::MenuItem("Metrics/Debugger", NULL, &show_app_metrics, has_debug_tools);
- ImGui::MenuItem("Debug Log", NULL, &show_app_debug_log, has_debug_tools);
- ImGui::MenuItem("Stack Tool", NULL, &show_app_stack_tool, has_debug_tools);
- ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor);
- ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about);
- ImGui::EndMenu();
- }
- ImGui::EndMenuBar();
- }
+ DemoWindowMenuBar(&demo_data);
ImGui::Text("dear imgui says hello! (%s) (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
ImGui::Spacing();
@@ -399,23 +422,23 @@ void ImGui::ShowDemoWindow(bool* p_open)
IMGUI_DEMO_MARKER("Help");
if (ImGui::CollapsingHeader("Help"))
{
- ImGui::Text("ABOUT THIS DEMO:");
+ ImGui::SeparatorText("ABOUT THIS DEMO:");
ImGui::BulletText("Sections below are demonstrating many aspects of the library.");
ImGui::BulletText("The \"Examples\" menu above leads to more demo contents.");
ImGui::BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\n"
"and Metrics/Debugger (general purpose Dear ImGui debugging tool).");
- ImGui::Separator();
- ImGui::Text("PROGRAMMER GUIDE:");
+ ImGui::SeparatorText("PROGRAMMER GUIDE:");
ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!");
ImGui::BulletText("See comments in imgui.cpp.");
ImGui::BulletText("See example applications in the examples/ folder.");
- ImGui::BulletText("Read the FAQ at http://www.dearimgui.org/faq/");
+ ImGui::BulletText("Read the FAQ at ");
+ ImGui::SameLine(0, 0);
+ ImGui::TextLinkOpenURL("https://www.dearimgui.com/faq/");
ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls.");
ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls.");
- ImGui::Separator();
- ImGui::Text("USER GUIDE:");
+ ImGui::SeparatorText("USER GUIDE:");
ImGui::ShowUserGuide();
}
@@ -426,42 +449,107 @@ void ImGui::ShowDemoWindow(bool* p_open)
if (ImGui::TreeNode("Configuration##2"))
{
+ ImGui::SeparatorText("General");
ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard);
ImGui::SameLine(); HelpMarker("Enable keyboard controls.");
ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad);
ImGui::SameLine(); HelpMarker("Enable gamepad controls. Require backend to set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details.");
- ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", &io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos);
- ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos.");
ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", &io.ConfigFlags, ImGuiConfigFlags_NoMouse);
+ ImGui::SameLine(); HelpMarker("Instruct dear imgui to disable mouse inputs and interactions.");
+
+ // The "NoMouse" option can get us stuck with a disabled mouse! Let's provide an alternative way to fix it:
if (io.ConfigFlags & ImGuiConfigFlags_NoMouse)
{
- // The "NoMouse" option can get us stuck with a disabled mouse! Let's provide an alternative way to fix it:
if (fmodf((float)ImGui::GetTime(), 0.40f) < 0.20f)
{
ImGui::SameLine();
ImGui::Text("<<PRESS SPACE TO DISABLE>>");
}
- if (ImGui::IsKeyPressed(ImGuiKey_Space))
+ // Prevent both being checked
+ if (ImGui::IsKeyPressed(ImGuiKey_Space) || (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard))
io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse;
}
- ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange);
+
+ ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange);
ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility.");
+ ImGui::CheckboxFlags("io.ConfigFlags: NoKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NoKeyboard);
+ ImGui::SameLine(); HelpMarker("Instruct dear imgui to disable keyboard inputs and interactions.");
+
ImGui::Checkbox("io.ConfigInputTrickleEventQueue", &io.ConfigInputTrickleEventQueue);
ImGui::SameLine(); HelpMarker("Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates.");
+ ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor);
+ ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something).");
+
+ ImGui::SeparatorText("Keyboard/Gamepad Navigation");
+ ImGui::Checkbox("io.ConfigNavSwapGamepadButtons", &io.ConfigNavSwapGamepadButtons);
+ ImGui::Checkbox("io.ConfigNavMoveSetMousePos", &io.ConfigNavMoveSetMousePos);
+ ImGui::SameLine(); HelpMarker("Directional/tabbing navigation teleports the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is difficult");
+ ImGui::Checkbox("io.ConfigNavCaptureKeyboard", &io.ConfigNavCaptureKeyboard);
+ ImGui::Checkbox("io.ConfigNavEscapeClearFocusItem", &io.ConfigNavEscapeClearFocusItem);
+ ImGui::SameLine(); HelpMarker("Pressing Escape clears focused item.");
+ ImGui::Checkbox("io.ConfigNavEscapeClearFocusWindow", &io.ConfigNavEscapeClearFocusWindow);
+ ImGui::SameLine(); HelpMarker("Pressing Escape clears focused window.");
+ ImGui::Checkbox("io.ConfigNavCursorVisibleAuto", &io.ConfigNavCursorVisibleAuto);
+ ImGui::SameLine(); HelpMarker("Using directional navigation key makes the cursor visible. Mouse click hides the cursor.");
+ ImGui::Checkbox("io.ConfigNavCursorVisibleAlways", &io.ConfigNavCursorVisibleAlways);
+ ImGui::SameLine(); HelpMarker("Navigation cursor is always visible.");
+
+ ImGui::SeparatorText("Windows");
+ ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges);
+ ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires ImGuiBackendFlags_HasMouseCursors for better mouse cursor feedback.");
+ ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly);
+ ImGui::Checkbox("io.ConfigWindowsCopyContentsWithCtrlC", &io.ConfigWindowsCopyContentsWithCtrlC); // [EXPERIMENTAL]
+ ImGui::SameLine(); HelpMarker("*EXPERIMENTAL* CTRL+C copy the contents of focused window into the clipboard.\n\nExperimental because:\n- (1) has known issues with nested Begin/End pairs.\n- (2) text output quality varies.\n- (3) text output is in submission order rather than spatial order.");
+ ImGui::Checkbox("io.ConfigScrollbarScrollByPage", &io.ConfigScrollbarScrollByPage);
+ ImGui::SameLine(); HelpMarker("Enable scrolling page by page when clicking outside the scrollbar grab.\nWhen disabled, always scroll to clicked location.\nWhen enabled, Shift+Click scrolls to clicked location.");
+
+ ImGui::SeparatorText("Widgets");
ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink);
ImGui::SameLine(); HelpMarker("Enable blinking cursor (optional as some users consider it to be distracting).");
ImGui::Checkbox("io.ConfigInputTextEnterKeepActive", &io.ConfigInputTextEnterKeepActive);
ImGui::SameLine(); HelpMarker("Pressing Enter will keep item active and select contents (single-line only).");
ImGui::Checkbox("io.ConfigDragClickToInputText", &io.ConfigDragClickToInputText);
ImGui::SameLine(); HelpMarker("Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving).");
- ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges);
- ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback.");
- ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly);
- ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor);
- ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something).");
+ ImGui::Checkbox("io.ConfigMacOSXBehaviors", &io.ConfigMacOSXBehaviors);
+ ImGui::SameLine(); HelpMarker("Swap Cmd<>Ctrl keys, enable various MacOS style behaviors.");
ImGui::Text("Also see Style->Rendering for rendering options.");
+
+ // Also read: https://github.com/ocornut/imgui/wiki/Error-Handling
+ ImGui::SeparatorText("Error Handling");
+
+ ImGui::Checkbox("io.ConfigErrorRecovery", &io.ConfigErrorRecovery);
+ ImGui::SameLine(); HelpMarker(
+ "Options to configure how we handle recoverable errors.\n"
+ "- Error recovery is not perfect nor guaranteed! It is a feature to ease development.\n"
+ "- You not are not supposed to rely on it in the course of a normal application run.\n"
+ "- Possible usage: facilitate recovery from errors triggered from a scripting language or after specific exceptions handlers.\n"
+ "- Always ensure that on programmers seat you have at minimum Asserts or Tooltips enabled when making direct imgui API call! "
+ "Otherwise it would severely hinder your ability to catch and correct mistakes!");
+ ImGui::Checkbox("io.ConfigErrorRecoveryEnableAssert", &io.ConfigErrorRecoveryEnableAssert);
+ ImGui::Checkbox("io.ConfigErrorRecoveryEnableDebugLog", &io.ConfigErrorRecoveryEnableDebugLog);
+ ImGui::Checkbox("io.ConfigErrorRecoveryEnableTooltip", &io.ConfigErrorRecoveryEnableTooltip);
+ if (!io.ConfigErrorRecoveryEnableAssert && !io.ConfigErrorRecoveryEnableDebugLog && !io.ConfigErrorRecoveryEnableTooltip)
+ io.ConfigErrorRecoveryEnableAssert = io.ConfigErrorRecoveryEnableDebugLog = io.ConfigErrorRecoveryEnableTooltip = true;
+
+ // Also read: https://github.com/ocornut/imgui/wiki/Debug-Tools
+ ImGui::SeparatorText("Debug");
+ ImGui::Checkbox("io.ConfigDebugIsDebuggerPresent", &io.ConfigDebugIsDebuggerPresent);
+ ImGui::SameLine(); HelpMarker("Enable various tools calling IM_DEBUG_BREAK().\n\nRequires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application.");
+ ImGui::Checkbox("io.ConfigDebugHighlightIdConflicts", &io.ConfigDebugHighlightIdConflicts);
+ ImGui::SameLine(); HelpMarker("Highlight and show an error message when multiple items have conflicting identifiers.");
+ ImGui::BeginDisabled();
+ ImGui::Checkbox("io.ConfigDebugBeginReturnValueOnce", &io.ConfigDebugBeginReturnValueOnce);
+ ImGui::EndDisabled();
+ ImGui::SameLine(); HelpMarker("First calls to Begin()/BeginChild() will return false.\n\nTHIS OPTION IS DISABLED because it needs to be set at application boot-time to make sense. Showing the disabled option is a way to make this feature easier to discover.");
+ ImGui::Checkbox("io.ConfigDebugBeginReturnValueLoop", &io.ConfigDebugBeginReturnValueLoop);
+ ImGui::SameLine(); HelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running.");
+ ImGui::Checkbox("io.ConfigDebugIgnoreFocusLoss", &io.ConfigDebugIgnoreFocusLoss);
+ ImGui::SameLine(); HelpMarker("Option to deactivate io.AddFocusEvent(false) handling. May facilitate interactions with a debugger when focus loss leads to clearing inputs data.");
+ ImGui::Checkbox("io.ConfigDebugIniSettings", &io.ConfigDebugIniSettings);
+ ImGui::SameLine(); HelpMarker("Option to save .ini data with extra comments (particularly helpful for Docking, but makes saving slower).");
+
ImGui::TreePop();
- ImGui::Separator();
+ ImGui::Spacing();
}
IMGUI_DEMO_MARKER("Configuration/Backend Flags");
@@ -471,24 +559,26 @@ void ImGui::ShowDemoWindow(bool* p_open)
"Those flags are set by the backends (imgui_impl_xxx files) to specify their capabilities.\n"
"Here we expose them as read-only fields to avoid breaking interactions with your backend.");
- // Make a local copy to avoid modifying actual backend flags.
- // FIXME: We don't use BeginDisabled() to keep label bright, maybe we need a BeginReadonly() equivalent..
- ImGuiBackendFlags backend_flags = io.BackendFlags;
- ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", &backend_flags, ImGuiBackendFlags_HasGamepad);
- ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &backend_flags, ImGuiBackendFlags_HasMouseCursors);
- ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &backend_flags, ImGuiBackendFlags_HasSetMousePos);
- ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &backend_flags, ImGuiBackendFlags_RendererHasVtxOffset);
+ // FIXME: Maybe we need a BeginReadonly() equivalent to keep label bright?
+ ImGui::BeginDisabled();
+ ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", &io.BackendFlags, ImGuiBackendFlags_HasGamepad);
+ ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
+ ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &io.BackendFlags, ImGuiBackendFlags_HasSetMousePos);
+ ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &io.BackendFlags, ImGuiBackendFlags_RendererHasVtxOffset);
+ ImGui::EndDisabled();
+
ImGui::TreePop();
- ImGui::Separator();
+ ImGui::Spacing();
}
IMGUI_DEMO_MARKER("Configuration/Style");
if (ImGui::TreeNode("Style"))
{
+ ImGui::Checkbox("Style Editor", &demo_data.ShowStyleEditor);
+ ImGui::SameLine();
HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function.");
- ImGui::ShowStyleEditor();
ImGui::TreePop();
- ImGui::Separator();
+ ImGui::Spacing();
}
IMGUI_DEMO_MARKER("Configuration/Capture, Logging");
@@ -532,30 +622,194 @@ void ImGui::ShowDemoWindow(bool* p_open)
}
// All demo contents
- ShowDemoWindowWidgets();
- ShowDemoWindowLayout();
- ShowDemoWindowPopups();
- ShowDemoWindowTables();
- ShowDemoWindowInputs();
+ DemoWindowWidgets(&demo_data);
+ DemoWindowLayout();
+ DemoWindowPopups();
+ DemoWindowTables();
+ DemoWindowInputs();
// End of ShowDemoWindow()
ImGui::PopItemWidth();
ImGui::End();
}
-static void ShowDemoWindowWidgets()
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowMenuBar()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowMenuBar(ImGuiDemoWindowData* demo_data)
{
- IMGUI_DEMO_MARKER("Widgets");
- if (!ImGui::CollapsingHeader("Widgets"))
- return;
+ IMGUI_DEMO_MARKER("Menu");
+ if (ImGui::BeginMenuBar())
+ {
+ if (ImGui::BeginMenu("Menu"))
+ {
+ IMGUI_DEMO_MARKER("Menu/File");
+ ShowExampleMenuFile();
+ ImGui::EndMenu();
+ }
+ if (ImGui::BeginMenu("Examples"))
+ {
+ IMGUI_DEMO_MARKER("Menu/Examples");
+ ImGui::MenuItem("Main menu bar", NULL, &demo_data->ShowMainMenuBar);
+
+ ImGui::SeparatorText("Mini apps");
+ ImGui::MenuItem("Assets Browser", NULL, &demo_data->ShowAppAssetsBrowser);
+ ImGui::MenuItem("Console", NULL, &demo_data->ShowAppConsole);
+ ImGui::MenuItem("Custom rendering", NULL, &demo_data->ShowAppCustomRendering);
+ ImGui::MenuItem("Documents", NULL, &demo_data->ShowAppDocuments);
+ ImGui::MenuItem("Log", NULL, &demo_data->ShowAppLog);
+ ImGui::MenuItem("Property editor", NULL, &demo_data->ShowAppPropertyEditor);
+ ImGui::MenuItem("Simple layout", NULL, &demo_data->ShowAppLayout);
+ ImGui::MenuItem("Simple overlay", NULL, &demo_data->ShowAppSimpleOverlay);
+
+ ImGui::SeparatorText("Concepts");
+ ImGui::MenuItem("Auto-resizing window", NULL, &demo_data->ShowAppAutoResize);
+ ImGui::MenuItem("Constrained-resizing window", NULL, &demo_data->ShowAppConstrainedResize);
+ ImGui::MenuItem("Fullscreen window", NULL, &demo_data->ShowAppFullscreen);
+ ImGui::MenuItem("Long text display", NULL, &demo_data->ShowAppLongText);
+ ImGui::MenuItem("Manipulating window titles", NULL, &demo_data->ShowAppWindowTitles);
- static bool disable_all = false; // The Checkbox for that is inside the "Disabled" section at the bottom
- if (disable_all)
- ImGui::BeginDisabled();
+ ImGui::EndMenu();
+ }
+ //if (ImGui::MenuItem("MenuItem")) {} // You can also use MenuItem() inside a menu bar!
+ if (ImGui::BeginMenu("Tools"))
+ {
+ IMGUI_DEMO_MARKER("Menu/Tools");
+ ImGuiIO& io = ImGui::GetIO();
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ const bool has_debug_tools = true;
+#else
+ const bool has_debug_tools = false;
+#endif
+ ImGui::MenuItem("Metrics/Debugger", NULL, &demo_data->ShowMetrics, has_debug_tools);
+ if (ImGui::BeginMenu("Debug Options"))
+ {
+ ImGui::BeginDisabled(!has_debug_tools);
+ ImGui::Checkbox("Highlight ID Conflicts", &io.ConfigDebugHighlightIdConflicts);
+ ImGui::EndDisabled();
+ ImGui::Checkbox("Assert on error recovery", &io.ConfigErrorRecoveryEnableAssert);
+ ImGui::TextDisabled("(see Demo->Configuration for details & more)");
+ ImGui::EndMenu();
+ }
+ ImGui::MenuItem("Debug Log", NULL, &demo_data->ShowDebugLog, has_debug_tools);
+ ImGui::MenuItem("ID Stack Tool", NULL, &demo_data->ShowIDStackTool, has_debug_tools);
+ bool is_debugger_present = io.ConfigDebugIsDebuggerPresent;
+ if (ImGui::MenuItem("Item Picker", NULL, false, has_debug_tools))// && is_debugger_present))
+ ImGui::DebugStartItemPicker();
+ if (!is_debugger_present)
+ ImGui::SetItemTooltip("Requires io.ConfigDebugIsDebuggerPresent=true to be set.\n\nWe otherwise disable some extra features to avoid casual users crashing the application.");
+ ImGui::MenuItem("Style Editor", NULL, &demo_data->ShowStyleEditor);
+ ImGui::MenuItem("About Dear ImGui", NULL, &demo_data->ShowAbout);
+
+ ImGui::EndMenu();
+ }
+ ImGui::EndMenuBar();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Helpers: ExampleTreeNode, ExampleMemberInfo (for use by Property Editor & Multi-Select demos)
+//-----------------------------------------------------------------------------
+
+// Simple representation for a tree
+// (this is designed to be simple to understand for our demos, not to be fancy or efficient etc.)
+struct ExampleTreeNode
+{
+ // Tree structure
+ char Name[28] = "";
+ int UID = 0;
+ ExampleTreeNode* Parent = NULL;
+ ImVector<ExampleTreeNode*> Childs;
+ unsigned short IndexInParent = 0; // Maintaining this allows us to implement linear traversal more easily
+
+ // Leaf Data
+ bool HasData = false; // All leaves have data
+ bool DataMyBool = true;
+ int DataMyInt = 128;
+ ImVec2 DataMyVec2 = ImVec2(0.0f, 3.141592f);
+};
+// Simple representation of struct metadata/serialization data.
+// (this is a minimal version of what a typical advanced application may provide)
+struct ExampleMemberInfo
+{
+ const char* Name; // Member name
+ ImGuiDataType DataType; // Member type
+ int DataCount; // Member count (1 when scalar)
+ int Offset; // Offset inside parent structure
+};
+
+// Metadata description of ExampleTreeNode struct.
+static const ExampleMemberInfo ExampleTreeNodeMemberInfos[]
+{
+ { "MyName", ImGuiDataType_String, 1, offsetof(ExampleTreeNode, Name) },
+ { "MyBool", ImGuiDataType_Bool, 1, offsetof(ExampleTreeNode, DataMyBool) },
+ { "MyInt", ImGuiDataType_S32, 1, offsetof(ExampleTreeNode, DataMyInt) },
+ { "MyVec2", ImGuiDataType_Float, 2, offsetof(ExampleTreeNode, DataMyVec2) },
+};
+
+static ExampleTreeNode* ExampleTree_CreateNode(const char* name, int uid, ExampleTreeNode* parent)
+{
+ ExampleTreeNode* node = IM_NEW(ExampleTreeNode);
+ snprintf(node->Name, IM_ARRAYSIZE(node->Name), "%s", name);
+ node->UID = uid;
+ node->Parent = parent;
+ node->IndexInParent = parent ? (unsigned short)parent->Childs.Size : 0;
+ if (parent)
+ parent->Childs.push_back(node);
+ return node;
+}
+
+static void ExampleTree_DestroyNode(ExampleTreeNode* node)
+{
+ for (ExampleTreeNode* child_node : node->Childs)
+ ExampleTree_DestroyNode(child_node);
+ IM_DELETE(node);
+}
+
+// Create example tree data
+// (this allocates _many_ more times than most other code in either Dear ImGui or others demo)
+static ExampleTreeNode* ExampleTree_CreateDemoTree()
+{
+ static const char* root_names[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pear", "Pineapple", "Strawberry", "Watermelon" };
+ const size_t NAME_MAX_LEN = sizeof(ExampleTreeNode::Name);
+ char name_buf[NAME_MAX_LEN];
+ int uid = 0;
+ ExampleTreeNode* node_L0 = ExampleTree_CreateNode("<ROOT>", ++uid, NULL);
+ const int root_items_multiplier = 2;
+ for (int idx_L0 = 0; idx_L0 < IM_ARRAYSIZE(root_names) * root_items_multiplier; idx_L0++)
+ {
+ snprintf(name_buf, IM_ARRAYSIZE(name_buf), "%s %d", root_names[idx_L0 / root_items_multiplier], idx_L0 % root_items_multiplier);
+ ExampleTreeNode* node_L1 = ExampleTree_CreateNode(name_buf, ++uid, node_L0);
+ const int number_of_childs = (int)strlen(node_L1->Name);
+ for (int idx_L1 = 0; idx_L1 < number_of_childs; idx_L1++)
+ {
+ snprintf(name_buf, IM_ARRAYSIZE(name_buf), "Child %d", idx_L1);
+ ExampleTreeNode* node_L2 = ExampleTree_CreateNode(name_buf, ++uid, node_L1);
+ node_L2->HasData = true;
+ if (idx_L1 == 0)
+ {
+ snprintf(name_buf, IM_ARRAYSIZE(name_buf), "Sub-child %d", 0);
+ ExampleTreeNode* node_L3 = ExampleTree_CreateNode(name_buf, ++uid, node_L2);
+ node_L3->HasData = true;
+ }
+ }
+ }
+ return node_L0;
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsBasic()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsBasic()
+{
IMGUI_DEMO_MARKER("Widgets/Basic");
if (ImGui::TreeNode("Basic"))
{
+ ImGui::SeparatorText("General");
+
IMGUI_DEMO_MARKER("Widgets/Basic/Button");
static int clicked = 0;
if (ImGui::Button("Button"))
@@ -602,27 +856,20 @@ static void ShowDemoWindowWidgets()
IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Repeating)");
static int counter = 0;
float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
- ImGui::PushButtonRepeat(true);
+ ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat, true);
if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; }
ImGui::SameLine(0.0f, spacing);
if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; }
- ImGui::PopButtonRepeat();
+ ImGui::PopItemFlag();
ImGui::SameLine();
ImGui::Text("%d", counter);
- ImGui::Separator();
+ ImGui::Button("Tooltip");
+ ImGui::SetItemTooltip("I am a tooltip");
+
ImGui::LabelText("label", "Value");
- {
- // Using the _simplified_ one-liner Combo() api here
- // See "Combo" section for examples of how to use the more flexible BeginCombo()/EndCombo() api.
- IMGUI_DEMO_MARKER("Widgets/Basic/Combo");
- const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIIIIII", "JJJJ", "KKKKKKK" };
- static int item_current = 0;
- ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items));
- ImGui::SameLine(); HelpMarker(
- "Using the simplified one-liner Combo API here.\nRefer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API.");
- }
+ ImGui::SeparatorText("Inputs");
{
// To wire InputText() with std::string or any other custom string type,
@@ -635,8 +882,8 @@ static void ShowDemoWindowWidgets()
"Hold SHIFT or use mouse to select text.\n"
"CTRL+Left/Right to word jump.\n"
"CTRL+A or Double-Click to select all.\n"
- "CTRL+X,CTRL+C,CTRL+V clipboard.\n"
- "CTRL+Z,CTRL+Y undo/redo.\n"
+ "CTRL+X,CTRL+C,CTRL+V for clipboard.\n"
+ "CTRL+Z to undo, CTRL+Y/CTRL+SHIFT+Z to redo.\n"
"ESCAPE to revert.\n\n"
"PROGRAMMER:\n"
"You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() "
@@ -666,22 +913,27 @@ static void ShowDemoWindowWidgets()
ImGui::InputFloat3("input float3", vec4a);
}
+ ImGui::SeparatorText("Drags");
+
{
IMGUI_DEMO_MARKER("Widgets/Basic/DragInt, DragFloat");
- static int i1 = 50, i2 = 42;
+ static int i1 = 50, i2 = 42, i3 = 128;
ImGui::DragInt("drag int", &i1, 1);
ImGui::SameLine(); HelpMarker(
"Click and drag to edit value.\n"
"Hold SHIFT/ALT for faster/slower edit.\n"
"Double-click or CTRL+click to input value.");
-
ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp);
+ ImGui::DragInt("drag int wrap 100..200", &i3, 1, 100, 200, "%d", ImGuiSliderFlags_WrapAround);
static float f1 = 1.00f, f2 = 0.0067f;
ImGui::DragFloat("drag float", &f1, 0.005f);
ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns");
+ //ImGui::DragFloat("drag wrap -1..1", &f3, 0.005f, -1.0f, 1.0f, NULL, ImGuiSliderFlags_WrapAround);
}
+ ImGui::SeparatorText("Sliders");
+
{
IMGUI_DEMO_MARKER("Widgets/Basic/SliderInt, SliderFloat");
static int i1 = 0;
@@ -704,10 +956,12 @@ static void ShowDemoWindowWidgets()
static int elem = Element_Fire;
const char* elems_names[Element_COUNT] = { "Fire", "Earth", "Air", "Water" };
const char* elem_name = (elem >= 0 && elem < Element_COUNT) ? elems_names[elem] : "Unknown";
- ImGui::SliderInt("slider enum", &elem, 0, Element_COUNT - 1, elem_name);
+ ImGui::SliderInt("slider enum", &elem, 0, Element_COUNT - 1, elem_name); // Use ImGuiSliderFlags_NoInput flag to disable CTRL+Click here.
ImGui::SameLine(); HelpMarker("Using the format string parameter to display a name instead of the underlying integer.");
}
+ ImGui::SeparatorText("Selectors/Pickers");
+
{
IMGUI_DEMO_MARKER("Widgets/Basic/ColorEdit3, ColorEdit4");
static float col1[3] = { 1.0f, 0.0f, 0.2f };
@@ -723,6 +977,18 @@ static void ShowDemoWindowWidgets()
}
{
+ // Using the _simplified_ one-liner Combo() api here
+ // See "Combo" section for examples of how to use the more flexible BeginCombo()/EndCombo() api.
+ IMGUI_DEMO_MARKER("Widgets/Basic/Combo");
+ const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIIIIII", "JJJJ", "KKKKKKK" };
+ static int item_current = 0;
+ ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items));
+ ImGui::SameLine(); HelpMarker(
+ "Using the simplified one-liner Combo API here.\n"
+ "Refer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API.");
+ }
+
+ {
// Using the _simplified_ one-liner ListBox() api here
// See "List boxes" section for examples of how to use the more flexible BeginListBox()/EndListBox() api.
IMGUI_DEMO_MARKER("Widgets/Basic/ListBox");
@@ -730,160 +996,48 @@ static void ShowDemoWindowWidgets()
static int item_current = 1;
ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items), 4);
ImGui::SameLine(); HelpMarker(
- "Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API.");
+ "Using the simplified one-liner ListBox API here.\n"
+ "Refer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API.");
}
- {
- // Tooltips
- IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips");
- ImGui::AlignTextToFramePadding();
- ImGui::Text("Tooltips:");
-
- ImGui::SameLine();
- ImGui::Button("Button");
- if (ImGui::IsItemHovered())
- ImGui::SetTooltip("I am a tooltip");
-
- ImGui::SameLine();
- ImGui::Button("Fancy");
- if (ImGui::IsItemHovered())
- {
- ImGui::BeginTooltip();
- ImGui::Text("I am a fancy tooltip");
- static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
- ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr));
- ImGui::Text("Sin(time) = %f", sinf((float)ImGui::GetTime()));
- ImGui::EndTooltip();
- }
-
- ImGui::SameLine();
- ImGui::Button("Delayed");
- if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal)) // Delay best used on items that highlight on hover, so this not a great example!
- ImGui::SetTooltip("I am a tooltip with a delay.");
-
- ImGui::SameLine();
- HelpMarker(
- "Tooltip are created by using the IsItemHovered() function over any kind of item.");
-
- }
+ // Testing ImGuiOnceUponAFrame helper.
+ //static ImGuiOnceUponAFrame once;
+ //for (int i = 0; i < 5; i++)
+ // if (once)
+ // ImGui::Text("This will be displayed only once.");
ImGui::TreePop();
}
+}
- // Testing ImGuiOnceUponAFrame helper.
- //static ImGuiOnceUponAFrame once;
- //for (int i = 0; i < 5; i++)
- // if (once)
- // ImGui::Text("This will be displayed only once.");
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsBullets()
+//-----------------------------------------------------------------------------
- IMGUI_DEMO_MARKER("Widgets/Trees");
- if (ImGui::TreeNode("Trees"))
+static void DemoWindowWidgetsBullets()
+{
+ IMGUI_DEMO_MARKER("Widgets/Bullets");
+ if (ImGui::TreeNode("Bullets"))
{
- IMGUI_DEMO_MARKER("Widgets/Trees/Basic trees");
- if (ImGui::TreeNode("Basic trees"))
- {
- for (int i = 0; i < 5; i++)
- {
- // Use SetNextItemOpen() so set the default state of a node to be open. We could
- // also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing!
- if (i == 0)
- ImGui::SetNextItemOpen(true, ImGuiCond_Once);
-
- if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i))
- {
- ImGui::Text("blah blah");
- ImGui::SameLine();
- if (ImGui::SmallButton("button")) {}
- ImGui::TreePop();
- }
- }
- ImGui::TreePop();
- }
-
- IMGUI_DEMO_MARKER("Widgets/Trees/Advanced, with Selectable nodes");
- if (ImGui::TreeNode("Advanced, with Selectable nodes"))
+ ImGui::BulletText("Bullet point 1");
+ ImGui::BulletText("Bullet point 2\nOn multiple lines");
+ if (ImGui::TreeNode("Tree node"))
{
- HelpMarker(
- "This is a more typical looking tree with selectable nodes.\n"
- "Click to select, CTRL+Click to toggle, click on arrows or double-click to open.");
- static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth;
- static bool align_label_with_current_x_position = false;
- static bool test_drag_and_drop = false;
- ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow);
- ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick);
- ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node.");
- ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth);
- ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position);
- ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop);
- ImGui::Text("Hello!");
- if (align_label_with_current_x_position)
- ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing());
-
- // 'selection_mask' is dumb representation of what may be user-side selection state.
- // You may retain selection state inside or outside your objects in whatever format you see fit.
- // 'node_clicked' is temporary storage of what node we have clicked to process selection at the end
- /// of the loop. May be a pointer to your own node type, etc.
- static int selection_mask = (1 << 2);
- int node_clicked = -1;
- for (int i = 0; i < 6; i++)
- {
- // Disable the default "open on single-click behavior" + set Selected flag according to our selection.
- // To alter selection we use IsItemClicked() && !IsItemToggledOpen(), so clicking on an arrow doesn't alter selection.
- ImGuiTreeNodeFlags node_flags = base_flags;
- const bool is_selected = (selection_mask & (1 << i)) != 0;
- if (is_selected)
- node_flags |= ImGuiTreeNodeFlags_Selected;
- if (i < 3)
- {
- // Items 0..2 are Tree Node
- bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i);
- if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
- node_clicked = i;
- if (test_drag_and_drop && ImGui::BeginDragDropSource())
- {
- ImGui::SetDragDropPayload("_TREENODE", NULL, 0);
- ImGui::Text("This is a drag and drop source");
- ImGui::EndDragDropSource();
- }
- if (node_open)
- {
- ImGui::BulletText("Blah blah\nBlah Blah");
- ImGui::TreePop();
- }
- }
- else
- {
- // Items 3..5 are Tree Leaves
- // The only reason we use TreeNode at all is to allow selection of the leaf. Otherwise we can
- // use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text().
- node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet
- ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i);
- if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
- node_clicked = i;
- if (test_drag_and_drop && ImGui::BeginDragDropSource())
- {
- ImGui::SetDragDropPayload("_TREENODE", NULL, 0);
- ImGui::Text("This is a drag and drop source");
- ImGui::EndDragDropSource();
- }
- }
- }
- if (node_clicked != -1)
- {
- // Update selection state
- // (process outside of tree loop to avoid visual inconsistencies during the clicking frame)
- if (ImGui::GetIO().KeyCtrl)
- selection_mask ^= (1 << node_clicked); // CTRL+click to toggle
- else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, may want to preserve selection when clicking on item that is part of the selection
- selection_mask = (1 << node_clicked); // Click to single-select
- }
- if (align_label_with_current_x_position)
- ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing());
+ ImGui::BulletText("Another bullet point");
ImGui::TreePop();
}
+ ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)");
+ ImGui::Bullet(); ImGui::SmallButton("Button");
ImGui::TreePop();
}
+}
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsCollapsingHeaders()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsCollapsingHeaders()
+{
IMGUI_DEMO_MARKER("Widgets/Collapsing Headers");
if (ImGui::TreeNode("Collapsing Headers"))
{
@@ -907,97 +1061,670 @@ static void ShowDemoWindowWidgets()
*/
ImGui::TreePop();
}
+}
- IMGUI_DEMO_MARKER("Widgets/Bullets");
- if (ImGui::TreeNode("Bullets"))
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsColorAndPickers()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsColorAndPickers()
+{
+ IMGUI_DEMO_MARKER("Widgets/Color");
+ if (ImGui::TreeNode("Color/Picker Widgets"))
{
- ImGui::BulletText("Bullet point 1");
- ImGui::BulletText("Bullet point 2\nOn multiple lines");
- if (ImGui::TreeNode("Tree node"))
+ static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f);
+ static ImGuiColorEditFlags base_flags = ImGuiColorEditFlags_None;
+
+ ImGui::SeparatorText("Options");
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_NoAlpha", &base_flags, ImGuiColorEditFlags_NoAlpha);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_AlphaOpaque", &base_flags, ImGuiColorEditFlags_AlphaOpaque);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_AlphaNoBg", &base_flags, ImGuiColorEditFlags_AlphaNoBg);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_AlphaPreviewHalf", &base_flags, ImGuiColorEditFlags_AlphaPreviewHalf);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_NoDragDrop", &base_flags, ImGuiColorEditFlags_NoDragDrop);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_NoOptions", &base_flags, ImGuiColorEditFlags_NoOptions); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options.");
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_HDR", &base_flags, ImGuiColorEditFlags_HDR); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets.");
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit");
+ ImGui::SeparatorText("Inline color editor");
+ ImGui::Text("Color widget:");
+ ImGui::SameLine(); HelpMarker(
+ "Click on the color square to open a color picker.\n"
+ "CTRL+click on individual component to input value.\n");
+ ImGui::ColorEdit3("MyColor##1", (float*)&color, base_flags);
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (HSV, with Alpha)");
+ ImGui::Text("Color widget HSV with Alpha:");
+ ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | base_flags);
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (float display)");
+ ImGui::Text("Color widget with Float Display:");
+ ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | base_flags);
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with Picker)");
+ ImGui::Text("Color button with Picker:");
+ ImGui::SameLine(); HelpMarker(
+ "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n"
+ "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only "
+ "be used for the tooltip and picker popup.");
+ ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | base_flags);
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with custom Picker popup)");
+ ImGui::Text("Color button with Custom Picker Popup:");
+
+ // Generate a default palette. The palette will persist and can be edited.
+ static bool saved_palette_init = true;
+ static ImVec4 saved_palette[32] = {};
+ if (saved_palette_init)
{
- ImGui::BulletText("Another bullet point");
- ImGui::TreePop();
+ for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
+ {
+ ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f,
+ saved_palette[n].x, saved_palette[n].y, saved_palette[n].z);
+ saved_palette[n].w = 1.0f; // Alpha
+ }
+ saved_palette_init = false;
}
- ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)");
- ImGui::Bullet(); ImGui::SmallButton("Button");
+
+ static ImVec4 backup_color;
+ bool open_popup = ImGui::ColorButton("MyColor##3b", color, base_flags);
+ ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
+ open_popup |= ImGui::Button("Palette");
+ if (open_popup)
+ {
+ ImGui::OpenPopup("mypicker");
+ backup_color = color;
+ }
+ if (ImGui::BeginPopup("mypicker"))
+ {
+ ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!");
+ ImGui::Separator();
+ ImGui::ColorPicker4("##picker", (float*)&color, base_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview);
+ ImGui::SameLine();
+
+ ImGui::BeginGroup(); // Lock X position
+ ImGui::Text("Current");
+ ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40));
+ ImGui::Text("Previous");
+ if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)))
+ color = backup_color;
+ ImGui::Separator();
+ ImGui::Text("Palette");
+ for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
+ {
+ ImGui::PushID(n);
+ if ((n % 8) != 0)
+ ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
+
+ ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip;
+ if (ImGui::ColorButton("##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20)))
+ color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha!
+
+ // Allow user to drop colors into each palette entry. Note that ColorButton() is already a
+ // drag source by default, unless specifying the ImGuiColorEditFlags_NoDragDrop flag.
+ if (ImGui::BeginDragDropTarget())
+ {
+ if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
+ memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3);
+ if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F))
+ memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4);
+ ImGui::EndDragDropTarget();
+ }
+
+ ImGui::PopID();
+ }
+ ImGui::EndGroup();
+ ImGui::EndPopup();
+ }
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (simple)");
+ ImGui::Text("Color button only:");
+ static bool no_border = false;
+ ImGui::Checkbox("ImGuiColorEditFlags_NoBorder", &no_border);
+ ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, base_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80));
+
+ IMGUI_DEMO_MARKER("Widgets/Color/ColorPicker");
+ ImGui::SeparatorText("Color picker");
+
+ static bool ref_color = false;
+ static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f);
+ static int picker_mode = 0;
+ static int display_mode = 0;
+ static ImGuiColorEditFlags color_picker_flags = ImGuiColorEditFlags_AlphaBar;
+
+ ImGui::PushID("Color picker");
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_NoAlpha", &color_picker_flags, ImGuiColorEditFlags_NoAlpha);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_AlphaBar", &color_picker_flags, ImGuiColorEditFlags_AlphaBar);
+ ImGui::CheckboxFlags("ImGuiColorEditFlags_NoSidePreview", &color_picker_flags, ImGuiColorEditFlags_NoSidePreview);
+ if (color_picker_flags & ImGuiColorEditFlags_NoSidePreview)
+ {
+ ImGui::SameLine();
+ ImGui::Checkbox("With Ref Color", &ref_color);
+ if (ref_color)
+ {
+ ImGui::SameLine();
+ ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | base_flags);
+ }
+ }
+
+ ImGui::Combo("Picker Mode", &picker_mode, "Auto/Current\0ImGuiColorEditFlags_PickerHueBar\0ImGuiColorEditFlags_PickerHueWheel\0");
+ ImGui::SameLine(); HelpMarker("When not specified explicitly, user can right-click the picker to change mode.");
+
+ ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0ImGuiColorEditFlags_NoInputs\0ImGuiColorEditFlags_DisplayRGB\0ImGuiColorEditFlags_DisplayHSV\0ImGuiColorEditFlags_DisplayHex\0");
+ ImGui::SameLine(); HelpMarker(
+ "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, "
+ "but the user can change it with a right-click on those inputs.\n\nColorPicker defaults to displaying RGB+HSV+Hex "
+ "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions().");
+
+ ImGuiColorEditFlags flags = base_flags | color_picker_flags;
+ if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar;
+ if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel;
+ if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays
+ if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode
+ if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV;
+ if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex;
+ ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL);
+
+ ImGui::Text("Set defaults in code:");
+ ImGui::SameLine(); HelpMarker(
+ "SetColorEditOptions() is designed to allow you to set boot-time default.\n"
+ "We don't have Push/Pop functions because you can force options on a per-widget basis if needed, "
+ "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid "
+ "encouraging you to persistently save values that aren't forward-compatible.");
+ if (ImGui::Button("Default: Uint8 + HSV + Hue Bar"))
+ ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar);
+ if (ImGui::Button("Default: Float + HDR + Hue Wheel"))
+ ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel);
+
+ // Always display a small version of both types of pickers
+ // (that's in order to make it more visible in the demo to people who are skimming quickly through it)
+ ImGui::Text("Both types:");
+ float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f;
+ ImGui::SetNextItemWidth(w);
+ ImGui::ColorPicker3("##MyColor##5", (float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
+ ImGui::SameLine();
+ ImGui::SetNextItemWidth(w);
+ ImGui::ColorPicker3("##MyColor##6", (float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
+ ImGui::PopID();
+
+ // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0)
+ static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV!
+ ImGui::Spacing();
+ ImGui::Text("HSV encoded colors");
+ ImGui::SameLine(); HelpMarker(
+ "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV "
+ "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the "
+ "added benefit that you can manipulate hue values with the picker even when saturation or value are zero.");
+ ImGui::Text("Color widget with InputHSV:");
+ ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
+ ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
+ ImGui::DragFloat4("Raw HSV values", (float*)&color_hsv, 0.01f, 0.0f, 1.0f);
+
ImGui::TreePop();
}
+}
- IMGUI_DEMO_MARKER("Widgets/Text");
- if (ImGui::TreeNode("Text"))
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsComboBoxes()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsComboBoxes()
+{
+ IMGUI_DEMO_MARKER("Widgets/Combo");
+ if (ImGui::TreeNode("Combo"))
{
- IMGUI_DEMO_MARKER("Widgets/Text/Colored Text");
- if (ImGui::TreeNode("Colorful Text"))
+ // Combo Boxes are also called "Dropdown" in other systems
+ // Expose flags as checkbox for the demo
+ static ImGuiComboFlags flags = 0;
+ ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft);
+ ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo");
+ if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton))
+ flags &= ~ImGuiComboFlags_NoPreview; // Clear incompatible flags
+ if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview))
+ flags &= ~(ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_WidthFitPreview); // Clear incompatible flags
+ if (ImGui::CheckboxFlags("ImGuiComboFlags_WidthFitPreview", &flags, ImGuiComboFlags_WidthFitPreview))
+ flags &= ~ImGuiComboFlags_NoPreview;
+
+ // Override default popup height
+ if (ImGui::CheckboxFlags("ImGuiComboFlags_HeightSmall", &flags, ImGuiComboFlags_HeightSmall))
+ flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightSmall);
+ if (ImGui::CheckboxFlags("ImGuiComboFlags_HeightRegular", &flags, ImGuiComboFlags_HeightRegular))
+ flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightRegular);
+ if (ImGui::CheckboxFlags("ImGuiComboFlags_HeightLargest", &flags, ImGuiComboFlags_HeightLargest))
+ flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightLargest);
+
+ // Using the generic BeginCombo() API, you have full control over how to display the combo contents.
+ // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively
+ // stored in the object itself, etc.)
+ const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" };
+ static int item_selected_idx = 0; // Here we store our selection data as an index.
+
+ // Pass in the preview value visible before opening the combo (it could technically be different contents or not pulled from items[])
+ const char* combo_preview_value = items[item_selected_idx];
+ if (ImGui::BeginCombo("combo 1", combo_preview_value, flags))
{
- // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility.
- ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink");
- ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow");
- ImGui::TextDisabled("Disabled");
- ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle.");
+ for (int n = 0; n < IM_ARRAYSIZE(items); n++)
+ {
+ const bool is_selected = (item_selected_idx == n);
+ if (ImGui::Selectable(items[n], is_selected))
+ item_selected_idx = n;
+
+ // Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
+ if (is_selected)
+ ImGui::SetItemDefaultFocus();
+ }
+ ImGui::EndCombo();
+ }
+
+ // Show case embedding a filter using a simple trick: displaying the filter inside combo contents.
+ // See https://github.com/ocornut/imgui/issues/718 for advanced/esoteric alternatives.
+ if (ImGui::BeginCombo("combo 2 (w/ filter)", combo_preview_value, flags))
+ {
+ static ImGuiTextFilter filter;
+ if (ImGui::IsWindowAppearing())
+ {
+ ImGui::SetKeyboardFocusHere();
+ filter.Clear();
+ }
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_F);
+ filter.Draw("##Filter", -FLT_MIN);
+
+ for (int n = 0; n < IM_ARRAYSIZE(items); n++)
+ {
+ const bool is_selected = (item_selected_idx == n);
+ if (filter.PassFilter(items[n]))
+ if (ImGui::Selectable(items[n], is_selected))
+ item_selected_idx = n;
+ }
+ ImGui::EndCombo();
+ }
+
+ ImGui::Spacing();
+ ImGui::SeparatorText("One-liner variants");
+ HelpMarker("The Combo() function is not greatly useful apart from cases were you want to embed all options in a single strings.\nFlags above don't apply to this section.");
+
+ // Simplified one-liner Combo() API, using values packed in a single constant string
+ // This is a convenience for when the selection set is small and known at compile-time.
+ static int item_current_2 = 0;
+ ImGui::Combo("combo 3 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
+
+ // Simplified one-liner Combo() using an array of const char*
+ // This is not very useful (may obsolete): prefer using BeginCombo()/EndCombo() for full control.
+ static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview
+ ImGui::Combo("combo 4 (array)", &item_current_3, items, IM_ARRAYSIZE(items));
+
+ // Simplified one-liner Combo() using an accessor function
+ static int item_current_4 = 0;
+ ImGui::Combo("combo 5 (function)", &item_current_4, [](void* data, int n) { return ((const char**)data)[n]; }, items, IM_ARRAYSIZE(items));
+
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsDataTypes()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsDataTypes()
+{
+ IMGUI_DEMO_MARKER("Widgets/Data Types");
+ if (ImGui::TreeNode("Data Types"))
+ {
+ // DragScalar/InputScalar/SliderScalar functions allow various data types
+ // - signed/unsigned
+ // - 8/16/32/64-bits
+ // - integer/float/double
+ // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum
+ // to pass the type, and passing all arguments by pointer.
+ // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each type.
+ // In practice, if you frequently use a given type that is not covered by the normal API entry points,
+ // you can wrap it yourself inside a 1 line function which can take typed argument as value instead of void*,
+ // and then pass their address to the generic function. For example:
+ // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld")
+ // {
+ // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format);
+ // }
+
+ // Setup limits (as helper variables so we can take their address, as explained above)
+ // Note: SliderScalar() functions have a maximum usable range of half the natural type maximum, hence the /2.
+ #ifndef LLONG_MIN
+ ImS64 LLONG_MIN = -9223372036854775807LL - 1;
+ ImS64 LLONG_MAX = 9223372036854775807LL;
+ ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1);
+ #endif
+ const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127;
+ const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255;
+ const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767;
+ const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535;
+ const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2;
+ const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2;
+ const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2;
+ const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2;
+ const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f;
+ const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0;
+
+ // State
+ static char s8_v = 127;
+ static ImU8 u8_v = 255;
+ static short s16_v = 32767;
+ static ImU16 u16_v = 65535;
+ static ImS32 s32_v = -1;
+ static ImU32 u32_v = (ImU32)-1;
+ static ImS64 s64_v = -1;
+ static ImU64 u64_v = (ImU64)-1;
+ static float f32_v = 0.123f;
+ static double f64_v = 90000.01234567890123456789;
+
+ const float drag_speed = 0.2f;
+ static bool drag_clamp = false;
+ IMGUI_DEMO_MARKER("Widgets/Data Types/Drags");
+ ImGui::SeparatorText("Drags");
+ ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp);
+ ImGui::SameLine(); HelpMarker(
+ "As with every widget in dear imgui, we never modify values unless there is a user interaction.\n"
+ "You can override the clamping limits by using CTRL+Click to input a value.");
+ ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL);
+ ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms");
+ ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL);
+ ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms");
+ ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL);
+ ImGui::DragScalar("drag s32 hex", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL, "0x%08X");
+ ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms");
+ ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL);
+ ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL);
+ ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f");
+ ImGui::DragScalar("drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", ImGuiSliderFlags_Logarithmic);
+ ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams");
+ ImGui::DragScalar("drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", ImGuiSliderFlags_Logarithmic);
+
+ IMGUI_DEMO_MARKER("Widgets/Data Types/Sliders");
+ ImGui::SeparatorText("Sliders");
+ ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d");
+ ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u");
+ ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d");
+ ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u");
+ ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d");
+ ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d");
+ ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d");
+ ImGui::SliderScalar("slider s32 hex", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty, "0x%04X");
+ ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u");
+ ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u");
+ ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u");
+ ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" PRId64);
+ ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" PRId64);
+ ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" PRId64);
+ ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" PRIu64 " ms");
+ ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" PRIu64 " ms");
+ ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" PRIu64 " ms");
+ ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one);
+ ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic);
+ ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e");
+ ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams");
+ ImGui::SliderScalar("slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", ImGuiSliderFlags_Logarithmic);
+ ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams");
+
+ ImGui::SeparatorText("Sliders (reverse)");
+ ImGui::SliderScalar("slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min, "%d");
+ ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u");
+ ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d");
+ ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u");
+ ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" PRId64);
+ ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" PRIu64 " ms");
+
+ IMGUI_DEMO_MARKER("Widgets/Data Types/Inputs");
+ static bool inputs_step = true;
+ static ImGuiInputTextFlags flags = ImGuiInputTextFlags_None;
+ ImGui::SeparatorText("Inputs");
+ ImGui::Checkbox("Show step buttons", &inputs_step);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_ParseEmptyRefVal", &flags, ImGuiInputTextFlags_ParseEmptyRefVal);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_DisplayEmptyRefVal", &flags, ImGuiInputTextFlags_DisplayEmptyRefVal);
+ ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d", flags);
+ ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u", flags);
+ ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d", flags);
+ ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u", flags);
+ ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d", flags);
+ ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X", flags);
+ ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u", flags);
+ ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X", flags);
+ ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL, NULL, NULL, flags);
+ ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL, NULL, NULL, flags);
+ ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL, NULL, NULL, flags);
+ ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL, NULL, NULL, flags);
+
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsDisableBlocks()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsDisableBlocks(ImGuiDemoWindowData* demo_data)
+{
+ IMGUI_DEMO_MARKER("Widgets/Disable Blocks");
+ if (ImGui::TreeNode("Disable Blocks"))
+ {
+ ImGui::Checkbox("Disable entire section above", &demo_data->DisableSections);
+ ImGui::SameLine(); HelpMarker("Demonstrate using BeginDisabled()/EndDisabled() across other sections.");
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsDragAndDrop()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsDragAndDrop()
+{
+ IMGUI_DEMO_MARKER("Widgets/Drag and drop");
+ if (ImGui::TreeNode("Drag and Drop"))
+ {
+ IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets");
+ if (ImGui::TreeNode("Drag and drop in standard widgets"))
+ {
+ // ColorEdit widgets automatically act as drag source and drag target.
+ // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F
+ // to allow your own widgets to use colors in their drag and drop interaction.
+ // Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo.
+ HelpMarker("You can drag from the color squares.");
+ static float col1[3] = { 1.0f, 0.0f, 0.2f };
+ static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
+ ImGui::ColorEdit3("color 1", col1);
+ ImGui::ColorEdit4("color 2", col2);
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Text/Word Wrapping");
- if (ImGui::TreeNode("Word Wrapping"))
+ IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items");
+ if (ImGui::TreeNode("Drag and drop to copy/swap items"))
{
- // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility.
- ImGui::TextWrapped(
- "This text should automatically wrap on the edge of the window. The current implementation "
- "for text wrapping follows simple rules suitable for English and possibly other languages.");
- ImGui::Spacing();
+ enum Mode
+ {
+ Mode_Copy,
+ Mode_Move,
+ Mode_Swap
+ };
+ static int mode = 0;
+ if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine();
+ if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine();
+ if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
+ static const char* names[9] =
+ {
+ "Bobby", "Beatrice", "Betty",
+ "Brianna", "Barry", "Bernard",
+ "Bibi", "Blaine", "Bryn"
+ };
+ for (int n = 0; n < IM_ARRAYSIZE(names); n++)
+ {
+ ImGui::PushID(n);
+ if ((n % 3) != 0)
+ ImGui::SameLine();
+ ImGui::Button(names[n], ImVec2(60, 60));
- static float wrap_width = 200.0f;
- ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f");
+ // Our buttons are both drag sources and drag targets here!
+ if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
+ {
+ // Set payload to carry the index of our item (could be anything)
+ ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int));
- ImDrawList* draw_list = ImGui::GetWindowDrawList();
- for (int n = 0; n < 2; n++)
+ // Display preview (could be anything, e.g. when dragging an image we could decide to display
+ // the filename and a small preview of the image, etc.)
+ if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); }
+ if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); }
+ if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); }
+ ImGui::EndDragDropSource();
+ }
+ if (ImGui::BeginDragDropTarget())
+ {
+ if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL"))
+ {
+ IM_ASSERT(payload->DataSize == sizeof(int));
+ int payload_n = *(const int*)payload->Data;
+ if (mode == Mode_Copy)
+ {
+ names[n] = names[payload_n];
+ }
+ if (mode == Mode_Move)
+ {
+ names[n] = names[payload_n];
+ names[payload_n] = "";
+ }
+ if (mode == Mode_Swap)
+ {
+ const char* tmp = names[n];
+ names[n] = names[payload_n];
+ names[payload_n] = tmp;
+ }
+ }
+ ImGui::EndDragDropTarget();
+ }
+ ImGui::PopID();
+ }
+ ImGui::TreePop();
+ }
+
+ IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)");
+ if (ImGui::TreeNode("Drag to reorder items (simple)"))
+ {
+ // FIXME: there is temporary (usually single-frame) ID Conflict during reordering as a same item may be submitting twice.
+ // This code was always slightly faulty but in a way which was not easily noticeable.
+ // Until we fix this, enable ImGuiItemFlags_AllowDuplicateId to disable detecting the issue.
+ ImGui::PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true);
+
+ // Simple reordering
+ HelpMarker(
+ "We don't use the drag and drop api at all here! "
+ "Instead we query when the item is held but not hovered, and order items accordingly.");
+ static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" };
+ for (int n = 0; n < IM_ARRAYSIZE(item_names); n++)
{
- ImGui::Text("Test paragraph %d:", n);
- ImVec2 pos = ImGui::GetCursorScreenPos();
- ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y);
- ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight());
- ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);
- if (n == 0)
- ImGui::Text("The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width);
- else
- ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh");
+ const char* item = item_names[n];
+ ImGui::Selectable(item);
- // Draw actual text bounding box, following by marker of our expected limit (should not overlap!)
- draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255));
- draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255));
- ImGui::PopTextWrapPos();
+ if (ImGui::IsItemActive() && !ImGui::IsItemHovered())
+ {
+ int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
+ if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names))
+ {
+ item_names[n] = item_names[n_next];
+ item_names[n_next] = item;
+ ImGui::ResetMouseDragDelta();
+ }
+ }
}
+ ImGui::PopItemFlag();
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Text/UTF-8 Text");
- if (ImGui::TreeNode("UTF-8 Text"))
+ IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Tooltip at target location");
+ if (ImGui::TreeNode("Tooltip at target location"))
{
- // UTF-8 test with Japanese characters
- // (Needs a suitable font? Try "Google Noto" or "Arial Unicode". See docs/FONTS.md for details.)
- // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8
- // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. in Visual Studio, you
- // can save your source files as 'UTF-8 without signature').
- // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8
- // CHARACTERS IN THIS SOURCE FILE. Instead we are encoding a few strings with hexadecimal constants.
- // Don't do this in your application! Please use u8"text in any language" in your application!
- // Note that characters values are preserved even by InputText() if the font cannot be displayed,
- // so you can safely copy & paste garbled characters into another application.
- ImGui::TextWrapped(
- "CJK text will only appear if the font was loaded with the appropriate CJK character ranges. "
- "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. "
- "Read docs/FONTS.md for details.");
- ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string.
- ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)");
- static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e";
- //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis
- ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf));
+ for (int n = 0; n < 2; n++)
+ {
+ // Drop targets
+ ImGui::Button(n ? "drop here##1" : "drop here##0");
+ if (ImGui::BeginDragDropTarget())
+ {
+ ImGuiDragDropFlags drop_target_flags = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoPreviewTooltip;
+ if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, drop_target_flags))
+ {
+ IM_UNUSED(payload);
+ ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
+ ImGui::SetTooltip("Cannot drop here!");
+ }
+ ImGui::EndDragDropTarget();
+ }
+
+ // Drop source
+ static ImVec4 col4 = { 1.0f, 0.0f, 0.2f, 1.0f };
+ if (n == 0)
+ ImGui::ColorButton("drag me", col4);
+
+ }
ImGui::TreePop();
}
+
ImGui::TreePop();
}
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsDragsAndSliders()
+//-----------------------------------------------------------------------------
+static void DemoWindowWidgetsDragsAndSliders()
+{
+ IMGUI_DEMO_MARKER("Widgets/Drag and Slider Flags");
+ if (ImGui::TreeNode("Drag/Slider Flags"))
+ {
+ // Demonstrate using advanced flags for DragXXX and SliderXXX functions. Note that the flags are the same!
+ static ImGuiSliderFlags flags = ImGuiSliderFlags_None;
+ ImGui::CheckboxFlags("ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp);
+ ImGui::CheckboxFlags("ImGuiSliderFlags_ClampOnInput", &flags, ImGuiSliderFlags_ClampOnInput);
+ ImGui::SameLine(); HelpMarker("Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds.");
+ ImGui::CheckboxFlags("ImGuiSliderFlags_ClampZeroRange", &flags, ImGuiSliderFlags_ClampZeroRange);
+ ImGui::SameLine(); HelpMarker("Clamp even if min==max==0.0f. Otherwise DragXXX functions don't clamp.");
+ ImGui::CheckboxFlags("ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic);
+ ImGui::SameLine(); HelpMarker("Enable logarithmic editing (more precision for small values).");
+ ImGui::CheckboxFlags("ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat);
+ ImGui::SameLine(); HelpMarker("Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits).");
+ ImGui::CheckboxFlags("ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput);
+ ImGui::SameLine(); HelpMarker("Disable CTRL+Click or Enter key allowing to input text directly into the widget.");
+ ImGui::CheckboxFlags("ImGuiSliderFlags_NoSpeedTweaks", &flags, ImGuiSliderFlags_NoSpeedTweaks);
+ ImGui::SameLine(); HelpMarker("Disable keyboard modifiers altering tweak speed. Useful if you want to alter tweak speed yourself based on your own logic.");
+ ImGui::CheckboxFlags("ImGuiSliderFlags_WrapAround", &flags, ImGuiSliderFlags_WrapAround);
+ ImGui::SameLine(); HelpMarker("Enable wrapping around from max to min and from min to max (only supported by DragXXX() functions)");
+
+ // Drags
+ static float drag_f = 0.5f;
+ static int drag_i = 50;
+ ImGui::Text("Underlying float value: %f", drag_f);
+ ImGui::DragFloat("DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f, "%.3f", flags);
+ ImGui::DragFloat("DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX, "%.3f", flags);
+ ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags);
+ ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags);
+ //ImGui::DragFloat("DragFloat (0 -> 0)", &drag_f, 0.005f, 0.0f, 0.0f, "%.3f", flags); // To test ClampZeroRange
+ //ImGui::DragFloat("DragFloat (100 -> 100)", &drag_f, 0.005f, 100.0f, 100.0f, "%.3f", flags);
+ ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags);
+
+ // Sliders
+ static float slider_f = 0.5f;
+ static int slider_i = 50;
+ const ImGuiSliderFlags flags_for_sliders = flags & ~ImGuiSliderFlags_WrapAround;
+ ImGui::Text("Underlying float value: %f", slider_f);
+ ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags_for_sliders);
+ ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags_for_sliders);
+
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsImages()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsImages()
+{
IMGUI_DEMO_MARKER("Widgets/Images");
if (ImGui::TreeNode("Images"))
{
@@ -1030,12 +1757,10 @@ static void ShowDemoWindowWidgets()
ImVec2 pos = ImGui::GetCursorScreenPos();
ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left
ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right
- ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint
- ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); // 50% opaque white
- ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col);
- if (ImGui::IsItemHovered())
+ ImGui::PushStyleVar(ImGuiStyleVar_ImageBorderSize, IM_MAX(1.0f, ImGui::GetStyle().ImageBorderSize));
+ ImGui::ImageWithBg(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
+ if (ImGui::BeginItemTooltip())
{
- ImGui::BeginTooltip();
float region_sz = 32.0f;
float region_x = io.MousePos.x - pos.x - region_sz * 0.5f;
float region_y = io.MousePos.y - pos.y - region_sz * 0.5f;
@@ -1048,9 +1773,10 @@ static void ShowDemoWindowWidgets()
ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz);
ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h);
ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h);
- ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col);
+ ImGui::ImageWithBg(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
ImGui::EndTooltip();
}
+ ImGui::PopStyleVar();
}
IMGUI_DEMO_MARKER("Widgets/Images/Textured buttons");
@@ -1080,74 +1806,42 @@ static void ShowDemoWindowWidgets()
ImGui::Text("Pressed %d times.", pressed_count);
ImGui::TreePop();
}
+}
- IMGUI_DEMO_MARKER("Widgets/Combo");
- if (ImGui::TreeNode("Combo"))
- {
- // Combo Boxes are also called "Dropdown" in other systems
- // Expose flags as checkbox for the demo
- static ImGuiComboFlags flags = 0;
- ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft);
- ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo");
- if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton))
- flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both
- if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview))
- flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both
-
- // Using the generic BeginCombo() API, you have full control over how to display the combo contents.
- // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively
- // stored in the object itself, etc.)
- const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" };
- static int item_current_idx = 0; // Here we store our selection data as an index.
- const char* combo_preview_value = items[item_current_idx]; // Pass in the preview value visible before opening the combo (it could be anything)
- if (ImGui::BeginCombo("combo 1", combo_preview_value, flags))
- {
- for (int n = 0; n < IM_ARRAYSIZE(items); n++)
- {
- const bool is_selected = (item_current_idx == n);
- if (ImGui::Selectable(items[n], is_selected))
- item_current_idx = n;
-
- // Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
- if (is_selected)
- ImGui::SetItemDefaultFocus();
- }
- ImGui::EndCombo();
- }
-
- // Simplified one-liner Combo() API, using values packed in a single constant string
- // This is a convenience for when the selection set is small and known at compile-time.
- static int item_current_2 = 0;
- ImGui::Combo("combo 2 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
-
- // Simplified one-liner Combo() using an array of const char*
- // This is not very useful (may obsolete): prefer using BeginCombo()/EndCombo() for full control.
- static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview
- ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items));
-
- // Simplified one-liner Combo() using an accessor function
- struct Funcs { static bool ItemGetter(void* data, int n, const char** out_str) { *out_str = ((const char**)data)[n]; return true; } };
- static int item_current_4 = 0;
- ImGui::Combo("combo 4 (function)", &item_current_4, &Funcs::ItemGetter, items, IM_ARRAYSIZE(items));
-
- ImGui::TreePop();
- }
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsListBoxes()
+//-----------------------------------------------------------------------------
+static void DemoWindowWidgetsListBoxes()
+{
IMGUI_DEMO_MARKER("Widgets/List Boxes");
- if (ImGui::TreeNode("List boxes"))
+ if (ImGui::TreeNode("List Boxes"))
{
+ // BeginListBox() is essentially a thin wrapper to using BeginChild()/EndChild()
+ // using the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label.
+ // You may be tempted to simply use BeginChild() directly. However note that BeginChild() requires EndChild()
+ // to always be called (inconsistent with BeginListBox()/EndListBox()).
+
// Using the generic BeginListBox() API, you have full control over how to display the combo contents.
// (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively
// stored in the object itself, etc.)
const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" };
- static int item_current_idx = 0; // Here we store our selection data as an index.
+ static int item_selected_idx = 0; // Here we store our selected data as an index.
+
+ static bool item_highlight = false;
+ int item_highlighted_idx = -1; // Here we store our highlighted data as an index.
+ ImGui::Checkbox("Highlight hovered item in second listbox", &item_highlight);
+
if (ImGui::BeginListBox("listbox 1"))
{
for (int n = 0; n < IM_ARRAYSIZE(items); n++)
{
- const bool is_selected = (item_current_idx == n);
+ const bool is_selected = (item_selected_idx == n);
if (ImGui::Selectable(items[n], is_selected))
- item_current_idx = n;
+ item_selected_idx = n;
+
+ if (item_highlight && ImGui::IsItemHovered())
+ item_highlighted_idx = n;
// Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
if (is_selected)
@@ -1155,6 +1849,7 @@ static void ShowDemoWindowWidgets()
}
ImGui::EndListBox();
}
+ ImGui::SameLine(); HelpMarker("Here we are sharing selection state between both boxes.");
// Custom size: use all width, 5 items tall
ImGui::Text("Full-width:");
@@ -1162,9 +1857,10 @@ static void ShowDemoWindowWidgets()
{
for (int n = 0; n < IM_ARRAYSIZE(items); n++)
{
- const bool is_selected = (item_current_idx == n);
- if (ImGui::Selectable(items[n], is_selected))
- item_current_idx = n;
+ bool is_selected = (item_selected_idx == n);
+ ImGuiSelectableFlags flags = (item_highlighted_idx == n) ? ImGuiSelectableFlags_Highlight : 0;
+ if (ImGui::Selectable(items[n], is_selected, flags))
+ item_selected_idx = n;
// Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
if (is_selected)
@@ -1175,8 +1871,376 @@ static void ShowDemoWindowWidgets()
ImGui::TreePop();
}
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsMultiComponents()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsMultiComponents()
+{
+ IMGUI_DEMO_MARKER("Widgets/Multi-component Widgets");
+ if (ImGui::TreeNode("Multi-component Widgets"))
+ {
+ static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f };
+ static int vec4i[4] = { 1, 5, 100, 255 };
+
+ ImGui::SeparatorText("2-wide");
+ ImGui::InputFloat2("input float2", vec4f);
+ ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f);
+ ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f);
+ ImGui::InputInt2("input int2", vec4i);
+ ImGui::DragInt2("drag int2", vec4i, 1, 0, 255);
+ ImGui::SliderInt2("slider int2", vec4i, 0, 255);
+
+ ImGui::SeparatorText("3-wide");
+ ImGui::InputFloat3("input float3", vec4f);
+ ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f);
+ ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f);
+ ImGui::InputInt3("input int3", vec4i);
+ ImGui::DragInt3("drag int3", vec4i, 1, 0, 255);
+ ImGui::SliderInt3("slider int3", vec4i, 0, 255);
+
+ ImGui::SeparatorText("4-wide");
+ ImGui::InputFloat4("input float4", vec4f);
+ ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f);
+ ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f);
+ ImGui::InputInt4("input int4", vec4i);
+ ImGui::DragInt4("drag int4", vec4i, 1, 0, 255);
+ ImGui::SliderInt4("slider int4", vec4i, 0, 255);
+
+ ImGui::SeparatorText("Ranges");
+ static float begin = 10, end = 90;
+ static int begin_i = 100, end_i = 1000;
+ ImGui::DragFloatRange2("range float", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp);
+ ImGui::DragIntRange2("range int", &begin_i, &end_i, 5, 0, 1000, "Min: %d units", "Max: %d units");
+ ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units");
+
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsPlotting()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsPlotting()
+{
+ // Plot/Graph widgets are not very good.
+// Consider using a third-party library such as ImPlot: https://github.com/epezent/implot
+// (see others https://github.com/ocornut/imgui/wiki/Useful-Extensions)
+ IMGUI_DEMO_MARKER("Widgets/Plotting");
+ if (ImGui::TreeNode("Plotting"))
+ {
+ ImGui::Text("Need better plotting and graphing? Consider using ImPlot:");
+ ImGui::TextLinkOpenURL("https://github.com/epezent/implot");
+ ImGui::Separator();
+
+ static bool animate = true;
+ ImGui::Checkbox("Animate", &animate);
+
+ // Plot as lines and plot as histogram
+ static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
+ ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
+ ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f));
+ //ImGui::SameLine(); HelpMarker("Consider using ImPlot instead!");
+
+ // Fill an array of contiguous float values to plot
+ // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float
+ // and the sizeof() of your structure in the "stride" parameter.
+ static float values[90] = {};
+ static int values_offset = 0;
+ static double refresh_time = 0.0;
+ if (!animate || refresh_time == 0.0)
+ refresh_time = ImGui::GetTime();
+ while (refresh_time < ImGui::GetTime()) // Create data at fixed 60 Hz rate for the demo
+ {
+ static float phase = 0.0f;
+ values[values_offset] = cosf(phase);
+ values_offset = (values_offset + 1) % IM_ARRAYSIZE(values);
+ phase += 0.10f * values_offset;
+ refresh_time += 1.0f / 60.0f;
+ }
+
+ // Plots can display overlay texts
+ // (in this example, we will display an average value)
+ {
+ float average = 0.0f;
+ for (int n = 0; n < IM_ARRAYSIZE(values); n++)
+ average += values[n];
+ average /= (float)IM_ARRAYSIZE(values);
+ char overlay[32];
+ sprintf(overlay, "avg %f", average);
+ ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f));
+ }
+
+ // Use functions to generate output
+ // FIXME: This is actually VERY awkward because current plot API only pass in indices.
+ // We probably want an API passing floats and user provide sample rate/count.
+ struct Funcs
+ {
+ static float Sin(void*, int i) { return sinf(i * 0.1f); }
+ static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; }
+ };
+ static int func_type = 0, display_count = 70;
+ ImGui::SeparatorText("Functions");
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::Combo("func", &func_type, "Sin\0Saw\0");
+ ImGui::SameLine();
+ ImGui::SliderInt("Sample count", &display_count, 1, 400);
+ float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
+ ImGui::PlotLines("Lines##2", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80));
+ ImGui::PlotHistogram("Histogram##2", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80));
+
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsProgressBars()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsProgressBars()
+{
+ IMGUI_DEMO_MARKER("Widgets/Progress Bars");
+ if (ImGui::TreeNode("Progress Bars"))
+ {
+ // Animate a simple progress bar
+ static float progress = 0.0f, progress_dir = 1.0f;
+ progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
+ if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
+ if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
+
+ // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width,
+ // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
+ ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f));
+ ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
+ ImGui::Text("Progress Bar");
+
+ float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f);
+ char buf[32];
+ sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753);
+ ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf);
+
+ // Pass an animated negative value, e.g. -1.0f * (float)ImGui::GetTime() is the recommended value.
+ // Adjust the factor if you want to adjust the animation speed.
+ ImGui::ProgressBar(-1.0f * (float)ImGui::GetTime(), ImVec2(0.0f, 0.0f), "Searching..");
+ ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
+ ImGui::Text("Indeterminate");
+
+ ImGui::TreePop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsQueryingStatuses()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsQueryingStatuses()
+{
+ IMGUI_DEMO_MARKER("Widgets/Querying Item Status (Edited,Active,Hovered etc.)");
+ if (ImGui::TreeNode("Querying Item Status (Edited/Active/Hovered etc.)"))
+ {
+ // Select an item type
+ const char* item_names[] =
+ {
+ "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputTextMultiline", "InputFloat",
+ "InputFloat3", "ColorEdit4", "Selectable", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox"
+ };
+ static int item_type = 4;
+ static bool item_disabled = false;
+ ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names));
+ ImGui::SameLine();
+ HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered().");
+ ImGui::Checkbox("Item Disabled", &item_disabled);
+
+ // Submit selected items so we can query their status in the code following it.
+ bool ret = false;
+ static bool b = false;
+ static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f };
+ static char str[16] = {};
+ if (item_disabled)
+ ImGui::BeginDisabled(true);
+ if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction
+ if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button
+ if (item_type == 2) { ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat, true); ret = ImGui::Button("ITEM: Button"); ImGui::PopItemFlag(); } // Testing button (with repeater)
+ if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox
+ if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item
+ if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing)
+ if (item_type == 6) { ret = ImGui::InputTextMultiline("ITEM: InputTextMultiline", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which uses a child window)
+ if (item_type == 7) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input
+ if (item_type == 8) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
+ if (item_type == 9) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
+ if (item_type == 10) { ret = ImGui::Selectable("ITEM: Selectable"); } // Testing selectable item
+ if (item_type == 11) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
+ if (item_type == 12) { ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node
+ if (item_type == 13) { ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
+ if (item_type == 14) { const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", &current, items, IM_ARRAYSIZE(items)); }
+ if (item_type == 15) { const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", &current, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
+
+ bool hovered_delay_none = ImGui::IsItemHovered();
+ bool hovered_delay_stationary = ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary);
+ bool hovered_delay_short = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort);
+ bool hovered_delay_normal = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal);
+ bool hovered_delay_tooltip = ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip); // = Normal + Stationary
+
+ // Display the values of IsItemHovered() and other common item state functions.
+ // Note that the ImGuiHoveredFlags_XXX flags can be combined.
+ // Because BulletText is an item itself and that would affect the output of IsItemXXX functions,
+ // we query every state in a single call to avoid storing them and to simplify the code.
+ ImGui::BulletText(
+ "Return value = %d\n"
+ "IsItemFocused() = %d\n"
+ "IsItemHovered() = %d\n"
+ "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n"
+ "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n"
+ "IsItemHovered(_AllowWhenOverlappedByItem) = %d\n"
+ "IsItemHovered(_AllowWhenOverlappedByWindow) = %d\n"
+ "IsItemHovered(_AllowWhenDisabled) = %d\n"
+ "IsItemHovered(_RectOnly) = %d\n"
+ "IsItemActive() = %d\n"
+ "IsItemEdited() = %d\n"
+ "IsItemActivated() = %d\n"
+ "IsItemDeactivated() = %d\n"
+ "IsItemDeactivatedAfterEdit() = %d\n"
+ "IsItemVisible() = %d\n"
+ "IsItemClicked() = %d\n"
+ "IsItemToggledOpen() = %d\n"
+ "GetItemRectMin() = (%.1f, %.1f)\n"
+ "GetItemRectMax() = (%.1f, %.1f)\n"
+ "GetItemRectSize() = (%.1f, %.1f)",
+ ret,
+ ImGui::IsItemFocused(),
+ ImGui::IsItemHovered(),
+ ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),
+ ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
+ ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlappedByItem),
+ ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlappedByWindow),
+ ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled),
+ ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly),
+ ImGui::IsItemActive(),
+ ImGui::IsItemEdited(),
+ ImGui::IsItemActivated(),
+ ImGui::IsItemDeactivated(),
+ ImGui::IsItemDeactivatedAfterEdit(),
+ ImGui::IsItemVisible(),
+ ImGui::IsItemClicked(),
+ ImGui::IsItemToggledOpen(),
+ ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y,
+ ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
+ ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
+ );
+ ImGui::BulletText(
+ "with Hovering Delay or Stationary test:\n"
+ "IsItemHovered() = = %d\n"
+ "IsItemHovered(_Stationary) = %d\n"
+ "IsItemHovered(_DelayShort) = %d\n"
+ "IsItemHovered(_DelayNormal) = %d\n"
+ "IsItemHovered(_Tooltip) = %d",
+ hovered_delay_none, hovered_delay_stationary, hovered_delay_short, hovered_delay_normal, hovered_delay_tooltip);
+
+ if (item_disabled)
+ ImGui::EndDisabled();
+
+ char buf[1] = "";
+ ImGui::InputText("unused", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_ReadOnly);
+ ImGui::SameLine();
+ HelpMarker("This widget is only here to be able to tab-out of the widgets above and see e.g. Deactivated() status.");
+
+ ImGui::TreePop();
+ }
+
+ IMGUI_DEMO_MARKER("Widgets/Querying Window Status (Focused,Hovered etc.)");
+ if (ImGui::TreeNode("Querying Window Status (Focused/Hovered etc.)"))
+ {
+ static bool embed_all_inside_a_child_window = false;
+ ImGui::Checkbox("Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window);
+ if (embed_all_inside_a_child_window)
+ ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), ImGuiChildFlags_Borders);
+
+ // Testing IsWindowFocused() function with its various flags.
+ ImGui::BulletText(
+ "IsWindowFocused() = %d\n"
+ "IsWindowFocused(_ChildWindows) = %d\n"
+ "IsWindowFocused(_ChildWindows|_NoPopupHierarchy) = %d\n"
+ "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n"
+ "IsWindowFocused(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n"
+ "IsWindowFocused(_RootWindow) = %d\n"
+ "IsWindowFocused(_RootWindow|_NoPopupHierarchy) = %d\n"
+ "IsWindowFocused(_AnyWindow) = %d\n",
+ ImGui::IsWindowFocused(),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_NoPopupHierarchy),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy),
+ ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow));
+
+ // Testing IsWindowHovered() function with its various flags.
+ ImGui::BulletText(
+ "IsWindowHovered() = %d\n"
+ "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n"
+ "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n"
+ "IsWindowHovered(_ChildWindows) = %d\n"
+ "IsWindowHovered(_ChildWindows|_NoPopupHierarchy) = %d\n"
+ "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n"
+ "IsWindowHovered(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n"
+ "IsWindowHovered(_RootWindow) = %d\n"
+ "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n"
+ "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n"
+ "IsWindowHovered(_AnyWindow) = %d\n"
+ "IsWindowHovered(_Stationary) = %d\n",
+ ImGui::IsWindowHovered(),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_Stationary));
+
+ ImGui::BeginChild("child", ImVec2(0, 50), ImGuiChildFlags_Borders);
+ ImGui::Text("This is another child window for testing the _ChildWindows flag.");
+ ImGui::EndChild();
+ if (embed_all_inside_a_child_window)
+ ImGui::EndChild();
+
+ // Calling IsItemHovered() after begin returns the hovered status of the title bar.
+ // This is useful in particular if you want to create a context menu associated to the title bar of a window.
+ static bool test_window = false;
+ ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window);
+ if (test_window)
+ {
+ ImGui::Begin("Title bar Hovered/Active tests", &test_window);
+ if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered()
+ {
+ if (ImGui::MenuItem("Close")) { test_window = false; }
+ ImGui::EndPopup();
+ }
+ ImGui::Text(
+ "IsItemHovered() after begin = %d (== is title bar hovered)\n"
+ "IsItemActive() after begin = %d (== is window being clicked/moved)\n",
+ ImGui::IsItemHovered(), ImGui::IsItemActive());
+ ImGui::End();
+ }
+
+ ImGui::TreePop();
+ }
+}
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsSelectables()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsSelectables()
+{
IMGUI_DEMO_MARKER("Widgets/Selectables");
+ //ImGui::SetNextItemOpen(true, ImGuiCond_Once);
if (ImGui::TreeNode("Selectables"))
{
// Selectable() has 2 overloads:
@@ -1188,60 +2252,30 @@ static void ShowDemoWindowWidgets()
IMGUI_DEMO_MARKER("Widgets/Selectables/Basic");
if (ImGui::TreeNode("Basic"))
{
- static bool selection[5] = { false, true, false, false, false };
+ static bool selection[5] = { false, true, false, false };
ImGui::Selectable("1. I am selectable", &selection[0]);
ImGui::Selectable("2. I am selectable", &selection[1]);
- ImGui::Text("(I am not selectable)");
- ImGui::Selectable("4. I am selectable", &selection[3]);
- if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick))
+ ImGui::Selectable("3. I am selectable", &selection[2]);
+ if (ImGui::Selectable("4. I am double clickable", selection[3], ImGuiSelectableFlags_AllowDoubleClick))
if (ImGui::IsMouseDoubleClicked(0))
- selection[4] = !selection[4];
+ selection[3] = !selection[3];
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Selectables/Single Selection");
- if (ImGui::TreeNode("Selection State: Single Selection"))
- {
- static int selected = -1;
- for (int n = 0; n < 5; n++)
- {
- char buf[32];
- sprintf(buf, "Object %d", n);
- if (ImGui::Selectable(buf, selected == n))
- selected = n;
- }
- ImGui::TreePop();
- }
- IMGUI_DEMO_MARKER("Widgets/Selectables/Multiple Selection");
- if (ImGui::TreeNode("Selection State: Multiple Selection"))
- {
- HelpMarker("Hold CTRL and click to select multiple items.");
- static bool selection[5] = { false, false, false, false, false };
- for (int n = 0; n < 5; n++)
- {
- char buf[32];
- sprintf(buf, "Object %d", n);
- if (ImGui::Selectable(buf, selection[n]))
- {
- if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held
- memset(selection, 0, sizeof(selection));
- selection[n] ^= 1;
- }
- }
- ImGui::TreePop();
- }
- IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more text into the same line");
- if (ImGui::TreeNode("Rendering more text into the same line"))
+
+ IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more items on the same line");
+ if (ImGui::TreeNode("Rendering more items on the same line"))
{
- // Using the Selectable() override that takes "bool* p_selected" parameter,
- // this function toggle your bool value automatically.
+ // (1) Using SetNextItemAllowOverlap()
+ // (2) Using the Selectable() override that takes "bool* p_selected" parameter, the bool value is toggled automatically.
static bool selected[3] = { false, false, false };
- ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes");
- ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes");
- ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes");
+ ImGui::SetNextItemAllowOverlap(); ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(); ImGui::SmallButton("Link 1");
+ ImGui::SetNextItemAllowOverlap(); ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(); ImGui::SmallButton("Link 2");
+ ImGui::SetNextItemAllowOverlap(); ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(); ImGui::SmallButton("Link 3");
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Selectables/In columns");
- if (ImGui::TreeNode("In columns"))
+
+ IMGUI_DEMO_MARKER("Widgets/Selectables/In Tables");
+ if (ImGui::TreeNode("In Tables"))
{
static bool selected[10] = {};
@@ -1275,6 +2309,7 @@ static void ShowDemoWindowWidgets()
}
ImGui::TreePop();
}
+
IMGUI_DEMO_MARKER("Widgets/Selectables/Grid");
if (ImGui::TreeNode("Grid"))
{
@@ -1333,175 +2368,981 @@ static void ShowDemoWindowWidgets()
}
ImGui::TreePop();
}
+}
- // To wire InputText() with std::string or any other custom string type,
- // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file.
- IMGUI_DEMO_MARKER("Widgets/Text Input");
- if (ImGui::TreeNode("Text Input"))
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsSelectionAndMultiSelect()
+//-----------------------------------------------------------------------------
+// Multi-selection demos
+// Also read: https://github.com/ocornut/imgui/wiki/Multi-Select
+//-----------------------------------------------------------------------------
+
+static const char* ExampleNames[] =
+{
+ "Artichoke", "Arugula", "Asparagus", "Avocado", "Bamboo Shoots", "Bean Sprouts", "Beans", "Beet", "Belgian Endive", "Bell Pepper",
+ "Bitter Gourd", "Bok Choy", "Broccoli", "Brussels Sprouts", "Burdock Root", "Cabbage", "Calabash", "Capers", "Carrot", "Cassava",
+ "Cauliflower", "Celery", "Celery Root", "Celcuce", "Chayote", "Chinese Broccoli", "Corn", "Cucumber"
+};
+
+// Extra functions to add deletion support to ImGuiSelectionBasicStorage
+struct ExampleSelectionWithDeletion : ImGuiSelectionBasicStorage
+{
+ // Find which item should be Focused after deletion.
+ // Call _before_ item submission. Retunr an index in the before-deletion item list, your item loop should call SetKeyboardFocusHere() on it.
+ // The subsequent ApplyDeletionPostLoop() code will use it to apply Selection.
+ // - We cannot provide this logic in core Dear ImGui because we don't have access to selection data.
+ // - We don't actually manipulate the ImVector<> here, only in ApplyDeletionPostLoop(), but using similar API for consistency and flexibility.
+ // - Important: Deletion only works if the underlying ImGuiID for your items are stable: aka not depend on their index, but on e.g. item id/ptr.
+ // FIXME-MULTISELECT: Doesn't take account of the possibility focus target will be moved during deletion. Need refocus or scroll offset.
+ int ApplyDeletionPreLoop(ImGuiMultiSelectIO* ms_io, int items_count)
{
- IMGUI_DEMO_MARKER("Widgets/Text Input/Multi-line Text Input");
- if (ImGui::TreeNode("Multi-line Text Input"))
+ if (Size == 0)
+ return -1;
+
+ // If focused item is not selected...
+ const int focused_idx = (int)ms_io->NavIdItem; // Index of currently focused item
+ if (ms_io->NavIdSelected == false) // This is merely a shortcut, == Contains(adapter->IndexToStorage(items, focused_idx))
{
- // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize
- // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings.
- static char text[1024 * 16] =
- "/*\n"
- " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n"
- " the hexadecimal encoding of one offending instruction,\n"
- " more formally, the invalid operand with locked CMPXCHG8B\n"
- " instruction bug, is a design flaw in the majority of\n"
- " Intel Pentium, Pentium MMX, and Pentium OverDrive\n"
- " processors (all in the P5 microarchitecture).\n"
- "*/\n\n"
- "label:\n"
- "\tlock cmpxchg8b eax\n";
+ ms_io->RangeSrcReset = true; // Request to recover RangeSrc from NavId next frame. Would be ok to reset even when NavIdSelected==true, but it would take an extra frame to recover RangeSrc when deleting a selected item.
+ return focused_idx; // Request to focus same item after deletion.
+ }
- static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput;
- HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include <string> in here)");
- ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
- ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput);
- ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine);
- ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags);
+ // If focused item is selected: land on first unselected item after focused item.
+ for (int idx = focused_idx + 1; idx < items_count; idx++)
+ if (!Contains(GetStorageIdFromIndex(idx)))
+ return idx;
+
+ // If focused item is selected: otherwise return last unselected item before focused item.
+ for (int idx = IM_MIN(focused_idx, items_count) - 1; idx >= 0; idx--)
+ if (!Contains(GetStorageIdFromIndex(idx)))
+ return idx;
+
+ return -1;
+ }
+
+ // Rewrite item list (delete items) + update selection.
+ // - Call after EndMultiSelect()
+ // - We cannot provide this logic in core Dear ImGui because we don't have access to your items, nor to selection data.
+ template<typename ITEM_TYPE>
+ void ApplyDeletionPostLoop(ImGuiMultiSelectIO* ms_io, ImVector<ITEM_TYPE>& items, int item_curr_idx_to_select)
+ {
+ // Rewrite item list (delete items) + convert old selection index (before deletion) to new selection index (after selection).
+ // If NavId was not part of selection, we will stay on same item.
+ ImVector<ITEM_TYPE> new_items;
+ new_items.reserve(items.Size - Size);
+ int item_next_idx_to_select = -1;
+ for (int idx = 0; idx < items.Size; idx++)
+ {
+ if (!Contains(GetStorageIdFromIndex(idx)))
+ new_items.push_back(items[idx]);
+ if (item_curr_idx_to_select == idx)
+ item_next_idx_to_select = new_items.Size - 1;
+ }
+ items.swap(new_items);
+
+ // Update selection
+ Clear();
+ if (item_next_idx_to_select != -1 && ms_io->NavIdSelected)
+ SetItemSelected(GetStorageIdFromIndex(item_next_idx_to_select), true);
+ }
+};
+
+// Example: Implement dual list box storage and interface
+struct ExampleDualListBox
+{
+ ImVector<ImGuiID> Items[2]; // ID is index into ExampleName[]
+ ImGuiSelectionBasicStorage Selections[2]; // Store ExampleItemId into selection
+ bool OptKeepSorted = true;
+
+ void MoveAll(int src, int dst)
+ {
+ IM_ASSERT((src == 0 && dst == 1) || (src == 1 && dst == 0));
+ for (ImGuiID item_id : Items[src])
+ Items[dst].push_back(item_id);
+ Items[src].clear();
+ SortItems(dst);
+ Selections[src].Swap(Selections[dst]);
+ Selections[src].Clear();
+ }
+ void MoveSelected(int src, int dst)
+ {
+ for (int src_n = 0; src_n < Items[src].Size; src_n++)
+ {
+ ImGuiID item_id = Items[src][src_n];
+ if (!Selections[src].Contains(item_id))
+ continue;
+ Items[src].erase(&Items[src][src_n]); // FIXME-OPT: Could be implemented more optimally (rebuild src items and swap)
+ Items[dst].push_back(item_id);
+ src_n--;
+ }
+ if (OptKeepSorted)
+ SortItems(dst);
+ Selections[src].Swap(Selections[dst]);
+ Selections[src].Clear();
+ }
+ void ApplySelectionRequests(ImGuiMultiSelectIO* ms_io, int side)
+ {
+ // In this example we store item id in selection (instead of item index)
+ Selections[side].UserData = Items[side].Data;
+ Selections[side].AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage* self, int idx) { ImGuiID* items = (ImGuiID*)self->UserData; return items[idx]; };
+ Selections[side].ApplyRequests(ms_io);
+ }
+ static int IMGUI_CDECL CompareItemsByValue(const void* lhs, const void* rhs)
+ {
+ const int* a = (const int*)lhs;
+ const int* b = (const int*)rhs;
+ return (*a - *b) > 0 ? +1 : -1;
+ }
+ void SortItems(int n)
+ {
+ qsort(Items[n].Data, (size_t)Items[n].Size, sizeof(Items[n][0]), CompareItemsByValue);
+ }
+ void Show()
+ {
+ //ImGui::Checkbox("Sorted", &OptKeepSorted);
+ if (ImGui::BeginTable("split", 3, ImGuiTableFlags_None))
+ {
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); // Left side
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed); // Buttons
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch); // Right side
+ ImGui::TableNextRow();
+
+ int request_move_selected = -1;
+ int request_move_all = -1;
+ float child_height_0 = 0.0f;
+ for (int side = 0; side < 2; side++)
+ {
+ // FIXME-MULTISELECT: Dual List Box: Add context menus
+ // FIXME-NAV: Using ImGuiWindowFlags_NavFlattened exhibit many issues.
+ ImVector<ImGuiID>& items = Items[side];
+ ImGuiSelectionBasicStorage& selection = Selections[side];
+
+ ImGui::TableSetColumnIndex((side == 0) ? 0 : 2);
+ ImGui::Text("%s (%d)", (side == 0) ? "Available" : "Basket", items.Size);
+
+ // Submit scrolling range to avoid glitches on moving/deletion
+ const float items_height = ImGui::GetTextLineHeightWithSpacing();
+ ImGui::SetNextWindowContentSize(ImVec2(0.0f, items.Size * items_height));
+
+ bool child_visible;
+ if (side == 0)
+ {
+ // Left child is resizable
+ ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetFrameHeightWithSpacing() * 4), ImVec2(FLT_MAX, FLT_MAX));
+ child_visible = ImGui::BeginChild("0", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY);
+ child_height_0 = ImGui::GetWindowSize().y;
+ }
+ else
+ {
+ // Right child use same height as left one
+ child_visible = ImGui::BeginChild("1", ImVec2(-FLT_MIN, child_height_0), ImGuiChildFlags_FrameStyle);
+ }
+ if (child_visible)
+ {
+ ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_None;
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, items.Size);
+ ApplySelectionRequests(ms_io, side);
+
+ for (int item_n = 0; item_n < items.Size; item_n++)
+ {
+ ImGuiID item_id = items[item_n];
+ bool item_is_selected = selection.Contains(item_id);
+ ImGui::SetNextItemSelectionUserData(item_n);
+ ImGui::Selectable(ExampleNames[item_id], item_is_selected, ImGuiSelectableFlags_AllowDoubleClick);
+ if (ImGui::IsItemFocused())
+ {
+ // FIXME-MULTISELECT: Dual List Box: Transfer focus
+ if (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::IsKeyPressed(ImGuiKey_KeypadEnter))
+ request_move_selected = side;
+ if (ImGui::IsMouseDoubleClicked(0)) // FIXME-MULTISELECT: Double-click on multi-selection?
+ request_move_selected = side;
+ }
+ }
+
+ ms_io = ImGui::EndMultiSelect();
+ ApplySelectionRequests(ms_io, side);
+ }
+ ImGui::EndChild();
+ }
+
+ // Buttons columns
+ ImGui::TableSetColumnIndex(1);
+ ImGui::NewLine();
+ //ImVec2 button_sz = { ImGui::CalcTextSize(">>").x + ImGui::GetStyle().FramePadding.x * 2.0f, ImGui::GetFrameHeight() + padding.y * 2.0f };
+ ImVec2 button_sz = { ImGui::GetFrameHeight(), ImGui::GetFrameHeight() };
+
+ // (Using BeginDisabled()/EndDisabled() works but feels distracting given how it is currently visualized)
+ if (ImGui::Button(">>", button_sz))
+ request_move_all = 0;
+ if (ImGui::Button(">", button_sz))
+ request_move_selected = 0;
+ if (ImGui::Button("<", button_sz))
+ request_move_selected = 1;
+ if (ImGui::Button("<<", button_sz))
+ request_move_all = 1;
+
+ // Process requests
+ if (request_move_all != -1)
+ MoveAll(request_move_all, request_move_all ^ 1);
+ if (request_move_selected != -1)
+ MoveSelected(request_move_selected, request_move_selected ^ 1);
+
+ // FIXME-MULTISELECT: Support action from outside
+ /*
+ if (OptKeepSorted == false)
+ {
+ ImGui::NewLine();
+ if (ImGui::ArrowButton("MoveUp", ImGuiDir_Up)) {}
+ if (ImGui::ArrowButton("MoveDown", ImGuiDir_Down)) {}
+ }
+ */
+
+ ImGui::EndTable();
+ }
+ }
+};
+
+static void DemoWindowWidgetsSelectionAndMultiSelect(ImGuiDemoWindowData* demo_data)
+{
+ IMGUI_DEMO_MARKER("Widgets/Selection State & Multi-Select");
+ if (ImGui::TreeNode("Selection State & Multi-Select"))
+ {
+ HelpMarker("Selections can be built using Selectable(), TreeNode() or other widgets. Selection state is owned by application code/data.");
+
+ // Without any fancy API: manage single-selection yourself.
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Single-Select");
+ if (ImGui::TreeNode("Single-Select"))
+ {
+ static int selected = -1;
+ for (int n = 0; n < 5; n++)
+ {
+ char buf[32];
+ sprintf(buf, "Object %d", n);
+ if (ImGui::Selectable(buf, selected == n))
+ selected = n;
+ }
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Text Input/Filtered Text Input");
- if (ImGui::TreeNode("Filtered Text Input"))
+ // Demonstrate implementation a most-basic form of multi-selection manually
+ // This doesn't support the SHIFT modifier which requires BeginMultiSelect()!
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (manual/simplified, without BeginMultiSelect)");
+ if (ImGui::TreeNode("Multi-Select (manual/simplified, without BeginMultiSelect)"))
{
- struct TextFilters
+ HelpMarker("Hold CTRL and click to select multiple items.");
+ static bool selection[5] = { false, false, false, false, false };
+ for (int n = 0; n < 5; n++)
{
- // Return 0 (pass) if the character is 'i' or 'm' or 'g' or 'u' or 'i'
- static int FilterImGuiLetters(ImGuiInputTextCallbackData* data)
+ char buf[32];
+ sprintf(buf, "Object %d", n);
+ if (ImGui::Selectable(buf, selection[n]))
{
- if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar))
- return 0;
- return 1;
+ if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held
+ memset(selection, 0, sizeof(selection));
+ selection[n] ^= 1; // Toggle current item
}
- };
+ }
+ ImGui::TreePop();
+ }
+
+ // Demonstrate handling proper multi-selection using the BeginMultiSelect/EndMultiSelect API.
+ // SHIFT+Click w/ CTRL and other standard features are supported.
+ // We use the ImGuiSelectionBasicStorage helper which you may freely reimplement.
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select");
+ if (ImGui::TreeNode("Multi-Select"))
+ {
+ ImGui::Text("Supported features:");
+ ImGui::BulletText("Keyboard navigation (arrows, page up/down, home/end, space).");
+ ImGui::BulletText("Ctrl modifier to preserve and toggle selection.");
+ ImGui::BulletText("Shift modifier for range selection.");
+ ImGui::BulletText("CTRL+A to select all.");
+ ImGui::BulletText("Escape to clear selection.");
+ ImGui::BulletText("Click and drag to box-select.");
+ ImGui::Text("Tip: Use 'Demo->Tools->Debug Log->Selection' to see selection requests as they happen.");
+
+ // Use default selection.Adapter: Pass index to SetNextItemSelectionUserData(), store index in Selection
+ const int ITEMS_COUNT = 50;
+ static ImGuiSelectionBasicStorage selection;
+ ImGui::Text("Selection: %d/%d", selection.Size, ITEMS_COUNT);
- static char buf1[64] = ""; ImGui::InputText("default", buf1, 64);
- static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal);
- static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
- static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase);
- static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank);
- static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters);
+ // The BeginChild() has no purpose for selection logic, other that offering a scrolling region.
+ if (ImGui::BeginChild("##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
+ {
+ ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, ITEMS_COUNT);
+ selection.ApplyRequests(ms_io);
+
+ for (int n = 0; n < ITEMS_COUNT; n++)
+ {
+ char label[64];
+ sprintf(label, "Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
+ bool item_is_selected = selection.Contains((ImGuiID)n);
+ ImGui::SetNextItemSelectionUserData(n);
+ ImGui::Selectable(label, item_is_selected);
+ }
+
+ ms_io = ImGui::EndMultiSelect();
+ selection.ApplyRequests(ms_io);
+ }
+ ImGui::EndChild();
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Text Input/Password input");
- if (ImGui::TreeNode("Password Input"))
+ // Demonstrate using the clipper with BeginMultiSelect()/EndMultiSelect()
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (with clipper)");
+ if (ImGui::TreeNode("Multi-Select (with clipper)"))
{
- static char password[64] = "password123";
- ImGui::InputText("password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password);
- ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
- ImGui::InputTextWithHint("password (w/ hint)", "<password>", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password);
- ImGui::InputText("password (clear)", password, IM_ARRAYSIZE(password));
+ // Use default selection.Adapter: Pass index to SetNextItemSelectionUserData(), store index in Selection
+ static ImGuiSelectionBasicStorage selection;
+
+ ImGui::Text("Added features:");
+ ImGui::BulletText("Using ImGuiListClipper.");
+
+ const int ITEMS_COUNT = 10000;
+ ImGui::Text("Selection: %d/%d", selection.Size, ITEMS_COUNT);
+ if (ImGui::BeginChild("##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
+ {
+ ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, ITEMS_COUNT);
+ selection.ApplyRequests(ms_io);
+
+ ImGuiListClipper clipper;
+ clipper.Begin(ITEMS_COUNT);
+ if (ms_io->RangeSrcItem != -1)
+ clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped.
+ while (clipper.Step())
+ {
+ for (int n = clipper.DisplayStart; n < clipper.DisplayEnd; n++)
+ {
+ char label[64];
+ sprintf(label, "Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
+ bool item_is_selected = selection.Contains((ImGuiID)n);
+ ImGui::SetNextItemSelectionUserData(n);
+ ImGui::Selectable(label, item_is_selected);
+ }
+ }
+
+ ms_io = ImGui::EndMultiSelect();
+ selection.ApplyRequests(ms_io);
+ }
+ ImGui::EndChild();
ImGui::TreePop();
}
- if (ImGui::TreeNode("Completion, History, Edit Callbacks"))
+ // Demonstrate dynamic item list + deletion support using the BeginMultiSelect/EndMultiSelect API.
+ // In order to support Deletion without any glitches you need to:
+ // - (1) If items are submitted in their own scrolling area, submit contents size SetNextWindowContentSize() ahead of time to prevent one-frame readjustment of scrolling.
+ // - (2) Items needs to have persistent ID Stack identifier = ID needs to not depends on their index. PushID(index) = KO. PushID(item_id) = OK. This is in order to focus items reliably after a selection.
+ // - (3) BeginXXXX process
+ // - (4) Focus process
+ // - (5) EndXXXX process
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (with deletion)");
+ if (ImGui::TreeNode("Multi-Select (with deletion)"))
+ {
+ // Storing items data separately from selection data.
+ // (you may decide to store selection data inside your item (aka intrusive storage) if you don't need multiple views over same items)
+ // Use a custom selection.Adapter: store item identifier in Selection (instead of index)
+ static ImVector<ImGuiID> items;
+ static ExampleSelectionWithDeletion selection;
+ selection.UserData = (void*)&items;
+ selection.AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage* self, int idx) { ImVector<ImGuiID>* p_items = (ImVector<ImGuiID>*)self->UserData; return (*p_items)[idx]; }; // Index -> ID
+
+ ImGui::Text("Added features:");
+ ImGui::BulletText("Dynamic list with Delete key support.");
+ ImGui::Text("Selection size: %d/%d", selection.Size, items.Size);
+
+ // Initialize default list with 50 items + button to add/remove items.
+ static ImGuiID items_next_id = 0;
+ if (items_next_id == 0)
+ for (ImGuiID n = 0; n < 50; n++)
+ items.push_back(items_next_id++);
+ if (ImGui::SmallButton("Add 20 items")) { for (int n = 0; n < 20; n++) { items.push_back(items_next_id++); } }
+ ImGui::SameLine();
+ if (ImGui::SmallButton("Remove 20 items")) { for (int n = IM_MIN(20, items.Size); n > 0; n--) { selection.SetItemSelected(items.back(), false); items.pop_back(); } }
+
+ // (1) Extra to support deletion: Submit scrolling range to avoid glitches on deletion
+ const float items_height = ImGui::GetTextLineHeightWithSpacing();
+ ImGui::SetNextWindowContentSize(ImVec2(0.0f, items.Size * items_height));
+
+ if (ImGui::BeginChild("##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
+ {
+ ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, items.Size);
+ selection.ApplyRequests(ms_io);
+
+ const bool want_delete = ImGui::Shortcut(ImGuiKey_Delete, ImGuiInputFlags_Repeat) && (selection.Size > 0);
+ const int item_curr_idx_to_focus = want_delete ? selection.ApplyDeletionPreLoop(ms_io, items.Size) : -1;
+
+ for (int n = 0; n < items.Size; n++)
+ {
+ const ImGuiID item_id = items[n];
+ char label[64];
+ sprintf(label, "Object %05u: %s", item_id, ExampleNames[item_id % IM_ARRAYSIZE(ExampleNames)]);
+
+ bool item_is_selected = selection.Contains(item_id);
+ ImGui::SetNextItemSelectionUserData(n);
+ ImGui::Selectable(label, item_is_selected);
+ if (item_curr_idx_to_focus == n)
+ ImGui::SetKeyboardFocusHere(-1);
+ }
+
+ // Apply multi-select requests
+ ms_io = ImGui::EndMultiSelect();
+ selection.ApplyRequests(ms_io);
+ if (want_delete)
+ selection.ApplyDeletionPostLoop(ms_io, items, item_curr_idx_to_focus);
+ }
+ ImGui::EndChild();
+ ImGui::TreePop();
+ }
+
+ // Implement a Dual List Box (#6648)
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (dual list box)");
+ if (ImGui::TreeNode("Multi-Select (dual list box)"))
{
- struct Funcs
+ // Init default state
+ static ExampleDualListBox dlb;
+ if (dlb.Items[0].Size == 0 && dlb.Items[1].Size == 0)
+ for (int item_id = 0; item_id < IM_ARRAYSIZE(ExampleNames); item_id++)
+ dlb.Items[0].push_back((ImGuiID)item_id);
+
+ // Show
+ dlb.Show();
+
+ ImGui::TreePop();
+ }
+
+ // Demonstrate using the clipper with BeginMultiSelect()/EndMultiSelect()
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (in a table)");
+ if (ImGui::TreeNode("Multi-Select (in a table)"))
+ {
+ static ImGuiSelectionBasicStorage selection;
+
+ const int ITEMS_COUNT = 10000;
+ ImGui::Text("Selection: %d/%d", selection.Size, ITEMS_COUNT);
+ if (ImGui::BeginTable("##Basket", 2, ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter))
{
- static int MyCallback(ImGuiInputTextCallbackData* data)
+ ImGui::TableSetupColumn("Object");
+ ImGui::TableSetupColumn("Action");
+ ImGui::TableSetupScrollFreeze(0, 1);
+ ImGui::TableHeadersRow();
+
+ ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, ITEMS_COUNT);
+ selection.ApplyRequests(ms_io);
+
+ ImGuiListClipper clipper;
+ clipper.Begin(ITEMS_COUNT);
+ if (ms_io->RangeSrcItem != -1)
+ clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped.
+ while (clipper.Step())
{
- if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion)
+ for (int n = clipper.DisplayStart; n < clipper.DisplayEnd; n++)
{
- data->InsertChars(data->CursorPos, "..");
+ ImGui::TableNextRow();
+ ImGui::TableNextColumn();
+ char label[64];
+ sprintf(label, "Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
+ bool item_is_selected = selection.Contains((ImGuiID)n);
+ ImGui::SetNextItemSelectionUserData(n);
+ ImGui::Selectable(label, item_is_selected, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap);
+ ImGui::TableNextColumn();
+ ImGui::SmallButton("hello");
}
- else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory)
+ }
+
+ ms_io = ImGui::EndMultiSelect();
+ selection.ApplyRequests(ms_io);
+ ImGui::EndTable();
+ }
+ ImGui::TreePop();
+ }
+
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (checkboxes)");
+ if (ImGui::TreeNode("Multi-Select (checkboxes)"))
+ {
+ ImGui::Text("In a list of checkboxes (not selectable):");
+ ImGui::BulletText("Using _NoAutoSelect + _NoAutoClear flags.");
+ ImGui::BulletText("Shift+Click to check multiple boxes.");
+ ImGui::BulletText("Shift+Keyboard to copy current value to other boxes.");
+
+ // If you have an array of checkboxes, you may want to use NoAutoSelect + NoAutoClear and the ImGuiSelectionExternalStorage helper.
+ static bool items[20] = {};
+ static ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_NoAutoSelect | ImGuiMultiSelectFlags_NoAutoClear | ImGuiMultiSelectFlags_ClearOnEscape;
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoSelect", &flags, ImGuiMultiSelectFlags_NoAutoSelect);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoClear", &flags, ImGuiMultiSelectFlags_NoAutoClear);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect2d", &flags, ImGuiMultiSelectFlags_BoxSelect2d); // Cannot use ImGuiMultiSelectFlags_BoxSelect1d as checkboxes are varying width.
+
+ if (ImGui::BeginChild("##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeY))
+ {
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, -1, IM_ARRAYSIZE(items));
+ ImGuiSelectionExternalStorage storage_wrapper;
+ storage_wrapper.UserData = (void*)items;
+ storage_wrapper.AdapterSetItemSelected = [](ImGuiSelectionExternalStorage* self, int n, bool selected) { bool* array = (bool*)self->UserData; array[n] = selected; };
+ storage_wrapper.ApplyRequests(ms_io);
+ for (int n = 0; n < 20; n++)
+ {
+ char label[32];
+ sprintf(label, "Item %d", n);
+ ImGui::SetNextItemSelectionUserData(n);
+ ImGui::Checkbox(label, &items[n]);
+ }
+ ms_io = ImGui::EndMultiSelect();
+ storage_wrapper.ApplyRequests(ms_io);
+ }
+ ImGui::EndChild();
+
+ ImGui::TreePop();
+ }
+
+ // Demonstrate individual selection scopes in same window
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (multiple scopes)");
+ if (ImGui::TreeNode("Multi-Select (multiple scopes)"))
+ {
+ // Use default select: Pass index to SetNextItemSelectionUserData(), store index in Selection
+ const int SCOPES_COUNT = 3;
+ const int ITEMS_COUNT = 8; // Per scope
+ static ImGuiSelectionBasicStorage selections_data[SCOPES_COUNT];
+
+ // Use ImGuiMultiSelectFlags_ScopeRect to not affect other selections in same window.
+ static ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ScopeRect | ImGuiMultiSelectFlags_ClearOnEscape;// | ImGuiMultiSelectFlags_ClearOnClickVoid;
+ if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeWindow", &flags, ImGuiMultiSelectFlags_ScopeWindow) && (flags & ImGuiMultiSelectFlags_ScopeWindow))
+ flags &= ~ImGuiMultiSelectFlags_ScopeRect;
+ if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeRect", &flags, ImGuiMultiSelectFlags_ScopeRect) && (flags & ImGuiMultiSelectFlags_ScopeRect))
+ flags &= ~ImGuiMultiSelectFlags_ScopeWindow;
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect1d", &flags, ImGuiMultiSelectFlags_BoxSelect1d);
+
+ for (int selection_scope_n = 0; selection_scope_n < SCOPES_COUNT; selection_scope_n++)
+ {
+ ImGui::PushID(selection_scope_n);
+ ImGuiSelectionBasicStorage* selection = &selections_data[selection_scope_n];
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection->Size, ITEMS_COUNT);
+ selection->ApplyRequests(ms_io);
+
+ ImGui::SeparatorText("Selection scope");
+ ImGui::Text("Selection size: %d/%d", selection->Size, ITEMS_COUNT);
+
+ for (int n = 0; n < ITEMS_COUNT; n++)
+ {
+ char label[64];
+ sprintf(label, "Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
+ bool item_is_selected = selection->Contains((ImGuiID)n);
+ ImGui::SetNextItemSelectionUserData(n);
+ ImGui::Selectable(label, item_is_selected);
+ }
+
+ // Apply multi-select requests
+ ms_io = ImGui::EndMultiSelect();
+ selection->ApplyRequests(ms_io);
+ ImGui::PopID();
+ }
+ ImGui::TreePop();
+ }
+
+ // See ShowExampleAppAssetsBrowser()
+ if (ImGui::TreeNode("Multi-Select (tiled assets browser)"))
+ {
+ ImGui::Checkbox("Assets Browser", &demo_data->ShowAppAssetsBrowser);
+ ImGui::Text("(also access from 'Examples->Assets Browser' in menu)");
+ ImGui::TreePop();
+ }
+
+ // Demonstrate supporting multiple-selection in a tree.
+ // - We don't use linear indices for selection user data, but our ExampleTreeNode* pointer directly!
+ // This showcase how SetNextItemSelectionUserData() never assume indices!
+ // - The difficulty here is to "interpolate" from RangeSrcItem to RangeDstItem in the SetAll/SetRange request.
+ // We want this interpolation to match what the user sees: in visible order, skipping closed nodes.
+ // This is implemented by our TreeGetNextNodeInVisibleOrder() user-space helper.
+ // - Important: In a real codebase aiming to implement full-featured selectable tree with custom filtering, you
+ // are more likely to build an array mapping sequential indices to visible tree nodes, since your
+ // filtering/search + clipping process will benefit from it. Having this will make this interpolation much easier.
+ // - Consider this a prototype: we are working toward simplifying some of it.
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (trees)");
+ if (ImGui::TreeNode("Multi-Select (trees)"))
+ {
+ HelpMarker(
+ "This is rather advanced and experimental. If you are getting started with multi-select, "
+ "please don't start by looking at how to use it for a tree!\n\n"
+ "Future versions will try to simplify and formalize some of this.");
+
+ struct ExampleTreeFuncs
+ {
+ static void DrawNode(ExampleTreeNode* node, ImGuiSelectionBasicStorage* selection)
+ {
+ ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
+ tree_node_flags |= ImGuiTreeNodeFlags_NavLeftJumpsBackHere; // Enable pressing left to jump to parent
+ if (node->Childs.Size == 0)
+ tree_node_flags |= ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_Leaf;
+ if (selection->Contains((ImGuiID)node->UID))
+ tree_node_flags |= ImGuiTreeNodeFlags_Selected;
+
+ // Using SetNextItemStorageID() to specify storage id, so we can easily peek into
+ // the storage holding open/close stage, using our TreeNodeGetOpen/TreeNodeSetOpen() functions.
+ ImGui::SetNextItemSelectionUserData((ImGuiSelectionUserData)(intptr_t)node);
+ ImGui::SetNextItemStorageID((ImGuiID)node->UID);
+ if (ImGui::TreeNodeEx(node->Name, tree_node_flags))
{
- if (data->EventKey == ImGuiKey_UpArrow)
+ for (ExampleTreeNode* child : node->Childs)
+ DrawNode(child, selection);
+ ImGui::TreePop();
+ }
+ else if (ImGui::IsItemToggledOpen())
+ {
+ TreeCloseAndUnselectChildNodes(node, selection);
+ }
+ }
+
+ static bool TreeNodeGetOpen(ExampleTreeNode* node)
+ {
+ return ImGui::GetStateStorage()->GetBool((ImGuiID)node->UID);
+ }
+
+ static void TreeNodeSetOpen(ExampleTreeNode* node, bool open)
+ {
+ ImGui::GetStateStorage()->SetBool((ImGuiID)node->UID, open);
+ }
+
+ // When closing a node: 1) close and unselect all child nodes, 2) select parent if any child was selected.
+ // FIXME: This is currently handled by user logic but I'm hoping to eventually provide tree node
+ // features to do this automatically, e.g. a ImGuiTreeNodeFlags_AutoCloseChildNodes etc.
+ static int TreeCloseAndUnselectChildNodes(ExampleTreeNode* node, ImGuiSelectionBasicStorage* selection, int depth = 0)
+ {
+ // Recursive close (the test for depth == 0 is because we call this on a node that was just closed!)
+ int unselected_count = selection->Contains((ImGuiID)node->UID) ? 1 : 0;
+ if (depth == 0 || TreeNodeGetOpen(node))
+ {
+ for (ExampleTreeNode* child : node->Childs)
+ unselected_count += TreeCloseAndUnselectChildNodes(child, selection, depth + 1);
+ TreeNodeSetOpen(node, false);
+ }
+
+ // Select root node if any of its child was selected, otherwise unselect
+ selection->SetItemSelected((ImGuiID)node->UID, (depth == 0 && unselected_count > 0));
+ return unselected_count;
+ }
+
+ // Apply multi-selection requests
+ static void ApplySelectionRequests(ImGuiMultiSelectIO* ms_io, ExampleTreeNode* tree, ImGuiSelectionBasicStorage* selection)
+ {
+ for (ImGuiSelectionRequest& req : ms_io->Requests)
+ {
+ if (req.Type == ImGuiSelectionRequestType_SetAll)
{
- data->DeleteChars(0, data->BufTextLen);
- data->InsertChars(0, "Pressed Up!");
- data->SelectAll();
+ if (req.Selected)
+ TreeSetAllInOpenNodes(tree, selection, req.Selected);
+ else
+ selection->Clear();
}
- else if (data->EventKey == ImGuiKey_DownArrow)
+ else if (req.Type == ImGuiSelectionRequestType_SetRange)
{
- data->DeleteChars(0, data->BufTextLen);
- data->InsertChars(0, "Pressed Down!");
- data->SelectAll();
+ ExampleTreeNode* first_node = (ExampleTreeNode*)(intptr_t)req.RangeFirstItem;
+ ExampleTreeNode* last_node = (ExampleTreeNode*)(intptr_t)req.RangeLastItem;
+ for (ExampleTreeNode* node = first_node; node != NULL; node = TreeGetNextNodeInVisibleOrder(node, last_node))
+ selection->SetItemSelected((ImGuiID)node->UID, req.Selected);
}
}
- else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit)
- {
- // Toggle casing of first character
- char c = data->Buf[0];
- if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) data->Buf[0] ^= 32;
- data->BufDirty = true;
+ }
- // Increment a counter
- int* p_int = (int*)data->UserData;
- *p_int = *p_int + 1;
+ static void TreeSetAllInOpenNodes(ExampleTreeNode* node, ImGuiSelectionBasicStorage* selection, bool selected)
+ {
+ if (node->Parent != NULL) // Root node isn't visible nor selectable in our scheme
+ selection->SetItemSelected((ImGuiID)node->UID, selected);
+ if (node->Parent == NULL || TreeNodeGetOpen(node))
+ for (ExampleTreeNode* child : node->Childs)
+ TreeSetAllInOpenNodes(child, selection, selected);
+ }
+
+ // Interpolate in *user-visible order* AND only *over opened nodes*.
+ // If you have a sequential mapping tables (e.g. generated after a filter/search pass) this would be simpler.
+ // Here the tricks are that:
+ // - we store/maintain ExampleTreeNode::IndexInParent which allows implementing a linear iterator easily, without searches, without recursion.
+ // this could be replaced by a search in parent, aka 'int index_in_parent = curr_node->Parent->Childs.find_index(curr_node)'
+ // which would only be called when crossing from child to a parent, aka not too much.
+ // - we call SetNextItemStorageID() before our TreeNode() calls with an ID which doesn't relate to UI stack,
+ // making it easier to call TreeNodeGetOpen()/TreeNodeSetOpen() from any location.
+ static ExampleTreeNode* TreeGetNextNodeInVisibleOrder(ExampleTreeNode* curr_node, ExampleTreeNode* last_node)
+ {
+ // Reached last node
+ if (curr_node == last_node)
+ return NULL;
+
+ // Recurse into childs. Query storage to tell if the node is open.
+ if (curr_node->Childs.Size > 0 && TreeNodeGetOpen(curr_node))
+ return curr_node->Childs[0];
+
+ // Next sibling, then into our own parent
+ while (curr_node->Parent != NULL)
+ {
+ if (curr_node->IndexInParent + 1 < curr_node->Parent->Childs.Size)
+ return curr_node->Parent->Childs[curr_node->IndexInParent + 1];
+ curr_node = curr_node->Parent;
}
- return 0;
+ return NULL;
}
- };
- static char buf1[64];
- ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback);
- ImGui::SameLine(); HelpMarker("Here we append \"..\" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback.");
- static char buf2[64];
- ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback);
- ImGui::SameLine(); HelpMarker("Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback.");
+ }; // ExampleTreeFuncs
- static char buf3[64];
- static int edit_count = 0;
- ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count);
- ImGui::SameLine(); HelpMarker("Here we toggle the casing of the first character on every edit + count edits.");
- ImGui::SameLine(); ImGui::Text("(%d)", edit_count);
+ static ImGuiSelectionBasicStorage selection;
+ if (demo_data->DemoTree == NULL)
+ demo_data->DemoTree = ExampleTree_CreateDemoTree(); // Create tree once
+ ImGui::Text("Selection size: %d", selection.Size);
+
+ if (ImGui::BeginChild("##Tree", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
+ {
+ ExampleTreeNode* tree = demo_data->DemoTree;
+ ImGuiMultiSelectFlags ms_flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect2d;
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(ms_flags, selection.Size, -1);
+ ExampleTreeFuncs::ApplySelectionRequests(ms_io, tree, &selection);
+ for (ExampleTreeNode* node : tree->Childs)
+ ExampleTreeFuncs::DrawNode(node, &selection);
+ ms_io = ImGui::EndMultiSelect();
+ ExampleTreeFuncs::ApplySelectionRequests(ms_io, tree, &selection);
+ }
+ ImGui::EndChild();
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Text Input/Resize Callback");
- if (ImGui::TreeNode("Resize Callback"))
- {
- // To wire InputText() with std::string or any other custom string type,
- // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper
- // using your preferred type. See misc/cpp/imgui_stdlib.h for an implementation of this using std::string.
- HelpMarker(
- "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n"
- "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string.");
- struct Funcs
+ // Advanced demonstration of BeginMultiSelect()
+ // - Showcase clipping.
+ // - Showcase deletion.
+ // - Showcase basic drag and drop.
+ // - Showcase TreeNode variant (note that tree node don't expand in the demo: supporting expanding tree nodes + clipping a separate thing).
+ // - Showcase using inside a table.
+ IMGUI_DEMO_MARKER("Widgets/Selection State/Multi-Select (advanced)");
+ //ImGui::SetNextItemOpen(true, ImGuiCond_Once);
+ if (ImGui::TreeNode("Multi-Select (advanced)"))
+ {
+ // Options
+ enum WidgetType { WidgetType_Selectable, WidgetType_TreeNode };
+ static bool use_clipper = true;
+ static bool use_deletion = true;
+ static bool use_drag_drop = true;
+ static bool show_in_table = false;
+ static bool show_color_button = true;
+ static ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
+ static WidgetType widget_type = WidgetType_Selectable;
+
+ if (ImGui::TreeNode("Options"))
+ {
+ if (ImGui::RadioButton("Selectables", widget_type == WidgetType_Selectable)) { widget_type = WidgetType_Selectable; }
+ ImGui::SameLine();
+ if (ImGui::RadioButton("Tree nodes", widget_type == WidgetType_TreeNode)) { widget_type = WidgetType_TreeNode; }
+ ImGui::SameLine();
+ HelpMarker("TreeNode() is technically supported but... using this correctly is more complicated (you need some sort of linear/random access to your tree, which is suited to advanced trees setups already implementing filters and clipper. We will work toward simplifying and demoing this.\n\nFor now the tree demo is actually a little bit meaningless because it is an empty tree with only root nodes.");
+ ImGui::Checkbox("Enable clipper", &use_clipper);
+ ImGui::Checkbox("Enable deletion", &use_deletion);
+ ImGui::Checkbox("Enable drag & drop", &use_drag_drop);
+ ImGui::Checkbox("Show in a table", &show_in_table);
+ ImGui::Checkbox("Show color button", &show_color_button);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_SingleSelect", &flags, ImGuiMultiSelectFlags_SingleSelect);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoSelectAll", &flags, ImGuiMultiSelectFlags_NoSelectAll);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoRangeSelect", &flags, ImGuiMultiSelectFlags_NoRangeSelect);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoSelect", &flags, ImGuiMultiSelectFlags_NoAutoSelect);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoClear", &flags, ImGuiMultiSelectFlags_NoAutoClear);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoClearOnReselect", &flags, ImGuiMultiSelectFlags_NoAutoClearOnReselect);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect1d", &flags, ImGuiMultiSelectFlags_BoxSelect1d);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect2d", &flags, ImGuiMultiSelectFlags_BoxSelect2d);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelectNoScroll", &flags, ImGuiMultiSelectFlags_BoxSelectNoScroll);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnEscape", &flags, ImGuiMultiSelectFlags_ClearOnEscape);
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
+ if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeWindow", &flags, ImGuiMultiSelectFlags_ScopeWindow) && (flags & ImGuiMultiSelectFlags_ScopeWindow))
+ flags &= ~ImGuiMultiSelectFlags_ScopeRect;
+ if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_ScopeRect", &flags, ImGuiMultiSelectFlags_ScopeRect) && (flags & ImGuiMultiSelectFlags_ScopeRect))
+ flags &= ~ImGuiMultiSelectFlags_ScopeWindow;
+ if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_SelectOnClick", &flags, ImGuiMultiSelectFlags_SelectOnClick) && (flags & ImGuiMultiSelectFlags_SelectOnClick))
+ flags &= ~ImGuiMultiSelectFlags_SelectOnClickRelease;
+ if (ImGui::CheckboxFlags("ImGuiMultiSelectFlags_SelectOnClickRelease", &flags, ImGuiMultiSelectFlags_SelectOnClickRelease) && (flags & ImGuiMultiSelectFlags_SelectOnClickRelease))
+ flags &= ~ImGuiMultiSelectFlags_SelectOnClick;
+ ImGui::SameLine(); HelpMarker("Allow dragging an unselected item without altering selection.");
+ ImGui::TreePop();
+ }
+
+ // Initialize default list with 1000 items.
+ // Use default selection.Adapter: Pass index to SetNextItemSelectionUserData(), store index in Selection
+ static ImVector<int> items;
+ static int items_next_id = 0;
+ if (items_next_id == 0) { for (int n = 0; n < 1000; n++) { items.push_back(items_next_id++); } }
+ static ExampleSelectionWithDeletion selection;
+ static bool request_deletion_from_menu = false; // Queue deletion triggered from context menu
+
+ ImGui::Text("Selection size: %d/%d", selection.Size, items.Size);
+
+ const float items_height = (widget_type == WidgetType_TreeNode) ? ImGui::GetTextLineHeight() : ImGui::GetTextLineHeightWithSpacing();
+ ImGui::SetNextWindowContentSize(ImVec2(0.0f, items.Size * items_height));
+ if (ImGui::BeginChild("##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
{
- static int MyResizeCallback(ImGuiInputTextCallbackData* data)
+ ImVec2 color_button_sz(ImGui::GetFontSize(), ImGui::GetFontSize());
+ if (widget_type == WidgetType_TreeNode)
+ ImGui::PushStyleVarY(ImGuiStyleVar_ItemSpacing, 0.0f);
+
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, items.Size);
+ selection.ApplyRequests(ms_io);
+
+ const bool want_delete = (ImGui::Shortcut(ImGuiKey_Delete, ImGuiInputFlags_Repeat) && (selection.Size > 0)) || request_deletion_from_menu;
+ const int item_curr_idx_to_focus = want_delete ? selection.ApplyDeletionPreLoop(ms_io, items.Size) : -1;
+ request_deletion_from_menu = false;
+
+ if (show_in_table)
{
- if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
+ if (widget_type == WidgetType_TreeNode)
+ ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(0.0f, 0.0f));
+ ImGui::BeginTable("##Split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_NoPadOuterX);
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 0.70f);
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 0.30f);
+ //ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacingY, 0.0f);
+ }
+
+ ImGuiListClipper clipper;
+ if (use_clipper)
+ {
+ clipper.Begin(items.Size);
+ if (item_curr_idx_to_focus != -1)
+ clipper.IncludeItemByIndex(item_curr_idx_to_focus); // Ensure focused item is not clipped.
+ if (ms_io->RangeSrcItem != -1)
+ clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem); // Ensure RangeSrc item is not clipped.
+ }
+
+ while (!use_clipper || clipper.Step())
+ {
+ const int item_begin = use_clipper ? clipper.DisplayStart : 0;
+ const int item_end = use_clipper ? clipper.DisplayEnd : items.Size;
+ for (int n = item_begin; n < item_end; n++)
{
- ImVector<char>* my_str = (ImVector<char>*)data->UserData;
- IM_ASSERT(my_str->begin() == data->Buf);
- my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1
- data->Buf = my_str->begin();
+ if (show_in_table)
+ ImGui::TableNextColumn();
+
+ const int item_id = items[n];
+ const char* item_category = ExampleNames[item_id % IM_ARRAYSIZE(ExampleNames)];
+ char label[64];
+ sprintf(label, "Object %05d: %s", item_id, item_category);
+
+ // IMPORTANT: for deletion refocus to work we need object ID to be stable,
+ // aka not depend on their index in the list. Here we use our persistent item_id
+ // instead of index to build a unique ID that will persist.
+ // (If we used PushID(index) instead, focus wouldn't be restored correctly after deletion).
+ ImGui::PushID(item_id);
+
+ // Emit a color button, to test that Shift+LeftArrow landing on an item that is not part
+ // of the selection scope doesn't erroneously alter our selection.
+ if (show_color_button)
+ {
+ ImU32 dummy_col = (ImU32)((unsigned int)n * 0xC250B74B) | IM_COL32_A_MASK;
+ ImGui::ColorButton("##", ImColor(dummy_col), ImGuiColorEditFlags_NoTooltip, color_button_sz);
+ ImGui::SameLine();
+ }
+
+ // Submit item
+ bool item_is_selected = selection.Contains((ImGuiID)n);
+ bool item_is_open = false;
+ ImGui::SetNextItemSelectionUserData(n);
+ if (widget_type == WidgetType_Selectable)
+ {
+ ImGui::Selectable(label, item_is_selected, ImGuiSelectableFlags_None);
+ }
+ else if (widget_type == WidgetType_TreeNode)
+ {
+ ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
+ if (item_is_selected)
+ tree_node_flags |= ImGuiTreeNodeFlags_Selected;
+ item_is_open = ImGui::TreeNodeEx(label, tree_node_flags);
+ }
+
+ // Focus (for after deletion)
+ if (item_curr_idx_to_focus == n)
+ ImGui::SetKeyboardFocusHere(-1);
+
+ // Drag and Drop
+ if (use_drag_drop && ImGui::BeginDragDropSource())
+ {
+ // Create payload with full selection OR single unselected item.
+ // (the later is only possible when using ImGuiMultiSelectFlags_SelectOnClickRelease)
+ if (ImGui::GetDragDropPayload() == NULL)
+ {
+ ImVector<int> payload_items;
+ void* it = NULL;
+ ImGuiID id = 0;
+ if (!item_is_selected)
+ payload_items.push_back(item_id);
+ else
+ while (selection.GetNextSelectedItem(&it, &id))
+ payload_items.push_back((int)id);
+ ImGui::SetDragDropPayload("MULTISELECT_DEMO_ITEMS", payload_items.Data, (size_t)payload_items.size_in_bytes());
+ }
+
+ // Display payload content in tooltip
+ const ImGuiPayload* payload = ImGui::GetDragDropPayload();
+ const int* payload_items = (int*)payload->Data;
+ const int payload_count = (int)payload->DataSize / (int)sizeof(int);
+ if (payload_count == 1)
+ ImGui::Text("Object %05d: %s", payload_items[0], ExampleNames[payload_items[0] % IM_ARRAYSIZE(ExampleNames)]);
+ else
+ ImGui::Text("Dragging %d objects", payload_count);
+
+ ImGui::EndDragDropSource();
+ }
+
+ if (widget_type == WidgetType_TreeNode && item_is_open)
+ ImGui::TreePop();
+
+ // Right-click: context menu
+ if (ImGui::BeginPopupContextItem())
+ {
+ ImGui::BeginDisabled(!use_deletion || selection.Size == 0);
+ sprintf(label, "Delete %d item(s)###DeleteSelected", selection.Size);
+ if (ImGui::Selectable(label))
+ request_deletion_from_menu = true;
+ ImGui::EndDisabled();
+ ImGui::Selectable("Close");
+ ImGui::EndPopup();
+ }
+
+ // Demo content within a table
+ if (show_in_table)
+ {
+ ImGui::TableNextColumn();
+ ImGui::SetNextItemWidth(-FLT_MIN);
+ ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
+ ImGui::InputText("###NoLabel", (char*)(void*)item_category, strlen(item_category), ImGuiInputTextFlags_ReadOnly);
+ ImGui::PopStyleVar();
+ }
+
+ ImGui::PopID();
}
- return 0;
+ if (!use_clipper)
+ break;
}
- // Note: Because ImGui:: is a namespace you would typically add your own function into the namespace.
- // For example, you code may declare a function 'ImGui::InputText(const char* label, MyString* my_str)'
- static bool MyInputTextMultiline(const char* label, ImVector<char>* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0)
+ if (show_in_table)
{
- IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
- return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str);
+ ImGui::EndTable();
+ if (widget_type == WidgetType_TreeNode)
+ ImGui::PopStyleVar();
}
- };
- // For this demo we are using ImVector as a string container.
- // Note that because we need to store a terminating zero character, our size/capacity are 1 more
- // than usually reported by a typical string class.
- static ImVector<char> my_str;
- if (my_str.empty())
- my_str.push_back(0);
- Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16));
- ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity());
+ // Apply multi-select requests
+ ms_io = ImGui::EndMultiSelect();
+ selection.ApplyRequests(ms_io);
+ if (want_delete)
+ selection.ApplyDeletionPostLoop(ms_io, items, item_curr_idx_to_focus);
+
+ if (widget_type == WidgetType_TreeNode)
+ ImGui::PopStyleVar();
+ }
+ ImGui::EndChild();
ImGui::TreePop();
}
-
ImGui::TreePop();
}
+}
- // Tabs
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsTabs()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsTabs()
+{
IMGUI_DEMO_MARKER("Widgets/Tabs");
if (ImGui::TreeNode("Tabs"))
{
@@ -1541,6 +3382,7 @@ static void ShowDemoWindowWidgets()
ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", &tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs);
ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton);
+ ImGui::CheckboxFlags("ImGuiTabBarFlags_DrawSelectedOverline", &tab_bar_flags, ImGuiTabBarFlags_DrawSelectedOverline);
if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
@@ -1549,11 +3391,13 @@ static void ShowDemoWindowWidgets()
tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
// Tab Bar
+ ImGui::AlignTextToFramePadding();
+ ImGui::Text("Opened:");
const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" };
static bool opened[4] = { true, true, true, true }; // Persistent user state
for (int n = 0; n < IM_ARRAYSIZE(opened); n++)
{
- if (n > 0) { ImGui::SameLine(); }
+ ImGui::SameLine();
ImGui::Checkbox(names[n], &opened[n]);
}
@@ -1612,8 +3456,9 @@ static void ShowDemoWindowWidgets()
ImGui::EndPopup();
}
- // Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+")
- // Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end.
+ // Demo Trailing Tabs: click the "+" button to add a new tab.
+ // (In your app you may want to use a font icon instead of the "+")
+ // We submit it before the regular tabs, but thanks to the ImGuiTabItemFlags_Trailing flag it will always appear at the end.
if (show_trailing_button)
if (ImGui::TabItemButton("+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip))
active_tabs.push_back(next_tab_id++); // Add new tab
@@ -1643,484 +3488,568 @@ static void ShowDemoWindowWidgets()
}
ImGui::TreePop();
}
+}
- // Plot/Graph widgets are not very good.
- // Consider using a third-party library such as ImPlot: https://github.com/epezent/implot
- // (see others https://github.com/ocornut/imgui/wiki/Useful-Extensions)
- IMGUI_DEMO_MARKER("Widgets/Plotting");
- if (ImGui::TreeNode("Plotting"))
- {
- static bool animate = true;
- ImGui::Checkbox("Animate", &animate);
-
- // Plot as lines and plot as histogram
- IMGUI_DEMO_MARKER("Widgets/Plotting/PlotLines, PlotHistogram");
- static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
- ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
- ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f));
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsText()
+//-----------------------------------------------------------------------------
- // Fill an array of contiguous float values to plot
- // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float
- // and the sizeof() of your structure in the "stride" parameter.
- static float values[90] = {};
- static int values_offset = 0;
- static double refresh_time = 0.0;
- if (!animate || refresh_time == 0.0)
- refresh_time = ImGui::GetTime();
- while (refresh_time < ImGui::GetTime()) // Create data at fixed 60 Hz rate for the demo
+static void DemoWindowWidgetsText()
+{
+ IMGUI_DEMO_MARKER("Widgets/Text");
+ if (ImGui::TreeNode("Text"))
+ {
+ IMGUI_DEMO_MARKER("Widgets/Text/Colored Text");
+ if (ImGui::TreeNode("Colorful Text"))
{
- static float phase = 0.0f;
- values[values_offset] = cosf(phase);
- values_offset = (values_offset + 1) % IM_ARRAYSIZE(values);
- phase += 0.10f * values_offset;
- refresh_time += 1.0f / 60.0f;
+ // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility.
+ ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink");
+ ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow");
+ ImGui::TextDisabled("Disabled");
+ ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle.");
+ ImGui::TreePop();
}
- // Plots can display overlay texts
- // (in this example, we will display an average value)
+ IMGUI_DEMO_MARKER("Widgets/Text/Word Wrapping");
+ if (ImGui::TreeNode("Word Wrapping"))
{
- float average = 0.0f;
- for (int n = 0; n < IM_ARRAYSIZE(values); n++)
- average += values[n];
- average /= (float)IM_ARRAYSIZE(values);
- char overlay[32];
- sprintf(overlay, "avg %f", average);
- ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f));
- }
+ // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility.
+ ImGui::TextWrapped(
+ "This text should automatically wrap on the edge of the window. The current implementation "
+ "for text wrapping follows simple rules suitable for English and possibly other languages.");
+ ImGui::Spacing();
- // Use functions to generate output
- // FIXME: This is rather awkward because current plot API only pass in indices.
- // We probably want an API passing floats and user provide sample rate/count.
- struct Funcs
- {
- static float Sin(void*, int i) { return sinf(i * 0.1f); }
- static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; }
- };
- static int func_type = 0, display_count = 70;
- ImGui::Separator();
- ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
- ImGui::Combo("func", &func_type, "Sin\0Saw\0");
- ImGui::SameLine();
- ImGui::SliderInt("Sample count", &display_count, 1, 400);
- float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
- ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80));
- ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80));
- ImGui::Separator();
+ static float wrap_width = 200.0f;
+ ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f");
- // Animate a simple progress bar
- IMGUI_DEMO_MARKER("Widgets/Plotting/ProgressBar");
- static float progress = 0.0f, progress_dir = 1.0f;
- if (animate)
- {
- progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
- if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
- if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
- }
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+ for (int n = 0; n < 2; n++)
+ {
+ ImGui::Text("Test paragraph %d:", n);
+ ImVec2 pos = ImGui::GetCursorScreenPos();
+ ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y);
+ ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight());
+ ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);
+ if (n == 0)
+ ImGui::Text("The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width);
+ else
+ ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh");
- // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width,
- // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
- ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f));
- ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
- ImGui::Text("Progress Bar");
+ // Draw actual text bounding box, following by marker of our expected limit (should not overlap!)
+ draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255));
+ draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255));
+ ImGui::PopTextWrapPos();
+ }
- float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f);
- char buf[32];
- sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753);
- ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf);
+ ImGui::TreePop();
+ }
+
+ IMGUI_DEMO_MARKER("Widgets/Text/UTF-8 Text");
+ if (ImGui::TreeNode("UTF-8 Text"))
+ {
+ // UTF-8 test with Japanese characters
+ // (Needs a suitable font? Try "Google Noto" or "Arial Unicode". See docs/FONTS.md for details.)
+ // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8
+ // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. in Visual Studio, you
+ // can save your source files as 'UTF-8 without signature').
+ // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8
+ // CHARACTERS IN THIS SOURCE FILE. Instead we are encoding a few strings with hexadecimal constants.
+ // Don't do this in your application! Please use u8"text in any language" in your application!
+ // Note that characters values are preserved even by InputText() if the font cannot be displayed,
+ // so you can safely copy & paste garbled characters into another application.
+ ImGui::TextWrapped(
+ "CJK text will only appear if the font was loaded with the appropriate CJK character ranges. "
+ "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. "
+ "Read docs/FONTS.md for details.");
+ ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)");
+ ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)");
+ static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e";
+ //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis
+ ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf));
+ ImGui::TreePop();
+ }
ImGui::TreePop();
}
+}
- IMGUI_DEMO_MARKER("Widgets/Color");
- if (ImGui::TreeNode("Color/Picker Widgets"))
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsTextFilter()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowWidgetsTextFilter()
+{
+ IMGUI_DEMO_MARKER("Widgets/Text Filter");
+ if (ImGui::TreeNode("Text Filter"))
{
- static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f);
+ // Helper class to easy setup a text filter.
+ // You may want to implement a more feature-full filtering scheme in your own application.
+ HelpMarker("Not a widget per-se, but ImGuiTextFilter is a helper to perform simple filtering on text strings.");
+ static ImGuiTextFilter filter;
+ ImGui::Text("Filter usage:\n"
+ " \"\" display all lines\n"
+ " \"xxx\" display lines containing \"xxx\"\n"
+ " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n"
+ " \"-xxx\" hide lines containing \"xxx\"");
+ filter.Draw();
+ const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" };
+ for (int i = 0; i < IM_ARRAYSIZE(lines); i++)
+ if (filter.PassFilter(lines[i]))
+ ImGui::BulletText("%s", lines[i]);
+ ImGui::TreePop();
+ }
+}
- static bool alpha_preview = true;
- static bool alpha_half_preview = false;
- static bool drag_and_drop = true;
- static bool options_menu = true;
- static bool hdr = false;
- ImGui::Checkbox("With Alpha Preview", &alpha_preview);
- ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview);
- ImGui::Checkbox("With Drag and Drop", &drag_and_drop);
- ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options.");
- ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets.");
- ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions);
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsTextInput()
+//-----------------------------------------------------------------------------
- IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit");
- ImGui::Text("Color widget:");
- ImGui::SameLine(); HelpMarker(
- "Click on the color square to open a color picker.\n"
- "CTRL+click on individual component to input value.\n");
- ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags);
+static void DemoWindowWidgetsTextInput()
+{
+ // To wire InputText() with std::string or any other custom string type,
+ // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file.
+ IMGUI_DEMO_MARKER("Widgets/Text Input");
+ if (ImGui::TreeNode("Text Input"))
+ {
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Multi-line Text Input");
+ if (ImGui::TreeNode("Multi-line Text Input"))
+ {
+ // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize
+ // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings.
+ static char text[1024 * 16] =
+ "/*\n"
+ " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n"
+ " the hexadecimal encoding of one offending instruction,\n"
+ " more formally, the invalid operand with locked CMPXCHG8B\n"
+ " instruction bug, is a design flaw in the majority of\n"
+ " Intel Pentium, Pentium MMX, and Pentium OverDrive\n"
+ " processors (all in the P5 microarchitecture).\n"
+ "*/\n\n"
+ "label:\n"
+ "\tlock cmpxchg8b eax\n";
- IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (HSV, with Alpha)");
- ImGui::Text("Color widget HSV with Alpha:");
- ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags);
+ static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput;
+ HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include <string> in here)");
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput);
+ ImGui::SameLine(); HelpMarker("When _AllowTabInput is set, passing through the widget with Tabbing doesn't automatically activate it, in order to also cycling through subsequent widgets.");
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine);
+ ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags);
+ ImGui::TreePop();
+ }
- IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (float display)");
- ImGui::Text("Color widget with Float Display:");
- ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags);
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Filtered Text Input");
+ if (ImGui::TreeNode("Filtered Text Input"))
+ {
+ struct TextFilters
+ {
+ // Modify character input by altering 'data->Eventchar' (ImGuiInputTextFlags_CallbackCharFilter callback)
+ static int FilterCasingSwap(ImGuiInputTextCallbackData* data)
+ {
+ if (data->EventChar >= 'a' && data->EventChar <= 'z') { data->EventChar -= 'a' - 'A'; } // Lowercase becomes uppercase
+ else if (data->EventChar >= 'A' && data->EventChar <= 'Z') { data->EventChar += 'a' - 'A'; } // Uppercase becomes lowercase
+ return 0;
+ }
- IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with Picker)");
- ImGui::Text("Color button with Picker:");
- ImGui::SameLine(); HelpMarker(
- "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n"
- "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only "
- "be used for the tooltip and picker popup.");
- ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags);
+ // Return 0 (pass) if the character is 'i' or 'm' or 'g' or 'u' or 'i', otherwise return 1 (filter out)
+ static int FilterImGuiLetters(ImGuiInputTextCallbackData* data)
+ {
+ if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar))
+ return 0;
+ return 1;
+ }
+ };
- IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with custom Picker popup)");
- ImGui::Text("Color button with Custom Picker Popup:");
+ static char buf1[32] = ""; ImGui::InputText("default", buf1, 32);
+ static char buf2[32] = ""; ImGui::InputText("decimal", buf2, 32, ImGuiInputTextFlags_CharsDecimal);
+ static char buf3[32] = ""; ImGui::InputText("hexadecimal", buf3, 32, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
+ static char buf4[32] = ""; ImGui::InputText("uppercase", buf4, 32, ImGuiInputTextFlags_CharsUppercase);
+ static char buf5[32] = ""; ImGui::InputText("no blank", buf5, 32, ImGuiInputTextFlags_CharsNoBlank);
+ static char buf6[32] = ""; ImGui::InputText("casing swap", buf6, 32, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterCasingSwap); // Use CharFilter callback to replace characters.
+ static char buf7[32] = ""; ImGui::InputText("\"imgui\"", buf7, 32, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); // Use CharFilter callback to disable some characters.
+ ImGui::TreePop();
+ }
- // Generate a default palette. The palette will persist and can be edited.
- static bool saved_palette_init = true;
- static ImVec4 saved_palette[32] = {};
- if (saved_palette_init)
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Password input");
+ if (ImGui::TreeNode("Password Input"))
{
- for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
- {
- ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f,
- saved_palette[n].x, saved_palette[n].y, saved_palette[n].z);
- saved_palette[n].w = 1.0f; // Alpha
- }
- saved_palette_init = false;
+ static char password[64] = "password123";
+ ImGui::InputText("password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password);
+ ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
+ ImGui::InputTextWithHint("password (w/ hint)", "<password>", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password);
+ ImGui::InputText("password (clear)", password, IM_ARRAYSIZE(password));
+ ImGui::TreePop();
}
- static ImVec4 backup_color;
- bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags);
- ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
- open_popup |= ImGui::Button("Palette");
- if (open_popup)
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Completion, History, Edit Callbacks");
+ if (ImGui::TreeNode("Completion, History, Edit Callbacks"))
{
- ImGui::OpenPopup("mypicker");
- backup_color = color;
+ struct Funcs
+ {
+ static int MyCallback(ImGuiInputTextCallbackData* data)
+ {
+ if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion)
+ {
+ data->InsertChars(data->CursorPos, "..");
+ }
+ else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory)
+ {
+ if (data->EventKey == ImGuiKey_UpArrow)
+ {
+ data->DeleteChars(0, data->BufTextLen);
+ data->InsertChars(0, "Pressed Up!");
+ data->SelectAll();
+ }
+ else if (data->EventKey == ImGuiKey_DownArrow)
+ {
+ data->DeleteChars(0, data->BufTextLen);
+ data->InsertChars(0, "Pressed Down!");
+ data->SelectAll();
+ }
+ }
+ else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit)
+ {
+ // Toggle casing of first character
+ char c = data->Buf[0];
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) data->Buf[0] ^= 32;
+ data->BufDirty = true;
+
+ // Increment a counter
+ int* p_int = (int*)data->UserData;
+ *p_int = *p_int + 1;
+ }
+ return 0;
+ }
+ };
+ static char buf1[64];
+ ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback);
+ ImGui::SameLine(); HelpMarker(
+ "Here we append \"..\" each time Tab is pressed. "
+ "See 'Examples>Console' for a more meaningful demonstration of using this callback.");
+
+ static char buf2[64];
+ ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback);
+ ImGui::SameLine(); HelpMarker(
+ "Here we replace and select text each time Up/Down are pressed. "
+ "See 'Examples>Console' for a more meaningful demonstration of using this callback.");
+
+ static char buf3[64];
+ static int edit_count = 0;
+ ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count);
+ ImGui::SameLine(); HelpMarker(
+ "Here we toggle the casing of the first character on every edit + count edits.");
+ ImGui::SameLine(); ImGui::Text("(%d)", edit_count);
+
+ ImGui::TreePop();
}
- if (ImGui::BeginPopup("mypicker"))
- {
- ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!");
- ImGui::Separator();
- ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview);
- ImGui::SameLine();
- ImGui::BeginGroup(); // Lock X position
- ImGui::Text("Current");
- ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40));
- ImGui::Text("Previous");
- if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)))
- color = backup_color;
- ImGui::Separator();
- ImGui::Text("Palette");
- for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Resize Callback");
+ if (ImGui::TreeNode("Resize Callback"))
+ {
+ // To wire InputText() with std::string or any other custom string type,
+ // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper
+ // using your preferred type. See misc/cpp/imgui_stdlib.h for an implementation of this using std::string.
+ HelpMarker(
+ "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n"
+ "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string.");
+ struct Funcs
{
- ImGui::PushID(n);
- if ((n % 8) != 0)
- ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
-
- ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip;
- if (ImGui::ColorButton("##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20)))
- color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha!
+ static int MyResizeCallback(ImGuiInputTextCallbackData* data)
+ {
+ if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
+ {
+ ImVector<char>* my_str = (ImVector<char>*)data->UserData;
+ IM_ASSERT(my_str->begin() == data->Buf);
+ my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1
+ data->Buf = my_str->begin();
+ }
+ return 0;
+ }
- // Allow user to drop colors into each palette entry. Note that ColorButton() is already a
- // drag source by default, unless specifying the ImGuiColorEditFlags_NoDragDrop flag.
- if (ImGui::BeginDragDropTarget())
+ // Note: Because ImGui:: is a namespace you would typically add your own function into the namespace.
+ // For example, you code may declare a function 'ImGui::InputText(const char* label, MyString* my_str)'
+ static bool MyInputTextMultiline(const char* label, ImVector<char>* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0)
{
- if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
- memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3);
- if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F))
- memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4);
- ImGui::EndDragDropTarget();
+ IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
+ return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str);
}
+ };
- ImGui::PopID();
- }
- ImGui::EndGroup();
- ImGui::EndPopup();
+ // For this demo we are using ImVector as a string container.
+ // Note that because we need to store a terminating zero character, our size/capacity are 1 more
+ // than usually reported by a typical string class.
+ static ImVector<char> my_str;
+ if (my_str.empty())
+ my_str.push_back(0);
+ Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16));
+ ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity());
+ ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (simple)");
- ImGui::Text("Color button only:");
- static bool no_border = false;
- ImGui::Checkbox("ImGuiColorEditFlags_NoBorder", &no_border);
- ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80));
-
- IMGUI_DEMO_MARKER("Widgets/Color/ColorPicker");
- ImGui::Text("Color picker:");
- static bool alpha = true;
- static bool alpha_bar = true;
- static bool side_preview = true;
- static bool ref_color = false;
- static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f);
- static int display_mode = 0;
- static int picker_mode = 0;
- ImGui::Checkbox("With Alpha", &alpha);
- ImGui::Checkbox("With Alpha Bar", &alpha_bar);
- ImGui::Checkbox("With Side Preview", &side_preview);
- if (side_preview)
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Eliding, Alignment");
+ if (ImGui::TreeNode("Eliding, Alignment"))
{
- ImGui::SameLine();
- ImGui::Checkbox("With Ref Color", &ref_color);
- if (ref_color)
- {
- ImGui::SameLine();
- ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags);
- }
+ static char buf1[128] = "/path/to/some/folder/with/long/filename.cpp";
+ static ImGuiInputTextFlags flags = ImGuiInputTextFlags_ElideLeft;
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_ElideLeft", &flags, ImGuiInputTextFlags_ElideLeft);
+ ImGui::InputText("Path", buf1, IM_ARRAYSIZE(buf1), flags);
+ ImGui::TreePop();
}
- ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0");
- ImGui::SameLine(); HelpMarker(
- "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, "
- "but the user can change it with a right-click on those inputs.\n\nColorPicker defaults to displaying RGB+HSV+Hex "
- "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions().");
- ImGui::SameLine(); HelpMarker("When not specified explicitly (Auto/Current mode), user can right-click the picker to change mode.");
- ImGuiColorEditFlags flags = misc_flags;
- if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4()
- if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar;
- if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview;
- if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar;
- if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel;
- if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays
- if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode
- if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV;
- if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex;
- ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL);
- ImGui::Text("Set defaults in code:");
- ImGui::SameLine(); HelpMarker(
- "SetColorEditOptions() is designed to allow you to set boot-time default.\n"
- "We don't have Push/Pop functions because you can force options on a per-widget basis if needed,"
- "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid"
- "encouraging you to persistently save values that aren't forward-compatible.");
- if (ImGui::Button("Default: Uint8 + HSV + Hue Bar"))
- ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar);
- if (ImGui::Button("Default: Float + HDR + Hue Wheel"))
- ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel);
-
- // Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it)
- ImGui::Text("Both types:");
- float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f;
- ImGui::SetNextItemWidth(w);
- ImGui::ColorPicker3("##MyColor##5", (float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
- ImGui::SameLine();
- ImGui::SetNextItemWidth(w);
- ImGui::ColorPicker3("##MyColor##6", (float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
-
- // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0)
- static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV!
- ImGui::Spacing();
- ImGui::Text("HSV encoded colors");
- ImGui::SameLine(); HelpMarker(
- "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV"
- "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the"
- "added benefit that you can manipulate hue values with the picker even when saturation or value are zero.");
- ImGui::Text("Color widget with InputHSV:");
- ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
- ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
- ImGui::DragFloat4("Raw HSV values", (float*)&color_hsv, 0.01f, 0.0f, 1.0f);
+ IMGUI_DEMO_MARKER("Widgets/Text Input/Miscellaneous");
+ if (ImGui::TreeNode("Miscellaneous"))
+ {
+ static char buf1[16];
+ static ImGuiInputTextFlags flags = ImGuiInputTextFlags_EscapeClearsAll;
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_EscapeClearsAll", &flags, ImGuiInputTextFlags_EscapeClearsAll);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_NoUndoRedo", &flags, ImGuiInputTextFlags_NoUndoRedo);
+ ImGui::InputText("Hello", buf1, IM_ARRAYSIZE(buf1), flags);
+ ImGui::TreePop();
+ }
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Widgets/Drag and Slider Flags");
- if (ImGui::TreeNode("Drag/Slider Flags"))
- {
- // Demonstrate using advanced flags for DragXXX and SliderXXX functions. Note that the flags are the same!
- static ImGuiSliderFlags flags = ImGuiSliderFlags_None;
- ImGui::CheckboxFlags("ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp);
- ImGui::SameLine(); HelpMarker("Always clamp value to min/max bounds (if any) when input manually with CTRL+Click.");
- ImGui::CheckboxFlags("ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic);
- ImGui::SameLine(); HelpMarker("Enable logarithmic editing (more precision for small values).");
- ImGui::CheckboxFlags("ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat);
- ImGui::SameLine(); HelpMarker("Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits).");
- ImGui::CheckboxFlags("ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput);
- ImGui::SameLine(); HelpMarker("Disable CTRL+Click or Enter key allowing to input text directly into the widget.");
+}
- // Drags
- static float drag_f = 0.5f;
- static int drag_i = 50;
- ImGui::Text("Underlying float value: %f", drag_f);
- ImGui::DragFloat("DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f, "%.3f", flags);
- ImGui::DragFloat("DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX, "%.3f", flags);
- ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags);
- ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags);
- ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags);
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsTooltips()
+//-----------------------------------------------------------------------------
- // Sliders
- static float slider_f = 0.5f;
- static int slider_i = 50;
- ImGui::Text("Underlying float value: %f", slider_f);
- ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags);
- ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags);
+static void DemoWindowWidgetsTooltips()
+{
+ IMGUI_DEMO_MARKER("Widgets/Tooltips");
+ if (ImGui::TreeNode("Tooltips"))
+ {
+ // Tooltips are windows following the mouse. They do not take focus away.
+ ImGui::SeparatorText("General");
- ImGui::TreePop();
- }
+ // Typical use cases:
+ // - Short-form (text only): SetItemTooltip("Hello");
+ // - Short-form (any contents): if (BeginItemTooltip()) { Text("Hello"); EndTooltip(); }
- IMGUI_DEMO_MARKER("Widgets/Range Widgets");
- if (ImGui::TreeNode("Range Widgets"))
- {
- static float begin = 10, end = 90;
- static int begin_i = 100, end_i = 1000;
- ImGui::DragFloatRange2("range float", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp);
- ImGui::DragIntRange2("range int", &begin_i, &end_i, 5, 0, 1000, "Min: %d units", "Max: %d units");
- ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units");
- ImGui::TreePop();
- }
+ // - Full-form (text only): if (IsItemHovered(...)) { SetTooltip("Hello"); }
+ // - Full-form (any contents): if (IsItemHovered(...) && BeginTooltip()) { Text("Hello"); EndTooltip(); }
- IMGUI_DEMO_MARKER("Widgets/Data Types");
- if (ImGui::TreeNode("Data Types"))
- {
- // DragScalar/InputScalar/SliderScalar functions allow various data types
- // - signed/unsigned
- // - 8/16/32/64-bits
- // - integer/float/double
- // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum
- // to pass the type, and passing all arguments by pointer.
- // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each type.
- // In practice, if you frequently use a given type that is not covered by the normal API entry points,
- // you can wrap it yourself inside a 1 line function which can take typed argument as value instead of void*,
- // and then pass their address to the generic function. For example:
- // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld")
- // {
- // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format);
- // }
+ HelpMarker(
+ "Tooltip are typically created by using a IsItemHovered() + SetTooltip() sequence.\n\n"
+ "We provide a helper SetItemTooltip() function to perform the two with standards flags.");
- // Setup limits (as helper variables so we can take their address, as explained above)
- // Note: SliderScalar() functions have a maximum usable range of half the natural type maximum, hence the /2.
- #ifndef LLONG_MIN
- ImS64 LLONG_MIN = -9223372036854775807LL - 1;
- ImS64 LLONG_MAX = 9223372036854775807LL;
- ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1);
- #endif
- const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127;
- const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255;
- const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767;
- const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535;
- const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2;
- const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2;
- const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2;
- const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2;
- const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f;
- const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0;
+ ImVec2 sz = ImVec2(-FLT_MIN, 0.0f);
- // State
- static char s8_v = 127;
- static ImU8 u8_v = 255;
- static short s16_v = 32767;
- static ImU16 u16_v = 65535;
- static ImS32 s32_v = -1;
- static ImU32 u32_v = (ImU32)-1;
- static ImS64 s64_v = -1;
- static ImU64 u64_v = (ImU64)-1;
- static float f32_v = 0.123f;
- static double f64_v = 90000.01234567890123456789;
+ ImGui::Button("Basic", sz);
+ ImGui::SetItemTooltip("I am a tooltip");
- const float drag_speed = 0.2f;
- static bool drag_clamp = false;
- IMGUI_DEMO_MARKER("Widgets/Data Types/Drags");
- ImGui::Text("Drags:");
- ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp);
- ImGui::SameLine(); HelpMarker(
- "As with every widget in dear imgui, we never modify values unless there is a user interaction.\n"
- "You can override the clamping limits by using CTRL+Click to input a value.");
- ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL);
- ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms");
- ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL);
- ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms");
- ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL);
- ImGui::DragScalar("drag s32 hex", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL, "0x%08X");
- ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms");
- ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL);
- ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL);
- ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f");
- ImGui::DragScalar("drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", ImGuiSliderFlags_Logarithmic);
- ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams");
- ImGui::DragScalar("drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", ImGuiSliderFlags_Logarithmic);
+ ImGui::Button("Fancy", sz);
+ if (ImGui::BeginItemTooltip())
+ {
+ ImGui::Text("I am a fancy tooltip");
+ static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
+ ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr));
+ ImGui::Text("Sin(time) = %f", sinf((float)ImGui::GetTime()));
+ ImGui::EndTooltip();
+ }
- IMGUI_DEMO_MARKER("Widgets/Data Types/Sliders");
- ImGui::Text("Sliders");
- ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d");
- ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u");
- ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d");
- ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u");
- ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d");
- ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d");
- ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d");
- ImGui::SliderScalar("slider s32 hex", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty, "0x%04X");
- ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u");
- ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u");
- ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u");
- ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" IM_PRId64);
- ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" IM_PRId64);
- ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" IM_PRId64);
- ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" IM_PRIu64 " ms");
- ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" IM_PRIu64 " ms");
- ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" IM_PRIu64 " ms");
- ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one);
- ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic);
- ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e");
- ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams");
- ImGui::SliderScalar("slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", ImGuiSliderFlags_Logarithmic);
- ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams");
+ ImGui::SeparatorText("Always On");
- ImGui::Text("Sliders (reverse)");
- ImGui::SliderScalar("slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min, "%d");
- ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u");
- ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d");
- ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u");
- ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" IM_PRId64);
- ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" IM_PRIu64 " ms");
+ // Showcase NOT relying on a IsItemHovered() to emit a tooltip.
+ // Here the tooltip is always emitted when 'always_on == true'.
+ static int always_on = 0;
+ ImGui::RadioButton("Off", &always_on, 0);
+ ImGui::SameLine();
+ ImGui::RadioButton("Always On (Simple)", &always_on, 1);
+ ImGui::SameLine();
+ ImGui::RadioButton("Always On (Advanced)", &always_on, 2);
+ if (always_on == 1)
+ ImGui::SetTooltip("I am following you around.");
+ else if (always_on == 2 && ImGui::BeginTooltip())
+ {
+ ImGui::ProgressBar(sinf((float)ImGui::GetTime()) * 0.5f + 0.5f, ImVec2(ImGui::GetFontSize() * 25, 0.0f));
+ ImGui::EndTooltip();
+ }
- IMGUI_DEMO_MARKER("Widgets/Data Types/Inputs");
- static bool inputs_step = true;
- ImGui::Text("Inputs");
- ImGui::Checkbox("Show step buttons", &inputs_step);
- ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d");
- ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u");
- ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d");
- ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u");
- ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d");
- ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X");
- ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u");
- ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X");
- ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL);
- ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL);
- ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL);
- ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL);
+ ImGui::SeparatorText("Custom");
+
+ HelpMarker(
+ "Passing ImGuiHoveredFlags_ForTooltip to IsItemHovered() is the preferred way to standardize "
+ "tooltip activation details across your application. You may however decide to use custom "
+ "flags for a specific tooltip instance.");
+
+ // The following examples are passed for documentation purpose but may not be useful to most users.
+ // Passing ImGuiHoveredFlags_ForTooltip to IsItemHovered() will pull ImGuiHoveredFlags flags values from
+ // 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' depending on whether mouse or keyboard/gamepad is being used.
+ // With default settings, ImGuiHoveredFlags_ForTooltip is equivalent to ImGuiHoveredFlags_DelayShort + ImGuiHoveredFlags_Stationary.
+ ImGui::Button("Manual", sz);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip))
+ ImGui::SetTooltip("I am a manually emitted tooltip.");
+
+ ImGui::Button("DelayNone", sz);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNone))
+ ImGui::SetTooltip("I am a tooltip with no delay.");
+
+ ImGui::Button("DelayShort", sz);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_NoSharedDelay))
+ ImGui::SetTooltip("I am a tooltip with a short delay (%0.2f sec).", ImGui::GetStyle().HoverDelayShort);
+
+ ImGui::Button("DelayLong", sz);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay))
+ ImGui::SetTooltip("I am a tooltip with a long delay (%0.2f sec).", ImGui::GetStyle().HoverDelayNormal);
+
+ ImGui::Button("Stationary", sz);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary))
+ ImGui::SetTooltip("I am a tooltip requiring mouse to be stationary before activating.");
+
+ // Using ImGuiHoveredFlags_ForTooltip will pull flags from 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav',
+ // which default value include the ImGuiHoveredFlags_AllowWhenDisabled flag.
+ ImGui::BeginDisabled();
+ ImGui::Button("Disabled item", sz);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip))
+ ImGui::SetTooltip("I am a a tooltip for a disabled item.");
+ ImGui::EndDisabled();
ImGui::TreePop();
}
+}
- IMGUI_DEMO_MARKER("Widgets/Multi-component Widgets");
- if (ImGui::TreeNode("Multi-component Widgets"))
- {
- static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f };
- static int vec4i[4] = { 1, 5, 100, 255 };
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsTreeNodes()
+//-----------------------------------------------------------------------------
- ImGui::InputFloat2("input float2", vec4f);
- ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f);
- ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f);
- ImGui::InputInt2("input int2", vec4i);
- ImGui::DragInt2("drag int2", vec4i, 1, 0, 255);
- ImGui::SliderInt2("slider int2", vec4i, 0, 255);
- ImGui::Spacing();
+static void DemoWindowWidgetsTreeNodes()
+{
+ IMGUI_DEMO_MARKER("Widgets/Tree Nodes");
+ if (ImGui::TreeNode("Tree Nodes"))
+ {
+ IMGUI_DEMO_MARKER("Widgets/Tree Nodes/Basic trees");
+ if (ImGui::TreeNode("Basic trees"))
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ // Use SetNextItemOpen() so set the default state of a node to be open. We could
+ // also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing!
+ if (i == 0)
+ ImGui::SetNextItemOpen(true, ImGuiCond_Once);
- ImGui::InputFloat3("input float3", vec4f);
- ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f);
- ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f);
- ImGui::InputInt3("input int3", vec4i);
- ImGui::DragInt3("drag int3", vec4i, 1, 0, 255);
- ImGui::SliderInt3("slider int3", vec4i, 0, 255);
- ImGui::Spacing();
+ // Here we use PushID() to generate a unique base ID, and then the "" used as TreeNode id won't conflict.
+ // An alternative to using 'PushID() + TreeNode("", ...)' to generate a unique ID is to use 'TreeNode((void*)(intptr_t)i, ...)',
+ // aka generate a dummy pointer-sized value to be hashed. The demo below uses that technique. Both are fine.
+ ImGui::PushID(i);
+ if (ImGui::TreeNode("", "Child %d", i))
+ {
+ ImGui::Text("blah blah");
+ ImGui::SameLine();
+ if (ImGui::SmallButton("button")) {}
+ ImGui::TreePop();
+ }
+ ImGui::PopID();
+ }
+ ImGui::TreePop();
+ }
- ImGui::InputFloat4("input float4", vec4f);
- ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f);
- ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f);
- ImGui::InputInt4("input int4", vec4i);
- ImGui::DragInt4("drag int4", vec4i, 1, 0, 255);
- ImGui::SliderInt4("slider int4", vec4i, 0, 255);
+ IMGUI_DEMO_MARKER("Widgets/Tree Nodes/Advanced, with Selectable nodes");
+ if (ImGui::TreeNode("Advanced, with Selectable nodes"))
+ {
+ HelpMarker(
+ "This is a more typical looking tree with selectable nodes.\n"
+ "Click to select, CTRL+Click to toggle, click on arrows or double-click to open.");
+ static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth;
+ static bool align_label_with_current_x_position = false;
+ static bool test_drag_and_drop = false;
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node.");
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanLabelWidth", &base_flags, ImGuiTreeNodeFlags_SpanLabelWidth); ImGui::SameLine(); HelpMarker("Reduce hit area to the text label and a bit of margin.");
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAllColumns", &base_flags, ImGuiTreeNodeFlags_SpanAllColumns); ImGui::SameLine(); HelpMarker("For use in Tables only.");
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_AllowOverlap", &base_flags, ImGuiTreeNodeFlags_AllowOverlap);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_Framed", &base_flags, ImGuiTreeNodeFlags_Framed); ImGui::SameLine(); HelpMarker("Draw frame with background (e.g. for CollapsingHeader)");
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_NavLeftJumpsBackHere", &base_flags, ImGuiTreeNodeFlags_NavLeftJumpsBackHere);
+ ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position);
+ ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop);
+ ImGui::Text("Hello!");
+ if (align_label_with_current_x_position)
+ ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing());
+ // 'selection_mask' is dumb representation of what may be user-side selection state.
+ // You may retain selection state inside or outside your objects in whatever format you see fit.
+ // 'node_clicked' is temporary storage of what node we have clicked to process selection at the end
+ /// of the loop. May be a pointer to your own node type, etc.
+ static int selection_mask = (1 << 2);
+ int node_clicked = -1;
+ for (int i = 0; i < 6; i++)
+ {
+ // Disable the default "open on single-click behavior" + set Selected flag according to our selection.
+ // To alter selection we use IsItemClicked() && !IsItemToggledOpen(), so clicking on an arrow doesn't alter selection.
+ ImGuiTreeNodeFlags node_flags = base_flags;
+ const bool is_selected = (selection_mask & (1 << i)) != 0;
+ if (is_selected)
+ node_flags |= ImGuiTreeNodeFlags_Selected;
+ if (i < 3)
+ {
+ // Items 0..2 are Tree Node
+ bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i);
+ if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
+ node_clicked = i;
+ if (test_drag_and_drop && ImGui::BeginDragDropSource())
+ {
+ ImGui::SetDragDropPayload("_TREENODE", NULL, 0);
+ ImGui::Text("This is a drag and drop source");
+ ImGui::EndDragDropSource();
+ }
+ if (i == 2 && (base_flags & ImGuiTreeNodeFlags_SpanLabelWidth))
+ {
+ // Item 2 has an additional inline button to help demonstrate SpanLabelWidth.
+ ImGui::SameLine();
+ if (ImGui::SmallButton("button")) {}
+ }
+ if (node_open)
+ {
+ ImGui::BulletText("Blah blah\nBlah Blah");
+ ImGui::SameLine();
+ ImGui::SmallButton("Button");
+ ImGui::TreePop();
+ }
+ }
+ else
+ {
+ // Items 3..5 are Tree Leaves
+ // The only reason we use TreeNode at all is to allow selection of the leaf. Otherwise we can
+ // use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text().
+ node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet
+ ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i);
+ if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
+ node_clicked = i;
+ if (test_drag_and_drop && ImGui::BeginDragDropSource())
+ {
+ ImGui::SetDragDropPayload("_TREENODE", NULL, 0);
+ ImGui::Text("This is a drag and drop source");
+ ImGui::EndDragDropSource();
+ }
+ }
+ }
+ if (node_clicked != -1)
+ {
+ // Update selection state
+ // (process outside of tree loop to avoid visual inconsistencies during the clicking frame)
+ if (ImGui::GetIO().KeyCtrl)
+ selection_mask ^= (1 << node_clicked); // CTRL+click to toggle
+ else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, may want to preserve selection when clicking on item that is part of the selection
+ selection_mask = (1 << node_clicked); // Click to single-select
+ }
+ if (align_label_with_current_x_position)
+ ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing());
+ ImGui::TreePop();
+ }
ImGui::TreePop();
}
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgetsVerticalSliders()
+//-----------------------------------------------------------------------------
+static void DemoWindowWidgetsVerticalSliders()
+{
IMGUI_DEMO_MARKER("Widgets/Vertical Sliders");
if (ImGui::TreeNode("Vertical Sliders"))
{
@@ -2185,340 +4114,63 @@ static void ShowDemoWindowWidgets()
ImGui::PopStyleVar();
ImGui::TreePop();
}
+}
- IMGUI_DEMO_MARKER("Widgets/Drag and drop");
- if (ImGui::TreeNode("Drag and Drop"))
- {
- IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets");
- if (ImGui::TreeNode("Drag and drop in standard widgets"))
- {
- // ColorEdit widgets automatically act as drag source and drag target.
- // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F
- // to allow your own widgets to use colors in their drag and drop interaction.
- // Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo.
- HelpMarker("You can drag from the color squares.");
- static float col1[3] = { 1.0f, 0.0f, 0.2f };
- static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
- ImGui::ColorEdit3("color 1", col1);
- ImGui::ColorEdit4("color 2", col2);
- ImGui::TreePop();
- }
-
- IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items");
- if (ImGui::TreeNode("Drag and drop to copy/swap items"))
- {
- enum Mode
- {
- Mode_Copy,
- Mode_Move,
- Mode_Swap
- };
- static int mode = 0;
- if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine();
- if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine();
- if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
- static const char* names[9] =
- {
- "Bobby", "Beatrice", "Betty",
- "Brianna", "Barry", "Bernard",
- "Bibi", "Blaine", "Bryn"
- };
- for (int n = 0; n < IM_ARRAYSIZE(names); n++)
- {
- ImGui::PushID(n);
- if ((n % 3) != 0)
- ImGui::SameLine();
- ImGui::Button(names[n], ImVec2(60, 60));
-
- // Our buttons are both drag sources and drag targets here!
- if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
- {
- // Set payload to carry the index of our item (could be anything)
- ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int));
-
- // Display preview (could be anything, e.g. when dragging an image we could decide to display
- // the filename and a small preview of the image, etc.)
- if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); }
- if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); }
- if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); }
- ImGui::EndDragDropSource();
- }
- if (ImGui::BeginDragDropTarget())
- {
- if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL"))
- {
- IM_ASSERT(payload->DataSize == sizeof(int));
- int payload_n = *(const int*)payload->Data;
- if (mode == Mode_Copy)
- {
- names[n] = names[payload_n];
- }
- if (mode == Mode_Move)
- {
- names[n] = names[payload_n];
- names[payload_n] = "";
- }
- if (mode == Mode_Swap)
- {
- const char* tmp = names[n];
- names[n] = names[payload_n];
- names[payload_n] = tmp;
- }
- }
- ImGui::EndDragDropTarget();
- }
- ImGui::PopID();
- }
- ImGui::TreePop();
- }
-
- IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)");
- if (ImGui::TreeNode("Drag to reorder items (simple)"))
- {
- // Simple reordering
- HelpMarker(
- "We don't use the drag and drop api at all here! "
- "Instead we query when the item is held but not hovered, and order items accordingly.");
- static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" };
- for (int n = 0; n < IM_ARRAYSIZE(item_names); n++)
- {
- const char* item = item_names[n];
- ImGui::Selectable(item);
-
- if (ImGui::IsItemActive() && !ImGui::IsItemHovered())
- {
- int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
- if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names))
- {
- item_names[n] = item_names[n_next];
- item_names[n_next] = item;
- ImGui::ResetMouseDragDelta();
- }
- }
- }
- ImGui::TreePop();
- }
-
- ImGui::TreePop();
- }
-
- IMGUI_DEMO_MARKER("Widgets/Querying Item Status (Edited,Active,Hovered etc.)");
- if (ImGui::TreeNode("Querying Item Status (Edited/Active/Hovered etc.)"))
- {
- // Select an item type
- const char* item_names[] =
- {
- "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputTextMultiline", "InputFloat",
- "InputFloat3", "ColorEdit4", "Selectable", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox"
- };
- static int item_type = 4;
- static bool item_disabled = false;
- ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names));
- ImGui::SameLine();
- HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered().");
- ImGui::Checkbox("Item Disabled", &item_disabled);
-
- // Submit selected items so we can query their status in the code following it.
- bool ret = false;
- static bool b = false;
- static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f };
- static char str[16] = {};
- if (item_disabled)
- ImGui::BeginDisabled(true);
- if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction
- if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button
- if (item_type == 2) { ImGui::PushButtonRepeat(true); ret = ImGui::Button("ITEM: Button"); ImGui::PopButtonRepeat(); } // Testing button (with repeater)
- if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox
- if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item
- if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing)
- if (item_type == 6) { ret = ImGui::InputTextMultiline("ITEM: InputTextMultiline", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which uses a child window)
- if (item_type == 7) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input
- if (item_type == 8) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
- if (item_type == 9) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
- if (item_type == 10){ ret = ImGui::Selectable("ITEM: Selectable"); } // Testing selectable item
- if (item_type == 11){ ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
- if (item_type == 12){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node
- if (item_type == 13){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
- if (item_type == 14){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", &current, items, IM_ARRAYSIZE(items)); }
- if (item_type == 15){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", &current, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
-
- bool hovered_delay_none = ImGui::IsItemHovered();
- bool hovered_delay_short = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort);
- bool hovered_delay_normal = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal);
-
- // Display the values of IsItemHovered() and other common item state functions.
- // Note that the ImGuiHoveredFlags_XXX flags can be combined.
- // Because BulletText is an item itself and that would affect the output of IsItemXXX functions,
- // we query every state in a single call to avoid storing them and to simplify the code.
- ImGui::BulletText(
- "Return value = %d\n"
- "IsItemFocused() = %d\n"
- "IsItemHovered() = %d\n"
- "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n"
- "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n"
- "IsItemHovered(_AllowWhenOverlapped) = %d\n"
- "IsItemHovered(_AllowWhenDisabled) = %d\n"
- "IsItemHovered(_RectOnly) = %d\n"
- "IsItemActive() = %d\n"
- "IsItemEdited() = %d\n"
- "IsItemActivated() = %d\n"
- "IsItemDeactivated() = %d\n"
- "IsItemDeactivatedAfterEdit() = %d\n"
- "IsItemVisible() = %d\n"
- "IsItemClicked() = %d\n"
- "IsItemToggledOpen() = %d\n"
- "GetItemRectMin() = (%.1f, %.1f)\n"
- "GetItemRectMax() = (%.1f, %.1f)\n"
- "GetItemRectSize() = (%.1f, %.1f)",
- ret,
- ImGui::IsItemFocused(),
- ImGui::IsItemHovered(),
- ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),
- ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
- ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped),
- ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled),
- ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly),
- ImGui::IsItemActive(),
- ImGui::IsItemEdited(),
- ImGui::IsItemActivated(),
- ImGui::IsItemDeactivated(),
- ImGui::IsItemDeactivatedAfterEdit(),
- ImGui::IsItemVisible(),
- ImGui::IsItemClicked(),
- ImGui::IsItemToggledOpen(),
- ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y,
- ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
- ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
- );
- ImGui::BulletText(
- "w/ Hovering Delay: None = %d, Fast %d, Normal = %d", hovered_delay_none, hovered_delay_short, hovered_delay_normal);
-
- if (item_disabled)
- ImGui::EndDisabled();
-
- char buf[1] = "";
- ImGui::InputText("unused", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_ReadOnly);
- ImGui::SameLine();
- HelpMarker("This widget is only here to be able to tab-out of the widgets above and see e.g. Deactivated() status.");
-
- ImGui::TreePop();
- }
-
- IMGUI_DEMO_MARKER("Widgets/Querying Window Status (Focused,Hovered etc.)");
- if (ImGui::TreeNode("Querying Window Status (Focused/Hovered etc.)"))
- {
- static bool embed_all_inside_a_child_window = false;
- ImGui::Checkbox("Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window);
- if (embed_all_inside_a_child_window)
- ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), true);
-
- // Testing IsWindowFocused() function with its various flags.
- ImGui::BulletText(
- "IsWindowFocused() = %d\n"
- "IsWindowFocused(_ChildWindows) = %d\n"
- "IsWindowFocused(_ChildWindows|_NoPopupHierarchy) = %d\n"
- "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n"
- "IsWindowFocused(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n"
- "IsWindowFocused(_RootWindow) = %d\n"
- "IsWindowFocused(_RootWindow|_NoPopupHierarchy) = %d\n"
- "IsWindowFocused(_AnyWindow) = %d\n",
- ImGui::IsWindowFocused(),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_NoPopupHierarchy),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy),
- ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow));
-
- // Testing IsWindowHovered() function with its various flags.
- ImGui::BulletText(
- "IsWindowHovered() = %d\n"
- "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n"
- "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n"
- "IsWindowHovered(_ChildWindows) = %d\n"
- "IsWindowHovered(_ChildWindows|_NoPopupHierarchy) = %d\n"
- "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n"
- "IsWindowHovered(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n"
- "IsWindowHovered(_RootWindow) = %d\n"
- "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n"
- "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n"
- "IsWindowHovered(_AnyWindow) = %d\n",
- ImGui::IsWindowHovered(),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup),
- ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow));
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowWidgets()
+//-----------------------------------------------------------------------------
- ImGui::BeginChild("child", ImVec2(0, 50), true);
- ImGui::Text("This is another child window for testing the _ChildWindows flag.");
- ImGui::EndChild();
- if (embed_all_inside_a_child_window)
- ImGui::EndChild();
+static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data)
+{
+ IMGUI_DEMO_MARKER("Widgets");
+ //ImGui::SetNextItemOpen(true, ImGuiCond_Once);
+ if (!ImGui::CollapsingHeader("Widgets"))
+ return;
- // Calling IsItemHovered() after begin returns the hovered status of the title bar.
- // This is useful in particular if you want to create a context menu associated to the title bar of a window.
- static bool test_window = false;
- ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window);
- if (test_window)
- {
- ImGui::Begin("Title bar Hovered/Active tests", &test_window);
- if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered()
- {
- if (ImGui::MenuItem("Close")) { test_window = false; }
- ImGui::EndPopup();
- }
- ImGui::Text(
- "IsItemHovered() after begin = %d (== is title bar hovered)\n"
- "IsItemActive() after begin = %d (== is window being clicked/moved)\n",
- ImGui::IsItemHovered(), ImGui::IsItemActive());
- ImGui::End();
- }
+ const bool disable_all = demo_data->DisableSections; // The Checkbox for that is inside the "Disabled" section at the bottom
+ if (disable_all)
+ ImGui::BeginDisabled();
- ImGui::TreePop();
- }
+ DemoWindowWidgetsBasic();
+ DemoWindowWidgetsBullets();
+ DemoWindowWidgetsCollapsingHeaders();
+ DemoWindowWidgetsComboBoxes();
+ DemoWindowWidgetsColorAndPickers();
+ DemoWindowWidgetsDataTypes();
- // Demonstrate BeginDisabled/EndDisabled using a checkbox located at the bottom of the section (which is a bit odd:
- // logically we'd have this checkbox at the top of the section, but we don't want this feature to steal that space)
if (disable_all)
ImGui::EndDisabled();
+ DemoWindowWidgetsDisableBlocks(demo_data);
+ if (disable_all)
+ ImGui::BeginDisabled();
- IMGUI_DEMO_MARKER("Widgets/Disable Block");
- if (ImGui::TreeNode("Disable block"))
- {
- ImGui::Checkbox("Disable entire section above", &disable_all);
- ImGui::SameLine(); HelpMarker("Demonstrate using BeginDisabled()/EndDisabled() across this section.");
- ImGui::TreePop();
- }
+ DemoWindowWidgetsDragAndDrop();
+ DemoWindowWidgetsDragsAndSliders();
+ DemoWindowWidgetsImages();
+ DemoWindowWidgetsListBoxes();
+ DemoWindowWidgetsMultiComponents();
+ DemoWindowWidgetsPlotting();
+ DemoWindowWidgetsProgressBars();
+ DemoWindowWidgetsQueryingStatuses();
+ DemoWindowWidgetsSelectables();
+ DemoWindowWidgetsSelectionAndMultiSelect(demo_data);
+ DemoWindowWidgetsTabs();
+ DemoWindowWidgetsText();
+ DemoWindowWidgetsTextFilter();
+ DemoWindowWidgetsTextInput();
+ DemoWindowWidgetsTooltips();
+ DemoWindowWidgetsTreeNodes();
+ DemoWindowWidgetsVerticalSliders();
- IMGUI_DEMO_MARKER("Widgets/Text Filter");
- if (ImGui::TreeNode("Text Filter"))
- {
- // Helper class to easy setup a text filter.
- // You may want to implement a more feature-full filtering scheme in your own application.
- HelpMarker("Not a widget per-se, but ImGuiTextFilter is a helper to perform simple filtering on text strings.");
- static ImGuiTextFilter filter;
- ImGui::Text("Filter usage:\n"
- " \"\" display all lines\n"
- " \"xxx\" display lines containing \"xxx\"\n"
- " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n"
- " \"-xxx\" hide lines containing \"xxx\"");
- filter.Draw();
- const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" };
- for (int i = 0; i < IM_ARRAYSIZE(lines); i++)
- if (filter.PassFilter(lines[i]))
- ImGui::BulletText("%s", lines[i]);
- ImGui::TreePop();
- }
+ if (disable_all)
+ ImGui::EndDisabled();
}
-static void ShowDemoWindowLayout()
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowLayout()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowLayout()
{
IMGUI_DEMO_MARKER("Layout");
if (!ImGui::CollapsingHeader("Layout & Scrolling"))
@@ -2527,6 +4179,8 @@ static void ShowDemoWindowLayout()
IMGUI_DEMO_MARKER("Layout/Child windows");
if (ImGui::TreeNode("Child windows"))
{
+ ImGui::SeparatorText("Child windows");
+
HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window.");
static bool disable_mouse_wheel = false;
static bool disable_menu = false;
@@ -2538,7 +4192,7 @@ static void ShowDemoWindowLayout()
ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar;
if (disable_mouse_wheel)
window_flags |= ImGuiWindowFlags_NoScrollWithMouse;
- ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), false, window_flags);
+ ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), ImGuiChildFlags_None, window_flags);
for (int i = 0; i < 100; i++)
ImGui::Text("%04d: scrollable region", i);
ImGui::EndChild();
@@ -2554,7 +4208,7 @@ static void ShowDemoWindowLayout()
if (!disable_menu)
window_flags |= ImGuiWindowFlags_MenuBar;
ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f);
- ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags);
+ ImGui::BeginChild("ChildR", ImVec2(0, 260), ImGuiChildFlags_Borders, window_flags);
if (!disable_menu && ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Menu"))
@@ -2579,7 +4233,39 @@ static void ShowDemoWindowLayout()
ImGui::PopStyleVar();
}
- ImGui::Separator();
+ // Child 3: manual-resize
+ ImGui::SeparatorText("Manual-resize");
+ {
+ HelpMarker("Drag bottom border to resize. Double-click bottom border to auto-fit to vertical contents.");
+ //if (ImGui::Button("Set Height to 200"))
+ // ImGui::SetNextWindowSize(ImVec2(-FLT_MIN, 200.0f));
+
+ ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetStyleColorVec4(ImGuiCol_FrameBg));
+ if (ImGui::BeginChild("ResizableChild", ImVec2(-FLT_MIN, ImGui::GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeY))
+ for (int n = 0; n < 10; n++)
+ ImGui::Text("Line %04d", n);
+ ImGui::PopStyleColor();
+ ImGui::EndChild();
+ }
+
+ // Child 4: auto-resizing height with a limit
+ ImGui::SeparatorText("Auto-resize with constraints");
+ {
+ static int draw_lines = 3;
+ static int max_height_in_lines = 10;
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::DragInt("Lines Count", &draw_lines, 0.2f);
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::DragInt("Max Height (in Lines)", &max_height_in_lines, 0.2f);
+
+ ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 1), ImVec2(FLT_MAX, ImGui::GetTextLineHeightWithSpacing() * max_height_in_lines));
+ if (ImGui::BeginChild("ConstrainedChild", ImVec2(-FLT_MIN, 0.0f), ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeY))
+ for (int n = 0; n < draw_lines; n++)
+ ImGui::Text("Line %04d", n);
+ ImGui::EndChild();
+ }
+
+ ImGui::SeparatorText("Misc/Advanced");
// Demonstrate a few extra things
// - Changing ImGuiCol_ChildBg (which is transparent black in default styles)
@@ -2590,19 +4276,33 @@ static void ShowDemoWindowLayout()
// the POV of the parent window). See 'Demo->Querying Status (Edited/Active/Hovered etc.)' for details.
{
static int offset_x = 0;
+ static bool override_bg_color = true;
+ static ImGuiChildFlags child_flags = ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY;
ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
ImGui::DragInt("Offset X", &offset_x, 1.0f, -1000, 1000);
+ ImGui::Checkbox("Override ChildBg color", &override_bg_color);
+ ImGui::CheckboxFlags("ImGuiChildFlags_Borders", &child_flags, ImGuiChildFlags_Borders);
+ ImGui::CheckboxFlags("ImGuiChildFlags_AlwaysUseWindowPadding", &child_flags, ImGuiChildFlags_AlwaysUseWindowPadding);
+ ImGui::CheckboxFlags("ImGuiChildFlags_ResizeX", &child_flags, ImGuiChildFlags_ResizeX);
+ ImGui::CheckboxFlags("ImGuiChildFlags_ResizeY", &child_flags, ImGuiChildFlags_ResizeY);
+ ImGui::CheckboxFlags("ImGuiChildFlags_FrameStyle", &child_flags, ImGuiChildFlags_FrameStyle);
+ ImGui::SameLine(); HelpMarker("Style the child window like a framed item: use FrameBg, FrameRounding, FrameBorderSize, FramePadding instead of ChildBg, ChildRounding, ChildBorderSize, WindowPadding.");
+ if (child_flags & ImGuiChildFlags_FrameStyle)
+ override_bg_color = false;
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (float)offset_x);
- ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100));
- ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None);
+ if (override_bg_color)
+ ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100));
+ ImGui::BeginChild("Red", ImVec2(200, 100), child_flags, ImGuiWindowFlags_None);
+ if (override_bg_color)
+ ImGui::PopStyleColor();
+
for (int n = 0; n < 50; n++)
ImGui::Text("Some test %d", n);
ImGui::EndChild();
bool child_is_hovered = ImGui::IsItemHovered();
ImVec2 child_rect_min = ImGui::GetItemRectMin();
ImVec2 child_rect_max = ImGui::GetItemRectMax();
- ImGui::PopStyleColor();
ImGui::Text("Hovered: %d", child_is_hovered);
ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y);
}
@@ -2695,11 +4395,11 @@ static void ShowDemoWindowLayout()
// Text
IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine");
ImGui::Text("Two items: Hello"); ImGui::SameLine();
- ImGui::TextColored(ImVec4(1,1,0,1), "Sailor");
+ ImGui::TextColored(ImVec4(1, 1, 0, 1), "Sailor");
// Adjust spacing
ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20);
- ImGui::TextColored(ImVec4(1,1,0,1), "Sailor");
+ ImGui::TextColored(ImVec4(1, 1, 0, 1), "Sailor");
// Button
ImGui::AlignTextToFramePadding();
@@ -2750,7 +4450,7 @@ static void ShowDemoWindowLayout()
ImGui::PushID(i);
ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items));
ImGui::PopID();
- //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i);
+ //ImGui::SetItemTooltip("ListBox %d hovered", i);
}
ImGui::PopItemWidth();
@@ -2767,7 +4467,7 @@ static void ShowDemoWindowLayout()
ImGui::Text("Manual wrapping:");
ImGuiStyle& style = ImGui::GetStyle();
int buttons_count = 20;
- float window_visible_x2 = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x;
+ float window_visible_x2 = ImGui::GetCursorScreenPos().x + ImGui::GetContentRegionAvail().x;
for (int n = 0; n < buttons_count; n++)
{
ImGui::PushID(n);
@@ -2803,8 +4503,7 @@ static void ShowDemoWindowLayout()
ImGui::SameLine();
ImGui::Button("EEE");
ImGui::EndGroup();
- if (ImGui::IsItemHovered())
- ImGui::SetTooltip("First group hovered");
+ ImGui::SetItemTooltip("First group hovered");
}
// Capture the group size and create widgets using the same size
ImVec2 size = ImGui::GetItemRectSize();
@@ -2849,7 +4548,7 @@ static void ShowDemoWindowLayout()
// down by FramePadding.y ahead of time)
ImGui::AlignTextToFramePadding();
ImGui::Text("OK Blahblah"); ImGui::SameLine();
- ImGui::Button("Some framed item"); ImGui::SameLine();
+ ImGui::Button("Some framed item##2"); ImGui::SameLine();
HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y");
// SmallButton() uses the same vertical padding as Text
@@ -2992,7 +4691,7 @@ static void ShowDemoWindowLayout()
const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0;
const ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i);
- const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), true, child_flags);
+ const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), ImGuiChildFlags_Borders, child_flags);
if (ImGui::BeginMenuBar())
{
ImGui::TextUnformatted("abc");
@@ -3039,7 +4738,7 @@ static void ShowDemoWindowLayout()
float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f;
ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0);
ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i);
- bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), true, child_flags);
+ bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), ImGuiChildFlags_Borders, child_flags);
if (scroll_to_off)
ImGui::SetScrollX(scroll_to_off_px);
if (scroll_to_pos)
@@ -3081,7 +4780,7 @@ static void ShowDemoWindowLayout()
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f));
ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30);
- ImGui::BeginChild("scrolling", scrolling_child_size, true, ImGuiWindowFlags_HorizontalScrollbar);
+ ImGui::BeginChild("scrolling", scrolling_child_size, ImGuiChildFlags_Borders, ImGuiWindowFlags_HorizontalScrollbar);
for (int line = 0; line < lines; line++)
{
// Display random stuff. For the sake of this trivial demo we are using basic Button() + SameLine()
@@ -3150,7 +4849,9 @@ static void ShowDemoWindowLayout()
IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal contents size demo window");
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0));
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0));
- HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles.");
+ HelpMarker(
+ "Test how different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\n"
+ "Use 'Metrics->Tools->Show windows rectangles' to visualize rectangles.");
ImGui::Checkbox("H-scrollbar", &show_h_scrollbar);
ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten)
ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width
@@ -3225,7 +4926,7 @@ static void ShowDemoWindowLayout()
}
if (show_child)
{
- ImGui::BeginChild("child", ImVec2(0, 0), true);
+ ImGui::BeginChild("child", ImVec2(0, 0), ImGuiChildFlags_Borders);
ImGui::EndChild();
}
ImGui::End();
@@ -3234,8 +4935,8 @@ static void ShowDemoWindowLayout()
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Layout/Clipping");
- if (ImGui::TreeNode("Clipping"))
+ IMGUI_DEMO_MARKER("Layout/Text Clipping");
+ if (ImGui::TreeNode("Text Clipping"))
{
static ImVec2 size(100.0f, 100.0f);
static ImVec2 offset(30.0f, 30.0f);
@@ -3298,9 +4999,44 @@ static void ShowDemoWindowLayout()
ImGui::TreePop();
}
+
+ IMGUI_DEMO_MARKER("Layout/Overlap Mode");
+ if (ImGui::TreeNode("Overlap Mode"))
+ {
+ static bool enable_allow_overlap = true;
+
+ HelpMarker(
+ "Hit-testing is by default performed in item submission order, which generally is perceived as 'back-to-front'.\n\n"
+ "By using SetNextItemAllowOverlap() you can notify that an item may be overlapped by another. "
+ "Doing so alters the hovering logic: items using AllowOverlap mode requires an extra frame to accept hovered state.");
+ ImGui::Checkbox("Enable AllowOverlap", &enable_allow_overlap);
+
+ ImVec2 button1_pos = ImGui::GetCursorScreenPos();
+ ImVec2 button2_pos = ImVec2(button1_pos.x + 50.0f, button1_pos.y + 50.0f);
+ if (enable_allow_overlap)
+ ImGui::SetNextItemAllowOverlap();
+ ImGui::Button("Button 1", ImVec2(80, 80));
+ ImGui::SetCursorScreenPos(button2_pos);
+ ImGui::Button("Button 2", ImVec2(80, 80));
+
+ // This is typically used with width-spanning items.
+ // (note that Selectable() has a dedicated flag ImGuiSelectableFlags_AllowOverlap, which is a shortcut
+ // for using SetNextItemAllowOverlap(). For demo purpose we use SetNextItemAllowOverlap() here.)
+ if (enable_allow_overlap)
+ ImGui::SetNextItemAllowOverlap();
+ ImGui::Selectable("Some Selectable", false);
+ ImGui::SameLine();
+ ImGui::SmallButton("++");
+
+ ImGui::TreePop();
+ }
}
-static void ShowDemoWindowPopups()
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowPopups()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowPopups()
{
IMGUI_DEMO_MARKER("Popups");
if (!ImGui::CollapsingHeader("Popups & Modal windows"))
@@ -3343,8 +5079,7 @@ static void ShowDemoWindowPopups()
ImGui::TextUnformatted(selected_fish == -1 ? "<None>" : names[selected_fish]);
if (ImGui::BeginPopup("my_select_popup"))
{
- ImGui::Text("Aquarium");
- ImGui::Separator();
+ ImGui::SeparatorText("Aquarium");
for (int i = 0; i < IM_ARRAYSIZE(names); i++)
if (ImGui::Selectable(names[i]))
selected_fish = i;
@@ -3366,8 +5101,7 @@ static void ShowDemoWindowPopups()
ImGui::Separator();
ImGui::Text("Tooltip here");
- if (ImGui::IsItemHovered())
- ImGui::SetTooltip("I am a tooltip over a popup");
+ ImGui::SetItemTooltip("I am a tooltip over a popup");
if (ImGui::Button("Stacked Popup"))
ImGui::OpenPopup("another popup");
@@ -3438,18 +5172,20 @@ static void ShowDemoWindowPopups()
// and BeginPopupContextItem() will use the last item ID as the popup ID.
{
const char* names[5] = { "Label1", "Label2", "Label3", "Label4", "Label5" };
+ static int selected = -1;
for (int n = 0; n < 5; n++)
{
- ImGui::Selectable(names[n]);
+ if (ImGui::Selectable(names[n], selected == n))
+ selected = n;
if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id
{
+ selected = n;
ImGui::Text("This a popup for \"%s\"!", names[n]);
if (ImGui::Button("Close"))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
}
- if (ImGui::IsItemHovered())
- ImGui::SetTooltip("Right-click to open popup");
+ ImGui::SetItemTooltip("Right-click to open popup");
}
}
@@ -3518,7 +5254,7 @@ static void ShowDemoWindowPopups()
if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
{
- ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n");
+ ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!");
ImGui::Separator();
//static int unused_i = 0;
@@ -3555,7 +5291,7 @@ static void ShowDemoWindowPopups()
static int item = 1;
static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
- ImGui::ColorEdit4("color", color);
+ ImGui::ColorEdit4("Color", color);
if (ImGui::Button("Add another modal.."))
ImGui::OpenPopup("Stacked 2");
@@ -3567,6 +5303,7 @@ static void ShowDemoWindowPopups()
if (ImGui::BeginPopupModal("Stacked 2", &unused_open))
{
ImGui::Text("Hello from Stacked The Second!");
+ ImGui::ColorEdit4("Color", color); // Allow opening another nested popup
if (ImGui::Button("Close"))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
@@ -3629,6 +5366,14 @@ struct MyItem
// very often by the sorting algorithm it would be a little wasteful.
static const ImGuiTableSortSpecs* s_current_sort_specs;
+ static void SortWithSortSpecs(ImGuiTableSortSpecs* sort_specs, MyItem* items, int items_count)
+ {
+ s_current_sort_specs = sort_specs; // Store in variable accessible by the sort function.
+ if (items_count > 1)
+ qsort(items, (size_t)items_count, sizeof(items[0]), MyItem::CompareWithSortSpecs);
+ s_current_sort_specs = NULL;
+ }
+
// Compare function to be used by qsort()
static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs)
{
@@ -3655,7 +5400,8 @@ struct MyItem
}
// qsort() is instable so always return a way to differenciate items.
- // Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs.
+ // Your own compare function may want to avoid fallback on implicit sort specs.
+ // e.g. a Name compare if it wasn't already part of the sort specs.
return (a->ID - b->ID);
}
};
@@ -3666,8 +5412,8 @@ const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL;
static void PushStyleCompact()
{
ImGuiStyle& style = ImGui::GetStyle();
- ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.x, (float)(int)(style.FramePadding.y * 0.60f)));
- ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x, (float)(int)(style.ItemSpacing.y * 0.60f)));
+ ImGui::PushStyleVarY(ImGuiStyleVar_FramePadding, (float)(int)(style.FramePadding.y * 0.60f));
+ ImGui::PushStyleVarY(ImGuiStyleVar_ItemSpacing, (float)(int)(style.ItemSpacing.y * 0.60f));
}
static void PopStyleCompact()
@@ -3701,9 +5447,8 @@ static void EditTableSizingFlags(ImGuiTableFlags* p_flags)
}
ImGui::SameLine();
ImGui::TextDisabled("(?)");
- if (ImGui::IsItemHovered())
+ if (ImGui::BeginItemTooltip())
{
- ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f);
for (int m = 0; m < IM_ARRAYSIZE(policies); m++)
{
@@ -3740,6 +5485,7 @@ static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags)
ImGui::CheckboxFlags("_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending);
ImGui::CheckboxFlags("_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker("Default for column 0");
ImGui::CheckboxFlags("_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker("Default for column >0");
+ ImGui::CheckboxFlags("_AngledHeader", p_flags, ImGuiTableColumnFlags_AngledHeader);
}
static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags)
@@ -3750,7 +5496,11 @@ static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags)
ImGui::CheckboxFlags("_IsHovered", &flags, ImGuiTableColumnFlags_IsHovered);
}
-static void ShowDemoWindowTables()
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowTables()
+//-----------------------------------------------------------------------------
+
+static void DemoWindowTables()
{
//ImGui::SetNextItemOpen(true, ImGuiCond_Once);
IMGUI_DEMO_MARKER("Tables");
@@ -3764,10 +5514,10 @@ static void ShowDemoWindowTables()
ImGui::PushID("Tables");
int open_action = -1;
- if (ImGui::Button("Open all"))
+ if (ImGui::Button("Expand all"))
open_action = 1;
ImGui::SameLine();
- if (ImGui::Button("Close all"))
+ if (ImGui::Button("Collapse all"))
open_action = 0;
ImGui::SameLine();
@@ -3838,8 +5588,9 @@ static void ShowDemoWindowTables()
// as TableNextColumn() will automatically wrap around and create new rows as needed.
// This is generally more convenient when your cells all contains the same type of data.
HelpMarker(
- "Only using TableNextColumn(), which tends to be convenient for tables where every cell contains the same type of contents.\n"
- "This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition.");
+ "Only using TableNextColumn(), which tends to be convenient for tables where every cell contains "
+ "the same type of contents.\n This is also more similar to the old NextColumn() function of the "
+ "Columns API, and provided to facilitate the Columns->Tables API transition.");
if (ImGui::BeginTable("table3", 3))
{
for (int item = 0; item < 14; item++)
@@ -3867,7 +5618,7 @@ static void ShowDemoWindowTables()
PushStyleCompact();
ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg);
ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders);
- ImGui::SameLine(); HelpMarker("ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterH");
+ ImGui::SameLine(); HelpMarker("ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerH\n | ImGuiTableFlags_BordersOuterH");
ImGui::Indent();
ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH);
@@ -3895,8 +5646,8 @@ static void ShowDemoWindowTables()
if (ImGui::BeginTable("table1", 3, flags))
{
- // Display headers so we can inspect their interaction with borders.
- // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much. See other sections for details)
+ // Display headers so we can inspect their interaction with borders
+ // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them now. See other sections for details)
if (display_headers)
{
ImGui::TableSetupColumn("One");
@@ -3935,7 +5686,9 @@ static void ShowDemoWindowTables()
PushStyleCompact();
ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV);
- ImGui::SameLine(); HelpMarker("Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this.");
+ ImGui::SameLine(); HelpMarker(
+ "Using the _Resizable flag automatically enables the _BordersInnerV flag as well, "
+ "this is why the resize borders are still showing when unchecking this.");
PopStyleCompact();
if (ImGui::BeginTable("table1", 3, flags))
@@ -4053,6 +5806,7 @@ static void ShowDemoWindowTables()
ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable);
ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody);
ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)");
+ ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
PopStyleCompact();
if (ImGui::BeginTable("table1", 3, flags))
@@ -4075,7 +5829,8 @@ static void ShowDemoWindowTables()
ImGui::EndTable();
}
- // Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column)
+ // Use outer_size.x == 0.0f instead of default to make the table as tight as possible
+ // (only valid when no scrolling and no stretch column)
if (ImGui::BeginTable("table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f)))
{
ImGui::TableSetupColumn("One");
@@ -4108,7 +5863,8 @@ static void ShowDemoWindowTables()
"e.g.:\n"
"- BorderOuterV\n"
"- any form of row selection\n"
- "Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default.\n\n"
+ "Because of this, activating BorderOuterV sets the default to PadOuterX. "
+ "Using PadOuterX or NoPadOuterX you can override the default.\n\n"
"Actual padding values are using style.CellPadding.\n\n"
"In this demo we don't show horizontal borders to emphasize how they don't affect default horizontal padding.");
@@ -4224,7 +5980,8 @@ static void ShowDemoWindowTables()
EditTableSizingFlags(&sizing_policy_flags[table_n]);
// To make it easier to understand the different sizing policy,
- // For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width.
+ // For each policy: we display one table where the columns have equal contents width,
+ // and one where the columns have different contents width.
if (ImGui::BeginTable("table1", 3, sizing_policy_flags[table_n] | flags1))
{
for (int row = 0; row < 3; row++)
@@ -4253,7 +6010,9 @@ static void ShowDemoWindowTables()
ImGui::Spacing();
ImGui::TextUnformatted("Advanced");
ImGui::SameLine();
- HelpMarker("This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns.");
+ HelpMarker(
+ "This section allows you to interact and see the effect of various sizing policies "
+ "depending on whether Scroll is enabled and the contents of your columns.");
enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText };
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable;
@@ -4268,7 +6027,9 @@ static void ShowDemoWindowTables()
if (contents_type == CT_FillButton)
{
ImGui::SameLine();
- HelpMarker("Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width.");
+ HelpMarker(
+ "Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop "
+ "where contents width can feed into auto-column width can feed into contents width.");
}
ImGui::DragInt("Columns", &column_count, 0.1f, 1, 64, "%d", ImGuiSliderFlags_AlwaysClamp);
ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
@@ -4314,7 +6075,9 @@ static void ShowDemoWindowTables()
IMGUI_DEMO_MARKER("Tables/Vertical scrolling, with clipping");
if (ImGui::TreeNode("Vertical scrolling, with clipping"))
{
- HelpMarker("Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\nWe also demonstrate using ImGuiListClipper to virtualize the submission of many items.");
+ HelpMarker(
+ "Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\n"
+ "We also demonstrate using ImGuiListClipper to virtualize the submission of many items.");
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable;
PushStyleCompact();
@@ -4360,8 +6123,9 @@ static void ShowDemoWindowTables()
HelpMarker(
"When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, "
"as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n"
- "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX,"
- "because the container window won't automatically extend vertically to fix contents (this may be improved in future versions).");
+ "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX, "
+ "because the container window won't automatically extend vertically to fix contents "
+ "(this may be improved in future versions).");
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable;
static int freeze_cols = 1;
static int freeze_rows = 1;
@@ -4418,7 +6182,8 @@ static void ShowDemoWindowTables()
HelpMarker(
"Showcase using Stretch columns + ScrollX together: "
"this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n"
- "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense.");
+ "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns "
+ "along with ScrollX doesn't make sense.");
static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody;
static float inner_width = 1000.0f;
PushStyleCompact();
@@ -4476,8 +6241,9 @@ static void ShowDemoWindowTables()
}
// Create the real table we care about for the example!
- // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in
- // a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down)
+ // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above,
+ // otherwise in a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible
+ // + resizing the parent window down).
const ImGuiTableFlags flags
= ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY
| ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV
@@ -4485,15 +6251,22 @@ static void ShowDemoWindowTables()
ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9);
if (ImGui::BeginTable("table_columns_flags", column_count, flags, outer_size))
{
+ bool has_angled_header = false;
for (int column = 0; column < column_count; column++)
+ {
+ has_angled_header |= (column_flags[column] & ImGuiTableColumnFlags_AngledHeader) != 0;
ImGui::TableSetupColumn(column_names[column], column_flags[column]);
+ }
+ if (has_angled_header)
+ ImGui::TableAngledHeadersRow();
ImGui::TableHeadersRow();
for (int column = 0; column < column_count; column++)
column_flags_out[column] = ImGui::TableGetColumnFlags(column);
float indent_step = (float)((int)TEXT_BASE_WIDTH / 2);
for (int row = 0; row < 8; row++)
{
- ImGui::Indent(indent_step); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags.
+ // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags.
+ ImGui::Indent(indent_step);
ImGui::TableNextRow();
for (int column = 0; column < column_count; column++)
{
@@ -4542,7 +6315,9 @@ static void ShowDemoWindowTables()
ImGui::EndTable();
}
- HelpMarker("Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host.");
+ HelpMarker(
+ "Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, "
+ "fixed columns with set width may still be shrunk down if there's not enough space in the host.");
static ImGuiTableFlags flags2 = ImGuiTableFlags_None;
PushStyleCompact();
@@ -4552,7 +6327,8 @@ static void ShowDemoWindowTables()
PopStyleCompact();
if (ImGui::BeginTable("table2", 4, flags2))
{
- // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed.
+ // We could also set ImGuiTableFlags_SizingFixedFit on the table and then all columns
+ // will default to ImGuiTableColumnFlags_WidthFixed.
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f);
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f);
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f);
@@ -4624,10 +6400,13 @@ static void ShowDemoWindowTables()
IMGUI_DEMO_MARKER("Tables/Row height");
if (ImGui::TreeNode("Row height"))
{
- HelpMarker("You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\nWe cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row.");
- if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerV))
+ HelpMarker(
+ "You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, "
+ "so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\n"
+ "We cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row.");
+ if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_Borders))
{
- for (int row = 0; row < 10; row++)
+ for (int row = 0; row < 8; row++)
{
float min_row_height = (float)(int)(TEXT_BASE_HEIGHT * 0.30f * row);
ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height);
@@ -4636,6 +6415,48 @@ static void ShowDemoWindowTables()
}
ImGui::EndTable();
}
+
+ HelpMarker(
+ "Showcase using SameLine(0,0) to share Current Line Height between cells.\n\n"
+ "Please note that Tables Row Height is not the same thing as Current Line Height, "
+ "as a table cell may contains multiple lines.");
+ if (ImGui::BeginTable("table_share_lineheight", 2, ImGuiTableFlags_Borders))
+ {
+ ImGui::TableNextRow();
+ ImGui::TableNextColumn();
+ ImGui::ColorButton("##1", ImVec4(0.13f, 0.26f, 0.40f, 1.0f), ImGuiColorEditFlags_None, ImVec2(40, 40));
+ ImGui::TableNextColumn();
+ ImGui::Text("Line 1");
+ ImGui::Text("Line 2");
+
+ ImGui::TableNextRow();
+ ImGui::TableNextColumn();
+ ImGui::ColorButton("##2", ImVec4(0.13f, 0.26f, 0.40f, 1.0f), ImGuiColorEditFlags_None, ImVec2(40, 40));
+ ImGui::TableNextColumn();
+ ImGui::SameLine(0.0f, 0.0f); // Reuse line height from previous column
+ ImGui::Text("Line 1, with SameLine(0,0)");
+ ImGui::Text("Line 2");
+
+ ImGui::EndTable();
+ }
+
+ HelpMarker("Showcase altering CellPadding.y between rows. Note that CellPadding.x is locked for the entire table.");
+ if (ImGui::BeginTable("table_changing_cellpadding_y", 1, ImGuiTableFlags_Borders))
+ {
+ ImGuiStyle& style = ImGui::GetStyle();
+ for (int row = 0; row < 8; row++)
+ {
+ if ((row % 3) == 2)
+ ImGui::PushStyleVarY(ImGuiStyleVar_CellPadding, 20.0f);
+ ImGui::TableNextRow(ImGuiTableRowFlags_None);
+ ImGui::TableNextColumn();
+ ImGui::Text("CellPadding.y = %.2f", style.CellPadding.y);
+ if ((row % 3) == 2)
+ ImGui::PopStyleVar();
+ }
+ ImGui::EndTable();
+ }
+
ImGui::TreePop();
}
@@ -4769,9 +6590,17 @@ static void ShowDemoWindowTables()
IMGUI_DEMO_MARKER("Tables/Tree view");
if (ImGui::TreeNode("Tree view"))
{
- static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody;
+ static ImGuiTableFlags table_flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody;
+
+ static ImGuiTreeNodeFlags tree_node_flags_base = ImGuiTreeNodeFlags_SpanAllColumns;
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &tree_node_flags_base, ImGuiTreeNodeFlags_SpanFullWidth);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanLabelWidth", &tree_node_flags_base, ImGuiTreeNodeFlags_SpanLabelWidth);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAllColumns", &tree_node_flags_base, ImGuiTreeNodeFlags_SpanAllColumns);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_LabelSpanAllColumns", &tree_node_flags_base, ImGuiTreeNodeFlags_LabelSpanAllColumns);
+ ImGui::SameLine(); HelpMarker("Useful if you know that you aren't displaying contents in other columns");
- if (ImGui::BeginTable("3ways", 3, flags))
+ HelpMarker("See \"Columns flags\" section to configure how indentation is applied to individual columns.");
+ if (ImGui::BeginTable("3ways", 3, table_flags))
{
// The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide);
@@ -4792,13 +6621,21 @@ static void ShowDemoWindowTables()
ImGui::TableNextRow();
ImGui::TableNextColumn();
const bool is_folder = (node->ChildCount > 0);
+
+ ImGuiTreeNodeFlags node_flags = tree_node_flags_base;
+ if (node != &all_nodes[0])
+ node_flags &= ~ImGuiTreeNodeFlags_LabelSpanAllColumns; // Only demonstrate this on the root node.
+
if (is_folder)
{
- bool open = ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_SpanFullWidth);
- ImGui::TableNextColumn();
- ImGui::TextDisabled("--");
- ImGui::TableNextColumn();
- ImGui::TextUnformatted(node->Type);
+ bool open = ImGui::TreeNodeEx(node->Name, node_flags);
+ if ((node_flags & ImGuiTreeNodeFlags_LabelSpanAllColumns) == 0)
+ {
+ ImGui::TableNextColumn();
+ ImGui::TextDisabled("--");
+ ImGui::TableNextColumn();
+ ImGui::TextUnformatted(node->Type);
+ }
if (open)
{
for (int child_n = 0; child_n < node->ChildCount; child_n++)
@@ -4808,7 +6645,7 @@ static void ShowDemoWindowTables()
}
else
{
- ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth);
+ ImGui::TreeNodeEx(node->Name, node_flags | ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen);
ImGui::TableNextColumn();
ImGui::Text("%d", node->Size);
ImGui::TableNextColumn();
@@ -4818,7 +6655,7 @@ static void ShowDemoWindowTables()
};
static const MyTreeNode nodes[] =
{
- { "Root", "Folder", -1, 1, 3 }, // 0
+ { "Root with Long Name", "Folder", -1, 1, 3 }, // 0
{ "Music", "Folder", -1, 4, 2 }, // 1
{ "Textures", "Folder", -1, 6, 3 }, // 2
{ "desktop.ini", "System file", 1024, -1,-1 }, // 3
@@ -4843,7 +6680,8 @@ static void ShowDemoWindowTables()
{
HelpMarker(
"Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n"
- "Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense.");
+ "Note that on auto-resizing non-resizable fixed columns, querying the content width for "
+ "e.g. right-alignment doesn't make sense.");
if (ImGui::BeginTable("table_item_width", 3, ImGuiTableFlags_Borders))
{
ImGui::TableSetupColumn("small");
@@ -4898,7 +6736,11 @@ static void ShowDemoWindowTables()
// FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox.
static bool column_selected[3] = {};
- // Instead of calling TableHeadersRow() we'll submit custom headers ourselves
+ // Instead of calling TableHeadersRow() we'll submit custom headers ourselves.
+ // (A different approach is also possible:
+ // - Specify ImGuiTableColumnFlags_NoHeaderLabel in some TableSetupColumn() call.
+ // - Call TableHeadersRow() normally. This will submit TableHeader() with no name.
+ // - Then call TableSetColumnIndex() to position yourself in the column and submit your stuff e.g. Checkbox().)
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
for (int column = 0; column < COLUMNS_COUNT; column++)
{
@@ -4913,6 +6755,7 @@ static void ShowDemoWindowTables()
ImGui::PopID();
}
+ // Submit table contents
for (int row = 0; row < 5; row++)
{
ImGui::TableNextRow();
@@ -4929,13 +6772,84 @@ static void ShowDemoWindowTables()
ImGui::TreePop();
}
- // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader()
+ // Demonstrate using ImGuiTableColumnFlags_AngledHeader flag to create angled headers
+ if (open_action != -1)
+ ImGui::SetNextItemOpen(open_action != 0);
+ IMGUI_DEMO_MARKER("Tables/Angled headers");
+ if (ImGui::TreeNode("Angled headers"))
+ {
+ const char* column_names[] = { "Track", "cabasa", "ride", "smash", "tom-hi", "tom-mid", "tom-low", "hihat-o", "hihat-c", "snare-s", "snare-c", "clap", "rim", "kick" };
+ const int columns_count = IM_ARRAYSIZE(column_names);
+ const int rows_count = 12;
+
+ static ImGuiTableFlags table_flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_Hideable | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_HighlightHoveredColumn;
+ static ImGuiTableColumnFlags column_flags = ImGuiTableColumnFlags_AngledHeader | ImGuiTableColumnFlags_WidthFixed;
+ static bool bools[columns_count * rows_count] = {}; // Dummy storage selection storage
+ static int frozen_cols = 1;
+ static int frozen_rows = 2;
+ ImGui::CheckboxFlags("_ScrollX", &table_flags, ImGuiTableFlags_ScrollX);
+ ImGui::CheckboxFlags("_ScrollY", &table_flags, ImGuiTableFlags_ScrollY);
+ ImGui::CheckboxFlags("_Resizable", &table_flags, ImGuiTableFlags_Resizable);
+ ImGui::CheckboxFlags("_Sortable", &table_flags, ImGuiTableFlags_Sortable);
+ ImGui::CheckboxFlags("_NoBordersInBody", &table_flags, ImGuiTableFlags_NoBordersInBody);
+ ImGui::CheckboxFlags("_HighlightHoveredColumn", &table_flags, ImGuiTableFlags_HighlightHoveredColumn);
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::SliderInt("Frozen columns", &frozen_cols, 0, 2);
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::SliderInt("Frozen rows", &frozen_rows, 0, 2);
+ ImGui::CheckboxFlags("Disable header contributing to column width", &column_flags, ImGuiTableColumnFlags_NoHeaderWidth);
+
+ if (ImGui::TreeNode("Style settings"))
+ {
+ ImGui::SameLine();
+ HelpMarker("Giving access to some ImGuiStyle value in this demo for convenience.");
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::SliderAngle("style.TableAngledHeadersAngle", &ImGui::GetStyle().TableAngledHeadersAngle, -50.0f, +50.0f);
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::SliderFloat2("style.TableAngledHeadersTextAlign", (float*)&ImGui::GetStyle().TableAngledHeadersTextAlign, 0.0f, 1.0f, "%.2f");
+ ImGui::TreePop();
+ }
+
+ if (ImGui::BeginTable("table_angled_headers", columns_count, table_flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 12)))
+ {
+ ImGui::TableSetupColumn(column_names[0], ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_NoReorder);
+ for (int n = 1; n < columns_count; n++)
+ ImGui::TableSetupColumn(column_names[n], column_flags);
+ ImGui::TableSetupScrollFreeze(frozen_cols, frozen_rows);
+
+ ImGui::TableAngledHeadersRow(); // Draw angled headers for all columns with the ImGuiTableColumnFlags_AngledHeader flag.
+ ImGui::TableHeadersRow(); // Draw remaining headers and allow access to context-menu and other functions.
+ for (int row = 0; row < rows_count; row++)
+ {
+ ImGui::PushID(row);
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0);
+ ImGui::AlignTextToFramePadding();
+ ImGui::Text("Track %d", row);
+ for (int column = 1; column < columns_count; column++)
+ if (ImGui::TableSetColumnIndex(column))
+ {
+ ImGui::PushID(column);
+ ImGui::Checkbox("", &bools[row * columns_count + column]);
+ ImGui::PopID();
+ }
+ ImGui::PopID();
+ }
+ ImGui::EndTable();
+ }
+ ImGui::TreePop();
+ }
+
+ // Demonstrate creating custom context menus inside columns,
+ // while playing it nice with context menus provided by TableHeadersRow()/TableHeader()
if (open_action != -1)
ImGui::SetNextItemOpen(open_action != 0);
IMGUI_DEMO_MARKER("Tables/Context menus");
if (ImGui::TreeNode("Context menus"))
{
- HelpMarker("By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\nUsing ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body.");
+ HelpMarker(
+ "By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\n"
+ "Using ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body.");
static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody;
PushStyleCompact();
@@ -4972,7 +6886,9 @@ static void ShowDemoWindowTables()
// [2.1] Right-click on the TableHeadersRow() line to open the default table context menu.
// [2.2] Right-click on the ".." to open a custom popup
// [2.3] Right-click in columns to open another custom popup
- HelpMarker("Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body).");
+ HelpMarker(
+ "Demonstrate mixing table context menu (over header), item context button (over button) "
+ "and custom per-colunm context menu (over column body).");
ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders;
if (ImGui::BeginTable("table_context_menu_2", COLUMNS_COUNT, flags2))
{
@@ -5043,18 +6959,25 @@ static void ShowDemoWindowTables()
if (ImGui::TreeNode("Synced instances"))
{
HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc.");
+
+ static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings;
+ ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
+ ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
+ ImGui::CheckboxFlags("ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit);
+ ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
for (int n = 0; n < 3; n++)
{
char buf[32];
sprintf(buf, "Synced Table %d", n);
bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen);
- if (open && ImGui::BeginTable("Table", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings))
+ if (open && ImGui::BeginTable("Table", 3, flags, ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 5)))
{
ImGui::TableSetupColumn("One");
ImGui::TableSetupColumn("Two");
ImGui::TableSetupColumn("Three");
ImGui::TableHeadersRow();
- for (int cell = 0; cell < 9; cell++)
+ const int cell_count = (n == 1) ? 27 : 9; // Make second table have a scrollbar to verify that additional decoration is not affecting column positions.
+ for (int cell = 0; cell < cell_count; cell++)
{
ImGui::TableNextColumn();
ImGui::Text("this cell %d", cell);
@@ -5122,14 +7045,11 @@ static void ShowDemoWindowTables()
ImGui::TableHeadersRow();
// Sort our data if sort specs have been changed!
- if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs())
- if (sorts_specs->SpecsDirty)
+ if (ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs())
+ if (sort_specs->SpecsDirty)
{
- MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function.
- if (items.Size > 1)
- qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs);
- MyItem::s_current_sort_specs = NULL;
- sorts_specs->SpecsDirty = false;
+ MyItem::SortWithSortSpecs(sort_specs, items.Data, items.Size);
+ sort_specs->SpecsDirty = false;
}
// Demonstrate using clipper for large vertical lists
@@ -5172,6 +7092,7 @@ static void ShowDemoWindowTables()
| ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody
| ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY
| ImGuiTableFlags_SizingFixedFit;
+ static ImGuiTableColumnFlags columns_base_flags = ImGuiTableColumnFlags_None;
enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow };
static int contents_type = CT_SelectableSpanRow;
@@ -5265,9 +7186,17 @@ static void ShowDemoWindowTables()
ImGui::TreePop();
}
- if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen))
+ if (ImGui::TreeNodeEx("Headers:", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::Checkbox("show_headers", &show_headers);
+ ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
+ ImGui::CheckboxFlags("ImGuiTableColumnFlags_AngledHeader", &columns_base_flags, ImGuiTableColumnFlags_AngledHeader);
+ ImGui::SameLine(); HelpMarker("Enable AngledHeader on all columns. Best enabled on selected narrow columns (see \"Angled headers\" section of the demo).");
+ ImGui::TreePop();
+ }
+
+ if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen))
+ {
ImGui::Checkbox("show_wrapped_text", &show_wrapped_text);
ImGui::DragFloat2("##OuterSize", &outer_size_value.x);
@@ -5328,24 +7257,22 @@ static void ShowDemoWindowTables()
// Declare columns
// We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications.
// This is so our sort function can identify a column given our own identifier. We could also identify them based on their index!
- ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID);
- ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name);
- ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action);
- ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity);
- ImGui::TableSetupColumn("Description", (flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Description);
- ImGui::TableSetupColumn("Hidden", ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort);
+ ImGui::TableSetupColumn("ID", columns_base_flags | ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID);
+ ImGui::TableSetupColumn("Name", columns_base_flags | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name);
+ ImGui::TableSetupColumn("Action", columns_base_flags | ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action);
+ ImGui::TableSetupColumn("Quantity", columns_base_flags | ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity);
+ ImGui::TableSetupColumn("Description", columns_base_flags | ((flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch), 0.0f, MyItemColumnID_Description);
+ ImGui::TableSetupColumn("Hidden", columns_base_flags | ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort);
ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows);
// Sort our data if sort specs have been changed!
- ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs();
- if (sorts_specs && sorts_specs->SpecsDirty)
+ ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs();
+ if (sort_specs && sort_specs->SpecsDirty)
items_need_sort = true;
- if (sorts_specs && items_need_sort && items.Size > 1)
+ if (sort_specs && items_need_sort && items.Size > 1)
{
- MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function.
- qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs);
- MyItem::s_current_sort_specs = NULL;
- sorts_specs->SpecsDirty = false;
+ MyItem::SortWithSortSpecs(sort_specs, items.Data, items.Size);
+ sort_specs->SpecsDirty = false;
}
items_need_sort = false;
@@ -5354,12 +7281,13 @@ static void ShowDemoWindowTables()
const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0;
// Show headers
+ if (show_headers && (columns_base_flags & ImGuiTableColumnFlags_AngledHeader) != 0)
+ ImGui::TableAngledHeadersRow();
if (show_headers)
ImGui::TableHeadersRow();
// Show data
// FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here?
- ImGui::PushButtonRepeat(true);
#if 1
// Demonstrate using clipper for large vertical lists
ImGuiListClipper clipper;
@@ -5395,7 +7323,7 @@ static void ShowDemoWindowTables()
ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f));
else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow)
{
- ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap : ImGuiSelectableFlags_None;
+ ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap : ImGuiSelectableFlags_None;
if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height)))
{
if (ImGui::GetIO().KeyCtrl)
@@ -5419,7 +7347,7 @@ static void ShowDemoWindowTables()
// Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity,
// and we are currently sorting on the column showing the Quantity.
// To avoid triggering a sort while holding the button, we only trigger it when the button has been released.
- // You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes.
+ // You will probably need some extra logic if you want to automatically sort when a specific entry changes.
if (ImGui::TableSetColumnIndex(2))
{
if (ImGui::SmallButton("Chop")) { item->Quantity += 1; }
@@ -5444,7 +7372,6 @@ static void ShowDemoWindowTables()
ImGui::PopID();
}
}
- ImGui::PopButtonRepeat();
// Store some info to display debug details below
table_scroll_cur = ImVec2(ImGui::GetScrollX(), ImGui::GetScrollY());
@@ -5470,7 +7397,7 @@ static void ShowDemoWindowTables()
ImGui::PopID();
- ShowDemoWindowColumns();
+ DemoWindowColumns();
if (disable_indent)
ImGui::PopStyleVar();
@@ -5478,7 +7405,7 @@ static void ShowDemoWindowTables()
// Demonstrate old/legacy Columns API!
// [2020: Columns are under-featured and not maintained. Prefer using the more flexible and powerful BeginTable() API!]
-static void ShowDemoWindowColumns()
+static void DemoWindowColumns()
{
IMGUI_DEMO_MARKER("Columns (legacy API)");
bool open = ImGui::TreeNode("Legacy Columns API");
@@ -5554,12 +7481,14 @@ static void ShowDemoWindowColumns()
{
if (h_borders && ImGui::GetColumnIndex() == 0)
ImGui::Separator();
+ ImGui::PushID(i);
ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i);
ImGui::Text("Width %.2f", ImGui::GetColumnWidth());
ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x);
ImGui::Text("Offset %.2f", ImGui::GetColumnOffset());
ImGui::Text("Long text that is likely to clip");
ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f));
+ ImGui::PopID();
ImGui::NextColumn();
}
ImGui::Columns(1);
@@ -5621,7 +7550,7 @@ static void ShowDemoWindowColumns()
{
ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f));
ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f);
- ImGui::BeginChild("##ScrollingRegion", child_size, false, ImGuiWindowFlags_HorizontalScrollbar);
+ ImGui::BeginChild("##ScrollingRegion", child_size, ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar);
ImGui::Columns(10);
// Also demonstrate using clipper for large vertical lists
@@ -5682,19 +7611,65 @@ static void ShowDemoWindowColumns()
ImGui::TreePop();
}
-namespace ImGui { extern ImGuiKeyData* GetKeyData(ImGuiKey key); }
+//-----------------------------------------------------------------------------
+// [SECTION] DemoWindowInputs()
+//-----------------------------------------------------------------------------
-static void ShowDemoWindowInputs()
+static void DemoWindowInputs()
{
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus");
- if (ImGui::CollapsingHeader("Inputs, Navigation & Focus"))
+ IMGUI_DEMO_MARKER("Inputs & Focus");
+ if (ImGui::CollapsingHeader("Inputs & Focus"))
{
ImGuiIO& io = ImGui::GetIO();
+ // Display inputs submitted to ImGuiIO
+ IMGUI_DEMO_MARKER("Inputs & Focus/Inputs");
+ ImGui::SetNextItemOpen(true, ImGuiCond_Once);
+ bool inputs_opened = ImGui::TreeNode("Inputs");
+ ImGui::SameLine();
+ HelpMarker(
+ "This is a simplified view. See more detailed input state:\n"
+ "- in 'Tools->Metrics/Debugger->Inputs'.\n"
+ "- in 'Tools->Debug Log->IO'.");
+ if (inputs_opened)
+ {
+ if (ImGui::IsMousePosValid())
+ ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y);
+ else
+ ImGui::Text("Mouse pos: <INVALID>");
+ ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y);
+ ImGui::Text("Mouse down:");
+ for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); }
+ ImGui::Text("Mouse wheel: %.1f", io.MouseWheel);
+ ImGui::Text("Mouse clicked count:");
+ for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (io.MouseClickedCount[i] > 0) { ImGui::SameLine(); ImGui::Text("b%d: %d", i, io.MouseClickedCount[i]); }
+
+ // We iterate both legacy native range and named ImGuiKey ranges. This is a little unusual/odd but this allows
+ // displaying the data for old/new backends.
+ // User code should never have to go through such hoops!
+ // You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END.
+ struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } };
+ ImGuiKey start_key = ImGuiKey_NamedKey_BEGIN;
+ ImGui::Text("Keys down:"); for (ImGuiKey key = start_key; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !ImGui::IsKeyDown(key)) continue; ImGui::SameLine(); ImGui::Text((key < ImGuiKey_NamedKey_BEGIN) ? "\"%s\"" : "\"%s\" %d", ImGui::GetKeyName(key), key); }
+ ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : "");
+ ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public.
+
+ ImGui::TreePop();
+ }
+
// Display ImGuiIO output flags
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Output");
+ IMGUI_DEMO_MARKER("Inputs & Focus/Outputs");
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
- if (ImGui::TreeNode("Output"))
+ bool outputs_opened = ImGui::TreeNode("Outputs");
+ ImGui::SameLine();
+ HelpMarker(
+ "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui "
+ "to instruct your application of how to route inputs. Typically, when a value is true, it means "
+ "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n"
+ "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, "
+ "and underlying application should ignore mouse inputs (in practice there are many and more subtle "
+ "rules leading to how those flags are set).");
+ if (outputs_opened)
{
ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse);
ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
@@ -5702,37 +7677,139 @@ static void ShowDemoWindowInputs()
ImGui::Text("io.WantTextInput: %d", io.WantTextInput);
ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos);
ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible);
+
+ IMGUI_DEMO_MARKER("Inputs & Focus/Outputs/WantCapture override");
+ if (ImGui::TreeNode("WantCapture override"))
+ {
+ HelpMarker(
+ "Hovering the colored canvas will override io.WantCaptureXXX fields.\n"
+ "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering "
+ "and true when clicking.");
+ static int capture_override_mouse = -1;
+ static int capture_override_keyboard = -1;
+ const char* capture_override_desc[] = { "None", "Set to false", "Set to true" };
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
+ ImGui::SliderInt("SetNextFrameWantCaptureMouse() on hover", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp);
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
+ ImGui::SliderInt("SetNextFrameWantCaptureKeyboard() on hover", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp);
+
+ ImGui::ColorButton("##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(128.0f, 96.0f)); // Dummy item
+ if (ImGui::IsItemHovered() && capture_override_mouse != -1)
+ ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1);
+ if (ImGui::IsItemHovered() && capture_override_keyboard != -1)
+ ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1);
+
+ ImGui::TreePop();
+ }
ImGui::TreePop();
}
- // Display Mouse state
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse State");
- if (ImGui::TreeNode("Mouse State"))
- {
- if (ImGui::IsMousePosValid())
- ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y);
- else
- ImGui::Text("Mouse pos: <INVALID>");
- ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y);
+ // Demonstrate using Shortcut() and Routing Policies.
+ // The general flow is:
+ // - Code interested in a chord (e.g. "Ctrl+A") declares their intent.
+ // - Multiple locations may be interested in same chord! Routing helps find a winner.
+ // - Every frame, we resolve all claims and assign one owner if the modifiers are matching.
+ // - The lower-level function is 'bool SetShortcutRouting()', returns true when caller got the route.
+ // - Most of the times, SetShortcutRouting() is not called directly. User mostly calls Shortcut() with routing flags.
+ // - If you call Shortcut() WITHOUT any routing option, it uses ImGuiInputFlags_RouteFocused.
+ // TL;DR: Most uses will simply be:
+ // - Shortcut(ImGuiMod_Ctrl | ImGuiKey_A); // Use ImGuiInputFlags_RouteFocused policy.
+ IMGUI_DEMO_MARKER("Inputs & Focus/Shortcuts");
+ if (ImGui::TreeNode("Shortcuts"))
+ {
+ static ImGuiInputFlags route_options = ImGuiInputFlags_Repeat;
+ static ImGuiInputFlags route_type = ImGuiInputFlags_RouteFocused;
+ ImGui::CheckboxFlags("ImGuiInputFlags_Repeat", &route_options, ImGuiInputFlags_Repeat);
+ ImGui::RadioButton("ImGuiInputFlags_RouteActive", &route_type, ImGuiInputFlags_RouteActive);
+ ImGui::RadioButton("ImGuiInputFlags_RouteFocused (default)", &route_type, ImGuiInputFlags_RouteFocused);
+ ImGui::RadioButton("ImGuiInputFlags_RouteGlobal", &route_type, ImGuiInputFlags_RouteGlobal);
+ ImGui::Indent();
+ ImGui::BeginDisabled(route_type != ImGuiInputFlags_RouteGlobal);
+ ImGui::CheckboxFlags("ImGuiInputFlags_RouteOverFocused", &route_options, ImGuiInputFlags_RouteOverFocused);
+ ImGui::CheckboxFlags("ImGuiInputFlags_RouteOverActive", &route_options, ImGuiInputFlags_RouteOverActive);
+ ImGui::CheckboxFlags("ImGuiInputFlags_RouteUnlessBgFocused", &route_options, ImGuiInputFlags_RouteUnlessBgFocused);
+ ImGui::EndDisabled();
+ ImGui::Unindent();
+ ImGui::RadioButton("ImGuiInputFlags_RouteAlways", &route_type, ImGuiInputFlags_RouteAlways);
+ ImGuiInputFlags flags = route_type | route_options; // Merged flags
+ if (route_type != ImGuiInputFlags_RouteGlobal)
+ flags &= ~(ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused);
+
+ ImGui::SeparatorText("Using SetNextItemShortcut()");
+ ImGui::Text("Ctrl+S");
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_S, flags | ImGuiInputFlags_Tooltip);
+ ImGui::Button("Save");
+ ImGui::Text("Alt+F");
+ ImGui::SetNextItemShortcut(ImGuiMod_Alt | ImGuiKey_F, flags | ImGuiInputFlags_Tooltip);
+ static float f = 0.5f;
+ ImGui::SliderFloat("Factor", &f, 0.0f, 1.0f);
+
+ ImGui::SeparatorText("Using Shortcut()");
+ const float line_height = ImGui::GetTextLineHeightWithSpacing();
+ const ImGuiKeyChord key_chord = ImGuiMod_Ctrl | ImGuiKey_A;
+
+ ImGui::Text("Ctrl+A");
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "...");
+
+ ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 0.0f, 1.0f, 0.1f));
+
+ ImGui::BeginChild("WindowA", ImVec2(-FLT_MIN, line_height * 14), true);
+ ImGui::Text("Press CTRL+A and see who receives it!");
+ ImGui::Separator();
+
+ // 1: Window polling for CTRL+A
+ ImGui::Text("(in WindowA)");
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "...");
+
+ // 2: InputText also polling for CTRL+A: it always uses _RouteFocused internally (gets priority when active)
+ // (Commmented because the owner-aware version of Shortcut() is still in imgui_internal.h)
+ //char str[16] = "Press CTRL+A";
+ //ImGui::Spacing();
+ //ImGui::InputText("InputTextB", str, IM_ARRAYSIZE(str), ImGuiInputTextFlags_ReadOnly);
+ //ImGuiID item_id = ImGui::GetItemID();
+ //ImGui::SameLine(); HelpMarker("Internal widgets always use _RouteFocused");
+ //ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags, item_id) ? "PRESSED" : "...");
+
+ // 3: Dummy child is not claiming the route: focusing them shouldn't steal route away from WindowA
+ ImGui::BeginChild("ChildD", ImVec2(-FLT_MIN, line_height * 4), true);
+ ImGui::Text("(in ChildD: not using same Shortcut)");
+ ImGui::Text("IsWindowFocused: %d", ImGui::IsWindowFocused());
+ ImGui::EndChild();
+
+ // 4: Child window polling for CTRL+A. It is deeper than WindowA and gets priority when focused.
+ ImGui::BeginChild("ChildE", ImVec2(-FLT_MIN, line_height * 4), true);
+ ImGui::Text("(in ChildE: using same Shortcut)");
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "...");
+ ImGui::EndChild();
+
+ // 5: In a popup
+ if (ImGui::Button("Open Popup"))
+ ImGui::OpenPopup("PopupF");
+ if (ImGui::BeginPopup("PopupF"))
+ {
+ ImGui::Text("(in PopupF)");
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "...");
+ // (Commmented because the owner-aware version of Shortcut() is still in imgui_internal.h)
+ //ImGui::InputText("InputTextG", str, IM_ARRAYSIZE(str), ImGuiInputTextFlags_ReadOnly);
+ //ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags, ImGui::GetItemID()) ? "PRESSED" : "...");
+ ImGui::EndPopup();
+ }
+ ImGui::EndChild();
+ ImGui::PopStyleColor();
- int count = IM_ARRAYSIZE(io.MouseDown);
- ImGui::Text("Mouse down:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); }
- ImGui::Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d (%d)", i, ImGui::GetMouseClickedCount(i)); }
- ImGui::Text("Mouse released:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); }
- ImGui::Text("Mouse wheel: %.1f", io.MouseWheel);
- ImGui::Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused
ImGui::TreePop();
}
// Display mouse cursors
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse Cursors");
+ IMGUI_DEMO_MARKER("Inputs & Focus/Mouse Cursors");
if (ImGui::TreeNode("Mouse Cursors"))
{
- const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "NotAllowed" };
+ const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "Wait", "Progress", "NotAllowed" };
IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT);
ImGuiMouseCursor current = ImGui::GetMouseCursor();
- ImGui::Text("Current mouse cursor = %d: %s", current, mouse_cursors_names[current]);
+ const char* cursor_name = (current >= ImGuiMouseCursor_Arrow) && (current < ImGuiMouseCursor_COUNT) ? mouse_cursors_names[current] : "N/A";
+ ImGui::Text("Current mouse cursor = %d: %s", current, cursor_name);
ImGui::BeginDisabled(true);
ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
ImGui::EndDisabled();
@@ -5753,113 +7830,7 @@ static void ShowDemoWindowInputs()
ImGui::TreePop();
}
- // Display Keyboard/Mouse state
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Keyboard, Gamepad & Navigation State");
- if (ImGui::TreeNode("Keyboard, Gamepad & Navigation State"))
- {
- // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allows displaying the data for old/new backends.
- // User code should never have to go through such hoops: old code may use native keycodes, new code may use ImGuiKey codes.
-#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
- struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } };
- const ImGuiKey key_first = (ImGuiKey)ImGuiKey_NamedKey_BEGIN;
-#else
- struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array
- const ImGuiKey key_first = (ImGuiKey)0;
- //ImGui::Text("Legacy raw:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } }
-#endif
- ImGui::Text("Keys down:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyDown(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d (%.02f)", ImGui::GetKeyName(key), key, ImGui::GetKeyData(key)->DownDuration); } }
- ImGui::Text("Keys pressed:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyPressed(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } }
- ImGui::Text("Keys released:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyReleased(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } }
- ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : "");
- ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public.
-
- // Draw an arbitrary US keyboard layout to visualize translated keys
- {
- const ImVec2 key_size = ImVec2(35.0f, 35.0f);
- const float key_rounding = 3.0f;
- const ImVec2 key_face_size = ImVec2(25.0f, 25.0f);
- const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f);
- const float key_face_rounding = 2.0f;
- const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f);
- const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f);
- const float key_row_offset = 9.0f;
-
- ImVec2 board_min = ImGui::GetCursorScreenPos();
- ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f);
- ImVec2 start_pos = ImVec2(board_min.x + 5.0f - key_step.x, board_min.y);
-
- struct KeyLayoutData { int Row, Col; const char* Label; ImGuiKey Key; };
- const KeyLayoutData keys_to_display[] =
- {
- { 0, 0, "", ImGuiKey_Tab }, { 0, 1, "Q", ImGuiKey_Q }, { 0, 2, "W", ImGuiKey_W }, { 0, 3, "E", ImGuiKey_E }, { 0, 4, "R", ImGuiKey_R },
- { 1, 0, "", ImGuiKey_CapsLock }, { 1, 1, "A", ImGuiKey_A }, { 1, 2, "S", ImGuiKey_S }, { 1, 3, "D", ImGuiKey_D }, { 1, 4, "F", ImGuiKey_F },
- { 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V }
- };
-
- // Elements rendered manually via ImDrawList API are not clipped automatically.
- // While not strictly necessary, here IsItemVisible() is used to avoid rendering these shapes when they are out of view.
- ImGui::Dummy(ImVec2(board_max.x - board_min.x, board_max.y - board_min.y));
- if (ImGui::IsItemVisible())
- {
- ImDrawList* draw_list = ImGui::GetWindowDrawList();
- draw_list->PushClipRect(board_min, board_max, true);
- for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++)
- {
- const KeyLayoutData* key_data = &keys_to_display[n];
- ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y);
- ImVec2 key_max = ImVec2(key_min.x + key_size.x, key_min.y + key_size.y);
- draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding);
- draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding);
- ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y);
- ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y);
- draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f);
- draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding);
- ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y);
- draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label);
- if (ImGui::IsKeyDown(key_data->Key))
- draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding);
- }
- draw_list->PopClipRect();
- }
- }
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Capture override"))
- {
- HelpMarker(
- "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui "
- "to instruct your application of how to route inputs. Typically, when a value is true, it means "
- "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n"
- "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, "
- "and underlying application should ignore mouse inputs (in practice there are many and more subtle "
- "rules leading to how those flags are set).");
-
- ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse);
- ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
- ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
-
- HelpMarker(
- "Hovering the colored canvas will override io.WantCaptureXXX fields.\n"
- "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking.");
- static int capture_override_mouse = -1;
- static int capture_override_keyboard = -1;
- const char* capture_override_desc[] = { "None", "Set to false", "Set to true" };
- ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
- ImGui::SliderInt("SetNextFrameWantCaptureMouse()", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp);
- ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
- ImGui::SliderInt("SetNextFrameWantCaptureKeyboard()", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp);
-
- ImGui::ColorButton("##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(256.0f, 192.0f)); // Dummy item
- if (ImGui::IsItemHovered() && capture_override_mouse != -1)
- ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1);
- if (ImGui::IsItemHovered() && capture_override_keyboard != -1)
- ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1);
-
- ImGui::TreePop();
- }
-
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Tabbing");
+ IMGUI_DEMO_MARKER("Inputs & Focus/Tabbing");
if (ImGui::TreeNode("Tabbing"))
{
ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields.");
@@ -5867,15 +7838,15 @@ static void ShowDemoWindowInputs()
ImGui::InputText("1", buf, IM_ARRAYSIZE(buf));
ImGui::InputText("2", buf, IM_ARRAYSIZE(buf));
ImGui::InputText("3", buf, IM_ARRAYSIZE(buf));
- ImGui::PushAllowKeyboardFocus(false);
+ ImGui::PushItemFlag(ImGuiItemFlags_NoTabStop, true);
ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf));
ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab.");
- ImGui::PopAllowKeyboardFocus();
+ ImGui::PopItemFlag();
ImGui::InputText("5", buf, IM_ARRAYSIZE(buf));
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Focus from code");
+ IMGUI_DEMO_MARKER("Inputs & Focus/Focus from code");
if (ImGui::TreeNode("Focus from code"))
{
bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine();
@@ -5892,12 +7863,12 @@ static void ShowDemoWindowInputs()
ImGui::InputText("2", buf, IM_ARRAYSIZE(buf));
if (ImGui::IsItemActive()) has_focus = 2;
- ImGui::PushAllowKeyboardFocus(false);
+ ImGui::PushItemFlag(ImGuiItemFlags_NoTabStop, true);
if (focus_3) ImGui::SetKeyboardFocusHere();
ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf));
if (ImGui::IsItemActive()) has_focus = 3;
ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab.");
- ImGui::PopAllowKeyboardFocus();
+ ImGui::PopItemFlag();
if (has_focus)
ImGui::Text("Item with focus: %d", has_focus);
@@ -5917,7 +7888,7 @@ static void ShowDemoWindowInputs()
ImGui::TreePop();
}
- IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Dragging");
+ IMGUI_DEMO_MARKER("Inputs & Focus/Dragging");
if (ImGui::TreeNode("Dragging"))
{
ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget.");
@@ -5961,10 +7932,23 @@ void ImGui::ShowAboutWindow(bool* p_open)
return;
}
IMGUI_DEMO_MARKER("Tools/About Dear ImGui");
- ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
+ ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
+
+ ImGui::TextLinkOpenURL("Homepage", "https://github.com/ocornut/imgui");
+ ImGui::SameLine();
+ ImGui::TextLinkOpenURL("FAQ", "https://github.com/ocornut/imgui/blob/master/docs/FAQ.md");
+ ImGui::SameLine();
+ ImGui::TextLinkOpenURL("Wiki", "https://github.com/ocornut/imgui/wiki");
+ ImGui::SameLine();
+ ImGui::TextLinkOpenURL("Releases", "https://github.com/ocornut/imgui/releases");
+ ImGui::SameLine();
+ ImGui::TextLinkOpenURL("Funding", "https://github.com/ocornut/imgui/wiki/Funding");
+
ImGui::Separator();
- ImGui::Text("By Omar Cornut and all Dear ImGui contributors.");
+ ImGui::Text("(c) 2014-2025 Omar Cornut");
+ ImGui::Text("Developed by Omar Cornut and all Dear ImGui contributors.");
ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information.");
+ ImGui::Text("If your company uses this, please consider funding the project.");
static bool show_config_info = false;
ImGui::Checkbox("Config/Build Information", &show_config_info);
@@ -5975,7 +7959,7 @@ void ImGui::ShowAboutWindow(bool* p_open)
bool copy_to_clipboard = ImGui::Button("Copy to clipboard");
ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18);
- ImGui::BeginChildFrame(ImGui::GetID("cfg_infos"), child_size, ImGuiWindowFlags_NoMove);
+ ImGui::BeginChild(ImGui::GetID("cfg_infos"), child_size, ImGuiChildFlags_FrameStyle);
if (copy_to_clipboard)
{
ImGui::LogToClipboard();
@@ -5989,9 +7973,6 @@ void ImGui::ShowAboutWindow(bool* p_open)
#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS");
#endif
-#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
- ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_KEYIO");
-#endif
#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS");
#endif
@@ -6001,6 +7982,9 @@ void ImGui::ShowAboutWindow(bool* p_open)
#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS
ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS");
#endif
+#ifdef IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS");
+#endif
#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS");
#endif
@@ -6049,18 +8033,23 @@ void ImGui::ShowAboutWindow(bool* p_open)
#ifdef __clang_version__
ImGui::Text("define: __clang_version__=%s", __clang_version__);
#endif
+#ifdef __EMSCRIPTEN__
+ ImGui::Text("define: __EMSCRIPTEN__");
+ ImGui::Text("Emscripten: %d.%d.%d", __EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__);
+#endif
ImGui::Separator();
ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL");
ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL");
ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags);
if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard");
if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad");
- if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos");
- if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard");
if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse");
if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange");
+ if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard) ImGui::Text(" NoKeyboard");
if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor");
if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors");
+ if (io.ConfigNavMoveSetMousePos) ImGui::Text("io.ConfigNavMoveSetMousePos");
+ if (io.ConfigNavCaptureKeyboard) ImGui::Text("io.ConfigNavCaptureKeyboard");
if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink");
if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges");
if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly");
@@ -6088,7 +8077,7 @@ void ImGui::ShowAboutWindow(bool* p_open)
ImGui::LogText("\n```\n");
ImGui::LogFinish();
}
- ImGui::EndChildFrame();
+ ImGui::EndChild();
}
ImGui::End();
}
@@ -6112,12 +8101,13 @@ void ImGui::ShowFontSelector(const char* label)
ImFont* font_current = ImGui::GetFont();
if (ImGui::BeginCombo(label, font_current->GetDebugName()))
{
- for (int n = 0; n < io.Fonts->Fonts.Size; n++)
+ for (ImFont* font : io.Fonts->Fonts)
{
- ImFont* font = io.Fonts->Fonts[n];
ImGui::PushID((void*)font);
if (ImGui::Selectable(font->GetDebugName(), font == font_current))
io.FontDefault = font;
+ if (font == font_current)
+ ImGui::SetItemDefaultFocus();
ImGui::PopID();
}
ImGui::EndCombo();
@@ -6197,44 +8187,80 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
{
if (ImGui::BeginTabItem("Sizes"))
{
- ImGui::Text("Main");
+ ImGui::SeparatorText("Main");
ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f");
ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f");
ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f");
ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f");
ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f");
ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f");
- ImGui::Text("Borders");
+
+ ImGui::SeparatorText("Borders");
ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f");
ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f");
ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f");
ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f");
- ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f");
- ImGui::Text("Rounding");
+
+ ImGui::SeparatorText("Rounding");
ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f");
ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f");
ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f");
ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f");
ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f");
- ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f");
+
+ ImGui::SeparatorText("Tabs");
+ ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f");
+ ImGui::SliderFloat("TabBarBorderSize", &style.TabBarBorderSize, 0.0f, 2.0f, "%.0f");
+ ImGui::SliderFloat("TabBarOverlineSize", &style.TabBarOverlineSize, 0.0f, 3.0f, "%.0f");
+ ImGui::SameLine(); HelpMarker("Overline is only drawn over the selected tab when ImGuiTabBarFlags_DrawSelectedOverline is set.");
+ ImGui::DragFloat("TabCloseButtonMinWidthSelected", &style.TabCloseButtonMinWidthSelected, 0.1f, -1.0f, 100.0f, (style.TabCloseButtonMinWidthSelected < 0.0f) ? "%.0f (Always)" : "%.0f");
+ ImGui::DragFloat("TabCloseButtonMinWidthUnselected", &style.TabCloseButtonMinWidthUnselected, 0.1f, -1.0f, 100.0f, (style.TabCloseButtonMinWidthUnselected < 0.0f) ? "%.0f (Always)" : "%.0f");
ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f");
- ImGui::Text("Alignment");
+
+ ImGui::SeparatorText("Tables");
+ ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f");
+ ImGui::SliderAngle("TableAngledHeadersAngle", &style.TableAngledHeadersAngle, -50.0f, +50.0f);
+ ImGui::SliderFloat2("TableAngledHeadersTextAlign", (float*)&style.TableAngledHeadersTextAlign, 0.0f, 1.0f, "%.2f");
+
+ ImGui::SeparatorText("Windows");
ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f");
+ ImGui::SliderFloat("WindowBorderHoverPadding", &style.WindowBorderHoverPadding, 1.0f, 20.0f, "%.0f");
int window_menu_button_position = style.WindowMenuButtonPosition + 1;
if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0"))
- style.WindowMenuButtonPosition = window_menu_button_position - 1;
+ style.WindowMenuButtonPosition = (ImGuiDir)(window_menu_button_position - 1);
+
+ ImGui::SeparatorText("Widgets");
ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0");
ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f");
ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content.");
ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f");
ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content.");
- ImGui::Text("Safe Area Padding");
- ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured).");
- ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f");
+ ImGui::SliderFloat("SeparatorTextBorderSize", &style.SeparatorTextBorderSize, 0.0f, 10.0f, "%.0f");
+ ImGui::SliderFloat2("SeparatorTextAlign", (float*)&style.SeparatorTextAlign, 0.0f, 1.0f, "%.2f");
+ ImGui::SliderFloat2("SeparatorTextPadding", (float*)&style.SeparatorTextPadding, 0.0f, 40.0f, "%.0f");
+ ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("ImageBorderSize", &style.ImageBorderSize, 0.0f, 1.0f, "%.0f");
+
+ ImGui::SeparatorText("Tooltips");
+ for (int n = 0; n < 2; n++)
+ if (ImGui::TreeNodeEx(n == 0 ? "HoverFlagsForTooltipMouse" : "HoverFlagsForTooltipNav"))
+ {
+ ImGuiHoveredFlags* p = (n == 0) ? &style.HoverFlagsForTooltipMouse : &style.HoverFlagsForTooltipNav;
+ ImGui::CheckboxFlags("ImGuiHoveredFlags_DelayNone", p, ImGuiHoveredFlags_DelayNone);
+ ImGui::CheckboxFlags("ImGuiHoveredFlags_DelayShort", p, ImGuiHoveredFlags_DelayShort);
+ ImGui::CheckboxFlags("ImGuiHoveredFlags_DelayNormal", p, ImGuiHoveredFlags_DelayNormal);
+ ImGui::CheckboxFlags("ImGuiHoveredFlags_Stationary", p, ImGuiHoveredFlags_Stationary);
+ ImGui::CheckboxFlags("ImGuiHoveredFlags_NoSharedDelay", p, ImGuiHoveredFlags_NoSharedDelay);
+ ImGui::TreePop();
+ }
+
+ ImGui::SeparatorText("Misc");
+ ImGui::SliderFloat2("DisplayWindowPadding", (float*)&style.DisplayWindowPadding, 0.0f, 30.0f, "%.0f"); ImGui::SameLine(); HelpMarker("Apply to regular windows: amount which we enforce to keep visible when moving near edges of your screen.");
+ ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); ImGui::SameLine(); HelpMarker("Apply to every windows, menus, popups, tooltips: amount where we avoid displaying contents. Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured).");
+
ImGui::EndTabItem();
}
@@ -6266,22 +8292,29 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
filter.Draw("Filter colors", ImGui::GetFontSize() * 16);
static ImGuiColorEditFlags alpha_flags = 0;
- if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine();
- if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine();
- if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine();
+ if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_AlphaOpaque)) { alpha_flags = ImGuiColorEditFlags_AlphaOpaque; } ImGui::SameLine();
+ if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine();
+ if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine();
HelpMarker(
"In the color list:\n"
"Left-click on color square to open color picker,\n"
"Right-click to open edit options menu.");
- ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened);
- ImGui::PushItemWidth(-160);
+ ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 10), ImVec2(FLT_MAX, FLT_MAX));
+ ImGui::BeginChild("##colors", ImVec2(0, 0), ImGuiChildFlags_Borders | ImGuiChildFlags_NavFlattened, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar);
+ ImGui::PushItemWidth(ImGui::GetFontSize() * -12);
for (int i = 0; i < ImGuiCol_COUNT; i++)
{
const char* name = ImGui::GetStyleColorName(i);
if (!filter.PassFilter(name))
continue;
ImGui::PushID(i);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ if (ImGui::Button("?"))
+ ImGui::DebugFlashStyleColor((ImGuiCol)i);
+ ImGui::SetItemTooltip("Flash given color to identify places where it is used.");
+ ImGui::SameLine();
+#endif
ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags);
if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0)
{
@@ -6344,14 +8377,15 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
// When editing the "Circle Segment Max Error" value, draw a preview of its effect on auto-tessellated circles.
ImGui::DragFloat("Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp);
- if (ImGui::IsItemActive())
- {
+ const bool show_samples = ImGui::IsItemActive();
+ if (show_samples)
ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos());
- ImGui::BeginTooltip();
- ImGui::TextUnformatted("(R = radius, N = number of segments)");
+ if (show_samples && ImGui::BeginTooltip())
+ {
+ ImGui::TextUnformatted("(R = radius, N = approx number of segments)");
ImGui::Spacing();
ImDrawList* draw_list = ImGui::GetWindowDrawList();
- const float min_widget_width = ImGui::CalcTextSize("N: MMM\nR: MMM").x;
+ const float min_widget_width = ImGui::CalcTextSize("R: MMM\nN: MMM").x;
for (int n = 0; n < 8; n++)
{
const float RAD_MIN = 5.0f;
@@ -6360,6 +8394,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
ImGui::BeginGroup();
+ // N is not always exact here due to how PathArcTo() function work internally
ImGui::Text("R: %.f\nN: %d", rad, draw_list->_CalcCircleAutoSegmentCount(rad));
const float canvas_width = IM_MAX(min_widget_width, rad * 2.0f);
@@ -6382,7 +8417,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
ImGui::EndTooltip();
}
ImGui::SameLine();
- HelpMarker("When drawing circle primitives with \"num_segments == 0\" tesselation will be calculated automatically.");
+ HelpMarker("When drawing circle primitives with \"num_segments == 0\" tessellation will be calculated automatically.");
ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
ImGui::DragFloat("Disabled Alpha", &style.DisabledAlpha, 0.005f, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Additional alpha multiplier for disabled items (multiply over current value of Alpha).");
@@ -6413,12 +8448,12 @@ void ImGui::ShowUserGuide()
ImGui::BulletText("CTRL+Tab to select a window.");
if (io.FontAllowUserScaling)
ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents.");
- ImGui::BulletText("While inputing text:\n");
+ ImGui::BulletText("While inputting text:\n");
ImGui::Indent();
ImGui::BulletText("CTRL+Left/Right to word jump.");
ImGui::BulletText("CTRL+A or double-click to select all.");
ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste.");
- ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo.");
+ ImGui::BulletText("CTRL+Z to undo, CTRL+Y/CTRL+SHIFT+Z to redo.");
ImGui::BulletText("ESCAPE to revert.");
ImGui::Unindent();
ImGui::BulletText("With keyboard navigation enabled:");
@@ -6454,7 +8489,7 @@ static void ShowExampleAppMainMenuBar()
if (ImGui::BeginMenu("Edit"))
{
if (ImGui::MenuItem("Undo", "CTRL+Z")) {}
- if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item
+ if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item
ImGui::Separator();
if (ImGui::MenuItem("Cut", "CTRL+X")) {}
if (ImGui::MenuItem("Copy", "CTRL+C")) {}
@@ -6500,7 +8535,7 @@ static void ShowExampleMenuFile()
{
static bool enabled = true;
ImGui::MenuItem("Enabled", "", &enabled);
- ImGui::BeginChild("child", ImVec2(0, 60), true);
+ ImGui::BeginChild("child", ImVec2(0, 60), ImGuiChildFlags_Borders);
for (int i = 0; i < 10; i++)
ImGui::Text("Scrolling Text %d", i);
ImGui::EndChild();
@@ -6544,6 +8579,7 @@ static void ShowExampleMenuFile()
IM_ASSERT(0);
}
if (ImGui::MenuItem("Checked", NULL, true)) {}
+ ImGui::Separator();
if (ImGui::MenuItem("Quit", "Alt+F4")) {}
}
@@ -6584,19 +8620,19 @@ struct ExampleAppConsole
{
ClearLog();
for (int i = 0; i < History.Size; i++)
- free(History[i]);
+ ImGui::MemFree(History[i]);
}
// Portable helpers
static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; }
static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; }
- static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); }
+ static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = ImGui::MemAlloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); }
static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; }
void ClearLog()
{
for (int i = 0; i < Items.Size; i++)
- free(Items[i]);
+ ImGui::MemFree(Items[i]);
Items.clear();
}
@@ -6657,6 +8693,7 @@ struct ExampleAppConsole
}
// Options, Filter
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_O, ImGuiInputFlags_Tooltip);
if (ImGui::Button("Options"))
ImGui::OpenPopup("Options");
ImGui::SameLine();
@@ -6665,7 +8702,7 @@ struct ExampleAppConsole
// Reserve enough left-over height for 1 separator + 1 input text
const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
- if (ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar))
+ if (ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), ImGuiChildFlags_NavFlattened, ImGuiWindowFlags_HorizontalScrollbar))
{
if (ImGui::BeginPopupContextWindow())
{
@@ -6700,9 +8737,8 @@ struct ExampleAppConsole
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); // Tighten spacing
if (copy_to_clipboard)
ImGui::LogToClipboard();
- for (int i = 0; i < Items.Size; i++)
+ for (const char* item : Items)
{
- const char* item = Items[i];
if (!Filter.PassFilter(item))
continue;
@@ -6763,7 +8799,7 @@ struct ExampleAppConsole
for (int i = History.Size - 1; i >= 0; i--)
if (Stricmp(History[i], command_line) == 0)
{
- free(History[i]);
+ ImGui::MemFree(History[i]);
History.erase(History.begin() + i);
break;
}
@@ -6843,7 +8879,7 @@ struct ExampleAppConsole
else
{
// Multiple matches. Complete as much as we can..
- // So inputing "C"+Tab will complete to "CL" then display "CLEAR" and "CLASSIFY" as matches.
+ // So inputting "C"+Tab will complete to "CL" then display "CLEAR" and "CLASSIFY" as matches.
int match_len = (int)(word_end - word_start);
for (;;)
{
@@ -6977,7 +9013,7 @@ struct ExampleAppLog
ImGui::Separator();
- if (ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar))
+ if (ImGui::BeginChild("scrolling", ImVec2(0, 0), ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar))
{
if (clear)
Clear();
@@ -7087,7 +9123,7 @@ static void ShowExampleAppLayout(bool* p_open)
{
if (ImGui::BeginMenu("File"))
{
- if (ImGui::MenuItem("Close")) *p_open = false;
+ if (ImGui::MenuItem("Close", "Ctrl+W")) { *p_open = false; }
ImGui::EndMenu();
}
ImGui::EndMenuBar();
@@ -7096,7 +9132,7 @@ static void ShowExampleAppLayout(bool* p_open)
// Left
static int selected = 0;
{
- ImGui::BeginChild("left pane", ImVec2(150, 0), true);
+ ImGui::BeginChild("left pane", ImVec2(150, 0), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeX);
for (int i = 0; i < 100; i++)
{
// FIXME: Good candidate to use ImGuiSelectableFlags_SelectOnNav
@@ -7142,56 +9178,138 @@ static void ShowExampleAppLayout(bool* p_open)
//-----------------------------------------------------------------------------
// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor()
//-----------------------------------------------------------------------------
+// Some of the interactions are a bit lack-luster:
+// - We would want pressing validating or leaving the filter to somehow restore focus.
+// - We may want more advanced filtering (child nodes) and clipper support: both will need extra work.
+// - We would want to customize some keyboard interactions to easily keyboard navigate between the tree and the properties.
+//-----------------------------------------------------------------------------
-static void ShowPlaceholderObject(const char* prefix, int uid)
+struct ExampleAppPropertyEditor
{
- // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID.
- ImGui::PushID(uid);
-
- // Text and Tree nodes are less high than framed widgets, using AlignTextToFramePadding() we add vertical spacing to make the tree lines equal high.
- ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0);
- ImGui::AlignTextToFramePadding();
- bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid);
- ImGui::TableSetColumnIndex(1);
- ImGui::Text("my sailor is rich");
+ ImGuiTextFilter Filter;
+ ExampleTreeNode* VisibleNode = NULL;
- if (node_open)
+ void Draw(ExampleTreeNode* root_node)
{
- static float placeholder_members[8] = { 0.0f, 0.0f, 1.0f, 3.1416f, 100.0f, 999.0f };
- for (int i = 0; i < 8; i++)
+ // Left side: draw tree
+ // - Currently using a table to benefit from RowBg feature
+ if (ImGui::BeginChild("##tree", ImVec2(300, 0), ImGuiChildFlags_ResizeX | ImGuiChildFlags_Borders | ImGuiChildFlags_NavFlattened))
{
- ImGui::PushID(i); // Use field index as identifier.
- if (i < 2)
+ ImGui::SetNextItemWidth(-FLT_MIN);
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_F, ImGuiInputFlags_Tooltip);
+ ImGui::PushItemFlag(ImGuiItemFlags_NoNavDefaultFocus, true);
+ if (ImGui::InputTextWithHint("##Filter", "incl,-excl", Filter.InputBuf, IM_ARRAYSIZE(Filter.InputBuf), ImGuiInputTextFlags_EscapeClearsAll))
+ Filter.Build();
+ ImGui::PopItemFlag();
+
+ if (ImGui::BeginTable("##bg", 1, ImGuiTableFlags_RowBg))
{
- ShowPlaceholderObject("Child", 424242);
+ for (ExampleTreeNode* node : root_node->Childs)
+ if (Filter.PassFilter(node->Name)) // Filter root node
+ DrawTreeNode(node);
+ ImGui::EndTable();
}
- else
- {
- // Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well)
- ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0);
- ImGui::AlignTextToFramePadding();
- ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet;
- ImGui::TreeNodeEx("Field", flags, "Field_%d", i);
+ }
+ ImGui::EndChild();
- ImGui::TableSetColumnIndex(1);
- ImGui::SetNextItemWidth(-FLT_MIN);
- if (i >= 5)
- ImGui::InputFloat("##value", &placeholder_members[i], 1.0f);
- else
- ImGui::DragFloat("##value", &placeholder_members[i], 0.01f);
- ImGui::NextColumn();
+ // Right side: draw properties
+ ImGui::SameLine();
+
+ ImGui::BeginGroup(); // Lock X position
+ if (ExampleTreeNode* node = VisibleNode)
+ {
+ ImGui::Text("%s", node->Name);
+ ImGui::TextDisabled("UID: 0x%08X", node->UID);
+ ImGui::Separator();
+ if (ImGui::BeginTable("##properties", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_ScrollY))
+ {
+ // Push object ID after we entered the table, so table is shared for all objects
+ ImGui::PushID((int)node->UID);
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed);
+ ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 2.0f); // Default twice larger
+ if (node->HasData)
+ {
+ // In a typical application, the structure description would be derived from a data-driven system.
+ // - We try to mimic this with our ExampleMemberInfo structure and the ExampleTreeNodeMemberInfos[] array.
+ // - Limits and some details are hard-coded to simplify the demo.
+ for (const ExampleMemberInfo& field_desc : ExampleTreeNodeMemberInfos)
+ {
+ ImGui::TableNextRow();
+ ImGui::PushID(field_desc.Name);
+ ImGui::TableNextColumn();
+ ImGui::AlignTextToFramePadding();
+ ImGui::TextUnformatted(field_desc.Name);
+ ImGui::TableNextColumn();
+ void* field_ptr = (void*)(((unsigned char*)node) + field_desc.Offset);
+ switch (field_desc.DataType)
+ {
+ case ImGuiDataType_Bool:
+ {
+ IM_ASSERT(field_desc.DataCount == 1);
+ ImGui::Checkbox("##Editor", (bool*)field_ptr);
+ break;
+ }
+ case ImGuiDataType_S32:
+ {
+ int v_min = INT_MIN, v_max = INT_MAX;
+ ImGui::SetNextItemWidth(-FLT_MIN);
+ ImGui::DragScalarN("##Editor", field_desc.DataType, field_ptr, field_desc.DataCount, 1.0f, &v_min, &v_max);
+ break;
+ }
+ case ImGuiDataType_Float:
+ {
+ float v_min = 0.0f, v_max = 1.0f;
+ ImGui::SetNextItemWidth(-FLT_MIN);
+ ImGui::SliderScalarN("##Editor", field_desc.DataType, field_ptr, field_desc.DataCount, &v_min, &v_max);
+ break;
+ }
+ case ImGuiDataType_String:
+ {
+ ImGui::InputText("##Editor", reinterpret_cast<char*>(field_ptr), 28);
+ break;
+ }
+ }
+ ImGui::PopID();
+ }
+ }
+ ImGui::PopID();
+ ImGui::EndTable();
}
- ImGui::PopID();
}
- ImGui::TreePop();
+ ImGui::EndGroup();
}
- ImGui::PopID();
-}
-// Demonstrate create a simple property editor.
-static void ShowExampleAppPropertyEditor(bool* p_open)
+ void DrawTreeNode(ExampleTreeNode* node)
+ {
+ ImGui::TableNextRow();
+ ImGui::TableNextColumn();
+ ImGui::PushID(node->UID);
+ ImGuiTreeNodeFlags tree_flags = ImGuiTreeNodeFlags_None;
+ tree_flags |= ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick; // Standard opening mode as we are likely to want to add selection afterwards
+ tree_flags |= ImGuiTreeNodeFlags_NavLeftJumpsBackHere; // Left arrow support
+ if (node == VisibleNode)
+ tree_flags |= ImGuiTreeNodeFlags_Selected;
+ if (node->Childs.Size == 0)
+ tree_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet;
+ if (node->DataMyBool == false)
+ ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]);
+ bool node_open = ImGui::TreeNodeEx("", tree_flags, "%s", node->Name);
+ if (node->DataMyBool == false)
+ ImGui::PopStyleColor();
+ if (ImGui::IsItemFocused())
+ VisibleNode = node;
+ if (node_open)
+ {
+ for (ExampleTreeNode* child : node->Childs)
+ DrawTreeNode(child);
+ ImGui::TreePop();
+ }
+ ImGui::PopID();
+ }
+};
+
+// Demonstrate creating a simple property editor.
+static void ShowExampleAppPropertyEditor(bool* p_open, ImGuiDemoWindowData* demo_data)
{
ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver);
if (!ImGui::Begin("Example: Property editor", p_open))
@@ -7199,26 +9317,13 @@ static void ShowExampleAppPropertyEditor(bool* p_open)
ImGui::End();
return;
}
- IMGUI_DEMO_MARKER("Examples/Property Editor");
- HelpMarker(
- "This example shows how you may implement a property editor using two columns.\n"
- "All objects/fields data are dummies here.\n"
- "Remember that in many simple cases, you can use ImGui::SameLine(xxx) to position\n"
- "your cursor horizontally instead of using the Columns() API.");
+ IMGUI_DEMO_MARKER("Examples/Property Editor");
+ static ExampleAppPropertyEditor property_editor;
+ if (demo_data->DemoTree == NULL)
+ demo_data->DemoTree = ExampleTree_CreateDemoTree();
+ property_editor.Draw(demo_data->DemoTree);
- ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 2));
- if (ImGui::BeginTable("split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable))
- {
- // Iterate placeholder objects (all the same data)
- for (int obj_i = 0; obj_i < 4; obj_i++)
- {
- ShowPlaceholderObject("Object", obj_i);
- //ImGui::Separator();
- }
- ImGui::EndTable();
- }
- ImGui::PopStyleVar();
ImGui::End();
}
@@ -7322,18 +9427,31 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
{
// Helper functions to demonstrate programmatic constraints
// FIXME: This doesn't take account of decoration size (e.g. title bar), library should make this easier.
- static void AspectRatio(ImGuiSizeCallbackData* data) { float aspect_ratio = *(float*)data->UserData; data->DesiredSize.x = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); data->DesiredSize.y = (float)(int)(data->DesiredSize.x / aspect_ratio); }
- static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); }
- static void Step(ImGuiSizeCallbackData* data) { float step = *(float*)data->UserData; data->DesiredSize = ImVec2((int)(data->CurrentSize.x / step + 0.5f) * step, (int)(data->CurrentSize.y / step + 0.5f) * step); }
+ // FIXME: None of the three demos works consistently when resizing from borders.
+ static void AspectRatio(ImGuiSizeCallbackData* data)
+ {
+ float aspect_ratio = *(float*)data->UserData;
+ data->DesiredSize.y = (float)(int)(data->DesiredSize.x / aspect_ratio);
+ }
+ static void Square(ImGuiSizeCallbackData* data)
+ {
+ data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->DesiredSize.x, data->DesiredSize.y);
+ }
+ static void Step(ImGuiSizeCallbackData* data)
+ {
+ float step = *(float*)data->UserData;
+ data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step);
+ }
};
const char* test_desc[] =
{
"Between 100x100 and 500x500",
"At least 100x100",
- "Resize vertical only",
- "Resize horizontal only",
+ "Resize vertical + lock current width",
+ "Resize horizontal + lock current height",
"Width Between 400 and 500",
+ "Height at least 400",
"Custom: Aspect Ratio 16:9",
"Custom: Always Square",
"Custom: Fixed Steps (100)",
@@ -7342,7 +9460,7 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
// Options
static bool auto_resize = false;
static bool window_padding = true;
- static int type = 5; // Aspect Ratio
+ static int type = 6; // Aspect Ratio
static int display_lines = 10;
// Submit constraint
@@ -7350,12 +9468,13 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
float fixed_step = 100.0f;
if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(500, 500)); // Between 100x100 and 500x500
if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100
- if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only
- if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only
+ if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Resize vertical + lock current width
+ if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Resize horizontal + lock current height
if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width Between and 400 and 500
- if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio
- if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
- if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step
+ if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, FLT_MAX)); // Height at least 400
+ if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio
+ if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
+ if (type == 8) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step
// Submit window
if (!window_padding)
@@ -7462,7 +9581,7 @@ static void ShowExampleAppFullscreen(bool* p_open)
static ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings;
// We demonstrate using the full viewport area or the work area (without menu-bars, task-bars etc.)
- // Based on your use case you may want one of the other.
+ // Based on your use case you may want one or the other.
const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(use_work_area ? viewport->WorkPos : viewport->Pos);
ImGui::SetNextWindowSize(use_work_area ? viewport->WorkSize : viewport->Size);
@@ -7527,6 +9646,14 @@ static void ShowExampleAppWindowTitles(bool*)
// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering()
//-----------------------------------------------------------------------------
+// Add a |_| looking shape
+static void PathConcaveShape(ImDrawList* draw_list, float x, float y, float sz)
+{
+ const ImVec2 pos_norms[] = { { 0.0f, 0.0f }, { 0.3f, 0.0f }, { 0.3f, 0.7f }, { 0.7f, 0.7f }, { 0.7f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f }, { 0.0f, 1.0f } };
+ for (const ImVec2& p : pos_norms)
+ draw_list->PathLineTo(ImVec2(x + 0.5f + (int)(sz * p.x), y + 0.5f + (int)(sz * p.y)));
+}
+
// Demonstrate using the low-level ImDrawList to draw custom shapes.
static void ShowExampleAppCustomRendering(bool* p_open)
{
@@ -7599,6 +9726,9 @@ static void ShowExampleAppCustomRendering(bool* p_open)
const float rounding = sz / 5.0f;
const int circle_segments = circle_segments_override ? circle_segments_override_v : 0;
const int curve_segments = curve_segments_override ? curve_segments_override_v : 0;
+ const ImVec2 cp3[3] = { ImVec2(0.0f, sz * 0.6f), ImVec2(sz * 0.5f, -sz * 0.4f), ImVec2(sz, sz) }; // Control points for curves
+ const ImVec2 cp4[4] = { ImVec2(0.0f, 0.0f), ImVec2(sz * 1.3f, sz * 0.3f), ImVec2(sz - sz * 1.3f, sz - sz * 0.3f), ImVec2(sz, sz) };
+
float x = p.x + 4.0f;
float y = p.y + 4.0f;
for (int n = 0; n < 2; n++)
@@ -7607,39 +9737,63 @@ static void ShowExampleAppCustomRendering(bool* p_open)
float th = (n == 0) ? 1.0f : thickness;
draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon
draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle
+ draw_list->AddEllipse(ImVec2(x + sz*0.5f, y + sz*0.5f), ImVec2(sz*0.5f, sz*0.3f), col, -0.3f, circle_segments, th); x += sz + spacing; // Ellipse
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners
draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle
//draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle
+ PathConcaveShape(draw_list, x, y, sz); draw_list->PathStroke(col, ImDrawFlags_Closed, th); x += sz + spacing; // Concave Shape
+ //draw_list->AddPolyline(concave_shape, IM_ARRAYSIZE(concave_shape), col, ImDrawFlags_Closed, th);
draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!)
draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!)
draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line
+ // Path
+ draw_list->PathArcTo(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, 3.141592f, 3.141592f * -0.5f);
+ draw_list->PathStroke(col, ImDrawFlags_None, th);
+ x += sz + spacing;
+
// Quadratic Bezier Curve (3 control points)
- ImVec2 cp3[3] = { ImVec2(x, y + sz * 0.6f), ImVec2(x + sz * 0.5f, y - sz * 0.4f), ImVec2(x + sz, y + sz) };
- draw_list->AddBezierQuadratic(cp3[0], cp3[1], cp3[2], col, th, curve_segments); x += sz + spacing;
+ draw_list->AddBezierQuadratic(ImVec2(x + cp3[0].x, y + cp3[0].y), ImVec2(x + cp3[1].x, y + cp3[1].y), ImVec2(x + cp3[2].x, y + cp3[2].y), col, th, curve_segments);
+ x += sz + spacing;
// Cubic Bezier Curve (4 control points)
- ImVec2 cp4[4] = { ImVec2(x, y), ImVec2(x + sz * 1.3f, y + sz * 0.3f), ImVec2(x + sz - sz * 1.3f, y + sz - sz * 0.3f), ImVec2(x + sz, y + sz) };
- draw_list->AddBezierCubic(cp4[0], cp4[1], cp4[2], cp4[3], col, th, curve_segments);
+ draw_list->AddBezierCubic(ImVec2(x + cp4[0].x, y + cp4[0].y), ImVec2(x + cp4[1].x, y + cp4[1].y), ImVec2(x + cp4[2].x, y + cp4[2].y), ImVec2(x + cp4[3].x, y + cp4[3].y), col, th, curve_segments);
x = p.x + 4;
y += sz + spacing;
}
- draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon
- draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments); x += sz + spacing; // Circle
+
+ // Filled shapes
+ draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, ngon_sides); x += sz + spacing; // N-gon
+ draw_list->AddCircleFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, circle_segments); x += sz + spacing; // Circle
+ draw_list->AddEllipseFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), ImVec2(sz * 0.5f, sz * 0.3f), col, -0.3f, circle_segments); x += sz + spacing;// Ellipse
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners
draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle
//draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle
+ PathConcaveShape(draw_list, x, y, sz); draw_list->PathFillConcave(col); x += sz + spacing; // Concave shape
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness)
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness)
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine)
+
+ // Path
+ draw_list->PathArcTo(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, 3.141592f * -0.5f, 3.141592f);
+ draw_list->PathFillConvex(col);
+ x += sz + spacing;
+
+ // Quadratic Bezier Curve (3 control points)
+ draw_list->PathLineTo(ImVec2(x + cp3[0].x, y + cp3[0].y));
+ draw_list->PathBezierQuadraticCurveTo(ImVec2(x + cp3[1].x, y + cp3[1].y), ImVec2(x + cp3[2].x, y + cp3[2].y), curve_segments);
+ draw_list->PathFillConvex(col);
+ x += sz + spacing;
+
draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255));
+ x += sz + spacing;
- ImGui::Dummy(ImVec2((sz + spacing) * 10.2f, (sz + spacing) * 3.0f));
+ ImGui::Dummy(ImVec2((sz + spacing) * 13.2f, (sz + spacing) * 3.0f));
ImGui::PopItemWidth();
ImGui::EndTabItem();
}
@@ -7661,7 +9815,7 @@ static void ShowExampleAppCustomRendering(bool* p_open)
// To use a child window instead we could use, e.g:
// ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Disable padding
// ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(50, 50, 50, 255)); // Set a background color
- // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_NoMove);
+ // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), ImGuiChildFlags_Borders, ImGuiWindowFlags_NoMove);
// ImGui::PopStyleColor();
// ImGui::PopStyleVar();
// [...]
@@ -7759,6 +9913,43 @@ static void ShowExampleAppCustomRendering(bool* p_open)
ImGui::EndTabItem();
}
+ // Demonstrate out-of-order rendering via channels splitting
+ // We use functions in ImDrawList as each draw list contains a convenience splitter,
+ // but you can also instantiate your own ImDrawListSplitter if you need to nest them.
+ if (ImGui::BeginTabItem("Draw Channels"))
+ {
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+ {
+ ImGui::Text("Blue shape is drawn first: appears in back");
+ ImGui::Text("Red shape is drawn after: appears in front");
+ ImVec2 p0 = ImGui::GetCursorScreenPos();
+ draw_list->AddRectFilled(ImVec2(p0.x, p0.y), ImVec2(p0.x + 50, p0.y + 50), IM_COL32(0, 0, 255, 255)); // Blue
+ draw_list->AddRectFilled(ImVec2(p0.x + 25, p0.y + 25), ImVec2(p0.x + 75, p0.y + 75), IM_COL32(255, 0, 0, 255)); // Red
+ ImGui::Dummy(ImVec2(75, 75));
+ }
+ ImGui::Separator();
+ {
+ ImGui::Text("Blue shape is drawn first, into channel 1: appears in front");
+ ImGui::Text("Red shape is drawn after, into channel 0: appears in back");
+ ImVec2 p1 = ImGui::GetCursorScreenPos();
+
+ // Create 2 channels and draw a Blue shape THEN a Red shape.
+ // You can create any number of channels. Tables API use 1 channel per column in order to better batch draw calls.
+ draw_list->ChannelsSplit(2);
+ draw_list->ChannelsSetCurrent(1);
+ draw_list->AddRectFilled(ImVec2(p1.x, p1.y), ImVec2(p1.x + 50, p1.y + 50), IM_COL32(0, 0, 255, 255)); // Blue
+ draw_list->ChannelsSetCurrent(0);
+ draw_list->AddRectFilled(ImVec2(p1.x + 25, p1.y + 25), ImVec2(p1.x + 75, p1.y + 75), IM_COL32(255, 0, 0, 255)); // Red
+
+ // Flatten/reorder channels. Red shape is in channel 0 and it appears below the Blue shape in channel 1.
+ // This works by copying draw indices only (vertices are not copied).
+ draw_list->ChannelsMerge();
+ ImGui::Dummy(ImVec2(75, 75));
+ ImGui::Text("After reordering, contents of channel 0 appears below channel 1.");
+ }
+ ImGui::EndTabItem();
+ }
+
ImGui::EndTabBar();
}
@@ -7772,93 +9963,119 @@ static void ShowExampleAppCustomRendering(bool* p_open)
// Simplified structure to mimic a Document model
struct MyDocument
{
- const char* Name; // Document title
+ char Name[32]; // Document title
+ int UID; // Unique ID (necessary as we can change title)
bool Open; // Set when open (we keep an array of all available documents to simplify demo code!)
bool OpenPrev; // Copy of Open from last update.
bool Dirty; // Set when the document has been modified
- bool WantClose; // Set when the document
ImVec4 Color; // An arbitrary variable associated to the document
- MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f))
+ MyDocument(int uid, const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f))
{
- Name = name;
+ UID = uid;
+ snprintf(Name, sizeof(Name), "%s", name);
Open = OpenPrev = open;
Dirty = false;
- WantClose = false;
Color = color;
}
void DoOpen() { Open = true; }
- void DoQueueClose() { WantClose = true; }
void DoForceClose() { Open = false; Dirty = false; }
void DoSave() { Dirty = false; }
+};
+
+struct ExampleAppDocuments
+{
+ ImVector<MyDocument> Documents;
+ ImVector<MyDocument*> CloseQueue;
+ MyDocument* RenamingDoc = NULL;
+ bool RenamingStarted = false;
+
+ ExampleAppDocuments()
+ {
+ Documents.push_back(MyDocument(0, "Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f)));
+ Documents.push_back(MyDocument(1, "Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f)));
+ Documents.push_back(MyDocument(2, "Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f)));
+ Documents.push_back(MyDocument(3, "Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f)));
+ Documents.push_back(MyDocument(4, "A Rather Long Title", false, ImVec4(0.4f, 0.8f, 0.8f, 1.0f)));
+ Documents.push_back(MyDocument(5, "Some Document", false, ImVec4(0.8f, 0.8f, 1.0f, 1.0f)));
+ }
+
+ // As we allow to change document name, we append a never-changing document ID so tabs are stable
+ void GetTabName(MyDocument* doc, char* out_buf, size_t out_buf_size)
+ {
+ snprintf(out_buf, out_buf_size, "%s###doc%d", doc->Name, doc->UID);
+ }
// Display placeholder contents for the Document
- static void DisplayContents(MyDocument* doc)
+ void DisplayDocContents(MyDocument* doc)
{
ImGui::PushID(doc);
ImGui::Text("Document \"%s\"", doc->Name);
ImGui::PushStyleColor(ImGuiCol_Text, doc->Color);
ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
ImGui::PopStyleColor();
- if (ImGui::Button("Modify", ImVec2(100, 0)))
+
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_R, ImGuiInputFlags_Tooltip);
+ if (ImGui::Button("Rename.."))
+ {
+ RenamingDoc = doc;
+ RenamingStarted = true;
+ }
+ ImGui::SameLine();
+
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_M, ImGuiInputFlags_Tooltip);
+ if (ImGui::Button("Modify"))
doc->Dirty = true;
+
ImGui::SameLine();
- if (ImGui::Button("Save", ImVec2(100, 0)))
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_S, ImGuiInputFlags_Tooltip);
+ if (ImGui::Button("Save"))
doc->DoSave();
+
+ ImGui::SameLine();
+ ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_W, ImGuiInputFlags_Tooltip);
+ if (ImGui::Button("Close"))
+ CloseQueue.push_back(doc);
ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior.
ImGui::PopID();
}
// Display context menu for the Document
- static void DisplayContextMenu(MyDocument* doc)
+ void DisplayDocContextMenu(MyDocument* doc)
{
if (!ImGui::BeginPopupContextItem())
return;
char buf[256];
sprintf(buf, "Save %s", doc->Name);
- if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open))
+ if (ImGui::MenuItem(buf, "Ctrl+S", false, doc->Open))
doc->DoSave();
- if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open))
- doc->DoQueueClose();
+ if (ImGui::MenuItem("Rename...", "Ctrl+R", false, doc->Open))
+ RenamingDoc = doc;
+ if (ImGui::MenuItem("Close", "Ctrl+W", false, doc->Open))
+ CloseQueue.push_back(doc);
ImGui::EndPopup();
}
-};
-struct ExampleAppDocuments
-{
- ImVector<MyDocument> Documents;
-
- ExampleAppDocuments()
+ // [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface.
+ // If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo,
+ // as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for
+ // the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has
+ // disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively
+ // give the impression of a flicker for one frame.
+ // We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch.
+ // Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag.
+ void NotifyOfDocumentsClosedElsewhere()
{
- Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f)));
- Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f)));
- Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f)));
- Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f)));
- Documents.push_back(MyDocument("A Rather Long Title", false));
- Documents.push_back(MyDocument("Some Document", false));
+ for (MyDocument& doc : Documents)
+ {
+ if (!doc.Open && doc.OpenPrev)
+ ImGui::SetTabItemClosed(doc.Name);
+ doc.OpenPrev = doc.Open;
+ }
}
};
-// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface.
-// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo,
-// as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for
-// the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has
-// disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively
-// give the impression of a flicker for one frame.
-// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch.
-// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag.
-static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app)
-{
- for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
- {
- MyDocument* doc = &app.Documents[doc_n];
- if (!doc->Open && doc->OpenPrev)
- ImGui::SetTabItemClosed(doc->Name);
- doc->OpenPrev = doc->Open;
- }
-}
-
void ShowExampleAppDocuments(bool* p_open)
{
static ExampleAppDocuments app;
@@ -7880,24 +10097,20 @@ void ShowExampleAppDocuments(bool* p_open)
if (ImGui::BeginMenu("File"))
{
int open_count = 0;
- for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
- open_count += app.Documents[doc_n].Open ? 1 : 0;
+ for (MyDocument& doc : app.Documents)
+ open_count += doc.Open ? 1 : 0;
if (ImGui::BeginMenu("Open", open_count < app.Documents.Size))
{
- for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
- {
- MyDocument* doc = &app.Documents[doc_n];
- if (!doc->Open)
- if (ImGui::MenuItem(doc->Name))
- doc->DoOpen();
- }
+ for (MyDocument& doc : app.Documents)
+ if (!doc.Open && ImGui::MenuItem(doc.Name))
+ doc.DoOpen();
ImGui::EndMenu();
}
if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0))
- for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
- app.Documents[doc_n].DoQueueClose();
- if (ImGui::MenuItem("Exit", "Ctrl+F4") && p_open)
+ for (MyDocument& doc : app.Documents)
+ app.CloseQueue.push_back(&doc);
+ if (ImGui::MenuItem("Exit") && p_open)
*p_open = false;
ImGui::EndMenu();
}
@@ -7907,13 +10120,13 @@ void ShowExampleAppDocuments(bool* p_open)
// [Debug] List documents with one checkbox for each
for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
{
- MyDocument* doc = &app.Documents[doc_n];
+ MyDocument& doc = app.Documents[doc_n];
if (doc_n > 0)
ImGui::SameLine();
- ImGui::PushID(doc);
- if (ImGui::Checkbox(doc->Name, &doc->Open))
- if (!doc->Open)
- doc->DoForceClose();
+ ImGui::PushID(&doc);
+ if (ImGui::Checkbox(doc.Name, &doc.Open))
+ if (!doc.Open)
+ doc.DoForceClose();
ImGui::PopID();
}
@@ -7932,36 +10145,39 @@ void ShowExampleAppDocuments(bool* p_open)
// Submit Tab Bar and Tabs
{
ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0);
+ tab_bar_flags |= ImGuiTabBarFlags_DrawSelectedOverline;
if (ImGui::BeginTabBar("##tabs", tab_bar_flags))
{
if (opt_reorderable)
- NotifyOfDocumentsClosedElsewhere(app);
+ app.NotifyOfDocumentsClosedElsewhere();
// [DEBUG] Stress tests
//if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on.
//if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway..
// Submit Tabs
- for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ for (MyDocument& doc : app.Documents)
{
- MyDocument* doc = &app.Documents[doc_n];
- if (!doc->Open)
+ if (!doc.Open)
continue;
- ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0);
- bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags);
+ // As we allow to change document name, we append a never-changing document id so tabs are stable
+ char doc_name_buf[64];
+ app.GetTabName(&doc, doc_name_buf, sizeof(doc_name_buf));
+ ImGuiTabItemFlags tab_flags = (doc.Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0);
+ bool visible = ImGui::BeginTabItem(doc_name_buf, &doc.Open, tab_flags);
// Cancel attempt to close when unsaved add to save queue so we can display a popup.
- if (!doc->Open && doc->Dirty)
+ if (!doc.Open && doc.Dirty)
{
- doc->Open = true;
- doc->DoQueueClose();
+ doc.Open = true;
+ app.CloseQueue.push_back(&doc);
}
- MyDocument::DisplayContextMenu(doc);
+ app.DisplayDocContextMenu(&doc);
if (visible)
{
- MyDocument::DisplayContents(doc);
+ app.DisplayDocContents(&doc);
ImGui::EndTabItem();
}
}
@@ -7970,36 +10186,44 @@ void ShowExampleAppDocuments(bool* p_open)
}
}
- // Update closing queue
- static ImVector<MyDocument*> close_queue;
- if (close_queue.empty())
+ // Display renaming UI
+ if (app.RenamingDoc != NULL)
{
- // Close queue is locked once we started a popup
- for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ if (app.RenamingStarted)
+ ImGui::OpenPopup("Rename");
+ if (ImGui::BeginPopup("Rename"))
{
- MyDocument* doc = &app.Documents[doc_n];
- if (doc->WantClose)
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 30);
+ if (ImGui::InputText("###Name", app.RenamingDoc->Name, IM_ARRAYSIZE(app.RenamingDoc->Name), ImGuiInputTextFlags_EnterReturnsTrue))
{
- doc->WantClose = false;
- close_queue.push_back(doc);
+ ImGui::CloseCurrentPopup();
+ app.RenamingDoc = NULL;
}
+ if (app.RenamingStarted)
+ ImGui::SetKeyboardFocusHere(-1);
+ ImGui::EndPopup();
}
+ else
+ {
+ app.RenamingDoc = NULL;
+ }
+ app.RenamingStarted = false;
}
// Display closing confirmation UI
- if (!close_queue.empty())
+ if (!app.CloseQueue.empty())
{
int close_queue_unsaved_documents = 0;
- for (int n = 0; n < close_queue.Size; n++)
- if (close_queue[n]->Dirty)
+ for (int n = 0; n < app.CloseQueue.Size; n++)
+ if (app.CloseQueue[n]->Dirty)
close_queue_unsaved_documents++;
if (close_queue_unsaved_documents == 0)
{
// Close documents when all are unsaved
- for (int n = 0; n < close_queue.Size; n++)
- close_queue[n]->DoForceClose();
- close_queue.clear();
+ for (int n = 0; n < app.CloseQueue.Size; n++)
+ app.CloseQueue[n]->DoForceClose();
+ app.CloseQueue.clear();
}
else
{
@@ -8009,38 +10233,36 @@ void ShowExampleAppDocuments(bool* p_open)
{
ImGui::Text("Save change to the following items?");
float item_height = ImGui::GetTextLineHeightWithSpacing();
- if (ImGui::BeginChildFrame(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height)))
- {
- for (int n = 0; n < close_queue.Size; n++)
- if (close_queue[n]->Dirty)
- ImGui::Text("%s", close_queue[n]->Name);
- ImGui::EndChildFrame();
- }
+ if (ImGui::BeginChild(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height), ImGuiChildFlags_FrameStyle))
+ for (MyDocument* doc : app.CloseQueue)
+ if (doc->Dirty)
+ ImGui::Text("%s", doc->Name);
+ ImGui::EndChild();
ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f);
if (ImGui::Button("Yes", button_size))
{
- for (int n = 0; n < close_queue.Size; n++)
+ for (MyDocument* doc : app.CloseQueue)
{
- if (close_queue[n]->Dirty)
- close_queue[n]->DoSave();
- close_queue[n]->DoForceClose();
+ if (doc->Dirty)
+ doc->DoSave();
+ doc->DoForceClose();
}
- close_queue.clear();
+ app.CloseQueue.clear();
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
if (ImGui::Button("No", button_size))
{
- for (int n = 0; n < close_queue.Size; n++)
- close_queue[n]->DoForceClose();
- close_queue.clear();
+ for (MyDocument* doc : app.CloseQueue)
+ doc->DoForceClose();
+ app.CloseQueue.clear();
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
if (ImGui::Button("Cancel", button_size))
{
- close_queue.clear();
+ app.CloseQueue.clear();
ImGui::CloseCurrentPopup();
}
ImGui::EndPopup();
@@ -8051,6 +10273,404 @@ void ShowExampleAppDocuments(bool* p_open)
ImGui::End();
}
+//-----------------------------------------------------------------------------
+// [SECTION] Example App: Assets Browser / ShowExampleAppAssetsBrowser()
+//-----------------------------------------------------------------------------
+
+//#include "imgui_internal.h" // NavMoveRequestTryWrapping()
+
+struct ExampleAsset
+{
+ ImGuiID ID;
+ int Type;
+
+ ExampleAsset(ImGuiID id, int type) { ID = id; Type = type; }
+
+ static const ImGuiTableSortSpecs* s_current_sort_specs;
+
+ static void SortWithSortSpecs(ImGuiTableSortSpecs* sort_specs, ExampleAsset* items, int items_count)
+ {
+ s_current_sort_specs = sort_specs; // Store in variable accessible by the sort function.
+ if (items_count > 1)
+ qsort(items, (size_t)items_count, sizeof(items[0]), ExampleAsset::CompareWithSortSpecs);
+ s_current_sort_specs = NULL;
+ }
+
+ // Compare function to be used by qsort()
+ static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs)
+ {
+ const ExampleAsset* a = (const ExampleAsset*)lhs;
+ const ExampleAsset* b = (const ExampleAsset*)rhs;
+ for (int n = 0; n < s_current_sort_specs->SpecsCount; n++)
+ {
+ const ImGuiTableColumnSortSpecs* sort_spec = &s_current_sort_specs->Specs[n];
+ int delta = 0;
+ if (sort_spec->ColumnIndex == 0)
+ delta = ((int)a->ID - (int)b->ID);
+ else if (sort_spec->ColumnIndex == 1)
+ delta = (a->Type - b->Type);
+ if (delta > 0)
+ return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1;
+ if (delta < 0)
+ return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1;
+ }
+ return ((int)a->ID - (int)b->ID);
+ }
+};
+const ImGuiTableSortSpecs* ExampleAsset::s_current_sort_specs = NULL;
+
+struct ExampleAssetsBrowser
+{
+ // Options
+ bool ShowTypeOverlay = true;
+ bool AllowSorting = true;
+ bool AllowDragUnselected = false;
+ bool AllowBoxSelect = true;
+ float IconSize = 32.0f;
+ int IconSpacing = 10;
+ int IconHitSpacing = 4; // Increase hit-spacing if you want to make it possible to clear or box-select from gaps. Some spacing is required to able to amend with Shift+box-select. Value is small in Explorer.
+ bool StretchSpacing = true;
+
+ // State
+ ImVector<ExampleAsset> Items; // Our items
+ ExampleSelectionWithDeletion Selection; // Our selection (ImGuiSelectionBasicStorage + helper funcs to handle deletion)
+ ImGuiID NextItemId = 0; // Unique identifier when creating new items
+ bool RequestDelete = false; // Deferred deletion request
+ bool RequestSort = false; // Deferred sort request
+ float ZoomWheelAccum = 0.0f; // Mouse wheel accumulator to handle smooth wheels better
+
+ // Calculated sizes for layout, output of UpdateLayoutSizes(). Could be locals but our code is simpler this way.
+ ImVec2 LayoutItemSize;
+ ImVec2 LayoutItemStep; // == LayoutItemSize + LayoutItemSpacing
+ float LayoutItemSpacing = 0.0f;
+ float LayoutSelectableSpacing = 0.0f;
+ float LayoutOuterPadding = 0.0f;
+ int LayoutColumnCount = 0;
+ int LayoutLineCount = 0;
+
+ // Functions
+ ExampleAssetsBrowser()
+ {
+ AddItems(10000);
+ }
+ void AddItems(int count)
+ {
+ if (Items.Size == 0)
+ NextItemId = 0;
+ Items.reserve(Items.Size + count);
+ for (int n = 0; n < count; n++, NextItemId++)
+ Items.push_back(ExampleAsset(NextItemId, (NextItemId % 20) < 15 ? 0 : (NextItemId % 20) < 18 ? 1 : 2));
+ RequestSort = true;
+ }
+ void ClearItems()
+ {
+ Items.clear();
+ Selection.Clear();
+ }
+
+ // Logic would be written in the main code BeginChild() and outputing to local variables.
+ // We extracted it into a function so we can call it easily from multiple places.
+ void UpdateLayoutSizes(float avail_width)
+ {
+ // Layout: when not stretching: allow extending into right-most spacing.
+ LayoutItemSpacing = (float)IconSpacing;
+ if (StretchSpacing == false)
+ avail_width += floorf(LayoutItemSpacing * 0.5f);
+
+ // Layout: calculate number of icon per line and number of lines
+ LayoutItemSize = ImVec2(floorf(IconSize), floorf(IconSize));
+ LayoutColumnCount = IM_MAX((int)(avail_width / (LayoutItemSize.x + LayoutItemSpacing)), 1);
+ LayoutLineCount = (Items.Size + LayoutColumnCount - 1) / LayoutColumnCount;
+
+ // Layout: when stretching: allocate remaining space to more spacing. Round before division, so item_spacing may be non-integer.
+ if (StretchSpacing && LayoutColumnCount > 1)
+ LayoutItemSpacing = floorf(avail_width - LayoutItemSize.x * LayoutColumnCount) / LayoutColumnCount;
+
+ LayoutItemStep = ImVec2(LayoutItemSize.x + LayoutItemSpacing, LayoutItemSize.y + LayoutItemSpacing);
+ LayoutSelectableSpacing = IM_MAX(floorf(LayoutItemSpacing) - IconHitSpacing, 0.0f);
+ LayoutOuterPadding = floorf(LayoutItemSpacing * 0.5f);
+ }
+
+ void Draw(const char* title, bool* p_open)
+ {
+ ImGui::SetNextWindowSize(ImVec2(IconSize * 25, IconSize * 15), ImGuiCond_FirstUseEver);
+ if (!ImGui::Begin(title, p_open, ImGuiWindowFlags_MenuBar))
+ {
+ ImGui::End();
+ return;
+ }
+
+ // Menu bar
+ if (ImGui::BeginMenuBar())
+ {
+ if (ImGui::BeginMenu("File"))
+ {
+ if (ImGui::MenuItem("Add 10000 items"))
+ AddItems(10000);
+ if (ImGui::MenuItem("Clear items"))
+ ClearItems();
+ ImGui::Separator();
+ if (ImGui::MenuItem("Close", NULL, false, p_open != NULL))
+ *p_open = false;
+ ImGui::EndMenu();
+ }
+ if (ImGui::BeginMenu("Edit"))
+ {
+ if (ImGui::MenuItem("Delete", "Del", false, Selection.Size > 0))
+ RequestDelete = true;
+ ImGui::EndMenu();
+ }
+ if (ImGui::BeginMenu("Options"))
+ {
+ ImGui::PushItemWidth(ImGui::GetFontSize() * 10);
+
+ ImGui::SeparatorText("Contents");
+ ImGui::Checkbox("Show Type Overlay", &ShowTypeOverlay);
+ ImGui::Checkbox("Allow Sorting", &AllowSorting);
+
+ ImGui::SeparatorText("Selection Behavior");
+ ImGui::Checkbox("Allow dragging unselected item", &AllowDragUnselected);
+ ImGui::Checkbox("Allow box-selection", &AllowBoxSelect);
+
+ ImGui::SeparatorText("Layout");
+ ImGui::SliderFloat("Icon Size", &IconSize, 16.0f, 128.0f, "%.0f");
+ ImGui::SameLine(); HelpMarker("Use CTRL+Wheel to zoom");
+ ImGui::SliderInt("Icon Spacing", &IconSpacing, 0, 32);
+ ImGui::SliderInt("Icon Hit Spacing", &IconHitSpacing, 0, 32);
+ ImGui::Checkbox("Stretch Spacing", &StretchSpacing);
+ ImGui::PopItemWidth();
+ ImGui::EndMenu();
+ }
+ ImGui::EndMenuBar();
+ }
+
+ // Show a table with ONLY one header row to showcase the idea/possibility of using this to provide a sorting UI
+ if (AllowSorting)
+ {
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
+ ImGuiTableFlags table_flags_for_sort_specs = ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Borders;
+ if (ImGui::BeginTable("for_sort_specs_only", 2, table_flags_for_sort_specs, ImVec2(0.0f, ImGui::GetFrameHeight())))
+ {
+ ImGui::TableSetupColumn("Index");
+ ImGui::TableSetupColumn("Type");
+ ImGui::TableHeadersRow();
+ if (ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs())
+ if (sort_specs->SpecsDirty || RequestSort)
+ {
+ ExampleAsset::SortWithSortSpecs(sort_specs, Items.Data, Items.Size);
+ sort_specs->SpecsDirty = RequestSort = false;
+ }
+ ImGui::EndTable();
+ }
+ ImGui::PopStyleVar();
+ }
+
+ ImGuiIO& io = ImGui::GetIO();
+ ImGui::SetNextWindowContentSize(ImVec2(0.0f, LayoutOuterPadding + LayoutLineCount * (LayoutItemSize.y + LayoutItemSpacing)));
+ if (ImGui::BeginChild("Assets", ImVec2(0.0f, -ImGui::GetTextLineHeightWithSpacing()), ImGuiChildFlags_Borders, ImGuiWindowFlags_NoMove))
+ {
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+
+ const float avail_width = ImGui::GetContentRegionAvail().x;
+ UpdateLayoutSizes(avail_width);
+
+ // Calculate and store start position.
+ ImVec2 start_pos = ImGui::GetCursorScreenPos();
+ start_pos = ImVec2(start_pos.x + LayoutOuterPadding, start_pos.y + LayoutOuterPadding);
+ ImGui::SetCursorScreenPos(start_pos);
+
+ // Multi-select
+ ImGuiMultiSelectFlags ms_flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_ClearOnClickVoid;
+
+ // - Enable box-select (in 2D mode, so that changing box-select rectangle X1/X2 boundaries will affect clipped items)
+ if (AllowBoxSelect)
+ ms_flags |= ImGuiMultiSelectFlags_BoxSelect2d;
+
+ // - This feature allows dragging an unselected item without selecting it (rarely used)
+ if (AllowDragUnselected)
+ ms_flags |= ImGuiMultiSelectFlags_SelectOnClickRelease;
+
+ // - Enable keyboard wrapping on X axis
+ // (FIXME-MULTISELECT: We haven't designed/exposed a general nav wrapping api yet, so this flag is provided as a courtesy to avoid doing:
+ // ImGui::NavMoveRequestTryWrapping(ImGui::GetCurrentWindow(), ImGuiNavMoveFlags_WrapX);
+ // When we finish implementing a more general API for this, we will obsolete this flag in favor of the new system)
+ ms_flags |= ImGuiMultiSelectFlags_NavWrapX;
+
+ ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(ms_flags, Selection.Size, Items.Size);
+
+ // Use custom selection adapter: store ID in selection (recommended)
+ Selection.UserData = this;
+ Selection.AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage* self_, int idx) { ExampleAssetsBrowser* self = (ExampleAssetsBrowser*)self_->UserData; return self->Items[idx].ID; };
+ Selection.ApplyRequests(ms_io);
+
+ const bool want_delete = (ImGui::Shortcut(ImGuiKey_Delete, ImGuiInputFlags_Repeat) && (Selection.Size > 0)) || RequestDelete;
+ const int item_curr_idx_to_focus = want_delete ? Selection.ApplyDeletionPreLoop(ms_io, Items.Size) : -1;
+ RequestDelete = false;
+
+ // Push LayoutSelectableSpacing (which is LayoutItemSpacing minus hit-spacing, if we decide to have hit gaps between items)
+ // Altering style ItemSpacing may seem unnecessary as we position every items using SetCursorScreenPos()...
+ // But it is necessary for two reasons:
+ // - Selectables uses it by default to visually fill the space between two items.
+ // - The vertical spacing would be measured by Clipper to calculate line height if we didn't provide it explicitly (here we do).
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(LayoutSelectableSpacing, LayoutSelectableSpacing));
+
+ // Rendering parameters
+ const ImU32 icon_type_overlay_colors[3] = { 0, IM_COL32(200, 70, 70, 255), IM_COL32(70, 170, 70, 255) };
+ const ImU32 icon_bg_color = ImGui::GetColorU32(IM_COL32(35, 35, 35, 220));
+ const ImVec2 icon_type_overlay_size = ImVec2(4.0f, 4.0f);
+ const bool display_label = (LayoutItemSize.x >= ImGui::CalcTextSize("999").x);
+
+ const int column_count = LayoutColumnCount;
+ ImGuiListClipper clipper;
+ clipper.Begin(LayoutLineCount, LayoutItemStep.y);
+ if (item_curr_idx_to_focus != -1)
+ clipper.IncludeItemByIndex(item_curr_idx_to_focus / column_count); // Ensure focused item line is not clipped.
+ if (ms_io->RangeSrcItem != -1)
+ clipper.IncludeItemByIndex((int)ms_io->RangeSrcItem / column_count); // Ensure RangeSrc item line is not clipped.
+ while (clipper.Step())
+ {
+ for (int line_idx = clipper.DisplayStart; line_idx < clipper.DisplayEnd; line_idx++)
+ {
+ const int item_min_idx_for_current_line = line_idx * column_count;
+ const int item_max_idx_for_current_line = IM_MIN((line_idx + 1) * column_count, Items.Size);
+ for (int item_idx = item_min_idx_for_current_line; item_idx < item_max_idx_for_current_line; ++item_idx)
+ {
+ ExampleAsset* item_data = &Items[item_idx];
+ ImGui::PushID((int)item_data->ID);
+
+ // Position item
+ ImVec2 pos = ImVec2(start_pos.x + (item_idx % column_count) * LayoutItemStep.x, start_pos.y + line_idx * LayoutItemStep.y);
+ ImGui::SetCursorScreenPos(pos);
+
+ ImGui::SetNextItemSelectionUserData(item_idx);
+ bool item_is_selected = Selection.Contains((ImGuiID)item_data->ID);
+ bool item_is_visible = ImGui::IsRectVisible(LayoutItemSize);
+ ImGui::Selectable("", item_is_selected, ImGuiSelectableFlags_None, LayoutItemSize);
+
+ // Update our selection state immediately (without waiting for EndMultiSelect() requests)
+ // because we use this to alter the color of our text/icon.
+ if (ImGui::IsItemToggledSelection())
+ item_is_selected = !item_is_selected;
+
+ // Focus (for after deletion)
+ if (item_curr_idx_to_focus == item_idx)
+ ImGui::SetKeyboardFocusHere(-1);
+
+ // Drag and drop
+ if (ImGui::BeginDragDropSource())
+ {
+ // Create payload with full selection OR single unselected item.
+ // (the later is only possible when using ImGuiMultiSelectFlags_SelectOnClickRelease)
+ if (ImGui::GetDragDropPayload() == NULL)
+ {
+ ImVector<ImGuiID> payload_items;
+ void* it = NULL;
+ ImGuiID id = 0;
+ if (!item_is_selected)
+ payload_items.push_back(item_data->ID);
+ else
+ while (Selection.GetNextSelectedItem(&it, &id))
+ payload_items.push_back(id);
+ ImGui::SetDragDropPayload("ASSETS_BROWSER_ITEMS", payload_items.Data, (size_t)payload_items.size_in_bytes());
+ }
+
+ // Display payload content in tooltip, by extracting it from the payload data
+ // (we could read from selection, but it is more correct and reusable to read from payload)
+ const ImGuiPayload* payload = ImGui::GetDragDropPayload();
+ const int payload_count = (int)payload->DataSize / (int)sizeof(ImGuiID);
+ ImGui::Text("%d assets", payload_count);
+
+ ImGui::EndDragDropSource();
+ }
+
+ // Render icon (a real app would likely display an image/thumbnail here)
+ // Because we use ImGuiMultiSelectFlags_BoxSelect2d, clipping vertical may occasionally be larger, so we coarse-clip our rendering as well.
+ if (item_is_visible)
+ {
+ ImVec2 box_min(pos.x - 1, pos.y - 1);
+ ImVec2 box_max(box_min.x + LayoutItemSize.x + 2, box_min.y + LayoutItemSize.y + 2); // Dubious
+ draw_list->AddRectFilled(box_min, box_max, icon_bg_color); // Background color
+ if (ShowTypeOverlay && item_data->Type != 0)
+ {
+ ImU32 type_col = icon_type_overlay_colors[item_data->Type % IM_ARRAYSIZE(icon_type_overlay_colors)];
+ draw_list->AddRectFilled(ImVec2(box_max.x - 2 - icon_type_overlay_size.x, box_min.y + 2), ImVec2(box_max.x - 2, box_min.y + 2 + icon_type_overlay_size.y), type_col);
+ }
+ if (display_label)
+ {
+ ImU32 label_col = ImGui::GetColorU32(item_is_selected ? ImGuiCol_Text : ImGuiCol_TextDisabled);
+ char label[32];
+ sprintf(label, "%d", item_data->ID);
+ draw_list->AddText(ImVec2(box_min.x, box_max.y - ImGui::GetFontSize()), label_col, label);
+ }
+ }
+
+ ImGui::PopID();
+ }
+ }
+ }
+ clipper.End();
+ ImGui::PopStyleVar(); // ImGuiStyleVar_ItemSpacing
+
+ // Context menu
+ if (ImGui::BeginPopupContextWindow())
+ {
+ ImGui::Text("Selection: %d items", Selection.Size);
+ ImGui::Separator();
+ if (ImGui::MenuItem("Delete", "Del", false, Selection.Size > 0))
+ RequestDelete = true;
+ ImGui::EndPopup();
+ }
+
+ ms_io = ImGui::EndMultiSelect();
+ Selection.ApplyRequests(ms_io);
+ if (want_delete)
+ Selection.ApplyDeletionPostLoop(ms_io, Items, item_curr_idx_to_focus);
+
+ // Zooming with CTRL+Wheel
+ if (ImGui::IsWindowAppearing())
+ ZoomWheelAccum = 0.0f;
+ if (ImGui::IsWindowHovered() && io.MouseWheel != 0.0f && ImGui::IsKeyDown(ImGuiMod_Ctrl) && ImGui::IsAnyItemActive() == false)
+ {
+ ZoomWheelAccum += io.MouseWheel;
+ if (fabsf(ZoomWheelAccum) >= 1.0f)
+ {
+ // Calculate hovered item index from mouse location
+ // FIXME: Locking aiming on 'hovered_item_idx' (with a cool-down timer) would ensure zoom keeps on it.
+ const float hovered_item_nx = (io.MousePos.x - start_pos.x + LayoutItemSpacing * 0.5f) / LayoutItemStep.x;
+ const float hovered_item_ny = (io.MousePos.y - start_pos.y + LayoutItemSpacing * 0.5f) / LayoutItemStep.y;
+ const int hovered_item_idx = ((int)hovered_item_ny * LayoutColumnCount) + (int)hovered_item_nx;
+ //ImGui::SetTooltip("%f,%f -> item %d", hovered_item_nx, hovered_item_ny, hovered_item_idx); // Move those 4 lines in block above for easy debugging
+
+ // Zoom
+ IconSize *= powf(1.1f, (float)(int)ZoomWheelAccum);
+ IconSize = IM_CLAMP(IconSize, 16.0f, 128.0f);
+ ZoomWheelAccum -= (int)ZoomWheelAccum;
+ UpdateLayoutSizes(avail_width);
+
+ // Manipulate scroll to that we will land at the same Y location of currently hovered item.
+ // - Calculate next frame position of item under mouse
+ // - Set new scroll position to be used in next ImGui::BeginChild() call.
+ float hovered_item_rel_pos_y = ((float)(hovered_item_idx / LayoutColumnCount) + fmodf(hovered_item_ny, 1.0f)) * LayoutItemStep.y;
+ hovered_item_rel_pos_y += ImGui::GetStyle().WindowPadding.y;
+ float mouse_local_y = io.MousePos.y - ImGui::GetWindowPos().y;
+ ImGui::SetScrollY(hovered_item_rel_pos_y - mouse_local_y);
+ }
+ }
+ }
+ ImGui::EndChild();
+
+ ImGui::Text("Selected: %d/%d items", Selection.Size, Items.Size);
+ ImGui::End();
+ }
+};
+
+void ShowExampleAppAssetsBrowser(bool* p_open)
+{
+ IMGUI_DEMO_MARKER("Examples/Assets Browser");
+ static ExampleAssetsBrowser assets_browser;
+ assets_browser.Draw("Example: Assets Browser", p_open);
+}
+
// End of Demo code
#else
@@ -8058,6 +10678,8 @@ void ImGui::ShowAboutWindow(bool*) {}
void ImGui::ShowDemoWindow(bool*) {}
void ImGui::ShowUserGuide() {}
void ImGui::ShowStyleEditor(ImGuiStyle*) {}
+bool ImGui::ShowStyleSelector(const char* label) { return false; }
+void ImGui::ShowFontSelector(const char* label) {}
#endif
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_draw.cpp b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_draw.cpp
index 859b62e7e97..27310152918 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_draw.cpp
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_draw.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.89.1 WIP
+// dear imgui, v1.91.9b
// (drawing and font code)
/*
@@ -8,12 +8,13 @@ Index of this file:
// [SECTION] STB libraries implementation
// [SECTION] Style functions
// [SECTION] ImDrawList
+// [SECTION] ImTriangulator, ImDrawList concave polygon fill
// [SECTION] ImDrawListSplitter
// [SECTION] ImDrawData
// [SECTION] Helpers ShadeVertsXXX functions
// [SECTION] ImFontConfig
// [SECTION] ImFontAtlas
-// [SECTION] ImFontAtlas glyph ranges helpers
+// [SECTION] ImFontAtlas: glyph ranges helpers
// [SECTION] ImFontGlyphRangesBuilder
// [SECTION] ImFont
// [SECTION] ImGui Internal Render Helpers
@@ -26,13 +27,12 @@ Index of this file:
#define _CRT_SECURE_NO_WARNINGS
#endif
-#include "imgui.h"
-#ifndef IMGUI_DISABLE
-
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
+#include "imgui.h"
+#ifndef IMGUI_DISABLE
#include "imgui_internal.h"
#ifdef IMGUI_ENABLE_FREETYPE
#include "misc/freetype/imgui_freetype.h"
@@ -64,13 +64,21 @@ Index of this file:
#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
+#pragma clang diagnostic ignored "-Wreserved-identifier" // warning: identifier '_Xxx' is reserved because it starts with '_' followed by a capital letter
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
+#pragma clang diagnostic ignored "-Wcast-qual" // warning: cast from 'const xxxx *' to 'xxx *' drops const qualifier
+#pragma clang diagnostic ignored "-Wswitch-default" // warning: 'switch' missing 'default' label
#elif defined(__GNUC__)
-#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
-#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
-#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
-#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
-#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
+#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
+#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
+#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer
+#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when simplifying division / ..when changing X +- C1 cmp C2 to X cmp C2 -+ C1
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
#endif
//-------------------------------------------------------------------------
@@ -99,16 +107,15 @@ namespace IMGUI_STB_NAMESPACE
#if defined(__clang__)
#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-function"
+#pragma clang diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
-#pragma clang diagnostic ignored "-Wcast-qual" // warning: cast from 'const xxxx *' to 'xxx *' drops const qualifier
#endif
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits]
-#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" // warning: this statement may fall through
#endif
#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
@@ -135,8 +142,9 @@ namespace IMGUI_STB_NAMESPACE
#define STBTT_sqrt(x) ImSqrt(x)
#define STBTT_pow(x,y) ImPow(x,y)
#define STBTT_fabs(x) ImFabs(x)
-#define STBTT_ifloor(x) ((int)ImFloorSigned(x))
+#define STBTT_ifloor(x) ((int)ImFloor(x))
#define STBTT_iceil(x) ((int)ImCeil(x))
+#define STBTT_strlen(x) ImStrlen(x)
#define STBTT_STATIC
#define STB_TRUETYPE_IMPLEMENTATION
#else
@@ -209,11 +217,13 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst)
colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.20f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
- colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f);
colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered];
- colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
- colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
- colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f);
+ colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f);
+ colors[ImGuiCol_TabSelected] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
+ colors[ImGuiCol_TabSelectedOverline] = colors[ImGuiCol_HeaderActive];
+ colors[ImGuiCol_TabDimmed] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
+ colors[ImGuiCol_TabDimmedSelected] = ImLerp(colors[ImGuiCol_TabSelected], colors[ImGuiCol_TitleBg], 0.40f);
+ colors[ImGuiCol_TabDimmedSelectedOverline] = ImVec4(0.50f, 0.50f, 0.50f, 0.00f);
colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f);
colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
@@ -223,9 +233,10 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst)
colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); // Prefer using Alpha=1.0 here
colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f);
+ colors[ImGuiCol_TextLink] = colors[ImGuiCol_HeaderActive];
colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f);
colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f);
- colors[ImGuiCol_NavHighlight] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
+ colors[ImGuiCol_NavCursor] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f);
@@ -269,11 +280,13 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst)
colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.10f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f);
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f);
- colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f);
colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered];
- colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
- colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
- colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f);
+ colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f);
+ colors[ImGuiCol_TabSelected] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
+ colors[ImGuiCol_TabSelectedOverline] = colors[ImGuiCol_HeaderActive];
+ colors[ImGuiCol_TabDimmed] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
+ colors[ImGuiCol_TabDimmedSelected] = ImLerp(colors[ImGuiCol_TabSelected], colors[ImGuiCol_TitleBg], 0.40f);
+ colors[ImGuiCol_TabDimmedSelectedOverline] = ImVec4(0.53f, 0.53f, 0.87f, 0.00f);
colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
@@ -283,9 +296,10 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst)
colors[ImGuiCol_TableBorderLight] = ImVec4(0.26f, 0.26f, 0.28f, 1.00f); // Prefer using Alpha=1.0 here
colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.07f);
+ colors[ImGuiCol_TextLink] = colors[ImGuiCol_HeaderActive];
colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f);
colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f);
- colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered];
+ colors[ImGuiCol_NavCursor] = colors[ImGuiCol_HeaderHovered];
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f);
@@ -330,11 +344,13 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
colors[ImGuiCol_ResizeGrip] = ImVec4(0.35f, 0.35f, 0.35f, 0.17f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
- colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f);
colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered];
- colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
- colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
- colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f);
+ colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f);
+ colors[ImGuiCol_TabSelected] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
+ colors[ImGuiCol_TabSelectedOverline] = colors[ImGuiCol_HeaderActive];
+ colors[ImGuiCol_TabDimmed] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
+ colors[ImGuiCol_TabDimmedSelected] = ImLerp(colors[ImGuiCol_TabSelected], colors[ImGuiCol_TitleBg], 0.40f);
+ colors[ImGuiCol_TabDimmedSelectedOverline] = ImVec4(0.26f, 0.59f, 1.00f, 0.00f);
colors[ImGuiCol_PlotLines] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f);
colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
@@ -344,9 +360,10 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
colors[ImGuiCol_TableBorderLight] = ImVec4(0.68f, 0.68f, 0.74f, 1.00f); // Prefer using Alpha=1.0 here
colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
colors[ImGuiCol_TableRowBgAlt] = ImVec4(0.30f, 0.30f, 0.30f, 0.09f);
+ colors[ImGuiCol_TextLink] = colors[ImGuiCol_HeaderActive];
colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f);
colors[ImGuiCol_DragDropTarget] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
- colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered];
+ colors[ImGuiCol_NavCursor] = colors[ImGuiCol_HeaderHovered];
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(0.70f, 0.70f, 0.70f, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.20f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f);
@@ -359,6 +376,7 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
ImDrawListSharedData::ImDrawListSharedData()
{
memset(this, 0, sizeof(*this));
+ InitialFringeScale = 1.0f;
for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++)
{
const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx);
@@ -382,13 +400,27 @@ void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error)
ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError);
}
+ImDrawList::ImDrawList(ImDrawListSharedData* shared_data)
+{
+ memset(this, 0, sizeof(*this));
+ _Data = shared_data;
+}
+
+ImDrawList::~ImDrawList()
+{
+ _ClearFreeMemory();
+}
+
// Initialize before use in a new frame. We always have a command ready in the buffer.
+// In the majority of cases, you would want to call PushClipRect() and PushTextureID() after this.
void ImDrawList::_ResetForNewFrame()
{
// Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory.
- IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0);
- IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4));
- IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID));
+ IM_STATIC_ASSERT(offsetof(ImDrawCmd, ClipRect) == 0);
+ IM_STATIC_ASSERT(offsetof(ImDrawCmd, TextureId) == sizeof(ImVec4));
+ IM_STATIC_ASSERT(offsetof(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID));
+ if (_Splitter._Count > 1)
+ _Splitter.Merge(this);
CmdBuffer.resize(0);
IdxBuffer.resize(0);
@@ -400,10 +432,11 @@ void ImDrawList::_ResetForNewFrame()
_IdxWritePtr = NULL;
_ClipRectStack.resize(0);
_TextureIdStack.resize(0);
+ _CallbacksDataBuf.resize(0);
_Path.resize(0);
_Splitter.Clear();
CmdBuffer.push_back(ImDrawCmd());
- _FringeScale = 1.0f;
+ _FringeScale = _Data->InitialFringeScale;
}
void ImDrawList::_ClearFreeMemory()
@@ -417,6 +450,7 @@ void ImDrawList::_ClearFreeMemory()
_IdxWritePtr = NULL;
_ClipRectStack.clear();
_TextureIdStack.clear();
+ _CallbacksDataBuf.clear();
_Path.clear();
_Splitter.ClearFreeMemory();
}
@@ -447,14 +481,16 @@ void ImDrawList::AddDrawCmd()
// Note that this leaves the ImDrawList in a state unfit for further commands, as most code assume that CmdBuffer.Size > 0 && CmdBuffer.back().UserCallback == NULL
void ImDrawList::_PopUnusedDrawCmd()
{
- if (CmdBuffer.Size == 0)
- return;
- ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1];
- if (curr_cmd->ElemCount == 0 && curr_cmd->UserCallback == NULL)
+ while (CmdBuffer.Size > 0)
+ {
+ ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1];
+ if (curr_cmd->ElemCount != 0 || curr_cmd->UserCallback != NULL)
+ return;// break;
CmdBuffer.pop_back();
+ }
}
-void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data)
+void ImDrawList::AddCallback(ImDrawCallback callback, void* userdata, size_t userdata_size)
{
IM_ASSERT_PARANOID(CmdBuffer.Size > 0);
ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1];
@@ -464,14 +500,32 @@ void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data)
AddDrawCmd();
curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1];
}
+
curr_cmd->UserCallback = callback;
- curr_cmd->UserCallbackData = callback_data;
+ if (userdata_size == 0)
+ {
+ // Store user data directly in command (no indirection)
+ curr_cmd->UserCallbackData = userdata;
+ curr_cmd->UserCallbackDataSize = 0;
+ curr_cmd->UserCallbackDataOffset = -1;
+ }
+ else
+ {
+ // Copy and store user data in a buffer
+ IM_ASSERT(userdata != NULL);
+ IM_ASSERT(userdata_size < (1u << 31));
+ curr_cmd->UserCallbackData = NULL; // Will be resolved during Render()
+ curr_cmd->UserCallbackDataSize = (int)userdata_size;
+ curr_cmd->UserCallbackDataOffset = _CallbacksDataBuf.Size;
+ _CallbacksDataBuf.resize(_CallbacksDataBuf.Size + (int)userdata_size);
+ memcpy(_CallbacksDataBuf.Data + (size_t)curr_cmd->UserCallbackDataOffset, userdata, userdata_size);
+ }
AddDrawCmd(); // Force a new command after us (see comment below)
}
// Compare ClipRect, TextureId and VtxOffset with a single memcmp()
-#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int))
+#define ImDrawCmd_HeaderSize (offsetof(ImDrawCmd, VtxOffset) + sizeof(unsigned int))
#define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset
#define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset
#define ImDrawCmd_AreSequentialIdxOffset(CMD_0, CMD_1) (CMD_0->IdxOffset + CMD_0->ElemCount == CMD_1->IdxOffset)
@@ -510,7 +564,6 @@ void ImDrawList::_OnChangedClipRect()
CmdBuffer.pop_back();
return;
}
-
curr_cmd->ClipRect = _CmdHeader.ClipRect;
}
@@ -533,7 +586,6 @@ void ImDrawList::_OnChangedTextureID()
CmdBuffer.pop_back();
return;
}
-
curr_cmd->TextureId = _CmdHeader.TextureId;
}
@@ -557,7 +609,7 @@ int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const
{
// Automatic segment count
const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy
- if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts))
+ if (radius_idx >= 0 && radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts))
return _Data->CircleSegmentCounts[radius_idx]; // Use cached value
else
return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError);
@@ -609,6 +661,15 @@ void ImDrawList::PopTextureID()
_OnChangedTextureID();
}
+// This is used by ImGui::PushFont()/PopFont(). It works because we never use _TextureIdStack[] elsewhere than in PushTextureID()/PopTextureID().
+void ImDrawList::_SetTextureID(ImTextureID texture_id)
+{
+ if (_CmdHeader.TextureId == texture_id)
+ return;
+ _CmdHeader.TextureId = texture_id;
+ _OnChangedTextureID();
+}
+
// Reserve space for a number of vertices and indices.
// You must finish filling your reserved data before calling PrimReserve() again, as it may reallocate or
// submit the intermediate results. PrimUnreserve() can be used to release unused allocations.
@@ -637,7 +698,7 @@ void ImDrawList::PrimReserve(int idx_count, int vtx_count)
_IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size;
}
-// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve().
+// Release the number of reserved vertices/indices from the end of the last reservation made with PrimReserve().
void ImDrawList::PrimUnreserve(int idx_count, int vtx_count)
{
IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0);
@@ -704,7 +765,7 @@ void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, c
// We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds.
void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, ImDrawFlags flags, float thickness)
{
- if (points_count < 2)
+ if (points_count < 2 || (col & IM_COL32_A_MASK) == 0)
return;
const bool closed = (flags & ImDrawFlags_Closed) != 0;
@@ -962,7 +1023,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
// - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing.
void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col)
{
- if (points_count < 3)
+ if (points_count < 3 || (col & IM_COL32_A_MASK) == 0)
return;
const ImVec2 uv = _Data->TexUvWhitePixel;
@@ -1187,8 +1248,8 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa
const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f);
const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f);
- const int a_min_sample = a_is_reverse ? (int)ImFloorSigned(a_min_sample_f) : (int)ImCeil(a_min_sample_f);
- const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloorSigned(a_max_sample_f);
+ const int a_min_sample = a_is_reverse ? (int)ImFloor(a_min_sample_f) : (int)ImCeil(a_min_sample_f);
+ const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloor(a_max_sample_f);
const int a_mid_samples = a_is_reverse ? ImMax(a_min_sample - a_max_sample, 0) : ImMax(a_max_sample - a_min_sample, 0);
const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
@@ -1213,6 +1274,26 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa
}
}
+void ImDrawList::PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments)
+{
+ if (num_segments <= 0)
+ num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here.
+
+ _Path.reserve(_Path.Size + (num_segments + 1));
+
+ const float cos_rot = ImCos(rot);
+ const float sin_rot = ImSin(rot);
+ for (int i = 0; i <= num_segments; i++)
+ {
+ const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min);
+ ImVec2 point(ImCos(a) * radius.x, ImSin(a) * radius.y);
+ const ImVec2 rel((point.x * cos_rot) - (point.y * sin_rot), (point.x * sin_rot) + (point.y * cos_rot));
+ point.x = rel.x + center.x;
+ point.y = rel.y + center.y;
+ _Path.push_back(point);
+ }
+}
+
ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t)
{
float u = 1.0f - t;
@@ -1308,33 +1389,22 @@ void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3,
}
}
-IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4));
static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags)
{
+ /*
+ IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4));
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- // Obsoleted in 1.82 (from February 2021)
- // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All)
- // ~0 --> ImDrawFlags_RoundCornersAll or 0
- if (flags == ~0)
- return ImDrawFlags_RoundCornersAll;
-
- // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations)
- // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!)
- // 0x02 --> ImDrawFlags_RoundCornersTopRight
- // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight
- // 0x04 --> ImDrawFlags_RoundCornersBotLeft
- // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft
- // ...
- // 0x0F --> ImDrawFlags_RoundCornersAll or 0
- // (See all values in ImDrawCornerFlags_)
- if (flags >= 0x01 && flags <= 0x0F)
- return (flags << 4);
-
+ // Obsoleted in 1.82 (from February 2021). This code was stripped/simplified and mostly commented in 1.90 (from September 2023)
+ // - Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All)
+ if (flags == ~0) { return ImDrawFlags_RoundCornersAll; }
+ // - Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations). Read details in older version of this code.
+ if (flags >= 0x01 && flags <= 0x0F) { return (flags << 4); }
// We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f'
#endif
-
- // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values.
- // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc...
+ */
+ // If this assert triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values.
+ // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc. anyway.
+ // See details in 1.82 Changelog as well as 2021/03/12 and 2023/09/08 entries in "API BREAKING CHANGES" section.
IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!");
if ((flags & ImDrawFlags_RoundCornersMask_) == 0)
@@ -1345,10 +1415,12 @@ static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags)
void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags)
{
- flags = FixRectCornerFlags(flags);
- rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f);
- rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f);
-
+ if (rounding >= 0.5f)
+ {
+ flags = FixRectCornerFlags(flags);
+ rounding = ImMin(rounding, ImFabs(b.x - a.x) * (((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f) - 1.0f);
+ rounding = ImMin(rounding, ImFabs(b.y - a.y) * (((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f) - 1.0f);
+ }
if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone)
{
PathLineTo(a);
@@ -1541,6 +1613,35 @@ void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, in
PathFillConvex(col);
}
+// Ellipse
+void ImDrawList::AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments, float thickness)
+{
+ if ((col & IM_COL32_A_MASK) == 0)
+ return;
+
+ if (num_segments <= 0)
+ num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here.
+
+ // Because we are filling a closed shape we remove 1 from the count of segments/points
+ const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
+ PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1);
+ PathStroke(col, true, thickness);
+}
+
+void ImDrawList::AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments)
+{
+ if ((col & IM_COL32_A_MASK) == 0)
+ return;
+
+ if (num_segments <= 0)
+ num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here.
+
+ // Because we are filling a closed shape we remove 1 from the count of segments/points
+ const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
+ PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1);
+ PathFillConvex(col);
+}
+
// Cubic Bezier takes 4 controls points
void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments)
{
@@ -1563,15 +1664,15 @@ void ImDrawList::AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const Im
PathStroke(col, 0, thickness);
}
-void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)
+void ImDrawList::AddText(ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- if (text_end == NULL)
- text_end = text_begin + strlen(text_begin);
- if (text_begin == text_end)
+ // Accept null ranges
+ if (text_begin == text_end || text_begin[0] == 0)
return;
+ // No need to strlen() here: font->RenderText() will do it and may early out.
// Pull default font/size from the shared ImDrawListSharedData instance
if (font == NULL)
@@ -1594,7 +1695,7 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end)
{
- AddText(NULL, 0.0f, pos, col, text_begin, text_end);
+ AddText(_Data->Font, _Data->FontSize, pos, col, text_begin, text_end);
}
void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col)
@@ -1655,6 +1756,316 @@ void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_mi
PopTextureID();
}
+//-----------------------------------------------------------------------------
+// [SECTION] ImTriangulator, ImDrawList concave polygon fill
+//-----------------------------------------------------------------------------
+// Triangulate concave polygons. Based on "Triangulation by Ear Clipping" paper, O(N^2) complexity.
+// Reference: https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
+// Provided as a convenience for user but not used by main library.
+//-----------------------------------------------------------------------------
+// - ImTriangulator [Internal]
+// - AddConcavePolyFilled()
+//-----------------------------------------------------------------------------
+
+enum ImTriangulatorNodeType
+{
+ ImTriangulatorNodeType_Convex,
+ ImTriangulatorNodeType_Ear,
+ ImTriangulatorNodeType_Reflex
+};
+
+struct ImTriangulatorNode
+{
+ ImTriangulatorNodeType Type;
+ int Index;
+ ImVec2 Pos;
+ ImTriangulatorNode* Next;
+ ImTriangulatorNode* Prev;
+
+ void Unlink() { Next->Prev = Prev; Prev->Next = Next; }
+};
+
+struct ImTriangulatorNodeSpan
+{
+ ImTriangulatorNode** Data = NULL;
+ int Size = 0;
+
+ void push_back(ImTriangulatorNode* node) { Data[Size++] = node; }
+ void find_erase_unsorted(int idx) { for (int i = Size - 1; i >= 0; i--) if (Data[i]->Index == idx) { Data[i] = Data[Size - 1]; Size--; return; } }
+};
+
+struct ImTriangulator
+{
+ static int EstimateTriangleCount(int points_count) { return (points_count < 3) ? 0 : points_count - 2; }
+ static int EstimateScratchBufferSize(int points_count) { return sizeof(ImTriangulatorNode) * points_count + sizeof(ImTriangulatorNode*) * points_count * 2; }
+
+ void Init(const ImVec2* points, int points_count, void* scratch_buffer);
+ void GetNextTriangle(unsigned int out_triangle[3]); // Return relative indexes for next triangle
+
+ // Internal functions
+ void BuildNodes(const ImVec2* points, int points_count);
+ void BuildReflexes();
+ void BuildEars();
+ void FlipNodeList();
+ bool IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const;
+ void ReclassifyNode(ImTriangulatorNode* node);
+
+ // Internal members
+ int _TrianglesLeft = 0;
+ ImTriangulatorNode* _Nodes = NULL;
+ ImTriangulatorNodeSpan _Ears;
+ ImTriangulatorNodeSpan _Reflexes;
+};
+
+// Distribute storage for nodes, ears and reflexes.
+// FIXME-OPT: if everything is convex, we could report it to caller and let it switch to an convex renderer
+// (this would require first building reflexes to bail to convex if empty, without even building nodes)
+void ImTriangulator::Init(const ImVec2* points, int points_count, void* scratch_buffer)
+{
+ IM_ASSERT(scratch_buffer != NULL && points_count >= 3);
+ _TrianglesLeft = EstimateTriangleCount(points_count);
+ _Nodes = (ImTriangulatorNode*)scratch_buffer; // points_count x Node
+ _Ears.Data = (ImTriangulatorNode**)(_Nodes + points_count); // points_count x Node*
+ _Reflexes.Data = (ImTriangulatorNode**)(_Nodes + points_count) + points_count; // points_count x Node*
+ BuildNodes(points, points_count);
+ BuildReflexes();
+ BuildEars();
+}
+
+void ImTriangulator::BuildNodes(const ImVec2* points, int points_count)
+{
+ for (int i = 0; i < points_count; i++)
+ {
+ _Nodes[i].Type = ImTriangulatorNodeType_Convex;
+ _Nodes[i].Index = i;
+ _Nodes[i].Pos = points[i];
+ _Nodes[i].Next = _Nodes + i + 1;
+ _Nodes[i].Prev = _Nodes + i - 1;
+ }
+ _Nodes[0].Prev = _Nodes + points_count - 1;
+ _Nodes[points_count - 1].Next = _Nodes;
+}
+
+void ImTriangulator::BuildReflexes()
+{
+ ImTriangulatorNode* n1 = _Nodes;
+ for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next)
+ {
+ if (ImTriangleIsClockwise(n1->Prev->Pos, n1->Pos, n1->Next->Pos))
+ continue;
+ n1->Type = ImTriangulatorNodeType_Reflex;
+ _Reflexes.push_back(n1);
+ }
+}
+
+void ImTriangulator::BuildEars()
+{
+ ImTriangulatorNode* n1 = _Nodes;
+ for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next)
+ {
+ if (n1->Type != ImTriangulatorNodeType_Convex)
+ continue;
+ if (!IsEar(n1->Prev->Index, n1->Index, n1->Next->Index, n1->Prev->Pos, n1->Pos, n1->Next->Pos))
+ continue;
+ n1->Type = ImTriangulatorNodeType_Ear;
+ _Ears.push_back(n1);
+ }
+}
+
+void ImTriangulator::GetNextTriangle(unsigned int out_triangle[3])
+{
+ if (_Ears.Size == 0)
+ {
+ FlipNodeList();
+
+ ImTriangulatorNode* node = _Nodes;
+ for (int i = _TrianglesLeft; i >= 0; i--, node = node->Next)
+ node->Type = ImTriangulatorNodeType_Convex;
+ _Reflexes.Size = 0;
+ BuildReflexes();
+ BuildEars();
+
+ // If we still don't have ears, it means geometry is degenerated.
+ if (_Ears.Size == 0)
+ {
+ // Return first triangle available, mimicking the behavior of convex fill.
+ IM_ASSERT(_TrianglesLeft > 0); // Geometry is degenerated
+ _Ears.Data[0] = _Nodes;
+ _Ears.Size = 1;
+ }
+ }
+
+ ImTriangulatorNode* ear = _Ears.Data[--_Ears.Size];
+ out_triangle[0] = ear->Prev->Index;
+ out_triangle[1] = ear->Index;
+ out_triangle[2] = ear->Next->Index;
+
+ ear->Unlink();
+ if (ear == _Nodes)
+ _Nodes = ear->Next;
+
+ ReclassifyNode(ear->Prev);
+ ReclassifyNode(ear->Next);
+ _TrianglesLeft--;
+}
+
+void ImTriangulator::FlipNodeList()
+{
+ ImTriangulatorNode* prev = _Nodes;
+ ImTriangulatorNode* temp = _Nodes;
+ ImTriangulatorNode* current = _Nodes->Next;
+ prev->Next = prev;
+ prev->Prev = prev;
+ while (current != _Nodes)
+ {
+ temp = current->Next;
+
+ current->Next = prev;
+ prev->Prev = current;
+ _Nodes->Next = current;
+ current->Prev = _Nodes;
+
+ prev = current;
+ current = temp;
+ }
+ _Nodes = prev;
+}
+
+// A triangle is an ear is no other vertex is inside it. We can test reflexes vertices only (see reference algorithm)
+bool ImTriangulator::IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const
+{
+ ImTriangulatorNode** p_end = _Reflexes.Data + _Reflexes.Size;
+ for (ImTriangulatorNode** p = _Reflexes.Data; p < p_end; p++)
+ {
+ ImTriangulatorNode* reflex = *p;
+ if (reflex->Index != i0 && reflex->Index != i1 && reflex->Index != i2)
+ if (ImTriangleContainsPoint(v0, v1, v2, reflex->Pos))
+ return false;
+ }
+ return true;
+}
+
+void ImTriangulator::ReclassifyNode(ImTriangulatorNode* n1)
+{
+ // Classify node
+ ImTriangulatorNodeType type;
+ const ImTriangulatorNode* n0 = n1->Prev;
+ const ImTriangulatorNode* n2 = n1->Next;
+ if (!ImTriangleIsClockwise(n0->Pos, n1->Pos, n2->Pos))
+ type = ImTriangulatorNodeType_Reflex;
+ else if (IsEar(n0->Index, n1->Index, n2->Index, n0->Pos, n1->Pos, n2->Pos))
+ type = ImTriangulatorNodeType_Ear;
+ else
+ type = ImTriangulatorNodeType_Convex;
+
+ // Update lists when a type changes
+ if (type == n1->Type)
+ return;
+ if (n1->Type == ImTriangulatorNodeType_Reflex)
+ _Reflexes.find_erase_unsorted(n1->Index);
+ else if (n1->Type == ImTriangulatorNodeType_Ear)
+ _Ears.find_erase_unsorted(n1->Index);
+ if (type == ImTriangulatorNodeType_Reflex)
+ _Reflexes.push_back(n1);
+ else if (type == ImTriangulatorNodeType_Ear)
+ _Ears.push_back(n1);
+ n1->Type = type;
+}
+
+// Use ear-clipping algorithm to triangulate a simple polygon (no self-interaction, no holes).
+// (Reminder: we don't perform any coarse clipping/culling in ImDrawList layer!
+// It is up to caller to ensure not making costly calls that will be outside of visible area.
+// As concave fill is noticeably more expensive than other primitives, be mindful of this...
+// Caller can build AABB of points, and avoid filling if 'draw_list->_CmdHeader.ClipRect.Overlays(points_bb) == false')
+void ImDrawList::AddConcavePolyFilled(const ImVec2* points, const int points_count, ImU32 col)
+{
+ if (points_count < 3 || (col & IM_COL32_A_MASK) == 0)
+ return;
+
+ const ImVec2 uv = _Data->TexUvWhitePixel;
+ ImTriangulator triangulator;
+ unsigned int triangle[3];
+ if (Flags & ImDrawListFlags_AntiAliasedFill)
+ {
+ // Anti-aliased Fill
+ const float AA_SIZE = _FringeScale;
+ const ImU32 col_trans = col & ~IM_COL32_A_MASK;
+ const int idx_count = (points_count - 2) * 3 + points_count * 6;
+ const int vtx_count = (points_count * 2);
+ PrimReserve(idx_count, vtx_count);
+
+ // Add indexes for fill
+ unsigned int vtx_inner_idx = _VtxCurrentIdx;
+ unsigned int vtx_outer_idx = _VtxCurrentIdx + 1;
+
+ _Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2));
+ triangulator.Init(points, points_count, _Data->TempBuffer.Data);
+ while (triangulator._TrianglesLeft > 0)
+ {
+ triangulator.GetNextTriangle(triangle);
+ _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (triangle[0] << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (triangle[1] << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (triangle[2] << 1));
+ _IdxWritePtr += 3;
+ }
+
+ // Compute normals
+ _Data->TempBuffer.reserve_discard(points_count);
+ ImVec2* temp_normals = _Data->TempBuffer.Data;
+ for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++)
+ {
+ const ImVec2& p0 = points[i0];
+ const ImVec2& p1 = points[i1];
+ float dx = p1.x - p0.x;
+ float dy = p1.y - p0.y;
+ IM_NORMALIZE2F_OVER_ZERO(dx, dy);
+ temp_normals[i0].x = dy;
+ temp_normals[i0].y = -dx;
+ }
+
+ for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++)
+ {
+ // Average normals
+ const ImVec2& n0 = temp_normals[i0];
+ const ImVec2& n1 = temp_normals[i1];
+ float dm_x = (n0.x + n1.x) * 0.5f;
+ float dm_y = (n0.y + n1.y) * 0.5f;
+ IM_FIXNORMAL2F(dm_x, dm_y);
+ dm_x *= AA_SIZE * 0.5f;
+ dm_y *= AA_SIZE * 0.5f;
+
+ // Add vertices
+ _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner
+ _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer
+ _VtxWritePtr += 2;
+
+ // Add indexes for fringes
+ _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1));
+ _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1));
+ _IdxWritePtr += 6;
+ }
+ _VtxCurrentIdx += (ImDrawIdx)vtx_count;
+ }
+ else
+ {
+ // Non Anti-aliased Fill
+ const int idx_count = (points_count - 2) * 3;
+ const int vtx_count = points_count;
+ PrimReserve(idx_count, vtx_count);
+ for (int i = 0; i < vtx_count; i++)
+ {
+ _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
+ _VtxWritePtr++;
+ }
+ _Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2));
+ triangulator.Init(points, points_count, _Data->TempBuffer.Data);
+ while (triangulator._TrianglesLeft > 0)
+ {
+ triangulator.GetNextTriangle(triangle);
+ _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx + triangle[0]); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + triangle[1]); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + triangle[2]);
+ _IdxWritePtr += 3;
+ }
+ _VtxCurrentIdx += (ImDrawIdx)vtx_count;
+ }
+}
//-----------------------------------------------------------------------------
// [SECTION] ImDrawListSplitter
@@ -1805,6 +2216,69 @@ void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx)
// [SECTION] ImDrawData
//-----------------------------------------------------------------------------
+void ImDrawData::Clear()
+{
+ Valid = false;
+ CmdListsCount = TotalIdxCount = TotalVtxCount = 0;
+ CmdLists.resize(0); // The ImDrawList are NOT owned by ImDrawData but e.g. by ImGuiContext, so we don't clear them.
+ DisplayPos = DisplaySize = FramebufferScale = ImVec2(0.0f, 0.0f);
+ OwnerViewport = NULL;
+}
+
+// Important: 'out_list' is generally going to be draw_data->CmdLists, but may be another temporary list
+// as long at it is expected that the result will be later merged into draw_data->CmdLists[].
+void ImGui::AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector<ImDrawList*>* out_list, ImDrawList* draw_list)
+{
+ if (draw_list->CmdBuffer.Size == 0)
+ return;
+ if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL)
+ return;
+
+ // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc.
+ // May trigger for you if you are using PrimXXX functions incorrectly.
+ IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size);
+ IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size);
+ if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset))
+ IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size);
+
+ // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window)
+ // If this assert triggers because you are drawing lots of stuff manually:
+ // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds.
+ // Be mindful that the lower-level ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents.
+ // - If you want large meshes with more than 64K vertices, you can either:
+ // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'.
+ // Most example backends already support this from 1.71. Pre-1.71 backends won't.
+ // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them.
+ // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h.
+ // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time:
+ // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
+ // Your own engine or render API may use different parameters or function calls to specify index sizes.
+ // 2 and 4 bytes indices are generally supported by most graphics API.
+ // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching
+ // the 64K limit to split your draw commands in multiple draw lists.
+ if (sizeof(ImDrawIdx) == 2)
+ IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above");
+
+ // Resolve callback data pointers
+ if (draw_list->_CallbacksDataBuf.Size > 0)
+ for (ImDrawCmd& cmd : draw_list->CmdBuffer)
+ if (cmd.UserCallback != NULL && cmd.UserCallbackDataOffset != -1 && cmd.UserCallbackDataSize > 0)
+ cmd.UserCallbackData = draw_list->_CallbacksDataBuf.Data + cmd.UserCallbackDataOffset;
+
+ // Add to output list + records state in ImDrawData
+ out_list->push_back(draw_list);
+ draw_data->CmdListsCount++;
+ draw_data->TotalVtxCount += draw_list->VtxBuffer.Size;
+ draw_data->TotalIdxCount += draw_list->IdxBuffer.Size;
+}
+
+void ImDrawData::AddDrawList(ImDrawList* draw_list)
+{
+ IM_ASSERT(CmdLists.Size == CmdListsCount);
+ draw_list->_PopUnusedDrawCmd();
+ ImGui::AddDrawListToDrawDataEx(this, &CmdLists, draw_list);
+}
+
// For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
void ImDrawData::DeIndexAllBuffers()
{
@@ -1829,15 +2303,9 @@ void ImDrawData::DeIndexAllBuffers()
// or if there is a difference between your window resolution and framebuffer resolution.
void ImDrawData::ScaleClipRects(const ImVec2& fb_scale)
{
- for (int i = 0; i < CmdListsCount; i++)
- {
- ImDrawList* cmd_list = CmdLists[i];
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i];
- cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y);
- }
- }
+ for (ImDrawList* draw_list : CmdLists)
+ for (ImDrawCmd& cmd : draw_list->CmdBuffer)
+ cmd.ClipRect = ImVec4(cmd.ClipRect.x * fb_scale.x, cmd.ClipRect.y * fb_scale.y, cmd.ClipRect.z * fb_scale.x, cmd.ClipRect.w * fb_scale.y);
}
//-----------------------------------------------------------------------------
@@ -1893,6 +2361,14 @@ void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int ve
}
}
+void ImGui::ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out)
+{
+ ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx;
+ ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx;
+ for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex)
+ vertex->pos = ImRotate(vertex->pos- pivot_in, cos_a, sin_a) + pivot_out;
+}
+
//-----------------------------------------------------------------------------
// [SECTION] ImFontConfig
//-----------------------------------------------------------------------------
@@ -1901,16 +2377,49 @@ ImFontConfig::ImFontConfig()
{
memset(this, 0, sizeof(*this));
FontDataOwnedByAtlas = true;
- OversampleH = 3; // FIXME: 2 may be a better default?
- OversampleV = 1;
+ OversampleH = 0; // Auto == 1 or 2 depending on size
+ OversampleV = 0; // Auto == 1
GlyphMaxAdvanceX = FLT_MAX;
RasterizerMultiply = 1.0f;
- EllipsisChar = (ImWchar)-1;
+ RasterizerDensity = 1.0f;
+ EllipsisChar = 0;
}
//-----------------------------------------------------------------------------
// [SECTION] ImFontAtlas
//-----------------------------------------------------------------------------
+// - Default texture data encoded in ASCII
+// - ImFontAtlas::ClearInputData()
+// - ImFontAtlas::ClearTexData()
+// - ImFontAtlas::ClearFonts()
+// - ImFontAtlas::Clear()
+// - ImFontAtlas::GetTexDataAsAlpha8()
+// - ImFontAtlas::GetTexDataAsRGBA32()
+// - ImFontAtlas::AddFont()
+// - ImFontAtlas::AddFontDefault()
+// - ImFontAtlas::AddFontFromFileTTF()
+// - ImFontAtlas::AddFontFromMemoryTTF()
+// - ImFontAtlas::AddFontFromMemoryCompressedTTF()
+// - ImFontAtlas::AddFontFromMemoryCompressedBase85TTF()
+// - ImFontAtlas::AddCustomRectRegular()
+// - ImFontAtlas::AddCustomRectFontGlyph()
+// - ImFontAtlas::CalcCustomRectUV()
+// - ImFontAtlasGetMouseCursorTexData()
+// - ImFontAtlas::Build()
+// - ImFontAtlasBuildMultiplyCalcLookupTable()
+// - ImFontAtlasBuildMultiplyRectAlpha8()
+// - ImFontAtlasBuildWithStbTruetype()
+// - ImFontAtlasGetBuilderForStbTruetype()
+// - ImFontAtlasUpdateSourcesPointers()
+// - ImFontAtlasBuildSetupFont()
+// - ImFontAtlasBuildPackCustomRects()
+// - ImFontAtlasBuildRender8bppRectFromString()
+// - ImFontAtlasBuildRender32bppRectFromString()
+// - ImFontAtlasBuildRenderDefaultTexData()
+// - ImFontAtlasBuildRenderLinesTexData()
+// - ImFontAtlasBuildInit()
+// - ImFontAtlasBuildFinish()
+//-----------------------------------------------------------------------------
// A work of art lies ahead! (. = white layer, X = black layer, others are blank)
// The 2x2 white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes.
@@ -1959,6 +2468,8 @@ static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_COUNT][3
{ ImVec2(73,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNESW
{ ImVec2(55,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNWSE
{ ImVec2(91,0), ImVec2(17,22), ImVec2( 5, 0) }, // ImGuiMouseCursor_Hand
+ { ImVec2(0,3), ImVec2(12,19), ImVec2(0, 0) }, // ImGuiMouseCursor_Wait // Arrow + custom code in ImGui::RenderMouseCursor()
+ { ImVec2(0,3), ImVec2(12,19), ImVec2(0, 0) }, // ImGuiMouseCursor_Progress // Arrow + custom code in ImGui::RenderMouseCursor()
{ ImVec2(109,0),ImVec2(13,15), ImVec2( 6, 7) }, // ImGuiMouseCursor_NotAllowed
};
@@ -1978,21 +2489,21 @@ ImFontAtlas::~ImFontAtlas()
void ImFontAtlas::ClearInputData()
{
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
- for (int i = 0; i < ConfigData.Size; i++)
- if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas)
+ for (ImFontConfig& font_cfg : Sources)
+ if (font_cfg.FontData && font_cfg.FontDataOwnedByAtlas)
{
- IM_FREE(ConfigData[i].FontData);
- ConfigData[i].FontData = NULL;
+ IM_FREE(font_cfg.FontData);
+ font_cfg.FontData = NULL;
}
// When clearing this we lose access to the font name and other information used to build the font.
- for (int i = 0; i < Fonts.Size; i++)
- if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size)
+ for (ImFont* font : Fonts)
+ if (font->Sources >= Sources.Data && font->Sources < Sources.Data + Sources.Size)
{
- Fonts[i]->ConfigData = NULL;
- Fonts[i]->ConfigDataCount = 0;
+ font->Sources = NULL;
+ font->SourcesCount = 0;
}
- ConfigData.clear();
+ Sources.clear();
CustomRects.clear();
PackIdMouseCursors = PackIdLines = -1;
// Important: we leave TexReady untouched
@@ -2014,6 +2525,7 @@ void ImFontAtlas::ClearTexData()
void ImFontAtlas::ClearFonts()
{
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
+ ClearInputData();
Fonts.clear_delete();
TexReady = false;
}
@@ -2065,16 +2577,17 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
{
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
- IM_ASSERT(font_cfg->SizePixels > 0.0f);
+ IM_ASSERT(font_cfg->SizePixels > 0.0f && "Is ImFontConfig struct correctly initialized?");
+ IM_ASSERT(font_cfg->RasterizerDensity > 0.0f && "Is ImFontConfig struct correctly initialized?");
// Create new font
if (!font_cfg->MergeMode)
Fonts.push_back(IM_NEW(ImFont));
else
- IM_ASSERT(!Fonts.empty() && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font.
+ IM_ASSERT(Fonts.Size > 0 && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font.
- ConfigData.push_back(*font_cfg);
- ImFontConfig& new_font_cfg = ConfigData.back();
+ Sources.push_back(*font_cfg);
+ ImFontConfig& new_font_cfg = Sources.back();
if (new_font_cfg.DstFont == NULL)
new_font_cfg.DstFont = Fonts.back();
if (!new_font_cfg.FontDataOwnedByAtlas)
@@ -2084,8 +2597,14 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize);
}
- if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1)
- new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar;
+ // Round font size
+ // - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet.
+ // - Note that using io.FontGlobalScale or SetWindowFontScale(), with are legacy-ish, partially supported features, can still lead to unrounded sizes.
+ // - We may support it better later and remove this rounding.
+ new_font_cfg.SizePixels = ImTrunc(new_font_cfg.SizePixels);
+
+ // Pointers to Sources data are otherwise dangling
+ ImFontAtlasUpdateSourcesPointers(this);
// Invalidate texture
TexReady = false;
@@ -2096,7 +2615,6 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
// Default font TTF is compressed with stb_compress then base85 encoded (see misc/fonts/binary_to_compressed_c.cpp for encoder)
static unsigned int stb_decompress_length(const unsigned char* input);
static unsigned int stb_decompress(unsigned char* output, const unsigned char* input, unsigned int length);
-static const char* GetDefaultCompressedFontDataTTFBase85();
static unsigned int Decode85Byte(char c) { return c >= '\\' ? c-36 : c-35; }
static void Decode85(const unsigned char* src, unsigned char* dst)
{
@@ -2108,10 +2626,14 @@ static void Decode85(const unsigned char* src, unsigned char* dst)
dst += 4;
}
}
+#ifndef IMGUI_DISABLE_DEFAULT_FONT
+static const char* GetDefaultCompressedFontDataTTF(int* out_size);
+#endif
// Load embedded ProggyClean.ttf at size 13, disable oversampling
ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template)
{
+#ifndef IMGUI_DISABLE_DEFAULT_FONT
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
if (!font_cfg_template)
{
@@ -2123,12 +2645,18 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template)
if (font_cfg.Name[0] == '\0')
ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels);
font_cfg.EllipsisChar = (ImWchar)0x0085;
- font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units
+ font_cfg.GlyphOffset.y = 1.0f * IM_TRUNC(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units
- const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85();
+ int ttf_compressed_size = 0;
+ const char* ttf_compressed = GetDefaultCompressedFontDataTTF(&ttf_compressed_size);
const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault();
- ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, glyph_ranges);
+ ImFont* font = AddFontFromMemoryCompressedTTF(ttf_compressed, ttf_compressed_size, font_cfg.SizePixels, &font_cfg, glyph_ranges);
return font;
+#else
+ IM_ASSERT(0 && "AddFontDefault() disabled in this build.");
+ IM_UNUSED(font_cfg_template);
+ return NULL;
+#endif // #ifndef IMGUI_DISABLE_DEFAULT_FONT
}
ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)
@@ -2146,20 +2674,21 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels,
{
// Store a short copy of filename into into the font name for convenience
const char* p;
- for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {}
+ for (p = filename + ImStrlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {}
ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "%s, %.0fpx", p, size_pixels);
}
return AddFontFromMemoryTTF(data, (int)data_size, size_pixels, &font_cfg, glyph_ranges);
}
// NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build().
-ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)
+ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)
{
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
IM_ASSERT(font_cfg.FontData == NULL);
- font_cfg.FontData = ttf_data;
- font_cfg.FontDataSize = ttf_size;
+ IM_ASSERT(font_data_size > 100 && "Incorrect value for font_data_size!"); // Heuristic to prevent accidentally passing a wrong value to font_data_size.
+ font_cfg.FontData = font_data;
+ font_cfg.FontDataSize = font_data_size;
font_cfg.SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg.SizePixels;
if (glyph_ranges)
font_cfg.GlyphRanges = glyph_ranges;
@@ -2180,7 +2709,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)
{
- int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
+ int compressed_ttf_size = (((int)ImStrlen(compressed_ttf_data_base85) + 4) / 5) * 4;
void* compressed_ttf = IM_ALLOC((size_t)compressed_ttf_size);
Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);
ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
@@ -2211,6 +2740,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int
r.Width = (unsigned short)width;
r.Height = (unsigned short)height;
r.GlyphID = id;
+ r.GlyphColored = 0; // Set to 1 manually to mark glyph as colored // FIXME: No official API for that (#8133)
r.GlyphAdvanceX = advance_x;
r.GlyphOffset = offset;
r.Font = font;
@@ -2226,24 +2756,24 @@ void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* ou
*out_uv_max = ImVec2((float)(rect->X + rect->Width) * TexUvScale.x, (float)(rect->Y + rect->Height) * TexUvScale.y);
}
-bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2])
+bool ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2])
{
if (cursor_type <= ImGuiMouseCursor_None || cursor_type >= ImGuiMouseCursor_COUNT)
return false;
- if (Flags & ImFontAtlasFlags_NoMouseCursors)
+ if (atlas->Flags & ImFontAtlasFlags_NoMouseCursors)
return false;
- IM_ASSERT(PackIdMouseCursors != -1);
- ImFontAtlasCustomRect* r = GetCustomRectByIndex(PackIdMouseCursors);
+ IM_ASSERT(atlas->PackIdMouseCursors != -1);
+ ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdMouseCursors);
ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r->X, (float)r->Y);
ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1];
*out_size = size;
*out_offset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][2];
- out_uv_border[0] = (pos) * TexUvScale;
- out_uv_border[1] = (pos + size) * TexUvScale;
+ out_uv_border[0] = (pos) * atlas->TexUvScale;
+ out_uv_border[1] = (pos + size) * atlas->TexUvScale;
pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W + 1;
- out_uv_fill[0] = (pos) * TexUvScale;
- out_uv_fill[1] = (pos + size) * TexUvScale;
+ out_uv_fill[0] = (pos) * atlas->TexUvScale;
+ out_uv_fill[1] = (pos + size) * atlas->TexUvScale;
return true;
}
@@ -2252,7 +2782,7 @@ bool ImFontAtlas::Build()
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
// Default font is none are specified
- if (ConfigData.Size == 0)
+ if (Sources.Size == 0)
AddFontDefault();
// Select builder
@@ -2294,6 +2824,13 @@ void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsig
*data = table[*data];
}
+void ImFontAtlasBuildGetOversampleFactors(const ImFontConfig* src, int* out_oversample_h, int* out_oversample_v)
+{
+ // Automatically disable horizontal oversampling over size 36
+ *out_oversample_h = (src->OversampleH != 0) ? src->OversampleH : (src->SizePixels * src->RasterizerDensity > 36.0f || src->PixelSnapH) ? 1 : 2;
+ *out_oversample_v = (src->OversampleV != 0) ? src->OversampleV : 1;
+}
+
#ifdef IMGUI_ENABLE_STB_TRUETYPE
// Temporary data for one source font (multiple source fonts can be merged into one destination ImFont)
// (C++03 doesn't allow instancing ImVector<> with function-local types so we declare the type here.)
@@ -2334,7 +2871,7 @@ static void UnpackBitVectorToFlatIndexList(const ImBitVector* in, ImVector<int>*
static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
{
- IM_ASSERT(atlas->ConfigData.Size > 0);
+ IM_ASSERT(atlas->Sources.Size > 0);
ImFontAtlasBuildInit(atlas);
@@ -2348,39 +2885,48 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
// Temporary storage for building
ImVector<ImFontBuildSrcData> src_tmp_array;
ImVector<ImFontBuildDstData> dst_tmp_array;
- src_tmp_array.resize(atlas->ConfigData.Size);
+ src_tmp_array.resize(atlas->Sources.Size);
dst_tmp_array.resize(atlas->Fonts.Size);
memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes());
memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes());
// 1. Initialize font loading structure, check font data validity
- for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++)
+ for (int src_i = 0; src_i < atlas->Sources.Size; src_i++)
{
ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
- ImFontConfig& cfg = atlas->ConfigData[src_i];
- IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas));
+ ImFontConfig& src = atlas->Sources[src_i];
+ IM_ASSERT(src.DstFont && (!src.DstFont->IsLoaded() || src.DstFont->ContainerAtlas == atlas));
- // Find index from cfg.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices)
+ // Find index from src.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices)
src_tmp.DstIndex = -1;
for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++)
- if (cfg.DstFont == atlas->Fonts[output_i])
+ if (src.DstFont == atlas->Fonts[output_i])
src_tmp.DstIndex = output_i;
if (src_tmp.DstIndex == -1)
{
- IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array?
+ IM_ASSERT(src_tmp.DstIndex != -1); // src.DstFont not pointing within atlas->Fonts[] array?
return false;
}
// Initialize helper structure for font loading and verify that the TTF/OTF data is correct
- const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo);
+ const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)src.FontData, src.FontNo);
IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found.");
- if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset))
+ if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)src.FontData, font_offset))
+ {
+ IM_ASSERT(0 && "stbtt_InitFont(): failed to parse FontData. It is correct and complete? Check FontDataSize.");
return false;
+ }
// Measure highest codepoints
ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex];
- src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault();
+ src_tmp.SrcRanges = src.GlyphRanges ? src.GlyphRanges : atlas->GetGlyphRangesDefault();
for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2)
+ {
+ // Check for valid range. This may also help detect *some* dangling pointers, because a common
+ // user error is to setup ImFontConfig::GlyphRanges with a pointer to data that isn't persistent,
+ // or to forget to zero-terminate the glyph range array.
+ IM_ASSERT(src_range[0] <= src_range[1] && "Invalid range: is your glyph range array persistent? it is zero-terminated?");
src_tmp.GlyphsHighest = ImMax(src_tmp.GlyphsHighest, (int)src_range[1]);
+ }
dst_tmp.SrcCount++;
dst_tmp.GlyphsHighest = ImMax(dst_tmp.GlyphsHighest, src_tmp.GlyphsHighest);
}
@@ -2438,6 +2984,7 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
int total_surface = 0;
int buf_rects_out_n = 0;
int buf_packedchars_out_n = 0;
+ const int pack_padding = atlas->TexGlyphPadding;
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
{
ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
@@ -2449,30 +2996,35 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
buf_rects_out_n += src_tmp.GlyphsCount;
buf_packedchars_out_n += src_tmp.GlyphsCount;
+ // Automatic selection of oversampling parameters
+ ImFontConfig& src = atlas->Sources[src_i];
+ int oversample_h, oversample_v;
+ ImFontAtlasBuildGetOversampleFactors(&src, &oversample_h, &oversample_v);
+
// Convert our ranges in the format stb_truetype wants
- ImFontConfig& cfg = atlas->ConfigData[src_i];
- src_tmp.PackRange.font_size = cfg.SizePixels;
+ src_tmp.PackRange.font_size = src.SizePixels * src.RasterizerDensity;
src_tmp.PackRange.first_unicode_codepoint_in_range = 0;
src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data;
src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size;
src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars;
- src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH;
- src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV;
+ src_tmp.PackRange.h_oversample = (unsigned char)oversample_h;
+ src_tmp.PackRange.v_oversample = (unsigned char)oversample_v;
// Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects)
- const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels);
- const int padding = atlas->TexGlyphPadding;
+ const float scale = (src.SizePixels > 0.0f) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, src.SizePixels * src.RasterizerDensity) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -src.SizePixels * src.RasterizerDensity);
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++)
{
int x0, y0, x1, y1;
const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]);
IM_ASSERT(glyph_index_in_font != 0);
- stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * cfg.OversampleH, scale * cfg.OversampleV, 0, 0, &x0, &y0, &x1, &y1);
- src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + padding + cfg.OversampleH - 1);
- src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + padding + cfg.OversampleV - 1);
+ stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * oversample_h, scale * oversample_v, 0, 0, &x0, &y0, &x1, &y1);
+ src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + pack_padding + oversample_h - 1);
+ src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + pack_padding + oversample_v - 1);
total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h;
}
}
+ for (int i = 0; i < atlas->CustomRects.Size; i++)
+ total_surface += (atlas->CustomRects[i].Width + pack_padding) * (atlas->CustomRects[i].Height + pack_padding);
// We need a width for the skyline algorithm, any width!
// The exact width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height.
@@ -2488,7 +3040,8 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
// Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values).
const int TEX_HEIGHT_MAX = 1024 * 32;
stbtt_pack_context spc = {};
- stbtt_PackBegin(&spc, NULL, atlas->TexWidth, TEX_HEIGHT_MAX, 0, atlas->TexGlyphPadding, NULL);
+ stbtt_PackBegin(&spc, NULL, atlas->TexWidth, TEX_HEIGHT_MAX, 0, 0, NULL);
+ spc.padding = atlas->TexGlyphPadding; // Because we mixup stbtt_PackXXX and stbrp_PackXXX there's a bit of a hack here, not passing the value to stbtt_PackBegin() allows us to still pack a TexWidth-1 wide item. (#8107)
ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info);
// 6. Pack each source font. No rendering yet, we are working with rectangles in an infinitely tall texture at this point.
@@ -2518,7 +3071,7 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
// 8. Render/rasterize font characters into the texture
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
{
- ImFontConfig& cfg = atlas->ConfigData[src_i];
+ ImFontConfig& src = atlas->Sources[src_i];
ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
if (src_tmp.GlyphsCount == 0)
continue;
@@ -2526,10 +3079,10 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
stbtt_PackFontRangesRenderIntoRects(&spc, &src_tmp.FontInfo, &src_tmp.PackRange, 1, src_tmp.Rects);
// Apply multiply operator
- if (cfg.RasterizerMultiply != 1.0f)
+ if (src.RasterizerMultiply != 1.0f)
{
unsigned char multiply_table[256];
- ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply);
+ ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, src.RasterizerMultiply);
stbrp_rect* r = &src_tmp.Rects[0];
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++, r++)
if (r->was_packed)
@@ -2545,25 +3098,24 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
// 9. Setup ImFont and glyphs for runtime
for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
{
- ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
- if (src_tmp.GlyphsCount == 0)
- continue;
-
// When merging fonts with MergeMode=true:
// - We can have multiple input fonts writing into a same destination font.
- // - dst_font->ConfigData is != from cfg which is our source configuration.
- ImFontConfig& cfg = atlas->ConfigData[src_i];
- ImFont* dst_font = cfg.DstFont;
+ // - dst_font->Sources is != from src which is our source configuration.
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ ImFontConfig& src = atlas->Sources[src_i];
+ ImFont* dst_font = src.DstFont;
- const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels);
+ const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, src.SizePixels);
int unscaled_ascent, unscaled_descent, unscaled_line_gap;
stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap);
- const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1));
- const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1));
- ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent);
- const float font_off_x = cfg.GlyphOffset.x;
- const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent);
+ const float ascent = ImCeil(unscaled_ascent * font_scale);
+ const float descent = ImFloor(unscaled_descent * font_scale);
+ ImFontAtlasBuildSetupFont(atlas, dst_font, &src, ascent, descent);
+ const float font_off_x = src.GlyphOffset.x;
+ const float font_off_y = src.GlyphOffset.y + IM_ROUND(dst_font->Ascent);
+
+ const float inv_rasterization_scale = 1.0f / src.RasterizerDensity;
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
{
@@ -2573,7 +3125,11 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
stbtt_aligned_quad q;
float unused_x = 0.0f, unused_y = 0.0f;
stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0);
- dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance);
+ float x0 = q.x0 * inv_rasterization_scale + font_off_x;
+ float y0 = q.y0 * inv_rasterization_scale + font_off_y;
+ float x1 = q.x1 * inv_rasterization_scale + font_off_x;
+ float y1 = q.y1 * inv_rasterization_scale + font_off_y;
+ dst_font->AddGlyph(&src, (ImWchar)codepoint, x0, y0, x1, y1, q.s0, q.t0, q.s1, q.t1, pc.xadvance * inv_rasterization_scale);
}
}
@@ -2593,19 +3149,31 @@ const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype()
#endif // IMGUI_ENABLE_STB_TRUETYPE
+void ImFontAtlasUpdateSourcesPointers(ImFontAtlas* atlas)
+{
+ for (ImFontConfig& src : atlas->Sources)
+ {
+ ImFont* font = src.DstFont;
+ if (!src.MergeMode)
+ {
+ font->Sources = &src;
+ font->SourcesCount = 0;
+ }
+ font->SourcesCount++;
+ }
+}
+
void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent)
{
if (!font_config->MergeMode)
{
font->ClearOutputData();
font->FontSize = font_config->SizePixels;
- font->ConfigData = font_config;
- font->ConfigDataCount = 0;
+ IM_ASSERT(font->Sources == font_config);
font->ContainerAtlas = atlas;
font->Ascent = ascent;
font->Descent = descent;
}
- font->ConfigDataCount++;
}
void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque)
@@ -2615,14 +3183,18 @@ void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opa
ImVector<ImFontAtlasCustomRect>& user_rects = atlas->CustomRects;
IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong.
+#ifdef __GNUC__
+ if (user_rects.Size < 1) { __builtin_unreachable(); } // Workaround for GCC bug if IM_ASSERT() is defined to conditionally throw (see #5343)
+#endif
+ const int pack_padding = atlas->TexGlyphPadding;
ImVector<stbrp_rect> pack_rects;
pack_rects.resize(user_rects.Size);
memset(pack_rects.Data, 0, (size_t)pack_rects.size_in_bytes());
for (int i = 0; i < user_rects.Size; i++)
{
- pack_rects[i].w = user_rects[i].Width;
- pack_rects[i].h = user_rects[i].Height;
+ pack_rects[i].w = user_rects[i].Width + pack_padding;
+ pack_rects[i].h = user_rects[i].Height + pack_padding;
}
stbrp_pack_rects(pack_context, &pack_rects[0], pack_rects.Size);
for (int i = 0; i < pack_rects.Size; i++)
@@ -2630,7 +3202,7 @@ void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opa
{
user_rects[i].X = (unsigned short)pack_rects[i].x;
user_rects[i].Y = (unsigned short)pack_rects[i].y;
- IM_ASSERT(pack_rects[i].w == user_rects[i].Width && pack_rects[i].h == user_rects[i].Height);
+ IM_ASSERT(pack_rects[i].w == user_rects[i].Width + pack_padding && pack_rects[i].h == user_rects[i].Height + pack_padding);
atlas->TexHeight = ImMax(atlas->TexHeight, pack_rects[i].y + pack_rects[i].h);
}
}
@@ -2661,35 +3233,35 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas)
IM_ASSERT(r->IsPacked());
const int w = atlas->TexWidth;
- if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors))
+ if (atlas->Flags & ImFontAtlasFlags_NoMouseCursors)
{
- // Render/copy pixels
- IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H);
- const int x_for_white = r->X;
- const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1;
+ // White pixels only
+ IM_ASSERT(r->Width == 2 && r->Height == 2);
+ const int offset = (int)r->X + (int)r->Y * w;
if (atlas->TexPixelsAlpha8 != NULL)
{
- ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', 0xFF);
- ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', 0xFF);
+ atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF;
}
else
{
- ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', IM_COL32_WHITE);
- ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', IM_COL32_WHITE);
+ atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE;
}
}
else
{
- // Render 4 white pixels
- IM_ASSERT(r->Width == 2 && r->Height == 2);
- const int offset = (int)r->X + (int)r->Y * w;
+ // White pixels and mouse cursor
+ IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H);
+ const int x_for_white = r->X;
+ const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1;
if (atlas->TexPixelsAlpha8 != NULL)
{
- atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF;
+ ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', 0xFF);
+ ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', 0xFF);
}
else
{
- atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE;
+ ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', IM_COL32_WHITE);
+ ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', IM_COL32_WHITE);
}
}
atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y);
@@ -2703,38 +3275,38 @@ static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas)
// This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them
ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines);
IM_ASSERT(r->IsPacked());
- for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row
+ for (int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row
{
// Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle
- unsigned int y = n;
- unsigned int line_width = n;
- unsigned int pad_left = (r->Width - line_width) / 2;
- unsigned int pad_right = r->Width - (pad_left + line_width);
+ int y = n;
+ int line_width = n;
+ int pad_left = (r->Width - line_width) / 2;
+ int pad_right = r->Width - (pad_left + line_width);
// Write each slice
IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels
if (atlas->TexPixelsAlpha8 != NULL)
{
unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)];
- for (unsigned int i = 0; i < pad_left; i++)
+ for (int i = 0; i < pad_left; i++)
*(write_ptr + i) = 0x00;
- for (unsigned int i = 0; i < line_width; i++)
+ for (int i = 0; i < line_width; i++)
*(write_ptr + pad_left + i) = 0xFF;
- for (unsigned int i = 0; i < pad_right; i++)
+ for (int i = 0; i < pad_right; i++)
*(write_ptr + pad_left + line_width + i) = 0x00;
}
else
{
unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)];
- for (unsigned int i = 0; i < pad_left; i++)
+ for (int i = 0; i < pad_left; i++)
*(write_ptr + i) = IM_COL32(255, 255, 255, 0);
- for (unsigned int i = 0; i < line_width; i++)
+ for (int i = 0; i < line_width; i++)
*(write_ptr + pad_left + i) = IM_COL32_WHITE;
- for (unsigned int i = 0; i < pad_right; i++)
+ for (int i = 0; i < pad_right; i++)
*(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0);
}
@@ -2782,21 +3354,37 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
if (r->Font == NULL || r->GlyphID == 0)
continue;
- // Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, GlyphExtraSpacing, PixelSnapH
+ // Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, PixelSnapH
IM_ASSERT(r->Font->ContainerAtlas == atlas);
ImVec2 uv0, uv1;
atlas->CalcCustomRectUV(r, &uv0, &uv1);
r->Font->AddGlyph(NULL, (ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX);
+ if (r->GlyphColored)
+ r->Font->Glyphs.back().Colored = 1;
}
// Build all fonts lookup tables
- for (int i = 0; i < atlas->Fonts.Size; i++)
- if (atlas->Fonts[i]->DirtyLookupTables)
- atlas->Fonts[i]->BuildLookupTable();
+ for (ImFont* font : atlas->Fonts)
+ if (font->DirtyLookupTables)
+ font->BuildLookupTable();
atlas->TexReady = true;
}
+//-------------------------------------------------------------------------
+// [SECTION] ImFontAtlas: glyph ranges helpers
+//-------------------------------------------------------------------------
+// - GetGlyphRangesDefault()
+// - GetGlyphRangesGreek()
+// - GetGlyphRangesKorean()
+// - GetGlyphRangesChineseFull()
+// - GetGlyphRangesChineseSimplifiedCommon()
+// - GetGlyphRangesJapanese()
+// - GetGlyphRangesCyrillic()
+// - GetGlyphRangesThai()
+// - GetGlyphRangesVietnamese()
+//-----------------------------------------------------------------------------
+
// Retrieve list of range (2 int per range, values are inclusive)
const ImWchar* ImFontAtlas::GetGlyphRangesDefault()
{
@@ -2858,10 +3446,6 @@ static void UnpackAccumulativeOffsetsIntoRanges(int base_codepoint, const short*
out_ranges[0] = 0;
}
-//-------------------------------------------------------------------------
-// [SECTION] ImFontAtlas glyph ranges helpers
-//-------------------------------------------------------------------------
-
const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon()
{
// Store 2500 regularly used characters for Simplified Chinese.
@@ -2935,19 +3519,19 @@ const ImWchar* ImFontAtlas::GetGlyphRangesJapanese()
// 2999 ideograms code points for Japanese
// - 2136 Joyo (meaning "for regular use" or "for common use") Kanji code points
// - 863 Jinmeiyo (meaning "for personal name") Kanji code points
- // - Sourced from the character information database of the Information-technology Promotion Agency, Japan
- // - https://mojikiban.ipa.go.jp/mji/
- // - Available under the terms of the Creative Commons Attribution-ShareAlike 2.1 Japan (CC BY-SA 2.1 JP).
- // - https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en
- // - https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode
- // - You can generate this code by the script at:
- // - https://github.com/vaiorabbit/everyday_use_kanji
+ // - Sourced from official information provided by the government agencies of Japan:
+ // - List of Joyo Kanji by the Agency for Cultural Affairs
+ // - https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kijun/naikaku/kanji/
+ // - List of Jinmeiyo Kanji by the Ministry of Justice
+ // - http://www.moj.go.jp/MINJI/minji86.html
+ // - Available under the terms of the Creative Commons Attribution 4.0 International (CC BY 4.0).
+ // - https://creativecommons.org/licenses/by/4.0/legalcode
+ // - You can generate this code by the script at:
+ // - https://github.com/vaiorabbit/everyday_use_kanji
// - References:
// - List of Joyo Kanji
- // - (Official list by the Agency for Cultural Affairs) https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kakuki/14/tosin02/index.html
// - (Wikipedia) https://en.wikipedia.org/wiki/List_of_j%C5%8Dy%C5%8D_kanji
// - List of Jinmeiyo Kanji
- // - (Official list by the Ministry of Justice) http://www.moj.go.jp/MINJI/minji86.html
// - (Wikipedia) https://en.wikipedia.org/wiki/Jinmeiy%C5%8D_kanji
// - Missing 1 Joyo Kanji: U+20B9F (Kun'yomi: Shikaru, On'yomi: Shitsu,shichi), see https://github.com/ocornut/imgui/pull/3627 for details.
// You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters.
@@ -3106,20 +3690,8 @@ void ImFontGlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges)
ImFont::ImFont()
{
- FontSize = 0.0f;
- FallbackAdvanceX = 0.0f;
- FallbackChar = (ImWchar)-1;
- EllipsisChar = (ImWchar)-1;
- DotChar = (ImWchar)-1;
- FallbackGlyph = NULL;
- ContainerAtlas = NULL;
- ConfigData = NULL;
- ConfigDataCount = 0;
- DirtyLookupTables = false;
+ memset(this, 0, sizeof(*this));
Scale = 1.0f;
- Ascent = Descent = 0.0f;
- MetricsTotalSurface = 0;
- memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap));
}
ImFont::~ImFont()
@@ -3139,6 +3711,7 @@ void ImFont::ClearOutputData()
DirtyLookupTables = true;
Ascent = Descent = 0.0f;
MetricsTotalSurface = 0;
+ memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
}
static ImWchar FindFirstExistingGlyph(ImFont* font, const ImWchar* candidate_chars, int candidate_chars_count)
@@ -3146,7 +3719,7 @@ static ImWchar FindFirstExistingGlyph(ImFont* font, const ImWchar* candidate_cha
for (int n = 0; n < candidate_chars_count; n++)
if (font->FindGlyphNoFallback(candidate_chars[n]) != NULL)
return candidate_chars[n];
- return (ImWchar)-1;
+ return 0;
}
void ImFont::BuildLookupTable()
@@ -3156,21 +3729,22 @@ void ImFont::BuildLookupTable()
max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint);
// Build lookup table
+ IM_ASSERT(Glyphs.Size > 0 && "Font has not loaded glyph!");
IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved
IndexAdvanceX.clear();
IndexLookup.clear();
DirtyLookupTables = false;
- memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap));
+ memset(Used8kPagesMap, 0, sizeof(Used8kPagesMap));
GrowIndex(max_codepoint + 1);
for (int i = 0; i < Glyphs.Size; i++)
{
int codepoint = (int)Glyphs[i].Codepoint;
IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX;
- IndexLookup[codepoint] = (ImWchar)i;
+ IndexLookup[codepoint] = (ImU16)i;
// Mark 4K page as used
- const int page_n = codepoint / 4096;
- Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7);
+ const int page_n = codepoint / 8192;
+ Used8kPagesMap[page_n >> 3] |= 1 << (page_n & 7);
}
// Create a glyph to handle TAB
@@ -3184,24 +3758,16 @@ void ImFont::BuildLookupTable()
tab_glyph.Codepoint = '\t';
tab_glyph.AdvanceX *= IM_TABSIZE;
IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX;
- IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size - 1);
+ IndexLookup[(int)tab_glyph.Codepoint] = (ImU16)(Glyphs.Size - 1);
}
// Mark special glyphs as not visible (note that AddGlyph already mark as non-visible glyphs with zero-size polygons)
- SetGlyphVisible((ImWchar)' ', false);
- SetGlyphVisible((ImWchar)'\t', false);
-
- // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis).
- // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character.
- // FIXME: Note that 0x2026 is rarely included in our font ranges. Because of this we are more likely to use three individual dots.
- const ImWchar ellipsis_chars[] = { (ImWchar)0x2026, (ImWchar)0x0085 };
- const ImWchar dots_chars[] = { (ImWchar)'.', (ImWchar)0xFF0E };
- if (EllipsisChar == (ImWchar)-1)
- EllipsisChar = FindFirstExistingGlyph(this, ellipsis_chars, IM_ARRAYSIZE(ellipsis_chars));
- if (DotChar == (ImWchar)-1)
- DotChar = FindFirstExistingGlyph(this, dots_chars, IM_ARRAYSIZE(dots_chars));
+ if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)' '))
+ glyph->Visible = false;
+ if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)'\t'))
+ glyph->Visible = false;
- // Setup fallback character
+ // Setup Fallback character
const ImWchar fallback_chars[] = { (ImWchar)IM_UNICODE_CODEPOINT_INVALID, (ImWchar)'?', (ImWchar)' ' };
FallbackGlyph = FindGlyphNoFallback(FallbackChar);
if (FallbackGlyph == NULL)
@@ -3214,68 +3780,84 @@ void ImFont::BuildLookupTable()
FallbackChar = (ImWchar)FallbackGlyph->Codepoint;
}
}
-
FallbackAdvanceX = FallbackGlyph->AdvanceX;
for (int i = 0; i < max_codepoint + 1; i++)
if (IndexAdvanceX[i] < 0.0f)
IndexAdvanceX[i] = FallbackAdvanceX;
+
+ // Setup Ellipsis character. It is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis).
+ // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character.
+ // FIXME: Note that 0x2026 is rarely included in our font ranges. Because of this we are more likely to use three individual dots.
+ const ImWchar ellipsis_chars[] = { Sources->EllipsisChar, (ImWchar)0x2026, (ImWchar)0x0085 };
+ const ImWchar dots_chars[] = { (ImWchar)'.', (ImWchar)0xFF0E };
+ if (EllipsisChar == 0)
+ EllipsisChar = FindFirstExistingGlyph(this, ellipsis_chars, IM_ARRAYSIZE(ellipsis_chars));
+ const ImWchar dot_char = FindFirstExistingGlyph(this, dots_chars, IM_ARRAYSIZE(dots_chars));
+ if (EllipsisChar != 0)
+ {
+ EllipsisCharCount = 1;
+ EllipsisWidth = EllipsisCharStep = FindGlyph(EllipsisChar)->X1;
+ }
+ else if (dot_char != 0)
+ {
+ const ImFontGlyph* dot_glyph = FindGlyph(dot_char);
+ EllipsisChar = dot_char;
+ EllipsisCharCount = 3;
+ EllipsisCharStep = (float)(int)(dot_glyph->X1 - dot_glyph->X0) + 1.0f;
+ EllipsisWidth = ImMax(dot_glyph->AdvanceX, dot_glyph->X0 + EllipsisCharStep * 3.0f - 1.0f); // FIXME: Slightly odd for normally mono-space fonts but since this is used for trailing contents.
+ }
}
-// API is designed this way to avoid exposing the 4K page size
+// API is designed this way to avoid exposing the 8K page size
// e.g. use with IsGlyphRangeUnused(0, 255)
bool ImFont::IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last)
{
- unsigned int page_begin = (c_begin / 4096);
- unsigned int page_last = (c_last / 4096);
+ unsigned int page_begin = (c_begin / 8192);
+ unsigned int page_last = (c_last / 8192);
for (unsigned int page_n = page_begin; page_n <= page_last; page_n++)
- if ((page_n >> 3) < sizeof(Used4kPagesMap))
- if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7)))
+ if ((page_n >> 3) < sizeof(Used8kPagesMap))
+ if (Used8kPagesMap[page_n >> 3] & (1 << (page_n & 7)))
return false;
return true;
}
-void ImFont::SetGlyphVisible(ImWchar c, bool visible)
-{
- if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)c))
- glyph->Visible = visible ? 1 : 0;
-}
-
void ImFont::GrowIndex(int new_size)
{
IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size);
if (new_size <= IndexLookup.Size)
return;
IndexAdvanceX.resize(new_size, -1.0f);
- IndexLookup.resize(new_size, (ImWchar)-1);
+ IndexLookup.resize(new_size, (ImU16)-1);
}
// x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero.
// Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis).
-// 'cfg' is not necessarily == 'this->ConfigData' because multiple source fonts+configs can be used to build one target font.
-void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x)
+// 'src' is not necessarily == 'this->Sources' because multiple source fonts+configs can be used to build one target font.
+void ImFont::AddGlyph(const ImFontConfig* src, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x)
{
- if (cfg != NULL)
+ if (src != NULL)
{
// Clamp & recenter if needed
const float advance_x_original = advance_x;
- advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX);
+ advance_x = ImClamp(advance_x, src->GlyphMinAdvanceX, src->GlyphMaxAdvanceX);
if (advance_x != advance_x_original)
{
- float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f;
+ float char_off_x = src->PixelSnapH ? ImTrunc((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f;
x0 += char_off_x;
x1 += char_off_x;
}
// Snap to pixel
- if (cfg->PixelSnapH)
+ if (src->PixelSnapH)
advance_x = IM_ROUND(advance_x);
- // Bake spacing
- advance_x += cfg->GlyphExtraSpacing.x;
+ // Bake extra spacing
+ advance_x += src->GlyphExtraAdvanceX;
}
+ int glyph_idx = Glyphs.Size;
Glyphs.resize(Glyphs.Size + 1);
- ImFontGlyph& glyph = Glyphs.back();
+ ImFontGlyph& glyph = Glyphs[glyph_idx];
glyph.Codepoint = (unsigned int)codepoint;
glyph.Visible = (x0 != x1) && (y0 != y1);
glyph.Colored = false;
@@ -3288,6 +3870,7 @@ void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, floa
glyph.U1 = u1;
glyph.V1 = v1;
glyph.AdvanceX = advance_x;
+ IM_ASSERT(Glyphs.Size < 0xFFFF); // IndexLookup[] hold 16-bit values and -1 is reserved.
// Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)
// We use (U1-U0)*TexWidth instead of X1-X0 to account for oversampling.
@@ -3301,37 +3884,38 @@ void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function.
unsigned int index_size = (unsigned int)IndexLookup.Size;
- if (dst < index_size && IndexLookup.Data[dst] == (ImWchar)-1 && !overwrite_dst) // 'dst' already exists
+ if (dst < index_size && IndexLookup.Data[dst] == (ImU16)-1 && !overwrite_dst) // 'dst' already exists
return;
if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op
return;
GrowIndex(dst + 1);
- IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (ImWchar)-1;
+ IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (ImU16)-1;
IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f;
}
-const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const
+// Find glyph, return fallback if missing
+ImFontGlyph* ImFont::FindGlyph(ImWchar c)
{
if (c >= (size_t)IndexLookup.Size)
return FallbackGlyph;
- const ImWchar i = IndexLookup.Data[c];
- if (i == (ImWchar)-1)
+ const ImU16 i = IndexLookup.Data[c];
+ if (i == (ImU16)-1)
return FallbackGlyph;
return &Glyphs.Data[i];
}
-const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const
+ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c)
{
if (c >= (size_t)IndexLookup.Size)
return NULL;
- const ImWchar i = IndexLookup.Data[c];
- if (i == (ImWchar)-1)
+ const ImU16 i = IndexLookup.Data[c];
+ if (i == (ImU16)-1)
return NULL;
return &Glyphs.Data[i];
}
-// Wrapping skips upcoming blanks
+// Trim trailing space and find beginning of next line
static inline const char* CalcWordWrapNextLineStartA(const char* text, const char* text_end)
{
while (text < text_end && ImCharIsBlankA(*text))
@@ -3341,10 +3925,12 @@ static inline const char* CalcWordWrapNextLineStartA(const char* text, const cha
return text;
}
+#define ImFontGetCharAdvanceX(_FONT, _CH) ((int)(_CH) < (_FONT)->IndexAdvanceX.Size ? (_FONT)->IndexAdvanceX.Data[_CH] : (_FONT)->FallbackAdvanceX)
+
// Simple word-wrapping for English, not full-featured. Please submit failing cases!
// This will return the next location to wrap from. If no wrapping if necessary, this will fast-forward to e.g. text_end.
// FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.)
-const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const
+const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width)
{
// For references, possible wrap point marked with ^
// "aaa bbb, ccc,ddd. eee fff. ggg!"
@@ -3367,6 +3953,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
bool inside_word = true;
const char* s = text;
+ IM_ASSERT(text_end != NULL);
while (s < text_end)
{
unsigned int c = (unsigned int)*s;
@@ -3375,8 +3962,6 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
next_s = s + 1;
else
next_s = s + ImTextCharFromUtf8(&c, s, text_end);
- if (c == 0)
- break;
if (c < 32)
{
@@ -3394,7 +3979,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
}
}
- const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX);
+ const float char_width = ImFontGetCharAdvanceX(this, c);
if (ImCharIsBlankW(c))
{
if (inside_word)
@@ -3443,10 +4028,10 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
return s;
}
-ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining) const
+ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining)
{
if (!text_end)
- text_end = text_begin + strlen(text_begin); // FIXME-OPT: Need to avoid this.
+ text_end = text_begin + ImStrlen(text_begin); // FIXME-OPT: Need to avoid this.
const float line_height = size;
const float scale = size / FontSize;
@@ -3482,15 +4067,9 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
const char* prev_s = s;
unsigned int c = (unsigned int)*s;
if (c < 0x80)
- {
s += 1;
- }
else
- {
s += ImTextCharFromUtf8(&c, s, text_end);
- if (c == 0) // Malformed UTF-8?
- break;
- }
if (c < 32)
{
@@ -3505,7 +4084,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
continue;
}
- const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX) * scale;
+ const float char_width = ImFontGetCharAdvanceX(this, c) * scale;
if (line_width + char_width >= max_width)
{
s = prev_s;
@@ -3528,7 +4107,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
}
// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound.
-void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const
+void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c)
{
const ImFontGlyph* glyph = FindGlyph(c);
if (!glyph || !glyph->Visible)
@@ -3536,27 +4115,27 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, Im
if (glyph->Colored)
col |= ~IM_COL32_A_MASK;
float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f;
- float x = IM_FLOOR(pos.x);
- float y = IM_FLOOR(pos.y);
+ float x = IM_TRUNC(pos.x);
+ float y = IM_TRUNC(pos.y);
draw_list->PrimReserve(6, 4);
draw_list->PrimRectUV(ImVec2(x + glyph->X0 * scale, y + glyph->Y0 * scale), ImVec2(x + glyph->X1 * scale, y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col);
}
// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound.
-void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const
+void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip)
{
- if (!text_end)
- text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls.
-
// Align to be pixel perfect
- float x = IM_FLOOR(pos.x);
- float y = IM_FLOOR(pos.y);
+ float x = IM_TRUNC(pos.x);
+ float y = IM_TRUNC(pos.y);
if (y > clip_rect.w)
return;
- const float start_x = x;
+ if (!text_end)
+ text_end = text_begin + ImStrlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls.
+
const float scale = size / FontSize;
const float line_height = FontSize * scale;
+ const float origin_x = x;
const bool word_wrap_enabled = (wrap_width > 0.0f);
// Fast-forward to first visible line
@@ -3564,13 +4143,13 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
if (y + line_height < clip_rect.y)
while (y + line_height < clip_rect.y && s < text_end)
{
- const char* line_end = (const char*)memchr(s, '\n', text_end - s);
+ const char* line_end = (const char*)ImMemchr(s, '\n', text_end - s);
if (word_wrap_enabled)
{
// FIXME-OPT: This is not optimal as do first do a search for \n before calling CalcWordWrapPositionA().
// If the specs for CalcWordWrapPositionA() were reworked to optionally return on \n we could combine both.
// However it is still better than nothing performing the fast-forward!
- s = CalcWordWrapPositionA(scale, s, line_end, wrap_width);
+ s = CalcWordWrapPositionA(scale, s, line_end ? line_end : text_end, wrap_width);
s = CalcWordWrapNextLineStartA(s, text_end);
}
else
@@ -3588,7 +4167,7 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
float y_end = y;
while (y_end < clip_rect.w && s_end < text_end)
{
- s_end = (const char*)memchr(s_end, '\n', text_end - s_end);
+ s_end = (const char*)ImMemchr(s_end, '\n', text_end - s_end);
s_end = s_end ? s_end + 1 : text_end;
y_end += line_height;
}
@@ -3602,10 +4181,9 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
const int idx_count_max = (int)(text_end - s) * 6;
const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max;
draw_list->PrimReserve(idx_count_max, vtx_count_max);
-
- ImDrawVert* vtx_write = draw_list->_VtxWritePtr;
- ImDrawIdx* idx_write = draw_list->_IdxWritePtr;
- unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx;
+ ImDrawVert* vtx_write = draw_list->_VtxWritePtr;
+ ImDrawIdx* idx_write = draw_list->_IdxWritePtr;
+ unsigned int vtx_index = draw_list->_VtxCurrentIdx;
const ImU32 col_untinted = col | ~IM_COL32_A_MASK;
const char* word_wrap_eol = NULL;
@@ -3616,12 +4194,14 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
{
// Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature.
if (!word_wrap_eol)
- word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - start_x));
+ word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - origin_x));
if (s >= word_wrap_eol)
{
- x = start_x;
+ x = origin_x;
y += line_height;
+ if (y > clip_rect.w)
+ break; // break out of main loop
word_wrap_eol = NULL;
s = CalcWordWrapNextLineStartA(s, text_end); // Wrapping skips upcoming blanks
continue;
@@ -3631,21 +4211,15 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
// Decode and advance source
unsigned int c = (unsigned int)*s;
if (c < 0x80)
- {
s += 1;
- }
else
- {
s += ImTextCharFromUtf8(&c, s, text_end);
- if (c == 0) // Malformed UTF-8?
- break;
- }
if (c < 32)
{
if (c == '\n')
{
- x = start_x;
+ x = origin_x;
y += line_height;
if (y > clip_rect.w)
break; // break out of main loop
@@ -3710,14 +4284,14 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
// We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here:
{
- idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2);
- idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3);
vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = glyph_col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1;
vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = glyph_col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1;
vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = glyph_col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2;
vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = glyph_col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2;
+ idx_write[0] = (ImDrawIdx)(vtx_index); idx_write[1] = (ImDrawIdx)(vtx_index + 1); idx_write[2] = (ImDrawIdx)(vtx_index + 2);
+ idx_write[3] = (ImDrawIdx)(vtx_index); idx_write[4] = (ImDrawIdx)(vtx_index + 2); idx_write[5] = (ImDrawIdx)(vtx_index + 3);
vtx_write += 4;
- vtx_current_idx += 4;
+ vtx_index += 4;
idx_write += 6;
}
}
@@ -3731,7 +4305,7 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size);
draw_list->_VtxWritePtr = vtx_write;
draw_list->_IdxWritePtr = idx_write;
- draw_list->_VtxCurrentIdx = vtx_current_idx;
+ draw_list->_VtxCurrentIdx = vtx_index;
}
//-----------------------------------------------------------------------------
@@ -3783,6 +4357,7 @@ void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir d
void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col)
{
+ // FIXME-OPT: This should be baked in font.
draw_list->AddCircleFilled(pos, draw_list->_Data->FontSize * 0.20f, col, 8);
}
@@ -3856,8 +4431,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im
}
else
{
- draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL
- draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR
+ draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b); // BL
+ draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e); // TR
}
if (p1.x > rect.Min.x + rounding)
{
@@ -3876,8 +4451,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im
}
else
{
- draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR
- draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR
+ draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b); // TR
+ draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e); // BR
}
}
draw_list->PathFillConvex(col);
@@ -4064,104 +4639,190 @@ static unsigned int stb_decompress(unsigned char *output, const unsigned char *i
//-----------------------------------------------------------------------------
// ProggyClean.ttf
// Copyright (c) 2004, 2005 Tristan Grimmer
-// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip)
-// Download and more information at http://upperbounds.net
+// MIT license (see License.txt in http://www.proggyfonts.net/index.php?menu=download)
+// Download and more information at http://www.proggyfonts.net or http://upperboundsinteractive.com/fonts.php
//-----------------------------------------------------------------------------
+
+#ifndef IMGUI_DISABLE_DEFAULT_FONT
+
// File: 'ProggyClean.ttf' (41208 bytes)
-// Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding).
-// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size.
-//-----------------------------------------------------------------------------
-static const char proggy_clean_ttf_compressed_data_base85[11980 + 1] =
- "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/"
- "2*>]b(MC;$jPfY.;h^`IWM9<Lh2TlS+f-s$o6Q<BWH`YiU.xfLq$N;$0iR/GX:U(jcW2p/W*q?-qmnUCI;jHSAiFWM.R*kU@C=GH?a9wp8f$e.-4^Qg1)Q-GL(lf(r/7GrRgwV%MS=C#"
- "`8ND>Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1<q-UE31#^-V'8IRUo7Qf./L>=Ke$$'5F%)]0^#0X@U.a<r:QLtFsLcL6##lOj)#.Y5<-R&KgLwqJfLgN&;Q?gI^#DY2uL"
- "i@^rMl9t=cWq6##weg>$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;-<nLENhvx>-VsM.M0rJfLH2eTM`*oJMHRC`N"
- "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`&#0j@'DbG&#^$PG.Ll+DNa<XCMKEV*N)LN/N"
- "*b=%Q6pia-Xg8I$<MR&,VdJe$<(7G;Ckl'&hF;;$<_=X(b.RS%%)###MPBuuE1V:v&cX&#2m#(&cV]`k9OhLMbn%s$G2,B$BfD3X*sp5#l,$R#]x_X1xKX%b5U*[r5iMfUo9U`N99hG)"
- "tm+/Us9pG)XPu`<0s-)WTt(gCRxIg(%6sfh=ktMKn3j)<6<b5Sk_/0(^]AaN#(p/L>&VZ>1i%h1S9u5o@YaaW$e+b<TWFn/Z:Oh(Cx2$lNEoN^e)#CFY@@I;BOQ*sRwZtZxRcU7uW6CX"
- "ow0i(?$Q[cjOd[P4d)]>ROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc."
- "x]Ip.PH^'/aqUO/$1WxLoW0[iLA<QT;5HKD+@qQ'NQ(3_PLhE48R.qAPSwQ0/WK?Z,[x?-J;jQTWA0X@KJ(_Y8N-:/M74:/-ZpKrUss?d#dZq]DAbkU*JqkL+nwX@@47`5>w=4h(9.`G"
- "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?G<Nald$qs]@]L<J7bR*>gv:[7MI2k).'2($5FNP&EQ(,)"
- "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#"
- "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM"
- "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0<q-]L_?^)1vw'.,MRsqVr.L;aN&#/EgJ)PBc[-f>+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu"
- "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/"
- "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[K<L"
- "%a2E-grWVM3@2=-k22tL]4$##6We'8UJCKE[d_=%wI;'6X-GsLX4j^SgJ$##R*w,vP3wK#iiW&#*h^D&R?jp7+/u&#(AP##XU8c$fSYW-J95_-Dp[g9wcO&#M-h1OcJlc-*vpw0xUX&#"
- "OQFKNX@QI'IoPp7nb,QU//MQ&ZDkKP)X<WSVL(68uVl&#c'[0#(s1X&xm$Y%B7*K:eDA323j998GXbA#pwMs-jgD$9QISB-A_(aN4xoFM^@C58D0+Q+q3n0#3U1InDjF682-SjMXJK)("
- "h$hxua_K]ul92%'BOU&#BRRh-slg8KDlr:%L71Ka:.A;%YULjDPmL<LYs8i#XwJOYaKPKc1h:'9Ke,g)b),78=I39B;xiY$bgGw-&.Zi9InXDuYa%G*f2Bq7mn9^#p1vv%#(Wi-;/Z5h"
- "o;#2:;%d&#x9v68C5g?ntX0X)pT`;%pB3q7mgGN)3%(P8nTd5L7GeA-GL@+%J3u2:(Yf>et`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO"
- "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J<j$UpK<Q4a1]MupW^-"
- "sj_$%[HK%'F####QRZJ::Y3EGl4'@%FkiAOg#p[##O`gukTfBHagL<LHw%q&OV0##F=6/:chIm0@eCP8X]:kFI%hl8hgO@RcBhS-@Qb$%+m=hPDLg*%K8ln(wcf3/'DW-$.lR?n[nCH-"
- "eXOONTJlh:.RYF%3'p6sq:UIMA945&^HFS87@$EP2iG<-lCO$%c`uKGD3rC$x0BL8aFn--`ke%#HMP'vh1/R&O_J9'um,.<tx[@%wsJk&bUT2`0uMv7gg#qp/ij.L56'hl;.s5CUrxjO"
- "M7-##.l+Au'A&O:-T72L]P`&=;ctp'XScX*rU.>-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%"
- "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$M<Jnq79VsJW/mWS*PUiq76;]/NM_>hLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]"
- "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et"
- "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$<M-SGZ':+Q_k+uvOSLiEo(<aD/K<CCc`'Lx>'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:"
- "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VB<HFF*qL("
- "$/V,;(kXZejWO`<[5?\?ewY(*9=%wDc;,u<'9t3W-(H1th3+G]ucQ]kLs7df($/*JL]@*t7Bu_G3_7mp7<iaQjO@.kLg;x3B0lqp7Hf,^Ze7-##@/c58Mo(3;knp0%)A7?-W+eI'o8)b<"
- "nKnw'Ho8C=Y>pqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<<aG/1N$#FX$0V5Y6x'aErI3I$7x%E`v<-BY,)%-?Psf*l?%C3.mM(=/M0:JxG'?"
- "7WhH%o'a<-80g0NBxoO(GH<dM]n.+%q@jH?f.UsJ2Ggs&4<-e47&Kl+f//9@`b+?.TeN_&B8Ss?v;^Trk;f#YvJkl&w$]>-+k?'(<S:68tq*WoDfZu';mM?8X[ma8W%*`-=;D.(nc7/;"
- ")g:T1=^J$&BRV(-lTmNB6xqB[@0*o.erM*<SWF]u2=st-*(6v>^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M"
- "D?@f&1'BW-)Ju<L25gl8uhVm1hL$##*8###'A3/LkKW+(^rWX?5W_8g)a(m&K8P>#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX("
- "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs"
- "bIu)'Z,*[>br5fX^:FPAWr-m2KgL<LUN098kTF&#lvo58=/vjDo;.;)Ka*hLR#/k=rKbxuV`>Q_nN6'8uTG&#1T5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q"
- "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aeg<Z'<$#4H)6,>e0jT6'N#(q%.O=?2S]u*(m<-"
- "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i"
- "sZ88+dKQ)W6>J%CL<KE>`.d*(B`-n8D9oK<Up]c$X$(,)M8Zt7/[rdkqTgl-0cuGMv'?>-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P&#9r+$%CE=68>K8r0=dSC%%(@p7"
- ".m7jilQ02'0-VWAg<a/''3u.=4L$Y)6k/K:_[3=&jvL<L0C/2'v:^;-DIBW,B4E68:kZ;%?8(Q8BH=kO65BW?xSG&#@uU,DS*,?.+(o(#1vCS8#CHF>TlGW'b)Tq7VT9q^*^$$.:&N@@"
- "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*"
- "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u"
- "@-W$U%VEQ/,,>>#)D<h#`)h0:<Q6909ua+&VU%n2:cG3FJ-%@Bj-DgLr`Hw&HAKjKjseK</xKT*)B,N9X3]krc12t'pgTV(Lv-tL[xg_%=M_q7a^x?7Ubd>#%8cY#YZ?=,`Wdxu/ae&#"
- "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$s<Eh#c&)q.MXI%#v9ROa5FZO%sF7q7Nwb&#ptUJ:aqJe$Sl68%.D###EC><?-aF&#RNQv>o8lKN%5/$(vdfq7+ebA#"
- "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(<c`Q8N)jEIF*+?P2a8g%)$q]o2aH8C&<SibC/q,(e:v;-b#6[$NtDZ84Je2KNvB#$P5?tQ3nt(0"
- "d=j.LQf./Ll33+(;q3L-w=8dX$#WF&uIJ@-bfI>%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoF&#4DoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8"
- "6e%B/:=>)N4xeW.*wft-;$'58-ESqr<b?UI(_%@[P46>#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#"
- "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjL<Lni;''X.`$#8+1GD"
- ":k$YUWsbn8ogh6rxZ2Z9]%nd+>V#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#<NEdtg(n'=S1A(Q1/I&4([%dM`,Iu'1:_hL>SfD07&6D<fp8dHM7/g+"
- "tlPN9J*rKaPct&?'uBCem^jn%9_K)<,C5K3s=5g&GmJb*[SYq7K;TRLGCsM-$$;S%:Y@r7AK0pprpL<Lrh,q7e/%KWK:50I^+m'vi`3?%Zp+<-d+$L-Sv:@.o19n$s0&39;kn;S%BSq*"
- "$3WoJSCLweV[aZ'MQIjO<7;X-X;&+dMLvu#^UsGEC9WEc[X(wI7#2.(F0jV*eZf<-Qv3J-c+J5AlrB#$p(H68LvEA'q3n0#m,[`*8Ft)FcYgEud]CWfm68,(aLA$@EFTgLXoBq/UPlp7"
- ":d[/;r_ix=:TF`S5H-b<LI&HY(K=h#)]Lk$K14lVfm:x$H<3^Ql<M`$OhapBnkup'D#L$Pb_`N*g]2e;X/Dtg,bsj&K#2[-:iYr'_wgH)NUIR8a1n#S?Yej'h8^58UbZd+^FKD*T@;6A"
- "7aQC[K8d-(v6GI$x:T<&'Gp5Uf>@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-<aN((^7('#Z0wK#5GX@7"
- "u][`*S^43933A4rl][`*O4CgLEl]v$1Q3AeF37dbXk,.)vj#x'd`;qgbQR%FW,2(?LO=s%Sc68%NP'##Aotl8x=BE#j1UD([3$M(]UI2LX3RpKN@;/#f'f/&_mt&F)XdF<9t4)Qa.*kT"
- "LwQ'(TTB9.xH'>#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5<N?)NBS)QN*_I,?&)2'IM%L3I)X((e/dl2&8'<M"
- ":^#M*Q+[T.Xri.LYS3v%fF`68h;b-X[/En'CR.q7E)p'/kle2HM,u;^%OKC-N+Ll%F9CF<Nf'^#t2L,;27W:0O@6##U6W7:$rJfLWHj$#)woqBefIZ.PK<b*t7ed;p*_m;4ExK#h@&]>"
- "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%"
- "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;"
- "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmL<LD)F^%[tC'8;+9E#C$g%#5Y>q9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:"
- "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3<n-&%H%b<FDj2M<hH=&Eh<2Len$b*aTX=-8QxN)k11IM1c^j%"
- "9s<L<NFSo)B?+<-(GxsF,^-Eh@$4dXhN$+#rxK8'je'D7k`e;)2pYwPA'_p9&@^18ml1^[@g4t*[JOa*[=Qp7(qJ_oOL^('7fB&Hq-:sf,sNj8xq^>$U4O]GKx'm9)b@p7YsvK3w^YR-"
- "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*"
- "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdF<TddF<9Ah-6&9tWoDlh]&1SpGMq>Ti1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IX<N+T+0MlMBPQ*Vj>SsD<U4JHY"
- "8kD2)2fU/M#$e.)T4,_=8hLim[&);?UkK'-x?'(:siIfL<$pFM`i<?%W(mGDHM%>iWP,##P`%/L<eXi:@Z9C.7o=@(pXdAO/NLQ8lPl+HPOQa8wD8=^GlPa8TKI1CjhsCTSLJM'/Wl>-"
- "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n<bhPmUkMw>%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL<LoNs'6,'85`"
- "0?t/'_U59@]ddF<#LdF<eWdF<OuN/45rY<-L@&#+fm>69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdF<gR@2L=FNU-<b[(9c/ML3m;Z[$oF3g)GAWqpARc=<ROu7cL5l;-[A]%/"
- "+fsd;l#SafT/f*W]0=O'$(Tb<[)*@e775R-:Yob%g*>l*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj"
- "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#<IGe;__.thjZl<%w(Wk2xmp4Q@I#I9,DF]u7-P=.-_:YJ]aS@V"
- "?6*C()dOp7:WL,b&3Rg/.cmM9&r^>$(>.Z-I&J(Q0Hd5Q%7Co-b`-c<N(6r@ip+AurK<m86QIth*#v;-OBqi+L7wDE-Ir8K['m+DDSLwK&/.?-V%U_%3:qKNu$_b*B-kp7NaD'QdWQPK"
- "Yq[@>P)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8<FfNkgg^oIbah*#8/Qt$F&:K*-(N/'+1vMB,u()-a.VUU*#[e%gAAO(S>WlA2);Sa"
- ">gXm8YB`1d@K#n]76-a$U,mF<fX]idqd)<3,]J7JmW4`6]uks=4-72L(jEk+:bJ0M^q-8Dm_Z?0olP1C9Sa&H[d&c$ooQUj]Exd*3ZM@-WGW2%s',B-_M%>%Ul:#/'xoFM9QX-$.QN'>"
- "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B</R90;eZ]%Ncq;-Tl]#F>2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I"
- "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1<Vc52=u`3^o-n1'g4v58Hj&6_t7$##?M)c<$bgQ_'SY((-xkA#"
- "Y(,p'H9rIVY-b,'%bCPF7.J<Up^,(dU1VY*5#WkTU>h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-u<Hp,3@e^9UB1J+ak9-TN/mhKPg+AJYd$"
- "MlvAF_jCK*.O-^(63adMT->W%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)"
- "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo"
- "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P"
- "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*<h`e-GI7)?OK2A.d7_c)?wQ5AS@DL3r#7fSkgl6-++D:'A,uq7SvlB$pcpH'q3n0#_%dY#xCpr-l<F0NR@-##FEV6NTF6##$l84N1w?AO>'IAO"
- "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#"
- ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T<XoIB&hx=T1PcDaB&;HH+-AFr?(m9HZV)FKS8JCw;SD=6[^/DZUL`EUDf]GGlG&>"
- "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#<xU?#@.i?#D:%@#HF7@#LRI@#P_[@#Tkn@#Xw*A#]-=A#a9OA#"
- "d<F&#*;G##.GY##2Sl##6`($#:l:$#>xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4&#3^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4"
- "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#"
- "/QHC#3^ZC#7jmC#;v)D#?,<D#C8ND#GDaD#KPsD#O]/E#g1A5#KA*1#gC17#MGd;#8(02#L-d3#rWM4#Hga1#,<w0#T.j<#O#'2#CYN1#qa^:#_4m3#o@/=#eG8=#t8J5#`+78#4uI-#"
- "m3B2#SB[8#Q0@8#i[*9#iOn8#1Nm;#^sN9#qh<9#:=x-#P;K2#$%X9#bC+.#Rg;<#mN=.#MTF.#RZO.#2?)4#Y#(/#[)1/#b;L/#dAU/#0Sv;#lY$0#n`-0#sf60#(F24#wrH0#%/e0#"
- "TmD<#%JSMFove:CTBEXI:<eh2g)B,3h2^G3i;#d3jD>)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP"
- "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp"
- "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#";
-
-static const char* GetDefaultCompressedFontDataTTFBase85()
-{
- return proggy_clean_ttf_compressed_data_base85;
+// Exported using binary_to_compressed_c.exe -u8 "ProggyClean.ttf" proggy_clean_ttf
+static const unsigned int proggy_clean_ttf_compressed_size = 9583;
+static const unsigned char proggy_clean_ttf_compressed_data[9583] =
+{
+ 87,188,0,0,0,0,0,0,0,0,160,248,0,4,0,0,55,0,1,0,0,0,12,0,128,0,3,0,64,79,83,47,50,136,235,116,144,0,0,1,72,130,21,44,78,99,109,97,112,2,18,35,117,0,0,3,160,130,19,36,82,99,118,116,
+ 32,130,23,130,2,33,4,252,130,4,56,2,103,108,121,102,18,175,137,86,0,0,7,4,0,0,146,128,104,101,97,100,215,145,102,211,130,27,32,204,130,3,33,54,104,130,16,39,8,66,1,195,0,0,1,4,130,
+ 15,59,36,104,109,116,120,138,0,126,128,0,0,1,152,0,0,2,6,108,111,99,97,140,115,176,216,0,0,5,130,30,41,2,4,109,97,120,112,1,174,0,218,130,31,32,40,130,16,44,32,110,97,109,101,37,89,
+ 187,150,0,0,153,132,130,19,44,158,112,111,115,116,166,172,131,239,0,0,155,36,130,51,44,210,112,114,101,112,105,2,1,18,0,0,4,244,130,47,32,8,132,203,46,1,0,0,60,85,233,213,95,15,60,
+ 245,0,3,8,0,131,0,34,183,103,119,130,63,43,0,0,189,146,166,215,0,0,254,128,3,128,131,111,130,241,33,2,0,133,0,32,1,130,65,38,192,254,64,0,0,3,128,131,16,130,5,32,1,131,7,138,3,33,2,
+ 0,130,17,36,1,1,0,144,0,130,121,130,23,38,2,0,8,0,64,0,10,130,9,32,118,130,9,130,6,32,0,130,59,33,1,144,131,200,35,2,188,2,138,130,16,32,143,133,7,37,1,197,0,50,2,0,131,0,33,4,9,131,
+ 5,145,3,43,65,108,116,115,0,64,0,0,32,172,8,0,131,0,35,5,0,1,128,131,77,131,3,33,3,128,191,1,33,1,128,130,184,35,0,0,128,0,130,3,131,11,32,1,130,7,33,0,128,131,1,32,1,136,9,32,0,132,
+ 15,135,5,32,1,131,13,135,27,144,35,32,1,149,25,131,21,32,0,130,0,32,128,132,103,130,35,132,39,32,0,136,45,136,97,133,17,130,5,33,0,0,136,19,34,0,128,1,133,13,133,5,32,128,130,15,132,
+ 131,32,3,130,5,32,3,132,27,144,71,32,0,133,27,130,29,130,31,136,29,131,63,131,3,65,63,5,132,5,132,205,130,9,33,0,0,131,9,137,119,32,3,132,19,138,243,130,55,32,1,132,35,135,19,131,201,
+ 136,11,132,143,137,13,130,41,32,0,131,3,144,35,33,128,0,135,1,131,223,131,3,141,17,134,13,136,63,134,15,136,53,143,15,130,96,33,0,3,131,4,130,3,34,28,0,1,130,5,34,0,0,76,130,17,131,
+ 9,36,28,0,4,0,48,130,17,46,8,0,8,0,2,0,0,0,127,0,255,32,172,255,255,130,9,34,0,0,129,132,9,130,102,33,223,213,134,53,132,22,33,1,6,132,6,64,4,215,32,129,165,216,39,177,0,1,141,184,
+ 1,255,133,134,45,33,198,0,193,1,8,190,244,1,28,1,158,2,20,2,136,2,252,3,20,3,88,3,156,3,222,4,20,4,50,4,80,4,98,4,162,5,22,5,102,5,188,6,18,6,116,6,214,7,56,7,126,7,236,8,78,8,108,
+ 8,150,8,208,9,16,9,74,9,136,10,22,10,128,11,4,11,86,11,200,12,46,12,130,12,234,13,94,13,164,13,234,14,80,14,150,15,40,15,176,16,18,16,116,16,224,17,82,17,182,18,4,18,110,18,196,19,
+ 76,19,172,19,246,20,88,20,174,20,234,21,64,21,128,21,166,21,184,22,18,22,126,22,198,23,52,23,142,23,224,24,86,24,186,24,238,25,54,25,150,25,212,26,72,26,156,26,240,27,92,27,200,28,
+ 4,28,76,28,150,28,234,29,42,29,146,29,210,30,64,30,142,30,224,31,36,31,118,31,166,31,166,32,16,130,1,52,46,32,138,32,178,32,200,33,20,33,116,33,152,33,238,34,98,34,134,35,12,130,1,
+ 33,128,35,131,1,60,152,35,176,35,216,36,0,36,74,36,104,36,144,36,174,37,6,37,96,37,130,37,248,37,248,38,88,38,170,130,1,8,190,216,39,64,39,154,40,10,40,104,40,168,41,14,41,32,41,184,
+ 41,248,42,54,42,96,42,96,43,2,43,42,43,94,43,172,43,230,44,32,44,52,44,154,45,40,45,92,45,120,45,170,45,232,46,38,46,166,47,38,47,182,47,244,48,94,48,200,49,62,49,180,50,30,50,158,
+ 51,30,51,130,51,238,52,92,52,206,53,58,53,134,53,212,54,38,54,114,54,230,55,118,55,216,56,58,56,166,57,18,57,116,57,174,58,46,58,154,59,6,59,124,59,232,60,58,60,150,61,34,61,134,61,
+ 236,62,86,62,198,63,42,63,154,64,18,64,106,64,208,65,54,65,162,66,8,66,64,66,122,66,184,66,240,67,98,67,204,68,42,68,138,68,238,69,88,69,182,69,226,70,84,70,180,71,20,71,122,71,218,
+ 72,84,72,198,73,64,0,36,70,21,8,8,77,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,83,0,87,0,91,0,95,0,99,0,103,0,107,0,111,0,115,
+ 0,119,0,123,0,127,0,131,0,135,0,139,0,143,0,0,17,53,51,21,49,150,3,32,5,130,23,32,33,130,3,211,7,151,115,32,128,133,0,37,252,128,128,2,128,128,190,5,133,74,32,4,133,6,206,5,42,0,7,
+ 1,128,0,0,2,0,4,0,0,65,139,13,37,0,1,53,51,21,7,146,3,32,3,130,19,32,1,141,133,32,3,141,14,131,13,38,255,0,128,128,0,6,1,130,84,35,2,128,4,128,140,91,132,89,32,51,65,143,6,139,7,33,
+ 1,0,130,57,32,254,130,3,32,128,132,4,32,4,131,14,138,89,35,0,0,24,0,130,0,33,3,128,144,171,66,55,33,148,115,65,187,19,32,5,130,151,143,155,163,39,32,1,136,182,32,253,134,178,132,7,
+ 132,200,145,17,32,3,65,48,17,165,17,39,0,0,21,0,128,255,128,3,65,175,17,65,3,27,132,253,131,217,139,201,155,233,155,27,131,67,131,31,130,241,33,255,0,131,181,137,232,132,15,132,4,138,
+ 247,34,255,0,128,179,238,32,0,130,0,32,20,65,239,48,33,0,19,67,235,10,32,51,65,203,14,65,215,11,32,7,154,27,135,39,32,33,130,35,33,128,128,130,231,32,253,132,231,32,128,132,232,34,
+ 128,128,254,133,13,136,8,32,253,65,186,5,130,36,130,42,176,234,133,231,34,128,0,0,66,215,44,33,0,1,68,235,6,68,211,19,32,49,68,239,14,139,207,139,47,66,13,7,32,51,130,47,33,1,0,130,
+ 207,35,128,128,1,0,131,222,131,5,130,212,130,6,131,212,32,0,130,10,133,220,130,233,130,226,32,254,133,255,178,233,39,3,1,128,3,0,2,0,4,68,15,7,68,99,12,130,89,130,104,33,128,4,133,
+ 93,130,10,38,0,0,11,1,0,255,0,68,63,16,70,39,9,66,215,8,32,7,68,77,6,68,175,14,32,29,68,195,6,132,7,35,2,0,128,255,131,91,132,4,65,178,5,141,111,67,129,23,165,135,140,107,142,135,33,
+ 21,5,69,71,6,131,7,33,1,0,140,104,132,142,130,4,137,247,140,30,68,255,12,39,11,0,128,0,128,3,0,3,69,171,15,67,251,7,65,15,8,66,249,11,65,229,7,67,211,7,66,13,7,35,1,128,128,254,133,
+ 93,32,254,131,145,132,4,132,18,32,2,151,128,130,23,34,0,0,9,154,131,65,207,8,68,107,15,68,51,7,32,7,70,59,7,135,121,130,82,32,128,151,111,41,0,0,4,0,128,255,0,1,128,1,137,239,33,0,
+ 37,70,145,10,65,77,10,65,212,14,37,0,0,0,5,0,128,66,109,5,70,123,10,33,0,19,72,33,18,133,237,70,209,11,33,0,2,130,113,137,119,136,115,33,1,0,133,43,130,5,34,0,0,10,69,135,6,70,219,
+ 13,66,155,7,65,9,12,66,157,11,66,9,11,32,7,130,141,132,252,66,151,9,137,9,66,15,30,36,0,20,0,128,0,130,218,71,11,42,68,51,8,65,141,7,73,19,15,69,47,23,143,39,66,81,7,32,1,66,55,6,34,
+ 1,128,128,68,25,5,69,32,6,137,6,136,25,32,254,131,42,32,3,66,88,26,148,26,32,0,130,0,32,14,164,231,70,225,12,66,233,7,67,133,19,71,203,15,130,161,32,255,130,155,32,254,139,127,134,
+ 12,164,174,33,0,15,164,159,33,59,0,65,125,20,66,25,7,32,5,68,191,6,66,29,7,144,165,65,105,9,35,128,128,255,0,137,2,133,182,164,169,33,128,128,197,171,130,155,68,235,7,32,21,70,77,19,
+ 66,21,10,68,97,8,66,30,5,66,4,43,34,0,17,0,71,19,41,65,253,20,71,25,23,65,91,15,65,115,7,34,2,128,128,66,9,8,130,169,33,1,0,66,212,13,132,28,72,201,43,35,0,0,0,18,66,27,38,76,231,5,
+ 68,157,20,135,157,32,7,68,185,13,65,129,28,66,20,5,32,253,66,210,11,65,128,49,133,61,32,0,65,135,6,74,111,37,72,149,12,66,203,19,65,147,19,68,93,7,68,85,8,76,4,5,33,255,0,133,129,34,
+ 254,0,128,68,69,8,181,197,34,0,0,12,65,135,32,65,123,20,69,183,27,133,156,66,50,5,72,87,10,67,137,32,33,0,19,160,139,78,251,13,68,55,20,67,119,19,65,91,36,69,177,15,32,254,143,16,65,
+ 98,53,32,128,130,0,32,0,66,43,54,70,141,23,66,23,15,131,39,69,47,11,131,15,70,129,19,74,161,9,36,128,255,0,128,254,130,153,65,148,32,67,41,9,34,0,0,4,79,15,5,73,99,10,71,203,8,32,3,
+ 72,123,6,72,43,8,32,2,133,56,131,99,130,9,34,0,0,6,72,175,5,73,159,14,144,63,135,197,132,189,133,66,33,255,0,73,6,7,70,137,12,35,0,0,0,10,130,3,73,243,25,67,113,12,65,73,7,69,161,7,
+ 138,7,37,21,2,0,128,128,254,134,3,73,116,27,33,128,128,130,111,39,12,0,128,1,0,3,128,2,72,219,21,35,43,0,47,0,67,47,20,130,111,33,21,1,68,167,13,81,147,8,133,230,32,128,77,73,6,32,
+ 128,131,142,134,18,130,6,32,255,75,18,12,131,243,37,128,0,128,3,128,3,74,231,21,135,123,32,29,134,107,135,7,32,21,74,117,7,135,7,134,96,135,246,74,103,23,132,242,33,0,10,67,151,28,
+ 67,133,20,66,141,11,131,11,32,3,77,71,6,32,128,130,113,32,1,81,4,6,134,218,66,130,24,131,31,34,0,26,0,130,0,77,255,44,83,15,11,148,155,68,13,7,32,49,78,231,18,79,7,11,73,243,11,32,
+ 33,65,187,10,130,63,65,87,8,73,239,19,35,0,128,1,0,131,226,32,252,65,100,6,32,128,139,8,33,1,0,130,21,32,253,72,155,44,73,255,20,32,128,71,67,8,81,243,39,67,15,20,74,191,23,68,121,
+ 27,32,1,66,150,6,32,254,79,19,11,131,214,32,128,130,215,37,2,0,128,253,0,128,136,5,65,220,24,147,212,130,210,33,0,24,72,219,42,84,255,13,67,119,16,69,245,19,72,225,19,65,3,15,69,93,
+ 19,131,55,132,178,71,115,14,81,228,6,142,245,33,253,0,132,43,172,252,65,16,11,75,219,8,65,219,31,66,223,24,75,223,10,33,29,1,80,243,10,66,175,8,131,110,134,203,133,172,130,16,70,30,
+ 7,164,183,130,163,32,20,65,171,48,65,163,36,65,143,23,65,151,19,65,147,13,65,134,17,133,17,130,216,67,114,5,164,217,65,137,12,72,147,48,79,71,19,74,169,22,80,251,8,65,173,7,66,157,
+ 15,74,173,15,32,254,65,170,8,71,186,45,72,131,6,77,143,40,187,195,152,179,65,123,38,68,215,57,68,179,15,65,85,7,69,187,14,32,21,66,95,15,67,19,25,32,1,83,223,6,32,2,76,240,7,77,166,
+ 43,65,8,5,130,206,32,0,67,39,54,143,167,66,255,19,82,193,11,151,47,85,171,5,67,27,17,132,160,69,172,11,69,184,56,66,95,6,33,12,1,130,237,32,2,68,179,27,68,175,16,80,135,15,72,55,7,
+ 71,87,12,73,3,12,132,12,66,75,32,76,215,5,169,139,147,135,148,139,81,12,12,81,185,36,75,251,7,65,23,27,76,215,9,87,165,12,65,209,15,72,157,7,65,245,31,32,128,71,128,6,32,1,82,125,5,
+ 34,0,128,254,131,169,32,254,131,187,71,180,9,132,27,32,2,88,129,44,32,0,78,47,40,65,79,23,79,171,14,32,21,71,87,8,72,15,14,65,224,33,130,139,74,27,62,93,23,7,68,31,7,75,27,7,139,15,
+ 74,3,7,74,23,27,65,165,11,65,177,15,67,123,5,32,1,130,221,32,252,71,96,5,74,12,12,133,244,130,25,34,1,0,128,130,2,139,8,93,26,8,65,9,32,65,57,14,140,14,32,0,73,79,67,68,119,11,135,
+ 11,32,51,90,75,14,139,247,65,43,7,131,19,139,11,69,159,11,65,247,6,36,1,128,128,253,0,90,71,9,33,1,0,132,14,32,128,89,93,14,69,133,6,130,44,131,30,131,6,65,20,56,33,0,16,72,179,40,
+ 75,47,12,65,215,19,74,95,19,65,43,11,131,168,67,110,5,75,23,17,69,106,6,75,65,5,71,204,43,32,0,80,75,47,71,203,15,159,181,68,91,11,67,197,7,73,101,13,68,85,6,33,128,128,130,214,130,
+ 25,32,254,74,236,48,130,194,37,0,18,0,128,255,128,77,215,40,65,139,64,32,51,80,159,10,65,147,39,130,219,84,212,43,130,46,75,19,97,74,33,11,65,201,23,65,173,31,33,1,0,79,133,6,66,150,
+ 5,67,75,48,85,187,6,70,207,37,32,71,87,221,13,73,163,14,80,167,15,132,15,83,193,19,82,209,8,78,99,9,72,190,11,77,110,49,89,63,5,80,91,35,99,63,32,70,235,23,81,99,10,69,148,10,65,110,
+ 36,32,0,65,99,47,95,219,11,68,171,51,66,87,7,72,57,7,74,45,17,143,17,65,114,50,33,14,0,65,111,40,159,195,98,135,15,35,7,53,51,21,100,78,9,95,146,16,32,254,82,114,6,32,128,67,208,37,
+ 130,166,99,79,58,32,17,96,99,14,72,31,19,72,87,31,82,155,7,67,47,14,32,21,131,75,134,231,72,51,17,72,78,8,133,8,80,133,6,33,253,128,88,37,9,66,124,36,72,65,12,134,12,71,55,43,66,139,
+ 27,85,135,10,91,33,12,65,35,11,66,131,11,71,32,8,90,127,6,130,244,71,76,11,168,207,33,0,12,66,123,32,32,0,65,183,15,68,135,11,66,111,7,67,235,11,66,111,15,32,254,97,66,12,160,154,67,
+ 227,52,80,33,15,87,249,15,93,45,31,75,111,12,93,45,11,77,99,9,160,184,81,31,12,32,15,98,135,30,104,175,7,77,249,36,69,73,15,78,5,12,32,254,66,151,19,34,128,128,4,87,32,12,149,35,133,
+ 21,96,151,31,32,19,72,35,5,98,173,15,143,15,32,21,143,99,158,129,33,0,0,65,35,52,65,11,15,147,15,98,75,11,33,1,0,143,151,132,15,32,254,99,200,37,132,43,130,4,39,0,10,0,128,1,128,3,
+ 0,104,151,14,97,187,20,69,131,15,67,195,11,87,227,7,33,128,128,132,128,33,254,0,68,131,9,65,46,26,42,0,0,0,7,0,0,255,128,3,128,0,88,223,15,33,0,21,89,61,22,66,209,12,65,2,12,37,0,2,
+ 1,0,3,128,101,83,8,36,0,1,53,51,29,130,3,34,21,1,0,66,53,8,32,0,68,215,6,100,55,25,107,111,9,66,193,11,72,167,8,73,143,31,139,31,33,1,0,131,158,32,254,132,5,33,253,128,65,16,9,133,
+ 17,89,130,25,141,212,33,0,0,93,39,8,90,131,25,93,39,14,66,217,6,106,179,8,159,181,71,125,15,139,47,138,141,87,11,14,76,23,14,65,231,26,140,209,66,122,8,81,179,5,101,195,26,32,47,74,
+ 75,13,69,159,11,83,235,11,67,21,16,136,167,131,106,130,165,130,15,32,128,101,90,24,134,142,32,0,65,103,51,108,23,11,101,231,15,75,173,23,74,237,23,66,15,6,66,46,17,66,58,17,65,105,
+ 49,66,247,55,71,179,12,70,139,15,86,229,7,84,167,15,32,1,95,72,12,89,49,6,33,128,128,65,136,38,66,30,9,32,0,100,239,7,66,247,29,70,105,20,65,141,19,69,81,15,130,144,32,128,83,41,5,
+ 32,255,131,177,68,185,5,133,126,65,97,37,32,0,130,0,33,21,0,130,55,66,195,28,67,155,13,34,79,0,83,66,213,13,73,241,19,66,59,19,65,125,11,135,201,66,249,16,32,128,66,44,11,66,56,17,
+ 68,143,8,68,124,38,67,183,12,96,211,9,65,143,29,112,171,5,32,0,68,131,63,34,33,53,51,71,121,11,32,254,98,251,16,32,253,74,231,10,65,175,37,133,206,37,0,0,8,1,0,0,107,123,11,113,115,
+ 9,33,0,1,130,117,131,3,73,103,7,66,51,18,66,44,5,133,75,70,88,5,32,254,65,39,12,68,80,9,34,12,0,128,107,179,28,68,223,6,155,111,86,147,15,32,2,131,82,141,110,33,254,0,130,15,32,4,103,
+ 184,15,141,35,87,176,5,83,11,5,71,235,23,114,107,11,65,189,16,70,33,15,86,153,31,135,126,86,145,30,65,183,41,32,0,130,0,32,10,65,183,24,34,35,0,39,67,85,9,65,179,15,143,15,33,1,0,65,
+ 28,17,157,136,130,123,32,20,130,3,32,0,97,135,24,115,167,19,80,71,12,32,51,110,163,14,78,35,19,131,19,155,23,77,229,8,78,9,17,151,17,67,231,46,94,135,8,73,31,31,93,215,56,82,171,25,
+ 72,77,8,162,179,169,167,99,131,11,69,85,19,66,215,15,76,129,13,68,115,22,72,79,35,67,113,5,34,0,0,19,70,31,46,65,89,52,73,223,15,85,199,33,95,33,8,132,203,73,29,32,67,48,16,177,215,
+ 101,13,15,65,141,43,69,141,15,75,89,5,70,0,11,70,235,21,178,215,36,10,0,128,0,0,71,207,24,33,0,19,100,67,6,80,215,11,66,67,7,80,43,12,71,106,7,80,192,5,65,63,5,66,217,26,33,0,13,156,
+ 119,68,95,5,72,233,12,134,129,85,81,11,76,165,20,65,43,8,73,136,8,75,10,31,38,128,128,0,0,0,13,1,130,4,32,3,106,235,29,114,179,12,66,131,23,32,7,77,133,6,67,89,12,131,139,116,60,9,
+ 89,15,37,32,0,74,15,7,103,11,22,65,35,5,33,55,0,93,81,28,67,239,23,78,85,5,107,93,14,66,84,17,65,193,26,74,183,10,66,67,34,143,135,79,91,15,32,7,117,111,8,75,56,9,84,212,9,154,134,
+ 32,0,130,0,32,18,130,3,70,171,41,83,7,16,70,131,19,84,191,15,84,175,19,84,167,30,84,158,12,154,193,68,107,15,33,0,0,65,79,42,65,71,7,73,55,7,118,191,16,83,180,9,32,255,76,166,9,154,
+ 141,32,0,130,0,69,195,52,65,225,15,151,15,75,215,31,80,56,10,68,240,17,100,32,9,70,147,39,65,93,12,71,71,41,92,85,15,84,135,23,78,35,15,110,27,10,84,125,8,107,115,29,136,160,38,0,0,
+ 14,0,128,255,0,82,155,24,67,239,8,119,255,11,69,131,11,77,29,6,112,31,8,134,27,105,203,8,32,2,75,51,11,75,195,12,74,13,29,136,161,37,128,0,0,0,11,1,130,163,82,115,8,125,191,17,69,35,
+ 12,74,137,15,143,15,32,1,65,157,12,136,12,161,142,65,43,40,65,199,6,65,19,24,102,185,11,76,123,11,99,6,12,135,12,32,254,130,8,161,155,101,23,9,39,8,0,0,1,128,3,128,2,78,63,17,72,245,
+ 12,67,41,11,90,167,9,32,128,97,49,9,32,128,109,51,14,132,97,81,191,8,130,97,125,99,12,121,35,9,127,75,15,71,79,12,81,151,23,87,97,7,70,223,15,80,245,16,105,97,15,32,254,113,17,6,32,
+ 128,130,8,105,105,8,76,122,18,65,243,21,74,63,7,38,4,1,0,255,0,2,0,119,247,28,133,65,32,255,141,91,35,0,0,0,16,67,63,36,34,59,0,63,77,59,9,119,147,11,143,241,66,173,15,66,31,11,67,
+ 75,8,81,74,16,32,128,131,255,87,181,42,127,43,5,34,255,128,2,120,235,11,37,19,0,23,0,0,37,109,191,14,118,219,7,127,43,14,65,79,14,35,0,0,0,3,73,91,5,130,5,38,3,0,7,0,11,0,0,70,205,
+ 11,88,221,12,32,0,73,135,7,87,15,22,73,135,10,79,153,15,97,71,19,65,49,11,32,1,131,104,121,235,11,80,65,11,142,179,144,14,81,123,46,32,1,88,217,5,112,5,8,65,201,15,83,29,15,122,147,
+ 11,135,179,142,175,143,185,67,247,39,66,199,7,35,5,0,128,3,69,203,15,123,163,12,67,127,7,130,119,71,153,10,141,102,70,175,8,32,128,121,235,30,136,89,100,191,11,116,195,11,111,235,15,
+ 72,39,7,32,2,97,43,5,132,5,94,67,8,131,8,125,253,10,32,3,65,158,16,146,16,130,170,40,0,21,0,128,0,0,3,128,5,88,219,15,24,64,159,32,135,141,65,167,15,68,163,10,97,73,49,32,255,82,58,
+ 7,93,80,8,97,81,16,24,67,87,52,34,0,0,5,130,231,33,128,2,80,51,13,65,129,8,113,61,6,132,175,65,219,5,130,136,77,152,17,32,0,95,131,61,70,215,6,33,21,51,90,53,10,78,97,23,105,77,31,
+ 65,117,7,139,75,24,68,195,9,24,64,22,9,33,0,128,130,11,33,128,128,66,25,5,121,38,5,134,5,134,45,66,40,36,66,59,18,34,128,0,0,66,59,81,135,245,123,103,19,120,159,19,77,175,12,33,255,
+ 0,87,29,10,94,70,21,66,59,54,39,3,1,128,3,0,2,128,4,24,65,7,15,66,47,7,72,98,12,37,0,0,0,3,1,0,24,65,55,21,131,195,32,1,67,178,6,33,4,0,77,141,8,32,6,131,47,74,67,16,24,69,3,20,24,
+ 65,251,7,133,234,130,229,94,108,17,35,0,0,6,0,141,175,86,59,5,162,79,85,166,8,70,112,13,32,13,24,64,67,26,24,71,255,7,123,211,12,80,121,11,69,215,15,66,217,11,69,71,10,131,113,132,
+ 126,119,90,9,66,117,19,132,19,32,0,130,0,24,64,47,59,33,7,0,73,227,5,68,243,15,85,13,12,76,37,22,74,254,15,130,138,33,0,4,65,111,6,137,79,65,107,16,32,1,77,200,6,34,128,128,3,75,154,
+ 12,37,0,16,0,0,2,0,104,115,36,140,157,68,67,19,68,51,15,106,243,15,134,120,70,37,10,68,27,10,140,152,65,121,24,32,128,94,155,7,67,11,8,24,74,11,25,65,3,12,83,89,18,82,21,37,67,200,
+ 5,130,144,24,64,172,12,33,4,0,134,162,74,80,14,145,184,32,0,130,0,69,251,20,32,19,81,243,5,82,143,8,33,5,53,89,203,5,133,112,79,109,15,33,0,21,130,71,80,175,41,36,75,0,79,0,83,121,
+ 117,9,87,89,27,66,103,11,70,13,15,75,191,11,135,67,87,97,20,109,203,5,69,246,8,108,171,5,78,195,38,65,51,13,107,203,11,77,3,17,24,75,239,17,65,229,28,79,129,39,130,175,32,128,123,253,
+ 7,132,142,24,65,51,15,65,239,41,36,128,128,0,0,13,65,171,5,66,163,28,136,183,118,137,11,80,255,15,67,65,7,74,111,8,32,0,130,157,32,253,24,76,35,10,103,212,5,81,175,9,69,141,7,66,150,
+ 29,131,158,24,75,199,28,124,185,7,76,205,15,68,124,14,32,3,123,139,16,130,16,33,128,128,108,199,6,33,0,3,65,191,35,107,11,6,73,197,11,24,70,121,15,83,247,15,24,70,173,23,69,205,14,
+ 32,253,131,140,32,254,136,4,94,198,9,32,3,78,4,13,66,127,13,143,13,32,0,130,0,33,16,0,24,69,59,39,109,147,12,76,253,19,24,69,207,15,69,229,15,130,195,71,90,10,139,10,130,152,73,43,
+ 40,91,139,10,65,131,37,35,75,0,79,0,84,227,12,143,151,68,25,15,80,9,23,95,169,11,34,128,2,128,112,186,5,130,6,83,161,19,76,50,6,130,37,65,145,44,110,83,5,32,16,67,99,6,71,67,15,76,
+ 55,17,140,215,67,97,23,76,69,15,77,237,11,104,211,23,77,238,11,65,154,43,33,0,10,83,15,28,83,13,20,67,145,19,67,141,14,97,149,21,68,9,15,86,251,5,66,207,5,66,27,37,82,1,23,127,71,12,
+ 94,235,10,110,175,24,98,243,15,132,154,132,4,24,66,69,10,32,4,67,156,43,130,198,35,2,1,0,4,75,27,9,69,85,9,95,240,7,32,128,130,35,32,28,66,43,40,24,82,63,23,83,123,12,72,231,15,127,
+ 59,23,116,23,19,117,71,7,24,77,99,15,67,111,15,71,101,8,36,2,128,128,252,128,127,60,11,32,1,132,16,130,18,141,24,67,107,9,32,3,68,194,15,175,15,38,0,11,0,128,1,128,2,80,63,25,32,0,
+ 24,65,73,11,69,185,15,83,243,16,32,0,24,81,165,8,130,86,77,35,6,155,163,88,203,5,24,66,195,30,70,19,19,24,80,133,15,32,1,75,211,8,32,254,108,133,8,79,87,20,65,32,9,41,0,0,7,0,128,0,
+ 0,2,128,2,68,87,15,66,1,16,92,201,16,24,76,24,17,133,17,34,128,0,30,66,127,64,34,115,0,119,73,205,9,66,43,11,109,143,15,24,79,203,11,90,143,15,131,15,155,31,65,185,15,86,87,11,35,128,
+ 128,253,0,69,7,6,130,213,33,1,0,119,178,15,142,17,66,141,74,83,28,6,36,7,0,0,4,128,82,39,18,76,149,12,67,69,21,32,128,79,118,15,32,0,130,0,32,8,131,206,32,2,79,83,9,100,223,14,102,
+ 113,23,115,115,7,24,65,231,12,130,162,32,4,68,182,19,130,102,93,143,8,69,107,29,24,77,255,12,143,197,72,51,7,76,195,15,132,139,85,49,15,130,152,131,18,71,81,23,70,14,11,36,0,10,0,128,
+ 2,69,59,9,89,151,15,66,241,11,76,165,12,71,43,15,75,49,13,65,12,23,132,37,32,0,179,115,130,231,95,181,16,132,77,32,254,67,224,8,65,126,20,79,171,8,32,2,89,81,5,75,143,6,80,41,8,34,
+ 2,0,128,24,81,72,9,32,0,130,0,35,17,0,0,255,77,99,39,95,65,36,67,109,15,24,69,93,11,77,239,5,95,77,23,35,128,1,0,128,24,86,7,8,132,167,32,2,69,198,41,130,202,33,0,26,120,75,44,24,89,
+ 51,15,71,243,12,70,239,11,24,84,3,11,66,7,11,71,255,10,32,21,69,155,35,88,151,12,32,128,74,38,10,65,210,8,74,251,5,65,226,5,75,201,13,32,3,65,9,41,146,41,40,0,0,0,9,1,0,1,0,2,91,99,
+ 19,32,35,106,119,13,70,219,15,83,239,12,137,154,32,2,67,252,19,36,128,0,0,4,1,130,196,32,2,130,8,91,107,8,32,0,135,81,24,73,211,8,132,161,73,164,13,36,0,8,0,128,2,105,123,26,139,67,
+ 76,99,15,34,1,0,128,135,76,83,156,20,92,104,8,67,251,30,24,86,47,27,123,207,12,24,86,7,15,71,227,8,32,4,65,20,20,131,127,32,0,130,123,32,0,71,223,26,32,19,90,195,22,71,223,15,84,200,
+ 6,32,128,133,241,24,84,149,9,67,41,25,36,0,0,0,22,0,88,111,49,32,87,66,21,5,77,3,27,123,75,7,71,143,19,135,183,71,183,19,130,171,74,252,5,131,5,89,87,17,32,1,132,18,130,232,68,11,10,
+ 33,1,128,70,208,16,66,230,18,147,18,130,254,223,255,75,27,23,65,59,15,135,39,155,255,34,128,128,254,104,92,8,33,0,128,65,32,11,65,1,58,33,26,0,130,0,72,71,18,78,55,17,76,11,19,86,101,
+ 12,75,223,11,89,15,11,24,76,87,15,75,235,15,131,15,72,95,7,85,71,11,72,115,11,73,64,6,34,1,128,128,66,215,9,34,128,254,128,134,14,33,128,255,67,102,5,32,0,130,16,70,38,11,66,26,57,
+ 88,11,8,24,76,215,34,78,139,7,95,245,7,32,7,24,73,75,23,32,128,131,167,130,170,101,158,9,82,49,22,118,139,6,32,18,67,155,44,116,187,9,108,55,14,80,155,23,66,131,15,93,77,10,131,168,
+ 32,128,73,211,12,24,75,187,22,32,4,96,71,20,67,108,19,132,19,120,207,8,32,5,76,79,15,66,111,21,66,95,8,32,3,190,211,111,3,8,211,212,32,20,65,167,44,34,75,0,79,97,59,13,32,33,112,63,
+ 10,65,147,19,69,39,19,143,39,24,66,71,9,130,224,65,185,43,94,176,12,65,183,24,71,38,8,24,72,167,7,65,191,38,136,235,24,96,167,12,65,203,62,115,131,13,65,208,42,175,235,67,127,6,32,
+ 4,76,171,29,114,187,5,32,71,65,211,5,65,203,68,72,51,8,164,219,32,0,172,214,71,239,58,78,3,27,66,143,15,77,19,15,147,31,35,33,53,51,21,66,183,10,173,245,66,170,30,150,30,34,0,0,23,
+ 80,123,54,76,1,16,73,125,15,82,245,11,167,253,24,76,85,12,70,184,5,32,254,131,185,37,254,0,128,1,0,128,133,16,117,158,18,92,27,38,65,3,17,130,251,35,17,0,128,254,24,69,83,39,140,243,
+ 121,73,19,109,167,7,81,41,15,24,95,175,12,102,227,15,121,96,11,24,95,189,7,32,3,145,171,154,17,24,77,47,9,33,0,5,70,71,37,68,135,7,32,29,117,171,11,69,87,15,24,79,97,19,24,79,149,23,
+ 131,59,32,1,75,235,5,72,115,11,72,143,7,132,188,71,27,46,131,51,32,0,69,95,6,175,215,32,21,131,167,81,15,19,151,191,151,23,131,215,71,43,5,32,254,24,79,164,24,74,109,8,77,166,13,65,
+ 176,26,88,162,5,98,159,6,171,219,120,247,6,79,29,8,99,169,10,103,59,19,65,209,35,131,35,91,25,19,112,94,15,83,36,8,173,229,33,20,0,88,75,43,71,31,12,65,191,71,33,1,0,130,203,32,254,
+ 131,4,68,66,7,67,130,6,104,61,13,173,215,38,13,1,0,0,0,2,128,67,111,28,74,129,16,104,35,19,79,161,16,87,14,7,138,143,132,10,67,62,36,114,115,5,162,151,67,33,16,108,181,15,143,151,67,
+ 5,5,24,100,242,15,170,153,34,0,0,14,65,51,34,32,55,79,75,9,32,51,74,7,10,65,57,38,132,142,32,254,72,0,14,139,163,32,128,80,254,8,67,158,21,65,63,7,32,4,72,227,27,95,155,12,67,119,19,
+ 124,91,24,149,154,72,177,34,97,223,8,155,151,24,108,227,15,88,147,16,72,117,19,68,35,11,92,253,15,70,199,15,24,87,209,17,32,2,87,233,7,32,1,24,88,195,10,119,24,8,32,3,81,227,24,65,
+ 125,21,35,128,128,0,25,76,59,48,24,90,187,9,97,235,12,66,61,11,91,105,19,24,79,141,11,24,79,117,15,24,79,129,27,90,53,13,130,13,32,253,131,228,24,79,133,40,69,70,8,66,137,31,65,33,
+ 19,96,107,8,68,119,29,66,7,5,68,125,16,65,253,19,65,241,27,24,90,179,13,24,79,143,18,33,128,128,130,246,32,254,130,168,68,154,36,77,51,9,97,47,5,167,195,32,21,131,183,78,239,27,155,
+ 195,78,231,14,201,196,77,11,6,32,5,73,111,37,97,247,12,77,19,31,155,207,78,215,19,162,212,69,17,14,66,91,19,80,143,57,78,203,39,159,215,32,128,93,134,8,24,80,109,24,66,113,15,169,215,
+ 66,115,6,32,4,69,63,33,32,0,101,113,7,86,227,35,143,211,36,49,53,51,21,1,77,185,14,65,159,28,69,251,34,67,56,8,33,9,0,24,107,175,25,90,111,12,110,251,11,119,189,24,119,187,34,87,15,
+ 9,32,4,66,231,37,90,39,7,66,239,8,84,219,15,69,105,23,24,85,27,27,87,31,11,33,1,128,76,94,6,32,1,85,241,7,33,128,128,106,48,10,33,128,128,69,136,11,133,13,24,79,116,49,84,236,8,24,
+ 91,87,9,32,5,165,255,69,115,12,66,27,15,159,15,24,72,247,12,74,178,5,24,80,64,15,33,0,128,143,17,77,89,51,130,214,24,81,43,7,170,215,74,49,8,159,199,143,31,139,215,69,143,5,32,254,
+ 24,81,50,35,181,217,84,123,70,143,195,159,15,65,187,16,66,123,7,65,175,15,65,193,29,68,207,39,79,27,5,70,131,6,32,4,68,211,33,33,67,0,83,143,14,159,207,143,31,140,223,33,0,128,24,80,
+ 82,14,24,93,16,23,32,253,65,195,5,68,227,40,133,214,107,31,7,32,5,67,115,27,87,9,8,107,31,43,66,125,6,32,0,103,177,23,131,127,72,203,36,32,0,110,103,8,155,163,73,135,6,32,19,24,112,
+ 99,10,65,71,11,73,143,19,143,31,126,195,5,24,85,21,9,24,76,47,14,32,254,24,93,77,36,68,207,11,39,25,0,0,255,128,3,128,4,66,51,37,95,247,13,82,255,24,76,39,19,147,221,66,85,27,24,118,
+ 7,8,24,74,249,12,76,74,8,91,234,8,67,80,17,131,222,33,253,0,121,30,44,73,0,16,69,15,6,32,0,65,23,38,69,231,12,65,179,6,98,131,16,86,31,27,24,108,157,14,80,160,8,24,65,46,17,33,4,0,
+ 96,2,18,144,191,65,226,8,68,19,5,171,199,80,9,15,180,199,67,89,5,32,255,24,79,173,28,174,201,24,79,179,50,32,1,24,122,5,10,82,61,10,180,209,83,19,8,32,128,24,80,129,27,111,248,43,131,
+ 71,24,115,103,8,67,127,41,78,213,24,100,247,19,66,115,39,75,107,5,32,254,165,219,78,170,40,24,112,163,49,32,1,97,203,6,65,173,64,32,0,83,54,7,133,217,88,37,12,32,254,131,28,33,128,
+ 3,67,71,44,84,183,6,32,5,69,223,33,96,7,7,123,137,16,192,211,24,112,14,9,32,255,67,88,29,68,14,10,84,197,38,33,0,22,116,47,50,32,87,106,99,9,116,49,15,89,225,15,97,231,23,70,41,19,
+ 82,85,8,93,167,6,32,253,132,236,108,190,7,89,251,5,116,49,58,33,128,128,131,234,32,15,24,74,67,38,70,227,24,24,83,45,23,89,219,12,70,187,12,89,216,19,32,2,69,185,24,141,24,70,143,66,
+ 24,82,119,56,78,24,10,32,253,133,149,132,6,24,106,233,7,69,198,48,178,203,81,243,12,68,211,15,106,255,23,66,91,15,69,193,7,100,39,10,24,83,72,16,176,204,33,19,0,88,207,45,68,21,12,
+ 68,17,10,65,157,53,68,17,6,32,254,92,67,10,65,161,25,69,182,43,24,118,91,47,69,183,18,181,209,111,253,12,89,159,8,66,112,12,69,184,45,35,0,0,0,9,24,80,227,26,73,185,16,118,195,15,131,
+ 15,33,1,0,65,59,15,66,39,27,160,111,66,205,12,148,111,143,110,33,128,128,156,112,24,81,199,8,75,199,23,66,117,20,155,121,32,254,68,126,12,72,213,29,134,239,149,123,89,27,16,148,117,
+ 65,245,8,24,71,159,14,141,134,134,28,73,51,55,109,77,15,105,131,11,68,67,11,76,169,27,107,209,12,102,174,8,32,128,72,100,18,116,163,56,79,203,11,75,183,44,85,119,19,71,119,23,151,227,
+ 32,1,93,27,8,65,122,5,77,102,8,110,120,20,66,23,8,66,175,17,66,63,12,133,12,79,35,8,74,235,33,67,149,16,69,243,15,78,57,15,69,235,16,67,177,7,151,192,130,23,67,84,29,141,192,174,187,
+ 77,67,15,69,11,12,159,187,77,59,10,199,189,24,70,235,50,96,83,19,66,53,23,105,65,19,77,47,12,163,199,66,67,37,78,207,50,67,23,23,174,205,67,228,6,71,107,13,67,22,14,66,85,11,83,187,
+ 38,124,47,49,95,7,19,66,83,23,67,23,19,24,96,78,17,80,101,16,71,98,40,33,0,7,88,131,22,24,89,245,12,84,45,12,102,213,5,123,12,9,32,2,126,21,14,43,255,0,128,128,0,0,20,0,128,255,128,
+ 3,126,19,39,32,75,106,51,7,113,129,15,24,110,135,19,126,47,15,115,117,11,69,47,11,32,2,109,76,9,102,109,9,32,128,75,2,10,130,21,32,254,69,47,6,32,3,94,217,47,32,0,65,247,10,69,15,46,
+ 65,235,31,65,243,15,101,139,10,66,174,14,65,247,16,72,102,28,69,17,14,84,243,9,165,191,88,47,48,66,53,12,32,128,71,108,6,203,193,32,17,75,187,42,73,65,16,65,133,52,114,123,9,167,199,
+ 69,21,37,86,127,44,75,171,11,180,197,78,213,12,148,200,81,97,46,24,95,243,9,32,4,66,75,33,113,103,9,87,243,36,143,225,24,84,27,31,90,145,8,148,216,67,49,5,24,84,34,14,75,155,27,67,
+ 52,13,140,13,36,0,20,0,128,255,24,135,99,46,88,59,43,155,249,80,165,7,136,144,71,161,23,32,253,132,33,32,254,88,87,44,136,84,35,128,0,0,21,81,103,5,94,47,44,76,51,12,143,197,151,15,
+ 65,215,31,24,64,77,13,65,220,20,65,214,14,71,4,40,65,213,13,32,0,130,0,35,21,1,2,0,135,0,34,36,0,72,134,10,36,1,0,26,0,130,134,11,36,2,0,14,0,108,134,11,32,3,138,23,32,4,138,11,34,
+ 5,0,20,134,33,34,0,0,6,132,23,32,1,134,15,32,18,130,25,133,11,37,1,0,13,0,49,0,133,11,36,2,0,7,0,38,134,11,36,3,0,17,0,45,134,11,32,4,138,35,36,5,0,10,0,62,134,23,32,6,132,23,36,3,
+ 0,1,4,9,130,87,131,167,133,11,133,167,133,11,133,167,133,11,37,3,0,34,0,122,0,133,11,133,167,133,11,133,167,133,11,133,167,34,50,0,48,130,1,34,52,0,47,134,5,8,49,49,0,53,98,121,32,
+ 84,114,105,115,116,97,110,32,71,114,105,109,109,101,114,82,101,103,117,108,97,114,84,84,88,32,80,114,111,103,103,121,67,108,101,97,110,84,84,50,48,48,52,47,130,2,53,49,53,0,98,0,121,
+ 0,32,0,84,0,114,0,105,0,115,0,116,0,97,0,110,130,15,32,71,132,15,36,109,0,109,0,101,130,9,32,82,130,5,36,103,0,117,0,108,130,29,32,114,130,43,34,84,0,88,130,35,32,80,130,25,34,111,
+ 0,103,130,1,34,121,0,67,130,27,32,101,132,59,32,84,130,31,33,0,0,65,155,9,34,20,0,0,65,11,6,130,8,135,2,33,1,1,130,9,8,120,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,
+ 1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,
+ 22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,130,187,8,66,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,
+ 57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,130,243,9,75,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,
+ 92,0,93,0,94,0,95,0,96,0,97,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,
+ 63,1,64,1,65,0,172,0,163,0,132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,239,0,138,0,218,0,131,0,147,0,242,0,243,0,141,0,151,0,136,0,195,0,222,0,241,0,158,0,170,
+ 0,245,0,244,0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200,0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0,240,0,145,0,214,0,
+ 212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109,0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,
+ 161,0,127,0,126,0,128,0,129,0,236,0,238,0,186,14,117,110,105,99,111,100,101,35,48,120,48,48,48,49,141,14,32,50,141,14,32,51,141,14,32,52,141,14,32,53,141,14,32,54,141,14,32,55,141,
+ 14,32,56,141,14,32,57,141,14,32,97,141,14,32,98,141,14,32,99,141,14,32,100,141,14,32,101,141,14,32,102,140,14,33,49,48,141,14,141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,
+ 141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,141,239,32,49,141,239,45,49,102,6,100,101,108,101,116,101,4,69,117,114,
+ 111,140,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,32,56,141,236,
+ 32,56,141,236,32,56,141,236,32,56,65,220,13,32,57,65,220,13,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,
+ 239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,32,57,141,239,35,57,102,0,0,5,250,72,249,98,247,
+};
+
+static const char* GetDefaultCompressedFontDataTTF(int* out_size)
+{
+ *out_size = proggy_clean_ttf_compressed_size;
+ return (const char*)proggy_clean_ttf_compressed_data;
}
+#endif // #ifndef IMGUI_DISABLE_DEFAULT_FONT
#endif // #ifndef IMGUI_DISABLE
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_internal.h b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_internal.h
index 015f6b65756..ddf9ea3e9af 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_internal.h
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_internal.h
@@ -1,10 +1,7 @@
-// dear imgui, v1.89.1 WIP
+// dear imgui, v1.91.9b
// (internal structures/api)
-// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
-// Set:
-// #define IMGUI_DEFINE_MATH_OPERATORS
-// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
+// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
/*
@@ -17,16 +14,22 @@ Index of this file:
// [SECTION] Macros
// [SECTION] Generic helpers
// [SECTION] ImDrawList support
+// [SECTION] Style support
+// [SECTION] Data types support
// [SECTION] Widgets support: flags, enums, data structures
+// [SECTION] Popup support
// [SECTION] Inputs support
// [SECTION] Clipper support
// [SECTION] Navigation support
+// [SECTION] Typing-select support
// [SECTION] Columns support
+// [SECTION] Box-select support
// [SECTION] Multi-select support
// [SECTION] Docking support
// [SECTION] Viewport support
// [SECTION] Settings support
// [SECTION] Localization support
+// [SECTION] Error handling, State recovery support
// [SECTION] Metrics, Debug tools
// [SECTION] Generic context hooks
// [SECTION] ImGuiContext (main imgui context)
@@ -56,9 +59,17 @@ Index of this file:
#include <limits.h> // INT_MIN, INT_MAX
// Enable SSE intrinsics if available
-#if (defined __SSE__ || defined __x86_64__ || defined _M_X64) && !defined(IMGUI_DISABLE_SSE)
+#if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE)
#define IMGUI_ENABLE_SSE
#include <immintrin.h>
+#if (defined __AVX__ || defined __SSE4_2__)
+#define IMGUI_ENABLE_SSE4_2
+#include <nmmintrin.h>
+#endif
+#endif
+// Emscripten has partial SSE 4.2 support where _mm_crc32_u32 is not available. See https://emscripten.org/docs/porting/simd.html#id11 and #8213
+#if defined(IMGUI_ENABLE_SSE4_2) && !defined(IMGUI_USE_LEGACY_CRC32_ADLER) && !defined(__EMSCRIPTEN__)
+#define IMGUI_ENABLE_SSE4_2_CRC
#endif
// Visual Studio warnings
@@ -79,18 +90,27 @@ Index of this file:
#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
#endif
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
-#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned()
-#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
-#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
-#pragma clang diagnostic ignored "-Wold-style-cast"
-#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
-#pragma clang diagnostic ignored "-Wdouble-promotion"
+#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor()
+#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant
+#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
+#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
#elif defined(__GNUC__)
#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
+#endif
+
+// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
+// As they are frequently requested, we do not want to encourage to many people using imgui_internal.h
+#if defined(IMGUI_DEFINE_MATH_OPERATORS) && !defined(IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED)
+#error Please '#define IMGUI_DEFINE_MATH_OPERATORS' _BEFORE_ including imgui.h!
#endif
// Legacy defines
@@ -111,20 +131,33 @@ Index of this file:
// [SECTION] Forward declarations
//-----------------------------------------------------------------------------
+// Utilities
+// (other types which are not forwarded declared are: ImBitArray<>, ImSpan<>, ImSpanAllocator<>, ImPool<>, ImChunkStream<>)
struct ImBitVector; // Store 1-bit per value
struct ImRect; // An axis-aligned rectangle (2 points)
+struct ImGuiTextIndex; // Maintain a line index for a text buffer.
+
+// ImDrawList/ImFontAtlas
struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
struct ImDrawListSharedData; // Data shared between all ImDrawList instances
+
+// ImGui
+struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)
struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
struct ImGuiContext; // Main Dear ImGui context
struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine
struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
+struct ImGuiDeactivatedItemData; // Data for IsItemDeactivated()/IsItemDeactivatedAfterEdit() function.
+struct ImGuiErrorRecoveryState; // Storage of stack sizes for error handling and recovery
struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
+struct ImGuiInputTextDeactivateData;// Short term storage to backup text of a deactivating InputText() while another is stealing active id
struct ImGuiLastItemData; // Status storage for last submitted items
struct ImGuiLocEntry; // A localization entry.
struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
-struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result
+struct ImGuiMultiSelectState; // Multi-selection persistent state (for focused selection).
+struct ImGuiMultiSelectTempData; // Multi-selection temporary state (while traversing).
+struct ImGuiNavItemData; // Result of a keyboard/gamepad directional navigation move query result
struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
struct ImGuiNextItemData; // Storage for SetNextItem** functions
@@ -132,16 +165,20 @@ struct ImGuiOldColumnData; // Storage data for a single column for lega
struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api
struct ImGuiPopupData; // Storage for current popup stack
struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
-struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting
struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
+struct ImGuiStyleVarInfo; // Style variable information (e.g. to access style variables from an enum)
struct ImGuiTabBar; // Storage for a tab bar
struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
struct ImGuiTable; // Storage for a table
+struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow()
struct ImGuiTableColumn; // Storage for one column of a table
struct ImGuiTableInstanceData; // Storage for one instance of a same table
struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables.
struct ImGuiTableSettings; // Storage for a table .ini settings
struct ImGuiTableColumnsSettings; // Storage for a column .ini settings
+struct ImGuiTreeNodeStackData; // Temporary storage for TreeNode().
+struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest()
+struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public)
struct ImGuiWindow; // Storage for one window
struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)
struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
@@ -154,11 +191,11 @@ typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // E
// Flags
typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
-typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc.
-typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), g.LastItemData.InFlags
+typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow()
typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags
typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()
-typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
+typedef int ImGuiLogFlags; // -> enum ImGuiLogFlags_ // Flags: for LogBegin() text capturing function
+typedef int ImGuiNavRenderCursorFlags; // -> enum ImGuiNavRenderCursorFlags_//Flags: for RenderNavCursor()
typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
@@ -166,8 +203,8 @@ typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // F
typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()
typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
-
-typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
+typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest()
+typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()
//-----------------------------------------------------------------------------
// [SECTION] Context pointer
@@ -178,24 +215,6 @@ typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
#endif
-//-------------------------------------------------------------------------
-// [SECTION] STB libraries includes
-//-------------------------------------------------------------------------
-
-namespace ImStb
-{
-
-#undef STB_TEXTEDIT_STRING
-#undef STB_TEXTEDIT_CHARTYPE
-#define STB_TEXTEDIT_STRING ImGuiInputTextState
-#define STB_TEXTEDIT_CHARTYPE ImWchar
-#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
-#define STB_TEXTEDIT_UNDOSTATECOUNT 99
-#define STB_TEXTEDIT_UNDOCHARCOUNT 999
-#include "imstb_textedit.h"
-
-} // namespace ImStb
-
//-----------------------------------------------------------------------------
// [SECTION] Macros
//-----------------------------------------------------------------------------
@@ -206,18 +225,21 @@ namespace ImStb
#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
#define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__)
#else
-#define IMGUI_DEBUG_PRINTF(_FMT,...)
+#define IMGUI_DEBUG_PRINTF(_FMT,...) ((void)0)
#endif
#endif
// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
-#define IMGUI_DEBUG_LOG(...) ImGui::DebugLog(__VA_ARGS__)
-#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_ERROR(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g.DebugLogSkippedErrors++; } while (0)
+#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_FONT(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFont) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
// Static Asserts
#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
@@ -231,12 +253,6 @@ namespace ImStb
#define IM_ASSERT_PARANOID(_EXPR)
#endif
-// Error handling
-// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults.
-#ifndef IM_ASSERT_USER_ERROR
-#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error
-#endif
-
// Misc Macros
#define IM_PI 3.14159265358979323846f
#ifdef _WIN32
@@ -250,8 +266,22 @@ namespace ImStb
#define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8
#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
-#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds
+#define IM_TRUNC(_VAL) ((float)(int)(_VAL)) // ImTrunc() is not inlined in MSVC debug builds
#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
+#define IM_STRINGIFY_HELPER(_X) #_X
+#define IM_STRINGIFY(_X) IM_STRINGIFY_HELPER(_X) // Preprocessor idiom to stringify e.g. an integer.
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+#define IM_FLOOR IM_TRUNC
+#endif
+
+// Hint for branch prediction
+#if (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
+#define IM_LIKELY [[likely]]
+#define IM_UNLIKELY [[unlikely]]
+#else
+#define IM_LIKELY
+#define IM_UNLIKELY
+#endif
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
#ifdef _MSC_VER
@@ -276,16 +306,28 @@ namespace ImStb
#elif defined(__clang__)
#define IM_DEBUG_BREAK() __builtin_debugtrap()
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-#define IM_DEBUG_BREAK() __asm__ volatile("int $0x03")
+#define IM_DEBUG_BREAK() __asm__ volatile("int3;nop")
#elif defined(__GNUC__) && defined(__thumb__)
#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01")
#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__)
-#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0");
+#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0")
#else
#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!
#endif
#endif // #ifndef IM_DEBUG_BREAK
+// Format specifiers, printing 64-bit hasn't been decently standardized...
+// In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself.
+#if defined(_MSC_VER) && !defined(__clang__)
+#define IM_PRId64 "I64d"
+#define IM_PRIu64 "I64u"
+#define IM_PRIX64 "I64X"
+#else
+#define IM_PRId64 "lld"
+#define IM_PRIu64 "llu"
+#define IM_PRIX64 "llX"
+#endif
+
//-----------------------------------------------------------------------------
// [SECTION] Generic helpers
// Note that the ImXXX helpers functions are lower-level than ImGui functions.
@@ -309,11 +351,12 @@ namespace ImStb
// - Helper: ImPool<>
// - Helper: ImChunkStream<>
// - Helper: ImGuiTextIndex
+// - Helper: ImGuiStorage
//-----------------------------------------------------------------------------
// Helpers: Hashing
-IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
-IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
+IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImGuiID seed = 0);
+IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImGuiID seed = 0);
// Helpers: Sorting
#ifndef ImQsort
@@ -324,27 +367,31 @@ static inline void ImQsort(void* base, size_t count, size_t size_of_element
IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
// Helpers: Bit manipulation
-static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
-static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
-static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
+static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
+static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
+static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
+static inline unsigned int ImCountSetBits(unsigned int v) { unsigned int count = 0; while (v > 0) { v = v & (v - 1); count++; } return count; }
// Helpers: String
-IMGUI_API int ImStricmp(const char* str1, const char* str2);
-IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);
-IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);
-IMGUI_API char* ImStrdup(const char* str);
-IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);
-IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c);
-IMGUI_API int ImStrlenW(const ImWchar* str);
+#define ImStrlen strlen
+#define ImMemchr memchr
+IMGUI_API int ImStricmp(const char* str1, const char* str2); // Case insensitive compare.
+IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); // Case insensitive compare to a certain count.
+IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); // Copy to a certain count and always zero terminate (strncpy doesn't).
+IMGUI_API char* ImStrdup(const char* str); // Duplicate a string.
+IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); // Copy in provided buffer, recreate buffer if needed.
+IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); // Find first occurrence of 'c' in string range.
IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
-IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line
-IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
-IMGUI_API void ImStrTrimBlanks(char* str);
-IMGUI_API const char* ImStrSkipBlank(const char* str);
+IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); // Find a substring in a string range.
+IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer.
+IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character.
+IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string)
+IMGUI_API const char* ImStrbol(const char* buf_mid_line, const char* buf_begin); // Find beginning-of-line
IM_MSVC_RUNTIME_CHECKS_OFF
static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }
static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
+static inline bool ImCharIsXdigitA(char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }
IM_MSVC_RUNTIME_CHECKS_RESTORE
// Helpers: Formatting
@@ -367,29 +414,8 @@ IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, co
IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
-
-// Helpers: ImVec2/ImVec4 operators
-// We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.)
-// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself.
-#ifdef IMGUI_DEFINE_MATH_OPERATORS
-IM_MSVC_RUNTIME_CHECKS_OFF
-static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); }
-static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); }
-static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); }
-static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); }
-static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
-static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); }
-static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
-static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
-static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
-static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
-static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; }
-static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; }
-static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); }
-static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); }
-static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); }
-IM_MSVC_RUNTIME_CHECKS_RESTORE
-#endif
+IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr); // return previous UTF-8 code-point.
+IMGUI_API int ImTextCountLines(const char* in_text, const char* in_text_end); // return number of lines taken by text. trailing carriage return doesn't count as an extra line.
// Helpers: File System
#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
@@ -425,7 +451,6 @@ IM_MSVC_RUNTIME_CHECKS_OFF
#define ImAcos(X) acosf(X)
#define ImAtan2(Y, X) atan2f((Y), (X))
#define ImAtof(STR) atof(STR)
-//#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned()
#define ImCeil(X) ceilf(X)
static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
static inline double ImPow(double x, double y) { return pow(x, y); }
@@ -455,7 +480,7 @@ template<typename T> static inline T ImSubClampOverflow(T a, T b, T mn, T mx)
// - Misc maths helpers
static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }
static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }
-static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }
+static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2&mn, const ImVec2&mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }
static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }
static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }
static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }
@@ -463,16 +488,18 @@ static inline float ImSaturate(float f)
static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; }
-static inline float ImFloor(float f) { return (float)(int)(f); }
-static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
-static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
-static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); }
+static inline float ImTrunc(float f) { return (float)(int)(f); }
+static inline ImVec2 ImTrunc(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
+static inline float ImFloor(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
+static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2(ImFloor(v.x), ImFloor(v.y)); }
static inline int ImModPositive(int a, int b) { return (a + b) % b; }
static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }
static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }
+static inline float ImLinearRemapClamp(float s0, float s1, float d0, float d1, float x) { return ImSaturate((x - s0) / (s1 - s0)) * (d1 - d0) + d0; }
static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; }
+static inline float ImExponentialMovingAverage(float avg, float sample, int n) { avg -= avg / n; avg += sample / n; return avg; }
IM_MSVC_RUNTIME_CHECKS_RESTORE
// Helpers: Geometry
@@ -484,8 +511,8 @@ IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const
IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
-inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
-IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
+inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
+inline bool ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; }
// Helper: ImVec1 (1D vector)
// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
@@ -529,6 +556,7 @@ struct IMGUI_API ImRect
ImVec2 GetBR() const { return Max; } // Bottom-right
bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }
+ bool ContainsWithPad(const ImVec2& p, const ImVec2& pad) const { return p.x >= Min.x - pad.x && p.y >= Min.y - pad.y && p.x < Max.x + pad.x && p.y < Max.y + pad.y; }
bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; }
void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }
@@ -539,13 +567,16 @@ struct IMGUI_API ImRect
void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
- void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
+ void Floor() { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); }
bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
};
-IM_MSVC_RUNTIME_CHECKS_RESTORE
// Helper: ImBitArray
+#define IM_BITARRAY_TESTBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] & ((ImU32)1 << ((_N) & 31))) != 0) // Macro version of ImBitArrayTestBit(): ensure args have side-effect or are costly!
+#define IM_BITARRAY_CLEARBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] &= ~((ImU32)1 << ((_N) & 31)))) // Macro version of ImBitArrayClearBit(): ensure args have side-effect or are costly!
+inline size_t ImBitArrayGetStorageSizeInBytes(int bitcount) { return (size_t)((bitcount + 31) >> 5) << 2; }
+inline void ImBitArrayClearAllBits(ImU32* arr, int bitcount){ memset(arr, 0, ImBitArrayGetStorageSizeInBytes(bitcount)); }
inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
@@ -562,6 +593,8 @@ inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on ran
}
}
+typedef ImU32* ImBitArrayPtr; // Name for use in structs
+
// Helper: ImBitArray class (wrapper over ImBitArray functions)
// Store 1-bit per value.
template<int BITCOUNT, int OFFSET = 0>
@@ -571,11 +604,11 @@ struct ImBitArray
ImBitArray() { ClearAllBits(); }
void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); }
void SetAllBits() { memset(Storage, 255, sizeof(Storage)); }
- bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); }
+ bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); }
void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); }
void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); }
void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2)
- bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); }
+ bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); }
};
// Helper: ImBitVector
@@ -585,10 +618,11 @@ struct IMGUI_API ImBitVector
ImVector<ImU32> Storage;
void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
void Clear() { Storage.clear(); }
- bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); }
+ bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return IM_BITARRAY_TESTBIT(Storage.Data, n); }
void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
};
+IM_MSVC_RUNTIME_CHECKS_RESTORE
// Helper: ImSpan<>
// Pointing to a span of data we don't own.
@@ -672,9 +706,6 @@ struct ImPool
int GetBufSize() const { return Buf.Size; }
int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere
T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304)
-#endif
};
// Helper: ImChunkStream<>
@@ -698,10 +729,9 @@ struct ImChunkStream
int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; }
T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
-
};
-// Helper: ImGuiTextIndex<>
+// Helper: ImGuiTextIndex
// Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.
struct ImGuiTextIndex
{
@@ -715,6 +745,9 @@ struct ImGuiTextIndex
void append(const char* base, int old_size, int new_size);
};
+// Helper: ImGuiStorage
+IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key);
+
//-----------------------------------------------------------------------------
// [SECTION] ImDrawList support
//-----------------------------------------------------------------------------
@@ -745,25 +778,27 @@ struct ImGuiTextIndex
#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
// Data shared between all ImDrawList instances
-// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
+// Conceptually this could have been called e.g. ImDrawListSharedContext
+// Typically one ImGui context would create and maintain one of this.
+// You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
struct IMGUI_API ImDrawListSharedData
{
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
+ const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
float FontSize; // Current/default font size (optional, for simplified AddText overload)
+ float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
- ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
+ float InitialFringeScale; // Initial scale to apply to AA fringe
ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
+ ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
+ ImVector<ImVec2> TempBuffer; // Temporary write buffer
- // [Internal] Temp write buffer
- ImVector<ImVec2> TempBuffer;
-
- // [Internal] Lookup tables
+ // Lookup tables
ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
- const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
ImDrawListSharedData();
void SetCircleTessellationMaxError(float max_error);
@@ -771,39 +806,93 @@ struct IMGUI_API ImDrawListSharedData
struct ImDrawDataBuilder
{
- ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
+ ImVector<ImDrawList*>* Layers[2]; // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData.
+ ImVector<ImDrawList*> LayerData1;
- void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
- void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
- int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; }
- IMGUI_API void FlattenIntoSingleLayer();
+ ImDrawDataBuilder() { memset(this, 0, sizeof(*this)); }
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Style support
+//-----------------------------------------------------------------------------
+
+struct ImGuiStyleVarInfo
+{
+ ImU32 Count : 8; // 1+
+ ImGuiDataType DataType : 8;
+ ImU32 Offset : 16; // Offset in parent structure
+ void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }
+};
+
+// Stacked color modifier, backup of modified data so we can restore it
+struct ImGuiColorMod
+{
+ ImGuiCol Col;
+ ImVec4 BackupValue;
+};
+
+// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
+struct ImGuiStyleMod
+{
+ ImGuiStyleVar VarIdx;
+ union { int BackupInt[2]; float BackupFloat[2]; };
+ ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
+ ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
+ ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Data types support
+//-----------------------------------------------------------------------------
+
+struct ImGuiDataTypeStorage
+{
+ ImU8 Data[8]; // Opaque storage to fit any data up to ImGuiDataType_COUNT
+};
+
+// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
+struct ImGuiDataTypeInfo
+{
+ size_t Size; // Size in bytes
+ const char* Name; // Short descriptive name for the type, for debugging
+ const char* PrintFmt; // Default printf format for the type
+ const char* ScanFmt; // Default scanf format for the type
+};
+
+// Extend ImGuiDataType_
+enum ImGuiDataTypePrivate_
+{
+ ImGuiDataType_Pointer = ImGuiDataType_COUNT,
+ ImGuiDataType_ID,
};
//-----------------------------------------------------------------------------
// [SECTION] Widgets support: flags, enums, data structures
//-----------------------------------------------------------------------------
-// Flags used by upcoming items
-// - input: PushItemFlag() manipulates g.CurrentItemFlags, ItemAdd() calls may add extra flags.
-// - output: stored in g.LastItemData.InFlags
-// Current window shared by all windows.
-// This is going to be exposed in imgui.h when stabilized enough.
-enum ImGuiItemFlags_
+// Extend ImGuiItemFlags
+// - input: PushItemFlag() manipulates g.CurrentItemFlags, g.NextItemData.ItemFlags, ItemAdd() calls may add extra flags too.
+// - output: stored in g.LastItemData.ItemFlags
+enum ImGuiItemFlagsPrivate_
{
// Controlled by user
- ImGuiItemFlags_None = 0,
- ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing (FIXME: should merge with _NoNav)
- ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
- ImGuiItemFlags_Disabled = 1 << 2, // false // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211
- ImGuiItemFlags_NoNav = 1 << 3, // false // Disable keyboard/gamepad directional navigation (FIXME: should merge with _NoTabStop)
- ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false // Disable item being a candidate for default focus (e.g. used by title bar items)
- ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // Disable MenuItem/Selectable() automatically closing their popup window
- ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
- ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
- ImGuiItemFlags_NoWindowHoverableCheck = 1 << 8, // false // Disable hoverable check in ItemHoverable()
+ ImGuiItemFlags_Disabled = 1 << 10, // false // Disable interactions (DOES NOT affect visuals. DO NOT mix direct use of this with BeginDisabled(). See BeginDisabled()/EndDisabled() for full disable feature, and github #211).
+ ImGuiItemFlags_ReadOnly = 1 << 11, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
+ ImGuiItemFlags_MixedValue = 1 << 12, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
+ ImGuiItemFlags_NoWindowHoverableCheck = 1 << 13, // false // Disable hoverable check in ItemHoverable()
+ ImGuiItemFlags_AllowOverlap = 1 << 14, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.
+ ImGuiItemFlags_NoNavDisableMouseHover = 1 << 15, // false // Nav keyboard/gamepad mode doesn't disable hover highlight (behave as if NavHighlightItemUnderNav==false).
+ ImGuiItemFlags_NoMarkEdited = 1 << 16, // false // Skip calling MarkItemEdited()
// Controlled by widget code
- ImGuiItemFlags_Inputable = 1 << 10, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
+ ImGuiItemFlags_Inputable = 1 << 20, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
+ ImGuiItemFlags_HasSelectionUserData = 1 << 21, // false // Set by SetNextItemSelectionUserData()
+ ImGuiItemFlags_IsMultiSelect = 1 << 22, // false // Set by SetNextItemSelectionUserData()
+
+ ImGuiItemFlags_Default_ = ImGuiItemFlags_AutoClosePopups, // Please don't change, use PushItemFlag() instead.
+
+ // Obsolete
+ //ImGuiItemFlags_SelectableDontClosePopup = !ImGuiItemFlags_AutoClosePopups, // Can't have a redirect as we inverted the behavior
};
// Status flags for an already submitted item
@@ -819,24 +908,35 @@ enum ImGuiItemStatusFlags_
ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing.
- ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon)
- ImGuiItemStatusFlags_Visible = 1 << 9, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()).
+ ImGuiItemStatusFlags_Visible = 1 << 8, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()).
+ ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid.
+ ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd().
+ // Additional status + semantic for ImGuiTestEngine
#ifdef IMGUI_ENABLE_TEST_ENGINE
ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode)
- ImGuiItemStatusFlags_Opened = 1 << 21, //
+ ImGuiItemStatusFlags_Opened = 1 << 21, // Opened status
ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem)
- ImGuiItemStatusFlags_Checked = 1 << 23, //
+ ImGuiItemStatusFlags_Checked = 1 << 23, // Checked status
+ ImGuiItemStatusFlags_Inputable = 1 << 24, // Item is a text-inputable (e.g. InputText, SliderXXX, DragXXX)
#endif
};
+// Extend ImGuiHoveredFlags_
+enum ImGuiHoveredFlagsPrivate_
+{
+ ImGuiHoveredFlags_DelayMask_ = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay,
+ ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary,
+ ImGuiHoveredFlags_AllowedMaskForIsItemHovered = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_,
+};
+
// Extend ImGuiInputTextFlags_
enum ImGuiInputTextFlagsPrivate_
{
// [Internal]
ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
- ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data
- ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
+ ImGuiInputTextFlags_MergedItem = 1 << 27, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
+ ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 28, // For internal use by InputScalar() and TempInputScalar()
};
// Extend ImGuiButtonFlags_
@@ -848,15 +948,15 @@ enum ImGuiButtonFlagsPrivate_
ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)
ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)
ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
- ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat
+ //ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat -> use ImGuiItemFlags_ButtonRepeat instead.
ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
- ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
- ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED]
+ ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable.
+ //ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press
//ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
- ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held
+ ImGuiButtonFlags_NoKeyModsAllowed = 1 << 16, // disable mouse interaction if a key modifier is held
ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
- ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used everytime an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags)
+ ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used every time an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.ItemFlags)
ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item
ImGuiButtonFlags_NoSetKeyOwner = 1 << 20, // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
ImGuiButtonFlags_NoTestKeyOwner = 1 << 21, // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
@@ -874,7 +974,7 @@ enum ImGuiComboFlagsPrivate_
enum ImGuiSliderFlagsPrivate_
{
ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically?
- ImGuiSliderFlags_ReadOnly = 1 << 21,
+ ImGuiSliderFlags_ReadOnly = 1 << 21, // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead.
};
// Extend ImGuiSelectableFlags_
@@ -886,16 +986,17 @@ enum ImGuiSelectableFlagsPrivate_
ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release)
ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release)
ImGuiSelectableFlags_SpanAvailWidth = 1 << 24, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus)
- ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 25, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow.
- ImGuiSelectableFlags_SetNavIdOnHover = 1 << 26, // Set Nav/Focus ID on mouse hover (used by MenuItem)
- ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 27, // Disable padding each side with ItemSpacing * 0.5f
- ImGuiSelectableFlags_NoSetKeyOwner = 1 << 28, // Don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
+ ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem)
+ ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26, // Disable padding each side with ItemSpacing * 0.5f
+ ImGuiSelectableFlags_NoSetKeyOwner = 1 << 27, // Don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
};
// Extend ImGuiTreeNodeFlags_
enum ImGuiTreeNodeFlagsPrivate_
{
- ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20,
+ ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 28,// FIXME-WIP: Hard-coded for CollapsingHeader()
+ ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 29,// FIXME-WIP: Turn Down arrow into an Up arrow, for reversed trees (#6517)
+ ImGuiTreeNodeFlags_OpenOnMask_ = ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_OpenOnArrow,
};
enum ImGuiSeparatorFlags_
@@ -903,7 +1004,17 @@ enum ImGuiSeparatorFlags_
ImGuiSeparatorFlags_None = 0,
ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
ImGuiSeparatorFlags_Vertical = 1 << 1,
- ImGuiSeparatorFlags_SpanAllColumns = 1 << 2,
+ ImGuiSeparatorFlags_SpanAllColumns = 1 << 2, // Make separator cover all columns of a legacy Columns() set.
+};
+
+// Flags for FocusWindow(). This is not called ImGuiFocusFlags to avoid confusion with public-facing ImGuiFocusedFlags.
+// FIXME: Once we finishing replacing more uses of GetTopMostPopupModal()+IsWindowWithinBeginStackOf()
+// and FindBlockingModal() with this, we may want to change the flag to be opt-out instead of opt-in.
+enum ImGuiFocusRequestFlags_
+{
+ ImGuiFocusRequestFlags_None = 0,
+ ImGuiFocusRequestFlags_RestoreFocusedChild = 1 << 0, // Find last focused child (if any) and focus it instead.
+ ImGuiFocusRequestFlags_UnlessBelowModal = 1 << 1, // Do not set focus if the window is below a modal.
};
enum ImGuiTextFlags_
@@ -915,7 +1026,7 @@ enum ImGuiTextFlags_
enum ImGuiTooltipFlags_
{
ImGuiTooltipFlags_None = 0,
- ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0, // Override will clear/ignore previously submitted tooltip (defaults to append)
+ ImGuiTooltipFlags_OverridePrevious = 1 << 1, // Clear/ignore previously submitted tooltip (defaults to append)
};
// FIXME: this is in development, not exposed/functional as a generic feature yet.
@@ -926,13 +1037,16 @@ enum ImGuiLayoutType_
ImGuiLayoutType_Vertical = 1
};
-enum ImGuiLogType
+// Flags for LogBegin() text capturing function
+enum ImGuiLogFlags_
{
- ImGuiLogType_None = 0,
- ImGuiLogType_TTY,
- ImGuiLogType_File,
- ImGuiLogType_Buffer,
- ImGuiLogType_Clipboard,
+ ImGuiLogFlags_None = 0,
+
+ ImGuiLogFlags_OutputTTY = 1 << 0,
+ ImGuiLogFlags_OutputFile = 1 << 1,
+ ImGuiLogFlags_OutputBuffer = 1 << 2,
+ ImGuiLogFlags_OutputClipboard = 1 << 3,
+ ImGuiLogFlags_OutputMask_ = ImGuiLogFlags_OutputTTY | ImGuiLogFlags_OutputFile | ImGuiLogFlags_OutputBuffer | ImGuiLogFlags_OutputClipboard,
};
// X/Y enums are fixed to 0/1 so they may be used to index ImVec2
@@ -949,52 +1063,6 @@ enum ImGuiPlotType
ImGuiPlotType_Histogram,
};
-enum ImGuiPopupPositionPolicy
-{
- ImGuiPopupPositionPolicy_Default,
- ImGuiPopupPositionPolicy_ComboBox,
- ImGuiPopupPositionPolicy_Tooltip,
-};
-
-struct ImGuiDataTypeTempStorage
-{
- ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT
-};
-
-// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
-struct ImGuiDataTypeInfo
-{
- size_t Size; // Size in bytes
- const char* Name; // Short descriptive name for the type, for debugging
- const char* PrintFmt; // Default printf format for the type
- const char* ScanFmt; // Default scanf format for the type
-};
-
-// Extend ImGuiDataType_
-enum ImGuiDataTypePrivate_
-{
- ImGuiDataType_String = ImGuiDataType_COUNT + 1,
- ImGuiDataType_Pointer,
- ImGuiDataType_ID,
-};
-
-// Stacked color modifier, backup of modified data so we can restore it
-struct ImGuiColorMod
-{
- ImGuiCol Col;
- ImVec4 BackupValue;
-};
-
-// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
-struct ImGuiStyleMod
-{
- ImGuiStyleVar VarIdx;
- union { int BackupInt[2]; float BackupFloat[2]; };
- ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
- ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
- ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
-};
-
// Storage data for BeginComboPreview()/EndComboPreview()
struct IMGUI_API ImGuiComboPreviewData
{
@@ -1014,13 +1082,15 @@ struct IMGUI_API ImGuiGroupData
ImGuiID WindowID;
ImVec2 BackupCursorPos;
ImVec2 BackupCursorMaxPos;
+ ImVec2 BackupCursorPosPrevLine;
ImVec1 BackupIndent;
ImVec1 BackupGroupOffset;
ImVec2 BackupCurrLineSize;
float BackupCurrLineTextBaseOffset;
ImGuiID BackupActiveIdIsAlive;
- bool BackupActiveIdPreviousFrameIsAlive;
+ bool BackupDeactivatedIdIsAlive;
bool BackupHoveredIdIsAlive;
+ bool BackupIsSameLine;
bool EmitItem;
};
@@ -1042,56 +1112,84 @@ struct IMGUI_API ImGuiMenuColumns
void CalcNextTotalWidth(bool update_offsets);
};
+// Internal temporary state for deactivating InputText() instances.
+struct IMGUI_API ImGuiInputTextDeactivatedState
+{
+ ImGuiID ID; // widget id owning the text state (which just got deactivated)
+ ImVector<char> TextA; // text buffer
+
+ ImGuiInputTextDeactivatedState() { memset(this, 0, sizeof(*this)); }
+ void ClearFreeMemory() { ID = 0; TextA.clear(); }
+};
+
+// Forward declare imstb_textedit.h structure + make its main configuration define accessible
+#undef IMSTB_TEXTEDIT_STRING
+#undef IMSTB_TEXTEDIT_CHARTYPE
+#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState
+#define IMSTB_TEXTEDIT_CHARTYPE char
+#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
+#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99
+#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999
+namespace ImStb { struct STB_TexteditState; }
+typedef ImStb::STB_TexteditState ImStbTexteditState;
+
// Internal state of the currently focused/edited text input box
// For a given item ID, access with ImGui::GetInputTextState()
struct IMGUI_API ImGuiInputTextState
{
+ ImGuiContext* Ctx; // parent UI context (needs to be set explicitly by parent).
+ ImStbTexteditState* Stb; // State for stb_textedit.h
+ ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
ImGuiID ID; // widget id owning the text state
- int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
- ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
- ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
- ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
- bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
- int BufCapacityA; // end-user buffer capacity
- float ScrollX; // horizontal scrolling/offset
- ImStb::STB_TexteditState Stb; // state for stb_textedit.h
+ int TextLen; // UTF-8 length of the string in TextA (in bytes)
+ const char* TextSrc; // == TextA.Data unless read-only, in which case == buf passed to InputText(). Field only set and valid _inside_ the call InputText() call.
+ ImVector<char> TextA; // main UTF8 buffer. TextA.Size is a buffer size! Should always be >= buf_size passed by user (and of course >= CurLenA + 1).
+ ImVector<char> TextToRevertTo; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
+ ImVector<char> CallbackTextBackup; // temporary storage for callback to support automatic reconcile of undo-stack
+ int BufCapacity; // end-user buffer capacity (include zero terminator)
+ ImVec2 Scroll; // horizontal offset (managed manually) + vertical scrolling (pulled from child window's own Scroll.y)
float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
bool Edited; // edited this frame
- ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
-
- ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
- void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
- void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); }
- int GetUndoAvailCount() const { return Stb.undostate.undo_point; }
- int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
+ bool WantReloadUserBuf; // force a reload of user buf so it may be modified externally. may be automatic in future version.
+ int ReloadSelectionStart;
+ int ReloadSelectionEnd;
+
+ ImGuiInputTextState();
+ ~ImGuiInputTextState();
+ void ClearText() { TextLen = 0; TextA[0] = 0; CursorClamp(); }
+ void ClearFreeMemory() { TextA.clear(); TextToRevertTo.clear(); }
void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
+ void OnCharPressed(unsigned int c);
// Cursor & Selection
- void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
- void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
- bool HasSelection() const { return Stb.select_start != Stb.select_end; }
- void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; }
- int GetCursorPos() const { return Stb.cursor; }
- int GetSelectionStart() const { return Stb.select_start; }
- int GetSelectionEnd() const { return Stb.select_end; }
- void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
-};
-
-// Storage for current popup stack
-struct ImGuiPopupData
-{
- ImGuiID PopupId; // Set on OpenPopup()
- ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
- ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
- int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
- int OpenFrameCount; // Set on OpenPopup()
- ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
- ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
- ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
-
- ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }
+ void CursorAnimReset();
+ void CursorClamp();
+ bool HasSelection() const;
+ void ClearSelection();
+ int GetCursorPos() const;
+ int GetSelectionStart() const;
+ int GetSelectionEnd() const;
+ void SelectAll();
+
+ // Reload user buf (WIP #2890)
+ // If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this)
+ // strcpy(my_buf, "hello");
+ // if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item
+ // state->ReloadUserBufAndSelectAll();
+ void ReloadUserBufAndSelectAll();
+ void ReloadUserBufAndKeepSelection();
+ void ReloadUserBufAndMoveToEnd();
+};
+
+enum ImGuiWindowRefreshFlags_
+{
+ ImGuiWindowRefreshFlags_None = 0,
+ ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.
+ ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover
+ ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus
+ // Refresh policy/frequency, Load Balancing etc.
};
enum ImGuiNextWindowDataFlags_
@@ -1105,12 +1203,17 @@ enum ImGuiNextWindowDataFlags_
ImGuiNextWindowDataFlags_HasFocus = 1 << 5,
ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,
ImGuiNextWindowDataFlags_HasScroll = 1 << 7,
+ ImGuiNextWindowDataFlags_HasWindowFlags = 1 << 8,
+ ImGuiNextWindowDataFlags_HasChildFlags = 1 << 9,
+ ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 10,
};
// Storage for SetNexWindow** functions
struct ImGuiNextWindowData
{
- ImGuiNextWindowDataFlags Flags;
+ ImGuiNextWindowDataFlags HasFlags;
+
+ // Members below are NOT cleared. Always rely on HasFlags.
ImGuiCond PosCond;
ImGuiCond SizeCond;
ImGuiCond CollapsedCond;
@@ -1119,52 +1222,84 @@ struct ImGuiNextWindowData
ImVec2 SizeVal;
ImVec2 ContentSizeVal;
ImVec2 ScrollVal;
+ ImGuiWindowFlags WindowFlags; // Only honored by BeginTable()
+ ImGuiChildFlags ChildFlags;
bool CollapsedVal;
ImRect SizeConstraintRect;
ImGuiSizeCallback SizeCallback;
void* SizeCallbackUserData;
float BgAlphaVal; // Override background alpha
ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)
+ ImGuiWindowRefreshFlags RefreshFlagsVal;
ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }
- inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; }
+ inline void ClearFlags() { HasFlags = ImGuiNextWindowDataFlags_None; }
};
enum ImGuiNextItemDataFlags_
{
- ImGuiNextItemDataFlags_None = 0,
- ImGuiNextItemDataFlags_HasWidth = 1 << 0,
- ImGuiNextItemDataFlags_HasOpen = 1 << 1,
+ ImGuiNextItemDataFlags_None = 0,
+ ImGuiNextItemDataFlags_HasWidth = 1 << 0,
+ ImGuiNextItemDataFlags_HasOpen = 1 << 1,
+ ImGuiNextItemDataFlags_HasShortcut = 1 << 2,
+ ImGuiNextItemDataFlags_HasRefVal = 1 << 3,
+ ImGuiNextItemDataFlags_HasStorageID = 1 << 4,
};
struct ImGuiNextItemData
{
- ImGuiNextItemDataFlags Flags;
- float Width; // Set by SetNextItemWidth()
- ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging)
- ImGuiCond OpenCond;
- bool OpenVal; // Set by SetNextItemOpen()
+ ImGuiNextItemDataFlags HasFlags; // Called HasFlags instead of Flags to avoid mistaking this
+ ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap and ImGuiItemFlags_HasSelectionUserData.
+
+ // Members below are NOT cleared by ItemAdd() meaning they are still valid during e.g. NavProcessItem(). Always rely on HasFlags.
+ ImGuiID FocusScopeId; // Set by SetNextItemSelectionUserData()
+ ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
+ float Width; // Set by SetNextItemWidth()
+ ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut()
+ ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut()
+ bool OpenVal; // Set by SetNextItemOpen()
+ ImU8 OpenCond; // Set by SetNextItemOpen()
+ ImGuiDataTypeStorage RefVal; // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal
+ ImGuiID StorageId; // Set by SetNextItemStorageID()
- ImGuiNextItemData() { memset(this, 0, sizeof(*this)); }
- inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()!
+ ImGuiNextItemData() { memset(this, 0, sizeof(*this)); SelectionUserData = -1; }
+ inline void ClearFlags() { HasFlags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!
};
// Status storage for the last submitted item
struct ImGuiLastItemData
{
ImGuiID ID;
- ImGuiItemFlags InFlags; // See ImGuiItemFlags_
+ ImGuiItemFlags ItemFlags; // See ImGuiItemFlags_ (called 'InFlags' before v1.91.4).
ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_
ImRect Rect; // Full rectangle
ImRect NavRect; // Navigation scoring rectangle (not displayed)
- ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set)
+ // Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags are set.
+ ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set.
+ ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set..
+ ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set..
ImGuiLastItemData() { memset(this, 0, sizeof(*this)); }
};
-struct IMGUI_API ImGuiStackSizes
+// Store data emitted by TreeNode() for usage by TreePop()
+// - To implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere: store the minimum amount of data
+// which we can't infer in TreePop(), to perform the equivalent of NavApplyItemToResult().
+// Only stored when the node is a potential candidate for landing on a Left arrow jump.
+struct ImGuiTreeNodeStackData
{
+ ImGuiID ID;
+ ImGuiTreeNodeFlags TreeFlags;
+ ImGuiItemFlags ItemFlags; // Used for nav landing
+ ImRect NavRect; // Used for nav landing
+};
+
+// sizeof() = 20
+struct IMGUI_API ImGuiErrorRecoveryState
+{
+ short SizeOfWindowStack;
short SizeOfIDStack;
+ short SizeOfTreeStack;
short SizeOfColorStack;
short SizeOfStyleVarStack;
short SizeOfFontStack;
@@ -1174,9 +1309,7 @@ struct IMGUI_API ImGuiStackSizes
short SizeOfBeginPopupStack;
short SizeOfDisabledStack;
- ImGuiStackSizes() { memset(this, 0, sizeof(*this)); }
- void SetToCurrentState();
- void CompareWithCurrentState();
+ ImGuiErrorRecoveryState() { memset(this, 0, sizeof(*this)); }
};
// Data saved for each window pushed into the stack
@@ -1184,7 +1317,9 @@ struct ImGuiWindowStackData
{
ImGuiWindow* Window;
ImGuiLastItemData ParentLastItemDataBackup;
- ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting
+ ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting
+ bool DisabledOverrideReenable; // Non-child window override disabled flag
+ float DisabledOverrideReenableAlphaBackup;
};
struct ImGuiShrinkWidthItem
@@ -1203,10 +1338,46 @@ struct ImGuiPtrOrIndex
ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
};
+// Data used by IsItemDeactivated()/IsItemDeactivatedAfterEdit() functions
+struct ImGuiDeactivatedItemData
+{
+ ImGuiID ID;
+ int ElapseFrame;
+ bool HasBeenEditedBefore;
+ bool IsAlive;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Popup support
+//-----------------------------------------------------------------------------
+
+enum ImGuiPopupPositionPolicy
+{
+ ImGuiPopupPositionPolicy_Default,
+ ImGuiPopupPositionPolicy_ComboBox,
+ ImGuiPopupPositionPolicy_Tooltip,
+};
+
+// Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack)
+struct ImGuiPopupData
+{
+ ImGuiID PopupId; // Set on OpenPopup()
+ ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
+ ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
+ int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
+ int OpenFrameCount; // Set on OpenPopup()
+ ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
+ ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
+ ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
+
+ ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }
+};
+
//-----------------------------------------------------------------------------
// [SECTION] Inputs support
//-----------------------------------------------------------------------------
+// Bit array for named keys
typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN> ImBitArrayForNamedKeys;
// [Internal] Key ranges
@@ -1226,8 +1397,8 @@ typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN> ImBitAr
#define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift
#define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL1
#define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR1
-#define ImGuiKey_NavGamepadActivate ImGuiKey_GamepadFaceDown
-#define ImGuiKey_NavGamepadCancel ImGuiKey_GamepadFaceRight
+#define ImGuiKey_NavGamepadActivate (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceRight : ImGuiKey_GamepadFaceDown)
+#define ImGuiKey_NavGamepadCancel (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceDown : ImGuiKey_GamepadFaceRight)
#define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft
#define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp
@@ -1246,19 +1417,17 @@ enum ImGuiInputEventType
enum ImGuiInputSource
{
ImGuiInputSource_None = 0,
- ImGuiInputSource_Mouse,
+ ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
ImGuiInputSource_Keyboard,
ImGuiInputSource_Gamepad,
- ImGuiInputSource_Clipboard, // Currently only used by InputText()
- ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only
ImGuiInputSource_COUNT
};
// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension?
// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor'
-struct ImGuiInputEventMousePos { float PosX, PosY; };
-struct ImGuiInputEventMouseWheel { float WheelX, WheelY; };
-struct ImGuiInputEventMouseButton { int Button; bool Down; };
+struct ImGuiInputEventMousePos { float PosX, PosY; ImGuiMouseSource MouseSource; };
+struct ImGuiInputEventMouseWheel { float WheelX, WheelY; ImGuiMouseSource MouseSource; };
+struct ImGuiInputEventMouseButton { int Button; bool Down; ImGuiMouseSource MouseSource; };
struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; };
struct ImGuiInputEventText { unsigned int Char; };
struct ImGuiInputEventAppFocused { bool Focused; };
@@ -1267,6 +1436,7 @@ struct ImGuiInputEvent
{
ImGuiInputEventType Type;
ImGuiInputSource Source;
+ ImU32 EventId; // Unique, sequential increasing integer to identify an event (if you need to correlate them to other data).
union
{
ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos
@@ -1283,7 +1453,8 @@ struct ImGuiInputEvent
// Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.
#define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
-#define ImGuiKeyOwner_None ((ImGuiID)-1) // Require key to have no owner.
+#define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner.
+//#define ImGuiKeyOwner_None ImGuiKeyOwner_NoOwner // We previously called this 'ImGuiKeyOwner_None' but it was inconsistent with our pattern that _None values == 0 and quite dangerous. Also using _NoOwner makes the IsKeyPressed() calls more explicit.
typedef ImS16 ImGuiKeyRoutingIndex;
@@ -1291,12 +1462,13 @@ typedef ImS16 ImGuiKeyRoutingIndex;
struct ImGuiKeyRoutingData
{
ImGuiKeyRoutingIndex NextEntryIndex;
- ImU16 Mods; // Technically we'd only need 4 bits but for simplify we store ImGuiMod_ values which need 16 bits.
+ ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits.
+ ImU8 RoutingCurrScore; // [DEBUG] For debug display
ImU8 RoutingNextScore; // Lower is better (0: perfect score)
ImGuiID RoutingCurr;
ImGuiID RoutingNext;
- ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; }
+ ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; }
};
// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
@@ -1320,53 +1492,47 @@ struct ImGuiKeyOwnerData
bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.
bool LockUntilRelease; // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well.
- ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_None; LockThisFrame = LockUntilRelease = false; }
+ ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; }
};
+// Extend ImGuiInputFlags_
// Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()
-// Don't mistake with ImGuiInputTextFlags! (for ImGui::InputText() function)
-enum ImGuiInputFlags_
-{
- // Flags for IsKeyPressed(), IsMouseClicked(), Shortcut()
- ImGuiInputFlags_None = 0,
- ImGuiInputFlags_Repeat = 1 << 0, // Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1.
- ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
- ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
- ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
- ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
-
- // Flags for SetItemKeyOwner()
- ImGuiInputFlags_CondHovered = 1 << 4, // Only set if item is hovered (default to both)
- ImGuiInputFlags_CondActive = 1 << 5, // Only set if item is active (default to both)
- ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
- ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
+// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)
+enum ImGuiInputFlagsPrivate_
+{
+ // Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut()
+ // - Repeat mode: Repeat rate selection
+ ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
+ ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
+ ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
+ // - Repeat mode: Specify when repeating key pressed can be interrupted.
+ // - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.
+ ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.
+ ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)
+ ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone = 1 << 6, // Stop repeating when released OR if keyboard mods are leaving the None state. Allows going from Mod+Key to Key by releasing Mod.
+ ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat
// Flags for SetKeyOwner(), SetItemKeyOwner()
- ImGuiInputFlags_LockThisFrame = 1 << 6, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code.
- ImGuiInputFlags_LockUntilRelease = 1 << 7, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code.
+ // - Locking key away from non-input aware code. Locking is useful to make input-owner-aware code steal keys from non-input-owner-aware code. If all code is input-owner-aware locking would never be necessary.
+ ImGuiInputFlags_LockThisFrame = 1 << 20, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame.
+ ImGuiInputFlags_LockUntilRelease = 1 << 21, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released.
- // Routing policies for Shortcut() + low-level SetShortcutRouting()
- // - The general idea is that several callers register interest in a shortcut, and only one owner gets it.
- // - When a policy (other than _RouteAlways) is set, Shortcut() will register itself with SetShortcutRouting(),
- // allowing the system to decide where to route the input among other route-aware calls.
- // - Shortcut() uses ImGuiInputFlags_RouteFocused by default: meaning that a simple Shortcut() poll
- // will register a route and only succeed when parent window is in the focus stack and if no-one
- // with a higher priority is claiming the shortcut.
- // - Using ImGuiInputFlags_RouteAlways is roughly equivalent to doing e.g. IsKeyPressed(key) + testing mods.
- // - Priorities: GlobalHigh > Focused (when owner is active item) > Global > Focused (when focused window) > GlobalLow.
- // - Can select only 1 policy among all available.
- ImGuiInputFlags_RouteFocused = 1 << 8, // (Default) Register focused route: Accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.
- ImGuiInputFlags_RouteGlobalLow = 1 << 9, // Register route globally (lowest priority: unless a focused window or active item registered the route) -> recommended Global priority.
- ImGuiInputFlags_RouteGlobal = 1 << 10, // Register route globally (medium priority: unless an active item registered the route, e.g. CTRL+A registered by InputText).
- ImGuiInputFlags_RouteGlobalHigh = 1 << 11, // Register route globally (highest priority: unlikely you need to use that: will interfere with every active items)
- ImGuiInputFlags_RouteMask_ = ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteGlobalLow | ImGuiInputFlags_RouteGlobalHigh, // _Always not part of this!
- ImGuiInputFlags_RouteAlways = 1 << 12, // Do not register route, poll keys directly.
- ImGuiInputFlags_RouteUnlessBgFocused= 1 << 13, // Global routes will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications.
- ImGuiInputFlags_RouteExtraMask_ = ImGuiInputFlags_RouteAlways | ImGuiInputFlags_RouteUnlessBgFocused,
+ // - Condition for SetItemKeyOwner()
+ ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both)
+ ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both)
+ ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
// [Internal] Mask of which function support which flags
- ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_,
- ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RouteMask_ | ImGuiInputFlags_RouteExtraMask_,
+ ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
+ ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress,
+ ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_,
+ ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
+ ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways,
+ ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow,
+ ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_,
+ ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat,
+ ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_,
+ ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip,
ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,
ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,
};
@@ -1375,6 +1541,7 @@ enum ImGuiInputFlags_
// [SECTION] Clipper support
//-----------------------------------------------------------------------------
+// Note that Max is exclusive, so perhaps should be using a Begin/End convention.
struct ImGuiListClipperRange
{
int Min;
@@ -1407,9 +1574,11 @@ struct ImGuiListClipperData
enum ImGuiActivateFlags_
{
ImGuiActivateFlags_None = 0,
- ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default if keyboard is available.
- ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default if keyboard is not available.
+ ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key.
+ ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used.
ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
+ ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request
+ ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function.
};
// Early work-in-progress API for ScrollToItem()
@@ -1427,13 +1596,18 @@ enum ImGuiScrollFlags_
ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,
};
-enum ImGuiNavHighlightFlags_
+enum ImGuiNavRenderCursorFlags_
{
- ImGuiNavHighlightFlags_None = 0,
- ImGuiNavHighlightFlags_TypeDefault = 1 << 0,
- ImGuiNavHighlightFlags_TypeThin = 1 << 1,
- ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
- ImGuiNavHighlightFlags_NoRounding = 1 << 3,
+ ImGuiNavRenderCursorFlags_None = 0,
+ ImGuiNavRenderCursorFlags_Compact = 1 << 1, // Compact highlight, no padding/distance from focused item
+ ImGuiNavRenderCursorFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) even when g.NavCursorVisible == false, aka even when using the mouse.
+ ImGuiNavRenderCursorFlags_NoRounding = 1 << 3,
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGuiNavHighlightFlags_None = ImGuiNavRenderCursorFlags_None, // Renamed in 1.91.4
+ ImGuiNavHighlightFlags_Compact = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.91.4
+ ImGuiNavHighlightFlags_AlwaysDraw = ImGuiNavRenderCursorFlags_AlwaysDraw, // Renamed in 1.91.4
+ ImGuiNavHighlightFlags_NoRounding = ImGuiNavRenderCursorFlags_NoRounding, // Renamed in 1.91.4
+#endif
};
enum ImGuiNavMoveFlags_
@@ -1443,15 +1617,19 @@ enum ImGuiNavMoveFlags_
ImGuiNavMoveFlags_LoopY = 1 << 1,
ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness
+ ImGuiNavMoveFlags_WrapMask_ = ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_WrapY,
ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place)
ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)
ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary
ImGuiNavMoveFlags_Forwarded = 1 << 7,
ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result
- ImGuiNavMoveFlags_FocusApi = 1 << 9,
- ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight
- ImGuiNavMoveFlags_Activate = 1 << 11,
- ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12, // Do not alter the visible state of keyboard vs mouse nav highlight
+ ImGuiNavMoveFlags_FocusApi = 1 << 9, // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details)
+ ImGuiNavMoveFlags_IsTabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight
+ ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request.
+ ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.
+ ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo
+ ImGuiNavMoveFlags_NoSetNavCursorVisible = 1 << 14, // Do not alter the nav cursor visible state
+ ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result
};
enum ImGuiNavLayer
@@ -1461,26 +1639,72 @@ enum ImGuiNavLayer
ImGuiNavLayer_COUNT
};
+// Storage for navigation query/results
struct ImGuiNavItemData
{
ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
ImGuiID ID; // Init,Move // Best candidate item ID
ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID
ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space
- ImGuiItemFlags InFlags; // ????,Move // Best candidate item flags
+ ImGuiItemFlags ItemFlags; // ????,Move // Best candidate item flags
float DistBox; // Move // Best candidate box distance to current NavId
float DistCenter; // Move // Best candidate center distance to current NavId
float DistAxial; // Move // Best candidate axial distance to current NavId
+ ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionUserData() value. Valid if (ItemFlags & ImGuiItemFlags_HasSelectionUserData)
ImGuiNavItemData() { Clear(); }
- void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; }
+ void Clear() { Window = NULL; ID = FocusScopeId = 0; ItemFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }
+};
+
+// Storage for PushFocusScope(), g.FocusScopeStack[], g.NavFocusRoute[]
+struct ImGuiFocusScopeData
+{
+ ImGuiID ID;
+ ImGuiID WindowID;
+};
+
+//-----------------------------------------------------------------------------
+// [SECTION] Typing-select support
+//-----------------------------------------------------------------------------
+
+// Flags for GetTypingSelectRequest()
+enum ImGuiTypingSelectFlags_
+{
+ ImGuiTypingSelectFlags_None = 0,
+ ImGuiTypingSelectFlags_AllowBackspace = 1 << 0, // Backspace to delete character inputs. If using: ensure GetTypingSelectRequest() is not called more than once per frame (filter by e.g. focus state)
+ ImGuiTypingSelectFlags_AllowSingleCharMode = 1 << 1, // Allow "single char" search mode which is activated when pressing the same character multiple times.
+};
+
+// Returned by GetTypingSelectRequest(), designed to eventually be public.
+struct IMGUI_API ImGuiTypingSelectRequest
+{
+ ImGuiTypingSelectFlags Flags; // Flags passed to GetTypingSelectRequest()
+ int SearchBufferLen;
+ const char* SearchBuffer; // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize).
+ bool SelectRequest; // Set when buffer was modified this frame, requesting a selection.
+ bool SingleCharMode; // Notify when buffer contains same character repeated, to implement special mode. In this situation it preferred to not display any on-screen search indication.
+ ImS8 SingleCharSize; // Length in bytes of first letter codepoint (1 for ascii, 2-4 for UTF-8). If (SearchBufferLen==RepeatCharSize) only 1 letter has been input.
+};
+
+// Storage for GetTypingSelectRequest()
+struct IMGUI_API ImGuiTypingSelectState
+{
+ ImGuiTypingSelectRequest Request; // User-facing data
+ char SearchBuffer[64]; // Search buffer: no need to make dynamic as this search is very transient.
+ ImGuiID FocusScope;
+ int LastRequestFrame = 0;
+ float LastRequestTime = 0.0f;
+ bool SingleCharModeLock = false; // After a certain single char repeat count we lock into SingleCharMode. Two benefits: 1) buffer never fill, 2) we can provide an immediate SingleChar mode without timer elapsing.
+
+ ImGuiTypingSelectState() { memset(this, 0, sizeof(*this)); }
+ void Clear() { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging
};
//-----------------------------------------------------------------------------
// [SECTION] Columns support
//-----------------------------------------------------------------------------
-// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays!
+// Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays!
enum ImGuiOldColumnFlags_
{
ImGuiOldColumnFlags_None = 0,
@@ -1488,16 +1712,16 @@ enum ImGuiOldColumnFlags_
ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
- ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
+ ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
// Obsolete names (will be removed)
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,
- ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,
- ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,
- ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,
- ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,
- ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize,
+ //ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,
+ //ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,
+ //ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,
+ //ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,
+ //ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,
+ //ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize,
#endif
};
@@ -1533,12 +1757,79 @@ struct ImGuiOldColumns
};
//-----------------------------------------------------------------------------
+// [SECTION] Box-select support
+//-----------------------------------------------------------------------------
+
+struct ImGuiBoxSelectState
+{
+ // Active box-selection data (persistent, 1 active at a time)
+ ImGuiID ID;
+ bool IsActive;
+ bool IsStarting;
+ bool IsStartedFromVoid; // Starting click was not from an item.
+ bool IsStartedSetNavIdOnce;
+ bool RequestClear;
+ ImGuiKeyChord KeyMods : 16; // Latched key-mods for box-select logic.
+ ImVec2 StartPosRel; // Start position in window-contents relative space (to support scrolling)
+ ImVec2 EndPosRel; // End position in window-contents relative space
+ ImVec2 ScrollAccum; // Scrolling accumulator (to behave at high-frame spaces)
+ ImGuiWindow* Window;
+
+ // Temporary/Transient data
+ bool UnclipMode; // (Temp/Transient, here in hot area). Set/cleared by the BeginMultiSelect()/EndMultiSelect() owning active box-select.
+ ImRect UnclipRect; // Rectangle where ItemAdd() clipping may be temporarily disabled. Need support by multi-select supporting widgets.
+ ImRect BoxSelectRectPrev; // Selection rectangle in absolute coordinates (derived every frame from BoxSelectStartPosRel and MousePos)
+ ImRect BoxSelectRectCurr;
+
+ ImGuiBoxSelectState() { memset(this, 0, sizeof(*this)); }
+};
+
+//-----------------------------------------------------------------------------
// [SECTION] Multi-select support
//-----------------------------------------------------------------------------
-#ifdef IMGUI_HAS_MULTI_SELECT
-// <this is filled in 'range_select' branch>
-#endif // #ifdef IMGUI_HAS_MULTI_SELECT
+// We always assume that -1 is an invalid value (which works for indices and pointers)
+#define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1)
+
+// Temporary storage for multi-select
+struct IMGUI_API ImGuiMultiSelectTempData
+{
+ ImGuiMultiSelectIO IO; // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop.
+ ImGuiMultiSelectState* Storage;
+ ImGuiID FocusScopeId; // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually)
+ ImGuiMultiSelectFlags Flags;
+ ImVec2 ScopeRectMin;
+ ImVec2 BackupCursorMaxPos;
+ ImGuiSelectionUserData LastSubmittedItem; // Copy of last submitted item data, used to merge output ranges.
+ ImGuiID BoxSelectId;
+ ImGuiKeyChord KeyMods;
+ ImS8 LoopRequestSetAll; // -1: no operation, 0: clear all, 1: select all.
+ bool IsEndIO; // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state.
+ bool IsFocused; // Set if currently focusing the selection scope (any item of the selection). May be used if you have custom shortcut associated to selection.
+ bool IsKeyboardSetRange; // Set by BeginMultiSelect() when using Shift+Navigation. Because scrolling may be affected we can't afford a frame of lag with Shift+Navigation.
+ bool NavIdPassedBy;
+ bool RangeSrcPassedBy; // Set by the item that matches RangeSrcItem.
+ bool RangeDstPassedBy; // Set by the item that matches NavJustMovedToId when IsSetRange is set.
+
+ ImGuiMultiSelectTempData() { Clear(); }
+ void Clear() { size_t io_sz = sizeof(IO); ClearIO(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); } // Zero-clear except IO as we preserve IO.Requests[] buffer allocation.
+ void ClearIO() { IO.Requests.resize(0); IO.RangeSrcItem = IO.NavIdItem = ImGuiSelectionUserData_Invalid; IO.NavIdSelected = IO.RangeSrcReset = false; }
+};
+
+// Persistent storage for multi-select (as long as selection is alive)
+struct IMGUI_API ImGuiMultiSelectState
+{
+ ImGuiWindow* Window;
+ ImGuiID ID;
+ int LastFrameActive; // Last used frame-count, for GC.
+ int LastSelectionSize; // Set by BeginMultiSelect() based on optional info provided by user. May be -1 if unknown.
+ ImS8 RangeSelected; // -1 (don't have) or true/false
+ ImS8 NavIdSelected; // -1 (don't have) or true/false
+ ImGuiSelectionUserData RangeSrcItem; //
+ ImGuiSelectionUserData NavIdItem; // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
+
+ ImGuiMultiSelectState() { Window = NULL; ID = 0; LastFrameActive = LastSelectionSize = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }
+};
//-----------------------------------------------------------------------------
// [SECTION] Docking support
@@ -1556,28 +1847,32 @@ struct ImGuiOldColumns
// Every instance of ImGuiViewport is in fact a ImGuiViewportP.
struct ImGuiViewportP : public ImGuiViewport
{
- int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
- ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays.
+ int BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
+ ImDrawList* BgFgDrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays.
ImDrawData DrawDataP;
- ImDrawDataBuilder DrawDataBuilder;
+ ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData
- ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!)
- ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height).
- ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f.
- ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f.
+ // Per-viewport work area
+ // - Insets are >= 0.0f values, distance from viewport corners to work area.
+ // - BeginMainMenuBar() and DockspaceOverViewport() tend to use work area to avoid stepping over existing contents.
+ // - Generally 'safeAreaInsets' in iOS land, 'DisplayCutout' in Android land.
+ ImVec2 WorkInsetMin; // Work Area inset locked for the frame. GetWorkRect() always fits within GetMainRect().
+ ImVec2 WorkInsetMax; // "
+ ImVec2 BuildWorkInsetMin; // Work Area inset accumulator for current frame, to become next frame's WorkInset
+ ImVec2 BuildWorkInsetMax; // "
- ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; }
- ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); }
+ ImGuiViewportP() { BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; }
+ ~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); }
// Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect)
- ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); }
- ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); }
- void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields
+ ImVec2 CalcWorkRectPos(const ImVec2& inset_min) const { return ImVec2(Pos.x + inset_min.x, Pos.y + inset_min.y); }
+ ImVec2 CalcWorkRectSize(const ImVec2& inset_min, const ImVec2& inset_max) const { return ImVec2(ImMax(0.0f, Size.x - inset_min.x - inset_max.x), ImMax(0.0f, Size.y - inset_min.y - inset_max.y)); }
+ void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkInsetMin); WorkSize = CalcWorkRectSize(WorkInsetMin, WorkInsetMax); } // Update public fields
// Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
- ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
+ ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkInsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkInsetMin, BuildWorkInsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
};
//-----------------------------------------------------------------------------
@@ -1593,7 +1888,9 @@ struct ImGuiWindowSettings
ImVec2ih Pos;
ImVec2ih Size;
bool Collapsed;
+ bool IsChild;
bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
+ bool WantDelete; // Set to invalidate/delete the settings entry
ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
char* GetName() { return (char*)(this + 1); }
@@ -1621,6 +1918,7 @@ struct ImGuiSettingsHandler
// This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.
enum ImGuiLocKey : int
{
+ ImGuiLocKey_VersionStr,
ImGuiLocKey_TableSizeOne,
ImGuiLocKey_TableSizeAllFit,
ImGuiLocKey_TableSizeAllDefault,
@@ -1628,6 +1926,8 @@ enum ImGuiLocKey : int
ImGuiLocKey_WindowingMainMenuBar,
ImGuiLocKey_WindowingPopup,
ImGuiLocKey_WindowingUntitled,
+ ImGuiLocKey_OpenLink_s,
+ ImGuiLocKey_CopyLink,
ImGuiLocKey_COUNT
};
@@ -1637,44 +1937,80 @@ struct ImGuiLocEntry
const char* Text;
};
+//-----------------------------------------------------------------------------
+// [SECTION] Error handling, State recovery support
+//-----------------------------------------------------------------------------
+
+// Macros used by Recoverable Error handling
+// - Only dispatch error if _EXPR: evaluate as assert (similar to an assert macro).
+// - The message will always be a string literal, in order to increase likelihood of being display by an assert handler.
+// - See 'Demo->Configuration->Error Handling' and ImGuiIO definitions for details on error handling.
+// - Read https://github.com/ocornut/imgui/wiki/Error-Handling for details on error handling.
+#ifndef IM_ASSERT_USER_ERROR
+#define IM_ASSERT_USER_ERROR(_EXPR,_MSG) do { if (!(_EXPR) && ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } } while (0) // Recoverable User Error
+#endif
+
+// The error callback is currently not public, as it is expected that only advanced users will rely on it.
+typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const char* msg); // Function signature for g.ErrorCallback
//-----------------------------------------------------------------------------
// [SECTION] Metrics, Debug Tools
//-----------------------------------------------------------------------------
+// See IMGUI_DEBUG_LOG() and IMGUI_DEBUG_LOG_XXX() macros.
enum ImGuiDebugLogFlags_
{
// Event types
- ImGuiDebugLogFlags_None = 0,
- ImGuiDebugLogFlags_EventActiveId = 1 << 0,
- ImGuiDebugLogFlags_EventFocus = 1 << 1,
- ImGuiDebugLogFlags_EventPopup = 1 << 2,
- ImGuiDebugLogFlags_EventNav = 1 << 3,
- ImGuiDebugLogFlags_EventClipper = 1 << 4,
- ImGuiDebugLogFlags_EventIO = 1 << 5,
- ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventIO,
- ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY
+ ImGuiDebugLogFlags_None = 0,
+ ImGuiDebugLogFlags_EventError = 1 << 0, // Error submitted by IM_ASSERT_USER_ERROR()
+ ImGuiDebugLogFlags_EventActiveId = 1 << 1,
+ ImGuiDebugLogFlags_EventFocus = 1 << 2,
+ ImGuiDebugLogFlags_EventPopup = 1 << 3,
+ ImGuiDebugLogFlags_EventNav = 1 << 4,
+ ImGuiDebugLogFlags_EventClipper = 1 << 5,
+ ImGuiDebugLogFlags_EventSelection = 1 << 6,
+ ImGuiDebugLogFlags_EventIO = 1 << 7,
+ ImGuiDebugLogFlags_EventFont = 1 << 8,
+ ImGuiDebugLogFlags_EventInputRouting = 1 << 9,
+ ImGuiDebugLogFlags_EventDocking = 1 << 10, // Unused in this branch
+ ImGuiDebugLogFlags_EventViewport = 1 << 11, // Unused in this branch
+
+ ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventFont | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
+ ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
+ ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
+};
+
+struct ImGuiDebugAllocEntry
+{
+ int FrameCount;
+ ImS16 AllocCount;
+ ImS16 FreeCount;
+};
+
+struct ImGuiDebugAllocInfo
+{
+ int TotalAllocCount; // Number of call to MemAlloc().
+ int TotalFreeCount;
+ ImS16 LastEntriesIdx; // Current index in buffer
+ ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations
+
+ ImGuiDebugAllocInfo() { memset(this, 0, sizeof(*this)); }
};
struct ImGuiMetricsConfig
{
- bool ShowDebugLog;
- bool ShowStackTool;
- bool ShowWindowsRects;
- bool ShowWindowsBeginOrder;
- bool ShowTablesRects;
- bool ShowDrawCmdMesh;
- bool ShowDrawCmdBoundingBoxes;
- int ShowWindowsRectsType;
- int ShowTablesRectsType;
-
- ImGuiMetricsConfig()
- {
- ShowDebugLog = ShowStackTool = ShowWindowsRects = ShowWindowsBeginOrder = ShowTablesRects = false;
- ShowDrawCmdMesh = true;
- ShowDrawCmdBoundingBoxes = true;
- ShowWindowsRectsType = ShowTablesRectsType = -1;
- }
+ bool ShowDebugLog = false;
+ bool ShowIDStackTool = false;
+ bool ShowWindowsRects = false;
+ bool ShowWindowsBeginOrder = false;
+ bool ShowTablesRects = false;
+ bool ShowDrawCmdMesh = true;
+ bool ShowDrawCmdBoundingBoxes = true;
+ bool ShowTextEncodingViewer = false;
+ int ShowWindowsRectsType = -1;
+ int ShowTablesRectsType = -1;
+ int HighlightMonitorIdx = -1;
+ ImGuiID HighlightViewportID = 0;
};
struct ImGuiStackLevelInfo
@@ -1688,8 +2024,8 @@ struct ImGuiStackLevelInfo
ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); }
};
-// State for Stack tool queries
-struct ImGuiStackTool
+// State for ID Stack tool queries
+struct ImGuiIDStackTool
{
int LastActiveFrame;
int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level
@@ -1697,8 +2033,9 @@ struct ImGuiStackTool
ImVector<ImGuiStackLevelInfo> Results;
bool CopyToClipboardOnCtrlC;
float CopyToClipboardLastTime;
+ ImGuiTextBuffer ResultPathBuf;
- ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
+ ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
};
//-----------------------------------------------------------------------------
@@ -1728,23 +2065,31 @@ struct ImGuiContext
bool Initialized;
bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
ImGuiIO IO;
- ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be tricked/written into IO structure.
- ImVector<ImGuiInputEvent> InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.
+ ImGuiPlatformIO PlatformIO;
ImGuiStyle Style;
ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
+ float FontScale; // == FontSize / Font->FontSize
+ float CurrentDpiScale; // Current window/viewport DpiScale
ImDrawListSharedData DrawListSharedData;
double Time;
int FrameCount;
int FrameCountEnded;
int FrameCountRendered;
+ ImGuiID WithinEndChildID; // Set within EndChild()
bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
- bool WithinEndChild; // Set within EndChild()
bool GcCompactAll; // Request full GC
bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
void* TestEngine; // Test engine user data
+ char ContextName[16]; // Storage for a context name (to facilitate debugging multi-context setups)
+
+ // Inputs
+ ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.
+ ImVector<ImGuiInputEvent> InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.
+ ImGuiMouseSource InputEventsNextMouseSource;
+ ImU32 InputEventsNextEventId;
// Windows state
ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
@@ -1753,23 +2098,32 @@ struct ImGuiContext
ImVector<ImGuiWindowStackData> CurrentWindowStack;
ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
int WindowsActiveCount; // Number of unique windows submitted by frame
- ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING)
+ float WindowsBorderHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, style.WindowBorderHoverPadding). This isn't so multi-dpi friendly.
+ ImGuiID DebugBreakInWindow; // Set to break in Begin() call.
ImGuiWindow* CurrentWindow; // Window being drawn into
ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
+ ImGuiWindow* HoveredWindowBeforeClear; // Window the mouse is hovering. Filled even with _NoMouse. This is currently useful for multi-context compositors.
ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.
ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.
ImVec2 WheelingWindowRefMousePos;
+ int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL
+ int WheelingWindowScrolledFrame;
float WheelingWindowReleaseTimer;
+ ImVec2 WheelingWindowWheelRemainder;
+ ImVec2 WheelingAxisAvg;
// Item/widgets state and tracking information
- ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
+ ImGuiID DebugDrawIdConflicts; // Set when we detect multiple items with the same identifier
+ ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
ImGuiID HoveredId; // Hovered widget, filled during the frame
ImGuiID HoveredIdPreviousFrame;
- bool HoveredIdAllowOverlap;
- bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.
+ int HoveredIdPreviousFrameItemCount; // Count numbers of items using the same ID as last frame's hovered id
float HoveredIdTimer; // Measure contiguous hovering time
float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
+ bool HoveredIdAllowOverlap;
+ bool HoveredIdIsDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.
+ bool ItemUnclipByLog; // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled
ImGuiID ActiveId; // Active widget
ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
float ActiveIdTimer;
@@ -1779,78 +2133,85 @@ struct ImGuiContext
bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.
bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
bool ActiveIdHasBeenEditedThisFrame;
+ bool ActiveIdFromShortcut;
+ int ActiveIdMouseButton : 8;
ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
ImGuiWindow* ActiveIdWindow;
- ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard)
- int ActiveIdMouseButton;
+ ImGuiInputSource ActiveIdSource; // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad
ImGuiID ActiveIdPreviousFrame;
- bool ActiveIdPreviousFrameIsAlive;
- bool ActiveIdPreviousFrameHasBeenEditedBefore;
- ImGuiWindow* ActiveIdPreviousFrameWindow;
+ ImGuiDeactivatedItemData DeactivatedItemData;
+ ImGuiDataTypeStorage ActiveIdValueOnActivation; // Backup of initial value at the time of activation. ONLY SET BY SPECIFIC WIDGETS: DragXXX and SliderXXX.
ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
- // [EXPERIMENTAL] Key/Input Ownership + Shortcut Routing system
+ // Key/Input Ownership + Shortcut Routing system
// - The idea is that instead of "eating" a given key, we can link to an owner.
- // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID.
+ // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
// - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().
+ double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic)
+ double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic)
+ double LastKeyboardKeyPressTime; // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed.
+ ImBitArrayForNamedKeys KeysMayBeCharInput; // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes
ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT];
ImGuiKeyRoutingTable KeysRoutingTable;
ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
- bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency)
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
-#endif
+ bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (this is a shortcut for not taking ownership of 100+ keys, frequently used by drag operations)
+ ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls.
+ //ImU32 ActiveIdUsingNavInputMask; // [OBSOLETE] Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes --> 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
// Next window/item data
- ImGuiID CurrentFocusScopeId; // == g.FocusScopeStack.back()
- ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back()
+ ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId.
+ ImGuiItemFlags CurrentItemFlags; // Value for currently appending items == g.ItemFlagsStack.back()
ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location
ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions
ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd)
ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
+ bool DebugShowGroupRects;
// Shared stacks
- ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
- ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
- ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()
- ImVector<ImGuiID> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
- ImVector<ImGuiItemFlags>ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
- ImVector<ImGuiGroupData>GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
- ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent)
- ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
- int BeginMenuCount;
+ ImGuiCol DebugFlashStyleColorIdx; // (Keep close to ColorStack to share cache line)
+ ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
+ ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
+ ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()
+ ImVector<ImGuiFocusScopeData> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
+ ImVector<ImGuiItemFlags> ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
+ ImVector<ImGuiGroupData> GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
+ ImVector<ImGuiPopupData> OpenPopupStack; // Which popups are open (persistent)
+ ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
+ ImVector<ImGuiTreeNodeStackData>TreeNodeStack; // Stack for TreeNode()
// Viewports
ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
- // Gamepad/keyboard Navigation
- ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
+ // Keyboard/Gamepad Navigation
+ bool NavCursorVisible; // Nav focus cursor/rectangle is visible? We hide it after a mouse click. We show it after a nav move.
+ bool NavHighlightItemUnderNav; // Disable mouse hovering highlight. Highlight navigation focused item instead of mouse hovered item.
+ //bool NavDisableHighlight; // Old name for !g.NavCursorVisible before 1.91.4 (2024/10/18). OPPOSITE VALUE (g.NavDisableHighlight == !g.NavCursorVisible)
+ //bool NavDisableMouseHover; // Old name for g.NavHighlightItemUnderNav before 1.91.1 (2024/10/18) this was called When user starts using keyboard/gamepad, we hide mouse hovering highlight until mouse is touched again.
+ bool NavMousePosDirty; // When set we will update mouse position if io.ConfigNavMoveSetMousePos is set (not enabled by default)
+ bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
ImGuiID NavId; // Focused item for navigation
- ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set)
- ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem()
- ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
- ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
- ImGuiID NavActivateInputId; // ~~ IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadInput) ? NavId : 0; ImGuiActivateFlags_PreferInput will be set and NavActivateId will be 0.
+ ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
+ ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope)
+ ImGuiNavLayer NavLayer; // Focused layer (main scrolling layer, or menu/title bar layer)
+ ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem()
+ ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
+ ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
ImGuiActivateFlags NavActivateFlags;
- ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
- ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
- ImGuiKeyChord NavJustMovedToKeyMods;
+ ImVector<ImGuiFocusScopeData> NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.
+ ImGuiID NavHighlightActivatedId;
+ float NavHighlightActivatedTimer;
ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.
ImGuiActivateFlags NavNextActivateFlags;
- ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.
- ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
- bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
- bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
- bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
- bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
+ ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Mouse
+ ImGuiSelectionUserData NavLastValidSelectionUserData; // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data.
+ ImS8 NavCursorHideFrames;
// Navigation: Init & Move Requests
bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
bool NavInitRequest; // Init request for appearing window to select first item
bool NavInitRequestFromMove;
- ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
- ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window)
+ ImGuiNavItemData NavInitResult; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame()
bool NavMoveScoringItems; // Move request submitted, still scoring incoming items
bool NavMoveForwardToNextFrame;
@@ -1870,21 +2231,29 @@ struct ImGuiContext
ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy
+ // Navigation: record of last move request
+ ImGuiID NavJustMovedFromFocusScopeId; // Just navigated from this focus scope id (result of a successfully MoveRequest).
+ ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
+ ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
+ ImGuiKeyChord NavJustMovedToKeyMods;
+ bool NavJustMovedToIsTabbing; // Copy of ImGuiNavMoveFlags_IsTabbing. Maybe we should store whole flags.
+ bool NavJustMovedToHasSelectionData; // Copy of move result's ItemFlags & ImGuiItemFlags_HasSelectionUserData). Maybe we should just store ImGuiNavItemData.
+
// Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
- ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab, for reconfiguration (see #4828)
- ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab
+ ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828)
+ ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X)
ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents
float NavWindowingTimer;
float NavWindowingHighlightAlpha;
bool NavWindowingToggleLayer;
+ ImGuiKey NavWindowingToggleKey;
ImVec2 NavWindowingAccumDeltaPos;
ImVec2 NavWindowingAccumDeltaSize;
// Render
float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
- ImGuiMouseCursor MouseCursor;
// Drag and Drop
bool DragDropActive;
@@ -1895,6 +2264,7 @@ struct ImGuiContext
int DragDropMouseButton;
ImGuiPayload DragDropPayload;
ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)
+ ImRect DragDropTargetClipRect; // Store ClipRect at the time of item's drawing
ImGuiID DragDropTargetId;
ImGuiDragDropFlags DragDropAcceptFlags;
float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
@@ -1911,6 +2281,7 @@ struct ImGuiContext
// Tables
ImGuiTable* CurrentTable;
+ ImGuiID DebugBreakInTable; // Set to break in BeginTable() call.
int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)
ImVector<ImGuiTableTempData> TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting)
ImPool<ImGuiTable> Tables; // Persistent table data
@@ -1923,40 +2294,63 @@ struct ImGuiContext
ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
+ // Multi-Select state
+ ImGuiBoxSelectState BoxSelectState;
+ ImGuiMultiSelectTempData* CurrentMultiSelect;
+ int MultiSelectTempDataStacked; // Temporary multi-select data size (because we leave previous instances undestructed, we generally don't use MultiSelectTempData.Size)
+ ImVector<ImGuiMultiSelectTempData> MultiSelectTempData;
+ ImPool<ImGuiMultiSelectState> MultiSelectStorage;
+
// Hover Delay system
- ImGuiID HoverDelayId;
- ImGuiID HoverDelayIdPreviousFrame;
- float HoverDelayTimer; // Currently used IsItemHovered(), generally inferred from g.HoveredIdTimer but kept uncleared until clear timer elapse.
- float HoverDelayClearTimer; // Currently used IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.
+ ImGuiID HoverItemDelayId;
+ ImGuiID HoverItemDelayIdPreviousFrame;
+ float HoverItemDelayTimer; // Currently used by IsItemHovered()
+ float HoverItemDelayClearTimer; // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.
+ ImGuiID HoverItemUnlockedStationaryId; // Mouse has once been stationary on this item. Only reset after departing the item.
+ ImGuiID HoverWindowUnlockedStationaryId; // Mouse has once been stationary on this window. Only reset after departing the window.
+
+ // Mouse state
+ ImGuiMouseCursor MouseCursor;
+ float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic)
+ ImVec2 MouseLastValidPos;
// Widget state
- ImVec2 MouseLastValidPos;
ImGuiInputTextState InputTextState;
+ ImGuiInputTextDeactivatedState InputTextDeactivatedState;
ImFont InputTextPasswordFont;
ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
+ ImGuiDataTypeStorage DataTypeZeroValue; // 0 for all data types
+ int BeginMenuDepth;
+ int BeginComboDepth;
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
- float ColorEditLastHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
- float ColorEditLastSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
- ImU32 ColorEditLastColor; // RGB value with alpha set to 0.
+ ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
+ ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for
+ float ColorEditSavedHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
+ float ColorEditSavedSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
+ ImU32 ColorEditSavedColor; // RGB value with alpha set to 0.
ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
ImGuiComboPreviewData ComboPreviewData;
+ ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving
+ bool WindowResizeRelativeMode;
+ short ScrollbarSeekMode; // 0: scroll to clicked location, -1/+1: prev/next page.
+ float ScrollbarClickDeltaToGrabCenter; // When scrolling to mouse location: distance between mouse and center of grab box, normalized in parent space.
float SliderGrabClickOffset;
float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.
bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?
bool DragCurrentAccumDirty;
float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
- float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled()
short DisabledStackSize;
short TooltipOverrideCount;
+ ImGuiWindow* TooltipPreviousWindow; // Window of last tooltip submitted during the frame
ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined
ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once
+ ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest()
// Platform support
ImGuiPlatformImeData PlatformImeData; // Data updated by current frame
- ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn
- char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point
+ ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data. When changed we call the platform_io.Platform_SetImeDataFn() handler.
// Settings
bool SettingsLoaded;
@@ -1973,7 +2367,8 @@ struct ImGuiContext
// Capture/Logging
bool LogEnabled; // Currently capturing
- ImGuiLogType LogType; // Capture target
+ ImGuiLogFlags LogFlags; // Capture flags/type
+ ImGuiWindow* LogWindow;
ImFileHandle LogFile; // If != NULL log to stdout/ file
ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
const char* LogNextPrefix;
@@ -1984,16 +2379,36 @@ struct ImGuiContext
int LogDepthToExpand;
int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
+ // Error Handling
+ ImGuiErrorCallback ErrorCallback; // = NULL. May be exposed in public API eventually.
+ void* ErrorCallbackUserData; // = NULL
+ ImVec2 ErrorTooltipLockedPos;
+ bool ErrorFirst;
+ int ErrorCountCurrentFrame; // [Internal] Number of errors submitted this frame.
+ ImGuiErrorRecoveryState StackSizesInNewFrame; // [Internal]
+ ImGuiErrorRecoveryState*StackSizesInBeginForCurrentWindow; // [Internal]
+
// Debug Tools
+ // (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.)
+ int DebugDrawIdConflictsCount; // Locked count (preserved when holding CTRL)
ImGuiDebugLogFlags DebugLogFlags;
ImGuiTextBuffer DebugLogBuf;
ImGuiTextIndex DebugLogIndex;
+ int DebugLogSkippedErrors;
+ ImGuiDebugLogFlags DebugLogAutoDisableFlags;
+ ImU8 DebugLogAutoDisableFrames;
ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
+ bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId.
+ ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause
+ ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around.
bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())
ImU8 DebugItemPickerMouseButton;
ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID
+ float DebugFlashStyleColorTime;
+ ImVec4 DebugFlashStyleColorBackup;
ImGuiMetricsConfig DebugMetricsConfig;
- ImGuiStackTool DebugStackTool;
+ ImGuiIDStackTool DebugIDStackTool;
+ ImGuiDebugAllocInfo DebugAllocInfo;
// Misc
float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames..
@@ -2004,167 +2419,9 @@ struct ImGuiContext
int WantCaptureKeyboardNextFrame; // "
int WantTextInputNextFrame;
ImVector<char> TempBuffer; // Temporary text buffer
+ char TempKeychordName[64];
- ImGuiContext(ImFontAtlas* shared_font_atlas)
- {
- Initialized = false;
- FontAtlasOwnedByContext = shared_font_atlas ? false : true;
- Font = NULL;
- FontSize = FontBaseSize = 0.0f;
- IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
- Time = 0.0f;
- FrameCount = 0;
- FrameCountEnded = FrameCountRendered = -1;
- WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
- GcCompactAll = false;
- TestEngineHookItems = false;
- TestEngine = NULL;
-
- WindowsActiveCount = 0;
- CurrentWindow = NULL;
- HoveredWindow = NULL;
- HoveredWindowUnderMovingWindow = NULL;
- MovingWindow = NULL;
- WheelingWindow = NULL;
- WheelingWindowReleaseTimer = 0.0f;
-
- DebugHookIdInfo = 0;
- HoveredId = HoveredIdPreviousFrame = 0;
- HoveredIdAllowOverlap = false;
- HoveredIdDisabled = false;
- HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
- ActiveId = 0;
- ActiveIdIsAlive = 0;
- ActiveIdTimer = 0.0f;
- ActiveIdIsJustActivated = false;
- ActiveIdAllowOverlap = false;
- ActiveIdNoClearOnFocusLoss = false;
- ActiveIdHasBeenPressedBefore = false;
- ActiveIdHasBeenEditedBefore = false;
- ActiveIdHasBeenEditedThisFrame = false;
- ActiveIdClickOffset = ImVec2(-1, -1);
- ActiveIdWindow = NULL;
- ActiveIdSource = ImGuiInputSource_None;
- ActiveIdMouseButton = -1;
- ActiveIdPreviousFrame = 0;
- ActiveIdPreviousFrameIsAlive = false;
- ActiveIdPreviousFrameHasBeenEditedBefore = false;
- ActiveIdPreviousFrameWindow = NULL;
- LastActiveId = 0;
- LastActiveIdTimer = 0.0f;
-
- ActiveIdUsingNavDirMask = 0x00;
- ActiveIdUsingAllKeyboardKeys = false;
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- ActiveIdUsingNavInputMask = 0x00;
-#endif
-
- CurrentFocusScopeId = 0;
- CurrentItemFlags = ImGuiItemFlags_None;
- BeginMenuCount = 0;
-
- NavWindow = NULL;
- NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavActivateInputId = 0;
- NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0;
- NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None;
- NavJustMovedToKeyMods = ImGuiMod_None;
- NavInputSource = ImGuiInputSource_None;
- NavLayer = ImGuiNavLayer_Main;
- NavIdIsAlive = false;
- NavMousePosDirty = false;
- NavDisableHighlight = true;
- NavDisableMouseHover = false;
- NavAnyRequest = false;
- NavInitRequest = false;
- NavInitRequestFromMove = false;
- NavInitResultId = 0;
- NavMoveSubmitted = false;
- NavMoveScoringItems = false;
- NavMoveForwardToNextFrame = false;
- NavMoveFlags = ImGuiNavMoveFlags_None;
- NavMoveScrollFlags = ImGuiScrollFlags_None;
- NavMoveKeyMods = ImGuiMod_None;
- NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None;
- NavScoringDebugCount = 0;
- NavTabbingDir = 0;
- NavTabbingCounter = 0;
-
- ConfigNavWindowingKeyNext = ImGuiMod_Ctrl | ImGuiKey_Tab;
- ConfigNavWindowingKeyPrev = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab;
- NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
- NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
- NavWindowingToggleLayer = false;
-
- DimBgRatio = 0.0f;
- MouseCursor = ImGuiMouseCursor_Arrow;
-
- DragDropActive = DragDropWithinSource = DragDropWithinTarget = false;
- DragDropSourceFlags = ImGuiDragDropFlags_None;
- DragDropSourceFrameCount = -1;
- DragDropMouseButton = -1;
- DragDropTargetId = 0;
- DragDropAcceptFlags = ImGuiDragDropFlags_None;
- DragDropAcceptIdCurrRectSurface = 0.0f;
- DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
- DragDropAcceptFrameCount = -1;
- DragDropHoldJustPressedId = 0;
- memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
-
- ClipperTempDataStacked = 0;
-
- CurrentTable = NULL;
- TablesTempDataStacked = 0;
- CurrentTabBar = NULL;
-
- HoverDelayId = HoverDelayIdPreviousFrame = 0;
- HoverDelayTimer = HoverDelayClearTimer = 0.0f;
-
- TempInputId = 0;
- ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
- ColorEditLastHue = ColorEditLastSat = 0.0f;
- ColorEditLastColor = 0;
- SliderGrabClickOffset = 0.0f;
- SliderCurrentAccum = 0.0f;
- SliderCurrentAccumDirty = false;
- DragCurrentAccumDirty = false;
- DragCurrentAccum = 0.0f;
- DragSpeedDefaultRatio = 1.0f / 100.0f;
- ScrollbarClickDeltaToGrabCenter = 0.0f;
- DisabledAlphaBackup = 0.0f;
- DisabledStackSize = 0;
- TooltipOverrideCount = 0;
-
- PlatformImeData.InputPos = ImVec2(0.0f, 0.0f);
- PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission
- PlatformLocaleDecimalPoint = '.';
-
- SettingsLoaded = false;
- SettingsDirtyTimer = 0.0f;
- HookIdNext = 0;
-
- memset(LocalizationTable, 0, sizeof(LocalizationTable));
-
- LogEnabled = false;
- LogType = ImGuiLogType_None;
- LogNextPrefix = LogNextSuffix = NULL;
- LogFile = NULL;
- LogLinePosY = FLT_MAX;
- LogLineFirstItem = false;
- LogDepthRef = 0;
- LogDepthToExpand = LogDepthToExpandDefault = 2;
-
- DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY;
- DebugLocateId = 0;
- DebugLocateFrames = 0;
- DebugItemPickerActive = false;
- DebugItemPickerMouseButton = ImGuiMouseButton_Left;
- DebugItemPickerBreakId = 0;
-
- memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
- FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0;
- FramerateSecPerFrameAccum = 0.0f;
- WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
- }
+ ImGuiContext(ImFontAtlas* shared_font_atlas);
};
//-----------------------------------------------------------------------------
@@ -2191,27 +2448,31 @@ struct IMGUI_API ImGuiWindowTempData
ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
ImVec1 GroupOffset;
- ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensentate and fix the most common use case of large scroll area.
+ ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensate and fix the most common use case of large scroll area.
// Keyboard/Gamepad navigation
ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
short NavLayersActiveMask; // Which layers have been written to (result from previous frame)
short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
+ bool NavIsScrollPushableX; // Set when current work location may be scrolled horizontally when moving left / right. This is generally always true UNLESS within a column.
bool NavHideHighlightOneFrame;
- bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)
+ bool NavWindowHasScrollY; // Set per window when scrolling can be used (== ScrollMax.y > 0.0f)
// Miscellaneous
bool MenuBarAppending; // FIXME: Remove this
ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs.
ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement
int TreeDepth; // Current tree depth.
- ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary.
+ ImU32 TreeHasStackDataDepthMask; // Store whether given depth has ImGuiTreeNodeStackData data. Could be turned into a ImU64 if necessary.
ImVector<ImGuiWindow*> ChildWindows;
ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)
ImGuiOldColumns* CurrentColumns; // Current columns set
int CurrentTableIdx; // Current table index (into g.Tables)
ImGuiLayoutType LayoutType;
ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
+ ImU32 ModalDimBgColor;
+ ImGuiItemStatusFlags WindowItemStatusFlags;
+ ImGuiItemStatusFlags ChildItemStatusFlags;
// Local parameters stacks
// We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.
@@ -2224,9 +2485,11 @@ struct IMGUI_API ImGuiWindowTempData
// Storage for one window
struct IMGUI_API ImGuiWindow
{
+ ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).
char* Name; // Window name, owned by the window.
ImGuiID ID; // == ImHashStr(Name)
ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
+ ImGuiChildFlags ChildFlags; // Set when window is a child window. See enum ImGuiChildFlags_
ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded.
ImVec2 Pos; // Position (always rounded-up to nearest pixel)
ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
@@ -2237,9 +2500,14 @@ struct IMGUI_API ImGuiWindow
ImVec2 WindowPadding; // Window padding at the time of Begin().
float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
float WindowBorderSize; // Window border size at the time of Begin().
+ float TitleBarHeight, MenuBarHeight; // Note that those used to be function before 2024/05/28. If you have old code calling TitleBarHeight() you can change it to TitleBarHeight.
+ float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin().
+ float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y).
+ float DecoInnerSizeX1, DecoInnerSizeY1; // Applied AFTER/OVER InnerRect. Specialized for Tables as they use specialized form of clipping and frozen rows/columns are inside InnerRect (and not part of regular decoration sizes).
int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!
ImGuiID MoveId; // == window->GetID("#MOVE")
ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
+ ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
ImVec2 Scroll;
ImVec2 ScrollMax;
ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
@@ -2247,26 +2515,28 @@ struct IMGUI_API ImGuiWindow
ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar.
bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
+ bool ScrollbarXStabilizeEnabled; // Was ScrollbarX previously auto-stabilized?
+ ImU8 ScrollbarXStabilizeToggledHistory; // Used to stabilize scrollbar visibility in case of feedback loops
bool Active; // Set to true on Begin(), unless Collapsed
bool WasActive;
bool WriteAccessed; // Set to true when any widget access the current window
bool Collapsed; // Set when collapsing window to become only title-bar
bool WantCollapseToggle;
bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
+ bool SkipRefresh; // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false.
bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
bool Hidden; // Do not display (== HiddenFrames*** > 0)
bool IsFallbackWindow; // Set on the "Debug##Default" window.
bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked()
bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
+ signed char ResizeBorderHovered; // Current border being hovered for resize (-1: none, otherwise 0-3)
signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)
short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
short BeginCountPreviousFrame; // Number of Begin() during the previous frame
short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0.
short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.
short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused.
- ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
ImS8 AutoFitFramesX, AutoFitFramesY;
- ImS8 AutoFitChildAxises;
bool AutoFitOnlyGrows;
ImGuiDir AutoPosLastDirection;
ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames
@@ -2300,6 +2570,8 @@ struct IMGUI_API ImGuiWindow
ImGuiStorage StateStorage;
ImVector<ImGuiOldColumns> ColumnsStorage;
float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()
+ float FontWindowScaleParents;
+ float FontRefSize; // This is a copy of window->CalcFontSize() at the time of Begin(), trying to phase out CalcFontSize() especially as it may be called on non-current window.
int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
@@ -2310,10 +2582,12 @@ struct IMGUI_API ImGuiWindow
ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.
ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
+ ImGuiWindow* ParentWindowForFocusRoute; // Set to manual link a window to its logical parent so that Shortcut() chain are honoerd (e.g. Tool linked to Document)
ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.)
ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)
ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space
+ ImVec2 NavPreferredScoringPosRel[ImGuiNavLayer_COUNT]; // Preferred X/Y position updated when moving on a given axis, reset to FLT_MAX.
ImGuiID NavRootFocusScopeId; // Focus Scope ID at the time of Begin()
int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
@@ -2327,15 +2601,14 @@ public:
ImGuiID GetID(const char* str, const char* str_end = NULL);
ImGuiID GetID(const void* ptr);
ImGuiID GetID(int n);
+ ImGuiID GetIDFromPos(const ImVec2& p_abs);
ImGuiID GetIDFromRectangle(const ImRect& r_abs);
// We don't use g.FontSize because the window may be != g.CurrentWindow.
ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
- float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
- float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
- ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
- float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
- ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
+ float CalcFontSize() const { ImGuiContext& g = *Ctx; return g.FontBaseSize * FontWindowScale * FontWindowScaleParents; }
+ ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight)); }
+ ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight; return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight); }
};
//-----------------------------------------------------------------------------
@@ -2356,6 +2629,8 @@ enum ImGuiTabItemFlagsPrivate_
ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,
ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout)
ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button
+ ImGuiTabItemFlags_Invisible = 1 << 22, // To reserve space e.g. with ImGuiTabItemFlags_Leading
+ //ImGuiTabItemFlags_Unsorted = 1 << 23, // [Docking] Trailing tabs with the _Unsorted flag will be sorted based on the DockOrder of their Window.
};
// Storage for one active tab item (sizeof() 40 bytes)
@@ -2371,15 +2646,16 @@ struct ImGuiTabItem
float RequestedWidth; // Width optionally requested by caller, -1.0f is unused
ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
- ImS16 IndexDuringLayout; // Index only used during TabBarLayout()
+ ImS16 IndexDuringLayout; // Index only used during TabBarLayout(). Tabs gets reordered so 'Tabs[n].IndexDuringLayout == n' but may mismatch during additions.
bool WantClose; // Marked as closed by SetTabItemClosed()
ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }
};
-// Storage for a tab bar (sizeof() 152 bytes)
+// Storage for a tab bar (sizeof() 160 bytes)
struct IMGUI_API ImGuiTabBar
{
+ ImGuiWindow* Window;
ImVector<ImGuiTabItem> Tabs;
ImGuiTabBarFlags Flags;
ImGuiID ID; // Zero for tab-bars used by docking
@@ -2399,6 +2675,8 @@ struct IMGUI_API ImGuiTabBar
float ScrollingSpeed;
float ScrollingRectMinX;
float ScrollingRectMaxX;
+ float SeparatorMinX;
+ float SeparatorMaxX;
ImGuiID ReorderRequestTabId;
ImS16 ReorderRequestOffset;
ImS8 BeginCount;
@@ -2413,12 +2691,6 @@ struct IMGUI_API ImGuiTabBar
ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.
ImGuiTabBar();
- int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); }
- const char* GetTabName(const ImGuiTabItem* tab) const
- {
- IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size);
- return TabsNames.Buf.Data + tab->NameOffset;
- }
};
//-----------------------------------------------------------------------------
@@ -2426,14 +2698,13 @@ struct IMGUI_API ImGuiTabBar
//-----------------------------------------------------------------------------
#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color.
-#define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64.
-#define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels()
+#define IMGUI_TABLE_MAX_COLUMNS 512 // May be further lifted
// Our current column maximum is 64 but we may raise that in the future.
-typedef ImS8 ImGuiTableColumnIdx;
-typedef ImU8 ImGuiTableDrawChannelIdx;
+typedef ImS16 ImGuiTableColumnIdx;
+typedef ImU16 ImGuiTableDrawChannelIdx;
-// [Internal] sizeof() ~ 104
+// [Internal] sizeof() ~ 112
// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
@@ -2445,6 +2716,7 @@ struct ImGuiTableColumn
float MaxX;
float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
float WidthAuto; // Automatic width
+ float WidthMax; // Maximum width (FIXME: overwritten by each instance)
float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
ImRect ClipRect; // Clipping rectangle for the column
@@ -2479,7 +2751,7 @@ struct ImGuiTableColumn
ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3)
ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each)
- ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each)
+ ImU8 SortDirectionsAvailList; // Ordered list of available sort directions (2-bits each, total 8-bits)
ImGuiTableColumn()
{
@@ -2495,47 +2767,63 @@ struct ImGuiTableColumn
};
// Transient cell data stored per row.
-// sizeof() ~ 6
+// sizeof() ~ 6 bytes
struct ImGuiTableCellData
{
ImU32 BgColor; // Actual color
ImGuiTableColumnIdx Column; // Column number
};
-// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs, does that needs they could be moved to ImGuiTableTempData ?)
+// Parameters for TableAngledHeadersRowEx()
+// This may end up being refactored for more general purpose.
+// sizeof() ~ 12 bytes
+struct ImGuiTableHeaderData
+{
+ ImGuiTableColumnIdx Index; // Column index
+ ImU32 TextColor;
+ ImU32 BgColor0;
+ ImU32 BgColor1;
+};
+
+// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?)
+// sizeof() ~ 24 bytes
struct ImGuiTableInstanceData
{
- float LastOuterHeight; // Outer height from last frame // FIXME: multi-instance issue (#3955)
- float LastFirstRowHeight; // Height of first row from last frame // FIXME: possible multi-instance issue?
+ ImGuiID TableInstanceID;
+ float LastOuterHeight; // Outer height from last frame
+ float LastTopHeadersRowHeight; // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set)
+ float LastFrozenHeight; // Height of frozen section from last frame
+ int HoveredRowLast; // Index of row which was hovered last frame.
+ int HoveredRowNext; // Index of row hovered this frame, set after encountering it.
- ImGuiTableInstanceData() { LastOuterHeight = LastFirstRowHeight = 0.0f; }
+ ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; }
};
-// FIXME-TABLE: more transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData
+// sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory()
struct IMGUI_API ImGuiTable
{
ImGuiID ID;
ImGuiTableFlags Flags;
- void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[]
+ void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[], and RowCellData[]
ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[]
ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]
ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row.
- ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map
- ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
- ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
- ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items)
+ ImBitArrayPtr EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map
+ ImBitArrayPtr EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
+ ImBitArrayPtr VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
int SettingsOffset; // Offset in g.SettingsTables
int LastFrameActive;
int ColumnsCount; // Number of columns declared in BeginTable()
int CurrentRow;
int CurrentColumn;
- ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched.
+ ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple tables with the same ID are multiple tables, they are just synced.
ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with
float RowPosY1;
float RowPosY2;
float RowMinHeight; // Height submitted to TableNextRow()
+ float RowCellPaddingY; // Top and bottom padding. Reloaded during row change.
float RowTextBaseline;
float RowIndentOffsetX;
ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_
@@ -2549,9 +2837,8 @@ struct IMGUI_API ImGuiTable
float HostIndentX;
float MinColumnWidth;
float OuterPaddingX;
- float CellPaddingX; // Padding from each borders
- float CellPaddingY;
- float CellSpacingX1; // Spacing between non-bordered cells
+ float CellPaddingX; // Padding from each borders. Locked in BeginTable()/Layout.
+ float CellSpacingX1; // Spacing between non-bordered cells. Locked in BeginTable()/Layout.
float CellSpacingX2;
float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
float ColumnsGivenWidth; // Sum of current column width
@@ -2560,8 +2847,10 @@ struct IMGUI_API ImGuiTable
float ResizedColumnNextWidth;
float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
+ float AngledHeadersHeight; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
+ float AngledHeadersSlope; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
- ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is
+ ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is "
ImRect WorkRect;
ImRect InnerClipRect;
ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries
@@ -2580,10 +2869,12 @@ struct IMGUI_API ImGuiTable
ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs()
ImGuiTableColumnIdx SortSpecsCount;
ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount)
- ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount)
+ ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns using fixed width (<= ColumnsCount)
ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn()
+ ImGuiTableColumnIdx AngledHeadersCount; // Count columns with angled headers
ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing).
+ ImGuiTableColumnIdx HighlightColumnHeader; // Index of column which should be highlighted.
ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit.
ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0.
ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame.
@@ -2603,12 +2894,14 @@ struct IMGUI_API ImGuiTable
ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here.
ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen;
+ ImS8 NavLayer; // ImGuiNavLayer at the time of BeginTable().
bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row.
bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow().
bool IsInitializing;
bool IsSortSpecsDirty;
bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag.
bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
+ bool DisableDefaultContextMenu; // Disable default context menu contents. You may submit your own using TableBeginContextMenuPopup()/EndPopup()
bool IsSettingsRequestLoad;
bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data.
bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
@@ -2616,6 +2909,10 @@ struct IMGUI_API ImGuiTable
bool IsResetDisplayOrderRequest;
bool IsUnfrozenRows; // Set when we got past the frozen row.
bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable()
+ bool IsActiveIdAliveBeforeTable;
+ bool IsActiveIdInTable;
+ bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame.
+ bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous.
bool MemoryCompacted;
bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
@@ -2626,10 +2923,14 @@ struct IMGUI_API ImGuiTable
// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).
// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.
// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.
+// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs.
+// sizeof() ~ 136 bytes.
struct IMGUI_API ImGuiTableTempData
{
int TableIndex; // Index in g.Tables.Buf[] pool
float LastTimeActive; // Last timestamp this structure was used
+ float AngledHeadersExtraWidth; // Used in EndTable()
+ ImVector<ImGuiTableHeaderData> AngledHeadersRequests; // Used in TableAngledHeadersRow()
ImVec2 UserOuterSize; // outer_size.x passed to BeginTable()
ImDrawListSplitter DrawSplitter;
@@ -2646,7 +2947,7 @@ struct IMGUI_API ImGuiTableTempData
ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; }
};
-// sizeof() ~ 12
+// sizeof() ~ 16
struct ImGuiTableColumnSettings
{
float WidthOrWeight;
@@ -2655,7 +2956,7 @@ struct ImGuiTableColumnSettings
ImGuiTableColumnIdx DisplayOrder;
ImGuiTableColumnIdx SortOrder;
ImU8 SortDirection : 2;
- ImU8 IsEnabled : 1; // "Visible" in ini file
+ ImS8 IsEnabled : 2; // "Visible" in ini file
ImU8 IsStretch : 1;
ImGuiTableColumnSettings()
@@ -2665,7 +2966,7 @@ struct ImGuiTableColumnSettings
Index = -1;
DisplayOrder = SortOrder = -1;
SortDirection = ImGuiSortDirection_None;
- IsEnabled = 1;
+ IsEnabled = -1;
IsStretch = 0;
}
};
@@ -2693,14 +2994,17 @@ namespace ImGui
{
// Windows
// We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
- // If this ever crash because g.CurrentWindow is NULL it means that either
+ // If this ever crashes because g.CurrentWindow is NULL, it means that either:
// - ImGui::NewFrame() has never been called, which is illegal.
// - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
+ IMGUI_API ImGuiIO& GetIO(ImGuiContext* ctx);
+ IMGUI_API ImGuiPlatformIO& GetPlatformIO(ImGuiContext* ctx);
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
+ IMGUI_API void UpdateWindowSkipRefresh(ImGuiWindow* window);
IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window);
IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy);
IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
@@ -2710,12 +3014,16 @@ namespace ImGui
IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
+ IMGUI_API void SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window);
+ inline void SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; }
inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); }
inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); }
+ inline ImVec2 WindowPosAbsToRel(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x - off.x, p.y - off.y); }
+ inline ImVec2 WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }
// Windows: Display Order and Focus Order
- IMGUI_API void FocusWindow(ImGuiWindow* window);
- IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window);
+ IMGUI_API void FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);
+ IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport, ImGuiFocusRequestFlags flags);
IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
@@ -2723,12 +3031,17 @@ namespace ImGui
IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window);
IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
+ // Windows: Idle, Refresh Policies [EXPERIMENTAL]
+ IMGUI_API void SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags);
+
// Fonts, drawing
IMGUI_API void SetCurrentFont(ImFont* font);
inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
+ IMGUI_API void PushPasswordFont();
inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.
IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents.
IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.
+ IMGUI_API void AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
// Init
IMGUI_API void Initialize();
@@ -2737,6 +3050,7 @@ namespace ImGui
// NewFrame
IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs);
IMGUI_API void UpdateHoveredWindowAndCaptureFlags();
+ IMGUI_API void FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window);
IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
IMGUI_API void UpdateMouseMovingWindowNewFrame();
IMGUI_API void UpdateMouseMovingWindowEndFrame();
@@ -2747,19 +3061,23 @@ namespace ImGui
IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
// Viewports
+ IMGUI_API void ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
// Settings
IMGUI_API void MarkIniSettingsDirty();
IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
IMGUI_API void ClearIniSettings();
- IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
- IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
- IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name);
IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler);
IMGUI_API void RemoveSettingsHandler(const char* type_name);
IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
+ // Settings - Windows
+ IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
+ IMGUI_API ImGuiWindowSettings* FindWindowSettingsByID(ImGuiID id);
+ IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);
+ IMGUI_API void ClearWindowSettings(const char* name);
+
// Localization
IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }
@@ -2779,9 +3097,8 @@ namespace ImGui
//#endif
// Basic Accessors
- inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.LastItemData.ID; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand)
- inline ImGuiItemStatusFlags GetItemStatusFlags(){ ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
- inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.InFlags; }
+ inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
+ inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.ItemFlags; }
inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
@@ -2793,46 +3110,54 @@ namespace ImGui
IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes)
IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
+ IMGUI_API ImGuiID GetIDWithSeed(int n, ImGuiID seed);
// Basic Helpers for widget code
IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min.
IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);
- IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);
+ IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags);
+ IMGUI_API bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0);
IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id);
- IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
+ IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags item_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);
IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
IMGUI_API void PushMultiItemsWidths(int components, float width_full);
- IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly)
- IMGUI_API ImVec2 GetContentRegionMaxAbs();
IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess);
// Parameter stacks (shared)
- IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);
- IMGUI_API void PopItemFlag();
+ IMGUI_API const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx);
+ IMGUI_API void BeginDisabledOverrideReenable();
+ IMGUI_API void EndDisabledOverrideReenable();
// Logging/Capture
- IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
+ IMGUI_API void LogBegin(ImGuiLogFlags flags, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer
IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix);
- // Popups, Modals, Tooltips
- IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags);
+ // Childs
+ IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags);
+
+ // Popups, Modals
+ IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);
+ IMGUI_API bool BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags);
IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
IMGUI_API void ClosePopupsExceptModals();
IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
- IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
- IMGUI_API void BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window);
IMGUI_API ImGuiWindow* GetTopMostPopupModal();
IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal();
+ IMGUI_API ImGuiWindow* FindBlockingModal(ImGuiWindow* window);
IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
+ // Tooltips
+ IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
+ IMGUI_API bool BeginTooltipHidden();
+
// Menus
IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);
IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true);
@@ -2843,29 +3168,42 @@ namespace ImGui
IMGUI_API bool BeginComboPreview();
IMGUI_API void EndComboPreview();
- // Gamepad/Keyboard Navigation
+ // Keyboard/Gamepad Navigation
IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
IMGUI_API void NavInitRequestApplyResult();
IMGUI_API bool NavMoveRequestButNoResultYet();
IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result);
+ IMGUI_API void NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiTreeNodeStackData* tree_node_data);
IMGUI_API void NavMoveRequestCancel();
IMGUI_API void NavMoveRequestApplyResult();
IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
- IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
+ IMGUI_API void NavHighlightActivated(ImGuiID id);
+ IMGUI_API void NavClearPreferredPosForAxis(ImGuiAxis axis);
+ IMGUI_API void SetNavCursorVisibleAfterMove();
+ IMGUI_API void NavUpdateCurrentWindowIsScrollPushableX();
IMGUI_API void SetNavWindow(ImGuiWindow* window);
IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
+ IMGUI_API void SetNavFocusScope(ImGuiID focus_scope_id);
+
+ // Focus/Activation
+ // This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are
+ // much harder to design and implement than expected. I have a couple of private branches on this matter but it's not simple. For now implementing the easy ones.
+ IMGUI_API void FocusItem(); // Focus last item (no selection/activation).
+ IMGUI_API void ActivateItemByID(ImGuiID id); // Activate an item by ID (button, checkbox, tree node etc.). Activation is queued and processed on the next frame when the item is encountered again.
// Inputs
// FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
- inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
- inline bool IsNamedKeyOrModKey(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; }
- inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }
- inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }
- inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }
- inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }
- inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }
+ inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
+ inline bool IsNamedKeyOrMod(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; }
+ inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }
+ inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }
+ inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }
+ inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }
+ inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }
+ inline bool IsLRModKey(ImGuiKey key) { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; }
+ ImGuiKeyChord FixupKeyChord(ImGuiKeyChord key_chord);
inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key)
{
if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl;
@@ -2875,21 +3213,23 @@ namespace ImGui
return key;
}
- IMGUI_API ImGuiKeyData* GetKeyData(ImGuiKey key);
- IMGUI_API void GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size);
+ IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
+ inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
+ IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord);
inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
- IMGUI_API ImVec2 GetKeyVector2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
+ IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis);
IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate);
+ IMGUI_API void TeleportMousePos(const ImVec2& pos);
IMGUI_API void SetActiveIdUsingAllKeyboardKeys();
inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
// [EXPERIMENTAL] Low-Level: Key/Input Ownership
// - The idea is that instead of "eating" a given input, we can link to an owner id.
// - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead).
- // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID.
+ // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
// - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0).
// - Input ownership is automatically released on the frame after a key is released. Therefore:
// - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case).
@@ -2897,11 +3237,12 @@ namespace ImGui
// - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state.
// - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step.
// Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved.
- IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
- IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
- IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
- IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
- inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &GImGui->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
+ IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
+ IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
+ IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
+ IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
+ IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
+ inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
// [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership
// - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag.
@@ -2909,26 +3250,32 @@ namespace ImGui
// - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'.
// Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
// - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API.
- IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id);
- IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat.
- IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id);
- IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);
- IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0);
- IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);
-
- // [EXPERIMENTAL] Shortcut Routing
- // - ImGuiKeyChord = a ImGuiKey optionally OR-red with ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super.
- // ImGuiKey_C (accepted by functions taking ImGuiKey or ImGuiKeyChord)
- // ImGuiKey_C | ImGuiMod_Ctrl (accepted by functions taking ImGuiKeyChord)
- // ONLY ImGuiMod_XXX values are legal to 'OR' with an ImGuiKey. You CANNOT 'OR' two ImGuiKey values.
- // - When using one of the routing flags (e.g. ImGuiInputFlags_RouteFocused): routes requested ahead of time given a chord (key + modifiers) and a routing policy.
- // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.
- // - Route is granted to a single owner. When multiple requests are made we have policies to select the winning route.
- // - Multiple read sites may use the same owner id and will all get the granted route.
- // - For routing: when owner_id is 0 we use the current Focus Scope ID as a default owner in order to identify our location.
- IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
- IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
- IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
+ IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id);
+ IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat.
+ IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id);
+ IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0);
+ IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);
+ IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);
+ IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);
+ IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id);
+
+ // Shortcut Testing & Routing
+ // - Set Shortcut() and SetNextItemShortcut() in imgui.h
+ // - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(),
+ // allowing the system to decide where to route the input among other route-aware calls.
+ // (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check)
+ // - When using one of the routing option:
+ // - The default route is ImGuiInputFlags_RouteFocused (accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.)
+ // - Routes are requested given a chord (key + modifiers) and a routing policy.
+ // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.
+ // - Each route may be granted to a single owner. When multiple requests are made we have policies to select the winning route (e.g. deep most window).
+ // - Multiple read sites may use the same owner id can all access the granted route.
+ // - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location.
+ // - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute()
+ // e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused.
+ IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id);
+ IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 0
+ IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord);
// [EXPERIMENTAL] Focus Scope
@@ -2948,7 +3295,27 @@ namespace ImGui
IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
IMGUI_API void ClearDragDrop();
IMGUI_API bool IsDragDropPayloadBeingAccepted();
- IMGUI_API void RenderDragDropTargetRect(const ImRect& bb);
+ IMGUI_API void RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect);
+
+ // Typing-Select API
+ // (provide Windows Explorer style "select items by typing partial name" + "cycle through items by typing same letter" feature)
+ // (this is currently not documented nor used by main library, but should work. See "widgets_typingselect" in imgui_test_suite for usage code. Please let us know if you use this!)
+ IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None);
+ IMGUI_API int TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
+ IMGUI_API int TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
+ IMGUI_API int TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data);
+
+ // Box-Select API
+ IMGUI_API bool BeginBoxSelect(const ImRect& scope_rect, ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags);
+ IMGUI_API void EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags);
+
+ // Multi-Select API
+ IMGUI_API void MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags);
+ IMGUI_API void MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed);
+ IMGUI_API void MultiSelectAddSetAll(ImGuiMultiSelectTempData* ms, bool selected);
+ IMGUI_API void MultiSelectAddSetRange(ImGuiMultiSelectTempData* ms, bool selected, int range_dir, ImGuiSelectionUserData first_item, ImGuiSelectionUserData last_item);
+ inline ImGuiBoxSelectState* GetBoxSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.BoxSelectState.ID == id && g.BoxSelectState.IsActive) ? &g.BoxSelectState : NULL; }
+ inline ImGuiMultiSelectState* GetMultiSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return g.MultiSelectStorage.GetByKey(id); }
// Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
@@ -2966,10 +3333,12 @@ namespace ImGui
IMGUI_API void TableOpenContextMenu(int column_n = -1);
IMGUI_API void TableSetColumnWidth(int column_n, float width);
IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
- IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
+ IMGUI_API int TableGetHoveredRow(); // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet.
IMGUI_API float TableGetHeaderRowHeight();
+ IMGUI_API float TableGetHeaderAngledMaxLabelWidth();
IMGUI_API void TablePushBackgroundChannel();
IMGUI_API void TablePopBackgroundChannel();
+ IMGUI_API void TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count);
// Tables: Internals
inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
@@ -2982,10 +3351,11 @@ namespace ImGui
IMGUI_API void TableUpdateBorders(ImGuiTable* table);
IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
IMGUI_API void TableDrawBorders(ImGuiTable* table);
- IMGUI_API void TableDrawContextMenu(ImGuiTable* table);
+ IMGUI_API void TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display);
IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table);
IMGUI_API void TableMergeDrawChannels(ImGuiTable* table);
- inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }
+ inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }
+ inline ImGuiID TableGetInstanceID(ImGuiTable* table, int instance_no) { return TableGetInstanceData(table, instance_no)->TableInstanceID; }
IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table);
IMGUI_API void TableSortSpecsBuild(ImGuiTable* table);
IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
@@ -2997,8 +3367,8 @@ namespace ImGui
IMGUI_API void TableEndCell(ImGuiTable* table);
IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n);
IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n);
- IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0);
- IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n);
+ IMGUI_API ImGuiID TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no = 0);
+ IMGUI_API float TableCalcMaxColumnWidth(const ImGuiTable* table, int column_n);
IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table);
IMGUI_API void TableRemove(ImGuiTable* table);
@@ -3016,15 +3386,24 @@ namespace ImGui
IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id);
// Tab Bars
+ inline ImGuiTabBar* GetCurrentTabBar() { ImGuiContext& g = *GImGui; return g.CurrentTabBar; }
IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
+ IMGUI_API ImGuiTabItem* TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order);
+ IMGUI_API ImGuiTabItem* TabBarGetCurrentTab(ImGuiTabBar* tab_bar);
+ inline int TabBarGetTabOrder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { return tab_bar->Tabs.index_from_ptr(tab); }
+ IMGUI_API const char* TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
- IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset);
- IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, ImVec2 mouse_pos);
+ IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
+ IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, const char* tab_name);
+ IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset);
+ IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImVec2 mouse_pos);
IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar);
- IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags);
+ IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
+ IMGUI_API void TabItemSpacing(const char* str_id, ImGuiTabItemFlags flags, float width);
IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker);
+ IMGUI_API ImVec2 TabItemCalcSize(ImGuiWindow* window);
IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped);
@@ -3036,10 +3415,13 @@ namespace ImGui
IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
- IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
+ IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool borders = true, float rounding = 0.0f);
IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
- IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
+ IMGUI_API void RenderNavCursor(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None); // Navigation highlight
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ inline void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None) { RenderNavCursor(bb, id, flags); } // Renamed in 1.91.4
+#endif
IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
@@ -3054,29 +3436,35 @@ namespace ImGui
// Widgets
IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
+ IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
+ IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);
+ IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f);
+ IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width);
+ IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
+ IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
+
+ // Widgets: Window Decorations
IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);
IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);
- IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
IMGUI_API void Scrollbar(ImGuiAxis axis);
- IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags flags);
- IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col);
+ IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags draw_rounding_flags = 0);
IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners
IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);
- IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags);
- IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
- IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
// Widgets low-level behaviors
IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags);
IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
- IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f);
+ IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f, ImU32 bg_col = 0);
+
+ // Widgets: Tree Nodes
IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
IMGUI_API void TreePushOverrideID(ImGuiID id);
- IMGUI_API void TreeNodeSetOpen(ImGuiID id, bool open);
- IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.
+ IMGUI_API bool TreeNodeGetOpen(ImGuiID storage_id);
+ IMGUI_API void TreeNodeSetOpen(ImGuiID storage_id, bool open);
+ IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID storage_id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.
// Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
// To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036).
@@ -3092,16 +3480,20 @@ namespace ImGui
IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);
IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
- IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format);
+ IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty = NULL);
IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
+ IMGUI_API bool DataTypeIsZero(ImGuiDataType data_type, const void* p_data);
// InputText
IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
+ IMGUI_API void InputTextDeactivateHook(ImGuiID id);
IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL);
inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); }
inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
+ IMGUI_API void SetNextItemRefVal(ImGuiDataType data_type, void* p_data);
+ inline bool IsItemActiveAsInputText() { ImGuiContext& g = *GImGui; return g.ActiveId != 0 && g.ActiveId == g.LastItemData.ID && g.InputTextState.ID == g.LastItemData.ID; } // This may be useful to apply workaround that a based on distinguish whenever an item is active as a text input field.
// Color
IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
@@ -3109,34 +3501,44 @@ namespace ImGui
IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
// Plot
- IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size);
+ IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg);
// Shade functions (write over already created vertices)
IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
+ IMGUI_API void ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out);
// Garbage collection
IMGUI_API void GcCompactTransientMiscBuffers();
IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);
IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);
- // Debug Log
- IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1);
- IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1);
+ // Error handling, State Recovery
+ IMGUI_API bool ErrorLog(const char* msg);
+ IMGUI_API void ErrorRecoveryStoreState(ImGuiErrorRecoveryState* state_out);
+ IMGUI_API void ErrorRecoveryTryToRecoverState(const ImGuiErrorRecoveryState* state_in);
+ IMGUI_API void ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryState* state_in);
+ IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
+ IMGUI_API void ErrorCheckEndFrameFinalizeErrorTooltip();
+ IMGUI_API bool BeginErrorTooltip();
+ IMGUI_API void EndErrorTooltip();
// Debug Tools
- IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
- IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
- IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
+ IMGUI_API void DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free
+ IMGUI_API void DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255));
+ IMGUI_API void DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255));
+ IMGUI_API void DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255));
+ IMGUI_API void DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end);
IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time!
IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time!
IMGUI_API void DebugLocateItemResolveWithLastItem();
- inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); }
- inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; }
+ IMGUI_API void DebugBreakClearData();
+ IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location);
+ IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location);
IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas);
IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns);
- IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label);
+ IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);
IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
IMGUI_API void DebugNodeFont(ImFont* font);
IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
@@ -3145,28 +3547,28 @@ namespace ImGui
IMGUI_API void DebugNodeTable(ImGuiTable* table);
IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings);
IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state);
+ IMGUI_API void DebugNodeTypingSelectState(ImGuiTypingSelectState* state);
+ IMGUI_API void DebugNodeMultiSelectState(ImGuiMultiSelectState* state);
IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label);
IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings);
IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack);
IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport);
+ IMGUI_API void DebugRenderKeyboardPreview(ImDrawList* draw_list);
IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
// Obsolete functions
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89
- inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89
+ //inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89
+ //inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89
+ //inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity!
- // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets that used FocusableItemRegister():
+ // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister():
// (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)'
- // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0'
- // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || g.NavActivateInputId == id' (WIP)
- // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText()
- inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
- inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
-#endif
-#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
- inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity!
+ // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0'
+ // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))'
+ //inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
+ //inline void FocusableItemUnregister(ImGuiWindow* window) // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
#endif
} // namespace ImGui
@@ -3176,7 +3578,8 @@ namespace ImGui
// [SECTION] ImFontAtlas internal API
//-----------------------------------------------------------------------------
-// This structure is likely to evolve as we add support for incremental atlas updates
+// This structure is likely to evolve as we add support for incremental atlas updates.
+// Conceptually this could be in ImGuiPlatformIO, but we are far from ready to make this public.
struct ImFontBuilderIO
{
bool (*FontBuilder_Build)(ImFontAtlas* atlas);
@@ -3186,28 +3589,33 @@ struct ImFontBuilderIO
#ifdef IMGUI_ENABLE_STB_TRUETYPE
IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype();
#endif
+IMGUI_API void ImFontAtlasUpdateSourcesPointers(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
-IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
+IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src, float ascent, float descent);
IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value);
IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
+IMGUI_API void ImFontAtlasBuildGetOversampleFactors(const ImFontConfig* src, int* out_oversample_h, int* out_oversample_v);
+
+IMGUI_API bool ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
//-----------------------------------------------------------------------------
// [SECTION] Test Engine specific hooks (imgui_test_engine)
//-----------------------------------------------------------------------------
#ifdef IMGUI_ENABLE_TEST_ENGINE
-extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id);
+extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, ImGuiID id, const ImRect& bb, const ImGuiLastItemData* item_data); // item_data may be NULL
extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);
-#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box
-#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional)
-#define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
+// In IMGUI_VERSION_NUM >= 18934: changed IMGUI_TEST_ENGINE_ITEM_ADD(bb,id) to IMGUI_TEST_ENGINE_ITEM_ADD(id,bb,item_data);
+#define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _ID, _BB, _ITEM_DATA) // Register item bounding box
+#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional)
+#define IMGUI_TEST_ENGINE_LOG(_FMT,...) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
#else
#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) ((void)0)
#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g)
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_tables.cpp b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_tables.cpp
index 66a46573b95..c98aea2d1cc 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_tables.cpp
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_tables.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.89.1 WIP
+// dear imgui, v1.91b
// (tables and columns code)
/*
@@ -24,8 +24,9 @@ Index of this file:
*/
// Navigating this file:
-// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
-// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
+// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
+// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
+// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
//-----------------------------------------------------------------------------
// [SECTION] Commentary
@@ -48,7 +49,8 @@ Index of this file:
// - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow().
// | TableSetupDrawChannels() - setup ImDrawList channels
// | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission
-// | TableDrawContextMenu() - draw right-click context menu
+// | TableBeginContextMenuPopup()
+// | - TableDrawDefaultContextMenu() - draw right-click context menu contents
//-----------------------------------------------------------------------------
// - TableHeadersRow() or TableHeader() user submit a headers row (optional)
// | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction
@@ -80,20 +82,20 @@ Index of this file:
// - outer_size.x <= 0.0f -> Right-align from window/work-rect right-most edge. With -FLT_MIN or 0.0f will align exactly on right-most edge.
// - outer_size.x > 0.0f -> Set Fixed width.
// Y with ScrollX/ScrollY disabled: we output table directly in current window
-// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful is parent window can vertically scroll.
+// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful if parent window can vertically scroll.
// - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set)
-// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set)
+// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtendY is set)
// Y with ScrollX/ScrollY enabled: using a child window for scrolling
-// - outer_size.y < 0.0f -> Bottom-align. Not meaningful is parent window can vertically scroll.
+// - outer_size.y < 0.0f -> Bottom-align. Not meaningful if parent window can vertically scroll.
// - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window.
// - outer_size.y > 0.0f -> Set Exact height. Recommended when using Scrolling on any axis.
//-----------------------------------------------------------------------------
// Outer size is also affected by the NoHostExtendX/NoHostExtendY flags.
-// Important to that note how the two flags have slightly different behaviors!
+// Important to note how the two flags have slightly different behaviors!
// - ImGuiTableFlags_NoHostExtendX -> Make outer width auto-fit to columns (overriding outer_size.x value). Only available when ScrollX/ScrollY are disabled and Stretch columns are not used.
// - ImGuiTableFlags_NoHostExtendY -> Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY is disabled. Data below the limit will be clipped and not visible.
// In theory ImGuiTableFlags_NoHostExtendY could be the default and any non-scrolling tables with outer_size.y != 0.0f would use exact height.
-// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not easily noticeable)
+// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not useful and not easily noticeable).
//-----------------------------------------------------------------------------
// About 'inner_width':
// With ScrollX disabled:
@@ -112,15 +114,16 @@ Index of this file:
//-----------------------------------------------------------------------------
// COLUMNS SIZING POLICIES
+// (Reference: ImGuiTableFlags_SizingXXX flags and ImGuiTableColumnFlags_WidthXXX flags)
//-----------------------------------------------------------------------------
// About overriding column sizing policy and width/weight with TableSetupColumn():
-// We use a default parameter of 'init_width_or_weight == -1'.
+// We use a default parameter of -1 for 'init_width'/'init_weight'.
// - with ImGuiTableColumnFlags_WidthFixed, init_width <= 0 (default) --> width is automatic
// - with ImGuiTableColumnFlags_WidthFixed, init_width > 0 (explicit) --> width is custom
// - with ImGuiTableColumnFlags_WidthStretch, init_weight <= 0 (default) --> weight is 1.0f
// - with ImGuiTableColumnFlags_WidthStretch, init_weight > 0 (explicit) --> weight is custom
// Widths are specified _without_ CellPadding. If you specify a width of 100.0f, the column will be cover (100.0f + Padding * 2.0f)
-// and you can fit a 100.0f wide item in it without clipping and with full padding.
+// and you can fit a 100.0f wide item in it without clipping and with padding honored.
//-----------------------------------------------------------------------------
// About default sizing policy (if you don't specify a ImGuiTableColumnFlags_WidthXXXX flag)
// - with Table policy ImGuiTableFlags_SizingFixedFit --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is equal to contents width
@@ -134,10 +137,10 @@ Index of this file:
// - using mixed policies with ScrollX does not make much sense, as using Stretch columns with ScrollX does not make much sense in the first place!
// that is, unless 'inner_width' is passed to BeginTable() to explicitly provide a total width to layout columns in.
// - when using ImGuiTableFlags_SizingFixedSame with mixed columns, only the Fixed/Auto columns will match their widths to the width of the maximum contents.
-// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weight/widths.
+// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weights/widths.
//-----------------------------------------------------------------------------
// About using column width:
-// If a column is manual resizable or has a width specified with TableSetupColumn():
+// If a column is manually resizable or has a width specified with TableSetupColumn():
// - you may use GetContentRegionAvail().x to query the width available in a given column.
// - right-side alignment features such as SetNextItemWidth(-x) or PushItemWidth(-x) will rely on this width.
// If the column is not resizable and has no width specified with TableSetupColumn():
@@ -151,7 +154,7 @@ Index of this file:
// TABLES CLIPPING/CULLING
//-----------------------------------------------------------------------------
// About clipping/culling of Rows in Tables:
-// - For large numbers of rows, it is recommended you use ImGuiListClipper to only submit visible rows.
+// - For large numbers of rows, it is recommended you use ImGuiListClipper to submit only visible rows.
// ImGuiListClipper is reliant on the fact that rows are of equal height.
// See 'Demo->Tables->Vertical Scrolling' or 'Demo->Tables->Advanced' for a demo of using the clipper.
// - Note that auto-resizing columns don't play well with using the clipper.
@@ -168,7 +171,7 @@ Index of this file:
// - Case C: column is hidden explicitly by the user (e.g. via the context menu, or _DefaultHide column flag, etc.).
//
// [A] [B] [C]
-// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() return false, user can skip submitting items but only if the column doesn't contribute to row height.
+// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() returns false, user can skip submitting items but only if the column doesn't contribute to row height.
// SkipItems: false false true -> [internal] when SkipItems is true, most widgets will early out if submitted, resulting is no layout output.
// ClipRect: normal zero-width zero-width -> [internal] when ClipRect is zero, ItemAdd() will return false and most widgets will early out mid-way.
// ImDrawList output: normal dummy dummy -> [internal] when using the dummy channel, ImDrawList submissions (if any) will be wasted (because cliprect is zero-width anyway).
@@ -188,20 +191,16 @@ Index of this file:
#define _CRT_SECURE_NO_WARNINGS
#endif
-#include "imgui.h"
-#ifndef IMGUI_DISABLE
-
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
+
+#include "imgui.h"
+#ifndef IMGUI_DISABLE
#include "imgui_internal.h"
// System includes
-#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
-#include <stddef.h> // intptr_t
-#else
#include <stdint.h> // intptr_t
-#endif
// Visual Studio warnings
#ifdef _MSC_VER
@@ -222,6 +221,7 @@ Index of this file:
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok.
+#pragma clang diagnostic ignored "-Wformat" // warning: format specifies type 'int' but the argument has type 'unsigned int'
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0
@@ -229,9 +229,16 @@ Index of this file:
#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_')
#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
+#pragma clang diagnostic ignored "-Wswitch-default" // warning: 'switch' missing 'default' label
#elif defined(__GNUC__)
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
+#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
+#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'int'/'void*', but argument X has type 'unsigned int'/'ImGuiWindow*'
+#pragma GCC diagnostic ignored "-Wstrict-overflow"
#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#endif
@@ -315,28 +322,36 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
return false;
// Sanity checks
- IM_ASSERT(columns_count > 0 && columns_count <= IMGUI_TABLE_MAX_COLUMNS && "Only 1..64 columns allowed!");
+ IM_ASSERT(columns_count > 0 && columns_count < IMGUI_TABLE_MAX_COLUMNS);
if (flags & ImGuiTableFlags_ScrollX)
IM_ASSERT(inner_width >= 0.0f);
- // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping rules may evolve.
+ // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping criteria may evolve.
+ // FIXME: coarse clipping because access to table data causes two issues:
+ // - instance numbers varying/unstable. may not be a direct problem for users, but could make outside access broken or confusing, e.g. TestEngine.
+ // - can't implement support for ImGuiChildFlags_ResizeY as we need to somehow pull the height data from somewhere. this also needs stable instance numbers.
+ // The side-effects of accessing table data on coarse clip would be:
+ // - always reserving the pooled ImGuiTable data ahead for a fully clipped table (minor IMHO). Also the 'outer_window_is_measuring_size' criteria may already be defeating this in some situations.
+ // - always performing the GetOrAddByKey() O(log N) query in g.Tables.Map[].
const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0;
const ImVec2 avail_size = GetContentRegionAvail();
- ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f);
- ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size);
- if (use_child_window && IsClippedEx(outer_rect, 0))
+ const ImVec2 actual_outer_size = ImTrunc(CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f));
+ const ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size);
+ const bool outer_window_is_measuring_size = (outer_window->AutoFitFramesX > 0) || (outer_window->AutoFitFramesY > 0); // Doesn't apply to AlwaysAutoResize windows!
+ if (use_child_window && IsClippedEx(outer_rect, 0) && !outer_window_is_measuring_size)
{
ItemSize(outer_rect);
+ ItemAdd(outer_rect, id);
+ g.NextWindowData.ClearFlags();
return false;
}
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInTable == id)
+ IM_DEBUG_BREAK();
+
// Acquire storage for the table
ImGuiTable* table = g.Tables.GetOrAddByKey(id);
- const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1;
- const ImGuiID instance_id = id + instance_no;
- const ImGuiTableFlags table_last_flags = table->Flags;
- if (instance_no > 0)
- IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID");
// Acquire temporary buffers
const int table_idx = g.Tables.GetIndex(table);
@@ -352,17 +367,35 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
flags = TableFixFlags(flags, outer_window);
// Initialize
+ const int previous_frame_active = table->LastFrameActive;
+ const int instance_no = (previous_frame_active != g.FrameCount) ? 0 : table->InstanceCurrent + 1;
+ const ImGuiTableFlags previous_flags = table->Flags;
table->ID = id;
table->Flags = flags;
- table->InstanceCurrent = (ImS16)instance_no;
table->LastFrameActive = g.FrameCount;
table->OuterWindow = table->InnerWindow = outer_window;
table->ColumnsCount = columns_count;
table->IsLayoutLocked = false;
table->InnerWidth = inner_width;
+ table->NavLayer = (ImS8)outer_window->DC.NavLayerCurrent;
temp_data->UserOuterSize = outer_size;
- if (instance_no > 0 && table->InstanceDataExtra.Size < instance_no)
- table->InstanceDataExtra.push_back(ImGuiTableInstanceData());
+
+ // Instance data (for instance 0, TableID == TableInstanceID)
+ ImGuiID instance_id;
+ table->InstanceCurrent = (ImS16)instance_no;
+ if (instance_no > 0)
+ {
+ IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID");
+ if (table->InstanceDataExtra.Size < instance_no)
+ table->InstanceDataExtra.push_back(ImGuiTableInstanceData());
+ instance_id = GetIDWithSeed(instance_no, GetIDWithSeed("##Instances", NULL, id)); // Push "##Instances" followed by (int)instance_no in ID stack.
+ }
+ else
+ {
+ instance_id = id;
+ }
+ ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
+ table_instance->TableInstanceID = instance_id;
// When not using a child window, WorkRect.Max will grow as we append contents.
if (use_child_window)
@@ -384,27 +417,46 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f));
// Reset scroll if we are reactivating it
- if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0)
- SetNextWindowScroll(ImVec2(0.0f, 0.0f));
+ if ((previous_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0)
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasScroll) == 0)
+ SetNextWindowScroll(ImVec2(0.0f, 0.0f));
// Create scrolling region (without border and zero window padding)
- ImGuiWindowFlags child_flags = (flags & ImGuiTableFlags_ScrollX) ? ImGuiWindowFlags_HorizontalScrollbar : ImGuiWindowFlags_None;
- BeginChildEx(name, instance_id, outer_rect.GetSize(), false, child_flags);
+ ImGuiChildFlags child_child_flags = (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasChildFlags) ? g.NextWindowData.ChildFlags : ImGuiChildFlags_None;
+ ImGuiWindowFlags child_window_flags = (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasWindowFlags) ? g.NextWindowData.WindowFlags : ImGuiWindowFlags_None;
+ if (flags & ImGuiTableFlags_ScrollX)
+ child_window_flags |= ImGuiWindowFlags_HorizontalScrollbar;
+ BeginChildEx(name, instance_id, outer_rect.GetSize(), child_child_flags, child_window_flags);
table->InnerWindow = g.CurrentWindow;
table->WorkRect = table->InnerWindow->WorkRect;
table->OuterRect = table->InnerWindow->Rect();
table->InnerRect = table->InnerWindow->InnerRect;
IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f);
+
+ // Allow submitting when host is measuring
+ if (table->InnerWindow->SkipItems && outer_window_is_measuring_size)
+ table->InnerWindow->SkipItems = false;
+
+ // When using multiple instances, ensure they have the same amount of horizontal decorations (aka vertical scrollbar) so stretched columns can be aligned)
+ if (instance_no == 0)
+ {
+ table->HasScrollbarYPrev = table->HasScrollbarYCurr;
+ table->HasScrollbarYCurr = false;
+ }
+ table->HasScrollbarYCurr |= table->InnerWindow->ScrollbarY;
}
else
{
// For non-scrolling tables, WorkRect == OuterRect == InnerRect.
// But at this point we do NOT have a correct value for .Max.y (unless a height has been explicitly passed in). It will only be updated in EndTable().
table->WorkRect = table->OuterRect = table->InnerRect = outer_rect;
+ table->HasScrollbarYPrev = table->HasScrollbarYCurr = false;
}
// Push a standardized ID for both child-using and not-child-using tables
- PushOverrideID(instance_id);
+ PushOverrideID(id);
+ if (instance_no > 0)
+ PushOverrideID(instance_id); // FIXME: Somehow this is not resolved by stack-tool, even tho GetIDWithSeed() submitted the symbol.
// Backup a copy of host window members we will modify
ImGuiWindow* inner_window = table->InnerWindow;
@@ -421,6 +473,29 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
temp_data->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size;
inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f);
+ // Make borders not overlap our contents by offsetting HostClipRect (#6765, #7428, #3752)
+ // (we normally shouldn't alter HostClipRect as we rely on TableMergeDrawChannels() expanding non-clipped column toward the
+ // limits of that rectangle, in order for ImDrawListSplitter::Merge() to merge the draw commands. However since the overlap
+ // problem only affect scrolling tables in this case we can get away with doing it without extra cost).
+ if (inner_window != outer_window)
+ {
+ // FIXME: Because inner_window's Scrollbar doesn't know about border size, since it's not encoded in window->WindowBorderSize,
+ // it already overlaps it and doesn't need an extra offset. Ideally we should be able to pass custom border size with
+ // different x/y values to BeginChild().
+ if (flags & ImGuiTableFlags_BordersOuterV)
+ {
+ table->HostClipRect.Min.x = ImMin(table->HostClipRect.Min.x + TABLE_BORDER_SIZE, table->HostClipRect.Max.x);
+ if (inner_window->DecoOuterSizeX2 == 0.0f)
+ table->HostClipRect.Max.x = ImMax(table->HostClipRect.Max.x - TABLE_BORDER_SIZE, table->HostClipRect.Min.x);
+ }
+ if (flags & ImGuiTableFlags_BordersOuterH)
+ {
+ table->HostClipRect.Min.y = ImMin(table->HostClipRect.Min.y + TABLE_BORDER_SIZE, table->HostClipRect.Max.y);
+ if (inner_window->DecoOuterSizeY2 == 0.0f)
+ table->HostClipRect.Max.y = ImMax(table->HostClipRect.Max.y - TABLE_BORDER_SIZE, table->HostClipRect.Min.y);
+ }
+ }
+
// Padding and Spacing
// - None ........Content..... Pad .....Content........
// - PadOuter | Pad ..Content..... Pad .....Content.. Pad |
@@ -434,7 +509,6 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border;
table->CellSpacingX2 = inner_spacing_explicit;
table->CellPaddingX = inner_padding_explicit;
- table->CellPaddingY = g.Style.CellPadding.y;
const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f;
const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f;
@@ -447,29 +521,35 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
table->InnerClipRect = (inner_window == outer_window) ? table->WorkRect : inner_window->ClipRect;
table->InnerClipRect.ClipWith(table->WorkRect); // We need this to honor inner_width
table->InnerClipRect.ClipWithFull(table->HostClipRect);
- table->InnerClipRect.Max.y = (flags & ImGuiTableFlags_NoHostExtendY) ? ImMin(table->InnerClipRect.Max.y, inner_window->WorkRect.Max.y) : inner_window->ClipRect.Max.y;
+ table->InnerClipRect.Max.y = (flags & ImGuiTableFlags_NoHostExtendY) ? ImMin(table->InnerClipRect.Max.y, inner_window->WorkRect.Max.y) : table->HostClipRect.Max.y;
table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow
table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow()
+ table->RowCellPaddingY = 0.0f;
table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any
table->FreezeColumnsRequest = table->FreezeColumnsCount = 0;
table->IsUnfrozenRows = true;
- table->DeclColumnsCount = 0;
+ table->DeclColumnsCount = table->AngledHeadersCount = 0;
+ if (previous_frame_active + 1 < g.FrameCount)
+ table->IsActiveIdInTable = false;
+ table->AngledHeadersHeight = 0.0f;
+ temp_data->AngledHeadersExtraWidth = 0.0f;
- // Using opaque colors facilitate overlapping elements of the grid
+ // Using opaque colors facilitate overlapping lines of the grid, otherwise we'd need to improve TableDrawBorders()
table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong);
table->BorderColorLight = GetColorU32(ImGuiCol_TableBorderLight);
// Make table current
g.CurrentTable = table;
+ outer_window->DC.NavIsScrollPushableX = false; // Shortcut for NavUpdateCurrentWindowIsScrollPushableX();
outer_window->DC.CurrentTableIdx = table_idx;
if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly.
inner_window->DC.CurrentTableIdx = table_idx;
- if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0)
+ if ((previous_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0)
table->IsResetDisplayOrderRequest = true;
- // Mark as used
+ // Mark as used to avoid GC
if (table_idx >= g.TablesLastTimeActive.Size)
g.TablesLastTimeActive.resize(table_idx + 1, -1.0f);
g.TablesLastTimeActive[table_idx] = (float)g.Time;
@@ -499,6 +579,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
// Initialize
table->SettingsOffset = -1;
table->IsSortSpecsDirty = true;
+ table->IsSettingsDirty = true; // Records itself into .ini file even when in default state (#7934)
table->InstanceInteracted = -1;
table->ContextPopupColumn = -1;
table->ReorderColumn = table->ResizedColumn = table->LastResizedColumn = -1;
@@ -562,34 +643,40 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
}
// For reference, the average total _allocation count_ for a table is:
-// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables)
+// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables[])
// + 1 (for table->RawData allocated below)
// + 1 (for table->ColumnsNames, if names are used)
-// Shared allocations per number of nested tables
+// Shared allocations for the maximum number of simultaneously nested tables (generally a very small number)
// + 1 (for table->Splitter._Channels)
// + 2 * active_channels_count (for ImDrawCmd and ImDrawIdx buffers inside channels)
-// Where active_channels_count is variable but often == columns_count or columns_count + 1, see TableSetupDrawChannels() for details.
+// Where active_channels_count is variable but often == columns_count or == columns_count + 1, see TableSetupDrawChannels() for details.
// Unused channels don't perform their +2 allocations.
void ImGui::TableBeginInitMemory(ImGuiTable* table, int columns_count)
{
// Allocate single buffer for our arrays
- ImSpanAllocator<3> span_allocator;
+ const int columns_bit_array_size = (int)ImBitArrayGetStorageSizeInBytes(columns_count);
+ ImSpanAllocator<6> span_allocator;
span_allocator.Reserve(0, columns_count * sizeof(ImGuiTableColumn));
span_allocator.Reserve(1, columns_count * sizeof(ImGuiTableColumnIdx));
span_allocator.Reserve(2, columns_count * sizeof(ImGuiTableCellData), 4);
+ for (int n = 3; n < 6; n++)
+ span_allocator.Reserve(n, columns_bit_array_size);
table->RawData = IM_ALLOC(span_allocator.GetArenaSizeInBytes());
memset(table->RawData, 0, span_allocator.GetArenaSizeInBytes());
span_allocator.SetArenaBasePtr(table->RawData);
span_allocator.GetSpan(0, &table->Columns);
span_allocator.GetSpan(1, &table->DisplayOrderToIndex);
span_allocator.GetSpan(2, &table->RowCellData);
+ table->EnabledMaskByDisplayOrder = (ImU32*)span_allocator.GetSpanPtrBegin(3);
+ table->EnabledMaskByIndex = (ImU32*)span_allocator.GetSpanPtrBegin(4);
+ table->VisibleMaskByIndex = (ImU32*)span_allocator.GetSpanPtrBegin(5);
}
// Apply queued resizing/reordering/hiding requests
void ImGui::TableBeginApplyRequests(ImGuiTable* table)
{
// Handle resizing request
- // (We process this at the first TableBegin of the frame)
+ // (We process this in the TableBegin() of the first instance of each table)
// FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling?
if (table->InstanceCurrent == 0)
{
@@ -634,8 +721,7 @@ void ImGui::TableBeginApplyRequests(ImGuiTable* table)
table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder -= (ImGuiTableColumnIdx)reorder_dir;
IM_ASSERT(dst_column->DisplayOrder == dst_order - reorder_dir);
- // Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[],
- // rebuild the later from the former.
+ // Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[]. Rebuild later from the former.
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n;
table->ReorderColumnDir = 0;
@@ -709,8 +795,8 @@ static void TableSetupColumnFlags(ImGuiTable* table, ImGuiTableColumn* column, I
}
}
-// Layout columns for the frame. This is in essence the followup to BeginTable().
-// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() to be called first.
+// Layout columns for the frame. This is in essence the followup to BeginTable() and this is our largest function.
+// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() and other TableSetupXXXXX() functions to be called first.
// FIXME-TABLE: Our width (and therefore our WorkRect) will be minimal in the first frame for _WidthAuto columns.
// Increase feedback side-effect with widgets relying on WorkRect.Max.x... Maybe provide a default distribution for _WidthAuto columns?
void ImGui::TableUpdateLayout(ImGuiTable* table)
@@ -721,8 +807,8 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_);
table->IsDefaultDisplayOrder = true;
table->ColumnsEnabledCount = 0;
- table->EnabledMaskByIndex = 0x00;
- table->EnabledMaskByDisplayOrder = 0x00;
+ ImBitArrayClearAllBits(table->EnabledMaskByIndex, table->ColumnsCount);
+ ImBitArrayClearAllBits(table->EnabledMaskByDisplayOrder, table->ColumnsCount);
table->LeftMostEnabledColumn = -1;
table->MinColumnWidth = ImMax(1.0f, g.Style.FramePadding.x * 1.0f); // g.Style.ColumnsMinSpacing; // FIXME-TABLE
@@ -787,14 +873,14 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
else
table->LeftMostEnabledColumn = (ImGuiTableColumnIdx)column_n;
column->IndexWithinEnabledSet = table->ColumnsEnabledCount++;
- table->EnabledMaskByIndex |= (ImU64)1 << column_n;
- table->EnabledMaskByDisplayOrder |= (ImU64)1 << column->DisplayOrder;
+ ImBitArraySetBit(table->EnabledMaskByIndex, column_n);
+ ImBitArraySetBit(table->EnabledMaskByDisplayOrder, column->DisplayOrder);
prev_visible_column_idx = column_n;
IM_ASSERT(column->IndexWithinEnabledSet <= column->DisplayOrder);
// Calculate ideal/auto column width (that's the width required for all contents to be visible without clipping)
// Combine width from regular rows + width from headers unless requested not to.
- if (!column->IsPreserveWidthAuto)
+ if (!column->IsPreserveWidthAuto && table->InstanceCurrent == 0)
column->WidthAuto = TableGetColumnWidthAuto(table, column);
// Non-resizable columns keep their requested width (apply user value regardless of IsPreserveWidthAuto)
@@ -822,8 +908,8 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx;
IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0);
- // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible
- // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing).
+ // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible to avoid
+ // the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). Also see #6510.
// FIXME-TABLE: for always auto-resizing columns may not want to do that all the time.
if (has_auto_fit_request && table->OuterWindow != table->InnerWindow)
table->InnerWindow->SkipItems = false;
@@ -831,12 +917,12 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
table->IsSettingsDirty = true;
// [Part 3] Fix column flags and record a few extra information.
- float sum_width_requests = 0.0f; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding.
- float stretch_sum_weights = 0.0f; // Sum of all weights for stretch columns.
+ float sum_width_requests = 0.0f; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding.
+ float stretch_sum_weights = 0.0f; // Sum of all weights for stretch columns.
table->LeftMostStretchedColumn = table->RightMostStretchedColumn = -1;
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{
- if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n)))
+ if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n))
continue;
ImGuiTableColumn* column = &table->Columns[column_n];
@@ -852,7 +938,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// Latch initial size for fixed columns and update it constantly for auto-resizing column (unless clipped!)
if (column->AutoFitQueue != 0x00)
column->WidthRequest = width_auto;
- else if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !column_is_resizable && (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)))
+ else if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !column_is_resizable && column->IsRequestOutput)
column->WidthRequest = width_auto;
// FIXME-TABLE: Increase minimum size during init frame to avoid biasing auto-fitting widgets
@@ -893,13 +979,14 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// [Part 4] Apply final widths based on requested widths
const ImRect work_rect = table->WorkRect;
const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1);
- const float width_avail = ((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) ? table->InnerClipRect.GetWidth() : work_rect.GetWidth();
+ const float width_removed = (table->HasScrollbarYPrev && !table->InnerWindow->ScrollbarY) ? g.Style.ScrollbarSize : 0.0f; // To synchronize decoration width of synced tables with mismatching scrollbar state (#5920)
+ const float width_avail = ImMax(1.0f, (((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) ? table->InnerClipRect.GetWidth() : work_rect.GetWidth()) - width_removed);
const float width_avail_for_stretched_columns = width_avail - width_spacings - sum_width_requests;
float width_remaining_for_stretched_columns = width_avail_for_stretched_columns;
table->ColumnsGivenWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount;
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{
- if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n)))
+ if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n))
continue;
ImGuiTableColumn* column = &table->Columns[column_n];
@@ -907,7 +994,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
if (column->Flags & ImGuiTableColumnFlags_WidthStretch)
{
float weight_ratio = column->StretchWeight / stretch_sum_weights;
- column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f);
+ column->WidthRequest = IM_TRUNC(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f);
width_remaining_for_stretched_columns -= column->WidthRequest;
}
@@ -917,7 +1004,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
column->Flags |= ImGuiTableColumnFlags_NoDirectResize_;
// Assign final width, record width in case we will need to shrink
- column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth));
+ column->WidthGiven = ImTrunc(ImMax(column->WidthRequest, table->MinColumnWidth));
table->ColumnsGivenWidth += column->WidthGiven;
}
@@ -926,7 +1013,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
if (width_remaining_for_stretched_columns >= 1.0f && !(table->Flags & ImGuiTableFlags_PreciseWidths))
for (int order_n = table->ColumnsCount - 1; stretch_sum_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--)
{
- if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)))
+ if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n))
continue;
ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]];
if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch))
@@ -942,29 +1029,37 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// clear ActiveId, which is equivalent to the change provided by _AllowWhenBLockedByActiveItem).
// - This allows columns to be marked as hovered when e.g. clicking a button inside the column, or using drag and drop.
ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
- table->HoveredColumnBody = -1;
- table->HoveredColumnBorder = -1;
+ table_instance->HoveredRowLast = table_instance->HoveredRowNext;
+ table_instance->HoveredRowNext = -1;
+ table->HoveredColumnBody = table->HoveredColumnBorder = -1;
const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table_instance->LastOuterHeight));
const ImGuiID backup_active_id = g.ActiveId;
g.ActiveId = 0;
- const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0);
+ const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0, ImGuiItemFlags_None);
g.ActiveId = backup_active_id;
+ // Determine skewed MousePos.x to support angled headers.
+ float mouse_skewed_x = g.IO.MousePos.x;
+ if (table->AngledHeadersHeight > 0.0f)
+ if (g.IO.MousePos.y >= table->OuterRect.Min.y && g.IO.MousePos.y <= table->OuterRect.Min.y + table->AngledHeadersHeight)
+ mouse_skewed_x += ImTrunc((table->OuterRect.Min.y + table->AngledHeadersHeight - g.IO.MousePos.y) * table->AngledHeadersSlope);
+
// [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column
// Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping.
int visible_n = 0;
+ bool has_at_least_one_column_requesting_output = false;
bool offset_x_frozen = (table->FreezeColumnsCount > 0);
float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1;
ImRect host_clip_rect = table->InnerClipRect;
//host_clip_rect.Max.x += table->CellPaddingX + table->CellSpacingX2;
- table->VisibleMaskByIndex = 0x00;
- table->RequestOutputMaskByIndex = 0x00;
+ ImBitArrayClearAllBits(table->VisibleMaskByIndex, table->ColumnsCount);
for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{
const int column_n = table->DisplayOrderToIndex[order_n];
ImGuiTableColumn* column = &table->Columns[column_n];
- column->NavLayerCurrent = (ImS8)((table->FreezeRowsCount > 0 || column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main);
+ // Initial nav layer: using FreezeRowsCount, NOT FreezeRowsRequest, so Header line changes layer when frozen
+ column->NavLayerCurrent = (ImS8)(table->FreezeRowsCount > 0 ? ImGuiNavLayer_Menu : (ImGuiNavLayer)table->NavLayer);
if (offset_x_frozen && table->FreezeColumnsCount == visible_n)
{
@@ -975,7 +1070,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// Clear status flags
column->Flags &= ~ImGuiTableColumnFlags_StatusMask_;
- if ((table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)) == 0)
+ if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n))
{
// Hidden column: clear a few fields and we are done with it for the remainder of the function.
// We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper.
@@ -990,16 +1085,12 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
continue;
}
- // Detect hovered column
- if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x)
- table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n;
-
// Lock start position
column->MinX = offset_x;
// Lock width based on start position and minimum/maximum width for this position
- float max_width = TableGetMaxColumnWidth(table, column_n);
- column->WidthGiven = ImMin(column->WidthGiven, max_width);
+ column->WidthMax = TableCalcMaxColumnWidth(table, column_n);
+ column->WidthGiven = ImMin(column->WidthGiven, column->WidthMax);
column->WidthGiven = ImMax(column->WidthGiven, ImMin(column->WidthRequest, table->MinColumnWidth));
column->MaxX = offset_x + column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f;
@@ -1008,9 +1099,10 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column.
// - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow.
// - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter.
+ const float previous_instance_work_min_x = column->WorkMinX;
column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1;
column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max
- column->ItemWidth = ImFloor(column->WidthGiven * 0.65f);
+ column->ItemWidth = ImTrunc(column->WidthGiven * 0.65f);
column->ClipRect.Min.x = column->MinX;
column->ClipRect.Min.y = work_rect.Min.y;
column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX;
@@ -1028,17 +1120,18 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
column->IsVisibleY = true; // (column->ClipRect.Max.y > column->ClipRect.Min.y);
const bool is_visible = column->IsVisibleX; //&& column->IsVisibleY;
if (is_visible)
- table->VisibleMaskByIndex |= ((ImU64)1 << column_n);
+ ImBitArraySetBit(table->VisibleMaskByIndex, column_n);
// Mark column as requesting output from user. Note that fixed + non-resizable sets are auto-fitting at all times and therefore always request output.
column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0;
- if (column->IsRequestOutput)
- table->RequestOutputMaskByIndex |= ((ImU64)1 << column_n);
// Mark column as SkipItems (ignoring all items/layout)
+ // (table->HostSkipItems is a copy of inner_window->SkipItems before we cleared it above in Part 2)
column->IsSkipItems = !column->IsEnabled || table->HostSkipItems;
if (column->IsSkipItems)
IM_ASSERT(!is_visible);
+ if (column->IsRequestOutput && !column->IsSkipItems)
+ has_at_least_one_column_requesting_output = true;
// Update status flags
column->Flags |= ImGuiTableColumnFlags_IsEnabled;
@@ -1046,8 +1139,13 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
column->Flags |= ImGuiTableColumnFlags_IsVisible;
if (column->SortOrder != -1)
column->Flags |= ImGuiTableColumnFlags_IsSorted;
- if (table->HoveredColumnBody == column_n)
+
+ // Detect hovered column
+ if (is_hovering_table && mouse_skewed_x >= column->ClipRect.Min.x && mouse_skewed_x < column->ClipRect.Max.x)
+ {
column->Flags |= ImGuiTableColumnFlags_IsHovered;
+ table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n;
+ }
// Alignment
// FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in
@@ -1059,11 +1157,25 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f);
// Reset content width variables
- column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX;
- column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX;
+ if (table->InstanceCurrent == 0)
+ {
+ column->ContentMaxXFrozen = column->WorkMinX;
+ column->ContentMaxXUnfrozen = column->WorkMinX;
+ column->ContentMaxXHeadersUsed = column->WorkMinX;
+ column->ContentMaxXHeadersIdeal = column->WorkMinX;
+ }
+ else
+ {
+ // As we store an absolute value to make per-cell updates faster, we need to offset values used for width computation.
+ const float offset_from_previous_instance = column->WorkMinX - previous_instance_work_min_x;
+ column->ContentMaxXFrozen += offset_from_previous_instance;
+ column->ContentMaxXUnfrozen += offset_from_previous_instance;
+ column->ContentMaxXHeadersUsed += offset_from_previous_instance;
+ column->ContentMaxXHeadersIdeal += offset_from_previous_instance;
+ }
// Don't decrement auto-fit counters until container window got a chance to submit its items
- if (table->HostSkipItems == false)
+ if (table->HostSkipItems == false && table->InstanceCurrent == 0)
{
column->AutoFitQueue >>= 1;
column->CannotSkipItemsQueue >>= 1;
@@ -1076,18 +1188,26 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
visible_n++;
}
+ // In case the table is visible (e.g. decorations) but all columns clipped, we keep a column visible.
+ // Else if give no chance to a clipper-savy user to submit rows and therefore total contents height used by scrollbar.
+ if (has_at_least_one_column_requesting_output == false)
+ {
+ table->Columns[table->LeftMostEnabledColumn].IsRequestOutput = true;
+ table->Columns[table->LeftMostEnabledColumn].IsSkipItems = false;
+ }
+
// [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it)
// Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either
// because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu.
const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x);
if (is_hovering_table && table->HoveredColumnBody == -1)
- {
- if (g.IO.MousePos.x >= unused_x1)
+ if (mouse_skewed_x >= unused_x1)
table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount;
- }
if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable))
table->Flags &= ~ImGuiTableFlags_Resizable;
+ table->IsActiveIdAliveBeforeTable = (g.ActiveIdIsAlive != 0);
+
// [Part 8] Lock actual OuterRect/WorkRect right-most position.
// This is done late to handle the case of fixed-columns tables not claiming more widths that they need.
// Because of this we are careful with uses of WorkRect and InnerClipRect before this point.
@@ -1099,8 +1219,16 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1);
}
table->InnerWindow->ParentWorkRect = table->WorkRect;
- table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f);
- table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f);
+ table->BorderX1 = table->InnerClipRect.Min.x;
+ table->BorderX2 = table->InnerClipRect.Max.x;
+
+ // Setup window's WorkRect.Max.y for GetContentRegionAvail(). Other values will be updated in each TableBeginCell() call.
+ float window_content_max_y;
+ if (table->Flags & ImGuiTableFlags_NoHostExtendY)
+ window_content_max_y = table->OuterRect.Max.y;
+ else
+ window_content_max_y = ImMax(table->InnerWindow->ContentRegionRect.Max.y, (table->Flags & ImGuiTableFlags_ScrollY) ? 0.0f : table->OuterRect.Max.y);
+ table->InnerWindow->WorkRect.Max.y = ImClamp(window_content_max_y - g.Style.CellPadding.y, table->InnerWindow->WorkRect.Min.y, table->InnerWindow->WorkRect.Max.y);
// [Part 9] Allocate draw channels and setup background cliprect
TableSetupDrawChannels(table);
@@ -1108,34 +1236,51 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
// [Part 10] Hit testing on borders
if (table->Flags & ImGuiTableFlags_Resizable)
TableUpdateBorders(table);
- table_instance->LastFirstRowHeight = 0.0f;
+ table_instance->LastTopHeadersRowHeight = 0.0f;
table->IsLayoutLocked = true;
table->IsUsingHeaders = false;
- // [Part 11] Context menu
- if (TableBeginContextMenuPopup(table))
+ // Highlight header
+ table->HighlightColumnHeader = -1;
+ if (table->IsContextPopupOpen && table->ContextPopupColumn != -1 && table->InstanceInteracted == table->InstanceCurrent)
+ table->HighlightColumnHeader = table->ContextPopupColumn;
+ else if ((table->Flags & ImGuiTableFlags_HighlightHoveredColumn) && table->HoveredColumnBody != -1 && table->HoveredColumnBody != table->ColumnsCount && table->HoveredColumnBorder == -1)
+ if (g.ActiveId == 0 || (table->IsActiveIdInTable || g.DragDropActive))
+ table->HighlightColumnHeader = table->HoveredColumnBody;
+
+ // [Part 11] Default context menu
+ // - To append to this menu: you can call TableBeginContextMenuPopup()/.../EndPopup().
+ // - To modify or replace this: set table->IsContextPopupNoDefaultContents = true, then call TableBeginContextMenuPopup()/.../EndPopup().
+ // - You may call TableDrawDefaultContextMenu() with selected flags to display specific sections of the default menu,
+ // e.g. TableDrawDefaultContextMenu(table, table->Flags & ~ImGuiTableFlags_Hideable) will display everything EXCEPT columns visibility options.
+ if (table->DisableDefaultContextMenu == false && TableBeginContextMenuPopup(table))
{
- TableDrawContextMenu(table);
+ TableDrawDefaultContextMenu(table, table->Flags);
EndPopup();
}
- // [Part 13] Sanitize and build sort specs before we have a change to use them for display.
+ // [Part 12] Sanitize and build sort specs before we have a chance to use them for display.
// This path will only be exercised when sort specs are modified before header rows (e.g. init or visibility change)
if (table->IsSortSpecsDirty && (table->Flags & ImGuiTableFlags_Sortable))
TableSortSpecsBuild(table);
+ // [Part 13] Setup inner window decoration size (for scrolling / nav tracking to properly take account of frozen rows/columns)
+ if (table->FreezeColumnsRequest > 0)
+ table->InnerWindow->DecoInnerSizeX1 = table->Columns[table->DisplayOrderToIndex[table->FreezeColumnsRequest - 1]].MaxX - table->OuterRect.Min.x;
+ if (table->FreezeRowsRequest > 0)
+ table->InnerWindow->DecoInnerSizeY1 = table_instance->LastFrozenHeight;
+ table_instance->LastFrozenHeight = 0.0f;
+
// Initial state
ImGuiWindow* inner_window = table->InnerWindow;
if (table->Flags & ImGuiTableFlags_NoClip)
table->DrawSplitter->SetCurrentChannel(inner_window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP);
else
- inner_window->DrawList->PushClipRect(inner_window->ClipRect.Min, inner_window->ClipRect.Max, false);
+ inner_window->DrawList->PushClipRect(inner_window->InnerClipRect.Min, inner_window->InnerClipRect.Max, false); // FIXME: use table->InnerClipRect?
}
// Process hit-testing on resizing borders. Actual size change will be applied in EndTable()
-// - Set table->HoveredColumnBorder with a short delay/timer to reduce feedback noise
-// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize widgets
-// overlapping the same area.
+// - Set table->HoveredColumnBorder with a short delay/timer to reduce visual feedback noise.
void ImGui::TableUpdateBorders(ImGuiTable* table)
{
ImGuiContext& g = *GImGui;
@@ -1146,14 +1291,14 @@ void ImGui::TableUpdateBorders(ImGuiTable* table)
// really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height).
// Actual columns highlight/render will be performed in EndTable() and not be affected.
ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
- const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS;
- const float hit_y1 = table->OuterRect.Min.y;
- const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight);
- const float hit_y2_head = hit_y1 + table_instance->LastFirstRowHeight;
+ const float hit_half_width = ImTrunc(TABLE_RESIZE_SEPARATOR_HALF_THICKNESS * g.CurrentDpiScale);
+ const float hit_y1 = (table->FreezeRowsCount >= 1 ? table->OuterRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight;
+ const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight - table->AngledHeadersHeight);
+ const float hit_y2_head = hit_y1 + table_instance->LastTopHeadersRowHeight;
for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{
- if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)))
+ if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n))
continue;
const int column_n = table->DisplayOrderToIndex[order_n];
@@ -1175,12 +1320,12 @@ void ImGui::TableUpdateBorders(ImGuiTable* table)
//GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100));
bool hovered = false, held = false;
- bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus);
+ bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus);
if (pressed && IsMouseDoubleClicked(0))
{
TableSetColumnWidthAutoSingle(table, column_n);
ClearActiveID();
- held = hovered = false;
+ held = false;
}
if (held)
{
@@ -1201,7 +1346,11 @@ void ImGui::EndTable()
{
ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable;
- IM_ASSERT(table != NULL && "Only call EndTable() if BeginTable() returns true!");
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "EndTable() call should only be done while in BeginTable() scope!");
+ return;
+ }
// This assert would be very useful to catch a common error... unfortunately it would probably trigger in some
// cases, and for consistency user may sometimes output empty tables (and still benefit from e.g. outer border)
@@ -1243,7 +1392,7 @@ void ImGui::EndTable()
// Setup inner scrolling range
// FIXME: This ideally should be done earlier, in BeginTable() SetNextWindowContentSize call, just like writing to inner_window->DC.CursorMaxPos.y,
- // but since the later is likely to be impossible to do we'd rather update both axises together.
+ // but since the later is likely to be impossible to do we'd rather update both axes together.
if (table->Flags & ImGuiTableFlags_ScrollX)
{
const float outer_padding_for_border = (table->Flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f;
@@ -1252,7 +1401,7 @@ void ImGui::EndTable()
max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border);
if (table->ResizedColumn != -1)
max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2);
- table->InnerWindow->DC.CursorMaxPos.x = max_pos_x;
+ table->InnerWindow->DC.CursorMaxPos.x = max_pos_x + table->TempData->AngledHeadersExtraWidth;
}
// Pop clipping rect
@@ -1289,7 +1438,7 @@ void ImGui::EndTable()
float auto_fit_width_for_stretched = 0.0f;
float auto_fit_width_for_stretched_min = 0.0f;
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
- if (table->EnabledMaskByIndex & ((ImU64)1 << column_n))
+ if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n))
{
ImGuiTableColumn* column = &table->Columns[column_n];
float column_width_request = ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !(column->Flags & ImGuiTableColumnFlags_NoResize)) ? column->WidthRequest : TableGetColumnWidthAuto(table, column);
@@ -1323,14 +1472,18 @@ void ImGui::EndTable()
if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted)
{
ImGuiTableColumn* column = &table->Columns[table->ResizedColumn];
- const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS);
- const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f);
+ const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + ImTrunc(TABLE_RESIZE_SEPARATOR_HALF_THICKNESS * g.CurrentDpiScale));
+ const float new_width = ImTrunc(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f);
table->ResizedColumnNextWidth = new_width;
}
+ table->IsActiveIdInTable = (g.ActiveIdIsAlive != 0 && table->IsActiveIdAliveBeforeTable == false);
+
// Pop from id stack
- IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table->ID + table->InstanceCurrent, "Mismatching PushID/PopID!");
+ IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table_instance->TableInstanceID, "Mismatching PushID/PopID!");
IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= temp_data->HostBackupItemWidthStackSize, "Too many PopItemWidth!");
+ if (table->InstanceCurrent > 0)
+ PopID();
PopID();
// Restore window data that we modified
@@ -1348,7 +1501,12 @@ void ImGui::EndTable()
// CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414)
if (inner_window != outer_window)
{
+ short backup_nav_layers_active_mask = inner_window->DC.NavLayersActiveMask;
+ inner_window->DC.NavLayersActiveMask |= 1 << table->NavLayer; // So empty table don't appear to navigate differently.
+ g.CurrentTable = NULL; // To avoid error recovery recursing
EndChild();
+ g.CurrentTable = table;
+ inner_window->DC.NavLayersActiveMask = backup_nav_layers_active_mask;
}
else
{
@@ -1366,9 +1524,13 @@ void ImGui::EndTable()
}
else if (temp_data->UserOuterSize.x <= 0.0f)
{
- const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f;
- outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - temp_data->UserOuterSize.x);
- outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth));
+ // Some references for this: #7651 + tests "table_reported_size", "table_reported_size_outer" equivalent Y block
+ // - Checking for ImGuiTableFlags_ScrollX/ScrollY flag makes us a frame ahead when disabling those flags.
+ // - FIXME-TABLE: Would make sense to pre-compute expected scrollbar visibility/sizes to generally save a frame of feedback.
+ const float inner_content_max_x = table->OuterRect.Min.x + table->ColumnsAutoFitWidth; // Slightly misleading name but used for code symmetry with inner_content_max_y
+ const float decoration_size = table->TempData->AngledHeadersExtraWidth + ((table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.x : 0.0f);
+ outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, inner_content_max_x + decoration_size - temp_data->UserOuterSize.x);
+ outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, inner_content_max_x + decoration_size));
}
else
{
@@ -1376,9 +1538,9 @@ void ImGui::EndTable()
}
if (temp_data->UserOuterSize.y <= 0.0f)
{
- const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.y : 0.0f;
+ const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.y : 0.0f;
outer_window->DC.IdealMaxPos.y = ImMax(outer_window->DC.IdealMaxPos.y, inner_content_max_y + decoration_size - temp_data->UserOuterSize.y);
- outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y));
+ outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y + decoration_size));
}
else
{
@@ -1402,16 +1564,46 @@ void ImGui::EndTable()
g.CurrentTable->DrawSplitter = &temp_data->DrawSplitter;
}
outer_window->DC.CurrentTableIdx = g.CurrentTable ? g.Tables.GetIndex(g.CurrentTable) : -1;
+ NavUpdateCurrentWindowIsScrollPushableX();
+}
+
+// Called in TableSetupColumn() when initializing and in TableLoadSettings() for defaults before applying stored settings.
+// 'init_mask' specify which fields to initialize.
+static void TableInitColumnDefaults(ImGuiTable* table, ImGuiTableColumn* column, ImGuiTableColumnFlags init_mask)
+{
+ ImGuiTableColumnFlags flags = column->Flags;
+ if (init_mask & ImGuiTableFlags_Resizable)
+ {
+ float init_width_or_weight = column->InitStretchWeightOrWidth;
+ column->WidthRequest = ((flags & ImGuiTableColumnFlags_WidthFixed) && init_width_or_weight > 0.0f) ? init_width_or_weight : -1.0f;
+ column->StretchWeight = (init_width_or_weight > 0.0f && (flags & ImGuiTableColumnFlags_WidthStretch)) ? init_width_or_weight : -1.0f;
+ if (init_width_or_weight > 0.0f) // Disable auto-fit if an explicit width/weight has been specified
+ column->AutoFitQueue = 0x00;
+ }
+ if (init_mask & ImGuiTableFlags_Reorderable)
+ column->DisplayOrder = (ImGuiTableColumnIdx)table->Columns.index_from_ptr(column);
+ if (init_mask & ImGuiTableFlags_Hideable)
+ column->IsUserEnabled = column->IsUserEnabledNextFrame = (flags & ImGuiTableColumnFlags_DefaultHide) ? 0 : 1;
+ if (init_mask & ImGuiTableFlags_Sortable)
+ {
+ // Multiple columns using _DefaultSort will be reassigned unique SortOrder values when building the sort specs.
+ column->SortOrder = (flags & ImGuiTableColumnFlags_DefaultSort) ? 0 : -1;
+ column->SortDirection = (flags & ImGuiTableColumnFlags_DefaultSort) ? ((flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImU8)(ImGuiSortDirection_Ascending)) : (ImS8)ImGuiSortDirection_None;
+ }
}
-// See "COLUMN SIZING POLICIES" comments at the top of this file
+// See "COLUMNS SIZING POLICIES" comments at the top of this file
// If (init_width_or_weight <= 0.0f) it is ignored
void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id)
{
ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable;
- IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!");
- IM_ASSERT(table->IsLayoutLocked == false && "Need to call call TableSetupColumn() before first row!");
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "Call should only be done while in BeginTable() scope!");
+ return;
+ }
+ IM_ASSERT(table->IsLayoutLocked == false && "Need to call TableSetupColumn() before first row!");
IM_ASSERT((flags & ImGuiTableColumnFlags_StatusMask_) == 0 && "Illegal to pass StatusMask values to TableSetupColumn()");
if (table->DeclColumnsCount >= table->ColumnsCount)
{
@@ -1428,10 +1620,15 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo
IM_ASSERT(init_width_or_weight <= 0.0f && "Can only specify width/weight if sizing policy is set explicitly in either Table or Column.");
// When passing a width automatically enforce WidthFixed policy
- // (whereas TableSetupColumnFlags would default to WidthAuto if table is not Resizable)
+ // (whereas TableSetupColumnFlags would default to WidthAuto if table is not resizable)
if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f)
if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame)
flags |= ImGuiTableColumnFlags_WidthFixed;
+ if (flags & ImGuiTableColumnFlags_AngledHeader)
+ {
+ flags |= ImGuiTableColumnFlags_NoHeaderLabel;
+ table->AngledHeadersCount++;
+ }
TableSetupColumnFlags(table, column, flags);
column->UserID = user_id;
@@ -1441,35 +1638,19 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo
column->InitStretchWeightOrWidth = init_width_or_weight;
if (table->IsInitializing)
{
- // Init width or weight
+ ImGuiTableFlags init_flags = ~table->SettingsLoadedFlags;
if (column->WidthRequest < 0.0f && column->StretchWeight < 0.0f)
- {
- if ((flags & ImGuiTableColumnFlags_WidthFixed) && init_width_or_weight > 0.0f)
- column->WidthRequest = init_width_or_weight;
- if (flags & ImGuiTableColumnFlags_WidthStretch)
- column->StretchWeight = (init_width_or_weight > 0.0f) ? init_width_or_weight : -1.0f;
-
- // Disable auto-fit if an explicit width/weight has been specified
- if (init_width_or_weight > 0.0f)
- column->AutoFitQueue = 0x00;
- }
-
- // Init default visibility/sort state
- if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0)
- column->IsUserEnabled = column->IsUserEnabledNextFrame = false;
- if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0)
- {
- column->SortOrder = 0; // Multiple columns using _DefaultSort will be reassigned unique SortOrder values when building the sort specs.
- column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImU8)(ImGuiSortDirection_Ascending);
- }
+ init_flags |= ImGuiTableFlags_Resizable;
+ TableInitColumnDefaults(table, column, init_flags);
}
// Store name (append with zero-terminator in contiguous buffer)
+ // FIXME: If we recorded the number of \n in names we could compute header row height
column->NameOffset = -1;
if (label != NULL && label[0] != 0)
{
column->NameOffset = (ImS16)table->ColumnsNames.size();
- table->ColumnsNames.append(label, label + strlen(label) + 1);
+ table->ColumnsNames.append(label, label + ImStrlen(label) + 1);
}
}
@@ -1478,7 +1659,11 @@ void ImGui::TableSetupScrollFreeze(int columns, int rows)
{
ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable;
- IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!");
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "Call should only be done while in BeginTable() scope!");
+ return;
+ }
IM_ASSERT(table->IsLayoutLocked == false && "Need to call TableSetupColumn() before first row!");
IM_ASSERT(columns >= 0 && columns < IMGUI_TABLE_MAX_COLUMNS);
IM_ASSERT(rows >= 0 && rows < 128); // Arbitrary limit
@@ -1513,6 +1698,7 @@ void ImGui::TableSetupScrollFreeze(int columns, int rows)
// - TableGetCellBgRect() [Internal]
// - TableGetColumnResizeID() [Internal]
// - TableGetHoveredColumn() [Internal]
+// - TableGetHoveredRow() [Internal]
// - TableSetBgColor()
//-----------------------------------------------------------------------------
@@ -1554,9 +1740,11 @@ void ImGui::TableSetColumnEnabled(int column_n, bool enabled)
{
ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable;
- IM_ASSERT(table != NULL);
- if (!table)
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "Call should only be done while in BeginTable() scope!");
return;
+ }
IM_ASSERT(table->Flags & ImGuiTableFlags_Hideable); // See comments above
if (column_n < 0)
column_n = table->CurrentColumn;
@@ -1600,14 +1788,14 @@ ImRect ImGui::TableGetCellBgRect(const ImGuiTable* table, int column_n)
}
// Return the resizing ID for the right-side of the given column.
-ImGuiID ImGui::TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no)
+ImGuiID ImGui::TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no)
{
IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount);
- ImGuiID id = table->ID + 1 + (instance_no * table->ColumnsCount) + column_n;
- return id;
+ ImGuiID instance_id = TableGetInstanceID(table, instance_no);
+ return instance_id + 1 + column_n; // FIXME: #6140: still not ideal
}
-// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
+// Return -1 when table is not hovered. return columns_count if hovering the unused space at the right of the right-most visible column.
int ImGui::TableGetHoveredColumn()
{
ImGuiContext& g = *GImGui;
@@ -1617,6 +1805,19 @@ int ImGui::TableGetHoveredColumn()
return (int)table->HoveredColumnBody;
}
+// Return -1 when table is not hovered. Return maxrow+1 if in table but below last submitted row.
+// *IMPORTANT* Unlike TableGetHoveredColumn(), this has a one frame latency in updating the value.
+// This difference with is the reason why this is not public yet.
+int ImGui::TableGetHoveredRow()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiTable* table = g.CurrentTable;
+ if (!table)
+ return -1;
+ ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
+ return (int)table_instance->HoveredRowLast;
+}
+
void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n)
{
ImGuiContext& g = *GImGui;
@@ -1635,7 +1836,7 @@ void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n
return;
if (column_n == -1)
column_n = table->CurrentColumn;
- if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0)
+ if (!IM_BITARRAY_TESTBIT(table->VisibleMaskByIndex, column_n))
return;
if (table->RowCellDataCurrent < 0 || table->RowCellData[table->RowCellDataCurrent].Column != column_n)
table->RowCellDataCurrent++;
@@ -1691,19 +1892,20 @@ void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height)
table->LastRowFlags = table->RowFlags;
table->RowFlags = row_flags;
+ table->RowCellPaddingY = g.Style.CellPadding.y;
table->RowMinHeight = row_min_height;
TableBeginRow(table);
// We honor min_row_height requested by user, but cannot guarantee per-row maximum height,
// because that would essentially require a unique clipping rectangle per-cell.
- table->RowPosY2 += table->CellPaddingY * 2.0f;
+ table->RowPosY2 += table->RowCellPaddingY * 2.0f;
table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height);
// Disable output until user calls TableNextColumn()
table->InnerWindow->SkipItems = true;
}
-// [Internal] Called by TableNextRow()
+// [Internal] Only called by TableNextRow()
void ImGui::TableBeginRow(ImGuiTable* table)
{
ImGuiWindow* window = table->InnerWindow;
@@ -1724,8 +1926,10 @@ void ImGui::TableBeginRow(ImGuiTable* table)
table->RowPosY1 = table->RowPosY2 = next_y1;
table->RowTextBaseline = 0.0f;
table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent
+
window->DC.PrevLineTextBaseOffset = 0.0f;
- window->DC.CurrLineSize = ImVec2(0.0f, 0.0f);
+ window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x, window->DC.CursorPos.y + table->RowCellPaddingY); // This allows users to call SameLine() to share LineSize between columns.
+ window->DC.PrevLineSize = window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); // This allows users to call SameLine() to share LineSize between columns, and to call it from first column too.
window->DC.IsSameLine = window->DC.IsSetPos = false;
window->DC.CursorMaxPos.y = next_y1;
@@ -1762,12 +1966,17 @@ void ImGui::TableEndRow(ImGuiTable* table)
const float bg_y2 = table->RowPosY2;
const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount);
const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest);
- if (table->CurrentRow == 0)
- TableGetInstanceData(table, table->InstanceCurrent)->LastFirstRowHeight = bg_y2 - bg_y1;
+ ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
+ if ((table->RowFlags & ImGuiTableRowFlags_Headers) && (table->CurrentRow == 0 || (table->LastRowFlags & ImGuiTableRowFlags_Headers)))
+ table_instance->LastTopHeadersRowHeight += bg_y2 - bg_y1;
const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y);
if (is_visible)
{
+ // Update data for TableGetHoveredRow()
+ if (table->HoveredColumnBody != -1 && g.IO.MousePos.y >= bg_y1 && g.IO.MousePos.y < bg_y2 && table_instance->HoveredRowNext < 0)
+ table_instance->HoveredRowNext = table->CurrentRow;
+
// Decide of background color for the row
ImU32 bg_col0 = 0;
ImU32 bg_col1 = 0;
@@ -1779,15 +1988,14 @@ void ImGui::TableEndRow(ImGuiTable* table)
bg_col1 = table->RowBgColor[1];
// Decide of top border color
- ImU32 border_col = 0;
+ ImU32 top_border_col = 0;
const float border_size = TABLE_BORDER_SIZE;
- if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow)
- if (table->Flags & ImGuiTableFlags_BordersInnerH)
- border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight;
+ if (table->CurrentRow > 0 && (table->Flags & ImGuiTableFlags_BordersInnerH))
+ top_border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight;
const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0;
const bool draw_strong_bottom_border = unfreeze_rows_actual;
- if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color)
+ if ((bg_col0 | bg_col1 | top_border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color)
{
// In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is
// always followed by a change of clipping rectangle we perform the smallest overwrite possible here.
@@ -1821,13 +2029,14 @@ void ImGui::TableEndRow(ImGuiTable* table)
cell_bg_rect.ClipWith(table->BgClipRect);
cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped when scrolling
cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX);
- window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor);
+ if (cell_bg_rect.Min.y < cell_bg_rect.Max.y)
+ window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor);
}
}
// Draw top border
- if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y)
- window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size);
+ if (top_border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y)
+ window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), top_border_col, border_size);
// Draw bottom border at the row unfreezing mark (always strong)
if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y)
@@ -1838,36 +2047,37 @@ void ImGui::TableEndRow(ImGuiTable* table)
// We need to do that in TableEndRow() instead of TableBeginRow() so the list clipper can mark end of row and
// get the new cursor position.
if (unfreeze_rows_request)
- for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
- {
- ImGuiTableColumn* column = &table->Columns[column_n];
- column->NavLayerCurrent = (ImS8)((column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main);
- }
- if (unfreeze_rows_actual)
{
- IM_ASSERT(table->IsUnfrozenRows == false);
- table->IsUnfrozenRows = true;
-
- // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect
- float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y);
- table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y);
- table->BgClipRect.Max.y = table->Bg2ClipRectForDrawCmd.Max.y = window->InnerClipRect.Max.y;
- table->Bg2DrawChannelCurrent = table->Bg2DrawChannelUnfrozen;
- IM_ASSERT(table->Bg2ClipRectForDrawCmd.Min.y <= table->Bg2ClipRectForDrawCmd.Max.y);
-
- float row_height = table->RowPosY2 - table->RowPosY1;
- table->RowPosY2 = window->DC.CursorPos.y = table->WorkRect.Min.y + table->RowPosY2 - table->OuterRect.Min.y;
- table->RowPosY1 = table->RowPosY2 - row_height;
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
+ table->Columns[column_n].NavLayerCurrent = table->NavLayer;
+ const float y0 = ImMax(table->RowPosY2 + 1, table->InnerClipRect.Min.y);
+ table_instance->LastFrozenHeight = y0 - table->OuterRect.Min.y;
+
+ if (unfreeze_rows_actual)
{
- ImGuiTableColumn* column = &table->Columns[column_n];
- column->DrawChannelCurrent = column->DrawChannelUnfrozen;
- column->ClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y;
- }
+ IM_ASSERT(table->IsUnfrozenRows == false);
+ table->IsUnfrozenRows = true;
+
+ // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect
+ table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, table->InnerClipRect.Max.y);
+ table->BgClipRect.Max.y = table->Bg2ClipRectForDrawCmd.Max.y = table->InnerClipRect.Max.y;
+ table->Bg2DrawChannelCurrent = table->Bg2DrawChannelUnfrozen;
+ IM_ASSERT(table->Bg2ClipRectForDrawCmd.Min.y <= table->Bg2ClipRectForDrawCmd.Max.y);
+
+ float row_height = table->RowPosY2 - table->RowPosY1;
+ table->RowPosY2 = window->DC.CursorPos.y = table->WorkRect.Min.y + table->RowPosY2 - table->OuterRect.Min.y;
+ table->RowPosY1 = table->RowPosY2 - row_height;
+ for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
+ {
+ ImGuiTableColumn* column = &table->Columns[column_n];
+ column->DrawChannelCurrent = column->DrawChannelUnfrozen;
+ column->ClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y;
+ }
- // Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y
- SetWindowClipRectBeforeSetChannel(window, table->Columns[0].ClipRect);
- table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Columns[0].DrawChannelCurrent);
+ // Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y
+ SetWindowClipRectBeforeSetChannel(window, table->Columns[0].ClipRect);
+ table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Columns[0].DrawChannelCurrent);
+ }
}
if (!(table->RowFlags & ImGuiTableRowFlags_Headers))
@@ -1906,13 +2116,17 @@ bool ImGui::TableSetColumnIndex(int column_n)
{
if (table->CurrentColumn != -1)
TableEndCell(table);
- IM_ASSERT(column_n >= 0 && table->ColumnsCount);
+ if ((column_n >= 0 && column_n < table->ColumnsCount) == false)
+ {
+ IM_ASSERT_USER_ERROR(column_n >= 0 && column_n < table->ColumnsCount, "TableSetColumnIndex() invalid column index!");
+ return false;
+ }
TableBeginCell(table, column_n);
}
// Return whether the column is visible. User may choose to skip submitting items based on this return value,
// however they shouldn't skip submitting for columns that may have the tallest contribution to row height.
- return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0;
+ return table->Columns[column_n].IsRequestOutput;
}
// [Public] Append into the next column, wrap and create a new row when already on last column
@@ -1937,8 +2151,7 @@ bool ImGui::TableNextColumn()
// Return whether the column is visible. User may choose to skip submitting items based on this return value,
// however they shouldn't skip submitting for columns that may have the tallest contribution to row height.
- int column_n = table->CurrentColumn;
- return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0;
+ return table->Columns[table->CurrentColumn].IsRequestOutput;
}
@@ -1947,6 +2160,7 @@ bool ImGui::TableNextColumn()
// FIXME-TABLE FIXME-OPT: Could probably shortcut some things for non-active or clipped columns.
void ImGui::TableBeginCell(ImGuiTable* table, int column_n)
{
+ ImGuiContext& g = *GImGui;
ImGuiTableColumn* column = &table->Columns[column_n];
ImGuiWindow* window = table->InnerWindow;
table->CurrentColumn = column_n;
@@ -1957,25 +2171,22 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n)
start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row.
window->DC.CursorPos.x = start_x;
- window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY;
+ window->DC.CursorPos.y = table->RowPosY1 + table->RowCellPaddingY;
window->DC.CursorMaxPos.x = window->DC.CursorPos.x;
window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT
+ window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x; // PrevLine.y is preserved. This allows users to call SameLine() to share LineSize between columns.
window->DC.CurrLineTextBaseOffset = table->RowTextBaseline;
window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent;
+ // Note how WorkRect.Max.y is only set once during layout
window->WorkRect.Min.y = window->DC.CursorPos.y;
window->WorkRect.Min.x = column->WorkMinX;
window->WorkRect.Max.x = column->WorkMaxX;
window->DC.ItemWidth = column->ItemWidth;
- // To allow ImGuiListClipper to function we propagate our row height
- if (!column->IsEnabled)
- window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2);
-
window->SkipItems = column->IsSkipItems;
if (column->IsSkipItems)
{
- ImGuiContext& g = *GImGui;
g.LastItemData.ID = 0;
g.LastItemData.StatusFlags = 0;
}
@@ -1994,7 +2205,6 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n)
}
// Logging
- ImGuiContext& g = *GImGui;
if (g.LogEnabled && !column->IsSkipItems)
{
LogRenderedText(&window->DC.CursorPos, "|");
@@ -2018,7 +2228,8 @@ void ImGui::TableEndCell(ImGuiTable* table)
else
p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen;
*p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x);
- table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY);
+ if (column->IsEnabled)
+ table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->RowCellPaddingY);
column->ItemWidth = window->DC.ItemWidth;
// Propagate text baseline for the entire row
@@ -2036,9 +2247,11 @@ void ImGui::TableEndCell(ImGuiTable* table)
// - TableSetColumnWidthAutoAll() [Internal]
// - TableUpdateColumnsWeightFromWidth() [Internal]
//-------------------------------------------------------------------------
+// Note that actual columns widths are computed in TableUpdateLayout().
+//-------------------------------------------------------------------------
-// Maximum column content width given current layout. Use column->MinX so this value on a per-column basis.
-float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n)
+// Maximum column content width given current layout. Use column->MinX so this value differs on a per-column basis.
+float ImGui::TableCalcMaxColumnWidth(const ImGuiTable* table, int column_n)
{
const ImGuiTableColumn* column = &table->Columns[column_n];
float max_width = FLT_MAX;
@@ -2100,7 +2313,7 @@ void ImGui::TableSetColumnWidth(int column_n, float width)
// Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded)
IM_ASSERT(table->MinColumnWidth > 0.0f);
const float min_width = table->MinColumnWidth;
- const float max_width = ImMax(min_width, TableGetMaxColumnWidth(table, column_n));
+ const float max_width = ImMax(min_width, column_0->WidthMax); // Don't use TableCalcMaxColumnWidth() here as it would rely on MinX from last instance (#7933)
column_0_width = ImClamp(column_0_width, min_width, max_width);
if (column_0->WidthGiven == column_0_width || column_0->WidthRequest == column_0_width)
return;
@@ -2113,7 +2326,7 @@ void ImGui::TableSetColumnWidth(int column_n, float width)
// - All stretch: easy.
// - One or more fixed + one stretch: easy.
// - One or more fixed + more than one stretch: tricky.
- // Qt when manual resize is enabled only support a single _trailing_ stretch column.
+ // Qt when manual resize is enabled only supports a single _trailing_ stretch column, we support more cases here.
// When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1.
// FIXME-TABLE: Find a way to rewrite all of this so interactions feel more consistent for the user.
@@ -2196,7 +2409,7 @@ void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table)
{
IM_ASSERT(table->LeftMostStretchedColumn != -1 && table->RightMostStretchedColumn != -1);
- // Measure existing quantity
+ // Measure existing quantities
float visible_weight = 0.0f;
float visible_width = 0.0f;
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
@@ -2228,6 +2441,7 @@ void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table)
// - TablePopBackgroundChannel() [Internal]
// - TableSetupDrawChannels() [Internal]
// - TableMergeDrawChannels() [Internal]
+// - TableGetColumnBorderCol() [Internal]
// - TableDrawBorders() [Internal]
//-------------------------------------------------------------------------
@@ -2278,7 +2492,7 @@ void ImGui::TableSetupDrawChannels(ImGuiTable* table)
const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1;
const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClip) ? 1 : table->ColumnsEnabledCount;
const int channels_for_bg = 1 + 1 * freeze_row_multiplier;
- const int channels_for_dummy = (table->ColumnsEnabledCount < table->ColumnsCount || table->VisibleMaskByIndex != table->EnabledMaskByIndex) ? +1 : 0;
+ const int channels_for_dummy = (table->ColumnsEnabledCount < table->ColumnsCount || (memcmp(table->VisibleMaskByIndex, table->EnabledMaskByIndex, ImBitArrayGetStorageSizeInBytes(table->ColumnsCount)) != 0)) ? +1 : 0;
const int channels_total = channels_for_bg + (channels_for_row * freeze_row_multiplier) + channels_for_dummy;
table->DrawSplitter->Split(table->InnerWindow->DrawList, channels_total);
table->DummyDrawChannel = (ImGuiTableDrawChannelIdx)((channels_for_dummy > 0) ? channels_total - 1 : -1);
@@ -2352,19 +2566,26 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
// Track which groups we are going to attempt to merge, and which channels goes into each group.
struct MergeGroup
{
- ImRect ClipRect;
- int ChannelsCount;
- ImBitArray<IMGUI_TABLE_MAX_DRAW_CHANNELS> ChannelsMask;
-
- MergeGroup() { ChannelsCount = 0; }
+ ImRect ClipRect;
+ int ChannelsCount = 0;
+ ImBitArrayPtr ChannelsMask = NULL;
};
int merge_group_mask = 0x00;
MergeGroup merge_groups[4];
+ // Use a reusable temp buffer for the merge masks as they are dynamically sized.
+ const int max_draw_channels = (4 + table->ColumnsCount * 2);
+ const int size_for_masks_bitarrays_one = (int)ImBitArrayGetStorageSizeInBytes(max_draw_channels);
+ g.TempBuffer.reserve(size_for_masks_bitarrays_one * 5);
+ memset(g.TempBuffer.Data, 0, size_for_masks_bitarrays_one * 5);
+ for (int n = 0; n < IM_ARRAYSIZE(merge_groups); n++)
+ merge_groups[n].ChannelsMask = (ImBitArrayPtr)(void*)(g.TempBuffer.Data + (size_for_masks_bitarrays_one * n));
+ ImBitArrayPtr remaining_mask = (ImBitArrayPtr)(void*)(g.TempBuffer.Data + (size_for_masks_bitarrays_one * 4));
+
// 1. Scan channels and take note of those which can be merged
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{
- if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0)
+ if (!IM_BITARRAY_TESTBIT(table->VisibleMaskByIndex, column_n))
continue;
ImGuiTableColumn* column = &table->Columns[column_n];
@@ -2396,11 +2617,11 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
}
const int merge_group_n = (has_freeze_h && column_n < table->FreezeColumnsCount ? 0 : 1) + (has_freeze_v && merge_group_sub_n == 0 ? 0 : 2);
- IM_ASSERT(channel_no < IMGUI_TABLE_MAX_DRAW_CHANNELS);
+ IM_ASSERT(channel_no < max_draw_channels);
MergeGroup* merge_group = &merge_groups[merge_group_n];
if (merge_group->ChannelsCount == 0)
merge_group->ClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX);
- merge_group->ChannelsMask.SetBit(channel_no);
+ ImBitArraySetBit(merge_group->ChannelsMask, channel_no);
merge_group->ChannelsCount++;
merge_group->ClipRect.Add(src_channel->_CmdBuffer[0].ClipRect);
merge_group_mask |= (1 << merge_group_n);
@@ -2436,9 +2657,8 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
const int LEADING_DRAW_CHANNELS = 2;
g.DrawChannelsTempMergeBuffer.resize(splitter->_Count - LEADING_DRAW_CHANNELS); // Use shared temporary storage so the allocation gets amortized
ImDrawChannel* dst_tmp = g.DrawChannelsTempMergeBuffer.Data;
- ImBitArray<IMGUI_TABLE_MAX_DRAW_CHANNELS> remaining_mask; // We need 132-bit of storage
- remaining_mask.SetBitRange(LEADING_DRAW_CHANNELS, splitter->_Count);
- remaining_mask.ClearBit(table->Bg2DrawChannelUnfrozen);
+ ImBitArraySetBitRange(remaining_mask, LEADING_DRAW_CHANNELS, splitter->_Count);
+ ImBitArrayClearBit(remaining_mask, table->Bg2DrawChannelUnfrozen);
IM_ASSERT(has_freeze_v == false || table->Bg2DrawChannelUnfrozen != TABLE_DRAW_CHANNEL_BG2_FROZEN);
int remaining_count = splitter->_Count - (has_freeze_v ? LEADING_DRAW_CHANNELS + 1 : LEADING_DRAW_CHANNELS);
//ImRect host_rect = (table->InnerWindow == table->OuterWindow) ? table->InnerClipRect : table->HostClipRect;
@@ -2465,20 +2685,18 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
merge_clip_rect.Max.x = ImMax(merge_clip_rect.Max.x, host_rect.Max.x);
if ((merge_group_n & 2) != 0 && (table->Flags & ImGuiTableFlags_NoHostExtendY) == 0)
merge_clip_rect.Max.y = ImMax(merge_clip_rect.Max.y, host_rect.Max.y);
-#if 0
- GetOverlayDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f);
- GetOverlayDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200));
- GetOverlayDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200));
-#endif
+ //GetForegroundDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f); // [DEBUG]
+ //GetForegroundDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200));
+ //GetForegroundDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200));
remaining_count -= merge_group->ChannelsCount;
- for (int n = 0; n < IM_ARRAYSIZE(remaining_mask.Storage); n++)
- remaining_mask.Storage[n] &= ~merge_group->ChannelsMask.Storage[n];
+ for (int n = 0; n < (size_for_masks_bitarrays_one >> 2); n++)
+ remaining_mask[n] &= ~merge_group->ChannelsMask[n];
for (int n = 0; n < splitter->_Count && merge_channels_count != 0; n++)
{
// Copy + overwrite new clip rect
- if (!merge_group->ChannelsMask.TestBit(n))
+ if (!IM_BITARRAY_TESTBIT(merge_group->ChannelsMask, n))
continue;
- merge_group->ChannelsMask.ClearBit(n);
+ IM_BITARRAY_CLEARBIT(merge_group->ChannelsMask, n);
merge_channels_count--;
ImDrawChannel* channel = &splitter->_Channels[n];
@@ -2496,7 +2714,7 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
// Append unmergeable channels that we didn't reorder at the end of the list
for (int n = 0; n < splitter->_Count && remaining_count != 0; n++)
{
- if (!remaining_mask.TestBit(n))
+ if (!IM_BITARRAY_TESTBIT(remaining_mask, n))
continue;
ImDrawChannel* channel = &splitter->_Channels[n];
memcpy(dst_tmp++, channel, sizeof(ImDrawChannel));
@@ -2507,6 +2725,18 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table)
}
}
+static ImU32 TableGetColumnBorderCol(ImGuiTable* table, int order_n, int column_n)
+{
+ const bool is_hovered = (table->HoveredColumnBorder == column_n);
+ const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent);
+ const bool is_frozen_separator = (table->FreezeColumnsCount == order_n + 1);
+ if (is_resized || is_hovered)
+ return ImGui::GetColorU32(is_resized ? ImGuiCol_SeparatorActive : ImGuiCol_SeparatorHovered);
+ if (is_frozen_separator || (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)))
+ return table->BorderColorStrong;
+ return table->BorderColorLight;
+}
+
// FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow)
void ImGui::TableDrawBorders(ImGuiTable* table)
{
@@ -2521,14 +2751,14 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
// Draw inner border and resizing feedback
ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
const float border_size = TABLE_BORDER_SIZE;
- const float draw_y1 = table->InnerRect.Min.y;
+ const float draw_y1 = ImMax(table->InnerRect.Min.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight) + ((table->Flags & ImGuiTableFlags_BordersOuterH) ? 1.0f : 0.0f);
const float draw_y2_body = table->InnerRect.Max.y;
- const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastFirstRowHeight) : draw_y1;
+ const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastTopHeadersRowHeight) : draw_y1;
if (table->Flags & ImGuiTableFlags_BordersInnerV)
{
for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
{
- if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)))
+ if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n))
continue;
const int column_n = table->DisplayOrderToIndex[order_n];
@@ -2549,21 +2779,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
// Draw in outer window so right-most column won't be clipped
// Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling.
- ImU32 col;
- float draw_y2;
- if (is_hovered || is_resized || is_frozen_separator)
- {
- draw_y2 = draw_y2_body;
- col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong;
- }
- else
- {
- draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body;
- col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight;
- }
-
+ float draw_y2 = (is_hovered || is_resized || is_frozen_separator || (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) == 0) ? draw_y2_body : draw_y2_head;
if (draw_y2 > draw_y1)
- inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size);
+ inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), TableGetColumnBorderCol(table, order_n, column_n), border_size);
}
}
@@ -2595,7 +2813,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
}
if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y)
{
- // Draw bottom-most row border
+ // Draw bottom-most row border between it is above outer border.
const float border_y = table->RowPosY2;
if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y)
inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size);
@@ -2616,8 +2834,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table)
//-------------------------------------------------------------------------
// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set)
-// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since
-// last call, or the first time.
+// When 'sort_specs->SpecsDirty == true' you should sort your data. It will be true when sorting specs have
+// changed since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting,
+// else you may wastefully sort your data every frame!
// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()!
ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
{
@@ -2633,14 +2852,13 @@ ImGuiTableSortSpecs* ImGui::TableGetSortSpecs()
TableUpdateLayout(table);
TableSortSpecsBuild(table);
-
return &table->SortSpecs;
}
static inline ImGuiSortDirection TableGetColumnAvailSortDirection(ImGuiTableColumn* column, int n)
{
IM_ASSERT(n < column->SortDirectionsAvailCount);
- return (column->SortDirectionsAvailList >> (n << 1)) & 0x03;
+ return (ImGuiSortDirection)((column->SortDirectionsAvailList >> (n << 1)) & 0x03);
}
// Fix sort direction if currently set on a value which is unavailable (e.g. activating NoSortAscending/NoSortDescending)
@@ -2752,7 +2970,7 @@ void ImGui::TableSortSpecsSanitize(ImGuiTable* table)
}
}
- // Fallback default sort order (if no column had the ImGuiTableColumnFlags_DefaultSort flag)
+ // Fallback default sort order (if no column with the ImGuiTableColumnFlags_DefaultSort flag)
if (sort_order_count == 0 && !(table->Flags & ImGuiTableFlags_SortTristate))
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
{
@@ -2781,6 +2999,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table)
}
// Write output
+ // May be able to move all SortSpecs data from table (48 bytes) to ImGuiTableTempData if we decide to write it back on every BeginTable()
ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data;
if (dirty && sort_specs != NULL)
for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
@@ -2793,7 +3012,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table)
sort_spec->ColumnUserID = column->UserID;
sort_spec->ColumnIndex = (ImGuiTableColumnIdx)column_n;
sort_spec->SortOrder = (ImGuiTableColumnIdx)column->SortOrder;
- sort_spec->SortDirection = column->SortDirection;
+ sort_spec->SortDirection = (ImGuiSortDirection)column->SortDirection;
}
table->SortSpecs.Specs = sort_specs;
@@ -2804,8 +3023,11 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table)
// [SECTION] Tables: Headers
//-------------------------------------------------------------------------
// - TableGetHeaderRowHeight() [Internal]
+// - TableGetHeaderAngledMaxLabelWidth() [Internal]
// - TableHeadersRow()
// - TableHeader()
+// - TableAngledHeadersRow()
+// - TableAngledHeadersRowEx() [Internal]
//-------------------------------------------------------------------------
float ImGui::TableGetHeaderRowHeight()
@@ -2814,38 +3036,54 @@ float ImGui::TableGetHeaderRowHeight()
// Calculate row height, for the unlikely case that some labels may be taller than others.
// If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height.
// In your custom header row you may omit this all together and just call TableNextRow() without a height...
- float row_height = GetTextLineHeight();
- int columns_count = TableGetColumnCount();
- for (int column_n = 0; column_n < columns_count; column_n++)
- {
- ImGuiTableColumnFlags flags = TableGetColumnFlags(column_n);
- if ((flags & ImGuiTableColumnFlags_IsEnabled) && !(flags & ImGuiTableColumnFlags_NoHeaderLabel))
- row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y);
- }
- row_height += GetStyle().CellPadding.y * 2.0f;
- return row_height;
+ ImGuiContext& g = *GImGui;
+ ImGuiTable* table = g.CurrentTable;
+ float row_height = g.FontSize;
+ for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
+ if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n))
+ if ((table->Columns[column_n].Flags & ImGuiTableColumnFlags_NoHeaderLabel) == 0)
+ row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(table, column_n)).y);
+ return row_height + g.Style.CellPadding.y * 2.0f;
+}
+
+float ImGui::TableGetHeaderAngledMaxLabelWidth()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiTable* table = g.CurrentTable;
+ float width = 0.0f;
+ for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
+ if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n))
+ if (table->Columns[column_n].Flags & ImGuiTableColumnFlags_AngledHeader)
+ width = ImMax(width, CalcTextSize(TableGetColumnName(table, column_n), NULL, true).x);
+ return width + g.Style.CellPadding.y * 2.0f; // Swap padding
}
// [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn().
// The intent is that advanced users willing to create customized headers would not need to use this helper
-// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets.
+// and can create their own! For example: TableHeader() may be preceded by Checkbox() or other custom widgets.
// See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this.
-// This code is constructed to not make much use of internal functions, as it is intended to be a template to copy.
+// This code is intentionally written to not make much use of internal functions, to give you better direction
+// if you need to write your own.
// FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public.
void ImGui::TableHeadersRow()
{
ImGuiContext& g = *GImGui;
ImGuiTable* table = g.CurrentTable;
- IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!");
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "Call should only be done while in BeginTable() scope!");
+ return;
+ }
- // Layout if not already done (this is automatically done by TableNextRow, we do it here solely to facilitate stepping in debugger as it is frequent to step in TableUpdateLayout)
+ // Call layout if not already done. This is automatically done by TableNextRow: we do it here _only_ to make
+ // it easier to debug-step in TableUpdateLayout(). Your own version of this function doesn't need this.
if (!table->IsLayoutLocked)
TableUpdateLayout(table);
// Open row
- const float row_y1 = GetCursorScreenPos().y;
const float row_height = TableGetHeaderRowHeight();
TableNextRow(ImGuiTableRowFlags_Headers, row_height);
+ const float row_y1 = GetCursorScreenPos().y;
if (table->HostSkipItems) // Merely an optimization, you may skip in your own code.
return;
@@ -2855,11 +3093,9 @@ void ImGui::TableHeadersRow()
if (!TableSetColumnIndex(column_n))
continue;
- // Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them)
- // - in your own code you may omit the PushID/PopID all-together, provided you know they won't collide
- // - table->InstanceCurrent is only >0 when we use multiple BeginTable/EndTable calls with same identifier.
+ // Push an id to allow empty/unnamed headers. This is also idiomatic as it ensure there is a consistent ID path to access columns (for e.g. automation)
const char* name = (TableGetColumnFlags(column_n) & ImGuiTableColumnFlags_NoHeaderLabel) ? "" : TableGetColumnName(column_n);
- PushID(table->InstanceCurrent * table->ColumnsCount + column_n);
+ PushID(column_n);
TableHeader(name);
PopID();
}
@@ -2868,7 +3104,7 @@ void ImGui::TableHeadersRow()
ImVec2 mouse_pos = ImGui::GetMousePos();
if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count)
if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height)
- TableOpenContextMenu(-1); // Will open a non-column-specific popup.
+ TableOpenContextMenu(columns_count); // Will open a non-column-specific popup.
}
// Emit a column header (text + optional sort order)
@@ -2882,7 +3118,12 @@ void ImGui::TableHeader(const char* label)
return;
ImGuiTable* table = g.CurrentTable;
- IM_ASSERT(table != NULL && "Need to call TableHeader() after BeginTable()!");
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "Call should only be done while in BeginTable() scope!");
+ return;
+ }
+
IM_ASSERT(table->CurrentColumn != -1);
const int column_n = table->CurrentColumn;
ImGuiTableColumn* column = &table->Columns[column_n];
@@ -2897,16 +3138,19 @@ void ImGui::TableHeader(const char* label)
// If we already got a row height, there's use that.
// FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect?
ImRect cell_r = TableGetCellBgRect(table, column_n);
- float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f);
+ float label_height = ImMax(label_size.y, table->RowMinHeight - table->RowCellPaddingY * 2.0f);
// Calculate ideal size for sort order arrow
float w_arrow = 0.0f;
float w_sort_text = 0.0f;
+ bool sort_arrow = false;
char sort_order_suf[4] = "";
const float ARROW_SCALE = 0.65f;
if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort))
{
- w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x);
+ w_arrow = ImTrunc(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x);
+ if (column->SortOrder != -1)
+ sort_arrow = true;
if (column->SortOrder > 0)
{
ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1);
@@ -2914,13 +3158,12 @@ void ImGui::TableHeader(const char* label)
}
}
- // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging.
+ // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considered for merging.
float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow;
- column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX);
+ column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, sort_arrow ? cell_r.Max.x : ImMin(max_pos_x, cell_r.Max.x));
column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x);
// Keep header highlighted when context menu is open.
- const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent);
ImGuiID id = window->GetID(label);
ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f));
ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal
@@ -2930,12 +3173,11 @@ void ImGui::TableHeader(const char* label)
//GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG]
//GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG]
- // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items.
+ // Using AllowOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items.
+ const bool highlight = (table->HighlightColumnHeader == column_n);
bool hovered, held;
- bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap);
- if (g.ActiveId != id)
- SetItemAllowOverlap();
- if (held || hovered || selected)
+ bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowOverlap);
+ if (held || hovered || highlight)
{
const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
//RenderFrame(bb.Min, bb.Max, col, false, 0.0f);
@@ -2947,7 +3189,7 @@ void ImGui::TableHeader(const char* label)
if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0)
TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn);
}
- RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding);
+ RenderNavCursor(bb, id, ImGuiNavRenderCursorFlags_Compact | ImGuiNavRenderCursorFlags_NoRounding);
if (held)
table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n;
window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f;
@@ -2974,7 +3216,7 @@ void ImGui::TableHeader(const char* label)
}
// Sort order arrow
- const float ellipsis_max = cell_r.Max.x - w_arrow - w_sort_text;
+ const float ellipsis_max = ImMax(cell_r.Max.x - w_arrow - w_sort_text, label_pos.x);
if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort))
{
if (column->SortOrder != -1)
@@ -3005,19 +3247,194 @@ void ImGui::TableHeader(const char* label)
RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size);
const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x);
- if (text_clipped && hovered && g.ActiveId == 0 && IsItemHovered(ImGuiHoveredFlags_DelayNormal))
- SetTooltip("%.*s", (int)(label_end - label), label);
+ if (text_clipped && hovered && g.ActiveId == 0)
+ SetItemTooltip("%.*s", (int)(label_end - label), label);
// We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden
if (IsMouseReleased(1) && IsItemHovered())
TableOpenContextMenu(column_n);
}
+// Unlike TableHeadersRow() it is not expected that you can reimplement or customize this with custom widgets.
+// FIXME: No hit-testing/button on the angled header.
+void ImGui::TableAngledHeadersRow()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiTable* table = g.CurrentTable;
+ ImGuiTableTempData* temp_data = table->TempData;
+ temp_data->AngledHeadersRequests.resize(0);
+ temp_data->AngledHeadersRequests.reserve(table->ColumnsEnabledCount);
+
+ // Which column needs highlight?
+ const ImGuiID row_id = GetID("##AngledHeaders");
+ ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
+ int highlight_column_n = table->HighlightColumnHeader;
+ if (highlight_column_n == -1 && table->HoveredColumnBody != -1)
+ if (table_instance->HoveredRowLast == 0 && table->HoveredColumnBorder == -1 && (g.ActiveId == 0 || g.ActiveId == row_id || (table->IsActiveIdInTable || g.DragDropActive)))
+ highlight_column_n = table->HoveredColumnBody;
+
+ // Build up request
+ ImU32 col_header_bg = GetColorU32(ImGuiCol_TableHeaderBg);
+ ImU32 col_text = GetColorU32(ImGuiCol_Text);
+ for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
+ if (IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n))
+ {
+ const int column_n = table->DisplayOrderToIndex[order_n];
+ ImGuiTableColumn* column = &table->Columns[column_n];
+ if ((column->Flags & ImGuiTableColumnFlags_AngledHeader) == 0) // Note: can't rely on ImGuiTableColumnFlags_IsVisible test here.
+ continue;
+ ImGuiTableHeaderData request = { (ImGuiTableColumnIdx)column_n, col_text, col_header_bg, (column_n == highlight_column_n) ? GetColorU32(ImGuiCol_Header) : 0 };
+ temp_data->AngledHeadersRequests.push_back(request);
+ }
+
+ // Render row
+ TableAngledHeadersRowEx(row_id, g.Style.TableAngledHeadersAngle, 0.0f, temp_data->AngledHeadersRequests.Data, temp_data->AngledHeadersRequests.Size);
+}
+
+// Important: data must be fed left to right
+void ImGui::TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiTable* table = g.CurrentTable;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImDrawList* draw_list = window->DrawList;
+ if (table == NULL)
+ {
+ IM_ASSERT_USER_ERROR(table != NULL, "Call should only be done while in BeginTable() scope!");
+ return;
+ }
+ IM_ASSERT(table->CurrentRow == -1 && "Must be first row");
+
+ if (max_label_width == 0.0f)
+ max_label_width = TableGetHeaderAngledMaxLabelWidth();
+
+ // Angle argument expressed in (-IM_PI/2 .. +IM_PI/2) as it is easier to think about for user.
+ const bool flip_label = (angle < 0.0f);
+ angle -= IM_PI * 0.5f;
+ const float cos_a = ImCos(angle);
+ const float sin_a = ImSin(angle);
+ const float label_cos_a = flip_label ? ImCos(angle + IM_PI) : cos_a;
+ const float label_sin_a = flip_label ? ImSin(angle + IM_PI) : sin_a;
+ const ImVec2 unit_right = ImVec2(cos_a, sin_a);
+
+ // Calculate our base metrics and set angled headers data _before_ the first call to TableNextRow()
+ // FIXME-STYLE: Would it be better for user to submit 'max_label_width' or 'row_height' ? One can be derived from the other.
+ const float header_height = g.FontSize + g.Style.CellPadding.x * 2.0f;
+ const float row_height = ImTrunc(ImFabs(ImRotate(ImVec2(max_label_width, flip_label ? +header_height : -header_height), cos_a, sin_a).y));
+ table->AngledHeadersHeight = row_height;
+ table->AngledHeadersSlope = (sin_a != 0.0f) ? (cos_a / sin_a) : 0.0f;
+ const ImVec2 header_angled_vector = unit_right * (row_height / -sin_a); // vector from bottom-left to top-left, and from bottom-right to top-right
+
+ // Declare row, override and draw our own background
+ TableNextRow(ImGuiTableRowFlags_Headers, row_height);
+ TableNextColumn();
+ const ImRect row_r(table->WorkRect.Min.x, table->BgClipRect.Min.y, table->WorkRect.Max.x, table->RowPosY2);
+ table->DrawSplitter->SetCurrentChannel(draw_list, TABLE_DRAW_CHANNEL_BG0);
+ float clip_rect_min_x = table->BgClipRect.Min.x;
+ if (table->FreezeColumnsCount > 0)
+ clip_rect_min_x = ImMax(clip_rect_min_x, table->Columns[table->FreezeColumnsCount - 1].MaxX);
+ TableSetBgColor(ImGuiTableBgTarget_RowBg0, 0); // Cancel
+ PushClipRect(table->BgClipRect.Min, table->BgClipRect.Max, false); // Span all columns
+ draw_list->AddRectFilled(ImVec2(table->BgClipRect.Min.x, row_r.Min.y), ImVec2(table->BgClipRect.Max.x, row_r.Max.y), GetColorU32(ImGuiCol_TableHeaderBg, 0.25f)); // FIXME-STYLE: Change row background with an arbitrary color.
+ PushClipRect(ImVec2(clip_rect_min_x, table->BgClipRect.Min.y), table->BgClipRect.Max, true); // Span all columns
+
+ ButtonBehavior(row_r, row_id, NULL, NULL);
+ KeepAliveID(row_id);
+
+ const float ascent_scaled = g.Font->Ascent * g.FontScale; // FIXME: Standardize those scaling factors better
+ const float line_off_for_ascent_x = (ImMax((g.FontSize - ascent_scaled) * 0.5f, 0.0f) / -sin_a) * (flip_label ? -1.0f : 1.0f);
+ const ImVec2 padding = g.Style.CellPadding; // We will always use swapped component
+ const ImVec2 align = g.Style.TableAngledHeadersTextAlign;
+
+ // Draw background and labels in first pass, then all borders.
+ float max_x = -FLT_MAX;
+ for (int pass = 0; pass < 2; pass++)
+ for (int order_n = 0; order_n < data_count; order_n++)
+ {
+ const ImGuiTableHeaderData* request = &data[order_n];
+ const int column_n = request->Index;
+ ImGuiTableColumn* column = &table->Columns[column_n];
+
+ ImVec2 bg_shape[4];
+ bg_shape[0] = ImVec2(column->MaxX, row_r.Max.y);
+ bg_shape[1] = ImVec2(column->MinX, row_r.Max.y);
+ bg_shape[2] = bg_shape[1] + header_angled_vector;
+ bg_shape[3] = bg_shape[0] + header_angled_vector;
+ if (pass == 0)
+ {
+ // Draw shape
+ draw_list->AddQuadFilled(bg_shape[0], bg_shape[1], bg_shape[2], bg_shape[3], request->BgColor0);
+ draw_list->AddQuadFilled(bg_shape[0], bg_shape[1], bg_shape[2], bg_shape[3], request->BgColor1); // Optional highlight
+ max_x = ImMax(max_x, bg_shape[3].x);
+
+ // Draw label
+ // - First draw at an offset where RenderTextXXX() function won't meddle with applying current ClipRect, then transform to final offset.
+ // - Handle multiple lines manually, as we want each lines to follow on the horizontal border, rather than see a whole block rotated.
+ const char* label_name = TableGetColumnName(table, column_n);
+ const char* label_name_end = FindRenderedTextEnd(label_name);
+ const float line_off_step_x = (g.FontSize / -sin_a);
+ const int label_lines = ImTextCountLines(label_name, label_name_end);
+
+ // Left<>Right alignment
+ float line_off_curr_x = flip_label ? (label_lines - 1) * line_off_step_x : 0.0f;
+ float line_off_for_align_x = ImMax((((column->MaxX - column->MinX) - padding.x * 2.0f) - (label_lines * line_off_step_x)), 0.0f) * align.x;
+ line_off_curr_x += line_off_for_align_x - line_off_for_ascent_x;
+
+ // Register header width
+ column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX + ImCeil(label_lines * line_off_step_x - line_off_for_align_x);
+
+ while (label_name < label_name_end)
+ {
+ const char* label_name_eol = strchr(label_name, '\n');
+ if (label_name_eol == NULL)
+ label_name_eol = label_name_end;
+
+ // FIXME: Individual line clipping for right-most column is broken for negative angles.
+ ImVec2 label_size = CalcTextSize(label_name, label_name_eol);
+ float clip_width = max_label_width - padding.y; // Using padding.y*2.0f would be symmetrical but hide more text.
+ float clip_height = ImMin(label_size.y, column->ClipRect.Max.x - column->WorkMinX - line_off_curr_x);
+ ImRect clip_r(window->ClipRect.Min, window->ClipRect.Min + ImVec2(clip_width, clip_height));
+ int vtx_idx_begin = draw_list->_VtxCurrentIdx;
+ PushStyleColor(ImGuiCol_Text, request->TextColor);
+ RenderTextEllipsis(draw_list, clip_r.Min, clip_r.Max, clip_r.Max.x, clip_r.Max.x, label_name, label_name_eol, &label_size);
+ PopStyleColor();
+ int vtx_idx_end = draw_list->_VtxCurrentIdx;
+
+ // Up<>Down alignment
+ const float available_space = ImMax(clip_width - label_size.x + ImAbs(padding.x * cos_a) * 2.0f - ImAbs(padding.y * sin_a) * 2.0f, 0.0f);
+ const float vertical_offset = available_space * align.y * (flip_label ? -1.0f : 1.0f);
+
+ // Rotate and offset label
+ ImVec2 pivot_in = ImVec2(window->ClipRect.Min.x - vertical_offset, window->ClipRect.Min.y + label_size.y);
+ ImVec2 pivot_out = ImVec2(column->WorkMinX, row_r.Max.y);
+ line_off_curr_x += flip_label ? -line_off_step_x : line_off_step_x;
+ pivot_out += unit_right * padding.y;
+ if (flip_label)
+ pivot_out += unit_right * (clip_width - ImMax(0.0f, clip_width - label_size.x));
+ pivot_out.x += flip_label ? line_off_curr_x + line_off_step_x : line_off_curr_x;
+ ShadeVertsTransformPos(draw_list, vtx_idx_begin, vtx_idx_end, pivot_in, label_cos_a, label_sin_a, pivot_out); // Rotate and offset
+ //if (g.IO.KeyShift) { ImDrawList* fg_dl = GetForegroundDrawList(); vtx_idx_begin = fg_dl->_VtxCurrentIdx; fg_dl->AddRect(clip_r.Min, clip_r.Max, IM_COL32(0, 255, 0, 255), 0.0f, 0, 1.0f); ShadeVertsTransformPos(fg_dl, vtx_idx_begin, fg_dl->_VtxCurrentIdx, pivot_in, label_cos_a, label_sin_a, pivot_out); }
+
+ label_name = label_name_eol + 1;
+ }
+ }
+ if (pass == 1)
+ {
+ // Draw border
+ draw_list->AddLine(bg_shape[0], bg_shape[3], TableGetColumnBorderCol(table, order_n, column_n));
+ }
+ }
+ PopClipRect();
+ PopClipRect();
+ table->TempData->AngledHeadersExtraWidth = ImMax(0.0f, max_x - table->Columns[table->RightMostEnabledColumn].MaxX);
+}
+
//-------------------------------------------------------------------------
// [SECTION] Tables: Context Menu
//-------------------------------------------------------------------------
// - TableOpenContextMenu() [Internal]
-// - TableDrawContextMenu() [Internal]
+// - TableBeginContextMenuPopup() [Internal]
+// - TableDrawDefaultContextMenu() [Internal]
//-------------------------------------------------------------------------
// Use -1 to open menu not specific to a given column.
@@ -3053,7 +3470,13 @@ bool ImGui::TableBeginContextMenuPopup(ImGuiTable* table)
// Output context menu into current window (generally a popup)
// FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data?
-void ImGui::TableDrawContextMenu(ImGuiTable* table)
+// Sections to display are pulled from 'flags_for_section_to_display', which is typically == table->Flags.
+// - ImGuiTableFlags_Resizable -> display Sizing menu items
+// - ImGuiTableFlags_Reorderable -> display "Reset Order"
+////- ImGuiTableFlags_Sortable -> display sorting options (disabled)
+// - ImGuiTableFlags_Hideable -> display columns visibility menu items
+// It means if you have a custom context menus you can call this section and omit some sections, and add your own.
+void ImGui::TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -3065,7 +3488,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL;
// Sizing
- if (table->Flags & ImGuiTableFlags_Resizable)
+ if (flags_for_section_to_display & ImGuiTableFlags_Resizable)
{
if (column != NULL)
{
@@ -3085,7 +3508,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
}
// Ordering
- if (table->Flags & ImGuiTableFlags_Reorderable)
+ if (flags_for_section_to_display & ImGuiTableFlags_Reorderable)
{
if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableResetOrder), NULL, false, !table->IsDefaultDisplayOrder))
table->IsResetDisplayOrderRequest = true;
@@ -3099,7 +3522,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
// Sorting
// (modify TableOpenContextMenu() to add _Sortable flag if enabling this)
#if 0
- if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0)
+ if ((flags_for_section_to_display & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0)
{
if (want_separator)
Separator();
@@ -3114,13 +3537,13 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table)
#endif
// Hiding / Visibility
- if (table->Flags & ImGuiTableFlags_Hideable)
+ if (flags_for_section_to_display & ImGuiTableFlags_Hideable)
{
if (want_separator)
Separator();
want_separator = true;
- PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true);
+ PushItemFlag(ImGuiItemFlags_AutoClosePopups, false);
for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++)
{
ImGuiTableColumn* other_column = &table->Columns[other_column_n];
@@ -3310,6 +3733,14 @@ void ImGui::TableLoadSettings(ImGuiTable* table)
table->SettingsLoadedFlags = settings->SaveFlags;
table->RefScale = settings->RefScale;
+ // Initialize default columns settings
+ for (int column_n = 0; column_n < table->ColumnsCount; column_n++)
+ {
+ ImGuiTableColumn* column = &table->Columns[column_n];
+ TableInitColumnDefaults(table, column, ~0);
+ column->AutoFitQueue = 0x00;
+ }
+
// Serialize ImGuiTableSettings/ImGuiTableColumnSettings into ImGuiTable/ImGuiTableColumn
ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings();
ImU64 display_order_mask = 0;
@@ -3326,14 +3757,12 @@ void ImGui::TableLoadSettings(ImGuiTable* table)
column->StretchWeight = column_settings->WidthOrWeight;
else
column->WidthRequest = column_settings->WidthOrWeight;
- column->AutoFitQueue = 0x00;
}
if (settings->SaveFlags & ImGuiTableFlags_Reorderable)
column->DisplayOrder = column_settings->DisplayOrder;
- else
- column->DisplayOrder = (ImGuiTableColumnIdx)column_n;
display_order_mask |= (ImU64)1 << column->DisplayOrder;
- column->IsUserEnabled = column->IsUserEnabledNextFrame = column_settings->IsEnabled;
+ if ((settings->SaveFlags & ImGuiTableFlags_Hideable) && column_settings->IsEnabled != -1)
+ column->IsUserEnabled = column->IsUserEnabledNextFrame = column_settings->IsEnabled == 1;
column->SortOrder = column_settings->SortOrder;
column->SortDirection = column_settings->SortDirection;
}
@@ -3429,8 +3858,7 @@ static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandle
const bool save_visible = (settings->SaveFlags & ImGuiTableFlags_Hideable) != 0;
const bool save_order = (settings->SaveFlags & ImGuiTableFlags_Reorderable) != 0;
const bool save_sort = (settings->SaveFlags & ImGuiTableFlags_Sortable) != 0;
- if (!save_size && !save_visible && !save_order && !save_sort)
- continue;
+ // We need to save the [Table] entry even if all the bools are false, since this records a table with "default settings".
buf->reserve(buf->size() + 30 + settings->ColumnsCount * 50); // ballpark reserve
buf->appendf("[%s][0x%08X,%d]\n", handler->TypeName, settings->ID, settings->ColumnsCount);
@@ -3444,12 +3872,12 @@ static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandle
if (!save_column)
continue;
buf->appendf("Column %-2d", column_n);
- if (column->UserID != 0) buf->appendf(" UserID=%08X", column->UserID);
- if (save_size && column->IsStretch) buf->appendf(" Weight=%.4f", column->WidthOrWeight);
- if (save_size && !column->IsStretch) buf->appendf(" Width=%d", (int)column->WidthOrWeight);
- if (save_visible) buf->appendf(" Visible=%d", column->IsEnabled);
- if (save_order) buf->appendf(" Order=%d", column->DisplayOrder);
- if (save_sort && column->SortOrder != -1) buf->appendf(" Sort=%d%c", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? 'v' : '^');
+ if (column->UserID != 0) { buf->appendf(" UserID=%08X", column->UserID); }
+ if (save_size && column->IsStretch) { buf->appendf(" Weight=%.4f", column->WidthOrWeight); }
+ if (save_size && !column->IsStretch) { buf->appendf(" Width=%d", (int)column->WidthOrWeight); }
+ if (save_visible) { buf->appendf(" Visible=%d", column->IsEnabled); }
+ if (save_order) { buf->appendf(" Order=%d", column->DisplayOrder); }
+ if (save_sort && column->SortOrder != -1) { buf->appendf(" Sort=%d%c", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? 'v' : '^'); }
buf->append("\n");
}
buf->append("\n");
@@ -3497,7 +3925,7 @@ void ImGui::TableGcCompactTransientBuffers(ImGuiTable* table)
IM_ASSERT(table->MemoryCompacted == false);
table->SortSpecs.Specs = NULL;
table->SortSpecsMulti.clear();
- table->IsSortSpecsDirty = true; // FIXME: shouldn't have to leak into user performing a sort
+ table->IsSortSpecsDirty = true; // FIXME: In theory shouldn't have to leak into user performing a sort on resume.
table->ColumnsNames.clear();
table->MemoryCompacted = true;
for (int n = 0; n < table->ColumnsCount; n++)
@@ -3550,13 +3978,10 @@ static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_poli
void ImGui::DebugNodeTable(ImGuiTable* table)
{
- char buf[512];
- char* p = buf;
- const char* buf_end = buf + IM_ARRAYSIZE(buf);
- const bool is_active = (table->LastFrameActive >= ImGui::GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here.
- ImFormatString(p, buf_end - p, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*");
+ ImGuiContext& g = *GImGui;
+ const bool is_active = (table->LastFrameActive >= g.FrameCount - 2); // Note that fully clipped early out scrolling tables will appear as inactive here.
if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); }
- bool open = TreeNode(table, "%s", buf);
+ bool open = TreeNode(table, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*");
if (!is_active) { PopStyleColor(); }
if (IsItemHovered())
GetForegroundDrawList()->AddRect(table->OuterRect.Min, table->OuterRect.Max, IM_COL32(255, 255, 0, 255));
@@ -3565,13 +3990,25 @@ void ImGui::DebugNodeTable(ImGuiTable* table)
if (!open)
return;
if (table->InstanceCurrent > 0)
- ImGui::Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1);
+ Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1);
+ if (g.IO.ConfigDebugIsDebuggerPresent)
+ {
+ if (DebugBreakButton("**DebugBreak**", "in BeginTable()"))
+ g.DebugBreakInTable = table->ID;
+ SameLine();
+ }
+
bool clear_settings = SmallButton("Clear settings");
BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags));
BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : "");
BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX);
BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder);
BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn);
+ for (int n = 0; n < table->InstanceCurrent + 1; n++)
+ {
+ ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, n);
+ BulletText("Instance %d: HoveredRow: %d, LastOuterHeight: %.2f", n, table_instance->HoveredRowLast, table_instance->LastOuterHeight);
+ }
//BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen);
float sum_weights = 0.0f;
for (int n = 0; n < table->ColumnsCount; n++)
@@ -3581,6 +4018,7 @@ void ImGui::DebugNodeTable(ImGuiTable* table)
{
ImGuiTableColumn* column = &table->Columns[n];
const char* name = TableGetColumnName(table, n);
+ char buf[512];
ImFormatString(buf, IM_ARRAYSIZE(buf),
"Column %d order %d '%s': offset %+.2f to %+.2f%s\n"
"Enabled: %d, VisibleX/Y: %d/%d, RequestOutput: %d, SkipItems: %d, DrawChannels: %d,%d\n"
@@ -3696,7 +4134,7 @@ float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offse
return offset / (columns->OffMaxX - columns->OffMinX);
}
-static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f;
+static const float COLUMNS_HIT_RECT_HALF_THICKNESS = 4.0f;
static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index)
{
@@ -3707,7 +4145,7 @@ static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index)
IM_ASSERT(column_index > 0); // We are not supposed to drag column 0.
IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index));
- float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x;
+ float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + ImTrunc(COLUMNS_HIT_RECT_HALF_THICKNESS * g.CurrentDpiScale) - window->Pos.x;
x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing);
if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths))
x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing);
@@ -3869,6 +4307,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl
columns->Count = columns_count;
columns->Flags = flags;
window->DC.CurrentColumns = columns;
+ window->DC.NavIsScrollPushableX = false; // Shortcut for NavUpdateCurrentWindowIsScrollPushableX();
columns->HostCursorPosY = window->DC.CursorPos.y;
columns->HostCursorMaxPosX = window->DC.CursorMaxPos.x;
@@ -3879,7 +4318,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl
// Set state for first column
// We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect
const float column_padding = g.Style.ItemSpacing.x;
- const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize));
+ const float half_clip_extend_x = ImTrunc(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize));
const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f);
const float max_2 = window->WorkRect.Max.x + half_clip_extend_x;
columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f);
@@ -3926,8 +4365,9 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl
float width = offset_1 - offset_0;
PushItemWidth(width * 0.65f);
window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f);
- window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding;
+ window->WorkRect.Max.y = window->ContentRegionRect.Max.y;
}
void ImGui::NextColumn()
@@ -3941,7 +4381,7 @@ void ImGui::NextColumn()
if (columns->Count == 1)
{
- window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
IM_ASSERT(columns->Current == 0);
return;
}
@@ -3973,7 +4413,7 @@ void ImGui::NextColumn()
window->DC.IsSameLine = false;
columns->LineMinY = columns->LineMaxY;
}
- window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
window->DC.CursorPos.y = columns->LineMinY;
window->DC.CurrLineSize = ImVec2(0.0f, 0.0f);
window->DC.CurrLineTextBaseOffset = 0.0f;
@@ -4020,7 +4460,7 @@ void ImGui::EndColumns()
ImGuiOldColumnData* column = &columns->Columns[n];
float x = window->Pos.x + GetColumnOffset(n);
const ImGuiID column_id = columns->ID + ImGuiID(n);
- const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH;
+ const float column_hit_hw = ImTrunc(COLUMNS_HIT_RECT_HALF_THICKNESS * g.CurrentDpiScale);
const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2));
if (!ItemAdd(column_hit_rect, column_id, NULL, ImGuiItemFlags_NoNav))
continue;
@@ -4030,14 +4470,14 @@ void ImGui::EndColumns()
{
ButtonBehavior(column_hit_rect, column_id, &hovered, &held);
if (hovered || held)
- g.MouseCursor = ImGuiMouseCursor_ResizeEW;
+ SetMouseCursor(ImGuiMouseCursor_ResizeEW);
if (held && !(column->Flags & ImGuiOldColumnFlags_NoResize))
dragging_column = n;
}
// Draw column
const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
- const float xi = IM_FLOOR(x);
+ const float xi = IM_TRUNC(x);
window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col);
}
@@ -4058,15 +4498,16 @@ void ImGui::EndColumns()
window->ParentWorkRect = columns->HostBackupParentWorkRect;
window->DC.CurrentColumns = NULL;
window->DC.ColumnsOffset.x = 0.0f;
- window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ NavUpdateCurrentWindowIsScrollPushableX();
}
-void ImGui::Columns(int columns_count, const char* id, bool border)
+void ImGui::Columns(int columns_count, const char* id, bool borders)
{
ImGuiWindow* window = GetCurrentWindow();
IM_ASSERT(columns_count >= 1);
- ImGuiOldColumnFlags flags = (border ? 0 : ImGuiOldColumnFlags_NoBorder);
+ ImGuiOldColumnFlags flags = (borders ? 0 : ImGuiOldColumnFlags_NoBorder);
//flags |= ImGuiOldColumnFlags_NoPreserveWidths; // NB: Legacy behavior
ImGuiOldColumns* columns = window->DC.CurrentColumns;
if (columns != NULL && columns->Count == columns_count && columns->Flags == flags)
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_widgets.cpp b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_widgets.cpp
index 3b8be01e7d4..7b03b4eb3ea 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/imgui_widgets.cpp
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/imgui_widgets.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.89.1 WIP
+// dear imgui, v1.91b
// (widgets code)
/*
@@ -18,6 +18,10 @@ Index of this file:
// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc.
// [SECTION] Widgets: TreeNode, CollapsingHeader, etc.
// [SECTION] Widgets: Selectable
+// [SECTION] Widgets: Typing-Select support
+// [SECTION] Widgets: Box-Select support
+// [SECTION] Widgets: Multi-Select support
+// [SECTION] Widgets: Multi-Select helpers
// [SECTION] Widgets: ListBox
// [SECTION] Widgets: PlotLines, PlotHistogram
// [SECTION] Widgets: Value helpers
@@ -32,20 +36,16 @@ Index of this file:
#define _CRT_SECURE_NO_WARNINGS
#endif
-#include "imgui.h"
-#ifndef IMGUI_DISABLE
-
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
+
+#include "imgui.h"
+#ifndef IMGUI_DISABLE
#include "imgui_internal.h"
// System includes
-#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
-#include <stddef.h> // intptr_t
-#else
#include <stdint.h> // intptr_t
-#endif
//-------------------------------------------------------------------------
// Warnings
@@ -70,18 +70,28 @@ Index of this file:
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok.
+#pragma clang diagnostic ignored "-Wformat" // warning: format specifies type 'int' but the argument has type 'unsigned int'
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
+#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used.
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_')
#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
+#pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
+#pragma clang diagnostic ignored "-Wswitch-default" // warning: 'switch' missing 'default' label
#elif defined(__GNUC__)
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
+#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'int'/'void*', but argument X has type 'unsigned int'/'ImGuiWindow*'
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
+#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
+#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when simplifying division / ..when changing X +- C1 cmp C2 to X cmp C2 -+ C1
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
#endif
//-------------------------------------------------------------------------
@@ -124,9 +134,9 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
//-------------------------------------------------------------------------
// For InputTextEx()
-static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source);
-static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
-static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
+static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard = false);
+static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
+static ImVec2 InputTextCalcTextSize(ImGuiContext* ctx, const char* text_begin, const char* text_end, const char** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
//-------------------------------------------------------------------------
// [SECTION] Widgets: Text, etc.
@@ -161,7 +171,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
// Calculate length
const char* text_begin = text;
if (text_end == NULL)
- text_end = text + strlen(text); // FIXME-OPT
+ text_end = text + ImStrlen(text); // FIXME-OPT
const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
const float wrap_pos_x = window->DC.TextWrapPos;
@@ -201,7 +211,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
int lines_skipped = 0;
while (line < text_end && lines_skipped < lines_skippable)
{
- const char* line_end = (const char*)memchr(line, '\n', text_end - line);
+ const char* line_end = (const char*)ImMemchr(line, '\n', text_end - line);
if (!line_end)
line_end = text_end;
if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0)
@@ -222,7 +232,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
if (IsClippedEx(line_rect, 0))
break;
- const char* line_end = (const char*)memchr(line, '\n', text_end - line);
+ const char* line_end = (const char*)ImMemchr(line, '\n', text_end - line);
if (!line_end)
line_end = text_end;
text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x);
@@ -237,7 +247,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
int lines_skipped = 0;
while (line < text_end)
{
- const char* line_end = (const char*)memchr(line, '\n', text_end - line);
+ const char* line_end = (const char*)ImMemchr(line, '\n', text_end - line);
if (!line_end)
line_end = text_end;
if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0)
@@ -274,7 +284,6 @@ void ImGui::TextV(const char* fmt, va_list args)
if (window->SkipItems)
return;
- // FIXME-OPT: Handle the %s shortcut?
const char* text, *text_end;
ImFormatStringToTempBufferV(&text, &text_end, fmt, args);
TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText);
@@ -291,10 +300,7 @@ void ImGui::TextColored(const ImVec4& col, const char* fmt, ...)
void ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args)
{
PushStyleColor(ImGuiCol_Text, col);
- if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0)
- TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting
- else
- TextV(fmt, args);
+ TextV(fmt, args);
PopStyleColor();
}
@@ -310,10 +316,7 @@ void ImGui::TextDisabledV(const char* fmt, va_list args)
{
ImGuiContext& g = *GImGui;
PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);
- if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0)
- TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting
- else
- TextV(fmt, args);
+ TextV(fmt, args);
PopStyleColor();
}
@@ -328,13 +331,10 @@ void ImGui::TextWrapped(const char* fmt, ...)
void ImGui::TextWrappedV(const char* fmt, va_list args)
{
ImGuiContext& g = *GImGui;
- bool need_backup = (g.CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set
+ const bool need_backup = (g.CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set
if (need_backup)
PushTextWrapPos(0.0f);
- if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0)
- TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting
- else
- TextV(fmt, args);
+ TextV(fmt, args);
if (need_backup)
PopTextWrapPos();
}
@@ -433,6 +433,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
// - RadioButton()
// - ProgressBar()
// - Bullet()
+// - Hyperlink()
//-------------------------------------------------------------------------
// The ButtonBehavior() function is key to many interactions and used by many/most widgets.
@@ -478,7 +479,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
// - PressedOnDragDropHold can generally be associated with any flag.
// - PressedOnDoubleClick can be associated by PressedOnClickRelease/PressedOnRelease, in which case the second release event won't be reported.
//------------------------------------------------------------------------------------------------------------------------------------------------
-// The behavior of the return-value changes when ImGuiButtonFlags_Repeat is set:
+// The behavior of the return-value changes when ImGuiItemFlags_ButtonRepeat is set:
// Repeat+ Repeat+ Repeat+ Repeat+
// PressedOnClickRelease PressedOnClick PressedOnRelease PressedOnDoubleClick
//-------------------------------------------------------------------------------------------------------------------------------------------------
@@ -489,18 +490,32 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
// Frame N + RepeatDelay + RepeatRate*N true true - true
//-------------------------------------------------------------------------------------------------------------------------------------------------
+// - FIXME: For refactor we could output flags, incl mouse hovered vs nav keyboard vs nav triggered etc.
+// And better standardize how widgets use 'GetColor32((held && hovered) ? ... : hovered ? ...)' vs 'GetColor32(held ? ... : hovered ? ...);'
+// For mouse feedback we typically prefer the 'held && hovered' test, but for nav feedback not always. Outputting hovered=true on Activation may be misleading.
+// - Since v1.91.2 (Sept 2024) we included io.ConfigDebugHighlightIdConflicts feature.
+// One idiom which was previously valid which will now emit a warning is when using multiple overlayed ButtonBehavior()
+// with same ID and different MouseButton (see #8030). You can fix it by:
+// (1) switching to use a single ButtonBehavior() with multiple _MouseButton flags.
+// or (2) surrounding those calls with PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true); ... PopItemFlag()
bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
+ // Default behavior inherited from item flags
+ // Note that _both_ ButtonFlags and ItemFlags are valid sources, so copy one into the item_flags and only check that.
+ ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.ItemFlags : g.CurrentItemFlags);
+ if (flags & ImGuiButtonFlags_AllowOverlap)
+ item_flags |= ImGuiItemFlags_AllowOverlap;
+
// Default only reacts to left mouse button
if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0)
- flags |= ImGuiButtonFlags_MouseButtonDefault_;
+ flags |= ImGuiButtonFlags_MouseButtonLeft;
// Default behavior requires click + release inside bounding box
if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0)
- flags |= ImGuiButtonFlags_PressedOnDefault_;
+ flags |= (item_flags & ImGuiItemFlags_ButtonRepeat) ? ImGuiButtonFlags_PressedOnClick : ImGuiButtonFlags_PressedOnDefault_;
ImGuiWindow* backup_hovered_window = g.HoveredWindow;
const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window;
@@ -508,16 +523,13 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
g.HoveredWindow = window;
#ifdef IMGUI_ENABLE_TEST_ENGINE
- if (id != 0 && g.LastItemData.ID != id)
- IMGUI_TEST_ENGINE_ITEM_ADD(bb, id);
+ // Alternate registration spot, for when caller didn't use ItemAdd()
+ if (g.LastItemData.ID != id)
+ IMGUI_TEST_ENGINE_ITEM_ADD(id, bb, NULL);
#endif
bool pressed = false;
- bool hovered = ItemHoverable(bb, id);
-
- // Drag source doesn't report as hovered
- if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover))
- hovered = false;
+ bool hovered = ItemHoverable(bb, id, item_flags);
// Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button
if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers))
@@ -536,21 +548,28 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
if (flatten_hovered_children)
g.HoveredWindow = backup_hovered_window;
- // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one.
- if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0))
- hovered = false;
-
// Mouse handling
const ImGuiID test_owner_id = (flags & ImGuiButtonFlags_NoTestKeyOwner) ? ImGuiKeyOwner_Any : id;
if (hovered)
{
- if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt))
+ IM_ASSERT(id != 0); // Lazily check inside rare path.
+
+ // Poll mouse buttons
+ // - 'mouse_button_clicked' is generally carried into ActiveIdMouseButton when setting ActiveId.
+ // - Technically we only need some values in one code path, but since this is gated by hovered test this is fine.
+ int mouse_button_clicked = -1;
+ int mouse_button_released = -1;
+ for (int button = 0; button < 3; button++)
+ if (flags & (ImGuiButtonFlags_MouseButtonLeft << button)) // Handle ImGuiButtonFlags_MouseButtonRight and ImGuiButtonFlags_MouseButtonMiddle here.
+ {
+ if (IsMouseClicked(button, ImGuiInputFlags_None, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; }
+ if (IsMouseReleased(button, test_owner_id) && mouse_button_released == -1) { mouse_button_released = button; }
+ }
+
+ // Process initial action
+ const bool mods_ok = !(flags & ImGuiButtonFlags_NoKeyModsAllowed) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt);
+ if (mods_ok)
{
- // Poll buttons
- int mouse_button_clicked = -1;
- if ((flags & ImGuiButtonFlags_MouseButtonLeft) && IsMouseClicked(0, test_owner_id)) { mouse_button_clicked = 0; }
- else if ((flags & ImGuiButtonFlags_MouseButtonRight) && IsMouseClicked(1, test_owner_id)) { mouse_button_clicked = 1; }
- else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && IsMouseClicked(2, test_owner_id)) { mouse_button_clicked = 2; }
if (mouse_button_clicked != -1 && g.ActiveId != id)
{
if (!(flags & ImGuiButtonFlags_NoSetKeyOwner))
@@ -560,8 +579,14 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
SetActiveID(id, window);
g.ActiveIdMouseButton = mouse_button_clicked;
if (!(flags & ImGuiButtonFlags_NoNavFocus))
+ {
SetFocusID(id, window);
- FocusWindow(window);
+ FocusWindow(window);
+ }
+ else
+ {
+ FocusWindow(window, ImGuiFocusRequestFlags_RestoreFocusedChild); // Still need to focus and bring to front, but try to avoid losing NavId when navigating a child
+ }
}
if ((flags & ImGuiButtonFlags_PressedOnClick) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseClickedCount[mouse_button_clicked] == 2))
{
@@ -570,55 +595,58 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
ClearActiveID();
else
SetActiveID(id, window); // Hold on ID
+ g.ActiveIdMouseButton = mouse_button_clicked;
if (!(flags & ImGuiButtonFlags_NoNavFocus))
+ {
SetFocusID(id, window);
- g.ActiveIdMouseButton = mouse_button_clicked;
- FocusWindow(window);
+ FocusWindow(window);
+ }
+ else
+ {
+ FocusWindow(window, ImGuiFocusRequestFlags_RestoreFocusedChild); // Still need to focus and bring to front, but try to avoid losing NavId when navigating a child
+ }
}
}
if (flags & ImGuiButtonFlags_PressedOnRelease)
{
- int mouse_button_released = -1;
- if ((flags & ImGuiButtonFlags_MouseButtonLeft) && IsMouseReleased(0, test_owner_id)) { mouse_button_released = 0; }
- else if ((flags & ImGuiButtonFlags_MouseButtonRight) && IsMouseReleased(1, test_owner_id)) { mouse_button_released = 1; }
- else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && IsMouseReleased(2, test_owner_id)) { mouse_button_released = 2; }
if (mouse_button_released != -1)
{
- const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior
+ const bool has_repeated_at_least_once = (item_flags & ImGuiItemFlags_ButtonRepeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior
if (!has_repeated_at_least_once)
pressed = true;
if (!(flags & ImGuiButtonFlags_NoNavFocus))
- SetFocusID(id, window);
+ SetFocusID(id, window); // FIXME: Lack of FocusWindow() call here is inconsistent with other paths. Research why.
ClearActiveID();
}
}
// 'Repeat' mode acts when held regardless of _PressedOn flags (see table above).
// Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings.
- if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat))
- if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, test_owner_id, ImGuiInputFlags_Repeat))
+ if (g.ActiveId == id && (item_flags & ImGuiItemFlags_ButtonRepeat))
+ if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, ImGuiInputFlags_Repeat, test_owner_id))
pressed = true;
}
- if (pressed)
- g.NavDisableHighlight = true;
+ if (pressed && g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = false;
}
- // Gamepad/Keyboard navigation
- // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse.
- if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId))
+ // Keyboard/Gamepad navigation handling
+ // We report navigated and navigation-activated items as hovered but we don't set g.HoveredId to not interfere with mouse.
+ if (g.NavId == id && g.NavCursorVisible && g.NavHighlightItemUnderNav)
if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus))
hovered = true;
if (g.NavActivateDownId == id)
{
bool nav_activated_by_code = (g.NavActivateId == id);
bool nav_activated_by_inputs = (g.NavActivatePressedId == id);
- if (!nav_activated_by_inputs && (flags & ImGuiButtonFlags_Repeat))
+ if (!nav_activated_by_inputs && (item_flags & ImGuiItemFlags_ButtonRepeat))
{
- // Avoid pressing both keys from triggering double amount of repeat events
+ // Avoid pressing multiple keys from triggering excessive amount of repeat events
const ImGuiKeyData* key1 = GetKeyData(ImGuiKey_Space);
- const ImGuiKeyData* key2 = GetKeyData(ImGuiKey_NavGamepadActivate);
- const float t1 = ImMax(key1->DownDuration, key2->DownDuration);
+ const ImGuiKeyData* key2 = GetKeyData(ImGuiKey_Enter);
+ const ImGuiKeyData* key3 = GetKeyData(ImGuiKey_NavGamepadActivate);
+ const float t1 = ImMax(ImMax(key1->DownDuration, key2->DownDuration), key3->DownDuration);
nav_activated_by_inputs = CalcTypematicRepeatAmount(t1 - g.IO.DeltaTime, t1, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0;
}
if (nav_activated_by_code || nav_activated_by_inputs)
@@ -626,9 +654,11 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
// Set active id so it can be queried by user via IsItemActive(), equivalent of holding the mouse button.
pressed = true;
SetActiveID(id, window);
- g.ActiveIdSource = ImGuiInputSource_Nav;
- if (!(flags & ImGuiButtonFlags_NoNavFocus))
+ g.ActiveIdSource = g.NavInputSource;
+ if (!(flags & ImGuiButtonFlags_NoNavFocus) && !(g.NavActivateFlags & ImGuiActivateFlags_FromShortcut))
SetFocusID(id, window);
+ if (g.NavActivateFlags & ImGuiActivateFlags_FromShortcut)
+ g.ActiveIdFromShortcut = true;
}
}
@@ -642,7 +672,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
g.ActiveIdClickOffset = g.IO.MousePos - bb.Min;
const int mouse_button = g.ActiveIdMouseButton;
- if (IsMouseDown(mouse_button, test_owner_id))
+ if (mouse_button == -1)
+ {
+ // Fallback for the rare situation were g.ActiveId was set programmatically or from another widget (e.g. #6304).
+ ClearActiveID();
+ }
+ else if (IsMouseDown(mouse_button, test_owner_id))
{
held = true;
}
@@ -654,26 +689,32 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
{
// Report as pressed when releasing the mouse (this is the most common path)
bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseReleased[mouse_button] && g.IO.MouseClickedLastCount[mouse_button] == 2;
- bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps <on release>
+ bool is_repeating_already = (item_flags & ImGuiItemFlags_ButtonRepeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps <on release>
bool is_button_avail_or_owned = TestKeyOwner(MouseButtonToKey(mouse_button), test_owner_id);
if (!is_double_click_release && !is_repeating_already && is_button_avail_or_owned)
pressed = true;
}
ClearActiveID();
}
- if (!(flags & ImGuiButtonFlags_NoNavFocus))
- g.NavDisableHighlight = true;
+ if (!(flags & ImGuiButtonFlags_NoNavFocus) && g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = false;
}
- else if (g.ActiveIdSource == ImGuiInputSource_Nav)
+ else if (g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad)
{
// When activated using Nav, we hold on the ActiveID until activation button is released
- if (g.NavActivateDownId != id)
+ if (g.NavActivateDownId == id)
+ held = true; // hovered == true not true as we are already likely hovered on direct activation.
+ else
ClearActiveID();
}
if (pressed)
g.ActiveIdHasBeenPressedBefore = true;
}
+ // Activation highlight (this may be a remote activation)
+ if (g.NavHighlightActivatedId == id)
+ hovered = true;
+
if (out_hovered) *out_hovered = hovered;
if (out_held) *out_held = held;
@@ -701,15 +742,12 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags
if (!ItemAdd(bb, id))
return false;
- if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat)
- flags |= ImGuiButtonFlags_Repeat;
-
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
// Render
const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
- RenderNavHighlight(bb, id);
+ RenderNavCursor(bb, id);
RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding);
if (g.LogEnabled)
@@ -756,11 +794,12 @@ bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg, ImGuiBut
ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f);
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);
ItemSize(size);
- if (!ItemAdd(bb, id))
+ if (!ItemAdd(bb, id, NULL, (flags & ImGuiButtonFlags_EnableNav) ? ImGuiItemFlags_None : ImGuiItemFlags_NoNav))
return false;
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
+ RenderNavCursor(bb, id);
IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags);
return pressed;
@@ -780,16 +819,13 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu
if (!ItemAdd(bb, id))
return false;
- if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat)
- flags |= ImGuiButtonFlags_Repeat;
-
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
// Render
const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
const ImU32 text_col = GetColorU32(ImGuiCol_Text);
- RenderNavHighlight(bb, id);
+ RenderNavCursor(bb, id);
RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding);
RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir);
@@ -811,14 +847,14 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos)
// Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825)
// This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible?
- const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f);
+ const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize));
ImRect bb_interact = bb;
const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea();
if (area_to_visible_ratio < 1.5f)
- bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f));
+ bb_interact.Expand(ImTrunc(bb_interact.GetSize() * -0.25f));
// Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window.
- // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible).
+ // (this isn't the common behavior of buttons, but it doesn't affect the user because navigation tends to keep items visible in scrolling layer).
bool is_clipped = !ItemAdd(bb_interact, id);
bool hovered, held;
@@ -827,17 +863,15 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos)
return pressed;
// Render
- // FIXME: Clarify this mess
- ImU32 col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered);
- ImVec2 center = bb.GetCenter();
+ ImU32 bg_col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered);
if (hovered)
- window->DrawList->AddCircleFilled(center, ImMax(2.0f, g.FontSize * 0.5f + 1.0f), col, 12);
-
- float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f;
+ window->DrawList->AddRectFilled(bb.Min, bb.Max, bg_col);
+ RenderNavCursor(bb, id, ImGuiNavRenderCursorFlags_Compact);
ImU32 cross_col = GetColorU32(ImGuiCol_Text);
- center -= ImVec2(0.5f, 0.5f);
- window->DrawList->AddLine(center + ImVec2(+cross_extent, +cross_extent), center + ImVec2(-cross_extent, -cross_extent), cross_col, 1.0f);
- window->DrawList->AddLine(center + ImVec2(+cross_extent, -cross_extent), center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f);
+ ImVec2 cross_center = bb.GetCenter() - ImVec2(0.5f, 0.5f);
+ float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f;
+ window->DrawList->AddLine(cross_center + ImVec2(+cross_extent, +cross_extent), cross_center + ImVec2(-cross_extent, -cross_extent), cross_col, 1.0f);
+ window->DrawList->AddLine(cross_center + ImVec2(+cross_extent, -cross_extent), cross_center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f);
return pressed;
}
@@ -847,17 +881,20 @@ bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos)
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f);
- ItemAdd(bb, id);
+ ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize));
+ bool is_clipped = !ItemAdd(bb, id);
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None);
+ if (is_clipped)
+ return pressed;
// Render
ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
ImU32 text_col = GetColorU32(ImGuiCol_Text);
if (hovered || held)
- window->DrawList->AddCircleFilled(bb.GetCenter()/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col, 12);
- RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);
+ window->DrawList->AddRectFilled(bb.Min, bb.Max, bg_col);
+ RenderNavCursor(bb, id, ImGuiNavRenderCursorFlags_Compact);
+ RenderArrow(window->DrawList, bb.Min, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);
// Switch to moving the window after mouse is moved beyond the initial drag threshold
if (IsItemActive() && IsMouseDragging(0))
@@ -874,15 +911,17 @@ ImGuiID ImGui::GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis)
// Return scrollbar rectangle, must only be called for corresponding axis if window->ScrollbarX/Y is set.
ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis)
{
+ ImGuiContext& g = *GImGui;
const ImRect outer_rect = window->Rect();
const ImRect inner_rect = window->InnerRect;
- const float border_size = window->WindowBorderSize;
const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar)
- IM_ASSERT(scrollbar_size > 0.0f);
+ IM_ASSERT(scrollbar_size >= 0.0f);
+ const float border_size = IM_ROUND(window->WindowBorderSize * 0.5f);
+ const float border_top = (window->Flags & ImGuiWindowFlags_MenuBar) ? IM_ROUND(g.Style.FrameBorderSize * 0.5f) : 0.0f;
if (axis == ImGuiAxis_X)
- return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y);
+ return ImRect(inner_rect.Min.x + border_size, ImMax(outer_rect.Min.y + border_size, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x - border_size, outer_rect.Max.y - border_size);
else
- return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y);
+ return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y + border_top, outer_rect.Max.x - border_size, inner_rect.Max.y - border_size);
}
void ImGui::Scrollbar(ImGuiAxis axis)
@@ -907,10 +946,10 @@ void ImGui::Scrollbar(ImGuiAxis axis)
if (!window->ScrollbarX)
rounding_corners |= ImDrawFlags_RoundCornersBottomRight;
}
- float size_avail = window->InnerRect.Max[axis] - window->InnerRect.Min[axis];
+ float size_visible = window->InnerRect.Max[axis] - window->InnerRect.Min[axis];
float size_contents = window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f;
ImS64 scroll = (ImS64)window->Scroll[axis];
- ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_avail, (ImS64)size_contents, rounding_corners);
+ ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_visible, (ImS64)size_contents, rounding_corners);
window->Scroll[axis] = (float)scroll;
}
@@ -920,7 +959,7 @@ void ImGui::Scrollbar(ImGuiAxis axis)
// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar
// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal.
// Still, the code should probably be made simpler..
-bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_avail_v, ImS64 size_contents_v, ImDrawFlags flags)
+bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_visible_v, ImS64 size_contents_v, ImDrawFlags draw_rounding_flags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -934,8 +973,8 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
// When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the window resize grab)
float alpha = 1.0f;
- if ((axis == ImGuiAxis_Y) && bb_frame_height < g.FontSize + g.Style.FramePadding.y * 2.0f)
- alpha = ImSaturate((bb_frame_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f));
+ if ((axis == ImGuiAxis_Y) && bb_frame_height < bb_frame_width)
+ alpha = ImSaturate(bb_frame_height / ImMax(bb_frame_width * 2.0f, 1.0f));
if (alpha <= 0.0f)
return false;
@@ -943,16 +982,17 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
const bool allow_interaction = (alpha >= 1.0f);
ImRect bb = bb_frame;
- bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f)));
+ bb.Expand(ImVec2(-ImClamp(IM_TRUNC((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_TRUNC((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f)));
// V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar)
const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight();
// Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount)
// But we maintain a minimum size in pixel to allow for the user to still aim inside.
- IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers.
- const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), (ImS64)1);
- const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_avail_v / (float)win_size_v), style.GrabMinSize, scrollbar_size_v);
+ IM_ASSERT(ImMax(size_contents_v, size_visible_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers.
+ const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_visible_v), (ImS64)1);
+ const float grab_h_minsize = ImMin(bb.GetSize()[axis], style.GrabMinSize);
+ const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_visible_v / (float)win_size_v), grab_h_minsize, scrollbar_size_v);
const float grab_h_norm = grab_h_pixels / scrollbar_size_v;
// Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar().
@@ -961,7 +1001,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
ItemAdd(bb_frame, id, NULL, ImGuiItemFlags_NoNav);
ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus);
- const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_avail_v);
+ const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_visible_v);
float scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max);
float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Grab position in normalized space
if (held && allow_interaction && grab_h_norm < 1.0f)
@@ -971,37 +1011,47 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
// Click position in scrollbar normalized space (0.0f->1.0f)
const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v);
- SetHoveredID(id);
- bool seek_absolute = false;
+ const int held_dir = (clicked_v_norm < grab_v_norm) ? -1 : (clicked_v_norm > grab_v_norm + grab_h_norm) ? +1 : 0;
if (g.ActiveIdIsJustActivated)
{
- // On initial click calculate the distance between mouse and the center of the grab
- seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm);
- if (seek_absolute)
- g.ScrollbarClickDeltaToGrabCenter = 0.0f;
- else
- g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f;
+ // On initial click when held_dir == 0 (clicked over grab): calculate the distance between mouse and the center of the grab
+ const bool scroll_to_clicked_location = (g.IO.ConfigScrollbarScrollByPage == false || g.IO.KeyShift || held_dir == 0);
+ g.ScrollbarSeekMode = scroll_to_clicked_location ? 0 : (short)held_dir;
+ g.ScrollbarClickDeltaToGrabCenter = (held_dir == 0 && !g.IO.KeyShift) ? clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f : 0.0f;
}
// Apply scroll (p_scroll_v will generally point on one member of window->Scroll)
// It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position
- const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm));
- *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max);
+ if (g.ScrollbarSeekMode == 0)
+ {
+ // Absolute seeking
+ const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm));
+ *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max);
+ }
+ else
+ {
+ // Page by page
+ if (IsMouseClicked(ImGuiMouseButton_Left, ImGuiInputFlags_Repeat) && held_dir == g.ScrollbarSeekMode)
+ {
+ float page_dir = (g.ScrollbarSeekMode > 0.0f) ? +1.0f : -1.0f;
+ *p_scroll_v = ImClamp(*p_scroll_v + (ImS64)(page_dir * size_visible_v), (ImS64)0, scroll_max);
+ }
+ }
// Update values for rendering
scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max);
grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v;
- // Update distance to grab now that we have seeked and saturated
- if (seek_absolute)
- g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f;
+ // Update distance to grab now that we have seek'ed and saturated
+ //if (seek_absolute)
+ // g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f;
}
// Render
const ImU32 bg_col = GetColorU32(ImGuiCol_ScrollbarBg);
const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha);
- window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, bg_col, window->WindowRounding, flags);
+ window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, bg_col, window->WindowRounding, draw_rounding_flags);
ImRect grab_rect;
if (axis == ImGuiAxis_X)
grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y);
@@ -1012,33 +1062,48 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
return held;
}
-void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col)
+// - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples
+// - 'uv0' and 'uv1' are texture coordinates. Read about them from the same link above.
+void ImGui::ImageWithBg(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col)
{
+ ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return;
- ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);
- if (border_col.w > 0.0f)
- bb.Max += ImVec2(2, 2);
+ const ImVec2 padding(g.Style.ImageBorderSize, g.Style.ImageBorderSize);
+ const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + image_size + padding * 2.0f);
ItemSize(bb);
if (!ItemAdd(bb, 0))
return;
- if (border_col.w > 0.0f)
- {
- window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f);
- window->DrawList->AddImage(user_texture_id, bb.Min + ImVec2(1, 1), bb.Max - ImVec2(1, 1), uv0, uv1, GetColorU32(tint_col));
- }
- else
- {
- window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col));
- }
+ // Render
+ if (g.Style.ImageBorderSize > 0.0f)
+ window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border), 0.0f, ImDrawFlags_None, g.Style.ImageBorderSize);
+ if (bg_col.w > 0.0f)
+ window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, GetColorU32(bg_col));
+ window->DrawList->AddImage(user_texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col));
}
-// ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390)
-// We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API.
-bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col)
+void ImGui::Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1)
+{
+ ImageWithBg(user_texture_id, image_size, uv0, uv1);
+}
+
+// 1.91.9 (February 2025) removed 'tint_col' and 'border_col' parameters, made border size not depend on color value. (#8131, #8238)
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+void ImGui::Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col)
+{
+ ImGuiContext& g = *GImGui;
+ PushStyleVar(ImGuiStyleVar_ImageBorderSize, (border_col.w > 0.0f) ? ImMax(1.0f, g.Style.ImageBorderSize) : 0.0f); // Preserve legacy behavior where border is always visible when border_col's Alpha is >0.0f
+ PushStyleColor(ImGuiCol_Border, border_col);
+ ImageWithBg(user_texture_id, image_size, uv0, uv1, ImVec4(0, 0, 0, 0), tint_col);
+ PopStyleColor();
+ PopStyleVar();
+}
+#endif
+
+bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
@@ -1046,59 +1111,57 @@ bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size
return false;
const ImVec2 padding = g.Style.FramePadding;
- const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2.0f);
+ const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + image_size + padding * 2.0f);
ItemSize(bb);
if (!ItemAdd(bb, id))
return false;
bool hovered, held;
- bool pressed = ButtonBehavior(bb, id, &hovered, &held);
+ bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
// Render
const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
- RenderNavHighlight(bb, id);
+ RenderNavCursor(bb, id);
RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding));
if (bg_col.w > 0.0f)
window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, GetColorU32(bg_col));
- window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col));
+ window->DrawList->AddImage(user_texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col));
return pressed;
}
-bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col)
+// - ImageButton() adds style.FramePadding*2.0f to provided size. This is in order to facilitate fitting an image in a button.
+// - ImageButton() draws a background based on regular Button() color + optionally an inner background if specified. (#8165) // FIXME: Maybe that's not the best design?
+bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
if (window->SkipItems)
return false;
- return ImageButtonEx(window->GetID(str_id), user_texture_id, size, uv0, uv1, bg_col, tint_col);
+ return ImageButtonEx(window->GetID(str_id), user_texture_id, image_size, uv0, uv1, bg_col, tint_col);
}
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
// Legacy API obsoleted in 1.89. Two differences with new ImageButton()
-// - new ImageButton() requires an explicit 'const char* str_id' Old ImageButton() used opaque imTextureId (created issue with: multiple buttons with same image, transient texture id values, opaque computation of ID)
-// - new ImageButton() always use style.FramePadding Old ImageButton() had an override argument.
-// If you need to change padding with new ImageButton() you can use PushStyleVar(ImGuiStyleVar_FramePadding, value), consistent with other Button functions.
+// - old ImageButton() used ImTextureID as item id (created issue with multiple buttons with same image, transient texture id values, opaque computation of ID)
+// - new ImageButton() requires an explicit 'const char* str_id'
+// - old ImageButton() had frame_padding' override argument.
+// - new ImageButton() always use style.FramePadding.
+/*
bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col)
{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- if (window->SkipItems)
- return false;
-
// Default to using texture ID as ID. User can still push string/integer prefixes.
- PushID((void*)(intptr_t)user_texture_id);
- const ImGuiID id = window->GetID("#image");
- PopID();
-
+ PushID((ImTextureID)(intptr_t)user_texture_id);
if (frame_padding >= 0)
PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2((float)frame_padding, (float)frame_padding));
- bool ret = ImageButtonEx(id, user_texture_id, size, uv0, uv1, bg_col, tint_col);
+ bool ret = ImageButton("", user_texture_id, size, uv0, uv1, bg_col, tint_col);
if (frame_padding >= 0)
PopStyleVar();
+ PopID();
return ret;
}
+*/
#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
bool ImGui::Checkbox(const char* label, bool* v)
@@ -1116,42 +1179,60 @@ bool ImGui::Checkbox(const char* label, bool* v)
const ImVec2 pos = window->DC.CursorPos;
const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f));
ItemSize(total_bb, style.FramePadding.y);
- if (!ItemAdd(total_bb, id))
- {
- IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
- return false;
- }
+ const bool is_visible = ItemAdd(total_bb, id);
+ const bool is_multi_select = (g.LastItemData.ItemFlags & ImGuiItemFlags_IsMultiSelect) != 0;
+ if (!is_visible)
+ if (!is_multi_select || !g.BoxSelectState.UnclipMode || !g.BoxSelectState.UnclipRect.Overlaps(total_bb)) // Extra layer of "no logic clip" for box-select support
+ {
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
+ return false;
+ }
+
+ // Range-Selection/Multi-selection support (header)
+ bool checked = *v;
+ if (is_multi_select)
+ MultiSelectItemHeader(id, &checked, NULL);
bool hovered, held;
bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
- if (pressed)
+
+ // Range-Selection/Multi-selection support (footer)
+ if (is_multi_select)
+ MultiSelectItemFooter(id, &checked, &pressed);
+ else if (pressed)
+ checked = !checked;
+
+ if (*v != checked)
{
- *v = !(*v);
+ *v = checked;
+ pressed = true; // return value
MarkItemEdited(id);
}
const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz));
- RenderNavHighlight(total_bb, id);
- RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
- ImU32 check_col = GetColorU32(ImGuiCol_CheckMark);
- bool mixed_value = (g.LastItemData.InFlags & ImGuiItemFlags_MixedValue) != 0;
- if (mixed_value)
+ const bool mixed_value = (g.LastItemData.ItemFlags & ImGuiItemFlags_MixedValue) != 0;
+ if (is_visible)
{
- // Undocumented tristate/mixed/indeterminate checkbox (#2644)
- // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox)
- ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)));
- window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding);
- }
- else if (*v)
- {
- const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f));
- RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f);
+ RenderNavCursor(total_bb, id);
+ RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
+ ImU32 check_col = GetColorU32(ImGuiCol_CheckMark);
+ if (mixed_value)
+ {
+ // Undocumented tristate/mixed/indeterminate checkbox (#2644)
+ // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox)
+ ImVec2 pad(ImMax(1.0f, IM_TRUNC(square_sz / 3.6f)), ImMax(1.0f, IM_TRUNC(square_sz / 3.6f)));
+ window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding);
+ }
+ else if (*v)
+ {
+ const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f));
+ RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f);
+ }
}
-
- ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y);
+ const ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y);
if (g.LogEnabled)
LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]");
- if (label_size.x > 0.0f)
+ if (is_visible && label_size.x > 0.0f)
RenderText(label_pos, label);
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
@@ -1167,10 +1248,8 @@ bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value)
if (!all_on && any_on)
{
ImGuiContext& g = *GImGui;
- ImGuiItemFlags backup_item_flags = g.CurrentItemFlags;
- g.CurrentItemFlags |= ImGuiItemFlags_MixedValue;
+ g.NextItemData.ItemFlags |= ImGuiItemFlags_MixedValue;
pressed = Checkbox(label, &all_on);
- g.CurrentItemFlags = backup_item_flags;
}
else
{
@@ -1236,18 +1315,19 @@ bool ImGui::RadioButton(const char* label, bool active)
if (pressed)
MarkItemEdited(id);
- RenderNavHighlight(total_bb, id);
- window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);
+ RenderNavCursor(total_bb, id);
+ const int num_segment = window->DrawList->_CalcCircleAutoSegmentCount(radius);
+ window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), num_segment);
if (active)
{
- const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f));
- window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16);
+ const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f));
+ window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark));
}
if (style.FrameBorderSize > 0.0f)
{
- window->DrawList->AddCircle(center + ImVec2(1, 1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize);
- window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize);
+ window->DrawList->AddCircle(center + ImVec2(1, 1), radius, GetColorU32(ImGuiCol_BorderShadow), num_segment, style.FrameBorderSize);
+ window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), num_segment, style.FrameBorderSize);
}
ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y);
@@ -1286,24 +1366,47 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over
if (!ItemAdd(bb, 0))
return;
+ // Fraction < 0.0f will display an indeterminate progress bar animation
+ // The value must be animated along with time, so e.g. passing '-1.0f * ImGui::GetTime()' as fraction works.
+ const bool is_indeterminate = (fraction < 0.0f);
+ if (!is_indeterminate)
+ fraction = ImSaturate(fraction);
+
+ // Out of courtesy we accept a NaN fraction without crashing
+ float fill_n0 = 0.0f;
+ float fill_n1 = (fraction == fraction) ? fraction : 0.0f;
+
+ if (is_indeterminate)
+ {
+ const float fill_width_n = 0.2f;
+ fill_n0 = ImFmod(-fraction, 1.0f) * (1.0f + fill_width_n) - fill_width_n;
+ fill_n1 = ImSaturate(fill_n0 + fill_width_n);
+ fill_n0 = ImSaturate(fill_n0);
+ }
+
// Render
- fraction = ImSaturate(fraction);
RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize));
- const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y);
- RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding);
+ RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), fill_n0, fill_n1, style.FrameRounding);
// Default displaying the fraction as percentage string, but user can override it
+ // Don't display text for indeterminate bars by default
char overlay_buf[32];
- if (!overlay)
+ if (!is_indeterminate || overlay != NULL)
{
- ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f);
- overlay = overlay_buf;
- }
+ if (!overlay)
+ {
+ ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f);
+ overlay = overlay_buf;
+ }
- ImVec2 overlay_size = CalcTextSize(overlay, NULL);
- if (overlay_size.x > 0.0f)
- RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb);
+ ImVec2 overlay_size = CalcTextSize(overlay, NULL);
+ if (overlay_size.x > 0.0f)
+ {
+ float text_x = is_indeterminate ? (bb.Min.x + bb.Max.x - overlay_size.x) * 0.5f : ImLerp(bb.Min.x, bb.Max.x, fill_n1) + style.ItemSpacing.x;
+ RenderTextClipped(ImVec2(ImClamp(text_x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb);
+ }
+ }
}
void ImGui::Bullet()
@@ -1329,6 +1432,79 @@ void ImGui::Bullet()
SameLine(0, style.FramePadding.x * 2.0f);
}
+// This is provided as a convenience for being an often requested feature.
+// FIXME-STYLE: we delayed adding as there is a larger plan to revamp the styling system.
+// Because of this we currently don't provide many styling options for this widget
+// (e.g. hovered/active colors are automatically inferred from a single color).
+bool ImGui::TextLink(const char* label)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ if (window->SkipItems)
+ return false;
+
+ ImGuiContext& g = *GImGui;
+ const ImGuiID id = window->GetID(label);
+ const char* label_end = FindRenderedTextEnd(label);
+
+ ImVec2 pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
+ ImVec2 size = CalcTextSize(label, label_end, true);
+ ImRect bb(pos, pos + size);
+ ItemSize(size, 0.0f);
+ if (!ItemAdd(bb, id))
+ return false;
+
+ bool hovered, held;
+ bool pressed = ButtonBehavior(bb, id, &hovered, &held);
+ RenderNavCursor(bb, id);
+
+ if (hovered)
+ SetMouseCursor(ImGuiMouseCursor_Hand);
+
+ ImVec4 text_colf = g.Style.Colors[ImGuiCol_TextLink];
+ ImVec4 line_colf = text_colf;
+ {
+ // FIXME-STYLE: Read comments above. This widget is NOT written in the same style as some earlier widgets,
+ // as we are currently experimenting/planning a different styling system.
+ float h, s, v;
+ ColorConvertRGBtoHSV(text_colf.x, text_colf.y, text_colf.z, h, s, v);
+ if (held || hovered)
+ {
+ v = ImSaturate(v + (held ? 0.4f : 0.3f));
+ h = ImFmod(h + 0.02f, 1.0f);
+ }
+ ColorConvertHSVtoRGB(h, s, v, text_colf.x, text_colf.y, text_colf.z);
+ v = ImSaturate(v - 0.20f);
+ ColorConvertHSVtoRGB(h, s, v, line_colf.x, line_colf.y, line_colf.z);
+ }
+
+ float line_y = bb.Max.y + ImFloor(g.Font->Descent * g.FontScale * 0.20f);
+ window->DrawList->AddLine(ImVec2(bb.Min.x, line_y), ImVec2(bb.Max.x, line_y), GetColorU32(line_colf)); // FIXME-TEXT: Underline mode.
+
+ PushStyleColor(ImGuiCol_Text, GetColorU32(text_colf));
+ RenderText(bb.Min, label, label_end);
+ PopStyleColor();
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
+ return pressed;
+}
+
+void ImGui::TextLinkOpenURL(const char* label, const char* url)
+{
+ ImGuiContext& g = *GImGui;
+ if (url == NULL)
+ url = label;
+ if (TextLink(label))
+ if (g.PlatformIO.Platform_OpenInShellFn != NULL)
+ g.PlatformIO.Platform_OpenInShellFn(&g, url);
+ SetItemTooltip(LocalizeGetMsg(ImGuiLocKey_OpenLink_s), url); // It is more reassuring for user to _always_ display URL when we same as label
+ if (BeginPopupContextItem())
+ {
+ if (MenuItem(LocalizeGetMsg(ImGuiLocKey_CopyLink)))
+ SetClipboardText(url);
+ EndPopup();
+ }
+}
+
//-------------------------------------------------------------------------
// [SECTION] Widgets: Low-level Layout helpers
//-------------------------------------------------------------------------
@@ -1390,7 +1566,9 @@ void ImGui::AlignTextToFramePadding()
}
// Horizontal/vertical separating line
-void ImGui::SeparatorEx(ImGuiSeparatorFlags flags)
+// FIXME: Surprisingly, this seemingly trivial widget is a victim of many different legacy/tricky layout issues.
+// Note how thickness == 1.0f is handled specifically as not moving CursorPos by 'thickness', but other values are.
+void ImGui::SeparatorEx(ImGuiSeparatorFlags flags, float thickness)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -1398,55 +1576,50 @@ void ImGui::SeparatorEx(ImGuiSeparatorFlags flags)
ImGuiContext& g = *GImGui;
IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))); // Check that only 1 option is selected
+ IM_ASSERT(thickness > 0.0f);
- float thickness_draw = 1.0f;
- float thickness_layout = 0.0f;
if (flags & ImGuiSeparatorFlags_Vertical)
{
- // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.
+ // Vertical separator, for menu bars (use current line height).
float y1 = window->DC.CursorPos.y;
float y2 = window->DC.CursorPos.y + window->DC.CurrLineSize.y;
- const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness_draw, y2));
- ItemSize(ImVec2(thickness_layout, 0.0f));
+ const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness, y2));
+ ItemSize(ImVec2(thickness, 0.0f));
if (!ItemAdd(bb, 0))
return;
// Draw
- window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator));
+ window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Separator));
if (g.LogEnabled)
LogText(" |");
}
else if (flags & ImGuiSeparatorFlags_Horizontal)
{
// Horizontal Separator
- float x1 = window->Pos.x;
- float x2 = window->Pos.x + window->Size.x;
-
- // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator
- if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID)
- x1 += window->DC.Indent.x;
-
- // FIXME-WORKRECT: In theory we should simply be using WorkRect.Min.x/Max.x everywhere but it isn't aesthetically what we want,
- // need to introduce a variant of WorkRect for that purpose. (#4787)
- if (ImGuiTable* table = g.CurrentTable)
- {
- x1 = table->Columns[table->CurrentColumn].MinX;
- x2 = table->Columns[table->CurrentColumn].MaxX;
- }
+ float x1 = window->DC.CursorPos.x;
+ float x2 = window->WorkRect.Max.x;
+ // Preserve legacy behavior inside Columns()
+ // Before Tables API happened, we relied on Separator() to span all columns of a Columns() set.
+ // We currently don't need to provide the same feature for tables because tables naturally have border features.
ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL;
if (columns)
+ {
+ x1 = window->Pos.x + window->DC.Indent.x; // Used to be Pos.x before 2023/10/03
+ x2 = window->Pos.x + window->Size.x;
PushColumnsBackground();
+ }
// We don't provide our width to the layout so that it doesn't get feed back into AutoFit
// FIXME: This prevents ->CursorMaxPos based bounding box evaluation from working (e.g. TableEndCell)
- const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness_draw));
- ItemSize(ImVec2(0.0f, thickness_layout));
- const bool item_visible = ItemAdd(bb, 0);
- if (item_visible)
+ const float thickness_for_layout = (thickness == 1.0f) ? 0.0f : thickness; // FIXME: See 1.70/1.71 Separator() change: makes legacy 1-px separator not affect layout yet. Should change.
+ const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness));
+ ItemSize(ImVec2(0.0f, thickness_for_layout));
+
+ if (ItemAdd(bb, 0))
{
// Draw
- window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x, bb.Min.y), GetColorU32(ImGuiCol_Separator));
+ window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Separator));
if (g.LogEnabled)
LogRenderedText(&bb.Min, "--------------------------------\n");
@@ -1466,14 +1639,84 @@ void ImGui::Separator()
if (window->SkipItems)
return;
- // Those flags should eventually be overridable by the user
+ // Those flags should eventually be configurable by the user
+ // FIXME: We cannot g.Style.SeparatorTextBorderSize for thickness as it relates to SeparatorText() which is a decorated separator, not defaulting to 1.0f.
ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal;
- flags |= ImGuiSeparatorFlags_SpanAllColumns; // NB: this only applies to legacy Columns() api as they relied on Separator() a lot.
- SeparatorEx(flags);
+
+ // Only applies to legacy Columns() api as they relied on Separator() a lot.
+ if (window->DC.CurrentColumns)
+ flags |= ImGuiSeparatorFlags_SpanAllColumns;
+
+ SeparatorEx(flags, 1.0f);
+}
+
+void ImGui::SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_w)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImGuiStyle& style = g.Style;
+
+ const ImVec2 label_size = CalcTextSize(label, label_end, false);
+ const ImVec2 pos = window->DC.CursorPos;
+ const ImVec2 padding = style.SeparatorTextPadding;
+
+ const float separator_thickness = style.SeparatorTextBorderSize;
+ const ImVec2 min_size(label_size.x + extra_w + padding.x * 2.0f, ImMax(label_size.y + padding.y * 2.0f, separator_thickness));
+ const ImRect bb(pos, ImVec2(window->WorkRect.Max.x, pos.y + min_size.y));
+ const float text_baseline_y = ImTrunc((bb.GetHeight() - label_size.y) * style.SeparatorTextAlign.y + 0.99999f); //ImMax(padding.y, ImFloor((style.SeparatorTextSize - label_size.y) * 0.5f));
+ ItemSize(min_size, text_baseline_y);
+ if (!ItemAdd(bb, id))
+ return;
+
+ const float sep1_x1 = pos.x;
+ const float sep2_x2 = bb.Max.x;
+ const float seps_y = ImTrunc((bb.Min.y + bb.Max.y) * 0.5f + 0.99999f);
+
+ const float label_avail_w = ImMax(0.0f, sep2_x2 - sep1_x1 - padding.x * 2.0f);
+ const ImVec2 label_pos(pos.x + padding.x + ImMax(0.0f, (label_avail_w - label_size.x - extra_w) * style.SeparatorTextAlign.x), pos.y + text_baseline_y); // FIXME-ALIGN
+
+ // This allows using SameLine() to position something in the 'extra_w'
+ window->DC.CursorPosPrevLine.x = label_pos.x + label_size.x;
+
+ const ImU32 separator_col = GetColorU32(ImGuiCol_Separator);
+ if (label_size.x > 0.0f)
+ {
+ const float sep1_x2 = label_pos.x - style.ItemSpacing.x;
+ const float sep2_x1 = label_pos.x + label_size.x + extra_w + style.ItemSpacing.x;
+ if (sep1_x2 > sep1_x1 && separator_thickness > 0.0f)
+ window->DrawList->AddLine(ImVec2(sep1_x1, seps_y), ImVec2(sep1_x2, seps_y), separator_col, separator_thickness);
+ if (sep2_x2 > sep2_x1 && separator_thickness > 0.0f)
+ window->DrawList->AddLine(ImVec2(sep2_x1, seps_y), ImVec2(sep2_x2, seps_y), separator_col, separator_thickness);
+ if (g.LogEnabled)
+ LogSetNextTextDecoration("---", NULL);
+ RenderTextEllipsis(window->DrawList, label_pos, ImVec2(bb.Max.x, bb.Max.y + style.ItemSpacing.y), bb.Max.x, bb.Max.x, label, label_end, &label_size);
+ }
+ else
+ {
+ if (g.LogEnabled)
+ LogText("---");
+ if (separator_thickness > 0.0f)
+ window->DrawList->AddLine(ImVec2(sep1_x1, seps_y), ImVec2(sep2_x2, seps_y), separator_col, separator_thickness);
+ }
+}
+
+void ImGui::SeparatorText(const char* label)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ if (window->SkipItems)
+ return;
+
+ // The SeparatorText() vs SeparatorTextEx() distinction is designed to be considerate that we may want:
+ // - allow separator-text to be draggable items (would require a stable ID + a noticeable highlight)
+ // - this high-level entry point to allow formatting? (which in turns may require ID separate from formatted string)
+ // - because of this we probably can't turn 'const char* label' into 'const char* fmt, ...'
+ // Otherwise, we can decide that users wanting to drag this would layout a dedicated drag-item,
+ // and then we can turn this into a format function.
+ SeparatorTextEx(0, label, FindRenderedTextEnd(label), 0.0f);
}
// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise.
-bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend, float hover_visibility_delay)
+bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend, float hover_visibility_delay, ImU32 bg_col)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -1481,14 +1724,20 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float
if (!ItemAdd(bb, id, NULL, ImGuiItemFlags_NoNav))
return false;
+ // FIXME: AFAIK the only leftover reason for passing ImGuiButtonFlags_AllowOverlap here is
+ // to allow caller of SplitterBehavior() to call SetItemAllowOverlap() after the item.
+ // Nowadays we would instead want to use SetNextItemAllowOverlap() before the item.
+ ImGuiButtonFlags button_flags = ImGuiButtonFlags_FlattenChildren;
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ button_flags |= ImGuiButtonFlags_AllowOverlap;
+#endif
+
bool hovered, held;
ImRect bb_interact = bb;
bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f));
- ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap);
+ ButtonBehavior(bb_interact, id, &hovered, &held, button_flags);
if (hovered)
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; // for IsItemHovered(), because bb_interact is larger than bb
- if (g.ActiveId != id)
- SetItemAllowOverlap();
if (held || (hovered && g.HoveredIdPreviousFrame == id && g.HoveredIdTimer >= hover_visibility_delay))
SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW);
@@ -1496,8 +1745,7 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float
ImRect bb_render = bb;
if (held)
{
- ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min;
- float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x;
+ float mouse_delta = (g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min)[axis];
// Minimum pane size
float size_1_maximum_delta = ImMax(0.0f, *size1 - min_size1);
@@ -1510,18 +1758,16 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float
// Apply resize
if (mouse_delta != 0.0f)
{
- if (mouse_delta < 0.0f)
- IM_ASSERT(*size1 + mouse_delta >= min_size1);
- if (mouse_delta > 0.0f)
- IM_ASSERT(*size2 - mouse_delta >= min_size2);
- *size1 += mouse_delta;
- *size2 -= mouse_delta;
+ *size1 = ImMax(*size1 + mouse_delta, min_size1);
+ *size2 = ImMax(*size2 - mouse_delta, min_size2);
bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta));
MarkItemEdited(id);
}
}
- // Render
+ // Render at new position
+ if (bg_col & IM_COL32_A_MASK)
+ window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, bg_col, 0.0f);
const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f);
@@ -1567,7 +1813,7 @@ void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_exc
width_excess = 0.0f;
for (int n = 0; n < count; n++)
{
- float width_rounded = ImFloor(items[n].Width);
+ float width_rounded = ImTrunc(items[n].Width);
width_excess += items[n].Width - width_rounded;
items[n].Width = width_rounded;
}
@@ -1605,7 +1851,7 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
- ImGuiNextWindowDataFlags backup_next_window_data_flags = g.NextWindowData.Flags;
+ ImGuiNextWindowDataFlags backup_next_window_data_flags = g.NextWindowData.HasFlags;
g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
if (window->SkipItems)
return false;
@@ -1613,10 +1859,13 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
const ImGuiStyle& style = g.Style;
const ImGuiID id = window->GetID(label);
IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together
+ if (flags & ImGuiComboFlags_WidthFitPreview)
+ IM_ASSERT((flags & (ImGuiComboFlags_NoPreview | (ImGuiComboFlags)ImGuiComboFlags_CustomPreview)) == 0);
const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight();
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth();
+ const float preview_width = ((flags & ImGuiComboFlags_WidthFitPreview) && (preview_value != NULL)) ? CalcTextSize(preview_value, NULL, true).x : 0.0f;
+ const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : ((flags & ImGuiComboFlags_WidthFitPreview) ? (arrow_size + preview_width + style.FramePadding.x * 2.0f) : CalcItemWidth());
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
const ImRect total_bb(bb.Min, bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
ItemSize(total_bb, style.FramePadding.y);
@@ -1637,7 +1886,7 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
// Render shape
const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
const float value_x2 = ImMax(bb.Min.x, bb.Max.x - arrow_size);
- RenderNavHighlight(bb, id);
+ RenderNavCursor(bb, id);
if (!(flags & ImGuiComboFlags_NoPreview))
window->DrawList->AddRectFilled(bb.Min, ImVec2(value_x2, bb.Max.y), frame_col, style.FrameRounding, (flags & ImGuiComboFlags_NoArrowButton) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersLeft);
if (!(flags & ImGuiComboFlags_NoArrowButton))
@@ -1671,7 +1920,7 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
if (!popup_open)
return false;
- g.NextWindowData.Flags = backup_next_window_data_flags;
+ g.NextWindowData.HasFlags = backup_next_window_data_flags;
return BeginComboPopup(popup_id, bb, flags);
}
@@ -1686,7 +1935,7 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags
// Set popup size
float w = bb.GetWidth();
- if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)
+ if (g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSizeConstraint)
{
g.NextWindowData.SizeConstraintRect.Min.x = ImMax(g.NextWindowData.SizeConstraintRect.Min.x, w);
}
@@ -1699,12 +1948,17 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags
if (flags & ImGuiComboFlags_HeightRegular) popup_max_height_in_items = 8;
else if (flags & ImGuiComboFlags_HeightSmall) popup_max_height_in_items = 4;
else if (flags & ImGuiComboFlags_HeightLarge) popup_max_height_in_items = 20;
- SetNextWindowSizeConstraints(ImVec2(w, 0.0f), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items)));
+ ImVec2 constraint_min(0.0f, 0.0f), constraint_max(FLT_MAX, FLT_MAX);
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSize) == 0 || g.NextWindowData.SizeVal.x <= 0.0f) // Don't apply constraints if user specified a size
+ constraint_min.x = w;
+ if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSize) == 0 || g.NextWindowData.SizeVal.y <= 0.0f)
+ constraint_max.y = CalcMaxPopupHeightFromItemCount(popup_max_height_in_items);
+ SetNextWindowSizeConstraints(constraint_min, constraint_max);
}
// This is essentially a specialized version of BeginPopupEx()
char name[16];
- ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth
+ ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginComboDepth); // Recycle windows based on depth
// Set position given a custom constraint (peak into expected window size so we can position it)
// FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function?
@@ -1722,7 +1976,7 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags
// We don't use BeginPopupEx() solely because we have a custom name string, which we could make an argument to BeginPopupEx()
ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove;
- PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(g.Style.FramePadding.x, g.Style.WindowPadding.y)); // Horizontally align ourselves with the framed text
+ PushStyleVarX(ImGuiStyleVar_WindowPadding, g.Style.FramePadding.x); // Horizontally align ourselves with the framed text
bool ret = Begin(name, NULL, window_flags);
PopStyleVar();
if (!ret)
@@ -1731,12 +1985,15 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags
IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above
return false;
}
+ g.BeginComboDepth++;
return true;
}
void ImGui::EndCombo()
{
+ ImGuiContext& g = *GImGui;
EndPopup();
+ g.BeginComboDepth--;
}
// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements
@@ -1750,7 +2007,7 @@ bool ImGui::BeginComboPreview()
if (window->SkipItems || !(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible))
return false;
IM_ASSERT(g.LastItemData.Rect.Min.x == preview_data->PreviewRect.Min.x && g.LastItemData.Rect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag?
- if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional)
+ if (!window->ClipRect.Overlaps(preview_data->PreviewRect)) // Narrower test (optional)
return false;
// FIXME: This could be contained in a PushWorkRect() api
@@ -1793,18 +2050,15 @@ void ImGui::EndComboPreview()
}
// Getter for the old Combo() API: const char*[]
-static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
+static const char* Items_ArrayGetter(void* data, int idx)
{
const char* const* items = (const char* const*)data;
- if (out_text)
- *out_text = items[idx];
- return true;
+ return items[idx];
}
// Getter for the old Combo() API: "item1\0item2\0item3\0"
-static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
+static const char* Items_SingleStringGetter(void* data, int idx)
{
- // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited.
const char* items_separated_by_zeros = (const char*)data;
int items_count = 0;
const char* p = items_separated_by_zeros;
@@ -1812,55 +2066,54 @@ static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
{
if (idx == items_count)
break;
- p += strlen(p) + 1;
+ p += ImStrlen(p) + 1;
items_count++;
}
- if (!*p)
- return false;
- if (out_text)
- *out_text = p;
- return true;
+ return *p ? p : NULL;
}
// Old API, prefer using BeginCombo() nowadays if you can.
-bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items)
+bool ImGui::Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items)
{
ImGuiContext& g = *GImGui;
// Call the getter to obtain the preview string which is a parameter to BeginCombo()
const char* preview_value = NULL;
if (*current_item >= 0 && *current_item < items_count)
- items_getter(data, *current_item, &preview_value);
+ preview_value = getter(user_data, *current_item);
// The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here.
- if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint))
+ if (popup_max_height_in_items != -1 && !(g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasSizeConstraint))
SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items)));
if (!BeginCombo(label, preview_value, ImGuiComboFlags_None))
return false;
// Display items
- // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed)
bool value_changed = false;
- for (int i = 0; i < items_count; i++)
- {
- PushID(i);
- const bool item_selected = (i == *current_item);
- const char* item_text;
- if (!items_getter(data, i, &item_text))
- item_text = "*Unknown item*";
- if (Selectable(item_text, item_selected))
+ ImGuiListClipper clipper;
+ clipper.Begin(items_count);
+ clipper.IncludeItemByIndex(*current_item);
+ while (clipper.Step())
+ for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
{
- value_changed = true;
- *current_item = i;
+ const char* item_text = getter(user_data, i);
+ if (item_text == NULL)
+ item_text = "*Unknown item*";
+
+ PushID(i);
+ const bool item_selected = (i == *current_item);
+ if (Selectable(item_text, item_selected) && *current_item != i)
+ {
+ value_changed = true;
+ *current_item = i;
+ }
+ if (item_selected)
+ SetItemDefaultFocus();
+ PopID();
}
- if (item_selected)
- SetItemDefaultFocus();
- PopID();
- }
EndCombo();
-
if (value_changed)
MarkItemEdited(g.LastItemData.ID);
@@ -1881,20 +2134,44 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa
const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open
while (*p)
{
- p += strlen(p) + 1;
+ p += ImStrlen(p) + 1;
items_count++;
}
bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items);
return value_changed;
}
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+
+struct ImGuiGetNameFromIndexOldToNewCallbackData { void* UserData; bool (*OldCallback)(void*, int, const char**); };
+static const char* ImGuiGetNameFromIndexOldToNewCallback(void* user_data, int idx)
+{
+ ImGuiGetNameFromIndexOldToNewCallbackData* data = (ImGuiGetNameFromIndexOldToNewCallbackData*)user_data;
+ const char* s = NULL;
+ data->OldCallback(data->UserData, idx, &s);
+ return s;
+}
+
+bool ImGui::ListBox(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int height_in_items)
+{
+ ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter };
+ return ListBox(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, height_in_items);
+}
+bool ImGui::Combo(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int popup_max_height_in_items)
+{
+ ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter };
+ return Combo(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, popup_max_height_in_items);
+}
+
+#endif
+
//-------------------------------------------------------------------------
// [SECTION] Data Type and Data Formatting Helpers [Internal]
//-------------------------------------------------------------------------
// - DataTypeGetInfo()
// - DataTypeFormatString()
// - DataTypeApplyOp()
-// - DataTypeApplyOpFromText()
+// - DataTypeApplyFromText()
// - DataTypeCompare()
// - DataTypeClamp()
// - GetMinimumStepAtDecimalPrecision
@@ -1918,6 +2195,8 @@ static const ImGuiDataTypeInfo GDataTypeInfo[] =
#endif
{ sizeof(float), "float", "%.3f","%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg)
{ sizeof(double), "double","%f", "%lf" }, // ImGuiDataType_Double
+ { sizeof(bool), "bool", "%d", "%d" }, // ImGuiDataType_Bool
+ { 0, "char*","%s", "%s" }, // ImGuiDataType_String
};
IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT);
@@ -2002,20 +2281,28 @@ void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const
// User can input math operators (e.g. +100) to edit a numerical values.
// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess..
-bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format)
+bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty)
{
+ // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all.
+ const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type);
+ ImGuiDataTypeStorage data_backup;
+ memcpy(&data_backup, p_data, type_info->Size);
+
while (ImCharIsBlankA(*buf))
buf++;
if (!buf[0])
+ {
+ if (p_data_when_empty != NULL)
+ {
+ memcpy(p_data, p_data_when_empty, type_info->Size);
+ return memcmp(&data_backup, p_data, type_info->Size) != 0;
+ }
return false;
-
- // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all.
- const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type);
- ImGuiDataTypeTempStorage data_backup;
- memcpy(&data_backup, p_data, type_info->Size);
+ }
// Sanitize format
- // For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf
+ // - For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf
+ // - In theory could treat empty format as using default, but this would only cover rare/bizarre case of using InputScalar() + integer + format string without %.
char format_sanitized[32];
if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double)
format = type_info->ScanFmt;
@@ -2100,6 +2387,12 @@ bool ImGui::DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_m
return false;
}
+bool ImGui::DataTypeIsZero(ImGuiDataType data_type, const void* p_data)
+{
+ ImGuiContext& g = *GImGui;
+ return DataTypeCompare(data_type, p_data, &g.DataTypeZeroValue) == 0;
+}
+
static float GetMinimumStepAtDecimalPrecision(int decimal_precision)
{
static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f };
@@ -2133,6 +2426,8 @@ TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type,
return v;
}
+template float ImGui::RoundScalarWithFormatT<float>(const char* format, ImGuiDataType data_type, float v);
+
//-------------------------------------------------------------------------
// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc.
//-------------------------------------------------------------------------
@@ -2158,12 +2453,13 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
{
ImGuiContext& g = *GImGui;
const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X;
- const bool is_clamped = (v_min < v_max);
+ const bool is_bounded = (v_min < v_max) || ((v_min == v_max) && (v_min != 0.0f || (flags & ImGuiSliderFlags_ClampZeroRange)));
+ const bool is_wrapped = is_bounded && (flags & ImGuiSliderFlags_WrapAround);
const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0;
const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double);
// Default tweak speed
- if (v_speed == 0.0f && is_clamped && (v_max - v_min < FLT_MAX))
+ if (v_speed == 0.0f && is_bounded && (v_max - v_min < FLT_MAX))
v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio);
// Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings
@@ -2171,17 +2467,17 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR))
{
adjust_delta = g.IO.MouseDelta[axis];
- if (g.IO.KeyAlt)
+ if (g.IO.KeyAlt && !(flags & ImGuiSliderFlags_NoSpeedTweaks))
adjust_delta *= 1.0f / 100.0f;
- if (g.IO.KeyShift)
+ if (g.IO.KeyShift && !(flags & ImGuiSliderFlags_NoSpeedTweaks))
adjust_delta *= 10.0f;
}
- else if (g.ActiveIdSource == ImGuiInputSource_Nav)
+ else if (g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad)
{
const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0;
const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow);
const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast);
- const float tweak_factor = tweak_slow ? 1.0f / 1.0f : tweak_fast ? 10.0f : 1.0f;
+ const float tweak_factor = (flags & ImGuiSliderFlags_NoSpeedTweaks) ? 1.0f : tweak_slow ? 1.0f / 10.0f : tweak_fast ? 10.0f : 1.0f;
adjust_delta = GetNavTweakPressedAmount(axis) * tweak_factor;
v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision));
}
@@ -2197,8 +2493,8 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
// Clear current value on activation
// Avoid altering values and clamping when we are _already_ past the limits and heading in the same direction, so e.g. if range is 0..255, current value is 300 and we are pushing to the right side, keep the 300.
- bool is_just_activated = g.ActiveIdIsJustActivated;
- bool is_already_past_limits_and_pushing_outward = is_clamped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f));
+ const bool is_just_activated = g.ActiveIdIsJustActivated;
+ const bool is_already_past_limits_and_pushing_outward = is_bounded && !is_wrapped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f));
if (is_just_activated || is_already_past_limits_and_pushing_outward)
{
g.DragCurrentAccum = 0.0f;
@@ -2256,13 +2552,24 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
if (v_cur == (TYPE)-0)
v_cur = (TYPE)0;
- // Clamp values (+ handle overflow/wrap-around for integer types)
- if (*v != v_cur && is_clamped)
+ if (*v != v_cur && is_bounded)
{
- if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_floating_point))
- v_cur = v_min;
- if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_floating_point))
- v_cur = v_max;
+ if (is_wrapped)
+ {
+ // Wrap values
+ if (v_cur < v_min)
+ v_cur += v_max - v_min + (is_floating_point ? 0 : 1);
+ if (v_cur > v_max)
+ v_cur -= v_max - v_min + (is_floating_point ? 0 : 1);
+ }
+ else
+ {
+ // Clamp values + handle overflow/wrap-around for integer types.
+ if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_floating_point))
+ v_cur = v_min;
+ if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_floating_point))
+ v_cur = v_max;
+ }
}
// Apply result
@@ -2275,7 +2582,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags)
{
// Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert.
- IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead.");
+ IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the legacy 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead.");
ImGuiContext& g = *GImGui;
if (g.ActiveId == id)
@@ -2283,12 +2590,12 @@ bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v
// Those are the things we can do easily outside the DragBehaviorT<> template, saves code generation.
if (g.ActiveIdSource == ImGuiInputSource_Mouse && !g.IO.MouseDown[0])
ClearActiveID();
- else if (g.ActiveIdSource == ImGuiInputSource_Nav && g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated)
+ else if ((g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad) && g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated)
ClearActiveID();
}
if (g.ActiveId != id)
return false;
- if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly))
+ if ((g.LastItemData.ItemFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly))
return false;
switch (data_type)
@@ -2335,30 +2642,33 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
if (format == NULL)
format = DataTypeGetInfo(data_type)->PrintFmt;
- const bool hovered = ItemHoverable(frame_bb, id);
+ const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
if (!temp_input_is_active)
{
- // Tabbing or CTRL-clicking on Drag turns it into an InputText
- const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0;
- const bool clicked = hovered && IsMouseClicked(0, id);
+ // Tabbing or CTRL+click on Drag turns it into an InputText
+ const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id);
const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2 && TestKeyOwner(ImGuiKey_MouseLeft, id));
- const bool make_active = (input_requested_by_tabbing || clicked || double_clicked || g.NavActivateId == id || g.NavActivateInputId == id);
+ const bool make_active = (clicked || double_clicked || g.NavActivateId == id);
if (make_active && (clicked || double_clicked))
SetKeyOwner(ImGuiKey_MouseLeft, id);
if (make_active && temp_input_allowed)
- if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavActivateInputId == id)
+ if ((clicked && g.IO.KeyCtrl) || double_clicked || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput)))
temp_input_is_active = true;
// (Optional) simple click (without moving) turns Drag into an InputText
if (g.IO.ConfigDragClickToInputText && temp_input_allowed && !temp_input_is_active)
if (g.ActiveId == id && hovered && g.IO.MouseReleased[0] && !IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR))
{
- g.NavActivateId = g.NavActivateInputId = id;
+ g.NavActivateId = id;
g.NavActivateFlags = ImGuiActivateFlags_PreferInput;
temp_input_is_active = true;
}
+ // Store initial value (not used by main lib but available as a convenience but some mods e.g. to revert)
+ if (make_active)
+ memcpy(&g.ActiveIdValueOnActivation, p_data, DataTypeGetInfo(data_type)->Size);
+
if (make_active && !temp_input_is_active)
{
SetActiveID(id, window);
@@ -2370,14 +2680,22 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
if (temp_input_is_active)
{
- // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set
- const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0 && (p_min == NULL || p_max == NULL || DataTypeCompare(data_type, p_min, p_max) < 0);
- return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
+ // Only clamp CTRL+Click input when ImGuiSliderFlags_ClampOnInput is set (generally via ImGuiSliderFlags_AlwaysClamp)
+ bool clamp_enabled = false;
+ if ((flags & ImGuiSliderFlags_ClampOnInput) && (p_min != NULL || p_max != NULL))
+ {
+ const int clamp_range_dir = (p_min != NULL && p_max != NULL) ? DataTypeCompare(data_type, p_min, p_max) : 0; // -1 when *p_min < *p_max, == 0 when *p_min == *p_max
+ if (p_min == NULL || p_max == NULL || clamp_range_dir < 0)
+ clamp_enabled = true;
+ else if (clamp_range_dir == 0)
+ clamp_enabled = DataTypeIsZero(data_type, p_min) ? ((flags & ImGuiSliderFlags_ClampZeroRange) != 0) : true;
+ }
+ return TempInputScalar(frame_bb, id, label, data_type, p_data, format, clamp_enabled ? p_min : NULL, clamp_enabled ? p_max : NULL);
}
// Draw frame
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
- RenderNavHighlight(frame_bb, id);
+ RenderNavCursor(frame_bb, id);
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);
// Drag behavior
@@ -2395,7 +2713,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
if (label_size.x > 0.0f)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
- IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (temp_input_allowed ? ImGuiItemStatusFlags_Inputable : 0));
return value_changed;
}
@@ -2688,20 +3006,7 @@ TYPE ImGui::ScaleValueFromRatioT(ImGuiDataType data_type, float t, TYPE v_min, T
return result;
}
-namespace ImGui
-{
-
-float RoundScalarWithFormatFloat(const char* format, ImGuiDataType data_type, float v)
-{
- return RoundScalarWithFormatT<float>(format, data_type, v);
-}
-
-float SliderCalcRatioFromValueFloat(ImGuiDataType data_type, float v, float v_min, float v_max, float power, float linear_zero_pos)
-{
- return ScaleRatioFromValueT<float, float, float>(data_type, v, v_min, v_max, false, power, linear_zero_pos);
-}
-
-} // namespace ImGui
+template float ImGui::ScaleRatioFromValueT<float, float, float>(ImGuiDataType data_type, float v, float v_min, float v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize);
// FIXME: Try to move more of the code into shared SliderBehavior()
template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE>
@@ -2713,14 +3018,14 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X;
const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0;
const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double);
- const SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max);
+ const float v_range_f = (float)(v_min < v_max ? v_max - v_min : v_min - v_max); // We don't need high precision for what we do with it.
// Calculate bounds
const float grab_padding = 2.0f; // FIXME: Should be part of style.
const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f;
float grab_sz = style.GrabMinSize;
- if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows
- grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit
+ if (!is_floating_point && v_range_f >= 0.0f) // v_range_f < 0 may happen on integer overflows
+ grab_sz = ImMax(slider_sz / (v_range_f + 1), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit
grab_sz = ImMin(grab_sz, slider_sz);
const float slider_usable_sz = slider_sz - grab_sz;
const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f;
@@ -2767,7 +3072,7 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
set_new_value = true;
}
}
- else if (g.ActiveIdSource == ImGuiInputSource_Nav)
+ else if (g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad)
{
if (g.ActiveIdIsJustActivated)
{
@@ -2783,14 +3088,14 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0;
if (decimal_precision > 0)
{
- input_delta /= 100.0f; // Gamepad/keyboard tweak speeds in % of slider bounds
+ input_delta /= 100.0f; // Keyboard/Gamepad tweak speeds in % of slider bounds
if (tweak_slow)
input_delta /= 10.0f;
}
else
{
- if ((v_range >= -100.0f && v_range <= 100.0f) || tweak_slow)
- input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps
+ if ((v_range_f >= -100.0f && v_range_f <= 100.0f && v_range_f != 0.0f) || tweak_slow)
+ input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / v_range_f; // Keyboard/Gamepad tweak speeds in integer steps
else
input_delta /= 100.0f;
}
@@ -2838,6 +3143,10 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
}
if (set_new_value)
+ if ((g.LastItemData.ItemFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly))
+ set_new_value = false;
+
+ if (set_new_value)
{
TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize);
@@ -2880,12 +3189,8 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb)
{
// Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert.
- IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead.");
-
- // Those are the things we can do easily outside the SliderBehaviorT<> template, saves code generation.
- ImGuiContext& g = *GImGui;
- if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly))
- return false;
+ IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the legacy 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead.");
+ IM_ASSERT((flags & ImGuiSliderFlags_WrapAround) == 0); // Not supported by SliderXXX(), only by DragXXX()
switch (data_type)
{
@@ -2943,20 +3248,23 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
if (format == NULL)
format = DataTypeGetInfo(data_type)->PrintFmt;
- const bool hovered = ItemHoverable(frame_bb, id);
+ const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
if (!temp_input_is_active)
{
- // Tabbing or CTRL-clicking on Slider turns it into an input box
- const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0;
- const bool clicked = hovered && IsMouseClicked(0, id);
- const bool make_active = (input_requested_by_tabbing || clicked || g.NavActivateId == id || g.NavActivateInputId == id);
+ // Tabbing or CTRL+click on Slider turns it into an input box
+ const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id);
+ const bool make_active = (clicked || g.NavActivateId == id);
if (make_active && clicked)
SetKeyOwner(ImGuiKey_MouseLeft, id);
if (make_active && temp_input_allowed)
- if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || g.NavActivateInputId == id)
+ if ((clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput)))
temp_input_is_active = true;
+ // Store initial value (not used by main lib but available as a convenience but some mods e.g. to revert)
+ if (make_active)
+ memcpy(&g.ActiveIdValueOnActivation, p_data, DataTypeGetInfo(data_type)->Size);
+
if (make_active && !temp_input_is_active)
{
SetActiveID(id, window);
@@ -2968,14 +3276,14 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
if (temp_input_is_active)
{
- // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set
- const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0;
- return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
+ // Only clamp CTRL+Click input when ImGuiSliderFlags_ClampOnInput is set (generally via ImGuiSliderFlags_AlwaysClamp)
+ const bool clamp_enabled = (flags & ImGuiSliderFlags_ClampOnInput) != 0;
+ return TempInputScalar(frame_bb, id, label, data_type, p_data, format, clamp_enabled ? p_min : NULL, clamp_enabled ? p_max : NULL);
}
// Draw frame
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
- RenderNavHighlight(frame_bb, id);
+ RenderNavCursor(frame_bb, id);
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding);
// Slider behavior
@@ -2998,7 +3306,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
if (label_size.x > 0.0f)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
- IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (temp_input_allowed ? ImGuiItemStatusFlags_Inputable : 0));
return value_changed;
}
@@ -3064,7 +3372,8 @@ bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, fl
format = "%.0f deg";
float v_deg = (*v_rad) * 360.0f / (2 * IM_PI);
bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, format, flags);
- *v_rad = v_deg * (2 * IM_PI) / 360.0f;
+ if (value_changed)
+ *v_rad = v_deg * (2 * IM_PI) / 360.0f;
return value_changed;
}
@@ -3110,9 +3419,9 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
if (format == NULL)
format = DataTypeGetInfo(data_type)->PrintFmt;
- const bool hovered = ItemHoverable(frame_bb, id);
- const bool clicked = hovered && IsMouseClicked(0, id);
- if (clicked || g.NavActivateId == id || g.NavActivateInputId == id)
+ const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
+ const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id);
+ if (clicked || g.NavActivateId == id)
{
if (clicked)
SetKeyOwner(ImGuiKey_MouseLeft, id);
@@ -3124,7 +3433,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
// Draw frame
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
- RenderNavHighlight(frame_bb, id);
+ RenderNavCursor(frame_bb, id);
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding);
// Slider behavior
@@ -3213,7 +3522,7 @@ const char* ImParseFormatFindEnd(const char* fmt)
}
// Extract the format out of a format string with leading or trailing decorations
-// fmt = "blah blah" -> return fmt
+// fmt = "blah blah" -> return ""
// fmt = "%.3f" -> return fmt
// fmt = "hello %.3f" -> return fmt + 6
// fmt = "%.3f hello" -> return buf written with "%.3f"
@@ -3221,7 +3530,7 @@ const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_
{
const char* fmt_start = ImParseFormatFindStart(fmt);
if (fmt_start[0] != '%')
- return fmt;
+ return "";
const char* fmt_end = ImParseFormatFindEnd(fmt_start);
if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data.
return fmt_start;
@@ -3246,7 +3555,7 @@ void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t
*fmt_out = 0; // Zero-terminate
}
-// - For scanning we need to remove all width and precision fields "%3.7f" -> "%f". BUT don't strip types like "%I64d" which includes digits. ! "%07I64d" -> "%I64d"
+// - For scanning we need to remove all width and precision fields and flags "%+3.7f" -> "%f". BUT don't strip types like "%I64d" which includes digits. ! "%07I64d" -> "%I64d"
const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size)
{
const char* fmt_end = ImParseFormatFindEnd(fmt_in);
@@ -3257,7 +3566,7 @@ const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out,
while (fmt_in < fmt_end)
{
char c = *fmt_in++;
- if (!has_type && ((c >= '0' && c <= '9') || c == '.'))
+ if (!has_type && ((c >= '0' && c <= '9') || c == '.' || c == '+' || c == '#'))
continue;
has_type |= ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); // Stop skipping digits
if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '.
@@ -3306,6 +3615,8 @@ int ImParseFormatPrecision(const char* fmt, int default_precision)
// Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets)
// FIXME: Facilitate using this in variety of other situations.
+// FIXME: Among other things, setting ImGuiItemFlags_AllowDuplicateId in LastItemData is currently correct but
+// the expected relationship between TempInputXXX functions and LastItemData is a little fishy.
bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags)
{
// On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id.
@@ -3316,6 +3627,7 @@ bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char*
ClearActiveID();
g.CurrentWindow->DC.CursorPos = bb.Min;
+ g.LastItemData.ItemFlags |= ImGuiItemFlags_AllowDuplicateId;
bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags | ImGuiInputTextFlags_MergedItem);
if (init)
{
@@ -3326,38 +3638,35 @@ bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char*
return value_changed;
}
-static inline ImGuiInputTextFlags InputScalar_DefaultCharsFilter(ImGuiDataType data_type, const char* format)
-{
- if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double)
- return ImGuiInputTextFlags_CharsScientific;
- const char format_last_char = format[0] ? format[strlen(format) - 1] : 0;
- return (format_last_char == 'x' || format_last_char == 'X') ? ImGuiInputTextFlags_CharsHexadecimal : ImGuiInputTextFlags_CharsDecimal;
-}
-
// Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set!
// This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility.
// However this may not be ideal for all uses, as some user code may break on out of bound values.
bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min, const void* p_clamp_max)
{
+ // FIXME: May need to clarify display behavior if format doesn't contain %.
+ // "%d" -> "%d" / "There are %d items" -> "%d" / "items" -> "%d" (fallback). Also see #6405
+ ImGuiContext& g = *GImGui;
+ const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type);
char fmt_buf[32];
char data_buf[32];
format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf));
+ if (format[0] == 0)
+ format = type_info->PrintFmt;
DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format);
ImStrTrimBlanks(data_buf);
- ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited;
- flags |= InputScalar_DefaultCharsFilter(data_type, format);
-
+ ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint;
+ g.LastItemData.ItemFlags |= ImGuiItemFlags_NoMarkEdited; // Because TempInputText() uses ImGuiInputTextFlags_MergedItem it doesn't submit a new item, so we poke LastItemData.
bool value_changed = false;
if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags))
{
// Backup old value
- size_t data_type_size = DataTypeGetInfo(data_type)->Size;
- ImGuiDataTypeTempStorage data_backup;
+ size_t data_type_size = type_info->Size;
+ ImGuiDataTypeStorage data_backup;
memcpy(&data_backup, p_data, data_type_size);
// Apply new value (or operations) then clamp
- DataTypeApplyFromText(data_buf, data_type, p_data, format);
+ DataTypeApplyFromText(data_buf, data_type, p_data, format, NULL);
if (p_clamp_min || p_clamp_max)
{
if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0)
@@ -3366,6 +3675,7 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG
}
// Only mark as edited if new value is different
+ g.LastItemData.ItemFlags &= ~ImGuiItemFlags_NoMarkEdited;
value_changed = memcmp(&data_backup, p_data, data_type_size) != 0;
if (value_changed)
MarkItemEdited(id);
@@ -3373,6 +3683,13 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG
return value_changed;
}
+void ImGui::SetNextItemRefVal(ImGuiDataType data_type, void* p_data)
+{
+ ImGuiContext& g = *GImGui;
+ g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasRefVal;
+ memcpy(&g.NextItemData.RefVal, p_data, DataTypeGetInfo(data_type)->Size);
+}
+
// Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional.
// Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly.
bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags)
@@ -3383,20 +3700,31 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
ImGuiContext& g = *GImGui;
ImGuiStyle& style = g.Style;
+ IM_ASSERT((flags & ImGuiInputTextFlags_EnterReturnsTrue) == 0); // Not supported by InputScalar(). Please open an issue if you this would be useful to you. Otherwise use IsItemDeactivatedAfterEdit()!
if (format == NULL)
format = DataTypeGetInfo(data_type)->PrintFmt;
+ void* p_data_default = (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasRefVal) ? &g.NextItemData.RefVal : &g.DataTypeZeroValue;
+
char buf[64];
- DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
+ if ((flags & ImGuiInputTextFlags_DisplayEmptyRefVal) && DataTypeCompare(data_type, p_data, p_data_default) == 0)
+ buf[0] = 0;
+ else
+ DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
- // Testing ActiveId as a minor optimization as filtering is not needed until active
- if (g.ActiveId == 0 && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0)
- flags |= InputScalar_DefaultCharsFilter(data_type, format);
- flags |= ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
+ // Disable the MarkItemEdited() call in InputText but keep ImGuiItemStatusFlags_Edited.
+ // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
+ g.NextItemData.ItemFlags |= ImGuiItemFlags_NoMarkEdited;
+ flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint;
bool value_changed = false;
- if (p_step != NULL)
+ if (p_step == NULL)
+ {
+ if (InputText(label, buf, IM_ARRAYSIZE(buf), flags))
+ value_changed = DataTypeApplyFromText(buf, data_type, p_data, format, (flags & ImGuiInputTextFlags_ParseEmptyRefVal) ? p_data_default : NULL);
+ }
+ else
{
const float button_size = GetFrameHeight();
@@ -3404,27 +3732,28 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
PushID(label);
SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2));
if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view
- value_changed = DataTypeApplyFromText(buf, data_type, p_data, format);
- IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags);
+ value_changed = DataTypeApplyFromText(buf, data_type, p_data, format, (flags & ImGuiInputTextFlags_ParseEmptyRefVal) ? p_data_default : NULL);
+ IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable);
// Step buttons
const ImVec2 backup_frame_padding = style.FramePadding;
style.FramePadding.x = style.FramePadding.y;
- ImGuiButtonFlags button_flags = ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups;
if (flags & ImGuiInputTextFlags_ReadOnly)
BeginDisabled();
+ PushItemFlag(ImGuiItemFlags_ButtonRepeat, true);
SameLine(0, style.ItemInnerSpacing.x);
- if (ButtonEx("-", ImVec2(button_size, button_size), button_flags))
+ if (ButtonEx("-", ImVec2(button_size, button_size)))
{
DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step);
value_changed = true;
}
SameLine(0, style.ItemInnerSpacing.x);
- if (ButtonEx("+", ImVec2(button_size, button_size), button_flags))
+ if (ButtonEx("+", ImVec2(button_size, button_size)))
{
DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step);
value_changed = true;
}
+ PopItemFlag();
if (flags & ImGuiInputTextFlags_ReadOnly)
EndDisabled();
@@ -3439,11 +3768,8 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
PopID();
EndGroup();
}
- else
- {
- if (InputText(label, buf, IM_ARRAYSIZE(buf), flags))
- value_changed = DataTypeApplyFromText(buf, data_type, p_data, format);
- }
+
+ g.LastItemData.ItemFlags &= ~ImGuiItemFlags_NoMarkEdited;
if (value_changed)
MarkItemEdited(g.LastItemData.ID);
@@ -3487,7 +3813,6 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_dat
bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags)
{
- flags |= ImGuiInputTextFlags_CharsScientific;
return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags);
}
@@ -3530,13 +3855,13 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags)
bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags)
{
- flags |= ImGuiInputTextFlags_CharsScientific;
return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags);
}
//-------------------------------------------------------------------------
// [SECTION] Widgets: InputText, InputTextMultiline, InputTextWithHint
//-------------------------------------------------------------------------
+// - imstb_textedit.h include
// - InputText()
// - InputTextWithHint()
// - InputTextMultiline()
@@ -3547,6 +3872,11 @@ bool ImGui::InputDouble(const char* label, double* v, double step, double step_f
// - DebugNodeInputTextState() [Internal]
//-------------------------------------------------------------------------
+namespace ImStb
+{
+#include "imstb_textedit.h"
+}
+
bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
{
IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline()
@@ -3564,23 +3894,30 @@ bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, si
return InputTextEx(label, hint, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data);
}
+// This is only used in the path where the multiline widget is inactivate.
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end)
{
int line_count = 0;
const char* s = text_begin;
- while (char c = *s++) // We are only matching for \n so we can ignore UTF-8 decoding
- if (c == '\n')
- line_count++;
- s--;
- if (s[0] != '\n' && s[0] != '\r')
+ while (true)
+ {
+ const char* s_eol = strchr(s, '\n');
line_count++;
+ if (s_eol == NULL)
+ {
+ s = s + ImStrlen(s);
+ break;
+ }
+ s = s_eol + 1;
+ }
*out_text_end = s;
return line_count;
}
-static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line)
+// FIXME: Ideally we'd share code with ImFont::CalcTextSizeA()
+static ImVec2 InputTextCalcTextSize(ImGuiContext* ctx, const char* text_begin, const char* text_end, const char** remaining, ImVec2* out_offset, bool stop_on_new_line)
{
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *ctx;
ImFont* font = g.Font;
const float line_height = g.FontSize;
const float scale = line_height / font->FontSize;
@@ -3588,10 +3925,15 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* t
ImVec2 text_size = ImVec2(0, 0);
float line_width = 0.0f;
- const ImWchar* s = text_begin;
+ const char* s = text_begin;
while (s < text_end)
{
- unsigned int c = (unsigned int)(*s++);
+ unsigned int c = (unsigned int)*s;
+ if (c < 0x80)
+ s += 1;
+ else
+ s += ImTextCharFromUtf8(&c, s, text_end);
+
if (c == '\n')
{
text_size.x = ImMax(text_size.x, line_width);
@@ -3604,7 +3946,7 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* t
if (c == '\r')
continue;
- const float char_width = font->GetCharAdvance((ImWchar)c) * scale;
+ const float char_width = ((int)c < font->IndexAdvanceX.Size ? font->IndexAdvanceX.Data[c] : font->FallbackAdvanceX) * scale;
line_width += char_width;
}
@@ -3624,19 +3966,21 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* t
}
// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar)
+// With our UTF-8 use of stb_textedit:
+// - STB_TEXTEDIT_GETCHAR is nothing more than a a "GETBYTE". It's only used to compare to ascii or to copy blocks of text so we are fine.
+// - One exception is the STB_TEXTEDIT_IS_SPACE feature which would expect a full char in order to handle full-width space such as 0x3000 (see ImCharIsBlankW).
+// - ...but we don't use that feature.
namespace ImStb
{
-
-static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->CurLenW; }
-static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { return obj->TextW[idx]; }
-static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *GImGui; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); }
-static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; }
-static ImWchar STB_TEXTEDIT_NEWLINE = '\n';
+static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->TextLen; }
+static char STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { IM_ASSERT(idx <= obj->TextLen); return obj->TextSrc[idx]; }
+static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { unsigned int c; ImTextCharFromUtf8(&c, obj->TextSrc + line_start_idx + char_idx, obj->TextSrc + obj->TextLen); if ((ImWchar)c == '\n') return IMSTB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance((ImWchar)c) * g.FontScale; }
+static char STB_TEXTEDIT_NEWLINE = '\n';
static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* obj, int line_start_idx)
{
- const ImWchar* text = obj->TextW.Data;
- const ImWchar* text_remaining = NULL;
- const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true);
+ const char* text = obj->TextSrc;
+ const char* text_remaining = NULL;
+ const ImVec2 size = InputTextCalcTextSize(obj->Ctx, text + line_start_idx, text + obj->TextLen, &text_remaining, NULL, true);
r->x0 = 0.0f;
r->x1 = size.x;
r->baseline_y_delta = size.y;
@@ -3645,61 +3989,137 @@ static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* ob
r->num_chars = (int)(text_remaining - (text + line_start_idx));
}
-// When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators.
-static bool is_separator(unsigned int c) { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r'; }
-static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; }
-static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx])) : 1; }
-static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; }
-static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; }
-static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; }
-static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(ImGuiInputTextState* obj, int idx) { if (ImGui::GetIO().ConfigMacOSXBehaviors) return STB_TEXTEDIT_MOVEWORDRIGHT_MAC(obj, idx); else return STB_TEXTEDIT_MOVEWORDRIGHT_WIN(obj, idx); }
-#define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h
-#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_IMPL
+#define IMSTB_TEXTEDIT_GETNEXTCHARINDEX IMSTB_TEXTEDIT_GETNEXTCHARINDEX_IMPL
+#define IMSTB_TEXTEDIT_GETPREVCHARINDEX IMSTB_TEXTEDIT_GETPREVCHARINDEX_IMPL
-static void STB_TEXTEDIT_DELETECHARS(ImGuiInputTextState* obj, int pos, int n)
+static int IMSTB_TEXTEDIT_GETNEXTCHARINDEX_IMPL(ImGuiInputTextState* obj, int idx)
{
- ImWchar* dst = obj->TextW.Data + pos;
+ if (idx >= obj->TextLen)
+ return obj->TextLen + 1;
+ unsigned int c;
+ return idx + ImTextCharFromUtf8(&c, obj->TextSrc + idx, obj->TextSrc + obj->TextLen);
+}
- // We maintain our buffer length in both UTF-8 and wchar formats
- obj->Edited = true;
- obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n);
- obj->CurLenW -= n;
+static int IMSTB_TEXTEDIT_GETPREVCHARINDEX_IMPL(ImGuiInputTextState* obj, int idx)
+{
+ if (idx <= 0)
+ return -1;
+ const char* p = ImTextFindPreviousUtf8Codepoint(obj->TextSrc, obj->TextSrc + idx);
+ return (int)(p - obj->TextSrc);
+}
- // Offset remaining text (FIXME-OPT: Use memmove)
- const ImWchar* src = obj->TextW.Data + pos + n;
- while (ImWchar c = *src++)
- *dst++ = c;
- *dst = '\0';
+static bool ImCharIsSeparatorW(unsigned int c)
+{
+ static const unsigned int separator_list[] =
+ {
+ ',', 0x3001, '.', 0x3002, ';', 0xFF1B, '(', 0xFF08, ')', 0xFF09, '{', 0xFF5B, '}', 0xFF5D,
+ '[', 0x300C, ']', 0x300D, '|', 0xFF5C, '!', 0xFF01, '\\', 0xFFE5, '/', 0x30FB, 0xFF0F,
+ '\n', '\r',
+ };
+ for (unsigned int separator : separator_list)
+ if (c == separator)
+ return true;
+ return false;
}
-static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const ImWchar* new_text, int new_text_len)
+static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx)
+{
+ // When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators.
+ if ((obj->Flags & ImGuiInputTextFlags_Password) || idx <= 0)
+ return 0;
+
+ const char* curr_p = obj->TextSrc + idx;
+ const char* prev_p = ImTextFindPreviousUtf8Codepoint(obj->TextSrc, curr_p);
+ unsigned int curr_c; ImTextCharFromUtf8(&curr_c, curr_p, obj->TextSrc + obj->TextLen);
+ unsigned int prev_c; ImTextCharFromUtf8(&prev_c, prev_p, obj->TextSrc + obj->TextLen);
+
+ bool prev_white = ImCharIsBlankW(prev_c);
+ bool prev_separ = ImCharIsSeparatorW(prev_c);
+ bool curr_white = ImCharIsBlankW(curr_c);
+ bool curr_separ = ImCharIsSeparatorW(curr_c);
+ return ((prev_white || prev_separ) && !(curr_separ || curr_white)) || (curr_separ && !prev_separ);
+}
+static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx)
+{
+ if ((obj->Flags & ImGuiInputTextFlags_Password) || idx <= 0)
+ return 0;
+
+ const char* curr_p = obj->TextSrc + idx;
+ const char* prev_p = ImTextFindPreviousUtf8Codepoint(obj->TextSrc, curr_p);
+ unsigned int prev_c; ImTextCharFromUtf8(&prev_c, curr_p, obj->TextSrc + obj->TextLen);
+ unsigned int curr_c; ImTextCharFromUtf8(&curr_c, prev_p, obj->TextSrc + obj->TextLen);
+
+ bool prev_white = ImCharIsBlankW(prev_c);
+ bool prev_separ = ImCharIsSeparatorW(prev_c);
+ bool curr_white = ImCharIsBlankW(curr_c);
+ bool curr_separ = ImCharIsSeparatorW(curr_c);
+ return ((prev_white) && !(curr_separ || curr_white)) || (curr_separ && !prev_separ);
+}
+static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx)
+{
+ idx = IMSTB_TEXTEDIT_GETPREVCHARINDEX(obj, idx);
+ while (idx >= 0 && !is_word_boundary_from_right(obj, idx))
+ idx = IMSTB_TEXTEDIT_GETPREVCHARINDEX(obj, idx);
+ return idx < 0 ? 0 : idx;
+}
+static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx)
+{
+ int len = obj->TextLen;
+ idx = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(obj, idx);
+ while (idx < len && !is_word_boundary_from_left(obj, idx))
+ idx = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(obj, idx);
+ return idx > len ? len : idx;
+}
+static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx)
+{
+ idx = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(obj, idx);
+ int len = obj->TextLen;
+ while (idx < len && !is_word_boundary_from_right(obj, idx))
+ idx = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(obj, idx);
+ return idx > len ? len : idx;
+}
+static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(ImGuiInputTextState* obj, int idx) { ImGuiContext& g = *obj->Ctx; if (g.IO.ConfigMacOSXBehaviors) return STB_TEXTEDIT_MOVEWORDRIGHT_MAC(obj, idx); else return STB_TEXTEDIT_MOVEWORDRIGHT_WIN(obj, idx); }
+#define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h
+#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_IMPL
+
+static void STB_TEXTEDIT_DELETECHARS(ImGuiInputTextState* obj, int pos, int n)
+{
+ // Offset remaining text (+ copy zero terminator)
+ IM_ASSERT(obj->TextSrc == obj->TextA.Data);
+ char* dst = obj->TextA.Data + pos;
+ char* src = obj->TextA.Data + pos + n;
+ memmove(dst, src, obj->TextLen - n - pos + 1);
+ obj->Edited = true;
+ obj->TextLen -= n;
+}
+
+static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const char* new_text, int new_text_len)
{
const bool is_resizable = (obj->Flags & ImGuiInputTextFlags_CallbackResize) != 0;
- const int text_len = obj->CurLenW;
+ const int text_len = obj->TextLen;
IM_ASSERT(pos <= text_len);
- const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len);
- if (!is_resizable && (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufCapacityA))
+ if (!is_resizable && (new_text_len + obj->TextLen + 1 > obj->BufCapacity))
return false;
// Grow internal buffer if needed
- if (new_text_len + text_len + 1 > obj->TextW.Size)
+ IM_ASSERT(obj->TextSrc == obj->TextA.Data);
+ if (new_text_len + text_len + 1 > obj->TextA.Size)
{
if (!is_resizable)
return false;
- IM_ASSERT(text_len < obj->TextW.Size);
- obj->TextW.resize(text_len + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1);
+ obj->TextA.resize(text_len + ImClamp(new_text_len, 32, ImMax(256, new_text_len)) + 1);
+ obj->TextSrc = obj->TextA.Data;
}
- ImWchar* text = obj->TextW.Data;
+ char* text = obj->TextA.Data;
if (pos != text_len)
- memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar));
- memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar));
+ memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos));
+ memcpy(text + pos, new_text, (size_t)new_text_len);
obj->Edited = true;
- obj->CurLenW += new_text_len;
- obj->CurLenA += new_text_len_utf8;
- obj->TextW[obj->CurLenW] = '\0';
+ obj->TextLen += new_text_len;
+ obj->TextA[obj->TextLen] = '\0';
return true;
}
@@ -3723,15 +4143,16 @@ static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const Im
#define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page
#define STB_TEXTEDIT_K_SHIFT 0x400000
-#define STB_TEXTEDIT_IMPLEMENTATION
+#define IMSTB_TEXTEDIT_IMPLEMENTATION
+#define IMSTB_TEXTEDIT_memmove memmove
#include "imstb_textedit.h"
// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling
// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?)
-static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len)
+static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const IMSTB_TEXTEDIT_CHARTYPE* text, int text_len)
{
- stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len);
- ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW);
+ stb_text_makeundo_replace(str, state, 0, str->TextLen, text_len);
+ ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->TextLen);
state->cursor = state->select_start = state->select_end = 0;
if (text_len <= 0)
return;
@@ -3746,29 +4167,65 @@ static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* st
} // namespace ImStb
+// We added an extra indirection where 'Stb' is heap-allocated, in order facilitate the work of bindings generators.
+ImGuiInputTextState::ImGuiInputTextState()
+{
+ memset(this, 0, sizeof(*this));
+ Stb = IM_NEW(ImStbTexteditState);
+ memset(Stb, 0, sizeof(*Stb));
+}
+
+ImGuiInputTextState::~ImGuiInputTextState()
+{
+ IM_DELETE(Stb);
+}
+
void ImGuiInputTextState::OnKeyPressed(int key)
{
- stb_textedit_key(this, &Stb, key);
+ stb_textedit_key(this, Stb, key);
+ CursorFollow = true;
+ CursorAnimReset();
+}
+
+void ImGuiInputTextState::OnCharPressed(unsigned int c)
+{
+ // Convert the key to a UTF8 byte sequence.
+ // The changes we had to make to stb_textedit_key made it very much UTF-8 specific which is not too great.
+ char utf8[5];
+ ImTextCharToUtf8(utf8, c);
+ stb_textedit_text(this, Stb, utf8, (int)ImStrlen(utf8));
CursorFollow = true;
CursorAnimReset();
}
+// Those functions are not inlined in imgui_internal.h, allowing us to hide ImStbTexteditState from that header.
+void ImGuiInputTextState::CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
+void ImGuiInputTextState::CursorClamp() { Stb->cursor = ImMin(Stb->cursor, TextLen); Stb->select_start = ImMin(Stb->select_start, TextLen); Stb->select_end = ImMin(Stb->select_end, TextLen); }
+bool ImGuiInputTextState::HasSelection() const { return Stb->select_start != Stb->select_end; }
+void ImGuiInputTextState::ClearSelection() { Stb->select_start = Stb->select_end = Stb->cursor; }
+int ImGuiInputTextState::GetCursorPos() const { return Stb->cursor; }
+int ImGuiInputTextState::GetSelectionStart() const { return Stb->select_start; }
+int ImGuiInputTextState::GetSelectionEnd() const { return Stb->select_end; }
+void ImGuiInputTextState::SelectAll() { Stb->select_start = 0; Stb->cursor = Stb->select_end = TextLen; Stb->has_preferred_x = 0; }
+void ImGuiInputTextState::ReloadUserBufAndSelectAll() { WantReloadUserBuf = true; ReloadSelectionStart = 0; ReloadSelectionEnd = INT_MAX; }
+void ImGuiInputTextState::ReloadUserBufAndKeepSelection() { WantReloadUserBuf = true; ReloadSelectionStart = Stb->select_start; ReloadSelectionEnd = Stb->select_end; }
+void ImGuiInputTextState::ReloadUserBufAndMoveToEnd() { WantReloadUserBuf = true; ReloadSelectionStart = ReloadSelectionEnd = INT_MAX; }
+
ImGuiInputTextCallbackData::ImGuiInputTextCallbackData()
{
memset(this, 0, sizeof(*this));
}
-// Public API to manipulate UTF-8 text
-// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar)
+// Public API to manipulate UTF-8 text from within a callback.
// FIXME: The existence of this rarely exercised code path is a bit of a nuisance.
+// Historically they existed because STB_TEXTEDIT_INSERTCHARS() etc. worked on our ImWchar
+// buffer, but nowadays they both work on UTF-8 data. Should aim to merge both.
void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count)
{
IM_ASSERT(pos + bytes_count <= BufTextLen);
char* dst = Buf + pos;
const char* src = Buf + pos + bytes_count;
- while (char c = *src++)
- *dst++ = c;
- *dst = '\0';
+ memmove(dst, src, BufTextLen - bytes_count - pos + 1);
if (CursorPos >= pos + bytes_count)
CursorPos -= bytes_count;
@@ -3781,22 +4238,27 @@ void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count)
void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end)
{
+ // Accept null ranges
+ if (new_text == new_text_end)
+ return;
+
+ // Grow internal buffer if needed
const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0;
- const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text);
+ const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)ImStrlen(new_text);
if (new_text_len + BufTextLen >= BufSize)
{
if (!is_resizable)
return;
- // Contrary to STB_TEXTEDIT_INSERTCHARS() this is working in the UTF8 buffer, hence the mildly similar code (until we remove the U16 buffer altogether!)
- ImGuiContext& g = *GImGui;
+ ImGuiContext& g = *Ctx;
ImGuiInputTextState* edit_state = &g.InputTextState;
IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID);
IM_ASSERT(Buf == edit_state->TextA.Data);
int new_buf_size = BufTextLen + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1;
- edit_state->TextA.reserve(new_buf_size + 1);
+ edit_state->TextA.resize(new_buf_size + 1);
+ edit_state->TextSrc = edit_state->TextA.Data;
Buf = edit_state->TextA.Data;
- BufSize = edit_state->BufCapacityA = new_buf_size;
+ BufSize = edit_state->BufCapacity = new_buf_size;
}
if (BufTextLen != pos)
@@ -3811,10 +4273,26 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons
BufTextLen += new_text_len;
}
+void ImGui::PushPasswordFont()
+{
+ ImGuiContext& g = *GImGui;
+ ImFont* in_font = g.Font;
+ ImFont* out_font = &g.InputTextPasswordFont;
+ ImFontGlyph* glyph = in_font->FindGlyph('*');
+ out_font->FontSize = in_font->FontSize;
+ out_font->Scale = in_font->Scale;
+ out_font->Ascent = in_font->Ascent;
+ out_font->Descent = in_font->Descent;
+ out_font->ContainerAtlas = in_font->ContainerAtlas;
+ out_font->FallbackGlyph = glyph;
+ out_font->FallbackAdvanceX = glyph->AdvanceX;
+ IM_ASSERT(out_font->Glyphs.Size == 0 && out_font->IndexAdvanceX.Size == 0 && out_font->IndexLookup.Size == 0);
+ PushFont(out_font);
+}
+
// Return false to discard a character.
-static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source)
+static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard)
{
- IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard);
unsigned int c = *p_char;
// Filter non-printable (NB: isprint is unreliable! see #2467)
@@ -3822,14 +4300,20 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
if (c < 0x20)
{
bool pass = false;
- pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code)
- pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput));
+ pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0; // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code)
+ if (c == '\n' && input_source_is_clipboard && (flags & ImGuiInputTextFlags_Multiline) == 0) // In single line mode, replace \n with a space
+ {
+ c = *p_char = ' ';
+ pass = true;
+ }
+ pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0;
+ pass |= (c == '\t') && (flags & ImGuiInputTextFlags_AllowTabInput) != 0;
if (!pass)
return false;
apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted.
}
- if (input_source != ImGuiInputSource_Clipboard)
+ if (input_source_is_clipboard == false)
{
// We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817)
if (c == 127)
@@ -3845,16 +4329,19 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
return false;
// Generic named filters
- if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific)))
+ if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint)))
{
// The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'.
// The standard mandate that programs starts in the "C" locale where the decimal point is '.'.
// We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point.
// Change the default decimal_point with:
- // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point;
+ // ImGui::GetPlatformIO()->Platform_LocaleDecimalPoint = *localeconv()->decimal_point;
// Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions.
- ImGuiContext& g = *GImGui;
- const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint;
+ ImGuiContext& g = *ctx;
+ const unsigned c_decimal_point = (unsigned int)g.PlatformIO.Platform_LocaleDecimalPoint;
+ if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint))
+ if (c == '.' || c == ',')
+ c = c_decimal_point;
// Full-width -> half-width conversion for numeric fields (https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block)
// While this is mostly convenient, this has the side-effect for uninformed users accidentally inputting full-width characters that they may
@@ -3893,8 +4380,9 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
// Custom callback filter
if (flags & ImGuiInputTextFlags_CallbackCharFilter)
{
+ ImGuiContext& g = *GImGui;
ImGuiInputTextCallbackData callback_data;
- memset(&callback_data, 0, sizeof(ImGuiInputTextCallbackData));
+ callback_data.Ctx = &g;
callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter;
callback_data.EventChar = (ImWchar)c;
callback_data.Flags = flags;
@@ -3909,19 +4397,11 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
return true;
}
-// Find the shortest single replacement we can make to get the new text from the old text.
-// Important: needs to be run before TextW is rewritten with the new characters because calling STB_TEXTEDIT_GETCHAR() at the end.
+// Find the shortest single replacement we can make to get from old_buf to new_buf
+// Note that this doesn't directly alter state->TextA, state->TextLen. They are expected to be made valid separately.
// FIXME: Ideally we should transition toward (1) making InsertChars()/DeleteChars() update undo-stack (2) discourage (and keep reconcile) or obsolete (and remove reconcile) accessing buffer directly.
-static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* state, const char* new_buf_a, int new_length_a)
+static void InputTextReconcileUndoState(ImGuiInputTextState* state, const char* old_buf, int old_length, const char* new_buf, int new_length)
{
- ImGuiContext& g = *GImGui;
- const ImWchar* old_buf = state->TextW.Data;
- const int old_length = state->CurLenW;
- const int new_length = ImTextCountCharsFromUtf8(new_buf_a, new_buf_a + new_length_a);
- g.TempBuffer.reserve_discard((new_length + 1) * sizeof(ImWchar));
- ImWchar* new_buf = (ImWchar*)(void*)g.TempBuffer.Data;
- ImTextStrFromUtf8(new_buf, new_length + 1, new_buf_a, new_buf_a + new_length_a);
-
const int shorter_length = ImMin(old_length, new_length);
int first_diff;
for (first_diff = 0; first_diff < shorter_length; first_diff++)
@@ -3930,7 +4410,7 @@ static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* st
if (first_diff == old_length && first_diff == new_length)
return;
- int old_last_diff = old_length - 1;
+ int old_last_diff = old_length - 1;
int new_last_diff = new_length - 1;
for (; old_last_diff >= first_diff && new_last_diff >= first_diff; old_last_diff--, new_last_diff--)
if (old_buf[old_last_diff] != new_buf[new_last_diff])
@@ -3939,9 +4419,33 @@ static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* st
const int insert_len = new_last_diff - first_diff + 1;
const int delete_len = old_last_diff - first_diff + 1;
if (insert_len > 0 || delete_len > 0)
- if (STB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len))
+ if (IMSTB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb->undostate, first_diff, delete_len, insert_len))
for (int i = 0; i < delete_len; i++)
- p[i] = ImStb::STB_TEXTEDIT_GETCHAR(state, first_diff + i);
+ p[i] = old_buf[first_diff + i];
+}
+
+// As InputText() retain textual data and we currently provide a path for user to not retain it (via local variables)
+// we need some form of hook to reapply data back to user buffer on deactivation frame. (#4714)
+// It would be more desirable that we discourage users from taking advantage of the "user not retaining data" trick,
+// but that more likely be attractive when we do have _NoLiveEdit flag available.
+void ImGui::InputTextDeactivateHook(ImGuiID id)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiInputTextState* state = &g.InputTextState;
+ if (id == 0 || state->ID != id)
+ return;
+ g.InputTextDeactivatedState.ID = state->ID;
+ if (state->Flags & ImGuiInputTextFlags_ReadOnly)
+ {
+ g.InputTextDeactivatedState.TextA.resize(0); // In theory this data won't be used, but clear to be neat.
+ }
+ else
+ {
+ IM_ASSERT(state->TextA.Data != 0);
+ IM_ASSERT(state->TextA[state->TextLen] == 0);
+ g.InputTextDeactivatedState.TextA.resize(state->TextLen + 1);
+ memcpy(g.InputTextDeactivatedState.TextA.Data, state->TextA.Data, state->TextLen + 1);
+ }
}
// Edit a string of text
@@ -3961,6 +4465,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
IM_ASSERT(buf != NULL && buf_size >= 0);
IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys)
IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key)
+ IM_ASSERT(!((flags & ImGuiInputTextFlags_ElideLeft) && (flags & ImGuiInputTextFlags_Multiline))); // Multiline will not work with left-trimming
ImGuiContext& g = *GImGui;
ImGuiIO& io = g.IO;
@@ -3968,12 +4473,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
const bool RENDER_SELECTION_WHEN_INACTIVE = false;
const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;
- const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0;
- const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;
- const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0;
- const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0;
- if (is_resizable)
- IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag!
if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar)
BeginGroup();
@@ -3987,7 +4486,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
ImGuiWindow* draw_window = window;
ImVec2 inner_size = frame_size;
- ImGuiItemStatusFlags item_status_flags = 0;
ImGuiLastItemData item_data_backup;
if (is_multiline)
{
@@ -3998,17 +4496,25 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
EndGroup();
return false;
}
- item_status_flags = g.LastItemData.StatusFlags;
item_data_backup = g.LastItemData;
window->DC.CursorPos = backup_pos;
+ // Prevent NavActivation from Tabbing when our widget accepts Tab inputs: this allows cycling through widgets without stopping.
+ if (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_FromTabbing) && (flags & ImGuiInputTextFlags_AllowTabInput))
+ g.NavActivateId = 0;
+
+ // Prevent NavActivate reactivating in BeginChild() when we are already active.
+ const ImGuiID backup_activate_id = g.NavActivateId;
+ if (g.ActiveId == id) // Prevent reactivation
+ g.NavActivateId = 0;
+
// We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug.
- // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre.
PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);
PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);
PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);
PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges
- bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove);
+ bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), ImGuiChildFlags_Borders, ImGuiWindowFlags_NoMove);
+ g.NavActivateId = backup_activate_id;
PopStyleVar(3);
PopStyleColor();
if (!child_visible)
@@ -4029,17 +4535,28 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (!(flags & ImGuiInputTextFlags_MergedItem))
if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable))
return false;
- item_status_flags = g.LastItemData.StatusFlags;
}
- const bool hovered = ItemHoverable(frame_bb, id);
+
+ // Ensure mouse cursor is set even after switching to keyboard/gamepad mode. May generalize further? (#6417)
+ bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags | ImGuiItemFlags_NoNavDisableMouseHover);
if (hovered)
- g.MouseCursor = ImGuiMouseCursor_TextInput;
+ SetMouseCursor(ImGuiMouseCursor_TextInput);
+ if (hovered && g.NavHighlightItemUnderNav)
+ hovered = false;
// We are only allowed to access the state if we are already the active widget.
ImGuiInputTextState* state = GetInputTextState(id);
- const bool input_requested_by_tabbing = (item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing) != 0;
- const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateInputId == id) || (g.NavActivateId == id && g.NavInputSource == ImGuiInputSource_Keyboard));
+ if (g.LastItemData.ItemFlags & ImGuiItemFlags_ReadOnly)
+ flags |= ImGuiInputTextFlags_ReadOnly;
+ const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0;
+ const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;
+ const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0;
+ const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0;
+ if (is_resizable)
+ IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag!
+
+ const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateId == id) && ((g.NavActivateFlags & ImGuiActivateFlags_PreferInput) || (g.NavInputSource == ImGuiInputSource_Keyboard)));
const bool user_clicked = hovered && io.MouseClicked[0];
const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetWindowScrollbarID(draw_window, ImGuiAxis_Y);
@@ -4049,47 +4566,65 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX;
- const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline);
- const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav || input_requested_by_tabbing);
+ const bool init_reload_from_user_buf = (state != NULL && state->WantReloadUserBuf);
+ const bool init_changed_specs = (state != NULL && state->Stb->single_line != !is_multiline); // state != NULL means its our state.
+ const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav);
const bool init_state = (init_make_active || user_scroll_active);
- if ((init_state && g.ActiveId != id) || init_changed_specs)
+ if (init_reload_from_user_buf)
+ {
+ int new_len = (int)ImStrlen(buf);
+ IM_ASSERT(new_len + 1 <= buf_size && "Is your input buffer properly zero-terminated?");
+ state->WantReloadUserBuf = false;
+ InputTextReconcileUndoState(state, state->TextA.Data, state->TextLen, buf, new_len);
+ state->TextA.resize(buf_size + 1); // we use +1 to make sure that .Data is always pointing to at least an empty string.
+ state->TextLen = new_len;
+ memcpy(state->TextA.Data, buf, state->TextLen + 1);
+ state->Stb->select_start = state->ReloadSelectionStart;
+ state->Stb->cursor = state->Stb->select_end = state->ReloadSelectionEnd;
+ state->CursorClamp();
+ }
+ else if ((init_state && g.ActiveId != id) || init_changed_specs)
{
// Access state even if we don't own it yet.
state = &g.InputTextState;
state->CursorAnimReset();
- // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
- // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)
- const int buf_len = (int)strlen(buf);
- state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
- memcpy(state->InitialTextA.Data, buf, buf_len + 1);
+ // Backup state of deactivating item so they'll have a chance to do a write to output buffer on the same frame they report IsItemDeactivatedAfterEdit (#4714)
+ InputTextDeactivateHook(state->ID);
+
+ // Take a copy of the initial buffer value.
+ // From the moment we focused we are normally ignoring the content of 'buf' (unless we are in read-only mode)
+ const int buf_len = (int)ImStrlen(buf);
+ IM_ASSERT(buf_len + 1 <= buf_size && "Is your input buffer properly zero-terminated?");
+ state->TextToRevertTo.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
+ memcpy(state->TextToRevertTo.Data, buf, buf_len + 1);
// Preserve cursor position and undo/redo stack if we come back to same widget
- // FIXME: Since we reworked this on 2022/06, may want to differenciate recycle_cursor vs recycle_undostate?
+ // FIXME: Since we reworked this on 2022/06, may want to differentiate recycle_cursor vs recycle_undostate?
bool recycle_state = (state->ID == id && !init_changed_specs);
- if (recycle_state && (state->CurLenA != buf_len || (state->TextAIsValid && strncmp(state->TextA.Data, buf, buf_len) != 0)))
+ if (recycle_state && (state->TextLen != buf_len || (state->TextA.Data == NULL || strncmp(state->TextA.Data, buf, buf_len) != 0)))
recycle_state = false;
// Start edition
- const char* buf_end = NULL;
state->ID = id;
- state->TextW.resize(buf_size + 1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data is always pointing to at least an empty string.
- state->TextA.resize(0);
- state->TextAIsValid = false; // TextA is not valid yet (we will display buf until then)
- state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, buf_size, buf, NULL, &buf_end);
- state->CurLenA = (int)(buf_end - buf); // We can't get the result from ImStrncpy() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.
+ state->TextLen = buf_len;
+ if (!is_readonly)
+ {
+ state->TextA.resize(buf_size + 1); // we use +1 to make sure that .Data is always pointing to at least an empty string.
+ memcpy(state->TextA.Data, buf, state->TextLen + 1);
+ }
+
+ // Find initial scroll position for right alignment
+ state->Scroll = ImVec2(0.0f, 0.0f);
+ if (flags & ImGuiInputTextFlags_ElideLeft)
+ state->Scroll.x += ImMax(0.0f, CalcTextSize(buf).x - frame_size.x + style.FramePadding.x * 2.0f);
+ // Recycle existing cursor/selection/undo stack but clamp position
+ // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler.
if (recycle_state)
- {
- // Recycle existing cursor/selection/undo stack but clamp position
- // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler.
state->CursorClamp();
- }
else
- {
- state->ScrollX = 0.0f;
- stb_textedit_initialize_state(&state->Stb, !is_multiline);
- }
+ stb_textedit_initialize_state(state->Stb, !is_multiline);
if (!is_multiline)
{
@@ -4097,14 +4632,15 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
select_all = true;
if (input_requested_by_nav && (!recycle_state || !(g.NavActivateFlags & ImGuiActivateFlags_TryToPreserveState)))
select_all = true;
- if (input_requested_by_tabbing || (user_clicked && io.KeyCtrl))
+ if (user_clicked && io.KeyCtrl)
select_all = true;
}
if (flags & ImGuiInputTextFlags_AlwaysOverwrite)
- state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863)
+ state->Stb->insert_mode = 1; // stb field name is indeed incorrect (see #2863)
}
+ const bool is_osx = io.ConfigMacOSXBehaviors;
if (g.ActiveId != id && init_make_active)
{
IM_ASSERT(state && state->ID == id);
@@ -4115,21 +4651,40 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (g.ActiveId == id)
{
// Declare some inputs, the other are registered and polled via Shortcut() routing system.
+ // FIXME: The reason we don't use Shortcut() is we would need a routing flag to specify multiple mods, or to all mods combinaison into individual shortcuts.
+ const ImGuiKey always_owned_keys[] = { ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_Enter, ImGuiKey_KeypadEnter, ImGuiKey_Delete, ImGuiKey_Backspace, ImGuiKey_Home, ImGuiKey_End };
+ for (ImGuiKey key : always_owned_keys)
+ SetKeyOwner(key, id);
if (user_clicked)
SetKeyOwner(ImGuiKey_MouseLeft, id);
g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory))
+ {
g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
- SetKeyOwner(ImGuiKey_Home, id);
- SetKeyOwner(ImGuiKey_End, id);
+ SetKeyOwner(ImGuiKey_UpArrow, id);
+ SetKeyOwner(ImGuiKey_DownArrow, id);
+ }
if (is_multiline)
{
SetKeyOwner(ImGuiKey_PageUp, id);
SetKeyOwner(ImGuiKey_PageDown, id);
}
- if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character.
- SetKeyOwner(ImGuiKey_Tab, id);
+ // FIXME: May be a problem to always steal Alt on OSX, would ideally still allow an uninterrupted Alt down-up to toggle menu
+ if (is_osx)
+ SetKeyOwner(ImGuiMod_Alt, id);
+
+ // Expose scroll in a manner that is agnostic to us using a child window
+ if (is_multiline && state != NULL)
+ state->Scroll.y = draw_window->Scroll.y;
+
+ // Read-only mode always ever read from source buffer. Refresh TextLen when active.
+ if (is_readonly && state != NULL)
+ state->TextLen = (int)ImStrlen(buf);
+ //if (is_readonly && state != NULL)
+ // state->TextA.clear(); // Uncomment to facilitate debugging, but we otherwise prefer to keep/amortize th allocation.
}
+ if (state != NULL)
+ state->TextSrc = is_readonly ? buf : state->TextA.Data;
// We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function)
if (g.ActiveId == id && state == NULL)
@@ -4145,58 +4700,30 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
bool value_changed = false;
bool validated = false;
- // When read-only we always use the live data passed to the function
- // FIXME-OPT: Because our selection/cursor code currently needs the wide text we need to convert it when active, which is not ideal :(
- if (is_readonly && state != NULL && (render_cursor || render_selection))
- {
- const char* buf_end = NULL;
- state->TextW.resize(buf_size + 1);
- state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, buf, NULL, &buf_end);
- state->CurLenA = (int)(buf_end - buf);
- state->CursorClamp();
- render_selection &= state->HasSelection();
- }
-
// Select the buffer to render.
- const bool buf_display_from_state = (render_cursor || render_selection || g.ActiveId == id) && !is_readonly && state && state->TextAIsValid;
- const bool is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0);
+ const bool buf_display_from_state = (render_cursor || render_selection || g.ActiveId == id) && !is_readonly && state;
+ bool is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0);
// Password pushes a temporary font with only a fallback glyph
if (is_password && !is_displaying_hint)
- {
- const ImFontGlyph* glyph = g.Font->FindGlyph('*');
- ImFont* password_font = &g.InputTextPasswordFont;
- password_font->FontSize = g.Font->FontSize;
- password_font->Scale = g.Font->Scale;
- password_font->Ascent = g.Font->Ascent;
- password_font->Descent = g.Font->Descent;
- password_font->ContainerAtlas = g.Font->ContainerAtlas;
- password_font->FallbackGlyph = glyph;
- password_font->FallbackAdvanceX = glyph->AdvanceX;
- IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty());
- PushFont(password_font);
- }
+ PushPasswordFont();
// Process mouse inputs and character inputs
- int backup_current_text_length = 0;
if (g.ActiveId == id)
{
IM_ASSERT(state != NULL);
- backup_current_text_length = state->CurLenA;
state->Edited = false;
- state->BufCapacityA = buf_size;
+ state->BufCapacity = buf_size;
state->Flags = flags;
// Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.
// Down the line we should have a cleaner library-wide concept of Selected vs Active.
g.ActiveIdAllowOverlap = !io.MouseDown[0];
- g.WantTextInputNextFrame = 1;
// Edit in progress
- const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->ScrollX;
+ const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->Scroll.x;
const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y) : (g.FontSize * 0.5f));
- const bool is_osx = io.ConfigMacOSXBehaviors;
if (select_all)
{
state->SelectAll();
@@ -4204,34 +4731,34 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
}
else if (hovered && io.MouseClickedCount[0] >= 2 && !io.KeyShift)
{
- stb_textedit_click(state, &state->Stb, mouse_x, mouse_y);
+ stb_textedit_click(state, state->Stb, mouse_x, mouse_y);
const int multiclick_count = (io.MouseClickedCount[0] - 2);
if ((multiclick_count % 2) == 0)
{
// Double-click: Select word
// We always use the "Mac" word advance for double-click select vs CTRL+Right which use the platform dependent variant:
// FIXME: There are likely many ways to improve this behavior, but there's no "right" behavior (depends on use-case, software, OS)
- const bool is_bol = (state->Stb.cursor == 0) || ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor - 1) == '\n';
- if (STB_TEXT_HAS_SELECTION(&state->Stb) || !is_bol)
+ const bool is_bol = (state->Stb->cursor == 0) || ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb->cursor - 1) == '\n';
+ if (STB_TEXT_HAS_SELECTION(state->Stb) || !is_bol)
state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT);
//state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT);
- if (!STB_TEXT_HAS_SELECTION(&state->Stb))
- ImStb::stb_textedit_prep_selection_at_cursor(&state->Stb);
- state->Stb.cursor = ImStb::STB_TEXTEDIT_MOVEWORDRIGHT_MAC(state, state->Stb.cursor);
- state->Stb.select_end = state->Stb.cursor;
- ImStb::stb_textedit_clamp(state, &state->Stb);
+ if (!STB_TEXT_HAS_SELECTION(state->Stb))
+ ImStb::stb_textedit_prep_selection_at_cursor(state->Stb);
+ state->Stb->cursor = ImStb::STB_TEXTEDIT_MOVEWORDRIGHT_MAC(state, state->Stb->cursor);
+ state->Stb->select_end = state->Stb->cursor;
+ ImStb::stb_textedit_clamp(state, state->Stb);
}
else
{
// Triple-click: Select line
- const bool is_eol = ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor) == '\n';
+ const bool is_eol = ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb->cursor) == '\n';
state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART);
state->OnKeyPressed(STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT);
state->OnKeyPressed(STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT);
if (!is_eol && is_multiline)
{
- ImSwap(state->Stb.select_start, state->Stb.select_end);
- state->Stb.cursor = state->Stb.select_end;
+ ImSwap(state->Stb->select_start, state->Stb->select_end);
+ state->Stb->cursor = state->Stb->select_end;
}
state->CursorFollow = false;
}
@@ -4242,15 +4769,15 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (hovered)
{
if (io.KeyShift)
- stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y);
+ stb_textedit_drag(state, state->Stb, mouse_x, mouse_y);
else
- stb_textedit_click(state, &state->Stb, mouse_x, mouse_y);
+ stb_textedit_click(state, state->Stb, mouse_x, mouse_y);
state->CursorAnimReset();
}
}
else if (io.MouseDown[0] && !state->SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f))
{
- stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y);
+ stb_textedit_drag(state, state->Stb, mouse_x, mouse_y);
state->CursorAnimReset();
state->CursorFollow = true;
}
@@ -4259,16 +4786,25 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
// We expect backends to emit a Tab key but some also emit a Tab character which we ignore (#2467, #1336)
// (For Tab and Enter: Win32/SFML/Allegro are sending both keys and chars, GLFW and SDL are only sending keys. For Space they all send all threes)
- const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper);
- if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressed(ImGuiKey_Tab) && !ignore_char_inputs && !io.KeyShift && !is_readonly)
+ if ((flags & ImGuiInputTextFlags_AllowTabInput) && !is_readonly)
{
- unsigned int c = '\t'; // Insert TAB
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
- state->OnKeyPressed((int)c);
+ if (Shortcut(ImGuiKey_Tab, ImGuiInputFlags_Repeat, id))
+ {
+ unsigned int c = '\t'; // Insert TAB
+ if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data))
+ state->OnCharPressed(c);
+ }
+ // FIXME: Implement Shift+Tab
+ /*
+ if (Shortcut(ImGuiKey_Tab | ImGuiMod_Shift, ImGuiInputFlags_Repeat, id))
+ {
+ }
+ */
}
// Process regular text input (before we check for Return because using some IME will effectively send a Return?)
// We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters.
+ const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeyCtrl);
if (io.InputQueueCharacters.Size > 0)
{
if (!ignore_char_inputs && !is_readonly && !input_requested_by_nav)
@@ -4278,8 +4814,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
unsigned int c = (unsigned int)io.InputQueueCharacters[n];
if (c == '\t') // Skip Tab, see above.
continue;
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
- state->OnKeyPressed((int)c);
+ if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data))
+ state->OnCharPressed(c);
}
// Consume characters
@@ -4294,30 +4830,30 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
IM_ASSERT(state != NULL);
const int row_count_per_page = ImMax((int)((inner_size.y - style.FramePadding.y) / g.FontSize), 1);
- state->Stb.row_count_per_page = row_count_per_page;
+ state->Stb->row_count_per_page = row_count_per_page;
const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0);
- const bool is_osx = io.ConfigMacOSXBehaviors;
const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl
- const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End
+ const bool is_startend_key_down = is_osx && io.KeyCtrl && !io.KeySuper && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End
- // Using Shortcut() with ImGuiInputFlags_RouteFocused (default policy) to allow routing operations for other code (e.g. calling window trying to use CTRL+A and CTRL+B: formet would be handled by InputText)
+ // Using Shortcut() with ImGuiInputFlags_RouteFocused (default policy) to allow routing operations for other code (e.g. calling window trying to use CTRL+A and CTRL+B: former would be handled by InputText)
// Otherwise we could simply assume that we own the keys as we are active.
const ImGuiInputFlags f_repeat = ImGuiInputFlags_Repeat;
- const bool is_cut = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_X, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, id, f_repeat)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection());
- const bool is_copy = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_C, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, id)) && !is_password && (!is_multiline || state->HasSelection());
- const bool is_paste = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_V, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, id, f_repeat)) && !is_readonly;
- const bool is_undo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Z, id, f_repeat)) && !is_readonly && is_undoable;
- const bool is_redo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Y, id, f_repeat) || (is_osx && Shortcut(ImGuiMod_Shortcut | ImGuiMod_Shift | ImGuiKey_Z, id, f_repeat))) && !is_readonly && is_undoable;
- const bool is_select_all = Shortcut(ImGuiMod_Shortcut | ImGuiKey_A, id);
+ const bool is_cut = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_X, f_repeat, id) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, f_repeat, id)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection());
+ const bool is_copy = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, 0, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, 0, id)) && !is_password && (!is_multiline || state->HasSelection());
+ const bool is_paste = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_V, f_repeat, id) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, f_repeat, id)) && !is_readonly;
+ const bool is_undo = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_Z, f_repeat, id)) && !is_readonly && is_undoable;
+ const bool is_redo = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_Y, f_repeat, id) || Shortcut(ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Z, f_repeat, id)) && !is_readonly && is_undoable;
+ const bool is_select_all = Shortcut(ImGuiMod_Ctrl | ImGuiKey_A, 0, id);
// We allow validate/cancel with Nav source (gamepad) to makes it easier to undo an accidental NavInput press with no keyboard wired, but otherwise it isn't very useful.
const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
const bool is_enter_pressed = IsKeyPressed(ImGuiKey_Enter, true) || IsKeyPressed(ImGuiKey_KeypadEnter, true);
const bool is_gamepad_validate = nav_gamepad_active && (IsKeyPressed(ImGuiKey_NavGamepadActivate, false) || IsKeyPressed(ImGuiKey_NavGamepadInput, false));
- const bool is_cancel = Shortcut(ImGuiKey_Escape, id, f_repeat) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, id, f_repeat));
+ const bool is_cancel = Shortcut(ImGuiKey_Escape, f_repeat, id) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, f_repeat, id));
// FIXME: Should use more Shortcut() and reduce IsKeyPressed()+SetKeyOwner(), but requires modifiers combination to be taken account of.
+ // FIXME-OSX: Missing support for Alt(option)+Right/Left = go to end of line, or next line if already in end of line.
if (IsKeyPressed(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); }
else if (IsKeyPressed(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); }
else if (IsKeyPressed(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); }
@@ -4326,14 +4862,23 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
else if (IsKeyPressed(ImGuiKey_PageDown) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGDOWN | k_mask); scroll_y += row_count_per_page * g.FontSize; }
else if (IsKeyPressed(ImGuiKey_Home)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); }
else if (IsKeyPressed(ImGuiKey_End)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); }
- else if (IsKeyPressed(ImGuiKey_Delete) && !is_readonly && !is_cut) { state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); }
+ else if (IsKeyPressed(ImGuiKey_Delete) && !is_readonly && !is_cut)
+ {
+ if (!state->HasSelection())
+ {
+ // OSX doesn't seem to have Super+Delete to delete until end-of-line, so we don't emulate that (as opposed to Super+Backspace)
+ if (is_wordmove_key_down)
+ state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT);
+ }
+ state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask);
+ }
else if (IsKeyPressed(ImGuiKey_Backspace) && !is_readonly)
{
if (!state->HasSelection())
{
if (is_wordmove_key_down)
state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT);
- else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl)
+ else if (is_osx && io.KeyCtrl && !io.KeyAlt && !io.KeySuper)
state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT);
}
state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask);
@@ -4353,15 +4898,15 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
else if (!is_readonly)
{
unsigned int c = '\n'; // Insert new line
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
- state->OnKeyPressed((int)c);
+ if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data))
+ state->OnCharPressed(c);
}
}
else if (is_cancel)
{
if (flags & ImGuiInputTextFlags_EscapeClearsAll)
{
- if (state->CurLenA > 0)
+ if (buf[0] != 0)
{
revert_edit = true;
}
@@ -4390,22 +4935,22 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
else if (is_cut || is_copy)
{
// Cut, Copy
- if (io.SetClipboardTextFn)
+ if (g.PlatformIO.Platform_SetClipboardTextFn != NULL)
{
- const int ib = state->HasSelection() ? ImMin(state->Stb.select_start, state->Stb.select_end) : 0;
- const int ie = state->HasSelection() ? ImMax(state->Stb.select_start, state->Stb.select_end) : state->CurLenW;
- const int clipboard_data_len = ImTextCountUtf8BytesFromStr(state->TextW.Data + ib, state->TextW.Data + ie) + 1;
- char* clipboard_data = (char*)IM_ALLOC(clipboard_data_len * sizeof(char));
- ImTextStrToUtf8(clipboard_data, clipboard_data_len, state->TextW.Data + ib, state->TextW.Data + ie);
- SetClipboardText(clipboard_data);
- MemFree(clipboard_data);
+ // SetClipboardText() only takes null terminated strings + state->TextSrc may point to read-only user buffer, so we need to make a copy.
+ const int ib = state->HasSelection() ? ImMin(state->Stb->select_start, state->Stb->select_end) : 0;
+ const int ie = state->HasSelection() ? ImMax(state->Stb->select_start, state->Stb->select_end) : state->TextLen;
+ g.TempBuffer.reserve(ie - ib + 1);
+ memcpy(g.TempBuffer.Data, state->TextSrc + ib, ie - ib);
+ g.TempBuffer.Data[ie - ib] = 0;
+ SetClipboardText(g.TempBuffer.Data);
}
if (is_cut)
{
if (!state->HasSelection())
state->SelectAll();
state->CursorFollow = true;
- stb_textedit_cut(state, &state->Stb);
+ stb_textedit_cut(state, state->Stb);
}
}
else if (is_paste)
@@ -4413,26 +4958,28 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (const char* clipboard = GetClipboardText())
{
// Filter pasted buffer
- const int clipboard_len = (int)strlen(clipboard);
- ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len + 1) * sizeof(ImWchar));
- int clipboard_filtered_len = 0;
- for (const char* s = clipboard; *s; )
+ const int clipboard_len = (int)ImStrlen(clipboard);
+ ImVector<char> clipboard_filtered;
+ clipboard_filtered.reserve(clipboard_len + 1);
+ for (const char* s = clipboard; *s != 0; )
{
unsigned int c;
- s += ImTextCharFromUtf8(&c, s, NULL);
- if (c == 0)
- break;
- if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard))
+ int in_len = ImTextCharFromUtf8(&c, s, NULL);
+ s += in_len;
+ if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, true))
continue;
- clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
+ char c_utf8[5];
+ ImTextCharToUtf8(c_utf8, c);
+ int out_len = (int)ImStrlen(c_utf8);
+ clipboard_filtered.resize(clipboard_filtered.Size + out_len);
+ memcpy(clipboard_filtered.Data + clipboard_filtered.Size - out_len, c_utf8, out_len);
}
- clipboard_filtered[clipboard_filtered_len] = 0;
- if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation
+ if (clipboard_filtered.Size > 0) // If everything was filtered, ignore the pasting operation
{
- stb_textedit_paste(state, &state->Stb, clipboard_filtered, clipboard_filtered_len);
+ clipboard_filtered.push_back(0);
+ stb_textedit_paste(state, state->Stb, clipboard_filtered.Data, clipboard_filtered.Size - 1);
state->CursorFollow = true;
}
- MemFree(clipboard_filtered);
}
}
@@ -4451,45 +4998,36 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (flags & ImGuiInputTextFlags_EscapeClearsAll)
{
// Clear input
+ IM_ASSERT(buf[0] != 0);
apply_new_text = "";
apply_new_text_length = 0;
- STB_TEXTEDIT_CHARTYPE empty_string;
- stb_textedit_replace(state, &state->Stb, &empty_string, 0);
+ value_changed = true;
+ IMSTB_TEXTEDIT_CHARTYPE empty_string;
+ stb_textedit_replace(state, state->Stb, &empty_string, 0);
}
- else if (strcmp(buf, state->InitialTextA.Data) != 0)
+ else if (strcmp(buf, state->TextToRevertTo.Data) != 0)
{
+ apply_new_text = state->TextToRevertTo.Data;
+ apply_new_text_length = state->TextToRevertTo.Size - 1;
+
// Restore initial value. Only return true if restoring to the initial value changes the current buffer contents.
// Push records into the undo stack so we can CTRL+Z the revert operation itself
- apply_new_text = state->InitialTextA.Data;
- apply_new_text_length = state->InitialTextA.Size - 1;
- ImVector<ImWchar> w_text;
- if (apply_new_text_length > 0)
- {
- w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1);
- ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length);
- }
- stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0);
+ value_changed = true;
+ stb_textedit_replace(state, state->Stb, state->TextToRevertTo.Data, state->TextToRevertTo.Size - 1);
}
}
- // Apply ASCII value
- if (!is_readonly)
- {
- state->TextAIsValid = true;
- state->TextA.resize(state->TextW.Size * 4 + 1);
- ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL);
- }
-
- // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame.
- // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail.
- // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize).
- const bool apply_edit_back_to_user_buffer = !revert_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0);
+ // FIXME-OPT: We always reapply the live buffer back to the input buffer before clearing ActiveId,
+ // even though strictly speaking it wasn't modified on this frame. Should mark dirty state from the stb_textedit callbacks.
+ // If we do that, need to ensure that as special case, 'validated == true' also writes back.
+ // This also allows the user to use InputText() without maintaining any user-side storage.
+ // (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object
+ // unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize).
+ const bool apply_edit_back_to_user_buffer = true;// !revert_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0);
if (apply_edit_back_to_user_buffer)
{
- // Apply new value immediately - copy modified buffer back
+ // Apply current edited text immediately.
// Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer
- // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect.
- // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks.
// User callback
if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackEdit | ImGuiInputTextFlags_CallbackAlways)) != 0)
@@ -4499,7 +5037,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
// The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment.
ImGuiInputTextFlags event_flag = 0;
ImGuiKey event_key = ImGuiKey_None;
- if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && IsKeyPressed(ImGuiKey_Tab))
+ if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && Shortcut(ImGuiKey_Tab, 0, id))
{
event_flag = ImGuiInputTextFlags_CallbackCompletion;
event_key = ImGuiKey_Tab;
@@ -4526,23 +5064,26 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (event_flag)
{
ImGuiInputTextCallbackData callback_data;
- memset(&callback_data, 0, sizeof(ImGuiInputTextCallbackData));
+ callback_data.Ctx = &g;
callback_data.EventFlag = event_flag;
callback_data.Flags = flags;
callback_data.UserData = callback_user_data;
+ // FIXME-OPT: Undo stack reconcile needs a backup of the data until we rework API, see #7925
char* callback_buf = is_readonly ? buf : state->TextA.Data;
+ IM_ASSERT(callback_buf == state->TextSrc);
+ state->CallbackTextBackup.resize(state->TextLen + 1);
+ memcpy(state->CallbackTextBackup.Data, callback_buf, state->TextLen + 1);
+
callback_data.EventKey = event_key;
callback_data.Buf = callback_buf;
- callback_data.BufTextLen = state->CurLenA;
- callback_data.BufSize = state->BufCapacityA;
+ callback_data.BufTextLen = state->TextLen;
+ callback_data.BufSize = state->BufCapacity;
callback_data.BufDirty = false;
- // We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188)
- ImWchar* text = state->TextW.Data;
- const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + state->Stb.cursor);
- const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_start);
- const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_end);
+ const int utf8_cursor_pos = callback_data.CursorPos = state->Stb->cursor;
+ const int utf8_selection_start = callback_data.SelectionStart = state->Stb->select_start;
+ const int utf8_selection_end = callback_data.SelectionEnd = state->Stb->select_end;
// Call user code
callback(&callback_data);
@@ -4550,45 +5091,57 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
// Read back what user may have modified
callback_buf = is_readonly ? buf : state->TextA.Data; // Pointer may have been invalidated by a resize callback
IM_ASSERT(callback_data.Buf == callback_buf); // Invalid to modify those fields
- IM_ASSERT(callback_data.BufSize == state->BufCapacityA);
+ IM_ASSERT(callback_data.BufSize == state->BufCapacity);
IM_ASSERT(callback_data.Flags == flags);
const bool buf_dirty = callback_data.BufDirty;
- if (callback_data.CursorPos != utf8_cursor_pos || buf_dirty) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; }
- if (callback_data.SelectionStart != utf8_selection_start || buf_dirty) { state->Stb.select_start = (callback_data.SelectionStart == callback_data.CursorPos) ? state->Stb.cursor : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); }
- if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); }
+ if (callback_data.CursorPos != utf8_cursor_pos || buf_dirty) { state->Stb->cursor = callback_data.CursorPos; state->CursorFollow = true; }
+ if (callback_data.SelectionStart != utf8_selection_start || buf_dirty) { state->Stb->select_start = (callback_data.SelectionStart == callback_data.CursorPos) ? state->Stb->cursor : callback_data.SelectionStart; }
+ if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb->select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb->select_start : callback_data.SelectionEnd; }
if (buf_dirty)
{
- IM_ASSERT((flags & ImGuiInputTextFlags_ReadOnly) == 0);
- IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text!
- InputTextReconcileUndoStateAfterUserCallback(state, callback_data.Buf, callback_data.BufTextLen); // FIXME: Move the rest of this block inside function and rename to InputTextReconcileStateAfterUserCallback() ?
- if (callback_data.BufTextLen > backup_current_text_length && is_resizable)
- state->TextW.resize(state->TextW.Size + (callback_data.BufTextLen - backup_current_text_length)); // Worse case scenario resize
- state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, callback_data.Buf, NULL);
- state->CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen()
+ // Callback may update buffer and thus set buf_dirty even in read-only mode.
+ IM_ASSERT(callback_data.BufTextLen == (int)ImStrlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text!
+ InputTextReconcileUndoState(state, state->CallbackTextBackup.Data, state->CallbackTextBackup.Size - 1, callback_data.Buf, callback_data.BufTextLen);
+ state->TextLen = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen()
state->CursorAnimReset();
}
}
}
// Will copy result string if modified
- if (!is_readonly && strcmp(state->TextA.Data, buf) != 0)
+ if (!is_readonly && strcmp(state->TextSrc, buf) != 0)
{
- apply_new_text = state->TextA.Data;
- apply_new_text_length = state->CurLenA;
+ apply_new_text = state->TextSrc;
+ apply_new_text_length = state->TextLen;
+ value_changed = true;
}
}
}
+ // Handle reapplying final data on deactivation (see InputTextDeactivateHook() for details)
+ if (g.InputTextDeactivatedState.ID == id)
+ {
+ if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly && strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0)
+ {
+ apply_new_text = g.InputTextDeactivatedState.TextA.Data;
+ apply_new_text_length = g.InputTextDeactivatedState.TextA.Size - 1;
+ value_changed = true;
+ //IMGUI_DEBUG_LOG("InputText(): apply Deactivated data for 0x%08X: \"%.*s\".\n", id, apply_new_text_length, apply_new_text);
+ }
+ g.InputTextDeactivatedState.ID = 0;
+ }
+
// Copy result to user buffer. This can currently only happen when (g.ActiveId == id)
if (apply_new_text != NULL)
{
- // We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size
- // of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used
- // without any storage on user's side.
+ //// We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size
+ //// of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used
+ //// without any storage on user's side.
IM_ASSERT(apply_new_text_length >= 0);
if (is_resizable)
{
ImGuiInputTextCallbackData callback_data;
+ callback_data.Ctx = &g;
callback_data.EventFlag = ImGuiInputTextFlags_CallbackResize;
callback_data.Flags = flags;
callback_data.Buf = buf;
@@ -4605,17 +5158,19 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
// If the underlying buffer resize was denied or not carried to the next frame, apply_new_text_length+1 may be >= buf_size.
ImStrncpy(buf, apply_new_text, ImMin(apply_new_text_length + 1, buf_size));
- value_changed = true;
}
// Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value)
- if (clear_active_id && g.ActiveId == id)
+ // Otherwise request text input ahead for next frame.
+ if (g.ActiveId == id && clear_active_id)
ClearActiveID();
+ else if (g.ActiveId == id)
+ g.WantTextInputNextFrame = 1;
// Render frame
if (!is_multiline)
{
- RenderNavHighlight(frame_bb, id);
+ RenderNavCursor(frame_bb, id);
RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
}
@@ -4629,10 +5184,22 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
const int buf_display_max_length = 2 * 1024 * 1024;
const char* buf_display = buf_display_from_state ? state->TextA.Data : buf; //-V595
const char* buf_display_end = NULL; // We have specialized paths below for setting the length
+
+ // Display hint when contents is empty
+ // At this point we need to handle the possibility that a callback could have modified the underlying buffer (#8368)
+ const bool new_is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0);
+ if (new_is_displaying_hint != is_displaying_hint)
+ {
+ if (is_password && !is_displaying_hint)
+ PopFont();
+ is_displaying_hint = new_is_displaying_hint;
+ if (is_password && !is_displaying_hint)
+ PushPasswordFont();
+ }
if (is_displaying_hint)
{
buf_display = hint;
- buf_display_end = hint + strlen(hint);
+ buf_display_end = hint + ImStrlen(hint);
}
// Render text. We currently only render selection when the widget is active or while scrolling.
@@ -4641,7 +5208,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
{
IM_ASSERT(state != NULL);
if (!is_displaying_hint)
- buf_display_end = buf_display + state->CurLenA;
+ buf_display_end = buf_display + state->TextLen;
// Render text (with cursor and selection)
// This is going to be messy. We need to:
@@ -4650,52 +5217,40 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
// - Measure text height (for scrollbar)
// We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort)
// FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8.
- const ImWchar* text_begin = state->TextW.Data;
+ const char* text_begin = buf_display;
+ const char* text_end = text_begin + state->TextLen;
ImVec2 cursor_offset, select_start_offset;
{
- // Find lines numbers straddling 'cursor' (slot 0) and 'select_start' (slot 1) positions.
- const ImWchar* searches_input_ptr[2] = { NULL, NULL };
- int searches_result_line_no[2] = { -1000, -1000 };
- int searches_remaining = 0;
- if (render_cursor)
- {
- searches_input_ptr[0] = text_begin + state->Stb.cursor;
- searches_result_line_no[0] = -1;
- searches_remaining++;
- }
- if (render_selection)
+ // Find lines numbers straddling cursor and selection min position
+ int cursor_line_no = render_cursor ? -1 : -1000;
+ int selmin_line_no = render_selection ? -1 : -1000;
+ const char* cursor_ptr = render_cursor ? text_begin + state->Stb->cursor : NULL;
+ const char* selmin_ptr = render_selection ? text_begin + ImMin(state->Stb->select_start, state->Stb->select_end) : NULL;
+
+ // Count lines and find line number for cursor and selection ends
+ int line_count = 1;
+ if (is_multiline)
{
- searches_input_ptr[1] = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end);
- searches_result_line_no[1] = -1;
- searches_remaining++;
- }
-
- // Iterate all lines to find our line numbers
- // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter.
- searches_remaining += is_multiline ? 1 : 0;
- int line_count = 0;
- //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit
- for (const ImWchar* s = text_begin; *s != 0; s++)
- if (*s == '\n')
+ for (const char* s = text_begin; (s = (const char*)ImMemchr(s, '\n', (size_t)(text_end - s))) != NULL; s++)
{
+ if (cursor_line_no == -1 && s >= cursor_ptr) { cursor_line_no = line_count; }
+ if (selmin_line_no == -1 && s >= selmin_ptr) { selmin_line_no = line_count; }
line_count++;
- if (searches_result_line_no[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_no[0] = line_count; if (--searches_remaining <= 0) break; }
- if (searches_result_line_no[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_no[1] = line_count; if (--searches_remaining <= 0) break; }
}
- line_count++;
- if (searches_result_line_no[0] == -1)
- searches_result_line_no[0] = line_count;
- if (searches_result_line_no[1] == -1)
- searches_result_line_no[1] = line_count;
+ }
+ if (cursor_line_no == -1)
+ cursor_line_no = line_count;
+ if (selmin_line_no == -1)
+ selmin_line_no = line_count;
// Calculate 2d position by finding the beginning of the line and measuring distance
- cursor_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x;
- cursor_offset.y = searches_result_line_no[0] * g.FontSize;
- if (searches_result_line_no[1] >= 0)
+ cursor_offset.x = InputTextCalcTextSize(&g, ImStrbol(cursor_ptr, text_begin), cursor_ptr).x;
+ cursor_offset.y = cursor_line_no * g.FontSize;
+ if (selmin_line_no >= 0)
{
- select_start_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x;
- select_start_offset.y = searches_result_line_no[1] * g.FontSize;
+ select_start_offset.x = InputTextCalcTextSize(&g, ImStrbol(selmin_ptr, text_begin), selmin_ptr).x;
+ select_start_offset.y = selmin_line_no * g.FontSize;
}
// Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224)
@@ -4711,14 +5266,14 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
{
const float scroll_increment_x = inner_size.x * 0.25f;
const float visible_width = inner_size.x - style.FramePadding.x;
- if (cursor_offset.x < state->ScrollX)
- state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x));
- else if (cursor_offset.x - visible_width >= state->ScrollX)
- state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x);
+ if (cursor_offset.x < state->Scroll.x)
+ state->Scroll.x = IM_TRUNC(ImMax(0.0f, cursor_offset.x - scroll_increment_x));
+ else if (cursor_offset.x - visible_width >= state->Scroll.x)
+ state->Scroll.x = IM_TRUNC(cursor_offset.x - visible_width + scroll_increment_x);
}
else
{
- state->ScrollX = 0.0f;
+ state->Scroll.y = 0.0f;
}
// Vertical scroll
@@ -4739,43 +5294,41 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
}
// Draw selection
- const ImVec2 draw_scroll = ImVec2(state->ScrollX, 0.0f);
+ const ImVec2 draw_scroll = ImVec2(state->Scroll.x, 0.0f);
if (render_selection)
{
- const ImWchar* text_selected_begin = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end);
- const ImWchar* text_selected_end = text_begin + ImMax(state->Stb.select_start, state->Stb.select_end);
+ const char* text_selected_begin = text_begin + ImMin(state->Stb->select_start, state->Stb->select_end);
+ const char* text_selected_end = text_begin + ImMax(state->Stb->select_start, state->Stb->select_end);
ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg, render_cursor ? 1.0f : 0.6f); // FIXME: current code flow mandate that render_cursor is always true here, we are leaving the transparent one for tests.
float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection.
float bg_offy_dn = is_multiline ? 0.0f : 2.0f;
ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll;
- for (const ImWchar* p = text_selected_begin; p < text_selected_end; )
+ for (const char* p = text_selected_begin; p < text_selected_end; )
{
if (rect_pos.y > clip_rect.w + g.FontSize)
break;
if (rect_pos.y < clip_rect.y)
{
- //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit
- //p = p ? p + 1 : text_selected_end;
- while (p < text_selected_end)
- if (*p++ == '\n')
- break;
+ p = (const char*)ImMemchr((void*)p, '\n', text_selected_end - p);
+ p = p ? p + 1 : text_selected_end;
}
else
{
- ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true);
- if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
+ ImVec2 rect_size = InputTextCalcTextSize(&g, p, text_selected_end, &p, NULL, true);
+ if (rect_size.x <= 0.0f) rect_size.x = IM_TRUNC(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn));
rect.ClipWith(clip_rect);
if (rect.Overlaps(clip_rect))
draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color);
+ rect_pos.x = draw_pos.x - draw_scroll.x;
}
- rect_pos.x = draw_pos.x - draw_scroll.x;
rect_pos.y += g.FontSize;
}
}
// We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash.
+ // FIXME-OPT: Multiline could submit a smaller amount of contents to AddText() since we already iterated through it.
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
{
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
@@ -4787,7 +5340,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
{
state->CursorAnim += io.DeltaTime;
bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f;
- ImVec2 cursor_screen_pos = ImFloor(draw_pos + cursor_offset - draw_scroll);
+ ImVec2 cursor_screen_pos = ImTrunc(draw_pos + cursor_offset - draw_scroll);
ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f);
if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect))
draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text));
@@ -4807,14 +5360,19 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (is_multiline)
text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width
else if (!is_displaying_hint && g.ActiveId == id)
- buf_display_end = buf_display + state->CurLenA;
+ buf_display_end = buf_display + state->TextLen;
else if (!is_displaying_hint)
- buf_display_end = buf_display + strlen(buf_display);
+ buf_display_end = buf_display + ImStrlen(buf_display);
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
{
+ // Find render position for right alignment
+ if (flags & ImGuiInputTextFlags_ElideLeft)
+ draw_pos.x = ImMin(draw_pos.x, frame_bb.Max.x - CalcTextSize(buf_display, NULL).x - style.FramePadding.x);
+
+ const ImVec2 draw_scroll = /*state ? ImVec2(state->Scroll.x, 0.0f) :*/ ImVec2(0.0f, 0.0f); // Preserve scroll when inactive?
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
- draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
+ draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
}
}
@@ -4823,24 +5381,24 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (is_multiline)
{
- // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (ref issue #4761)...
+ // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (see #4761, #7870)...
Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y));
- ImGuiItemFlags backup_item_flags = g.CurrentItemFlags;
- g.CurrentItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop;
+ g.NextItemData.ItemFlags |= (ImGuiItemFlags)ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop;
EndChild();
item_data_backup.StatusFlags |= (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredWindow);
- g.CurrentItemFlags = backup_item_flags;
// ...and then we need to undo the group overriding last item data, which gets a bit messy as EndGroup() tries to forward scrollbar being active...
// FIXME: This quite messy/tricky, should attempt to get rid of the child window.
EndGroup();
- if (g.LastItemData.ID == 0)
+ if (g.LastItemData.ID == 0 || g.LastItemData.ID != GetWindowScrollbarID(draw_window, ImGuiAxis_Y))
{
g.LastItemData.ID = id;
- g.LastItemData.InFlags = item_data_backup.InFlags;
+ g.LastItemData.ItemFlags = item_data_backup.ItemFlags;
g.LastItemData.StatusFlags = item_data_backup.StatusFlags;
}
}
+ if (state)
+ state->TextSrc = NULL;
// Log as text
if (g.LogEnabled && (!is_password || is_displaying_hint))
@@ -4852,10 +5410,10 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if (label_size.x > 0)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
- if (value_changed && !(flags & ImGuiInputTextFlags_NoMarkEdited))
+ if (value_changed)
MarkItemEdited(id);
- IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable);
if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0)
return validated;
else
@@ -4866,26 +5424,28 @@ void ImGui::DebugNodeInputTextState(ImGuiInputTextState* state)
{
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
ImGuiContext& g = *GImGui;
- ImStb::STB_TexteditState* stb_state = &state->Stb;
+ ImStb::STB_TexteditState* stb_state = state->Stb;
ImStb::StbUndoState* undo_state = &stb_state->undostate;
Text("ID: 0x%08X, ActiveID: 0x%08X", state->ID, g.ActiveId);
DebugLocateItemOnHover(state->ID);
- Text("CurLenW: %d, CurLenA: %d, Cursor: %d, Selection: %d..%d", state->CurLenA, state->CurLenW, stb_state->cursor, stb_state->select_start, stb_state->select_end);
+ Text("CurLenA: %d, Cursor: %d, Selection: %d..%d", state->TextLen, stb_state->cursor, stb_state->select_start, stb_state->select_end);
+ Text("BufCapacityA: %d", state->BufCapacity);
+ Text("(Internal Buffer: TextA Size: %d, Capacity: %d)", state->TextA.Size, state->TextA.Capacity);
+ Text("has_preferred_x: %d (%.2f)", stb_state->has_preferred_x, stb_state->preferred_x);
Text("undo_point: %d, redo_point: %d, undo_char_point: %d, redo_char_point: %d", undo_state->undo_point, undo_state->redo_point, undo_state->undo_char_point, undo_state->redo_char_point);
- if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 15), true)) // Visualize undo state
+ if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 10), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeY)) // Visualize undo state
{
PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
- for (int n = 0; n < STB_TEXTEDIT_UNDOSTATECOUNT; n++)
+ for (int n = 0; n < IMSTB_TEXTEDIT_UNDOSTATECOUNT; n++)
{
ImStb::StbUndoRecord* undo_rec = &undo_state->undo_rec[n];
const char undo_rec_type = (n < undo_state->undo_point) ? 'u' : (n >= undo_state->redo_point) ? 'r' : ' ';
if (undo_rec_type == ' ')
BeginDisabled();
- char buf[64] = "";
- if (undo_rec_type != ' ' && undo_rec->char_storage != -1)
- ImTextStrToUtf8(buf, IM_ARRAYSIZE(buf), undo_state->undo_char + undo_rec->char_storage, undo_state->undo_char + undo_rec->char_storage + undo_rec->insert_length);
- Text("%c [%02d] where %03d, insert %03d, delete %03d, char_storage %03d \"%s\"",
- undo_rec_type, n, undo_rec->where, undo_rec->insert_length, undo_rec->delete_length, undo_rec->char_storage, buf);
+ const int buf_preview_len = (undo_rec_type != ' ' && undo_rec->char_storage != -1) ? undo_rec->insert_length : 0;
+ const char* buf_preview_str = undo_state->undo_char + undo_rec->char_storage;
+ Text("%c [%02d] where %03d, insert %03d, delete %03d, char_storage %03d \"%.*s\"",
+ undo_rec_type, n, undo_rec->where, undo_rec->insert_length, undo_rec->delete_length, undo_rec->char_storage, buf_preview_len, buf_preview_str);
if (undo_rec_type == ' ')
EndDisabled();
}
@@ -4917,33 +5477,37 @@ bool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flag
return ColorEdit4(label, col, flags | ImGuiColorEditFlags_NoAlpha);
}
+static void ColorEditRestoreH(const float* col, float* H)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(g.ColorEditCurrentID != 0);
+ if (g.ColorEditSavedID != g.ColorEditCurrentID || g.ColorEditSavedColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)))
+ return;
+ *H = g.ColorEditSavedHue;
+}
+
// ColorEdit supports RGB and HSV inputs. In case of RGB input resulting color may have undefined hue and/or saturation.
// Since widget displays both RGB and HSV values we must preserve hue and saturation to prevent these values resetting.
static void ColorEditRestoreHS(const float* col, float* H, float* S, float* V)
{
- // This check is optional. Suppose we have two color widgets side by side, both widgets display different colors, but both colors have hue and/or saturation undefined.
- // With color check: hue/saturation is preserved in one widget. Editing color in one widget would reset hue/saturation in another one.
- // Without color check: common hue/saturation would be displayed in all widgets that have hue/saturation undefined.
- // g.ColorEditLastColor is stored as ImU32 RGB value: this essentially gives us color equality check with reduced precision.
- // Tiny external color changes would not be detected and this check would still pass. This is OK, since we only restore hue/saturation _only_ if they are undefined,
- // therefore this change flipping hue/saturation from undefined to a very tiny value would still be represented in color picker.
ImGuiContext& g = *GImGui;
- if (g.ColorEditLastColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)))
+ IM_ASSERT(g.ColorEditCurrentID != 0);
+ if (g.ColorEditSavedID != g.ColorEditCurrentID || g.ColorEditSavedColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)))
return;
// When S == 0, H is undefined.
// When H == 1 it wraps around to 0.
- if (*S == 0.0f || (*H == 0.0f && g.ColorEditLastHue == 1))
- *H = g.ColorEditLastHue;
+ if (*S == 0.0f || (*H == 0.0f && g.ColorEditSavedHue == 1))
+ *H = g.ColorEditSavedHue;
// When V == 0, S is undefined.
if (*V == 0.0f)
- *S = g.ColorEditLastSat;
+ *S = g.ColorEditSavedSat;
}
// Edit colors components (each component in 0.0f..1.0f range).
// See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set.
-// With typical options: Left-click on color square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item.
+// With typical options: Left-click on color square to open color picker. Right-click to open option menu. CTRL+Click over input fields to edit them and TAB to go to next item.
bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -4953,14 +5517,15 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const float square_sz = GetFrameHeight();
- const float w_full = CalcItemWidth();
- const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x);
- const float w_inputs = w_full - w_button;
const char* label_display_end = FindRenderedTextEnd(label);
+ float w_full = CalcItemWidth();
g.NextItemData.ClearFlags();
BeginGroup();
PushID(label);
+ const bool set_current_color_edit_id = (g.ColorEditCurrentID == 0);
+ if (set_current_color_edit_id)
+ g.ColorEditCurrentID = window->IDStack.back();
// If we're not showing any slider there's no point in doing any HSV conversions
const ImGuiColorEditFlags flags_untouched = flags;
@@ -4987,6 +5552,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0;
const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0;
const int components = alpha ? 4 : 3;
+ const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x);
+ const float w_inputs = ImMax(w_full - w_button, 1.0f);
+ w_full = w_inputs + w_button;
// Convert to the formats we need
float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f };
@@ -4994,7 +5562,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]);
else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV))
{
- // Hue is lost when converting from greyscale rgb (saturation=0). Restore it.
+ // Hue is lost when converting from grayscale rgb (saturation=0). Restore it.
ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]);
ColorEditRestoreHS(col, &f[0], &f[1], &f[2]);
}
@@ -5010,10 +5578,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)
{
// RGB/HSV 0..255 Sliders
- const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components));
- const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1)));
+ const float w_items = w_inputs - style.ItemInnerSpacing.x * (components - 1);
- const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x);
+ const bool hide_prefix = (IM_TRUNC(w_items / components) <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x);
static const char* ids[4] = { "##X", "##Y", "##Z", "##W" };
static const char* fmt_table_int[3][4] =
{
@@ -5029,11 +5596,14 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
};
const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1;
+ float prev_split = 0.0f;
for (int n = 0; n < components; n++)
{
if (n > 0)
SameLine(0, style.ItemInnerSpacing.x);
- SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last);
+ float next_split = IM_TRUNC(w_items * (n + 1) / components);
+ SetNextItemWidth(ImMax(next_split - prev_split, 1.0f));
+ prev_split = next_split;
// FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0.
if (flags & ImGuiColorEditFlags_Float)
@@ -5058,7 +5628,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
else
ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255));
SetNextItemWidth(w_inputs);
- if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase))
+ if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsUppercase))
{
value_changed = true;
char* p = buf;
@@ -5133,10 +5703,11 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
f[n] = i[n] / 255.0f;
if ((flags & ImGuiColorEditFlags_DisplayHSV) && (flags & ImGuiColorEditFlags_InputRGB))
{
- g.ColorEditLastHue = f[0];
- g.ColorEditLastSat = f[1];
+ g.ColorEditSavedHue = f[0];
+ g.ColorEditSavedSat = f[1];
ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]);
- g.ColorEditLastColor = ColorConvertFloat4ToU32(ImVec4(f[0], f[1], f[2], 0));
+ g.ColorEditSavedID = g.ColorEditCurrentID;
+ g.ColorEditSavedColor = ColorConvertFloat4ToU32(ImVec4(f[0], f[1], f[2], 0));
}
if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV))
ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]);
@@ -5148,12 +5719,14 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
col[3] = f[3];
}
+ if (set_current_color_edit_id)
+ g.ColorEditCurrentID = 0;
PopID();
EndGroup();
// Drag and Drop Target
// NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test.
- if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget())
+ if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(g.LastItemData.ItemFlags & ImGuiItemFlags_ReadOnly) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget())
{
bool accepted_drag_drop = false;
if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
@@ -5218,9 +5791,13 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
ImGuiIO& io = g.IO;
const float width = CalcItemWidth();
+ const bool is_readonly = ((g.NextItemData.ItemFlags | g.CurrentItemFlags) & ImGuiItemFlags_ReadOnly) != 0;
g.NextItemData.ClearFlags();
PushID(label);
+ const bool set_current_color_edit_id = (g.ColorEditCurrentID == 0);
+ if (set_current_color_edit_id)
+ g.ColorEditCurrentID = window->IDStack.back();
BeginGroup();
if (!(flags & ImGuiColorEditFlags_NoSidePreview))
@@ -5249,7 +5826,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box
float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x;
float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x;
- float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f);
+ float bars_triangles_half_sz = IM_TRUNC(bars_width * 0.20f);
float backup_initial_col[4];
memcpy(backup_initial_col, col, components * sizeof(float));
@@ -5269,7 +5846,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
float R = col[0], G = col[1], B = col[2];
if (flags & ImGuiColorEditFlags_InputRGB)
{
- // Hue is lost when converting from greyscale rgb (saturation=0). Restore it.
+ // Hue is lost when converting from grayscale rgb (saturation=0). Restore it.
ColorConvertRGBtoHSV(R, G, B, H, S, V);
ColorEditRestoreHS(col, &H, &S, &V);
}
@@ -5285,7 +5862,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
{
// Hue wheel + SV triangle logic
InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size));
- if (IsItemActive())
+ if (IsItemActive() && !is_readonly)
{
ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center;
ImVec2 current_off = g.IO.MousePos - wheel_center;
@@ -5320,14 +5897,11 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
{
// SV rectangle logic
InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size));
- if (IsItemActive())
+ if (IsItemActive() && !is_readonly)
{
S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1));
V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1));
-
- // Greatly reduces hue jitter and reset to 0 when hue == 255 and color is rapidly modified using SV square.
- if (g.ColorEditLastColor == ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)))
- H = g.ColorEditLastHue;
+ ColorEditRestoreH(col, &H); // Greatly reduces hue jitter and reset to 0 when hue == 255 and color is rapidly modified using SV square.
value_changed = value_changed_sv = true;
}
if (!(flags & ImGuiColorEditFlags_NoOptions))
@@ -5336,7 +5910,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
// Hue bar logic
SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y));
InvisibleButton("hue", ImVec2(bars_width, sv_picker_size));
- if (IsItemActive())
+ if (IsItemActive() && !is_readonly)
{
H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1));
value_changed = value_changed_h = true;
@@ -5380,7 +5954,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
if ((flags & ImGuiColorEditFlags_NoLabel))
Text("Current");
- ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip;
+ ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaMask_ | ImGuiColorEditFlags_NoTooltip;
ColorButton("##current", col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2));
if (ref_col != NULL)
{
@@ -5402,9 +5976,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
if (flags & ImGuiColorEditFlags_InputRGB)
{
ColorConvertHSVtoRGB(H, S, V, col[0], col[1], col[2]);
- g.ColorEditLastHue = H;
- g.ColorEditLastSat = S;
- g.ColorEditLastColor = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0));
+ g.ColorEditSavedHue = H;
+ g.ColorEditSavedSat = S;
+ g.ColorEditSavedID = g.ColorEditCurrentID;
+ g.ColorEditSavedColor = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0));
}
else if (flags & ImGuiColorEditFlags_InputHSV)
{
@@ -5419,7 +5994,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
if ((flags & ImGuiColorEditFlags_NoInputs) == 0)
{
PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x);
- ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf;
+ ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaMask_ | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSmallPreview;
ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker;
if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0)
if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB))
@@ -5506,7 +6081,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
float sin_hue_angle = ImSin(H * 2.0f * IM_PI);
ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f);
float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f;
- int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32);
+ int hue_cursor_segments = draw_list->_CalcCircleAutoSegmentCount(hue_cursor_rad); // Lock segment count so the +1 one matches others.
draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments);
draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad + 1, col_midgrey, hue_cursor_segments);
draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, col_white, hue_cursor_segments);
@@ -5516,13 +6091,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
ImVec2 trb = wheel_center + ImRotate(triangle_pb, cos_hue_angle, sin_hue_angle);
ImVec2 trc = wheel_center + ImRotate(triangle_pc, cos_hue_angle, sin_hue_angle);
ImVec2 uv_white = GetFontTexUvWhitePixel();
- draw_list->PrimReserve(6, 6);
+ draw_list->PrimReserve(3, 3);
draw_list->PrimVtx(tra, uv_white, hue_color32);
- draw_list->PrimVtx(trb, uv_white, hue_color32);
- draw_list->PrimVtx(trc, uv_white, col_white);
- draw_list->PrimVtx(tra, uv_white, 0);
draw_list->PrimVtx(trb, uv_white, col_black);
- draw_list->PrimVtx(trc, uv_white, 0);
+ draw_list->PrimVtx(trc, uv_white, col_white);
draw_list->AddTriangle(tra, trb, trc, col_midgrey, 1.5f);
sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V));
}
@@ -5544,10 +6116,11 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
}
// Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range)
- float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f;
- draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, 12);
- draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, 12);
- draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, 12);
+ float sv_cursor_rad = value_changed_sv ? wheel_thickness * 0.55f : wheel_thickness * 0.40f;
+ int sv_cursor_segments = draw_list->_CalcCircleAutoSegmentCount(sv_cursor_rad); // Lock segment count so the +1 one matches others.
+ draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, sv_cursor_segments);
+ draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, sv_cursor_segments);
+ draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, sv_cursor_segments);
// Render alpha bar
if (alpha_bar)
@@ -5568,6 +6141,8 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
if (value_changed && g.LastItemData.ID != 0) // In case of ID collision, the second EndGroup() won't catch g.ActiveId
MarkItemEdited(g.LastItemData.ID);
+ if (set_current_color_edit_id)
+ g.ColorEditCurrentID = 0;
PopID();
return value_changed;
@@ -5595,8 +6170,8 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held);
- if (flags & ImGuiColorEditFlags_NoAlpha)
- flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf);
+ if (flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaOpaque))
+ flags &= ~(ImGuiColorEditFlags_AlphaNoBg | ImGuiColorEditFlags_AlphaPreviewHalf);
ImVec4 col_rgb = col;
if (flags & ImGuiColorEditFlags_InputHSV)
@@ -5615,25 +6190,28 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl
if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f)
{
float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f);
- RenderColorRectWithAlphaCheckerboard(window->DrawList, ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawFlags_RoundCornersRight);
+ if ((flags & ImGuiColorEditFlags_AlphaNoBg) == 0)
+ RenderColorRectWithAlphaCheckerboard(window->DrawList, ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawFlags_RoundCornersRight);
+ else
+ window->DrawList->AddRectFilled(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), rounding, ImDrawFlags_RoundCornersRight);
window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawFlags_RoundCornersLeft);
}
else
{
// Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha
- ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col_rgb : col_rgb_without_alpha;
- if (col_source.w < 1.0f)
+ ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaOpaque) ? col_rgb_without_alpha : col_rgb;
+ if (col_source.w < 1.0f && (flags & ImGuiColorEditFlags_AlphaNoBg) == 0)
RenderColorRectWithAlphaCheckerboard(window->DrawList, bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding);
else
window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding);
}
- RenderNavHighlight(bb, id);
+ RenderNavCursor(bb, id);
if ((flags & ImGuiColorEditFlags_NoBorder) == 0)
{
if (g.Style.FrameBorderSize > 0.0f)
RenderFrameBorder(bb.Min, bb.Max, rounding);
else
- window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border
+ window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color buttons are often in need of some sort of border
}
// Drag and Drop Source
@@ -5651,8 +6229,8 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl
}
// Tooltip
- if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered)
- ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf));
+ if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered && IsItemHovered(ImGuiHoveredFlags_ForTooltip))
+ ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_AlphaMask_));
return pressed;
}
@@ -5681,7 +6259,8 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags
{
ImGuiContext& g = *GImGui;
- BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None);
+ if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePrevious, ImGuiWindowFlags_None))
+ return;
const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text;
if (text_end > text)
{
@@ -5692,7 +6271,8 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags
ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2);
ImVec4 cf(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]);
int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]);
- ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz);
+ ImGuiColorEditFlags flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_AlphaMask_;
+ ColorButton("##preview", cf, (flags & flags_to_forward) | ImGuiColorEditFlags_NoTooltip, sz);
SameLine();
if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags_InputMask_))
{
@@ -5717,7 +6297,9 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags)
bool allow_opt_datatype = !(flags & ImGuiColorEditFlags_DataTypeMask_);
if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context"))
return;
+
ImGuiContext& g = *GImGui;
+ PushItemFlag(ImGuiItemFlags_NoMarkEdited, true);
ImGuiColorEditFlags opts = g.ColorEditOptions;
if (allow_opt_inputs)
{
@@ -5759,6 +6341,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags)
}
g.ColorEditOptions = opts;
+ PopItemFlag();
EndPopup();
}
@@ -5768,7 +6351,9 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl
bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar);
if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context"))
return;
+
ImGuiContext& g = *GImGui;
+ PushItemFlag(ImGuiItemFlags_NoMarkEdited, true);
if (allow_opt_picker)
{
ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function
@@ -5797,6 +6382,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl
if (allow_opt_picker) Separator();
CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar);
}
+ PopItemFlag();
EndPopup();
}
@@ -5838,7 +6424,8 @@ bool ImGui::TreeNode(const char* label)
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
- return TreeNodeBehavior(window->GetID(label), 0, label, NULL);
+ ImGuiID id = window->GetID(label);
+ return TreeNodeBehavior(id, ImGuiTreeNodeFlags_None, label, NULL);
}
bool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args)
@@ -5856,8 +6443,8 @@ bool ImGui::TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags)
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
-
- return TreeNodeBehavior(window->GetID(label), flags, label, NULL);
+ ImGuiID id = window->GetID(label);
+ return TreeNodeBehavior(id, flags, label, NULL);
}
bool ImGui::TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...)
@@ -5884,9 +6471,10 @@ bool ImGui::TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char
if (window->SkipItems)
return false;
+ ImGuiID id = window->GetID(str_id);
const char* label, *label_end;
ImFormatStringToTempBufferV(&label, &label_end, fmt, args);
- return TreeNodeBehavior(window->GetID(str_id), flags, label, label_end);
+ return TreeNodeBehavior(id, flags, label, label_end);
}
bool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args)
@@ -5895,44 +6483,52 @@ bool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char
if (window->SkipItems)
return false;
+ ImGuiID id = window->GetID(ptr_id);
const char* label, *label_end;
ImFormatStringToTempBufferV(&label, &label_end, fmt, args);
- return TreeNodeBehavior(window->GetID(ptr_id), flags, label, label_end);
+ return TreeNodeBehavior(id, flags, label, label_end);
+}
+
+bool ImGui::TreeNodeGetOpen(ImGuiID storage_id)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiStorage* storage = g.CurrentWindow->DC.StateStorage;
+ return storage->GetInt(storage_id, 0) != 0;
}
-void ImGui::TreeNodeSetOpen(ImGuiID id, bool open)
+void ImGui::TreeNodeSetOpen(ImGuiID storage_id, bool open)
{
ImGuiContext& g = *GImGui;
ImGuiStorage* storage = g.CurrentWindow->DC.StateStorage;
- storage->SetInt(id, open ? 1 : 0);
+ storage->SetInt(storage_id, open ? 1 : 0);
}
-bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
+bool ImGui::TreeNodeUpdateNextOpen(ImGuiID storage_id, ImGuiTreeNodeFlags flags)
{
if (flags & ImGuiTreeNodeFlags_Leaf)
return true;
- // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function)
+ // We only write to the tree storage if the user clicks, or explicitly use the SetNextItemOpen function
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
ImGuiStorage* storage = window->DC.StateStorage;
bool is_open;
- if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen)
+ if (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasOpen)
{
if (g.NextItemData.OpenCond & ImGuiCond_Always)
{
is_open = g.NextItemData.OpenVal;
- TreeNodeSetOpen(id, is_open);
+ TreeNodeSetOpen(storage_id, is_open);
}
else
{
// We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently.
- const int stored_value = storage->GetInt(id, -1);
+ const int stored_value = storage->GetInt(storage_id, -1);
if (stored_value == -1)
{
is_open = g.NextItemData.OpenVal;
- TreeNodeSetOpen(id, is_open);
+ TreeNodeSetOpen(storage_id, is_open);
}
else
{
@@ -5942,7 +6538,7 @@ bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
}
else
{
- is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0;
+ is_open = storage->GetInt(storage_id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0;
}
// When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).
@@ -5953,6 +6549,23 @@ bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
return is_open;
}
+// Store ImGuiTreeNodeStackData for just submitted node.
+// Currently only supports 32 level deep and we are fine with (1 << Depth) overflowing into a zero, easy to increase.
+static void TreeNodeStoreStackData(ImGuiTreeNodeFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ g.TreeNodeStack.resize(g.TreeNodeStack.Size + 1);
+ ImGuiTreeNodeStackData* tree_node_data = &g.TreeNodeStack.back();
+ tree_node_data->ID = g.LastItemData.ID;
+ tree_node_data->TreeFlags = flags;
+ tree_node_data->ItemFlags = g.LastItemData.ItemFlags;
+ tree_node_data->NavRect = g.LastItemData.NavRect;
+ window->DC.TreeHasStackDataDepthMask |= (1 << window->DC.TreeDepth);
+}
+
+// When using public API, currently 'id == storage_id' is always true, but we separate the values to facilitate advanced user code doing storage queries outside of UI loop.
bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -5968,55 +6581,90 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
label_end = FindRenderedTextEnd(label);
const ImVec2 label_size = CalcTextSize(label, label_end, false);
+ const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapsing arrow width + Spacing
+ const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it
+ const float text_width = g.FontSize + label_size.x + padding.x * 2; // Include collapsing arrow
+
// We vertically grow up to current line height up the typical widget height.
const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2);
+ const bool span_all_columns = (flags & ImGuiTreeNodeFlags_SpanAllColumns) != 0 && (g.CurrentTable != NULL);
+ const bool span_all_columns_label = (flags & ImGuiTreeNodeFlags_LabelSpanAllColumns) != 0 && (g.CurrentTable != NULL);
ImRect frame_bb;
- frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x;
+ frame_bb.Min.x = span_all_columns ? window->ParentWorkRect.Min.x : (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x;
frame_bb.Min.y = window->DC.CursorPos.y;
- frame_bb.Max.x = window->WorkRect.Max.x;
+ frame_bb.Max.x = span_all_columns ? window->ParentWorkRect.Max.x : (flags & ImGuiTreeNodeFlags_SpanLabelWidth) ? window->DC.CursorPos.x + text_width + padding.x : window->WorkRect.Max.x;
frame_bb.Max.y = window->DC.CursorPos.y + frame_height;
if (display_frame)
{
- // Framed header expand a little outside the default padding, to the edge of InnerClipRect
- // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f)
- frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f);
- frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f);
+ const float outer_extend = IM_TRUNC(window->WindowPadding.x * 0.5f); // Framed header expand a little outside of current limits
+ frame_bb.Min.x -= outer_extend;
+ frame_bb.Max.x += outer_extend;
}
- const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing
- const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it
- const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser
ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y);
ItemSize(ImVec2(text_width, frame_height), padding.y);
// For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing
ImRect interact_bb = frame_bb;
- if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0)
- interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f;
+ if ((flags & (ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_SpanLabelWidth | ImGuiTreeNodeFlags_SpanAllColumns)) == 0)
+ interact_bb.Max.x = frame_bb.Min.x + text_width + (label_size.x > 0.0f ? style.ItemSpacing.x * 2.0f : 0.0f);
- // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child.
- // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop().
- // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero.
- const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0;
- bool is_open = TreeNodeUpdateNextOpen(id, flags);
- if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
- window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth);
+ // Compute open and multi-select states before ItemAdd() as it clear NextItem data.
+ ImGuiID storage_id = (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasStorageID) ? g.NextItemData.StorageId : id;
+ bool is_open = TreeNodeUpdateNextOpen(storage_id, flags);
- bool item_add = ItemAdd(interact_bb, id);
+ bool is_visible;
+ if (span_all_columns || span_all_columns_label)
+ {
+ // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable..
+ const float backup_clip_rect_min_x = window->ClipRect.Min.x;
+ const float backup_clip_rect_max_x = window->ClipRect.Max.x;
+ window->ClipRect.Min.x = window->ParentWorkRect.Min.x;
+ window->ClipRect.Max.x = window->ParentWorkRect.Max.x;
+ is_visible = ItemAdd(interact_bb, id);
+ window->ClipRect.Min.x = backup_clip_rect_min_x;
+ window->ClipRect.Max.x = backup_clip_rect_max_x;
+ }
+ else
+ {
+ is_visible = ItemAdd(interact_bb, id);
+ }
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect;
g.LastItemData.DisplayRect = frame_bb;
- if (!item_add)
+ // If a NavLeft request is happening and ImGuiTreeNodeFlags_NavLeftJumpsBackHere enabled:
+ // Store data for the current depth to allow returning to this node from any child item.
+ // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop().
+ // It will become tempting to enable ImGuiTreeNodeFlags_NavLeftJumpsBackHere by default or move it to ImGuiStyle.
+ bool store_tree_node_stack_data = false;
+ if (!(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
+ {
+ if ((flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && is_open && !g.NavIdIsAlive)
+ if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet())
+ store_tree_node_stack_data = true;
+ }
+
+ const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0;
+ if (!is_visible)
{
+ if (store_tree_node_stack_data && is_open)
+ TreeNodeStoreStackData(flags); // Call before TreePushOverrideID()
if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
TreePushOverrideID(id);
IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0));
return is_open;
}
+ if (span_all_columns || span_all_columns_label)
+ {
+ TablePushBackgroundChannel();
+ g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasClipRect;
+ g.LastItemData.ClipRect = window->ClipRect;
+ }
+
ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None;
- if (flags & ImGuiTreeNodeFlags_AllowItemOverlap)
- button_flags |= ImGuiButtonFlags_AllowItemOverlap;
+ if ((flags & ImGuiTreeNodeFlags_AllowOverlap) || (g.LastItemData.ItemFlags & ImGuiItemFlags_AllowOverlap))
+ button_flags |= ImGuiButtonFlags_AllowOverlap;
if (!is_leaf)
button_flags |= ImGuiButtonFlags_PressedOnDragDropHold;
@@ -6026,8 +6674,10 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
const float arrow_hit_x1 = (text_pos.x - text_offset_x) - style.TouchExtraPadding.x;
const float arrow_hit_x2 = (text_pos.x - text_offset_x) + (g.FontSize + padding.x * 2.0f) + style.TouchExtraPadding.x;
const bool is_mouse_x_over_arrow = (g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2);
- if (window != g.HoveredWindow || !is_mouse_x_over_arrow)
- button_flags |= ImGuiButtonFlags_NoKeyModifiers;
+
+ const bool is_multi_select = (g.LastItemData.ItemFlags & ImGuiItemFlags_IsMultiSelect) != 0;
+ if (is_multi_select) // We absolutely need to distinguish open vs select so _OpenOnArrow comes by default
+ flags |= (flags & ImGuiTreeNodeFlags_OpenOnMask_) == 0 ? ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick : ImGuiTreeNodeFlags_OpenOnArrow;
// Open behaviors can be altered with the _OpenOnArrow and _OnOnDoubleClick flags.
// Some alteration have subtle effects (e.g. toggle on MouseUp vs MouseDown events) due to requirements for multi-selection and drag and drop support.
@@ -6048,6 +6698,20 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0;
const bool was_selected = selected;
+ // Multi-selection support (header)
+ if (is_multi_select)
+ {
+ // Handle multi-select + alter button flags for it
+ MultiSelectItemHeader(id, &selected, &button_flags);
+ if (is_mouse_x_over_arrow)
+ button_flags = (button_flags | ImGuiButtonFlags_PressedOnClick) & ~ImGuiButtonFlags_PressedOnClickRelease;
+ }
+ else
+ {
+ if (window != g.HoveredWindow || !is_mouse_x_over_arrow)
+ button_flags |= ImGuiButtonFlags_NoKeyModsAllowed;
+ }
+
bool hovered, held;
bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
bool toggled = false;
@@ -6055,87 +6719,113 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
{
if (pressed && g.DragDropHoldJustPressedId != id)
{
- if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id))
- toggled = true;
+ if ((flags & ImGuiTreeNodeFlags_OpenOnMask_) == 0 || (g.NavActivateId == id && !is_multi_select))
+ toggled = true; // Single click
if (flags & ImGuiTreeNodeFlags_OpenOnArrow)
- toggled |= is_mouse_x_over_arrow && !g.NavDisableMouseHover; // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job
+ toggled |= is_mouse_x_over_arrow && !g.NavHighlightItemUnderNav; // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job
if ((flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) && g.IO.MouseClickedCount[0] == 2)
- toggled = true;
+ toggled = true; // Double click
}
else if (pressed && g.DragDropHoldJustPressedId == id)
{
IM_ASSERT(button_flags & ImGuiButtonFlags_PressedOnDragDropHold);
if (!is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again.
toggled = true;
+ else
+ pressed = false; // Cancel press so it doesn't trigger selection.
}
if (g.NavId == id && g.NavMoveDir == ImGuiDir_Left && is_open)
{
toggled = true;
+ NavClearPreferredPosForAxis(ImGuiAxis_X);
NavMoveRequestCancel();
}
if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right && !is_open) // If there's something upcoming on the line we may want to give it the priority?
{
toggled = true;
+ NavClearPreferredPosForAxis(ImGuiAxis_X);
NavMoveRequestCancel();
}
if (toggled)
{
is_open = !is_open;
- window->DC.StateStorage->SetInt(id, is_open);
+ window->DC.StateStorage->SetInt(storage_id, is_open);
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledOpen;
}
}
- if (flags & ImGuiTreeNodeFlags_AllowItemOverlap)
- SetItemAllowOverlap();
- // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger.
- if (selected != was_selected) //-V547
+ // Multi-selection support (footer)
+ if (is_multi_select)
+ {
+ bool pressed_copy = pressed && !toggled;
+ MultiSelectItemFooter(id, &selected, &pressed_copy);
+ if (pressed)
+ SetNavID(id, window->DC.NavLayerCurrent, g.CurrentFocusScopeId, interact_bb);
+ }
+
+ if (selected != was_selected)
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection;
// Render
- const ImU32 text_col = GetColorU32(ImGuiCol_Text);
- ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin;
- if (display_frame)
- {
- // Framed type
- const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding);
- RenderNavHighlight(frame_bb, id, nav_highlight_flags);
- if (flags & ImGuiTreeNodeFlags_Bullet)
- RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col);
- else if (!is_leaf)
- RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f);
- else // Leaf without bullet, left-adjusted text
- text_pos.x -= text_offset_x;
- if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton)
- frame_bb.Max.x -= g.FontSize + style.FramePadding.x;
-
- if (g.LogEnabled)
- LogSetNextTextDecoration("###", "###");
- RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size);
- }
- else
{
- // Unframed typed for tree nodes
- if (hovered || selected)
+ const ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ ImGuiNavRenderCursorFlags nav_render_cursor_flags = ImGuiNavRenderCursorFlags_Compact;
+ if (is_multi_select)
+ nav_render_cursor_flags |= ImGuiNavRenderCursorFlags_AlwaysDraw; // Always show the nav rectangle
+ if (display_frame)
{
+ // Framed type
const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false);
+ RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding);
+ RenderNavCursor(frame_bb, id, nav_render_cursor_flags);
+ if (flags & ImGuiTreeNodeFlags_Bullet)
+ RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col);
+ else if (!is_leaf)
+ RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 1.0f);
+ else // Leaf without bullet, left-adjusted text
+ text_pos.x -= text_offset_x - padding.x;
+ if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton)
+ frame_bb.Max.x -= g.FontSize + style.FramePadding.x;
+ if (g.LogEnabled)
+ LogSetNextTextDecoration("###", "###");
}
- RenderNavHighlight(frame_bb, id, nav_highlight_flags);
- if (flags & ImGuiTreeNodeFlags_Bullet)
- RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col);
- else if (!is_leaf)
- RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f);
- if (g.LogEnabled)
- LogSetNextTextDecoration(">", NULL);
- RenderText(text_pos, label, label_end, false);
+ else
+ {
+ // Unframed typed for tree nodes
+ if (hovered || selected)
+ {
+ const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false);
+ }
+ RenderNavCursor(frame_bb, id, nav_render_cursor_flags);
+ if (flags & ImGuiTreeNodeFlags_Bullet)
+ RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col);
+ else if (!is_leaf)
+ RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 0.70f);
+ if (g.LogEnabled)
+ LogSetNextTextDecoration(">", NULL);
+ }
+
+ if (span_all_columns && !span_all_columns_label)
+ TablePopBackgroundChannel();
+
+ // Label
+ if (display_frame)
+ RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size);
+ else
+ RenderText(text_pos, label, label_end, false);
+
+ if (span_all_columns_label)
+ TablePopBackgroundChannel();
}
+ if (store_tree_node_stack_data && is_open)
+ TreeNodeStoreStackData(flags); // Call before TreePushOverrideID()
if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
- TreePushOverrideID(id);
+ TreePushOverrideID(id); // Could use TreePush(label) but this avoid computing twice
+
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0));
return is_open;
}
@@ -6174,14 +6864,19 @@ void ImGui::TreePop()
window->DC.TreeDepth--;
ImU32 tree_depth_mask = (1 << window->DC.TreeDepth);
- // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled)
- if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet())
- if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask))
+ if (window->DC.TreeHasStackDataDepthMask & tree_depth_mask) // Only set during request
+ {
+ ImGuiTreeNodeStackData* data = &g.TreeNodeStack.back();
+ IM_ASSERT(data->ID == window->IDStack.back());
+ if (data->TreeFlags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere)
{
- SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect());
- NavMoveRequestCancel();
+ // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled)
+ if (g.NavIdIsAlive && g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet())
+ NavMoveRequestResolveWithPastTreeNode(&g.NavMoveResultLocal, data);
}
- window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1;
+ g.TreeNodeStack.pop_back();
+ window->DC.TreeHasStackDataDepthMask &= ~tree_depth_mask;
+ }
IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much.
PopID();
@@ -6200,9 +6895,19 @@ void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond)
ImGuiContext& g = *GImGui;
if (g.CurrentWindow->SkipItems)
return;
- g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen;
+ g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasOpen;
g.NextItemData.OpenVal = is_open;
- g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always;
+ g.NextItemData.OpenCond = (ImU8)(cond ? cond : ImGuiCond_Always);
+}
+
+// Set next TreeNode/CollapsingHeader storage id.
+void ImGui::SetNextItemStorageID(ImGuiID storage_id)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.CurrentWindow->SkipItems)
+ return;
+ g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasStorageID;
+ g.NextItemData.StorageId = storage_id;
}
// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag).
@@ -6212,8 +6917,8 @@ bool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags)
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
-
- return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader, label);
+ ImGuiID id = window->GetID(label);
+ return TreeNodeBehavior(id, flags | ImGuiTreeNodeFlags_CollapsingHeader, label);
}
// p_visible == NULL : regular collapsing header
@@ -6232,7 +6937,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl
ImGuiID id = window->GetID(label);
flags |= ImGuiTreeNodeFlags_CollapsingHeader;
if (p_visible)
- flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton;
+ flags |= ImGuiTreeNodeFlags_AllowOverlap | (ImGuiTreeNodeFlags)ImGuiTreeNodeFlags_ClipLabelForTrailingButton;
bool is_open = TreeNodeBehavior(id, flags, label);
if (p_visible != NULL)
{
@@ -6242,8 +6947,8 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl
ImGuiContext& g = *GImGui;
ImGuiLastItemData last_item_backup = g.LastItemData;
float button_size = g.FontSize;
- float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size);
- float button_y = g.LastItemData.Rect.Min.y;
+ float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x - button_size);
+ float button_y = g.LastItemData.Rect.Min.y + g.Style.FramePadding.y;
ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id);
if (CloseButton(close_button_id, ImVec2(button_x, button_y)))
*p_visible = false;
@@ -6261,7 +6966,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl
// Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image.
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id.
-// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags.
+// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowOverlap are also frequently used flags.
// FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported.
bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
{
@@ -6288,18 +6993,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth))
size.x = ImMax(label_size.x, max_x - min_x);
- // Text stays at the submission position, but bounding box may be extended on both sides
- const ImVec2 text_min = pos;
- const ImVec2 text_max(min_x + size.x, pos.y + size.y);
-
// Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable.
- ImRect bb(min_x, pos.y, text_max.x, text_max.y);
+ // FIXME: Not part of layout so not included in clipper calculation, but ItemSize currently doesn't allow offsetting CursorPos.
+ ImRect bb(min_x, pos.y, min_x + size.x, pos.y + size.y);
if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0)
{
const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x;
const float spacing_y = style.ItemSpacing.y;
- const float spacing_L = IM_FLOOR(spacing_x * 0.50f);
- const float spacing_U = IM_FLOOR(spacing_y * 0.50f);
+ const float spacing_L = IM_TRUNC(spacing_x * 0.50f);
+ const float spacing_U = IM_TRUNC(spacing_y * 0.50f);
bb.Min.x -= spacing_L;
bb.Min.y -= spacing_U;
bb.Max.x += (spacing_x - spacing_L);
@@ -6307,25 +7009,29 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
}
//if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); }
- // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable..
- const float backup_clip_rect_min_x = window->ClipRect.Min.x;
- const float backup_clip_rect_max_x = window->ClipRect.Max.x;
+ const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0;
+ const ImGuiItemFlags extra_item_flags = disabled_item ? (ImGuiItemFlags)ImGuiItemFlags_Disabled : ImGuiItemFlags_None;
+ bool is_visible;
if (span_all_columns)
{
+ // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable..
+ const float backup_clip_rect_min_x = window->ClipRect.Min.x;
+ const float backup_clip_rect_max_x = window->ClipRect.Max.x;
window->ClipRect.Min.x = window->ParentWorkRect.Min.x;
window->ClipRect.Max.x = window->ParentWorkRect.Max.x;
- }
-
- const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0;
- const bool item_add = ItemAdd(bb, id, NULL, disabled_item ? ImGuiItemFlags_Disabled : ImGuiItemFlags_None);
- if (span_all_columns)
- {
+ is_visible = ItemAdd(bb, id, NULL, extra_item_flags);
window->ClipRect.Min.x = backup_clip_rect_min_x;
window->ClipRect.Max.x = backup_clip_rect_max_x;
}
+ else
+ {
+ is_visible = ItemAdd(bb, id, NULL, extra_item_flags);
+ }
- if (!item_add)
- return false;
+ const bool is_multi_select = (g.LastItemData.ItemFlags & ImGuiItemFlags_IsMultiSelect) != 0;
+ if (!is_visible)
+ if (!is_multi_select || !g.BoxSelectState.UnclipMode || !g.BoxSelectState.UnclipRect.Overlaps(bb)) // Extra layer of "no logic clip" for box-select support (would be more overhead to add to ItemAdd)
+ return false;
const bool disabled_global = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0;
if (disabled_item && !disabled_global) // Only testing this as an optimization
@@ -6333,10 +7039,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
// FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only,
// which would be advantageous since most selectable are not selected.
- if (span_all_columns && window->DC.CurrentColumns)
- PushColumnsBackground();
- else if (span_all_columns && g.CurrentTable)
- TablePushBackgroundChannel();
+ if (span_all_columns)
+ {
+ if (g.CurrentTable)
+ TablePushBackgroundChannel();
+ else if (window->DC.CurrentColumns)
+ PushColumnsBackground();
+ g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasClipRect;
+ g.LastItemData.ClipRect = window->ClipRect;
+ }
// We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries
ImGuiButtonFlags button_flags = 0;
@@ -6345,66 +7056,95 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; }
if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; }
if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; }
- if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; }
+ if ((flags & ImGuiSelectableFlags_AllowOverlap) || (g.LastItemData.ItemFlags & ImGuiItemFlags_AllowOverlap)) { button_flags |= ImGuiButtonFlags_AllowOverlap; }
+ // Multi-selection support (header)
const bool was_selected = selected;
+ if (is_multi_select)
+ {
+ // Handle multi-select + alter button flags for it
+ MultiSelectItemHeader(id, &selected, &button_flags);
+ }
+
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
- // Auto-select when moved into
- // - This will be more fully fleshed in the range-select branch
- // - This is not exposed as it won't nicely work with some user side handling of shift/control
- // - We cannot do 'if (g.NavJustMovedToId != id) { selected = false; pressed = was_selected; }' for two reasons
- // - (1) it would require focus scope to be set, need exposing PushFocusScope() or equivalent (e.g. BeginSelection() calling PushFocusScope())
- // - (2) usage will fail with clipped items
- // The multi-select API aim to fix those issues, e.g. may be replaced with a BeginSelection() API.
- if ((flags & ImGuiSelectableFlags_SelectOnNav) && g.NavJustMovedToId != 0 && g.NavJustMovedToFocusScopeId == g.CurrentFocusScopeId)
- if (g.NavJustMovedToId == id)
- selected = pressed = true;
-
- // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard
+ // Multi-selection support (footer)
+ if (is_multi_select)
+ {
+ MultiSelectItemFooter(id, &selected, &pressed);
+ }
+ else
+ {
+ // Auto-select when moved into
+ // - This will be more fully fleshed in the range-select branch
+ // - This is not exposed as it won't nicely work with some user side handling of shift/control
+ // - We cannot do 'if (g.NavJustMovedToId != id) { selected = false; pressed = was_selected; }' for two reasons
+ // - (1) it would require focus scope to be set, need exposing PushFocusScope() or equivalent (e.g. BeginSelection() calling PushFocusScope())
+ // - (2) usage will fail with clipped items
+ // The multi-select API aim to fix those issues, e.g. may be replaced with a BeginSelection() API.
+ if ((flags & ImGuiSelectableFlags_SelectOnNav) && g.NavJustMovedToId != 0 && g.NavJustMovedToFocusScopeId == g.CurrentFocusScopeId)
+ if (g.NavJustMovedToId == id)
+ selected = pressed = true;
+ }
+
+ // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with keyboard/gamepad
if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover)))
{
- if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent)
+ if (!g.NavHighlightItemUnderNav && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent)
{
SetNavID(id, window->DC.NavLayerCurrent, g.CurrentFocusScopeId, WindowRectAbsToRel(window, bb)); // (bb == NavRect)
- g.NavDisableHighlight = true;
+ if (g.IO.ConfigNavCursorVisibleAuto)
+ g.NavCursorVisible = false;
}
}
if (pressed)
MarkItemEdited(id);
- if (flags & ImGuiSelectableFlags_AllowItemOverlap)
- SetItemAllowOverlap();
-
- // In this branch, Selectable() cannot toggle the selection so this will never trigger.
- if (selected != was_selected) //-V547
+ if (selected != was_selected)
g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection;
// Render
- if (held && (flags & ImGuiSelectableFlags_DrawHoveredWhenHeld))
- hovered = true;
- if (hovered || selected)
+ if (is_visible)
{
- const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- RenderFrame(bb.Min, bb.Max, col, false, 0.0f);
+ const bool highlighted = hovered || (flags & ImGuiSelectableFlags_Highlight);
+ if (highlighted || selected)
+ {
+ // Between 1.91.0 and 1.91.4 we made selected Selectable use an arbitrary lerp between _Header and _HeaderHovered. Removed that now. (#8106)
+ ImU32 col = GetColorU32((held && highlighted) ? ImGuiCol_HeaderActive : highlighted ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ RenderFrame(bb.Min, bb.Max, col, false, 0.0f);
+ }
+ if (g.NavId == id)
+ {
+ ImGuiNavRenderCursorFlags nav_render_cursor_flags = ImGuiNavRenderCursorFlags_Compact | ImGuiNavRenderCursorFlags_NoRounding;
+ if (is_multi_select)
+ nav_render_cursor_flags |= ImGuiNavRenderCursorFlags_AlwaysDraw; // Always show the nav rectangle
+ RenderNavCursor(bb, id, nav_render_cursor_flags);
+ }
}
- RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding);
- if (span_all_columns && window->DC.CurrentColumns)
- PopColumnsBackground();
- else if (span_all_columns && g.CurrentTable)
- TablePopBackgroundChannel();
+ if (span_all_columns)
+ {
+ if (g.CurrentTable)
+ TablePopBackgroundChannel();
+ else if (window->DC.CurrentColumns)
+ PopColumnsBackground();
+ }
- RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb);
+ // Text stays at the submission position. Alignment/clipping extents ignore SpanAllColumns.
+ if (is_visible)
+ RenderTextClipped(pos, ImVec2(ImMin(pos.x + size.x, window->WorkRect.Max.x), pos.y + size.y), label, NULL, &label_size, style.SelectableTextAlign, &bb);
// Automatically close popups
- if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.LastItemData.InFlags & ImGuiItemFlags_SelectableDontClosePopup))
+ if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_NoAutoClosePopups) && (g.LastItemData.ItemFlags & ImGuiItemFlags_AutoClosePopups))
CloseCurrentPopup();
if (disabled_item && !disabled_global)
EndDisabled();
+ // Selectable() always returns a pressed state!
+ // Users of BeginMultiSelect()/EndMultiSelect() scope: you may call ImGui::IsItemToggledSelection() to retrieve
+ // selection toggle, only useful if you need that state updated (e.g. for rendering purpose) before reaching EndMultiSelect().
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
return pressed; //-V1020
}
@@ -6419,6 +7159,1131 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags
return false;
}
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: Typing-Select support
+//-------------------------------------------------------------------------
+
+// [Experimental] Currently not exposed in public API.
+// Consume character inputs and return search request, if any.
+// This would typically only be called on the focused window or location you want to grab inputs for, e.g.
+// if (ImGui::IsWindowFocused(...))
+// if (ImGuiTypingSelectRequest* req = ImGui::GetTypingSelectRequest())
+// focus_idx = ImGui::TypingSelectFindMatch(req, my_items.size(), [](void*, int n) { return my_items[n]->Name; }, &my_items, -1);
+// However the code is written in a way where calling it from multiple locations is safe (e.g. to obtain buffer).
+ImGuiTypingSelectRequest* ImGui::GetTypingSelectRequest(ImGuiTypingSelectFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiTypingSelectState* data = &g.TypingSelectState;
+ ImGuiTypingSelectRequest* out_request = &data->Request;
+
+ // Clear buffer
+ const float TYPING_SELECT_RESET_TIMER = 1.80f; // FIXME: Potentially move to IO config.
+ const int TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK = 4; // Lock single char matching when repeating same char 4 times
+ if (data->SearchBuffer[0] != 0)
+ {
+ bool clear_buffer = false;
+ clear_buffer |= (g.NavFocusScopeId != data->FocusScope);
+ clear_buffer |= (data->LastRequestTime + TYPING_SELECT_RESET_TIMER < g.Time);
+ clear_buffer |= g.NavAnyRequest;
+ clear_buffer |= g.ActiveId != 0 && g.NavActivateId == 0; // Allow temporary SPACE activation to not interfere
+ clear_buffer |= IsKeyPressed(ImGuiKey_Escape) || IsKeyPressed(ImGuiKey_Enter);
+ clear_buffer |= IsKeyPressed(ImGuiKey_Backspace) && (flags & ImGuiTypingSelectFlags_AllowBackspace) == 0;
+ //if (clear_buffer) { IMGUI_DEBUG_LOG("GetTypingSelectRequest(): Clear SearchBuffer.\n"); }
+ if (clear_buffer)
+ data->Clear();
+ }
+
+ // Append to buffer
+ const int buffer_max_len = IM_ARRAYSIZE(data->SearchBuffer) - 1;
+ int buffer_len = (int)ImStrlen(data->SearchBuffer);
+ bool select_request = false;
+ for (ImWchar w : g.IO.InputQueueCharacters)
+ {
+ const int w_len = ImTextCountUtf8BytesFromStr(&w, &w + 1);
+ if (w < 32 || (buffer_len == 0 && ImCharIsBlankW(w)) || (buffer_len + w_len > buffer_max_len)) // Ignore leading blanks
+ continue;
+ char w_buf[5];
+ ImTextCharToUtf8(w_buf, (unsigned int)w);
+ if (data->SingleCharModeLock && w_len == out_request->SingleCharSize && memcmp(w_buf, data->SearchBuffer, w_len) == 0)
+ {
+ select_request = true; // Same character: don't need to append to buffer.
+ continue;
+ }
+ if (data->SingleCharModeLock)
+ {
+ data->Clear(); // Different character: clear
+ buffer_len = 0;
+ }
+ memcpy(data->SearchBuffer + buffer_len, w_buf, w_len + 1); // Append
+ buffer_len += w_len;
+ select_request = true;
+ }
+ g.IO.InputQueueCharacters.resize(0);
+
+ // Handle backspace
+ if ((flags & ImGuiTypingSelectFlags_AllowBackspace) && IsKeyPressed(ImGuiKey_Backspace, ImGuiInputFlags_Repeat))
+ {
+ char* p = (char*)(void*)ImTextFindPreviousUtf8Codepoint(data->SearchBuffer, data->SearchBuffer + buffer_len);
+ *p = 0;
+ buffer_len = (int)(p - data->SearchBuffer);
+ }
+
+ // Return request if any
+ if (buffer_len == 0)
+ return NULL;
+ if (select_request)
+ {
+ data->FocusScope = g.NavFocusScopeId;
+ data->LastRequestFrame = g.FrameCount;
+ data->LastRequestTime = (float)g.Time;
+ }
+ out_request->Flags = flags;
+ out_request->SearchBufferLen = buffer_len;
+ out_request->SearchBuffer = data->SearchBuffer;
+ out_request->SelectRequest = (data->LastRequestFrame == g.FrameCount);
+ out_request->SingleCharMode = false;
+ out_request->SingleCharSize = 0;
+
+ // Calculate if buffer contains the same character repeated.
+ // - This can be used to implement a special search mode on first character.
+ // - Performed on UTF-8 codepoint for correctness.
+ // - SingleCharMode is always set for first input character, because it usually leads to a "next".
+ if (flags & ImGuiTypingSelectFlags_AllowSingleCharMode)
+ {
+ const char* buf_begin = out_request->SearchBuffer;
+ const char* buf_end = out_request->SearchBuffer + out_request->SearchBufferLen;
+ const int c0_len = ImTextCountUtf8BytesFromChar(buf_begin, buf_end);
+ const char* p = buf_begin + c0_len;
+ for (; p < buf_end; p += c0_len)
+ if (memcmp(buf_begin, p, (size_t)c0_len) != 0)
+ break;
+ const int single_char_count = (p == buf_end) ? (out_request->SearchBufferLen / c0_len) : 0;
+ out_request->SingleCharMode = (single_char_count > 0 || data->SingleCharModeLock);
+ out_request->SingleCharSize = (ImS8)c0_len;
+ data->SingleCharModeLock |= (single_char_count >= TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK); // From now on we stop search matching to lock to single char mode.
+ }
+
+ return out_request;
+}
+
+static int ImStrimatchlen(const char* s1, const char* s1_end, const char* s2)
+{
+ int match_len = 0;
+ while (s1 < s1_end && ImToUpper(*s1++) == ImToUpper(*s2++))
+ match_len++;
+ return match_len;
+}
+
+// Default handler for finding a result for typing-select. You may implement your own.
+// You might want to display a tooltip to visualize the current request SearchBuffer
+// When SingleCharMode is set:
+// - it is better to NOT display a tooltip of other on-screen display indicator.
+// - the index of the currently focused item is required.
+// if your SetNextItemSelectionUserData() values are indices, you can obtain it from ImGuiMultiSelectIO::NavIdItem, otherwise from g.NavLastValidSelectionUserData.
+int ImGui::TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx)
+{
+ if (req == NULL || req->SelectRequest == false) // Support NULL parameter so both calls can be done from same spot.
+ return -1;
+ int idx = -1;
+ if (req->SingleCharMode && (req->Flags & ImGuiTypingSelectFlags_AllowSingleCharMode))
+ idx = TypingSelectFindNextSingleCharMatch(req, items_count, get_item_name_func, user_data, nav_item_idx);
+ else
+ idx = TypingSelectFindBestLeadingMatch(req, items_count, get_item_name_func, user_data);
+ if (idx != -1)
+ SetNavCursorVisibleAfterMove();
+ return idx;
+}
+
+// Special handling when a single character is repeated: perform search on a single letter and goes to next.
+int ImGui::TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx)
+{
+ // FIXME: Assume selection user data is index. Would be extremely practical.
+ //if (nav_item_idx == -1)
+ // nav_item_idx = (int)g.NavLastValidSelectionUserData;
+
+ int first_match_idx = -1;
+ bool return_next_match = false;
+ for (int idx = 0; idx < items_count; idx++)
+ {
+ const char* item_name = get_item_name_func(user_data, idx);
+ if (ImStrimatchlen(req->SearchBuffer, req->SearchBuffer + req->SingleCharSize, item_name) < req->SingleCharSize)
+ continue;
+ if (return_next_match) // Return next matching item after current item.
+ return idx;
+ if (first_match_idx == -1 && nav_item_idx == -1) // Return first match immediately if we don't have a nav_item_idx value.
+ return idx;
+ if (first_match_idx == -1) // Record first match for wrapping.
+ first_match_idx = idx;
+ if (nav_item_idx == idx) // Record that we encountering nav_item so we can return next match.
+ return_next_match = true;
+ }
+ return first_match_idx; // First result
+}
+
+int ImGui::TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data)
+{
+ int longest_match_idx = -1;
+ int longest_match_len = 0;
+ for (int idx = 0; idx < items_count; idx++)
+ {
+ const char* item_name = get_item_name_func(user_data, idx);
+ const int match_len = ImStrimatchlen(req->SearchBuffer, req->SearchBuffer + req->SearchBufferLen, item_name);
+ if (match_len <= longest_match_len)
+ continue;
+ longest_match_idx = idx;
+ longest_match_len = match_len;
+ if (match_len == req->SearchBufferLen)
+ break;
+ }
+ return longest_match_idx;
+}
+
+void ImGui::DebugNodeTypingSelectState(ImGuiTypingSelectState* data)
+{
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ Text("SearchBuffer = \"%s\"", data->SearchBuffer);
+ Text("SingleCharMode = %d, Size = %d, Lock = %d", data->Request.SingleCharMode, data->Request.SingleCharSize, data->SingleCharModeLock);
+ Text("LastRequest = time: %.2f, frame: %d", data->LastRequestTime, data->LastRequestFrame);
+#else
+ IM_UNUSED(data);
+#endif
+}
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: Box-Select support
+// This has been extracted away from Multi-Select logic in the hope that it could eventually be used elsewhere, but hasn't been yet.
+//-------------------------------------------------------------------------
+// Extra logic in MultiSelectItemFooter() and ImGuiListClipper::Step()
+//-------------------------------------------------------------------------
+// - BoxSelectPreStartDrag() [Internal]
+// - BoxSelectActivateDrag() [Internal]
+// - BoxSelectDeactivateDrag() [Internal]
+// - BoxSelectScrollWithMouseDrag() [Internal]
+// - BeginBoxSelect() [Internal]
+// - EndBoxSelect() [Internal]
+//-------------------------------------------------------------------------
+
+// Call on the initial click.
+static void BoxSelectPreStartDrag(ImGuiID id, ImGuiSelectionUserData clicked_item)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiBoxSelectState* bs = &g.BoxSelectState;
+ bs->ID = id;
+ bs->IsStarting = true; // Consider starting box-select.
+ bs->IsStartedFromVoid = (clicked_item == ImGuiSelectionUserData_Invalid);
+ bs->IsStartedSetNavIdOnce = bs->IsStartedFromVoid;
+ bs->KeyMods = g.IO.KeyMods;
+ bs->StartPosRel = bs->EndPosRel = ImGui::WindowPosAbsToRel(g.CurrentWindow, g.IO.MousePos);
+ bs->ScrollAccum = ImVec2(0.0f, 0.0f);
+}
+
+static void BoxSelectActivateDrag(ImGuiBoxSelectState* bs, ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ IMGUI_DEBUG_LOG_SELECTION("[selection] BeginBoxSelect() 0X%08X: Activate\n", bs->ID);
+ bs->IsActive = true;
+ bs->Window = window;
+ bs->IsStarting = false;
+ ImGui::SetActiveID(bs->ID, window);
+ ImGui::SetActiveIdUsingAllKeyboardKeys();
+ if (bs->IsStartedFromVoid && (bs->KeyMods & (ImGuiMod_Ctrl | ImGuiMod_Shift)) == 0)
+ bs->RequestClear = true;
+}
+
+static void BoxSelectDeactivateDrag(ImGuiBoxSelectState* bs)
+{
+ ImGuiContext& g = *GImGui;
+ bs->IsActive = bs->IsStarting = false;
+ if (g.ActiveId == bs->ID)
+ {
+ IMGUI_DEBUG_LOG_SELECTION("[selection] BeginBoxSelect() 0X%08X: Deactivate\n", bs->ID);
+ ImGui::ClearActiveID();
+ }
+ bs->ID = 0;
+}
+
+static void BoxSelectScrollWithMouseDrag(ImGuiBoxSelectState* bs, ImGuiWindow* window, const ImRect& inner_r)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(bs->Window == window);
+ for (int n = 0; n < 2; n++) // each axis
+ {
+ const float mouse_pos = g.IO.MousePos[n];
+ const float dist = (mouse_pos > inner_r.Max[n]) ? mouse_pos - inner_r.Max[n] : (mouse_pos < inner_r.Min[n]) ? mouse_pos - inner_r.Min[n] : 0.0f;
+ const float scroll_curr = window->Scroll[n];
+ if (dist == 0.0f || (dist < 0.0f && scroll_curr < 0.0f) || (dist > 0.0f && scroll_curr >= window->ScrollMax[n]))
+ continue;
+
+ const float speed_multiplier = ImLinearRemapClamp(g.FontSize, g.FontSize * 5.0f, 1.0f, 4.0f, ImAbs(dist)); // x1 to x4 depending on distance
+ const float scroll_step = g.FontSize * 35.0f * speed_multiplier * ImSign(dist) * g.IO.DeltaTime;
+ bs->ScrollAccum[n] += scroll_step;
+
+ // Accumulate into a stored value so we can handle high-framerate
+ const float scroll_step_i = ImFloor(bs->ScrollAccum[n]);
+ if (scroll_step_i == 0.0f)
+ continue;
+ if (n == 0)
+ ImGui::SetScrollX(window, scroll_curr + scroll_step_i);
+ else
+ ImGui::SetScrollY(window, scroll_curr + scroll_step_i);
+ bs->ScrollAccum[n] -= scroll_step_i;
+ }
+}
+
+bool ImGui::BeginBoxSelect(const ImRect& scope_rect, ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiBoxSelectState* bs = &g.BoxSelectState;
+ KeepAliveID(box_select_id);
+ if (bs->ID != box_select_id)
+ return false;
+
+ // IsStarting is set by MultiSelectItemFooter() when considering a possible box-select. We validate it here and lock geometry.
+ bs->UnclipMode = false;
+ bs->RequestClear = false;
+ if (bs->IsStarting && IsMouseDragPastThreshold(0))
+ BoxSelectActivateDrag(bs, window);
+ else if ((bs->IsStarting || bs->IsActive) && g.IO.MouseDown[0] == false)
+ BoxSelectDeactivateDrag(bs);
+ if (!bs->IsActive)
+ return false;
+
+ // Current frame absolute prev/current rectangles are used to toggle selection.
+ // They are derived from positions relative to scrolling space.
+ ImVec2 start_pos_abs = WindowPosRelToAbs(window, bs->StartPosRel);
+ ImVec2 prev_end_pos_abs = WindowPosRelToAbs(window, bs->EndPosRel); // Clamped already
+ ImVec2 curr_end_pos_abs = g.IO.MousePos;
+ if (ms_flags & ImGuiMultiSelectFlags_ScopeWindow) // Box-select scrolling only happens with ScopeWindow
+ curr_end_pos_abs = ImClamp(curr_end_pos_abs, scope_rect.Min, scope_rect.Max);
+ bs->BoxSelectRectPrev.Min = ImMin(start_pos_abs, prev_end_pos_abs);
+ bs->BoxSelectRectPrev.Max = ImMax(start_pos_abs, prev_end_pos_abs);
+ bs->BoxSelectRectCurr.Min = ImMin(start_pos_abs, curr_end_pos_abs);
+ bs->BoxSelectRectCurr.Max = ImMax(start_pos_abs, curr_end_pos_abs);
+
+ // Box-select 2D mode detects horizontal changes (vertical ones are already picked by Clipper)
+ // Storing an extra rect used by widgets supporting box-select.
+ if (ms_flags & ImGuiMultiSelectFlags_BoxSelect2d)
+ if (bs->BoxSelectRectPrev.Min.x != bs->BoxSelectRectCurr.Min.x || bs->BoxSelectRectPrev.Max.x != bs->BoxSelectRectCurr.Max.x)
+ {
+ bs->UnclipMode = true;
+ bs->UnclipRect = bs->BoxSelectRectPrev; // FIXME-OPT: UnclipRect x coordinates could be intersection of Prev and Curr rect on X axis.
+ bs->UnclipRect.Add(bs->BoxSelectRectCurr);
+ }
+
+ //GetForegroundDrawList()->AddRect(bs->UnclipRect.Min, bs->UnclipRect.Max, IM_COL32(255,0,0,200), 0.0f, 0, 3.0f);
+ //GetForegroundDrawList()->AddRect(bs->BoxSelectRectPrev.Min, bs->BoxSelectRectPrev.Max, IM_COL32(255,0,0,200), 0.0f, 0, 3.0f);
+ //GetForegroundDrawList()->AddRect(bs->BoxSelectRectCurr.Min, bs->BoxSelectRectCurr.Max, IM_COL32(0,255,0,200), 0.0f, 0, 1.0f);
+ return true;
+}
+
+void ImGui::EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImGuiBoxSelectState* bs = &g.BoxSelectState;
+ IM_ASSERT(bs->IsActive);
+ bs->UnclipMode = false;
+
+ // Render selection rectangle
+ bs->EndPosRel = WindowPosAbsToRel(window, ImClamp(g.IO.MousePos, scope_rect.Min, scope_rect.Max)); // Clamp stored position according to current scrolling view
+ ImRect box_select_r = bs->BoxSelectRectCurr;
+ box_select_r.ClipWith(scope_rect);
+ window->DrawList->AddRectFilled(box_select_r.Min, box_select_r.Max, GetColorU32(ImGuiCol_SeparatorHovered, 0.30f)); // FIXME-MULTISELECT: Styling
+ window->DrawList->AddRect(box_select_r.Min, box_select_r.Max, GetColorU32(ImGuiCol_NavCursor)); // FIXME-MULTISELECT: Styling
+
+ // Scroll
+ const bool enable_scroll = (ms_flags & ImGuiMultiSelectFlags_ScopeWindow) && (ms_flags & ImGuiMultiSelectFlags_BoxSelectNoScroll) == 0;
+ if (enable_scroll)
+ {
+ ImRect scroll_r = scope_rect;
+ scroll_r.Expand(-g.FontSize);
+ //GetForegroundDrawList()->AddRect(scroll_r.Min, scroll_r.Max, IM_COL32(0, 255, 0, 255));
+ if (!scroll_r.Contains(g.IO.MousePos))
+ BoxSelectScrollWithMouseDrag(bs, window, scroll_r);
+ }
+}
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: Multi-Select support
+//-------------------------------------------------------------------------
+// - DebugLogMultiSelectRequests() [Internal]
+// - CalcScopeRect() [Internal]
+// - BeginMultiSelect()
+// - EndMultiSelect()
+// - SetNextItemSelectionUserData()
+// - MultiSelectItemHeader() [Internal]
+// - MultiSelectItemFooter() [Internal]
+// - DebugNodeMultiSelectState() [Internal]
+//-------------------------------------------------------------------------
+
+static void DebugLogMultiSelectRequests(const char* function, const ImGuiMultiSelectIO* io)
+{
+ ImGuiContext& g = *GImGui;
+ IM_UNUSED(function);
+ for (const ImGuiSelectionRequest& req : io->Requests)
+ {
+ if (req.Type == ImGuiSelectionRequestType_SetAll) IMGUI_DEBUG_LOG_SELECTION("[selection] %s: Request: SetAll %d (= %s)\n", function, req.Selected, req.Selected ? "SelectAll" : "Clear");
+ if (req.Type == ImGuiSelectionRequestType_SetRange) IMGUI_DEBUG_LOG_SELECTION("[selection] %s: Request: SetRange %" IM_PRId64 "..%" IM_PRId64 " (0x%" IM_PRIX64 "..0x%" IM_PRIX64 ") = %d (dir %d)\n", function, req.RangeFirstItem, req.RangeLastItem, req.RangeFirstItem, req.RangeLastItem, req.Selected, req.RangeDirection);
+ }
+}
+
+static ImRect CalcScopeRect(ImGuiMultiSelectTempData* ms, ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ if (ms->Flags & ImGuiMultiSelectFlags_ScopeRect)
+ {
+ // Warning: this depends on CursorMaxPos so it means to be called by EndMultiSelect() only
+ return ImRect(ms->ScopeRectMin, ImMax(window->DC.CursorMaxPos, ms->ScopeRectMin));
+ }
+ else
+ {
+ // When a table, pull HostClipRect, which allows us to predict ClipRect before first row/layout is performed. (#7970)
+ ImRect scope_rect = window->InnerClipRect;
+ if (g.CurrentTable != NULL)
+ scope_rect = g.CurrentTable->HostClipRect;
+
+ // Add inner table decoration (#7821) // FIXME: Why not baking in InnerClipRect?
+ scope_rect.Min = ImMin(scope_rect.Min + ImVec2(window->DecoInnerSizeX1, window->DecoInnerSizeY1), scope_rect.Max);
+ return scope_rect;
+ }
+}
+
+// Return ImGuiMultiSelectIO structure.
+// Lifetime: don't hold on ImGuiMultiSelectIO* pointers over multiple frames or past any subsequent call to BeginMultiSelect() or EndMultiSelect().
+// Passing 'selection_size' and 'items_count' parameters is currently optional.
+// - 'selection_size' is useful to disable some shortcut routing: e.g. ImGuiMultiSelectFlags_ClearOnEscape won't claim Escape key when selection_size 0,
+// allowing a first press to clear selection THEN the second press to leave child window and return to parent.
+// - 'items_count' is stored in ImGuiMultiSelectIO which makes it a convenient way to pass the information to your ApplyRequest() handler (but you may pass it differently).
+// - If they are costly for you to compute (e.g. external intrusive selection without maintaining size), you may avoid them and pass -1.
+// - If you can easily tell if your selection is empty or not, you may pass 0/1, or you may enable ImGuiMultiSelectFlags_ClearOnEscape flag dynamically.
+ImGuiMultiSelectIO* ImGui::BeginMultiSelect(ImGuiMultiSelectFlags flags, int selection_size, int items_count)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ if (++g.MultiSelectTempDataStacked > g.MultiSelectTempData.Size)
+ g.MultiSelectTempData.resize(g.MultiSelectTempDataStacked, ImGuiMultiSelectTempData());
+ ImGuiMultiSelectTempData* ms = &g.MultiSelectTempData[g.MultiSelectTempDataStacked - 1];
+ IM_STATIC_ASSERT(offsetof(ImGuiMultiSelectTempData, IO) == 0); // Clear() relies on that.
+ g.CurrentMultiSelect = ms;
+ if ((flags & (ImGuiMultiSelectFlags_ScopeWindow | ImGuiMultiSelectFlags_ScopeRect)) == 0)
+ flags |= ImGuiMultiSelectFlags_ScopeWindow;
+ if (flags & ImGuiMultiSelectFlags_SingleSelect)
+ flags &= ~(ImGuiMultiSelectFlags_BoxSelect2d | ImGuiMultiSelectFlags_BoxSelect1d);
+ if (flags & ImGuiMultiSelectFlags_BoxSelect2d)
+ flags &= ~ImGuiMultiSelectFlags_BoxSelect1d;
+
+ // FIXME: Workaround to the fact we override CursorMaxPos, meaning size measurement are lost. (#8250)
+ // They should perhaps be stacked properly?
+ if (ImGuiTable* table = g.CurrentTable)
+ if (table->CurrentColumn != -1)
+ TableEndCell(table); // This is currently safe to call multiple time. If that properly is lost we can extract the "save measurement" part of it.
+
+ // FIXME: BeginFocusScope()
+ const ImGuiID id = window->IDStack.back();
+ ms->Clear();
+ ms->FocusScopeId = id;
+ ms->Flags = flags;
+ ms->IsFocused = (ms->FocusScopeId == g.NavFocusScopeId);
+ ms->BackupCursorMaxPos = window->DC.CursorMaxPos;
+ ms->ScopeRectMin = window->DC.CursorMaxPos = window->DC.CursorPos;
+ PushFocusScope(ms->FocusScopeId);
+ if (flags & ImGuiMultiSelectFlags_ScopeWindow) // Mark parent child window as navigable into, with highlight. Assume user will always submit interactive items.
+ window->DC.NavLayersActiveMask |= 1 << ImGuiNavLayer_Main;
+
+ // Use copy of keyboard mods at the time of the request, otherwise we would requires mods to be held for an extra frame.
+ ms->KeyMods = g.NavJustMovedToId ? (g.NavJustMovedToIsTabbing ? 0 : g.NavJustMovedToKeyMods) : g.IO.KeyMods;
+ if (flags & ImGuiMultiSelectFlags_NoRangeSelect)
+ ms->KeyMods &= ~ImGuiMod_Shift;
+
+ // Bind storage
+ ImGuiMultiSelectState* storage = g.MultiSelectStorage.GetOrAddByKey(id);
+ storage->ID = id;
+ storage->LastFrameActive = g.FrameCount;
+ storage->LastSelectionSize = selection_size;
+ storage->Window = window;
+ ms->Storage = storage;
+
+ // Output to user
+ ms->IO.Requests.resize(0);
+ ms->IO.RangeSrcItem = storage->RangeSrcItem;
+ ms->IO.NavIdItem = storage->NavIdItem;
+ ms->IO.NavIdSelected = (storage->NavIdSelected == 1) ? true : false;
+ ms->IO.ItemsCount = items_count;
+
+ // Clear when using Navigation to move within the scope
+ // (we compare FocusScopeId so it possible to use multiple selections inside a same window)
+ bool request_clear = false;
+ bool request_select_all = false;
+ if (g.NavJustMovedToId != 0 && g.NavJustMovedToFocusScopeId == ms->FocusScopeId && g.NavJustMovedToHasSelectionData)
+ {
+ if (ms->KeyMods & ImGuiMod_Shift)
+ ms->IsKeyboardSetRange = true;
+ if (ms->IsKeyboardSetRange)
+ IM_ASSERT(storage->RangeSrcItem != ImGuiSelectionUserData_Invalid); // Not ready -> could clear?
+ if ((ms->KeyMods & (ImGuiMod_Ctrl | ImGuiMod_Shift)) == 0 && (flags & (ImGuiMultiSelectFlags_NoAutoClear | ImGuiMultiSelectFlags_NoAutoSelect)) == 0)
+ request_clear = true;
+ }
+ else if (g.NavJustMovedFromFocusScopeId == ms->FocusScopeId)
+ {
+ // Also clear on leaving scope (may be optional?)
+ if ((ms->KeyMods & (ImGuiMod_Ctrl | ImGuiMod_Shift)) == 0 && (flags & (ImGuiMultiSelectFlags_NoAutoClear | ImGuiMultiSelectFlags_NoAutoSelect)) == 0)
+ request_clear = true;
+ }
+
+ // Box-select handling: update active state.
+ ImGuiBoxSelectState* bs = &g.BoxSelectState;
+ if (flags & (ImGuiMultiSelectFlags_BoxSelect1d | ImGuiMultiSelectFlags_BoxSelect2d))
+ {
+ ms->BoxSelectId = GetID("##BoxSelect");
+ if (BeginBoxSelect(CalcScopeRect(ms, window), window, ms->BoxSelectId, flags))
+ request_clear |= bs->RequestClear;
+ }
+
+ if (ms->IsFocused)
+ {
+ // Shortcut: Clear selection (Escape)
+ // - Only claim shortcut if selection is not empty, allowing further presses on Escape to e.g. leave current child window.
+ // - Box select also handle Escape and needs to pass an id to bypass ActiveIdUsingAllKeyboardKeys lock.
+ if (flags & ImGuiMultiSelectFlags_ClearOnEscape)
+ {
+ if (selection_size != 0 || bs->IsActive)
+ if (Shortcut(ImGuiKey_Escape, ImGuiInputFlags_None, bs->IsActive ? bs->ID : 0))
+ {
+ request_clear = true;
+ if (bs->IsActive)
+ BoxSelectDeactivateDrag(bs);
+ }
+ }
+
+ // Shortcut: Select all (CTRL+A)
+ if (!(flags & ImGuiMultiSelectFlags_SingleSelect) && !(flags & ImGuiMultiSelectFlags_NoSelectAll))
+ if (Shortcut(ImGuiMod_Ctrl | ImGuiKey_A))
+ request_select_all = true;
+ }
+
+ if (request_clear || request_select_all)
+ {
+ MultiSelectAddSetAll(ms, request_select_all);
+ if (!request_select_all)
+ storage->LastSelectionSize = 0;
+ }
+ ms->LoopRequestSetAll = request_select_all ? 1 : request_clear ? 0 : -1;
+ ms->LastSubmittedItem = ImGuiSelectionUserData_Invalid;
+
+ if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection)
+ DebugLogMultiSelectRequests("BeginMultiSelect", &ms->IO);
+
+ return &ms->IO;
+}
+
+// Return updated ImGuiMultiSelectIO structure.
+// Lifetime: don't hold on ImGuiMultiSelectIO* pointers over multiple frames or past any subsequent call to BeginMultiSelect() or EndMultiSelect().
+ImGuiMultiSelectIO* ImGui::EndMultiSelect()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiMultiSelectTempData* ms = g.CurrentMultiSelect;
+ ImGuiMultiSelectState* storage = ms->Storage;
+ ImGuiWindow* window = g.CurrentWindow;
+ IM_ASSERT_USER_ERROR(ms->FocusScopeId == g.CurrentFocusScopeId, "EndMultiSelect() FocusScope mismatch!");
+ IM_ASSERT(g.CurrentMultiSelect != NULL && storage->Window == g.CurrentWindow);
+ IM_ASSERT(g.MultiSelectTempDataStacked > 0 && &g.MultiSelectTempData[g.MultiSelectTempDataStacked - 1] == g.CurrentMultiSelect);
+
+ ImRect scope_rect = CalcScopeRect(ms, window);
+ if (ms->IsFocused)
+ {
+ // We currently don't allow user code to modify RangeSrcItem by writing to BeginIO's version, but that would be an easy change here.
+ if (ms->IO.RangeSrcReset || (ms->RangeSrcPassedBy == false && ms->IO.RangeSrcItem != ImGuiSelectionUserData_Invalid)) // Can't read storage->RangeSrcItem here -> we want the state at begining of the scope (see tests for easy failure)
+ {
+ IMGUI_DEBUG_LOG_SELECTION("[selection] EndMultiSelect: Reset RangeSrcItem.\n"); // Will set be to NavId.
+ storage->RangeSrcItem = ImGuiSelectionUserData_Invalid;
+ }
+ if (ms->NavIdPassedBy == false && storage->NavIdItem != ImGuiSelectionUserData_Invalid)
+ {
+ IMGUI_DEBUG_LOG_SELECTION("[selection] EndMultiSelect: Reset NavIdItem.\n");
+ storage->NavIdItem = ImGuiSelectionUserData_Invalid;
+ storage->NavIdSelected = -1;
+ }
+
+ if ((ms->Flags & (ImGuiMultiSelectFlags_BoxSelect1d | ImGuiMultiSelectFlags_BoxSelect2d)) && GetBoxSelectState(ms->BoxSelectId))
+ EndBoxSelect(scope_rect, ms->Flags);
+ }
+
+ if (ms->IsEndIO == false)
+ ms->IO.Requests.resize(0);
+
+ // Clear selection when clicking void?
+ // We specifically test for IsMouseDragPastThreshold(0) == false to allow box-selection!
+ // The InnerRect test is necessary for non-child/decorated windows.
+ bool scope_hovered = IsWindowHovered() && window->InnerRect.Contains(g.IO.MousePos);
+ if (scope_hovered && (ms->Flags & ImGuiMultiSelectFlags_ScopeRect))
+ scope_hovered &= scope_rect.Contains(g.IO.MousePos);
+ if (scope_hovered && g.HoveredId == 0 && g.ActiveId == 0)
+ {
+ if (ms->Flags & (ImGuiMultiSelectFlags_BoxSelect1d | ImGuiMultiSelectFlags_BoxSelect2d))
+ {
+ if (!g.BoxSelectState.IsActive && !g.BoxSelectState.IsStarting && g.IO.MouseClickedCount[0] == 1)
+ {
+ BoxSelectPreStartDrag(ms->BoxSelectId, ImGuiSelectionUserData_Invalid);
+ FocusWindow(window, ImGuiFocusRequestFlags_UnlessBelowModal);
+ SetHoveredID(ms->BoxSelectId);
+ if (ms->Flags & ImGuiMultiSelectFlags_ScopeRect)
+ SetNavID(0, ImGuiNavLayer_Main, ms->FocusScopeId, ImRect(g.IO.MousePos, g.IO.MousePos)); // Automatically switch FocusScope for initial click from void to box-select.
+ }
+ }
+
+ if (ms->Flags & ImGuiMultiSelectFlags_ClearOnClickVoid)
+ if (IsMouseReleased(0) && IsMouseDragPastThreshold(0) == false && g.IO.KeyMods == ImGuiMod_None)
+ MultiSelectAddSetAll(ms, false);
+ }
+
+ // Courtesy nav wrapping helper flag
+ if (ms->Flags & ImGuiMultiSelectFlags_NavWrapX)
+ {
+ IM_ASSERT(ms->Flags & ImGuiMultiSelectFlags_ScopeWindow); // Only supported at window scope
+ ImGui::NavMoveRequestTryWrapping(ImGui::GetCurrentWindow(), ImGuiNavMoveFlags_WrapX);
+ }
+
+ // Unwind
+ window->DC.CursorMaxPos = ImMax(ms->BackupCursorMaxPos, window->DC.CursorMaxPos);
+ PopFocusScope();
+
+ if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection)
+ DebugLogMultiSelectRequests("EndMultiSelect", &ms->IO);
+
+ ms->FocusScopeId = 0;
+ ms->Flags = ImGuiMultiSelectFlags_None;
+ g.CurrentMultiSelect = (--g.MultiSelectTempDataStacked > 0) ? &g.MultiSelectTempData[g.MultiSelectTempDataStacked - 1] : NULL;
+
+ return &ms->IO;
+}
+
+void ImGui::SetNextItemSelectionUserData(ImGuiSelectionUserData selection_user_data)
+{
+ // Note that flags will be cleared by ItemAdd(), so it's only useful for Navigation code!
+ // This designed so widgets can also cheaply set this before calling ItemAdd(), so we are not tied to MultiSelect api.
+ ImGuiContext& g = *GImGui;
+ g.NextItemData.SelectionUserData = selection_user_data;
+ g.NextItemData.FocusScopeId = g.CurrentFocusScopeId;
+
+ if (ImGuiMultiSelectTempData* ms = g.CurrentMultiSelect)
+ {
+ // Auto updating RangeSrcPassedBy for cases were clipper is not used (done before ItemAdd() clipping)
+ g.NextItemData.ItemFlags |= ImGuiItemFlags_HasSelectionUserData | ImGuiItemFlags_IsMultiSelect;
+ if (ms->IO.RangeSrcItem == selection_user_data)
+ ms->RangeSrcPassedBy = true;
+ }
+ else
+ {
+ g.NextItemData.ItemFlags |= ImGuiItemFlags_HasSelectionUserData;
+ }
+}
+
+// In charge of:
+// - Applying SetAll for submitted items.
+// - Applying SetRange for submitted items and record end points.
+// - Altering button behavior flags to facilitate use with drag and drop.
+void ImGui::MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiMultiSelectTempData* ms = g.CurrentMultiSelect;
+
+ bool selected = *p_selected;
+ if (ms->IsFocused)
+ {
+ ImGuiMultiSelectState* storage = ms->Storage;
+ ImGuiSelectionUserData item_data = g.NextItemData.SelectionUserData;
+ IM_ASSERT(g.NextItemData.FocusScopeId == g.CurrentFocusScopeId && "Forgot to call SetNextItemSelectionUserData() prior to item, required in BeginMultiSelect()/EndMultiSelect() scope");
+
+ // Apply SetAll (Clear/SelectAll) requests requested by BeginMultiSelect().
+ // This is only useful if the user hasn't processed them already, and this only works if the user isn't using the clipper.
+ // If you are using a clipper you need to process the SetAll request after calling BeginMultiSelect()
+ if (ms->LoopRequestSetAll != -1)
+ selected = (ms->LoopRequestSetAll == 1);
+
+ // When using SHIFT+Nav: because it can incur scrolling we cannot afford a frame of lag with the selection highlight (otherwise scrolling would happen before selection)
+ // For this to work, we need someone to set 'RangeSrcPassedBy = true' at some point (either clipper either SetNextItemSelectionUserData() function)
+ if (ms->IsKeyboardSetRange)
+ {
+ IM_ASSERT(id != 0 && (ms->KeyMods & ImGuiMod_Shift) != 0);
+ const bool is_range_dst = (ms->RangeDstPassedBy == false) && g.NavJustMovedToId == id; // Assume that g.NavJustMovedToId is not clipped.
+ if (is_range_dst)
+ ms->RangeDstPassedBy = true;
+ if (is_range_dst && storage->RangeSrcItem == ImGuiSelectionUserData_Invalid) // If we don't have RangeSrc, assign RangeSrc = RangeDst
+ {
+ storage->RangeSrcItem = item_data;
+ storage->RangeSelected = selected ? 1 : 0;
+ }
+ const bool is_range_src = storage->RangeSrcItem == item_data;
+ if (is_range_src || is_range_dst || ms->RangeSrcPassedBy != ms->RangeDstPassedBy)
+ {
+ // Apply range-select value to visible items
+ IM_ASSERT(storage->RangeSrcItem != ImGuiSelectionUserData_Invalid && storage->RangeSelected != -1);
+ selected = (storage->RangeSelected != 0);
+ }
+ else if ((ms->KeyMods & ImGuiMod_Ctrl) == 0 && (ms->Flags & ImGuiMultiSelectFlags_NoAutoClear) == 0)
+ {
+ // Clear other items
+ selected = false;
+ }
+ }
+ *p_selected = selected;
+ }
+
+ // Alter button behavior flags
+ // To handle drag and drop of multiple items we need to avoid clearing selection on click.
+ // Enabling this test makes actions using CTRL+SHIFT delay their effect on MouseUp which is annoying, but it allows drag and drop of multiple items.
+ if (p_button_flags != NULL)
+ {
+ ImGuiButtonFlags button_flags = *p_button_flags;
+ button_flags |= ImGuiButtonFlags_NoHoveredOnFocus;
+ if ((!selected || (g.ActiveId == id && g.ActiveIdHasBeenPressedBefore)) && !(ms->Flags & ImGuiMultiSelectFlags_SelectOnClickRelease))
+ button_flags = (button_flags | ImGuiButtonFlags_PressedOnClick) & ~ImGuiButtonFlags_PressedOnClickRelease;
+ else
+ button_flags |= ImGuiButtonFlags_PressedOnClickRelease;
+ *p_button_flags = button_flags;
+ }
+}
+
+// In charge of:
+// - Auto-select on navigation.
+// - Box-select toggle handling.
+// - Right-click handling.
+// - Altering selection based on Ctrl/Shift modifiers, both for keyboard and mouse.
+// - Record current selection state for RangeSrc
+// This is all rather complex, best to run and refer to "widgets_multiselect_xxx" tests in imgui_test_suite.
+void ImGui::MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ bool selected = *p_selected;
+ bool pressed = *p_pressed;
+ ImGuiMultiSelectTempData* ms = g.CurrentMultiSelect;
+ ImGuiMultiSelectState* storage = ms->Storage;
+ if (pressed)
+ ms->IsFocused = true;
+
+ bool hovered = false;
+ if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect)
+ hovered = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup);
+ if (!ms->IsFocused && !hovered)
+ return;
+
+ ImGuiSelectionUserData item_data = g.NextItemData.SelectionUserData;
+
+ ImGuiMultiSelectFlags flags = ms->Flags;
+ const bool is_singleselect = (flags & ImGuiMultiSelectFlags_SingleSelect) != 0;
+ bool is_ctrl = (ms->KeyMods & ImGuiMod_Ctrl) != 0;
+ bool is_shift = (ms->KeyMods & ImGuiMod_Shift) != 0;
+
+ bool apply_to_range_src = false;
+
+ if (g.NavId == id && storage->RangeSrcItem == ImGuiSelectionUserData_Invalid)
+ apply_to_range_src = true;
+ if (ms->IsEndIO == false)
+ {
+ ms->IO.Requests.resize(0);
+ ms->IsEndIO = true;
+ }
+
+ // Auto-select as you navigate a list
+ if (g.NavJustMovedToId == id)
+ {
+ if ((flags & ImGuiMultiSelectFlags_NoAutoSelect) == 0)
+ {
+ if (is_ctrl && is_shift)
+ pressed = true;
+ else if (!is_ctrl)
+ selected = pressed = true;
+ }
+ else
+ {
+ // With NoAutoSelect, using Shift+keyboard performs a write/copy
+ if (is_shift)
+ pressed = true;
+ else if (!is_ctrl)
+ apply_to_range_src = true; // Since if (pressed) {} main block is not running we update this
+ }
+ }
+
+ if (apply_to_range_src)
+ {
+ storage->RangeSrcItem = item_data;
+ storage->RangeSelected = selected; // Will be updated at the end of this function anyway.
+ }
+
+ // Box-select toggle handling
+ if (ms->BoxSelectId != 0)
+ if (ImGuiBoxSelectState* bs = GetBoxSelectState(ms->BoxSelectId))
+ {
+ const bool rect_overlap_curr = bs->BoxSelectRectCurr.Overlaps(g.LastItemData.Rect);
+ const bool rect_overlap_prev = bs->BoxSelectRectPrev.Overlaps(g.LastItemData.Rect);
+ if ((rect_overlap_curr && !rect_overlap_prev && !selected) || (rect_overlap_prev && !rect_overlap_curr))
+ {
+ if (storage->LastSelectionSize <= 0 && bs->IsStartedSetNavIdOnce)
+ {
+ pressed = true; // First item act as a pressed: code below will emit selection request and set NavId (whatever we emit here will be overridden anyway)
+ bs->IsStartedSetNavIdOnce = false;
+ }
+ else
+ {
+ selected = !selected;
+ MultiSelectAddSetRange(ms, selected, +1, item_data, item_data);
+ }
+ storage->LastSelectionSize = ImMax(storage->LastSelectionSize + 1, 1);
+ }
+ }
+
+ // Right-click handling.
+ // FIXME-MULTISELECT: Currently filtered out by ImGuiMultiSelectFlags_NoAutoSelect but maybe should be moved to Selectable(). See https://github.com/ocornut/imgui/pull/5816
+ if (hovered && IsMouseClicked(1) && (flags & ImGuiMultiSelectFlags_NoAutoSelect) == 0)
+ {
+ if (g.ActiveId != 0 && g.ActiveId != id)
+ ClearActiveID();
+ SetFocusID(id, window);
+ if (!pressed && !selected)
+ {
+ pressed = true;
+ is_ctrl = is_shift = false;
+ }
+ }
+
+ // Unlike Space, Enter doesn't alter selection (but can still return a press) unless current item is not selected.
+ // The later, "unless current item is not select", may become optional? It seems like a better default if Enter doesn't necessarily open something
+ // (unlike e.g. Windows explorer). For use case where Enter always open something, we might decide to make this optional?
+ const bool enter_pressed = pressed && (g.NavActivateId == id) && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput);
+
+ // Alter selection
+ if (pressed && (!enter_pressed || !selected))
+ {
+ // Box-select
+ ImGuiInputSource input_source = (g.NavJustMovedToId == id || g.NavActivateId == id) ? g.NavInputSource : ImGuiInputSource_Mouse;
+ if (flags & (ImGuiMultiSelectFlags_BoxSelect1d | ImGuiMultiSelectFlags_BoxSelect2d))
+ if (selected == false && !g.BoxSelectState.IsActive && !g.BoxSelectState.IsStarting && input_source == ImGuiInputSource_Mouse && g.IO.MouseClickedCount[0] == 1)
+ BoxSelectPreStartDrag(ms->BoxSelectId, item_data);
+
+ //----------------------------------------------------------------------------------------
+ // ACTION | Begin | Pressed/Activated | End
+ //----------------------------------------------------------------------------------------
+ // Keys Navigated: | Clear | Src=item, Sel=1 SetRange 1
+ // Keys Navigated: Ctrl | n/a | n/a
+ // Keys Navigated: Shift | n/a | Dst=item, Sel=1, => Clear + SetRange 1
+ // Keys Navigated: Ctrl+Shift | n/a | Dst=item, Sel=Src => Clear + SetRange Src-Dst
+ // Keys Activated: | n/a | Src=item, Sel=1 => Clear + SetRange 1
+ // Keys Activated: Ctrl | n/a | Src=item, Sel=!Sel => SetSange 1
+ // Keys Activated: Shift | n/a | Dst=item, Sel=1 => Clear + SetSange 1
+ //----------------------------------------------------------------------------------------
+ // Mouse Pressed: | n/a | Src=item, Sel=1, => Clear + SetRange 1
+ // Mouse Pressed: Ctrl | n/a | Src=item, Sel=!Sel => SetRange 1
+ // Mouse Pressed: Shift | n/a | Dst=item, Sel=1, => Clear + SetRange 1
+ // Mouse Pressed: Ctrl+Shift | n/a | Dst=item, Sel=!Sel => SetRange Src-Dst
+ //----------------------------------------------------------------------------------------
+
+ if ((flags & ImGuiMultiSelectFlags_NoAutoClear) == 0)
+ {
+ bool request_clear = false;
+ if (is_singleselect)
+ request_clear = true;
+ else if ((input_source == ImGuiInputSource_Mouse || g.NavActivateId == id) && !is_ctrl)
+ request_clear = (flags & ImGuiMultiSelectFlags_NoAutoClearOnReselect) ? !selected : true;
+ else if ((input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Gamepad) && is_shift && !is_ctrl)
+ request_clear = true; // With is_shift==false the RequestClear was done in BeginIO, not necessary to do again.
+ if (request_clear)
+ MultiSelectAddSetAll(ms, false);
+ }
+
+ int range_direction;
+ bool range_selected;
+ if (is_shift && !is_singleselect)
+ {
+ //IM_ASSERT(storage->HasRangeSrc && storage->HasRangeValue);
+ if (storage->RangeSrcItem == ImGuiSelectionUserData_Invalid)
+ storage->RangeSrcItem = item_data;
+ if ((flags & ImGuiMultiSelectFlags_NoAutoSelect) == 0)
+ {
+ // Shift+Arrow always select
+ // Ctrl+Shift+Arrow copy source selection state (already stored by BeginMultiSelect() in storage->RangeSelected)
+ range_selected = (is_ctrl && storage->RangeSelected != -1) ? (storage->RangeSelected != 0) : true;
+ }
+ else
+ {
+ // Shift+Arrow copy source selection state
+ // Shift+Click always copy from target selection state
+ if (ms->IsKeyboardSetRange)
+ range_selected = (storage->RangeSelected != -1) ? (storage->RangeSelected != 0) : true;
+ else
+ range_selected = !selected;
+ }
+ range_direction = ms->RangeSrcPassedBy ? +1 : -1;
+ }
+ else
+ {
+ // Ctrl inverts selection, otherwise always select
+ if ((flags & ImGuiMultiSelectFlags_NoAutoSelect) == 0)
+ selected = is_ctrl ? !selected : true;
+ else
+ selected = !selected;
+ storage->RangeSrcItem = item_data;
+ range_selected = selected;
+ range_direction = +1;
+ }
+ MultiSelectAddSetRange(ms, range_selected, range_direction, storage->RangeSrcItem, item_data);
+ }
+
+ // Update/store the selection state of the Source item (used by CTRL+SHIFT, when Source is unselected we perform a range unselect)
+ if (storage->RangeSrcItem == item_data)
+ storage->RangeSelected = selected ? 1 : 0;
+
+ // Update/store the selection state of focused item
+ if (g.NavId == id)
+ {
+ storage->NavIdItem = item_data;
+ storage->NavIdSelected = selected ? 1 : 0;
+ }
+ if (storage->NavIdItem == item_data)
+ ms->NavIdPassedBy = true;
+ ms->LastSubmittedItem = item_data;
+
+ *p_selected = selected;
+ *p_pressed = pressed;
+}
+
+void ImGui::MultiSelectAddSetAll(ImGuiMultiSelectTempData* ms, bool selected)
+{
+ ImGuiSelectionRequest req = { ImGuiSelectionRequestType_SetAll, selected, 0, ImGuiSelectionUserData_Invalid, ImGuiSelectionUserData_Invalid };
+ ms->IO.Requests.resize(0); // Can always clear previous requests
+ ms->IO.Requests.push_back(req); // Add new request
+}
+
+void ImGui::MultiSelectAddSetRange(ImGuiMultiSelectTempData* ms, bool selected, int range_dir, ImGuiSelectionUserData first_item, ImGuiSelectionUserData last_item)
+{
+ // Merge contiguous spans into same request (unless NoRangeSelect is set which guarantees single-item ranges)
+ if (ms->IO.Requests.Size > 0 && first_item == last_item && (ms->Flags & ImGuiMultiSelectFlags_NoRangeSelect) == 0)
+ {
+ ImGuiSelectionRequest* prev = &ms->IO.Requests.Data[ms->IO.Requests.Size - 1];
+ if (prev->Type == ImGuiSelectionRequestType_SetRange && prev->RangeLastItem == ms->LastSubmittedItem && prev->Selected == selected)
+ {
+ prev->RangeLastItem = last_item;
+ return;
+ }
+ }
+
+ ImGuiSelectionRequest req = { ImGuiSelectionRequestType_SetRange, selected, (ImS8)range_dir, (range_dir > 0) ? first_item : last_item, (range_dir > 0) ? last_item : first_item };
+ ms->IO.Requests.push_back(req); // Add new request
+}
+
+void ImGui::DebugNodeMultiSelectState(ImGuiMultiSelectState* storage)
+{
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
+ const bool is_active = (storage->LastFrameActive >= GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here.
+ if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); }
+ bool open = TreeNode((void*)(intptr_t)storage->ID, "MultiSelect 0x%08X in '%s'%s", storage->ID, storage->Window ? storage->Window->Name : "N/A", is_active ? "" : " *Inactive*");
+ if (!is_active) { PopStyleColor(); }
+ if (!open)
+ return;
+ Text("RangeSrcItem = %" IM_PRId64 " (0x%" IM_PRIX64 "), RangeSelected = %d", storage->RangeSrcItem, storage->RangeSrcItem, storage->RangeSelected);
+ Text("NavIdItem = %" IM_PRId64 " (0x%" IM_PRIX64 "), NavIdSelected = %d", storage->NavIdItem, storage->NavIdItem, storage->NavIdSelected);
+ Text("LastSelectionSize = %d", storage->LastSelectionSize); // Provided by user
+ TreePop();
+#else
+ IM_UNUSED(storage);
+#endif
+}
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: Multi-Select helpers
+//-------------------------------------------------------------------------
+// - ImGuiSelectionBasicStorage
+// - ImGuiSelectionExternalStorage
+//-------------------------------------------------------------------------
+
+ImGuiSelectionBasicStorage::ImGuiSelectionBasicStorage()
+{
+ Size = 0;
+ PreserveOrder = false;
+ UserData = NULL;
+ AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage*, int idx) { return (ImGuiID)idx; };
+ _SelectionOrder = 1; // Always >0
+}
+
+void ImGuiSelectionBasicStorage::Clear()
+{
+ Size = 0;
+ _SelectionOrder = 1; // Always >0
+ _Storage.Data.resize(0);
+}
+
+void ImGuiSelectionBasicStorage::Swap(ImGuiSelectionBasicStorage& r)
+{
+ ImSwap(Size, r.Size);
+ ImSwap(_SelectionOrder, r._SelectionOrder);
+ _Storage.Data.swap(r._Storage.Data);
+}
+
+bool ImGuiSelectionBasicStorage::Contains(ImGuiID id) const
+{
+ return _Storage.GetInt(id, 0) != 0;
+}
+
+static int IMGUI_CDECL PairComparerByValueInt(const void* lhs, const void* rhs)
+{
+ int lhs_v = ((const ImGuiStoragePair*)lhs)->val_i;
+ int rhs_v = ((const ImGuiStoragePair*)rhs)->val_i;
+ return (lhs_v > rhs_v ? +1 : lhs_v < rhs_v ? -1 : 0);
+}
+
+// GetNextSelectedItem() is an abstraction allowing us to change our underlying actual storage system without impacting user.
+// (e.g. store unselected vs compact down, compact down on demand, use raw ImVector<ImGuiID> instead of ImGuiStorage...)
+bool ImGuiSelectionBasicStorage::GetNextSelectedItem(void** opaque_it, ImGuiID* out_id)
+{
+ ImGuiStoragePair* it = (ImGuiStoragePair*)*opaque_it;
+ ImGuiStoragePair* it_end = _Storage.Data.Data + _Storage.Data.Size;
+ if (PreserveOrder && it == NULL && it_end != NULL)
+ ImQsort(_Storage.Data.Data, (size_t)_Storage.Data.Size, sizeof(ImGuiStoragePair), PairComparerByValueInt); // ~ImGuiStorage::BuildSortByValueInt()
+ if (it == NULL)
+ it = _Storage.Data.Data;
+ IM_ASSERT(it >= _Storage.Data.Data && it <= it_end);
+ if (it != it_end)
+ while (it->val_i == 0 && it < it_end)
+ it++;
+ const bool has_more = (it != it_end);
+ *opaque_it = has_more ? (void**)(it + 1) : (void**)(it);
+ *out_id = has_more ? it->key : 0;
+ if (PreserveOrder && !has_more)
+ _Storage.BuildSortByKey();
+ return has_more;
+}
+
+void ImGuiSelectionBasicStorage::SetItemSelected(ImGuiID id, bool selected)
+{
+ int* p_int = _Storage.GetIntRef(id, 0);
+ if (selected && *p_int == 0) { *p_int = _SelectionOrder++; Size++; }
+ else if (!selected && *p_int != 0) { *p_int = 0; Size--; }
+}
+
+// Optimized for batch edits (with same value of 'selected')
+static void ImGuiSelectionBasicStorage_BatchSetItemSelected(ImGuiSelectionBasicStorage* selection, ImGuiID id, bool selected, int size_before_amends, int selection_order)
+{
+ ImGuiStorage* storage = &selection->_Storage;
+ ImGuiStoragePair* it = ImLowerBound(storage->Data.Data, storage->Data.Data + size_before_amends, id);
+ const bool is_contained = (it != storage->Data.Data + size_before_amends) && (it->key == id);
+ if (selected == (is_contained && it->val_i != 0))
+ return;
+ if (selected && !is_contained)
+ storage->Data.push_back(ImGuiStoragePair(id, selection_order)); // Push unsorted at end of vector, will be sorted in SelectionMultiAmendsFinish()
+ else if (is_contained)
+ it->val_i = selected ? selection_order : 0; // Modify in-place.
+ selection->Size += selected ? +1 : -1;
+}
+
+static void ImGuiSelectionBasicStorage_BatchFinish(ImGuiSelectionBasicStorage* selection, bool selected, int size_before_amends)
+{
+ ImGuiStorage* storage = &selection->_Storage;
+ if (selected && selection->Size != size_before_amends)
+ storage->BuildSortByKey(); // When done selecting: sort everything
+}
+
+// Apply requests coming from BeginMultiSelect() and EndMultiSelect().
+// - Enable 'Demo->Tools->Debug Log->Selection' to see selection requests as they happen.
+// - Honoring SetRange requests requires that you can iterate/interpolate between RangeFirstItem and RangeLastItem.
+// - In this demo we often submit indices to SetNextItemSelectionUserData() + store the same indices in persistent selection.
+// - Your code may do differently. If you store pointers or objects ID in ImGuiSelectionUserData you may need to perform
+// a lookup in order to have some way to iterate/interpolate between two items.
+// - A full-featured application is likely to allow search/filtering which is likely to lead to using indices
+// and constructing a view index <> object id/ptr data structure anyway.
+// WHEN YOUR APPLICATION SETTLES ON A CHOICE, YOU WILL PROBABLY PREFER TO GET RID OF THIS UNNECESSARY 'ImGuiSelectionBasicStorage' INDIRECTION LOGIC.
+// Notice that with the simplest adapter (using indices everywhere), all functions return their parameters.
+// The most simple implementation (using indices everywhere) would look like:
+// for (ImGuiSelectionRequest& req : ms_io->Requests)
+// {
+// if (req.Type == ImGuiSelectionRequestType_SetAll) { Clear(); if (req.Selected) { for (int n = 0; n < items_count; n++) { SetItemSelected(n, true); } }
+// if (req.Type == ImGuiSelectionRequestType_SetRange) { for (int n = (int)ms_io->RangeFirstItem; n <= (int)ms_io->RangeLastItem; n++) { SetItemSelected(n, ms_io->Selected); } }
+// }
+void ImGuiSelectionBasicStorage::ApplyRequests(ImGuiMultiSelectIO* ms_io)
+{
+ // For convenience we obtain ItemsCount as passed to BeginMultiSelect(), which is optional.
+ // It makes sense when using ImGuiSelectionBasicStorage to simply pass your items count to BeginMultiSelect().
+ // Other scheme may handle SetAll differently.
+ IM_ASSERT(ms_io->ItemsCount != -1 && "Missing value for items_count in BeginMultiSelect() call!");
+ IM_ASSERT(AdapterIndexToStorageId != NULL);
+
+ // This is optimized/specialized to cope with very large selections (e.g. 100k+ items)
+ // - A simpler version could call SetItemSelected() directly instead of ImGuiSelectionBasicStorage_BatchSetItemSelected() + ImGuiSelectionBasicStorage_BatchFinish().
+ // - Optimized select can append unsorted, then sort in a second pass. Optimized unselect can clear in-place then compact in a second pass.
+ // - A more optimal version wouldn't even use ImGuiStorage but directly a ImVector<ImGuiID> to reduce bandwidth, but this is a reasonable trade off to reuse code.
+ // - There are many ways this could be better optimized. The worse case scenario being: using BoxSelect2d in a grid, box-select scrolling down while wiggling
+ // left and right: it affects coarse clipping + can emit multiple SetRange with 1 item each.)
+ // FIXME-OPT: For each block of consecutive SetRange request:
+ // - add all requests to a sorted list, store ID, selected, offset in ImGuiStorage.
+ // - rewrite sorted storage a single time.
+ for (ImGuiSelectionRequest& req : ms_io->Requests)
+ {
+ if (req.Type == ImGuiSelectionRequestType_SetAll)
+ {
+ Clear();
+ if (req.Selected)
+ {
+ _Storage.Data.reserve(ms_io->ItemsCount);
+ const int size_before_amends = _Storage.Data.Size;
+ for (int idx = 0; idx < ms_io->ItemsCount; idx++, _SelectionOrder++)
+ ImGuiSelectionBasicStorage_BatchSetItemSelected(this, GetStorageIdFromIndex(idx), req.Selected, size_before_amends, _SelectionOrder);
+ ImGuiSelectionBasicStorage_BatchFinish(this, req.Selected, size_before_amends);
+ }
+ }
+ else if (req.Type == ImGuiSelectionRequestType_SetRange)
+ {
+ const int selection_changes = (int)req.RangeLastItem - (int)req.RangeFirstItem + 1;
+ //ImGuiContext& g = *GImGui; IMGUI_DEBUG_LOG_SELECTION("Req %d/%d: set %d to %d\n", ms_io->Requests.index_from_ptr(&req), ms_io->Requests.Size, selection_changes, req.Selected);
+ if (selection_changes == 1 || (selection_changes < Size / 100))
+ {
+ // Multiple sorted insertion + copy likely to be faster.
+ // Technically we could do a single copy with a little more work (sort sequential SetRange requests)
+ for (int idx = (int)req.RangeFirstItem; idx <= (int)req.RangeLastItem; idx++)
+ SetItemSelected(GetStorageIdFromIndex(idx), req.Selected);
+ }
+ else
+ {
+ // Append insertion + single sort likely be faster.
+ // Use req.RangeDirection to set order field so that shift+clicking from 1 to 5 is different than shift+clicking from 5 to 1
+ const int size_before_amends = _Storage.Data.Size;
+ int selection_order = _SelectionOrder + ((req.RangeDirection < 0) ? selection_changes - 1 : 0);
+ for (int idx = (int)req.RangeFirstItem; idx <= (int)req.RangeLastItem; idx++, selection_order += req.RangeDirection)
+ ImGuiSelectionBasicStorage_BatchSetItemSelected(this, GetStorageIdFromIndex(idx), req.Selected, size_before_amends, selection_order);
+ if (req.Selected)
+ _SelectionOrder += selection_changes;
+ ImGuiSelectionBasicStorage_BatchFinish(this, req.Selected, size_before_amends);
+ }
+ }
+ }
+}
+
+//-------------------------------------------------------------------------
+
+ImGuiSelectionExternalStorage::ImGuiSelectionExternalStorage()
+{
+ UserData = NULL;
+ AdapterSetItemSelected = NULL;
+}
+
+// Apply requests coming from BeginMultiSelect() and EndMultiSelect().
+// We also pull 'ms_io->ItemsCount' as passed for BeginMultiSelect() for consistency with ImGuiSelectionBasicStorage
+// This makes no assumption about underlying storage.
+void ImGuiSelectionExternalStorage::ApplyRequests(ImGuiMultiSelectIO* ms_io)
+{
+ IM_ASSERT(AdapterSetItemSelected);
+ for (ImGuiSelectionRequest& req : ms_io->Requests)
+ {
+ if (req.Type == ImGuiSelectionRequestType_SetAll)
+ for (int idx = 0; idx < ms_io->ItemsCount; idx++)
+ AdapterSetItemSelected(this, idx, req.Selected);
+ if (req.Type == ImGuiSelectionRequestType_SetRange)
+ for (int idx = (int)req.RangeFirstItem; idx <= (int)req.RangeLastItem; idx++)
+ AdapterSetItemSelected(this, idx, req.Selected);
+ }
+}
+
//-------------------------------------------------------------------------
// [SECTION] Widgets: ListBox
//-------------------------------------------------------------------------
@@ -6427,8 +8292,11 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags
// - ListBox()
//-------------------------------------------------------------------------
+// This is essentially a thin wrapper to using BeginChild/EndChild with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label.
+// This handle some subtleties with capturing info from the label.
+// If you don't need a label you can pretty much directly use ImGui::BeginChild() with ImGuiChildFlags_FrameStyle.
// Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty"
-// Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height).
+// Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.5f * item_height).
bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg)
{
ImGuiContext& g = *GImGui;
@@ -6442,7 +8310,7 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg)
// Size default to hold ~7.25 items.
// Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar.
- ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f));
+ ImVec2 size = ImTrunc(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f));
ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y));
ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
@@ -6452,36 +8320,24 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg)
{
ItemSize(bb.GetSize(), style.FramePadding.y);
ItemAdd(bb, 0, &frame_bb);
+ g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
return false;
}
- // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well.
+ // FIXME-OPT: We could omit the BeginGroup() if label_size.x == 0.0f but would need to omit the EndGroup() as well.
BeginGroup();
if (label_size.x > 0.0f)
{
ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y);
RenderText(label_pos, label);
window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size);
+ AlignTextToFramePadding();
}
- BeginChildFrame(id, frame_bb.GetSize());
+ BeginChild(id, frame_bb.GetSize(), ImGuiChildFlags_FrameStyle);
return true;
}
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-// OBSOLETED in 1.81 (from February 2021)
-bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items)
-{
- // If height_in_items == -1, default height is maximum 7.
- ImGuiContext& g = *GImGui;
- float height_in_items_f = (height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f;
- ImVec2 size;
- size.x = 0.0f;
- size.y = GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f;
- return BeginListBox(label, size);
-}
-#endif
-
void ImGui::EndListBox()
{
ImGuiContext& g = *GImGui;
@@ -6489,7 +8345,7 @@ void ImGui::EndListBox()
IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?");
IM_UNUSED(window);
- EndChildFrame();
+ EndChild();
EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label
}
@@ -6501,7 +8357,7 @@ bool ImGui::ListBox(const char* label, int* current_item, const char* const item
// This is merely a helper around BeginListBox(), EndListBox().
// Considering using those directly to submit custom data or store selection differently.
-bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items)
+bool ImGui::ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items)
{
ImGuiContext& g = *GImGui;
@@ -6509,7 +8365,7 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v
if (height_in_items < 0)
height_in_items = ImMin(items_count, 7);
float height_in_items_f = height_in_items + 0.25f;
- ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f));
+ ImVec2 size(0.0f, ImTrunc(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f));
if (!BeginListBox(label, size))
return false;
@@ -6519,11 +8375,12 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v
bool value_changed = false;
ImGuiListClipper clipper;
clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to.
+ clipper.IncludeItemByIndex(*current_item);
while (clipper.Step())
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
{
- const char* item_text;
- if (!items_getter(data, i, &item_text))
+ const char* item_text = getter(user_data, i);
+ if (item_text == NULL)
item_text = "*Unknown item*";
PushID(i);
@@ -6558,7 +8415,7 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v
// - others https://github.com/ocornut/imgui/wiki/Useful-Extensions
//-------------------------------------------------------------------------
-int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size)
+int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
@@ -6569,18 +8426,16 @@ int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_get
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- if (frame_size.x == 0.0f)
- frame_size.x = CalcItemWidth();
- if (frame_size.y == 0.0f)
- frame_size.y = label_size.y + (style.FramePadding.y * 2);
+ const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), label_size.y + style.FramePadding.y * 2.0f);
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0));
ItemSize(total_bb, style.FramePadding.y);
- if (!ItemAdd(total_bb, 0, &frame_bb))
+ if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_NoNav))
return -1;
- const bool hovered = ItemHoverable(frame_bb, id);
+ bool hovered;
+ ButtonBehavior(frame_bb, id, &hovered, NULL);
// Determine scale from values if not specified
if (scale_min == FLT_MAX || scale_max == FLT_MAX)
@@ -6820,12 +8675,13 @@ bool ImGui::BeginMenuBar()
IM_ASSERT(!window->DC.MenuBarAppending);
BeginGroup(); // Backup position on layer 0 // FIXME: Misleading to use a group for that backup/restore
- PushID("##menubar");
+ PushID("##MenuBar");
// We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect.
// We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy.
+ const float border_top = ImMax(window->WindowBorderSize * 0.5f - window->TitleBarHeight, 0.0f);
ImRect bar_rect = window->MenuBarRect();
- ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y));
+ ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize * 0.5f), IM_ROUND(bar_rect.Min.y + border_top), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize * 0.5f))), IM_ROUND(bar_rect.Max.y));
clip_rect.ClipWith(window->OuterRectClipped);
PushClipRect(clip_rect.Min, clip_rect.Max, false);
@@ -6846,6 +8702,10 @@ void ImGui::EndMenuBar()
return;
ImGuiContext& g = *GImGui;
+ IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'"
+ IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar);
+ IM_ASSERT(window->DC.MenuBarAppending);
+
// Nav: When a move request within one of our child menu failed, capture the request to navigate among our siblings.
if (NavMoveRequestButNoResultYet() && (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) && (g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu))
{
@@ -6861,24 +8721,32 @@ void ImGui::EndMenuBar()
IM_ASSERT(window->DC.NavLayersActiveMaskNext & (1 << layer)); // Sanity check (FIXME: Seems unnecessary)
FocusWindow(window);
SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]);
- g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection.
- g.NavDisableMouseHover = g.NavMousePosDirty = true;
+ // FIXME-NAV: How to deal with this when not using g.IO.ConfigNavCursorVisibleAuto?
+ if (g.NavCursorVisible)
+ {
+ g.NavCursorVisible = false; // Hide nav cursor for the current frame so we don't see the intermediary selection. Will be set again
+ g.NavCursorHideFrames = 2;
+ }
+ g.NavHighlightItemUnderNav = g.NavMousePosDirty = true;
NavMoveRequestForward(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); // Repeat
}
}
- IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'"
- IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar);
- IM_ASSERT(window->DC.MenuBarAppending);
PopClipRect();
PopID();
window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos.
- g.GroupStack.back().EmitItem = false;
- EndGroup(); // Restore position on layer 0
+
+ // FIXME: Extremely confusing, cleanup by (a) working on WorkRect stack system (b) not using a Group confusingly here.
+ ImGuiGroupData& group_data = g.GroupStack.back();
+ group_data.EmitItem = false;
+ ImVec2 restore_cursor_max_pos = group_data.BackupCursorMaxPos;
+ window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, window->DC.CursorMaxPos.x - window->Scroll.x); // Convert ideal extents for scrolling layer equivalent.
+ EndGroup(); // Restore position on layer 0 // FIXME: Misleading to use a group for that backup/restore
window->DC.LayoutType = ImGuiLayoutType_Vertical;
window->DC.IsSameLine = false;
window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
window->DC.MenuBarAppending = false;
+ window->DC.CursorMaxPos = restore_cursor_max_pos;
}
// Important: calling order matters!
@@ -6905,9 +8773,9 @@ bool ImGui::BeginViewportSideBar(const char* name, ImGuiViewport* viewport_p, Im
// Report our size into work area (for next frame) using actual window size
if (dir == ImGuiDir_Up || dir == ImGuiDir_Left)
- viewport->BuildWorkOffsetMin[axis] += axis_size;
+ viewport->BuildWorkInsetMin[axis] += axis_size;
else if (dir == ImGuiDir_Down || dir == ImGuiDir_Right)
- viewport->BuildWorkOffsetMax[axis] -= axis_size;
+ viewport->BuildWorkInsetMax[axis] += axis_size;
}
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
@@ -6932,23 +8800,34 @@ bool ImGui::BeginMainMenuBar()
float height = GetFrameHeight();
bool is_open = BeginViewportSideBar("##MainMenuBar", viewport, ImGuiDir_Up, height, window_flags);
g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f);
-
- if (is_open)
- BeginMenuBar();
- else
+ if (!is_open)
+ {
End();
+ return false;
+ }
+
+ // Temporarily disable _NoSavedSettings, in the off-chance that tables or child windows submitted within the menu-bar may want to use settings. (#8356)
+ g.CurrentWindow->Flags &= ~ImGuiWindowFlags_NoSavedSettings;
+ BeginMenuBar();
return is_open;
}
void ImGui::EndMainMenuBar()
{
+ ImGuiContext& g = *GImGui;
+ if (!g.CurrentWindow->DC.MenuBarAppending)
+ {
+ IM_ASSERT_USER_ERROR(0, "Calling EndMainMenuBar() not from a menu-bar!"); // Not technically testing that it is the main menu bar
+ return;
+ }
+
EndMenuBar();
+ g.CurrentWindow->Flags |= ImGuiWindowFlags_NoSavedSettings; // Restore _NoSavedSettings (#8356)
// When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
// FIXME: With this strategy we won't be able to restore a NULL focus.
- ImGuiContext& g = *GImGui;
- if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest)
- FocusTopMostWindowUnderOne(g.NavWindow, NULL);
+ if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest && g.ActiveId == 0)
+ FocusTopMostWindowUnderOne(g.NavWindow, NULL, NULL, ImGuiFocusRequestFlags_UnlessBelowModal | ImGuiFocusRequestFlags_RestoreFocusedChild);
End();
}
@@ -6962,9 +8841,9 @@ static bool IsRootOfOpenMenuSet()
// Initially we used 'upper_popup->OpenParentId == window->IDStack.back()' to differentiate multiple menu sets from each others
// (e.g. inside menu bar vs loose menu items) based on parent ID.
- // This would however prevent the use of e.g. PuhsID() user code submitting menus.
+ // This would however prevent the use of e.g. PushID() user code submitting menus.
// Previously this worked between popup and a first child menu because the first child menu always had the _ChildWindow flag,
- // making hovering on parent popup possible while first child menu was focused - but this was generally a bug with other side effects.
+ // making hovering on parent popup possible while first child menu was focused - but this was generally a bug with other side effects.
// Instead we don't treat Popup specifically (in order to consistently support menu features in them), maybe the first child menu of a Popup
// doesn't have the _ChildWindow flag, and we rely on this IsRootOfOpenMenuSet() check to allow hovering between root window/popup and first child menu.
// In the end, lack of ID check made it so we could no longer differentiate between separate menu sets. To compensate for that, we at least check parent window nav layer.
@@ -6972,7 +8851,9 @@ static bool IsRootOfOpenMenuSet()
// open on hover, but that should be a lesser problem, because if such menus are close in proximity in window content then it won't feel weird and if they are far apart
// it likely won't be a problem anyone runs into.
const ImGuiPopupData* upper_popup = &g.OpenPopupStack[g.BeginPopupStack.Size];
- return (window->DC.NavLayerCurrent == upper_popup->ParentNavLayer && upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu));
+ if (window->DC.NavLayerCurrent != upper_popup->ParentNavLayer)
+ return false;
+ return upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu) && ImGui::IsWindowChildOf(upper_popup->Window, window, true);
}
bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
@@ -6998,7 +8879,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
if (g.MenusIdSubmittedThisFrame.contains(id))
{
if (menu_is_open)
- menu_is_open = BeginPopupEx(id, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
+ menu_is_open = BeginPopupMenuEx(id, label, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
else
g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values
return menu_is_open;
@@ -7026,21 +8907,22 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
bool pressed;
// We use ImGuiSelectableFlags_NoSetKeyOwner to allow down on one menu item, move, up on another.
- const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_NoSetKeyOwner | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_DontClosePopups;
+ const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_NoSetKeyOwner | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_NoAutoClosePopups;
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
{
- // Menu inside an horizontal menu bar
+ // Menu inside a horizontal menu bar
// Selectable extend their highlight by half ItemSpacing in each direction.
// For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin()
- popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight());
- window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f);
- PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y));
+ popup_pos = ImVec2(pos.x - 1.0f - IM_TRUNC(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight);
+ window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * 0.5f);
+ PushStyleVarX(ImGuiStyleVar_ItemSpacing, style.ItemSpacing.x * 2.0f);
float w = label_size.x;
ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
- pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, 0.0f));
+ pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, label_size.y));
+ LogSetNextTextDecoration("[", "]");
RenderText(text_pos, label);
PopStyleVar();
- window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
+ window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
}
else
{
@@ -7049,11 +8931,12 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
// Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system.
popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y);
float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f;
- float checkmark_w = IM_FLOOR(g.FontSize * 1.20f);
+ float checkmark_w = IM_TRUNC(g.FontSize * 1.20f);
float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, 0.0f, checkmark_w); // Feedback to next frame
float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w);
ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
- pressed = Selectable("", menu_is_open, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f));
+ pressed = Selectable("", menu_is_open, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, label_size.y));
+ LogSetNextTextDecoration("", ">");
RenderText(text_pos, label);
if (icon_w > 0.0f)
RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon);
@@ -7062,11 +8945,12 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
if (!enabled)
EndDisabled();
- const bool hovered = (g.HoveredId == id) && enabled && !g.NavDisableMouseHover;
+ const bool hovered = (g.HoveredId == id) && enabled && !g.NavHighlightItemUnderNav;
if (menuset_is_open)
PopItemFlag();
bool want_open = false;
+ bool want_open_nav_init = false;
bool want_close = false;
if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu))
{
@@ -7077,18 +8961,18 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
ImGuiWindow* child_menu_window = (child_popup && child_popup->Window && child_popup->Window->ParentWindow == window) ? child_popup->Window : NULL;
if (g.HoveredWindow == window && child_menu_window != NULL)
{
- float ref_unit = g.FontSize; // FIXME-DPI
- float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f;
- ImRect next_window_rect = child_menu_window->Rect();
+ const float ref_unit = g.FontSize; // FIXME-DPI
+ const float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f;
+ const ImRect next_window_rect = child_menu_window->Rect();
ImVec2 ta = (g.IO.MousePos - g.IO.MouseDelta);
ImVec2 tb = (child_dir > 0.0f) ? next_window_rect.GetTL() : next_window_rect.GetTR();
ImVec2 tc = (child_dir > 0.0f) ? next_window_rect.GetBL() : next_window_rect.GetBR();
- float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // add a bit of extra slack.
+ const float pad_farmost_h = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // Add a bit of extra slack.
ta.x += child_dir * -0.5f;
tb.x += child_dir * ref_unit;
tc.x += child_dir * ref_unit;
- tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f); // triangle has maximum height to limit the slope and the bias toward large sub-menus
- tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f);
+ tb.y = ta.y + ImMax((tb.y - pad_farmost_h) - ta.y, -ref_unit * 8.0f); // Triangle has maximum height to limit the slope and the bias toward large sub-menus
+ tc.y = ta.y + ImMin((tc.y + pad_farmost_h) - ta.y, +ref_unit * 8.0f);
moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos);
//GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG]
}
@@ -7096,18 +8980,22 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
// The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not)
// But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon.
// (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.)
- if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavDisableMouseHover)
+ if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavHighlightItemUnderNav && g.ActiveId == 0)
want_close = true;
// Open
+ // (note: at this point 'hovered' actually includes the NavDisableMouseHover == false test)
if (!menu_is_open && pressed) // Click/activate to open
want_open = true;
else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open
want_open = true;
+ else if (!menu_is_open && hovered && g.HoveredIdTimer >= 0.30f && g.MouseStationaryTimer >= 0.30f) // Hover to open (timer fallback)
+ want_open = true;
if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open
{
- want_open = true;
+ want_open = want_open_nav_init = true;
NavMoveRequestCancel();
+ SetNavCursorVisibleAfterMove();
}
}
else
@@ -7139,13 +9027,13 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
if (want_open && !menu_is_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size)
{
- // Don't reopen/recycle same menu level in the same frame, first close the other menu and yield for a frame.
+ // Don't reopen/recycle same menu level in the same frame if it is a different menu ID, first close the other menu and yield for a frame.
OpenPopup(label);
}
else if (want_open)
{
menu_is_open = true;
- OpenPopup(label);
+ OpenPopup(label, ImGuiPopupFlags_NoReopen);// | (want_open_nav_init ? ImGuiPopupFlags_NoReopenAlwaysNavInit : 0));
}
if (menu_is_open)
@@ -7153,10 +9041,18 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
ImGuiLastItemData last_item_in_parent = g.LastItemData;
SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: misleading: the value will serve as reference for FindBestWindowPosForPopup(), not actual pos.
PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding
- menu_is_open = BeginPopupEx(id, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
+ menu_is_open = BeginPopupMenuEx(id, label, window_flags); // menu_is_open may be 'false' when the popup is completely clipped (e.g. zero size display)
PopStyleVar();
if (menu_is_open)
{
+ // Implement what ImGuiPopupFlags_NoReopenAlwaysNavInit would do:
+ // Perform an init request in the case the popup was already open (via a previous mouse hover)
+ if (want_open && want_open_nav_init && !g.NavInitRequest)
+ {
+ FocusWindow(g.CurrentWindow, ImGuiFocusRequestFlags_UnlessBelowModal);
+ NavInitWindow(g.CurrentWindow, false);
+ }
+
// Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu()
// (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck)
g.LastItemData = last_item_in_parent;
@@ -7226,14 +9122,14 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut
// Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful
// Note that in this situation: we don't render the shortcut, we render a highlight instead of the selected tick mark.
float w = label_size.x;
- window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f);
+ window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * 0.5f);
ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
- PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y));
+ PushStyleVarX(ImGuiStyleVar_ItemSpacing, style.ItemSpacing.x * 2.0f);
pressed = Selectable("", selected, selectable_flags, ImVec2(w, 0.0f));
PopStyleVar();
if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible)
RenderText(text_pos, label);
- window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
+ window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
}
else
{
@@ -7242,10 +9138,10 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut
// Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system.
float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f;
float shortcut_w = (shortcut && shortcut[0]) ? CalcTextSize(shortcut, NULL).x : 0.0f;
- float checkmark_w = IM_FLOOR(g.FontSize * 1.20f);
+ float checkmark_w = IM_TRUNC(g.FontSize * 1.20f);
float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, shortcut_w, checkmark_w); // Feedback for next frame
float stretch_w = ImMax(0.0f, GetContentRegionAvail().x - min_w);
- pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f));
+ pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, label_size.y));
if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible)
{
RenderText(pos + ImVec2(offsets->OffsetLabel, 0.0f), label);
@@ -7254,6 +9150,7 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut
if (shortcut_w > 0.0f)
{
PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]);
+ LogSetNextTextDecoration("(", ")");
RenderText(pos + ImVec2(offsets->OffsetShortcut + stretch_w, 0.0f), shortcut, NULL, false);
PopStyleColor();
}
@@ -7297,11 +9194,17 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected,
// - TabBarCalcTabID() [Internal]
// - TabBarCalcMaxTabWidth() [Internal]
// - TabBarFindTabById() [Internal]
+// - TabBarFindTabByOrder() [Internal]
+// - TabBarGetCurrentTab() [Internal]
+// - TabBarGetTabName() [Internal]
// - TabBarRemoveTab() [Internal]
// - TabBarCloseTab() [Internal]
// - TabBarScrollClamp() [Internal]
// - TabBarScrollToTab() [Internal]
-// - TabBarQueueChangeTabOrder() [Internal]
+// - TabBarQueueFocus() [Internal]
+// - TabBarQueueReorder() [Internal]
+// - TabBarProcessReorderFromMousePos() [Internal]
+// - TabBarProcessReorder() [Internal]
// - TabBarScrollingButtons() [Internal]
// - TabBarTabListPopupButton() [Internal]
//-------------------------------------------------------------------------
@@ -7318,7 +9221,7 @@ struct ImGuiTabBarSection
namespace ImGui
{
static void TabBarLayout(ImGuiTabBar* tab_bar);
- static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label);
+ static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label, ImGuiWindow* docked_window);
static float TabBarCalcMaxTabWidth();
static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling);
static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections);
@@ -7381,7 +9284,11 @@ bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags)
ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id);
ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2);
tab_bar->ID = id;
- return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused);
+ tab_bar->SeparatorMinX = tab_bar->BarRect.Min.x - IM_TRUNC(window->WindowPadding.x * 0.5f);
+ tab_bar->SeparatorMaxX = tab_bar->BarRect.Max.x + IM_TRUNC(window->WindowPadding.x * 0.5f);
+ //if (g.NavWindow && IsWindowChildOf(g.NavWindow, window, false, false))
+ flags |= ImGuiTabBarFlags_IsFocused;
+ return BeginTabBarEx(tab_bar, tab_bar_bb, flags);
}
bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImGuiTabBarFlags flags)
@@ -7391,12 +9298,14 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG
if (window->SkipItems)
return false;
+ IM_ASSERT(tab_bar->ID != 0);
if ((flags & ImGuiTabBarFlags_DockNode) == 0)
PushOverrideID(tab_bar->ID);
// Add to stack
g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar));
g.CurrentTabBar = tab_bar;
+ tab_bar->Window = window;
// Append with multiple BeginTabBar()/EndTabBar() pairs.
tab_bar->BackupCursorPos = window->DC.CursorPos;
@@ -7426,18 +9335,19 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG
tab_bar->ItemSpacingY = g.Style.ItemSpacing.y;
tab_bar->FramePadding = g.Style.FramePadding;
tab_bar->TabsActiveCount = 0;
+ tab_bar->LastTabItemIdx = -1;
tab_bar->BeginCount = 1;
// Set cursor pos in a way which only be used in the off-chance the user erroneously submits item before BeginTabItem(): items will overlap
window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY);
// Draw separator
- const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive);
- const float y = tab_bar->BarRect.Max.y - 1.0f;
+ // (it would be misleading to draw this in EndTabBar() suggesting that it may be drawn over tabs, as tab bar are appendable)
+ const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabSelected : ImGuiCol_TabDimmedSelected);
+ if (g.Style.TabBarBorderSize > 0.0f)
{
- const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f);
- const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f);
- window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f);
+ const float y = tab_bar->BarRect.Max.y;
+ window->DrawList->AddRectFilled(ImVec2(tab_bar->SeparatorMinX, y - g.Style.TabBarBorderSize), ImVec2(tab_bar->SeparatorMaxX, y), col);
}
return true;
}
@@ -7474,6 +9384,7 @@ void ImGui::EndTabBar()
if (tab_bar->BeginCount > 1)
window->DC.CursorPos = tab_bar->BackupCursorPos;
+ tab_bar->LastTabItemIdx = -1;
if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
PopID();
@@ -7481,6 +9392,12 @@ void ImGui::EndTabBar()
g.CurrentTabBar = g.CurrentTabBarStack.empty() ? NULL : GetTabBarFromTabBarRef(g.CurrentTabBarStack.back());
}
+// Scrolling happens only in the central section (leading/trailing sections are not scrolling)
+static float TabBarCalcScrollableWidth(ImGuiTabBar* tab_bar, ImGuiTabBarSection* sections)
+{
+ return tab_bar->BarRect.GetWidth() - sections[0].Width - sections[2].Width - sections[1].Spacing;
+}
+
// This is called only once a frame before by the first call to ItemTab()
// The reason we're not calling it in BeginTabBar() is to leave a chance to the user to call the SetTabItemClosed() functions.
static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
@@ -7583,7 +9500,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
// Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar.
// Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet,
// and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window.
- const char* tab_name = tab_bar->GetTabName(tab);
+ const char* tab_name = TabBarGetTabName(tab_bar, tab);
const bool has_close_button_or_unsaved_marker = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) == 0 || (tab->Flags & ImGuiTabItemFlags_UnsavedDocument);
tab->ContentWidth = (tab->RequestedWidth >= 0.0f) ? tab->RequestedWidth : TabItemCalcSize(tab_name, has_close_button_or_unsaved_marker).x;
@@ -7637,7 +9554,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++)
{
ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index];
- float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width);
+ float shrinked_width = IM_TRUNC(g.ShrinkWidthBuffer[tab_n].Width);
if (shrinked_width < 0.0f)
continue;
@@ -7662,6 +9579,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
{
ImGuiTabItem* tab = &tab_bar->Tabs[section_tab_index + tab_n];
tab->Offset = tab_offset;
+ tab->NameOffset = -1;
tab_offset += tab->Width + (tab_n < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f);
}
tab_bar->WidthAllTabs += ImMax(section->Width + section->Spacing, 0.0f);
@@ -7669,6 +9587,9 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
section_tab_index += section->TabCount;
}
+ // Clear name buffers
+ tab_bar->TabsNames.Buf.resize(0);
+
// If we have lost the selected tab, select the next most recently active one
if (found_selected_tab_id == false)
tab_bar->SelectedTabId = 0;
@@ -7679,9 +9600,23 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
tab_bar->VisibleTabId = tab_bar->SelectedTabId;
tab_bar->VisibleTabWasSubmitted = false;
- // Update scrolling
+ // Apply request requests
if (scroll_to_tab_id != 0)
TabBarScrollToTab(tab_bar, scroll_to_tab_id, sections);
+ else if ((tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll) && IsMouseHoveringRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, true) && IsWindowContentHoverable(g.CurrentWindow))
+ {
+ const float wheel = g.IO.MouseWheelRequestAxisSwap ? g.IO.MouseWheel : g.IO.MouseWheelH;
+ const ImGuiKey wheel_key = g.IO.MouseWheelRequestAxisSwap ? ImGuiKey_MouseWheelY : ImGuiKey_MouseWheelX;
+ if (TestKeyOwner(wheel_key, tab_bar->ID) && wheel != 0.0f)
+ {
+ const float scroll_step = wheel * TabBarCalcScrollableWidth(tab_bar, sections) / 3.0f;
+ tab_bar->ScrollingTargetDistToVisibility = 0.0f;
+ tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget - scroll_step);
+ }
+ SetKeyOwner(wheel_key, tab_bar->ID);
+ }
+
+ // Update scrolling
tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim);
tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget);
if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget)
@@ -7700,10 +9635,6 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
tab_bar->ScrollingRectMinX = tab_bar->BarRect.Min.x + sections[0].Width + sections[0].Spacing;
tab_bar->ScrollingRectMaxX = tab_bar->BarRect.Max.x - sections[2].Width - sections[1].Spacing;
- // Clear name buffers
- if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
- tab_bar->TabsNames.Buf.resize(0);
-
// Actual layout in host window (we don't do it in BeginTabBar() so as not to waste an extra frame)
ImGuiWindow* window = g.CurrentWindow;
window->DC.CursorPos = tab_bar->BarRect.Min;
@@ -7711,9 +9642,11 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, tab_bar->BarRect.Min.x + tab_bar->WidthAllTabsIdeal);
}
-// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack.
-static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label)
+// Dockable windows uses Name/ID in the global namespace. Non-dockable items use the ID stack.
+static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label, ImGuiWindow* docked_window)
{
+ IM_ASSERT(docked_window == NULL); // master branch only
+ IM_UNUSED(docked_window);
if (tab_bar->Flags & ImGuiTabBarFlags_DockNode)
{
ImGuiID id = ImHashStr(label);
@@ -7742,7 +9675,30 @@ ImGuiTabItem* ImGui::TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id)
return NULL;
}
-// The *TabId fields be already set by the docking system _before_ the actual TabItem was created, so we clear them regardless.
+// Order = visible order, not submission order! (which is tab->BeginOrder)
+ImGuiTabItem* ImGui::TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order)
+{
+ if (order < 0 || order >= tab_bar->Tabs.Size)
+ return NULL;
+ return &tab_bar->Tabs[order];
+}
+
+ImGuiTabItem* ImGui::TabBarGetCurrentTab(ImGuiTabBar* tab_bar)
+{
+ if (tab_bar->LastTabItemIdx < 0 || tab_bar->LastTabItemIdx >= tab_bar->Tabs.Size)
+ return NULL;
+ return &tab_bar->Tabs[tab_bar->LastTabItemIdx];
+}
+
+const char* ImGui::TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
+{
+ if (tab->NameOffset == -1)
+ return "N/A";
+ IM_ASSERT(tab->NameOffset < tab_bar->TabsNames.Buf.Size);
+ return tab_bar->TabsNames.Buf.Data + tab->NameOffset;
+}
+
+// The *TabId fields are already set by the docking system _before_ the actual TabItem was created, so we clear them regardless.
void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id)
{
if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id))
@@ -7758,7 +9714,7 @@ void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
if (tab->Flags & ImGuiTabItemFlags_Button)
return; // A button appended with TabItemButton().
- if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument))
+ if ((tab->Flags & (ImGuiTabItemFlags_UnsavedDocument | ImGuiTabItemFlags_NoAssumedClosure)) == 0)
{
// This will remove a frame of lag for selecting another tab on closure.
// However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure
@@ -7773,7 +9729,7 @@ void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
{
// Actually select before expecting closure attempt (on an UnsavedDocument tab user is expect to e.g. show a popup)
if (tab_bar->VisibleTabId != tab->ID)
- tab_bar->NextSelectedTabId = tab->ID;
+ TabBarQueueFocus(tab_bar, tab);
}
}
@@ -7794,11 +9750,10 @@ static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGui
ImGuiContext& g = *GImGui;
float margin = g.FontSize * 1.0f; // When to scroll to make Tab N+1 visible always make a bit of N visible to suggest more scrolling area (since we don't have a scrollbar)
- int order = tab_bar->GetTabOrder(tab);
+ int order = TabBarGetTabOrder(tab_bar, tab);
// Scrolling happens only in the central section (leading/trailing sections are not scrolling)
- // FIXME: This is all confusing.
- float scrollable_width = tab_bar->BarRect.GetWidth() - sections[0].Width - sections[2].Width - sections[1].Spacing;
+ float scrollable_width = TabBarCalcScrollableWidth(tab_bar, sections);
// We make all tabs positions all relative Sections[0].Width to make code simpler
float tab_x1 = tab->Offset - sections[0].Width + (order > sections[0].TabCount - 1 ? -margin : 0.0f);
@@ -7818,7 +9773,19 @@ static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGui
}
}
-void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset)
+void ImGui::TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
+{
+ tab_bar->NextSelectedTabId = tab->ID;
+}
+
+void ImGui::TabBarQueueFocus(ImGuiTabBar* tab_bar, const char* tab_name)
+{
+ IM_ASSERT((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0); // Only supported for manual/explicit tab bars
+ ImGuiID tab_id = TabBarCalcTabID(tab_bar, tab_name, NULL);
+ tab_bar->NextSelectedTabId = tab_id;
+}
+
+void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset)
{
IM_ASSERT(offset != 0);
IM_ASSERT(tab_bar->ReorderRequestTabId == 0);
@@ -7826,7 +9793,7 @@ void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, in
tab_bar->ReorderRequestOffset = (ImS16)offset;
}
-void ImGui::TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* src_tab, ImVec2 mouse_pos)
+void ImGui::TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* src_tab, ImVec2 mouse_pos)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(tab_bar->ReorderRequestTabId == 0);
@@ -7869,7 +9836,7 @@ bool ImGui::TabBarProcessReorder(ImGuiTabBar* tab_bar)
return false;
//IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools
- int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestOffset;
+ int tab2_order = TabBarGetTabOrder(tab_bar, tab1) + tab_bar->ReorderRequestOffset;
if (tab2_order < 0 || tab2_order >= tab_bar->Tabs.Size)
return false;
@@ -7910,17 +9877,19 @@ static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar)
PushStyleColor(ImGuiCol_Text, arrow_col);
PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ PushItemFlag(ImGuiItemFlags_ButtonRepeat, true);
const float backup_repeat_delay = g.IO.KeyRepeatDelay;
const float backup_repeat_rate = g.IO.KeyRepeatRate;
g.IO.KeyRepeatDelay = 0.250f;
g.IO.KeyRepeatRate = 0.200f;
float x = ImMax(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.x - scrolling_buttons_width);
window->DC.CursorPos = ImVec2(x, tab_bar->BarRect.Min.y);
- if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat))
+ if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick))
select_dir = -1;
window->DC.CursorPos = ImVec2(x + arrow_button_size.x, tab_bar->BarRect.Min.y);
- if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat))
+ if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick))
select_dir = +1;
+ PopItemFlag();
PopStyleColor(2);
g.IO.KeyRepeatRate = backup_repeat_rate;
g.IO.KeyRepeatDelay = backup_repeat_delay;
@@ -7929,7 +9898,7 @@ static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar)
if (select_dir != 0)
if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId))
{
- int selected_order = tab_bar->GetTabOrder(tab_item);
+ int selected_order = TabBarGetTabOrder(tab_bar, tab_item);
int target_order = selected_order + select_dir;
// Skip tab item buttons until another tab item is found or end is reached
@@ -7981,7 +9950,7 @@ static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar)
if (tab->Flags & ImGuiTabItemFlags_Button)
continue;
- const char* tab_name = tab_bar->GetTabName(tab);
+ const char* tab_name = TabBarGetTabName(tab_bar, tab);
if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID))
tab_to_select = tab;
}
@@ -8018,9 +9987,9 @@ bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags f
IM_ASSERT_USER_ERROR(tab_bar, "Needs to be called between BeginTabBar() and EndTabBar()!");
return false;
}
- IM_ASSERT(!(flags & ImGuiTabItemFlags_Button)); // BeginTabItem() Can't be used with button flags, use TabItemButton() instead!
+ IM_ASSERT((flags & ImGuiTabItemFlags_Button) == 0); // BeginTabItem() Can't be used with button flags, use TabItemButton() instead!
- bool ret = TabItemEx(tab_bar, label, p_open, flags);
+ bool ret = TabItemEx(tab_bar, label, p_open, flags, NULL);
if (ret && !(flags & ImGuiTabItemFlags_NoPushId))
{
ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
@@ -8061,10 +10030,27 @@ bool ImGui::TabItemButton(const char* label, ImGuiTabItemFlags flags)
IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!");
return false;
}
- return TabItemEx(tab_bar, label, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder);
+ return TabItemEx(tab_bar, label, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder, NULL);
}
-bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags)
+void ImGui::TabItemSpacing(const char* str_id, ImGuiTabItemFlags flags, float width)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return;
+
+ ImGuiTabBar* tab_bar = g.CurrentTabBar;
+ if (tab_bar == NULL)
+ {
+ IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!");
+ return;
+ }
+ SetNextItemWidth(width);
+ TabItemEx(tab_bar, str_id, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder | ImGuiTabItemFlags_Invisible, NULL);
+}
+
+bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window)
{
// Layout whole tab bar if not already done
ImGuiContext& g = *GImGui;
@@ -8079,7 +10065,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
return false;
const ImGuiStyle& style = g.Style;
- const ImGuiID id = TabBarCalcTabID(tab_bar, label);
+ const ImGuiID id = TabBarCalcTabID(tab_bar, label, docked_window);
// If the user called us with *p_open == false, we early out and don't render.
// We make a call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID.
@@ -8114,7 +10100,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
// Calculate tab contents size
ImVec2 size = TabItemCalcSize(label, (p_open != NULL) || (flags & ImGuiTabItemFlags_UnsavedDocument));
tab->RequestedWidth = -1.0f;
- if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth)
+ if (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasWidth)
size.x = tab->RequestedWidth = g.NextItemData.Width;
if (tab_is_new)
tab->Width = ImMax(1.0f, size.x);
@@ -8129,18 +10115,25 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
tab->LastFrameVisible = g.FrameCount;
tab->Flags = flags;
- // Append name with zero-terminator
- tab->NameOffset = (ImS32)tab_bar->TabsNames.size();
- tab_bar->TabsNames.append(label, label + strlen(label) + 1);
+ // Append name _WITH_ the zero-terminator
+ if (docked_window != NULL)
+ {
+ IM_ASSERT(docked_window == NULL); // master branch only
+ }
+ else
+ {
+ tab->NameOffset = (ImS32)tab_bar->TabsNames.size();
+ tab_bar->TabsNames.append(label, label + ImStrlen(label) + 1);
+ }
// Update selected tab
if (!is_tab_button)
{
if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0)
if (!tab_bar_appearing || tab_bar->SelectedTabId == 0)
- tab_bar->NextSelectedTabId = id; // New tabs gets activated
+ TabBarQueueFocus(tab_bar, tab); // New tabs gets activated
if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // _SetSelected can only be passed on explicit tab bar
- tab_bar->NextSelectedTabId = id;
+ TabBarQueueFocus(tab_bar, tab);
}
// Lock visibility
@@ -8174,7 +10167,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
const bool is_central_section = (tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0;
size.x = tab->Width;
if (is_central_section)
- window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f);
+ window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_TRUNC(tab->Offset - tab_bar->ScrollingAnim), 0.0f);
else
window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f);
ImVec2 pos = window->DC.CursorPos;
@@ -8198,17 +10191,17 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
}
// Click to Select a tab
- ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap);
+ // Allow the close button to overlap
+ ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowOverlap);
if (g.DragDropActive)
button_flags |= ImGuiButtonFlags_PressedOnDragDropHold;
- bool hovered, held;
- bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
+ bool hovered, held, pressed;
+ if (flags & ImGuiTabItemFlags_Invisible)
+ hovered = held = pressed = false;
+ else
+ pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
if (pressed && !is_tab_button)
- tab_bar->NextSelectedTabId = id;
-
- // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered)
- if (g.ActiveId != id)
- SetItemAllowOverlap();
+ TabBarQueueFocus(tab_bar, tab);
// Drag and drop: re-order tabs
if (held && !tab_appearing && IsMouseDragging(0))
@@ -8231,36 +10224,66 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth)
{
// Enlarge tab display when hovering
- bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f)));
+ bb.Max.x = bb.Min.x + IM_TRUNC(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f)));
display_draw_list = GetForegroundDrawList(window);
TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive));
}
#endif
// Render tab shape
- ImDrawList* display_draw_list = window->DrawList;
- const ImU32 tab_col = GetColorU32((held || hovered) ? ImGuiCol_TabHovered : tab_contents_visible ? (tab_bar_focused ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive) : (tab_bar_focused ? ImGuiCol_Tab : ImGuiCol_TabUnfocused));
- TabItemBackground(display_draw_list, bb, flags, tab_col);
- RenderNavHighlight(bb, id);
-
- // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget.
- const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup);
- if (hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1)))
- if (!is_tab_button)
- tab_bar->NextSelectedTabId = id;
-
- if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)
- flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton;
-
- // Render tab label, process close button
- const ImGuiID close_button_id = p_open ? GetIDWithSeed("#CLOSE", NULL, id) : 0;
- bool just_closed;
- bool text_clipped;
- TabItemLabelAndCloseButton(display_draw_list, bb, tab_just_unsaved ? (flags & ~ImGuiTabItemFlags_UnsavedDocument) : flags, tab_bar->FramePadding, label, id, close_button_id, tab_contents_visible, &just_closed, &text_clipped);
- if (just_closed && p_open != NULL)
+ const bool is_visible = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible) && !(flags & ImGuiTabItemFlags_Invisible);
+ if (is_visible)
{
- *p_open = false;
- TabBarCloseTab(tab_bar, tab);
+ ImDrawList* display_draw_list = window->DrawList;
+ const ImU32 tab_col = GetColorU32((held || hovered) ? ImGuiCol_TabHovered : tab_contents_visible ? (tab_bar_focused ? ImGuiCol_TabSelected : ImGuiCol_TabDimmedSelected) : (tab_bar_focused ? ImGuiCol_Tab : ImGuiCol_TabDimmed));
+ TabItemBackground(display_draw_list, bb, flags, tab_col);
+ if (tab_contents_visible && (tab_bar->Flags & ImGuiTabBarFlags_DrawSelectedOverline) && style.TabBarOverlineSize > 0.0f)
+ {
+ // Might be moved to TabItemBackground() ?
+ ImVec2 tl = bb.GetTL() + ImVec2(0, 1.0f * g.CurrentDpiScale);
+ ImVec2 tr = bb.GetTR() + ImVec2(0, 1.0f * g.CurrentDpiScale);
+ ImU32 overline_col = GetColorU32(tab_bar_focused ? ImGuiCol_TabSelectedOverline : ImGuiCol_TabDimmedSelectedOverline);
+ if (style.TabRounding > 0.0f)
+ {
+ float rounding = style.TabRounding;
+ display_draw_list->PathArcToFast(tl + ImVec2(+rounding, +rounding), rounding, 7, 9);
+ display_draw_list->PathArcToFast(tr + ImVec2(-rounding, +rounding), rounding, 9, 11);
+ display_draw_list->PathStroke(overline_col, 0, style.TabBarOverlineSize);
+ }
+ else
+ {
+ display_draw_list->AddLine(tl - ImVec2(0.5f, 0.5f), tr - ImVec2(0.5f, 0.5f), overline_col, style.TabBarOverlineSize);
+ }
+ }
+ RenderNavCursor(bb, id);
+
+ // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget.
+ const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup);
+ if (tab_bar->SelectedTabId != tab->ID && hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1)) && !is_tab_button)
+ TabBarQueueFocus(tab_bar, tab);
+
+ if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)
+ flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton;
+
+ // Render tab label, process close button
+ const ImGuiID close_button_id = p_open ? GetIDWithSeed("#CLOSE", NULL, id) : 0;
+ bool just_closed;
+ bool text_clipped;
+ TabItemLabelAndCloseButton(display_draw_list, bb, tab_just_unsaved ? (flags & ~ImGuiTabItemFlags_UnsavedDocument) : flags, tab_bar->FramePadding, label, id, close_button_id, tab_contents_visible, &just_closed, &text_clipped);
+ if (just_closed && p_open != NULL)
+ {
+ *p_open = false;
+ TabBarCloseTab(tab_bar, tab);
+ }
+
+ // Tooltip
+ // (Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer-> seems ok)
+ // (We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar, which g.HoveredId ignores)
+ // FIXME: This is a mess.
+ // FIXME: We may want disabled tab to still display the tooltip?
+ if (text_clipped && g.HoveredId == id && !held)
+ if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip))
+ SetItemTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label);
}
// Restore main window position so user can draw there
@@ -8268,16 +10291,6 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
PopClipRect();
window->DC.CursorPos = backup_main_cursor_pos;
- // Tooltip
- // (Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer-> seems ok)
- // (We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar, which g.HoveredId ignores)
- // FIXME: This is a mess.
- // FIXME: We may want disabled tab to still display the tooltip?
- if (text_clipped && g.HoveredId == id && !held)
- if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip))
- if (IsItemHovered(ImGuiHoveredFlags_DelayNormal))
- SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label);
-
IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected
if (is_tab_button)
return pressed;
@@ -8294,7 +10307,7 @@ void ImGui::SetTabItemClosed(const char* label)
if (is_within_manual_tab_bar)
{
ImGuiTabBar* tab_bar = g.CurrentTabBar;
- ImGuiID tab_id = TabBarCalcTabID(tab_bar, label);
+ ImGuiID tab_id = TabBarCalcTabID(tab_bar, label, NULL);
if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id))
tab->WantClose = true; // Will be processed by next call to TabBarLayout()
}
@@ -8312,6 +10325,12 @@ ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button_or_unsave
return ImVec2(ImMin(size.x, TabBarCalcMaxTabWidth()), size.y);
}
+ImVec2 ImGui::TabItemCalcSize(ImGuiWindow*)
+{
+ IM_ASSERT(0); // This function exists to facilitate merge with 'docking' branch.
+ return ImVec2(0.0f, 0.0f);
+}
+
void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col)
{
// While rendering tabs, we trim 1 pixel off the top of our bounding box so they can fit within a regular frame height while looking "detached" from it.
@@ -8321,7 +10340,7 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI
IM_ASSERT(width > 0.0f);
const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f));
const float y1 = bb.Min.y + 1.0f;
- const float y2 = bb.Max.y - 1.0f;
+ const float y2 = bb.Max.y - g.Style.TabBarBorderSize;
draw_list->PathLineTo(ImVec2(bb.Min.x, y2));
draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9);
draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12);
@@ -8372,7 +10391,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
}
const float button_sz = g.FontSize;
- const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y);
+ const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x - button_sz), bb.Min.y + frame_padding.y);
// Close Button & Unsaved Marker
// We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap()
@@ -8381,30 +10400,34 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
// 'g.ActiveId==close_button_id' will be true when we are holding on the close button, in which case both hovered booleans are false
bool close_button_pressed = false;
bool close_button_visible = false;
+ bool is_hovered = g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == tab_id || g.ActiveId == close_button_id; // Any interaction account for this too.
+
if (close_button_id != 0)
- if (is_contents_visible || bb.GetWidth() >= ImMax(button_sz, g.Style.TabMinWidthForCloseButton))
- if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == tab_id || g.ActiveId == close_button_id)
- close_button_visible = true;
- bool unsaved_marker_visible = (flags & ImGuiTabItemFlags_UnsavedDocument) != 0 && (button_pos.x + button_sz <= bb.Max.x);
+ {
+ if (is_contents_visible)
+ close_button_visible = (g.Style.TabCloseButtonMinWidthSelected < 0.0f) ? true : (is_hovered && bb.GetWidth() >= ImMax(button_sz, g.Style.TabCloseButtonMinWidthSelected));
+ else
+ close_button_visible = (g.Style.TabCloseButtonMinWidthUnselected < 0.0f) ? true : (is_hovered && bb.GetWidth() >= ImMax(button_sz, g.Style.TabCloseButtonMinWidthUnselected));
+ }
- if (close_button_visible)
+ // When tabs/document is unsaved, the unsaved marker takes priority over the close button.
+ const bool unsaved_marker_visible = (flags & ImGuiTabItemFlags_UnsavedDocument) != 0 && (button_pos.x + button_sz <= bb.Max.x) && (!close_button_visible || !is_hovered);
+ if (unsaved_marker_visible)
+ {
+ const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz));
+ RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text));
+ }
+ else if (close_button_visible)
{
ImGuiLastItemData last_item_backup = g.LastItemData;
- PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding);
if (CloseButton(close_button_id, button_pos))
close_button_pressed = true;
- PopStyleVar();
g.LastItemData = last_item_backup;
// Close with middle mouse button
- if (!(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2))
+ if (is_hovered && !(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2))
close_button_pressed = true;
}
- else if (unsaved_marker_visible)
- {
- const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz) + g.Style.FramePadding * 2.0f);
- RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text));
- }
// This is all rather complicated
// (the main idea is that because the close button only appears on hover, we don't want it to alter the ellipsis position)
@@ -8416,6 +10439,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
text_ellipsis_clip_bb.Max.x -= unsaved_marker_visible ? (button_sz * 0.80f) : 0.0f;
ellipsis_max_x = text_pixel_clip_bb.Max.x;
}
+ LogSetNextTextDecoration("/", "\\");
RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size);
#if 0
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.inl b/3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.inl
index ce34f5d6427..5ddaf707e59 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.inl
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.inl
@@ -55,10 +55,10 @@ namespace ImGui
int data_editing_addr_backup = DataEditingAddr;
if (DataEditingAddr != -1)
{
- if (IsKeyPressed(GetKeyIndex(ImGuiKey_UpArrow)) && DataEditingAddr >= Rows) { DataEditingAddr -= Rows; DataEditingTakeFocus = true; }
- else if (IsKeyPressed(GetKeyIndex(ImGuiKey_DownArrow)) && DataEditingAddr < mem_size - Rows) { DataEditingAddr += Rows; DataEditingTakeFocus = true; }
- else if (IsKeyPressed(GetKeyIndex(ImGuiKey_LeftArrow)) && DataEditingAddr > 0) { DataEditingAddr -= 1; DataEditingTakeFocus = true; }
- else if (IsKeyPressed(GetKeyIndex(ImGuiKey_RightArrow)) && DataEditingAddr < mem_size - 1) { DataEditingAddr += 1; DataEditingTakeFocus = true; }
+ if (IsKeyPressed(ImGuiKey_UpArrow) && DataEditingAddr >= Rows) { DataEditingAddr -= Rows; DataEditingTakeFocus = true; }
+ else if (IsKeyPressed(ImGuiKey_DownArrow) && DataEditingAddr < mem_size - Rows) { DataEditingAddr += Rows; DataEditingTakeFocus = true; }
+ else if (IsKeyPressed(ImGuiKey_LeftArrow) && DataEditingAddr > 0) { DataEditingAddr -= 1; DataEditingTakeFocus = true; }
+ else if (IsKeyPressed(ImGuiKey_RightArrow) && DataEditingAddr < mem_size - 1) { DataEditingAddr += 1; DataEditingTakeFocus = true; }
}
if ((DataEditingAddr / Rows) != (data_editing_addr_backup / Rows))
@@ -207,7 +207,7 @@ namespace ImGui
AlignTextToFramePadding();
PushItemWidth(50);
- PushAllowKeyboardFocus(false);
+ PushItemFlag(ImGuiItemFlags_NoTabStop, true);
int rows_backup = Rows;
if (DragInt("##rows", &Rows, 0.2f, 4, 32, "%.0f rows"))
{
@@ -216,7 +216,7 @@ namespace ImGui
SetWindowSize(new_window_size);
}
- PopAllowKeyboardFocus();
+ PopItemFlag();
PopItemWidth();
SameLine();
Text("Range %0*x..%0*x", addr_digits_count, (int)base_display_addr, addr_digits_count, (int)base_display_addr+mem_size-1);
diff --git a/3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.inl b/3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.inl
index 419ec763872..659da723e03 100644
--- a/3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.inl
+++ b/3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.inl
@@ -4,10 +4,6 @@
namespace ImGui
{
-extern float RoundScalarWithFormatFloat(const char* format, ImGuiDataType data_type, float v);
-
-extern float SliderCalcRatioFromValueFloat(ImGuiDataType data_type, float v, float v_min, float v_max, float power, float linear_zero_pos);
-
// ~80% common code with ImGui::SliderBehavior
bool RangeSliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v1, float* v2, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags)
{
@@ -91,7 +87,7 @@ bool RangeSliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v1, float* v
snprintf(fmt, 64, "%%.%df", decimal_precision);
// Round past decimal precision
- new_value = RoundScalarWithFormatFloat(fmt, ImGuiDataType_Float, new_value);
+ new_value = RoundScalarWithFormatT<float>(fmt, ImGuiDataType_Float, new_value);
if (*v1 != new_value || *v2 != new_value)
{
if (fabsf(*v1 - new_value) < fabsf(*v2 - new_value))
@@ -112,7 +108,7 @@ bool RangeSliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v1, float* v
}
// Calculate slider grab positioning
- float grab_t = SliderCalcRatioFromValueFloat(ImGuiDataType_Float, *v1, v_min, v_max, power, linear_zero_pos);
+ float grab_t = ScaleRatioFromValueT<float, float, float>(ImGuiDataType_Float, *v1, v_min, v_max, false, power, linear_zero_pos);
// Draw
if (!is_horizontal)
@@ -126,7 +122,7 @@ bool RangeSliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v1, float* v
window->DrawList->AddRectFilled(grab_bb1.Min, grab_bb1.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
// Calculate slider grab positioning
- grab_t = SliderCalcRatioFromValueFloat(ImGuiDataType_Float, *v2, v_min, v_max, power, linear_zero_pos);
+ grab_t = ScaleRatioFromValueT<float, float, float>(ImGuiDataType_Float, *v2, v_min, v_max, false, power, linear_zero_pos);
// Draw
if (!is_horizontal)
@@ -173,7 +169,7 @@ bool RangeSliderFloat(const char* label, float* v1, float* v2, float v_min, floa
return false;
}
- const bool hovered = ItemHoverable(frame_bb, id);
+ const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
if (hovered)
SetHoveredID(id);
@@ -183,13 +179,12 @@ bool RangeSliderFloat(const char* label, float* v1, float* v2, float v_min, floa
// Tabbing or CTRL-clicking on Slider turns it into an input box
bool start_text_input = false;
- const bool tab_focus_requested = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedByTabbing) != 0;
- if (tab_focus_requested || (hovered && g.IO.MouseClicked[0]))
+ if (hovered && g.IO.MouseClicked[0])
{
SetActiveID(id, window);
FocusWindow(window);
- if (tab_focus_requested || g.IO.KeyCtrl)
+ if (g.IO.KeyCtrl)
{
start_text_input = true;
g.TempInputId = 0;
diff --git a/3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.h b/3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.h
index f7fdc6ad840..e3de282ddf0 100644
--- a/3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.h
+++ b/3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.h
@@ -56,6 +56,7 @@ namespace spv {
}
#include <algorithm>
+#include <cstdint>
#include <map>
#include <memory>
#include <set>
diff --git a/3rdparty/bgfx/3rdparty/stb/stb_textedit.h b/3rdparty/bgfx/3rdparty/stb/stb_textedit.h
index 7644670975c..b7a761c8538 100644
--- a/3rdparty/bgfx/3rdparty/stb/stb_textedit.h
+++ b/3rdparty/bgfx/3rdparty/stb/stb_textedit.h
@@ -1,10 +1,14 @@
// [DEAR IMGUI]
-// This is a slightly modified version of stb_textedit.h 1.13.
+// This is a slightly modified version of stb_textedit.h 1.14.
// Those changes would need to be pushed into nothings/stb:
// - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321)
+// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000 + #6783)
+// - Added name to struct or it may be forward declared in our code.
+// - Added UTF-8 support (see https://github.com/nothings/stb/issues/188 + https://github.com/ocornut/imgui/pull/7925)
// Grep for [DEAR IMGUI] to find the changes.
+// - Also renamed macros used or defined outside of IMSTB_TEXTEDIT_IMPLEMENTATION block from STB_TEXTEDIT_* to IMSTB_TEXTEDIT_*
-// stb_textedit.h - v1.13 - public domain - Sean Barrett
+// stb_textedit.h - v1.14 - public domain - Sean Barrett
// Development of this library was sponsored by RAD Game Tools
//
// This C header file implements the guts of a multi-line text-editing
@@ -19,7 +23,7 @@
// texts, as its performance does not scale and it has limited undo).
//
// Non-trivial behaviors are modelled after Windows text controls.
-//
+//
//
// LICENSE
//
@@ -29,16 +33,17 @@
// DEPENDENCIES
//
// Uses the C runtime function 'memmove', which you can override
-// by defining STB_TEXTEDIT_memmove before the implementation.
+// by defining IMSTB_TEXTEDIT_memmove before the implementation.
// Uses no other functions. Performs no runtime allocations.
//
//
// VERSION HISTORY
//
+// 1.14 (2021-07-11) page up/down, various fixes
// 1.13 (2019-02-07) fix bug in undo size management
// 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash
// 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield
-// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual
+// 1.10 (2016-10-25) suppress warnings about casting away const with -Wcast-qual
// 1.9 (2016-08-27) customizable move-by-word
// 1.8 (2016-04-02) better keyboard handling when mouse button is down
// 1.7 (2015-09-13) change y range handling in case baseline is non-0
@@ -58,6 +63,7 @@
// Ulf Winklemann: move-by-word in 1.1
// Fabian Giesen: secondary key inputs in 1.5
// Martins Mozeiko: STB_TEXTEDIT_memmove in 1.6
+// Louis Schnellbach: page up/down in 1.14
//
// Bugfixes:
// Scott Graham
@@ -93,8 +99,8 @@
// moderate sizes. The undo system does no memory allocations, so
// it grows STB_TexteditState by the worst-case storage which is (in bytes):
//
-// [4 + 3 * sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATE_COUNT
-// + sizeof(STB_TEXTEDIT_CHARTYPE) * STB_TEXTEDIT_UNDOCHAR_COUNT
+// [4 + 3 * sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATECOUNT
+// + sizeof(STB_TEXTEDIT_CHARTYPE) * STB_TEXTEDIT_UNDOCHARCOUNT
//
//
// Implementation mode:
@@ -205,6 +211,7 @@
// int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
// int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len)
// void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXEDIT_KEYTYPE key)
+// void stb_textedit_text(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int text_len)
//
// Each of these functions potentially updates the string and updates the
// state.
@@ -217,20 +224,20 @@
// call this with the mouse x,y on a mouse down; it will update the cursor
// and reset the selection start/end to the cursor point. the x,y must
// be relative to the text widget, with (0,0) being the top left.
-//
+//
// drag:
// call this with the mouse x,y on a mouse drag/up; it will update the
// cursor and the selection end point
-//
+//
// cut:
// call this to delete the current selection; returns true if there was
// one. you should FIRST copy the current selection to the system paste buffer.
// (To copy, just copy the current selection out of the string yourself.)
-//
+//
// paste:
// call this to paste text at the current cursor point or over the current
// selection if there is one.
-//
+//
// key:
// call this for keyboard inputs sent to the textfield. you can use it
// for "key down" events or for "translated" key events. if you need to
@@ -239,9 +246,14 @@
// various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit
// set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is
// clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to
-// anything other type you wante before including.
+// anything other type you want before including.
+// if the STB_TEXTEDIT_KEYTOTEXT function is defined, selected keys are
+// transformed into text and stb_textedit_text() is automatically called.
+//
+// text: [DEAR IMGUI] added 2024-09
+// call this to text inputs sent to the textfield.
+//
//
-//
// When rendering, you can read the cursor position and selection state from
// the STB_TexteditState.
//
@@ -271,8 +283,8 @@
////
////
-#ifndef INCLUDE_STB_TEXTEDIT_H
-#define INCLUDE_STB_TEXTEDIT_H
+#ifndef INCLUDE_IMSTB_TEXTEDIT_H
+#define INCLUDE_IMSTB_TEXTEDIT_H
////////////////////////////////////////////////////////////////////////
//
@@ -283,38 +295,38 @@
// and undo state.
//
-#ifndef STB_TEXTEDIT_UNDOSTATECOUNT
-#define STB_TEXTEDIT_UNDOSTATECOUNT 99
+#ifndef IMSTB_TEXTEDIT_UNDOSTATECOUNT
+#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99
#endif
-#ifndef STB_TEXTEDIT_UNDOCHARCOUNT
-#define STB_TEXTEDIT_UNDOCHARCOUNT 999
+#ifndef IMSTB_TEXTEDIT_UNDOCHARCOUNT
+#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999
#endif
-#ifndef STB_TEXTEDIT_CHARTYPE
-#define STB_TEXTEDIT_CHARTYPE int
+#ifndef IMSTB_TEXTEDIT_CHARTYPE
+#define IMSTB_TEXTEDIT_CHARTYPE int
#endif
-#ifndef STB_TEXTEDIT_POSITIONTYPE
-#define STB_TEXTEDIT_POSITIONTYPE int
+#ifndef IMSTB_TEXTEDIT_POSITIONTYPE
+#define IMSTB_TEXTEDIT_POSITIONTYPE int
#endif
typedef struct
{
// private data
- STB_TEXTEDIT_POSITIONTYPE where;
- STB_TEXTEDIT_POSITIONTYPE insert_length;
- STB_TEXTEDIT_POSITIONTYPE delete_length;
+ IMSTB_TEXTEDIT_POSITIONTYPE where;
+ IMSTB_TEXTEDIT_POSITIONTYPE insert_length;
+ IMSTB_TEXTEDIT_POSITIONTYPE delete_length;
int char_storage;
} StbUndoRecord;
typedef struct
{
// private data
- StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT];
- STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT];
+ StbUndoRecord undo_rec [IMSTB_TEXTEDIT_UNDOSTATECOUNT];
+ IMSTB_TEXTEDIT_CHARTYPE undo_char[IMSTB_TEXTEDIT_UNDOCHARCOUNT];
short undo_point, redo_point;
int undo_char_point, redo_char_point;
} StbUndoState;
-typedef struct
+typedef struct STB_TexteditState
{
/////////////////////
//
@@ -368,7 +380,7 @@ typedef struct
float ymin,ymax; // height of row above and below baseline
int num_chars;
} StbTexteditRow;
-#endif //INCLUDE_STB_TEXTEDIT_H
+#endif //INCLUDE_IMSTB_TEXTEDIT_H
////////////////////////////////////////////////////////////////////////////
@@ -381,11 +393,11 @@ typedef struct
// implementation isn't include-guarded, since it might have indirectly
// included just the "header" portion
-#ifdef STB_TEXTEDIT_IMPLEMENTATION
+#ifdef IMSTB_TEXTEDIT_IMPLEMENTATION
-#ifndef STB_TEXTEDIT_memmove
+#ifndef IMSTB_TEXTEDIT_memmove
#include <string.h>
-#define STB_TEXTEDIT_memmove memmove
+#define IMSTB_TEXTEDIT_memmove memmove
#endif
@@ -395,7 +407,7 @@ typedef struct
//
// traverse the layout to locate the nearest character to a display position
-static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y)
+static int stb_text_locate_coord(IMSTB_TEXTEDIT_STRING *str, float x, float y)
{
StbTexteditRow r;
int n = STB_TEXTEDIT_STRINGLEN(str);
@@ -434,13 +446,13 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y)
if (x < r.x1) {
// search characters in row for one that straddles 'x'
prev_x = r.x0;
- for (k=0; k < r.num_chars; ++k) {
+ for (k=0; k < r.num_chars; k = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, i + k) - i) {
float w = STB_TEXTEDIT_GETWIDTH(str, i, k);
if (x < prev_x+w) {
if (x < prev_x+w/2)
return k+i;
else
- return k+i+1;
+ return IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, i + k);
}
prev_x += w;
}
@@ -455,7 +467,7 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y)
}
// API click: on mouse down, move the cursor to the clicked location, and reset the selection
-static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)
+static void stb_textedit_click(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)
{
// In single-line mode, just always make y = 0. This lets the drag keep working if the mouse
// goes off the top or bottom of the text
@@ -473,7 +485,7 @@ static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat
}
// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location
-static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)
+static void stb_textedit_drag(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)
{
int p = 0;
@@ -499,11 +511,11 @@ static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state
//
// forward declarations
-static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state);
-static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state);
-static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length);
+static void stb_text_undo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state);
+static void stb_text_redo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state);
+static void stb_text_makeundo_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length);
static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length);
-static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length);
+static void stb_text_makeundo_replace(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length);
typedef struct
{
@@ -515,36 +527,21 @@ typedef struct
// find the x/y location of a character, and remember info about the previous row in
// case we get a move-up event (for page up, we'll have to rescan)
-static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line)
+static void stb_textedit_find_charpos(StbFindState *find, IMSTB_TEXTEDIT_STRING *str, int n, int single_line)
{
StbTexteditRow r;
int prev_start = 0;
int z = STB_TEXTEDIT_STRINGLEN(str);
int i=0, first;
- if (n == z) {
- // if it's at the end, then find the last line -- simpler than trying to
- // explicitly handle this case in the regular code
- if (single_line) {
- STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
- find->y = 0;
- find->first_char = 0;
- find->length = z;
- find->height = r.ymax - r.ymin;
- find->x = r.x1;
- } else {
- find->y = 0;
- find->x = 0;
- find->height = 1;
- while (i < z) {
- STB_TEXTEDIT_LAYOUTROW(&r, str, i);
- prev_start = i;
- i += r.num_chars;
- }
- find->first_char = i;
- find->length = 0;
- find->prev_first = prev_start;
- }
+ if (n == z && single_line) {
+ // special case if it's at the end (may not be needed?)
+ STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
+ find->y = 0;
+ find->first_char = 0;
+ find->length = z;
+ find->height = r.ymax - r.ymin;
+ find->x = r.x1;
return;
}
@@ -555,9 +552,16 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s
STB_TEXTEDIT_LAYOUTROW(&r, str, i);
if (n < i + r.num_chars)
break;
+ if (i + r.num_chars == z && z > 0 && STB_TEXTEDIT_GETCHAR(str, z - 1) != STB_TEXTEDIT_NEWLINE) // [DEAR IMGUI] special handling for last line
+ break; // [DEAR IMGUI]
prev_start = i;
i += r.num_chars;
find->y += r.baseline_y_delta;
+ if (i == z) // [DEAR IMGUI]
+ {
+ r.num_chars = 0; // [DEAR IMGUI]
+ break; // [DEAR IMGUI]
+ }
}
find->first_char = first = i;
@@ -567,14 +571,14 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s
// now scan to find xpos
find->x = r.x0;
- for (i=0; first+i < n; ++i)
+ for (i=0; first+i < n; i = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, first + i) - first)
find->x += STB_TEXTEDIT_GETWIDTH(str, first, i);
}
#define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end)
// make the selection/cursor state valid if client altered the string
-static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
+static void stb_textedit_clamp(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
int n = STB_TEXTEDIT_STRINGLEN(str);
if (STB_TEXT_HAS_SELECTION(state)) {
@@ -588,7 +592,7 @@ static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat
}
// delete characters while updating undo
-static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len)
+static void stb_textedit_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len)
{
stb_text_makeundo_delete(str, state, where, len);
STB_TEXTEDIT_DELETECHARS(str, where, len);
@@ -596,7 +600,7 @@ static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *sta
}
// delete the section
-static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
+static void stb_textedit_delete_selection(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
stb_textedit_clamp(str, state);
if (STB_TEXT_HAS_SELECTION(state)) {
@@ -633,7 +637,7 @@ static void stb_textedit_move_to_first(STB_TexteditState *state)
}
// move cursor to last character of selection
-static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
+static void stb_textedit_move_to_last(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
if (STB_TEXT_HAS_SELECTION(state)) {
stb_textedit_sortselection(state);
@@ -644,14 +648,25 @@ static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditStat
}
}
+// [DEAR IMGUI]
+// Functions must be implemented for UTF8 support
+// Code in this file that uses those functions is modified for [DEAR IMGUI] and deviates from the original stb_textedit.
+// There is not necessarily a '[DEAR IMGUI]' at the usage sites.
+#ifndef IMSTB_TEXTEDIT_GETPREVCHARINDEX
+#define IMSTB_TEXTEDIT_GETPREVCHARINDEX(obj, idx) (idx - 1)
+#endif
+#ifndef IMSTB_TEXTEDIT_GETNEXTCHARINDEX
+#define IMSTB_TEXTEDIT_GETNEXTCHARINDEX(obj, idx) (idx + 1)
+#endif
+
#ifdef STB_TEXTEDIT_IS_SPACE
-static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx )
+static int is_word_boundary( IMSTB_TEXTEDIT_STRING *str, int idx )
{
return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1;
}
#ifndef STB_TEXTEDIT_MOVEWORDLEFT
-static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c )
+static int stb_textedit_move_to_word_previous( IMSTB_TEXTEDIT_STRING *str, int c )
{
--c; // always move at least one character
while( c >= 0 && !is_word_boundary( str, c ) )
@@ -666,7 +681,7 @@ static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c )
#endif
#ifndef STB_TEXTEDIT_MOVEWORDRIGHT
-static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c )
+static int stb_textedit_move_to_word_next( IMSTB_TEXTEDIT_STRING *str, int c )
{
const int len = STB_TEXTEDIT_STRINGLEN(str);
++c; // always move at least one character
@@ -693,7 +708,7 @@ static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state)
}
// API cut: delete selection
-static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
+static int stb_textedit_cut(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
if (STB_TEXT_HAS_SELECTION(state)) {
stb_textedit_delete_selection(str,state); // implicitly clamps
@@ -704,7 +719,7 @@ static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
}
// API paste: replace existing selection with passed-in text
-static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len)
+static int stb_textedit_paste_internal(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, IMSTB_TEXTEDIT_CHARTYPE *text, int len)
{
// if there's a selection, the paste should delete it
stb_textedit_clamp(str, state);
@@ -716,9 +731,7 @@ static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditSta
state->has_preferred_x = 0;
return 1;
}
- // remove the undo since we didn't actually insert the characters
- if (state->undostate.undo_point)
- --state->undostate.undo_point;
+ // note: paste failure will leave deleted selection, may be restored with an undo (see https://github.com/nothings/stb/issues/734 for details)
return 0;
}
@@ -726,36 +739,44 @@ static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditSta
#define STB_TEXTEDIT_KEYTYPE int
#endif
+// [DEAR IMGUI] Added stb_textedit_text(), extracted out and called by stb_textedit_key() for backward compatibility.
+static void stb_textedit_text(IMSTB_TEXTEDIT_STRING* str, STB_TexteditState* state, const IMSTB_TEXTEDIT_CHARTYPE* text, int text_len)
+{
+ // can't add newline in single-line mode
+ if (text[0] == '\n' && state->single_line)
+ return;
+
+ if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) {
+ stb_text_makeundo_replace(str, state, state->cursor, 1, 1);
+ STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1);
+ if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, text_len)) {
+ state->cursor += text_len;
+ state->has_preferred_x = 0;
+ }
+ }
+ else {
+ stb_textedit_delete_selection(str, state); // implicitly clamps
+ if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, text_len)) {
+ stb_text_makeundo_insert(state, state->cursor, text_len);
+ state->cursor += text_len;
+ state->has_preferred_x = 0;
+ }
+ }
+}
+
// API key: process a keyboard input
-static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key)
+static void stb_textedit_key(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key)
{
retry:
switch (key) {
default: {
+#ifdef STB_TEXTEDIT_KEYTOTEXT
int c = STB_TEXTEDIT_KEYTOTEXT(key);
if (c > 0) {
- STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c;
-
- // can't add newline in single-line mode
- if (c == '\n' && state->single_line)
- break;
-
- if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) {
- stb_text_makeundo_replace(str, state, state->cursor, 1, 1);
- STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1);
- if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) {
- ++state->cursor;
- state->has_preferred_x = 0;
- }
- } else {
- stb_textedit_delete_selection(str,state); // implicitly clamps
- if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) {
- stb_text_makeundo_insert(state, state->cursor, 1);
- ++state->cursor;
- state->has_preferred_x = 0;
- }
- }
+ IMSTB_TEXTEDIT_CHARTYPE ch = (IMSTB_TEXTEDIT_CHARTYPE)c;
+ stb_textedit_text(str, state, &ch, 1);
}
+#endif
break;
}
@@ -764,7 +785,7 @@ retry:
state->insert_mode = !state->insert_mode;
break;
#endif
-
+
case STB_TEXTEDIT_K_UNDO:
stb_text_undo(str, state);
state->has_preferred_x = 0;
@@ -779,9 +800,9 @@ retry:
// if currently there's a selection, move cursor to start of selection
if (STB_TEXT_HAS_SELECTION(state))
stb_textedit_move_to_first(state);
- else
+ else
if (state->cursor > 0)
- --state->cursor;
+ state->cursor = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
state->has_preferred_x = 0;
break;
@@ -790,7 +811,7 @@ retry:
if (STB_TEXT_HAS_SELECTION(state))
stb_textedit_move_to_last(str, state);
else
- ++state->cursor;
+ state->cursor = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->cursor);
stb_textedit_clamp(str, state);
state->has_preferred_x = 0;
break;
@@ -800,7 +821,7 @@ retry:
stb_textedit_prep_selection_at_cursor(state);
// move selection left
if (state->select_end > 0)
- --state->select_end;
+ state->select_end = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->select_end);
state->cursor = state->select_end;
state->has_preferred_x = 0;
break;
@@ -828,7 +849,7 @@ retry:
#ifdef STB_TEXTEDIT_MOVEWORDRIGHT
case STB_TEXTEDIT_K_WORDRIGHT:
- if (STB_TEXT_HAS_SELECTION(state))
+ if (STB_TEXT_HAS_SELECTION(state))
stb_textedit_move_to_last(str, state);
else {
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor);
@@ -850,7 +871,7 @@ retry:
case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT:
stb_textedit_prep_selection_at_cursor(state);
// move selection right
- ++state->select_end;
+ state->select_end = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->select_end);
stb_textedit_clamp(str, state);
state->cursor = state->select_end;
state->has_preferred_x = 0;
@@ -899,14 +920,14 @@ retry:
x = row.x0;
for (i=0; i < row.num_chars; ++i) {
float dx = STB_TEXTEDIT_GETWIDTH(str, start, i);
- #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE
- if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE)
+ #ifdef IMSTB_TEXTEDIT_GETWIDTH_NEWLINE
+ if (dx == IMSTB_TEXTEDIT_GETWIDTH_NEWLINE)
break;
#endif
x += dx;
if (x > goal_x)
break;
- ++state->cursor;
+ state->cursor = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->cursor);
}
stb_textedit_clamp(str, state);
@@ -922,7 +943,7 @@ retry:
}
break;
}
-
+
case STB_TEXTEDIT_K_UP:
case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT:
case STB_TEXTEDIT_K_PGUP:
@@ -961,14 +982,14 @@ retry:
x = row.x0;
for (i=0; i < row.num_chars; ++i) {
float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i);
- #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE
- if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE)
+ #ifdef IMSTB_TEXTEDIT_GETWIDTH_NEWLINE
+ if (dx == IMSTB_TEXTEDIT_GETWIDTH_NEWLINE)
break;
#endif
x += dx;
if (x > goal_x)
break;
- ++state->cursor;
+ state->cursor = IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->cursor);
}
stb_textedit_clamp(str, state);
@@ -996,7 +1017,7 @@ retry:
else {
int n = STB_TEXTEDIT_STRINGLEN(str);
if (state->cursor < n)
- stb_textedit_delete(str, state, state->cursor, 1);
+ stb_textedit_delete(str, state, state->cursor, IMSTB_TEXTEDIT_GETNEXTCHARINDEX(str, state->cursor) - state->cursor);
}
state->has_preferred_x = 0;
break;
@@ -1008,13 +1029,14 @@ retry:
else {
stb_textedit_clamp(str, state);
if (state->cursor > 0) {
- stb_textedit_delete(str, state, state->cursor-1, 1);
- --state->cursor;
+ int prev = IMSTB_TEXTEDIT_GETPREVCHARINDEX(str, state->cursor);
+ stb_textedit_delete(str, state, prev, state->cursor - prev);
+ state->cursor = prev;
}
}
state->has_preferred_x = 0;
break;
-
+
#ifdef STB_TEXTEDIT_K_TEXTSTART2
case STB_TEXTEDIT_K_TEXTSTART2:
#endif
@@ -1031,7 +1053,7 @@ retry:
state->select_start = state->select_end = 0;
state->has_preferred_x = 0;
break;
-
+
#ifdef STB_TEXTEDIT_K_TEXTSTART2
case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT:
#endif
@@ -1119,8 +1141,8 @@ retry:
static void stb_textedit_flush_redo(StbUndoState *state)
{
- state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT;
- state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT;
+ state->redo_point = IMSTB_TEXTEDIT_UNDOSTATECOUNT;
+ state->redo_char_point = IMSTB_TEXTEDIT_UNDOCHARCOUNT;
}
// discard the oldest entry in the undo list
@@ -1132,13 +1154,13 @@ static void stb_textedit_discard_undo(StbUndoState *state)
int n = state->undo_rec[0].insert_length, i;
// delete n characters from all other records
state->undo_char_point -= n;
- STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE)));
+ IMSTB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(IMSTB_TEXTEDIT_CHARTYPE)));
for (i=0; i < state->undo_point; ++i)
if (state->undo_rec[i].char_storage >= 0)
state->undo_rec[i].char_storage -= n; // @OPTIMIZE: get rid of char_storage and infer it
}
--state->undo_point;
- STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0])));
+ IMSTB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0])));
}
}
@@ -1148,7 +1170,7 @@ static void stb_textedit_discard_undo(StbUndoState *state)
// fill up even though the undo buffer didn't
static void stb_textedit_discard_redo(StbUndoState *state)
{
- int k = STB_TEXTEDIT_UNDOSTATECOUNT-1;
+ int k = IMSTB_TEXTEDIT_UNDOSTATECOUNT-1;
if (state->redo_point <= k) {
// if the k'th undo state has characters, clean those up
@@ -1156,7 +1178,7 @@ static void stb_textedit_discard_redo(StbUndoState *state)
int n = state->undo_rec[k].insert_length, i;
// move the remaining redo character data to the end of the buffer
state->redo_char_point += n;
- STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE)));
+ IMSTB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((IMSTB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(IMSTB_TEXTEDIT_CHARTYPE)));
// adjust the position of all the other records to account for above memmove
for (i=state->redo_point; i < k; ++i)
if (state->undo_rec[i].char_storage >= 0)
@@ -1164,12 +1186,12 @@ static void stb_textedit_discard_redo(StbUndoState *state)
}
// now move all the redo records towards the end of the buffer; the first one is at 'redo_point'
// [DEAR IMGUI]
- size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0]));
+ size_t move_size = (size_t)((IMSTB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0]));
const char* buf_begin = (char*)state->undo_rec; (void)buf_begin;
const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end;
IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin);
IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end);
- STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size);
+ IMSTB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size);
// now move redo_point to point to the new one
++state->redo_point;
@@ -1183,32 +1205,32 @@ static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numch
// if we have no free records, we have to make room, by sliding the
// existing records down
- if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT)
+ if (state->undo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT)
stb_textedit_discard_undo(state);
// if the characters to store won't possibly fit in the buffer, we can't undo
- if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) {
+ if (numchars > IMSTB_TEXTEDIT_UNDOCHARCOUNT) {
state->undo_point = 0;
state->undo_char_point = 0;
return NULL;
}
// if we don't have enough free characters in the buffer, we have to make room
- while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT)
+ while (state->undo_char_point + numchars > IMSTB_TEXTEDIT_UNDOCHARCOUNT)
stb_textedit_discard_undo(state);
return &state->undo_rec[state->undo_point++];
}
-static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len)
+static IMSTB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len)
{
StbUndoRecord *r = stb_text_create_undo_record(state, insert_len);
if (r == NULL)
return NULL;
r->where = pos;
- r->insert_length = (STB_TEXTEDIT_POSITIONTYPE) insert_len;
- r->delete_length = (STB_TEXTEDIT_POSITIONTYPE) delete_len;
+ r->insert_length = (IMSTB_TEXTEDIT_POSITIONTYPE) insert_len;
+ r->delete_length = (IMSTB_TEXTEDIT_POSITIONTYPE) delete_len;
if (insert_len == 0) {
r->char_storage = -1;
@@ -1220,7 +1242,7 @@ static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos,
}
}
-static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
+static void stb_text_undo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
StbUndoState *s = &state->undostate;
StbUndoRecord u, *r;
@@ -1247,7 +1269,7 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
// characters stored for *undoing* don't leave room for redo
// if the last is true, we have to bail
- if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) {
+ if (s->undo_char_point + u.delete_length >= IMSTB_TEXTEDIT_UNDOCHARCOUNT) {
// the undo records take up too much character space; there's no space to store the redo characters
r->insert_length = 0;
} else {
@@ -1256,7 +1278,7 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
// there's definitely room to store the characters eventually
while (s->undo_char_point + u.delete_length > s->redo_char_point) {
// should never happen:
- if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT)
+ if (s->redo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT)
return;
// there's currently not enough room, so discard a redo record
stb_textedit_discard_redo(s);
@@ -1288,11 +1310,11 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
s->redo_point--;
}
-static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
+static void stb_text_redo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
StbUndoState *s = &state->undostate;
StbUndoRecord *u, r;
- if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT)
+ if (s->redo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT)
return;
// we need to do two things: apply the redo record, and create an undo record
@@ -1344,20 +1366,20 @@ static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int le
stb_text_createundo(&state->undostate, where, 0, length);
}
-static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length)
+static void stb_text_makeundo_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length)
{
int i;
- STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0);
+ IMSTB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0);
if (p) {
for (i=0; i < length; ++i)
p[i] = STB_TEXTEDIT_GETCHAR(str, where+i);
}
}
-static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length)
+static void stb_text_makeundo_replace(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length)
{
int i;
- STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length);
+ IMSTB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length);
if (p) {
for (i=0; i < old_length; ++i)
p[i] = STB_TEXTEDIT_GETCHAR(str, where+i);
@@ -1369,8 +1391,8 @@ static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_lin
{
state->undostate.undo_point = 0;
state->undostate.undo_char_point = 0;
- state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT;
- state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT;
+ state->undostate.redo_point = IMSTB_TEXTEDIT_UNDOSTATECOUNT;
+ state->undostate.redo_char_point = IMSTB_TEXTEDIT_UNDOCHARCOUNT;
state->select_end = state->select_start = 0;
state->cursor = 0;
state->has_preferred_x = 0;
@@ -1393,16 +1415,16 @@ static void stb_textedit_initialize_state(STB_TexteditState *state, int is_singl
#pragma GCC diagnostic ignored "-Wcast-qual"
#endif
-static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len)
+static int stb_textedit_paste(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, IMSTB_TEXTEDIT_CHARTYPE const *ctext, int len)
{
- return stb_textedit_paste_internal(str, state, (STB_TEXTEDIT_CHARTYPE *) ctext, len);
+ return stb_textedit_paste_internal(str, state, (IMSTB_TEXTEDIT_CHARTYPE *) ctext, len);
}
#if defined(__GNUC__) || defined(__clang__)
#pragma GCC diagnostic pop
#endif
-#endif//STB_TEXTEDIT_IMPLEMENTATION
+#endif//IMSTB_TEXTEDIT_IMPLEMENTATION
/*
------------------------------------------------------------------------------
@@ -1410,38 +1432,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
+The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
-software, either in source code form or as a compiled binary, for any purpose,
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
+software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
-In jurisdictions that recognize copyright laws, the author or authors of this
-software dedicate any and all copyright interest in the software to the public
-domain. We make this dedication for the benefit of the public at large and to
-the detriment of our heirs and successors. We intend this dedication to be an
-overt act of relinquishment in perpetuity of all present and future rights to
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and to
+the detriment of our heirs and successors. We intend this dedication to be an
+overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
*/
diff --git a/3rdparty/bgfx/3rdparty/stb/stb_truetype.h b/3rdparty/bgfx/3rdparty/stb/stb_truetype.h
index 8696839559a..976f09cb927 100644
--- a/3rdparty/bgfx/3rdparty/stb/stb_truetype.h
+++ b/3rdparty/bgfx/3rdparty/stb/stb_truetype.h
@@ -1,5 +1,10 @@
-// stb_truetype.h - v1.24 - public domain
-// authored from 2009-2020 by Sean Barrett / RAD Game Tools
+// [DEAR IMGUI]
+// This is a slightly modified version of stb_truetype.h 1.26.
+// Mostly fixing for compiler and static analyzer warnings.
+// Grep for [DEAR IMGUI] to find the changes.
+
+// stb_truetype.h - v1.26 - public domain
+// authored from 2009-2021 by Sean Barrett / RAD Game Tools
//
// =======================================================================
//
@@ -53,11 +58,13 @@
// Johan Duparc Thomas Fields
// Hou Qiming Derek Vinyard
// Rob Loach Cort Stratton
-// Kenney Phillis Jr. Brian Costabile
-// Ken Voskuil (kaesve)
+// Kenney Phillis Jr. Brian Costabile
+// Ken Voskuil (kaesve)
//
// VERSION HISTORY
//
+// 1.26 (2021-08-28) fix broken rasterizer
+// 1.25 (2021-07-11) many fixes
// 1.24 (2020-02-05) fix warning
// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS)
// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
@@ -270,8 +277,8 @@
//// SAMPLE PROGRAMS
////
//
-// Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless
-//
+// Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless.
+// See "tests/truetype_demo_win32.c" for a complete version.
#if 0
#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation
#include "stb_truetype.h"
@@ -297,6 +304,8 @@ void my_stbtt_initfont(void)
void my_stbtt_print(float x, float y, char *text)
{
// assume orthographic projection with units = screen pixels, origin at top left
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, ftex);
glBegin(GL_QUADS);
@@ -304,10 +313,10 @@ void my_stbtt_print(float x, float y, char *text)
if (*text >= 32 && *text < 128) {
stbtt_aligned_quad q;
stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9
- glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0);
- glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0);
- glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1);
- glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1);
+ glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0);
+ glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0);
+ glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1);
+ glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1);
}
++text;
}
@@ -647,7 +656,7 @@ STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h
STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip);
// If skip != 0, this tells stb_truetype to skip any codepoints for which
// there is no corresponding glyph. If skip=0, which is the default, then
-// codepoints without a glyph recived the font's "missing character" glyph,
+// codepoints without a glyph received the font's "missing character" glyph,
// typically an empty box by convention.
STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above
@@ -853,6 +862,7 @@ STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, s
STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices);
// frees the data allocated above
+STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl);
STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg);
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg);
// fills svg with the character's SVG data.
@@ -1539,12 +1549,12 @@ STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codep
search += 2;
{
- stbtt_uint16 offset, start;
+ stbtt_uint16 offset, start, last;
stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1);
- STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item));
start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item);
- if (unicode_codepoint < start)
+ last = ttUSHORT(data + endCount + 2*item);
+ if (unicode_codepoint < start || unicode_codepoint > last)
return 0;
offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item);
@@ -1576,7 +1586,8 @@ STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codep
}
return 0; // not found
}
-
+ // @TODO
+ STBTT_assert(0);
return 0;
}
@@ -1870,7 +1881,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
if (comp_verts) STBTT_free(comp_verts, info->userdata);
return 0;
}
- if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex));
+ if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex));
STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex));
if (vertices) STBTT_free(vertices, info->userdata);
vertices = tmp;
@@ -1997,7 +2008,7 @@ static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int gly
start = end;
}
}
- if (fdselector == -1) stbtt__new_buf(NULL, 0);
+ if (fdselector == -1) return stbtt__new_buf(NULL, 0); // [DEAR IMGUI] fixed, see #6007 and nothings/stb#1422
return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector));
}
@@ -2133,7 +2144,7 @@ static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, st
subrs = stbtt__cid_get_glyph_subrs(info, glyph_index);
has_subrs = 1;
}
- // fallthrough
+ // FALLTHROUGH
case 0x1D: // callgsubr
if (sp < 1) return STBTT__CSERR("call(g|)subr stack");
v = (int) s[--sp];
@@ -2238,7 +2249,7 @@ static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, st
} break;
default:
- if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254))
+ if (b0 != 255 && b0 != 28 && b0 < 32)
return STBTT__CSERR("reserved operator");
// push immediate
@@ -2350,7 +2361,7 @@ STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningent
return length;
}
-static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
+static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
{
stbtt_uint8 *data = info->data + info->kern;
stbtt_uint32 needle, straw;
@@ -2380,243 +2391,225 @@ static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph
return 0;
}
-static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph)
-{
- stbtt_uint16 coverageFormat = ttUSHORT(coverageTable);
- switch(coverageFormat) {
- case 1: {
- stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2);
-
- // Binary search.
- stbtt_int32 l=0, r=glyphCount-1, m;
- int straw, needle=glyph;
- while (l <= r) {
- stbtt_uint8 *glyphArray = coverageTable + 4;
- stbtt_uint16 glyphID;
- m = (l + r) >> 1;
- glyphID = ttUSHORT(glyphArray + 2 * m);
- straw = glyphID;
- if (needle < straw)
- r = m - 1;
- else if (needle > straw)
- l = m + 1;
- else {
- return m;
- }
+static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph)
+{
+ stbtt_uint16 coverageFormat = ttUSHORT(coverageTable);
+ switch (coverageFormat) {
+ case 1: {
+ stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2);
+
+ // Binary search.
+ stbtt_int32 l=0, r=glyphCount-1, m;
+ int straw, needle=glyph;
+ while (l <= r) {
+ stbtt_uint8 *glyphArray = coverageTable + 4;
+ stbtt_uint16 glyphID;
+ m = (l + r) >> 1;
+ glyphID = ttUSHORT(glyphArray + 2 * m);
+ straw = glyphID;
+ if (needle < straw)
+ r = m - 1;
+ else if (needle > straw)
+ l = m + 1;
+ else {
+ return m;
}
- } break;
-
- case 2: {
- stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2);
- stbtt_uint8 *rangeArray = coverageTable + 4;
-
- // Binary search.
- stbtt_int32 l=0, r=rangeCount-1, m;
- int strawStart, strawEnd, needle=glyph;
- while (l <= r) {
- stbtt_uint8 *rangeRecord;
- m = (l + r) >> 1;
- rangeRecord = rangeArray + 6 * m;
- strawStart = ttUSHORT(rangeRecord);
- strawEnd = ttUSHORT(rangeRecord + 2);
- if (needle < strawStart)
- r = m - 1;
- else if (needle > strawEnd)
- l = m + 1;
- else {
- stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4);
- return startCoverageIndex + glyph - strawStart;
- }
+ }
+ break;
+ }
+
+ case 2: {
+ stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2);
+ stbtt_uint8 *rangeArray = coverageTable + 4;
+
+ // Binary search.
+ stbtt_int32 l=0, r=rangeCount-1, m;
+ int strawStart, strawEnd, needle=glyph;
+ while (l <= r) {
+ stbtt_uint8 *rangeRecord;
+ m = (l + r) >> 1;
+ rangeRecord = rangeArray + 6 * m;
+ strawStart = ttUSHORT(rangeRecord);
+ strawEnd = ttUSHORT(rangeRecord + 2);
+ if (needle < strawStart)
+ r = m - 1;
+ else if (needle > strawEnd)
+ l = m + 1;
+ else {
+ stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4);
+ return startCoverageIndex + glyph - strawStart;
}
- } break;
+ }
+ break;
+ }
- default: {
- // There are no other cases.
- STBTT_assert(0);
- } break;
- }
+ default: return -1; // unsupported
+ }
- return -1;
+ return -1;
}
static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph)
{
- stbtt_uint16 classDefFormat = ttUSHORT(classDefTable);
- switch(classDefFormat)
- {
- case 1: {
- stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2);
- stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4);
- stbtt_uint8 *classDef1ValueArray = classDefTable + 6;
-
- if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount)
- return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID));
-
- classDefTable = classDef1ValueArray + 2 * glyphCount;
- } break;
-
- case 2: {
- stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2);
- stbtt_uint8 *classRangeRecords = classDefTable + 4;
-
- // Binary search.
- stbtt_int32 l=0, r=classRangeCount-1, m;
- int strawStart, strawEnd, needle=glyph;
- while (l <= r) {
- stbtt_uint8 *classRangeRecord;
- m = (l + r) >> 1;
- classRangeRecord = classRangeRecords + 6 * m;
- strawStart = ttUSHORT(classRangeRecord);
- strawEnd = ttUSHORT(classRangeRecord + 2);
- if (needle < strawStart)
- r = m - 1;
- else if (needle > strawEnd)
- l = m + 1;
- else
- return (stbtt_int32)ttUSHORT(classRangeRecord + 4);
- }
+ stbtt_uint16 classDefFormat = ttUSHORT(classDefTable);
+ switch (classDefFormat)
+ {
+ case 1: {
+ stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2);
+ stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4);
+ stbtt_uint8 *classDef1ValueArray = classDefTable + 6;
+
+ if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount)
+ return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID));
+ break;
+ }
- classDefTable = classRangeRecords + 6 * classRangeCount;
- } break;
+ case 2: {
+ stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2);
+ stbtt_uint8 *classRangeRecords = classDefTable + 4;
+
+ // Binary search.
+ stbtt_int32 l=0, r=classRangeCount-1, m;
+ int strawStart, strawEnd, needle=glyph;
+ while (l <= r) {
+ stbtt_uint8 *classRangeRecord;
+ m = (l + r) >> 1;
+ classRangeRecord = classRangeRecords + 6 * m;
+ strawStart = ttUSHORT(classRangeRecord);
+ strawEnd = ttUSHORT(classRangeRecord + 2);
+ if (needle < strawStart)
+ r = m - 1;
+ else if (needle > strawEnd)
+ l = m + 1;
+ else
+ return (stbtt_int32)ttUSHORT(classRangeRecord + 4);
+ }
+ break;
+ }
- default: {
- // There are no other cases.
- STBTT_assert(0);
- } break;
- }
+ default:
+ return -1; // Unsupported definition type, return an error.
+ }
- return -1;
+ // "All glyphs not assigned to a class fall into class 0". (OpenType spec)
+ return 0;
}
// Define to STBTT_assert(x) if you want to break on unimplemented formats.
#define STBTT_GPOS_TODO_assert(x)
-static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
-{
- stbtt_uint16 lookupListOffset;
- stbtt_uint8 *lookupList;
- stbtt_uint16 lookupCount;
- stbtt_uint8 *data;
- stbtt_int32 i;
-
- if (!info->gpos) return 0;
-
- data = info->data + info->gpos;
-
- if (ttUSHORT(data+0) != 1) return 0; // Major version 1
- if (ttUSHORT(data+2) != 0) return 0; // Minor version 0
-
- lookupListOffset = ttUSHORT(data+8);
- lookupList = data + lookupListOffset;
- lookupCount = ttUSHORT(lookupList);
-
- for (i=0; i<lookupCount; ++i) {
- stbtt_uint16 lookupOffset = ttUSHORT(lookupList + 2 + 2 * i);
- stbtt_uint8 *lookupTable = lookupList + lookupOffset;
-
- stbtt_uint16 lookupType = ttUSHORT(lookupTable);
- stbtt_uint16 subTableCount = ttUSHORT(lookupTable + 4);
- stbtt_uint8 *subTableOffsets = lookupTable + 6;
- switch(lookupType) {
- case 2: { // Pair Adjustment Positioning Subtable
- stbtt_int32 sti;
- for (sti=0; sti<subTableCount; sti++) {
- stbtt_uint16 subtableOffset = ttUSHORT(subTableOffsets + 2 * sti);
- stbtt_uint8 *table = lookupTable + subtableOffset;
- stbtt_uint16 posFormat = ttUSHORT(table);
- stbtt_uint16 coverageOffset = ttUSHORT(table + 2);
- stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(table + coverageOffset, glyph1);
- if (coverageIndex == -1) continue;
-
- switch (posFormat) {
- case 1: {
- stbtt_int32 l, r, m;
- int straw, needle;
- stbtt_uint16 valueFormat1 = ttUSHORT(table + 4);
- stbtt_uint16 valueFormat2 = ttUSHORT(table + 6);
- stbtt_int32 valueRecordPairSizeInBytes = 2;
- stbtt_uint16 pairSetCount = ttUSHORT(table + 8);
- stbtt_uint16 pairPosOffset = ttUSHORT(table + 10 + 2 * coverageIndex);
- stbtt_uint8 *pairValueTable = table + pairPosOffset;
- stbtt_uint16 pairValueCount = ttUSHORT(pairValueTable);
- stbtt_uint8 *pairValueArray = pairValueTable + 2;
- // TODO: Support more formats.
- STBTT_GPOS_TODO_assert(valueFormat1 == 4);
- if (valueFormat1 != 4) return 0;
- STBTT_GPOS_TODO_assert(valueFormat2 == 0);
- if (valueFormat2 != 0) return 0;
-
- STBTT_assert(coverageIndex < pairSetCount);
- STBTT__NOTUSED(pairSetCount);
-
- needle=glyph2;
- r=pairValueCount-1;
- l=0;
-
- // Binary search.
- while (l <= r) {
- stbtt_uint16 secondGlyph;
- stbtt_uint8 *pairValue;
- m = (l + r) >> 1;
- pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m;
- secondGlyph = ttUSHORT(pairValue);
- straw = secondGlyph;
- if (needle < straw)
- r = m - 1;
- else if (needle > straw)
- l = m + 1;
- else {
- stbtt_int16 xAdvance = ttSHORT(pairValue + 2);
- return xAdvance;
- }
- }
- } break;
-
- case 2: {
- stbtt_uint16 valueFormat1 = ttUSHORT(table + 4);
- stbtt_uint16 valueFormat2 = ttUSHORT(table + 6);
-
- stbtt_uint16 classDef1Offset = ttUSHORT(table + 8);
- stbtt_uint16 classDef2Offset = ttUSHORT(table + 10);
- int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1);
- int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2);
-
- stbtt_uint16 class1Count = ttUSHORT(table + 12);
- stbtt_uint16 class2Count = ttUSHORT(table + 14);
- STBTT_assert(glyph1class < class1Count);
- STBTT_assert(glyph2class < class2Count);
-
- // TODO: Support more formats.
- STBTT_GPOS_TODO_assert(valueFormat1 == 4);
- if (valueFormat1 != 4) return 0;
- STBTT_GPOS_TODO_assert(valueFormat2 == 0);
- if (valueFormat2 != 0) return 0;
-
- if (glyph1class >= 0 && glyph1class < class1Count && glyph2class >= 0 && glyph2class < class2Count) {
- stbtt_uint8 *class1Records = table + 16;
- stbtt_uint8 *class2Records = class1Records + 2 * (glyph1class * class2Count);
- stbtt_int16 xAdvance = ttSHORT(class2Records + 2 * glyph2class);
- return xAdvance;
- }
- } break;
-
- default: {
- // There are no other cases.
- STBTT_assert(0);
- break;
- };
- }
- }
- break;
- };
+static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
+{
+ stbtt_uint16 lookupListOffset;
+ stbtt_uint8 *lookupList;
+ stbtt_uint16 lookupCount;
+ stbtt_uint8 *data;
+ stbtt_int32 i, sti;
+
+ if (!info->gpos) return 0;
+
+ data = info->data + info->gpos;
+
+ if (ttUSHORT(data+0) != 1) return 0; // Major version 1
+ if (ttUSHORT(data+2) != 0) return 0; // Minor version 0
+
+ lookupListOffset = ttUSHORT(data+8);
+ lookupList = data + lookupListOffset;
+ lookupCount = ttUSHORT(lookupList);
+
+ for (i=0; i<lookupCount; ++i) {
+ stbtt_uint16 lookupOffset = ttUSHORT(lookupList + 2 + 2 * i);
+ stbtt_uint8 *lookupTable = lookupList + lookupOffset;
+
+ stbtt_uint16 lookupType = ttUSHORT(lookupTable);
+ stbtt_uint16 subTableCount = ttUSHORT(lookupTable + 4);
+ stbtt_uint8 *subTableOffsets = lookupTable + 6;
+ if (lookupType != 2) // Pair Adjustment Positioning Subtable
+ continue;
+
+ for (sti=0; sti<subTableCount; sti++) {
+ stbtt_uint16 subtableOffset = ttUSHORT(subTableOffsets + 2 * sti);
+ stbtt_uint8 *table = lookupTable + subtableOffset;
+ stbtt_uint16 posFormat = ttUSHORT(table);
+ stbtt_uint16 coverageOffset = ttUSHORT(table + 2);
+ stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(table + coverageOffset, glyph1);
+ if (coverageIndex == -1) continue;
+
+ switch (posFormat) {
+ case 1: {
+ stbtt_int32 l, r, m;
+ int straw, needle;
+ stbtt_uint16 valueFormat1 = ttUSHORT(table + 4);
+ stbtt_uint16 valueFormat2 = ttUSHORT(table + 6);
+ if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats?
+ stbtt_int32 valueRecordPairSizeInBytes = 2;
+ stbtt_uint16 pairSetCount = ttUSHORT(table + 8);
+ stbtt_uint16 pairPosOffset = ttUSHORT(table + 10 + 2 * coverageIndex);
+ stbtt_uint8 *pairValueTable = table + pairPosOffset;
+ stbtt_uint16 pairValueCount = ttUSHORT(pairValueTable);
+ stbtt_uint8 *pairValueArray = pairValueTable + 2;
+
+ if (coverageIndex >= pairSetCount) return 0;
+
+ needle=glyph2;
+ r=pairValueCount-1;
+ l=0;
+
+ // Binary search.
+ while (l <= r) {
+ stbtt_uint16 secondGlyph;
+ stbtt_uint8 *pairValue;
+ m = (l + r) >> 1;
+ pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m;
+ secondGlyph = ttUSHORT(pairValue);
+ straw = secondGlyph;
+ if (needle < straw)
+ r = m - 1;
+ else if (needle > straw)
+ l = m + 1;
+ else {
+ stbtt_int16 xAdvance = ttSHORT(pairValue + 2);
+ return xAdvance;
+ }
+ }
+ } else
+ return 0;
+ break;
+ }
+
+ case 2: {
+ stbtt_uint16 valueFormat1 = ttUSHORT(table + 4);
+ stbtt_uint16 valueFormat2 = ttUSHORT(table + 6);
+ if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats?
+ stbtt_uint16 classDef1Offset = ttUSHORT(table + 8);
+ stbtt_uint16 classDef2Offset = ttUSHORT(table + 10);
+ int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1);
+ int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2);
+
+ stbtt_uint16 class1Count = ttUSHORT(table + 12);
+ stbtt_uint16 class2Count = ttUSHORT(table + 14);
+ stbtt_uint8 *class1Records, *class2Records;
+ stbtt_int16 xAdvance;
+
+ if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed
+ if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed
+
+ class1Records = table + 16;
+ class2Records = class1Records + 2 * (glyph1class * class2Count);
+ xAdvance = ttSHORT(class2Records + 2 * glyph2class);
+ return xAdvance;
+ } else
+ return 0;
+ break;
+ }
default:
- // TODO: Implement other stuff.
- break;
- }
- }
+ return 0; // Unsupported position format
+ }
+ }
+ }
- return 0;
+ return 0;
}
STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2)
@@ -3074,6 +3067,23 @@ static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edg
}
}
+static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width)
+{
+ STBTT_assert(top_width >= 0);
+ STBTT_assert(bottom_width >= 0);
+ return (top_width + bottom_width) / 2.0f * height;
+}
+
+static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1)
+{
+ return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0);
+}
+
+static float stbtt__sized_triangle_area(float height, float width)
+{
+ return height * width / 2;
+}
+
static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top)
{
float y_bottom = y_top+1;
@@ -3128,13 +3138,13 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
float height;
// simple case, only spans one pixel
int x = (int) x_top;
- height = sy1 - sy0;
+ height = (sy1 - sy0) * e->direction;
STBTT_assert(x >= 0 && x < len);
- scanline[x] += e->direction * (1-((x_top - x) + (x_bottom-x))/2) * height;
- scanline_fill[x] += e->direction * height; // everything right of this pixel is filled
+ scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f);
+ scanline_fill[x] += height; // everything right of this pixel is filled
} else {
int x,x1,x2;
- float y_crossing, step, sign, area;
+ float y_crossing, y_final, step, sign, area;
// covers 2+ pixels
if (x_top > x_bottom) {
// flip scanline vertically; signed area is the same
@@ -3147,29 +3157,82 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
dy = -dy;
t = x0, x0 = xb, xb = t;
}
+ STBTT_assert(dy >= 0);
+ STBTT_assert(dx >= 0);
x1 = (int) x_top;
x2 = (int) x_bottom;
// compute intersection with y axis at x1+1
- y_crossing = (x1+1 - x0) * dy + y_top;
+ y_crossing = y_top + dy * (x1+1 - x0);
+
+ // compute intersection with y axis at x2
+ y_final = y_top + dy * (x2 - x0);
+
+ // x1 x_top x2 x_bottom
+ // y_top +------|-----+------------+------------+--------|---+------------+
+ // | | | | | |
+ // | | | | | |
+ // sy0 | Txxxxx|............|............|............|............|
+ // y_crossing | *xxxxx.......|............|............|............|
+ // | | xxxxx..|............|............|............|
+ // | | /- xx*xxxx........|............|............|
+ // | | dy < | xxxxxx..|............|............|
+ // y_final | | \- | xx*xxx.........|............|
+ // sy1 | | | | xxxxxB...|............|
+ // | | | | | |
+ // | | | | | |
+ // y_bottom +------------+------------+------------+------------+------------+
+ //
+ // goal is to measure the area covered by '.' in each pixel
+
+ // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057
+ // @TODO: maybe test against sy1 rather than y_bottom?
+ if (y_crossing > y_bottom)
+ y_crossing = y_bottom;
sign = e->direction;
- // area of the rectangle covered from y0..y_crossing
+
+ // area of the rectangle covered from sy0..y_crossing
area = sign * (y_crossing-sy0);
- // area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing)
- scanline[x1] += area * (1-((x_top - x1)+(x1+1-x1))/2);
- step = sign * dy;
+ // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing)
+ scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top);
+
+ // check if final y_crossing is blown up; no test case for this
+ if (y_final > y_bottom) {
+ int denom = (x2 - (x1+1));
+ y_final = y_bottom;
+ if (denom != 0) { // [DEAR IMGUI] Avoid div by zero (https://github.com/nothings/stb/issues/1316)
+ dy = (y_final - y_crossing ) / denom; // if denom=0, y_final = y_crossing, so y_final <= y_bottom
+ }
+ }
+
+ // in second pixel, area covered by line segment found in first pixel
+ // is always a rectangle 1 wide * the height of that line segment; this
+ // is exactly what the variable 'area' stores. it also gets a contribution
+ // from the line segment within it. the THIRD pixel will get the first
+ // pixel's rectangle contribution, the second pixel's rectangle contribution,
+ // and its own contribution. the 'own contribution' is the same in every pixel except
+ // the leftmost and rightmost, a trapezoid that slides down in each pixel.
+ // the second pixel's contribution to the third pixel will be the
+ // rectangle 1 wide times the height change in the second pixel, which is dy.
+
+ step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x,
+ // which multiplied by 1-pixel-width is how much pixel area changes for each step in x
+ // so the area advances by 'step' every time
+
for (x = x1+1; x < x2; ++x) {
- scanline[x] += area + step/2;
+ scanline[x] += area + step/2; // area of trapezoid is 1*step/2
area += step;
}
- y_crossing += dy * (x2 - (x1+1));
-
- STBTT_assert(STBTT_fabs(area) <= 1.01f);
+ STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down
+ STBTT_assert(sy1 > y_final-0.01f);
- scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing);
+ // area covered in the last pixel is the rectangle from all the pixels to the left,
+ // plus the trapezoid filled by the line segment in this pixel all the way to the right edge
+ scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f);
+ // the rest of the line is filled based on the total height of the line segment in this pixel
scanline_fill[x2] += sign * (sy1-sy0);
}
} else {
@@ -3177,6 +3240,9 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
// clipping logic. since this does not match the intended use
// of this library, we use a different, very slow brute
// force implementation
+ // note though that this does happen some of the time because
+ // x_top and x_bottom can be extrapolated at the top & bottom of
+ // the shape and actually lie outside the bounding box
int x;
for (x=0; x < len; ++x) {
// cases:
@@ -4244,7 +4310,7 @@ STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect
STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges)
{
stbtt_fontinfo info;
- int i,j,n, return_value = 1;
+ int i, j, n, return_value; // [DEAR IMGUI] removed = 1;
//stbrp_context *context = (stbrp_context *) spc->pack_info;
stbrp_rect *rects;
@@ -4413,15 +4479,14 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
float y_frac;
int winding = 0;
- orig[0] = x;
- orig[1] = y;
-
// make sure y never passes through a vertex of the shape
y_frac = (float) STBTT_fmod(y, 1.0f);
if (y_frac < 0.01f)
y += 0.01f;
else if (y_frac > 0.99f)
y -= 0.01f;
+
+ orig[0] = x;
orig[1] = y;
// test a ray from (-infinity,y) to (x,y)
@@ -4483,35 +4548,35 @@ static float stbtt__cuberoot( float x )
return (float) STBTT_pow( x,1.0f/3.0f);
}
-// x^3 + c*x^2 + b*x + a = 0
+// x^3 + a*x^2 + b*x + c = 0
static int stbtt__solve_cubic(float a, float b, float c, float* r)
{
- float s = -a / 3;
- float p = b - a*a / 3;
- float q = a * (2*a*a - 9*b) / 27 + c;
+ float s = -a / 3;
+ float p = b - a*a / 3;
+ float q = a * (2*a*a - 9*b) / 27 + c;
float p3 = p*p*p;
- float d = q*q + 4*p3 / 27;
- if (d >= 0) {
- float z = (float) STBTT_sqrt(d);
- float u = (-q + z) / 2;
- float v = (-q - z) / 2;
- u = stbtt__cuberoot(u);
- v = stbtt__cuberoot(v);
- r[0] = s + u + v;
- return 1;
- } else {
- float u = (float) STBTT_sqrt(-p/3);
- float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative
- float m = (float) STBTT_cos(v);
+ float d = q*q + 4*p3 / 27;
+ if (d >= 0) {
+ float z = (float) STBTT_sqrt(d);
+ float u = (-q + z) / 2;
+ float v = (-q - z) / 2;
+ u = stbtt__cuberoot(u);
+ v = stbtt__cuberoot(v);
+ r[0] = s + u + v;
+ return 1;
+ } else {
+ float u = (float) STBTT_sqrt(-p/3);
+ float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative
+ float m = (float) STBTT_cos(v);
float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f;
- r[0] = s + u * 2 * m;
- r[1] = s - u * (m + n);
- r[2] = s - u * (m - n);
+ r[0] = s + u * 2 * m;
+ r[1] = s - u * (m + n);
+ r[2] = s - u * (m - n);
//STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe?
//STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f);
//STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f);
- return 3;
+ return 3;
}
}
@@ -4588,18 +4653,17 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
for (i=0; i < num_verts; ++i) {
float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y;
- // check against every point here rather than inside line/curve primitives -- @TODO: wrong if multiple 'moves' in a row produce a garbage point, and given culling, probably more efficient to do within line/curve
- float dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy);
- if (dist2 < min_dist*min_dist)
- min_dist = (float) STBTT_sqrt(dist2);
-
- if (verts[i].type == STBTT_vline) {
+ if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) {
float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y;
+ float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy);
+ if (dist2 < min_dist*min_dist)
+ min_dist = (float) STBTT_sqrt(dist2);
+
// coarse culling against bbox
//if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist &&
// sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist)
- float dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i];
+ dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i];
STBTT_assert(i != 0);
if (dist < min_dist) {
// check position along line
@@ -4626,7 +4690,8 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
float ax = x1-x0, ay = y1-y0;
float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2;
float mx = x0 - sx, my = y0 - sy;
- float res[3],px,py,t,it;
+ float res[3] = {0.f,0.f,0.f};
+ float px,py,t,it,dist2;
float a_inv = precompute[i];
if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula
float a = 3*(ax*bx + ay*by);
@@ -4653,6 +4718,10 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
float d = (mx*ax+my*ay) * a_inv;
num = stbtt__solve_cubic(b, c, d, res);
}
+ dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy);
+ if (dist2 < min_dist*min_dist)
+ min_dist = (float) STBTT_sqrt(dist2);
+
if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) {
t = res[0], it = 1.0f - t;
px = it*it*x0 + 2*t*it*x1 + t*t*x2;
@@ -4912,6 +4981,12 @@ STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const
// FULL VERSION HISTORY
//
+// 1.25 (2021-07-11) many fixes
+// 1.24 (2020-02-05) fix warning
+// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS)
+// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
+// 1.21 (2019-02-25) fix warning
+// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod
// 1.18 (2018-01-29) add missing function
// 1.17 (2017-07-23) make more arguments const; doc fix
diff --git a/3rdparty/bgfx/examples/22-windows/windows.cpp b/3rdparty/bgfx/examples/22-windows/windows.cpp
index 54d8671bf76..da1742079a1 100644
--- a/3rdparty/bgfx/examples/22-windows/windows.cpp
+++ b/3rdparty/bgfx/examples/22-windows/windows.cpp
@@ -204,6 +204,20 @@ public:
m_fbh[viewId].idx = bgfx::kInvalidHandle;
}
+ // Before we reattach a SwapChain to the window
+ // we must actually free up the previous one.
+ // The DestroyFrameBuffer command goes in the
+ // cmdPost CommandBuffer, which happens after
+ // the frame. The CreateFrameBuffer command goes
+ // int the cmdPre CommandBuffer, which happens
+ // at the beginning of the frame. Without this
+ // bgfx::frame() call, the creation would happen
+ // before it's destroyed, which would cause
+ // the platform window to have two SwapChains
+ // associated with it.
+ // Ideally, we have an operation of ResizeFrameBuffer.
+ bgfx::frame();
+
win.m_nwh = m_state.m_nwh;
win.m_width = m_state.m_width;
win.m_height = m_state.m_height;
@@ -276,6 +290,7 @@ public:
int64_t now = bx::getHPCounter();
float time = (float)( (now-m_timeOffset)/double(bx::getHPFrequency() ) );
+ bgfx::dbgTextClear();
if (NULL != m_bindings)
{
bgfx::dbgTextPrintf(0, 1, 0x2f, "Press 'c' to create or 'd' to destroy window.");
diff --git a/3rdparty/bgfx/examples/42-bunnylod/bunnylod.cpp b/3rdparty/bgfx/examples/42-bunnylod/bunnylod.cpp
index 67c276c2e3c..8330b8afcf6 100644
--- a/3rdparty/bgfx/examples/42-bunnylod/bunnylod.cpp
+++ b/3rdparty/bgfx/examples/42-bunnylod/bunnylod.cpp
@@ -68,11 +68,15 @@ public:
static void remapIndices(uint32_t* _indices, uint32_t _num)
{
uint32_t target = 0;
- for (uint32_t i = 0; i < _num; i++) {
+ for (uint32_t i = 0; i < _num; i++)
+ {
uint32_t map = _indices[i];
- if (i != map) {
+ if (i != map)
+ {
_indices[i] = _indices[map];
- } else {
+ }
+ else
+ {
_indices[i] = target;
++target;
}
diff --git a/3rdparty/bgfx/examples/common/entry/entry.cpp b/3rdparty/bgfx/examples/common/entry/entry.cpp
index 07621f3cd25..dc3e97488ea 100644
--- a/3rdparty/bgfx/examples/common/entry/entry.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry.cpp
@@ -767,6 +767,7 @@ restart:
handle = size->m_handle;
_width = size->m_width;
_height = size->m_height;
+ BX_TRACE("Window resize event: %d: %dx%d", handle, _width, _height);
needReset = true;
}
@@ -800,6 +801,7 @@ restart:
&& needReset)
{
_reset = s_reset;
+ BX_TRACE("bgfx::reset(%d, %d, 0x%x)", _width, _height, _reset)
bgfx::reset(_width, _height, _reset);
inputSetMouseResolution(uint16_t(_width), uint16_t(_height) );
}
@@ -979,6 +981,7 @@ restart:
if (needReset)
{
_reset = s_reset;
+ BX_TRACE("bgfx::reset(%d, %d, 0x%x)", s_window[0].m_width, s_window[0].m_height, _reset)
bgfx::reset(s_window[0].m_width, s_window[0].m_height, _reset);
inputSetMouseResolution(uint16_t(s_window[0].m_width), uint16_t(s_window[0].m_height) );
}
diff --git a/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp b/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp
index d27745d1390..4c699f23a5e 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp
@@ -15,13 +15,9 @@
#endif // GLFW_VERSION_MINOR < 2
#if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
-# include <wayland-egl.h>
-# define GLFW_EXPOSE_NATIVE_WAYLAND
-# else
-# define GLFW_EXPOSE_NATIVE_X11
-# define GLFW_EXPOSE_NATIVE_GLX
-# endif
+# define GLFW_EXPOSE_NATIVE_WAYLAND
+# define GLFW_EXPOSE_NATIVE_X11
+# define GLFW_EXPOSE_NATIVE_GLX
#elif BX_PLATFORM_OSX
# define GLFW_EXPOSE_NATIVE_COCOA
# define GLFW_EXPOSE_NATIVE_NSGL
@@ -45,22 +41,14 @@ namespace entry
static void* glfwNativeWindowHandle(GLFWwindow* _window)
{
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- wl_egl_window *win_impl = (wl_egl_window*)glfwGetWindowUserPointer(_window);
- if(!win_impl)
+ if (glfwGetPlatform() == GLFW_PLATFORM_WAYLAND)
+ {
+ return glfwGetWaylandWindow(_window);
+ }
+ else
{
- int width, height;
- glfwGetWindowSize(_window, &width, &height);
- struct wl_surface* surface = (struct wl_surface*)glfwGetWaylandWindow(_window);
- if(!surface)
- return nullptr;
- win_impl = wl_egl_window_create(surface, width, height);
- glfwSetWindowUserPointer(_window, (void*)(uintptr_t)win_impl);
+ return (void*)(uintptr_t)glfwGetX11Window(_window);
}
- return (void*)(uintptr_t)win_impl;
-# else
- return (void*)(uintptr_t)glfwGetX11Window(_window);
-# endif
# elif BX_PLATFORM_OSX
return glfwGetCocoaWindow(_window);
# elif BX_PLATFORM_WINDOWS
@@ -68,23 +56,6 @@ namespace entry
# endif // BX_PLATFORM_
}
- static void glfwDestroyWindowImpl(GLFWwindow *_window)
- {
- if(!_window)
- return;
-# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- wl_egl_window *win_impl = (wl_egl_window*)glfwGetWindowUserPointer(_window);
- if(win_impl)
- {
- glfwSetWindowUserPointer(_window, nullptr);
- wl_egl_window_destroy(win_impl);
- }
-# endif
-# endif
- glfwDestroyWindow(_window);
- }
-
static uint8_t translateKeyModifiers(int _glfw)
{
uint8_t modifiers = 0;
@@ -525,7 +496,7 @@ namespace entry
{
GLFWwindow* window = m_window[msg->m_handle.idx];
m_eventQueue.postWindowEvent(msg->m_handle);
- glfwDestroyWindowImpl(window);
+ glfwDestroyWindow(window);
m_window[msg->m_handle.idx] = NULL;
}
}
@@ -617,7 +588,7 @@ namespace entry
m_eventQueue.postExitEvent();
m_thread.shutdown();
- glfwDestroyWindowImpl(m_window[0]);
+ glfwDestroyWindow(m_window[0]);
glfwTerminate();
return m_thread.getExitCode();
@@ -865,11 +836,14 @@ namespace entry
void* getNativeDisplayHandle()
{
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- return glfwGetWaylandDisplay();
-# else
- return glfwGetX11Display();
-# endif // ENTRY_CONFIG_USE_WAYLAND
+ if (glfwGetPlatform() == GLFW_PLATFORM_WAYLAND)
+ {
+ return glfwGetWaylandDisplay();
+ }
+ else
+ {
+ return glfwGetX11Display();
+ }
# else
return NULL;
# endif // BX_PLATFORM_*
@@ -878,11 +852,14 @@ namespace entry
bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
{
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- return bgfx::NativeWindowHandleType::Wayland;
-# else
- return bgfx::NativeWindowHandleType::Default;
-# endif // ENTRY_CONFIG_USE_WAYLAND
+ if (glfwGetPlatform() == GLFW_PLATFORM_WAYLAND)
+ {
+ return bgfx::NativeWindowHandleType::Wayland;
+ }
+ else
+ {
+ return bgfx::NativeWindowHandleType::Default;
+ }
# else
return bgfx::NativeWindowHandleType::Default;
# endif // BX_PLATFORM_*
diff --git a/3rdparty/bgfx/examples/common/entry/entry_p.h b/3rdparty/bgfx/examples/common/entry/entry_p.h
index 59307c2f040..3c01e3459c8 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_p.h
+++ b/3rdparty/bgfx/examples/common/entry/entry_p.h
@@ -25,10 +25,6 @@
# define ENTRY_CONFIG_USE_GLFW 0
#endif // ENTRY_CONFIG_USE_GLFW
-#ifndef ENTRY_CONFIG_USE_WAYLAND
-# define ENTRY_CONFIG_USE_WAYLAND 0
-#endif // ENTRY_CONFIG_USE_WAYLAND
-
#if !defined(ENTRY_CONFIG_USE_NATIVE) \
&& !ENTRY_CONFIG_USE_NOOP \
&& !ENTRY_CONFIG_USE_SDL \
diff --git a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
index 5a862c0ca05..bbcdb069257 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
@@ -8,9 +8,6 @@
#if ENTRY_CONFIG_USE_SDL
#if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
-# include <wayland-egl.h>
-# endif
#elif BX_PLATFORM_WINDOWS
# define SDL_MAIN_HANDLED
#endif
@@ -49,25 +46,14 @@ namespace entry
}
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- if (wmi.subsystem == SDL_SYSWM_WAYLAND)
- {
- wl_egl_window *win_impl = (wl_egl_window*)SDL_GetWindowData(_window, "wl_egl_window");
- if(!win_impl)
- {
- int width, height;
- SDL_GetWindowSize(_window, &width, &height);
- struct wl_surface* surface = wmi.info.wl.surface;
- if(!surface)
- return nullptr;
- win_impl = wl_egl_window_create(surface, width, height);
- SDL_SetWindowData(_window, "wl_egl_window", win_impl);
- }
- return (void*)(uintptr_t)win_impl;
- }
- else
-# endif // ENTRY_CONFIG_USE_WAYLAND
- return (void*)wmi.info.x11.window;
+ if (wmi.subsystem == SDL_SYSWM_WAYLAND)
+ {
+ return (void*)wmi.info.wl.surface;
+ }
+ else
+ {
+ return (void*)wmi.info.x11.window;
+ }
# elif BX_PLATFORM_OSX || BX_PLATFORM_IOS
return wmi.info.cocoa.window;
# elif BX_PLATFORM_WINDOWS
@@ -77,23 +63,6 @@ namespace entry
# endif // BX_PLATFORM_
}
- static void sdlDestroyWindow(SDL_Window* _window)
- {
- if(!_window)
- return;
-# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- wl_egl_window *win_impl = (wl_egl_window*)SDL_GetWindowData(_window, "wl_egl_window");
- if(win_impl)
- {
- SDL_SetWindowData(_window, "wl_egl_window", nullptr);
- wl_egl_window_destroy(win_impl);
- }
-# endif
-# endif
- SDL_DestroyWindow(_window);
- }
-
static uint8_t translateKeyModifiers(uint16_t _sdl)
{
uint8_t modifiers = 0;
@@ -493,7 +462,7 @@ namespace entry
// Force window resolution...
WindowHandle defaultWindow = { 0 };
- setWindowSize(defaultWindow, m_width, m_height, true);
+ entry::setWindowSize(defaultWindow, m_width, m_height);
SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
@@ -671,7 +640,15 @@ namespace entry
case SDL_WINDOWEVENT_SIZE_CHANGED:
{
WindowHandle handle = findHandle(wev.windowID);
- setWindowSize(handle, wev.data1, wev.data2);
+ uint32_t width = wev.data1;
+ uint32_t height = wev.data2;
+ if (width != m_width
+ || height != m_height)
+ {
+ m_width = width;
+ m_height = height;
+ m_eventQueue.postSizeEvent(handle, m_width, m_height);
+ }
}
break;
@@ -865,7 +842,7 @@ namespace entry
if (isValid(handle) )
{
m_eventQueue.postWindowEvent(handle);
- sdlDestroyWindow(m_window[handle.idx]);
+ SDL_DestroyWindow(m_window[handle.idx]);
m_window[handle.idx] = NULL;
}
}
@@ -916,7 +893,7 @@ namespace entry
Msg* msg = (Msg*)uev.data2;
if (isValid(handle) )
{
- setWindowSize(handle, msg->m_width, msg->m_height);
+ SDL_SetWindowSize(m_window[handle.idx], msg->m_width, msg->m_height);
}
delete msg;
}
@@ -959,7 +936,7 @@ namespace entry
while (bgfx::RenderFrame::NoContext != bgfx::renderFrame() ) {};
m_thread.shutdown();
- sdlDestroyWindow(m_window[0]);
+ SDL_DestroyWindow(m_window[0]);
SDL_Quit();
return m_thread.getExitCode();
@@ -988,20 +965,6 @@ namespace entry
return invalid;
}
- void setWindowSize(WindowHandle _handle, uint32_t _width, uint32_t _height, bool _force = false)
- {
- if (_width != m_width
- || _height != m_height
- || _force)
- {
- m_width = _width;
- m_height = _height;
-
- SDL_SetWindowSize(m_window[_handle.idx], m_width, m_height);
- m_eventQueue.postSizeEvent(_handle, m_width, m_height);
- }
- }
-
GamepadHandle findGamepad(SDL_JoystickID _jid)
{
for (uint32_t ii = 0, num = m_gamepadAlloc.getNumHandles(); ii < num; ++ii)
@@ -1102,6 +1065,7 @@ namespace entry
void setWindowSize(WindowHandle _handle, uint32_t _width, uint32_t _height)
{
+ // Function to set the window size programmatically from the examples/tools.
Msg* msg = new Msg;
msg->m_width = _width;
msg->m_height = _height;
@@ -1149,12 +1113,10 @@ namespace entry
return NULL;
}
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
- if (wmi.subsystem == SDL_SYSWM_WAYLAND)
- return wmi.info.wl.display;
- else
-# endif // ENTRY_CONFIG_USE_WAYLAND
- return wmi.info.x11.display;
+ if (wmi.subsystem == SDL_SYSWM_WAYLAND)
+ return wmi.info.wl.display;
+ else
+ return wmi.info.x11.display;
# else
return NULL;
# endif // BX_PLATFORM_*
@@ -1169,11 +1131,9 @@ namespace entry
return bgfx::NativeWindowHandleType::Default;
}
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
-# if ENTRY_CONFIG_USE_WAYLAND
if (wmi.subsystem == SDL_SYSWM_WAYLAND)
return bgfx::NativeWindowHandleType::Wayland;
else
-# endif // ENTRY_CONFIG_USE_WAYLAND
return bgfx::NativeWindowHandleType::Default;
# else
return bgfx::NativeWindowHandleType::Default;
diff --git a/3rdparty/bgfx/examples/common/entry/entry_windows.cpp b/3rdparty/bgfx/examples/common/entry/entry_windows.cpp
index 754039a6db7..e731977737e 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_windows.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_windows.cpp
@@ -851,14 +851,18 @@ namespace entry
if (utf16[0] >= 0xD800 && utf16[0] <= 0xDBFF) {
m_surrogate = utf16[0];
- } else {
+ }
+ else
+ {
int utf16_len;
if (utf16[0] >= 0xDC00 && utf16[0] <= 0xDFFF) {
utf16[1] = utf16[0];
utf16[0] = m_surrogate;
m_surrogate = 0;
utf16_len = 2;
- } else {
+ }
+ else
+ {
utf16_len = 1;
}
diff --git a/3rdparty/bgfx/examples/common/example-glue.cpp b/3rdparty/bgfx/examples/common/example-glue.cpp
index 74ff3719f18..3c51db6ee0f 100644
--- a/3rdparty/bgfx/examples/common/example-glue.cpp
+++ b/3rdparty/bgfx/examples/common/example-glue.cpp
@@ -290,6 +290,8 @@ void showExampleDialog(entry::AppI* _app, const char* _errorText)
}
}
}
+#else
+ ImGui::Text("Renderer: %s", bgfx::getRendererName(bgfx::getRendererType()));
#endif // 0
const bgfx::Stats* stats = bgfx::getStats();
diff --git a/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.sc b/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.sc
index f07729cb94c..0b9c9828b2c 100644
--- a/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.sc
+++ b/3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.sc
@@ -7,5 +7,5 @@ SAMPLER2D(s_tex, 0);
void main()
{
vec4 texel = texture2D(s_tex, v_texcoord0);
- gl_FragColor = texel * v_color0;
+ gl_FragColor = texel * v_color0;
}
diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.cpp b/3rdparty/bgfx/examples/common/imgui/imgui.cpp
index 951c118ed76..d553d9d43e1 100644
--- a/3rdparty/bgfx/examples/common/imgui/imgui.cpp
+++ b/3rdparty/bgfx/examples/common/imgui/imgui.cpp
@@ -14,12 +14,14 @@
#include "imgui.h"
#include "../bgfx_utils.h"
-//#define USE_ENTRY 1
-
#ifndef USE_ENTRY
# define USE_ENTRY 0
#endif // USE_ENTRY
+#ifndef USE_LOCAL_STB
+# define USE_LOCAL_STB 1
+#endif // USE_LOCAL_STB
+
#if USE_ENTRY
# include "../entry/entry.h"
# include "../entry/input.h"
@@ -66,10 +68,13 @@ struct OcornutImguiContext
void render(ImDrawData* _drawData)
{
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
- int fb_width = (int)(_drawData->DisplaySize.x * _drawData->FramebufferScale.x);
- int fb_height = (int)(_drawData->DisplaySize.y * _drawData->FramebufferScale.y);
- if (fb_width <= 0 || fb_height <= 0)
+ int32_t dispWidth = int32_t(_drawData->DisplaySize.x * _drawData->FramebufferScale.x);
+ int32_t dispHeight = int32_t(_drawData->DisplaySize.y * _drawData->FramebufferScale.y);
+ if (dispWidth <= 0
+ || dispHeight <= 0)
+ {
return;
+ }
bgfx::setViewName(m_viewId, "ImGui");
bgfx::setViewMode(m_viewId, bgfx::ViewMode::Sequential);
@@ -134,14 +139,16 @@ struct OcornutImguiContext
bgfx::TextureHandle th = m_texture;
bgfx::ProgramHandle program = m_program;
- if (NULL != cmd->TextureId)
+ if (ImU64(0) != cmd->TextureId)
{
union { ImTextureID ptr; struct { bgfx::TextureHandle handle; uint8_t flags; uint8_t mip; } s; } texture = { cmd->TextureId };
+
state |= 0 != (IMGUI_FLAGS_ALPHA_BLEND & texture.s.flags)
? BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA)
: BGFX_STATE_NONE
;
th = texture.s.handle;
+
if (0 != texture.s.mip)
{
const float lodEnabled[4] = { float(texture.s.mip), 1.0f, 0.0f, 0.0f };
@@ -161,8 +168,8 @@ struct OcornutImguiContext
clipRect.z = (cmd->ClipRect.z - clipPos.x) * clipScale.x;
clipRect.w = (cmd->ClipRect.w - clipPos.y) * clipScale.y;
- if (clipRect.x < fb_width
- && clipRect.y < fb_height
+ if (clipRect.x < dispWidth
+ && clipRect.y < dispHeight
&& clipRect.z >= 0.0f
&& clipRect.w >= 0.0f)
{
@@ -188,6 +195,8 @@ struct OcornutImguiContext
void create(float _fontSize, bx::AllocatorI* _allocator)
{
+ IMGUI_CHECKVERSION();
+
m_allocator = _allocator;
if (NULL == _allocator)
@@ -462,12 +471,13 @@ struct OcornutImguiContext
m_lastScroll = _scroll;
#if USE_ENTRY
- uint8_t modifiers = inputGetModifiersState();
- io.AddKeyEvent(ImGuiKey_ModShift, 0 != (modifiers & (entry::Modifier::LeftShift | entry::Modifier::RightShift) ) );
- io.AddKeyEvent(ImGuiKey_ModCtrl, 0 != (modifiers & (entry::Modifier::LeftCtrl | entry::Modifier::RightCtrl ) ) );
- io.AddKeyEvent(ImGuiKey_ModAlt, 0 != (modifiers & (entry::Modifier::LeftAlt | entry::Modifier::RightAlt ) ) );
- io.AddKeyEvent(ImGuiKey_ModSuper, 0 != (modifiers & (entry::Modifier::LeftMeta | entry::Modifier::RightMeta ) ) );
- for (int32_t ii = 0; ii < (int32_t)entry::Key::Count; ++ii)
+ const uint8_t modifiers = inputGetModifiersState();
+ io.AddKeyEvent(ImGuiMod_Shift, 0 != (modifiers & (entry::Modifier::LeftShift | entry::Modifier::RightShift) ) );
+ io.AddKeyEvent(ImGuiMod_Ctrl, 0 != (modifiers & (entry::Modifier::LeftCtrl | entry::Modifier::RightCtrl ) ) );
+ io.AddKeyEvent(ImGuiMod_Alt, 0 != (modifiers & (entry::Modifier::LeftAlt | entry::Modifier::RightAlt ) ) );
+ io.AddKeyEvent(ImGuiMod_Super, 0 != (modifiers & (entry::Modifier::LeftMeta | entry::Modifier::RightMeta ) ) );
+
+ for (int32_t ii = 0; ii < int32_t(entry::Key::Count); ++ii)
{
io.AddKeyEvent(m_keyMap[ii], inputGetKeyState(entry::Key::Enum(ii) ) );
io.SetKeyEventNativeData(m_keyMap[ii], 0, 0, ii);
@@ -559,15 +569,29 @@ namespace ImGui
} // namespace ImGui
+#if USE_LOCAL_STB
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4505); // error C4505: '' : unreferenced local function has been removed
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-function"); // warning: 'int rect_width_compare(const void*, const void*)' defined but not used
-BX_PRAGMA_DIAGNOSTIC_PUSH();
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunknown-pragmas")
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wtype-limits"); // warning: comparison is always true due to limited range of data type
-#define STBTT_malloc(_size, _userData) memAlloc(_size, _userData)
-#define STBTT_free(_ptr, _userData) memFree(_ptr, _userData)
-#define STB_RECT_PACK_IMPLEMENTATION
-#include <stb/stb_rect_pack.h>
-#define STB_TRUETYPE_IMPLEMENTATION
-#include <stb/stb_truetype.h>
-BX_PRAGMA_DIAGNOSTIC_POP();
+
+# define STBTT_ifloor(_a) int32_t(bx::floor(_a) )
+# define STBTT_iceil(_a) int32_t(bx::ceil(_a) )
+# define STBTT_sqrt(_a) bx::sqrt(_a)
+# define STBTT_pow(_a, _b) bx::pow(_a, _b)
+# define STBTT_fmod(_a, _b) bx::mod(_a, _b)
+# define STBTT_cos(_a) bx::cos(_a)
+# define STBTT_acos(_a) bx::acos(_a)
+# define STBTT_fabs(_a) bx::abs(_a)
+# define STBTT_strlen(_str) bx::strLen(_str)
+
+# define STBTT_memcpy(_dst, _src, _numBytes) bx::memCopy(_dst, _src, _numBytes)
+# define STBTT_memset(_dst, _ch, _numBytes) bx::memSet(_dst, _ch, _numBytes)
+# define STBTT_malloc(_size, _userData) memAlloc(_size, _userData)
+# define STBTT_free(_ptr, _userData) memFree(_ptr, _userData)
+
+# define STB_RECT_PACK_IMPLEMENTATION
+# include <stb/stb_rect_pack.h>
+# define STB_TRUETYPE_IMPLEMENTATION
+# include <stb/stb_truetype.h>
+#endif // USE_LOCAL_STB
diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.h b/3rdparty/bgfx/examples/common/imgui/imgui.h
index 98072777530..81e9ec49854 100644
--- a/3rdparty/bgfx/examples/common/imgui/imgui.h
+++ b/3rdparty/bgfx/examples/common/imgui/imgui.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2022 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2025 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*/
@@ -62,7 +62,7 @@ namespace ImGui
, const ImVec4& _borderCol = ImVec4(0.0f, 0.0f, 0.0f, 0.0f)
)
{
- Image(toId(_handle, _flags, _mip), _size, _uv0, _uv1, _tintCol, _borderCol);
+ ImageWithBg(toId(_handle, _flags, _mip), _size, _uv0, _uv1, _tintCol, _borderCol);
}
// Helper function for passing bgfx::TextureHandle to ImGui::Image.
diff --git a/3rdparty/bgfx/examples/common/imgui/makefile b/3rdparty/bgfx/examples/common/imgui/makefile
index 1979d957d9e..7b26cb84a85 100644
--- a/3rdparty/bgfx/examples/common/imgui/makefile
+++ b/3rdparty/bgfx/examples/common/imgui/makefile
@@ -1,5 +1,5 @@
#
-# Copyright 2011-2022 Branimir Karadzic. All rights reserved.
+# Copyright 2011-2025 Branimir Karadzic. All rights reserved.
# License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
#
diff --git a/3rdparty/bgfx/scripts/example-common.lua b/3rdparty/bgfx/scripts/example-common.lua
index c6ddb81fd6c..6dbddd670ec 100644
--- a/3rdparty/bgfx/scripts/example-common.lua
+++ b/3rdparty/bgfx/scripts/example-common.lua
@@ -75,12 +75,6 @@ project ("example-common")
}
end
- if _OPTIONS["with-wayland"] then
- defines {
- "ENTRY_CONFIG_USE_WAYLAND=1",
- }
- end
-
configuration { "android-*" }
includedirs {
path.join(BGFX_DIR, "3rdparty/native_app_glue")
diff --git a/3rdparty/bgfx/scripts/genie.lua b/3rdparty/bgfx/scripts/genie.lua
index 645ed3a21be..d3f4047cd93 100644
--- a/3rdparty/bgfx/scripts/genie.lua
+++ b/3rdparty/bgfx/scripts/genie.lua
@@ -21,11 +21,6 @@ newoption {
}
newoption {
- trigger = "with-wayland",
- description = "Use Wayland backend.",
-}
-
-newoption {
trigger = "with-profiler",
description = "Enable build with intrusive profiler.",
}
@@ -204,10 +199,6 @@ end
function copyLib()
end
-if _OPTIONS["with-wayland"] then
- defines { "WL_EGL_PLATFORM=1" }
-end
-
if _OPTIONS["with-sdl"] then
if os.is("windows") then
if not os.getenv("SDL2_DIR") then
@@ -256,13 +247,6 @@ function exampleProjectDefaults()
defines { "ENTRY_CONFIG_USE_SDL=1" }
links { "SDL2" }
- configuration { "linux or freebsd" }
- if _OPTIONS["with-wayland"] then
- links {
- "wayland-egl",
- }
- end
-
configuration { "osx*" }
libdirs { "$(SDL2_DIR)/lib" }
@@ -273,21 +257,6 @@ function exampleProjectDefaults()
defines { "ENTRY_CONFIG_USE_GLFW=1" }
links { "glfw3" }
- configuration { "linux or freebsd" }
- if _OPTIONS["with-wayland"] then
- links {
- "wayland-egl",
- }
- else
- links {
- "Xrandr",
- "Xinerama",
- "Xi",
- "Xxf86vm",
- "Xcursor",
- }
- end
-
configuration { "osx*" }
linkoptions {
"-framework CoreVideo",
diff --git a/3rdparty/bgfx/scripts/geometryv.lua b/3rdparty/bgfx/scripts/geometryv.lua
index e403d582179..054daf7af0d 100644
--- a/3rdparty/bgfx/scripts/geometryv.lua
+++ b/3rdparty/bgfx/scripts/geometryv.lua
@@ -30,13 +30,6 @@ project ("geometryv")
defines { "ENTRY_CONFIG_USE_SDL=1" }
links { "SDL2" }
- configuration { "linux or freebsd" }
- if _OPTIONS["with-wayland"] then
- links {
- "wayland-egl",
- }
- end
-
configuration { "x32", "windows" }
libdirs { "$(SDL2_DIR)/lib/x86" }
@@ -50,15 +43,6 @@ project ("geometryv")
defines { "ENTRY_CONFIG_USE_GLFW=1" }
links { "glfw3" }
- configuration { "linux or freebsd" }
- links {
- "Xrandr",
- "Xinerama",
- "Xi",
- "Xxf86vm",
- "Xcursor",
- }
-
configuration { "osx*" }
linkoptions {
"-framework CoreVideo",
diff --git a/3rdparty/bgfx/scripts/texturev.lua b/3rdparty/bgfx/scripts/texturev.lua
index d5bb9e2f08a..80f7dc4e814 100644
--- a/3rdparty/bgfx/scripts/texturev.lua
+++ b/3rdparty/bgfx/scripts/texturev.lua
@@ -30,13 +30,6 @@ project ("texturev")
defines { "ENTRY_CONFIG_USE_SDL=1" }
links { "SDL2" }
- configuration { "linux or freebsd" }
- if _OPTIONS["with-wayland"] then
- links {
- "wayland-egl",
- }
- end
-
configuration { "x32", "windows" }
libdirs { "$(SDL2_DIR)/lib/x86" }
@@ -50,15 +43,6 @@ project ("texturev")
defines { "ENTRY_CONFIG_USE_GLFW=1" }
links { "glfw3" }
- configuration { "linux or freebsd" }
- links {
- "Xrandr",
- "Xinerama",
- "Xi",
- "Xxf86vm",
- "Xcursor",
- }
-
configuration { "osx*" }
linkoptions {
"-framework CoreVideo",
diff --git a/3rdparty/bgfx/src/glcontext_egl.cpp b/3rdparty/bgfx/src/glcontext_egl.cpp
index 54e0230b778..85de92e1df5 100644
--- a/3rdparty/bgfx/src/glcontext_egl.cpp
+++ b/3rdparty/bgfx/src/glcontext_egl.cpp
@@ -111,6 +111,43 @@ EGL_IMPORT
}
#endif // BGFX_USE_GL_DYNAMIC_LIB
+
+#if BX_PLATFORM_LINUX
+# define WL_EGL_IMPORT \
+ WL_EGL_FUNC(struct wl_egl_window *, wl_egl_window_create, (struct wl_surface *, int, int) ) \
+ WL_EGL_FUNC(void, wl_egl_window_destroy, (struct wl_egl_window *)) \
+ WL_EGL_FUNC(void, wl_egl_window_resize, (struct wl_egl_window *, int, int, int, int)) \
+ WL_EGL_FUNC(void, wl_egl_window_get_attached_size, (struct wl_egl_window *, int *, int *) ) \
+
+# define WL_EGL_FUNC(rt, fname, params) \
+ typedef rt(*PFNWLEGL_##fname) params; \
+ PFNWLEGL_##fname BGFX_WAYLAND_##fname;
+
+WL_EGL_IMPORT
+# undef WL_EGL_FUNC
+
+ void* waylandEglOpen()
+ {
+ void* handle = bx::dlopen("libwayland-egl.so.1");
+ BGFX_FATAL(handle != NULL, Fatal::UnableToInitialize, "Could not dlopen() libwayland-egl.so.1");
+
+# define WL_EGL_FUNC(rt, fname, params) BGFX_WAYLAND_##fname = (PFNWLEGL_##fname) bx::dlsym(handle, #fname);
+ WL_EGL_IMPORT
+# undef WL_EGL_FUNC
+
+ return handle;
+ }
+
+ void waylandEglClose(void* _handle)
+ {
+ bx::dlclose(_handle);
+
+# define WL_EGL_FUNC(rt, fname, params) BGFX_WAYLAND_##fname = NULL;
+ WL_EGL_IMPORT
+# undef WL_EGL_FUNC
+ }
+#endif // BX_PLATFORM_LINUX
+
# define GL_IMPORT(_optional, _proto, _func, _import) _proto _func = NULL
# include "glimports.h"
@@ -118,18 +155,32 @@ EGL_IMPORT
struct SwapChainGL
{
- SwapChainGL(EGLDisplay _display, EGLConfig _config, EGLContext _context, EGLNativeWindowType _nwh)
+ SwapChainGL(EGLDisplay _display, EGLConfig _config, EGLContext _context, EGLNativeWindowType _nwh, int _width, int _height)
: m_nwh(_nwh)
, m_display(_display)
+# if BX_PLATFORM_LINUX
+ , m_eglWindow(NULL)
+# endif
{
EGLSurface defaultSurface = eglGetCurrentSurface(EGL_DRAW);
+ BX_UNUSED(_width, _height);
+
if (EGLNativeWindowType(0) == _nwh)
{
m_surface = eglCreatePbufferSurface(m_display, _config, NULL);
}
else
{
+# if BX_PLATFORM_LINUX
+ if (g_platformData.type == NativeWindowHandleType::Wayland)
+ {
+ // A wl_surface needs to be first wrapped in a wl_egl_window
+ // before it can be used to create the EGLSurface.
+ m_eglWindow = BGFX_WAYLAND_wl_egl_window_create( (wl_surface*)_nwh, _width, _height);
+ _nwh = (EGLNativeWindowType) m_eglWindow;
+ }
+# endif
m_surface = eglCreateWindowSurface(m_display, _config, _nwh, NULL);
}
@@ -157,6 +208,12 @@ EGL_IMPORT
eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(m_display, m_context);
eglDestroySurface(m_display, m_surface);
+# if BX_PLATFORM_LINUX
+ if (m_eglWindow)
+ {
+ BGFX_WAYLAND_wl_egl_window_destroy(m_eglWindow);
+ }
+# endif
eglMakeCurrent(m_display, defaultSurface, defaultSurface, defaultContext);
}
@@ -174,6 +231,9 @@ EGL_IMPORT
EGLContext m_context;
EGLDisplay m_display;
EGLSurface m_surface;
+# if BX_PLATFORM_LINUX
+ wl_egl_window *m_eglWindow;
+# endif
};
# if BX_PLATFORM_RPI
@@ -188,7 +248,7 @@ EGL_IMPORT
bcm_host_init();
# endif // BX_PLATFORM_RPI
- m_eglLibrary = eglOpen();
+ m_eglDll = eglOpen();
if (NULL == g_platformData.context)
{
@@ -207,7 +267,7 @@ EGL_IMPORT
}
# endif // BX_PLATFORM_WINDOWS
- m_display = eglGetDisplay(NULL == ndt ? EGL_DEFAULT_DISPLAY : ndt);
+ m_display = eglGetDisplay(NULL == ndt ? EGL_DEFAULT_DISPLAY : ndt);
BGFX_FATAL(m_display != EGL_NO_DISPLAY, Fatal::UnableToInitialize, "Failed to create display %p", m_display);
EGLint major = 0;
@@ -316,6 +376,12 @@ EGL_IMPORT
vc_dispmanx_update_submit_sync(dispmanUpdate);
# endif // BX_PLATFORM_ANDROID
+# if BX_PLATFORM_LINUX
+ if (g_platformData.type == NativeWindowHandleType::Wayland)
+ {
+ m_waylandEglDll = waylandEglOpen();
+ }
+# endif
if (headless)
{
EGLint pbAttribs[] =
@@ -330,6 +396,15 @@ EGL_IMPORT
}
else
{
+# if BX_PLATFORM_LINUX
+ if (g_platformData.type == NativeWindowHandleType::Wayland)
+ {
+ // A wl_surface needs to be first wrapped in a wl_egl_window
+ // before it can be used to create the EGLSurface.
+ m_eglWindow = BGFX_WAYLAND_wl_egl_window_create( (wl_surface*)nwh, _width, _height);
+ nwh = (EGLNativeWindowType) m_eglWindow;
+ }
+# endif
m_surface = eglCreateWindowSurface(m_display, m_config, nwh, NULL);
}
@@ -412,16 +487,26 @@ EGL_IMPORT
void GlContext::destroy()
{
+ BX_TRACE("GLContext::destroy()");
if (NULL != m_display)
{
eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(m_display, m_context);
eglDestroySurface(m_display, m_surface);
+# if BX_PLATFORM_LINUX
+ if (m_eglWindow)
+ {
+ BGFX_WAYLAND_wl_egl_window_destroy(m_eglWindow);
+ waylandEglClose(m_waylandEglDll);
+ m_waylandEglDll = NULL;
+ }
+# endif
eglTerminate(m_display);
m_context = NULL;
}
- eglClose(m_eglLibrary);
+ eglClose(m_eglDll);
+ m_eglDll = NULL;
# if BX_PLATFORM_RPI
bcm_host_deinit();
@@ -447,6 +532,11 @@ EGL_IMPORT
}
# elif BX_PLATFORM_EMSCRIPTEN
EMSCRIPTEN_CHECK(emscripten_set_canvas_element_size(HTML5_TARGET_CANVAS_SELECTOR, _width, _height) );
+# elif BX_PLATFORM_LINUX
+ if (NULL != m_eglWindow)
+ {
+ BGFX_WAYLAND_wl_egl_window_resize(m_eglWindow, _width, _height, 0, 0);
+ }
# else
BX_UNUSED(_width, _height);
# endif // BX_PLATFORM_*
@@ -470,9 +560,9 @@ EGL_IMPORT
;
}
- SwapChainGL* GlContext::createSwapChain(void* _nwh)
+ SwapChainGL* GlContext::createSwapChain(void* _nwh, int _width, int _height)
{
- return BX_NEW(g_allocator, SwapChainGL)(m_display, m_config, m_context, (EGLNativeWindowType)_nwh);
+ return BX_NEW(g_allocator, SwapChainGL)(m_display, m_config, m_context, (EGLNativeWindowType)_nwh, _width, _height);
}
void GlContext::destroySwapChain(SwapChainGL* _swapChain)
diff --git a/3rdparty/bgfx/src/glcontext_egl.h b/3rdparty/bgfx/src/glcontext_egl.h
index 2f87a32e5eb..28e7a5d49fb 100644
--- a/3rdparty/bgfx/src/glcontext_egl.h
+++ b/3rdparty/bgfx/src/glcontext_egl.h
@@ -11,6 +11,8 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
+struct wl_egl_window;
+
// EGL pulls X11 crap...
#if defined(None)
# undef None
@@ -31,10 +33,15 @@ namespace bgfx { namespace gl
struct GlContext
{
GlContext()
- : m_current(NULL)
+ : m_eglDll(NULL)
+ , m_current(NULL)
, m_context(NULL)
, m_display(NULL)
, m_surface(NULL)
+#if BX_PLATFORM_LINUX
+ , m_waylandEglDll(NULL)
+ , m_eglWindow(NULL)
+#endif
, m_msaaContext(false)
{
}
@@ -44,7 +51,7 @@ namespace bgfx { namespace gl
void resize(uint32_t _width, uint32_t _height, uint32_t _flags);
uint64_t getCaps() const;
- SwapChainGL* createSwapChain(void* _nwh);
+ SwapChainGL* createSwapChain(void* _nwh, int _w, int _h);
void destroySwapChain(SwapChainGL* _swapChain);
void swap(SwapChainGL* _swapChain = NULL);
void makeCurrent(SwapChainGL* _swapChain = NULL);
@@ -56,12 +63,16 @@ namespace bgfx { namespace gl
return NULL != m_context;
}
- void* m_eglLibrary;
+ void* m_eglDll;
SwapChainGL* m_current;
EGLConfig m_config;
EGLContext m_context;
EGLDisplay m_display;
EGLSurface m_surface;
+#if BX_PLATFORM_LINUX
+ void* m_waylandEglDll;
+ struct wl_egl_window *m_eglWindow;
+#endif
// true when MSAA is handled by the context instead of using MSAA FBO
bool m_msaaContext;
};
diff --git a/3rdparty/bgfx/src/glcontext_html5.cpp b/3rdparty/bgfx/src/glcontext_html5.cpp
index 016b7c189b3..cce0f299da8 100644
--- a/3rdparty/bgfx/src/glcontext_html5.cpp
+++ b/3rdparty/bgfx/src/glcontext_html5.cpp
@@ -86,7 +86,7 @@ namespace bgfx { namespace gl
}
else
{
- m_primary = createSwapChain((void*)canvas);
+ m_primary = createSwapChain((void*)canvas, (int)_width, (int)_height);
}
if (0 != _width
@@ -122,9 +122,10 @@ namespace bgfx { namespace gl
EMSCRIPTEN_CHECK(emscripten_set_canvas_element_size(m_primary->m_canvas, (int) _width, (int) _height) );
}
- SwapChainGL* GlContext::createSwapChain(void* _nwh)
+ SwapChainGL* GlContext::createSwapChain(void* _nwh, int _width, int _height)
{
emscripten_webgl_init_context_attributes(&s_attrs);
+ BX_UNUSED(_width, _height);
// Work around bug https://bugs.chromium.org/p/chromium/issues/detail?id=1045643 in Chrome
// by having alpha always enabled.
diff --git a/3rdparty/bgfx/src/glcontext_html5.h b/3rdparty/bgfx/src/glcontext_html5.h
index 3c3f457d3c6..e1b93799a75 100644
--- a/3rdparty/bgfx/src/glcontext_html5.h
+++ b/3rdparty/bgfx/src/glcontext_html5.h
@@ -26,7 +26,7 @@ namespace bgfx { namespace gl
void resize(uint32_t _width, uint32_t _height, uint32_t _flags);
uint64_t getCaps() const;
- SwapChainGL* createSwapChain(void* _nwh);
+ SwapChainGL* createSwapChain(void* _nwh, int _width, int _height);
void destroySwapChain(SwapChainGL* _swapChain);
void swap(SwapChainGL* _swapChain = NULL);
void makeCurrent(SwapChainGL* _swapChain = NULL);
diff --git a/3rdparty/bgfx/src/glcontext_nsgl.h b/3rdparty/bgfx/src/glcontext_nsgl.h
index 560808b0fd5..ed331871e35 100644
--- a/3rdparty/bgfx/src/glcontext_nsgl.h
+++ b/3rdparty/bgfx/src/glcontext_nsgl.h
@@ -26,7 +26,7 @@ namespace bgfx { namespace gl
void resize(uint32_t _width, uint32_t _height, uint32_t _flags);
uint64_t getCaps() const;
- SwapChainGL* createSwapChain(void* _nwh);
+ SwapChainGL* createSwapChain(void* _nwh, int _width, int _height);
void destroySwapChain(SwapChainGL* _swapChain);
void swap(SwapChainGL* _swapChain = NULL);
void makeCurrent(SwapChainGL* _swapChain = NULL);
diff --git a/3rdparty/bgfx/src/glcontext_nsgl.mm b/3rdparty/bgfx/src/glcontext_nsgl.mm
index acb1900762c..93dd421205f 100644
--- a/3rdparty/bgfx/src/glcontext_nsgl.mm
+++ b/3rdparty/bgfx/src/glcontext_nsgl.mm
@@ -326,7 +326,7 @@ namespace bgfx { namespace gl
return caps;
}
- SwapChainGL* GlContext::createSwapChain(void* _nwh)
+ SwapChainGL* GlContext::createSwapChain(void* _nwh, int _width, int _height)
{
return BX_NEW(g_allocator, SwapChainGL)(_nwh,(NSOpenGLContext*)m_context);
}
diff --git a/3rdparty/bgfx/src/glcontext_wgl.cpp b/3rdparty/bgfx/src/glcontext_wgl.cpp
index f09a23d872e..efa0ec2080d 100644
--- a/3rdparty/bgfx/src/glcontext_wgl.cpp
+++ b/3rdparty/bgfx/src/glcontext_wgl.cpp
@@ -335,8 +335,9 @@ namespace bgfx { namespace gl
return BGFX_CAPS_SWAP_CHAIN;
}
- SwapChainGL* GlContext::createSwapChain(void* _nwh)
+ SwapChainGL* GlContext::createSwapChain(void* _nwh, int _width, int _height)
{
+ BX_UNUSED(_width, _height);
SwapChainGL* swapChain = BX_NEW(g_allocator, SwapChainGL)(_nwh);
int result = SetPixelFormat(swapChain->m_hdc, m_pixelFormat, &m_pfd);
diff --git a/3rdparty/bgfx/src/glcontext_wgl.h b/3rdparty/bgfx/src/glcontext_wgl.h
index 7289a123424..13b8d2ed880 100644
--- a/3rdparty/bgfx/src/glcontext_wgl.h
+++ b/3rdparty/bgfx/src/glcontext_wgl.h
@@ -74,7 +74,7 @@ typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum z
void resize(uint32_t _width, uint32_t _height, uint32_t _flags);
uint64_t getCaps() const;
- SwapChainGL* createSwapChain(void* _nwh);
+ SwapChainGL* createSwapChain(void* _nwh, int _width, int _height);
void destroySwapChain(SwapChainGL* _swapChain);
void swap(SwapChainGL* _swapChain = NULL);
void makeCurrent(SwapChainGL* _swapChain = NULL);
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp
index b15f0a12886..16095248be9 100644
--- a/3rdparty/bgfx/src/renderer_d3d11.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d11.cpp
@@ -3396,10 +3396,10 @@ namespace bgfx { namespace d3d11
{
case UniformType::Mat3:
case UniformType::Mat3|kUniformFragmentBit:
- {
+ {
float* value = (float*)data;
for (uint32_t ii = 0, count = num/3; ii < count; ++ii, loc += 3*16, value += 9)
- {
+ {
Matrix4 mtx;
mtx.un.val[ 0] = value[0];
mtx.un.val[ 1] = value[1];
diff --git a/3rdparty/bgfx/src/renderer_d3d12.cpp b/3rdparty/bgfx/src/renderer_d3d12.cpp
index 36d23cb5a91..b22cadec2ea 100644
--- a/3rdparty/bgfx/src/renderer_d3d12.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d12.cpp
@@ -474,13 +474,13 @@ namespace bgfx { namespace d3d12
static inline D3D12_HEAP_PROPERTIES ID3D12DeviceGetCustomHeapProperties(ID3D12Device *device, uint32_t nodeMask, D3D12_HEAP_TYPE heapType)
{
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
return device->GetCustomHeapProperties(nodeMask, heapType);
#else
D3D12_HEAP_PROPERTIES ret;
device->GetCustomHeapProperties(&ret, nodeMask, heapType);
return ret;
-#endif // BX_COMPILER_MSVC
+#endif // BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
}
static void initHeapProperties(ID3D12Device* _device, D3D12_HEAP_PROPERTIES& _properties)
@@ -525,11 +525,11 @@ namespace bgfx { namespace d3d12
void* ptr;
DX_CHECK(resource->Map(0, NULL, &ptr) );
D3D12_RESOURCE_ALLOCATION_INFO rai;
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
rai = _device->GetResourceAllocationInfo(1, 1, _resourceDesc);
#else
_device->GetResourceAllocationInfo(&rai, 1, 1, _resourceDesc);
-#endif // BX_COMPILER_MSVC
+#endif // BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
bx::memSet(ptr, 0, size_t(rai.SizeInBytes) );
resource->Unmap(0, NULL);
}
@@ -626,35 +626,35 @@ namespace bgfx { namespace d3d12
inline D3D12_CPU_DESCRIPTOR_HANDLE getCPUHandleHeapStart(ID3D12DescriptorHeap* _heap)
{
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
return _heap->GetCPUDescriptorHandleForHeapStart();
#else
D3D12_CPU_DESCRIPTOR_HANDLE handle;
_heap->GetCPUDescriptorHandleForHeapStart(&handle);
return handle;
-#endif // BX_COMPILER_MSVC
+#endif // BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
}
inline D3D12_GPU_DESCRIPTOR_HANDLE getGPUHandleHeapStart(ID3D12DescriptorHeap* _heap)
{
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
return _heap->GetGPUDescriptorHandleForHeapStart();
#else
D3D12_GPU_DESCRIPTOR_HANDLE handle;
_heap->GetGPUDescriptorHandleForHeapStart(&handle);
return handle;
-#endif // BX_COMPILER_MSVC
+#endif // BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
}
inline D3D12_RESOURCE_DESC getResourceDesc(ID3D12Resource* _resource)
{
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
return _resource->GetDesc();
#else
D3D12_RESOURCE_DESC desc;
_resource->GetDesc(&desc);
return desc;
-#endif // BX_COMPILER_MSVC
+#endif // BX_COMPILER_MSVC || (BX_COMPILER_CLANG && defined(_MSC_VER))
}
#if BGFX_CONFIG_DEBUG_ANNOTATION && (BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT)
diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp
index 6fdf64225d7..ff860faec25 100644
--- a/3rdparty/bgfx/src/renderer_gl.cpp
+++ b/3rdparty/bgfx/src/renderer_gl.cpp
@@ -3046,7 +3046,8 @@ namespace bgfx { namespace gl
}
#if BGFX_CONFIG_RENDERER_OPENGLES && (BGFX_CONFIG_RENDERER_OPENGLES < 30)
- if (!m_maxMsaa && s_extension[Extension::IMG_multisampled_render_to_texture].m_supported) {
+ if (!m_maxMsaa && s_extension[Extension::IMG_multisampled_render_to_texture].m_supported)
+ {
GL_CHECK(glGetIntegerv(GL_MAX_SAMPLES_IMG, &m_maxMsaa) );
}
#endif // BGFX_CONFIG_RENDERER_OPENGLES < 30
@@ -7112,7 +7113,9 @@ namespace bgfx { namespace gl
{
attachment = GL_DEPTH_ATTACHMENT;
}
- } else {
+ }
+ else
+ {
attachment = GL_COLOR_ATTACHMENT0 + colorIdx;
++colorIdx;
}
@@ -7142,7 +7145,7 @@ namespace bgfx { namespace gl
void FrameBufferGL::create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _format, TextureFormat::Enum _depthFormat)
{
BX_UNUSED(_format, _depthFormat);
- m_swapChain = s_renderGL->m_glctx.createSwapChain(_nwh);
+ m_swapChain = s_renderGL->m_glctx.createSwapChain(_nwh, _width, _height);
m_width = _width;
m_height = _height;
m_numTh = 0;
diff --git a/3rdparty/bgfx/src/renderer_vk.cpp b/3rdparty/bgfx/src/renderer_vk.cpp
index aba25e78512..8b2c6cd001e 100644
--- a/3rdparty/bgfx/src/renderer_vk.cpp
+++ b/3rdparty/bgfx/src/renderer_vk.cpp
@@ -17,10 +17,6 @@
# import <Metal/Metal.h>
#endif // BX_PLATFORM_OSX
-#if defined(WL_EGL_PLATFORM)
-# include <wayland-egl-backend.h>
-#endif // defined(WL_EGL_PLATFORM)
-
namespace bgfx { namespace vk
{
static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
@@ -346,6 +342,18 @@ VK_IMPORT_DEVICE
EXT_shader_viewport_index_layer,
EXT_custom_border_color,
KHR_draw_indirect_count,
+
+# if BX_PLATFORM_ANDROID
+ KHR_android_surface,
+# elif BX_PLATFORM_LINUX
+ KHR_wayland_surface,
+ KHR_xlib_surface,
+ KHR_xcb_surface,
+# elif BX_PLATFORM_WINDOWS
+ KHR_win32_surface,
+# elif BX_PLATFORM_OSX
+ MVK_macos_surface,
+# endif
Count
};
@@ -371,6 +379,17 @@ VK_IMPORT_DEVICE
{ "VK_EXT_shader_viewport_index_layer", 1, false, false, true , Layer::Count },
{ "VK_EXT_custom_border_color", 1, false, false, true , Layer::Count },
{ "VK_KHR_draw_indirect_count", 1, false, false, true , Layer::Count },
+# if BX_PLATFORM_ANDROID
+ { VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, 1, false, false, true, Layer::Count },
+# elif BX_PLATFORM_LINUX
+ { VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, 1, false, false, true, Layer::Count },
+ { VK_KHR_XLIB_SURFACE_EXTENSION_NAME, 1, false, false, true, Layer::Count },
+ { VK_KHR_XCB_SURFACE_EXTENSION_NAME, 1, false, false, true, Layer::Count },
+# elif BX_PLATFORM_WINDOWS
+ { VK_KHR_WIN32_SURFACE_EXTENSION_NAME, 1, false, false, true, Layer::Count },
+# elif BX_PLATFORM_OSX
+ { VK_MVK_MACOS_SURFACE_EXTENSION_NAME, 1, false, false, true, Layer::Count },
+# endif
};
BX_STATIC_ASSERT(Extension::Count == BX_COUNTOF(s_extension) );
@@ -1159,7 +1178,7 @@ VK_IMPORT_DEVICE
#else
"libvulkan.so.1"
#endif // BX_PLATFORM_*
- );
+ );
if (NULL == m_vulkan1Dll)
{
@@ -1229,13 +1248,12 @@ VK_IMPORT
const char* enabledExtension[Extension::Count + 3] =
#else
- uint32_t numEnabledExtensions = headless ? 0 : 2;
+ uint32_t numEnabledExtensions = headless ? 0 : 1;
- const char* enabledExtension[Extension::Count + 2] =
+ const char* enabledExtension[Extension::Count + 1] =
#endif
{
VK_KHR_SURFACE_EXTENSION_NAME,
- KHR_SURFACE_EXTENSION_NAME,
#if BX_PLATFORM_OSX
VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
#endif
@@ -2664,6 +2682,7 @@ VK_IMPORT_DEVICE
m_indexBuffers[_blitter.m_ib->handle.idx].update(m_commandBuffer, 0, _numIndices*2, _blitter.m_ib->data);
m_vertexBuffers[_blitter.m_vb->handle.idx].update(m_commandBuffer, 0, numVertices*_blitter.m_layout.m_stride, _blitter.m_vb->data, true);
+
VkRenderPassBeginInfo rpbi;
rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
rpbi.pNext = NULL;
@@ -2757,6 +2776,13 @@ VK_IMPORT_DEVICE
{
return suspended;
}
+
+ //BX_TRACE("updateResolution(%d, %d) m_resolution=(%d, %d)"
+ // , _resolution.width
+ // , _resolution.height
+ // , m_resolution.width
+ // , m_resolution.height
+ // );
uint32_t flags = _resolution.reset & ~(0
| BGFX_RESET_SUSPEND
@@ -2764,19 +2790,13 @@ VK_IMPORT_DEVICE
| BGFX_RESET_DEPTH_CLAMP
);
- // Note: m_needToRefreshSwapchain is deliberately ignored when deciding whether to recreate the swapchain
- // because it can happen several frames before submit is called with the new resolution.
- // Instead, vkAcquireNextImageKHR and all draws to the backbuffer are skipped until the window size is updated.
- // That also fixes a related issue where VK_ERROR_OUT_OF_DATE_KHR is returned from
- // vkQueuePresentKHR when the window doesn't exist anymore, and vkGetPhysicalDeviceSurfaceCapabilitiesKHR
- // fails with VK_ERROR_SURFACE_LOST_KHR.
-
if (false
|| m_resolution.format != _resolution.format
|| m_resolution.width != _resolution.width
|| m_resolution.height != _resolution.height
|| m_resolution.reset != flags
- || m_backBuffer.m_swapChain.m_needToRecreateSurface)
+ || m_backBuffer.m_swapChain.m_needToRecreateSurface
+ || m_backBuffer.m_swapChain.m_needToRecreateSwapchain)
{
flags &= ~BGFX_RESET_INTERNAL_FORCE;
@@ -2794,6 +2814,10 @@ VK_IMPORT_DEVICE
preReset();
m_backBuffer.update(m_commandBuffer, m_resolution);
+ // Update the resolution again here, as the actual width and height
+ // is now final (as it was potentially clamped by the Vulkan driver).
+ m_resolution.width = m_backBuffer.m_width;
+ m_resolution.height = m_backBuffer.m_height;
postReset();
}
@@ -4131,10 +4155,10 @@ VK_IMPORT_DEVICE
{
case UniformType::Mat3:
case UniformType::Mat3|kUniformFragmentBit:
- {
+ {
float* value = (float*)data;
for (uint32_t ii = 0, count = num/3; ii < count; ++ii, loc += 3*16, value += 9)
- {
+ {
Matrix4 mtx;
mtx.un.val[ 0] = value[0];
mtx.un.val[ 1] = value[1];
@@ -6658,6 +6682,7 @@ VK_DESTROY
;
const bool recreateSwapchain = false
+ || m_needToRecreateSwapchain
|| m_resolution.format != _resolution.format
|| m_resolution.width != _resolution.width
|| m_resolution.height != _resolution.height
@@ -6763,22 +6788,25 @@ VK_DESTROY
}
#elif BX_PLATFORM_LINUX
{
-#if defined(WL_EGL_PLATFORM)
if (g_platformData.type == bgfx::NativeWindowHandleType::Wayland)
{
+ BGFX_FATAL(s_extension[Extension::KHR_wayland_surface].m_supported, Fatal::UnableToInitialize, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME " not supported");
+ BGFX_FATAL(NULL != vkCreateWaylandSurfaceKHR, Fatal::UnableToInitialize, "vkCreateWaylandSurfaceKHR == 0");
+ BX_TRACE("Attempting Wayland surface creation.");
VkWaylandSurfaceCreateInfoKHR sci;
sci.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
sci.pNext = NULL;
sci.flags = 0;
sci.display = (wl_display*)g_platformData.ndt;
- sci.surface = (wl_surface*)((wl_egl_window*)m_nwh)->surface;
+ sci.surface = (wl_surface*)m_nwh;
result = vkCreateWaylandSurfaceKHR(instance, &sci, allocatorCb, &m_surface);
}
else
-#endif // defined(WL_EGL_PLATFORM)
{
- if (NULL != vkCreateXlibSurfaceKHR)
+ if (s_extension[Extension::KHR_xlib_surface].m_supported)
{
+ BGFX_FATAL(NULL != vkCreateXlibSurfaceKHR, Fatal::UnableToInitialize, "vkCreateXlibSurfaceKHR == 0")
+ BX_TRACE("Attempting Xlib surface creation.");
VkXlibSurfaceCreateInfoKHR sci;
sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
sci.pNext = NULL;
@@ -6788,7 +6816,7 @@ VK_DESTROY
result = vkCreateXlibSurfaceKHR(instance, &sci, allocatorCb, &m_surface);
}
- if (VK_SUCCESS != result)
+ if (VK_SUCCESS != result && s_extension[Extension::KHR_xcb_surface].m_supported)
{
void* xcbdll = bx::dlopen("libX11-xcb.so.1");
@@ -6800,6 +6828,8 @@ VK_DESTROY
union { void* ptr; xcb_window_t window; } cast = { m_nwh };
+ BGFX_FATAL(NULL != vkCreateXcbSurfaceKHR, Fatal::UnableToInitialize, "vkCreateXcbSurfaceKHR == 0")
+
VkXcbSurfaceCreateInfoKHR sci;
sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
sci.pNext = NULL;
@@ -6932,6 +6962,15 @@ VK_DESTROY
, surfaceCapabilities.minImageExtent.height
, surfaceCapabilities.maxImageExtent.height
);
+ if (width != m_resolution.width || height != m_resolution.height)
+ {
+ BX_TRACE("Clamped swapchain resolution from %dx%d to %dx%d"
+ , m_resolution.width
+ , m_resolution.height
+ , width
+ , height
+ );
+ }
VkCompositeAlphaFlagBitsKHR compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
@@ -7052,6 +7091,8 @@ VK_DESTROY
m_backBufferColorImageLayout[ii] = VK_IMAGE_LAYOUT_UNDEFINED;
}
+ BX_TRACE("Succesfully created swapchain (%dx%d) with %d images.", width, height, m_numSwapChainImages);
+
VkSemaphoreCreateInfo sci;
sci.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
sci.pNext = NULL;
@@ -7071,7 +7112,7 @@ VK_DESTROY
m_currentSemaphore = 0;
m_needPresent = false;
- m_needToRefreshSwapchain = false;
+ m_needToRecreateSwapchain = false;
return result;
}
@@ -7373,7 +7414,7 @@ VK_DESTROY
bool SwapChainVK::acquire(VkCommandBuffer _commandBuffer)
{
if (VK_NULL_HANDLE == m_swapchain
- || m_needToRefreshSwapchain)
+ || m_needToRecreateSwapchain)
{
return false;
}
@@ -7395,6 +7436,11 @@ VK_DESTROY
, &m_backBufferColorIdx
);
+ if (result != VK_SUCCESS)
+ {
+ BX_TRACE("vkAcquireNextImageKHR(...): result = %s", getName(result));
+ }
+
switch (result)
{
case VK_SUCCESS:
@@ -7402,11 +7448,12 @@ VK_DESTROY
case VK_ERROR_SURFACE_LOST_KHR:
m_needToRecreateSurface = true;
- BX_FALLTHROUGH;
+ m_needToRecreateSwapchain = true;
+ return false;
case VK_ERROR_OUT_OF_DATE_KHR:
case VK_SUBOPTIMAL_KHR:
- m_needToRefreshSwapchain = true;
+ m_needToRecreateSwapchain = true;
return false;
default:
@@ -7448,16 +7495,22 @@ VK_DESTROY
pi.pImageIndices = &m_backBufferColorIdx;
pi.pResults = NULL;
VkResult result = vkQueuePresentKHR(m_queue, &pi);
+
+ if (result != VK_SUCCESS)
+ {
+ BX_TRACE("vkQueuePresentKHR(...): result = %s", getName(result));
+ }
switch (result)
{
case VK_ERROR_SURFACE_LOST_KHR:
m_needToRecreateSurface = true;
- BX_FALLTHROUGH;
+ m_needToRecreateSwapchain = true;
+ break;
case VK_ERROR_OUT_OF_DATE_KHR:
case VK_SUBOPTIMAL_KHR:
- m_needToRefreshSwapchain = true;
+ m_needToRecreateSwapchain = true;
break;
default:
@@ -7615,8 +7668,10 @@ VK_DESTROY
{
m_swapChain.update(_commandBuffer, m_nwh, _resolution);
VK_CHECK(s_renderVK->getRenderPass(m_swapChain, &m_renderPass) );
- m_width = _resolution.width;
- m_height = _resolution.height;
+ // Don't believe the passed Resolution, as the Vulkan driver might have
+ // specified another resolution, which we had to obey.
+ m_width = m_swapChain.m_sci.imageExtent.width;
+ m_height = m_swapChain.m_sci.imageExtent.height;
m_sampler = m_swapChain.m_sampler;
}
@@ -8275,12 +8330,26 @@ VK_DESTROY
if (isFrameBufferValid)
{
viewState.m_rect = _render->m_view[view].m_rect;
- const Rect& rect = _render->m_view[view].m_rect;
- const Rect& scissorRect = _render->m_view[view].m_scissor;
+ Rect rect = _render->m_view[view].m_rect;
+ Rect scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
viewScissorRect = viewHasScissor ? scissorRect : rect;
restoreScissor = false;
+ // Clamp the rect to what's valid according to Vulkan.
+ rect.m_width = bx::min(rect.m_width, fb.m_width - rect.m_x);
+ rect.m_height = bx::min(rect.m_height, fb.m_height - rect.m_y);
+ if (_render->m_view[view].m_rect.m_width != rect.m_width
+ || _render->m_view[view].m_rect.m_height != rect.m_height)
+ {
+ BX_TRACE("Clamp render pass from %dx%d to %dx%d"
+ , _render->m_view[view].m_rect.m_width
+ , _render->m_view[view].m_rect.m_height
+ , rect.m_width
+ , rect.m_height
+ );
+ }
+
rpbi.framebuffer = fb.m_currentFramebuffer;
rpbi.renderPass = fb.m_renderPass;
rpbi.renderArea.offset.x = rect.m_x;
diff --git a/3rdparty/bgfx/src/renderer_vk.h b/3rdparty/bgfx/src/renderer_vk.h
index fdd51301ea0..1852ed83123 100644
--- a/3rdparty/bgfx/src/renderer_vk.h
+++ b/3rdparty/bgfx/src/renderer_vk.h
@@ -8,31 +8,19 @@
#if BX_PLATFORM_ANDROID
# define VK_USE_PLATFORM_ANDROID_KHR
-# define KHR_SURFACE_EXTENSION_NAME VK_KHR_ANDROID_SURFACE_EXTENSION_NAME
# define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_ANDROID
#elif BX_PLATFORM_LINUX
-# if defined(WL_EGL_PLATFORM)
-# define VK_USE_PLATFORM_WAYLAND_KHR
-# endif // defined(WL_EGL_PLATFORM)
+# define VK_USE_PLATFORM_WAYLAND_KHR
# define VK_USE_PLATFORM_XLIB_KHR
# define VK_USE_PLATFORM_XCB_KHR
-# if defined(WL_EGL_PLATFORM)
-# define KHR_SURFACE_EXTENSION_NAME VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, \
- VK_KHR_XCB_SURFACE_EXTENSION_NAME
-# else
-# define KHR_SURFACE_EXTENSION_NAME VK_KHR_XCB_SURFACE_EXTENSION_NAME
-# endif // defined(WL_EGL_PLATFORM)
# define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_LINUX
#elif BX_PLATFORM_WINDOWS
# define VK_USE_PLATFORM_WIN32_KHR
-# define KHR_SURFACE_EXTENSION_NAME VK_KHR_WIN32_SURFACE_EXTENSION_NAME
# define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_WINDOWS
#elif BX_PLATFORM_OSX
# define VK_USE_PLATFORM_MACOS_MVK
-# define KHR_SURFACE_EXTENSION_NAME VK_MVK_MACOS_SURFACE_EXTENSION_NAME
# define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_MACOS
#else
-# define KHR_SURFACE_EXTENSION_NAME ""
# define VK_IMPORT_INSTANCE_PLATFORM
#endif // BX_PLATFORM_*
@@ -69,7 +57,6 @@
/* VK_KHR_android_surface */ \
VK_IMPORT_INSTANCE_FUNC(true, vkCreateAndroidSurfaceKHR); \
-#if defined(WL_EGL_PLATFORM)
#define VK_IMPORT_INSTANCE_LINUX \
/* VK_KHR_wayland_surface */ \
VK_IMPORT_INSTANCE_FUNC(true, vkCreateWaylandSurfaceKHR); \
@@ -81,17 +68,6 @@
VK_IMPORT_INSTANCE_FUNC(true, vkCreateXcbSurfaceKHR); \
VK_IMPORT_INSTANCE_FUNC(true, vkGetPhysicalDeviceXcbPresentationSupportKHR); \
-#else
-#define VK_IMPORT_INSTANCE_LINUX \
- /* VK_KHR_xlib_surface */ \
- VK_IMPORT_INSTANCE_FUNC(true, vkCreateXlibSurfaceKHR); \
- VK_IMPORT_INSTANCE_FUNC(true, vkGetPhysicalDeviceXlibPresentationSupportKHR); \
- /* VK_KHR_xcb_surface */ \
- VK_IMPORT_INSTANCE_FUNC(true, vkCreateXcbSurfaceKHR); \
- VK_IMPORT_INSTANCE_FUNC(true, vkGetPhysicalDeviceXcbPresentationSupportKHR); \
-
-#endif // defined(WL_EGL_PLATFORM)
-
#define VK_IMPORT_INSTANCE_WINDOWS \
/* VK_KHR_win32_surface */ \
VK_IMPORT_INSTANCE_FUNC(true, vkCreateWin32SurfaceKHR); \
@@ -762,7 +738,7 @@ VK_DESTROY_FUNC(DescriptorSet);
VkSemaphore m_lastImageAcquiredSemaphore;
bool m_needPresent;
- bool m_needToRefreshSwapchain;
+ bool m_needToRecreateSwapchain;
bool m_needToRecreateSurface;
TextureVK m_backBufferDepthStencil;
diff --git a/3rdparty/bgfx/src/shader_spirv.cpp b/3rdparty/bgfx/src/shader_spirv.cpp
index 739256546be..2143641a0c4 100644
--- a/3rdparty/bgfx/src/shader_spirv.cpp
+++ b/3rdparty/bgfx/src/shader_spirv.cpp
@@ -17,7 +17,7 @@ namespace bgfx
#define SPV_OPERAND_7(_a0, _a1, _a2, _a3, _a4, _a5, _a6) SPV_OPERAND_1(_a0), SPV_OPERAND_6(_a1, _a2, _a3, _a4, _a5, _a6)
#define SPV_OPERAND_8(_a0, _a1, _a2, _a3, _a4, _a5, _a6, _a7) SPV_OPERAND_1(_a0), SPV_OPERAND_7(_a1, _a2, _a3, _a4, _a5, _a6, _a7)
#define SPV_OPERAND_9(_a0, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) SPV_OPERAND_1(_a0), SPV_OPERAND_8(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8)
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC && (!defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL)
// Workaround MSVS bug...
# define SPV_OPERAND(...) { BX_MACRO_DISPATCHER(SPV_OPERAND_, __VA_ARGS__) BX_VA_ARGS_PASS(__VA_ARGS__) }
#else
diff --git a/3rdparty/bx/include/bx/macros.h b/3rdparty/bx/include/bx/macros.h
index dab1ba7013a..61401af8650 100644
--- a/3rdparty/bx/include/bx/macros.h
+++ b/3rdparty/bx/include/bx/macros.h
@@ -11,7 +11,7 @@
#define BX_MACROS_H_HEADER_GUARD
///
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC && (!defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL)
// Workaround MSVS bug...
# define BX_VA_ARGS_PASS(...) BX_VA_ARGS_PASS_1_ __VA_ARGS__ BX_VA_ARGS_PASS_2_
# define BX_VA_ARGS_PASS_1_ (
@@ -145,7 +145,7 @@
#define BX_UNUSED_11(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11) BX_UNUSED_10(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10); BX_UNUSED_1(_a11)
#define BX_UNUSED_12(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11, _a12) BX_UNUSED_11(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11); BX_UNUSED_1(_a12)
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC && (!defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL)
// Workaround MSVS bug...
# define BX_UNUSED(...) BX_MACRO_DISPATCHER(BX_UNUSED_, __VA_ARGS__) BX_VA_ARGS_PASS(__VA_ARGS__)
#else
@@ -226,7 +226,7 @@
#define BX_CLASS_3(_class, _a1, _a2, _a3) BX_CLASS_2(_class, _a1, _a2); BX_CLASS_1(_class, _a3)
#define BX_CLASS_4(_class, _a1, _a2, _a3, _a4) BX_CLASS_3(_class, _a1, _a2, _a3); BX_CLASS_1(_class, _a4)
-#if BX_COMPILER_MSVC
+#if BX_COMPILER_MSVC && (!defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL)
# define BX_CLASS(_class, ...) BX_MACRO_DISPATCHER(BX_CLASS_, __VA_ARGS__) BX_VA_ARGS_PASS(_class, __VA_ARGS__)
#else
# define BX_CLASS(_class, ...) BX_MACRO_DISPATCHER(BX_CLASS_, __VA_ARGS__)(_class, __VA_ARGS__)
diff --git a/3rdparty/bx/scripts/toolchain.lua b/3rdparty/bx/scripts/toolchain.lua
index 964e58e3793..9680c179443 100644
--- a/3rdparty/bx/scripts/toolchain.lua
+++ b/3rdparty/bx/scripts/toolchain.lua
@@ -386,6 +386,7 @@ function toolchain(_buildDir, _libDir)
elseif _ACTION == "vs2017"
or _ACTION == "vs2019"
or _ACTION == "vs2022"
+ or _ACTION == "vs2026"
then
local action = premake.action.current()
diff --git a/3rdparty/bx/src/mutex.cpp b/3rdparty/bx/src/mutex.cpp
index 0ef8597a8aa..9e5845935b1 100644
--- a/3rdparty/bx/src/mutex.cpp
+++ b/3rdparty/bx/src/mutex.cpp
@@ -10,15 +10,7 @@
#if BX_CRT_NONE
# include <bx/cpu.h>
# include "crt0.h"
-#elif BX_PLATFORM_ANDROID \
- || BX_PLATFORM_BSD \
- || BX_PLATFORM_HAIKU \
- || BX_PLATFORM_LINUX \
- || BX_PLATFORM_IOS \
- || BX_PLATFORM_OSX \
- || BX_PLATFORM_PS4 \
- || BX_PLATFORM_RPI \
- || BX_PLATFORM_NX
+#elif BX_PLATFORM_POSIX
# include <pthread.h>
#elif BX_PLATFORM_WINDOWS \
|| BX_PLATFORM_WINRT \
diff --git a/3rdparty/bx/src/os.cpp b/3rdparty/bx/src/os.cpp
index 99394579b72..917b02e8c5a 100644
--- a/3rdparty/bx/src/os.cpp
+++ b/3rdparty/bx/src/os.cpp
@@ -19,17 +19,7 @@
# endif // WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <psapi.h>
-#elif BX_PLATFORM_ANDROID \
- || BX_PLATFORM_BSD \
- || BX_PLATFORM_EMSCRIPTEN \
- || BX_PLATFORM_HAIKU \
- || BX_PLATFORM_HURD \
- || BX_PLATFORM_IOS \
- || BX_PLATFORM_LINUX \
- || BX_PLATFORM_NX \
- || BX_PLATFORM_OSX \
- || BX_PLATFORM_PS4 \
- || BX_PLATFORM_RPI
+#elif BX_PLATFORM_POSIX
# include <sched.h> // sched_yield
# if BX_PLATFORM_BSD \
|| BX_PLATFORM_HAIKU \
@@ -58,7 +48,7 @@
# include <mach/mach.h> // mach_task_basic_info
# elif BX_PLATFORM_HURD
# include <stdio.h> // fopen
-# include <pthread/pthread.h> // pthread_self
+# include <pthread.h> // pthread_self
# elif BX_PLATFORM_ANDROID
# include "debug.h" // getTid is not implemented...
# endif // BX_PLATFORM_ANDROID
diff --git a/3rdparty/bx/src/thread.cpp b/3rdparty/bx/src/thread.cpp
index f5e5f81bc21..162d4cafaf0 100644
--- a/3rdparty/bx/src/thread.cpp
+++ b/3rdparty/bx/src/thread.cpp
@@ -14,22 +14,11 @@
#if BX_CRT_NONE
# include "crt0.h"
-#elif BX_PLATFORM_ANDROID \
- || BX_PLATFORM_BSD \
- || BX_PLATFORM_HAIKU \
- || BX_PLATFORM_LINUX \
- || BX_PLATFORM_IOS \
- || BX_PLATFORM_OSX \
- || BX_PLATFORM_PS4 \
- || BX_PLATFORM_RPI \
- || BX_PLATFORM_NX
+#elif BX_PLATFORM_POSIX
# include <pthread.h>
# if BX_PLATFORM_BSD
# include <pthread_np.h>
# endif // BX_PLATFORM_BSD
-# if BX_PLATFORM_LINUX && (BX_CRT_GLIBC < 21200)
-# include <sys/prctl.h>
-# endif // BX_PLATFORM_
#elif BX_PLATFORM_WINDOWS \
|| BX_PLATFORM_WINRT \
|| BX_PLATFORM_XBOXONE \
@@ -250,7 +239,7 @@ namespace bx
#elif BX_PLATFORM_OSX \
|| BX_PLATFORM_IOS
pthread_setname_np(_name);
-#elif (BX_CRT_GLIBC >= 21200) && ! BX_PLATFORM_HURD
+#elif BX_CRT_GLIBC && ! BX_PLATFORM_HURD
pthread_setname_np(ti->m_handle, _name);
#elif BX_PLATFORM_LINUX
prctl(PR_SET_NAME,_name, 0, 0, 0);
diff --git a/3rdparty/expat/CMake.README b/3rdparty/expat/CMake.README
index aa098b4f942..ba202e7a446 100644
--- a/3rdparty/expat/CMake.README
+++ b/3rdparty/expat/CMake.README
@@ -3,25 +3,25 @@
The cmake based buildsystem for expat works on Windows (cygwin, mingw, Visual
Studio) and should work on all other platform cmake supports.
-Assuming ~/expat-2.2.10 is the source directory of expat, add a subdirectory
+Assuming ~/expat-2.7.1 is the source directory of expat, add a subdirectory
build and change into that directory:
-~/expat-2.2.10$ mkdir build && cd build
-~/expat-2.2.10/build$
+~/expat-2.7.1$ mkdir build && cd build
+~/expat-2.7.1/build$
From that directory, call cmake first, then call make, make test and
make install in the usual way:
-~/expat-2.2.10/build$ cmake ..
+~/expat-2.7.1/build$ cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
....
-- Configuring done
-- Generating done
--- Build files have been written to: /home/patrick/expat-2.2.10/build
+-- Build files have been written to: /home/patrick/expat-2.7.1/build
If you want to specify the install location for your files, append
-DCMAKE_INSTALL_PREFIX=/your/install/path to the cmake call.
-~/expat-2.2.10/build$ make && make test && make install
+~/expat-2.7.1/build$ make && make test && make install
Scanning dependencies of target expat
[ 5%] Building C object CMakeFiles/expat.dir/lib/xmlparse.c.o
[ 11%] Building C object CMakeFiles/expat.dir/lib/xmlrole.c.o
@@ -36,7 +36,7 @@ Visual Studio Command Prompt or when using mingw, you must open a cmd.exe and
make sure that gcc can be called. On Windows, you also might want to specify a
special Generator for CMake:
for Visual Studio builds do:
-cmake .. -G "Visual Studio 15 2017" && msbuild /m expat.sln
+cmake .. -G "Visual Studio 16 2019" && msbuild /m expat.sln
for mingw builds do:
cmake .. -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=D:\expat-install
&& gmake && gmake install
diff --git a/3rdparty/expat/CMakeLists.txt b/3rdparty/expat/CMakeLists.txt
index dfbd0c5943b..4a5ea2b5847 100644
--- a/3rdparty/expat/CMakeLists.txt
+++ b/3rdparty/expat/CMakeLists.txt
@@ -1,44 +1,53 @@
-# This file is copyrighted under the BSD-license for buildsystem files of KDE
-# copyright 2010, Patrick Spendrin <ps_ml@gmx.de>
-
-cmake_minimum_required(VERSION 3.1.3)
-
-# This allows controlling documented build time switches
-# when Expat is pulled in using the add_subdirectory function, e.g.
-#
-# set(EXPAT_BUILD_DOCS OFF)
-# set(EXPAT_BUILD_TOOLS OFF)
-# add_subdirectory(${expat_SOURCE_DIR}/expat ${expat_BINARY_DIR})
-#
-# would disable compilation of the xmlwf CLI and its man page.
-# Without activating behaviour NEW for policy CMP0077 here,
-# a user with -Wdev enabled would see warning
-#
-# Policy CMP0077 is not set: option() honors normal variables. Run "cmake
-# --help-policy CMP0077" for policy details. Use the cmake_policy command to
-# set the policy and suppress this warning.
-#
-# For compatibility with older versions of CMake, option is clearing the
-# normal variable 'EXPAT_BUILD_DOCS'.
+# __ __ _
+# ___\ \/ /_ __ __ _| |_
+# / _ \\ /| '_ \ / _` | __|
+# | __// \| |_) | (_| | |_
+# \___/_/\_\ .__/ \__,_|\__|
+# |_| XML parser
#
-# and effectively not be able to adjust option EXPAT_BUILD_DOCS.
-#
-# For more details please see:
-# - https://cmake.org/cmake/help/latest/policy/CMP0077.html
-# - https://github.com/libexpat/libexpat/pull/419
-#
-if(POLICY CMP0077)
- cmake_policy(SET CMP0077 NEW)
-endif()
+# Copyright (c) 2010 Patrick Spendrin <ps_ml@gmx.de>
+# Copyright (c) 2012 Karl Waclawek <karl@waclawek.net>
+# Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2016 Sergei Nikulov <sergey.nikulov@gmail.com>
+# Copyright (c) 2016 Björn Lindahl <bjorn.lindahl@foi.se>
+# Copyright (c) 2016 Tobias Taschner <github@tc84.de>
+# Copyright (c) 2016 Ben Boeckel <ben.boeckel@kitware.com>
+# Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+# Copyright (c) 2017 Rolf Eike Beer <eike@sf-mail.de>
+# Copyright (c) 2017 Stephen Groat <stephen@groat.us>
+# Copyright (c) 2017 Franek Korta <fkorta@gmail.com>
+# Copyright (c) 2018 pedro-vicente <pedro.vicente@space-research.org>
+# Copyright (c) 2018 Frank Rast <frank.rast@gefeg.com>
+# Copyright (c) 2018 userwithuid <userwithuid@gmail.com>
+# Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
+# Copyright (c) 2019 Kishore Kunche <kishore.kunche@intel.com>
+# Copyright (c) 2019 xantares <xantares09@hotmail.com>
+# Copyright (c) 2019 Mohammed Khajapasha <mohammed.khajapasha@intel.com>
+# Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+# Copyright (c) 2019 Bhargava Shastry <bhargava.shastry@ethereum.org>
+# Copyright (c) 2020 Maciej Sroczyński <macieksroczynski@poczta.fm>
+# Copyright (c) 2020 Gulliver <gulliver@traumkristalle.net>
+# Copyright (c) 2020 Thomas Beutlich <tc@tbeu.de>
+# Copyright (c) 2021 Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>
+# Copyright (c) 2022 Johnny Jazeix <jazeix@gmail.com>
+# Copyright (c) 2022 Mark Brand <markbrand@google.com>
+# Copyright (c) 2022 David Faure <david.faure@kdab.com>
+# Unlike most of Expat,
+# this file is copyrighted under the BSD-license for buildsystem files of KDE.
+
+cmake_minimum_required(VERSION 3.13.0)
project(expat
VERSION
- 2.2.10
+ 2.7.1
LANGUAGES
C
)
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_C_EXTENSIONS OFF) # i.e. -std=c99 rather than default -std=gnu99
-set(PACKAGE_BUGREPORT "expat-bugs@libexpat.org")
+set(PACKAGE_BUGREPORT "https://github.com/libexpat/libexpat/issues")
set(PACKAGE_NAME "expat")
set(PACKAGE_VERSION "${PROJECT_VERSION}")
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
@@ -48,11 +57,6 @@ include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
#
-# Detect use by means of add_subdirectory
-#
-get_directory_property(_EXPAT_PARENT_DIRECTORY PARENT_DIRECTORY)
-
-#
# Configuration defaults
#
if(WINCE)
@@ -75,51 +79,118 @@ if(MSVC)
else()
set(_EXPAT_BUILD_PKGCONFIG_DEFAULT ON)
endif()
+if(DEFINED BUILD_SHARED_LIBS)
+ set(_EXPAT_SHARED_LIBS_DEFAULT ${BUILD_SHARED_LIBS})
+else()
+ set(_EXPAT_SHARED_LIBS_DEFAULT ON)
+endif()
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE NoConfig) # so that accessing EXPAT_*_POSTFIX will be waterproof
+endif()
+string(TOUPPER "${CMAKE_BUILD_TYPE}" _EXPAT_BUILD_TYPE_UPPER)
#
# Configuration
#
-option(EXPAT_BUILD_TOOLS "build the xmlwf tool for expat library" ${_EXPAT_BUILD_TOOLS_DEFAULT})
-option(EXPAT_BUILD_EXAMPLES "build the examples for expat library" ON)
-option(EXPAT_BUILD_TESTS "build the tests for expat library" ON)
-option(EXPAT_SHARED_LIBS "build a shared expat library" ON)
-option(EXPAT_BUILD_DOCS "build man page for xmlwf" ${_EXPAT_BUILD_DOCS_DEFAULT})
-option(EXPAT_BUILD_FUZZERS "build fuzzers for the expat library" OFF)
-option(EXPAT_BUILD_PKGCONFIG "build pkg-config file" ${_EXPAT_BUILD_PKGCONFIG_DEFAULT})
-option(EXPAT_OSSFUZZ_BUILD "build fuzzers via ossfuzz for the expat library" OFF)
+
+macro(expat_shy_set var default cache type desc)
+ # Macro expat_shy_set came into life because:
+ # - Expat was previously using an inconsistent mix of CMake's native set()
+ # and option() to define public build time options.
+ # - option() is more friendly than set() with regard to configuring an
+ # external project that is pulled in by means of add_subdirectory() --
+ # see comments in issue #597 -- so we wanted to get away from set().
+ # - option() auto-converts non-bool values to bool when writing to the CMake
+ # cache, so we needed something that supports non-bool better and hence
+ # wanted to get away from plain option(), too.
+ #
+ # As a result, this function serves as a hybrid between CMake's regular set()
+ # and option(): from set() it takes support for non-bool types and the function
+ # name and signature whereas from option() (with policy CMP0077 mode NEW) it
+ # takes being shy when a value has previously been defined for that variable.
+ #
+ # So that resolves all need for set(.. FORCE) when pulling in Expat by means of
+ # add_subdirectory().
+ #
+ if(NOT ${cache} STREQUAL "CACHE")
+ message(SEND_ERROR "Macro usage is: expat_shy_set(var default CACHE type desc)")
+ endif()
+
+ if(DEFINED ${var})
+ # NOTE: The idea is to (ideally) only add to the cache if
+ # there is no cache entry, yet. "if(DEFINED CACHE{var})"
+ # requires CMake >=3.14.
+ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.14" AND NOT DEFINED "CACHE{${var}}")
+ set("${var}" "${${var}}" CACHE "${type}" "${desc}")
+ endif()
+ else()
+ set("${var}" "${default}" CACHE "${type}" "${desc}")
+ endif()
+endmacro()
+
+expat_shy_set(EXPAT_BUILD_TOOLS ${_EXPAT_BUILD_TOOLS_DEFAULT} CACHE BOOL "Build the xmlwf tool for expat library")
+expat_shy_set(EXPAT_BUILD_EXAMPLES ON CACHE BOOL "Build the examples for expat library")
+expat_shy_set(EXPAT_BUILD_TESTS ON CACHE BOOL "Build the tests for expat library")
+expat_shy_set(EXPAT_SHARED_LIBS ${_EXPAT_SHARED_LIBS_DEFAULT} CACHE BOOL "Build a shared expat library")
+expat_shy_set(EXPAT_BUILD_DOCS ${_EXPAT_BUILD_DOCS_DEFAULT} CACHE BOOL "Build man page for xmlwf")
+expat_shy_set(EXPAT_BUILD_FUZZERS OFF CACHE BOOL "Build fuzzers for the expat library")
+expat_shy_set(EXPAT_BUILD_PKGCONFIG ${_EXPAT_BUILD_PKGCONFIG_DEFAULT} CACHE BOOL "Build pkg-config file")
+expat_shy_set(EXPAT_OSSFUZZ_BUILD OFF CACHE BOOL "Build fuzzers via OSS-Fuzz for the expat library")
if(UNIX OR _EXPAT_HELP)
- option(EXPAT_WITH_LIBBSD "utilize libbsd (for arc4random_buf)" OFF)
+ expat_shy_set(EXPAT_WITH_LIBBSD OFF CACHE BOOL "Utilize libbsd (for arc4random_buf)")
endif()
-option(EXPAT_ENABLE_INSTALL "install expat files in cmake install target" ON)
-set(EXPAT_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point")
+expat_shy_set(EXPAT_ENABLE_INSTALL ON CACHE BOOL "Install expat files in cmake install target")
+expat_shy_set(EXPAT_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point, 0 to disable")
mark_as_advanced(EXPAT_CONTEXT_BYTES)
-option(EXPAT_DTD "Define to make parameter entity parsing functionality available" ON)
+expat_shy_set(EXPAT_DTD ON CACHE BOOL "Define to make parameter entity parsing functionality available")
mark_as_advanced(EXPAT_DTD)
-option(EXPAT_NS "Define to make XML Namespaces functionality available" ON)
+expat_shy_set(EXPAT_GE ON CACHE BOOL "Define to make general entity parsing functionality available")
+mark_as_advanced(EXPAT_GE)
+expat_shy_set(EXPAT_NS ON CACHE BOOL "Define to make XML Namespaces functionality available")
mark_as_advanced(EXPAT_NS)
-option(EXPAT_WARNINGS_AS_ERRORS "Treat all compiler warnings as errors" OFF)
+expat_shy_set(EXPAT_WARNINGS_AS_ERRORS OFF CACHE BOOL "Treat all compiler warnings as errors")
if(UNIX OR _EXPAT_HELP)
- option(EXPAT_DEV_URANDOM "Define to include code reading entropy from `/dev/urandom'." ON)
- set(EXPAT_WITH_GETRANDOM "AUTO" CACHE STRING
- "Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]")
- set(EXPAT_WITH_SYS_GETRANDOM "AUTO" CACHE STRING
- "Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]")
+ expat_shy_set(EXPAT_DEV_URANDOM ON CACHE BOOL "Define to include code reading entropy from `/dev/urandom'.")
+ expat_shy_set(EXPAT_WITH_GETRANDOM "AUTO" CACHE STRING "Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]")
+ expat_shy_set(EXPAT_WITH_SYS_GETRANDOM "AUTO" CACHE STRING "Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]")
mark_as_advanced(EXPAT_DEV_URANDOM)
endif()
-set(EXPAT_CHAR_TYPE "char" CACHE STRING "Character type to use (char|ushort|wchar_t) [default=char]")
-option(EXPAT_ATTR_INFO "Define to allow retrieving the byte offsets for attribute names and values" OFF)
+expat_shy_set(EXPAT_CHAR_TYPE "char" CACHE STRING "Character type to use (char|ushort|wchar_t) [default=char]")
+expat_shy_set(EXPAT_ATTR_INFO OFF CACHE BOOL "Define to allow retrieving the byte offsets for attribute names and values")
mark_as_advanced(EXPAT_ATTR_INFO)
-option(EXPAT_LARGE_SIZE "Make XML_GetCurrent* functions return <(unsigned) long long> rather than <(unsigned) long>" OFF)
+expat_shy_set(EXPAT_LARGE_SIZE OFF CACHE BOOL "Make XML_GetCurrent* functions return <(unsigned) long long> rather than <(unsigned) long>")
mark_as_advanced(EXPAT_LARGE_SIZE)
-option(EXPAT_MIN_SIZE "Get a smaller (but slower) parser (in particular avoid multiple copies of the tokenizer)" OFF)
+expat_shy_set(EXPAT_MIN_SIZE OFF CACHE BOOL "Get a smaller (but slower) parser (in particular avoid multiple copies of the tokenizer)")
mark_as_advanced(EXPAT_MIN_SIZE)
if(MSVC OR _EXPAT_HELP)
- set(EXPAT_MSVC_STATIC_CRT OFF CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC")
+ expat_shy_set(EXPAT_MSVC_STATIC_CRT OFF CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC")
+endif()
+if(NOT _EXPAT_HELP)
+ expat_shy_set(_EXPAT_M32 OFF CACHE BOOL "(Unofficial!) Produce 32bit code with -m32")
+ mark_as_advanced(_EXPAT_M32)
+endif()
+
+if(EXPAT_BUILD_TESTS OR EXPAT_BUILD_FUZZERS)
+ # We have to call enable_language() before modifying any CMAKE_CXX_* variables
+ enable_language(CXX)
+
+ if (EXPAT_BUILD_FUZZERS)
+ set(CMAKE_CXX_STANDARD 17) # for std::string_view for Abseil for libprotobuf-mutator
+ else()
+ set(CMAKE_CXX_STANDARD 11)
+ endif()
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+ set(CMAKE_CXX_EXTENSIONS OFF) # i.e. -std=c++11 rather than default -std=gnu++11
endif()
#
# Environment checks
#
+if(EXPAT_DTD AND NOT EXPAT_GE)
+ message(SEND_ERROR "Option EXPAT_DTD requires that EXPAT_GE is also enabled.")
+ message(SEND_ERROR "Please either enable option EXPAT_GE (recommended) or disable EXPAT_DTD also.")
+endif()
+
if(EXPAT_WITH_LIBBSD)
find_library(LIB_BSD NAMES bsd)
if(NOT LIB_BSD)
@@ -129,6 +200,26 @@ if(EXPAT_WITH_LIBBSD)
endif()
endif()
+if(MSVC)
+ # For the three types of MSVC version values, please see:
+ # - https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html
+ # - https://sourceforge.net/p/predef/wiki/Compilers/
+ # - https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#History
+ set(_EXPAT_MSVC_REQUIRED_INT 1800) # i.e. 12.0/2013/1800; see PR #426
+ set(_EXPAT_MSVC_SUPPORTED_INT 1920)
+ set(_EXPAT_MSVC_SUPPORTED_DISPLAY "Visual Studio 16.0/2019/${_EXPAT_MSVC_SUPPORTED_INT}")
+
+ if(MSVC_VERSION VERSION_LESS ${_EXPAT_MSVC_SUPPORTED_INT})
+ if(MSVC_VERSION VERSION_LESS ${_EXPAT_MSVC_REQUIRED_INT})
+ message(SEND_ERROR "MSVC_VERSION ${MSVC_VERSION} is TOO OLD to compile Expat without errors.")
+ message(SEND_ERROR "Please use officially supported ${_EXPAT_MSVC_SUPPORTED_DISPLAY} or later. Thank you!")
+ else()
+ message(WARNING "MSVC_VERSION ${MSVC_VERSION} is NOT OFFICIALLY SUPPORTED by Expat.")
+ message(WARNING "Please use ${_EXPAT_MSVC_SUPPORTED_DISPLAY} or later. Thank you!")
+ endif()
+ endif()
+endif()
+
macro(_expat_copy_bool_int source_ref dest_ref)
if(${source_ref})
set(${dest_ref} 1)
@@ -202,12 +293,16 @@ endif()
_expat_copy_bool_int(EXPAT_ATTR_INFO XML_ATTR_INFO)
_expat_copy_bool_int(EXPAT_DTD XML_DTD)
+_expat_copy_bool_int(EXPAT_GE XML_GE)
_expat_copy_bool_int(EXPAT_LARGE_SIZE XML_LARGE_SIZE)
_expat_copy_bool_int(EXPAT_MIN_SIZE XML_MIN_SIZE)
_expat_copy_bool_int(EXPAT_NS XML_NS)
if(NOT WIN32)
_expat_copy_bool_int(EXPAT_DEV_URANDOM XML_DEV_URANDOM)
endif()
+if(NOT EXPAT_CONTEXT_BYTES GREATER 0) # in particular with -DEXPAT_CONTEXT_BYTES=OFF
+ set(EXPAT_CONTEXT_BYTES 0)
+endif()
set(XML_CONTEXT_BYTES ${EXPAT_CONTEXT_BYTES})
macro(expat_install)
@@ -217,7 +312,6 @@ macro(expat_install)
endmacro()
configure_file(expat_config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h")
-add_definitions(-DHAVE_EXPAT_CONFIG_H)
expat_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/expat_config.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
@@ -226,14 +320,24 @@ if(FLAG_NO_STRICT_ALIASING)
set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fno-strict-aliasing")
endif()
if(FLAG_VISIBILITY)
- add_definitions(-DXML_ENABLE_VISIBILITY=1)
+ if(EXPAT_SHARED_LIBS)
+ add_definitions(-DXML_ENABLE_VISIBILITY=1)
+ endif()
set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -fvisibility=hidden")
endif()
+if(MINGW AND ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU"))
+ # Without __USE_MINGW_ANSI_STDIO the compiler produces a false positive
+ set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Wno-pedantic-ms-format")
+endif()
if (EXPAT_WARNINGS_AS_ERRORS)
if(MSVC)
add_definitions(/WX)
else()
set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Werror")
+ if(MINGW)
+ # To avoid "error: unknown conversion type character ‘l’ in format [-Werror=format=]"
+ set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -Wno-format")
+ endif()
endif()
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_COMPILE_FLAGS}")
@@ -243,10 +347,12 @@ if (MSVC)
if (EXPAT_MSVC_STATIC_CRT)
message("-- Using static CRT ${EXPAT_MSVC_STATIC_CRT}")
foreach(flag_var
+ CMAKE_CXX_FLAGS_${_EXPAT_BUILD_TYPE_UPPER}
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO
+ CMAKE_C_FLAGS_${_EXPAT_BUILD_TYPE_UPPER}
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
@@ -257,43 +363,32 @@ if (MSVC)
endif()
endif()
+if(_EXPAT_M32 AND NOT MSVC)
+ foreach(flag_var
+ CMAKE_CXX_FLAGS_${_EXPAT_BUILD_TYPE_UPPER}
+ CMAKE_CXX_FLAGS_DEBUG
+ CMAKE_CXX_FLAGS_RELEASE
+ CMAKE_CXX_FLAGS_MINSIZEREL
+ CMAKE_CXX_FLAGS_RELWITHDEBINFO
+ CMAKE_C_FLAGS_${_EXPAT_BUILD_TYPE_UPPER}
+ CMAKE_C_FLAGS_DEBUG
+ CMAKE_C_FLAGS_RELEASE
+ CMAKE_C_FLAGS_MINSIZEREL
+ CMAKE_C_FLAGS_RELWITHDEBINFO
+ )
+ set(${flag_var} "${${flag_var}} -m32")
+ endforeach()
+endif()
+
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996)
endif()
-if(WIN32)
- if(_EXPAT_UNICODE_WCHAR_T)
- set(_POSTFIX_WIDE "w")
- endif()
-
- if(MSVC AND NOT EXPAT_SHARED_LIBS)
- if(EXPAT_MSVC_STATIC_CRT)
- set(_POSTFIX_CRT "MT")
- else()
- set(_POSTFIX_CRT "MD")
- endif()
- endif()
-
- foreach(postfix_var
- CMAKE_DEBUG_POSTFIX
- CMAKE_RELEASE_POSTFIX
- CMAKE_MINSIZEREL_POSTFIX
- CMAKE_RELWITHDEBINFO_POSTFIX
- )
- if(postfix_var STREQUAL "CMAKE_DEBUG_POSTFIX")
- set(_POSTFIX_DEBUG "d")
- else()
- set(_POSTFIX_DEBUG "")
- endif()
-
- set(${postfix_var} "${_POSTFIX_WIDE}${_POSTFIX_DEBUG}${_POSTFIX_CRT}" CACHE STRING "Windows binary postfix, e.g. libexpat<postfix=[w][d][MD|MT]>.lib")
- endforeach()
-endif()
#
# C library
#
-set(expat_SRCS
+set(_EXPAT_C_SOURCES
lib/xmlparse.c
lib/xmlrole.c
lib/xmltok.c
@@ -304,39 +399,116 @@ set(expat_SRCS
if(EXPAT_SHARED_LIBS)
set(_SHARED SHARED)
- if(MSVC)
- set(expat_SRCS ${expat_SRCS} lib/libexpat.def)
+ if(WIN32)
+ macro(_expat_def_file_toggle source_var target_var)
+ if(${source_var})
+ set(${target_var} " ") # i.e. not commented out, a single space
+ else()
+ set(${target_var} ";") # i.e. commented out
+ endif()
+ endmacro()
+
+ if(EXPAT_DTD OR EXPAT_GE)
+ set(_EXPAT_DTD_OR_GE TRUE)
+ else()
+ set(_EXPAT_DTD_OR_GE FALSE)
+ endif()
+
+ _expat_def_file_toggle(_EXPAT_DTD_OR_GE _EXPAT_COMMENT_DTD_OR_GE)
+ _expat_def_file_toggle(EXPAT_ATTR_INFO _EXPAT_COMMENT_ATTR_INFO)
+
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/lib/libexpat.def.cmake" "${CMAKE_CURRENT_BINARY_DIR}/lib/libexpat.def")
+ set(_EXPAT_EXTRA_SOURCES ${_EXPAT_EXTRA_SOURCES} "${CMAKE_CURRENT_BINARY_DIR}/lib/libexpat.def")
+
+ # Add DLL version
+ string(REPLACE "." "," _EXPAT_DLL_VERSION ${PROJECT_VERSION}.0)
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/win32/version.rc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/win32/version.rc")
+ set(_EXPAT_EXTRA_SOURCES ${_EXPAT_EXTRA_SOURCES} "${CMAKE_CURRENT_BINARY_DIR}/win32/version.rc")
endif()
else()
set(_SHARED STATIC)
endif()
-# Avoid colliding with Expat.dll of Perl's XML::Parser::Expat
-if(WIN32 AND NOT MINGW)
- set(_EXPAT_OUTPUT_NAME libexpat) # CMAKE_*_POSTFIX applies, see above
-else()
- if(_EXPAT_UNICODE)
- set(_EXPAT_OUTPUT_NAME expatw)
- else()
- set(_EXPAT_OUTPUT_NAME expat)
- endif()
+add_library(expat ${_SHARED} ${_EXPAT_C_SOURCES} ${_EXPAT_EXTRA_SOURCES})
+add_library(expat::expat ALIAS expat)
+if(_EXPAT_LIBM_FOUND)
+ target_link_libraries(expat m)
endif()
-
-add_library(expat ${_SHARED} ${expat_SRCS})
if(EXPAT_WITH_LIBBSD)
target_link_libraries(expat ${LIB_BSD})
endif()
-set(LIBCURRENT 7) # sync
-set(LIBREVISION 12) # with
-set(LIBAGE 6) # configure.ac!
+#
+# Library filename postfix
+#
+if(_EXPAT_UNICODE)
+ set(_POSTFIX_WIDE "w")
+endif()
+
+if(MSVC AND NOT EXPAT_SHARED_LIBS)
+ if(EXPAT_MSVC_STATIC_CRT)
+ set(_POSTFIX_CRT "MT")
+ else()
+ set(_POSTFIX_CRT "MD")
+ endif()
+endif()
+
+foreach(build_type_upper
+ ${_EXPAT_BUILD_TYPE_UPPER}
+ DEBUG
+ RELEASE
+ MINSIZEREL
+ RELWITHDEBINFO
+ )
+ if(WIN32 AND build_type_upper STREQUAL "DEBUG")
+ set(_POSTFIX_DEBUG "d")
+ else()
+ set(_POSTFIX_DEBUG "") # needs a reset because of being looped
+ endif()
+
+ expat_shy_set(EXPAT_${build_type_upper}_POSTFIX "${_POSTFIX_WIDE}${_POSTFIX_DEBUG}${_POSTFIX_CRT}" CACHE STRING "Library filename postfix for build type ${build_type_upper}; yields filenames libexpat<postfix=[w][d][MD|MT]>.(dll|dylib|lib|so)")
+ mark_as_advanced(EXPAT_${build_type_upper}_POSTFIX)
+ set_property(TARGET expat PROPERTY ${build_type_upper}_POSTFIX ${EXPAT_${build_type_upper}_POSTFIX})
+endforeach()
+
+set(LIBCURRENT 11) # sync
+set(LIBREVISION 2) # with
+set(LIBAGE 10) # configure.ac!
math(EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE}")
-set_property(TARGET expat PROPERTY OUTPUT_NAME "${_EXPAT_OUTPUT_NAME}")
if(NOT WIN32)
set_property(TARGET expat PROPERTY VERSION ${LIBCURRENT_MINUS_AGE}.${LIBAGE}.${LIBREVISION})
set_property(TARGET expat PROPERTY SOVERSION ${LIBCURRENT_MINUS_AGE})
set_property(TARGET expat PROPERTY NO_SONAME ${NO_SONAME})
+
+ if(APPLE)
+ if(NOT CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
+ message(FATAL_ERROR "Expat requires CMake >=3.17 on platform \"APPLE\".")
+ endif()
+
+ # NOTE: This intends to talk CMake into compatibility with GNU Libtool
+ math(EXPR _EXPAT_MACHO_COMPATIBILITY_VERSION "${LIBCURRENT} + 1")
+ set(_EXPAT_MACHO_CURRENT_VERSION "${_EXPAT_MACHO_COMPATIBILITY_VERSION}.${LIBREVISION}")
+ set_property(TARGET expat PROPERTY MACHO_COMPATIBILITY_VERSION ${_EXPAT_MACHO_COMPATIBILITY_VERSION})
+ set_property(TARGET expat PROPERTY MACHO_CURRENT_VERSION ${_EXPAT_MACHO_CURRENT_VERSION})
+ endif()
+endif()
+
+if(MINGW AND EXPAT_SHARED_LIBS)
+ set_target_properties(expat PROPERTIES SUFFIX "-${LIBCURRENT_MINUS_AGE}.dll")
+endif()
+
+if(WIN32 AND NOT MINGW)
+ # NOTE: This avoids a name collision with Expat.dll of Perl's XML::Parser::Expat
+ # on Windows by resorting to filename libexpat.dll since Expat 1.95.3.
+ # Everything but MSVC is already adding prefix "lib", automatically.
+ # NOTE: "set_property(TARGET expat PROPERTY PREFIX lib)" would only affect *.dll
+ # files but not *.lib files, so we have to rely on property OUTPUT_NAME, instead.
+ # Target property <CONFIG>_POSTFIX still applies.
+ set(_EXPAT_OUTPUT_NAME libexpat)
+ set_property(TARGET expat PROPERTY OUTPUT_NAME ${_EXPAT_OUTPUT_NAME})
+else()
+ set(_EXPAT_OUTPUT_NAME expat)
endif()
target_include_directories(expat
@@ -346,8 +518,8 @@ target_include_directories(expat
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
-if(NOT EXPAT_SHARED_LIBS AND WIN32)
- target_compile_definitions(expat PUBLIC -DXML_STATIC)
+if(WIN32 AND EXPAT_SHARED_LIBS)
+ target_compile_definitions(expat PRIVATE VER_FILEVERSION=${_EXPAT_DLL_VERSION})
endif()
expat_install(TARGETS expat EXPORT expat
@@ -361,12 +533,42 @@ expat_install(FILES lib/expat.h lib/expat_external.h DESTINATION ${CMAKE_INSTALL
# pkg-config file
#
if(EXPAT_BUILD_PKGCONFIG)
- set(prefix ${CMAKE_INSTALL_PREFIX})
- set(exec_prefix "\${prefix}")
- set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
- set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
- configure_file(expat.pc.in ${CMAKE_CURRENT_BINARY_DIR}/expat.pc @ONLY)
- expat_install(FILES ${CMAKE_CURRENT_BINARY_DIR}/expat.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+ if(CMAKE_INSTALL_LIBDIR MATCHES "^/")
+ set(_expat_pkgconfig_libdir "${CMAKE_INSTALL_LIBDIR}")
+ else()
+ set(_expat_pkgconfig_libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
+ endif()
+
+ if(CMAKE_INSTALL_INCLUDEDIR MATCHES "^/")
+ set(_expat_pkgconfig_includedir "${CMAKE_INSTALL_INCLUDEDIR}")
+ else()
+ set(_expat_pkgconfig_includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
+ endif()
+
+ set_target_properties(expat PROPERTIES
+ pkgconfig_prefix "${CMAKE_INSTALL_PREFIX}"
+ pkgconfig_exec_prefix "\${prefix}"
+ pkgconfig_libdir "${_expat_pkgconfig_libdir}"
+ pkgconfig_includedir "${_expat_pkgconfig_includedir}"
+ pkgconfig_version "${PACKAGE_VERSION}")
+
+ foreach(_build_type ${CMAKE_BUILD_TYPE} Debug Release RelWithDebInfo MinSizeRel)
+ string(TOLOWER "${_build_type}" _build_type_lower)
+ string(TOUPPER "${_build_type}" _build_type_upper)
+ set_property(TARGET expat PROPERTY "pkgconfig_${_build_type_lower}_name" "expat${EXPAT_${_build_type_upper}_POSTFIX}")
+ set_property(TARGET expat PROPERTY "pkgconfig_${_build_type_lower}_output_name" "${_EXPAT_OUTPUT_NAME}${EXPAT_${_build_type_upper}_POSTFIX}")
+ if(_EXPAT_LIBM_FOUND)
+ set_property(TARGET expat PROPERTY "pkgconfig_libm" "-lm")
+ else()
+ set_property(TARGET expat PROPERTY "pkgconfig_libm" "")
+ endif()
+ endforeach()
+
+ file(GENERATE
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/expat.pc
+ INPUT ${PROJECT_SOURCE_DIR}/expat.pc.cmake)
+
+ expat_install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/expat.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif()
#
@@ -374,20 +576,23 @@ endif()
#
if(EXPAT_BUILD_TOOLS)
set(xmlwf_SRCS
- xmlwf/xmlwf.c
- xmlwf/xmlfile.c
xmlwf/codepage.c
xmlwf/readfilemap.c
+ xmlwf/xmlfile.c
+ xmlwf/xmlwf.c
)
add_executable(xmlwf ${xmlwf_SRCS})
set_property(TARGET xmlwf PROPERTY RUNTIME_OUTPUT_DIRECTORY xmlwf)
target_link_libraries(xmlwf expat)
+ if(_EXPAT_LIBM_FOUND)
+ target_link_libraries(xmlwf m)
+ endif()
expat_install(TARGETS xmlwf DESTINATION ${CMAKE_INSTALL_BINDIR})
if(MINGW AND _EXPAT_UNICODE_WCHAR_T)
# https://gcc.gnu.org/onlinedocs/gcc/x86-Windows-Options.html
- set_target_properties(xmlwf PROPERTIES LINK_FLAGS -municode)
+ target_link_options(xmlwf PRIVATE -municode)
endif()
if(EXPAT_BUILD_DOCS)
@@ -409,13 +614,11 @@ endif()
# C code examples
#
if(EXPAT_BUILD_EXAMPLES)
- add_executable(elements examples/elements.c)
- set_property(TARGET elements PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
- target_link_libraries(elements expat)
-
- add_executable(outline examples/outline.c)
- set_property(TARGET outline PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
- target_link_libraries(outline expat)
+ foreach(_target element_declarations elements outline)
+ add_executable(${_target} examples/${_target}.c)
+ set_property(TARGET ${_target} PROPERTY RUNTIME_OUTPUT_DIRECTORY examples)
+ target_link_libraries(${_target} expat)
+ endforeach()
endif()
#
@@ -423,16 +626,8 @@ endif()
#
if(EXPAT_BUILD_TESTS)
## these are unittests that can be run on any platform
- enable_language(CXX)
enable_testing()
- set(test_SRCS
- tests/chardata.c
- tests/memcheck.c
- tests/minicheck.c
- tests/structdata.c
- )
-
if(NOT MSVC)
if(MINGW)
set(host whatever-mingw32) # for nothing but run.sh
@@ -448,17 +643,67 @@ if(EXPAT_BUILD_TESTS)
endif()
endfunction()
- add_executable(runtests tests/runtests.c ${test_SRCS})
- set_property(TARGET runtests PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
- target_link_libraries(runtests expat)
- expat_add_test(runtests $<TARGET_FILE:runtests>)
+ set(_EXPAT_TEST_TARGETS runtests runtests_cxx)
+
+ add_executable(runtests
+ tests/acc_tests.c
+ tests/alloc_tests.c
+ tests/basic_tests.c
+ tests/chardata.c
+ tests/common.c
+ tests/dummy.c
+ tests/handlers.c
+ tests/memcheck.c
+ tests/minicheck.c
+ tests/misc_tests.c
+ tests/ns_tests.c
+ tests/nsalloc_tests.c
+ tests/runtests.c
+ tests/structdata.c
+ ${_EXPAT_C_SOURCES}
+ )
+
+ add_executable(runtests_cxx
+ tests/acc_tests_cxx.cpp
+ tests/alloc_tests_cxx.cpp
+ tests/basic_tests_cxx.cpp
+ tests/chardata_cxx.cpp
+ tests/common_cxx.cpp
+ tests/dummy_cxx.cpp
+ tests/handlers_cxx.cpp
+ tests/memcheck_cxx.cpp
+ tests/minicheck_cxx.cpp
+ tests/misc_tests_cxx.cpp
+ tests/ns_tests_cxx.cpp
+ tests/nsalloc_tests_cxx.cpp
+ tests/runtests_cxx.cpp
+ tests/structdata_cxx.cpp
+ ${_EXPAT_C_SOURCES}
+ )
+
+ foreach(_target ${_EXPAT_TEST_TARGETS})
+ target_compile_definitions(${_target} PRIVATE -DXML_TESTING)
+
+ set_property(TARGET ${_target} PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
+ expat_add_test(${_target} $<TARGET_FILE:${_target}>)
- add_executable(runtestspp tests/runtestspp.cpp ${test_SRCS})
- set_property(TARGET runtestspp PROPERTY RUNTIME_OUTPUT_DIRECTORY tests)
- target_link_libraries(runtestspp expat)
- expat_add_test(runtestspp $<TARGET_FILE:runtestspp>)
+ if(_EXPAT_LIBM_FOUND)
+ target_link_libraries(${_target} m)
+ endif()
+
+ if(EXPAT_WITH_LIBBSD)
+ target_link_libraries(${_target} ${LIB_BSD})
+ endif()
+ endforeach()
+
+ add_executable(benchmark tests/benchmark/benchmark.c)
+ set_property(TARGET benchmark PROPERTY RUNTIME_OUTPUT_DIRECTORY tests/benchmark)
+ target_link_libraries(benchmark expat)
endif()
+#
+# Fuzzers
+#
if(EXPAT_BUILD_FUZZERS)
if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
message(SEND_ERROR
@@ -484,14 +729,14 @@ if(EXPAT_BUILD_FUZZERS)
message(SEND_ERROR
"OSS-Fuzz builds require the environment variable "
"LIB_FUZZING_ENGINE to be set. If you are seeing this "
- "warning, it points to a deeper problem in the ossfuzz "
+ "warning, it points to a deeper problem in the OSS-Fuzz "
"build setup.")
endif()
set(encoding_types UTF-16 UTF-8 ISO-8859-1 US-ASCII UTF-16BE UTF-16LE)
set(fuzz_targets xml_parse_fuzzer xml_parsebuffer_fuzzer)
- add_library(fuzzpat STATIC ${expat_SRCS})
+ add_library(fuzzpat STATIC ${_EXPAT_C_SOURCES})
if(NOT EXPAT_OSSFUZZ_BUILD)
target_compile_options(fuzzpat PRIVATE -fsanitize=fuzzer-no-link)
endif()
@@ -503,30 +748,101 @@ if(EXPAT_BUILD_FUZZERS)
target_link_libraries(${target_name} fuzzpat)
target_compile_definitions(${target_name}
PRIVATE ENCODING_FOR_FUZZING=${encoding_type})
- if(NOT EXPAT_OSSFUZZ_BUILD)
- target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer-no-link)
- endif()
- # NOTE: Avoiding target_link_options here only because it needs CMake >=3.13
if(EXPAT_OSSFUZZ_BUILD)
- set_target_properties(${target_name} PROPERTIES LINK_FLAGS $ENV{LIB_FUZZING_ENGINE})
+ target_link_options(${target_name} PRIVATE $ENV{LIB_FUZZING_ENGINE})
set_target_properties(${target_name} PROPERTIES LINKER_LANGUAGE "CXX")
else()
- set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
+ target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer)
+ target_link_options(${target_name} PRIVATE -fsanitize=fuzzer)
endif()
set_property(
TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
endforeach()
endforeach()
+
+ find_package(Protobuf REQUIRED)
+
+ # Only include libprotobuf-mutator here so we don't build it in non-fuzz
+ # configurations.
+ include(ExternalProject)
+
+ set(ProtobufMutator_PREFIX libprotobuf-mutator)
+ set(ProtobufMutator_PATH ${CMAKE_CURRENT_BINARY_DIR}/${ProtobufMutator_PREFIX}/src/${ProtobufMutator_PREFIX})
+ set(ProtobufMutator_BUILD_PATH ${ProtobufMutator_PATH}-build)
+ set(ProtobufMutator_INCLUDE_DIR ${ProtobufMutator_PATH})
+ set(ProtobufMutator_LIBRARIES ${ProtobufMutator_BUILD_PATH}/src/libfuzzer/libprotobuf-mutator-libfuzzer.a ${ProtobufMutator_BUILD_PATH}/src/libprotobuf-mutator.a)
+
+ ExternalProject_Add(
+ ${ProtobufMutator_PREFIX}
+ PREFIX ${ProtobufMutator_PREFIX}
+ GIT_REPOSITORY https://github.com/google/libprotobuf-mutator.git
+ GIT_TAG 57928f41ae52bb27666aa15b310130d086dac245 # v1.4-16-g57928f4
+ CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ CMAKE_CACHE_ARGS
+ -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
+ -DLIB_PROTO_MUTATOR_EXAMPLES:BOOL=OFF
+ -DLIB_PROTO_MUTATOR_TESTING:BOOL=OFF
+ BUILD_BYPRODUCTS ${ProtobufMutator_LIBRARIES}
+ UPDATE_COMMAND true
+ INSTALL_COMMAND true)
+
+ # Check for availability of protobuf compiler to avoid hard-to-understand
+ # errors from make(1) down the line as seen with CMake 3.25.1 on Debian
+ if(NOT Protobuf_PROTOC_EXECUTABLE)
+ message(SEND_ERROR
+ "The protobuf compiler (protoc) could not be found. "
+ "Is it installed and working properly?")
+ endif()
+
+ protobuf_generate_cpp(XML_LPM_FUZZER_PROTO_SRCS
+ XML_LPM_FUZZER_PROTO_HDRS
+ fuzz/xml_lpm_fuzzer.proto)
+
+ add_executable(xml_lpm_fuzzer
+ fuzz/xml_lpm_fuzzer.cpp
+ ${XML_LPM_FUZZER_PROTO_SRCS})
+ target_include_directories(xml_lpm_fuzzer PUBLIC ${ProtobufMutator_INCLUDE_DIR})
+ target_link_libraries(xml_lpm_fuzzer
+ fuzzpat
+ ${ProtobufMutator_LIBRARIES}
+ ${Protobuf_LIBRARIES})
+ add_dependencies(xml_lpm_fuzzer ${ProtobufMutator_PREFIX})
+
+ if(EXPAT_OSSFUZZ_BUILD)
+ target_link_options(xml_lpm_fuzzer PRIVATE $ENV{LIB_FUZZING_ENGINE})
+ else()
+ target_compile_options(xml_lpm_fuzzer PRIVATE -fsanitize=fuzzer)
+ target_link_options(xml_lpm_fuzzer PRIVATE -fsanitize=fuzzer)
+ endif()
+ set_property(TARGET xml_lpm_fuzzer PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
else()
if(EXPAT_OSSFUZZ_BUILD)
message(SEND_ERROR
- "Attempting to perform an ossfuzz build without turning on the fuzzer build. "
+ "Attempting to perform an OSS-Fuzz build without turning on the fuzzer build. "
"This is likely in error - consider adding "
"-DEXPAT_BUILD_FUZZERS=ON to your cmake execution.")
endif()
endif()
#
+# C/C++ config affecting multiple targets
+#
+if(WIN32)
+ set(_EXPAT_STATIC_TARGETS ${_EXPAT_TEST_TARGETS})
+ if(NOT EXPAT_SHARED_LIBS)
+ list(APPEND _EXPAT_STATIC_TARGETS expat)
+ endif()
+ if(EXPAT_BUILD_FUZZERS)
+ list(APPEND _EXPAT_STATIC_TARGETS fuzzpat)
+ endif()
+
+ foreach(_target ${_EXPAT_STATIC_TARGETS})
+ target_compile_definitions(${_target} PUBLIC -DXML_STATIC)
+ endforeach()
+endif()
+
+#
# Custom target "run-xmltest"
#
if(EXPAT_BUILD_TOOLS AND NOT MSVC)
@@ -656,20 +972,25 @@ elseif(EXPAT_CHAR_TYPE STREQUAL "wchar_t")
else()
set(_EXPAT_CHAR_TYPE_SUMMARY "ERROR")
endif()
-string(TOUPPER "${CMAKE_BUILD_TYPE}" _EXPAT_BUILD_TYPE_UPPER)
+get_property(_EXPAT_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
message(STATUS "===========================================================================")
message(STATUS "")
message(STATUS "Configuration")
+message(STATUS " Generator .................. ${CMAKE_GENERATOR}")
+if(_EXPAT_GENERATOR_IS_MULTI_CONFIG)
+ message(STATUS " Build types ................ ${CMAKE_CONFIGURATION_TYPES}")
+else()
+ message(STATUS " Build type ................. ${CMAKE_BUILD_TYPE}")
+endif()
message(STATUS " Prefix ..................... ${CMAKE_INSTALL_PREFIX}")
-message(STATUS " Build type ................. ${CMAKE_BUILD_TYPE}")
message(STATUS " Shared libraries ........... ${EXPAT_SHARED_LIBS}")
if(MSVC)
message(STATUS " Static CRT ................. ${EXPAT_MSVC_STATIC_CRT}")
endif()
message(STATUS " Character type ............. ${_EXPAT_CHAR_TYPE_SUMMARY}")
-if(WIN32)
- message(STATUS " Binary postfix ............. ${CMAKE_${_EXPAT_BUILD_TYPE_UPPER}_POSTFIX}")
+if(NOT _EXPAT_GENERATOR_IS_MULTI_CONFIG)
+ message(STATUS " Library name postfix ....... ${EXPAT_${_EXPAT_BUILD_TYPE_UPPER}_POSTFIX}")
endif()
message(STATUS "")
message(STATUS " Build documentation ........ ${EXPAT_BUILD_DOCS}")
@@ -685,6 +1006,7 @@ message(STATUS " // Advanced options, changes not advised")
message(STATUS " Attributes info .......... ${EXPAT_ATTR_INFO}")
message(STATUS " Context bytes ............ ${EXPAT_CONTEXT_BYTES}")
message(STATUS " DTD support .............. ${EXPAT_DTD}")
+message(STATUS " General entities ......... ${EXPAT_GE}")
message(STATUS " Large size ............... ${EXPAT_LARGE_SIZE}")
message(STATUS " Minimum size ............. ${EXPAT_MIN_SIZE}")
message(STATUS " Namespace support ........ ${EXPAT_NS}")
diff --git a/3rdparty/expat/COPYING b/3rdparty/expat/COPYING
index 3c0142e71c8..c6d184a8aae 100644
--- a/3rdparty/expat/COPYING
+++ b/3rdparty/expat/COPYING
@@ -1,5 +1,5 @@
Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
-Copyright (c) 2001-2019 Expat maintainers
+Copyright (c) 2001-2025 Expat maintainers
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/3rdparty/expat/Changes b/3rdparty/expat/Changes
index b74a7c56a96..9d6c64b6a46 100644
--- a/3rdparty/expat/Changes
+++ b/3rdparty/expat/Changes
@@ -1,6 +1,861 @@
-NOTE: We are looking for help with a few things:
- https://github.com/libexpat/libexpat/labels/help%20wanted
- If you can help, please get in touch. Thanks!
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! <blink>Expat is UNDERSTAFFED and WITHOUT FUNDING.</blink> !!
+!! ~~~~~~~~~~~~ !!
+!! The following topics need *additional skilled C developers* to progress !!
+!! in a timely manner or at all (loosely ordered by descending priority): !!
+!! !!
+!! - teaming up on researching and fixing future security reports and !!
+!! ClusterFuzz findings with few-days-max response times in communication !!
+!! in order to (1) have a sound fix ready before the end of a 90 days !!
+!! grace period and (2) in a sustainable manner, !!
+!! - helping CPython Expat bindings with supporting Expat's billion laughs !!
+!! attack protection API (https://github.com/python/cpython/issues/90949): !!
+!! - XML_SetBillionLaughsAttackProtectionActivationThreshold !!
+!! - XML_SetBillionLaughsAttackProtectionMaximumAmplification !!
+!! - helping Perl's XML::Parser Expat bindings with supporting Expat's !!
+!! security API (https://github.com/cpan-authors/XML-Parser/issues/102): !!
+!! - XML_SetBillionLaughsAttackProtectionActivationThreshold !!
+!! - XML_SetBillionLaughsAttackProtectionMaximumAmplification !!
+!! - XML_SetReparseDeferralEnabled !!
+!! - implementing and auto-testing XML 1.0r5 support !!
+!! (needs discussion before pull requests), !!
+!! - smart ideas on fixing the Autotools CMake files generation issue !!
+!! without breaking CI (needs discussion before pull requests), !!
+!! - pushing migration from `int` to `size_t` further !!
+!! including edge-cases test coverage (needs discussion before anything). !!
+!! !!
+!! For details, please reach out via e-mail to sebastian@pipping.org so we !!
+!! can schedule a voice call on the topic, in English or German. !!
+!! !!
+!! THANK YOU! Sebastian Pipping -- Berlin, 2024-03-09 !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+Release 2.7.1 Thu March 27 2025
+ Bug fixes:
+ #980 #989 Restore event pointer behavior from Expat 2.6.4
+ (that the fix to CVE-2024-8176 changed in 2.7.0);
+ affected API functions are:
+ - XML_GetCurrentByteCount
+ - XML_GetCurrentByteIndex
+ - XML_GetCurrentColumnNumber
+ - XML_GetCurrentLineNumber
+ - XML_GetInputContext
+
+ Other changes:
+ #976 #977 Autotools: Integrate files "fuzz/xml_lpm_fuzzer.{cpp,proto}"
+ with Automake that were missing from 2.7.0 release tarballs
+ #983 #984 Fix printf format specifiers for 32bit Emscripten
+ #992 docs: Promote OpenSSF Best Practices self-certification
+ #978 tests/benchmark: Resolve mistaken double close
+ #986 Address compiler warnings
+ #990 #993 Version info bumped from 11:1:10 (libexpat*.so.1.10.1)
+ to 11:2:10 (libexpat*.so.1.10.2); see https://verbump.de/
+ for what these numbers do
+
+ Infrastructure:
+ #982 CI: Start running Perl XML::Parser integration tests
+ #987 CI: Enforce Clang Static Analyzer clean code
+ #991 CI: Re-enable warning clang-analyzer-valist.Uninitialized
+ for clang-tidy
+ #981 CI: Cover compilation with musl
+ #983 #984 CI: Cover compilation with 32bit Emscripten
+ #976 #977 CI: Protect against fuzzer files missing from future
+ release archives
+
+ Special thanks to:
+ Berkay Eren Ürün
+ Matthew Fernandez
+ and
+ Perl XML::Parser
+
+Release 2.7.0 Thu March 13 2025
+ Security fixes:
+ #893 #973 CVE-2024-8176 -- Fix crash from chaining a large number
+ of entities caused by stack overflow by resolving use of
+ recursion, for all three uses of entities:
+ - general entities in character data ("<e>&g1;</e>")
+ - general entities in attribute values ("<e k1='&g1;'/>")
+ - parameter entities ("%p1;")
+ Known impact is (reliable and easy) denial of service:
+ CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H/E:H/RL:O/RC:C
+ (Base Score: 7.5, Temporal Score: 7.2)
+ Please note that a layer of compression around XML can
+ significantly reduce the minimum attack payload size.
+
+ Other changes:
+ #935 #937 Autotools: Make generated CMake files look for
+ libexpat.@SO_MAJOR@.dylib on macOS
+ #925 Autotools: Sync CMake templates with CMake 3.29
+ #945 #962 #966 CMake: Drop support for CMake <3.13
+ #942 CMake: Small fuzzing related improvements
+ #921 docs: Add missing documentation of error code
+ XML_ERROR_NOT_STARTED that was introduced with 2.6.4
+ #941 docs: Document need for C++11 compiler for use from C++
+ #959 tests/benchmark: Fix a (harmless) TOCTTOU
+ #944 Windows: Fix installer target location of file xmlwf.xml
+ for CMake
+ #953 Windows: Address warning -Wunknown-warning-option
+ about -Wno-pedantic-ms-format from LLVM MinGW
+ #971 Address Cppcheck warnings
+ #969 #970 Mass-migrate links from http:// to https://
+ #947 #958 ..
+ #974 #975 Document changes since the previous release
+ #974 #975 Version info bumped from 11:0:10 (libexpat*.so.1.10.0)
+ to 11:1:10 (libexpat*.so.1.10.1); see https://verbump.de/
+ for what these numbers do
+
+ Infrastructure:
+ #926 tests: Increase robustness
+ #927 #932 ..
+ #930 #933 tests: Increase test coverage
+ #617 #950 ..
+ #951 #952 ..
+ #954 #955 .. Fuzzing: Add new fuzzer "xml_lpm_fuzzer" based on
+ #961 Google's libprotobuf-mutator ("LPM")
+ #957 Fuzzing|CI: Start producing fuzzing code coverage reports
+ #936 CI: Pass -q -q for LCOV >=2.1 in coverage.sh
+ #942 CI: Small fuzzing related improvements
+ #139 #203 ..
+ #791 #946 CI: Make GitHub Actions build using MSVC on Windows and
+ produce 32bit and 64bit Windows binaries
+ #956 CI: Get off of about-to-be-removed Ubuntu 20.04
+ #960 #964 CI: Start uploading to Coverity Scan for static analysis
+ #972 CI: Stop loading DTD from the internet to address flaky CI
+ #971 CI: Adapt to breaking changes in Cppcheck
+
+ Special thanks to:
+ Alexander Gieringer
+ Berkay Eren Ürün
+ Hanno Böck
+ Jann Horn
+ Mark Brand
+ Sebastian Andrzej Siewior
+ Snild Dolkow
+ Thomas Pröll
+ Tomas Korbar
+ valord577
+ and
+ Google Project Zero
+ Linutronix
+ Red Hat
+ Siemens
+
+Release 2.6.4 Wed November 6 2024
+ Security fixes:
+ #915 CVE-2024-50602 -- Fix crash within function XML_ResumeParser
+ from a NULL pointer dereference by disallowing function
+ XML_StopParser to (stop or) suspend an unstarted parser.
+ A new error code XML_ERROR_NOT_STARTED was introduced to
+ properly communicate this situation. // CWE-476 CWE-754
+
+ Other changes:
+ #903 CMake: Add alias target "expat::expat"
+ #905 docs: Document use via CMake >=3.18 with FetchContent
+ and SOURCE_SUBDIR and its consequences
+ #902 tests: Reduce use of global parser instance
+ #904 tests: Resolve duplicate handler
+ #317 #918 tests: Improve tests on doctype closing (ex CVE-2019-15903)
+ #914 Fix signedness of format strings
+ #915 For use from C++, expat.h started requiring C++11 due to
+ use of C99 features
+ #919 #920 Version info bumped from 10:3:9 (libexpat*.so.1.9.3)
+ to 11:0:10 (libexpat*.so.1.10.0); see https://verbump.de/
+ for what these numbers do
+
+ Infrastructure:
+ #907 CI: Upgrade Clang from 18 to 19
+ #913 CI: Drop macos-12 and add macos-15
+ #910 CI: Adapt to breaking changes in GitHub Actions
+ #898 Add missing entries to .gitignore
+
+ Special thanks to:
+ Hanno Böck
+ José Eduardo Gutiérrez Conejo
+ José Ricardo Cardona Quesada
+
+Release 2.6.3 Wed September 4 2024
+ Security fixes:
+ #887 #890 CVE-2024-45490 -- Calling function XML_ParseBuffer with
+ len < 0 without noticing and then calling XML_GetBuffer
+ will have XML_ParseBuffer fail to recognize the problem
+ and XML_GetBuffer corrupt memory.
+ With the fix, XML_ParseBuffer now complains with error
+ XML_ERROR_INVALID_ARGUMENT just like sibling XML_Parse
+ has been doing since Expat 2.2.1, and now documented.
+ Impact is denial of service to potentially artitrary code
+ execution.
+ #888 #891 CVE-2024-45491 -- Internal function dtdCopy can have an
+ integer overflow for nDefaultAtts on 32-bit platforms
+ (where UINT_MAX equals SIZE_MAX).
+ Impact is denial of service to potentially artitrary code
+ execution.
+ #889 #892 CVE-2024-45492 -- Internal function nextScaffoldPart can
+ have an integer overflow for m_groupSize on 32-bit
+ platforms (where UINT_MAX equals SIZE_MAX).
+ Impact is denial of service to potentially artitrary code
+ execution.
+
+ Other changes:
+ #851 #879 Autotools: Sync CMake templates with CMake 3.28
+ #853 Autotools: Always provide path to find(1) for portability
+ #861 Autotools: Ensure that the m4 directory always exists.
+ #870 Autotools: Simplify handling of SIZEOF_VOID_P
+ #869 Autotools: Support non-GNU sed
+ #856 Autotools|CMake: Fix main() to main(void)
+ #865 Autotools|CMake: Fix compile tests for HAVE_SYSCALL_GETRANDOM
+ #863 Autotools|CMake: Stop requiring dos2unix
+ #854 #855 CMake: Fix check for symbols size_t and off_t
+ #864 docs|tests: Convert README to Markdown and update
+ #741 Windows: Drop support for Visual Studio <=15.0/2017
+ #886 Drop needless XML_DTD guards around is_param access
+ #885 Fix typo in a code comment
+ #894 #896 Version info bumped from 10:2:9 (libexpat*.so.1.9.2)
+ to 10:3:9 (libexpat*.so.1.9.3); see https://verbump.de/
+ for what these numbers do
+
+ Infrastructure:
+ #880 Readme: Promote the call for help
+ #868 CI: Fix various issues
+ #849 CI: Allow triggering GitHub Actions workflows manually
+ #851 #872 ..
+ #873 #879 CI: Adapt to breaking changes in GitHub Actions
+
+ Special thanks to:
+ Alexander Bluhm
+ Berkay Eren Ürün
+ Dag-Erling Smørgrav
+ Ferenc Géczi
+ TaiYou
+
+Release 2.6.2 Wed March 13 2024
+ Security fixes:
+ #839 #842 CVE-2024-28757 -- Prevent billion laughs attacks with
+ isolated use of external parsers. Please see the commit
+ message of commit 1d50b80cf31de87750103656f6eb693746854aa8
+ for details.
+
+ Bug fixes:
+ #839 #841 Reject direct parameter entity recursion
+ and avoid the related undefined behavior
+
+ Other changes:
+ #847 Autotools: Fix build for DOCBOOK_TO_MAN containing spaces
+ #837 Add missing #821 and #824 to 2.6.1 change log
+ #838 #843 Version info bumped from 10:1:9 (libexpat*.so.1.9.1)
+ to 10:2:9 (libexpat*.so.1.9.2); see https://verbump.de/
+ for what these numbers do
+
+ Special thanks to:
+ Philippe Antoine
+ Tomas Korbar
+ and
+ Clang UndefinedBehaviorSanitizer
+ OSS-Fuzz / ClusterFuzz
+
+Release 2.6.1 Thu February 29 2024
+ Bug fixes:
+ #817 Make tests independent of CPU speed, and thus more robust
+ #828 #836 Expose billion laughs API with XML_DTD defined and
+ XML_GE undefined, regression from 2.6.0
+
+ Other changes:
+ #829 Hide test-only code behind new internal macro
+ #833 Autotools: Reject expat_config.h.in defining SIZEOF_VOID_P
+ #821 #824 Autotools: Fix "make clean" for case:
+ ./configure --without-docbook && make clean all
+ #819 Address compiler warnings
+ #832 #834 Version info bumped from 10:0:9 (libexpat*.so.1.9.0)
+ to 10:1:9 (libexpat*.so.1.9.1); see https://verbump.de/
+ for what these numbers do
+
+ Infrastructure:
+ #818 CI: Adapt to breaking changes in clang-format
+
+ Special thanks to:
+ David Hall
+ Snild Dolkow
+
+Release 2.6.0 Tue February 6 2024
+ Security fixes:
+ #789 #814 CVE-2023-52425 -- Fix quadratic runtime issues with big tokens
+ that can cause denial of service, in partial where
+ dealing with compressed XML input. Applications
+ that parsed a document in one go -- a single call to
+ functions XML_Parse or XML_ParseBuffer -- were not affected.
+ The smaller the chunks/buffers you use for parsing
+ previously, the bigger the problem prior to the fix.
+ Backporters should be careful to no omit parts of
+ pull request #789 and to include earlier pull request #771,
+ in order to not break the fix.
+ #777 CVE-2023-52426 -- Fix billion laughs attacks for users
+ compiling *without* XML_DTD defined (which is not common).
+ Users with XML_DTD defined have been protected since
+ Expat >=2.4.0 (and that was CVE-2013-0340 back then).
+
+ Bug fixes:
+ #753 Fix parse-size-dependent "invalid token" error for
+ external entities that start with a byte order mark
+ #780 Fix NULL pointer dereference in setContext via
+ XML_ExternalEntityParserCreate for compilation with
+ XML_DTD undefined
+ #812 #813 Protect against closing entities out of order
+
+ Other changes:
+ #723 Improve support for arc4random/arc4random_buf
+ #771 #788 Improve buffer growth in XML_GetBuffer and XML_Parse
+ #761 #770 xmlwf: Support --help and --version
+ #759 #770 xmlwf: Support custom buffer size for XML_GetBuffer and read
+ #744 xmlwf: Improve language and URL clickability in help output
+ #673 examples: Add new example "element_declarations.c"
+ #764 Be stricter about macro XML_CONTEXT_BYTES at build time
+ #765 Make inclusion to expat_config.h consistent
+ #726 #727 Autotools: configure.ac: Support --disable-maintainer-mode
+ #678 #705 ..
+ #706 #733 #792 Autotools: Sync CMake templates with CMake 3.26
+ #795 Autotools: Make installation of shipped man page doc/xmlwf.1
+ independent of docbook2man availability
+ #815 Autotools|CMake: Add missing -DXML_STATIC to pkg-config file
+ section "Cflags.private" in order to fix compilation
+ against static libexpat using pkg-config on Windows
+ #724 #751 Autotools|CMake: Require a C99 compiler
+ (a de-facto requirement already since Expat 2.2.2 of 2017)
+ #793 Autotools|CMake: Fix PACKAGE_BUGREPORT variable
+ #750 #786 Autotools|CMake: Make test suite require a C++11 compiler
+ #749 CMake: Require CMake >=3.5.0
+ #672 CMake: Lowercase off_t and size_t to help a bug in Meson
+ #746 CMake: Sort xmlwf sources alphabetically
+ #785 CMake|Windows: Fix generation of DLL file version info
+ #790 CMake: Build tests/benchmark/benchmark.c as well for
+ a build with -DEXPAT_BUILD_TESTS=ON
+ #745 #757 docs: Document the importance of isFinal + adjust tests
+ accordingly
+ #736 docs: Improve use of "NULL" and "null"
+ #713 docs: Be specific about version of XML (XML 1.0r4)
+ and version of C (C99); (XML 1.0r5 will need a sponsor.)
+ #762 docs: reference.html: Promote function XML_ParseBuffer more
+ #779 docs: reference.html: Add HTML anchors to XML_* macros
+ #760 docs: reference.html: Upgrade to OK.css 1.2.0
+ #763 #739 docs: Fix typos
+ #696 docs|CI: Use HTTPS URLs instead of HTTP at various places
+ #669 #670 ..
+ #692 #703 ..
+ #733 #772 Address compiler warnings
+ #798 #800 Address clang-tidy warnings
+ #775 #776 Version info bumped from 9:10:8 (libexpat*.so.1.8.10)
+ to 10:0:9 (libexpat*.so.1.9.0); see https://verbump.de/
+ for what these numbers do
+
+ Infrastructure:
+ #700 #701 docs: Document security policy in file SECURITY.md
+ #766 docs: Improve parse buffer variables in-code documentation
+ #674 #738 ..
+ #740 #747 ..
+ #748 #781 #782 Refactor coverage and conformance tests
+ #714 #716 Refactor debug level variables to unsigned long
+ #671 Improve handling of empty environment variable value
+ in function getDebugLevel (without visible user effect)
+ #755 #774 ..
+ #758 #783 ..
+ #784 #787 tests: Improve test coverage with regard to parse chunk size
+ #660 #797 #801 Fuzzing: Improve fuzzing coverage
+ #367 #799 Fuzzing|CI: Start running OSS-Fuzz fuzzing regression tests
+ #698 #721 CI: Resolve some Travis CI leftovers
+ #669 CI: Be robust towards absence of Git tags
+ #693 #694 CI: Set permissions to "contents: read" for security
+ #709 CI: Pin all GitHub Actions to specific commits for security
+ #739 CI: Reject spelling errors using codespell
+ #798 CI: Enforce clang-tidy clean code
+ #773 #808 ..
+ #809 #810 CI: Upgrade Clang from 15 to 18
+ #796 CI: Start using Clang's Control Flow Integrity sanitizer
+ #675 #720 #722 CI: Adapt to breaking changes in GitHub Actions Ubuntu images
+ #689 CI: Adapt to breaking changes in Clang/LLVM Debian packaging
+ #763 CI: Adapt to breaking changes in codespell
+ #803 CI: Adapt to breaking changes in Cppcheck
+
+ Special thanks to:
+ Ivan Galkin
+ Joyce Brum
+ Philippe Antoine
+ Rhodri James
+ Snild Dolkow
+ spookyahell
+ Steven Garske
+ and
+ Clang AddressSanitizer
+ Clang UndefinedBehaviorSanitizer
+ codespell
+ GCC Farm Project
+ OSS-Fuzz
+ Sony Mobile
+
+Release 2.5.0 Tue October 25 2022
+ Security fixes:
+ #616 #649 #650 CVE-2022-43680 -- Fix heap use-after-free after overeager
+ destruction of a shared DTD in function
+ XML_ExternalEntityParserCreate in out-of-memory situations.
+ Expected impact is denial of service or potentially
+ arbitrary code execution.
+
+ Bug fixes:
+ #612 #645 Fix corruption from undefined entities
+ #613 #654 Fix case when parsing was suspended while processing nested
+ entities
+ #616 #652 #653 Stop leaking opening tag bindings after a closing tag
+ mismatch error where a parser is reset through
+ XML_ParserReset and then reused to parse
+ #656 CMake: Fix generation of pkg-config file
+ #658 MinGW|CMake: Fix static library name
+
+ Other changes:
+ #663 Protect header expat_config.h from multiple inclusion
+ #666 examples: Make use of XML_GetBuffer and be more
+ consistent across examples
+ #648 Address compiler warnings
+ #667 #668 Version info bumped from 9:9:8 to 9:10:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Jann Horn
+ Mark Brand
+ Osyotr
+ Rhodri James
+ and
+ Google Project Zero
+
+Release 2.4.9 Tue September 20 2022
+ Security fixes:
+ #629 #640 CVE-2022-40674 -- Heap use-after-free vulnerability in
+ function doContent. Expected impact is denial of service
+ or potentially arbitrary code execution.
+
+ Bug fixes:
+ #634 MinGW: Fix mis-compilation for -D__USE_MINGW_ANSI_STDIO=0
+ #614 docs: Fix documentation on effect of switch XML_DTD on
+ symbol visibility in doc/reference.html
+
+ Other changes:
+ #638 MinGW: Make fix-xmltest-log.sh drop more Wine bug output
+ #596 #625 Autotools: Sync CMake templates with CMake 3.22
+ #608 CMake: Migrate from use of CMAKE_*_POSTFIX to
+ dedicated variables EXPAT_*_POSTFIX to stop affecting
+ other projects
+ #597 #599 Windows|CMake: Add missing -DXML_STATIC to test runners
+ and fuzzers
+ #512 #621 Windows|CMake: Render .def file from a template to fix
+ linking with -DEXPAT_DTD=OFF and/or -DEXPAT_ATTR_INFO=ON
+ #611 #621 MinGW|CMake: Apply MSVC .def file when linking
+ #622 #624 MinGW|CMake: Sync library name with GNU Autotools,
+ i.e. produce libexpat-1.dll rather than libexpat.dll
+ by default. Filename libexpat.dll.a is unaffected.
+ #632 MinGW|CMake: Set missing variable CMAKE_RC_COMPILER in
+ toolchain file "cmake/mingw-toolchain.cmake" to avoid
+ error "windres: Command not found" on e.g. Ubuntu 20.04
+ #597 #627 CMake: Unify inconsistent use of set() and option() in
+ context of public build time options to take need for
+ set(.. FORCE) in projects using Expat by means of
+ add_subdirectory(..) off Expat's users' shoulders
+ #626 #641 Stop exporting API symbols when building a static library
+ #644 Resolve use of deprecated "fgrep" by "grep -F"
+ #620 CMake: Make documentation on variables a bit more consistent
+ #636 CMake: Drop leading whitespace from a #cmakedefine line in
+ file expat_config.h.cmake
+ #594 xmlwf: Fix harmless variable mix-up in function nsattcmp
+ #592 #593 #610 Address Cppcheck warnings
+ #643 Address Clang 15 compiler warnings
+ #642 #644 Version info bumped from 9:8:8 to 9:9:8;
+ see https://verbump.de/ for what these numbers do
+
+ Infrastructure:
+ #597 #598 CI: Windows: Start covering MSVC 2022
+ #619 CI: macOS: Migrate off deprecated macOS 10.15
+ #632 CI: Linux: Make migration off deprecated Ubuntu 18.04 work
+ #643 CI: Upgrade Clang from 14 to 15
+ #637 apply-clang-format.sh: Add support for BSD find
+ #633 coverage.sh: Exclude MinGW headers
+ #635 coverage.sh: Fix name collision for -funsigned-char
+
+ Special thanks to:
+ David Faure
+ Felix Wilhelm
+ Frank Bergmann
+ Rhodri James
+ Rosen Penev
+ Thijs Schreijer
+ Vincent Torri
+ and
+ Google Project Zero
+
+Release 2.4.8 Mon March 28 2022
+ Other changes:
+ #587 pkg-config: Move "-lm" to section "Libs.private"
+ #587 CMake|MSVC: Fix pkg-config section "Libs"
+ #55 #582 CMake|macOS: Start using linker arguments
+ "-compatibility_version <version>" and
+ "-current_version <version>" in a way compatible with
+ GNU Libtool
+ #590 #591 Version info bumped from 9:7:8 to 9:8:8;
+ see https://verbump.de/ for what these numbers do
+
+ Infrastructure:
+ #589 CI: Upgrade Clang from 13 to 14
+
+ Special thanks to:
+ evpobr
+ Kai Pastor
+ Sam James
+
+Release 2.4.7 Fri March 4 2022
+ Bug fixes:
+ #572 #577 Relax fix to CVE-2022-25236 (introduced with release 2.4.5)
+ with regard to all valid URI characters (RFC 3986),
+ i.e. the following set (excluding whitespace):
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
+ 0123456789 % -._~ :/?#[]@ !$&'()*+,;=
+
+ Other changes:
+ #555 #570 #581 CMake|Windows: Store Expat version in the DLL
+ #577 Document consequences of namespace separator choices not just
+ in doc/reference.html but also in header <expat.h>
+ #577 Document Expat's lack of validation of namespace URIs against
+ RFC 3986, and that the XML 1.0r4 specification doesn't
+ require Expat to validate namespace URIs, and that Expat
+ may do more in that regard in future releases.
+ If you find need for strict RFC 3986 URI validation on
+ application level today, https://uriparser.github.io/ may
+ be of interest.
+ #579 Fix documentation of XML_EndDoctypeDeclHandler in <expat.h>
+ #575 Document that a call to XML_FreeContentModel can be done at
+ a later time from outside the element declaration handler
+ #574 Make hardcoded namespace URIs easier to find in code
+ #573 Update documentation on use of XML_POOR_ENTOPY on Solaris
+ #569 #571 tests: Resolve use of macros NAN and INFINITY for GNU G++
+ 4.8.2 on Solaris.
+ #578 #580 Version info bumped from 9:6:8 to 9:7:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Jeffrey Walton
+ Johnny Jazeix
+ Thijs Schreijer
+
+Release 2.4.6 Sun February 20 2022
+ Bug fixes:
+ #566 Fix a regression introduced by the fix for CVE-2022-25313
+ in release 2.4.5 that affects applications that (1)
+ call function XML_SetElementDeclHandler and (2) are
+ parsing XML that contains nested element declarations
+ (e.g. "<!ELEMENT junk ((bar|foo|xyz+), zebra*)>").
+
+ Other changes:
+ #567 #568 Version info bumped from 9:5:8 to 9:6:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Matt Sergeant
+ Samanta Navarro
+ Sergei Trofimovich
+ and
+ NixOS
+ Perl XML::Parser
+
+Release 2.4.5 Fri February 18 2022
+ Security fixes:
+ #562 CVE-2022-25235 -- Passing malformed 2- and 3-byte UTF-8
+ sequences (e.g. from start tag names) to the XML
+ processing application on top of Expat can cause
+ arbitrary damage (e.g. code execution) depending
+ on how invalid UTF-8 is handled inside the XML
+ processor; validation was not their job but Expat's.
+ Exploits with code execution are known to exist.
+ #561 CVE-2022-25236 -- Passing (one or more) namespace separator
+ characters in "xmlns[:prefix]" attribute values
+ made Expat send malformed tag names to the XML
+ processor on top of Expat which can cause
+ arbitrary damage (e.g. code execution) depending
+ on such unexpectable cases are handled inside the XML
+ processor; validation was not their job but Expat's.
+ Exploits with code execution are known to exist.
+ #558 CVE-2022-25313 -- Fix stack exhaustion in doctype parsing
+ that could be triggered by e.g. a 2 megabytes
+ file with a large number of opening braces.
+ Expected impact is denial of service or potentially
+ arbitrary code execution.
+ #560 CVE-2022-25314 -- Fix integer overflow in function copyString;
+ only affects the encoding name parameter at parser creation
+ time which is often hardcoded (rather than user input),
+ takes a value in the gigabytes to trigger, and a 64-bit
+ machine. Expected impact is denial of service.
+ #559 CVE-2022-25315 -- Fix integer overflow in function storeRawNames;
+ needs input in the gigabytes and a 64-bit machine.
+ Expected impact is denial of service or potentially
+ arbitrary code execution.
+
+ Other changes:
+ #557 #564 Version info bumped from 9:4:8 to 9:5:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Ivan Fratric
+ Samanta Navarro
+ and
+ Google Project Zero
+ JetBrains
+
+Release 2.4.4 Sun January 30 2022
+ Security fixes:
+ #550 CVE-2022-23852 -- Fix signed integer overflow
+ (undefined behavior) in function XML_GetBuffer
+ (that is also called by function XML_Parse internally)
+ for when XML_CONTEXT_BYTES is defined to >0 (which is both
+ common and default).
+ Impact is denial of service or more.
+ #551 CVE-2022-23990 -- Fix unsigned integer overflow in function
+ doProlog triggered by large content in element type
+ declarations when there is an element declaration handler
+ present (from a prior call to XML_SetElementDeclHandler).
+ Impact is denial of service or more.
+
+ Bug fixes:
+ #544 #545 xmlwf: Fix a memory leak on output file opening error
+
+ Other changes:
+ #546 Autotools: Fix broken CMake support under Cygwin
+ #554 Windows: Add missing files to the installer to fix
+ compilation with CMake from installed sources
+ #552 #554 Version info bumped from 9:3:8 to 9:4:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Carlo Bramini
+ hwt0415
+ Roland Illig
+ Samanta Navarro
+ and
+ Clang LeakSan and the Clang team
+
+Release 2.4.3 Sun January 16 2022
+ Security fixes:
+ #531 #534 CVE-2021-45960 -- Fix issues with left shifts by >=29 places
+ resulting in
+ a) realloc acting as free
+ b) realloc allocating too few bytes
+ c) undefined behavior
+ depending on architecture and precise value
+ for XML documents with >=2^27+1 prefixed attributes
+ on a single XML tag a la
+ "<r xmlns:a='[..]' a:a123='[..]' [..] />"
+ where XML_ParserCreateNS is used to create the parser
+ (which needs argument "-n" when running xmlwf).
+ Impact is denial of service, or more.
+ #532 #538 CVE-2021-46143 (ZDI-CAN-16157) -- Fix integer overflow
+ on variable m_groupSize in function doProlog leading
+ to realloc acting as free.
+ Impact is denial of service or more.
+ #539 CVE-2022-22822 to CVE-2022-22827 -- Prevent integer overflows
+ near memory allocation at multiple places. Mitre assigned
+ a dedicated CVE for each involved internal C function:
+ - CVE-2022-22822 for function addBinding
+ - CVE-2022-22823 for function build_model
+ - CVE-2022-22824 for function defineAttribute
+ - CVE-2022-22825 for function lookup
+ - CVE-2022-22826 for function nextScaffoldPart
+ - CVE-2022-22827 for function storeAtts
+ Impact is denial of service or more.
+
+ Other changes:
+ #535 CMake: Make call to file(GENERATE [..]) work for CMake <3.19
+ #541 Autotools|CMake: MinGW: Make run.sh(.in) work for Cygwin
+ and MSYS2 by not going through Wine on these platforms
+ #527 #528 Address compiler warnings
+ #533 #543 Version info bumped from 9:2:8 to 9:3:8;
+ see https://verbump.de/ for what these numbers do
+
+ Infrastructure:
+ #536 CI: Check for realistic minimum CMake version
+ #529 #539 CI: Cover compilation with -m32
+ #529 CI: Store coverage reports as artifacts for download
+ #528 CI: Upgrade Clang from 11 to 13
+
+ Special thanks to:
+ An anonymous whitehat
+ Christopher Degawa
+ J. Peter Mugaas
+ Tyson Smith
+ and
+ GCC Farm Project
+ Trend Micro Zero Day Initiative
+
+Release 2.4.2 Sun December 19 2021
+ Other changes:
+ #509 #510 Link againgst libm for function "isnan"
+ #513 #514 Include expat_config.h as early as possible
+ #498 Autotools: Include files with release archives:
+ - buildconf.sh
+ - fuzz/*.c
+ #507 #519 Autotools: Sync CMake templates with CMake 3.20
+ #495 #524 CMake: MinGW: Fix pkg-config section "Libs" for
+ - non-release build types (e.g. -DCMAKE_BUILD_TYPE=Debug)
+ - multi-config CMake generators (e.g. Ninja Multi-Config)
+ #502 #503 docs: Document that function XML_GetBuffer may return NULL
+ when asking for a buffer of 0 (zero) bytes size
+ #522 #523 docs: Fix return value docs for both
+ XML_SetBillionLaughsAttackProtection* functions
+ #525 #526 Version info bumped from 9:1:8 to 9:2:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Donghee Na
+ Joergen Ibsen
+ Kai Pastor
+
+Release 2.4.1 Sun May 23 2021
+ Bug fixes:
+ #488 #490 Autotools: Fix installed header expat_config.h for multilib
+ systems; regression introduced in 2.4.0 by pull request #486
+
+ Other changes:
+ #491 #492 Version info bumped from 9:0:8 to 9:1:8;
+ see https://verbump.de/ for what these numbers do
+
+ Special thanks to:
+ Gentoo's QA check "multilib_check_headers"
+
+Release 2.4.0 Sun May 23 2021
+ Security fixes:
+ #34 #466 #484 CVE-2013-0340/CWE-776 -- Protect against billion laughs attacks
+ (denial-of-service; flavors targeting CPU time or RAM or both,
+ leveraging general entities or parameter entities or both)
+ by tracking and limiting the input amplification factor
+ (<amplification> := (<direct> + <indirect>) / <direct>).
+ By conservative default, amplification up to a factor of 100.0
+ is tolerated and rejection only starts after 8 MiB of output bytes
+ (=<direct> + <indirect>) have been processed.
+ The fix adds the following to the API:
+ - A new error code XML_ERROR_AMPLIFICATION_LIMIT_BREACH to
+ signals this specific condition.
+ - Two new API functions ..
+ - XML_SetBillionLaughsAttackProtectionMaximumAmplification and
+ - XML_SetBillionLaughsAttackProtectionActivationThreshold
+ .. to further tighten billion laughs protection parameters
+ when desired. Please see file "doc/reference.html" for details.
+ If you ever need to increase the defaults for non-attack XML
+ payload, please file a bug report with libexpat.
+ - Two new XML_FEATURE_* constants ..
+ - that can be queried using the XML_GetFeatureList function, and
+ - that are shown in "xmlwf -v" output.
+ - Two new environment variable switches ..
+ - EXPAT_ACCOUNTING_DEBUG=(0|1|2|3) and
+ - EXPAT_ENTITY_DEBUG=(0|1)
+ .. for runtime debugging of accounting and entity processing.
+ Specific behavior of these values may change in the future.
+ - Two new command line arguments "-a FACTOR" and "-b BYTES"
+ for xmlwf to further tighten billion laughs protection
+ parameters when desired.
+ If you ever need to increase the defaults for non-attack XML
+ payload, please file a bug report with libexpat.
+
+ Bug fixes:
+ #332 #470 For (non-default) compilation with -DEXPAT_MIN_SIZE=ON (CMake)
+ or CPPFLAGS=-DXML_MIN_SIZE (GNU Autotools): Fix segfault
+ for UTF-16 payloads containing CDATA sections.
+ #485 #486 Autotools: Fix generated CMake files for non-64bit and
+ non-Linux platforms (e.g. macOS and MinGW in particular)
+ that were introduced with release 2.3.0
+
+ Other changes:
+ #468 #469 xmlwf: Improve help output and the xmlwf man page
+ #463 xmlwf: Improve maintainability through some refactoring
+ #477 xmlwf: Fix man page DocBook validity
+ #456 Autotools: Sync CMake templates with CMake 3.18
+ #458 #459 CMake: Support absolute paths for both CMAKE_INSTALL_LIBDIR
+ and CMAKE_INSTALL_INCLUDEDIR
+ #471 #481 CMake: Add support for standard variable BUILD_SHARED_LIBS
+ #457 Unexpose symbol _INTERNAL_trim_to_complete_utf8_characters
+ #467 Resolve macro HAVE_EXPAT_CONFIG_H
+ #472 Delete unused legacy helper file "conftools/PrintPath"
+ #473 #483 Improve attribution
+ #464 #465 #477 doc/reference.html: Fix XHTML validity
+ #475 #478 doc/reference.html: Replace the 90s look by OK.css
+ #479 Version info bumped from 8:0:7 to 9:0:8
+ due to addition of new symbols and error codes;
+ see https://verbump.de/ for what these numbers do
+
+ Infrastructure:
+ #456 CI: Enable periodic runs
+ #457 CI: Start covering the list of exported symbols
+ #474 CI: Isolate coverage task
+ #476 #482 CI: Adapt to breaking changes in image "ubuntu-18.04"
+ #477 CI: Cover well-formedness and DocBook/XHTML validity
+ of doc/reference.html and doc/xmlwf.xml
+
+ Special thanks to:
+ Dimitry Andric
+ Eero Helenius
+ Nick Wellnhofer
+ Rhodri James
+ Tomas Korbar
+ Yury Gribov
+ and
+ Clang LeakSan
+ JetBrains
+ OSS-Fuzz
+
+Release 2.3.0 Thu March 25 2021
+ Bug fixes:
+ #438 When calling XML_ParseBuffer without a prior successful call to
+ XML_GetBuffer as a user, no longer trigger undefined behavior
+ (by adding an integer to a NULL pointer) but rather return
+ XML_STATUS_ERROR and set the error code to (new) code
+ XML_ERROR_NO_BUFFER. Found by UBSan (UndefinedBehaviorSanitizer)
+ of Clang 11 (but not Clang 9).
+ #444 xmlwf: Exit status 2 was used for both:
+ - malformed input files (documented) and
+ - invalid command-line arguments (undocumented).
+ The case of invalid command-line arguments now
+ has its own exit status 4, resolving the ambiguity.
+
+ Other changes:
+ #439 xmlwf: Add argument -k to allow continuing after
+ non-fatal errors
+ #439 xmlwf: Add section about exit status to the -h help output
+ #422 #426 #447 Windows: Drop support for Visual Studio <=14.0/2015
+ #434 Windows: CMake: Detect unsupported Visual Studio at
+ configure time (rather than at compile time)
+ #382 #428 testrunner: Make verbose mode (argument "-v") report
+ about passed tests, and make default mode report about
+ failures, as well.
+ #442 CMake: Call "enable_language(CXX)" prior to tinkering
+ with CMAKE_CXX_* variables
+ #448 Document use of libexpat from a CMake-based project
+ #451 Autotools: Install CMake files as generated by CMake 3.19.6
+ so that users with "find_package(expat [..] CONFIG [..])"
+ are served on distributions that are *not* using the CMake
+ build system inside for libexpat packaging
+ #436 #437 Autotools: Drop obsolescent macro AC_HEADER_STDC
+ #450 #452 Autotools: Resolve use of obsolete macro AC_CONFIG_HEADER
+ #441 Address compiler warnings
+ #443 Version info bumped from 7:12:6 to 8:0:7
+ due to addition of error code XML_ERROR_NO_BUFFER
+ (see https://verbump.de/ for what these numbers do)
+
+ Infrastructure:
+ #435 #446 Replace Travis CI by GitHub Actions
+
+ Special thanks to:
+ Alexander Richardson
+ Oleksandr Popovych
+ Thomas Beutlich
+ Tim Bray
+ and
+ Clang LeakSan, Clang 11 UBSan and the Clang team
Release 2.2.10 Sat October 3 2020
Bug fixes:
@@ -46,7 +901,7 @@ Release 2.2.10 Sat October 3 2020
#354 #355 ..
#356 #412 Address compiler warnings
#368 #369 Address pngcheck warnings with doc/*.png images
- Version info bumped from 7:11:6 to 7:12:6
+ #425 Version info bumped from 7:11:6 to 7:12:6
Special thanks to:
asavah
diff --git a/3rdparty/expat/ConfigureChecks.cmake b/3rdparty/expat/ConfigureChecks.cmake
index d85e48c972d..c06b2f27857 100644
--- a/3rdparty/expat/ConfigureChecks.cmake
+++ b/3rdparty/expat/ConfigureChecks.cmake
@@ -2,6 +2,7 @@ include(CheckCCompilerFlag)
include(CheckCSourceCompiles)
include(CheckIncludeFile)
include(CheckIncludeFiles)
+include(CheckLibraryExists)
include(CheckSymbolExists)
include(TestBigEndian)
@@ -45,18 +46,25 @@ else(WORDS_BIGENDIAN)
endif(WORDS_BIGENDIAN)
if(HAVE_SYS_TYPES_H)
- check_symbol_exists("off_t" "sys/types.h" OFF_T)
- check_symbol_exists("size_t" "sys/types.h" SIZE_T)
-else(HAVE_SYS_TYPES_H)
- set(OFF_T "long")
- set(SIZE_T "unsigned")
-endif(HAVE_SYS_TYPES_H)
+ check_c_source_compiles("
+ #include <sys/types.h>
+ int main(void) {
+ const off_t offset = -123;
+ return 0;
+ }"
+ HAVE_OFF_T)
+endif()
+
+if(NOT HAVE_OFF_T)
+ set(off_t "long")
+endif()
check_c_source_compiles("
+ #define _GNU_SOURCE
#include <stdlib.h> /* for NULL */
#include <unistd.h> /* for syscall */
#include <sys/syscall.h> /* for SYS_getrandom */
- int main() {
+ int main(void) {
syscall(SYS_getrandom, NULL, 0, 0);
return 0;
}"
@@ -64,3 +72,5 @@ check_c_source_compiles("
check_c_compiler_flag("-fno-strict-aliasing" FLAG_NO_STRICT_ALIASING)
check_c_compiler_flag("-fvisibility=hidden" FLAG_VISIBILITY)
+
+check_library_exists(m cos "" _EXPAT_LIBM_FOUND)
diff --git a/3rdparty/expat/Makefile.am b/3rdparty/expat/Makefile.am
index 5e1d37dd1a8..c20531a8d6c 100644
--- a/3rdparty/expat/Makefile.am
+++ b/3rdparty/expat/Makefile.am
@@ -6,7 +6,12 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2025 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2018 KangLin <kl222@126.com>
+# Copyright (c) 2022 Johnny Jazeix <jazeix@gmail.com>
+# Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+# Copyright (c) 2024 Alexander Bluhm <alexander.bluhm@gmx.net>
+# Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -53,20 +58,36 @@ pkgconfig_DATA = expat.pc
pkgconfigdir = $(libdir)/pkgconfig
+dist_cmake_DATA = \
+ cmake/autotools/expat.cmake
+
+nodist_cmake_DATA = \
+ cmake/autotools/expat-config-version.cmake \
+ cmake/autotools/expat-noconfig.cmake \
+ cmake/expat-config.cmake
+
+cmakedir = $(libdir)/cmake/expat-@PACKAGE_VERSION@
+
+
_EXTRA_DIST_CMAKE = \
- cmake/expat-config.cmake.in \
+ cmake/autotools/expat-noconfig__linux.cmake.in \
+ cmake/autotools/expat-noconfig__macos.cmake.in \
+ cmake/autotools/expat-noconfig__windows.cmake.in \
+ cmake/autotools/expat-package-init.cmake \
cmake/mingw-toolchain.cmake \
\
CMakeLists.txt \
CMake.README \
ConfigureChecks.cmake \
+ expat.pc.cmake \
expat_config.h.cmake
_EXTRA_DIST_WINDOWS = \
win32/build_expat_iss.bat \
win32/expat.iss \
win32/MANIFEST.txt \
- win32/README.txt
+ win32/README.txt \
+ win32/version.rc.cmake
EXTRA_DIST = \
$(_EXTRA_DIST_CMAKE) \
@@ -74,11 +95,16 @@ EXTRA_DIST = \
\
conftools/expat.m4 \
conftools/get-version.sh \
- conftools/PrintPath \
+ \
+ fuzz/xml_lpm_fuzzer.cpp \
+ fuzz/xml_lpm_fuzzer.proto \
+ fuzz/xml_parsebuffer_fuzzer.c \
+ fuzz/xml_parse_fuzzer.c \
\
xmlwf/xmlwf_helpgen.py \
xmlwf/xmlwf_helpgen.sh \
\
+ buildconf.sh \
Changes \
README.md \
\
@@ -92,10 +118,10 @@ buildlib:
@echo 'ERROR: is no longer supported. INSTEAD please:' >&2
@echo 'ERROR:' >&2
@echo 'ERROR: * Mass-patch Makefile.am, e.g.' >&2
- @echo 'ERROR: # find -name Makefile.am -exec sed \' >&2
+ @echo 'ERROR: # find . -name Makefile.am -exec sed \' >&2
@echo 'ERROR: -e "s,libexpat\.la,libexpatw.la," \' >&2
@echo 'ERROR: -e "s,libexpat_la,libexpatw_la," \' >&2
- @echo 'ERROR: -i {} +' >&2
+ @echo 'ERROR: -i.bak {} +' >&2
@echo 'ERROR:' >&2
@echo 'ERROR: * Run automake to re-generate Makefile.in files' >&2
@echo 'ERROR:' >&2
@@ -110,6 +136,11 @@ buildlib:
run-benchmark:
$(MAKE) -C tests/benchmark
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/recset.xml 65535 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_attr.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_cdata.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_comment.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_tag.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_text.xml 4096 3
.PHONY: download-xmlts-zip
download-xmlts-zip:
diff --git a/3rdparty/expat/Makefile.in b/3rdparty/expat/Makefile.in
index ab846398cb7..069ec4047ee 100644
--- a/3rdparty/expat/Makefile.in
+++ b/3rdparty/expat/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,12 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2025 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2018 KangLin <kl222@126.com>
+# Copyright (c) 2022 Johnny Jazeix <jazeix@gmail.com>
+# Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+# Copyright (c) 2024 Alexander Bluhm <alexander.bluhm@gmx.net>
+# Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -134,16 +139,20 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
- $(am__configure_deps) $(am__DIST_COMMON)
+ $(am__configure_deps) $(dist_cmake_DATA) $(am__DIST_COMMON)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = expat_config.h
-CONFIG_CLEAN_FILES = expat.pc run.sh
+CONFIG_CLEAN_FILES = expat.pc cmake/expat-config.cmake \
+ cmake/autotools/expat-config-version.cmake \
+ cmake/autotools/expat-noconfig.cmake run.sh
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -199,8 +208,9 @@ am__uninstall_files_from_dir = { \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
-am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
-DATA = $(pkgconfig_DATA)
+am__installdirs = "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(cmakedir)" \
+ "$(DESTDIR)$(pkgconfigdir)"
+DATA = $(dist_cmake_DATA) $(nodist_cmake_DATA) $(pkgconfig_DATA)
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
am__recursive_targets = \
@@ -227,18 +237,17 @@ am__define_uniq_tagged_files = \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-CSCOPE = cscope
DIST_SUBDIRS = lib examples tests xmlwf doc
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/expat.pc.in \
$(srcdir)/expat_config.h.in $(srcdir)/run.sh.in \
+ $(top_srcdir)/cmake/autotools/expat-config-version.cmake.in \
+ $(top_srcdir)/cmake/expat-config.cmake.in \
$(top_srcdir)/conftools/ar-lib $(top_srcdir)/conftools/compile \
$(top_srcdir)/conftools/config.guess \
$(top_srcdir)/conftools/config.sub \
$(top_srcdir)/conftools/install-sh \
$(top_srcdir)/conftools/ltmain.sh \
- $(top_srcdir)/conftools/missing AUTHORS COPYING \
+ $(top_srcdir)/conftools/missing AUTHORS COPYING README.md \
conftools/ar-lib conftools/compile conftools/config.guess \
conftools/config.sub conftools/depcomp conftools/install-sh \
conftools/ltmain.sh conftools/missing
@@ -281,6 +290,8 @@ DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.lz \
$(distdir).tar.xz
GZIP_ENV = --best
DIST_TARGETS = dist-lzip dist-xz dist-bzip2 dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
distuninstallcheck_listfiles = find . -type f -print
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@@ -301,8 +312,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -318,10 +331,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -331,6 +354,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -339,6 +364,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -360,9 +386,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -429,20 +458,34 @@ LIBTOOLFLAGS = --verbose
SUBDIRS = lib $(am__append_1) $(am__append_2) $(am__append_3)
pkgconfig_DATA = expat.pc
pkgconfigdir = $(libdir)/pkgconfig
+dist_cmake_DATA = \
+ cmake/autotools/expat.cmake
+
+nodist_cmake_DATA = \
+ cmake/autotools/expat-config-version.cmake \
+ cmake/autotools/expat-noconfig.cmake \
+ cmake/expat-config.cmake
+
+cmakedir = $(libdir)/cmake/expat-@PACKAGE_VERSION@
_EXTRA_DIST_CMAKE = \
- cmake/expat-config.cmake.in \
+ cmake/autotools/expat-noconfig__linux.cmake.in \
+ cmake/autotools/expat-noconfig__macos.cmake.in \
+ cmake/autotools/expat-noconfig__windows.cmake.in \
+ cmake/autotools/expat-package-init.cmake \
cmake/mingw-toolchain.cmake \
\
CMakeLists.txt \
CMake.README \
ConfigureChecks.cmake \
+ expat.pc.cmake \
expat_config.h.cmake
_EXTRA_DIST_WINDOWS = \
win32/build_expat_iss.bat \
win32/expat.iss \
win32/MANIFEST.txt \
- win32/README.txt
+ win32/README.txt \
+ win32/version.rc.cmake
EXTRA_DIST = \
$(_EXTRA_DIST_CMAKE) \
@@ -450,11 +493,16 @@ EXTRA_DIST = \
\
conftools/expat.m4 \
conftools/get-version.sh \
- conftools/PrintPath \
+ \
+ fuzz/xml_lpm_fuzzer.cpp \
+ fuzz/xml_lpm_fuzzer.proto \
+ fuzz/xml_parsebuffer_fuzzer.c \
+ fuzz/xml_parse_fuzzer.c \
\
xmlwf/xmlwf_helpgen.py \
xmlwf/xmlwf_helpgen.sh \
\
+ buildconf.sh \
Changes \
README.md \
\
@@ -467,7 +515,7 @@ all: expat_config.h
.SUFFIXES:
am--refresh: Makefile
@:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -493,9 +541,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
$(am__aclocal_m4_deps):
@@ -506,7 +554,7 @@ expat_config.h: stamp-h1
stamp-h1: $(srcdir)/expat_config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
cd $(top_builddir) && $(SHELL) ./config.status expat_config.h
-$(srcdir)/expat_config.h.in: $(am__configure_deps)
+$(srcdir)/expat_config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
rm -f stamp-h1
touch $@
@@ -515,6 +563,12 @@ distclean-hdr:
-rm -f expat_config.h stamp-h1
expat.pc: $(top_builddir)/config.status $(srcdir)/expat.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $@
+cmake/expat-config.cmake: $(top_builddir)/config.status $(top_srcdir)/cmake/expat-config.cmake.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+cmake/autotools/expat-config-version.cmake: $(top_builddir)/config.status $(top_srcdir)/cmake/autotools/expat-config-version.cmake.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+cmake/autotools/expat-noconfig.cmake: $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $@
run.sh: $(top_builddir)/config.status $(srcdir)/run.sh.in
cd $(top_builddir) && $(SHELL) ./config.status $@
@@ -526,6 +580,48 @@ clean-libtool:
distclean-libtool:
-rm -f libtool config.lt
+install-dist_cmakeDATA: $(dist_cmake_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
+ done
+
+uninstall-dist_cmakeDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
+install-nodist_cmakeDATA: $(nodist_cmake_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
+ done
+
+uninstall-nodist_cmakeDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
install-pkgconfigDATA: $(pkgconfig_DATA)
@$(NORMAL_INSTALL)
@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
@@ -653,7 +749,6 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
-
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
@@ -797,7 +892,7 @@ distcheck: dist
$(DISTCHECK_CONFIGURE_FLAGS) \
--srcdir=../.. --prefix="$$dc_install_base" \
&& $(MAKE) $(AM_MAKEFLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
@@ -853,7 +948,7 @@ check: check-recursive
all-am: Makefile $(DATA) expat_config.h
installdirs: installdirs-recursive
installdirs-am:
- for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
+ for dir in "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(pkgconfigdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-recursive
@@ -908,7 +1003,8 @@ info: info-recursive
info-am:
-install-data-am: install-pkgconfigDATA
+install-data-am: install-dist_cmakeDATA install-nodist_cmakeDATA \
+ install-pkgconfigDATA
install-dvi: install-dvi-recursive
@@ -954,7 +1050,8 @@ ps: ps-recursive
ps-am:
-uninstall-am: uninstall-pkgconfigDATA
+uninstall-am: uninstall-dist_cmakeDATA uninstall-nodist_cmakeDATA \
+ uninstall-pkgconfigDATA
.MAKE: $(am__recursive_targets) all install-am install-strip
@@ -966,14 +1063,16 @@ uninstall-am: uninstall-pkgconfigDATA
distclean-generic distclean-hdr distclean-libtool \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
+ install-data install-data-am install-dist_cmakeDATA \
+ install-dvi install-dvi-am install-exec install-exec-am \
+ install-html install-html-am install-info install-info-am \
+ install-man install-nodist_cmakeDATA install-pdf \
install-pdf-am install-pkgconfigDATA install-ps install-ps-am \
install-strip installcheck installcheck-am installdirs \
installdirs-am maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-dist_cmakeDATA uninstall-nodist_cmakeDATA \
uninstall-pkgconfigDATA
.PRECIOUS: Makefile
@@ -985,10 +1084,10 @@ buildlib:
@echo 'ERROR: is no longer supported. INSTEAD please:' >&2
@echo 'ERROR:' >&2
@echo 'ERROR: * Mass-patch Makefile.am, e.g.' >&2
- @echo 'ERROR: # find -name Makefile.am -exec sed \' >&2
+ @echo 'ERROR: # find . -name Makefile.am -exec sed \' >&2
@echo 'ERROR: -e "s,libexpat\.la,libexpatw.la," \' >&2
@echo 'ERROR: -e "s,libexpat_la,libexpatw_la," \' >&2
- @echo 'ERROR: -i {} +' >&2
+ @echo 'ERROR: -i.bak {} +' >&2
@echo 'ERROR:' >&2
@echo 'ERROR: * Run automake to re-generate Makefile.in files' >&2
@echo 'ERROR:' >&2
@@ -1002,6 +1101,11 @@ buildlib:
run-benchmark:
$(MAKE) -C tests/benchmark
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/recset.xml 65535 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_attr.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_cdata.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_comment.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_tag.xml 4096 3
+ ./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_text.xml 4096 3
.PHONY: download-xmlts-zip
download-xmlts-zip:
diff --git a/3rdparty/expat/README.md b/3rdparty/expat/README.md
index 428a11ab245..77c6bf27d30 100644
--- a/3rdparty/expat/README.md
+++ b/3rdparty/expat/README.md
@@ -1,26 +1,37 @@
-[![Travis CI Build Status](https://travis-ci.org/libexpat/libexpat.svg?branch=master)](https://travis-ci.org/libexpat/libexpat)
+[![Run Linux CI tasks](https://github.com/libexpat/libexpat/actions/workflows/linux.yml/badge.svg)](https://github.com/libexpat/libexpat/actions/workflows/linux.yml)
[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/libexpat/libexpat?svg=true)](https://ci.appveyor.com/project/libexpat/libexpat)
[![Packaging status](https://repology.org/badge/tiny-repos/expat.svg)](https://repology.org/metapackage/expat/versions)
+[![Downloads SourceForge](https://img.shields.io/sourceforge/dt/expat?label=Downloads%20SourceForge)](https://sourceforge.net/projects/expat/files/)
+[![Downloads GitHub](https://img.shields.io/github/downloads/libexpat/libexpat/total?label=Downloads%20GitHub)](https://github.com/libexpat/libexpat/releases)
+[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10205/badge)](https://www.bestpractices.dev/projects/10205)
+> [!CAUTION]
+>
+> Expat is **understaffed** and without funding.
+> There is a [call for help with details](https://github.com/libexpat/libexpat/blob/master/expat/Changes)
+> at the top of the `Changes` file.
-# Expat, Release 2.2.10
-This is Expat, a C library for parsing XML, started by
-[James Clark](https://en.wikipedia.org/wiki/James_Clark_(programmer)) in 1997.
+# Expat, Release 2.7.1
+
+This is Expat, a C99 library for parsing
+[XML 1.0 Fourth Edition](https://www.w3.org/TR/2006/REC-xml-20060816/), started by
+[James Clark](https://en.wikipedia.org/wiki/James_Clark_%28programmer%29) in 1997.
Expat is a stream-oriented XML parser. This means that you register
handlers with the parser before starting the parse. These handlers
are called when the parser discovers the associated structures in the
document being parsed. A start tag is an example of the kind of
structures for which you may register handlers.
-Expat supports the following compilers:
-- GNU GCC >=4.5
+Expat supports the following C99 compilers:
+
+- GNU GCC >=4.5 (for use from C) or GNU GCC >=4.8.1 (for use from C++)
- LLVM Clang >=3.5
-- Microsoft Visual Studio >=9.0/2008
+- Microsoft Visual Studio >=16.0/2019 (rolling `${today} minus 5 years`)
Windows users can use the
-[`expat_win32` package](https://sourceforge.net/projects/expat/files/expat_win32/),
-which includes both precompiled libraries and executables, and source code for
+[`expat-win32bin-*.*.*.{exe,zip}` download](https://github.com/libexpat/libexpat/releases),
+which includes both pre-compiled libraries and executables, and source code for
developers.
Expat is [free software](https://www.gnu.org/philosophy/free-sw.en.html).
@@ -30,6 +41,101 @@ contained in the file
distributed with this package.
This license is the same as the MIT/X Consortium license.
+
+## Using libexpat in your CMake-Based Project
+
+There are three documented ways of using libexpat with CMake:
+
+### a) `find_package` with Module Mode
+
+This approach leverages CMake's own [module `FindEXPAT`](https://cmake.org/cmake/help/latest/module/FindEXPAT.html).
+
+Notice the *uppercase* `EXPAT` in the following example:
+
+```cmake
+cmake_minimum_required(VERSION 3.10)
+
+project(hello VERSION 1.0.0)
+
+find_package(EXPAT 2.2.8 MODULE REQUIRED)
+
+add_executable(hello
+ hello.c
+)
+
+target_link_libraries(hello PUBLIC EXPAT::EXPAT)
+```
+
+### b) `find_package` with Config Mode
+
+This approach requires files from…
+
+- libexpat >=2.2.8 where packaging uses the CMake build system
+or
+- libexpat >=2.3.0 where packaging uses the GNU Autotools build system
+ on Linux
+or
+- libexpat >=2.4.0 where packaging uses the GNU Autotools build system
+ on macOS or MinGW.
+
+Notice the *lowercase* `expat` in the following example:
+
+```cmake
+cmake_minimum_required(VERSION 3.10)
+
+project(hello VERSION 1.0.0)
+
+find_package(expat 2.2.8 CONFIG REQUIRED char dtd ns)
+
+add_executable(hello
+ hello.c
+)
+
+target_link_libraries(hello PUBLIC expat::expat)
+```
+
+### c) The `FetchContent` module
+
+This approach — as demonstrated below — requires CMake >=3.18 for both the
+[`FetchContent` module](https://cmake.org/cmake/help/latest/module/FetchContent.html)
+and its support for the `SOURCE_SUBDIR` option to be available.
+
+Please note that:
+- Use of the `FetchContent` module with *non-release* SHA1s or `master`
+ of libexpat is neither advised nor considered officially supported.
+- Pinning to a specific commit is great for robust CI.
+- Pinning to a specific commit needs updating every time there is a new
+ release of libexpat — either manually or through automation —,
+ to not miss out on libexpat security updates.
+
+For an example that pulls in libexpat via Git:
+
+```cmake
+cmake_minimum_required(VERSION 3.18)
+
+include(FetchContent)
+
+project(hello VERSION 1.0.0)
+
+FetchContent_Declare(
+ expat
+ GIT_REPOSITORY https://github.com/libexpat/libexpat/
+ GIT_TAG 000000000_GIT_COMMIT_SHA1_HERE_000000000 # i.e. Git tag R_0_Y_Z
+ SOURCE_SUBDIR expat/
+)
+
+FetchContent_MakeAvailable(expat)
+
+add_executable(hello
+ hello.c
+)
+
+target_link_libraries(hello PUBLIC expat)
+```
+
+
+## Building from a Git Clone
+
If you are building Expat from a check-out from the
[Git repository](https://github.com/libexpat/libexpat/),
you need to run a script that generates the configure script using the
@@ -43,6 +149,11 @@ autoconf 2.58 or newer. Run the script like this:
Once this has been done, follow the same instructions as for building
from a source distribution.
+
+## Building from a Source Distribution
+
+### a) Building with the configure script (i.e. GNU Autotools)
+
To build Expat from a source distribution, you first run the
configuration shell script in the top level distribution directory:
@@ -88,10 +199,10 @@ support this mode of compilation (yet):
1. Mass-patch `Makefile.am` files to use `libexpatw.la` for a library name:
<br/>
- `find -name Makefile.am -exec sed
+ `find . -name Makefile.am -exec sed
-e 's,libexpat\.la,libexpatw.la,'
-e 's,libexpat_la,libexpatw_la,'
- -i {} +`
+ -i.bak {} +`
1. Run `automake` to re-write `Makefile.in` files:<br/>
`automake`
@@ -132,8 +243,14 @@ A reference manual is available in the file `doc/reference.html` in this
distribution.
-The CMake build system is still *experimental* and will replace the primary
+### b) Building with CMake
+
+The CMake build system is still *experimental* and may replace the primary
build system based on GNU Autotools at some point when it is ready.
+
+
+#### Available Options
+
For an idea of the available (non-advanced) options for building with CMake:
```console
@@ -147,37 +264,37 @@ CMAKE_INSTALL_PREFIX:PATH=/usr/local
// Path to a program.
DOCBOOK_TO_MAN:FILEPATH=/usr/bin/docbook2x-man
-// build man page for xmlwf
+// Build man page for xmlwf
EXPAT_BUILD_DOCS:BOOL=ON
-// build the examples for expat library
+// Build the examples for expat library
EXPAT_BUILD_EXAMPLES:BOOL=ON
-// build fuzzers for the expat library
+// Build fuzzers for the expat library
EXPAT_BUILD_FUZZERS:BOOL=OFF
-// build pkg-config file
+// Build pkg-config file
EXPAT_BUILD_PKGCONFIG:BOOL=ON
-// build the tests for expat library
+// Build the tests for expat library
EXPAT_BUILD_TESTS:BOOL=ON
-// build the xmlwf tool for expat library
+// Build the xmlwf tool for expat library
EXPAT_BUILD_TOOLS:BOOL=ON
// Character type to use (char|ushort|wchar_t) [default=char]
EXPAT_CHAR_TYPE:STRING=char
-// install expat files in cmake install target
+// Install expat files in cmake install target
EXPAT_ENABLE_INSTALL:BOOL=ON
// Use /MT flag (static CRT) when compiling in MSVC
EXPAT_MSVC_STATIC_CRT:BOOL=OFF
-// build fuzzers via ossfuzz for the expat library
+// Build fuzzers via OSS-Fuzz for the expat library
EXPAT_OSSFUZZ_BUILD:BOOL=OFF
-// build a shared expat library
+// Build a shared expat library
EXPAT_SHARED_LIBS:BOOL=ON
// Treat all compiler warnings as errors
@@ -186,7 +303,7 @@ EXPAT_WARNINGS_AS_ERRORS:BOOL=OFF
// Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]
EXPAT_WITH_GETRANDOM:STRING=AUTO
-// utilize libbsd (for arc4random_buf)
+// Utilize libbsd (for arc4random_buf)
EXPAT_WITH_LIBBSD:BOOL=OFF
// Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]
diff --git a/3rdparty/expat/acinclude.m4 b/3rdparty/expat/acinclude.m4
index 7277ab29bbb..498f709bdf9 100644
--- a/3rdparty/expat/acinclude.m4
+++ b/3rdparty/expat/acinclude.m4
@@ -8,5 +8,7 @@ m4_include(conftools/ax-append-flag.m4)
m4_include(conftools/ax-append-compile-flags.m4)
m4_include(conftools/ax-append-link-flags.m4)
m4_include(conftools/expatcfg-compiler-supports-visibility.m4)
+m4_include(conftools/ax-cxx-compile-stdcxx.m4)
+m4_include(conftools/ax-cxx-compile-stdcxx-11.m4)
### end of file
diff --git a/3rdparty/expat/aclocal.m4 b/3rdparty/expat/aclocal.m4
index b8cb1fc8ca0..8a0016bd4e2 100644
--- a/3rdparty/expat/aclocal.m4
+++ b/3rdparty/expat/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -14,13 +14,13 @@
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
-[m4_warning([this file was generated for autoconf 2.69.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],,
+[m4_warning([this file was generated for autoconf 2.71.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.16'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.16.2], [],
+m4_if([$1], [1.16.5], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -51,12 +51,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.2])dnl
+[AM_AUTOMAKE_VERSION([1.16.5])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Copyright (C) 2011-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -118,7 +118,7 @@ AC_SUBST([AR])dnl
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -170,7 +170,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -201,7 +201,7 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -392,7 +392,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -460,7 +460,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -488,6 +488,10 @@ m4_defn([AC_PROG_CC])
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
[AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -524,7 +528,7 @@ m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
[_AM_SET_OPTIONS([$1])dnl
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
m4_if(
- m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
[ok:ok],,
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
@@ -576,6 +580,20 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
[m4_define([AC_PROG_OBJCXX],
m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
AC_REQUIRE([AM_SILENT_RULES])dnl
dnl The testsuite driver may need to know about EXEEXT, so add the
dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
@@ -657,7 +675,7 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -678,7 +696,7 @@ if test x"${install_sh+set}" != xset; then
fi
AC_SUBST([install_sh])])
-# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -697,9 +715,45 @@ fi
rmdir .tst 2>/dev/null
AC_SUBST([am__leading_dot])])
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -742,7 +796,7 @@ AC_SUBST([am__quote])])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -763,12 +817,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
AC_REQUIRE_AUX_FILE([missing])dnl
if test x"${MISSING+set}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
- *)
- MISSING="\${SHELL} $am_aux_dir/missing" ;;
- esac
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
fi
# Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then
@@ -781,7 +830,7 @@ fi
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -810,7 +859,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -857,7 +906,7 @@ AC_LANG_POP([C])])
# For backward compatibility.
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -876,7 +925,7 @@ AC_DEFUN([AM_RUN_LOG],
# Check to make sure that the build environment is sane. -*- Autoconf -*-
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -957,7 +1006,7 @@ AC_CONFIG_COMMANDS_PRE(
rm -f conftest.file
])
-# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1017,7 +1066,7 @@ AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
])
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1045,7 +1094,7 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1064,7 +1113,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
diff --git a/3rdparty/expat/buildconf.sh b/3rdparty/expat/buildconf.sh
new file mode 100755
index 00000000000..4e506b30082
--- /dev/null
+++ b/3rdparty/expat/buildconf.sh
@@ -0,0 +1,35 @@
+#! /usr/bin/env bash
+# __ __ _
+# ___\ \/ /_ __ __ _| |_
+# / _ \\ /| '_ \ / _` | __|
+# | __// \| |_) | (_| | |_
+# \___/_/\_\ .__/ \__,_|\__|
+# |_| XML parser
+#
+# Copyright (c) 2017-2022 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+# Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
+# Licensed under the MIT license:
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+set -e
+
+exec autoreconf --warnings=all --install --verbose "$@"
diff --git a/3rdparty/expat/cmake/autotools/expat-config-version.cmake.in b/3rdparty/expat/cmake/autotools/expat-config-version.cmake.in
new file mode 100644
index 00000000000..17ab1924c35
--- /dev/null
+++ b/3rdparty/expat/cmake/autotools/expat-config-version.cmake.in
@@ -0,0 +1,65 @@
+# This is a basic version file for the Config-mode of find_package().
+# It is used by write_basic_package_version_file() as input file for configure_file()
+# to create a version-file which can be installed along a config.cmake file.
+#
+# The created file sets PACKAGE_VERSION_EXACT if the current version string and
+# the requested version string are exactly the same and it sets
+# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
+# but only if the requested major version is the same as the current one.
+# The variable CVF_VERSION must be set before calling configure_file().
+
+
+set(PACKAGE_VERSION "@PACKAGE_VERSION@")
+
+if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+
+ if("@PACKAGE_VERSION@" MATCHES "^([0-9]+)\\.")
+ set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
+ if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
+ string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
+ endif()
+ else()
+ set(CVF_VERSION_MAJOR "@PACKAGE_VERSION@")
+ endif()
+
+ if(PACKAGE_FIND_VERSION_RANGE)
+ # both endpoints of the range must have the expected major version
+ math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1")
+ if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
+ OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR)
+ OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT)))
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+ elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
+ AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX)
+ OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX)))
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ else()
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+ endif()
+ else()
+ if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ else()
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+ endif()
+
+ if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
+ set(PACKAGE_VERSION_EXACT TRUE)
+ endif()
+ endif()
+endif()
+
+
+# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
+if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "@SIZEOF_VOID_P@" STREQUAL "")
+ return()
+endif()
+
+# check that the installed version has the same 32/64bit-ness as the one which is currently searching:
+if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "@SIZEOF_VOID_P@")
+ math(EXPR installedBits "@SIZEOF_VOID_P@ * 8")
+ set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
+ set(PACKAGE_VERSION_UNSUITABLE TRUE)
+endif()
diff --git a/3rdparty/expat/cmake/autotools/expat-noconfig__linux.cmake.in b/3rdparty/expat/cmake/autotools/expat-noconfig__linux.cmake.in
new file mode 100644
index 00000000000..d0ad645c03f
--- /dev/null
+++ b/3rdparty/expat/cmake/autotools/expat-noconfig__linux.cmake.in
@@ -0,0 +1,19 @@
+#----------------------------------------------------------------
+# Generated CMake target import file for configuration "NoConfig".
+#----------------------------------------------------------------
+
+# Commands may need to know the format version.
+set(CMAKE_IMPORT_FILE_VERSION 1)
+
+# Import target "expat::expat" for configuration "NoConfig"
+set_property(TARGET expat::expat APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
+set_target_properties(expat::expat PROPERTIES
+ IMPORTED_LOCATION_NOCONFIG "${_IMPORT_PREFIX}/@LIBDIR_BASENAME@/libexpat.so.@SO_MAJOR@.@SO_MINOR@.@SO_PATCH@"
+ IMPORTED_SONAME_NOCONFIG "libexpat.so.@SO_MAJOR@"
+ )
+
+list(APPEND _cmake_import_check_targets expat::expat )
+list(APPEND _cmake_import_check_files_for_expat::expat "${_IMPORT_PREFIX}/@LIBDIR_BASENAME@/libexpat.so.@SO_MAJOR@.@SO_MINOR@.@SO_PATCH@" )
+
+# Commands beyond this point should not need to know the version.
+set(CMAKE_IMPORT_FILE_VERSION)
diff --git a/3rdparty/expat/cmake/autotools/expat-noconfig__macos.cmake.in b/3rdparty/expat/cmake/autotools/expat-noconfig__macos.cmake.in
new file mode 100644
index 00000000000..484e5bc6338
--- /dev/null
+++ b/3rdparty/expat/cmake/autotools/expat-noconfig__macos.cmake.in
@@ -0,0 +1,19 @@
+#----------------------------------------------------------------
+# Generated CMake target import file for configuration "NoConfig".
+#----------------------------------------------------------------
+
+# Commands may need to know the format version.
+set(CMAKE_IMPORT_FILE_VERSION 1)
+
+# Import target "expat::expat" for configuration "NoConfig"
+set_property(TARGET expat::expat APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
+set_target_properties(expat::expat PROPERTIES
+ IMPORTED_LOCATION_NOCONFIG "${_IMPORT_PREFIX}/@LIBDIR_BASENAME@/libexpat.@SO_MAJOR@.dylib"
+ IMPORTED_SONAME_NOCONFIG "@rpath/libexpat.@SO_MAJOR@.dylib"
+ )
+
+list(APPEND _cmake_import_check_targets expat::expat )
+list(APPEND _cmake_import_check_files_for_expat::expat "${_IMPORT_PREFIX}/@LIBDIR_BASENAME@/libexpat.@SO_MAJOR@.dylib" )
+
+# Commands beyond this point should not need to know the version.
+set(CMAKE_IMPORT_FILE_VERSION)
diff --git a/3rdparty/expat/cmake/autotools/expat-noconfig__windows.cmake.in b/3rdparty/expat/cmake/autotools/expat-noconfig__windows.cmake.in
new file mode 100644
index 00000000000..2f7454e2ca2
--- /dev/null
+++ b/3rdparty/expat/cmake/autotools/expat-noconfig__windows.cmake.in
@@ -0,0 +1,19 @@
+#----------------------------------------------------------------
+# Generated CMake target import file for configuration "NoConfig".
+#----------------------------------------------------------------
+
+# Commands may need to know the format version.
+set(CMAKE_IMPORT_FILE_VERSION 1)
+
+# Import target "expat::expat" for configuration "NoConfig"
+set_property(TARGET expat::expat APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
+set_target_properties(expat::expat PROPERTIES
+ IMPORTED_IMPLIB_NOCONFIG "${_IMPORT_PREFIX}/@LIBDIR_BASENAME@/libexpat.dll.a"
+ IMPORTED_LOCATION_NOCONFIG "${_IMPORT_PREFIX}/bin/@CMAKE_SHARED_LIBRARY_PREFIX@expat-@SO_MAJOR@.dll"
+ )
+
+list(APPEND _cmake_import_check_targets expat::expat )
+list(APPEND _cmake_import_check_files_for_expat::expat "${_IMPORT_PREFIX}/@LIBDIR_BASENAME@/libexpat.dll.a" "${_IMPORT_PREFIX}/bin/@CMAKE_SHARED_LIBRARY_PREFIX@expat-@SO_MAJOR@.dll" )
+
+# Commands beyond this point should not need to know the version.
+set(CMAKE_IMPORT_FILE_VERSION)
diff --git a/3rdparty/expat/cmake/autotools/expat-package-init.cmake b/3rdparty/expat/cmake/autotools/expat-package-init.cmake
new file mode 100644
index 00000000000..5cf17705329
--- /dev/null
+++ b/3rdparty/expat/cmake/autotools/expat-package-init.cmake
@@ -0,0 +1,25 @@
+
+####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
+####### Any changes to this file will be overwritten by the next CMake run ####
+####### The input file was expat-config.cmake.in ########
+
+get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
+
+macro(set_and_check _var _file)
+ set(${_var} "${_file}")
+ if(NOT EXISTS "${_file}")
+ message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
+ endif()
+endmacro()
+
+macro(check_required_components _NAME)
+ foreach(comp ${${_NAME}_FIND_COMPONENTS})
+ if(NOT ${_NAME}_${comp}_FOUND)
+ if(${_NAME}_FIND_REQUIRED_${comp})
+ set(${_NAME}_FOUND FALSE)
+ endif()
+ endif()
+ endforeach()
+endmacro()
+
+####################################################################################
diff --git a/3rdparty/expat/cmake/autotools/expat.cmake b/3rdparty/expat/cmake/autotools/expat.cmake
new file mode 100644
index 00000000000..ecb2df12ada
--- /dev/null
+++ b/3rdparty/expat/cmake/autotools/expat.cmake
@@ -0,0 +1,107 @@
+# Generated by CMake
+
+if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8)
+ message(FATAL_ERROR "CMake >= 2.8.12 required")
+endif()
+if(CMAKE_VERSION VERSION_LESS "2.8.12")
+ message(FATAL_ERROR "CMake >= 2.8.12 required")
+endif()
+cmake_policy(PUSH)
+cmake_policy(VERSION 2.8.12...3.29)
+#----------------------------------------------------------------
+# Generated CMake target import file.
+#----------------------------------------------------------------
+
+# Commands may need to know the format version.
+set(CMAKE_IMPORT_FILE_VERSION 1)
+
+# Protect against multiple inclusion, which would fail when already imported targets are added once more.
+set(_cmake_targets_defined "")
+set(_cmake_targets_not_defined "")
+set(_cmake_expected_targets "")
+foreach(_cmake_expected_target IN ITEMS expat::expat)
+ list(APPEND _cmake_expected_targets "${_cmake_expected_target}")
+ if(TARGET "${_cmake_expected_target}")
+ list(APPEND _cmake_targets_defined "${_cmake_expected_target}")
+ else()
+ list(APPEND _cmake_targets_not_defined "${_cmake_expected_target}")
+ endif()
+endforeach()
+unset(_cmake_expected_target)
+if(_cmake_targets_defined STREQUAL _cmake_expected_targets)
+ unset(_cmake_targets_defined)
+ unset(_cmake_targets_not_defined)
+ unset(_cmake_expected_targets)
+ unset(CMAKE_IMPORT_FILE_VERSION)
+ cmake_policy(POP)
+ return()
+endif()
+if(NOT _cmake_targets_defined STREQUAL "")
+ string(REPLACE ";" ", " _cmake_targets_defined_text "${_cmake_targets_defined}")
+ string(REPLACE ";" ", " _cmake_targets_not_defined_text "${_cmake_targets_not_defined}")
+ message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_cmake_targets_defined_text}\nTargets not yet defined: ${_cmake_targets_not_defined_text}\n")
+endif()
+unset(_cmake_targets_defined)
+unset(_cmake_targets_not_defined)
+unset(_cmake_expected_targets)
+
+
+# Compute the installation prefix relative to this file.
+get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+if(_IMPORT_PREFIX STREQUAL "/")
+ set(_IMPORT_PREFIX "")
+endif()
+
+# Create imported target expat::expat
+add_library(expat::expat SHARED IMPORTED)
+
+set_target_properties(expat::expat PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
+ INTERFACE_LINK_LIBRARIES "m"
+)
+
+# Load information for each installed configuration.
+file(GLOB _cmake_config_files "${CMAKE_CURRENT_LIST_DIR}/expat-*.cmake")
+foreach(_cmake_config_file IN LISTS _cmake_config_files)
+ include("${_cmake_config_file}")
+endforeach()
+unset(_cmake_config_file)
+unset(_cmake_config_files)
+
+# Cleanup temporary variables.
+set(_IMPORT_PREFIX)
+
+# Loop over all imported files and verify that they actually exist
+foreach(_cmake_target IN LISTS _cmake_import_check_targets)
+ if(CMAKE_VERSION VERSION_LESS "3.28"
+ OR NOT DEFINED _cmake_import_check_xcframework_for_${_cmake_target}
+ OR NOT IS_DIRECTORY "${_cmake_import_check_xcframework_for_${_cmake_target}}")
+ foreach(_cmake_file IN LISTS "_cmake_import_check_files_for_${_cmake_target}")
+ if(NOT EXISTS "${_cmake_file}")
+ message(FATAL_ERROR "The imported target \"${_cmake_target}\" references the file
+ \"${_cmake_file}\"
+but this file does not exist. Possible reasons include:
+* The file was deleted, renamed, or moved to another location.
+* An install or uninstall procedure did not complete successfully.
+* The installation package was faulty and contained
+ \"${CMAKE_CURRENT_LIST_FILE}\"
+but not all the files it references.
+")
+ endif()
+ endforeach()
+ endif()
+ unset(_cmake_file)
+ unset("_cmake_import_check_files_for_${_cmake_target}")
+endforeach()
+unset(_cmake_target)
+unset(_cmake_import_check_targets)
+
+# This file does not depend on other imported targets which have
+# been exported from the same project but in a separate export set.
+
+# Commands beyond this point should not need to know the version.
+set(CMAKE_IMPORT_FILE_VERSION)
+cmake_policy(POP)
diff --git a/3rdparty/expat/cmake/mingw-toolchain.cmake b/3rdparty/expat/cmake/mingw-toolchain.cmake
index 31a238b05ca..9032d9e5522 100644
--- a/3rdparty/expat/cmake/mingw-toolchain.cmake
+++ b/3rdparty/expat/cmake/mingw-toolchain.cmake
@@ -31,6 +31,7 @@ set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
+set(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
set(WIN32 ON)
set(MINGW ON)
diff --git a/3rdparty/expat/configure b/3rdparty/expat/configure
index 947bc0ebcde..54b6f929686 100755
--- a/3rdparty/expat/configure
+++ b/3rdparty/expat/configure
@@ -1,11 +1,12 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for expat 2.2.10.
+# Generated by GNU Autoconf 2.71 for expat 2.7.1.
#
-# Report bugs to <expat-bugs@libexpat.org>.
+# Report bugs to <https://github.com/libexpat/libexpat/issues>.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -16,14 +17,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -33,46 +36,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -96,8 +92,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -109,30 +109,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -154,20 +134,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -187,12 +169,15 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
@@ -207,30 +192,38 @@ test -x / || exit 1"
test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
|| test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -238,14 +231,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -263,22 +263,23 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: expat-bugs@libexpat.org about your system, including
-$0: any error possibly output before this message. Then
-$0: install a modern shell, or manually run the script
-$0: under such a shell if you do have one."
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
+$0: https://github.com/libexpat/libexpat/issues about your
+$0: system, including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
fi
exit 1
fi
@@ -302,6 +303,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -319,6 +321,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -333,7 +343,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -342,7 +352,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -381,12 +391,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -398,18 +409,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -421,9 +441,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -450,7 +470,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -494,7 +514,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -508,6 +528,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -521,6 +545,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -590,66 +621,86 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='expat'
PACKAGE_TARNAME='expat'
-PACKAGE_VERSION='2.2.10'
-PACKAGE_STRING='expat 2.2.10'
-PACKAGE_BUGREPORT='expat-bugs@libexpat.org'
+PACKAGE_VERSION='2.7.1'
+PACKAGE_STRING='expat 2.7.1'
+PACKAGE_BUGREPORT='https://github.com/libexpat/libexpat/issues'
PACKAGE_URL=''
ac_unique_file="Makefile.in"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
-ac_header_list=
+ac_header_c_list=
+ac_func_c_list=
ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
-_EXPAT_OUTPUT_NAME
+CMAKE_SHARED_LIBRARY_PREFIX
AM_LDFLAGS
AM_CXXFLAGS
AM_CFLAGS
AM_CPPFLAGS
-WITH_DOCBOOK_FALSE
-WITH_DOCBOOK_TRUE
+SIZEOF_VOID_P
+SO_PATCH
+SO_MINOR
+SO_MAJOR
+LIBDIR_BASENAME
+EXPAT_CHAR_TYPE
+EXPAT_CONTEXT_BYTES
+EXPAT_NS
+EXPAT_MIN_SIZE
+EXPAT_LARGE_SIZE
+EXPAT_DTD
+EXPAT_ATTR_INFO
+WITH_DISTRIBUTABLE_MANPAGE_FALSE
+WITH_DISTRIBUTABLE_MANPAGE_TRUE
+WITH_PREBUILT_MANPAGE_FALSE
+WITH_PREBUILT_MANPAGE_TRUE
+WITH_MANPAGE_FALSE
+WITH_MANPAGE_TRUE
DOCBOOK_TO_MAN
FILEMAP
+LIBM
+_INTERNAL_LARGE_SIZE_FALSE
+_INTERNAL_LARGE_SIZE_TRUE
+_INTERNAL_MIN_SIZE_FALSE
+_INTERNAL_MIN_SIZE_TRUE
+_INTERNAL_UNICODE_WCHAR_T_FALSE
+_INTERNAL_UNICODE_WCHAR_T_TRUE
UNICODE_FALSE
UNICODE_TRUE
MINGW_FALSE
MINGW_TRUE
+HAVE_CXX11
WITH_TESTS_FALSE
WITH_TESTS_TRUE
WITH_EXAMPLES_FALSE
@@ -666,7 +717,6 @@ CXX
LIBAGE
LIBREVISION
LIBCURRENT
-CPP
LT_SYS_LIBRARY_PATH
OTOOL64
OTOOL
@@ -675,6 +725,7 @@ NMEDIT
DSYMUTIL
MANIFEST_TOOL
RANLIB
+FILECMD
NM
ac_ct_DUMPBIN
DUMPBIN
@@ -706,10 +757,16 @@ CFLAGS
CC
ac_ct_AR
AR
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
AM_V
+CSCOPE
+ETAGS
+CTAGS
am__untar
am__tar
AMTAR
@@ -781,15 +838,18 @@ PACKAGE_NAME
PATH_SEPARATOR
SHELL
am__quote'
-ac_subst_files=''
+ac_subst_files='PACKAGE_INIT'
ac_user_opts='
enable_option_checking
enable_silent_rules
+enable_maintainer_mode
enable_dependency_tracking
enable_shared
enable_static
+enable_pic
with_pic
enable_fast_install
+enable_aix_soname
with_aix_soname
with_gnu_ld
with_sysroot
@@ -813,7 +873,6 @@ LDFLAGS
LIBS
CPPFLAGS
LT_SYS_LIBRARY_PATH
-CPP
CXX
CXXFLAGS
CCC
@@ -887,8 +946,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -929,9 +986,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -955,9 +1012,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1168,9 +1225,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1184,9 +1241,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1230,9 +1287,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1248,7 +1305,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1312,7 +1369,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1369,7 +1426,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures expat 2.2.10 to adapt to many kinds of systems.
+\`configure' configures expat 2.7.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1440,7 +1497,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of expat 2.2.10:";;
+ short | recursive ) echo "Configuration of expat 2.7.1:";;
esac
cat <<\_ACEOF
@@ -1450,14 +1507,22 @@ Optional Features:
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-silent-rules less verbose build output (undo: "make V=1")
--disable-silent-rules verbose build output (undo: "make V=0")
+ --disable-maintainer-mode
+ disable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
--enable-dependency-tracking
do not reject slow dependency extractors
--disable-dependency-tracking
speeds up one-time build
--enable-shared[=PKGS] build shared libraries [default=yes]
--enable-static[=PKGS] build static libraries [default=yes]
+ --enable-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
+ both]
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
+ --enable-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
--disable-libtool-lock avoid locking (might break parallel builds)
--enable-xml-attr-info Enable retrieving the byte offsets for attribute
names and values [default=no]
@@ -1469,11 +1534,6 @@ Optional Features:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
- both]
- --with-aix-soname=aix|svr4|both
- shared library versioning (aka "SONAME") variant to
- provide on AIX, [default=aix].
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-sysroot[=DIR] Search for dependent libraries within DIR (or the
compiler's sysroot if not specified).
@@ -1501,7 +1561,6 @@ Some influential environment variables:
you have headers in a nonstandard directory <include dir>
LT_SYS_LIBRARY_PATH
User-defined run-time library search path.
- CPP C preprocessor
CXX C++ compiler command
CXXFLAGS C++ compiler flags
CXXCPP C++ preprocessor
@@ -1511,7 +1570,7 @@ Some influential environment variables:
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
-Report bugs to <expat-bugs@libexpat.org>.
+Report bugs to <https://github.com/libexpat/libexpat/issues>.
_ACEOF
ac_status=$?
fi
@@ -1527,9 +1586,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1557,7 +1616,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1565,7 +1625,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1574,10 +1634,10 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-expat configure 2.2.10
-generated by GNU Autoconf 2.69
+expat configure 2.7.1
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1594,14 +1654,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1609,14 +1669,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1632,14 +1693,14 @@ fi
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1647,17 +1708,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1679,120 +1741,44 @@ fi
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -1800,16 +1786,9 @@ else
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (void); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -1818,7 +1797,7 @@ else
#ifdef __cplusplus
extern "C"
#endif
-char $2 ();
+char $2 (void);
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
@@ -1827,24 +1806,25 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
@@ -1855,14 +1835,14 @@ $as_echo "$ac_res" >&6; }
ac_fn_cxx_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1870,14 +1850,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_cxx_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1899,7 +1880,7 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1907,14 +1888,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
test ! -s conftest.err
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1930,14 +1912,14 @@ fi
ac_fn_cxx_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1945,17 +1927,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_cxx_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1970,6 +1953,49 @@ fi
} # ac_fn_cxx_try_link
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -1977,17 +2003,18 @@ fi
ac_fn_c_check_type ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof ($2))
return 0;
@@ -1995,12 +2022,13 @@ if (sizeof ($2))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof (($2)))
return 0;
@@ -2008,120 +2036,239 @@ if (sizeof (($2)))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
eval "$3=yes"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
-#include <$2>
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid; break
+else $as_nop
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <$2>
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=$ac_mid; break
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ ac_lo= ac_hi=
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## -------------------------------------- ##
-## Report this to expat-bugs@libexpat.org ##
-## -------------------------------------- ##"
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main (void)
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else $as_nop
+ ac_retval=1
fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
-} # ac_fn_c_check_header_mongrel
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by expat $as_me 2.2.10, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+It was created by expat $as_me 2.7.1, which was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2154,8 +2301,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2190,7 +2341,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2225,11 +2376,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2240,8 +2393,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2265,7 +2418,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2273,14 +2426,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2288,15 +2441,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2304,8 +2457,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2319,63 +2472,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2385,22 +2523,651 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
-as_fn_append ac_header_list " stdlib.h"
-as_fn_append ac_header_list " unistd.h"
-as_fn_append ac_header_list " sys/param.h"
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (char **p, int i)
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+extern void free (void *);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H"
+as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="ltmain.sh compile ar-lib missing install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}/conftools"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2411,12 +3178,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2425,24 +3192,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2452,11 +3219,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2472,56 +3240,32 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in conftools "$srcdir"/conftools; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in conftools \"$srcdir\"/conftools" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2540,21 +3284,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2575,7 +3320,8 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
am__api_version='1.16'
-# Find a good install program. We prefer a C program (faster),
+
+ # Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
@@ -2589,20 +3335,25 @@ am__api_version='1.16'
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
- ./ | .// | /[cC]/* | \
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
/etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
/usr/ucb/* ) ;;
@@ -2612,13 +3363,13 @@ case $as_dir/ in #((
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# program-specific install script used by HP pwplus--don't use.
:
else
@@ -2626,12 +3377,12 @@ case $as_dir/ in #((
echo one > conftest.one
echo two > conftest.two
mkdir conftest.dir
- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
test -s conftest.one && test -s conftest.two &&
test -s conftest.dir/conftest.one &&
test -s conftest.dir/conftest.two
then
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
break 3
fi
fi
@@ -2647,7 +3398,7 @@ IFS=$as_save_IFS
rm -rf conftest.one conftest.two conftest.dir
fi
- if test "${ac_cv_path_install+set}" = set; then
+ if test ${ac_cv_path_install+y}; then
INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. Don't cache a
@@ -2657,8 +3408,8 @@ fi
INSTALL=$ac_install_sh
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
@@ -2668,8 +3419,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
# Reject unsafe characters in $srcdir or the absolute working directory
# name. Accept space and tab only in the latter.
am_lf='
@@ -2723,8 +3474,8 @@ else
as_fn_error $? "newly created file is older than distributed files!
Check your system clock" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
# If we didn't sleep, we still need to ensure time stamps of config.status and
# generated files are strictly newer.
am_sleep_pid=
@@ -2743,26 +3494,23 @@ test "$program_suffix" != NONE &&
# Double any \ or $.
# By default was `s,x,x', remove it if useless.
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
# Expand $ac_aux_dir to an absolute path.
am_aux_dir=`cd "$ac_aux_dir" && pwd`
-if test x"${MISSING+set}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
- *)
- MISSING="\${SHELL} $am_aux_dir/missing" ;;
- esac
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
fi
# Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then
am_missing_run="$MISSING "
else
am_missing_run=
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
fi
if test x"${install_sh+set}" != xset; then
@@ -2782,11 +3530,12 @@ if test "$cross_compiling" != no; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$STRIP"; then
ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
@@ -2794,11 +3543,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2809,11 +3562,11 @@ fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2822,11 +3575,12 @@ if test -z "$ac_cv_prog_STRIP"; then
ac_ct_STRIP=$STRIP
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_STRIP"; then
ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
@@ -2834,11 +3588,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2849,11 +3607,11 @@ fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_STRIP" = x; then
@@ -2861,8 +3619,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
STRIP=$ac_ct_STRIP
@@ -2874,25 +3632,31 @@ fi
fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
if test -z "$MKDIR_P"; then
- if ${ac_cv_path_mkdir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_prog in mkdir gmkdir; do
for ac_exec_ext in '' $ac_executable_extensions; do
- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
- case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
- 'mkdir (GNU coreutils) '* | \
- 'mkdir (coreutils) '* | \
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
'mkdir (fileutils) '4.1*)
- ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
break 3;;
esac
done
@@ -2903,7 +3667,7 @@ IFS=$as_save_IFS
fi
test -d ./--version && rmdir ./--version
- if test "${ac_cv_path_mkdir+set}" = set; then
+ if test ${ac_cv_path_mkdir+y}; then
MKDIR_P="$ac_cv_path_mkdir -p"
else
# As a last resort, use the slow shell script. Don't cache a
@@ -2913,18 +3677,19 @@ fi
MKDIR_P="$ac_install_sh -d"
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
for ac_prog in gawk mawk nawk awk
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$AWK"; then
ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
@@ -2932,11 +3697,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_AWK="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2947,24 +3716,25 @@ fi
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$AWK" && break
done
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
@@ -2980,12 +3750,12 @@ esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
SET_MAKE=
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
SET_MAKE="MAKE=${MAKE-make}"
fi
@@ -2999,7 +3769,8 @@ fi
rmdir .tst 2>/dev/null
# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
+if test ${enable_silent_rules+y}
+then :
enableval=$enable_silent_rules;
fi
@@ -3009,12 +3780,13 @@ case $enable_silent_rules in # (((
*) AM_DEFAULT_VERBOSITY=1;;
esac
am_make=${MAKE-make}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
-$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
-if ${am_cv_make_support_nested_variables+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if $as_echo 'TRUE=$(BAR$(V))
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
BAR0=false
BAR1=true
V=1
@@ -3026,8 +3798,8 @@ else
am_cv_make_support_nested_variables=no
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
-$as_echo "$am_cv_make_support_nested_variables" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
if test $am_cv_make_support_nested_variables = yes; then
AM_V='$(V)'
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
@@ -3059,17 +3831,13 @@ fi
# Define the identity of the package.
PACKAGE='expat'
- VERSION='2.2.10'
+ VERSION='2.7.1'
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
# Some tools Automake needs.
@@ -3109,6 +3877,20 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
# POSIX will say in a future version that running "rm -f" with no argument
# is OK; and we want to be able to make that assumption in our Makefile
@@ -3153,53 +3935,56 @@ END
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=yes
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+ # to allow argument --disable-maintainer-mode
+
+
+
+LIBCURRENT=11 # sync
+LIBREVISION=2 # with
+LIBAGE=10 # CMakeLists.txt!
+
+ac_config_headers="$ac_config_headers expat_config.h"
+
-LIBCURRENT=7 # sync
-LIBREVISION=12 # with
-LIBAGE=6 # CMakeLists.txt!
-if ${AM_CPPFLAGS+:} false; then :
- case " $AM_CPPFLAGS " in #(
- *" -DHAVE_EXPAT_CONFIG_H "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DHAVE_EXPAT_CONFIG_H"; } >&5
- (: AM_CPPFLAGS already contains -DHAVE_EXPAT_CONFIG_H) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } ;; #(
- *) :
- as_fn_append AM_CPPFLAGS " -DHAVE_EXPAT_CONFIG_H"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5
- (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- ;;
-esac
-else
- AM_CPPFLAGS=-DHAVE_EXPAT_CONFIG_H
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5
- (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-fi
-ac_config_headers="$ac_config_headers expat_config.h"
DEPDIR="${am__leading_dot}deps"
ac_config_commands="$ac_config_commands depfiles"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
-$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
cat > confinc.mk << 'END'
am__doit:
@echo this is the am__doit target >confinc.out
@@ -3235,11 +4020,12 @@ esac
fi
done
rm -f confinc.* confmf.*
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
-$as_echo "${_am_result}" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
+if test ${enable_dependency_tracking+y}
+then :
enableval=$enable_dependency_tracking;
fi
@@ -3265,11 +4051,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -3277,11 +4064,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3292,11 +4083,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3305,11 +4096,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -3317,11 +4109,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3332,11 +4128,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -3344,8 +4140,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -3358,11 +4154,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -3370,11 +4167,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3385,11 +4186,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3398,11 +4199,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -3411,15 +4213,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3435,18 +4241,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3457,11 +4263,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -3469,11 +4276,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3484,11 +4295,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3501,11 +4312,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -3513,11 +4325,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3528,11 +4344,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3544,8 +4360,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -3553,25 +4369,129 @@ esac
fi
fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -3581,7 +4501,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -3589,7 +4509,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3601,9 +4521,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -3624,11 +4544,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -3645,7 +4566,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -3661,44 +4582,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -3712,15 +4635,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -3729,7 +4652,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -3741,8 +4664,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -3750,10 +4673,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -3761,39 +4684,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3807,11 +4731,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -3820,31 +4745,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3854,29 +4780,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -3885,57 +4815,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3950,94 +4883,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -4046,21 +5029,23 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_ext=c
+
+ ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
-$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
-if ${am_cv_prog_cc_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -4088,8 +5073,8 @@ _ACEOF
rm -f core conftest*
unset am_i
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
-$as_echo "$am_cv_prog_cc_c_o" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
if test "$am_cv_prog_cc_c_o" != yes; then
# Losing compiler, so override with the script.
# FIXME: It is wrong to rewrite CC.
@@ -4107,11 +5092,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
depcc="$CC" am_compiler_list=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
@@ -4218,8 +5204,8 @@ else
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
if
@@ -4234,16 +5220,18 @@ fi
-if test -n "$ac_tool_prefix"; then
+
+ if test -n "$ac_tool_prefix"; then
for ac_prog in ar lib "link -lib"
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
@@ -4251,11 +5239,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4266,11 +5258,11 @@ fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4283,11 +5275,12 @@ if test -z "$AR"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_AR"; then
ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
@@ -4295,11 +5288,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AR="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4310,11 +5307,11 @@ fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4326,8 +5323,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
AR=$ac_ct_AR
@@ -4336,11 +5333,12 @@ fi
: ${AR=ar}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
-$as_echo_n "checking the archiver ($AR) interface... " >&6; }
-if ${am_cv_ar_interface+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
+printf %s "checking the archiver ($AR) interface... " >&6; }
+if test ${am_cv_ar_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -4352,12 +5350,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
/* end confdefs.h. */
int some_variable = 0;
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
(eval $am_ar_try) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if test "$ac_status" -eq 0; then
am_cv_ar_interface=ar
@@ -4366,7 +5365,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
(eval $am_ar_try) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if test "$ac_status" -eq 0; then
am_cv_ar_interface=lib
@@ -4377,7 +5376,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
rm -f conftest.lib libconftest.a
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -4385,8 +5384,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
-$as_echo "$am_cv_ar_interface" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
+printf "%s\n" "$am_cv_ar_interface" >&6; }
case $am_cv_ar_interface in
ar)
@@ -4406,24 +5405,25 @@ unknown)
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
@@ -4439,12 +5439,12 @@ esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
SET_MAKE=
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
SET_MAKE="MAKE=${MAKE-make}"
fi
@@ -4452,14 +5452,15 @@ fi
case `pwd` in
*\ * | *\ *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
esac
-macro_version='2.4.6'
-macro_revision='2.4.6'
+macro_version='2.5.4'
+macro_revision='2.5.4'
+
@@ -4496,8 +5497,8 @@ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+printf %s "checking how to print strings... " >&6; }
# Test print first, because it will be a builtin if present.
if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
@@ -4523,12 +5524,12 @@ func_echo_all ()
}
case $ECHO in
- printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
- print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
+ printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+printf "%s\n" "printf" >&6; } ;;
+ print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+printf "%s\n" "print -r" >&6; } ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+printf "%s\n" "cat" >&6; } ;;
esac
@@ -4544,11 +5545,12 @@ esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
for ac_i in 1 2 3 4 5 6 7; do
ac_script="$ac_script$as_nl$ac_script"
@@ -4562,10 +5564,15 @@ else
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in sed gsed; do
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
# Check for GNU $ac_path_SED
@@ -4574,13 +5581,13 @@ case `"$ac_path_SED" --version 2>&1` in
ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
+ printf %s 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
- $as_echo '' >> "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
"$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -4608,8 +5615,8 @@ else
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
SED="$ac_cv_path_SED"
rm -f conftest.sed
@@ -4626,11 +5633,12 @@ Xsed="$SED -e 1s/^X//"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -z "$GREP"; then
ac_path_GREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
@@ -4638,10 +5646,15 @@ else
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP
@@ -4650,13 +5663,13 @@ case `"$ac_path_GREP" --version 2>&1` in
ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
+ printf %s 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
"$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -4684,16 +5697,17 @@ else
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
GREP="$ac_cv_path_GREP"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
then ac_cv_path_EGREP="$GREP -E"
else
@@ -4704,10 +5718,15 @@ else
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
@@ -4716,13 +5735,13 @@ case `"$ac_path_EGREP" --version 2>&1` in
ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
+ printf %s 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
"$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -4751,16 +5770,17 @@ fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+printf %s "checking for fgrep... " >&6; }
+if test ${ac_cv_path_FGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
then ac_cv_path_FGREP="$GREP -F"
else
@@ -4771,10 +5791,15 @@ else
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in fgrep; do
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in fgrep
+ do
for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+ ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_FGREP" || continue
# Check for GNU ac_path_FGREP and select it if it is found.
# Check for GNU $ac_path_FGREP
@@ -4783,13 +5808,13 @@ case `"$ac_path_FGREP" --version 2>&1` in
ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
*)
ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
+ printf %s 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
- $as_echo 'FGREP' >> "conftest.nl"
+ printf "%s\n" 'FGREP' >> "conftest.nl"
"$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -4818,8 +5843,8 @@ fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+printf "%s\n" "$ac_cv_path_FGREP" >&6; }
FGREP="$ac_cv_path_FGREP"
@@ -4844,19 +5869,20 @@ test -z "$GREP" && GREP=grep
# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
+if test ${with_gnu_ld+y}
+then :
withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
-else
+else $as_nop
with_gnu_ld=no
fi
ac_prog=ld
if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
case $host in
- *-*-mingw*)
+ *-*-mingw* | *-*-windows*)
# gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
@@ -4883,15 +5909,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
;;
esac
elif test yes = "$with_gnu_ld"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
fi
-if ${lt_cv_path_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -z "$LD"; then
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
@@ -4920,18 +5947,19 @@ fi
LD=$lt_cv_path_LD
if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
@@ -4942,8 +5970,8 @@ case `$LD -v 2>&1 </dev/null` in
;;
esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -4954,11 +5982,12 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if ${lt_cv_path_NM+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test ${lt_cv_path_NM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$NM"; then
# Let the user override the test.
lt_cv_path_NM=$NM
@@ -4980,16 +6009,16 @@ else
# Tru64's nm complains that /dev/null is an invalid object file
# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
case $build_os in
- mingw*) lt_bad_file=conftest.nm/nofile ;;
+ mingw* | windows*) lt_bad_file=conftest.nm/nofile ;;
*) lt_bad_file=/dev/null ;;
esac
- case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
*$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break 2
;;
*)
- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break 2
@@ -5008,8 +6037,8 @@ else
: ${lt_cv_path_NM=no}
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+printf "%s\n" "$lt_cv_path_NM" >&6; }
if test no != "$lt_cv_path_NM"; then
NM=$lt_cv_path_NM
else
@@ -5022,11 +6051,12 @@ else
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DUMPBIN"; then
ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
else
@@ -5034,11 +6064,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5049,11 +6083,11 @@ fi
fi
DUMPBIN=$ac_cv_prog_DUMPBIN
if test -n "$DUMPBIN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+printf "%s\n" "$DUMPBIN" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5066,11 +6100,12 @@ if test -z "$DUMPBIN"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DUMPBIN"; then
ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
else
@@ -5078,11 +6113,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5093,11 +6132,11 @@ fi
fi
ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
if test -n "$ac_ct_DUMPBIN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+printf "%s\n" "$ac_ct_DUMPBIN" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5109,15 +6148,15 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DUMPBIN=$ac_ct_DUMPBIN
fi
fi
- case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
*COFF*)
DUMPBIN="$DUMPBIN -symbols -headers"
;;
@@ -5138,11 +6177,12 @@ test -z "$NM" && NM=nm
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if ${lt_cv_nm_interface+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+printf %s "checking the name lister ($NM) interface... " >&6; }
+if test ${lt_cv_nm_interface+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
(eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
@@ -5158,15 +6198,16 @@ else
fi
rm -f conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+printf "%s\n" "$lt_cv_nm_interface" >&6; }
# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if ${lt_cv_sys_max_cmd_len+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+printf %s "checking the maximum length of command line arguments... " >&6; }
+if test ${lt_cv_sys_max_cmd_len+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
i=0
teststring=ABCD
@@ -5179,14 +6220,14 @@ else
lt_cv_sys_max_cmd_len=12288; # 12K is about right
;;
- gnu*)
- # Under GNU Hurd, this test is not required because there is
- # no limit to the length of command line arguments.
+ gnu* | ironclad*)
+ # Under GNU Hurd and Ironclad, this test is not required because there
+ # is no limit to the length of command line arguments.
# Libtool will interpret -1 as no limit whatsoever
lt_cv_sys_max_cmd_len=-1;
;;
- cygwin* | mingw* | cegcc*)
+ cygwin* | mingw* | windows* | cegcc*)
# On Win9x/ME, this test blows up -- it succeeds, but takes
# about 5 minutes as the teststring grows exponentially.
# Worse, since 9x/ME are not pre-emptively multitasking,
@@ -5202,18 +6243,13 @@ else
lt_cv_sys_max_cmd_len=8192;
;;
- mint*)
- # On MiNT this can take a long time and run out of memory.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
lt_cv_sys_max_cmd_len=8192;
;;
- bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -5256,7 +6292,7 @@ else
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
@@ -5298,11 +6334,11 @@ else
fi
if test -n "$lt_cv_sys_max_cmd_len"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5
+printf "%s\n" "none" >&6; }
fi
max_cmd_len=$lt_cv_sys_max_cmd_len
@@ -5346,15 +6382,16 @@ esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
-$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
-if ${lt_cv_to_host_file_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+printf %s "checking how to convert $build file names to $host format... " >&6; }
+if test ${lt_cv_to_host_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $host in
*-*-mingw* )
case $build in
- *-*-mingw* ) # actually msys
+ *-*-mingw* | *-*-windows* ) # actually msys
lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
;;
*-*-cygwin* )
@@ -5367,7 +6404,7 @@ else
;;
*-*-cygwin* )
case $build in
- *-*-mingw* ) # actually msys
+ *-*-mingw* | *-*-windows* ) # actually msys
lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
;;
*-*-cygwin* )
@@ -5386,24 +6423,25 @@ esac
fi
to_host_file_cmd=$lt_cv_to_host_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
-$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
-if ${lt_cv_to_tool_file_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+printf %s "checking how to convert $build file names to toolchain format... " >&6; }
+if test ${lt_cv_to_tool_file_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
#assume ordinary cross tools, or native build.
lt_cv_to_tool_file_cmd=func_convert_file_noop
case $host in
- *-*-mingw* )
+ *-*-mingw* | *-*-windows* )
case $build in
- *-*-mingw* ) # actually msys
+ *-*-mingw* | *-*-windows* ) # actually msys
lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
;;
esac
@@ -5413,22 +6451,23 @@ esac
fi
to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
-$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if ${lt_cv_ld_reload_flag+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+printf %s "checking for $LD option to reload object files... " >&6; }
+if test ${lt_cv_ld_reload_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_ld_reload_flag='-r'
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
reload_flag=$lt_cv_ld_reload_flag
case $reload_flag in
"" | " "*) ;;
@@ -5436,7 +6475,7 @@ case $reload_flag in
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
if test yes != "$GCC"; then
reload_cmds=false
fi
@@ -5458,14 +6497,64 @@ esac
+# Extract the first word of "file", so it can be a program name with args.
+set dummy file; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_FILECMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$FILECMD"; then
+ ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FILECMD="file"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_FILECMD" && ac_cv_prog_FILECMD=":"
+fi
+fi
+FILECMD=$ac_cv_prog_FILECMD
+if test -n "$FILECMD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
+printf "%s\n" "$FILECMD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+
+
+
+
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$OBJDUMP"; then
ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
@@ -5473,11 +6562,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5488,11 +6581,11 @@ fi
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5501,11 +6594,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then
ac_ct_OBJDUMP=$OBJDUMP
# Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_OBJDUMP"; then
ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
@@ -5513,11 +6607,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OBJDUMP="objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5528,11 +6626,11 @@ fi
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_OBJDUMP" = x; then
@@ -5540,8 +6638,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OBJDUMP=$ac_ct_OBJDUMP
@@ -5557,11 +6655,12 @@ test -z "$OBJDUMP" && OBJDUMP=objdump
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if ${lt_cv_deplibs_check_method+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+printf %s "checking how to recognize dependent libraries... " >&6; }
+if test ${lt_cv_deplibs_check_method+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_file_magic_cmd='$MAGIC_CMD'
lt_cv_file_magic_test_file=
lt_cv_deplibs_check_method='unknown'
@@ -5570,7 +6669,6 @@ lt_cv_deplibs_check_method='unknown'
# 'none' -- dependencies not supported.
# 'unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
# that responds to the $file_magic_cmd with a given extended regex.
# If you have 'file' or equivalent on your system and you're not sure
@@ -5587,7 +6685,7 @@ beos*)
bsdi[45]*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_cmd='$FILECMD -L'
lt_cv_file_magic_test_file=/shlib/libc.so
;;
@@ -5597,7 +6695,7 @@ cygwin*)
lt_cv_file_magic_cmd='func_win32_libid'
;;
-mingw* | pw32*)
+mingw* | windows* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
@@ -5606,7 +6704,7 @@ mingw* | pw32*)
lt_cv_file_magic_cmd='func_win32_libid'
else
# Keep this pattern in sync with the one in func_win32_libid.
- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)'
lt_cv_file_magic_cmd='$OBJDUMP -f'
fi
;;
@@ -5621,14 +6719,14 @@ darwin* | rhapsody*)
lt_cv_deplibs_check_method=pass_all
;;
-freebsd* | dragonfly*)
+freebsd* | dragonfly* | midnightbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_cmd=$FILECMD
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
@@ -5642,7 +6740,7 @@ haiku*)
;;
hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_cmd=$FILECMD
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
@@ -5679,7 +6777,11 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
-netbsd*)
+*-mlibc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
else
@@ -5689,7 +6791,7 @@ netbsd*)
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_cmd=$FILECMD
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
@@ -5697,7 +6799,7 @@ newos6*)
lt_cv_deplibs_check_method=pass_all
;;
-openbsd* | bitrig*)
+openbsd*)
if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
else
@@ -5713,6 +6815,10 @@ rdos*)
lt_cv_deplibs_check_method=pass_all
;;
+serenity*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
solaris*)
lt_cv_deplibs_check_method=pass_all
;;
@@ -5757,14 +6863,14 @@ os2*)
esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
file_magic_glob=
want_nocaseglob=no
if test "$build" = "$host"; then
case $host_os in
- mingw* | pw32*)
+ mingw* | windows* | pw32*)
if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
want_nocaseglob=yes
else
@@ -5802,11 +6908,12 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DLLTOOL"; then
ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
else
@@ -5814,11 +6921,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5829,11 +6940,11 @@ fi
fi
DLLTOOL=$ac_cv_prog_DLLTOOL
if test -n "$DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5842,11 +6953,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then
ac_ct_DLLTOOL=$DLLTOOL
# Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DLLTOOL"; then
ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
else
@@ -5854,11 +6966,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DLLTOOL="dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5869,11 +6985,11 @@ fi
fi
ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
if test -n "$ac_ct_DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_DLLTOOL" = x; then
@@ -5881,8 +6997,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DLLTOOL=$ac_ct_DLLTOOL
@@ -5899,15 +7015,16 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
-$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+printf %s "checking how to associate runtime and link libraries... " >&6; }
+if test ${lt_cv_sharedlib_from_linklib_cmd+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_sharedlib_from_linklib_cmd='unknown'
case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
# two different shell functions defined in ltmain.sh;
# decide which one to use based on capabilities of $DLLTOOL
case `$DLLTOOL --help 2>&1` in
@@ -5926,8 +7043,8 @@ cygwin* | mingw* | pw32* | cegcc*)
esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
@@ -5938,15 +7055,118 @@ test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
for ac_prog in ar
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
@@ -5954,11 +7174,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5969,11 +7193,11 @@ fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5986,11 +7210,12 @@ if test -z "$AR"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_AR"; then
ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
@@ -5998,11 +7223,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AR="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6013,11 +7242,11 @@ fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -6029,8 +7258,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
AR=$ac_ct_AR
@@ -6038,42 +7267,60 @@ esac
fi
: ${AR=ar}
-: ${AR_FLAGS=cru}
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because that's what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
-$as_echo_n "checking for archiver @FILE support... " >&6; }
-if ${lt_cv_ar_at_file+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+printf %s "checking for archiver @FILE support... " >&6; }
+if test ${lt_cv_ar_at_file+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_ar_at_file=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
echo conftest.$ac_objext > conftest.lst
lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
(eval $lt_ar_try) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if test 0 -eq "$ac_status"; then
# Ensure the archiver fails upon bogus file names.
@@ -6081,7 +7328,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
(eval $lt_ar_try) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if test 0 -ne "$ac_status"; then
lt_cv_ar_at_file=@
@@ -6090,11 +7337,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
rm -f conftest.* libconftest.a
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
-$as_echo "$lt_cv_ar_at_file" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+printf "%s\n" "$lt_cv_ar_at_file" >&6; }
if test no = "$lt_cv_ar_at_file"; then
archiver_list_spec=
@@ -6111,11 +7358,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$STRIP"; then
ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
@@ -6123,11 +7371,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6138,11 +7390,11 @@ fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -6151,11 +7403,12 @@ if test -z "$ac_cv_prog_STRIP"; then
ac_ct_STRIP=$STRIP
# Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_STRIP"; then
ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
@@ -6163,11 +7416,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -6178,11 +7435,11 @@ fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_STRIP" = x; then
@@ -6190,8 +7447,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
STRIP=$ac_ct_STRIP
@@ -6207,97 +7464,6 @@ test -z "$STRIP" && STRIP=:
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_RANLIB" = x; then
- RANLIB=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- RANLIB=$ac_ct_RANLIB
- fi
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
test -z "$RANLIB" && RANLIB=:
@@ -6312,15 +7478,8 @@ old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=
if test -n "$RANLIB"; then
- case $host_os in
- bitrig* | openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
- ;;
- *)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
- ;;
- esac
old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
fi
case $host_os in
@@ -6379,11 +7538,12 @@ compiler=$CC
# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if ${lt_cv_sys_global_symbol_pipe+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+printf %s "checking command to parse $NM output from $compiler object... " >&6; }
+if test ${lt_cv_sys_global_symbol_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix. What could be older than Ultrix?!! ;)]
@@ -6399,7 +7559,7 @@ case $host_os in
aix*)
symcode='[BCDT]'
;;
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
symcode='[ABCDGISTW]'
;;
hpux*)
@@ -6414,7 +7574,7 @@ osf*)
symcode='[BCDEGQRST]'
;;
solaris*)
- symcode='[BDRT]'
+ symcode='[BCDRT]'
;;
sco3.2v5*)
symcode='[DT]'
@@ -6438,7 +7598,7 @@ esac
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Gets list of data symbols to import.
- lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
# Adjust the below global symbol transforms to fixup imported variables.
lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
@@ -6456,20 +7616,20 @@ fi
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
$lt_cdecl_hook\
" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
$lt_c_name_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
# Transform an extracted symbol line into symbol name with lib prefix and
# symbol address.
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
$lt_c_name_lib_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
@@ -6478,7 +7638,7 @@ $lt_c_name_lib_hook\
# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
-mingw*)
+mingw* | windows*)
opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
;;
esac
@@ -6493,7 +7653,7 @@ for ac_symprfx in "" "_"; do
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Fake it for dumpbin and say T for any non-static function,
# D for any global variable and I for any imported variable.
- # Also find C++ and __fastcall symbols from MSVC++,
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK '"\
" {last_section=section; section=\$ 3};"\
@@ -6511,9 +7671,9 @@ for ac_symprfx in "" "_"; do
" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx"
else
- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
@@ -6529,21 +7689,18 @@ void nm_test_func(void){}
#ifdef __cplusplus
}
#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
+int main(void){nm_test_var='a';nm_test_func();return(0);}
_LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
# Now try to grab the symbols.
nlist=conftest.nm
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
- (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s "$nlist"; then
+ $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5
+ if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
@@ -6611,7 +7768,7 @@ _LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s conftest$ac_exeext; then
pipe_works=yes
fi
@@ -6646,11 +7803,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then
lt_cv_sys_global_symbol_to_cdecl=
fi
if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+printf "%s\n" "ok" >&6; }
fi
# Response file support.
@@ -6696,13 +7853,14 @@ fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
-$as_echo_n "checking for sysroot... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+printf %s "checking for sysroot... " >&6; }
# Check whether --with-sysroot was given.
-if test "${with_sysroot+set}" = set; then :
+if test ${with_sysroot+y}
+then :
withval=$with_sysroot;
-else
+else $as_nop
with_sysroot=no
fi
@@ -6711,33 +7869,36 @@ lt_sysroot=
case $with_sysroot in #(
yes)
if test yes = "$GCC"; then
- lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ # Trim trailing / since we'll always append absolute paths and we want
+ # to avoid //, if only for less confusing output for the user.
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'`
fi
;; #(
/*)
- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
;; #(
no|'')
;; #(
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
-$as_echo "$with_sysroot" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+printf "%s\n" "$with_sysroot" >&6; }
as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
;;
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
-$as_echo "${lt_sysroot:-no}" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+printf "%s\n" "${lt_sysroot:-no}" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
-$as_echo_n "checking for a working dd... " >&6; }
-if ${ac_cv_path_lt_DD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+printf %s "checking for a working dd... " >&6; }
+if test ${ac_cv_path_lt_DD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
: ${lt_DD:=$DD}
@@ -6748,10 +7909,15 @@ if test -z "$lt_DD"; then
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in dd; do
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in dd
+ do
for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+ ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_lt_DD" || continue
if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
cmp -s conftest.i conftest.out \
@@ -6771,15 +7937,16 @@ fi
rm -f conftest.i conftest2.i conftest.out
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
-$as_echo "$ac_cv_path_lt_DD" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
-$as_echo_n "checking how to truncate binary pipes... " >&6; }
-if ${lt_cv_truncate_bin+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+printf %s "checking how to truncate binary pipes... " >&6; }
+if test ${lt_cv_truncate_bin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
lt_cv_truncate_bin=
@@ -6790,8 +7957,8 @@ fi
rm -f conftest.i conftest2.i conftest.out
test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
-$as_echo "$lt_cv_truncate_bin" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+printf "%s\n" "$lt_cv_truncate_bin" >&6; }
@@ -6814,7 +7981,8 @@ func_cc_basename ()
}
# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
+if test ${enable_libtool_lock+y}
+then :
enableval=$enable_libtool_lock;
fi
@@ -6830,9 +7998,9 @@ ia64-*-hpux*)
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE=32
;;
@@ -6850,10 +8018,10 @@ ia64-*-hpux*)
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
if test yes = "$lt_cv_prog_gnu_ld"; then
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
@@ -6865,7 +8033,7 @@ ia64-*-hpux*)
;;
esac
else
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
@@ -6888,10 +8056,10 @@ mips64*-*linux*)
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
emul=elf
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*32-bit*)
emul="${emul}32"
;;
@@ -6899,7 +8067,7 @@ mips64*-*linux*)
emul="${emul}64"
;;
esac
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*MSB*)
emul="${emul}btsmip"
;;
@@ -6907,7 +8075,7 @@ mips64*-*linux*)
emul="${emul}ltsmip"
;;
esac
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*N32*)
emul="${emul}n32"
;;
@@ -6918,7 +8086,7 @@ mips64*-*linux*)
;;
x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*)
# Find out what ABI is being produced by ac_compile, and set linker
# options accordingly. Note that the listed cases only cover the
# situations where additional linker options are needed (such as when
@@ -6929,16 +8097,16 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- case `/usr/bin/file conftest.o` in
+ case `$FILECMD conftest.o` in
*32-bit*)
case $host in
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_i386_fbsd"
;;
- x86_64-*linux*)
- case `/usr/bin/file conftest.o` in
+ x86_64-*linux*|x86_64-gnu*)
+ case `$FILECMD conftest.o` in
*x86-64*)
LD="${LD-ld} -m elf32_x86_64"
;;
@@ -6966,7 +8134,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_x86_64_fbsd"
;;
- x86_64-*linux*)
+ x86_64-*linux*|x86_64-gnu*)
LD="${LD-ld} -m elf_x86_64"
;;
powerpcle-*linux*|powerpc64le-*linux*)
@@ -6992,11 +8160,12 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
SAVE_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -belf"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if ${lt_cv_cc_needs_belf+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+printf %s "checking whether the C compiler needs -belf... " >&6; }
+if test ${lt_cv_cc_needs_belf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -7007,19 +8176,20 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
lt_cv_cc_needs_belf=yes
-else
+else $as_nop
lt_cv_cc_needs_belf=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@@ -7028,8 +8198,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
if test yes != "$lt_cv_cc_needs_belf"; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
CFLAGS=$SAVE_CFLAGS
@@ -7042,9 +8212,9 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- case `/usr/bin/file conftest.o` in
+ case `$FILECMD conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*)
@@ -7079,11 +8249,12 @@ need_locks=$enable_libtool_lock
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
set dummy ${ac_tool_prefix}mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$MANIFEST_TOOL"; then
ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
else
@@ -7091,11 +8262,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7106,11 +8281,11 @@ fi
fi
MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
if test -n "$MANIFEST_TOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
-$as_echo "$MANIFEST_TOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+printf "%s\n" "$MANIFEST_TOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -7119,11 +8294,12 @@ if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
# Extract the first word of "mt", so it can be a program name with args.
set dummy mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_MANIFEST_TOOL"; then
ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
else
@@ -7131,11 +8307,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7146,11 +8326,11 @@ fi
fi
ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
if test -n "$ac_ct_MANIFEST_TOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_MANIFEST_TOOL" = x; then
@@ -7158,8 +8338,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
@@ -7169,23 +8349,24 @@ else
fi
test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
-if ${lt_cv_path_mainfest_tool+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_path_mainfest_tool=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if test ${lt_cv_path_manifest_tool+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_path_manifest_tool=no
echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
$MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
cat conftest.err >&5
if $GREP 'Manifest Tool' conftest.out > /dev/null; then
- lt_cv_path_mainfest_tool=yes
+ lt_cv_path_manifest_tool=yes
fi
rm -f conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
-$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test yes != "$lt_cv_path_mainfest_tool"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_manifest_tool" >&5
+printf "%s\n" "$lt_cv_path_manifest_tool" >&6; }
+if test yes != "$lt_cv_path_manifest_tool"; then
MANIFEST_TOOL=:
fi
@@ -7199,11 +8380,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DSYMUTIL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DSYMUTIL"; then
ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
else
@@ -7211,11 +8393,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7226,11 +8412,11 @@ fi
fi
DSYMUTIL=$ac_cv_prog_DSYMUTIL
if test -n "$DSYMUTIL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+printf "%s\n" "$DSYMUTIL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -7239,11 +8425,12 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then
ac_ct_DSYMUTIL=$DSYMUTIL
# Extract the first word of "dsymutil", so it can be a program name with args.
set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DSYMUTIL"; then
ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
else
@@ -7251,11 +8438,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7266,11 +8457,11 @@ fi
fi
ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
if test -n "$ac_ct_DSYMUTIL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+printf "%s\n" "$ac_ct_DSYMUTIL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_DSYMUTIL" = x; then
@@ -7278,8 +8469,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DSYMUTIL=$ac_ct_DSYMUTIL
@@ -7291,11 +8482,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NMEDIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$NMEDIT"; then
ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
else
@@ -7303,11 +8495,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7318,11 +8514,11 @@ fi
fi
NMEDIT=$ac_cv_prog_NMEDIT
if test -n "$NMEDIT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+printf "%s\n" "$NMEDIT" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -7331,11 +8527,12 @@ if test -z "$ac_cv_prog_NMEDIT"; then
ac_ct_NMEDIT=$NMEDIT
# Extract the first word of "nmedit", so it can be a program name with args.
set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_NMEDIT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_NMEDIT"; then
ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
else
@@ -7343,11 +8540,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_NMEDIT="nmedit"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7358,11 +8559,11 @@ fi
fi
ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
if test -n "$ac_ct_NMEDIT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+printf "%s\n" "$ac_ct_NMEDIT" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_NMEDIT" = x; then
@@ -7370,8 +8571,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
NMEDIT=$ac_ct_NMEDIT
@@ -7383,11 +8584,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LIPO+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$LIPO"; then
ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
else
@@ -7395,11 +8597,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7410,11 +8616,11 @@ fi
fi
LIPO=$ac_cv_prog_LIPO
if test -n "$LIPO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+printf "%s\n" "$LIPO" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -7423,11 +8629,12 @@ if test -z "$ac_cv_prog_LIPO"; then
ac_ct_LIPO=$LIPO
# Extract the first word of "lipo", so it can be a program name with args.
set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LIPO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_LIPO"; then
ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
else
@@ -7435,11 +8642,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_LIPO="lipo"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7450,11 +8661,11 @@ fi
fi
ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
if test -n "$ac_ct_LIPO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+printf "%s\n" "$ac_ct_LIPO" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_LIPO" = x; then
@@ -7462,8 +8673,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
LIPO=$ac_ct_LIPO
@@ -7475,11 +8686,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$OTOOL"; then
ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
else
@@ -7487,11 +8699,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7502,11 +8718,11 @@ fi
fi
OTOOL=$ac_cv_prog_OTOOL
if test -n "$OTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+printf "%s\n" "$OTOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -7515,11 +8731,12 @@ if test -z "$ac_cv_prog_OTOOL"; then
ac_ct_OTOOL=$OTOOL
# Extract the first word of "otool", so it can be a program name with args.
set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_OTOOL"; then
ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
else
@@ -7527,11 +8744,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OTOOL="otool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7542,11 +8763,11 @@ fi
fi
ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
if test -n "$ac_ct_OTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+printf "%s\n" "$ac_ct_OTOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_OTOOL" = x; then
@@ -7554,8 +8775,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OTOOL=$ac_ct_OTOOL
@@ -7567,11 +8788,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$OTOOL64"; then
ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
else
@@ -7579,11 +8801,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7594,11 +8820,11 @@ fi
fi
OTOOL64=$ac_cv_prog_OTOOL64
if test -n "$OTOOL64"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+printf "%s\n" "$OTOOL64" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -7607,11 +8833,12 @@ if test -z "$ac_cv_prog_OTOOL64"; then
ac_ct_OTOOL64=$OTOOL64
# Extract the first word of "otool64", so it can be a program name with args.
set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OTOOL64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_OTOOL64"; then
ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
else
@@ -7619,11 +8846,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OTOOL64="otool64"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -7634,11 +8865,11 @@ fi
fi
ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
if test -n "$ac_ct_OTOOL64"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+printf "%s\n" "$ac_ct_OTOOL64" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_OTOOL64" = x; then
@@ -7646,8 +8877,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OTOOL64=$ac_ct_OTOOL64
@@ -7682,11 +8913,12 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+printf %s "checking for -single_module linker flag... " >&6; }
+if test ${lt_cv_apple_cc_single_mod+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_apple_cc_single_mod=no
if test -z "$LT_MULTI_MODULE"; then
# By default we will add the -single_module flag. You can override
@@ -7715,14 +8947,52 @@ else
rm -f conftest.*
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
+
+ # Feature test to disable chained fixups since it is not
+ # compatible with '-undefined dynamic_lookup'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -no_fixup_chains linker flag" >&5
+printf %s "checking for -no_fixup_chains linker flag... " >&6; }
+if test ${lt_cv_support_no_fixup_chains+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ lt_cv_support_no_fixup_chains=yes
+else $as_nop
+ lt_cv_support_no_fixup_chains=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_support_no_fixup_chains" >&5
+printf "%s\n" "$lt_cv_support_no_fixup_chains" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+printf %s "checking for -exported_symbols_list linker flag... " >&6; }
+if test ${lt_cv_ld_exported_symbols_list+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_ld_exported_symbols_list=no
save_LDFLAGS=$LDFLAGS
echo "_main" > conftest.sym
@@ -7731,43 +9001,45 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
lt_cv_ld_exported_symbols_list=yes
-else
+else $as_nop
lt_cv_ld_exported_symbols_list=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+printf %s "checking for -force_load linker flag... " >&6; }
+if test ${lt_cv_ld_force_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_ld_force_load=no
cat > conftest.c << _LT_EOF
int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
- echo "$AR cru libconftest.a conftest.o" >&5
- $AR cru libconftest.a conftest.o 2>&5
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&5
echo "$RANLIB libconftest.a" >&5
$RANLIB libconftest.a 2>&5
cat > conftest.c << _LT_EOF
-int main() { return 0;}
+int main(void) { return 0;}
_LT_EOF
echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
@@ -7783,30 +9055,44 @@ _LT_EOF
rm -rf conftest.dSYM
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+printf "%s\n" "$lt_cv_ld_force_load" >&6; }
case $host_os in
rhapsody* | darwin1.[012])
_lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- darwin*) # darwin 5.x on
- # if running on 10.5 or later, the deployment target defaults
- # to the OS version, if on x86, and 10.4, the deployment
- # target defaults to 10.4. Don't you love it?
- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
- 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
- _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
- 10.[012][,.]*)
- _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- 10.*)
- _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[012],*|,*powerpc*-darwin[5-8]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup'
+ if test yes = "$lt_cv_support_no_fixup_chains"; then
+ as_fn_append _lt_dar_allow_undefined ' $wl-no_fixup_chains'
+ fi
+ ;;
esac
;;
esac
if test yes = "$lt_cv_apple_cc_single_mod"; then
_lt_dar_single_mod='$single_module'
fi
+ _lt_dar_needs_single_mod=no
+ case $host_os in
+ rhapsody* | darwin1.*)
+ _lt_dar_needs_single_mod=yes ;;
+ darwin*)
+ # When targeting Mac OS X 10.4 (darwin 8) or later,
+ # -single_module is the default and -multi_module is unsupported.
+ # The toolchain on macOS 10.14 (darwin 18) and later cannot
+ # target any OS version that needs -single_module.
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*-darwin[567].*|10.[0-3],*-darwin[5-9].*|10.[0-3],*-darwin1[0-7].*)
+ _lt_dar_needs_single_mod=yes ;;
+ esac
+ ;;
+ esac
if test yes = "$lt_cv_ld_exported_symbols_list"; then
_lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
else
@@ -7855,286 +9141,43 @@ func_munge_path_list ()
esac
}
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-fi
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h
fi
-done
-
-
-for ac_header in dlfcn.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
@@ -8143,15 +9186,16 @@ done
enable_win32_dll=yes
case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+*-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*)
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AS+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AS+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$AS"; then
ac_cv_prog_AS="$AS" # Let the user override the test.
else
@@ -8159,11 +9203,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_AS="${ac_tool_prefix}as"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8174,11 +9222,11 @@ fi
fi
AS=$ac_cv_prog_AS
if test -n "$AS"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
-$as_echo "$AS" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
+printf "%s\n" "$AS" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -8187,11 +9235,12 @@ if test -z "$ac_cv_prog_AS"; then
ac_ct_AS=$AS
# Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AS+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AS+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_AS"; then
ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
else
@@ -8199,11 +9248,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AS="as"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8214,11 +9267,11 @@ fi
fi
ac_ct_AS=$ac_cv_prog_ac_ct_AS
if test -n "$ac_ct_AS"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
-$as_echo "$ac_ct_AS" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
+printf "%s\n" "$ac_ct_AS" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_AS" = x; then
@@ -8226,8 +9279,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
AS=$ac_ct_AS
@@ -8239,11 +9292,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DLLTOOL"; then
ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
else
@@ -8251,11 +9305,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8266,11 +9324,11 @@ fi
fi
DLLTOOL=$ac_cv_prog_DLLTOOL
if test -n "$DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+printf "%s\n" "$DLLTOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -8279,11 +9337,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then
ac_ct_DLLTOOL=$DLLTOOL
# Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DLLTOOL"; then
ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
else
@@ -8291,11 +9350,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DLLTOOL="dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8306,11 +9369,11 @@ fi
fi
ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
if test -n "$ac_ct_DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+printf "%s\n" "$ac_ct_DLLTOOL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_DLLTOOL" = x; then
@@ -8318,8 +9381,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DLLTOOL=$ac_ct_DLLTOOL
@@ -8331,11 +9394,12 @@ fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$OBJDUMP"; then
ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
@@ -8343,11 +9407,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8358,11 +9426,11 @@ fi
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+printf "%s\n" "$OBJDUMP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -8371,11 +9439,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then
ac_ct_OBJDUMP=$OBJDUMP
# Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_OBJDUMP"; then
ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
@@ -8383,11 +9452,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OBJDUMP="objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8398,11 +9471,11 @@ fi
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+printf "%s\n" "$ac_ct_OBJDUMP" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_OBJDUMP" = x; then
@@ -8410,8 +9483,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
OBJDUMP=$ac_ct_OBJDUMP
@@ -8448,7 +9521,8 @@ test -z "$OBJDUMP" && OBJDUMP=objdump
# Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
+if test ${enable_shared+y}
+then :
enableval=$enable_shared; p=${PACKAGE-default}
case $enableval in
yes) enable_shared=yes ;;
@@ -8466,7 +9540,7 @@ if test "${enable_shared+set}" = set; then :
IFS=$lt_save_ifs
;;
esac
-else
+else $as_nop
enable_shared=yes
fi
@@ -8479,7 +9553,8 @@ fi
# Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
+if test ${enable_static+y}
+then :
enableval=$enable_static; p=${PACKAGE-default}
case $enableval in
yes) enable_static=yes ;;
@@ -8497,7 +9572,7 @@ if test "${enable_static+set}" = set; then :
IFS=$lt_save_ifs
;;
esac
-else
+else $as_nop
enable_static=yes
fi
@@ -8509,30 +9584,53 @@ fi
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
+ # Check whether --enable-pic was given.
+if test ${enable_pic+y}
+then :
+ enableval=$enable_pic; lt_p=${PACKAGE-default}
+ case $enableval in
+ yes|no) pic_mode=$enableval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
+ # Check whether --with-pic was given.
+if test ${with_pic+y}
+then :
withval=$with_pic; lt_p=${PACKAGE-default}
- case $withval in
- yes|no) pic_mode=$withval ;;
- *)
- pic_mode=default
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
- for lt_pkg in $withval; do
- IFS=$lt_save_ifs
- if test "X$lt_pkg" = "X$lt_p"; then
- pic_mode=yes
- fi
- done
- IFS=$lt_save_ifs
- ;;
- esac
-else
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else $as_nop
pic_mode=default
fi
+fi
+
+
@@ -8540,7 +9638,8 @@ fi
# Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
+if test ${enable_fast_install+y}
+then :
enableval=$enable_fast_install; p=${PACKAGE-default}
case $enableval in
yes) enable_fast_install=yes ;;
@@ -8558,7 +9657,7 @@ if test "${enable_fast_install+set}" = set; then :
IFS=$lt_save_ifs
;;
esac
-else
+else $as_nop
enable_fast_install=yes
fi
@@ -8572,31 +9671,47 @@ fi
shared_archive_member_spec=
case $host,$enable_shared in
power*-*-aix[5-9]*,yes)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
-$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
-
-# Check whether --with-aix-soname was given.
-if test "${with_aix_soname+set}" = set; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+printf %s "checking which variant of shared library versioning to provide... " >&6; }
+ # Check whether --enable-aix-soname was given.
+if test ${enable_aix_soname+y}
+then :
+ enableval=$enable_aix_soname; case $enableval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --enable-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$enable_aix_soname
+else $as_nop
+ # Check whether --with-aix-soname was given.
+if test ${with_aix_soname+y}
+then :
withval=$with_aix_soname; case $withval in
- aix|svr4|both)
- ;;
- *)
- as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
- ;;
- esac
- lt_cv_with_aix_soname=$with_aix_soname
-else
- if ${lt_cv_with_aix_soname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else $as_nop
+ if test ${lt_cv_with_aix_soname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_with_aix_soname=aix
fi
- with_aix_soname=$lt_cv_with_aix_soname
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
-$as_echo "$with_aix_soname" >&6; }
+ enable_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ with_aix_soname=$enable_aix_soname
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+printf "%s\n" "$with_aix_soname" >&6; }
if test aix != "$with_aix_soname"; then
# For the AIX way of multilib, we name the shared archive member
# based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
@@ -8678,11 +9793,12 @@ if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if ${lt_cv_objdir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+printf %s "checking for objdir... " >&6; }
+if test ${lt_cv_objdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
@@ -8693,17 +9809,15 @@ else
fi
rmdir .libs 2>/dev/null
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+printf "%s\n" "$lt_cv_objdir" >&6; }
objdir=$lt_cv_objdir
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
+printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h
@@ -8724,8 +9838,8 @@ esac
ofile=libtool
can_build_shared=yes
-# All known linkers require a '.a' archive for static linking (except MSVC,
-# which needs '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
libext=a
with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -8749,11 +9863,12 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file
case $deplibs_check_method in
file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+printf %s "checking for ${ac_tool_prefix}file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
@@ -8802,11 +9917,11 @@ fi
MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -8815,11 +9930,12 @@ fi
if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+printf %s "checking for file... " >&6; }
+if test ${lt_cv_path_MAGIC_CMD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
@@ -8868,11 +9984,11 @@ fi
MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+printf "%s\n" "$MAGIC_CMD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -8906,7 +10022,7 @@ objext=$objext
lt_simple_compile_test_code="int some_variable = 0;"
# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
+lt_simple_link_test_code='int main(void){return(0);}'
@@ -8957,11 +10073,12 @@ if test yes = "$GCC"; then
lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test ${lt_cv_prog_compiler_rtti_exceptions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_rtti_exceptions=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
@@ -8992,8 +10109,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
@@ -9046,7 +10163,7 @@ lt_prog_compiler_static=
# PIC is the default for these OSes.
;;
- mingw* | cygwin* | pw32* | os2* | cegcc*)
+ mingw* | windows* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
# Although the cygwin gcc ignores -fPIC, still need this for old-style
@@ -9149,7 +10266,7 @@ lt_prog_compiler_static=
esac
;;
- mingw* | cygwin* | pw32* | os2* | cegcc*)
+ mingw* | windows* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic='-DDLL_EXPORT'
@@ -9190,6 +10307,12 @@ lt_prog_compiler_static=
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-static'
;;
+ *flang* | ftn | f18* | f95*)
+ # Flang compiler.
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
# icc used to be incompatible with GCC.
# ICC 10 doesn't accept -KPIC any more.
icc* | ifort*)
@@ -9234,7 +10357,7 @@ lt_prog_compiler_static=
lt_prog_compiler_static='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
lt_prog_compiler_pic='-KPIC'
@@ -9272,6 +10395,12 @@ lt_prog_compiler_static=
lt_prog_compiler_static='-Bstatic'
;;
+ *-mlibc)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+
*nto* | *qnx*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
# it will coredump.
@@ -9288,6 +10417,9 @@ lt_prog_compiler_static=
lt_prog_compiler_static='-non_shared'
;;
+ serenity*)
+ ;;
+
solaris*)
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
@@ -9350,26 +10482,28 @@ case $host_os in
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
-$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_pic_works=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
@@ -9400,8 +10534,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
if test yes = "$lt_cv_prog_compiler_pic_works"; then
case $lt_prog_compiler_pic in
@@ -9429,11 +10563,12 @@ fi
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_static_works=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
@@ -9457,8 +10592,8 @@ else
LDFLAGS=$save_LDFLAGS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
if test yes = "$lt_cv_prog_compiler_static_works"; then
:
@@ -9472,11 +10607,12 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_c_o=no
$RM -r conftest 2>/dev/null
mkdir conftest
@@ -9519,19 +10655,20 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_c_o=no
$RM -r conftest 2>/dev/null
mkdir conftest
@@ -9574,8 +10711,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
@@ -9583,19 +10720,19 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
hard_links=nottested
if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
# do not overwrite the value of need_locks provided by the user
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
hard_links=yes
$RM conftest*
ln conftest.a conftest.b 2>/dev/null && hard_links=no
touch conftest.a
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
if test no = "$hard_links"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
need_locks=warn
fi
else
@@ -9607,8 +10744,8 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
runpath_var=
allow_undefined_flag=
@@ -9651,21 +10788,18 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
extract_expsyms_cmds=
case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
+ # Microsoft Visual C++ or Intel C++ Compiler.
if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
with_gnu_ld=yes
;;
- openbsd* | bitrig*)
- with_gnu_ld=no
- ;;
esac
ld_shlibs=yes
@@ -9712,7 +10846,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
whole_archive_flag_spec=
fi
supports_anon_versioning=no
- case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -9766,7 +10900,7 @@ _LT_EOF
fi
;;
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
# _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
# as there is no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
@@ -9776,6 +10910,7 @@ _LT_EOF
enable_shared_with_static_runtimes=yes
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ file_list_spec='@'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -9795,7 +10930,7 @@ _LT_EOF
haiku*)
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
- link_all_deplibs=yes
+ link_all_deplibs=no
;;
os2*)
@@ -9822,8 +10957,9 @@ _LT_EOF
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
- old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
;;
interix[3-9]*)
@@ -9838,7 +10974,7 @@ _LT_EOF
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
@@ -9881,7 +11017,7 @@ _LT_EOF
compiler_needs_object=yes
;;
esac
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*) # Sun C 5.9
whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object=yes
@@ -9893,13 +11029,14 @@ _LT_EOF
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
case $cc_basename in
tcc*)
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
export_dynamic_flag_spec='-rdynamic'
;;
xlf* | bgf* | bgxlf* | mpixlf*)
@@ -9909,7 +11046,7 @@ _LT_EOF
archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
@@ -9920,7 +11057,12 @@ _LT_EOF
fi
;;
- netbsd*)
+ *-mlibc)
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
@@ -10041,7 +11183,7 @@ _LT_EOF
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
@@ -10163,21 +11305,23 @@ _LT_EOF
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
- if ${lt_cv_aix_libpath_+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
@@ -10192,7 +11336,7 @@ if ac_fn_c_try_link "$LINENO"; then :
lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=/usr/lib:/lib
@@ -10216,21 +11360,23 @@ fi
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
- if ${lt_cv_aix_libpath_+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${lt_cv_aix_libpath_+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
@@ -10245,7 +11391,7 @@ if ac_fn_c_try_link "$LINENO"; then :
lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=/usr/lib:/lib
@@ -10306,14 +11452,14 @@ fi
export_dynamic_flag_spec=-rdynamic
;;
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
+ # Microsoft Visual C++ or Intel C++ Compiler.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
case $cc_basename in
- cl*)
- # Native MSVC
+ cl* | icl*)
+ # Native MSVC or ICC
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
always_export_symbols=yes
@@ -10323,14 +11469,14 @@ fi
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_cmds='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
cp "$export_symbols" "$output_objdir/$soname.def";
echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
else
$SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
@@ -10354,7 +11500,7 @@ fi
fi'
;;
*)
- # Assume MSVC wrapper
+ # Assume MSVC and ICC wrapper
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
# Tell ltmain to make .lib files, not .a files.
@@ -10395,8 +11541,8 @@ fi
output_verbose_link_cmd=func_echo_all
archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
- archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
- module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
else
ld_shlibs=no
@@ -10430,7 +11576,7 @@ fi
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly*)
+ freebsd* | dragonfly* | midnightbsd*)
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
@@ -10496,11 +11642,12 @@ fi
# Older versions of the 11.00 compiler do not understand -b yet
# (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if ${lt_cv_prog_compiler__b+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+printf %s "checking if $CC understands -b... " >&6; }
+if test ${lt_cv_prog_compiler__b+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler__b=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -b"
@@ -10524,8 +11671,8 @@ else
LDFLAGS=$save_LDFLAGS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
if test yes = "$lt_cv_prog_compiler__b"; then
archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
@@ -10565,28 +11712,30 @@ fi
# work, assume that -exports_file does not work either and
# implicitly export all symbols.
# This should be the same for all languages, so no per-tag cache variable.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if test ${lt_cv_irix_exported_symbol+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int foo (void) { return 0; }
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
lt_cv_irix_exported_symbol=yes
-else
+else $as_nop
lt_cv_irix_exported_symbol=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
if test yes = "$lt_cv_irix_exported_symbol"; then
archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
fi
@@ -10607,11 +11756,15 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
# Fabrice Bellard et al's Tiny C Compiler
ld_shlibs=yes
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
;;
esac
;;
- netbsd*)
+ *-mlibc)
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
@@ -10633,7 +11786,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
*nto* | *qnx*)
;;
- openbsd* | bitrig*)
+ openbsd*)
if test -f /usr/libexec/ld.so; then
hardcode_direct=yes
hardcode_shlibpath_var=no
@@ -10676,8 +11829,9 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
- old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes=yes
+ file_list_spec='@'
;;
osf3*)
@@ -10711,6 +11865,9 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
hardcode_libdir_separator=:
;;
+ serenity*)
+ ;;
+
solaris*)
no_undefined_flag=' -z defs'
if test yes = "$GCC"; then
@@ -10866,8 +12023,8 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+printf "%s\n" "$ld_shlibs" >&6; }
test no = "$ld_shlibs" && can_build_shared=no
with_gnu_ld=$with_gnu_ld
@@ -10903,18 +12060,19 @@ x|xyes)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
$RM conftest*
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } 2>conftest.err; then
soname=conftest
lib=conftest
@@ -10932,7 +12090,7 @@ else
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
(eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
then
lt_cv_archive_cmds_need_lc=no
@@ -10946,8 +12104,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
;;
esac
@@ -11106,8 +12264,8 @@ esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
if test yes = "$GCC"; then
case $host_os in
@@ -11115,7 +12273,7 @@ if test yes = "$GCC"; then
*) lt_awk_arg='/^libraries:/' ;;
esac
case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
*) lt_sed_strip_eq='s|=/|/|g' ;;
esac
lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
@@ -11173,7 +12331,7 @@ BEGIN {RS = " "; FS = "/|\n";} {
# AWK program above erroneously prepends '/' to C:/dos/paths
# for these hosts.
case $host_os in
- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
$SED 's|/\([A-Za-z]:\)|\1|g'` ;;
esac
sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
@@ -11247,7 +12405,7 @@ aix[4-9]*)
# Unfortunately, runtime linking may impact performance, so we do
# not want this to be the default eventually. Also, we use the
# versioned .so libs for executables only if there is the -brtl
- # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only.
# To allow for filename-based versioning support, we need to create
# libNAME.so.V as an archive file, containing:
# *) an Import File, referring to the versioned filename of the
@@ -11341,7 +12499,7 @@ bsdi[45]*)
# libtool to hard-code these into programs
;;
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
version_type=windows
shrext_cmds=.dll
need_version=no
@@ -11352,15 +12510,29 @@ cygwin* | mingw* | pw32* | cegcc*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \$file`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
+ # If user builds GCC with multilib enabled,
+ # it should just install on $(libdir)
+ # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones.
+ if test xyes = x"$multilib"; then
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ $install_prog $dir/$dlname $destdir/$dlname~
+ chmod a+x $destdir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib $destdir/$dlname'\'' || exit \$?;
+ fi'
+ else
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ fi
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
@@ -11369,30 +12541,30 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
;;
- mingw* | cegcc*)
+ mingw* | windows* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
- *,cl*)
- # Native MSVC
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
case $build_os in
- mingw*)
+ mingw* | windows*)
sys_lib_search_path_spec=
lt_save_ifs=$IFS
IFS=';'
@@ -11405,7 +12577,7 @@ cygwin* | mingw* | pw32* | cegcc*)
done
IFS=$lt_save_ifs
# Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
@@ -11442,7 +12614,7 @@ cygwin* | mingw* | pw32* | cegcc*)
;;
*)
- # Assume MSVC wrapper
+ # Assume MSVC and ICC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
@@ -11475,7 +12647,7 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd* | dragonfly*)
+freebsd* | dragonfly* | midnightbsd*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
@@ -11512,7 +12684,27 @@ freebsd* | dragonfly*)
need_version=no
;;
esac
+ case $host_cpu in
+ powerpc64)
+ # On FreeBSD bi-arch platforms, a different variable is used for 32-bit
+ # binaries. See <https://man.freebsd.org/cgi/man.cgi?query=ld.so>.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int test_pointer_size[sizeof (void *) - 5];
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
shlibpath_var=LD_LIBRARY_PATH
+else $as_nop
+ shlibpath_var=LD_32_LIBRARY_PATH
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ *)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ esac
case $host_os in
freebsd2.*)
shlibpath_overrides_runpath=yes
@@ -11542,8 +12734,9 @@ haiku*)
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
shlibpath_overrides_runpath=no
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
+ sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib'
+ sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib'
+ hardcode_into_libs=no
;;
hpux9* | hpux10* | hpux11*)
@@ -11653,7 +12846,7 @@ linux*android*)
version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
- library_names_spec='$libname$release$shared_ext'
+ library_names_spec='$libname$release$shared_ext $libname$shared_ext'
soname_spec='$libname$release$shared_ext'
finish_cmds=
shlibpath_var=LD_LIBRARY_PATH
@@ -11665,8 +12858,9 @@ linux*android*)
hardcode_into_libs=yes
dynamic_linker='Android linker'
- # Don't embed -rpath directories since the linker doesn't support them.
- hardcode_libdir_flag_spec='-L$libdir'
+ # -rpath works at least for libraries that are not overridden by
+ # libraries installed in system locations.
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
;;
# This must be glibc/ELF.
@@ -11681,9 +12875,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
shlibpath_overrides_runpath=no
# Some binutils ld are patched to set DT_RUNPATH
- if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_shlibpath_overrides_runpath=no
save_LDFLAGS=$LDFLAGS
save_libdir=$libdir
@@ -11693,19 +12888,21 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+if ac_fn_c_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
lt_cv_shlibpath_overrides_runpath=yes
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
libdir=$save_libdir
@@ -11719,7 +12916,7 @@ fi
# before this can be enabled.
hardcode_into_libs=yes
- # Ideally, we could use ldconfig to report *all* directores which are
+ # Ideally, we could use ldconfig to report *all* directories which are
# searched for libraries, however this is still not possible. Aside from not
# being certain /sbin/ldconfig is available, command
# 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
@@ -11739,6 +12936,18 @@ fi
dynamic_linker='GNU/Linux ld.so'
;;
+netbsdelf*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='NetBSD ld.elf_so'
+ ;;
+
netbsd*)
version_type=sunos
need_lib_prefix=no
@@ -11757,6 +12966,18 @@ netbsd*)
hardcode_into_libs=yes
;;
+*-mlibc)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='mlibc ld.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
newsos6)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
@@ -11776,7 +12997,7 @@ newsos6)
dynamic_linker='ldqnx.so'
;;
-openbsd* | bitrig*)
+openbsd*)
version_type=sunos
sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
@@ -11836,6 +13057,17 @@ rdos*)
dynamic_linker=no
;;
+serenity*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ dynamic_linker='SerenityOS LibELF'
+ ;;
+
solaris*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
@@ -11933,12 +13165,499 @@ uts4*)
shlibpath_var=LD_LIBRARY_PATH
;;
+emscripten*)
+ version_type=none
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ dynamic_linker="Emscripten linker"
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | windows* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | windows* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *flang* | ftn | f18* | f95*)
+ # Flang compiler.
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *-mlibc)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ serenity*)
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+='-fPIC'
+ archive_cmds='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib'
+ archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym'
+ archive_cmds_need_lc=no
+ no_undefined_flag=
+ ;;
+
*)
dynamic_linker=no
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
test no = "$dynamic_linker" && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -12059,8 +13778,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
hardcode_action=
if test -n "$hardcode_libdir_flag_spec" ||
test -n "$runpath_var" ||
@@ -12084,8 +13803,8 @@ else
# directories.
hardcode_action=unsupported
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+printf "%s\n" "$hardcode_action" >&6; }
if test relink = "$hardcode_action" ||
test yes = "$inherit_rpath"; then
@@ -12117,7 +13836,7 @@ else
lt_cv_dlopen_self=yes
;;
- mingw* | pw32* | cegcc*)
+ mingw* | windows* | pw32* | cegcc*)
lt_cv_dlopen=LoadLibrary
lt_cv_dlopen_libs=
;;
@@ -12129,11 +13848,12 @@ else
darwin*)
# if libdl is installed we need to link against it
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -12141,33 +13861,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dlopen ();
+char dlopen (void);
int
-main ()
+main (void)
{
return dlopen ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dl_dlopen=yes
-else
+else $as_nop
ac_cv_lib_dl_dlopen=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
-else
+else $as_nop
lt_cv_dlopen=dyld
lt_cv_dlopen_libs=
@@ -12187,14 +13912,16 @@ fi
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = xyes; then :
+if test "x$ac_cv_func_shl_load" = xyes
+then :
lt_cv_dlopen=shl_load
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+printf %s "checking for shl_load in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -12202,42 +13929,49 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char shl_load ();
+char shl_load (void);
int
-main ()
+main (void)
{
return shl_load ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dld_shl_load=yes
-else
+else $as_nop
ac_cv_lib_dld_shl_load=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes
+then :
lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
-else
+else $as_nop
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = xyes; then :
+if test "x$ac_cv_func_dlopen" = xyes
+then :
lt_cv_dlopen=dlopen
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -12245,38 +13979,44 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dlopen ();
+char dlopen (void);
int
-main ()
+main (void)
{
return dlopen ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dl_dlopen=yes
-else
+else $as_nop
ac_cv_lib_dl_dlopen=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if ${ac_cv_lib_svld_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+printf %s "checking for dlopen in -lsvld... " >&6; }
+if test ${ac_cv_lib_svld_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -12284,38 +14024,44 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dlopen ();
+char dlopen (void);
int
-main ()
+main (void)
{
return dlopen ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_svld_dlopen=yes
-else
+else $as_nop
ac_cv_lib_svld_dlopen=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes
+then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if ${ac_cv_lib_dld_dld_link+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+printf %s "checking for dld_link in -ldld... " >&6; }
+if test ${ac_cv_lib_dld_dld_link+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -12323,31 +14069,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char dld_link ();
+char dld_link (void);
int
-main ()
+main (void)
{
return dld_link ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dld_dld_link=yes
-else
+else $as_nop
ac_cv_lib_dld_dld_link=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes
+then :
lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
fi
@@ -12386,11 +14137,12 @@ fi
save_LIBS=$LIBS
LIBS="$lt_cv_dlopen_libs $LIBS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+printf %s "checking whether a program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self=cross
else
@@ -12441,11 +14193,11 @@ else
/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
+int fnord (void) __attribute__((visibility("default")));
#endif
-int fnord () { return 42; }
-int main ()
+int fnord (void) { return 42; }
+int main (void)
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
@@ -12469,7 +14221,7 @@ _LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
@@ -12487,16 +14239,17 @@ rm -fr conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+printf "%s\n" "$lt_cv_dlopen_self" >&6; }
if test yes = "$lt_cv_dlopen_self"; then
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self_static+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+printf %s "checking whether a statically linked program can dlopen itself... " >&6; }
+if test ${lt_cv_dlopen_self_static+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self_static=cross
else
@@ -12547,11 +14300,11 @@ else
/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
+int fnord (void) __attribute__((visibility("default")));
#endif
-int fnord () { return 42; }
-int main ()
+int fnord (void) { return 42; }
+int main (void)
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
@@ -12575,7 +14328,7 @@ _LT_EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
@@ -12593,8 +14346,8 @@ rm -fr conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
fi
CPPFLAGS=$save_CPPFLAGS
@@ -12632,32 +14385,43 @@ fi
striplib=
old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
- case $host_os in
- darwin*)
- if test -n "$STRIP"; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+printf %s "checking whether stripping libraries is possible... " >&6; }
+if test -z "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+else
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
striplib="$STRIP -x"
old_striplib="$STRIP -S"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ;;
- esac
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
+ fi
fi
@@ -12672,13 +14436,13 @@ fi
# Report what library types will actually be built
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+printf %s "checking if libtool supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+printf "%s\n" "$can_build_shared" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+printf %s "checking whether to build shared libraries... " >&6; }
test no = "$can_build_shared" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
@@ -12702,15 +14466,15 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
fi
;;
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+printf "%s\n" "$enable_shared" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+printf %s "checking whether to build static libraries... " >&6; }
# Make sure either enable_shared or enable_static is yes.
test yes = "$enable_shared" || enable_static=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+printf "%s\n" "$enable_static" >&6; }
@@ -12757,196 +14521,27 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
-$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
-if ${ac_cv_prog_cc_c99+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c99=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdio.h>
-
-// Check varargs macros. These examples are taken from C99 6.10.3.5.
-#define debug(...) fprintf (stderr, __VA_ARGS__)
-#define showlist(...) puts (#__VA_ARGS__)
-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
-static void
-test_varargs_macros (void)
-{
- int x = 1234;
- int y = 5678;
- debug ("Flag");
- debug ("X = %d\n", x);
- showlist (The first, second, and third items.);
- report (x>y, "x is %d but y is %d", x, y);
-}
-
-// Check long long types.
-#define BIG64 18446744073709551615ull
-#define BIG32 4294967295ul
-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
-#if !BIG_OK
- your preprocessor is broken;
-#endif
-#if BIG_OK
-#else
- your preprocessor is broken;
-#endif
-static long long int bignum = -9223372036854775807LL;
-static unsigned long long int ubignum = BIG64;
-
-struct incomplete_array
-{
- int datasize;
- double data[];
-};
-
-struct named_init {
- int number;
- const wchar_t *name;
- double average;
-};
-
-typedef const char *ccp;
-
-static inline int
-test_restrict (ccp restrict text)
-{
- // See if C++-style comments work.
- // Iterate through items via the restricted pointer.
- // Also check for declarations in for loops.
- for (unsigned int i = 0; *(text+i) != '\0'; ++i)
- continue;
- return 0;
-}
-
-// Check varargs and va_copy.
-static void
-test_varargs (const char *format, ...)
-{
- va_list args;
- va_start (args, format);
- va_list args_copy;
- va_copy (args_copy, args);
-
- const char *str;
- int number;
- float fnumber;
-
- while (*format)
- {
- switch (*format++)
- {
- case 's': // string
- str = va_arg (args_copy, const char *);
- break;
- case 'd': // int
- number = va_arg (args_copy, int);
- break;
- case 'f': // float
- fnumber = va_arg (args_copy, double);
- break;
- default:
- break;
- }
- }
- va_end (args_copy);
- va_end (args);
-}
-
-int
-main ()
-{
-
- // Check bool.
- _Bool success = false;
-
- // Check restrict.
- if (test_restrict ("String literal") == 0)
- success = true;
- char *restrict newvar = "Another string";
-
- // Check varargs.
- test_varargs ("s, d' f .", "string", 65, 34.234);
- test_varargs_macros ();
-
- // Check flexible array members.
- struct incomplete_array *ia =
- malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
- ia->datasize = 10;
- for (int i = 0; i < ia->datasize; ++i)
- ia->data[i] = i * 1.234;
-
- // Check named initializers.
- struct named_init ni = {
- .number = 34,
- .name = L"Test wide string",
- .average = 543.34343,
- };
-
- ni.number = 58;
-
- int dynamic_array[ni.number];
- dynamic_array[ni.number - 1] = 543;
- // work around unused variable warnings
- return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
- || dynamic_array[ni.number - 1] != 543);
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c99=$ac_arg
+if test "${ac_cv_prog_cc_c99}" = no
+then :
+ as_fn_error $? "Expat requires a C99 compiler." "$LINENO" 5
fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c99" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c99" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c99"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
-$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c99" != xno; then :
-
-fi
-
-
-if test "$GCC" = yes; then :
+if test "$GCC" = yes
+then :
for flag in -Wall -Wextra; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+printf %s "checking whether C compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CFLAGS
CFLAGS="$CFLAGS -Werror $flag"
@@ -12954,51 +14549,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
(: AM_CFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -13009,12 +14607,13 @@ done
for flag in -fexceptions; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+printf %s "checking whether C compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CFLAGS
CFLAGS="$CFLAGS -Werror $flag"
@@ -13022,51 +14621,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
(: AM_CFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -13077,12 +14679,13 @@ done
for flag in -fno-strict-aliasing -Wmissing-prototypes -Wstrict-prototypes; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+printf %s "checking whether C compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CFLAGS
CFLAGS="$CFLAGS -Werror $flag"
@@ -13090,51 +14693,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
(: AM_CFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -13145,12 +14751,13 @@ done
for flag in -pedantic -Wduplicated-cond -Wduplicated-branches -Wlogical-op; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+printf %s "checking whether C compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CFLAGS
CFLAGS="$CFLAGS -Werror $flag"
@@ -13158,51 +14765,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
(: AM_CFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -13213,12 +14823,13 @@ done
for flag in -Wrestrict -Wnull-dereference -Wjump-misses-init -Wdouble-promotion; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+printf %s "checking whether C compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CFLAGS
CFLAGS="$CFLAGS -Werror $flag"
@@ -13226,51 +14837,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
(: AM_CFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -13280,13 +14894,14 @@ done
-for flag in -Wshadow -Wformat=2 -Wmisleading-indentation; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+for flag in -Wshadow -Wformat=2 -Wno-pedantic-ms-format -Wmisleading-indentation; do
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+printf %s "checking whether C compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CFLAGS
CFLAGS="$CFLAGS -Werror $flag"
@@ -13294,51 +14909,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5
(: AM_CFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -13352,6 +14970,12 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -13362,15 +14986,16 @@ if test -z "$CXX"; then
CXX=$CCC
else
if test -n "$ac_tool_prefix"; then
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CXX"; then
ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
@@ -13378,11 +15003,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -13393,11 +15022,11 @@ fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -13406,15 +15035,16 @@ fi
fi
if test -z "$CXX"; then
ac_ct_CXX=$CXX
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CXX"; then
ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
@@ -13422,11 +15052,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -13437,11 +15071,11 @@ fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -13453,8 +15087,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CXX=$ac_ct_CXX
@@ -13464,7 +15098,7 @@ fi
fi
fi
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
@@ -13474,7 +15108,7 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -13484,20 +15118,21 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -13507,29 +15142,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GXX=yes
else
GXX=
fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_test_CXXFLAGS=${CXXFLAGS+y}
ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
ac_cxx_werror_flag=yes
ac_cv_prog_cxx_g=no
@@ -13538,57 +15177,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
ac_cv_prog_cxx_g=yes
-else
+else $as_nop
CXXFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
CXXFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
ac_cv_prog_cxx_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
if test "$GXX" = yes; then
@@ -13603,6 +15245,100 @@ else
CXXFLAGS=
fi
fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -13611,11 +15347,12 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
depcc="$CXX" am_compiler_list=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
@@ -13722,8 +15459,8 @@ else
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
if
@@ -13755,36 +15492,32 @@ ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+printf %s "checking how to run the C++ preprocessor... " >&6; }
if test -z "$CXXCPP"; then
- if ${ac_cv_prog_CXXCPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CXXCPP needs to be expanded
- for CXXCPP in "$CXX -E" "/lib/cpp"
+ if test ${ac_cv_prog_CXXCPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CXX needs to be expanded
+ for CXXCPP in "$CXX -E" cpp /lib/cpp
do
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
-else
+else $as_nop
# Broken: fails on valid input.
continue
fi
@@ -13796,10 +15529,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
+else $as_nop
# Passes both tests.
ac_preproc_ok=:
break
@@ -13809,7 +15543,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
break
fi
@@ -13821,29 +15556,24 @@ fi
else
ac_cv_prog_CXXCPP=$CXXCPP
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+printf "%s\n" "$CXXCPP" >&6; }
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
-else
+else $as_nop
# Broken: fails on valid input.
continue
fi
@@ -13855,10 +15585,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
+if ac_fn_cxx_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
+else $as_nop
# Passes both tests.
ac_preproc_ok=:
break
@@ -13868,11 +15599,12 @@ rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -14008,19 +15740,20 @@ cc_basename=$func_cc_basename_result
# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
+if test ${with_gnu_ld+y}
+then :
withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
-else
+else $as_nop
with_gnu_ld=no
fi
ac_prog=ld
if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
case $host in
- *-*-mingw*)
+ *-*-mingw* | *-*-windows*)
# gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
@@ -14047,15 +15780,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
;;
esac
elif test yes = "$with_gnu_ld"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
fi
-if ${lt_cv_path_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test ${lt_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -z "$LD"; then
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
@@ -14084,18 +15818,19 @@ fi
LD=$lt_cv_path_LD
if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${lt_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
@@ -14106,8 +15841,8 @@ case `$LD -v 2>&1 </dev/null` in
;;
esac
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -14131,8 +15866,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
wlarc='$wl'
# ancient GNU ld didn't support --whole-archive et. al.
- if eval "`$CC -print-prog-name=ld` --help 2>&1" |
- $GREP 'no-whole-archive' > /dev/null; then
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
whole_archive_flag_spec_CXX=
@@ -14152,7 +15886,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"'
else
GXX=no
@@ -14161,8 +15895,8 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
fi
# PORTME: fill in a description of your system's C++ link characteristics
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
ld_shlibs_CXX=yes
case $host_os in
aix3*)
@@ -14300,21 +16034,23 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
- if ${lt_cv_aix_libpath__CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
@@ -14329,7 +16065,7 @@ if ac_fn_cxx_try_link "$LINENO"; then :
lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath__CXX"; then
lt_cv_aix_libpath__CXX=/usr/lib:/lib
@@ -14354,21 +16090,23 @@ fi
if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
- if ${lt_cv_aix_libpath__CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${lt_cv_aix_libpath__CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
lt_aix_libpath_sed='
/Import File Strings/,/^$/ {
@@ -14383,7 +16121,7 @@ if ac_fn_cxx_try_link "$LINENO"; then :
lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath__CXX"; then
lt_cv_aix_libpath__CXX=/usr/lib:/lib
@@ -14446,10 +16184,10 @@ fi
esac
;;
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
case $GXX,$cc_basename in
- ,cl* | no,cl*)
- # Native MSVC
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
hardcode_libdir_flag_spec_CXX=' '
@@ -14499,6 +16237,7 @@ fi
allow_undefined_flag_CXX=unsupported
always_export_symbols_CXX=no
enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -14540,11 +16279,11 @@ fi
output_verbose_link_cmd=func_echo_all
archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
- archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
- module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
- if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then
archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
- archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
fi
else
@@ -14577,8 +16316,9 @@ fi
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
- old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ old_archive_from_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes_CXX=yes
+ file_list_spec_CXX='@'
;;
dgux*)
@@ -14609,7 +16349,7 @@ fi
archive_cmds_need_lc_CXX=no
;;
- freebsd* | dragonfly*)
+ freebsd* | dragonfly* | midnightbsd*)
# FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
# conventions
ld_shlibs_CXX=yes
@@ -14617,7 +16357,7 @@ fi
haiku*)
archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
- link_all_deplibs_CXX=yes
+ link_all_deplibs_CXX=no
;;
hpux9*)
@@ -14644,7 +16384,7 @@ fi
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[-]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
@@ -14709,7 +16449,7 @@ fi
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [-]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
@@ -14746,7 +16486,7 @@ fi
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
irix5* | irix6*)
case $cc_basename in
@@ -14886,13 +16626,13 @@ fi
archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
;;
*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*)
# Sun C++ 5.9
no_undefined_flag_CXX=' -zdefs'
@@ -14941,6 +16681,10 @@ fi
esac
;;
+ *-mlibc)
+ ld_shlibs_CXX=yes
+ ;;
+
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
@@ -14957,7 +16701,7 @@ fi
ld_shlibs_CXX=yes
;;
- openbsd* | bitrig*)
+ openbsd*)
if test -f /usr/libexec/ld.so; then
hardcode_direct_CXX=yes
hardcode_shlibpath_var_CXX=no
@@ -15048,7 +16792,7 @@ fi
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"'
else
# FIXME: insert proper C++ library support
@@ -15063,6 +16807,9 @@ fi
ld_shlibs_CXX=no
;;
+ serenity*)
+ ;;
+
sunos4*)
case $cc_basename in
CC*)
@@ -15132,7 +16879,7 @@ fi
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"'
else
# g++ 2.7 appears to require '-G' NOT '-shared' on this
# platform.
@@ -15143,7 +16890,7 @@ fi
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"'
fi
hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
@@ -15234,8 +16981,8 @@ fi
;;
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
test no = "$ld_shlibs_CXX" && can_build_shared=no
GCC_CXX=$GXX
@@ -15273,7 +17020,7 @@ esac
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
# Parse the compiler output and extract the necessary
# objects, libraries and library flags.
@@ -15286,10 +17033,11 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
case $prev$p in
-L* | -R* | -l*)
- # Some compilers place space between "-{L,R}" and the path.
+ # Some compilers place space between "-{L,R,l}" and the path.
# Remove the space.
- if test x-L = "$p" ||
- test x-R = "$p"; then
+ if test x-L = x"$p" ||
+ test x-R = x"$p" ||
+ test x-l = x"$p"; then
prev=$p
continue
fi
@@ -15456,7 +17204,7 @@ lt_prog_compiler_static_CXX=
beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
+ mingw* | windows* | cygwin* | os2* | pw32* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
# Although the cygwin gcc ignores -fPIC, still need this for old-style
@@ -15531,7 +17279,7 @@ lt_prog_compiler_static_CXX=
;;
esac
;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
+ mingw* | windows* | cygwin* | os2* | pw32* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
@@ -15549,7 +17297,7 @@ lt_prog_compiler_static_CXX=
;;
esac
;;
- freebsd* | dragonfly*)
+ freebsd* | dragonfly* | midnightbsd*)
# FreeBSD uses GNU C++
;;
hpux9* | hpux10* | hpux11*)
@@ -15632,7 +17380,7 @@ lt_prog_compiler_static_CXX=
lt_prog_compiler_static_CXX='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*)
# Sun C++ 5.9
lt_prog_compiler_pic_CXX='-KPIC'
@@ -15656,7 +17404,9 @@ lt_prog_compiler_static_CXX=
;;
esac
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
+ ;;
+ *-mlibc)
;;
*qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -15686,6 +17436,8 @@ lt_prog_compiler_static_CXX=
;;
psos*)
;;
+ serenity*)
+ ;;
solaris*)
case $cc_basename in
CC* | sunCC*)
@@ -15754,26 +17506,28 @@ case $host_os in
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_pic_works_CXX=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
@@ -15804,8 +17558,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
case $lt_prog_compiler_pic_CXX in
@@ -15827,11 +17581,12 @@ fi
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_static_works_CXX=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
@@ -15855,8 +17610,8 @@ else
LDFLAGS=$save_LDFLAGS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
:
@@ -15867,11 +17622,12 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_c_o_CXX=no
$RM -r conftest 2>/dev/null
mkdir conftest
@@ -15914,16 +17670,17 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test ${lt_cv_prog_compiler_c_o_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_prog_compiler_c_o_CXX=no
$RM -r conftest 2>/dev/null
mkdir conftest
@@ -15966,8 +17723,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; }
@@ -15975,19 +17732,19 @@ $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
hard_links=nottested
if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
# do not overwrite the value of need_locks provided by the user
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+printf %s "checking if we can lock with hard links... " >&6; }
hard_links=yes
$RM conftest*
ln conftest.a conftest.b 2>/dev/null && hard_links=no
touch conftest.a
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+printf "%s\n" "$hard_links" >&6; }
if test no = "$hard_links"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
need_locks=warn
fi
else
@@ -15996,8 +17753,8 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
@@ -16014,15 +17771,15 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
export_symbols_cmds_CXX=$ltdll_cmds
;;
- cygwin* | mingw* | cegcc*)
+ cygwin* | mingw* | windows* | cegcc*)
case $cc_basename in
- cl*)
+ cl* | icl*)
exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
;;
*)
@@ -16036,8 +17793,8 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+printf "%s\n" "$ld_shlibs_CXX" >&6; }
test no = "$ld_shlibs_CXX" && can_build_shared=no
with_gnu_ld_CXX=$with_gnu_ld
@@ -16064,18 +17821,19 @@ x|xyes)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+printf %s "checking whether -lc should be explicitly linked in... " >&6; }
+if test ${lt_cv_archive_cmds_need_lc_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
$RM conftest*
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } 2>conftest.err; then
soname=conftest
lib=conftest
@@ -16093,7 +17851,7 @@ else
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
(eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
then
lt_cv_archive_cmds_need_lc_CXX=no
@@ -16107,8 +17865,8 @@ else
$RM conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
;;
esac
@@ -16177,8 +17935,8 @@ esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+printf %s "checking dynamic linker characteristics... " >&6; }
library_names_spec=
libname_spec='lib$name'
@@ -16247,7 +18005,7 @@ aix[4-9]*)
# Unfortunately, runtime linking may impact performance, so we do
# not want this to be the default eventually. Also, we use the
# versioned .so libs for executables only if there is the -brtl
- # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only.
# To allow for filename-based versioning support, we need to create
# libNAME.so.V as an archive file, containing:
# *) an Import File, referring to the versioned filename of the
@@ -16341,7 +18099,7 @@ bsdi[45]*)
# libtool to hard-code these into programs
;;
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
version_type=windows
shrext_cmds=.dll
need_version=no
@@ -16352,15 +18110,29 @@ cygwin* | mingw* | pw32* | cegcc*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \$file`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
+ # If user builds GCC with multilib enabled,
+ # it should just install on $(libdir)
+ # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones.
+ if test xyes = x"$multilib"; then
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ $install_prog $dir/$dlname $destdir/$dlname~
+ chmod a+x $destdir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib $destdir/$dlname'\'' || exit \$?;
+ fi'
+ else
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ fi
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
@@ -16369,29 +18141,29 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
- mingw* | cegcc*)
+ mingw* | windows* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
- *,cl*)
- # Native MSVC
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
case $build_os in
- mingw*)
+ mingw* | windows*)
sys_lib_search_path_spec=
lt_save_ifs=$IFS
IFS=';'
@@ -16404,7 +18176,7 @@ cygwin* | mingw* | pw32* | cegcc*)
done
IFS=$lt_save_ifs
# Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
@@ -16441,7 +18213,7 @@ cygwin* | mingw* | pw32* | cegcc*)
;;
*)
- # Assume MSVC wrapper
+ # Assume MSVC and ICC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
@@ -16473,7 +18245,7 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd* | dragonfly*)
+freebsd* | dragonfly* | midnightbsd*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
@@ -16510,7 +18282,27 @@ freebsd* | dragonfly*)
need_version=no
;;
esac
+ case $host_cpu in
+ powerpc64)
+ # On FreeBSD bi-arch platforms, a different variable is used for 32-bit
+ # binaries. See <https://man.freebsd.org/cgi/man.cgi?query=ld.so>.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int test_pointer_size[sizeof (void *) - 5];
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
shlibpath_var=LD_LIBRARY_PATH
+else $as_nop
+ shlibpath_var=LD_32_LIBRARY_PATH
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ *)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ esac
case $host_os in
freebsd2.*)
shlibpath_overrides_runpath=yes
@@ -16540,8 +18332,9 @@ haiku*)
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
shlibpath_overrides_runpath=no
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
+ sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib'
+ sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib'
+ hardcode_into_libs=no
;;
hpux9* | hpux10* | hpux11*)
@@ -16651,7 +18444,7 @@ linux*android*)
version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
- library_names_spec='$libname$release$shared_ext'
+ library_names_spec='$libname$release$shared_ext $libname$shared_ext'
soname_spec='$libname$release$shared_ext'
finish_cmds=
shlibpath_var=LD_LIBRARY_PATH
@@ -16663,8 +18456,9 @@ linux*android*)
hardcode_into_libs=yes
dynamic_linker='Android linker'
- # Don't embed -rpath directories since the linker doesn't support them.
- hardcode_libdir_flag_spec_CXX='-L$libdir'
+ # -rpath works at least for libraries that are not overridden by
+ # libraries installed in system locations.
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
;;
# This must be glibc/ELF.
@@ -16679,9 +18473,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
shlibpath_overrides_runpath=no
# Some binutils ld are patched to set DT_RUNPATH
- if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test ${lt_cv_shlibpath_overrides_runpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
lt_cv_shlibpath_overrides_runpath=no
save_LDFLAGS=$LDFLAGS
save_libdir=$libdir
@@ -16691,19 +18486,21 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null
+then :
lt_cv_shlibpath_overrides_runpath=yes
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
libdir=$save_libdir
@@ -16717,7 +18514,7 @@ fi
# before this can be enabled.
hardcode_into_libs=yes
- # Ideally, we could use ldconfig to report *all* directores which are
+ # Ideally, we could use ldconfig to report *all* directories which are
# searched for libraries, however this is still not possible. Aside from not
# being certain /sbin/ldconfig is available, command
# 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
@@ -16737,6 +18534,18 @@ fi
dynamic_linker='GNU/Linux ld.so'
;;
+netbsdelf*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='NetBSD ld.elf_so'
+ ;;
+
netbsd*)
version_type=sunos
need_lib_prefix=no
@@ -16755,6 +18564,18 @@ netbsd*)
hardcode_into_libs=yes
;;
+*-mlibc)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='mlibc ld.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
newsos6)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
@@ -16774,7 +18595,7 @@ newsos6)
dynamic_linker='ldqnx.so'
;;
-openbsd* | bitrig*)
+openbsd*)
version_type=sunos
sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
@@ -16834,6 +18655,17 @@ rdos*)
dynamic_linker=no
;;
+serenity*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ dynamic_linker='SerenityOS LibELF'
+ ;;
+
solaris*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
@@ -16931,12 +18763,482 @@ uts4*)
shlibpath_var=LD_LIBRARY_PATH
;;
+emscripten*)
+ version_type=none
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ dynamic_linker="Emscripten linker"
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | windows* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | windows* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly* | midnightbsd*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | $SED 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd* | netbsdelf*-gnu)
+ ;;
+ *-mlibc)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ serenity*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+printf %s "checking for $compiler option to produce PIC... " >&6; }
+if test ${lt_cv_prog_compiler_pic_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test ${lt_cv_prog_compiler_pic_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test ${lt_cv_prog_compiler_static_works_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+='-fPIC'
+ archive_cmds_CXX='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib'
+ archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym'
+ archive_cmds_need_lc_CXX=no
+ no_undefined_flag_CXX=
+ ;;
+
*)
dynamic_linker=no
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+printf "%s\n" "$dynamic_linker" >&6; }
test no = "$dynamic_linker" && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -17000,8 +19302,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+printf %s "checking how to hardcode library paths into programs... " >&6; }
hardcode_action_CXX=
if test -n "$hardcode_libdir_flag_spec_CXX" ||
test -n "$runpath_var_CXX" ||
@@ -17025,8 +19327,8 @@ else
# directories.
hardcode_action_CXX=unsupported
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+printf "%s\n" "$hardcode_action_CXX" >&6; }
if test relink = "$hardcode_action_CXX" ||
test yes = "$inherit_rpath_CXX"; then
@@ -17066,18 +19368,20 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test "$GCC" = yes; then :
+if test "$GCC" = yes
+then :
for flag in -Wall -Wextra; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5
-$as_echo_n "checking whether C++ compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5
+printf %s "checking whether C++ compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -Werror $flag"
@@ -17085,51 +19389,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CXXFLAGS+:} false; then :
+if test ${AM_CXXFLAGS+y}
+then :
case " $AM_CXXFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS already contains \$flag"; } >&5
(: AM_CXXFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CXXFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
(: AM_CXXFLAGS="$AM_CXXFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CXXFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
(: AM_CXXFLAGS="$AM_CXXFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -17140,12 +19447,13 @@ done
for flag in -fexceptions; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5
-$as_echo_n "checking whether C++ compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5
+printf %s "checking whether C++ compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -Werror $flag"
@@ -17153,51 +19461,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CXXFLAGS+:} false; then :
+if test ${AM_CXXFLAGS+y}
+then :
case " $AM_CXXFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS already contains \$flag"; } >&5
(: AM_CXXFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CXXFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
(: AM_CXXFLAGS="$AM_CXXFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CXXFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
(: AM_CXXFLAGS="$AM_CXXFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -17208,12 +19519,13 @@ done
for flag in -fno-strict-aliasing; do
- as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5
-$as_echo_n "checking whether C++ compiler accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5
+printf %s "checking whether C++ compiler accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -Werror $flag"
@@ -17221,51 +19533,54 @@ else
/* end confdefs.h. */
int main(void) { return 0; }
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_CXXFLAGS+:} false; then :
+if test ${AM_CXXFLAGS+y}
+then :
case " $AM_CXXFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS already contains \$flag"; } >&5
(: AM_CXXFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CXXFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
(: AM_CXXFLAGS="$AM_CXXFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CXXFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CXXFLAGS=\"\$AM_CXXFLAGS\""; } >&5
(: AM_CXXFLAGS="$AM_CXXFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -17279,18 +19594,20 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test "$GCC" = yes; then :
+if test "$GCC" = yes
+then :
for flag in -fno-strict-aliasing; do
- as_CACHEVAR=`$as_echo "ax_cv_check_ldflags__$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5
-$as_echo_n "checking whether the linker accepts $flag... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ as_CACHEVAR=`printf "%s\n" "ax_cv_check_ldflags__$flag" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5
+printf %s "checking whether the linker accepts $flag... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ax_check_save_flags=$LDFLAGS
LDFLAGS="$LDFLAGS $flag"
@@ -17298,59 +19615,62 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$as_CACHEVAR=yes"
-else
+else $as_nop
eval "$as_CACHEVAR=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"
+then :
-if ${AM_LDFLAGS+:} false; then :
+if test ${AM_LDFLAGS+y}
+then :
case " $AM_LDFLAGS " in #(
*" $flag "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_LDFLAGS already contains \$flag"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_LDFLAGS already contains \$flag"; } >&5
(: AM_LDFLAGS already contains $flag) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_LDFLAGS " $flag"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_LDFLAGS=\"\$AM_LDFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_LDFLAGS=\"\$AM_LDFLAGS\""; } >&5
(: AM_LDFLAGS="$AM_LDFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_LDFLAGS=$flag
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_LDFLAGS=\"\$AM_LDFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_LDFLAGS=\"\$AM_LDFLAGS\""; } >&5
(: AM_LDFLAGS="$AM_LDFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
-else
+else $as_nop
:
fi
@@ -17370,11 +19690,12 @@ esac ;; #(
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports visibility" >&5
-$as_echo_n "checking whether compiler supports visibility... " >&6; }
-if ${expatcfg_cv_compiler_supports_visibility+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports visibility" >&5
+printf %s "checking whether compiler supports visibility... " >&6; }
+if test ${expatcfg_cv_compiler_supports_visibility+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
expatcfg_cv_compiler_supports_visibility=no
OLDFLAGS=$CFLAGS
as_fn_append CFLAGS " -fvisibility=hidden -Wall -Werror -Wno-unknown-warning-option"
@@ -17385,201 +19706,96 @@ else
void foo(void) {}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
expatcfg_cv_compiler_supports_visibility=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$OLDFLAGS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $expatcfg_cv_compiler_supports_visibility" >&5
-$as_echo "$expatcfg_cv_compiler_supports_visibility" >&6; }
- if test "$expatcfg_cv_compiler_supports_visibility" = yes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $expatcfg_cv_compiler_supports_visibility" >&5
+printf "%s\n" "$expatcfg_cv_compiler_supports_visibility" >&6; }
+ if test "$expatcfg_cv_compiler_supports_visibility" = yes
+then :
-if ${AM_CFLAGS+:} false; then :
+if test ${AM_CFLAGS+y}
+then :
case " $AM_CFLAGS " in #(
*" -fvisibility=hidden "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains -fvisibility=hidden"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains -fvisibility=hidden"; } >&5
(: AM_CFLAGS already contains -fvisibility=hidden) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CFLAGS " -fvisibility=hidden"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CFLAGS=-fvisibility=hidden
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5
(: AM_CFLAGS="$AM_CFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
+ if test "${enable_shared}" = yes
+then :
-if ${AM_CPPFLAGS+:} false; then :
+if test ${AM_CPPFLAGS+y}
+then :
case " $AM_CPPFLAGS " in #(
*" -DXML_ENABLE_VISIBILITY=1 "*) :
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DXML_ENABLE_VISIBILITY=1"; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DXML_ENABLE_VISIBILITY=1"; } >&5
(: AM_CPPFLAGS already contains -DXML_ENABLE_VISIBILITY=1) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } ;; #(
*) :
as_fn_append AM_CPPFLAGS " -DXML_ENABLE_VISIBILITY=1"
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5
(: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
;;
esac
-else
+else $as_nop
AM_CPPFLAGS=-DXML_ENABLE_VISIBILITY=1
- { { $as_echo "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5
(: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
fi
fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
fi
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+printf %s "checking whether byte ordering is bigendian... " >&6; }
+if test ${ac_cv_c_bigendian+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_cv_c_bigendian=unknown
# See if we're dealing with a universal compiler.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17590,7 +19806,8 @@ else
typedef int dummy;
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
# Check for potential -arch flags. It is not universal unless
# there are at least two -arch flags with different values.
@@ -17614,7 +19831,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
fi
done
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
if test $ac_cv_c_bigendian = unknown; then
# See if sys/param.h defines the BYTE_ORDER macro.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17623,7 +19840,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
#include <sys/param.h>
int
-main ()
+main (void)
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
&& defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
@@ -17635,7 +19852,8 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
# It does; now see whether it defined to BIG_ENDIAN or not.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -17643,7 +19861,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
#include <sys/param.h>
int
-main ()
+main (void)
{
#if BYTE_ORDER != BIG_ENDIAN
not big endian
@@ -17653,14 +19871,15 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_c_bigendian=yes
-else
+else $as_nop
ac_cv_c_bigendian=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
if test $ac_cv_c_bigendian = unknown; then
# See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
@@ -17669,7 +19888,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
#include <limits.h>
int
-main ()
+main (void)
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
bogus endian macros
@@ -17679,14 +19898,15 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
# It does; now see whether it defined to _BIG_ENDIAN or not.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <limits.h>
int
-main ()
+main (void)
{
#ifndef _BIG_ENDIAN
not big endian
@@ -17696,50 +19916,54 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_c_bigendian=yes
-else
+else $as_nop
ac_cv_c_bigendian=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
if test $ac_cv_c_bigendian = unknown; then
# Compile a test program.
- if test "$cross_compiling" = yes; then :
+ if test "$cross_compiling" = yes
+then :
# Try to guess by grepping values from an object file.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-short int ascii_mm[] =
+unsigned short int ascii_mm[] =
{ 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
- short int ascii_ii[] =
+ unsigned short int ascii_ii[] =
{ 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
int use_ascii (int i) {
return ascii_mm[i] + ascii_ii[i];
}
- short int ebcdic_ii[] =
+ unsigned short int ebcdic_ii[] =
{ 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
- short int ebcdic_mm[] =
+ unsigned short int ebcdic_mm[] =
{ 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
int use_ebcdic (int i) {
return ebcdic_mm[i] + ebcdic_ii[i];
}
- extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
- ;
- return 0;
-}
+ int
+ main (int argc, char **argv)
+ {
+ /* Intimidate the compiler so that it does not
+ optimize the arrays away. */
+ char *p = argv[0];
+ ascii_mm[1] = *p++; ebcdic_mm[1] = *p++;
+ ascii_ii[1] = *p++; ebcdic_ii[1] = *p++;
+ return use_ascii (argc) == use_ebcdic (*p);
+ }
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+if ac_fn_c_try_link "$LINENO"
+then :
+ if grep BIGenDianSyS conftest$ac_exeext >/dev/null; then
ac_cv_c_bigendian=yes
fi
- if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if grep LiTTleEnDian conftest$ac_exeext >/dev/null ; then
if test "$ac_cv_c_bigendian" = unknown; then
ac_cv_c_bigendian=no
else
@@ -17748,13 +19972,14 @@ if ac_fn_c_try_compile "$LINENO"; then :
fi
fi
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
int
-main ()
+main (void)
{
/* Are we little or big endian? From Harbison&Steele. */
@@ -17770,9 +19995,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
ac_cv_c_bigendian=no
-else
+else $as_nop
ac_cv_c_bigendian=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -17781,18 +20007,18 @@ fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+printf "%s\n" "$ac_cv_c_bigendian" >&6; }
case $ac_cv_c_bigendian in #(
yes)
- $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+ printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
BYTEORDER=4321;; #(
no)
BYTEORDER=1234 ;; #(
universal)
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
;; #(
*)
@@ -17801,21 +20027,20 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
esac
-cat >>confdefs.h <<_ACEOF
-#define BYTEORDER $BYTEORDER
-_ACEOF
+printf "%s\n" "#define BYTEORDER $BYTEORDER" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if ${ac_cv_c_const+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+printf %s "checking for an ANSI C-conforming const... " >&6; }
+if test ${ac_cv_c_const+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __cplusplus
@@ -17828,7 +20053,7 @@ main ()
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
- /* AIX XL C 1.02.0.0 rejects this.
+ /* IBM XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in
an arm of an if-expression whose if-part is not a constant
expression */
@@ -17856,7 +20081,7 @@ main ()
iptr p = 0;
++p;
}
- { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
struct s { int j; const int *ap[3]; } bx;
struct s *b = &bx; b->j = 5;
@@ -17872,38 +20097,29 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_c_const=yes
-else
+else $as_nop
ac_cv_c_const=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+printf "%s\n" "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then
-$as_echo "#define const /**/" >>confdefs.h
-
-fi
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
+printf "%s\n" "#define const /**/" >>confdefs.h
fi
# Check whether --with-xmlwf was given.
-if test "${with_xmlwf+set}" = set; then :
+if test ${with_xmlwf+y}
+then :
withval=$with_xmlwf;
-else
+else $as_nop
with_xmlwf=yes
fi
@@ -17918,9 +20134,10 @@ fi
# Check whether --with-examples was given.
-if test "${with_examples+set}" = set; then :
+if test ${with_examples+y}
+then :
withval=$with_examples;
-else
+else $as_nop
with_examples=yes
fi
@@ -17935,9 +20152,10 @@ fi
# Check whether --with-tests was given.
-if test "${with_tests+set}" = set; then :
+if test ${with_tests+y}
+then :
withval=$with_tests;
-else
+else $as_nop
with_tests=yes
fi
@@ -17950,13 +20168,389 @@ else
fi
+if test x${with_tests} = xyes
+then :
+ ax_cxx_compile_alternatives="11 0x" ax_cxx_compile_cxx11_required=true
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ ac_success=no
+
+
+
+
+
+ if test x$ac_success = xno; then
+ for alternative in ${ax_cxx_compile_alternatives}; do
+ for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do
+ if test x"$switch" = xMSVC; then
+ switch=-std:c++${alternative}
+ cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx11_${switch}_MSVC" | $as_tr_sh`
+ else
+ cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh`
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5
+printf %s "checking whether $CXX supports C++11 features with $switch... " >&6; }
+if eval test \${$cachevar+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+// MSVC always sets __cplusplus to 199711L in older versions; newer versions
+// only set it correctly if /Zc:__cplusplus is specified as well as a
+// /std:c++NN switch:
+// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
+#elif __cplusplus < 201103L && !defined _MSC_VER
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual ~Base() {}
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual ~Derived() override {}
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ eval $cachevar=yes
+else $as_nop
+ eval $cachevar=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CXX="$ac_save_CXX"
+fi
+eval ac_res=\$$cachevar
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ if test -n "$CXXCPP" ; then
+ CXXCPP="$CXXCPP $switch"
+ fi
+ ac_success=yes
+ break
+ fi
+ done
+ if test x$ac_success = xyes; then
+ break
+ fi
+ done
+ fi
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ if test x$ax_cxx_compile_cxx11_required = xtrue; then
+ if test x$ac_success = xno; then
+ as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5
+ fi
+ fi
+ if test x$ac_success = xno; then
+ HAVE_CXX11=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5
+printf "%s\n" "$as_me: No compiler with C++11 support was found" >&6;}
+ else
+ HAVE_CXX11=1
+
+printf "%s\n" "#define HAVE_CXX11 1" >>confdefs.h
+
+ fi
+
+
+fi
EXPATCFG_ON_MINGW=no
case "${host_os}" in #(
mingw*) :
EXPATCFG_ON_MINGW=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: detected OS: MinGW" >&5
-$as_echo "$as_me: detected OS: MinGW" >&6;} ;; #(
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: detected OS: MinGW" >&5
+printf "%s\n" "$as_me: detected OS: MinGW" >&6;} ;; #(
*) :
;;
esac
@@ -17977,22 +20571,199 @@ else
UNICODE_FALSE=
fi
+ if echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_UNICODE_WCHAR_T >/dev/null; then
+ _INTERNAL_UNICODE_WCHAR_T_TRUE=
+ _INTERNAL_UNICODE_WCHAR_T_FALSE='#'
+else
+ _INTERNAL_UNICODE_WCHAR_T_TRUE='#'
+ _INTERNAL_UNICODE_WCHAR_T_FALSE=
+fi
+
+ if echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_MIN_SIZE >/dev/null; then
+ _INTERNAL_MIN_SIZE_TRUE=
+ _INTERNAL_MIN_SIZE_FALSE='#'
+else
+ _INTERNAL_MIN_SIZE_TRUE='#'
+ _INTERNAL_MIN_SIZE_FALSE=
+fi
+
+ if echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_LARGE_SIZE >/dev/null; then
+ _INTERNAL_LARGE_SIZE_TRUE=
+ _INTERNAL_LARGE_SIZE_FALSE='#'
+else
+ _INTERNAL_LARGE_SIZE_TRUE='#'
+ _INTERNAL_LARGE_SIZE_FALSE=
+fi
+
+
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-mingw* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5
+printf %s "checking for _mwvalidcheckl in -lmw... " >&6; }
+if test ${ac_cv_lib_mw__mwvalidcheckl+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmw $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _mwvalidcheckl (void);
+int
+main (void)
+{
+return _mwvalidcheckl ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_mw__mwvalidcheckl=yes
+else $as_nop
+ ac_cv_lib_mw__mwvalidcheckl=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5
+printf "%s\n" "$ac_cv_lib_mw__mwvalidcheckl" >&6; }
+if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes
+then :
+ LIBM=-lmw
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
+printf %s "checking for cos in -lm... " >&6; }
+if test ${ac_cv_lib_m_cos+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cos (void);
+int
+main (void)
+{
+return cos ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_m_cos=yes
+else $as_nop
+ ac_cv_lib_m_cos=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
+printf "%s\n" "$ac_cv_lib_m_cos" >&6; }
+if test "x$ac_cv_lib_m_cos" = xyes
+then :
+ LIBM="$LIBM -lm"
+fi
+
+ ;;
+*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
+printf %s "checking for cos in -lm... " >&6; }
+if test ${ac_cv_lib_m_cos+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cos (void);
+int
+main (void)
+{
+return cos ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_m_cos=yes
+else $as_nop
+ ac_cv_lib_m_cos=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
+printf "%s\n" "$ac_cv_lib_m_cos" >&6; }
+if test "x$ac_cv_lib_m_cos" = xyes
+then :
+ LIBM=-lm
+fi
+
+ ;;
+esac
+
# Check whether --with-libbsd was given.
-if test "${with_libbsd+set}" = set; then :
+if test ${with_libbsd+y}
+then :
withval=$with_libbsd;
-else
+else $as_nop
with_libbsd=no
fi
-if test "x${with_libbsd}" != xno; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arc4random_buf in -lbsd" >&5
-$as_echo_n "checking for arc4random_buf in -lbsd... " >&6; }
-if ${ac_cv_lib_bsd_arc4random_buf+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test "x${with_libbsd}" != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for arc4random_buf in -lbsd" >&5
+printf %s "checking for arc4random_buf in -lbsd... " >&6; }
+if test ${ac_cv_lib_bsd_arc4random_buf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -18000,71 +20771,78 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
#ifdef __cplusplus
extern "C"
#endif
-char arc4random_buf ();
+char arc4random_buf (void);
int
-main ()
+main (void)
{
return arc4random_buf ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_bsd_arc4random_buf=yes
-else
+else $as_nop
ac_cv_lib_bsd_arc4random_buf=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_arc4random_buf" >&5
-$as_echo "$ac_cv_lib_bsd_arc4random_buf" >&6; }
-if test "x$ac_cv_lib_bsd_arc4random_buf" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBBSD 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_arc4random_buf" >&5
+printf "%s\n" "$ac_cv_lib_bsd_arc4random_buf" >&6; }
+if test "x$ac_cv_lib_bsd_arc4random_buf" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBBSD 1" >>confdefs.h
LIBS="-lbsd $LIBS"
-else
- if test "x${with_libbsd}" = xyes; then :
+else $as_nop
+ if test "x${with_libbsd}" = xyes
+then :
as_fn_error $? "Enforced use of libbsd cannot be satisfied." "$LINENO" 5
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for arc4random_buf (BSD or libbsd)" >&5
-$as_echo_n "checking for arc4random_buf (BSD or libbsd)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for arc4random_buf (BSD, libbsd or glibc 2.36+)" >&5
+printf %s "checking for arc4random_buf (BSD, libbsd or glibc 2.36+)... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- #include <stdlib.h> /* for arc4random_buf on BSD, for NULL */
#if defined(HAVE_LIBBSD)
# include <bsd/stdlib.h>
+ #else
+ # include <stdlib.h> /* for arc4random_buf on BSD */
#endif
- int main() {
- arc4random_buf(NULL, 0U);
+ int main(void) {
+ char dummy[123]; // double brackets for m4
+ arc4random_buf(dummy, 0U);
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
-$as_echo "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h
+printf "%s\n" "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arc4random (BSD, macOS or libbsd)" >&5
-$as_echo_n "checking for arc4random (BSD, macOS or libbsd)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for arc4random (BSD, macOS, libbsd or glibc 2.36+)" >&5
+printf %s "checking for arc4random (BSD, macOS, libbsd or glibc 2.36+)... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -18073,175 +20851,172 @@ $as_echo_n "checking for arc4random (BSD, macOS or libbsd)... " >&6; }
#else
# include <stdlib.h>
#endif
- int main() {
+ int main(void) {
arc4random();
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
-$as_echo "#define HAVE_ARC4RANDOM 1" >>confdefs.h
+printf "%s\n" "#define HAVE_ARC4RANDOM 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
# Check whether --with-getrandom was given.
-if test "${with_getrandom+set}" = set; then :
+if test ${with_getrandom+y}
+then :
withval=$with_getrandom;
-else
+else $as_nop
with_getrandom=check
fi
-if test "x$with_getrandom" != xno; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getrandom (Linux 3.17+, glibc 2.25+)" >&5
-$as_echo_n "checking for getrandom (Linux 3.17+, glibc 2.25+)... " >&6; }
+if test "x$with_getrandom" != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getrandom (Linux 3.17+, glibc 2.25+)" >&5
+printf %s "checking for getrandom (Linux 3.17+, glibc 2.25+)... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdlib.h> /* for NULL */
#include <sys/random.h>
- int main() {
+ int main(void) {
return getrandom(NULL, 0U, 0U);
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-$as_echo "#define HAVE_GETRANDOM 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- if test "x$with_getrandom" = xyes; then :
+if ac_fn_c_try_link "$LINENO"
+then :
+
+printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ if test "x$with_getrandom" = xyes
+then :
as_fn_error $? "enforced the use of getrandom --with-getrandom, but not detected" "$LINENO" 5
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
# Check whether --with-sys_getrandom was given.
-if test "${with_sys_getrandom+set}" = set; then :
+if test ${with_sys_getrandom+y}
+then :
withval=$with_sys_getrandom;
-else
+else $as_nop
with_sys_getrandom=check
fi
-if test "x$with_sys_getrandom" != xno; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for syscall SYS_getrandom (Linux 3.17+)" >&5
-$as_echo_n "checking for syscall SYS_getrandom (Linux 3.17+)... " >&6; }
+if test "x$with_sys_getrandom" != xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for syscall SYS_getrandom (Linux 3.17+)" >&5
+printf %s "checking for syscall SYS_getrandom (Linux 3.17+)... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #define _GNU_SOURCE
#include <stdlib.h> /* for NULL */
#include <unistd.h> /* for syscall */
#include <sys/syscall.h> /* for SYS_getrandom */
- int main() {
+ int main(void) {
syscall(SYS_getrandom, NULL, 0, 0);
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-$as_echo "#define HAVE_SYSCALL_GETRANDOM 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- if test "x$with_sys_getrandom" = xyes; then :
+if ac_fn_c_try_link "$LINENO"
+then :
+
+printf "%s\n" "#define HAVE_SYSCALL_GETRANDOM 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ if test "x$with_sys_getrandom" = xyes
+then :
as_fn_error $? "enforced the use of syscall SYS_getrandom --with-sys-getrandom, but not detected" "$LINENO" 5
fi
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-for ac_header in fcntl.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"
+if test "x$ac_cv_header_fcntl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
-done
+fi
ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
-if test "x$ac_cv_type_off_t" = xyes; then :
+if test "x$ac_cv_type_off_t" = xyes
+then :
-else
+else $as_nop
-cat >>confdefs.h <<_ACEOF
-#define off_t long int
-_ACEOF
+printf "%s\n" "#define off_t long int" >>confdefs.h
fi
-
-
- for ac_header in $ac_header_list
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
+ac_func=
+for ac_item in $ac_func_c_list
+do
+ if test $ac_func; then
+ ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func
+ if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then
+ echo "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_func=
+ else
+ ac_func=$ac_item
+ fi
done
-
-
-
-
-
-
-for ac_func in getpagesize
-do :
- ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
-if test "x$ac_cv_func_getpagesize" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GETPAGESIZE 1
-_ACEOF
-
-fi
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
-$as_echo_n "checking for working mmap... " >&6; }
-if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- ac_cv_func_mmap_fixed_mapped=no
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+printf %s "checking for working mmap... " >&6; }
+if test ${ac_cv_func_mmap_fixed_mapped+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in # ((
+ # Guess yes on platforms where we know the result.
+ linux*) ac_cv_func_mmap_fixed_mapped=yes ;;
+ # If we don't know, assume the worst.
+ *) ac_cv_func_mmap_fixed_mapped=no ;;
+ esac
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
@@ -18273,10 +21048,6 @@ $ac_includes_default
#include <fcntl.h>
#include <sys/mman.h>
-#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
-char *malloc ();
-#endif
-
/* This mess was copied from the GNU getpagesize.h. */
#ifndef HAVE_GETPAGESIZE
# ifdef _SC_PAGESIZE
@@ -18310,7 +21081,7 @@ char *malloc ();
#endif /* no HAVE_GETPAGESIZE */
int
-main ()
+main (void)
{
char *data, *data2, *data3;
const char *cdata2;
@@ -18378,12 +21149,15 @@ main ()
if (*(data + i) != *(data3 + i))
return 14;
close (fd);
+ free (data);
+ free (data3);
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
ac_cv_func_mmap_fixed_mapped=yes
-else
+else $as_nop
ac_cv_func_mmap_fixed_mapped=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -18391,84 +21165,96 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
-$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; }
if test $ac_cv_func_mmap_fixed_mapped = yes; then
-$as_echo "#define HAVE_MMAP 1" >>confdefs.h
+printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h
fi
rm -f conftest.mmap conftest.txt
-if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then :
+if test "$ac_cv_func_mmap_fixed_mapped" = "yes"
+then :
FILEMAP=unixfilemap
-else
+else $as_nop
FILEMAP=readfilemap
fi
-$as_echo "#define XML_NS 1" >>confdefs.h
+printf "%s\n" "#define XML_NS 1" >>confdefs.h
+
+
+printf "%s\n" "#define XML_GE 1" >>confdefs.h
-$as_echo "#define XML_DTD 1" >>confdefs.h
+printf "%s\n" "#define XML_DTD 1" >>confdefs.h
-$as_echo "#define XML_DEV_URANDOM 1" >>confdefs.h
+printf "%s\n" "#define XML_DEV_URANDOM 1" >>confdefs.h
# Check whether --enable-xml-attr-info was given.
-if test "${enable_xml_attr_info+set}" = set; then :
+if test ${enable_xml_attr_info+y}
+then :
enableval=$enable_xml_attr_info;
-else
+else $as_nop
enable_xml_attr_info=no
fi
-if test "x${enable_xml_attr_info}" = "xyes"; then :
+if test "x${enable_xml_attr_info}" = "xyes"
+then :
-$as_echo "#define XML_ATTR_INFO 1" >>confdefs.h
+printf "%s\n" "#define XML_ATTR_INFO 1" >>confdefs.h
fi
# Check whether --enable-xml-context was given.
-if test "${enable_xml_context+set}" = set; then :
+if test ${enable_xml_context+y}
+then :
enableval=$enable_xml_context; enable_xml_context=${enableval}
fi
-if test "x${enable_xml_context}" != "xno"; then :
+if test "x${enable_xml_context}" != "xno"
+then :
if test "x${enable_xml_context}" = "xyes" \
- -o "x${enable_xml_context}" = "x"; then :
+ -o "x${enable_xml_context}" = "x"
+then :
enable_xml_context=1024
fi
+else $as_nop
+ enable_xml_context=0
+fi
-cat >>confdefs.h <<_ACEOF
-#define XML_CONTEXT_BYTES ${enable_xml_context}
-_ACEOF
+printf "%s\n" "#define XML_CONTEXT_BYTES ${enable_xml_context}" >>confdefs.h
-fi
# Check whether --with-docbook was given.
-if test "${with_docbook+set}" = set; then :
+if test ${with_docbook+y}
+then :
withval=$with_docbook;
-else
+else $as_nop
with_docbook=check
fi
-if test "x$with_docbook" != xno; then :
+if test "x$with_docbook" != xno
+then :
for ac_prog in docbook2x-man db2x_docbook2man docbook2man docbook-to-man
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DOCBOOK_TO_MAN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DOCBOOK_TO_MAN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DOCBOOK_TO_MAN"; then
ac_cv_prog_DOCBOOK_TO_MAN="$DOCBOOK_TO_MAN" # Let the user override the test.
else
@@ -18476,11 +21262,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DOCBOOK_TO_MAN="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -18491,11 +21281,11 @@ fi
fi
DOCBOOK_TO_MAN=$ac_cv_prog_DOCBOOK_TO_MAN
if test -n "$DOCBOOK_TO_MAN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOCBOOK_TO_MAN" >&5
-$as_echo "$DOCBOOK_TO_MAN" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DOCBOOK_TO_MAN" >&5
+printf "%s\n" "$DOCBOOK_TO_MAN" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -18503,11 +21293,14 @@ fi
done
fi
-if test "x${DOCBOOK_TO_MAN}" = x -a "x$with_docbook" = xyes; then :
+if test "x${DOCBOOK_TO_MAN}" = x -a "x$with_docbook" = xyes
+then :
as_fn_error $? "Required program 'docbook2x-man' not found." "$LINENO" 5
fi
-if test "x${DOCBOOK_TO_MAN}" != x -a "x$with_docbook" != xno; then :
- if ${DOCBOOK_TO_MAN} --help | grep -i -q -F sgmlbase; then :
+if test "x${DOCBOOK_TO_MAN}" != x -a "x$with_docbook" != xno
+then :
+ if ${DOCBOOK_TO_MAN} --help | grep -i -q -F sgmlbase
+then :
as_fn_error $? "Your local ${DOCBOOK_TO_MAN} was found to work with SGML rather
than XML. Please install docbook2X and use variable DOCBOOK_TO_MAN to point
configure to command docbook2x-man of docbook2X.
@@ -18517,24 +21310,188 @@ if test "x${DOCBOOK_TO_MAN}" != x -a "x$with_docbook" != xno; then :
fi
fi
- if test "x${DOCBOOK_TO_MAN}" != x; then
- WITH_DOCBOOK_TRUE=
- WITH_DOCBOOK_FALSE='#'
+if test -f "${srcdir}"/doc/xmlwf.1
+then :
+ if true; then
+ WITH_MANPAGE_TRUE=
+ WITH_MANPAGE_FALSE='#'
+else
+ WITH_MANPAGE_TRUE='#'
+ WITH_MANPAGE_FALSE=
+fi
+
+ if test "x$with_docbook" = xno -o "x${DOCBOOK_TO_MAN}" = x
+then :
+ if true; then
+ WITH_PREBUILT_MANPAGE_TRUE=
+ WITH_PREBUILT_MANPAGE_FALSE='#'
+else
+ WITH_PREBUILT_MANPAGE_TRUE='#'
+ WITH_PREBUILT_MANPAGE_FALSE=
+fi
+
+ if false; then
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE=
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE='#'
+else
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE='#'
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE=
+fi
+
+else $as_nop
+ if false; then
+ WITH_PREBUILT_MANPAGE_TRUE=
+ WITH_PREBUILT_MANPAGE_FALSE='#'
+else
+ WITH_PREBUILT_MANPAGE_TRUE='#'
+ WITH_PREBUILT_MANPAGE_FALSE=
+fi
+
+ if true; then
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE=
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE='#'
+else
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE='#'
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE=
+fi
+
+fi
+
+else $as_nop
+ if test "x$with_docbook" != xno -a "x${DOCBOOK_TO_MAN}" != x
+then :
+ if true; then
+ WITH_MANPAGE_TRUE=
+ WITH_MANPAGE_FALSE='#'
+else
+ WITH_MANPAGE_TRUE='#'
+ WITH_MANPAGE_FALSE=
+fi
+
+ if true; then
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE=
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE='#'
+else
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE='#'
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE=
+fi
+
+else $as_nop
+ if false; then
+ WITH_MANPAGE_TRUE=
+ WITH_MANPAGE_FALSE='#'
else
- WITH_DOCBOOK_TRUE='#'
- WITH_DOCBOOK_FALSE=
+ WITH_MANPAGE_TRUE='#'
+ WITH_MANPAGE_FALSE=
fi
+ if false; then
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE=
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE='#'
+else
+ WITH_DISTRIBUTABLE_MANPAGE_TRUE='#'
+ WITH_DISTRIBUTABLE_MANPAGE_FALSE=
+fi
+
+fi
+ if false; then
+ WITH_PREBUILT_MANPAGE_TRUE=
+ WITH_PREBUILT_MANPAGE_FALSE='#'
+else
+ WITH_PREBUILT_MANPAGE_TRUE='#'
+ WITH_PREBUILT_MANPAGE_FALSE=
+fi
+
+fi
+
+if test "x${enable_xml_attr_info}" = xyes
+then :
+ EXPAT_ATTR_INFO=ON
+else $as_nop
+ EXPAT_ATTR_INFO=OFF
+fi
+EXPAT_DTD=ON
+if test "x${_INTERNAL_LARGE_SIZE_TRUE}" = x
+then :
+ EXPAT_LARGE_SIZE=ON
+else $as_nop
+ EXPAT_LARGE_SIZE=OFF
+fi
+if test "x${_INTERNAL_MIN_SIZE_TRUE}" = x
+then :
+ EXPAT_MIN_SIZE=ON
+else $as_nop
+ EXPAT_MIN_SIZE=OFF
+fi
+EXPAT_NS=ON
+if test "x${enable_xml_context}" != xno
+then :
+ EXPAT_CONTEXT_BYTES=${enable_xml_context}
+else $as_nop
+ EXPAT_CONTEXT_BYTES=OFF
+fi
+if test "x${UNICODE_TRUE}" = x
+then :
+ if test "x${_INTERNAL_UNICODE_WCHAR_T_TRUE}" = x
+then :
+ EXPAT_CHAR_TYPE=wchar_t
+else $as_nop
+ EXPAT_CHAR_TYPE=ushort
+fi
+else $as_nop
+ EXPAT_CHAR_TYPE=char
+fi
+PACKAGE_INIT="${srcdir}"/cmake/autotools/expat-package-init.cmake
+LIBDIR_BASENAME="$(basename "${libdir}")"
+SO_MAJOR="$(expr "${LIBCURRENT}" - "${LIBAGE}")"
+SO_MINOR="${LIBAGE}"
+SO_PATCH="${LIBREVISION}"
+
+
-_EXPAT_OUTPUT_NAME="$PACKAGE_NAME"
-ac_config_files="$ac_config_files Makefile expat.pc doc/Makefile examples/Makefile lib/Makefile tests/Makefile tests/benchmark/Makefile xmlwf/Makefile"
+
+
+
+if ac_fn_c_compute_int "$LINENO" "sizeof(void *)" "SIZEOF_VOID_P" ""
+then :
+
+fi
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library name prefix" >&5
+printf %s "checking for shared library name prefix... " >&6; }
+case "${host_os}" in #(
+ cygwin*) :
+ CMAKE_SHARED_LIBRARY_PREFIX=cyg ;; #(
+ *) :
+ CMAKE_SHARED_LIBRARY_PREFIX=lib ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${CMAKE_SHARED_LIBRARY_PREFIX}" >&5
+printf "%s\n" "${CMAKE_SHARED_LIBRARY_PREFIX}" >&6; }
+
+
+case "${host_os}" in #(
+ darwin*) :
+ CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__macos.cmake.in ;; #(
+ mingw*|cygwin*) :
+ CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__windows.cmake.in ;; #(
+ *) :
+ CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__linux.cmake.in ;;
+esac
+ac_config_files="$ac_config_files Makefile expat.pc cmake/expat-config.cmake cmake/autotools/expat-config-version.cmake cmake/autotools/expat-noconfig.cmake:${CMAKE_NOCONFIG_SOURCE} doc/Makefile examples/Makefile lib/Makefile tests/Makefile tests/benchmark/Makefile xmlwf/Makefile"
ac_config_files="$ac_config_files run.sh"
@@ -18565,8 +21522,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -18596,15 +21553,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -18618,8 +21575,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -18636,7 +21593,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -18647,14 +21604,14 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
-$as_echo_n "checking that generated files are newer than configure... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
if test -n "$am_sleep_pid"; then
# Hide warnings about reused PIDs.
wait $am_sleep_pid 2>/dev/null
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
-$as_echo "done" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
if test -n "$EXEEXT"; then
am__EXEEXT_TRUE=
am__EXEEXT_FALSE='#'
@@ -18663,6 +21620,10 @@ else
am__EXEEXT_FALSE=
fi
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
as_fn_error $? "conditional \"AMDEP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -18696,8 +21657,56 @@ if test -z "${UNICODE_TRUE}" && test -z "${UNICODE_FALSE}"; then
as_fn_error $? "conditional \"UNICODE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${WITH_DOCBOOK_TRUE}" && test -z "${WITH_DOCBOOK_FALSE}"; then
- as_fn_error $? "conditional \"WITH_DOCBOOK\" was never defined.
+if test -z "${_INTERNAL_UNICODE_WCHAR_T_TRUE}" && test -z "${_INTERNAL_UNICODE_WCHAR_T_FALSE}"; then
+ as_fn_error $? "conditional \"_INTERNAL_UNICODE_WCHAR_T\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${_INTERNAL_MIN_SIZE_TRUE}" && test -z "${_INTERNAL_MIN_SIZE_FALSE}"; then
+ as_fn_error $? "conditional \"_INTERNAL_MIN_SIZE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${_INTERNAL_LARGE_SIZE_TRUE}" && test -z "${_INTERNAL_LARGE_SIZE_FALSE}"; then
+ as_fn_error $? "conditional \"_INTERNAL_LARGE_SIZE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_MANPAGE_TRUE}" && test -z "${WITH_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PREBUILT_MANPAGE_TRUE}" && test -z "${WITH_PREBUILT_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PREBUILT_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_DISTRIBUTABLE_MANPAGE_TRUE}" && test -z "${WITH_DISTRIBUTABLE_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_DISTRIBUTABLE_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PREBUILT_MANPAGE_TRUE}" && test -z "${WITH_PREBUILT_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PREBUILT_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_DISTRIBUTABLE_MANPAGE_TRUE}" && test -z "${WITH_DISTRIBUTABLE_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_DISTRIBUTABLE_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_MANPAGE_TRUE}" && test -z "${WITH_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_DISTRIBUTABLE_MANPAGE_TRUE}" && test -z "${WITH_DISTRIBUTABLE_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_DISTRIBUTABLE_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_MANPAGE_TRUE}" && test -z "${WITH_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_DISTRIBUTABLE_MANPAGE_TRUE}" && test -z "${WITH_DISTRIBUTABLE_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_DISTRIBUTABLE_MANPAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_PREBUILT_MANPAGE_TRUE}" && test -z "${WITH_PREBUILT_MANPAGE_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_PREBUILT_MANPAGE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
@@ -18705,8 +21714,8 @@ fi
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -18729,14 +21738,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -18746,46 +21757,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -18794,13 +21805,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -18809,8 +21813,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -18822,30 +21830,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -18858,13 +21846,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -18891,18 +21880,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -18914,12 +21905,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -18950,7 +21942,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -18972,6 +21964,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -18985,6 +21981,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -19026,7 +22028,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -19035,7 +22037,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -19097,8 +22099,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by expat $as_me 2.2.10, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+This file was extended by expat $as_me 2.7.1, which was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -19157,17 +22159,19 @@ $config_headers
Configuration commands:
$config_commands
-Report bugs to <expat-bugs@libexpat.org>."
+Report bugs to <https://github.com/libexpat/libexpat/issues>."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-expat config.status 2.2.10
-configured by $0, generated by GNU Autoconf 2.69,
+expat config.status 2.7.1
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -19207,15 +22211,15 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
@@ -19223,7 +22227,7 @@ do
--header | --heade | --head | --hea )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
as_fn_append CONFIG_HEADERS " '$ac_optarg'"
ac_need_defaults=false;;
@@ -19232,7 +22236,7 @@ do
as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
--help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -19260,7 +22264,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -19274,7 +22278,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -19329,12 +22333,14 @@ lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_q
lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
@@ -19512,13 +22518,13 @@ LN_S \
lt_SP2NL \
lt_NL2SP \
reload_flag \
+FILECMD \
deplibs_check_method \
file_magic_cmd \
file_magic_glob \
want_nocaseglob \
sharedlib_from_linklib_cmd \
AR \
-AR_FLAGS \
archiver_list_spec \
STRIP \
RANLIB \
@@ -19680,6 +22686,9 @@ do
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"expat.pc") CONFIG_FILES="$CONFIG_FILES expat.pc" ;;
+ "cmake/expat-config.cmake") CONFIG_FILES="$CONFIG_FILES cmake/expat-config.cmake" ;;
+ "cmake/autotools/expat-config-version.cmake") CONFIG_FILES="$CONFIG_FILES cmake/autotools/expat-config-version.cmake" ;;
+ "cmake/autotools/expat-noconfig.cmake") CONFIG_FILES="$CONFIG_FILES cmake/autotools/expat-noconfig.cmake:${CMAKE_NOCONFIG_SOURCE}" ;;
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
"examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
"lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
@@ -19698,9 +22707,9 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -19735,7 +22744,24 @@ ac_tmp=$tmp
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then
-
+if $AWK 'BEGIN { getline <"/dev/null" }' </dev/null 2>/dev/null; then
+ ac_cs_awk_getline=:
+ ac_cs_awk_pipe_init=
+ ac_cs_awk_read_file='
+ while ((getline aline < (F[key])) > 0)
+ print(aline)
+ close(F[key])'
+ ac_cs_awk_pipe_fini=
+else
+ ac_cs_awk_getline=false
+ ac_cs_awk_pipe_init="print \"cat <<'|#_!!_#|' &&\""
+ ac_cs_awk_read_file='
+ print "|#_!!_#|"
+ print "cat " F[key] " &&"
+ '$ac_cs_awk_pipe_init
+ # The final `:' finishes the AND list.
+ ac_cs_awk_pipe_fini='END { print "|#_!!_#|"; print ":" }'
+fi
ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
@@ -19753,6 +22779,17 @@ fi
echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF
+# Create commands to substitute file output variables.
+{
+ echo "cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1" &&
+ echo 'cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&' &&
+ echo "$ac_subst_files" | sed 's/.*/F["&"]="$&"/' &&
+ echo "_ACAWK" &&
+ echo "_ACEOF"
+} >conf$$files.sh &&
+. ./conf$$files.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+rm -f conf$$files.sh
{
echo "cat >conf$$subs.awk <<_ACEOF" &&
@@ -19829,7 +22866,7 @@ _ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1
FS = ""
-
+ \$ac_cs_awk_pipe_init
}
{
line = $ 0
@@ -19847,10 +22884,16 @@ cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
} else
len += 1 + keylen
}
-
+ if (nfields == 3 && !substed) {
+ key = field[2]
+ if (F[key] != "" && line ~ /^[ ]*@.*@[ ]*$/) {
+ \$ac_cs_awk_read_file
+ next
+ }
+ }
print line
}
-
+\$ac_cs_awk_pipe_fini
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
@@ -20036,7 +23079,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -20044,17 +23087,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -20071,7 +23114,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -20095,9 +23138,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -20159,8 +23202,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -20197,16 +23240,21 @@ s&@INSTALL@&$ac_INSTALL&;t t
s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" |
+if $ac_cs_awk_getline; then
+ $AWK -f "$ac_tmp/subs.awk"
+else
+ $AWK -f "$ac_tmp/subs.awk" | $SHELL
+fi \
>$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -20222,20 +23270,20 @@ which seems to be undefined. Please make sure it is defined" >&2;}
#
if test x"$ac_file" != x-; then
{
- $as_echo "/* $configure_input */" \
+ printf "%s\n" "/* $configure_input */" >&1 \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
} >"$ac_tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
mv "$ac_tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
- $as_echo "/* $configure_input */" \
+ printf "%s\n" "/* $configure_input */" >&1 \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5
fi
@@ -20255,7 +23303,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$_am_arg" : 'X\(//\)[^/]' \| \
X"$_am_arg" : 'X\(//\)$' \| \
X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
+printf "%s\n" X"$_am_arg" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -20275,8 +23323,8 @@ $as_echo X"$_am_arg" |
s/.*/./; q'`/stamp-h$_am_stamp_count
;;
- :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
;;
esac
@@ -20302,7 +23350,7 @@ esac
for am_mf
do
# Strip MF so we end up with the name of the file.
- am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile which includes
# dependency-tracking related rules and includes.
# Grep'ing the whole file directly is not great: AIX grep has a line
@@ -20314,7 +23362,7 @@ $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$am_mf" : 'X\(//\)[^/]' \| \
X"$am_mf" : 'X\(//\)$' \| \
X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$am_mf" |
+printf "%s\n" X"$am_mf" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -20336,7 +23384,7 @@ $as_echo X"$am_mf" |
$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
X"$am_mf" : 'X\(//\)$' \| \
X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$am_mf" |
+printf "%s\n" X/"$am_mf" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -20361,8 +23409,8 @@ $as_echo X/"$am_mf" |
(exit $ac_status); } || am_rc=$?
done
if test $am_rc -ne 0; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "Something went wrong bootstrapping makefile fragments
for automatic dependency tracking. If GNU make was not used, consider
re-running the configure script with MAKE=\"gmake\" (or whatever is
@@ -20393,19 +23441,18 @@ See \`config.log' for more details" "$LINENO" 5; }
cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
# Generated automatically by $as_me ($PACKAGE) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
# Provide generalized library-building support services.
# Written by Gordon Matzigkeit, 1996
-# Copyright (C) 2014 Free Software Foundation, Inc.
+# Copyright (C) 2024 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# GNU Libtool is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of of the License, or
+# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License, if you
@@ -20522,6 +23569,9 @@ to_host_file_cmd=$lt_cv_to_host_file_cmd
# convert \$build files to toolchain format.
to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+# A file(cmd) program that detects file types.
+FILECMD=$lt_FILECMD
+
# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method
@@ -20540,8 +23590,11 @@ sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
# The archiver.
AR=$lt_AR
+# Flags to create an archive (by configure).
+lt_ar_flags=$lt_ar_flags
+
# Flags to create an archive.
-AR_FLAGS=$lt_AR_FLAGS
+AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"}
# How to feed a file listing to the archiver.
archiver_list_spec=$lt_archiver_list_spec
@@ -20783,7 +23836,7 @@ hardcode_direct=$hardcode_direct
# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# "absolute",i.e. impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute
@@ -20923,6 +23976,7 @@ _LT_EOF
esac
+
ltmain=$ac_aux_dir/ltmain.sh
@@ -20930,7 +23984,7 @@ ltmain=$ac_aux_dir/ltmain.sh
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "$cfgfile" \
+ $SED '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" ||
@@ -21025,7 +24079,7 @@ hardcode_direct=$hardcode_direct_CXX
# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# "absolute",i.e. impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute_CXX
@@ -21126,13 +24180,13 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}:
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:
Automake flags (can be overridden by user flags):
AM_CPPFLAGS: ${AM_CPPFLAGS}
@@ -21145,7 +24199,7 @@ User flags (override Automake flags on conflict):
CFLAGS: ${CFLAGS}
CXXFLAGS: ${CXXFLAGS}
LDFLAGS: ${LDFLAGS}" >&5
-$as_echo "$as_me:
+printf "%s\n" "$as_me:
Automake flags (can be overridden by user flags):
AM_CPPFLAGS: ${AM_CPPFLAGS}
@@ -21158,3 +24212,4 @@ User flags (override Automake flags on conflict):
CFLAGS: ${CFLAGS}
CXXFLAGS: ${CXXFLAGS}
LDFLAGS: ${LDFLAGS}" >&6;}
+
diff --git a/3rdparty/expat/configure.ac b/3rdparty/expat/configure.ac
index 82ec1fdd178..0c88b886701 100644
--- a/3rdparty/expat/configure.ac
+++ b/3rdparty/expat/configure.ac
@@ -1,21 +1,56 @@
dnl configuration script for expat
dnl Process this file with autoconf to produce a configure script.
+dnl __ __ _
+dnl ___\ \/ /_ __ __ _| |_
+dnl / _ \\ /| '_ \ / _` | __|
+dnl | __// \| |_) | (_| | |_
+dnl \___/_/\_\ .__/ \__,_|\__|
+dnl |_| XML parser
dnl
-dnl Copyright 2000 Clark Cooper
+dnl Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+dnl Copyright (c) 2000-2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+dnl Copyright (c) 2001-2003 Greg Stein <gstein@users.sourceforge.net>
+dnl Copyright (c) 2006-2012 Karl Waclawek <karl@waclawek.net>
+dnl Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+dnl Copyright (c) 2017 S. P. Zeidler <spz@netbsd.org>
+dnl Copyright (c) 2017 Stephen Groat <stephen@groat.us>
+dnl Copyright (c) 2017-2020 Joe Orton <jorton@redhat.com>
+dnl Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
+dnl Copyright (c) 2018 Benjamin Peterson <benjamin@python.org>
+dnl Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+dnl Copyright (c) 2018 KangLin <kl222@126.com>
+dnl Copyright (c) 2019 Mohammed Khajapasha <mohammed.khajapasha@intel.com>
+dnl Copyright (c) 2019 Kishore Kunche <kishore.kunche@intel.com>
+dnl Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
+dnl Copyright (c) 2024 Ferenc Géczi <ferenc.gm@gmail.com>
+dnl Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
+dnl Licensed under the MIT license:
dnl
-dnl This file is part of EXPAT.
+dnl Permission is hereby granted, free of charge, to any person obtaining
+dnl a copy of this software and associated documentation files (the
+dnl "Software"), to deal in the Software without restriction, including
+dnl without limitation the rights to use, copy, modify, merge, publish,
+dnl distribute, sublicense, and/or sell copies of the Software, and to permit
+dnl persons to whom the Software is furnished to do so, subject to the
+dnl following conditions:
dnl
-dnl EXPAT is free software; you can redistribute it and/or modify it
-dnl under the terms of the License (based on the MIT/X license) contained
-dnl in the file COPYING that comes with this distribution.
+dnl The above copyright notice and this permission notice shall be included
+dnl in all copies or substantial portions of the Software.
dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+dnl NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+dnl USE OR OTHER DEALINGS IN THE SOFTWARE.
dnl Ensure that Expat is configured with autoconf 2.69 or newer.
-AC_PREREQ(2.69)
+AC_PREREQ([2.69])
dnl Get the version number of Expat, using m4's esyscmd() command to run
dnl the command at m4-generation time. This allows us to create an m4
-dnl symbol holding the correct version number. AC_INIT() requires the
+dnl symbol holding the correct version number. AC_INIT requires the
dnl version number at m4-time, rather than when ./configure is run, so
dnl all this must happen as part of m4, not as part of the shell code
dnl contained in ./configure.
@@ -27,7 +62,7 @@ m4_define([expat_version],
m4_ifdef([__gnu__],
[esyscmd(conftools/get-version.sh lib/expat.h)],
[2.2.x]))
-AC_INIT(expat, expat_version, expat-bugs@libexpat.org)
+AC_INIT([expat], expat_version, [https://github.com/libexpat/libexpat/issues])
m4_undefine([expat_version])
AC_CONFIG_SRCDIR([Makefile.in])
@@ -35,6 +70,7 @@ AC_CONFIG_AUX_DIR([conftools])
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_HOST
AM_INIT_AUTOMAKE
+AM_MAINTAINER_MODE([enable]) # to allow argument --disable-maintainer-mode
dnl
@@ -48,12 +84,14 @@ dnl
dnl If the API changes incompatibly set LIBAGE back to 0
dnl
-LIBCURRENT=7 # sync
-LIBREVISION=12 # with
-LIBAGE=6 # CMakeLists.txt!
+LIBCURRENT=11 # sync
+LIBREVISION=2 # with
+LIBAGE=10 # CMakeLists.txt!
-AX_APPEND_FLAG([-DHAVE_EXPAT_CONFIG_H], [AM_CPPFLAGS])
-AC_CONFIG_HEADER([expat_config.h])
+AC_CONFIG_HEADERS([expat_config.h])
+AH_TOP([#ifndef EXPAT_CONFIG_H
+#define EXPAT_CONFIG_H 1])
+AH_BOTTOM([#endif // ndef EXPAT_CONFIG_H])
AM_PROG_AR
AC_PROG_INSTALL
@@ -70,6 +108,9 @@ AC_SUBST(LIBAGE)
AC_LANG([C])
AC_PROG_CC_C99
+AS_IF([test "${ac_cv_prog_cc_c99}" = no],
+ [AC_MSG_ERROR([Expat requires a C99 compiler.])])
+
AS_IF([test "$GCC" = yes],
[AX_APPEND_COMPILE_FLAGS([-Wall -Wextra], [AM_CFLAGS])
dnl Be careful about adding the -fexceptions option; some versions of
@@ -79,7 +120,7 @@ AS_IF([test "$GCC" = yes],
AX_APPEND_COMPILE_FLAGS([-fno-strict-aliasing -Wmissing-prototypes -Wstrict-prototypes], [AM_CFLAGS])
AX_APPEND_COMPILE_FLAGS([-pedantic -Wduplicated-cond -Wduplicated-branches -Wlogical-op], [AM_CFLAGS])
AX_APPEND_COMPILE_FLAGS([-Wrestrict -Wnull-dereference -Wjump-misses-init -Wdouble-promotion], [AM_CFLAGS])
- AX_APPEND_COMPILE_FLAGS([-Wshadow -Wformat=2 -Wmisleading-indentation], [AM_CFLAGS])])
+ AX_APPEND_COMPILE_FLAGS([-Wshadow -Wformat=2 -Wno-pedantic-ms-format -Wmisleading-indentation], [AM_CFLAGS])])
AC_LANG_PUSH([C++])
AC_PROG_CXX
@@ -102,11 +143,9 @@ AS_CASE(["$LD"],[*clang*],
[*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])
EXPATCFG_COMPILER_SUPPORTS_VISIBILITY([
- AX_APPEND_FLAG([-fvisibility=hidden], [AM_CFLAGS])
- AX_APPEND_FLAG([-DXML_ENABLE_VISIBILITY=1], [AM_CPPFLAGS])])
-
-dnl Checks for header files.
-AC_HEADER_STDC
+ AX_APPEND_FLAG([-fvisibility=hidden], [AM_CFLAGS])
+ AS_IF([test "${enable_shared}" = yes],
+ [AX_APPEND_FLAG([-DXML_ENABLE_VISIBILITY=1], [AM_CPPFLAGS])])])
dnl Checks for typedefs, structures, and compiler characteristics.
@@ -123,7 +162,6 @@ AC_C_BIGENDIAN([AC_DEFINE([WORDS_BIGENDIAN], 1)
AC_DEFINE_UNQUOTED([BYTEORDER], $BYTEORDER, [1234 = LILENDIAN, 4321 = BIGENDIAN])
AC_C_CONST
-AC_TYPE_SIZE_T
AC_ARG_WITH([xmlwf],
[AS_HELP_STRING([--without-xmlwf], [do not build xmlwf])],
@@ -143,6 +181,8 @@ AC_ARG_WITH([tests],
[with_tests=yes])
AM_CONDITIONAL([WITH_TESTS], [test x${with_tests} = xyes])
+AS_IF([test x${with_tests} = xyes],
+ [AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])])
AS_VAR_SET([EXPATCFG_ON_MINGW],[no])
AS_CASE("${host_os}",
@@ -151,8 +191,13 @@ AS_CASE("${host_os}",
AC_MSG_NOTICE([detected OS: MinGW])])
AM_CONDITIONAL([MINGW], [test x${EXPATCFG_ON_MINGW} = xyes])
+dnl Note: Prefix "_INTERNAL_" here means exclusive use inside of file configure.ac
AM_CONDITIONAL([UNICODE], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_UNICODE >/dev/null])
+AM_CONDITIONAL([_INTERNAL_UNICODE_WCHAR_T], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_UNICODE_WCHAR_T >/dev/null])
+AM_CONDITIONAL([_INTERNAL_MIN_SIZE], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_MIN_SIZE >/dev/null])
+AM_CONDITIONAL([_INTERNAL_LARGE_SIZE], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_LARGE_SIZE >/dev/null])
+LT_LIB_M
AC_ARG_WITH([libbsd],
[AS_HELP_STRING([--with-libbsd], [utilize libbsd (for arc4random_buf)])],
@@ -164,14 +209,16 @@ AS_IF([test "x${with_libbsd}" != xno],
[],
[AS_IF([test "x${with_libbsd}" = xyes],
[AC_MSG_ERROR([Enforced use of libbsd cannot be satisfied.])])])])
-AC_MSG_CHECKING([for arc4random_buf (BSD or libbsd)])
+AC_MSG_CHECKING([for arc4random_buf (BSD, libbsd or glibc 2.36+)])
AC_LINK_IFELSE([AC_LANG_SOURCE([
- #include <stdlib.h> /* for arc4random_buf on BSD, for NULL */
#if defined(HAVE_LIBBSD)
# include <bsd/stdlib.h>
+ #else
+ # include <stdlib.h> /* for arc4random_buf on BSD */
#endif
- int main() {
- arc4random_buf(NULL, 0U);
+ int main(void) {
+ char dummy[[123]]; // double brackets for m4
+ arc4random_buf(dummy, 0U);
return 0;
}
])],
@@ -179,14 +226,14 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([
AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
- AC_MSG_CHECKING([for arc4random (BSD, macOS or libbsd)])
+ AC_MSG_CHECKING([for arc4random (BSD, macOS, libbsd or glibc 2.36+)])
AC_LINK_IFELSE([AC_LANG_SOURCE([
#if defined(HAVE_LIBBSD)
# include <bsd/stdlib.h>
#else
# include <stdlib.h>
#endif
- int main() {
+ int main(void) {
arc4random();
return 0;
}
@@ -208,7 +255,7 @@ AS_IF([test "x$with_getrandom" != xno],
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <stdlib.h> /* for NULL */
#include <sys/random.h>
- int main() {
+ int main(void) {
return getrandom(NULL, 0U, 0U);
}
])],
@@ -229,10 +276,11 @@ AS_HELP_STRING([--without-sys-getrandom],
AS_IF([test "x$with_sys_getrandom" != xno],
[AC_MSG_CHECKING([for syscall SYS_getrandom (Linux 3.17+)])
AC_LINK_IFELSE([AC_LANG_SOURCE([
+ #define _GNU_SOURCE
#include <stdlib.h> /* for NULL */
#include <unistd.h> /* for syscall */
#include <sys/syscall.h> /* for SYS_getrandom */
- int main() {
+ int main(void) {
syscall(SYS_getrandom, NULL, 0, 0);
return 0;
}
@@ -257,6 +305,8 @@ AC_SUBST(FILEMAP)
dnl Some basic configuration:
AC_DEFINE([XML_NS], 1,
[Define to make XML Namespaces functionality available.])
+AC_DEFINE([XML_GE], 1,
+ [Define as 1/0 to enable/disable support for general entities.])
AC_DEFINE([XML_DTD], 1,
[Define to make parameter entity parsing functionality available.])
AC_DEFINE([XML_DEV_URANDOM], 1,
@@ -281,9 +331,10 @@ AS_HELP_STRING([--disable-xml-context],
AS_IF([test "x${enable_xml_context}" != "xno"],
[AS_IF([test "x${enable_xml_context}" = "xyes" \
-o "x${enable_xml_context}" = "x"],
- [AS_VAR_SET(enable_xml_context,1024)])
- AC_DEFINE_UNQUOTED([XML_CONTEXT_BYTES], [${enable_xml_context}],
- [Define to specify how much context to retain around the current parse point.])])
+ [AS_VAR_SET(enable_xml_context,1024)])],
+ [AS_VAR_SET(enable_xml_context,0)])
+AC_DEFINE_UNQUOTED([XML_CONTEXT_BYTES], [${enable_xml_context}],
+ [Define to specify how much context to retain around the current parse point, 0 to disable.])
AC_ARG_WITH([docbook],
[AS_HELP_STRING([--with-docbook],
@@ -307,7 +358,72 @@ AS_IF([test "x${DOCBOOK_TO_MAN}" != x -a "x$with_docbook" != xno],
You can also configure using --without-docbook if you can do without a man
page for xmlwf.])])])
-AM_CONDITIONAL(WITH_DOCBOOK, [test "x${DOCBOOK_TO_MAN}" != x])
+dnl This will make sure that a release tarball shipping a pre-rendered xmlwf man page will
+dnl get it installed, when no working flavor of docbook2man is available (or wanted).
+dnl This relies on file xmlwf.1 being at least as recent as its source file xmlwf.xml.
+AS_IF([test -f "${srcdir}"/doc/xmlwf.1],
+ [AM_CONDITIONAL(WITH_MANPAGE, [true])
+ AS_IF([test "x$with_docbook" = xno -o "x${DOCBOOK_TO_MAN}" = x],
+ [AM_CONDITIONAL(WITH_PREBUILT_MANPAGE, [true])
+ AM_CONDITIONAL(WITH_DISTRIBUTABLE_MANPAGE, [false])],
+ [AM_CONDITIONAL(WITH_PREBUILT_MANPAGE, [false])
+ AM_CONDITIONAL(WITH_DISTRIBUTABLE_MANPAGE, [true])])
+ ],
+ [AS_IF([test "x$with_docbook" != xno -a "x${DOCBOOK_TO_MAN}" != x],
+ [AM_CONDITIONAL(WITH_MANPAGE, [true])
+ AM_CONDITIONAL(WITH_DISTRIBUTABLE_MANPAGE, [true])],
+ [AM_CONDITIONAL(WITH_MANPAGE, [false])
+ AM_CONDITIONAL(WITH_DISTRIBUTABLE_MANPAGE, [false])])
+ AM_CONDITIONAL(WITH_PREBUILT_MANPAGE, [false])])
+
+dnl Configure CMake file templates
+dnl NOTE: The *_TRUE variables read here are Automake conditionals
+dnl that are either set to "" when enabled or to "#" when disabled
+dnl (because they are used to dynamically comment out certain things)
+AS_IF([test "x${enable_xml_attr_info}" = xyes],
+ [EXPAT_ATTR_INFO=ON],
+ [EXPAT_ATTR_INFO=OFF])
+EXPAT_DTD=ON
+AS_IF([test "x${_INTERNAL_LARGE_SIZE_TRUE}" = x],
+ [EXPAT_LARGE_SIZE=ON],
+ [EXPAT_LARGE_SIZE=OFF])
+AS_IF([test "x${_INTERNAL_MIN_SIZE_TRUE}" = x],
+ [EXPAT_MIN_SIZE=ON],
+ [EXPAT_MIN_SIZE=OFF])
+EXPAT_NS=ON
+AS_IF([test "x${enable_xml_context}" != xno],
+ [EXPAT_CONTEXT_BYTES=${enable_xml_context}],
+ [EXPAT_CONTEXT_BYTES=OFF])
+AS_IF([test "x${UNICODE_TRUE}" = x],
+ [AS_IF(
+ [test "x${_INTERNAL_UNICODE_WCHAR_T_TRUE}" = x],
+ [EXPAT_CHAR_TYPE=wchar_t],
+ [EXPAT_CHAR_TYPE=ushort])],
+ [EXPAT_CHAR_TYPE=char])
+PACKAGE_INIT="${srcdir}"/cmake/autotools/expat-package-init.cmake
+LIBDIR_BASENAME="$(basename "${libdir}")"
+SO_MAJOR="$(expr "${LIBCURRENT}" - "${LIBAGE}")"
+SO_MINOR="${LIBAGE}"
+SO_PATCH="${LIBREVISION}"
+AC_SUBST([EXPAT_ATTR_INFO])
+AC_SUBST([EXPAT_DTD])
+AC_SUBST([EXPAT_LARGE_SIZE])
+AC_SUBST([EXPAT_MIN_SIZE])
+AC_SUBST([EXPAT_NS])
+AC_SUBST([EXPAT_CONTEXT_BYTES])
+AC_SUBST([EXPAT_CHAR_TYPE])
+AC_SUBST_FILE([PACKAGE_INIT])
+AC_SUBST([LIBDIR_BASENAME])
+AC_SUBST([SO_MAJOR])
+AC_SUBST([SO_MINOR])
+AC_SUBST([SO_PATCH])
+
+dnl The canonical way of doing this is AC_CHECK_SIZEOF(void *), but
+dnl that adds SIZEOF_VOID_P to expat_config.h.in, making it difficult
+dnl to have 32-bit and 64-bit versions of libexpat installed on the
+dnl same system with a single, shared copy of the header.
+AC_COMPUTE_INT(SIZEOF_VOID_P, [sizeof(void *)])
+AC_SUBST([SIZEOF_VOID_P])
dnl write the Automake flags we set
AC_SUBST([AM_CPPFLAGS])
@@ -315,11 +431,23 @@ AC_SUBST([AM_CFLAGS])
AC_SUBST([AM_CXXFLAGS])
AC_SUBST([AM_LDFLAGS])
-dnl updating _EXPAT_OUTPUT_NAME variable to effect the package name in expat.pc file (issue #361)
-AC_SUBST(_EXPAT_OUTPUT_NAME, ["$PACKAGE_NAME"])
+dnl Emulate the use of CMAKE_SHARED_LIBRARY_PREFIX under CMake
+AC_MSG_CHECKING([for shared library name prefix])
+AS_CASE("${host_os}",
+ [cygwin*], [CMAKE_SHARED_LIBRARY_PREFIX=cyg],
+ [CMAKE_SHARED_LIBRARY_PREFIX=lib])
+AC_MSG_RESULT([${CMAKE_SHARED_LIBRARY_PREFIX}])
+AC_SUBST([CMAKE_SHARED_LIBRARY_PREFIX])
+AS_CASE("${host_os}",
+ [darwin*], [CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__macos.cmake.in],
+ [mingw*|cygwin*], [CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__windows.cmake.in],
+ [CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__linux.cmake.in])
AC_CONFIG_FILES([Makefile]
[expat.pc]
+ [cmake/expat-config.cmake]
+ [cmake/autotools/expat-config-version.cmake]
+ [cmake/autotools/expat-noconfig.cmake:${CMAKE_NOCONFIG_SOURCE}]
[doc/Makefile]
[examples/Makefile]
[lib/Makefile]
diff --git a/3rdparty/expat/conftools/PrintPath b/3rdparty/expat/conftools/PrintPath
deleted file mode 100755
index e8559a3d643..00000000000
--- a/3rdparty/expat/conftools/PrintPath
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/bin/sh
-# Look for program[s] somewhere in $PATH.
-#
-# Options:
-# -s
-# Do not print out full pathname. (silent)
-# -pPATHNAME
-# Look in PATHNAME instead of $PATH
-#
-# Usage:
-# PrintPath [-s] [-pPATHNAME] program [program ...]
-#
-# Initially written by Jim Jagielski for the Apache configuration mechanism
-# (with kudos to Kernighan/Pike)
-#
-# This script falls under the Apache License.
-# See http://www.apache.org/licenses/LICENSE
-
-##
-# Some "constants"
-##
-pathname=$PATH
-echo="yes"
-
-##
-# Find out what OS we are running for later on
-##
-os=`(uname) 2>/dev/null`
-
-##
-# Parse command line
-##
-for args in $*
-do
- case $args in
- -s ) echo="no" ;;
- -p* ) pathname="`echo $args | sed 's/^..//'`" ;;
- * ) programs="$programs $args" ;;
- esac
-done
-
-##
-# Now we make the adjustments required for OS/2 and everyone
-# else :)
-#
-# First of all, all OS/2 programs have the '.exe' extension.
-# Next, we adjust PATH (or what was given to us as PATH) to
-# be whitespace separated directories.
-# Finally, we try to determine the best flag to use for
-# test/[] to look for an executable file. OS/2 just has '-r'
-# but with other OSs, we do some funny stuff to check to see
-# if test/[] knows about -x, which is the preferred flag.
-##
-
-if [ "x$os" = "xOS/2" ]
-then
- ext=".exe"
- pathname=`echo -E $pathname |
- sed 's/^;/.;/
- s/;;/;.;/g
- s/;$/;./
- s/;/ /g
- s/\\\\/\\//g' `
- test_exec_flag="-r"
-else
- ext="" # No default extensions
- pathname=`echo $pathname |
- sed 's/^:/.:/
- s/::/:.:/g
- s/:$/:./
- s/:/ /g' `
- # Here is how we test to see if test/[] can handle -x
- testfile="pp.t.$$"
-
- cat > $testfile <<ENDTEST
-#!/bin/sh
-if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then
- exit 0
-fi
-exit 1
-ENDTEST
-
- if `/bin/sh $testfile 2>/dev/null`; then
- test_exec_flag="-x"
- else
- test_exec_flag="-r"
- fi
- rm -f $testfile
-fi
-
-for program in $programs
-do
- for path in $pathname
- do
- if [ $test_exec_flag $path/${program}${ext} ] && \
- [ ! -d $path/${program}${ext} ]; then
- if [ "x$echo" = "xyes" ]; then
- echo $path/${program}${ext}
- fi
- exit 0
- fi
-
-# Next try without extension (if one was used above)
- if [ "x$ext" != "x" ]; then
- if [ $test_exec_flag $path/${program} ] && \
- [ ! -d $path/${program} ]; then
- if [ "x$echo" = "xyes" ]; then
- echo $path/${program}
- fi
- exit 0
- fi
- fi
- done
-done
-exit 1
-
diff --git a/3rdparty/expat/conftools/ar-lib b/3rdparty/expat/conftools/ar-lib
index 1e9388e2ae3..c349042c3fa 100755
--- a/3rdparty/expat/conftools/ar-lib
+++ b/3rdparty/expat/conftools/ar-lib
@@ -4,7 +4,7 @@
me=ar-lib
scriptversion=2019-07-04.01; # UTC
-# Copyright (C) 2010-2020 Free Software Foundation, Inc.
+# Copyright (C) 2010-2021 Free Software Foundation, Inc.
# Written by Peter Rosin <peda@lysator.liu.se>.
#
# This program is free software; you can redistribute it and/or modify
diff --git a/3rdparty/expat/conftools/ax-cxx-compile-stdcxx-11.m4 b/3rdparty/expat/conftools/ax-cxx-compile-stdcxx-11.m4
new file mode 100644
index 00000000000..1733fd85f95
--- /dev/null
+++ b/3rdparty/expat/conftools/ax-cxx-compile-stdcxx-11.m4
@@ -0,0 +1,39 @@
+# =============================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
+# =============================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the C++11
+# standard; if necessary, add switches to CXX and CXXCPP to enable
+# support.
+#
+# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
+# macro with the version set to C++11. The two optional arguments are
+# forwarded literally as the second and third argument respectively.
+# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
+# more information. If you want to use this macro, you also need to
+# download the ax_cxx_compile_stdcxx.m4 file.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
+# Copyright (c) 2015 Paul Norman <penorman@mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 18
+
+AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX])
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])])
diff --git a/3rdparty/expat/conftools/ax-cxx-compile-stdcxx.m4 b/3rdparty/expat/conftools/ax-cxx-compile-stdcxx.m4
new file mode 100644
index 00000000000..8edf5152ec7
--- /dev/null
+++ b/3rdparty/expat/conftools/ax-cxx-compile-stdcxx.m4
@@ -0,0 +1,1018 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the specified
+# version of the C++ standard. If necessary, add switches to CXX and
+# CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for
+# the respective C++ standard version.
+#
+# The second argument, if specified, indicates whether you insist on an
+# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+# -std=c++11). If neither is specified, you get whatever works, with
+# preference for no added switch, and then for an extended mode.
+#
+# The third argument, if specified 'mandatory' or if left unspecified,
+# indicates that baseline support for the specified C++ standard is
+# required and that the macro should error out if no mode with that
+# support is found. If specified 'optional', then configuration proceeds
+# regardless, after defining HAVE_CXX${VERSION} if and only if a
+# supporting mode is found.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
+# Copyright (c) 2015 Paul Norman <penorman@mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
+# Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com>
+# Copyright (c) 2020 Jason Merrill <jason@redhat.com>
+# Copyright (c) 2021 Jörn Heusipp <osmanx@problemloesungsmaschine.de>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 18
+
+dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
+dnl (serial version number 13).
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
+ m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
+ [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
+ [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
+ [$1], [20], [ax_cxx_compile_alternatives="20"],
+ [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$2], [], [],
+ [$2], [ext], [],
+ [$2], [noext], [],
+ [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
+ [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
+ AC_LANG_PUSH([C++])dnl
+ ac_success=no
+
+ m4_if([$2], [], [dnl
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
+ ax_cv_cxx_compile_cxx$1,
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [ax_cv_cxx_compile_cxx$1=yes],
+ [ax_cv_cxx_compile_cxx$1=no])])
+ if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
+ ac_success=yes
+ fi])
+
+ m4_if([$2], [noext], [], [dnl
+ if test x$ac_success = xno; then
+ for alternative in ${ax_cxx_compile_alternatives}; do
+ switch="-std=gnu++${alternative}"
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXX="$ac_save_CXX"])
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ if test -n "$CXXCPP" ; then
+ CXXCPP="$CXXCPP $switch"
+ fi
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+
+ m4_if([$2], [ext], [], [dnl
+ if test x$ac_success = xno; then
+ dnl HP's aCC needs +std=c++11 according to:
+ dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
+ dnl Cray's crayCC needs "-h std=c++11"
+ dnl MSVC needs -std:c++NN for C++17 and later (default is C++14)
+ for alternative in ${ax_cxx_compile_alternatives}; do
+ for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do
+ if test x"$switch" = xMSVC; then
+ dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide
+ dnl with -std=c++17. We suffix the cache variable name with _MSVC to
+ dnl avoid this.
+ switch=-std:c++${alternative}
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC])
+ else
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ fi
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXX="$ac_save_CXX"])
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ if test -n "$CXXCPP" ; then
+ CXXCPP="$CXXCPP $switch"
+ fi
+ ac_success=yes
+ break
+ fi
+ done
+ if test x$ac_success = xyes; then
+ break
+ fi
+ done
+ fi])
+ AC_LANG_POP([C++])
+ if test x$ax_cxx_compile_cxx$1_required = xtrue; then
+ if test x$ac_success = xno; then
+ AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
+ fi
+ fi
+ if test x$ac_success = xno; then
+ HAVE_CXX$1=0
+ AC_MSG_NOTICE([No compiler with C++$1 support was found])
+ else
+ HAVE_CXX$1=1
+ AC_DEFINE(HAVE_CXX$1,1,
+ [define if the compiler supports basic C++$1 syntax])
+ fi
+ AC_SUBST(HAVE_CXX$1)
+])
+
+
+dnl Test body for checking C++11 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+)
+
+dnl Test body for checking C++14 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+)
+
+dnl Test body for checking C++17 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
+)
+
+dnl Test body for checking C++20 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_20
+)
+
+
+dnl Tests for new features in C++11
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+// MSVC always sets __cplusplus to 199711L in older versions; newer versions
+// only set it correctly if /Zc:__cplusplus is specified as well as a
+// /std:c++NN switch:
+// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
+#elif __cplusplus < 201103L && !defined _MSC_VER
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual ~Base() {}
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual ~Derived() override {}
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+]])
+
+
+dnl Tests for new features in C++14
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L && !defined _MSC_VER
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+ namespace test_polymorphic_lambdas
+ {
+
+ int
+ test()
+ {
+ const auto lambda = [](auto&&... args){
+ const auto istiny = [](auto x){
+ return (sizeof(x) == 1UL) ? 1 : 0;
+ };
+ const int aretiny[] = { istiny(args)... };
+ return aretiny[0];
+ };
+ return lambda(1, 1L, 1.0f, '1');
+ }
+
+ }
+
+ namespace test_binary_literals
+ {
+
+ constexpr auto ivii = 0b0000000000101010;
+ static_assert(ivii == 42, "wrong value");
+
+ }
+
+ namespace test_generalized_constexpr
+ {
+
+ template < typename CharT >
+ constexpr unsigned long
+ strlen_c(const CharT *const s) noexcept
+ {
+ auto length = 0UL;
+ for (auto p = s; *p; ++p)
+ ++length;
+ return length;
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("x") == 1UL, "");
+ static_assert(strlen_c("test") == 4UL, "");
+ static_assert(strlen_c("another\0test") == 7UL, "");
+
+ }
+
+ namespace test_lambda_init_capture
+ {
+
+ int
+ test()
+ {
+ auto x = 0;
+ const auto lambda1 = [a = x](int b){ return a + b; };
+ const auto lambda2 = [a = lambda1(x)](){ return a; };
+ return lambda2();
+ }
+
+ }
+
+ namespace test_digit_separators
+ {
+
+ constexpr auto ten_million = 100'000'000;
+ static_assert(ten_million == 100000000, "");
+
+ }
+
+ namespace test_return_type_deduction
+ {
+
+ auto f(int& x) { return x; }
+ decltype(auto) g(int& x) { return x; }
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static constexpr auto value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static constexpr auto value = true;
+ };
+
+ int
+ test()
+ {
+ auto x = 0;
+ static_assert(is_same<int, decltype(f(x))>::value, "");
+ static_assert(is_same<int&, decltype(g(x))>::value, "");
+ return x;
+ }
+
+ }
+
+} // namespace cxx14
+
+#endif // __cplusplus >= 201402L
+
+]])
+
+
+dnl Tests for new features in C++17
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
+
+// If the compiler admits that it is not ready for C++17, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201703L && !defined _MSC_VER
+
+#error "This is not a C++17 compiler"
+
+#else
+
+#include <initializer_list>
+#include <utility>
+#include <type_traits>
+
+namespace cxx17
+{
+
+ namespace test_constexpr_lambdas
+ {
+
+ constexpr int foo = [](){return 42;}();
+
+ }
+
+ namespace test::nested_namespace::definitions
+ {
+
+ }
+
+ namespace test_fold_expression
+ {
+
+ template<typename... Args>
+ int multiply(Args... args)
+ {
+ return (args * ... * 1);
+ }
+
+ template<typename... Args>
+ bool all(Args... args)
+ {
+ return (args && ...);
+ }
+
+ }
+
+ namespace test_extended_static_assert
+ {
+
+ static_assert (true);
+
+ }
+
+ namespace test_auto_brace_init_list
+ {
+
+ auto foo = {5};
+ auto bar {5};
+
+ static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
+ static_assert(std::is_same<int, decltype(bar)>::value);
+ }
+
+ namespace test_typename_in_template_template_parameter
+ {
+
+ template<template<typename> typename X> struct D;
+
+ }
+
+ namespace test_fallthrough_nodiscard_maybe_unused_attributes
+ {
+
+ int f1()
+ {
+ return 42;
+ }
+
+ [[nodiscard]] int f2()
+ {
+ [[maybe_unused]] auto unused = f1();
+
+ switch (f1())
+ {
+ case 17:
+ f1();
+ [[fallthrough]];
+ case 42:
+ f1();
+ }
+ return f1();
+ }
+
+ }
+
+ namespace test_extended_aggregate_initialization
+ {
+
+ struct base1
+ {
+ int b1, b2 = 42;
+ };
+
+ struct base2
+ {
+ base2() {
+ b3 = 42;
+ }
+ int b3;
+ };
+
+ struct derived : base1, base2
+ {
+ int d;
+ };
+
+ derived d1 {{1, 2}, {}, 4}; // full initialization
+ derived d2 {{}, {}, 4}; // value-initialized bases
+
+ }
+
+ namespace test_general_range_based_for_loop
+ {
+
+ struct iter
+ {
+ int i;
+
+ int& operator* ()
+ {
+ return i;
+ }
+
+ const int& operator* () const
+ {
+ return i;
+ }
+
+ iter& operator++()
+ {
+ ++i;
+ return *this;
+ }
+ };
+
+ struct sentinel
+ {
+ int i;
+ };
+
+ bool operator== (const iter& i, const sentinel& s)
+ {
+ return i.i == s.i;
+ }
+
+ bool operator!= (const iter& i, const sentinel& s)
+ {
+ return !(i == s);
+ }
+
+ struct range
+ {
+ iter begin() const
+ {
+ return {0};
+ }
+
+ sentinel end() const
+ {
+ return {5};
+ }
+ };
+
+ void f()
+ {
+ range r {};
+
+ for (auto i : r)
+ {
+ [[maybe_unused]] auto v = i;
+ }
+ }
+
+ }
+
+ namespace test_lambda_capture_asterisk_this_by_value
+ {
+
+ struct t
+ {
+ int i;
+ int foo()
+ {
+ return [*this]()
+ {
+ return i;
+ }();
+ }
+ };
+
+ }
+
+ namespace test_enum_class_construction
+ {
+
+ enum class byte : unsigned char
+ {};
+
+ byte foo {42};
+
+ }
+
+ namespace test_constexpr_if
+ {
+
+ template <bool cond>
+ int f ()
+ {
+ if constexpr(cond)
+ {
+ return 13;
+ }
+ else
+ {
+ return 42;
+ }
+ }
+
+ }
+
+ namespace test_selection_statement_with_initializer
+ {
+
+ int f()
+ {
+ return 13;
+ }
+
+ int f2()
+ {
+ if (auto i = f(); i > 0)
+ {
+ return 3;
+ }
+
+ switch (auto i = f(); i + 4)
+ {
+ case 17:
+ return 2;
+
+ default:
+ return 1;
+ }
+ }
+
+ }
+
+ namespace test_template_argument_deduction_for_class_templates
+ {
+
+ template <typename T1, typename T2>
+ struct pair
+ {
+ pair (T1 p1, T2 p2)
+ : m1 {p1},
+ m2 {p2}
+ {}
+
+ T1 m1;
+ T2 m2;
+ };
+
+ void f()
+ {
+ [[maybe_unused]] auto p = pair{13, 42u};
+ }
+
+ }
+
+ namespace test_non_type_auto_template_parameters
+ {
+
+ template <auto n>
+ struct B
+ {};
+
+ B<5> b1;
+ B<'a'> b2;
+
+ }
+
+ namespace test_structured_bindings
+ {
+
+ int arr[2] = { 1, 2 };
+ std::pair<int, int> pr = { 1, 2 };
+
+ auto f1() -> int(&)[2]
+ {
+ return arr;
+ }
+
+ auto f2() -> std::pair<int, int>&
+ {
+ return pr;
+ }
+
+ struct S
+ {
+ int x1 : 2;
+ volatile double y1;
+ };
+
+ S f3()
+ {
+ return {};
+ }
+
+ auto [ x1, y1 ] = f1();
+ auto& [ xr1, yr1 ] = f1();
+ auto [ x2, y2 ] = f2();
+ auto& [ xr2, yr2 ] = f2();
+ const auto [ x3, y3 ] = f3();
+
+ }
+
+ namespace test_exception_spec_type_system
+ {
+
+ struct Good {};
+ struct Bad {};
+
+ void g1() noexcept;
+ void g2();
+
+ template<typename T>
+ Bad
+ f(T*, T*);
+
+ template<typename T1, typename T2>
+ Good
+ f(T1*, T2*);
+
+ static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
+
+ }
+
+ namespace test_inline_variables
+ {
+
+ template<class T> void f(T)
+ {}
+
+ template<class T> inline T g(T)
+ {
+ return T{};
+ }
+
+ template<> inline void f<>(int)
+ {}
+
+ template<> int g<>(int)
+ {
+ return 5;
+ }
+
+ }
+
+} // namespace cxx17
+
+#endif // __cplusplus < 201703L && !defined _MSC_VER
+
+]])
+
+
+dnl Tests for new features in C++20
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 202002L && !defined _MSC_VER
+
+#error "This is not a C++20 compiler"
+
+#else
+
+#include <version>
+
+namespace cxx20
+{
+
+// As C++20 supports feature test macros in the standard, there is no
+// immediate need to actually test for feature availability on the
+// Autoconf side.
+
+} // namespace cxx20
+
+#endif // __cplusplus < 202002L && !defined _MSC_VER
+
+]])
diff --git a/3rdparty/expat/conftools/compile b/3rdparty/expat/conftools/compile
index 23fcba01132..df363c8fbfb 100755
--- a/3rdparty/expat/conftools/compile
+++ b/3rdparty/expat/conftools/compile
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# This program is free software; you can redistribute it and/or modify
diff --git a/3rdparty/expat/conftools/config.guess b/3rdparty/expat/conftools/config.guess
index df895493ef7..160ecf0951b 100755
--- a/3rdparty/expat/conftools/config.guess
+++ b/3rdparty/expat/conftools/config.guess
@@ -1,12 +1,14 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2019 Free Software Foundation, Inc.
+# Copyright 1992-2022 Free Software Foundation, Inc.
-timestamp='2019-09-10'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-05-08'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
@@ -27,11 +29,19 @@ timestamp='2019-09-10'
# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
#
# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
#
# Please send patches to <config-patches@gnu.org>.
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
@@ -50,7 +60,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,6 +94,9 @@ if test $# != 0; then
exit 1
fi
+# Just in case it came from the environment.
+GUESS=
+
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
# temporary files to be created and, as you can see below, it is a
@@ -99,8 +112,10 @@ tmp=
trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
: "${TMPDIR=/tmp}"
- # shellcheck disable=SC2039
+ # shellcheck disable=SC2039,SC3028
{ tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
@@ -110,7 +125,7 @@ set_cc_for_build() {
,,) echo "int x;" > "$dummy.c"
for driver in cc gcc c89 c99 ; do
if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$driver"
+ CC_FOR_BUILD=$driver
break
fi
done
@@ -131,14 +146,12 @@ fi
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-case "$UNAME_SYSTEM" in
+case $UNAME_SYSTEM in
Linux|GNU|GNU/*)
- # If the system lacks a compiler, then just pick glibc.
- # We could probably try harder.
- LIBC=gnu
+ LIBC=unknown
set_cc_for_build
cat <<-EOF > "$dummy.c"
@@ -147,24 +160,37 @@ Linux|GNU|GNU/*)
LIBC=uclibc
#elif defined(__dietlibc__)
LIBC=dietlibc
- #else
+ #elif defined(__GLIBC__)
LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
#endif
EOF
- eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
- # If ldd exists, use it to detect musl libc.
- if command -v ldd >/dev/null && \
- ldd --version 2>&1 | grep -q ^musl
- then
- LIBC=musl
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
fi
;;
esac
# Note: order is significant - the case branches are not exclusive.
-case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
*:NetBSD:*:*)
# NetBSD (nbsd) targets should (where applicable) match one or
# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
@@ -176,12 +202,12 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
#
# Note: NetBSD doesn't particularly care about the vendor
# portion of the name. We always set it to "unknown".
- sysctl="sysctl -n hw.machine_arch"
UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
- "/sbin/$sysctl" 2>/dev/null || \
- "/usr/sbin/$sysctl" 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
echo unknown)`
- case "$UNAME_MACHINE_ARCH" in
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
armeb) machine=armeb-unknown ;;
arm*) machine=arm-unknown ;;
sh3el) machine=shl-unknown ;;
@@ -190,13 +216,13 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
earmv*)
arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
- machine="${arch}${endian}"-unknown
+ machine=${arch}${endian}-unknown
;;
- *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+ *) machine=$UNAME_MACHINE_ARCH-unknown ;;
esac
# The Operating System including object format, if it has switched
# to ELF recently (or will in the future) and ABI.
- case "$UNAME_MACHINE_ARCH" in
+ case $UNAME_MACHINE_ARCH in
earm*)
os=netbsdelf
;;
@@ -217,7 +243,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
;;
esac
# Determine ABI tags.
- case "$UNAME_MACHINE_ARCH" in
+ case $UNAME_MACHINE_ARCH in
earm*)
expr='s/^earmv[0-9]/-eabi/;s/eb$//'
abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
@@ -228,7 +254,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# thus, need a distinct triplet. However, they do not need
# kernel version information, so it can be replaced with a
# suitable tag, in the style of linux-gnu.
- case "$UNAME_VERSION" in
+ case $UNAME_VERSION in
Debian*)
release='-gnu'
;;
@@ -239,51 +265,57 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "$machine-${os}${release}${abi-}"
- exit ;;
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
*:Bitrig:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
- echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
*:OpenBSD:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
- echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
*:LibertyBSD:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
- echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
*:MidnightBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
*:ekkoBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
*:SolidBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
*:OS108:*:*)
- echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
*:MirBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
*:Sortix:*:*)
- echo "$UNAME_MACHINE"-unknown-sortix
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
*:Twizzler:*:*)
- echo "$UNAME_MACHINE"-unknown-twizzler
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
*:Redox:*:*)
- echo "$UNAME_MACHINE"-unknown-redox
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
mips:OSF1:*.*)
- echo mips-dec-osf1
- exit ;;
+ GUESS=mips-dec-osf1
+ ;;
alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
case $UNAME_RELEASE in
*4.0)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
@@ -297,7 +329,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# covers most systems running today. This code pipes the CPU
# types through head -n 1, so we only detect the type of CPU 0.
ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
- case "$ALPHA_CPU_TYPE" in
+ case $ALPHA_CPU_TYPE in
"EV4 (21064)")
UNAME_MACHINE=alpha ;;
"EV4.5 (21064)")
@@ -334,117 +366,121 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
- echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
+ GUESS=m68k-unknown-sysv4
+ ;;
*:[Aa]miga[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-amigaos
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
*:[Mm]orph[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-morphos
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
*:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
+ GUESS=i370-ibm-openedition
+ ;;
*:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
+ GUESS=s390-ibm-zvmoe
+ ;;
*:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
+ GUESS=powerpc-ibm-os400
+ ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix"$UNAME_RELEASE"
- exit ;;
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
arm*:riscos:*:*|arm*:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
+ GUESS=arm-unknown-riscos
+ ;;
SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
+ GUESS=pyramid-pyramid-svr4
+ ;;
DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
+ GUESS=sparc-icl-nx6
+ ;;
DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
s390x:SunOS:*:*)
- echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux"$UNAME_RELEASE"
- exit ;;
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
set_cc_for_build
SUN_ARCH=i386
# If there is a compiler, see if it is configured for 64-bit objects.
# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
# This test works for both compilers.
- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null
then
SUN_ARCH=x86_64
fi
fi
- echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
sun4*:SunOS:6*:*)
# According to config.sub, this is the proper way to canonicalize
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
# it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
+ case `/usr/bin/arch -k` in
Series*|S4*)
UNAME_RELEASE=`uname -v`
;;
esac
# Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
sun3*:SunOS:*:*)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
sun*:*:4.2BSD:*)
UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
- case "`/bin/arch`" in
+ case `/bin/arch` in
sun3)
- echo m68k-sun-sunos"$UNAME_RELEASE"
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
;;
sun4)
- echo sparc-sun-sunos"$UNAME_RELEASE"
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
;;
esac
- exit ;;
+ ;;
aushp:SunOS:*:*)
- echo sparc-auspex-sunos"$UNAME_RELEASE"
- exit ;;
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
# The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not
# "atarist" or "atariste" at least should have a processor
@@ -454,41 +490,41 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# MiNT. But MiNT is downward compatible to TOS, so this should
# be no problem.
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
m68k:machten:*:*)
- echo m68k-apple-machten"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
powerpc:machten:*:*)
- echo powerpc-apple-machten"$UNAME_RELEASE"
- exit ;;
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix"$UNAME_RELEASE"
- exit ;;
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix"$UNAME_RELEASE"
- exit ;;
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix"$UNAME_RELEASE"
- exit ;;
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
@@ -516,75 +552,76 @@ EOF
dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
{ echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos"$UNAME_RELEASE"
- exit ;;
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
+ GUESS=powerpc-motorola-powermax
+ ;;
Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
+ GUESS=powerpc-harris-powermax
+ ;;
Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
+ GUESS=powerpc-harris-powermax
+ ;;
Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
+ GUESS=powerpc-harris-powerunix
+ ;;
m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
+ GUESS=m88k-harris-cxux7
+ ;;
m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
+ GUESS=m88k-motorola-sysv4
+ ;;
m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
+ GUESS=m88k-motorola-sysv3
+ ;;
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
then
- if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
- [ "$TARGET_BINARY_INTERFACE"x = x ]
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
then
- echo m88k-dg-dgux"$UNAME_RELEASE"
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
else
- echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
fi
else
- echo i586-dg-dgux"$UNAME_RELEASE"
+ GUESS=i586-dg-dgux$UNAME_RELEASE
fi
- exit ;;
+ ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
+ GUESS=m88k-dolphin-sysv3
+ ;;
M88*:*:R3*:*)
# Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
+ GUESS=m88k-motorola-sysv3
+ ;;
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
+ GUESS=m88k-tektronix-sysv3
+ ;;
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
+ GUESS=m68k-tektronix-bsd
+ ;;
*:IRIX*:*:*)
- echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
- exit ;;
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
+ GUESS=i386-ibm-aix
+ ;;
ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
+ if test -x /usr/bin/oslevel ; then
IBM_REV=`/usr/bin/oslevel`
else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
fi
- echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
- exit ;;
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
set_cc_for_build
@@ -601,16 +638,16 @@ EOF
EOF
if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
then
- echo "$SYSTEM_NAME"
+ GUESS=$SYSTEM_NAME
else
- echo rs6000-ibm-aix3.2.5
+ GUESS=rs6000-ibm-aix3.2.5
fi
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
+ GUESS=rs6000-ibm-aix3.2.4
else
- echo rs6000-ibm-aix3.2
+ GUESS=rs6000-ibm-aix3.2
fi
- exit ;;
+ ;;
*:AIX:*:[4567])
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
@@ -618,56 +655,56 @@ EOF
else
IBM_ARCH=powerpc
fi
- if [ -x /usr/bin/lslpp ] ; then
- IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
fi
- echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
- exit ;;
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
*:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
+ GUESS=rs6000-ibm-aix
+ ;;
ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
+ GUESS=romp-ibm-bsd4.4
+ ;;
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
*:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
+ GUESS=rs6000-bull-bosx
+ ;;
DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
+ GUESS=m68k-bull-sysv3
+ ;;
9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
+ GUESS=m68k-hp-bsd
+ ;;
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
+ GUESS=m68k-hp-bsd4.4
+ ;;
9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
- case "$UNAME_MACHINE" in
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ case $UNAME_MACHINE in
9000/31?) HP_ARCH=m68000 ;;
9000/[34]??) HP_ARCH=m68k ;;
9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
+ if test -x /usr/bin/getconf; then
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "$sc_cpu_version" in
+ case $sc_cpu_version in
523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
532) # CPU_PA_RISC2_0
- case "$sc_kernel_bits" in
+ case $sc_kernel_bits in
32) HP_ARCH=hppa2.0n ;;
64) HP_ARCH=hppa2.0w ;;
'') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
esac ;;
esac
fi
- if [ "$HP_ARCH" = "" ]; then
+ if test "$HP_ARCH" = ""; then
set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
@@ -706,7 +743,7 @@ EOF
test -z "$HP_ARCH" && HP_ARCH=hppa
fi ;;
esac
- if [ "$HP_ARCH" = hppa2.0w ]
+ if test "$HP_ARCH" = hppa2.0w
then
set_cc_for_build
@@ -727,12 +764,12 @@ EOF
HP_ARCH=hppa64
fi
fi
- echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
- exit ;;
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
ia64:HP-UX:*:*)
- HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux"$HPUX_REV"
- exit ;;
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
3050*:HI-UX:*:*)
set_cc_for_build
sed 's/^ //' << EOF > "$dummy.c"
@@ -762,36 +799,36 @@ EOF
EOF
$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
{ echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
- echo hppa1.1-hp-bsd
- exit ;;
+ GUESS=hppa1.1-hp-bsd
+ ;;
9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
+ GUESS=hppa1.0-hp-bsd
+ ;;
*9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
+ GUESS=hppa1.0-hp-mpeix
+ ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
- echo hppa1.1-hp-osf
- exit ;;
+ GUESS=hppa1.1-hp-osf
+ ;;
hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
+ GUESS=hppa1.0-hp-osf
+ ;;
i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo "$UNAME_MACHINE"-unknown-osf1mk
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
else
- echo "$UNAME_MACHINE"-unknown-osf1
+ GUESS=$UNAME_MACHINE-unknown-osf1
fi
- exit ;;
+ ;;
parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
+ GUESS=hppa1.1-hp-lites
+ ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
+ GUESS=c1-convex-bsd
+ ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
@@ -799,17 +836,18 @@ EOF
fi
exit ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
+ GUESS=c34-convex-bsd
+ ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
+ GUESS=c38-convex-bsd
+ ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
+ GUESS=c4-convex-bsd
+ ;;
CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
CRAY*[A-Z]90:*:*:*)
echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
@@ -817,114 +855,129 @@ EOF
-e 's/\.[^.]*$/.X/'
exit ;;
CRAY*TS:*:*:*)
- echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
CRAY*SV1:*:*:*)
- echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
*:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
5000:UNIX_System_V:4.*:*)
FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
*:BSD/OS:*:*)
- echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
arm:FreeBSD:*:*)
UNAME_PROCESSOR=`uname -p`
set_cc_for_build
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_PCS_VFP
then
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
else
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
fi
- exit ;;
+ ;;
*:FreeBSD:*:*)
UNAME_PROCESSOR=`/usr/bin/uname -p`
- case "$UNAME_PROCESSOR" in
+ case $UNAME_PROCESSOR in
amd64)
UNAME_PROCESSOR=x86_64 ;;
i386)
UNAME_PROCESSOR=i586 ;;
esac
- echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
- exit ;;
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
i*:CYGWIN*:*)
- echo "$UNAME_MACHINE"-pc-cygwin
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
*:MINGW64*:*)
- echo "$UNAME_MACHINE"-pc-mingw64
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
*:MINGW*:*)
- echo "$UNAME_MACHINE"-pc-mingw32
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
*:MSYS*:*)
- echo "$UNAME_MACHINE"-pc-msys
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
i*:PW*:*)
- echo "$UNAME_MACHINE"-pc-pw32
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:SerenityOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-serenity
+ ;;
*:Interix*:*)
- case "$UNAME_MACHINE" in
+ case $UNAME_MACHINE in
x86)
- echo i586-pc-interix"$UNAME_RELEASE"
- exit ;;
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix"$UNAME_RELEASE"
- exit ;;
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
IA64)
- echo ia64-unknown-interix"$UNAME_RELEASE"
- exit ;;
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
esac ;;
i*:UWIN*:*)
- echo "$UNAME_MACHINE"-pc-uwin
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-pc-cygwin
- exit ;;
+ GUESS=x86_64-pc-cygwin
+ ;;
prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
- exit ;;
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
*:GNU:*:*)
# the GNU system
- echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
- exit ;;
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
- echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
- exit ;;
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
*:Minix:*:*)
- echo "$UNAME_MACHINE"-unknown-minix
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
aarch64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
aarch64_be:Linux:*:*)
UNAME_MACHINE=aarch64_be
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
EV5) UNAME_MACHINE=alphaev5 ;;
EV56) UNAME_MACHINE=alphaev56 ;;
PCA56) UNAME_MACHINE=alphapca56 ;;
@@ -935,60 +988,63 @@ EOF
esac
objdump --private-headers /bin/sh | grep -q ld.so.1
if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arc:Linux:*:* | arceb:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
arm*:Linux:*:*)
set_cc_for_build
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_EABI__
then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
else
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_PCS_VFP
then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
else
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
fi
fi
- exit ;;
+ ;;
avr32*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
cris:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
crisv32:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
e2k:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
frv:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
hexagon:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
i*86:Linux:*:*)
- echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
ia64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
k1om:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
m32r*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
m68*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
mips:Linux:*:* | mips64:Linux:*:*)
set_cc_for_build
IS_GLIBC=0
@@ -1033,124 +1089,135 @@ EOF
#endif
#endif
EOF
- eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
;;
mips64el:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
openrisc*:Linux:*:*)
- echo or1k-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
or32:Linux:*:* | or1k*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
padre:Linux:*:*)
- echo sparc-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
- PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
- *) echo hppa-unknown-linux-"$LIBC" ;;
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
esac
- exit ;;
+ ;;
ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
ppc:Linux:*:*)
- echo powerpc-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
ppc64le:Linux:*:*)
- echo powerpc64le-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
ppcle:Linux:*:*)
- echo powerpcle-unknown-linux-"$LIBC"
- exit ;;
- riscv32:Linux:*:* | riscv64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
s390:Linux:*:* | s390x:Linux:*:*)
- echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
sh64*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
sh*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
sparc:Linux:*:* | sparc64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
tile*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
vax:Linux:*:*)
- echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
x86_64:Linux:*:*)
set_cc_for_build
- X86_64_ABI=
- # If there is a compiler, see if it is configured for 32-bit objects.
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_X32 >/dev/null
- then
- X86_64_ABI=x32
- fi
+ CPU=$UNAME_MACHINE
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ ABI=64
+ sed 's/^ //' << EOF > "$dummy.c"
+ #ifdef __i386__
+ ABI=x86
+ #else
+ #ifdef __ILP32__
+ ABI=x32
+ #endif
+ #endif
+EOF
+ cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+ eval "$cc_set_abi"
+ case $ABI in
+ x86) CPU=i686 ;;
+ x32) LIBCABI=${LIBC}x32 ;;
+ esac
fi
- echo "$UNAME_MACHINE"-pc-linux-"$LIBC$X86_64_ABI"
- exit ;;
+ GUESS=$CPU-pc-linux-$LIBCABI
+ ;;
xtensa*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
# earlier versions are messed up and put the nodename in both
# sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
+ GUESS=i386-sequent-sysv4
+ ;;
i*86:UNIX_SV:4.2MP:2.*)
# Unixware is an offshoot of SVR4, but it has its own version
# number series starting with 2...
# I am not positive that other SVR4 systems won't match this,
# I just have to hope. -- rms.
# Use sysv4.2uw... so that sysv4* matches it.
- echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
i*86:OS/2:*:*)
# If we were able to find `uname', then EMX Unix compatibility
# is probably installed.
- echo "$UNAME_MACHINE"-pc-os2-emx
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
i*86:XTS-300:*:STOP)
- echo "$UNAME_MACHINE"-unknown-stop
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
i*86:atheos:*:*)
- echo "$UNAME_MACHINE"-unknown-atheos
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
i*86:syllable:*:*)
- echo "$UNAME_MACHINE"-pc-syllable
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
i*86:*DOS:*:*)
- echo "$UNAME_MACHINE"-pc-msdosdjgpp
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
i*86:*:4.*:*)
UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
else
- echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
fi
- exit ;;
+ ;;
i*86:*:5:[678]*)
# UnixWare 7.x, OpenUNIX and OpenServer 6.
case `/bin/uname -X | grep "^Machine"` in
@@ -1158,12 +1225,12 @@ EOF
*Pentium) UNAME_MACHINE=i586 ;;
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
esac
- echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
i*86:*:3.2:*)
if test -f /usr/options/cb.name; then
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+ GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
elif /bin/uname -X 2>/dev/null >/dev/null ; then
UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
@@ -1173,11 +1240,11 @@ EOF
&& UNAME_MACHINE=i686
(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
&& UNAME_MACHINE=i686
- echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
else
- echo "$UNAME_MACHINE"-pc-sysv32
+ GUESS=$UNAME_MACHINE-pc-sysv32
fi
- exit ;;
+ ;;
pc:*:*:*)
# Left here for compatibility:
# uname -m prints for DJGPP always 'pc', but it prints nothing about
@@ -1185,31 +1252,31 @@ EOF
# Note: whatever this is, it MUST be the same as what config.sub
# prints for the "djgpp" host, or else GDB configure will decide that
# this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
+ GUESS=i586-pc-msdosdjgpp
+ ;;
Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
+ GUESS=i386-pc-mach3
+ ;;
paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
+ GUESS=i860-intel-osf1
+ ;;
i860:*:4.*:*) # i860-SVR4
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
fi
- exit ;;
+ ;;
mini*:CTIX:SYS*5:*)
# "miniframe"
- echo m68010-convergent-sysv
- exit ;;
+ GUESS=m68010-convergent-sysv
+ ;;
mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
+ GUESS=m68k-convergent-sysv
+ ;;
M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
+ GUESS=m68k-diab-dnix
+ ;;
M68*:*:R3V[5678]*:*)
test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
@@ -1234,113 +1301,116 @@ EOF
/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
&& { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
+ GUESS=m68k-atari-sysv4
+ ;;
TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv"$UNAME_RELEASE"
- exit ;;
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
+ GUESS=mips-sni-sysv4
+ ;;
RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
+ GUESS=mips-sni-sysv4
+ ;;
*:SINIX-*:*:*)
if uname -p 2>/dev/null >/dev/null ; then
UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo "$UNAME_MACHINE"-sni-sysv4
+ GUESS=$UNAME_MACHINE-sni-sysv4
else
- echo ns32k-sni-sysv
+ GUESS=ns32k-sni-sysv
fi
- exit ;;
+ ;;
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
# says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
+ GUESS=i586-unisys-sysv4
+ ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes <hewes@openmarket.com>.
# How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
*:*:*:FTX*)
# From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
+ GUESS=i860-stratus-sysv4
+ ;;
i*86:VOS:*:*)
# From Paul.Green@stratus.com.
- echo "$UNAME_MACHINE"-stratus-vos
- exit ;;
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
*:VOS:*:*)
# From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
+ GUESS=hppa1.1-stratus-vos
+ ;;
mc68*:A/UX:*:*)
- echo m68k-apple-aux"$UNAME_RELEASE"
- exit ;;
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
+ GUESS=mips-sony-newsos6
+ ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv"$UNAME_RELEASE"
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
else
- echo mips-unknown-sysv"$UNAME_RELEASE"
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
fi
- exit ;;
+ ;;
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
+ GUESS=powerpc-be-beos
+ ;;
BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
+ GUESS=powerpc-apple-beos
+ ;;
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
+ GUESS=i586-pc-beos
+ ;;
BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
+ GUESS=i586-pc-haiku
+ ;;
x86_64:Haiku:*:*)
- echo x86_64-unknown-haiku
- exit ;;
+ GUESS=x86_64-unknown-haiku
+ ;;
SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
SX-ACE:SUPER-UX:*:*)
- echo sxace-nec-superux"$UNAME_RELEASE"
- exit ;;
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
*:Rhapsody:*:*)
- echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
*:Darwin:*:*)
UNAME_PROCESSOR=`uname -p`
case $UNAME_PROCESSOR in
@@ -1355,7 +1425,7 @@ EOF
else
set_cc_for_build
fi
- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null
@@ -1376,109 +1446,119 @@ EOF
# uname -m returns i386 or x86_64
UNAME_PROCESSOR=$UNAME_MACHINE
fi
- echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
UNAME_PROCESSOR=`uname -p`
if test "$UNAME_PROCESSOR" = x86; then
UNAME_PROCESSOR=i386
UNAME_MACHINE=pc
fi
- echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
*:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
+ GUESS=i386-pc-qnx
+ ;;
NEO-*:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk"$UNAME_RELEASE"
- exit ;;
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
NSE-*:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk"$UNAME_RELEASE"
- exit ;;
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
NSR-*:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk"$UNAME_RELEASE"
- exit ;;
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
NSV-*:NONSTOP_KERNEL:*:*)
- echo nsv-tandem-nsk"$UNAME_RELEASE"
- exit ;;
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
NSX-*:NONSTOP_KERNEL:*:*)
- echo nsx-tandem-nsk"$UNAME_RELEASE"
- exit ;;
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
*:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
+ GUESS=mips-compaq-nonstopux
+ ;;
BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
+ GUESS=bs2000-siemens-sysv
+ ;;
DS/*:UNIX_System_V:*:*)
- echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
*:Plan9:*:*)
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
# operating systems.
- # shellcheck disable=SC2154
- if test "$cputype" = 386; then
+ if test "${cputype-}" = 386; then
UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
fi
- echo "$UNAME_MACHINE"-unknown-plan9
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
*:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
+ GUESS=pdp10-unknown-tops10
+ ;;
*:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
+ GUESS=pdp10-unknown-tenex
+ ;;
KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
+ GUESS=pdp10-dec-tops20
+ ;;
XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
+ GUESS=pdp10-xkl-tops20
+ ;;
*:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
+ GUESS=pdp10-unknown-tops20
+ ;;
*:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
+ GUESS=pdp10-unknown-its
+ ;;
SEI:*:*:SEIUX)
- echo mips-sei-seiux"$UNAME_RELEASE"
- exit ;;
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
*:DragonFly:*:*)
- echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
- exit ;;
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
*:*VMS:*:*)
UNAME_MACHINE=`(uname -p) 2>/dev/null`
- case "$UNAME_MACHINE" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
esac ;;
*:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
+ GUESS=i386-pc-xenix
+ ;;
i*86:skyos:*:*)
- echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
- exit ;;
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
i*86:rdos:*:*)
- echo "$UNAME_MACHINE"-pc-rdos
- exit ;;
- i*86:AROS:*:*)
- echo "$UNAME_MACHINE"-pc-aros
- exit ;;
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ i*86:Fiwix:*:*)
+ GUESS=$UNAME_MACHINE-pc-fiwix
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
x86_64:VMkernel:*:*)
- echo "$UNAME_MACHINE"-unknown-esx
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
amd64:Isilon\ OneFS:*:*)
- echo x86_64-unknown-onefs
- exit ;;
+ GUESS=x86_64-unknown-onefs
+ ;;
*:Unleashed:*:*)
- echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
- exit ;;
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
esac
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
# No uname command or uname output not recognized.
set_cc_for_build
cat > "$dummy.c" <<EOF
@@ -1610,7 +1690,7 @@ main ()
}
EOF
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
{ echo "$SYSTEM_NAME"; exit; }
# Apollos put the system type in the environment.
@@ -1618,7 +1698,7 @@ test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
echo "$0: unable to guess system type" >&2
-case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+case $UNAME_MACHINE:$UNAME_SYSTEM in
mips:Linux | mips64:Linux)
# If we got here on MIPS GNU/Linux, output extra information.
cat >&2 <<EOF
@@ -1635,9 +1715,17 @@ This script (version $timestamp), has failed to recognize the
operating system you are using. If your script is old, overwrite *all*
copies of config.guess and config.sub with the latest versions from:
- https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
and
- https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
If $0 has already been updated, send the following data and any
information you think might be pertinent to config-patches@gnu.org to
@@ -1665,6 +1753,7 @@ UNAME_RELEASE = "$UNAME_RELEASE"
UNAME_SYSTEM = "$UNAME_SYSTEM"
UNAME_VERSION = "$UNAME_VERSION"
EOF
+fi
exit 1
diff --git a/3rdparty/expat/conftools/config.sub b/3rdparty/expat/conftools/config.sub
index 96fca060bde..a31fff318a1 100755
--- a/3rdparty/expat/conftools/config.sub
+++ b/3rdparty/expat/conftools/config.sub
@@ -1,12 +1,14 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2019 Free Software Foundation, Inc.
+# Copyright 1992-2022 Free Software Foundation, Inc.
-timestamp='2019-06-30'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-01-03'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
@@ -33,7 +35,7 @@ timestamp='2019-06-30'
# Otherwise, we print the canonical config type on stdout and succeed.
# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
@@ -50,6 +52,13 @@ timestamp='2019-06-30'
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
@@ -67,7 +76,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -112,9 +121,11 @@ esac
# Split fields of configuration type
# shellcheck disable=SC2162
+saved_IFS=$IFS
IFS="-" read field1 field2 field3 field4 <<EOF
$1
EOF
+IFS=$saved_IFS
# Separate into logical components for further validation
case $1 in
@@ -124,28 +135,27 @@ case $1 in
;;
*-*-*-*)
basic_machine=$field1-$field2
- os=$field3-$field4
+ basic_os=$field3-$field4
;;
*-*-*)
# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
# parts
maybe_os=$field2-$field3
case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
- | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+ nto-qnx* | linux-* | uclinux-uclibc* \
| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
| storm-chaos* | os2-emx* | rtmk-nova*)
basic_machine=$field1
- os=$maybe_os
+ basic_os=$maybe_os
;;
android-linux)
basic_machine=$field1-unknown
- os=linux-android
+ basic_os=linux-android
;;
*)
basic_machine=$field1-$field2
- os=$field3
+ basic_os=$field3
;;
esac
;;
@@ -154,7 +164,7 @@ case $1 in
case $field1-$field2 in
decstation-3100)
basic_machine=mips-dec
- os=
+ basic_os=
;;
*-*)
# Second component is usually, but not always the OS
@@ -162,7 +172,11 @@ case $1 in
# Prevent following clause from handling this valid os
sun*os*)
basic_machine=$field1
- os=$field2
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
;;
# Manufacturers
dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
@@ -175,11 +189,11 @@ case $1 in
| microblaze* | sim | cisco \
| oki | wec | wrs | winbond)
basic_machine=$field1-$field2
- os=
+ basic_os=
;;
*)
basic_machine=$field1
- os=$field2
+ basic_os=$field2
;;
esac
;;
@@ -191,447 +205,451 @@ case $1 in
case $field1 in
386bsd)
basic_machine=i386-pc
- os=bsd
+ basic_os=bsd
;;
a29khif)
basic_machine=a29k-amd
- os=udi
+ basic_os=udi
;;
adobe68k)
basic_machine=m68010-adobe
- os=scout
+ basic_os=scout
;;
alliant)
basic_machine=fx80-alliant
- os=
+ basic_os=
;;
altos | altos3068)
basic_machine=m68k-altos
- os=
+ basic_os=
;;
am29k)
basic_machine=a29k-none
- os=bsd
+ basic_os=bsd
;;
amdahl)
basic_machine=580-amdahl
- os=sysv
+ basic_os=sysv
;;
amiga)
basic_machine=m68k-unknown
- os=
+ basic_os=
;;
amigaos | amigados)
basic_machine=m68k-unknown
- os=amigaos
+ basic_os=amigaos
;;
amigaunix | amix)
basic_machine=m68k-unknown
- os=sysv4
+ basic_os=sysv4
;;
apollo68)
basic_machine=m68k-apollo
- os=sysv
+ basic_os=sysv
;;
apollo68bsd)
basic_machine=m68k-apollo
- os=bsd
+ basic_os=bsd
;;
aros)
basic_machine=i386-pc
- os=aros
+ basic_os=aros
;;
aux)
basic_machine=m68k-apple
- os=aux
+ basic_os=aux
;;
balance)
basic_machine=ns32k-sequent
- os=dynix
+ basic_os=dynix
;;
blackfin)
basic_machine=bfin-unknown
- os=linux
+ basic_os=linux
;;
cegcc)
basic_machine=arm-unknown
- os=cegcc
+ basic_os=cegcc
;;
convex-c1)
basic_machine=c1-convex
- os=bsd
+ basic_os=bsd
;;
convex-c2)
basic_machine=c2-convex
- os=bsd
+ basic_os=bsd
;;
convex-c32)
basic_machine=c32-convex
- os=bsd
+ basic_os=bsd
;;
convex-c34)
basic_machine=c34-convex
- os=bsd
+ basic_os=bsd
;;
convex-c38)
basic_machine=c38-convex
- os=bsd
+ basic_os=bsd
;;
cray)
basic_machine=j90-cray
- os=unicos
+ basic_os=unicos
;;
crds | unos)
basic_machine=m68k-crds
- os=
+ basic_os=
;;
da30)
basic_machine=m68k-da30
- os=
+ basic_os=
;;
decstation | pmax | pmin | dec3100 | decstatn)
basic_machine=mips-dec
- os=
+ basic_os=
;;
delta88)
basic_machine=m88k-motorola
- os=sysv3
+ basic_os=sysv3
;;
dicos)
basic_machine=i686-pc
- os=dicos
+ basic_os=dicos
;;
djgpp)
basic_machine=i586-pc
- os=msdosdjgpp
+ basic_os=msdosdjgpp
;;
ebmon29k)
basic_machine=a29k-amd
- os=ebmon
+ basic_os=ebmon
;;
es1800 | OSE68k | ose68k | ose | OSE)
basic_machine=m68k-ericsson
- os=ose
+ basic_os=ose
;;
gmicro)
basic_machine=tron-gmicro
- os=sysv
+ basic_os=sysv
;;
go32)
basic_machine=i386-pc
- os=go32
+ basic_os=go32
;;
h8300hms)
basic_machine=h8300-hitachi
- os=hms
+ basic_os=hms
;;
h8300xray)
basic_machine=h8300-hitachi
- os=xray
+ basic_os=xray
;;
h8500hms)
basic_machine=h8500-hitachi
- os=hms
+ basic_os=hms
;;
harris)
basic_machine=m88k-harris
- os=sysv3
+ basic_os=sysv3
;;
hp300 | hp300hpux)
basic_machine=m68k-hp
- os=hpux
+ basic_os=hpux
;;
hp300bsd)
basic_machine=m68k-hp
- os=bsd
+ basic_os=bsd
;;
hppaosf)
basic_machine=hppa1.1-hp
- os=osf
+ basic_os=osf
;;
hppro)
basic_machine=hppa1.1-hp
- os=proelf
+ basic_os=proelf
;;
i386mach)
basic_machine=i386-mach
- os=mach
+ basic_os=mach
;;
isi68 | isi)
basic_machine=m68k-isi
- os=sysv
+ basic_os=sysv
;;
m68knommu)
basic_machine=m68k-unknown
- os=linux
+ basic_os=linux
;;
magnum | m3230)
basic_machine=mips-mips
- os=sysv
+ basic_os=sysv
;;
merlin)
basic_machine=ns32k-utek
- os=sysv
+ basic_os=sysv
;;
mingw64)
basic_machine=x86_64-pc
- os=mingw64
+ basic_os=mingw64
;;
mingw32)
basic_machine=i686-pc
- os=mingw32
+ basic_os=mingw32
;;
mingw32ce)
basic_machine=arm-unknown
- os=mingw32ce
+ basic_os=mingw32ce
;;
monitor)
basic_machine=m68k-rom68k
- os=coff
+ basic_os=coff
;;
morphos)
basic_machine=powerpc-unknown
- os=morphos
+ basic_os=morphos
;;
moxiebox)
basic_machine=moxie-unknown
- os=moxiebox
+ basic_os=moxiebox
;;
msdos)
basic_machine=i386-pc
- os=msdos
+ basic_os=msdos
;;
msys)
basic_machine=i686-pc
- os=msys
+ basic_os=msys
;;
mvs)
basic_machine=i370-ibm
- os=mvs
+ basic_os=mvs
;;
nacl)
basic_machine=le32-unknown
- os=nacl
+ basic_os=nacl
;;
ncr3000)
basic_machine=i486-ncr
- os=sysv4
+ basic_os=sysv4
;;
netbsd386)
basic_machine=i386-pc
- os=netbsd
+ basic_os=netbsd
;;
netwinder)
basic_machine=armv4l-rebel
- os=linux
+ basic_os=linux
;;
news | news700 | news800 | news900)
basic_machine=m68k-sony
- os=newsos
+ basic_os=newsos
;;
news1000)
basic_machine=m68030-sony
- os=newsos
+ basic_os=newsos
;;
necv70)
basic_machine=v70-nec
- os=sysv
+ basic_os=sysv
;;
nh3000)
basic_machine=m68k-harris
- os=cxux
+ basic_os=cxux
;;
nh[45]000)
basic_machine=m88k-harris
- os=cxux
+ basic_os=cxux
;;
nindy960)
basic_machine=i960-intel
- os=nindy
+ basic_os=nindy
;;
mon960)
basic_machine=i960-intel
- os=mon960
+ basic_os=mon960
;;
nonstopux)
basic_machine=mips-compaq
- os=nonstopux
+ basic_os=nonstopux
;;
os400)
basic_machine=powerpc-ibm
- os=os400
+ basic_os=os400
;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
- os=ose
+ basic_os=ose
;;
os68k)
basic_machine=m68k-none
- os=os68k
+ basic_os=os68k
;;
paragon)
basic_machine=i860-intel
- os=osf
+ basic_os=osf
;;
parisc)
basic_machine=hppa-unknown
- os=linux
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
;;
pw32)
basic_machine=i586-unknown
- os=pw32
+ basic_os=pw32
;;
rdos | rdos64)
basic_machine=x86_64-pc
- os=rdos
+ basic_os=rdos
;;
rdos32)
basic_machine=i386-pc
- os=rdos
+ basic_os=rdos
;;
rom68k)
basic_machine=m68k-rom68k
- os=coff
+ basic_os=coff
;;
sa29200)
basic_machine=a29k-amd
- os=udi
+ basic_os=udi
;;
sei)
basic_machine=mips-sei
- os=seiux
+ basic_os=seiux
;;
sequent)
basic_machine=i386-sequent
- os=
+ basic_os=
;;
sps7)
basic_machine=m68k-bull
- os=sysv2
+ basic_os=sysv2
;;
st2000)
basic_machine=m68k-tandem
- os=
+ basic_os=
;;
stratus)
basic_machine=i860-stratus
- os=sysv4
+ basic_os=sysv4
;;
sun2)
basic_machine=m68000-sun
- os=
+ basic_os=
;;
sun2os3)
basic_machine=m68000-sun
- os=sunos3
+ basic_os=sunos3
;;
sun2os4)
basic_machine=m68000-sun
- os=sunos4
+ basic_os=sunos4
;;
sun3)
basic_machine=m68k-sun
- os=
+ basic_os=
;;
sun3os3)
basic_machine=m68k-sun
- os=sunos3
+ basic_os=sunos3
;;
sun3os4)
basic_machine=m68k-sun
- os=sunos4
+ basic_os=sunos4
;;
sun4)
basic_machine=sparc-sun
- os=
+ basic_os=
;;
sun4os3)
basic_machine=sparc-sun
- os=sunos3
+ basic_os=sunos3
;;
sun4os4)
basic_machine=sparc-sun
- os=sunos4
+ basic_os=sunos4
;;
sun4sol2)
basic_machine=sparc-sun
- os=solaris2
+ basic_os=solaris2
;;
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
- os=
+ basic_os=
;;
sv1)
basic_machine=sv1-cray
- os=unicos
+ basic_os=unicos
;;
symmetry)
basic_machine=i386-sequent
- os=dynix
+ basic_os=dynix
;;
t3e)
basic_machine=alphaev5-cray
- os=unicos
+ basic_os=unicos
;;
t90)
basic_machine=t90-cray
- os=unicos
+ basic_os=unicos
;;
toad1)
basic_machine=pdp10-xkl
- os=tops20
+ basic_os=tops20
;;
tpf)
basic_machine=s390x-ibm
- os=tpf
+ basic_os=tpf
;;
udi29k)
basic_machine=a29k-amd
- os=udi
+ basic_os=udi
;;
ultra3)
basic_machine=a29k-nyu
- os=sym1
+ basic_os=sym1
;;
v810 | necv810)
basic_machine=v810-nec
- os=none
+ basic_os=none
;;
vaxv)
basic_machine=vax-dec
- os=sysv
+ basic_os=sysv
;;
vms)
basic_machine=vax-dec
- os=vms
+ basic_os=vms
;;
vsta)
basic_machine=i386-pc
- os=vsta
+ basic_os=vsta
;;
vxworks960)
basic_machine=i960-wrs
- os=vxworks
+ basic_os=vxworks
;;
vxworks68)
basic_machine=m68k-wrs
- os=vxworks
+ basic_os=vxworks
;;
vxworks29k)
basic_machine=a29k-wrs
- os=vxworks
+ basic_os=vxworks
;;
xbox)
basic_machine=i686-pc
- os=mingw32
+ basic_os=mingw32
;;
ymp)
basic_machine=ymp-cray
- os=unicos
+ basic_os=unicos
;;
*)
basic_machine=$1
- os=
+ basic_os=
;;
esac
;;
@@ -683,17 +701,17 @@ case $basic_machine in
bluegene*)
cpu=powerpc
vendor=ibm
- os=cnk
+ basic_os=cnk
;;
decsystem10* | dec10*)
cpu=pdp10
vendor=dec
- os=tops10
+ basic_os=tops10
;;
decsystem20* | dec20*)
cpu=pdp10
vendor=dec
- os=tops20
+ basic_os=tops20
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
@@ -703,7 +721,7 @@ case $basic_machine in
dpx2*)
cpu=m68k
vendor=bull
- os=sysv3
+ basic_os=sysv3
;;
encore | umax | mmax)
cpu=ns32k
@@ -712,7 +730,7 @@ case $basic_machine in
elxsi)
cpu=elxsi
vendor=elxsi
- os=${os:-bsd}
+ basic_os=${basic_os:-bsd}
;;
fx2800)
cpu=i860
@@ -725,7 +743,7 @@ case $basic_machine in
h3050r* | hiux*)
cpu=hppa1.1
vendor=hitachi
- os=hiuxwe2
+ basic_os=hiuxwe2
;;
hp3k9[0-9][0-9] | hp9[0-9][0-9])
cpu=hppa1.0
@@ -768,36 +786,36 @@ case $basic_machine in
i*86v32)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=sysv32
+ basic_os=sysv32
;;
i*86v4*)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=sysv4
+ basic_os=sysv4
;;
i*86v)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=sysv
+ basic_os=sysv
;;
i*86sol2)
cpu=`echo "$1" | sed -e 's/86.*/86/'`
vendor=pc
- os=solaris2
+ basic_os=solaris2
;;
j90 | j90-cray)
cpu=j90
vendor=cray
- os=${os:-unicos}
+ basic_os=${basic_os:-unicos}
;;
iris | iris4d)
cpu=mips
vendor=sgi
- case $os in
+ case $basic_os in
irix*)
;;
*)
- os=irix4
+ basic_os=irix4
;;
esac
;;
@@ -808,7 +826,7 @@ case $basic_machine in
*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
cpu=m68k
vendor=atari
- os=mint
+ basic_os=mint
;;
mipsEE* | ee)
cpu=mips64r5900el
@@ -834,21 +852,21 @@ case $basic_machine in
news-3600 | risc-news)
cpu=mips
vendor=sony
- os=newsos
+ basic_os=newsos
;;
next | m*-next)
cpu=m68k
vendor=next
- case $os in
+ case $basic_os in
openstep*)
;;
nextstep*)
;;
ns2*)
- os=nextstep2
+ basic_os=nextstep2
;;
*)
- os=nextstep3
+ basic_os=nextstep3
;;
esac
;;
@@ -859,12 +877,12 @@ case $basic_machine in
op50n-* | op60c-*)
cpu=hppa1.1
vendor=oki
- os=proelf
+ basic_os=proelf
;;
pa-hitachi)
cpu=hppa1.1
vendor=hitachi
- os=hiuxwe2
+ basic_os=hiuxwe2
;;
pbd)
cpu=sparc
@@ -901,12 +919,12 @@ case $basic_machine in
sde)
cpu=mipsisa32
vendor=sde
- os=${os:-elf}
+ basic_os=${basic_os:-elf}
;;
simso-wrs)
cpu=sparclite
vendor=wrs
- os=vxworks
+ basic_os=vxworks
;;
tower | tower-32)
cpu=m68k
@@ -923,7 +941,7 @@ case $basic_machine in
w89k-*)
cpu=hppa1.1
vendor=winbond
- os=proelf
+ basic_os=proelf
;;
none)
cpu=none
@@ -940,9 +958,11 @@ case $basic_machine in
*-*)
# shellcheck disable=SC2162
+ saved_IFS=$IFS
IFS="-" read cpu vendor <<EOF
$basic_machine
EOF
+ IFS=$saved_IFS
;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
@@ -976,11 +996,11 @@ case $cpu-$vendor in
# some cases the only manufacturer, in others, it is the most popular.
craynv-unknown)
vendor=cray
- os=${os:-unicosmp}
+ basic_os=${basic_os:-unicosmp}
;;
c90-unknown | c90-cray)
vendor=cray
- os=${os:-unicos}
+ basic_os=${Basic_os:-unicos}
;;
fx80-unknown)
vendor=alliant
@@ -1021,10 +1041,15 @@ case $cpu-$vendor in
;;
# Here we normalize CPU types with a missing or matching vendor
+ armh-unknown | armh-alt)
+ cpu=armv7l
+ vendor=alt
+ basic_os=${basic_os:-linux-gnueabihf}
+ ;;
dpx20-unknown | dpx20-bull)
cpu=rs6000
vendor=bull
- os=${os:-bosx}
+ basic_os=${basic_os:-bosx}
;;
# Here we normalize CPU types irrespective of the vendor
@@ -1033,7 +1058,7 @@ case $cpu-$vendor in
;;
blackfin-*)
cpu=bfin
- os=linux
+ basic_os=linux
;;
c54x-*)
cpu=tic54x
@@ -1046,7 +1071,7 @@ case $cpu-$vendor in
;;
e500v[12]-*)
cpu=powerpc
- os=$os"spe"
+ basic_os=${basic_os}"spe"
;;
mips3*-*)
cpu=mips64
@@ -1056,7 +1081,7 @@ case $cpu-$vendor in
;;
m68knommu-*)
cpu=m68k
- os=linux
+ basic_os=linux
;;
m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
cpu=s12z
@@ -1066,7 +1091,7 @@ case $cpu-$vendor in
;;
parisc-*)
cpu=hppa
- os=linux
+ basic_os=linux
;;
pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
cpu=i586
@@ -1122,11 +1147,14 @@ case $cpu-$vendor in
xscale-* | xscalee[bl]-*)
cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
;;
+ arm64-* | aarch64le-*)
+ cpu=aarch64
+ ;;
# Recognize the canonical CPU Types that limit and/or modify the
# company names they are paired with.
cr16-*)
- os=${os:-elf}
+ basic_os=${basic_os:-elf}
;;
crisv32-* | etraxfs*-*)
cpu=crisv32
@@ -1137,7 +1165,7 @@ case $cpu-$vendor in
vendor=axis
;;
crx-*)
- os=${os:-elf}
+ basic_os=${basic_os:-elf}
;;
neo-tandem)
cpu=neo
@@ -1159,16 +1187,12 @@ case $cpu-$vendor in
cpu=nsx
vendor=tandem
;;
- s390-*)
- cpu=s390
- vendor=ibm
- ;;
- s390x-*)
- cpu=s390x
- vendor=ibm
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
;;
tile*-*)
- os=${os:-linux-gnu}
+ basic_os=${basic_os:-linux-gnu}
;;
*)
@@ -1184,8 +1208,8 @@ case $cpu-$vendor in
| alphapca5[67] | alpha64pca5[67] \
| am33_2.0 \
| amdgcn \
- | arc | arceb \
- | arm | arm[lb]e | arme[lb] | armv* \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
| avr | avr32 \
| asmjs \
| ba \
@@ -1204,6 +1228,7 @@ case $cpu-$vendor in
| k1om \
| le32 | le64 \
| lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
| m32c | m32r | m32rle \
| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
@@ -1222,9 +1247,13 @@ case $cpu-$vendor in
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
| mipsisa32r6 | mipsisa32r6el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
| mipsisa64r6 | mipsisa64r6el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
@@ -1248,8 +1277,9 @@ case $cpu-$vendor in
| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
| pru \
| pyramid \
- | riscv | riscv32 | riscv64 \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
| rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
| score \
| sh | shl \
| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
@@ -1259,6 +1289,7 @@ case $cpu-$vendor in
| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
| spu \
| tahoe \
+ | thumbv7* \
| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
| tron \
| ubicom32 \
@@ -1296,8 +1327,49 @@ esac
# Decode manufacturer-specific aliases for certain operating systems.
-if [ x$os != x ]
+if test x$basic_os != x
then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
case $os in
# First match some system type aliases that might get confused
# with valid system types.
@@ -1309,7 +1381,7 @@ case $os in
os=cnk
;;
solaris1 | solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
;;
solaris)
os=solaris2
@@ -1317,9 +1389,6 @@ case $os in
unixware*)
os=sysv4.2uw
;;
- gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
# es1800 is here to avoid being matched by es* (a different OS)
es1800*)
os=ose
@@ -1341,12 +1410,9 @@ case $os in
os=sco3.2v4
;;
sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
;;
- sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- ;;
- scout)
+ sco*v* | scout)
# Don't match below
;;
sco*)
@@ -1355,78 +1421,25 @@ case $os in
psos*)
os=psos
;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
- # sysv* is not here because it comes later, after sysvr4.
- gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
- | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | kopensolaris* | plan9* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* | twizzler* \
- | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
- | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
- | knetbsd* | mirbsd* | netbsd* \
- | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
- | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
- | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* \
- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
- | linux-newlib* | linux-musl* | linux-uclibc* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
- | openstep* | oskit* | conix* | pw32* | nonstopux* \
- | storm-chaos* | tops10* | tenex* | tops20* | its* | irx* \
- | os2* | vos* | palmos* | uclinux* | nucleus* \
- | morphos* | superux* | rtmk* | windiss* \
- | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
- | nsk* | powerunix)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
qnx*)
- case $cpu in
- x86 | i*86)
- ;;
- *)
- os=nto-$os
- ;;
- esac
+ os=qnx
;;
hiux*)
os=hiuxwe2
;;
- nto-qnx*)
- ;;
- nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- sim | xray | os68k* | v88r* \
- | windows* | osx | abug | netware* | os9* \
- | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
- ;;
- linux-dietlibc)
- os=linux-dietlibc
- ;;
- linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
lynx*178)
os=lynxos178
;;
lynx*5)
os=lynxos5
;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
lynx*)
os=lynxos
;;
- mac*)
+ mac[0-9]*)
os=`echo "$os" | sed -e 's|mac|macos|'`
;;
opened*)
@@ -1473,7 +1486,7 @@ case $os in
;;
# Preserve the version number of sinix5.
sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
;;
sinix*)
os=sysv4
@@ -1496,18 +1509,12 @@ case $os in
sysvr4)
os=sysv4
;;
- # This must come after sysvr4.
- sysv*)
- ;;
ose*)
os=ose
;;
*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
os=mint
;;
- zvmoe)
- os=zvmoe
- ;;
dicos*)
os=dicos
;;
@@ -1524,19 +1531,11 @@ case $os in
;;
esac
;;
- nacl*)
- ;;
- ios)
- ;;
- none)
- ;;
- *-eabi)
- ;;
*)
- echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
- exit 1
+ # No normalization, but not necessarily accepted, that comes below.
;;
esac
+
else
# Here we handle the default operating systems that come with various machines.
@@ -1549,6 +1548,7 @@ else
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
+kernel=
case $cpu-$vendor in
score-*)
os=elf
@@ -1560,7 +1560,8 @@ case $cpu-$vendor in
os=riscix1.2
;;
arm*-rebel)
- os=linux
+ kernel=linux
+ os=gnu
;;
arm*-semi)
os=aout
@@ -1726,84 +1727,180 @@ case $cpu-$vendor in
os=none
;;
esac
+
fi
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* | irx* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+ | fiwix* )
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
case $vendor in
unknown)
- case $os in
- riscix*)
+ case $cpu-$os in
+ *-riscix*)
vendor=acorn
;;
- sunos*)
+ *-sunos*)
vendor=sun
;;
- cnk*|-aix*)
+ *-cnk* | *-aix*)
vendor=ibm
;;
- beos*)
+ *-beos*)
vendor=be
;;
- hpux*)
+ *-hpux*)
vendor=hp
;;
- mpeix*)
+ *-mpeix*)
vendor=hp
;;
- hiux*)
+ *-hiux*)
vendor=hitachi
;;
- unos*)
+ *-unos*)
vendor=crds
;;
- dgux*)
+ *-dgux*)
vendor=dg
;;
- luna*)
+ *-luna*)
vendor=omron
;;
- genix*)
+ *-genix*)
vendor=ns
;;
- clix*)
+ *-clix*)
vendor=intergraph
;;
- mvs* | opened*)
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
vendor=ibm
;;
- os400*)
+ s390-* | s390x-*)
vendor=ibm
;;
- ptx*)
+ *-ptx*)
vendor=sequent
;;
- tpf*)
+ *-tpf*)
vendor=ibm
;;
- vxsim* | vxworks* | windiss*)
+ *-vxsim* | *-vxworks* | *-windiss*)
vendor=wrs
;;
- aux*)
+ *-aux*)
vendor=apple
;;
- hms*)
+ *-hms*)
vendor=hitachi
;;
- mpw* | macos*)
+ *-mpw* | *-macos*)
vendor=apple
;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
vendor=atari
;;
- vos*)
+ *-vos*)
vendor=stratus
;;
esac
;;
esac
-echo "$cpu-$vendor-$os"
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
exit
# Local variables:
diff --git a/3rdparty/expat/conftools/depcomp b/3rdparty/expat/conftools/depcomp
index 6b391623c4b..715e34311ed 100755
--- a/3rdparty/expat/conftools/depcomp
+++ b/3rdparty/expat/conftools/depcomp
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/3rdparty/expat/conftools/get-version.sh b/3rdparty/expat/conftools/get-version.sh
index 2592f103288..273ed3a3154 100755
--- a/3rdparty/expat/conftools/get-version.sh
+++ b/3rdparty/expat/conftools/get-version.sh
@@ -1,13 +1,39 @@
#!/bin/sh
-#
# USAGE: get-version.sh path/to/expat.h
#
# This script will print Expat's version number on stdout. For example:
#
# $ ./conftools/get-version.sh ./lib/expat.h
# 1.95.3
-# $
+# __ __ _
+# ___\ \/ /_ __ __ _| |_
+# / _ \\ /| '_ \ / _` | __|
+# | __// \| |_) | (_| | |_
+# \___/_/\_\ .__/ \__,_|\__|
+# |_| XML parser
+#
+# Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
+# Copyright (c) 2017 Kerin Millar <kfm@plushkava.net>
+# Licensed under the MIT license:
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
if test $# = 0; then
echo "ERROR: pathname for expat.h was not provided."
diff --git a/3rdparty/expat/conftools/install-sh b/3rdparty/expat/conftools/install-sh
index 20d8b2eaea9..ec298b53740 100755
--- a/3rdparty/expat/conftools/install-sh
+++ b/3rdparty/expat/conftools/install-sh
@@ -1,7 +1,7 @@
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2018-03-11.20; # UTC
+scriptversion=2020-11-14.01; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -69,6 +69,11 @@ posix_mkdir=
# Desired mode of installed file.
mode=0755
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
chgrpcmd=
chmodcmd=$chmodprog
chowncmd=
@@ -99,18 +104,28 @@ Options:
--version display version info and exit.
-c (ignored)
- -C install only if different (preserve the last data modification time)
+ -C install only if different (preserve data modification time)
-d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
-s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
-t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
"
while test $# -ne 0; do
@@ -137,8 +152,13 @@ while test $# -ne 0; do
-o) chowncmd="$chownprog $2"
shift;;
+ -p) cpprog="$cpprog -p";;
+
-s) stripcmd=$stripprog;;
+ -S) backupsuffix="$2"
+ shift;;
+
-t)
is_target_a_directory=always
dst_arg=$2
@@ -255,6 +275,10 @@ do
dstdir=$dst
test -d "$dstdir"
dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@@ -301,22 +325,6 @@ do
if test $dstdir_status != 0; then
case $posix_mkdir in
'')
- # Create intermediate dirs using mode 755 as modified by the umask.
- # This is like FreeBSD 'install' as of 1997-10-28.
- umask=`umask`
- case $stripcmd.$umask in
- # Optimize common cases.
- *[2367][2367]) mkdir_umask=$umask;;
- .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
- *[0-7])
- mkdir_umask=`expr $umask + 22 \
- - $umask % 100 % 40 + $umask % 20 \
- - $umask % 10 % 4 + $umask % 2
- `;;
- *) mkdir_umask=$umask,go-w;;
- esac
-
# With -d, create the new directory with the user-specified mode.
# Otherwise, rely on $mkdir_umask.
if test -n "$dir_arg"; then
@@ -326,52 +334,49 @@ do
fi
posix_mkdir=false
- case $umask in
- *[123567][0-7][0-7])
- # POSIX mkdir -p sets u+wx bits regardless of umask, which
- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
- ;;
- *)
- # Note that $RANDOM variable is not portable (e.g. dash); Use it
- # here however when possible just to lower collision chance.
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-
- trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
-
- # Because "mkdir -p" follows existing symlinks and we likely work
- # directly in world-writeable /tmp, make sure that the '$tmpdir'
- # directory is successfully created first before we actually test
- # 'mkdir -p' feature.
- if (umask $mkdir_umask &&
- $mkdirprog $mkdir_mode "$tmpdir" &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- test_tmpdir="$tmpdir/a"
- ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
- fi
- trap '' 0;;
- esac;;
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
esac
if
@@ -382,7 +387,7 @@ do
then :
else
- # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # mkdir does not conform to POSIX,
# or it failed possibly due to a race condition. Create the
# directory the slow way, step by step, checking for races as we go.
@@ -411,7 +416,7 @@ do
prefixes=
else
if $posix_mkdir; then
- (umask=$mkdir_umask &&
+ (umask $mkdir_umask &&
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
# Don't fail if two instances are running concurrently.
test -d "$prefix" || exit 1
@@ -488,6 +493,13 @@ do
then
rm -f "$dsttmp"
else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
# Rename the file to the real destination.
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
@@ -502,9 +514,9 @@ do
# file should still install successfully.
{
test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
} ||
{ echo "$0: cannot unlink or rename $dst" >&2
(exit 1); exit 1
diff --git a/3rdparty/expat/conftools/ltmain.sh b/3rdparty/expat/conftools/ltmain.sh
index e774ddfe649..d57f0982354 100644
--- a/3rdparty/expat/conftools/ltmain.sh
+++ b/3rdparty/expat/conftools/ltmain.sh
@@ -1,12 +1,12 @@
-#! /bin/sh
+#! /usr/bin/env sh
## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
-## by inline-source v2014-01-03.01
+## by inline-source v2019-02-19.15
-# libtool (GNU libtool) 2.4.6
+# libtool (GNU libtool) 2.5.4
# Provide generalized library-building support services.
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-# Copyright (C) 1996-2015 Free Software Foundation, Inc.
+# Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -31,8 +31,8 @@
PROGRAM=libtool
PACKAGE=libtool
-VERSION=2.4.6
-package_revision=2.4.6
+VERSION=2.5.4
+package_revision=2.5.4
## ------ ##
@@ -64,34 +64,25 @@ package_revision=2.4.6
# libraries, which are installed to $pkgauxdir.
# Set a version string for this script.
-scriptversion=2015-10-04.22; # UTC
+scriptversion=2019-02-19.15; # UTC
# General shell script boiler plate, and helper functions.
# Written by Gary V. Vaughan, 2004
-# Copyright (C) 2004-2015 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions. There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-
-# As a special exception to the GNU General Public License, if you distribute
-# this file as part of a program or library that is built using GNU Libtool,
-# you may include this file under the same distribution terms that you use
-# for the rest of that program.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# This is free software. There is NO warranty; not even for
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors
+#
+# This file is dual licensed under the terms of the MIT license
+# <https://opensource.org/licenses/MIT>, and GPL version 2 or later
+# <https://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
+# these licenses when using or redistributing this software or any of
+# the files within it. See the URLs above, or the file `LICENSE`
+# included in the Bootstrap distribution for the full license texts.
-# Please report bugs or propose patches to gary@gnu.org.
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
## ------ ##
@@ -139,9 +130,12 @@ do
_G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
fi"
done
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+# These NLS vars are set unconditionally (bootstrap issue #24). Unset those
+# in case the environment reset is needed later and the $save_* variant is not
+# defined (see the code above).
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
# Make sure IFS has a sensible default
sp=' '
@@ -149,7 +143,7 @@ nl='
'
IFS="$sp $nl"
-# There are apparently some retarded systems that use ';' as a PATH separator!
+# There are apparently some systems that use ';' as a PATH separator!
if test "${PATH_SEPARATOR+set}" != set; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
@@ -159,6 +153,26 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
+# func_unset VAR
+# --------------
+# Portably unset VAR.
+# In some shells, an 'unset VAR' statement leaves a non-zero return
+# status if VAR is already unset, which might be problematic if the
+# statement is used at the end of a function (thus poisoning its return
+# value) or when 'set -e' is active (causing even a spurious abort of
+# the script in this case).
+func_unset ()
+{
+ { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; }
+}
+
+
+# Make sure CDPATH doesn't cause `cd` commands to output the target dir.
+func_unset CDPATH
+
+# Make sure ${,E,F}GREP behave sanely.
+func_unset GREP_OPTIONS
+
## ------------------------- ##
## Locate command utilities. ##
@@ -259,7 +273,7 @@ test -z "$SED" && {
rm -f conftest.in conftest.tmp conftest.nl conftest.out
}
- func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+ func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin"
rm -f conftest.sed
SED=$func_path_progs_result
}
@@ -295,7 +309,7 @@ test -z "$GREP" && {
rm -f conftest.in conftest.tmp conftest.nl conftest.out
}
- func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+ func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin"
GREP=$func_path_progs_result
}
@@ -360,6 +374,35 @@ sed_double_backslash="\
s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
s/\n//g"
+# require_check_ifs_backslash
+# ---------------------------
+# Check if we can use backslash as IFS='\' separator, and set
+# $check_ifs_backshlash_broken to ':' or 'false'.
+require_check_ifs_backslash=func_require_check_ifs_backslash
+func_require_check_ifs_backslash ()
+{
+ _G_save_IFS=$IFS
+ IFS='\'
+ _G_check_ifs_backshlash='a\\b'
+ for _G_i in $_G_check_ifs_backshlash
+ do
+ case $_G_i in
+ a)
+ check_ifs_backshlash_broken=false
+ ;;
+ '')
+ break
+ ;;
+ *)
+ check_ifs_backshlash_broken=:
+ break
+ ;;
+ esac
+ done
+ IFS=$_G_save_IFS
+ require_check_ifs_backslash=:
+}
+
## ----------------- ##
## Global variables. ##
@@ -546,7 +589,7 @@ func_require_term_colors ()
# _G_HAVE_PLUSEQ_OP
# Can be empty, in which case the shell is probed, "yes" if += is
- # useable or anything else if it does not work.
+ # usable or anything else if it does not work.
test -z "$_G_HAVE_PLUSEQ_OP" \
&& (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
&& _G_HAVE_PLUSEQ_OP=yes
@@ -580,16 +623,16 @@ if test yes = "$_G_HAVE_PLUSEQ_OP"; then
{
$debug_cmd
- func_quote_for_eval "$2"
- eval "$1+=\\ \$func_quote_for_eval_result"
+ func_quote_arg pretty "$2"
+ eval "$1+=\\ \$func_quote_arg_result"
}'
else
func_append_quoted ()
{
$debug_cmd
- func_quote_for_eval "$2"
- eval "$1=\$$1\\ \$func_quote_for_eval_result"
+ func_quote_arg pretty "$2"
+ eval "$1=\$$1\\ \$func_quote_arg_result"
}
fi
@@ -696,7 +739,7 @@ eval 'func_dirname ()
# to NONDIR_REPLACEMENT.
# value returned in "$func_dirname_result"
# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
+# value returned in "$func_basename_result"
# For efficiency, we do not delegate to the functions above but instead
# duplicate the functionality here.
eval 'func_dirname_and_basename ()
@@ -854,7 +897,7 @@ func_mkdir_p ()
# While some portion of DIR does not yet exist...
while test ! -d "$_G_directory_path"; do
# ...make a list in topmost first order. Use a colon delimited
- # list incase some portion of path contains whitespace.
+ # list in case some portion of path contains whitespace.
_G_dir_list=$_G_directory_path:$_G_dir_list
# If the last portion added has no slash in it, the list is done
@@ -1091,132 +1134,203 @@ func_relative_path ()
}
-# func_quote ARG
-# --------------
-# Aesthetically quote one ARG, store the result into $func_quote_result. Note
-# that we keep attention to performance here (so far O(N) complexity as long as
-# func_append is O(1)).
-func_quote ()
+# func_quote_portable EVAL ARG
+# ----------------------------
+# Internal function to portably implement func_quote_arg. Note that we still
+# keep attention to performance here so we as much as possible try to avoid
+# calling sed binary (so far O(N) complexity as long as func_append is O(1)).
+func_quote_portable ()
{
$debug_cmd
- func_quote_result=$1
+ $require_check_ifs_backslash
- case $func_quote_result in
- *[\\\`\"\$]*)
- case $func_quote_result in
- *[\[\*\?]*)
- func_quote_result=`$ECHO "$func_quote_result" | $SED "$sed_quote_subst"`
- return 0
- ;;
- esac
+ func_quote_portable_result=$2
- func_quote_old_IFS=$IFS
- for _G_char in '\' '`' '"' '$'
- do
- # STATE($1) PREV($2) SEPARATOR($3)
- set start "" ""
- func_quote_result=dummy"$_G_char$func_quote_result$_G_char"dummy
- IFS=$_G_char
- for _G_part in $func_quote_result
- do
- case $1 in
- quote)
- func_append func_quote_result "$3$2"
- set quote "$_G_part" "\\$_G_char"
- ;;
- start)
- set first "" ""
- func_quote_result=
- ;;
- first)
- set quote "$_G_part" ""
+ # one-time-loop (easy break)
+ while true
+ do
+ if $1; then
+ func_quote_portable_result=`$ECHO "$2" | $SED \
+ -e "$sed_double_quote_subst" -e "$sed_double_backslash"`
+ break
+ fi
+
+ # Quote for eval.
+ case $func_quote_portable_result in
+ *[\\\`\"\$]*)
+ # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string
+ # contains the shell wildcard characters.
+ case $check_ifs_backshlash_broken$func_quote_portable_result in
+ :*|*[\[\*\?]*)
+ func_quote_portable_result=`$ECHO "$func_quote_portable_result" \
+ | $SED "$sed_quote_subst"`
+ break
;;
- esac
+ esac
+
+ func_quote_portable_old_IFS=$IFS
+ for _G_char in '\' '`' '"' '$'
+ do
+ # STATE($1) PREV($2) SEPARATOR($3)
+ set start "" ""
+ func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy
+ IFS=$_G_char
+ for _G_part in $func_quote_portable_result
+ do
+ case $1 in
+ quote)
+ func_append func_quote_portable_result "$3$2"
+ set quote "$_G_part" "\\$_G_char"
+ ;;
+ start)
+ set first "" ""
+ func_quote_portable_result=
+ ;;
+ first)
+ set quote "$_G_part" ""
+ ;;
+ esac
+ done
done
- IFS=$func_quote_old_IFS
- done
+ IFS=$func_quote_portable_old_IFS
+ ;;
+ *) ;;
+ esac
+ break
+ done
+
+ func_quote_portable_unquoted_result=$func_quote_portable_result
+ case $func_quote_portable_result in
+ # double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and variable expansion
+ # for a subsequent eval.
+ # many bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ func_quote_portable_result=\"$func_quote_portable_result\"
;;
- *) ;;
esac
}
-# func_quote_for_eval ARG...
-# --------------------------
-# Aesthetically quote ARGs to be evaled later.
-# This function returns two values:
-# i) func_quote_for_eval_result
-# double-quoted, suitable for a subsequent eval
-# ii) func_quote_for_eval_unquoted_result
-# has all characters that are still active within double
-# quotes backslashified.
-func_quote_for_eval ()
-{
- $debug_cmd
-
- func_quote_for_eval_unquoted_result=
- func_quote_for_eval_result=
- while test 0 -lt $#; do
- func_quote "$1"
- _G_unquoted_arg=$func_quote_result
- if test -n "$func_quote_for_eval_unquoted_result"; then
- func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
- else
- func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
- fi
-
- case $_G_unquoted_arg in
- # Double-quote args containing shell metacharacters to delay
- # word splitting, command substitution and variable expansion
- # for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- _G_quoted_arg=\"$_G_unquoted_arg\"
+# func_quotefast_eval ARG
+# -----------------------
+# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG',
+# but optimized for speed. Result is stored in $func_quotefast_eval.
+if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then
+ printf -v _GL_test_printf_tilde %q '~'
+ if test '\~' = "$_GL_test_printf_tilde"; then
+ func_quotefast_eval ()
+ {
+ printf -v func_quotefast_eval_result %q "$1"
+ }
+ else
+ # Broken older Bash implementations. Make those faster too if possible.
+ func_quotefast_eval ()
+ {
+ case $1 in
+ '~'*)
+ func_quote_portable false "$1"
+ func_quotefast_eval_result=$func_quote_portable_result
;;
*)
- _G_quoted_arg=$_G_unquoted_arg
- ;;
+ printf -v func_quotefast_eval_result %q "$1"
+ ;;
esac
+ }
+ fi
+else
+ func_quotefast_eval ()
+ {
+ func_quote_portable false "$1"
+ func_quotefast_eval_result=$func_quote_portable_result
+ }
+fi
- if test -n "$func_quote_for_eval_result"; then
- func_append func_quote_for_eval_result " $_G_quoted_arg"
- else
- func_append func_quote_for_eval_result "$_G_quoted_arg"
- fi
- shift
- done
-}
-
-
-# func_quote_for_expand ARG
-# -------------------------
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
- $debug_cmd
- case $1 in
- *[\\\`\"]*)
- _G_arg=`$ECHO "$1" | $SED \
- -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
- *)
- _G_arg=$1 ;;
+# func_quote_arg MODEs ARG
+# ------------------------
+# Quote one ARG to be evaled later. MODEs argument may contain zero or more
+# specifiers listed below separated by ',' character. This function returns two
+# values:
+# i) func_quote_arg_result
+# double-quoted (when needed), suitable for a subsequent eval
+# ii) func_quote_arg_unquoted_result
+# has all characters that are still active within double
+# quotes backslashified. Available only if 'unquoted' is specified.
+#
+# Available modes:
+# ----------------
+# 'eval' (default)
+# - escape shell special characters
+# 'expand'
+# - the same as 'eval'; but do not quote variable references
+# 'pretty'
+# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might
+# be used later in func_quote to get output like: 'echo "a b"' instead
+# of 'echo a\ b'. This is slower than default on some shells.
+# 'unquoted'
+# - produce also $func_quote_arg_unquoted_result which does not contain
+# wrapping double-quotes.
+#
+# Examples for 'func_quote_arg pretty,unquoted string':
+#
+# string | *_result | *_unquoted_result
+# ------------+-----------------------+-------------------
+# " | \" | \"
+# a b | "a b" | a b
+# "a b" | "\"a b\"" | \"a b\"
+# * | "*" | *
+# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\"
+#
+# Examples for 'func_quote_arg pretty,unquoted,expand string':
+#
+# string | *_result | *_unquoted_result
+# --------------+---------------------+--------------------
+# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\"
+func_quote_arg ()
+{
+ _G_quote_expand=false
+ case ,$1, in
+ *,expand,*)
+ _G_quote_expand=:
+ ;;
esac
- case $_G_arg in
- # Double-quote args containing shell metacharacters to delay
- # word splitting and command substitution for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- _G_arg=\"$_G_arg\"
+ case ,$1, in
+ *,pretty,*|*,expand,*|*,unquoted,*)
+ func_quote_portable $_G_quote_expand "$2"
+ func_quote_arg_result=$func_quote_portable_result
+ func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result
+ ;;
+ *)
+ # Faster quote-for-eval for some shells.
+ func_quotefast_eval "$2"
+ func_quote_arg_result=$func_quotefast_eval_result
;;
esac
+}
+
- func_quote_for_expand_result=$_G_arg
+# func_quote MODEs ARGs...
+# ------------------------
+# Quote all ARGs to be evaled later and join them into single command. See
+# func_quote_arg's description for more info.
+func_quote ()
+{
+ $debug_cmd
+ _G_func_quote_mode=$1 ; shift
+ func_quote_result=
+ while test 0 -lt $#; do
+ func_quote_arg "$_G_func_quote_mode" "$1"
+ if test -n "$func_quote_result"; then
+ func_append func_quote_result " $func_quote_arg_result"
+ else
+ func_append func_quote_result "$func_quote_arg_result"
+ fi
+ shift
+ done
}
@@ -1262,8 +1376,8 @@ func_show_eval ()
_G_cmd=$1
_G_fail_exp=${2-':'}
- func_quote_for_expand "$_G_cmd"
- eval "func_notquiet $func_quote_for_expand_result"
+ func_quote_arg pretty,expand "$_G_cmd"
+ eval "func_notquiet $func_quote_arg_result"
$opt_dry_run || {
eval "$_G_cmd"
@@ -1288,8 +1402,8 @@ func_show_eval_locale ()
_G_fail_exp=${2-':'}
$opt_quiet || {
- func_quote_for_expand "$_G_cmd"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$_G_cmd"
+ eval "func_echo $func_quote_arg_result"
}
$opt_dry_run || {
@@ -1416,30 +1530,26 @@ func_lt_ver ()
# End:
#! /bin/sh
-# Set a version string for this script.
-scriptversion=2014-01-07.03; # UTC
-
# A portable, pluggable option parser for Bourne shell.
# Written by Gary V. Vaughan, 2010
-# Copyright (C) 2010-2015 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions. There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# This is free software. There is NO warranty; not even for
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors
+#
+# This file is dual licensed under the terms of the MIT license
+# <https://opensource.org/licenses/MIT>, and GPL version 2 or later
+# <https://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
+# these licenses when using or redistributing this software or any of
+# the files within it. See the URLs above, or the file `LICENSE`
+# included in the Bootstrap distribution for the full license texts.
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
-# Please report bugs or propose patches to gary@gnu.org.
+# Set a version string for this script.
+scriptversion=2019-02-19.15; # UTC
## ------ ##
@@ -1462,7 +1572,7 @@ scriptversion=2014-01-07.03; # UTC
#
# In order for the '--version' option to work, you will need to have a
# suitably formatted comment like the one at the top of this file
-# starting with '# Written by ' and ending with '# warranty; '.
+# starting with '# Written by ' and ending with '# Copyright'.
#
# For '-h' and '--help' to work, you will also need a one line
# description of your script's purpose in a comment directly above the
@@ -1474,7 +1584,7 @@ scriptversion=2014-01-07.03; # UTC
# to display verbose messages only when your user has specified
# '--verbose'.
#
-# After sourcing this file, you can plug processing for additional
+# After sourcing this file, you can plug in processing for additional
# options by amending the variables from the 'Configuration' section
# below, and following the instructions in the 'Option parsing'
# section further down.
@@ -1523,8 +1633,8 @@ fatal_help="Try '\$progname --help' for more information."
## ------------------------- ##
# This section contains functions for adding, removing, and running hooks
-# to the main code. A hook is just a named list of of function, that can
-# be run in order later on.
+# in the main code. A hook is just a list of function names that can be
+# run in order later on.
# func_hookable FUNC_NAME
# -----------------------
@@ -1557,7 +1667,8 @@ func_add_hook ()
# func_remove_hook FUNC_NAME HOOK_FUNC
# ------------------------------------
-# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+# Remove HOOK_FUNC from the list of hook functions to be called by
+# FUNC_NAME.
func_remove_hook ()
{
$debug_cmd
@@ -1566,10 +1677,28 @@ func_remove_hook ()
}
+# func_propagate_result FUNC_NAME_A FUNC_NAME_B
+# ---------------------------------------------
+# If the *_result variable of FUNC_NAME_A _is set_, assign its value to
+# *_result variable of FUNC_NAME_B.
+func_propagate_result ()
+{
+ $debug_cmd
+
+ func_propagate_result_result=:
+ if eval "test \"\${${1}_result+set}\" = set"
+ then
+ eval "${2}_result=\$${1}_result"
+ else
+ func_propagate_result_result=false
+ fi
+}
+
+
# func_run_hooks FUNC_NAME [ARG]...
# ---------------------------------
# Run all hook functions registered to FUNC_NAME.
-# It is assumed that the list of hook functions contains nothing more
+# It's assumed that the list of hook functions contains nothing more
# than a whitespace-delimited list of legal shell function names, and
# no effort is wasted trying to catch shell meta-characters or preserve
# whitespace.
@@ -1579,22 +1708,19 @@ func_run_hooks ()
case " $hookable_fns " in
*" $1 "*) ;;
- *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+ *) func_fatal_error "'$1' does not support hook functions." ;;
esac
eval _G_hook_fns=\$$1_hooks; shift
for _G_hook in $_G_hook_fns; do
- eval $_G_hook '"$@"'
-
- # store returned options list back into positional
- # parameters for next 'cmd' execution.
- eval _G_hook_result=\$${_G_hook}_result
- eval set dummy "$_G_hook_result"; shift
+ func_unset "${_G_hook}_result"
+ eval $_G_hook '${1+"$@"}'
+ func_propagate_result $_G_hook func_run_hooks
+ if $func_propagate_result_result; then
+ eval set dummy "$func_run_hooks_result"; shift
+ fi
done
-
- func_quote_for_eval ${1+"$@"}
- func_run_hooks_result=$func_quote_for_eval_result
}
@@ -1604,10 +1730,18 @@ func_run_hooks ()
## --------------- ##
# In order to add your own option parsing hooks, you must accept the
-# full positional parameter list in your hook function, remove any
-# options that you action, and then pass back the remaining unprocessed
-# options in '<hooked_function_name>_result', escaped suitably for
-# 'eval'. Like this:
+# full positional parameter list from your hook function. You may remove
+# or edit any options that you action, and then pass back the remaining
+# unprocessed options in '<hooked_function_name>_result', escaped
+# suitably for 'eval'.
+#
+# The '<hooked_function_name>_result' variable is automatically unset
+# before your hook gets called; for best performance, only set the
+# *_result variable when necessary (i.e. don't call the 'func_quote'
+# function unnecessarily because it can be an expensive operation on some
+# machines).
+#
+# Like this:
#
# my_options_prep ()
# {
@@ -1617,9 +1751,8 @@ func_run_hooks ()
# usage_message=$usage_message'
# -s, --silent don'\''t print informational messages
# '
-#
-# func_quote_for_eval ${1+"$@"}
-# my_options_prep_result=$func_quote_for_eval_result
+# # No change in '$@' (ignored completely by this hook). Leave
+# # my_options_prep_result variable intact.
# }
# func_add_hook func_options_prep my_options_prep
#
@@ -1628,25 +1761,36 @@ func_run_hooks ()
# {
# $debug_cmd
#
-# # Note that for efficiency, we parse as many options as we can
+# args_changed=false
+#
+# # Note that, for efficiency, we parse as many options as we can
# # recognise in a loop before passing the remainder back to the
# # caller on the first unrecognised argument we encounter.
# while test $# -gt 0; do
# opt=$1; shift
# case $opt in
-# --silent|-s) opt_silent=: ;;
+# --silent|-s) opt_silent=:
+# args_changed=:
+# ;;
# # Separate non-argument short options:
# -s*) func_split_short_opt "$_G_opt"
# set dummy "$func_split_short_opt_name" \
# "-$func_split_short_opt_arg" ${1+"$@"}
# shift
+# args_changed=:
# ;;
-# *) set dummy "$_G_opt" "$*"; shift; break ;;
+# *) # Make sure the first unrecognised option "$_G_opt"
+# # is added back to "$@" in case we need it later,
+# # if $args_changed was set to 'true'.
+# set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
# esac
# done
#
-# func_quote_for_eval ${1+"$@"}
-# my_silent_option_result=$func_quote_for_eval_result
+# # Only call 'func_quote' here if we processed at least one argument.
+# if $args_changed; then
+# func_quote eval ${1+"$@"}
+# my_silent_option_result=$func_quote_result
+# fi
# }
# func_add_hook func_parse_options my_silent_option
#
@@ -1657,17 +1801,26 @@ func_run_hooks ()
#
# $opt_silent && $opt_verbose && func_fatal_help "\
# '--silent' and '--verbose' options are mutually exclusive."
-#
-# func_quote_for_eval ${1+"$@"}
-# my_option_validation_result=$func_quote_for_eval_result
# }
# func_add_hook func_validate_options my_option_validation
#
-# You'll alse need to manually amend $usage_message to reflect the extra
+# You'll also need to manually amend $usage_message to reflect the extra
# options you parse. It's preferable to append if you can, so that
# multiple option parsing hooks can be added safely.
+# func_options_finish [ARG]...
+# ----------------------------
+# Finishing the option parse loop (call 'func_options' hooks ATM).
+func_options_finish ()
+{
+ $debug_cmd
+
+ func_run_hooks func_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_options_finish
+}
+
+
# func_options [ARG]...
# ---------------------
# All the functions called inside func_options are hookable. See the
@@ -1677,17 +1830,27 @@ func_options ()
{
$debug_cmd
- func_options_prep ${1+"$@"}
- eval func_parse_options \
- ${func_options_prep_result+"$func_options_prep_result"}
- eval func_validate_options \
- ${func_parse_options_result+"$func_parse_options_result"}
+ _G_options_quoted=false
- eval func_run_hooks func_options \
- ${func_validate_options_result+"$func_validate_options_result"}
+ for my_func in options_prep parse_options validate_options options_finish
+ do
+ func_unset func_${my_func}_result
+ func_unset func_run_hooks_result
+ eval func_$my_func '${1+"$@"}'
+ func_propagate_result func_$my_func func_options
+ if $func_propagate_result_result; then
+ eval set dummy "$func_options_result"; shift
+ _G_options_quoted=:
+ fi
+ done
- # save modified positional parameters for caller
- func_options_result=$func_run_hooks_result
+ $_G_options_quoted || {
+ # As we (func_options) are top-level options-parser function and
+ # nobody quoted "$@" for us yet, we need to do it explicitly for
+ # caller.
+ func_quote eval ${1+"$@"}
+ func_options_result=$func_quote_result
+ }
}
@@ -1696,9 +1859,8 @@ func_options ()
# All initialisations required before starting the option parse loop.
# Note that when calling hook functions, we pass through the list of
# positional parameters. If a hook function modifies that list, and
-# needs to propogate that back to rest of this script, then the complete
-# modified list must be put in 'func_run_hooks_result' before
-# returning.
+# needs to propagate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before returning.
func_hookable func_options_prep
func_options_prep ()
{
@@ -1709,9 +1871,7 @@ func_options_prep ()
opt_warning_types=
func_run_hooks func_options_prep ${1+"$@"}
-
- # save modified positional parameters for caller
- func_options_prep_result=$func_run_hooks_result
+ func_propagate_result func_run_hooks func_options_prep
}
@@ -1723,25 +1883,32 @@ func_parse_options ()
{
$debug_cmd
- func_parse_options_result=
-
+ _G_parse_options_requote=false
# this just eases exit handling
while test $# -gt 0; do
# Defer to hook functions for initial option parsing, so they
# get priority in the event of reusing an option name.
func_run_hooks func_parse_options ${1+"$@"}
-
- # Adjust func_parse_options positional parameters to match
- eval set dummy "$func_run_hooks_result"; shift
+ func_propagate_result func_run_hooks func_parse_options
+ if $func_propagate_result_result; then
+ eval set dummy "$func_parse_options_result"; shift
+ # Even though we may have changed "$@", we passed the "$@" array
+ # down into the hook and it quoted it for us (because we are in
+ # this if-branch). No need to quote it again.
+ _G_parse_options_requote=false
+ fi
# Break out of the loop if we already parsed every option.
test $# -gt 0 || break
+ # We expect that one of the options parsed in this function matches
+ # and thus we remove _G_opt from "$@" and need to re-quote.
+ _G_match_parse_options=:
_G_opt=$1
shift
case $_G_opt in
--debug|-x) debug_cmd='set -x'
- func_echo "enabling shell trace mode"
+ func_echo "enabling shell trace mode" >&2
$debug_cmd
;;
@@ -1751,7 +1918,10 @@ func_parse_options ()
;;
--warnings|--warning|-W)
- test $# = 0 && func_missing_arg $_G_opt && break
+ if test $# = 0 && func_missing_arg $_G_opt; then
+ _G_parse_options_requote=:
+ break
+ fi
case " $warning_categories $1" in
*" $1 "*)
# trailing space prevents matching last $1 above
@@ -1804,15 +1974,24 @@ func_parse_options ()
shift
;;
- --) break ;;
+ --) _G_parse_options_requote=: ; break ;;
-*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
- *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift
+ _G_match_parse_options=false
+ break
+ ;;
esac
+
+ if $_G_match_parse_options; then
+ _G_parse_options_requote=:
+ fi
done
- # save modified positional parameters for caller
- func_quote_for_eval ${1+"$@"}
- func_parse_options_result=$func_quote_for_eval_result
+ if $_G_parse_options_requote; then
+ # save modified positional parameters for caller
+ func_quote eval ${1+"$@"}
+ func_parse_options_result=$func_quote_result
+ fi
}
@@ -1829,12 +2008,10 @@ func_validate_options ()
test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
func_run_hooks func_validate_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_validate_options
# Bail if the options were screwed!
$exit_cmd $EXIT_FAILURE
-
- # save modified positional parameters for caller
- func_validate_options_result=$func_run_hooks_result
}
@@ -1890,8 +2067,8 @@ func_missing_arg ()
# func_split_equals STRING
# ------------------------
-# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
-# splitting STRING at the '=' sign.
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables
+# after splitting STRING at the '=' sign.
test -z "$_G_HAVE_XSI_OPS" \
&& (eval 'x=a/b/c;
test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
@@ -1906,8 +2083,9 @@ then
func_split_equals_lhs=${1%%=*}
func_split_equals_rhs=${1#*=}
- test "x$func_split_equals_lhs" = "x$1" \
- && func_split_equals_rhs=
+ if test "x$func_split_equals_lhs" = "x$1"; then
+ func_split_equals_rhs=
+ fi
}'
else
# ...otherwise fall back to using expr, which is often a shell builtin.
@@ -1917,7 +2095,7 @@ else
func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
func_split_equals_rhs=
- test "x$func_split_equals_lhs" = "x$1" \
+ test "x$func_split_equals_lhs=" = "x$1" \
|| func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
}
fi #func_split_equals
@@ -1943,7 +2121,7 @@ else
{
$debug_cmd
- func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+ func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'`
func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
}
fi #func_split_short_opt
@@ -1985,31 +2163,44 @@ func_usage_message ()
# func_version
# ------------
# Echo version message to standard output and exit.
+# The version message is extracted from the calling file's header
+# comments, with leading '# ' stripped:
+# 1. First display the progname and version
+# 2. Followed by the header comment line matching /^# Written by /
+# 3. Then a blank line followed by the first following line matching
+# /^# Copyright /
+# 4. Immediately followed by any lines between the previous matches,
+# except lines preceding the intervening completely blank line.
+# For example, see the header comments of this file.
func_version ()
{
$debug_cmd
printf '%s\n' "$progname $scriptversion"
$SED -n '
- /(C)/!b go
- :more
- /\./!{
- N
- s|\n# | |
- b more
- }
- :go
- /^# Written by /,/# warranty; / {
- s|^# ||
- s|^# *$||
- s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
- p
+ /^# Written by /!b
+ s|^# ||; p; n
+
+ :fwd2blnk
+ /./ {
+ n
+ b fwd2blnk
}
- /^# Written by / {
- s|^# ||
- p
+ p; n
+
+ :holdwrnt
+ s|^# ||
+ s|^# *$||
+ /^Copyright /!{
+ /./H
+ n
+ b holdwrnt
}
- /^warranty; /q' < "$progpath"
+
+ s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+ G
+ s|\(\n\)\n*|\1|g
+ p; q' < "$progpath"
exit $?
}
@@ -2019,12 +2210,35 @@ func_version ()
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
# time-stamp-time-zone: "UTC"
# End:
# Set a version string.
-scriptversion='(GNU libtool) 2.4.6'
+scriptversion='(GNU libtool) 2.5.4'
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+ $debug_cmd
+
+ year=`date +%Y`
+
+ cat <<EOF
+$progname $scriptversion
+Copyright (C) $year Free Software Foundation, Inc.
+License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Originally written by Gordon Matzigkeit, 1996
+(See AUTHORS for complete contributor listing)
+EOF
+
+ exit $?
+}
# func_echo ARG...
@@ -2047,18 +2261,6 @@ func_echo ()
}
-# func_warning ARG...
-# -------------------
-# Libtool warnings are not categorized, so override funclib.sh
-# func_warning with this simpler definition.
-func_warning ()
-{
- $debug_cmd
-
- $warning_func ${1+"$@"}
-}
-
-
## ---------------- ##
## Options parsing. ##
## ---------------- ##
@@ -2070,19 +2272,23 @@ usage='$progpath [OPTION]... [MODE-ARG]...'
# Short help message in response to '-h'.
usage_message="Options:
- --config show all configuration variables
- --debug enable verbose shell tracing
- -n, --dry-run display commands without modifying any files
- --features display basic configuration information and exit
- --mode=MODE use operation mode MODE
- --no-warnings equivalent to '-Wnone'
- --preserve-dup-deps don't remove duplicate dependency libraries
- --quiet, --silent don't print informational messages
- --tag=TAG use configuration variables from tag TAG
- -v, --verbose print more informational messages than default
- --version print version information
- -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
- -h, --help, --help-all print short, long, or detailed help message
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+ -n, --dry-run display commands without modifying any files
+ --features display basic configuration information
+ --finish use operation '--mode=finish'
+ --mode=MODE use operation mode MODE
+ --no-finish don't update shared library cache
+ --no-quiet, --no-silent print default informational messages
+ --no-warnings equivalent to '-Wnone'
+ --preserve-dup-deps don't remove duplicate dependency libraries
+ --quiet, --silent don't print informational messages
+ --reorder-cache=DIRS reorder shared library cache for preferred DIRS
+ --tag=TAG use configuration variables from tag TAG
+ -v, --verbose print more informational messages than default
+ --version print version information
+ -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
+ -h, --help, --help-all print short, long, or detailed help message
"
# Additional text appended to 'usage_message' in response to '--help'.
@@ -2115,13 +2321,13 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
- version: $progname (GNU libtool) 2.4.6
+ version: $progname $scriptversion
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
Report bugs to <bug-libtool@gnu.org>.
-GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>."
+GNU libtool home page: <https://www.gnu.org/software/libtool/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>."
exit 0
}
@@ -2171,7 +2377,7 @@ fi
# a configuration failure hint, and exit.
func_fatal_configuration ()
{
- func__fatal_error ${1+"$@"} \
+ func_fatal_error ${1+"$@"} \
"See the $PACKAGE documentation for more information." \
"Fatal configuration error."
}
@@ -2311,12 +2517,17 @@ libtool_options_prep ()
opt_dry_run=false
opt_help=false
opt_mode=
+ opt_reorder_cache=false
opt_preserve_dup_deps=false
opt_quiet=false
+ opt_finishing=true
+ opt_warning=
nonopt=
preserve_args=
+ _G_rc_lt_options_prep=:
+
# Shorthand for --mode=foo, only valid as the first argument
case $1 in
clean|clea|cle|cl)
@@ -2340,11 +2551,16 @@ libtool_options_prep ()
uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
shift; set dummy --mode uninstall ${1+"$@"}; shift
;;
+ *)
+ _G_rc_lt_options_prep=false
+ ;;
esac
- # Pass back the list of options.
- func_quote_for_eval ${1+"$@"}
- libtool_options_prep_result=$func_quote_for_eval_result
+ if $_G_rc_lt_options_prep; then
+ # Pass back the list of options.
+ func_quote eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_result
+ fi
}
func_add_hook func_options_prep libtool_options_prep
@@ -2356,9 +2572,12 @@ libtool_parse_options ()
{
$debug_cmd
+ _G_rc_lt_parse_options=false
+
# Perform our own loop to consume as many options as possible in
# each iteration.
while test $# -gt 0; do
+ _G_match_lt_parse_options=:
_G_opt=$1
shift
case $_G_opt in
@@ -2392,14 +2611,18 @@ libtool_parse_options ()
clean|compile|execute|finish|install|link|relink|uninstall) ;;
# Catch anything else as an error
- *) func_error "invalid argument for $_G_opt"
+ *) func_error "invalid argument '$1' for $_G_opt"
exit_cmd=exit
- break
;;
esac
shift
;;
+ --no-finish)
+ opt_finishing=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
--no-silent|--no-quiet)
opt_quiet=false
func_append preserve_args " $_G_opt"
@@ -2415,6 +2638,24 @@ libtool_parse_options ()
func_append preserve_args " $_G_opt"
;;
+ --reorder-cache)
+ opt_reorder_cache=true
+ shared_lib_dirs=$1
+ if test -n "$shared_lib_dirs"; then
+ case $1 in
+ # Must begin with /:
+ /*) ;;
+
+ # Catch anything else as an error (relative paths)
+ *) func_error "invalid argument '$1' for $_G_opt"
+ func_error "absolute paths are required for $_G_opt"
+ exit_cmd=exit
+ ;;
+ esac
+ fi
+ shift
+ ;;
+
--silent|--quiet)
opt_quiet=:
opt_verbose=false
@@ -2433,19 +2674,36 @@ libtool_parse_options ()
func_append preserve_args " $_G_opt"
;;
- # An option not handled by this hook function:
- *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"} ; shift
+ _G_match_lt_parse_options=false
+ break
+ ;;
esac
+ $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
done
-
- # save modified positional parameters for caller
- func_quote_for_eval ${1+"$@"}
- libtool_parse_options_result=$func_quote_for_eval_result
+ if $_G_rc_lt_parse_options; then
+ # save modified positional parameters for caller
+ func_quote eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_result
+ fi
}
func_add_hook func_parse_options libtool_parse_options
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+ if $opt_warning; then
+ $debug_cmd
+ $warning_func ${1+"$@"}
+ fi
+}
+
# libtool_validate_options [ARG]...
# ---------------------------------
@@ -2462,10 +2720,10 @@ libtool_validate_options ()
# preserve --debug
test : = "$debug_cmd" || func_append preserve_args " --debug"
- case $host in
+ case $host_os in
# Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
# see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
- *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+ cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*)
# don't eliminate duplications in $postdeps and $predeps
opt_duplicate_compiler_generated_deps=:
;;
@@ -2498,8 +2756,8 @@ libtool_validate_options ()
}
# Pass back the unparsed argument list
- func_quote_for_eval ${1+"$@"}
- libtool_validate_options_result=$func_quote_for_eval_result
+ func_quote eval ${1+"$@"}
+ libtool_validate_options_result=$func_quote_result
}
func_add_hook func_validate_options libtool_validate_options
@@ -2797,7 +3055,7 @@ EOF
# func_convert_core_file_wine_to_w32 ARG
# Helper function used by file name conversion functions when $build is *nix,
-# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# and $host is mingw, windows, cygwin, or some other w32 environment. Relies on a
# correctly configured wine environment available, with the winepath program
# in $build's $PATH.
#
@@ -2829,9 +3087,10 @@ func_convert_core_file_wine_to_w32 ()
# func_convert_core_path_wine_to_w32 ARG
# Helper function used by path conversion functions when $build is *nix, and
-# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
-# configured wine environment available, with the winepath program in $build's
-# $PATH. Assumes ARG has no leading or trailing path separator characters.
+# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH. Assumes ARG has no leading or trailing path separator
+# characters.
#
# ARG is path to be converted from $build format to win32.
# Result is available in $func_convert_core_path_wine_to_w32_result.
@@ -2974,6 +3233,15 @@ func_convert_path_front_back_pathsep ()
# end func_convert_path_front_back_pathsep
+# func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER
+# Replaces a delimiter for a given path.
+func_convert_delimited_path ()
+{
+ converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"`
+}
+# end func_convert_delimited_path
+
+
##################################################
# $build to $host FILE NAME CONVERSION FUNCTIONS #
##################################################
@@ -3308,6 +3576,65 @@ func_dll_def_p ()
}
+# func_reorder_shared_lib_cache DIRS
+# Reorder the shared library cache by unconfiguring previous shared library cache
+# and configuring preferred search directories before previous search directories.
+# Previous shared library cache: /usr/lib /usr/local/lib
+# Preferred search directories: /tmp/testing
+# Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib
+func_reorder_shared_lib_cache ()
+{
+ $debug_cmd
+
+ case $host_os in
+ openbsd*)
+ get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"`
+ func_convert_delimited_path "$get_search_directories" ':' '\ '
+ save_search_directories=$converted_path
+ func_convert_delimited_path "$1" ':' '\ '
+
+ # Ensure directories exist
+ for dir in $converted_path; do
+ # Ensure each directory is an absolute path
+ case $dir in
+ /*) ;;
+ *) func_error "Directory '$dir' is not an absolute path"
+ exit $EXIT_FAILURE ;;
+ esac
+ # Ensure no trailing slashes
+ func_stripname '' '/' "$dir"
+ dir=$func_stripname_result
+ if test -d "$dir"; then
+ if test -n "$preferred_search_directories"; then
+ preferred_search_directories="$preferred_search_directories $dir"
+ else
+ preferred_search_directories=$dir
+ fi
+ else
+ func_error "Directory '$dir' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ done
+
+ PATH="$PATH:/sbin" ldconfig -U $save_search_directories
+ PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories
+ get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"`
+ func_convert_delimited_path "$get_search_directories" ':' '\ '
+ reordered_search_directories=$converted_path
+
+ $ECHO "Original: $save_search_directories"
+ $ECHO "Reordered: $reordered_search_directories"
+ exit $EXIT_SUCCESS
+ ;;
+ *)
+ func_error "--reorder-cache is not supported for host_os=$host_os."
+ exit $EXIT_FAILURE
+ ;;
+ esac
+}
+# end func_reorder_shared_lib_cache
+
+
# func_mode_compile arg...
func_mode_compile ()
{
@@ -3465,8 +3792,8 @@ func_mode_compile ()
esac
done
- func_quote_for_eval "$libobj"
- test "X$libobj" != "X$func_quote_for_eval_result" \
+ func_quote_arg pretty "$libobj"
+ test "X$libobj" != "X$func_quote_arg_result" \
&& $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
&& func_warning "libobj name '$libobj' may not contain shell special characters."
func_dirname_and_basename "$obj" "/" ""
@@ -3486,7 +3813,7 @@ func_mode_compile ()
# On Cygwin there's no "real" PIC flag so we must build both object types
case $host_os in
- cygwin* | mingw* | pw32* | os2* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | os2* | cegcc*)
pic_mode=default
;;
esac
@@ -3539,8 +3866,8 @@ compiler."
func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
srcfile=$func_to_tool_file_result
- func_quote_for_eval "$srcfile"
- qsrcfile=$func_quote_for_eval_result
+ func_quote_arg pretty "$srcfile"
+ qsrcfile=$func_quote_arg_result
# Only build a PIC object if we are building libtool libraries.
if test yes = "$build_libtool_libs"; then
@@ -3695,7 +4022,8 @@ This mode accepts the following additional options:
-prefer-non-pic try to build non-PIC objects only
-shared do not build a '.o' file suitable for static linking
-static only build a '.o' file suitable for static linking
- -Wc,FLAG pass FLAG directly to the compiler
+ -Wc,FLAG
+ -Xcompiler FLAG pass FLAG directly to the compiler
COMPILE-COMMAND is a command to be used in creating a 'standard' object file
from the given SOURCEFILE.
@@ -3801,6 +4129,8 @@ The following components of LINK-COMMAND are treated specially:
-weak LIBNAME declare that the target provides the LIBNAME interface
-Wc,FLAG
-Xcompiler FLAG pass linker-specific FLAG directly to the compiler
+ -Wa,FLAG
+ -Xassembler FLAG pass linker-specific FLAG directly to the assembler
-Wl,FLAG
-Xlinker FLAG pass linker-specific FLAG directly to the linker
-XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
@@ -3877,6 +4207,12 @@ if $opt_help; then
fi
+# If option '--reorder-cache', reorder the shared library cache and exit.
+if $opt_reorder_cache; then
+ func_reorder_shared_lib_cache $shared_lib_dirs
+fi
+
+
# func_mode_execute arg...
func_mode_execute ()
{
@@ -4061,7 +4397,7 @@ func_mode_finish ()
fi
fi
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then
for libdir in $libdirs; do
if test -n "$finish_cmds"; then
# Do each command in the finish commands.
@@ -4086,6 +4422,12 @@ func_mode_finish ()
for libdir in $libdirs; do
$ECHO " $libdir"
done
+ if test "false" = "$opt_finishing"; then
+ echo
+ echo "NOTE: finish_cmds were not executed during testing, so you must"
+ echo "manually run ldconfig to add a given test directory, LIBDIR, to"
+ echo "the search path for generated executables."
+ fi
echo
echo "If you ever happen to want to link against installed libraries"
echo "in a given directory, LIBDIR, you must either use libtool, and"
@@ -4143,8 +4485,8 @@ func_mode_install ()
case $nonopt in *shtool*) :;; *) false;; esac
then
# Aesthetically quote it.
- func_quote_for_eval "$nonopt"
- install_prog="$func_quote_for_eval_result "
+ func_quote_arg pretty "$nonopt"
+ install_prog="$func_quote_arg_result "
arg=$1
shift
else
@@ -4154,8 +4496,8 @@ func_mode_install ()
# The real first argument should be the name of the installation program.
# Aesthetically quote it.
- func_quote_for_eval "$arg"
- func_append install_prog "$func_quote_for_eval_result"
+ func_quote_arg pretty "$arg"
+ func_append install_prog "$func_quote_arg_result"
install_shared_prog=$install_prog
case " $install_prog " in
*[\\\ /]cp\ *) install_cp=: ;;
@@ -4212,12 +4554,12 @@ func_mode_install ()
esac
# Aesthetically quote the argument.
- func_quote_for_eval "$arg"
- func_append install_prog " $func_quote_for_eval_result"
+ func_quote_arg pretty "$arg"
+ func_append install_prog " $func_quote_arg_result"
if test -n "$arg2"; then
- func_quote_for_eval "$arg2"
+ func_quote_arg pretty "$arg2"
fi
- func_append install_shared_prog " $func_quote_for_eval_result"
+ func_append install_shared_prog " $func_quote_arg_result"
done
test -z "$install_prog" && \
@@ -4228,8 +4570,8 @@ func_mode_install ()
if test -n "$install_override_mode" && $no_mode; then
if $install_cp; then :; else
- func_quote_for_eval "$install_override_mode"
- func_append install_shared_prog " -m $func_quote_for_eval_result"
+ func_quote_arg pretty "$install_override_mode"
+ func_append install_shared_prog " -m $func_quote_arg_result"
fi
fi
@@ -4322,8 +4664,15 @@ func_mode_install ()
func_append dir "$objdir"
if test -n "$relink_command"; then
+ # Strip any trailing slash from the destination.
+ func_stripname '' '/' "$libdir"
+ destlibdir=$func_stripname_result
+
+ func_stripname '' '/' "$destdir"
+ s_destdir=$func_stripname_result
+
# Determine the prefix the user has applied to our future dir.
- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+ inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"`
# Don't allow the user to place us outside of our expected
# location b/c this prevents finding dependent libraries that
@@ -4360,7 +4709,7 @@ func_mode_install ()
'exit $?'
tstripme=$stripme
case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
case $realname in
*.dll.a)
tstripme=
@@ -4473,7 +4822,7 @@ func_mode_install ()
# Do a test to see if this is really a libtool program.
case $host in
- *cygwin* | *mingw*)
+ *cygwin* | *mingw* | *windows*)
if func_ltwrapper_executable_p "$file"; then
func_ltwrapper_scriptname "$file"
wrapper=$func_ltwrapper_scriptname_result
@@ -4525,8 +4874,8 @@ func_mode_install ()
relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
$opt_quiet || {
- func_quote_for_expand "$relink_command"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$relink_command"
+ eval "func_echo $func_quote_arg_result"
}
if eval "$relink_command"; then :
else
@@ -4701,7 +5050,7 @@ extern \"C\" {
$RM $export_symbols
eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
;;
@@ -4713,7 +5062,7 @@ extern \"C\" {
eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
;;
@@ -4727,7 +5076,7 @@ extern \"C\" {
func_basename "$dlprefile"
name=$func_basename_result
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
# if an import library, we need to obtain dlname
if func_win32_import_lib_p "$dlprefile"; then
func_tr_sh "$dlprefile"
@@ -4753,8 +5102,16 @@ extern \"C\" {
eval '$ECHO ": $name " >> "$nlist"'
fi
func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
- $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ case $host in
+ i[3456]86-*-mingw32*)
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ ;;
+ *)
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'"
+ ;;
+ esac
}
else # not an import lib
$opt_dry_run || {
@@ -4902,7 +5259,7 @@ static const void *lt_preloaded_setup() {
# Transform the symbol file into the correct name.
symfileobj=$output_objdir/${my_outputname}S.$objext
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
if test -f "$output_objdir/$my_outputname.def"; then
compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
@@ -4978,7 +5335,7 @@ func_win32_libid ()
*ar\ archive*) # could be an import, or static
# Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
- $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+ $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then
case $nm_interface in
"MS dumpbin")
if func_cygming_ms_implib_p "$1" ||
@@ -5245,7 +5602,7 @@ func_extract_archives ()
#
# Emit a libtool wrapper script on stdout.
# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
+# incorporate the script contents within a cygwin/mingw/windows
# wrapper executable. Must ONLY be called from within
# func_mode_link because it depends on a number of variables
# set therein.
@@ -5253,7 +5610,7 @@ func_extract_archives ()
# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
# variable will take. If 'yes', then the emitted script
# will assume that the directory where it is stored is
-# the $objdir directory. This is a cygwin/mingw-specific
+# the $objdir directory. This is a cygwin/mingw/windows-specific
# behavior.
func_emit_wrapper ()
{
@@ -5305,8 +5662,8 @@ else
if test \"\$libtool_execute_magic\" != \"$magic\"; then
file=\"\$0\""
- func_quote "$ECHO"
- qECHO=$func_quote_result
+ func_quote_arg pretty "$ECHO"
+ qECHO=$func_quote_arg_result
$ECHO "\
# A function that is used when there is no print builtin or printf.
@@ -5316,7 +5673,7 @@ func_fallback_echo ()
\$1
_LTECHO_EOF'
}
- ECHO=\"$qECHO\"
+ ECHO=$qECHO
fi
# Very basic option parsing. These options are (a) specific to
@@ -5378,7 +5735,7 @@ func_exec_program_core ()
"
case $host in
# Backslashes separate directories on plain windows
- *-*-mingw | *-*-os2* | *-cegcc*)
+ *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*)
$ECHO "\
if test -n \"\$lt_option_debug\"; then
\$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
@@ -5446,7 +5803,7 @@ func_exec_program ()
file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
done
- # Usually 'no', except on cygwin/mingw when embedded into
+ # Usually 'no', except on cygwin/mingw/windows when embedded into
# the cwrapper.
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
@@ -5578,7 +5935,7 @@ EOF
#endif
#include <stdio.h>
#include <stdlib.h>
-#ifdef _MSC_VER
+#if defined _WIN32 && !defined __GNUC__
# include <direct.h>
# include <process.h>
# include <io.h>
@@ -5603,7 +5960,7 @@ EOF
/* declarations of non-ANSI functions */
#if defined __MINGW32__
# ifdef __STRICT_ANSI__
-int _putenv (const char *);
+_CRTIMP int __cdecl _putenv (const char *);
# endif
#elif defined __CYGWIN__
# ifdef __STRICT_ANSI__
@@ -5801,7 +6158,7 @@ main (int argc, char *argv[])
{
EOF
case $host in
- *mingw* | *cygwin* )
+ *mingw* | *windows* | *cygwin* )
# make stdout use "unix" line endings
echo " setmode(1,_O_BINARY);"
;;
@@ -5820,7 +6177,7 @@ EOF
{
/* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
namespace, but it is not one of the ones we know about and
- have already dealt with, above (inluding dump-script), then
+ have already dealt with, above (including dump-script), then
report an error. Otherwise, targets might begin to believe
they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
namespace. The first time any user complains about this, we'll
@@ -5904,7 +6261,7 @@ EOF
EOF
case $host_os in
- mingw*)
+ mingw* | windows*)
cat <<"EOF"
{
char* p;
@@ -5946,7 +6303,7 @@ EOF
EOF
case $host_os in
- mingw*)
+ mingw* | windows*)
cat <<"EOF"
/* execv doesn't actually work on mingw as expected on unix */
newargz = prepare_spawn (newargz);
@@ -6365,7 +6722,7 @@ lt_update_lib_path (const char *name, const char *value)
EOF
case $host_os in
- mingw*)
+ mingw* | windows*)
cat <<"EOF"
/* Prepares an argument vector before calling spawn().
@@ -6540,7 +6897,7 @@ func_mode_link ()
$debug_cmd
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*)
# It is impossible to link a dll without this setting, and
# we shouldn't force the makefile maintainer to figure out
# what system we are compiling for in order to pass an extra
@@ -6564,6 +6921,7 @@ func_mode_link ()
finalize_command=$nonopt
compile_rpath=
+ compile_rpath_tail=
finalize_rpath=
compile_shlibpath=
finalize_shlibpath=
@@ -6604,10 +6962,12 @@ func_mode_link ()
xrpath=
perm_rpath=
temp_rpath=
+ temp_rpath_tail=
thread_safe=no
vinfo=
vinfo_number=no
weak_libs=
+ rpath_arg=
single_module=$wl-single_module
func_infer_tag $base_compile
@@ -6659,9 +7019,9 @@ func_mode_link ()
while test "$#" -gt 0; do
arg=$1
shift
- func_quote_for_eval "$arg"
- qarg=$func_quote_for_eval_unquoted_result
- func_append libtool_args " $func_quote_for_eval_result"
+ func_quote_arg pretty,unquoted "$arg"
+ qarg=$func_quote_arg_unquoted_result
+ func_append libtool_args " $func_quote_arg_result"
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
@@ -6870,7 +7230,7 @@ func_mode_link ()
case $arg in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
- func_fatal_error "only absolute run-paths are allowed"
+ func_fatal_error "argument to -rpath is not absolute: $arg"
;;
esac
if test rpath = "$prev"; then
@@ -6897,6 +7257,13 @@ func_mode_link ()
prev=
continue
;;
+ xassembler)
+ func_append compiler_flags " -Xassembler $qarg"
+ prev=
+ func_append compile_command " -Xassembler $qarg"
+ func_append finalize_command " -Xassembler $qarg"
+ continue
+ ;;
xcclinker)
func_append linker_flags " $qarg"
func_append compiler_flags " $qarg"
@@ -7039,7 +7406,7 @@ func_mode_link ()
;;
esac
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*)
testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$dir:"*) ;;
@@ -7059,7 +7426,7 @@ func_mode_link ()
-l*)
if test X-lc = "X$arg" || test X-lm = "X$arg"; then
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
# These systems don't actually have a C or math library (as such)
continue
;;
@@ -7067,7 +7434,7 @@ func_mode_link ()
# These systems don't actually have a C library (as such)
test X-lc = "X$arg" && continue
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
# Do not include libc due to us having libc/libc_r.
test X-lc = "X$arg" && continue
;;
@@ -7087,7 +7454,7 @@ func_mode_link ()
esac
elif test X-lc_r = "X$arg"; then
case $host in
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
@@ -7110,16 +7477,29 @@ func_mode_link ()
# Tru64 UNIX uses -model [arg] to determine the layout of C++
# classes, name mangling, and exception handling.
# Darwin uses the -arch flag to determine output architecture.
- -model|-arch|-isysroot|--sysroot)
+ # -q <option> for IBM XL C/C++ compiler.
+ -model|-arch|-isysroot|--sysroot|-q)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
prev=xcompiler
continue
;;
-
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199.
+ -pthread)
+ case $host in
+ *solaris2*) ;;
+ *)
+ case "$new_inherited_linker_flags " in
+ *" $arg "*) ;;
+ * ) func_append new_inherited_linker_flags " $arg" ;;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+ -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
@@ -7152,7 +7532,7 @@ func_mode_link ()
-no-install)
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
# The PATH hackery in wrapper scripts is required on Windows
# and Darwin in order for the loader to find any dlls it needs.
func_warning "'-no-install' is ignored for $host"
@@ -7212,7 +7592,7 @@ func_mode_link ()
dir=$lt_sysroot$func_stripname_result
;;
*)
- func_fatal_error "only absolute run-paths are allowed"
+ func_fatal_error "argument ($arg) to '-R' is not an absolute path: $dir"
;;
esac
case "$xrpath " in
@@ -7269,9 +7649,9 @@ func_mode_link ()
save_ifs=$IFS; IFS=,
for flag in $args; do
IFS=$save_ifs
- func_quote_for_eval "$flag"
- func_append arg " $func_quote_for_eval_result"
- func_append compiler_flags " $func_quote_for_eval_result"
+ func_quote_arg pretty "$flag"
+ func_append arg " $func_quote_arg_result"
+ func_append compiler_flags " $func_quote_arg_result"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
@@ -7285,16 +7665,21 @@ func_mode_link ()
save_ifs=$IFS; IFS=,
for flag in $args; do
IFS=$save_ifs
- func_quote_for_eval "$flag"
- func_append arg " $wl$func_quote_for_eval_result"
- func_append compiler_flags " $wl$func_quote_for_eval_result"
- func_append linker_flags " $func_quote_for_eval_result"
+ func_quote_arg pretty "$flag"
+ func_append arg " $wl$func_quote_arg_result"
+ func_append compiler_flags " $wl$func_quote_arg_result"
+ func_append linker_flags " $func_quote_arg_result"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
+ -Xassembler)
+ prev=xassembler
+ continue
+ ;;
+
-Xcompiler)
prev=xcompiler
continue
@@ -7312,8 +7697,8 @@ func_mode_link ()
# -msg_* for osf cc
-msg_*)
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
;;
# Flags to be passed through unchanged, with rationale:
@@ -7332,14 +7717,31 @@ func_mode_link ()
# -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
# -specs=* GCC specs files
# -stdlib=* select c++ std lib with clang
+ # -fdiagnostics-color* simply affects output
+ # -frecord-gcc-switches used to verify flags were respected
# -fsanitize=* Clang/GCC memory and address sanitizer
+ # -fno-sanitize* Clang/GCC memory and address sanitizer
+ # -shared-libsan Link with shared sanitizer runtimes (Clang)
+ # -static-libsan Link with static sanitizer runtimes (Clang)
+ # -no-canonical-prefixes Do not expand any symbolic links
# -fuse-ld=* Linker select flags for GCC
+ # -static-* direct GCC to link specific libraries statically
+ # -fcilkplus Cilk Plus language extension features for C/C++
+ # -rtlib=* select c runtime lib with clang
+ # --unwindlib=* select unwinder library with clang
+ # -f{file|debug|macro|profile}-prefix-map=* needed for lto linking
+ # -Wa,* Pass flags directly to the assembler
+ # -Werror, -Werror=* Report (specified) warnings as errors
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
- -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
- -specs=*|-fsanitize=*|-fuse-ld=*)
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-no-canonical-prefixes| \
+ -stdlib=*|-rtlib=*|--unwindlib=*| \
+ -specs=*|-fsanitize=*|-fno-sanitize*|-shared-libsan|-static-libsan| \
+ -ffile-prefix-map=*|-fdebug-prefix-map=*|-fmacro-prefix-map=*|-fprofile-prefix-map=*| \
+ -fdiagnostics-color*|-frecord-gcc-switches| \
+ -fuse-ld=*|-static-*|-fcilkplus|-Wa,*|-Werror|-Werror=*)
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
func_append compile_command " $arg"
func_append finalize_command " $arg"
func_append compiler_flags " $arg"
@@ -7360,15 +7762,15 @@ func_mode_link ()
continue
else
# Otherwise treat like 'Some other compiler flag' below
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
fi
;;
# Some other compiler flag.
-* | +*)
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
;;
*.$objext)
@@ -7488,15 +7890,27 @@ func_mode_link ()
*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
;;
esac # arg
# Now actually substitute the argument into the commands.
if test -n "$arg"; then
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
+ if test -n "$rpath_arg"; then
+ func_append finalize_rpath " ${arg##*,}"
+ unset rpath_arg
+ else
+ case $arg in
+ -Wl,-rpath,*)
+ func_append finalize_rpath " ${arg##*,}";;
+ -Wl,-rpath)
+ rpath_arg=1;;
+ *)
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ esac
+ fi
fi
done # argument parsing loop
@@ -7667,7 +8081,7 @@ func_mode_link ()
found=false
case $deplib in
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
if test prog,link = "$linkmode,$pass"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
@@ -7844,18 +8258,15 @@ func_mode_link ()
;;
esac
if $valid_a_lib; then
- echo
- $ECHO "*** Warning: Linking the shared library $output against the"
- $ECHO "*** static library $deplib is not portable!"
+ func_warning "Linking the shared library $output against the static library $deplib is not portable!"
deplibs="$deplib $deplibs"
else
- echo
- $ECHO "*** Warning: Trying to link with static lib archive $deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because the file extensions .$libext of this argument makes me believe"
- echo "*** that it is just a static archive that I should not use here."
+ func_warning "Trying to link with static lib archive $deplib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have"
+ func_warning "because the file extensions .$libext of this argument makes me believe"
+ func_warning "that it is just a static archive that I should not use here."
fi
;;
esac
@@ -8050,7 +8461,7 @@ func_mode_link ()
fi
case $host in
# special handling for platforms with PE-DLLs.
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
# Linker will automatically link against shared library if both
# static and shared are present. Therefore, ensure we extract
# symbols from the import library if a shared library is present
@@ -8150,7 +8561,10 @@ func_mode_link ()
# Make sure the rpath contains only unique directories.
case $temp_rpath: in
*"$absdir:"*) ;;
- *) func_append temp_rpath "$absdir:" ;;
+ *) case $absdir in
+ "$progdir/"*) func_append temp_rpath "$absdir:" ;;
+ *) func_append temp_rpath_tail "$absdir:" ;;
+ esac
esac
fi
@@ -8160,9 +8574,12 @@ func_mode_link ()
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
- case "$compile_rpath " in
+ case "$compile_rpath$compile_rpath_tail " in
*" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
+ *) case $absdir in
+ "$progdir/"*) func_append compile_rpath " $absdir" ;;
+ *) func_append compile_rpath_tail " $absdir" ;;
+ esac
esac
;;
esac
@@ -8193,8 +8610,8 @@ func_mode_link ()
fi
if test -n "$library_names" &&
{ test no = "$use_static_libs" || test -z "$old_library"; }; then
- case $host in
- *cygwin* | *mingw* | *cegcc* | *os2*)
+ case $host_os in
+ cygwin* | mingw* | windows* | cegcc* | os2*)
# No point in relinking DLLs because paths are not encoded
func_append notinst_deplibs " $lib"
need_relink=no
@@ -8220,11 +8637,11 @@ func_mode_link ()
if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
echo
if test prog = "$linkmode"; then
- $ECHO "*** Warning: Linking the executable $output against the loadable module"
+ func_warning "Linking the executable $output against the loadable module"
else
- $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+ func_warning "Linking the shared library $output against the loadable module"
fi
- $ECHO "*** $linklib is not portable!"
+ func_warning "$linklib is not portable!"
fi
if test lib = "$linkmode" &&
test yes = "$hardcode_into_libs"; then
@@ -8234,9 +8651,12 @@ func_mode_link ()
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
- case "$compile_rpath " in
+ case "$compile_rpath$compile_rpath_tail " in
*" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
+ *) case $absdir in
+ "$progdir/"*) func_append compile_rpath " $absdir" ;;
+ *) func_append compile_rpath_tail " $absdir" ;;
+ esac
esac
;;
esac
@@ -8263,8 +8683,8 @@ func_mode_link ()
soname=$dlname
elif test -n "$soname_spec"; then
# bleh windows
- case $host in
- *cygwin* | mingw* | *cegcc* | *os2*)
+ case $host_os in
+ cygwin* | mingw* | windows* | cegcc* | os2*)
func_arith $current - $age
major=$func_arith_result
versuffix=-$major
@@ -8311,6 +8731,7 @@ func_mode_link ()
case $host in
*-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
*-*-sysv4*uw2*) add_dir=-L$dir ;;
+ *-*-emscripten*) add_dir=-L$dir ;;
*-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
*-*-unixware7*) add_dir=-L$dir ;;
*-*-darwin* )
@@ -8319,11 +8740,10 @@ func_mode_link ()
if /usr/bin/file -L $add 2> /dev/null |
$GREP ": [^:]* bundle" >/dev/null; then
if test "X$dlopenmodule" != "X$lib"; then
- $ECHO "*** Warning: lib $linklib is a module, not a shared library"
+ func_warning "lib $linklib is a module, not a shared library"
if test -z "$old_library"; then
- echo
- echo "*** And there doesn't seem to be a static archive available"
- echo "*** The link will probably fail, sorry"
+ func_warning "And there doesn't seem to be a static archive available"
+ func_warning "The link will probably fail, sorry"
else
add=$dir/$old_library
fi
@@ -8406,7 +8826,7 @@ func_mode_link ()
test no = "$hardcode_direct_absolute"; then
add=$libdir/$linklib
elif test yes = "$hardcode_minus_L"; then
- add_dir=-L$libdir
+ add_dir=-L$lt_sysroot$libdir
add=-l$name
elif test yes = "$hardcode_shlibpath_var"; then
case :$finalize_shlibpath: in
@@ -8423,7 +8843,7 @@ func_mode_link ()
fi
else
# We cannot seem to hardcode it, guess we'll fake it.
- add_dir=-L$libdir
+ add_dir=-L$lt_sysroot$libdir
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
@@ -8463,21 +8883,19 @@ func_mode_link ()
# Just print a warning and add the library to dependency_libs so
# that the program can be linked against the static library.
- echo
- $ECHO "*** Warning: This system cannot link to static lib archive $lib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
+ func_warning "This system cannot link to static lib archive $lib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have."
if test yes = "$module"; then
- echo "*** But as you try to build a module library, libtool will still create "
- echo "*** a static module, that should work as long as the dlopening application"
- echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ func_warning "But as you try to build a module library, libtool will still create "
+ func_warning "a static module, that should work as long as the dlopening application"
+ func_warning "is linked with the -dlopen flag to resolve symbols at runtime."
if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** 'nm' from GNU binutils and a full rebuild may help."
+ func_warning "However, this would only work if libtool was able to extract symbol"
+ func_warning "lists from a program, using 'nm' or equivalent, but libtool could"
+ func_warning "not find such a program. So, this module is probably useless."
+ func_warning "'nm' from GNU binutils and a full rebuild may help."
fi
if test no = "$build_old_libs"; then
build_libtool_libs=module
@@ -8600,6 +9018,10 @@ func_mode_link ()
fi # link_all_deplibs != no
fi # linkmode = lib
done # for deplib in $libs
+
+ func_append temp_rpath "$temp_rpath_tail"
+ func_append compile_rpath "$compile_rpath_tail"
+
if test link = "$pass"; then
if test prog = "$linkmode"; then
compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
@@ -8637,42 +9059,46 @@ func_mode_link ()
# Add libraries to $var in reverse order
eval tmp_libs=\"\$$var\"
new_libs=
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken: new_libs="$deplib $new_libs"
for deplib in $tmp_libs; do
- # FIXME: Pedantically, this is the right thing to do, so
- # that some nasty dependency loop isn't accidentally
- # broken:
- #new_libs="$deplib $new_libs"
- # Pragmatically, this seems to cause very few problems in
- # practice:
- case $deplib in
- -L*) new_libs="$deplib $new_libs" ;;
- -R*) ;;
- *)
- # And here is the reason: when a library appears more
- # than once as an explicit dependence of a library, or
- # is implicitly linked in more than once by the
- # compiler, it is considered special, and multiple
- # occurrences thereof are not removed. Compare this
- # with having the same library being listed as a
- # dependency of multiple other libraries: in this case,
- # we know (pedantically, we assume) the library does not
- # need to be listed more than once, so we keep only the
- # last copy. This is not always right, but it is rare
- # enough that we require users that really mean to play
- # such unportable linking tricks to link the library
- # using -Wl,-lname, so that libtool does not consider it
- # for duplicate removal.
- case " $specialdeplibs " in
- *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ if $opt_preserve_dup_deps; then
+ new_libs="$deplib $new_libs"
+ else
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
*)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) new_libs="$deplib $new_libs" ;;
- esac
- ;;
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal. And if not possible for portability
+ # reasons, then --preserve-dup-deps should be used.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
esac
- ;;
- esac
+ fi
done
tmp_libs=
for deplib in $new_libs; do
@@ -8694,7 +9120,7 @@ func_mode_link ()
test CXX = "$tagname" && {
case $host_os in
linux*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*) # Sun C++ 5.9
func_suncc_cstd_abi
@@ -8804,9 +9230,7 @@ func_mode_link ()
if test pass_all != "$deplibs_check_method"; then
func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
- $ECHO "*** objects $objs is not portable!"
+ func_warning "Linking the shared library $output against the non-libtool objects $objs is not portable!"
func_append libobjs " $objs"
fi
fi
@@ -8867,13 +9291,13 @@ func_mode_link ()
#
case $version_type in
# correct linux to gnu/linux during the next big refactor
- darwin|freebsd-elf|linux|osf|windows|none)
+ darwin|freebsd-elf|linux|midnightbsd-elf|osf|qnx|windows|none)
func_arith $number_major + $number_minor
current=$func_arith_result
age=$number_minor
revision=$number_revision
;;
- freebsd-aout|qnx|sunos)
+ freebsd-aout|sco|sunos)
current=$number_major
revision=$number_minor
age=0
@@ -8885,6 +9309,9 @@ func_mode_link ()
revision=$number_minor
lt_irix_increment=no
;;
+ *)
+ func_fatal_configuration "$modename: unknown library version type '$version_type'"
+ ;;
esac
;;
no)
@@ -8958,7 +9385,7 @@ func_mode_link ()
versuffix=.$current.$revision
;;
- freebsd-elf)
+ freebsd-elf | midnightbsd-elf)
func_arith $current - $age
major=.$func_arith_result
versuffix=$major.$age.$revision
@@ -9020,8 +9447,9 @@ func_mode_link ()
;;
qnx)
- major=.$current
- versuffix=.$current
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
;;
sco)
@@ -9174,7 +9602,7 @@ func_mode_link ()
if test yes = "$build_libtool_libs"; then
if test -n "$rpath"; then
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
# these systems don't actually have a c library (as such)!
;;
*-*-rhapsody* | *-*-darwin1.[012])
@@ -9184,7 +9612,7 @@ func_mode_link ()
*-*-netbsd*)
# Don't link with libc until the a.out ld.so is fixed.
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
# Do not include libc due to us having libc/libc_r.
;;
*-*-sco3.2v5* | *-*-sco5v6*)
@@ -9225,108 +9653,6 @@ func_mode_link ()
# implementing what was already the behavior.
newdeplibs=$deplibs
;;
- test_compile)
- # This code stresses the "libraries are programs" paradigm to its
- # limits. Maybe even breaks it. We compile a program, linking it
- # against the deplibs as a proxy for the library. Then we can check
- # whether they linked in statically or dynamically with ldd.
- $opt_dry_run || $RM conftest.c
- cat > conftest.c <<EOF
- int main() { return 0; }
-EOF
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
- ldd_output=`ldd conftest`
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- if test yes = "$allow_libtool_libs_with_static_runtimes"; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=
- ;;
- esac
- fi
- if test -n "$i"; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which I believe you do not have"
- echo "*** because a test_compile did reveal that the linker did not use it for"
- echo "*** its dynamic dependency list that programs get resolved with at runtime."
- fi
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- else
- # Error occurred in the first compile. Let's try to salvage
- # the situation: Compile a separate program for each library.
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
- ldd_output=`ldd conftest`
- if test yes = "$allow_libtool_libs_with_static_runtimes"; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=
- ;;
- esac
- fi
- if test -n "$i"; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because a test_compile did reveal that the linker did not use this one"
- echo "*** as a dynamic dependency that programs can get resolved with at runtime."
- fi
- fi
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
- echo "*** make it link in! You will probably need to install it or some"
- echo "*** library that it depends on before this library will be fully"
- echo "*** functional. Installing it before continuing would be even better."
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- fi
- ;;
file_magic*)
set dummy $deplibs_check_method; shift
file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
@@ -9390,17 +9716,16 @@ EOF
fi
if test -n "$a_deplib"; then
droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
+ func_warning "Linker path does not have real file for library $a_deplib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have"
+ func_warning "because I did check the linker path looking for a file starting"
if test -z "$potlib"; then
- $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+ func_warning "with $libname but no candidates were found. (...for file magic test)"
else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a file magic. Last file checked: $potlib"
+ func_warning "with $libname and none of the candidates passed a file format test"
+ func_warning "using a file magic. Last file checked: $potlib"
fi
fi
;;
@@ -9444,17 +9769,16 @@ EOF
fi
if test -n "$a_deplib"; then
droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
+ func_warning "Linker path does not have real file for library $a_deplib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have"
+ func_warning "because I did check the linker path looking for a file starting"
if test -z "$potlib"; then
- $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+ func_warning "with $libname but no candidates were found. (...for regex pattern test)"
else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a regex pattern. Last file checked: $potlib"
+ func_warning "with $libname and none of the candidates passed a file format test"
+ func_warning "using a regex pattern. Last file checked: $potlib"
fi
fi
;;
@@ -9478,11 +9802,11 @@ EOF
*[!\ \ ]*)
echo
if test none = "$deplibs_check_method"; then
- echo "*** Warning: inter-library dependencies are not supported in this platform."
+ func_warning "Inter-library dependencies are not supported in this platform."
else
- echo "*** Warning: inter-library dependencies are not known to be supported."
+ func_warning "Inter-library dependencies are not known to be supported."
fi
- echo "*** All declared inter-library dependencies are being dropped."
+ func_warning "All declared inter-library dependencies are being dropped."
droppeddeps=yes
;;
esac
@@ -9503,17 +9827,15 @@ EOF
if test yes = "$droppeddeps"; then
if test yes = "$module"; then
- echo
- echo "*** Warning: libtool could not satisfy all declared inter-library"
- $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
- echo "*** a static module, that should work as long as the dlopening"
- echo "*** application is linked with the -dlopen flag."
+ func_warning "libtool could not satisfy all declared inter-library"
+ func_warning "dependencies of module $libname. Therefore, libtool will create"
+ func_warning "a static module, that should work as long as the dlopening"
+ func_warning "application is linked with the -dlopen flag."
if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** 'nm' from GNU binutils and a full rebuild may help."
+ func_warning "However, this would only work if libtool was able to extract symbol"
+ func_warning "lists from a program, using 'nm' or equivalent, but libtool could"
+ func_warning "not find such a program. So, this module is probably useless."
+ func_warning "'nm' from GNU binutils and a full rebuild may help."
fi
if test no = "$build_old_libs"; then
oldlibs=$output_objdir/$libname.$libext
@@ -9688,7 +10010,7 @@ EOF
orig_export_symbols=
case $host_os in
- cygwin* | mingw* | cegcc*)
+ cygwin* | mingw* | windows* | cegcc*)
if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
# exporting using user supplied symfile
func_dll_def_p "$export_symbols" || {
@@ -9886,20 +10208,7 @@ EOF
last_robj=
k=1
- if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
- output=$output_objdir/$output_la.lnkscript
- func_verbose "creating GNU ld script: $output"
- echo 'INPUT (' > $output
- for obj in $save_libobjs
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result" >> $output
- done
- echo ')' >> $output
- func_append delfiles " $output"
- func_to_tool_file "$output"
- output=$func_to_tool_file_result
- elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+ if test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
output=$output_objdir/$output_la.lnk
func_verbose "creating linker input file list: $output"
: > $output
@@ -9918,6 +10227,19 @@ EOF
func_append delfiles " $output"
func_to_tool_file "$output"
output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+ elif test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+ output=$output_objdir/$output_la.lnkscript
+ func_verbose "creating GNU ld script: $output"
+ echo 'INPUT (' > $output
+ for obj in $save_libobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
+ done
+ echo ')' >> $output
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$func_to_tool_file_result
else
if test -n "$save_libobjs"; then
func_verbose "creating reloadable object files..."
@@ -9995,8 +10317,8 @@ EOF
for cmd in $concat_cmds; do
IFS=$save_ifs
$opt_quiet || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$cmd"
+ eval "func_echo $func_quote_arg_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
@@ -10089,8 +10411,8 @@ EOF
eval cmd=\"$cmd\"
IFS=$save_ifs
$opt_quiet || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$cmd"
+ eval "func_echo $func_quote_arg_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
@@ -10358,7 +10680,7 @@ EOF
esac
fi
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*)
testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$libdir:"*) ;;
@@ -10436,7 +10758,7 @@ EOF
# Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
wrappers_required=false
;;
- *cygwin* | *mingw* )
+ *cygwin* | *mingw* | *windows* )
test yes = "$build_libtool_libs" || wrappers_required=false
;;
*)
@@ -10564,12 +10886,13 @@ EOF
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+ func_quote_arg pretty "$var_value"
+ relink_command="$var=$func_quote_arg_result; export $var; $relink_command"
fi
done
- func_quote "(cd `pwd`; $relink_command)"
- relink_command=$func_quote_result
+ func_quote eval cd "`pwd`"
+ func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)"
+ relink_command=$func_quote_arg_unquoted_result
fi
# Only actually do things if not in dry run mode.
@@ -10589,7 +10912,7 @@ EOF
*) exeext= ;;
esac
case $host in
- *cygwin* | *mingw* )
+ *cygwin* | *mingw* | windows* )
func_dirname_and_basename "$output" "" "."
output_name=$func_basename_result
output_path=$func_dirname_result
@@ -10809,14 +11132,15 @@ EOF
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+ func_quote_arg pretty,unquoted "$var_value"
+ relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command"
fi
done
# Quote the link command for shipping.
- relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
- func_quote "$relink_command"
- relink_command=$func_quote_result
+ func_quote eval cd "`pwd`"
+ relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ func_quote_arg pretty,unquoted "$relink_command"
+ relink_command=$func_quote_arg_unquoted_result
if test yes = "$hardcode_automatic"; then
relink_command=
fi
@@ -10922,7 +11246,7 @@ EOF
# tests/bindir.at for full details.
tdlname=$dlname
case $host,$output,$installed,$module,$dlname in
- *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *windows*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
# If a -bindir argument was supplied, place the dll there.
if test -n "$bindir"; then
func_relative_path "$install_libdir" "$bindir"
diff --git a/3rdparty/expat/conftools/missing b/3rdparty/expat/conftools/missing
index 8d0eaad250f..1fe1611f185 100755
--- a/3rdparty/expat/conftools/missing
+++ b/3rdparty/expat/conftools/missing
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
diff --git a/3rdparty/expat/conftools/test-driver b/3rdparty/expat/conftools/test-driver
index 89dba1e075c..be73b80adf9 100755
--- a/3rdparty/expat/conftools/test-driver
+++ b/3rdparty/expat/conftools/test-driver
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Copyright (C) 2011-2021 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -42,11 +42,13 @@ print_usage ()
{
cat <<END
Usage:
- test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
- [--expect-failure={yes|no}] [--color-tests={yes|no}]
- [--enable-hard-errors={yes|no}] [--]
+ test-driver --test-name NAME --log-file PATH --trs-file PATH
+ [--expect-failure {yes|no}] [--color-tests {yes|no}]
+ [--enable-hard-errors {yes|no}] [--]
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+See the GNU Automake documentation for information.
END
}
@@ -103,8 +105,11 @@ trap "st=130; $do_exit" 2
trap "st=141; $do_exit" 13
trap "st=143; $do_exit" 15
-# Test script is run here.
-"$@" >$log_file 2>&1
+# Test script is run here. We create the file first, then append to it,
+# to ameliorate tests themselves also writing to the log file. Our tests
+# don't, but others can (automake bug#35762).
+: >"$log_file"
+"$@" >>"$log_file" 2>&1
estatus=$?
if test $enable_hard_errors = no && test $estatus -eq 99; then
@@ -126,7 +131,7 @@ esac
# know whether the test passed or failed simply by looking at the '.log'
# file, without the need of also peaking into the corresponding '.trs'
# file (automake bug#11814).
-echo "$res $test_name (exit status: $estatus)" >>$log_file
+echo "$res $test_name (exit status: $estatus)" >>"$log_file"
# Report outcome to console.
echo "${col}${res}${std}: $test_name"
diff --git a/3rdparty/expat/doc/Makefile.am b/3rdparty/expat/doc/Makefile.am
index e2f029837a4..3bea96e9aa6 100644
--- a/3rdparty/expat/doc/Makefile.am
+++ b/3rdparty/expat/doc/Makefile.am
@@ -6,7 +6,10 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017 Stephen Groat <stephen@groat.us>
+# Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+# Copyright (c) 2024 Tomas Korbar <tkorbar@redhat.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -30,30 +33,27 @@
.PHONY: dist-hook # not inside conditional to avoid automake warning
-if WITH_DOCBOOK
+if WITH_MANPAGE
dist_man_MANS = xmlwf.1
xmlwf.1: xmlwf.xml
-rm -f $@
- $(DOCBOOK_TO_MAN) $<
+ test "x$(DOCBOOK_TO_MAN)" != x && $(DOCBOOK_TO_MAN) $<
test -f $@ || mv XMLWF.1 $@
-else
+endif
+
+if !WITH_DISTRIBUTABLE_MANPAGE
dist-hook:
@echo 'ERROR: Configure with --with-docbook for "make dist".' 1>&2
@false
endif
-# https://www.gnu.org/software/automake/manual/automake.html#What-Gets-Cleaned
-.PHONY: clean-local
-clean-local: clean-local-check
-
-.PHONY: clean-local-check
-clean-local-check:
- $(RM) xmlwf.1
+if !WITH_PREBUILT_MANPAGE
+CLEANFILES = xmlwf.1
+endif
EXTRA_DIST = \
- expat.png \
+ ok.min.css \
reference.html \
style.css \
- valid-xhtml10.png \
xmlwf.xml
diff --git a/3rdparty/expat/doc/Makefile.in b/3rdparty/expat/doc/Makefile.in
index 94550becf39..72deb0565d9 100644
--- a/3rdparty/expat/doc/Makefile.in
+++ b/3rdparty/expat/doc/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,10 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017 Stephen Groat <stephen@groat.us>
+# Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+# Copyright (c) 2024 Tomas Korbar <tkorbar@redhat.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -130,6 +133,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
@@ -207,8 +212,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -224,10 +231,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -237,6 +254,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -245,6 +264,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -266,9 +286,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -323,18 +346,18 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-@WITH_DOCBOOK_TRUE@dist_man_MANS = xmlwf.1
+@WITH_MANPAGE_TRUE@dist_man_MANS = xmlwf.1
+@WITH_PREBUILT_MANPAGE_FALSE@CLEANFILES = xmlwf.1
EXTRA_DIST = \
- expat.png \
+ ok.min.css \
reference.html \
style.css \
- valid-xhtml10.png \
xmlwf.xml
all: all-am
.SUFFIXES:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -358,9 +381,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
@@ -418,8 +441,7 @@ ctags CTAGS:
cscope cscopelist:
-@WITH_DOCBOOK_TRUE@dist-hook:
-
+@WITH_DISTRIBUTABLE_MANPAGE_TRUE@dist-hook:
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
@@ -485,6 +507,7 @@ install-strip:
mostlyclean-generic:
clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -495,7 +518,7 @@ maintainer-clean-generic:
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
@@ -564,38 +587,31 @@ uninstall-man: uninstall-man1
.MAKE: install-am install-strip
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- clean-local cscopelist-am ctags-am dist-hook distclean \
- distclean-generic distclean-libtool distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-man1 install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
- uninstall-am uninstall-man uninstall-man1
+ cscopelist-am ctags-am dist-hook distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-man1 install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags-am uninstall uninstall-am uninstall-man \
+ uninstall-man1
.PRECIOUS: Makefile
.PHONY: dist-hook # not inside conditional to avoid automake warning
-@WITH_DOCBOOK_TRUE@xmlwf.1: xmlwf.xml
-@WITH_DOCBOOK_TRUE@ -rm -f $@
-@WITH_DOCBOOK_TRUE@ $(DOCBOOK_TO_MAN) $<
-@WITH_DOCBOOK_TRUE@ test -f $@ || mv XMLWF.1 $@
-@WITH_DOCBOOK_FALSE@dist-hook:
-@WITH_DOCBOOK_FALSE@ @echo 'ERROR: Configure with --with-docbook for "make dist".' 1>&2
-@WITH_DOCBOOK_FALSE@ @false
-
-# https://www.gnu.org/software/automake/manual/automake.html#What-Gets-Cleaned
-.PHONY: clean-local
-clean-local: clean-local-check
-
-.PHONY: clean-local-check
-clean-local-check:
- $(RM) xmlwf.1
+@WITH_MANPAGE_TRUE@xmlwf.1: xmlwf.xml
+@WITH_MANPAGE_TRUE@ -rm -f $@
+@WITH_MANPAGE_TRUE@ test "x$(DOCBOOK_TO_MAN)" != x && $(DOCBOOK_TO_MAN) $<
+@WITH_MANPAGE_TRUE@ test -f $@ || mv XMLWF.1 $@
+
+@WITH_DISTRIBUTABLE_MANPAGE_FALSE@dist-hook:
+@WITH_DISTRIBUTABLE_MANPAGE_FALSE@ @echo 'ERROR: Configure with --with-docbook for "make dist".' 1>&2
+@WITH_DISTRIBUTABLE_MANPAGE_FALSE@ @false
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/3rdparty/expat/doc/expat.png b/3rdparty/expat/doc/expat.png
deleted file mode 100644
index 7d7c3dbaebc..00000000000
--- a/3rdparty/expat/doc/expat.png
+++ /dev/null
Binary files differ
diff --git a/3rdparty/expat/doc/ok.min.css b/3rdparty/expat/doc/ok.min.css
new file mode 100644
index 00000000000..d324fabb287
--- /dev/null
+++ b/3rdparty/expat/doc/ok.min.css
@@ -0,0 +1,2 @@
+/*! OK.css v1.2.0 | MIT License | github.com/andrewh0/okcss */@import url("https://rsms.me/inter/inter.css");
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}:root{--ok-sans:"Inter",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue","Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--ok-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Ubuntu Mono","Liberation Mono","Courier New",Courier,monospace;--ok-fw-0:400;--ok-fw-1:600;--ok-fw-2:700;--ok-fw-3:700;--ok-fs-0:2.5rem;--ok-fs-1:2rem;--ok-fs-2:1.5rem;--ok-fs-3:1.25rem;--ok-fs-4:1rem;--ok-fs-5:0.75rem;--ok-br:0.25rem;--ok-s-0:0;--ok-s-1:0.25rem;--ok-s-2:0.5rem;--ok-s-3:1rem;--ok-s-4:1.5rem;--ok-s-5:2rem;--ok-s-6:2.5rem;--ok-lh-body:1.5;--ok-lh-heading:1.25;--ok-t-hl:#ffcf30;--ok-accent-0:#3e67fa;--ok-accent-1:#4788ff;--ok-tc-accent:#3173de;--ok-tc-code:#c23a30;--ok-tc-0:#000;--ok-tc-1:#747474;--ok-tc-2:#848484;--ok-bg-0:#fff;--ok-bg-1:#f0f0f0;--ok-bg-2:#ccc;--ok-b-0:1px solid #cbcbcb;--ok-b-1:1px solid #848484;--ok-down-0:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23747474'/%3E%3C/svg%3E");--ok-down-1:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23848484'/%3E%3C/svg%3E")}@media (prefers-color-scheme:dark){:root{--ok-tc-accent:#5c9aff;--ok-tc-code:#ed5853;--ok-tc-0:#fff;--ok-tc-1:#ababab;--ok-tc-2:#929292;--ok-bg-0:#000;--ok-bg-1:#212121;--ok-bg-2:#3e3e3e;--ok-b-0:1px solid #747474;--ok-b-1:1px solid #929292;--ok-down-0:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23ababab'/%3E%3C/svg%3E");--ok-down-1:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23929292'/%3E%3C/svg%3E")}}*,:after,:before{box-sizing:border-box}*{margin:0;padding:0}html{font-family:var(--ok-sans);line-sizing:normal;line-height:var(--ok-lh-body);font-weight:var(--ok-fw-0);color:var(--ok-tc-0);background-color:var(--ok-bg-0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;text-rendering:optimizeLegibility;scroll-behavior:smooth}@supports (font-variation-settings:normal){html{font-family:Inter var,var(--ok-sans)}}button,input,optgroup,select,textarea{font-family:inherit;line-height:var(--ok-lh-body)}[role=button],button{cursor:pointer}audio,canvas,embed,iframe,img,input,object,select,svg,textarea,video{display:block}img,video{max-width:100%;height:auto}body{padding:var(--ok-s-3);max-width:80ch;margin:auto}article{padding-bottom:var(--ok-s-6)}h1{font-size:var(--ok-fs-0);margin:0}h2{font-size:var(--ok-fs-1)}h3{font-size:var(--ok-fs-2)}h4{font-size:var(--ok-fs-3)}h5{font-size:var(--ok-fs-4)}h6{font-size:var(--ok-fs-5);text-transform:uppercase;font-weight:var(--ok-fw-1)}h1,h2,h3,h4,h5,h6{line-height:var(--ok-lh-heading);font-weight:var(--ok-fw-3);margin-top:var(--ok-s-6);margin-bottom:var(--ok-s-3)}h1+*,h2+*,h3+*,h4+*,h5+*,h6+*,hr+*{margin-top:0}p{font-size:var(--ok-fs-4)}small{font-size:var(--ok-fs-5)}b,dt,strong{font-weight:var(--ok-fw-2)}address,article,aside,audio,blockquote,button,canvas,dd,details,dialog,div,dl,embed,fieldset,figcaption,figure,footer,form,header,hgroup,hr,iframe,img,input,main,nav,object,ol,p,pre,section,select,summary,svg,table,textarea,ul,video{margin-bottom:var(--ok-s-4)}address:last-child,article:last-child,aside:last-child,blockquote:last-child,dd:last-child,details:last-child,dialog:last-child,div:last-child,dl:last-child,dt:last-child,fieldset:last-child,figcaption:last-child,figure:last-child,footer:last-child,form:last-child,h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,header:last-child,hgroup:last-child,hr:last-child,input[type=checkbox],input[type=radio],main:last-child,nav:last-child,ol:last-child,p:last-child,pre:last-child,section:last-child,table:last-child,ul:last-child{margin-bottom:0}fieldset{padding:var(--ok-s-3);border:var(--ok-b-0);border-radius:var(--ok-br)}legend{font-weight:var(--ok-fw-1);text-transform:uppercase;font-size:var(--ok-fs-5)}input,select{padding:var(--ok-s-2);background:var(--ok-bg-0);border:var(--ok-b-0);border-radius:var(--ok-br);color:var(--ok-tc-0);min-width:25ch}input:disabled,select:disabled,textarea:disabled{color:var(--ok-tc-2)}input::placeholder,textarea::placeholder{color:var(--ok-tc-2)}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:var(--ok-tc-2)}input::-moz-placeholder,textarea::-moz-placeholder{color:var(--ok-tc-2)}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--ok-tc-2)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--ok-tc-2)}input::-webkit-clear-button,input::-webkit-inner-spin-button,input::-webkit-search-cancel-button,input::-webkit-search-results-button{display:none}input::-ms-clear,input::-ms-reveal{display:none}input:disabled,textarea:disabled{background-color:var(--ok-bg-1)}input[type=search]{-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=file]{max-width:300px}input[type=number]{-moz-appearance:textfield}input[type=checkbox],input[type=radio]{display:inline;min-width:auto}input[type=color]{height:2.5rem}input[type=date],input[type=datetime-local],input[type=month],input[type=time],input[type=week]{height:2.5rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;position:relative}input[type=date]:before,input[type=datetime-local]:before,input[type=month]:before,input[type=time]:before,input[type=week]:before{position:absolute;right:0;top:0;background-image:var(--ok-down-0);background-repeat:no-repeat;background-position:right .2em top 50%;background-size:2em auto;width:2.5rem;height:calc(2.5rem - 2px);content:""}input[type=date]:disabled:before,input[type=datetime-local]:disabled:before,input[type=month]:disabled:before,input[type=time]:disabled:before,input[type=week]:disabled:before{background-image:var(--ok-down-1)}input::-webkit-calendar-picker-indicator{position:absolute;top:0;right:0;background-color:transparent;cursor:pointer;padding:0;width:2.5rem;height:calc(2.5rem - 2px);content:"";opacity:0}input[type=range]{overflow:visible;line-height:inherit;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;outline:none;cursor:pointer;padding:0;vertical-align:middle;border:none;min-height:2rem;background-color:transparent}input[type=range]::-webkit-slider-runnable-track{cursor:pointer;-webkit-appearance:none;border-radius:var(--ok-br);border:var(--ok-b-0);background-color:var(--ok-bg-1);background-image:linear-gradient(var(--ok-bg-1),var(--ok-bg-1));width:100%;height:.5rem;color:transparent;box-sizing:border-box;position:relative}input[type=range]::-moz-range-track{cursor:pointer;-moz-appearance:none;border-radius:var(--ok-br);border:var(--ok-b-0);background-color:var(--ok-bg-1);background-image:linear-gradient(var(--ok-bg-1),var(--ok-bg-1));width:100%;height:.5rem;color:transparent;box-sizing:border-box}input[type=range]::-ms-track{cursor:pointer;-ms-appearance:none;border-radius:var(--ok-br);border:var(--ok-b-0);background-color:var(--ok-bg-1);background-image:linear-gradient(var(--ok-bg-1),var(--ok-bg-1));width:100%;height:.5rem;color:transparent;box-sizing:border-box}input[type=range]::-ms-fill-lower{background:transparent}input[type=range]::-webkit-slider-thumb{cursor:pointer;-webkit-appearance:none;border-radius:50%;background-color:var(--ok-accent-0);width:1.5rem;height:1.5rem;margin-top:calc(-.5rem - 1px)}input[type=range]::-moz-range-thumb{cursor:pointer;-moz-appearance:none;border:none;border-radius:50%;background-color:var(--ok-accent-0);width:1.5rem;height:1.5rem}input[type=range]::-ms-thumb{cursor:pointer;-ms-appearance:none;border-radius:50%;background-color:var(--ok-accent-0);width:1.5rem;height:1.5rem;transform:translateY(.25rem)}input[type=range]:focus:not(:disabled)::-webkit-slider-thumb{background-color:var(--ok-accent-1)}input[type=range]:focus:not(:disabled)::-moz-range-thumb{background-color:var(--ok-accent-1)}input[type=range]:focus:not(:disabled)::-ms-thumb{background-color:var(--ok-accent-1)}input[type=range]:disabled{cursor:default}input[type=range]:disabled::-webkit-slider-runnable-track{cursor:default}input[type=range]:disabled::-moz-range-track{cursor:default}input[type=range]:disabled::-ms-track{cursor:default}input[type=range]:disabled::-webkit-slider-thumb{background-color:var(--ok-bg-2);cursor:default}input[type=range]:disabled::-moz-range-thumb{background-color:var(--ok-bg-2);cursor:default}input[type=range]:disabled::-ms-thumb{background-color:var(--ok-bg-2);cursor:default}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:var(--ok-b-0);border-radius:var(--ok-br);background-color:var(--ok-bg-0);min-height:2.5rem;color:var(--ok-tc-0)}select:not([multiple]){background-image:var(--ok-down-0);background-repeat:no-repeat,repeat;background-position:right .2em top 50%;background-size:2em auto;padding-right:2.5em;height:2.5rem}select::-ms-expand{display:none}select:not([multiple]):disabled{background-image:var(--ok-down-1);background-color:var(--ok-bg-1);cursor:default}select[multiple]{border-radius:var(--ok-br)}select[multiple]:disabled{background-color:var(--ok-bg-1)}select[multiple] option{color:var(--ok-t-)}select[multiple]:disabled option{color:var(--ok-tc-2)}textarea{padding:var(--ok-s-2);resize:vertical;background:var(--ok-bg-0);border:var(--ok-b-0);border-radius:var(--ok-br);color:var(--ok-tc-0);min-height:calc(2.5rem - 2px);min-width:25ch}button,input[type=button],input[type=reset],input[type=submit]{display:inline-block;background-color:var(--ok-accent-0);border-radius:var(--ok-br);color:#fff;font-weight:var(--ok-fw-1);height:2.5rem;border:none;padding:var(--ok-s-2) var(--ok-s-3);white-space:nowrap;min-width:auto}input::-webkit-file-upload-button{display:inline-block;background-color:var(--ok-accent-0);border-radius:var(--ok-br);color:#fff;font-weight:var(--ok-fw-1);height:2.5rem;border:none;padding:var(--ok-s-2) var(--ok-s-3);white-space:nowrap}input:disabled::-webkit-file-upload-button{cursor:default;opacity:.5}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer}input:not(:disabled)::-webkit-file-upload-button{cursor:pointer}button:disabled,input[type=button]:disabled,input[type=reset]:disabled,input[type=submit]:disabled{cursor:default;opacity:.5;background-color:var(--ok-accent-0)}button:focus:not(:disabled),input[type=button]:focus:not(:disabled),input[type=reset]:focus:not(:disabled),input[type=submit]:focus:not(:disabled){background-color:var(--ok-accent-1)}input:not(:disabled):focus::-webkit-file-upload-button{background-color:var(--ok-accent-1)}table{border-collapse:collapse;display:table;margin-left:auto;margin-right:auto;white-space:nowrap}tfoot,thead{border:var(--ok-b-0)}thead{position:-webkit-sticky;position:sticky;top:0}tfoot tr,thead tr{background-color:var(--ok-bg-1);font-size:var(--ok-fs-5);text-transform:uppercase;color:var(--ok-tc-0)}td,th{border:var(--ok-b-0) 0;text-align:left;padding:.5rem}td{white-space:normal;max-width:20ch}tr{border:var(--ok-b-0)}table caption{font-size:var(--ok-fs-4);font-weight:var(--ok-fw-3);padding:.5rem}code,samp{padding:.2em .4em;color:var(--ok-tc-code)}code,pre,samp{font-family:var(--ok-mono);font-size:87.5%;line-height:var(--ok-lh-body);background-color:var(--ok-bg-1);border-radius:var(--ok-br);text-transform:none}pre{padding:var(--ok-s-3);white-space:pre;overflow-x:auto}pre,var{color:var(--ok-tc-0)}var{font-family:var(--ok-mono);font-style:normal}code pre,pre code{background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}code pre{display:inline}kbd{background-color:var(--ok-bg-1);border:var(--ok-b-0);border-radius:var(--ok-br);border-bottom:2px solid var(--ok-bg-2);padding:var(--ok-s-1);font-family:var(--ok-sans);color:var(--ok-tc-0)}a{text-decoration:none;font-weight:var(--ok-fw-1)}a,a:visited,a code,a mark,a samp{color:var(--ok-tc-accent)}ol,ul{padding-left:var(--ok-s-5)}nav ul{text-decoration:none;padding-left:0}nav ul li{display:inline;margin-right:1em}li p{margin-bottom:0}li,li p+p{margin-top:.5em}audio,img,video{margin-left:auto;margin-right:auto}img{border-radius:var(--ok-br)}figure>img:not(:last-child){margin-bottom:var(--ok-s-1)}figure>figcaption{text-align:center}figcaption,time{font-size:var(--ok-fs-5);color:var(--ok-tc-1)}mark{padding:.2em .4em;background:var(--ok-t-hl);color:#000;border-radius:var(--ok-br)}iframe{border:var(--ok-b-0);border-radius:var(--ok-br);width:100%}hr{border:none;border-bottom:var(--ok-b-0)}footer{font-size:var(--ok-fs-5)}blockquote,footer{color:var(--ok-tc-1)}blockquote{position:relative;margin-left:0;margin-right:0;padding-left:var(--ok-s-5)}blockquote:before{position:absolute;height:100%;content:"";width:4px;left:0;border-radius:var(--ok-br);background-color:var(--ok-bg-1)}dd{padding-left:var(--ok-s-5)}abbr{cursor:help}@media (hover:hover){a:hover{text-decoration:underline}input:hover:not(:disabled):not(:focus):not([type=submit]):not([type=button]):not([type=reset]):not([type=range]),select:hover:not(:disabled):not(:focus),textarea:hover:not(:disabled):not(:focus){border:var(--ok-b-1)}input[type=range]:hover:not(:disabled)::-webkit-slider-runnable-track{border:var(--ok-b-1)}input[type=range]:hover:not(:disabled)::-moz-range-track{border:var(--ok-b-1)}input[type=range]:hover:not(:disabled)::-ms-track{border:var(--ok-b-1)}select:not([multiple]):not(:disabled):hover{cursor:pointer}button:hover:not(:disabled),input[type=button]:hover:not(:disabled),input[type=reset]:hover:not(:disabled),input[type=submit]:hover:not(:disabled){background-color:var(--ok-accent-1)}input:not(:disabled):hover::-webkit-file-upload-button{background-color:var(--ok-accent-1)}} \ No newline at end of file
diff --git a/3rdparty/expat/doc/reference.html b/3rdparty/expat/doc/reference.html
index 1e4780ed70c..2b3bd39580a 100644
--- a/3rdparty/expat/doc/reference.html
+++ b/3rdparty/expat/doc/reference.html
@@ -3,26 +3,58 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
-<!-- Copyright 1999,2000 Clark Cooper <coopercc@netheaven.com>
- All rights reserved.
- This is free software. You may distribute or modify according to
- the terms of the MIT/X License -->
+<!--
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2000-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2017-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Jakub Wilk <jwilk@jwilk.net>
+ Copyright (c) 2021 Tomas Korbar <tkorbar@redhat.com>
+ Copyright (c) 2021 Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
+ Copyright (c) 2022 Thijs Schreijer <thijs@thijsschreijer.nl>
+ Copyright (c) 2023 Hanno Böck <hanno@gentoo.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+-->
<title>Expat XML Parser</title>
<meta name="author" content="Clark Cooper, coopercc@netheaven.com" />
<meta http-equiv="Content-Style-Type" content="text/css" />
+ <link href="ok.min.css" rel="stylesheet" type="text/css" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
- <table cellspacing="0" cellpadding="0" width="100%">
- <tr>
- <td class="corner"><img src="expat.png" alt="(Expat logo)" /></td>
- <td class="banner"><h1>The Expat XML Parser</h1></td>
- </tr>
- <tr>
- <td class="releaseno">Release 2.0.1</td>
- <td></td>
- </tr>
- </table>
+ <div>
+ <h1>
+ The Expat XML Parser
+ <small>Release 2.7.1</small>
+ </h1>
+ </div>
<div class="content">
<p>Expat is a library, written in C, for parsing XML documents. It's
@@ -38,11 +70,11 @@ Working Group at W3C that produced the XML specification.</p>
<p>This is free software, licensed under the <a
href="../COPYING">MIT/X Consortium license</a>. You may download it
-from <a href="http://www.libexpat.org/">the Expat home page</a>.
+from <a href="https://libexpat.github.io/">the Expat home page</a>.
</p>
<p>The bulk of this document was originally commissioned as an article
-by <a href="http://www.xml.com/">XML.com</a>. They graciously allowed
+by <a href="https://www.xml.com/">XML.com</a>. They graciously allowed
Clark Cooper to retain copyright and to distribute it with Expat.
This version has been substantially extended to include documentation
on features which have been added since the original article was
@@ -120,6 +152,14 @@ interface.</p>
<li><a href="#XML_GetInputContext">XML_GetInputContext</a></li>
</ul>
</li>
+ <li>
+ <a href="#attack-protection">Attack Protection</a>
+ <ul>
+ <li><a href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></li>
+ <li><a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">XML_SetBillionLaughsAttackProtectionActivationThreshold</a></li>
+ <li><a href="#XML_SetReparseDeferralEnabled">XML_SetReparseDeferralEnabled</a></li>
+ </ul>
+ </li>
<li><a href="#miscellaneous">Miscellaneous Functions</a>
<ul>
<li><a href="#XML_SetUserData">XML_SetUserData</a></li>
@@ -268,7 +308,7 @@ shoveling the document to the parser so that it can do its work.</p>
<p>The Expat distribution comes as a compressed (with GNU gzip) tar
file. You may download the latest version from <a href=
-"http://sourceforge.net/projects/expat/" >Source Forge</a>. After
+"https://sourceforge.net/projects/expat/" >Source Forge</a>. After
unpacking this, cd into the directory. Then follow either the Win32
directions or Unix directions below.</p>
@@ -279,7 +319,7 @@ directions in the next section. Otherwise if you have Microsoft's
Developer Studio installed,
you can use CMake to generate a <code>.sln</code> file, e.g.
<code>
-cmake -G"Visual Studio 15 2017" -DCMAKE_BUILD_TYPE=RelWithDebInfo .
+cmake -G"Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=RelWithDebInfo .
</code>, and build Expat using <code>msbuild /m expat.sln</code> after.</p>
<p>Alternatively, you may download the Win32 binary package that
@@ -316,39 +356,67 @@ library and header would get installed in
<h3>Configuring Expat Using the Pre-Processor</h3>
<p>Expat's feature set can be configured using a small number of
-pre-processor definitions. The definition of this symbols does not
-affect the set of entry points for Expat, only the behavior of the API
-and the definition of character types in the case of
-<code>XML_UNICODE_WCHAR_T</code>. The symbols are:</p>
+pre-processor definitions. The symbols are:</p>
<dl class="cpp-symbols">
-<dt>XML_DTD</dt>
+<dt><a name="XML_GE">XML_GE</a></dt>
+<dd>
+Added in Expat 2.6.0.
+Include support for
+<a href="https://www.w3.org/TR/2006/REC-xml-20060816/#sec-physical-struct">general entities</a>
+(syntax <code>&amp;e1;</code> to reference and
+syntax <code>&lt;!ENTITY e1 'value1'&gt;</code> (an internal general entity) or
+<code>&lt;!ENTITY e2 SYSTEM 'file2'&gt;</code> (an external general entity) to declare).
+With <code>XML_GE</code> enabled, general entities will be replaced by their declared replacement text;
+for this to work for <em>external</em> general entities, in addition an
+<code><a href="#XML_SetExternalEntityRefHandler">XML_ExternalEntityRefHandler</a></code> must be set using
+<code><a href="#XML_SetExternalEntityRefHandler">XML_SetExternalEntityRefHandler</a></code>.
+Also, enabling <code>XML_GE</code> makes
+the functions <code><a href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">
+XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></code> and <code>
+<a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">
+XML_SetBillionLaughsAttackProtectionActivationThreshold</a></code> available.
+<br/>
+With <code>XML_GE</code> disabled, Expat has a smaller memory footprint and can be faster, but will
+not load external general entities and will replace all general entities
+(except the <a href="https://www.w3.org/TR/2006/REC-xml-20060816/#sec-predefined-ent">predefined five</a>:
+<code>amp</code>, <code>apos</code>, <code>gt</code>, <code>lt</code>, <code>quot</code>)
+with a self-reference:
+for example, referencing an entity <code>e1</code> via <code>&amp;e1;</code> will be replaced
+by text <code>&amp;e1;</code>.
+</dd>
+
+<dt><a name="XML_DTD">XML_DTD</a></dt>
<dd>Include support for using and reporting DTD-based content. If
this is defined, default attribute values from an external DTD subset
are reported and attribute value normalization occurs based on the
type of attributes defined in the external subset. Without
this, Expat has a smaller memory footprint and can be faster, but will
-not load external entities or process conditional sections. This does
-not affect the set of functions available in the API.</dd>
-
-<dt>XML_NS</dt>
+not load external parameter entities or process conditional sections. If defined, makes
+the functions <code><a
+href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">
+XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></code> and <code>
+<a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">
+XML_SetBillionLaughsAttackProtectionActivationThreshold</a></code> available.</dd>
+
+<dt><a name="XML_NS">XML_NS</a></dt>
<dd>When defined, support for the <cite><a href=
-"http://www.w3.org/TR/REC-xml-names/" >Namespaces in XML</a></cite>
+"https://www.w3.org/TR/REC-xml-names/" >Namespaces in XML</a></cite>
specification is included.</dd>
-<dt>XML_UNICODE</dt>
+<dt><a name="XML_UNICODE">XML_UNICODE</a></dt>
<dd>When defined, character data reported to the application is
encoded in UTF-16 using wide characters of the type
<code>XML_Char</code>. This is implied if
<code>XML_UNICODE_WCHAR_T</code> is defined.</dd>
-<dt>XML_UNICODE_WCHAR_T</dt>
+<dt><a name="XML_UNICODE_WCHAR_T">XML_UNICODE_WCHAR_T</a></dt>
<dd>If defined, causes the <code>XML_Char</code> character type to be
defined using the <code>wchar_t</code> type; otherwise, <code>unsigned
short</code> is used. Defining this implies
<code>XML_UNICODE</code>.</dd>
-<dt>XML_LARGE_SIZE</dt>
+<dt><a name="XML_LARGE_SIZE">XML_LARGE_SIZE</a></dt>
<dd>If defined, causes the <code>XML_Size</code> and <code>XML_Index</code>
integer types to be at least 64 bits in size. This is intended to support
processing of very large input streams, where the return values of
@@ -358,23 +426,23 @@ processing of very large input streams, where the return values of
could overflow. It may not be supported by all compilers, and is turned
off by default.</dd>
-<dt>XML_CONTEXT_BYTES</dt>
+<dt><a name="XML_CONTEXT_BYTES">XML_CONTEXT_BYTES</a></dt>
<dd>The number of input bytes of markup context which the parser will
ensure are available for reporting via <code><a href=
"#XML_GetInputContext" >XML_GetInputContext</a></code>. This is
-normally set to 1024, and must be set to a positive integer. If this
-is not defined, the input context will not be available and <code><a
+normally set to 1024, and must be set to a positive integer to enable.
+If this is set to zero, the input context will not be available and <code><a
href= "#XML_GetInputContext" >XML_GetInputContext</a></code> will
-always report NULL. Without this, Expat has a smaller memory
+always report <code>NULL</code>. Without this, Expat has a smaller memory
footprint and can be faster.</dd>
-<dt>XML_STATIC</dt>
+<dt><a name="XML_STATIC">XML_STATIC</a></dt>
<dd>On Windows, this should be set if Expat is going to be linked
statically with the code that calls it; this is required to get all
the right MSVC magic annotations correct. This is ignored on other
platforms.</dd>
-<dt>XML_ATTR_INFO</dt>
+<dt><a name="XML_ATTR_INFO">XML_ATTR_INFO</a></dt>
<dd>If defined, makes the additional function <code><a href=
"#XML_GetAttributeInfo" >XML_GetAttributeInfo</a></code> available
for reporting attribute byte offsets.</dd>
@@ -628,8 +696,9 @@ function. The StartNamespaceDeclHandler is called prior to the start
tag handler and the EndNamespaceDeclHandler is called after the
corresponding end tag that ends the namespace's scope. The namespace
start handler gets passed the prefix and URI for the namespace. For a
-default namespace declaration (xmlns='...'), the prefix will be null.
-The URI will be null for the case where the default namespace is being
+default namespace declaration (xmlns='...'), the prefix will be
+<code>NULL</code>.
+The URI will be <code>NULL</code> for the case where the default namespace is being
unset. The namespace end handler just gets the prefix for the closing
scope.</p>
@@ -758,7 +827,7 @@ has already been passed into the parser. Applications for this
include</p>
<ul>
- <li>Supporting the <a href= "http://www.w3.org/TR/xinclude/"
+ <li>Supporting the <a href= "https://www.w3.org/TR/xinclude/"
>XInclude</a> specification.</li>
<li>Delaying further processing until additional information is
@@ -900,24 +969,30 @@ whether the parse can be resumed in the future.</p>
<h3><a name="creation">Parser Creation</a></h3>
-<pre class="fcndec" id="XML_ParserCreate">
+<h4 id="XML_ParserCreate">XML_ParserCreate</h4>
+<pre class="fcndec">
XML_Parser XMLCALL
XML_ParserCreate(const XML_Char *encoding);
</pre>
<div class="fcndef">
-Construct a new parser. If encoding is non-null, it specifies a
+<p>
+Construct a new parser. If encoding is non-<code>NULL</code>, it specifies a
character encoding to use for the document. This overrides the document
encoding declaration. There are four built-in encodings:
+</p>
<ul>
<li>US-ASCII</li>
<li>UTF-8</li>
<li>UTF-16</li>
<li>ISO-8859-1</li>
</ul>
+<p>
Any other value will invoke a call to the UnknownEncodingHandler.
+</p>
</div>
-<pre class="fcndec" id="XML_ParserCreateNS">
+<h4 id="XML_ParserCreateNS">XML_ParserCreateNS</h4>
+<pre class="fcndec">
XML_Parser XMLCALL
XML_ParserCreateNS(const XML_Char *encoding,
XML_Char sep);
@@ -936,7 +1011,16 @@ the local part will be concatenated without any separator - this is intended
to support RDF processors. It is a programming error to use the null separator
with <a href= "#XML_SetReturnNSTriplet">namespace triplets</a>.</div>
-<pre class="fcndec" id="XML_ParserCreate_MM">
+<p><strong>Note:</strong>
+Expat does not validate namespace URIs (beyond encoding)
+against RFC 3986 today (and is not required to do so with regard to
+the XML 1.0 namespaces specification) but it may start doing that
+in future releases. Before that, an application using Expat must
+be ready to receive namespace URIs containing non-URI characters.
+</p>
+
+<h4 id="XML_ParserCreate_MM">XML_ParserCreate_MM</h4>
+<pre class="fcndec">
XML_Parser XMLCALL
XML_ParserCreate_MM(const XML_Char *encoding,
const XML_Memory_Handling_Suite *ms,
@@ -951,14 +1035,15 @@ typedef struct {
</pre>
<div class="fcndef">
<p>Construct a new parser using the suite of memory handling functions
-specified in <code>ms</code>. If <code>ms</code> is NULL, then use the
+specified in <code>ms</code>. If <code>ms</code> is <code>NULL</code>, then use the
standard set of memory management functions. If <code>sep</code> is
-non NULL, then namespace processing is enabled in the created parser
+non-<code>NULL</code>, then namespace processing is enabled in the created parser
and the character pointed at by sep is used as the separator between
the namespace URI and the local part of the name.</p>
</div>
-<pre class="fcndec" id="XML_ExternalEntityParserCreate">
+<h4 id="XML_ExternalEntityParserCreate">XML_ExternalEntityParserCreate</h4>
+<pre class="fcndec">
XML_Parser XMLCALL
XML_ExternalEntityParserCreate(XML_Parser p,
const XML_Char *context,
@@ -974,7 +1059,8 @@ changing functions on this parser (unless you want it to act
differently than the parent parser).
</div>
-<pre class="fcndec" id="XML_ParserFree">
+<h4 id="XML_ParserFree">XML_ParserFree</h4>
+<pre class="fcndec">
void XMLCALL
XML_ParserFree(XML_Parser p);
</pre>
@@ -983,7 +1069,8 @@ Free memory used by the parser. Your application is responsible for
freeing any memory associated with <a href="#userdata">user data</a>.
</div>
-<pre class="fcndec" id="XML_ParserReset">
+<h4 id="XML_ParserReset">XML_ParserReset</h4>
+<pre class="fcndec">
XML_Bool XMLCALL
XML_ParserReset(XML_Parser p,
const XML_Char *encoding);
@@ -1014,7 +1101,7 @@ if they apply to the parser created by
<code><a href= "#XML_ExternalEntityParserCreate"
>XML_ExternalEntityParserCreate</a></code>.</p>
-<p>Note: the <code>len</code> argument passed to these functions
+<p>Note: The <code>len</code> argument passed to these functions
should be considerably less than the maximum value for an integer,
as it could create an integer overflow situation if the added
lengths of a buffer and the unprocessed portion of the previous buffer
@@ -1022,7 +1109,13 @@ exceed the maximum integer value. Input data at the end of a buffer
will remain unprocessed if it is part of an XML token for which the
end is not part of that buffer.</p>
-<pre class="fcndec" id="XML_Parse">
+<p><a name="isFinal"></a>The application <em>must</em> make a concluding
+<code><a href="#XML_Parse">XML_Parse</a></code> or
+<code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code> call
+with <code>isFinal</code> set to <code>XML_TRUE</code>.</p>
+
+<h4 id="XML_Parse">XML_Parse</h4>
+<pre class="fcndec">
enum XML_Status XMLCALL
XML_Parse(XML_Parser p,
const char *s,
@@ -1036,42 +1129,86 @@ enum XML_Status {
};
</pre>
<div class="fcndef">
+<p>
Parse some more of the document. The string <code>s</code> is a buffer
containing part (or perhaps all) of the document. The number of bytes of s
that are part of the document is indicated by <code>len</code>. This means
-that <code>s</code> doesn't have to be null terminated. It also means that
+that <code>s</code> doesn't have to be null-terminated. It also means that
if <code>len</code> is larger than the number of bytes in the block of
-memory that <code>s</code> points at, then a memory fault is likely. The
+memory that <code>s</code> points at, then a memory fault is likely.
+Negative values for <code>len</code> are rejected since Expat 2.2.1.
+The
<code>isFinal</code> parameter informs the parser that this is the last
piece of the document. Frequently, the last piece is empty (i.e.
<code>len</code> is zero.)
+</p>
+
+<p>
If a parse error occurred, it returns <code>XML_STATUS_ERROR</code>.
Otherwise it returns <code>XML_STATUS_OK</code> value.
+Note that regardless of the return value, there is no guarantee that all
+provided input has been parsed; only after <a href="#isFinal">the
+concluding call</a> will all handler callbacks and parsing errors have
+happened.
+</p>
+
+<p>
+Simplified, <code>XML_Parse</code> can be considered a convenience wrapper
+that is pairing calls
+to <code><a href="#XML_GetBuffer">XML_GetBuffer</a></code>
+and <code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code>
+(when Expat is built with macro <code>XML_CONTEXT_BYTES</code>
+defined to a positive value, which is both common and default).
+<code>XML_Parse</code> is then functionally equivalent to calling
+<code><a href="#XML_GetBuffer">XML_GetBuffer</a></code>,
+<code>memcpy</code>, and
+<code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code>.
+</p>
+
+<p>
+To avoid double copying of the input, direct use of functions
+<code><a href="#XML_GetBuffer">XML_GetBuffer</a></code> and
+<code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code> is advised
+for most production use, e.g.
+if you're using <code>read</code> or similar functionality to fill your
+buffers, fill directly into the buffer from
+<code><a href="#XML_GetBuffer">XML_GetBuffer</a></code>,
+then parse with <code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code>.
+</p>
</div>
-<pre class="fcndec" id="XML_ParseBuffer">
+<h4 id="XML_ParseBuffer">XML_ParseBuffer</h4>
+<pre class="fcndec">
enum XML_Status XMLCALL
XML_ParseBuffer(XML_Parser p,
int len,
int isFinal);
</pre>
<div class="fcndef">
+<p>
This is just like <code><a href= "#XML_Parse" >XML_Parse</a></code>,
except in this case Expat provides the buffer. By obtaining the
buffer from Expat with the <code><a href= "#XML_GetBuffer"
>XML_GetBuffer</a></code> function, the application can avoid double
copying of the input.
+</p>
+
+<p>
+Negative values for <code>len</code> are rejected since Expat 2.6.3.
+</p>
</div>
-<pre class="fcndec" id="XML_GetBuffer">
+<h4 id="XML_GetBuffer">XML_GetBuffer</h4>
+<pre class="fcndec">
void * XMLCALL
XML_GetBuffer(XML_Parser p,
int len);
</pre>
<div class="fcndef">
Obtain a buffer of size <code>len</code> to read a piece of the document
-into. A NULL value is returned if Expat can't allocate enough memory for
-this buffer. This has to be called prior to every call to
+into. A <code>NULL</code> value is returned if Expat can't allocate enough memory for
+this buffer. A <code>NULL</code> value may also be returned if <code>len</code> is zero.
+This has to be called prior to every call to
<code><a href= "#XML_ParseBuffer" >XML_ParseBuffer</a></code>. A
typical use would look like this:
@@ -1098,7 +1235,8 @@ for (;;) {
</pre>
</div>
-<pre class="fcndec" id="XML_StopParser">
+<h4 id="XML_StopParser">XML_StopParser</h4>
+<pre class="fcndec">
enum XML_Status XMLCALL
XML_StopParser(XML_Parser p,
XML_Bool resumable);
@@ -1111,7 +1249,7 @@ XML_StopParser(XML_Parser p,
call-back handler, except when aborting (when <code>resumable</code>
is <code>XML_FALSE</code>) an already suspended parser. Some
call-backs may still follow because they would otherwise get
-lost, including
+lost, including</p>
<ul>
<li> the end element handler for empty elements when stopped in the
start element handler,</li>
@@ -1120,7 +1258,7 @@ lost, including
<li> the character data handler when stopped in the character data handler
while making multiple call-backs on a contiguous chunk of characters,</li>
</ul>
-and possibly others.</p>
+<p>and possibly others.</p>
<p>This can be called from most handlers, including DTD related
call-backs, except when parsing an external parameter entity and
@@ -1129,6 +1267,11 @@ call-backs, except when parsing an external parameter entity and
<code>XML_STATUS_ERROR</code> otherwise. The possible error codes
are:</p>
<dl>
+ <dt><code>XML_ERROR_NOT_STARTED</code></dt>
+ <dd>
+ when stopping or suspending a parser before it has started,
+ added in Expat 2.6.4.
+ </dd>
<dt><code>XML_ERROR_SUSPENDED</code></dt>
<dd>when suspending an already suspended parser.</dd>
<dt><code>XML_ERROR_FINISHED</code></dt>
@@ -1166,7 +1309,8 @@ implementation of that handler to call <code><a href=
<p>New in Expat 1.95.8.</p>
</div>
-<pre class="fcndec" id="XML_ResumeParser">
+<h4 id="XML_ResumeParser">XML_ResumeParser</h4>
+<pre class="fcndec">
enum XML_Status XMLCALL
XML_ResumeParser(XML_Parser p);
</pre>
@@ -1191,7 +1335,8 @@ appropriate moment.</p>
<p>New in Expat 1.95.8.</p>
</div>
-<pre class="fcndec" id="XML_GetParsingStatus">
+<h4 id="XML_GetParsingStatus">XML_GetParsingStatus</h4>
+<pre class="fcndec">
void XMLCALL
XML_GetParsingStatus(XML_Parser p,
XML_ParsingStatus *status);
@@ -1213,7 +1358,7 @@ typedef struct {
<p>Returns status of parser with respect to being initialized,
parsing, finished, or suspended, and whether the final buffer is being
processed. The <code>status</code> parameter <em>must not</em> be
-NULL.</p>
+<code>NULL</code>.</p>
<p>New in Expat 1.95.8.</p>
</div>
@@ -1228,7 +1373,7 @@ to ignore all text not descended from a <code>para</code> element. One
way it could do this is to set the character handler when a para start tag
is seen, and unset it for the corresponding end tag.</p>
-<p>A handler may be <em>unset</em> by providing a NULL pointer to the
+<p>A handler may be <em>unset</em> by providing a <code>NULL</code> pointer to the
appropriate handler setter. None of the handler setting functions have
a return value.</p>
@@ -1240,7 +1385,8 @@ Note that you'll receive them in this form independent of the original
encoding of the document.</p>
<div class="handler">
-<pre class="setter" id="XML_SetStartElementHandler">
+<h4 id="XML_SetStartElementHandler">XML_SetStartElementHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetStartElementHandler(XML_Parser p,
XML_StartElementHandler start);
@@ -1255,13 +1401,14 @@ typedef void
handler as a pointer to a vector of char pointers. Each attribute seen in
a start (or empty) tag occupies 2 consecutive places in this vector: the
attribute name followed by the attribute value. These pairs are terminated
-by a null pointer.</p>
+by a <code>NULL</code> pointer.</p>
<p>Note that an empty tag generates a call to both start and end handlers
(in that order).</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetEndElementHandler">
+<h4 id="XML_SetEndElementHandler">XML_SetEndElementHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetEndElementHandler(XML_Parser p,
XML_EndElementHandler);
@@ -1276,7 +1423,8 @@ generates a call to both start and end handlers.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetElementHandler">
+<h4 id="XML_SetElementHandler">XML_SetElementHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetElementHandler(XML_Parser p,
XML_StartElementHandler start,
@@ -1286,7 +1434,8 @@ XML_SetElementHandler(XML_Parser p,
</div>
<div class="handler">
-<pre class="setter" id="XML_SetCharacterDataHandler">
+<h4 id="XML_SetCharacterDataHandler">XML_SetCharacterDataHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetCharacterDataHandler(XML_Parser p,
XML_CharacterDataHandler charhndl)
@@ -1302,14 +1451,15 @@ is <em>NOT null-terminated</em>. You have to use the length argument
to deal with the end of the string. A single block of contiguous text
free of markup may still result in a sequence of calls to this handler.
In other words, if you're searching for a pattern in the text, it may
-be split across calls to this handler. Note: Setting this handler to NULL
+be split across calls to this handler. Note: Setting this handler to <code>NULL</code>
may <em>NOT immediately</em> terminate call-backs if the parser is currently
processing such a single block of contiguous markup-free text, as the parser
will continue calling back until the end of the block is reached.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetProcessingInstructionHandler">
+<h4 id="XML_SetProcessingInstructionHandler">XML_SetProcessingInstructionHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetProcessingInstructionHandler(XML_Parser p,
XML_ProcessingInstructionHandler proc)
@@ -1327,7 +1477,8 @@ it after skipping all whitespace after the initial word.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetCommentHandler">
+<h4 id="XML_SetCommentHandler">XML_SetCommentHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetCommentHandler(XML_Parser p,
XML_CommentHandler cmnt)
@@ -1342,7 +1493,8 @@ delimiters.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetStartCdataSectionHandler">
+<h4 id="XML_SetStartCdataSectionHandler">XML_SetStartCdataSectionHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetStartCdataSectionHandler(XML_Parser p,
XML_StartCdataSectionHandler start);
@@ -1355,7 +1507,8 @@ typedef void
</div>
<div class="handler">
-<pre class="setter" id="XML_SetEndCdataSectionHandler">
+<h4 id="XML_SetEndCdataSectionHandler">XML_SetEndCdataSectionHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetEndCdataSectionHandler(XML_Parser p,
XML_EndCdataSectionHandler end);
@@ -1368,7 +1521,8 @@ typedef void
</div>
<div class="handler">
-<pre class="setter" id="XML_SetCdataSectionHandler">
+<h4 id="XML_SetCdataSectionHandler">XML_SetCdataSectionHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetCdataSectionHandler(XML_Parser p,
XML_StartCdataSectionHandler start,
@@ -1378,7 +1532,8 @@ XML_SetCdataSectionHandler(XML_Parser p,
</div>
<div class="handler">
-<pre class="setter" id="XML_SetDefaultHandler">
+<h4 id="XML_SetDefaultHandler">XML_SetDefaultHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetDefaultHandler(XML_Parser p,
XML_DefaultHandler hndl)
@@ -1409,7 +1564,8 @@ href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetDefaultHandlerExpand">
+<h4 id="XML_SetDefaultHandlerExpand">XML_SetDefaultHandlerExpand</h4>
+<pre class="setter">
void XMLCALL
XML_SetDefaultHandlerExpand(XML_Parser p,
XML_DefaultHandler hndl)
@@ -1429,7 +1585,8 @@ href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetExternalEntityRefHandler">
+<h4 id="XML_SetExternalEntityRefHandler">XML_SetExternalEntityRefHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetExternalEntityRefHandler(XML_Parser p,
XML_ExternalEntityRefHandler hndl)
@@ -1452,16 +1609,16 @@ the format expected by the <code>context</code> argument to <code><a
href="#XML_ExternalEntityParserCreate"
>XML_ExternalEntityParserCreate</a></code>. <code>code</code> is
valid only until the handler returns, so if the referenced entity is
-to be parsed later, it must be copied. <code>context</code> is NULL
+to be parsed later, it must be copied. <code>context</code> is <code>NULL</code>
only when the entity is a parameter entity, which is how one can
differentiate between general and parameter entities.</p>
<p>The <code>base</code> parameter is the base to use for relative
system identifiers. It is set by <code><a
-href="#XML_SetBase">XML_SetBase</a></code> and may be NULL. The
+href="#XML_SetBase">XML_SetBase</a></code> and may be <code>NULL</code>. The
<code>publicId</code> parameter is the public id given in the entity
-declaration and may be NULL. <code>systemId</code> is the system
-identifier specified in the entity declaration and is never NULL.</p>
+declaration and may be <code>NULL</code>. <code>systemId</code> is the system
+identifier specified in the entity declaration and is never <code>NULL</code>.</p>
<p>There are a couple of ways in which this handler differs from
others. First, this handler returns a status indicator (an
@@ -1482,17 +1639,18 @@ parser, the body of the external entity can be recursively parsed.</p>
information into global or static variables.</p>
</div>
-<pre class="fcndec" id="XML_SetExternalEntityRefHandlerArg">
+<h4 id="XML_SetExternalEntityRefHandlerArg">XML_SetExternalEntityRefHandlerArg</h4>
+<pre class="fcndec">
void XMLCALL
XML_SetExternalEntityRefHandlerArg(XML_Parser p,
void *arg)
</pre>
<div class="fcndef">
<p>Set the argument passed to the ExternalEntityRefHandler. If
-<code>arg</code> is not NULL, it is the new value passed to the
+<code>arg</code> is not <code>NULL</code>, it is the new value passed to the
handler set using <code><a href="#XML_SetExternalEntityRefHandler"
>XML_SetExternalEntityRefHandler</a></code>; if <code>arg</code> is
-NULL, the argument passed to the handler function will be the parser
+<code>NULL</code>, the argument passed to the handler function will be the parser
object itself.</p>
<p><strong>Note:</strong>
@@ -1508,7 +1666,8 @@ properly.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetSkippedEntityHandler">
+<h4 id="XML_SetSkippedEntityHandler">XML_SetSkippedEntityHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetSkippedEntityHandler(XML_Parser p,
XML_SkippedEntityHandler handler)
@@ -1528,14 +1687,15 @@ typedef void
has been called.</li>
</ol>
<p>The <code>is_parameter_entity</code> argument will be non-zero for
-a parameter entity and zero for a general entity.</p> <p>Note: skipped
+a parameter entity and zero for a general entity.</p> <p>Note: Skipped
parameter entities in declarations and skipped general entities in
attribute values cannot be reported, because the event would be out of
sync with the reporting of the declarations or attribute values</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetUnknownEncodingHandler">
+<h4 id="XML_SetUnknownEncodingHandler">XML_SetUnknownEncodingHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetUnknownEncodingHandler(XML_Parser p,
XML_UnknownEncodingHandler enchandler,
@@ -1573,18 +1733,19 @@ value is -1, then that byte is invalid as the initial byte in a sequence.
If the value is -n, where n is an integer &gt; 1, then n is the number of
bytes in the sequence and the actual conversion is accomplished by a
call to the function pointed at by convert. This function may return -1
-if the sequence itself is invalid. The convert pointer may be null if
+if the sequence itself is invalid. The convert pointer may be <code>NULL</code> if
there are only single byte codes. The data parameter passed to the convert
function is the data pointer from <code>XML_Encoding</code>. The
string s is <em>NOT</em> null-terminated and points at the sequence of
bytes to be converted.</p>
<p>The function pointed at by <code>release</code> is called by the
-parser when it is finished with the encoding. It may be NULL.</p>
+parser when it is finished with the encoding. It may be <code>NULL</code>.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetStartNamespaceDeclHandler">
+<h4 id="XML_SetStartNamespaceDeclHandler">XML_SetStartNamespaceDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetStartNamespaceDeclHandler(XML_Parser p,
XML_StartNamespaceDeclHandler start);
@@ -1602,7 +1763,8 @@ in that start tag.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetEndNamespaceDeclHandler">
+<h4 id="XML_SetEndNamespaceDeclHandler">XML_SetEndNamespaceDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetEndNamespaceDeclHandler(XML_Parser p,
XML_EndNamespaceDeclHandler end);
@@ -1619,7 +1781,8 @@ namespace was declared.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetNamespaceDeclHandler">
+<h4 id="XML_SetNamespaceDeclHandler">XML_SetNamespaceDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetNamespaceDeclHandler(XML_Parser p,
XML_StartNamespaceDeclHandler start,
@@ -1629,7 +1792,8 @@ XML_SetNamespaceDeclHandler(XML_Parser p,
</div>
<div class="handler">
-<pre class="setter" id="XML_SetXmlDeclHandler">
+<h4 id="XML_SetXmlDeclHandler">XML_SetXmlDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetXmlDeclHandler(XML_Parser p,
XML_XmlDeclHandler xmldecl);
@@ -1643,8 +1807,8 @@ typedef void
</pre>
<p>Sets a handler that is called for XML declarations and also for
text declarations discovered in external entities. The way to
-distinguish is that the <code>version</code> parameter will be NULL
-for text declarations. The <code>encoding</code> parameter may be NULL
+distinguish is that the <code>version</code> parameter will be <code>NULL</code>
+for text declarations. The <code>encoding</code> parameter may be <code>NULL</code>
for an XML declaration. The <code>standalone</code> argument will
contain -1, 0, or 1 indicating respectively that there was no
standalone parameter in the declaration, that it was given as no, or
@@ -1652,7 +1816,8 @@ that it was given as yes.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetStartDoctypeDeclHandler">
+<h4 id="XML_SetStartDoctypeDeclHandler">XML_SetStartDoctypeDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetStartDoctypeDeclHandler(XML_Parser p,
XML_StartDoctypeDeclHandler start);
@@ -1667,12 +1832,13 @@ typedef void
</pre>
<p>Set a handler that is called at the start of a DOCTYPE declaration,
before any external or internal subset is parsed. Both <code>sysid</code>
-and <code>pubid</code> may be NULL. The <code>has_internal_subset</code>
+and <code>pubid</code> may be <code>NULL</code>. The <code>has_internal_subset</code>
will be non-zero if the DOCTYPE declaration has an internal subset.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetEndDoctypeDeclHandler">
+<h4 id="XML_SetEndDoctypeDeclHandler">XML_SetEndDoctypeDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetEndDoctypeDeclHandler(XML_Parser p,
XML_EndDoctypeDeclHandler end);
@@ -1686,7 +1852,8 @@ after parsing any external subset.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetDoctypeDeclHandler">
+<h4 id="XML_SetDoctypeDeclHandler">XML_SetDoctypeDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetDoctypeDeclHandler(XML_Parser p,
XML_StartDoctypeDeclHandler start,
@@ -1696,7 +1863,8 @@ XML_SetDoctypeDeclHandler(XML_Parser p,
</div>
<div class="handler">
-<pre class="setter" id="XML_SetElementDeclHandler">
+<h4 id="XML_SetElementDeclHandler">XML_SetElementDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetElementDeclHandler(XML_Parser p,
XML_ElementDeclHandler eldecl);
@@ -1736,16 +1904,17 @@ struct XML_cp {
</pre>
<p>Sets a handler for element declarations in a DTD. The handler gets
called with the name of the element in the declaration and a pointer
-to a structure that contains the element model. It is the
-application's responsibility to free this data structure using
-<code><a href="#XML_FreeContentModel"
->XML_FreeContentModel</a></code>.</p>
+to a structure that contains the element model. It's the user code's
+responsibility to free model when finished with it. See <code>
+<a href="#XML_FreeContentModel">XML_FreeContentModel</a></code>.
+There is no need to free the model from the handler, it can be kept
+around and freed at a later stage.</p>
<p>The <code>model</code> argument is the root of a tree of
<code>XML_Content</code> nodes. If <code>type</code> equals
<code>XML_CTYPE_EMPTY</code> or <code>XML_CTYPE_ANY</code>, then
<code>quant</code> will be <code>XML_CQUANT_NONE</code>, and the other
-fields will be zero or NULL. If <code>type</code> is
+fields will be zero or <code>NULL</code>. If <code>type</code> is
<code>XML_CTYPE_MIXED</code>, then <code>quant</code> will be
<code>XML_CQUANT_NONE</code> or <code>XML_CQUANT_REP</code> and
<code>numchildren</code> will contain the number of elements that are
@@ -1757,7 +1926,7 @@ XML_CTYPE_NAME with no quantification. Only the root node can be type
<p>For type <code>XML_CTYPE_NAME</code>, the <code>name</code> field
points to the name and the <code>numchildren</code> and
-<code>children</code> fields will be zero and NULL. The
+<code>children</code> fields will be zero and <code>NULL</code>. The
<code>quant</code> field will indicate any quantifiers placed on the
name.</p>
@@ -1768,7 +1937,8 @@ or sequence and <code>children</code> points to the nodes.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetAttlistDeclHandler">
+<h4 id="XML_SetAttlistDeclHandler">XML_SetAttlistDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetAttlistDeclHandler(XML_Parser p,
XML_AttlistDeclHandler attdecl);
@@ -1792,16 +1962,17 @@ is in the <code>attname</code> parameter. The attribute type is in the
type in the declaration with whitespace removed.</p>
<p>The <code>dflt</code> parameter holds the default value. It will be
-NULL in the case of "#IMPLIED" or "#REQUIRED" attributes. You can
+<code>NULL</code> in the case of "#IMPLIED" or "#REQUIRED" attributes. You can
distinguish these two cases by checking the <code>isrequired</code>
parameter, which will be true in the case of "#REQUIRED" attributes.
Attributes which are "#FIXED" will have also have a true
-<code>isrequired</code>, but they will have the non-NULL fixed value
+<code>isrequired</code>, but they will have the non-<code>NULL</code> fixed value
in the <code>dflt</code> parameter.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetEntityDeclHandler">
+<h4 id="XML_SetEntityDeclHandler">XML_SetEntityDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetEntityDeclHandler(XML_Parser p,
XML_EntityDeclHandler handler);
@@ -1823,19 +1994,20 @@ The <code>is_parameter_entity</code> argument will be non-zero in the
case of parameter entities and zero otherwise.</p>
<p>For internal entities (<code>&lt;!ENTITY foo "bar"&gt;</code>),
-<code>value</code> will be non-NULL and <code>systemId</code>,
-<code>publicId</code>, and <code>notationName</code> will all be NULL.
-The value string is <em>not</em> NULL terminated; the length is
+<code>value</code> will be non-<code>NULL</code> and <code>systemId</code>,
+<code>publicId</code>, and <code>notationName</code> will all be <code>NULL</code>.
+The value string is <em>not</em> null-terminated; the length is
provided in the <code>value_length</code> parameter. Do not use
<code>value_length</code> to test for internal entities, since it is
legal to have zero-length values. Instead check for whether or not
-<code>value</code> is NULL.</p> <p>The <code>notationName</code>
-argument will have a non-NULL value only for unparsed entity
+<code>value</code> is <code>NULL</code>.</p> <p>The <code>notationName</code>
+argument will have a non-<code>NULL</code> value only for unparsed entity
declarations.</p>
</div>
<div class="handler">
-<pre class="setter" id="XML_SetUnparsedEntityDeclHandler">
+<h4 id="XML_SetUnparsedEntityDeclHandler">XML_SetUnparsedEntityDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetUnparsedEntityDeclHandler(XML_Parser p,
XML_UnparsedEntityDeclHandler h)
@@ -1861,7 +2033,8 @@ compatibility. Use instead <a href= "#XML_SetEntityDeclHandler"
</div>
<div class="handler">
-<pre class="setter" id="XML_SetNotationDeclHandler">
+<h4 id="XML_SetNotationDeclHandler">XML_SetNotationDeclHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetNotationDeclHandler(XML_Parser p,
XML_NotationDeclHandler h)
@@ -1878,7 +2051,8 @@ typedef void
</div>
<div class="handler">
-<pre class="setter" id="XML_SetNotStandaloneHandler">
+<h4 id="XML_SetNotStandaloneHandler">XML_SetNotStandaloneHandler</h4>
+<pre class="setter">
void XMLCALL
XML_SetNotStandaloneHandler(XML_Parser p,
XML_NotStandaloneHandler h)
@@ -1913,7 +2087,8 @@ events.</p>
DTD. In other words, they usually return bogus information when
called from within a DTD declaration handler.</p>
-<pre class="fcndec" id="XML_GetErrorCode">
+<h4 id="XML_GetErrorCode">XML_GetErrorCode</h4>
+<pre class="fcndec">
enum XML_Error XMLCALL
XML_GetErrorCode(XML_Parser p);
</pre>
@@ -1921,7 +2096,8 @@ XML_GetErrorCode(XML_Parser p);
Return what type of error has occurred.
</div>
-<pre class="fcndec" id="XML_ErrorString">
+<h4 id="XML_ErrorString">XML_ErrorString</h4>
+<pre class="fcndec">
const XML_LChar * XMLCALL
XML_ErrorString(enum XML_Error code);
</pre>
@@ -1931,7 +2107,8 @@ The code should be one of the enums that can be returned from
<code><a href= "#XML_GetErrorCode" >XML_GetErrorCode</a></code>.
</div>
-<pre class="fcndec" id="XML_GetCurrentByteIndex">
+<h4 id="XML_GetCurrentByteIndex">XML_GetCurrentByteIndex</h4>
+<pre class="fcndec">
XML_Index XMLCALL
XML_GetCurrentByteIndex(XML_Parser p);
</pre>
@@ -1942,7 +2119,8 @@ the values returned by <code><a href= "#XML_GetCurrentLineNumber"
"#XML_GetCurrentColumnNumber" >XML_GetCurrentColumnNumber</a></code>.
</div>
-<pre class="fcndec" id="XML_GetCurrentLineNumber">
+<h4 id="XML_GetCurrentLineNumber">XML_GetCurrentLineNumber</h4>
+<pre class="fcndec">
XML_Size XMLCALL
XML_GetCurrentLineNumber(XML_Parser p);
</pre>
@@ -1951,7 +2129,8 @@ Return the line number of the position. The first line is reported as
<code>1</code>.
</div>
-<pre class="fcndec" id="XML_GetCurrentColumnNumber">
+<h4 id="XML_GetCurrentColumnNumber">XML_GetCurrentColumnNumber</h4>
+<pre class="fcndec">
XML_Size XMLCALL
XML_GetCurrentColumnNumber(XML_Parser p);
</pre>
@@ -1960,7 +2139,8 @@ Return the offset, from the beginning of the current line, of
the position.
</div>
-<pre class="fcndec" id="XML_GetCurrentByteCount">
+<h4 id="XML_GetCurrentByteCount">XML_GetCurrentByteCount</h4>
+<pre class="fcndec">
int XMLCALL
XML_GetCurrentByteCount(XML_Parser p);
</pre>
@@ -1972,7 +2152,8 @@ be used to distinguish empty-element tags from empty elements using
separate start and end tags).
</div>
-<pre class="fcndec" id="XML_GetInputContext">
+<h4 id="XML_GetInputContext">XML_GetInputContext</h4>
+<pre class="fcndec">
const char * XMLCALL
XML_GetInputContext(XML_Parser p,
int *offset,
@@ -1994,8 +2175,117 @@ untranslated bytes of the input.</p>
triggering a call spans over a very large amount of input, the actual
parse position may be before the beginning of the buffer.</p>
-<p>If <code>XML_CONTEXT_BYTES</code> is not defined, this will always
-return NULL.</p>
+<p>If <code>XML_CONTEXT_BYTES</code> is zero, this will always
+return <code>NULL</code>.</p>
+</div>
+
+<h3><a name="attack-protection">Attack Protection</a><a name="billion-laughs"></a></h3>
+
+<h4 id="XML_SetBillionLaughsAttackProtectionMaximumAmplification">XML_SetBillionLaughsAttackProtectionMaximumAmplification</h4>
+<pre class="fcndec">
+/* Added in Expat 2.4.0. */
+XML_Bool XMLCALL
+XML_SetBillionLaughsAttackProtectionMaximumAmplification(XML_Parser p,
+ float maximumAmplificationFactor);
+</pre>
+<div class="fcndef">
+ <p>
+ Sets the maximum tolerated amplification factor
+ for protection against
+ <a href="https://en.wikipedia.org/wiki/Billion_laughs_attack">billion laughs attacks</a>
+ (default: <code>100.0</code>)
+ of parser <code>p</code> to <code>maximumAmplificationFactor</code>, and
+ returns <code>XML_TRUE</code> upon success and <code>XML_FALSE</code> upon error.
+ </p>
+
+ The amplification factor is calculated as ..
+ <pre>
+ amplification := (direct + indirect) / direct
+ </pre>
+ .. while parsing, whereas
+ <code>direct</code> is the number of bytes read from the primary document in parsing and
+ <code>indirect</code> is the number of bytes added by expanding entities and reading of external DTD files, combined.
+
+ <p>For a call to <code>XML_SetBillionLaughsAttackProtectionMaximumAmplification</code> to succeed:</p>
+ <ul>
+ <li>parser <code>p</code> must be a non-<code>NULL</code> root parser (without any parent parsers) and</li>
+ <li><code>maximumAmplificationFactor</code> must be non-<code>NaN</code> and greater than or equal to <code>1.0</code>.</li>
+ </ul>
+
+ <p>
+ <strong>Note:</strong>
+ If you ever need to increase this value for non-attack payload,
+ please <a href="https://github.com/libexpat/libexpat/issues">file a bug report</a>.
+ </p>
+
+ <p>
+ <strong>Note:</strong>
+ Peak amplifications
+ of factor 15,000 for the entire payload and
+ of factor 30,000 in the middle of parsing
+ have been observed with small benign files in practice.
+
+ So if you do reduce the maximum allowed amplification,
+ please make sure that the activation threshold is still big enough
+ to not end up with undesired false positives (i.e. benign files being rejected).
+ </p>
+</div>
+
+<h4 id="XML_SetBillionLaughsAttackProtectionActivationThreshold">XML_SetBillionLaughsAttackProtectionActivationThreshold</h4>
+<pre class="fcndec">
+/* Added in Expat 2.4.0. */
+XML_Bool XMLCALL
+XML_SetBillionLaughsAttackProtectionActivationThreshold(XML_Parser p,
+ unsigned long long activationThresholdBytes);
+</pre>
+<div class="fcndef">
+ <p>
+ Sets number of output bytes (including amplification from entity expansion and reading DTD files)
+ needed to activate protection against
+ <a href="https://en.wikipedia.org/wiki/Billion_laughs_attack">billion laughs attacks</a>
+ (default: <code>8 MiB</code>)
+ of parser <code>p</code> to <code>activationThresholdBytes</code>, and
+ returns <code>XML_TRUE</code> upon success and <code>XML_FALSE</code> upon error.
+ </p>
+
+ <p>For a call to <code>XML_SetBillionLaughsAttackProtectionActivationThreshold</code> to succeed:</p>
+ <ul>
+ <li>parser <code>p</code> must be a non-<code>NULL</code> root parser (without any parent parsers).</li>
+ </ul>
+
+ <p>
+ <strong>Note:</strong>
+ If you ever need to increase this value for non-attack payload,
+ please <a href="https://github.com/libexpat/libexpat/issues">file a bug report</a>.
+ </p>
+
+ <p>
+ <strong>Note:</strong>
+ Activation thresholds below 4 MiB are known to break support for
+ <a href="https://en.wikipedia.org/wiki/Darwin_Information_Typing_Architecture">DITA</a> 1.3 payload
+ and are hence not recommended.
+ </p>
+</div>
+
+<h4 id="XML_SetReparseDeferralEnabled">XML_SetReparseDeferralEnabled</h4>
+<pre class="fcndec">
+/* Added in Expat 2.6.0. */
+XML_Bool XMLCALL
+XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled);
+</pre>
+<div class="fcndef">
+ <p>
+ Large tokens may require many parse calls before enough data is available for Expat to parse it in full.
+ If Expat retried parsing the token on every parse call, parsing could take quadratic time.
+ To avoid this, Expat only retries once a significant amount of new data is available.
+ This function allows disabling this behavior.
+ </p>
+ <p>
+ The <code>enabled</code> argument should be <code>XML_TRUE</code> or <code>XML_FALSE</code>.
+ </p>
+ <p>
+ Returns <code>XML_TRUE</code> on success, and <code>XML_FALSE</code> on error.
+ </p>
</div>
<h3><a name="miscellaneous">Miscellaneous functions</a></h3>
@@ -2003,7 +2293,8 @@ return NULL.</p>
<p>The functions in this section either obtain state information from
the parser or can be used to dynamically set parser options.</p>
-<pre class="fcndec" id="XML_SetUserData">
+<h4 id="XML_SetUserData">XML_SetUserData</h4>
+<pre class="fcndec">
void XMLCALL
XML_SetUserData(XML_Parser p,
void *userData);
@@ -2018,7 +2309,8 @@ the memory associated with it, then you've probably just leaked
memory.
</div>
-<pre class="fcndec" id="XML_GetUserData">
+<h4 id="XML_GetUserData">XML_GetUserData</h4>
+<pre class="fcndec">
void * XMLCALL
XML_GetUserData(XML_Parser p);
</pre>
@@ -2027,7 +2319,8 @@ This returns the user data pointer that gets passed to handlers.
It is actually implemented as a macro.
</div>
-<pre class="fcndec" id="XML_UseParserAsHandlerArg">
+<h4 id="XML_UseParserAsHandlerArg">XML_UseParserAsHandlerArg</h4>
+<pre class="fcndec">
void XMLCALL
XML_UseParserAsHandlerArg(XML_Parser p);
</pre>
@@ -2038,7 +2331,8 @@ using the <code><a href= "#XML_GetUserData"
>XML_GetUserData</a></code> function.
</div>
-<pre class="fcndec" id="XML_SetBase">
+<h4 id="XML_SetBase">XML_SetBase</h4>
+<pre class="fcndec">
enum XML_Status XMLCALL
XML_SetBase(XML_Parser p,
const XML_Char *base);
@@ -2050,7 +2344,8 @@ there's no memory to store base, otherwise it's
<code>XML_STATUS_OK</code>.
</div>
-<pre class="fcndec" id="XML_GetBase">
+<h4 id="XML_GetBase">XML_GetBase</h4>
+<pre class="fcndec">
const XML_Char * XMLCALL
XML_GetBase(XML_Parser p);
</pre>
@@ -2058,7 +2353,8 @@ XML_GetBase(XML_Parser p);
Return the base for resolving relative URIs.
</div>
-<pre class="fcndec" id="XML_GetSpecifiedAttributeCount">
+<h4 id="XML_GetSpecifiedAttributeCount">XML_GetSpecifiedAttributeCount</h4>
+<pre class="fcndec">
int XMLCALL
XML_GetSpecifiedAttributeCount(XML_Parser p);
</pre>
@@ -2074,7 +2370,8 @@ call to a start handler. If called inside a start handler, then that
means the current call.
</div>
-<pre class="fcndec" id="XML_GetIdAttributeIndex">
+<h4 id="XML_GetIdAttributeIndex">XML_GetIdAttributeIndex</h4>
+<pre class="fcndec">
int XMLCALL
XML_GetIdAttributeIndex(XML_Parser p);
</pre>
@@ -2086,7 +2383,8 @@ attribute. If called inside a start handler, then that means the
current call.
</div>
-<pre class="fcndec" id="XML_GetAttributeInfo">
+<h4 id="XML_GetAttributeInfo">XML_GetAttributeInfo</h4>
+<pre class="fcndec">
const XML_AttrInfo * XMLCALL
XML_GetAttributeInfo(XML_Parser parser);
</pre>
@@ -2107,14 +2405,15 @@ as 1; thus the number of entries in the array is
<code>XML_GetSpecifiedAttributeCount(parser) / 2</code>.
</div>
-<pre class="fcndec" id="XML_SetEncoding">
+<h4 id="XML_SetEncoding">XML_SetEncoding</h4>
+<pre class="fcndec">
enum XML_Status XMLCALL
XML_SetEncoding(XML_Parser p,
const XML_Char *encoding);
</pre>
<div class="fcndef">
Set the encoding to be used by the parser. It is equivalent to
-passing a non-null encoding argument to the parser creation functions.
+passing a non-<code>NULL</code> encoding argument to the parser creation functions.
It must not be called after <code><a href= "#XML_Parse"
>XML_Parse</a></code> or <code><a href= "#XML_ParseBuffer"
>XML_ParseBuffer</a></code> have been called on the given parser.
@@ -2122,7 +2421,8 @@ Returns <code>XML_STATUS_OK</code> on success or
<code>XML_STATUS_ERROR</code> on error.
</div>
-<pre class="fcndec" id="XML_SetParamEntityParsing">
+<h4 id="XML_SetParamEntityParsing">XML_SetParamEntityParsing</h4>
+<pre class="fcndec">
int XMLCALL
XML_SetParamEntityParsing(XML_Parser p,
enum XML_ParamEntityParsing code);
@@ -2142,7 +2442,8 @@ The choices for <code>code</code> are:
no effect and will always return 0.
</div>
-<pre class="fcndec" id="XML_SetHashSalt">
+<h4 id="XML_SetHashSalt">XML_SetHashSalt</h4>
+<pre class="fcndec">
int XMLCALL
XML_SetHashSalt(XML_Parser p,
unsigned long hash_salt);
@@ -2153,15 +2454,16 @@ Helps in preventing DoS attacks based on predicting hash
function behavior. In order to have an effect this must be called
before parsing has started. Returns 1 if successful, 0 when called
after <code>XML_Parse</code> or <code>XML_ParseBuffer</code>.
-<p><b>Note:</b>This call is optional, as the parser will auto-generate
+<p><b>Note:</b> This call is optional, as the parser will auto-generate
a new random salt value if no value has been set at the start of parsing.</p>
-<p><b>Note:</b>One should not call <code>XML_SetHashSalt</code> with a
+<p><b>Note:</b> One should not call <code>XML_SetHashSalt</code> with a
hash salt value of 0, as this value is used as sentinel value to indicate
that <code>XML_SetHashSalt</code> has <b>not</b> been called. Consequently
such a call will have no effect, even if it returns 1.</p>
</div>
-<pre class="fcndec" id="XML_UseForeignDTD">
+<h4 id="XML_UseForeignDTD">XML_UseForeignDTD</h4>
+<pre class="fcndec">
enum XML_Error XMLCALL
XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
</pre>
@@ -2183,7 +2485,7 @@ called. The setting of parameter entity parsing, controlled using
external entity reference handler set via <code><a href=
"#XML_SetExternalEntityRefHandler"
>XML_SetExternalEntityRefHandler</a></code> with both
-<code>publicId</code> and <code>systemId</code> set to NULL.</p>
+<code>publicId</code> and <code>systemId</code> set to <code>NULL</code>.</p>
<p>If this function is called after parsing has begun, it returns
<code>XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING</code> and ignores
@@ -2198,7 +2500,8 @@ the document had a DTD with an external subset. This holds true even if
the external entity reference handler returns without action.</p>
</div>
-<pre class="fcndec" id="XML_SetReturnNSTriplet">
+<h4 id="XML_SetReturnNSTriplet">XML_SetReturnNSTriplet</h4>
+<pre class="fcndec">
void XMLCALL
XML_SetReturnNSTriplet(XML_Parser parser,
int do_nst);
@@ -2220,7 +2523,8 @@ default manner, URI then local_name separated by the namespace
separator.</p>
</div>
-<pre class="fcndec" id="XML_DefaultCurrent">
+<h4 id="XML_DefaultCurrent">XML_DefaultCurrent</h4>
+<pre class="fcndec">
void XMLCALL
XML_DefaultCurrent(XML_Parser parser);
</pre>
@@ -2234,7 +2538,8 @@ href="#XML_SetDefaultHandler" >XML_SetDefaultHandler</a></code> or
not a default handler.
</div>
-<pre class="fcndec" id="XML_ExpatVersion">
+<h4 id="XML_ExpatVersion">XML_ExpatVersion</h4>
+<pre class="fcndec">
XML_LChar * XMLCALL
XML_ExpatVersion();
</pre>
@@ -2242,7 +2547,8 @@ XML_ExpatVersion();
Return the library version as a string (e.g. <code>"expat_1.95.1"</code>).
</div>
-<pre class="fcndec" id="XML_ExpatVersionInfo">
+<h4 id="XML_ExpatVersionInfo">XML_ExpatVersionInfo</h4>
+<pre class="fcndec">
struct XML_Expat_Version XMLCALL
XML_ExpatVersionInfo();
</pre>
@@ -2266,7 +2572,8 @@ Testing these constants is currently the best way to determine if
particular parts of the Expat API are available.
</div>
-<pre class="fcndec" id="XML_GetFeatureList">
+<h4 id="XML_GetFeatureList">XML_GetFeatureList</h4>
+<pre class="fcndec">
const XML_Feature * XMLCALL
XML_GetFeatureList();
</pre>
@@ -2299,7 +2606,7 @@ check these features to do so at runtime.</p>
<p>The return value is an array of <code>XML_Feature</code>,
terminated by a record with a <code>feature</code> of
-<code>XML_FEATURE_END</code> and <code>name</code> of NULL,
+<code>XML_FEATURE_END</code> and <code>name</code> of <code>NULL</code>,
identifying the feature-test macros Expat was compiled with. Since an
application that requires this kind of information needs to determine
the type of character the <code>name</code> points to, records for the
@@ -2327,7 +2634,8 @@ time, the following features have been defined to have values:</p>
</dl>
</div>
-<pre class="fcndec" id="XML_FreeContentModel">
+<h4 id="XML_FreeContentModel">XML_FreeContentModel</h4>
+<pre class="fcndec">
void XMLCALL
XML_FreeContentModel(XML_Parser parser, XML_Content *model);
</pre>
@@ -2346,19 +2654,21 @@ applications. This can be essential when using dynamically loaded
libraries which use different C standard libraries (this can happen on
Windows, at least).</p>
-<pre class="fcndec" id="XML_MemMalloc">
+<h4 id="XML_MemMalloc">XML_MemMalloc</h4>
+<pre class="fcndec">
void * XMLCALL
XML_MemMalloc(XML_Parser parser, size_t size);
</pre>
<div class="fcndef">
Allocate <code>size</code> bytes of memory using the allocator the
<code>parser</code> object has been configured to use. Returns a
-pointer to the memory or NULL on failure. Memory allocated in this
+pointer to the memory or <code>NULL</code> on failure. Memory allocated in this
way must be freed using <code><a href="#XML_MemFree"
>XML_MemFree</a></code>.
</div>
-<pre class="fcndec" id="XML_MemRealloc">
+<h4 id="XML_MemRealloc">XML_MemRealloc</h4>
+<pre class="fcndec">
void * XMLCALL
XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
</pre>
@@ -2367,9 +2677,9 @@ Allocate <code>size</code> bytes of memory using the allocator the
<code>parser</code> object has been configured to use.
<code>ptr</code> must point to a block of memory allocated by <code><a
href="#XML_MemMalloc" >XML_MemMalloc</a></code> or
-<code>XML_MemRealloc</code>, or be NULL. This function tries to
+<code>XML_MemRealloc</code>, or be <code>NULL</code>. This function tries to
expand the block pointed to by <code>ptr</code> if possible. Returns
-a pointer to the memory or NULL on failure. On success, the original
+a pointer to the memory or <code>NULL</code> on failure. On success, the original
block has either been expanded or freed. On failure, the original
block has not been freed; the caller is responsible for freeing the
original block. Memory allocated in this way must be freed using
@@ -2377,20 +2687,24 @@ original block. Memory allocated in this way must be freed using
>XML_MemFree</a></code>.
</div>
-<pre class="fcndec" id="XML_MemFree">
+<h4 id="XML_MemFree">XML_MemFree</h4>
+<pre class="fcndec">
void XMLCALL
XML_MemFree(XML_Parser parser, void *ptr);
</pre>
<div class="fcndef">
Free a block of memory pointed to by <code>ptr</code>. The block must
have been allocated by <code><a href="#XML_MemMalloc"
->XML_MemMalloc</a></code> or <code>XML_MemRealloc</code>, or be NULL.
+>XML_MemMalloc</a></code> or <code>XML_MemRealloc</code>, or be <code>NULL</code>.
</div>
<hr />
-<p><a href="http://validator.w3.org/check/referer"><img
- src="valid-xhtml10.png" alt="Valid XHTML 1.0!"
- height="31" width="88" class="noborder" /></a></p>
+
+ <div class="footer">
+ Found a bug in the documentation?
+ <a href="https://github.com/libexpat/libexpat/issues">Please file a bug report.</a>
+ </div>
+
</div>
</body>
</html>
diff --git a/3rdparty/expat/doc/style.css b/3rdparty/expat/doc/style.css
index 69df30bcecb..1b8cd10dffa 100644
--- a/3rdparty/expat/doc/style.css
+++ b/3rdparty/expat/doc/style.css
@@ -1,101 +1,47 @@
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2000-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2021 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* Stop not using half the screen */
body {
- background-color: white;
- border: 0px;
- margin: 0px;
- padding: 0px;
-}
-
-.corner {
- width: 200px;
- height: 80px;
- text-align: center;
-}
-
-.banner {
- background-color: rgb(110,139,61);
- color: rgb(255,236,176);
- padding-left: 2em;
-}
-
-.banner h1 {
- font-size: 200%;
-}
-
-.content {
- padding: 0em 2em 1em 2em;
-}
-
-.releaseno {
- background-color: rgb(110,139,61);
- color: rgb(255,236,176);
- padding-bottom: 0.3em;
- padding-top: 0.5em;
- text-align: center;
- font-weight: bold;
-}
-
-.noborder {
- border-width: 0px;
-}
-
-.eg {
- padding-left: 1em;
- padding-top: .5em;
- padding-bottom: .5em;
- border: solid thin;
- margin: 1em 0;
- background-color: tan;
- margin-left: 2em;
- margin-right: 10%;
-}
-
-.pseudocode {
- padding-left: 1em;
- padding-top: .5em;
- padding-bottom: .5em;
- border: solid thin;
- margin: 1em 0;
- background-color: rgb(250,220,180);
- margin-left: 2em;
- margin-right: 10%;
-}
-
-.handler {
- width: 100%;
- border-top-width: thin;
- margin-bottom: 1em;
-}
-
-.handler p {
- margin-left: 2em;
-}
-
-.setter {
- font-weight: bold;
-}
-
-.signature {
- color: navy;
-}
-
-.fcndec {
- width: 100%;
- border-top-width: thin;
- font-weight: bold;
-}
-
-.fcndef {
- margin-left: 2em;
- margin-bottom: 2em;
-}
-
-dd {
- margin-bottom: 2em;
+ max-width: none; /* was: 80ch */
}
.cpp-symbols dt {
font-family: monospace;
}
-.cpp-symbols dd {
- margin-bottom: 1em;
+
+/* Resemble style of <footer> which is not part of xhtml1-strict */
+.footer {
+ font-size: var(--ok-fs-5);
+ color: var(--ok-tc-1);
}
diff --git a/3rdparty/expat/doc/valid-xhtml10.png b/3rdparty/expat/doc/valid-xhtml10.png
deleted file mode 100644
index 8b5f1baeaa0..00000000000
--- a/3rdparty/expat/doc/valid-xhtml10.png
+++ /dev/null
Binary files differ
diff --git a/3rdparty/expat/doc/xmlwf.1 b/3rdparty/expat/doc/xmlwf.1
index ca56bf97650..76aa7e30d07 100644
--- a/3rdparty/expat/doc/xmlwf.1
+++ b/3rdparty/expat/doc/xmlwf.1
@@ -5,7 +5,7 @@
\\$2 \(la\\$1\(ra\\$3
..
.if \n(.g .mso www.tmac
-.TH XMLWF 1 "March 11, 2016" "" ""
+.TH XMLWF 1 "March 27, 2025" "" ""
.SH NAME
xmlwf \- Determines if an XML document is well-formed
.SH SYNOPSIS
@@ -15,7 +15,27 @@ xmlwf \- Determines if an XML document is well-formed
\fBxmlwf\fR \kx
.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
'in \n(.iu+\nxu
-[\fB-s\fR] [\fB-n\fR] [\fB-p\fR] [\fB-x\fR] [\fB-e \fIencoding\fB\fR] [\fB-w\fR] [\fB-d \fIoutput-dir\fB\fR] [\fB-c\fR] [\fB-m\fR] [\fB-r\fR] [\fB-t\fR] [\fB-N\fR] [\fB-v\fR] [file ...]
+[\fIOPTIONS\fR] [\fIFILE\fR ...]
+'in \n(.iu-\nxu
+.ad b
+'hy
+'nh
+.fi
+.ad l
+\fBxmlwf\fR \kx
+.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
+'in \n(.iu+\nxu
+\fB-h\fR | \fB--help\fR
+'in \n(.iu-\nxu
+.ad b
+'hy
+'nh
+.fi
+.ad l
+\fBxmlwf\fR \kx
+.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
+'in \n(.iu+\nxu
+\fB-v\fR | \fB--version\fR
'in \n(.iu-\nxu
.ad b
'hy
@@ -34,7 +54,7 @@ following rules:
\(bu
The file begins with an XML declaration. For instance,
\*(T<<?xml version="1.0" standalone="yes"?>\*(T>.
-\fINOTE:\fR
+\fINOTE\fR:
\fBxmlwf\fR does not currently
check for a valid XML declaration.
.TP 0.2i
@@ -62,10 +82,42 @@ it does not check the DTD. However, it does support
external entities (see the \*(T<\fB\-x\fR\*(T> option).
.SH OPTIONS
When an option includes an argument, you may specify the argument either
-separately ("\*(T<\fB\-d\fR\*(T> output") or concatenated with the
-option ("\*(T<\fB\-d\fR\*(T>output"). \fBxmlwf\fR
+separately ("\*(T<\fB\-d\fR\*(T> \fIoutput\fR") or concatenated with the
+option ("\*(T<\fB\-d\fR\*(T>\fIoutput\fR"). \fBxmlwf\fR
supports both.
.TP
+\*(T<\fB\-a\fR\*(T> \fIfactor\fR
+Sets the maximum tolerated amplification factor
+for protection against billion laughs attacks (default: 100.0).
+The amplification factor is calculated as ..
+
+.nf
+
+ amplification := (direct + indirect) / direct
+
+.fi
+
+\&.. while parsing, whereas
+<direct> is the number of bytes read
+from the primary document in parsing and
+<indirect> is the number of bytes
+added by expanding entities and reading of external DTD files,
+combined.
+
+\fINOTE\fR:
+If you ever need to increase this value for non-attack payload,
+please file a bug report.
+.TP
+\*(T<\fB\-b\fR\*(T> \fIbytes\fR
+Sets the number of output bytes (including amplification)
+needed to activate protection against billion laughs attacks
+(default: 8 MiB).
+This can be thought of as an "activation threshold".
+
+\fINOTE\fR:
+If you ever need to increase this value for non-attack payload,
+please file a bug report.
+.TP
\*(T<\fB\-c\fR\*(T>
If the input file is well-formed and \fBxmlwf\fR
doesn't encounter any errors, the input file is simply copied to
@@ -73,7 +125,7 @@ the output directory unchanged.
This implies no namespaces (turns off \*(T<\fB\-n\fR\*(T>) and
requires \*(T<\fB\-d\fR\*(T> to specify an output directory.
.TP
-\*(T<\fB\-d output\-dir\fR\*(T>
+\*(T<\fB\-d\fR\*(T> \fIoutput-dir\fR
Specifies a directory to contain transformed
representations of the input files.
By default, \*(T<\fB\-d\fR\*(T> outputs a canonical representation
@@ -96,7 +148,7 @@ is treated equivalently to data.
More on canonical XML can be found at
http://www.jclark.com/xml/canonxml.html .
.TP
-\*(T<\fB\-e encoding\fR\*(T>
+\*(T<\fB\-e\fR\*(T> \fIencoding\fR
Specifies the character encoding for the document, overriding
any document encoding declaration. \fBxmlwf\fR
supports four built-in encodings:
@@ -106,6 +158,25 @@ supports four built-in encodings:
\*(T<ISO\-8859\-1\*(T>.
Also see the \*(T<\fB\-w\fR\*(T> option.
.TP
+\*(T<\fB\-g\fR\*(T> \fIbytes\fR
+Sets the buffer size to request per call pair to
+\*(T<\fBXML_GetBuffer\fR\*(T> and \*(T<\fBread\fR\*(T>
+(default: 8 KiB).
+.TP
+\*(T<\fB\-h\fR\*(T>, \*(T<\fB\-\-help\fR\*(T>
+Prints short usage information on command \fBxmlwf\fR,
+and then exits.
+Similar to this man page but more concise.
+.TP
+\*(T<\fB\-k\fR\*(T>
+When processing multiple files, \fBxmlwf\fR
+by default halts after the the first file with an error.
+This tells \fBxmlwf\fR to report the error
+but to keep processing.
+This can be useful, for example, when testing a filter that converts
+many files to XML and you want to quickly find out which conversions
+failed.
+.TP
\*(T<\fB\-m\fR\*(T>
Outputs some strange sort of XML file that completely
describes the input file, including character positions.
@@ -121,13 +192,17 @@ This matches the example output used by the formal XML test cases.
Requires \*(T<\fB\-d\fR\*(T> to specify an output file.
.TP
\*(T<\fB\-p\fR\*(T>
-Tells xmlwf to process external DTDs and parameter
+Tells \fBxmlwf\fR to process external DTDs and parameter
entities.
Normally \fBxmlwf\fR never parses parameter
entities. \*(T<\fB\-p\fR\*(T> tells it to always parse them.
\*(T<\fB\-p\fR\*(T> implies \*(T<\fB\-x\fR\*(T>.
.TP
+\*(T<\fB\-q\fR\*(T>
+Disable reparse deferral, and allow quadratic parse runtime
+on large tokens (default: reparse deferral enabled).
+.TP
\*(T<\fB\-r\fR\*(T>
Normally \fBxmlwf\fR memory-maps the XML file
before parsing; this can result in faster parsing on many
@@ -156,7 +231,7 @@ without client overhead.
\*(T<\fB\-t\fR\*(T> turns off most of the output options
(\*(T<\fB\-d\fR\*(T>, \*(T<\fB\-m\fR\*(T>, \*(T<\fB\-c\fR\*(T>, ...).
.TP
-\*(T<\fB\-v\fR\*(T>
+\*(T<\fB\-v\fR\*(T>, \*(T<\fB\-\-version\fR\*(T>
Prints the version of the Expat library being used, including some
information on the compile-time configuration of the library, and
then exits.
@@ -165,7 +240,7 @@ then exits.
Enables support for Windows code pages.
Normally, \fBxmlwf\fR will throw an error if it
runs across an encoding that it is not equipped to handle itself. With
-\*(T<\fB\-w\fR\*(T>, xmlwf will try to use a Windows code
+\*(T<\fB\-w\fR\*(T>, \fBxmlwf\fR will try to use a Windows code
page. See also \*(T<\fB\-e\fR\*(T>.
.TP
\*(T<\fB\-x\fR\*(T>
@@ -210,24 +285,32 @@ will run \fBxmlwf\fR on the file
Older versions of \fBxmlwf\fR do not support
reading from standard input.
.SH OUTPUT
-If an input file is not well-formed,
-\fBxmlwf\fR prints a single line describing
-the problem to standard output. If a file is well formed,
-\fBxmlwf\fR outputs nothing.
+\fBxmlwf\fR outputs nothing for files which are problem-free.
+If any input file is not well-formed, or if the output for any
+input file cannot be opened, \fBxmlwf\fR prints a single
+line describing the problem to standard output.
+.PP
+If the \*(T<\fB\-k\fR\*(T> option is not provided, \fBxmlwf\fR
+halts upon encountering a well-formedness or output-file error.
+If \*(T<\fB\-k\fR\*(T> is provided, \fBxmlwf\fR continues
+processing the remaining input files, describing problems found with any of them.
.SH "EXIT STATUS"
-For option \*(T<\fB\-v\fR\*(T> or \*(T<\fB\-h\fR\*(T>, \fBxmlwf\fR always exits with status code 0. For other cases, the following exit status codes are returned:
+For options \*(T<\fB\-v\fR\*(T>|\*(T<\fB\-\-version\fR\*(T> or \*(T<\fB\-h\fR\*(T>|\*(T<\fB\-\-help\fR\*(T>, \fBxmlwf\fR always exits with status code 0. For other cases, the following exit status codes are returned:
.TP
\*(T<\fB0\fR\*(T>
-The input files are well-formed.
+The input files are well-formed and the output (if requested) was written successfully.
.TP
\*(T<\fB1\fR\*(T>
An internal error occurred.
.TP
\*(T<\fB2\fR\*(T>
-An input file was not well-formed or could not be parsed.
+One or more input files were not well-formed or could not be parsed.
.TP
\*(T<\fB3\fR\*(T>
If using the \*(T<\fB\-d\fR\*(T> option, an error occurred opening an output file.
+.TP
+\*(T<\fB4\fR\*(T>
+There was a command-line argument error in how \fBxmlwf\fR was invoked.
.SH BUGS
The errors should go to standard error, not standard output.
.PP
@@ -239,24 +322,16 @@ I have no idea why anyone would want to use the
\*(T<\fB\-d\fR\*(T>, \*(T<\fB\-c\fR\*(T>, and
\*(T<\fB\-m\fR\*(T> options. If someone could explain it to
me, I'd like to add this information to this manpage.
-.SH ALTERNATIVES
-Here are some XML validators on the web:
-
-.nf
-
-http://www.hcrc.ed.ac.uk/~richard/xml\-check.html
-http://www.stg.brown.edu/service/xmlvalid/
-http://www.scripting.com/frontier5/xml/code/xmlValidator.html
-http://www.xml.com/pub/a/tools/ruwf/check.html
-.fi
.SH "SEE ALSO"
.nf
-The Expat home page: http://www.libexpat.org/
-The W3 XML specification: http://www.w3.org/TR/REC\-xml
+The Expat home page: https://libexpat.github.io/
+The W3 XML 1.0 specification (fourth edition): https://www.w3.org/TR/2006/REC\-xml\-20060816/
+Billion laughs attack: https://en.wikipedia.org/wiki/Billion_laughs_attack
.fi
.SH AUTHOR
-This manual page was written by Scott Bronson <\*(T<bronson@rinspin.com\*(T>> for
+This manual page was originally written by Scott Bronson <\*(T<bronson@rinspin.com\*(T>>
+in December 2001 for
the Debian GNU/Linux system (but may be used by others). Permission is
granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation
diff --git a/3rdparty/expat/doc/xmlwf.xml b/3rdparty/expat/doc/xmlwf.xml
index 654466cef62..17e9cf51c19 100644
--- a/3rdparty/expat/doc/xmlwf.xml
+++ b/3rdparty/expat/doc/xmlwf.xml
@@ -1,11 +1,28 @@
-<!DOCTYPE refentry [
- <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+<!--
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001 Scott Bronson <bronson@rinspin.com>
+ Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2009 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2016 Ardo van Rangelrooij <ardo@debian.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2020 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2021 Tim Bray <tbray@textuality.com>
+ Unlike most of Expat,
+ this file is copyrighted under the GNU Free Documentation License 1.1.
+-->
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY dhfirstname "<firstname>Scott</firstname>">
<!ENTITY dhsurname "<surname>Bronson</surname>">
- <!-- Please adjust the date whenever revising the manpage. -->
- <!ENTITY dhdate "<date>March 11, 2016</date>">
- <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
- allowed: see man(7), man(1). -->
+ <!ENTITY dhdate "<date>March 27, 2025</date>">
+ <!-- Please adjust this^^ date whenever cutting a new release. -->
<!ENTITY dhsection "<manvolnum>1</manvolnum>">
<!ENTITY dhemail "<email>bronson@rinspin.com</email>">
<!ENTITY dhusername "Scott Bronson">
@@ -44,25 +61,22 @@
<refsynopsisdiv>
<cmdsynopsis>
<command>&dhpackage;</command>
- <arg><option>-s</option></arg>
- <arg><option>-n</option></arg>
- <arg><option>-p</option></arg>
- <arg><option>-x</option></arg>
-
- <arg><option>-e <replaceable>encoding</replaceable></option></arg>
- <arg><option>-w</option></arg>
-
- <arg><option>-d <replaceable>output-dir</replaceable></option></arg>
- <arg><option>-c</option></arg>
- <arg><option>-m</option></arg>
-
- <arg><option>-r</option></arg>
- <arg><option>-t</option></arg>
- <arg><option>-N</option></arg>
-
- <arg><option>-v</option></arg>
-
- <arg>file ...</arg>
+ <arg><replaceable>OPTIONS</replaceable></arg>
+ <arg><replaceable>FILE</replaceable> ...</arg>
+ </cmdsynopsis>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <group choice="plain">
+ <arg><option>-h</option></arg>
+ <arg><option>--help</option></arg>
+ </group>
+ </cmdsynopsis>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <group choice="plain">
+ <arg><option>-v</option></arg>
+ <arg><option>--version</option></arg>
+ </group>
</cmdsynopsis>
</refsynopsisdiv>
@@ -95,7 +109,7 @@
<listitem><para>
The file begins with an XML declaration. For instance,
<literal>&lt;?xml version="1.0" standalone="yes"?&gt;</literal>.
- <emphasis>NOTE:</emphasis>
+ <emphasis>NOTE</emphasis>:
<command>&dhpackage;</command> does not currently
check for a valid XML declaration.
</para></listitem>
@@ -132,14 +146,58 @@
<para>
When an option includes an argument, you may specify the argument either
-separately ("<option>-d</option> output") or concatenated with the
-option ("<option>-d</option>output"). <command>&dhpackage;</command>
+separately ("<option>-d</option> <replaceable>output</replaceable>") or concatenated with the
+option ("<option>-d</option><replaceable>output</replaceable>"). <command>&dhpackage;</command>
supports both.
</para>
<variablelist>
<varlistentry>
+ <term><option>-a</option> <replaceable>factor</replaceable></term>
+ <listitem>
+ <para>
+ Sets the maximum tolerated amplification factor
+ for protection against billion laughs attacks (default: 100.0).
+ The amplification factor is calculated as ..
+ </para>
+ <literallayout>
+ amplification := (direct + indirect) / direct
+ </literallayout>
+ <para>
+ .. while parsing, whereas
+ &lt;direct&gt; is the number of bytes read
+ from the primary document in parsing and
+ &lt;indirect&gt; is the number of bytes
+ added by expanding entities and reading of external DTD files,
+ combined.
+ </para>
+ <para>
+ <emphasis>NOTE</emphasis>:
+ If you ever need to increase this value for non-attack payload,
+ please file a bug report.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-b</option> <replaceable>bytes</replaceable></term>
+ <listitem>
+ <para>
+ Sets the number of output bytes (including amplification)
+ needed to activate protection against billion laughs attacks
+ (default: 8 MiB).
+ This can be thought of as an &quot;activation threshold&quot;.
+ </para>
+ <para>
+ <emphasis>NOTE</emphasis>:
+ If you ever need to increase this value for non-attack payload,
+ please file a bug report.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-c</option></term>
<listitem>
<para>
@@ -153,7 +211,7 @@ supports both.
</varlistentry>
<varlistentry>
- <term><option>-d output-dir</option></term>
+ <term><option>-d</option> <replaceable>output-dir</replaceable></term>
<listitem>
<para>
Specifies a directory to contain transformed
@@ -184,7 +242,7 @@ supports both.
</varlistentry>
<varlistentry>
- <term><option>-e encoding</option></term>
+ <term><option>-e</option> <replaceable>encoding</replaceable></term>
<listitem>
<para>
Specifies the character encoding for the document, overriding
@@ -200,6 +258,44 @@ supports both.
</varlistentry>
<varlistentry>
+ <term><option>-g</option> <replaceable>bytes</replaceable></term>
+ <listitem>
+ <para>
+ Sets the buffer size to request per call pair to
+ <function>XML_GetBuffer</function> and <function>read</function>
+ (default: 8 KiB).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-h</option></term>
+ <term><option>--help</option></term>
+ <listitem>
+ <para>
+ Prints short usage information on command <command>&dhpackage;</command>,
+ and then exits.
+ Similar to this man page but more concise.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-k</option></term>
+ <listitem>
+ <para>
+ When processing multiple files, <command>&dhpackage;</command>
+ by default halts after the the first file with an error.
+ This tells <command>&dhpackage;</command> to report the error
+ but to keep processing.
+ This can be useful, for example, when testing a filter that converts
+ many files to XML and you want to quickly find out which conversions
+ failed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-m</option></term>
<listitem>
<para>
@@ -235,7 +331,7 @@ supports both.
<term><option>-p</option></term>
<listitem>
<para>
- Tells xmlwf to process external DTDs and parameter
+ Tells <command>&dhpackage;</command> to process external DTDs and parameter
entities.
</para>
<para>
@@ -247,6 +343,16 @@ supports both.
</varlistentry>
<varlistentry>
+ <term><option>-q</option></term>
+ <listitem>
+ <para>
+ Disable reparse deferral, and allow quadratic parse runtime
+ on large tokens (default: reparse deferral enabled).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-r</option></term>
<listitem>
<para>
@@ -292,9 +398,10 @@ supports both.
</para>
</listitem>
</varlistentry>
-
+
<varlistentry>
<term><option>-v</option></term>
+ <term><option>--version</option></term>
<listitem>
<para>
Prints the version of the Expat library being used, including some
@@ -311,7 +418,7 @@ supports both.
Enables support for Windows code pages.
Normally, <command>&dhpackage;</command> will throw an error if it
runs across an encoding that it is not equipped to handle itself. With
- <option>-w</option>, &dhpackage; will try to use a Windows code
+ <option>-w</option>, <command>&dhpackage;</command> will try to use a Windows code
page. See also <option>-e</option>.
</para>
</listitem>
@@ -379,20 +486,26 @@ supports both.
<refsect1>
<title>OUTPUT</title>
<para>
- If an input file is not well-formed,
- <command>&dhpackage;</command> prints a single line describing
- the problem to standard output. If a file is well formed,
- <command>&dhpackage;</command> outputs nothing.
- </para>
+ <command>&dhpackage;</command> outputs nothing for files which are problem-free.
+ If any input file is not well-formed, or if the output for any
+ input file cannot be opened, <command>&dhpackage;</command> prints a single
+ line describing the problem to standard output.
+ </para>
+ <para>
+ If the <option>-k</option> option is not provided, <command>&dhpackage;</command>
+ halts upon encountering a well-formedness or output-file error.
+ If <option>-k</option> is provided, <command>&dhpackage;</command> continues
+ processing the remaining input files, describing problems found with any of them.
+ </para>
</refsect1>
<refsect1>
<title>EXIT STATUS</title>
- <para>For option <option>-v</option> or <option>-h</option>, <command>&dhpackage;</command> always exits with status code 0. For other cases, the following exit status codes are returned:
+ <para>For options <option>-v</option>|<option>--version</option> or <option>-h</option>|<option>--help</option>, <command>&dhpackage;</command> always exits with status code 0. For other cases, the following exit status codes are returned:
<variablelist>
<varlistentry>
<term><option>0</option></term>
- <listitem><para>The input files are well-formed.</para>
+ <listitem><para>The input files are well-formed and the output (if requested) was written successfully.</para>
</listitem>
</varlistentry>
<varlistentry>
@@ -402,7 +515,7 @@ supports both.
</varlistentry>
<varlistentry>
<term><option>2</option></term>
- <listitem><para>An input file was not well-formed or could not be parsed.</para>
+ <listitem><para>One or more input files were not well-formed or could not be parsed.</para>
</listitem>
</varlistentry>
<varlistentry>
@@ -410,6 +523,11 @@ supports both.
<listitem><para>If using the <option>-d</option> option, an error occurred opening an output file.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>4</option></term>
+ <listitem><para>There was a command-line argument error in how <command>&dhpackage;</command> was invoked.</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</para>
</refsect1>
@@ -434,27 +552,13 @@ supports both.
</refsect1>
<refsect1>
- <title>ALTERNATIVES</title>
- <para>
- Here are some XML validators on the web:
-
-<literallayout>
-http://www.hcrc.ed.ac.uk/~richard/xml-check.html
-http://www.stg.brown.edu/service/xmlvalid/
-http://www.scripting.com/frontier5/xml/code/xmlValidator.html
-http://www.xml.com/pub/a/tools/ruwf/check.html
-</literallayout>
-
- </para>
- </refsect1>
-
- <refsect1>
<title>SEE ALSO</title>
<para>
<literallayout>
-The Expat home page: http://www.libexpat.org/
-The W3 XML specification: http://www.w3.org/TR/REC-xml
+The Expat home page: https://libexpat.github.io/
+The W3 XML 1.0 specification (fourth edition): https://www.w3.org/TR/2006/REC-xml-20060816/
+Billion laughs attack: https://en.wikipedia.org/wiki/Billion_laughs_attack
</literallayout>
</para>
@@ -463,7 +567,8 @@ The W3 XML specification: http://www.w3.org/TR/REC-xml
<refsect1>
<title>AUTHOR</title>
<para>
- This manual page was written by &dhusername; &dhemail; for
+ This manual page was originally written by &dhusername; &dhemail;
+ in December 2001 for
the &debian; system (but may be used by others). Permission is
granted to copy, distribute and/or modify this document under
the terms of the <acronym>GNU</acronym> Free Documentation
diff --git a/3rdparty/expat/examples/Makefile.am b/3rdparty/expat/examples/Makefile.am
index c3b1f7bedbf..e2e22bce8f6 100644
--- a/3rdparty/expat/examples/Makefile.am
+++ b/3rdparty/expat/examples/Makefile.am
@@ -6,7 +6,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2022 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -30,7 +31,10 @@
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
-noinst_PROGRAMS = elements outline
+noinst_PROGRAMS = element_declarations elements outline
+
+element_declarations_SOURCES = element_declarations.c
+element_declarations_LDADD = ../lib/libexpat.la
elements_SOURCES = elements.c
elements_LDADD = ../lib/libexpat.la
diff --git a/3rdparty/expat/examples/Makefile.in b/3rdparty/expat/examples/Makefile.in
index 7c4a296ba2b..044c9089c56 100644
--- a/3rdparty/expat/examples/Makefile.in
+++ b/3rdparty/expat/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2022 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -118,7 +119,8 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-noinst_PROGRAMS = elements$(EXEEXT) outline$(EXEEXT)
+noinst_PROGRAMS = element_declarations$(EXEEXT) elements$(EXEEXT) \
+ outline$(EXEEXT)
subdir = examples
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -132,6 +134,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
@@ -141,13 +145,16 @@ CONFIG_HEADER = $(top_builddir)/expat_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
PROGRAMS = $(noinst_PROGRAMS)
-am_elements_OBJECTS = elements.$(OBJEXT)
-elements_OBJECTS = $(am_elements_OBJECTS)
-elements_DEPENDENCIES = ../lib/libexpat.la
+am_element_declarations_OBJECTS = element_declarations.$(OBJEXT)
+element_declarations_OBJECTS = $(am_element_declarations_OBJECTS)
+element_declarations_DEPENDENCIES = ../lib/libexpat.la
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 =
+am_elements_OBJECTS = elements.$(OBJEXT)
+elements_OBJECTS = $(am_elements_OBJECTS)
+elements_DEPENDENCIES = ../lib/libexpat.la
am_outline_OBJECTS = outline.$(OBJEXT)
outline_OBJECTS = $(am_outline_OBJECTS)
outline_DEPENDENCIES = ../lib/libexpat.la
@@ -166,7 +173,8 @@ am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/conftools/depcomp
am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/elements.Po ./$(DEPDIR)/outline.Po
+am__depfiles_remade = ./$(DEPDIR)/element_declarations.Po \
+ ./$(DEPDIR)/elements.Po ./$(DEPDIR)/outline.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -186,8 +194,10 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = $(elements_SOURCES) $(outline_SOURCES)
-DIST_SOURCES = $(elements_SOURCES) $(outline_SOURCES)
+SOURCES = $(element_declarations_SOURCES) $(elements_SOURCES) \
+ $(outline_SOURCES)
+DIST_SOURCES = $(element_declarations_SOURCES) $(elements_SOURCES) \
+ $(outline_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -210,8 +220,6 @@ am__define_uniq_tagged_files = \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
am__DIST_COMMON = $(srcdir)/Makefile.in \
$(top_srcdir)/conftools/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -231,8 +239,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -248,10 +258,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -261,6 +281,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -269,6 +291,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -290,9 +313,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -347,6 +373,8 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
+element_declarations_SOURCES = element_declarations.c
+element_declarations_LDADD = ../lib/libexpat.la
elements_SOURCES = elements.c
elements_LDADD = ../lib/libexpat.la
outline_SOURCES = outline.c
@@ -355,7 +383,7 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -379,9 +407,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
@@ -394,6 +422,10 @@ clean-noinstPROGRAMS:
echo " rm -f" $$list; \
rm -f $$list
+element_declarations$(EXEEXT): $(element_declarations_OBJECTS) $(element_declarations_DEPENDENCIES) $(EXTRA_element_declarations_DEPENDENCIES)
+ @rm -f element_declarations$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(element_declarations_OBJECTS) $(element_declarations_LDADD) $(LIBS)
+
elements$(EXEEXT): $(elements_OBJECTS) $(elements_DEPENDENCIES) $(EXTRA_elements_DEPENDENCIES)
@rm -f elements$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(elements_OBJECTS) $(elements_LDADD) $(LIBS)
@@ -408,6 +440,7 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/element_declarations.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outline.Po@am__quote@ # am--include-marker
@@ -495,7 +528,6 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
@@ -569,7 +601,8 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
mostlyclean-am
distclean: distclean-am
- -rm -f ./$(DEPDIR)/elements.Po
+ -rm -f ./$(DEPDIR)/element_declarations.Po
+ -rm -f ./$(DEPDIR)/elements.Po
-rm -f ./$(DEPDIR)/outline.Po
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
@@ -616,7 +649,8 @@ install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
- -rm -f ./$(DEPDIR)/elements.Po
+ -rm -f ./$(DEPDIR)/element_declarations.Po
+ -rm -f ./$(DEPDIR)/elements.Po
-rm -f ./$(DEPDIR)/outline.Po
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
diff --git a/3rdparty/expat/examples/element_declarations.c b/3rdparty/expat/examples/element_declarations.c
new file mode 100644
index 00000000000..d644b2ffa5e
--- /dev/null
+++ b/3rdparty/expat/examples/element_declarations.c
@@ -0,0 +1,235 @@
+/* Read an XML document from standard input and print
+ element declarations (if any) to standard output.
+ It must be used with Expat compiled for UTF-8 output.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2004-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2019 Zhongyuan Zhou <zhouzhongyuan@huawei.com>
+ Copyright (c) 2024 Hanno Böck <hanno@gentoo.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <expat.h>
+
+#ifdef XML_LARGE_SIZE
+# define XML_FMT_INT_MOD "ll"
+#else
+# define XML_FMT_INT_MOD "l"
+#endif
+
+#ifdef XML_UNICODE_WCHAR_T
+# define XML_FMT_STR "ls"
+#else
+# define XML_FMT_STR "s"
+#endif
+
+// While traversing the XML_Content tree, we avoid recursion
+// to not be vulnerable to a denial of service attack.
+typedef struct StackStruct {
+ const XML_Content *model;
+ unsigned level;
+ struct StackStruct *prev;
+} Stack;
+
+static Stack *
+stackPushMalloc(Stack *stackTop, const XML_Content *model, unsigned level) {
+ Stack *const newStackTop = malloc(sizeof(Stack));
+ if (! newStackTop) {
+ return NULL;
+ }
+ newStackTop->model = model;
+ newStackTop->level = level;
+ newStackTop->prev = stackTop;
+ return newStackTop;
+}
+
+static Stack *
+stackPopFree(Stack *stackTop) {
+ Stack *const newStackTop = stackTop->prev;
+ free(stackTop);
+ return newStackTop;
+}
+
+static char *
+contentTypeName(enum XML_Content_Type contentType) {
+ switch (contentType) {
+ case XML_CTYPE_EMPTY:
+ return "EMPTY";
+ case XML_CTYPE_ANY:
+ return "ANY";
+ case XML_CTYPE_MIXED:
+ return "MIXED";
+ case XML_CTYPE_NAME:
+ return "NAME";
+ case XML_CTYPE_CHOICE:
+ return "CHOICE";
+ case XML_CTYPE_SEQ:
+ return "SEQ";
+ default:
+ return "???";
+ }
+}
+
+static char *
+contentQuantName(enum XML_Content_Quant contentQuant) {
+ switch (contentQuant) {
+ case XML_CQUANT_NONE:
+ return "NONE";
+ case XML_CQUANT_OPT:
+ return "OPT";
+ case XML_CQUANT_REP:
+ return "REP";
+ case XML_CQUANT_PLUS:
+ return "PLUS";
+ default:
+ return "???";
+ }
+}
+
+static void
+dumpContentModelElement(const XML_Content *model, unsigned level,
+ const XML_Content *root) {
+ // Indent
+ unsigned u = 0;
+ for (; u < level; u++) {
+ printf(" ");
+ }
+
+ // Node
+ printf("[%u] type=%s(%u), quant=%s(%u)", (unsigned)(model - root),
+ contentTypeName(model->type), (unsigned int)model->type,
+ contentQuantName(model->quant), (unsigned int)model->quant);
+ if (model->name) {
+ printf(", name=\"%" XML_FMT_STR "\"", model->name);
+ } else {
+ printf(", name=NULL");
+ }
+ printf(", numchildren=%u", model->numchildren);
+ printf("\n");
+}
+
+static bool
+dumpContentModel(const XML_Char *name, const XML_Content *root) {
+ printf("Element \"%" XML_FMT_STR "\":\n", name);
+ Stack *stackTop = stackPushMalloc(NULL, root, 1);
+ if (! stackTop) {
+ return false;
+ }
+
+ while (stackTop) {
+ const XML_Content *const model = stackTop->model;
+ const unsigned level = stackTop->level;
+
+ dumpContentModelElement(model, level, root);
+
+ stackTop = stackPopFree(stackTop);
+
+ for (size_t u = model->numchildren; u >= 1; u--) {
+ Stack *const newStackTop
+ = stackPushMalloc(stackTop, model->children + (u - 1), level + 1);
+ if (! newStackTop) {
+ // We ran out of memory, so let's free all memory allocated
+ // earlier in this function, to be leak-clean:
+ while (stackTop != NULL) {
+ stackTop = stackPopFree(stackTop);
+ }
+ return false;
+ }
+ stackTop = newStackTop;
+ }
+ }
+
+ printf("\n");
+ return true;
+}
+
+static void XMLCALL
+handleElementDeclaration(void *userData, const XML_Char *name,
+ XML_Content *model) {
+ XML_Parser parser = (XML_Parser)userData;
+ const bool success = dumpContentModel(name, model);
+ XML_FreeContentModel(parser, model);
+ if (! success) {
+ XML_StopParser(parser, /* resumable= */ XML_FALSE);
+ }
+}
+
+int
+main(void) {
+ XML_Parser parser = XML_ParserCreate(NULL);
+ int done;
+
+ if (! parser) {
+ fprintf(stderr, "Couldn't allocate memory for parser\n");
+ return 1;
+ }
+
+ XML_SetUserData(parser, parser);
+ XML_SetElementDeclHandler(parser, handleElementDeclaration);
+
+ do {
+ void *const buf = XML_GetBuffer(parser, BUFSIZ);
+ if (! buf) {
+ fprintf(stderr, "Couldn't allocate memory for buffer\n");
+ XML_ParserFree(parser);
+ return 1;
+ }
+
+ const size_t len = fread(buf, 1, BUFSIZ, stdin);
+
+ if (ferror(stdin)) {
+ fprintf(stderr, "Read error\n");
+ XML_ParserFree(parser);
+ return 1;
+ }
+
+ done = feof(stdin);
+
+ if (XML_ParseBuffer(parser, (int)len, done) == XML_STATUS_ERROR) {
+ enum XML_Error errorCode = XML_GetErrorCode(parser);
+ if (errorCode == XML_ERROR_ABORTED) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ }
+ fprintf(stderr,
+ "Parse error at line %" XML_FMT_INT_MOD "u:\n%" XML_FMT_STR "\n",
+ XML_GetCurrentLineNumber(parser), XML_ErrorString(errorCode));
+ XML_ParserFree(parser);
+ return 1;
+ }
+ } while (! done);
+
+ XML_ParserFree(parser);
+ return 0;
+}
diff --git a/3rdparty/expat/examples/elements.c b/3rdparty/expat/examples/elements.c
index eb0c729bff1..e5fb850d501 100644
--- a/3rdparty/expat/examples/elements.c
+++ b/3rdparty/expat/examples/elements.c
@@ -11,7 +11,12 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2004-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2019 Zhongyuan Zhou <zhouzhongyuan@huawei.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -44,7 +49,6 @@
#endif
#ifdef XML_UNICODE_WCHAR_T
-# include <wchar.h>
# define XML_FMT_STR "ls"
#else
# define XML_FMT_STR "s"
@@ -53,7 +57,7 @@
static void XMLCALL
startElement(void *userData, const XML_Char *name, const XML_Char **atts) {
int i;
- int *depthPtr = (int *)userData;
+ int *const depthPtr = (int *)userData;
(void)atts;
for (i = 0; i < *depthPtr; i++)
@@ -64,34 +68,54 @@ startElement(void *userData, const XML_Char *name, const XML_Char **atts) {
static void XMLCALL
endElement(void *userData, const XML_Char *name) {
- int *depthPtr = (int *)userData;
+ int *const depthPtr = (int *)userData;
(void)name;
*depthPtr -= 1;
}
int
-main(int argc, char *argv[]) {
- char buf[BUFSIZ];
+main(void) {
XML_Parser parser = XML_ParserCreate(NULL);
int done;
int depth = 0;
- (void)argc;
- (void)argv;
+
+ if (! parser) {
+ fprintf(stderr, "Couldn't allocate memory for parser\n");
+ return 1;
+ }
XML_SetUserData(parser, &depth);
XML_SetElementHandler(parser, startElement, endElement);
+
do {
- size_t len = fread(buf, 1, sizeof(buf), stdin);
- done = len < sizeof(buf);
- if (XML_Parse(parser, buf, (int)len, done) == XML_STATUS_ERROR) {
- fprintf(stderr, "%" XML_FMT_STR " at line %" XML_FMT_INT_MOD "u\n",
- XML_ErrorString(XML_GetErrorCode(parser)),
- XML_GetCurrentLineNumber(parser));
+ void *const buf = XML_GetBuffer(parser, BUFSIZ);
+ if (! buf) {
+ fprintf(stderr, "Couldn't allocate memory for buffer\n");
+ XML_ParserFree(parser);
+ return 1;
+ }
+
+ const size_t len = fread(buf, 1, BUFSIZ, stdin);
+
+ if (ferror(stdin)) {
+ fprintf(stderr, "Read error\n");
+ XML_ParserFree(parser);
+ return 1;
+ }
+
+ done = feof(stdin);
+
+ if (XML_ParseBuffer(parser, (int)len, done) == XML_STATUS_ERROR) {
+ fprintf(stderr,
+ "Parse error at line %" XML_FMT_INT_MOD "u:\n%" XML_FMT_STR "\n",
+ XML_GetCurrentLineNumber(parser),
+ XML_ErrorString(XML_GetErrorCode(parser)));
XML_ParserFree(parser);
return 1;
}
} while (! done);
+
XML_ParserFree(parser);
return 0;
}
diff --git a/3rdparty/expat/examples/outline.c b/3rdparty/expat/examples/outline.c
index d996b8e3a8d..d2df914fedb 100644
--- a/3rdparty/expat/examples/outline.c
+++ b/3rdparty/expat/examples/outline.c
@@ -8,8 +8,12 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -47,73 +51,74 @@
# define XML_FMT_STR "s"
#endif
-#define BUFFSIZE 8192
-
-char Buff[BUFFSIZE];
-
-int Depth;
-
static void XMLCALL
-start(void *data, const XML_Char *el, const XML_Char **attr) {
+startElement(void *userData, const XML_Char *name, const XML_Char **atts) {
int i;
- (void)data;
+ int *const depthPtr = (int *)userData;
- for (i = 0; i < Depth; i++)
+ for (i = 0; i < *depthPtr; i++)
printf(" ");
- printf("%" XML_FMT_STR, el);
+ printf("%" XML_FMT_STR, name);
- for (i = 0; attr[i]; i += 2) {
- printf(" %" XML_FMT_STR "='%" XML_FMT_STR "'", attr[i], attr[i + 1]);
+ for (i = 0; atts[i]; i += 2) {
+ printf(" %" XML_FMT_STR "='%" XML_FMT_STR "'", atts[i], atts[i + 1]);
}
printf("\n");
- Depth++;
+ *depthPtr += 1;
}
static void XMLCALL
-end(void *data, const XML_Char *el) {
- (void)data;
- (void)el;
+endElement(void *userData, const XML_Char *name) {
+ int *const depthPtr = (int *)userData;
+ (void)name;
- Depth--;
+ *depthPtr -= 1;
}
int
-main(int argc, char *argv[]) {
- XML_Parser p = XML_ParserCreate(NULL);
- (void)argc;
- (void)argv;
+main(void) {
+ XML_Parser parser = XML_ParserCreate(NULL);
+ int done;
+ int depth = 0;
- if (! p) {
+ if (! parser) {
fprintf(stderr, "Couldn't allocate memory for parser\n");
- exit(-1);
+ return 1;
}
- XML_SetElementHandler(p, start, end);
+ XML_SetUserData(parser, &depth);
+ XML_SetElementHandler(parser, startElement, endElement);
- for (;;) {
- int done;
- int len;
+ do {
+ void *const buf = XML_GetBuffer(parser, BUFSIZ);
+ if (! buf) {
+ fprintf(stderr, "Couldn't allocate memory for buffer\n");
+ XML_ParserFree(parser);
+ return 1;
+ }
+
+ const size_t len = fread(buf, 1, BUFSIZ, stdin);
- len = (int)fread(Buff, 1, BUFFSIZE, stdin);
if (ferror(stdin)) {
fprintf(stderr, "Read error\n");
- exit(-1);
+ XML_ParserFree(parser);
+ return 1;
}
+
done = feof(stdin);
- if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
+ if (XML_ParseBuffer(parser, (int)len, done) == XML_STATUS_ERROR) {
fprintf(stderr,
"Parse error at line %" XML_FMT_INT_MOD "u:\n%" XML_FMT_STR "\n",
- XML_GetCurrentLineNumber(p),
- XML_ErrorString(XML_GetErrorCode(p)));
- exit(-1);
+ XML_GetCurrentLineNumber(parser),
+ XML_ErrorString(XML_GetErrorCode(parser)));
+ XML_ParserFree(parser);
+ return 1;
}
+ } while (! done);
- if (done)
- break;
- }
- XML_ParserFree(p);
+ XML_ParserFree(parser);
return 0;
}
diff --git a/3rdparty/expat/expat.pc.cmake b/3rdparty/expat/expat.pc.cmake
new file mode 100644
index 00000000000..56da413791e
--- /dev/null
+++ b/3rdparty/expat/expat.pc.cmake
@@ -0,0 +1,13 @@
+prefix=$<TARGET_PROPERTY:expat,pkgconfig_prefix>
+exec_prefix=$<TARGET_PROPERTY:expat,pkgconfig_exec_prefix>
+libdir=$<TARGET_PROPERTY:expat,pkgconfig_libdir>
+includedir=$<TARGET_PROPERTY:expat,pkgconfig_includedir>
+
+Name: $<TARGET_PROPERTY:expat,pkgconfig_$<LOWER_CASE:$<CONFIG>>_name>
+Version: $<TARGET_PROPERTY:expat,pkgconfig_version>
+Description: expat XML parser
+URL: https://libexpat.github.io/
+Libs: -L${libdir} -l$<TARGET_PROPERTY:expat,pkgconfig_$<LOWER_CASE:$<CONFIG>>_output_name>
+Libs.private: $<TARGET_PROPERTY:expat,pkgconfig_libm>
+Cflags: -I${includedir}
+Cflags.private: -DXML_STATIC
diff --git a/3rdparty/expat/expat.pc.in b/3rdparty/expat/expat.pc.in
index bdfa47f8457..a53ab118729 100644
--- a/3rdparty/expat/expat.pc.in
+++ b/3rdparty/expat/expat.pc.in
@@ -3,9 +3,11 @@ exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
-Name: @_EXPAT_OUTPUT_NAME@
+Name: @PACKAGE_NAME@
Version: @PACKAGE_VERSION@
Description: expat XML parser
-URL: http://www.libexpat.org
-Libs: -L${libdir} -l@_EXPAT_OUTPUT_NAME@
+URL: https://libexpat.github.io/
+Libs: -L${libdir} -l@PACKAGE_NAME@
+Libs.private: @LIBM@
Cflags: -I${includedir}
+Cflags.private: -DXML_STATIC
diff --git a/3rdparty/expat/expat_config.h b/3rdparty/expat/expat_config.h
new file mode 100644
index 00000000000..9cb3b81a2aa
--- /dev/null
+++ b/3rdparty/expat/expat_config.h
@@ -0,0 +1,143 @@
+/* expat_config.h. Generated from expat_config.h.in by configure. */
+/* expat_config.h.in. Generated from configure.ac by autoheader. */
+
+#ifndef EXPAT_CONFIG_H
+#define EXPAT_CONFIG_H 1
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* 1234 = LILENDIAN, 4321 = BIGENDIAN */
+#define BYTEORDER 1234
+
+/* Define to 1 if you have the `arc4random' function. */
+/* #undef HAVE_ARC4RANDOM */
+
+/* Define to 1 if you have the `arc4random_buf' function. */
+#define HAVE_ARC4RANDOM_BUF 1
+
+/* define if the compiler supports basic C++11 syntax */
+#define HAVE_CXX11 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `getrandom' function. */
+#define HAVE_GETRANDOM 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `bsd' library (-lbsd). */
+/* #undef HAVE_LIBBSD */
+
+/* Define to 1 if you have a working `mmap' system call. */
+#define HAVE_MMAP 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have `syscall' and `SYS_getrandom'. */
+#define HAVE_SYSCALL_GETRANDOM 1
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "expat"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "https://github.com/libexpat/libexpat/issues"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "expat"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "expat 2.7.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "expat"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.7.1"
+
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#define STDC_HEADERS 1
+
+/* Version number of package */
+#define VERSION "2.7.1"
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+/* # undef WORDS_BIGENDIAN */
+# endif
+#endif
+
+/* Define to allow retrieving the byte offsets for attribute names and values.
+ */
+/* #undef XML_ATTR_INFO */
+
+/* Define to specify how much context to retain around the current parse
+ point, 0 to disable. */
+#define XML_CONTEXT_BYTES 1024
+
+/* Define to include code reading entropy from `/dev/urandom'. */
+#define XML_DEV_URANDOM 1
+
+/* Define to make parameter entity parsing functionality available. */
+#define XML_DTD 1
+
+/* Define as 1/0 to enable/disable support for general entities. */
+#define XML_GE 1
+
+/* Define to make XML Namespaces functionality available. */
+#define XML_NS 1
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `long int' if <sys/types.h> does not define. */
+/* #undef off_t */
+
+#endif // ndef EXPAT_CONFIG_H
diff --git a/3rdparty/expat/expat_config.h.cmake b/3rdparty/expat/expat_config.h.cmake
index 173fed168c1..43df67aefde 100644
--- a/3rdparty/expat/expat_config.h.cmake
+++ b/3rdparty/expat/expat_config.h.cmake
@@ -1,5 +1,8 @@
/* expat_config.h.cmake. Based upon generated expat_config.h.in. */
+#ifndef EXPAT_CONFIG_H
+#define EXPAT_CONFIG_H 1
+
/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */
#cmakedefine BYTEORDER @BYTEORDER@
@@ -79,7 +82,9 @@
#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@"
/* Define to 1 if you have the ANSI C header files. */
+#ifndef STDC_HEADERS
#cmakedefine STDC_HEADERS
+#endif
/* whether byteorder is bigendian */
#cmakedefine WORDS_BIGENDIAN
@@ -89,17 +94,20 @@
#cmakedefine XML_ATTR_INFO
/* Define to specify how much context to retain around the current parse
- point. */
-#cmakedefine XML_CONTEXT_BYTES @XML_CONTEXT_BYTES@
+ point, 0 to disable. */
+#define XML_CONTEXT_BYTES @XML_CONTEXT_BYTES@
#if ! defined(_WIN32)
/* Define to include code reading entropy from `/dev/urandom'. */
- #cmakedefine XML_DEV_URANDOM
+#cmakedefine XML_DEV_URANDOM
#endif
/* Define to make parameter entity parsing functionality available. */
#cmakedefine XML_DTD
+/* Define as 1/0 to enable/disable support for general entities. */
+#define XML_GE @XML_GE@
+
/* Define to make XML Namespaces functionality available. */
#cmakedefine XML_NS
@@ -109,7 +117,6 @@
#endif
/* Define to `long' if <sys/types.h> does not define. */
-#cmakedefine off_t @OFF_T@
+#cmakedefine off_t @off_t@
-/* Define to `unsigned' if <sys/types.h> does not define. */
-#cmakedefine size_t @SIZE_T@
+#endif // ndef EXPAT_CONFIG_H
diff --git a/3rdparty/expat/expat_config.h.in b/3rdparty/expat/expat_config.h.in
index 59207b42e41..67ef89c7171 100644
--- a/3rdparty/expat/expat_config.h.in
+++ b/3rdparty/expat/expat_config.h.in
@@ -1,5 +1,8 @@
/* expat_config.h.in. Generated from configure.ac by autoheader. */
+#ifndef EXPAT_CONFIG_H
+#define EXPAT_CONFIG_H 1
+
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
@@ -12,6 +15,9 @@
/* Define to 1 if you have the `arc4random_buf' function. */
#undef HAVE_ARC4RANDOM_BUF
+/* define if the compiler supports basic C++11 syntax */
+#undef HAVE_CXX11
+
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
@@ -30,15 +36,15 @@
/* Define to 1 if you have the `bsd' library (-lbsd). */
#undef HAVE_LIBBSD
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
/* Define to 1 if you have a working `mmap' system call. */
#undef HAVE_MMAP
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
@@ -87,7 +93,9 @@
/* Define to the version of this package. */
#undef PACKAGE_VERSION
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
#undef STDC_HEADERS
/* Version number of package */
@@ -110,7 +118,7 @@
#undef XML_ATTR_INFO
/* Define to specify how much context to retain around the current parse
- point. */
+ point, 0 to disable. */
#undef XML_CONTEXT_BYTES
/* Define to include code reading entropy from `/dev/urandom'. */
@@ -119,6 +127,9 @@
/* Define to make parameter entity parsing functionality available. */
#undef XML_DTD
+/* Define as 1/0 to enable/disable support for general entities. */
+#undef XML_GE
+
/* Define to make XML Namespaces functionality available. */
#undef XML_NS
@@ -128,5 +139,4 @@
/* Define to `long int' if <sys/types.h> does not define. */
#undef off_t
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
+#endif // ndef EXPAT_CONFIG_H
diff --git a/3rdparty/expat/fix-xmltest-log.sh b/3rdparty/expat/fix-xmltest-log.sh
index c143e93cf20..4739acab6b0 100755
--- a/3rdparty/expat/fix-xmltest-log.sh
+++ b/3rdparty/expat/fix-xmltest-log.sh
@@ -6,7 +6,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2019 Expat development team
+# Copyright (c) 2019-2022 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -32,17 +33,18 @@ set -e
filename="${1:-tests/xmltest.log}"
-dos2unix "${filename}"
-
-tempfile="$(mktemp)"
-sed \
+sed -i.bak \
+ -e '# convert DOS line endings to Unix without resorting to dos2unix' \
+ -e $'s/\r//' \
+ \
-e 's/^wine: Call .* msvcrt\.dll\._wperror, aborting$/ibm49i02.dtd: No such file or directory/' \
\
-e '/^wine: /d' \
-e '/^Application tried to create a window, but no driver could be loaded.$/d' \
-e '/^Make sure that your X server is running and that $DISPLAY is set correctly.$/d' \
-e '/^err:systray:initialize_systray Could not create tray window$/d' \
+ -e '/^[0-9a-f]\+:err:/d' \
+ -e '/^wine client error:/d' \
-e '/^In ibm\/invalid\/P49\/: Unhandled exception: unimplemented .\+/d' \
\
- "${filename}" > "${tempfile}"
-mv "${tempfile}" "${filename}"
+ "${filename}"
diff --git a/3rdparty/expat/fuzz/xml_lpm_fuzzer.cpp b/3rdparty/expat/fuzz/xml_lpm_fuzzer.cpp
new file mode 100644
index 00000000000..f52ea7b21e4
--- /dev/null
+++ b/3rdparty/expat/fuzz/xml_lpm_fuzzer.cpp
@@ -0,0 +1,464 @@
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2022 Mark Brand <markbrand@google.com>
+ Copyright (c) 2025 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(NDEBUG)
+# undef NDEBUG // because checks below rely on assert(...)
+#endif
+
+#include <assert.h>
+#include <stdint.h>
+#include <vector>
+
+#include "expat.h"
+#include "xml_lpm_fuzzer.pb.h"
+#include "src/libfuzzer/libfuzzer_macro.h"
+
+static const char *g_encoding = nullptr;
+static const char *g_external_entity = nullptr;
+static size_t g_external_entity_size = 0;
+
+void
+SetEncoding(const xml_lpm_fuzzer::Encoding &e) {
+ switch (e) {
+ case xml_lpm_fuzzer::Encoding::UTF8:
+ g_encoding = "UTF-8";
+ break;
+
+ case xml_lpm_fuzzer::Encoding::UTF16:
+ g_encoding = "UTF-16";
+ break;
+
+ case xml_lpm_fuzzer::Encoding::ISO88591:
+ g_encoding = "ISO-8859-1";
+ break;
+
+ case xml_lpm_fuzzer::Encoding::ASCII:
+ g_encoding = "US-ASCII";
+ break;
+
+ case xml_lpm_fuzzer::Encoding::NONE:
+ g_encoding = NULL;
+ break;
+
+ default:
+ g_encoding = "UNKNOWN";
+ break;
+ }
+}
+
+static int g_allocation_count = 0;
+static std::vector<int> g_fail_allocations = {};
+
+void *
+MallocHook(size_t size) {
+ g_allocation_count += 1;
+ for (auto index : g_fail_allocations) {
+ if (index == g_allocation_count) {
+ return NULL;
+ }
+ }
+ return malloc(size);
+}
+
+void *
+ReallocHook(void *ptr, size_t size) {
+ g_allocation_count += 1;
+ for (auto index : g_fail_allocations) {
+ if (index == g_allocation_count) {
+ return NULL;
+ }
+ }
+ return realloc(ptr, size);
+}
+
+void
+FreeHook(void *ptr) {
+ free(ptr);
+}
+
+XML_Memory_Handling_Suite memory_handling_suite
+ = {MallocHook, ReallocHook, FreeHook};
+
+void InitializeParser(XML_Parser parser);
+
+// We want a parse function that supports resumption, so that we can cover the
+// suspend/resume code.
+enum XML_Status
+Parse(XML_Parser parser, const char *input, int input_len, int is_final) {
+ enum XML_Status status = XML_Parse(parser, input, input_len, is_final);
+ while (status == XML_STATUS_SUSPENDED) {
+ status = XML_ResumeParser(parser);
+ }
+ return status;
+}
+
+// When the fuzzer is compiled with instrumentation such as ASan, then the
+// accesses in TouchString will fault if they access invalid memory (ie. detect
+// either a use-after-free or buffer-overflow). By calling TouchString in each
+// of the callbacks, we can check that the arguments meet the API specifications
+// in terms of length/null-termination. no_optimize is used to ensure that the
+// compiler has to emit actual memory reads, instead of removing them.
+static volatile size_t no_optimize = 0;
+static void
+TouchString(const XML_Char *ptr, int len = -1) {
+ if (! ptr) {
+ return;
+ }
+
+ if (len == -1) {
+ for (XML_Char value = *ptr++; value; value = *ptr++) {
+ no_optimize += value;
+ }
+ } else {
+ for (int i = 0; i < len; ++i) {
+ no_optimize += ptr[i];
+ }
+ }
+}
+
+static void
+TouchNodeAndRecurse(XML_Content *content) {
+ switch (content->type) {
+ case XML_CTYPE_EMPTY:
+ case XML_CTYPE_ANY:
+ assert(content->quant == XML_CQUANT_NONE);
+ assert(content->name == NULL);
+ assert(content->numchildren == 0);
+ assert(content->children == NULL);
+ break;
+
+ case XML_CTYPE_MIXED:
+ assert(content->quant == XML_CQUANT_NONE
+ || content->quant == XML_CQUANT_REP);
+ assert(content->name == NULL);
+ for (unsigned int i = 0; i < content->numchildren; ++i) {
+ assert(content->children[i].type == XML_CTYPE_NAME);
+ assert(content->children[i].quant == XML_CQUANT_NONE);
+ assert(content->children[i].numchildren == 0);
+ assert(content->children[i].children == NULL);
+ TouchString(content->children[i].name);
+ }
+ break;
+
+ case XML_CTYPE_NAME:
+ assert((content->quant == XML_CQUANT_NONE)
+ || (content->quant == XML_CQUANT_OPT)
+ || (content->quant == XML_CQUANT_REP)
+ || (content->quant == XML_CQUANT_PLUS));
+ assert(content->numchildren == 0);
+ assert(content->children == NULL);
+ TouchString(content->name);
+ break;
+
+ case XML_CTYPE_CHOICE:
+ case XML_CTYPE_SEQ:
+ assert((content->quant == XML_CQUANT_NONE)
+ || (content->quant == XML_CQUANT_OPT)
+ || (content->quant == XML_CQUANT_REP)
+ || (content->quant == XML_CQUANT_PLUS));
+ assert(content->name == NULL);
+ for (unsigned int i = 0; i < content->numchildren; ++i) {
+ TouchNodeAndRecurse(&content->children[i]);
+ }
+ break;
+
+ default:
+ assert(false);
+ }
+}
+
+static void XMLCALL
+ElementDeclHandler(void *userData, const XML_Char *name, XML_Content *model) {
+ TouchString(name);
+ TouchNodeAndRecurse(model);
+ XML_FreeContentModel((XML_Parser)userData, model);
+}
+
+static void XMLCALL
+AttlistDeclHandler(void *userData, const XML_Char *elname,
+ const XML_Char *attname, const XML_Char *atttype,
+ const XML_Char *dflt, int isrequired) {
+ (void)userData;
+ TouchString(elname);
+ TouchString(attname);
+ TouchString(atttype);
+ TouchString(dflt);
+ (void)isrequired;
+}
+
+static void XMLCALL
+XmlDeclHandler(void *userData, const XML_Char *version,
+ const XML_Char *encoding, int standalone) {
+ (void)userData;
+ TouchString(version);
+ TouchString(encoding);
+ (void)standalone;
+}
+
+static void XMLCALL
+StartElementHandler(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ (void)userData;
+ TouchString(name);
+ for (size_t i = 0; atts[i] != NULL; ++i) {
+ TouchString(atts[i]);
+ }
+}
+
+static void XMLCALL
+EndElementHandler(void *userData, const XML_Char *name) {
+ (void)userData;
+ TouchString(name);
+}
+
+static void XMLCALL
+CharacterDataHandler(void *userData, const XML_Char *s, int len) {
+ (void)userData;
+ TouchString(s, len);
+}
+
+static void XMLCALL
+ProcessingInstructionHandler(void *userData, const XML_Char *target,
+ const XML_Char *data) {
+ (void)userData;
+ TouchString(target);
+ TouchString(data);
+}
+
+static void XMLCALL
+CommentHandler(void *userData, const XML_Char *data) {
+ TouchString(data);
+ // Use the comment handler to trigger parser suspend, so that we can get
+ // coverage of that code.
+ XML_StopParser((XML_Parser)userData, XML_TRUE);
+}
+
+static void XMLCALL
+StartCdataSectionHandler(void *userData) {
+ (void)userData;
+}
+
+static void XMLCALL
+EndCdataSectionHandler(void *userData) {
+ (void)userData;
+}
+
+static void XMLCALL
+DefaultHandler(void *userData, const XML_Char *s, int len) {
+ (void)userData;
+ TouchString(s, len);
+}
+
+static void XMLCALL
+StartDoctypeDeclHandler(void *userData, const XML_Char *doctypeName,
+ const XML_Char *sysid, const XML_Char *pubid,
+ int has_internal_subset) {
+ (void)userData;
+ TouchString(doctypeName);
+ TouchString(sysid);
+ TouchString(pubid);
+ (void)has_internal_subset;
+}
+
+static void XMLCALL
+EndDoctypeDeclHandler(void *userData) {
+ (void)userData;
+}
+
+static void XMLCALL
+EntityDeclHandler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity, const XML_Char *value,
+ int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName) {
+ (void)userData;
+ TouchString(entityName);
+ (void)is_parameter_entity;
+ TouchString(value, value_length);
+ TouchString(base);
+ TouchString(systemId);
+ TouchString(publicId);
+ TouchString(notationName);
+}
+
+static void XMLCALL
+NotationDeclHandler(void *userData, const XML_Char *notationName,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ (void)userData;
+ TouchString(notationName);
+ TouchString(base);
+ TouchString(systemId);
+ TouchString(publicId);
+}
+
+static void XMLCALL
+StartNamespaceDeclHandler(void *userData, const XML_Char *prefix,
+ const XML_Char *uri) {
+ (void)userData;
+ TouchString(prefix);
+ TouchString(uri);
+}
+
+static void XMLCALL
+EndNamespaceDeclHandler(void *userData, const XML_Char *prefix) {
+ (void)userData;
+ TouchString(prefix);
+}
+
+static int XMLCALL
+NotStandaloneHandler(void *userData) {
+ (void)userData;
+ return XML_STATUS_OK;
+}
+
+static int XMLCALL
+ExternalEntityRefHandler(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ int rc = XML_STATUS_ERROR;
+ TouchString(context);
+ TouchString(base);
+ TouchString(systemId);
+ TouchString(publicId);
+
+ if (g_external_entity) {
+ XML_Parser ext_parser
+ = XML_ExternalEntityParserCreate(parser, context, g_encoding);
+ rc = Parse(ext_parser, g_external_entity, g_external_entity_size, 1);
+ XML_ParserFree(ext_parser);
+ }
+
+ return rc;
+}
+
+static void XMLCALL
+SkippedEntityHandler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity) {
+ (void)userData;
+ TouchString(entityName);
+ (void)is_parameter_entity;
+}
+
+static int XMLCALL
+UnknownEncodingHandler(void *encodingHandlerData, const XML_Char *name,
+ XML_Encoding *info) {
+ (void)encodingHandlerData;
+ TouchString(name);
+ (void)info;
+ return XML_STATUS_ERROR;
+}
+
+void
+InitializeParser(XML_Parser parser) {
+ XML_SetUserData(parser, (void *)parser);
+ XML_SetHashSalt(parser, 0x41414141);
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+
+ XML_SetElementDeclHandler(parser, ElementDeclHandler);
+ XML_SetAttlistDeclHandler(parser, AttlistDeclHandler);
+ XML_SetXmlDeclHandler(parser, XmlDeclHandler);
+ XML_SetElementHandler(parser, StartElementHandler, EndElementHandler);
+ XML_SetCharacterDataHandler(parser, CharacterDataHandler);
+ XML_SetProcessingInstructionHandler(parser, ProcessingInstructionHandler);
+ XML_SetCommentHandler(parser, CommentHandler);
+ XML_SetCdataSectionHandler(parser, StartCdataSectionHandler,
+ EndCdataSectionHandler);
+ // XML_SetDefaultHandler disables entity expansion
+ XML_SetDefaultHandlerExpand(parser, DefaultHandler);
+ XML_SetDoctypeDeclHandler(parser, StartDoctypeDeclHandler,
+ EndDoctypeDeclHandler);
+ // Note: This is mutually exclusive with XML_SetUnparsedEntityDeclHandler,
+ // and there isn't any significant code change between the two.
+ XML_SetEntityDeclHandler(parser, EntityDeclHandler);
+ XML_SetNotationDeclHandler(parser, NotationDeclHandler);
+ XML_SetNamespaceDeclHandler(parser, StartNamespaceDeclHandler,
+ EndNamespaceDeclHandler);
+ XML_SetNotStandaloneHandler(parser, NotStandaloneHandler);
+ XML_SetExternalEntityRefHandler(parser, ExternalEntityRefHandler);
+ XML_SetSkippedEntityHandler(parser, SkippedEntityHandler);
+ XML_SetUnknownEncodingHandler(parser, UnknownEncodingHandler, (void *)parser);
+}
+
+DEFINE_TEXT_PROTO_FUZZER(const xml_lpm_fuzzer::Testcase &testcase) {
+ g_external_entity = nullptr;
+
+ if (! testcase.actions_size()) {
+ return;
+ }
+
+ g_allocation_count = 0;
+ g_fail_allocations.clear();
+ for (int i = 0; i < testcase.fail_allocations_size(); ++i) {
+ g_fail_allocations.push_back(testcase.fail_allocations(i));
+ }
+
+ SetEncoding(testcase.encoding());
+ XML_Parser parser
+ = XML_ParserCreate_MM(g_encoding, &memory_handling_suite, "|");
+ InitializeParser(parser);
+
+ for (int i = 0; i < testcase.actions_size(); ++i) {
+ const auto &action = testcase.actions(i);
+ switch (action.action_case()) {
+ case xml_lpm_fuzzer::Action::kChunk:
+ if (XML_STATUS_ERROR
+ == Parse(parser, action.chunk().data(), action.chunk().size(), 0)) {
+ // Force a reset after parse error.
+ XML_ParserReset(parser, g_encoding);
+ InitializeParser(parser);
+ }
+ break;
+
+ case xml_lpm_fuzzer::Action::kLastChunk:
+ Parse(parser, action.last_chunk().data(), action.last_chunk().size(), 1);
+ XML_ParserReset(parser, g_encoding);
+ InitializeParser(parser);
+ break;
+
+ case xml_lpm_fuzzer::Action::kReset:
+ XML_ParserReset(parser, g_encoding);
+ InitializeParser(parser);
+ break;
+
+ case xml_lpm_fuzzer::Action::kExternalEntity:
+ g_external_entity = action.external_entity().data();
+ g_external_entity_size = action.external_entity().size();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ XML_ParserFree(parser);
+}
diff --git a/3rdparty/expat/fuzz/xml_lpm_fuzzer.proto b/3rdparty/expat/fuzz/xml_lpm_fuzzer.proto
new file mode 100644
index 00000000000..ddc4e958b91
--- /dev/null
+++ b/3rdparty/expat/fuzz/xml_lpm_fuzzer.proto
@@ -0,0 +1,58 @@
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2022 Mark Brand <markbrand@google.com>
+ Copyright (c) 2025 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+syntax = "proto2";
+package xml_lpm_fuzzer;
+
+enum Encoding {
+ UTF8 = 0;
+ UTF16 = 1;
+ ISO88591 = 2;
+ ASCII = 3;
+ UNKNOWN = 4;
+ NONE = 5;
+}
+
+message Action {
+ oneof action {
+ string chunk = 1;
+ string last_chunk = 2;
+ bool reset = 3;
+ string external_entity = 4;
+ }
+}
+
+message Testcase {
+ required Encoding encoding = 1;
+ repeated Action actions = 2;
+ repeated int32 fail_allocations = 3;
+}
diff --git a/3rdparty/expat/fuzz/xml_parse_fuzzer.c b/3rdparty/expat/fuzz/xml_parse_fuzzer.c
new file mode 100644
index 00000000000..6a1affe2b1f
--- /dev/null
+++ b/3rdparty/expat/fuzz/xml_parse_fuzzer.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <assert.h>
+#include <stdint.h>
+
+#include "expat.h"
+#include "siphash.h"
+
+// Macros to convert preprocessor macros to string literals. See
+// https://gcc.gnu.org/onlinedocs/gcc-3.4.3/cpp/Stringification.html
+#define xstr(s) str(s)
+#define str(s) #s
+
+// The encoder type that we wish to fuzz should come from the compile-time
+// definition `ENCODING_FOR_FUZZING`. This allows us to have a separate fuzzer
+// binary for
+#ifndef ENCODING_FOR_FUZZING
+# error "ENCODING_FOR_FUZZING was not provided to this fuzz target."
+#endif
+
+// 16-byte deterministic hash key.
+static unsigned char hash_key[16] = "FUZZING IS FUN!";
+
+static void XMLCALL
+start(void *userData, const XML_Char *name, const XML_Char **atts) {
+ (void)userData;
+ (void)name;
+ (void)atts;
+}
+static void XMLCALL
+end(void *userData, const XML_Char *name) {
+ (void)userData;
+ (void)name;
+}
+
+static void XMLCALL
+may_stop_character_handler(void *userData, const XML_Char *s, int len) {
+ XML_Parser parser = (XML_Parser)userData;
+ if (len > 1 && s[0] == 's') {
+ XML_StopParser(parser, s[1] == 'r' ? XML_FALSE : XML_TRUE);
+ }
+}
+
+static void
+ParseOneInput(XML_Parser p, const uint8_t *data, size_t size) {
+ // Set the hash salt using siphash to generate a deterministic hash.
+ struct sipkey *key = sip_keyof(hash_key);
+ XML_SetHashSalt(p, (unsigned long)siphash24(data, size, key));
+ (void)sip24_valid;
+
+ XML_SetUserData(p, p);
+ XML_SetElementHandler(p, start, end);
+ XML_SetCharacterDataHandler(p, may_stop_character_handler);
+ XML_Parse(p, (const XML_Char *)data, size, 0);
+ if (XML_Parse(p, (const XML_Char *)data, size, 1) == XML_STATUS_ERROR) {
+ XML_ErrorString(XML_GetErrorCode(p));
+ }
+ XML_GetCurrentLineNumber(p);
+ if (size % 2) {
+ XML_ParserReset(p, NULL);
+ }
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ XML_Parser parentParser = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
+ assert(parentParser);
+ ParseOneInput(parentParser, data, size);
+ // not freed yet, but used later and freed then
+
+ XML_Parser namespaceParser = XML_ParserCreateNS(NULL, '!');
+ assert(namespaceParser);
+ ParseOneInput(namespaceParser, data, size);
+ XML_ParserFree(namespaceParser);
+
+ XML_Parser externalEntityParser
+ = XML_ExternalEntityParserCreate(parentParser, "e1", NULL);
+ assert(externalEntityParser);
+ ParseOneInput(externalEntityParser, data, size);
+ XML_ParserFree(externalEntityParser);
+
+ XML_Parser externalDtdParser
+ = XML_ExternalEntityParserCreate(parentParser, NULL, NULL);
+ assert(externalDtdParser);
+ ParseOneInput(externalDtdParser, data, size);
+ XML_ParserFree(externalDtdParser);
+
+ // finally frees this parser which served as parent
+ XML_ParserFree(parentParser);
+ return 0;
+}
diff --git a/3rdparty/expat/fuzz/xml_parsebuffer_fuzzer.c b/3rdparty/expat/fuzz/xml_parsebuffer_fuzzer.c
new file mode 100644
index 00000000000..cfc4af20285
--- /dev/null
+++ b/3rdparty/expat/fuzz/xml_parsebuffer_fuzzer.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <assert.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "expat.h"
+#include "siphash.h"
+
+// Macros to convert preprocessor macros to string literals. See
+// https://gcc.gnu.org/onlinedocs/gcc-3.4.3/cpp/Stringification.html
+#define xstr(s) str(s)
+#define str(s) #s
+
+// The encoder type that we wish to fuzz should come from the compile-time
+// definition `ENCODING_FOR_FUZZING`. This allows us to have a separate fuzzer
+// binary for
+#ifndef ENCODING_FOR_FUZZING
+# error "ENCODING_FOR_FUZZING was not provided to this fuzz target."
+#endif
+
+// 16-byte deterministic hash key.
+static unsigned char hash_key[16] = "FUZZING IS FUN!";
+
+static void XMLCALL
+start(void *userData, const XML_Char *name, const XML_Char **atts) {
+ (void)userData;
+ (void)name;
+ (void)atts;
+}
+static void XMLCALL
+end(void *userData, const XML_Char *name) {
+ (void)userData;
+ (void)name;
+}
+
+static void XMLCALL
+may_stop_character_handler(void *userData, const XML_Char *s, int len) {
+ XML_Parser parser = (XML_Parser)userData;
+ if (len > 1 && s[0] == 's') {
+ XML_StopParser(parser, s[1] == 'r' ? XML_FALSE : XML_TRUE);
+ }
+}
+
+static void
+ParseOneInput(XML_Parser p, const uint8_t *data, size_t size) {
+ // Set the hash salt using siphash to generate a deterministic hash.
+ struct sipkey *key = sip_keyof(hash_key);
+ XML_SetHashSalt(p, (unsigned long)siphash24(data, size, key));
+ (void)sip24_valid;
+
+ XML_SetUserData(p, p);
+ XML_SetElementHandler(p, start, end);
+ XML_SetCharacterDataHandler(p, may_stop_character_handler);
+ void *buf = XML_GetBuffer(p, size);
+ assert(buf);
+ memcpy(buf, data, size);
+ XML_ParseBuffer(p, size, 0);
+ buf = XML_GetBuffer(p, size);
+ if (buf == NULL) {
+ return;
+ }
+ memcpy(buf, data, size);
+ if (XML_ParseBuffer(p, size, 1) == XML_STATUS_ERROR) {
+ XML_ErrorString(XML_GetErrorCode(p));
+ }
+ XML_GetCurrentLineNumber(p);
+ if (size % 2) {
+ XML_ParserReset(p, NULL);
+ }
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ if (size == 0)
+ return 0;
+
+ XML_Parser parentParser = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
+ assert(parentParser);
+ ParseOneInput(parentParser, data, size);
+ // not freed yet, but used later and freed then
+
+ XML_Parser namespaceParser = XML_ParserCreateNS(NULL, '!');
+ assert(namespaceParser);
+ ParseOneInput(namespaceParser, data, size);
+ XML_ParserFree(namespaceParser);
+
+ XML_Parser externalEntityParser
+ = XML_ExternalEntityParserCreate(parentParser, "e1", NULL);
+ assert(externalEntityParser);
+ ParseOneInput(externalEntityParser, data, size);
+ XML_ParserFree(externalEntityParser);
+
+ XML_Parser externalDtdParser
+ = XML_ExternalEntityParserCreate(parentParser, NULL, NULL);
+ assert(externalDtdParser);
+ ParseOneInput(externalDtdParser, data, size);
+ XML_ParserFree(externalDtdParser);
+
+ // finally frees this parser which served as parent
+ XML_ParserFree(parentParser);
+ return 0;
+}
diff --git a/3rdparty/expat/lib/Makefile.am b/3rdparty/expat/lib/Makefile.am
index 05343e235d8..1958f322f31 100644
--- a/3rdparty/expat/lib/Makefile.am
+++ b/3rdparty/expat/lib/Makefile.am
@@ -6,7 +6,9 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017 Tomasz Kłoczko <kloczek@fedoraproject.org>
+# Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -34,9 +36,13 @@ include_HEADERS = \
expat_external.h
lib_LTLIBRARIES = libexpat.la
+if WITH_TESTS
+noinst_LTLIBRARIES = libtestpat.la
+endif
libexpat_la_LDFLAGS = \
@AM_LDFLAGS@ \
+ @LIBM@ \
-no-undefined \
-version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@
@@ -45,6 +51,12 @@ libexpat_la_SOURCES = \
xmltok.c \
xmlrole.c
+if WITH_TESTS
+libtestpat_la_CPPFLAGS = -DXML_TESTING
+
+libtestpat_la_SOURCES = $(libexpat_la_SOURCES)
+endif
+
doc_DATA = \
../AUTHORS \
../Changes
@@ -63,8 +75,7 @@ EXTRA_DIST = \
iasciitab.h \
internal.h \
latin1tab.h \
- libexpat.def \
- libexpatw.def \
+ libexpat.def.cmake \
nametab.h \
siphash.h \
utf8tab.h \
diff --git a/3rdparty/expat/lib/Makefile.in b/3rdparty/expat/lib/Makefile.in
index 10f20d5533d..1a97e85fc41 100644
--- a/3rdparty/expat/lib/Makefile.in
+++ b/3rdparty/expat/lib/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,9 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017 Tomasz Kłoczko <kloczek@fedoraproject.org>
+# Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -133,6 +135,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
@@ -171,7 +175,7 @@ am__uninstall_files_from_dir = { \
}
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(docdir)" \
"$(DESTDIR)$(includedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
libexpat_la_LIBADD =
am_libexpat_la_OBJECTS = xmlparse.lo xmltok.lo xmlrole.lo
libexpat_la_OBJECTS = $(am_libexpat_la_OBJECTS)
@@ -182,6 +186,13 @@ am__v_lt_1 =
libexpat_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libexpat_la_LDFLAGS) $(LDFLAGS) -o $@
+libtestpat_la_LIBADD =
+am__libtestpat_la_SOURCES_DIST = xmlparse.c xmltok.c xmlrole.c
+am__objects_1 = libtestpat_la-xmlparse.lo libtestpat_la-xmltok.lo \
+ libtestpat_la-xmlrole.lo
+@WITH_TESTS_TRUE@am_libtestpat_la_OBJECTS = $(am__objects_1)
+libtestpat_la_OBJECTS = $(am_libtestpat_la_OBJECTS)
+@WITH_TESTS_TRUE@am_libtestpat_la_rpath =
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
@@ -197,8 +208,10 @@ am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/conftools/depcomp
am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/xmlparse.Plo ./$(DEPDIR)/xmlrole.Plo \
- ./$(DEPDIR)/xmltok.Plo
+am__depfiles_remade = ./$(DEPDIR)/libtestpat_la-xmlparse.Plo \
+ ./$(DEPDIR)/libtestpat_la-xmlrole.Plo \
+ ./$(DEPDIR)/libtestpat_la-xmltok.Plo ./$(DEPDIR)/xmlparse.Plo \
+ ./$(DEPDIR)/xmlrole.Plo ./$(DEPDIR)/xmltok.Plo
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -218,8 +231,9 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = $(libexpat_la_SOURCES)
-DIST_SOURCES = $(libexpat_la_SOURCES)
+SOURCES = $(libexpat_la_SOURCES) $(libtestpat_la_SOURCES)
+DIST_SOURCES = $(libexpat_la_SOURCES) \
+ $(am__libtestpat_la_SOURCES_DIST)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -244,8 +258,6 @@ am__define_uniq_tagged_files = \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
am__DIST_COMMON = $(srcdir)/Makefile.in \
$(top_srcdir)/conftools/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -265,8 +277,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -282,10 +296,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -295,6 +319,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -303,6 +329,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -324,9 +351,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -387,8 +417,10 @@ include_HEADERS = \
expat_external.h
lib_LTLIBRARIES = libexpat.la
+@WITH_TESTS_TRUE@noinst_LTLIBRARIES = libtestpat.la
libexpat_la_LDFLAGS = \
@AM_LDFLAGS@ \
+ @LIBM@ \
-no-undefined \
-version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@
@@ -397,6 +429,8 @@ libexpat_la_SOURCES = \
xmltok.c \
xmlrole.c
+@WITH_TESTS_TRUE@libtestpat_la_CPPFLAGS = -DXML_TESTING
+@WITH_TESTS_TRUE@libtestpat_la_SOURCES = $(libexpat_la_SOURCES)
doc_DATA = \
../AUTHORS \
../Changes
@@ -409,8 +443,7 @@ EXTRA_DIST = \
iasciitab.h \
internal.h \
latin1tab.h \
- libexpat.def \
- libexpatw.def \
+ libexpat.def.cmake \
nametab.h \
siphash.h \
utf8tab.h \
@@ -425,7 +458,7 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -449,9 +482,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
@@ -490,15 +523,32 @@ clean-libLTLIBRARIES:
rm -f $${locs}; \
}
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
libexpat.la: $(libexpat_la_OBJECTS) $(libexpat_la_DEPENDENCIES) $(EXTRA_libexpat_la_DEPENDENCIES)
$(AM_V_CCLD)$(libexpat_la_LINK) -rpath $(libdir) $(libexpat_la_OBJECTS) $(libexpat_la_LIBADD) $(LIBS)
+libtestpat.la: $(libtestpat_la_OBJECTS) $(libtestpat_la_DEPENDENCIES) $(EXTRA_libtestpat_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(LINK) $(am_libtestpat_la_rpath) $(libtestpat_la_OBJECTS) $(libtestpat_la_LIBADD) $(LIBS)
+
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtestpat_la-xmlparse.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtestpat_la-xmlrole.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtestpat_la-xmltok.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlparse.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlrole.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmltok.Plo@am__quote@ # am--include-marker
@@ -530,6 +580,27 @@ am--depfiles: $(am__depfiles_remade)
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+libtestpat_la-xmlparse.lo: xmlparse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtestpat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtestpat_la-xmlparse.lo -MD -MP -MF $(DEPDIR)/libtestpat_la-xmlparse.Tpo -c -o libtestpat_la-xmlparse.lo `test -f 'xmlparse.c' || echo '$(srcdir)/'`xmlparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtestpat_la-xmlparse.Tpo $(DEPDIR)/libtestpat_la-xmlparse.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xmlparse.c' object='libtestpat_la-xmlparse.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtestpat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtestpat_la-xmlparse.lo `test -f 'xmlparse.c' || echo '$(srcdir)/'`xmlparse.c
+
+libtestpat_la-xmltok.lo: xmltok.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtestpat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtestpat_la-xmltok.lo -MD -MP -MF $(DEPDIR)/libtestpat_la-xmltok.Tpo -c -o libtestpat_la-xmltok.lo `test -f 'xmltok.c' || echo '$(srcdir)/'`xmltok.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtestpat_la-xmltok.Tpo $(DEPDIR)/libtestpat_la-xmltok.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xmltok.c' object='libtestpat_la-xmltok.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtestpat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtestpat_la-xmltok.lo `test -f 'xmltok.c' || echo '$(srcdir)/'`xmltok.c
+
+libtestpat_la-xmlrole.lo: xmlrole.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtestpat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtestpat_la-xmlrole.lo -MD -MP -MF $(DEPDIR)/libtestpat_la-xmlrole.Tpo -c -o libtestpat_la-xmlrole.lo `test -f 'xmlrole.c' || echo '$(srcdir)/'`xmlrole.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtestpat_la-xmlrole.Tpo $(DEPDIR)/libtestpat_la-xmlrole.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xmlrole.c' object='libtestpat_la-xmlrole.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtestpat_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtestpat_la-xmlrole.lo `test -f 'xmlrole.c' || echo '$(srcdir)/'`xmlrole.c
+
mostlyclean-libtool:
-rm -f *.lo
@@ -629,7 +700,6 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
@@ -703,10 +773,13 @@ maintainer-clean-generic:
clean: clean-am
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
- mostlyclean-am
+ clean-noinstLTLIBRARIES mostlyclean-am
distclean: distclean-am
- -rm -f ./$(DEPDIR)/xmlparse.Plo
+ -rm -f ./$(DEPDIR)/libtestpat_la-xmlparse.Plo
+ -rm -f ./$(DEPDIR)/libtestpat_la-xmlrole.Plo
+ -rm -f ./$(DEPDIR)/libtestpat_la-xmltok.Plo
+ -rm -f ./$(DEPDIR)/xmlparse.Plo
-rm -f ./$(DEPDIR)/xmlrole.Plo
-rm -f ./$(DEPDIR)/xmltok.Plo
-rm -f Makefile
@@ -755,7 +828,10 @@ install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
- -rm -f ./$(DEPDIR)/xmlparse.Plo
+ -rm -f ./$(DEPDIR)/libtestpat_la-xmlparse.Plo
+ -rm -f ./$(DEPDIR)/libtestpat_la-xmlrole.Plo
+ -rm -f ./$(DEPDIR)/libtestpat_la-xmltok.Plo
+ -rm -f ./$(DEPDIR)/xmlparse.Plo
-rm -f ./$(DEPDIR)/xmlrole.Plo
-rm -f ./$(DEPDIR)/xmltok.Plo
-rm -f Makefile
@@ -780,16 +856,17 @@ uninstall-am: uninstall-docDATA uninstall-includeHEADERS \
.MAKE: install-am install-data-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
- clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
- ctags ctags-am distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-data-hook install-docDATA install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-includeHEADERS install-info \
- install-info-am install-libLTLIBRARIES install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
+ clean-generic clean-libLTLIBRARIES clean-libtool \
+ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am \
+ install-data-hook install-docDATA install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-includeHEADERS install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags tags-am uninstall uninstall-am uninstall-docDATA \
diff --git a/3rdparty/expat/lib/ascii.h b/3rdparty/expat/lib/ascii.h
index c3587e57332..1f594d2e54b 100644
--- a/3rdparty/expat/lib/ascii.h
+++ b/3rdparty/expat/lib/ascii.h
@@ -6,8 +6,11 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 1999-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2007 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/asciitab.h b/3rdparty/expat/lib/asciitab.h
index 63b1d1b4482..af766fb2478 100644
--- a/3rdparty/expat/lib/asciitab.h
+++ b/3rdparty/expat/lib/asciitab.h
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/expat.h b/3rdparty/expat/lib/expat.h
index cb828db155f..610e1ddc0e9 100644
--- a/3rdparty/expat/lib/expat.h
+++ b/3rdparty/expat/lib/expat.h
@@ -7,7 +7,18 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2000-2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2016 Cristian Rodríguez <crrodriguez@opensuse.org>
+ Copyright (c) 2016 Thomas Beutlich <tc@tbeu.de>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2022 Thijs Schreijer <thijs@thijsschreijer.nl>
+ Copyright (c) 2023 Hanno Böck <hanno@gentoo.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Copyright (c) 2024 Taichi Haradaguchi <20001722@ymail.ne.jp>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -115,7 +126,13 @@ enum XML_Error {
XML_ERROR_RESERVED_PREFIX_XMLNS,
XML_ERROR_RESERVED_NAMESPACE_URI,
/* Added in 2.2.1. */
- XML_ERROR_INVALID_ARGUMENT
+ XML_ERROR_INVALID_ARGUMENT,
+ /* Added in 2.3.0. */
+ XML_ERROR_NO_BUFFER,
+ /* Added in 2.4.0. */
+ XML_ERROR_AMPLIFICATION_LIMIT_BREACH,
+ /* Added in 2.6.4. */
+ XML_ERROR_NOT_STARTED,
};
enum XML_Content_Type {
@@ -163,8 +180,10 @@ struct XML_cp {
};
/* This is called for an element declaration. See above for
- description of the model argument. It's the caller's responsibility
- to free model when finished with it.
+ description of the model argument. It's the user code's responsibility
+ to free model when finished with it. See XML_FreeContentModel.
+ There is no need to free the model from the handler, it can be kept
+ around and freed at a later stage.
*/
typedef void(XMLCALL *XML_ElementDeclHandler)(void *userData,
const XML_Char *name,
@@ -226,6 +245,17 @@ XML_ParserCreate(const XML_Char *encoding);
and the local part will be concatenated without any separator.
It is a programming error to use the separator '\0' with namespace
triplets (see XML_SetReturnNSTriplet).
+ If a namespace separator is chosen that can be part of a URI or
+ part of an XML name, splitting an expanded name back into its
+ 1, 2 or 3 original parts on application level in the element handler
+ may end up vulnerable, so these are advised against; sane choices for
+ a namespace separator are e.g. '\n' (line feed) and '|' (pipe).
+
+ Note that Expat does not validate namespace URIs (beyond encoding)
+ against RFC 3986 today (and is not required to do so with regard to
+ the XML 1.0 namespaces specification) but it may start doing that
+ in future releases. Before that, an application using Expat must
+ be ready to receive namespace URIs containing non-URI characters.
*/
XMLPARSEAPI(XML_Parser)
XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator);
@@ -244,7 +274,7 @@ XML_ParserCreate_MM(const XML_Char *encoding,
const XML_Memory_Handling_Suite *memsuite,
const XML_Char *namespaceSeparator);
-/* Prepare a parser object to be re-used. This is particularly
+/* Prepare a parser object to be reused. This is particularly
valuable when memory allocation overhead is disproportionately high,
such as when a large number of small documnents need to be parsed.
All handlers are cleared from the parser, except for the
@@ -306,7 +336,7 @@ typedef void(XMLCALL *XML_StartDoctypeDeclHandler)(void *userData,
const XML_Char *pubid,
int has_internal_subset);
-/* This is called for the start of the DOCTYPE declaration when the
+/* This is called for the end of the DOCTYPE declaration when the
closing > is encountered, but after processing any external
subset.
*/
@@ -513,7 +543,7 @@ typedef struct {
Otherwise it must return XML_STATUS_ERROR.
If info does not describe a suitable encoding, then the parser will
- return an XML_UNKNOWN_ENCODING error.
+ return an XML_ERROR_UNKNOWN_ENCODING error.
*/
typedef int(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData,
const XML_Char *name,
@@ -926,7 +956,7 @@ XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser);
XMLPARSEAPI(int)
XML_GetCurrentByteCount(XML_Parser parser);
-/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets
+/* If XML_CONTEXT_BYTES is >=1, returns the input buffer, sets
the integer pointed to by offset to the offset within this buffer
of the current parse position, and sets the integer pointed to by size
to the size of this buffer (the number of input bytes). Otherwise
@@ -997,7 +1027,12 @@ enum XML_FeatureEnum {
XML_FEATURE_SIZEOF_XML_LCHAR,
XML_FEATURE_NS,
XML_FEATURE_LARGE_SIZE,
- XML_FEATURE_ATTR_INFO
+ XML_FEATURE_ATTR_INFO,
+ /* Added in Expat 2.4.0. */
+ XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT,
+ XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT,
+ /* Added in Expat 2.6.0. */
+ XML_FEATURE_GE
/* Additional features must be added to the end of this enum. */
};
@@ -1010,12 +1045,30 @@ typedef struct {
XMLPARSEAPI(const XML_Feature *)
XML_GetFeatureList(void);
+#if defined(XML_DTD) || (defined(XML_GE) && XML_GE == 1)
+/* Added in Expat 2.4.0 for XML_DTD defined and
+ * added in Expat 2.6.0 for XML_GE == 1. */
+XMLPARSEAPI(XML_Bool)
+XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ XML_Parser parser, float maximumAmplificationFactor);
+
+/* Added in Expat 2.4.0 for XML_DTD defined and
+ * added in Expat 2.6.0 for XML_GE == 1. */
+XMLPARSEAPI(XML_Bool)
+XML_SetBillionLaughsAttackProtectionActivationThreshold(
+ XML_Parser parser, unsigned long long activationThresholdBytes);
+#endif
+
+/* Added in Expat 2.6.0. */
+XMLPARSEAPI(XML_Bool)
+XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled);
+
/* Expat follows the semantic versioning convention.
- See http://semver.org.
+ See https://semver.org
*/
#define XML_MAJOR_VERSION 2
-#define XML_MINOR_VERSION 2
-#define XML_MICRO_VERSION 10
+#define XML_MINOR_VERSION 7
+#define XML_MICRO_VERSION 1
#ifdef __cplusplus
}
diff --git a/3rdparty/expat/lib/expat_config.h b/3rdparty/expat/lib/expat_config.h
new file mode 100644
index 00000000000..2272814cf03
--- /dev/null
+++ b/3rdparty/expat/lib/expat_config.h
@@ -0,0 +1,6 @@
+/* expat_config.h. Dummy file to satisfy build process. */
+
+#ifndef EXPAT_CONFIG_H
+#define EXPAT_CONFIG_H 1
+
+#endif // ndef EXPAT_CONFIG_H
diff --git a/3rdparty/expat/lib/expat_external.h b/3rdparty/expat/lib/expat_external.h
index b3b6e74d9d2..8829f770910 100644
--- a/3rdparty/expat/lib/expat_external.h
+++ b/3rdparty/expat/lib/expat_external.h
@@ -7,7 +7,14 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2000-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016 Cristian Rodríguez <crrodriguez@opensuse.org>
+ Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/iasciitab.h b/3rdparty/expat/lib/iasciitab.h
index ea97cfcf678..5d8646f2a31 100644
--- a/3rdparty/expat/lib/iasciitab.h
+++ b/3rdparty/expat/lib/iasciitab.h
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/internal.h b/3rdparty/expat/lib/internal.h
index 60913dab762..6bde6ae6b31 100644
--- a/3rdparty/expat/lib/internal.h
+++ b/3rdparty/expat/lib/internal.h
@@ -25,8 +25,14 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Copyright (c) 2024 Taichi Haradaguchi <20001722@ymail.ne.jp>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -101,22 +107,72 @@
# endif
#endif
+#include <limits.h> // ULONG_MAX
+
+#if defined(_WIN32) \
+ && (! defined(__USE_MINGW_ANSI_STDIO) \
+ || (1 - __USE_MINGW_ANSI_STDIO - 1 == 0))
+# define EXPAT_FMT_ULL(midpart) "%" midpart "I64u"
+# if defined(_WIN64) // Note: modifiers "td" and "zu" do not work for MinGW
+# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "I64d"
+# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "I64u"
+# else
+# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "d"
+# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "u"
+# endif
+#else
+# define EXPAT_FMT_ULL(midpart) "%" midpart "llu"
+# if ! defined(ULONG_MAX)
+# error Compiler did not define ULONG_MAX for us
+# elif ULONG_MAX == 18446744073709551615u // 2^64-1
+# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "ld"
+# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "lu"
+# elif defined(EMSCRIPTEN) // 32bit mode Emscripten
+# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "ld"
+# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "zu"
+# else
+# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "d"
+# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "u"
+# endif
+#endif
+
#ifndef UNUSED_P
# define UNUSED_P(p) (void)p
#endif
+/* NOTE BEGIN If you ever patch these defaults to greater values
+ for non-attack XML payload in your environment,
+ please file a bug report with libexpat. Thank you!
+*/
+#define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT \
+ 100.0f
+#define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT \
+ 8388608 // 8 MiB, 2^23
+/* NOTE END */
+
+#include "expat.h" // so we can use type XML_Parser below
+
#ifdef __cplusplus
extern "C" {
#endif
-#ifdef XML_ENABLE_VISIBILITY
-# if XML_ENABLE_VISIBILITY
-__attribute__((visibility("default")))
-# endif
+void _INTERNAL_trim_to_complete_utf8_characters(const char *from,
+ const char **fromLimRef);
+
+#if defined(XML_GE) && XML_GE == 1
+unsigned long long testingAccountingGetCountBytesDirect(XML_Parser parser);
+unsigned long long testingAccountingGetCountBytesIndirect(XML_Parser parser);
+const char *unsignedCharToPrintable(unsigned char c);
+#endif
+
+extern
+#if ! defined(XML_TESTING)
+ const
+#endif
+ XML_Bool g_reparseDeferralEnabledDefault; // written ONLY in runtests.c
+#if defined(XML_TESTING)
+extern unsigned int g_bytesScanned; // used for testing only
#endif
-void
-_INTERNAL_trim_to_complete_utf8_characters(const char *from,
- const char **fromLimRef);
#ifdef __cplusplus
}
diff --git a/3rdparty/expat/lib/latin1tab.h b/3rdparty/expat/lib/latin1tab.h
index 6f916041355..b681d278af6 100644
--- a/3rdparty/expat/lib/latin1tab.h
+++ b/3rdparty/expat/lib/latin1tab.h
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/libexpat.def b/3rdparty/expat/lib/libexpat.def
deleted file mode 100644
index 16faf5955e7..00000000000
--- a/3rdparty/expat/lib/libexpat.def
+++ /dev/null
@@ -1,78 +0,0 @@
-; DEF file for MS VC++
-
-LIBRARY
-EXPORTS
- XML_DefaultCurrent @1
- XML_ErrorString @2
- XML_ExpatVersion @3
- XML_ExpatVersionInfo @4
- XML_ExternalEntityParserCreate @5
- XML_GetBase @6
- XML_GetBuffer @7
- XML_GetCurrentByteCount @8
- XML_GetCurrentByteIndex @9
- XML_GetCurrentColumnNumber @10
- XML_GetCurrentLineNumber @11
- XML_GetErrorCode @12
- XML_GetIdAttributeIndex @13
- XML_GetInputContext @14
- XML_GetSpecifiedAttributeCount @15
- XML_Parse @16
- XML_ParseBuffer @17
- XML_ParserCreate @18
- XML_ParserCreateNS @19
- XML_ParserCreate_MM @20
- XML_ParserFree @21
- XML_SetAttlistDeclHandler @22
- XML_SetBase @23
- XML_SetCdataSectionHandler @24
- XML_SetCharacterDataHandler @25
- XML_SetCommentHandler @26
- XML_SetDefaultHandler @27
- XML_SetDefaultHandlerExpand @28
- XML_SetDoctypeDeclHandler @29
- XML_SetElementDeclHandler @30
- XML_SetElementHandler @31
- XML_SetEncoding @32
- XML_SetEndCdataSectionHandler @33
- XML_SetEndDoctypeDeclHandler @34
- XML_SetEndElementHandler @35
- XML_SetEndNamespaceDeclHandler @36
- XML_SetEntityDeclHandler @37
- XML_SetExternalEntityRefHandler @38
- XML_SetExternalEntityRefHandlerArg @39
- XML_SetNamespaceDeclHandler @40
- XML_SetNotStandaloneHandler @41
- XML_SetNotationDeclHandler @42
- XML_SetParamEntityParsing @43
- XML_SetProcessingInstructionHandler @44
- XML_SetReturnNSTriplet @45
- XML_SetStartCdataSectionHandler @46
- XML_SetStartDoctypeDeclHandler @47
- XML_SetStartElementHandler @48
- XML_SetStartNamespaceDeclHandler @49
- XML_SetUnknownEncodingHandler @50
- XML_SetUnparsedEntityDeclHandler @51
- XML_SetUserData @52
- XML_SetXmlDeclHandler @53
- XML_UseParserAsHandlerArg @54
-; added with version 1.95.3
- XML_ParserReset @55
- XML_SetSkippedEntityHandler @56
-; added with version 1.95.5
- XML_GetFeatureList @57
- XML_UseForeignDTD @58
-; added with version 1.95.6
- XML_FreeContentModel @59
- XML_MemMalloc @60
- XML_MemRealloc @61
- XML_MemFree @62
-; added with version 1.95.8
- XML_StopParser @63
- XML_ResumeParser @64
- XML_GetParsingStatus @65
-; added with version 2.1.1
-; XML_GetAttributeInfo @66
- XML_SetHashSalt @67
-; added with version 2.2.5
- _INTERNAL_trim_to_complete_utf8_characters @68
diff --git a/3rdparty/expat/lib/libexpat.def.cmake b/3rdparty/expat/lib/libexpat.def.cmake
new file mode 100644
index 00000000000..10ee9cd6f99
--- /dev/null
+++ b/3rdparty/expat/lib/libexpat.def.cmake
@@ -0,0 +1,81 @@
+; DEF file for MS VC++
+
+EXPORTS
+ XML_DefaultCurrent @1
+ XML_ErrorString @2
+ XML_ExpatVersion @3
+ XML_ExpatVersionInfo @4
+ XML_ExternalEntityParserCreate @5
+ XML_GetBase @6
+ XML_GetBuffer @7
+ XML_GetCurrentByteCount @8
+ XML_GetCurrentByteIndex @9
+ XML_GetCurrentColumnNumber @10
+ XML_GetCurrentLineNumber @11
+ XML_GetErrorCode @12
+ XML_GetIdAttributeIndex @13
+ XML_GetInputContext @14
+ XML_GetSpecifiedAttributeCount @15
+ XML_Parse @16
+ XML_ParseBuffer @17
+ XML_ParserCreate @18
+ XML_ParserCreateNS @19
+ XML_ParserCreate_MM @20
+ XML_ParserFree @21
+ XML_SetAttlistDeclHandler @22
+ XML_SetBase @23
+ XML_SetCdataSectionHandler @24
+ XML_SetCharacterDataHandler @25
+ XML_SetCommentHandler @26
+ XML_SetDefaultHandler @27
+ XML_SetDefaultHandlerExpand @28
+ XML_SetDoctypeDeclHandler @29
+ XML_SetElementDeclHandler @30
+ XML_SetElementHandler @31
+ XML_SetEncoding @32
+ XML_SetEndCdataSectionHandler @33
+ XML_SetEndDoctypeDeclHandler @34
+ XML_SetEndElementHandler @35
+ XML_SetEndNamespaceDeclHandler @36
+ XML_SetEntityDeclHandler @37
+ XML_SetExternalEntityRefHandler @38
+ XML_SetExternalEntityRefHandlerArg @39
+ XML_SetNamespaceDeclHandler @40
+ XML_SetNotStandaloneHandler @41
+ XML_SetNotationDeclHandler @42
+ XML_SetParamEntityParsing @43
+ XML_SetProcessingInstructionHandler @44
+ XML_SetReturnNSTriplet @45
+ XML_SetStartCdataSectionHandler @46
+ XML_SetStartDoctypeDeclHandler @47
+ XML_SetStartElementHandler @48
+ XML_SetStartNamespaceDeclHandler @49
+ XML_SetUnknownEncodingHandler @50
+ XML_SetUnparsedEntityDeclHandler @51
+ XML_SetUserData @52
+ XML_SetXmlDeclHandler @53
+ XML_UseParserAsHandlerArg @54
+; added with version 1.95.3
+ XML_ParserReset @55
+ XML_SetSkippedEntityHandler @56
+; added with version 1.95.5
+ XML_GetFeatureList @57
+ XML_UseForeignDTD @58
+; added with version 1.95.6
+ XML_FreeContentModel @59
+ XML_MemMalloc @60
+ XML_MemRealloc @61
+ XML_MemFree @62
+; added with version 1.95.8
+ XML_StopParser @63
+ XML_ResumeParser @64
+ XML_GetParsingStatus @65
+; added with version 2.1.1
+@_EXPAT_COMMENT_ATTR_INFO@ XML_GetAttributeInfo @66
+ XML_SetHashSalt @67
+; internal @68 removed with version 2.3.1
+; added with version 2.4.0
+@_EXPAT_COMMENT_DTD_OR_GE@ XML_SetBillionLaughsAttackProtectionActivationThreshold @69
+@_EXPAT_COMMENT_DTD_OR_GE@ XML_SetBillionLaughsAttackProtectionMaximumAmplification @70
+; added with version 2.6.0
+ XML_SetReparseDeferralEnabled @71
diff --git a/3rdparty/expat/lib/libexpatw.def b/3rdparty/expat/lib/libexpatw.def
deleted file mode 100644
index 16faf5955e7..00000000000
--- a/3rdparty/expat/lib/libexpatw.def
+++ /dev/null
@@ -1,78 +0,0 @@
-; DEF file for MS VC++
-
-LIBRARY
-EXPORTS
- XML_DefaultCurrent @1
- XML_ErrorString @2
- XML_ExpatVersion @3
- XML_ExpatVersionInfo @4
- XML_ExternalEntityParserCreate @5
- XML_GetBase @6
- XML_GetBuffer @7
- XML_GetCurrentByteCount @8
- XML_GetCurrentByteIndex @9
- XML_GetCurrentColumnNumber @10
- XML_GetCurrentLineNumber @11
- XML_GetErrorCode @12
- XML_GetIdAttributeIndex @13
- XML_GetInputContext @14
- XML_GetSpecifiedAttributeCount @15
- XML_Parse @16
- XML_ParseBuffer @17
- XML_ParserCreate @18
- XML_ParserCreateNS @19
- XML_ParserCreate_MM @20
- XML_ParserFree @21
- XML_SetAttlistDeclHandler @22
- XML_SetBase @23
- XML_SetCdataSectionHandler @24
- XML_SetCharacterDataHandler @25
- XML_SetCommentHandler @26
- XML_SetDefaultHandler @27
- XML_SetDefaultHandlerExpand @28
- XML_SetDoctypeDeclHandler @29
- XML_SetElementDeclHandler @30
- XML_SetElementHandler @31
- XML_SetEncoding @32
- XML_SetEndCdataSectionHandler @33
- XML_SetEndDoctypeDeclHandler @34
- XML_SetEndElementHandler @35
- XML_SetEndNamespaceDeclHandler @36
- XML_SetEntityDeclHandler @37
- XML_SetExternalEntityRefHandler @38
- XML_SetExternalEntityRefHandlerArg @39
- XML_SetNamespaceDeclHandler @40
- XML_SetNotStandaloneHandler @41
- XML_SetNotationDeclHandler @42
- XML_SetParamEntityParsing @43
- XML_SetProcessingInstructionHandler @44
- XML_SetReturnNSTriplet @45
- XML_SetStartCdataSectionHandler @46
- XML_SetStartDoctypeDeclHandler @47
- XML_SetStartElementHandler @48
- XML_SetStartNamespaceDeclHandler @49
- XML_SetUnknownEncodingHandler @50
- XML_SetUnparsedEntityDeclHandler @51
- XML_SetUserData @52
- XML_SetXmlDeclHandler @53
- XML_UseParserAsHandlerArg @54
-; added with version 1.95.3
- XML_ParserReset @55
- XML_SetSkippedEntityHandler @56
-; added with version 1.95.5
- XML_GetFeatureList @57
- XML_UseForeignDTD @58
-; added with version 1.95.6
- XML_FreeContentModel @59
- XML_MemMalloc @60
- XML_MemRealloc @61
- XML_MemFree @62
-; added with version 1.95.8
- XML_StopParser @63
- XML_ResumeParser @64
- XML_GetParsingStatus @65
-; added with version 2.1.1
-; XML_GetAttributeInfo @66
- XML_SetHashSalt @67
-; added with version 2.2.5
- _INTERNAL_trim_to_complete_utf8_characters @68
diff --git a/3rdparty/expat/lib/nametab.h b/3rdparty/expat/lib/nametab.h
index 3681df348ee..63485446b96 100644
--- a/3rdparty/expat/lib/nametab.h
+++ b/3rdparty/expat/lib/nametab.h
@@ -6,8 +6,8 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/siphash.h b/3rdparty/expat/lib/siphash.h
index bfee65a332f..04f6f74585b 100644
--- a/3rdparty/expat/lib/siphash.h
+++ b/3rdparty/expat/lib/siphash.h
@@ -11,6 +11,9 @@
* --------------------------------------------------------------------------
* HISTORY:
*
+ * 2020-10-03 (Sebastian Pipping)
+ * - Drop support for Visual Studio 9.0/2008 and earlier
+ *
* 2019-08-03 (Sebastian Pipping)
* - Mark part of sip24_valid as to be excluded from clang-format
* - Re-format code using clang-format 9
@@ -96,22 +99,14 @@
#define SIPHASH_H
#include <stddef.h> /* size_t */
-
-#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
-/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
-typedef unsigned __int8 uint8_t;
-typedef unsigned __int32 uint32_t;
-typedef unsigned __int64 uint64_t;
-#else
-# include <stdint.h> /* uint64_t uint32_t uint8_t */
-#endif
+#include <stdint.h> /* uint64_t uint32_t uint8_t */
/*
* Workaround to not require a C++11 compiler for using ULL suffix
* if this code is included and compiled as C++; related GCC warning is:
* warning: use of C++11 long long integer constant [-Wlong-long]
*/
-#define _SIP_ULL(high, low) (((uint64_t)high << 32) | low)
+#define SIP_ULL(high, low) ((((uint64_t)high) << 32) | (low))
#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
@@ -131,8 +126,7 @@ typedef unsigned __int64 uint64_t;
| ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) \
| ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56))
-#define SIPHASH_INITIALIZER \
- { 0, 0, 0, 0, {0}, 0, 0 }
+#define SIPHASH_INITIALIZER {0, 0, 0, 0, {0}, 0, 0}
struct siphash {
uint64_t v0, v1, v2, v3;
@@ -195,10 +189,10 @@ sip_round(struct siphash *H, const int rounds) {
static struct siphash *
sip24_init(struct siphash *H, const struct sipkey *key) {
- H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
- H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
- H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
- H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
+ H->v0 = SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
+ H->v1 = SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
+ H->v2 = SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
+ H->v3 = SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
H->p = H->buf;
H->c = 0;
diff --git a/3rdparty/expat/lib/utf8tab.h b/3rdparty/expat/lib/utf8tab.h
index a22986acbb9..88efcf91cc1 100644
--- a/3rdparty/expat/lib/utf8tab.h
+++ b/3rdparty/expat/lib/utf8tab.h
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/lib/winconfig.h b/3rdparty/expat/lib/winconfig.h
index 562a4a82dc1..05805514ec7 100644
--- a/3rdparty/expat/lib/winconfig.h
+++ b/3rdparty/expat/lib/winconfig.h
@@ -6,8 +6,11 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2023 Orgad Shaneh <orgad.shaneh@audiocodes.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -33,24 +36,13 @@
#ifndef WINCONFIG_H
#define WINCONFIG_H
-#define WIN32_LEAN_AND_MEAN
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#include <memory.h>
#include <string.h>
-#if defined(HAVE_EXPAT_CONFIG_H) /* e.g. MinGW */
-# include <expat_config.h>
-#else /* !defined(HAVE_EXPAT_CONFIG_H) */
-
-# define XML_NS 1
-# define XML_DTD 1
-# define XML_CONTEXT_BYTES 1024
-
-/* we will assume all Windows platforms are little endian */
-# define BYTEORDER 1234
-
-#endif /* !defined(HAVE_EXPAT_CONFIG_H) */
-
#endif /* ndef WINCONFIG_H */
diff --git a/3rdparty/expat/lib/xmlparse.c b/3rdparty/expat/lib/xmlparse.c
index dfc316ca36c..38a2d9657b6 100644
--- a/3rdparty/expat/lib/xmlparse.c
+++ b/3rdparty/expat/lib/xmlparse.c
@@ -1,4 +1,4 @@
-/* 5cd169f2942b85c05e0b1b96f9990f91ac3d07e470ad7ce906ac8590c8ed4f35 (2.2.10+)
+/* d19ae032c224863c1527ba44d228cc34b99192c3a4c5a27af1f4e054d45ee031 (2.7.1+)
__ __ _
___\ \/ /_ __ __ _| |_
/ _ \\ /| '_ \ / _` | __|
@@ -7,7 +7,40 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2000-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016 Eric Rahm <erahm@mozilla.com>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2016 Gaurav <g.gupta@samsung.com>
+ Copyright (c) 2016 Thomas Beutlich <tc@tbeu.de>
+ Copyright (c) 2016 Gustavo Grieco <gustavo.grieco@imag.fr>
+ Copyright (c) 2016 Pascal Cuoq <cuoq@trust-in-soft.com>
+ Copyright (c) 2016 Ed Schouten <ed@nuxi.nl>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Václav Slavík <vaclav@slavik.io>
+ Copyright (c) 2017 Viktor Szakats <commit@vsz.me>
+ Copyright (c) 2017 Chanho Park <chanho61.park@samsung.com>
+ Copyright (c) 2017 Rolf Eike Beer <eike@sf-mail.de>
+ Copyright (c) 2017 Hans Wennborg <hans@chromium.org>
+ Copyright (c) 2018 Anton Maklakov <antmak.pub@gmail.com>
+ Copyright (c) 2018 Benjamin Peterson <benjamin@python.org>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2018 Mariusz Zaborski <oshogbo@vexillium.org>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2019-2020 Ben Wagner <bungeman@chromium.org>
+ Copyright (c) 2019 Vadim Zeitlin <vadim@zeitlins.org>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2022 Samanta Navarro <ferivoz@riseup.net>
+ Copyright (c) 2022 Jeffrey Walton <noloader@gmail.com>
+ Copyright (c) 2022 Jann Horn <jannh@google.com>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
+ Copyright (c) 2023 Owain Davies <owaind@bath.edu>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Copyright (c) 2024-2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
+ Copyright (c) 2024 Hanno Böck <hanno@gentoo.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,8 +63,27 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#if ! defined(_GNU_SOURCE)
-# define _GNU_SOURCE 1 /* syscall prototype */
+#define XML_BUILDING_EXPAT 1
+
+#include "expat_config.h"
+
+#if ! defined(XML_GE) || (1 - XML_GE - 1 == 2) || (XML_GE < 0) || (XML_GE > 1)
+# error XML_GE (for general entities) must be defined, non-empty, either 1 or 0 (0 to disable, 1 to enable; 1 is a common default)
+#endif
+
+#if defined(XML_DTD) && XML_GE == 0
+# error Either undefine XML_DTD or define XML_GE to 1.
+#endif
+
+#if ! defined(XML_CONTEXT_BYTES) || (1 - XML_CONTEXT_BYTES - 1 == 2) \
+ || (XML_CONTEXT_BYTES + 0 < 0)
+# error XML_CONTEXT_BYTES must be defined, non-empty and >=0 (0 to disable, >=1 to enable; 1024 is a common default)
+#endif
+
+#if defined(HAVE_SYSCALL_GETRANDOM)
+# if ! defined(_GNU_SOURCE)
+# define _GNU_SOURCE 1 /* syscall prototype */
+# endif
#endif
#ifdef _WIN32
@@ -41,23 +93,15 @@
# endif
#endif
+#include <stdbool.h>
#include <stddef.h>
#include <string.h> /* memset(), memcpy() */
#include <assert.h>
#include <limits.h> /* UINT_MAX */
#include <stdio.h> /* fprintf */
#include <stdlib.h> /* getenv, rand_s */
-
-#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
-/* vs2008/9.0 and earlier lack stdint.h; _MSC_VER 1600 is vs2010/10.0 */
-# if defined(_WIN64)
-typedef unsigned __int64 uintptr_t;
-# else
-typedef unsigned __int32 uintptr_t;
-# endif
-#else
-# include <stdint.h> /* uintptr_t */
-#endif
+#include <stdint.h> /* uintptr_t */
+#include <math.h> /* isnan */
#ifdef _WIN32
# define getpid GetCurrentProcessId
@@ -69,13 +113,9 @@ typedef unsigned __int32 uintptr_t;
# include <errno.h>
#endif
-#define XML_BUILDING_EXPAT 1
-
#ifdef _WIN32
# include "winconfig.h"
-#elif defined(HAVE_EXPAT_CONFIG_H)
-# include <expat_config.h>
-#endif /* ndef _WIN32 */
+#endif
#include "ascii.h"
#include "expat.h"
@@ -112,11 +152,11 @@ typedef unsigned __int32 uintptr_t;
Your options include: \
* Linux >=3.17 + glibc >=2.25 (getrandom): HAVE_GETRANDOM, \
* Linux >=3.17 + glibc (including <2.25) (syscall SYS_getrandom): HAVE_SYSCALL_GETRANDOM, \
- * BSD / macOS >=10.7 (arc4random_buf): HAVE_ARC4RANDOM_BUF, \
- * BSD / macOS (including <10.7) (arc4random): HAVE_ARC4RANDOM, \
+ * BSD / macOS >=10.7 / glibc >=2.36 (arc4random_buf): HAVE_ARC4RANDOM_BUF, \
+ * BSD / macOS (including <10.7) / glibc >=2.36 (arc4random): HAVE_ARC4RANDOM, \
* libbsd (arc4random_buf): HAVE_ARC4RANDOM_BUF + HAVE_LIBBSD, \
* libbsd (arc4random): HAVE_ARC4RANDOM + HAVE_LIBBSD, \
- * Linux (including <3.17) / BSD / macOS (including <10.7) (/dev/urandom): XML_DEV_URANDOM, \
+ * Linux (including <3.17) / BSD / macOS (including <10.7) / Solaris >=8 (/dev/urandom): XML_DEV_URANDOM, \
* Windows >=Vista (rand_s): _WIN32. \
\
If insist on not using any of these, bypass this error by defining \
@@ -172,11 +212,13 @@ typedef char ICHAR;
#endif
/* Round up n to be a multiple of sz, where sz is a power of 2. */
-#define ROUND_UP(n, sz) (((n) + ((sz)-1)) & ~((sz)-1))
+#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
/* Do safe (NULL-aware) pointer arithmetic */
#define EXPAT_SAFE_PTR_DIFF(p, q) (((p) && (q)) ? ((p) - (q)) : 0)
+#define EXPAT_MIN(a, b) (((a) < (b)) ? (a) : (b))
+
#include "internal.h"
#include "xmltok.h"
#include "xmlrole.h"
@@ -208,7 +250,7 @@ static void copy_salt_to_sipkey(XML_Parser parser, struct sipkey *key);
it odd, since odd numbers are always relative prime to a power of 2.
*/
#define SECOND_HASH(hash, mask, power) \
- ((((hash) & ~(mask)) >> ((power)-1)) & ((mask) >> 2))
+ ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2))
#define PROBE_STEP(hash, mask, power) \
((unsigned char)((SECOND_HASH(hash, mask, power)) | 1))
@@ -254,13 +296,13 @@ typedef struct {
The name of the element is stored in both the document and API
encodings. The memory buffer 'buf' is a separately-allocated
memory area which stores the name. During the XML_Parse()/
- XMLParseBuffer() when the element is open, the memory for the 'raw'
+ XML_ParseBuffer() when the element is open, the memory for the 'raw'
version of the name (in the document encoding) is shared with the
document buffer. If the element is open across calls to
XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to
contain the 'raw' name as well.
- A parser re-uses these structures, maintaining a list of allocated
+ A parser reuses these structures, maintaining a list of allocated
TAG objects in a free list.
*/
typedef struct tag {
@@ -283,6 +325,10 @@ typedef struct {
const XML_Char *publicId;
const XML_Char *notation;
XML_Bool open;
+ XML_Bool hasMore; /* true if entity has not been completely processed */
+ /* An entity can be open while being already completely processed (hasMore ==
+ XML_FALSE). The reason is the delayed closing of entities until their inner
+ entities are processed and closed */
XML_Bool is_param;
XML_Bool is_internal; /* true if declared in internal subset outside PE */
} ENTITY;
@@ -373,6 +419,12 @@ typedef struct {
int *scaffIndex;
} DTD;
+enum EntityType {
+ ENTITY_INTERNAL,
+ ENTITY_ATTRIBUTE,
+ ENTITY_VALUE,
+};
+
typedef struct open_internal_entity {
const char *internalEventPtr;
const char *internalEventEndPtr;
@@ -380,8 +432,34 @@ typedef struct open_internal_entity {
ENTITY *entity;
int startTagLevel;
XML_Bool betweenDecl; /* WFC: PE Between Declarations */
+ enum EntityType type;
} OPEN_INTERNAL_ENTITY;
+enum XML_Account {
+ XML_ACCOUNT_DIRECT, /* bytes directly passed to the Expat parser */
+ XML_ACCOUNT_ENTITY_EXPANSION, /* intermediate bytes produced during entity
+ expansion */
+ XML_ACCOUNT_NONE /* i.e. do not account, was accounted already */
+};
+
+#if XML_GE == 1
+typedef unsigned long long XmlBigCount;
+typedef struct accounting {
+ XmlBigCount countBytesDirect;
+ XmlBigCount countBytesIndirect;
+ unsigned long debugLevel;
+ float maximumAmplificationFactor; // >=1.0
+ unsigned long long activationThresholdBytes;
+} ACCOUNTING;
+
+typedef struct entity_stats {
+ unsigned int countEverOpened;
+ unsigned int currentDepth;
+ unsigned int maximumDepthSeen;
+ unsigned long debugLevel;
+} ENTITY_STATS;
+#endif /* XML_GE == 1 */
+
typedef enum XML_Error PTRCALL Processor(XML_Parser parser, const char *start,
const char *end, const char **endPtr);
@@ -412,43 +490,59 @@ static enum XML_Error initializeEncoding(XML_Parser parser);
static enum XML_Error doProlog(XML_Parser parser, const ENCODING *enc,
const char *s, const char *end, int tok,
const char *next, const char **nextPtr,
- XML_Bool haveMore, XML_Bool allowClosingDoctype);
-static enum XML_Error processInternalEntity(XML_Parser parser, ENTITY *entity,
- XML_Bool betweenDecl);
+ XML_Bool haveMore, XML_Bool allowClosingDoctype,
+ enum XML_Account account);
+static enum XML_Error processEntity(XML_Parser parser, ENTITY *entity,
+ XML_Bool betweenDecl, enum EntityType type);
static enum XML_Error doContent(XML_Parser parser, int startTagLevel,
const ENCODING *enc, const char *start,
const char *end, const char **endPtr,
- XML_Bool haveMore);
-static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *,
+ XML_Bool haveMore, enum XML_Account account);
+static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *enc,
const char **startPtr, const char *end,
- const char **nextPtr, XML_Bool haveMore);
+ const char **nextPtr, XML_Bool haveMore,
+ enum XML_Account account);
#ifdef XML_DTD
-static enum XML_Error doIgnoreSection(XML_Parser parser, const ENCODING *,
+static enum XML_Error doIgnoreSection(XML_Parser parser, const ENCODING *enc,
const char **startPtr, const char *end,
const char **nextPtr, XML_Bool haveMore);
#endif /* XML_DTD */
static void freeBindings(XML_Parser parser, BINDING *bindings);
-static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *,
- const char *s, TAG_NAME *tagNamePtr,
- BINDING **bindingsPtr);
+static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc,
+ const char *attStr, TAG_NAME *tagNamePtr,
+ BINDING **bindingsPtr,
+ enum XML_Account account);
static enum XML_Error addBinding(XML_Parser parser, PREFIX *prefix,
const ATTRIBUTE_ID *attId, const XML_Char *uri,
BINDING **bindingsPtr);
-static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
- XML_Bool isId, const XML_Char *dfltValue,
- XML_Parser parser);
-static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *,
- XML_Bool isCdata, const char *,
- const char *, STRING_POOL *);
-static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *,
- XML_Bool isCdata, const char *,
- const char *, STRING_POOL *);
+static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId,
+ XML_Bool isCdata, XML_Bool isId,
+ const XML_Char *value, XML_Parser parser);
+static enum XML_Error storeAttributeValue(XML_Parser parser,
+ const ENCODING *enc, XML_Bool isCdata,
+ const char *ptr, const char *end,
+ STRING_POOL *pool,
+ enum XML_Account account);
+static enum XML_Error
+appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
+ const char *ptr, const char *end, STRING_POOL *pool,
+ enum XML_Account account, const char **nextPtr);
static ATTRIBUTE_ID *getAttributeId(XML_Parser parser, const ENCODING *enc,
const char *start, const char *end);
-static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
+static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType);
+#if XML_GE == 1
static enum XML_Error storeEntityValue(XML_Parser parser, const ENCODING *enc,
- const char *start, const char *end);
+ const char *start, const char *end,
+ enum XML_Account account,
+ const char **nextPtr);
+static enum XML_Error callStoreEntityValue(XML_Parser parser,
+ const ENCODING *enc,
+ const char *start, const char *end,
+ enum XML_Account account);
+#else
+static enum XML_Error storeSelfEntityValue(XML_Parser parser, ENTITY *entity);
+#endif
static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
const char *start, const char *end);
static int reportComment(XML_Parser parser, const ENCODING *enc,
@@ -468,21 +562,22 @@ static void dtdDestroy(DTD *p, XML_Bool isDocEntity,
const XML_Memory_Handling_Suite *ms);
static int dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
const XML_Memory_Handling_Suite *ms);
-static int copyEntityTable(XML_Parser oldParser, HASH_TABLE *, STRING_POOL *,
- const HASH_TABLE *);
+static int copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable,
+ STRING_POOL *newPool, const HASH_TABLE *oldTable);
static NAMED *lookup(XML_Parser parser, HASH_TABLE *table, KEY name,
size_t createSize);
-static void FASTCALL hashTableInit(HASH_TABLE *,
+static void FASTCALL hashTableInit(HASH_TABLE *table,
const XML_Memory_Handling_Suite *ms);
-static void FASTCALL hashTableClear(HASH_TABLE *);
-static void FASTCALL hashTableDestroy(HASH_TABLE *);
-static void FASTCALL hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);
-static NAMED *FASTCALL hashTableIterNext(HASH_TABLE_ITER *);
+static void FASTCALL hashTableClear(HASH_TABLE *table);
+static void FASTCALL hashTableDestroy(HASH_TABLE *table);
+static void FASTCALL hashTableIterInit(HASH_TABLE_ITER *iter,
+ const HASH_TABLE *table);
+static NAMED *FASTCALL hashTableIterNext(HASH_TABLE_ITER *iter);
-static void FASTCALL poolInit(STRING_POOL *,
+static void FASTCALL poolInit(STRING_POOL *pool,
const XML_Memory_Handling_Suite *ms);
-static void FASTCALL poolClear(STRING_POOL *);
-static void FASTCALL poolDestroy(STRING_POOL *);
+static void FASTCALL poolClear(STRING_POOL *pool);
+static void FASTCALL poolDestroy(STRING_POOL *pool);
static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc,
const char *ptr, const char *end);
static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc,
@@ -512,8 +607,35 @@ static XML_Parser parserCreate(const XML_Char *encodingName,
static void parserInit(XML_Parser parser, const XML_Char *encodingName);
+#if XML_GE == 1
+static float accountingGetCurrentAmplification(XML_Parser rootParser);
+static void accountingReportStats(XML_Parser originParser, const char *epilog);
+static void accountingOnAbort(XML_Parser originParser);
+static void accountingReportDiff(XML_Parser rootParser,
+ unsigned int levelsAwayFromRootParser,
+ const char *before, const char *after,
+ ptrdiff_t bytesMore, int source_line,
+ enum XML_Account account);
+static XML_Bool accountingDiffTolerated(XML_Parser originParser, int tok,
+ const char *before, const char *after,
+ int source_line,
+ enum XML_Account account);
+
+static void entityTrackingReportStats(XML_Parser parser, ENTITY *entity,
+ const char *action, int sourceLine);
+static void entityTrackingOnOpen(XML_Parser parser, ENTITY *entity,
+ int sourceLine);
+static void entityTrackingOnClose(XML_Parser parser, ENTITY *entity,
+ int sourceLine);
+
+static XML_Parser getRootParserOf(XML_Parser parser,
+ unsigned int *outLevelDiff);
+#endif /* XML_GE == 1 */
+
+static unsigned long getDebugLevel(const char *variableName,
+ unsigned long defaultDebugLevel);
+
#define poolStart(pool) ((pool)->start)
-#define poolEnd(pool) ((pool)->ptr)
#define poolLength(pool) ((pool)->ptr - (pool)->start)
#define poolChop(pool) ((void)--(pool->ptr))
#define poolLastChar(pool) (((pool)->ptr)[-1])
@@ -524,21 +646,41 @@ static void parserInit(XML_Parser parser, const XML_Char *encodingName);
? 0 \
: ((*((pool)->ptr)++ = c), 1))
+#if ! defined(XML_TESTING)
+const
+#endif
+ XML_Bool g_reparseDeferralEnabledDefault
+ = XML_TRUE; // write ONLY in runtests.c
+#if defined(XML_TESTING)
+unsigned int g_bytesScanned = 0; // used for testing only
+#endif
+
struct XML_ParserStruct {
/* The first member must be m_userData so that the XML_GetUserData
macro works. */
void *m_userData;
void *m_handlerArg;
- char *m_buffer;
+
+ // How the four parse buffer pointers below relate in time and space:
+ //
+ // m_buffer <= m_bufferPtr <= m_bufferEnd <= m_bufferLim
+ // | | | |
+ // <--parsed-->| | |
+ // <---parsing--->| |
+ // <--unoccupied-->|
+ // <---------total-malloced/realloced-------->|
+
+ char *m_buffer; // malloc/realloc base pointer of parse buffer
const XML_Memory_Handling_Suite m_mem;
- /* first character to be parsed */
- const char *m_bufferPtr;
- /* past last character to be parsed */
- char *m_bufferEnd;
- /* allocated end of m_buffer */
- const char *m_bufferLim;
+ const char *m_bufferPtr; // first character to be parsed
+ char *m_bufferEnd; // past last character to be parsed
+ const char *m_bufferLim; // allocated end of m_buffer
+
XML_Index m_parseEndByteIndex;
const char *m_parseEndPtr;
+ size_t m_partialTokenBytesBefore; /* used in heuristic to avoid O(n^2) */
+ XML_Bool m_reparseDeferralEnabled;
+ int m_lastBufferRequestSize;
XML_Char *m_dataBuf;
XML_Char *m_dataBufEnd;
XML_StartElementHandler m_startElementHandler;
@@ -582,6 +724,10 @@ struct XML_ParserStruct {
const char *m_positionPtr;
OPEN_INTERNAL_ENTITY *m_openInternalEntities;
OPEN_INTERNAL_ENTITY *m_freeInternalEntities;
+ OPEN_INTERNAL_ENTITY *m_openAttributeEntities;
+ OPEN_INTERNAL_ENTITY *m_freeAttributeEntities;
+ OPEN_INTERNAL_ENTITY *m_openValueEntities;
+ OPEN_INTERNAL_ENTITY *m_freeValueEntities;
XML_Bool m_defaultExpandInternalEntities;
int m_tagLevel;
ENTITY *m_declEntity;
@@ -625,6 +771,11 @@ struct XML_ParserStruct {
enum XML_ParamEntityParsing m_paramEntityParsing;
#endif
unsigned long m_hash_secret_salt;
+#if XML_GE == 1
+ ACCOUNTING m_accounting;
+ ENTITY_STATS m_entity_stats;
+#endif
+ XML_Bool m_reenter;
};
#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s)))
@@ -638,11 +789,11 @@ XML_ParserCreate(const XML_Char *encodingName) {
XML_Parser XMLCALL
XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) {
- XML_Char tmp[2];
- *tmp = nsSep;
+ XML_Char tmp[2] = {nsSep, 0};
return XML_ParserCreate_MM(encodingName, NULL, tmp);
}
+// "xml=http://www.w3.org/XML/1998/namespace"
static const XML_Char implicitContext[]
= {ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h,
ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH,
@@ -809,9 +960,8 @@ gather_time_entropy(void) {
static unsigned long
ENTROPY_DEBUG(const char *label, unsigned long entropy) {
- const char *const EXPAT_ENTROPY_DEBUG = getenv("EXPAT_ENTROPY_DEBUG");
- if (EXPAT_ENTROPY_DEBUG && ! strcmp(EXPAT_ENTROPY_DEBUG, "1")) {
- fprintf(stderr, "Entropy: %s --> 0x%0*lx (%lu bytes)\n", label,
+ if (getDebugLevel("EXPAT_ENTROPY_DEBUG", 0) >= 1u) {
+ fprintf(stderr, "expat: Entropy: %s --> 0x%0*lx (%lu bytes)\n", label,
(int)sizeof(entropy) * 2, entropy, (unsigned long)sizeof(entropy));
}
return entropy;
@@ -867,6 +1017,71 @@ get_hash_secret_salt(XML_Parser parser) {
return parser->m_hash_secret_salt;
}
+static enum XML_Error
+callProcessor(XML_Parser parser, const char *start, const char *end,
+ const char **endPtr) {
+ const size_t have_now = EXPAT_SAFE_PTR_DIFF(end, start);
+
+ if (parser->m_reparseDeferralEnabled
+ && ! parser->m_parsingStatus.finalBuffer) {
+ // Heuristic: don't try to parse a partial token again until the amount of
+ // available data has increased significantly.
+ const size_t had_before = parser->m_partialTokenBytesBefore;
+ // ...but *do* try anyway if we're close to causing a reallocation.
+ size_t available_buffer
+ = EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
+#if XML_CONTEXT_BYTES > 0
+ available_buffer -= EXPAT_MIN(available_buffer, XML_CONTEXT_BYTES);
+#endif
+ available_buffer
+ += EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd);
+ // m_lastBufferRequestSize is never assigned a value < 0, so the cast is ok
+ const bool enough
+ = (have_now >= 2 * had_before)
+ || ((size_t)parser->m_lastBufferRequestSize > available_buffer);
+
+ if (! enough) {
+ *endPtr = start; // callers may expect this to be set
+ return XML_ERROR_NONE;
+ }
+ }
+#if defined(XML_TESTING)
+ g_bytesScanned += (unsigned)have_now;
+#endif
+ // Run in a loop to eliminate dangerous recursion depths
+ enum XML_Error ret;
+ *endPtr = start;
+ while (1) {
+ // Use endPtr as the new start in each iteration, since it will
+ // be set to the next start point by m_processor.
+ ret = parser->m_processor(parser, *endPtr, end, endPtr);
+
+ // Make parsing status (and in particular XML_SUSPENDED) take
+ // precedence over re-enter flag when they disagree
+ if (parser->m_parsingStatus.parsing != XML_PARSING) {
+ parser->m_reenter = XML_FALSE;
+ }
+
+ if (! parser->m_reenter) {
+ break;
+ }
+
+ parser->m_reenter = XML_FALSE;
+ if (ret != XML_ERROR_NONE)
+ return ret;
+ }
+
+ if (ret == XML_ERROR_NONE) {
+ // if we consumed nothing, remember what we had on this parse attempt.
+ if (*endPtr == start) {
+ parser->m_partialTokenBytesBefore = have_now;
+ } else {
+ parser->m_partialTokenBytesBefore = 0;
+ }
+ }
+ return ret;
+}
+
static XML_Bool /* only valid for root parser */
startParsing(XML_Parser parser) {
/* hash functions must be initialized before setContext() is called */
@@ -896,7 +1111,7 @@ parserCreate(const XML_Char *encodingName,
if (memsuite) {
XML_Memory_Handling_Suite *mtemp;
- parser = (XML_Parser)memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
+ parser = memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
if (parser != NULL) {
mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
mtemp->malloc_fcn = memsuite->malloc_fcn;
@@ -966,6 +1181,8 @@ parserCreate(const XML_Char *encodingName,
parser->m_freeBindingList = NULL;
parser->m_freeTagList = NULL;
parser->m_freeInternalEntities = NULL;
+ parser->m_freeAttributeEntities = NULL;
+ parser->m_freeValueEntities = NULL;
parser->m_groupSize = 0;
parser->m_groupConnector = NULL;
@@ -988,6 +1205,14 @@ parserCreate(const XML_Char *encodingName,
parserInit(parser, encodingName);
if (encodingName && ! parser->m_protocolEncodingName) {
+ if (dtd) {
+ // We need to stop the upcoming call to XML_ParserFree from happily
+ // destroying parser->m_dtd because the DTD is shared with the parent
+ // parser and the only guard that keeps XML_ParserFree from destroying
+ // parser->m_dtd is parser->m_isParamEntity but it will be set to
+ // XML_TRUE only later in XML_ExternalEntityParserCreate (or not at all).
+ parser->m_dtd = NULL;
+ }
XML_ParserFree(parser);
return NULL;
}
@@ -1040,6 +1265,9 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) {
parser->m_bufferEnd = parser->m_buffer;
parser->m_parseEndByteIndex = 0;
parser->m_parseEndPtr = NULL;
+ parser->m_partialTokenBytesBefore = 0;
+ parser->m_reparseDeferralEnabled = g_reparseDeferralEnabledDefault;
+ parser->m_lastBufferRequestSize = 0;
parser->m_declElementType = NULL;
parser->m_declAttributeId = NULL;
parser->m_declEntity = NULL;
@@ -1057,6 +1285,8 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) {
parser->m_eventEndPtr = NULL;
parser->m_positionPtr = NULL;
parser->m_openInternalEntities = NULL;
+ parser->m_openAttributeEntities = NULL;
+ parser->m_openValueEntities = NULL;
parser->m_defaultExpandInternalEntities = XML_TRUE;
parser->m_tagLevel = 0;
parser->m_tagStack = NULL;
@@ -1067,12 +1297,26 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) {
parser->m_unknownEncodingData = NULL;
parser->m_parentParser = NULL;
parser->m_parsingStatus.parsing = XML_INITIALIZED;
+ // Reentry can only be triggered inside m_processor calls
+ parser->m_reenter = XML_FALSE;
#ifdef XML_DTD
parser->m_isParamEntity = XML_FALSE;
parser->m_useForeignDTD = XML_FALSE;
parser->m_paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
#endif
parser->m_hash_secret_salt = 0;
+
+#if XML_GE == 1
+ memset(&parser->m_accounting, 0, sizeof(ACCOUNTING));
+ parser->m_accounting.debugLevel = getDebugLevel("EXPAT_ACCOUNTING_DEBUG", 0u);
+ parser->m_accounting.maximumAmplificationFactor
+ = EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT;
+ parser->m_accounting.activationThresholdBytes
+ = EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT;
+
+ memset(&parser->m_entity_stats, 0, sizeof(ENTITY_STATS));
+ parser->m_entity_stats.debugLevel = getDebugLevel("EXPAT_ENTITY_DEBUG", 0u);
+#endif
}
/* moves list of bindings to m_freeBindingList */
@@ -1114,6 +1358,24 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) {
openEntity->next = parser->m_freeInternalEntities;
parser->m_freeInternalEntities = openEntity;
}
+ /* move m_openAttributeEntities to m_freeAttributeEntities (i.e. same task but
+ * for attributes) */
+ openEntityList = parser->m_openAttributeEntities;
+ while (openEntityList) {
+ OPEN_INTERNAL_ENTITY *openEntity = openEntityList;
+ openEntityList = openEntity->next;
+ openEntity->next = parser->m_freeAttributeEntities;
+ parser->m_freeAttributeEntities = openEntity;
+ }
+ /* move m_openValueEntities to m_freeValueEntities (i.e. same task but
+ * for value entities) */
+ openEntityList = parser->m_openValueEntities;
+ while (openEntityList) {
+ OPEN_INTERNAL_ENTITY *openEntity = openEntityList;
+ openEntityList = openEntity->next;
+ openEntity->next = parser->m_freeValueEntities;
+ parser->m_freeValueEntities = openEntity;
+ }
moveToFreeBindingList(parser, parser->m_inheritedBindings);
FREE(parser, parser->m_unknownEncodingMem);
if (parser->m_unknownEncodingRelease)
@@ -1127,6 +1389,19 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) {
return XML_TRUE;
}
+static XML_Bool
+parserBusy(XML_Parser parser) {
+ switch (parser->m_parsingStatus.parsing) {
+ case XML_PARSING:
+ case XML_SUSPENDED:
+ return XML_TRUE;
+ case XML_INITIALIZED:
+ case XML_FINISHED:
+ default:
+ return XML_FALSE;
+ }
+}
+
enum XML_Status XMLCALL
XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) {
if (parser == NULL)
@@ -1135,8 +1410,7 @@ XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) {
XXX There's no way for the caller to determine which of the
XXX possible error cases caused the XML_STATUS_ERROR return.
*/
- if (parser->m_parsingStatus.parsing == XML_PARSING
- || parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parserBusy(parser))
return XML_STATUS_ERROR;
/* Get rid of any previous encoding name */
@@ -1197,6 +1471,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
to worry which hash secrets each table has.
*/
unsigned long oldhash_secret_salt;
+ XML_Bool oldReparseDeferralEnabled;
/* Validate the oldParser parameter before we pull everything out of it */
if (oldParser == NULL)
@@ -1241,6 +1516,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
to worry which hash secrets each table has.
*/
oldhash_secret_salt = parser->m_hash_secret_salt;
+ oldReparseDeferralEnabled = parser->m_reparseDeferralEnabled;
#ifdef XML_DTD
if (! context)
@@ -1253,8 +1529,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
would be otherwise.
*/
if (parser->m_ns) {
- XML_Char tmp[2];
- *tmp = parser->m_namespaceSeparator;
+ XML_Char tmp[2] = {parser->m_namespaceSeparator, 0};
parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
} else {
parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
@@ -1294,6 +1569,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
parser->m_defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
parser->m_ns_triplets = oldns_triplets;
parser->m_hash_secret_salt = oldhash_secret_salt;
+ parser->m_reparseDeferralEnabled = oldReparseDeferralEnabled;
parser->m_parentParser = oldParser;
#ifdef XML_DTD
parser->m_paramEntityParsing = oldParamEntityParsing;
@@ -1371,7 +1647,34 @@ XML_ParserFree(XML_Parser parser) {
entityList = entityList->next;
FREE(parser, openEntity);
}
-
+ /* free m_openAttributeEntities and m_freeAttributeEntities */
+ entityList = parser->m_openAttributeEntities;
+ for (;;) {
+ OPEN_INTERNAL_ENTITY *openEntity;
+ if (entityList == NULL) {
+ if (parser->m_freeAttributeEntities == NULL)
+ break;
+ entityList = parser->m_freeAttributeEntities;
+ parser->m_freeAttributeEntities = NULL;
+ }
+ openEntity = entityList;
+ entityList = entityList->next;
+ FREE(parser, openEntity);
+ }
+ /* free m_openValueEntities and m_freeValueEntities */
+ entityList = parser->m_openValueEntities;
+ for (;;) {
+ OPEN_INTERNAL_ENTITY *openEntity;
+ if (entityList == NULL) {
+ if (parser->m_freeValueEntities == NULL)
+ break;
+ entityList = parser->m_freeValueEntities;
+ parser->m_freeValueEntities = NULL;
+ }
+ openEntity = entityList;
+ entityList = entityList->next;
+ FREE(parser, openEntity);
+ }
destroyBindings(parser->m_freeBindingList, parser);
destroyBindings(parser->m_inheritedBindings, parser);
poolDestroy(&parser->m_tempPool);
@@ -1413,8 +1716,7 @@ XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) {
return XML_ERROR_INVALID_ARGUMENT;
#ifdef XML_DTD
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (parser->m_parsingStatus.parsing == XML_PARSING
- || parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parserBusy(parser))
return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;
parser->m_useForeignDTD = useDTD;
return XML_ERROR_NONE;
@@ -1429,8 +1731,7 @@ XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) {
if (parser == NULL)
return;
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (parser->m_parsingStatus.parsing == XML_PARSING
- || parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parserBusy(parser))
return;
parser->m_ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
}
@@ -1699,8 +2000,7 @@ XML_SetParamEntityParsing(XML_Parser parser,
if (parser == NULL)
return 0;
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (parser->m_parsingStatus.parsing == XML_PARSING
- || parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parserBusy(parser))
return 0;
#ifdef XML_DTD
parser->m_paramEntityParsing = peParsing;
@@ -1717,8 +2017,7 @@ XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt) {
if (parser->m_parentParser)
return XML_SetHashSalt(parser->m_parentParser, hash_salt);
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (parser->m_parsingStatus.parsing == XML_PARSING
- || parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parserBusy(parser))
return 0;
parser->m_hash_secret_salt = hash_salt;
return 1;
@@ -1748,55 +2047,8 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) {
parser->m_parsingStatus.parsing = XML_PARSING;
}
- if (len == 0) {
- parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal;
- if (! isFinal)
- return XML_STATUS_OK;
- parser->m_positionPtr = parser->m_bufferPtr;
- parser->m_parseEndPtr = parser->m_bufferEnd;
-
- /* If data are left over from last buffer, and we now know that these
- data are the final chunk of input, then we have to check them again
- to detect errors based on that fact.
- */
- parser->m_errorCode
- = parser->m_processor(parser, parser->m_bufferPtr,
- parser->m_parseEndPtr, &parser->m_bufferPtr);
-
- if (parser->m_errorCode == XML_ERROR_NONE) {
- switch (parser->m_parsingStatus.parsing) {
- case XML_SUSPENDED:
- /* It is hard to be certain, but it seems that this case
- * cannot occur. This code is cleaning up a previous parse
- * with no new data (since len == 0). Changing the parsing
- * state requires getting to execute a handler function, and
- * there doesn't seem to be an opportunity for that while in
- * this circumstance.
- *
- * Given the uncertainty, we retain the code but exclude it
- * from coverage tests.
- *
- * LCOV_EXCL_START
- */
- XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr,
- parser->m_bufferPtr, &parser->m_position);
- parser->m_positionPtr = parser->m_bufferPtr;
- return XML_STATUS_SUSPENDED;
- /* LCOV_EXCL_STOP */
- case XML_INITIALIZED:
- case XML_PARSING:
- parser->m_parsingStatus.parsing = XML_FINISHED;
- /* fall through */
- default:
- return XML_STATUS_OK;
- }
- }
- parser->m_eventEndPtr = parser->m_eventPtr;
- parser->m_processor = errorProcessor;
- return XML_STATUS_ERROR;
- }
-#ifndef XML_CONTEXT_BYTES
- else if (parser->m_bufferPtr == parser->m_bufferEnd) {
+#if XML_CONTEXT_BYTES == 0
+ if (parser->m_bufferPtr == parser->m_bufferEnd) {
const char *end;
int nLeftOver;
enum XML_Status result;
@@ -1807,12 +2059,15 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) {
parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
+ // though this isn't a buffer request, we assume that `len` is the app's
+ // preferred buffer fill size, and therefore save it here.
+ parser->m_lastBufferRequestSize = len;
parser->m_parseEndByteIndex += len;
parser->m_positionPtr = s;
parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal;
parser->m_errorCode
- = parser->m_processor(parser, s, parser->m_parseEndPtr = s + len, &end);
+ = callProcessor(parser, s, parser->m_parseEndPtr = s + len, &end);
if (parser->m_errorCode != XML_ERROR_NONE) {
parser->m_eventEndPtr = parser->m_eventPtr;
@@ -1839,23 +2094,25 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) {
&parser->m_position);
nLeftOver = s + len - end;
if (nLeftOver) {
- if (parser->m_buffer == NULL
- || nLeftOver > parser->m_bufferLim - parser->m_buffer) {
- /* avoid _signed_ integer overflow */
- char *temp = NULL;
- const int bytesToAllocate = (int)((unsigned)len * 2U);
- if (bytesToAllocate > 0) {
- temp = (char *)REALLOC(parser, parser->m_buffer, bytesToAllocate);
- }
- if (temp == NULL) {
- parser->m_errorCode = XML_ERROR_NO_MEMORY;
- parser->m_eventPtr = parser->m_eventEndPtr = NULL;
- parser->m_processor = errorProcessor;
- return XML_STATUS_ERROR;
- }
- parser->m_buffer = temp;
- parser->m_bufferLim = parser->m_buffer + bytesToAllocate;
+ // Back up and restore the parsing status to avoid XML_ERROR_SUSPENDED
+ // (and XML_ERROR_FINISHED) from XML_GetBuffer.
+ const enum XML_Parsing originalStatus = parser->m_parsingStatus.parsing;
+ parser->m_parsingStatus.parsing = XML_PARSING;
+ void *const temp = XML_GetBuffer(parser, nLeftOver);
+ parser->m_parsingStatus.parsing = originalStatus;
+ // GetBuffer may have overwritten this, but we want to remember what the
+ // app requested, not how many bytes were left over after parsing.
+ parser->m_lastBufferRequestSize = len;
+ if (temp == NULL) {
+ // NOTE: parser->m_errorCode has already been set by XML_GetBuffer().
+ parser->m_eventPtr = parser->m_eventEndPtr = NULL;
+ parser->m_processor = errorProcessor;
+ return XML_STATUS_ERROR;
}
+ // Since we know that the buffer was empty and XML_CONTEXT_BYTES is 0, we
+ // don't have any data to preserve, and can copy straight into the start
+ // of the buffer rather than the GetBuffer return pointer (which may be
+ // pointing further into the allocated buffer).
memcpy(parser->m_buffer, end, nLeftOver);
}
parser->m_bufferPtr = parser->m_buffer;
@@ -1866,16 +2123,15 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) {
parser->m_eventEndPtr = parser->m_bufferPtr;
return result;
}
-#endif /* not defined XML_CONTEXT_BYTES */
- else {
- void *buff = XML_GetBuffer(parser, len);
- if (buff == NULL)
- return XML_STATUS_ERROR;
- else {
- memcpy(buff, s, len);
- return XML_ParseBuffer(parser, len, isFinal);
- }
+#endif /* XML_CONTEXT_BYTES == 0 */
+ void *buff = XML_GetBuffer(parser, len);
+ if (buff == NULL)
+ return XML_STATUS_ERROR;
+ if (len > 0) {
+ assert(s != NULL); // make sure s==NULL && len!=0 was rejected above
+ memcpy(buff, s, len);
}
+ return XML_ParseBuffer(parser, len, isFinal);
}
enum XML_Status XMLCALL
@@ -1885,6 +2141,12 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) {
if (parser == NULL)
return XML_STATUS_ERROR;
+
+ if (len < 0) {
+ parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT;
+ return XML_STATUS_ERROR;
+ }
+
switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
parser->m_errorCode = XML_ERROR_SUSPENDED;
@@ -1893,6 +2155,12 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) {
parser->m_errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
case XML_INITIALIZED:
+ /* Has someone called XML_GetBuffer successfully before? */
+ if (! parser->m_bufferPtr) {
+ parser->m_errorCode = XML_ERROR_NO_BUFFER;
+ return XML_STATUS_ERROR;
+ }
+
if (parser->m_parentParser == NULL && ! startParsing(parser)) {
parser->m_errorCode = XML_ERROR_NO_MEMORY;
return XML_STATUS_ERROR;
@@ -1909,8 +2177,8 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) {
parser->m_parseEndByteIndex += len;
parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal;
- parser->m_errorCode = parser->m_processor(
- parser, start, parser->m_parseEndPtr, &parser->m_bufferPtr);
+ parser->m_errorCode = callProcessor(parser, start, parser->m_parseEndPtr,
+ &parser->m_bufferPtr);
if (parser->m_errorCode != XML_ERROR_NONE) {
parser->m_eventEndPtr = parser->m_eventPtr;
@@ -1955,10 +2223,14 @@ XML_GetBuffer(XML_Parser parser, int len) {
default:;
}
- if (len > EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd)) {
-#ifdef XML_CONTEXT_BYTES
+ // whether or not the request succeeds, `len` seems to be the app's preferred
+ // buffer fill size; remember it.
+ parser->m_lastBufferRequestSize = len;
+ if (len > EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd)
+ || parser->m_buffer == NULL) {
+#if XML_CONTEXT_BYTES > 0
int keep;
-#endif /* defined XML_CONTEXT_BYTES */
+#endif /* XML_CONTEXT_BYTES > 0 */
/* Do not invoke signed arithmetic overflow: */
int neededSize = (int)((unsigned)len
+ (unsigned)EXPAT_SAFE_PTR_DIFF(
@@ -1967,15 +2239,21 @@ XML_GetBuffer(XML_Parser parser, int len) {
parser->m_errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
-#ifdef XML_CONTEXT_BYTES
+#if XML_CONTEXT_BYTES > 0
keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
if (keep > XML_CONTEXT_BYTES)
keep = XML_CONTEXT_BYTES;
+ /* Detect and prevent integer overflow */
+ if (keep > INT_MAX - neededSize) {
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
+ return NULL;
+ }
neededSize += keep;
-#endif /* defined XML_CONTEXT_BYTES */
- if (neededSize
- <= EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) {
-#ifdef XML_CONTEXT_BYTES
+#endif /* XML_CONTEXT_BYTES > 0 */
+ if (parser->m_buffer && parser->m_bufferPtr
+ && neededSize
+ <= EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) {
+#if XML_CONTEXT_BYTES > 0
if (keep < EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer)) {
int offset
= (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer)
@@ -1988,19 +2266,17 @@ XML_GetBuffer(XML_Parser parser, int len) {
parser->m_bufferPtr -= offset;
}
#else
- if (parser->m_buffer && parser->m_bufferPtr) {
- memmove(parser->m_buffer, parser->m_bufferPtr,
- EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr));
- parser->m_bufferEnd
- = parser->m_buffer
- + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr);
- parser->m_bufferPtr = parser->m_buffer;
- }
-#endif /* not defined XML_CONTEXT_BYTES */
+ memmove(parser->m_buffer, parser->m_bufferPtr,
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr));
+ parser->m_bufferEnd
+ = parser->m_buffer
+ + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr);
+ parser->m_bufferPtr = parser->m_buffer;
+#endif /* XML_CONTEXT_BYTES > 0 */
} else {
char *newBuf;
int bufferSize
- = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferPtr);
+ = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer);
if (bufferSize == 0)
bufferSize = INIT_BUFFER_SIZE;
do {
@@ -2017,7 +2293,7 @@ XML_GetBuffer(XML_Parser parser, int len) {
return NULL;
}
parser->m_bufferLim = newBuf + bufferSize;
-#ifdef XML_CONTEXT_BYTES
+#if XML_CONTEXT_BYTES > 0
if (parser->m_bufferPtr) {
memcpy(newBuf, &parser->m_bufferPtr[-keep],
EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr)
@@ -2047,7 +2323,7 @@ XML_GetBuffer(XML_Parser parser, int len) {
parser->m_bufferEnd = newBuf;
}
parser->m_bufferPtr = parser->m_buffer = newBuf;
-#endif /* not defined XML_CONTEXT_BYTES */
+#endif /* XML_CONTEXT_BYTES > 0 */
}
parser->m_eventPtr = parser->m_eventEndPtr = NULL;
parser->m_positionPtr = NULL;
@@ -2055,11 +2331,19 @@ XML_GetBuffer(XML_Parser parser, int len) {
return parser->m_bufferEnd;
}
+static void
+triggerReenter(XML_Parser parser) {
+ parser->m_reenter = XML_TRUE;
+}
+
enum XML_Status XMLCALL
XML_StopParser(XML_Parser parser, XML_Bool resumable) {
if (parser == NULL)
return XML_STATUS_ERROR;
switch (parser->m_parsingStatus.parsing) {
+ case XML_INITIALIZED:
+ parser->m_errorCode = XML_ERROR_NOT_STARTED;
+ return XML_STATUS_ERROR;
case XML_SUSPENDED:
if (resumable) {
parser->m_errorCode = XML_ERROR_SUSPENDED;
@@ -2070,7 +2354,7 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) {
case XML_FINISHED:
parser->m_errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
- default:
+ case XML_PARSING:
if (resumable) {
#ifdef XML_DTD
if (parser->m_isParamEntity) {
@@ -2081,6 +2365,9 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) {
parser->m_parsingStatus.parsing = XML_SUSPENDED;
} else
parser->m_parsingStatus.parsing = XML_FINISHED;
+ break;
+ default:
+ assert(0);
}
return XML_STATUS_OK;
}
@@ -2097,7 +2384,7 @@ XML_ResumeParser(XML_Parser parser) {
}
parser->m_parsingStatus.parsing = XML_PARSING;
- parser->m_errorCode = parser->m_processor(
+ parser->m_errorCode = callProcessor(
parser, parser->m_bufferPtr, parser->m_parseEndPtr, &parser->m_bufferPtr);
if (parser->m_errorCode != XML_ERROR_NONE) {
@@ -2161,7 +2448,7 @@ XML_GetCurrentByteCount(XML_Parser parser) {
const char *XMLCALL
XML_GetInputContext(XML_Parser parser, int *offset, int *size) {
-#ifdef XML_CONTEXT_BYTES
+#if XML_CONTEXT_BYTES > 0
if (parser == NULL)
return NULL;
if (parser->m_eventPtr && parser->m_buffer) {
@@ -2175,7 +2462,7 @@ XML_GetInputContext(XML_Parser parser, int *offset, int *size) {
(void)parser;
(void)offset;
(void)size;
-#endif /* defined XML_CONTEXT_BYTES */
+#endif /* XML_CONTEXT_BYTES > 0 */
return (const char *)0;
}
@@ -2337,6 +2624,17 @@ XML_ErrorString(enum XML_Error code) {
/* Added in 2.2.5. */
case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */
return XML_L("invalid argument");
+ /* Added in 2.3.0. */
+ case XML_ERROR_NO_BUFFER:
+ return XML_L(
+ "a successful prior call to function XML_GetBuffer is required");
+ /* Added in 2.4.0. */
+ case XML_ERROR_AMPLIFICATION_LIMIT_BREACH:
+ return XML_L(
+ "limit on input amplification factor (from DTD and entities) breached");
+ /* Added in 2.6.4. */
+ case XML_ERROR_NOT_STARTED:
+ return XML_L("parser not started");
}
return NULL;
}
@@ -2373,41 +2671,87 @@ XML_ExpatVersionInfo(void) {
const XML_Feature *XMLCALL
XML_GetFeatureList(void) {
- static const XML_Feature features[]
- = {{XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"),
- sizeof(XML_Char)},
- {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),
- sizeof(XML_LChar)},
+ static const XML_Feature features[] = {
+ {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"),
+ sizeof(XML_Char)},
+ {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),
+ sizeof(XML_LChar)},
#ifdef XML_UNICODE
- {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0},
+ {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0},
#endif
#ifdef XML_UNICODE_WCHAR_T
- {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0},
+ {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0},
#endif
#ifdef XML_DTD
- {XML_FEATURE_DTD, XML_L("XML_DTD"), 0},
+ {XML_FEATURE_DTD, XML_L("XML_DTD"), 0},
#endif
-#ifdef XML_CONTEXT_BYTES
- {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"),
- XML_CONTEXT_BYTES},
+#if XML_CONTEXT_BYTES > 0
+ {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"),
+ XML_CONTEXT_BYTES},
#endif
#ifdef XML_MIN_SIZE
- {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0},
+ {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0},
#endif
#ifdef XML_NS
- {XML_FEATURE_NS, XML_L("XML_NS"), 0},
+ {XML_FEATURE_NS, XML_L("XML_NS"), 0},
#endif
#ifdef XML_LARGE_SIZE
- {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0},
+ {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0},
#endif
#ifdef XML_ATTR_INFO
- {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0},
+ {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0},
+#endif
+#if XML_GE == 1
+ /* Added in Expat 2.4.0 for XML_DTD defined and
+ * added in Expat 2.6.0 for XML_GE == 1. */
+ {XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT,
+ XML_L("XML_BLAP_MAX_AMP"),
+ (long int)
+ EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT},
+ {XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT,
+ XML_L("XML_BLAP_ACT_THRES"),
+ EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT},
+ /* Added in Expat 2.6.0. */
+ {XML_FEATURE_GE, XML_L("XML_GE"), 0},
#endif
- {XML_FEATURE_END, NULL, 0}};
+ {XML_FEATURE_END, NULL, 0}};
return features;
}
+#if XML_GE == 1
+XML_Bool XMLCALL
+XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ XML_Parser parser, float maximumAmplificationFactor) {
+ if ((parser == NULL) || (parser->m_parentParser != NULL)
+ || isnan(maximumAmplificationFactor)
+ || (maximumAmplificationFactor < 1.0f)) {
+ return XML_FALSE;
+ }
+ parser->m_accounting.maximumAmplificationFactor = maximumAmplificationFactor;
+ return XML_TRUE;
+}
+
+XML_Bool XMLCALL
+XML_SetBillionLaughsAttackProtectionActivationThreshold(
+ XML_Parser parser, unsigned long long activationThresholdBytes) {
+ if ((parser == NULL) || (parser->m_parentParser != NULL)) {
+ return XML_FALSE;
+ }
+ parser->m_accounting.activationThresholdBytes = activationThresholdBytes;
+ return XML_TRUE;
+}
+#endif /* XML_GE == 1 */
+
+XML_Bool XMLCALL
+XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled) {
+ if (parser != NULL && (enabled == XML_TRUE || enabled == XML_FALSE)) {
+ parser->m_reparseDeferralEnabled = enabled;
+ return XML_TRUE;
+ }
+ return XML_FALSE;
+}
+
/* Initially tag->rawName always points into the parse buffer;
for those TAG instances opened while the current parse buffer was
processed, and not yet closed, we need to store tag->rawName in a more
@@ -2419,6 +2763,7 @@ storeRawNames(XML_Parser parser) {
while (tag) {
int bufSize;
int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
+ size_t rawNameLen;
char *rawNameBuf = tag->buf + nameLen;
/* Stop if already stored. Since m_tagStack is a stack, we can stop
at the first entry that has already been copied; everything
@@ -2427,10 +2772,14 @@ storeRawNames(XML_Parser parser) {
*/
if (tag->rawName == rawNameBuf)
break;
- /* For re-use purposes we need to ensure that the
+ /* For reuse purposes we need to ensure that the
size of tag->buf is a multiple of sizeof(XML_Char).
*/
- bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+ rawNameLen = ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+ /* Detect and prevent integer overflow. */
+ if (rawNameLen > (size_t)INT_MAX - nameLen)
+ return XML_FALSE;
+ bufSize = nameLen + (int)rawNameLen;
if (bufSize > tag->bufEnd - tag->buf) {
char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
if (temp == NULL)
@@ -2460,9 +2809,10 @@ storeRawNames(XML_Parser parser) {
static enum XML_Error PTRCALL
contentProcessor(XML_Parser parser, const char *start, const char *end,
const char **endPtr) {
- enum XML_Error result
- = doContent(parser, 0, parser->m_encoding, start, end, endPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer);
+ enum XML_Error result = doContent(
+ parser, parser->m_parentParser ? 1 : 0, parser->m_encoding, start, end,
+ endPtr, (XML_Bool)! parser->m_parsingStatus.finalBuffer,
+ XML_ACCOUNT_DIRECT);
if (result == XML_ERROR_NONE) {
if (! storeRawNames(parser))
return XML_ERROR_NO_MEMORY;
@@ -2487,6 +2837,14 @@ externalEntityInitProcessor2(XML_Parser parser, const char *start,
int tok = XmlContentTok(parser->m_encoding, start, end, &next);
switch (tok) {
case XML_TOK_BOM:
+#if XML_GE == 1
+ if (! accountingDiffTolerated(parser, tok, start, next, __LINE__,
+ XML_ACCOUNT_DIRECT)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+#endif /* XML_GE == 1 */
+
/* If we are at the end of the buffer, this would cause the next stage,
i.e. externalEntityInitProcessor3, to pass control directly to
doContent (by detecting XML_TOK_NONE) without processing any xml text
@@ -2524,6 +2882,10 @@ externalEntityInitProcessor3(XML_Parser parser, const char *start,
const char *next = start; /* XmlContentTok doesn't always set the last arg */
parser->m_eventPtr = start;
tok = XmlContentTok(parser->m_encoding, start, end, &next);
+ /* Note: These bytes are accounted later in:
+ - processXmlDecl
+ - externalEntityContentProcessor
+ */
parser->m_eventEndPtr = next;
switch (tok) {
@@ -2538,6 +2900,11 @@ externalEntityInitProcessor3(XML_Parser parser, const char *start,
return XML_ERROR_NONE;
case XML_FINISHED:
return XML_ERROR_ABORTED;
+ case XML_PARSING:
+ if (parser->m_reenter) {
+ return XML_ERROR_UNEXPECTED_STATE; // LCOV_EXCL_LINE
+ }
+ /* Fall through */
default:
start = next;
}
@@ -2565,7 +2932,8 @@ externalEntityContentProcessor(XML_Parser parser, const char *start,
const char *end, const char **endPtr) {
enum XML_Error result
= doContent(parser, 1, parser->m_encoding, start, end, endPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer);
+ (XML_Bool)! parser->m_parsingStatus.finalBuffer,
+ XML_ACCOUNT_ENTITY_EXPANSION);
if (result == XML_ERROR_NONE) {
if (! storeRawNames(parser))
return XML_ERROR_NO_MEMORY;
@@ -2576,7 +2944,7 @@ externalEntityContentProcessor(XML_Parser parser, const char *start,
static enum XML_Error
doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
const char *s, const char *end, const char **nextPtr,
- XML_Bool haveMore) {
+ XML_Bool haveMore, enum XML_Account account) {
/* save one level of indirection */
DTD *const dtd = parser->m_dtd;
@@ -2594,6 +2962,17 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
for (;;) {
const char *next = s; /* XmlContentTok doesn't always set the last arg */
int tok = XmlContentTok(enc, s, end, &next);
+#if XML_GE == 1
+ const char *accountAfter
+ = ((tok == XML_TOK_TRAILING_RSQB) || (tok == XML_TOK_TRAILING_CR))
+ ? (haveMore ? s /* i.e. 0 bytes */ : end)
+ : next;
+ if (! accountingDiffTolerated(parser, tok, s, accountAfter, __LINE__,
+ account)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+#endif
*eventEndPP = next;
switch (tok) {
case XML_TOK_TRAILING_CR:
@@ -2649,6 +3028,14 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
XML_Char ch = (XML_Char)XmlPredefinedEntityName(
enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar);
if (ch) {
+#if XML_GE == 1
+ /* NOTE: We are replacing 4-6 characters original input for 1 character
+ * so there is no amplification and hence recording without
+ * protection. */
+ accountingDiffTolerated(parser, tok, (char *)&ch,
+ ((char *)&ch) + sizeof(XML_Char), __LINE__,
+ XML_ACCOUNT_ENTITY_EXPANSION);
+#endif /* XML_GE == 1 */
if (parser->m_characterDataHandler)
parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1);
else if (parser->m_defaultHandler)
@@ -2691,7 +3078,7 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
reportDefault(parser, enc, s, next);
break;
}
- result = processInternalEntity(parser, entity, XML_FALSE);
+ result = processEntity(parser, entity, XML_FALSE, ENTITY_INTERNAL);
if (result != XML_ERROR_NONE)
return result;
} else if (parser->m_externalEntityRefHandler) {
@@ -2767,7 +3154,8 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
}
tag->name.str = (XML_Char *)tag->buf;
*toPtr = XML_T('\0');
- result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
+ result
+ = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings), account);
if (result)
return result;
if (parser->m_startElementHandler)
@@ -2791,7 +3179,8 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
if (! name.str)
return XML_ERROR_NO_MEMORY;
poolFinish(&parser->m_tempPool);
- result = storeAtts(parser, enc, s, &name, &bindings);
+ result = storeAtts(parser, enc, s, &name, &bindings,
+ XML_ACCOUNT_NONE /* token spans whole start tag */);
if (result != XML_ERROR_NONE) {
freeBindings(parser, bindings);
return result;
@@ -2815,7 +3204,9 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
}
if ((parser->m_tagLevel == 0)
&& (parser->m_parsingStatus.parsing != XML_FINISHED)) {
- if (parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_SUSPENDED
+ || (parser->m_parsingStatus.parsing == XML_PARSING
+ && parser->m_reenter))
parser->m_processor = epilogProcessor;
else
return epilogProcessor(parser, next, end, nextPtr);
@@ -2828,9 +3219,6 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
int len;
const char *rawName;
TAG *tag = parser->m_tagStack;
- parser->m_tagStack = tag->parent;
- tag->parent = parser->m_freeTagList;
- parser->m_freeTagList = tag;
rawName = s + enc->minBytesPerChar * 2;
len = XmlNameLength(enc, rawName);
if (len != tag->rawNameLength
@@ -2838,6 +3226,9 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
*eventPP = rawName;
return XML_ERROR_TAG_MISMATCH;
}
+ parser->m_tagStack = tag->parent;
+ tag->parent = parser->m_freeTagList;
+ parser->m_freeTagList = tag;
--parser->m_tagLevel;
if (parser->m_endElementHandler) {
const XML_Char *localPart;
@@ -2847,13 +3238,13 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
if (parser->m_ns && localPart) {
/* localPart and prefix may have been overwritten in
tag->name.str, since this points to the binding->uri
- buffer which gets re-used; so we have to add them again
+ buffer which gets reused; so we have to add them again
*/
uri = (XML_Char *)tag->name.str + tag->name.uriLen;
/* don't need to check for space - already done in storeAtts() */
while (*localPart)
*uri++ = *localPart++;
- prefix = (XML_Char *)tag->name.prefix;
+ prefix = tag->name.prefix;
if (parser->m_ns_triplets && prefix) {
*uri++ = parser->m_namespaceSeparator;
while (*prefix)
@@ -2876,7 +3267,9 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
}
if ((parser->m_tagLevel == 0)
&& (parser->m_parsingStatus.parsing != XML_FINISHED)) {
- if (parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_SUSPENDED
+ || (parser->m_parsingStatus.parsing == XML_PARSING
+ && parser->m_reenter))
parser->m_processor = epilogProcessor;
else
return epilogProcessor(parser, next, end, nextPtr);
@@ -2920,13 +3313,14 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
However, now we have a start/endCdataSectionHandler, so it seems
easier to let the user deal with this.
*/
- else if (0 && parser->m_characterDataHandler)
+ else if ((0) && parser->m_characterDataHandler)
parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf,
0);
/* END disabled code */
else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
- result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore);
+ result
+ = doCdataSection(parser, enc, &next, end, nextPtr, haveMore, account);
if (result != XML_ERROR_NONE)
return result;
else if (! next) {
@@ -2948,8 +3342,8 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
(int)(dataPtr - (ICHAR *)parser->m_dataBuf));
} else
parser->m_characterDataHandler(
- parser->m_handlerArg, (XML_Char *)s,
- (int)((XML_Char *)end - (XML_Char *)s));
+ parser->m_handlerArg, (const XML_Char *)s,
+ (int)((const XML_Char *)end - (const XML_Char *)s));
} else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, end);
/* We are at the end of the final buffer, should we check for
@@ -2982,8 +3376,8 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
*eventPP = s;
}
} else
- charDataHandler(parser->m_handlerArg, (XML_Char *)s,
- (int)((XML_Char *)next - (XML_Char *)s));
+ charDataHandler(parser->m_handlerArg, (const XML_Char *)s,
+ (int)((const XML_Char *)next - (const XML_Char *)s));
} else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
} break;
@@ -3008,14 +3402,22 @@ doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
break;
/* LCOV_EXCL_STOP */
}
- *eventPP = s = next;
switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
+ *eventPP = next;
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
+ *eventPP = next;
return XML_ERROR_ABORTED;
+ case XML_PARSING:
+ if (parser->m_reenter) {
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ }
+ /* Fall through */
default:;
+ *eventPP = s = next;
}
}
/* not reached */
@@ -3055,7 +3457,8 @@ freeBindings(XML_Parser parser, BINDING *bindings) {
*/
static enum XML_Error
storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
- TAG_NAME *tagNamePtr, BINDING **bindingsPtr) {
+ TAG_NAME *tagNamePtr, BINDING **bindingsPtr,
+ enum XML_Account account) {
DTD *const dtd = parser->m_dtd; /* save one level of indirection */
ELEMENT_TYPE *elementType;
int nDefaultAtts;
@@ -3087,13 +3490,38 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
/* get the attributes from the tokenizer */
n = XmlGetAttributes(enc, attStr, parser->m_attsSize, parser->m_atts);
+
+ /* Detect and prevent integer overflow */
+ if (n > INT_MAX - nDefaultAtts) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
if (n + nDefaultAtts > parser->m_attsSize) {
int oldAttsSize = parser->m_attsSize;
ATTRIBUTE *temp;
#ifdef XML_ATTR_INFO
XML_AttrInfo *temp2;
#endif
+
+ /* Detect and prevent integer overflow */
+ if ((nDefaultAtts > INT_MAX - INIT_ATTS_SIZE)
+ || (n > INT_MAX - (nDefaultAtts + INIT_ATTS_SIZE))) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
parser->m_attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
+
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((unsigned)parser->m_attsSize > (size_t)(-1) / sizeof(ATTRIBUTE)) {
+ parser->m_attsSize = oldAttsSize;
+ return XML_ERROR_NO_MEMORY;
+ }
+#endif
+
temp = (ATTRIBUTE *)REALLOC(parser, (void *)parser->m_atts,
parser->m_attsSize * sizeof(ATTRIBUTE));
if (temp == NULL) {
@@ -3102,6 +3530,17 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
}
parser->m_atts = temp;
#ifdef XML_ATTR_INFO
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+# if UINT_MAX >= SIZE_MAX
+ if ((unsigned)parser->m_attsSize > (size_t)(-1) / sizeof(XML_AttrInfo)) {
+ parser->m_attsSize = oldAttsSize;
+ return XML_ERROR_NO_MEMORY;
+ }
+# endif
+
temp2 = (XML_AttrInfo *)REALLOC(parser, (void *)parser->m_attInfo,
parser->m_attsSize * sizeof(XML_AttrInfo));
if (temp2 == NULL) {
@@ -3165,7 +3604,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
/* normalize the attribute value */
result = storeAttributeValue(
parser, enc, isCdata, parser->m_atts[i].valuePtr,
- parser->m_atts[i].valueEnd, &parser->m_tempPool);
+ parser->m_atts[i].valueEnd, &parser->m_tempPool, account);
if (result)
return result;
appAtts[attIndex] = poolStart(&parser->m_tempPool);
@@ -3240,7 +3679,13 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
if (nPrefixes) {
int j; /* hash table index */
unsigned long version = parser->m_nsAttsVersion;
- int nsAttsSize = (int)1 << parser->m_nsAttsPower;
+
+ /* Detect and prevent invalid shift */
+ if (parser->m_nsAttsPower >= sizeof(unsigned int) * 8 /* bits per byte */) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
+ unsigned int nsAttsSize = 1u << parser->m_nsAttsPower;
unsigned char oldNsAttsPower = parser->m_nsAttsPower;
/* size of hash table must be at least 2 * (# of prefixed attributes) */
if ((nPrefixes << 1)
@@ -3251,7 +3696,28 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
;
if (parser->m_nsAttsPower < 3)
parser->m_nsAttsPower = 3;
- nsAttsSize = (int)1 << parser->m_nsAttsPower;
+
+ /* Detect and prevent invalid shift */
+ if (parser->m_nsAttsPower >= sizeof(nsAttsSize) * 8 /* bits per byte */) {
+ /* Restore actual size of memory in m_nsAtts */
+ parser->m_nsAttsPower = oldNsAttsPower;
+ return XML_ERROR_NO_MEMORY;
+ }
+
+ nsAttsSize = 1u << parser->m_nsAttsPower;
+
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if (nsAttsSize > (size_t)(-1) / sizeof(NS_ATT)) {
+ /* Restore actual size of memory in m_nsAtts */
+ parser->m_nsAttsPower = oldNsAttsPower;
+ return XML_ERROR_NO_MEMORY;
+ }
+#endif
+
temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts,
nsAttsSize * sizeof(NS_ATT));
if (! temp) {
@@ -3409,9 +3875,31 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
tagNamePtr->prefixLen = prefixLen;
for (i = 0; localPart[i++];)
; /* i includes null terminator */
+
+ /* Detect and prevent integer overflow */
+ if (binding->uriLen > INT_MAX - prefixLen
+ || i > INT_MAX - (binding->uriLen + prefixLen)) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
n = i + binding->uriLen + prefixLen;
if (n > binding->uriAlloc) {
TAG *p;
+
+ /* Detect and prevent integer overflow */
+ if (n > INT_MAX - EXPAND_SPARE) {
+ return XML_ERROR_NO_MEMORY;
+ }
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((unsigned)(n + EXPAND_SPARE) > (size_t)(-1) / sizeof(XML_Char)) {
+ return XML_ERROR_NO_MEMORY;
+ }
+#endif
+
uri = (XML_Char *)MALLOC(parser, (n + EXPAND_SPARE) * sizeof(XML_Char));
if (! uri)
return XML_ERROR_NO_MEMORY;
@@ -3436,12 +3924,124 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
return XML_ERROR_NONE;
}
+static XML_Bool
+is_rfc3986_uri_char(XML_Char candidate) {
+ // For the RFC 3986 ANBF grammar see
+ // https://datatracker.ietf.org/doc/html/rfc3986#appendix-A
+
+ switch (candidate) {
+ // From rule "ALPHA" (uppercase half)
+ case 'A':
+ case 'B':
+ case 'C':
+ case 'D':
+ case 'E':
+ case 'F':
+ case 'G':
+ case 'H':
+ case 'I':
+ case 'J':
+ case 'K':
+ case 'L':
+ case 'M':
+ case 'N':
+ case 'O':
+ case 'P':
+ case 'Q':
+ case 'R':
+ case 'S':
+ case 'T':
+ case 'U':
+ case 'V':
+ case 'W':
+ case 'X':
+ case 'Y':
+ case 'Z':
+
+ // From rule "ALPHA" (lowercase half)
+ case 'a':
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'e':
+ case 'f':
+ case 'g':
+ case 'h':
+ case 'i':
+ case 'j':
+ case 'k':
+ case 'l':
+ case 'm':
+ case 'n':
+ case 'o':
+ case 'p':
+ case 'q':
+ case 'r':
+ case 's':
+ case 't':
+ case 'u':
+ case 'v':
+ case 'w':
+ case 'x':
+ case 'y':
+ case 'z':
+
+ // From rule "DIGIT"
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+
+ // From rule "pct-encoded"
+ case '%':
+
+ // From rule "unreserved"
+ case '-':
+ case '.':
+ case '_':
+ case '~':
+
+ // From rule "gen-delims"
+ case ':':
+ case '/':
+ case '?':
+ case '#':
+ case '[':
+ case ']':
+ case '@':
+
+ // From rule "sub-delims"
+ case '!':
+ case '$':
+ case '&':
+ case '\'':
+ case '(':
+ case ')':
+ case '*':
+ case '+':
+ case ',':
+ case ';':
+ case '=':
+ return XML_TRUE;
+
+ default:
+ return XML_FALSE;
+ }
+}
+
/* addBinding() overwrites the value of prefix->binding without checking.
Therefore one must keep track of the old value outside of addBinding().
*/
static enum XML_Error
addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
const XML_Char *uri, BINDING **bindingsPtr) {
+ // "http://www.w3.org/XML/1998/namespace"
static const XML_Char xmlNamespace[]
= {ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON,
ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,
@@ -3452,6 +4052,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,
ASCII_e, '\0'};
static const int xmlLen = (int)sizeof(xmlNamespace) / sizeof(XML_Char) - 1;
+ // "http://www.w3.org/2000/xmlns/"
static const XML_Char xmlnsNamespace[]
= {ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH,
ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w,
@@ -3491,6 +4092,29 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
if (! mustBeXML && isXMLNS
&& (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
isXMLNS = XML_FALSE;
+
+ // NOTE: While Expat does not validate namespace URIs against RFC 3986
+ // today (and is not REQUIRED to do so with regard to the XML 1.0
+ // namespaces specification) we have to at least make sure, that
+ // the application on top of Expat (that is likely splitting expanded
+ // element names ("qualified names") of form
+ // "[uri sep] local [sep prefix] '\0'" back into 1, 2 or 3 pieces
+ // in its element handler code) cannot be confused by an attacker
+ // putting additional namespace separator characters into namespace
+ // declarations. That would be ambiguous and not to be expected.
+ //
+ // While the HTML API docs of function XML_ParserCreateNS have been
+ // advising against use of a namespace separator character that can
+ // appear in a URI for >20 years now, some widespread applications
+ // are using URI characters (':' (colon) in particular) for a
+ // namespace separator, in practice. To keep these applications
+ // functional, we only reject namespaces URIs containing the
+ // application-chosen namespace separator if the chosen separator
+ // is a non-URI character with regard to RFC 3986.
+ if (parser->m_ns && (uri[len] == parser->m_namespaceSeparator)
+ && ! is_rfc3986_uri_char(uri[len])) {
+ return XML_ERROR_SYNTAX;
+ }
}
isXML = isXML && len == xmlLen;
isXMLNS = isXMLNS && len == xmlnsLen;
@@ -3507,6 +4131,21 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
if (parser->m_freeBindingList) {
b = parser->m_freeBindingList;
if (len > b->uriAlloc) {
+ /* Detect and prevent integer overflow */
+ if (len > INT_MAX - EXPAND_SPARE) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((unsigned)(len + EXPAND_SPARE) > (size_t)(-1) / sizeof(XML_Char)) {
+ return XML_ERROR_NO_MEMORY;
+ }
+#endif
+
XML_Char *temp = (XML_Char *)REALLOC(
parser, b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE));
if (temp == NULL)
@@ -3519,6 +4158,21 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
b = (BINDING *)MALLOC(parser, sizeof(BINDING));
if (! b)
return XML_ERROR_NO_MEMORY;
+
+ /* Detect and prevent integer overflow */
+ if (len > INT_MAX - EXPAND_SPARE) {
+ return XML_ERROR_NO_MEMORY;
+ }
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((unsigned)(len + EXPAND_SPARE) > (size_t)(-1) / sizeof(XML_Char)) {
+ return XML_ERROR_NO_MEMORY;
+ }
+#endif
+
b->uri
= (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE));
if (! b->uri) {
@@ -3554,9 +4208,9 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
static enum XML_Error PTRCALL
cdataSectionProcessor(XML_Parser parser, const char *start, const char *end,
const char **endPtr) {
- enum XML_Error result
- = doCdataSection(parser, parser->m_encoding, &start, end, endPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer);
+ enum XML_Error result = doCdataSection(
+ parser, parser->m_encoding, &start, end, endPtr,
+ (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_ACCOUNT_DIRECT);
if (result != XML_ERROR_NONE)
return result;
if (start) {
@@ -3576,7 +4230,8 @@ cdataSectionProcessor(XML_Parser parser, const char *start, const char *end,
*/
static enum XML_Error
doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
- const char *end, const char **nextPtr, XML_Bool haveMore) {
+ const char *end, const char **nextPtr, XML_Bool haveMore,
+ enum XML_Account account) {
const char *s = *startPtr;
const char **eventPP;
const char **eventEndPP;
@@ -3594,6 +4249,14 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
for (;;) {
const char *next = s; /* in case of XML_TOK_NONE or XML_TOK_PARTIAL */
int tok = XmlCdataSectionTok(enc, s, end, &next);
+#if XML_GE == 1
+ if (! accountingDiffTolerated(parser, tok, s, next, __LINE__, account)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+#else
+ UNUSED_P(account);
+#endif
*eventEndPP = next;
switch (tok) {
case XML_TOK_CDATA_SECT_CLOSE:
@@ -3601,7 +4264,7 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
parser->m_endCdataSectionHandler(parser->m_handlerArg);
/* BEGIN disabled code */
/* see comment under XML_TOK_CDATA_SECT_OPEN */
- else if (0 && parser->m_characterDataHandler)
+ else if ((0) && parser->m_characterDataHandler)
parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf,
0);
/* END disabled code */
@@ -3637,8 +4300,8 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
*eventPP = s;
}
} else
- charDataHandler(parser->m_handlerArg, (XML_Char *)s,
- (int)((XML_Char *)next - (XML_Char *)s));
+ charDataHandler(parser->m_handlerArg, (const XML_Char *)s,
+ (int)((const XML_Char *)next - (const XML_Char *)s));
} else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
} break;
@@ -3671,14 +4334,21 @@ doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
/* LCOV_EXCL_STOP */
}
- *eventPP = s = next;
switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
+ *eventPP = next;
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
+ *eventPP = next;
return XML_ERROR_ABORTED;
+ case XML_PARSING:
+ if (parser->m_reenter) {
+ return XML_ERROR_UNEXPECTED_STATE; // LCOV_EXCL_LINE
+ }
+ /* Fall through */
default:;
+ *eventPP = s = next;
}
}
/* not reached */
@@ -3738,6 +4408,13 @@ doIgnoreSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
*eventPP = s;
*startPtr = NULL;
tok = XmlIgnoreSectionTok(enc, s, end, &next);
+# if XML_GE == 1
+ if (! accountingDiffTolerated(parser, tok, s, next, __LINE__,
+ XML_ACCOUNT_DIRECT)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+# endif
*eventEndPP = next;
switch (tok) {
case XML_TOK_IGNORE_SECT:
@@ -3787,7 +4464,7 @@ initializeEncoding(XML_Parser parser) {
const char *s;
#ifdef XML_UNICODE
char encodingBuf[128];
- /* See comments abount `protoclEncodingName` in parserInit() */
+ /* See comments about `protocolEncodingName` in parserInit() */
if (! parser->m_protocolEncodingName)
s = NULL;
else {
@@ -3819,9 +4496,18 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s,
const XML_Char *storedEncName = NULL;
const ENCODING *newEncoding = NULL;
const char *version = NULL;
- const char *versionend;
+ const char *versionend = NULL;
const XML_Char *storedversion = NULL;
int standalone = -1;
+
+#if XML_GE == 1
+ if (! accountingDiffTolerated(parser, XML_TOK_XML_DECL, s, next, __LINE__,
+ XML_ACCOUNT_DIRECT)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+#endif
+
if (! (parser->m_ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)(
isGeneralTextEntity, parser->m_encoding, s, next, &parser->m_eventPtr,
&version, &versionend, &encodingName, &newEncoding, &standalone)) {
@@ -3971,6 +4657,10 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end,
for (;;) {
tok = XmlPrologTok(parser->m_encoding, start, end, &next);
+ /* Note: Except for XML_TOK_BOM below, these bytes are accounted later in:
+ - storeEntityValue
+ - processXmlDecl
+ */
parser->m_eventEndPtr = next;
if (tok <= 0) {
if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
@@ -3989,7 +4679,8 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end,
break;
}
/* found end of entity value - can store it now */
- return storeEntityValue(parser, parser->m_encoding, s, end);
+ return storeEntityValue(parser, parser->m_encoding, s, end,
+ XML_ACCOUNT_DIRECT, NULL);
} else if (tok == XML_TOK_XML_DECL) {
enum XML_Error result;
result = processXmlDecl(parser, 0, start, next);
@@ -4007,17 +4698,25 @@ entityValueInitProcessor(XML_Parser parser, const char *s, const char *end,
parser->m_processor = entityValueProcessor;
return entityValueProcessor(parser, next, end, nextPtr);
}
- /* If we are at the end of the buffer, this would cause XmlPrologTok to
- return XML_TOK_NONE on the next call, which would then cause the
- function to exit with *nextPtr set to s - that is what we want for other
- tokens, but not for the BOM - we would rather like to skip it;
- then, when this routine is entered the next time, XmlPrologTok will
- return XML_TOK_INVALID, since the BOM is still in the buffer
+ /* XmlPrologTok has now set the encoding based on the BOM it found, and we
+ must move s and nextPtr forward to consume the BOM.
+
+ If we didn't, and got XML_TOK_NONE from the next XmlPrologTok call, we
+ would leave the BOM in the buffer and return. On the next call to this
+ function, our XmlPrologTok call would return XML_TOK_INVALID, since it
+ is not valid to have multiple BOMs.
*/
- else if (tok == XML_TOK_BOM && next == end
- && ! parser->m_parsingStatus.finalBuffer) {
+ else if (tok == XML_TOK_BOM) {
+# if XML_GE == 1
+ if (! accountingDiffTolerated(parser, tok, s, next, __LINE__,
+ XML_ACCOUNT_DIRECT)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+# endif
+
*nextPtr = next;
- return XML_ERROR_NONE;
+ s = next;
}
/* If we get this token, we have the start of what might be a
normal tag, but not a declaration (i.e. it doesn't begin with
@@ -4058,16 +4757,24 @@ externalParEntProcessor(XML_Parser parser, const char *s, const char *end,
}
/* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.
However, when parsing an external subset, doProlog will not accept a BOM
- as valid, and report a syntax error, so we have to skip the BOM
+ as valid, and report a syntax error, so we have to skip the BOM, and
+ account for the BOM bytes.
*/
else if (tok == XML_TOK_BOM) {
+ if (! accountingDiffTolerated(parser, tok, s, next, __LINE__,
+ XML_ACCOUNT_DIRECT)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+
s = next;
tok = XmlPrologTok(parser->m_encoding, s, end, &next);
}
parser->m_processor = prologProcessor;
return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE);
+ (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE,
+ XML_ACCOUNT_DIRECT);
}
static enum XML_Error PTRCALL
@@ -4080,6 +4787,9 @@ entityValueProcessor(XML_Parser parser, const char *s, const char *end,
for (;;) {
tok = XmlPrologTok(enc, start, end, &next);
+ /* Note: These bytes are accounted later in:
+ - storeEntityValue
+ */
if (tok <= 0) {
if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
*nextPtr = s;
@@ -4097,7 +4807,7 @@ entityValueProcessor(XML_Parser parser, const char *s, const char *end,
break;
}
/* found end of entity value - can store it now */
- return storeEntityValue(parser, enc, s, end);
+ return storeEntityValue(parser, enc, s, end, XML_ACCOUNT_DIRECT, NULL);
}
start = next;
}
@@ -4111,13 +4821,14 @@ prologProcessor(XML_Parser parser, const char *s, const char *end,
const char *next = s;
int tok = XmlPrologTok(parser->m_encoding, s, end, &next);
return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE);
+ (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE,
+ XML_ACCOUNT_DIRECT);
}
static enum XML_Error
doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
int tok, const char *next, const char **nextPtr, XML_Bool haveMore,
- XML_Bool allowClosingDoctype) {
+ XML_Bool allowClosingDoctype, enum XML_Account account) {
#ifdef XML_DTD
static const XML_Char externalSubsetName[] = {ASCII_HASH, '\0'};
#endif /* XML_DTD */
@@ -4144,6 +4855,10 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
static const XML_Char enumValueSep[] = {ASCII_PIPE, '\0'};
static const XML_Char enumValueStart[] = {ASCII_LPAREN, '\0'};
+#ifndef XML_DTD
+ UNUSED_P(account);
+#endif
+
/* save one level of indirection */
DTD *const dtd = parser->m_dtd;
@@ -4208,6 +4923,21 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
}
}
role = XmlTokenRole(&parser->m_prologState, tok, s, next, enc);
+#if XML_GE == 1
+ switch (role) {
+ case XML_ROLE_INSTANCE_START: // bytes accounted in contentProcessor
+ case XML_ROLE_XML_DECL: // bytes accounted in processXmlDecl
+# ifdef XML_DTD
+ case XML_ROLE_TEXT_DECL: // bytes accounted in processXmlDecl
+# endif
+ break;
+ default:
+ if (! accountingDiffTolerated(parser, tok, s, next, __LINE__, account)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+ }
+#endif
switch (role) {
case XML_ROLE_XML_DECL: {
enum XML_Error result = processXmlDecl(parser, 0, s, next);
@@ -4472,10 +5202,10 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
parser->m_handlerArg, parser->m_declElementType->name,
parser->m_declAttributeId->name, parser->m_declAttributeType, 0,
role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);
- poolClear(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
}
+ poolClear(&parser->m_tempPool);
break;
case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:
case XML_ROLE_FIXED_ATTRIBUTE_VALUE:
@@ -4483,7 +5213,8 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
const XML_Char *attVal;
enum XML_Error result = storeAttributeValue(
parser, enc, parser->m_declAttributeIsCdata,
- s + enc->minBytesPerChar, next - enc->minBytesPerChar, &dtd->pool);
+ s + enc->minBytesPerChar, next - enc->minBytesPerChar, &dtd->pool,
+ XML_ACCOUNT_NONE);
if (result)
return result;
attVal = poolStart(&dtd->pool);
@@ -4516,8 +5247,12 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
break;
case XML_ROLE_ENTITY_VALUE:
if (dtd->keepProcessing) {
- enum XML_Error result = storeEntityValue(
- parser, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar);
+#if XML_GE == 1
+ // This will store the given replacement text in
+ // parser->m_declEntity->textPtr.
+ enum XML_Error result = callStoreEntityValue(
+ parser, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar,
+ XML_ACCOUNT_NONE);
if (parser->m_declEntity) {
parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool);
parser->m_declEntity->textLen
@@ -4535,6 +5270,25 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
poolDiscard(&dtd->entityValuePool);
if (result != XML_ERROR_NONE)
return result;
+#else
+ // This will store "&amp;entity123;" in parser->m_declEntity->textPtr
+ // to end up as "&entity123;" in the handler.
+ if (parser->m_declEntity != NULL) {
+ const enum XML_Error result
+ = storeSelfEntityValue(parser, parser->m_declEntity);
+ if (result != XML_ERROR_NONE)
+ return result;
+
+ if (parser->m_entityDeclHandler) {
+ *eventEndPP = s;
+ parser->m_entityDeclHandler(
+ parser->m_handlerArg, parser->m_declEntity->name,
+ parser->m_declEntity->is_param, parser->m_declEntity->textPtr,
+ parser->m_declEntity->textLen, parser->m_curBase, 0, 0, 0);
+ handleDefault = XML_FALSE;
+ }
+ }
+#endif
}
break;
case XML_ROLE_DOCTYPE_SYSTEM_ID:
@@ -4593,6 +5347,16 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
}
break;
case XML_ROLE_ENTITY_COMPLETE:
+#if XML_GE == 0
+ // This will store "&amp;entity123;" in entity->textPtr
+ // to end up as "&entity123;" in the handler.
+ if (parser->m_declEntity != NULL) {
+ const enum XML_Error result
+ = storeSelfEntityValue(parser, parser->m_declEntity);
+ if (result != XML_ERROR_NONE)
+ return result;
+ }
+#endif
if (dtd->keepProcessing && parser->m_declEntity
&& parser->m_entityDeclHandler) {
*eventEndPP = s;
@@ -4776,6 +5540,11 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
if (parser->m_prologState.level >= parser->m_groupSize) {
if (parser->m_groupSize) {
{
+ /* Detect and prevent integer overflow */
+ if (parser->m_groupSize > (unsigned int)(-1) / 2u) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
char *const new_connector = (char *)REALLOC(
parser, parser->m_groupConnector, parser->m_groupSize *= 2);
if (new_connector == NULL) {
@@ -4786,6 +5555,16 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
}
if (dtd->scaffIndex) {
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if (parser->m_groupSize > (size_t)(-1) / sizeof(int)) {
+ return XML_ERROR_NO_MEMORY;
+ }
+#endif
+
int *const new_scaff_index = (int *)REALLOC(
parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int));
if (new_scaff_index == NULL)
@@ -4866,7 +5645,7 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
*
* If 'standalone' is false, the DTD must have no
* parameter entities or we wouldn't have passed the outer
- * 'if' statement. That measn the only entity in the hash
+ * 'if' statement. That means the only entity in the hash
* table is the external subset name "#" which cannot be
* given as a parameter entity name in XML syntax, so the
* lookup must have returned NULL and we don't even reach
@@ -4898,7 +5677,7 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
enum XML_Error result;
XML_Bool betweenDecl
= (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);
- result = processInternalEntity(parser, entity, betweenDecl);
+ result = processEntity(parser, entity, betweenDecl, ENTITY_INTERNAL);
if (result != XML_ERROR_NONE)
return result;
handleDefault = XML_FALSE;
@@ -4907,12 +5686,15 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
if (parser->m_externalEntityRefHandler) {
dtd->paramEntityRead = XML_FALSE;
entity->open = XML_TRUE;
+ entityTrackingOnOpen(parser, entity, __LINE__);
if (! parser->m_externalEntityRefHandler(
parser->m_externalEntityRefHandlerArg, 0, entity->base,
entity->systemId, entity->publicId)) {
+ entityTrackingOnClose(parser, entity, __LINE__);
entity->open = XML_FALSE;
return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
}
+ entityTrackingOnClose(parser, entity, __LINE__);
entity->open = XML_FALSE;
handleDefault = XML_FALSE;
if (! dtd->paramEntityRead) {
@@ -4991,7 +5773,7 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
if (dtd->in_eldecl) {
ELEMENT_TYPE *el;
const XML_Char *name;
- int nameLen;
+ size_t nameLen;
const char *nxt
= (quant == XML_CQUANT_NONE ? next : next - enc->minBytesPerChar);
int myindex = nextScaffoldPart(parser);
@@ -5007,7 +5789,13 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
nameLen = 0;
for (; name[nameLen++];)
;
- dtd->contentStringLen += nameLen;
+
+ /* Detect and prevent integer overflow */
+ if (nameLen > UINT_MAX - dtd->contentStringLen) {
+ return XML_ERROR_NO_MEMORY;
+ }
+
+ dtd->contentStringLen += (unsigned)nameLen;
if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
}
@@ -5094,6 +5882,12 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
return XML_ERROR_NONE;
case XML_FINISHED:
return XML_ERROR_ABORTED;
+ case XML_PARSING:
+ if (parser->m_reenter) {
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ }
+ /* Fall through */
default:
s = next;
tok = XmlPrologTok(enc, s, end, &next);
@@ -5110,6 +5904,13 @@ epilogProcessor(XML_Parser parser, const char *s, const char *end,
for (;;) {
const char *next = NULL;
int tok = XmlPrologTok(parser->m_encoding, s, end, &next);
+#if XML_GE == 1
+ if (! accountingDiffTolerated(parser, tok, s, next, __LINE__,
+ XML_ACCOUNT_DIRECT)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+#endif
parser->m_eventEndPtr = next;
switch (tok) {
/* report partial linebreak - it might be the last token */
@@ -5154,28 +5955,58 @@ epilogProcessor(XML_Parser parser, const char *s, const char *end,
default:
return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
}
- parser->m_eventPtr = s = next;
switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
+ parser->m_eventPtr = next;
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
+ parser->m_eventPtr = next;
return XML_ERROR_ABORTED;
+ case XML_PARSING:
+ if (parser->m_reenter) {
+ return XML_ERROR_UNEXPECTED_STATE; // LCOV_EXCL_LINE
+ }
+ /* Fall through */
default:;
+ parser->m_eventPtr = s = next;
}
}
}
static enum XML_Error
-processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) {
- const char *textStart, *textEnd;
- const char *next;
- enum XML_Error result;
- OPEN_INTERNAL_ENTITY *openEntity;
+processEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl,
+ enum EntityType type) {
+ OPEN_INTERNAL_ENTITY *openEntity, **openEntityList, **freeEntityList;
+ switch (type) {
+ case ENTITY_INTERNAL:
+ parser->m_processor = internalEntityProcessor;
+ openEntityList = &parser->m_openInternalEntities;
+ freeEntityList = &parser->m_freeInternalEntities;
+ break;
+ case ENTITY_ATTRIBUTE:
+ openEntityList = &parser->m_openAttributeEntities;
+ freeEntityList = &parser->m_freeAttributeEntities;
+ break;
+ case ENTITY_VALUE:
+ openEntityList = &parser->m_openValueEntities;
+ freeEntityList = &parser->m_freeValueEntities;
+ break;
+ /* default case serves merely as a safety net in case of a
+ * wrong entityType. Therefore we exclude the following lines
+ * from the test coverage.
+ *
+ * LCOV_EXCL_START
+ */
+ default:
+ // Should not reach here
+ assert(0);
+ /* LCOV_EXCL_STOP */
+ }
- if (parser->m_freeInternalEntities) {
- openEntity = parser->m_freeInternalEntities;
- parser->m_freeInternalEntities = openEntity->next;
+ if (*freeEntityList) {
+ openEntity = *freeEntityList;
+ *freeEntityList = openEntity->next;
} else {
openEntity
= (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY));
@@ -5183,48 +6014,34 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) {
return XML_ERROR_NO_MEMORY;
}
entity->open = XML_TRUE;
+ entity->hasMore = XML_TRUE;
+#if XML_GE == 1
+ entityTrackingOnOpen(parser, entity, __LINE__);
+#endif
entity->processed = 0;
- openEntity->next = parser->m_openInternalEntities;
- parser->m_openInternalEntities = openEntity;
+ openEntity->next = *openEntityList;
+ *openEntityList = openEntity;
openEntity->entity = entity;
+ openEntity->type = type;
openEntity->startTagLevel = parser->m_tagLevel;
openEntity->betweenDecl = betweenDecl;
openEntity->internalEventPtr = NULL;
openEntity->internalEventEndPtr = NULL;
- textStart = (const char *)entity->textPtr;
- textEnd = (const char *)(entity->textPtr + entity->textLen);
- /* Set a safe default value in case 'next' does not get set */
- next = textStart;
-
-#ifdef XML_DTD
- if (entity->is_param) {
- int tok
- = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
- result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd,
- tok, next, &next, XML_FALSE, XML_FALSE);
- } else
-#endif /* XML_DTD */
- result = doContent(parser, parser->m_tagLevel, parser->m_internalEncoding,
- textStart, textEnd, &next, XML_FALSE);
- if (result == XML_ERROR_NONE) {
- if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) {
- entity->processed = (int)(next - textStart);
- parser->m_processor = internalEntityProcessor;
- } else {
- entity->open = XML_FALSE;
- parser->m_openInternalEntities = openEntity->next;
- /* put openEntity back in list of free instances */
- openEntity->next = parser->m_freeInternalEntities;
- parser->m_freeInternalEntities = openEntity;
- }
+ // Only internal entities make use of the reenter flag
+ // therefore no need to set it for other entity types
+ if (type == ENTITY_INTERNAL) {
+ triggerReenter(parser);
}
- return result;
+ return XML_ERROR_NONE;
}
static enum XML_Error PTRCALL
internalEntityProcessor(XML_Parser parser, const char *s, const char *end,
const char **nextPtr) {
+ UNUSED_P(s);
+ UNUSED_P(end);
+ UNUSED_P(nextPtr);
ENTITY *entity;
const char *textStart, *textEnd;
const char *next;
@@ -5234,53 +6051,67 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end,
return XML_ERROR_UNEXPECTED_STATE;
entity = openEntity->entity;
- textStart = ((const char *)entity->textPtr) + entity->processed;
- textEnd = (const char *)(entity->textPtr + entity->textLen);
- /* Set a safe default value in case 'next' does not get set */
- next = textStart;
-#ifdef XML_DTD
- if (entity->is_param) {
- int tok
- = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
- result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd,
- tok, next, &next, XML_FALSE, XML_TRUE);
- } else
-#endif /* XML_DTD */
- result = doContent(parser, openEntity->startTagLevel,
- parser->m_internalEncoding, textStart, textEnd, &next,
- XML_FALSE);
+ // This will return early
+ if (entity->hasMore) {
+ textStart = ((const char *)entity->textPtr) + entity->processed;
+ textEnd = (const char *)(entity->textPtr + entity->textLen);
+ /* Set a safe default value in case 'next' does not get set */
+ next = textStart;
+
+ if (entity->is_param) {
+ int tok
+ = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
+ result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd,
+ tok, next, &next, XML_FALSE, XML_FALSE,
+ XML_ACCOUNT_ENTITY_EXPANSION);
+ } else {
+ result = doContent(parser, openEntity->startTagLevel,
+ parser->m_internalEncoding, textStart, textEnd, &next,
+ XML_FALSE, XML_ACCOUNT_ENTITY_EXPANSION);
+ }
- if (result != XML_ERROR_NONE)
- return result;
- else if (textEnd != next
- && parser->m_parsingStatus.parsing == XML_SUSPENDED) {
- entity->processed = (int)(next - (const char *)entity->textPtr);
+ if (result != XML_ERROR_NONE)
+ return result;
+ // Check if entity is complete, if not, mark down how much of it is
+ // processed
+ if (textEnd != next
+ && (parser->m_parsingStatus.parsing == XML_SUSPENDED
+ || (parser->m_parsingStatus.parsing == XML_PARSING
+ && parser->m_reenter))) {
+ entity->processed = (int)(next - (const char *)entity->textPtr);
+ return result;
+ }
+
+ // Entity is complete. We cannot close it here since we need to first
+ // process its possible inner entities (which are added to the
+ // m_openInternalEntities during doProlog or doContent calls above)
+ entity->hasMore = XML_FALSE;
+ triggerReenter(parser);
return result;
- } else {
- entity->open = XML_FALSE;
- parser->m_openInternalEntities = openEntity->next;
- /* put openEntity back in list of free instances */
- openEntity->next = parser->m_freeInternalEntities;
- parser->m_freeInternalEntities = openEntity;
- }
+ } // End of entity processing, "if" block will return here
-#ifdef XML_DTD
- if (entity->is_param) {
- int tok;
- parser->m_processor = prologProcessor;
- tok = XmlPrologTok(parser->m_encoding, s, end, &next);
- return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE);
- } else
-#endif /* XML_DTD */
- {
- parser->m_processor = contentProcessor;
- /* see externalEntityContentProcessor vs contentProcessor */
- return doContent(parser, parser->m_parentParser ? 1 : 0, parser->m_encoding,
- s, end, nextPtr,
- (XML_Bool)! parser->m_parsingStatus.finalBuffer);
+ // Remove fully processed openEntity from open entity list.
+#if XML_GE == 1
+ entityTrackingOnClose(parser, entity, __LINE__);
+#endif
+ // openEntity is m_openInternalEntities' head, as we set it at the start of
+ // this function and we skipped doProlog and doContent calls with hasMore set
+ // to false. This means we can directly remove the head of
+ // m_openInternalEntities
+ assert(parser->m_openInternalEntities == openEntity);
+ entity->open = XML_FALSE;
+ parser->m_openInternalEntities = parser->m_openInternalEntities->next;
+
+ /* put openEntity back in list of free instances */
+ openEntity->next = parser->m_freeInternalEntities;
+ parser->m_freeInternalEntities = openEntity;
+
+ if (parser->m_openInternalEntities == NULL) {
+ parser->m_processor = entity->is_param ? prologProcessor : contentProcessor;
}
+ triggerReenter(parser);
+ return XML_ERROR_NONE;
}
static enum XML_Error PTRCALL
@@ -5294,9 +6125,72 @@ errorProcessor(XML_Parser parser, const char *s, const char *end,
static enum XML_Error
storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
- const char *ptr, const char *end, STRING_POOL *pool) {
- enum XML_Error result
- = appendAttributeValue(parser, enc, isCdata, ptr, end, pool);
+ const char *ptr, const char *end, STRING_POOL *pool,
+ enum XML_Account account) {
+ const char *next = ptr;
+ enum XML_Error result = XML_ERROR_NONE;
+
+ while (1) {
+ if (! parser->m_openAttributeEntities) {
+ result = appendAttributeValue(parser, enc, isCdata, next, end, pool,
+ account, &next);
+ } else {
+ OPEN_INTERNAL_ENTITY *const openEntity = parser->m_openAttributeEntities;
+ if (! openEntity)
+ return XML_ERROR_UNEXPECTED_STATE;
+
+ ENTITY *const entity = openEntity->entity;
+ const char *const textStart
+ = ((const char *)entity->textPtr) + entity->processed;
+ const char *const textEnd
+ = (const char *)(entity->textPtr + entity->textLen);
+ /* Set a safe default value in case 'next' does not get set */
+ const char *nextInEntity = textStart;
+ if (entity->hasMore) {
+ result = appendAttributeValue(
+ parser, parser->m_internalEncoding, isCdata, textStart, textEnd,
+ pool, XML_ACCOUNT_ENTITY_EXPANSION, &nextInEntity);
+ if (result != XML_ERROR_NONE)
+ break;
+ // Check if entity is complete, if not, mark down how much of it is
+ // processed. A XML_SUSPENDED check here is not required as
+ // appendAttributeValue will never suspend the parser.
+ if (textEnd != nextInEntity) {
+ entity->processed
+ = (int)(nextInEntity - (const char *)entity->textPtr);
+ continue;
+ }
+
+ // Entity is complete. We cannot close it here since we need to first
+ // process its possible inner entities (which are added to the
+ // m_openAttributeEntities during appendAttributeValue)
+ entity->hasMore = XML_FALSE;
+ continue;
+ } // End of entity processing, "if" block skips the rest
+
+ // Remove fully processed openEntity from open entity list.
+#if XML_GE == 1
+ entityTrackingOnClose(parser, entity, __LINE__);
+#endif
+ // openEntity is m_openAttributeEntities' head, since we set it at the
+ // start of this function and because we skipped appendAttributeValue call
+ // with hasMore set to false. This means we can directly remove the head
+ // of m_openAttributeEntities
+ assert(parser->m_openAttributeEntities == openEntity);
+ entity->open = XML_FALSE;
+ parser->m_openAttributeEntities = parser->m_openAttributeEntities->next;
+
+ /* put openEntity back in list of free instances */
+ openEntity->next = parser->m_freeAttributeEntities;
+ parser->m_freeAttributeEntities = openEntity;
+ }
+
+ // Break if an error occurred or there is nothing left to process
+ if (result || (parser->m_openAttributeEntities == NULL && end == next)) {
+ break;
+ }
+ }
+
if (result)
return result;
if (! isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
@@ -5308,13 +6202,28 @@ storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
static enum XML_Error
appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
- const char *ptr, const char *end, STRING_POOL *pool) {
+ const char *ptr, const char *end, STRING_POOL *pool,
+ enum XML_Account account, const char **nextPtr) {
DTD *const dtd = parser->m_dtd; /* save one level of indirection */
+#ifndef XML_DTD
+ UNUSED_P(account);
+#endif
+
for (;;) {
- const char *next;
+ const char *next
+ = ptr; /* XmlAttributeValueTok doesn't always set the last arg */
int tok = XmlAttributeValueTok(enc, ptr, end, &next);
+#if XML_GE == 1
+ if (! accountingDiffTolerated(parser, tok, ptr, next, __LINE__, account)) {
+ accountingOnAbort(parser);
+ return XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ }
+#endif
switch (tok) {
case XML_TOK_NONE:
+ if (nextPtr) {
+ *nextPtr = next;
+ }
return XML_ERROR_NONE;
case XML_TOK_INVALID:
if (enc == parser->m_encoding)
@@ -5372,6 +6281,14 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
XML_Char ch = (XML_Char)XmlPredefinedEntityName(
enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar);
if (ch) {
+#if XML_GE == 1
+ /* NOTE: We are replacing 4-6 characters original input for 1 character
+ * so there is no amplification and hence recording without
+ * protection. */
+ accountingDiffTolerated(parser, tok, (char *)&ch,
+ ((char *)&ch) + sizeof(XML_Char), __LINE__,
+ XML_ACCOUNT_ENTITY_EXPANSION);
+#endif /* XML_GE == 1 */
if (! poolAppendChar(pool, ch))
return XML_ERROR_NO_MEMORY;
break;
@@ -5447,14 +6364,11 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
} else {
enum XML_Error result;
- const XML_Char *textEnd = entity->textPtr + entity->textLen;
- entity->open = XML_TRUE;
- result = appendAttributeValue(parser, parser->m_internalEncoding,
- isCdata, (const char *)entity->textPtr,
- (const char *)textEnd, pool);
- entity->open = XML_FALSE;
- if (result)
- return result;
+ result = processEntity(parser, entity, XML_FALSE, ENTITY_ATTRIBUTE);
+ if ((result == XML_ERROR_NONE) && (nextPtr != NULL)) {
+ *nextPtr = next;
+ }
+ return result;
}
} break;
default:
@@ -5479,16 +6393,20 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
/* not reached */
}
+#if XML_GE == 1
static enum XML_Error
storeEntityValue(XML_Parser parser, const ENCODING *enc,
- const char *entityTextPtr, const char *entityTextEnd) {
+ const char *entityTextPtr, const char *entityTextEnd,
+ enum XML_Account account, const char **nextPtr) {
DTD *const dtd = parser->m_dtd; /* save one level of indirection */
STRING_POOL *pool = &(dtd->entityValuePool);
enum XML_Error result = XML_ERROR_NONE;
-#ifdef XML_DTD
+# ifdef XML_DTD
int oldInEntityValue = parser->m_prologState.inEntityValue;
parser->m_prologState.inEntityValue = 1;
-#endif /* XML_DTD */
+# else
+ UNUSED_P(account);
+# endif /* XML_DTD */
/* never return Null for the value argument in EntityDeclHandler,
since this would indicate an external entity; therefore we
have to make sure that entityValuePool.start is not null */
@@ -5497,12 +6415,22 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc,
return XML_ERROR_NO_MEMORY;
}
+ const char *next;
for (;;) {
- const char *next;
+ next
+ = entityTextPtr; /* XmlEntityValueTok doesn't always set the last arg */
int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);
+
+ if (! accountingDiffTolerated(parser, tok, entityTextPtr, next, __LINE__,
+ account)) {
+ accountingOnAbort(parser);
+ result = XML_ERROR_AMPLIFICATION_LIMIT_BREACH;
+ goto endEntityValue;
+ }
+
switch (tok) {
case XML_TOK_PARAM_ENTITY_REF:
-#ifdef XML_DTD
+# ifdef XML_DTD
if (parser->m_isParamEntity || enc != parser->m_encoding) {
const XML_Char *name;
ENTITY *entity;
@@ -5525,7 +6453,7 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc,
dtd->keepProcessing = dtd->standalone;
goto endEntityValue;
}
- if (entity->open) {
+ if (entity->open || (entity == parser->m_declEntity)) {
if (enc == parser->m_encoding)
parser->m_eventPtr = entityTextPtr;
result = XML_ERROR_RECURSIVE_ENTITY_REF;
@@ -5535,30 +6463,28 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc,
if (parser->m_externalEntityRefHandler) {
dtd->paramEntityRead = XML_FALSE;
entity->open = XML_TRUE;
+ entityTrackingOnOpen(parser, entity, __LINE__);
if (! parser->m_externalEntityRefHandler(
parser->m_externalEntityRefHandlerArg, 0, entity->base,
entity->systemId, entity->publicId)) {
+ entityTrackingOnClose(parser, entity, __LINE__);
entity->open = XML_FALSE;
result = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
goto endEntityValue;
}
+ entityTrackingOnClose(parser, entity, __LINE__);
entity->open = XML_FALSE;
if (! dtd->paramEntityRead)
dtd->keepProcessing = dtd->standalone;
} else
dtd->keepProcessing = dtd->standalone;
} else {
- entity->open = XML_TRUE;
- result = storeEntityValue(
- parser, parser->m_internalEncoding, (const char *)entity->textPtr,
- (const char *)(entity->textPtr + entity->textLen));
- entity->open = XML_FALSE;
- if (result)
- goto endEntityValue;
+ result = processEntity(parser, entity, XML_FALSE, ENTITY_VALUE);
+ goto endEntityValue;
}
break;
}
-#endif /* XML_DTD */
+# endif /* XML_DTD */
/* In the internal subset, PE references are not legal
within markup declarations, e.g entity values in this case. */
parser->m_eventPtr = entityTextPtr;
@@ -5639,12 +6565,113 @@ storeEntityValue(XML_Parser parser, const ENCODING *enc,
entityTextPtr = next;
}
endEntityValue:
-#ifdef XML_DTD
+# ifdef XML_DTD
parser->m_prologState.inEntityValue = oldInEntityValue;
-#endif /* XML_DTD */
+# endif /* XML_DTD */
+ // If 'nextPtr' is given, it should be updated during the processing
+ if (nextPtr != NULL) {
+ *nextPtr = next;
+ }
return result;
}
+static enum XML_Error
+callStoreEntityValue(XML_Parser parser, const ENCODING *enc,
+ const char *entityTextPtr, const char *entityTextEnd,
+ enum XML_Account account) {
+ const char *next = entityTextPtr;
+ enum XML_Error result = XML_ERROR_NONE;
+ while (1) {
+ if (! parser->m_openValueEntities) {
+ result
+ = storeEntityValue(parser, enc, next, entityTextEnd, account, &next);
+ } else {
+ OPEN_INTERNAL_ENTITY *const openEntity = parser->m_openValueEntities;
+ if (! openEntity)
+ return XML_ERROR_UNEXPECTED_STATE;
+
+ ENTITY *const entity = openEntity->entity;
+ const char *const textStart
+ = ((const char *)entity->textPtr) + entity->processed;
+ const char *const textEnd
+ = (const char *)(entity->textPtr + entity->textLen);
+ /* Set a safe default value in case 'next' does not get set */
+ const char *nextInEntity = textStart;
+ if (entity->hasMore) {
+ result = storeEntityValue(parser, parser->m_internalEncoding, textStart,
+ textEnd, XML_ACCOUNT_ENTITY_EXPANSION,
+ &nextInEntity);
+ if (result != XML_ERROR_NONE)
+ break;
+ // Check if entity is complete, if not, mark down how much of it is
+ // processed. A XML_SUSPENDED check here is not required as
+ // appendAttributeValue will never suspend the parser.
+ if (textEnd != nextInEntity) {
+ entity->processed
+ = (int)(nextInEntity - (const char *)entity->textPtr);
+ continue;
+ }
+
+ // Entity is complete. We cannot close it here since we need to first
+ // process its possible inner entities (which are added to the
+ // m_openValueEntities during storeEntityValue)
+ entity->hasMore = XML_FALSE;
+ continue;
+ } // End of entity processing, "if" block skips the rest
+
+ // Remove fully processed openEntity from open entity list.
+# if XML_GE == 1
+ entityTrackingOnClose(parser, entity, __LINE__);
+# endif
+ // openEntity is m_openValueEntities' head, since we set it at the
+ // start of this function and because we skipped storeEntityValue call
+ // with hasMore set to false. This means we can directly remove the head
+ // of m_openValueEntities
+ assert(parser->m_openValueEntities == openEntity);
+ entity->open = XML_FALSE;
+ parser->m_openValueEntities = parser->m_openValueEntities->next;
+
+ /* put openEntity back in list of free instances */
+ openEntity->next = parser->m_freeValueEntities;
+ parser->m_freeValueEntities = openEntity;
+ }
+
+ // Break if an error occurred or there is nothing left to process
+ if (result
+ || (parser->m_openValueEntities == NULL && entityTextEnd == next)) {
+ break;
+ }
+ }
+
+ return result;
+}
+
+#else /* XML_GE == 0 */
+
+static enum XML_Error
+storeSelfEntityValue(XML_Parser parser, ENTITY *entity) {
+ // This will store "&amp;entity123;" in entity->textPtr
+ // to end up as "&entity123;" in the handler.
+ const char *const entity_start = "&amp;";
+ const char *const entity_end = ";";
+
+ STRING_POOL *const pool = &(parser->m_dtd->entityValuePool);
+ if (! poolAppendString(pool, entity_start)
+ || ! poolAppendString(pool, entity->name)
+ || ! poolAppendString(pool, entity_end)) {
+ poolDiscard(pool);
+ return XML_ERROR_NO_MEMORY;
+ }
+
+ entity->textPtr = poolStart(pool);
+ entity->textLen = (int)(poolLength(pool));
+ poolFinish(pool);
+
+ return XML_ERROR_NONE;
+}
+
+#endif /* XML_GE == 0 */
+
static void FASTCALL
normalizeLines(XML_Char *s) {
XML_Char *p;
@@ -5755,8 +6782,9 @@ reportDefault(XML_Parser parser, const ENCODING *enc, const char *s,
} while ((convert_res != XML_CONVERT_COMPLETED)
&& (convert_res != XML_CONVERT_INPUT_INCOMPLETE));
} else
- parser->m_defaultHandler(parser->m_handlerArg, (XML_Char *)s,
- (int)((XML_Char *)end - (XML_Char *)s));
+ parser->m_defaultHandler(
+ parser->m_handlerArg, (const XML_Char *)s,
+ (int)((const XML_Char *)end - (const XML_Char *)s));
}
static int
@@ -5784,7 +6812,24 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
}
} else {
DEFAULT_ATTRIBUTE *temp;
+
+ /* Detect and prevent integer overflow */
+ if (type->allocDefaultAtts > INT_MAX / 2) {
+ return 0;
+ }
+
int count = type->allocDefaultAtts * 2;
+
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((unsigned)count > (size_t)(-1) / sizeof(DEFAULT_ATTRIBUTE)) {
+ return 0;
+ }
+#endif
+
temp = (DEFAULT_ATTRIBUTE *)REALLOC(parser, type->defaultAtts,
(count * sizeof(DEFAULT_ATTRIBUTE)));
if (temp == NULL)
@@ -5843,7 +6888,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,
name = poolStoreString(&dtd->pool, enc, start, end);
if (! name)
return NULL;
- /* skip quotation mark - its storage will be re-used (like in name[-1]) */
+ /* skip quotation mark - its storage will be reused (like in name[-1]) */
++name;
id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name,
sizeof(ATTRIBUTE_ID));
@@ -5993,6 +7038,10 @@ getContext(XML_Parser parser) {
static XML_Bool
setContext(XML_Parser parser, const XML_Char *context) {
+ if (context == NULL) {
+ return XML_FALSE;
+ }
+
DTD *const dtd = parser->m_dtd; /* save one level of indirection */
const XML_Char *s = context;
@@ -6074,7 +7123,7 @@ normalizePublicId(XML_Char *publicId) {
static DTD *
dtdCreate(const XML_Memory_Handling_Suite *ms) {
- DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));
+ DTD *p = ms->malloc_fcn(sizeof(DTD));
if (p == NULL)
return p;
poolInit(&(p->pool), ms);
@@ -6247,8 +7296,18 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
if (! newE)
return 0;
if (oldE->nDefaultAtts) {
- newE->defaultAtts = (DEFAULT_ATTRIBUTE *)ms->malloc_fcn(
- oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if ((size_t)oldE->nDefaultAtts
+ > ((size_t)(-1) / sizeof(DEFAULT_ATTRIBUTE))) {
+ return 0;
+ }
+#endif
+ newE->defaultAtts
+ = ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
if (! newE->defaultAtts) {
return 0;
}
@@ -6410,7 +7469,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
/* table->size is a power of 2 */
table->size = (size_t)1 << INIT_POWER;
tsize = table->size * sizeof(NAMED *);
- table->v = (NAMED **)table->mem->malloc_fcn(tsize);
+ table->v = table->mem->malloc_fcn(tsize);
if (! table->v) {
table->size = 0;
return NULL;
@@ -6435,10 +7494,22 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
/* check for overflow (table is half full) */
if (table->used >> (table->power - 1)) {
unsigned char newPower = table->power + 1;
+
+ /* Detect and prevent invalid shift */
+ if (newPower >= sizeof(unsigned long) * 8 /* bits per byte */) {
+ return NULL;
+ }
+
size_t newSize = (size_t)1 << newPower;
unsigned long newMask = (unsigned long)newSize - 1;
+
+ /* Detect and prevent integer overflow */
+ if (newSize > (size_t)(-1) / sizeof(NAMED *)) {
+ return NULL;
+ }
+
size_t tsize = newSize * sizeof(NAMED *);
- NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);
+ NAMED **newV = table->mem->malloc_fcn(tsize);
if (! newV)
return NULL;
memset(newV, 0, tsize);
@@ -6467,7 +7538,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
}
}
}
- table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);
+ table->v[i] = table->mem->malloc_fcn(createSize);
if (! table->v[i])
return NULL;
memset(table->v[i], 0, createSize);
@@ -6571,7 +7642,7 @@ poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr,
return NULL;
for (;;) {
const enum XML_Convert_Result convert_res = XmlConvert(
- enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
+ enc, &ptr, end, (ICHAR **)&(pool->ptr), (const ICHAR *)pool->end);
if ((convert_res == XML_CONVERT_COMPLETED)
|| (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
break;
@@ -6755,7 +7826,7 @@ poolGrow(STRING_POOL *pool) {
if (bytesToAllocate == 0)
return XML_FALSE;
- tem = (BLOCK *)pool->mem->malloc_fcn(bytesToAllocate);
+ tem = pool->mem->malloc_fcn(bytesToAllocate);
if (! tem)
return XML_FALSE;
tem->size = blockSize;
@@ -6777,6 +7848,15 @@ nextScaffoldPart(XML_Parser parser) {
int next;
if (! dtd->scaffIndex) {
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if (parser->m_groupSize > ((size_t)(-1) / sizeof(int))) {
+ return -1;
+ }
+#endif
dtd->scaffIndex = (int *)MALLOC(parser, parser->m_groupSize * sizeof(int));
if (! dtd->scaffIndex)
return -1;
@@ -6786,6 +7866,20 @@ nextScaffoldPart(XML_Parser parser) {
if (dtd->scaffCount >= dtd->scaffSize) {
CONTENT_SCAFFOLD *temp;
if (dtd->scaffold) {
+ /* Detect and prevent integer overflow */
+ if (dtd->scaffSize > UINT_MAX / 2u) {
+ return -1;
+ }
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if (dtd->scaffSize > (size_t)(-1) / 2u / sizeof(CONTENT_SCAFFOLD)) {
+ return -1;
+ }
+#endif
+
temp = (CONTENT_SCAFFOLD *)REALLOC(
parser, dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
if (temp == NULL)
@@ -6817,55 +7911,130 @@ nextScaffoldPart(XML_Parser parser) {
return next;
}
-static void
-build_node(XML_Parser parser, int src_node, XML_Content *dest,
- XML_Content **contpos, XML_Char **strpos) {
- DTD *const dtd = parser->m_dtd; /* save one level of indirection */
- dest->type = dtd->scaffold[src_node].type;
- dest->quant = dtd->scaffold[src_node].quant;
- if (dest->type == XML_CTYPE_NAME) {
- const XML_Char *src;
- dest->name = *strpos;
- src = dtd->scaffold[src_node].name;
- for (;;) {
- *(*strpos)++ = *src;
- if (! *src)
- break;
- src++;
- }
- dest->numchildren = 0;
- dest->children = NULL;
- } else {
- unsigned int i;
- int cn;
- dest->numchildren = dtd->scaffold[src_node].childcnt;
- dest->children = *contpos;
- *contpos += dest->numchildren;
- for (i = 0, cn = dtd->scaffold[src_node].firstchild; i < dest->numchildren;
- i++, cn = dtd->scaffold[cn].nextsib) {
- build_node(parser, cn, &(dest->children[i]), contpos, strpos);
- }
- dest->name = NULL;
- }
-}
-
static XML_Content *
build_model(XML_Parser parser) {
+ /* Function build_model transforms the existing parser->m_dtd->scaffold
+ * array of CONTENT_SCAFFOLD tree nodes into a new array of
+ * XML_Content tree nodes followed by a gapless list of zero-terminated
+ * strings. */
DTD *const dtd = parser->m_dtd; /* save one level of indirection */
XML_Content *ret;
- XML_Content *cpos;
- XML_Char *str;
- int allocsize = (dtd->scaffCount * sizeof(XML_Content)
- + (dtd->contentStringLen * sizeof(XML_Char)));
+ XML_Char *str; /* the current string writing location */
+
+ /* Detect and prevent integer overflow.
+ * The preprocessor guard addresses the "always false" warning
+ * from -Wtype-limits on platforms where
+ * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+ if (dtd->scaffCount > (size_t)(-1) / sizeof(XML_Content)) {
+ return NULL;
+ }
+ if (dtd->contentStringLen > (size_t)(-1) / sizeof(XML_Char)) {
+ return NULL;
+ }
+#endif
+ if (dtd->scaffCount * sizeof(XML_Content)
+ > (size_t)(-1) - dtd->contentStringLen * sizeof(XML_Char)) {
+ return NULL;
+ }
+
+ const size_t allocsize = (dtd->scaffCount * sizeof(XML_Content)
+ + (dtd->contentStringLen * sizeof(XML_Char)));
ret = (XML_Content *)MALLOC(parser, allocsize);
if (! ret)
return NULL;
- str = (XML_Char *)(&ret[dtd->scaffCount]);
- cpos = &ret[1];
+ /* What follows is an iterative implementation (of what was previously done
+ * recursively in a dedicated function called "build_node". The old recursive
+ * build_node could be forced into stack exhaustion from input as small as a
+ * few megabyte, and so that was a security issue. Hence, a function call
+ * stack is avoided now by resolving recursion.)
+ *
+ * The iterative approach works as follows:
+ *
+ * - We have two writing pointers, both walking up the result array; one does
+ * the work, the other creates "jobs" for its colleague to do, and leads
+ * the way:
+ *
+ * - The faster one, pointer jobDest, always leads and writes "what job
+ * to do" by the other, once they reach that place in the
+ * array: leader "jobDest" stores the source node array index (relative
+ * to array dtd->scaffold) in field "numchildren".
+ *
+ * - The slower one, pointer dest, looks at the value stored in the
+ * "numchildren" field (which actually holds a source node array index
+ * at that time) and puts the real data from dtd->scaffold in.
+ *
+ * - Before the loop starts, jobDest writes source array index 0
+ * (where the root node is located) so that dest will have something to do
+ * when it starts operation.
+ *
+ * - Whenever nodes with children are encountered, jobDest appends
+ * them as new jobs, in order. As a result, tree node siblings are
+ * adjacent in the resulting array, for example:
+ *
+ * [0] root, has two children
+ * [1] first child of 0, has three children
+ * [3] first child of 1, does not have children
+ * [4] second child of 1, does not have children
+ * [5] third child of 1, does not have children
+ * [2] second child of 0, does not have children
+ *
+ * Or (the same data) presented in flat array view:
+ *
+ * [0] root, has two children
+ *
+ * [1] first child of 0, has three children
+ * [2] second child of 0, does not have children
+ *
+ * [3] first child of 1, does not have children
+ * [4] second child of 1, does not have children
+ * [5] third child of 1, does not have children
+ *
+ * - The algorithm repeats until all target array indices have been processed.
+ */
+ XML_Content *dest = ret; /* tree node writing location, moves upwards */
+ XML_Content *const destLimit = &ret[dtd->scaffCount];
+ XML_Content *jobDest = ret; /* next free writing location in target array */
+ str = (XML_Char *)&ret[dtd->scaffCount];
+
+ /* Add the starting job, the root node (index 0) of the source tree */
+ (jobDest++)->numchildren = 0;
+
+ for (; dest < destLimit; dest++) {
+ /* Retrieve source tree array index from job storage */
+ const int src_node = (int)dest->numchildren;
+
+ /* Convert item */
+ dest->type = dtd->scaffold[src_node].type;
+ dest->quant = dtd->scaffold[src_node].quant;
+ if (dest->type == XML_CTYPE_NAME) {
+ const XML_Char *src;
+ dest->name = str;
+ src = dtd->scaffold[src_node].name;
+ for (;;) {
+ *str++ = *src;
+ if (! *src)
+ break;
+ src++;
+ }
+ dest->numchildren = 0;
+ dest->children = NULL;
+ } else {
+ unsigned int i;
+ int cn;
+ dest->name = NULL;
+ dest->numchildren = dtd->scaffold[src_node].childcnt;
+ dest->children = jobDest;
+
+ /* Append scaffold indices of children to array */
+ for (i = 0, cn = dtd->scaffold[src_node].firstchild;
+ i < dest->numchildren; i++, cn = dtd->scaffold[cn].nextsib)
+ (jobDest++)->numchildren = (unsigned int)cn;
+ }
+ }
- build_node(parser, 0, ret, &cpos, &str);
return ret;
}
@@ -6894,7 +8063,7 @@ getElementType(XML_Parser parser, const ENCODING *enc, const char *ptr,
static XML_Char *
copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
- int charsRequired = 0;
+ size_t charsRequired = 0;
XML_Char *result;
/* First determine how long the string is */
@@ -6912,3 +8081,761 @@ copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
memcpy(result, s, charsRequired * sizeof(XML_Char));
return result;
}
+
+#if XML_GE == 1
+
+static float
+accountingGetCurrentAmplification(XML_Parser rootParser) {
+ // 1.........1.........12 => 22
+ const size_t lenOfShortestInclude = sizeof("<!ENTITY a SYSTEM 'b'>") - 1;
+ const XmlBigCount countBytesOutput
+ = rootParser->m_accounting.countBytesDirect
+ + rootParser->m_accounting.countBytesIndirect;
+ const float amplificationFactor
+ = rootParser->m_accounting.countBytesDirect
+ ? (countBytesOutput
+ / (float)(rootParser->m_accounting.countBytesDirect))
+ : ((lenOfShortestInclude
+ + rootParser->m_accounting.countBytesIndirect)
+ / (float)lenOfShortestInclude);
+ assert(! rootParser->m_parentParser);
+ return amplificationFactor;
+}
+
+static void
+accountingReportStats(XML_Parser originParser, const char *epilog) {
+ const XML_Parser rootParser = getRootParserOf(originParser, NULL);
+ assert(! rootParser->m_parentParser);
+
+ if (rootParser->m_accounting.debugLevel == 0u) {
+ return;
+ }
+
+ const float amplificationFactor
+ = accountingGetCurrentAmplification(rootParser);
+ fprintf(stderr,
+ "expat: Accounting(%p): Direct " EXPAT_FMT_ULL(
+ "10") ", indirect " EXPAT_FMT_ULL("10") ", amplification %8.2f%s",
+ (void *)rootParser, rootParser->m_accounting.countBytesDirect,
+ rootParser->m_accounting.countBytesIndirect,
+ (double)amplificationFactor, epilog);
+}
+
+static void
+accountingOnAbort(XML_Parser originParser) {
+ accountingReportStats(originParser, " ABORTING\n");
+}
+
+static void
+accountingReportDiff(XML_Parser rootParser,
+ unsigned int levelsAwayFromRootParser, const char *before,
+ const char *after, ptrdiff_t bytesMore, int source_line,
+ enum XML_Account account) {
+ assert(! rootParser->m_parentParser);
+
+ fprintf(stderr,
+ " (+" EXPAT_FMT_PTRDIFF_T("6") " bytes %s|%u, xmlparse.c:%d) %*s\"",
+ bytesMore, (account == XML_ACCOUNT_DIRECT) ? "DIR" : "EXP",
+ levelsAwayFromRootParser, source_line, 10, "");
+
+ const char ellipis[] = "[..]";
+ const size_t ellipsisLength = sizeof(ellipis) /* because compile-time */ - 1;
+ const unsigned int contextLength = 10;
+
+ /* Note: Performance is of no concern here */
+ const char *walker = before;
+ if ((rootParser->m_accounting.debugLevel >= 3u)
+ || (after - before)
+ <= (ptrdiff_t)(contextLength + ellipsisLength + contextLength)) {
+ for (; walker < after; walker++) {
+ fprintf(stderr, "%s", unsignedCharToPrintable(walker[0]));
+ }
+ } else {
+ for (; walker < before + contextLength; walker++) {
+ fprintf(stderr, "%s", unsignedCharToPrintable(walker[0]));
+ }
+ fprintf(stderr, ellipis);
+ walker = after - contextLength;
+ for (; walker < after; walker++) {
+ fprintf(stderr, "%s", unsignedCharToPrintable(walker[0]));
+ }
+ }
+ fprintf(stderr, "\"\n");
+}
+
+static XML_Bool
+accountingDiffTolerated(XML_Parser originParser, int tok, const char *before,
+ const char *after, int source_line,
+ enum XML_Account account) {
+ /* Note: We need to check the token type *first* to be sure that
+ * we can even access variable <after>, safely.
+ * E.g. for XML_TOK_NONE <after> may hold an invalid pointer. */
+ switch (tok) {
+ case XML_TOK_INVALID:
+ case XML_TOK_PARTIAL:
+ case XML_TOK_PARTIAL_CHAR:
+ case XML_TOK_NONE:
+ return XML_TRUE;
+ }
+
+ if (account == XML_ACCOUNT_NONE)
+ return XML_TRUE; /* because these bytes have been accounted for, already */
+
+ unsigned int levelsAwayFromRootParser;
+ const XML_Parser rootParser
+ = getRootParserOf(originParser, &levelsAwayFromRootParser);
+ assert(! rootParser->m_parentParser);
+
+ const int isDirect
+ = (account == XML_ACCOUNT_DIRECT) && (originParser == rootParser);
+ const ptrdiff_t bytesMore = after - before;
+
+ XmlBigCount *const additionTarget
+ = isDirect ? &rootParser->m_accounting.countBytesDirect
+ : &rootParser->m_accounting.countBytesIndirect;
+
+ /* Detect and avoid integer overflow */
+ if (*additionTarget > (XmlBigCount)(-1) - (XmlBigCount)bytesMore)
+ return XML_FALSE;
+ *additionTarget += bytesMore;
+
+ const XmlBigCount countBytesOutput
+ = rootParser->m_accounting.countBytesDirect
+ + rootParser->m_accounting.countBytesIndirect;
+ const float amplificationFactor
+ = accountingGetCurrentAmplification(rootParser);
+ const XML_Bool tolerated
+ = (countBytesOutput < rootParser->m_accounting.activationThresholdBytes)
+ || (amplificationFactor
+ <= rootParser->m_accounting.maximumAmplificationFactor);
+
+ if (rootParser->m_accounting.debugLevel >= 2u) {
+ accountingReportStats(rootParser, "");
+ accountingReportDiff(rootParser, levelsAwayFromRootParser, before, after,
+ bytesMore, source_line, account);
+ }
+
+ return tolerated;
+}
+
+unsigned long long
+testingAccountingGetCountBytesDirect(XML_Parser parser) {
+ if (! parser)
+ return 0;
+ return parser->m_accounting.countBytesDirect;
+}
+
+unsigned long long
+testingAccountingGetCountBytesIndirect(XML_Parser parser) {
+ if (! parser)
+ return 0;
+ return parser->m_accounting.countBytesIndirect;
+}
+
+static void
+entityTrackingReportStats(XML_Parser rootParser, ENTITY *entity,
+ const char *action, int sourceLine) {
+ assert(! rootParser->m_parentParser);
+ if (rootParser->m_entity_stats.debugLevel == 0u)
+ return;
+
+# if defined(XML_UNICODE)
+ const char *const entityName = "[..]";
+# else
+ const char *const entityName = entity->name;
+# endif
+
+ fprintf(
+ stderr,
+ "expat: Entities(%p): Count %9u, depth %2u/%2u %*s%s%s; %s length %d (xmlparse.c:%d)\n",
+ (void *)rootParser, rootParser->m_entity_stats.countEverOpened,
+ rootParser->m_entity_stats.currentDepth,
+ rootParser->m_entity_stats.maximumDepthSeen,
+ ((int)rootParser->m_entity_stats.currentDepth - 1) * 2, "",
+ entity->is_param ? "%" : "&", entityName, action, entity->textLen,
+ sourceLine);
+}
+
+static void
+entityTrackingOnOpen(XML_Parser originParser, ENTITY *entity, int sourceLine) {
+ const XML_Parser rootParser = getRootParserOf(originParser, NULL);
+ assert(! rootParser->m_parentParser);
+
+ rootParser->m_entity_stats.countEverOpened++;
+ rootParser->m_entity_stats.currentDepth++;
+ if (rootParser->m_entity_stats.currentDepth
+ > rootParser->m_entity_stats.maximumDepthSeen) {
+ rootParser->m_entity_stats.maximumDepthSeen++;
+ }
+
+ entityTrackingReportStats(rootParser, entity, "OPEN ", sourceLine);
+}
+
+static void
+entityTrackingOnClose(XML_Parser originParser, ENTITY *entity, int sourceLine) {
+ const XML_Parser rootParser = getRootParserOf(originParser, NULL);
+ assert(! rootParser->m_parentParser);
+
+ entityTrackingReportStats(rootParser, entity, "CLOSE", sourceLine);
+ rootParser->m_entity_stats.currentDepth--;
+}
+
+static XML_Parser
+getRootParserOf(XML_Parser parser, unsigned int *outLevelDiff) {
+ XML_Parser rootParser = parser;
+ unsigned int stepsTakenUpwards = 0;
+ while (rootParser->m_parentParser) {
+ rootParser = rootParser->m_parentParser;
+ stepsTakenUpwards++;
+ }
+ assert(! rootParser->m_parentParser);
+ if (outLevelDiff != NULL) {
+ *outLevelDiff = stepsTakenUpwards;
+ }
+ return rootParser;
+}
+
+const char *
+unsignedCharToPrintable(unsigned char c) {
+ switch (c) {
+ case 0:
+ return "\\0";
+ case 1:
+ return "\\x1";
+ case 2:
+ return "\\x2";
+ case 3:
+ return "\\x3";
+ case 4:
+ return "\\x4";
+ case 5:
+ return "\\x5";
+ case 6:
+ return "\\x6";
+ case 7:
+ return "\\x7";
+ case 8:
+ return "\\x8";
+ case 9:
+ return "\\t";
+ case 10:
+ return "\\n";
+ case 11:
+ return "\\xB";
+ case 12:
+ return "\\xC";
+ case 13:
+ return "\\r";
+ case 14:
+ return "\\xE";
+ case 15:
+ return "\\xF";
+ case 16:
+ return "\\x10";
+ case 17:
+ return "\\x11";
+ case 18:
+ return "\\x12";
+ case 19:
+ return "\\x13";
+ case 20:
+ return "\\x14";
+ case 21:
+ return "\\x15";
+ case 22:
+ return "\\x16";
+ case 23:
+ return "\\x17";
+ case 24:
+ return "\\x18";
+ case 25:
+ return "\\x19";
+ case 26:
+ return "\\x1A";
+ case 27:
+ return "\\x1B";
+ case 28:
+ return "\\x1C";
+ case 29:
+ return "\\x1D";
+ case 30:
+ return "\\x1E";
+ case 31:
+ return "\\x1F";
+ case 32:
+ return " ";
+ case 33:
+ return "!";
+ case 34:
+ return "\\\"";
+ case 35:
+ return "#";
+ case 36:
+ return "$";
+ case 37:
+ return "%";
+ case 38:
+ return "&";
+ case 39:
+ return "'";
+ case 40:
+ return "(";
+ case 41:
+ return ")";
+ case 42:
+ return "*";
+ case 43:
+ return "+";
+ case 44:
+ return ",";
+ case 45:
+ return "-";
+ case 46:
+ return ".";
+ case 47:
+ return "/";
+ case 48:
+ return "0";
+ case 49:
+ return "1";
+ case 50:
+ return "2";
+ case 51:
+ return "3";
+ case 52:
+ return "4";
+ case 53:
+ return "5";
+ case 54:
+ return "6";
+ case 55:
+ return "7";
+ case 56:
+ return "8";
+ case 57:
+ return "9";
+ case 58:
+ return ":";
+ case 59:
+ return ";";
+ case 60:
+ return "<";
+ case 61:
+ return "=";
+ case 62:
+ return ">";
+ case 63:
+ return "?";
+ case 64:
+ return "@";
+ case 65:
+ return "A";
+ case 66:
+ return "B";
+ case 67:
+ return "C";
+ case 68:
+ return "D";
+ case 69:
+ return "E";
+ case 70:
+ return "F";
+ case 71:
+ return "G";
+ case 72:
+ return "H";
+ case 73:
+ return "I";
+ case 74:
+ return "J";
+ case 75:
+ return "K";
+ case 76:
+ return "L";
+ case 77:
+ return "M";
+ case 78:
+ return "N";
+ case 79:
+ return "O";
+ case 80:
+ return "P";
+ case 81:
+ return "Q";
+ case 82:
+ return "R";
+ case 83:
+ return "S";
+ case 84:
+ return "T";
+ case 85:
+ return "U";
+ case 86:
+ return "V";
+ case 87:
+ return "W";
+ case 88:
+ return "X";
+ case 89:
+ return "Y";
+ case 90:
+ return "Z";
+ case 91:
+ return "[";
+ case 92:
+ return "\\\\";
+ case 93:
+ return "]";
+ case 94:
+ return "^";
+ case 95:
+ return "_";
+ case 96:
+ return "`";
+ case 97:
+ return "a";
+ case 98:
+ return "b";
+ case 99:
+ return "c";
+ case 100:
+ return "d";
+ case 101:
+ return "e";
+ case 102:
+ return "f";
+ case 103:
+ return "g";
+ case 104:
+ return "h";
+ case 105:
+ return "i";
+ case 106:
+ return "j";
+ case 107:
+ return "k";
+ case 108:
+ return "l";
+ case 109:
+ return "m";
+ case 110:
+ return "n";
+ case 111:
+ return "o";
+ case 112:
+ return "p";
+ case 113:
+ return "q";
+ case 114:
+ return "r";
+ case 115:
+ return "s";
+ case 116:
+ return "t";
+ case 117:
+ return "u";
+ case 118:
+ return "v";
+ case 119:
+ return "w";
+ case 120:
+ return "x";
+ case 121:
+ return "y";
+ case 122:
+ return "z";
+ case 123:
+ return "{";
+ case 124:
+ return "|";
+ case 125:
+ return "}";
+ case 126:
+ return "~";
+ case 127:
+ return "\\x7F";
+ case 128:
+ return "\\x80";
+ case 129:
+ return "\\x81";
+ case 130:
+ return "\\x82";
+ case 131:
+ return "\\x83";
+ case 132:
+ return "\\x84";
+ case 133:
+ return "\\x85";
+ case 134:
+ return "\\x86";
+ case 135:
+ return "\\x87";
+ case 136:
+ return "\\x88";
+ case 137:
+ return "\\x89";
+ case 138:
+ return "\\x8A";
+ case 139:
+ return "\\x8B";
+ case 140:
+ return "\\x8C";
+ case 141:
+ return "\\x8D";
+ case 142:
+ return "\\x8E";
+ case 143:
+ return "\\x8F";
+ case 144:
+ return "\\x90";
+ case 145:
+ return "\\x91";
+ case 146:
+ return "\\x92";
+ case 147:
+ return "\\x93";
+ case 148:
+ return "\\x94";
+ case 149:
+ return "\\x95";
+ case 150:
+ return "\\x96";
+ case 151:
+ return "\\x97";
+ case 152:
+ return "\\x98";
+ case 153:
+ return "\\x99";
+ case 154:
+ return "\\x9A";
+ case 155:
+ return "\\x9B";
+ case 156:
+ return "\\x9C";
+ case 157:
+ return "\\x9D";
+ case 158:
+ return "\\x9E";
+ case 159:
+ return "\\x9F";
+ case 160:
+ return "\\xA0";
+ case 161:
+ return "\\xA1";
+ case 162:
+ return "\\xA2";
+ case 163:
+ return "\\xA3";
+ case 164:
+ return "\\xA4";
+ case 165:
+ return "\\xA5";
+ case 166:
+ return "\\xA6";
+ case 167:
+ return "\\xA7";
+ case 168:
+ return "\\xA8";
+ case 169:
+ return "\\xA9";
+ case 170:
+ return "\\xAA";
+ case 171:
+ return "\\xAB";
+ case 172:
+ return "\\xAC";
+ case 173:
+ return "\\xAD";
+ case 174:
+ return "\\xAE";
+ case 175:
+ return "\\xAF";
+ case 176:
+ return "\\xB0";
+ case 177:
+ return "\\xB1";
+ case 178:
+ return "\\xB2";
+ case 179:
+ return "\\xB3";
+ case 180:
+ return "\\xB4";
+ case 181:
+ return "\\xB5";
+ case 182:
+ return "\\xB6";
+ case 183:
+ return "\\xB7";
+ case 184:
+ return "\\xB8";
+ case 185:
+ return "\\xB9";
+ case 186:
+ return "\\xBA";
+ case 187:
+ return "\\xBB";
+ case 188:
+ return "\\xBC";
+ case 189:
+ return "\\xBD";
+ case 190:
+ return "\\xBE";
+ case 191:
+ return "\\xBF";
+ case 192:
+ return "\\xC0";
+ case 193:
+ return "\\xC1";
+ case 194:
+ return "\\xC2";
+ case 195:
+ return "\\xC3";
+ case 196:
+ return "\\xC4";
+ case 197:
+ return "\\xC5";
+ case 198:
+ return "\\xC6";
+ case 199:
+ return "\\xC7";
+ case 200:
+ return "\\xC8";
+ case 201:
+ return "\\xC9";
+ case 202:
+ return "\\xCA";
+ case 203:
+ return "\\xCB";
+ case 204:
+ return "\\xCC";
+ case 205:
+ return "\\xCD";
+ case 206:
+ return "\\xCE";
+ case 207:
+ return "\\xCF";
+ case 208:
+ return "\\xD0";
+ case 209:
+ return "\\xD1";
+ case 210:
+ return "\\xD2";
+ case 211:
+ return "\\xD3";
+ case 212:
+ return "\\xD4";
+ case 213:
+ return "\\xD5";
+ case 214:
+ return "\\xD6";
+ case 215:
+ return "\\xD7";
+ case 216:
+ return "\\xD8";
+ case 217:
+ return "\\xD9";
+ case 218:
+ return "\\xDA";
+ case 219:
+ return "\\xDB";
+ case 220:
+ return "\\xDC";
+ case 221:
+ return "\\xDD";
+ case 222:
+ return "\\xDE";
+ case 223:
+ return "\\xDF";
+ case 224:
+ return "\\xE0";
+ case 225:
+ return "\\xE1";
+ case 226:
+ return "\\xE2";
+ case 227:
+ return "\\xE3";
+ case 228:
+ return "\\xE4";
+ case 229:
+ return "\\xE5";
+ case 230:
+ return "\\xE6";
+ case 231:
+ return "\\xE7";
+ case 232:
+ return "\\xE8";
+ case 233:
+ return "\\xE9";
+ case 234:
+ return "\\xEA";
+ case 235:
+ return "\\xEB";
+ case 236:
+ return "\\xEC";
+ case 237:
+ return "\\xED";
+ case 238:
+ return "\\xEE";
+ case 239:
+ return "\\xEF";
+ case 240:
+ return "\\xF0";
+ case 241:
+ return "\\xF1";
+ case 242:
+ return "\\xF2";
+ case 243:
+ return "\\xF3";
+ case 244:
+ return "\\xF4";
+ case 245:
+ return "\\xF5";
+ case 246:
+ return "\\xF6";
+ case 247:
+ return "\\xF7";
+ case 248:
+ return "\\xF8";
+ case 249:
+ return "\\xF9";
+ case 250:
+ return "\\xFA";
+ case 251:
+ return "\\xFB";
+ case 252:
+ return "\\xFC";
+ case 253:
+ return "\\xFD";
+ case 254:
+ return "\\xFE";
+ case 255:
+ return "\\xFF";
+ // LCOV_EXCL_START
+ default:
+ assert(0); /* never gets here */
+ return "dead code";
+ }
+ assert(0); /* never gets here */
+ // LCOV_EXCL_STOP
+}
+
+#endif /* XML_GE == 1 */
+
+static unsigned long
+getDebugLevel(const char *variableName, unsigned long defaultDebugLevel) {
+ const char *const valueOrNull = getenv(variableName);
+ if (valueOrNull == NULL) {
+ return defaultDebugLevel;
+ }
+ const char *const value = valueOrNull;
+
+ errno = 0;
+ char *afterValue = NULL;
+ unsigned long debugLevel = strtoul(value, &afterValue, 10);
+ if ((errno != 0) || (afterValue == value) || (afterValue[0] != '\0')) {
+ errno = 0;
+ return defaultDebugLevel;
+ }
+
+ return debugLevel;
+}
diff --git a/3rdparty/expat/lib/xmlrole.c b/3rdparty/expat/lib/xmlrole.c
index 3b676a415d8..2c48bf40867 100644
--- a/3rdparty/expat/lib/xmlrole.c
+++ b/3rdparty/expat/lib/xmlrole.c
@@ -7,7 +7,15 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,15 +38,13 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#include "expat_config.h"
+
#include <stddef.h>
#ifdef _WIN32
# include "winconfig.h"
-#else
-# ifdef HAVE_EXPAT_CONFIG_H
-# include <expat_config.h>
-# endif
-#endif /* ndef _WIN32 */
+#endif
#include "expat_external.h"
#include "internal.h"
diff --git a/3rdparty/expat/lib/xmlrole.h b/3rdparty/expat/lib/xmlrole.h
index 036aba64fd2..a7904274c91 100644
--- a/3rdparty/expat/lib/xmlrole.h
+++ b/3rdparty/expat/lib/xmlrole.h
@@ -7,7 +7,10 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -124,9 +127,9 @@ typedef struct prolog_state {
#endif /* XML_DTD */
} PROLOG_STATE;
-void XmlPrologStateInit(PROLOG_STATE *);
+void XmlPrologStateInit(PROLOG_STATE *state);
#ifdef XML_DTD
-void XmlPrologStateInitExternalEntity(PROLOG_STATE *);
+void XmlPrologStateInitExternalEntity(PROLOG_STATE *state);
#endif /* XML_DTD */
#define XmlTokenRole(state, tok, ptr, end, enc) \
diff --git a/3rdparty/expat/lib/xmltok.c b/3rdparty/expat/lib/xmltok.c
index c4f9897f7dc..29a66d72cee 100644
--- a/3rdparty/expat/lib/xmltok.c
+++ b/3rdparty/expat/lib/xmltok.c
@@ -7,7 +7,23 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2016 Pascal Cuoq <cuoq@trust-in-soft.com>
+ Copyright (c) 2016 Don Lewis <truckman@apache.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Alexander Bluhm <alexander.bluhm@gmx.net>
+ Copyright (c) 2017 Benbuck Nason <bnason@netflix.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
+ Copyright (c) 2023 Hanno Böck <hanno@gentoo.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,25 +46,15 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#include "expat_config.h"
+
#include <stddef.h>
#include <string.h> /* memcpy */
-
-#if defined(_MSC_VER) && (_MSC_VER <= 1700)
-/* for vs2012/11.0/1700 and earlier Visual Studio compilers */
-# define bool int
-# define false 0
-# define true 1
-#else
-# include <stdbool.h>
-#endif
+#include <stdbool.h>
#ifdef _WIN32
# include "winconfig.h"
-#else
-# ifdef HAVE_EXPAT_CONFIG_H
-# include <expat_config.h>
-# endif
-#endif /* ndef _WIN32 */
+#endif
#include "expat_external.h"
#include "internal.h"
@@ -72,7 +78,7 @@
#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16)
#define UCS2_GET_NAMING(pages, hi, lo) \
- (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo)&0x1F)))
+ (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F)))
/* A 2 byte UTF-8 representation splits the characters 11 bits between
the bottom 5 and 6 bits of the bytes. We need 8 bits to index into
@@ -95,13 +101,8 @@
+ ((((byte)[1]) & 3) << 1) + ((((byte)[2]) >> 5) & 1)] \
& (1u << (((byte)[2]) & 0x1F)))
-#define UTF8_GET_NAMING(pages, p, n) \
- ((n) == 2 \
- ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \
- : ((n) == 3 ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) : 0))
-
/* Detection of invalid UTF-8 sequences is based on Table 3.1B
- of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/
+ of Unicode 3.2: https://www.unicode.org/unicode/reports/tr28/
with the additional restriction of not allowing the Unicode
code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE).
Implementation details:
@@ -226,7 +227,7 @@ struct normal_encoding {
/* isNmstrt2 */ NULL, /* isNmstrt3 */ NULL, /* isNmstrt4 */ NULL, \
/* isInvalid2 */ NULL, /* isInvalid3 */ NULL, /* isInvalid4 */ NULL
-static int FASTCALL checkCharRefNumber(int);
+static int FASTCALL checkCharRefNumber(int result);
#include "xmltok_impl.h"
#include "ascii.h"
@@ -244,7 +245,7 @@ static int FASTCALL checkCharRefNumber(int);
#endif
#define SB_BYTE_TYPE(enc, p) \
- (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)])
+ (((const struct normal_encoding *)(enc))->type[(unsigned char)*(p)])
#ifdef XML_MIN_SIZE
static int PTRFASTCALL
@@ -269,8 +270,14 @@ sb_byteToAscii(const ENCODING *enc, const char *p) {
#define IS_NAME_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isName##n(enc, p))
#define IS_NMSTRT_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isNmstrt##n(enc, p))
-#define IS_INVALID_CHAR(enc, p, n) \
- (AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p))
+#ifdef XML_MIN_SIZE
+# define IS_INVALID_CHAR(enc, p, n) \
+ (AS_NORMAL_ENCODING(enc)->isInvalid##n \
+ && AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p))
+#else
+# define IS_INVALID_CHAR(enc, p, n) \
+ (AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p))
+#endif
#ifdef XML_MIN_SIZE
# define IS_NAME_CHAR_MINBPC(enc, p) \
@@ -292,7 +299,7 @@ sb_charMatches(const ENCODING *enc, const char *p, int c) {
}
#else
/* c is an ASCII character */
-# define CHAR_MATCHES(enc, p, c) (*(p) == c)
+# define CHAR_MATCHES(enc, p, c) (*(p) == (c))
#endif
#define PREFIX(ident) normal_##ident
@@ -402,7 +409,7 @@ utf8_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim,
unsigned short *to = *toP;
const char *from = *fromP;
while (from < fromLim && to < toLim) {
- switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) {
+ switch (SB_BYTE_TYPE(enc, from)) {
case BT_LEAD2:
if (fromLim - from < 2) {
res = XML_CONVERT_INPUT_INCOMPLETE;
@@ -710,33 +717,28 @@ unicode_byte_type(char hi, char lo) {
return res; \
}
-#define SET2(ptr, ch) (((ptr)[0] = ((ch)&0xff)), ((ptr)[1] = ((ch) >> 8)))
#define GET_LO(ptr) ((unsigned char)(ptr)[0])
#define GET_HI(ptr) ((unsigned char)(ptr)[1])
DEFINE_UTF16_TO_UTF8(little2_)
DEFINE_UTF16_TO_UTF16(little2_)
-#undef SET2
#undef GET_LO
#undef GET_HI
-#define SET2(ptr, ch) (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch)&0xFF)))
#define GET_LO(ptr) ((unsigned char)(ptr)[1])
#define GET_HI(ptr) ((unsigned char)(ptr)[0])
DEFINE_UTF16_TO_UTF8(big2_)
DEFINE_UTF16_TO_UTF16(big2_)
-#undef SET2
#undef GET_LO
#undef GET_HI
#define LITTLE2_BYTE_TYPE(enc, p) \
- ((p)[1] == 0 ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \
- : unicode_byte_type((p)[1], (p)[0]))
+ ((p)[1] == 0 ? SB_BYTE_TYPE(enc, p) : unicode_byte_type((p)[1], (p)[0]))
#define LITTLE2_BYTE_TO_ASCII(p) ((p)[1] == 0 ? (p)[0] : -1)
-#define LITTLE2_CHAR_MATCHES(p, c) ((p)[1] == 0 && (p)[0] == c)
+#define LITTLE2_CHAR_MATCHES(p, c) ((p)[1] == 0 && (p)[0] == (c))
#define LITTLE2_IS_NAME_CHAR_MINBPC(p) \
UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0])
#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(p) \
@@ -867,11 +869,9 @@ static const struct normal_encoding internal_little2_encoding
#endif
#define BIG2_BYTE_TYPE(enc, p) \
- ((p)[0] == 0 \
- ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \
- : unicode_byte_type((p)[0], (p)[1]))
+ ((p)[0] == 0 ? SB_BYTE_TYPE(enc, p + 1) : unicode_byte_type((p)[0], (p)[1]))
#define BIG2_BYTE_TO_ASCII(p) ((p)[0] == 0 ? (p)[1] : -1)
-#define BIG2_CHAR_MATCHES(p, c) ((p)[0] == 0 && (p)[1] == c)
+#define BIG2_CHAR_MATCHES(p, c) ((p)[0] == 0 && (p)[1] == (c))
#define BIG2_IS_NAME_CHAR_MINBPC(p) \
UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1])
#define BIG2_IS_NMSTRT_CHAR_MINBPC(p) \
diff --git a/3rdparty/expat/lib/xmltok.h b/3rdparty/expat/lib/xmltok.h
index 2adbf5307be..c51fce1ec15 100644
--- a/3rdparty/expat/lib/xmltok.h
+++ b/3rdparty/expat/lib/xmltok.h
@@ -7,7 +7,11 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002-2005 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -285,7 +289,8 @@ int XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc,
const char **encodingNamePtr,
const ENCODING **namedEncodingPtr, int *standalonePtr);
-int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name);
+int XmlInitEncoding(INIT_ENCODING *p, const ENCODING **encPtr,
+ const char *name);
const ENCODING *XmlGetUtf8InternalEncoding(void);
const ENCODING *XmlGetUtf16InternalEncoding(void);
int FASTCALL XmlUtf8Encode(int charNumber, char *buf);
@@ -303,7 +308,8 @@ int XmlParseXmlDeclNS(int isGeneralTextEntity, const ENCODING *enc,
const char **encodingNamePtr,
const ENCODING **namedEncodingPtr, int *standalonePtr);
-int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name);
+int XmlInitEncodingNS(INIT_ENCODING *p, const ENCODING **encPtr,
+ const char *name);
const ENCODING *XmlGetUtf8InternalEncodingNS(void);
const ENCODING *XmlGetUtf16InternalEncodingNS(void);
ENCODING *XmlInitUnknownEncodingNS(void *mem, int *table, CONVERTER convert,
diff --git a/3rdparty/expat/lib/xmltok_impl.c b/3rdparty/expat/lib/xmltok_impl.c
index 06d5c90851f..239a2d06c45 100644
--- a/3rdparty/expat/lib/xmltok_impl.c
+++ b/3rdparty/expat/lib/xmltok_impl.c
@@ -1,4 +1,4 @@
-/* This file is included!
+/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
__ __ _
___\ \/ /_ __ __ _| |_
/ _ \\ /| '_ \ / _` | __|
@@ -7,7 +7,16 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2018 Benjamin Peterson <benjamin@python.org>
+ Copyright (c) 2018 Anton Maklakov <antmak.pub@gmail.com>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Boris Kolpackov <boris@codesynthesis.com>
+ Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -32,7 +41,7 @@
#ifdef XML_TOK_IMPL_C
-# ifndef IS_INVALID_CHAR
+# ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
# define IS_INVALID_CHAR(enc, ptr, n) (0)
# endif
@@ -61,7 +70,7 @@
case BT_LEAD##n: \
if (end - ptr < n) \
return XML_TOK_PARTIAL_CHAR; \
- if (! IS_NAME_CHAR(enc, ptr, n)) { \
+ if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) { \
*nextTokPtr = ptr; \
return XML_TOK_INVALID; \
} \
@@ -88,9 +97,9 @@
# define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
case BT_LEAD##n: \
- if (end - ptr < n) \
+ if ((end) - (ptr) < (n)) \
return XML_TOK_PARTIAL_CHAR; \
- if (! IS_NMSTRT_CHAR(enc, ptr, n)) { \
+ if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) { \
*nextTokPtr = ptr; \
return XML_TOK_INVALID; \
} \
@@ -116,7 +125,8 @@
# define PREFIX(ident) ident
# endif
-# define HAS_CHARS(enc, ptr, end, count) (end - ptr >= count * MINBPC(enc))
+# define HAS_CHARS(enc, ptr, end, count) \
+ ((end) - (ptr) >= ((count) * MINBPC(enc)))
# define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
@@ -1134,6 +1144,10 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
case BT_LEAD##n: \
if (end - ptr < n) \
return XML_TOK_PARTIAL_CHAR; \
+ if (IS_INVALID_CHAR(enc, ptr, n)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_INVALID; \
+ } \
if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
ptr += n; \
tok = XML_TOK_NAME; \
@@ -1262,7 +1276,7 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
switch (BYTE_TYPE(enc, ptr)) {
# define LEAD_CASE(n) \
case BT_LEAD##n: \
- ptr += n; \
+ ptr += n; /* NOTE: The encoding has already been validated. */ \
break;
LEAD_CASE(2)
LEAD_CASE(3)
@@ -1331,7 +1345,7 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
switch (BYTE_TYPE(enc, ptr)) {
# define LEAD_CASE(n) \
case BT_LEAD##n: \
- ptr += n; \
+ ptr += n; /* NOTE: The encoding has already been validated. */ \
break;
LEAD_CASE(2)
LEAD_CASE(3)
@@ -1510,7 +1524,7 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
state = inName; \
}
# define LEAD_CASE(n) \
- case BT_LEAD##n: \
+ case BT_LEAD##n: /* NOTE: The encoding has already been validated. */ \
START_NAME ptr += (n - MINBPC(enc)); \
break;
LEAD_CASE(2)
@@ -1722,7 +1736,7 @@ PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
switch (BYTE_TYPE(enc, ptr)) {
# define LEAD_CASE(n) \
case BT_LEAD##n: \
- ptr += n; \
+ ptr += n; /* NOTE: The encoding has already been validated. */ \
break;
LEAD_CASE(2)
LEAD_CASE(3)
@@ -1767,7 +1781,7 @@ PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
switch (BYTE_TYPE(enc, ptr)) {
# define LEAD_CASE(n) \
case BT_LEAD##n: \
- ptr += n; \
+ ptr += n; /* NOTE: The encoding has already been validated. */ \
pos->columnNumber++; \
break;
LEAD_CASE(2)
diff --git a/3rdparty/expat/lib/xmltok_impl.h b/3rdparty/expat/lib/xmltok_impl.h
index e925dbc7e2c..3469c4ae138 100644
--- a/3rdparty/expat/lib/xmltok_impl.h
+++ b/3rdparty/expat/lib/xmltok_impl.h
@@ -7,7 +7,8 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2017-2019 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -44,7 +45,7 @@ enum {
BT_LF, /* line feed = "\n" */
BT_GT, /* greater than = ">" */
BT_QUOT, /* quotation character = "\"" */
- BT_APOS, /* aposthrophe = "'" */
+ BT_APOS, /* apostrophe = "'" */
BT_EQUALS, /* equal sign = "=" */
BT_QUEST, /* question mark = "?" */
BT_EXCL, /* exclamation mark = "!" */
diff --git a/3rdparty/expat/lib/xmltok_ns.c b/3rdparty/expat/lib/xmltok_ns.c
index 919c74e9f97..fbdd3e3c7b7 100644
--- a/3rdparty/expat/lib/xmltok_ns.c
+++ b/3rdparty/expat/lib/xmltok_ns.c
@@ -7,7 +7,11 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -89,7 +93,7 @@ NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
static const ENCODING *
NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) {
# define ENCODING_MAX 128
- char buf[ENCODING_MAX];
+ char buf[ENCODING_MAX] = "";
char *p = buf;
int i;
XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
diff --git a/3rdparty/expat/m4/libtool.m4 b/3rdparty/expat/m4/libtool.m4
index ae7c9061329..91a91f82904 100644
--- a/3rdparty/expat/m4/libtool.m4
+++ b/3rdparty/expat/m4/libtool.m4
@@ -1,6 +1,7 @@
# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
#
-# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+# Copyright (C) 1996-2001, 2003-2019, 2021-2024 Free Software
+# Foundation, Inc.
# Written by Gordon Matzigkeit, 1996
#
# This file is free software; the Free Software Foundation gives
@@ -8,13 +9,13 @@
# modifications, as long as this notice is preserved.
m4_define([_LT_COPYING], [dnl
-# Copyright (C) 2014 Free Software Foundation, Inc.
+# Copyright (C) 2024 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# GNU Libtool is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of of the License, or
+# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License, if you
@@ -31,7 +32,7 @@ m4_define([_LT_COPYING], [dnl
# along with this program. If not, see <http://www.gnu.org/licenses/>.
])
-# serial 58 LT_INIT
+# serial 63 LT_INIT
# LT_PREREQ(VERSION)
@@ -59,7 +60,7 @@ esac
# LT_INIT([OPTIONS])
# ------------------
AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+[AC_PREREQ([2.64])dnl We use AC_PATH_PROGS_FEATURE_CHECK
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
AC_BEFORE([$0], [LT_LANG])dnl
AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -181,6 +182,7 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_CHECK_SHELL_FEATURES])dnl
m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_DECL_FILECMD])dnl
m4_require([_LT_CHECK_MAGIC_METHOD])dnl
m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
m4_require([_LT_CMD_OLD_ARCHIVE])dnl
@@ -219,8 +221,8 @@ esac
ofile=libtool
can_build_shared=yes
-# All known linkers require a '.a' archive for static linking (except MSVC,
-# which needs '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
libext=a
with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -614,7 +616,7 @@ m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
# LT_OUTPUT
# ---------
# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
+# AC_OUTPUT is called), in case it is used in configure for compilation
# tests.
AC_DEFUN([LT_OUTPUT],
[: ${CONFIG_LT=./config.lt}
@@ -649,9 +651,9 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
configured by $[0], generated by m4_PACKAGE_STRING.
-Copyright (C) 2011 Free Software Foundation, Inc.
+Copyright (C) 2024 Free Software Foundation, Inc.
This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
+gives unlimited permission to copy, distribute and modify it."
while test 0 != $[#]
do
@@ -728,7 +730,6 @@ _LT_CONFIG_SAVE_COMMANDS([
cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
# Generated automatically by $as_me ($PACKAGE) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
# Provide generalized library-building support services.
@@ -778,7 +779,7 @@ _LT_EOF
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "$cfgfile" \
+ $SED '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" ||
@@ -973,6 +974,7 @@ _lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*
])# _LT_LINKER_BOILERPLATE
+
# _LT_REQUIRED_DARWIN_CHECKS
# -------------------------
m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
@@ -1023,6 +1025,21 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
rm -f conftest.*
fi])
+ # Feature test to disable chained fixups since it is not
+ # compatible with '-undefined dynamic_lookup'
+ AC_CACHE_CHECK([for -no_fixup_chains linker flag],
+ [lt_cv_support_no_fixup_chains],
+ [ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([],[])],
+ lt_cv_support_no_fixup_chains=yes,
+ lt_cv_support_no_fixup_chains=no
+ )
+ LDFLAGS=$save_LDFLAGS
+ ]
+ )
+
AC_CACHE_CHECK([for -exported_symbols_list linker flag],
[lt_cv_ld_exported_symbols_list],
[lt_cv_ld_exported_symbols_list=no
@@ -1042,12 +1059,12 @@ int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
- echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
- $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+ echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
$RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
cat > conftest.c << _LT_EOF
-int main() { return 0;}
+int main(void) { return 0;}
_LT_EOF
echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
@@ -1067,23 +1084,37 @@ _LT_EOF
_lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- darwin*) # darwin 5.x on
- # if running on 10.5 or later, the deployment target defaults
- # to the OS version, if on x86, and 10.4, the deployment
- # target defaults to 10.4. Don't you love it?
- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
- 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
- _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
- 10.[[012]][[,.]]*)
- _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- 10.*)
- _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ darwin*)
+ case $MACOSX_DEPLOYMENT_TARGET,$host in
+ 10.[[012]],*|,*powerpc*-darwin[[5-8]]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ *)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup'
+ if test yes = "$lt_cv_support_no_fixup_chains"; then
+ AS_VAR_APPEND([_lt_dar_allow_undefined], [' $wl-no_fixup_chains'])
+ fi
+ ;;
esac
;;
esac
if test yes = "$lt_cv_apple_cc_single_mod"; then
_lt_dar_single_mod='$single_module'
fi
+ _lt_dar_needs_single_mod=no
+ case $host_os in
+ rhapsody* | darwin1.*)
+ _lt_dar_needs_single_mod=yes ;;
+ darwin*)
+ # When targeting Mac OS X 10.4 (darwin 8) or later,
+ # -single_module is the default and -multi_module is unsupported.
+ # The toolchain on macOS 10.14 (darwin 18) and later cannot
+ # target any OS version that needs -single_module.
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*-darwin[[567]].*|10.[[0-3]],*-darwin[[5-9]].*|10.[[0-3]],*-darwin1[[0-7]].*)
+ _lt_dar_needs_single_mod=yes ;;
+ esac
+ ;;
+ esac
if test yes = "$lt_cv_ld_exported_symbols_list"; then
_lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
else
@@ -1126,12 +1157,12 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
output_verbose_link_cmd=func_echo_all
_LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
_LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
- _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
m4_if([$1], [CXX],
-[ if test yes != "$lt_cv_apple_cc_single_mod"; then
+[ if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then
_LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
fi
],[])
else
@@ -1245,7 +1276,8 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
# _LT_WITH_SYSROOT
# ----------------
AC_DEFUN([_LT_WITH_SYSROOT],
-[AC_MSG_CHECKING([for sysroot])
+[m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([for sysroot])
AC_ARG_WITH([sysroot],
[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
[Search for dependent libraries within DIR (or the compiler's sysroot
@@ -1258,11 +1290,13 @@ lt_sysroot=
case $with_sysroot in #(
yes)
if test yes = "$GCC"; then
- lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ # Trim trailing / since we'll always append absolute paths and we want
+ # to avoid //, if only for less confusing output for the user.
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'`
fi
;; #(
/*)
- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
;; #(
no|'')
;; #(
@@ -1292,7 +1326,7 @@ ia64-*-hpux*)
# options accordingly.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE=32
;;
@@ -1309,7 +1343,7 @@ ia64-*-hpux*)
echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
if test yes = "$lt_cv_prog_gnu_ld"; then
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
@@ -1321,7 +1355,7 @@ ia64-*-hpux*)
;;
esac
else
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
@@ -1343,7 +1377,7 @@ mips64*-*linux*)
echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
emul=elf
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*32-bit*)
emul="${emul}32"
;;
@@ -1351,7 +1385,7 @@ mips64*-*linux*)
emul="${emul}64"
;;
esac
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*MSB*)
emul="${emul}btsmip"
;;
@@ -1359,7 +1393,7 @@ mips64*-*linux*)
emul="${emul}ltsmip"
;;
esac
- case `/usr/bin/file conftest.$ac_objext` in
+ case `$FILECMD conftest.$ac_objext` in
*N32*)
emul="${emul}n32"
;;
@@ -1370,7 +1404,7 @@ mips64*-*linux*)
;;
x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*)
# Find out what ABI is being produced by ac_compile, and set linker
# options accordingly. Note that the listed cases only cover the
# situations where additional linker options are needed (such as when
@@ -1379,14 +1413,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
# not appear in the list.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.o` in
+ case `$FILECMD conftest.o` in
*32-bit*)
case $host in
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_i386_fbsd"
;;
- x86_64-*linux*)
- case `/usr/bin/file conftest.o` in
+ x86_64-*linux*|x86_64-gnu*)
+ case `$FILECMD conftest.o` in
*x86-64*)
LD="${LD-ld} -m elf32_x86_64"
;;
@@ -1414,7 +1448,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_x86_64_fbsd"
;;
- x86_64-*linux*)
+ x86_64-*linux*|x86_64-gnu*)
LD="${LD-ld} -m elf_x86_64"
;;
powerpcle-*linux*|powerpc64le-*linux*)
@@ -1454,7 +1488,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
# options accordingly.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.o` in
+ case `$FILECMD conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*)
@@ -1493,9 +1527,22 @@ need_locks=$enable_libtool_lock
m4_defun([_LT_PROG_AR],
[AC_CHECK_TOOLS(AR, [ar], false)
: ${AR=ar}
-: ${AR_FLAGS=cru}
_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+# Use ARFLAGS variable as AR's operation code to sync the variable naming with
+# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
+# higher priority because that's what people were doing historically (setting
+# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
+# variable obsoleted/removed.
+
+test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
+lt_ar_flags=$AR_FLAGS
+_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)])
+
+# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
+# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
+_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}],
+ [Flags to create an archive])
AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
[lt_cv_ar_at_file=no
@@ -1534,7 +1581,7 @@ AC_CHECK_TOOL(STRIP, strip, :)
test -z "$STRIP" && STRIP=:
_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_REQUIRE([AC_PROG_RANLIB])
test -z "$RANLIB" && RANLIB=:
_LT_DECL([], [RANLIB], [1],
[Commands used to install an old-style archive])
@@ -1545,15 +1592,8 @@ old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=
if test -n "$RANLIB"; then
- case $host_os in
- bitrig* | openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
- ;;
- *)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
- ;;
- esac
old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
fi
case $host_os in
@@ -1685,14 +1725,14 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=12288; # 12K is about right
;;
- gnu*)
- # Under GNU Hurd, this test is not required because there is
- # no limit to the length of command line arguments.
+ gnu* | ironclad*)
+ # Under GNU Hurd and Ironclad, this test is not required because there
+ # is no limit to the length of command line arguments.
# Libtool will interpret -1 as no limit whatsoever
lt_cv_sys_max_cmd_len=-1;
;;
- cygwin* | mingw* | cegcc*)
+ cygwin* | mingw* | windows* | cegcc*)
# On Win9x/ME, this test blows up -- it succeeds, but takes
# about 5 minutes as the teststring grows exponentially.
# Worse, since 9x/ME are not pre-emptively multitasking,
@@ -1708,18 +1748,13 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=8192;
;;
- mint*)
- # On MiNT this can take a long time and run out of memory.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
lt_cv_sys_max_cmd_len=8192;
;;
- bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1762,7 +1797,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
+ lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
@@ -1879,11 +1914,11 @@ else
/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
+int fnord (void) __attribute__((visibility("default")));
#endif
-int fnord () { return 42; }
-int main ()
+int fnord (void) { return 42; }
+int main (void)
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
int status = $lt_dlunknown;
@@ -1940,7 +1975,7 @@ else
lt_cv_dlopen_self=yes
;;
- mingw* | pw32* | cegcc*)
+ mingw* | windows* | pw32* | cegcc*)
lt_cv_dlopen=LoadLibrary
lt_cv_dlopen_libs=
;;
@@ -2212,26 +2247,35 @@ m4_defun([_LT_CMD_STRIPLIB],
striplib=
old_striplib=
AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- AC_MSG_RESULT([yes])
+if test -z "$STRIP"; then
+ AC_MSG_RESULT([no])
else
-# FIXME - insert some real tests, host_os isn't really good enough
- case $host_os in
- darwin*)
- if test -n "$STRIP"; then
+ if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+ else
+ case $host_os in
+ darwin*)
+ # FIXME - insert some real tests, host_os isn't really good enough
striplib="$STRIP -x"
old_striplib="$STRIP -S"
AC_MSG_RESULT([yes])
- else
+ ;;
+ freebsd*)
+ if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
+ old_striplib="$STRIP --strip-debug"
+ striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ ;;
+ *)
AC_MSG_RESULT([no])
- fi
- ;;
- *)
- AC_MSG_RESULT([no])
- ;;
- esac
+ ;;
+ esac
+ fi
fi
_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
_LT_DECL([], [striplib], [1])
@@ -2299,7 +2343,7 @@ if test yes = "$GCC"; then
*) lt_awk_arg='/^libraries:/' ;;
esac
case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+ mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
*) lt_sed_strip_eq='s|=/|/|g' ;;
esac
lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
@@ -2357,7 +2401,7 @@ BEGIN {RS = " "; FS = "/|\n";} {
# AWK program above erroneously prepends '/' to C:/dos/paths
# for these hosts.
case $host_os in
- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
$SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
esac
sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
@@ -2432,7 +2476,7 @@ aix[[4-9]]*)
# Unfortunately, runtime linking may impact performance, so we do
# not want this to be the default eventually. Also, we use the
# versioned .so libs for executables only if there is the -brtl
- # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only.
# To allow for filename-based versioning support, we need to create
# libNAME.so.V as an archive file, containing:
# *) an Import File, referring to the versioned filename of the
@@ -2526,7 +2570,7 @@ bsdi[[45]]*)
# libtool to hard-code these into programs
;;
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
version_type=windows
shrext_cmds=.dll
need_version=no
@@ -2537,15 +2581,29 @@ cygwin* | mingw* | pw32* | cegcc*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \$file`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
+ # If user builds GCC with multilib enabled,
+ # it should just install on $(libdir)
+ # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones.
+ if test xyes = x"$multilib"; then
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ $install_prog $dir/$dlname $destdir/$dlname~
+ chmod a+x $destdir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib $destdir/$dlname'\'' || exit \$?;
+ fi'
+ else
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ fi
postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
dlpath=$dir/\$dldll~
$RM \$dlpath'
@@ -2554,30 +2612,30 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
m4_if([$1], [],[
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
;;
- mingw* | cegcc*)
+ mingw* | windows* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
- *,cl*)
- # Native MSVC
+ *,cl* | *,icl*)
+ # Native MSVC or ICC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
case $build_os in
- mingw*)
+ mingw* | windows*)
sys_lib_search_path_spec=
lt_save_ifs=$IFS
IFS=';'
@@ -2590,7 +2648,7 @@ m4_if([$1], [],[
done
IFS=$lt_save_ifs
# Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
@@ -2627,7 +2685,7 @@ m4_if([$1], [],[
;;
*)
- # Assume MSVC wrapper
+ # Assume MSVC and ICC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
@@ -2660,7 +2718,7 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd* | dragonfly*)
+freebsd* | dragonfly* | midnightbsd*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
@@ -2697,7 +2755,21 @@ freebsd* | dragonfly*)
need_version=no
;;
esac
- shlibpath_var=LD_LIBRARY_PATH
+ case $host_cpu in
+ powerpc64)
+ # On FreeBSD bi-arch platforms, a different variable is used for 32-bit
+ # binaries. See <https://man.freebsd.org/cgi/man.cgi?query=ld.so>.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[int test_pointer_size[sizeof (void *) - 5];
+ ]])],
+ [shlibpath_var=LD_LIBRARY_PATH],
+ [shlibpath_var=LD_32_LIBRARY_PATH])
+ ;;
+ *)
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+ esac
case $host_os in
freebsd2.*)
shlibpath_overrides_runpath=yes
@@ -2727,8 +2799,9 @@ haiku*)
soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
shlibpath_overrides_runpath=no
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
+ sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib'
+ sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib'
+ hardcode_into_libs=no
;;
hpux9* | hpux10* | hpux11*)
@@ -2838,7 +2911,7 @@ linux*android*)
version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
- library_names_spec='$libname$release$shared_ext'
+ library_names_spec='$libname$release$shared_ext $libname$shared_ext'
soname_spec='$libname$release$shared_ext'
finish_cmds=
shlibpath_var=LD_LIBRARY_PATH
@@ -2850,8 +2923,9 @@ linux*android*)
hardcode_into_libs=yes
dynamic_linker='Android linker'
- # Don't embed -rpath directories since the linker doesn't support them.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ # -rpath works at least for libraries that are not overridden by
+ # libraries installed in system locations.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
;;
# This must be glibc/ELF.
@@ -2885,7 +2959,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
# before this can be enabled.
hardcode_into_libs=yes
- # Ideally, we could use ldconfig to report *all* directores which are
+ # Ideally, we could use ldconfig to report *all* directories which are
# searched for libraries, however this is still not possible. Aside from not
# being certain /sbin/ldconfig is available, command
# 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
@@ -2905,6 +2979,18 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
dynamic_linker='GNU/Linux ld.so'
;;
+netbsdelf*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='NetBSD ld.elf_so'
+ ;;
+
netbsd*)
version_type=sunos
need_lib_prefix=no
@@ -2923,6 +3009,18 @@ netbsd*)
hardcode_into_libs=yes
;;
+*-mlibc)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='mlibc ld.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
newsos6)
version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
@@ -2942,7 +3040,7 @@ newsos6)
dynamic_linker='ldqnx.so'
;;
-openbsd* | bitrig*)
+openbsd*)
version_type=sunos
sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
@@ -3002,6 +3100,17 @@ rdos*)
dynamic_linker=no
;;
+serenity*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ dynamic_linker='SerenityOS LibELF'
+ ;;
+
solaris*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
@@ -3099,6 +3208,21 @@ uts4*)
shlibpath_var=LD_LIBRARY_PATH
;;
+emscripten*)
+ version_type=none
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ dynamic_linker="Emscripten linker"
+ _LT_COMPILER_PIC($1)='-fPIC'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym'
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_TAGVAR(no_undefined_flag, $1)=
+ ;;
+
*)
dynamic_linker=no
;;
@@ -3274,7 +3398,7 @@ if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
AC_MSG_CHECKING([for ld used by $CC])
case $host in
- *-*-mingw*)
+ *-*-mingw* | *-*-windows*)
# gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
@@ -3383,7 +3507,7 @@ case $reload_flag in
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
if test yes != "$GCC"; then
reload_cmds=false
fi
@@ -3455,7 +3579,6 @@ lt_cv_deplibs_check_method='unknown'
# 'none' -- dependencies not supported.
# 'unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
# that responds to the $file_magic_cmd with a given extended regex.
# If you have 'file' or equivalent on your system and you're not sure
@@ -3472,7 +3595,7 @@ beos*)
bsdi[[45]]*)
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_cmd='$FILECMD -L'
lt_cv_file_magic_test_file=/shlib/libc.so
;;
@@ -3482,7 +3605,7 @@ cygwin*)
lt_cv_file_magic_cmd='func_win32_libid'
;;
-mingw* | pw32*)
+mingw* | windows* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
@@ -3491,7 +3614,7 @@ mingw* | pw32*)
lt_cv_file_magic_cmd='func_win32_libid'
else
# Keep this pattern in sync with the one in func_win32_libid.
- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)'
lt_cv_file_magic_cmd='$OBJDUMP -f'
fi
;;
@@ -3506,14 +3629,14 @@ darwin* | rhapsody*)
lt_cv_deplibs_check_method=pass_all
;;
-freebsd* | dragonfly*)
+freebsd* | dragonfly* | midnightbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_cmd=$FILECMD
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
@@ -3527,7 +3650,7 @@ haiku*)
;;
hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_cmd=$FILECMD
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
@@ -3564,7 +3687,11 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
-netbsd*)
+*-mlibc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else
@@ -3574,7 +3701,7 @@ netbsd*)
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_cmd=$FILECMD
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
@@ -3582,7 +3709,7 @@ newos6*)
lt_cv_deplibs_check_method=pass_all
;;
-openbsd* | bitrig*)
+openbsd*)
if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
else
@@ -3598,6 +3725,10 @@ rdos*)
lt_cv_deplibs_check_method=pass_all
;;
+serenity*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
solaris*)
lt_cv_deplibs_check_method=pass_all
;;
@@ -3646,7 +3777,7 @@ file_magic_glob=
want_nocaseglob=no
if test "$build" = "$host"; then
case $host_os in
- mingw* | pw32*)
+ mingw* | windows* | pw32*)
if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
want_nocaseglob=yes
else
@@ -3698,16 +3829,16 @@ else
# Tru64's nm complains that /dev/null is an invalid object file
# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
case $build_os in
- mingw*) lt_bad_file=conftest.nm/nofile ;;
+ mingw* | windows*) lt_bad_file=conftest.nm/nofile ;;
*) lt_bad_file=/dev/null ;;
esac
- case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
*$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break 2
;;
*)
- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break 2
@@ -3733,7 +3864,7 @@ else
# Let the user override the test.
else
AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
- case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
*COFF*)
DUMPBIN="$DUMPBIN -symbols -headers"
;;
@@ -3789,7 +3920,7 @@ lt_cv_sharedlib_from_linklib_cmd,
[lt_cv_sharedlib_from_linklib_cmd='unknown'
case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
# two different shell functions defined in ltmain.sh;
# decide which one to use based on capabilities of $DLLTOOL
case `$DLLTOOL --help 2>&1` in
@@ -3821,16 +3952,16 @@ _LT_DECL([], [sharedlib_from_linklib_cmd], [1],
m4_defun([_LT_PATH_MANIFEST_TOOL],
[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
- [lt_cv_path_mainfest_tool=no
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_manifest_tool],
+ [lt_cv_path_manifest_tool=no
echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
$MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
cat conftest.err >&AS_MESSAGE_LOG_FD
if $GREP 'Manifest Tool' conftest.out > /dev/null; then
- lt_cv_path_mainfest_tool=yes
+ lt_cv_path_manifest_tool=yes
fi
rm -f conftest*])
-if test yes != "$lt_cv_path_mainfest_tool"; then
+if test yes != "$lt_cv_path_manifest_tool"; then
MANIFEST_TOOL=:
fi
_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
@@ -3859,7 +3990,7 @@ AC_DEFUN([LT_LIB_M],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
LIBM=
case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-mingw* | *-*-pw32* | *-*-darwin*)
# These system don't have libm, or don't need it
;;
*-ncr-sysv4.3*)
@@ -3934,7 +4065,7 @@ case $host_os in
aix*)
symcode='[[BCDT]]'
;;
-cygwin* | mingw* | pw32* | cegcc*)
+cygwin* | mingw* | windows* | pw32* | cegcc*)
symcode='[[ABCDGISTW]]'
;;
hpux*)
@@ -3949,7 +4080,7 @@ osf*)
symcode='[[BCDEGQRST]]'
;;
solaris*)
- symcode='[[BDRT]]'
+ symcode='[[BCDRT]]'
;;
sco3.2v5*)
symcode='[[DT]]'
@@ -3973,7 +4104,7 @@ esac
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Gets list of data symbols to import.
- lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
# Adjust the below global symbol transforms to fixup imported variables.
lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
@@ -3991,20 +4122,20 @@ fi
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
$lt_cdecl_hook\
" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
$lt_c_name_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
# Transform an extracted symbol line into symbol name with lib prefix and
# symbol address.
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
$lt_c_name_lib_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
@@ -4013,7 +4144,7 @@ $lt_c_name_lib_hook\
# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
-mingw*)
+mingw* | windows*)
opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
;;
esac
@@ -4028,7 +4159,7 @@ for ac_symprfx in "" "_"; do
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Fake it for dumpbin and say T for any non-static function,
# D for any global variable and I for any imported variable.
- # Also find C++ and __fastcall symbols from MSVC++,
+ # Also find C++ and __fastcall symbols from MSVC++ or ICC,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK ['"\
" {last_section=section; section=\$ 3};"\
@@ -4046,9 +4177,9 @@ for ac_symprfx in "" "_"; do
" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx]"
else
- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
@@ -4064,13 +4195,14 @@ void nm_test_func(void){}
#ifdef __cplusplus
}
#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
+int main(void){nm_test_var='a';nm_test_func();return(0);}
_LT_EOF
if AC_TRY_EVAL(ac_compile); then
# Now try to grab the symbols.
nlist=conftest.nm
- if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+ $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD
+ if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
@@ -4240,7 +4372,7 @@ m4_if([$1], [CXX], [
beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
# PIC is the default for these OSes.
;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
+ mingw* | windows* | cygwin* | os2* | pw32* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
# Although the cygwin gcc ignores -fPIC, still need this for old-style
@@ -4316,7 +4448,7 @@ m4_if([$1], [CXX], [
;;
esac
;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
+ mingw* | windows* | cygwin* | os2* | pw32* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
m4_if([$1], [GCJ], [],
@@ -4335,7 +4467,7 @@ m4_if([$1], [CXX], [
;;
esac
;;
- freebsd* | dragonfly*)
+ freebsd* | dragonfly* | midnightbsd*)
# FreeBSD uses GNU C++
;;
hpux9* | hpux10* | hpux11*)
@@ -4418,7 +4550,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*)
# Sun C++ 5.9
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4442,7 +4574,9 @@ m4_if([$1], [CXX], [
;;
esac
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
+ ;;
+ *-mlibc)
;;
*qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4472,6 +4606,8 @@ m4_if([$1], [CXX], [
;;
psos*)
;;
+ serenity*)
+ ;;
solaris*)
case $cc_basename in
CC* | sunCC*)
@@ -4564,7 +4700,7 @@ m4_if([$1], [CXX], [
# PIC is the default for these OSes.
;;
- mingw* | cygwin* | pw32* | os2* | cegcc*)
+ mingw* | windows* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
# Although the cygwin gcc ignores -fPIC, still need this for old-style
@@ -4668,7 +4804,7 @@ m4_if([$1], [CXX], [
esac
;;
- mingw* | cygwin* | pw32* | os2* | cegcc*)
+ mingw* | windows* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
m4_if([$1], [GCJ], [],
@@ -4710,6 +4846,12 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
;;
+ *flang* | ftn | f18* | f95*)
+ # Flang compiler.
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
# icc used to be incompatible with GCC.
# ICC 10 doesn't accept -KPIC any more.
icc* | ifort*)
@@ -4754,7 +4896,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4792,6 +4934,12 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
+ *-mlibc)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+
*nto* | *qnx*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
# it will coredump.
@@ -4808,6 +4956,9 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
+ serenity*)
+ ;;
+
solaris*)
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
@@ -4937,15 +5088,15 @@ m4_if([$1], [CXX], [
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
_LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
_LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
;;
- cygwin* | mingw* | cegcc*)
+ cygwin* | mingw* | windows* | cegcc*)
case $cc_basename in
- cl*)
+ cl* | icl*)
_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
;;
*)
@@ -5001,21 +5152,18 @@ dnl Note also adjust exclude_expsyms for C++ above.
extract_expsyms_cmds=
case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
+ # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
+ # Microsoft Visual C++ or Intel C++ Compiler.
if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
+ # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
with_gnu_ld=yes
;;
- openbsd* | bitrig*)
- with_gnu_ld=no
- ;;
esac
_LT_TAGVAR(ld_shlibs, $1)=yes
@@ -5062,7 +5210,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
_LT_TAGVAR(whole_archive_flag_spec, $1)=
fi
supports_anon_versioning=no
- case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -5116,7 +5264,7 @@ _LT_EOF
fi
;;
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
# _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
# as there is no search path for DLLs.
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
@@ -5126,6 +5274,7 @@ _LT_EOF
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
_LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+ _LT_TAGVAR(file_list_spec, $1)='@'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -5145,7 +5294,7 @@ _LT_EOF
haiku*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(link_all_deplibs, $1)=no
;;
os2*)
@@ -5172,8 +5321,9 @@ _LT_EOF
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
- _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
;;
interix[[3-9]]*)
@@ -5188,7 +5338,7 @@ _LT_EOF
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
@@ -5231,7 +5381,7 @@ _LT_EOF
_LT_TAGVAR(compiler_needs_object, $1)=yes
;;
esac
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*) # Sun C 5.9
_LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
@@ -5243,13 +5393,14 @@ _LT_EOF
if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
case $cc_basename in
tcc*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
;;
xlf* | bgf* | bgxlf* | mpixlf*)
@@ -5259,7 +5410,7 @@ _LT_EOF
_LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
@@ -5270,7 +5421,12 @@ _LT_EOF
fi
;;
- netbsd*)
+ *-mlibc)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
@@ -5391,7 +5547,7 @@ _LT_EOF
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
_LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
@@ -5572,14 +5728,14 @@ _LT_EOF
_LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
;;
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
+ # Microsoft Visual C++ or Intel C++ Compiler.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
case $cc_basename in
- cl*)
- # Native MSVC
+ cl* | icl*)
+ # Native MSVC or ICC
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_TAGVAR(always_export_symbols, $1)=yes
@@ -5589,14 +5745,14 @@ _LT_EOF
# Tell ltmain to make .dll files, not .so files.
shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_cmds, $1)='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
cp "$export_symbols" "$output_objdir/$soname.def";
echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
else
$SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
@@ -5620,7 +5776,7 @@ _LT_EOF
fi'
;;
*)
- # Assume MSVC wrapper
+ # Assume MSVC and ICC wrapper
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
# Tell ltmain to make .lib files, not .a files.
@@ -5668,7 +5824,7 @@ _LT_EOF
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly*)
+ freebsd* | dragonfly* | midnightbsd*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_TAGVAR(hardcode_direct, $1)=yes
@@ -5808,11 +5964,15 @@ _LT_EOF
# Fabrice Bellard et al's Tiny C Compiler
_LT_TAGVAR(ld_shlibs, $1)=yes
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
;;
esac
;;
- netbsd*)
+ *-mlibc)
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
@@ -5834,7 +5994,7 @@ _LT_EOF
*nto* | *qnx*)
;;
- openbsd* | bitrig*)
+ openbsd*)
if test -f /usr/libexec/ld.so; then
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -5877,8 +6037,9 @@ _LT_EOF
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
- _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
;;
osf3*)
@@ -5912,6 +6073,9 @@ _LT_EOF
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
;;
+ serenity*)
+ ;;
+
solaris*)
_LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
if test yes = "$GCC"; then
@@ -6170,7 +6334,7 @@ _LT_TAGDECL([], [hardcode_direct], [0],
_LT_TAGDECL([], [hardcode_direct_absolute], [0],
[Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
DIR into the resulting binary and the resulting library dependency is
- "absolute", i.e impossible to change by setting $shlibpath_var if the
+ "absolute", i.e. impossible to change by setting $shlibpath_var if the
library is relocated])
_LT_TAGDECL([], [hardcode_minus_L], [0],
[Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -6228,7 +6392,7 @@ _LT_TAGVAR(objext, $1)=$objext
lt_simple_compile_test_code="int some_variable = 0;"
# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
+lt_simple_link_test_code='int main(void){return(0);}'
_LT_TAG_COMPILER
# Save the default compiler, since it gets overwritten when the other
@@ -6417,8 +6581,7 @@ if test yes != "$_lt_caught_CXX_error"; then
wlarc='$wl'
# ancient GNU ld didn't support --whole-archive et. al.
- if eval "`$CC -print-prog-name=ld` --help 2>&1" |
- $GREP 'no-whole-archive' > /dev/null; then
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
_LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
_LT_TAGVAR(whole_archive_flag_spec, $1)=
@@ -6438,7 +6601,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"'
else
GXX=no
@@ -6647,10 +6810,10 @@ if test yes != "$_lt_caught_CXX_error"; then
esac
;;
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
case $GXX,$cc_basename in
- ,cl* | no,cl*)
- # Native MSVC
+ ,cl* | no,cl* | ,icl* | no,icl*)
+ # Native MSVC or ICC
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
@@ -6700,6 +6863,7 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_TAGVAR(always_export_symbols, $1)=no
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -6746,8 +6910,9 @@ if test yes != "$_lt_caught_CXX_error"; then
cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
emximp -o $lib $output_objdir/$libname.def'
- _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
;;
dgux*)
@@ -6778,7 +6943,7 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
;;
- freebsd* | dragonfly*)
+ freebsd* | dragonfly* | midnightbsd*)
# FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
# conventions
_LT_TAGVAR(ld_shlibs, $1)=yes
@@ -6786,7 +6951,7 @@ if test yes != "$_lt_caught_CXX_error"; then
haiku*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_TAGVAR(link_all_deplibs, $1)=no
;;
hpux9*)
@@ -6813,7 +6978,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
@@ -6878,7 +7043,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test yes = "$GXX"; then
@@ -6915,7 +7080,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
irix5* | irix6*)
case $cc_basename in
@@ -7055,13 +7220,13 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
;;
*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*)
# Sun C++ 5.9
_LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
@@ -7110,6 +7275,10 @@ if test yes != "$_lt_caught_CXX_error"; then
esac
;;
+ *-mlibc)
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
@@ -7126,7 +7295,7 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(ld_shlibs, $1)=yes
;;
- openbsd* | bitrig*)
+ openbsd*)
if test -f /usr/libexec/ld.so; then
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -7217,7 +7386,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"'
else
# FIXME: insert proper C++ library support
@@ -7232,6 +7401,9 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(ld_shlibs, $1)=no
;;
+ serenity*)
+ ;;
+
sunos4*)
case $cc_basename in
CC*)
@@ -7301,7 +7473,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"'
else
# g++ 2.7 appears to require '-G' NOT '-shared' on this
# platform.
@@ -7312,7 +7484,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"'
fi
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
@@ -7550,10 +7722,11 @@ if AC_TRY_EVAL(ac_compile); then
case $prev$p in
-L* | -R* | -l*)
- # Some compilers place space between "-{L,R}" and the path.
+ # Some compilers place space between "-{L,R,l}" and the path.
# Remove the space.
- if test x-L = "$p" ||
- test x-R = "$p"; then
+ if test x-L = x"$p" ||
+ test x-R = x"$p" ||
+ test x-l = x"$p"; then
prev=$p
continue
fi
@@ -8207,6 +8380,14 @@ _LT_DECL([], [DLLTOOL], [1], [DLL creation program])
AC_SUBST([DLLTOOL])
])
+# _LT_DECL_FILECMD
+# ----------------
+# Check for a file(cmd) program that can be used to detect file type and magic
+m4_defun([_LT_DECL_FILECMD],
+[AC_CHECK_PROG([FILECMD], [file], [file], [:])
+_LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types])
+])# _LD_DECL_FILECMD
+
# _LT_DECL_SED
# ------------
# Check for a fully-functional sed program, that truncates
@@ -8219,73 +8400,6 @@ _LT_DECL([], [SED], [1], [A sed program that does not truncate output])
_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
[Sed that helps us avoid accidentally triggering echo(1) options like -n])
])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into #
-# GNU Autoconf as AC_PROG_SED. When it is available in #
-# a released version of Autoconf we should remove this #
-# macro and use it instead. #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for lt_ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
- lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
- fi
- done
- done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
- test ! -f "$lt_ac_sed" && continue
- cat /dev/null > conftest.in
- lt_ac_count=0
- echo $ECHO_N "0123456789$ECHO_C" >conftest.in
- # Check for GNU sed and select it if it is found.
- if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
- lt_cv_path_SED=$lt_ac_sed
- break
- fi
- while true; do
- cat conftest.in conftest.in >conftest.tmp
- mv conftest.tmp conftest.in
- cp conftest.in conftest.nl
- echo >>conftest.nl
- $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
- cmp -s conftest.out conftest.nl || break
- # 10000 chars as input seems more than enough
- test 10 -lt "$lt_ac_count" && break
- lt_ac_count=`expr $lt_ac_count + 1`
- if test "$lt_ac_count" -gt "$lt_ac_max"; then
- lt_ac_max=$lt_ac_count
- lt_cv_path_SED=$lt_ac_sed
- fi
- done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([LT_AC_PROG_SED], [])
@@ -8332,7 +8446,7 @@ AC_CACHE_VAL(lt_cv_to_host_file_cmd,
[case $host in
*-*-mingw* )
case $build in
- *-*-mingw* ) # actually msys
+ *-*-mingw* | *-*-windows* ) # actually msys
lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
;;
*-*-cygwin* )
@@ -8345,7 +8459,7 @@ AC_CACHE_VAL(lt_cv_to_host_file_cmd,
;;
*-*-cygwin* )
case $build in
- *-*-mingw* ) # actually msys
+ *-*-mingw* | *-*-windows* ) # actually msys
lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
;;
*-*-cygwin* )
@@ -8371,9 +8485,9 @@ AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
[#assume ordinary cross tools, or native build.
lt_cv_to_tool_file_cmd=func_convert_file_noop
case $host in
- *-*-mingw* )
+ *-*-mingw* | *-*-windows* )
case $build in
- *-*-mingw* ) # actually msys
+ *-*-mingw* | *-*-windows* ) # actually msys
lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
;;
esac
diff --git a/3rdparty/expat/m4/ltoptions.m4 b/3rdparty/expat/m4/ltoptions.m4
index 94b08297666..25caa890298 100644
--- a/3rdparty/expat/m4/ltoptions.m4
+++ b/3rdparty/expat/m4/ltoptions.m4
@@ -1,14 +1,14 @@
# Helper functions for option handling. -*- Autoconf -*-
#
-# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
-# Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2024 Free
+# Software Foundation, Inc.
# Written by Gary V. Vaughan, 2004
#
# This file is free software; the Free Software Foundation gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
-# serial 8 ltoptions.m4
+# serial 10 ltoptions.m4
# This is to help aclocal find these macros, as it can't see m4_define.
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -128,7 +128,7 @@ LT_OPTION_DEFINE([LT_INIT], [win32-dll],
[enable_win32_dll=yes
case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+*-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*)
AC_CHECK_TOOL(AS, as, false)
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
AC_CHECK_TOOL(OBJDUMP, objdump, false)
@@ -323,29 +323,39 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
# _LT_WITH_AIX_SONAME([DEFAULT])
# ----------------------------------
-# implement the --with-aix-soname flag, and support the `aix-soname=aix'
-# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
-# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'.
+# implement the --enable-aix-soname configure option, and support the
+# `aix-soname=aix' and `aix-soname=both' and `aix-soname=svr4' LT_INIT options.
+# DEFAULT is either `aix', `both', or `svr4'. If omitted, it defaults to `aix'.
m4_define([_LT_WITH_AIX_SONAME],
[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
shared_archive_member_spec=
case $host,$enable_shared in
power*-*-aix[[5-9]]*,yes)
AC_MSG_CHECKING([which variant of shared library versioning to provide])
- AC_ARG_WITH([aix-soname],
- [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+ AC_ARG_ENABLE([aix-soname],
+ [AS_HELP_STRING([--enable-aix-soname=aix|svr4|both],
[shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
- [case $withval in
- aix|svr4|both)
- ;;
- *)
- AC_MSG_ERROR([Unknown argument to --with-aix-soname])
- ;;
- esac
- lt_cv_with_aix_soname=$with_aix_soname],
- [AC_CACHE_VAL([lt_cv_with_aix_soname],
- [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
- with_aix_soname=$lt_cv_with_aix_soname])
+ [case $enableval in
+ aix|svr4|both)
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown argument to --enable-aix-soname])
+ ;;
+ esac
+ lt_cv_with_aix_soname=$enable_aix_soname],
+ [_AC_ENABLE_IF([with], [aix-soname],
+ [case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname],
+ [AC_CACHE_VAL([lt_cv_with_aix_soname],
+ [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)])
+ enable_aix_soname=$lt_cv_with_aix_soname])
+ with_aix_soname=$enable_aix_soname
AC_MSG_RESULT([$with_aix_soname])
if test aix != "$with_aix_soname"; then
# For the AIX way of multilib, we name the shared archive member
@@ -376,30 +386,50 @@ LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
# _LT_WITH_PIC([MODE])
# --------------------
-# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
+# implement the --enable-pic flag, and support the 'pic-only' and 'no-pic'
# LT_INIT options.
# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'.
m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
- [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+[AC_ARG_ENABLE([pic],
+ [AS_HELP_STRING([--enable-pic@<:@=PKGS@:>@],
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
[lt_p=${PACKAGE-default}
- case $withval in
- yes|no) pic_mode=$withval ;;
- *)
- pic_mode=default
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
- for lt_pkg in $withval; do
- IFS=$lt_save_ifs
- if test "X$lt_pkg" = "X$lt_p"; then
- pic_mode=yes
- fi
- done
- IFS=$lt_save_ifs
- ;;
- esac],
- [pic_mode=m4_default([$1], [default])])
+ case $enableval in
+ yes|no) pic_mode=$enableval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [dnl Continue to support --with-pic and --without-pic, for backward
+ dnl compatibility.
+ _AC_ENABLE_IF([with], [pic],
+ [lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [pic_mode=m4_default([$1], [default])])]
+ )
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
])# _LT_WITH_PIC
diff --git a/3rdparty/expat/m4/ltsugar.m4 b/3rdparty/expat/m4/ltsugar.m4
index 48bc9344a4d..902508bd93a 100644
--- a/3rdparty/expat/m4/ltsugar.m4
+++ b/3rdparty/expat/m4/ltsugar.m4
@@ -1,6 +1,6 @@
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
#
-# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software
# Foundation, Inc.
# Written by Gary V. Vaughan, 2004
#
diff --git a/3rdparty/expat/m4/ltversion.m4 b/3rdparty/expat/m4/ltversion.m4
index fa04b52a3bf..228df3f39bf 100644
--- a/3rdparty/expat/m4/ltversion.m4
+++ b/3rdparty/expat/m4/ltversion.m4
@@ -1,6 +1,7 @@
# ltversion.m4 -- version numbers -*- Autoconf -*-
#
-# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2011-2019, 2021-2024 Free Software Foundation,
+# Inc.
# Written by Scott James Remnant, 2004
#
# This file is free software; the Free Software Foundation gives
@@ -9,15 +10,15 @@
# @configure_input@
-# serial 4179 ltversion.m4
+# serial 4441 ltversion.m4
# This file is part of GNU Libtool
-m4_define([LT_PACKAGE_VERSION], [2.4.6])
-m4_define([LT_PACKAGE_REVISION], [2.4.6])
+m4_define([LT_PACKAGE_VERSION], [2.5.4])
+m4_define([LT_PACKAGE_REVISION], [2.5.4])
AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.6'
-macro_revision='2.4.6'
+[macro_version='2.5.4'
+macro_revision='2.5.4'
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
_LT_DECL(, macro_revision, 0)
])
diff --git a/3rdparty/expat/m4/lt~obsolete.m4 b/3rdparty/expat/m4/lt~obsolete.m4
index c6b26f88f6c..0f7a8759da8 100644
--- a/3rdparty/expat/m4/lt~obsolete.m4
+++ b/3rdparty/expat/m4/lt~obsolete.m4
@@ -1,7 +1,7 @@
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
#
-# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
-# Foundation, Inc.
+# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free
+# Software Foundation, Inc.
# Written by Scott James Remnant, 2004.
#
# This file is free software; the Free Software Foundation gives
diff --git a/3rdparty/expat/run.sh.in b/3rdparty/expat/run.sh.in
index ff3fb36447c..72f86b6dcc4 100644
--- a/3rdparty/expat/run.sh.in
+++ b/3rdparty/expat/run.sh.in
@@ -1,10 +1,45 @@
#! /usr/bin/env bash
-# Copyright (C) 2017 Expat development team
-# Licensed under the MIT license
+# __ __ _
+# ___\ \/ /_ __ __ _| |_
+# / _ \\ /| '_ \ / _` | __|
+# | __// \| |_) | (_| | |_
+# \___/_/\_\ .__/ \__,_|\__|
+# |_| XML parser
+#
+# Copyright (c) 2017-2022 Sebastian Pipping <sebastian@pipping.org>
+# Licensed under the MIT license:
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
case "@host@" in
*-mingw*)
- exec wine "$@"
+ case "$(uname -o)" in
+ Cygwin|Msys)
+ # Windows binary on Windows host
+ exec "$@"
+ ;;
+ *)
+ # Windows binary on non-Windows host
+ exec wine "$@"
+ ;;
+ esac
;;
*)
exec "$@"
diff --git a/3rdparty/expat/test-driver-wrapper.sh b/3rdparty/expat/test-driver-wrapper.sh
index 36a185266c6..305c6f5f606 100755
--- a/3rdparty/expat/test-driver-wrapper.sh
+++ b/3rdparty/expat/test-driver-wrapper.sh
@@ -6,7 +6,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2019 Jeffrey Walton <noloader@gmail.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/tests/Makefile.am b/3rdparty/expat/tests/Makefile.am
index e19fc1ae8ad..d25376be541 100644
--- a/3rdparty/expat/tests/Makefile.am
+++ b/3rdparty/expat/tests/Makefile.am
@@ -6,7 +6,10 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
+# Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -30,37 +33,67 @@
SUBDIRS = . benchmark
-AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
+AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib -DXML_TESTING
-noinst_LIBRARIES = libruntests.a
-
-check_PROGRAMS = runtests runtestspp
-TESTS = runtests runtestspp
+check_PROGRAMS = runtests runtests_cxx
+TESTS = runtests runtests_cxx
# To support MinGW and Non-MinGW at the same time:
LOG_DRIVER = $(srcdir)/../test-driver-wrapper.sh
-libruntests_a_SOURCES = \
+runtests_SOURCES = \
+ acc_tests.c \
+ alloc_tests.c \
+ basic_tests.c \
chardata.c \
- structdata.c \
+ common.c \
+ dummy.c \
+ handlers.c \
memcheck.c \
- minicheck.c
+ minicheck.c \
+ misc_tests.c \
+ ns_tests.c \
+ nsalloc_tests.c \
+ runtests.c \
+ structdata.c
-runtests_SOURCES = \
- runtests.c
+runtests_cxx_SOURCES = \
+ acc_tests_cxx.cpp \
+ alloc_tests_cxx.cpp \
+ basic_tests_cxx.cpp \
+ chardata_cxx.cpp \
+ common_cxx.cpp \
+ dummy_cxx.cpp \
+ handlers_cxx.cpp \
+ memcheck_cxx.cpp \
+ minicheck_cxx.cpp \
+ misc_tests_cxx.cpp \
+ nsalloc_tests_cxx.cpp \
+ ns_tests_cxx.cpp \
+ runtests_cxx.cpp \
+ structdata_cxx.cpp
-runtestspp_SOURCES = \
- runtestspp.cpp
+runtests_LDADD = ../lib/libtestpat.la
+runtests_cxx_LDADD = ../lib/libtestpat.la
-runtests_LDADD = libruntests.a ../lib/libexpat.la
-runtestspp_LDADD = libruntests.a ../lib/libexpat.la
+runtests_LDFLAGS = @AM_LDFLAGS@ @LIBM@
+runtests_cxx_LDFLAGS = @AM_LDFLAGS@ @LIBM@
EXTRA_DIST = \
+ acc_tests.h \
+ alloc_tests.h \
+ basic_tests.h \
chardata.h \
+ common.h \
+ dummy.h \
+ handlers.h \
+ misc_tests.h \
+ ns_tests.h \
+ nsalloc_tests.h \
structdata.h \
minicheck.h \
memcheck.h \
- README.txt \
+ README.md \
udiffer.py \
xmltest.log.expected \
xmltest.sh
diff --git a/3rdparty/expat/tests/Makefile.in b/3rdparty/expat/tests/Makefile.in
index 8b9b38eadcd..eb00a068cbd 100644
--- a/3rdparty/expat/tests/Makefile.in
+++ b/3rdparty/expat/tests/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,10 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
+# Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -43,7 +46,6 @@
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
# USE OR OTHER DEALINGS IN THE SOFTWARE.
-
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -118,8 +120,8 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-check_PROGRAMS = runtests$(EXEEXT) runtestspp$(EXEEXT)
-TESTS = runtests$(EXEEXT) runtestspp$(EXEEXT)
+check_PROGRAMS = runtests$(EXEEXT) runtests_cxx$(EXEEXT)
+TESTS = runtests$(EXEEXT) runtests_cxx$(EXEEXT)
subdir = tests
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
@@ -133,6 +135,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
@@ -141,27 +145,34 @@ mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/expat_config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-ARFLAGS = cru
-AM_V_AR = $(am__v_AR_@AM_V@)
-am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
-am__v_AR_0 = @echo " AR " $@;
-am__v_AR_1 =
-libruntests_a_AR = $(AR) $(ARFLAGS)
-libruntests_a_LIBADD =
-am_libruntests_a_OBJECTS = chardata.$(OBJEXT) structdata.$(OBJEXT) \
- memcheck.$(OBJEXT) minicheck.$(OBJEXT)
-libruntests_a_OBJECTS = $(am_libruntests_a_OBJECTS)
-am_runtests_OBJECTS = runtests.$(OBJEXT)
+am_runtests_OBJECTS = acc_tests.$(OBJEXT) alloc_tests.$(OBJEXT) \
+ basic_tests.$(OBJEXT) chardata.$(OBJEXT) common.$(OBJEXT) \
+ dummy.$(OBJEXT) handlers.$(OBJEXT) memcheck.$(OBJEXT) \
+ minicheck.$(OBJEXT) misc_tests.$(OBJEXT) ns_tests.$(OBJEXT) \
+ nsalloc_tests.$(OBJEXT) runtests.$(OBJEXT) \
+ structdata.$(OBJEXT)
runtests_OBJECTS = $(am_runtests_OBJECTS)
-runtests_DEPENDENCIES = libruntests.a ../lib/libexpat.la
+runtests_DEPENDENCIES = ../lib/libtestpat.la
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 =
-am_runtestspp_OBJECTS = runtestspp.$(OBJEXT)
-runtestspp_OBJECTS = $(am_runtestspp_OBJECTS)
-runtestspp_DEPENDENCIES = libruntests.a ../lib/libexpat.la
+runtests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(runtests_LDFLAGS) $(LDFLAGS) -o $@
+am_runtests_cxx_OBJECTS = acc_tests_cxx.$(OBJEXT) \
+ alloc_tests_cxx.$(OBJEXT) basic_tests_cxx.$(OBJEXT) \
+ chardata_cxx.$(OBJEXT) common_cxx.$(OBJEXT) \
+ dummy_cxx.$(OBJEXT) handlers_cxx.$(OBJEXT) \
+ memcheck_cxx.$(OBJEXT) minicheck_cxx.$(OBJEXT) \
+ misc_tests_cxx.$(OBJEXT) nsalloc_tests_cxx.$(OBJEXT) \
+ ns_tests_cxx.$(OBJEXT) runtests_cxx.$(OBJEXT) \
+ structdata_cxx.$(OBJEXT)
+runtests_cxx_OBJECTS = $(am_runtests_cxx_OBJECTS)
+runtests_cxx_DEPENDENCIES = ../lib/libtestpat.la
+runtests_cxx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(runtests_cxx_LDFLAGS) $(LDFLAGS) -o $@
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
@@ -177,9 +188,21 @@ am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/conftools/depcomp
am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/chardata.Po ./$(DEPDIR)/memcheck.Po \
- ./$(DEPDIR)/minicheck.Po ./$(DEPDIR)/runtests.Po \
- ./$(DEPDIR)/runtestspp.Po ./$(DEPDIR)/structdata.Po
+am__depfiles_remade = ./$(DEPDIR)/acc_tests.Po \
+ ./$(DEPDIR)/acc_tests_cxx.Po ./$(DEPDIR)/alloc_tests.Po \
+ ./$(DEPDIR)/alloc_tests_cxx.Po ./$(DEPDIR)/basic_tests.Po \
+ ./$(DEPDIR)/basic_tests_cxx.Po ./$(DEPDIR)/chardata.Po \
+ ./$(DEPDIR)/chardata_cxx.Po ./$(DEPDIR)/common.Po \
+ ./$(DEPDIR)/common_cxx.Po ./$(DEPDIR)/dummy.Po \
+ ./$(DEPDIR)/dummy_cxx.Po ./$(DEPDIR)/handlers.Po \
+ ./$(DEPDIR)/handlers_cxx.Po ./$(DEPDIR)/memcheck.Po \
+ ./$(DEPDIR)/memcheck_cxx.Po ./$(DEPDIR)/minicheck.Po \
+ ./$(DEPDIR)/minicheck_cxx.Po ./$(DEPDIR)/misc_tests.Po \
+ ./$(DEPDIR)/misc_tests_cxx.Po ./$(DEPDIR)/ns_tests.Po \
+ ./$(DEPDIR)/ns_tests_cxx.Po ./$(DEPDIR)/nsalloc_tests.Po \
+ ./$(DEPDIR)/nsalloc_tests_cxx.Po ./$(DEPDIR)/runtests.Po \
+ ./$(DEPDIR)/runtests_cxx.Po ./$(DEPDIR)/structdata.Po \
+ ./$(DEPDIR)/structdata_cxx.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -217,10 +240,8 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@;
am__v_CXXLD_1 =
-SOURCES = $(libruntests_a_SOURCES) $(runtests_SOURCES) \
- $(runtestspp_SOURCES)
-DIST_SOURCES = $(libruntests_a_SOURCES) $(runtests_SOURCES) \
- $(runtestspp_SOURCES)
+SOURCES = $(runtests_SOURCES) $(runtests_cxx_SOURCES)
+DIST_SOURCES = $(runtests_SOURCES) $(runtests_cxx_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
ctags-recursive dvi-recursive html-recursive info-recursive \
install-data-recursive install-dvi-recursive \
@@ -259,8 +280,6 @@ am__define_uniq_tagged_files = \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
am__tty_colors_dummy = \
mgn= red= grn= lgn= blu= brg= std=; \
am__color_tests=no
@@ -443,6 +462,7 @@ am__set_TESTS_bases = \
bases='$(TEST_LOGS)'; \
bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
RECHECK_LOGS = $(TEST_LOGS)
TEST_SUITE_LOG = test-suite.log
TEST_EXTENSIONS = @EXEEXT@ .test
@@ -466,7 +486,7 @@ TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
$(top_srcdir)/conftools/depcomp \
- $(top_srcdir)/conftools/test-driver
+ $(top_srcdir)/conftools/test-driver README.md
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
@@ -496,7 +516,7 @@ am__relativize = \
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_CFLAGS = @AM_CFLAGS@
-AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
+AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib -DXML_TESTING
AM_CXXFLAGS = @AM_CXXFLAGS@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AM_LDFLAGS = @AM_LDFLAGS@
@@ -509,8 +529,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -526,10 +548,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -539,6 +571,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -547,6 +581,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -568,9 +603,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -626,30 +664,60 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
SUBDIRS = . benchmark
-noinst_LIBRARIES = libruntests.a
# To support MinGW and Non-MinGW at the same time:
LOG_DRIVER = $(srcdir)/../test-driver-wrapper.sh
-libruntests_a_SOURCES = \
+runtests_SOURCES = \
+ acc_tests.c \
+ alloc_tests.c \
+ basic_tests.c \
chardata.c \
- structdata.c \
+ common.c \
+ dummy.c \
+ handlers.c \
memcheck.c \
- minicheck.c
-
-runtests_SOURCES = \
- runtests.c
-
-runtestspp_SOURCES = \
- runtestspp.cpp
-
-runtests_LDADD = libruntests.a ../lib/libexpat.la
-runtestspp_LDADD = libruntests.a ../lib/libexpat.la
+ minicheck.c \
+ misc_tests.c \
+ ns_tests.c \
+ nsalloc_tests.c \
+ runtests.c \
+ structdata.c
+
+runtests_cxx_SOURCES = \
+ acc_tests_cxx.cpp \
+ alloc_tests_cxx.cpp \
+ basic_tests_cxx.cpp \
+ chardata_cxx.cpp \
+ common_cxx.cpp \
+ dummy_cxx.cpp \
+ handlers_cxx.cpp \
+ memcheck_cxx.cpp \
+ minicheck_cxx.cpp \
+ misc_tests_cxx.cpp \
+ nsalloc_tests_cxx.cpp \
+ ns_tests_cxx.cpp \
+ runtests_cxx.cpp \
+ structdata_cxx.cpp
+
+runtests_LDADD = ../lib/libtestpat.la
+runtests_cxx_LDADD = ../lib/libtestpat.la
+runtests_LDFLAGS = @AM_LDFLAGS@ @LIBM@
+runtests_cxx_LDFLAGS = @AM_LDFLAGS@ @LIBM@
EXTRA_DIST = \
+ acc_tests.h \
+ alloc_tests.h \
+ basic_tests.h \
chardata.h \
+ common.h \
+ dummy.h \
+ handlers.h \
+ misc_tests.h \
+ ns_tests.h \
+ nsalloc_tests.h \
structdata.h \
minicheck.h \
memcheck.h \
- README.txt \
+ README.md \
udiffer.py \
xmltest.log.expected \
xmltest.sh
@@ -658,7 +726,7 @@ all: all-recursive
.SUFFIXES:
.SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -682,9 +750,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
@@ -697,21 +765,13 @@ clean-checkPROGRAMS:
echo " rm -f" $$list; \
rm -f $$list
-clean-noinstLIBRARIES:
- -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-
-libruntests.a: $(libruntests_a_OBJECTS) $(libruntests_a_DEPENDENCIES) $(EXTRA_libruntests_a_DEPENDENCIES)
- $(AM_V_at)-rm -f libruntests.a
- $(AM_V_AR)$(libruntests_a_AR) libruntests.a $(libruntests_a_OBJECTS) $(libruntests_a_LIBADD)
- $(AM_V_at)$(RANLIB) libruntests.a
-
runtests$(EXEEXT): $(runtests_OBJECTS) $(runtests_DEPENDENCIES) $(EXTRA_runtests_DEPENDENCIES)
@rm -f runtests$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(runtests_OBJECTS) $(runtests_LDADD) $(LIBS)
+ $(AM_V_CCLD)$(runtests_LINK) $(runtests_OBJECTS) $(runtests_LDADD) $(LIBS)
-runtestspp$(EXEEXT): $(runtestspp_OBJECTS) $(runtestspp_DEPENDENCIES) $(EXTRA_runtestspp_DEPENDENCIES)
- @rm -f runtestspp$(EXEEXT)
- $(AM_V_CXXLD)$(CXXLINK) $(runtestspp_OBJECTS) $(runtestspp_LDADD) $(LIBS)
+runtests_cxx$(EXEEXT): $(runtests_cxx_OBJECTS) $(runtests_cxx_DEPENDENCIES) $(EXTRA_runtests_cxx_DEPENDENCIES)
+ @rm -f runtests_cxx$(EXEEXT)
+ $(AM_V_CXXLD)$(runtests_cxx_LINK) $(runtests_cxx_OBJECTS) $(runtests_cxx_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -719,12 +779,34 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acc_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acc_tests_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc_tests_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic_tests_cxx.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chardata.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chardata_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handlers.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handlers_cxx.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memcheck.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memcheck_cxx.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minicheck.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minicheck_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_tests_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_tests_cxx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nsalloc_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nsalloc_tests_cxx.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtests.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtestspp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtests_cxx.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/structdata.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/structdata_cxx.Po@am__quote@ # am--include-marker
$(am__depfiles_remade):
@$(MKDIR_P) $(@D)
@@ -986,7 +1068,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
fi; \
echo "$${col}$$br$${std}"; \
- echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
echo "$${col}$$br$${std}"; \
create_testsuite_report --maybe-color; \
echo "$$col$$br$$std"; \
@@ -1027,9 +1109,9 @@ runtests.log: runtests$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
-runtestspp.log: runtestspp$(EXEEXT)
- @p='runtestspp$(EXEEXT)'; \
- b='runtestspp'; \
+runtests_cxx.log: runtests_cxx$(EXEEXT)
+ @p='runtests_cxx$(EXEEXT)'; \
+ b='runtests_cxx'; \
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
@@ -1048,7 +1130,6 @@ runtestspp.log: runtestspp$(EXEEXT)
@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
-
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
@@ -1111,7 +1192,7 @@ check-am: all-am
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
$(MAKE) $(AM_MAKEFLAGS) check-TESTS
check: check-recursive
-all-am: Makefile $(LIBRARIES)
+all-am: Makefile
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
@@ -1150,15 +1231,37 @@ maintainer-clean-generic:
clean: clean-recursive
clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
- clean-noinstLIBRARIES mostlyclean-am
+ mostlyclean-am
distclean: distclean-recursive
- -rm -f ./$(DEPDIR)/chardata.Po
+ -rm -f ./$(DEPDIR)/acc_tests.Po
+ -rm -f ./$(DEPDIR)/acc_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/alloc_tests.Po
+ -rm -f ./$(DEPDIR)/alloc_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/basic_tests.Po
+ -rm -f ./$(DEPDIR)/basic_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/chardata.Po
+ -rm -f ./$(DEPDIR)/chardata_cxx.Po
+ -rm -f ./$(DEPDIR)/common.Po
+ -rm -f ./$(DEPDIR)/common_cxx.Po
+ -rm -f ./$(DEPDIR)/dummy.Po
+ -rm -f ./$(DEPDIR)/dummy_cxx.Po
+ -rm -f ./$(DEPDIR)/handlers.Po
+ -rm -f ./$(DEPDIR)/handlers_cxx.Po
-rm -f ./$(DEPDIR)/memcheck.Po
+ -rm -f ./$(DEPDIR)/memcheck_cxx.Po
-rm -f ./$(DEPDIR)/minicheck.Po
+ -rm -f ./$(DEPDIR)/minicheck_cxx.Po
+ -rm -f ./$(DEPDIR)/misc_tests.Po
+ -rm -f ./$(DEPDIR)/misc_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/ns_tests.Po
+ -rm -f ./$(DEPDIR)/ns_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/nsalloc_tests.Po
+ -rm -f ./$(DEPDIR)/nsalloc_tests_cxx.Po
-rm -f ./$(DEPDIR)/runtests.Po
- -rm -f ./$(DEPDIR)/runtestspp.Po
+ -rm -f ./$(DEPDIR)/runtests_cxx.Po
-rm -f ./$(DEPDIR)/structdata.Po
+ -rm -f ./$(DEPDIR)/structdata_cxx.Po
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
@@ -1204,12 +1307,34 @@ install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
- -rm -f ./$(DEPDIR)/chardata.Po
+ -rm -f ./$(DEPDIR)/acc_tests.Po
+ -rm -f ./$(DEPDIR)/acc_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/alloc_tests.Po
+ -rm -f ./$(DEPDIR)/alloc_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/basic_tests.Po
+ -rm -f ./$(DEPDIR)/basic_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/chardata.Po
+ -rm -f ./$(DEPDIR)/chardata_cxx.Po
+ -rm -f ./$(DEPDIR)/common.Po
+ -rm -f ./$(DEPDIR)/common_cxx.Po
+ -rm -f ./$(DEPDIR)/dummy.Po
+ -rm -f ./$(DEPDIR)/dummy_cxx.Po
+ -rm -f ./$(DEPDIR)/handlers.Po
+ -rm -f ./$(DEPDIR)/handlers_cxx.Po
-rm -f ./$(DEPDIR)/memcheck.Po
+ -rm -f ./$(DEPDIR)/memcheck_cxx.Po
-rm -f ./$(DEPDIR)/minicheck.Po
+ -rm -f ./$(DEPDIR)/minicheck_cxx.Po
+ -rm -f ./$(DEPDIR)/misc_tests.Po
+ -rm -f ./$(DEPDIR)/misc_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/ns_tests.Po
+ -rm -f ./$(DEPDIR)/ns_tests_cxx.Po
+ -rm -f ./$(DEPDIR)/nsalloc_tests.Po
+ -rm -f ./$(DEPDIR)/nsalloc_tests_cxx.Po
-rm -f ./$(DEPDIR)/runtests.Po
- -rm -f ./$(DEPDIR)/runtestspp.Po
+ -rm -f ./$(DEPDIR)/runtests_cxx.Po
-rm -f ./$(DEPDIR)/structdata.Po
+ -rm -f ./$(DEPDIR)/structdata_cxx.Po
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
@@ -1232,19 +1357,18 @@ uninstall-am:
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
am--depfiles check check-TESTS check-am clean \
- clean-checkPROGRAMS clean-generic clean-libtool \
- clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- installdirs-am maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
- uninstall uninstall-am
+ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/3rdparty/expat/tests/README.md b/3rdparty/expat/tests/README.md
new file mode 100644
index 00000000000..010ca95e9e2
--- /dev/null
+++ b/3rdparty/expat/tests/README.md
@@ -0,0 +1,11 @@
+This directory contains the test suite for Expat. The tests provide
+general unit testing and regression coverage. The tests are not
+expected to be useful examples of Expat usage; see the
+[examples](../examples) directory for that.
+
+The Expat tests use a partial internal implementation of the
+[Check](https://libcheck.github.io/check/) unit testing framework for
+C.
+
+Expat must be built and, on some platforms, installed, before the
+tests can be run.
diff --git a/3rdparty/expat/tests/README.txt b/3rdparty/expat/tests/README.txt
deleted file mode 100644
index 30e1d4dabe8..00000000000
--- a/3rdparty/expat/tests/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This directory contains the (fledgling) test suite for Expat. The
-tests provide general unit testing and regression coverage. The tests
-are not expected to be useful examples of Expat usage; see the
-examples/ directory for that.
-
-The Expat tests use a partial internal implementation of the "Check"
-unit testing framework for C. More information on Check can be found at:
-
- http://check.sourceforge.net/
-
-Expat must be built and, depending on platform, must be installed, before "make check" can be executed.
-
-This test suite can all change in a later version.
diff --git a/3rdparty/expat/tests/acc_tests.c b/3rdparty/expat/tests/acc_tests.c
new file mode 100644
index 00000000000..b58647a2ab0
--- /dev/null
+++ b/3rdparty/expat/tests/acc_tests.c
@@ -0,0 +1,458 @@
+/* Tests in the "accounting" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <math.h> /* NAN, INFINITY */
+#include <stdio.h>
+#include <string.h>
+
+#include "expat_config.h"
+
+#include "expat.h"
+#include "internal.h"
+#include "common.h"
+#include "minicheck.h"
+#include "chardata.h"
+#include "handlers.h"
+#include "acc_tests.h"
+
+#if XML_GE == 1
+START_TEST(test_accounting_precision) {
+ struct AccountingTestCase cases[] = {
+ {"<e/>", NULL, NULL, 0},
+ {"<e></e>", NULL, NULL, 0},
+
+ /* Attributes */
+ {"<e k1=\"v2\" k2=\"v2\"/>", NULL, NULL, 0},
+ {"<e k1=\"v2\" k2=\"v2\"></e>", NULL, NULL, 0},
+ {"<p:e xmlns:p=\"https://domain.invalid/\" />", NULL, NULL, 0},
+ {"<e k=\"&amp;&apos;&gt;&lt;&quot;\" />", NULL, NULL,
+ sizeof(XML_Char) * 5 /* number of predefined entities */},
+ {"<e1 xmlns='https://example.org/'>\n"
+ " <e2 xmlns=''/>\n"
+ "</e1>",
+ NULL, NULL, 0},
+
+ /* Text */
+ {"<e>text</e>", NULL, NULL, 0},
+ {"<e1><e2>text1<e3/>text2</e2></e1>", NULL, NULL, 0},
+ {"<e>&amp;&apos;&gt;&lt;&quot;</e>", NULL, NULL,
+ sizeof(XML_Char) * 5 /* number of predefined entities */},
+ {"<e>&#65;&#41;</e>", NULL, NULL, 0},
+
+ /* Prolog */
+ {"<?xml version=\"1.0\"?><root/>", NULL, NULL, 0},
+
+ /* Whitespace */
+ {" <e1> <e2> </e2> </e1> ", NULL, NULL, 0},
+ {"<e1 ><e2 /></e1 >", NULL, NULL, 0},
+ {"<e1><e2 k = \"v\"/><e3 k = 'v'/></e1>", NULL, NULL, 0},
+
+ /* Comments */
+ {"<!-- Comment --><e><!-- Comment --></e>", NULL, NULL, 0},
+
+ /* Processing instructions */
+ {"<?xml-stylesheet type=\"text/xsl\" href=\"https://domain.invalid/\" media=\"all\"?><e/>",
+ NULL, NULL, 0},
+ {"<?pi0?><?pi1 ?><?pi2 ?><r/><?pi4?>", NULL, NULL, 0},
+# ifdef XML_DTD
+ {"<?pi0?><?pi1 ?><?pi2 ?><!DOCTYPE r SYSTEM 'first.ent'><r/>",
+ "<?pi3?><!ENTITY % e1 SYSTEM 'second.ent'><?pi4?>%e1;<?pi5?>", "<?pi6?>",
+ 0},
+# endif /* XML_DTD */
+
+ /* CDATA */
+ {"<e><![CDATA[one two three]]></e>", NULL, NULL, 0},
+ /* The following is the essence of this OSS-Fuzz finding:
+ https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34302
+ https://oss-fuzz.com/testcase-detail/4860575394955264
+ */
+ {"<!DOCTYPE r [\n"
+ "<!ENTITY e \"111<![CDATA[2 <= 2]]>333\">\n"
+ "]>\n"
+ "<r>&e;</r>\n",
+ NULL, NULL, sizeof(XML_Char) * strlen("111<![CDATA[2 <= 2]]>333")},
+
+# ifdef XML_DTD
+ /* Conditional sections */
+ {"<!DOCTYPE r [\n"
+ "<!ENTITY % draft 'INCLUDE'>\n"
+ "<!ENTITY % final 'IGNORE'>\n"
+ "<!ENTITY % import SYSTEM \"first.ent\">\n"
+ "%import;\n"
+ "]>\n"
+ "<r/>\n",
+ "<![%draft;[<!--1-->]]>\n"
+ "<![%final;[<!--22-->]]>",
+ NULL, sizeof(XML_Char) * (strlen("INCLUDE") + strlen("IGNORE"))},
+# endif /* XML_DTD */
+
+ /* General entities */
+ {"<!DOCTYPE root [\n"
+ "<!ENTITY nine \"123456789\">\n"
+ "]>\n"
+ "<root>&nine;</root>",
+ NULL, NULL, sizeof(XML_Char) * strlen("123456789")},
+ {"<!DOCTYPE root [\n"
+ "<!ENTITY nine \"123456789\">\n"
+ "]>\n"
+ "<root k1=\"&nine;\"/>",
+ NULL, NULL, sizeof(XML_Char) * strlen("123456789")},
+ {"<!DOCTYPE root [\n"
+ "<!ENTITY nine \"123456789\">\n"
+ "<!ENTITY nine2 \"&nine;&nine;\">\n"
+ "]>\n"
+ "<root>&nine2;&nine2;&nine2;</root>",
+ NULL, NULL,
+ sizeof(XML_Char) * 3 /* calls to &nine2; */ * 2 /* calls to &nine; */
+ * (strlen("&nine;") + strlen("123456789"))},
+ {"<!DOCTYPE r [\n"
+ " <!ENTITY five SYSTEM 'first.ent'>\n"
+ "]>\n"
+ "<r>&five;</r>",
+ "12345", NULL, 0},
+ {"<!DOCTYPE r [\n"
+ " <!ENTITY five SYSTEM 'first.ent'>\n"
+ "]>\n"
+ "<r>&five;</r>",
+ "\xEF\xBB\xBF" /* UTF-8 BOM */, NULL, 0},
+
+# ifdef XML_DTD
+ /* Parameter entities */
+ {"<!DOCTYPE r [\n"
+ "<!ENTITY % comment \"<!---->\">\n"
+ "%comment;\n"
+ "]>\n"
+ "<r/>",
+ NULL, NULL, sizeof(XML_Char) * strlen("<!---->")},
+ {"<!DOCTYPE r [\n"
+ "<!ENTITY % ninedef \"&#60;!ENTITY nine &#34;123456789&#34;&#62;\">\n"
+ "%ninedef;\n"
+ "]>\n"
+ "<r>&nine;</r>",
+ NULL, NULL,
+ sizeof(XML_Char)
+ * (strlen("<!ENTITY nine \"123456789\">") + strlen("123456789"))},
+ {"<!DOCTYPE r [\n"
+ "<!ENTITY % comment \"<!--1-->\">\n"
+ "<!ENTITY % comment2 \"&#37;comment;<!--22-->&#37;comment;\">\n"
+ "%comment2;\n"
+ "]>\n"
+ "<r/>\n",
+ NULL, NULL,
+ sizeof(XML_Char)
+ * (strlen("%comment;<!--22-->%comment;") + 2 * strlen("<!--1-->"))},
+ {"<!DOCTYPE r [\n"
+ " <!ENTITY % five \"12345\">\n"
+ " <!ENTITY % five2def \"&#60;!ENTITY five2 &#34;[&#37;five;][&#37;five;]]]]&#34;&#62;\">\n"
+ " %five2def;\n"
+ "]>\n"
+ "<r>&five2;</r>",
+ NULL, NULL, /* from "%five2def;": */
+ sizeof(XML_Char)
+ * (strlen("<!ENTITY five2 \"[%five;][%five;]]]]\">")
+ + 2 /* calls to "%five;" */ * strlen("12345")
+ + /* from "&five2;": */ strlen("[12345][12345]]]]"))},
+ {"<!DOCTYPE r SYSTEM \"first.ent\">\n"
+ "<r/>",
+ "<!ENTITY % comment '<!--1-->'>\n"
+ "<!ENTITY % comment2 '<!--22-->%comment;<!--22-->%comment;<!--22-->'>\n"
+ "%comment2;",
+ NULL,
+ sizeof(XML_Char)
+ * (strlen("<!--22-->%comment;<!--22-->%comment;<!--22-->")
+ + 2 /* calls to "%comment;" */ * strlen("<!---->"))},
+ {"<!DOCTYPE r SYSTEM 'first.ent'>\n"
+ "<r/>",
+ "<!ENTITY % e1 PUBLIC 'foo' 'second.ent'>\n"
+ "<!ENTITY % e2 '<!--22-->%e1;<!--22-->'>\n"
+ "%e2;\n",
+ "<!--1-->", sizeof(XML_Char) * strlen("<!--22--><!--1--><!--22-->")},
+ {
+ "<!DOCTYPE r SYSTEM 'first.ent'>\n"
+ "<r/>",
+ "<!ENTITY % e1 SYSTEM 'second.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>",
+ "<?xml version='1.0' encoding='utf-8'?>\n"
+ "hello\n"
+ "xml" /* without trailing newline! */,
+ 0,
+ },
+ {
+ "<!DOCTYPE r SYSTEM 'first.ent'>\n"
+ "<r/>",
+ "<!ENTITY % e1 SYSTEM 'second.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>",
+ "<?xml version='1.0' encoding='utf-8'?>\n"
+ "hello\n"
+ "xml\n" /* with trailing newline! */,
+ 0,
+ },
+ {"<!DOCTYPE doc SYSTEM 'first.ent'>\n"
+ "<doc></doc>\n",
+ "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM 'second.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>\n"
+ "%e1;\n",
+ "\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>" /* UTF-8 BOM */,
+ strlen("\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>")},
+# endif /* XML_DTD */
+ };
+
+ const size_t countCases = sizeof(cases) / sizeof(cases[0]);
+ size_t u = 0;
+ for (; u < countCases; u++) {
+ const unsigned long long expectedCountBytesDirect
+ = strlen(cases[u].primaryText);
+ const unsigned long long expectedCountBytesIndirect
+ = (cases[u].firstExternalText ? strlen(cases[u].firstExternalText) : 0)
+ + (cases[u].secondExternalText ? strlen(cases[u].secondExternalText)
+ : 0)
+ + cases[u].expectedCountBytesIndirectExtra;
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ if (cases[u].firstExternalText) {
+ XML_SetExternalEntityRefHandler(parser,
+ accounting_external_entity_ref_handler);
+ XML_SetUserData(parser, (void *)&cases[u]);
+ }
+
+ enum XML_Status status
+ = _XML_Parse_SINGLE_BYTES(parser, cases[u].primaryText,
+ (int)strlen(cases[u].primaryText), XML_TRUE);
+ if (status != XML_STATUS_OK) {
+ _xml_failure(parser, __FILE__, __LINE__);
+ }
+
+ const unsigned long long actualCountBytesDirect
+ = testingAccountingGetCountBytesDirect(parser);
+ const unsigned long long actualCountBytesIndirect
+ = testingAccountingGetCountBytesIndirect(parser);
+
+ XML_ParserFree(parser);
+
+ if (actualCountBytesDirect != expectedCountBytesDirect) {
+ fprintf(
+ stderr,
+ "Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ": Expected " EXPAT_FMT_ULL(
+ "") " count direct bytes, got " EXPAT_FMT_ULL("") " instead.\n",
+ u + 1, countCases, expectedCountBytesDirect, actualCountBytesDirect);
+ fail("Count of direct bytes is off");
+ }
+
+ if (actualCountBytesIndirect != expectedCountBytesIndirect) {
+ fprintf(
+ stderr,
+ "Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ": Expected " EXPAT_FMT_ULL(
+ "") " count indirect bytes, got " EXPAT_FMT_ULL("") " instead.\n",
+ u + 1, countCases, expectedCountBytesIndirect,
+ actualCountBytesIndirect);
+ fail("Count of indirect bytes is off");
+ }
+ }
+}
+END_TEST
+
+START_TEST(test_billion_laughs_attack_protection_api) {
+ XML_Parser parserWithoutParent = XML_ParserCreate(NULL);
+ XML_Parser parserWithParent = XML_ExternalEntityParserCreate(
+ parserWithoutParent, XCS("entity123"), NULL);
+ if (parserWithoutParent == NULL)
+ fail("parserWithoutParent is NULL");
+ if (parserWithParent == NULL)
+ fail("parserWithParent is NULL");
+
+ // XML_SetBillionLaughsAttackProtectionMaximumAmplification, error cases
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(NULL, 123.0f)
+ == XML_TRUE)
+ fail("Call with NULL parser is NOT supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(parserWithParent,
+ 123.0f)
+ == XML_TRUE)
+ fail("Call with non-root parser is NOT supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parserWithoutParent, NAN)
+ == XML_TRUE)
+ fail("Call with NaN limit is NOT supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parserWithoutParent, -1.0f)
+ == XML_TRUE)
+ fail("Call with negative limit is NOT supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parserWithoutParent, 0.9f)
+ == XML_TRUE)
+ fail("Call with positive limit <1.0 is NOT supposed to succeed");
+
+ // XML_SetBillionLaughsAttackProtectionMaximumAmplification, success cases
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parserWithoutParent, 1.0f)
+ == XML_FALSE)
+ fail("Call with positive limit >=1.0 is supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parserWithoutParent, 123456.789f)
+ == XML_FALSE)
+ fail("Call with positive limit >=1.0 is supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parserWithoutParent, INFINITY)
+ == XML_FALSE)
+ fail("Call with positive limit >=1.0 is supposed to succeed");
+
+ // XML_SetBillionLaughsAttackProtectionActivationThreshold, error cases
+ if (XML_SetBillionLaughsAttackProtectionActivationThreshold(NULL, 123)
+ == XML_TRUE)
+ fail("Call with NULL parser is NOT supposed to succeed");
+ if (XML_SetBillionLaughsAttackProtectionActivationThreshold(parserWithParent,
+ 123)
+ == XML_TRUE)
+ fail("Call with non-root parser is NOT supposed to succeed");
+
+ // XML_SetBillionLaughsAttackProtectionActivationThreshold, success cases
+ if (XML_SetBillionLaughsAttackProtectionActivationThreshold(
+ parserWithoutParent, 123)
+ == XML_FALSE)
+ fail("Call with non-NULL parentless parser is supposed to succeed");
+
+ XML_ParserFree(parserWithParent);
+ XML_ParserFree(parserWithoutParent);
+}
+END_TEST
+
+START_TEST(test_helper_unsigned_char_to_printable) {
+ // Smoke test
+ unsigned char uc = 0;
+ for (;; uc++) {
+ set_subtest("char %u", (unsigned)uc);
+ const char *const printable = unsignedCharToPrintable(uc);
+ if (printable == NULL)
+ fail("unsignedCharToPrintable returned NULL");
+ else if (strlen(printable) < (size_t)1)
+ fail("unsignedCharToPrintable returned empty string");
+ if (uc == (unsigned char)-1) {
+ break;
+ }
+ }
+
+ // Two concrete samples
+ set_subtest("char 'A'");
+ if (strcmp(unsignedCharToPrintable('A'), "A") != 0)
+ fail("unsignedCharToPrintable result mistaken");
+ set_subtest("char '\\'");
+ if (strcmp(unsignedCharToPrintable('\\'), "\\\\") != 0)
+ fail("unsignedCharToPrintable result mistaken");
+}
+END_TEST
+
+START_TEST(test_amplification_isolated_external_parser) {
+ // NOTE: Length 44 is precisely twice the length of "<!ENTITY a SYSTEM 'b'>"
+ // (22) that is used in function accountingGetCurrentAmplification in
+ // xmlparse.c.
+ // 1.........1.........1.........1.........1..4 => 44
+ const char doc[] = "<!ENTITY % p1 '123456789_123456789_1234567'>";
+ const int docLen = (int)sizeof(doc) - 1;
+ const float maximumToleratedAmplification = 2.0f;
+
+ struct TestCase {
+ int offsetOfThreshold;
+ enum XML_Status expectedStatus;
+ };
+
+ struct TestCase cases[] = {
+ {-2, XML_STATUS_ERROR}, {-1, XML_STATUS_ERROR}, {0, XML_STATUS_ERROR},
+ {+1, XML_STATUS_OK}, {+2, XML_STATUS_OK},
+ };
+
+ for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
+ const int offsetOfThreshold = cases[i].offsetOfThreshold;
+ const enum XML_Status expectedStatus = cases[i].expectedStatus;
+ const unsigned long long activationThresholdBytes
+ = docLen + offsetOfThreshold;
+
+ set_subtest("offsetOfThreshold=%d, expectedStatus=%d", offsetOfThreshold,
+ expectedStatus);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+
+ assert_true(XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parser, maximumToleratedAmplification)
+ == XML_TRUE);
+ assert_true(XML_SetBillionLaughsAttackProtectionActivationThreshold(
+ parser, activationThresholdBytes)
+ == XML_TRUE);
+
+ XML_Parser ext_parser = XML_ExternalEntityParserCreate(parser, NULL, NULL);
+ assert_true(ext_parser != NULL);
+
+ const enum XML_Status actualStatus
+ = _XML_Parse_SINGLE_BYTES(ext_parser, doc, docLen, XML_TRUE);
+
+ assert_true(actualStatus == expectedStatus);
+ if (actualStatus != XML_STATUS_OK) {
+ assert_true(XML_GetErrorCode(ext_parser)
+ == XML_ERROR_AMPLIFICATION_LIMIT_BREACH);
+ }
+
+ XML_ParserFree(ext_parser);
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+#endif // XML_GE == 1
+
+void
+make_accounting_test_case(Suite *s) {
+#if XML_GE == 1
+ TCase *tc_accounting = tcase_create("accounting tests");
+
+ suite_add_tcase(s, tc_accounting);
+
+ tcase_add_test(tc_accounting, test_accounting_precision);
+ tcase_add_test(tc_accounting, test_billion_laughs_attack_protection_api);
+ tcase_add_test(tc_accounting, test_helper_unsigned_char_to_printable);
+ tcase_add_test__ifdef_xml_dtd(tc_accounting,
+ test_amplification_isolated_external_parser);
+#else
+ UNUSED_P(s);
+#endif /* XML_GE == 1 */
+}
diff --git a/3rdparty/expat/tests/acc_tests.h b/3rdparty/expat/tests/acc_tests.h
new file mode 100644
index 00000000000..bbb93f37ed2
--- /dev/null
+++ b/3rdparty/expat/tests/acc_tests.h
@@ -0,0 +1,56 @@
+/* Tests in the "accounting" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_ACC_TESTS_H
+# define XML_ACC_TESTS_H
+
+extern void make_accounting_test_case(Suite *s);
+
+#endif /* XML_ACC_TESTS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/acc_tests_cxx.cpp b/3rdparty/expat/tests/acc_tests_cxx.cpp
new file mode 100644
index 00000000000..01644991ae5
--- /dev/null
+++ b/3rdparty/expat/tests/acc_tests_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "acc_tests.c"
diff --git a/3rdparty/expat/tests/alloc_tests.c b/3rdparty/expat/tests/alloc_tests.c
new file mode 100644
index 00000000000..12ea3b2a81d
--- /dev/null
+++ b/3rdparty/expat/tests/alloc_tests.c
@@ -0,0 +1,2154 @@
+/* Tests in the "allocation" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Copyright (c) 2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
+#endif
+
+#include <string.h>
+#include <assert.h>
+
+#include "expat.h"
+#include "common.h"
+#include "minicheck.h"
+#include "dummy.h"
+#include "handlers.h"
+#include "alloc_tests.h"
+
+static void
+alloc_setup(void) {
+ XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
+
+ /* Ensure the parser creation will go through */
+ g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+ g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
+ g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
+ if (g_parser == NULL)
+ fail("Parser not created");
+}
+
+static void
+alloc_teardown(void) {
+ basic_teardown();
+}
+
+/* Test the effects of allocation failures on xml declaration processing */
+START_TEST(test_alloc_parse_xdecl) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<doc>Hello, world</doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* Resetting the parser is insufficient, because some memory
+ * allocations are cached within the parser. Instead we use
+ * the teardown and setup routines to ensure that we have the
+ * right sort of parser back in our hands.
+ */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+/* As above, but with an encoding big enough to cause storing the
+ * version information to expand the string pool being used.
+ */
+START_TEST(test_alloc_parse_xdecl_2) {
+ const char *text
+ = "<?xml version='1.0' encoding='"
+ /* Each line is 64 characters */
+ "ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
+ "'?>"
+ "<doc>Hello, world</doc>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
+ XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+/* Test the effects of allocation failures on a straightforward parse */
+START_TEST(test_alloc_parse_pi) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<?pi unknown?>\n"
+ "<doc>"
+ "Hello, world"
+ "</doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+START_TEST(test_alloc_parse_pi_2) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<doc>"
+ "Hello, world"
+ "<?pi unknown?>\n"
+ "</doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+START_TEST(test_alloc_parse_pi_3) {
+ const char *text
+ = "<?"
+ /* 64 characters per line */
+ "This processing instruction should be long enough to ensure that"
+ "it triggers the growth of an internal string pool when the "
+ "allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "Q?><doc/>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+START_TEST(test_alloc_parse_comment) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<!-- Test parsing this comment -->"
+ "<doc>Hi</doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetCommentHandler(g_parser, dummy_comment_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+START_TEST(test_alloc_parse_comment_2) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<doc>"
+ "Hello, world"
+ "<!-- Parse this comment too -->"
+ "</doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetCommentHandler(g_parser, dummy_comment_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed with max allocations");
+}
+END_TEST
+
+/* Test that external parser creation running out of memory is
+ * correctly reported. Based on the external entity test cases.
+ */
+START_TEST(test_alloc_create_external_parser) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, foo_text);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_duff_loader);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR) {
+ fail("External parser allocator returned success incorrectly");
+ }
+}
+END_TEST
+
+/* More external parser memory allocation testing */
+START_TEST(test_alloc_run_external_parser) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
+ unsigned int i;
+ const unsigned int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, foo_text);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing ignored failing allocator");
+ else if (i == max_alloc_count)
+ fail("Parsing failed with allocation count 10");
+}
+END_TEST
+
+/* Test that running out of memory in dtdCopy is correctly reported.
+ * Based on test_default_ns_from_ext_subset_and_ext_ge()
+ */
+START_TEST(test_alloc_dtd_copy_default_atts) {
+ const char *text = "<?xml version='1.0'?>\n"
+ "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/ns1'>\n"
+ "&en;\n"
+ "</doc>";
+ int callno = 0;
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler);
+ XML_SetUserData(g_parser, &callno);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test more external entity allocation failure paths */
+START_TEST(test_alloc_external_entity) {
+ const char *text = "<?xml version='1.0'?>\n"
+ "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/ns1'>\n"
+ "&en;\n"
+ "</doc>";
+ int i;
+ const int alloc_test_max_repeats = 50;
+ int callno = 0;
+
+ for (i = 0; i < alloc_test_max_repeats; i++) {
+ g_allocation_count = -1;
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler_2);
+ callno = 0;
+ XML_SetUserData(g_parser, &callno);
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ g_allocation_count = -1;
+ if (i == 0)
+ fail("External entity parsed despite duff allocator");
+ if (i == alloc_test_max_repeats)
+ fail("External entity not parsed at max allocation count");
+}
+END_TEST
+
+/* Test more allocation failure paths */
+START_TEST(test_alloc_ext_entity_set_encoding) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ int i;
+ const int max_allocation_count = 30;
+
+ for (i = 0; i < max_allocation_count; i++) {
+ XML_SetExternalEntityRefHandler(g_parser,
+ external_entity_alloc_set_encoding);
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ break;
+ g_allocation_count = -1;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Encoding check succeeded despite failing allocator");
+ if (i == max_allocation_count)
+ fail("Encoding failed at max allocation count");
+}
+END_TEST
+
+/* Test the effects of allocation failure in internal entities.
+ * Based on test_unknown_encoding_internal_entity
+ */
+START_TEST(test_alloc_internal_entity) {
+ const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
+ "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
+ "<test a='&foo;'/>";
+ unsigned int i;
+ const unsigned int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUnknownEncodingHandler(g_parser, unknown_released_encoding_handler,
+ NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Internal entity worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Internal entity failed at max allocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_parameter_entity) {
+ const char *text = "<!DOCTYPE foo ["
+ "<!ENTITY % param1 \"<!ENTITY internal 'some_text'>\">"
+ "%param1;"
+ "]> <foo>&internal;content</foo>";
+ int i;
+ const int alloc_test_max_repeats = 30;
+
+ for (i = 0; i < alloc_test_max_repeats; i++) {
+ g_allocation_count = i;
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ alloc_teardown();
+ alloc_setup();
+ }
+ g_allocation_count = -1;
+ if (i == 0)
+ fail("Parameter entity processed despite duff allocator");
+ if (i == alloc_test_max_repeats)
+ fail("Parameter entity not processed at max allocation count");
+}
+END_TEST
+
+/* Test the robustness against allocation failure of element handling
+ * Based on test_dtd_default_handling().
+ */
+START_TEST(test_alloc_dtd_default_handling) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
+ "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
+ "<!ENTITY e1 SYSTEM 'http://example.org/e' NDATA n>\n"
+ "<!ELEMENT doc (#PCDATA)>\n"
+ "<!ATTLIST doc a CDATA #IMPLIED>\n"
+ "<?pi in dtd?>\n"
+ "<!--comment in dtd-->\n"
+ "]>\n"
+ "<doc><![CDATA[text in doc]]></doc>";
+ const XML_Char *expected = XCS("\n\n\n\n\n\n\n\n\n<doc>text in doc</doc>");
+ CharData storage;
+ int i;
+ const int max_alloc_count = 25;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ init_dummy_handlers();
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
+ dummy_end_doctype_handler);
+ XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
+ XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
+ XML_SetCommentHandler(g_parser, dummy_comment_handler);
+ XML_SetCdataSectionHandler(g_parser, dummy_start_cdata_handler,
+ dummy_end_cdata_handler);
+ XML_SetUnparsedEntityDeclHandler(g_parser,
+ dummy_unparsed_entity_decl_handler);
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Default DTD parsed despite allocation failures");
+ if (i == max_alloc_count)
+ fail("Default DTD not parsed with maximum alloc count");
+ CharData_CheckXMLChars(&storage, expected);
+ if (get_dummy_handler_flags()
+ != (DUMMY_START_DOCTYPE_HANDLER_FLAG | DUMMY_END_DOCTYPE_HANDLER_FLAG
+ | DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG
+ | DUMMY_ELEMENT_DECL_HANDLER_FLAG | DUMMY_ATTLIST_DECL_HANDLER_FLAG
+ | DUMMY_COMMENT_HANDLER_FLAG | DUMMY_PI_HANDLER_FLAG
+ | DUMMY_START_CDATA_HANDLER_FLAG | DUMMY_END_CDATA_HANDLER_FLAG
+ | DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG))
+ fail("Not all handlers were called");
+}
+END_TEST
+
+/* Test robustness of XML_SetEncoding() with a failing allocator */
+START_TEST(test_alloc_explicit_encoding) {
+ int i;
+ const int max_alloc_count = 5;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (XML_SetEncoding(g_parser, XCS("us-ascii")) == XML_STATUS_OK)
+ break;
+ }
+ if (i == 0)
+ fail("Encoding set despite failing allocator");
+ else if (i == max_alloc_count)
+ fail("Encoding not set at max allocation count");
+}
+END_TEST
+
+/* Test robustness of XML_SetBase against a failing allocator */
+START_TEST(test_alloc_set_base) {
+ const XML_Char *new_base = XCS("/local/file/name.xml");
+ int i;
+ const int max_alloc_count = 5;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (XML_SetBase(g_parser, new_base) == XML_STATUS_OK)
+ break;
+ }
+ if (i == 0)
+ fail("Base set despite failing allocator");
+ else if (i == max_alloc_count)
+ fail("Base not set with max allocation count");
+}
+END_TEST
+
+/* Test buffer extension in the face of a duff reallocator */
+START_TEST(test_alloc_realloc_buffer) {
+ const char *text = get_buffer_test_text;
+ void *buffer;
+ int i;
+ const int max_realloc_count = 10;
+
+ /* Get a smallish buffer */
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ buffer = XML_GetBuffer(g_parser, 1536);
+ if (buffer == NULL)
+ fail("1.5K buffer reallocation failed");
+ assert(buffer != NULL);
+ memcpy(buffer, text, strlen(text));
+ if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_OK)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ g_reallocation_count = -1;
+ if (i == 0)
+ fail("Parse succeeded with no reallocation");
+ else if (i == max_realloc_count)
+ fail("Parse failed with max reallocation count");
+}
+END_TEST
+
+/* Same test for external entity parsers */
+START_TEST(test_alloc_ext_entity_realloc_buffer) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_reallocator);
+ XML_SetUserData(g_parser, &i);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Succeeded with no reallocations");
+ if (i == max_realloc_count)
+ fail("Failed with max reallocations");
+}
+END_TEST
+
+/* Test elements with many attributes are handled correctly */
+START_TEST(test_alloc_realloc_many_attributes) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ATTLIST doc za CDATA 'default'>\n"
+ "<!ATTLIST doc zb CDATA 'def2'>\n"
+ "<!ATTLIST doc zc CDATA 'def3'>\n"
+ "]>\n"
+ "<doc a='1'"
+ " b='2'"
+ " c='3'"
+ " d='4'"
+ " e='5'"
+ " f='6'"
+ " g='7'"
+ " h='8'"
+ " i='9'"
+ " j='10'"
+ " k='11'"
+ " l='12'"
+ " m='13'"
+ " n='14'"
+ " p='15'"
+ " q='16'"
+ " r='17'"
+ " s='18'>"
+ "</doc>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite no reallocations");
+ if (i == max_realloc_count)
+ fail("Parse failed at max reallocations");
+}
+END_TEST
+
+/* Test handling of a public entity with failing allocator */
+START_TEST(test_alloc_public_entity_value) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
+ "<doc></doc>\n";
+ char dtd_text[]
+ = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 PUBLIC 'foo' 'bar.ent'>\n"
+ "<!ENTITY % "
+ /* Each line is 64 characters */
+ "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ " '%e1;'>\n"
+ "%e1;\n";
+ int i;
+ const int max_alloc_count = 50;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ init_dummy_handlers();
+ XML_SetUserData(g_parser, dtd_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
+ /* Provoke a particular code path */
+ XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocation");
+ if (i == max_alloc_count)
+ fail("Parsing failed at max allocation count");
+ if (get_dummy_handler_flags() != DUMMY_ENTITY_DECL_HANDLER_FLAG)
+ fail("Entity declaration handler not called");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_subst_public_entity_value) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
+ "<doc></doc>\n";
+ char dtd_text[]
+ = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % "
+ /* Each line is 64 characters */
+ "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ " PUBLIC 'foo' 'bar.ent'>\n"
+ "%ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP;";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetUserData(g_parser, dtd_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocation");
+ if (i == max_realloc_count)
+ fail("Parsing failed at max reallocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_parse_public_doctype) {
+ const char *text
+ = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<!DOCTYPE doc PUBLIC '"
+ /* 64 characters per line */
+ "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "' 'test'>\n"
+ "<doc></doc>";
+ int i;
+ const int max_alloc_count = 25;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ init_dummy_handlers();
+ XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
+ dummy_end_doctype_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags()
+ != (DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG
+ | DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG))
+ fail("Doctype handler functions not called");
+}
+END_TEST
+
+START_TEST(test_alloc_parse_public_doctype_long_name) {
+ const char *text
+ = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<!DOCTYPE doc PUBLIC 'http://example.com/foo' '"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "'>\n"
+ "<doc></doc>";
+ int i;
+ const int max_alloc_count = 25;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
+ dummy_end_doctype_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+/* Test foreign DTD handling */
+START_TEST(test_alloc_set_foreign_dtd) {
+ const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<doc>&entity;</doc>";
+ char text2[] = "<!ELEMENT doc (#PCDATA)*>";
+ int i;
+ const int max_alloc_count = 25;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &text2);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
+ fail("Could not set foreign DTD");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+/* Test based on ibm/valid/P32/ibm32v04.xml */
+START_TEST(test_alloc_attribute_enum_value) {
+ const char *text = "<?xml version='1.0' standalone='no'?>\n"
+ "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
+ "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
+ char dtd_text[] = "<!ELEMENT animal (#PCDATA|a)*>\n"
+ "<!ELEMENT a EMPTY>\n"
+ "<!ATTLIST animal xml:space (default|preserve) 'preserve'>";
+ int i;
+ const int max_alloc_count = 30;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ XML_SetUserData(g_parser, dtd_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ /* An attribute list handler provokes a different code path */
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+/* Test attribute enums sufficient to overflow the string pool */
+START_TEST(test_alloc_realloc_attribute_enum_value) {
+ const char *text = "<?xml version='1.0' standalone='no'?>\n"
+ "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
+ "<animal>This is a yellow tiger</animal>";
+ /* We wish to define a collection of attribute enums that will
+ * cause the string pool storing them to have to expand. This
+ * means more than 1024 bytes, including the parentheses and
+ * separator bars.
+ */
+ char dtd_text[]
+ = "<!ELEMENT animal (#PCDATA)*>\n"
+ "<!ATTLIST animal thing "
+ "(default"
+ /* Each line is 64 characters */
+ "|ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO)"
+ " 'default'>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ XML_SetUserData(g_parser, dtd_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ /* An attribute list handler provokes a different code path */
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+/* Test attribute enums in a #IMPLIED attribute forcing pool growth */
+START_TEST(test_alloc_realloc_implied_attribute) {
+ /* Forcing this particular code path is a balancing act. The
+ * addition of the closing parenthesis and terminal NUL must be
+ * what pushes the string of enums over the 1024-byte limit,
+ * otherwise a different code path will pick up the realloc.
+ */
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "<!ATTLIST doc a "
+ /* Each line is 64 characters */
+ "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
+ " #IMPLIED>\n"
+ "]><doc/>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+/* Test attribute enums in a defaulted attribute forcing pool growth */
+START_TEST(test_alloc_realloc_default_attribute) {
+ /* Forcing this particular code path is a balancing act. The
+ * addition of the closing parenthesis and terminal NUL must be
+ * what pushes the string of enums over the 1024-byte limit,
+ * otherwise a different code path will pick up the realloc.
+ */
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "<!ATTLIST doc a "
+ /* Each line is 64 characters */
+ "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
+ " 'ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO'"
+ ">\n]><doc/>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+/* Test long notation name with dodgy allocator */
+START_TEST(test_alloc_notation) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!NOTATION "
+ /* Each line is 64 characters */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ " SYSTEM 'http://example.org/n'>\n"
+ "<!ENTITY e SYSTEM 'http://example.org/e' NDATA "
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ ">\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "]>\n<doc/>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ init_dummy_handlers();
+ XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
+ XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite allocation failures");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags()
+ != (DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG))
+ fail("Entity declaration handler not called");
+}
+END_TEST
+
+/* Test public notation with dodgy allocator */
+START_TEST(test_alloc_public_notation) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!NOTATION note PUBLIC '"
+ /* 64 characters per line */
+ "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "' 'foo'>\n"
+ "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "]>\n<doc/>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ init_dummy_handlers();
+ XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite allocation failures");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
+ fail("Notation handler not called");
+}
+END_TEST
+
+/* Test public notation with dodgy allocator */
+START_TEST(test_alloc_system_notation) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!NOTATION note SYSTEM '"
+ /* 64 characters per line */
+ "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "'>\n"
+ "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "]>\n<doc/>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ init_dummy_handlers();
+ XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite allocation failures");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
+ fail("Notation handler not called");
+}
+END_TEST
+
+START_TEST(test_alloc_nested_groups) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc "
+ /* Sixteen elements per line */
+ "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
+ "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
+ "))))))))))))))))))))))))))))))))>\n"
+ "<!ELEMENT e EMPTY>"
+ "]>\n"
+ "<doc><e/></doc>";
+ CharData storage;
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ CharData_Init(&storage);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetStartElementHandler(g_parser, record_element_start_handler);
+ XML_SetUserData(g_parser, &storage);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum reallocation count");
+ CharData_CheckXMLChars(&storage, XCS("doce"));
+ if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
+ fail("Element handler not fired");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_nested_groups) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc "
+ /* Sixteen elements per line */
+ "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
+ "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
+ "))))))))))))))))))))))))))))))))>\n"
+ "<!ELEMENT e EMPTY>"
+ "]>\n"
+ "<doc><e/></doc>";
+ CharData storage;
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ CharData_Init(&storage);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetStartElementHandler(g_parser, record_element_start_handler);
+ XML_SetUserData(g_parser, &storage);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+ CharData_CheckXMLChars(&storage, XCS("doce"));
+ if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
+ fail("Element handler not fired");
+}
+END_TEST
+
+START_TEST(test_alloc_large_group) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc ("
+ "a1|a2|a3|a4|a5|a6|a7|a8|"
+ "b1|b2|b3|b4|b5|b6|b7|b8|"
+ "c1|c2|c3|c4|c5|c6|c7|c8|"
+ "d1|d2|d3|d4|d5|d6|d7|d8|"
+ "e1"
+ ")+>\n"
+ "]>\n"
+ "<doc>\n"
+ "<a1/>\n"
+ "</doc>\n";
+ int i;
+ const int max_alloc_count = 50;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
+ fail("Element handler flag not raised");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_group_choice) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc ("
+ "a1|a2|a3|a4|a5|a6|a7|a8|"
+ "b1|b2|b3|b4|b5|b6|b7|b8|"
+ "c1|c2|c3|c4|c5|c6|c7|c8|"
+ "d1|d2|d3|d4|d5|d6|d7|d8|"
+ "e1"
+ ")+>\n"
+ "]>\n"
+ "<doc>\n"
+ "<a1/>\n"
+ "<b2 attr='foo'>This is a foo</b2>\n"
+ "<c3></c3>\n"
+ "</doc>\n";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+ if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
+ fail("Element handler flag not raised");
+}
+END_TEST
+
+START_TEST(test_alloc_pi_in_epilog) {
+ const char *text = "<doc></doc>\n"
+ "<?pi in epilog?>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse completed despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags() != DUMMY_PI_HANDLER_FLAG)
+ fail("Processing instruction handler not invoked");
+}
+END_TEST
+
+START_TEST(test_alloc_comment_in_epilog) {
+ const char *text = "<doc></doc>\n"
+ "<!-- comment in epilog -->";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetCommentHandler(g_parser, dummy_comment_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse completed despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+ if (get_dummy_handler_flags() != DUMMY_COMMENT_HANDLER_FLAG)
+ fail("Processing instruction handler not invoked");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_long_attribute_value) {
+ const char *text
+ = "<!DOCTYPE doc [<!ENTITY foo '"
+ /* Each line is 64 characters */
+ "This entity will be substituted as an attribute value, and is "
+ "calculated to be exactly long enough that the terminating NUL "
+ "that the library adds internally will trigger the string pool to"
+ "grow. GHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "'>]>\n"
+ "<doc a='&foo;'></doc>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_attribute_whitespace) {
+ const char *text = "<doc a=' '></doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_attribute_predefined_entity) {
+ const char *text = "<doc a='&amp;'></doc>";
+ int i;
+ const int max_alloc_count = 15;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+/* Test that a character reference at the end of a suitably long
+ * default value for an attribute can trigger pool growth, and recovers
+ * if the allocator fails on it.
+ */
+START_TEST(test_alloc_long_attr_default_with_char_ref) {
+ const char *text
+ = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHI"
+ "&#x31;'>]>\n"
+ "<doc/>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+/* Test that a long character reference substitution triggers a pool
+ * expansion correctly for an attribute value.
+ */
+START_TEST(test_alloc_long_attr_value) {
+ const char *text
+ = "<!DOCTYPE test [<!ENTITY foo '\n"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "'>]>\n"
+ "<test a='&foo;'/>";
+ int i;
+ const int max_alloc_count = 25;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing allocator");
+ if (i == max_alloc_count)
+ fail("Parse failed at maximum allocation count");
+}
+END_TEST
+
+/* Test that an error in a nested parameter entity substitution is
+ * handled correctly. It seems unlikely that the code path being
+ * exercised can be reached purely by carefully crafted XML, but an
+ * allocation error in the right place will definitely do it.
+ */
+START_TEST(test_alloc_nested_entities) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
+ "<doc />";
+ ExtFaults test_data
+ = {"<!ENTITY % pe1 '"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "'>\n"
+ "<!ENTITY % pe2 '%pe1;'>\n"
+ "<!ENTITY % pe3 '%pe2;'>",
+ "Memory Fail not faulted", NULL, XML_ERROR_NO_MEMORY};
+
+ /* Causes an allocation error in a nested storeEntityValue() */
+ g_allocation_count = 12;
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Entity allocation failure not noted");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_param_entity_newline) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
+ "<doc/>";
+ char dtd_text[]
+ = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
+ /* 64 characters per line */
+ "This default value is carefully crafted so that the carriage "
+ "return right at the end of the entity string causes an internal "
+ "string pool to have to grow. This allows us to test the alloc "
+ "failure path from that point. OPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDE"
+ "\">\n'>"
+ "%pe;\n";
+ int i;
+ const int max_realloc_count = 5;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetUserData(g_parser, dtd_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_ce_extends_pe) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
+ "<doc/>";
+ char dtd_text[]
+ = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
+ /* 64 characters per line */
+ "This default value is carefully crafted so that the character "
+ "entity at the end causes an internal string pool to have to "
+ "grow. This allows us to test the allocation failure path from "
+ "that point onwards. EFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFG&#x51;"
+ "\">\n'>"
+ "%pe;\n";
+ int i;
+ const int max_realloc_count = 5;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetUserData(g_parser, dtd_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_realloc_attributes) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ATTLIST doc\n"
+ " a1 (a|b|c) 'a'\n"
+ " a2 (foo|bar) #IMPLIED\n"
+ " a3 NMTOKEN #IMPLIED\n"
+ " a4 NMTOKENS #IMPLIED\n"
+ " a5 ID #IMPLIED\n"
+ " a6 IDREF #IMPLIED\n"
+ " a7 IDREFS #IMPLIED\n"
+ " a8 ENTITY #IMPLIED\n"
+ " a9 ENTITIES #IMPLIED\n"
+ " a10 CDATA #IMPLIED\n"
+ " >]>\n"
+ "<doc>wombat</doc>\n";
+ int i;
+ const int max_realloc_count = 5;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+
+ if (i == 0)
+ fail("Parse succeeded despite failing reallocator");
+ if (i == max_realloc_count)
+ fail("Parse failed at maximum reallocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_long_doc_name) {
+ const char *text =
+ /* 64 characters per line */
+ "<LongRootElementNameThatWillCauseTheNextAllocationToExpandTheStr"
+ "ingPoolForTheDTDQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ " a='1'/>";
+ int i;
+ const int max_alloc_count = 20;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max reallocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_long_base) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY e SYSTEM 'foo'>\n"
+ "]>\n"
+ "<doc>&e;</doc>";
+ char entity_text[] = "Hello world";
+ const XML_Char *base =
+ /* 64 characters per line */
+ /* clang-format off */
+ XCS("LongBaseURI/that/will/overflow/an/internal/buffer/and/cause/it/t")
+ XCS("o/have/to/grow/PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/");
+ /* clang-format on */
+ int i;
+ const int max_alloc_count = 25;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, entity_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ if (XML_SetBase(g_parser, base) == XML_STATUS_ERROR) {
+ XML_ParserReset(g_parser, NULL);
+ continue;
+ }
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_long_public_id) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!ENTITY e PUBLIC '"
+ /* 64 characters per line */
+ "LongPublicIDThatShouldResultInAnInternalStringPoolGrowingAtASpec"
+ "ificMomentKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "' 'bar'>\n"
+ "]>\n"
+ "<doc>&e;</doc>";
+ char entity_text[] = "Hello world";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, entity_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_long_entity_value) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!ENTITY e1 '"
+ /* 64 characters per line */
+ "Long entity value that should provoke a string pool to grow whil"
+ "e setting up to parse the external entity below. xyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "'>\n"
+ " <!ENTITY e2 SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc>&e2;</doc>";
+ char entity_text[] = "Hello world";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, entity_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_long_notation) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!NOTATION note SYSTEM '"
+ /* 64 characters per line */
+ "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
+ "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "'>\n"
+ " <!ENTITY e1 SYSTEM 'foo' NDATA "
+ /* 64 characters per line */
+ "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
+ "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
+ ">\n"
+ " <!ENTITY e2 SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc>&e2;</doc>";
+ ExtOption options[]
+ = {{XCS("foo"), "Entity Foo"}, {XCS("bar"), "Entity Bar"}, {NULL, NULL}};
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+
+ /* See comment in test_alloc_parse_xdecl() */
+ alloc_teardown();
+ alloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+START_TEST(test_alloc_reset_after_external_entity_parser_create_fail) {
+ const char *const text = "<!DOCTYPE doc SYSTEM 'foo'><doc/>";
+
+ XML_SetExternalEntityRefHandler(
+ g_parser, external_entity_parser_create_alloc_fail_handler);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Call to parse was expected to fail");
+
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_EXTERNAL_ENTITY_HANDLING)
+ fail("Call to parse was expected to fail from the external entity handler");
+
+ XML_ParserReset(g_parser, NULL);
+}
+END_TEST
+
+void
+make_alloc_test_case(Suite *s) {
+ TCase *tc_alloc = tcase_create("allocation tests");
+
+ suite_add_tcase(s, tc_alloc);
+ tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
+
+ tcase_add_test(tc_alloc, test_alloc_parse_xdecl);
+ tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
+ tcase_add_test(tc_alloc, test_alloc_parse_pi);
+ tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
+ tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
+ tcase_add_test(tc_alloc, test_alloc_parse_comment);
+ tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_parameter_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling);
+ tcase_add_test(tc_alloc, test_alloc_explicit_encoding);
+ tcase_add_test(tc_alloc, test_alloc_set_base);
+ tcase_add_test(tc_alloc, test_alloc_realloc_buffer);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_ext_entity_realloc_buffer);
+ tcase_add_test(tc_alloc, test_alloc_realloc_many_attributes);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_public_entity_value);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc,
+ test_alloc_realloc_subst_public_entity_value);
+ tcase_add_test(tc_alloc, test_alloc_parse_public_doctype);
+ tcase_add_test(tc_alloc, test_alloc_parse_public_doctype_long_name);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_set_foreign_dtd);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_attribute_enum_value);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc,
+ test_alloc_realloc_attribute_enum_value);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_implied_attribute);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_default_attribute);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_notation);
+ tcase_add_test(tc_alloc, test_alloc_public_notation);
+ tcase_add_test(tc_alloc, test_alloc_system_notation);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_groups);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_nested_groups);
+ tcase_add_test(tc_alloc, test_alloc_large_group);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_group_choice);
+ tcase_add_test(tc_alloc, test_alloc_pi_in_epilog);
+ tcase_add_test(tc_alloc, test_alloc_comment_in_epilog);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc,
+ test_alloc_realloc_long_attribute_value);
+ tcase_add_test(tc_alloc, test_alloc_attribute_whitespace);
+ tcase_add_test(tc_alloc, test_alloc_attribute_predefined_entity);
+ tcase_add_test(tc_alloc, test_alloc_long_attr_default_with_char_ref);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_attr_value);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_entities);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc,
+ test_alloc_realloc_param_entity_newline);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_ce_extends_pe);
+ tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_attributes);
+ tcase_add_test(tc_alloc, test_alloc_long_doc_name);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_base);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_public_id);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_entity_value);
+ tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_notation);
+
+ tcase_add_test__ifdef_xml_dtd(
+ tc_alloc, test_alloc_reset_after_external_entity_parser_create_fail);
+}
diff --git a/3rdparty/expat/tests/alloc_tests.h b/3rdparty/expat/tests/alloc_tests.h
new file mode 100644
index 00000000000..1eae130be78
--- /dev/null
+++ b/3rdparty/expat/tests/alloc_tests.h
@@ -0,0 +1,56 @@
+/* Tests in the "allocation" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_ALLOC_TESTS_H
+# define XML_ALLOC_TESTS_H
+
+extern void make_alloc_test_case(Suite *s);
+
+#endif /* XML_ALLOC_TESTS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/alloc_tests_cxx.cpp b/3rdparty/expat/tests/alloc_tests_cxx.cpp
new file mode 100644
index 00000000000..3270b1a6c98
--- /dev/null
+++ b/3rdparty/expat/tests/alloc_tests_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "alloc_tests.c"
diff --git a/3rdparty/expat/tests/basic_tests.c b/3rdparty/expat/tests/basic_tests.c
new file mode 100644
index 00000000000..e813df8b6fd
--- /dev/null
+++ b/3rdparty/expat/tests/basic_tests.c
@@ -0,0 +1,6472 @@
+/* Tests in the "basic" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Copyright (c) 2024-2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
+#endif
+
+#include <assert.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#if ! defined(__cplusplus)
+# include <stdbool.h>
+#endif
+
+#include "expat_config.h"
+
+#include "expat.h"
+#include "internal.h"
+#include "minicheck.h"
+#include "structdata.h"
+#include "common.h"
+#include "dummy.h"
+#include "handlers.h"
+#include "siphash.h"
+#include "basic_tests.h"
+
+static void
+basic_setup(void) {
+ g_parser = XML_ParserCreate(NULL);
+ if (g_parser == NULL)
+ fail("Parser not created.");
+}
+
+/*
+ * Character & encoding tests.
+ */
+
+START_TEST(test_nul_byte) {
+ char text[] = "<doc>\0</doc>";
+
+ /* test that a NUL byte (in US-ASCII data) is an error */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Parser did not report error on NUL-byte.");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_u0000_char) {
+ /* test that a NUL byte (in US-ASCII data) is an error */
+ expect_failure("<doc>&#0;</doc>", XML_ERROR_BAD_CHAR_REF,
+ "Parser did not report error on NUL-byte.");
+}
+END_TEST
+
+START_TEST(test_siphash_self) {
+ if (! sip24_valid())
+ fail("SipHash self-test failed");
+}
+END_TEST
+
+START_TEST(test_siphash_spec) {
+ /* https://131002.net/siphash/siphash.pdf (page 19, "Test values") */
+ const char message[] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
+ "\x0a\x0b\x0c\x0d\x0e";
+ const size_t len = sizeof(message) - 1;
+ const uint64_t expected = SIP_ULL(0xa129ca61U, 0x49be45e5U);
+ struct siphash state;
+ struct sipkey key;
+
+ sip_tokey(&key, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
+ "\x0a\x0b\x0c\x0d\x0e\x0f");
+ sip24_init(&state, &key);
+
+ /* Cover spread across calls */
+ sip24_update(&state, message, 4);
+ sip24_update(&state, message + 4, len - 4);
+
+ /* Cover null length */
+ sip24_update(&state, message, 0);
+
+ if (sip24_final(&state) != expected)
+ fail("sip24_final failed spec test\n");
+
+ /* Cover wrapper */
+ if (siphash24(message, len, &key) != expected)
+ fail("siphash24 failed spec test\n");
+}
+END_TEST
+
+START_TEST(test_bom_utf8) {
+ /* This test is really just making sure we don't core on a UTF-8 BOM. */
+ const char *text = "\357\273\277<e/>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_bom_utf16_be) {
+ char text[] = "\376\377\0<\0e\0/\0>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_bom_utf16_le) {
+ char text[] = "\377\376<\0e\0/\0>\0";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_nobom_utf16_le) {
+ char text[] = " \0<\0e\0/\0>\0";
+
+ if (g_chunkSize == 1) {
+ // TODO: with just the first byte, we can't tell the difference between
+ // UTF-16-LE and UTF-8. Avoid the failure for now.
+ return;
+ }
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_hash_collision) {
+ /* For full coverage of the lookup routine, we need to ensure a
+ * hash collision even though we can only tell that we have one
+ * through breakpoint debugging or coverage statistics. The
+ * following will cause a hash collision on machines with a 64-bit
+ * long type; others will have to experiment. The full coverage
+ * tests invoked from qa.sh usually provide a hash collision, but
+ * not always. This is an attempt to provide insurance.
+ */
+#define COLLIDING_HASH_SALT (unsigned long)SIP_ULL(0xffffffffU, 0xff99fc90U)
+ const char *text
+ = "<doc>\n"
+ "<a1/><a2/><a3/><a4/><a5/><a6/><a7/><a8/>\n"
+ "<b1></b1><b2 attr='foo'>This is a foo</b2><b3></b3><b4></b4>\n"
+ "<b5></b5><b6></b6><b7></b7><b8></b8>\n"
+ "<c1/><c2/><c3/><c4/><c5/><c6/><c7/><c8/>\n"
+ "<d1/><d2/><d3/><d4/><d5/><d6/><d7/>\n"
+ "<d8>This triggers the table growth and collides with b2</d8>\n"
+ "</doc>\n";
+
+ XML_SetHashSalt(g_parser, COLLIDING_HASH_SALT);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+#undef COLLIDING_HASH_SALT
+
+/* Regression test for SF bug #491986. */
+START_TEST(test_danish_latin1) {
+ const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+ "<e>J\xF8rgen \xE6\xF8\xE5\xC6\xD8\xC5</e>";
+#ifdef XML_UNICODE
+ const XML_Char *expected
+ = XCS("J\x00f8rgen \x00e6\x00f8\x00e5\x00c6\x00d8\x00c5");
+#else
+ const XML_Char *expected
+ = XCS("J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85");
+#endif
+ run_character_check(text, expected);
+}
+END_TEST
+
+/* Regression test for SF bug #514281. */
+START_TEST(test_french_charref_hexidecimal) {
+ const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+ "<doc>&#xE9;&#xE8;&#xE0;&#xE7;&#xEA;&#xC8;</doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
+#else
+ const XML_Char *expected
+ = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
+#endif
+ run_character_check(text, expected);
+}
+END_TEST
+
+START_TEST(test_french_charref_decimal) {
+ const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+ "<doc>&#233;&#232;&#224;&#231;&#234;&#200;</doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
+#else
+ const XML_Char *expected
+ = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
+#endif
+ run_character_check(text, expected);
+}
+END_TEST
+
+START_TEST(test_french_latin1) {
+ const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+ "<doc>\xE9\xE8\xE0\xE7\xEa\xC8</doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
+#else
+ const XML_Char *expected
+ = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
+#endif
+ run_character_check(text, expected);
+}
+END_TEST
+
+START_TEST(test_french_utf8) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<doc>\xC3\xA9</doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9");
+#else
+ const XML_Char *expected = XCS("\xC3\xA9");
+#endif
+ run_character_check(text, expected);
+}
+END_TEST
+
+/* Regression test for SF bug #600479.
+ XXX There should be a test that exercises all legal XML Unicode
+ characters as PCDATA and attribute value content, and XML Name
+ characters as part of element and attribute names.
+*/
+START_TEST(test_utf8_false_rejection) {
+ const char *text = "<doc>\xEF\xBA\xBF</doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\xfebf");
+#else
+ const XML_Char *expected = XCS("\xEF\xBA\xBF");
+#endif
+ run_character_check(text, expected);
+}
+END_TEST
+
+/* Regression test for SF bug #477667.
+ This test assures that any 8-bit character followed by a 7-bit
+ character will not be mistakenly interpreted as a valid UTF-8
+ sequence.
+*/
+START_TEST(test_illegal_utf8) {
+ char text[100];
+ int i;
+
+ for (i = 128; i <= 255; ++i) {
+ snprintf(text, sizeof(text), "<e>%ccd</e>", i);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK) {
+ snprintf(text, sizeof(text),
+ "expected token error for '%c' (ordinal %d) in UTF-8 text", i,
+ i);
+ fail(text);
+ } else if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
+ xml_failure(g_parser);
+ /* Reset the parser since we use the same parser repeatedly. */
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* Examples, not masks: */
+#define UTF8_LEAD_1 "\x7f" /* 0b01111111 */
+#define UTF8_LEAD_2 "\xdf" /* 0b11011111 */
+#define UTF8_LEAD_3 "\xef" /* 0b11101111 */
+#define UTF8_LEAD_4 "\xf7" /* 0b11110111 */
+#define UTF8_FOLLOW "\xbf" /* 0b10111111 */
+
+START_TEST(test_utf8_auto_align) {
+ struct TestCase {
+ ptrdiff_t expectedMovementInChars;
+ const char *input;
+ };
+
+ struct TestCase cases[] = {
+ {00, ""},
+
+ {00, UTF8_LEAD_1},
+
+ {-1, UTF8_LEAD_2},
+ {00, UTF8_LEAD_2 UTF8_FOLLOW},
+
+ {-1, UTF8_LEAD_3},
+ {-2, UTF8_LEAD_3 UTF8_FOLLOW},
+ {00, UTF8_LEAD_3 UTF8_FOLLOW UTF8_FOLLOW},
+
+ {-1, UTF8_LEAD_4},
+ {-2, UTF8_LEAD_4 UTF8_FOLLOW},
+ {-3, UTF8_LEAD_4 UTF8_FOLLOW UTF8_FOLLOW},
+ {00, UTF8_LEAD_4 UTF8_FOLLOW UTF8_FOLLOW UTF8_FOLLOW},
+ };
+
+ size_t i = 0;
+ bool success = true;
+ for (; i < sizeof(cases) / sizeof(*cases); i++) {
+ const char *fromLim = cases[i].input + strlen(cases[i].input);
+ const char *const fromLimInitially = fromLim;
+ ptrdiff_t actualMovementInChars;
+
+ _INTERNAL_trim_to_complete_utf8_characters(cases[i].input, &fromLim);
+
+ actualMovementInChars = (fromLim - fromLimInitially);
+ if (actualMovementInChars != cases[i].expectedMovementInChars) {
+ size_t j = 0;
+ success = false;
+ printf("[-] UTF-8 case %2u: Expected movement by %2d chars"
+ ", actually moved by %2d chars: \"",
+ (unsigned)(i + 1), (int)cases[i].expectedMovementInChars,
+ (int)actualMovementInChars);
+ for (; j < strlen(cases[i].input); j++) {
+ printf("\\x%02x", (unsigned char)cases[i].input[j]);
+ }
+ printf("\"\n");
+ }
+ }
+
+ if (! success) {
+ fail("UTF-8 auto-alignment is not bullet-proof\n");
+ }
+}
+END_TEST
+
+START_TEST(test_utf16) {
+ /* <?xml version="1.0" encoding="UTF-16"?>
+ * <doc a='123'>some {A} text</doc>
+ *
+ * where {A} is U+FF21, FULLWIDTH LATIN CAPITAL LETTER A
+ */
+ char text[]
+ = "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o"
+ "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o"
+ "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066"
+ "\000'\000?\000>\000\n"
+ "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'\000>"
+ "\000s\000o\000m\000e\000 \xff\x21\000 \000t\000e\000x\000t\000"
+ "<\000/\000d\000o\000c\000>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("some \xff21 text");
+#else
+ const XML_Char *expected = XCS("some \357\274\241 text");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_utf16_le_epilog_newline) {
+ unsigned int first_chunk_bytes = 17;
+ char text[] = "\xFF\xFE" /* BOM */
+ "<\000e\000/\000>\000" /* document element */
+ "\r\000\n\000\r\000\n\000"; /* epilog */
+
+ if (first_chunk_bytes >= sizeof(text) - 1)
+ fail("bad value of first_chunk_bytes");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, first_chunk_bytes, XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ else {
+ enum XML_Status rc;
+ rc = _XML_Parse_SINGLE_BYTES(g_parser, text + first_chunk_bytes,
+ sizeof(text) - first_chunk_bytes - 1,
+ XML_TRUE);
+ if (rc == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ }
+}
+END_TEST
+
+/* Test that an outright lie in the encoding is faulted */
+START_TEST(test_not_utf16) {
+ const char *text = "<?xml version='1.0' encoding='utf-16'?>"
+ "<doc>Hi</doc>";
+
+ /* Use a handler to provoke the appropriate code paths */
+ XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
+ expect_failure(text, XML_ERROR_INCORRECT_ENCODING,
+ "UTF-16 declared in UTF-8 not faulted");
+}
+END_TEST
+
+/* Test that an unknown encoding is rejected */
+START_TEST(test_bad_encoding) {
+ const char *text = "<doc>Hi</doc>";
+
+ if (! XML_SetEncoding(g_parser, XCS("unknown-encoding")))
+ fail("XML_SetEncoding failed");
+ expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
+ "Unknown encoding not faulted");
+}
+END_TEST
+
+/* Regression test for SF bug #481609, #774028. */
+START_TEST(test_latin1_umlauts) {
+ const char *text
+ = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+ "<e a='\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; >'\n"
+ " >\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; ></e>";
+#ifdef XML_UNICODE
+ /* Expected results in UTF-16 */
+ const XML_Char *expected = XCS("\x00e4 \x00f6 \x00fc ")
+ XCS("\x00e4 \x00f6 \x00fc ") XCS("\x00e4 \x00f6 \x00fc >");
+#else
+ /* Expected results in UTF-8 */
+ const XML_Char *expected = XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC ")
+ XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC ") XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC >");
+#endif
+
+ run_character_check(text, expected);
+ XML_ParserReset(g_parser, NULL);
+ run_attribute_check(text, expected);
+ /* Repeat with a default handler */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+ run_character_check(text, expected);
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+ run_attribute_check(text, expected);
+}
+END_TEST
+
+/* Test that an element name with a 4-byte UTF-8 character is rejected */
+START_TEST(test_long_utf8_character) {
+ const char *text
+ = "<?xml version='1.0' encoding='utf-8'?>\n"
+ /* 0xf0 0x90 0x80 0x80 = U+10000, the first Linear B character */
+ "<do\xf0\x90\x80\x80/>";
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "4-byte UTF-8 character in element name not faulted");
+}
+END_TEST
+
+/* Test that a long latin-1 attribute (too long to convert in one go)
+ * is correctly converted
+ */
+START_TEST(test_long_latin1_attribute) {
+ const char *text
+ = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
+ "<doc att='"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
+ /* Last character splits across a buffer boundary */
+ "\xe4'>\n</doc>";
+
+ const XML_Char *expected =
+ /* 64 characters per line */
+ /* clang-format off */
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO")
+ /* clang-format on */
+#ifdef XML_UNICODE
+ XCS("\x00e4");
+#else
+ XCS("\xc3\xa4");
+#endif
+
+ run_attribute_check(text, expected);
+}
+END_TEST
+
+/* Test that a long ASCII attribute (too long to convert in one go)
+ * is correctly converted
+ */
+START_TEST(test_long_ascii_attribute) {
+ const char *text
+ = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<doc att='"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "01234'>\n</doc>";
+ const XML_Char *expected =
+ /* 64 characters per line */
+ /* clang-format off */
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("01234");
+ /* clang-format on */
+
+ run_attribute_check(text, expected);
+}
+END_TEST
+
+/* Regression test #1 for SF bug #653180. */
+START_TEST(test_line_number_after_parse) {
+ const char *text = "<tag>\n"
+ "\n"
+ "\n</tag>";
+ XML_Size lineno;
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ lineno = XML_GetCurrentLineNumber(g_parser);
+ if (lineno != 4) {
+ char buffer[100];
+ snprintf(buffer, sizeof(buffer),
+ "expected 4 lines, saw %" XML_FMT_INT_MOD "u", lineno);
+ fail(buffer);
+ }
+}
+END_TEST
+
+/* Regression test #2 for SF bug #653180. */
+START_TEST(test_column_number_after_parse) {
+ const char *text = "<tag></tag>";
+ XML_Size colno;
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ colno = XML_GetCurrentColumnNumber(g_parser);
+ if (colno != 11) {
+ char buffer[100];
+ snprintf(buffer, sizeof(buffer),
+ "expected 11 columns, saw %" XML_FMT_INT_MOD "u", colno);
+ fail(buffer);
+ }
+}
+END_TEST
+
+/* Regression test #3 for SF bug #653180. */
+START_TEST(test_line_and_column_numbers_inside_handlers) {
+ const char *text = "<a>\n" /* Unix end-of-line */
+ " <b>\r\n" /* Windows end-of-line */
+ " <c/>\r" /* Mac OS end-of-line */
+ " </b>\n"
+ " <d>\n"
+ " <f/>\n"
+ " </d>\n"
+ "</a>";
+ const StructDataEntry expected[]
+ = {{XCS("a"), 0, 1, STRUCT_START_TAG}, {XCS("b"), 2, 2, STRUCT_START_TAG},
+ {XCS("c"), 4, 3, STRUCT_START_TAG}, {XCS("c"), 8, 3, STRUCT_END_TAG},
+ {XCS("b"), 2, 4, STRUCT_END_TAG}, {XCS("d"), 2, 5, STRUCT_START_TAG},
+ {XCS("f"), 4, 6, STRUCT_START_TAG}, {XCS("f"), 8, 6, STRUCT_END_TAG},
+ {XCS("d"), 2, 7, STRUCT_END_TAG}, {XCS("a"), 0, 8, STRUCT_END_TAG}};
+ const int expected_count = sizeof(expected) / sizeof(StructDataEntry);
+ StructData storage;
+
+ StructData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetStartElementHandler(g_parser, start_element_event_handler2);
+ XML_SetEndElementHandler(g_parser, end_element_event_handler2);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ StructData_CheckItems(&storage, expected, expected_count);
+ StructData_Dispose(&storage);
+}
+END_TEST
+
+/* Regression test #4 for SF bug #653180. */
+START_TEST(test_line_number_after_error) {
+ const char *text = "<a>\n"
+ " <b>\n"
+ " </a>"; /* missing </b> */
+ XML_Size lineno;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Expected a parse error");
+
+ lineno = XML_GetCurrentLineNumber(g_parser);
+ if (lineno != 3) {
+ char buffer[100];
+ snprintf(buffer, sizeof(buffer),
+ "expected 3 lines, saw %" XML_FMT_INT_MOD "u", lineno);
+ fail(buffer);
+ }
+}
+END_TEST
+
+/* Regression test #5 for SF bug #653180. */
+START_TEST(test_column_number_after_error) {
+ const char *text = "<a>\n"
+ " <b>\n"
+ " </a>"; /* missing </b> */
+ XML_Size colno;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Expected a parse error");
+
+ colno = XML_GetCurrentColumnNumber(g_parser);
+ if (colno != 4) {
+ char buffer[100];
+ snprintf(buffer, sizeof(buffer),
+ "expected 4 columns, saw %" XML_FMT_INT_MOD "u", colno);
+ fail(buffer);
+ }
+}
+END_TEST
+
+/* Regression test for SF bug #478332. */
+START_TEST(test_really_long_lines) {
+ /* This parses an input line longer than INIT_DATA_BUF_SIZE
+ characters long (defined to be 1024 in xmlparse.c). We take a
+ really cheesy approach to building the input buffer, because
+ this avoids writing bugs in buffer-filling code.
+ */
+ const char *text
+ = "<e>"
+ /* 64 chars */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ /* until we have at least 1024 characters on the line: */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "</e>";
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test cdata processing across a buffer boundary */
+START_TEST(test_really_long_encoded_lines) {
+ /* As above, except that we want to provoke an output buffer
+ * overflow with a non-trivial encoding. For this we need to pass
+ * the whole cdata in one go, not byte-by-byte.
+ */
+ void *buffer;
+ const char *text
+ = "<?xml version='1.0' encoding='iso-8859-1'?>"
+ "<e>"
+ /* 64 chars */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ /* until we have at least 1024 characters on the line: */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
+ "</e>";
+ int parse_len = (int)strlen(text);
+
+ /* Need a cdata handler to provoke the code path we want to test */
+ XML_SetCharacterDataHandler(g_parser, dummy_cdata_handler);
+ buffer = XML_GetBuffer(g_parser, parse_len);
+ if (buffer == NULL)
+ fail("Could not allocate parse buffer");
+ assert(buffer != NULL);
+ memcpy(buffer, text, parse_len);
+ if (XML_ParseBuffer(g_parser, parse_len, XML_TRUE) == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/*
+ * Element event tests.
+ */
+
+START_TEST(test_end_element_events) {
+ const char *text = "<a><b><c/></b><d><f/></d></a>";
+ const XML_Char *expected = XCS("/c/b/f/d/a");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetEndElementHandler(g_parser, end_element_event_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/*
+ * Attribute tests.
+ */
+
+/* Helper used by the following tests; this checks any "attr" and "refs"
+ attributes to make sure whitespace has been normalized.
+
+ Return true if whitespace has been normalized in a string, using
+ the rules for attribute value normalization. The 'is_cdata' flag
+ is needed since CDATA attributes don't need to have multiple
+ whitespace characters collapsed to a single space, while other
+ attribute data types do. (Section 3.3.3 of the recommendation.)
+*/
+static int
+is_whitespace_normalized(const XML_Char *s, int is_cdata) {
+ int blanks = 0;
+ int at_start = 1;
+ while (*s) {
+ if (*s == XCS(' '))
+ ++blanks;
+ else if (*s == XCS('\t') || *s == XCS('\n') || *s == XCS('\r'))
+ return 0;
+ else {
+ if (at_start) {
+ at_start = 0;
+ if (blanks && ! is_cdata)
+ /* illegal leading blanks */
+ return 0;
+ } else if (blanks > 1 && ! is_cdata)
+ return 0;
+ blanks = 0;
+ }
+ ++s;
+ }
+ if (blanks && ! is_cdata)
+ return 0;
+ return 1;
+}
+
+/* Check the attribute whitespace checker: */
+START_TEST(test_helper_is_whitespace_normalized) {
+ assert(is_whitespace_normalized(XCS("abc"), 0));
+ assert(is_whitespace_normalized(XCS("abc"), 1));
+ assert(is_whitespace_normalized(XCS("abc def ghi"), 0));
+ assert(is_whitespace_normalized(XCS("abc def ghi"), 1));
+ assert(! is_whitespace_normalized(XCS(" abc def ghi"), 0));
+ assert(is_whitespace_normalized(XCS(" abc def ghi"), 1));
+ assert(! is_whitespace_normalized(XCS("abc def ghi"), 0));
+ assert(is_whitespace_normalized(XCS("abc def ghi"), 1));
+ assert(! is_whitespace_normalized(XCS("abc def ghi "), 0));
+ assert(is_whitespace_normalized(XCS("abc def ghi "), 1));
+ assert(! is_whitespace_normalized(XCS(" "), 0));
+ assert(is_whitespace_normalized(XCS(" "), 1));
+ assert(! is_whitespace_normalized(XCS("\t"), 0));
+ assert(! is_whitespace_normalized(XCS("\t"), 1));
+ assert(! is_whitespace_normalized(XCS("\n"), 0));
+ assert(! is_whitespace_normalized(XCS("\n"), 1));
+ assert(! is_whitespace_normalized(XCS("\r"), 0));
+ assert(! is_whitespace_normalized(XCS("\r"), 1));
+ assert(! is_whitespace_normalized(XCS("abc\t def"), 1));
+}
+END_TEST
+
+static void XMLCALL
+check_attr_contains_normalized_whitespace(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ int i;
+ UNUSED_P(userData);
+ UNUSED_P(name);
+ for (i = 0; atts[i] != NULL; i += 2) {
+ const XML_Char *attrname = atts[i];
+ const XML_Char *value = atts[i + 1];
+ if (xcstrcmp(XCS("attr"), attrname) == 0
+ || xcstrcmp(XCS("ents"), attrname) == 0
+ || xcstrcmp(XCS("refs"), attrname) == 0) {
+ if (! is_whitespace_normalized(value, 0)) {
+ char buffer[256];
+ snprintf(buffer, sizeof(buffer),
+ "attribute value not normalized: %" XML_FMT_STR
+ "='%" XML_FMT_STR "'",
+ attrname, value);
+ fail(buffer);
+ }
+ }
+ }
+}
+
+START_TEST(test_attr_whitespace_normalization) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!ATTLIST doc\n"
+ " attr NMTOKENS #REQUIRED\n"
+ " ents ENTITIES #REQUIRED\n"
+ " refs IDREFS #REQUIRED>\n"
+ "]>\n"
+ "<doc attr=' a b c\t\td\te\t' refs=' id-1 \t id-2\t\t' \n"
+ " ents=' ent-1 \t\r\n"
+ " ent-2 ' >\n"
+ " <e id='id-1'/>\n"
+ " <e id='id-2'/>\n"
+ "</doc>";
+
+ XML_SetStartElementHandler(g_parser,
+ check_attr_contains_normalized_whitespace);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/*
+ * XML declaration tests.
+ */
+
+START_TEST(test_xmldecl_misplaced) {
+ expect_failure("\n"
+ "<?xml version='1.0'?>\n"
+ "<a/>",
+ XML_ERROR_MISPLACED_XML_PI,
+ "failed to report misplaced XML declaration");
+}
+END_TEST
+
+START_TEST(test_xmldecl_invalid) {
+ expect_failure("<?xml version='1.0' \xc3\xa7?>\n<doc/>", XML_ERROR_XML_DECL,
+ "Failed to report invalid XML declaration");
+}
+END_TEST
+
+START_TEST(test_xmldecl_missing_attr) {
+ expect_failure("<?xml ='1.0'?>\n<doc/>\n", XML_ERROR_XML_DECL,
+ "Failed to report missing XML declaration attribute");
+}
+END_TEST
+
+START_TEST(test_xmldecl_missing_value) {
+ expect_failure("<?xml version='1.0' encoding='us-ascii' standalone?>\n"
+ "<doc/>",
+ XML_ERROR_XML_DECL,
+ "Failed to report missing attribute value");
+}
+END_TEST
+
+/* Regression test for SF bug #584832. */
+START_TEST(test_unknown_encoding_internal_entity) {
+ const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
+ "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
+ "<test a='&foo;'/>";
+
+ XML_SetUnknownEncodingHandler(g_parser, UnknownEncodingHandler, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test unrecognised encoding handler */
+START_TEST(test_unrecognised_encoding_internal_entity) {
+ const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
+ "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
+ "<test a='&foo;'/>";
+
+ XML_SetUnknownEncodingHandler(g_parser, UnrecognisedEncodingHandler, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Unrecognised encoding not rejected");
+}
+END_TEST
+
+/* Regression test for SF bug #620106. */
+START_TEST(test_ext_entity_set_encoding) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest test_data
+ = {/* This text says it's an unsupported encoding, but it's really
+ UTF-8, which we tell Expat using XML_SetEncoding().
+ */
+ "<?xml encoding='iso-8859-3'?>\xC3\xA9", XCS("utf-8"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9");
+#else
+ const XML_Char *expected = XCS("\xc3\xa9");
+#endif
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ run_ext_character_check(text, &test_data, expected);
+}
+END_TEST
+
+/* Test external entities with no handler */
+START_TEST(test_ext_entity_no_handler) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+ run_character_check(text, XCS(""));
+}
+END_TEST
+
+/* Test UTF-8 BOM is accepted */
+START_TEST(test_ext_entity_set_bom) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest test_data = {"\xEF\xBB\xBF" /* BOM */
+ "<?xml encoding='iso-8859-3'?>"
+ "\xC3\xA9",
+ XCS("utf-8"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9");
+#else
+ const XML_Char *expected = XCS("\xc3\xa9");
+#endif
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ run_ext_character_check(text, &test_data, expected);
+}
+END_TEST
+
+/* Test that bad encodings are faulted */
+START_TEST(test_ext_entity_bad_encoding) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtFaults fault
+ = {"<?xml encoding='iso-8859-3'?>u", "Unsupported encoding not faulted",
+ XCS("unknown"), XML_ERROR_UNKNOWN_ENCODING};
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_SetUserData(g_parser, &fault);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Bad encoding should not have been accepted");
+}
+END_TEST
+
+/* Try handing an invalid encoding to an external entity parser */
+START_TEST(test_ext_entity_bad_encoding_2) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ ExtFaults fault
+ = {"<!ELEMENT doc (#PCDATA)*>", "Unknown encoding not faulted",
+ XCS("unknown-encoding"), XML_ERROR_UNKNOWN_ENCODING};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_SetUserData(g_parser, &fault);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Bad encoding not faulted in external entity handler");
+}
+END_TEST
+
+/* Test that no error is reported for unknown entities if we don't
+ read an external subset. This was fixed in Expat 1.95.5.
+*/
+START_TEST(test_wfc_undeclared_entity_unread_external_subset) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that an error is reported for unknown entities if we don't
+ have an external subset.
+*/
+START_TEST(test_wfc_undeclared_entity_no_external_subset) {
+ expect_failure("<doc>&entity;</doc>", XML_ERROR_UNDEFINED_ENTITY,
+ "Parser did not report undefined entity w/out a DTD.");
+}
+END_TEST
+
+/* Test that an error is reported for unknown entities if we don't
+ read an external subset, but have been declared standalone.
+*/
+START_TEST(test_wfc_undeclared_entity_standalone) {
+ const char *text
+ = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+
+ expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
+ "Parser did not report undefined entity (standalone).");
+}
+END_TEST
+
+/* Test that an error is reported for unknown entities if we have read
+ an external subset, and standalone is true.
+*/
+START_TEST(test_wfc_undeclared_entity_with_external_subset_standalone) {
+ const char *text
+ = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
+ "Parser did not report undefined entity (external DTD).");
+}
+END_TEST
+
+/* Test that external entity handling is not done if the parsing flag
+ * is set to UNLESS_STANDALONE
+ */
+START_TEST(test_entity_with_external_subset_unless_standalone) {
+ const char *text
+ = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ENTITY entity 'bar'>", NULL, NULL};
+
+ XML_SetParamEntityParsing(g_parser,
+ XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
+ "Parser did not report undefined entity");
+}
+END_TEST
+
+/* Test that no error is reported for unknown entities if we have read
+ an external subset, and standalone is false.
+*/
+START_TEST(test_wfc_undeclared_entity_with_external_subset) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ run_ext_character_check(text, &test_data, XCS(""));
+}
+END_TEST
+
+/* Test that an error is reported if our NotStandalone handler fails */
+START_TEST(test_not_standalone_handler_reject) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
+ expect_failure(text, XML_ERROR_NOT_STANDALONE,
+ "NotStandalone handler failed to reject");
+
+ /* Try again but without external entity handling */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
+ expect_failure(text, XML_ERROR_NOT_STANDALONE,
+ "NotStandalone handler failed to reject");
+}
+END_TEST
+
+/* Test that no error is reported if our NotStandalone handler succeeds */
+START_TEST(test_not_standalone_handler_accept) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
+ run_ext_character_check(text, &test_data, XCS(""));
+
+ /* Repeat without the external entity handler */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
+ run_character_check(text, XCS(""));
+}
+END_TEST
+
+START_TEST(test_entity_start_tag_level_greater_than_one) {
+ const char *const text = "<!DOCTYPE t1 [\n"
+ " <!ENTITY e1 'hello'>\n"
+ "]>\n"
+ "<t1>\n"
+ " <t2>&e1;</t2>\n"
+ "</t1>\n";
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text),
+ /*isFinal*/ XML_TRUE)
+ == XML_STATUS_OK);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+START_TEST(test_wfc_no_recursive_entity_refs) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY entity '&#38;entity;'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ expect_failure(text, XML_ERROR_RECURSIVE_ENTITY_REF,
+ "Parser did not report recursive entity reference.");
+}
+END_TEST
+
+START_TEST(test_no_indirectly_recursive_entity_refs) {
+ struct TestCase {
+ const char *doc;
+ bool usesParameterEntities;
+ };
+
+ const struct TestCase cases[] = {
+ // general entity + character data
+ {"<!DOCTYPE a [\n"
+ " <!ENTITY e1 '&e2;'>\n"
+ " <!ENTITY e2 '&e1;'>\n"
+ "]><a>&e2;</a>\n",
+ false},
+
+ // general entity + attribute value
+ {"<!DOCTYPE a [\n"
+ " <!ENTITY e1 '&e2;'>\n"
+ " <!ENTITY e2 '&e1;'>\n"
+ "]><a k1='&e2;' />\n",
+ false},
+
+ // parameter entity
+ {"<!DOCTYPE doc [\n"
+ " <!ENTITY % p1 '&#37;p2;'>\n"
+ " <!ENTITY % p2 '&#37;p1;'>\n"
+ " <!ENTITY % define_g \"<!ENTITY g '&#37;p2;'>\">\n"
+ " %define_g;\n"
+ "]>\n"
+ "<doc/>\n",
+ true},
+ };
+ const XML_Bool reset_or_not[] = {XML_TRUE, XML_FALSE};
+
+ for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
+ for (size_t j = 0; j < sizeof(reset_or_not) / sizeof(reset_or_not[0]);
+ j++) {
+ const XML_Bool reset_wanted = reset_or_not[j];
+ const char *const doc = cases[i].doc;
+ const bool usesParameterEntities = cases[i].usesParameterEntities;
+
+ set_subtest("[%i,reset=%i] %s", (int)i, (int)j, doc);
+
+#ifdef XML_DTD // both GE and DTD
+ const bool rejection_expected = true;
+#elif XML_GE == 1 // GE but not DTD
+ const bool rejection_expected = ! usesParameterEntities;
+#else // neither DTD nor GE
+ const bool rejection_expected = false;
+#endif
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+#ifdef XML_DTD
+ if (usesParameterEntities) {
+ assert_true(
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)
+ == 1);
+ }
+#else
+ UNUSED_P(usesParameterEntities);
+#endif // XML_DTD
+
+ const enum XML_Status status
+ = _XML_Parse_SINGLE_BYTES(parser, doc, (int)strlen(doc),
+ /*isFinal*/ XML_TRUE);
+
+ if (rejection_expected) {
+ assert_true(status == XML_STATUS_ERROR);
+ assert_true(XML_GetErrorCode(parser) == XML_ERROR_RECURSIVE_ENTITY_REF);
+ } else {
+ assert_true(status == XML_STATUS_OK);
+ }
+
+ if (reset_wanted) {
+ // This covers free'ing of (eventually) all three open entity lists by
+ // XML_ParserReset.
+ XML_ParserReset(parser, NULL);
+ }
+
+ // This covers free'ing of (eventually) all three open entity lists by
+ // XML_ParserFree (unless XML_ParserReset has already done that above).
+ XML_ParserFree(parser);
+ }
+ }
+}
+END_TEST
+
+START_TEST(test_recursive_external_parameter_entity_2) {
+ struct TestCase {
+ const char *doc;
+ enum XML_Status expectedStatus;
+ };
+
+ struct TestCase cases[] = {
+ {"<!ENTITY % p1 '%p1;'>", XML_STATUS_ERROR},
+ {"<!ENTITY % p1 '%p1;'>"
+ "<!ENTITY % p1 'first declaration wins'>",
+ XML_STATUS_ERROR},
+ {"<!ENTITY % p1 'first declaration wins'>"
+ "<!ENTITY % p1 '%p1;'>",
+ XML_STATUS_OK},
+ {"<!ENTITY % p1 '&#37;p1;'>", XML_STATUS_OK},
+ };
+
+ for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
+ const char *const doc = cases[i].doc;
+ const enum XML_Status expectedStatus = cases[i].expectedStatus;
+ set_subtest("%s", doc);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+
+ XML_Parser ext_parser = XML_ExternalEntityParserCreate(parser, NULL, NULL);
+ assert_true(ext_parser != NULL);
+
+ const enum XML_Status actualStatus
+ = _XML_Parse_SINGLE_BYTES(ext_parser, doc, (int)strlen(doc), XML_TRUE);
+
+ assert_true(actualStatus == expectedStatus);
+ if (actualStatus != XML_STATUS_OK) {
+ assert_true(XML_GetErrorCode(ext_parser)
+ == XML_ERROR_RECURSIVE_ENTITY_REF);
+ }
+
+ XML_ParserFree(ext_parser);
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+/* Test incomplete external entities are faulted */
+START_TEST(test_ext_entity_invalid_parse) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ const ExtFaults faults[]
+ = {{"<", "Incomplete element declaration not faulted", NULL,
+ XML_ERROR_UNCLOSED_TOKEN},
+ {"<\xe2\x82", /* First two bytes of a three-byte char */
+ "Incomplete character not faulted", NULL, XML_ERROR_PARTIAL_CHAR},
+ {"<tag>\xe2\x82", "Incomplete character in CDATA not faulted", NULL,
+ XML_ERROR_PARTIAL_CHAR},
+ {NULL, NULL, NULL, XML_ERROR_NONE}};
+ const ExtFaults *fault = faults;
+
+ for (; fault->parse_text != NULL; fault++) {
+ set_subtest("\"%s\"", fault->parse_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_SetUserData(g_parser, (void *)fault);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Parser did not report external entity error");
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* Regression test for SF bug #483514. */
+START_TEST(test_dtd_default_handling) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
+ "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "<!ATTLIST doc a CDATA #IMPLIED>\n"
+ "<?pi in dtd?>\n"
+ "<!--comment in dtd-->\n"
+ "]><doc/>";
+
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
+ XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
+ XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
+ XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
+ XML_SetCommentHandler(g_parser, dummy_comment_handler);
+ XML_SetStartCdataSectionHandler(g_parser, dummy_start_cdata_handler);
+ XML_SetEndCdataSectionHandler(g_parser, dummy_end_cdata_handler);
+ run_character_check(text, XCS("\n\n\n\n\n\n\n<doc/>"));
+}
+END_TEST
+
+/* Test handling of attribute declarations */
+START_TEST(test_dtd_attr_handling) {
+ const char *prolog = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc EMPTY>\n";
+ AttTest attr_data[]
+ = {{"<!ATTLIST doc a ( one | two | three ) #REQUIRED>\n"
+ "]>"
+ "<doc a='two'/>",
+ XCS("doc"), XCS("a"),
+ XCS("(one|two|three)"), /* Extraneous spaces will be removed */
+ NULL, XML_TRUE},
+ {"<!NOTATION foo SYSTEM 'http://example.org/foo'>\n"
+ "<!ATTLIST doc a NOTATION (foo) #IMPLIED>\n"
+ "]>"
+ "<doc/>",
+ XCS("doc"), XCS("a"), XCS("NOTATION(foo)"), NULL, XML_FALSE},
+ {"<!ATTLIST doc a NOTATION (foo) 'bar'>\n"
+ "]>"
+ "<doc/>",
+ XCS("doc"), XCS("a"), XCS("NOTATION(foo)"), XCS("bar"), XML_FALSE},
+ {"<!ATTLIST doc a CDATA '\xdb\xb2'>\n"
+ "]>"
+ "<doc/>",
+ XCS("doc"), XCS("a"), XCS("CDATA"),
+#ifdef XML_UNICODE
+ XCS("\x06f2"),
+#else
+ XCS("\xdb\xb2"),
+#endif
+ XML_FALSE},
+ {NULL, NULL, NULL, NULL, NULL, XML_FALSE}};
+ AttTest *test;
+
+ for (test = attr_data; test->definition != NULL; test++) {
+ set_subtest("%s", test->definition);
+ XML_SetAttlistDeclHandler(g_parser, verify_attlist_decl_handler);
+ XML_SetUserData(g_parser, test);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, prolog, (int)strlen(prolog),
+ XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, test->definition,
+ (int)strlen(test->definition), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* See related SF bug #673791.
+ When namespace processing is enabled, setting the namespace URI for
+ a prefix is not allowed; this test ensures that it *is* allowed
+ when namespace processing is not enabled.
+ (See Namespaces in XML, section 2.)
+*/
+START_TEST(test_empty_ns_without_namespaces) {
+ const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
+ " <e xmlns:prefix=''/>\n"
+ "</doc>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test for SF bug #824420.
+ Checks that an xmlns:prefix attribute set in an attribute's default
+ value isn't misinterpreted.
+*/
+START_TEST(test_ns_in_attribute_default_without_namespaces) {
+ const char *text = "<!DOCTYPE e:element [\n"
+ " <!ATTLIST e:element\n"
+ " xmlns:e CDATA 'http://example.org/'>\n"
+ " ]>\n"
+ "<e:element/>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test for SF bug #1515266: missing check of stopped
+ parser in doContext() 'for' loop. */
+START_TEST(test_stop_parser_between_char_data_calls) {
+ /* The sample data must be big enough that there are two calls to
+ the character data handler from within the inner "for" loop of
+ the XML_TOK_DATA_CHARS case in doContent(), and the character
+ handler must stop the parser and clear the character data
+ handler.
+ */
+ const char *text = long_character_data_text;
+
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ g_resumable = XML_FALSE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_ABORTED)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test for SF bug #1515266: missing check of stopped
+ parser in doContext() 'for' loop. */
+START_TEST(test_suspend_parser_between_char_data_calls) {
+ /* The sample data must be big enough that there are two calls to
+ the character data handler from within the inner "for" loop of
+ the XML_TOK_DATA_CHARS case in doContent(), and the character
+ handler must stop the parser and clear the character data
+ handler.
+ */
+ const char *text = long_character_data_text;
+
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ g_resumable = XML_TRUE;
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
+ xml_failure(g_parser);
+ /* Try parsing directly */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Attempt to continue parse while suspended not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
+ fail("Suspended parse not faulted with correct error");
+}
+END_TEST
+
+/* Test repeated calls to XML_StopParser are handled correctly */
+START_TEST(test_repeated_stop_parser_between_char_data_calls) {
+ const char *text = long_character_data_text;
+
+ XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
+ g_resumable = XML_FALSE;
+ g_abortable = XML_FALSE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Failed to double-stop parser");
+
+ XML_ParserReset(g_parser, NULL);
+ XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
+ g_resumable = XML_TRUE;
+ g_abortable = XML_FALSE;
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ fail("Failed to double-suspend parser");
+
+ XML_ParserReset(g_parser, NULL);
+ XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
+ g_resumable = XML_TRUE;
+ g_abortable = XML_TRUE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Failed to suspend-abort parser");
+}
+END_TEST
+
+START_TEST(test_good_cdata_ascii) {
+ const char *text = "<a><![CDATA[<greeting>Hello, world!</greeting>]]></a>";
+ const XML_Char *expected = XCS("<greeting>Hello, world!</greeting>");
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ /* Add start and end handlers for coverage */
+ XML_SetStartCdataSectionHandler(g_parser, dummy_start_cdata_handler);
+ XML_SetEndCdataSectionHandler(g_parser, dummy_end_cdata_handler);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+
+ /* Try again, this time with a default handler */
+ XML_ParserReset(g_parser, NULL);
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_good_cdata_utf16) {
+ /* Test data is:
+ * <?xml version='1.0' encoding='utf-16'?>
+ * <a><![CDATA[hello]]></a>
+ */
+ const char text[]
+ = "\0<\0?\0x\0m\0l\0"
+ " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
+ " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
+ "1\0"
+ "6\0'"
+ "\0?\0>\0\n"
+ "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>";
+ const XML_Char *expected = XCS("hello");
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_good_cdata_utf16_le) {
+ /* Test data is:
+ * <?xml version='1.0' encoding='utf-16'?>
+ * <a><![CDATA[hello]]></a>
+ */
+ const char text[]
+ = "<\0?\0x\0m\0l\0"
+ " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
+ " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
+ "1\0"
+ "6\0'"
+ "\0?\0>\0\n"
+ "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>\0";
+ const XML_Char *expected = XCS("hello");
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test UTF16 conversion of a long cdata string */
+
+/* 16 characters: handy macro to reduce visual clutter */
+#define A_TO_P_IN_UTF16 "\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"
+
+START_TEST(test_long_cdata_utf16) {
+ /* Test data is:
+ * <?xlm version='1.0' encoding='utf-16'?>
+ * <a><![CDATA[
+ * ABCDEFGHIJKLMNOP
+ * ]]></a>
+ */
+ const char text[]
+ = "\0<\0?\0x\0m\0l\0 "
+ "\0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0 "
+ "\0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0\x31\0\x36\0'\0?\0>"
+ "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
+ /* 64 characters per line */
+ /* clang-format off */
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
+ A_TO_P_IN_UTF16
+ /* clang-format on */
+ "\0]\0]\0>\0<\0/\0a\0>";
+ const XML_Char *expected =
+ /* clang-format off */
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
+ XCS("ABCDEFGHIJKLMNOP");
+ /* clang-format on */
+ CharData storage;
+ void *buffer;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ buffer = XML_GetBuffer(g_parser, sizeof(text) - 1);
+ if (buffer == NULL)
+ fail("Could not allocate parse buffer");
+ assert(buffer != NULL);
+ memcpy(buffer, text, sizeof(text) - 1);
+ if (XML_ParseBuffer(g_parser, sizeof(text) - 1, XML_TRUE) == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test handling of multiple unit UTF-16 characters */
+START_TEST(test_multichar_cdata_utf16) {
+ /* Test data is:
+ * <?xml version='1.0' encoding='utf-16'?>
+ * <a><![CDATA[{MINIM}{CROTCHET}]]></a>
+ *
+ * where {MINIM} is U+1d15e (a minim or half-note)
+ * UTF-16: 0xd834 0xdd5e
+ * UTF-8: 0xf0 0x9d 0x85 0x9e
+ * and {CROTCHET} is U+1d15f (a crotchet or quarter-note)
+ * UTF-16: 0xd834 0xdd5f
+ * UTF-8: 0xf0 0x9d 0x85 0x9f
+ */
+ const char text[] = "\0<\0?\0x\0m\0l\0"
+ " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
+ " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
+ "1\0"
+ "6\0'"
+ "\0?\0>\0\n"
+ "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
+ "\xd8\x34\xdd\x5e\xd8\x34\xdd\x5f"
+ "\0]\0]\0>\0<\0/\0a\0>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\xd834\xdd5e\xd834\xdd5f");
+#else
+ const XML_Char *expected = XCS("\xf0\x9d\x85\x9e\xf0\x9d\x85\x9f");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that an element name with a UTF-16 surrogate pair is rejected */
+START_TEST(test_utf16_bad_surrogate_pair) {
+ /* Test data is:
+ * <?xml version='1.0' encoding='utf-16'?>
+ * <a><![CDATA[{BADLINB}]]></a>
+ *
+ * where {BADLINB} is U+10000 (the first Linear B character)
+ * with the UTF-16 surrogate pair in the wrong order, i.e.
+ * 0xdc00 0xd800
+ */
+ const char text[] = "\0<\0?\0x\0m\0l\0"
+ " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
+ " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
+ "1\0"
+ "6\0'"
+ "\0?\0>\0\n"
+ "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
+ "\xdc\x00\xd8\x00"
+ "\0]\0]\0>\0<\0/\0a\0>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Reversed UTF-16 surrogate pair not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_bad_cdata) {
+ struct CaseData {
+ const char *text;
+ enum XML_Error expectedError;
+ };
+
+ struct CaseData cases[]
+ = {{"<a><", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><!", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><![", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><![C", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><![CD", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><![CDA", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><![CDAT", XML_ERROR_UNCLOSED_TOKEN},
+ {"<a><![CDATA", XML_ERROR_UNCLOSED_TOKEN},
+
+ {"<a><![CDATA[", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {"<a><![CDATA[]", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {"<a><![CDATA[]]", XML_ERROR_UNCLOSED_CDATA_SECTION},
+
+ {"<a><!<a/>", XML_ERROR_INVALID_TOKEN},
+ {"<a><![<a/>", XML_ERROR_UNCLOSED_TOKEN}, /* ?! */
+ {"<a><![C<a/>", XML_ERROR_UNCLOSED_TOKEN}, /* ?! */
+ {"<a><![CD<a/>", XML_ERROR_INVALID_TOKEN},
+ {"<a><![CDA<a/>", XML_ERROR_INVALID_TOKEN},
+ {"<a><![CDAT<a/>", XML_ERROR_INVALID_TOKEN},
+ {"<a><![CDATA<a/>", XML_ERROR_INVALID_TOKEN},
+
+ {"<a><![CDATA[<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {"<a><![CDATA[]<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {"<a><![CDATA[]]<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION}};
+
+ size_t i = 0;
+ for (; i < sizeof(cases) / sizeof(struct CaseData); i++) {
+ set_subtest("%s", cases[i].text);
+ const enum XML_Status actualStatus = _XML_Parse_SINGLE_BYTES(
+ g_parser, cases[i].text, (int)strlen(cases[i].text), XML_TRUE);
+ const enum XML_Error actualError = XML_GetErrorCode(g_parser);
+
+ assert(actualStatus == XML_STATUS_ERROR);
+
+ if (actualError != cases[i].expectedError) {
+ char message[100];
+ snprintf(message, sizeof(message),
+ "Expected error %d but got error %d for case %u: \"%s\"\n",
+ cases[i].expectedError, actualError, (unsigned int)i + 1,
+ cases[i].text);
+ fail(message);
+ }
+
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* Test failures in UTF-16 CDATA */
+START_TEST(test_bad_cdata_utf16) {
+ struct CaseData {
+ size_t text_bytes;
+ const char *text;
+ enum XML_Error expected_error;
+ };
+
+ const char prolog[] = "\0<\0?\0x\0m\0l\0"
+ " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
+ " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
+ "1\0"
+ "6\0'"
+ "\0?\0>\0\n"
+ "\0<\0a\0>";
+ struct CaseData cases[] = {
+ {1, "\0", XML_ERROR_UNCLOSED_TOKEN},
+ {2, "\0<", XML_ERROR_UNCLOSED_TOKEN},
+ {3, "\0<\0", XML_ERROR_UNCLOSED_TOKEN},
+ {4, "\0<\0!", XML_ERROR_UNCLOSED_TOKEN},
+ {5, "\0<\0!\0", XML_ERROR_UNCLOSED_TOKEN},
+ {6, "\0<\0!\0[", XML_ERROR_UNCLOSED_TOKEN},
+ {7, "\0<\0!\0[\0", XML_ERROR_UNCLOSED_TOKEN},
+ {8, "\0<\0!\0[\0C", XML_ERROR_UNCLOSED_TOKEN},
+ {9, "\0<\0!\0[\0C\0", XML_ERROR_UNCLOSED_TOKEN},
+ {10, "\0<\0!\0[\0C\0D", XML_ERROR_UNCLOSED_TOKEN},
+ {11, "\0<\0!\0[\0C\0D\0", XML_ERROR_UNCLOSED_TOKEN},
+ {12, "\0<\0!\0[\0C\0D\0A", XML_ERROR_UNCLOSED_TOKEN},
+ {13, "\0<\0!\0[\0C\0D\0A\0", XML_ERROR_UNCLOSED_TOKEN},
+ {14, "\0<\0!\0[\0C\0D\0A\0T", XML_ERROR_UNCLOSED_TOKEN},
+ {15, "\0<\0!\0[\0C\0D\0A\0T\0", XML_ERROR_UNCLOSED_TOKEN},
+ {16, "\0<\0!\0[\0C\0D\0A\0T\0A", XML_ERROR_UNCLOSED_TOKEN},
+ {17, "\0<\0!\0[\0C\0D\0A\0T\0A\0", XML_ERROR_UNCLOSED_TOKEN},
+ {18, "\0<\0!\0[\0C\0D\0A\0T\0A\0[", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {19, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {20, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z", XML_ERROR_UNCLOSED_CDATA_SECTION},
+ /* Now add a four-byte UTF-16 character */
+ {21, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8",
+ XML_ERROR_UNCLOSED_CDATA_SECTION},
+ {22, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34", XML_ERROR_PARTIAL_CHAR},
+ {23, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34\xdd",
+ XML_ERROR_PARTIAL_CHAR},
+ {24, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34\xdd\x5e",
+ XML_ERROR_UNCLOSED_CDATA_SECTION}};
+ size_t i;
+
+ for (i = 0; i < sizeof(cases) / sizeof(struct CaseData); i++) {
+ set_subtest("case %lu", (long unsigned)(i + 1));
+ enum XML_Status actual_status;
+ enum XML_Error actual_error;
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, prolog, (int)sizeof(prolog) - 1,
+ XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ actual_status = _XML_Parse_SINGLE_BYTES(g_parser, cases[i].text,
+ (int)cases[i].text_bytes, XML_TRUE);
+ assert(actual_status == XML_STATUS_ERROR);
+ actual_error = XML_GetErrorCode(g_parser);
+ if (actual_error != cases[i].expected_error) {
+ char message[1024];
+
+ snprintf(message, sizeof(message),
+ "Expected error %d (%" XML_FMT_STR "), got %d (%" XML_FMT_STR
+ ") for case %lu\n",
+ cases[i].expected_error,
+ XML_ErrorString(cases[i].expected_error), actual_error,
+ XML_ErrorString(actual_error), (long unsigned)(i + 1));
+ fail(message);
+ }
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* Test stopping the parser in cdata handler */
+START_TEST(test_stop_parser_between_cdata_calls) {
+ const char *text = long_cdata_text;
+
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ g_resumable = XML_FALSE;
+ expect_failure(text, XML_ERROR_ABORTED, "Parse not aborted in CDATA handler");
+}
+END_TEST
+
+/* Test suspending the parser in cdata handler */
+START_TEST(test_suspend_parser_between_cdata_calls) {
+ if (g_chunkSize != 0) {
+ // this test does not use SINGLE_BYTES, because of suspension
+ return;
+ }
+
+ const char *text = long_cdata_text;
+ enum XML_Status result;
+
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ g_resumable = XML_TRUE;
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ result = XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE);
+ if (result != XML_STATUS_SUSPENDED) {
+ if (result == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ fail("Parse not suspended in CDATA handler");
+ }
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test memory allocation functions */
+START_TEST(test_memory_allocation) {
+ char *buffer = (char *)XML_MemMalloc(g_parser, 256);
+ char *p;
+
+ if (buffer == NULL) {
+ fail("Allocation failed");
+ } else {
+ /* Try writing to memory; some OSes try to cheat! */
+ buffer[0] = 'T';
+ buffer[1] = 'E';
+ buffer[2] = 'S';
+ buffer[3] = 'T';
+ buffer[4] = '\0';
+ if (strcmp(buffer, "TEST") != 0) {
+ fail("Memory not writable");
+ } else {
+ p = (char *)XML_MemRealloc(g_parser, buffer, 512);
+ if (p == NULL) {
+ fail("Reallocation failed");
+ } else {
+ /* Write again, just to be sure */
+ buffer = p;
+ buffer[0] = 'V';
+ if (strcmp(buffer, "VEST") != 0) {
+ fail("Reallocated memory not writable");
+ }
+ }
+ }
+ XML_MemFree(g_parser, buffer);
+ }
+}
+END_TEST
+
+/* Test XML_DefaultCurrent() passes handling on correctly */
+START_TEST(test_default_current) {
+ const char *text = "<doc>hell]</doc>";
+ const char *entity_text = "<!DOCTYPE doc [\n"
+ "<!ENTITY entity '&#37;'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ set_subtest("with defaulting");
+ {
+ struct handler_record_list storage;
+ storage.count = 0;
+ XML_SetDefaultHandler(g_parser, record_default_handler);
+ XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ int i = 0;
+ assert_record_handler_called(&storage, i++, "record_default_handler", 5);
+ // we should have gotten one or more cdata callbacks, totaling 5 chars
+ int cdata_len_remaining = 5;
+ while (cdata_len_remaining > 0) {
+ const struct handler_record_entry *c_entry
+ = handler_record_get(&storage, i++);
+ assert_true(strcmp(c_entry->name, "record_cdata_handler") == 0);
+ assert_true(c_entry->arg > 0);
+ assert_true(c_entry->arg <= cdata_len_remaining);
+ cdata_len_remaining -= c_entry->arg;
+ // default handler must follow, with the exact same len argument.
+ assert_record_handler_called(&storage, i++, "record_default_handler",
+ c_entry->arg);
+ }
+ assert_record_handler_called(&storage, i++, "record_default_handler", 6);
+ assert_true(storage.count == i);
+ }
+
+ /* Again, without the defaulting */
+ set_subtest("no defaulting");
+ {
+ struct handler_record_list storage;
+ storage.count = 0;
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandler(g_parser, record_default_handler);
+ XML_SetCharacterDataHandler(g_parser, record_cdata_nodefault_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ int i = 0;
+ assert_record_handler_called(&storage, i++, "record_default_handler", 5);
+ // we should have gotten one or more cdata callbacks, totaling 5 chars
+ int cdata_len_remaining = 5;
+ while (cdata_len_remaining > 0) {
+ const struct handler_record_entry *c_entry
+ = handler_record_get(&storage, i++);
+ assert_true(strcmp(c_entry->name, "record_cdata_nodefault_handler") == 0);
+ assert_true(c_entry->arg > 0);
+ assert_true(c_entry->arg <= cdata_len_remaining);
+ cdata_len_remaining -= c_entry->arg;
+ }
+ assert_record_handler_called(&storage, i++, "record_default_handler", 6);
+ assert_true(storage.count == i);
+ }
+
+ /* Now with an internal entity to complicate matters */
+ set_subtest("with internal entity");
+ {
+ struct handler_record_list storage;
+ storage.count = 0;
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandler(g_parser, record_default_handler);
+ XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
+ XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* The default handler suppresses the entity */
+ assert_record_handler_called(&storage, 0, "record_default_handler", 9);
+ assert_record_handler_called(&storage, 1, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 2, "record_default_handler", 3);
+ assert_record_handler_called(&storage, 3, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 4, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 5, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 6, "record_default_handler", 8);
+ assert_record_handler_called(&storage, 7, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 8, "record_default_handler", 6);
+ assert_record_handler_called(&storage, 9, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 10, "record_default_handler", 7);
+ assert_record_handler_called(&storage, 11, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 12, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 13, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 14, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 15, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 16, "record_default_handler", 5);
+ assert_record_handler_called(&storage, 17, "record_default_handler", 8);
+ assert_record_handler_called(&storage, 18, "record_default_handler", 6);
+ assert_true(storage.count == 19);
+ }
+
+ /* Again, with a skip handler */
+ set_subtest("with skip handler");
+ {
+ struct handler_record_list storage;
+ storage.count = 0;
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandler(g_parser, record_default_handler);
+ XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
+ XML_SetSkippedEntityHandler(g_parser, record_skip_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
+ XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* The default handler suppresses the entity */
+ assert_record_handler_called(&storage, 0, "record_default_handler", 9);
+ assert_record_handler_called(&storage, 1, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 2, "record_default_handler", 3);
+ assert_record_handler_called(&storage, 3, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 4, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 5, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 6, "record_default_handler", 8);
+ assert_record_handler_called(&storage, 7, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 8, "record_default_handler", 6);
+ assert_record_handler_called(&storage, 9, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 10, "record_default_handler", 7);
+ assert_record_handler_called(&storage, 11, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 12, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 13, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 14, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 15, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 16, "record_default_handler", 5);
+ assert_record_handler_called(&storage, 17, "record_skip_handler", 0);
+ assert_record_handler_called(&storage, 18, "record_default_handler", 6);
+ assert_true(storage.count == 19);
+ }
+
+ /* This time, allow the entity through */
+ set_subtest("allow entity");
+ {
+ struct handler_record_list storage;
+ storage.count = 0;
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandlerExpand(g_parser, record_default_handler);
+ XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
+ XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ assert_record_handler_called(&storage, 0, "record_default_handler", 9);
+ assert_record_handler_called(&storage, 1, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 2, "record_default_handler", 3);
+ assert_record_handler_called(&storage, 3, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 4, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 5, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 6, "record_default_handler", 8);
+ assert_record_handler_called(&storage, 7, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 8, "record_default_handler", 6);
+ assert_record_handler_called(&storage, 9, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 10, "record_default_handler", 7);
+ assert_record_handler_called(&storage, 11, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 12, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 13, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 14, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 15, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 16, "record_default_handler", 5);
+ assert_record_handler_called(&storage, 17, "record_cdata_handler", 1);
+ assert_record_handler_called(&storage, 18, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 19, "record_default_handler", 6);
+ assert_true(storage.count == 20);
+ }
+
+ /* Finally, without passing the cdata to the default handler */
+ set_subtest("not passing cdata");
+ {
+ struct handler_record_list storage;
+ storage.count = 0;
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandlerExpand(g_parser, record_default_handler);
+ XML_SetCharacterDataHandler(g_parser, record_cdata_nodefault_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
+ XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ assert_record_handler_called(&storage, 0, "record_default_handler", 9);
+ assert_record_handler_called(&storage, 1, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 2, "record_default_handler", 3);
+ assert_record_handler_called(&storage, 3, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 4, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 5, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 6, "record_default_handler", 8);
+ assert_record_handler_called(&storage, 7, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 8, "record_default_handler", 6);
+ assert_record_handler_called(&storage, 9, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 10, "record_default_handler", 7);
+ assert_record_handler_called(&storage, 11, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 12, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 13, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 14, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 15, "record_default_handler", 1);
+ assert_record_handler_called(&storage, 16, "record_default_handler", 5);
+ assert_record_handler_called(&storage, 17, "record_cdata_nodefault_handler",
+ 1);
+ assert_record_handler_called(&storage, 18, "record_default_handler", 6);
+ assert_true(storage.count == 19);
+ }
+}
+END_TEST
+
+/* Test DTD element parsing code paths */
+START_TEST(test_dtd_elements) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc (chapter)>\n"
+ "<!ELEMENT chapter (#PCDATA)>\n"
+ "]>\n"
+ "<doc><chapter>Wombats are go</chapter></doc>";
+
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+static void XMLCALL
+element_decl_check_model(void *userData, const XML_Char *name,
+ XML_Content *model) {
+ UNUSED_P(userData);
+ uint32_t errorFlags = 0;
+
+ /* Expected model array structure is this:
+ * [0] (type 6, quant 0)
+ * [1] (type 5, quant 0)
+ * [3] (type 4, quant 0, name "bar")
+ * [4] (type 4, quant 0, name "foo")
+ * [5] (type 4, quant 3, name "xyz")
+ * [2] (type 4, quant 2, name "zebra")
+ */
+ errorFlags |= ((xcstrcmp(name, XCS("junk")) == 0) ? 0 : (1u << 0));
+ errorFlags |= ((model != NULL) ? 0 : (1u << 1));
+
+ if (model != NULL) {
+ errorFlags |= ((model[0].type == XML_CTYPE_SEQ) ? 0 : (1u << 2));
+ errorFlags |= ((model[0].quant == XML_CQUANT_NONE) ? 0 : (1u << 3));
+ errorFlags |= ((model[0].numchildren == 2) ? 0 : (1u << 4));
+ errorFlags |= ((model[0].children == &model[1]) ? 0 : (1u << 5));
+ errorFlags |= ((model[0].name == NULL) ? 0 : (1u << 6));
+
+ errorFlags |= ((model[1].type == XML_CTYPE_CHOICE) ? 0 : (1u << 7));
+ errorFlags |= ((model[1].quant == XML_CQUANT_NONE) ? 0 : (1u << 8));
+ errorFlags |= ((model[1].numchildren == 3) ? 0 : (1u << 9));
+ errorFlags |= ((model[1].children == &model[3]) ? 0 : (1u << 10));
+ errorFlags |= ((model[1].name == NULL) ? 0 : (1u << 11));
+
+ errorFlags |= ((model[2].type == XML_CTYPE_NAME) ? 0 : (1u << 12));
+ errorFlags |= ((model[2].quant == XML_CQUANT_REP) ? 0 : (1u << 13));
+ errorFlags |= ((model[2].numchildren == 0) ? 0 : (1u << 14));
+ errorFlags |= ((model[2].children == NULL) ? 0 : (1u << 15));
+ errorFlags
+ |= ((xcstrcmp(model[2].name, XCS("zebra")) == 0) ? 0 : (1u << 16));
+
+ errorFlags |= ((model[3].type == XML_CTYPE_NAME) ? 0 : (1u << 17));
+ errorFlags |= ((model[3].quant == XML_CQUANT_NONE) ? 0 : (1u << 18));
+ errorFlags |= ((model[3].numchildren == 0) ? 0 : (1u << 19));
+ errorFlags |= ((model[3].children == NULL) ? 0 : (1u << 20));
+ errorFlags |= ((xcstrcmp(model[3].name, XCS("bar")) == 0) ? 0 : (1u << 21));
+
+ errorFlags |= ((model[4].type == XML_CTYPE_NAME) ? 0 : (1u << 22));
+ errorFlags |= ((model[4].quant == XML_CQUANT_NONE) ? 0 : (1u << 23));
+ errorFlags |= ((model[4].numchildren == 0) ? 0 : (1u << 24));
+ errorFlags |= ((model[4].children == NULL) ? 0 : (1u << 25));
+ errorFlags |= ((xcstrcmp(model[4].name, XCS("foo")) == 0) ? 0 : (1u << 26));
+
+ errorFlags |= ((model[5].type == XML_CTYPE_NAME) ? 0 : (1u << 27));
+ errorFlags |= ((model[5].quant == XML_CQUANT_PLUS) ? 0 : (1u << 28));
+ errorFlags |= ((model[5].numchildren == 0) ? 0 : (1u << 29));
+ errorFlags |= ((model[5].children == NULL) ? 0 : (1u << 30));
+ errorFlags |= ((xcstrcmp(model[5].name, XCS("xyz")) == 0) ? 0 : (1u << 31));
+ }
+
+ XML_SetUserData(g_parser, (void *)(uintptr_t)errorFlags);
+ XML_FreeContentModel(g_parser, model);
+}
+
+START_TEST(test_dtd_elements_nesting) {
+ // Payload inspired by a test in Perl's XML::Parser
+ const char *text = "<!DOCTYPE foo [\n"
+ "<!ELEMENT junk ((bar|foo|xyz+), zebra*)>\n"
+ "]>\n"
+ "<foo/>";
+
+ XML_SetUserData(g_parser, (void *)(uintptr_t)-1);
+
+ XML_SetElementDeclHandler(g_parser, element_decl_check_model);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ if ((uint32_t)(uintptr_t)XML_GetUserData(g_parser) != 0)
+ fail("Element declaration model regression detected");
+}
+END_TEST
+
+/* Test foreign DTD handling */
+START_TEST(test_set_foreign_dtd) {
+ const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n";
+ const char *text2 = "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ /* Check hash salt is passed through too */
+ XML_SetHashSalt(g_parser, 0x12345678);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ /* Add a default handler to exercise more code paths */
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+ if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
+ fail("Could not set foreign DTD");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ /* Ensure that trying to set the DTD after parsing has started
+ * is faulted, even if it's the same setting.
+ */
+ if (XML_UseForeignDTD(g_parser, XML_TRUE)
+ != XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING)
+ fail("Failed to reject late foreign DTD setting");
+ /* Ditto for the hash salt */
+ if (XML_SetHashSalt(g_parser, 0x23456789))
+ fail("Failed to reject late hash salt change");
+
+ /* Now finish the parse */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test foreign DTD handling with a failing NotStandalone handler */
+START_TEST(test_foreign_dtd_not_standalone) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
+ if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
+ fail("Could not set foreign DTD");
+ expect_failure(text, XML_ERROR_NOT_STANDALONE,
+ "NotStandalonehandler failed to reject");
+}
+END_TEST
+
+/* Test invalid character in a foreign DTD is faulted */
+START_TEST(test_invalid_foreign_dtd) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<doc>&entity;</doc>";
+ ExtFaults test_data
+ = {"$", "Dollar not faulted", NULL, XML_ERROR_INVALID_TOKEN};
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_UseForeignDTD(g_parser, XML_TRUE);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Bad DTD should not have been accepted");
+}
+END_TEST
+
+/* Test foreign DTD use with a doctype */
+START_TEST(test_foreign_dtd_with_doctype) {
+ const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc [<!ENTITY entity 'hello world'>]>\n";
+ const char *text2 = "<doc>&entity;</doc>";
+ ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
+
+ /* Check hash salt is passed through too */
+ XML_SetHashSalt(g_parser, 0x12345678);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ /* Add a default handler to exercise more code paths */
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+ if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
+ fail("Could not set foreign DTD");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ /* Ensure that trying to set the DTD after parsing has started
+ * is faulted, even if it's the same setting.
+ */
+ if (XML_UseForeignDTD(g_parser, XML_TRUE)
+ != XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING)
+ fail("Failed to reject late foreign DTD setting");
+ /* Ditto for the hash salt */
+ if (XML_SetHashSalt(g_parser, 0x23456789))
+ fail("Failed to reject late hash salt change");
+
+ /* Now finish the parse */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test XML_UseForeignDTD with no external subset present */
+START_TEST(test_foreign_dtd_without_external_subset) {
+ const char *text = "<!DOCTYPE doc [<!ENTITY foo 'bar'>]>\n"
+ "<doc>&foo;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, NULL);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
+ XML_UseForeignDTD(g_parser, XML_TRUE);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_empty_foreign_dtd) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<doc>&entity;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
+ XML_UseForeignDTD(g_parser, XML_TRUE);
+ expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
+ "Undefined entity not faulted");
+}
+END_TEST
+
+/* Test XML Base is set and unset appropriately */
+START_TEST(test_set_base) {
+ const XML_Char *old_base;
+ const XML_Char *new_base = XCS("/local/file/name.xml");
+
+ old_base = XML_GetBase(g_parser);
+ if (XML_SetBase(g_parser, new_base) != XML_STATUS_OK)
+ fail("Unable to set base");
+ if (xcstrcmp(XML_GetBase(g_parser), new_base) != 0)
+ fail("Base setting not correct");
+ if (XML_SetBase(g_parser, NULL) != XML_STATUS_OK)
+ fail("Unable to NULL base");
+ if (XML_GetBase(g_parser) != NULL)
+ fail("Base setting not nulled");
+ XML_SetBase(g_parser, old_base);
+}
+END_TEST
+
+/* Test attribute counts, indexing, etc */
+START_TEST(test_attributes) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc (tag)>\n"
+ "<!ATTLIST doc id ID #REQUIRED>\n"
+ "]>"
+ "<doc a='1' id='one' b='2'>"
+ "<tag c='3'/>"
+ "</doc>";
+ AttrInfo doc_info[] = {{XCS("a"), XCS("1")},
+ {XCS("b"), XCS("2")},
+ {XCS("id"), XCS("one")},
+ {NULL, NULL}};
+ AttrInfo tag_info[] = {{XCS("c"), XCS("3")}, {NULL, NULL}};
+ ElementInfo info[] = {{XCS("doc"), 3, XCS("id"), NULL},
+ {XCS("tag"), 1, NULL, NULL},
+ {NULL, 0, NULL, NULL}};
+ info[0].attributes = doc_info;
+ info[1].attributes = tag_info;
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ ParserAndElementInfo parserAndElementInfos = {
+ parser,
+ info,
+ };
+
+ XML_SetStartElementHandler(parser, counting_start_element_handler);
+ XML_SetUserData(parser, &parserAndElementInfos);
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ XML_ParserFree(parser);
+}
+END_TEST
+
+/* Test reset works correctly in the middle of processing an internal
+ * entity. Exercises some obscure code in XML_ParserReset().
+ */
+START_TEST(test_reset_in_entity) {
+ if (g_chunkSize != 0) {
+ // this test does not use SINGLE_BYTES, because of suspension
+ return;
+ }
+
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ENTITY wombat 'wom'>\n"
+ "<!ENTITY entity 'hi &wom; there'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+ XML_ParsingStatus status;
+
+ g_resumable = XML_TRUE;
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ XML_GetParsingStatus(g_parser, &status);
+ if (status.parsing != XML_SUSPENDED)
+ fail("Parsing status not SUSPENDED");
+ XML_ParserReset(g_parser, NULL);
+ XML_GetParsingStatus(g_parser, &status);
+ if (status.parsing != XML_INITIALIZED)
+ fail("Parsing status doesn't reset to INITIALIZED");
+}
+END_TEST
+
+/* Test that resume correctly passes through parse errors */
+START_TEST(test_resume_invalid_parse) {
+ const char *text = "<doc>Hello</doc"; /* Missing closing wedge */
+
+ g_resumable = XML_TRUE;
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (XML_ResumeParser(g_parser) == XML_STATUS_OK)
+ fail("Resumed invalid parse not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_UNCLOSED_TOKEN)
+ fail("Invalid parse not correctly faulted");
+}
+END_TEST
+
+/* Test that re-suspended parses are correctly passed through */
+START_TEST(test_resume_resuspended) {
+ const char *text = "<doc>Hello<meep/>world</doc>";
+
+ g_resumable = XML_TRUE;
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ g_resumable = XML_TRUE;
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
+ fail("Resumption not suspended");
+ /* This one should succeed and finish up */
+ if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that CDATA shows up correctly through a default handler */
+START_TEST(test_cdata_default) {
+ const char *text = "<doc><![CDATA[Hello\nworld]]></doc>";
+ const XML_Char *expected = XCS("<doc><![CDATA[Hello\nworld]]></doc>");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test resetting a subordinate parser does exactly nothing */
+START_TEST(test_subordinate_reset) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_resetter);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test suspending a subordinate parser */
+START_TEST(test_subordinate_suspend) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_suspender);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test suspending a subordinate parser from an XML declaration */
+/* Increases code coverage of the tests */
+
+START_TEST(test_subordinate_xdecl_suspend) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!ENTITY entity SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_suspend_xmldecl);
+ g_resumable = XML_TRUE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_subordinate_xdecl_abort) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!ENTITY entity SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_suspend_xmldecl);
+ g_resumable = XML_FALSE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test external entity fault handling with suspension */
+START_TEST(test_ext_entity_invalid_suspended_parse) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtFaults faults[]
+ = {{"<?xml version='1.0' encoding='us-ascii'?><",
+ "Incomplete element declaration not faulted", NULL,
+ XML_ERROR_UNCLOSED_TOKEN},
+ {/* First two bytes of a three-byte char */
+ "<?xml version='1.0' encoding='utf-8'?>\xe2\x82",
+ "Incomplete character not faulted", NULL, XML_ERROR_PARTIAL_CHAR},
+ {NULL, NULL, NULL, XML_ERROR_NONE}};
+ ExtFaults *fault;
+
+ for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
+ set_subtest("%s", fault->parse_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser,
+ external_entity_suspending_faulter);
+ XML_SetUserData(g_parser, fault);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Parser did not report external entity error");
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* Test setting an explicit encoding */
+START_TEST(test_explicit_encoding) {
+ const char *text1 = "<doc>Hello ";
+ const char *text2 = " World</doc>";
+
+ /* Just check that we can set the encoding to NULL before starting */
+ if (XML_SetEncoding(g_parser, NULL) != XML_STATUS_OK)
+ fail("Failed to initialise encoding to NULL");
+ /* Say we are UTF-8 */
+ if (XML_SetEncoding(g_parser, XCS("utf-8")) != XML_STATUS_OK)
+ fail("Failed to set explicit encoding");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* Try to switch encodings mid-parse */
+ if (XML_SetEncoding(g_parser, XCS("us-ascii")) != XML_STATUS_ERROR)
+ fail("Allowed encoding change");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* Try now the parse is over */
+ if (XML_SetEncoding(g_parser, NULL) != XML_STATUS_OK)
+ fail("Failed to unset encoding");
+}
+END_TEST
+
+/* Test handling of trailing CR (rather than newline) */
+START_TEST(test_trailing_cr) {
+ const char *text = "<doc>\r";
+ int found_cr;
+
+ /* Try with a character handler, for code coverage */
+ XML_SetCharacterDataHandler(g_parser, cr_cdata_handler);
+ XML_SetUserData(g_parser, &found_cr);
+ found_cr = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Failed to fault unclosed doc");
+ if (found_cr == 0)
+ fail("Did not catch the carriage return");
+ XML_ParserReset(g_parser, NULL);
+
+ /* Now with a default handler instead */
+ XML_SetDefaultHandler(g_parser, cr_cdata_handler);
+ XML_SetUserData(g_parser, &found_cr);
+ found_cr = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Failed to fault unclosed doc");
+ if (found_cr == 0)
+ fail("Did not catch default carriage return");
+}
+END_TEST
+
+/* Test trailing CR in an external entity parse */
+START_TEST(test_ext_entity_trailing_cr) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ int found_cr;
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_cr_catcher);
+ XML_SetUserData(g_parser, &found_cr);
+ found_cr = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(g_parser);
+ if (found_cr == 0)
+ fail("No carriage return found");
+ XML_ParserReset(g_parser, NULL);
+
+ /* Try again with a different trailing CR */
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_bad_cr_catcher);
+ XML_SetUserData(g_parser, &found_cr);
+ found_cr = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(g_parser);
+ if (found_cr == 0)
+ fail("No carriage return found");
+}
+END_TEST
+
+/* Test handling of trailing square bracket */
+START_TEST(test_trailing_rsqb) {
+ const char *text8 = "<doc>]";
+ const char text16[] = "\xFF\xFE<\000d\000o\000c\000>\000]\000";
+ int found_rsqb;
+ int text8_len = (int)strlen(text8);
+
+ XML_SetCharacterDataHandler(g_parser, rsqb_handler);
+ XML_SetUserData(g_parser, &found_rsqb);
+ found_rsqb = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text8, text8_len, XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Failed to fault unclosed doc");
+ if (found_rsqb == 0)
+ fail("Did not catch the right square bracket");
+
+ /* Try again with a different encoding */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetCharacterDataHandler(g_parser, rsqb_handler);
+ XML_SetUserData(g_parser, &found_rsqb);
+ found_rsqb = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text16, (int)sizeof(text16) - 1,
+ XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Failed to fault unclosed doc");
+ if (found_rsqb == 0)
+ fail("Did not catch the right square bracket");
+
+ /* And finally with a default handler */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetDefaultHandler(g_parser, rsqb_handler);
+ XML_SetUserData(g_parser, &found_rsqb);
+ found_rsqb = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text16, (int)sizeof(text16) - 1,
+ XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Failed to fault unclosed doc");
+ if (found_rsqb == 0)
+ fail("Did not catch the right square bracket");
+}
+END_TEST
+
+/* Test trailing right square bracket in an external entity parse */
+START_TEST(test_ext_entity_trailing_rsqb) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ int found_rsqb;
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_rsqb_catcher);
+ XML_SetUserData(g_parser, &found_rsqb);
+ found_rsqb = 0;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(g_parser);
+ if (found_rsqb == 0)
+ fail("No right square bracket found");
+}
+END_TEST
+
+/* Test CDATA handling in an external entity */
+START_TEST(test_ext_entity_good_cdata) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_good_cdata_ascii);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test user parameter settings */
+START_TEST(test_user_parameters) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!-- Primary parse -->\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;";
+ const char *epilog = "<!-- Back to primary parser -->\n"
+ "</doc>";
+
+ g_comment_count = 0;
+ g_skip_count = 0;
+ g_xdecl_count = 0;
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetXmlDeclHandler(g_parser, xml_decl_handler);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_param_checker);
+ XML_SetCommentHandler(g_parser, data_check_comment_handler);
+ XML_SetSkippedEntityHandler(g_parser, param_check_skip_handler);
+ XML_UseParserAsHandlerArg(g_parser);
+ XML_SetUserData(g_parser, (void *)1);
+ g_handler_data = g_parser;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* Ensure we can't change policy mid-parse */
+ if (XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_NEVER))
+ fail("Changed param entity parsing policy while parsing");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (g_comment_count != 3)
+ fail("Comment handler not invoked enough times");
+ if (g_skip_count != 1)
+ fail("Skip handler not invoked enough times");
+ if (g_xdecl_count != 1)
+ fail("XML declaration handler not invoked");
+}
+END_TEST
+
+/* Test that an explicit external entity handler argument replaces
+ * the parser as the first argument.
+ *
+ * We do not call the first parameter to the external entity handler
+ * 'parser' for once, since the first time the handler is called it
+ * will actually be a text string. We need to be able to access the
+ * global 'parser' variable to create our external entity parser from,
+ * since there are code paths we need to ensure get executed.
+ */
+START_TEST(test_ext_entity_ref_parameter) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
+ "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc>&entity;</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_ref_param_checker);
+ /* Set a handler arg that is not NULL and not parser (which is
+ * what NULL would cause to be passed.
+ */
+ XML_SetExternalEntityRefHandlerArg(g_parser, (void *)text);
+ g_handler_data = text;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ /* Now try again with unset args */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_ref_param_checker);
+ XML_SetExternalEntityRefHandlerArg(g_parser, NULL);
+ g_handler_data = g_parser;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test the parsing of an empty string */
+START_TEST(test_empty_parse) {
+ const char *text = "<doc></doc>";
+ const char *partial = "<doc>";
+
+ if (XML_Parse(g_parser, NULL, 0, XML_FALSE) == XML_STATUS_ERROR)
+ fail("Parsing empty string faulted");
+ if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
+ fail("Parsing final empty string not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_ELEMENTS)
+ fail("Parsing final empty string faulted for wrong reason");
+
+ /* Now try with valid text before the empty end */
+ XML_ParserReset(g_parser, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (XML_Parse(g_parser, NULL, 0, XML_TRUE) == XML_STATUS_ERROR)
+ fail("Parsing final empty string faulted");
+
+ /* Now try with invalid text before the empty end */
+ XML_ParserReset(g_parser, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, partial, (int)strlen(partial),
+ XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
+ fail("Parsing final incomplete empty string not faulted");
+}
+END_TEST
+
+/* Test XML_Parse for len < 0 */
+START_TEST(test_negative_len_parse) {
+ const char *const doc = "<root/>";
+ for (int isFinal = 0; isFinal < 2; isFinal++) {
+ set_subtest("isFinal=%d", isFinal);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ if (XML_GetErrorCode(parser) != XML_ERROR_NONE)
+ fail("There was not supposed to be any initial parse error.");
+
+ const enum XML_Status status = XML_Parse(parser, doc, -1, isFinal);
+
+ if (status != XML_STATUS_ERROR)
+ fail("Negative len was expected to fail the parse but did not.");
+
+ if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_ARGUMENT)
+ fail("Parse error does not match XML_ERROR_INVALID_ARGUMENT.");
+
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+/* Test XML_ParseBuffer for len < 0 */
+START_TEST(test_negative_len_parse_buffer) {
+ const char *const doc = "<root/>";
+ for (int isFinal = 0; isFinal < 2; isFinal++) {
+ set_subtest("isFinal=%d", isFinal);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ if (XML_GetErrorCode(parser) != XML_ERROR_NONE)
+ fail("There was not supposed to be any initial parse error.");
+
+ void *const buffer = XML_GetBuffer(parser, (int)strlen(doc));
+
+ if (buffer == NULL)
+ fail("XML_GetBuffer failed.");
+
+ memcpy(buffer, doc, strlen(doc));
+
+ const enum XML_Status status = XML_ParseBuffer(parser, -1, isFinal);
+
+ if (status != XML_STATUS_ERROR)
+ fail("Negative len was expected to fail the parse but did not.");
+
+ if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_ARGUMENT)
+ fail("Parse error does not match XML_ERROR_INVALID_ARGUMENT.");
+
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+/* Test odd corners of the XML_GetBuffer interface */
+static enum XML_Status
+get_feature(enum XML_FeatureEnum feature_id, long *presult) {
+ const XML_Feature *feature = XML_GetFeatureList();
+
+ if (feature == NULL)
+ return XML_STATUS_ERROR;
+ for (; feature->feature != XML_FEATURE_END; feature++) {
+ if (feature->feature == feature_id) {
+ *presult = feature->value;
+ return XML_STATUS_OK;
+ }
+ }
+ return XML_STATUS_ERROR;
+}
+
+/* Test odd corners of the XML_GetBuffer interface */
+START_TEST(test_get_buffer_1) {
+ const char *text = get_buffer_test_text;
+ void *buffer;
+ long context_bytes;
+
+ /* Attempt to allocate a negative length buffer */
+ if (XML_GetBuffer(g_parser, -12) != NULL)
+ fail("Negative length buffer not failed");
+
+ /* Now get a small buffer and extend it past valid length */
+ buffer = XML_GetBuffer(g_parser, 1536);
+ if (buffer == NULL)
+ fail("1.5K buffer failed");
+ assert(buffer != NULL);
+ memcpy(buffer, text, strlen(text));
+ if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (XML_GetBuffer(g_parser, INT_MAX) != NULL)
+ fail("INT_MAX buffer not failed");
+
+ /* Now try extending it a more reasonable but still too large
+ * amount. The allocator in XML_GetBuffer() doubles the buffer
+ * size until it exceeds the requested amount or INT_MAX. If it
+ * exceeds INT_MAX, it rejects the request, so we want a request
+ * between INT_MAX and INT_MAX/2. A gap of 1K seems comfortable,
+ * with an extra byte just to ensure that the request is off any
+ * boundary. The request will be inflated internally by
+ * XML_CONTEXT_BYTES (if >=1), so we subtract that from our
+ * request.
+ */
+ if (get_feature(XML_FEATURE_CONTEXT_BYTES, &context_bytes) != XML_STATUS_OK)
+ context_bytes = 0;
+ if (XML_GetBuffer(g_parser, INT_MAX - (context_bytes + 1025)) != NULL)
+ fail("INT_MAX- buffer not failed");
+
+ /* Now try extending it a carefully crafted amount */
+ if (XML_GetBuffer(g_parser, 1000) == NULL)
+ fail("1000 buffer failed");
+}
+END_TEST
+
+/* Test more corners of the XML_GetBuffer interface */
+START_TEST(test_get_buffer_2) {
+ const char *text = get_buffer_test_text;
+ void *buffer;
+
+ /* Now get a decent buffer */
+ buffer = XML_GetBuffer(g_parser, 1536);
+ if (buffer == NULL)
+ fail("1.5K buffer failed");
+ assert(buffer != NULL);
+ memcpy(buffer, text, strlen(text));
+ if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ /* Extend it, to catch a different code path */
+ if (XML_GetBuffer(g_parser, 1024) == NULL)
+ fail("1024 buffer failed");
+}
+END_TEST
+
+/* Test for signed integer overflow CVE-2022-23852 */
+#if XML_CONTEXT_BYTES > 0
+START_TEST(test_get_buffer_3_overflow) {
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert(parser != NULL);
+
+ const char *const text = "\n";
+ const int expectedKeepValue = (int)strlen(text);
+
+ // After this call, variable "keep" in XML_GetBuffer will
+ // have value expectedKeepValue
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text),
+ XML_FALSE /* isFinal */)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ assert(expectedKeepValue > 0);
+ if (XML_GetBuffer(parser, INT_MAX - expectedKeepValue + 1) != NULL)
+ fail("enlarging buffer not failed");
+
+ XML_ParserFree(parser);
+}
+END_TEST
+#endif // XML_CONTEXT_BYTES > 0
+
+START_TEST(test_buffer_can_grow_to_max) {
+ const char *const prefixes[] = {
+ "",
+ "<",
+ "<x a='",
+ "<doc><x a='",
+ "<document><x a='",
+ "<averylongelementnamesuchthatitwillhopefullystretchacrossmultiplelinesand"
+ "lookprettyridiculousitsalsoveryhardtoreadandifyouredoingitihavetowonderif"
+ "youreallydonthaveanythingbettertodoofcourseiguessicouldveputsomethingbadin"
+ "herebutipromisethatididntheybtwhowgreatarespacesandpunctuationforhelping"
+ "withreadabilityprettygreatithinkanywaysthisisprobablylongenoughbye><x a='"};
+ const int num_prefixes = sizeof(prefixes) / sizeof(prefixes[0]);
+ int maxbuf = INT_MAX / 2 + (INT_MAX & 1); // round up without overflow
+#if defined(__MINGW32__) && ! defined(__MINGW64__)
+ // workaround for mingw/wine32 on GitHub CI not being able to reach 1GiB
+ // Can we make a big allocation?
+ void *big = malloc(maxbuf);
+ if (! big) {
+ // The big allocation failed. Let's be a little lenient.
+ maxbuf = maxbuf / 2;
+ }
+ free(big);
+#endif
+
+ for (int i = 0; i < num_prefixes; ++i) {
+ set_subtest("\"%s\"", prefixes[i]);
+ XML_Parser parser = XML_ParserCreate(NULL);
+ const int prefix_len = (int)strlen(prefixes[i]);
+ const enum XML_Status s
+ = _XML_Parse_SINGLE_BYTES(parser, prefixes[i], prefix_len, XML_FALSE);
+ if (s != XML_STATUS_OK)
+ xml_failure(parser);
+
+ // XML_CONTEXT_BYTES of the prefix may remain in the buffer;
+ // subtracting the whole prefix is easiest, and close enough.
+ assert_true(XML_GetBuffer(parser, maxbuf - prefix_len) != NULL);
+ // The limit should be consistent; no prefix should allow us to
+ // reach above the max buffer size.
+ assert_true(XML_GetBuffer(parser, maxbuf + 1) == NULL);
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+START_TEST(test_getbuffer_allocates_on_zero_len) {
+ for (int first_len = 1; first_len >= 0; first_len--) {
+ set_subtest("with len=%d first", first_len);
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ assert_true(XML_GetBuffer(parser, first_len) != NULL);
+ assert_true(XML_GetBuffer(parser, 0) != NULL);
+ if (XML_ParseBuffer(parser, 0, XML_FALSE) != XML_STATUS_OK)
+ xml_failure(parser);
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+/* Test position information macros */
+START_TEST(test_byte_info_at_end) {
+ const char *text = "<doc></doc>";
+
+ if (XML_GetCurrentByteIndex(g_parser) != -1
+ || XML_GetCurrentByteCount(g_parser) != 0)
+ fail("Byte index/count incorrect at start of parse");
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* At end, the count will be zero and the index the end of string */
+ if (XML_GetCurrentByteCount(g_parser) != 0)
+ fail("Terminal byte count incorrect");
+ if (XML_GetCurrentByteIndex(g_parser) != (XML_Index)strlen(text))
+ fail("Terminal byte index incorrect");
+}
+END_TEST
+
+/* Test position information from errors */
+#define PRE_ERROR_STR "<doc></"
+#define POST_ERROR_STR "wombat></doc>"
+START_TEST(test_byte_info_at_error) {
+ const char *text = PRE_ERROR_STR POST_ERROR_STR;
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Syntax error not faulted");
+ if (XML_GetCurrentByteCount(g_parser) != 0)
+ fail("Error byte count incorrect");
+ if (XML_GetCurrentByteIndex(g_parser) != strlen(PRE_ERROR_STR))
+ fail("Error byte index incorrect");
+}
+END_TEST
+#undef PRE_ERROR_STR
+#undef POST_ERROR_STR
+
+/* Test position information in handler */
+#define START_ELEMENT "<e>"
+#define CDATA_TEXT "Hello"
+#define END_ELEMENT "</e>"
+START_TEST(test_byte_info_at_cdata) {
+ const char *text = START_ELEMENT CDATA_TEXT END_ELEMENT;
+ int offset, size;
+ ByteTestData data;
+
+ /* Check initial context is empty */
+ if (XML_GetInputContext(g_parser, &offset, &size) != NULL)
+ fail("Unexpected context at start of parse");
+
+ data.start_element_len = (int)strlen(START_ELEMENT);
+ data.cdata_len = (int)strlen(CDATA_TEXT);
+ data.total_string_len = (int)strlen(text);
+ XML_SetCharacterDataHandler(g_parser, byte_character_handler);
+ XML_SetUserData(g_parser, &data);
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE) != XML_STATUS_OK)
+ xml_failure(g_parser);
+}
+END_TEST
+#undef START_ELEMENT
+#undef CDATA_TEXT
+#undef END_ELEMENT
+
+/* Test predefined entities are correctly recognised */
+START_TEST(test_predefined_entities) {
+ const char *text = "<doc>&lt;&gt;&amp;&quot;&apos;</doc>";
+ const XML_Char *expected = XCS("<doc>&lt;&gt;&amp;&quot;&apos;</doc>");
+ const XML_Char *result = XCS("<>&\"'");
+ CharData storage;
+
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ /* run_character_check uses XML_SetCharacterDataHandler(), which
+ * unfortunately heads off a code path that we need to exercise.
+ */
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* The default handler doesn't translate the entities */
+ CharData_CheckXMLChars(&storage, expected);
+
+ /* Now try again and check the translation */
+ XML_ParserReset(g_parser, NULL);
+ run_character_check(text, result);
+}
+END_TEST
+
+/* Regression test that an invalid tag in an external parameter
+ * reference in an external DTD is correctly faulted.
+ *
+ * Only a few specific tags are legal in DTDs ignoring comments and
+ * processing instructions, all of which begin with an exclamation
+ * mark. "<el/>" is not one of them, so the parser should raise an
+ * error on encountering it.
+ */
+START_TEST(test_invalid_tag_in_dtd) {
+ const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
+ "<doc></doc>\n";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_param);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Invalid tag IN DTD external param not rejected");
+}
+END_TEST
+
+/* Test entities not quite the predefined ones are not mis-recognised */
+START_TEST(test_not_predefined_entities) {
+ const char *text[] = {"<doc>&pt;</doc>", "<doc>&amo;</doc>",
+ "<doc>&quid;</doc>", "<doc>&apod;</doc>", NULL};
+ int i = 0;
+
+ while (text[i] != NULL) {
+ expect_failure(text[i], XML_ERROR_UNDEFINED_ENTITY,
+ "Undefined entity not rejected");
+ XML_ParserReset(g_parser, NULL);
+ i++;
+ }
+}
+END_TEST
+
+/* Test conditional inclusion (IGNORE) */
+START_TEST(test_ignore_section) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc><e>&entity;</e></doc>";
+ const XML_Char *expected
+ = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&entity;");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore);
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
+ XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetStartElementHandler(g_parser, dummy_start_element);
+ XML_SetEndElementHandler(g_parser, dummy_end_element);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ignore_section_utf16) {
+ const char text[] =
+ /* <!DOCTYPE d SYSTEM 's'> */
+ "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
+ "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0"
+ /* <d><e>&en;</e></d> */
+ "<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0";
+ const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16);
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
+ XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetStartElementHandler(g_parser, dummy_start_element);
+ XML_SetEndElementHandler(g_parser, dummy_end_element);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ignore_section_utf16_be) {
+ const char text[] =
+ /* <!DOCTYPE d SYSTEM 's'> */
+ "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
+ "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n"
+ /* <d><e>&en;</e></d> */
+ "\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>";
+ const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetExternalEntityRefHandler(g_parser,
+ external_entity_load_ignore_utf16_be);
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
+ XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetStartElementHandler(g_parser, dummy_start_element);
+ XML_SetEndElementHandler(g_parser, dummy_end_element);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test mis-formatted conditional exclusion */
+START_TEST(test_bad_ignore_section) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc><e>&entity;</e></doc>";
+ ExtFaults faults[]
+ = {{"<![IGNORE[<!ELEM", "Broken-off declaration not faulted", NULL,
+ XML_ERROR_SYNTAX},
+ {"<![IGNORE[\x01]]>", "Invalid XML character not faulted", NULL,
+ XML_ERROR_INVALID_TOKEN},
+ {/* FIrst two bytes of a three-byte char */
+ "<![IGNORE[\xe2\x82", "Partial XML character not faulted", NULL,
+ XML_ERROR_PARTIAL_CHAR},
+ {NULL, NULL, NULL, XML_ERROR_NONE}};
+ ExtFaults *fault;
+
+ for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
+ set_subtest("%s", fault->parse_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_SetUserData(g_parser, fault);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Incomplete IGNORE section not failed");
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+struct bom_testdata {
+ const char *external;
+ int split;
+ XML_Bool nested_callback_happened;
+};
+
+static int XMLCALL
+external_bom_checker(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text;
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+
+ XML_Parser ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+
+ if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
+ struct bom_testdata *const testdata
+ = (struct bom_testdata *)XML_GetUserData(parser);
+ const char *const external = testdata->external;
+ const int split = testdata->split;
+ testdata->nested_callback_happened = XML_TRUE;
+
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, external, split, XML_FALSE)
+ != XML_STATUS_OK) {
+ xml_failure(ext_parser);
+ }
+ text = external + split; // the parse below will continue where we left off.
+ } else if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
+ text = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>\n";
+ } else {
+ fail("unknown systemId");
+ }
+
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(ext_parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+/* regression test: BOM should be consumed when followed by a partial token. */
+START_TEST(test_external_bom_consumed) {
+ const char *const text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
+ "<doc></doc>\n";
+ const char *const external = "\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>";
+ const int len = (int)strlen(external);
+ for (int split = 0; split <= len; ++split) {
+ set_subtest("split at byte %d", split);
+
+ struct bom_testdata testdata;
+ testdata.external = external;
+ testdata.split = split;
+ testdata.nested_callback_happened = XML_FALSE;
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ if (parser == NULL) {
+ fail("Couldn't create parser");
+ }
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(parser, external_bom_checker);
+ XML_SetUserData(parser, &testdata);
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+ if (! testdata.nested_callback_happened) {
+ fail("ref handler not called");
+ }
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+/* Test recursive parsing */
+START_TEST(test_external_entity_values) {
+ const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
+ "<doc></doc>\n";
+ ExtFaults data_004_2[] = {
+ {"<!ATTLIST doc a1 CDATA 'value'>", NULL, NULL, XML_ERROR_NONE},
+ {"<!ATTLIST $doc a1 CDATA 'value'>", "Invalid token not faulted", NULL,
+ XML_ERROR_INVALID_TOKEN},
+ {"'wombat", "Unterminated string not faulted", NULL,
+ XML_ERROR_UNCLOSED_TOKEN},
+ {"\xe2\x82", "Partial UTF-8 character not faulted", NULL,
+ XML_ERROR_PARTIAL_CHAR},
+ {"<?xml version='1.0' encoding='utf-8'?>\n", NULL, NULL, XML_ERROR_NONE},
+ {"<?xml?>", "Malformed XML declaration not faulted", NULL,
+ XML_ERROR_XML_DECL},
+ {/* UTF-8 BOM */
+ "\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>", NULL, NULL,
+ XML_ERROR_NONE},
+ {"<?xml version='1.0' encoding='utf-8'?>\n$",
+ "Invalid token after text declaration not faulted", NULL,
+ XML_ERROR_INVALID_TOKEN},
+ {"<?xml version='1.0' encoding='utf-8'?>\n'wombat",
+ "Unterminated string after text decl not faulted", NULL,
+ XML_ERROR_UNCLOSED_TOKEN},
+ {"<?xml version='1.0' encoding='utf-8'?>\n\xe2\x82",
+ "Partial UTF-8 character after text decl not faulted", NULL,
+ XML_ERROR_PARTIAL_CHAR},
+ {"%e1;", "Recursive parameter entity not faulted", NULL,
+ XML_ERROR_RECURSIVE_ENTITY_REF},
+ {NULL, NULL, NULL, XML_ERROR_NONE}};
+ int i;
+
+ for (i = 0; data_004_2[i].parse_text != NULL; i++) {
+ set_subtest("%s", data_004_2[i].parse_text);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_valuer);
+ XML_SetUserData(g_parser, &data_004_2[i]);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ XML_ParserReset(g_parser, NULL);
+ }
+}
+END_TEST
+
+/* Test the recursive parse interacts with a not standalone handler */
+START_TEST(test_ext_entity_not_standalone) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc></doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_not_standalone);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Standalone rejection not caught");
+}
+END_TEST
+
+START_TEST(test_ext_entity_value_abort) {
+ const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
+ "<doc></doc>\n";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_value_aborter);
+ g_resumable = XML_FALSE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_bad_public_doctype) {
+ const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
+ "<!DOCTYPE doc PUBLIC '{BadName}' 'test'>\n"
+ "<doc></doc>";
+
+ /* Setting a handler provokes a particular code path */
+ XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
+ dummy_end_doctype_handler);
+ expect_failure(text, XML_ERROR_PUBLICID, "Bad Public ID not failed");
+}
+END_TEST
+
+/* Test based on ibm/valid/P32/ibm32v04.xml */
+START_TEST(test_attribute_enum_value) {
+ const char *text = "<?xml version='1.0' standalone='no'?>\n"
+ "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
+ "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
+ ExtTest dtd_data
+ = {"<!ELEMENT animal (#PCDATA|a)*>\n"
+ "<!ELEMENT a EMPTY>\n"
+ "<!ATTLIST animal xml:space (default|preserve) 'preserve'>",
+ NULL, NULL};
+ const XML_Char *expected = XCS("This is a \n \n\nyellow tiger");
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ XML_SetUserData(g_parser, &dtd_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ /* An attribute list handler provokes a different code path */
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ run_ext_character_check(text, &dtd_data, expected);
+}
+END_TEST
+
+/* Slightly bizarrely, the library seems to silently ignore entity
+ * definitions for predefined entities, even when they are wrong. The
+ * language of the XML 1.0 spec is somewhat unhelpful as to what ought
+ * to happen, so this is currently treated as acceptable.
+ */
+START_TEST(test_predefined_entity_redefinition) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ENTITY apos 'foo'>\n"
+ "]>\n"
+ "<doc>&apos;</doc>";
+ run_character_check(text, XCS("'"));
+}
+END_TEST
+
+/* Test that the parser stops processing the DTD after an unresolved
+ * parameter entity is encountered.
+ */
+START_TEST(test_dtd_stop_processing) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "%foo;\n"
+ "<!ENTITY bar 'bas'>\n"
+ "]><doc/>";
+
+ XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (get_dummy_handler_flags() != 0)
+ fail("DTD processing still going after undefined PE");
+}
+END_TEST
+
+/* Test public notations with no system ID */
+START_TEST(test_public_notation_no_sysid) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!NOTATION note PUBLIC 'foo'>\n"
+ "<!ELEMENT doc EMPTY>\n"
+ "]>\n<doc/>";
+
+ init_dummy_handlers();
+ XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
+ fail("Notation declaration handler not called");
+}
+END_TEST
+
+START_TEST(test_nested_groups) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc "
+ /* Sixteen elements per line */
+ "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
+ "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
+ "))))))))))))))))))))))))))))))))>\n"
+ "<!ELEMENT e EMPTY>"
+ "]>\n"
+ "<doc><e/></doc>";
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ XML_SetStartElementHandler(g_parser, record_element_start_handler);
+ XML_SetUserData(g_parser, &storage);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, XCS("doce"));
+ if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
+ fail("Element handler not fired");
+}
+END_TEST
+
+START_TEST(test_group_choice) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ELEMENT doc (a|b|c)+>\n"
+ "<!ELEMENT a EMPTY>\n"
+ "<!ELEMENT b (#PCDATA)>\n"
+ "<!ELEMENT c ANY>\n"
+ "]>\n"
+ "<doc>\n"
+ "<a/>\n"
+ "<b attr='foo'>This is a foo</b>\n"
+ "<c></c>\n"
+ "</doc>\n";
+
+ XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
+ fail("Element handler flag not raised");
+}
+END_TEST
+
+START_TEST(test_standalone_parameter_entity) {
+ const char *text = "<?xml version='1.0' standalone='yes'?>\n"
+ "<!DOCTYPE doc SYSTEM 'http://example.org/' [\n"
+ "<!ENTITY % entity '<!ELEMENT doc (#PCDATA)>'>\n"
+ "%entity;\n"
+ "]>\n"
+ "<doc></doc>";
+ char dtd_data[] = "<!ENTITY % e1 'foo'>\n";
+
+ XML_SetUserData(g_parser, dtd_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test skipping of parameter entity in an external DTD */
+/* Derived from ibm/invalid/P69/ibm69i01.xml */
+START_TEST(test_skipped_parameter_entity) {
+ const char *text = "<?xml version='1.0'?>\n"
+ "<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
+ "<!ELEMENT root (#PCDATA|a)* >\n"
+ "]>\n"
+ "<root></root>";
+ ExtTest dtd_data = {"%pe2;", NULL, NULL};
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ XML_SetUserData(g_parser, &dtd_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetSkippedEntityHandler(g_parser, dummy_skip_handler);
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (get_dummy_handler_flags() != DUMMY_SKIP_HANDLER_FLAG)
+ fail("Skip handler not executed");
+}
+END_TEST
+
+/* Test recursive parameter entity definition rejected in external DTD */
+START_TEST(test_recursive_external_parameter_entity) {
+ const char *text = "<?xml version='1.0'?>\n"
+ "<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
+ "<!ELEMENT root (#PCDATA|a)* >\n"
+ "]>\n"
+ "<root></root>";
+ ExtFaults dtd_data = {"<!ENTITY % pe2 '&#37;pe2;'>\n%pe2;",
+ "Recursive external parameter entity not faulted", NULL,
+ XML_ERROR_RECURSIVE_ENTITY_REF};
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_SetUserData(g_parser, &dtd_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Recursive external parameter not spotted");
+}
+END_TEST
+
+/* Test undefined parameter entity in external entity handler */
+START_TEST(test_undefined_ext_entity_in_external_dtd) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
+ "<doc></doc>\n";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_devaluer);
+ XML_SetUserData(g_parser, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ /* Now repeat without the external entity ref handler invoking
+ * another copy of itself.
+ */
+ XML_ParserReset(g_parser, NULL);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_devaluer);
+ XML_SetUserData(g_parser, g_parser); /* Any non-NULL value will do */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test suspending the parse on receiving an XML declaration works */
+START_TEST(test_suspend_xdecl) {
+ const char *text = long_character_data_text;
+
+ XML_SetXmlDeclHandler(g_parser, entity_suspending_xdecl_handler);
+ XML_SetUserData(g_parser, g_parser);
+ g_resumable = XML_TRUE;
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
+ xml_failure(g_parser);
+ /* Attempt to start a new parse while suspended */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Attempt to parse while suspended not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
+ fail("Suspended parse not faulted with correct error");
+}
+END_TEST
+
+/* Test aborting the parse in an epilog works */
+START_TEST(test_abort_epilog) {
+ const char *text = "<doc></doc>\n\r\n";
+ XML_Char trigger_char = XCS('\r');
+
+ XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
+ XML_SetUserData(g_parser, &trigger_char);
+ g_resumable = XML_FALSE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Abort not triggered");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_ABORTED)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test a different code path for abort in the epilog */
+START_TEST(test_abort_epilog_2) {
+ const char *text = "<doc></doc>\n";
+ XML_Char trigger_char = XCS('\n');
+
+ XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
+ XML_SetUserData(g_parser, &trigger_char);
+ g_resumable = XML_FALSE;
+ expect_failure(text, XML_ERROR_ABORTED, "Abort not triggered");
+}
+END_TEST
+
+/* Test suspension from the epilog */
+START_TEST(test_suspend_epilog) {
+ const char *text = "<doc></doc>\n";
+ XML_Char trigger_char = XCS('\n');
+
+ XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
+ XML_SetUserData(g_parser, &trigger_char);
+ g_resumable = XML_TRUE;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_suspend_in_sole_empty_tag) {
+ const char *text = "<doc/>";
+ enum XML_Status rc;
+
+ XML_SetEndElementHandler(g_parser, suspending_end_handler);
+ XML_SetUserData(g_parser, g_parser);
+ rc = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
+ if (rc == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ else if (rc != XML_STATUS_SUSPENDED)
+ fail("Suspend not triggered");
+ rc = XML_ResumeParser(g_parser);
+ if (rc == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ else if (rc != XML_STATUS_OK)
+ fail("Resume failed");
+}
+END_TEST
+
+START_TEST(test_unfinished_epilog) {
+ const char *text = "<doc></doc><";
+
+ expect_failure(text, XML_ERROR_UNCLOSED_TOKEN,
+ "Incomplete epilog entry not faulted");
+}
+END_TEST
+
+START_TEST(test_partial_char_in_epilog) {
+ const char *text = "<doc></doc>\xe2\x82";
+
+ /* First check that no fault is raised if the parse is not finished */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* Now check that it is faulted once we finish */
+ if (XML_ParseBuffer(g_parser, 0, XML_TRUE) != XML_STATUS_ERROR)
+ fail("Partial character in epilog not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_PARTIAL_CHAR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test resuming a parse suspended in entity substitution */
+START_TEST(test_suspend_resume_internal_entity) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ "<!ENTITY foo '<suspend>Hi<suspend>Ho</suspend></suspend>'>\n"
+ "]>\n"
+ "<doc>&foo;</doc>\n";
+ const XML_Char *expected1 = XCS("Hi");
+ const XML_Char *expected2 = XCS("HiHo");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetStartElementHandler(g_parser, start_element_suspender);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ XML_SetUserData(g_parser, &storage);
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, XCS(""));
+ if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected1);
+ if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected2);
+}
+END_TEST
+
+START_TEST(test_suspend_resume_internal_entity_issue_629) {
+ const char *const text
+ = "<!DOCTYPE a [<!ENTITY e '<!--COMMENT-->a'>]><a>&e;<b>\n"
+ "<"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "/>"
+ "</b></a>";
+ const size_t firstChunkSizeBytes = 54;
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_SetUserData(parser, parser);
+ XML_SetCommentHandler(parser, suspending_comment_handler);
+
+ if (XML_Parse(parser, text, (int)firstChunkSizeBytes, XML_FALSE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(parser);
+ if (XML_ResumeParser(parser) != XML_STATUS_OK)
+ xml_failure(parser);
+ if (_XML_Parse_SINGLE_BYTES(parser, text + firstChunkSizeBytes,
+ (int)(strlen(text) - firstChunkSizeBytes),
+ XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(parser);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+/* Test syntax error is caught at parse resumption */
+START_TEST(test_resume_entity_with_syntax_error) {
+ if (g_chunkSize != 0) {
+ // this test does not use SINGLE_BYTES, because of suspension
+ return;
+ }
+
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ENTITY foo '<suspend>Hi</wombat>'>\n"
+ "]>\n"
+ "<doc>&foo;</doc>\n";
+
+ XML_SetStartElementHandler(g_parser, start_element_suspender);
+ // can't use SINGLE_BYTES here, because it'll return early on suspension, and
+ // we won't know exactly how much input we actually managed to give Expat.
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
+ fail("Syntax error in entity not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_TAG_MISMATCH)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test suspending and resuming in a parameter entity substitution */
+START_TEST(test_suspend_resume_parameter_entity) {
+ const char *text = "<!DOCTYPE doc [\n"
+ "<!ENTITY % foo '<!ELEMENT doc (#PCDATA)*>'>\n"
+ "%foo;\n"
+ "]>\n"
+ "<doc>Hello, world</doc>";
+ const XML_Char *expected = XCS("Hello, world");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetElementDeclHandler(g_parser, element_decl_suspender);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, XCS(""));
+ if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test attempting to use parser after an error is faulted */
+START_TEST(test_restart_on_error) {
+ const char *text = "<$doc><doc></doc>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Invalid tag name not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
+ xml_failure(g_parser);
+ if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
+ fail("Restarting invalid parse not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that angle brackets in an attribute default value are faulted */
+START_TEST(test_reject_lt_in_attribute_value) {
+ const char *text = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '<bar>'>]>\n"
+ "<doc></doc>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Bad attribute default not faulted");
+}
+END_TEST
+
+START_TEST(test_reject_unfinished_param_in_att_value) {
+ const char *text = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '&foo'>]>\n"
+ "<doc></doc>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Bad attribute default not faulted");
+}
+END_TEST
+
+START_TEST(test_trailing_cr_in_att_value) {
+ const char *text = "<doc a='value\r'/>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Try parsing a general entity within a parameter entity in a
+ * standalone internal DTD. Covers a corner case in the parser.
+ */
+START_TEST(test_standalone_internal_entity) {
+ const char *text = "<?xml version='1.0' standalone='yes' ?>\n"
+ "<!DOCTYPE doc [\n"
+ " <!ELEMENT doc (#PCDATA)>\n"
+ " <!ENTITY % pe '<!ATTLIST doc att2 CDATA \"&ge;\">'>\n"
+ " <!ENTITY ge 'AttDefaultValue'>\n"
+ " %pe;\n"
+ "]>\n"
+ "<doc att2='any'/>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that a reference to an unknown external entity is skipped */
+START_TEST(test_skipped_external_entity) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
+ "<doc></doc>\n";
+ ExtTest test_data = {"<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e2 '%e1;'>\n",
+ NULL, NULL};
+
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test a different form of unknown external entity */
+START_TEST(test_skipped_null_loaded_ext_entity) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
+ "<doc />";
+ ExtHdlrData test_data
+ = {"<!ENTITY % pe1 SYSTEM 'http://example.org/two.ent'>\n"
+ "<!ENTITY % pe2 '%pe1;'>\n"
+ "%pe2;\n",
+ external_entity_null_loader, NULL};
+
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_oneshot_loader);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_skipped_unloaded_ext_entity) {
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
+ "<doc />";
+ ExtHdlrData test_data
+ = {"<!ENTITY % pe1 SYSTEM 'http://example.org/two.ent'>\n"
+ "<!ENTITY % pe2 '%pe1;'>\n"
+ "%pe2;\n",
+ NULL, NULL};
+
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_oneshot_loader);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that a parameter entity value ending with a carriage return
+ * has it translated internally into a newline.
+ */
+START_TEST(test_param_entity_with_trailing_cr) {
+#define PARAM_ENTITY_NAME "pe"
+#define PARAM_ENTITY_CORE_VALUE "<!ATTLIST doc att CDATA \"default\">"
+ const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
+ "<doc/>";
+ ExtTest test_data
+ = {"<!ENTITY % " PARAM_ENTITY_NAME " '" PARAM_ENTITY_CORE_VALUE "\r'>\n"
+ "%" PARAM_ENTITY_NAME ";\n",
+ NULL, NULL};
+
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
+ XML_SetEntityDeclHandler(g_parser, param_entity_match_handler);
+ param_entity_match_init(XCS(PARAM_ENTITY_NAME),
+ XCS(PARAM_ENTITY_CORE_VALUE) XCS("\n"));
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ int entity_match_flag = get_param_entity_match_flag();
+ if (entity_match_flag == ENTITY_MATCH_FAIL)
+ fail("Parameter entity CR->NEWLINE conversion failed");
+ else if (entity_match_flag == ENTITY_MATCH_NOT_FOUND)
+ fail("Parameter entity not parsed");
+}
+#undef PARAM_ENTITY_NAME
+#undef PARAM_ENTITY_CORE_VALUE
+END_TEST
+
+START_TEST(test_invalid_character_entity) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY entity '&#x110000;'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ expect_failure(text, XML_ERROR_BAD_CHAR_REF,
+ "Out of range character reference not faulted");
+}
+END_TEST
+
+START_TEST(test_invalid_character_entity_2) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY entity '&#xg0;'>\n"
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Out of range character reference not faulted");
+}
+END_TEST
+
+START_TEST(test_invalid_character_entity_3) {
+ const char text[] =
+ /* <!DOCTYPE doc [\n */
+ "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0\n"
+ /* U+0E04 = KHO KHWAI
+ * U+0E08 = CHO CHAN */
+ /* <!ENTITY entity '&\u0e04\u0e08;'>\n */
+ "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0e\0n\0t\0i\0t\0y\0 "
+ "\0'\0&\x0e\x04\x0e\x08\0;\0'\0>\0\n"
+ /* ]>\n */
+ "\0]\0>\0\n"
+ /* <doc>&entity;</doc> */
+ "\0<\0d\0o\0c\0>\0&\0e\0n\0t\0i\0t\0y\0;\0<\0/\0d\0o\0c\0>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Invalid start of entity name not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_UNDEFINED_ENTITY)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_invalid_character_entity_4) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY entity '&#1114112;'>\n" /* = &#x110000 */
+ "]>\n"
+ "<doc>&entity;</doc>";
+
+ expect_failure(text, XML_ERROR_BAD_CHAR_REF,
+ "Out of range character reference not faulted");
+}
+END_TEST
+
+/* Test that processing instructions are picked up by a default handler */
+START_TEST(test_pi_handled_in_default) {
+ const char *text = "<?test processing instruction?>\n<doc/>";
+ const XML_Char *expected = XCS("<?test processing instruction?>\n<doc/>");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that comments are picked up by a default handler */
+START_TEST(test_comment_handled_in_default) {
+ const char *text = "<!-- This is a comment -->\n<doc/>";
+ const XML_Char *expected = XCS("<!-- This is a comment -->\n<doc/>");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetDefaultHandler(g_parser, accumulate_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test PIs that look almost but not quite like XML declarations */
+START_TEST(test_pi_yml) {
+ const char *text = "<?yml something like data?><doc/>";
+ const XML_Char *expected = XCS("yml: something like data\n");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_pi_xnl) {
+ const char *text = "<?xnl nothing like data?><doc/>";
+ const XML_Char *expected = XCS("xnl: nothing like data\n");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_pi_xmm) {
+ const char *text = "<?xmm everything like data?><doc/>";
+ const XML_Char *expected = XCS("xmm: everything like data\n");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_utf16_pi) {
+ const char text[] =
+ /* <?{KHO KHWAI}{CHO CHAN}?>
+ * where {KHO KHWAI} = U+0E04
+ * and {CHO CHAN} = U+0E08
+ */
+ "<\0?\0\x04\x0e\x08\x0e?\0>\0"
+ /* <q/> */
+ "<\0q\0/\0>\0";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x0e04\x0e08: \n");
+#else
+ const XML_Char *expected = XCS("\xe0\xb8\x84\xe0\xb8\x88: \n");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_utf16_be_pi) {
+ const char text[] =
+ /* <?{KHO KHWAI}{CHO CHAN}?>
+ * where {KHO KHWAI} = U+0E04
+ * and {CHO CHAN} = U+0E08
+ */
+ "\0<\0?\x0e\x04\x0e\x08\0?\0>"
+ /* <q/> */
+ "\0<\0q\0/\0>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x0e04\x0e08: \n");
+#else
+ const XML_Char *expected = XCS("\xe0\xb8\x84\xe0\xb8\x88: \n");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that comments can be picked up and translated */
+START_TEST(test_utf16_be_comment) {
+ const char text[] =
+ /* <!-- Comment A --> */
+ "\0<\0!\0-\0-\0 \0C\0o\0m\0m\0e\0n\0t\0 \0A\0 \0-\0-\0>\0\n"
+ /* <doc/> */
+ "\0<\0d\0o\0c\0/\0>";
+ const XML_Char *expected = XCS(" Comment A ");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetCommentHandler(g_parser, accumulate_comment);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_utf16_le_comment) {
+ const char text[] =
+ /* <!-- Comment B --> */
+ "<\0!\0-\0-\0 \0C\0o\0m\0m\0e\0n\0t\0 \0B\0 \0-\0-\0>\0\n\0"
+ /* <doc/> */
+ "<\0d\0o\0c\0/\0>\0";
+ const XML_Char *expected = XCS(" Comment B ");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetCommentHandler(g_parser, accumulate_comment);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that the unknown encoding handler with map entries that expect
+ * conversion but no conversion function is faulted
+ */
+START_TEST(test_missing_encoding_conversion_fn) {
+ const char *text = "<?xml version='1.0' encoding='no-conv'?>\n"
+ "<doc>\x81</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ /* MiscEncodingHandler sets up an encoding with every top-bit-set
+ * character introducing a two-byte sequence. For this, it
+ * requires a convert function. The above function call doesn't
+ * pass one through, so when BadEncodingHandler actually gets
+ * called it should supply an invalid encoding.
+ */
+ expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
+ "Encoding with missing convert() not faulted");
+}
+END_TEST
+
+START_TEST(test_failing_encoding_conversion_fn) {
+ const char *text = "<?xml version='1.0' encoding='failing-conv'?>\n"
+ "<doc>\x81</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ /* BadEncodingHandler sets up an encoding with every top-bit-set
+ * character introducing a two-byte sequence. For this, it
+ * requires a convert function. The above function call passes
+ * one that insists all possible sequences are invalid anyway.
+ */
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Encoding with failing convert() not faulted");
+}
+END_TEST
+
+/* Test unknown encoding conversions */
+START_TEST(test_unknown_encoding_success) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ /* Equivalent to <eoc>Hello, world</eoc> */
+ "<\x81\x64\x80oc>Hello, world</\x81\x64\x80oc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ run_character_check(text, XCS("Hello, world"));
+}
+END_TEST
+
+/* Test bad name character in unknown encoding */
+START_TEST(test_unknown_encoding_bad_name) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<\xff\x64oc>Hello, world</\xff\x64oc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Bad name start in unknown encoding not faulted");
+}
+END_TEST
+
+/* Test bad mid-name character in unknown encoding */
+START_TEST(test_unknown_encoding_bad_name_2) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<d\xffoc>Hello, world</d\xffoc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Bad name in unknown encoding not faulted");
+}
+END_TEST
+
+/* Test element name that is long enough to fill the conversion buffer
+ * in an unknown encoding, finishing with an encoded character.
+ */
+START_TEST(test_unknown_encoding_long_name_1) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<abcdefghabcdefghabcdefghijkl\x80m\x80n\x80o\x80p>"
+ "Hi"
+ "</abcdefghabcdefghabcdefghijkl\x80m\x80n\x80o\x80p>";
+ const XML_Char *expected = XCS("abcdefghabcdefghabcdefghijklmnop");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ XML_SetStartElementHandler(g_parser, record_element_start_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test element name that is long enough to fill the conversion buffer
+ * in an unknown encoding, finishing with an simple character.
+ */
+START_TEST(test_unknown_encoding_long_name_2) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<abcdefghabcdefghabcdefghijklmnop>"
+ "Hi"
+ "</abcdefghabcdefghabcdefghijklmnop>";
+ const XML_Char *expected = XCS("abcdefghabcdefghabcdefghijklmnop");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ XML_SetStartElementHandler(g_parser, record_element_start_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_invalid_unknown_encoding) {
+ const char *text = "<?xml version='1.0' encoding='invalid-9'?>\n"
+ "<doc>Hello world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
+ "Invalid unknown encoding not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_ascii_encoding_ok) {
+ const char *text = "<?xml version='1.0' encoding='ascii-like'?>\n"
+ "<doc>Hello, world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ run_character_check(text, XCS("Hello, world"));
+}
+END_TEST
+
+START_TEST(test_unknown_ascii_encoding_fail) {
+ const char *text = "<?xml version='1.0' encoding='ascii-like'?>\n"
+ "<doc>Hello, \x80 world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid character not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_encoding_invalid_length) {
+ const char *text = "<?xml version='1.0' encoding='invalid-len'?>\n"
+ "<doc>Hello, world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
+ "Invalid unknown encoding not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_encoding_invalid_topbit) {
+ const char *text = "<?xml version='1.0' encoding='invalid-a'?>\n"
+ "<doc>Hello, world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
+ "Invalid unknown encoding not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_encoding_invalid_surrogate) {
+ const char *text = "<?xml version='1.0' encoding='invalid-surrogate'?>\n"
+ "<doc>Hello, \x82 world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid unknown encoding not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_encoding_invalid_high) {
+ const char *text = "<?xml version='1.0' encoding='invalid-high'?>\n"
+ "<doc>Hello, world</doc>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
+ "Invalid unknown encoding not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_encoding_invalid_attr_value) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<doc attr='\xff\x30'/>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid attribute valid not faulted");
+}
+END_TEST
+
+/* Test an external entity parser set to use latin-1 detects UTF-16
+ * BOMs correctly.
+ */
+/* Test that UTF-16 BOM does not select UTF-16 given explicit encoding */
+START_TEST(test_ext_entity_latin1_utf16le_bom) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data
+ = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
+ /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
+ * 0x4c = L and 0x20 is a space
+ */
+ "\xff\xfe\x4c\x20", 4, XCS("iso-8859-1"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00ff\x00feL ");
+#else
+ /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
+ const XML_Char *expected = XCS("\xc3\xbf\xc3\xbeL ");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ext_entity_latin1_utf16be_bom) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data
+ = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
+ /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
+ * 0x4c = L and 0x20 is a space
+ */
+ "\xfe\xff\x20\x4c", 4, XCS("iso-8859-1"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00fe\x00ff L");
+#else
+ /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
+ const XML_Char *expected = XCS("\xc3\xbe\xc3\xbf L");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Parsing the full buffer rather than a byte at a time makes a
+ * difference to the encoding scanning code, so repeat the above tests
+ * without breaking them down by byte.
+ */
+START_TEST(test_ext_entity_latin1_utf16le_bom2) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data
+ = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
+ /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
+ * 0x4c = L and 0x20 is a space
+ */
+ "\xff\xfe\x4c\x20", 4, XCS("iso-8859-1"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00ff\x00feL ");
+#else
+ /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
+ const XML_Char *expected = XCS("\xc3\xbf\xc3\xbeL ");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ext_entity_latin1_utf16be_bom2) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data
+ = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
+ /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
+ * 0x4c = L and 0x20 is a space
+ */
+ "\xfe\xff\x20\x4c", 4, XCS("iso-8859-1"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00fe\x00ff L");
+#else
+ /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
+ const XML_Char *expected = "\xc3\xbe\xc3\xbf L";
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test little-endian UTF-16 given an explicit big-endian encoding */
+START_TEST(test_ext_entity_utf16_be) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data = {"<\0e\0/\0>\0", 8, XCS("utf-16be"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x3c00\x6500\x2f00\x3e00");
+#else
+ const XML_Char *expected = XCS("\xe3\xb0\x80" /* U+3C00 */
+ "\xe6\x94\x80" /* U+6500 */
+ "\xe2\xbc\x80" /* U+2F00 */
+ "\xe3\xb8\x80"); /* U+3E00 */
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test big-endian UTF-16 given an explicit little-endian encoding */
+START_TEST(test_ext_entity_utf16_le) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data = {"\0<\0e\0/\0>", 8, XCS("utf-16le"), NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x3c00\x6500\x2f00\x3e00");
+#else
+ const XML_Char *expected = XCS("\xe3\xb0\x80" /* U+3C00 */
+ "\xe6\x94\x80" /* U+6500 */
+ "\xe2\xbc\x80" /* U+2F00 */
+ "\xe3\xb8\x80"); /* U+3E00 */
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test little-endian UTF-16 given no explicit encoding.
+ * The existing default encoding (UTF-8) is assumed to hold without a
+ * BOM to contradict it, so the entity value will in fact provoke an
+ * error because 0x00 is not a valid XML character. We parse the
+ * whole buffer in one go rather than feeding it in byte by byte to
+ * exercise different code paths in the initial scanning routines.
+ */
+START_TEST(test_ext_entity_utf16_unknown) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtFaults2 test_data
+ = {"a\0b\0c\0", 6, "Invalid character in entity not faulted", NULL,
+ XML_ERROR_INVALID_TOKEN};
+
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter2);
+ XML_SetUserData(g_parser, &test_data);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Invalid character should not have been accepted");
+}
+END_TEST
+
+/* Test not-quite-UTF-8 BOM (0xEF 0xBB 0xBF) */
+START_TEST(test_ext_entity_utf8_non_bom) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtTest2 test_data
+ = {"\xef\xbb\x80", /* Arabic letter DAD medial form, U+FEC0 */
+ 3, NULL, NULL};
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\xfec0");
+#else
+ const XML_Char *expected = XCS("\xef\xbb\x80");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that UTF-8 in a CDATA section is correctly passed through */
+START_TEST(test_utf8_in_cdata_section) {
+ const char *text = "<doc><![CDATA[one \xc3\xa9 two]]></doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("one \x00e9 two");
+#else
+ const XML_Char *expected = XCS("one \xc3\xa9 two");
+#endif
+
+ run_character_check(text, expected);
+}
+END_TEST
+
+/* Test that little-endian UTF-16 in a CDATA section is handled */
+START_TEST(test_utf8_in_cdata_section_2) {
+ const char *text = "<doc><![CDATA[\xc3\xa9]\xc3\xa9two]]></doc>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e9]\x00e9two");
+#else
+ const XML_Char *expected = XCS("\xc3\xa9]\xc3\xa9two");
+#endif
+
+ run_character_check(text, expected);
+}
+END_TEST
+
+START_TEST(test_utf8_in_start_tags) {
+ struct test_case {
+ bool goodName;
+ bool goodNameStart;
+ const char *tagName;
+ };
+
+ // The idea with the tests below is this:
+ // We want to cover 1-, 2- and 3-byte sequences, 4-byte sequences
+ // go to isNever and are hence not a concern.
+ //
+ // We start with a character that is a valid name character
+ // (or even name-start character, see XML 1.0r4 spec) and then we flip
+ // single bits at places where (1) the result leaves the UTF-8 encoding space
+ // and (2) we stay in the same n-byte sequence family.
+ //
+ // The flipped bits are highlighted in angle brackets in comments,
+ // e.g. "[<1>011 1001]" means we had [0011 1001] but we now flipped
+ // the most significant bit to 1 to leave UTF-8 encoding space.
+ struct test_case cases[] = {
+ // 1-byte UTF-8: [0xxx xxxx]
+ {true, true, "\x3A"}, // [0011 1010] = ASCII colon ':'
+ {false, false, "\xBA"}, // [<1>011 1010]
+ {true, false, "\x39"}, // [0011 1001] = ASCII nine '9'
+ {false, false, "\xB9"}, // [<1>011 1001]
+
+ // 2-byte UTF-8: [110x xxxx] [10xx xxxx]
+ {true, true, "\xDB\xA5"}, // [1101 1011] [1010 0101] =
+ // Arabic small waw U+06E5
+ {false, false, "\x9B\xA5"}, // [1<0>01 1011] [1010 0101]
+ {false, false, "\xDB\x25"}, // [1101 1011] [<0>010 0101]
+ {false, false, "\xDB\xE5"}, // [1101 1011] [1<1>10 0101]
+ {true, false, "\xCC\x81"}, // [1100 1100] [1000 0001] =
+ // combining char U+0301
+ {false, false, "\x8C\x81"}, // [1<0>00 1100] [1000 0001]
+ {false, false, "\xCC\x01"}, // [1100 1100] [<0>000 0001]
+ {false, false, "\xCC\xC1"}, // [1100 1100] [1<1>00 0001]
+
+ // 3-byte UTF-8: [1110 xxxx] [10xx xxxx] [10xxxxxx]
+ {true, true, "\xE0\xA4\x85"}, // [1110 0000] [1010 0100] [1000 0101] =
+ // Devanagari Letter A U+0905
+ {false, false, "\xA0\xA4\x85"}, // [1<0>10 0000] [1010 0100] [1000 0101]
+ {false, false, "\xE0\x24\x85"}, // [1110 0000] [<0>010 0100] [1000 0101]
+ {false, false, "\xE0\xE4\x85"}, // [1110 0000] [1<1>10 0100] [1000 0101]
+ {false, false, "\xE0\xA4\x05"}, // [1110 0000] [1010 0100] [<0>000 0101]
+ {false, false, "\xE0\xA4\xC5"}, // [1110 0000] [1010 0100] [1<1>00 0101]
+ {true, false, "\xE0\xA4\x81"}, // [1110 0000] [1010 0100] [1000 0001] =
+ // combining char U+0901
+ {false, false, "\xA0\xA4\x81"}, // [1<0>10 0000] [1010 0100] [1000 0001]
+ {false, false, "\xE0\x24\x81"}, // [1110 0000] [<0>010 0100] [1000 0001]
+ {false, false, "\xE0\xE4\x81"}, // [1110 0000] [1<1>10 0100] [1000 0001]
+ {false, false, "\xE0\xA4\x01"}, // [1110 0000] [1010 0100] [<0>000 0001]
+ {false, false, "\xE0\xA4\xC1"}, // [1110 0000] [1010 0100] [1<1>00 0001]
+ };
+ const bool atNameStart[] = {true, false};
+
+ size_t i = 0;
+ char doc[1024];
+ size_t failCount = 0;
+
+ // we need all the bytes to be parsed, but we don't want the errors that can
+ // trigger on isFinal=XML_TRUE, so we skip the test if the heuristic is on.
+ if (g_reparseDeferralEnabledDefault) {
+ return;
+ }
+
+ for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
+ size_t j = 0;
+ for (; j < sizeof(atNameStart) / sizeof(atNameStart[0]); j++) {
+ const bool expectedSuccess
+ = atNameStart[j] ? cases[i].goodNameStart : cases[i].goodName;
+ snprintf(doc, sizeof(doc), "<%s%s><!--", atNameStart[j] ? "" : "a",
+ cases[i].tagName);
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ const enum XML_Status status = _XML_Parse_SINGLE_BYTES(
+ parser, doc, (int)strlen(doc), /*isFinal=*/XML_FALSE);
+
+ bool success = true;
+ if ((status == XML_STATUS_OK) != expectedSuccess) {
+ success = false;
+ }
+ if ((status == XML_STATUS_ERROR)
+ && (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)) {
+ success = false;
+ }
+
+ if (! success) {
+ fprintf(
+ stderr,
+ "FAIL case %2u (%sat name start, %u-byte sequence, error code %d)\n",
+ (unsigned)i + 1u, atNameStart[j] ? " " : "not ",
+ (unsigned)strlen(cases[i].tagName), XML_GetErrorCode(parser));
+ failCount++;
+ }
+
+ XML_ParserFree(parser);
+ }
+ }
+
+ if (failCount > 0) {
+ fail("UTF-8 regression detected");
+ }
+}
+END_TEST
+
+/* Test trailing spaces in elements are accepted */
+START_TEST(test_trailing_spaces_in_elements) {
+ const char *text = "<doc >Hi</doc >";
+ const XML_Char *expected = XCS("doc/doc");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetElementHandler(g_parser, record_element_start_handler,
+ record_element_end_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_utf16_attribute) {
+ const char text[] =
+ /* <d {KHO KHWAI}{CHO CHAN}='a'/>
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
+ */
+ "<\0d\0 \0\x04\x0e\x08\x0e=\0'\0a\0'\0/\0>\0";
+ const XML_Char *expected = XCS("a");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetStartElementHandler(g_parser, accumulate_attribute);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_utf16_second_attr) {
+ /* <d a='1' {KHO KHWAI}{CHO CHAN}='2'/>
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
+ */
+ const char text[] = "<\0d\0 \0a\0=\0'\0\x31\0'\0 \0"
+ "\x04\x0e\x08\x0e=\0'\0\x32\0'\0/\0>\0";
+ const XML_Char *expected = XCS("1");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetStartElementHandler(g_parser, accumulate_attribute);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_attr_after_solidus) {
+ const char *text = "<doc attr1='a' / attr2='b'>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN, "Misplaced / not faulted");
+}
+END_TEST
+
+START_TEST(test_utf16_pe) {
+ /* <!DOCTYPE doc [
+ * <!ENTITY % {KHO KHWAI}{CHO CHAN} '<!ELEMENT doc (#PCDATA)>'>
+ * %{KHO KHWAI}{CHO CHAN};
+ * ]>
+ * <doc></doc>
+ *
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
+ */
+ const char text[] = "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0\n"
+ "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \x0e\x04\x0e\x08\0 "
+ "\0'\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 "
+ "\0d\0o\0c\0 \0(\0#\0P\0C\0D\0A\0T\0A\0)\0>\0'\0>\0\n"
+ "\0%\x0e\x04\x0e\x08\0;\0\n"
+ "\0]\0>\0\n"
+ "\0<\0d\0o\0c\0>\0<\0/\0d\0o\0c\0>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x0e04\x0e08=<!ELEMENT doc (#PCDATA)>\n");
+#else
+ const XML_Char *expected
+ = XCS("\xe0\xb8\x84\xe0\xb8\x88=<!ELEMENT doc (#PCDATA)>\n");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetEntityDeclHandler(g_parser, accumulate_entity_decl);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that duff attribute description keywords are rejected */
+START_TEST(test_bad_attr_desc_keyword) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ATTLIST doc attr CDATA #!IMPLIED>\n"
+ "]>\n"
+ "<doc />";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Bad keyword !IMPLIED not faulted");
+}
+END_TEST
+
+/* Test that an invalid attribute description keyword consisting of
+ * UTF-16 characters with their top bytes non-zero are correctly
+ * faulted
+ */
+START_TEST(test_bad_attr_desc_keyword_utf16) {
+ /* <!DOCTYPE d [
+ * <!ATTLIST d a CDATA #{KHO KHWAI}{CHO CHAN}>
+ * ]><d/>
+ *
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
+ */
+ const char text[]
+ = "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n"
+ "\0<\0!\0A\0T\0T\0L\0I\0S\0T\0 \0d\0 \0a\0 \0C\0D\0A\0T\0A\0 "
+ "\0#\x0e\x04\x0e\x08\0>\0\n"
+ "\0]\0>\0<\0d\0/\0>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Invalid UTF16 attribute keyword not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_SYNTAX)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that invalid syntax in a <!DOCTYPE> is rejected. Do this
+ * using prefix-encoding (see above) to trigger specific code paths
+ */
+START_TEST(test_bad_doctype) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<!DOCTYPE doc [ \x80\x44 ]><doc/>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "Invalid bytes in DOCTYPE not faulted");
+}
+END_TEST
+
+START_TEST(test_bad_doctype_utf8) {
+ const char *text = "<!DOCTYPE \xDB\x25"
+ "doc><doc/>"; // [1101 1011] [<0>010 0101]
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid UTF-8 in DOCTYPE not faulted");
+}
+END_TEST
+
+START_TEST(test_bad_doctype_utf16) {
+ const char text[] =
+ /* <!DOCTYPE doc [ \x06f2 ]><doc/>
+ *
+ * U+06F2 = EXTENDED ARABIC-INDIC DIGIT TWO, a valid number
+ * (name character) but not a valid letter (name start character)
+ */
+ "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0 "
+ "\x06\xf2"
+ "\0 \0]\0>\0<\0d\0o\0c\0/\0>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Invalid bytes in DOCTYPE not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_SYNTAX)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_bad_doctype_plus) {
+ const char *text = "<!DOCTYPE 1+ [ <!ENTITY foo 'bar'> ]>\n"
+ "<1+>&foo;</1+>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "'+' in document name not faulted");
+}
+END_TEST
+
+START_TEST(test_bad_doctype_star) {
+ const char *text = "<!DOCTYPE 1* [ <!ENTITY foo 'bar'> ]>\n"
+ "<1*>&foo;</1*>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "'*' in document name not faulted");
+}
+END_TEST
+
+START_TEST(test_bad_doctype_query) {
+ const char *text = "<!DOCTYPE 1? [ <!ENTITY foo 'bar'> ]>\n"
+ "<1?>&foo;</1?>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "'?' in document name not faulted");
+}
+END_TEST
+
+START_TEST(test_unknown_encoding_bad_ignore) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>"
+ "<!DOCTYPE doc SYSTEM 'foo'>"
+ "<doc><e>&entity;</e></doc>";
+ ExtFaults fault = {"<![IGNORE[<!ELEMENT \xffG (#PCDATA)*>]]>",
+ "Invalid character not faulted", XCS("prefix-conv"),
+ XML_ERROR_INVALID_TOKEN};
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
+ XML_SetUserData(g_parser, &fault);
+ expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ "Bad IGNORE section with unknown encoding not failed");
+}
+END_TEST
+
+START_TEST(test_entity_in_utf16_be_attr) {
+ const char text[] =
+ /* <e a='&#228; &#x00E4;'></e> */
+ "\0<\0e\0 \0a\0=\0'\0&\0#\0\x32\0\x32\0\x38\0;\0 "
+ "\0&\0#\0x\0\x30\0\x30\0E\0\x34\0;\0'\0>\0<\0/\0e\0>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e4 \x00e4");
+#else
+ const XML_Char *expected = XCS("\xc3\xa4 \xc3\xa4");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetStartElementHandler(g_parser, accumulate_attribute);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_entity_in_utf16_le_attr) {
+ const char text[] =
+ /* <e a='&#228; &#x00E4;'></e> */
+ "<\0e\0 \0a\0=\0'\0&\0#\0\x32\0\x32\0\x38\0;\0 \0"
+ "&\0#\0x\0\x30\0\x30\0E\0\x34\0;\0'\0>\0<\0/\0e\0>\0";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("\x00e4 \x00e4");
+#else
+ const XML_Char *expected = XCS("\xc3\xa4 \xc3\xa4");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetStartElementHandler(g_parser, accumulate_attribute);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_entity_public_utf16_be) {
+ const char text[] =
+ /* <!DOCTYPE d [ */
+ "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n"
+ /* <!ENTITY % e PUBLIC 'foo' 'bar.ent'> */
+ "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \0e\0 \0P\0U\0B\0L\0I\0C\0 "
+ "\0'\0f\0o\0o\0'\0 \0'\0b\0a\0r\0.\0e\0n\0t\0'\0>\0\n"
+ /* %e; */
+ "\0%\0e\0;\0\n"
+ /* ]> */
+ "\0]\0>\0\n"
+ /* <d>&j;</d> */
+ "\0<\0d\0>\0&\0j\0;\0<\0/\0d\0>";
+ ExtTest2 test_data
+ = {/* <!ENTITY j 'baz'> */
+ "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0j\0 \0'\0b\0a\0z\0'\0>", 34, NULL, NULL};
+ const XML_Char *expected = XCS("baz");
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_entity_public_utf16_le) {
+ const char text[] =
+ /* <!DOCTYPE d [ */
+ "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n\0"
+ /* <!ENTITY % e PUBLIC 'foo' 'bar.ent'> */
+ "<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \0e\0 \0P\0U\0B\0L\0I\0C\0 \0"
+ "'\0f\0o\0o\0'\0 \0'\0b\0a\0r\0.\0e\0n\0t\0'\0>\0\n\0"
+ /* %e; */
+ "%\0e\0;\0\n\0"
+ /* ]> */
+ "]\0>\0\n\0"
+ /* <d>&j;</d> */
+ "<\0d\0>\0&\0j\0;\0<\0/\0d\0>\0";
+ ExtTest2 test_data
+ = {/* <!ENTITY j 'baz'> */
+ "<\0!\0E\0N\0T\0I\0T\0Y\0 \0j\0 \0'\0b\0a\0z\0'\0>\0", 34, NULL, NULL};
+ const XML_Char *expected = XCS("baz");
+ CharData storage;
+
+ CharData_Init(&storage);
+ test_data.storage = &storage;
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test that a doctype with neither an internal nor external subset is
+ * faulted
+ */
+START_TEST(test_short_doctype) {
+ const char *text = "<!DOCTYPE doc></doc>";
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "DOCTYPE without subset not rejected");
+}
+END_TEST
+
+START_TEST(test_short_doctype_2) {
+ const char *text = "<!DOCTYPE doc PUBLIC></doc>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "DOCTYPE without Public ID not rejected");
+}
+END_TEST
+
+START_TEST(test_short_doctype_3) {
+ const char *text = "<!DOCTYPE doc SYSTEM></doc>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "DOCTYPE without System ID not rejected");
+}
+END_TEST
+
+START_TEST(test_long_doctype) {
+ const char *text = "<!DOCTYPE doc PUBLIC 'foo' 'bar' 'baz'></doc>";
+ expect_failure(text, XML_ERROR_SYNTAX, "DOCTYPE with extra ID not rejected");
+}
+END_TEST
+
+START_TEST(test_bad_entity) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY foo PUBLIC>\n"
+ "]>\n"
+ "<doc/>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "ENTITY without Public ID is not rejected");
+}
+END_TEST
+
+/* Test unquoted value is faulted */
+START_TEST(test_bad_entity_2) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY % foo bar>\n"
+ "]>\n"
+ "<doc/>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "ENTITY without Public ID is not rejected");
+}
+END_TEST
+
+START_TEST(test_bad_entity_3) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY % foo PUBLIC>\n"
+ "]>\n"
+ "<doc/>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "Parameter ENTITY without Public ID is not rejected");
+}
+END_TEST
+
+START_TEST(test_bad_entity_4) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ENTITY % foo SYSTEM>\n"
+ "]>\n"
+ "<doc/>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "Parameter ENTITY without Public ID is not rejected");
+}
+END_TEST
+
+START_TEST(test_bad_notation) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!NOTATION n SYSTEM>\n"
+ "]>\n"
+ "<doc/>";
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "Notation without System ID is not rejected");
+}
+END_TEST
+
+/* Test for issue #11, wrongly suppressed default handler */
+START_TEST(test_default_doctype_handler) {
+ const char *text = "<!DOCTYPE doc PUBLIC 'pubname' 'test.dtd' [\n"
+ " <!ENTITY foo 'bar'>\n"
+ "]>\n"
+ "<doc>&foo;</doc>";
+ DefaultCheck test_data[] = {{XCS("'pubname'"), 9, XML_FALSE},
+ {XCS("'test.dtd'"), 10, XML_FALSE},
+ {NULL, 0, XML_FALSE}};
+ int i;
+
+ XML_SetUserData(g_parser, &test_data);
+ XML_SetDefaultHandler(g_parser, checking_default_handler);
+ XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ for (i = 0; test_data[i].expected != NULL; i++)
+ if (! test_data[i].seen)
+ fail("Default handler not run for public !DOCTYPE");
+}
+END_TEST
+
+START_TEST(test_empty_element_abort) {
+ const char *text = "<abort/>";
+
+ XML_SetStartElementHandler(g_parser, start_element_suspender);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Expected to error on abort");
+}
+END_TEST
+
+/* Regression test for GH issue #612: unfinished m_declAttributeType
+ * allocation in ->m_tempPool can corrupt following allocation.
+ */
+START_TEST(test_pool_integrity_with_unfinished_attr) {
+ const char *text = "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<!DOCTYPE foo [\n"
+ "<!ELEMENT foo ANY>\n"
+ "<!ENTITY % entp SYSTEM \"external.dtd\">\n"
+ "%entp;\n"
+ "]>\n"
+ "<a></a>\n";
+ const XML_Char *expected = XCS("COMMENT");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_unfinished_attlist);
+ XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
+ XML_SetCommentHandler(g_parser, accumulate_comment);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+/* Test a possible early return location in internalEntityProcessor */
+START_TEST(test_entity_ref_no_elements) {
+ const char *const text = "<!DOCTYPE foo [\n"
+ "<!ENTITY e1 \"test\">\n"
+ "]> <foo>&e1;"; // intentionally missing newline
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR);
+ assert_true(XML_GetErrorCode(parser) == XML_ERROR_NO_ELEMENTS);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+/* Tests if chained entity references lead to unbounded recursion */
+START_TEST(test_deep_nested_entity) {
+ const size_t N_LINES = 60000;
+ const size_t SIZE_PER_LINE = 50;
+
+ char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE);
+ if (text == NULL) {
+ fail("malloc failed");
+ }
+
+ char *textPtr = text;
+
+ // Create the XML
+ textPtr += snprintf(textPtr, SIZE_PER_LINE,
+ "<!DOCTYPE foo [\n"
+ " <!ENTITY s0 'deepText'>\n");
+
+ for (size_t i = 1; i < N_LINES; ++i) {
+ textPtr += snprintf(textPtr, SIZE_PER_LINE, " <!ENTITY s%lu '&s%lu;'>\n",
+ (long unsigned)i, (long unsigned)(i - 1));
+ }
+
+ snprintf(textPtr, SIZE_PER_LINE, "]> <foo>&s%lu;</foo>\n",
+ (long unsigned)(N_LINES - 1));
+
+ const XML_Char *const expected = XCS("deepText");
+
+ CharData storage;
+ CharData_Init(&storage);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ XML_SetCharacterDataHandler(parser, accumulate_characters);
+ XML_SetUserData(parser, &storage);
+
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ CharData_CheckXMLChars(&storage, expected);
+ XML_ParserFree(parser);
+ free(text);
+}
+END_TEST
+
+/* Tests if chained entity references in attributes
+lead to unbounded recursion */
+START_TEST(test_deep_nested_attribute_entity) {
+ const size_t N_LINES = 60000;
+ const size_t SIZE_PER_LINE = 100;
+
+ char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE);
+ if (text == NULL) {
+ fail("malloc failed");
+ }
+
+ char *textPtr = text;
+
+ // Create the XML
+ textPtr += snprintf(textPtr, SIZE_PER_LINE,
+ "<!DOCTYPE foo [\n"
+ " <!ENTITY s0 'deepText'>\n");
+
+ for (size_t i = 1; i < N_LINES; ++i) {
+ textPtr += snprintf(textPtr, SIZE_PER_LINE, " <!ENTITY s%lu '&s%lu;'>\n",
+ (long unsigned)i, (long unsigned)(i - 1));
+ }
+
+ snprintf(textPtr, SIZE_PER_LINE, "]> <foo name='&s%lu;'>mainText</foo>\n",
+ (long unsigned)(N_LINES - 1));
+
+ AttrInfo doc_info[] = {{XCS("name"), XCS("deepText")}, {NULL, NULL}};
+ ElementInfo info[] = {{XCS("foo"), 1, NULL, NULL}, {NULL, 0, NULL, NULL}};
+ info[0].attributes = doc_info;
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ ParserAndElementInfo parserPlusElemenInfo = {parser, info};
+
+ XML_SetStartElementHandler(parser, counting_start_element_handler);
+ XML_SetUserData(parser, &parserPlusElemenInfo);
+
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ XML_ParserFree(parser);
+ free(text);
+}
+END_TEST
+
+START_TEST(test_deep_nested_entity_delayed_interpretation) {
+ const size_t N_LINES = 70000;
+ const size_t SIZE_PER_LINE = 100;
+
+ char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE);
+ if (text == NULL) {
+ fail("malloc failed");
+ }
+
+ char *textPtr = text;
+
+ // Create the XML
+ textPtr += snprintf(textPtr, SIZE_PER_LINE,
+ "<!DOCTYPE foo [\n"
+ " <!ENTITY %% s0 'deepText'>\n");
+
+ for (size_t i = 1; i < N_LINES; ++i) {
+ textPtr += snprintf(textPtr, SIZE_PER_LINE,
+ " <!ENTITY %% s%lu '&#37;s%lu;'>\n", (long unsigned)i,
+ (long unsigned)(i - 1));
+ }
+
+ snprintf(textPtr, SIZE_PER_LINE,
+ " <!ENTITY %% define_g \"<!ENTITY g '&#37;s%lu;'>\">\n"
+ " %%define_g;\n"
+ "]>\n"
+ "<foo/>\n",
+ (long unsigned)(N_LINES - 1));
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ XML_ParserFree(parser);
+ free(text);
+}
+END_TEST
+
+START_TEST(test_nested_entity_suspend) {
+ const char *const text = "<!DOCTYPE a [\n"
+ " <!ENTITY e1 '<!--e1-->'>\n"
+ " <!ENTITY e2 '<!--e2 head-->&e1;<!--e2 tail-->'>\n"
+ " <!ENTITY e3 '<!--e3 head-->&e2;<!--e3 tail-->'>\n"
+ "]>\n"
+ "<a><!--start-->&e3;<!--end--></a>";
+ const XML_Char *const expected = XCS("start") XCS("e3 head") XCS("e2 head")
+ XCS("e1") XCS("e2 tail") XCS("e3 tail") XCS("end");
+ CharData storage;
+ CharData_Init(&storage);
+ XML_Parser parser = XML_ParserCreate(NULL);
+ ParserPlusStorage parserPlusStorage = {parser, &storage};
+
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetCommentHandler(parser, accumulate_and_suspend_comment_handler);
+ XML_SetUserData(parser, &parserPlusStorage);
+
+ enum XML_Status status = XML_Parse(parser, text, (int)strlen(text), XML_TRUE);
+ while (status == XML_STATUS_SUSPENDED) {
+ status = XML_ResumeParser(parser);
+ }
+ if (status != XML_STATUS_OK)
+ xml_failure(parser);
+
+ CharData_CheckXMLChars(&storage, expected);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+START_TEST(test_nested_entity_suspend_2) {
+ const char *const text = "<!DOCTYPE doc [\n"
+ " <!ENTITY ge1 'head1Ztail1'>\n"
+ " <!ENTITY ge2 'head2&ge1;tail2'>\n"
+ " <!ENTITY ge3 'head3&ge2;tail3'>\n"
+ "]>\n"
+ "<doc>&ge3;</doc>";
+ const XML_Char *const expected = XCS("head3") XCS("head2") XCS("head1")
+ XCS("Z") XCS("tail1") XCS("tail2") XCS("tail3");
+ CharData storage;
+ CharData_Init(&storage);
+ XML_Parser parser = XML_ParserCreate(NULL);
+ ParserPlusStorage parserPlusStorage = {parser, &storage};
+
+ XML_SetCharacterDataHandler(parser, accumulate_char_data_and_suspend);
+ XML_SetUserData(parser, &parserPlusStorage);
+
+ enum XML_Status status = XML_Parse(parser, text, (int)strlen(text), XML_TRUE);
+ while (status == XML_STATUS_SUSPENDED) {
+ status = XML_ResumeParser(parser);
+ }
+ if (status != XML_STATUS_OK)
+ xml_failure(parser);
+
+ CharData_CheckXMLChars(&storage, expected);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+/* Regression test for quadratic parsing on large tokens */
+START_TEST(test_big_tokens_scale_linearly) {
+ const struct {
+ const char *pre;
+ const char *post;
+ } text[] = {
+ {"<a>", "</a>"}, // assumed good, used as baseline
+ {"<b><![CDATA[ value: ", " ]]></b>"}, // CDATA, performed OK before patch
+ {"<c attr='", "'></c>"}, // big attribute, used to be O(N²)
+ {"<d><!-- ", " --></d>"}, // long comment, used to be O(N²)
+ {"<e><", "/></e>"}, // big elem name, used to be O(N²)
+ };
+ const int num_cases = sizeof(text) / sizeof(text[0]);
+ char aaaaaa[4096];
+ const int fillsize = (int)sizeof(aaaaaa);
+ const int fillcount = 100;
+ const unsigned approx_bytes = fillsize * fillcount; // ignore pre/post.
+ const unsigned max_factor = 4;
+ const unsigned max_scanned = max_factor * approx_bytes;
+
+ memset(aaaaaa, 'a', fillsize);
+
+ if (! g_reparseDeferralEnabledDefault) {
+ return; // heuristic is disabled; we would get O(n^2) and fail.
+ }
+
+ for (int i = 0; i < num_cases; ++i) {
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ enum XML_Status status;
+ set_subtest("text=\"%saaaaaa%s\"", text[i].pre, text[i].post);
+
+ // parse the start text
+ g_bytesScanned = 0;
+ status = _XML_Parse_SINGLE_BYTES(parser, text[i].pre,
+ (int)strlen(text[i].pre), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+
+ // parse lots of 'a', failing the test early if it takes too long
+ unsigned past_max_count = 0;
+ for (int f = 0; f < fillcount; ++f) {
+ status = _XML_Parse_SINGLE_BYTES(parser, aaaaaa, fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ if (g_bytesScanned > max_scanned) {
+ // We're not done, and have already passed the limit -- the test will
+ // definitely fail. This block allows us to save time by failing early.
+ const unsigned pushed
+ = (unsigned)strlen(text[i].pre) + (f + 1) * fillsize;
+ fprintf(
+ stderr,
+ "after %d/%d loops: pushed=%u scanned=%u (factor ~%.2f) max_scanned: %u (factor ~%u)\n",
+ f + 1, fillcount, pushed, g_bytesScanned,
+ g_bytesScanned / (double)pushed, max_scanned, max_factor);
+ past_max_count++;
+ // We are failing, but allow a few log prints first. If we don't reach
+ // a count of five, the test will fail after the loop instead.
+ assert_true(past_max_count < 5);
+ }
+ }
+
+ // parse the end text
+ status = _XML_Parse_SINGLE_BYTES(parser, text[i].post,
+ (int)strlen(text[i].post), XML_TRUE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+
+ assert_true(g_bytesScanned > approx_bytes); // or the counter isn't working
+ if (g_bytesScanned > max_scanned) {
+ fprintf(
+ stderr,
+ "after all input: scanned=%u (factor ~%.2f) max_scanned: %u (factor ~%u)\n",
+ g_bytesScanned, g_bytesScanned / (double)approx_bytes, max_scanned,
+ max_factor);
+ fail("scanned too many bytes");
+ }
+
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+START_TEST(test_set_reparse_deferral) {
+ const char *const pre = "<d>";
+ const char *const start = "<x attr='";
+ const char *const end = "'></x>";
+ char eeeeee[100];
+ const int fillsize = (int)sizeof(eeeeee);
+ memset(eeeeee, 'e', fillsize);
+
+ for (int enabled = 0; enabled <= 1; enabled += 1) {
+ set_subtest("deferral=%d", enabled);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ assert_true(XML_SetReparseDeferralEnabled(parser, enabled));
+ // pre-grow the buffer to avoid reparsing due to almost-fullness
+ assert_true(XML_GetBuffer(parser, fillsize * 10103) != NULL);
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(parser, &storage);
+ XML_SetStartElementHandler(parser, start_element_event_handler);
+
+ enum XML_Status status;
+ // parse the start text
+ status = XML_Parse(parser, pre, (int)strlen(pre), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ CharData_CheckXMLChars(&storage, XCS("d")); // first element should be done
+
+ // ..and the start of the token
+ status = XML_Parse(parser, start, (int)strlen(start), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ CharData_CheckXMLChars(&storage, XCS("d")); // still just the first one
+
+ // try to parse lots of 'e', but the token isn't finished
+ for (int c = 0; c < 100; ++c) {
+ status = XML_Parse(parser, eeeeee, fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ }
+ CharData_CheckXMLChars(&storage, XCS("d")); // *still* just the first one
+
+ // end the <x> token.
+ status = XML_Parse(parser, end, (int)strlen(end), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+
+ if (enabled) {
+ // In general, we may need to push more data to trigger a reparse attempt,
+ // but in this test, the data is constructed to always require it.
+ CharData_CheckXMLChars(&storage, XCS("d")); // or the test is incorrect
+ // 2x the token length should suffice; the +1 covers the start and end.
+ for (int c = 0; c < 101; ++c) {
+ status = XML_Parse(parser, eeeeee, fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ }
+ }
+ CharData_CheckXMLChars(&storage, XCS("dx")); // the <x> should be done
+
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+struct element_decl_data {
+ XML_Parser parser;
+ int count;
+};
+
+static void
+element_decl_counter(void *userData, const XML_Char *name, XML_Content *model) {
+ UNUSED_P(name);
+ struct element_decl_data *testdata = (struct element_decl_data *)userData;
+ testdata->count += 1;
+ XML_FreeContentModel(testdata->parser, model);
+}
+
+static int
+external_inherited_parser(XML_Parser p, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ const char *const pre = "<!ELEMENT document ANY>\n";
+ const char *const start = "<!ELEMENT ";
+ const char *const end = " ANY>\n";
+ const char *const post = "<!ELEMENT xyz ANY>\n";
+ const int enabled = *(int *)XML_GetUserData(p);
+ char eeeeee[100];
+ char spaces[100];
+ const int fillsize = (int)sizeof(eeeeee);
+ assert_true(fillsize == (int)sizeof(spaces));
+ memset(eeeeee, 'e', fillsize);
+ memset(spaces, ' ', fillsize);
+
+ XML_Parser parser = XML_ExternalEntityParserCreate(p, context, NULL);
+ assert_true(parser != NULL);
+ // pre-grow the buffer to avoid reparsing due to almost-fullness
+ assert_true(XML_GetBuffer(parser, fillsize * 10103) != NULL);
+
+ struct element_decl_data testdata;
+ testdata.parser = parser;
+ testdata.count = 0;
+ XML_SetUserData(parser, &testdata);
+ XML_SetElementDeclHandler(parser, element_decl_counter);
+
+ enum XML_Status status;
+ // parse the initial text
+ status = XML_Parse(parser, pre, (int)strlen(pre), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ assert_true(testdata.count == 1); // first element should be done
+
+ // ..and the start of the big token
+ status = XML_Parse(parser, start, (int)strlen(start), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ assert_true(testdata.count == 1); // still just the first one
+
+ // try to parse lots of 'e', but the token isn't finished
+ for (int c = 0; c < 100; ++c) {
+ status = XML_Parse(parser, eeeeee, fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ }
+ assert_true(testdata.count == 1); // *still* just the first one
+
+ // end the big token.
+ status = XML_Parse(parser, end, (int)strlen(end), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+
+ if (enabled) {
+ // In general, we may need to push more data to trigger a reparse attempt,
+ // but in this test, the data is constructed to always require it.
+ assert_true(testdata.count == 1); // or the test is incorrect
+ // 2x the token length should suffice; the +1 covers the start and end.
+ for (int c = 0; c < 101; ++c) {
+ status = XML_Parse(parser, spaces, fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ }
+ }
+ assert_true(testdata.count == 2); // the big token should be done
+
+ // parse the final text
+ status = XML_Parse(parser, post, (int)strlen(post), XML_TRUE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ assert_true(testdata.count == 3); // after isFinal=XML_TRUE, all must be done
+
+ XML_ParserFree(parser);
+ return XML_STATUS_OK;
+}
+
+START_TEST(test_reparse_deferral_is_inherited) {
+ const char *const text
+ = "<!DOCTYPE document SYSTEM 'something.ext'><document/>";
+ for (int enabled = 0; enabled <= 1; ++enabled) {
+ set_subtest("deferral=%d", enabled);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ XML_SetUserData(parser, (void *)&enabled);
+ XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ // this handler creates a sub-parser and checks that its deferral behavior
+ // is what we expected, based on the value of `enabled` (in userdata).
+ XML_SetExternalEntityRefHandler(parser, external_inherited_parser);
+ assert_true(XML_SetReparseDeferralEnabled(parser, enabled));
+ if (XML_Parse(parser, text, (int)strlen(text), XML_TRUE) != XML_STATUS_OK)
+ xml_failure(parser);
+
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+START_TEST(test_set_reparse_deferral_on_null_parser) {
+ assert_true(XML_SetReparseDeferralEnabled(NULL, 0) == XML_FALSE);
+ assert_true(XML_SetReparseDeferralEnabled(NULL, 1) == XML_FALSE);
+ assert_true(XML_SetReparseDeferralEnabled(NULL, 10) == XML_FALSE);
+ assert_true(XML_SetReparseDeferralEnabled(NULL, 100) == XML_FALSE);
+ assert_true(XML_SetReparseDeferralEnabled(NULL, (XML_Bool)INT_MIN)
+ == XML_FALSE);
+ assert_true(XML_SetReparseDeferralEnabled(NULL, (XML_Bool)INT_MAX)
+ == XML_FALSE);
+}
+END_TEST
+
+START_TEST(test_set_reparse_deferral_on_the_fly) {
+ const char *const pre = "<d><x attr='";
+ const char *const end = "'></x>";
+ char iiiiii[100];
+ const int fillsize = (int)sizeof(iiiiii);
+ memset(iiiiii, 'i', fillsize);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ assert_true(XML_SetReparseDeferralEnabled(parser, XML_TRUE));
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(parser, &storage);
+ XML_SetStartElementHandler(parser, start_element_event_handler);
+
+ enum XML_Status status;
+ // parse the start text
+ status = XML_Parse(parser, pre, (int)strlen(pre), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ CharData_CheckXMLChars(&storage, XCS("d")); // first element should be done
+
+ // try to parse some 'i', but the token isn't finished
+ status = XML_Parse(parser, iiiiii, fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ CharData_CheckXMLChars(&storage, XCS("d")); // *still* just the first one
+
+ // end the <x> token.
+ status = XML_Parse(parser, end, (int)strlen(end), XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ CharData_CheckXMLChars(&storage, XCS("d")); // not yet.
+
+ // now change the heuristic setting and add *no* data
+ assert_true(XML_SetReparseDeferralEnabled(parser, XML_FALSE));
+ // we avoid isFinal=XML_TRUE, because that would force-bypass the heuristic.
+ status = XML_Parse(parser, "", 0, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ CharData_CheckXMLChars(&storage, XCS("dx"));
+
+ XML_ParserFree(parser);
+}
+END_TEST
+
+START_TEST(test_set_bad_reparse_option) {
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 2));
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 3));
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 99));
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 127));
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 128));
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 129));
+ assert_true(XML_FALSE == XML_SetReparseDeferralEnabled(parser, 255));
+ assert_true(XML_TRUE == XML_SetReparseDeferralEnabled(parser, 0));
+ assert_true(XML_TRUE == XML_SetReparseDeferralEnabled(parser, 1));
+ XML_ParserFree(parser);
+}
+END_TEST
+
+static size_t g_totalAlloc = 0;
+static size_t g_biggestAlloc = 0;
+
+static void *
+counting_realloc(void *ptr, size_t size) {
+ g_totalAlloc += size;
+ if (size > g_biggestAlloc) {
+ g_biggestAlloc = size;
+ }
+ return realloc(ptr, size);
+}
+
+static void *
+counting_malloc(size_t size) {
+ return counting_realloc(NULL, size);
+}
+
+START_TEST(test_bypass_heuristic_when_close_to_bufsize) {
+ if (g_chunkSize != 0) {
+ // this test does not use SINGLE_BYTES, because it depends on very precise
+ // buffer fills.
+ return;
+ }
+ if (! g_reparseDeferralEnabledDefault) {
+ return; // this test is irrelevant when the deferral heuristic is disabled.
+ }
+
+ const int document_length = 65536;
+ char *const document = (char *)malloc(document_length);
+
+ const XML_Memory_Handling_Suite memfuncs = {
+ counting_malloc,
+ counting_realloc,
+ free,
+ };
+
+ const int leading_list[] = {0, 3, 61, 96, 400, 401, 4000, 4010, 4099, -1};
+ const int bigtoken_list[] = {3000, 4000, 4001, 4096, 4099, 5000, 20000, -1};
+ const int fillsize_list[] = {131, 256, 399, 400, 401, 1025, 4099, 4321, -1};
+
+ for (const int *leading = leading_list; *leading >= 0; leading++) {
+ for (const int *bigtoken = bigtoken_list; *bigtoken >= 0; bigtoken++) {
+ for (const int *fillsize = fillsize_list; *fillsize >= 0; fillsize++) {
+ set_subtest("leading=%d bigtoken=%d fillsize=%d", *leading, *bigtoken,
+ *fillsize);
+ // start by checking that the test looks reasonably valid
+ assert_true(*leading + *bigtoken <= document_length);
+
+ // put 'x' everywhere; some will be overwritten by elements.
+ memset(document, 'x', document_length);
+ // maybe add an initial tag
+ if (*leading) {
+ assert_true(*leading >= 3); // or the test case is invalid
+ memcpy(document, "<a>", 3);
+ }
+ // add the large token
+ document[*leading + 0] = '<';
+ document[*leading + 1] = 'b';
+ memset(&document[*leading + 2], ' ', *bigtoken - 2); // a spacy token
+ document[*leading + *bigtoken - 1] = '>';
+
+ // 1 for 'b', plus 1 or 0 depending on the presence of 'a'
+ const int expected_elem_total = 1 + (*leading ? 1 : 0);
+
+ XML_Parser parser = XML_ParserCreate_MM(NULL, &memfuncs, NULL);
+ assert_true(parser != NULL);
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(parser, &storage);
+ XML_SetStartElementHandler(parser, start_element_event_handler);
+
+ g_biggestAlloc = 0;
+ g_totalAlloc = 0;
+ int offset = 0;
+ // fill data until the big token is covered (but not necessarily parsed)
+ while (offset < *leading + *bigtoken) {
+ assert_true(offset + *fillsize <= document_length);
+ const enum XML_Status status
+ = XML_Parse(parser, &document[offset], *fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ offset += *fillsize;
+ }
+ // Now, check that we've had a buffer allocation that could fit the
+ // context bytes and our big token. In order to detect a special case,
+ // we need to know how many bytes of our big token were included in the
+ // first push that contained _any_ bytes of the big token:
+ const int bigtok_first_chunk_bytes = *fillsize - (*leading % *fillsize);
+ if (bigtok_first_chunk_bytes >= *bigtoken && XML_CONTEXT_BYTES == 0) {
+ // Special case: we aren't saving any context, and the whole big token
+ // was covered by a single fill, so Expat may have parsed directly
+ // from our input pointer, without allocating an internal buffer.
+ } else if (*leading < XML_CONTEXT_BYTES) {
+ assert_true(g_biggestAlloc >= *leading + (size_t)*bigtoken);
+ } else {
+ assert_true(g_biggestAlloc >= XML_CONTEXT_BYTES + (size_t)*bigtoken);
+ }
+ // fill data until the big token is actually parsed
+ while (storage.count < expected_elem_total) {
+ const size_t alloc_before = g_totalAlloc;
+ assert_true(offset + *fillsize <= document_length);
+ const enum XML_Status status
+ = XML_Parse(parser, &document[offset], *fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ offset += *fillsize;
+ // since all the bytes of the big token are already in the buffer,
+ // the bufsize ceiling should make us finish its parsing without any
+ // further buffer allocations. We assume that there will be no other
+ // large allocations in this test.
+ assert_true(g_totalAlloc - alloc_before < 4096);
+ }
+ // test-the-test: was our alloc even called?
+ assert_true(g_totalAlloc > 0);
+ // test-the-test: there shouldn't be any extra start elements
+ assert_true(storage.count == expected_elem_total);
+
+ XML_ParserFree(parser);
+ }
+ }
+ }
+ free(document);
+}
+END_TEST
+
+START_TEST(test_varying_buffer_fills) {
+ const int KiB = 1024;
+ const int MiB = 1024 * KiB;
+ const int document_length = 16 * MiB;
+ const int big = 7654321; // arbitrarily chosen between 4 and 8 MiB
+
+ if (g_chunkSize != 0) {
+ return; // this test is slow, and doesn't use _XML_Parse_SINGLE_BYTES().
+ }
+
+ char *const document = (char *)malloc(document_length);
+ assert_true(document != NULL);
+ memset(document, 'x', document_length);
+ document[0] = '<';
+ document[1] = 't';
+ memset(&document[2], ' ', big - 2); // a very spacy token
+ document[big - 1] = '>';
+
+ // Each testcase is a list of buffer fill sizes, terminated by a value < 0.
+ // When reparse deferral is enabled, the final (negated) value is the expected
+ // maximum number of bytes scanned in parse attempts.
+ const int testcases[][30] = {
+ {8 * MiB, -8 * MiB},
+ {4 * MiB, 4 * MiB, -12 * MiB}, // try at 4MB, then 8MB = 12 MB total
+ // zero-size fills shouldn't trigger the bypass
+ {4 * MiB, 0, 4 * MiB, -12 * MiB},
+ {4 * MiB, 0, 0, 4 * MiB, -12 * MiB},
+ {4 * MiB, 0, 1 * MiB, 0, 3 * MiB, -12 * MiB},
+ // try to hit the buffer ceiling only once (at the end)
+ {4 * MiB, 2 * MiB, 1 * MiB, 512 * KiB, 256 * KiB, 256 * KiB, -12 * MiB},
+ // try to hit the same buffer ceiling multiple times
+ {4 * MiB + 1, 2 * MiB, 1 * MiB, 512 * KiB, -25 * MiB},
+
+ // try to hit every ceiling, by always landing 1K shy of the buffer size
+ {1 * KiB, 2 * KiB, 4 * KiB, 8 * KiB, 16 * KiB, 32 * KiB, 64 * KiB,
+ 128 * KiB, 256 * KiB, 512 * KiB, 1 * MiB, 2 * MiB, 4 * MiB, -16 * MiB},
+
+ // try to avoid every ceiling, by always landing 1B past the buffer size
+ // the normal 2x heuristic threshold still forces parse attempts.
+ {2 * KiB + 1, // will attempt 2KiB + 1 ==> total 2KiB + 1
+ 2 * KiB, 4 * KiB, // will attempt 8KiB + 1 ==> total 10KiB + 2
+ 8 * KiB, 16 * KiB, // will attempt 32KiB + 1 ==> total 42KiB + 3
+ 32 * KiB, 64 * KiB, // will attempt 128KiB + 1 ==> total 170KiB + 4
+ 128 * KiB, 256 * KiB, // will attempt 512KiB + 1 ==> total 682KiB + 5
+ 512 * KiB, 1 * MiB, // will attempt 2MiB + 1 ==> total 2M + 682K + 6
+ 2 * MiB, 4 * MiB, // will attempt 8MiB + 1 ==> total 10M + 682K + 7
+ -(10 * MiB + 682 * KiB + 7)},
+ // try to avoid every ceiling again, except on our last fill.
+ {2 * KiB + 1, // will attempt 2KiB + 1 ==> total 2KiB + 1
+ 2 * KiB, 4 * KiB, // will attempt 8KiB + 1 ==> total 10KiB + 2
+ 8 * KiB, 16 * KiB, // will attempt 32KiB + 1 ==> total 42KiB + 3
+ 32 * KiB, 64 * KiB, // will attempt 128KiB + 1 ==> total 170KiB + 4
+ 128 * KiB, 256 * KiB, // will attempt 512KiB + 1 ==> total 682KiB + 5
+ 512 * KiB, 1 * MiB, // will attempt 2MiB + 1 ==> total 2M + 682K + 6
+ 2 * MiB, 4 * MiB - 1, // will attempt 8MiB ==> total 10M + 682K + 6
+ -(10 * MiB + 682 * KiB + 6)},
+
+ // try to hit ceilings on the way multiple times
+ {512 * KiB + 1, 256 * KiB, 128 * KiB, 128 * KiB - 1, // 1 MiB buffer
+ 512 * KiB + 1, 256 * KiB, 128 * KiB, 128 * KiB - 1, // 2 MiB buffer
+ 1 * MiB + 1, 512 * KiB, 256 * KiB, 256 * KiB - 1, // 4 MiB buffer
+ 2 * MiB + 1, 1 * MiB, 512 * KiB, // 8 MiB buffer
+ // we'll make a parse attempt at every parse call
+ -(45 * MiB + 12)},
+ };
+ const int testcount = sizeof(testcases) / sizeof(testcases[0]);
+ for (int test_i = 0; test_i < testcount; test_i++) {
+ const int *fillsize = testcases[test_i];
+ set_subtest("#%d {%d %d %d %d ...}", test_i, fillsize[0], fillsize[1],
+ fillsize[2], fillsize[3]);
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(parser, &storage);
+ XML_SetStartElementHandler(parser, start_element_event_handler);
+
+ g_bytesScanned = 0;
+ int worstcase_bytes = 0; // sum of (buffered bytes at each XML_Parse call)
+ int offset = 0;
+ while (*fillsize >= 0) {
+ assert_true(offset + *fillsize <= document_length); // or test is invalid
+ const enum XML_Status status
+ = XML_Parse(parser, &document[offset], *fillsize, XML_FALSE);
+ if (status != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+ offset += *fillsize;
+ fillsize++;
+ assert_true(offset <= INT_MAX - worstcase_bytes); // avoid overflow
+ worstcase_bytes += offset; // we might've tried to parse all pending bytes
+ }
+ assert_true(storage.count == 1); // the big token should've been parsed
+ assert_true(g_bytesScanned > 0); // test-the-test: does our counter work?
+ if (g_reparseDeferralEnabledDefault) {
+ // heuristic is enabled; some XML_Parse calls may have deferred reparsing
+ const unsigned max_bytes_scanned = -*fillsize;
+ if (g_bytesScanned > max_bytes_scanned) {
+ fprintf(stderr,
+ "bytes scanned in parse attempts: actual=%u limit=%u \n",
+ g_bytesScanned, max_bytes_scanned);
+ fail("too many bytes scanned in parse attempts");
+ }
+ }
+ assert_true(g_bytesScanned <= (unsigned)worstcase_bytes);
+
+ XML_ParserFree(parser);
+ }
+ free(document);
+}
+END_TEST
+
+void
+make_basic_test_case(Suite *s) {
+ TCase *tc_basic = tcase_create("basic tests");
+
+ suite_add_tcase(s, tc_basic);
+ tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
+
+ tcase_add_test(tc_basic, test_nul_byte);
+ tcase_add_test(tc_basic, test_u0000_char);
+ tcase_add_test(tc_basic, test_siphash_self);
+ tcase_add_test(tc_basic, test_siphash_spec);
+ tcase_add_test(tc_basic, test_bom_utf8);
+ tcase_add_test(tc_basic, test_bom_utf16_be);
+ tcase_add_test(tc_basic, test_bom_utf16_le);
+ tcase_add_test(tc_basic, test_nobom_utf16_le);
+ tcase_add_test(tc_basic, test_hash_collision);
+ tcase_add_test(tc_basic, test_illegal_utf8);
+ tcase_add_test(tc_basic, test_utf8_auto_align);
+ tcase_add_test(tc_basic, test_utf16);
+ tcase_add_test(tc_basic, test_utf16_le_epilog_newline);
+ tcase_add_test(tc_basic, test_not_utf16);
+ tcase_add_test(tc_basic, test_bad_encoding);
+ tcase_add_test(tc_basic, test_latin1_umlauts);
+ tcase_add_test(tc_basic, test_long_utf8_character);
+ tcase_add_test(tc_basic, test_long_latin1_attribute);
+ tcase_add_test(tc_basic, test_long_ascii_attribute);
+ /* Regression test for SF bug #491986. */
+ tcase_add_test(tc_basic, test_danish_latin1);
+ /* Regression test for SF bug #514281. */
+ tcase_add_test(tc_basic, test_french_charref_hexidecimal);
+ tcase_add_test(tc_basic, test_french_charref_decimal);
+ tcase_add_test(tc_basic, test_french_latin1);
+ tcase_add_test(tc_basic, test_french_utf8);
+ tcase_add_test(tc_basic, test_utf8_false_rejection);
+ tcase_add_test(tc_basic, test_line_number_after_parse);
+ tcase_add_test(tc_basic, test_column_number_after_parse);
+ tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers);
+ tcase_add_test(tc_basic, test_line_number_after_error);
+ tcase_add_test(tc_basic, test_column_number_after_error);
+ tcase_add_test(tc_basic, test_really_long_lines);
+ tcase_add_test(tc_basic, test_really_long_encoded_lines);
+ tcase_add_test(tc_basic, test_end_element_events);
+ tcase_add_test(tc_basic, test_helper_is_whitespace_normalized);
+ tcase_add_test(tc_basic, test_attr_whitespace_normalization);
+ tcase_add_test(tc_basic, test_xmldecl_misplaced);
+ tcase_add_test(tc_basic, test_xmldecl_invalid);
+ tcase_add_test(tc_basic, test_xmldecl_missing_attr);
+ tcase_add_test(tc_basic, test_xmldecl_missing_value);
+ tcase_add_test__if_xml_ge(tc_basic, test_unknown_encoding_internal_entity);
+ tcase_add_test(tc_basic, test_unrecognised_encoding_internal_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_encoding);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_no_handler);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_bom);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding_2);
+ tcase_add_test(tc_basic, test_wfc_undeclared_entity_unread_external_subset);
+ tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset);
+ tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone);
+ tcase_add_test(tc_basic,
+ test_wfc_undeclared_entity_with_external_subset_standalone);
+ tcase_add_test(tc_basic, test_entity_with_external_subset_unless_standalone);
+ tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset);
+ tcase_add_test(tc_basic, test_not_standalone_handler_reject);
+ tcase_add_test(tc_basic, test_not_standalone_handler_accept);
+ tcase_add_test(tc_basic, test_entity_start_tag_level_greater_than_one);
+ tcase_add_test__if_xml_ge(tc_basic, test_wfc_no_recursive_entity_refs);
+ tcase_add_test(tc_basic, test_no_indirectly_recursive_entity_refs);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_invalid_parse);
+ tcase_add_test__if_xml_ge(tc_basic, test_dtd_default_handling);
+ tcase_add_test(tc_basic, test_dtd_attr_handling);
+ tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
+ tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
+ tcase_add_test(tc_basic, test_stop_parser_between_char_data_calls);
+ tcase_add_test(tc_basic, test_suspend_parser_between_char_data_calls);
+ tcase_add_test(tc_basic, test_repeated_stop_parser_between_char_data_calls);
+ tcase_add_test(tc_basic, test_good_cdata_ascii);
+ tcase_add_test(tc_basic, test_good_cdata_utf16);
+ tcase_add_test(tc_basic, test_good_cdata_utf16_le);
+ tcase_add_test(tc_basic, test_long_cdata_utf16);
+ tcase_add_test(tc_basic, test_multichar_cdata_utf16);
+ tcase_add_test(tc_basic, test_utf16_bad_surrogate_pair);
+ tcase_add_test(tc_basic, test_bad_cdata);
+ tcase_add_test(tc_basic, test_bad_cdata_utf16);
+ tcase_add_test(tc_basic, test_stop_parser_between_cdata_calls);
+ tcase_add_test(tc_basic, test_suspend_parser_between_cdata_calls);
+ tcase_add_test(tc_basic, test_memory_allocation);
+ tcase_add_test__if_xml_ge(tc_basic, test_default_current);
+ tcase_add_test(tc_basic, test_dtd_elements);
+ tcase_add_test(tc_basic, test_dtd_elements_nesting);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_set_foreign_dtd);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_not_standalone);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_foreign_dtd);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_with_doctype);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_foreign_dtd_without_external_subset);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_empty_foreign_dtd);
+ tcase_add_test(tc_basic, test_set_base);
+ tcase_add_test(tc_basic, test_attributes);
+ tcase_add_test__if_xml_ge(tc_basic, test_reset_in_entity);
+ tcase_add_test(tc_basic, test_resume_invalid_parse);
+ tcase_add_test(tc_basic, test_resume_resuspended);
+ tcase_add_test(tc_basic, test_cdata_default);
+ tcase_add_test(tc_basic, test_subordinate_reset);
+ tcase_add_test(tc_basic, test_subordinate_suspend);
+ tcase_add_test__if_xml_ge(tc_basic, test_subordinate_xdecl_suspend);
+ tcase_add_test__if_xml_ge(tc_basic, test_subordinate_xdecl_abort);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_ext_entity_invalid_suspended_parse);
+ tcase_add_test(tc_basic, test_explicit_encoding);
+ tcase_add_test(tc_basic, test_trailing_cr);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_trailing_cr);
+ tcase_add_test(tc_basic, test_trailing_rsqb);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_trailing_rsqb);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_good_cdata);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_user_parameters);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_ref_parameter);
+ tcase_add_test(tc_basic, test_empty_parse);
+ tcase_add_test(tc_basic, test_negative_len_parse);
+ tcase_add_test(tc_basic, test_negative_len_parse_buffer);
+ tcase_add_test(tc_basic, test_get_buffer_1);
+ tcase_add_test(tc_basic, test_get_buffer_2);
+#if XML_CONTEXT_BYTES > 0
+ tcase_add_test(tc_basic, test_get_buffer_3_overflow);
+#endif
+ tcase_add_test(tc_basic, test_buffer_can_grow_to_max);
+ tcase_add_test(tc_basic, test_getbuffer_allocates_on_zero_len);
+ tcase_add_test(tc_basic, test_byte_info_at_end);
+ tcase_add_test(tc_basic, test_byte_info_at_error);
+ tcase_add_test(tc_basic, test_byte_info_at_cdata);
+ tcase_add_test(tc_basic, test_predefined_entities);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_tag_in_dtd);
+ tcase_add_test(tc_basic, test_not_predefined_entities);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_bom_consumed);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_entity_values);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_not_standalone);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_value_abort);
+ tcase_add_test(tc_basic, test_bad_public_doctype);
+ tcase_add_test(tc_basic, test_attribute_enum_value);
+ tcase_add_test(tc_basic, test_predefined_entity_redefinition);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_dtd_stop_processing);
+ tcase_add_test(tc_basic, test_public_notation_no_sysid);
+ tcase_add_test(tc_basic, test_nested_groups);
+ tcase_add_test(tc_basic, test_group_choice);
+ tcase_add_test(tc_basic, test_standalone_parameter_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_skipped_parameter_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_recursive_external_parameter_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_recursive_external_parameter_entity_2);
+ tcase_add_test(tc_basic, test_undefined_ext_entity_in_external_dtd);
+ tcase_add_test(tc_basic, test_suspend_xdecl);
+ tcase_add_test(tc_basic, test_abort_epilog);
+ tcase_add_test(tc_basic, test_abort_epilog_2);
+ tcase_add_test(tc_basic, test_suspend_epilog);
+ tcase_add_test(tc_basic, test_suspend_in_sole_empty_tag);
+ tcase_add_test(tc_basic, test_unfinished_epilog);
+ tcase_add_test(tc_basic, test_partial_char_in_epilog);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_internal_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_suspend_resume_internal_entity_issue_629);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_resume_entity_with_syntax_error);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_parameter_entity);
+ tcase_add_test(tc_basic, test_restart_on_error);
+ tcase_add_test(tc_basic, test_reject_lt_in_attribute_value);
+ tcase_add_test(tc_basic, test_reject_unfinished_param_in_att_value);
+ tcase_add_test(tc_basic, test_trailing_cr_in_att_value);
+ tcase_add_test(tc_basic, test_standalone_internal_entity);
+ tcase_add_test(tc_basic, test_skipped_external_entity);
+ tcase_add_test(tc_basic, test_skipped_null_loaded_ext_entity);
+ tcase_add_test(tc_basic, test_skipped_unloaded_ext_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_param_entity_with_trailing_cr);
+ tcase_add_test__if_xml_ge(tc_basic, test_invalid_character_entity);
+ tcase_add_test__if_xml_ge(tc_basic, test_invalid_character_entity_2);
+ tcase_add_test__if_xml_ge(tc_basic, test_invalid_character_entity_3);
+ tcase_add_test__if_xml_ge(tc_basic, test_invalid_character_entity_4);
+ tcase_add_test(tc_basic, test_pi_handled_in_default);
+ tcase_add_test(tc_basic, test_comment_handled_in_default);
+ tcase_add_test(tc_basic, test_pi_yml);
+ tcase_add_test(tc_basic, test_pi_xnl);
+ tcase_add_test(tc_basic, test_pi_xmm);
+ tcase_add_test(tc_basic, test_utf16_pi);
+ tcase_add_test(tc_basic, test_utf16_be_pi);
+ tcase_add_test(tc_basic, test_utf16_be_comment);
+ tcase_add_test(tc_basic, test_utf16_le_comment);
+ tcase_add_test(tc_basic, test_missing_encoding_conversion_fn);
+ tcase_add_test(tc_basic, test_failing_encoding_conversion_fn);
+ tcase_add_test(tc_basic, test_unknown_encoding_success);
+ tcase_add_test(tc_basic, test_unknown_encoding_bad_name);
+ tcase_add_test(tc_basic, test_unknown_encoding_bad_name_2);
+ tcase_add_test(tc_basic, test_unknown_encoding_long_name_1);
+ tcase_add_test(tc_basic, test_unknown_encoding_long_name_2);
+ tcase_add_test(tc_basic, test_invalid_unknown_encoding);
+ tcase_add_test(tc_basic, test_unknown_ascii_encoding_ok);
+ tcase_add_test(tc_basic, test_unknown_ascii_encoding_fail);
+ tcase_add_test(tc_basic, test_unknown_encoding_invalid_length);
+ tcase_add_test(tc_basic, test_unknown_encoding_invalid_topbit);
+ tcase_add_test(tc_basic, test_unknown_encoding_invalid_surrogate);
+ tcase_add_test(tc_basic, test_unknown_encoding_invalid_high);
+ tcase_add_test(tc_basic, test_unknown_encoding_invalid_attr_value);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16le_bom);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16be_bom);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16le_bom2);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_latin1_utf16be_bom2);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_utf16_be);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_utf16_le);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_utf16_unknown);
+ tcase_add_test__if_xml_ge(tc_basic, test_ext_entity_utf8_non_bom);
+ tcase_add_test(tc_basic, test_utf8_in_cdata_section);
+ tcase_add_test(tc_basic, test_utf8_in_cdata_section_2);
+ tcase_add_test(tc_basic, test_utf8_in_start_tags);
+ tcase_add_test(tc_basic, test_trailing_spaces_in_elements);
+ tcase_add_test(tc_basic, test_utf16_attribute);
+ tcase_add_test(tc_basic, test_utf16_second_attr);
+ tcase_add_test(tc_basic, test_attr_after_solidus);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_utf16_pe);
+ tcase_add_test(tc_basic, test_bad_attr_desc_keyword);
+ tcase_add_test(tc_basic, test_bad_attr_desc_keyword_utf16);
+ tcase_add_test(tc_basic, test_bad_doctype);
+ tcase_add_test(tc_basic, test_bad_doctype_utf8);
+ tcase_add_test(tc_basic, test_bad_doctype_utf16);
+ tcase_add_test(tc_basic, test_bad_doctype_plus);
+ tcase_add_test(tc_basic, test_bad_doctype_star);
+ tcase_add_test(tc_basic, test_bad_doctype_query);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_unknown_encoding_bad_ignore);
+ tcase_add_test(tc_basic, test_entity_in_utf16_be_attr);
+ tcase_add_test(tc_basic, test_entity_in_utf16_le_attr);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_be);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_le);
+ tcase_add_test(tc_basic, test_short_doctype);
+ tcase_add_test(tc_basic, test_short_doctype_2);
+ tcase_add_test(tc_basic, test_short_doctype_3);
+ tcase_add_test(tc_basic, test_long_doctype);
+ tcase_add_test(tc_basic, test_bad_entity);
+ tcase_add_test(tc_basic, test_bad_entity_2);
+ tcase_add_test(tc_basic, test_bad_entity_3);
+ tcase_add_test(tc_basic, test_bad_entity_4);
+ tcase_add_test(tc_basic, test_bad_notation);
+ tcase_add_test(tc_basic, test_default_doctype_handler);
+ tcase_add_test(tc_basic, test_empty_element_abort);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_pool_integrity_with_unfinished_attr);
+ tcase_add_test__if_xml_ge(tc_basic, test_entity_ref_no_elements);
+ tcase_add_test__if_xml_ge(tc_basic, test_deep_nested_entity);
+ tcase_add_test__if_xml_ge(tc_basic, test_deep_nested_attribute_entity);
+ tcase_add_test__if_xml_ge(tc_basic,
+ test_deep_nested_entity_delayed_interpretation);
+ tcase_add_test__if_xml_ge(tc_basic, test_nested_entity_suspend);
+ tcase_add_test__if_xml_ge(tc_basic, test_nested_entity_suspend_2);
+ tcase_add_test(tc_basic, test_big_tokens_scale_linearly);
+ tcase_add_test(tc_basic, test_set_reparse_deferral);
+ tcase_add_test(tc_basic, test_reparse_deferral_is_inherited);
+ tcase_add_test(tc_basic, test_set_reparse_deferral_on_null_parser);
+ tcase_add_test(tc_basic, test_set_reparse_deferral_on_the_fly);
+ tcase_add_test(tc_basic, test_set_bad_reparse_option);
+ tcase_add_test(tc_basic, test_bypass_heuristic_when_close_to_bufsize);
+ tcase_add_test(tc_basic, test_varying_buffer_fills);
+}
diff --git a/3rdparty/expat/tests/basic_tests.h b/3rdparty/expat/tests/basic_tests.h
new file mode 100644
index 00000000000..4c16562ca0f
--- /dev/null
+++ b/3rdparty/expat/tests/basic_tests.h
@@ -0,0 +1,56 @@
+/* Tests in the "basic" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_BASIC_TESTS_H
+# define XML_BASIC_TESTS_H
+
+extern void make_basic_test_case(Suite *s);
+
+#endif /* XML_BASIC_TESTS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/basic_tests_cxx.cpp b/3rdparty/expat/tests/basic_tests_cxx.cpp
new file mode 100644
index 00000000000..d7e75a9061c
--- /dev/null
+++ b/3rdparty/expat/tests/basic_tests_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "basic_tests.c"
diff --git a/3rdparty/expat/tests/benchmark/Makefile.am b/3rdparty/expat/tests/benchmark/Makefile.am
index 5ea8dc10c5b..f1bf3365f63 100644
--- a/3rdparty/expat/tests/benchmark/Makefile.am
+++ b/3rdparty/expat/tests/benchmark/Makefile.am
@@ -6,7 +6,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/tests/benchmark/Makefile.in b/3rdparty/expat/tests/benchmark/Makefile.in
index 665bca31e35..d0e6d0769db 100644
--- a/3rdparty/expat/tests/benchmark/Makefile.in
+++ b/3rdparty/expat/tests/benchmark/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -132,6 +133,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
@@ -207,8 +210,6 @@ am__define_uniq_tagged_files = \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
am__DIST_COMMON = $(srcdir)/Makefile.in \
$(top_srcdir)/conftools/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -228,8 +229,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -245,10 +248,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -258,6 +271,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -266,6 +281,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -287,9 +303,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -353,7 +372,7 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -377,9 +396,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
@@ -488,7 +507,6 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
diff --git a/3rdparty/expat/tests/benchmark/benchmark.c b/3rdparty/expat/tests/benchmark/benchmark.c
index fda8268f189..a02b84a0131 100644
--- a/3rdparty/expat/tests/benchmark/benchmark.c
+++ b/3rdparty/expat/tests/benchmark/benchmark.c
@@ -6,8 +6,10 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2003-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2017-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,8 +32,18 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#define _POSIX_C_SOURCE 1 // fdopen
+
+#if defined(_MSC_VER)
+# include <io.h> // _open, _close
+#else
+# include <unistd.h> // close
+#endif
+
+#include <fcntl.h> // open
#include <sys/stat.h>
-#include <stdlib.h>
+#include <assert.h>
+#include <stddef.h> // ptrdiff_t
#include <stdio.h>
#include <time.h>
#include "expat.h"
@@ -48,19 +60,21 @@
# define XML_FMT_STR "s"
#endif
-static void
+static int
usage(const char *prog, int rc) {
fprintf(stderr, "usage: %s [-n] filename bufferSize nr_of_loops\n", prog);
- exit(rc);
+ return rc;
}
int
main(int argc, char *argv[]) {
XML_Parser parser;
char *XMLBuf, *XMLBufEnd, *XMLBufPtr;
- FILE *fd;
+ int fd;
+ FILE *file;
struct stat fileAttr;
- int nrOfLoops, bufferSize, fileSize, i, isFinal;
+ int nrOfLoops, bufferSize, i, isFinal;
+ size_t fileSize;
int j = 0, ns = 0;
clock_t tstart, tend;
double cpuTime = 0.0;
@@ -71,34 +85,48 @@ main(int argc, char *argv[]) {
ns = 1;
j = 1;
} else
- usage(argv[0], 1);
+ return usage(argv[0], 1);
}
}
if (argc != j + 4)
- usage(argv[0], 1);
+ return usage(argv[0], 1);
- if (stat(argv[j + 1], &fileAttr) != 0) {
- fprintf(stderr, "could not access file '%s'\n", argv[j + 1]);
+ fd = open(argv[j + 1], O_RDONLY);
+ if (fd == -1) {
+ fprintf(stderr, "could not open file '%s'\n", argv[j + 1]);
return 2;
}
- fd = fopen(argv[j + 1], "r");
- if (! fd) {
- fprintf(stderr, "could not open file '%s'\n", argv[j + 1]);
- exit(2);
+ if (fstat(fd, &fileAttr) != 0) {
+ close(fd);
+ fprintf(stderr, "could not fstat file '%s'\n", argv[j + 1]);
+ return 2;
+ }
+
+ file = fdopen(fd, "r");
+ if (! file) {
+ close(fd);
+ fprintf(stderr, "could not fdopen file '%s'\n", argv[j + 1]);
+ return 2;
}
bufferSize = atoi(argv[j + 2]);
nrOfLoops = atoi(argv[j + 3]);
if (bufferSize <= 0 || nrOfLoops <= 0) {
+ fclose(file); // NOTE: this closes fd as well
fprintf(stderr, "buffer size and nr of loops must be greater than zero.\n");
- exit(3);
+ return 3;
}
XMLBuf = malloc(fileAttr.st_size);
- fileSize = fread(XMLBuf, sizeof(char), fileAttr.st_size, fd);
- fclose(fd);
+ if (XMLBuf == NULL) {
+ fclose(file); // NOTE: this closes fd as well
+ fprintf(stderr, "ouf of memory.\n");
+ return 5;
+ }
+ fileSize = fread(XMLBuf, sizeof(char), fileAttr.st_size, file);
+ fclose(file); // NOTE: this closes fd as well
if (ns)
parser = XML_ParserCreateNS(NULL, '!');
@@ -112,12 +140,13 @@ main(int argc, char *argv[]) {
isFinal = 0;
tstart = clock();
do {
- int parseBufferSize = XMLBufEnd - XMLBufPtr;
- if (parseBufferSize <= bufferSize)
+ ptrdiff_t parseBufferSize = XMLBufEnd - XMLBufPtr;
+ if (parseBufferSize <= (ptrdiff_t)bufferSize)
isFinal = 1;
else
parseBufferSize = bufferSize;
- if (! XML_Parse(parser, XMLBufPtr, parseBufferSize, isFinal)) {
+ assert(parseBufferSize <= (ptrdiff_t)bufferSize);
+ if (! XML_Parse(parser, XMLBufPtr, (int)parseBufferSize, isFinal)) {
fprintf(stderr,
"error '%" XML_FMT_STR "' at line %" XML_FMT_INT_MOD
"u character %" XML_FMT_INT_MOD "u\n",
@@ -126,7 +155,7 @@ main(int argc, char *argv[]) {
XML_GetCurrentColumnNumber(parser));
free(XMLBuf);
XML_ParserFree(parser);
- exit(4);
+ return 4;
}
XMLBufPtr += bufferSize;
} while (! isFinal);
diff --git a/3rdparty/expat/tests/chardata.c b/3rdparty/expat/tests/chardata.c
index 75a50166ec5..2adb2c5462b 100644
--- a/3rdparty/expat/tests/chardata.c
+++ b/3rdparty/expat/tests/chardata.c
@@ -6,8 +6,13 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2016 Gilles Espinasse <g.esp@free.fr>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,9 +35,11 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#ifdef HAVE_EXPAT_CONFIG_H
-# include <expat_config.h>
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
#endif
+
+#include "expat_config.h"
#include "minicheck.h"
#include <assert.h>
@@ -78,15 +85,16 @@ CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len) {
int
CharData_CheckXMLChars(CharData *storage, const XML_Char *expected) {
- char buffer[1024];
int len = xmlstrlen(expected);
int count;
assert(storage != NULL);
count = (storage->count < 0) ? 0 : storage->count;
if (len != count) {
- sprintf(buffer, "wrong number of data characters: got %d, expected %d",
- count, len);
+ char buffer[1024];
+ snprintf(buffer, sizeof(buffer),
+ "wrong number of data characters: got %d, expected %d", count,
+ len);
fail(buffer);
return 0;
}
diff --git a/3rdparty/expat/tests/chardata.h b/3rdparty/expat/tests/chardata.h
index 4001b9b9d15..ccb631f64b2 100644
--- a/3rdparty/expat/tests/chardata.h
+++ b/3rdparty/expat/tests/chardata.h
@@ -7,8 +7,9 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/tests/chardata_cxx.cpp b/3rdparty/expat/tests/chardata_cxx.cpp
new file mode 100644
index 00000000000..81820c72dca
--- /dev/null
+++ b/3rdparty/expat/tests/chardata_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "chardata.c"
diff --git a/3rdparty/expat/tests/common.c b/3rdparty/expat/tests/common.c
new file mode 100644
index 00000000000..b158385f56a
--- /dev/null
+++ b/3rdparty/expat/tests/common.c
@@ -0,0 +1,327 @@
+/* Commonly used functions for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <assert.h>
+#include <errno.h>
+#include <stdint.h> // for SIZE_MAX
+#include <stdio.h>
+#include <string.h>
+
+#include "expat_config.h"
+#include "expat.h"
+#include "internal.h"
+#include "chardata.h"
+#include "minicheck.h"
+#include "common.h"
+#include "handlers.h"
+
+/* Common test data */
+
+const char *long_character_data_text
+ = "<?xml version='1.0' encoding='iso-8859-1'?><s>"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "</s>";
+
+const char *long_cdata_text
+ = "<s><![CDATA["
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "]]></s>";
+
+/* Having an element name longer than 1024 characters exercises some
+ * of the pool allocation code in the parser that otherwise does not
+ * get executed. The count at the end of the line is the number of
+ * characters (bytes) in the element name by that point.x
+ */
+const char *get_buffer_test_text
+ = "<documentwitharidiculouslylongelementnametotease" /* 0x030 */
+ "aparticularcorneroftheallocationinXML_GetBuffers" /* 0x060 */
+ "othatwecanimprovethecoverageyetagain012345678901" /* 0x090 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0c0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0f0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x120 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x150 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x180 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1b0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1e0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x210 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x240 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x270 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2a0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2d0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x300 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x330 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x360 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x390 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3c0 */
+ "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3f0 */
+ "123456789abcdef0123456789abcdef0123456789>\n<ef0"; /* 0x420 */
+
+/* Test control globals */
+
+/* Used as the "resumable" parameter to XML_StopParser by some tests */
+XML_Bool g_resumable = XML_FALSE;
+
+/* Used to control abort checks in some tests */
+XML_Bool g_abortable = XML_FALSE;
+
+/* Used to control _XML_Parse_SINGLE_BYTES() chunk size */
+int g_chunkSize = 1;
+
+/* Common test functions */
+
+void
+tcase_add_test__ifdef_xml_dtd(TCase *tc, tcase_test_function test) {
+#ifdef XML_DTD
+ tcase_add_test(tc, test);
+#else
+ UNUSED_P(tc);
+ UNUSED_P(test);
+#endif
+}
+
+void
+tcase_add_test__if_xml_ge(TCase *tc, tcase_test_function test) {
+#if XML_GE == 1
+ tcase_add_test(tc, test);
+#else
+ UNUSED_P(tc);
+ UNUSED_P(test);
+#endif
+}
+
+void
+basic_teardown(void) {
+ if (g_parser != NULL) {
+ XML_ParserFree(g_parser);
+ g_parser = NULL;
+ }
+}
+
+/* Generate a failure using the parser state to create an error message;
+ this should be used when the parser reports an error we weren't
+ expecting.
+*/
+void
+_xml_failure(XML_Parser parser, const char *file, int line) {
+ char buffer[1024];
+ enum XML_Error err = XML_GetErrorCode(parser);
+ snprintf(buffer, sizeof(buffer),
+ " %d: %" XML_FMT_STR " (line %" XML_FMT_INT_MOD
+ "u, offset %" XML_FMT_INT_MOD "u)\n reported from %s, line %d\n",
+ err, XML_ErrorString(err), XML_GetCurrentLineNumber(parser),
+ XML_GetCurrentColumnNumber(parser), file, line);
+ _fail(file, line, buffer);
+}
+
+enum XML_Status
+_XML_Parse_SINGLE_BYTES(XML_Parser parser, const char *s, int len,
+ int isFinal) {
+ // This ensures that tests have to run pathological parse cases
+ // (e.g. when `s` is NULL) against plain XML_Parse rather than
+ // chunking _XML_Parse_SINGLE_BYTES.
+ assert((parser != NULL) && (s != NULL) && (len >= 0));
+ const int chunksize = g_chunkSize;
+ if (chunksize > 0) {
+ // parse in chunks of `chunksize` bytes as long as not exhausting
+ for (; len > chunksize; len -= chunksize, s += chunksize) {
+ enum XML_Status res = XML_Parse(parser, s, chunksize, XML_FALSE);
+ if (res != XML_STATUS_OK) {
+ if ((res == XML_STATUS_SUSPENDED) && (len > chunksize)) {
+ fail("Use of function _XML_Parse_SINGLE_BYTES with a chunk size "
+ "greater than 0 (from g_chunkSize) does not work well with "
+ "suspension. Please consider use of plain XML_Parse at this "
+ "place in your test, instead.");
+ }
+ return res;
+ }
+ }
+ }
+ // parse the final chunk, the size of which will be <= chunksize
+ return XML_Parse(parser, s, len, isFinal);
+}
+
+void
+_expect_failure(const char *text, enum XML_Error errorCode,
+ const char *errorMessage, const char *file, int lineno) {
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ /* Hackish use of _fail() macro, but lets us report
+ the right filename and line number. */
+ _fail(file, lineno, errorMessage);
+ if (XML_GetErrorCode(g_parser) != errorCode)
+ _xml_failure(g_parser, file, lineno);
+}
+
+void
+_run_character_check(const char *text, const XML_Char *expected,
+ const char *file, int line) {
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ _xml_failure(g_parser, file, line);
+ CharData_CheckXMLChars(&storage, expected);
+}
+
+void
+_run_attribute_check(const char *text, const XML_Char *expected,
+ const char *file, int line) {
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetStartElementHandler(g_parser, accumulate_attribute);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ _xml_failure(g_parser, file, line);
+ CharData_CheckXMLChars(&storage, expected);
+}
+
+void
+_run_ext_character_check(const char *text, ExtTest *test_data,
+ const XML_Char *expected, const char *file, int line) {
+ CharData *const storage = (CharData *)malloc(sizeof(CharData));
+
+ CharData_Init(storage);
+ test_data->storage = storage;
+ XML_SetUserData(g_parser, test_data);
+ XML_SetCharacterDataHandler(g_parser, ext_accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ _xml_failure(g_parser, file, line);
+ CharData_CheckXMLChars(storage, expected);
+
+ free(storage);
+}
+
+/* Control variable; the number of times duff_allocator() will successfully
+ * allocate */
+#define ALLOC_ALWAYS_SUCCEED (-1)
+#define REALLOC_ALWAYS_SUCCEED (-1)
+
+int g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+int g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
+
+/* Crocked allocator for allocation failure tests */
+void *
+duff_allocator(size_t size) {
+ if (g_allocation_count == 0)
+ return NULL;
+ if (g_allocation_count != ALLOC_ALWAYS_SUCCEED)
+ g_allocation_count--;
+ return malloc(size);
+}
+
+/* Crocked reallocator for allocation failure tests */
+void *
+duff_reallocator(void *ptr, size_t size) {
+ if (g_reallocation_count == 0)
+ return NULL;
+ if (g_reallocation_count != REALLOC_ALWAYS_SUCCEED)
+ g_reallocation_count--;
+ return realloc(ptr, size);
+}
+
+// Portable remake of strndup(3) for C99; does not care about space efficiency
+char *
+portable_strndup(const char *s, size_t n) {
+ if ((s == NULL) || (n == SIZE_MAX)) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ char *const buffer = (char *)malloc(n + 1);
+ if (buffer == NULL) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ errno = 0;
+
+ memcpy(buffer, s, n);
+
+ buffer[n] = '\0';
+
+ return buffer;
+}
diff --git a/3rdparty/expat/tests/common.h b/3rdparty/expat/tests/common.h
new file mode 100644
index 00000000000..2d1a5f207a0
--- /dev/null
+++ b/3rdparty/expat/tests/common.h
@@ -0,0 +1,155 @@
+/* Commonly used functions for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_COMMON_H
+# define XML_COMMON_H
+
+# include "expat_config.h"
+# include "minicheck.h"
+# include "chardata.h"
+
+# ifdef XML_LARGE_SIZE
+# define XML_FMT_INT_MOD "ll"
+# else
+# define XML_FMT_INT_MOD "l"
+# endif
+
+# ifdef XML_UNICODE_WCHAR_T
+# define XML_FMT_STR "ls"
+# include <wchar.h>
+# define xcstrlen(s) wcslen(s)
+# define xcstrcmp(s, t) wcscmp((s), (t))
+# define xcstrncmp(s, t, n) wcsncmp((s), (t), (n))
+# define XCS(s) _XCS(s)
+# define _XCS(s) L##s
+# else
+# ifdef XML_UNICODE
+# error "No support for UTF-16 character without wchar_t in tests"
+# else
+# define XML_FMT_STR "s"
+# define xcstrlen(s) strlen(s)
+# define xcstrcmp(s, t) strcmp((s), (t))
+# define xcstrncmp(s, t, n) strncmp((s), (t), (n))
+# define XCS(s) s
+# endif /* XML_UNICODE */
+# endif /* XML_UNICODE_WCHAR_T */
+
+extern XML_Parser g_parser;
+
+extern XML_Bool g_resumable;
+extern XML_Bool g_abortable;
+
+extern int g_chunkSize;
+
+extern const char *long_character_data_text;
+extern const char *long_cdata_text;
+extern const char *get_buffer_test_text;
+
+extern void tcase_add_test__ifdef_xml_dtd(TCase *tc, tcase_test_function test);
+extern void tcase_add_test__if_xml_ge(TCase *tc, tcase_test_function test);
+
+extern void basic_teardown(void);
+
+extern void _xml_failure(XML_Parser parser, const char *file, int line);
+
+# define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)
+
+extern enum XML_Status _XML_Parse_SINGLE_BYTES(XML_Parser parser, const char *s,
+ int len, int isFinal);
+
+extern void _expect_failure(const char *text, enum XML_Error errorCode,
+ const char *errorMessage, const char *file,
+ int lineno);
+
+# define expect_failure(text, errorCode, errorMessage) \
+ _expect_failure((text), (errorCode), (errorMessage), __FILE__, __LINE__)
+
+/* Support functions for handlers to collect up character and attribute data.
+ */
+
+extern void _run_character_check(const char *text, const XML_Char *expected,
+ const char *file, int line);
+
+# define run_character_check(text, expected) \
+ _run_character_check(text, expected, __FILE__, __LINE__)
+
+extern void _run_attribute_check(const char *text, const XML_Char *expected,
+ const char *file, int line);
+
+# define run_attribute_check(text, expected) \
+ _run_attribute_check(text, expected, __FILE__, __LINE__)
+
+typedef struct ExtTest {
+ const char *parse_text;
+ const XML_Char *encoding;
+ CharData *storage;
+} ExtTest;
+
+extern void _run_ext_character_check(const char *text, ExtTest *test_data,
+ const XML_Char *expected, const char *file,
+ int line);
+
+# define run_ext_character_check(text, test_data, expected) \
+ _run_ext_character_check(text, test_data, expected, __FILE__, __LINE__)
+
+# define ALLOC_ALWAYS_SUCCEED (-1)
+# define REALLOC_ALWAYS_SUCCEED (-1)
+
+extern int g_allocation_count;
+extern int g_reallocation_count;
+
+extern void *duff_allocator(size_t size);
+
+extern void *duff_reallocator(void *ptr, size_t size);
+
+extern char *portable_strndup(const char *s, size_t n);
+
+#endif /* XML_COMMON_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/common_cxx.cpp b/3rdparty/expat/tests/common_cxx.cpp
new file mode 100644
index 00000000000..698a0ccfa9d
--- /dev/null
+++ b/3rdparty/expat/tests/common_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "common.c"
diff --git a/3rdparty/expat/tests/dummy.c b/3rdparty/expat/tests/dummy.c
new file mode 100644
index 00000000000..4ab57edd2cf
--- /dev/null
+++ b/3rdparty/expat/tests/dummy.c
@@ -0,0 +1,261 @@
+/* Dummy handler functions for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "expat.h"
+#include "internal.h"
+#include "common.h"
+#include "dummy.h"
+
+/* Dummy handlers for when we need to set a handler to tickle a bug,
+ but it doesn't need to do anything.
+*/
+static unsigned long dummy_handler_flags = 0;
+
+void
+init_dummy_handlers(void) {
+ dummy_handler_flags = 0;
+}
+
+unsigned long
+get_dummy_handler_flags(void) {
+ return dummy_handler_flags;
+}
+
+void XMLCALL
+dummy_xdecl_handler(void *userData, const XML_Char *version,
+ const XML_Char *encoding, int standalone) {
+ UNUSED_P(userData);
+ UNUSED_P(version);
+ UNUSED_P(encoding);
+ UNUSED_P(standalone);
+}
+
+void XMLCALL
+dummy_start_doctype_handler(void *userData, const XML_Char *doctypeName,
+ const XML_Char *sysid, const XML_Char *pubid,
+ int has_internal_subset) {
+ UNUSED_P(userData);
+ UNUSED_P(doctypeName);
+ UNUSED_P(sysid);
+ UNUSED_P(pubid);
+ UNUSED_P(has_internal_subset);
+ dummy_handler_flags |= DUMMY_START_DOCTYPE_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_end_doctype_handler(void *userData) {
+ UNUSED_P(userData);
+ dummy_handler_flags |= DUMMY_END_DOCTYPE_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_entity_decl_handler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity, const XML_Char *value,
+ int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName) {
+ UNUSED_P(userData);
+ UNUSED_P(entityName);
+ UNUSED_P(is_parameter_entity);
+ UNUSED_P(value);
+ UNUSED_P(value_length);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ UNUSED_P(notationName);
+ dummy_handler_flags |= DUMMY_ENTITY_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_notation_decl_handler(void *userData, const XML_Char *notationName,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ UNUSED_P(userData);
+ UNUSED_P(notationName);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ dummy_handler_flags |= DUMMY_NOTATION_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_element_decl_handler(void *userData, const XML_Char *name,
+ XML_Content *model) {
+ UNUSED_P(userData);
+ UNUSED_P(name);
+ /* The content model must be freed by the handler. Unfortunately
+ * we cannot pass the parser as the userData because this is used
+ * with other handlers that require other userData.
+ */
+ XML_FreeContentModel(g_parser, model);
+ dummy_handler_flags |= DUMMY_ELEMENT_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_attlist_decl_handler(void *userData, const XML_Char *elname,
+ const XML_Char *attname, const XML_Char *att_type,
+ const XML_Char *dflt, int isrequired) {
+ UNUSED_P(userData);
+ UNUSED_P(elname);
+ UNUSED_P(attname);
+ UNUSED_P(att_type);
+ UNUSED_P(dflt);
+ UNUSED_P(isrequired);
+ dummy_handler_flags |= DUMMY_ATTLIST_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_comment_handler(void *userData, const XML_Char *data) {
+ UNUSED_P(userData);
+ UNUSED_P(data);
+ dummy_handler_flags |= DUMMY_COMMENT_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data) {
+ UNUSED_P(userData);
+ UNUSED_P(target);
+ UNUSED_P(data);
+ dummy_handler_flags |= DUMMY_PI_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_start_element(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ UNUSED_P(userData);
+ UNUSED_P(name);
+ UNUSED_P(atts);
+ dummy_handler_flags |= DUMMY_START_ELEMENT_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_end_element(void *userData, const XML_Char *name) {
+ UNUSED_P(userData);
+ UNUSED_P(name);
+}
+
+void XMLCALL
+dummy_start_cdata_handler(void *userData) {
+ UNUSED_P(userData);
+ dummy_handler_flags |= DUMMY_START_CDATA_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_end_cdata_handler(void *userData) {
+ UNUSED_P(userData);
+ dummy_handler_flags |= DUMMY_END_CDATA_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_cdata_handler(void *userData, const XML_Char *s, int len) {
+ UNUSED_P(userData);
+ UNUSED_P(s);
+ UNUSED_P(len);
+}
+
+void XMLCALL
+dummy_start_namespace_decl_handler(void *userData, const XML_Char *prefix,
+ const XML_Char *uri) {
+ UNUSED_P(userData);
+ UNUSED_P(prefix);
+ UNUSED_P(uri);
+ dummy_handler_flags |= DUMMY_START_NS_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_end_namespace_decl_handler(void *userData, const XML_Char *prefix) {
+ UNUSED_P(userData);
+ UNUSED_P(prefix);
+ dummy_handler_flags |= DUMMY_END_NS_DECL_HANDLER_FLAG;
+}
+
+/* This handler is obsolete, but while the code exists we should
+ * ensure that dealing with the handler is covered by tests.
+ */
+void XMLCALL
+dummy_unparsed_entity_decl_handler(void *userData, const XML_Char *entityName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName) {
+ UNUSED_P(userData);
+ UNUSED_P(entityName);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ UNUSED_P(notationName);
+ dummy_handler_flags |= DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_default_handler(void *userData, const XML_Char *s, int len) {
+ UNUSED_P(userData);
+ UNUSED_P(s);
+ UNUSED_P(len);
+}
+
+void XMLCALL
+dummy_start_doctype_decl_handler(void *userData, const XML_Char *doctypeName,
+ const XML_Char *sysid, const XML_Char *pubid,
+ int has_internal_subset) {
+ UNUSED_P(userData);
+ UNUSED_P(doctypeName);
+ UNUSED_P(sysid);
+ UNUSED_P(pubid);
+ UNUSED_P(has_internal_subset);
+ dummy_handler_flags |= DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_end_doctype_decl_handler(void *userData) {
+ UNUSED_P(userData);
+ dummy_handler_flags |= DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG;
+}
+
+void XMLCALL
+dummy_skip_handler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity) {
+ UNUSED_P(userData);
+ UNUSED_P(entityName);
+ UNUSED_P(is_parameter_entity);
+ dummy_handler_flags |= DUMMY_SKIP_HANDLER_FLAG;
+}
diff --git a/3rdparty/expat/tests/dummy.h b/3rdparty/expat/tests/dummy.h
new file mode 100644
index 00000000000..3d7ec63ed33
--- /dev/null
+++ b/3rdparty/expat/tests/dummy.h
@@ -0,0 +1,150 @@
+/* Dummy handler functions for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_DUMMY_H
+# define XML_DUMMY_H
+
+# define DUMMY_START_DOCTYPE_HANDLER_FLAG (1UL << 0)
+# define DUMMY_END_DOCTYPE_HANDLER_FLAG (1UL << 1)
+# define DUMMY_ENTITY_DECL_HANDLER_FLAG (1UL << 2)
+# define DUMMY_NOTATION_DECL_HANDLER_FLAG (1UL << 3)
+# define DUMMY_ELEMENT_DECL_HANDLER_FLAG (1UL << 4)
+# define DUMMY_ATTLIST_DECL_HANDLER_FLAG (1UL << 5)
+# define DUMMY_COMMENT_HANDLER_FLAG (1UL << 6)
+# define DUMMY_PI_HANDLER_FLAG (1UL << 7)
+# define DUMMY_START_ELEMENT_HANDLER_FLAG (1UL << 8)
+# define DUMMY_START_CDATA_HANDLER_FLAG (1UL << 9)
+# define DUMMY_END_CDATA_HANDLER_FLAG (1UL << 10)
+# define DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG (1UL << 11)
+# define DUMMY_START_NS_DECL_HANDLER_FLAG (1UL << 12)
+# define DUMMY_END_NS_DECL_HANDLER_FLAG (1UL << 13)
+# define DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG (1UL << 14)
+# define DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG (1UL << 15)
+# define DUMMY_SKIP_HANDLER_FLAG (1UL << 16)
+# define DUMMY_DEFAULT_HANDLER_FLAG (1UL << 17)
+
+extern void init_dummy_handlers(void);
+extern unsigned long get_dummy_handler_flags(void);
+
+extern void XMLCALL dummy_xdecl_handler(void *userData, const XML_Char *version,
+ const XML_Char *encoding,
+ int standalone);
+
+extern void XMLCALL dummy_start_doctype_handler(void *userData,
+ const XML_Char *doctypeName,
+ const XML_Char *sysid,
+ const XML_Char *pubid,
+ int has_internal_subset);
+
+extern void XMLCALL dummy_end_doctype_handler(void *userData);
+
+extern void XMLCALL dummy_entity_decl_handler(
+ void *userData, const XML_Char *entityName, int is_parameter_entity,
+ const XML_Char *value, int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName);
+
+extern void XMLCALL dummy_notation_decl_handler(void *userData,
+ const XML_Char *notationName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern void XMLCALL dummy_element_decl_handler(void *userData,
+ const XML_Char *name,
+ XML_Content *model);
+
+extern void XMLCALL dummy_attlist_decl_handler(
+ void *userData, const XML_Char *elname, const XML_Char *attname,
+ const XML_Char *att_type, const XML_Char *dflt, int isrequired);
+
+extern void XMLCALL dummy_comment_handler(void *userData, const XML_Char *data);
+
+extern void XMLCALL dummy_pi_handler(void *userData, const XML_Char *target,
+ const XML_Char *data);
+
+extern void XMLCALL dummy_start_element(void *userData, const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL dummy_end_element(void *userData, const XML_Char *name);
+
+extern void XMLCALL dummy_start_cdata_handler(void *userData);
+
+extern void XMLCALL dummy_end_cdata_handler(void *userData);
+
+extern void XMLCALL dummy_cdata_handler(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL dummy_start_namespace_decl_handler(void *userData,
+ const XML_Char *prefix,
+ const XML_Char *uri);
+
+extern void XMLCALL dummy_end_namespace_decl_handler(void *userData,
+ const XML_Char *prefix);
+
+extern void XMLCALL dummy_unparsed_entity_decl_handler(
+ void *userData, const XML_Char *entityName, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName);
+
+extern void XMLCALL dummy_default_handler(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL dummy_start_doctype_decl_handler(
+ void *userData, const XML_Char *doctypeName, const XML_Char *sysid,
+ const XML_Char *pubid, int has_internal_subset);
+
+extern void XMLCALL dummy_end_doctype_decl_handler(void *userData);
+
+extern void XMLCALL dummy_skip_handler(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity);
+
+#endif /* XML_DUMMY_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/dummy_cxx.cpp b/3rdparty/expat/tests/dummy_cxx.cpp
new file mode 100644
index 00000000000..27c9f431ecd
--- /dev/null
+++ b/3rdparty/expat/tests/dummy_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "dummy.c"
diff --git a/3rdparty/expat/tests/handlers.c b/3rdparty/expat/tests/handlers.c
new file mode 100644
index 00000000000..ac459507580
--- /dev/null
+++ b/3rdparty/expat/tests/handlers.c
@@ -0,0 +1,1979 @@
+/* XML handler functions for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include "expat_config.h"
+
+#include "expat.h"
+#include "internal.h"
+#include "chardata.h"
+#include "structdata.h"
+#include "common.h"
+#include "handlers.h"
+
+/* Global variables for user parameter settings tests */
+/* Variable holding the expected handler userData */
+const void *g_handler_data = NULL;
+/* Count of the number of times the comment handler has been invoked */
+int g_comment_count = 0;
+/* Count of the number of skipped entities */
+int g_skip_count = 0;
+/* Count of the number of times the XML declaration handler is invoked */
+int g_xdecl_count = 0;
+
+/* Start/End Element Handlers */
+
+void XMLCALL
+start_element_event_handler(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ UNUSED_P(atts);
+ CharData_AppendXMLChars((CharData *)userData, name, -1);
+}
+
+void XMLCALL
+end_element_event_handler(void *userData, const XML_Char *name) {
+ CharData *storage = (CharData *)userData;
+ CharData_AppendXMLChars(storage, XCS("/"), 1);
+ CharData_AppendXMLChars(storage, name, -1);
+}
+
+void XMLCALL
+start_element_event_handler2(void *userData, const XML_Char *name,
+ const XML_Char **attr) {
+ StructData *storage = (StructData *)userData;
+ UNUSED_P(attr);
+ StructData_AddItem(storage, name, XML_GetCurrentColumnNumber(g_parser),
+ XML_GetCurrentLineNumber(g_parser), STRUCT_START_TAG);
+}
+
+void XMLCALL
+end_element_event_handler2(void *userData, const XML_Char *name) {
+ StructData *storage = (StructData *)userData;
+ StructData_AddItem(storage, name, XML_GetCurrentColumnNumber(g_parser),
+ XML_GetCurrentLineNumber(g_parser), STRUCT_END_TAG);
+}
+
+void XMLCALL
+counting_start_element_handler(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ ParserAndElementInfo *const parserAndElementInfos
+ = (ParserAndElementInfo *)userData;
+ ElementInfo *info = parserAndElementInfos->info;
+ AttrInfo *attr;
+ int count, id, i;
+
+ while (info->name != NULL) {
+ if (! xcstrcmp(name, info->name))
+ break;
+ info++;
+ }
+ if (info->name == NULL)
+ fail("Element not recognised");
+ /* The attribute count is twice what you might expect. It is a
+ * count of items in atts, an array which contains alternating
+ * attribute names and attribute values. For the naive user this
+ * is possibly a little unexpected, but it is what the
+ * documentation in expat.h tells us to expect.
+ */
+ count = XML_GetSpecifiedAttributeCount(parserAndElementInfos->parser);
+ if (info->attr_count * 2 != count) {
+ fail("Not got expected attribute count");
+ return;
+ }
+ id = XML_GetIdAttributeIndex(parserAndElementInfos->parser);
+ if (id == -1 && info->id_name != NULL) {
+ fail("ID not present");
+ return;
+ }
+ if (id != -1 && xcstrcmp(atts[id], info->id_name)) {
+ fail("ID does not have the correct name");
+ return;
+ }
+ for (i = 0; i < info->attr_count; i++) {
+ attr = info->attributes;
+ while (attr->name != NULL) {
+ if (! xcstrcmp(atts[0], attr->name))
+ break;
+ attr++;
+ }
+ if (attr->name == NULL) {
+ fail("Attribute not recognised");
+ return;
+ }
+ if (xcstrcmp(atts[1], attr->value)) {
+ fail("Attribute has wrong value");
+ return;
+ }
+ /* Remember, two entries in atts per attribute (see above) */
+ atts += 2;
+ }
+}
+
+void XMLCALL
+suspending_end_handler(void *userData, const XML_Char *s) {
+ UNUSED_P(s);
+ XML_StopParser((XML_Parser)userData, 1);
+}
+
+void XMLCALL
+start_element_suspender(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ UNUSED_P(userData);
+ UNUSED_P(atts);
+ if (! xcstrcmp(name, XCS("suspend")))
+ XML_StopParser(g_parser, XML_TRUE);
+ if (! xcstrcmp(name, XCS("abort")))
+ XML_StopParser(g_parser, XML_FALSE);
+}
+
+/* Check that an element name and attribute name match the expected values.
+ The expected values are passed as an array reference of string pointers
+ provided as the userData argument; the first is the expected
+ element name, and the second is the expected attribute name.
+*/
+int g_triplet_start_flag = XML_FALSE;
+int g_triplet_end_flag = XML_FALSE;
+
+void XMLCALL
+triplet_start_checker(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ XML_Char **elemstr = (XML_Char **)userData;
+ char buffer[1024];
+ if (xcstrcmp(elemstr[0], name) != 0) {
+ snprintf(buffer, sizeof(buffer),
+ "unexpected start string: '%" XML_FMT_STR "'", name);
+ fail(buffer);
+ }
+ if (xcstrcmp(elemstr[1], atts[0]) != 0) {
+ snprintf(buffer, sizeof(buffer),
+ "unexpected attribute string: '%" XML_FMT_STR "'", atts[0]);
+ fail(buffer);
+ }
+ g_triplet_start_flag = XML_TRUE;
+}
+
+/* Check that the element name passed to the end-element handler matches
+ the expected value. The expected value is passed as the first element
+ in an array of strings passed as the userData argument.
+*/
+void XMLCALL
+triplet_end_checker(void *userData, const XML_Char *name) {
+ XML_Char **elemstr = (XML_Char **)userData;
+ if (xcstrcmp(elemstr[0], name) != 0) {
+ char buffer[1024];
+ snprintf(buffer, sizeof(buffer),
+ "unexpected end string: '%" XML_FMT_STR "'", name);
+ fail(buffer);
+ }
+ g_triplet_end_flag = XML_TRUE;
+}
+
+void XMLCALL
+overwrite_start_checker(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ CharData *storage = (CharData *)userData;
+ CharData_AppendXMLChars(storage, XCS("start "), 6);
+ CharData_AppendXMLChars(storage, name, -1);
+ while (*atts != NULL) {
+ CharData_AppendXMLChars(storage, XCS("\nattribute "), 11);
+ CharData_AppendXMLChars(storage, *atts, -1);
+ atts += 2;
+ }
+ CharData_AppendXMLChars(storage, XCS("\n"), 1);
+}
+
+void XMLCALL
+overwrite_end_checker(void *userData, const XML_Char *name) {
+ CharData *storage = (CharData *)userData;
+ CharData_AppendXMLChars(storage, XCS("end "), 4);
+ CharData_AppendXMLChars(storage, name, -1);
+ CharData_AppendXMLChars(storage, XCS("\n"), 1);
+}
+
+void XMLCALL
+start_element_fail(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ UNUSED_P(userData);
+ UNUSED_P(name);
+ UNUSED_P(atts);
+
+ /* We should never get here. */
+ fail("should never reach start_element_fail()");
+}
+
+void XMLCALL
+start_ns_clearing_start_element(void *userData, const XML_Char *prefix,
+ const XML_Char *uri) {
+ UNUSED_P(prefix);
+ UNUSED_P(uri);
+ XML_SetStartElementHandler((XML_Parser)userData, NULL);
+}
+
+void XMLCALL
+start_element_issue_240(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ DataIssue240 *mydata = (DataIssue240 *)userData;
+ UNUSED_P(name);
+ UNUSED_P(atts);
+ mydata->deep++;
+}
+
+void XMLCALL
+end_element_issue_240(void *userData, const XML_Char *name) {
+ DataIssue240 *mydata = (DataIssue240 *)userData;
+
+ UNUSED_P(name);
+ mydata->deep--;
+ if (mydata->deep == 0) {
+ XML_StopParser(mydata->parser, 0);
+ }
+}
+
+/* Text encoding handlers */
+
+int XMLCALL
+UnknownEncodingHandler(void *data, const XML_Char *encoding,
+ XML_Encoding *info) {
+ UNUSED_P(data);
+ if (xcstrcmp(encoding, XCS("unsupported-encoding")) == 0) {
+ int i;
+ for (i = 0; i < 256; ++i)
+ info->map[i] = i;
+ info->data = NULL;
+ info->convert = NULL;
+ info->release = NULL;
+ return XML_STATUS_OK;
+ }
+ return XML_STATUS_ERROR;
+}
+
+static void
+dummy_release(void *data) {
+ UNUSED_P(data);
+}
+
+int XMLCALL
+UnrecognisedEncodingHandler(void *data, const XML_Char *encoding,
+ XML_Encoding *info) {
+ UNUSED_P(data);
+ UNUSED_P(encoding);
+ info->data = NULL;
+ info->convert = NULL;
+ info->release = dummy_release;
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+unknown_released_encoding_handler(void *data, const XML_Char *encoding,
+ XML_Encoding *info) {
+ UNUSED_P(data);
+ if (! xcstrcmp(encoding, XCS("unsupported-encoding"))) {
+ int i;
+
+ for (i = 0; i < 256; i++)
+ info->map[i] = i;
+ info->data = NULL;
+ info->convert = NULL;
+ info->release = dummy_release;
+ return XML_STATUS_OK;
+ }
+ return XML_STATUS_ERROR;
+}
+
+static int XMLCALL
+failing_converter(void *data, const char *s) {
+ UNUSED_P(data);
+ UNUSED_P(s);
+ /* Always claim to have failed */
+ return -1;
+}
+
+static int XMLCALL
+prefix_converter(void *data, const char *s) {
+ UNUSED_P(data);
+ /* If the first byte is 0xff, raise an error */
+ if (s[0] == (char)-1)
+ return -1;
+ /* Just add the low bits of the first byte to the second */
+ return (s[1] + (s[0] & 0x7f)) & 0x01ff;
+}
+
+int XMLCALL
+MiscEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info) {
+ int i;
+ int high_map = -2; /* Assume a 2-byte sequence */
+
+ if (! xcstrcmp(encoding, XCS("invalid-9"))
+ || ! xcstrcmp(encoding, XCS("ascii-like"))
+ || ! xcstrcmp(encoding, XCS("invalid-len"))
+ || ! xcstrcmp(encoding, XCS("invalid-a"))
+ || ! xcstrcmp(encoding, XCS("invalid-surrogate"))
+ || ! xcstrcmp(encoding, XCS("invalid-high")))
+ high_map = -1;
+
+ for (i = 0; i < 128; ++i)
+ info->map[i] = i;
+ for (; i < 256; ++i)
+ info->map[i] = high_map;
+
+ /* If required, put an invalid value in the ASCII entries */
+ if (! xcstrcmp(encoding, XCS("invalid-9")))
+ info->map[9] = 5;
+ /* If required, have a top-bit set character starts a 5-byte sequence */
+ if (! xcstrcmp(encoding, XCS("invalid-len")))
+ info->map[0x81] = -5;
+ /* If required, make a top-bit set character a valid ASCII character */
+ if (! xcstrcmp(encoding, XCS("invalid-a")))
+ info->map[0x82] = 'a';
+ /* If required, give a top-bit set character a forbidden value,
+ * what would otherwise be the first of a surrogate pair.
+ */
+ if (! xcstrcmp(encoding, XCS("invalid-surrogate")))
+ info->map[0x83] = 0xd801;
+ /* If required, give a top-bit set character too high a value */
+ if (! xcstrcmp(encoding, XCS("invalid-high")))
+ info->map[0x84] = 0x010101;
+
+ info->data = data;
+ info->release = NULL;
+ if (! xcstrcmp(encoding, XCS("failing-conv")))
+ info->convert = failing_converter;
+ else if (! xcstrcmp(encoding, XCS("prefix-conv")))
+ info->convert = prefix_converter;
+ else
+ info->convert = NULL;
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+long_encoding_handler(void *userData, const XML_Char *encoding,
+ XML_Encoding *info) {
+ int i;
+
+ UNUSED_P(userData);
+ UNUSED_P(encoding);
+ for (i = 0; i < 256; i++)
+ info->map[i] = i;
+ info->data = NULL;
+ info->convert = NULL;
+ info->release = NULL;
+ return XML_STATUS_OK;
+}
+
+/* External Entity Handlers */
+
+int XMLCALL
+external_entity_optioner(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ ExtOption *options = (ExtOption *)XML_GetUserData(parser);
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ while (options->parse_text != NULL) {
+ if (! xcstrcmp(systemId, options->system_id)) {
+ enum XML_Status rc;
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ return XML_STATUS_ERROR;
+ rc = _XML_Parse_SINGLE_BYTES(ext_parser, options->parse_text,
+ (int)strlen(options->parse_text), XML_TRUE);
+ XML_ParserFree(ext_parser);
+ return rc;
+ }
+ options++;
+ }
+ fail("No suitable option found");
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_loader(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ ExtTest *test_data = (ExtTest *)XML_GetUserData(parser);
+ XML_Parser extparser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (extparser == NULL)
+ fail("Could not create external entity parser.");
+ if (test_data->encoding != NULL) {
+ if (! XML_SetEncoding(extparser, test_data->encoding))
+ fail("XML_SetEncoding() ignored for external entity");
+ }
+ if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
+ (int)strlen(test_data->parse_text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(extparser);
+ return XML_STATUS_ERROR;
+ }
+ XML_ParserFree(extparser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_faulter(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ XML_Parser ext_parser;
+ ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (fault->encoding != NULL) {
+ if (! XML_SetEncoding(ext_parser, fault->encoding))
+ fail("XML_SetEncoding failed");
+ }
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, fault->parse_text,
+ (int)strlen(fault->parse_text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail(fault->fail_text);
+ if (XML_GetErrorCode(ext_parser) != fault->error)
+ xml_failure(ext_parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_null_loader(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ UNUSED_P(parser);
+ UNUSED_P(context);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_resetter(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<!ELEMENT doc (#PCDATA)*>";
+ XML_Parser ext_parser;
+ XML_ParsingStatus status;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_GetParsingStatus(ext_parser, &status);
+ if (status.parsing != XML_INITIALIZED) {
+ fail("Parsing status is not INITIALIZED");
+ return XML_STATUS_ERROR;
+ }
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(parser);
+ return XML_STATUS_ERROR;
+ }
+ XML_GetParsingStatus(ext_parser, &status);
+ if (status.parsing != XML_FINISHED) {
+ fail("Parsing status is not FINISHED");
+ return XML_STATUS_ERROR;
+ }
+ /* Check we can't parse here */
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Parsing when finished not faulted");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_FINISHED)
+ fail("Parsing when finished faulted with wrong code");
+ XML_ParserReset(ext_parser, NULL);
+ XML_GetParsingStatus(ext_parser, &status);
+ if (status.parsing != XML_FINISHED) {
+ fail("Parsing status not still FINISHED");
+ return XML_STATUS_ERROR;
+ }
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+void XMLCALL
+entity_suspending_decl_handler(void *userData, const XML_Char *name,
+ XML_Content *model) {
+ XML_Parser ext_parser = (XML_Parser)userData;
+
+ UNUSED_P(name);
+ if (XML_StopParser(ext_parser, XML_TRUE) != XML_STATUS_ERROR)
+ fail("Attempting to suspend a subordinate parser not faulted");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_SUSPEND_PE)
+ fail("Suspending subordinate parser get wrong code");
+ XML_SetElementDeclHandler(ext_parser, NULL);
+ XML_FreeContentModel(g_parser, model);
+}
+
+int XMLCALL
+external_entity_suspender(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<!ELEMENT doc (#PCDATA)*>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetElementDeclHandler(ext_parser, entity_suspending_decl_handler);
+ XML_SetUserData(ext_parser, ext_parser);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(ext_parser);
+ return XML_STATUS_ERROR;
+ }
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+void XMLCALL
+entity_suspending_xdecl_handler(void *userData, const XML_Char *version,
+ const XML_Char *encoding, int standalone) {
+ XML_Parser ext_parser = (XML_Parser)userData;
+
+ UNUSED_P(version);
+ UNUSED_P(encoding);
+ UNUSED_P(standalone);
+ XML_StopParser(ext_parser, g_resumable);
+ XML_SetXmlDeclHandler(ext_parser, NULL);
+}
+
+int XMLCALL
+external_entity_suspend_xmldecl(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<?xml version='1.0' encoding='us-ascii'?>";
+ XML_Parser ext_parser;
+ XML_ParsingStatus status;
+ enum XML_Status rc;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
+ XML_SetUserData(ext_parser, ext_parser);
+ rc = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
+ XML_GetParsingStatus(ext_parser, &status);
+ if (g_resumable) {
+ if (rc == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ if (status.parsing != XML_SUSPENDED)
+ fail("Ext Parsing status not SUSPENDED");
+ } else {
+ if (rc != XML_STATUS_ERROR)
+ fail("Ext parsing not aborted");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_ABORTED)
+ xml_failure(ext_parser);
+ if (status.parsing != XML_FINISHED)
+ fail("Ext Parsing status not FINISHED");
+ }
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_suspending_faulter(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ XML_Parser ext_parser;
+ ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
+ void *buffer;
+ int parse_len = (int)strlen(fault->parse_text);
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
+ XML_SetUserData(ext_parser, ext_parser);
+ g_resumable = XML_TRUE;
+ buffer = XML_GetBuffer(ext_parser, parse_len);
+ if (buffer == NULL)
+ fail("Could not allocate parse buffer");
+ assert(buffer != NULL);
+ memcpy(buffer, fault->parse_text, parse_len);
+ if (XML_ParseBuffer(ext_parser, parse_len, XML_FALSE) != XML_STATUS_SUSPENDED)
+ fail("XML declaration did not suspend");
+ if (XML_ResumeParser(ext_parser) != XML_STATUS_OK)
+ xml_failure(ext_parser);
+ if (XML_ParseBuffer(ext_parser, 0, XML_TRUE) != XML_STATUS_ERROR)
+ fail(fault->fail_text);
+ if (XML_GetErrorCode(ext_parser) != fault->error)
+ xml_failure(ext_parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_failer__if_not_xml_ge(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ UNUSED_P(parser);
+ UNUSED_P(context);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+#if XML_GE == 0
+ fail(
+ "Function external_entity_suspending_failer was called despite XML_GE==0.");
+#endif
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_cr_catcher(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "\r";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetCharacterDataHandler(ext_parser, cr_cdata_handler);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_bad_cr_catcher(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<tag>\r";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetCharacterDataHandler(ext_parser, cr_cdata_handler);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_OK)
+ fail("Async entity error not caught");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_ASYNC_ENTITY)
+ xml_failure(ext_parser);
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_rsqb_catcher(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<tag>]";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetCharacterDataHandler(ext_parser, rsqb_handler);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Async entity error not caught");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_ASYNC_ENTITY)
+ xml_failure(ext_parser);
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_good_cdata_ascii(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<a><![CDATA[<greeting>Hello, world!</greeting>]]></a>";
+ const XML_Char *expected = XCS("<greeting>Hello, world!</greeting>");
+ CharData storage;
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ CharData_Init(&storage);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ XML_SetUserData(ext_parser, &storage);
+ XML_SetCharacterDataHandler(ext_parser, accumulate_characters);
+
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ CharData_CheckXMLChars(&storage, expected);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_param_checker(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<!-- Subordinate parser -->\n"
+ "<!ELEMENT doc (#PCDATA)*>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ g_handler_data = ext_parser;
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(parser);
+ return XML_STATUS_ERROR;
+ }
+ g_handler_data = parser;
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_ref_param_checker(XML_Parser parameter, const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<!ELEMENT doc (#PCDATA)*>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ if ((void *)parameter != g_handler_data)
+ fail("External entity ref handler parameter not correct");
+
+ /* Here we use the global 'parser' variable */
+ ext_parser = XML_ExternalEntityParserCreate(g_parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_param(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text1 = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>\n"
+ "%e1;\n";
+ const char *text2 = "<!ELEMENT el EMPTY>\n"
+ "<el/>\n";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ if (systemId == NULL)
+ return XML_STATUS_OK;
+
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+
+ if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Inner DTD with invalid tag not rejected");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_EXTERNAL_ENTITY_HANDLING)
+ xml_failure(ext_parser);
+ } else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Invalid tag in external param not rejected");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_SYNTAX)
+ xml_failure(ext_parser);
+ } else {
+ fail("Unknown system ID");
+ }
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_load_ignore(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char text[] =
+ /* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
+ "<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0"
+ "<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0"
+ "(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char text[] =
+ /* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
+ "\0<\0!\0[\0I\0G\0N\0O\0R\0E\0["
+ "\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 "
+ "\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_valuer(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text1 = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>\n"
+ "%e1;\n";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ if (systemId == NULL)
+ return XML_STATUS_OK;
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ } else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
+ ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
+ enum XML_Status status;
+ enum XML_Error error;
+
+ status = _XML_Parse_SINGLE_BYTES(ext_parser, fault->parse_text,
+ (int)strlen(fault->parse_text), XML_TRUE);
+ if (fault->error == XML_ERROR_NONE) {
+ if (status == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ } else {
+ if (status != XML_STATUS_ERROR)
+ fail(fault->fail_text);
+ error = XML_GetErrorCode(ext_parser);
+ if (error != fault->error
+ && (fault->error != XML_ERROR_XML_DECL
+ || error != XML_ERROR_TEXT_DECL))
+ xml_failure(ext_parser);
+ }
+ }
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_not_standalone(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text1 = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM 'bar'>\n"
+ "%e1;\n";
+ const char *text2 = "<!ATTLIST doc a1 CDATA 'value'>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ if (systemId == NULL)
+ return XML_STATUS_OK;
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (! xcstrcmp(systemId, XCS("foo"))) {
+ XML_SetNotStandaloneHandler(ext_parser, reject_not_standalone_handler);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Expected not standalone rejection");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_NOT_STANDALONE)
+ xml_failure(ext_parser);
+ XML_SetNotStandaloneHandler(ext_parser, NULL);
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_ERROR;
+ } else if (! xcstrcmp(systemId, XCS("bar"))) {
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ }
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_value_aborter(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text1 = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
+ "<!ENTITY % e2 '%e1;'>\n"
+ "%e1;\n";
+ const char *text2 = "<?xml version='1.0' encoding='utf-8'?>";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ if (systemId == NULL)
+ return XML_STATUS_OK;
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+ if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+ }
+ if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
+ XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
+ XML_SetUserData(ext_parser, ext_parser);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Aborted parse not faulted");
+ if (XML_GetErrorCode(ext_parser) != XML_ERROR_ABORTED)
+ xml_failure(ext_parser);
+ }
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_public(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text1 = (const char *)XML_GetUserData(parser);
+ const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
+ const char *text = NULL;
+ XML_Parser ext_parser;
+ int parse_res;
+
+ UNUSED_P(base);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ return XML_STATUS_ERROR;
+ if (systemId != NULL && ! xcstrcmp(systemId, XCS("http://example.org/"))) {
+ text = text1;
+ } else if (publicId != NULL && ! xcstrcmp(publicId, XCS("foo"))) {
+ text = text2;
+ } else
+ fail("Unexpected parameters to external entity parser");
+ assert(text != NULL);
+ parse_res
+ = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
+ XML_ParserFree(ext_parser);
+ return parse_res;
+}
+
+int XMLCALL
+external_entity_devaluer(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<!ELEMENT doc EMPTY>\n"
+ "<!ENTITY % e1 SYSTEM 'bar'>\n"
+ "%e1;\n";
+ XML_Parser ext_parser;
+ int clear_handler_flag = (XML_GetUserData(parser) != NULL);
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ if (systemId == NULL || ! xcstrcmp(systemId, XCS("bar")))
+ return XML_STATUS_OK;
+ if (xcstrcmp(systemId, XCS("foo")))
+ fail("Unexpected system ID");
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could note create external entity parser");
+ if (clear_handler_flag)
+ XML_SetExternalEntityRefHandler(ext_parser, NULL);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_oneshot_loader(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ ExtHdlrData *test_data = (ExtHdlrData *)XML_GetUserData(parser);
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser.");
+ /* Use the requested entity parser for further externals */
+ XML_SetExternalEntityRefHandler(ext_parser, test_data->handler);
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, test_data->parse_text,
+ (int)strlen(test_data->parse_text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(ext_parser);
+ }
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_loader2(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ ExtTest2 *test_data = (ExtTest2 *)XML_GetUserData(parser);
+ XML_Parser extparser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (extparser == NULL)
+ fail("Coulr not create external entity parser");
+ if (test_data->encoding != NULL) {
+ if (! XML_SetEncoding(extparser, test_data->encoding))
+ fail("XML_SetEncoding() ignored for external entity");
+ }
+ if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
+ test_data->parse_len, XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(extparser);
+ }
+
+ XML_ParserFree(extparser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_faulter2(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ ExtFaults2 *test_data = (ExtFaults2 *)XML_GetUserData(parser);
+ XML_Parser extparser;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (extparser == NULL)
+ fail("Could not create external entity parser");
+ if (test_data->encoding != NULL) {
+ if (! XML_SetEncoding(extparser, test_data->encoding))
+ fail("XML_SetEncoding() ignored for external entity");
+ }
+ if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
+ test_data->parse_len, XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail(test_data->fail_text);
+ if (XML_GetErrorCode(extparser) != test_data->error)
+ xml_failure(extparser);
+
+ XML_ParserFree(extparser);
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_unfinished_attlist(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = "<!ELEMENT barf ANY>\n"
+ "<!ATTLIST barf my_attr (blah|%blah;a|foo) #REQUIRED>\n"
+ "<!--COMMENT-->\n";
+ XML_Parser ext_parser;
+
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+ if (systemId == NULL)
+ return XML_STATUS_OK;
+
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+
+ if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(ext_parser);
+
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_handler(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ void *user_data = XML_GetUserData(parser);
+ const char *text;
+ XML_Parser p2;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ if (user_data == NULL)
+ text = ("<!ELEMENT doc (e+)>\n"
+ "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
+ "<!ELEMENT e EMPTY>\n");
+ else
+ text = ("<?xml version='1.0' encoding='us-ascii'?>"
+ "<e/>");
+
+ /* Set user data to any non-NULL value */
+ XML_SetUserData(parser, parser);
+ p2 = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (_XML_Parse_SINGLE_BYTES(p2, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(p2);
+ return XML_STATUS_ERROR;
+ }
+ XML_ParserFree(p2);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_duff_loader(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ XML_Parser new_parser;
+ unsigned int i;
+ const unsigned int max_alloc_count = 10;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ /* Try a few different allocation levels */
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (new_parser != NULL) {
+ XML_ParserFree(new_parser);
+ break;
+ }
+ }
+ if (i == 0)
+ fail("External parser creation ignored failing allocator");
+ else if (i == max_alloc_count)
+ fail("Extern parser not created with max allocation count");
+
+ /* Make sure other random allocation doesn't now fail */
+ g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+
+ /* Make sure the failure code path is executed too */
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_dbl_handler(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ int *pcallno = (int *)XML_GetUserData(parser);
+ int callno = *pcallno;
+ const char *text;
+ XML_Parser new_parser = NULL;
+ int i;
+ const int max_alloc_count = 20;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ if (callno == 0) {
+ /* First time through, check how many calls to malloc occur */
+ text = ("<!ELEMENT doc (e+)>\n"
+ "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
+ "<!ELEMENT e EMPTY>\n");
+ g_allocation_count = 10000;
+ new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (new_parser == NULL) {
+ fail("Unable to allocate first external parser");
+ return XML_STATUS_ERROR;
+ }
+ /* Stash the number of calls in the user data */
+ *pcallno = 10000 - g_allocation_count;
+ } else {
+ text = ("<?xml version='1.0' encoding='us-ascii'?>"
+ "<e/>");
+ /* Try at varying levels to exercise more code paths */
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = callno + i;
+ new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (new_parser != NULL)
+ break;
+ }
+ if (i == 0) {
+ fail("Second external parser unexpectedly created");
+ XML_ParserFree(new_parser);
+ return XML_STATUS_ERROR;
+ } else if (i == max_alloc_count) {
+ fail("Second external parser not created");
+ return XML_STATUS_ERROR;
+ }
+ }
+
+ g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+ if (_XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR) {
+ xml_failure(new_parser);
+ return XML_STATUS_ERROR;
+ }
+ XML_ParserFree(new_parser);
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_dbl_handler_2(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ int *pcallno = (int *)XML_GetUserData(parser);
+ int callno = *pcallno;
+ const char *text;
+ XML_Parser new_parser;
+ enum XML_Status rv;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ if (callno == 0) {
+ /* Try different allocation levels for whole exercise */
+ text = ("<!ELEMENT doc (e+)>\n"
+ "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
+ "<!ELEMENT e EMPTY>\n");
+ *pcallno = 1;
+ new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (new_parser == NULL)
+ return XML_STATUS_ERROR;
+ rv = _XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE);
+ } else {
+ /* Just run through once */
+ text = ("<?xml version='1.0' encoding='us-ascii'?>"
+ "<e/>");
+ new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (new_parser == NULL)
+ return XML_STATUS_ERROR;
+ rv = _XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE);
+ }
+ XML_ParserFree(new_parser);
+ if (rv == XML_STATUS_ERROR)
+ return XML_STATUS_ERROR;
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_alloc_set_encoding(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ /* As for external_entity_loader() */
+ const char *text = "<?xml encoding='iso-8859-3'?>"
+ "\xC3\xA9";
+ XML_Parser ext_parser;
+ enum XML_Status status;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ return XML_STATUS_ERROR;
+ if (! XML_SetEncoding(ext_parser, XCS("utf-8"))) {
+ XML_ParserFree(ext_parser);
+ return XML_STATUS_ERROR;
+ }
+ status
+ = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
+ XML_ParserFree(ext_parser);
+ if (status == XML_STATUS_ERROR)
+ return XML_STATUS_ERROR;
+ return XML_STATUS_OK;
+}
+
+int XMLCALL
+external_entity_reallocator(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = get_buffer_test_text;
+ XML_Parser ext_parser;
+ void *buffer;
+ enum XML_Status status;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ fail("Could not create external entity parser");
+
+ g_reallocation_count = *(int *)XML_GetUserData(parser);
+ buffer = XML_GetBuffer(ext_parser, 1536);
+ if (buffer == NULL)
+ fail("Buffer allocation failed");
+ assert(buffer != NULL);
+ memcpy(buffer, text, strlen(text));
+ status = XML_ParseBuffer(ext_parser, (int)strlen(text), XML_FALSE);
+ g_reallocation_count = -1;
+ XML_ParserFree(ext_parser);
+ return (status == XML_STATUS_OK) ? XML_STATUS_OK : XML_STATUS_ERROR;
+}
+
+int XMLCALL
+external_entity_alloc(XML_Parser parser, const XML_Char *context,
+ const XML_Char *base, const XML_Char *systemId,
+ const XML_Char *publicId) {
+ const char *text = (const char *)XML_GetUserData(parser);
+ XML_Parser ext_parser;
+ int parse_res;
+
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
+ if (ext_parser == NULL)
+ return XML_STATUS_ERROR;
+ parse_res
+ = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
+ XML_ParserFree(ext_parser);
+ return parse_res;
+}
+
+int XMLCALL
+external_entity_parser_create_alloc_fail_handler(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+
+ if (context != NULL)
+ fail("Unexpected non-NULL context");
+
+ // The following number intends to fail the upcoming allocation in line
+ // "parser->m_protocolEncodingName = copyString(encodingName,
+ // &(parser->m_mem));" in function parserInit.
+ g_allocation_count = 3;
+
+ const XML_Char *const encodingName = XCS("UTF-8"); // needs something non-NULL
+ const XML_Parser ext_parser
+ = XML_ExternalEntityParserCreate(parser, context, encodingName);
+ if (ext_parser != NULL)
+ fail(
+ "Call to XML_ExternalEntityParserCreate was expected to fail out-of-memory");
+
+ g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+ return XML_STATUS_ERROR;
+}
+
+#if XML_GE == 1
+int
+accounting_external_entity_ref_handler(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId) {
+ UNUSED_P(base);
+ UNUSED_P(publicId);
+
+ const struct AccountingTestCase *const testCase
+ = (const struct AccountingTestCase *)XML_GetUserData(parser);
+
+ const char *externalText = NULL;
+ if (xcstrcmp(systemId, XCS("first.ent")) == 0) {
+ externalText = testCase->firstExternalText;
+ } else if (xcstrcmp(systemId, XCS("second.ent")) == 0) {
+ externalText = testCase->secondExternalText;
+ } else {
+ assert(! "systemId is neither \"first.ent\" nor \"second.ent\"");
+ }
+ assert(externalText);
+
+ XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
+ assert(entParser);
+
+ const enum XML_Status status = _XML_Parse_SINGLE_BYTES(
+ entParser, externalText, (int)strlen(externalText), XML_TRUE);
+
+ XML_ParserFree(entParser);
+ return status;
+}
+#endif /* XML_GE == 1 */
+
+/* NotStandalone handlers */
+
+int XMLCALL
+reject_not_standalone_handler(void *userData) {
+ UNUSED_P(userData);
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL
+accept_not_standalone_handler(void *userData) {
+ UNUSED_P(userData);
+ return XML_STATUS_OK;
+}
+
+/* Attribute List handlers */
+void XMLCALL
+verify_attlist_decl_handler(void *userData, const XML_Char *element_name,
+ const XML_Char *attr_name,
+ const XML_Char *attr_type,
+ const XML_Char *default_value, int is_required) {
+ AttTest *at = (AttTest *)userData;
+
+ if (xcstrcmp(element_name, at->element_name))
+ fail("Unexpected element name in attribute declaration");
+ if (xcstrcmp(attr_name, at->attr_name))
+ fail("Unexpected attribute name in attribute declaration");
+ if (xcstrcmp(attr_type, at->attr_type))
+ fail("Unexpected attribute type in attribute declaration");
+ if ((default_value == NULL && at->default_value != NULL)
+ || (default_value != NULL && at->default_value == NULL)
+ || (default_value != NULL && xcstrcmp(default_value, at->default_value)))
+ fail("Unexpected default value in attribute declaration");
+ if (is_required != at->is_required)
+ fail("Requirement mismatch in attribute declaration");
+}
+
+/* Character Data handlers */
+
+void XMLCALL
+clearing_aborting_character_handler(void *userData, const XML_Char *s,
+ int len) {
+ UNUSED_P(userData);
+ UNUSED_P(s);
+ UNUSED_P(len);
+ XML_StopParser(g_parser, g_resumable);
+ XML_SetCharacterDataHandler(g_parser, NULL);
+}
+
+void XMLCALL
+parser_stop_character_handler(void *userData, const XML_Char *s, int len) {
+ UNUSED_P(userData);
+ UNUSED_P(s);
+ UNUSED_P(len);
+ XML_ParsingStatus status;
+ XML_GetParsingStatus(g_parser, &status);
+ if (status.parsing == XML_FINISHED) {
+ return; // the parser was stopped by a previous call to this handler.
+ }
+ XML_StopParser(g_parser, g_resumable);
+ XML_SetCharacterDataHandler(g_parser, NULL);
+ if (! g_resumable) {
+ /* Check that aborting an aborted parser is faulted */
+ if (XML_StopParser(g_parser, XML_FALSE) != XML_STATUS_ERROR)
+ fail("Aborting aborted parser not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
+ xml_failure(g_parser);
+ } else if (g_abortable) {
+ /* Check that aborting a suspended parser works */
+ if (XML_StopParser(g_parser, XML_FALSE) == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ } else {
+ /* Check that suspending a suspended parser works */
+ if (XML_StopParser(g_parser, XML_TRUE) != XML_STATUS_ERROR)
+ fail("Suspending suspended parser not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
+ xml_failure(g_parser);
+ }
+}
+
+void XMLCALL
+cr_cdata_handler(void *userData, const XML_Char *s, int len) {
+ int *pfound = (int *)userData;
+
+ /* Internal processing turns the CR into a newline for the
+ * character data handler, but not for the default handler
+ */
+ if (len == 1 && (*s == XCS('\n') || *s == XCS('\r')))
+ *pfound = 1;
+}
+
+void XMLCALL
+rsqb_handler(void *userData, const XML_Char *s, int len) {
+ int *pfound = (int *)userData;
+
+ if (len == 1 && *s == XCS(']'))
+ *pfound = 1;
+}
+
+void XMLCALL
+byte_character_handler(void *userData, const XML_Char *s, int len) {
+#if XML_CONTEXT_BYTES > 0
+ int offset, size;
+ const char *buffer;
+ ByteTestData *data = (ByteTestData *)userData;
+
+ UNUSED_P(s);
+ buffer = XML_GetInputContext(g_parser, &offset, &size);
+ if (buffer == NULL)
+ fail("Failed to get context buffer");
+ if (offset != data->start_element_len)
+ fail("Context offset in unexpected position");
+ if (len != data->cdata_len)
+ fail("CDATA length reported incorrectly");
+ if (size != data->total_string_len)
+ fail("Context size is not full buffer");
+ if (XML_GetCurrentByteIndex(g_parser) != offset)
+ fail("Character byte index incorrect");
+ if (XML_GetCurrentByteCount(g_parser) != len)
+ fail("Character byte count incorrect");
+#else
+ UNUSED_P(s);
+ UNUSED_P(userData);
+ UNUSED_P(len);
+#endif
+}
+
+void XMLCALL
+ext2_accumulate_characters(void *userData, const XML_Char *s, int len) {
+ ExtTest2 *test_data = (ExtTest2 *)userData;
+ accumulate_characters(test_data->storage, s, len);
+}
+
+/* Handlers that record their function name and int arg. */
+
+static void
+record_call(struct handler_record_list *const rec, const char *funcname,
+ const int arg) {
+ const int max_entries = sizeof(rec->entries) / sizeof(rec->entries[0]);
+ assert_true(rec->count < max_entries);
+ struct handler_record_entry *const e = &rec->entries[rec->count++];
+ e->name = funcname;
+ e->arg = arg;
+}
+
+void XMLCALL
+record_default_handler(void *userData, const XML_Char *s, int len) {
+ UNUSED_P(s);
+ record_call((struct handler_record_list *)userData, __func__, len);
+}
+
+void XMLCALL
+record_cdata_handler(void *userData, const XML_Char *s, int len) {
+ UNUSED_P(s);
+ record_call((struct handler_record_list *)userData, __func__, len);
+ XML_DefaultCurrent(g_parser);
+}
+
+void XMLCALL
+record_cdata_nodefault_handler(void *userData, const XML_Char *s, int len) {
+ UNUSED_P(s);
+ record_call((struct handler_record_list *)userData, __func__, len);
+}
+
+void XMLCALL
+record_skip_handler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity) {
+ UNUSED_P(entityName);
+ record_call((struct handler_record_list *)userData, __func__,
+ is_parameter_entity);
+}
+
+void XMLCALL
+record_element_start_handler(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ UNUSED_P(atts);
+ CharData_AppendXMLChars((CharData *)userData, name, (int)xcstrlen(name));
+}
+
+void XMLCALL
+record_element_end_handler(void *userData, const XML_Char *name) {
+ CharData *storage = (CharData *)userData;
+
+ CharData_AppendXMLChars(storage, XCS("/"), 1);
+ CharData_AppendXMLChars(storage, name, -1);
+}
+
+const struct handler_record_entry *
+_handler_record_get(const struct handler_record_list *storage, int index,
+ const char *file, int line) {
+ if (storage->count <= index) {
+ _fail(file, line, "too few handler calls");
+ }
+ return &storage->entries[index];
+}
+
+/* Entity Declaration Handlers */
+static const XML_Char *entity_name_to_match = NULL;
+static const XML_Char *entity_value_to_match = NULL;
+static int entity_match_flag = ENTITY_MATCH_NOT_FOUND;
+
+void XMLCALL
+param_entity_match_handler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity, const XML_Char *value,
+ int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName) {
+ UNUSED_P(userData);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ UNUSED_P(notationName);
+ if (! is_parameter_entity || entity_name_to_match == NULL
+ || entity_value_to_match == NULL) {
+ return;
+ }
+ if (! xcstrcmp(entityName, entity_name_to_match)) {
+ /* The cast here is safe because we control the horizontal and
+ * the vertical, and we therefore know our strings are never
+ * going to overflow an int.
+ */
+ if (value_length != (int)xcstrlen(entity_value_to_match)
+ || xcstrncmp(value, entity_value_to_match, value_length)) {
+ entity_match_flag = ENTITY_MATCH_FAIL;
+ } else {
+ entity_match_flag = ENTITY_MATCH_SUCCESS;
+ }
+ }
+ /* Else leave the match flag alone */
+}
+
+void
+param_entity_match_init(const XML_Char *name, const XML_Char *value) {
+ entity_name_to_match = name;
+ entity_value_to_match = value;
+ entity_match_flag = ENTITY_MATCH_NOT_FOUND;
+}
+
+int
+get_param_entity_match_flag(void) {
+ return entity_match_flag;
+}
+
+/* Misc handlers */
+
+void XMLCALL
+xml_decl_handler(void *userData, const XML_Char *version,
+ const XML_Char *encoding, int standalone) {
+ UNUSED_P(version);
+ UNUSED_P(encoding);
+ if (userData != g_handler_data)
+ fail("User data (xml decl) not correctly set");
+ if (standalone != -1)
+ fail("Standalone not flagged as not present in XML decl");
+ g_xdecl_count++;
+}
+
+void XMLCALL
+param_check_skip_handler(void *userData, const XML_Char *entityName,
+ int is_parameter_entity) {
+ UNUSED_P(entityName);
+ UNUSED_P(is_parameter_entity);
+ if (userData != g_handler_data)
+ fail("User data (skip) not correctly set");
+ g_skip_count++;
+}
+
+void XMLCALL
+data_check_comment_handler(void *userData, const XML_Char *data) {
+ UNUSED_P(data);
+ /* Check that the userData passed through is what we expect */
+ if (userData != g_handler_data)
+ fail("User data (parser) not correctly set");
+ /* Check that the user data in the parser is appropriate */
+ if (XML_GetUserData(userData) != (void *)1)
+ fail("User data in parser not correctly set");
+ g_comment_count++;
+}
+
+void XMLCALL
+selective_aborting_default_handler(void *userData, const XML_Char *s, int len) {
+ const XML_Char trigger_char = *(const XML_Char *)userData;
+
+ int found = 0;
+ for (int i = 0; i < len; ++i) {
+ if (s[i] == trigger_char) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (found) {
+ XML_StopParser(g_parser, g_resumable);
+ XML_SetDefaultHandler(g_parser, NULL);
+ }
+}
+
+void XMLCALL
+suspending_comment_handler(void *userData, const XML_Char *data) {
+ UNUSED_P(data);
+ XML_Parser parser = (XML_Parser)userData;
+ XML_StopParser(parser, XML_TRUE);
+}
+
+void XMLCALL
+element_decl_suspender(void *userData, const XML_Char *name,
+ XML_Content *model) {
+ UNUSED_P(userData);
+ UNUSED_P(name);
+ XML_StopParser(g_parser, XML_TRUE);
+ XML_FreeContentModel(g_parser, model);
+}
+
+void XMLCALL
+suspend_after_element_declaration(void *userData, const XML_Char *name,
+ XML_Content *model) {
+ UNUSED_P(name);
+ XML_Parser parser = (XML_Parser)userData;
+ assert_true(XML_StopParser(parser, /*resumable*/ XML_TRUE) == XML_STATUS_OK);
+ XML_FreeContentModel(parser, model);
+}
+
+void XMLCALL
+accumulate_pi_characters(void *userData, const XML_Char *target,
+ const XML_Char *data) {
+ CharData *storage = (CharData *)userData;
+
+ CharData_AppendXMLChars(storage, target, -1);
+ CharData_AppendXMLChars(storage, XCS(": "), 2);
+ CharData_AppendXMLChars(storage, data, -1);
+ CharData_AppendXMLChars(storage, XCS("\n"), 1);
+}
+
+void XMLCALL
+accumulate_comment(void *userData, const XML_Char *data) {
+ CharData *storage = (CharData *)userData;
+
+ CharData_AppendXMLChars(storage, data, -1);
+}
+
+void XMLCALL
+accumulate_entity_decl(void *userData, const XML_Char *entityName,
+ int is_parameter_entity, const XML_Char *value,
+ int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName) {
+ CharData *storage = (CharData *)userData;
+
+ UNUSED_P(is_parameter_entity);
+ UNUSED_P(base);
+ UNUSED_P(systemId);
+ UNUSED_P(publicId);
+ UNUSED_P(notationName);
+ CharData_AppendXMLChars(storage, entityName, -1);
+ CharData_AppendXMLChars(storage, XCS("="), 1);
+ if (value == NULL)
+ CharData_AppendXMLChars(storage, XCS("(null)"), -1);
+ else
+ CharData_AppendXMLChars(storage, value, value_length);
+ CharData_AppendXMLChars(storage, XCS("\n"), 1);
+}
+
+void XMLCALL
+accumulate_char_data_and_suspend(void *userData, const XML_Char *s, int len) {
+ ParserPlusStorage *const parserPlusStorage = (ParserPlusStorage *)userData;
+
+ CharData_AppendXMLChars(parserPlusStorage->storage, s, len);
+
+ for (int i = 0; i < len; i++) {
+ if (s[i] == 'Z') {
+ XML_StopParser(parserPlusStorage->parser, /*resumable=*/XML_TRUE);
+ break;
+ }
+ }
+}
+
+void XMLCALL
+accumulate_start_element(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ CharData *const storage = (CharData *)userData;
+ CharData_AppendXMLChars(storage, XCS("("), 1);
+ CharData_AppendXMLChars(storage, name, -1);
+
+ if ((atts != NULL) && (atts[0] != NULL)) {
+ CharData_AppendXMLChars(storage, XCS("("), 1);
+ while (atts[0] != NULL) {
+ CharData_AppendXMLChars(storage, atts[0], -1);
+ CharData_AppendXMLChars(storage, XCS("="), 1);
+ CharData_AppendXMLChars(storage, atts[1], -1);
+ atts += 2;
+ if (atts[0] != NULL) {
+ CharData_AppendXMLChars(storage, XCS(","), 1);
+ }
+ }
+ CharData_AppendXMLChars(storage, XCS(")"), 1);
+ }
+
+ CharData_AppendXMLChars(storage, XCS(")\n"), 2);
+}
+
+void XMLCALL
+accumulate_characters(void *userData, const XML_Char *s, int len) {
+ CharData *const storage = (CharData *)userData;
+ CharData_AppendXMLChars(storage, s, len);
+}
+
+void XMLCALL
+accumulate_attribute(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ CharData *const storage = (CharData *)userData;
+ UNUSED_P(name);
+ /* Check there are attributes to deal with */
+ if (atts == NULL)
+ return;
+
+ while (storage->count < 0 && atts[0] != NULL) {
+ /* "accumulate" the value of the first attribute we see */
+ CharData_AppendXMLChars(storage, atts[1], -1);
+ atts += 2;
+ }
+}
+
+void XMLCALL
+ext_accumulate_characters(void *userData, const XML_Char *s, int len) {
+ ExtTest *const test_data = (ExtTest *)userData;
+ accumulate_characters(test_data->storage, s, len);
+}
+
+void XMLCALL
+checking_default_handler(void *userData, const XML_Char *s, int len) {
+ DefaultCheck *data = (DefaultCheck *)userData;
+ int i;
+
+ for (i = 0; data[i].expected != NULL; i++) {
+ if (data[i].expectedLen == len
+ && ! memcmp(data[i].expected, s, len * sizeof(XML_Char))) {
+ data[i].seen = XML_TRUE;
+ break;
+ }
+ }
+}
+
+void XMLCALL
+accumulate_and_suspend_comment_handler(void *userData, const XML_Char *data) {
+ ParserPlusStorage *const parserPlusStorage = (ParserPlusStorage *)userData;
+ accumulate_comment(parserPlusStorage->storage, data);
+ XML_StopParser(parserPlusStorage->parser, XML_TRUE);
+}
diff --git a/3rdparty/expat/tests/handlers.h b/3rdparty/expat/tests/handlers.h
new file mode 100644
index 00000000000..fa6267fbbd0
--- /dev/null
+++ b/3rdparty/expat/tests/handlers.h
@@ -0,0 +1,615 @@
+/* XML handler functions for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_HANDLERS_H
+# define XML_HANDLERS_H
+
+# include "expat_config.h"
+
+# include "expat.h"
+
+/* Variable holding the expected handler userData */
+extern const void *g_handler_data;
+/* Count of the number of times the comment handler has been invoked */
+extern int g_comment_count;
+/* Count of the number of skipped entities */
+extern int g_skip_count;
+/* Count of the number of times the XML declaration handler is invoked */
+extern int g_xdecl_count;
+
+/* Start/End Element Handlers */
+
+extern void XMLCALL start_element_event_handler(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL end_element_event_handler(void *userData,
+ const XML_Char *name);
+
+# define STRUCT_START_TAG 0
+# define STRUCT_END_TAG 1
+
+extern void XMLCALL start_element_event_handler2(void *userData,
+ const XML_Char *name,
+ const XML_Char **attr);
+
+extern void XMLCALL end_element_event_handler2(void *userData,
+ const XML_Char *name);
+
+typedef struct attrInfo {
+ const XML_Char *name;
+ const XML_Char *value;
+} AttrInfo;
+
+typedef struct elementInfo {
+ const XML_Char *name;
+ int attr_count;
+ const XML_Char *id_name;
+ AttrInfo *attributes;
+} ElementInfo;
+
+typedef struct StructParserAndElementInfo {
+ XML_Parser parser;
+ ElementInfo *info;
+} ParserAndElementInfo;
+
+extern void XMLCALL counting_start_element_handler(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL suspending_end_handler(void *userData, const XML_Char *s);
+
+extern void XMLCALL start_element_suspender(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern int g_triplet_start_flag;
+extern int g_triplet_end_flag;
+
+extern void XMLCALL triplet_start_checker(void *userData, const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL triplet_end_checker(void *userData, const XML_Char *name);
+
+extern void XMLCALL overwrite_start_checker(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL overwrite_end_checker(void *userData, const XML_Char *name);
+
+extern void XMLCALL start_element_fail(void *userData, const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL start_ns_clearing_start_element(void *userData,
+ const XML_Char *prefix,
+ const XML_Char *uri);
+
+typedef struct {
+ XML_Parser parser;
+ int deep;
+} DataIssue240;
+
+extern void XMLCALL start_element_issue_240(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL end_element_issue_240(void *userData, const XML_Char *name);
+
+/* Text encoding handlers */
+
+extern int XMLCALL UnknownEncodingHandler(void *data, const XML_Char *encoding,
+ XML_Encoding *info);
+
+extern int XMLCALL UnrecognisedEncodingHandler(void *data,
+ const XML_Char *encoding,
+ XML_Encoding *info);
+
+extern int XMLCALL unknown_released_encoding_handler(void *data,
+ const XML_Char *encoding,
+ XML_Encoding *info);
+
+extern int XMLCALL MiscEncodingHandler(void *data, const XML_Char *encoding,
+ XML_Encoding *info);
+
+extern int XMLCALL long_encoding_handler(void *userData,
+ const XML_Char *encoding,
+ XML_Encoding *info);
+
+/* External Entity Handlers */
+
+typedef struct ExtOption {
+ const XML_Char *system_id;
+ const char *parse_text;
+} ExtOption;
+
+extern int XMLCALL external_entity_optioner(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_loader(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+typedef struct ext_faults {
+ const char *parse_text;
+ const char *fail_text;
+ const XML_Char *encoding;
+ enum XML_Error error;
+} ExtFaults;
+
+extern int XMLCALL external_entity_faulter(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+extern int XMLCALL external_entity_failer__if_not_xml_ge(
+ XML_Parser parser, const XML_Char *context, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId);
+extern int XMLCALL external_entity_null_loader(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_resetter(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_suspender(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_suspend_xmldecl(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_suspending_faulter(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_cr_catcher(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_bad_cr_catcher(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_rsqb_catcher(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_good_cdata_ascii(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+/* Entity declaration handlers */
+
+extern void XMLCALL entity_suspending_decl_handler(void *userData,
+ const XML_Char *name,
+ XML_Content *model);
+
+extern void XMLCALL entity_suspending_xdecl_handler(void *userData,
+ const XML_Char *version,
+ const XML_Char *encoding,
+ int standalone);
+
+extern int XMLCALL external_entity_param_checker(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_ref_param_checker(XML_Parser parameter,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_param(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_load_ignore(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_load_ignore_utf16(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_load_ignore_utf16_be(
+ XML_Parser parser, const XML_Char *context, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId);
+
+extern int XMLCALL external_entity_valuer(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_not_standalone(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_value_aborter(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_public(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_devaluer(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+typedef struct ext_hdlr_data {
+ const char *parse_text;
+ XML_ExternalEntityRefHandler handler;
+ CharData *storage;
+} ExtHdlrData;
+
+extern int XMLCALL external_entity_oneshot_loader(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+typedef struct ExtTest2 {
+ const char *parse_text;
+ int parse_len;
+ const XML_Char *encoding;
+ CharData *storage;
+} ExtTest2;
+
+extern int XMLCALL external_entity_loader2(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+typedef struct ExtFaults2 {
+ const char *parse_text;
+ int parse_len;
+ const char *fail_text;
+ const XML_Char *encoding;
+ enum XML_Error error;
+} ExtFaults2;
+
+extern int XMLCALL external_entity_faulter2(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_unfinished_attlist(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_handler(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_duff_loader(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_dbl_handler(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_dbl_handler_2(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_alloc_set_encoding(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_reallocator(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_alloc(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+extern int XMLCALL external_entity_parser_create_alloc_fail_handler(
+ XML_Parser parser, const XML_Char *context, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId);
+
+struct AccountingTestCase {
+ const char *primaryText;
+ const char *firstExternalText; /* often NULL */
+ const char *secondExternalText; /* often NULL */
+ const unsigned long long expectedCountBytesIndirectExtra;
+};
+
+extern int accounting_external_entity_ref_handler(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+/* NotStandalone handlers */
+
+extern int XMLCALL reject_not_standalone_handler(void *userData);
+
+extern int XMLCALL accept_not_standalone_handler(void *userData);
+
+/* Attribute List handlers */
+
+typedef struct AttTest {
+ const char *definition;
+ const XML_Char *element_name;
+ const XML_Char *attr_name;
+ const XML_Char *attr_type;
+ const XML_Char *default_value;
+ int is_required;
+} AttTest;
+
+extern void XMLCALL verify_attlist_decl_handler(
+ void *userData, const XML_Char *element_name, const XML_Char *attr_name,
+ const XML_Char *attr_type, const XML_Char *default_value, int is_required);
+
+/* Character data handlers */
+
+extern void XMLCALL clearing_aborting_character_handler(void *userData,
+ const XML_Char *s,
+ int len);
+
+extern void XMLCALL parser_stop_character_handler(void *userData,
+ const XML_Char *s, int len);
+
+extern void XMLCALL cr_cdata_handler(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL rsqb_handler(void *userData, const XML_Char *s, int len);
+
+typedef struct ByteTestData {
+ int start_element_len;
+ int cdata_len;
+ int total_string_len;
+} ByteTestData;
+
+extern void XMLCALL byte_character_handler(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL ext2_accumulate_characters(void *userData,
+ const XML_Char *s, int len);
+
+/* Handlers that record their `len` arg and a single identifying character */
+
+struct handler_record_entry {
+ const char *name;
+ int arg;
+};
+struct handler_record_list {
+ int count;
+ struct handler_record_entry entries[50]; // arbitrary big-enough max count
+};
+
+extern void XMLCALL record_default_handler(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL record_cdata_handler(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL record_cdata_nodefault_handler(void *userData,
+ const XML_Char *s, int len);
+
+extern void XMLCALL record_skip_handler(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity);
+
+extern void XMLCALL record_element_start_handler(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL record_element_end_handler(void *userData,
+ const XML_Char *name);
+
+extern const struct handler_record_entry *
+_handler_record_get(const struct handler_record_list *storage, int index,
+ const char *file, int line);
+
+# define handler_record_get(storage, index) \
+ _handler_record_get((storage), (index), __FILE__, __LINE__)
+
+# define assert_record_handler_called(storage, index, expected_name, \
+ expected_arg) \
+ do { \
+ const struct handler_record_entry *e \
+ = handler_record_get(storage, index); \
+ assert_true(strcmp(e->name, expected_name) == 0); \
+ assert_true(e->arg == (expected_arg)); \
+ } while (0)
+
+/* Entity Declaration Handlers */
+# define ENTITY_MATCH_FAIL (-1)
+# define ENTITY_MATCH_NOT_FOUND (0)
+# define ENTITY_MATCH_SUCCESS (1)
+
+extern void XMLCALL param_entity_match_handler(
+ void *userData, const XML_Char *entityName, int is_parameter_entity,
+ const XML_Char *value, int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName);
+
+extern void param_entity_match_init(const XML_Char *name,
+ const XML_Char *value);
+
+extern int get_param_entity_match_flag(void);
+
+/* Misc handlers */
+
+extern void XMLCALL xml_decl_handler(void *userData, const XML_Char *version,
+ const XML_Char *encoding, int standalone);
+
+extern void XMLCALL param_check_skip_handler(void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity);
+
+extern void XMLCALL data_check_comment_handler(void *userData,
+ const XML_Char *data);
+
+extern void XMLCALL selective_aborting_default_handler(void *userData,
+ const XML_Char *s,
+ int len);
+
+extern void XMLCALL suspending_comment_handler(void *userData,
+ const XML_Char *data);
+
+extern void XMLCALL element_decl_suspender(void *userData, const XML_Char *name,
+ XML_Content *model);
+
+extern void XMLCALL suspend_after_element_declaration(void *userData,
+ const XML_Char *name,
+ XML_Content *model);
+
+extern void XMLCALL accumulate_pi_characters(void *userData,
+ const XML_Char *target,
+ const XML_Char *data);
+
+extern void XMLCALL accumulate_comment(void *userData, const XML_Char *data);
+
+extern void XMLCALL accumulate_entity_decl(
+ void *userData, const XML_Char *entityName, int is_parameter_entity,
+ const XML_Char *value, int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName);
+
+extern void XMLCALL accumulate_char_data_and_suspend(void *userData,
+ const XML_Char *s,
+ int len);
+
+extern void XMLCALL accumulate_start_element(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL accumulate_characters(void *userData, const XML_Char *s,
+ int len);
+
+extern void XMLCALL accumulate_attribute(void *userData, const XML_Char *name,
+ const XML_Char **atts);
+
+extern void XMLCALL ext_accumulate_characters(void *userData, const XML_Char *s,
+ int len);
+
+typedef struct default_check {
+ const XML_Char *expected;
+ const int expectedLen;
+ XML_Bool seen;
+} DefaultCheck;
+
+void XMLCALL checking_default_handler(void *userData, const XML_Char *s,
+ int len);
+
+typedef struct {
+ XML_Parser parser;
+ CharData *storage;
+} ParserPlusStorage;
+
+extern void XMLCALL
+accumulate_and_suspend_comment_handler(void *userData, const XML_Char *data);
+
+#endif /* XML_HANDLERS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/handlers_cxx.cpp b/3rdparty/expat/tests/handlers_cxx.cpp
new file mode 100644
index 00000000000..86c62b159cc
--- /dev/null
+++ b/3rdparty/expat/tests/handlers_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "handlers.c"
diff --git a/3rdparty/expat/tests/memcheck.c b/3rdparty/expat/tests/memcheck.c
index 41355f6c8d9..de925499721 100644
--- a/3rdparty/expat/tests/memcheck.c
+++ b/3rdparty/expat/tests/memcheck.c
@@ -6,8 +6,9 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -49,12 +50,13 @@ typedef struct allocation_entry {
static AllocationEntry *alloc_head = NULL;
static AllocationEntry *alloc_tail = NULL;
-static AllocationEntry *find_allocation(void *ptr);
+static AllocationEntry *find_allocation(const void *ptr);
/* Allocate some memory and keep track of it. */
void *
tracking_malloc(size_t size) {
- AllocationEntry *entry = malloc(sizeof(AllocationEntry));
+ AllocationEntry *const entry
+ = (AllocationEntry *)malloc(sizeof(AllocationEntry));
if (entry == NULL) {
printf("Allocator failure\n");
@@ -82,7 +84,7 @@ tracking_malloc(size_t size) {
}
static AllocationEntry *
-find_allocation(void *ptr) {
+find_allocation(const void *ptr) {
AllocationEntry *entry;
for (entry = alloc_head; entry != NULL; entry = entry->next) {
@@ -140,7 +142,7 @@ tracking_realloc(void *ptr, size_t size) {
entry = find_allocation(ptr);
if (entry == NULL) {
printf("Attempting to realloc unallocated memory at %p\n", ptr);
- entry = malloc(sizeof(AllocationEntry));
+ entry = (AllocationEntry *)malloc(sizeof(AllocationEntry));
if (entry == NULL) {
printf("Reallocator failure\n");
return NULL;
@@ -162,12 +164,11 @@ tracking_realloc(void *ptr, size_t size) {
alloc_tail = entry;
}
} else {
- entry->allocation = realloc(ptr, size);
- if (entry->allocation == NULL) {
- /* Realloc semantics say the original is still allocated */
- entry->allocation = ptr;
+ void *const reallocated = realloc(ptr, size);
+ if (reallocated == NULL) {
return NULL;
}
+ entry->allocation = reallocated;
}
entry->num_bytes = size;
diff --git a/3rdparty/expat/tests/memcheck.h b/3rdparty/expat/tests/memcheck.h
index 4d20f4bb972..4c0cb7281b9 100644
--- a/3rdparty/expat/tests/memcheck.h
+++ b/3rdparty/expat/tests/memcheck.h
@@ -7,8 +7,8 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/tests/memcheck_cxx.cpp b/3rdparty/expat/tests/memcheck_cxx.cpp
new file mode 100644
index 00000000000..e62ac98999c
--- /dev/null
+++ b/3rdparty/expat/tests/memcheck_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "memcheck.c"
diff --git a/3rdparty/expat/tests/minicheck.c b/3rdparty/expat/tests/minicheck.c
index a5a1efb159f..baccd76b441 100644
--- a/3rdparty/expat/tests/minicheck.c
+++ b/3rdparty/expat/tests/minicheck.c
@@ -10,8 +10,12 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2004-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -34,6 +38,11 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
+#endif
+
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
@@ -85,7 +94,8 @@ tcase_add_test(TCase *tc, tcase_test_function test) {
if (tc->allocated == tc->ntests) {
int nalloc = tc->allocated + 100;
size_t new_size = sizeof(tcase_test_function) * nalloc;
- tcase_test_function *new_tests = realloc(tc->tests, new_size);
+ tcase_test_function *const new_tests
+ = (tcase_test_function *)realloc(tc->tests, new_size);
assert(new_tests != NULL);
tc->tests = new_tests;
tc->allocated = nalloc;
@@ -120,7 +130,7 @@ suite_free(Suite *suite) {
SRunner *
srunner_create(Suite *suite) {
- SRunner *runner = calloc(1, sizeof(SRunner));
+ SRunner *const runner = (SRunner *)calloc(1, sizeof(SRunner));
if (runner != NULL) {
runner->suite = suite;
}
@@ -129,28 +139,57 @@ srunner_create(Suite *suite) {
static jmp_buf env;
+#define SUBTEST_LEN (50) // informative, but not too long
static char const *_check_current_function = NULL;
+static char _check_current_subtest[SUBTEST_LEN];
static int _check_current_lineno = -1;
static char const *_check_current_filename = NULL;
void
_check_set_test_info(char const *function, char const *filename, int lineno) {
_check_current_function = function;
+ set_subtest("%s", "");
_check_current_lineno = lineno;
_check_current_filename = filename;
}
+void
+set_subtest(char const *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(_check_current_subtest, SUBTEST_LEN, fmt, ap);
+ va_end(ap);
+ // replace line feeds with spaces, for nicer error logs
+ for (size_t i = 0; i < SUBTEST_LEN; ++i) {
+ if (_check_current_subtest[i] == '\n') {
+ _check_current_subtest[i] = ' ';
+ }
+ }
+ _check_current_subtest[SUBTEST_LEN - 1] = '\0'; // ensure termination
+}
+
static void
-add_failure(SRunner *runner, int verbosity) {
- runner->nfailures++;
+handle_success(int verbosity) {
if (verbosity >= CK_VERBOSE) {
- printf("%s:%d: %s\n", _check_current_filename, _check_current_lineno,
- _check_current_function);
+ printf("PASS: %s\n", _check_current_function);
+ }
+}
+
+static void
+handle_failure(SRunner *runner, int verbosity, const char *context,
+ const char *phase_info) {
+ runner->nfailures++;
+ if (verbosity != CK_SILENT) {
+ if (strlen(_check_current_subtest) != 0) {
+ phase_info = _check_current_subtest;
+ }
+ printf("FAIL [%s]: %s (%s at %s:%d)\n", context, _check_current_function,
+ phase_info, _check_current_filename, _check_current_lineno);
}
}
void
-srunner_run_all(SRunner *runner, int verbosity) {
+srunner_run_all(SRunner *runner, const char *context, int verbosity) {
Suite *suite;
TCase *volatile tc;
assert(runner != NULL);
@@ -160,34 +199,42 @@ srunner_run_all(SRunner *runner, int verbosity) {
volatile int i;
for (i = 0; i < tc->ntests; ++i) {
runner->nchecks++;
+ set_subtest("%s", "");
if (tc->setup != NULL) {
/* setup */
if (setjmp(env)) {
- add_failure(runner, verbosity);
+ handle_failure(runner, verbosity, context, "during setup");
continue;
}
tc->setup();
}
/* test */
if (setjmp(env)) {
- add_failure(runner, verbosity);
+ handle_failure(runner, verbosity, context, "during actual test");
continue;
}
(tc->tests[i])();
+ set_subtest("%s", "");
/* teardown */
if (tc->teardown != NULL) {
if (setjmp(env)) {
- add_failure(runner, verbosity);
+ handle_failure(runner, verbosity, context, "during teardown");
continue;
}
tc->teardown();
}
+
+ handle_success(verbosity);
}
tc = tc->next_tcase;
}
- if (verbosity) {
+}
+
+void
+srunner_summarize(SRunner *runner, int verbosity) {
+ if (verbosity != CK_SILENT) {
int passed = runner->nchecks - runner->nfailures;
double percentage = ((double)passed) / runner->nchecks;
int display = (int)(percentage * 100);
@@ -197,14 +244,13 @@ srunner_run_all(SRunner *runner, int verbosity) {
}
void
-_fail_unless(int condition, const char *file, int line, const char *msg) {
+_fail(const char *file, int line, const char *msg) {
/* Always print the error message so it isn't lost. In this case,
we have a failure, so there's no reason to be quiet about what
it is.
*/
- UNUSED_P(condition);
- UNUSED_P(file);
- UNUSED_P(line);
+ _check_current_filename = file;
+ _check_current_lineno = line;
if (msg != NULL) {
const int has_newline = (msg[strlen(msg) - 1] == '\n');
fprintf(stderr, "ERROR: %s%s", msg, has_newline ? "" : "\n");
diff --git a/3rdparty/expat/tests/minicheck.h b/3rdparty/expat/tests/minicheck.h
index 88a16584fb5..29ae4cb2420 100644
--- a/3rdparty/expat/tests/minicheck.h
+++ b/3rdparty/expat/tests/minicheck.h
@@ -12,8 +12,11 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2004-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2006-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -40,30 +43,54 @@
extern "C" {
#endif
-#define CK_NOFORK 0
-#define CK_FORK 1
+#ifndef XML_MINICHECK_H
+# define XML_MINICHECK_H
-#define CK_SILENT 0
-#define CK_NORMAL 1
-#define CK_VERBOSE 2
+# define CK_NOFORK 0
+# define CK_FORK 1
+
+# define CK_SILENT 0
+# define CK_NORMAL 1
+# define CK_VERBOSE 2
/* Workaround for Microsoft's compiler and Tru64 Unix systems where the
C compiler has a working __func__, but the C++ compiler only has a
working __FUNCTION__. This could be fixed in configure.in, but it's
not worth it right now. */
-#if defined(_MSC_VER) || (defined(__osf__) && defined(__cplusplus))
-# define __func__ __FUNCTION__
-#endif
-
-#define START_TEST(testname) \
- static void testname(void) { \
- _check_set_test_info(__func__, __FILE__, __LINE__); \
- {
-#define END_TEST \
- } \
- }
-
-#define fail(msg) _fail_unless(0, __FILE__, __LINE__, msg)
+# if defined(_MSC_VER) || (defined(__osf__) && defined(__cplusplus))
+# define __func__ __FUNCTION__
+# endif
+
+/* PRINTF_LIKE has two effects:
+ 1. Make clang's -Wformat-nonliteral stop warning about non-literal format
+ strings in annotated functions' code.
+ 2. Make both clang and gcc's -Wformat-nonliteral warn about *callers* of
+ the annotated function that use a non-literal format string.
+*/
+# if defined(__GNUC__)
+# define PRINTF_LIKE(fmtpos, argspos) \
+ __attribute__((format(printf, fmtpos, argspos)))
+# else
+# define PRINTF_LIKE(fmtpos, argspos)
+# endif
+
+# define START_TEST(testname) \
+ static void testname(void) { \
+ _check_set_test_info(__func__, __FILE__, __LINE__); \
+ {
+# define END_TEST \
+ } \
+ }
+
+void PRINTF_LIKE(1, 2) set_subtest(char const *fmt, ...);
+
+# define fail(msg) _fail(__FILE__, __LINE__, msg)
+# define assert_true(cond) \
+ do { \
+ if (! (cond)) { \
+ _fail(__FILE__, __LINE__, "check failed: " #cond); \
+ } \
+ } while (0)
typedef void (*tcase_setup_function)(void);
typedef void (*tcase_teardown_function)(void);
@@ -102,18 +129,27 @@ void _check_set_test_info(char const *function, char const *filename,
* Prototypes for the actual implementation.
*/
-void _fail_unless(int condition, const char *file, int line, const char *msg);
+# if defined(__has_attribute)
+# if __has_attribute(noreturn)
+__attribute__((noreturn))
+# endif
+# endif
+void
+_fail(const char *file, int line, const char *msg);
Suite *suite_create(const char *name);
TCase *tcase_create(const char *name);
void suite_add_tcase(Suite *suite, TCase *tc);
-void tcase_add_checked_fixture(TCase *, tcase_setup_function,
- tcase_teardown_function);
+void tcase_add_checked_fixture(TCase *tc, tcase_setup_function setup,
+ tcase_teardown_function teardown);
void tcase_add_test(TCase *tc, tcase_test_function test);
SRunner *srunner_create(Suite *suite);
-void srunner_run_all(SRunner *runner, int verbosity);
+void srunner_run_all(SRunner *runner, const char *context, int verbosity);
+void srunner_summarize(SRunner *runner, int verbosity);
int srunner_ntests_failed(SRunner *runner);
void srunner_free(SRunner *runner);
+#endif /* XML_MINICHECK_H */
+
#ifdef __cplusplus
}
#endif
diff --git a/3rdparty/expat/tests/minicheck_cxx.cpp b/3rdparty/expat/tests/minicheck_cxx.cpp
new file mode 100644
index 00000000000..58881c60ba0
--- /dev/null
+++ b/3rdparty/expat/tests/minicheck_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "minicheck.c"
diff --git a/3rdparty/expat/tests/misc_tests.c b/3rdparty/expat/tests/misc_tests.c
new file mode 100644
index 00000000000..fb95014b142
--- /dev/null
+++ b/3rdparty/expat/tests/misc_tests.c
@@ -0,0 +1,709 @@
+/* Tests in the "miscellaneous" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
+#endif
+
+#include <assert.h>
+#include <string.h>
+
+#include "expat_config.h"
+
+#include "expat.h"
+#include "internal.h"
+#include "minicheck.h"
+#include "memcheck.h"
+#include "common.h"
+#include "ascii.h" /* for ASCII_xxx */
+#include "handlers.h"
+#include "misc_tests.h"
+
+void XMLCALL accumulate_characters_ext_handler(void *userData,
+ const XML_Char *s, int len);
+
+/* Test that a failure to allocate the parser structure fails gracefully */
+START_TEST(test_misc_alloc_create_parser) {
+ XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
+ unsigned int i;
+ const unsigned int max_alloc_count = 10;
+
+ /* Something this simple shouldn't need more than 10 allocations */
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
+ if (g_parser != NULL)
+ break;
+ }
+ if (i == 0)
+ fail("Parser unexpectedly ignored failing allocator");
+ else if (i == max_alloc_count)
+ fail("Parser not created with max allocation count");
+}
+END_TEST
+
+/* Test memory allocation failures for a parser with an encoding */
+START_TEST(test_misc_alloc_create_parser_with_encoding) {
+ XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
+ unsigned int i;
+ const unsigned int max_alloc_count = 10;
+
+ /* Try several levels of allocation */
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ g_parser = XML_ParserCreate_MM(XCS("us-ascii"), &memsuite, NULL);
+ if (g_parser != NULL)
+ break;
+ }
+ if (i == 0)
+ fail("Parser ignored failing allocator");
+ else if (i == max_alloc_count)
+ fail("Parser not created with max allocation count");
+}
+END_TEST
+
+/* Test that freeing a NULL parser doesn't cause an explosion.
+ * (Not actually tested anywhere else)
+ */
+START_TEST(test_misc_null_parser) {
+ XML_ParserFree(NULL);
+}
+END_TEST
+
+#if defined(__has_feature)
+# if __has_feature(undefined_behavior_sanitizer)
+# define EXPAT_TESTS_UBSAN 1
+# else
+# define EXPAT_TESTS_UBSAN 0
+# endif
+#else
+# define EXPAT_TESTS_UBSAN 0
+#endif
+
+/* Test that XML_ErrorString rejects out-of-range codes */
+START_TEST(test_misc_error_string) {
+#if ! EXPAT_TESTS_UBSAN // because this would trigger UBSan
+ union {
+ enum XML_Error xml_error;
+ int integer;
+ } trickery;
+
+ assert_true(sizeof(enum XML_Error) == sizeof(int)); // self-test
+
+ trickery.integer = -1;
+ if (XML_ErrorString(trickery.xml_error) != NULL)
+ fail("Negative error code not rejected");
+
+ trickery.integer = 100;
+ if (XML_ErrorString(trickery.xml_error) != NULL)
+ fail("Large error code not rejected");
+#endif
+}
+END_TEST
+
+/* Test the version information is consistent */
+
+/* Since we are working in XML_LChars (potentially 16-bits), we
+ * can't use the standard C library functions for character
+ * manipulation and have to roll our own.
+ */
+static int
+parse_version(const XML_LChar *version_text,
+ XML_Expat_Version *version_struct) {
+ if (! version_text)
+ return XML_FALSE;
+
+ while (*version_text != 0x00) {
+ if (*version_text >= ASCII_0 && *version_text <= ASCII_9)
+ break;
+ version_text++;
+ }
+ if (*version_text == 0x00)
+ return XML_FALSE;
+
+ /* version_struct->major = strtoul(version_text, 10, &version_text) */
+ version_struct->major = 0;
+ while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
+ version_struct->major
+ = 10 * version_struct->major + (*version_text++ - ASCII_0);
+ }
+ if (*version_text++ != ASCII_PERIOD)
+ return XML_FALSE;
+
+ /* Now for the minor version number */
+ version_struct->minor = 0;
+ while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
+ version_struct->minor
+ = 10 * version_struct->minor + (*version_text++ - ASCII_0);
+ }
+ if (*version_text++ != ASCII_PERIOD)
+ return XML_FALSE;
+
+ /* Finally the micro version number */
+ version_struct->micro = 0;
+ while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
+ version_struct->micro
+ = 10 * version_struct->micro + (*version_text++ - ASCII_0);
+ }
+ if (*version_text != 0x00)
+ return XML_FALSE;
+ return XML_TRUE;
+}
+
+static int
+versions_equal(const XML_Expat_Version *first,
+ const XML_Expat_Version *second) {
+ return (first->major == second->major && first->minor == second->minor
+ && first->micro == second->micro);
+}
+
+START_TEST(test_misc_version) {
+ XML_Expat_Version read_version = XML_ExpatVersionInfo();
+ /* Silence compiler warning with the following assignment */
+ XML_Expat_Version parsed_version = {0, 0, 0};
+ const XML_LChar *version_text = XML_ExpatVersion();
+
+ if (version_text == NULL)
+ fail("Could not obtain version text");
+ assert(version_text != NULL);
+ if (! parse_version(version_text, &parsed_version))
+ fail("Unable to parse version text");
+ if (! versions_equal(&read_version, &parsed_version))
+ fail("Version mismatch");
+
+ if (xcstrcmp(version_text, XCS("expat_2.7.1"))) /* needs bump on releases */
+ fail("XML_*_VERSION in expat.h out of sync?\n");
+}
+END_TEST
+
+/* Test feature information */
+START_TEST(test_misc_features) {
+ const XML_Feature *features = XML_GetFeatureList();
+
+ /* Prevent problems with double-freeing parsers */
+ g_parser = NULL;
+ if (features == NULL) {
+ fail("Failed to get feature information");
+ } else {
+ /* Loop through the features checking what we can */
+ while (features->feature != XML_FEATURE_END) {
+ switch (features->feature) {
+ case XML_FEATURE_SIZEOF_XML_CHAR:
+ if (features->value != sizeof(XML_Char))
+ fail("Incorrect size of XML_Char");
+ break;
+ case XML_FEATURE_SIZEOF_XML_LCHAR:
+ if (features->value != sizeof(XML_LChar))
+ fail("Incorrect size of XML_LChar");
+ break;
+ default:
+ break;
+ }
+ features++;
+ }
+ }
+}
+END_TEST
+
+/* Regression test for GitHub Issue #17: memory leak parsing attribute
+ * values with mixed bound and unbound namespaces.
+ */
+START_TEST(test_misc_attribute_leak) {
+ const char *text = "<D xmlns:L=\"D\" l:a='' L:a=''/>";
+ XML_Memory_Handling_Suite memsuite
+ = {tracking_malloc, tracking_realloc, tracking_free};
+
+ g_parser = XML_ParserCreate_MM(XCS("UTF-8"), &memsuite, XCS("\n"));
+ expect_failure(text, XML_ERROR_UNBOUND_PREFIX, "Unbound prefixes not found");
+ XML_ParserFree(g_parser);
+ /* Prevent the teardown trying to double free */
+ g_parser = NULL;
+
+ if (! tracking_report())
+ fail("Memory leak found");
+}
+END_TEST
+
+/* Test parser created for UTF-16LE is successful */
+START_TEST(test_misc_utf16le) {
+ const char text[] =
+ /* <?xml version='1.0'?><q>Hi</q> */
+ "<\0?\0x\0m\0l\0 \0"
+ "v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0?\0>\0"
+ "<\0q\0>\0H\0i\0<\0/\0q\0>\0";
+ const XML_Char *expected = XCS("Hi");
+ CharData storage;
+
+ g_parser = XML_ParserCreate(XCS("UTF-16LE"));
+ if (g_parser == NULL)
+ fail("Parser not created");
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_misc_stop_during_end_handler_issue_240_1) {
+ XML_Parser parser;
+ DataIssue240 *mydata;
+ enum XML_Status result;
+ const char *const doc1 = "<doc><e1/><e><foo/></e></doc>";
+
+ parser = XML_ParserCreate(NULL);
+ XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
+ mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
+ assert_true(mydata != NULL);
+ mydata->parser = parser;
+ mydata->deep = 0;
+ XML_SetUserData(parser, mydata);
+
+ result = _XML_Parse_SINGLE_BYTES(parser, doc1, (int)strlen(doc1), 1);
+ XML_ParserFree(parser);
+ free(mydata);
+ if (result != XML_STATUS_ERROR)
+ fail("Stopping the parser did not work as expected");
+}
+END_TEST
+
+START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
+ XML_Parser parser;
+ DataIssue240 *mydata;
+ enum XML_Status result;
+ const char *const doc2 = "<doc><elem/></doc>";
+
+ parser = XML_ParserCreate(NULL);
+ XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
+ mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
+ assert_true(mydata != NULL);
+ mydata->parser = parser;
+ mydata->deep = 0;
+ XML_SetUserData(parser, mydata);
+
+ result = _XML_Parse_SINGLE_BYTES(parser, doc2, (int)strlen(doc2), 1);
+ XML_ParserFree(parser);
+ free(mydata);
+ if (result != XML_STATUS_ERROR)
+ fail("Stopping the parser did not work as expected");
+}
+END_TEST
+
+START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) {
+ const char *const inputOne
+ = "<!DOCTYPE d [\n"
+ "<!ENTITY % element_d '<!ELEMENT d (#PCDATA)*>'>\n"
+ "%element_d;\n"
+ "<!ENTITY % e ']><d/>'>\n"
+ "\n"
+ "%e;";
+ const char *const inputTwo
+ = "<!DOCTYPE d [\n"
+ "<!ENTITY % element_d '<!ELEMENT d (#PCDATA)*>'>\n"
+ "%element_d;\n"
+ "<!ENTITY % e1 ']><d/>'><!ENTITY % e2 '&#37;e1;'>\n"
+ "\n"
+ "%e2;";
+ const char *const inputThree
+ = "<!DOCTYPE d [\n"
+ "<!ENTITY % element_d '<!ELEMENT d (#PCDATA)*>'>\n"
+ "%element_d;\n"
+ "<!ENTITY % e ']><d'>\n"
+ "\n"
+ "%e;/>";
+ const char *const inputIssue317
+ = "<!DOCTYPE doc [\n"
+ "<!ENTITY % element_doc '<!ELEMENT doc (#PCDATA)*>'>\n"
+ "%element_doc;\n"
+ "<!ENTITY % foo ']>\n"
+ "<doc>Hell<oc (#PCDATA)*>'>\n"
+ "%foo;\n"
+ "]>\n"
+ "<doc>Hello, world</dVc>";
+
+ const char *const inputs[] = {inputOne, inputTwo, inputThree, inputIssue317};
+ const XML_Bool suspendOrNot[] = {XML_FALSE, XML_TRUE};
+ size_t inputIndex = 0;
+
+ for (; inputIndex < sizeof(inputs) / sizeof(inputs[0]); inputIndex++) {
+ for (size_t suspendOrNotIndex = 0;
+ suspendOrNotIndex < sizeof(suspendOrNot) / sizeof(suspendOrNot[0]);
+ suspendOrNotIndex++) {
+ const char *const input = inputs[inputIndex];
+ const XML_Bool suspend = suspendOrNot[suspendOrNotIndex];
+ if (suspend && (g_chunkSize > 0)) {
+ // We cannot use _XML_Parse_SINGLE_BYTES below due to suspension, and
+ // so chunk sizes >0 would only repeat the very same test
+ // due to use of plain XML_Parse; we are saving upon that runtime:
+ return;
+ }
+
+ set_subtest("[input=%d suspend=%s] %s", (int)inputIndex,
+ suspend ? "true" : "false", input);
+ XML_Parser parser;
+ enum XML_Status parseResult;
+ int setParamEntityResult;
+ XML_Size lineNumber;
+ XML_Size columnNumber;
+
+ parser = XML_ParserCreate(NULL);
+ setParamEntityResult
+ = XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ if (setParamEntityResult != 1)
+ fail("Failed to set XML_PARAM_ENTITY_PARSING_ALWAYS.");
+
+ if (suspend) {
+ XML_SetUserData(parser, parser);
+ XML_SetElementDeclHandler(parser, suspend_after_element_declaration);
+ }
+
+ if (suspend) {
+ // can't use SINGLE_BYTES here, because it'll return early on
+ // suspension, and we won't know exactly how much input we actually
+ // managed to give Expat.
+ parseResult = XML_Parse(parser, input, (int)strlen(input), 0);
+
+ while (parseResult == XML_STATUS_SUSPENDED) {
+ parseResult = XML_ResumeParser(parser);
+ }
+
+ if (parseResult != XML_STATUS_ERROR) {
+ // can't use SINGLE_BYTES here, because it'll return early on
+ // suspension, and we won't know exactly how much input we actually
+ // managed to give Expat.
+ parseResult = XML_Parse(parser, "", 0, 1);
+ }
+
+ while (parseResult == XML_STATUS_SUSPENDED) {
+ parseResult = XML_ResumeParser(parser);
+ }
+ } else {
+ parseResult
+ = _XML_Parse_SINGLE_BYTES(parser, input, (int)strlen(input), 0);
+
+ if (parseResult != XML_STATUS_ERROR) {
+ parseResult = _XML_Parse_SINGLE_BYTES(parser, "", 0, 1);
+ }
+ }
+
+ if (parseResult != XML_STATUS_ERROR) {
+ fail("Parsing was expected to fail but succeeded.");
+ }
+
+ if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
+ fail("Error code does not match XML_ERROR_INVALID_TOKEN");
+
+ lineNumber = XML_GetCurrentLineNumber(parser);
+ if (lineNumber != 6)
+ fail("XML_GetCurrentLineNumber does not work as expected.");
+
+ columnNumber = XML_GetCurrentColumnNumber(parser);
+ if (columnNumber != 0)
+ fail("XML_GetCurrentColumnNumber does not work as expected.");
+
+ XML_ParserFree(parser);
+ }
+ }
+}
+END_TEST
+
+START_TEST(test_misc_tag_mismatch_reset_leak) {
+#ifdef XML_NS
+ const char *const text = "<open xmlns='https://namespace1.test'></close>";
+ XML_Parser parser = XML_ParserCreateNS(NULL, XCS('\n'));
+
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Call to parse was expected to fail");
+ if (XML_GetErrorCode(parser) != XML_ERROR_TAG_MISMATCH)
+ fail("Call to parse was expected to fail from a closing tag mismatch");
+
+ XML_ParserReset(parser, NULL);
+
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Call to parse was expected to fail");
+ if (XML_GetErrorCode(parser) != XML_ERROR_TAG_MISMATCH)
+ fail("Call to parse was expected to fail from a closing tag mismatch");
+
+ XML_ParserFree(parser);
+#endif
+}
+END_TEST
+
+START_TEST(test_misc_create_external_entity_parser_with_null_context) {
+ // With XML_DTD undefined, the only supported case of external entities
+ // is pattern "<!ENTITY entity123 SYSTEM 'filename123'>". A NULL context
+ // was causing a segfault through a null pointer dereference in function
+ // setContext, previously.
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_Parser ext_parser = XML_ExternalEntityParserCreate(parser, NULL, NULL);
+#ifdef XML_DTD
+ assert_true(ext_parser != NULL);
+ XML_ParserFree(ext_parser);
+#else
+ assert_true(ext_parser == NULL);
+#endif /* XML_DTD */
+ XML_ParserFree(parser);
+}
+END_TEST
+
+START_TEST(test_misc_general_entities_support) {
+ const char *const doc
+ = "<!DOCTYPE r [\n"
+ "<!ENTITY e1 'v1'>\n"
+ "<!ENTITY e2 SYSTEM 'v2'>\n"
+ "]>\n"
+ "<r a1='[&e1;]'>[&e1;][&e2;][&amp;&apos;&gt;&lt;&quot;]</r>";
+
+ CharData storage;
+ CharData_Init(&storage);
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_SetUserData(parser, &storage);
+ XML_SetStartElementHandler(parser, accumulate_start_element);
+ XML_SetExternalEntityRefHandler(parser,
+ external_entity_failer__if_not_xml_ge);
+ XML_SetEntityDeclHandler(parser, accumulate_entity_decl);
+ XML_SetCharacterDataHandler(parser, accumulate_characters);
+
+ if (_XML_Parse_SINGLE_BYTES(parser, doc, (int)strlen(doc), XML_TRUE)
+ != XML_STATUS_OK) {
+ xml_failure(parser);
+ }
+
+ XML_ParserFree(parser);
+
+ CharData_CheckXMLChars(&storage,
+ /* clang-format off */
+#if XML_GE == 1
+ XCS("e1=v1\n")
+ XCS("e2=(null)\n")
+ XCS("(r(a1=[v1]))\n")
+ XCS("[v1][][&'><\"]")
+#else
+ XCS("e1=&amp;e1;\n")
+ XCS("e2=(null)\n")
+ XCS("(r(a1=[&e1;]))\n")
+ XCS("[&e1;][&e2;][&'><\"]")
+#endif
+ );
+ /* clang-format on */
+}
+END_TEST
+
+static void XMLCALL
+resumable_stopping_character_handler(void *userData, const XML_Char *s,
+ int len) {
+ UNUSED_P(s);
+ UNUSED_P(len);
+ XML_Parser parser = (XML_Parser)userData;
+ XML_StopParser(parser, XML_TRUE);
+}
+
+// NOTE: This test needs active LeakSanitizer to be of actual use
+START_TEST(test_misc_char_handler_stop_without_leak) {
+ const char *const data
+ = "<!DOCTYPE t1[<!ENTITY e1 'angle<'><!ENTITY e2 '&e1;'>]><t1>&e2;";
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ XML_SetUserData(parser, parser);
+ XML_SetCharacterDataHandler(parser, resumable_stopping_character_handler);
+ _XML_Parse_SINGLE_BYTES(parser, data, (int)strlen(data), XML_FALSE);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+START_TEST(test_misc_resumeparser_not_crashing) {
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_GetBuffer(parser, 1);
+ XML_StopParser(parser, /*resumable=*/XML_TRUE);
+ XML_ResumeParser(parser); // could crash here, previously
+ XML_ParserFree(parser);
+}
+END_TEST
+
+START_TEST(test_misc_stopparser_rejects_unstarted_parser) {
+ const XML_Bool cases[] = {XML_TRUE, XML_FALSE};
+ for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
+ const XML_Bool resumable = cases[i];
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(XML_GetErrorCode(parser) == XML_ERROR_NONE);
+ assert_true(XML_StopParser(parser, resumable) == XML_STATUS_ERROR);
+ assert_true(XML_GetErrorCode(parser) == XML_ERROR_NOT_STARTED);
+ XML_ParserFree(parser);
+ }
+}
+END_TEST
+
+/* Adaptation of accumulate_characters that takes ExtHdlrData input to work with
+ * test_renter_loop_finite_content below */
+void XMLCALL
+accumulate_characters_ext_handler(void *userData, const XML_Char *s, int len) {
+ ExtHdlrData *const test_data = (ExtHdlrData *)userData;
+ CharData_AppendXMLChars(test_data->storage, s, len);
+}
+
+/* Test that internalEntityProcessor does not re-enter forever;
+ * based on files tests/xmlconf/xmltest/valid/ext-sa/012.{xml,ent} */
+START_TEST(test_renter_loop_finite_content) {
+ CharData storage;
+ CharData_Init(&storage);
+ const char *const text = "<!DOCTYPE doc [\n"
+ "<!ENTITY e1 '&e2;'>\n"
+ "<!ENTITY e2 '&e3;'>\n"
+ "<!ENTITY e3 SYSTEM '012.ent'>\n"
+ "<!ENTITY e4 '&e5;'>\n"
+ "<!ENTITY e5 '(e5)'>\n"
+ "<!ELEMENT doc (#PCDATA)>\n"
+ "]>\n"
+ "<doc>&e1;</doc>\n";
+ ExtHdlrData test_data = {"&e4;\n", external_entity_null_loader, &storage};
+ const XML_Char *const expected = XCS("(e5)\n");
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ assert_true(parser != NULL);
+ XML_SetUserData(parser, &test_data);
+ XML_SetExternalEntityRefHandler(parser, external_entity_oneshot_loader);
+ XML_SetCharacterDataHandler(parser, accumulate_characters_ext_handler);
+ if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(parser);
+
+ CharData_CheckXMLChars(&storage, expected);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+// Inspired by function XML_OriginalString of Perl's XML::Parser
+static char *
+dup_original_string(XML_Parser parser) {
+ const int byte_count = XML_GetCurrentByteCount(parser);
+
+ assert_true(byte_count >= 0);
+
+ int offset = -1;
+ int size = -1;
+
+ const char *const context = XML_GetInputContext(parser, &offset, &size);
+
+#if XML_CONTEXT_BYTES > 0
+ assert_true(context != NULL);
+ assert_true(offset >= 0);
+ assert_true(size >= 0);
+ return portable_strndup(context + offset, byte_count);
+#else
+ assert_true(context == NULL);
+ return NULL;
+#endif
+}
+
+static void
+on_characters_issue_980(void *userData, const XML_Char *s, int len) {
+ (void)s;
+ (void)len;
+ XML_Parser parser = (XML_Parser)userData;
+
+ char *const original_string = dup_original_string(parser);
+
+#if XML_CONTEXT_BYTES > 0
+ assert_true(original_string != NULL);
+ assert_true(strcmp(original_string, "&draft.day;") == 0);
+ free(original_string);
+#else
+ assert_true(original_string == NULL);
+#endif
+}
+
+START_TEST(test_misc_expected_event_ptr_issue_980) {
+ // NOTE: This is a tiny subset of sample "REC-xml-19980210.xml"
+ // from Perl's XML::Parser
+ const char *const doc = "<!DOCTYPE day [\n"
+ " <!ENTITY draft.day '10'>\n"
+ "]>\n"
+ "<day>&draft.day;</day>\n";
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_SetUserData(parser, parser);
+ XML_SetCharacterDataHandler(parser, on_characters_issue_980);
+
+ assert_true(_XML_Parse_SINGLE_BYTES(parser, doc, (int)strlen(doc),
+ /*isFinal=*/XML_TRUE)
+ == XML_STATUS_OK);
+
+ XML_ParserFree(parser);
+}
+END_TEST
+
+void
+make_miscellaneous_test_case(Suite *s) {
+ TCase *tc_misc = tcase_create("miscellaneous tests");
+
+ suite_add_tcase(s, tc_misc);
+ tcase_add_checked_fixture(tc_misc, NULL, basic_teardown);
+
+ tcase_add_test(tc_misc, test_misc_alloc_create_parser);
+ tcase_add_test(tc_misc, test_misc_alloc_create_parser_with_encoding);
+ tcase_add_test(tc_misc, test_misc_null_parser);
+ tcase_add_test(tc_misc, test_misc_error_string);
+ tcase_add_test(tc_misc, test_misc_version);
+ tcase_add_test(tc_misc, test_misc_features);
+ tcase_add_test(tc_misc, test_misc_attribute_leak);
+ tcase_add_test(tc_misc, test_misc_utf16le);
+ tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_1);
+ tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_2);
+ tcase_add_test__ifdef_xml_dtd(
+ tc_misc, test_misc_deny_internal_entity_closing_doctype_issue_317);
+ tcase_add_test(tc_misc, test_misc_tag_mismatch_reset_leak);
+ tcase_add_test(tc_misc,
+ test_misc_create_external_entity_parser_with_null_context);
+ tcase_add_test(tc_misc, test_misc_general_entities_support);
+ tcase_add_test(tc_misc, test_misc_char_handler_stop_without_leak);
+ tcase_add_test(tc_misc, test_misc_resumeparser_not_crashing);
+ tcase_add_test(tc_misc, test_misc_stopparser_rejects_unstarted_parser);
+ tcase_add_test__if_xml_ge(tc_misc, test_renter_loop_finite_content);
+ tcase_add_test(tc_misc, test_misc_expected_event_ptr_issue_980);
+}
diff --git a/3rdparty/expat/tests/misc_tests.h b/3rdparty/expat/tests/misc_tests.h
new file mode 100644
index 00000000000..3d9c4b8a406
--- /dev/null
+++ b/3rdparty/expat/tests/misc_tests.h
@@ -0,0 +1,56 @@
+/* Tests in the "miscellaneous" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_MISC_TESTS_H
+# define XML_MISC_TESTS_H
+
+extern void make_miscellaneous_test_case(Suite *s);
+
+#endif /* XML_MISC_TESTS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/misc_tests_cxx.cpp b/3rdparty/expat/tests/misc_tests_cxx.cpp
new file mode 100644
index 00000000000..0b84c1b1f4d
--- /dev/null
+++ b/3rdparty/expat/tests/misc_tests_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "misc_tests.c"
diff --git a/3rdparty/expat/tests/ns_tests.c b/3rdparty/expat/tests/ns_tests.c
new file mode 100644
index 00000000000..411e1d3c974
--- /dev/null
+++ b/3rdparty/expat/tests/ns_tests.c
@@ -0,0 +1,754 @@
+/* Tests in the "namespace" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "expat_config.h"
+
+#include <string.h>
+
+#include "expat.h"
+#include "internal.h"
+#include "minicheck.h"
+#include "common.h"
+#include "dummy.h"
+#include "handlers.h"
+#include "ns_tests.h"
+
+static void
+namespace_setup(void) {
+ g_parser = XML_ParserCreateNS(NULL, XCS(' '));
+ if (g_parser == NULL)
+ fail("Parser not created.");
+}
+
+static void
+namespace_teardown(void) {
+ basic_teardown();
+}
+
+START_TEST(test_return_ns_triplet) {
+ const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
+ " xmlns:bar='http://example.org/'>";
+ const char *epilog = "</foo:e>";
+ const XML_Char *elemstr[]
+ = {XCS("http://example.org/ e foo"), XCS("http://example.org/ a bar")};
+ XML_SetReturnNSTriplet(g_parser, XML_TRUE);
+ XML_SetUserData(g_parser, (void *)elemstr);
+ XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
+ XML_SetNamespaceDeclHandler(g_parser, dummy_start_namespace_decl_handler,
+ dummy_end_namespace_decl_handler);
+ g_triplet_start_flag = XML_FALSE;
+ g_triplet_end_flag = XML_FALSE;
+ init_dummy_handlers();
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ /* Check that unsetting "return triplets" fails while still parsing */
+ XML_SetReturnNSTriplet(g_parser, XML_FALSE);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (! g_triplet_start_flag)
+ fail("triplet_start_checker not invoked");
+ if (! g_triplet_end_flag)
+ fail("triplet_end_checker not invoked");
+ if (get_dummy_handler_flags()
+ != (DUMMY_START_NS_DECL_HANDLER_FLAG | DUMMY_END_NS_DECL_HANDLER_FLAG))
+ fail("Namespace handlers not called");
+}
+END_TEST
+
+/* Test that the parsing status is correctly reset by XML_ParserReset().
+ * We use test_return_ns_triplet() for our example parse to improve
+ * coverage of tidying up code executed.
+ */
+START_TEST(test_ns_parser_reset) {
+ XML_ParsingStatus status;
+
+ XML_GetParsingStatus(g_parser, &status);
+ if (status.parsing != XML_INITIALIZED)
+ fail("parsing status doesn't start INITIALIZED");
+ test_return_ns_triplet();
+ XML_GetParsingStatus(g_parser, &status);
+ if (status.parsing != XML_FINISHED)
+ fail("parsing status doesn't end FINISHED");
+ XML_ParserReset(g_parser, NULL);
+ XML_GetParsingStatus(g_parser, &status);
+ if (status.parsing != XML_INITIALIZED)
+ fail("parsing status doesn't reset to INITIALIZED");
+}
+END_TEST
+
+static void
+run_ns_tagname_overwrite_test(const char *text, const XML_Char *result) {
+ CharData storage;
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetElementHandler(g_parser, overwrite_start_checker,
+ overwrite_end_checker);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, result);
+}
+
+/* Regression test for SF bug #566334. */
+START_TEST(test_ns_tagname_overwrite) {
+ const char *text = "<n:e xmlns:n='http://example.org/'>\n"
+ " <n:f n:attr='foo'/>\n"
+ " <n:g n:attr2='bar'/>\n"
+ "</n:e>";
+ const XML_Char *result = XCS("start http://example.org/ e\n")
+ XCS("start http://example.org/ f\n")
+ XCS("attribute http://example.org/ attr\n")
+ XCS("end http://example.org/ f\n")
+ XCS("start http://example.org/ g\n")
+ XCS("attribute http://example.org/ attr2\n")
+ XCS("end http://example.org/ g\n")
+ XCS("end http://example.org/ e\n");
+ run_ns_tagname_overwrite_test(text, result);
+}
+END_TEST
+
+/* Regression test for SF bug #566334. */
+START_TEST(test_ns_tagname_overwrite_triplet) {
+ const char *text = "<n:e xmlns:n='http://example.org/'>\n"
+ " <n:f n:attr='foo'/>\n"
+ " <n:g n:attr2='bar'/>\n"
+ "</n:e>";
+ const XML_Char *result = XCS("start http://example.org/ e n\n")
+ XCS("start http://example.org/ f n\n")
+ XCS("attribute http://example.org/ attr n\n")
+ XCS("end http://example.org/ f n\n")
+ XCS("start http://example.org/ g n\n")
+ XCS("attribute http://example.org/ attr2 n\n")
+ XCS("end http://example.org/ g n\n")
+ XCS("end http://example.org/ e n\n");
+ XML_SetReturnNSTriplet(g_parser, XML_TRUE);
+ run_ns_tagname_overwrite_test(text, result);
+}
+END_TEST
+
+/* Regression test for SF bug #620343. */
+START_TEST(test_start_ns_clears_start_element) {
+ /* This needs to use separate start/end tags; using the empty tag
+ syntax doesn't cause the problematic path through Expat to be
+ taken.
+ */
+ const char *text = "<e xmlns='http://example.org/'></e>";
+
+ XML_SetStartElementHandler(g_parser, start_element_fail);
+ XML_SetStartNamespaceDeclHandler(g_parser, start_ns_clearing_start_element);
+ XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
+ XML_UseParserAsHandlerArg(g_parser);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test for SF bug #616863. */
+START_TEST(test_default_ns_from_ext_subset_and_ext_ge) {
+ const char *text = "<?xml version='1.0'?>\n"
+ "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
+ " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/ns1'>\n"
+ "&en;\n"
+ "</doc>";
+
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_handler);
+ /* We actually need to set this handler to tickle this bug. */
+ XML_SetStartElementHandler(g_parser, dummy_start_element);
+ XML_SetUserData(g_parser, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test #1 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_1) {
+ const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
+ " <e xmlns:prefix=''/>\n"
+ "</doc>";
+
+ expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
+ "Did not report re-setting namespace"
+ " URI with prefix to ''.");
+}
+END_TEST
+
+/* Regression test #2 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_2) {
+ const char *text = "<?xml version='1.0'?>\n"
+ "<docelem xmlns:pre=''/>";
+
+ expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
+ "Did not report setting namespace URI with prefix to ''.");
+}
+END_TEST
+
+/* Regression test #3 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_3) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ELEMENT doc EMPTY>\n"
+ " <!ATTLIST doc\n"
+ " xmlns:prefix CDATA ''>\n"
+ "]>\n"
+ "<doc/>";
+
+ expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
+ "Didn't report attr default setting NS w/ prefix to ''.");
+}
+END_TEST
+
+/* Regression test #4 for SF bug #673791. */
+START_TEST(test_ns_prefix_with_empty_uri_4) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ELEMENT prefix:doc EMPTY>\n"
+ " <!ATTLIST prefix:doc\n"
+ " xmlns:prefix CDATA 'http://example.org/'>\n"
+ "]>\n"
+ "<prefix:doc/>";
+ /* Packaged info expected by the end element handler;
+ the weird structuring lets us reuse the triplet_end_checker()
+ function also used for another test. */
+ const XML_Char *elemstr[] = {XCS("http://example.org/ doc prefix")};
+ XML_SetReturnNSTriplet(g_parser, XML_TRUE);
+ XML_SetUserData(g_parser, (void *)elemstr);
+ XML_SetEndElementHandler(g_parser, triplet_end_checker);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test with non-xmlns prefix */
+START_TEST(test_ns_unbound_prefix) {
+ const char *text = "<!DOCTYPE doc [\n"
+ " <!ELEMENT prefix:doc EMPTY>\n"
+ " <!ATTLIST prefix:doc\n"
+ " notxmlns:prefix CDATA 'http://example.org/'>\n"
+ "]>\n"
+ "<prefix:doc/>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Unbound prefix incorrectly passed");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_UNBOUND_PREFIX)
+ xml_failure(g_parser);
+}
+END_TEST
+
+START_TEST(test_ns_default_with_empty_uri) {
+ const char *text = "<doc xmlns='http://example.org/'>\n"
+ " <e xmlns=''/>\n"
+ "</doc>";
+ /* Add some handlers to exercise extra code paths */
+ XML_SetStartNamespaceDeclHandler(g_parser,
+ dummy_start_namespace_decl_handler);
+ XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test for SF bug #692964: two prefixes for one namespace. */
+START_TEST(test_ns_duplicate_attrs_diff_prefixes) {
+ const char *text = "<doc xmlns:a='http://example.org/a'\n"
+ " xmlns:b='http://example.org/a'\n"
+ " a:a='v' b:a='v' />";
+ expect_failure(text, XML_ERROR_DUPLICATE_ATTRIBUTE,
+ "did not report multiple attributes with same URI+name");
+}
+END_TEST
+
+START_TEST(test_ns_duplicate_hashes) {
+ /* The hash of an attribute is calculated as the hash of its URI
+ * concatenated with a space followed by its name (after the
+ * colon). We wish to generate attributes with the same hash
+ * value modulo the attribute table size so that we can check that
+ * the attribute hash table works correctly. The attribute hash
+ * table size will be the smallest power of two greater than the
+ * number of attributes, but at least eight. There is
+ * unfortunately no programmatic way of getting the hash or the
+ * table size at user level, but the test code coverage percentage
+ * will drop if the hashes cease to point to the same row.
+ *
+ * The cunning plan is to have few enough attributes to have a
+ * reliable table size of 8, and have the single letter attribute
+ * names be 8 characters apart, producing a hash which will be the
+ * same modulo 8.
+ */
+ const char *text = "<doc xmlns:a='http://example.org/a'\n"
+ " a:a='v' a:i='w' />";
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Regression test for SF bug #695401: unbound prefix. */
+START_TEST(test_ns_unbound_prefix_on_attribute) {
+ const char *text = "<doc a:attr=''/>";
+ expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
+ "did not report unbound prefix on attribute");
+}
+END_TEST
+
+/* Regression test for SF bug #695401: unbound prefix. */
+START_TEST(test_ns_unbound_prefix_on_element) {
+ const char *text = "<a:doc/>";
+ expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
+ "did not report unbound prefix on element");
+}
+END_TEST
+
+/* Test that long element names with namespaces are handled correctly */
+START_TEST(test_ns_long_element) {
+ const char *text
+ = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
+ " xmlns:foo='http://example.org/' bar:a='12'\n"
+ " xmlns:bar='http://example.org/'>"
+ "</foo:thisisalongenoughelementnametotriggerareallocation>";
+ const XML_Char *elemstr[]
+ = {XCS("http://example.org/")
+ XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
+ XCS("http://example.org/ a bar")};
+
+ XML_SetReturnNSTriplet(g_parser, XML_TRUE);
+ XML_SetUserData(g_parser, (void *)elemstr);
+ XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test mixed population of prefixed and unprefixed attributes */
+START_TEST(test_ns_mixed_prefix_atts) {
+ const char *text = "<e a='12' bar:b='13'\n"
+ " xmlns:bar='http://example.org/'>"
+ "</e>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test having a long namespaced element name inside a short one.
+ * This exercises some internal buffer reallocation that is shared
+ * across elements with the same namespace URI.
+ */
+START_TEST(test_ns_extend_uri_buffer) {
+ const char *text = "<foo:e xmlns:foo='http://example.org/'>"
+ " <foo:thisisalongenoughnametotriggerallocationaction"
+ " foo:a='12' />"
+ "</foo:e>";
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test that xmlns is correctly rejected as an attribute in the xmlns
+ * namespace, but not in other namespaces
+ */
+START_TEST(test_ns_reserved_attributes) {
+ const char *text1
+ = "<foo:e xmlns:foo='http://example.org/' xmlns:xmlns='12' />";
+ const char *text2
+ = "<foo:e xmlns:foo='http://example.org/' foo:xmlns='12' />";
+ expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XMLNS,
+ "xmlns not rejected as an attribute");
+ XML_ParserReset(g_parser, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test more reserved attributes */
+START_TEST(test_ns_reserved_attributes_2) {
+ const char *text1 = "<foo:e xmlns:foo='http://example.org/'"
+ " xmlns:xml='http://example.org/' />";
+ const char *text2
+ = "<foo:e xmlns:foo='http://www.w3.org/XML/1998/namespace' />";
+ const char *text3 = "<foo:e xmlns:foo='http://www.w3.org/2000/xmlns/' />";
+
+ expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XML,
+ "xml not rejected as an attribute");
+ XML_ParserReset(g_parser, NULL);
+ expect_failure(text2, XML_ERROR_RESERVED_NAMESPACE_URI,
+ "Use of w3.org URL not faulted");
+ XML_ParserReset(g_parser, NULL);
+ expect_failure(text3, XML_ERROR_RESERVED_NAMESPACE_URI,
+ "Use of w3.org xmlns URL not faulted");
+}
+END_TEST
+
+/* Test string pool handling of namespace names of 2048 characters */
+/* Exercises a particular string pool growth path */
+START_TEST(test_ns_extremely_long_prefix) {
+ /* C99 compilers are only required to support 4095-character
+ * strings, so the following needs to be split in two to be safe
+ * for all compilers.
+ */
+ const char *text1
+ = "<doc "
+ /* 64 character on each line */
+ /* ...gives a total length of 2048 */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ ":a='12'";
+ const char *text2
+ = " xmlns:"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "='foo'\n>"
+ "</doc>";
+
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+}
+END_TEST
+
+/* Test unknown encoding handlers in namespace setup */
+START_TEST(test_ns_unknown_encoding_success) {
+ const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
+ "<foo:e xmlns:foo='http://example.org/'>Hi</foo:e>";
+
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ run_character_check(text, XCS("Hi"));
+}
+END_TEST
+
+/* Test that too many colons are rejected */
+START_TEST(test_ns_double_colon) {
+ const char *text = "<foo:e xmlns:foo='http://example.org/' foo:a:b='bar' />";
+ const enum XML_Status status
+ = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
+#ifdef XML_NS
+ if ((status == XML_STATUS_OK)
+ || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
+ fail("Double colon in attribute name not faulted"
+ " (despite active namespace support)");
+ }
+#else
+ if (status != XML_STATUS_OK) {
+ fail("Double colon in attribute name faulted"
+ " (despite inactive namespace support");
+ }
+#endif
+}
+END_TEST
+
+START_TEST(test_ns_double_colon_element) {
+ const char *text = "<foo:bar:e xmlns:foo='http://example.org/' />";
+ const enum XML_Status status
+ = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
+#ifdef XML_NS
+ if ((status == XML_STATUS_OK)
+ || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
+ fail("Double colon in element name not faulted"
+ " (despite active namespace support)");
+ }
+#else
+ if (status != XML_STATUS_OK) {
+ fail("Double colon in element name faulted"
+ " (despite inactive namespace support");
+ }
+#endif
+}
+END_TEST
+
+/* Test that non-name characters after a colon are rejected */
+START_TEST(test_ns_bad_attr_leafname) {
+ const char *text = "<foo:e xmlns:foo='http://example.org/' foo:?ar='baz' />";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid character in leafname not faulted");
+}
+END_TEST
+
+START_TEST(test_ns_bad_element_leafname) {
+ const char *text = "<foo:?oc xmlns:foo='http://example.org/' />";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid character in element leafname not faulted");
+}
+END_TEST
+
+/* Test high-byte-set UTF-16 characters are valid in a leafname */
+START_TEST(test_ns_utf16_leafname) {
+ const char text[] =
+ /* <n:e xmlns:n='URI' n:{KHO KHWAI}='a' />
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ */
+ "<\0n\0:\0e\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0 \0"
+ "n\0:\0\x04\x0e=\0'\0a\0'\0 \0/\0>\0";
+ const XML_Char *expected = XCS("a");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetStartElementHandler(g_parser, accumulate_attribute);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ns_utf16_element_leafname) {
+ const char text[] =
+ /* <n:{KHO KHWAI} xmlns:n='URI'/>
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ */
+ "\0<\0n\0:\x0e\x04\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0/\0>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("URI \x0e04");
+#else
+ const XML_Char *expected = XCS("URI \xe0\xb8\x84");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetStartElementHandler(g_parser, start_element_event_handler);
+ XML_SetUserData(g_parser, &storage);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ns_utf16_doctype) {
+ const char text[] =
+ /* <!DOCTYPE foo:{KHO KHWAI} [ <!ENTITY bar 'baz'> ]>\n
+ * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
+ */
+ "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0f\0o\0o\0:\x0e\x04\0 "
+ "\0[\0 \0<\0!\0E\0N\0T\0I\0T\0Y\0 \0b\0a\0r\0 \0'\0b\0a\0z\0'\0>\0 "
+ "\0]\0>\0\n"
+ /* <foo:{KHO KHWAI} xmlns:foo='URI'>&bar;</foo:{KHO KHWAI}> */
+ "\0<\0f\0o\0o\0:\x0e\x04\0 "
+ "\0x\0m\0l\0n\0s\0:\0f\0o\0o\0=\0'\0U\0R\0I\0'\0>"
+ "\0&\0b\0a\0r\0;"
+ "\0<\0/\0f\0o\0o\0:\x0e\x04\0>";
+#ifdef XML_UNICODE
+ const XML_Char *expected = XCS("URI \x0e04");
+#else
+ const XML_Char *expected = XCS("URI \xe0\xb8\x84");
+#endif
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetUserData(g_parser, &storage);
+ XML_SetStartElementHandler(g_parser, start_element_event_handler);
+ XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
+START_TEST(test_ns_invalid_doctype) {
+ const char *text = "<!DOCTYPE foo:!bad [ <!ENTITY bar 'baz' ]>\n"
+ "<foo:!bad>&bar;</foo:!bad>";
+
+ expect_failure(text, XML_ERROR_INVALID_TOKEN,
+ "Invalid character in document local name not faulted");
+}
+END_TEST
+
+START_TEST(test_ns_double_colon_doctype) {
+ const char *text = "<!DOCTYPE foo:a:doc [ <!ENTITY bar 'baz' ]>\n"
+ "<foo:a:doc>&bar;</foo:a:doc>";
+
+ expect_failure(text, XML_ERROR_SYNTAX,
+ "Double colon in document name not faulted");
+}
+END_TEST
+
+START_TEST(test_ns_separator_in_uri) {
+ struct test_case {
+ enum XML_Status expectedStatus;
+ const char *doc;
+ XML_Char namesep;
+ };
+ struct test_case cases[] = {
+ {XML_STATUS_OK, "<doc xmlns='one_two' />", XCS('\n')},
+ {XML_STATUS_ERROR, "<doc xmlns='one&#x0A;two' />", XCS('\n')},
+ {XML_STATUS_OK, "<doc xmlns='one:two' />", XCS(':')},
+ };
+
+ size_t i = 0;
+ size_t failCount = 0;
+ for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
+ set_subtest("%s", cases[i].doc);
+ XML_Parser parser = XML_ParserCreateNS(NULL, cases[i].namesep);
+ XML_SetElementHandler(parser, dummy_start_element, dummy_end_element);
+ if (_XML_Parse_SINGLE_BYTES(parser, cases[i].doc, (int)strlen(cases[i].doc),
+ /*isFinal*/ XML_TRUE)
+ != cases[i].expectedStatus) {
+ failCount++;
+ }
+ XML_ParserFree(parser);
+ }
+
+ if (failCount) {
+ fail("Namespace separator handling is broken");
+ }
+}
+END_TEST
+
+void
+make_namespace_test_case(Suite *s) {
+ TCase *tc_namespace = tcase_create("XML namespaces");
+
+ suite_add_tcase(s, tc_namespace);
+ tcase_add_checked_fixture(tc_namespace, namespace_setup, namespace_teardown);
+ tcase_add_test(tc_namespace, test_return_ns_triplet);
+ tcase_add_test(tc_namespace, test_ns_parser_reset);
+ tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
+ tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
+ tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
+ tcase_add_test__ifdef_xml_dtd(tc_namespace,
+ test_default_ns_from_ext_subset_and_ext_ge);
+ tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
+ tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
+ tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
+ tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
+ tcase_add_test(tc_namespace, test_ns_unbound_prefix);
+ tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
+ tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
+ tcase_add_test(tc_namespace, test_ns_duplicate_hashes);
+ tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
+ tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
+ tcase_add_test(tc_namespace, test_ns_long_element);
+ tcase_add_test(tc_namespace, test_ns_mixed_prefix_atts);
+ tcase_add_test(tc_namespace, test_ns_extend_uri_buffer);
+ tcase_add_test(tc_namespace, test_ns_reserved_attributes);
+ tcase_add_test(tc_namespace, test_ns_reserved_attributes_2);
+ tcase_add_test(tc_namespace, test_ns_extremely_long_prefix);
+ tcase_add_test(tc_namespace, test_ns_unknown_encoding_success);
+ tcase_add_test(tc_namespace, test_ns_double_colon);
+ tcase_add_test(tc_namespace, test_ns_double_colon_element);
+ tcase_add_test(tc_namespace, test_ns_bad_attr_leafname);
+ tcase_add_test(tc_namespace, test_ns_bad_element_leafname);
+ tcase_add_test(tc_namespace, test_ns_utf16_leafname);
+ tcase_add_test(tc_namespace, test_ns_utf16_element_leafname);
+ tcase_add_test__if_xml_ge(tc_namespace, test_ns_utf16_doctype);
+ tcase_add_test(tc_namespace, test_ns_invalid_doctype);
+ tcase_add_test(tc_namespace, test_ns_double_colon_doctype);
+ tcase_add_test(tc_namespace, test_ns_separator_in_uri);
+}
diff --git a/3rdparty/expat/tests/ns_tests.h b/3rdparty/expat/tests/ns_tests.h
new file mode 100644
index 00000000000..acb0db786a4
--- /dev/null
+++ b/3rdparty/expat/tests/ns_tests.h
@@ -0,0 +1,56 @@
+/* Tests in the "namespace" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_NS_TESTS_H
+# define XML_NS_TESTS_H
+
+extern void make_namespace_test_case(Suite *s);
+
+#endif /* XML_NS_TESTS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/ns_tests_cxx.cpp b/3rdparty/expat/tests/ns_tests_cxx.cpp
new file mode 100644
index 00000000000..b2fe187bb8b
--- /dev/null
+++ b/3rdparty/expat/tests/ns_tests_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "ns_tests.c"
diff --git a/3rdparty/expat/tests/nsalloc_tests.c b/3rdparty/expat/tests/nsalloc_tests.c
new file mode 100644
index 00000000000..ec88586af1d
--- /dev/null
+++ b/3rdparty/expat/tests/nsalloc_tests.c
@@ -0,0 +1,1537 @@
+/* Tests in the "namespace allocation" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
+#endif
+
+#include <string.h>
+#include <assert.h>
+
+#include "expat.h"
+#include "common.h"
+#include "minicheck.h"
+#include "dummy.h"
+#include "handlers.h"
+#include "nsalloc_tests.h"
+
+static void
+nsalloc_setup(void) {
+ XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
+ XML_Char ns_sep[2] = {' ', '\0'};
+
+ /* Ensure the parser creation will go through */
+ g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+ g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
+ g_parser = XML_ParserCreate_MM(NULL, &memsuite, ns_sep);
+ if (g_parser == NULL)
+ fail("Parser not created");
+}
+
+static void
+nsalloc_teardown(void) {
+ basic_teardown();
+}
+
+/* Test the effects of allocation failure in simple namespace parsing.
+ * Based on test_ns_default_with_empty_uri()
+ */
+START_TEST(test_nsalloc_xmlns) {
+ const char *text = "<doc xmlns='http://example.org/'>\n"
+ " <e xmlns=''/>\n"
+ "</doc>";
+ unsigned int i;
+ const unsigned int max_alloc_count = 30;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ /* Exercise more code paths with a default handler */
+ XML_SetDefaultHandler(g_parser, dummy_default_handler);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* Resetting the parser is insufficient, because some memory
+ * allocations are cached within the parser. Instead we use
+ * the teardown and setup routines to ensure that we have the
+ * right sort of parser back in our hands.
+ */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at maximum allocation count");
+}
+END_TEST
+
+/* Test XML_ParseBuffer interface with namespace and a dicky allocator */
+START_TEST(test_nsalloc_parse_buffer) {
+ const char *text = "<doc>Hello</doc>";
+ void *buffer;
+
+ /* Try a parse before the start of the world */
+ /* (Exercises new code path) */
+ if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
+ fail("Pre-init XML_ParseBuffer not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_BUFFER)
+ fail("Pre-init XML_ParseBuffer faulted for wrong reason");
+
+ buffer = XML_GetBuffer(g_parser, 1 /* any small number greater than 0 */);
+ if (buffer == NULL)
+ fail("Could not acquire parse buffer");
+
+ g_allocation_count = 0;
+ if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
+ fail("Pre-init XML_ParseBuffer not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_MEMORY)
+ fail("Pre-init XML_ParseBuffer faulted for wrong reason");
+
+ /* Now with actual memory allocation */
+ g_allocation_count = ALLOC_ALWAYS_SUCCEED;
+ if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_OK)
+ xml_failure(g_parser);
+
+ /* Check that resuming an unsuspended parser is faulted */
+ if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
+ fail("Resuming unsuspended parser not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NOT_SUSPENDED)
+ xml_failure(g_parser);
+
+ /* Get the parser into suspended state */
+ XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
+ g_resumable = XML_TRUE;
+ buffer = XML_GetBuffer(g_parser, (int)strlen(text));
+ if (buffer == NULL)
+ fail("Could not acquire parse buffer");
+ assert(buffer != NULL);
+ memcpy(buffer, text, strlen(text));
+ if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
+ xml_failure(g_parser);
+ if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Suspended XML_ParseBuffer not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
+ xml_failure(g_parser);
+ if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
+ fail("Suspended XML_GetBuffer not faulted");
+
+ /* Get it going again and complete the world */
+ XML_SetCharacterDataHandler(g_parser, NULL);
+ if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
+ xml_failure(g_parser);
+ if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ fail("Post-finishing XML_ParseBuffer not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
+ xml_failure(g_parser);
+ if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
+ fail("Post-finishing XML_GetBuffer not faulted");
+}
+END_TEST
+
+/* Check handling of long prefix names (pool growth) */
+START_TEST(test_nsalloc_long_prefix) {
+ const char *text
+ = "<"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":foo xmlns:"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "='http://example.org/'>"
+ "</"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":foo>";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* Check handling of long uri names (pool growth) */
+START_TEST(test_nsalloc_long_uri) {
+ const char *text
+ = "<foo:e xmlns:foo='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "' bar:a='12'\n"
+ "xmlns:bar='http://example.org/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
+ "'>"
+ "</foo:e>";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* Test handling of long attribute names with prefixes */
+START_TEST(test_nsalloc_long_attr) {
+ const char *text
+ = "<foo:e xmlns:foo='http://example.org/' bar:"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "='12'\n"
+ "xmlns:bar='http://example.org/'>"
+ "</foo:e>";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* Test handling of an attribute name with a long namespace prefix */
+START_TEST(test_nsalloc_long_attr_prefix) {
+ const char *text
+ = "<foo:e xmlns:foo='http://example.org/' "
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":a='12'\n"
+ "xmlns:"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "='http://example.org/'>"
+ "</foo:e>";
+ const XML_Char *elemstr[] = {
+ /* clang-format off */
+ XCS("http://example.org/ e foo"),
+ XCS("http://example.org/ a ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
+ /* clang-format on */
+ };
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetReturnNSTriplet(g_parser, XML_TRUE);
+ XML_SetUserData(g_parser, (void *)elemstr);
+ XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* Test attribute handling in the face of a dodgy reallocator */
+START_TEST(test_nsalloc_realloc_attributes) {
+ const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
+ " xmlns:bar='http://example.org/'>"
+ "</foo:e>";
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_realloc_count)
+ fail("Parsing failed at max reallocation count");
+}
+END_TEST
+
+/* Test long element names with namespaces under a failing allocator */
+START_TEST(test_nsalloc_long_element) {
+ const char *text
+ = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
+ " xmlns:foo='http://example.org/' bar:a='12'\n"
+ " xmlns:bar='http://example.org/'>"
+ "</foo:thisisalongenoughelementnametotriggerareallocation>";
+ const XML_Char *elemstr[]
+ = {XCS("http://example.org/")
+ XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
+ XCS("http://example.org/ a bar")};
+ int i;
+ const int max_alloc_count = 30;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetReturnNSTriplet(g_parser, XML_TRUE);
+ XML_SetUserData(g_parser, (void *)elemstr);
+ XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed at max reallocation count");
+}
+END_TEST
+
+/* Test the effects of reallocation failure when reassigning a
+ * binding.
+ *
+ * XML_ParserReset does not free the BINDING structures used by a
+ * parser, but instead adds them to an internal free list to be reused
+ * as necessary. Likewise the URI buffers allocated for the binding
+ * aren't freed, but kept attached to their existing binding. If the
+ * new binding has a longer URI, it will need reallocation. This test
+ * provokes that reallocation, and tests the control path if it fails.
+ */
+START_TEST(test_nsalloc_realloc_binding_uri) {
+ const char *first = "<doc xmlns='http://example.org/'>\n"
+ " <e xmlns='' />\n"
+ "</doc>";
+ const char *second
+ = "<doc xmlns='http://example.org/long/enough/URI/to/reallocate/'>\n"
+ " <e xmlns='' />\n"
+ "</doc>";
+ unsigned i;
+ const unsigned max_realloc_count = 10;
+
+ /* First, do a full parse that will leave bindings around */
+ if (_XML_Parse_SINGLE_BYTES(g_parser, first, (int)strlen(first), XML_TRUE)
+ == XML_STATUS_ERROR)
+ xml_failure(g_parser);
+
+ /* Now repeat with a longer URI and a duff reallocator */
+ for (i = 0; i < max_realloc_count; i++) {
+ XML_ParserReset(g_parser, NULL);
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, second, (int)strlen(second), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocation");
+ else if (i == max_realloc_count)
+ fail("Parsing failed at max reallocation count");
+}
+END_TEST
+
+/* Check handling of long prefix names (pool growth) */
+START_TEST(test_nsalloc_realloc_long_prefix) {
+ const char *text
+ = "<"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":foo xmlns:"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "='http://example.org/'>"
+ "</"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":foo>";
+ int i;
+ const int max_realloc_count = 12;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_realloc_count)
+ fail("Parsing failed even at max reallocation count");
+}
+END_TEST
+
+/* Check handling of even long prefix names (different code path) */
+START_TEST(test_nsalloc_realloc_longer_prefix) {
+ const char *text
+ = "<"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "Q:foo xmlns:"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "Q='http://example.org/'>"
+ "</"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "Q:foo>";
+ int i;
+ const int max_realloc_count = 12;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_realloc_count)
+ fail("Parsing failed even at max reallocation count");
+}
+END_TEST
+
+START_TEST(test_nsalloc_long_namespace) {
+ const char *text1
+ = "<"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":e xmlns:"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "='http://example.org/'>\n";
+ const char *text2
+ = "<"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":f "
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":attr='foo'/>\n"
+ "</"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ ":e>";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
+ != XML_STATUS_ERROR
+ && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
+ XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* Using a slightly shorter namespace name provokes allocations in
+ * slightly different places in the code.
+ */
+START_TEST(test_nsalloc_less_long_namespace) {
+ const char *text
+ = "<"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
+ ":e xmlns:"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
+ "='http://example.org/'>\n"
+ "<"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
+ ":f "
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
+ ":att='foo'/>\n"
+ "</"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
+ ":e>";
+ int i;
+ const int max_alloc_count = 40;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+START_TEST(test_nsalloc_long_context) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ATTLIST doc baz ID #REQUIRED>\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
+ "' baz='2'>\n"
+ "&en;"
+ "</doc>";
+ ExtOption options[] = {
+ {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
+ int i;
+ const int max_alloc_count = 70;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* This function is void; it will throw a fail() on error, so if it
+ * returns normally it must have succeeded.
+ */
+static void
+context_realloc_test(const char *text) {
+ ExtOption options[] = {
+ {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
+ int i;
+ const int max_realloc_count = 6;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_realloc_count)
+ fail("Parsing failed even at max reallocation count");
+}
+
+START_TEST(test_nsalloc_realloc_long_context) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_context_2) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJK"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_context_3) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGH"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_context_4) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_context_5) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABC"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_context_6) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_context_7) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLM"
+ "'>\n"
+ "&en;"
+ "</doc>";
+
+ context_realloc_test(text);
+}
+END_TEST
+
+START_TEST(test_nsalloc_realloc_long_ge_name) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY "
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ " SYSTEM 'bar'>\n"
+ "]>\n"
+ "<doc xmlns='http://example.org/baz'>\n"
+ "&"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ ";"
+ "</doc>";
+ ExtOption options[] = {
+ {XCS("foo"), "<!ELEMENT el EMPTY>"}, {XCS("bar"), "<el/>"}, {NULL, NULL}};
+ int i;
+ const int max_realloc_count = 10;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_realloc_count)
+ fail("Parsing failed even at max reallocation count");
+}
+END_TEST
+
+/* Test that when a namespace is passed through the context mechanism
+ * to an external entity parser, the parsers handle reallocation
+ * failures correctly. The prefix is exactly the right length to
+ * provoke particular uncommon code paths.
+ */
+START_TEST(test_nsalloc_realloc_long_context_in_dtd) {
+ const char *text1
+ = "<!DOCTYPE "
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ ":doc [\n"
+ " <!ENTITY First SYSTEM 'foo/First'>\n"
+ "]>\n"
+ "<"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ ":doc xmlns:"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "='foo/Second'>&First;";
+ const char *text2
+ = "</"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ ":doc>";
+ ExtOption options[] = {{XCS("foo/First"), "Hello world"}, {NULL, NULL}};
+ int i;
+ const int max_realloc_count = 20;
+
+ for (i = 0; i < max_realloc_count; i++) {
+ g_reallocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
+ != XML_STATUS_ERROR
+ && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
+ XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing reallocations");
+ else if (i == max_realloc_count)
+ fail("Parsing failed even at max reallocation count");
+}
+END_TEST
+
+START_TEST(test_nsalloc_long_default_in_ext) {
+ const char *text
+ = "<!DOCTYPE doc [\n"
+ " <!ATTLIST e a1 CDATA '"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
+ "'>\n"
+ " <!ENTITY x SYSTEM 'foo'>\n"
+ "]>\n"
+ "<doc>&x;</doc>";
+ ExtOption options[] = {{XCS("foo"), "<e/>"}, {NULL, NULL}};
+ int i;
+ const int max_alloc_count = 50;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+START_TEST(test_nsalloc_long_systemid_in_ext) {
+ const char *text
+ = "<!DOCTYPE doc SYSTEM 'foo' [\n"
+ " <!ENTITY en SYSTEM '"
+ /* 64 characters per line */
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
+ "'>\n"
+ "]>\n"
+ "<doc>&en;</doc>";
+ ExtOption options[] = {
+ {XCS("foo"), "<!ELEMENT e EMPTY>"},
+ {/* clang-format off */
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
+ XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"),
+ /* clang-format on */
+ "<e/>"},
+ {NULL, NULL}};
+ int i;
+ const int max_alloc_count = 55;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Parsing worked despite failing allocations");
+ else if (i == max_alloc_count)
+ fail("Parsing failed even at max allocation count");
+}
+END_TEST
+
+/* Test the effects of allocation failure on parsing an element in a
+ * namespace. Based on test_nsalloc_long_context.
+ */
+START_TEST(test_nsalloc_prefixed_element) {
+ const char *text = "<!DOCTYPE pfx:element SYSTEM 'foo' [\n"
+ " <!ATTLIST pfx:element baz ID #REQUIRED>\n"
+ " <!ENTITY en SYSTEM 'bar'>\n"
+ "]>\n"
+ "<pfx:element xmlns:pfx='http://example.org/' baz='2'>\n"
+ "&en;"
+ "</pfx:element>";
+ ExtOption options[] = {
+ {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
+ int i;
+ const int max_alloc_count = 70;
+
+ for (i = 0; i < max_alloc_count; i++) {
+ g_allocation_count = i;
+ XML_SetUserData(g_parser, options);
+ XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
+ XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
+ if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_ERROR)
+ break;
+
+ /* See comment in test_nsalloc_xmlns() */
+ nsalloc_teardown();
+ nsalloc_setup();
+ }
+ if (i == 0)
+ fail("Success despite failing allocator");
+ else if (i == max_alloc_count)
+ fail("Failed even at full allocation count");
+}
+END_TEST
+
+void
+make_nsalloc_test_case(Suite *s) {
+ TCase *tc_nsalloc = tcase_create("namespace allocation tests");
+
+ suite_add_tcase(s, tc_nsalloc);
+ tcase_add_checked_fixture(tc_nsalloc, nsalloc_setup, nsalloc_teardown);
+
+ tcase_add_test(tc_nsalloc, test_nsalloc_xmlns);
+ tcase_add_test(tc_nsalloc, test_nsalloc_parse_buffer);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_prefix);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_uri);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_attr);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_attr_prefix);
+ tcase_add_test(tc_nsalloc, test_nsalloc_realloc_attributes);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_element);
+ tcase_add_test(tc_nsalloc, test_nsalloc_realloc_binding_uri);
+ tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_prefix);
+ tcase_add_test(tc_nsalloc, test_nsalloc_realloc_longer_prefix);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_namespace);
+ tcase_add_test(tc_nsalloc, test_nsalloc_less_long_namespace);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_context);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_2);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_3);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_4);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_5);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_6);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_7);
+ tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_ge_name);
+ tcase_add_test__if_xml_ge(tc_nsalloc,
+ test_nsalloc_realloc_long_context_in_dtd);
+ tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_long_default_in_ext);
+ tcase_add_test(tc_nsalloc, test_nsalloc_long_systemid_in_ext);
+ tcase_add_test(tc_nsalloc, test_nsalloc_prefixed_element);
+}
diff --git a/3rdparty/expat/tests/nsalloc_tests.h b/3rdparty/expat/tests/nsalloc_tests.h
new file mode 100644
index 00000000000..026a2a21a95
--- /dev/null
+++ b/3rdparty/expat/tests/nsalloc_tests.h
@@ -0,0 +1,56 @@
+/* Tests in the "namespace allocation" test case for the Expat test suite
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef XML_NSALLOC_TESTS_H
+# define XML_NSALLOC_TESTS_H
+
+extern void make_nsalloc_test_case(Suite *s);
+
+#endif /* XML_NSALLOC_TESTS_H */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/3rdparty/expat/tests/nsalloc_tests_cxx.cpp b/3rdparty/expat/tests/nsalloc_tests_cxx.cpp
new file mode 100644
index 00000000000..9ba75d1c536
--- /dev/null
+++ b/3rdparty/expat/tests/nsalloc_tests_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "nsalloc_tests.c"
diff --git a/3rdparty/expat/tests/runtests.c b/3rdparty/expat/tests/runtests.c
index 2490d86b9ab..ecb1c36be58 100644
--- a/3rdparty/expat/tests/runtests.c
+++ b/3rdparty/expat/tests/runtests.c
@@ -6,8 +6,20 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
+ Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,11578 +42,37 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#if defined(NDEBUG)
-# undef NDEBUG /* because test suite relies on assert(...) at the moment */
-#endif
-
-#ifdef HAVE_EXPAT_CONFIG_H
-# include <expat_config.h>
-#endif
+#include "expat_config.h"
-#include <assert.h>
-#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <stddef.h> /* ptrdiff_t */
-#include <ctype.h>
-#include <limits.h>
-
-#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
-/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
-# if defined(_WIN64)
-typedef __int64 intptr_t;
-# else
-typedef __int32 intptr_t;
-# endif
-typedef unsigned __int64 uint64_t;
-#else
-# include <stdint.h> /* intptr_t uint64_t */
-#endif
-
-#if ! defined(__cplusplus)
-# if defined(_MSC_VER) && (_MSC_VER <= 1700)
-/* for vs2012/11.0/1700 and earlier Visual Studio compilers */
-# define bool int
-# define false 0
-# define true 1
-# else
-# include <stdbool.h>
-# endif
-#endif
#include "expat.h"
-#include "chardata.h"
-#include "structdata.h"
-#include "internal.h" /* for UNUSED_P only */
+#include "internal.h"
#include "minicheck.h"
-#include "memcheck.h"
-#include "siphash.h"
-#include "ascii.h" /* for ASCII_xxx */
-
-#ifdef XML_LARGE_SIZE
-# define XML_FMT_INT_MOD "ll"
-#else
-# define XML_FMT_INT_MOD "l"
-#endif
-
-#ifdef XML_UNICODE_WCHAR_T
-# define XML_FMT_CHAR "lc"
-# define XML_FMT_STR "ls"
-# include <wchar.h>
-# define xcstrlen(s) wcslen(s)
-# define xcstrcmp(s, t) wcscmp((s), (t))
-# define xcstrncmp(s, t, n) wcsncmp((s), (t), (n))
-# define XCS(s) _XCS(s)
-# define _XCS(s) L##s
-#else
-# ifdef XML_UNICODE
-# error "No support for UTF-16 character without wchar_t in tests"
-# else
-# define XML_FMT_CHAR "c"
-# define XML_FMT_STR "s"
-# define xcstrlen(s) strlen(s)
-# define xcstrcmp(s, t) strcmp((s), (t))
-# define xcstrncmp(s, t, n) strncmp((s), (t), (n))
-# define XCS(s) s
-# endif /* XML_UNICODE */
-#endif /* XML_UNICODE_WCHAR_T */
-
-static XML_Parser g_parser = NULL;
-
-static void
-tcase_add_test__ifdef_xml_dtd(TCase *tc, tcase_test_function test) {
-#ifdef XML_DTD
- tcase_add_test(tc, test);
-#else
- UNUSED_P(tc);
- UNUSED_P(test);
-#endif
-}
-
-static void
-basic_setup(void) {
- g_parser = XML_ParserCreate(NULL);
- if (g_parser == NULL)
- fail("Parser not created.");
-}
-
-static void
-basic_teardown(void) {
- if (g_parser != NULL) {
- XML_ParserFree(g_parser);
- g_parser = NULL;
- }
-}
-
-/* Generate a failure using the parser state to create an error message;
- this should be used when the parser reports an error we weren't
- expecting.
-*/
-static void
-_xml_failure(XML_Parser parser, const char *file, int line) {
- char buffer[1024];
- enum XML_Error err = XML_GetErrorCode(parser);
- sprintf(buffer,
- " %d: %" XML_FMT_STR " (line %" XML_FMT_INT_MOD
- "u, offset %" XML_FMT_INT_MOD "u)\n reported from %s, line %d\n",
- err, XML_ErrorString(err), XML_GetCurrentLineNumber(parser),
- XML_GetCurrentColumnNumber(parser), file, line);
- _fail_unless(0, file, line, buffer);
-}
-
-static enum XML_Status
-_XML_Parse_SINGLE_BYTES(XML_Parser parser, const char *s, int len,
- int isFinal) {
- enum XML_Status res = XML_STATUS_ERROR;
- int offset = 0;
-
- if (len == 0) {
- return XML_Parse(parser, s, len, isFinal);
- }
-
- for (; offset < len; offset++) {
- const int innerIsFinal = (offset == len - 1) && isFinal;
- const char c = s[offset]; /* to help out-of-bounds detection */
- res = XML_Parse(parser, &c, sizeof(char), innerIsFinal);
- if (res != XML_STATUS_OK) {
- return res;
- }
- }
- return res;
-}
-
-#define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)
-
-static void
-_expect_failure(const char *text, enum XML_Error errorCode,
- const char *errorMessage, const char *file, int lineno) {
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- /* Hackish use of _fail_unless() macro, but let's us report
- the right filename and line number. */
- _fail_unless(0, file, lineno, errorMessage);
- if (XML_GetErrorCode(g_parser) != errorCode)
- _xml_failure(g_parser, file, lineno);
-}
-
-#define expect_failure(text, errorCode, errorMessage) \
- _expect_failure((text), (errorCode), (errorMessage), __FILE__, __LINE__)
-
-/* Dummy handlers for when we need to set a handler to tickle a bug,
- but it doesn't need to do anything.
-*/
-static unsigned long dummy_handler_flags = 0;
-
-#define DUMMY_START_DOCTYPE_HANDLER_FLAG (1UL << 0)
-#define DUMMY_END_DOCTYPE_HANDLER_FLAG (1UL << 1)
-#define DUMMY_ENTITY_DECL_HANDLER_FLAG (1UL << 2)
-#define DUMMY_NOTATION_DECL_HANDLER_FLAG (1UL << 3)
-#define DUMMY_ELEMENT_DECL_HANDLER_FLAG (1UL << 4)
-#define DUMMY_ATTLIST_DECL_HANDLER_FLAG (1UL << 5)
-#define DUMMY_COMMENT_HANDLER_FLAG (1UL << 6)
-#define DUMMY_PI_HANDLER_FLAG (1UL << 7)
-#define DUMMY_START_ELEMENT_HANDLER_FLAG (1UL << 8)
-#define DUMMY_START_CDATA_HANDLER_FLAG (1UL << 9)
-#define DUMMY_END_CDATA_HANDLER_FLAG (1UL << 10)
-#define DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG (1UL << 11)
-#define DUMMY_START_NS_DECL_HANDLER_FLAG (1UL << 12)
-#define DUMMY_END_NS_DECL_HANDLER_FLAG (1UL << 13)
-#define DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG (1UL << 14)
-#define DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG (1UL << 15)
-#define DUMMY_SKIP_HANDLER_FLAG (1UL << 16)
-#define DUMMY_DEFAULT_HANDLER_FLAG (1UL << 17)
-
-static void XMLCALL
-dummy_xdecl_handler(void *userData, const XML_Char *version,
- const XML_Char *encoding, int standalone) {
- UNUSED_P(userData);
- UNUSED_P(version);
- UNUSED_P(encoding);
- UNUSED_P(standalone);
-}
-
-static void XMLCALL
-dummy_start_doctype_handler(void *userData, const XML_Char *doctypeName,
- const XML_Char *sysid, const XML_Char *pubid,
- int has_internal_subset) {
- UNUSED_P(userData);
- UNUSED_P(doctypeName);
- UNUSED_P(sysid);
- UNUSED_P(pubid);
- UNUSED_P(has_internal_subset);
- dummy_handler_flags |= DUMMY_START_DOCTYPE_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_end_doctype_handler(void *userData) {
- UNUSED_P(userData);
- dummy_handler_flags |= DUMMY_END_DOCTYPE_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_entity_decl_handler(void *userData, const XML_Char *entityName,
- int is_parameter_entity, const XML_Char *value,
- int value_length, const XML_Char *base,
- const XML_Char *systemId, const XML_Char *publicId,
- const XML_Char *notationName) {
- UNUSED_P(userData);
- UNUSED_P(entityName);
- UNUSED_P(is_parameter_entity);
- UNUSED_P(value);
- UNUSED_P(value_length);
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- UNUSED_P(notationName);
- dummy_handler_flags |= DUMMY_ENTITY_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_notation_decl_handler(void *userData, const XML_Char *notationName,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- UNUSED_P(userData);
- UNUSED_P(notationName);
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- dummy_handler_flags |= DUMMY_NOTATION_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_element_decl_handler(void *userData, const XML_Char *name,
- XML_Content *model) {
- UNUSED_P(userData);
- UNUSED_P(name);
- /* The content model must be freed by the handler. Unfortunately
- * we cannot pass the parser as the userData because this is used
- * with other handlers that require other userData.
- */
- XML_FreeContentModel(g_parser, model);
- dummy_handler_flags |= DUMMY_ELEMENT_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_attlist_decl_handler(void *userData, const XML_Char *elname,
- const XML_Char *attname, const XML_Char *att_type,
- const XML_Char *dflt, int isrequired) {
- UNUSED_P(userData);
- UNUSED_P(elname);
- UNUSED_P(attname);
- UNUSED_P(att_type);
- UNUSED_P(dflt);
- UNUSED_P(isrequired);
- dummy_handler_flags |= DUMMY_ATTLIST_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_comment_handler(void *userData, const XML_Char *data) {
- UNUSED_P(userData);
- UNUSED_P(data);
- dummy_handler_flags |= DUMMY_COMMENT_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data) {
- UNUSED_P(userData);
- UNUSED_P(target);
- UNUSED_P(data);
- dummy_handler_flags |= DUMMY_PI_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_start_element(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- UNUSED_P(userData);
- UNUSED_P(name);
- UNUSED_P(atts);
- dummy_handler_flags |= DUMMY_START_ELEMENT_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_end_element(void *userData, const XML_Char *name) {
- UNUSED_P(userData);
- UNUSED_P(name);
-}
-
-static void XMLCALL
-dummy_start_cdata_handler(void *userData) {
- UNUSED_P(userData);
- dummy_handler_flags |= DUMMY_START_CDATA_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_end_cdata_handler(void *userData) {
- UNUSED_P(userData);
- dummy_handler_flags |= DUMMY_END_CDATA_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_cdata_handler(void *userData, const XML_Char *s, int len) {
- UNUSED_P(userData);
- UNUSED_P(s);
- UNUSED_P(len);
-}
-
-static void XMLCALL
-dummy_start_namespace_decl_handler(void *userData, const XML_Char *prefix,
- const XML_Char *uri) {
- UNUSED_P(userData);
- UNUSED_P(prefix);
- UNUSED_P(uri);
- dummy_handler_flags |= DUMMY_START_NS_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_end_namespace_decl_handler(void *userData, const XML_Char *prefix) {
- UNUSED_P(userData);
- UNUSED_P(prefix);
- dummy_handler_flags |= DUMMY_END_NS_DECL_HANDLER_FLAG;
-}
-
-/* This handler is obsolete, but while the code exists we should
- * ensure that dealing with the handler is covered by tests.
- */
-static void XMLCALL
-dummy_unparsed_entity_decl_handler(void *userData, const XML_Char *entityName,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId,
- const XML_Char *notationName) {
- UNUSED_P(userData);
- UNUSED_P(entityName);
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- UNUSED_P(notationName);
- dummy_handler_flags |= DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_default_handler(void *userData, const XML_Char *s, int len) {
- UNUSED_P(userData);
- UNUSED_P(s);
- UNUSED_P(len);
-}
-
-static void XMLCALL
-dummy_start_doctype_decl_handler(void *userData, const XML_Char *doctypeName,
- const XML_Char *sysid, const XML_Char *pubid,
- int has_internal_subset) {
- UNUSED_P(userData);
- UNUSED_P(doctypeName);
- UNUSED_P(sysid);
- UNUSED_P(pubid);
- UNUSED_P(has_internal_subset);
- dummy_handler_flags |= DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_end_doctype_decl_handler(void *userData) {
- UNUSED_P(userData);
- dummy_handler_flags |= DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG;
-}
-
-static void XMLCALL
-dummy_skip_handler(void *userData, const XML_Char *entityName,
- int is_parameter_entity) {
- UNUSED_P(userData);
- UNUSED_P(entityName);
- UNUSED_P(is_parameter_entity);
- dummy_handler_flags |= DUMMY_SKIP_HANDLER_FLAG;
-}
-
-/* Useful external entity handler */
-typedef struct ExtOption {
- const XML_Char *system_id;
- const char *parse_text;
-} ExtOption;
-
-static int XMLCALL
-external_entity_optioner(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- ExtOption *options = (ExtOption *)XML_GetUserData(parser);
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(publicId);
- while (options->parse_text != NULL) {
- if (! xcstrcmp(systemId, options->system_id)) {
- enum XML_Status rc;
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- return XML_STATUS_ERROR;
- rc = _XML_Parse_SINGLE_BYTES(ext_parser, options->parse_text,
- (int)strlen(options->parse_text), XML_TRUE);
- XML_ParserFree(ext_parser);
- return rc;
- }
- options++;
- }
- fail("No suitable option found");
- return XML_STATUS_ERROR;
-}
-
-/*
- * Parameter entity evaluation support.
- */
-#define ENTITY_MATCH_FAIL (-1)
-#define ENTITY_MATCH_NOT_FOUND (0)
-#define ENTITY_MATCH_SUCCESS (1)
-static const XML_Char *entity_name_to_match = NULL;
-static const XML_Char *entity_value_to_match = NULL;
-static int entity_match_flag = ENTITY_MATCH_NOT_FOUND;
-
-static void XMLCALL
-param_entity_match_handler(void *userData, const XML_Char *entityName,
- int is_parameter_entity, const XML_Char *value,
- int value_length, const XML_Char *base,
- const XML_Char *systemId, const XML_Char *publicId,
- const XML_Char *notationName) {
- UNUSED_P(userData);
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- UNUSED_P(notationName);
- if (! is_parameter_entity || entity_name_to_match == NULL
- || entity_value_to_match == NULL) {
- return;
- }
- if (! xcstrcmp(entityName, entity_name_to_match)) {
- /* The cast here is safe because we control the horizontal and
- * the vertical, and we therefore know our strings are never
- * going to overflow an int.
- */
- if (value_length != (int)xcstrlen(entity_value_to_match)
- || xcstrncmp(value, entity_value_to_match, value_length)) {
- entity_match_flag = ENTITY_MATCH_FAIL;
- } else {
- entity_match_flag = ENTITY_MATCH_SUCCESS;
- }
- }
- /* Else leave the match flag alone */
-}
-
-/*
- * Character & encoding tests.
- */
-
-START_TEST(test_nul_byte) {
- char text[] = "<doc>\0</doc>";
-
- /* test that a NUL byte (in US-ASCII data) is an error */
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_OK)
- fail("Parser did not report error on NUL-byte.");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_u0000_char) {
- /* test that a NUL byte (in US-ASCII data) is an error */
- expect_failure("<doc>&#0;</doc>", XML_ERROR_BAD_CHAR_REF,
- "Parser did not report error on NUL-byte.");
-}
-END_TEST
-
-START_TEST(test_siphash_self) {
- if (! sip24_valid())
- fail("SipHash self-test failed");
-}
-END_TEST
-
-START_TEST(test_siphash_spec) {
- /* https://131002.net/siphash/siphash.pdf (page 19, "Test values") */
- const char message[] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
- "\x0a\x0b\x0c\x0d\x0e";
- const size_t len = sizeof(message) - 1;
- const uint64_t expected = _SIP_ULL(0xa129ca61U, 0x49be45e5U);
- struct siphash state;
- struct sipkey key;
-
- sip_tokey(&key, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
- "\x0a\x0b\x0c\x0d\x0e\x0f");
- sip24_init(&state, &key);
-
- /* Cover spread across calls */
- sip24_update(&state, message, 4);
- sip24_update(&state, message + 4, len - 4);
-
- /* Cover null length */
- sip24_update(&state, message, 0);
-
- if (sip24_final(&state) != expected)
- fail("sip24_final failed spec test\n");
-
- /* Cover wrapper */
- if (siphash24(message, len, &key) != expected)
- fail("siphash24 failed spec test\n");
-}
-END_TEST
-
-START_TEST(test_bom_utf8) {
- /* This test is really just making sure we don't core on a UTF-8 BOM. */
- const char *text = "\357\273\277<e/>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_bom_utf16_be) {
- char text[] = "\376\377\0<\0e\0/\0>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_bom_utf16_le) {
- char text[] = "\377\376<\0e\0/\0>\0";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Parse whole buffer at once to exercise a different code path */
-START_TEST(test_nobom_utf16_le) {
- char text[] = " \0<\0e\0/\0>\0";
-
- if (XML_Parse(g_parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-static void XMLCALL
-accumulate_characters(void *userData, const XML_Char *s, int len) {
- CharData_AppendXMLChars((CharData *)userData, s, len);
-}
-
-static void XMLCALL
-accumulate_attribute(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- CharData *storage = (CharData *)userData;
- UNUSED_P(name);
- /* Check there are attributes to deal with */
- if (atts == NULL)
- return;
-
- while (storage->count < 0 && atts[0] != NULL) {
- /* "accumulate" the value of the first attribute we see */
- CharData_AppendXMLChars(storage, atts[1], -1);
- atts += 2;
- }
-}
-
-static void
-_run_character_check(const char *text, const XML_Char *expected,
- const char *file, int line) {
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- _xml_failure(g_parser, file, line);
- CharData_CheckXMLChars(&storage, expected);
-}
-
-#define run_character_check(text, expected) \
- _run_character_check(text, expected, __FILE__, __LINE__)
-
-static void
-_run_attribute_check(const char *text, const XML_Char *expected,
- const char *file, int line) {
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetStartElementHandler(g_parser, accumulate_attribute);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- _xml_failure(g_parser, file, line);
- CharData_CheckXMLChars(&storage, expected);
-}
-
-#define run_attribute_check(text, expected) \
- _run_attribute_check(text, expected, __FILE__, __LINE__)
-
-typedef struct ExtTest {
- const char *parse_text;
- const XML_Char *encoding;
- CharData *storage;
-} ExtTest;
-
-static void XMLCALL
-ext_accumulate_characters(void *userData, const XML_Char *s, int len) {
- ExtTest *test_data = (ExtTest *)userData;
- accumulate_characters(test_data->storage, s, len);
-}
-
-static void
-_run_ext_character_check(const char *text, ExtTest *test_data,
- const XML_Char *expected, const char *file, int line) {
- CharData *const storage = (CharData *)malloc(sizeof(CharData));
-
- CharData_Init(storage);
- test_data->storage = storage;
- XML_SetUserData(g_parser, test_data);
- XML_SetCharacterDataHandler(g_parser, ext_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- _xml_failure(g_parser, file, line);
- CharData_CheckXMLChars(storage, expected);
-
- free(storage);
-}
-
-#define run_ext_character_check(text, test_data, expected) \
- _run_ext_character_check(text, test_data, expected, __FILE__, __LINE__)
-
-/* Regression test for SF bug #491986. */
-START_TEST(test_danish_latin1) {
- const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
- "<e>J\xF8rgen \xE6\xF8\xE5\xC6\xD8\xC5</e>";
-#ifdef XML_UNICODE
- const XML_Char *expected
- = XCS("J\x00f8rgen \x00e6\x00f8\x00e5\x00c6\x00d8\x00c5");
-#else
- const XML_Char *expected
- = XCS("J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85");
-#endif
- run_character_check(text, expected);
-}
-END_TEST
-
-/* Regression test for SF bug #514281. */
-START_TEST(test_french_charref_hexidecimal) {
- const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
- "<doc>&#xE9;&#xE8;&#xE0;&#xE7;&#xEA;&#xC8;</doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
-#else
- const XML_Char *expected
- = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
-#endif
- run_character_check(text, expected);
-}
-END_TEST
-
-START_TEST(test_french_charref_decimal) {
- const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
- "<doc>&#233;&#232;&#224;&#231;&#234;&#200;</doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
-#else
- const XML_Char *expected
- = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
-#endif
- run_character_check(text, expected);
-}
-END_TEST
-
-START_TEST(test_french_latin1) {
- const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
- "<doc>\xE9\xE8\xE0\xE7\xEa\xC8</doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
-#else
- const XML_Char *expected
- = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
-#endif
- run_character_check(text, expected);
-}
-END_TEST
-
-START_TEST(test_french_utf8) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>\xC3\xA9</doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9");
-#else
- const XML_Char *expected = XCS("\xC3\xA9");
-#endif
- run_character_check(text, expected);
-}
-END_TEST
-
-/* Regression test for SF bug #600479.
- XXX There should be a test that exercises all legal XML Unicode
- characters as PCDATA and attribute value content, and XML Name
- characters as part of element and attribute names.
-*/
-START_TEST(test_utf8_false_rejection) {
- const char *text = "<doc>\xEF\xBA\xBF</doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\xfebf");
-#else
- const XML_Char *expected = XCS("\xEF\xBA\xBF");
-#endif
- run_character_check(text, expected);
-}
-END_TEST
-
-/* Regression test for SF bug #477667.
- This test assures that any 8-bit character followed by a 7-bit
- character will not be mistakenly interpreted as a valid UTF-8
- sequence.
-*/
-START_TEST(test_illegal_utf8) {
- char text[100];
- int i;
-
- for (i = 128; i <= 255; ++i) {
- sprintf(text, "<e>%ccd</e>", i);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK) {
- sprintf(text, "expected token error for '%c' (ordinal %d) in UTF-8 text",
- i, i);
- fail(text);
- } else if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
- xml_failure(g_parser);
- /* Reset the parser since we use the same parser repeatedly. */
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* Examples, not masks: */
-#define UTF8_LEAD_1 "\x7f" /* 0b01111111 */
-#define UTF8_LEAD_2 "\xdf" /* 0b11011111 */
-#define UTF8_LEAD_3 "\xef" /* 0b11101111 */
-#define UTF8_LEAD_4 "\xf7" /* 0b11110111 */
-#define UTF8_FOLLOW "\xbf" /* 0b10111111 */
-
-START_TEST(test_utf8_auto_align) {
- struct TestCase {
- ptrdiff_t expectedMovementInChars;
- const char *input;
- };
-
- struct TestCase cases[] = {
- {00, ""},
-
- {00, UTF8_LEAD_1},
-
- {-1, UTF8_LEAD_2},
- {00, UTF8_LEAD_2 UTF8_FOLLOW},
-
- {-1, UTF8_LEAD_3},
- {-2, UTF8_LEAD_3 UTF8_FOLLOW},
- {00, UTF8_LEAD_3 UTF8_FOLLOW UTF8_FOLLOW},
-
- {-1, UTF8_LEAD_4},
- {-2, UTF8_LEAD_4 UTF8_FOLLOW},
- {-3, UTF8_LEAD_4 UTF8_FOLLOW UTF8_FOLLOW},
- {00, UTF8_LEAD_4 UTF8_FOLLOW UTF8_FOLLOW UTF8_FOLLOW},
- };
-
- size_t i = 0;
- bool success = true;
- for (; i < sizeof(cases) / sizeof(*cases); i++) {
- const char *fromLim = cases[i].input + strlen(cases[i].input);
- const char *const fromLimInitially = fromLim;
- ptrdiff_t actualMovementInChars;
-
- _INTERNAL_trim_to_complete_utf8_characters(cases[i].input, &fromLim);
-
- actualMovementInChars = (fromLim - fromLimInitially);
- if (actualMovementInChars != cases[i].expectedMovementInChars) {
- size_t j = 0;
- success = false;
- printf("[-] UTF-8 case %2u: Expected movement by %2d chars"
- ", actually moved by %2d chars: \"",
- (unsigned)(i + 1), (int)cases[i].expectedMovementInChars,
- (int)actualMovementInChars);
- for (; j < strlen(cases[i].input); j++) {
- printf("\\x%02x", (unsigned char)cases[i].input[j]);
- }
- printf("\"\n");
- }
- }
-
- if (! success) {
- fail("UTF-8 auto-alignment is not bullet-proof\n");
- }
-}
-END_TEST
-
-START_TEST(test_utf16) {
- /* <?xml version="1.0" encoding="UTF-16"?>
- * <doc a='123'>some {A} text</doc>
- *
- * where {A} is U+FF21, FULLWIDTH LATIN CAPITAL LETTER A
- */
- char text[]
- = "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o"
- "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o"
- "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066"
- "\000'\000?\000>\000\n"
- "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'\000>"
- "\000s\000o\000m\000e\000 \xff\x21\000 \000t\000e\000x\000t\000"
- "<\000/\000d\000o\000c\000>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("some \xff21 text");
-#else
- const XML_Char *expected = XCS("some \357\274\241 text");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_utf16_le_epilog_newline) {
- unsigned int first_chunk_bytes = 17;
- char text[] = "\xFF\xFE" /* BOM */
- "<\000e\000/\000>\000" /* document element */
- "\r\000\n\000\r\000\n\000"; /* epilog */
-
- if (first_chunk_bytes >= sizeof(text) - 1)
- fail("bad value of first_chunk_bytes");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, first_chunk_bytes, XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- else {
- enum XML_Status rc;
- rc = _XML_Parse_SINGLE_BYTES(g_parser, text + first_chunk_bytes,
- sizeof(text) - first_chunk_bytes - 1,
- XML_TRUE);
- if (rc == XML_STATUS_ERROR)
- xml_failure(g_parser);
- }
-}
-END_TEST
-
-/* Test that an outright lie in the encoding is faulted */
-START_TEST(test_not_utf16) {
- const char *text = "<?xml version='1.0' encoding='utf-16'?>"
- "<doc>Hi</doc>";
-
- /* Use a handler to provoke the appropriate code paths */
- XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
- expect_failure(text, XML_ERROR_INCORRECT_ENCODING,
- "UTF-16 declared in UTF-8 not faulted");
-}
-END_TEST
-
-/* Test that an unknown encoding is rejected */
-START_TEST(test_bad_encoding) {
- const char *text = "<doc>Hi</doc>";
-
- if (! XML_SetEncoding(g_parser, XCS("unknown-encoding")))
- fail("XML_SetEncoding failed");
- expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
- "Unknown encoding not faulted");
-}
-END_TEST
-
-/* Regression test for SF bug #481609, #774028. */
-START_TEST(test_latin1_umlauts) {
- const char *text
- = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
- "<e a='\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; >'\n"
- " >\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; ></e>";
-#ifdef XML_UNICODE
- /* Expected results in UTF-16 */
- const XML_Char *expected = XCS("\x00e4 \x00f6 \x00fc ")
- XCS("\x00e4 \x00f6 \x00fc ") XCS("\x00e4 \x00f6 \x00fc >");
-#else
- /* Expected results in UTF-8 */
- const XML_Char *expected = XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC ")
- XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC ") XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC >");
-#endif
-
- run_character_check(text, expected);
- XML_ParserReset(g_parser, NULL);
- run_attribute_check(text, expected);
- /* Repeat with a default handler */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
- run_character_check(text, expected);
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
- run_attribute_check(text, expected);
-}
-END_TEST
-
-/* Test that an element name with a 4-byte UTF-8 character is rejected */
-START_TEST(test_long_utf8_character) {
- const char *text
- = "<?xml version='1.0' encoding='utf-8'?>\n"
- /* 0xf0 0x90 0x80 0x80 = U+10000, the first Linear B character */
- "<do\xf0\x90\x80\x80/>";
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "4-byte UTF-8 character in element name not faulted");
-}
-END_TEST
-
-/* Test that a long latin-1 attribute (too long to convert in one go)
- * is correctly converted
- */
-START_TEST(test_long_latin1_attribute) {
- const char *text
- = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
- "<doc att='"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- /* Last character splits across a buffer boundary */
- "\xe4'>\n</doc>";
-
- const XML_Char *expected =
- /* 64 characters per line */
- /* clang-format off */
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO")
- /* clang-format on */
-#ifdef XML_UNICODE
- XCS("\x00e4");
-#else
- XCS("\xc3\xa4");
-#endif
-
- run_attribute_check(text, expected);
-}
-END_TEST
-
-/* Test that a long ASCII attribute (too long to convert in one go)
- * is correctly converted
- */
-START_TEST(test_long_ascii_attribute) {
- const char *text
- = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<doc att='"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "01234'>\n</doc>";
- const XML_Char *expected =
- /* 64 characters per line */
- /* clang-format off */
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("01234");
- /* clang-format on */
-
- run_attribute_check(text, expected);
-}
-END_TEST
-
-/* Regression test #1 for SF bug #653180. */
-START_TEST(test_line_number_after_parse) {
- const char *text = "<tag>\n"
- "\n"
- "\n</tag>";
- XML_Size lineno;
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- lineno = XML_GetCurrentLineNumber(g_parser);
- if (lineno != 4) {
- char buffer[100];
- sprintf(buffer, "expected 4 lines, saw %" XML_FMT_INT_MOD "u", lineno);
- fail(buffer);
- }
-}
-END_TEST
-
-/* Regression test #2 for SF bug #653180. */
-START_TEST(test_column_number_after_parse) {
- const char *text = "<tag></tag>";
- XML_Size colno;
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- colno = XML_GetCurrentColumnNumber(g_parser);
- if (colno != 11) {
- char buffer[100];
- sprintf(buffer, "expected 11 columns, saw %" XML_FMT_INT_MOD "u", colno);
- fail(buffer);
- }
-}
-END_TEST
-
-#define STRUCT_START_TAG 0
-#define STRUCT_END_TAG 1
-static void XMLCALL
-start_element_event_handler2(void *userData, const XML_Char *name,
- const XML_Char **attr) {
- StructData *storage = (StructData *)userData;
- UNUSED_P(attr);
- StructData_AddItem(storage, name, XML_GetCurrentColumnNumber(g_parser),
- XML_GetCurrentLineNumber(g_parser), STRUCT_START_TAG);
-}
-
-static void XMLCALL
-end_element_event_handler2(void *userData, const XML_Char *name) {
- StructData *storage = (StructData *)userData;
- StructData_AddItem(storage, name, XML_GetCurrentColumnNumber(g_parser),
- XML_GetCurrentLineNumber(g_parser), STRUCT_END_TAG);
-}
-
-/* Regression test #3 for SF bug #653180. */
-START_TEST(test_line_and_column_numbers_inside_handlers) {
- const char *text = "<a>\n" /* Unix end-of-line */
- " <b>\r\n" /* Windows end-of-line */
- " <c/>\r" /* Mac OS end-of-line */
- " </b>\n"
- " <d>\n"
- " <f/>\n"
- " </d>\n"
- "</a>";
- const StructDataEntry expected[]
- = {{XCS("a"), 0, 1, STRUCT_START_TAG}, {XCS("b"), 2, 2, STRUCT_START_TAG},
- {XCS("c"), 4, 3, STRUCT_START_TAG}, {XCS("c"), 8, 3, STRUCT_END_TAG},
- {XCS("b"), 2, 4, STRUCT_END_TAG}, {XCS("d"), 2, 5, STRUCT_START_TAG},
- {XCS("f"), 4, 6, STRUCT_START_TAG}, {XCS("f"), 8, 6, STRUCT_END_TAG},
- {XCS("d"), 2, 7, STRUCT_END_TAG}, {XCS("a"), 0, 8, STRUCT_END_TAG}};
- const int expected_count = sizeof(expected) / sizeof(StructDataEntry);
- StructData storage;
-
- StructData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetStartElementHandler(g_parser, start_element_event_handler2);
- XML_SetEndElementHandler(g_parser, end_element_event_handler2);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- StructData_CheckItems(&storage, expected, expected_count);
- StructData_Dispose(&storage);
-}
-END_TEST
-
-/* Regression test #4 for SF bug #653180. */
-START_TEST(test_line_number_after_error) {
- const char *text = "<a>\n"
- " <b>\n"
- " </a>"; /* missing </b> */
- XML_Size lineno;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- != XML_STATUS_ERROR)
- fail("Expected a parse error");
-
- lineno = XML_GetCurrentLineNumber(g_parser);
- if (lineno != 3) {
- char buffer[100];
- sprintf(buffer, "expected 3 lines, saw %" XML_FMT_INT_MOD "u", lineno);
- fail(buffer);
- }
-}
-END_TEST
-
-/* Regression test #5 for SF bug #653180. */
-START_TEST(test_column_number_after_error) {
- const char *text = "<a>\n"
- " <b>\n"
- " </a>"; /* missing </b> */
- XML_Size colno;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- != XML_STATUS_ERROR)
- fail("Expected a parse error");
-
- colno = XML_GetCurrentColumnNumber(g_parser);
- if (colno != 4) {
- char buffer[100];
- sprintf(buffer, "expected 4 columns, saw %" XML_FMT_INT_MOD "u", colno);
- fail(buffer);
- }
-}
-END_TEST
-
-/* Regression test for SF bug #478332. */
-START_TEST(test_really_long_lines) {
- /* This parses an input line longer than INIT_DATA_BUF_SIZE
- characters long (defined to be 1024 in xmlparse.c). We take a
- really cheesy approach to building the input buffer, because
- this avoids writing bugs in buffer-filling code.
- */
- const char *text
- = "<e>"
- /* 64 chars */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- /* until we have at least 1024 characters on the line: */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "</e>";
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test cdata processing across a buffer boundary */
-START_TEST(test_really_long_encoded_lines) {
- /* As above, except that we want to provoke an output buffer
- * overflow with a non-trivial encoding. For this we need to pass
- * the whole cdata in one go, not byte-by-byte.
- */
- void *buffer;
- const char *text
- = "<?xml version='1.0' encoding='iso-8859-1'?>"
- "<e>"
- /* 64 chars */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- /* until we have at least 1024 characters on the line: */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
- "</e>";
- int parse_len = (int)strlen(text);
-
- /* Need a cdata handler to provoke the code path we want to test */
- XML_SetCharacterDataHandler(g_parser, dummy_cdata_handler);
- buffer = XML_GetBuffer(g_parser, parse_len);
- if (buffer == NULL)
- fail("Could not allocate parse buffer");
- assert(buffer != NULL);
- memcpy(buffer, text, parse_len);
- if (XML_ParseBuffer(g_parser, parse_len, XML_TRUE) == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/*
- * Element event tests.
- */
-
-static void XMLCALL
-start_element_event_handler(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- UNUSED_P(atts);
- CharData_AppendXMLChars((CharData *)userData, name, -1);
-}
-
-static void XMLCALL
-end_element_event_handler(void *userData, const XML_Char *name) {
- CharData *storage = (CharData *)userData;
- CharData_AppendXMLChars(storage, XCS("/"), 1);
- CharData_AppendXMLChars(storage, name, -1);
-}
-
-START_TEST(test_end_element_events) {
- const char *text = "<a><b><c/></b><d><f/></d></a>";
- const XML_Char *expected = XCS("/c/b/f/d/a");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetEndElementHandler(g_parser, end_element_event_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/*
- * Attribute tests.
- */
-
-/* Helpers used by the following test; this checks any "attr" and "refs"
- attributes to make sure whitespace has been normalized.
-
- Return true if whitespace has been normalized in a string, using
- the rules for attribute value normalization. The 'is_cdata' flag
- is needed since CDATA attributes don't need to have multiple
- whitespace characters collapsed to a single space, while other
- attribute data types do. (Section 3.3.3 of the recommendation.)
-*/
-static int
-is_whitespace_normalized(const XML_Char *s, int is_cdata) {
- int blanks = 0;
- int at_start = 1;
- while (*s) {
- if (*s == XCS(' '))
- ++blanks;
- else if (*s == XCS('\t') || *s == XCS('\n') || *s == XCS('\r'))
- return 0;
- else {
- if (at_start) {
- at_start = 0;
- if (blanks && ! is_cdata)
- /* illegal leading blanks */
- return 0;
- } else if (blanks > 1 && ! is_cdata)
- return 0;
- blanks = 0;
- }
- ++s;
- }
- if (blanks && ! is_cdata)
- return 0;
- return 1;
-}
-
-/* Check the attribute whitespace checker: */
-static void
-testhelper_is_whitespace_normalized(void) {
- assert(is_whitespace_normalized(XCS("abc"), 0));
- assert(is_whitespace_normalized(XCS("abc"), 1));
- assert(is_whitespace_normalized(XCS("abc def ghi"), 0));
- assert(is_whitespace_normalized(XCS("abc def ghi"), 1));
- assert(! is_whitespace_normalized(XCS(" abc def ghi"), 0));
- assert(is_whitespace_normalized(XCS(" abc def ghi"), 1));
- assert(! is_whitespace_normalized(XCS("abc def ghi"), 0));
- assert(is_whitespace_normalized(XCS("abc def ghi"), 1));
- assert(! is_whitespace_normalized(XCS("abc def ghi "), 0));
- assert(is_whitespace_normalized(XCS("abc def ghi "), 1));
- assert(! is_whitespace_normalized(XCS(" "), 0));
- assert(is_whitespace_normalized(XCS(" "), 1));
- assert(! is_whitespace_normalized(XCS("\t"), 0));
- assert(! is_whitespace_normalized(XCS("\t"), 1));
- assert(! is_whitespace_normalized(XCS("\n"), 0));
- assert(! is_whitespace_normalized(XCS("\n"), 1));
- assert(! is_whitespace_normalized(XCS("\r"), 0));
- assert(! is_whitespace_normalized(XCS("\r"), 1));
- assert(! is_whitespace_normalized(XCS("abc\t def"), 1));
-}
-
-static void XMLCALL
-check_attr_contains_normalized_whitespace(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- int i;
- UNUSED_P(userData);
- UNUSED_P(name);
- for (i = 0; atts[i] != NULL; i += 2) {
- const XML_Char *attrname = atts[i];
- const XML_Char *value = atts[i + 1];
- if (xcstrcmp(XCS("attr"), attrname) == 0
- || xcstrcmp(XCS("ents"), attrname) == 0
- || xcstrcmp(XCS("refs"), attrname) == 0) {
- if (! is_whitespace_normalized(value, 0)) {
- char buffer[256];
- sprintf(buffer,
- "attribute value not normalized: %" XML_FMT_STR
- "='%" XML_FMT_STR "'",
- attrname, value);
- fail(buffer);
- }
- }
- }
-}
-
-START_TEST(test_attr_whitespace_normalization) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ATTLIST doc\n"
- " attr NMTOKENS #REQUIRED\n"
- " ents ENTITIES #REQUIRED\n"
- " refs IDREFS #REQUIRED>\n"
- "]>\n"
- "<doc attr=' a b c\t\td\te\t' refs=' id-1 \t id-2\t\t' \n"
- " ents=' ent-1 \t\r\n"
- " ent-2 ' >\n"
- " <e id='id-1'/>\n"
- " <e id='id-2'/>\n"
- "</doc>";
-
- XML_SetStartElementHandler(g_parser,
- check_attr_contains_normalized_whitespace);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/*
- * XML declaration tests.
- */
-
-START_TEST(test_xmldecl_misplaced) {
- expect_failure("\n"
- "<?xml version='1.0'?>\n"
- "<a/>",
- XML_ERROR_MISPLACED_XML_PI,
- "failed to report misplaced XML declaration");
-}
-END_TEST
-
-START_TEST(test_xmldecl_invalid) {
- expect_failure("<?xml version='1.0' \xc3\xa7?>\n<doc/>", XML_ERROR_XML_DECL,
- "Failed to report invalid XML declaration");
-}
-END_TEST
-
-START_TEST(test_xmldecl_missing_attr) {
- expect_failure("<?xml ='1.0'?>\n<doc/>\n", XML_ERROR_XML_DECL,
- "Failed to report missing XML declaration attribute");
-}
-END_TEST
-
-START_TEST(test_xmldecl_missing_value) {
- expect_failure("<?xml version='1.0' encoding='us-ascii' standalone?>\n"
- "<doc/>",
- XML_ERROR_XML_DECL,
- "Failed to report missing attribute value");
-}
-END_TEST
-
-/* Regression test for SF bug #584832. */
-static int XMLCALL
-UnknownEncodingHandler(void *data, const XML_Char *encoding,
- XML_Encoding *info) {
- UNUSED_P(data);
- if (xcstrcmp(encoding, XCS("unsupported-encoding")) == 0) {
- int i;
- for (i = 0; i < 256; ++i)
- info->map[i] = i;
- info->data = NULL;
- info->convert = NULL;
- info->release = NULL;
- return XML_STATUS_OK;
- }
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_unknown_encoding_internal_entity) {
- const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
- "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
- "<test a='&foo;'/>";
-
- XML_SetUnknownEncodingHandler(g_parser, UnknownEncodingHandler, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test unrecognised encoding handler */
-static void
-dummy_release(void *data) {
- UNUSED_P(data);
-}
-
-static int XMLCALL
-UnrecognisedEncodingHandler(void *data, const XML_Char *encoding,
- XML_Encoding *info) {
- UNUSED_P(data);
- UNUSED_P(encoding);
- info->data = NULL;
- info->convert = NULL;
- info->release = dummy_release;
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_unrecognised_encoding_internal_entity) {
- const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
- "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
- "<test a='&foo;'/>";
-
- XML_SetUnknownEncodingHandler(g_parser, UnrecognisedEncodingHandler, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Unrecognised encoding not rejected");
-}
-END_TEST
-
-/* Regression test for SF bug #620106. */
-static int XMLCALL
-external_entity_loader(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- ExtTest *test_data = (ExtTest *)XML_GetUserData(parser);
- XML_Parser extparser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (extparser == NULL)
- fail("Could not create external entity parser.");
- if (test_data->encoding != NULL) {
- if (! XML_SetEncoding(extparser, test_data->encoding))
- fail("XML_SetEncoding() ignored for external entity");
- }
- if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
- (int)strlen(test_data->parse_text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(extparser);
- return XML_STATUS_ERROR;
- }
- XML_ParserFree(extparser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_set_encoding) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest test_data
- = {/* This text says it's an unsupported encoding, but it's really
- UTF-8, which we tell Expat using XML_SetEncoding().
- */
- "<?xml encoding='iso-8859-3'?>\xC3\xA9", XCS("utf-8"), NULL};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9");
-#else
- const XML_Char *expected = XCS("\xc3\xa9");
-#endif
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- run_ext_character_check(text, &test_data, expected);
-}
-END_TEST
-
-/* Test external entities with no handler */
-START_TEST(test_ext_entity_no_handler) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
-
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
- run_character_check(text, XCS(""));
-}
-END_TEST
-
-/* Test UTF-8 BOM is accepted */
-START_TEST(test_ext_entity_set_bom) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest test_data = {"\xEF\xBB\xBF" /* BOM */
- "<?xml encoding='iso-8859-3'?>"
- "\xC3\xA9",
- XCS("utf-8"), NULL};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9");
-#else
- const XML_Char *expected = XCS("\xc3\xa9");
-#endif
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- run_ext_character_check(text, &test_data, expected);
-}
-END_TEST
-
-/* Test that bad encodings are faulted */
-typedef struct ext_faults {
- const char *parse_text;
- const char *fail_text;
- const XML_Char *encoding;
- enum XML_Error error;
-} ExtFaults;
-
-static int XMLCALL
-external_entity_faulter(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- XML_Parser ext_parser;
- ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (fault->encoding != NULL) {
- if (! XML_SetEncoding(ext_parser, fault->encoding))
- fail("XML_SetEncoding failed");
- }
- if (_XML_Parse_SINGLE_BYTES(ext_parser, fault->parse_text,
- (int)strlen(fault->parse_text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail(fault->fail_text);
- if (XML_GetErrorCode(ext_parser) != fault->error)
- xml_failure(ext_parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_ext_entity_bad_encoding) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtFaults fault
- = {"<?xml encoding='iso-8859-3'?>u", "Unsupported encoding not faulted",
- XCS("unknown"), XML_ERROR_UNKNOWN_ENCODING};
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_SetUserData(g_parser, &fault);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Bad encoding should not have been accepted");
-}
-END_TEST
-
-/* Try handing an invalid encoding to an external entity parser */
-START_TEST(test_ext_entity_bad_encoding_2) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- ExtFaults fault
- = {"<!ELEMENT doc (#PCDATA)*>", "Unknown encoding not faulted",
- XCS("unknown-encoding"), XML_ERROR_UNKNOWN_ENCODING};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_SetUserData(g_parser, &fault);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Bad encoding not faulted in external entity handler");
-}
-END_TEST
-
-/* Test that no error is reported for unknown entities if we don't
- read an external subset. This was fixed in Expat 1.95.5.
-*/
-START_TEST(test_wfc_undeclared_entity_unread_external_subset) {
- const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that an error is reported for unknown entities if we don't
- have an external subset.
-*/
-START_TEST(test_wfc_undeclared_entity_no_external_subset) {
- expect_failure("<doc>&entity;</doc>", XML_ERROR_UNDEFINED_ENTITY,
- "Parser did not report undefined entity w/out a DTD.");
-}
-END_TEST
-
-/* Test that an error is reported for unknown entities if we don't
- read an external subset, but have been declared standalone.
-*/
-START_TEST(test_wfc_undeclared_entity_standalone) {
- const char *text
- = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
-
- expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
- "Parser did not report undefined entity (standalone).");
-}
-END_TEST
-
-/* Test that an error is reported for unknown entities if we have read
- an external subset, and standalone is true.
-*/
-START_TEST(test_wfc_undeclared_entity_with_external_subset_standalone) {
- const char *text
- = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
- "Parser did not report undefined entity (external DTD).");
-}
-END_TEST
-
-/* Test that external entity handling is not done if the parsing flag
- * is set to UNLESS_STANDALONE
- */
-START_TEST(test_entity_with_external_subset_unless_standalone) {
- const char *text
- = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ENTITY entity 'bar'>", NULL, NULL};
-
- XML_SetParamEntityParsing(g_parser,
- XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
- "Parser did not report undefined entity");
-}
-END_TEST
-
-/* Test that no error is reported for unknown entities if we have read
- an external subset, and standalone is false.
-*/
-START_TEST(test_wfc_undeclared_entity_with_external_subset) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- run_ext_character_check(text, &test_data, XCS(""));
-}
-END_TEST
-
-/* Test that an error is reported if our NotStandalone handler fails */
-static int XMLCALL
-reject_not_standalone_handler(void *userData) {
- UNUSED_P(userData);
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_not_standalone_handler_reject) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
- expect_failure(text, XML_ERROR_NOT_STANDALONE,
- "NotStandalone handler failed to reject");
-
- /* Try again but without external entity handling */
- XML_ParserReset(g_parser, NULL);
- XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
- expect_failure(text, XML_ERROR_NOT_STANDALONE,
- "NotStandalone handler failed to reject");
-}
-END_TEST
-
-/* Test that no error is reported if our NotStandalone handler succeeds */
-static int XMLCALL
-accept_not_standalone_handler(void *userData) {
- UNUSED_P(userData);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_not_standalone_handler_accept) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
- run_ext_character_check(text, &test_data, XCS(""));
-
- /* Repeat wtihout the external entity handler */
- XML_ParserReset(g_parser, NULL);
- XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
- run_character_check(text, XCS(""));
-}
-END_TEST
-
-START_TEST(test_wfc_no_recursive_entity_refs) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY entity '&#38;entity;'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
-
- expect_failure(text, XML_ERROR_RECURSIVE_ENTITY_REF,
- "Parser did not report recursive entity reference.");
-}
-END_TEST
-
-/* Test incomplete external entities are faulted */
-START_TEST(test_ext_entity_invalid_parse) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- const ExtFaults faults[]
- = {{"<", "Incomplete element declaration not faulted", NULL,
- XML_ERROR_UNCLOSED_TOKEN},
- {"<\xe2\x82", /* First two bytes of a three-byte char */
- "Incomplete character not faulted", NULL, XML_ERROR_PARTIAL_CHAR},
- {"<tag>\xe2\x82", "Incomplete character in CDATA not faulted", NULL,
- XML_ERROR_PARTIAL_CHAR},
- {NULL, NULL, NULL, XML_ERROR_NONE}};
- const ExtFaults *fault = faults;
-
- for (; fault->parse_text != NULL; fault++) {
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_SetUserData(g_parser, (void *)fault);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Parser did not report external entity error");
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* Regression test for SF bug #483514. */
-START_TEST(test_dtd_default_handling) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
- "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
- "<!ELEMENT doc EMPTY>\n"
- "<!ATTLIST doc a CDATA #IMPLIED>\n"
- "<?pi in dtd?>\n"
- "<!--comment in dtd-->\n"
- "]><doc/>";
-
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
- XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- XML_SetStartCdataSectionHandler(g_parser, dummy_start_cdata_handler);
- XML_SetEndCdataSectionHandler(g_parser, dummy_end_cdata_handler);
- run_character_check(text, XCS("\n\n\n\n\n\n\n<doc/>"));
-}
-END_TEST
-
-/* Test handling of attribute declarations */
-typedef struct AttTest {
- const char *definition;
- const XML_Char *element_name;
- const XML_Char *attr_name;
- const XML_Char *attr_type;
- const XML_Char *default_value;
- int is_required;
-} AttTest;
-
-static void XMLCALL
-verify_attlist_decl_handler(void *userData, const XML_Char *element_name,
- const XML_Char *attr_name,
- const XML_Char *attr_type,
- const XML_Char *default_value, int is_required) {
- AttTest *at = (AttTest *)userData;
-
- if (xcstrcmp(element_name, at->element_name))
- fail("Unexpected element name in attribute declaration");
- if (xcstrcmp(attr_name, at->attr_name))
- fail("Unexpected attribute name in attribute declaration");
- if (xcstrcmp(attr_type, at->attr_type))
- fail("Unexpected attribute type in attribute declaration");
- if ((default_value == NULL && at->default_value != NULL)
- || (default_value != NULL && at->default_value == NULL)
- || (default_value != NULL && xcstrcmp(default_value, at->default_value)))
- fail("Unexpected default value in attribute declaration");
- if (is_required != at->is_required)
- fail("Requirement mismatch in attribute declaration");
-}
-
-START_TEST(test_dtd_attr_handling) {
- const char *prolog = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc EMPTY>\n";
- AttTest attr_data[]
- = {{"<!ATTLIST doc a ( one | two | three ) #REQUIRED>\n"
- "]>"
- "<doc a='two'/>",
- XCS("doc"), XCS("a"),
- XCS("(one|two|three)"), /* Extraneous spaces will be removed */
- NULL, XML_TRUE},
- {"<!NOTATION foo SYSTEM 'http://example.org/foo'>\n"
- "<!ATTLIST doc a NOTATION (foo) #IMPLIED>\n"
- "]>"
- "<doc/>",
- XCS("doc"), XCS("a"), XCS("NOTATION(foo)"), NULL, XML_FALSE},
- {"<!ATTLIST doc a NOTATION (foo) 'bar'>\n"
- "]>"
- "<doc/>",
- XCS("doc"), XCS("a"), XCS("NOTATION(foo)"), XCS("bar"), XML_FALSE},
- {"<!ATTLIST doc a CDATA '\xdb\xb2'>\n"
- "]>"
- "<doc/>",
- XCS("doc"), XCS("a"), XCS("CDATA"),
-#ifdef XML_UNICODE
- XCS("\x06f2"),
-#else
- XCS("\xdb\xb2"),
-#endif
- XML_FALSE},
- {NULL, NULL, NULL, NULL, NULL, XML_FALSE}};
- AttTest *test;
-
- for (test = attr_data; test->definition != NULL; test++) {
- XML_SetAttlistDeclHandler(g_parser, verify_attlist_decl_handler);
- XML_SetUserData(g_parser, test);
- if (_XML_Parse_SINGLE_BYTES(g_parser, prolog, (int)strlen(prolog),
- XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (_XML_Parse_SINGLE_BYTES(g_parser, test->definition,
- (int)strlen(test->definition), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* See related SF bug #673791.
- When namespace processing is enabled, setting the namespace URI for
- a prefix is not allowed; this test ensures that it *is* allowed
- when namespace processing is not enabled.
- (See Namespaces in XML, section 2.)
-*/
-START_TEST(test_empty_ns_without_namespaces) {
- const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
- " <e xmlns:prefix=''/>\n"
- "</doc>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Regression test for SF bug #824420.
- Checks that an xmlns:prefix attribute set in an attribute's default
- value isn't misinterpreted.
-*/
-START_TEST(test_ns_in_attribute_default_without_namespaces) {
- const char *text = "<!DOCTYPE e:element [\n"
- " <!ATTLIST e:element\n"
- " xmlns:e CDATA 'http://example.org/'>\n"
- " ]>\n"
- "<e:element/>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-static const char *long_character_data_text
- = "<?xml version='1.0' encoding='iso-8859-1'?><s>"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "</s>";
-
-static XML_Bool resumable = XML_FALSE;
-
-static void
-clearing_aborting_character_handler(void *userData, const XML_Char *s,
- int len) {
- UNUSED_P(userData);
- UNUSED_P(s);
- UNUSED_P(len);
- XML_StopParser(g_parser, resumable);
- XML_SetCharacterDataHandler(g_parser, NULL);
-}
-
-/* Regression test for SF bug #1515266: missing check of stopped
- parser in doContext() 'for' loop. */
-START_TEST(test_stop_parser_between_char_data_calls) {
- /* The sample data must be big enough that there are two calls to
- the character data handler from within the inner "for" loop of
- the XML_TOK_DATA_CHARS case in doContent(), and the character
- handler must stop the parser and clear the character data
- handler.
- */
- const char *text = long_character_data_text;
-
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- resumable = XML_FALSE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (XML_GetErrorCode(g_parser) != XML_ERROR_ABORTED)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Regression test for SF bug #1515266: missing check of stopped
- parser in doContext() 'for' loop. */
-START_TEST(test_suspend_parser_between_char_data_calls) {
- /* The sample data must be big enough that there are two calls to
- the character data handler from within the inner "for" loop of
- the XML_TOK_DATA_CHARS case in doContent(), and the character
- handler must stop the parser and clear the character data
- handler.
- */
- const char *text = long_character_data_text;
-
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- resumable = XML_TRUE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
- xml_failure(g_parser);
- /* Try parsing directly */
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Attempt to continue parse while suspended not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
- fail("Suspended parse not faulted with correct error");
-}
-END_TEST
-
-static XML_Bool abortable = XML_FALSE;
-
-static void
-parser_stop_character_handler(void *userData, const XML_Char *s, int len) {
- UNUSED_P(userData);
- UNUSED_P(s);
- UNUSED_P(len);
- XML_StopParser(g_parser, resumable);
- XML_SetCharacterDataHandler(g_parser, NULL);
- if (! resumable) {
- /* Check that aborting an aborted parser is faulted */
- if (XML_StopParser(g_parser, XML_FALSE) != XML_STATUS_ERROR)
- fail("Aborting aborted parser not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
- xml_failure(g_parser);
- } else if (abortable) {
- /* Check that aborting a suspended parser works */
- if (XML_StopParser(g_parser, XML_FALSE) == XML_STATUS_ERROR)
- xml_failure(g_parser);
- } else {
- /* Check that suspending a suspended parser works */
- if (XML_StopParser(g_parser, XML_TRUE) != XML_STATUS_ERROR)
- fail("Suspending suspended parser not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
- xml_failure(g_parser);
- }
-}
-
-/* Test repeated calls to XML_StopParser are handled correctly */
-START_TEST(test_repeated_stop_parser_between_char_data_calls) {
- const char *text = long_character_data_text;
-
- XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
- resumable = XML_FALSE;
- abortable = XML_FALSE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Failed to double-stop parser");
-
- XML_ParserReset(g_parser, NULL);
- XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
- resumable = XML_TRUE;
- abortable = XML_FALSE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- fail("Failed to double-suspend parser");
-
- XML_ParserReset(g_parser, NULL);
- XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
- resumable = XML_TRUE;
- abortable = XML_TRUE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Failed to suspend-abort parser");
-}
-END_TEST
-
-START_TEST(test_good_cdata_ascii) {
- const char *text = "<a><![CDATA[<greeting>Hello, world!</greeting>]]></a>";
- const XML_Char *expected = XCS("<greeting>Hello, world!</greeting>");
-
- CharData storage;
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- /* Add start and end handlers for coverage */
- XML_SetStartCdataSectionHandler(g_parser, dummy_start_cdata_handler);
- XML_SetEndCdataSectionHandler(g_parser, dummy_end_cdata_handler);
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-
- /* Try again, this time with a default handler */
- XML_ParserReset(g_parser, NULL);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_good_cdata_utf16) {
- /* Test data is:
- * <?xml version='1.0' encoding='utf-16'?>
- * <a><![CDATA[hello]]></a>
- */
- const char text[]
- = "\0<\0?\0x\0m\0l\0"
- " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
- " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
- "1\0"
- "6\0'"
- "\0?\0>\0\n"
- "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>";
- const XML_Char *expected = XCS("hello");
-
- CharData storage;
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_good_cdata_utf16_le) {
- /* Test data is:
- * <?xml version='1.0' encoding='utf-16'?>
- * <a><![CDATA[hello]]></a>
- */
- const char text[]
- = "<\0?\0x\0m\0l\0"
- " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
- " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
- "1\0"
- "6\0'"
- "\0?\0>\0\n"
- "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>\0";
- const XML_Char *expected = XCS("hello");
-
- CharData storage;
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test UTF16 conversion of a long cdata string */
-
-/* 16 characters: handy macro to reduce visual clutter */
-#define A_TO_P_IN_UTF16 "\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"
-
-START_TEST(test_long_cdata_utf16) {
- /* Test data is:
- * <?xlm version='1.0' encoding='utf-16'?>
- * <a><![CDATA[
- * ABCDEFGHIJKLMNOP
- * ]]></a>
- */
- const char text[]
- = "\0<\0?\0x\0m\0l\0 "
- "\0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0 "
- "\0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0\x31\0\x36\0'\0?\0>"
- "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
- /* 64 characters per line */
- /* clang-format off */
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
- A_TO_P_IN_UTF16
- /* clang-format on */
- "\0]\0]\0>\0<\0/\0a\0>";
- const XML_Char *expected =
- /* clang-format off */
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
- XCS("ABCDEFGHIJKLMNOP");
- /* clang-format on */
- CharData storage;
- void *buffer;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- buffer = XML_GetBuffer(g_parser, sizeof(text) - 1);
- if (buffer == NULL)
- fail("Could not allocate parse buffer");
- assert(buffer != NULL);
- memcpy(buffer, text, sizeof(text) - 1);
- if (XML_ParseBuffer(g_parser, sizeof(text) - 1, XML_TRUE) == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test handling of multiple unit UTF-16 characters */
-#ifndef XML_MIN_SIZE /* FIXME workaround -DXML_MIN_SIZE + ASan (issue #332) */
-START_TEST(test_multichar_cdata_utf16) {
- /* Test data is:
- * <?xml version='1.0' encoding='utf-16'?>
- * <a><![CDATA[{MINIM}{CROTCHET}]]></a>
- *
- * where {MINIM} is U+1d15e (a minim or half-note)
- * UTF-16: 0xd834 0xdd5e
- * UTF-8: 0xf0 0x9d 0x85 0x9e
- * and {CROTCHET} is U+1d15f (a crotchet or quarter-note)
- * UTF-16: 0xd834 0xdd5f
- * UTF-8: 0xf0 0x9d 0x85 0x9f
- */
- const char text[] = "\0<\0?\0x\0m\0l\0"
- " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
- " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
- "1\0"
- "6\0'"
- "\0?\0>\0\n"
- "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
- "\xd8\x34\xdd\x5e\xd8\x34\xdd\x5f"
- "\0]\0]\0>\0<\0/\0a\0>";
-# ifdef XML_UNICODE
- const XML_Char *expected = XCS("\xd834\xdd5e\xd834\xdd5f");
-# else
- const XML_Char *expected = XCS("\xf0\x9d\x85\x9e\xf0\x9d\x85\x9f");
-# endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-#endif /* ifndef XML_MIN_SIZE */
-
-/* Test that an element name with a UTF-16 surrogate pair is rejected */
-START_TEST(test_utf16_bad_surrogate_pair) {
- /* Test data is:
- * <?xml version='1.0' encoding='utf-16'?>
- * <a><![CDATA[{BADLINB}]]></a>
- *
- * where {BADLINB} is U+10000 (the first Linear B character)
- * with the UTF-16 surrogate pair in the wrong order, i.e.
- * 0xdc00 0xd800
- */
- const char text[] = "\0<\0?\0x\0m\0l\0"
- " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
- " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
- "1\0"
- "6\0'"
- "\0?\0>\0\n"
- "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
- "\xdc\x00\xd8\x00"
- "\0]\0]\0>\0<\0/\0a\0>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Reversed UTF-16 surrogate pair not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_bad_cdata) {
- struct CaseData {
- const char *text;
- enum XML_Error expectedError;
- };
-
- struct CaseData cases[]
- = {{"<a><", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><!", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><![", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><![C", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><![CD", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><![CDA", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><![CDAT", XML_ERROR_UNCLOSED_TOKEN},
- {"<a><![CDATA", XML_ERROR_UNCLOSED_TOKEN},
-
- {"<a><![CDATA[", XML_ERROR_UNCLOSED_CDATA_SECTION},
- {"<a><![CDATA[]", XML_ERROR_UNCLOSED_CDATA_SECTION},
- {"<a><![CDATA[]]", XML_ERROR_UNCLOSED_CDATA_SECTION},
-
- {"<a><!<a/>", XML_ERROR_INVALID_TOKEN},
- {"<a><![<a/>", XML_ERROR_UNCLOSED_TOKEN}, /* ?! */
- {"<a><![C<a/>", XML_ERROR_UNCLOSED_TOKEN}, /* ?! */
- {"<a><![CD<a/>", XML_ERROR_INVALID_TOKEN},
- {"<a><![CDA<a/>", XML_ERROR_INVALID_TOKEN},
- {"<a><![CDAT<a/>", XML_ERROR_INVALID_TOKEN},
- {"<a><![CDATA<a/>", XML_ERROR_INVALID_TOKEN},
-
- {"<a><![CDATA[<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION},
- {"<a><![CDATA[]<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION},
- {"<a><![CDATA[]]<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION}};
-
- size_t i = 0;
- for (; i < sizeof(cases) / sizeof(struct CaseData); i++) {
- const enum XML_Status actualStatus = _XML_Parse_SINGLE_BYTES(
- g_parser, cases[i].text, (int)strlen(cases[i].text), XML_TRUE);
- const enum XML_Error actualError = XML_GetErrorCode(g_parser);
-
- assert(actualStatus == XML_STATUS_ERROR);
-
- if (actualError != cases[i].expectedError) {
- char message[100];
- sprintf(message,
- "Expected error %d but got error %d for case %u: \"%s\"\n",
- cases[i].expectedError, actualError, (unsigned int)i + 1,
- cases[i].text);
- fail(message);
- }
-
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* Test failures in UTF-16 CDATA */
-#ifndef XML_MIN_SIZE /* FIXME workaround -DXML_MIN_SIZE + ASan (issue #332) */
-START_TEST(test_bad_cdata_utf16) {
- struct CaseData {
- size_t text_bytes;
- const char *text;
- enum XML_Error expected_error;
- };
-
- const char prolog[] = "\0<\0?\0x\0m\0l\0"
- " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
- " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
- "1\0"
- "6\0'"
- "\0?\0>\0\n"
- "\0<\0a\0>";
- struct CaseData cases[] = {
- {1, "\0", XML_ERROR_UNCLOSED_TOKEN},
- {2, "\0<", XML_ERROR_UNCLOSED_TOKEN},
- {3, "\0<\0", XML_ERROR_UNCLOSED_TOKEN},
- {4, "\0<\0!", XML_ERROR_UNCLOSED_TOKEN},
- {5, "\0<\0!\0", XML_ERROR_UNCLOSED_TOKEN},
- {6, "\0<\0!\0[", XML_ERROR_UNCLOSED_TOKEN},
- {7, "\0<\0!\0[\0", XML_ERROR_UNCLOSED_TOKEN},
- {8, "\0<\0!\0[\0C", XML_ERROR_UNCLOSED_TOKEN},
- {9, "\0<\0!\0[\0C\0", XML_ERROR_UNCLOSED_TOKEN},
- {10, "\0<\0!\0[\0C\0D", XML_ERROR_UNCLOSED_TOKEN},
- {11, "\0<\0!\0[\0C\0D\0", XML_ERROR_UNCLOSED_TOKEN},
- {12, "\0<\0!\0[\0C\0D\0A", XML_ERROR_UNCLOSED_TOKEN},
- {13, "\0<\0!\0[\0C\0D\0A\0", XML_ERROR_UNCLOSED_TOKEN},
- {14, "\0<\0!\0[\0C\0D\0A\0T", XML_ERROR_UNCLOSED_TOKEN},
- {15, "\0<\0!\0[\0C\0D\0A\0T\0", XML_ERROR_UNCLOSED_TOKEN},
- {16, "\0<\0!\0[\0C\0D\0A\0T\0A", XML_ERROR_UNCLOSED_TOKEN},
- {17, "\0<\0!\0[\0C\0D\0A\0T\0A\0", XML_ERROR_UNCLOSED_TOKEN},
- {18, "\0<\0!\0[\0C\0D\0A\0T\0A\0[", XML_ERROR_UNCLOSED_CDATA_SECTION},
- {19, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0", XML_ERROR_UNCLOSED_CDATA_SECTION},
- {20, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z", XML_ERROR_UNCLOSED_CDATA_SECTION},
- /* Now add a four-byte UTF-16 character */
- {21, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8",
- XML_ERROR_UNCLOSED_CDATA_SECTION},
- {22, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34", XML_ERROR_PARTIAL_CHAR},
- {23, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34\xdd",
- XML_ERROR_PARTIAL_CHAR},
- {24, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34\xdd\x5e",
- XML_ERROR_UNCLOSED_CDATA_SECTION}};
- size_t i;
-
- for (i = 0; i < sizeof(cases) / sizeof(struct CaseData); i++) {
- enum XML_Status actual_status;
- enum XML_Error actual_error;
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, prolog, (int)sizeof(prolog) - 1,
- XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- actual_status = _XML_Parse_SINGLE_BYTES(g_parser, cases[i].text,
- (int)cases[i].text_bytes, XML_TRUE);
- assert(actual_status == XML_STATUS_ERROR);
- actual_error = XML_GetErrorCode(g_parser);
- if (actual_error != cases[i].expected_error) {
- char message[1024];
-
- sprintf(message,
- "Expected error %d (%" XML_FMT_STR "), got %d (%" XML_FMT_STR
- ") for case %lu\n",
- cases[i].expected_error, XML_ErrorString(cases[i].expected_error),
- actual_error, XML_ErrorString(actual_error),
- (long unsigned)(i + 1));
- fail(message);
- }
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-#endif /* ifndef XML_MIN_SIZE */
-
-static const char *long_cdata_text
- = "<s><![CDATA["
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "012345678901234567890123456789012345678901234567890123456789"
- "]]></s>";
-
-/* Test stopping the parser in cdata handler */
-START_TEST(test_stop_parser_between_cdata_calls) {
- const char *text = long_cdata_text;
-
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- resumable = XML_FALSE;
- expect_failure(text, XML_ERROR_ABORTED, "Parse not aborted in CDATA handler");
-}
-END_TEST
-
-/* Test suspending the parser in cdata handler */
-START_TEST(test_suspend_parser_between_cdata_calls) {
- const char *text = long_cdata_text;
- enum XML_Status result;
-
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- resumable = XML_TRUE;
- result = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
- if (result != XML_STATUS_SUSPENDED) {
- if (result == XML_STATUS_ERROR)
- xml_failure(g_parser);
- fail("Parse not suspended in CDATA handler");
- }
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test memory allocation functions */
-START_TEST(test_memory_allocation) {
- char *buffer = (char *)XML_MemMalloc(g_parser, 256);
- char *p;
-
- if (buffer == NULL) {
- fail("Allocation failed");
- } else {
- /* Try writing to memory; some OSes try to cheat! */
- buffer[0] = 'T';
- buffer[1] = 'E';
- buffer[2] = 'S';
- buffer[3] = 'T';
- buffer[4] = '\0';
- if (strcmp(buffer, "TEST") != 0) {
- fail("Memory not writable");
- } else {
- p = (char *)XML_MemRealloc(g_parser, buffer, 512);
- if (p == NULL) {
- fail("Reallocation failed");
- } else {
- /* Write again, just to be sure */
- buffer = p;
- buffer[0] = 'V';
- if (strcmp(buffer, "VEST") != 0) {
- fail("Reallocated memory not writable");
- }
- }
- }
- XML_MemFree(g_parser, buffer);
- }
-}
-END_TEST
-
-static void XMLCALL
-record_default_handler(void *userData, const XML_Char *s, int len) {
- UNUSED_P(s);
- UNUSED_P(len);
- CharData_AppendXMLChars((CharData *)userData, XCS("D"), 1);
-}
-
-static void XMLCALL
-record_cdata_handler(void *userData, const XML_Char *s, int len) {
- UNUSED_P(s);
- UNUSED_P(len);
- CharData_AppendXMLChars((CharData *)userData, XCS("C"), 1);
- XML_DefaultCurrent(g_parser);
-}
-
-static void XMLCALL
-record_cdata_nodefault_handler(void *userData, const XML_Char *s, int len) {
- UNUSED_P(s);
- UNUSED_P(len);
- CharData_AppendXMLChars((CharData *)userData, XCS("c"), 1);
-}
-
-static void XMLCALL
-record_skip_handler(void *userData, const XML_Char *entityName,
- int is_parameter_entity) {
- UNUSED_P(entityName);
- CharData_AppendXMLChars((CharData *)userData,
- is_parameter_entity ? XCS("E") : XCS("e"), 1);
-}
-
-/* Test XML_DefaultCurrent() passes handling on correctly */
-START_TEST(test_default_current) {
- const char *text = "<doc>hell]</doc>";
- const char *entity_text = "<!DOCTYPE doc [\n"
- "<!ENTITY entity '&#37;'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
- CharData storage;
-
- XML_SetDefaultHandler(g_parser, record_default_handler);
- XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS("DCDCDCDCDCDD"));
-
- /* Again, without the defaulting */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandler(g_parser, record_default_handler);
- XML_SetCharacterDataHandler(g_parser, record_cdata_nodefault_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS("DcccccD"));
-
- /* Now with an internal entity to complicate matters */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandler(g_parser, record_default_handler);
- XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
- XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* The default handler suppresses the entity */
- CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDDD"));
-
- /* Again, with a skip handler */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandler(g_parser, record_default_handler);
- XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
- XML_SetSkippedEntityHandler(g_parser, record_skip_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
- XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* The default handler suppresses the entity */
- CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDeD"));
-
- /* This time, allow the entity through */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandlerExpand(g_parser, record_default_handler);
- XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
- XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDCDD"));
-
- /* Finally, without passing the cdata to the default handler */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandlerExpand(g_parser, record_default_handler);
- XML_SetCharacterDataHandler(g_parser, record_cdata_nodefault_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
- XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDcD"));
-}
-END_TEST
-
-/* Test DTD element parsing code paths */
-START_TEST(test_dtd_elements) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc (chapter)>\n"
- "<!ELEMENT chapter (#PCDATA)>\n"
- "]>\n"
- "<doc><chapter>Wombats are go</chapter></doc>";
-
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test foreign DTD handling */
-START_TEST(test_set_foreign_dtd) {
- const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n";
- const char *text2 = "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- /* Check hash salt is passed through too */
- XML_SetHashSalt(g_parser, 0x12345678);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- /* Add a default handler to exercise more code paths */
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
- if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
- fail("Could not set foreign DTD");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- /* Ensure that trying to set the DTD after parsing has started
- * is faulted, even if it's the same setting.
- */
- if (XML_UseForeignDTD(g_parser, XML_TRUE)
- != XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING)
- fail("Failed to reject late foreign DTD setting");
- /* Ditto for the hash salt */
- if (XML_SetHashSalt(g_parser, 0x23456789))
- fail("Failed to reject late hash salt change");
-
- /* Now finish the parse */
- if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test foreign DTD handling with a failing NotStandalone handler */
-START_TEST(test_foreign_dtd_not_standalone) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
- if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
- fail("Could not set foreign DTD");
- expect_failure(text, XML_ERROR_NOT_STANDALONE,
- "NotStandalonehandler failed to reject");
-}
-END_TEST
-
-/* Test invalid character in a foreign DTD is faulted */
-START_TEST(test_invalid_foreign_dtd) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<doc>&entity;</doc>";
- ExtFaults test_data
- = {"$", "Dollar not faulted", NULL, XML_ERROR_INVALID_TOKEN};
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_UseForeignDTD(g_parser, XML_TRUE);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Bad DTD should not have been accepted");
-}
-END_TEST
-
-/* Test foreign DTD use with a doctype */
-START_TEST(test_foreign_dtd_with_doctype) {
- const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc [<!ENTITY entity 'hello world'>]>\n";
- const char *text2 = "<doc>&entity;</doc>";
- ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
-
- /* Check hash salt is passed through too */
- XML_SetHashSalt(g_parser, 0x12345678);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &test_data);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- /* Add a default handler to exercise more code paths */
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
- if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
- fail("Could not set foreign DTD");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- /* Ensure that trying to set the DTD after parsing has started
- * is faulted, even if it's the same setting.
- */
- if (XML_UseForeignDTD(g_parser, XML_TRUE)
- != XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING)
- fail("Failed to reject late foreign DTD setting");
- /* Ditto for the hash salt */
- if (XML_SetHashSalt(g_parser, 0x23456789))
- fail("Failed to reject late hash salt change");
-
- /* Now finish the parse */
- if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test XML_UseForeignDTD with no external subset present */
-static int XMLCALL
-external_entity_null_loader(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- UNUSED_P(parser);
- UNUSED_P(context);
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_foreign_dtd_without_external_subset) {
- const char *text = "<!DOCTYPE doc [<!ENTITY foo 'bar'>]>\n"
- "<doc>&foo;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, NULL);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
- XML_UseForeignDTD(g_parser, XML_TRUE);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_empty_foreign_dtd) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<doc>&entity;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
- XML_UseForeignDTD(g_parser, XML_TRUE);
- expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
- "Undefined entity not faulted");
-}
-END_TEST
-
-/* Test XML Base is set and unset appropriately */
-START_TEST(test_set_base) {
- const XML_Char *old_base;
- const XML_Char *new_base = XCS("/local/file/name.xml");
-
- old_base = XML_GetBase(g_parser);
- if (XML_SetBase(g_parser, new_base) != XML_STATUS_OK)
- fail("Unable to set base");
- if (xcstrcmp(XML_GetBase(g_parser), new_base) != 0)
- fail("Base setting not correct");
- if (XML_SetBase(g_parser, NULL) != XML_STATUS_OK)
- fail("Unable to NULL base");
- if (XML_GetBase(g_parser) != NULL)
- fail("Base setting not nulled");
- XML_SetBase(g_parser, old_base);
-}
-END_TEST
-
-/* Test attribute counts, indexing, etc */
-typedef struct attrInfo {
- const XML_Char *name;
- const XML_Char *value;
-} AttrInfo;
-
-typedef struct elementInfo {
- const XML_Char *name;
- int attr_count;
- const XML_Char *id_name;
- AttrInfo *attributes;
-} ElementInfo;
-
-static void XMLCALL
-counting_start_element_handler(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- ElementInfo *info = (ElementInfo *)userData;
- AttrInfo *attr;
- int count, id, i;
-
- while (info->name != NULL) {
- if (! xcstrcmp(name, info->name))
- break;
- info++;
- }
- if (info->name == NULL)
- fail("Element not recognised");
- /* The attribute count is twice what you might expect. It is a
- * count of items in atts, an array which contains alternating
- * attribute names and attribute values. For the naive user this
- * is possibly a little unexpected, but it is what the
- * documentation in expat.h tells us to expect.
- */
- count = XML_GetSpecifiedAttributeCount(g_parser);
- if (info->attr_count * 2 != count) {
- fail("Not got expected attribute count");
- return;
- }
- id = XML_GetIdAttributeIndex(g_parser);
- if (id == -1 && info->id_name != NULL) {
- fail("ID not present");
- return;
- }
- if (id != -1 && xcstrcmp(atts[id], info->id_name)) {
- fail("ID does not have the correct name");
- return;
- }
- for (i = 0; i < info->attr_count; i++) {
- attr = info->attributes;
- while (attr->name != NULL) {
- if (! xcstrcmp(atts[0], attr->name))
- break;
- attr++;
- }
- if (attr->name == NULL) {
- fail("Attribute not recognised");
- return;
- }
- if (xcstrcmp(atts[1], attr->value)) {
- fail("Attribute has wrong value");
- return;
- }
- /* Remember, two entries in atts per attribute (see above) */
- atts += 2;
- }
-}
-
-START_TEST(test_attributes) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc (tag)>\n"
- "<!ATTLIST doc id ID #REQUIRED>\n"
- "]>"
- "<doc a='1' id='one' b='2'>"
- "<tag c='3'/>"
- "</doc>";
- AttrInfo doc_info[] = {{XCS("a"), XCS("1")},
- {XCS("b"), XCS("2")},
- {XCS("id"), XCS("one")},
- {NULL, NULL}};
- AttrInfo tag_info[] = {{XCS("c"), XCS("3")}, {NULL, NULL}};
- ElementInfo info[] = {{XCS("doc"), 3, XCS("id"), NULL},
- {XCS("tag"), 1, NULL, NULL},
- {NULL, 0, NULL, NULL}};
- info[0].attributes = doc_info;
- info[1].attributes = tag_info;
-
- XML_SetStartElementHandler(g_parser, counting_start_element_handler);
- XML_SetUserData(g_parser, info);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test reset works correctly in the middle of processing an internal
- * entity. Exercises some obscure code in XML_ParserReset().
- */
-START_TEST(test_reset_in_entity) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY wombat 'wom'>\n"
- "<!ENTITY entity 'hi &wom; there'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
- XML_ParsingStatus status;
-
- resumable = XML_TRUE;
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- XML_GetParsingStatus(g_parser, &status);
- if (status.parsing != XML_SUSPENDED)
- fail("Parsing status not SUSPENDED");
- XML_ParserReset(g_parser, NULL);
- XML_GetParsingStatus(g_parser, &status);
- if (status.parsing != XML_INITIALIZED)
- fail("Parsing status doesn't reset to INITIALIZED");
-}
-END_TEST
-
-/* Test that resume correctly passes through parse errors */
-START_TEST(test_resume_invalid_parse) {
- const char *text = "<doc>Hello</doc"; /* Missing closing wedge */
-
- resumable = XML_TRUE;
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (XML_ResumeParser(g_parser) == XML_STATUS_OK)
- fail("Resumed invalid parse not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_UNCLOSED_TOKEN)
- fail("Invalid parse not correctly faulted");
-}
-END_TEST
-
-/* Test that re-suspended parses are correctly passed through */
-START_TEST(test_resume_resuspended) {
- const char *text = "<doc>Hello<meep/>world</doc>";
-
- resumable = XML_TRUE;
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- resumable = XML_TRUE;
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
- fail("Resumption not suspended");
- /* This one should succeed and finish up */
- if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that CDATA shows up correctly through a default handler */
-START_TEST(test_cdata_default) {
- const char *text = "<doc><![CDATA[Hello\nworld]]></doc>";
- const XML_Char *expected = XCS("<doc><![CDATA[Hello\nworld]]></doc>");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetDefaultHandler(g_parser, accumulate_characters);
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test resetting a subordinate parser does exactly nothing */
-static int XMLCALL
-external_entity_resetter(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<!ELEMENT doc (#PCDATA)*>";
- XML_Parser ext_parser;
- XML_ParsingStatus status;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_GetParsingStatus(ext_parser, &status);
- if (status.parsing != XML_INITIALIZED) {
- fail("Parsing status is not INITIALIZED");
- return XML_STATUS_ERROR;
- }
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(parser);
- return XML_STATUS_ERROR;
- }
- XML_GetParsingStatus(ext_parser, &status);
- if (status.parsing != XML_FINISHED) {
- fail("Parsing status is not FINISHED");
- return XML_STATUS_ERROR;
- }
- /* Check we can't parse here */
- if (XML_Parse(ext_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Parsing when finished not faulted");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_FINISHED)
- fail("Parsing when finished faulted with wrong code");
- XML_ParserReset(ext_parser, NULL);
- XML_GetParsingStatus(ext_parser, &status);
- if (status.parsing != XML_FINISHED) {
- fail("Parsing status not still FINISHED");
- return XML_STATUS_ERROR;
- }
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_subordinate_reset) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_resetter);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test suspending a subordinate parser */
-
-static void XMLCALL
-entity_suspending_decl_handler(void *userData, const XML_Char *name,
- XML_Content *model) {
- XML_Parser ext_parser = (XML_Parser)userData;
-
- UNUSED_P(name);
- if (XML_StopParser(ext_parser, XML_TRUE) != XML_STATUS_ERROR)
- fail("Attempting to suspend a subordinate parser not faulted");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_SUSPEND_PE)
- fail("Suspending subordinate parser get wrong code");
- XML_SetElementDeclHandler(ext_parser, NULL);
- XML_FreeContentModel(g_parser, model);
-}
-
-static int XMLCALL
-external_entity_suspender(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<!ELEMENT doc (#PCDATA)*>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetElementDeclHandler(ext_parser, entity_suspending_decl_handler);
- XML_SetUserData(ext_parser, ext_parser);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(ext_parser);
- return XML_STATUS_ERROR;
- }
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_subordinate_suspend) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_suspender);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test suspending a subordinate parser from an XML declaration */
-/* Increases code coverage of the tests */
-static void XMLCALL
-entity_suspending_xdecl_handler(void *userData, const XML_Char *version,
- const XML_Char *encoding, int standalone) {
- XML_Parser ext_parser = (XML_Parser)userData;
-
- UNUSED_P(version);
- UNUSED_P(encoding);
- UNUSED_P(standalone);
- XML_StopParser(ext_parser, resumable);
- XML_SetXmlDeclHandler(ext_parser, NULL);
-}
-
-static int XMLCALL
-external_entity_suspend_xmldecl(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>";
- XML_Parser ext_parser;
- XML_ParsingStatus status;
- enum XML_Status rc;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
- XML_SetUserData(ext_parser, ext_parser);
- rc = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
- XML_GetParsingStatus(ext_parser, &status);
- if (resumable) {
- if (rc == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- if (status.parsing != XML_SUSPENDED)
- fail("Ext Parsing status not SUSPENDED");
- } else {
- if (rc != XML_STATUS_ERROR)
- fail("Ext parsing not aborted");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_ABORTED)
- xml_failure(ext_parser);
- if (status.parsing != XML_FINISHED)
- fail("Ext Parsing status not FINISHED");
- }
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_subordinate_xdecl_suspend) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ENTITY entity SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_suspend_xmldecl);
- resumable = XML_TRUE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_subordinate_xdecl_abort) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ENTITY entity SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_suspend_xmldecl);
- resumable = XML_FALSE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test external entity fault handling with suspension */
-static int XMLCALL
-external_entity_suspending_faulter(XML_Parser parser, const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId) {
- XML_Parser ext_parser;
- ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
- void *buffer;
- int parse_len = (int)strlen(fault->parse_text);
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
- XML_SetUserData(ext_parser, ext_parser);
- resumable = XML_TRUE;
- buffer = XML_GetBuffer(ext_parser, parse_len);
- if (buffer == NULL)
- fail("Could not allocate parse buffer");
- assert(buffer != NULL);
- memcpy(buffer, fault->parse_text, parse_len);
- if (XML_ParseBuffer(ext_parser, parse_len, XML_FALSE) != XML_STATUS_SUSPENDED)
- fail("XML declaration did not suspend");
- if (XML_ResumeParser(ext_parser) != XML_STATUS_OK)
- xml_failure(ext_parser);
- if (XML_ParseBuffer(ext_parser, 0, XML_TRUE) != XML_STATUS_ERROR)
- fail(fault->fail_text);
- if (XML_GetErrorCode(ext_parser) != fault->error)
- xml_failure(ext_parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_ext_entity_invalid_suspended_parse) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtFaults faults[]
- = {{"<?xml version='1.0' encoding='us-ascii'?><",
- "Incomplete element declaration not faulted", NULL,
- XML_ERROR_UNCLOSED_TOKEN},
- {/* First two bytes of a three-byte char */
- "<?xml version='1.0' encoding='utf-8'?>\xe2\x82",
- "Incomplete character not faulted", NULL, XML_ERROR_PARTIAL_CHAR},
- {NULL, NULL, NULL, XML_ERROR_NONE}};
- ExtFaults *fault;
-
- for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser,
- external_entity_suspending_faulter);
- XML_SetUserData(g_parser, fault);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Parser did not report external entity error");
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* Test setting an explicit encoding */
-START_TEST(test_explicit_encoding) {
- const char *text1 = "<doc>Hello ";
- const char *text2 = " World</doc>";
-
- /* Just check that we can set the encoding to NULL before starting */
- if (XML_SetEncoding(g_parser, NULL) != XML_STATUS_OK)
- fail("Failed to initialise encoding to NULL");
- /* Say we are UTF-8 */
- if (XML_SetEncoding(g_parser, XCS("utf-8")) != XML_STATUS_OK)
- fail("Failed to set explicit encoding");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* Try to switch encodings mid-parse */
- if (XML_SetEncoding(g_parser, XCS("us-ascii")) != XML_STATUS_ERROR)
- fail("Allowed encoding change");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* Try now the parse is over */
- if (XML_SetEncoding(g_parser, NULL) != XML_STATUS_OK)
- fail("Failed to unset encoding");
-}
-END_TEST
-
-/* Test handling of trailing CR (rather than newline) */
-static void XMLCALL
-cr_cdata_handler(void *userData, const XML_Char *s, int len) {
- int *pfound = (int *)userData;
-
- /* Internal processing turns the CR into a newline for the
- * character data handler, but not for the default handler
- */
- if (len == 1 && (*s == XCS('\n') || *s == XCS('\r')))
- *pfound = 1;
-}
-
-START_TEST(test_trailing_cr) {
- const char *text = "<doc>\r";
- int found_cr;
-
- /* Try with a character handler, for code coverage */
- XML_SetCharacterDataHandler(g_parser, cr_cdata_handler);
- XML_SetUserData(g_parser, &found_cr);
- found_cr = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- fail("Failed to fault unclosed doc");
- if (found_cr == 0)
- fail("Did not catch the carriage return");
- XML_ParserReset(g_parser, NULL);
-
- /* Now with a default handler instead */
- XML_SetDefaultHandler(g_parser, cr_cdata_handler);
- XML_SetUserData(g_parser, &found_cr);
- found_cr = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- fail("Failed to fault unclosed doc");
- if (found_cr == 0)
- fail("Did not catch default carriage return");
-}
-END_TEST
-
-/* Test trailing CR in an external entity parse */
-static int XMLCALL
-external_entity_cr_catcher(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "\r";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetCharacterDataHandler(ext_parser, cr_cdata_handler);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-static int XMLCALL
-external_entity_bad_cr_catcher(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<tag>\r";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetCharacterDataHandler(ext_parser, cr_cdata_handler);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- fail("Async entity error not caught");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_ASYNC_ENTITY)
- xml_failure(ext_parser);
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_trailing_cr) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- int found_cr;
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_cr_catcher);
- XML_SetUserData(g_parser, &found_cr);
- found_cr = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_OK)
- xml_failure(g_parser);
- if (found_cr == 0)
- fail("No carriage return found");
- XML_ParserReset(g_parser, NULL);
-
- /* Try again with a different trailing CR */
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_bad_cr_catcher);
- XML_SetUserData(g_parser, &found_cr);
- found_cr = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_OK)
- xml_failure(g_parser);
- if (found_cr == 0)
- fail("No carriage return found");
-}
-END_TEST
-
-/* Test handling of trailing square bracket */
-static void XMLCALL
-rsqb_handler(void *userData, const XML_Char *s, int len) {
- int *pfound = (int *)userData;
-
- if (len == 1 && *s == XCS(']'))
- *pfound = 1;
-}
-
-START_TEST(test_trailing_rsqb) {
- const char *text8 = "<doc>]";
- const char text16[] = "\xFF\xFE<\000d\000o\000c\000>\000]\000";
- int found_rsqb;
- int text8_len = (int)strlen(text8);
-
- XML_SetCharacterDataHandler(g_parser, rsqb_handler);
- XML_SetUserData(g_parser, &found_rsqb);
- found_rsqb = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text8, text8_len, XML_TRUE)
- == XML_STATUS_OK)
- fail("Failed to fault unclosed doc");
- if (found_rsqb == 0)
- fail("Did not catch the right square bracket");
-
- /* Try again with a different encoding */
- XML_ParserReset(g_parser, NULL);
- XML_SetCharacterDataHandler(g_parser, rsqb_handler);
- XML_SetUserData(g_parser, &found_rsqb);
- found_rsqb = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text16, (int)sizeof(text16) - 1,
- XML_TRUE)
- == XML_STATUS_OK)
- fail("Failed to fault unclosed doc");
- if (found_rsqb == 0)
- fail("Did not catch the right square bracket");
-
- /* And finally with a default handler */
- XML_ParserReset(g_parser, NULL);
- XML_SetDefaultHandler(g_parser, rsqb_handler);
- XML_SetUserData(g_parser, &found_rsqb);
- found_rsqb = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text16, (int)sizeof(text16) - 1,
- XML_TRUE)
- == XML_STATUS_OK)
- fail("Failed to fault unclosed doc");
- if (found_rsqb == 0)
- fail("Did not catch the right square bracket");
-}
-END_TEST
-
-/* Test trailing right square bracket in an external entity parse */
-static int XMLCALL
-external_entity_rsqb_catcher(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<tag>]";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetCharacterDataHandler(ext_parser, rsqb_handler);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Async entity error not caught");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_ASYNC_ENTITY)
- xml_failure(ext_parser);
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_trailing_rsqb) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- int found_rsqb;
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_rsqb_catcher);
- XML_SetUserData(g_parser, &found_rsqb);
- found_rsqb = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_OK)
- xml_failure(g_parser);
- if (found_rsqb == 0)
- fail("No right square bracket found");
-}
-END_TEST
-
-/* Test CDATA handling in an external entity */
-static int XMLCALL
-external_entity_good_cdata_ascii(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<a><![CDATA[<greeting>Hello, world!</greeting>]]></a>";
- const XML_Char *expected = XCS("<greeting>Hello, world!</greeting>");
- CharData storage;
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- CharData_Init(&storage);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- XML_SetUserData(ext_parser, &storage);
- XML_SetCharacterDataHandler(ext_parser, accumulate_characters);
-
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- CharData_CheckXMLChars(&storage, expected);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_good_cdata) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_good_cdata_ascii);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_OK)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test user parameter settings */
-/* Variable holding the expected handler userData */
-static void *handler_data = NULL;
-/* Count of the number of times the comment handler has been invoked */
-static int comment_count = 0;
-/* Count of the number of skipped entities */
-static int skip_count = 0;
-/* Count of the number of times the XML declaration handler is invoked */
-static int xdecl_count = 0;
-
-static void XMLCALL
-xml_decl_handler(void *userData, const XML_Char *version,
- const XML_Char *encoding, int standalone) {
- UNUSED_P(version);
- UNUSED_P(encoding);
- if (userData != handler_data)
- fail("User data (xml decl) not correctly set");
- if (standalone != -1)
- fail("Standalone not flagged as not present in XML decl");
- xdecl_count++;
-}
-
-static void XMLCALL
-param_check_skip_handler(void *userData, const XML_Char *entityName,
- int is_parameter_entity) {
- UNUSED_P(entityName);
- UNUSED_P(is_parameter_entity);
- if (userData != handler_data)
- fail("User data (skip) not correctly set");
- skip_count++;
-}
-
-static void XMLCALL
-data_check_comment_handler(void *userData, const XML_Char *data) {
- UNUSED_P(data);
- /* Check that the userData passed through is what we expect */
- if (userData != handler_data)
- fail("User data (parser) not correctly set");
- /* Check that the user data in the parser is appropriate */
- if (XML_GetUserData(userData) != (void *)1)
- fail("User data in parser not correctly set");
- comment_count++;
-}
-
-static int XMLCALL
-external_entity_param_checker(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<!-- Subordinate parser -->\n"
- "<!ELEMENT doc (#PCDATA)*>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- handler_data = ext_parser;
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(parser);
- return XML_STATUS_ERROR;
- }
- handler_data = parser;
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_user_parameters) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!-- Primary parse -->\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;";
- const char *epilog = "<!-- Back to primary parser -->\n"
- "</doc>";
-
- comment_count = 0;
- skip_count = 0;
- xdecl_count = 0;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetXmlDeclHandler(g_parser, xml_decl_handler);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_param_checker);
- XML_SetCommentHandler(g_parser, data_check_comment_handler);
- XML_SetSkippedEntityHandler(g_parser, param_check_skip_handler);
- XML_UseParserAsHandlerArg(g_parser);
- XML_SetUserData(g_parser, (void *)1);
- handler_data = g_parser;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (comment_count != 2)
- fail("Comment handler not invoked enough times");
- /* Ensure we can't change policy mid-parse */
- if (XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_NEVER))
- fail("Changed param entity parsing policy while parsing");
- if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (comment_count != 3)
- fail("Comment handler not invoked enough times");
- if (skip_count != 1)
- fail("Skip handler not invoked enough times");
- if (xdecl_count != 1)
- fail("XML declaration handler not invoked");
-}
-END_TEST
-
-/* Test that an explicit external entity handler argument replaces
- * the parser as the first argument.
- *
- * We do not call the first parameter to the external entity handler
- * 'parser' for once, since the first time the handler is called it
- * will actually be a text string. We need to be able to access the
- * global 'parser' variable to create our external entity parser from,
- * since there are code paths we need to ensure get executed.
- */
-static int XMLCALL
-external_entity_ref_param_checker(XML_Parser parameter, const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<!ELEMENT doc (#PCDATA)*>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- if ((void *)parameter != handler_data)
- fail("External entity ref handler parameter not correct");
-
- /* Here we use the global 'parser' variable */
- ext_parser = XML_ExternalEntityParserCreate(g_parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_ref_parameter) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_ref_param_checker);
- /* Set a handler arg that is not NULL and not parser (which is
- * what NULL would cause to be passed.
- */
- XML_SetExternalEntityRefHandlerArg(g_parser, (void *)text);
- handler_data = (void *)text;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- /* Now try again with unset args */
- XML_ParserReset(g_parser, NULL);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_ref_param_checker);
- XML_SetExternalEntityRefHandlerArg(g_parser, NULL);
- handler_data = (void *)g_parser;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test the parsing of an empty string */
-START_TEST(test_empty_parse) {
- const char *text = "<doc></doc>";
- const char *partial = "<doc>";
-
- if (XML_Parse(g_parser, NULL, 0, XML_FALSE) == XML_STATUS_ERROR)
- fail("Parsing empty string faulted");
- if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
- fail("Parsing final empty string not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_ELEMENTS)
- fail("Parsing final empty string faulted for wrong reason");
-
- /* Now try with valid text before the empty end */
- XML_ParserReset(g_parser, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (XML_Parse(g_parser, NULL, 0, XML_TRUE) == XML_STATUS_ERROR)
- fail("Parsing final empty string faulted");
-
- /* Now try with invalid text before the empty end */
- XML_ParserReset(g_parser, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, partial, (int)strlen(partial),
- XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
- fail("Parsing final incomplete empty string not faulted");
-}
-END_TEST
-
-/* Test odd corners of the XML_GetBuffer interface */
-static enum XML_Status
-get_feature(enum XML_FeatureEnum feature_id, long *presult) {
- const XML_Feature *feature = XML_GetFeatureList();
-
- if (feature == NULL)
- return XML_STATUS_ERROR;
- for (; feature->feature != XML_FEATURE_END; feature++) {
- if (feature->feature == feature_id) {
- *presult = feature->value;
- return XML_STATUS_OK;
- }
- }
- return XML_STATUS_ERROR;
-}
-
-/* Having an element name longer than 1024 characters exercises some
- * of the pool allocation code in the parser that otherwise does not
- * get executed. The count at the end of the line is the number of
- * characters (bytes) in the element name by that point.x
- */
-static const char *get_buffer_test_text
- = "<documentwitharidiculouslylongelementnametotease" /* 0x030 */
- "aparticularcorneroftheallocationinXML_GetBuffers" /* 0x060 */
- "othatwecanimprovethecoverageyetagain012345678901" /* 0x090 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0c0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0f0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x120 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x150 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x180 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1b0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1e0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x210 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x240 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x270 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2a0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2d0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x300 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x330 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x360 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x390 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3c0 */
- "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3f0 */
- "123456789abcdef0123456789abcdef0123456789>\n<ef0"; /* 0x420 */
-
-/* Test odd corners of the XML_GetBuffer interface */
-START_TEST(test_get_buffer_1) {
- const char *text = get_buffer_test_text;
- void *buffer;
- long context_bytes;
-
- /* Attempt to allocate a negative length buffer */
- if (XML_GetBuffer(g_parser, -12) != NULL)
- fail("Negative length buffer not failed");
-
- /* Now get a small buffer and extend it past valid length */
- buffer = XML_GetBuffer(g_parser, 1536);
- if (buffer == NULL)
- fail("1.5K buffer failed");
- assert(buffer != NULL);
- memcpy(buffer, text, strlen(text));
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (XML_GetBuffer(g_parser, INT_MAX) != NULL)
- fail("INT_MAX buffer not failed");
-
- /* Now try extending it a more reasonable but still too large
- * amount. The allocator in XML_GetBuffer() doubles the buffer
- * size until it exceeds the requested amount or INT_MAX. If it
- * exceeds INT_MAX, it rejects the request, so we want a request
- * between INT_MAX and INT_MAX/2. A gap of 1K seems comfortable,
- * with an extra byte just to ensure that the request is off any
- * boundary. The request will be inflated internally by
- * XML_CONTEXT_BYTES (if defined), so we subtract that from our
- * request.
- */
- if (get_feature(XML_FEATURE_CONTEXT_BYTES, &context_bytes) != XML_STATUS_OK)
- context_bytes = 0;
- if (XML_GetBuffer(g_parser, INT_MAX - (context_bytes + 1025)) != NULL)
- fail("INT_MAX- buffer not failed");
-
- /* Now try extending it a carefully crafted amount */
- if (XML_GetBuffer(g_parser, 1000) == NULL)
- fail("1000 buffer failed");
-}
-END_TEST
-
-/* Test more corners of the XML_GetBuffer interface */
-START_TEST(test_get_buffer_2) {
- const char *text = get_buffer_test_text;
- void *buffer;
-
- /* Now get a decent buffer */
- buffer = XML_GetBuffer(g_parser, 1536);
- if (buffer == NULL)
- fail("1.5K buffer failed");
- assert(buffer != NULL);
- memcpy(buffer, text, strlen(text));
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- /* Extend it, to catch a different code path */
- if (XML_GetBuffer(g_parser, 1024) == NULL)
- fail("1024 buffer failed");
-}
-END_TEST
-
-/* Test position information macros */
-START_TEST(test_byte_info_at_end) {
- const char *text = "<doc></doc>";
-
- if (XML_GetCurrentByteIndex(g_parser) != -1
- || XML_GetCurrentByteCount(g_parser) != 0)
- fail("Byte index/count incorrect at start of parse");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* At end, the count will be zero and the index the end of string */
- if (XML_GetCurrentByteCount(g_parser) != 0)
- fail("Terminal byte count incorrect");
- if (XML_GetCurrentByteIndex(g_parser) != (XML_Index)strlen(text))
- fail("Terminal byte index incorrect");
-}
-END_TEST
-
-/* Test position information from errors */
-#define PRE_ERROR_STR "<doc></"
-#define POST_ERROR_STR "wombat></doc>"
-START_TEST(test_byte_info_at_error) {
- const char *text = PRE_ERROR_STR POST_ERROR_STR;
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- fail("Syntax error not faulted");
- if (XML_GetCurrentByteCount(g_parser) != 0)
- fail("Error byte count incorrect");
- if (XML_GetCurrentByteIndex(g_parser) != strlen(PRE_ERROR_STR))
- fail("Error byte index incorrect");
-}
-END_TEST
-#undef PRE_ERROR_STR
-#undef POST_ERROR_STR
-
-/* Test position information in handler */
-typedef struct ByteTestData {
- int start_element_len;
- int cdata_len;
- int total_string_len;
-} ByteTestData;
-
-static void
-byte_character_handler(void *userData, const XML_Char *s, int len) {
-#ifdef XML_CONTEXT_BYTES
- int offset, size;
- const char *buffer;
- ByteTestData *data = (ByteTestData *)userData;
-
- UNUSED_P(s);
- buffer = XML_GetInputContext(g_parser, &offset, &size);
- if (buffer == NULL)
- fail("Failed to get context buffer");
- if (offset != data->start_element_len)
- fail("Context offset in unexpected position");
- if (len != data->cdata_len)
- fail("CDATA length reported incorrectly");
- if (size != data->total_string_len)
- fail("Context size is not full buffer");
- if (XML_GetCurrentByteIndex(g_parser) != offset)
- fail("Character byte index incorrect");
- if (XML_GetCurrentByteCount(g_parser) != len)
- fail("Character byte count incorrect");
-#else
- UNUSED_P(s);
- UNUSED_P(userData);
- UNUSED_P(len);
-#endif
-}
-
-#define START_ELEMENT "<e>"
-#define CDATA_TEXT "Hello"
-#define END_ELEMENT "</e>"
-START_TEST(test_byte_info_at_cdata) {
- const char *text = START_ELEMENT CDATA_TEXT END_ELEMENT;
- int offset, size;
- ByteTestData data;
-
- /* Check initial context is empty */
- if (XML_GetInputContext(g_parser, &offset, &size) != NULL)
- fail("Unexpected context at start of parse");
-
- data.start_element_len = (int)strlen(START_ELEMENT);
- data.cdata_len = (int)strlen(CDATA_TEXT);
- data.total_string_len = (int)strlen(text);
- XML_SetCharacterDataHandler(g_parser, byte_character_handler);
- XML_SetUserData(g_parser, &data);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE) != XML_STATUS_OK)
- xml_failure(g_parser);
-}
-END_TEST
-#undef START_ELEMENT
-#undef CDATA_TEXT
-#undef END_ELEMENT
-
-/* Test predefined entities are correctly recognised */
-START_TEST(test_predefined_entities) {
- const char *text = "<doc>&lt;&gt;&amp;&quot;&apos;</doc>";
- const XML_Char *expected = XCS("<doc>&lt;&gt;&amp;&quot;&apos;</doc>");
- const XML_Char *result = XCS("<>&\"'");
- CharData storage;
-
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- /* run_character_check uses XML_SetCharacterDataHandler(), which
- * unfortunately heads off a code path that we need to exercise.
- */
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* The default handler doesn't translate the entities */
- CharData_CheckXMLChars(&storage, expected);
-
- /* Now try again and check the translation */
- XML_ParserReset(g_parser, NULL);
- run_character_check(text, result);
-}
-END_TEST
-
-/* Regression test that an invalid tag in an external parameter
- * reference in an external DTD is correctly faulted.
- *
- * Only a few specific tags are legal in DTDs ignoring comments and
- * processing instructions, all of which begin with an exclamation
- * mark. "<el/>" is not one of them, so the parser should raise an
- * error on encountering it.
- */
-static int XMLCALL
-external_entity_param(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text1 = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
- "<!ENTITY % e2 '%e1;'>\n"
- "%e1;\n";
- const char *text2 = "<!ELEMENT el EMPTY>\n"
- "<el/>\n";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(publicId);
- if (systemId == NULL)
- return XML_STATUS_OK;
-
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
-
- if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Inner DTD with invalid tag not rejected");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_EXTERNAL_ENTITY_HANDLING)
- xml_failure(ext_parser);
- } else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Invalid tag in external param not rejected");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_SYNTAX)
- xml_failure(ext_parser);
- } else {
- fail("Unknown system ID");
- }
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_invalid_tag_in_dtd) {
- const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
- "<doc></doc>\n";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_param);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Invalid tag IN DTD external param not rejected");
-}
-END_TEST
-
-/* Test entities not quite the predefined ones are not mis-recognised */
-START_TEST(test_not_predefined_entities) {
- const char *text[] = {"<doc>&pt;</doc>", "<doc>&amo;</doc>",
- "<doc>&quid;</doc>", "<doc>&apod;</doc>", NULL};
- int i = 0;
-
- while (text[i] != NULL) {
- expect_failure(text[i], XML_ERROR_UNDEFINED_ENTITY,
- "Undefined entity not rejected");
- XML_ParserReset(g_parser, NULL);
- i++;
- }
-}
-END_TEST
-
-/* Test conditional inclusion (IGNORE) */
-static int XMLCALL
-external_entity_load_ignore(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ignore_section) {
- const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc><e>&entity;</e></doc>";
- const XML_Char *expected
- = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&entity;");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &storage);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore);
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
- XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, dummy_start_element);
- XML_SetEndElementHandler(g_parser, dummy_end_element);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-static int XMLCALL
-external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId) {
- const char text[] =
- /* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
- "<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0"
- "<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0"
- "(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ignore_section_utf16) {
- const char text[] =
- /* <!DOCTYPE d SYSTEM 's'> */
- "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
- "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0"
- /* <d><e>&en;</e></d> */
- "<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0";
- const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &storage);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16);
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
- XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, dummy_start_element);
- XML_SetEndElementHandler(g_parser, dummy_end_element);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-static int XMLCALL
-external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId) {
- const char text[] =
- /* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
- "\0<\0!\0[\0I\0G\0N\0O\0R\0E\0["
- "\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 "
- "\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ignore_section_utf16_be) {
- const char text[] =
- /* <!DOCTYPE d SYSTEM 's'> */
- "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
- "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n"
- /* <d><e>&en;</e></d> */
- "\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>";
- const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &storage);
- XML_SetExternalEntityRefHandler(g_parser,
- external_entity_load_ignore_utf16_be);
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
- XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, dummy_start_element);
- XML_SetEndElementHandler(g_parser, dummy_end_element);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test mis-formatted conditional exclusion */
-START_TEST(test_bad_ignore_section) {
- const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc><e>&entity;</e></doc>";
- ExtFaults faults[]
- = {{"<![IGNORE[<!ELEM", "Broken-off declaration not faulted", NULL,
- XML_ERROR_SYNTAX},
- {"<![IGNORE[\x01]]>", "Invalid XML character not faulted", NULL,
- XML_ERROR_INVALID_TOKEN},
- {/* FIrst two bytes of a three-byte char */
- "<![IGNORE[\xe2\x82", "Partial XML character not faulted", NULL,
- XML_ERROR_PARTIAL_CHAR},
- {NULL, NULL, NULL, XML_ERROR_NONE}};
- ExtFaults *fault;
-
- for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_SetUserData(g_parser, fault);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Incomplete IGNORE section not failed");
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* Test recursive parsing */
-static int XMLCALL
-external_entity_valuer(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text1 = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
- "<!ENTITY % e2 '%e1;'>\n"
- "%e1;\n";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(publicId);
- if (systemId == NULL)
- return XML_STATUS_OK;
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- } else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
- ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
- enum XML_Status status;
- enum XML_Error error;
-
- status = _XML_Parse_SINGLE_BYTES(ext_parser, fault->parse_text,
- (int)strlen(fault->parse_text), XML_TRUE);
- if (fault->error == XML_ERROR_NONE) {
- if (status == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- } else {
- if (status != XML_STATUS_ERROR)
- fail(fault->fail_text);
- error = XML_GetErrorCode(ext_parser);
- if (error != fault->error
- && (fault->error != XML_ERROR_XML_DECL
- || error != XML_ERROR_TEXT_DECL))
- xml_failure(ext_parser);
- }
- }
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_external_entity_values) {
- const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
- "<doc></doc>\n";
- ExtFaults data_004_2[] = {
- {"<!ATTLIST doc a1 CDATA 'value'>", NULL, NULL, XML_ERROR_NONE},
- {"<!ATTLIST $doc a1 CDATA 'value'>", "Invalid token not faulted", NULL,
- XML_ERROR_INVALID_TOKEN},
- {"'wombat", "Unterminated string not faulted", NULL,
- XML_ERROR_UNCLOSED_TOKEN},
- {"\xe2\x82", "Partial UTF-8 character not faulted", NULL,
- XML_ERROR_PARTIAL_CHAR},
- {"<?xml version='1.0' encoding='utf-8'?>\n", NULL, NULL, XML_ERROR_NONE},
- {"<?xml?>", "Malformed XML declaration not faulted", NULL,
- XML_ERROR_XML_DECL},
- {/* UTF-8 BOM */
- "\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>", NULL, NULL,
- XML_ERROR_NONE},
- {"<?xml version='1.0' encoding='utf-8'?>\n$",
- "Invalid token after text declaration not faulted", NULL,
- XML_ERROR_INVALID_TOKEN},
- {"<?xml version='1.0' encoding='utf-8'?>\n'wombat",
- "Unterminated string after text decl not faulted", NULL,
- XML_ERROR_UNCLOSED_TOKEN},
- {"<?xml version='1.0' encoding='utf-8'?>\n\xe2\x82",
- "Partial UTF-8 character after text decl not faulted", NULL,
- XML_ERROR_PARTIAL_CHAR},
- {"%e1;", "Recursive parameter entity not faulted", NULL,
- XML_ERROR_RECURSIVE_ENTITY_REF},
- {NULL, NULL, NULL, XML_ERROR_NONE}};
- int i;
-
- for (i = 0; data_004_2[i].parse_text != NULL; i++) {
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_valuer);
- XML_SetUserData(g_parser, &data_004_2[i]);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- XML_ParserReset(g_parser, NULL);
- }
-}
-END_TEST
-
-/* Test the recursive parse interacts with a not standalone handler */
-static int XMLCALL
-external_entity_not_standalone(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text1 = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 SYSTEM 'bar'>\n"
- "%e1;\n";
- const char *text2 = "<!ATTLIST doc a1 CDATA 'value'>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(publicId);
- if (systemId == NULL)
- return XML_STATUS_OK;
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (! xcstrcmp(systemId, XCS("foo"))) {
- XML_SetNotStandaloneHandler(ext_parser, reject_not_standalone_handler);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Expected not standalone rejection");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_NOT_STANDALONE)
- xml_failure(ext_parser);
- XML_SetNotStandaloneHandler(ext_parser, NULL);
- XML_ParserFree(ext_parser);
- return XML_STATUS_ERROR;
- } else if (! xcstrcmp(systemId, XCS("bar"))) {
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- }
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_not_standalone) {
- const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc></doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_not_standalone);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Standalone rejection not caught");
-}
-END_TEST
-
-static int XMLCALL
-external_entity_value_aborter(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text1 = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
- "<!ENTITY % e2 '%e1;'>\n"
- "%e1;\n";
- const char *text2 = "<?xml version='1.0' encoding='utf-8'?>";
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(publicId);
- if (systemId == NULL)
- return XML_STATUS_OK;
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
- if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
- }
- if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
- XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
- XML_SetUserData(ext_parser, ext_parser);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Aborted parse not faulted");
- if (XML_GetErrorCode(ext_parser) != XML_ERROR_ABORTED)
- xml_failure(ext_parser);
- }
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_ext_entity_value_abort) {
- const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
- "<doc></doc>\n";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_value_aborter);
- resumable = XML_FALSE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_bad_public_doctype) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!DOCTYPE doc PUBLIC '{BadName}' 'test'>\n"
- "<doc></doc>";
-
- /* Setting a handler provokes a particular code path */
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
- dummy_end_doctype_handler);
- expect_failure(text, XML_ERROR_PUBLICID, "Bad Public ID not failed");
-}
-END_TEST
-
-/* Test based on ibm/valid/P32/ibm32v04.xml */
-START_TEST(test_attribute_enum_value) {
- const char *text = "<?xml version='1.0' standalone='no'?>\n"
- "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
- "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
- ExtTest dtd_data
- = {"<!ELEMENT animal (#PCDATA|a)*>\n"
- "<!ELEMENT a EMPTY>\n"
- "<!ATTLIST animal xml:space (default|preserve) 'preserve'>",
- NULL, NULL};
- const XML_Char *expected = XCS("This is a \n \n\nyellow tiger");
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- XML_SetUserData(g_parser, &dtd_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- /* An attribute list handler provokes a different code path */
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- run_ext_character_check(text, &dtd_data, expected);
-}
-END_TEST
-
-/* Slightly bizarrely, the library seems to silently ignore entity
- * definitions for predefined entities, even when they are wrong. The
- * language of the XML 1.0 spec is somewhat unhelpful as to what ought
- * to happen, so this is currently treated as acceptable.
- */
-START_TEST(test_predefined_entity_redefinition) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY apos 'foo'>\n"
- "]>\n"
- "<doc>&apos;</doc>";
- run_character_check(text, XCS("'"));
-}
-END_TEST
-
-/* Test that the parser stops processing the DTD after an unresolved
- * parameter entity is encountered.
- */
-START_TEST(test_dtd_stop_processing) {
- const char *text = "<!DOCTYPE doc [\n"
- "%foo;\n"
- "<!ENTITY bar 'bas'>\n"
- "]><doc/>";
-
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (dummy_handler_flags != 0)
- fail("DTD processing still going after undefined PE");
-}
-END_TEST
-
-/* Test public notations with no system ID */
-START_TEST(test_public_notation_no_sysid) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!NOTATION note PUBLIC 'foo'>\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
-
- dummy_handler_flags = 0;
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (dummy_handler_flags != DUMMY_NOTATION_DECL_HANDLER_FLAG)
- fail("Notation declaration handler not called");
-}
-END_TEST
-
-static void XMLCALL
-record_element_start_handler(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- UNUSED_P(atts);
- CharData_AppendXMLChars((CharData *)userData, name, (int)xcstrlen(name));
-}
-
-START_TEST(test_nested_groups) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc "
- /* Sixteen elements per line */
- "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
- "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
- "))))))))))))))))))))))))))))))))>\n"
- "<!ELEMENT e EMPTY>"
- "]>\n"
- "<doc><e/></doc>";
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS("doce"));
- if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler not fired");
-}
-END_TEST
-
-START_TEST(test_group_choice) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc (a|b|c)+>\n"
- "<!ELEMENT a EMPTY>\n"
- "<!ELEMENT b (#PCDATA)>\n"
- "<!ELEMENT c ANY>\n"
- "]>\n"
- "<doc>\n"
- "<a/>\n"
- "<b attr='foo'>This is a foo</b>\n"
- "<c></c>\n"
- "</doc>\n";
-
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler flag not raised");
-}
-END_TEST
-
-static int XMLCALL
-external_entity_public(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text1 = (const char *)XML_GetUserData(parser);
- const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
- const char *text = NULL;
- XML_Parser ext_parser;
- int parse_res;
-
- UNUSED_P(base);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- return XML_STATUS_ERROR;
- if (systemId != NULL && ! xcstrcmp(systemId, XCS("http://example.org/"))) {
- text = text1;
- } else if (publicId != NULL && ! xcstrcmp(publicId, XCS("foo"))) {
- text = text2;
- } else
- fail("Unexpected parameters to external entity parser");
- assert(text != NULL);
- parse_res
- = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
- XML_ParserFree(ext_parser);
- return parse_res;
-}
-
-START_TEST(test_standalone_parameter_entity) {
- const char *text = "<?xml version='1.0' standalone='yes'?>\n"
- "<!DOCTYPE doc SYSTEM 'http://example.org/' [\n"
- "<!ENTITY % entity '<!ELEMENT doc (#PCDATA)>'>\n"
- "%entity;\n"
- "]>\n"
- "<doc></doc>";
- char dtd_data[] = "<!ENTITY % e1 'foo'>\n";
-
- XML_SetUserData(g_parser, dtd_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test skipping of parameter entity in an external DTD */
-/* Derived from ibm/invalid/P69/ibm69i01.xml */
-START_TEST(test_skipped_parameter_entity) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
- "<!ELEMENT root (#PCDATA|a)* >\n"
- "]>\n"
- "<root></root>";
- ExtTest dtd_data = {"%pe2;", NULL, NULL};
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- XML_SetUserData(g_parser, &dtd_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetSkippedEntityHandler(g_parser, dummy_skip_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (dummy_handler_flags != DUMMY_SKIP_HANDLER_FLAG)
- fail("Skip handler not executed");
-}
-END_TEST
-
-/* Test recursive parameter entity definition rejected in external DTD */
-START_TEST(test_recursive_external_parameter_entity) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
- "<!ELEMENT root (#PCDATA|a)* >\n"
- "]>\n"
- "<root></root>";
- ExtFaults dtd_data = {"<!ENTITY % pe2 '&#37;pe2;'>\n%pe2;",
- "Recursive external parameter entity not faulted", NULL,
- XML_ERROR_RECURSIVE_ENTITY_REF};
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_SetUserData(g_parser, &dtd_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Recursive external parameter not spotted");
-}
-END_TEST
-
-/* Test undefined parameter entity in external entity handler */
-static int XMLCALL
-external_entity_devaluer(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 SYSTEM 'bar'>\n"
- "%e1;\n";
- XML_Parser ext_parser;
- intptr_t clear_handler = (intptr_t)XML_GetUserData(parser);
-
- UNUSED_P(base);
- UNUSED_P(publicId);
- if (systemId == NULL || ! xcstrcmp(systemId, XCS("bar")))
- return XML_STATUS_OK;
- if (xcstrcmp(systemId, XCS("foo")))
- fail("Unexpected system ID");
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could note create external entity parser");
- if (clear_handler)
- XML_SetExternalEntityRefHandler(ext_parser, NULL);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(ext_parser);
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_undefined_ext_entity_in_external_dtd) {
- const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc></doc>\n";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_devaluer);
- XML_SetUserData(g_parser, (void *)(intptr_t)XML_FALSE);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- /* Now repeat without the external entity ref handler invoking
- * another copy of itself.
- */
- XML_ParserReset(g_parser, NULL);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_devaluer);
- XML_SetUserData(g_parser, (void *)(intptr_t)XML_TRUE);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-static void XMLCALL
-aborting_xdecl_handler(void *userData, const XML_Char *version,
- const XML_Char *encoding, int standalone) {
- UNUSED_P(userData);
- UNUSED_P(version);
- UNUSED_P(encoding);
- UNUSED_P(standalone);
- XML_StopParser(g_parser, resumable);
- XML_SetXmlDeclHandler(g_parser, NULL);
-}
-
-/* Test suspending the parse on receiving an XML declaration works */
-START_TEST(test_suspend_xdecl) {
- const char *text = long_character_data_text;
-
- XML_SetXmlDeclHandler(g_parser, aborting_xdecl_handler);
- resumable = XML_TRUE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
- xml_failure(g_parser);
- /* Attempt to start a new parse while suspended */
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Attempt to parse while suspended not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
- fail("Suspended parse not faulted with correct error");
-}
-END_TEST
-
-/* Test aborting the parse in an epilog works */
-static void XMLCALL
-selective_aborting_default_handler(void *userData, const XML_Char *s, int len) {
- const XML_Char *match = (const XML_Char *)userData;
-
- if (match == NULL
- || (xcstrlen(match) == (unsigned)len && ! xcstrncmp(match, s, len))) {
- XML_StopParser(g_parser, resumable);
- XML_SetDefaultHandler(g_parser, NULL);
- }
-}
-
-START_TEST(test_abort_epilog) {
- const char *text = "<doc></doc>\n\r\n";
- XML_Char match[] = XCS("\r");
-
- XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
- XML_SetUserData(g_parser, match);
- resumable = XML_FALSE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Abort not triggered");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_ABORTED)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test a different code path for abort in the epilog */
-START_TEST(test_abort_epilog_2) {
- const char *text = "<doc></doc>\n";
- XML_Char match[] = XCS("\n");
-
- XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
- XML_SetUserData(g_parser, match);
- resumable = XML_FALSE;
- expect_failure(text, XML_ERROR_ABORTED, "Abort not triggered");
-}
-END_TEST
-
-/* Test suspension from the epilog */
-START_TEST(test_suspend_epilog) {
- const char *text = "<doc></doc>\n";
- XML_Char match[] = XCS("\n");
-
- XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
- XML_SetUserData(g_parser, match);
- resumable = XML_TRUE;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
-}
-END_TEST
-
-static void XMLCALL
-suspending_end_handler(void *userData, const XML_Char *s) {
- UNUSED_P(s);
- XML_StopParser((XML_Parser)userData, 1);
-}
-
-START_TEST(test_suspend_in_sole_empty_tag) {
- const char *text = "<doc/>";
- enum XML_Status rc;
-
- XML_SetEndElementHandler(g_parser, suspending_end_handler);
- XML_SetUserData(g_parser, g_parser);
- rc = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
- if (rc == XML_STATUS_ERROR)
- xml_failure(g_parser);
- else if (rc != XML_STATUS_SUSPENDED)
- fail("Suspend not triggered");
- rc = XML_ResumeParser(g_parser);
- if (rc == XML_STATUS_ERROR)
- xml_failure(g_parser);
- else if (rc != XML_STATUS_OK)
- fail("Resume failed");
-}
-END_TEST
-
-START_TEST(test_unfinished_epilog) {
- const char *text = "<doc></doc><";
-
- expect_failure(text, XML_ERROR_UNCLOSED_TOKEN,
- "Incomplete epilog entry not faulted");
-}
-END_TEST
-
-START_TEST(test_partial_char_in_epilog) {
- const char *text = "<doc></doc>\xe2\x82";
-
- /* First check that no fault is raised if the parse is not finished */
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- /* Now check that it is faulted once we finish */
- if (XML_ParseBuffer(g_parser, 0, XML_TRUE) != XML_STATUS_ERROR)
- fail("Partial character in epilog not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_PARTIAL_CHAR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_hash_collision) {
- /* For full coverage of the lookup routine, we need to ensure a
- * hash collision even though we can only tell that we have one
- * through breakpoint debugging or coverage statistics. The
- * following will cause a hash collision on machines with a 64-bit
- * long type; others will have to experiment. The full coverage
- * tests invoked from qa.sh usually provide a hash collision, but
- * not always. This is an attempt to provide insurance.
- */
-#define COLLIDING_HASH_SALT (unsigned long)_SIP_ULL(0xffffffffU, 0xff99fc90U)
- const char *text
- = "<doc>\n"
- "<a1/><a2/><a3/><a4/><a5/><a6/><a7/><a8/>\n"
- "<b1></b1><b2 attr='foo'>This is a foo</b2><b3></b3><b4></b4>\n"
- "<b5></b5><b6></b6><b7></b7><b8></b8>\n"
- "<c1/><c2/><c3/><c4/><c5/><c6/><c7/><c8/>\n"
- "<d1/><d2/><d3/><d4/><d5/><d6/><d7/>\n"
- "<d8>This triggers the table growth and collides with b2</d8>\n"
- "</doc>\n";
-
- XML_SetHashSalt(g_parser, COLLIDING_HASH_SALT);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-#undef COLLIDING_HASH_SALT
-
-/* Test resuming a parse suspended in entity substitution */
-static void XMLCALL
-start_element_suspender(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- UNUSED_P(userData);
- UNUSED_P(atts);
- if (! xcstrcmp(name, XCS("suspend")))
- XML_StopParser(g_parser, XML_TRUE);
- if (! xcstrcmp(name, XCS("abort")))
- XML_StopParser(g_parser, XML_FALSE);
-}
-
-START_TEST(test_suspend_resume_internal_entity) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ENTITY foo '<suspend>Hi<suspend>Ho</suspend></suspend>'>\n"
- "]>\n"
- "<doc>&foo;</doc>\n";
- const XML_Char *expected1 = XCS("Hi");
- const XML_Char *expected2 = XCS("HiHo");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetStartElementHandler(g_parser, start_element_suspender);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- XML_SetUserData(g_parser, &storage);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS(""));
- if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected1);
- if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected2);
-}
-END_TEST
-
-/* Test syntax error is caught at parse resumption */
-START_TEST(test_resume_entity_with_syntax_error) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY foo '<suspend>Hi</wombat>'>\n"
- "]>\n"
- "<doc>&foo;</doc>\n";
-
- XML_SetStartElementHandler(g_parser, start_element_suspender);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
- fail("Syntax error in entity not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_TAG_MISMATCH)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test suspending and resuming in a parameter entity substitution */
-static void XMLCALL
-element_decl_suspender(void *userData, const XML_Char *name,
- XML_Content *model) {
- UNUSED_P(userData);
- UNUSED_P(name);
- XML_StopParser(g_parser, XML_TRUE);
- XML_FreeContentModel(g_parser, model);
-}
-
-START_TEST(test_suspend_resume_parameter_entity) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY % foo '<!ELEMENT doc (#PCDATA)*>'>\n"
- "%foo;\n"
- "]>\n"
- "<doc>Hello, world</doc>";
- const XML_Char *expected = XCS("Hello, world");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetElementDeclHandler(g_parser, element_decl_suspender);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- XML_SetUserData(g_parser, &storage);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS(""));
- if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test attempting to use parser after an error is faulted */
-START_TEST(test_restart_on_error) {
- const char *text = "<$doc><doc></doc>";
-
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Invalid tag name not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
- xml_failure(g_parser);
- if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
- fail("Restarting invalid parse not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that angle brackets in an attribute default value are faulted */
-START_TEST(test_reject_lt_in_attribute_value) {
- const char *text = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '<bar>'>]>\n"
- "<doc></doc>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Bad attribute default not faulted");
-}
-END_TEST
-
-START_TEST(test_reject_unfinished_param_in_att_value) {
- const char *text = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '&foo'>]>\n"
- "<doc></doc>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Bad attribute default not faulted");
-}
-END_TEST
-
-START_TEST(test_trailing_cr_in_att_value) {
- const char *text = "<doc a='value\r'/>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
+#include "common.h"
-/* Try parsing a general entity within a parameter entity in a
- * standalone internal DTD. Covers a corner case in the parser.
- */
-START_TEST(test_standalone_internal_entity) {
- const char *text = "<?xml version='1.0' standalone='yes' ?>\n"
- "<!DOCTYPE doc [\n"
- " <!ELEMENT doc (#PCDATA)>\n"
- " <!ENTITY % pe '<!ATTLIST doc att2 CDATA \"&ge;\">'>\n"
- " <!ENTITY ge 'AttDefaultValue'>\n"
- " %pe;\n"
- "]>\n"
- "<doc att2='any'/>";
+#include "basic_tests.h"
+#include "ns_tests.h"
+#include "misc_tests.h"
+#include "alloc_tests.h"
+#include "nsalloc_tests.h"
+#include "acc_tests.h"
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that a reference to an unknown external entity is skipped */
-START_TEST(test_skipped_external_entity) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc></doc>\n";
- ExtTest test_data = {"<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e2 '%e1;'>\n",
- NULL, NULL};
-
- XML_SetUserData(g_parser, &test_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test a different form of unknown external entity */
-typedef struct ext_hdlr_data {
- const char *parse_text;
- XML_ExternalEntityRefHandler handler;
-} ExtHdlrData;
-
-static int XMLCALL
-external_entity_oneshot_loader(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- ExtHdlrData *test_data = (ExtHdlrData *)XML_GetUserData(parser);
- XML_Parser ext_parser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser.");
- /* Use the requested entity parser for further externals */
- XML_SetExternalEntityRefHandler(ext_parser, test_data->handler);
- if (_XML_Parse_SINGLE_BYTES(ext_parser, test_data->parse_text,
- (int)strlen(test_data->parse_text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(ext_parser);
- }
-
- XML_ParserFree(ext_parser);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_skipped_null_loaded_ext_entity) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
- "<doc />";
- ExtHdlrData test_data
- = {"<!ENTITY % pe1 SYSTEM 'http://example.org/two.ent'>\n"
- "<!ENTITY % pe2 '%pe1;'>\n"
- "%pe2;\n",
- external_entity_null_loader};
-
- XML_SetUserData(g_parser, &test_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_oneshot_loader);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_skipped_unloaded_ext_entity) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
- "<doc />";
- ExtHdlrData test_data
- = {"<!ENTITY % pe1 SYSTEM 'http://example.org/two.ent'>\n"
- "<!ENTITY % pe2 '%pe1;'>\n"
- "%pe2;\n",
- NULL};
-
- XML_SetUserData(g_parser, &test_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_oneshot_loader);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that a parameter entity value ending with a carriage return
- * has it translated internally into a newline.
- */
-START_TEST(test_param_entity_with_trailing_cr) {
-#define PARAM_ENTITY_NAME "pe"
-#define PARAM_ENTITY_CORE_VALUE "<!ATTLIST doc att CDATA \"default\">"
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc/>";
- ExtTest test_data
- = {"<!ENTITY % " PARAM_ENTITY_NAME " '" PARAM_ENTITY_CORE_VALUE "\r'>\n"
- "%" PARAM_ENTITY_NAME ";\n",
- NULL, NULL};
-
- XML_SetUserData(g_parser, &test_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
- XML_SetEntityDeclHandler(g_parser, param_entity_match_handler);
- entity_name_to_match = XCS(PARAM_ENTITY_NAME);
- entity_value_to_match = XCS(PARAM_ENTITY_CORE_VALUE) XCS("\n");
- entity_match_flag = ENTITY_MATCH_NOT_FOUND;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (entity_match_flag == ENTITY_MATCH_FAIL)
- fail("Parameter entity CR->NEWLINE conversion failed");
- else if (entity_match_flag == ENTITY_MATCH_NOT_FOUND)
- fail("Parameter entity not parsed");
-}
-#undef PARAM_ENTITY_NAME
-#undef PARAM_ENTITY_CORE_VALUE
-END_TEST
-
-START_TEST(test_invalid_character_entity) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY entity '&#x110000;'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
-
- expect_failure(text, XML_ERROR_BAD_CHAR_REF,
- "Out of range character reference not faulted");
-}
-END_TEST
-
-START_TEST(test_invalid_character_entity_2) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY entity '&#xg0;'>\n"
- "]>\n"
- "<doc>&entity;</doc>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Out of range character reference not faulted");
-}
-END_TEST
-
-START_TEST(test_invalid_character_entity_3) {
- const char text[] =
- /* <!DOCTYPE doc [\n */
- "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0\n"
- /* U+0E04 = KHO KHWAI
- * U+0E08 = CHO CHAN */
- /* <!ENTITY entity '&\u0e04\u0e08;'>\n */
- "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0e\0n\0t\0i\0t\0y\0 "
- "\0'\0&\x0e\x04\x0e\x08\0;\0'\0>\0\n"
- /* ]>\n */
- "\0]\0>\0\n"
- /* <doc>&entity;</doc> */
- "\0<\0d\0o\0c\0>\0&\0e\0n\0t\0i\0t\0y\0;\0<\0/\0d\0o\0c\0>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Invalid start of entity name not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_UNDEFINED_ENTITY)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_invalid_character_entity_4) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY entity '&#1114112;'>\n" /* = &#x110000 */
- "]>\n"
- "<doc>&entity;</doc>";
-
- expect_failure(text, XML_ERROR_BAD_CHAR_REF,
- "Out of range character reference not faulted");
-}
-END_TEST
-
-/* Test that processing instructions are picked up by a default handler */
-START_TEST(test_pi_handled_in_default) {
- const char *text = "<?test processing instruction?>\n<doc/>";
- const XML_Char *expected = XCS("<?test processing instruction?>\n<doc/>");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test that comments are picked up by a default handler */
-START_TEST(test_comment_handled_in_default) {
- const char *text = "<!-- This is a comment -->\n<doc/>";
- const XML_Char *expected = XCS("<!-- This is a comment -->\n<doc/>");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test PIs that look almost but not quite like XML declarations */
-static void XMLCALL
-accumulate_pi_characters(void *userData, const XML_Char *target,
- const XML_Char *data) {
- CharData *storage = (CharData *)userData;
-
- CharData_AppendXMLChars(storage, target, -1);
- CharData_AppendXMLChars(storage, XCS(": "), 2);
- CharData_AppendXMLChars(storage, data, -1);
- CharData_AppendXMLChars(storage, XCS("\n"), 1);
-}
-
-START_TEST(test_pi_yml) {
- const char *text = "<?yml something like data?><doc/>";
- const XML_Char *expected = XCS("yml: something like data\n");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_pi_xnl) {
- const char *text = "<?xnl nothing like data?><doc/>";
- const XML_Char *expected = XCS("xnl: nothing like data\n");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_pi_xmm) {
- const char *text = "<?xmm everything like data?><doc/>";
- const XML_Char *expected = XCS("xmm: everything like data\n");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_utf16_pi) {
- const char text[] =
- /* <?{KHO KHWAI}{CHO CHAN}?>
- * where {KHO KHWAI} = U+0E04
- * and {CHO CHAN} = U+0E08
- */
- "<\0?\0\x04\x0e\x08\x0e?\0>\0"
- /* <q/> */
- "<\0q\0/\0>\0";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x0e04\x0e08: \n");
-#else
- const XML_Char *expected = XCS("\xe0\xb8\x84\xe0\xb8\x88: \n");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_utf16_be_pi) {
- const char text[] =
- /* <?{KHO KHWAI}{CHO CHAN}?>
- * where {KHO KHWAI} = U+0E04
- * and {CHO CHAN} = U+0E08
- */
- "\0<\0?\x0e\x04\x0e\x08\0?\0>"
- /* <q/> */
- "\0<\0q\0/\0>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x0e04\x0e08: \n");
-#else
- const XML_Char *expected = XCS("\xe0\xb8\x84\xe0\xb8\x88: \n");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test that comments can be picked up and translated */
-static void XMLCALL
-accumulate_comment(void *userData, const XML_Char *data) {
- CharData *storage = (CharData *)userData;
-
- CharData_AppendXMLChars(storage, data, -1);
-}
-
-START_TEST(test_utf16_be_comment) {
- const char text[] =
- /* <!-- Comment A --> */
- "\0<\0!\0-\0-\0 \0C\0o\0m\0m\0e\0n\0t\0 \0A\0 \0-\0-\0>\0\n"
- /* <doc/> */
- "\0<\0d\0o\0c\0/\0>";
- const XML_Char *expected = XCS(" Comment A ");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetCommentHandler(g_parser, accumulate_comment);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_utf16_le_comment) {
- const char text[] =
- /* <!-- Comment B --> */
- "<\0!\0-\0-\0 \0C\0o\0m\0m\0e\0n\0t\0 \0B\0 \0-\0-\0>\0\n\0"
- /* <doc/> */
- "<\0d\0o\0c\0/\0>\0";
- const XML_Char *expected = XCS(" Comment B ");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetCommentHandler(g_parser, accumulate_comment);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test that the unknown encoding handler with map entries that expect
- * conversion but no conversion function is faulted
- */
-static int XMLCALL
-failing_converter(void *data, const char *s) {
- UNUSED_P(data);
- UNUSED_P(s);
- /* Always claim to have failed */
- return -1;
-}
-
-static int XMLCALL
-prefix_converter(void *data, const char *s) {
- UNUSED_P(data);
- /* If the first byte is 0xff, raise an error */
- if (s[0] == (char)-1)
- return -1;
- /* Just add the low bits of the first byte to the second */
- return (s[1] + (s[0] & 0x7f)) & 0x01ff;
-}
-
-static int XMLCALL
-MiscEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info) {
- int i;
- int high_map = -2; /* Assume a 2-byte sequence */
-
- if (! xcstrcmp(encoding, XCS("invalid-9"))
- || ! xcstrcmp(encoding, XCS("ascii-like"))
- || ! xcstrcmp(encoding, XCS("invalid-len"))
- || ! xcstrcmp(encoding, XCS("invalid-a"))
- || ! xcstrcmp(encoding, XCS("invalid-surrogate"))
- || ! xcstrcmp(encoding, XCS("invalid-high")))
- high_map = -1;
-
- for (i = 0; i < 128; ++i)
- info->map[i] = i;
- for (; i < 256; ++i)
- info->map[i] = high_map;
-
- /* If required, put an invalid value in the ASCII entries */
- if (! xcstrcmp(encoding, XCS("invalid-9")))
- info->map[9] = 5;
- /* If required, have a top-bit set character starts a 5-byte sequence */
- if (! xcstrcmp(encoding, XCS("invalid-len")))
- info->map[0x81] = -5;
- /* If required, make a top-bit set character a valid ASCII character */
- if (! xcstrcmp(encoding, XCS("invalid-a")))
- info->map[0x82] = 'a';
- /* If required, give a top-bit set character a forbidden value,
- * what would otherwise be the first of a surrogate pair.
- */
- if (! xcstrcmp(encoding, XCS("invalid-surrogate")))
- info->map[0x83] = 0xd801;
- /* If required, give a top-bit set character too high a value */
- if (! xcstrcmp(encoding, XCS("invalid-high")))
- info->map[0x84] = 0x010101;
-
- info->data = data;
- info->release = NULL;
- if (! xcstrcmp(encoding, XCS("failing-conv")))
- info->convert = failing_converter;
- else if (! xcstrcmp(encoding, XCS("prefix-conv")))
- info->convert = prefix_converter;
- else
- info->convert = NULL;
- return XML_STATUS_OK;
-}
-
-START_TEST(test_missing_encoding_conversion_fn) {
- const char *text = "<?xml version='1.0' encoding='no-conv'?>\n"
- "<doc>\x81</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- /* MiscEncodingHandler sets up an encoding with every top-bit-set
- * character introducing a two-byte sequence. For this, it
- * requires a convert function. The above function call doesn't
- * pass one through, so when BadEncodingHandler actually gets
- * called it should supply an invalid encoding.
- */
- expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
- "Encoding with missing convert() not faulted");
-}
-END_TEST
-
-START_TEST(test_failing_encoding_conversion_fn) {
- const char *text = "<?xml version='1.0' encoding='failing-conv'?>\n"
- "<doc>\x81</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- /* BadEncodingHandler sets up an encoding with every top-bit-set
- * character introducing a two-byte sequence. For this, it
- * requires a convert function. The above function call passes
- * one that insists all possible sequences are invalid anyway.
- */
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Encoding with failing convert() not faulted");
-}
-END_TEST
-
-/* Test unknown encoding conversions */
-START_TEST(test_unknown_encoding_success) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- /* Equivalent to <eoc>Hello, world</eoc> */
- "<\x81\x64\x80oc>Hello, world</\x81\x64\x80oc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- run_character_check(text, XCS("Hello, world"));
-}
-END_TEST
-
-/* Test bad name character in unknown encoding */
-START_TEST(test_unknown_encoding_bad_name) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<\xff\x64oc>Hello, world</\xff\x64oc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Bad name start in unknown encoding not faulted");
-}
-END_TEST
-
-/* Test bad mid-name character in unknown encoding */
-START_TEST(test_unknown_encoding_bad_name_2) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<d\xffoc>Hello, world</d\xffoc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Bad name in unknown encoding not faulted");
-}
-END_TEST
-
-/* Test element name that is long enough to fill the conversion buffer
- * in an unknown encoding, finishing with an encoded character.
- */
-START_TEST(test_unknown_encoding_long_name_1) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<abcdefghabcdefghabcdefghijkl\x80m\x80n\x80o\x80p>"
- "Hi"
- "</abcdefghabcdefghabcdefghijkl\x80m\x80n\x80o\x80p>";
- const XML_Char *expected = XCS("abcdefghabcdefghabcdefghijklmnop");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test element name that is long enough to fill the conversion buffer
- * in an unknown encoding, finishing with an simple character.
- */
-START_TEST(test_unknown_encoding_long_name_2) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<abcdefghabcdefghabcdefghijklmnop>"
- "Hi"
- "</abcdefghabcdefghabcdefghijklmnop>";
- const XML_Char *expected = XCS("abcdefghabcdefghabcdefghijklmnop");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_invalid_unknown_encoding) {
- const char *text = "<?xml version='1.0' encoding='invalid-9'?>\n"
- "<doc>Hello world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
- "Invalid unknown encoding not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_ascii_encoding_ok) {
- const char *text = "<?xml version='1.0' encoding='ascii-like'?>\n"
- "<doc>Hello, world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- run_character_check(text, XCS("Hello, world"));
-}
-END_TEST
-
-START_TEST(test_unknown_ascii_encoding_fail) {
- const char *text = "<?xml version='1.0' encoding='ascii-like'?>\n"
- "<doc>Hello, \x80 world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Invalid character not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_encoding_invalid_length) {
- const char *text = "<?xml version='1.0' encoding='invalid-len'?>\n"
- "<doc>Hello, world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
- "Invalid unknown encoding not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_encoding_invalid_topbit) {
- const char *text = "<?xml version='1.0' encoding='invalid-a'?>\n"
- "<doc>Hello, world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
- "Invalid unknown encoding not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_encoding_invalid_surrogate) {
- const char *text = "<?xml version='1.0' encoding='invalid-surrogate'?>\n"
- "<doc>Hello, \x82 world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Invalid unknown encoding not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_encoding_invalid_high) {
- const char *text = "<?xml version='1.0' encoding='invalid-high'?>\n"
- "<doc>Hello, world</doc>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
- "Invalid unknown encoding not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_encoding_invalid_attr_value) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<doc attr='\xff\x30'/>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Invalid attribute valid not faulted");
-}
-END_TEST
-
-/* Test an external entity parser set to use latin-1 detects UTF-16
- * BOMs correctly.
- */
-enum ee_parse_flags { EE_PARSE_NONE = 0x00, EE_PARSE_FULL_BUFFER = 0x01 };
-
-typedef struct ExtTest2 {
- const char *parse_text;
- int parse_len;
- const XML_Char *encoding;
- CharData *storage;
- enum ee_parse_flags flags;
-} ExtTest2;
-
-static int XMLCALL
-external_entity_loader2(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- ExtTest2 *test_data = (ExtTest2 *)XML_GetUserData(parser);
- XML_Parser extparser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (extparser == NULL)
- fail("Coulr not create external entity parser");
- if (test_data->encoding != NULL) {
- if (! XML_SetEncoding(extparser, test_data->encoding))
- fail("XML_SetEncoding() ignored for external entity");
- }
- if (test_data->flags & EE_PARSE_FULL_BUFFER) {
- if (XML_Parse(extparser, test_data->parse_text, test_data->parse_len,
- XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(extparser);
- }
- } else if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
- test_data->parse_len, XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(extparser);
- }
-
- XML_ParserFree(extparser);
- return XML_STATUS_OK;
-}
-
-/* Test that UTF-16 BOM does not select UTF-16 given explicit encoding */
-static void XMLCALL
-ext2_accumulate_characters(void *userData, const XML_Char *s, int len) {
- ExtTest2 *test_data = (ExtTest2 *)userData;
- accumulate_characters(test_data->storage, s, len);
-}
-
-START_TEST(test_ext_entity_latin1_utf16le_bom) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
- /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
- * 0x4c = L and 0x20 is a space
- */
- "\xff\xfe\x4c\x20", 4, XCS("iso-8859-1"), NULL, EE_PARSE_NONE};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00ff\x00feL ");
-#else
- /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
- const XML_Char *expected = XCS("\xc3\xbf\xc3\xbeL ");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_ext_entity_latin1_utf16be_bom) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
- /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
- * 0x4c = L and 0x20 is a space
- */
- "\xfe\xff\x20\x4c", 4, XCS("iso-8859-1"), NULL, EE_PARSE_NONE};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00fe\x00ff L");
-#else
- /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
- const XML_Char *expected = XCS("\xc3\xbe\xc3\xbf L");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Parsing the full buffer rather than a byte at a time makes a
- * difference to the encoding scanning code, so repeat the above tests
- * without breaking them down by byte.
- */
-START_TEST(test_ext_entity_latin1_utf16le_bom2) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
- /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
- * 0x4c = L and 0x20 is a space
- */
- "\xff\xfe\x4c\x20", 4, XCS("iso-8859-1"), NULL, EE_PARSE_FULL_BUFFER};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00ff\x00feL ");
-#else
- /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
- const XML_Char *expected = XCS("\xc3\xbf\xc3\xbeL ");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_ext_entity_latin1_utf16be_bom2) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
- /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
- * 0x4c = L and 0x20 is a space
- */
- "\xfe\xff\x20\x4c", 4, XCS("iso-8859-1"), NULL, EE_PARSE_FULL_BUFFER};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00fe\x00ff L");
-#else
- /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
- const XML_Char *expected = "\xc3\xbe\xc3\xbf L";
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test little-endian UTF-16 given an explicit big-endian encoding */
-START_TEST(test_ext_entity_utf16_be) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {"<\0e\0/\0>\0", 8, XCS("utf-16be"), NULL, EE_PARSE_NONE};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x3c00\x6500\x2f00\x3e00");
-#else
- const XML_Char *expected = XCS("\xe3\xb0\x80" /* U+3C00 */
- "\xe6\x94\x80" /* U+6500 */
- "\xe2\xbc\x80" /* U+2F00 */
- "\xe3\xb8\x80"); /* U+3E00 */
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test big-endian UTF-16 given an explicit little-endian encoding */
-START_TEST(test_ext_entity_utf16_le) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {"\0<\0e\0/\0>", 8, XCS("utf-16le"), NULL, EE_PARSE_NONE};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x3c00\x6500\x2f00\x3e00");
-#else
- const XML_Char *expected = XCS("\xe3\xb0\x80" /* U+3C00 */
- "\xe6\x94\x80" /* U+6500 */
- "\xe2\xbc\x80" /* U+2F00 */
- "\xe3\xb8\x80"); /* U+3E00 */
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test little-endian UTF-16 given no explicit encoding.
- * The existing default encoding (UTF-8) is assumed to hold without a
- * BOM to contradict it, so the entity value will in fact provoke an
- * error because 0x00 is not a valid XML character. We parse the
- * whole buffer in one go rather than feeding it in byte by byte to
- * exercise different code paths in the initial scanning routines.
- */
-typedef struct ExtFaults2 {
- const char *parse_text;
- int parse_len;
- const char *fail_text;
- const XML_Char *encoding;
- enum XML_Error error;
-} ExtFaults2;
-
-static int XMLCALL
-external_entity_faulter2(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- ExtFaults2 *test_data = (ExtFaults2 *)XML_GetUserData(parser);
- XML_Parser extparser;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (extparser == NULL)
- fail("Could not create external entity parser");
- if (test_data->encoding != NULL) {
- if (! XML_SetEncoding(extparser, test_data->encoding))
- fail("XML_SetEncoding() ignored for external entity");
- }
- if (XML_Parse(extparser, test_data->parse_text, test_data->parse_len,
- XML_TRUE)
- != XML_STATUS_ERROR)
- fail(test_data->fail_text);
- if (XML_GetErrorCode(extparser) != test_data->error)
- xml_failure(extparser);
-
- XML_ParserFree(extparser);
- return XML_STATUS_ERROR;
-}
-
-START_TEST(test_ext_entity_utf16_unknown) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtFaults2 test_data
- = {"a\0b\0c\0", 6, "Invalid character in entity not faulted", NULL,
- XML_ERROR_INVALID_TOKEN};
-
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter2);
- XML_SetUserData(g_parser, &test_data);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Invalid character should not have been accepted");
-}
-END_TEST
-
-/* Test not-quite-UTF-8 BOM (0xEF 0xBB 0xBF) */
-START_TEST(test_ext_entity_utf8_non_bom) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtTest2 test_data
- = {"\xef\xbb\x80", /* Arabic letter DAD medial form, U+FEC0 */
- 3, NULL, NULL, EE_PARSE_NONE};
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\xfec0");
-#else
- const XML_Char *expected = XCS("\xef\xbb\x80");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test that UTF-8 in a CDATA section is correctly passed through */
-START_TEST(test_utf8_in_cdata_section) {
- const char *text = "<doc><![CDATA[one \xc3\xa9 two]]></doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("one \x00e9 two");
-#else
- const XML_Char *expected = XCS("one \xc3\xa9 two");
-#endif
-
- run_character_check(text, expected);
-}
-END_TEST
-
-/* Test that little-endian UTF-16 in a CDATA section is handled */
-START_TEST(test_utf8_in_cdata_section_2) {
- const char *text = "<doc><![CDATA[\xc3\xa9]\xc3\xa9two]]></doc>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e9]\x00e9two");
-#else
- const XML_Char *expected = XCS("\xc3\xa9]\xc3\xa9two");
-#endif
-
- run_character_check(text, expected);
-}
-END_TEST
-
-/* Test trailing spaces in elements are accepted */
-static void XMLCALL
-record_element_end_handler(void *userData, const XML_Char *name) {
- CharData *storage = (CharData *)userData;
-
- CharData_AppendXMLChars(storage, XCS("/"), 1);
- CharData_AppendXMLChars(storage, name, -1);
-}
-
-START_TEST(test_trailing_spaces_in_elements) {
- const char *text = "<doc >Hi</doc >";
- const XML_Char *expected = XCS("doc/doc");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetElementHandler(g_parser, record_element_start_handler,
- record_element_end_handler);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_utf16_attribute) {
- const char text[] =
- /* <d {KHO KHWAI}{CHO CHAN}='a'/>
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
- */
- "<\0d\0 \0\x04\x0e\x08\x0e=\0'\0a\0'\0/\0>\0";
- const XML_Char *expected = XCS("a");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetStartElementHandler(g_parser, accumulate_attribute);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_utf16_second_attr) {
- /* <d a='1' {KHO KHWAI}{CHO CHAN}='2'/>
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
- */
- const char text[] = "<\0d\0 \0a\0=\0'\0\x31\0'\0 \0"
- "\x04\x0e\x08\x0e=\0'\0\x32\0'\0/\0>\0";
- const XML_Char *expected = XCS("1");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetStartElementHandler(g_parser, accumulate_attribute);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_attr_after_solidus) {
- const char *text = "<doc attr1='a' / attr2='b'>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN, "Misplaced / not faulted");
-}
-END_TEST
-
-static void XMLCALL
-accumulate_entity_decl(void *userData, const XML_Char *entityName,
- int is_parameter_entity, const XML_Char *value,
- int value_length, const XML_Char *base,
- const XML_Char *systemId, const XML_Char *publicId,
- const XML_Char *notationName) {
- CharData *storage = (CharData *)userData;
-
- UNUSED_P(is_parameter_entity);
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- UNUSED_P(notationName);
- CharData_AppendXMLChars(storage, entityName, -1);
- CharData_AppendXMLChars(storage, XCS("="), 1);
- CharData_AppendXMLChars(storage, value, value_length);
- CharData_AppendXMLChars(storage, XCS("\n"), 1);
-}
-
-START_TEST(test_utf16_pe) {
- /* <!DOCTYPE doc [
- * <!ENTITY % {KHO KHWAI}{CHO CHAN} '<!ELEMENT doc (#PCDATA)>'>
- * %{KHO KHWAI}{CHO CHAN};
- * ]>
- * <doc></doc>
- *
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
- */
- const char text[] = "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0\n"
- "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \x0e\x04\x0e\x08\0 "
- "\0'\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 "
- "\0d\0o\0c\0 \0(\0#\0P\0C\0D\0A\0T\0A\0)\0>\0'\0>\0\n"
- "\0%\x0e\x04\x0e\x08\0;\0\n"
- "\0]\0>\0\n"
- "\0<\0d\0o\0c\0>\0<\0/\0d\0o\0c\0>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x0e04\x0e08=<!ELEMENT doc (#PCDATA)>\n");
-#else
- const XML_Char *expected
- = XCS("\xe0\xb8\x84\xe0\xb8\x88=<!ELEMENT doc (#PCDATA)>\n");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetEntityDeclHandler(g_parser, accumulate_entity_decl);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test that duff attribute description keywords are rejected */
-START_TEST(test_bad_attr_desc_keyword) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ATTLIST doc attr CDATA #!IMPLIED>\n"
- "]>\n"
- "<doc />";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Bad keyword !IMPLIED not faulted");
-}
-END_TEST
-
-/* Test that an invalid attribute description keyword consisting of
- * UTF-16 characters with their top bytes non-zero are correctly
- * faulted
- */
-START_TEST(test_bad_attr_desc_keyword_utf16) {
- /* <!DOCTYPE d [
- * <!ATTLIST d a CDATA #{KHO KHWAI}{CHO CHAN}>
- * ]><d/>
- *
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
- */
- const char text[]
- = "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n"
- "\0<\0!\0A\0T\0T\0L\0I\0S\0T\0 \0d\0 \0a\0 \0C\0D\0A\0T\0A\0 "
- "\0#\x0e\x04\x0e\x08\0>\0\n"
- "\0]\0>\0<\0d\0/\0>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Invalid UTF16 attribute keyword not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_SYNTAX)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that invalid syntax in a <!DOCTYPE> is rejected. Do this
- * using prefix-encoding (see above) to trigger specific code paths
- */
-START_TEST(test_bad_doctype) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<!DOCTYPE doc [ \x80\x44 ]><doc/>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- expect_failure(text, XML_ERROR_SYNTAX,
- "Invalid bytes in DOCTYPE not faulted");
-}
-END_TEST
-
-START_TEST(test_bad_doctype_utf16) {
- const char text[] =
- /* <!DOCTYPE doc [ \x06f2 ]><doc/>
- *
- * U+06F2 = EXTENDED ARABIC-INDIC DIGIT TWO, a valid number
- * (name character) but not a valid letter (name start character)
- */
- "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0 "
- "\x06\xf2"
- "\0 \0]\0>\0<\0d\0o\0c\0/\0>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Invalid bytes in DOCTYPE not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_SYNTAX)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_bad_doctype_plus) {
- const char *text = "<!DOCTYPE 1+ [ <!ENTITY foo 'bar'> ]>\n"
- "<1+>&foo;</1+>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "'+' in document name not faulted");
-}
-END_TEST
-
-START_TEST(test_bad_doctype_star) {
- const char *text = "<!DOCTYPE 1* [ <!ENTITY foo 'bar'> ]>\n"
- "<1*>&foo;</1*>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "'*' in document name not faulted");
-}
-END_TEST
-
-START_TEST(test_bad_doctype_query) {
- const char *text = "<!DOCTYPE 1? [ <!ENTITY foo 'bar'> ]>\n"
- "<1?>&foo;</1?>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "'?' in document name not faulted");
-}
-END_TEST
-
-START_TEST(test_unknown_encoding_bad_ignore) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>"
- "<!DOCTYPE doc SYSTEM 'foo'>"
- "<doc><e>&entity;</e></doc>";
- ExtFaults fault = {"<![IGNORE[<!ELEMENT \xffG (#PCDATA)*>]]>",
- "Invalid character not faulted", XCS("prefix-conv"),
- XML_ERROR_INVALID_TOKEN};
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- XML_SetUserData(g_parser, &fault);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Bad IGNORE section with unknown encoding not failed");
-}
-END_TEST
-
-START_TEST(test_entity_in_utf16_be_attr) {
- const char text[] =
- /* <e a='&#228; &#x00E4;'></e> */
- "\0<\0e\0 \0a\0=\0'\0&\0#\0\x32\0\x32\0\x38\0;\0 "
- "\0&\0#\0x\0\x30\0\x30\0E\0\x34\0;\0'\0>\0<\0/\0e\0>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e4 \x00e4");
-#else
- const XML_Char *expected = XCS("\xc3\xa4 \xc3\xa4");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetStartElementHandler(g_parser, accumulate_attribute);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_entity_in_utf16_le_attr) {
- const char text[] =
- /* <e a='&#228; &#x00E4;'></e> */
- "<\0e\0 \0a\0=\0'\0&\0#\0\x32\0\x32\0\x38\0;\0 \0"
- "&\0#\0x\0\x30\0\x30\0E\0\x34\0;\0'\0>\0<\0/\0e\0>\0";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("\x00e4 \x00e4");
-#else
- const XML_Char *expected = XCS("\xc3\xa4 \xc3\xa4");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetStartElementHandler(g_parser, accumulate_attribute);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_entity_public_utf16_be) {
- const char text[] =
- /* <!DOCTYPE d [ */
- "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n"
- /* <!ENTITY % e PUBLIC 'foo' 'bar.ent'> */
- "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \0e\0 \0P\0U\0B\0L\0I\0C\0 "
- "\0'\0f\0o\0o\0'\0 \0'\0b\0a\0r\0.\0e\0n\0t\0'\0>\0\n"
- /* %e; */
- "\0%\0e\0;\0\n"
- /* ]> */
- "\0]\0>\0\n"
- /* <d>&j;</d> */
- "\0<\0d\0>\0&\0j\0;\0<\0/\0d\0>";
- ExtTest2 test_data = {/* <!ENTITY j 'baz'> */
- "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0j\0 \0'\0b\0a\0z\0'\0>",
- 34, NULL, NULL, EE_PARSE_NONE};
- const XML_Char *expected = XCS("baz");
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_entity_public_utf16_le) {
- const char text[] =
- /* <!DOCTYPE d [ */
- "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n\0"
- /* <!ENTITY % e PUBLIC 'foo' 'bar.ent'> */
- "<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \0e\0 \0P\0U\0B\0L\0I\0C\0 \0"
- "'\0f\0o\0o\0'\0 \0'\0b\0a\0r\0.\0e\0n\0t\0'\0>\0\n\0"
- /* %e; */
- "%\0e\0;\0\n\0"
- /* ]> */
- "]\0>\0\n\0"
- /* <d>&j;</d> */
- "<\0d\0>\0&\0j\0;\0<\0/\0d\0>\0";
- ExtTest2 test_data = {/* <!ENTITY j 'baz'> */
- "<\0!\0E\0N\0T\0I\0T\0Y\0 \0j\0 \0'\0b\0a\0z\0'\0>\0",
- 34, NULL, NULL, EE_PARSE_NONE};
- const XML_Char *expected = XCS("baz");
- CharData storage;
-
- CharData_Init(&storage);
- test_data.storage = &storage;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
- XML_SetUserData(g_parser, &test_data);
- XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-/* Test that a doctype with neither an internal nor external subset is
- * faulted
- */
-START_TEST(test_short_doctype) {
- const char *text = "<!DOCTYPE doc></doc>";
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "DOCTYPE without subset not rejected");
-}
-END_TEST
-
-START_TEST(test_short_doctype_2) {
- const char *text = "<!DOCTYPE doc PUBLIC></doc>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "DOCTYPE without Public ID not rejected");
-}
-END_TEST
-
-START_TEST(test_short_doctype_3) {
- const char *text = "<!DOCTYPE doc SYSTEM></doc>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "DOCTYPE without System ID not rejected");
-}
-END_TEST
-
-START_TEST(test_long_doctype) {
- const char *text = "<!DOCTYPE doc PUBLIC 'foo' 'bar' 'baz'></doc>";
- expect_failure(text, XML_ERROR_SYNTAX, "DOCTYPE with extra ID not rejected");
-}
-END_TEST
-
-START_TEST(test_bad_entity) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY foo PUBLIC>\n"
- "]>\n"
- "<doc/>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "ENTITY without Public ID is not rejected");
-}
-END_TEST
-
-/* Test unquoted value is faulted */
-START_TEST(test_bad_entity_2) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY % foo bar>\n"
- "]>\n"
- "<doc/>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "ENTITY without Public ID is not rejected");
-}
-END_TEST
-
-START_TEST(test_bad_entity_3) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY % foo PUBLIC>\n"
- "]>\n"
- "<doc/>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "Parameter ENTITY without Public ID is not rejected");
-}
-END_TEST
-
-START_TEST(test_bad_entity_4) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY % foo SYSTEM>\n"
- "]>\n"
- "<doc/>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "Parameter ENTITY without Public ID is not rejected");
-}
-END_TEST
-
-START_TEST(test_bad_notation) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!NOTATION n SYSTEM>\n"
- "]>\n"
- "<doc/>";
- expect_failure(text, XML_ERROR_SYNTAX,
- "Notation without System ID is not rejected");
-}
-END_TEST
-
-/* Test for issue #11, wrongly suppressed default handler */
-typedef struct default_check {
- const XML_Char *expected;
- const int expectedLen;
- XML_Bool seen;
-} DefaultCheck;
-
-static void XMLCALL
-checking_default_handler(void *userData, const XML_Char *s, int len) {
- DefaultCheck *data = (DefaultCheck *)userData;
- int i;
-
- for (i = 0; data[i].expected != NULL; i++) {
- if (data[i].expectedLen == len
- && ! memcmp(data[i].expected, s, len * sizeof(XML_Char))) {
- data[i].seen = XML_TRUE;
- break;
- }
- }
-}
-
-START_TEST(test_default_doctype_handler) {
- const char *text = "<!DOCTYPE doc PUBLIC 'pubname' 'test.dtd' [\n"
- " <!ENTITY foo 'bar'>\n"
- "]>\n"
- "<doc>&foo;</doc>";
- DefaultCheck test_data[] = {{XCS("'pubname'"), 9, XML_FALSE},
- {XCS("'test.dtd'"), 10, XML_FALSE},
- {NULL, 0, XML_FALSE}};
- int i;
-
- XML_SetUserData(g_parser, &test_data);
- XML_SetDefaultHandler(g_parser, checking_default_handler);
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- for (i = 0; test_data[i].expected != NULL; i++)
- if (! test_data[i].seen)
- fail("Default handler not run for public !DOCTYPE");
-}
-END_TEST
-
-START_TEST(test_empty_element_abort) {
- const char *text = "<abort/>";
-
- XML_SetStartElementHandler(g_parser, start_element_suspender);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Expected to error on abort");
-}
-END_TEST
-
-/*
- * Namespaces tests.
- */
-
-static void
-namespace_setup(void) {
- g_parser = XML_ParserCreateNS(NULL, XCS(' '));
- if (g_parser == NULL)
- fail("Parser not created.");
-}
-
-static void
-namespace_teardown(void) {
- basic_teardown();
-}
-
-/* Check that an element name and attribute name match the expected values.
- The expected values are passed as an array reference of string pointers
- provided as the userData argument; the first is the expected
- element name, and the second is the expected attribute name.
-*/
-static int triplet_start_flag = XML_FALSE;
-static int triplet_end_flag = XML_FALSE;
-
-static void XMLCALL
-triplet_start_checker(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- XML_Char **elemstr = (XML_Char **)userData;
- char buffer[1024];
- if (xcstrcmp(elemstr[0], name) != 0) {
- sprintf(buffer, "unexpected start string: '%" XML_FMT_STR "'", name);
- fail(buffer);
- }
- if (xcstrcmp(elemstr[1], atts[0]) != 0) {
- sprintf(buffer, "unexpected attribute string: '%" XML_FMT_STR "'", atts[0]);
- fail(buffer);
- }
- triplet_start_flag = XML_TRUE;
-}
-
-/* Check that the element name passed to the end-element handler matches
- the expected value. The expected value is passed as the first element
- in an array of strings passed as the userData argument.
-*/
-static void XMLCALL
-triplet_end_checker(void *userData, const XML_Char *name) {
- XML_Char **elemstr = (XML_Char **)userData;
- if (xcstrcmp(elemstr[0], name) != 0) {
- char buffer[1024];
- sprintf(buffer, "unexpected end string: '%" XML_FMT_STR "'", name);
- fail(buffer);
- }
- triplet_end_flag = XML_TRUE;
-}
-
-START_TEST(test_return_ns_triplet) {
- const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
- " xmlns:bar='http://example.org/'>";
- const char *epilog = "</foo:e>";
- const XML_Char *elemstr[]
- = {XCS("http://example.org/ e foo"), XCS("http://example.org/ a bar")};
- XML_SetReturnNSTriplet(g_parser, XML_TRUE);
- XML_SetUserData(g_parser, (void *)elemstr);
- XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
- XML_SetNamespaceDeclHandler(g_parser, dummy_start_namespace_decl_handler,
- dummy_end_namespace_decl_handler);
- triplet_start_flag = XML_FALSE;
- triplet_end_flag = XML_FALSE;
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (! triplet_start_flag)
- fail("triplet_start_checker not invoked");
- /* Check that unsetting "return triplets" fails while still parsing */
- XML_SetReturnNSTriplet(g_parser, XML_FALSE);
- if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (! triplet_end_flag)
- fail("triplet_end_checker not invoked");
- if (dummy_handler_flags
- != (DUMMY_START_NS_DECL_HANDLER_FLAG | DUMMY_END_NS_DECL_HANDLER_FLAG))
- fail("Namespace handlers not called");
-}
-END_TEST
-
-static void XMLCALL
-overwrite_start_checker(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- CharData *storage = (CharData *)userData;
- CharData_AppendXMLChars(storage, XCS("start "), 6);
- CharData_AppendXMLChars(storage, name, -1);
- while (*atts != NULL) {
- CharData_AppendXMLChars(storage, XCS("\nattribute "), 11);
- CharData_AppendXMLChars(storage, *atts, -1);
- atts += 2;
- }
- CharData_AppendXMLChars(storage, XCS("\n"), 1);
-}
-
-static void XMLCALL
-overwrite_end_checker(void *userData, const XML_Char *name) {
- CharData *storage = (CharData *)userData;
- CharData_AppendXMLChars(storage, XCS("end "), 4);
- CharData_AppendXMLChars(storage, name, -1);
- CharData_AppendXMLChars(storage, XCS("\n"), 1);
-}
-
-static void
-run_ns_tagname_overwrite_test(const char *text, const XML_Char *result) {
- CharData storage;
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetElementHandler(g_parser, overwrite_start_checker,
- overwrite_end_checker);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, result);
-}
-
-/* Regression test for SF bug #566334. */
-START_TEST(test_ns_tagname_overwrite) {
- const char *text = "<n:e xmlns:n='http://example.org/'>\n"
- " <n:f n:attr='foo'/>\n"
- " <n:g n:attr2='bar'/>\n"
- "</n:e>";
- const XML_Char *result = XCS("start http://example.org/ e\n")
- XCS("start http://example.org/ f\n")
- XCS("attribute http://example.org/ attr\n")
- XCS("end http://example.org/ f\n")
- XCS("start http://example.org/ g\n")
- XCS("attribute http://example.org/ attr2\n")
- XCS("end http://example.org/ g\n")
- XCS("end http://example.org/ e\n");
- run_ns_tagname_overwrite_test(text, result);
-}
-END_TEST
-
-/* Regression test for SF bug #566334. */
-START_TEST(test_ns_tagname_overwrite_triplet) {
- const char *text = "<n:e xmlns:n='http://example.org/'>\n"
- " <n:f n:attr='foo'/>\n"
- " <n:g n:attr2='bar'/>\n"
- "</n:e>";
- const XML_Char *result = XCS("start http://example.org/ e n\n")
- XCS("start http://example.org/ f n\n")
- XCS("attribute http://example.org/ attr n\n")
- XCS("end http://example.org/ f n\n")
- XCS("start http://example.org/ g n\n")
- XCS("attribute http://example.org/ attr2 n\n")
- XCS("end http://example.org/ g n\n")
- XCS("end http://example.org/ e n\n");
- XML_SetReturnNSTriplet(g_parser, XML_TRUE);
- run_ns_tagname_overwrite_test(text, result);
-}
-END_TEST
-
-/* Regression test for SF bug #620343. */
-static void XMLCALL
-start_element_fail(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- UNUSED_P(userData);
- UNUSED_P(name);
- UNUSED_P(atts);
-
- /* We should never get here. */
- fail("should never reach start_element_fail()");
-}
-
-static void XMLCALL
-start_ns_clearing_start_element(void *userData, const XML_Char *prefix,
- const XML_Char *uri) {
- UNUSED_P(prefix);
- UNUSED_P(uri);
- XML_SetStartElementHandler((XML_Parser)userData, NULL);
-}
-
-START_TEST(test_start_ns_clears_start_element) {
- /* This needs to use separate start/end tags; using the empty tag
- syntax doesn't cause the problematic path through Expat to be
- taken.
- */
- const char *text = "<e xmlns='http://example.org/'></e>";
-
- XML_SetStartElementHandler(g_parser, start_element_fail);
- XML_SetStartNamespaceDeclHandler(g_parser, start_ns_clearing_start_element);
- XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
- XML_UseParserAsHandlerArg(g_parser);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Regression test for SF bug #616863. */
-static int XMLCALL
-external_entity_handler(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- intptr_t callno = 1 + (intptr_t)XML_GetUserData(parser);
- const char *text;
- XML_Parser p2;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- if (callno == 1)
- text = ("<!ELEMENT doc (e+)>\n"
- "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
- "<!ELEMENT e EMPTY>\n");
- else
- text = ("<?xml version='1.0' encoding='us-ascii'?>"
- "<e/>");
-
- XML_SetUserData(parser, (void *)callno);
- p2 = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (_XML_Parse_SINGLE_BYTES(p2, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(p2);
- return XML_STATUS_ERROR;
- }
- XML_ParserFree(p2);
- return XML_STATUS_OK;
-}
-
-START_TEST(test_default_ns_from_ext_subset_and_ext_ge) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
- " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/ns1'>\n"
- "&en;\n"
- "</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_handler);
- /* We actually need to set this handler to tickle this bug. */
- XML_SetStartElementHandler(g_parser, dummy_start_element);
- XML_SetUserData(g_parser, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Regression test #1 for SF bug #673791. */
-START_TEST(test_ns_prefix_with_empty_uri_1) {
- const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
- " <e xmlns:prefix=''/>\n"
- "</doc>";
-
- expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
- "Did not report re-setting namespace"
- " URI with prefix to ''.");
-}
-END_TEST
-
-/* Regression test #2 for SF bug #673791. */
-START_TEST(test_ns_prefix_with_empty_uri_2) {
- const char *text = "<?xml version='1.0'?>\n"
- "<docelem xmlns:pre=''/>";
-
- expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
- "Did not report setting namespace URI with prefix to ''.");
-}
-END_TEST
-
-/* Regression test #3 for SF bug #673791. */
-START_TEST(test_ns_prefix_with_empty_uri_3) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ELEMENT doc EMPTY>\n"
- " <!ATTLIST doc\n"
- " xmlns:prefix CDATA ''>\n"
- "]>\n"
- "<doc/>";
-
- expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
- "Didn't report attr default setting NS w/ prefix to ''.");
-}
-END_TEST
-
-/* Regression test #4 for SF bug #673791. */
-START_TEST(test_ns_prefix_with_empty_uri_4) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ELEMENT prefix:doc EMPTY>\n"
- " <!ATTLIST prefix:doc\n"
- " xmlns:prefix CDATA 'http://example.org/'>\n"
- "]>\n"
- "<prefix:doc/>";
- /* Packaged info expected by the end element handler;
- the weird structuring lets us re-use the triplet_end_checker()
- function also used for another test. */
- const XML_Char *elemstr[] = {XCS("http://example.org/ doc prefix")};
- XML_SetReturnNSTriplet(g_parser, XML_TRUE);
- XML_SetUserData(g_parser, (void *)elemstr);
- XML_SetEndElementHandler(g_parser, triplet_end_checker);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test with non-xmlns prefix */
-START_TEST(test_ns_unbound_prefix) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ELEMENT prefix:doc EMPTY>\n"
- " <!ATTLIST prefix:doc\n"
- " notxmlns:prefix CDATA 'http://example.org/'>\n"
- "]>\n"
- "<prefix:doc/>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Unbound prefix incorrectly passed");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_UNBOUND_PREFIX)
- xml_failure(g_parser);
-}
-END_TEST
-
-START_TEST(test_ns_default_with_empty_uri) {
- const char *text = "<doc xmlns='http://example.org/'>\n"
- " <e xmlns=''/>\n"
- "</doc>";
- /* Add some handlers to exercise extra code paths */
- XML_SetStartNamespaceDeclHandler(g_parser,
- dummy_start_namespace_decl_handler);
- XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Regression test for SF bug #692964: two prefixes for one namespace. */
-START_TEST(test_ns_duplicate_attrs_diff_prefixes) {
- const char *text = "<doc xmlns:a='http://example.org/a'\n"
- " xmlns:b='http://example.org/a'\n"
- " a:a='v' b:a='v' />";
- expect_failure(text, XML_ERROR_DUPLICATE_ATTRIBUTE,
- "did not report multiple attributes with same URI+name");
-}
-END_TEST
-
-START_TEST(test_ns_duplicate_hashes) {
- /* The hash of an attribute is calculated as the hash of its URI
- * concatenated with a space followed by its name (after the
- * colon). We wish to generate attributes with the same hash
- * value modulo the attribute table size so that we can check that
- * the attribute hash table works correctly. The attribute hash
- * table size will be the smallest power of two greater than the
- * number of attributes, but at least eight. There is
- * unfortunately no programmatic way of getting the hash or the
- * table size at user level, but the test code coverage percentage
- * will drop if the hashes cease to point to the same row.
- *
- * The cunning plan is to have few enough attributes to have a
- * reliable table size of 8, and have the single letter attribute
- * names be 8 characters apart, producing a hash which will be the
- * same modulo 8.
- */
- const char *text = "<doc xmlns:a='http://example.org/a'\n"
- " a:a='v' a:i='w' />";
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Regression test for SF bug #695401: unbound prefix. */
-START_TEST(test_ns_unbound_prefix_on_attribute) {
- const char *text = "<doc a:attr=''/>";
- expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
- "did not report unbound prefix on attribute");
-}
-END_TEST
-
-/* Regression test for SF bug #695401: unbound prefix. */
-START_TEST(test_ns_unbound_prefix_on_element) {
- const char *text = "<a:doc/>";
- expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
- "did not report unbound prefix on element");
-}
-END_TEST
-
-/* Test that the parsing status is correctly reset by XML_ParserReset().
- * We usE test_return_ns_triplet() for our example parse to improve
- * coverage of tidying up code executed.
- */
-START_TEST(test_ns_parser_reset) {
- XML_ParsingStatus status;
-
- XML_GetParsingStatus(g_parser, &status);
- if (status.parsing != XML_INITIALIZED)
- fail("parsing status doesn't start INITIALIZED");
- test_return_ns_triplet();
- XML_GetParsingStatus(g_parser, &status);
- if (status.parsing != XML_FINISHED)
- fail("parsing status doesn't end FINISHED");
- XML_ParserReset(g_parser, NULL);
- XML_GetParsingStatus(g_parser, &status);
- if (status.parsing != XML_INITIALIZED)
- fail("parsing status doesn't reset to INITIALIZED");
-}
-END_TEST
-
-/* Test that long element names with namespaces are handled correctly */
-START_TEST(test_ns_long_element) {
- const char *text
- = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
- " xmlns:foo='http://example.org/' bar:a='12'\n"
- " xmlns:bar='http://example.org/'>"
- "</foo:thisisalongenoughelementnametotriggerareallocation>";
- const XML_Char *elemstr[]
- = {XCS("http://example.org/")
- XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
- XCS("http://example.org/ a bar")};
-
- XML_SetReturnNSTriplet(g_parser, XML_TRUE);
- XML_SetUserData(g_parser, (void *)elemstr);
- XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test mixed population of prefixed and unprefixed attributes */
-START_TEST(test_ns_mixed_prefix_atts) {
- const char *text = "<e a='12' bar:b='13'\n"
- " xmlns:bar='http://example.org/'>"
- "</e>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test having a long namespaced element name inside a short one.
- * This exercises some internal buffer reallocation that is shared
- * across elements with the same namespace URI.
- */
-START_TEST(test_ns_extend_uri_buffer) {
- const char *text = "<foo:e xmlns:foo='http://example.org/'>"
- " <foo:thisisalongenoughnametotriggerallocationaction"
- " foo:a='12' />"
- "</foo:e>";
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test that xmlns is correctly rejected as an attribute in the xmlns
- * namespace, but not in other namespaces
- */
-START_TEST(test_ns_reserved_attributes) {
- const char *text1
- = "<foo:e xmlns:foo='http://example.org/' xmlns:xmlns='12' />";
- const char *text2
- = "<foo:e xmlns:foo='http://example.org/' foo:xmlns='12' />";
- expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XMLNS,
- "xmlns not rejected as an attribute");
- XML_ParserReset(g_parser, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test more reserved attributes */
-START_TEST(test_ns_reserved_attributes_2) {
- const char *text1 = "<foo:e xmlns:foo='http://example.org/'"
- " xmlns:xml='http://example.org/' />";
- const char *text2
- = "<foo:e xmlns:foo='http://www.w3.org/XML/1998/namespace' />";
- const char *text3 = "<foo:e xmlns:foo='http://www.w3.org/2000/xmlns/' />";
-
- expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XML,
- "xml not rejected as an attribute");
- XML_ParserReset(g_parser, NULL);
- expect_failure(text2, XML_ERROR_RESERVED_NAMESPACE_URI,
- "Use of w3.org URL not faulted");
- XML_ParserReset(g_parser, NULL);
- expect_failure(text3, XML_ERROR_RESERVED_NAMESPACE_URI,
- "Use of w3.org xmlns URL not faulted");
-}
-END_TEST
-
-/* Test string pool handling of namespace names of 2048 characters */
-/* Exercises a particular string pool growth path */
-START_TEST(test_ns_extremely_long_prefix) {
- /* C99 compilers are only required to support 4095-character
- * strings, so the following needs to be split in two to be safe
- * for all compilers.
- */
- const char *text1
- = "<doc "
- /* 64 character on each line */
- /* ...gives a total length of 2048 */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ":a='12'";
- const char *text2
- = " xmlns:"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "='foo'\n>"
- "</doc>";
-
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-/* Test unknown encoding handlers in namespace setup */
-START_TEST(test_ns_unknown_encoding_success) {
- const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
- "<foo:e xmlns:foo='http://example.org/'>Hi</foo:e>";
-
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- run_character_check(text, XCS("Hi"));
-}
-END_TEST
-
-/* Test that too many colons are rejected */
-START_TEST(test_ns_double_colon) {
- const char *text = "<foo:e xmlns:foo='http://example.org/' foo:a:b='bar' />";
- const enum XML_Status status
- = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
-#ifdef XML_NS
- if ((status == XML_STATUS_OK)
- || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
- fail("Double colon in attribute name not faulted"
- " (despite active namespace support)");
- }
-#else
- if (status != XML_STATUS_OK) {
- fail("Double colon in attribute name faulted"
- " (despite inactive namespace support");
- }
-#endif
-}
-END_TEST
-
-START_TEST(test_ns_double_colon_element) {
- const char *text = "<foo:bar:e xmlns:foo='http://example.org/' />";
- const enum XML_Status status
- = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
-#ifdef XML_NS
- if ((status == XML_STATUS_OK)
- || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
- fail("Double colon in element name not faulted"
- " (despite active namespace support)");
- }
-#else
- if (status != XML_STATUS_OK) {
- fail("Double colon in element name faulted"
- " (despite inactive namespace support");
- }
-#endif
-}
-END_TEST
-
-/* Test that non-name characters after a colon are rejected */
-START_TEST(test_ns_bad_attr_leafname) {
- const char *text = "<foo:e xmlns:foo='http://example.org/' foo:?ar='baz' />";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Invalid character in leafname not faulted");
-}
-END_TEST
-
-START_TEST(test_ns_bad_element_leafname) {
- const char *text = "<foo:?oc xmlns:foo='http://example.org/' />";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Invalid character in element leafname not faulted");
-}
-END_TEST
-
-/* Test high-byte-set UTF-16 characters are valid in a leafname */
-START_TEST(test_ns_utf16_leafname) {
- const char text[] =
- /* <n:e xmlns:n='URI' n:{KHO KHWAI}='a' />
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- */
- "<\0n\0:\0e\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0 \0"
- "n\0:\0\x04\x0e=\0'\0a\0'\0 \0/\0>\0";
- const XML_Char *expected = XCS("a");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetStartElementHandler(g_parser, accumulate_attribute);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_ns_utf16_element_leafname) {
- const char text[] =
- /* <n:{KHO KHWAI} xmlns:n='URI'/>
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- */
- "\0<\0n\0:\x0e\x04\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0/\0>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("URI \x0e04");
-#else
- const XML_Char *expected = XCS("URI \xe0\xb8\x84");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetStartElementHandler(g_parser, start_element_event_handler);
- XML_SetUserData(g_parser, &storage);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_ns_utf16_doctype) {
- const char text[] =
- /* <!DOCTYPE foo:{KHO KHWAI} [ <!ENTITY bar 'baz'> ]>\n
- * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
- */
- "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0f\0o\0o\0:\x0e\x04\0 "
- "\0[\0 \0<\0!\0E\0N\0T\0I\0T\0Y\0 \0b\0a\0r\0 \0'\0b\0a\0z\0'\0>\0 "
- "\0]\0>\0\n"
- /* <foo:{KHO KHWAI} xmlns:foo='URI'>&bar;</foo:{KHO KHWAI}> */
- "\0<\0f\0o\0o\0:\x0e\x04\0 "
- "\0x\0m\0l\0n\0s\0:\0f\0o\0o\0=\0'\0U\0R\0I\0'\0>"
- "\0&\0b\0a\0r\0;"
- "\0<\0/\0f\0o\0o\0:\x0e\x04\0>";
-#ifdef XML_UNICODE
- const XML_Char *expected = XCS("URI \x0e04");
-#else
- const XML_Char *expected = XCS("URI \xe0\xb8\x84");
-#endif
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetStartElementHandler(g_parser, start_element_event_handler);
- XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-START_TEST(test_ns_invalid_doctype) {
- const char *text = "<!DOCTYPE foo:!bad [ <!ENTITY bar 'baz' ]>\n"
- "<foo:!bad>&bar;</foo:!bad>";
-
- expect_failure(text, XML_ERROR_INVALID_TOKEN,
- "Invalid character in document local name not faulted");
-}
-END_TEST
-
-START_TEST(test_ns_double_colon_doctype) {
- const char *text = "<!DOCTYPE foo:a:doc [ <!ENTITY bar 'baz' ]>\n"
- "<foo:a:doc>&bar;</foo:a:doc>";
-
- expect_failure(text, XML_ERROR_SYNTAX,
- "Double colon in document name not faulted");
-}
-END_TEST
-
-/* Control variable; the number of times duff_allocator() will successfully
- * allocate */
-#define ALLOC_ALWAYS_SUCCEED (-1)
-#define REALLOC_ALWAYS_SUCCEED (-1)
-
-static intptr_t allocation_count = ALLOC_ALWAYS_SUCCEED;
-static intptr_t reallocation_count = REALLOC_ALWAYS_SUCCEED;
-
-/* Crocked allocator for allocation failure tests */
-static void *
-duff_allocator(size_t size) {
- if (allocation_count == 0)
- return NULL;
- if (allocation_count != ALLOC_ALWAYS_SUCCEED)
- allocation_count--;
- return malloc(size);
-}
-
-/* Crocked reallocator for allocation failure tests */
-static void *
-duff_reallocator(void *ptr, size_t size) {
- if (reallocation_count == 0)
- return NULL;
- if (reallocation_count != REALLOC_ALWAYS_SUCCEED)
- reallocation_count--;
- return realloc(ptr, size);
-}
-
-/* Test that a failure to allocate the parser structure fails gracefully */
-START_TEST(test_misc_alloc_create_parser) {
- XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
- unsigned int i;
- const unsigned int max_alloc_count = 10;
-
- /* Something this simple shouldn't need more than 10 allocations */
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
- if (g_parser != NULL)
- break;
- }
- if (i == 0)
- fail("Parser unexpectedly ignored failing allocator");
- else if (i == max_alloc_count)
- fail("Parser not created with max allocation count");
-}
-END_TEST
-
-/* Test memory allocation failures for a parser with an encoding */
-START_TEST(test_misc_alloc_create_parser_with_encoding) {
- XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
- unsigned int i;
- const unsigned int max_alloc_count = 10;
-
- /* Try several levels of allocation */
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- g_parser = XML_ParserCreate_MM(XCS("us-ascii"), &memsuite, NULL);
- if (g_parser != NULL)
- break;
- }
- if (i == 0)
- fail("Parser ignored failing allocator");
- else if (i == max_alloc_count)
- fail("Parser not created with max allocation count");
-}
-END_TEST
-
-/* Test that freeing a NULL parser doesn't cause an explosion.
- * (Not actually tested anywhere else)
- */
-START_TEST(test_misc_null_parser) {
- XML_ParserFree(NULL);
-}
-END_TEST
-
-/* Test that XML_ErrorString rejects out-of-range codes */
-START_TEST(test_misc_error_string) {
- if (XML_ErrorString((enum XML_Error) - 1) != NULL)
- fail("Negative error code not rejected");
- if (XML_ErrorString((enum XML_Error)100) != NULL)
- fail("Large error code not rejected");
-}
-END_TEST
-
-/* Test the version information is consistent */
-
-/* Since we are working in XML_LChars (potentially 16-bits), we
- * can't use the standard C library functions for character
- * manipulation and have to roll our own.
- */
-static int
-parse_version(const XML_LChar *version_text,
- XML_Expat_Version *version_struct) {
- if (! version_text)
- return XML_FALSE;
-
- while (*version_text != 0x00) {
- if (*version_text >= ASCII_0 && *version_text <= ASCII_9)
- break;
- version_text++;
- }
- if (*version_text == 0x00)
- return XML_FALSE;
-
- /* version_struct->major = strtoul(version_text, 10, &version_text) */
- version_struct->major = 0;
- while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
- version_struct->major
- = 10 * version_struct->major + (*version_text++ - ASCII_0);
- }
- if (*version_text++ != ASCII_PERIOD)
- return XML_FALSE;
-
- /* Now for the minor version number */
- version_struct->minor = 0;
- while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
- version_struct->minor
- = 10 * version_struct->minor + (*version_text++ - ASCII_0);
- }
- if (*version_text++ != ASCII_PERIOD)
- return XML_FALSE;
-
- /* Finally the micro version number */
- version_struct->micro = 0;
- while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
- version_struct->micro
- = 10 * version_struct->micro + (*version_text++ - ASCII_0);
- }
- if (*version_text != 0x00)
- return XML_FALSE;
- return XML_TRUE;
-}
-
-static int
-versions_equal(const XML_Expat_Version *first,
- const XML_Expat_Version *second) {
- return (first->major == second->major && first->minor == second->minor
- && first->micro == second->micro);
-}
-
-START_TEST(test_misc_version) {
- XML_Expat_Version read_version = XML_ExpatVersionInfo();
- /* Silence compiler warning with the following assignment */
- XML_Expat_Version parsed_version = {0, 0, 0};
- const XML_LChar *version_text = XML_ExpatVersion();
-
- if (version_text == NULL)
- fail("Could not obtain version text");
- assert(version_text != NULL);
- if (! parse_version(version_text, &parsed_version))
- fail("Unable to parse version text");
- if (! versions_equal(&read_version, &parsed_version))
- fail("Version mismatch");
-
-#if ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T)
- if (xcstrcmp(version_text, XCS("expat_2.2.10"))) /* needs bump on releases */
- fail("XML_*_VERSION in expat.h out of sync?\n");
-#else
- /* If we have XML_UNICODE defined but not XML_UNICODE_WCHAR_T
- * then XML_LChar is defined as char, for some reason.
- */
- if (strcmp(version_text, "expat_2.2.5")) /* needs bump on releases */
- fail("XML_*_VERSION in expat.h out of sync?\n");
-#endif /* ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T) */
-}
-END_TEST
-
-/* Test feature information */
-START_TEST(test_misc_features) {
- const XML_Feature *features = XML_GetFeatureList();
-
- /* Prevent problems with double-freeing parsers */
- g_parser = NULL;
- if (features == NULL) {
- fail("Failed to get feature information");
- } else {
- /* Loop through the features checking what we can */
- while (features->feature != XML_FEATURE_END) {
- switch (features->feature) {
- case XML_FEATURE_SIZEOF_XML_CHAR:
- if (features->value != sizeof(XML_Char))
- fail("Incorrect size of XML_Char");
- break;
- case XML_FEATURE_SIZEOF_XML_LCHAR:
- if (features->value != sizeof(XML_LChar))
- fail("Incorrect size of XML_LChar");
- break;
- default:
- break;
- }
- features++;
- }
- }
-}
-END_TEST
-
-/* Regression test for GitHub Issue #17: memory leak parsing attribute
- * values with mixed bound and unbound namespaces.
- */
-START_TEST(test_misc_attribute_leak) {
- const char *text = "<D xmlns:L=\"D\" l:a='' L:a=''/>";
- XML_Memory_Handling_Suite memsuite
- = {tracking_malloc, tracking_realloc, tracking_free};
-
- g_parser = XML_ParserCreate_MM(XCS("UTF-8"), &memsuite, XCS("\n"));
- expect_failure(text, XML_ERROR_UNBOUND_PREFIX, "Unbound prefixes not found");
- XML_ParserFree(g_parser);
- /* Prevent the teardown trying to double free */
- g_parser = NULL;
-
- if (! tracking_report())
- fail("Memory leak found");
-}
-END_TEST
-
-/* Test parser created for UTF-16LE is successful */
-START_TEST(test_misc_utf16le) {
- const char text[] =
- /* <?xml version='1.0'?><q>Hi</q> */
- "<\0?\0x\0m\0l\0 \0"
- "v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0?\0>\0"
- "<\0q\0>\0H\0i\0<\0/\0q\0>\0";
- const XML_Char *expected = XCS("Hi");
- CharData storage;
-
- g_parser = XML_ParserCreate(XCS("UTF-16LE"));
- if (g_parser == NULL)
- fail("Parser not created");
-
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected);
-}
-END_TEST
-
-typedef struct {
- XML_Parser parser;
- int deep;
-} DataIssue240;
-
-static void
-start_element_issue_240(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- DataIssue240 *mydata = (DataIssue240 *)userData;
- UNUSED_P(name);
- UNUSED_P(atts);
- mydata->deep++;
-}
-
-static void
-end_element_issue_240(void *userData, const XML_Char *name) {
- DataIssue240 *mydata = (DataIssue240 *)userData;
-
- UNUSED_P(name);
- mydata->deep--;
- if (mydata->deep == 0) {
- XML_StopParser(mydata->parser, 0);
- }
-}
-
-START_TEST(test_misc_stop_during_end_handler_issue_240_1) {
- XML_Parser parser;
- DataIssue240 *mydata;
- enum XML_Status result;
- const char *const doc1 = "<doc><e1/><e><foo/></e></doc>";
-
- parser = XML_ParserCreate(NULL);
- XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
- mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
- mydata->parser = parser;
- mydata->deep = 0;
- XML_SetUserData(parser, mydata);
-
- result = XML_Parse(parser, doc1, (int)strlen(doc1), 1);
- XML_ParserFree(parser);
- free(mydata);
- if (result != XML_STATUS_ERROR)
- fail("Stopping the parser did not work as expected");
-}
-END_TEST
-
-START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
- XML_Parser parser;
- DataIssue240 *mydata;
- enum XML_Status result;
- const char *const doc2 = "<doc><elem/></doc>";
-
- parser = XML_ParserCreate(NULL);
- XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
- mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
- mydata->parser = parser;
- mydata->deep = 0;
- XML_SetUserData(parser, mydata);
-
- result = XML_Parse(parser, doc2, (int)strlen(doc2), 1);
- XML_ParserFree(parser);
- free(mydata);
- if (result != XML_STATUS_ERROR)
- fail("Stopping the parser did not work as expected");
-}
-END_TEST
-
-START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) {
- const char *const inputOne = "<!DOCTYPE d [\n"
- "<!ENTITY % e ']><d/>'>\n"
- "\n"
- "%e;";
- const char *const inputTwo = "<!DOCTYPE d [\n"
- "<!ENTITY % e1 ']><d/>'><!ENTITY % e2 '&e1;'>\n"
- "\n"
- "%e2;";
- const char *const inputThree = "<!DOCTYPE d [\n"
- "<!ENTITY % e ']><d'>\n"
- "\n"
- "%e;";
- const char *const inputIssue317 = "<!DOCTYPE doc [\n"
- "<!ENTITY % foo ']>\n"
- "<doc>Hell<oc (#PCDATA)*>'>\n"
- "%foo;\n"
- "]>\n"
- "<doc>Hello, world</dVc>";
-
- const char *const inputs[] = {inputOne, inputTwo, inputThree, inputIssue317};
- size_t inputIndex = 0;
-
- for (; inputIndex < sizeof(inputs) / sizeof(inputs[0]); inputIndex++) {
- XML_Parser parser;
- enum XML_Status parseResult;
- int setParamEntityResult;
- XML_Size lineNumber;
- XML_Size columnNumber;
- const char *const input = inputs[inputIndex];
-
- parser = XML_ParserCreate(NULL);
- setParamEntityResult
- = XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- if (setParamEntityResult != 1)
- fail("Failed to set XML_PARAM_ENTITY_PARSING_ALWAYS.");
-
- parseResult = XML_Parse(parser, input, (int)strlen(input), 0);
- if (parseResult != XML_STATUS_ERROR) {
- parseResult = XML_Parse(parser, "", 0, 1);
- if (parseResult != XML_STATUS_ERROR) {
- fail("Parsing was expected to fail but succeeded.");
- }
- }
-
- if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
- fail("Error code does not match XML_ERROR_INVALID_TOKEN");
-
- lineNumber = XML_GetCurrentLineNumber(parser);
- if (lineNumber != 4)
- fail("XML_GetCurrentLineNumber does not work as expected.");
-
- columnNumber = XML_GetCurrentColumnNumber(parser);
- if (columnNumber != 0)
- fail("XML_GetCurrentColumnNumber does not work as expected.");
-
- XML_ParserFree(parser);
- }
-}
-END_TEST
-
-static void
-alloc_setup(void) {
- XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
-
- /* Ensure the parser creation will go through */
- allocation_count = ALLOC_ALWAYS_SUCCEED;
- reallocation_count = REALLOC_ALWAYS_SUCCEED;
- g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
- if (g_parser == NULL)
- fail("Parser not created");
-}
-
-static void
-alloc_teardown(void) {
- basic_teardown();
-}
-
-/* Test the effects of allocation failures on xml declaration processing */
-START_TEST(test_alloc_parse_xdecl) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>Hello, world</doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* Resetting the parser is insufficient, because some memory
- * allocations are cached within the parser. Instead we use
- * the teardown and setup routines to ensure that we have the
- * right sort of parser back in our hands.
- */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-/* As above, but with an encoding big enough to cause storing the
- * version information to expand the string pool being used.
- */
-static int XMLCALL
-long_encoding_handler(void *userData, const XML_Char *encoding,
- XML_Encoding *info) {
- int i;
-
- UNUSED_P(userData);
- UNUSED_P(encoding);
- for (i = 0; i < 256; i++)
- info->map[i] = i;
- info->data = NULL;
- info->convert = NULL;
- info->release = NULL;
- return XML_STATUS_OK;
-}
-
-START_TEST(test_alloc_parse_xdecl_2) {
- const char *text
- = "<?xml version='1.0' encoding='"
- /* Each line is 64 characters */
- "ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
- "'?>"
- "<doc>Hello, world</doc>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
- XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-/* Test the effects of allocation failures on a straightforward parse */
-START_TEST(test_alloc_parse_pi) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<?pi unknown?>\n"
- "<doc>"
- "Hello, world"
- "</doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-START_TEST(test_alloc_parse_pi_2) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>"
- "Hello, world"
- "<?pi unknown?>\n"
- "</doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-START_TEST(test_alloc_parse_pi_3) {
- const char *text
- = "<?"
- /* 64 characters per line */
- "This processing instruction should be long enough to ensure that"
- "it triggers the growth of an internal string pool when the "
- "allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "Q?><doc/>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-START_TEST(test_alloc_parse_comment) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!-- Test parsing this comment -->"
- "<doc>Hi</doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-START_TEST(test_alloc_parse_comment_2) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>"
- "Hello, world"
- "<!-- Parse this comment too -->"
- "</doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
-}
-END_TEST
-
-static int XMLCALL
-external_entity_duff_loader(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- XML_Parser new_parser;
- unsigned int i;
- const unsigned int max_alloc_count = 10;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- /* Try a few different allocation levels */
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (new_parser != NULL) {
- XML_ParserFree(new_parser);
- break;
- }
- }
- if (i == 0)
- fail("External parser creation ignored failing allocator");
- else if (i == max_alloc_count)
- fail("Extern parser not created with max allocation count");
-
- /* Make sure other random allocation doesn't now fail */
- allocation_count = ALLOC_ALWAYS_SUCCEED;
-
- /* Make sure the failure code path is executed too */
- return XML_STATUS_ERROR;
-}
-
-/* Test that external parser creation running out of memory is
- * correctly reported. Based on the external entity test cases.
- */
-START_TEST(test_alloc_create_external_parser) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, foo_text);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_duff_loader);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR) {
- fail("External parser allocator returned success incorrectly");
- }
-}
-END_TEST
-
-/* More external parser memory allocation testing */
-START_TEST(test_alloc_run_external_parser) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
- unsigned int i;
- const unsigned int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, foo_text);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing ignored failing allocator");
- else if (i == max_alloc_count)
- fail("Parsing failed with allocation count 10");
-}
-END_TEST
-
-static int XMLCALL
-external_entity_dbl_handler(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- intptr_t callno = (intptr_t)XML_GetUserData(parser);
- const char *text;
- XML_Parser new_parser;
- int i;
- const int max_alloc_count = 20;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- if (callno == 0) {
- /* First time through, check how many calls to malloc occur */
- text = ("<!ELEMENT doc (e+)>\n"
- "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
- "<!ELEMENT e EMPTY>\n");
- allocation_count = 10000;
- new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (new_parser == NULL) {
- fail("Unable to allocate first external parser");
- return XML_STATUS_ERROR;
- }
- /* Stash the number of calls in the user data */
- XML_SetUserData(parser, (void *)(intptr_t)(10000 - allocation_count));
- } else {
- text = ("<?xml version='1.0' encoding='us-ascii'?>"
- "<e/>");
- /* Try at varying levels to exercise more code paths */
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = callno + i;
- new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (new_parser != NULL)
- break;
- }
- if (i == 0) {
- fail("Second external parser unexpectedly created");
- XML_ParserFree(new_parser);
- return XML_STATUS_ERROR;
- } else if (i == max_alloc_count) {
- fail("Second external parser not created");
- return XML_STATUS_ERROR;
- }
- }
-
- allocation_count = ALLOC_ALWAYS_SUCCEED;
- if (_XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR) {
- xml_failure(new_parser);
- return XML_STATUS_ERROR;
- }
- XML_ParserFree(new_parser);
- return XML_STATUS_OK;
-}
-
-/* Test that running out of memory in dtdCopy is correctly reported.
- * Based on test_default_ns_from_ext_subset_and_ext_ge()
- */
-START_TEST(test_alloc_dtd_copy_default_atts) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
- " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/ns1'>\n"
- "&en;\n"
- "</doc>";
-
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler);
- XML_SetUserData(g_parser, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-}
-END_TEST
-
-static int XMLCALL
-external_entity_dbl_handler_2(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- intptr_t callno = (intptr_t)XML_GetUserData(parser);
- const char *text;
- XML_Parser new_parser;
- enum XML_Status rv;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- if (callno == 0) {
- /* Try different allocation levels for whole exercise */
- text = ("<!ELEMENT doc (e+)>\n"
- "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
- "<!ELEMENT e EMPTY>\n");
- XML_SetUserData(parser, (void *)(intptr_t)1);
- new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (new_parser == NULL)
- return XML_STATUS_ERROR;
- rv = _XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE);
- } else {
- /* Just run through once */
- text = ("<?xml version='1.0' encoding='us-ascii'?>"
- "<e/>");
- new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (new_parser == NULL)
- return XML_STATUS_ERROR;
- rv = _XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE);
- }
- XML_ParserFree(new_parser);
- if (rv == XML_STATUS_ERROR)
- return XML_STATUS_ERROR;
- return XML_STATUS_OK;
-}
-
-/* Test more external entity allocation failure paths */
-START_TEST(test_alloc_external_entity) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
- " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/ns1'>\n"
- "&en;\n"
- "</doc>";
- int i;
- const int alloc_test_max_repeats = 50;
-
- for (i = 0; i < alloc_test_max_repeats; i++) {
- allocation_count = -1;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler_2);
- XML_SetUserData(g_parser, NULL);
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- allocation_count = -1;
- if (i == 0)
- fail("External entity parsed despite duff allocator");
- if (i == alloc_test_max_repeats)
- fail("External entity not parsed at max allocation count");
-}
-END_TEST
-
-/* Test more allocation failure paths */
-static int XMLCALL
-external_entity_alloc_set_encoding(XML_Parser parser, const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId) {
- /* As for external_entity_loader() */
- const char *text = "<?xml encoding='iso-8859-3'?>"
- "\xC3\xA9";
- XML_Parser ext_parser;
- enum XML_Status status;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- return XML_STATUS_ERROR;
- if (! XML_SetEncoding(ext_parser, XCS("utf-8"))) {
- XML_ParserFree(ext_parser);
- return XML_STATUS_ERROR;
- }
- status
- = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
- XML_ParserFree(ext_parser);
- if (status == XML_STATUS_ERROR)
- return XML_STATUS_ERROR;
- return XML_STATUS_OK;
-}
-
-START_TEST(test_alloc_ext_entity_set_encoding) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- int i;
- const int max_allocation_count = 30;
-
- for (i = 0; i < max_allocation_count; i++) {
- XML_SetExternalEntityRefHandler(g_parser,
- external_entity_alloc_set_encoding);
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- break;
- allocation_count = -1;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Encoding check succeeded despite failing allocator");
- if (i == max_allocation_count)
- fail("Encoding failed at max allocation count");
-}
-END_TEST
-
-static int XMLCALL
-unknown_released_encoding_handler(void *data, const XML_Char *encoding,
- XML_Encoding *info) {
- UNUSED_P(data);
- if (! xcstrcmp(encoding, XCS("unsupported-encoding"))) {
- int i;
-
- for (i = 0; i < 256; i++)
- info->map[i] = i;
- info->data = NULL;
- info->convert = NULL;
- info->release = dummy_release;
- return XML_STATUS_OK;
- }
- return XML_STATUS_ERROR;
-}
-
-/* Test the effects of allocation failure in internal entities.
- * Based on test_unknown_encoding_internal_entity
- */
-START_TEST(test_alloc_internal_entity) {
- const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
- "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
- "<test a='&foo;'/>";
- unsigned int i;
- const unsigned int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUnknownEncodingHandler(g_parser, unknown_released_encoding_handler,
- NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Internal entity worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Internal entity failed at max allocation count");
-}
-END_TEST
-
-/* Test the robustness against allocation failure of element handling
- * Based on test_dtd_default_handling().
- */
-START_TEST(test_alloc_dtd_default_handling) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
- "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
- "<!ENTITY e1 SYSTEM 'http://example.org/e' NDATA n>\n"
- "<!ELEMENT doc (#PCDATA)>\n"
- "<!ATTLIST doc a CDATA #IMPLIED>\n"
- "<?pi in dtd?>\n"
- "<!--comment in dtd-->\n"
- "]>\n"
- "<doc><![CDATA[text in doc]]></doc>";
- const XML_Char *expected = XCS("\n\n\n\n\n\n\n\n\n<doc>text in doc</doc>");
- CharData storage;
- int i;
- const int max_alloc_count = 25;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- dummy_handler_flags = 0;
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
- dummy_end_doctype_handler);
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- XML_SetCdataSectionHandler(g_parser, dummy_start_cdata_handler,
- dummy_end_cdata_handler);
- XML_SetUnparsedEntityDeclHandler(g_parser,
- dummy_unparsed_entity_decl_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Default DTD parsed despite allocation failures");
- if (i == max_alloc_count)
- fail("Default DTD not parsed with maximum alloc count");
- CharData_CheckXMLChars(&storage, expected);
- if (dummy_handler_flags
- != (DUMMY_START_DOCTYPE_HANDLER_FLAG | DUMMY_END_DOCTYPE_HANDLER_FLAG
- | DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG
- | DUMMY_ELEMENT_DECL_HANDLER_FLAG | DUMMY_ATTLIST_DECL_HANDLER_FLAG
- | DUMMY_COMMENT_HANDLER_FLAG | DUMMY_PI_HANDLER_FLAG
- | DUMMY_START_CDATA_HANDLER_FLAG | DUMMY_END_CDATA_HANDLER_FLAG
- | DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG))
- fail("Not all handlers were called");
-}
-END_TEST
-
-/* Test robustness of XML_SetEncoding() with a failing allocator */
-START_TEST(test_alloc_explicit_encoding) {
- int i;
- const int max_alloc_count = 5;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (XML_SetEncoding(g_parser, XCS("us-ascii")) == XML_STATUS_OK)
- break;
- }
- if (i == 0)
- fail("Encoding set despite failing allocator");
- else if (i == max_alloc_count)
- fail("Encoding not set at max allocation count");
-}
-END_TEST
-
-/* Test robustness of XML_SetBase against a failing allocator */
-START_TEST(test_alloc_set_base) {
- const XML_Char *new_base = XCS("/local/file/name.xml");
- int i;
- const int max_alloc_count = 5;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (XML_SetBase(g_parser, new_base) == XML_STATUS_OK)
- break;
- }
- if (i == 0)
- fail("Base set despite failing allocator");
- else if (i == max_alloc_count)
- fail("Base not set with max allocation count");
-}
-END_TEST
-
-/* Test buffer extension in the face of a duff reallocator */
-START_TEST(test_alloc_realloc_buffer) {
- const char *text = get_buffer_test_text;
- void *buffer;
- int i;
- const int max_realloc_count = 10;
-
- /* Get a smallish buffer */
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- buffer = XML_GetBuffer(g_parser, 1536);
- if (buffer == NULL)
- fail("1.5K buffer reallocation failed");
- assert(buffer != NULL);
- memcpy(buffer, text, strlen(text));
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
- == XML_STATUS_OK)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- reallocation_count = -1;
- if (i == 0)
- fail("Parse succeeded with no reallocation");
- else if (i == max_realloc_count)
- fail("Parse failed with max reallocation count");
-}
-END_TEST
-
-/* Same test for external entity parsers */
-static int XMLCALL
-external_entity_reallocator(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = get_buffer_test_text;
- XML_Parser ext_parser;
- void *buffer;
- enum XML_Status status;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- fail("Could not create external entity parser");
-
- reallocation_count = (intptr_t)XML_GetUserData(parser);
- buffer = XML_GetBuffer(ext_parser, 1536);
- if (buffer == NULL)
- fail("Buffer allocation failed");
- assert(buffer != NULL);
- memcpy(buffer, text, strlen(text));
- status = XML_ParseBuffer(ext_parser, (int)strlen(text), XML_FALSE);
- reallocation_count = -1;
- XML_ParserFree(ext_parser);
- return (status == XML_STATUS_OK) ? XML_STATUS_OK : XML_STATUS_ERROR;
-}
-
-START_TEST(test_alloc_ext_entity_realloc_buffer) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- XML_SetExternalEntityRefHandler(g_parser, external_entity_reallocator);
- XML_SetUserData(g_parser, (void *)(intptr_t)i);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Succeeded with no reallocations");
- if (i == max_realloc_count)
- fail("Failed with max reallocations");
-}
-END_TEST
-
-/* Test elements with many attributes are handled correctly */
-START_TEST(test_alloc_realloc_many_attributes) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ATTLIST doc za CDATA 'default'>\n"
- "<!ATTLIST doc zb CDATA 'def2'>\n"
- "<!ATTLIST doc zc CDATA 'def3'>\n"
- "]>\n"
- "<doc a='1'"
- " b='2'"
- " c='3'"
- " d='4'"
- " e='5'"
- " f='6'"
- " g='7'"
- " h='8'"
- " i='9'"
- " j='10'"
- " k='11'"
- " l='12'"
- " m='13'"
- " n='14'"
- " p='15'"
- " q='16'"
- " r='17'"
- " s='18'>"
- "</doc>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite no reallocations");
- if (i == max_realloc_count)
- fail("Parse failed at max reallocations");
-}
-END_TEST
-
-/* Test handling of a public entity with failing allocator */
-START_TEST(test_alloc_public_entity_value) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc></doc>\n";
- char dtd_text[]
- = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 PUBLIC 'foo' 'bar.ent'>\n"
- "<!ENTITY % "
- /* Each line is 64 characters */
- "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " '%e1;'>\n"
- "%e1;\n";
- int i;
- const int max_alloc_count = 50;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- dummy_handler_flags = 0;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
- /* Provoke a particular code path */
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocation");
- if (i == max_alloc_count)
- fail("Parsing failed at max allocation count");
- if (dummy_handler_flags != DUMMY_ENTITY_DECL_HANDLER_FLAG)
- fail("Entity declaration handler not called");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_subst_public_entity_value) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc></doc>\n";
- char dtd_text[]
- = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % "
- /* Each line is 64 characters */
- "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " PUBLIC 'foo' 'bar.ent'>\n"
- "%ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP;";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocation");
- if (i == max_realloc_count)
- fail("Parsing failed at max reallocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_parse_public_doctype) {
- const char *text
- = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!DOCTYPE doc PUBLIC '"
- /* 64 characters per line */
- "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "' 'test'>\n"
- "<doc></doc>";
- int i;
- const int max_alloc_count = 25;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- dummy_handler_flags = 0;
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
- dummy_end_doctype_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags
- != (DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG
- | DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG))
- fail("Doctype handler functions not called");
-}
-END_TEST
-
-START_TEST(test_alloc_parse_public_doctype_long_name) {
- const char *text
- = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!DOCTYPE doc PUBLIC 'http://example.com/foo' '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "'>\n"
- "<doc></doc>";
- int i;
- const int max_alloc_count = 25;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
- dummy_end_doctype_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-static int XMLCALL
-external_entity_alloc(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
- const char *text = (const char *)XML_GetUserData(parser);
- XML_Parser ext_parser;
- int parse_res;
-
- UNUSED_P(base);
- UNUSED_P(systemId);
- UNUSED_P(publicId);
- ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
- if (ext_parser == NULL)
- return XML_STATUS_ERROR;
- parse_res
- = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
- XML_ParserFree(ext_parser);
- return parse_res;
-}
-
-/* Test foreign DTD handling */
-START_TEST(test_alloc_set_foreign_dtd) {
- const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<doc>&entity;</doc>";
- char text2[] = "<!ELEMENT doc (#PCDATA)*>";
- int i;
- const int max_alloc_count = 25;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &text2);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
- fail("Could not set foreign DTD");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-/* Test based on ibm/valid/P32/ibm32v04.xml */
-START_TEST(test_alloc_attribute_enum_value) {
- const char *text = "<?xml version='1.0' standalone='no'?>\n"
- "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
- "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
- char dtd_text[] = "<!ELEMENT animal (#PCDATA|a)*>\n"
- "<!ELEMENT a EMPTY>\n"
- "<!ATTLIST animal xml:space (default|preserve) 'preserve'>";
- int i;
- const int max_alloc_count = 30;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- /* An attribute list handler provokes a different code path */
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-/* Test attribute enums sufficient to overflow the string pool */
-START_TEST(test_alloc_realloc_attribute_enum_value) {
- const char *text = "<?xml version='1.0' standalone='no'?>\n"
- "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
- "<animal>This is a yellow tiger</animal>";
- /* We wish to define a collection of attribute enums that will
- * cause the string pool storing them to have to expand. This
- * means more than 1024 bytes, including the parentheses and
- * separator bars.
- */
- char dtd_text[]
- = "<!ELEMENT animal (#PCDATA)*>\n"
- "<!ATTLIST animal thing "
- "(default"
- /* Each line is 64 characters */
- "|ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO)"
- " 'default'>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- /* An attribute list handler provokes a different code path */
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-/* Test attribute enums in a #IMPLIED attribute forcing pool growth */
-START_TEST(test_alloc_realloc_implied_attribute) {
- /* Forcing this particular code path is a balancing act. The
- * addition of the closing parenthesis and terminal NUL must be
- * what pushes the string of enums over the 1024-byte limit,
- * otherwise a different code path will pick up the realloc.
- */
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc EMPTY>\n"
- "<!ATTLIST doc a "
- /* Each line is 64 characters */
- "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
- " #IMPLIED>\n"
- "]><doc/>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-/* Test attribute enums in a defaulted attribute forcing pool growth */
-START_TEST(test_alloc_realloc_default_attribute) {
- /* Forcing this particular code path is a balancing act. The
- * addition of the closing parenthesis and terminal NUL must be
- * what pushes the string of enums over the 1024-byte limit,
- * otherwise a different code path will pick up the realloc.
- */
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc EMPTY>\n"
- "<!ATTLIST doc a "
- /* Each line is 64 characters */
- "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
- " 'ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO'"
- ">\n]><doc/>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-/* Test long notation name with dodgy allocator */
-START_TEST(test_alloc_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!NOTATION "
- /* Each line is 64 characters */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " SYSTEM 'http://example.org/n'>\n"
- "<!ENTITY e SYSTEM 'http://example.org/e' NDATA "
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ">\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- dummy_handler_flags = 0;
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite allocation failures");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags
- != (DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG))
- fail("Entity declaration handler not called");
-}
-END_TEST
-
-/* Test public notation with dodgy allocator */
-START_TEST(test_alloc_public_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!NOTATION note PUBLIC '"
- /* 64 characters per line */
- "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "' 'foo'>\n"
- "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- dummy_handler_flags = 0;
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite allocation failures");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags != DUMMY_NOTATION_DECL_HANDLER_FLAG)
- fail("Notation handler not called");
-}
-END_TEST
-
-/* Test public notation with dodgy allocator */
-START_TEST(test_alloc_system_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!NOTATION note SYSTEM '"
- /* 64 characters per line */
- "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "'>\n"
- "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- dummy_handler_flags = 0;
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite allocation failures");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags != DUMMY_NOTATION_DECL_HANDLER_FLAG)
- fail("Notation handler not called");
-}
-END_TEST
-
-START_TEST(test_alloc_nested_groups) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc "
- /* Sixteen elements per line */
- "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
- "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
- "))))))))))))))))))))))))))))))))>\n"
- "<!ELEMENT e EMPTY>"
- "]>\n"
- "<doc><e/></doc>";
- CharData storage;
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- CharData_Init(&storage);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
-
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum reallocation count");
- CharData_CheckXMLChars(&storage, XCS("doce"));
- if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler not fired");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_nested_groups) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc "
- /* Sixteen elements per line */
- "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
- "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
- "))))))))))))))))))))))))))))))))>\n"
- "<!ELEMENT e EMPTY>"
- "]>\n"
- "<doc><e/></doc>";
- CharData storage;
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- CharData_Init(&storage);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
-
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- CharData_CheckXMLChars(&storage, XCS("doce"));
- if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler not fired");
-}
-END_TEST
-
-START_TEST(test_alloc_large_group) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc ("
- "a1|a2|a3|a4|a5|a6|a7|a8|"
- "b1|b2|b3|b4|b5|b6|b7|b8|"
- "c1|c2|c3|c4|c5|c6|c7|c8|"
- "d1|d2|d3|d4|d5|d6|d7|d8|"
- "e1"
- ")+>\n"
- "]>\n"
- "<doc>\n"
- "<a1/>\n"
- "</doc>\n";
- int i;
- const int max_alloc_count = 50;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler flag not raised");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_group_choice) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc ("
- "a1|a2|a3|a4|a5|a6|a7|a8|"
- "b1|b2|b3|b4|b5|b6|b7|b8|"
- "c1|c2|c3|c4|c5|c6|c7|c8|"
- "d1|d2|d3|d4|d5|d6|d7|d8|"
- "e1"
- ")+>\n"
- "]>\n"
- "<doc>\n"
- "<a1/>\n"
- "<b2 attr='foo'>This is a foo</b2>\n"
- "<c3></c3>\n"
- "</doc>\n";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler flag not raised");
-}
-END_TEST
-
-START_TEST(test_alloc_pi_in_epilog) {
- const char *text = "<doc></doc>\n"
- "<?pi in epilog?>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse completed despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags != DUMMY_PI_HANDLER_FLAG)
- fail("Processing instruction handler not invoked");
-}
-END_TEST
-
-START_TEST(test_alloc_comment_in_epilog) {
- const char *text = "<doc></doc>\n"
- "<!-- comment in epilog -->";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- dummy_handler_flags = 0;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse completed despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (dummy_handler_flags != DUMMY_COMMENT_HANDLER_FLAG)
- fail("Processing instruction handler not invoked");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_long_attribute_value) {
- const char *text
- = "<!DOCTYPE doc [<!ENTITY foo '"
- /* Each line is 64 characters */
- "This entity will be substituted as an attribute value, and is "
- "calculated to be exactly long enough that the terminating NUL "
- "that the library adds internally will trigger the string pool to"
- "grow. GHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>]>\n"
- "<doc a='&foo;'></doc>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_attribute_whitespace) {
- const char *text = "<doc a=' '></doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_attribute_predefined_entity) {
- const char *text = "<doc a='&amp;'></doc>";
- int i;
- const int max_alloc_count = 15;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-/* Test that a character reference at the end of a suitably long
- * default value for an attribute can trigger pool growth, and recovers
- * if the allocator fails on it.
- */
-START_TEST(test_alloc_long_attr_default_with_char_ref) {
- const char *text
- = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHI"
- "&#x31;'>]>\n"
- "<doc/>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-/* Test that a long character reference substitution triggers a pool
- * expansion correctly for an attribute value.
- */
-START_TEST(test_alloc_long_attr_value) {
- const char *text
- = "<!DOCTYPE test [<!ENTITY foo '\n"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>]>\n"
- "<test a='&foo;'/>";
- int i;
- const int max_alloc_count = 25;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
-}
-END_TEST
-
-/* Test that an error in a nested parameter entity substitution is
- * handled correctly. It seems unlikely that the code path being
- * exercised can be reached purely by carefully crafted XML, but an
- * allocation error in the right place will definitely do it.
- */
-START_TEST(test_alloc_nested_entities) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
- "<doc />";
- ExtFaults test_data
- = {"<!ENTITY % pe1 '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>\n"
- "<!ENTITY % pe2 '%pe1;'>\n"
- "%pe2;",
- "Memory Fail not faulted", NULL, XML_ERROR_NO_MEMORY};
-
- /* Causes an allocation error in a nested storeEntityValue() */
- allocation_count = 12;
- XML_SetUserData(g_parser, &test_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Entity allocation failure not noted");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_param_entity_newline) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc/>";
- char dtd_text[]
- = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
- /* 64 characters per line */
- "This default value is carefully crafted so that the carriage "
- "return right at the end of the entity string causes an internal "
- "string pool to have to grow. This allows us to test the alloc "
- "failure path from that point. OPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDE"
- "\">\n'>"
- "%pe;\n";
- int i;
- const int max_realloc_count = 5;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_ce_extends_pe) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc/>";
- char dtd_text[]
- = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
- /* 64 characters per line */
- "This default value is carefully crafted so that the character "
- "entity at the end causes an internal string pool to have to "
- "grow. This allows us to test the allocation failure path from "
- "that point onwards. EFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFG&#x51;"
- "\">\n'>"
- "%pe;\n";
- int i;
- const int max_realloc_count = 5;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_realloc_attributes) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ATTLIST doc\n"
- " a1 (a|b|c) 'a'\n"
- " a2 (foo|bar) #IMPLIED\n"
- " a3 NMTOKEN #IMPLIED\n"
- " a4 NMTOKENS #IMPLIED\n"
- " a5 ID #IMPLIED\n"
- " a6 IDREF #IMPLIED\n"
- " a7 IDREFS #IMPLIED\n"
- " a8 ENTITY #IMPLIED\n"
- " a9 ENTITIES #IMPLIED\n"
- " a10 CDATA #IMPLIED\n"
- " >]>\n"
- "<doc>wombat</doc>\n";
- int i;
- const int max_realloc_count = 5;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
-
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_long_doc_name) {
- const char *text =
- /* 64 characters per line */
- "<LongRootElementNameThatWillCauseTheNextAllocationToExpandTheStr"
- "ingPoolForTheDTDQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- " a='1'/>";
- int i;
- const int max_alloc_count = 20;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max reallocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_long_base) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY e SYSTEM 'foo'>\n"
- "]>\n"
- "<doc>&e;</doc>";
- char entity_text[] = "Hello world";
- const XML_Char *base =
- /* 64 characters per line */
- /* clang-format off */
- XCS("LongBaseURI/that/will/overflow/an/internal/buffer/and/cause/it/t")
- XCS("o/have/to/grow/PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/");
- /* clang-format on */
- int i;
- const int max_alloc_count = 25;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, entity_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (XML_SetBase(g_parser, base) == XML_STATUS_ERROR) {
- XML_ParserReset(g_parser, NULL);
- continue;
- }
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_long_public_id) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ENTITY e PUBLIC '"
- /* 64 characters per line */
- "LongPublicIDThatShouldResultInAnInternalStringPoolGrowingAtASpec"
- "ificMomentKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "' 'bar'>\n"
- "]>\n"
- "<doc>&e;</doc>";
- char entity_text[] = "Hello world";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, entity_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_long_entity_value) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ENTITY e1 '"
- /* 64 characters per line */
- "Long entity value that should provoke a string pool to grow whil"
- "e setting up to parse the external entity below. xyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "'>\n"
- " <!ENTITY e2 SYSTEM 'bar'>\n"
- "]>\n"
- "<doc>&e2;</doc>";
- char entity_text[] = "Hello world";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, entity_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-START_TEST(test_alloc_long_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!NOTATION note SYSTEM '"
- /* 64 characters per line */
- "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
- "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "'>\n"
- " <!ENTITY e1 SYSTEM 'foo' NDATA "
- /* 64 characters per line */
- "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
- "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- ">\n"
- " <!ENTITY e2 SYSTEM 'bar'>\n"
- "]>\n"
- "<doc>&e2;</doc>";
- ExtOption options[]
- = {{XCS("foo"), "Entity Foo"}, {XCS("bar"), "Entity Bar"}, {NULL, NULL}};
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
-
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-static void
-nsalloc_setup(void) {
- XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
- XML_Char ns_sep[2] = {' ', '\0'};
-
- /* Ensure the parser creation will go through */
- allocation_count = ALLOC_ALWAYS_SUCCEED;
- reallocation_count = REALLOC_ALWAYS_SUCCEED;
- g_parser = XML_ParserCreate_MM(NULL, &memsuite, ns_sep);
- if (g_parser == NULL)
- fail("Parser not created");
-}
-
-static void
-nsalloc_teardown(void) {
- basic_teardown();
-}
-
-/* Test the effects of allocation failure in simple namespace parsing.
- * Based on test_ns_default_with_empty_uri()
- */
-START_TEST(test_nsalloc_xmlns) {
- const char *text = "<doc xmlns='http://example.org/'>\n"
- " <e xmlns=''/>\n"
- "</doc>";
- unsigned int i;
- const unsigned int max_alloc_count = 30;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- /* Exercise more code paths with a default handler */
- XML_SetDefaultHandler(g_parser, dummy_default_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* Resetting the parser is insufficient, because some memory
- * allocations are cached within the parser. Instead we use
- * the teardown and setup routines to ensure that we have the
- * right sort of parser back in our hands.
- */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at maximum allocation count");
-}
-END_TEST
-
-/* Test XML_ParseBuffer interface with namespace and a dicky allocator */
-START_TEST(test_nsalloc_parse_buffer) {
- const char *text = "<doc>Hello</doc>";
- void *buffer;
-
- /* Try a parse before the start of the world */
- /* (Exercises new code path) */
- allocation_count = 0;
- if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
- fail("Pre-init XML_ParseBuffer not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_MEMORY)
- fail("Pre-init XML_ParseBuffer faulted for wrong reason");
-
- /* Now with actual memory allocation */
- allocation_count = ALLOC_ALWAYS_SUCCEED;
- if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_OK)
- xml_failure(g_parser);
-
- /* Check that resuming an unsuspended parser is faulted */
- if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
- fail("Resuming unsuspended parser not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NOT_SUSPENDED)
- xml_failure(g_parser);
-
- /* Get the parser into suspended state */
- XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
- resumable = XML_TRUE;
- buffer = XML_GetBuffer(g_parser, (int)strlen(text));
- if (buffer == NULL)
- fail("Could not acquire parse buffer");
- assert(buffer != NULL);
- memcpy(buffer, text, strlen(text));
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
- xml_failure(g_parser);
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Suspended XML_ParseBuffer not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
- xml_failure(g_parser);
- if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
- fail("Suspended XML_GetBuffer not faulted");
-
- /* Get it going again and complete the world */
- XML_SetCharacterDataHandler(g_parser, NULL);
- if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
- xml_failure(g_parser);
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Post-finishing XML_ParseBuffer not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
- xml_failure(g_parser);
- if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
- fail("Post-finishing XML_GetBuffer not faulted");
-}
-END_TEST
-
-/* Check handling of long prefix names (pool growth) */
-START_TEST(test_nsalloc_long_prefix) {
- const char *text
- = "<"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":foo xmlns:"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "='http://example.org/'>"
- "</"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":foo>";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* Check handling of long uri names (pool growth) */
-START_TEST(test_nsalloc_long_uri) {
- const char *text
- = "<foo:e xmlns:foo='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "' bar:a='12'\n"
- "xmlns:bar='http://example.org/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
- "'>"
- "</foo:e>";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* Test handling of long attribute names with prefixes */
-START_TEST(test_nsalloc_long_attr) {
- const char *text
- = "<foo:e xmlns:foo='http://example.org/' bar:"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "='12'\n"
- "xmlns:bar='http://example.org/'>"
- "</foo:e>";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* Test handling of an attribute name with a long namespace prefix */
-START_TEST(test_nsalloc_long_attr_prefix) {
- const char *text
- = "<foo:e xmlns:foo='http://example.org/' "
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":a='12'\n"
- "xmlns:"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "='http://example.org/'>"
- "</foo:e>";
- const XML_Char *elemstr[] = {
- /* clang-format off */
- XCS("http://example.org/ e foo"),
- XCS("http://example.org/ a ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
- /* clang-format on */
- };
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetReturnNSTriplet(g_parser, XML_TRUE);
- XML_SetUserData(g_parser, (void *)elemstr);
- XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* Test attribute handling in the face of a dodgy reallocator */
-START_TEST(test_nsalloc_realloc_attributes) {
- const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
- " xmlns:bar='http://example.org/'>"
- "</foo:e>";
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_realloc_count)
- fail("Parsing failed at max reallocation count");
-}
-END_TEST
-
-/* Test long element names with namespaces under a failing allocator */
-START_TEST(test_nsalloc_long_element) {
- const char *text
- = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
- " xmlns:foo='http://example.org/' bar:a='12'\n"
- " xmlns:bar='http://example.org/'>"
- "</foo:thisisalongenoughelementnametotriggerareallocation>";
- const XML_Char *elemstr[]
- = {XCS("http://example.org/")
- XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
- XCS("http://example.org/ a bar")};
- int i;
- const int max_alloc_count = 30;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetReturnNSTriplet(g_parser, XML_TRUE);
- XML_SetUserData(g_parser, (void *)elemstr);
- XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_alloc_count)
- fail("Parsing failed at max reallocation count");
-}
-END_TEST
-
-/* Test the effects of reallocation failure when reassigning a
- * binding.
- *
- * XML_ParserReset does not free the BINDING structures used by a
- * parser, but instead adds them to an internal free list to be reused
- * as necessary. Likewise the URI buffers allocated for the binding
- * aren't freed, but kept attached to their existing binding. If the
- * new binding has a longer URI, it will need reallocation. This test
- * provokes that reallocation, and tests the control path if it fails.
- */
-START_TEST(test_nsalloc_realloc_binding_uri) {
- const char *first = "<doc xmlns='http://example.org/'>\n"
- " <e xmlns='' />\n"
- "</doc>";
- const char *second
- = "<doc xmlns='http://example.org/long/enough/URI/to/reallocate/'>\n"
- " <e xmlns='' />\n"
- "</doc>";
- unsigned i;
- const unsigned max_realloc_count = 10;
-
- /* First, do a full parse that will leave bindings around */
- if (_XML_Parse_SINGLE_BYTES(g_parser, first, (int)strlen(first), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
-
- /* Now repeat with a longer URI and a duff reallocator */
- for (i = 0; i < max_realloc_count; i++) {
- XML_ParserReset(g_parser, NULL);
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, second, (int)strlen(second), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocation");
- else if (i == max_realloc_count)
- fail("Parsing failed at max reallocation count");
-}
-END_TEST
-
-/* Check handling of long prefix names (pool growth) */
-START_TEST(test_nsalloc_realloc_long_prefix) {
- const char *text
- = "<"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":foo xmlns:"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "='http://example.org/'>"
- "</"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":foo>";
- int i;
- const int max_realloc_count = 12;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_realloc_count)
- fail("Parsing failed even at max reallocation count");
-}
-END_TEST
-
-/* Check handling of even long prefix names (different code path) */
-START_TEST(test_nsalloc_realloc_longer_prefix) {
- const char *text
- = "<"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "Q:foo xmlns:"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "Q='http://example.org/'>"
- "</"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "Q:foo>";
- int i;
- const int max_realloc_count = 12;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_realloc_count)
- fail("Parsing failed even at max reallocation count");
-}
-END_TEST
-
-START_TEST(test_nsalloc_long_namespace) {
- const char *text1
- = "<"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":e xmlns:"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "='http://example.org/'>\n";
- const char *text2
- = "<"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":f "
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":attr='foo'/>\n"
- "</"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- ":e>";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
- != XML_STATUS_ERROR
- && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
- XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* Using a slightly shorter namespace name provokes allocations in
- * slightly different places in the code.
- */
-START_TEST(test_nsalloc_less_long_namespace) {
- const char *text
- = "<"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
- ":e xmlns:"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
- "='http://example.org/'>\n"
- "<"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
- ":f "
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
- ":att='foo'/>\n"
- "</"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
- ":e>";
- int i;
- const int max_alloc_count = 40;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-START_TEST(test_nsalloc_long_context) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ATTLIST doc baz ID #REQUIRED>\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
- "' baz='2'>\n"
- "&en;"
- "</doc>";
- ExtOption options[] = {
- {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
- int i;
- const int max_alloc_count = 70;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
-
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* This function is void; it will throw a fail() on error, so if it
- * returns normally it must have succeeded.
- */
-static void
-context_realloc_test(const char *text) {
- ExtOption options[] = {
- {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
- int i;
- const int max_realloc_count = 6;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_realloc_count)
- fail("Parsing failed even at max reallocation count");
-}
-
-START_TEST(test_nsalloc_realloc_long_context) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_context_2) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJK"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_context_3) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGH"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_context_4) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_context_5) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABC"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_context_6) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_context_7) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLM"
- "'>\n"
- "&en;"
- "</doc>";
-
- context_realloc_test(text);
-}
-END_TEST
-
-START_TEST(test_nsalloc_realloc_long_ge_name) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY "
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " SYSTEM 'bar'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/baz'>\n"
- "&"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ";"
- "</doc>";
- ExtOption options[] = {
- {XCS("foo"), "<!ELEMENT el EMPTY>"}, {XCS("bar"), "<el/>"}, {NULL, NULL}};
- int i;
- const int max_realloc_count = 10;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_realloc_count)
- fail("Parsing failed even at max reallocation count");
-}
-END_TEST
-
-/* Test that when a namespace is passed through the context mechanism
- * to an external entity parser, the parsers handle reallocation
- * failures correctly. The prefix is exactly the right length to
- * provoke particular uncommon code paths.
- */
-START_TEST(test_nsalloc_realloc_long_context_in_dtd) {
- const char *text1
- = "<!DOCTYPE "
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ":doc [\n"
- " <!ENTITY First SYSTEM 'foo/First'>\n"
- "]>\n"
- "<"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ":doc xmlns:"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "='foo/Second'>&First;";
- const char *text2
- = "</"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ":doc>";
- ExtOption options[] = {{XCS("foo/First"), "Hello world"}, {NULL, NULL}};
- int i;
- const int max_realloc_count = 20;
-
- for (i = 0; i < max_realloc_count; i++) {
- reallocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
- != XML_STATUS_ERROR
- && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
- XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_realloc_count)
- fail("Parsing failed even at max reallocation count");
-}
-END_TEST
-
-START_TEST(test_nsalloc_long_default_in_ext) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ATTLIST e a1 CDATA '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>\n"
- " <!ENTITY x SYSTEM 'foo'>\n"
- "]>\n"
- "<doc>&x;</doc>";
- ExtOption options[] = {{XCS("foo"), "<e/>"}, {NULL, NULL}};
- int i;
- const int max_alloc_count = 50;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
-
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-START_TEST(test_nsalloc_long_systemid_in_ext) {
- const char *text
- = "<!DOCTYPE doc SYSTEM 'foo' [\n"
- " <!ENTITY en SYSTEM '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- ExtOption options[] = {
- {XCS("foo"), "<!ELEMENT e EMPTY>"},
- {/* clang-format off */
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
- XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"),
- /* clang-format on */
- "<e/>"},
- {NULL, NULL}};
- int i;
- const int max_alloc_count = 55;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
-
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
-}
-END_TEST
-
-/* Test the effects of allocation failure on parsing an element in a
- * namespace. Based on test_nsalloc_long_context.
- */
-START_TEST(test_nsalloc_prefixed_element) {
- const char *text = "<!DOCTYPE pfx:element SYSTEM 'foo' [\n"
- " <!ATTLIST pfx:element baz ID #REQUIRED>\n"
- " <!ENTITY en SYSTEM 'bar'>\n"
- "]>\n"
- "<pfx:element xmlns:pfx='http://example.org/' baz='2'>\n"
- "&en;"
- "</pfx:element>";
- ExtOption options[] = {
- {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
- int i;
- const int max_alloc_count = 70;
-
- for (i = 0; i < max_alloc_count; i++) {
- allocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
-
- /* See comment in test_nsalloc_xmlns() */
- nsalloc_teardown();
- nsalloc_setup();
- }
- if (i == 0)
- fail("Success despite failing allocator");
- else if (i == max_alloc_count)
- fail("Failed even at full allocation count");
-}
-END_TEST
+XML_Parser g_parser = NULL;
static Suite *
make_suite(void) {
Suite *s = suite_create("basic");
- TCase *tc_basic = tcase_create("basic tests");
- TCase *tc_namespace = tcase_create("XML namespaces");
- TCase *tc_misc = tcase_create("miscellaneous tests");
- TCase *tc_alloc = tcase_create("allocation tests");
- TCase *tc_nsalloc = tcase_create("namespace allocation tests");
- suite_add_tcase(s, tc_basic);
- tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
- tcase_add_test(tc_basic, test_nul_byte);
- tcase_add_test(tc_basic, test_u0000_char);
- tcase_add_test(tc_basic, test_siphash_self);
- tcase_add_test(tc_basic, test_siphash_spec);
- tcase_add_test(tc_basic, test_bom_utf8);
- tcase_add_test(tc_basic, test_bom_utf16_be);
- tcase_add_test(tc_basic, test_bom_utf16_le);
- tcase_add_test(tc_basic, test_nobom_utf16_le);
- tcase_add_test(tc_basic, test_illegal_utf8);
- tcase_add_test(tc_basic, test_utf8_auto_align);
- tcase_add_test(tc_basic, test_utf16);
- tcase_add_test(tc_basic, test_utf16_le_epilog_newline);
- tcase_add_test(tc_basic, test_not_utf16);
- tcase_add_test(tc_basic, test_bad_encoding);
- tcase_add_test(tc_basic, test_latin1_umlauts);
- tcase_add_test(tc_basic, test_long_utf8_character);
- tcase_add_test(tc_basic, test_long_latin1_attribute);
- tcase_add_test(tc_basic, test_long_ascii_attribute);
- /* Regression test for SF bug #491986. */
- tcase_add_test(tc_basic, test_danish_latin1);
- /* Regression test for SF bug #514281. */
- tcase_add_test(tc_basic, test_french_charref_hexidecimal);
- tcase_add_test(tc_basic, test_french_charref_decimal);
- tcase_add_test(tc_basic, test_french_latin1);
- tcase_add_test(tc_basic, test_french_utf8);
- tcase_add_test(tc_basic, test_utf8_false_rejection);
- tcase_add_test(tc_basic, test_line_number_after_parse);
- tcase_add_test(tc_basic, test_column_number_after_parse);
- tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers);
- tcase_add_test(tc_basic, test_line_number_after_error);
- tcase_add_test(tc_basic, test_column_number_after_error);
- tcase_add_test(tc_basic, test_really_long_lines);
- tcase_add_test(tc_basic, test_really_long_encoded_lines);
- tcase_add_test(tc_basic, test_end_element_events);
- tcase_add_test(tc_basic, test_attr_whitespace_normalization);
- tcase_add_test(tc_basic, test_xmldecl_misplaced);
- tcase_add_test(tc_basic, test_xmldecl_invalid);
- tcase_add_test(tc_basic, test_xmldecl_missing_attr);
- tcase_add_test(tc_basic, test_xmldecl_missing_value);
- tcase_add_test(tc_basic, test_unknown_encoding_internal_entity);
- tcase_add_test(tc_basic, test_unrecognised_encoding_internal_entity);
- tcase_add_test(tc_basic, test_wfc_undeclared_entity_unread_external_subset);
- tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset);
- tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone);
- tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset);
- tcase_add_test(tc_basic, test_not_standalone_handler_reject);
- tcase_add_test(tc_basic, test_not_standalone_handler_accept);
- tcase_add_test(tc_basic,
- test_wfc_undeclared_entity_with_external_subset_standalone);
- tcase_add_test(tc_basic, test_entity_with_external_subset_unless_standalone);
- tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_encoding);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_no_handler);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_bom);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding_2);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_invalid_parse);
- tcase_add_test__ifdef_xml_dtd(tc_basic,
- test_ext_entity_invalid_suspended_parse);
- tcase_add_test(tc_basic, test_dtd_default_handling);
- tcase_add_test(tc_basic, test_dtd_attr_handling);
- tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
- tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
- tcase_add_test(tc_basic, test_stop_parser_between_char_data_calls);
- tcase_add_test(tc_basic, test_suspend_parser_between_char_data_calls);
- tcase_add_test(tc_basic, test_repeated_stop_parser_between_char_data_calls);
- tcase_add_test(tc_basic, test_good_cdata_ascii);
- tcase_add_test(tc_basic, test_good_cdata_utf16);
- tcase_add_test(tc_basic, test_good_cdata_utf16_le);
- tcase_add_test(tc_basic, test_long_cdata_utf16);
-#ifndef XML_MIN_SIZE /* FIXME workaround -DXML_MIN_SIZE + ASan (issue #332) */
- tcase_add_test(tc_basic, test_multichar_cdata_utf16);
+ make_basic_test_case(s);
+ make_namespace_test_case(s);
+ make_miscellaneous_test_case(s);
+ make_alloc_test_case(s);
+ make_nsalloc_test_case(s);
+#if XML_GE == 1
+ make_accounting_test_case(s);
#endif
- tcase_add_test(tc_basic, test_utf16_bad_surrogate_pair);
- tcase_add_test(tc_basic, test_bad_cdata);
-#ifndef XML_MIN_SIZE /* FIXME workaround -DXML_MIN_SIZE + ASan (issue #332) */
- tcase_add_test(tc_basic, test_bad_cdata_utf16);
-#endif
- tcase_add_test(tc_basic, test_stop_parser_between_cdata_calls);
- tcase_add_test(tc_basic, test_suspend_parser_between_cdata_calls);
- tcase_add_test(tc_basic, test_memory_allocation);
- tcase_add_test(tc_basic, test_default_current);
- tcase_add_test(tc_basic, test_dtd_elements);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_set_foreign_dtd);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_not_standalone);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_foreign_dtd);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_with_doctype);
- tcase_add_test__ifdef_xml_dtd(tc_basic,
- test_foreign_dtd_without_external_subset);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_empty_foreign_dtd);
- tcase_add_test(tc_basic, test_set_base);
- tcase_add_test(tc_basic, test_attributes);
- tcase_add_test(tc_basic, test_reset_in_entity);
- tcase_add_test(tc_basic, test_resume_invalid_parse);
- tcase_add_test(tc_basic, test_resume_resuspended);
- tcase_add_test(tc_basic, test_cdata_default);
- tcase_add_test(tc_basic, test_subordinate_reset);
- tcase_add_test(tc_basic, test_subordinate_suspend);
- tcase_add_test(tc_basic, test_subordinate_xdecl_suspend);
- tcase_add_test(tc_basic, test_subordinate_xdecl_abort);
- tcase_add_test(tc_basic, test_explicit_encoding);
- tcase_add_test(tc_basic, test_trailing_cr);
- tcase_add_test(tc_basic, test_ext_entity_trailing_cr);
- tcase_add_test(tc_basic, test_trailing_rsqb);
- tcase_add_test(tc_basic, test_ext_entity_trailing_rsqb);
- tcase_add_test(tc_basic, test_ext_entity_good_cdata);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_user_parameters);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_ref_parameter);
- tcase_add_test(tc_basic, test_empty_parse);
- tcase_add_test(tc_basic, test_get_buffer_1);
- tcase_add_test(tc_basic, test_get_buffer_2);
- tcase_add_test(tc_basic, test_byte_info_at_end);
- tcase_add_test(tc_basic, test_byte_info_at_error);
- tcase_add_test(tc_basic, test_byte_info_at_cdata);
- tcase_add_test(tc_basic, test_predefined_entities);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_tag_in_dtd);
- tcase_add_test(tc_basic, test_not_predefined_entities);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_entity_values);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_not_standalone);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_value_abort);
- tcase_add_test(tc_basic, test_bad_public_doctype);
- tcase_add_test(tc_basic, test_attribute_enum_value);
- tcase_add_test(tc_basic, test_predefined_entity_redefinition);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_dtd_stop_processing);
- tcase_add_test(tc_basic, test_public_notation_no_sysid);
- tcase_add_test(tc_basic, test_nested_groups);
- tcase_add_test(tc_basic, test_group_choice);
- tcase_add_test(tc_basic, test_standalone_parameter_entity);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_skipped_parameter_entity);
- tcase_add_test__ifdef_xml_dtd(tc_basic,
- test_recursive_external_parameter_entity);
- tcase_add_test(tc_basic, test_undefined_ext_entity_in_external_dtd);
- tcase_add_test(tc_basic, test_suspend_xdecl);
- tcase_add_test(tc_basic, test_abort_epilog);
- tcase_add_test(tc_basic, test_abort_epilog_2);
- tcase_add_test(tc_basic, test_suspend_epilog);
- tcase_add_test(tc_basic, test_suspend_in_sole_empty_tag);
- tcase_add_test(tc_basic, test_unfinished_epilog);
- tcase_add_test(tc_basic, test_partial_char_in_epilog);
- tcase_add_test(tc_basic, test_hash_collision);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_internal_entity);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_resume_entity_with_syntax_error);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_parameter_entity);
- tcase_add_test(tc_basic, test_restart_on_error);
- tcase_add_test(tc_basic, test_reject_lt_in_attribute_value);
- tcase_add_test(tc_basic, test_reject_unfinished_param_in_att_value);
- tcase_add_test(tc_basic, test_trailing_cr_in_att_value);
- tcase_add_test(tc_basic, test_standalone_internal_entity);
- tcase_add_test(tc_basic, test_skipped_external_entity);
- tcase_add_test(tc_basic, test_skipped_null_loaded_ext_entity);
- tcase_add_test(tc_basic, test_skipped_unloaded_ext_entity);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_param_entity_with_trailing_cr);
- tcase_add_test(tc_basic, test_invalid_character_entity);
- tcase_add_test(tc_basic, test_invalid_character_entity_2);
- tcase_add_test(tc_basic, test_invalid_character_entity_3);
- tcase_add_test(tc_basic, test_invalid_character_entity_4);
- tcase_add_test(tc_basic, test_pi_handled_in_default);
- tcase_add_test(tc_basic, test_comment_handled_in_default);
- tcase_add_test(tc_basic, test_pi_yml);
- tcase_add_test(tc_basic, test_pi_xnl);
- tcase_add_test(tc_basic, test_pi_xmm);
- tcase_add_test(tc_basic, test_utf16_pi);
- tcase_add_test(tc_basic, test_utf16_be_pi);
- tcase_add_test(tc_basic, test_utf16_be_comment);
- tcase_add_test(tc_basic, test_utf16_le_comment);
- tcase_add_test(tc_basic, test_missing_encoding_conversion_fn);
- tcase_add_test(tc_basic, test_failing_encoding_conversion_fn);
- tcase_add_test(tc_basic, test_unknown_encoding_success);
- tcase_add_test(tc_basic, test_unknown_encoding_bad_name);
- tcase_add_test(tc_basic, test_unknown_encoding_bad_name_2);
- tcase_add_test(tc_basic, test_unknown_encoding_long_name_1);
- tcase_add_test(tc_basic, test_unknown_encoding_long_name_2);
- tcase_add_test(tc_basic, test_invalid_unknown_encoding);
- tcase_add_test(tc_basic, test_unknown_ascii_encoding_ok);
- tcase_add_test(tc_basic, test_unknown_ascii_encoding_fail);
- tcase_add_test(tc_basic, test_unknown_encoding_invalid_length);
- tcase_add_test(tc_basic, test_unknown_encoding_invalid_topbit);
- tcase_add_test(tc_basic, test_unknown_encoding_invalid_surrogate);
- tcase_add_test(tc_basic, test_unknown_encoding_invalid_high);
- tcase_add_test(tc_basic, test_unknown_encoding_invalid_attr_value);
- tcase_add_test(tc_basic, test_ext_entity_latin1_utf16le_bom);
- tcase_add_test(tc_basic, test_ext_entity_latin1_utf16be_bom);
- tcase_add_test(tc_basic, test_ext_entity_latin1_utf16le_bom2);
- tcase_add_test(tc_basic, test_ext_entity_latin1_utf16be_bom2);
- tcase_add_test(tc_basic, test_ext_entity_utf16_be);
- tcase_add_test(tc_basic, test_ext_entity_utf16_le);
- tcase_add_test(tc_basic, test_ext_entity_utf16_unknown);
- tcase_add_test(tc_basic, test_ext_entity_utf8_non_bom);
- tcase_add_test(tc_basic, test_utf8_in_cdata_section);
- tcase_add_test(tc_basic, test_utf8_in_cdata_section_2);
- tcase_add_test(tc_basic, test_trailing_spaces_in_elements);
- tcase_add_test(tc_basic, test_utf16_attribute);
- tcase_add_test(tc_basic, test_utf16_second_attr);
- tcase_add_test(tc_basic, test_attr_after_solidus);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_utf16_pe);
- tcase_add_test(tc_basic, test_bad_attr_desc_keyword);
- tcase_add_test(tc_basic, test_bad_attr_desc_keyword_utf16);
- tcase_add_test(tc_basic, test_bad_doctype);
- tcase_add_test(tc_basic, test_bad_doctype_utf16);
- tcase_add_test(tc_basic, test_bad_doctype_plus);
- tcase_add_test(tc_basic, test_bad_doctype_star);
- tcase_add_test(tc_basic, test_bad_doctype_query);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_unknown_encoding_bad_ignore);
- tcase_add_test(tc_basic, test_entity_in_utf16_be_attr);
- tcase_add_test(tc_basic, test_entity_in_utf16_le_attr);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_be);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_le);
- tcase_add_test(tc_basic, test_short_doctype);
- tcase_add_test(tc_basic, test_short_doctype_2);
- tcase_add_test(tc_basic, test_short_doctype_3);
- tcase_add_test(tc_basic, test_long_doctype);
- tcase_add_test(tc_basic, test_bad_entity);
- tcase_add_test(tc_basic, test_bad_entity_2);
- tcase_add_test(tc_basic, test_bad_entity_3);
- tcase_add_test(tc_basic, test_bad_entity_4);
- tcase_add_test(tc_basic, test_bad_notation);
- tcase_add_test(tc_basic, test_default_doctype_handler);
- tcase_add_test(tc_basic, test_empty_element_abort);
-
- suite_add_tcase(s, tc_namespace);
- tcase_add_checked_fixture(tc_namespace, namespace_setup, namespace_teardown);
- tcase_add_test(tc_namespace, test_return_ns_triplet);
- tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
- tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
- tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
- tcase_add_test__ifdef_xml_dtd(tc_namespace,
- test_default_ns_from_ext_subset_and_ext_ge);
- tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
- tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
- tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
- tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
- tcase_add_test(tc_namespace, test_ns_unbound_prefix);
- tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
- tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
- tcase_add_test(tc_namespace, test_ns_duplicate_hashes);
- tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
- tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
- tcase_add_test(tc_namespace, test_ns_parser_reset);
- tcase_add_test(tc_namespace, test_ns_long_element);
- tcase_add_test(tc_namespace, test_ns_mixed_prefix_atts);
- tcase_add_test(tc_namespace, test_ns_extend_uri_buffer);
- tcase_add_test(tc_namespace, test_ns_reserved_attributes);
- tcase_add_test(tc_namespace, test_ns_reserved_attributes_2);
- tcase_add_test(tc_namespace, test_ns_extremely_long_prefix);
- tcase_add_test(tc_namespace, test_ns_unknown_encoding_success);
- tcase_add_test(tc_namespace, test_ns_double_colon);
- tcase_add_test(tc_namespace, test_ns_double_colon_element);
- tcase_add_test(tc_namespace, test_ns_bad_attr_leafname);
- tcase_add_test(tc_namespace, test_ns_bad_element_leafname);
- tcase_add_test(tc_namespace, test_ns_utf16_leafname);
- tcase_add_test(tc_namespace, test_ns_utf16_element_leafname);
- tcase_add_test(tc_namespace, test_ns_utf16_doctype);
- tcase_add_test(tc_namespace, test_ns_invalid_doctype);
- tcase_add_test(tc_namespace, test_ns_double_colon_doctype);
-
- suite_add_tcase(s, tc_misc);
- tcase_add_checked_fixture(tc_misc, NULL, basic_teardown);
- tcase_add_test(tc_misc, test_misc_alloc_create_parser);
- tcase_add_test(tc_misc, test_misc_alloc_create_parser_with_encoding);
- tcase_add_test(tc_misc, test_misc_null_parser);
- tcase_add_test(tc_misc, test_misc_error_string);
- tcase_add_test(tc_misc, test_misc_version);
- tcase_add_test(tc_misc, test_misc_features);
- tcase_add_test(tc_misc, test_misc_attribute_leak);
- tcase_add_test(tc_misc, test_misc_utf16le);
- tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_1);
- tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_2);
- tcase_add_test__ifdef_xml_dtd(
- tc_misc, test_misc_deny_internal_entity_closing_doctype_issue_317);
-
- suite_add_tcase(s, tc_alloc);
- tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
- tcase_add_test(tc_alloc, test_alloc_parse_xdecl);
- tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
- tcase_add_test(tc_alloc, test_alloc_parse_pi);
- tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
- tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
- tcase_add_test(tc_alloc, test_alloc_parse_comment);
- tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling);
- tcase_add_test(tc_alloc, test_alloc_explicit_encoding);
- tcase_add_test(tc_alloc, test_alloc_set_base);
- tcase_add_test(tc_alloc, test_alloc_realloc_buffer);
- tcase_add_test(tc_alloc, test_alloc_ext_entity_realloc_buffer);
- tcase_add_test(tc_alloc, test_alloc_realloc_many_attributes);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_public_entity_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_subst_public_entity_value);
- tcase_add_test(tc_alloc, test_alloc_parse_public_doctype);
- tcase_add_test(tc_alloc, test_alloc_parse_public_doctype_long_name);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_set_foreign_dtd);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_attribute_enum_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_attribute_enum_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_implied_attribute);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_default_attribute);
- tcase_add_test(tc_alloc, test_alloc_notation);
- tcase_add_test(tc_alloc, test_alloc_public_notation);
- tcase_add_test(tc_alloc, test_alloc_system_notation);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_groups);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_nested_groups);
- tcase_add_test(tc_alloc, test_alloc_large_group);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_group_choice);
- tcase_add_test(tc_alloc, test_alloc_pi_in_epilog);
- tcase_add_test(tc_alloc, test_alloc_comment_in_epilog);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_long_attribute_value);
- tcase_add_test(tc_alloc, test_alloc_attribute_whitespace);
- tcase_add_test(tc_alloc, test_alloc_attribute_predefined_entity);
- tcase_add_test(tc_alloc, test_alloc_long_attr_default_with_char_ref);
- tcase_add_test(tc_alloc, test_alloc_long_attr_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_entities);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_param_entity_newline);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_ce_extends_pe);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_attributes);
- tcase_add_test(tc_alloc, test_alloc_long_doc_name);
- tcase_add_test(tc_alloc, test_alloc_long_base);
- tcase_add_test(tc_alloc, test_alloc_long_public_id);
- tcase_add_test(tc_alloc, test_alloc_long_entity_value);
- tcase_add_test(tc_alloc, test_alloc_long_notation);
-
- suite_add_tcase(s, tc_nsalloc);
- tcase_add_checked_fixture(tc_nsalloc, nsalloc_setup, nsalloc_teardown);
- tcase_add_test(tc_nsalloc, test_nsalloc_xmlns);
- tcase_add_test(tc_nsalloc, test_nsalloc_parse_buffer);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_prefix);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_uri);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_attr);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_attr_prefix);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_attributes);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_element);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_binding_uri);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_prefix);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_longer_prefix);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_namespace);
- tcase_add_test(tc_nsalloc, test_nsalloc_less_long_namespace);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_context);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_2);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_3);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_4);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_5);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_6);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_7);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_ge_name);
- tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_in_dtd);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_default_in_ext);
- tcase_add_test(tc_nsalloc, test_nsalloc_long_systemid_in_ext);
- tcase_add_test(tc_nsalloc, test_nsalloc_prefixed_element);
return s;
}
@@ -11613,9 +84,6 @@ main(int argc, char *argv[]) {
Suite *s = make_suite();
SRunner *sr = srunner_create(s);
- /* run the tests for internal helper functions */
- testhelper_is_whitespace_normalized();
-
for (i = 1; i < argc; ++i) {
char *opt = argv[i];
if (strcmp(opt, "-v") == 0 || strcmp(opt, "--verbose") == 0)
@@ -11629,7 +97,18 @@ main(int argc, char *argv[]) {
}
if (verbosity != CK_SILENT)
printf("Expat version: %" XML_FMT_STR "\n", XML_ExpatVersion());
- srunner_run_all(sr, verbosity);
+
+ for (g_chunkSize = 0; g_chunkSize <= 5; g_chunkSize++) {
+ for (int enabled = 0; enabled <= 1; ++enabled) {
+ char context[100];
+ g_reparseDeferralEnabledDefault = enabled;
+ snprintf(context, sizeof(context), "chunksize=%d deferral=%d",
+ g_chunkSize, enabled);
+ context[sizeof(context) - 1] = '\0';
+ srunner_run_all(sr, context, verbosity);
+ }
+ }
+ srunner_summarize(sr, verbosity);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
diff --git a/3rdparty/expat/tests/runtests_cxx.cpp b/3rdparty/expat/tests/runtests_cxx.cpp
new file mode 100644
index 00000000000..396714560a0
--- /dev/null
+++ b/3rdparty/expat/tests/runtests_cxx.cpp
@@ -0,0 +1,36 @@
+/* C++ compilation harness for the test suite.
+
+ This is used to ensure the Expat headers can be included from C++
+ and have everything work as expected.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "runtests.c"
diff --git a/3rdparty/expat/tests/runtestspp.cpp b/3rdparty/expat/tests/runtestspp.cpp
deleted file mode 100644
index fd3ceaa97a3..00000000000
--- a/3rdparty/expat/tests/runtestspp.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/* C++ compilation harness for the test suite.
-
- This is used to ensure the Expat headers can be included from C++
- and have everything work as expected.
- __ __ _
- ___\ \/ /_ __ __ _| |_
- / _ \\ /| '_ \ / _` | __|
- | __// \| |_) | (_| | |_
- \___/_/\_\ .__/ \__,_|\__|
- |_| XML parser
-
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
- Licensed under the MIT license:
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to permit
- persons to whom the Software is furnished to do so, subject to the
- following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "runtests.c"
diff --git a/3rdparty/expat/tests/structdata.c b/3rdparty/expat/tests/structdata.c
index e81b7b18460..e311f1fae3a 100644
--- a/3rdparty/expat/tests/structdata.c
+++ b/3rdparty/expat/tests/structdata.c
@@ -6,8 +6,9 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,10 +31,12 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#ifdef HAVE_EXPAT_CONFIG_H
-# include "expat_config.h"
+#if defined(NDEBUG)
+# undef NDEBUG /* because test suite relies on assert(...) at the moment */
#endif
+#include "expat_config.h"
+
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
@@ -58,7 +61,7 @@
static XML_Char *
xmlstrdup(const XML_Char *s) {
size_t byte_count = (xcstrlen(s) + 1) * sizeof(XML_Char);
- XML_Char *dup = malloc(byte_count);
+ XML_Char *const dup = (XML_Char *)malloc(byte_count);
assert(dup != NULL);
memcpy(dup, s, byte_count);
@@ -81,13 +84,13 @@ StructData_AddItem(StructData *storage, const XML_Char *s, int data0, int data1,
assert(storage != NULL);
assert(s != NULL);
if (storage->count == storage->max_count) {
- StructDataEntry *new;
+ StructDataEntry *new_entries;
storage->max_count += STRUCT_EXTENSION_COUNT;
- new = realloc(storage->entries,
- storage->max_count * sizeof(StructDataEntry));
- assert(new != NULL);
- storage->entries = new;
+ new_entries = (StructDataEntry *)realloc(
+ storage->entries, storage->max_count * sizeof(StructDataEntry));
+ assert(new_entries != NULL);
+ storage->entries = new_entries;
}
entry = &storage->entries[storage->count];
@@ -105,17 +108,17 @@ void
StructData_CheckItems(StructData *storage, const StructDataEntry *expected,
int count) {
char buffer[1024];
- int i;
assert(storage != NULL);
assert(expected != NULL);
if (count != storage->count) {
- sprintf(buffer, "wrong number of entries: got %d, expected %d",
- storage->count, count);
+ snprintf(buffer, sizeof(buffer),
+ "wrong number of entries: got %d, expected %d", storage->count,
+ count);
StructData_Dispose(storage);
fail(buffer);
} else {
- for (i = 0; i < count; i++) {
+ for (int i = 0; i < count; i++) {
const StructDataEntry *got = &storage->entries[i];
const StructDataEntry *want = &expected[i];
@@ -128,11 +131,11 @@ StructData_CheckItems(StructData *storage, const StructDataEntry *expected,
} else {
if (got->data0 != want->data0 || got->data1 != want->data1
|| got->data2 != want->data2) {
- sprintf(buffer,
- "struct '%" XML_FMT_STR
- "' expected (%d,%d,%d), got (%d,%d,%d)",
- got->str, want->data0, want->data1, want->data2, got->data0,
- got->data1, got->data2);
+ snprintf(buffer, sizeof(buffer),
+ "struct '%" XML_FMT_STR
+ "' expected (%d,%d,%d), got (%d,%d,%d)",
+ got->str, want->data0, want->data1, want->data2, got->data0,
+ got->data1, got->data2);
StructData_Dispose(storage);
fail(buffer);
}
diff --git a/3rdparty/expat/tests/structdata.h b/3rdparty/expat/tests/structdata.h
index 870ffaf2af0..09881b175f7 100644
--- a/3rdparty/expat/tests/structdata.h
+++ b/3rdparty/expat/tests/structdata.h
@@ -7,8 +7,7 @@
\___/_/\_\ .__/ \__,_|\__|
|_| XML parser
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/tests/structdata_cxx.cpp b/3rdparty/expat/tests/structdata_cxx.cpp
new file mode 100644
index 00000000000..43448f63405
--- /dev/null
+++ b/3rdparty/expat/tests/structdata_cxx.cpp
@@ -0,0 +1,32 @@
+/* C++ compilation harness for the test suite.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "structdata.c"
diff --git a/3rdparty/expat/tests/udiffer.py b/3rdparty/expat/tests/udiffer.py
index 6fb91be7e3d..2b58a4c3486 100755
--- a/3rdparty/expat/tests/udiffer.py
+++ b/3rdparty/expat/tests/udiffer.py
@@ -6,7 +6,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/tests/xmltest.sh b/3rdparty/expat/tests/xmltest.sh
index 9b500351143..56e66c56f6e 100755
--- a/3rdparty/expat/tests/xmltest.sh
+++ b/3rdparty/expat/tests/xmltest.sh
@@ -1,24 +1,56 @@
#! /usr/bin/env bash
-
-# EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
-
+# EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
+#
# This script can be used to exercise Expat against the
-# w3c.org xml test suite, available from
-# http://www.w3.org/XML/Test/xmlts20020606.zip.
-
+# w3c.org xml test suite, available from:
+# https://www.w3.org/XML/Test/xmlts20020606.zip
+#
# To run this script, first set XMLWF below so that xmlwf can be
# found, then set the output directory with OUTPUT.
-
+#
# The script lists all test cases where Expat shows a discrepancy
# from the expected result. Test cases where only the canonical
# output differs are prefixed with "Output differs:", and a diff file
# is generated in the appropriate subdirectory under $OUTPUT.
-
+#
# If there are output files provided, the script will use
# output from xmlwf and compare the desired output against it.
# However, one has to take into account that the canonical output
# produced by xmlwf conforms to an older definition of canonical XML
# and does not generate notation declarations.
+#
+# __ __ _
+# ___\ \/ /_ __ __ _| |_
+# / _ \\ /| '_ \ / _` | __|
+# | __// \| |_) | (_| | |_
+# \___/_/\_\ .__/ \__,_|\__|
+# |_| XML parser
+#
+# Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+# Copyright (c) 2002 Karl Waclawek <karl@waclawek.net>
+# Copyright (c) 2008-2019 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+# Copyright (c) 2025 Hanno Böck <hanno@gentoo.org>
+# Licensed under the MIT license:
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
shopt -s nullglob
diff --git a/3rdparty/expat/win32/README.txt b/3rdparty/expat/win32/README.txt
index d1069cdd2f0..7a8a0df6a2a 100644
--- a/3rdparty/expat/win32/README.txt
+++ b/3rdparty/expat/win32/README.txt
@@ -5,13 +5,13 @@ Expat can be built on Windows in two ways:
* Cygwin:
This follows the Unix build procedures.
-* MS Visual Studio 2008, 2010, 2013, 2015 and 2017:
+* MS Visual Studio 2019 and 2022:
Use CMake to generate a solution file for Visual Studio, then use msbuild
to compile. For example:
md build
cd build
- cmake -G"Visual Studio 15 2017" -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
+ cmake -G"Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
msbuild /m expat.sln
* All MS C/C++ compilers:
diff --git a/3rdparty/expat/win32/build_expat_iss.bat b/3rdparty/expat/win32/build_expat_iss.bat
index 4e31c17dfc3..aea73489bca 100644
--- a/3rdparty/expat/win32/build_expat_iss.bat
+++ b/3rdparty/expat/win32/build_expat_iss.bat
@@ -7,7 +7,7 @@ REM | __// \| |_) | (_| | |_
REM \___/_/\_\ .__/ \__,_|\__|
REM |_| XML parser
REM
-REM Copyright (C) 2019 Expat development team
+REM Copyright (c) 2019-2024 Sebastian Pipping <sebastian@pipping.org>
REM Licensed under the MIT license:
REM
REM Permission is hereby granted, free of charge, to any person obtaining
@@ -29,7 +29,7 @@ REM DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
REM OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
REM USE OR OTHER DEALINGS IN THE SOFTWARE.
-SET GENERATOR=Visual Studio 15 2017
+SET GENERATOR=Visual Studio 16 2019
REM Read by msbuild!
SET CONFIGURATION=RelWithDebInfo
@@ -43,7 +43,7 @@ MD %BINDIR% || EXIT /b 1
MD build_shared_char || EXIT /b 1
CD build_shared_char || EXIT /b 1
- cmake -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF .. || EXIT /b 1
+ cmake -A Win32 -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_WARNINGS_AS_ERRORS=ON -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF .. || EXIT /b 1
msbuild /m expat.sln || EXIT /b 1
DIR %CONFIGURATION% || EXIT /b 1
CD .. || EXIT /b 1
@@ -53,7 +53,7 @@ COPY build_shared_char\%CONFIGURATION%\libexpat.lib %BINDIR%\ || EXIT /b 1
MD build_static_char || EXIT /b 1
CD build_static_char || EXIT /b 1
- cmake -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_SHARED_LIBS=OFF .. || EXIT /b 1
+ cmake -A Win32 -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_WARNINGS_AS_ERRORS=ON -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_SHARED_LIBS=OFF .. || EXIT /b 1
msbuild /m expat.sln || EXIT /b 1
DIR %CONFIGURATION% || EXIT /b 1
CD .. || EXIT /b 1
@@ -63,7 +63,7 @@ COPY build_static_char\xmlwf\%CONFIGURATION%\xmlwf.exe %BINDIR%\ || EXIT /b 1
MD build_shared_wchar_t || EXIT /b 1
CD build_shared_wchar_t || EXIT /b 1
- cmake -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_CHAR_TYPE=wchar_t .. || EXIT /b 1
+ cmake -A Win32 -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_WARNINGS_AS_ERRORS=ON -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_CHAR_TYPE=wchar_t .. || EXIT /b 1
msbuild /m expat.sln || EXIT /b 1
DIR %CONFIGURATION% || EXIT /b 1
CD .. || EXIT /b 1
@@ -73,7 +73,7 @@ COPY build_shared_wchar_t\%CONFIGURATION%\libexpatw.lib %BINDIR%\ || EXIT /b 1
MD build_static_wchar_t || EXIT /b 1
CD build_static_wchar_t || EXIT /b 1
- cmake -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DEXPAT_CHAR_TYPE=wchar_t .. || EXIT /b 1
+ cmake -A Win32 -G"%GENERATOR%" -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DEXPAT_WARNINGS_AS_ERRORS=ON -DEXPAT_MSVC_STATIC_CRT=ON -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DEXPAT_CHAR_TYPE=wchar_t .. || EXIT /b 1
msbuild /m expat.sln || EXIT /b 1
DIR %CONFIGURATION% || EXIT /b 1
CD .. || EXIT /b 1
diff --git a/3rdparty/expat/win32/expat.iss b/3rdparty/expat/win32/expat.iss
index ef95f175857..60159d8c926 100644
--- a/3rdparty/expat/win32/expat.iss
+++ b/3rdparty/expat/win32/expat.iss
@@ -1,21 +1,55 @@
; Basic setup script for the Inno Setup installer builder. For more
; information on the free installer builder, see www.jrsoftware.org.
;
-; This script was contributed by Tim Peters.
+; This script was originally contributed by Tim Peters.
; It was designed for Inno Setup 2.0.19 but works with later versions as well.
+;
+; __ __ _
+; ___\ \/ /_ __ __ _| |_
+; / _ \\ /| '_ \ / _` | __|
+; | __// \| |_) | (_| | |_
+; \___/_/\_\ .__/ \__,_|\__|
+; |_| XML parser
+;
+; Copyright (c) 2001 Tim Peters <tim.peters@gmail.com>
+; Copyright (c) 2001-2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+; Copyright (c) 2006-2017 Karl Waclawek <karl@waclawek.net>
+; Copyright (c) 2007-2025 Sebastian Pipping <sebastian@pipping.org>
+; Copyright (c) 2022 Johnny Jazeix <jazeix@gmail.com>
+; Copyright (c) 2024 Dag-Erling Smørgrav <des@des.dev>
+; Licensed under the MIT license:
+;
+; Permission is hereby granted, free of charge, to any person obtaining
+; a copy of this software and associated documentation files (the
+; "Software"), to deal in the Software without restriction, including
+; without limitation the rights to use, copy, modify, merge, publish,
+; distribute, sublicense, and/or sell copies of the Software, and to permit
+; persons to whom the Software is furnished to do so, subject to the
+; following conditions:
+;
+; The above copyright notice and this permission notice shall be included
+; in all copies or substantial portions of the Software.
+;
+; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+; NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+; DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+; OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+; USE OR OTHER DEALINGS IN THE SOFTWARE.
-#define expatVer "2.2.10"
+#define expatVer "2.7.1"
[Setup]
AppName=Expat
AppId=expat
AppVersion={#expatVer}
AppVerName=Expat {#expatVer}
-AppCopyright=Copyright © 1998-2017 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers
+AppCopyright=Copyright © 1997-2025 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers
AppPublisher=The Expat Developers
-AppPublisherURL=http://www.libexpat.org/
-AppSupportURL=http://www.libexpat.org/
-AppUpdatesURL=http://www.libexpat.org/
+AppPublisherURL=https://libexpat.github.io/
+AppSupportURL=https://libexpat.github.io/
+AppUpdatesURL=https://libexpat.github.io/
UninstallDisplayName=Expat XML Parser {#expatVer}
VersionInfoVersion={#expatVer}
OutputBaseFilename=expat-win32bin-{#expatVer}
@@ -41,24 +75,29 @@ Flags: ignoreversion; Source: COPYING; DestDir: "{app}"; De
Flags: ignoreversion; Source: README.md; DestDir: "{app}"; DestName: README.txt
Flags: ignoreversion; Source: doc\*.html; DestDir: "{app}\Doc"
Flags: ignoreversion; Source: doc\*.css; DestDir: "{app}\Doc"
-Flags: ignoreversion; Source: doc\*.png; DestDir: "{app}\Doc"
+Flags: ignoreversion; Source: doc\*.xml; DestDir: "{app}\Source\doc"
Flags: ignoreversion; Source: win32\bin\Release\*.dll; DestDir: "{app}\Bin"
Flags: ignoreversion; Source: win32\bin\Release\*.lib; DestDir: "{app}\Bin"
+Flags: ignoreversion; Source: win32\version.rc.cmake; DestDir: "{app}\Source\win32"
Flags: ignoreversion; Source: win32\README.txt; DestDir: "{app}\Source"
+Flags: ignoreversion; Source: AUTHORS; DestDir: "{app}\Source"
Flags: ignoreversion; Source: Changes; DestDir: "{app}\Source"
Flags: ignoreversion; Source: CMake.README; DestDir: "{app}\Source"
Flags: ignoreversion; Source: CMakeLists.txt; DestDir: "{app}\Source"
Flags: ignoreversion; Source: ConfigureChecks.cmake; DestDir: "{app}\Source"
+Flags: ignoreversion; Source: expat.pc.cmake; DestDir: "{app}\Source"
Flags: ignoreversion; Source: expat_config.h.cmake; DestDir: "{app}\Source"
+Flags: ignoreversion; Source: run.sh.in; DestDir: "{app}\Source"
Flags: ignoreversion; Source: cmake\expat-config.cmake.in; DestDir: "{app}\Source\cmake"
+Flags: ignoreversion; Source: fuzz\*.c; DestDir: "{app}\Source\fuzz"
Flags: ignoreversion; Source: lib\*.c; DestDir: "{app}\Source\lib"
Flags: ignoreversion; Source: lib\*.h; DestDir: "{app}\Source\lib"
-Flags: ignoreversion; Source: lib\*.def; DestDir: "{app}\Source\lib"
+Flags: ignoreversion; Source: lib\*.def.cmake; DestDir: "{app}\Source\lib"
Flags: ignoreversion; Source: examples\*.c; DestDir: "{app}\Source\examples"
Flags: ignoreversion; Source: tests\*.c; DestDir: "{app}\Source\tests"
Flags: ignoreversion; Source: tests\*.cpp; DestDir: "{app}\Source\tests"
Flags: ignoreversion; Source: tests\*.h; DestDir: "{app}\Source\tests"
-Flags: ignoreversion; Source: tests\README.txt; DestDir: "{app}\Source\tests"
+Flags: ignoreversion; Source: tests\README.md; DestDir: "{app}\Source\tests"
Flags: ignoreversion; Source: tests\benchmark\*.c; DestDir: "{app}\Source\tests\benchmark"
Flags: ignoreversion; Source: tests\benchmark\README.txt; DestDir: "{app}\Source\tests\benchmark"
Flags: ignoreversion; Source: xmlwf\*.c*; DestDir: "{app}\Source\xmlwf"
diff --git a/3rdparty/expat/win32/version.rc.cmake b/3rdparty/expat/win32/version.rc.cmake
new file mode 100644
index 00000000000..4b883f37aaf
--- /dev/null
+++ b/3rdparty/expat/win32/version.rc.cmake
@@ -0,0 +1,17 @@
+1 VERSIONINFO
+FILEVERSION VER_FILEVERSION
+PRODUCTVERSION VER_FILEVERSION
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "FileVersion", "${PROJECT_VERSION}.0"
+ VALUE "ProductVersion", "${PROJECT_VERSION}.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/3rdparty/expat/xmlwf/Makefile.am b/3rdparty/expat/xmlwf/Makefile.am
index f35ade7a77a..c7eebd1eeec 100644
--- a/3rdparty/expat/xmlwf/Makefile.am
+++ b/3rdparty/expat/xmlwf/Makefile.am
@@ -6,7 +6,7 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -38,7 +38,7 @@ xmlwf_SOURCES = \
@FILEMAP@.c
xmlwf_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
-xmlwf_LDFLAGS = @AM_LDFLAGS@
+xmlwf_LDFLAGS = @AM_LDFLAGS@ @LIBM@
if MINGW
if UNICODE
diff --git a/3rdparty/expat/xmlwf/Makefile.in b/3rdparty/expat/xmlwf/Makefile.in
index 531475ab243..480fd3e0410 100644
--- a/3rdparty/expat/xmlwf/Makefile.in
+++ b/3rdparty/expat/xmlwf/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,7 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2017 Expat development team
+# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -134,6 +134,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
+ $(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
@@ -216,8 +218,6 @@ am__define_uniq_tagged_files = \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
am__DIST_COMMON = $(srcdir)/Makefile.in \
$(top_srcdir)/conftools/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -237,8 +237,10 @@ AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-CPP = @CPP@
+CMAKE_SHARED_LIBRARY_PREFIX = @CMAKE_SHARED_LIBRARY_PREFIX@
CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
@@ -254,10 +256,20 @@ ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
+ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
+EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
+EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
+EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
+EXPAT_DTD = @EXPAT_DTD@
+EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
+EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
+EXPAT_NS = @EXPAT_NS@
FGREP = @FGREP@
+FILECMD = @FILECMD@
FILEMAP = @FILEMAP@
GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -267,6 +279,8 @@ LD = @LD@
LDFLAGS = @LDFLAGS@
LIBAGE = @LIBAGE@
LIBCURRENT = @LIBCURRENT@
+LIBDIR_BASENAME = @LIBDIR_BASENAME@
+LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBREVISION = @LIBREVISION@
LIBS = @LIBS@
@@ -275,6 +289,7 @@ LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
@@ -296,9 +311,12 @@ RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SIZEOF_VOID_P = @SIZEOF_VOID_P@
+SO_MAJOR = @SO_MAJOR@
+SO_MINOR = @SO_MINOR@
+SO_PATCH = @SO_PATCH@
STRIP = @STRIP@
VERSION = @VERSION@
-_EXPAT_OUTPUT_NAME = @_EXPAT_OUTPUT_NAME@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -361,7 +379,7 @@ xmlwf_SOURCES = \
@FILEMAP@.c
xmlwf_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib $(am__append_1)
-xmlwf_LDFLAGS = @AM_LDFLAGS@ $(am__append_2)
+xmlwf_LDFLAGS = @AM_LDFLAGS@ @LIBM@ $(am__append_2)
EXTRA_DIST = \
codepage.h \
ct.c \
@@ -378,7 +396,7 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -402,9 +420,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
install-binPROGRAMS: $(bin_PROGRAMS)
@@ -612,7 +630,6 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
diff --git a/3rdparty/expat/xmlwf/codepage.c b/3rdparty/expat/xmlwf/codepage.c
index 44d2035811d..8e0b5d199cd 100644
--- a/3rdparty/expat/xmlwf/codepage.c
+++ b/3rdparty/expat/xmlwf/codepage.c
@@ -7,7 +7,11 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2005-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/codepage.h b/3rdparty/expat/xmlwf/codepage.h
index 1b75d58365f..75ddbce4a45 100644
--- a/3rdparty/expat/xmlwf/codepage.h
+++ b/3rdparty/expat/xmlwf/codepage.h
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/ct.c b/3rdparty/expat/xmlwf/ct.c
index dcf92bab568..d4c0e7a0a95 100644
--- a/3rdparty/expat/xmlwf/ct.c
+++ b/3rdparty/expat/xmlwf/ct.c
@@ -7,7 +7,8 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/filemap.h b/3rdparty/expat/xmlwf/filemap.h
index ef66114422f..5e0c70fa99b 100644
--- a/3rdparty/expat/xmlwf/filemap.h
+++ b/3rdparty/expat/xmlwf/filemap.h
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/readfilemap.c b/3rdparty/expat/xmlwf/readfilemap.c
index d5b84f995ad..d8e7fce42ea 100644
--- a/3rdparty/expat/xmlwf/readfilemap.c
+++ b/3rdparty/expat/xmlwf/readfilemap.c
@@ -7,7 +7,14 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2001-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2002-2009 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2017 Franek Korta <fkorta@gmail.com>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
+ Copyright (c) 2025 Hanno Böck <hanno@gentoo.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -45,14 +52,14 @@
#if defined(_MSC_VER)
# include <io.h>
/* https://msdn.microsoft.com/en-us/library/wyssk1bs(v=vs.100).aspx */
-# define _EXPAT_read _read
-# define _EXPAT_read_count_t int
-# define _EXPAT_read_req_t unsigned int
+# define EXPAT_read _read
+# define EXPAT_read_count_t int
+# define EXPAT_read_req_t unsigned int
#else /* POSIX */
-/* http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html */
-# define _EXPAT_read read
-# define _EXPAT_read_count_t ssize_t
-# define _EXPAT_read_req_t size_t
+/* https://pubs.opengroup.org/onlinepubs/009695399/functions/read.html */
+# define EXPAT_read read
+# define EXPAT_read_count_t ssize_t
+# define EXPAT_read_req_t size_t
#endif
#ifndef S_ISREG
@@ -62,7 +69,7 @@
# ifndef S_IFMT
# define S_IFMT _S_IFMT
# endif
-# define S_ISREG(m) (((m)&S_IFMT) == S_IFREG)
+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif /* not S_ISREG */
#ifndef O_BINARY
@@ -82,7 +89,7 @@ filemap(const tchar *name,
void *arg) {
size_t nbytes;
int fd;
- _EXPAT_read_count_t n;
+ EXPAT_read_count_t n;
struct stat sb;
void *p;
@@ -120,14 +127,14 @@ filemap(const tchar *name,
close(fd);
return 0;
}
- n = _EXPAT_read(fd, p, (_EXPAT_read_req_t)nbytes);
+ n = EXPAT_read(fd, p, (EXPAT_read_req_t)nbytes);
if (n < 0) {
tperror(name);
free(p);
close(fd);
return 0;
}
- if (n != (_EXPAT_read_count_t)nbytes) {
+ if (n != (EXPAT_read_count_t)nbytes) {
ftprintf(stderr, T("%s: read unexpected number of bytes\n"), name);
free(p);
close(fd);
diff --git a/3rdparty/expat/xmlwf/unixfilemap.c b/3rdparty/expat/xmlwf/unixfilemap.c
index 0d0dc0424dc..d0ce9cc60a8 100644
--- a/3rdparty/expat/xmlwf/unixfilemap.c
+++ b/3rdparty/expat/xmlwf/unixfilemap.c
@@ -7,7 +7,11 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2001-2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/win32filemap.c b/3rdparty/expat/xmlwf/win32filemap.c
index 0c9b7ecc5ff..a2db8eafc43 100644
--- a/3rdparty/expat/xmlwf/win32filemap.c
+++ b/3rdparty/expat/xmlwf/win32filemap.c
@@ -7,7 +7,10 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -105,7 +108,7 @@ filemap(const TCHAR *name,
static void
win32perror(const TCHAR *s) {
- LPVOID buf;
+ LPVOID buf = NULL;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0,
diff --git a/3rdparty/expat/xmlwf/xmlfile.c b/3rdparty/expat/xmlwf/xmlfile.c
index e3d22c574c5..9c4f7f8dbad 100644
--- a/3rdparty/expat/xmlwf/xmlfile.c
+++ b/3rdparty/expat/xmlwf/xmlfile.c
@@ -7,7 +7,15 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2004-2006 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2021 Donghee Na <donghee.na@python.org>
+ Copyright (c) 2024 Hanno Böck <hanno@gentoo.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,6 +38,8 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#include "expat_config.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
@@ -38,9 +48,7 @@
#ifdef _WIN32
# include "winconfig.h"
-#elif defined(HAVE_EXPAT_CONFIG_H)
-# include <expat_config.h>
-#endif /* ndef _WIN32 */
+#endif
#include "expat.h"
#include "internal.h" /* for UNUSED_P only */
@@ -64,11 +72,7 @@
# endif
#endif
-#ifdef _DEBUG
-# define READ_SIZE 16
-#else
-# define READ_SIZE (1024 * 8)
-#endif
+int g_read_size_bytes = 1024 * 8;
typedef struct {
XML_Parser parser;
@@ -88,7 +92,8 @@ reportError(XML_Parser parser, const XML_Char *filename) {
filename, XML_GetErrorLineNumber(parser),
XML_GetErrorColumnNumber(parser), message);
else
- ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code);
+ ftprintf(stderr, T("%s: (unknown message %u)\n"), filename,
+ (unsigned int)code);
}
/* This implementation will give problems on files larger than INT_MAX. */
@@ -188,7 +193,7 @@ processStream(const XML_Char *filename, XML_Parser parser) {
}
for (;;) {
int nread;
- char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
+ char *buf = (char *)XML_GetBuffer(parser, g_read_size_bytes);
if (! buf) {
if (filename != NULL)
close(fd);
@@ -196,7 +201,7 @@ processStream(const XML_Char *filename, XML_Parser parser) {
filename != NULL ? filename : T("xmlwf"));
return 0;
}
- nread = read(fd, buf, READ_SIZE);
+ nread = read(fd, buf, g_read_size_bytes);
if (nread < 0) {
tperror(filename != NULL ? filename : T("STDIN"));
if (filename != NULL)
diff --git a/3rdparty/expat/xmlwf/xmlfile.h b/3rdparty/expat/xmlwf/xmlfile.h
index 6e5d5b49eb7..579201ccf49 100644
--- a/3rdparty/expat/xmlwf/xmlfile.h
+++ b/3rdparty/expat/xmlwf/xmlfile.h
@@ -7,7 +7,10 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2005 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -39,5 +42,7 @@
# define XML_FMT_INT_MOD "l"
#endif
+extern int g_read_size_bytes;
+
extern int XML_ProcessFile(XML_Parser parser, const XML_Char *filename,
unsigned flags);
diff --git a/3rdparty/expat/xmlwf/xmlmime.c b/3rdparty/expat/xmlwf/xmlmime.c
index 39160d7198c..883e293dac4 100644
--- a/3rdparty/expat/xmlwf/xmlmime.c
+++ b/3rdparty/expat/xmlwf/xmlmime.c
@@ -7,7 +7,9 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2018 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/xmlmime.h b/3rdparty/expat/xmlwf/xmlmime.h
index 0471286234a..591a8847760 100644
--- a/3rdparty/expat/xmlwf/xmlmime.h
+++ b/3rdparty/expat/xmlwf/xmlmime.h
@@ -7,7 +7,8 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/3rdparty/expat/xmlwf/xmltchar.h b/3rdparty/expat/xmlwf/xmltchar.h
index d7e7b411b44..30283d086dd 100644
--- a/3rdparty/expat/xmlwf/xmltchar.h
+++ b/3rdparty/expat/xmlwf/xmltchar.h
@@ -7,7 +7,8 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -54,6 +55,8 @@
# define tmain wmain
# define tremove _wremove
# define tchar wchar_t
+# define tcstof wcstof
+# define tcstoull wcstoull
#else /* not XML_UNICODE */
# define T(x) x
# define ftprintf fprintf
@@ -71,4 +74,6 @@
# define tmain main
# define tremove remove
# define tchar char
+# define tcstof strtof
+# define tcstoull strtoull
#endif /* not XML_UNICODE */
diff --git a/3rdparty/expat/xmlwf/xmlwf.c b/3rdparty/expat/xmlwf/xmlwf.c
index 5121fa1028e..7c0a8cd4d6a 100644
--- a/3rdparty/expat/xmlwf/xmlwf.c
+++ b/3rdparty/expat/xmlwf/xmlwf.c
@@ -7,7 +7,18 @@
|_| XML parser
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
+ Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
+ Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
+ Copyright (c) 2004-2009 Karl Waclawek <karl@waclawek.net>
+ Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
+ Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
+ Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
+ Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
+ Copyright (c) 2020 Joe Orton <jorton@redhat.com>
+ Copyright (c) 2020 Kleber Tarcísio <klebertarcisio@yahoo.com.br>
+ Copyright (c) 2021 Tim Bray <tbray@textuality.com>
+ Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
+ Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
Licensed under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining
@@ -30,11 +41,15 @@
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#include "expat_config.h"
+
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <math.h> /* for isnan */
+#include <errno.h>
#include "expat.h"
#include "codepage.h"
@@ -50,6 +65,14 @@
# include <wchar.h>
#endif
+enum ExitCode {
+ XMLWF_EXIT_SUCCESS = 0,
+ XMLWF_EXIT_INTERNAL_ERROR = 1,
+ XMLWF_EXIT_NOT_WELLFORMED = 2,
+ XMLWF_EXIT_OUTPUT_ERROR = 3,
+ XMLWF_EXIT_USAGE_ERROR = 4,
+};
+
/* Structures for handler user data */
typedef struct NotationList {
struct NotationList *next;
@@ -156,7 +179,7 @@ is equivalent to lexicographically comparing based on the character number. */
static int
attcmp(const void *att1, const void *att2) {
- return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);
+ return tcscmp(*(const XML_Char *const *)att1, *(const XML_Char *const *)att2);
}
static void XMLCALL
@@ -193,10 +216,10 @@ endElement(void *userData, const XML_Char *name) {
static int
nsattcmp(const void *p1, const void *p2) {
- const XML_Char *att1 = *(const XML_Char **)p1;
- const XML_Char *att2 = *(const XML_Char **)p2;
+ const XML_Char *att1 = *(const XML_Char *const *)p1;
+ const XML_Char *att2 = *(const XML_Char *const *)p2;
int sep1 = (tcsrchr(att1, NSSEP) != 0);
- int sep2 = (tcsrchr(att1, NSSEP) != 0);
+ int sep2 = (tcsrchr(att2, NSSEP) != 0);
if (sep1 != sep2)
return sep1 - sep2;
return tcscmp(att1, att2);
@@ -322,6 +345,13 @@ freeNotations(XmlwfUserData *data) {
data->notationListHead = NULL;
}
+static void
+cleanupUserData(XmlwfUserData *userData) {
+ free((void *)userData->currentDoctypeName);
+ userData->currentDoctypeName = NULL;
+ freeNotations(userData);
+}
+
static int
xcscmp(const XML_Char *xs, const XML_Char *xt) {
while (*xs != 0 && *xt != 0) {
@@ -341,8 +371,8 @@ xcscmp(const XML_Char *xs, const XML_Char *xt) {
static int
notationCmp(const void *a, const void *b) {
- const NotationList *const n1 = *(NotationList **)a;
- const NotationList *const n2 = *(NotationList **)b;
+ const NotationList *const n1 = *(const NotationList *const *)a;
+ const NotationList *const n2 = *(const NotationList *const *)b;
return xcscmp(n1->notationName, n2->notationName);
}
@@ -842,47 +872,71 @@ showVersion(XML_Char *prog) {
}
}
+#if defined(__GNUC__)
+__attribute__((noreturn))
+#endif
static void
usage(const XML_Char *prog, int rc) {
ftprintf(
stderr,
/* Generated with:
* $ xmlwf/xmlwf_helpgen.sh
+ * To update, change xmlwf/xmlwf_helpgen.py, then paste the output of
+ * xmlwf/xmlwf_helpgen.sh in here.
*/
/* clang-format off */
- T("usage: %s [-s] [-n] [-p] [-x] [-e ENCODING] [-w] [-r] [-d DIRECTORY]\n")
- T(" [-c | -m | -t] [-N]\n")
- T(" [FILE [FILE ...]]\n")
+ T("usage:\n")
+ T(" %s [OPTIONS] [FILE ...]\n")
+ T(" %s -h|--help\n")
+ T(" %s -v|--version\n")
T("\n")
T("xmlwf - Determines if an XML document is well-formed\n")
T("\n")
T("positional arguments:\n")
- T(" FILE file to process (default: STDIN)\n")
+ T(" FILE file to process (default: STDIN)\n")
T("\n")
T("input control arguments:\n")
- T(" -s print an error if the document is not [s]tandalone\n")
- T(" -n enable [n]amespace processing\n")
- T(" -p enable processing external DTDs and [p]arameter entities\n")
- T(" -x enable processing of e[x]ternal entities\n")
- T(" -e ENCODING override any in-document [e]ncoding declaration\n")
- T(" -w enable support for [W]indows code pages\n")
- T(" -r disable memory-mapping and use normal file [r]ead IO calls instead\n")
+ T(" -s print an error if the document is not [s]tandalone\n")
+ T(" -n enable [n]amespace processing\n")
+ T(" -p enable processing of external DTDs and [p]arameter entities\n")
+ T(" -x enable processing of e[x]ternal entities\n")
+ T(" -e ENCODING override any in-document [e]ncoding declaration\n")
+ T(" -w enable support for [W]indows code pages\n")
+ T(" -r disable memory-mapping and use [r]ead calls instead\n")
+ T(" -g BYTES buffer size to request per call pair to XML_[G]etBuffer and read (default: 8 KiB)\n")
+ T(" -k when processing multiple files, [k]eep processing after first file with error\n")
T("\n")
T("output control arguments:\n")
- T(" -d DIRECTORY output [d]estination directory\n")
- T(" -c write a [c]opy of input XML, not canonical XML\n")
- T(" -m write [m]eta XML, not canonical XML\n")
- T(" -t write no XML output for [t]iming of plain parsing\n")
- T(" -N enable adding doctype and [n]otation declarations\n")
+ T(" -d DIRECTORY output [d]estination directory\n")
+ T(" -c write a [c]opy of input XML, not canonical XML\n")
+ T(" -m write [m]eta XML, not canonical XML\n")
+ T(" -t write no XML output for [t]iming of plain parsing\n")
+ T(" -N enable adding doctype and [n]otation declarations\n")
+ T("\n")
+ T("billion laughs attack protection:\n")
+ T(" NOTE: If you ever need to increase these values for non-attack payload, please file a bug report.\n")
+ T("\n")
+ T(" -a FACTOR set maximum tolerated [a]mplification factor (default: 100.0)\n")
+ T(" -b BYTES set number of output [b]ytes needed to activate (default: 8 MiB)\n")
+ T("\n")
+ T("reparse deferral:\n")
+ T(" -q disable reparse deferral, and allow [q]uadratic parse runtime with large tokens\n")
T("\n")
T("info arguments:\n")
- T(" -h show this [h]elp message and exit\n")
- T(" -v show program's [v]ersion number and exit\n")
+ T(" -h, --help show this [h]elp message and exit\n")
+ T(" -v, --version show program's [v]ersion number and exit\n")
+ T("\n")
+ T("exit status:\n")
+ T(" 0 the input files are well-formed and the output (if requested) was written successfully\n")
+ T(" 1 could not allocate data structures, signals a serious problem with execution environment\n")
+ T(" 2 one or more input files were not well-formed\n")
+ T(" 3 could not create an output file\n")
+ T(" 4 command-line argument error\n")
T("\n")
T("xmlwf of libexpat is software libre, licensed under the MIT license.\n")
- T("Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you!\n")
+ T("Please report bugs at https://github.com/libexpat/libexpat/issues -- thank you!\n")
, /* clang-format on */
- prog);
+ prog, prog, prog);
exit(rc);
}
@@ -891,6 +945,21 @@ usage(const XML_Char *prog, int rc) {
int wmain(int argc, XML_Char **argv);
#endif
+#define XMLWF_SHIFT_ARG_INTO(constCharStarTarget, argc, argv, i, j) \
+ { \
+ if (argv[i][j + 1] == T('\0')) { \
+ if (++i == argc) { \
+ usage(argv[0], XMLWF_EXIT_USAGE_ERROR); \
+ /* usage called exit(..), never gets here */ \
+ } \
+ constCharStarTarget = argv[i]; \
+ } else { \
+ constCharStarTarget = argv[i] + j + 1; \
+ } \
+ i++; \
+ j = 0; \
+ }
+
int
tmain(int argc, XML_Char **argv) {
int i, j;
@@ -902,6 +971,15 @@ tmain(int argc, XML_Char **argv) {
int useNamespaces = 0;
int requireStandalone = 0;
int requiresNotations = 0;
+ int continueOnError = 0;
+
+ float attackMaximumAmplification = -1.0f; /* signaling "not set" */
+ unsigned long long attackThresholdBytes = 0;
+ XML_Bool attackThresholdGiven = XML_FALSE;
+
+ XML_Bool disableDeferral = XML_FALSE;
+
+ int exitCode = XMLWF_EXIT_SUCCESS;
enum XML_ParamEntityParsing paramEntityParsing
= XML_PARAM_ENTITY_PARSING_NEVER;
int useStdin = 0;
@@ -917,9 +995,17 @@ tmain(int argc, XML_Char **argv) {
if (j == 0) {
if (argv[i][0] != T('-'))
break;
- if (argv[i][1] == T('-') && argv[i][2] == T('\0')) {
- i++;
- break;
+ if (argv[i][1] == T('-')) {
+ if (argv[i][2] == T('\0')) {
+ i++;
+ break;
+ } else if (tcscmp(argv[i] + 2, T("help")) == 0) {
+ usage(argv[0], XMLWF_EXIT_SUCCESS);
+ // usage called exit(..), never gets here
+ } else if (tcscmp(argv[i] + 2, T("version")) == 0) {
+ showVersion(argv[0]);
+ return XMLWF_EXIT_SUCCESS;
+ }
}
j++;
}
@@ -965,31 +1051,91 @@ tmain(int argc, XML_Char **argv) {
j++;
break;
case T('d'):
- if (argv[i][j + 1] == T('\0')) {
- if (++i == argc)
- usage(argv[0], 2);
- outputDir = argv[i];
- } else
- outputDir = argv[i] + j + 1;
- i++;
- j = 0;
+ XMLWF_SHIFT_ARG_INTO(outputDir, argc, argv, i, j);
break;
case T('e'):
- if (argv[i][j + 1] == T('\0')) {
- if (++i == argc)
- usage(argv[0], 2);
- encoding = argv[i];
- } else
- encoding = argv[i] + j + 1;
- i++;
- j = 0;
+ XMLWF_SHIFT_ARG_INTO(encoding, argc, argv, i, j);
break;
case T('h'):
- usage(argv[0], 0);
- return 0;
+ usage(argv[0], XMLWF_EXIT_SUCCESS);
+ // usage called exit(..), never gets here
case T('v'):
showVersion(argv[0]);
- return 0;
+ return XMLWF_EXIT_SUCCESS;
+ case T('g'): {
+ const XML_Char *valueText = NULL;
+ XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
+
+ errno = 0;
+ XML_Char *afterValueText = (XML_Char *)valueText;
+ const long long read_size_bytes_candidate
+ = tcstoull(valueText, &afterValueText, 10);
+ if ((errno != 0) || (afterValueText[0] != T('\0'))
+ || (read_size_bytes_candidate < 1)
+ || (read_size_bytes_candidate > (INT_MAX / 2 + 1))) {
+ // This prevents tperror(..) from reporting misleading "[..]: Success"
+ errno = ERANGE;
+ tperror(T("invalid buffer size") T(
+ " (needs an integer from 1 to INT_MAX/2+1 i.e. 1,073,741,824 on most platforms)"));
+ exit(XMLWF_EXIT_USAGE_ERROR);
+ }
+ g_read_size_bytes = (int)read_size_bytes_candidate;
+ break;
+ }
+ case T('k'):
+ continueOnError = 1;
+ j++;
+ break;
+ case T('a'): {
+ const XML_Char *valueText = NULL;
+ XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
+
+ errno = 0;
+ XML_Char *afterValueText = NULL;
+ attackMaximumAmplification = tcstof(valueText, &afterValueText);
+ if ((errno != 0) || (afterValueText[0] != T('\0'))
+ || isnan(attackMaximumAmplification)
+ || (attackMaximumAmplification < 1.0f)) {
+ // This prevents tperror(..) from reporting misleading "[..]: Success"
+ errno = ERANGE;
+ tperror(T("invalid amplification limit") T(
+ " (needs a floating point number greater or equal than 1.0)"));
+ exit(XMLWF_EXIT_USAGE_ERROR);
+ }
+#if XML_GE == 0
+ ftprintf(stderr,
+ T("Warning: Given amplification limit ignored")
+ T(", xmlwf has been compiled without DTD/GE support.\n"));
+#endif
+ break;
+ }
+ case T('b'): {
+ const XML_Char *valueText = NULL;
+ XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
+
+ errno = 0;
+ XML_Char *afterValueText = (XML_Char *)valueText;
+ attackThresholdBytes = tcstoull(valueText, &afterValueText, 10);
+ if ((errno != 0) || (afterValueText[0] != T('\0'))) {
+ // This prevents tperror(..) from reporting misleading "[..]: Success"
+ errno = ERANGE;
+ tperror(T("invalid ignore threshold")
+ T(" (needs an integer from 0 to 2^64-1)"));
+ exit(XMLWF_EXIT_USAGE_ERROR);
+ }
+ attackThresholdGiven = XML_TRUE;
+#if XML_GE == 0
+ ftprintf(stderr,
+ T("Warning: Given attack threshold ignored")
+ T(", xmlwf has been compiled without DTD/GE support.\n"));
+#endif
+ break;
+ }
+ case T('q'): {
+ disableDeferral = XML_TRUE;
+ j++;
+ break;
+ }
case T('\0'):
if (j > 1) {
i++;
@@ -998,7 +1144,8 @@ tmain(int argc, XML_Char **argv) {
}
/* fall through */
default:
- usage(argv[0], 2);
+ usage(argv[0], XMLWF_EXIT_USAGE_ERROR);
+ // usage called exit(..), never gets here
}
}
if (i == argc) {
@@ -1017,7 +1164,32 @@ tmain(int argc, XML_Char **argv) {
if (! parser) {
tperror(T("Could not instantiate parser"));
- exit(1);
+ exit(XMLWF_EXIT_INTERNAL_ERROR);
+ }
+
+ if (attackMaximumAmplification != -1.0f) {
+#if XML_GE == 1
+ XML_SetBillionLaughsAttackProtectionMaximumAmplification(
+ parser, attackMaximumAmplification);
+#endif
+ }
+ if (attackThresholdGiven) {
+#if XML_GE == 1
+ XML_SetBillionLaughsAttackProtectionActivationThreshold(
+ parser, attackThresholdBytes);
+#else
+ (void)attackThresholdBytes; // silence -Wunused-but-set-variable
+#endif
+ }
+
+ if (disableDeferral) {
+ const XML_Bool success = XML_SetReparseDeferralEnabled(parser, XML_FALSE);
+ if (! success) {
+ // This prevents tperror(..) from reporting misleading "[..]: Success"
+ errno = EINVAL;
+ tperror(T("Failed to disable reparse deferral"));
+ exit(XMLWF_EXIT_INTERNAL_ERROR);
+ }
}
if (requireStandalone)
@@ -1053,7 +1225,7 @@ tmain(int argc, XML_Char **argv) {
* sizeof(XML_Char));
if (! outName) {
tperror(T("Could not allocate memory"));
- exit(1);
+ exit(XMLWF_EXIT_INTERNAL_ERROR);
}
tcscpy(outName, outputDir);
tcscat(outName, delim);
@@ -1061,7 +1233,14 @@ tmain(int argc, XML_Char **argv) {
userData.fp = tfopen(outName, T("wb"));
if (! userData.fp) {
tperror(outName);
- exit(3);
+ exitCode = XMLWF_EXIT_OUTPUT_ERROR;
+ free(outName);
+ XML_ParserFree(parser);
+ if (continueOnError) {
+ continue;
+ } else {
+ break;
+ }
}
setvbuf(userData.fp, NULL, _IOFBF, 16384);
#ifdef XML_UNICODE
@@ -1123,8 +1302,12 @@ tmain(int argc, XML_Char **argv) {
}
XML_ParserFree(parser);
if (! result) {
- exit(2);
+ exitCode = XMLWF_EXIT_NOT_WELLFORMED;
+ cleanupUserData(&userData);
+ if (! continueOnError) {
+ break;
+ }
}
}
- return 0;
+ return exitCode;
}
diff --git a/3rdparty/expat/xmlwf/xmlwf_helpgen.py b/3rdparty/expat/xmlwf/xmlwf_helpgen.py
index 939286e5c2c..3d32f5d148b 100755
--- a/3rdparty/expat/xmlwf/xmlwf_helpgen.py
+++ b/3rdparty/expat/xmlwf/xmlwf_helpgen.py
@@ -6,7 +6,8 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2019 Expat development team
+# Copyright (c) 2019-2023 Sebastian Pipping <sebastian@pipping.org>
+# Copyright (c) 2021 Tim Bray <tbray@textuality.com>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -31,11 +32,25 @@
import argparse
epilog = """
+exit status:
+ 0 the input files are well-formed and the output (if requested) was written successfully
+ 1 could not allocate data structures, signals a serious problem with execution environment
+ 2 one or more input files were not well-formed
+ 3 could not create an output file
+ 4 command-line argument error
+
xmlwf of libexpat is software libre, licensed under the MIT license.
-Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you!
+Please report bugs at https://github.com/libexpat/libexpat/issues -- thank you!
+"""
+
+usage = """
+ %(prog)s [OPTIONS] [FILE ...]
+ %(prog)s -h|--help
+ %(prog)s -v|--version
"""
parser = argparse.ArgumentParser(prog='xmlwf', add_help=False,
+ usage=usage,
description='xmlwf - Determines if an XML document is well-formed',
formatter_class=argparse.RawTextHelpFormatter,
epilog=epilog)
@@ -43,11 +58,13 @@ parser = argparse.ArgumentParser(prog='xmlwf', add_help=False,
input_related = parser.add_argument_group('input control arguments')
input_related.add_argument('-s', action='store_true', help='print an error if the document is not [s]tandalone')
input_related.add_argument('-n', action='store_true', help='enable [n]amespace processing')
-input_related.add_argument('-p', action='store_true', help='enable processing external DTDs and [p]arameter entities')
+input_related.add_argument('-p', action='store_true', help='enable processing of external DTDs and [p]arameter entities')
input_related.add_argument('-x', action='store_true', help='enable processing of e[x]ternal entities')
input_related.add_argument('-e', action='store', metavar='ENCODING', help='override any in-document [e]ncoding declaration')
input_related.add_argument('-w', action='store_true', help='enable support for [W]indows code pages')
-input_related.add_argument('-r', action='store_true', help='disable memory-mapping and use normal file [r]ead IO calls instead')
+input_related.add_argument('-r', action='store_true', help='disable memory-mapping and use [r]ead calls instead')
+input_related.add_argument('-g', metavar='BYTES', help='buffer size to request per call pair to XML_[G]etBuffer and read (default: 8 KiB)')
+input_related.add_argument('-k', action='store_true', help='when processing multiple files, [k]eep processing after first file with error')
output_related = parser.add_argument_group('output control arguments')
output_related.add_argument('-d', action='store', metavar='DIRECTORY', help='output [d]estination directory')
@@ -57,12 +74,24 @@ output_mode.add_argument('-m', action='store_true', help='write [m]eta XML, not
output_mode.add_argument('-t', action='store_true', help='write no XML output for [t]iming of plain parsing')
output_related.add_argument('-N', action='store_true', help='enable adding doctype and [n]otation declarations')
+billion_laughs = parser.add_argument_group('billion laughs attack protection',
+ description='NOTE: '
+ 'If you ever need to increase these values '
+ 'for non-attack payload, please file a bug report.')
+billion_laughs.add_argument('-a', metavar='FACTOR',
+ help='set maximum tolerated [a]mplification factor (default: 100.0)')
+billion_laughs.add_argument('-b', metavar='BYTES', help='set number of output [b]ytes needed to activate (default: 8 MiB)')
+
+reparse_deferral = parser.add_argument_group('reparse deferral')
+reparse_deferral.add_argument('-q', metavar='FACTOR',
+ help='disable reparse deferral, and allow [q]uadratic parse runtime with large tokens')
+
parser.add_argument('files', metavar='FILE', nargs='*', help='file to process (default: STDIN)')
info = parser.add_argument_group('info arguments')
info = info.add_mutually_exclusive_group()
-info.add_argument('-h', action='store_true', help='show this [h]elp message and exit')
-info.add_argument('-v', action='store_true', help='show program\'s [v]ersion number and exit')
+info.add_argument('-h', '--help', action='store_true', help='show this [h]elp message and exit')
+info.add_argument('-v', '--version', action='store_true', help='show program\'s [v]ersion number and exit')
if __name__ == '__main__':
diff --git a/3rdparty/expat/xmlwf/xmlwf_helpgen.sh b/3rdparty/expat/xmlwf/xmlwf_helpgen.sh
index 6b0fbf929a0..864e47086d1 100755
--- a/3rdparty/expat/xmlwf/xmlwf_helpgen.sh
+++ b/3rdparty/expat/xmlwf/xmlwf_helpgen.sh
@@ -6,7 +6,7 @@
# \___/_/\_\ .__/ \__,_|\__|
# |_| XML parser
#
-# Copyright (c) 2019 Expat development team
+# Copyright (c) 2019-2021 Sebastian Pipping <sebastian@pipping.org>
# Licensed under the MIT license:
#
# Permission is hereby granted, free of charge, to any person obtaining
@@ -29,7 +29,8 @@
# USE OR OTHER DEALINGS IN THE SOFTWARE.
./xmlwf/xmlwf_helpgen.py | sed \
- -e 's,usage: xmlwf,usage: %s,' \
+ -e 's,usage: ,usage:,' \
+ -e 's, xmlwf, %s,' \
-e 's, \[-h | -v\],,' \
-e 's,^, T(",' \
-e 's,$,\\n"),'
diff --git a/3rdparty/flac/src/libFLAC/include/private/bitmath.h b/3rdparty/flac/src/libFLAC/include/private/bitmath.h
index 12e062f88c5..5241462f378 100644
--- a/3rdparty/flac/src/libFLAC/include/private/bitmath.h
+++ b/3rdparty/flac/src/libFLAC/include/private/bitmath.h
@@ -1,6 +1,6 @@
/* libFLAC - Free Lossless Audio Codec library
* Copyright (C) 2001-2009 Josh Coalson
- * Copyright (C) 2011-2023 Xiph.Org Foundation
+ * Copyright (C) 2011-2025 Xiph.Org Foundation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -82,7 +82,7 @@ static inline uint32_t FLAC__clz_uint32(FLAC__uint32 v)
return __builtin_clz(v);
#elif defined(_MSC_VER)
{
- uint32_t idx;
+ unsigned long idx;
_BitScanReverse(&idx, v);
return idx ^ 31U;
}
@@ -106,7 +106,7 @@ static inline uint32_t FLAC__clz_uint64(FLAC__uint64 v)
return __builtin_clzll(v);
#elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64))
{
- uint32_t idx;
+ unsigned long idx;
_BitScanReverse64(&idx, v);
return idx ^ 63U;
}
@@ -160,7 +160,7 @@ static inline uint32_t FLAC__bitmath_ilog2(FLAC__uint32 v)
return _bit_scan_reverse(v);
#elif defined(_MSC_VER)
{
- uint32_t idx;
+ unsigned long idx;
_BitScanReverse(&idx, v);
return idx;
}
@@ -177,7 +177,7 @@ static inline uint32_t FLAC__bitmath_ilog2_wide(FLAC__uint64 v)
/* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */
#elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64))
{
- uint32_t idx;
+ unsigned long idx;
_BitScanReverse64(&idx, v);
return idx;
}
@@ -206,5 +206,6 @@ static inline uint32_t FLAC__bitmath_ilog2_wide(FLAC__uint64 v)
}
uint32_t FLAC__bitmath_silog2(FLAC__int64 v);
+uint32_t FLAC__bitmath_extra_mulbits_unsigned(FLAC__uint32 v);
#endif
diff --git a/3rdparty/genie/.travis.yml b/3rdparty/genie/.travis.yml
deleted file mode 100644
index 077f5882e3e..00000000000
--- a/3rdparty/genie/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: cpp
-matrix:
- include:
- - compiler: gcc
- os: linux
- - compiler: clang
- os: osx
-
-script:
- make
-
-branches:
- only:
- - master
-
-notifications:
- email: false
-
-osx_image:
- xcode61
diff --git a/3rdparty/genie/README.md b/3rdparty/genie/README.md
index 526705e68d3..59255d3a5da 100644
--- a/3rdparty/genie/README.md
+++ b/3rdparty/genie/README.md
@@ -1,6 +1,12 @@
+<p align="center">
+<img src="https://repository-images.githubusercontent.com/23779242/961ad700-8d21-11ea-85d3-1d64eccc4531" width="1280">
+</p>
+
[GENie](https://github.com/bkaradzic/genie#what-is-it) - Project generator tool
===============================================================================
+[![Build and Upload Artifact](https://github.com/bkaradzic/GENie/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/bkaradzic/GENie/actions/workflows/build.yml)
+
What is it?
-----------
@@ -9,19 +15,16 @@ generates project from Lua script, making applying the same settings for
multiple projects easy.
Supported project generators:
- * FASTBuild (experimental)
* GNU Makefile
+ * [JSON Compilation Database][jcdb]
* Ninja (experimental)
- * Qbs / QtCreator (experimental)
- * Visual Studio 2010, 2012, 2013, 2015, 2017, 2019
+ * Visual Studio 2010, 2012, 2013, 2015, 2017, 2019, 2022, 2026
* XCode
Download (stable)
-----------------
-[![Build Status](https://travis-ci.org/bkaradzic/GENie.svg?branch=master)](https://travis-ci.org/bkaradzic/GENie)
-
- version 1115 (commit cd9b1a624810b166d11788d01c2aa4daf2ea42e6)
+ version 1196 (commit 5ae13c9940b4d5a62b1ea086ffcdacc2ddc16b50)
Linux:
https://github.com/bkaradzic/bx/raw/master/tools/bin/linux/genie
@@ -43,7 +46,11 @@ Documentation
-------------
[Scripting Reference](https://github.com/bkaradzic/genie/blob/master/docs/scripting-reference.md#scripting-reference)
-[Introduction to GENie - CppCon 2016](https://onedrive.live.com/view.aspx?cid=171ee76e679935c8&page=view&resid=171EE76E679935C8!139573&parId=171EE76E679935C8!18835&authkey=!AKv_SGrgJwxDGDg&app=PowerPoint)
+
+Introduction to GENie - CppCon 2016
+<a href="http://www.youtube.com/watch?feature=player_embedded&v=_vArtdDTrTM"
+target="_blank"><img src="http://img.youtube.com/vi/_vArtdDTrTM/0.jpg"
+alt="Introduction to GENie - CppCon 2016" width="640" height="480" border="0" /></a>
History
-------
@@ -90,7 +97,7 @@ of Premake 4.4 beta 5, and there is no intention to keep it compatible with it.
- Added support for generating PS4/Orbis projects.
- Fixed PCH race when using concurrent Makefile build.
- Added Green Hills Software compiler support.
- - Added edit & continue support for 64-bit builds in VS2013 upwards.
+ - Added edit & continue support for 64-bit builds in vs2013 upwards.
- Added `windowstargetplatformversion` to specify VS Windows target version.
- Added `NoWinRT` flag to disable WinRT CX builds.
- Added `NoBufferSecurityCheck` flag to disable security checks in VS.
@@ -120,25 +127,32 @@ of Premake 4.4 beta 5, and there is no intention to keep it compatible with it.
- Added `iostargetplatformversion`, `macostargetplatformversion`, and
`tvostargetplatformversion` to specify XCode OS target version.
- Removed the `xcode3`, and `xcode4` actions.
- - Added the `xcode8`, `xcode9`, and `xcode10` actions.
+ - Added the `xcode8`, `xcode9`, `xcode10`, `xcode11` and `xcode14` actions.
- Added `systemincludedirs` that are always searched after directories added
using `includedirs`.
- Added `NoRuntimeChecks` flag to disable Basic Runtime Checks in non-optimized
Visual Studio builds.
- Added support for Nintendo Switch projects.
- - Added flags for selecting C++ standard: `Cpp11`, `Cpp14`, `Cpp17`,
+ - Added flags for selecting C++ standard: `Cpp11`, `Cpp14`, `Cpp17`, `Cpp20`
and `CppLatest`.
- Added `xcodeprojectopts` and `xcodetargetopts`.
- Added vs2019 support.
- - Added UnitySupport flag to enable Unity (Jumbo) builds in Visual Studio 2019
-
-build - GENie build system scripts
+ - Added `UnitySupport` flag to enable Unity (Jumbo) builds in vs2019
+ - Added the `jcdb` action for generating a [JSON compilation database][jcdb].
+ - Added support for generating Switch/NX32 Switch/NX64 projects.
+ - Removed FASTBuild.
+ - Removed Qbs support.
+ - Added vs2022 support.
+ - Added xcode15 action with visionOS support.
+ - Added vs2026 support.
+
+zidar - GENie build system scripts
----------------------------------
-build is a set of build system scripts and related tools, built around
+zidar is a set of build system scripts and related tools, built around
GENie project generator tool.
-https://milostosic.github.io/build/
+https://github.com/RudjiGames/zidar
Debugging GENie scripts
-----------------------
@@ -240,4 +254,5 @@ Developer Crackshell used GENie for development of games
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ [jcdb]: https://clang.llvm.org/docs/JSONCompilationDatabase.html
[zbs]: https://studio.zerobrane.com
diff --git a/3rdparty/genie/build/gmake.darwin/Makefile b/3rdparty/genie/build/gmake.darwin/Makefile
index b5df3fe739b..4a5db66dab0 100644
--- a/3rdparty/genie/build/gmake.darwin/Makefile
+++ b/3rdparty/genie/build/gmake.darwin/Makefile
@@ -1,4 +1,5 @@
# GNU Make solution makefile autogenerated by GENie
+# https://github.com/bkaradzic/GENie
# Type "make help" for usage help
ifndef config
diff --git a/3rdparty/genie/build/gmake.darwin/genie.make b/3rdparty/genie/build/gmake.darwin/genie.make
index 81e820505cb..00ce8266d3f 100644
--- a/3rdparty/genie/build/gmake.darwin/genie.make
+++ b/3rdparty/genie/build/gmake.darwin/genie.make
@@ -1,4 +1,8 @@
# GNU Make project makefile autogenerated by GENie
+# https://github.com/bkaradzic/GENie
+
+.SUFFIXES:
+
ifndef config
config=release
endif
@@ -49,13 +53,13 @@ ifeq ($(config),release)
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
- ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=10.6
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=10.6
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=10.6
+ ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -mmacosx-version-min=11.0
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L"." -mmacosx-version-min=10.6
+ ALL_LDFLAGS += $(LDFLAGS) -L"." -mmacosx-version-min=11.0
LIBDEPS +=
LDDEPS +=
LDRESP =
@@ -136,13 +140,13 @@ ifeq ($(config),debug)
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
- ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=10.6
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=10.6
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=10.6
+ ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g $(MPARAM) -mmacosx-version-min=11.0
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L"." -mmacosx-version-min=10.6
+ ALL_LDFLAGS += $(LDFLAGS) -L"." -mmacosx-version-min=11.0
LIBDEPS +=
LDDEPS +=
LDRESP =
@@ -224,13 +228,13 @@ ifeq ($(config),releaseuniv32)
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
- ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
+ ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L"." -arch i386 -arch ppc -mmacosx-version-min=10.6
+ ALL_LDFLAGS += $(LDFLAGS) -L"." -arch i386 -arch ppc -mmacosx-version-min=11.0
LIBDEPS +=
LDDEPS +=
LDRESP =
@@ -312,13 +316,13 @@ ifeq ($(config),debuguniv32)
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
- ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
- ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=10.6
+ ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
+ ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc $(MPARAM) -mmacosx-version-min=11.0
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L"." -arch i386 -arch ppc -mmacosx-version-min=10.6
+ ALL_LDFLAGS += $(LDFLAGS) -L"." -arch i386 -arch ppc -mmacosx-version-min=11.0
LIBDEPS +=
LDDEPS +=
LDRESP =
diff --git a/3rdparty/genie/build/gmake.freebsd/genie.make b/3rdparty/genie/build/gmake.freebsd/genie.make
index 3ee72460742..15c88d5c9bb 100644
--- a/3rdparty/genie/build/gmake.freebsd/genie.make
+++ b/3rdparty/genie/build/gmake.freebsd/genie.make
@@ -1,4 +1,7 @@
# GNU Make project makefile autogenerated by GENie
+
+.SUFFIXES:
+
ifndef config
config=release
endif
@@ -49,17 +52,21 @@ ifeq ($(config),release)
DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
- ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM)
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM)
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM)
- ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM)
- ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM)
+ ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -m64 -Wno-implicit-fallthrough
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -m64 -Wno-implicit-fallthrough
+ ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -m64 -Wno-implicit-fallthrough
+ ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -m64 -Wno-implicit-fallthrough
+ ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -m64 -Wno-implicit-fallthrough
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L. -s -rdynamic
+ ALL_LDFLAGS += $(LDFLAGS) -L"." -s -rdynamic
+ LIBDEPS +=
LDDEPS +=
+ LDRESP =
LIBS += $(LDDEPS) -lm
EXTERNAL_LIBS +=
- LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)
+ LINKOBJS = $(OBJECTS)
+ LINKCMD = $(CC) -o $(TARGET) $(LINKOBJS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)
+ OBJRESP =
OBJECTS := \
$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o \
$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o \
@@ -132,17 +139,21 @@ ifeq ($(config),debug)
DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN
INCLUDES += -I"../../src/host/lua-5.3.0/src"
ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP -MP $(DEFINES) $(INCLUDES)
- ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
- ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
- ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g
+ ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -m64 -Wno-implicit-fallthrough
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -m64 -Wno-implicit-fallthrough
+ ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -m64 -Wno-implicit-fallthrough
+ ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -m64 -Wno-implicit-fallthrough
+ ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -m64 -Wno-implicit-fallthrough
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L. -rdynamic
+ ALL_LDFLAGS += $(LDFLAGS) -L"." -rdynamic
+ LIBDEPS +=
LDDEPS +=
+ LDRESP =
LIBS += $(LDDEPS) -lm
EXTERNAL_LIBS +=
- LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)
+ LINKOBJS = $(OBJECTS)
+ LINKCMD = $(CC) -o $(TARGET) $(LINKOBJS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)
+ OBJRESP =
OBJECTS := \
$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o \
$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o \
@@ -220,7 +231,7 @@ RESOURCES := \
all: $(OBJDIRS) $(TARGETDIR) prebuild prelink $(TARGET)
@:
-$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(EXTERNAL_LIBS) $(RESOURCES) | $(TARGETDIR) $(OBJDIRS)
+$(TARGET): $(GCH) $(OBJECTS) $(LIBDEPS) $(EXTERNAL_LIBS) $(RESOURCES) $(OBJRESP) $(LDRESP) | $(TARGETDIR) $(OBJDIRS)
@echo Linking genie
$(SILENT) $(LINKCMD)
$(POSTBUILDCMDS)
@@ -259,223 +270,235 @@ $(GCH_OBJC): $(PCH) $(MAKEFILE) | $(OBJDIR)
$(SILENT) $(CC) $(ALL_OBJCFLAGS) -x objective-c-header $(DEFINES) $(INCLUDES) -o "$@" -c "$<"
endif
-$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH) $(MAKEFILE)
+ifneq (,$(OBJRESP))
+$(OBJRESP): $(OBJECTS) | $(TARGETDIR) $(OBJDIRS)
+ $(SILENT) echo $^
+ $(SILENT) echo $^ > $@
+endif
+
+ifneq (,$(LDRESP))
+$(LDRESP): $(LDDEPS) | $(TARGETDIR) $(OBJDIRS)
+ $(SILENT) echo $^
+ $(SILENT) echo $^ > $@
+endif
+
+$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host/lua-5.3.0/src
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_getabsolute.o: ../../src/host/path_getabsolute.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/path_getabsolute.o: ../../src/host/path_getabsolute.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_getrelative.o: ../../src/host/path_getrelative.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/path_getrelative.o: ../../src/host/path_getrelative.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_helpers.o: ../../src/host/path_helpers.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/path_helpers.o: ../../src/host/path_helpers.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
-$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH) $(MAKEFILE)
+$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c $(GCH) $(MAKEFILE) | $(OBJDIR)/src/host
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -c "$<"
diff --git a/3rdparty/genie/build/gmake.linux/Makefile b/3rdparty/genie/build/gmake.linux/Makefile
index be9880cf2a3..6aac6fec212 100644
--- a/3rdparty/genie/build/gmake.linux/Makefile
+++ b/3rdparty/genie/build/gmake.linux/Makefile
@@ -1,4 +1,5 @@
# GNU Make solution makefile autogenerated by GENie
+# https://github.com/bkaradzic/GENie
# Type "make help" for usage help
ifndef config
diff --git a/3rdparty/genie/build/gmake.linux/genie.make b/3rdparty/genie/build/gmake.linux/genie.make
index af00e6f90f7..30f5bcb741a 100644
--- a/3rdparty/genie/build/gmake.linux/genie.make
+++ b/3rdparty/genie/build/gmake.linux/genie.make
@@ -1,4 +1,8 @@
# GNU Make project makefile autogenerated by GENie
+# https://github.com/bkaradzic/GENie
+
+.SUFFIXES:
+
ifndef config
config=release
endif
diff --git a/3rdparty/genie/build/gmake.solaris/Makefile b/3rdparty/genie/build/gmake.solaris/Makefile
deleted file mode 100644
index be9880cf2a3..00000000000
--- a/3rdparty/genie/build/gmake.solaris/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-# GNU Make solution makefile autogenerated by GENie
-# Type "make help" for usage help
-
-ifndef config
- config=release
-endif
-export config
-
-PROJECTS := genie
-
-.PHONY: all clean help $(PROJECTS)
-
-all: $(PROJECTS)
-
-genie:
- @echo "==== Building genie ($(config)) ===="
- @${MAKE} --no-print-directory -C . -f genie.make
-
-clean:
- @${MAKE} --no-print-directory -C . -f genie.make clean
-
-help:
- @echo "Usage: make [config=name] [target]"
- @echo ""
- @echo "CONFIGURATIONS:"
- @echo " release"
- @echo " debug"
- @echo ""
- @echo "TARGETS:"
- @echo " all (default)"
- @echo " clean"
- @echo " genie"
- @echo ""
- @echo "For more information, see https://github.com/bkaradzic/genie"
diff --git a/3rdparty/genie/build/gmake.solaris/genie.make b/3rdparty/genie/build/gmake.solaris/genie.make
deleted file mode 100644
index 56ce127f9d9..00000000000
--- a/3rdparty/genie/build/gmake.solaris/genie.make
+++ /dev/null
@@ -1,470 +0,0 @@
-# GNU Make project makefile autogenerated by GENie
-ifndef config
- config=release
-endif
-
-ifndef verbose
- SILENT = @
-endif
-
-SHELLTYPE := msdos
-ifeq (,$(ComSpec)$(COMSPEC))
- SHELLTYPE := posix
-endif
-ifeq (/bin,$(findstring /bin,$(SHELL)))
- SHELLTYPE := posix
-endif
-
-ifeq (posix,$(SHELLTYPE))
- MKDIR = $(SILENT) mkdir -p "$(1)"
- COPY = $(SILENT) cp -fR "$(1)" "$(2)"
- RM= $(SILENT) rm -f "$(1)"
-else
- MKDIR = $(SILENT) mkdir "$(subst /,\\,$(1))" 2> nul || exit 0
- COPY = $(SILENT) copy /Y "$(subst /,\\,$(1))" "$(subst /,\\,$(2))"
- RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0
-endif
-
-CC = gcc
-CXX = g++
-AR = ar
-
-ifndef RESCOMP
- ifdef WINDRES
- RESCOMP = $(WINDRES)
- else
- RESCOMP = windres
- endif
-endif
-
-ifeq ($(config),release)
- OBJDIR = obj/Release
- TARGETDIR = ../../bin/solaris
- override TARGET = $(TARGETDIR)/genie
- DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -D_REENTRANT -DLUA_USE_POSIX -DLUA_USE_DLOPEN
- INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -std=gnu99
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -std=gnu99
- ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os $(MPARAM) -std=gnu99
- ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L. -s -rdynamic
- LDDEPS +=
- LIBS += $(LDDEPS) -ldl -lm
- LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)
- OBJECTS := \
- $(OBJDIR)/src/host/os_chdir.o \
- $(OBJDIR)/src/host/os_copyfile.o \
- $(OBJDIR)/src/host/os_getcwd.o \
- $(OBJDIR)/src/host/os_is64bit.o \
- $(OBJDIR)/src/host/os_isdir.o \
- $(OBJDIR)/src/host/os_isfile.o \
- $(OBJDIR)/src/host/os_match.o \
- $(OBJDIR)/src/host/os_mkdir.o \
- $(OBJDIR)/src/host/os_pathsearch.o \
- $(OBJDIR)/src/host/os_rmdir.o \
- $(OBJDIR)/src/host/os_stat.o \
- $(OBJDIR)/src/host/os_ticks.o \
- $(OBJDIR)/src/host/os_uuid.o \
- $(OBJDIR)/src/host/path_getabsolute.o \
- $(OBJDIR)/src/host/path_getrelative.o \
- $(OBJDIR)/src/host/path_helpers.o \
- $(OBJDIR)/src/host/path_isabsolute.o \
- $(OBJDIR)/src/host/premake.o \
- $(OBJDIR)/src/host/premake_main.o \
- $(OBJDIR)/src/host/scripts.o \
- $(OBJDIR)/src/host/string_endswith.o \
- $(OBJDIR)/src/host/string_hash.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lapi.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lcode.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lctype.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldo.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldump.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lgc.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/linit.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/liolib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/llex.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lmem.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lobject.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/loslib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lparser.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lstate.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lstring.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ltable.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ltm.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lundump.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lvm.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lzio.o \
-
- define PREBUILDCMDS
- endef
- define PRELINKCMDS
- endef
- define POSTBUILDCMDS
- endef
-endif
-
-ifeq ($(config),debug)
- OBJDIR = obj/Debug
- TARGETDIR = ../../bin/solaris
- override TARGET = $(TARGETDIR)/genie
- DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -D_REENTRANT -DLUA_USE_POSIX -DLUA_USE_DLOPEN
- INCLUDES += -I../../src/host/lua-5.3.0/src
- ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
- ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -std=gnu99
- ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -std=gnu99
- ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -std=gnu99
- ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- ALL_LDFLAGS += $(LDFLAGS) -L. -rdynamic
- LDDEPS +=
- LIBS += $(LDDEPS) -ldl -lm
- LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)
- OBJECTS := \
- $(OBJDIR)/src/host/os_chdir.o \
- $(OBJDIR)/src/host/os_copyfile.o \
- $(OBJDIR)/src/host/os_getcwd.o \
- $(OBJDIR)/src/host/os_is64bit.o \
- $(OBJDIR)/src/host/os_isdir.o \
- $(OBJDIR)/src/host/os_isfile.o \
- $(OBJDIR)/src/host/os_match.o \
- $(OBJDIR)/src/host/os_mkdir.o \
- $(OBJDIR)/src/host/os_pathsearch.o \
- $(OBJDIR)/src/host/os_rmdir.o \
- $(OBJDIR)/src/host/os_stat.o \
- $(OBJDIR)/src/host/os_ticks.o \
- $(OBJDIR)/src/host/os_uuid.o \
- $(OBJDIR)/src/host/path_getabsolute.o \
- $(OBJDIR)/src/host/path_getrelative.o \
- $(OBJDIR)/src/host/path_helpers.o \
- $(OBJDIR)/src/host/path_isabsolute.o \
- $(OBJDIR)/src/host/premake.o \
- $(OBJDIR)/src/host/premake_main.o \
- $(OBJDIR)/src/host/scripts.o \
- $(OBJDIR)/src/host/string_endswith.o \
- $(OBJDIR)/src/host/string_hash.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lapi.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lcode.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lctype.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldo.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ldump.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lgc.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/linit.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/liolib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/llex.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lmem.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lobject.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/loslib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lparser.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lstate.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lstring.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ltable.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/ltm.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lundump.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lvm.o \
- $(OBJDIR)/src/host/lua-5.3.0/src/lzio.o \
-
- define PREBUILDCMDS
- endef
- define PRELINKCMDS
- endef
- define POSTBUILDCMDS
- endef
-endif
-
-OBJDIRS := \
- $(OBJDIR) \
- $(OBJDIR)/src/host \
- $(OBJDIR)/src/host/lua-5.3.0/src \
-
-RESOURCES := \
-
-.PHONY: clean prebuild prelink
-
-all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)
- @:
-
-$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)
- @echo Linking genie
- $(SILENT) $(LINKCMD)
- $(POSTBUILDCMDS)
-
-$(TARGETDIR):
- @echo Creating $(TARGETDIR)
- -$(call MKDIR,$(TARGETDIR))
-
-$(OBJDIRS):
- @echo Creating $(@)
- -$(call MKDIR,$@)
-
-clean:
- @echo Cleaning genie
-ifeq (posix,$(SHELLTYPE))
- $(SILENT) rm -f $(TARGET)
- $(SILENT) rm -rf $(OBJDIR)
-else
- $(SILENT) if exist $(subst /,\\,$(TARGET)) del $(subst /,\\,$(TARGET))
- $(SILENT) if exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR))
-endif
-
-prebuild:
- $(PREBUILDCMDS)
-
-prelink:
- $(PRELINKCMDS)
-
-ifneq (,$(PCH))
-$(GCH): $(PCH)
- @echo $(notdir $<)
- $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<"
-endif
-
-$(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_ticks.o: ../../src/host/os_ticks.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/path_getabsolute.o: ../../src/host/path_getabsolute.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/path_getrelative.o: ../../src/host/path_getrelative.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/path_helpers.o: ../../src/host/path_helpers.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/premake.o: ../../src/host/premake.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/scripts.o: ../../src/host/scripts.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lapi.o: ../../src/host/lua-5.3.0/src/lapi.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lauxlib.o: ../../src/host/lua-5.3.0/src/lauxlib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lbaselib.o: ../../src/host/lua-5.3.0/src/lbaselib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lbitlib.o: ../../src/host/lua-5.3.0/src/lbitlib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lcode.o: ../../src/host/lua-5.3.0/src/lcode.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lcorolib.o: ../../src/host/lua-5.3.0/src/lcorolib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lctype.o: ../../src/host/lua-5.3.0/src/lctype.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ldblib.o: ../../src/host/lua-5.3.0/src/ldblib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ldebug.o: ../../src/host/lua-5.3.0/src/ldebug.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ldo.o: ../../src/host/lua-5.3.0/src/ldo.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ldump.o: ../../src/host/lua-5.3.0/src/ldump.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lfunc.o: ../../src/host/lua-5.3.0/src/lfunc.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lgc.o: ../../src/host/lua-5.3.0/src/lgc.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/linit.o: ../../src/host/lua-5.3.0/src/linit.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/liolib.o: ../../src/host/lua-5.3.0/src/liolib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/llex.o: ../../src/host/lua-5.3.0/src/llex.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lmathlib.o: ../../src/host/lua-5.3.0/src/lmathlib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lmem.o: ../../src/host/lua-5.3.0/src/lmem.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/loadlib.o: ../../src/host/lua-5.3.0/src/loadlib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lobject.o: ../../src/host/lua-5.3.0/src/lobject.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lopcodes.o: ../../src/host/lua-5.3.0/src/lopcodes.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/loslib.o: ../../src/host/lua-5.3.0/src/loslib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lparser.o: ../../src/host/lua-5.3.0/src/lparser.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lstate.o: ../../src/host/lua-5.3.0/src/lstate.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lstring.o: ../../src/host/lua-5.3.0/src/lstring.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lstrlib.o: ../../src/host/lua-5.3.0/src/lstrlib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ltable.o: ../../src/host/lua-5.3.0/src/ltable.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ltablib.o: ../../src/host/lua-5.3.0/src/ltablib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/ltm.o: ../../src/host/lua-5.3.0/src/ltm.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lundump.o: ../../src/host/lua-5.3.0/src/lundump.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lutf8lib.o: ../../src/host/lua-5.3.0/src/lutf8lib.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lvm.o: ../../src/host/lua-5.3.0/src/lvm.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
-$(OBJDIR)/src/host/lua-5.3.0/src/lzio.o: ../../src/host/lua-5.3.0/src/lzio.c
- @echo $(notdir $<)
- $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<"
-
--include $(OBJECTS:%.o=%.d)
-ifneq (,$(PCH))
- -include $(OBJDIR)/$(notdir $(PCH)).d
-endif
diff --git a/3rdparty/genie/build/gmake.windows/Makefile b/3rdparty/genie/build/gmake.windows/Makefile
index be9880cf2a3..6aac6fec212 100644
--- a/3rdparty/genie/build/gmake.windows/Makefile
+++ b/3rdparty/genie/build/gmake.windows/Makefile
@@ -1,4 +1,5 @@
# GNU Make solution makefile autogenerated by GENie
+# https://github.com/bkaradzic/GENie
# Type "make help" for usage help
ifndef config
diff --git a/3rdparty/genie/build/gmake.windows/genie.make b/3rdparty/genie/build/gmake.windows/genie.make
index f3808bfd730..c76ba505894 100644
--- a/3rdparty/genie/build/gmake.windows/genie.make
+++ b/3rdparty/genie/build/gmake.windows/genie.make
@@ -1,4 +1,8 @@
# GNU Make project makefile autogenerated by GENie
+# https://github.com/bkaradzic/GENie
+
+.SUFFIXES:
+
ifndef config
config=release
endif
diff --git a/3rdparty/genie/docs/scripting-reference.md b/3rdparty/genie/docs/scripting-reference.md
index 35b1217e879..7f1b91e512f 100644
--- a/3rdparty/genie/docs/scripting-reference.md
+++ b/3rdparty/genie/docs/scripting-reference.md
@@ -341,6 +341,19 @@ configuration "not windows"
defines { "NOT_WINDOWS" }
```
+Define a symbol based on custom command line option
+
+```lua
+newoption {
+ trigger = "gfxapi",
+ description = "Choose a particular 3D API for rendering",
+ allowed = { { "opengl", "OpenGL Renderer" } }
+}
+
+configuration "opengl"
+ defines { "OPENGL" }
+```
+
Reset the configuration filter
```lua
@@ -349,7 +362,7 @@ configuration {}
#### Caveats
-- Argument chaining:
+- Argument chaining:
`configuration` can take multiple arguments, e.g.,
```lua
configuration {"StaticLib", "xcode*", "osx or ios*"}
@@ -357,29 +370,29 @@ configuration {}
These arguments will be combined as an `AND` clause,
i.e. if one of the keywords does _not_ match the actual configuration terms,
the following settings will not be applied.
-
-- Condition evaluation:
+
+- Condition evaluation:
The arguments are **not** evaluated as Lua. They are merely regex-matched against the configuration terms.
The implications of this are that parentheses have no effect outside of regular expression groups.
A condition like `"not (osx or ios*)"` will not be equivalent to `{"not osx", "not ios*}"`.
Furthermore, a condition like `"not osx or ios*"` will be evaluated as the negation of `"osx or ios*"`.
-
-- `and` is **not** a valid keyword for configuration combinations.
+
+- `and` is **not** a valid keyword for configuration combinations.
However, several keywords will be combined as an `AND` clause.
-
-- Limits of Lua's regular expressions:
+
+- Limits of Lua's regular expressions:
Each passed keyword is matched against each configuration terms from the project/solution type being built
using [Lua's regular expression mechanism](https://www.lua.org/manual/5.3/manual.html#6.4).
This means that keyword matching is subject to the same limits as regular Lua regex matching.
This implies that regexes like `"(osx|ios)"` do not work.
-
-- Wildcard expansion:
+
+- Wildcard expansion:
Wildcards will get expanded following the same rules as paths.
Similarly, special characters such as `()` will get escaped (i.e. converted to `%(%)`) before being matched.
This means that `"not (osx or ios*)"` will in fact get expanded to `"not %(osx or ios[^/]*)"` and then checked as
`not` _result of_ `"%(osx or ios[^/]*)"`, which in turn gets broken down to `"%(osx"` and `"ios[^/]*)"`.
-
-- `"win*"` matchings:
+
+- `"win*"` matchings:
Intuitively, the configuration keyword to match "Windows" ("Win32", "Win64" or "WinCE") configuration would be
`"win*"`. However **`"win*"` also matches "WindowedApp"**. Prefer using the term `"vs*"` to check for configurations
targeting Windows.
@@ -428,10 +441,10 @@ for rule listed commands are executed.
**Scope:** solutions, projects, configurations
#### Arguments
-*input_file* - source file that should be "compiled" with custom task
-*output_file* - generated file name
-*dependency* - additional dependencies, that can be used as parameters to commands
-*command* - command list, special functions in commands are :
+*input_file* - source file that should be "compiled" with custom task
+*output_file* - generated file name
+*dependency* - additional dependencies, that can be used as parameters to commands
+*command* - command list, special functions in commands are :
$(<) - input file
$(@) - output file
$(1) - $(9) - additional dependencies
@@ -537,7 +550,7 @@ GMAKE specific. Adds dependency between source file and any other file.
**Scope:** solutions, projects, configurations
#### Arguments
-*main_file* - name of source file that depends of other file
+*main_file* - name of source file that depends of other file
*depending_of* - name of dependency file
#### Examples
@@ -630,7 +643,16 @@ Specifies build flags to modify the compiling or linking process. Multiple calls
#### Arguments
_flags_ - List of flag names from list below. Names are case-insensitive and ignored if not supported on a platform.
+* _AntBuildDebuggable_ - Enables Visual Studio projects targetting Android to be debugged using the NVIDIA Nsight Tegra tools. ([#321](https://github.com/bkaradzic/GENie/pull/321))
* _C7DebugInfo_ - Enables C7 compatible debug info for MSVC builds.
+* _Cpp11_ - Enable usage of C++11 features.
+* _Cpp14_ - Enable usage of C++14 features.
+* _Cpp17_ - Enable usage of C++17 features.
+* _Cpp20_ - Enable usage of C++20 features.
+* _CppLatest_ - Enable usage of latest C++ features.
+* _DebugEnvsDontMerge_ - Cause Visual Studio projects to not merge debug environment with the one inherited from the parent process. (i.e. sets `Project Properties > Debugging > Merge Environment` to `false`)
+* _DebugEnvsInherit_ - Cause Visual Studio projects to inherit debug environment. (i.e. sets in `Project Properties > Debugging > Environment > Edit > Inherit from parent of project defaults` to `true`)
+* _DeploymentContent_ - Mark files with `DeploymentContent` flag in the project file. (For C++ Win Store apps) ([#139](https://github.com/bkaradzic/GENie/pull/139))
* _EnableMinimalRebuild_ - Enable Visual Studio's minimal rebuild feature.
* _EnableSSE, EnableSSE2, EnableAVX, EnableAVX2_ - Enable SSE/AVX instruction sets
* _ExtraWarnings_ - Sets compiler's max warning level.
@@ -641,7 +663,6 @@ _flags_ - List of flag names from list below. Names are case-insensitive and ign
* _GenerateMapFiles_ - Enable .map file outputs from the Visual Studio linker.
* _LinkSupportCircularDependencies_ - Enables the linker to iterate over provided libs in order to resolve circular dependencies (make and ninja only).
* _Managed_ - Enable Managed C++ (.NET).
-* _MFC_ - Enable support for Microsoft Foundation Classes.
* _MinimumWarnings_ - - Sets compiler's minimum warning level (Visual Studio only).
* _NativeWChar, NoNativeWChar_ - Toggle support for the wchar data type.
* _No64BitChecks_ - Disable 64-bit portability warnings.
@@ -651,6 +672,7 @@ _flags_ - List of flag names from list below. Names are case-insensitive and ign
* _NoFramePointer_ - Disable the generation of stack frame pointers.
* _NoImportLib_ - Prevent the generation of an import library for a Windows DLL.
* _NoIncrementalLink_ - Disable support for Visual Studio's incremental linking feature.
+* _NoJMC_ - Disable Visual Studio's 'Just my Code' feature.
* _NoManifest_ - Prevent the generation of a manifest for Windows executables and shared libraries.
* _NoMultiProcessorCompilation_ - Disables Visual Studio's and FastBuild's multiprocessor compilation.
* _NoPCH_ - Disable precompiled headers.
@@ -671,8 +693,8 @@ _flags_ - List of flag names from list below. Names are case-insensitive and ign
* _Unsafe_ - Enable the use of unsafe code in .NET applications.
* _UnsignedChar_ - Force `char`s to be `unsigned` by default.
* _UseFullPaths_ - Enable absolute paths for `__FILE__`.
-* _UseLDResponseFile_ - Enable use of response file (aka @file) for linking lib dependencies (make only).
-* _UseObjectResponseFile_ - Enable use of response file (aka @file) for linking objects (make only).
+* _UseLDResponseFile_ - Enable use of response file (aka @file) for linking lib dependencies (make and ninja).
+* _UseObjectResponseFile_ - Enable use of response file (aka @file) for linking objects (make and ninja).
* _WinMain_ - Use WinMain() as the entry point for Windows applications, rather than main().
**Note:** When not set, options will default to the tool default.
@@ -903,7 +925,7 @@ Sets the kind of binary object being created by the project, such as a console o
_kind_ - project kind identifier. One of:
* _ConsoleApp_ - console executable
-* _WindowedApp_ - application that runs in a desktop window. Does not apply on Linux.
+* _WindowedApp_ - application that runs in a window (Windows, Android, MacOS and iOS). Does not apply on Linux.
* _StaticLib_ - static library
* _SharedLib_ - shared library or DLL
* _Bundle_ - Xcode: Cocoa Bundle, everywhere else: alias to _SharedLib_
@@ -1287,8 +1309,11 @@ _identifiers_ - list of hardware platform specifiers from this list:
* _Xbox360_ - Xbox 360 compiler and linker under Visual Studio
* _PowerPC_ - PowerPC processors
* _ARM_ - ARM-based processors
+* _ARM64_ - ARM64-based processors
* _Orbis_ - Playstation 4
* _Durango_ - Xbox One
+* _NX32_ - Nintendo Switch 32-bit
+* _NX64_ - Nintendo Switch 64-bit
#### Return Value
Current list of target platforms for the active solution
@@ -1899,11 +1924,11 @@ xcodetargetopts {
---
### xcodescriptphases({{_cmd_, {_inputpaths_, ...}}})
#### XCode only
-Adds a script phase to the generated XCode project file.
+Adds a script phase to the generated XCode project file.
One tag can contain several commands with different inputpaths.
#### Arguments
-_cmd_ - The actual command to run. (This can be a shell script file or direct shell code).
+_cmd_ - The actual command to run. (This can be a shell script file or direct shell code).
_inputpaths_ - The paths passed to the command
#### Examples
@@ -1948,11 +1973,11 @@ done
---
### xcodecopyresources({{_targetpath_, {_inputfiles_, ...}}})
#### XCode only
-Adds a 'Copy Files' phase to the generated XCode project file.
+Adds a 'Copy Files' phase to the generated XCode project file.
One tag can contain several target paths with different input files.
#### Arguments
-_targetpath_ - The target path relative to the _Resource_ folder in the resulting `.app` structure.
+_targetpath_ - The target path relative to the _Resource_ folder in the resulting `.app` structure.
_inputfiles_ - The input files to be copied.
#### Examples
diff --git a/3rdparty/genie/makefile b/3rdparty/genie/makefile
index 48f6fb84122..f551fcf2268 100644
--- a/3rdparty/genie/makefile
+++ b/3rdparty/genie/makefile
@@ -54,7 +54,7 @@ release-windows release-darwin: $(GENIE)
release-linux: $(GENIE)
$(SILENT) $(GENIE) release
- $(SILENT) $(MAKE) -C build/$(PROJECT_TYPE).darwin clean all CC=x86_64-apple-darwin15-clang
+ $(SILENT) $(MAKE) -C build/$(PROJECT_TYPE).darwin clean all CC=arm64-apple-darwin24.1-clang CFLAGS="-arch arm64" LDFLAGS="-arch arm64"
$(SILENT) $(MAKE) -C build/$(PROJECT_TYPE).linux clean all
$(SILENT) $(MAKE) -C build/$(PROJECT_TYPE).windows clean all CC=x86_64-w64-mingw32-gcc
$(SILENT) git checkout src/host/version.h
diff --git a/3rdparty/genie/scripts/genie.lua b/3rdparty/genie/scripts/genie.lua
index de537253079..6d6157a8c23 100644
--- a/3rdparty/genie/scripts/genie.lua
+++ b/3rdparty/genie/scripts/genie.lua
@@ -46,7 +46,7 @@
}
buildoptions {
- "-m64",
+ "$(MPARAM)",
}
configuration "Debug"
@@ -78,7 +78,7 @@
linkoptions { "-rdynamic" }
configuration "linux"
- define { "_FILE_OFFSET_BITS=64" }
+ defines { "_FILE_OFFSET_BITS=64" }
configuration "macosx"
targetdir "../bin/darwin"
@@ -86,8 +86,8 @@
links { "CoreServices.framework" }
configuration { "macosx", "gmake" }
- buildoptions { "-mmacosx-version-min=10.6" }
- linkoptions { "-mmacosx-version-min=10.6" }
+ buildoptions { "-mmacosx-version-min=11.0" }
+ linkoptions { "-mmacosx-version-min=11.0" }
configuration {}
diff --git a/3rdparty/genie/src/_manifest.lua b/3rdparty/genie/src/_manifest.lua
index 5d4a1ba5f41..b368d944a03 100644
--- a/3rdparty/genie/src/_manifest.lua
+++ b/3rdparty/genie/src/_manifest.lua
@@ -57,6 +57,7 @@
-- Visual Studio actions
"actions/vstudio/_vstudio.lua",
"actions/vstudio/vstudio_solution.lua",
+ "actions/vstudio/vstudio_slnx.lua",
"actions/vstudio/vstudio_vcxproj.lua",
"actions/vstudio/vstudio_vcxproj_filters.lua",
"actions/vstudio/vs2010.lua",
@@ -65,7 +66,8 @@
"actions/vstudio/vs2015.lua",
"actions/vstudio/vs2017.lua",
"actions/vstudio/vs2019.lua",
- "actions/vstudio/vsllvm.lua",
+ "actions/vstudio/vs2022.lua",
+ "actions/vstudio/vs2026.lua",
-- Xcode action
"actions/xcode/_xcode.lua",
@@ -76,11 +78,9 @@
"actions/xcode/xcode8.lua",
"actions/xcode/xcode9.lua",
"actions/xcode/xcode10.lua",
-
- --FASTBuild action
- "actions/fastbuild/_fastbuild.lua",
- "actions/fastbuild/fastbuild_project.lua",
- "actions/fastbuild/fastbuild_solution.lua",
+ "actions/xcode/xcode11.lua",
+ "actions/xcode/xcode14.lua",
+ "actions/xcode/xcode15.lua",
-- ninja action
"actions/ninja/_ninja.lua",
@@ -90,9 +90,7 @@
"actions/ninja/ninja_swift.lua",
"actions/ninja/ninja_swift_incremental.lua",
- -- qbs action
- "actions/qbs/_qbs.lua",
- "actions/qbs/qbs_base.lua",
- "actions/qbs/qbs_solution.lua",
- "actions/qbs/qbs_cpp.lua",
+ -- jcdb action
+ "actions/jcdb/_jcdb.lua",
+ "actions/jcdb/jcdb_solution.lua",
}
diff --git a/3rdparty/genie/src/actions/cmake/_cmake.lua b/3rdparty/genie/src/actions/cmake/_cmake.lua
index 9620c63b2da..9011cbb27e1 100644
--- a/3rdparty/genie/src/actions/cmake/_cmake.lua
+++ b/3rdparty/genie/src/actions/cmake/_cmake.lua
@@ -5,6 +5,7 @@
--
premake.cmake = { }
+premake.cmake.cmake_minimum_version = "3.28.3"
--
-- Register the "cmake" action
@@ -21,14 +22,22 @@ newaction {
},
onsolution = function(sln)
premake.generate(sln, "CMakeLists.txt", premake.cmake.workspace)
+ premake.generate(sln, "cmake/" .. sln.name .. "/CMakeLists.txt", premake.cmake.gateway)
+ premake.generate(sln, "CMakePresets.json", premake.cmake.presets)
end,
onproject = function(prj)
- premake.generate(prj, "%%/CMakeLists.txt", premake.cmake.project)
+ local raw = prj.project or prj
+ local sln_name = raw.solution.name
+ premake.generate(prj, "cmake/" .. sln_name .. "/%%.cmake", premake.cmake.project)
end,
oncleansolution = function(sln)
premake.clean.file(sln, "CMakeLists.txt")
+ premake.clean.file(sln, "cmake/" .. sln.name .. "/CMakeLists.txt")
+ premake.clean.file(sln, "CMakePresets.json")
end,
oncleanproject = function(prj)
- premake.clean.file(prj, "%%/CMakeLists.txt")
+ local raw = prj.project or prj
+ local sln_name = raw.solution.name
+ premake.clean.file(prj, "cmake/" .. sln_name .. "/%%.cmake")
end
} \ No newline at end of file
diff --git a/3rdparty/genie/src/actions/cmake/cmake_project.lua b/3rdparty/genie/src/actions/cmake/cmake_project.lua
index e40486bfea9..a6f1296f4cd 100644
--- a/3rdparty/genie/src/actions/cmake/cmake_project.lua
+++ b/3rdparty/genie/src/actions/cmake/cmake_project.lua
@@ -8,8 +8,247 @@
local cmake = premake.cmake
local tree = premake.tree
-local includestr = 'include_directories(../%s)'
-local definestr = 'add_definitions(-D%s)'
+-- Split multi-word flags (e.g. "-Wall -Wextra") into individual items
+local function splitflags(flags)
+ local result = {}
+ for _, flag in ipairs(flags) do
+ for word in flag:gmatch("%S+") do
+ table.insert(result, word)
+ end
+ end
+ return result
+end
+
+--
+-- MSVC flag translation tables (parallel to gcc.lua tables)
+--
+
+local msvc_cflags =
+{
+ EnableSSE = "/arch:SSE",
+ EnableSSE2 = "/arch:SSE2",
+ EnableAVX = "/arch:AVX",
+ EnableAVX2 = "/arch:AVX2",
+ PedanticWarnings = "/W4",
+ ExtraWarnings = "/W4",
+ FatalWarnings = "/WX",
+ FloatFast = "/fp:fast",
+ FloatStrict = "/fp:strict",
+ Optimize = "/O2",
+ OptimizeSize = "/O1",
+ OptimizeSpeed = "/Ox",
+ Symbols = "/Zi",
+}
+
+local msvc_cxxflags =
+{
+ Cpp14 = "/std:c++14",
+ Cpp17 = "/std:c++17",
+ Cpp20 = "/std:c++20",
+ CppLatest = "/std:c++latest",
+ NoRTTI = "/GR-",
+ NoBufferSecurityCheck = "/GS-",
+}
+
+function cmake.getmsvc_cflags(cfg)
+ return table.translate(cfg.flags, msvc_cflags)
+end
+
+function cmake.getmsvc_cxxflags(cfg)
+ local result = table.translate(cfg.flags, msvc_cxxflags)
+ if cfg.flags.NoExceptions then
+ table.insert(result, "/EHs-c-")
+ end
+ -- Always enable conformance modes for MSVC
+ table.insert(result, "/Zc:__cplusplus")
+ table.insert(result, "/Zc:preprocessor")
+ return result
+end
+
+-- MSVC_VERSION ranges for version-specific CMake conditions
+local msvc_version_ranges = {
+ vs2013 = { 1800, 1900 },
+ vs2015 = { 1900, 1910 },
+ vs2017 = { 1910, 1920 },
+ vs2019 = { 1920, 1930 },
+ vs2022 = { 1930, 1940 },
+ vs2026 = { 1940, 1950 },
+}
+
+local function msvc_condition(matched_keyword)
+ local range = msvc_version_ranges[matched_keyword]
+ if range then
+ return string.format("MSVC AND MSVC_VERSION GREATER_EQUAL %d AND MSVC_VERSION LESS %d", range[1], range[2])
+ end
+ return "MSVC"
+end
+
+-- Check if a keyword matches the "vs" action pattern.
+-- Keywords are stored as Lua patterns after path.wildcards() and :lower() transformation.
+-- Accepts transformed forms of: vs*, vs20*, vs2022, vs2019
+-- Rejects transformed forms of: vs*-clang, vs*-orbis (contain %-suffix)
+local function is_vs_action_keyword(keyword)
+ -- Must start with "vs", then only digits and wildcard patterns [^/]* or .*
+ -- Must NOT contain %- (transformed from "-", indicates user-defined variant)
+ if not keyword:match("^vs") then
+ return false
+ end
+ if keyword:find("%%%-") then
+ return false
+ end
+ -- After "vs", only digits, wildcard chars [^/]*, .*, or Lua pattern escapes
+ local rest = keyword:sub(3)
+ -- Strip known wildcard patterns
+ rest = rest:gsub("%[%^/%]%*", "") -- [^/]* from single *
+ rest = rest:gsub("%.%*", "") -- .* from **
+ -- What remains should be only digits (or empty)
+ return rest:match("^%d*$") ~= nil
+end
+
+-- Extract settings from project blocks gated behind action-name keywords.
+-- These blocks don't get baked when _ACTION="cmake", so we manually scan for them.
+-- match_fn: function(keyword) -> bool, tests if a keyword matches the action family
+-- condition_fn: maps matched keyword to a CMake condition string
+-- Returns an array of { condition = "...", settings = { includedirs, defines, ... } }
+-- grouped by condition, generic conditions first.
+function cmake.getplatform_settings(prj, cfgname, match_fn, condition_fn)
+ local groups = {}
+
+ -- Get the raw project object (prj may be a baked config)
+ local rawprj = prj.project or prj
+
+ -- Scan both solution-level and project-level blocks
+ local block_sources = {}
+ if rawprj.solution and rawprj.solution.blocks then
+ table.insert(block_sources, rawprj.solution.blocks)
+ end
+ if rawprj.blocks then
+ table.insert(block_sources, rawprj.blocks)
+ end
+ for _, blocks in ipairs(block_sources) do
+ for _, blk in ipairs(blocks) do
+ local matched_alt = nil
+ local has_config_keyword = false
+ local config_ok = true
+
+ for _, kw in ipairs(blk.keywords) do
+ -- Check each alternative in "or"-separated keywords
+ for _, alt in ipairs(kw:explode(" or ")) do
+ alt = alt:match("^%s*(.-)%s*$") -- trim
+ if match_fn(alt) then
+ matched_alt = alt
+ end
+ -- Check if this keyword is a config filter
+ if cfgname and cfgname ~= "" then
+ if alt:lower() == cfgname:lower() then
+ has_config_keyword = true
+ end
+ end
+ end
+ end
+
+ -- If cfgname specified, block must either match it or not mention any known config
+ if cfgname and cfgname ~= "" then
+ local block_has_config_filter = false
+ for _, kw in ipairs(blk.keywords) do
+ for _, alt in ipairs(kw:explode(" or ")) do
+ alt = alt:match("^%s*(.-)%s*$")
+ local al = alt:lower()
+ if al == "debug" or al == "release" or al == "profile" or al == "development" then
+ block_has_config_filter = true
+ end
+ end
+ end
+ if block_has_config_filter and not has_config_keyword then
+ config_ok = false
+ end
+ end
+
+ if matched_alt and config_ok then
+ local condition = condition_fn(matched_alt)
+ if not groups[condition] then
+ groups[condition] = {
+ includedirs = {},
+ defines = {},
+ buildoptions = {},
+ linkoptions = {},
+ links = {},
+ }
+ end
+ local g = groups[condition]
+ for _, v in ipairs(blk.includedirs or {}) do
+ if path.isabsolute(v) then
+ v = path.getrelative(rawprj.location, v)
+ end
+ if not table.contains(g.includedirs, v) then
+ table.insert(g.includedirs, v)
+ end
+ end
+ for _, v in ipairs(blk.defines or {}) do
+ if not table.contains(g.defines, v) then
+ table.insert(g.defines, v)
+ end
+ end
+ for _, v in ipairs(blk.buildoptions or {}) do
+ if not table.contains(g.buildoptions, v) then
+ table.insert(g.buildoptions, v)
+ end
+ end
+ for _, v in ipairs(blk.linkoptions or {}) do
+ if not table.contains(g.linkoptions, v) then
+ table.insert(g.linkoptions, v)
+ end
+ end
+ for _, v in ipairs(blk.links or {}) do
+ if not table.contains(g.links, v) then
+ table.insert(g.links, v)
+ end
+ end
+ end
+ end
+ end
+
+ -- Convert to sorted array (generic conditions first, then specific)
+ local result = {}
+ for condition, settings in pairs(groups) do
+ table.insert(result, { condition = condition, settings = settings })
+ end
+ table.sort(result, function(a, b) return #a.condition < #b.condition end)
+ return result
+end
+
+-- Flatten grouped results into a single settings table
+local function flatten_platform_groups(groups)
+ local result = {
+ includedirs = {},
+ defines = {},
+ buildoptions = {},
+ linkoptions = {},
+ links = {},
+ }
+ for _, group in ipairs(groups) do
+ for _, v in ipairs(group.settings.includedirs) do
+ if not table.contains(result.includedirs, v) then table.insert(result.includedirs, v) end
+ end
+ for _, v in ipairs(group.settings.defines) do
+ if not table.contains(result.defines, v) then table.insert(result.defines, v) end
+ end
+ for _, v in ipairs(group.settings.buildoptions) do
+ if not table.contains(result.buildoptions, v) then table.insert(result.buildoptions, v) end
+ end
+ for _, v in ipairs(group.settings.linkoptions) do
+ if not table.contains(result.linkoptions, v) then table.insert(result.linkoptions, v) end
+ end
+ for _, v in ipairs(group.settings.links) do
+ if not table.contains(result.links, v) then table.insert(result.links, v) end
+ end
+ end
+ return result
+end
+
+function cmake.getmsvc_settings(prj, cfgname)
+ return cmake.getplatform_settings(prj, cfgname, is_vs_action_keyword, msvc_condition)
+end
local function is_excluded(prj, cfg, file)
@@ -27,12 +266,26 @@ end
function cmake.excludedFiles(prj, cfg, src)
for _, v in ipairs(src) do
if (is_excluded(prj, cfg, v)) then
- _p(1, 'list(REMOVE_ITEM source_list ../%s)', v)
+ _p(1, 'list(REMOVE_ITEM source_list ../../%s)', v)
end
end
end
+function cmake.commonExcludedFiles(prj, configurations, src)
+ for _, v in ipairs(src) do
+ local excludedCount = 0
+ for _, cfg in ipairs(configurations) do
+ if is_excluded(prj, cfg, v) then
+ excludedCount = excludedCount + 1
+ end
+ end
+ if excludedCount == #configurations then
+ _p('list(REMOVE_ITEM source_list ../../%s)', v)
+ end
+ end
+end
+
function cmake.list(value)
if #value > 0 then
return " " .. table.concat(value, " ")
@@ -41,6 +294,14 @@ function cmake.list(value)
end
end
+function cmake.listWrapped(value, prefix, postfix)
+ if #value > 0 then
+ return prefix .. table.concat(value, postfix .. prefix) .. postfix
+ else
+ return ""
+ end
+end
+
function cmake.files(prj)
local ret = {}
local tr = premake.project.buildsourcetree(prj)
@@ -53,7 +314,7 @@ function cmake.files(prj)
assert(node, "unexpected empty node")
if node.cfg then
table.insert(ret, node.cfg.name)
- _p(1, '../%s', node.cfg.name)
+ _p(1, '../../%s', node.cfg.name)
end
end,
}, true, 1)
@@ -63,7 +324,12 @@ end
function cmake.header(prj)
_p('# %s project autogenerated by GENie', premake.action.current().shortname)
- _p('cmake_minimum_required(VERSION 2.8.4)')
+ _p('# https://github.com/bkaradzic/GENie')
+ _p('cmake_minimum_required(VERSION %s)', premake.cmake.cmake_minimum_version)
+ if os.is("windows") then
+ -- Add support for CMP0091, see https://cmake.org/cmake/help/latest/policy/CMP0091.html
+ _p('cmake_policy(SET CMP0091 NEW)')
+ end
_p('')
_p('project(%s)', premake.esc(prj.name))
end
@@ -74,7 +340,7 @@ function cmake.customtasks(prj)
for _, custombuildtask in ipairs(prj.custombuildtask or {}) do
for _, buildtask in ipairs(custombuildtask or {}) do
table.insert(tasks, buildtask)
- local d = string.format("${CMAKE_CURRENT_SOURCE_DIR}/../%s", path.getdirectory(path.getrelative(prj.location, buildtask[2])))
+ local d = string.format("${CMAKE_CURRENT_SOURCE_DIR}/../../%s", path.getdirectory(path.getrelative(prj.location, buildtask[2])))
if not table.contains(dirs, d) then
table.insert(dirs, d)
_p('file(MAKE_DIRECTORY \"%s\")', d)
@@ -84,12 +350,12 @@ function cmake.customtasks(prj)
_p('')
for _, buildtask in ipairs(tasks) do
- local deps = string.format("${CMAKE_CURRENT_SOURCE_DIR}/../%s ", path.getrelative(prj.location, buildtask[1]))
- local outputs = string.format("${CMAKE_CURRENT_SOURCE_DIR}/../%s ", path.getrelative(prj.location, buildtask[2]))
+ local deps = string.format("${CMAKE_CURRENT_SOURCE_DIR}/../../%s ", path.getrelative(prj.location, buildtask[1]))
+ local outputs = string.format("${CMAKE_CURRENT_SOURCE_DIR}/../../%s ", path.getrelative(prj.location, buildtask[2]))
local msg = ""
for _, depdata in ipairs(buildtask[3] or {}) do
- deps = deps .. string.format("${CMAKE_CURRENT_SOURCE_DIR}/../%s ", path.getrelative(prj.location, depdata))
+ deps = deps .. string.format("${CMAKE_CURRENT_SOURCE_DIR}/../../%s ", path.getrelative(prj.location, depdata))
end
_p('add_custom_command(')
@@ -101,11 +367,11 @@ function cmake.customtasks(prj)
local cmd = cmdline
local num = 1
for _, depdata in ipairs(buildtask[3] or {}) do
- cmd = string.gsub(cmd, "%$%(" .. num .. "%)", string.format("${CMAKE_CURRENT_SOURCE_DIR}/../%s ", path.getrelative(prj.location, depdata)))
+ cmd = string.gsub(cmd, "%$%(" .. num .. "%)", string.format("${CMAKE_CURRENT_SOURCE_DIR}/../../%s ", path.getrelative(prj.location, depdata)))
num = num + 1
end
- cmd = string.gsub(cmd, "%$%(<%)", string.format("${CMAKE_CURRENT_SOURCE_DIR}/../%s ", path.getrelative(prj.location, buildtask[1])))
+ cmd = string.gsub(cmd, "%$%(<%)", string.format("${CMAKE_CURRENT_SOURCE_DIR}/../../%s ", path.getrelative(prj.location, buildtask[1])))
cmd = string.gsub(cmd, "%$%(@%)", outputs)
_p(1, 'COMMAND %s', cmd)
@@ -142,26 +408,25 @@ function cmake.depRules(prj)
_p('set(')
_p(1, depsname)
for _, v in pairs(deplist) do
- _p(1, '${CMAKE_CURRENT_SOURCE_DIR}/../%s', v)
+ _p(1, '${CMAKE_CURRENT_SOURCE_DIR}/../../%s', v)
end
_p(')')
_p('')
_p('set_source_files_properties(')
- _p(1, '\"${CMAKE_CURRENT_SOURCE_DIR}/../%s\"', key)
+ _p(1, '"${CMAKE_CURRENT_SOURCE_DIR}/../../%s"', key)
_p(1, 'PROPERTIES OBJECT_DEPENDS \"${%s}\"', depsname)
_p(')')
_p('')
end
end
-function cmake.commonRules(conf, str)
+function cmake.commonRules(conf, kind)
local Dupes = {}
local t2 = {}
for _, cfg in ipairs(conf) do
- local cfgd = iif(str == includestr, cfg.includedirs, cfg.defines)
+ local cfgd = iif(kind == "includes", cfg.includedirs, cfg.defines)
for _, v in ipairs(cfgd) do
if(t2[v] == #conf - 1) then
- _p(str, v)
table.insert(Dupes, v)
end
if not t2[v] then
@@ -174,12 +439,17 @@ function cmake.commonRules(conf, str)
return Dupes
end
-function cmake.cfgRules(cfg, dupes, str)
- for _, v in ipairs(cfg) do
- if (not table.icontains(dupes, v)) then
- _p(1, str, v)
- end
+function cmake.grouppath(prj)
+ if prj.group == nil then
+ return nil
+ end
+ local parts = {}
+ local grp = prj.group
+ while grp ~= nil do
+ table.insert(parts, 1, grp.name)
+ grp = grp.parent
end
+ return table.concat(parts, "/")
end
function cmake.removeCrosscompiler(platforms)
@@ -216,31 +486,15 @@ function cmake.project(prj)
end
end
- local commonIncludes = cmake.commonRules(configurations, includestr)
- local commonDefines = cmake.commonRules(configurations, definestr)
- _p('')
-
- for _, cfg in ipairs(configurations) do
- _p('if(CMAKE_BUILD_TYPE MATCHES \"%s\")', cfg.name)
-
- -- list excluded files
- cmake.excludedFiles(prj, cfg, source_files)
+ local commonIncludes = cmake.commonRules(configurations, "includes")
+ local commonDefines = cmake.commonRules(configurations, "defines")
- -- add includes directories
- cmake.cfgRules(cfg.includedirs, commonIncludes, includestr)
-
- -- add build defines
- cmake.cfgRules(cfg.defines, commonDefines, definestr)
+ _p('')
- -- set CXX flags
- _p(1, 'set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} %s\")', cmake.list(table.join(cc.getcppflags(cfg), cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))
+ -- file exclusions (unconditional for files excluded in all configs)
+ cmake.commonExcludedFiles(prj, configurations, source_files)
- -- set C flags
- _p(1, 'set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} %s\")', cmake.list(table.join(cc.getcppflags(cfg), cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))
- _p('endif()')
- _p('')
- end
-- force CPP if needed
if (prj.options.ForceCPP) then
@@ -253,21 +507,169 @@ function cmake.project(prj)
-- per-dependency build rules
cmake.depRules(prj)
+ local targetname = premake.esc(prj.name)
+
+ if (prj.kind == 'StaticLib') then
+ _p('add_library(%s STATIC ${source_list})', targetname)
+ end
+
+ if (prj.kind == 'SharedLib') then
+ _p('add_library(%s SHARED ${source_list})', targetname)
+ end
+
+ if (prj.kind == 'ConsoleApp' or prj.kind == 'WindowedApp') then
+ _p('add_executable(%s ${source_list})', targetname)
+
+ local linklibs = {}
+ for _, cfg in ipairs(configurations) do
+ for _, link in ipairs(premake.getlinks(cfg, "siblings", "object")) do
+ local lname = link.project.name
+ if not table.contains(linklibs, lname) then
+ table.insert(linklibs, lname)
+ end
+ end
+ end
+
+ -- sibling project link dependencies (compiler-agnostic)
+ if #linklibs > 0 then
+ _p('target_link_libraries(%s PRIVATE%s)', targetname, cmake.list(premake.esc(linklibs)))
+ end
+
+ -- GCC/Clang-specific link flags
+ local libdirs = cmake.listWrapped(premake.esc(premake.getlinks(configurations[1], "all", "directory")), " -L\"../../", "\"")
+ local gcc_linkflags = table.join(configurations[1].linkoptions, cc.getldflags(configurations[1]), cc.getlinkflags(configurations[1]))
+ if #libdirs > 0 or #gcc_linkflags > 0 then
+ _p('if(CMAKE_CXX_COMPILER_ID MATCHES \"GNU|Clang\")')
+ _p(1, 'target_link_libraries(%s PRIVATE%s%s)', targetname, libdirs, cmake.list(gcc_linkflags))
+ _p('endif()')
+ end
+ end
+
+ -- common includes (target-scoped)
+ for _, v in ipairs(commonIncludes) do
+ _p('target_include_directories(%s PRIVATE ../../%s)', targetname, v)
+ end
+
+ -- common defines (target-scoped)
+ for _, v in ipairs(commonDefines) do
+ _p('target_compile_definitions(%s PRIVATE %s)', targetname, v)
+ end
+
+ -- per-config GCC/Clang compiler flags (target-scoped)
for _, cfg in ipairs(configurations) do
- _p('if(CMAKE_BUILD_TYPE MATCHES \"%s\")', cfg.name)
+ local cxx_flags = splitflags(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp))
+ local c_flags = splitflags(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c))
+ if #cxx_flags > 0 then
+ _p('target_compile_options(%s PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:GNU,Clang>,$<CONFIG:%s>>:%s>)', targetname, cfg.name, table.concat(cxx_flags, ';'))
+ end
+ if #c_flags > 0 then
+ _p('target_compile_options(%s PRIVATE $<$<AND:$<COMPILE_LANGUAGE:C>,$<C_COMPILER_ID:GNU,Clang>,$<CONFIG:%s>>:%s>)', targetname, cfg.name, table.concat(c_flags, ';'))
+ end
+ end
- if (prj.kind == 'StaticLib') then
- _p(1, 'add_library(%s STATIC ${source_list})', premake.esc(cfg.buildtarget.basename))
+ -- per-config MSVC compile options (using target_compile_options for multi-config generator support)
+ for _, cfg in ipairs(configurations) do
+ local msvc_c = cmake.getmsvc_cflags(cfg)
+ local msvc_cxx = cmake.getmsvc_cxxflags(cfg)
+ -- also get MSVC-specific buildoptions from vs*-gated config blocks (flattened across versions)
+ local msvc_settings = flatten_platform_groups(cmake.getmsvc_settings(prj, cfg.name))
+ -- filter out buildoptions already covered by the flag tables
+ local all_flags = table.join(msvc_c, msvc_cxx)
+ local msvc_buildopts = {}
+ for _, v in ipairs(msvc_settings.buildoptions) do
+ if not table.contains(all_flags, v) then
+ table.insert(msvc_buildopts, v)
+ end
end
- if (prj.kind == 'SharedLib') then
- _p(1, 'add_library(%s SHARED ${source_list})', premake.esc(cfg.buildtarget.basename))
+ if #msvc_c > 0 or #msvc_cxx > 0 or #msvc_buildopts > 0 then
+ _p('target_compile_options(%s PRIVATE', targetname)
+ if #msvc_cxx > 0 then
+ _p(1, '$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:MSVC>,$<CONFIG:%s>>:%s>', cfg.name, table.concat(msvc_cxx, ';'))
+ end
+ local msvc_common = table.join(msvc_c, msvc_buildopts)
+ if #msvc_common > 0 then
+ _p(1, '$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:%s>>:%s>', cfg.name, table.concat(msvc_common, ';'))
+ end
+ _p(')')
end
- if (prj.kind == 'ConsoleApp' or prj.kind == 'WindowedApp') then
- _p(1, 'add_executable(%s ${source_list})', premake.esc(cfg.buildtarget.basename))
- _p(1, 'target_link_libraries(%s%s%s)', premake.esc(cfg.buildtarget.basename), cmake.list(premake.esc(premake.getlinks(cfg, "siblings", "basename"))), cmake.list(cc.getlinkflags(cfg)))
+ end
+
+ -- MSVC-specific includes, defines, links, and link options from vs*-gated blocks
+ -- Version-specific settings (e.g. vs2019-only) get their own MSVC_VERSION conditions
+ local msvc_groups = cmake.getmsvc_settings(prj)
+ for _, group in ipairs(msvc_groups) do
+ local s = group.settings
+ if #s.includedirs > 0 or #s.defines > 0 or #s.links > 0 or #s.buildoptions > 0 or #s.linkoptions > 0 then
+ _p('if(%s)', group.condition)
+ for _, v in ipairs(s.includedirs) do
+ _p(1, 'target_include_directories(%s PRIVATE ../../%s)', targetname, v)
+ end
+ for _, v in ipairs(s.defines) do
+ _p(1, 'target_compile_definitions(%s PRIVATE %s)', targetname, v)
+ end
+ if #s.buildoptions > 0 then
+ _p(1, 'target_compile_options(%s PRIVATE %s)', targetname, table.concat(splitflags(s.buildoptions), ';'))
+ end
+ if #s.links > 0 then
+ _p(1, 'target_link_libraries(%s PRIVATE%s)', targetname, cmake.list(s.links))
+ end
+ if #s.linkoptions > 0 then
+ _p(1, 'target_link_options(%s PRIVATE%s)', targetname, cmake.list(s.linkoptions))
+ end
+ _p('endif()')
end
- _p('endif()')
- _p('')
end
+
+ -- project group (solution folder)
+ local folder = cmake.grouppath(prj)
+ if folder then
+ _p('set_target_properties(%s PROPERTIES FOLDER "%s")', targetname, folder)
+ end
+
+ -- per-config includes and defines
+ for _, cfg in ipairs(configurations) do
+ for _, v in ipairs(cfg.includedirs) do
+ if not table.icontains(commonIncludes, v) then
+ _p('target_include_directories(%s PRIVATE $<$<CONFIG:%s>:../../%s>)', targetname, cfg.name, v)
+ end
+ end
+ for _, v in ipairs(cfg.defines) do
+ if not table.icontains(commonDefines, v) then
+ _p('target_compile_definitions(%s PRIVATE $<$<CONFIG:%s>:%s>)', targetname, cfg.name, v)
+ end
+ end
+ end
+
+ -- debugdir → VS_DEBUGGER_WORKING_DIRECTORY (for executables)
+ if prj.kind == 'ConsoleApp' or prj.kind == 'WindowedApp' then
+ local debugdirs = {}
+ for _, cfg in ipairs(configurations) do
+ if cfg.debugdir then
+ debugdirs[cfg.name] = cfg.debugdir
+ end
+ end
+ -- Check if all configs share the same debugdir
+ local common_debugdir = nil
+ local all_same = true
+ for _, dir in pairs(debugdirs) do
+ if common_debugdir == nil then
+ common_debugdir = dir
+ elseif dir ~= common_debugdir then
+ all_same = false
+ break
+ end
+ end
+ if common_debugdir then
+ if all_same then
+ _p('set_target_properties(%s PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../%s")', targetname, common_debugdir)
+ else
+ for cfgname, dir in pairs(debugdirs) do
+ _p('set_target_properties(%s PROPERTIES $<$<CONFIG:%s>:VS_DEBUGGER_WORKING_DIRECTORY> "${CMAKE_CURRENT_SOURCE_DIR}/../../%s")', targetname, cfgname, dir)
+ end
+ end
+ end
+ end
+
+ _p('')
end \ No newline at end of file
diff --git a/3rdparty/genie/src/actions/cmake/cmake_workspace.lua b/3rdparty/genie/src/actions/cmake/cmake_workspace.lua
index b948f9194e5..4c1a722a64d 100644
--- a/3rdparty/genie/src/actions/cmake/cmake_workspace.lua
+++ b/3rdparty/genie/src/actions/cmake/cmake_workspace.lua
@@ -5,23 +5,62 @@
--
function premake.cmake.workspace(sln)
- if (sln.location ~= _WORKING_DIR) then
- local name = string.format("%s/CMakeLists.txt", _WORKING_DIR)
- local f, err = io.open(name, "wb")
- if (not f) then
- error(err, 0)
- end
- f:write('# CMakeLists autogenerated by GENie\n')
- f:write('cmake_minimum_required(VERSION 2.8.4)\n')
- f:write('\n')
- f:write('add_subdirectory('.. path.getrelative(_WORKING_DIR, sln.location) ..')\n')
- f:close()
- end
_p('# CMakeLists autogenerated by GENie')
- _p('cmake_minimum_required(VERSION 2.8.4)')
- _p('')
+ _p('# https://github.com/bkaradzic/GENie')
+ _p('cmake_minimum_required(VERSION %s)', premake.cmake.cmake_minimum_version)
+ if os.is("windows") then
+ -- Add support for CMP0091, see https://cmake.org/cmake/help/latest/policy/CMP0091.html
+ _p('cmake_policy(SET CMP0091 NEW)')
+ end
+ _p('project(%s)', sln.name)
+ _p('set(CMAKE_SUPPRESS_REGENERATION true)')
+ _p('# Strip default /EHsc — each project manages exception handling explicitly')
+ _p('if(MSVC)')
+ _p(1, 'string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")')
+ _p('endif()')
+ _p('get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)')
+ _p('if(NOT _isMultiConfig AND NOT CMAKE_BUILD_TYPE)')
+ _p(1, 'message(FATAL_ERROR')
+ _p(2, '"CMAKE_BUILD_TYPE is not set."')
+ _p(2, '" Single-config generators require an explicit build type."')
+ _p(2, '" Use: cmake --preset <config> or -DCMAKE_BUILD_TYPE=<config>"')
+ _p(1, ')')
+ _p('endif()')
+ _p('set_property(GLOBAL PROPERTY USE_FOLDERS ON)')
+ _p('set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "[GENie-Generated-CMake]")')
+ _p('add_subdirectory(cmake/%s)', sln.name)
+ if sln.startproject then
+ _p('set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT %s)', premake.esc(sln.startproject))
+ end
+
+end
+
+function premake.cmake.gateway(sln)
+ _p('# Auto-generated by GENie')
+ _p('# https://github.com/bkaradzic/GENie')
for i,prj in ipairs(sln.projects) do
- local name = premake.esc(prj.name)
- _p('add_subdirectory(%s)', name)
+ _p('include(%s.cmake)', premake.esc(prj.name))
+ end
+end
+
+function premake.cmake.presets(sln)
+ _p('{')
+ _p(' "version": 3,')
+ _p(' "configurePresets": [')
+ _p(' {')
+ _p(' "name": "default",')
+ _p(' "binaryDir": "${sourceDir}/build"')
+ _p(' },')
+ for i, cfgname in ipairs(sln.configurations) do
+ local comma = i < #sln.configurations and ',' or ''
+ _p(' {')
+ _p(' "name": "%s",', cfgname:lower())
+ _p(' "binaryDir": "${sourceDir}/build",')
+ _p(' "cacheVariables": {')
+ _p(' "CMAKE_BUILD_TYPE": "%s"', cfgname)
+ _p(' }')
+ _p(' }%s', comma)
end
+ _p(' ]')
+ _p('}')
end
diff --git a/3rdparty/genie/src/actions/fastbuild/_fastbuild.lua b/3rdparty/genie/src/actions/fastbuild/_fastbuild.lua
deleted file mode 100644
index 5a422ac9db4..00000000000
--- a/3rdparty/genie/src/actions/fastbuild/_fastbuild.lua
+++ /dev/null
@@ -1,44 +0,0 @@
- premake.fastbuild = { }
- local fastbuild = premake.fastbuild
-
- newaction
- {
- trigger = "vs2015-fastbuild",
- shortname = "FASTBuild VS2015",
- description = "Generate FASTBuild configuration files for Visual Studio 2015.",
-
- valid_kinds = {
- "ConsoleApp",
- "WindowedApp",
- "StaticLib",
- "SharedLib",
- "Bundle",
- },
-
- valid_languages = {
- "C",
- "C++"
- },
-
- valid_tools = {
- cc = {
- "msc"
- },
- },
-
- onsolution = function(sln)
- premake.generate(sln, "fbuild.bff", premake.fastbuild.solution)
- end,
-
- onproject = function(prj)
- premake.generate(prj, "%%.bff", premake.fastbuild.project)
- end,
-
- oncleansolution = function(sln)
- premake.clean.file(sln, "fbuild.bff")
- end,
-
- oncleanproject = function(prj)
- premake.clean.file(prj, "%%.bff")
- end,
- }
diff --git a/3rdparty/genie/src/actions/fastbuild/fastbuild_project.lua b/3rdparty/genie/src/actions/fastbuild/fastbuild_project.lua
deleted file mode 100644
index 1043b6f0bbc..00000000000
--- a/3rdparty/genie/src/actions/fastbuild/fastbuild_project.lua
+++ /dev/null
@@ -1,468 +0,0 @@
--- Generates a FASTBuild config file for a project.
-
--- Note that table order iteration should be deterministic, so the .bff file content is not
--- arbitrarily changed each time it's generated. There are several places in this file
--- where sorts are done for that reason.
-
--- Remaining flags to handle:
--- NoImportLib = 1,
--- NoIncrementalLink = 1,
--- NoManifest = 1,
--- NoPCH = 1,
--- SingleOutputDir = 1,
--- StaticATL = 1,
--- Symbols = 1,
--- Unicode = 1,
--- Unsafe = 1,
--- WinMain = 1,
--- API todo:
--- custombuildtask
--- dependency
-
-local function add_trailing_backslash(dir)
- if dir:len() > 0 and dir:sub(-1) ~= "\\" then
- return dir.."\\"
- end
- return dir
-end
-
-local function compile(indentlevel, prj, cfg, commonbasepath)
-
- local firstflag = true
- for _, cfgexclude in ipairs(cfg.excludes) do
- if path.issourcefile(cfgexclude) then
- if firstflag then
- _p(indentlevel, '// Excluded files:')
- firstflag = false
- end
- _p(indentlevel, ".CompilerInputFiles - '%s'", cfgexclude)
- end
- end
- if not firstflag then
- _p('')
- end
-
- _p(indentlevel, ".CompilerOutputPath = '%s'", add_trailing_backslash(cfg.objectsdir))
-
- _p(indentlevel, ".Defines = ''")
- for _, define in ipairs(cfg.defines) do
- _p(indentlevel+1, "+ ' /D%s'", define)
- end
-
- if cfg.kind == 'SharedLib' then
- _p(indentlevel+1, "+ ' /D_WINDLL'")
- end
-
- _p(indentlevel, ".IncludeDirs = ''")
- local sortedincdirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systemincludedirs)
-
- -- Setup for special include dir sort to ensure that 'nearby' dirs get precedence over others.
- -- Gets the relative path from commonbasepath and counts the steps in that path.
- local function getpathnodecount(p)
- local nodefinder = string.gmatch(p, "[^\\/]+")
- local result = 0
- local node = nodefinder()
- while node do
- result = result + ((node ~= '.' and 1) or 0)
- node = nodefinder()
- end
- return result
- end
-
- local stepsfrombase = {}
-
- for _, includedir in ipairs(sortedincdirs) do
- stepsfrombase[includedir] = getpathnodecount(path.getrelative(commonbasepath, includedir))
- end
-
- local function includesort(a, b)
- if stepsfrombase[a] == stepsfrombase[b] then
- return a < b
- else
- return stepsfrombase[a] < stepsfrombase[b]
- end
- end
-
- table.sort(sortedincdirs, includesort)
- for _, includedir in ipairs(sortedincdirs) do
- _p(indentlevel+1, "+ ' /I\"%s\"'", includedir)
- end
-
- _p(indentlevel+1, "+ .MSVCIncludes")
-
- local compileroptions = {
- '"%1"',
- '/nologo',
- '/c',
- '/Gm-',
- '/Zc:inline',
- '/errorReport:prompt',
- '/FS',
- }
-
- if cfg.options.ForceCPP then
- table.insert(compileroptions, '/TP')
- end
-
- if cfg.flags.PedanticWarnings
- or cfg.flags.ExtraWarnings
- then
- table.insert(compileroptions, '/W4')
- end
-
- if (cfg.flags.NativeWChar == false or
- cfg.flags.NoNativeWChar) then
- table.insert(compileroptions, '/Zc:wchar_t-')
- end
-
- if (cfg.flags.EnableMinimalRebuild or
- cfg.flags.NoMultiProcessorCompilation) then
- -- Not compatible with FastBuild
- end
-
- if cfg.flags.FloatFast then
- table.insert(compileroptions, '/fp:fast')
- elseif cfg.flags.FloatStrict then
- table.insert(compileroptions, '/fp:strict')
- else
- table.insert(compileroptions, '/fp:precise')
- end
-
- if cfg.flags.FastCall then
- table.insert(compileroptions, '/Gr')
- elseif cfg.flags.StdCall then
- table.insert(compileroptions, '/Gd')
- end
-
- if cfg.flags.UnsignedChar then
- table.insert(compileroptions, '/J')
- end
-
- if premake.config.isdebugbuild(cfg) then
- if cfg.flags.StaticRuntime then
- table.insert(compileroptions, '/MTd')
- else
- table.insert(compileroptions, '/MDd')
- end
- else
- if cfg.flags.StaticRuntime then
- table.insert(compileroptions, '/MT')
- else
- table.insert(compileroptions, '/MD')
- end
- end
-
- if cfg.flags.Symbols then
- if (cfg.flags.C7DebugInfo) then
- table.insert(compileroptions, '/Z7')
- else
- if premake.config.iseditandcontinue(cfg) then
- table.insert(compileroptions, '/ZI')
- else
- table.insert(compileroptions, '/Zi')
- end
- local targetdir = add_trailing_backslash(cfg.buildtarget.directory)
- table.insert(compileroptions, string.format("/Fd\"%s%s.pdb\"", targetdir, cfg.buildtarget.basename))
- end
- end
-
- local isoptimised = true
- if (cfg.flags.Optimize) then
- table.insert(compileroptions, '/Ox')
- elseif (cfg.flags.OptimizeSize) then
- table.insert(compileroptions, '/O1')
- elseif (cfg.flags.OptimizeSpeed) then
- table.insert(compileroptions, '/O2')
- else
- isoptimised = false
- end
-
- if isoptimised then
- -- Refer to vstudio.vcxproj.lua about FunctionLevelLinking
- if cfg.flags.NoOptimizeLink and cfg.flags.NoEditAndContinue then
- table.insert(compileroptions, '/GF-')
- table.insert(compileroptions, '/Gy-')
- else
- table.insert(compileroptions, '/GF')
- table.insert(compileroptions, '/Gy')
- end
- else
- table.insert(compileroptions, '/Gy')
- table.insert(compileroptions, '/Od')
- table.insert(compileroptions, '/RTC1')
- end
-
- if cfg.flags.FatalWarnings then
- table.insert(compileroptions, '/WX')
- else
- table.insert(compileroptions, '/WX-')
- end
-
- if cfg.platform == 'x32' then
- if cfg.flags.EnableSSE2 then
- table.insert(compileroptions, '/arch:SSE2')
- elseif cfg.flags.EnableSSE then
- table.insert(compileroptions, '/arch:SSE')
- end
- end
-
- if cfg.flags.NoExceptions then
- else
- if cfg.flags.SEH then
- table.insert(compileroptions, '/EHa')
- else
- table.insert(compileroptions, '/EHsc')
- end
- end
-
- if cfg.flags.NoRTTI then
- table.insert(compileroptions, '/GR-')
- else
- table.insert(compileroptions, '/GR')
- end
-
- if cfg.flags.NoFramePointer then
- table.insert(compileroptions, '/Oy-')
- else
- table.insert(compileroptions, '/Oy')
- end
-
- for _, addloption in ipairs(cfg.buildoptions) do
- table.insert(compileroptions, addloption)
- end
-
- _p(indentlevel, ".CompilerOptions = ''")
- for _, option in ipairs(compileroptions) do
- _p(indentlevel+1, "+ ' %s'", option)
- end
-
- _p(indentlevel+1, "+ .IncludeDirs")
- _p(indentlevel+1, "+ .Defines")
-
- if not cfg.flags.NoPCH and cfg.pchheader then
- _p(indentlevel, ".CompilerInputFiles - '%s'", cfg.pchsource)
- _p(indentlevel, ".PCHInputFile = '%s'", cfg.pchsource)
- _p(indentlevel, ".PCHOutputFile = .CompilerOutputPath + '%s.pch'", prj.name)
- _p(indentlevel, ".CompilerOptions + ' /Fp\"' + .CompilerOutputPath + '%s.pch\"'", prj.name)
- _p(indentlevel, ".PCHOptions = .CompilerOptions")
- _p(indentlevel+1, "+ ' /Yc\"%s\"'", cfg.pchheader)
- _p(indentlevel+1, "+ ' /Fo\"%%3\"'")
- _p(indentlevel, ".CompilerOptions + ' /Yu\"%s\"'", cfg.pchheader)
- end
- _p(indentlevel+1, "+ ' /Fo\"%%2\"'") -- make sure the previous property is .CompilerOptions
-end
-
-local function library(prj, cfg, useconfig, commonbasepath)
- _p(1, "Library('%s-%s-%s')", prj.name, cfg.name, cfg.platform)
- _p(1, '{')
-
- useconfig(2)
- compile(2, prj, cfg, commonbasepath)
-
- local librarianoptions = {
- '"%1"',
- '/OUT:"%2"',
- '/NOLOGO',
- }
-
- if cfg.platform == 'x64' then
- table.insert(librarianoptions, '/MACHINE:X64')
- else
- table.insert(librarianoptions, '/MACHINE:X86')
- end
-
- _p(2, ".LibrarianOptions = ''")
- for _, option in ipairs(librarianoptions) do
- _p(3, "+ ' %s'", option)
- end
-
- _p(2, ".LibrarianOutput = '%s'", cfg.buildtarget.fullpath)
-
- _p(1, '}')
- _p('')
-end
-
-local function binary(prj, cfg, useconfig, bintype, commonbasepath)
- _p(1, "ObjectList('%s_obj-%s-%s')", prj.name, cfg.name, cfg.platform)
- _p(1, '{')
-
- useconfig(2)
- compile(2, prj, cfg, commonbasepath)
-
- _p(1, '}')
- _p('')
-
- _p(1, "%s('%s-%s-%s')", bintype, prj.name, cfg.name, cfg.platform)
- _p(1, '{')
-
- useconfig(2)
- _p(2, '.Libraries = {')
- _p(3, "'%s_obj-%s-%s',", prj.name, cfg.name, cfg.platform) -- Refer to the ObjectList
-
- local sorteddeplibs = {}
- for _, deplib in ipairs(premake.getlinks(cfg, "dependencies", "basename")) do
- table.insert(sorteddeplibs, string.format("'%s-%s-%s',", deplib, cfg.name, cfg.platform))
- end
- table.sort(sorteddeplibs)
- for _, deplib in ipairs(sorteddeplibs) do
- _p(3, deplib)
- end
- _p(3, '}')
-
- _p(2, '.LinkerLinkObjects = false')
-
- local linkeroptions = {
- '"%1"',
- '/OUT:"%2"',
- '/NOLOGO',
- '/errorReport:prompt',
- }
-
- local subsystemversion = '",5.02"'
- if cfg.platform == 'x32' then
- subsystemversion = '",5.01"'
- end
-
- if cfg.kind == 'ConsoleApp' then
- table.insert(linkeroptions, '/SUBSYSTEM:CONSOLE'..subsystemversion)
- else
- table.insert(linkeroptions, '/SUBSYSTEM:WINDOWS'..subsystemversion)
- end
-
- if cfg.kind == 'SharedLib' then
- table.insert(linkeroptions, '/DLL')
- end
-
- if cfg.platform == 'x64' then
- table.insert(linkeroptions, '/MACHINE:X64')
- else
- table.insert(linkeroptions, '/MACHINE:X86')
- end
-
- for _, libdir in ipairs(cfg.libdirs) do
- table.insert(linkeroptions, string.format('/LIBPATH:%s', path.translate(libdir, '\\')))
- end
-
- if not cfg.flags.WinMain and (cfg.kind == 'ConsoleApp' or cfg.kind == 'WindowedApp') then
- if cfg.flags.Unicode then
- table.insert(linkeroptions, '/ENTRY:wmainCRTStartup')
- else
- table.insert(linkeroptions, '/ENTRY:mainCRTStartup')
- end
- end
-
- local deffile = premake.findfile(cfg, ".def")
- if deffile then
- table.insert(linkeroptions, '/DEF:%s', deffile)
- end
-
- if (cfg.flags.Symbols ~= nil) then
- table.insert(linkeroptions, '/DEBUG')
- end
-
- if premake.config.islinkeroptimizedbuild(cfg.flags) then
- table.insert(linkeroptions, '/OPT:REF')
- table.insert(linkeroptions, '/OPT:ICF')
- end
-
- table.insert(linkeroptions, '/INCREMENTAL'..((premake.config.isincrementallink(cfg) and '') or ':NO'))
-
- for _, addloption in ipairs(cfg.linkoptions) do
- table.insert(linkeroptions, addloption)
- end
-
- local linklibs = premake.getlinks(cfg, "all", "fullpath")
-
- for _, linklib in ipairs(linklibs) do
- table.insert(linkeroptions, path.getname(linklib))
- end
-
- table.sort(linkeroptions)
-
- _p(2, ".LinkerOptions = ''")
- for _, option in ipairs(linkeroptions) do
- _p(3, "+ ' %s'", option)
- end
- _p(3, "+ .MSVCLibPaths")
-
- _p(2, ".LinkerOutput = '%s'", cfg.buildtarget.fullpath)
-
- _p(1, '}')
- _p('')
-end
-
-local function executable(prj, cfg, useconfig, commonbasepath)
- binary(prj, cfg, useconfig, 'Executable', commonbasepath)
-end
-
-local function dll(prj, cfg, useconfig, commonbasepath)
- binary(prj, cfg, useconfig, 'DLL', commonbasepath)
-end
-
-local function alias(prj, cfg, target)
- _p(1, "Alias('%s-%s-%s')", prj.name, cfg.name, cfg.platform)
- _p(1, '{')
- _p(2, ".Targets = '%s'", target)
- _p(1, '}')
- _p('')
-end
-
-function premake.fastbuild.project(prj)
- io.indent = ' '
- _p('// FASTBuild project configuration file autogenerated by GENie.')
- _p('')
-
- _p('{')
-
- local cppfiles = {}
- for file in premake.project.eachfile(prj) do
- if path.issourcefile(file.name) then
- table.insert(cppfiles, file.name)
- end
- end
-
- local commonbasepath = cppfiles[1]
- for _, file in ipairs(cppfiles) do
- commonbasepath = path.getcommonbasedir(commonbasepath..'/', file)
- end
-
- _p(1, ".CompilerInputFilesRoot = '%s/'", commonbasepath)
- _p(1, '.CompilerInputFiles = {')
- for _, file in ipairs(cppfiles) do
- _p(2, "'%s',", file)
- end
- _p(1, '}')
- _p('')
-
- local targetkindmap = {
- ConsoleApp = executable,
- WindowedApp = executable,
- SharedLib = dll,
- StaticLib = library,
- }
-
- local useconfigmap = {
- x32 = function(indentlevel)
- _p(indentlevel, 'Using(.MSVCx86Config)')
- _p('')
- end,
- x64 = function(indentlevel)
- _p(indentlevel, 'Using(.MSVCx64Config)')
- _p('')
- end,
- }
-
- local nativeplatform = (os.is64bit() and 'x64') or 'x32'
-
- for _, platform in ipairs(prj.solution.platforms) do
- for cfg in premake.eachconfig(prj, platform) do
- if cfg.platform == 'Native' then
- alias(prj, cfg, string.format('%s-%s-%s', prj.name, cfg.name, nativeplatform))
- else
- targetkindmap[prj.kind](prj, cfg, useconfigmap[cfg.platform], commonbasepath)
- end
- end
- end
- _p('}')
-
-end
diff --git a/3rdparty/genie/src/actions/fastbuild/fastbuild_solution.lua b/3rdparty/genie/src/actions/fastbuild/fastbuild_solution.lua
deleted file mode 100644
index b75b3d0dc8e..00000000000
--- a/3rdparty/genie/src/actions/fastbuild/fastbuild_solution.lua
+++ /dev/null
@@ -1,195 +0,0 @@
--- Generates a FASTBuild config file for a solution.
-
--- Note that table order iteration should be deterministic, so the .bff file content is not
--- arbitrarily changed each time it's generated. There are several places in this file
--- where sorts are done for that reason.
-
- function premake.fastbuild.solution(sln)
- -- Presuppose we are building a fastbuild config for vs2015 only.
-
- io.indent = ' '
- _p('// FastBuild solution configuration file. Generated by GENie.')
- _p('//------------------------------------------------------------------------------------')
- _p('// %s', sln.name)
- _p('//------------------------------------------------------------------------------------')
-
- _p('#import VS140COMNTOOLS')
-
- -- Create a batch file to run vcvarsall, and capture the variables it sets:
- local is64bit = os.is64bit()
- local target64 = (is64bit and ' amd64') or ' x86_amd64'
- local target32 = (is64bit and ' amd64_x86') or ''
-
- local getvcvarscontent = [[
-@set INCLUDE=
-@set LIB=
-@set CommandPromptType=
-@set PreferredToolArchitecture=
-@set Platform=
-@set Path=%SystemRoot%\System32;%SystemRoot%;%SystemRoot%\System32\wbem
-
-@call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" %1
-
-@echo %INCLUDE%
-@echo %LIB%
-@echo %CommandPromptType%
-@echo %PreferredToolArchitecture%
-@echo %Platform%
-@echo %Path%
-]]
-
- -- Save the temp file.
-
- local getvcvarsfilepath = os.getenv('TEMP')..'\\getvcvars.bat'
-
- local getvcvarsfile = assert(io.open(getvcvarsfilepath, 'w'))
- getvcvarsfile:write(getvcvarscontent)
- getvcvarsfile:close()
-
- local vcvarsrawx86 = os.outputof(string.format('call "%s"%s', getvcvarsfilepath, target32))
- local vcvarsrawx64 = os.outputof(string.format('call "%s"%s', getvcvarsfilepath, target64))
-
- os.remove(getvcvarsfilepath)
-
- local msvcvars = {}
- msvcvars.x32 = {}
- msvcvars.x64 = {}
-
- local includeslibssplitter = string.gmatch(vcvarsrawx64, "[^\n]+")
- msvcvars.x64.includesraw = includeslibssplitter()
- msvcvars.x64.libpathsraw = includeslibssplitter()
- msvcvars.x64.commandprompttype = includeslibssplitter()
- msvcvars.x64.preferredtoolarchitecture = includeslibssplitter()
- msvcvars.x64.platform = includeslibssplitter()
- msvcvars.x64.pathraw = includeslibssplitter()
-
- includeslibssplitter = string.gmatch(vcvarsrawx86, "[^\n]+")
- msvcvars.x32.includesraw = includeslibssplitter()
- msvcvars.x32.libpathsraw = includeslibssplitter()
- msvcvars.x32.commandprompttype = includeslibssplitter()
- msvcvars.x32.preferredtoolarchitecture = includeslibssplitter()
- msvcvars.x32.platform = includeslibssplitter()
- msvcvars.x32.pathraw = includeslibssplitter()
-
- local function printincludes(includesraw)
- _p(1, ".MSVCIncludes = ''")
- for i in string.gmatch(includesraw, "[^;]+") do
- _p(2, "+ ' /I\"%s\"'", i)
- end
- end
-
- local function printlibpaths(libpathsraw)
- _p(1, ".MSVCLibPaths = ''")
- for i in string.gmatch(libpathsraw, "[^;]+") do
- _p(2, "+ ' /LIBPATH:\"%s\"'", i)
- end
- end
-
- if is64bit then
- _p('.MSVCx64Config =')
- _p('[')
- _p(1, ".Compiler = '$VS140COMNTOOLS$..\\..\\VC\\bin\\amd64\\cl.exe'")
- _p(1, ".Librarian = '$VS140COMNTOOLS$..\\..\\VC\\bin\\amd64\\lib.exe'")
- _p(1, ".Linker = '$VS140COMNTOOLS$..\\..\\VC\\bin\\amd64\\link.exe'")
- printincludes(msvcvars.x64.includesraw)
- printlibpaths(msvcvars.x64.libpathsraw)
- _p(']')
- _p('')
-
- _p('.MSVCx86Config =')
- _p('[')
- _p(1, ".Compiler = '$VS140COMNTOOLS$..\\..\\VC\\bin\\amd64_x86\\cl.exe'")
- _p(1, ".Librarian = '$VS140COMNTOOLS$..\\..\\VC\\bin\\amd64_x86\\lib.exe'")
- _p(1, ".Linker = '$VS140COMNTOOLS$..\\..\\VC\\bin\\amd64_x86\\link.exe'")
- printincludes(msvcvars.x32.includesraw)
- printlibpaths(msvcvars.x32.libpathsraw)
- _p(']')
- _p('')
- else
- _p('.MSVCx64Config =')
- _p('[')
- _p(1, ".Compiler = '$VS140COMNTOOLS$..\\..\\VC\\bin\\x86_amd64\\cl.exe'")
- _p(1, ".Librarian = '$VS140COMNTOOLS$..\\..\\VC\\bin\\x86_amd64\\lib.exe'")
- _p(1, ".Linker = '$VS140COMNTOOLS$..\\..\\VC\\bin\\x86_amd64\\link.exe'")
- printincludes(msvcvars.x64.includesraw)
- printlibpaths(msvcvars.x64.libpathsraw)
- _p(']')
- _p('')
-
- _p('.MSVCx86Config =')
- _p('[')
- _p(1, ".Compiler = '$VS140COMNTOOLS$..\\..\\VC\\bin\\cl.exe'")
- _p(1, ".Librarian = '$VS140COMNTOOLS$..\\..\\VC\\bin\\lib.exe'")
- _p(1, ".Linker = '$VS140COMNTOOLS$..\\..\\VC\\bin\\link.exe'")
- printincludes(msvcvars.x32.includesraw)
- printlibpaths(msvcvars.x32.libpathsraw)
- _p(']')
- _p('')
- end
-
- local msvcbin = '$VS140COMNTOOLS$..\\..\\VC\\bin' .. ((is64bit and '\\amd64') or '')
- _p('#import Path')
- _p('#import TMP')
- _p('#import SystemRoot')
- _p('')
- _p('Settings')
- _p('{')
- _p(1, '.Environment = {')
- _p(2, "'Path=%s;$Path$',", msvcbin)
- _p(2, "'TMP=$TMP$',")
- _p(2, "'SystemRoot=$SystemRoot$',")
- _p(2, '}')
- _p('}')
- _p('')
-
- local function projkindsort(a, b)
- local projvaluemap = {
- ConsoleApp = 3,
- WindowedApp = 3,
- SharedLib = 2,
- StaticLib = 1,
- }
-
- if projvaluemap[a.kind] == projvaluemap[b.kind] then
- return a.name < b.name
- else
- return projvaluemap[a.kind] < projvaluemap[b.kind]
- end
- end
-
- local sortedprojs = {}
- for prj in premake.solution.eachproject(sln) do
- table.insert(sortedprojs, prj)
- end
-
- table.sort(sortedprojs, projkindsort)
-
- for _, prj in ipairs(sortedprojs) do
- local fname = premake.project.getbasename(prj.name, '%%.bff')
- fname = path.join(prj.location, fname)
- fname = path.getrelative(sln.location, fname)
- _p('#include "%s"', fname)
- end
- _p('')
-
- _p('.ProjectVariants = {')
- for _, plat in ipairs(sln.platforms) do
- for _, cfg in ipairs(sln.configurations) do
- _p(1, "'%s-%s',", cfg, plat)
- end
- end
- _p('}')
- _p('')
-
- _p('ForEach(.Variant in .ProjectVariants)')
- _p('{')
- _p(1, "Alias('all-$Variant$')")
- _p(1, '{')
- _p(2, '.Targets = {')
- for _, prj in ipairs(sortedprojs) do
- _p(3, "'%s-$Variant$',", prj.name)
- end
- _p(2, '}')
- _p(1, '}')
- _p('}')
- end
diff --git a/3rdparty/genie/src/actions/jcdb/_jcdb.lua b/3rdparty/genie/src/actions/jcdb/_jcdb.lua
new file mode 100644
index 00000000000..14a9eadbbc8
--- /dev/null
+++ b/3rdparty/genie/src/actions/jcdb/_jcdb.lua
@@ -0,0 +1,21 @@
+--
+-- _jcdb.lua
+-- Define the compile_commands.json action(s).
+-- Copyright (c) 2020 Johan Skoeld
+--
+
+newaction {
+ trigger = "jcdb",
+ shortname = "compile_commands.json",
+ description = "Generate a compile_commands.json file.",
+
+ valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
+ valid_languages = { "C", "C++" },
+ valid_tools = { cc = { "gcc" } },
+
+ onsolution = function(sln)
+ local jsonpath = path.join(sln.location, "compile_commands.json")
+ premake.generate(sln, jsonpath, premake.jcdb.generate)
+ end,
+}
+
diff --git a/3rdparty/genie/src/actions/jcdb/jcdb_solution.lua b/3rdparty/genie/src/actions/jcdb/jcdb_solution.lua
new file mode 100644
index 00000000000..581dbd77f04
--- /dev/null
+++ b/3rdparty/genie/src/actions/jcdb/jcdb_solution.lua
@@ -0,0 +1,153 @@
+--
+-- jcdb_solution.lua
+-- compile_commands.json functions.
+-- Copyright (c) 2020 Johan Skoeld
+--
+
+premake.jcdb = {}
+
+local premake = premake
+local jcdb = premake.jcdb
+
+local encode_chars = {
+ [0x22] = '\\"',
+ [0x5c] = "\\\\",
+ [0x08] = "\\b",
+ [0x0c] = "\\f",
+ [0x0a] = "\\n",
+ [0x0d] = "\\r",
+ [0x09] = "\\t",
+}
+
+local function encode_string(s)
+ local res = '"'
+
+ for _, cp in utf8.codes(s) do
+ if encode_chars[cp] then
+ res = res..encode_chars[cp]
+ elseif cp < 32 then
+ res = res..string.format("\\u%04x", cp)
+ else
+ res = res..utf8.char(cp)
+ end
+ end
+
+ return res..'"'
+end
+
+local function escape_cmdline_arg(s)
+ if s:find("%s") then
+ s = s:gsub("\\", "\\\\")
+ s = s:gsub('"', '\\"')
+ s = '"'..s..'"'
+ end
+
+ return s
+end
+
+local function list(tbl)
+ return iif(#tbl > 0, " "..table.concat(tbl, " "), "")
+end
+
+local function build_command(cfg, cc, file)
+ local cmdline = ""
+ local function app(s) cmdline = cmdline..s end
+
+ -- Compiler
+ if path.iscfile(file) or path.isasmfile(file) then
+ app(cc.cc)
+ else
+ app(cc.cxx)
+ end
+
+ -- Flags / Defines / Includes
+ app(list(cc.getcppflags(cfg)))
+ app(list(cc.getdefines(cfg.defines)))
+ app(list(cc.getincludedirs(cfg.includedirs)))
+ app(list(cc.getquoteincludedirs(cfg.userincludedirs)))
+ app(list(cc.getsystemincludedirs(cfg.systemincludedirs)))
+
+ -- Custom build options
+ app(list(cc.getcflags(cfg)))
+
+ if path.iscppfile(file) then
+ app(list(cc.getcxxflags(cfg)))
+ end
+
+ if path.isasmfile(file) then
+ app(list(cfg.buildoptions))
+ app(list(cfg.buildoptions_asm))
+ elseif path.isobjcfile(file) then
+ local opts = iif(path.iscfile(file), cfg.buildoptions_objc, cfg.buildoptions_objcpp)
+ app(list(cc.getobjcflags(cfg)))
+ app(list(cfg.buildoptions))
+ app(list(opts))
+ elseif path.iscfile(file) then
+ app(list(cfg.buildoptions))
+ app(list(cfg.buildoptions_c))
+ else
+ app(list(cfg.buildoptions))
+ app(list(cfg.buildoptions_cpp))
+ end
+
+ -- Forced includes
+ if cfg.pchheader and not cfg.flags.NoPCH then
+ -- No need to worry about gch files or anything. Using the pch directly
+ -- should have the same behavior for our purposes.
+ app(" -include ")
+ app(escape_cmdline_arg(cfg.pchheader))
+ end
+
+ for _, i in ipairs(cfg.forcedincludes) do
+ app(" -include ")
+ app(escape_cmdline_arg(i))
+ end
+
+ -- Input / Output
+ local base = path.trimdots(path.removeext(file))..".o"
+ local output = path.join(cfg.objectsdir, base)
+ app(" -o ")
+ app(escape_cmdline_arg(output))
+ app(" -c ")
+ app(escape_cmdline_arg(file))
+
+ return cmdline
+end
+
+function jcdb.generate_config(prj, cfg, cc)
+ table.sort(cfg.files)
+
+ local directory = path.getabsolute(prj.location)
+
+ for _, file in ipairs(cfg.files) do
+ if path.iscppfile(file) or path.isasmfile(file) then
+ _p(' { "directory": %s,', encode_string(directory))
+ _p(' "command": %s,', encode_string(build_command(cfg, cc, file)))
+ _p(' "file": %s },', encode_string(file))
+ end
+ end
+end
+
+function jcdb.generate_project(prj)
+ local cc = premake.gettool(prj)
+ local platforms = premake.filterplatforms(prj.solution, cc.platforms, "Native")
+
+ for _, platform in ipairs(platforms) do
+ for cfg in premake.eachconfig(prj, platform) do
+ jcdb.generate_config(prj, cfg, cc)
+ end
+ end
+end
+
+function jcdb.generate(sln)
+ for _, prj in ipairs(sln.projects) do
+ jcdb.generate_project(prj)
+ end
+
+ -- Remove the last comma as JSON doesn't permit trailing commas
+ io.captured = io.captured:gsub(",%s$", "")
+
+ -- Wrap in brackets
+ io.captured = "["..io.eol..io.captured..io.eol.."]"
+end
+
diff --git a/3rdparty/genie/src/actions/make/_make.lua b/3rdparty/genie/src/actions/make/_make.lua
index 63741e982cb..0f1a4b60519 100644
--- a/3rdparty/genie/src/actions/make/_make.lua
+++ b/3rdparty/genie/src/actions/make/_make.lua
@@ -47,10 +47,9 @@
return result
else
-- handle simple replacements
- --result = value:gsub(" ", "\\ ")
- --result = result:gsub("\"", "\\\"")
- --return result
- return value
+ result = value:gsub(" ", "\\ ")
+ result = result:gsub("\"", "\\\"")
+ return result
end
end
diff --git a/3rdparty/genie/src/actions/make/make_cpp.lua b/3rdparty/genie/src/actions/make/make_cpp.lua
index 880d9d35bf2..1882d93c231 100644
--- a/3rdparty/genie/src/actions/make/make_cpp.lua
+++ b/3rdparty/genie/src/actions/make/make_cpp.lua
@@ -214,6 +214,11 @@
function premake.gmake_cpp_header(prj, cc, platforms)
_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# https://github.com/bkaradzic/GENie')
+ _p('')
+
+ _p('.SUFFIXES:') -- Delete the default suffix rules.
+ _p('')
-- set up the environment
_p('ifndef config')
diff --git a/3rdparty/genie/src/actions/make/make_csharp.lua b/3rdparty/genie/src/actions/make/make_csharp.lua
index ea6a0fcf410..68535272d50 100644
--- a/3rdparty/genie/src/actions/make/make_csharp.lua
+++ b/3rdparty/genie/src/actions/make/make_csharp.lua
@@ -84,6 +84,10 @@
-- set up the environment
_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# https://github.com/bkaradzic/GENie')
+ _p('')
+
+ _p('.SUFFIXES:') -- Delete the default suffix rules.
_p('')
_p('ifndef config')
diff --git a/3rdparty/genie/src/actions/make/make_solution.lua b/3rdparty/genie/src/actions/make/make_solution.lua
index 40339fb37db..d00ee6fbc1f 100644
--- a/3rdparty/genie/src/actions/make/make_solution.lua
+++ b/3rdparty/genie/src/actions/make/make_solution.lua
@@ -13,6 +13,7 @@
-- write a header showing the build options
_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# https://github.com/bkaradzic/GENie')
_p('# Type "make help" for usage help')
_p('')
diff --git a/3rdparty/genie/src/actions/make/make_swift.lua b/3rdparty/genie/src/actions/make/make_swift.lua
index 3302c623b1c..c1dd4ec6ca9 100644
--- a/3rdparty/genie/src/actions/make/make_swift.lua
+++ b/3rdparty/genie/src/actions/make/make_swift.lua
@@ -13,8 +13,13 @@ function premake.make_swift(prj)
local platforms = premake.filterplatforms(prj.solution, tool.platforms, "Native")
_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# https://github.com/bkaradzic/GENie')
+ _p('')
+
+ _p('.SUFFIXES:') -- Delete the default suffix rules.
+ _p('')
--- set up the environment
+ -- set up the environment
_p('ifndef config')
_p(1, 'config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))
_p('endif')
@@ -61,7 +66,7 @@ function premake.make_swift(prj)
swift.generate_config(prj, cfg, tool)
end
end
-
+
_p('.PHONY: ')
_p('')
_p('all: $(WORK_DIRS) $(TARGET)')
@@ -78,7 +83,7 @@ function premake.make_swift(prj)
end
end
_p('')
-
+
local objfiles = {}
_p('OBJECTS_WITNESS := $(OBJDIR)/build.stamp')
_p('OBJECTS := \\')
@@ -90,7 +95,7 @@ function premake.make_swift(prj)
end
end
_p('')
-
+
swift.file_rules(prj, objfiles)
swift.linker(prj, tool)
swift.generate_clean(prj)
@@ -109,7 +114,7 @@ function swift.file_rules(prj, objfiles)
_p(1, "$(SILENT) $(SWIFTC) -frontend -c $(SOURCES) -enable-objc-interop $(SDK) -I $(OUT_DIR) $(SWIFTC_FLAGS) -module-cache-path $(MODULECACHE_DIR) -D SWIFT_PACKAGE $(MODULE_MAPS) -emit-module-doc-path $(OUT_DIR)/$(MODULE_NAME).swiftdoc -module-name $(MODULE_NAME) -emit-module-path $(OUT_DIR)/$(MODULE_NAME).swiftmodule -num-threads 8 %s", table.arglist("-o", objfiles))
_p(1, "@mv -f $(OBJDIR)/data.tmp $(OBJECTS_WITNESS)")
_p('')
-
+
-- posix only for now
_p('$(OBJECTS): $(OBJECTS_WITNESS)')
_p(1, '@if test -f $@; then :; else \\')
@@ -120,7 +125,7 @@ function swift.file_rules(prj, objfiles)
end
function swift.linker(prj, tool)
- local lddeps = make.list(premake.getlinks(prj, "siblings", "fullpath"))
+ local lddeps = make.list(premake.getlinks(prj, "siblings", "fullpath"))
if prj.kind == "StaticLib" then
_p("$(TARGET): $(OBJECTS) %s ", lddeps)
@@ -188,4 +193,4 @@ function swift.generate_config(prj, cfg, tool)
_p('endif')
_p('')
-end \ No newline at end of file
+end
diff --git a/3rdparty/genie/src/actions/make/make_vala.lua b/3rdparty/genie/src/actions/make/make_vala.lua
index a7a88c6ddac..511d1229799 100644
--- a/3rdparty/genie/src/actions/make/make_vala.lua
+++ b/3rdparty/genie/src/actions/make/make_vala.lua
@@ -3,6 +3,10 @@
-- Generate a Vala project makefile.
--
+ premake.make.vala = { }
+ premake.make.makefile_ignore = false
+
+ local vala = premake.make.vala
local make = premake.make
function premake.make_vala(prj)
@@ -13,46 +17,8 @@
-- build a list of supported target platforms that also includes a generic build
local platforms = premake.filterplatforms(prj.solution, valac.platforms, "Native")
- _p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)
-
- -- set up the environment
- _p('ifndef config')
- _p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))
- _p('endif')
- _p('')
-
- _p('ifndef verbose')
- _p(' SILENT = @')
- _p('endif')
- _p('')
-
- -- identify the shell type
- _p('SHELLTYPE := msdos')
- _p('ifeq (,$(ComSpec)$(COMSPEC))')
- _p(' SHELLTYPE := posix')
- _p('endif')
- _p('ifeq (/bin,$(findstring /bin,$(SHELL)))')
- _p(' SHELLTYPE := posix')
- _p('endif')
- _p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')
- _p(' SHELLTYPE := posix')
- _p('endif')
- _p('')
-
- _p('ifeq (posix,$(SHELLTYPE))')
- _p(' MKDIR = $(SILENT) mkdir -p "$(1)"')
- _p(' COPY = $(SILENT) cp -fR "$(1)" "$(2)"')
- _p(' RM = $(SILENT) rm -f "$(1)"')
- _p('else')
- _p(' MKDIR = $(SILENT) mkdir "$(subst /,\\\\,$(1))" 2> nul || exit 0')
- _p(' COPY = $(SILENT) copy /Y "$(subst /,\\\\,$(1))" "$(subst /,\\\\,$(2))"')
- _p(' RM = $(SILENT) del /F "$(subst /,\\\\,$(1))" 2> nul || exit 0')
- _p('endif')
- _p('')
-
- _p('VALAC = %s', valac.valac)
- _p('CC = %s', valac.cc)
- _p('')
+ -- output build configurations
+ premake.gmake_vala_header(prj, valac, platforms)
-- write configuration blocks
for _, platform in ipairs(platforms) do
@@ -61,30 +27,38 @@
end
end
- -- list sources
- _p('SOURCES := \\')
- for _, file in ipairs(prj.files) do
- if path.issourcefile(file) then
- -- check if file is excluded.
- if not table.icontains(prj.excludes, file) then
- -- if not excluded, add it.
- _p('\t%s \\', _MAKE.esc(file))
- end
+ -- list object directories
+ local objdirs = {}
+ local additionalobjdirs = {}
+ for _, file in ipairs(prj.allfiles) do
+ if path.issourcefile(file) or path.isgresource(file) then
+ objdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1
end
end
+
+ _p('OBJDIRS := \\')
+ _p('\t$(OBJDIR) \\')
+ for dir, _ in iter.sortByKeys(objdirs) do
+ _p('\t$(OBJDIR)/%s \\', dir)
+ end
+ for dir, _ in iter.sortByKeys(additionalobjdirs) do
+ _p('\t%s \\', dir)
+ end
_p('')
-- main build rule(s)
_p('.PHONY: clean prebuild prelink')
_p('')
- _p('all: prebuild prelink $(TARGET) | $(TARGETDIR)')
+ _p('all: $(OBJDIRS) $(TARGETDIR) prebuild prelink $(TARGET)')
_p('\t@:')
_p('')
-- target build rule
- _p('$(TARGET): $(SOURCES) | $(TARGETDIR)')
- _p('\t$(SILENT) $(VALAC) -o $(TARGET) --cc=$(CC) $(FLAGS) $(SOURCES)')
+ _p('$(TARGET): $(OBJECTS) | $(TARGETDIR)')
+ _p('\t@echo Linking %s', prj.name)
+ _p('\t$(SILENT) $(LINKCMD)')
+
_p('\t$(POSTBUILDCMDS)')
_p('')
@@ -93,6 +67,13 @@
_p('$(TARGETDIR):')
premake.make_mkdirrule("$(TARGETDIR)")
+ _p('$(OBJDIRS):')
+ if (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, "SkipCreatingMessage")) then
+ _p('\t@echo Creating $(@)')
+ end
+ _p('\t-$(call MKDIR,$@)')
+ _p('')
+
-- clean target
_p('clean:')
if (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, "SkipCleaningMessage")) then
@@ -113,6 +94,68 @@
_p('prelink:')
_p('\t$(PRELINKCMDS)')
_p('')
+
+ vala.fileRules(prj, valac)
+ end
+
+
+
+--
+-- Write the makefile header
+--
+
+ function premake.gmake_vala_header(prj, valac, platforms)
+ _p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# https://github.com/bkaradzic/GENie')
+ _p('')
+
+ _p('.SUFFIXES:') -- Delete the default suffix rules.
+ _p('')
+
+ -- set up the environment
+ _p('ifndef config')
+ _p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))
+ _p('endif')
+ _p('')
+
+ _p('ifndef verbose')
+ _p(' SILENT = @')
+ _p('endif')
+ _p('')
+
+ -- identify the shell type
+ _p('SHELLTYPE := msdos')
+ _p('ifeq (,$(ComSpec)$(COMSPEC))')
+ _p(' SHELLTYPE := posix')
+ _p('endif')
+ _p('ifeq (/bin,$(findstring /bin,$(SHELL)))')
+ _p(' SHELLTYPE := posix')
+ _p('endif')
+ _p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')
+ _p(' SHELLTYPE := posix')
+ _p('endif')
+ _p('')
+
+ _p('ifeq (posix,$(SHELLTYPE))')
+ _p(' MKDIR = $(SILENT) mkdir -p "$(1)"')
+ _p(' COPY = $(SILENT) cp -fR "$(1)" "$(2)"')
+ _p(' RM = $(SILENT) rm -f "$(1)"')
+ _p('else')
+ _p(' MKDIR = $(SILENT) mkdir "$(subst /,\\\\,$(1))" 2> nul || exit 0')
+ _p(' COPY = $(SILENT) copy /Y "$(subst /,\\\\,$(1))" "$(subst /,\\\\,$(2))"')
+ _p(' RM = $(SILENT) del /F "$(subst /,\\\\,$(1))" 2> nul || exit 0')
+ _p('endif')
+ _p('')
+
+ _p('VALAC = %s', valac.valac)
+ _p('CC = %s', valac.cc)
+ _p('GLIBRC = %s', valac.glibrc)
+ _p('')
+
+ if (not premake.make.makefile_ignore) then
+ _p('MAKEFILE = %s', _MAKE.getmakefilename(prj, true))
+ _p('')
+ end
end
@@ -121,16 +164,71 @@
-- Write a block of configuration settings.
--
+ local function is_excluded(prj, cfg, file)
+ if table.icontains(prj.excludes, file) then
+ return true
+ end
+
+ if table.icontains(cfg.excludes, file) then
+ return true
+ end
+
+ return false
+ end
+
function premake.gmake_valac_config(prj, cfg, valac)
_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))
- _p(' TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))
- _p(' TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))
+ _p(' BASEDIR = %s', _MAKE.esc(path.getrelative(cfg.location, _WORKING_DIR)))
+ _p(' OBJDIR = %s', _MAKE.esc(cfg.objectsdir))
+ _p(' TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))
+ _p(' TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))
_p(' DEFINES +=%s', make.list(valac.getdefines(cfg.defines)))
_p(' VAPIDIRS +=%s', make.list(valac.getvapidirs(cfg.vapidirs)))
_p(' PKGS +=%s', make.list(valac.getlinks(cfg.links)))
- _p(' FLAGS += $(DEFINES) $(VAPIDIRS) $(PKGS)%s', make.list(table.join(valac.getvalaflags(cfg), valac.getbuildoptions(cfg.buildoptions), valac.getbuildoptions(cfg.buildoptions_c), cfg.buildoptions_vala)))
+ _p(' FLAGS += $(DEFINES) $(VAPIDIRS) $(PKGS)%s', make.list(table.join(valac.getvalaflags(cfg), cfg.buildoptions_vala)))
+ _p(' VALA_LDFLAGS= $(shell pkg-config --libs%s)', make.list(cfg.links))
+ _p(' ALL_LDFLAGS+= $(LDFLAGS)%s $(VALA_LDFLAGS)', make.list(table.join(cfg.linkoptions)))
+ _p(' LINKOBJS = %s', "$(OBJECTS)")
+ _p(' VALA_CFLAGS = $(shell pkg-config --cflags%s)%s', make.list(cfg.links), make.list(valac.getvalaccflags(cfg)))
+ _p(' ALL_CFLAGS += $(CFLAGS) $(ARCH)%s $(VALA_CFLAGS)', make.list(table.join(cfg.buildoptions, cfg.buildoptions_c)))
+ _p(' LINKCMD = $(CC) -o $(TARGET) $(LINKOBJS) $(ARCH) $(ALL_LDFLAGS)');
+
+ table.sort(cfg.files)
+
+ -- add objects for compilation, and remove any that are excluded per config.
+ _p(' OBJECTS := \\')
+ for _, file in ipairs(cfg.files) do
+ if path.issourcefile(file) or path.isgresource(file) then
+ if not is_excluded(prj, cfg, file) then
+ _p('\t$(OBJDIR)/%s.o \\'
+ , _MAKE.esc(path.trimdots(path.removeext(file)))
+ )
+ end
+ end
+ end
+ _p('')
+
+ _p(' SOURCES := \\')
+ for _, file in ipairs(cfg.files) do
+ if path.issourcefile(file) and path.isvalafile(file) then
+ if not is_excluded(prj, cfg, file) then
+ _p('\t%s \\', _MAKE.esc(file))
+ end
+ end
+ end
+ _p('')
+
+ _p(' GRESOURCES := \\')
+ for _, file in ipairs(cfg.files) do
+ if path.isgresource(file) then
+ if not is_excluded(prj, cfg, file) then
+ _p('\t%s \\', _MAKE.esc(file))
+ end
+ end
+ end
+ _p('')
_p(' define PREBUILDCMDS')
if #cfg.prebuildcommands > 0 then
@@ -156,3 +254,109 @@
_p('endif')
_p('')
end
+
+
+
+--
+-- Build command for a single file.
+--
+
+ function vala.fileRules(prj, cc)
+ local platforms = premake.filterplatforms(prj.solution, cc.platforms, "Native")
+
+ _p('ifneq (,$(OBJRESP))')
+ _p('$(OBJRESP): $(OBJECTS) | $(TARGETDIR) $(OBJDIRS)')
+ _p('\t$(SILENT) echo $^')
+ _p('\t$(SILENT) echo $^ > $@')
+ _p('endif')
+ _p('')
+
+ _p('ifneq (,$(LDRESP))')
+ _p('$(LDRESP): $(LDDEPS) | $(TARGETDIR) $(OBJDIRS)')
+ _p('\t$(SILENT) echo $^')
+ _p('\t$(SILENT) echo $^ > $@')
+ _p('endif')
+ _p('')
+
+ local pattern_targets = ""
+ table.sort(prj.allfiles)
+ for _, file in ipairs(prj.allfiles or {}) do
+ if path.issourcefile(file) or path.isgresource(file) then
+ if path.isvalafile(file) or path.iscfile(file) or path.isgresource(file) then
+ if path.isvalafile(file) or path.isgresource(file) then
+ _p('$(OBJDIR)/%s.o: $(OBJDIR)/%s.c $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'
+ , _MAKE.esc(path.trimdots(path.removeext(file)))
+ , _MAKE.esc(path.trimdots(path.removeext(file)))
+ , _MAKE.esc(path.getdirectory(path.trimdots(file)))
+ )
+ if not path.isgresource(file) then
+ pattern_targets = pattern_targets
+ .. "$(OBJDIR)/"
+ .. _MAKE.esc(path.trimdots(path.removeext(file)))
+ .. ".% \\\n" -- Pattern rule: https://stackoverflow.com/a/3077254
+ end
+ else
+ _p('$(OBJDIR)/%s.o: %s $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'
+ , _MAKE.esc(path.trimdots(path.removeext(file)))
+ , file
+ , _MAKE.esc(path.getdirectory(path.trimdots(file)))
+ )
+ end
+ if prj.msgcompile then
+ _p('\t@echo ' .. prj.msgcompile)
+ else
+ _p('\t@echo $(notdir $<)')
+ end
+ _p('\t$(SILENT) %s $(FORCE_INCLUDE) -o "$@" -c "$<"'
+ , "$(CC) $(ALL_CFLAGS)"
+ , _MAKE.esc(path.getbasename(file))
+ )
+ for _, task in ipairs(prj.postcompiletasks or {}) do
+ _p('\t$(SILENT) %s', task)
+ _p('')
+ end
+ _p('')
+
+ if path.isgresource(file) then
+ _p('$(OBJDIR)/%s.c: %s $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'
+ , _MAKE.esc(path.trimdots(path.removeext(file)))
+ , _MAKE.esc(file)
+ , _MAKE.esc(path.getdirectory(path.trimdots(file)))
+ )
+ if prj.msgcompile then
+ _p('\t@echo ' .. prj.msgcompile)
+ else
+ _p('\t@echo $(notdir $<)')
+ end
+ _p('\t$(SILENT) %s "$<" --target="$@" --sourcedir="%s" --generate'
+ , "$(GLIBRC)"
+ , _MAKE.esc(path.getdirectory(file))
+ )
+ for _, task in ipairs(prj.postcompiletasks or {}) do
+ _p('\t$(SILENT) %s', task)
+ _p('')
+ end
+ end
+
+ _p('')
+ end
+ end
+ end
+
+ if pattern_targets ~= "" then
+ -- Generate .c from corresponding .vala
+ _p('%s: $(SOURCES) $(GRESOURCES) $(GCH) $(MAKEFILE)', pattern_targets)
+ if prj.msgcompile then
+ _p('\t@echo ' .. prj.msgcompile)
+ else
+ _p('\t@echo [GEN] valac')
+ end
+ _p('\t$(SILENT) %s $(SOURCES) --directory $(OBJDIR) --basedir $(BASEDIR) --gresources=$(GRESOURCES) -C'
+ , "$(VALAC) $(FLAGS)"
+ )
+ for _, task in ipairs(prj.postcompiletasks or {}) do
+ _p('\t$(SILENT) %s', task)
+ _p('')
+ end
+ end
+ end
diff --git a/3rdparty/genie/src/actions/ninja/ninja_cpp.lua b/3rdparty/genie/src/actions/ninja/ninja_cpp.lua
index 5db216fb453..a0134f34e54 100644
--- a/3rdparty/genie/src/actions/ninja/ninja_cpp.lua
+++ b/3rdparty/genie/src/actions/ninja/ninja_cpp.lua
@@ -53,7 +53,6 @@ end
}
_p("")
-
_p("# core rules for " .. cfg.name)
_p("rule cc")
_p(" command = " .. wrap_ninja_cmd(tool.cc .. " $defines $includes $flags -MMD -MF $out.d -c -o $out $in"))
@@ -67,12 +66,20 @@ end
_p(" depfile = $out.d")
_p(" deps = gcc")
_p("")
- _p("rule ar")
- _p(" command = " .. wrap_ninja_cmd(tool.ar .. " $flags $out @$out.rsp " .. (os.is("MacOSX") and " 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'" or "")))
- _p(" description = ar $out")
- _p(" rspfile = $out.rsp")
- _p(" rspfile_content = $in $libs")
- _p("")
+
+ if cfg.flags.UseObjectResponseFile then
+ _p("rule ar")
+ _p(" command = " .. wrap_ninja_cmd(tool.ar .. " $flags $out @$out.rsp " .. (os.is("MacOSX") and " 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'" or "")))
+ _p(" description = ar $out")
+ _p(" rspfile = $out.rsp")
+ _p(" rspfile_content = $in $libs")
+ _p("")
+ else
+ _p("rule ar")
+ _p(" command = " .. wrap_ninja_cmd(tool.ar .. " $flags $out $in $libs" .. (os.is("MacOSX") and " 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'" or "")))
+ _p(" description = ar $out")
+ _p("")
+ end
local link = iif(cfg.language == "C", tool.cc, tool.cxx)
_p("rule link")
@@ -82,11 +89,19 @@ end
startgroup = '-Wl,--start-group'
endgroup = '-Wl,--end-group'
end
- _p(" command = " .. wrap_ninja_cmd("$pre_link " .. link .. " -o $out @$out.rsp $all_ldflags $post_build"))
- _p(" description = link $out")
- _p(" rspfile = $out.rsp")
- _p(" rspfile_content = $all_outputfiles $walibs" .. string.format("%s $libs %s", startgroup, endgroup))
- _p("")
+
+ local rspfile_content = "$all_outputfiles $walibs " .. string.format("%s $libs %s", startgroup, endgroup)
+ if cfg.flags.UseLDResponseFile then
+ _p(" command = " .. wrap_ninja_cmd("$pre_link " .. link .. " -o $out @$out.rsp $all_ldflags $post_build"))
+ _p(" description = link $out")
+ _p(" rspfile = $out.rsp")
+ _p(" rspfile_content = %s", rspfile_content)
+ _p("")
+ else
+ _p(" command = " .. wrap_ninja_cmd("$pre_link " .. link .. " -o $out " .. rspfile_content .. " $all_ldflags $post_build"))
+ _p(" description = link $out")
+ _p("")
+ end
_p("rule exec")
_p(" command = " .. wrap_ninja_cmd("$command"))
@@ -134,14 +149,16 @@ end
function cpp.custombuildtask(prj, cfg)
local cmd_index = 1
- local seen_commands = {}
- local command_by_name = {}
- local command_files = {}
+
+ local ninja_rules = {}
+ local ninja_builds = {}
local prebuildsuffix = #cfg.prebuildcommands > 0 and "||__prebuildcommands_" .. premake.esc(prj.name) or ""
for _, custombuildtask in ipairs(prj.custombuildtask or {}) do
for _, buildtask in ipairs(custombuildtask or {}) do
+
+ local commands = {}
for _, cmd in ipairs(buildtask[4] or {}) do
local num = 1
@@ -155,63 +172,40 @@ end
cmd = string.gsub(cmd, '%$%(<%)', '$in')
cmd = string.gsub(cmd, '%$%(@%)', '$out')
- local cmd_name -- shortened command name
-
- -- generate shortened rule names for the command, may be nonsensical
- -- in some cases but it will at least be unique.
- if seen_commands[cmd] == nil then
- local _, _, name = string.find(cmd, '([.%w]+)%s')
- name = 'cmd' .. cmd_index .. '_' .. string.gsub(name, '[^%w]', '_')
-
- seen_commands[cmd] = {
- name = name,
- index = cmd_index,
- }
-
- cmd_index = cmd_index + 1
- cmd_name = name
- else
- cmd_name = seen_commands[cmd].name
- end
-
- local index = seen_commands[cmd].index
-
- if command_files[index] == nil then
- command_files[index] = {}
- end
+ table.insert(commands, cmd)
+ end
- local cmd_set = command_files[index]
+ ninja_rules["cmd_" .. cmd_index] = commands
- table.insert(cmd_set, {
- buildtask[1],
- buildtask[2],
- buildtask[3],
- seen_commands[cmd].name,
- })
+ table.insert(ninja_builds, {
+ file_in = buildtask[1],
+ file_out = buildtask[2],
+ rule = "cmd_" .. cmd_index,
+ deps = buildtask[3]
+ })
- command_files[index] = cmd_set
- command_by_name[cmd_name] = cmd
- end
+ cmd_index = cmd_index + 1
end
end
_p("# custom build rules")
- for command, details in pairs(seen_commands) do
- _p("rule " .. details.name)
- _p(1, "command = " .. wrap_ninja_cmd(command))
+
+ for rule, commands in pairs(ninja_rules) do
+ _p("rule " .. rule)
+ _p(1, "command = " .. wrap_ninja_cmd(table.concat(commands, " && ")))
end
- for cmd_index, cmdsets in ipairs(command_files) do
- for _, cmdset in ipairs(cmdsets) do
- local file_in = path.getrelative(cfg.location, cmdset[1])
- local file_out = path.getrelative(cfg.location, cmdset[2])
- local deps = ''
- for i, dep in ipairs(cmdset[3]) do
- deps = deps .. path.getrelative(cfg.location, dep) .. ' '
- end
- _p("build " .. file_out .. ': ' .. cmdset[4] .. ' ' .. file_in .. ' | ' .. deps .. prebuildsuffix)
- _p("")
+
+ for i = 1,#ninja_builds do
+ local build = ninja_builds[i]
+
+ local deps = ''
+ for i, dep in ipairs(build.deps) do
+ deps = deps .. path.getrelative(cfg.location, dep) .. ' '
end
+
+ _p("build " .. path.getrelative(cfg.location, build.file_out) .. ': ' .. build.rule .. ' ' .. path.getrelative(cfg.location, build.file_in) .. ' | ' .. deps .. prebuildsuffix)
+ _p("")
end
end
@@ -303,7 +297,7 @@ end
local extra_deps = #cfg.extra_deps and '| ' .. table.concat(cfg.extra_deps[objfilename] or {}, ' ') or ''
local order_deps = #cfg.order_deps and '|| ' .. table.concat(cfg.order_deps[objfilename] or {}, ' ') or ''
local extra_flags = #cfg.extra_flags and ' ' .. table.concat(cfg.extra_flags[objfilename] or {}, ' ') or ''
-
+
local cflags = "cflags"
if path.isobjcfile(file) then
_p("build " .. objfilename .. ": cxx " .. file .. extra_deps .. order_deps)
@@ -317,7 +311,7 @@ end
_p("build " .. objfilename .. ": cxx " .. file .. extra_deps .. order_deps)
cflags = "cxxflags"
end
-
+
_p(1, "flags = " .. flags[cflags] .. extra_flags)
_p(1, "includes = " .. flags.includes)
_p(1, "defines = " .. flags.defines)
@@ -331,7 +325,7 @@ end
function cpp.linker(prj, cfg, objfiles, tool)
local all_ldflags = ninja.list(table.join(tool.getlibdirflags(cfg), tool.getldflags(cfg), cfg.linkoptions))
- local prebuildsuffix = #cfg.prebuildcommands > 0 and "||__prebuildcommands" or ""
+ local prebuildsuffix = #cfg.prebuildcommands > 0 and ("||__prebuildcommands_" .. premake.esc(prj.name)) or ""
local libs = {}
local walibs = {}
local lddeps = {}
diff --git a/3rdparty/genie/src/actions/ninja/ninja_solution.lua b/3rdparty/genie/src/actions/ninja/ninja_solution.lua
index 3d1e400e553..6d9b3a5f833 100644
--- a/3rdparty/genie/src/actions/ninja/ninja_solution.lua
+++ b/3rdparty/genie/src/actions/ninja/ninja_solution.lua
@@ -16,6 +16,7 @@ function ninja.generate_solution(sln)
-- write a header showing the build options
_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)
+ _p('# https://github.com/bkaradzic/GENie')
_p('# Type "make help" for usage help')
_p('')
_p('NINJA=ninja')
@@ -129,6 +130,7 @@ end
_p("# solution build file")
_p("# generated with GENie ninja")
+ _p("# https://github.com/bkaradzic/GENie")
_p("")
_p("# build projects")
diff --git a/3rdparty/genie/src/actions/ninja/ninja_swift.lua b/3rdparty/genie/src/actions/ninja/ninja_swift.lua
index 3e5a93de591..d96ec01c730 100644
--- a/3rdparty/genie/src/actions/ninja/ninja_swift.lua
+++ b/3rdparty/genie/src/actions/ninja/ninja_swift.lua
@@ -32,6 +32,7 @@ local p = premake
_p("# Swift project build file")
_p("# generated with GENie ninja")
+ _p("# https://github.com/bkaradzic/GENie")
_p("")
-- needed for implicit outputs, introduced in 1.7
diff --git a/3rdparty/genie/src/actions/ninja/ninja_swift_incremental.lua b/3rdparty/genie/src/actions/ninja/ninja_swift_incremental.lua
index 2168d18b3fe..582aa18adc4 100644
--- a/3rdparty/genie/src/actions/ninja/ninja_swift_incremental.lua
+++ b/3rdparty/genie/src/actions/ninja/ninja_swift_incremental.lua
@@ -32,6 +32,7 @@ function swift.generate_config(prj, cfg)
_p("# Swift project build file")
_p("# generated with GENie ninja")
+ _p("# https://github.com/bkaradzic/GENie")
_p("")
-- needed for implicit outputs, introduced in 1.7
diff --git a/3rdparty/genie/src/actions/qbs/_qbs.lua b/3rdparty/genie/src/actions/qbs/_qbs.lua
deleted file mode 100644
index 8f1ba4b5e0b..00000000000
--- a/3rdparty/genie/src/actions/qbs/_qbs.lua
+++ /dev/null
@@ -1,41 +0,0 @@
---
--- GENie - Project generator tool
--- https://github.com/bkaradzic/GENie#license
---
-
-premake.qbs = { }
-
-local qbs = premake.qbs
-
-newaction
-{
- -- Metadata for the command line and help system
- trigger = "qbs",
- shortname = "qbs",
- description = "Generate QBS build files",
- module = "qbs",
-
- -- The capabilities of this action
- valid_kinds = {"ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle"},
- valid_languages = {"C", "C++"},
- valid_tools = {
- cc = { "gcc", "msc" },
- },
-
- -- Solution and project generation logic
- onsolution = function(sln)
- io.eol = "\n"
- io.indent = "\t"
- io.escaper(qbs.esc)
- premake.generate(sln, sln.name .. ".creator.qbs", qbs.generate_solution)
- io.indent = " "
- premake.generate(sln, sln.name .. ".creator.qbs.user", qbs.generate_user)
- end,
-
- onproject = function(prj)
- io.eol = "\n"
- io.indent = "\t"
- io.escaper(qbs.esc)
- premake.generate(prj, prj.name .. ".qbs", qbs.generate_project)
- end,
-}
diff --git a/3rdparty/genie/src/actions/qbs/qbs_base.lua b/3rdparty/genie/src/actions/qbs/qbs_base.lua
deleted file mode 100644
index ca24748ecea..00000000000
--- a/3rdparty/genie/src/actions/qbs/qbs_base.lua
+++ /dev/null
@@ -1,9 +0,0 @@
-function premake.qbs.list(indent, name, table)
- if #table > 0 then
- _p(indent, '%s: [', name)
- for _, item in ipairs(table) do
- _p(indent+1, '"%s",', item:gsub('"', '\\"'))
- end
- _p(indent+1, ']')
- end
-end \ No newline at end of file
diff --git a/3rdparty/genie/src/actions/qbs/qbs_cpp.lua b/3rdparty/genie/src/actions/qbs/qbs_cpp.lua
deleted file mode 100644
index 4d76e178728..00000000000
--- a/3rdparty/genie/src/actions/qbs/qbs_cpp.lua
+++ /dev/null
@@ -1,285 +0,0 @@
---
--- GENie - Project generator tool
--- https://github.com/bkaradzic/GENie#license
---
-
-local qbs = premake.qbs
-
-local function is_excluded(prj, cfg, file)
- if table.icontains(prj.excludes, file) then
- return true
- end
-
- if table.icontains(cfg.excludes, file) then
- return true
- end
-
- return false
-end
-
-function qbs.generate_project(prj)
-
- local indent = 0
-
- _p(indent, '/*')
- _p(indent, ' * QBS project file autogenerated by GENie')
- _p(indent, ' * https://github.com/bkaradzic/GENie')
- _p(indent, ' */')
- _p(indent, '')
- _p(indent, 'import qbs 1.0')
- _p(indent, '')
-
- if prj.kind == "ConsoleApp" then
- _p(indent, 'CppApplication {')
- _p(indent + 1, 'consoleApplication: true')
- elseif prj.kind == "WindowedApp" then
- _p(indent, 'CppApplication {')
- _p(indent + 1, 'consoleApplication: false')
- elseif prj.kind == "StaticLib" then
- _p(indent, 'StaticLibrary {')
- elseif prj.kind == "SharedLib" then
- _p(indent, 'DynamicLibrary {')
- end
-
- indent = indent + 1
- _p(indent, 'name: "' .. prj.name .. '"')
-
--- _p(indent, 'cpp.enableReproducibleBuilds: true')
-
- _p(indent, 'Depends { name: "cpp" }')
-
- -- List dependencies, if there are any
- local deps = premake.getdependencies(prj)
- if #deps > 0 then
- for _, depprj in ipairs(deps) do
- _p(indent, 'Depends { name: "%s" }', depprj.name)
- end
- end
-
- local cc = premake.gettool(prj)
- local platforms = premake.filterplatforms(prj.solution, cc.platforms, "Native")
-
- for _, platform in ipairs(platforms) do
- for cfg in premake.eachconfig(prj, platform) do
-
- if cfg.platform ~= "Native" then
-
- _p('');
- _p(indent, 'Properties { /* %s */', premake.getconfigname(cfg.name, cfg.platform, true))
-
- indent = indent + 1
-
- local arch = ""
- local linkerFlags = cfg.linkoptions
-
- if cfg.platform == "x32" then
- arch = '&& qbs.architecture == "x86"'
--- table.insert(linkerFlags, "-m32")
- elseif cfg.platform == "x64" then
- arch = '&& qbs.architecture == "x86_64"'
--- table.insert(linkerFlags, "-m64")
- end
-
- if cfg.name == "Debug" then
- _p(indent, 'condition: qbs.buildVariant == "debug" %s', arch)
- else
- _p(indent, 'condition: qbs.buildVariant == "release" %s', arch)
- end
-
- _p(indent, 'targetName: "%s"', cfg.buildtarget.basename)
- _p(indent, 'destinationDirectory: "%s"', path.getabsolute('projects/qbs/' .. cfg.buildtarget.directory) .. '/')
--- _p(indent, 'fileTagsFilter: "application"')
--- _p(indent, 'qbs.install: true')
--- _p(indent, 'qbs.installDir: "%s"', cfg.buildtarget.directory)
--- _p(indent, 'buildDirectory: "%s"', cfg.objectsdir)
-
--- qbs.list(
--- indent
--- , "cpp.cppFlags"
--- , cc.getcppflags(cfg)
--- )
-
- if cfg.flags.Cpp11 then
- _p(indent, 'cpp.cxxLanguageVersion: "c++11"')
- elseif cfg.flags.Cpp14 then
- _p(indent, 'cpp.cxxLanguageVersion: "c++14"')
- elseif cfg.flags.Cpp17 then
- _p(indent, 'cpp.cxxLanguageVersion: "c++17"')
- else
- _p(indent, 'cpp.cxxLanguageVersion: "c++98"')
- end
-
- if os.is("windows") then
- if not cfg.flags.WinMain and (cfg.kind == 'ConsoleApp' or cfg.kind == 'WindowedApp') then
- if cfg.flags.Unicode then
- _p(indent, 'cpp.entryPoint: "wmainCRTStartup"')
- else
- _p(indent, 'cpp.entryPoint: "mainCRTStartup"')
- end
- end
- end
-
- qbs.list(
- indent
- , "cpp.commonCompilerFlags"
- , cfg.buildoptions
- )
-
- qbs.list(
- indent
- , "cpp.cFlags"
- , cfg.buildoptions_c
- )
-
- qbs.list(
- indent
- , "cpp.cxxFlags"
- , cfg.buildoptions_cpp
- )
-
- qbs.list(
- indent
- , "cpp.objcFlags"
- , cfg.buildoptions_objc
- )
-
- qbs.list(
- indent
- , "cpp.objcxxFlags"
- , cfg.buildoptions_objc
- )
-
- if cfg.flags.StaticRuntime then
- _p(indent, 'cpp.runtimeLibrary: "static"')
- else
- _p(indent, 'cpp.runtimeLibrary: "dynamic"')
- end
-
- if cfg.flags.PedanticWarnings
- or cfg.flags.ExtraWarnings
- then
- _p(indent, 'cpp.warningLevel: "all"')
- else
- _p(indent, 'cpp.warningLevel: "default"')
- end
-
- if cfg.flags.FatalWarnings then
- _p(indent, 'cpp.treatWarningsAsErrors: true')
- else
- _p(indent, 'cpp.treatWarningsAsErrors: false')
- end
-
- if cfg.flags.NoRTTI then
- _p(indent, 'cpp.enableRtti: false')
- else
- _p(indent, 'cpp.enableRtti: true')
- end
-
- if cfg.flags.NoExceptions then
- _p(indent, 'cpp.enableExceptions: false')
- else
- _p(indent, 'cpp.enableExceptions: true')
- end
-
- if cfg.flags.Symbols then
- _p(indent, 'cpp.debugInformation: true')
- else
- _p(indent, 'cpp.debugInformation: false')
- end
-
- if cfg.flags.Unicode then
- _p(indent, 'cpp.windowsApiCharacterSet: "unicode"')
- else
- _p(indent, 'cpp.windowsApiCharacterSet: ""')
- end
-
- if not cfg.pchheader or cfg.flags.NoPCH then
- _p(indent, 'cpp.usePrecompiledHeader: false')
- else
- _p(indent, 'cpp.usePrecompiledHeader: true')
- _p(indent, 'Group {')
- _p(indent+1, 'name: "PCH"')
- _p(indent+1, 'files: ["' .. cfg.pchheader .. '"]')
- _p(indent+1, 'fileTags: ["cpp_pch_src"]')
- _p(indent, '}')
- end
-
- for _, value in ipairs(cfg.flags) do
- if (value == "Optimize") then
- elseif (value == "OptimizeSize") then
- _p(indent, 'cpp.optimization: "small"')
- elseif (value == "OptimizeSpeed") then
- _p(indent, 'cpp.optimization: "fast"')
- end
- end
-
- qbs.list(
- indent
- , "cpp.defines"
- , cfg.defines
- )
-
- local sortedincdirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systemincludedirs)
- table.sort(sortedincdirs, includesort)
- qbs.list(
- indent
- , "cpp.includePaths"
- , sortedincdirs
- )
-
- qbs.list(
- indent
- , "cpp.staticLibraries"
- , premake.getlinks(cfg, "system", "fullpath")
- )
-
- qbs.list(
- indent
- , "cpp.libraryPaths"
- , cfg.libdirs
- )
-
- qbs.list(
- indent
- , "cpp.linkerFlags"
- , linkerFlags
- )
-
- table.sort(prj.files)
- if #prj.files > 0 then
- _p(indent, 'files: [')
- for _, file in ipairs(prj.files) do
- if path.iscfile(file)
- or path.iscppfile(file)
- or path.isobjcfile(file)
- or path.isresourcefile(file)
- or path.iscppheader(file) then
- if not is_excluded(prj, cfg, file) then
- _p(indent+1, '"%s",', file)
- end
- end
- end
- _p(indent+1, ']')
- end
-
- if #prj.excludes > 0 then
- _p(indent, 'excludeFiles: [')
- table.sort(prj.excludes)
- for _, file in ipairs(prj.excludes) do
- if path.issourcefile(file) then
- _p(indent+1, '"%s",', file)
- end
- end
- _p(indent+1, ']')
- end
-
- indent = indent - 1
- _p(indent, '}');
- end
- end
- end
-
- indent = indent - 1
-
- _p(indent, '}')
-end
diff --git a/3rdparty/genie/src/actions/qbs/qbs_solution.lua b/3rdparty/genie/src/actions/qbs/qbs_solution.lua
deleted file mode 100644
index d912617dae1..00000000000
--- a/3rdparty/genie/src/actions/qbs/qbs_solution.lua
+++ /dev/null
@@ -1,251 +0,0 @@
---
--- GENie - Project generator tool
--- https://github.com/bkaradzic/GENie#license
---
-
-local qbs = premake.qbs
-
-function qbs.generate_solution(sln)
-
- _p('/*')
- _p(' * QBS project file autogenerated by GENie')
- _p(' * https://github.com/bkaradzic/GENie')
- _p(' */')
- _p('')
- _p('import qbs')
- _p('')
-
- _p(0, 'Project {')
-
- _p(1, 'references: [')
- for prj in premake.solution.eachproject(sln) do
- _p(2, '"' .. prj.name .. '.qbs",')
- end
- _p(1, ']')
-
- _p(0, '}')
-end
-
-local function is_app(kind)
- if kind == "ConsoleApp" or kind == "WindowedApp" then
- return true
- end
-
- return false
-end
-
-function qbs.generate_user(sln)
-
- _p(0, '<?xml version="1.0" encoding="UTF-8"?>')
- _p(0, '<!DOCTYPE QtCreatorProject>')
- _p(0, '<!-- QBS project file autogenerated by GENie https://github.com/bkaradzic/GENie -->')
- _p(0, '<qtcreator>')
-
- local startProject = 0
- local idx = 0
-
- for prj in premake.solution.eachproject(sln) do
- if is_app(prj.kind) then
- if sln.startproject == prj.name then
- startProject = idx
- end
- idx = idx + 1
- end
- end
-
- _p(1, '<data>')
- _p(2, '<variable>ProjectExplorer.Project.Target.0</variable>')
-
- _p(2, '<valuemap type="QVariantMap">')
-
- _p(3, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>')
- _p(3, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>')
-
- local qbsguid = ""
- local qbsprofile = ""
-
- local qtcreatordir = ""
-
- if _OS == "windows" then
- qtcreatordir = path.join(os.getenv("APPDATA"), "QtProject/qtcreator")
- else
- qtcreatordir = path.join(os.getenv("HOME"), ".config/QtProject/qtcreator")
- end
-
- local file = io.open(path.join(qtcreatordir, "qbs.conf"))
- if file == nil then
- file = io.open(path.join(qtcreatordir, "qbs/1.6.0/qbs.conf"))
- end
-
- if file ~= nil then
- for line in file:lines() do
- if line == "[org]" then
- -- BK - Need to figure out how to extract kit associated profile name/guid...
- -- ~.config/QtProject/qtcreator/qbs.conf
- --
- -- [org]
- -- qt-project\qbs\preferences\qtcreator\kit\%7B9926e565-8fc0-448d-9d5d-4b0293efd443%7D=qtc_Desktop_1bffddf2
- --
- local str = 'qt-project\\qbs\\preferences\\qtcreator\\kit\\%'
- local index = string.len(str)+1
- for line in file:lines() do
- if index == string.find(line, '7B', index) then
- line = string.sub(line, index+2)
- qbsguid = string.sub(line, 1, 36)
- qbsprofile = string.sub(line, 41)
- --print(qbsguid, qbsprofile)
- break
- end
- end
- else
- -- ~/.config/QtProject/qtcreator/qbs/1.6.0/qbs.conf
- --
- -- <key>org.qt-project.qbs.preferences.qtcreator.kit.{d67ae030-7a33-43e0-850a-afe9e47fe5e1}</key>
- -- <string>qtc_Desktop_ee88281c</string>
-
- local str = '\t<key>org.qt-project.qbs.preferences.qtcreator.kit.'
- local index = string.len(str)+1
- for line in file:lines() do
- if qbsguid == "" and index == string.find(line, '{', index) then
- line = string.sub(line, index+1)
- qbsguid = string.sub(line, 1, 36)
- elseif qbsguid ~= "" then
- qbsprofile = string.sub(line, 10, 29)
- --print(qbsguid, qbsprofile)
- break
- end
- end
- end
-
- break
- end
- io.close(file)
- end
-
- _p(3, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{%s}</value>', qbsguid)
-
- _p(3, '<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>')
- _p(3, '<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>')
- _p(3, '<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">%d</value>', startProject)
-
- -- BuildConfiguration
- idx = 0
- for _, cfgname in ipairs(sln.configurations) do
- -- cfg.objectsdir
- _p(3, '<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.%d">', idx)
- _p(4, '<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">build</value>')
- _p(4, '<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">')
- _p(5, '<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">')
- _p(6, '<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>')
- _p(6, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName"></value>')
- _p(6, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qbs Build</value>')
- _p(6, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qbs.BuildStep</value>')
- _p(6, '<value type="bool" key="Qbs.CleanInstallRoot">false</value>')
- _p(6, '<valuemap type="QVariantMap" key="Qbs.Configuration">')
- _p(7, '<value type="QString" key="qbs.buildVariant">%s</value>', cfgname:lower())
- _p(7, '<value type="QString" key="qbs.profile">%s</value>', qbsprofile)
- _p(6, '</valuemap>')
- _p(5, '</valuemap>')
- _p(5, '<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>')
- _p(4, '</valuemap>')
- _p(4, '<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">')
- _p(5, '<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">')
- _p(6, '<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>')
- _p(6, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName"></value>')
- _p(6, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qbs Clean</value>')
- _p(6, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qbs.CleanStep</value>')
- _p(6, '<value type="bool" key="Qbs.CleanAll">true</value>')
- _p(6, '<value type="bool" key="Qbs.DryKeepGoing">false</value>')
- _p(6, '<value type="bool" key="Qbs.DryRun">false</value>')
- _p(5, '</valuemap>')
- _p(5, '<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>')
- _p(4, '</valuemap>')
- _p(4, '<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>')
- _p(4, '<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>')
- _p(4, '<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">%s</value>', cfgname)
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qbs.QbsBuildConfiguration</value>')
- _p(3, '</valuemap>')
-
- idx = idx + 1
- end
-
- _p(3, '<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">%d</value>', idx)
-
- -- DeployConfiguration
- _p(3, '<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">')
- _p(4, '<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">')
- _p(5, '<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>')
- _p(5, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>')
- _p(4, '</valuemap>')
- _p(4, '<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qbs Install</value>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qbs.Deploy</value>')
- _p(3, '</valuemap>')
- _p(3, '<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>')
-
- -- PluginSettings
--- _p(3, '<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>')
-
- -- RunConfiguration
- idx = 0
- for prj in premake.solution.eachproject(sln) do
-
- if is_app(prj.kind) then
--- _p(3, '<variable>ProjectExplorer.Project.Target.%d</variable>', idx)
-
- _p(3, '<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.%d">', idx)
-
- if idx == startProject then
- _p(4, '<value type="int" key="PE.EnvironmentAspect.Base">2</value>')
- else
- _p(4, '<value type="int" key="PE.EnvironmentAspect.Base">-1</value>')
- end
- _p(4, '<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">%s</value>', prj.name)
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>')
- _p(4, '<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qbs.RunConfiguration:%s.%s---Qbs.RC.NameSeparator---%s</value>', prj.name, qbsprofile, prj.name)
-
- _p(4, '<value type="QString" key="Qbs.RunConfiguration.CommandLineArguments"></value>')
-
- local cfg = premake.getconfig(prj, nil, nil)
- if cfg.debugdir ~= nil then
- _p(4, '<value type="QString" key="Qbs.RunConfiguration.WorkingDirectory">%s</value>', cfg.debugdir)
- else
- _p(4, '<value type="QString" key="Qbs.RunConfiguration.WorkingDirectory"></value>')
- end
-
- _p(3, '</valuemap>')
-
- idx = idx + 1
- end
- end
-
- _p(3, '<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">%d</value>', idx)
-
- _p(2, '</valuemap>')
- _p(1, '</data>')
-
- _p(1, '<data>')
- _p(2, '<variable>ProjectExplorer.Project.TargetCount</variable>')
- _p(2, '<value type="int">1</value>')
- _p(1, '</data>')
-
- _p(1, '<data>')
- _p(2, '<variable>Version</variable>')
- _p(2, '<value type="int">18</value>')
- _p(1, '</data>')
-
- _p(0, '</qtcreator>')
-
-end
diff --git a/3rdparty/genie/src/actions/vstudio/_vstudio.lua b/3rdparty/genie/src/actions/vstudio/_vstudio.lua
index 94bf748dc57..37ec27cf328 100644
--- a/3rdparty/genie/src/actions/vstudio/_vstudio.lua
+++ b/3rdparty/genie/src/actions/vstudio/_vstudio.lua
@@ -17,7 +17,8 @@
vs2015 = "v140",
vs2017 = "v141",
vs2019 = "v142",
- vsllvm = "llvm",
+ vs2022 = "v143",
+ vs2026 = "v145",
}
premake.vstudio.toolset = toolsets[_ACTION] or "unknown?"
premake.vstudio.splashpath = ''
@@ -32,21 +33,25 @@
--
vstudio.platforms = {
- any = "Any CPU",
- mixed = "Mixed Platforms",
- Native = "Win32",
- x86 = "x86",
- x32 = "Win32",
- x64 = "x64",
- PS3 = "PS3",
- Xbox360 = "Xbox 360",
- ARM = "ARM",
- Orbis = "ORBIS",
- Durango = "Durango",
- TegraAndroid = "Tegra-Android",
- NX32 = "NX32",
- NX64 = "NX64",
- Emscripten = "Emscripten",
+ any = "Any CPU",
+ mixed = "Mixed Platforms",
+ Native = "Win32",
+ x86 = "x86",
+ x32 = "Win32",
+ x64 = "x64",
+ PS3 = "PS3",
+ Xbox360 = "Xbox 360",
+ ARM = "ARM",
+ ARM64 = "ARM64",
+ Orbis = "ORBIS",
+ Durango = "Durango",
+ TegraAndroid = "Tegra-Android",
+ NX32 = "NX32",
+ NX64 = "NX64",
+ Emscripten = "Emscripten",
+ ["gdk-desktop"] = "Gaming.Desktop.x64",
+ ["gdk-xboxone"] = "Gaming.Xbox.XboxOne.x64",
+ ["gdk-scarlett"] = "Gaming.Xbox.Scarlett.x64",
}
@@ -72,6 +77,27 @@
+ function vstudio.isgdkconsole(cfg)
+ for _,p in pairs({"gdk-xboxone", "gdk-scarlett"}) do
+ if cfg.platform == p then
+ return true
+ end
+ end
+ return false
+ end
+
+
+
+ function vstudio.isgdkdesktop(cfg)
+ return cfg.platform == "gdk-desktop"
+ end
+
+
+
+ function vstudio.isgdk(cfg)
+ return vstudio.isgdkconsole(cfg) or vstudio.isgdkdesktop(cfg)
+ end
+
--
-- Process the solution's list of configurations and platforms, creates a list
-- of build configuration/platform pairs in a Visual Studio compatible format.
diff --git a/3rdparty/genie/src/actions/vstudio/vs2022.lua b/3rdparty/genie/src/actions/vstudio/vs2022.lua
new file mode 100644
index 00000000000..2e0d3e940fd
--- /dev/null
+++ b/3rdparty/genie/src/actions/vstudio/vs2022.lua
@@ -0,0 +1,64 @@
+--
+-- vs2022.lua
+-- Baseline support for Visual Studio 2022.
+--
+
+ premake.vstudio.vc2022 = {}
+ local vc2022 = premake.vstudio.vc2022
+ local vstudio = premake.vstudio
+
+
+---
+-- Register a command-line action for Visual Studio 2022.
+---
+
+ newaction
+ {
+ trigger = "vs2022",
+ shortname = "Visual Studio 2022",
+ description = "Generate Microsoft Visual Studio 2022 project files",
+ os = "windows",
+
+ valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
+
+ valid_languages = { "C", "C++", "C#" },
+
+ valid_tools = {
+ cc = { "msc" },
+ dotnet = { "msnet" },
+ },
+
+ onsolution = function(sln)
+ premake.generate(sln, "%%.sln", vstudio.sln2005.generate)
+ end,
+
+ onproject = function(prj)
+ if premake.isdotnetproject(prj) then
+ premake.generate(prj, "%%.csproj", vstudio.cs2005.generate)
+ premake.generate(prj, "%%.csproj.user", vstudio.cs2005.generate_user)
+ else
+ premake.vstudio.needAppxManifest = false
+ premake.generate(prj, "%%.vcxproj", premake.vs2010_vcxproj)
+ premake.generate(prj, "%%.vcxproj.user", premake.vs2010_vcxproj_user)
+ premake.generate(prj, "%%.vcxproj.filters", vstudio.vc2010.generate_filters)
+
+ if premake.vstudio.needAppxManifest then
+ premake.generate(prj, "%%/Package.appxmanifest", premake.vs2010_appxmanifest)
+ end
+ end
+ end,
+
+
+ oncleansolution = premake.vstudio.cleansolution,
+ oncleanproject = premake.vstudio.cleanproject,
+ oncleantarget = premake.vstudio.cleantarget,
+
+ vstudio = {
+ solutionVersion = "12",
+ targetFramework = "4.7.2",
+ toolsVersion = "16.0",
+ windowsTargetPlatformVersion = "10.0",
+ supports64bitEditContinue = true,
+ intDirAbsolute = false,
+ }
+ }
diff --git a/3rdparty/genie/src/actions/vstudio/vs2026.lua b/3rdparty/genie/src/actions/vstudio/vs2026.lua
new file mode 100644
index 00000000000..b75c998df73
--- /dev/null
+++ b/3rdparty/genie/src/actions/vstudio/vs2026.lua
@@ -0,0 +1,63 @@
+--
+-- vs2026.lua
+-- Baseline support for Visual Studio 2026.
+--
+
+ premake.vstudio.vc2026 = {}
+ local vstudio = premake.vstudio
+
+
+---
+-- Register a command-line action for Visual Studio 2026.
+---
+
+ newaction
+ {
+ trigger = "vs2026",
+ shortname = "Visual Studio 2026",
+ description = "Generate Microsoft Visual Studio 2026 project files",
+ os = "windows",
+
+ valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
+
+ valid_languages = { "C", "C++", "C#" },
+
+ valid_tools = {
+ cc = { "msc" },
+ dotnet = { "msnet" },
+ },
+
+ onsolution = function(sln)
+ premake.generate(sln, "%%.slnx", vstudio.slnx.generate)
+ end,
+
+ onproject = function(prj)
+ if premake.isdotnetproject(prj) then
+ premake.generate(prj, "%%.csproj", vstudio.cs2005.generate)
+ premake.generate(prj, "%%.csproj.user", vstudio.cs2005.generate_user)
+ else
+ premake.vstudio.needAppxManifest = false
+ premake.generate(prj, "%%.vcxproj", premake.vs2010_vcxproj)
+ premake.generate(prj, "%%.vcxproj.user", premake.vs2010_vcxproj_user)
+ premake.generate(prj, "%%.vcxproj.filters", vstudio.vc2010.generate_filters)
+
+ if premake.vstudio.needAppxManifest then
+ premake.generate(prj, "%%/Package.appxmanifest", premake.vs2010_appxmanifest)
+ end
+ end
+ end,
+
+
+ oncleansolution = premake.vstudio.cleansolution,
+ oncleanproject = premake.vstudio.cleanproject,
+ oncleantarget = premake.vstudio.cleantarget,
+
+ vstudio = {
+ solutionVersion = "slnx",
+ targetFramework = "4.7.2",
+ toolsVersion = "16.0",
+ windowsTargetPlatformVersion = "10.0",
+ supports64bitEditContinue = true,
+ intDirAbsolute = false,
+ }
+ }
diff --git a/3rdparty/genie/src/actions/vstudio/vsllvm.lua b/3rdparty/genie/src/actions/vstudio/vsllvm.lua
deleted file mode 100644
index d6c6d1ddb53..00000000000
--- a/3rdparty/genie/src/actions/vstudio/vsllvm.lua
+++ /dev/null
@@ -1,64 +0,0 @@
---
--- vsllvm.lua
--- Baseline support for Visual Studio LLVM.
---
-
- premake.vstudio.vcllvm = {}
- local vcllvm = premake.vstudio.vcllvm
- local vstudio = premake.vstudio
-
-
----
--- Register a command-line action for Visual Studio llvm.
----
-
- newaction
- {
- trigger = "vsllvm",
- shortname = "Visual Studio LLVM",
- description = "Generate Microsoft Visual Studio LLVM project files",
- os = "windows",
-
- valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
-
- valid_languages = { "C", "C++", "C#" },
-
- valid_tools = {
- cc = { "msc" },
- dotnet = { "msnet" },
- },
-
- onsolution = function(sln)
- premake.generate(sln, "%%.sln", vstudio.sln2005.generate)
- end,
-
- onproject = function(prj)
- if premake.isdotnetproject(prj) then
- premake.generate(prj, "%%.csproj", vstudio.cs2005.generate)
- premake.generate(prj, "%%.csproj.user", vstudio.cs2005.generate_user)
- else
- premake.vstudio.needAppxManifest = false
- premake.generate(prj, "%%.vcxproj", premake.vs2010_vcxproj)
- premake.generate(prj, "%%.vcxproj.user", premake.vs2010_vcxproj_user)
- premake.generate(prj, "%%.vcxproj.filters", vstudio.vc2010.generate_filters)
-
- if premake.vstudio.needAppxManifest then
- premake.generate(prj, "%%/Package.appxmanifest", premake.vs2010_appxmanifest)
- end
- end
- end,
-
-
- oncleansolution = premake.vstudio.cleansolution,
- oncleanproject = premake.vstudio.cleanproject,
- oncleantarget = premake.vstudio.cleantarget,
-
- vstudio = {
- solutionVersion = "12",
- targetFramework = "4.5.2",
- toolsVersion = "15.0",
- windowsTargetPlatformVersion = "8.1",
- supports64bitEditContinue = true,
- intDirAbsolute = true,
- }
- }
diff --git a/3rdparty/genie/src/actions/vstudio/vstudio_slnx.lua b/3rdparty/genie/src/actions/vstudio/vstudio_slnx.lua
new file mode 100644
index 00000000000..e0c74e69dc2
--- /dev/null
+++ b/3rdparty/genie/src/actions/vstudio/vstudio_slnx.lua
@@ -0,0 +1,112 @@
+--
+-- vstudio_slnx.lua
+-- Generate a Visual Studio 2026+ solution.
+--
+
+premake.vstudio.slnx = {}
+local vstudio = premake.vstudio
+local slnx = premake.vstudio.slnx
+
+
+function slnx.generate(sln)
+ io.eol = '\r\n'
+
+ -- Precompute Visual Studio configurations
+ sln.vstudio_configs = premake.vstudio.buildconfigs(sln)
+ -- Prepare imported projects
+ premake.vstudio.bakeimports(sln)
+
+ -- Mark the file as Unicode
+ _p('\239\187\191')
+
+ -- Write out solution file
+ _p('<!-- Generated by GENie https://github.com/bkaradzic/GENie -->')
+ _p('<Solution>')
+ slnx.configurations(sln)
+ for group in premake.solution.eachgroup(sln) do
+ if #group.projects > 0 then
+ slnx.group(group)
+ end
+ end
+ for prj in premake.solution.eachproject(sln) do
+ if prj.group == nil then
+ slnx.project(prj)
+ end
+ end
+ _p('</Solution>')
+end
+
+--
+-- Write a folder entry for a group and write all projects under the group
+--
+
+function slnx.group(group)
+ local folderName = group.name .. "/"
+
+ local groupParent = group.parent
+ while groupParent ~= nil do
+ folderName = groupParent.name .. "/" .. folderName
+ groupParent = groupParent.parent
+ end
+
+ _p(' <Folder Name="/%s">', folderName)
+ for _, prj in ipairs(group.projects) do
+ slnx.project(prj)
+ end
+ _p(' </Folder>')
+end
+
+--
+-- Write out an entry for a project
+--
+
+function slnx.project(prj)
+ -- Build a relative path from the solution file to the project file
+ local projpath = path.translate(
+ path.getrelative(prj.solution.location, vstudio.projectfile(prj)), "\\")
+
+ local indent = ' '
+ if prj.group ~= nil then
+ indent = ' '
+ end
+ _p('%s<Project Path="%s" Id="%s" />', indent, projpath, prj.uuid)
+end
+
+--
+-- Write out the contents of the Configurations section, which lists
+-- every platform used by at least one project in the slnx.
+--
+
+function slnx.configurations(sln)
+ local platforms = {}
+
+ for _, cfg in ipairs(sln.vstudio_configs) do
+ local platform = cfg.platform
+
+ if platform == "Any CPU" or platform == "Mixed Platforms" then
+ if not table.contains(platforms, "Any CPU") then
+ table.insert(platforms, "Any CPU")
+ end
+ else
+ if not table.contains(platforms, platform) then
+ table.insert(platforms, platform)
+ end
+ end
+ end
+
+ for prj in premake.solution.eachproject(sln) do
+ if premake.isdotnetproject(prj) then
+ if not table.contains(platforms, "Any CPU") then
+ table.insert(platforms, "Any CPU")
+ end
+ end
+ end
+
+ table.sort(platforms)
+
+ _p(' <Configurations>')
+ for _, platform in ipairs(platforms) do
+ _p(' <Platform Name="%s" />', platform)
+ end
+ _p(' </Configurations>')
+end
diff --git a/3rdparty/genie/src/actions/vstudio/vstudio_solution.lua b/3rdparty/genie/src/actions/vstudio/vstudio_solution.lua
index 8115798c8a2..a44570f4e37 100644
--- a/3rdparty/genie/src/actions/vstudio/vstudio_solution.lua
+++ b/3rdparty/genie/src/actions/vstudio/vstudio_solution.lua
@@ -23,6 +23,7 @@
sln2005.reorderProjects(sln)
sln2005.header(sln)
+ _p('# Generated by GENie https://github.com/bkaradzic/GENie')
for grp in premake.solution.eachgroup(sln) do
sln2005.group(grp)
@@ -31,11 +32,11 @@
for prj in premake.solution.eachproject(sln) do
sln2005.project(prj)
end
-
+
for _,iprj in ipairs(sln.importedprojects) do
sln2005.importproject(iprj)
end
-
+
_p('Global')
sln2005.platforms(sln)
sln2005.project_platforms(sln)
@@ -45,7 +46,7 @@
end
--
--- If a startup project is specified, move it to the front of the project list.
+-- If a startup project is specified, move it to the front of the project list.
-- This will make Visual Studio treat it like a startup project.
--
@@ -85,8 +86,10 @@
function sln2005.header(sln)
local action = premake.action.current()
_p('Microsoft Visual Studio Solution File, Format Version %d.00', action.vstudio.solutionVersion)
- if(_ACTION:sub(3) == "2015" or _ACTION:sub(3) == "2017" or _ACTION:sub(3) == "llvm") then
+ if(_ACTION:sub(3) == "2015" or _ACTION:sub(3) == "2017") then
_p('# Visual Studio %s', action.vstudio.toolsVersion:sub(1,2))
+ elseif(_ACTION:sub(3) == "2019") then
+ _p('# Visual Studio Version %s', action.vstudio.toolsVersion:sub(1,2))
else
_p('# Visual Studio %s', _ACTION:sub(3))
end
@@ -109,12 +112,12 @@
--
-- Write out an entry for a solution folder
--
-
+
function sln2005.group(grp)
_p('Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "%s", "%s", "{%s}"', grp.name, grp.name, grp.uuid)
_p('EndProject')
end
-
+
--
-- Write out an entry for an imported project
--
@@ -199,6 +202,10 @@
if premake.vstudio.iswinrt() and prj.kind == "WindowedApp" then
_p('\t\t{%s}.%s.Deploy.0 = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)
end
+
+ if premake.vstudio.isgdk(cfg) and prj.kind == "WindowedApp" then
+ _p('\t\t{%s}.%s.Deploy.0 = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)
+ end
end
end
end
@@ -213,11 +220,11 @@
for prj in premake.solution.eachproject(sln) do
sln2005.project_platform(prj, sln)
end
-
+
for _,iprj in ipairs(sln.importedprojects) do
sln2005.project_platform(iprj, sln)
end
-
+
_p('\tEndGlobalSection')
end
@@ -256,6 +263,6 @@
_p('\t\t{%s} = {%s}', iprj.uuid, iprj.group.uuid)
end
end
-
+
_p('\tEndGlobalSection')
- end \ No newline at end of file
+ end
diff --git a/3rdparty/genie/src/actions/vstudio/vstudio_vcxproj.lua b/3rdparty/genie/src/actions/vstudio/vstudio_vcxproj.lua
index 678d54f364a..8df3801e54e 100644
--- a/3rdparty/genie/src/actions/vstudio/vstudio_vcxproj.lua
+++ b/3rdparty/genie/src/actions/vstudio/vstudio_vcxproj.lua
@@ -66,13 +66,6 @@
else
_p(2, '<Keyword>Win32Proj</Keyword>')
end
- if _ACTION:sub(3) == "2015" or _ACTION:sub(3) == "2017" or _ACTION:sub(3) == "2019" or _ACTION:sub(3) == "llvm" then
- _p(2,'<PreferredToolArchitecture>x64</PreferredToolArchitecture>')
- end
- if (_ACTION:sub(3) == "2017" or _ACTION:sub(3) == "llvm")
- and os.isdir(path.join(os.getenv("VSINSTALLDIR"), "VC/Tools/MSVC/14.14.26428")) then
- _p(2,'<VCToolsVersion>14.14.26428</VCToolsVersion>')
- end
if not vstudio.xpwarning then
_p(2, '<XPDeprecationWarning>false</XPDeprecationWarning>')
@@ -123,7 +116,9 @@
, premake.esc(cfginfo.name))
local is2019 = premake.action.current() == premake.action.get("vs2019")
- if is2019 then
+ local is2022 = premake.action.current() == premake.action.get("vs2022")
+ local is2026 = premake.action.current() == premake.action.get("vs2026")
+ if is2019 or is2022 or is2026 then
_p(2, '<VCProjectVersion>%s</VCProjectVersion>', action.vstudio.toolsVersion)
if cfg.flags.UnitySupport then
_p(2, '<EnableUnitySupport>true</EnableUnitySupport>')
@@ -137,14 +132,6 @@
_p(2, '<PreferredToolArchitecture>x64</PreferredToolArchitecture>')
end
- if cfg.flags.MFC then
- _p(2,'<UseOfMfc>%s</UseOfMfc>', iif(cfg.flags.StaticRuntime, "Static", "Dynamic"))
- end
-
- if cfg.flags.ATL or cfg.flags.StaticATL then
- _p(2,'<UseOfAtl>%s</UseOfAtl>', iif(cfg.flags.StaticATL, "Static", "Dynamic"))
- end
-
if cfg.flags.Unicode then
_p(2,'<CharacterSet>Unicode</CharacterSet>')
end
@@ -201,7 +188,8 @@
if #cfg.propertysheets > 0 then
local dirs = cfg.propertysheets
for _, dir in ipairs(dirs) do
- _p(2,'<Import Project="%s" />', path.translate(dir))
+ local translated = path.translate(dir)
+ _p(2,'<Import Project="%s" Condition="exists(\'%s\')" />', translated, translated)
end
end
@@ -245,6 +233,14 @@
_p(2,'<IgnoreImportLibrary>%s</IgnoreImportLibrary>', tostring(ignore))
end
+ if cfg.platform == "NX32" or cfg.platform == "NX64" then
+ if cfg.flags.Cpp17 then
+ _p(2,'<CppLanguageStandard>Gnu++17</CppLanguageStandard>')
+ elseif cfg.flags.Cpp20 then
+ _p(2,'<CppLanguageStandard>Gnu++20</CppLanguageStandard>')
+ end
+ end
+
if cfg.platform == "Durango" then
_p(2, '<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>')
_p(2, '<LibraryPath>$(Console_SdkLibPath)</LibraryPath>')
@@ -266,6 +262,19 @@
_p(2, '<IsolateConfigurationsOnDeploy>true</IsolateConfigurationsOnDeploy>')
end
+ if vstudio.isgdkconsole(cfg) then
+ _p(2, '<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>')
+ _p(2, '<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>')
+ _p(2, '<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>')
+ _p(2, '<LibraryPath>$(Console_SdkLibPath)</LibraryPath>')
+ _p(2, '<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>')
+ end
+
+ if vstudio.isgdkdesktop(cfg) then
+ _p(2, '<IncludePath>$(Console_SdkIncludeRoot);$(IncludePath)</IncludePath>')
+ _p(2, '<LibraryPath>$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>')
+ end
+
if cfg.kind ~= "StaticLib" then
_p(2,'<LinkIncremental>%s</LinkIncremental>', tostring(premake.config.isincrementallink(cfg)))
end
@@ -333,6 +342,13 @@
end
end
+ local function include_resdirs(indent,cfg)
+ if #cfg.resincludedirs> 0 then
+ _p(indent,'<AdditionalIncludeDirectories>%s;%%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>'
+ ,premake.esc(path.translate(table.concat(cfg.resincludedirs, ";"), '\\')))
+ end
+ end
+
local function using_dirs(indent,cfg)
if #cfg.usingdirs > 0 then
_p(indent,'<AdditionalUsingDirectories>%s;%%(AdditionalUsingDirectories)</AdditionalUsingDirectories>'
@@ -343,15 +359,17 @@
local function resource_compile(cfg)
_p(2,'<ResourceCompile>')
preprocessor(3,cfg,true)
- include_dirs(3,cfg)
+ include_resdirs(3,cfg)
_p(2,'</ResourceCompile>')
end
- local function cppstandard_vs2017_or_2019(cfg)
+ local function cppstandard(cfg)
if cfg.flags.CppLatest then
_p(3, '<LanguageStandard>stdcpplatest</LanguageStandard>')
_p(3, '<EnableModules>true</EnableModules>')
+ elseif cfg.flags.Cpp20 then
+ _p(3, '<LanguageStandard>stdcpp20</LanguageStandard>')
elseif cfg.flags.Cpp17 then
_p(3, '<LanguageStandard>stdcpp17</LanguageStandard>')
elseif cfg.flags.Cpp14 then
@@ -368,6 +386,12 @@
if cfg.flags.NoExceptions then
_p(3, '<GccExceptionHandling>false</GccExceptionHandling>')
end
+ elseif cfg.platform == "NX32" or cfg.platform == "NX64" then
+ if cfg.flags.NoExceptions then
+ _p(3, '<CppExceptions>false</CppExceptions>')
+ else
+ _p(3, '<CppExceptions>true</CppExceptions>')
+ end
else
if cfg.flags.NoExceptions then
_p(3, '<ExceptionHandling>false</ExceptionHandling>')
@@ -419,6 +443,10 @@
end
elseif cfg.platform == "TegraAndroid" then
-- TODO: tegra setting
+ elseif cfg.platform == "NX32" or cfg.platform == "NX64" then
+ if cfg.flags.FloatFast then
+ _p(3, '<FastMath>true</FastMath>')
+ end
else
if cfg.flags.FloatFast then
_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')
@@ -487,6 +515,11 @@
_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))
end
+ if cfg.platform == "NX32" or cfg.platform == "NX64" then
+ unsignedChar = "-funsigned-char ";
+ _p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))
+ end
+
if cfg.language == "C" and not cfg.options.ForceCPP then
buildoptions = table.join(buildoptions, cfg.buildoptions_c)
else
@@ -528,6 +561,17 @@
else
_p(3,'<OptimizationLevel>O2</OptimizationLevel>')
end
+ elseif cfg.platform == "NX32" or cfg.platform == "NX64" then
+ local opt = optimisation(cfg)
+ if opt == "Disabled" then
+ _p(3,'<OptimizationLevel>O0</OptimizationLevel>')
+ elseif opt == "MinSpace" then
+ _p(3,'<OptimizationLevel>Os</OptimizationLevel>')
+ elseif opt == "MaxSpeed" then
+ _p(3,'<OptimizationLevel>O3</OptimizationLevel>')
+ else
+ _p(3,'<OptimizationLevel>O2</OptimizationLevel>')
+ end
else
_p(3,'<Optimization>%s</Optimization>', optimisation(cfg))
end
@@ -613,6 +657,23 @@
if cfg.flags.FatalWarnings then
_p(3, '<WarningsAsErrors>true</WarningsAsErrors>')
end
+ elseif cfg.platform == "NX32" or cfg.platform == "NX64" then
+ if cfg.flags.PedanticWarnings then
+ _p(3, '<Warnings>MoreWarnings</Warnings>')
+ _p(3, '<ExtraWarnings>true</ExtraWarnings>')
+ elseif cfg.flags.ExtraWarnings then
+ _p(3, '<Warnings>NormalWarnings</Warnings>')
+ _p(3, '<ExtraWarnings>true</ExtraWarnings>')
+ elseif cfg.flags.MinimumWarnings then
+ _p(3, '<Warnings>WarningsOff</Warnings>')
+ _p(3, '<ExtraWarnings>false</ExtraWarnings>')
+ else
+ _p(3, '<Warnings>NormalWarnings</Warnings>')
+ _p(3, '<ExtraWarnings>false</ExtraWarnings>')
+ end
+ if cfg.flags.FatalWarnings then
+ _p(3, '<WarningsAsErrors>true</WarningsAsErrors>')
+ end
else
if cfg.flags.PedanticWarnings then
_p(3, '<WarningLevel>EnableAllWarnings</WarningLevel>')
@@ -630,8 +691,10 @@
end
if premake.action.current() == premake.action.get("vs2017") or
- premake.action.current() == premake.action.get("vs2019") then
- cppstandard_vs2017_or_2019(cfg)
+ premake.action.current() == premake.action.get("vs2019") or
+ premake.action.current() == premake.action.get("vs2022") or
+ premake.action.current() == premake.action.get("vs2026") then
+ cppstandard(cfg)
end
exceptions(cfg)
@@ -642,10 +705,6 @@
floating_point(cfg)
debug_info(cfg)
- if _ACTION:sub(3) == "llvm" then
- _p(3,'<SupportJustMyCode>false</SupportJustMyCode>')
- end
-
if cfg.flags.Symbols then
-- The compiler pdb should be different than the linker pdb, and
-- the linker pdb is what should be distributed and used for
@@ -727,16 +786,13 @@
end
end
- local function item_def_lib(prj, cfg)
+ local function item_def_lib(cfg)
-- The Xbox360 project files are stored in another place in the project file.
if cfg.kind == 'StaticLib' and cfg.platform ~= "Xbox360" then
_p(1,'<Lib>')
_p(2,'<OutputFile>$(OutDir)%s</OutputFile>',cfg.buildtarget.name)
additional_options(2,cfg)
link_target_machine(2,cfg)
- if _ACTION:sub(3) == "llvm" and prj.name == "portaudio" then -- MSVC-LLVM needs special help
- _p(2,'<AdditionalDependencies>ksuser.lib;%%(AdditionalDependencies)</AdditionalDependencies>')
- end
_p(1,'</Lib>')
end
end
@@ -833,7 +889,7 @@
-- _WIN64: For 64-bit platforms
-- _EXPORT: `EXPORT` for shared libraries, empty for other project kinds
table.insertflat(defines, iif(premake.config.isdebugbuild(cfg), "_DEBUG", {}))
- table.insert(defines, iif(cfg.platform == "x64", "_WIN64", "_WIN32"))
+ table.insert(defines, iif(cfg.platform == "x64" or cfg.platform == "ARM64", "_WIN64", "_WIN32"))
table.insert(defines, iif(prj.kind == "SharedLib", "_EXPORT=EXPORT", "_EXPORT="))
_p(3, '<PreprocessorDefinitions>%s;%%(PreprocessorDefinitions)</PreprocessorDefinitions>'
@@ -878,12 +934,12 @@
function vc2010.link(cfg)
local vs2017OrLater = premake.action.current() == premake.action.get("vs2017") or
premake.action.current() == premake.action.get("vs2019")
- local vsllvm = premake.action.current() == premake.action.get("vsllvm")
local links = getcfglinks(cfg)
_p(2,'<Link>')
_p(3,'<SubSystem>%s</SubSystem>', iif(cfg.kind == "ConsoleApp", "Console", "Windows"))
- if (vs2017OrLater or vsllvm) and cfg.flags.FullSymbols then
+
+ if vs2017OrLater and cfg.flags.FullSymbols then
_p(3,'<GenerateDebugInformation>DebugFull</GenerateDebugInformation>')
else
_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))
@@ -1019,15 +1075,18 @@
deps = "-Wl,--start-group;" .. deps .. ";-Wl,--end-group"
end
- _p(tab, '<AdditionalDependencies>%s;%s</AdditionalDependencies>'
- , deps
- , iif(cfg.platform == "Durango"
- , '%(XboxExtensionsDependencies)'
- , '%(AdditionalDependencies)'
- )
- )
+ local adddeps =
+ iif(cfg.platform == "Durango", '%(XboxExtensionsDependencies)'
+ , iif(vstudio.isgdkconsole(cfg), '$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)'
+ , iif(vstudio.isgdkdesktop(cfg), '$(Console_Libs);%(AdditionalDependencies)'
+ , '%(AdditionalDependencies)')))
+ _p(tab, '<AdditionalDependencies>%s;%s</AdditionalDependencies>', deps, adddeps)
elseif cfg.platform == "Durango" then
_p(tab, '<AdditionalDependencies>%%(XboxExtensionsDependencies)</AdditionalDependencies>')
+ elseif vstudio.isgdkconsole(cfg) then
+ _p(tab, '<AdditionalDependencies>$(Console_Libs);%%(XboxExtensionsDependencies);%%(AdditionalDependencies)</AdditionalDependencies>')
+ elseif vstudio.isgdkdesktop(cfg) then
+ _p(tab, '<AdditionalDependencies>$(Console_Libs);%%(AdditionalDependencies)</AdditionalDependencies>')
end
end
@@ -1082,7 +1141,7 @@
,premake.esc(cfginfo.name))
vs10_clcompile(cfg)
resource_compile(cfg)
- item_def_lib(prj, cfg)
+ item_def_lib(cfg)
vc2010.link(cfg)
ant_build(prj, cfg)
event_hooks(cfg)
@@ -1092,7 +1151,6 @@
end
end
-
--
-- Retrieve a list of files for a particular build group, like
-- "ClInclude", "ClCompile", "ResourceCompile", "MASM", "None", etc.
@@ -1469,6 +1527,7 @@
function vc2010.header(targets)
io.eol = "\r\n"
_p('<?xml version="1.0" encoding="utf-8"?>')
+ _p('<!-- Generated by GENie https://github.com/bkaradzic/GENie -->')
local t = ""
if targets then
diff --git a/3rdparty/genie/src/actions/xcode/xcode10.lua b/3rdparty/genie/src/actions/xcode/xcode10.lua
index f8ae0b42cac..a412e24f048 100644
--- a/3rdparty/genie/src/actions/xcode/xcode10.lua
+++ b/3rdparty/genie/src/actions/xcode/xcode10.lua
@@ -70,7 +70,7 @@
{
trigger = "xcode10",
shortname = "Xcode 10",
- description = "Generate Apple Xcode 10 project files (experimental)",
+ description = "Generate Apple Xcode 10 project files",
os = "macosx",
valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
diff --git a/3rdparty/genie/src/actions/xcode/xcode11.lua b/3rdparty/genie/src/actions/xcode/xcode11.lua
new file mode 100644
index 00000000000..ff19bfd3793
--- /dev/null
+++ b/3rdparty/genie/src/actions/xcode/xcode11.lua
@@ -0,0 +1,91 @@
+--
+-- xcode11.lua
+-- Define the Apple XCode 11.0 action and support functions.
+--
+
+ local premake = premake
+ premake.xcode11 = { }
+
+ local xcode = premake.xcode
+ local xcode10 = premake.xcode10
+ local xcode11 = premake.xcode11
+
+ function xcode11.XCBuildConfiguration_Target(tr, target, cfg)
+ local options = xcode10.XCBuildConfiguration_Target(tr, target, cfg)
+ options.CODE_SIGN_IDENTITY = "-"
+ return options
+ end
+
+ function xcode11.project(prj)
+ local tr = xcode.buildprjtree(prj)
+ xcode.Header(tr, 48)
+ xcode.PBXBuildFile(tr)
+ xcode.PBXContainerItemProxy(tr)
+ xcode.PBXFileReference(tr,prj)
+ xcode.PBXFrameworksBuildPhase(tr)
+ xcode.PBXGroup(tr)
+ xcode.PBXNativeTarget(tr)
+ xcode.PBXProject(tr, "8.0")
+ xcode.PBXReferenceProxy(tr)
+ xcode.PBXResourcesBuildPhase(tr)
+ xcode.PBXShellScriptBuildPhase(tr)
+ xcode.PBXCopyFilesBuildPhase(tr)
+ xcode.PBXSourcesBuildPhase(tr,prj)
+ xcode.PBXVariantGroup(tr)
+ xcode.PBXTargetDependency(tr)
+ xcode.XCBuildConfiguration(tr, prj, {
+ ontarget = xcode11.XCBuildConfiguration_Target,
+ onproject = xcode10.XCBuildConfiguration_Project,
+ })
+ xcode.XCBuildConfigurationList(tr)
+ xcode.Footer(tr)
+ end
+ --]]
+
+
+--
+-- xcode11 action
+--
+
+ newaction
+ {
+ trigger = "xcode11",
+ shortname = "Xcode 11",
+ description = "Generate Apple Xcode 11 project files",
+ os = "macosx",
+
+ valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
+
+ valid_languages = { "C", "C++" },
+
+ valid_tools = {
+ cc = { "gcc" },
+ },
+
+ valid_platforms = { Native = "Native" },
+ default_platform = "Native",
+
+ onsolution = function(sln)
+ premake.generate(sln, "%%.xcworkspace/contents.xcworkspacedata", xcode.workspace_generate)
+ premake.generate(sln, "%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings", xcode.workspace_settings)
+ premake.generate(sln, "%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme", xcode.workspace_scheme)
+ end,
+
+ onproject = function(prj)
+ premake.generate(prj, "%%.xcodeproj/project.pbxproj", xcode11.project)
+ xcode.generate_schemes(prj, "%%.xcodeproj/xcshareddata/xcschemes")
+ end,
+
+ oncleanproject = function(prj)
+ premake.clean.directory(prj, "%%.xcodeproj")
+ premake.clean.directory(prj, "%%.xcworkspace")
+ end,
+
+ oncheckproject = xcode.checkproject,
+
+ xcode = {
+ iOSTargetPlatformVersion = nil,
+ macOSTargetPlatformVersion = nil,
+ tvOSTargetPlatformVersion = nil,
+ },
+ }
diff --git a/3rdparty/genie/src/actions/xcode/xcode14.lua b/3rdparty/genie/src/actions/xcode/xcode14.lua
new file mode 100644
index 00000000000..2b17166ad0c
--- /dev/null
+++ b/3rdparty/genie/src/actions/xcode/xcode14.lua
@@ -0,0 +1,121 @@
+--
+-- xcode14.lua
+-- Define the Apple XCode 14.0 action and support functions.
+--
+
+ local premake = premake
+ premake.xcode14 = { }
+
+ local xcode = premake.xcode
+ local xcode10 = premake.xcode10
+ local xcode11 = premake.xcode11
+ local xcode14 = premake.xcode14
+
+ function xcode14.XCBuildConfiguration_Target(tr, target, cfg)
+ local options = xcode11.XCBuildConfiguration_Target(tr, target, cfg)
+ options.CODE_SIGN_IDENTITY = "-"
+
+ local action = premake.action.current()
+ xcode.setdeploymenttarget(cfg, action.xcode, options)
+
+ local iosversion = options.IPHONEOS_DEPLOYMENT_TARGET
+ local macosversion = options.MACOSX_DEPLOYMENT_TARGET
+ local tvosversion = options.TVOS_DEPLOYMENT_TARGET
+
+ if iosversion and not xcode.versionge(iosversion, "11") then
+ error("XCode14 does not support deployment for iOS older than 11")
+ elseif macosversion and not xcode.versionge(macosversion, "10.13") then
+ error("XCode14 does not support deployment for macOS older than 10.13")
+ elseif tvosversion and not xcode.versionge(tvosversion, "11") then
+ error("XCode14 does not support deployment for tvOS older than 11")
+ end
+
+ return options
+ end
+
+ function xcode14.XCBuildConfiguration_Project(tr, prj, cfg)
+ local options = xcode10.XCBuildConfiguration_Project(tr, prj, cfg)
+
+ options.ENABLE_BITCODE = "NO" -- Bitcode is now deprecated.
+
+ -- We need to set the deployment target for both target
+ -- and project. XCode will complain, otherwise.
+ local action = premake.action.current()
+ xcode.setdeploymenttarget(cfg, action.xcode, options)
+
+ return options
+ end
+
+ function xcode14.project(prj)
+ local tr = xcode.buildprjtree(prj)
+ xcode.Header(tr, 48)
+ xcode.PBXBuildFile(tr)
+ xcode.PBXContainerItemProxy(tr)
+ xcode.PBXFileReference(tr,prj)
+ xcode.PBXFrameworksBuildPhase(tr)
+ xcode.PBXGroup(tr)
+ xcode.PBXNativeTarget(tr)
+ xcode.PBXProject(tr, "8.0")
+ xcode.PBXReferenceProxy(tr)
+ xcode.PBXResourcesBuildPhase(tr)
+ xcode.PBXShellScriptBuildPhase(tr)
+ xcode.PBXCopyFilesBuildPhase(tr)
+ xcode.PBXSourcesBuildPhase(tr,prj)
+ xcode.PBXVariantGroup(tr)
+ xcode.PBXTargetDependency(tr)
+ xcode.XCBuildConfiguration(tr, prj, {
+ ontarget = xcode14.XCBuildConfiguration_Target,
+ onproject = xcode14.XCBuildConfiguration_Project,
+ })
+ xcode.XCBuildConfigurationList(tr)
+ xcode.Footer(tr)
+ end
+ --]]
+
+
+--
+-- xcode14 action
+--
+
+ newaction
+ {
+ trigger = "xcode14",
+ shortname = "Xcode 14",
+ description = "Generate Apple Xcode 14 project files",
+ os = "macosx",
+
+ valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
+
+ valid_languages = { "C", "C++" },
+
+ valid_tools = {
+ cc = { "gcc" },
+ },
+
+ valid_platforms = { Native = "Native" },
+ default_platform = "Native",
+
+ onsolution = function(sln)
+ premake.generate(sln, "%%.xcworkspace/contents.xcworkspacedata", xcode.workspace_generate)
+ premake.generate(sln, "%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings", xcode.workspace_settings)
+ premake.generate(sln, "%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme", xcode.workspace_scheme)
+ end,
+
+ onproject = function(prj)
+ premake.generate(prj, "%%.xcodeproj/project.pbxproj", xcode14.project)
+ xcode.generate_schemes(prj, "%%.xcodeproj/xcshareddata/xcschemes")
+ end,
+
+ oncleanproject = function(prj)
+ premake.clean.directory(prj, "%%.xcodeproj")
+ premake.clean.directory(prj, "%%.xcworkspace")
+ end,
+
+ oncheckproject = xcode.checkproject,
+
+ xcode = {
+ iOSTargetPlatformVersion = nil,
+ macOSTargetPlatformVersion = nil,
+ tvOSTargetPlatformVersion = nil,
+ },
+ }
diff --git a/3rdparty/genie/src/actions/xcode/xcode15.lua b/3rdparty/genie/src/actions/xcode/xcode15.lua
new file mode 100644
index 00000000000..8d98f2c5715
--- /dev/null
+++ b/3rdparty/genie/src/actions/xcode/xcode15.lua
@@ -0,0 +1,124 @@
+--
+-- xcode15.lua
+-- Define the Apple XCode 15.0 action and support functions.
+--
+
+ local premake = premake
+ premake.xcode15 = { }
+
+ local xcode = premake.xcode
+ local xcode10 = premake.xcode10
+ local xcode11 = premake.xcode11
+ local xcode14 = premake.xcode14
+ local xcode15 = premake.xcode15
+
+ function xcode15.XCBuildConfiguration_Target(tr, target, cfg)
+ local options = xcode11.XCBuildConfiguration_Target(tr, target, cfg)
+ options.CODE_SIGN_IDENTITY = "-"
+
+ local action = premake.action.current()
+ xcode.setdeploymenttarget(cfg, action.xcode, options)
+
+ local iosversion = options.IPHONEOS_DEPLOYMENT_TARGET
+ local macosversion = options.MACOSX_DEPLOYMENT_TARGET
+ local tvosversion = options.TVOS_DEPLOYMENT_TARGET
+ local xrosversion = options.XROS_DEPLOYMENT_TARGET
+
+ if iosversion and not xcode.versionge(iosversion, "12") then
+ error("XCode15 does not support deployment for iOS older than 12")
+ elseif macosversion and not xcode.versionge(macosversion, "13.5") then
+ error("XCode15 does not support deployment for macOS older than 13.5")
+ elseif tvosversion and not xcode.versionge(tvosversion, "12") then
+ error("XCode15 does not support deployment for tvOS older than 12")
+ elseif xrosversion and not xcode.versionge(xrosversion, "1.0") then
+ error("XCode15 does not support deployment for visionOS older than 1.0")
+ end
+
+ return options
+ end
+
+ function xcode15.XCBuildConfiguration_Project(tr, prj, cfg)
+ local options = xcode10.XCBuildConfiguration_Project(tr, prj, cfg)
+
+ -- We need to set the deployment target for both target
+ -- and project. XCode will complain, otherwise.
+ local action = premake.action.current()
+ xcode.setdeploymenttarget(cfg, action.xcode, options)
+
+ return options
+ end
+
+ function xcode15.project(prj)
+ local tr = xcode.buildprjtree(prj)
+ xcode.Header(tr, 48)
+ xcode.PBXBuildFile(tr)
+ xcode.PBXContainerItemProxy(tr)
+ xcode.PBXFileReference(tr,prj)
+ xcode.PBXFrameworksBuildPhase(tr)
+ xcode.PBXGroup(tr)
+ xcode.PBXNativeTarget(tr)
+ xcode.PBXProject(tr, "8.0")
+ xcode.PBXReferenceProxy(tr)
+ xcode.PBXResourcesBuildPhase(tr)
+ xcode.PBXShellScriptBuildPhase(tr)
+ xcode.PBXCopyFilesBuildPhase(tr)
+ xcode.PBXSourcesBuildPhase(tr,prj)
+ xcode.PBXVariantGroup(tr)
+ xcode.PBXTargetDependency(tr)
+ xcode.XCBuildConfiguration(tr, prj, {
+ ontarget = xcode15.XCBuildConfiguration_Target,
+ onproject = xcode15.XCBuildConfiguration_Project,
+ })
+ xcode.XCBuildConfigurationList(tr)
+ xcode.Footer(tr)
+ end
+ --]]
+
+
+--
+-- xcode15 action
+--
+
+ newaction
+ {
+ trigger = "xcode15",
+ shortname = "Xcode 15",
+ description = "Generate Apple Xcode 15 project files",
+ os = "macosx",
+
+ valid_kinds = { "ConsoleApp", "WindowedApp", "StaticLib", "SharedLib", "Bundle" },
+
+ valid_languages = { "C", "C++" },
+
+ valid_tools = {
+ cc = { "gcc" },
+ },
+
+ valid_platforms = { Native = "Native" },
+ default_platform = "Native",
+
+ onsolution = function(sln)
+ premake.generate(sln, "%%.xcworkspace/contents.xcworkspacedata", xcode.workspace_generate)
+ premake.generate(sln, "%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings", xcode.workspace_settings)
+ premake.generate(sln, "%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme", xcode.workspace_scheme)
+ end,
+
+ onproject = function(prj)
+ premake.generate(prj, "%%.xcodeproj/project.pbxproj", xcode15.project)
+ xcode.generate_schemes(prj, "%%.xcodeproj/xcshareddata/xcschemes")
+ end,
+
+ oncleanproject = function(prj)
+ premake.clean.directory(prj, "%%.xcodeproj")
+ premake.clean.directory(prj, "%%.xcworkspace")
+ end,
+
+ oncheckproject = xcode.checkproject,
+
+ xcode = {
+ iOSTargetPlatformVersion = nil,
+ macOSTargetPlatformVersion = nil,
+ tvOSTargetPlatformVersion = nil,
+ visionOSTargetPlatformVersion = nil,
+ },
+ }
diff --git a/3rdparty/genie/src/actions/xcode/xcode8.lua b/3rdparty/genie/src/actions/xcode/xcode8.lua
index 5a658c992fd..c7e1801f166 100644
--- a/3rdparty/genie/src/actions/xcode/xcode8.lua
+++ b/3rdparty/genie/src/actions/xcode/xcode8.lua
@@ -45,10 +45,11 @@
options.CLANG_ENABLE_OBJC_ARC = "YES"
end
- local outdir = path.getdirectory(cfg.buildtarget.bundlepath)
- if outdir ~= "." then
- options.CONFIGURATION_BUILD_DIR = outdir
- end
+-- local outdir = path.getdirectory(cfg.buildtarget.directory)
+-- if outdir ~= "." then
+-- options.CONFIGURATION_BUILD_DIR = outdir
+-- end
+ options.CONFIGURATION_BUILD_DIR = "$(SYSROOT)"
if tr.infoplist then
options.INFOPLIST_FILE = tr.infoplist.cfg.name
@@ -68,21 +69,7 @@
end
local action = premake.action.current()
- local get_opt = function(opt, def)
- return (opt and #opt > 0) and opt or def
- end
-
- local iosversion = get_opt(cfg.iostargetplatformversion, action.xcode.iOSTargetPlatformVersion)
- local macosversion = get_opt(cfg.macostargetplatformversion, action.xcode.macOSTargetPlatformVersion)
- local tvosversion = get_opt(cfg.tvostargetplatformversion, action.xcode.tvOSTargetPlatformVersion)
-
- if iosversion then
- options.IPHONEOS_DEPLOYMENT_TARGET = iosversion
- elseif macosversion then
- options.MACOSX_DEPLOYMENT_TARGET = macosversion
- elseif tvosversion then
- options.TVOS_DEPLOYMENT_TARGET = tvosversion
- end
+ xcode.setdeploymenttarget(cfg, action.xcode, options)
if cfg.kind == "Bundle" and not cfg.options.SkipBundling then
options.PRODUCT_BUNDLE_IDENTIFIER = "genie." .. cfg.buildtarget.basename:gsub("%s+", ".") --replace spaces with .
@@ -132,6 +119,11 @@
end
end
+ local defines = {}
+ for k, v in pairs(cfg.defines or {}) do
+ defines[k] = v:gsub('[\'"\\\n\r\t ]', function (c) return ({ ['\n'] = '\\n', ['\r'] = '\\r', ['\t'] = '\\t' })[c] or '\\'..c end)
+ end
+
-- options table to return
local options = {
ARCHS = archs[cfg.platform],
@@ -149,7 +141,7 @@
ENABLE_TESTABILITY = "YES",
GCC_C_LANGUAGE_STANDARD = "gnu99",
GCC_NO_COMMON_BLOCKS = "YES",
- GCC_PREPROCESSOR_DEFINITIONS = cfg.defines,
+ GCC_PREPROCESSOR_DEFINITIONS = defines,
GCC_SYMBOLS_PRIVATE_EXTERN = "NO",
GCC_WARN_64_TO_32_BIT_CONVERSION = "YES",
GCC_WARN_ABOUT_RETURN_TYPE = "YES",
diff --git a/3rdparty/genie/src/actions/xcode/xcode9.lua b/3rdparty/genie/src/actions/xcode/xcode9.lua
index aa70275bdda..0578e8af4d3 100644
--- a/3rdparty/genie/src/actions/xcode/xcode9.lua
+++ b/3rdparty/genie/src/actions/xcode/xcode9.lua
@@ -13,8 +13,10 @@
function xcode9.XCBuildConfiguration_Project(tr, prj, cfg)
local options = xcode8.XCBuildConfiguration_Project(tr, prj, cfg)
- if cfg.flags.Cpp17 or cfg.flags.CppLatest then
+ if cfg.flags.Cpp17 then
options.CLANG_CXX_LANGUAGE_STANDARD = "c++17"
+ elseif cfg.flags.Cpp20 or cfg.flags.CppLatest then
+ options.CLANG_CXX_LANGUAGE_STANDARD = "c++20"
end
return table.merge(options, {
diff --git a/3rdparty/genie/src/actions/xcode/xcode_common.lua b/3rdparty/genie/src/actions/xcode/xcode_common.lua
index 762c27aada1..ddb1d39aec3 100644
--- a/3rdparty/genie/src/actions/xcode/xcode_common.lua
+++ b/3rdparty/genie/src/actions/xcode/xcode_common.lua
@@ -396,6 +396,37 @@
return "\"" .. str:gsub("[\"\\\"]", "\\%0") .. "\""
end
+--
+-- Set the deployment target in the project or target options.
+--
+-- @param cfg
+-- The configuration in use.
+-- @param def
+-- The default version overrides.
+-- @param opts
+-- The options to set deployment target in.
+--
+
+ function xcode.setdeploymenttarget(cfg, def, opts)
+ local get_opt = function(opt, def)
+ return (opt and #opt > 0) and opt or def
+ end
+
+ local iosversion = get_opt(cfg.iostargetplatformversion, def.iOSTargetPlatformVersion)
+ local macosversion = get_opt(cfg.macostargetplatformversion, def.macOSTargetPlatformVersion)
+ local tvosversion = get_opt(cfg.tvostargetplatformversion, def.tvOSTargetPlatformVersion)
+ local visionosversion = get_opt(cfg.visionostargetplatformversion, def.visionOSTargetPlatformVersion)
+
+ if iosversion then
+ opts.IPHONEOS_DEPLOYMENT_TARGET = iosversion
+ elseif macosversion then
+ opts.MACOSX_DEPLOYMENT_TARGET = macosversion
+ elseif tvosversion then
+ opts.TVOS_DEPLOYMENT_TARGET = tvosversion
+ elseif visionosversion then
+ opts.XROS_DEPLOYMENT_TARGET = tvosversion
+ end
+ end
---------------------------------------------------------------------------
@@ -405,6 +436,7 @@
function xcode.Header(tr, objversion)
_p('// !$*UTF8*$!')
+ _p('// Generated by GENie https://github.com/bkaradzic/GENie')
_p('{')
_p(1,'archiveVersion = 1;')
_p(1,'classes = {')
@@ -1269,6 +1301,21 @@ end
_p('')
end
+ function xcode.versionge(version, reference)
+ local vparts = string.explode(version, ".", true)
+ local rparts = string.explode(reference, ".", true)
+
+ for i=1,#rparts do
+ local rnum = tonumber(rparts[i]) or 0
+ local vnum = tonumber(vparts[i]) or 0
+
+ if vnum < rnum then
+ return false
+ end
+ end
+
+ return true
+ end
function xcode.Footer()
_p(1,'};')
diff --git a/3rdparty/genie/src/actions/xcode/xcode_scheme.lua b/3rdparty/genie/src/actions/xcode/xcode_scheme.lua
index 662582e2afb..236d6fa365a 100644
--- a/3rdparty/genie/src/actions/xcode/xcode_scheme.lua
+++ b/3rdparty/genie/src/actions/xcode/xcode_scheme.lua
@@ -16,7 +16,7 @@ local xcode = premake.xcode
_p(indent + 0, '<BuildableReference')
_p(indent + 1, 'BuildableIdentifier = "primary"')
_p(indent + 1, 'BlueprintIdentifier = "%s"', prj.xcode.projectnode.targetid)
- _p(indent + 1, 'BuildableName = "%s"', cfg.buildtarget.name)
+ _p(indent + 1, 'BuildableName = "%s.app"', cfg.buildtarget.name)
_p(indent + 1, 'BlueprintName = "%s"', prj.name)
_p(indent + 1, 'ReferencedContainer = "container:%s.xcodeproj">', prj.name)
_p(indent + 0, '</BuildableReference>')
@@ -172,7 +172,7 @@ local xcode = premake.xcode
_p(2, 'useCustomWorkingDirectory = "NO"')
end
_p(2, 'ignoresPersistentStateOnLaunch = "NO"')
- _p(2, 'debugDocumentVersioning = "YES"')
+ _p(2, 'debugDocumentVersioning = "NO"')
_p(2, 'debugServiceExtension = "internal"')
_p(2, 'allowLocationSimulation = "YES">')
if debugcfg.debugcmd then
@@ -201,7 +201,7 @@ local xcode = premake.xcode
else
_p(2, 'useCustomWorkingDirectory = "NO"')
end
- _p(2, 'debugDocumentVersioning = "YES">')
+ _p(2, 'debugDocumentVersioning = "NO">')
_p(2, '<BuildableProductRunnable')
_p(3, 'runnableDebuggingMode = "0">')
buildableref(3, primary, releasecfg)
@@ -237,3 +237,4 @@ local xcode = premake.xcode
end
end
end
+
diff --git a/3rdparty/genie/src/actions/xcode/xcode_workspace.lua b/3rdparty/genie/src/actions/xcode/xcode_workspace.lua
index ed0542258e7..018b5607a7f 100644
--- a/3rdparty/genie/src/actions/xcode/xcode_workspace.lua
+++ b/3rdparty/genie/src/actions/xcode/xcode_workspace.lua
@@ -5,6 +5,7 @@ xcode.allscheme = false
function xcode.workspace_head()
_p('<?xml version="1.0" encoding="UTF-8"?>')
+ _p('<!-- Generated by GENie https://github.com/bkaradzic/GENie -->')
_p('<Workspace')
_p(1,'version = "1.0">')
end
diff --git a/3rdparty/genie/src/base/api.lua b/3rdparty/genie/src/base/api.lua
index a5aa0472f7c..4a3e8bd5ec6 100644
--- a/3rdparty/genie/src/base/api.lua
+++ b/3rdparty/genie/src/base/api.lua
@@ -818,11 +818,11 @@ end
allowed = function(value)
local allowed_flags = {
AntBuildDebuggable = 1,
- ATL = 1,
C7DebugInfo = 1,
Cpp11 = 1,
Cpp14 = 1,
Cpp17 = 1,
+ Cpp20 = 1,
CppLatest = 1,
DebugEnvsDontMerge = 1,
DebugEnvsInherit = 1,
@@ -843,7 +843,6 @@ end
LinkSupportCircularDependencies = 1,
Managed = 1,
MinimumWarnings = 1,
- MFC = 1,
NativeWChar = 1,
No64BitChecks = 1,
NoBufferSecurityCheck = 1,
@@ -872,7 +871,6 @@ end
DebugRuntime = 1,
ReleaseRuntime = 1,
SEH = 1,
- StaticATL = 1,
StaticRuntime = 1,
Symbols = 1,
Unicode = 1,
@@ -943,6 +941,12 @@ end
}
newapifield {
+ name = "visionostargetplatformversion",
+ kind = "string",
+ scope = "project",
+ }
+
+ newapifield {
name = "windowstargetplatformversion",
kind = "string",
scope = "project",
diff --git a/3rdparty/genie/src/base/bake.lua b/3rdparty/genie/src/base/bake.lua
index 9d69487e6d7..221cb623fcf 100644
--- a/3rdparty/genie/src/base/bake.lua
+++ b/3rdparty/genie/src/base/bake.lua
@@ -162,15 +162,20 @@
end
end
- local function removevalues(tbl, removes)
+ local function removevalues(tbl, removes)
+ for i = #tbl, 1, -1 do
+ for _, pattern in ipairs(removes) do
+ if pattern == tbl[i] then
+ table.remove(tbl, i)
+ break
+ end
+ end
+ end
+
for k, v in pairs(tbl) do
for _, pattern in ipairs(removes) do
if pattern == tbl[k] then
- if type(k) == "number" then
- table.remove(tbl, k)
- else
- tbl[k] = nil
- end
+ tbl[k] = nil
break
end
end
diff --git a/3rdparty/genie/src/base/cmdline.lua b/3rdparty/genie/src/base/cmdline.lua
index c3357b702ae..0127ceff327 100644
--- a/3rdparty/genie/src/base/cmdline.lua
+++ b/3rdparty/genie/src/base/cmdline.lua
@@ -76,7 +76,13 @@
{ "xbox360", "Xbox 360" },
{ "durango", "Xbox One" },
{ "ARM", "ARM" },
+ { "ARM64", "ARM64" },
{ "PowerPC", "PowerPC" },
+ { "nx32", "Nintendo Switch, 32-bit only" },
+ { "nx64", "Nintendo Switch, 64-bit only" },
+ { "gdk-desktop", "GDK Windows Desktop" },
+ { "gdk-xboxone", "GDK Xbox One" },
+ { "gdk-scarlett","GDK Xbox Scarlett" },
}
}
diff --git a/3rdparty/genie/src/base/config.lua b/3rdparty/genie/src/base/config.lua
index eec1ad67499..a255c7cca67 100644
--- a/3rdparty/genie/src/base/config.lua
+++ b/3rdparty/genie/src/base/config.lua
@@ -104,3 +104,4 @@
end
return true
end
+
diff --git a/3rdparty/genie/src/base/globals.lua b/3rdparty/genie/src/base/globals.lua
index d24b66f163d..cb6c0f089b0 100644
--- a/3rdparty/genie/src/base/globals.lua
+++ b/3rdparty/genie/src/base/globals.lua
@@ -67,6 +67,11 @@
cfgsuffix = "ARM",
iscrosscompiler = true,
},
+ ARM64 =
+ {
+ cfgsuffix = "ARM64",
+ iscrosscompiler = true,
+ },
Orbis =
{
cfgsuffix = "orbis",
@@ -105,6 +110,21 @@
nosharedlibs = true,
namestyle = "Emscripten",
},
+ ["gdk-desktop"] =
+ {
+ cfgsuffix = "gdk-desktop",
+ namestyle = "windows",
+ },
+ ["gdk-xboxone"] =
+ {
+ cfgsuffix = "gdk-xboxone",
+ namestyle = "windows",
+ },
+ ["gdk-scarlett"] =
+ {
+ cfgsuffix = "gdk-scarlett",
+ namestyle = "windows",
+ },
}
diff --git a/3rdparty/genie/src/base/os.lua b/3rdparty/genie/src/base/os.lua
index ae88c0ad949..3cddcbb45c3 100644
--- a/3rdparty/genie/src/base/os.lua
+++ b/3rdparty/genie/src/base/os.lua
@@ -122,7 +122,8 @@
"amd64",
"ppc64",
"powerpc64",
- "sparc64"
+ "sparc64",
+ "arm64"
}
function os.is64bit()
diff --git a/3rdparty/genie/src/base/path.lua b/3rdparty/genie/src/base/path.lua
index ae2561ac07e..d9eb936c414 100644
--- a/3rdparty/genie/src/base/path.lua
+++ b/3rdparty/genie/src/base/path.lua
@@ -172,6 +172,10 @@
return path.hasextension(fname, { ".h", ".hh", ".hpp", ".hxx" })
end
+ function path.iscppmodule(fname)
+ return path.hasextension(fname, { ".ixx", ".cppm" })
+ end
+
function path.isappxmanifest(fname)
return path.hasextension(fname, ".appxmanifest")
end
@@ -192,6 +196,11 @@
return path.hasextension(fname, ".vala")
end
+ function path.isgresource(fname)
+ local ending = ".gresource.xml"
+ return ending == "" or fname:sub(-#ending) == ending
+ end
+
function path.isswiftfile(fname)
return path.hasextension(fname, ".swift")
end
@@ -208,6 +217,7 @@
function path.issourcefilevs(fname)
return path.hasextension(fname, { ".cc", ".cpp", ".cxx", ".c++", ".c" })
or path.iscxfile(fname)
+ or path.iscppmodule(fname)
end
--
diff --git a/3rdparty/genie/src/base/project.lua b/3rdparty/genie/src/base/project.lua
index 1c817c4168c..ad12830ed7b 100644
--- a/3rdparty/genie/src/base/project.lua
+++ b/3rdparty/genie/src/base/project.lua
@@ -463,7 +463,7 @@
-- Fix things up based on the current system
local kind = cfg.kind
- if premake.iscppproject(cfg) then
+ if premake.iscppproject(cfg) or premake.isvalaproject(cfg) then
-- On Windows, shared libraries link against a static import library
if (namestyle == "windows" or system == "windows")
and kind == "SharedLib" and direction == "link"
@@ -559,7 +559,7 @@
if kind == "ConsoleApp" or kind == "WindowedApp" then
ext = ".html"
elseif kind == "StaticLib" then
- ext = ".bc"
+ ext = ".a"
elseif kind == "SharedLib" then
ext = ".js"
end
@@ -595,8 +595,8 @@
-- any relevant command-line options.
--
- function premake.gettool(cfg)
- if premake.iscppproject(cfg) then
+ function premake.gettool(prj)
+ if premake.iscppproject(prj) then
if _OPTIONS.cc then
return premake[_OPTIONS.cc]
end
@@ -605,9 +605,9 @@
return premake[action.valid_tools.cc[1]]
end
return premake.gcc
- elseif premake.isdotnetproject(cfg) then
+ elseif premake.isdotnetproject(prj) then
return premake.dotnet
- elseif premake.isswiftproject(cfg) then
+ elseif premake.isswiftproject(prj) then
return premake.swift
else
return premake.valac
@@ -631,7 +631,7 @@
local fname = path.getname(abspath)
local max = abspath:len() - fname:len()
-
+
-- First check for an exact match from the inverse vpaths
if prj.inversevpaths and prj.inversevpaths[abspath] then
return path.join(prj.inversevpaths[abspath], fname)
@@ -687,7 +687,7 @@
end
end
end
-
+
if #matches > 0 then
-- for the sake of determinism, return the first alphabetically
table.sort(matches)
@@ -731,7 +731,8 @@
--
function premake.project.iscproject(prj)
- return prj.language == "C"
+ local language = prj.language or prj.solution.language
+ return language == "C"
end
@@ -740,7 +741,8 @@
--
function premake.iscppproject(prj)
- return (prj.language == "C" or prj.language == "C++")
+ local language = prj.language or prj.solution.language
+ return (language == "C" or language == "C++")
end
@@ -750,7 +752,8 @@
--
function premake.isdotnetproject(prj)
- return (prj.language == "C#")
+ local language = prj.language or prj.solution.language
+ return (language == "C#")
end
--
@@ -758,7 +761,8 @@
--
function premake.isvalaproject(prj)
- return (prj.language == "Vala")
+ local language = prj.language or prj.solution.language
+ return (language == "Vala")
end
--
@@ -766,5 +770,6 @@
--
function premake.isswiftproject(prj)
- return (prj.language == "Swift")
+ local language = prj.language or prj.solution.language
+ return (language == "Swift")
end
diff --git a/3rdparty/genie/src/host/premake.c b/3rdparty/genie/src/host/premake.c
index a8ad1140912..52d365a5848 100644
--- a/3rdparty/genie/src/host/premake.c
+++ b/3rdparty/genie/src/host/premake.c
@@ -130,6 +130,8 @@ int premake_locate(lua_State* L, const char* argv0)
char buffer[PATH_MAX];
const char* path = NULL;
+ memset(buffer, 0, PATH_MAX);
+
#if PLATFORM_WINDOWS
DWORD len = GetModuleFileName(NULL, buffer, PATH_MAX);
if (len > 0)
diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c
index f93d3547332..10f380bc60c 100644
--- a/3rdparty/genie/src/host/scripts.c
+++ b/3rdparty/genie/src/host/scripts.c
@@ -5,17 +5,18 @@
const char* builtin_scripts[] = {
/* base/os.lua */
"function os.executef(cmd, ...)\nlocal arg={...}\ncmd = string.format(cmd, table.unpack(arg))\nreturn os.execute(cmd)\nend\nlocal function parse_ld_so_conf(conf_file)\nlocal first, last\nlocal dirs = { }\nlocal file = io.open(conf_file)\nif file == nil then\nreturn dirs\nend\nfor line in file:lines() do\nfirst = line:find(\"#\", 1, true)\nif first ~= nil then\nline = line:sub(1, first - 1)\nend\nif line ~= \"\" then\nfirst, last = line:find(\"include%s+\")\nif first ~= nil then\nlocal include_glob = line:sub(last + 1)\nlocal includes = os.matchfiles(include_glob)\nfor _, v in ipairs(includes) do\ndirs = table.join(dirs, parse_ld_so_conf(v))\nend\nelse\ntable.insert(dirs, line)\nend\nend\nend\nreturn dirs\nend\nfunction os.findlib(libname)\nlocal path, formats\nif os.is(\"windows\") then\nformats = { \"%s.dll\", \"%s\" }\npath = os.getenv(\"PATH\")\nelse\nif os.is(\"macosx\") then\nformats = { \"lib%s.dylib\", \"%s.dylib\" }\npath = os.getenv(\"DYLD_LIBRARY_PATH\")\nelse\nformats = { \"lib%s.so\", \"%s.so\" }\np"
- "ath = os.getenv(\"LD_LIBRARY_PATH\") or \"\"\nfor _, v in ipairs(parse_ld_so_conf(\"/etc/ld.so.conf\")) do\npath = path .. \":\" .. v\nend\nend\ntable.insert(formats, \"%s\")\npath = path or \"\"\nif os.is64bit() then\npath = path .. \":/lib64:/usr/lib64/:usr/local/lib64\"\nend\npath = path .. \":/lib:/usr/lib:/usr/local/lib\"\nend\nfor _, fmt in ipairs(formats) do\nlocal name = string.format(fmt, libname)\nlocal result = os.pathsearch(name, path)\nif result then return result end\nend\nend\nfunction os.get()\nreturn _OPTIONS.os or _OS\nend\nfunction os.is(id)\nreturn (os.get():lower() == id:lower())\nend\nlocal _64BitHostTypes = {\n\"x86_64\",\n\"ia64\",\n\"amd64\",\n\"ppc64\",\n\"powerpc64\",\n\"sparc64\"\n}\nfunction os.is64bit()\nif (os._is64bit()) then\nreturn true\nend\nlocal arch = \"\"\nif _OS == \"windows\" then\narch = os.getenv(\"PROCESSOR_ARCHITECTURE\")\nelseif _OS == \"macosx\" then\narch = os.outputof(\"echo $HOSTTYPE\")\nelse\narch = os.outputof(\"uname -m\")\nend\nif nil ~= arch then\narch = a"
- "rch:lower()\nfor _, hosttype in ipairs(_64BitHostTypes) do\nif arch:find(hosttype) then\nreturn true\nend\nend\nend\nreturn false\nend\nlocal function domatch(result, mask, wantfiles)\nif mask:startswith(\"./\") then\nmask = mask:sub(3)\nend\nlocal basedir = mask\nlocal starpos = mask:find(\"%*\")\nif starpos then\nbasedir = basedir:sub(1, starpos - 1)\nend\nbasedir = path.getdirectory(basedir)\nif (basedir == \".\") then basedir = \"\" end\nlocal recurse = mask:find(\"**\", nil, true)\nmask = path.wildcards(mask)\nlocal function matchwalker(basedir)\nlocal wildcard = path.join(basedir, \"*\")\nlocal m = os.matchstart(wildcard)\nwhile (os.matchnext(m)) do\nlocal isfile = os.matchisfile(m)\nif ((wantfiles and isfile) or (not wantfiles and not isfile)) then\nlocal fname = path.join(basedir, os.matchname(m))\nif fname:match(mask) == fname then\ntable.insert(result, fname)\nend\nend\nend\nos.matchdone(m)\nif recurse then\nm = os.matchstart(wildcard)\nwhile (os.matchnext(m)) do\nif not os.matchisfile(m) then\nlocal"
- " dirname = os.matchname(m)\nmatchwalker(path.join(basedir, dirname))\nend\nend\nos.matchdone(m)\nend\nend\nmatchwalker(basedir)\nend\nfunction os.matchdirs(...)\nlocal arg={...}\nlocal result = { }\nfor _, mask in ipairs(arg) do\ndomatch(result, mask, false)\nend\nreturn result\nend\nfunction os.matchfiles(...)\nlocal arg={...}\nlocal result = { }\nfor _, mask in ipairs(arg) do\ndomatch(result, mask, true)\nend\nreturn result\nend\nlocal builtin_mkdir = os.mkdir\nfunction os.mkdir(p)\nlocal dir = iif(p:startswith(\"/\"), \"/\", \"\")\nfor part in p:gmatch(\"[^/]+\") do\ndir = dir .. part\nif (part ~= \"\" and not path.isabsolute(part) and not os.isdir(dir)) then\nlocal ok, err = builtin_mkdir(dir)\nif (not ok) then\nreturn nil, err\nend\nend\ndir = dir .. \"/\"\nend\nreturn true\nend\nfunction os.outputof(cmd)\nlocal pipe = io.popen(cmd)\nlocal result = pipe:read('*a')\npipe:close()\nreturn result\nend\nlocal builtin_rmdir = os.rmdir\nfunction os.rmdir(p)\nlocal dirs = os.matchdirs(p .. \"/*\")\nfor _, dname i"
- "n ipairs(dirs) do\nos.rmdir(dname)\nend\nlocal files = os.matchfiles(p .. \"/*\")\nfor _, fname in ipairs(files) do\nos.remove(fname)\nend\nbuiltin_rmdir(p)\nend\n",
+ "ath = os.getenv(\"LD_LIBRARY_PATH\") or \"\"\nfor _, v in ipairs(parse_ld_so_conf(\"/etc/ld.so.conf\")) do\npath = path .. \":\" .. v\nend\nend\ntable.insert(formats, \"%s\")\npath = path or \"\"\nif os.is64bit() then\npath = path .. \":/lib64:/usr/lib64/:usr/local/lib64\"\nend\npath = path .. \":/lib:/usr/lib:/usr/local/lib\"\nend\nfor _, fmt in ipairs(formats) do\nlocal name = string.format(fmt, libname)\nlocal result = os.pathsearch(name, path)\nif result then return result end\nend\nend\nfunction os.get()\nreturn _OPTIONS.os or _OS\nend\nfunction os.is(id)\nreturn (os.get():lower() == id:lower())\nend\nlocal _64BitHostTypes = {\n\"x86_64\",\n\"ia64\",\n\"amd64\",\n\"ppc64\",\n\"powerpc64\",\n\"sparc64\",\n\"arm64\"\n}\nfunction os.is64bit()\nif (os._is64bit()) then\nreturn true\nend\nlocal arch = \"\"\nif _OS == \"windows\" then\narch = os.getenv(\"PROCESSOR_ARCHITECTURE\")\nelseif _OS == \"macosx\" then\narch = os.outputof(\"echo $HOSTTYPE\")\nelse\narch = os.outputof(\"uname -m\")\nend\nif nil ~= arch th"
+ "en\narch = arch:lower()\nfor _, hosttype in ipairs(_64BitHostTypes) do\nif arch:find(hosttype) then\nreturn true\nend\nend\nend\nreturn false\nend\nlocal function domatch(result, mask, wantfiles)\nif mask:startswith(\"./\") then\nmask = mask:sub(3)\nend\nlocal basedir = mask\nlocal starpos = mask:find(\"%*\")\nif starpos then\nbasedir = basedir:sub(1, starpos - 1)\nend\nbasedir = path.getdirectory(basedir)\nif (basedir == \".\") then basedir = \"\" end\nlocal recurse = mask:find(\"**\", nil, true)\nmask = path.wildcards(mask)\nlocal function matchwalker(basedir)\nlocal wildcard = path.join(basedir, \"*\")\nlocal m = os.matchstart(wildcard)\nwhile (os.matchnext(m)) do\nlocal isfile = os.matchisfile(m)\nif ((wantfiles and isfile) or (not wantfiles and not isfile)) then\nlocal fname = path.join(basedir, os.matchname(m))\nif fname:match(mask) == fname then\ntable.insert(result, fname)\nend\nend\nend\nos.matchdone(m)\nif recurse then\nm = os.matchstart(wildcard)\nwhile (os.matchnext(m)) do\nif not os.matchisfile(m)"
+ " then\nlocal dirname = os.matchname(m)\nmatchwalker(path.join(basedir, dirname))\nend\nend\nos.matchdone(m)\nend\nend\nmatchwalker(basedir)\nend\nfunction os.matchdirs(...)\nlocal arg={...}\nlocal result = { }\nfor _, mask in ipairs(arg) do\ndomatch(result, mask, false)\nend\nreturn result\nend\nfunction os.matchfiles(...)\nlocal arg={...}\nlocal result = { }\nfor _, mask in ipairs(arg) do\ndomatch(result, mask, true)\nend\nreturn result\nend\nlocal builtin_mkdir = os.mkdir\nfunction os.mkdir(p)\nlocal dir = iif(p:startswith(\"/\"), \"/\", \"\")\nfor part in p:gmatch(\"[^/]+\") do\ndir = dir .. part\nif (part ~= \"\" and not path.isabsolute(part) and not os.isdir(dir)) then\nlocal ok, err = builtin_mkdir(dir)\nif (not ok) then\nreturn nil, err\nend\nend\ndir = dir .. \"/\"\nend\nreturn true\nend\nfunction os.outputof(cmd)\nlocal pipe = io.popen(cmd)\nlocal result = pipe:read('*a')\npipe:close()\nreturn result\nend\nlocal builtin_rmdir = os.rmdir\nfunction os.rmdir(p)\nlocal dirs = os.matchdirs(p .. \"/*\")\nfo"
+ "r _, dname in ipairs(dirs) do\nos.rmdir(dname)\nend\nlocal files = os.matchfiles(p .. \"/*\")\nfor _, fname in ipairs(files) do\nos.remove(fname)\nend\nbuiltin_rmdir(p)\nend\n",
/* base/path.lua */
"function path.getbasename(p)\nlocal name = path.getname(p)\nlocal i = name:findlast(\".\", true)\nif (i) then\nreturn name:sub(1, i - 1)\nelse\nreturn name\nend\nend\nfunction path.removeext(name)\nlocal i = name:findlast(\".\", true)\nif (i) then\nreturn name:sub(1, i - 1)\nelse\nreturn name\nend\nend\nfunction path.getdirectory(p)\nlocal i = p:findlast(\"/\", true)\nif (i) then\nif i > 1 then i = i - 1 end\nreturn p:sub(1, i)\nelse\nreturn \".\"\nend\nend\nfunction path.getdrive(p)\nlocal ch1 = p:sub(1,1)\nlocal ch2 = p:sub(2,2)\nif ch2 == \":\" then\nreturn ch1\nend\nend\nfunction path.getextension(p)\nlocal i = p:findlast(\".\", true)\nif (i) then\nreturn p:sub(i)\nelse\nreturn \"\"\nend\nend\nfunction path.getname(p)\nlocal i = p:findlast(\"[/\\\\]\")\nif (i) then\nreturn p:sub(i + 1)\nelse\nreturn p\nend\nend\nfunction path.getcommonbasedir(a, b)\na = path.getdirectory(a)..'/'\nb = path.getdirectory(b)..'/'\nlocal idx = 0\nwhile (true) do\nlocal tst = a:find('/', idx + 1, true)\nif tst then\nif a:sub(1,t"
"st) == b:sub(1,tst) then\nidx = tst\nelse\nbreak\nend\nelse\nbreak\nend\nend\nlocal result = ''\nif idx > 1 then\nresult = a:sub(1, idx - 1)-- Remove the trailing slash to be consistent with other functions.\nend\nreturn result\nend\nfunction path.hasextension(fname, extensions)\nlocal fext = path.getextension(fname):lower()\nif type(extensions) == \"table\" then\nfor _, extension in pairs(extensions) do\nif fext == extension then\nreturn true\nend\nend\nreturn false\nelse\nreturn (fext == extensions)\nend\nend\nfunction path.iscfile(fname)\nreturn path.hasextension(fname, { \".c\", \".m\" })\nend\nfunction path.iscppfile(fname)\nreturn path.hasextension(fname, { \".cc\", \".cpp\", \".cxx\", \".c++\", \".c\", \".m\", \".mm\" })\nend\nfunction path.iscxfile(fname)\nreturn path.hasextension(fname, \".cx\")\nend\nfunction path.isobjcfile(fname)\nreturn path.hasextension(fname, { \".m\", \".mm\" })\nend\nfunction path.iscppheader(fname)\nreturn path.hasextension(fname, { \".h\", \".hh\", \".hpp\", \".hxx\" })\nend"
- "\nfunction path.isappxmanifest(fname)\nreturn path.hasextension(fname, \".appxmanifest\")\nend\nfunction path.isandroidbuildfile(fname)\nreturn path.getname(fname) == \"AndroidManifest.xml\"\nend\nfunction path.isnatvis(fname)\nreturn path.hasextension(fname, \".natvis\")\nend\nfunction path.isasmfile(fname)\nreturn path.hasextension(fname, { \".asm\", \".s\", \".S\" })\nend\nfunction path.isvalafile(fname)\nreturn path.hasextension(fname, \".vala\")\nend\nfunction path.isswiftfile(fname)\nreturn path.hasextension(fname, \".swift\")\nend\nfunction path.issourcefile(fname)\nreturn path.iscfile(fname)\nor path.iscppfile(fname)\nor path.iscxfile(fname)\nor path.isasmfile(fname)\nor path.isvalafile(fname)\nor path.isswiftfile(fname)\nend\nfunction path.issourcefilevs(fname)\nreturn path.hasextension(fname, { \".cc\", \".cpp\", \".cxx\", \".c++\", \".c\" })\nor path.iscxfile(fname)\nend\nfunction path.isobjectfile(fname)\nreturn path.hasextension(fname, { \".o\", \".obj\" })\nend\nfunction path.isresourcefile(fname"
- ")\nreturn path.hasextension(fname, \".rc\")\nend\nfunction path.isimagefile(fname)\nlocal extensions = { \".png\" }\nlocal ext = path.getextension(fname):lower()\nreturn table.contains(extensions, ext)\nend\nfunction path.join(...)\nlocal arg={...}\nlocal numargs = select(\"#\", ...)\nif numargs == 0 then\nreturn \"\";\nend\nlocal allparts = {}\nfor i = numargs, 1, -1 do\nlocal part = select(i, ...)\nif part and #part > 0 and part ~= \".\" then\nwhile part:endswith(\"/\") do\npart = part:sub(1, -2)\nend\ntable.insert(allparts, 1, part)\nif path.isabsolute(part) then\nbreak\nend\nend\nend\nreturn table.concat(allparts, \"/\")\nend\nfunction path.rebase(p, oldbase, newbase)\np = path.getabsolute(path.join(oldbase, p))\np = path.getrelative(newbase, p)\nreturn p\nend\nfunction path.translate(p, sep)\nif (type(p) == \"table\") then\nlocal result = { }\nfor _, value in ipairs(p) do\ntable.insert(result, path.translate(value))\nend\nreturn result\nelse\nif (not sep) then\nif (os.is(\"windows\")) then\nsep = \"\\\\\""
- "\nelse\nsep = \"/\"\nend\nend\nlocal result = p:gsub(\"[/\\\\]\", sep)\nreturn result\nend\nend\nfunction path.wildcards(pattern)\npattern = pattern:gsub(\"([%+%.%-%^%$%(%)%%])\", \"%%%1\")\npattern = pattern:gsub(\"%*%*\", \"\\001\")\npattern = pattern:gsub(\"%*\", \"\\002\")\npattern = pattern:gsub(\"\\001\", \".*\")\npattern = pattern:gsub(\"\\002\", \"[^/]*\")\nreturn pattern\nend\nfunction path.trimdots(p)\nlocal changed\nrepeat\nchanged = true\nif p:startswith(\"./\") then\np = p:sub(3)\nelseif p:startswith(\"../\") then\np = p:sub(4)\nelse\nchanged = false\nend\nuntil not changed\nreturn p\nend\nfunction path.rebase(p, oldbase, newbase)\np = path.getabsolute(path.join(oldbase, p))\np = path.getrelative(newbase, p)\nreturn p\nend\nfunction path.replaceextension(p, newext)\nlocal ext = path.getextension(p)\nif not ext then\nreturn p\nend\nif #newext > 0 and not newext:findlast(\".\", true) then\nnewext = \".\"..newext\nend\nreturn p:match(\"^(.*)\"..ext..\"$\")..newext\nend\n",
+ "\nfunction path.iscppmodule(fname)\nreturn path.hasextension(fname, { \".ixx\", \".cppm\" })\nend\nfunction path.isappxmanifest(fname)\nreturn path.hasextension(fname, \".appxmanifest\")\nend\nfunction path.isandroidbuildfile(fname)\nreturn path.getname(fname) == \"AndroidManifest.xml\"\nend\nfunction path.isnatvis(fname)\nreturn path.hasextension(fname, \".natvis\")\nend\nfunction path.isasmfile(fname)\nreturn path.hasextension(fname, { \".asm\", \".s\", \".S\" })\nend\nfunction path.isvalafile(fname)\nreturn path.hasextension(fname, \".vala\")\nend\nfunction path.isgresource(fname)\nlocal ending = \".gresource.xml\"\nreturn ending == \"\" or fname:sub(-#ending) == ending\nend\nfunction path.isswiftfile(fname)\nreturn path.hasextension(fname, \".swift\")\nend\nfunction path.issourcefile(fname)\nreturn path.iscfile(fname)\nor path.iscppfile(fname)\nor path.iscxfile(fname)\nor path.isasmfile(fname)\nor path.isvalafile(fname)\nor path.isswiftfile(fname)\nend\nfunction path.issourcefilevs(fname)\nreturn path.hase"
+ "xtension(fname, { \".cc\", \".cpp\", \".cxx\", \".c++\", \".c\" })\nor path.iscxfile(fname)\nor path.iscppmodule(fname)\nend\nfunction path.isobjectfile(fname)\nreturn path.hasextension(fname, { \".o\", \".obj\" })\nend\nfunction path.isresourcefile(fname)\nreturn path.hasextension(fname, \".rc\")\nend\nfunction path.isimagefile(fname)\nlocal extensions = { \".png\" }\nlocal ext = path.getextension(fname):lower()\nreturn table.contains(extensions, ext)\nend\nfunction path.join(...)\nlocal arg={...}\nlocal numargs = select(\"#\", ...)\nif numargs == 0 then\nreturn \"\";\nend\nlocal allparts = {}\nfor i = numargs, 1, -1 do\nlocal part = select(i, ...)\nif part and #part > 0 and part ~= \".\" then\nwhile part:endswith(\"/\") do\npart = part:sub(1, -2)\nend\ntable.insert(allparts, 1, part)\nif path.isabsolute(part) then\nbreak\nend\nend\nend\nreturn table.concat(allparts, \"/\")\nend\nfunction path.rebase(p, oldbase, newbase)\np = path.getabsolute(path.join(oldbase, p))\np = path.getrelative(newbase, p)\nreturn p"
+ "\nend\nfunction path.translate(p, sep)\nif (type(p) == \"table\") then\nlocal result = { }\nfor _, value in ipairs(p) do\ntable.insert(result, path.translate(value))\nend\nreturn result\nelse\nif (not sep) then\nif (os.is(\"windows\")) then\nsep = \"\\\\\"\nelse\nsep = \"/\"\nend\nend\nlocal result = p:gsub(\"[/\\\\]\", sep)\nreturn result\nend\nend\nfunction path.wildcards(pattern)\npattern = pattern:gsub(\"([%+%.%-%^%$%(%)%%])\", \"%%%1\")\npattern = pattern:gsub(\"%*%*\", \"\\001\")\npattern = pattern:gsub(\"%*\", \"\\002\")\npattern = pattern:gsub(\"\\001\", \".*\")\npattern = pattern:gsub(\"\\002\", \"[^/]*\")\nreturn pattern\nend\nfunction path.trimdots(p)\nlocal changed\nrepeat\nchanged = true\nif p:startswith(\"./\") then\np = p:sub(3)\nelseif p:startswith(\"../\") then\np = p:sub(4)\nelse\nchanged = false\nend\nuntil not changed\nreturn p\nend\nfunction path.rebase(p, oldbase, newbase)\np = path.getabsolute(path.join(oldbase, p))\np = path.getrelative(newbase, p)\nreturn p\nend\nfunction path.replacee"
+ "xtension(p, newext)\nlocal ext = path.getextension(p)\nif not ext then\nreturn p\nend\nif #newext > 0 and not newext:findlast(\".\", true) then\nnewext = \".\"..newext\nend\nreturn p:match(\"^(.*)\"..ext..\"$\")..newext\nend\n",
/* base/string.lua */
"function string.explode(s, pattern, plain)\nif (pattern == '') then return false end\nlocal pos = 0\nlocal arr = { }\nfor st,sp in function() return s:find(pattern, pos, plain) end do\ntable.insert(arr, s:sub(pos, st-1))\npos = sp + 1\nend\ntable.insert(arr, s:sub(pos))\nreturn arr\nend\nfunction string.findlast(s, pattern, plain)\nlocal curr = 0\nlocal term = nil\nrepeat\nlocal next, nextterm = s:find(pattern, curr + 1, plain)\nif (next) then\ncurr = next\nterm = nextterm\nend\nuntil (not next)\nif (curr > 0) then\nreturn curr, term\nend\nend\nfunction string.startswith(haystack, needle)\nreturn (haystack:find(needle, 1, true) == 1)\nend\nfunction string.trim(s)\nreturn (s:gsub(\"^%s*(.-)%s*$\", \"%1\"))\nend\n",
@@ -30,9 +31,9 @@ const char* builtin_scripts[] = {
"{...}\nfor i = 1, #arg do\narg[i] = io.esc(arg[i])\nend\nio.printf(msg, unpack(arg))\nend\nfunction io.esc(value)\nif type(value) == \"table\" then\nlocal result = {}\nlocal n = #value\nfor i = 1, n do\ntable.insert(result, io.esc(value[i]))\nend\nreturn result\nend\nreturn _esc(value or \"\")\nend\nfunction io.escaper(func)\n_esc = func or _escaper\nend\n_p = io.printf\n_x = io.xprintf\n",
/* base/globals.lua */
- "premake = { }\npremake.platforms =\n{\nNative =\n{\ncfgsuffix = \"\",\n},\nx32 =\n{\ncfgsuffix = \"32\",\n},\nx64 =\n{\ncfgsuffix = \"64\",\n},\nUniversal =\n{\ncfgsuffix = \"univ\",\n},\nUniversal32 =\n{\ncfgsuffix = \"univ32\",\n},\nUniversal64 =\n{\ncfgsuffix = \"univ64\",\n},\nPS3 =\n{\ncfgsuffix = \"ps3\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"PS3\",\n},\nWiiDev =\n{\ncfgsuffix = \"wii\",\niscrosscompiler = true,\nnamestyle = \"PS3\",\n},\nXbox360 =\n{\ncfgsuffix = \"xbox360\",\niscrosscompiler = true,\nnamestyle = \"windows\",\n},\nPowerPC =\n{\ncfgsuffix = \"ppc\",\niscrosscompiler = true,\n},\nARM =\n{\ncfgsuffix = \"ARM\",\niscrosscompiler = true,\n},\nOrbis =\n{\ncfgsuffix = \"orbis\",\niscrosscompiler = true,\nnamestyle = \"Orbis\",\n},\nDurango =\n{\ncfgsuffix = \"durango\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"windows\",\n},\nTegraAndroi"
- "d =\n{\ncfgsuffix = \"tegraandroid\",\niscrosscompiler = true,\nnamestyle = \"TegraAndroid\",\n},\nNX32 =\n{\ncfgsuffix = \"nx32\",\niscrosscompiler = true,\nnamestyle = \"NX\",\n},\nNX64 =\n{\ncfgsuffix = \"nx64\",\niscrosscompiler = true,\nnamestyle = \"NX\",\n},\nEmscripten =\n{\ncfgsuffix = \"emscripten\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"Emscripten\",\n},\n}\nlocal builtin_dofile = dofile\nfunction dofile(fname)\nlocal oldcwd = os.getcwd()\nlocal oldfile = _SCRIPT\nif (not os.isfile(fname)) then\nlocal path = os.pathsearch(fname, _OPTIONS[\"scripts\"], os.getenv(\"PREMAKE_PATH\"))\nif (path) then\nfname = path..\"/\"..fname\nend\nend\n_SCRIPT = path.getabsolute(fname)\nlocal newcwd = path.getdirectory(_SCRIPT)\nos.chdir(newcwd)\nlocal a, b, c, d, e, f = builtin_dofile(_SCRIPT)\n_SCRIPT = oldfile\nos.chdir(oldcwd)\nreturn a, b, c, d, e, f\nend\nfunction iif(expr, trueval, falseval)\nif (expr) then\nreturn trueval\nelse\nreturn "
- "falseval\nend\nend\nfunction include(fname)\nlocal dir, name = premake.findDefaultScript(fname, false)\nif dir ~= nil then\nreturn dofile(dir .. \"/\" .. name)\nend\nreturn nil\nend\nfunction printf(msg, ...)\nlocal arg={...}\nprint(string.format(msg, table.unpack(arg)))\nend\nfunction typex(t)\nlocal mt = getmetatable(t)\nif (mt) then\nif (mt.__type) then\nreturn mt.__type\nend\nend\nreturn type(t)\nend\n",
+ "premake = { }\npremake.platforms =\n{\nNative =\n{\ncfgsuffix = \"\",\n},\nx32 =\n{\ncfgsuffix = \"32\",\n},\nx64 =\n{\ncfgsuffix = \"64\",\n},\nUniversal =\n{\ncfgsuffix = \"univ\",\n},\nUniversal32 =\n{\ncfgsuffix = \"univ32\",\n},\nUniversal64 =\n{\ncfgsuffix = \"univ64\",\n},\nPS3 =\n{\ncfgsuffix = \"ps3\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"PS3\",\n},\nWiiDev =\n{\ncfgsuffix = \"wii\",\niscrosscompiler = true,\nnamestyle = \"PS3\",\n},\nXbox360 =\n{\ncfgsuffix = \"xbox360\",\niscrosscompiler = true,\nnamestyle = \"windows\",\n},\nPowerPC =\n{\ncfgsuffix = \"ppc\",\niscrosscompiler = true,\n},\nARM =\n{\ncfgsuffix = \"ARM\",\niscrosscompiler = true,\n},\nARM64 =\n{\ncfgsuffix = \"ARM64\",\niscrosscompiler = true,\n},\nOrbis =\n{\ncfgsuffix = \"orbis\",\niscrosscompiler = true,\nnamestyle = \"Orbis\",\n},\nDurango =\n{\ncfgsuffix = \"durango\",\niscrosscompiler = true,\nn"
+ "osharedlibs = true,\nnamestyle = \"windows\",\n},\nTegraAndroid =\n{\ncfgsuffix = \"tegraandroid\",\niscrosscompiler = true,\nnamestyle = \"TegraAndroid\",\n},\nNX32 =\n{\ncfgsuffix = \"nx32\",\niscrosscompiler = true,\nnamestyle = \"NX\",\n},\nNX64 =\n{\ncfgsuffix = \"nx64\",\niscrosscompiler = true,\nnamestyle = \"NX\",\n},\nEmscripten =\n{\ncfgsuffix = \"emscripten\",\niscrosscompiler = true,\nnosharedlibs = true,\nnamestyle = \"Emscripten\",\n},\n[\"gdk-desktop\"] =\n{\ncfgsuffix = \"gdk-desktop\",\nnamestyle = \"windows\",\n},\n[\"gdk-xboxone\"] =\n{\ncfgsuffix = \"gdk-xboxone\",\nnamestyle = \"windows\",\n},\n[\"gdk-scarlett\"] =\n{\ncfgsuffix = \"gdk-scarlett\",\nnamestyle = \"windows\",\n},\n}\nlocal builtin_dofile = dofile\nfunction dofile(fname)\nlocal oldcwd = os.getcwd()\nlocal oldfile = _SCRIPT\nif (not os.isfile(fname)) then\nlocal path = os.pathsearch(fname, _OPTIONS[\"scripts\"], os.getenv(\"PREMAKE_"
+ "PATH\"))\nif (path) then\nfname = path..\"/\"..fname\nend\nend\n_SCRIPT = path.getabsolute(fname)\nlocal newcwd = path.getdirectory(_SCRIPT)\nos.chdir(newcwd)\nlocal a, b, c, d, e, f = builtin_dofile(_SCRIPT)\n_SCRIPT = oldfile\nos.chdir(oldcwd)\nreturn a, b, c, d, e, f\nend\nfunction iif(expr, trueval, falseval)\nif (expr) then\nreturn trueval\nelse\nreturn falseval\nend\nend\nfunction include(fname)\nlocal dir, name = premake.findDefaultScript(fname, false)\nif dir ~= nil then\nreturn dofile(dir .. \"/\" .. name)\nend\nreturn nil\nend\nfunction printf(msg, ...)\nlocal arg={...}\nprint(string.format(msg, table.unpack(arg)))\nend\nfunction typex(t)\nlocal mt = getmetatable(t)\nif (mt) then\nif (mt.__type) then\nreturn mt.__type\nend\nend\nreturn type(t)\nend\n",
/* base/action.lua */
"premake.action = { }\npremake.action.list = { }\nfunction premake.action.add(a)\nlocal missing\nfor _, field in ipairs({\"description\", \"trigger\"}) do\nif (not a[field]) then\nmissing = field\nend\nend\nif (missing) then\nerror(\"action needs a \" .. missing, 3)\nend\npremake.action.list[a.trigger] = a\nend\nfunction premake.action.call(name)\nlocal a = premake.action.list[name]\nfor sln in premake.solution.each() do\nif a.onsolution then\na.onsolution(sln)\nend\nif sln.postsolutioncallbacks then\nfor _,cb in ipairs(sln.postsolutioncallbacks) do\ncb(sln)\nend\nend\nfor prj in premake.solution.eachproject(sln) do\nif a.onproject then\na.onproject(prj)\nend\nif prj.postprojectcallbacks then\nfor _,cb in ipairs(prj.postprojectcallbacks) do\ncb(prj)\nend\nend\nend\nend\nif a.execute then\na.execute()\nend\nend\nfunction premake.action.current()\nreturn premake.action.get(_ACTION)\nend\nfunction premake.action.get(name)\nreturn premake.action.list[name]\nend\nfunction premake.action.each()\nlocal keys = { }\nfor"
@@ -57,13 +58,13 @@ const char* builtin_scripts[] = {
"return prj\nend\nend\nend\nend\nfunction premake.findfile(prj, extension)\nfor _, fname in ipairs(prj.files) do\nif fname:endswith(extension) then return fname end\nend\nend\nfunction premake.getconfig(prj, cfgname, pltname)\nprj = prj.project or prj\nif pltname == \"Native\" or not table.contains(prj.solution.platforms or {}, pltname) then\npltname = nil\nend\nlocal key = (cfgname or \"\")\nif pltname then key = key .. pltname end\nreturn prj.__configs[key]\nend\nfunction premake.getconfigname(cfgname, platform, useshortname)\nif cfgname then\nlocal name = cfgname\nif platform and platform ~= \"Native\" then\nif useshortname then\nname = name .. premake.platforms[platform].cfgsuffix\nelse\nname = name .. \"|\" .. platform\nend\nend\nreturn iif(useshortname, name:lower(), name)\nend\nend\nfunction premake.getdependencies(prj)\nprj = prj.project or prj\nlocal results = { }\nfor _, cfg in pairs(prj.__configs) do\nfor _, link in ipairs(cfg.links) do\nlocal dep = premake.findproject(link)\nif dep and not table.co"
"ntains(results, dep) then\ntable.insert(results, dep)\nend\nend\nend\nreturn results\nend\nfunction premake.project.getbasename(prjname, pattern)\nreturn pattern:gsub(\"%%%%\", prjname)\nend\nfunction premake.project.getfilename(prj, pattern)\nlocal fname = premake.project.getbasename(prj.name, pattern)\nfname = path.join(prj.location, fname)\nreturn path.getrelative(os.getcwd(), fname)\nend\n function premake.getlinks(cfg, kind, part)\nlocal result = iif (part == \"directory\" and kind == \"all\", cfg.libdirs, {})\nlocal cfgname = iif(cfg.name == cfg.project.name, \"\", cfg.name)\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\nlocal function canlink(source, target)\nif (target.kind ~= \"SharedLib\" and target.kind ~= \"StaticLib\") then\nreturn false\nend\nif premake.iscppproject(source) then\nreturn premake.iscppproject(target)\nelseif premake.isdotnetproject(source) then\nreturn premake.isdotnetproject(target)\nelseif premake.isswiftproject(source) then\nreturn pre"
"make.isswiftproject(source) or premake.iscppproject(source)\nend\nend\nfor _, link in ipairs(cfg.links) do\nlocal item\nlocal prj = premake.findproject(link)\nif prj and kind ~= \"system\" then\nlocal prjcfg = premake.getconfig(prj, cfgname, cfg.platform)\nif kind == \"dependencies\" or canlink(cfg, prjcfg) then\nif (part == \"directory\") then\nitem = path.rebase(prjcfg.linktarget.directory, prjcfg.location, cfg.location)\nelseif (part == \"basename\") then\nitem = prjcfg.linktarget.basename\nelseif (part == \"fullpath\") then\nitem = path.rebase(prjcfg.linktarget.fullpath, prjcfg.location, cfg.location)\nelseif (part == \"object\") then\nitem = prjcfg\nend\nend\nelseif not prj and (kind == \"system\" or kind == \"all\") then\nif (part == \"directory\") then\nitem = path.getdirectory(link)\nelseif (part == \"fullpath\") then\nitem = link\nif namestyle == \"windows\" then\nif premake.iscppproject(cfg) then\nitem = item .. \".lib\"\nelseif premake.isdotnetproject(cfg) then\nitem = item .. \".dll\"\nend\nend\nel"
- "seif part == \"name\" then\nitem = path.getname(link)\nelseif part == \"basename\" then\nitem = path.getbasename(link)\nelse\nitem = link\nend\nif item:find(\"/\", nil, true) then\nitem = path.getrelative(cfg.project.location, item)\nend\nend\nif item then\nif pathstyle == \"windows\" and part ~= \"object\" then\nitem = path.translate(item, \"\\\\\")\nend\nif not table.contains(result, item) then\ntable.insert(result, item)\nend\nend\nend\nreturn result\nend\nfunction premake.getnamestyle(cfg)\nreturn premake.platforms[cfg.platform].namestyle or premake.gettool(cfg).namestyle or \"posix\"\nend\nfunction premake.getpathstyle(cfg)\nif premake.action.current().os == \"windows\" then\nreturn \"windows\"\nelse\nreturn \"posix\"\nend\nend\nfunction premake.gettarget(cfg, direction, pathstyle, namestyle, system)\nif system == \"bsd\" then\nsystem = \"linux\"\nend\nlocal kind = cfg.kind\nif premake.iscppproject(cfg) then\nif (namestyle == \"windows\" or system == \"windows\")\nand kind == \"SharedLib\" and direction ="
- "= \"link\"\nand not cfg.flags.NoImportLib\nthen\nkind = \"StaticLib\"\nend\nif namestyle == \"posix\" and system == \"windows\" and kind ~= \"StaticLib\" then\nnamestyle = \"windows\"\nend\nend\nlocal field = \"build\"\nif direction == \"link\" and cfg.kind == \"SharedLib\" then\nfield = \"implib\"\nend\nlocal name = cfg[field..\"name\"] or cfg.targetname or cfg.project.name\nlocal dir = cfg[field..\"dir\"] or cfg.targetdir or path.getrelative(cfg.location, cfg.basedir)\nlocal subdir = cfg[field..\"subdir\"] or cfg.targetsubdir or \".\"\nlocal prefix = \"\"\nlocal suffix = \"\"\nlocal ext = \"\"\nlocal bundlepath, bundlename\ndir = path.join(dir, subdir)\nif namestyle == \"windows\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".exe\"\nelseif kind == \"SharedLib\" then\next = \".dll\"\nelseif kind == \"StaticLib\" then\next = \".lib\"\nend\nelseif namestyle == \"posix\" then\nif kind == \"WindowedApp\" and system == \"macosx\" and not cfg.options.SkipBundling then\nbu"
- "ndlename = name .. \".app\"\nbundlepath = path.join(dir, bundlename)\ndir = path.join(bundlepath, \"Contents/MacOS\")\nelseif (kind == \"ConsoleApp\" or kind == \"WindowedApp\") and system == \"os2\" then\next = \".exe\"\nelseif kind == \"SharedLib\" then\nprefix = \"lib\"\next = iif(system == \"macosx\", \".dylib\", \".so\")\nelseif kind == \"StaticLib\" then\nprefix = \"lib\"\next = \".a\"\nend\nelseif namestyle == \"PS3\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".elf\"\nelseif kind == \"StaticLib\" then\nprefix = \"lib\"\next = \".a\"\nend\nelseif namestyle == \"Orbis\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".elf\"\nelseif kind == \"StaticLib\" then\nprefix = \"lib\"\next = \".a\"\nelseif kind == \"SharedLib\" then\next = \".prx\"\nend\nelseif namestyle == \"TegraAndroid\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" or kind == \"SharedLib\" then\nprefix = \"lib\"\next = \".so\"\nelseif kind == \"StaticLib\" then\nprefix = \"lib"
- "\"\next = \".a\"\nend\nelseif namestyle == \"NX\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".nspd_root\"\nelseif kind == \"StaticLib\" then\next = \".a\"\nelseif kind == \"SharedLib\" then\next = \".nro\"\nend\nelseif namestyle == \"Emscripten\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".html\"\nelseif kind == \"StaticLib\" then\next = \".bc\"\nelseif kind == \"SharedLib\" then\next = \".js\"\nend\nend\nprefix = cfg[field..\"prefix\"] or cfg.targetprefix or prefix\nsuffix = cfg[field..\"suffix\"] or cfg.targetsuffix or suffix\next = cfg[field..\"extension\"] or cfg.targetextension or ext\nlocal result = { }\nresult.basename = name .. suffix\nresult.name = prefix .. name .. suffix .. ext\nresult.directory = dir\nresult.subdirectory = subdir\nresult.prefix = prefix\nresult.suffix = suffix\nresult.fullpath = path.join(result.directory, result.name)\nresult.bundlepath = bundlepath or result.fullpath\nif pathstyle == "
- "\"windows\" then\nresult.directory = path.translate(result.directory, \"\\\\\")\nresult.subdirectory = path.translate(result.subdirectory, \"\\\\\")\nresult.fullpath = path.translate(result.fullpath, \"\\\\\")\nend\nreturn result\nend\nfunction premake.gettool(cfg)\nif premake.iscppproject(cfg) then\nif _OPTIONS.cc then\nreturn premake[_OPTIONS.cc]\nend\nlocal action = premake.action.current()\nif action.valid_tools then\nreturn premake[action.valid_tools.cc[1]]\nend\nreturn premake.gcc\nelseif premake.isdotnetproject(cfg) then\nreturn premake.dotnet\nelseif premake.isswiftproject(cfg) then\nreturn premake.swift\nelse\nreturn premake.valac\nend\nend\nfunction premake.project.getvpath(prj, abspath)\nlocal vpath = abspath\nlocal fname = path.getname(abspath)\nlocal max = abspath:len() - fname:len()\n \n -- First check for an exact match from the inverse vpaths\n if prj.inversevpaths and prj.inversevpaths[abspath] then\n return path.join(prj.inversevpaths[abspath], fname)\n"
- " end\n local matches = {}\nfor replacement, patterns in pairs(prj.vpaths or {}) do\nfor _, pattern in ipairs(patterns) do\nlocal i = abspath:find(path.wildcards(pattern))\nif i == 1 then\ni = pattern:find(\"*\", 1, true) or (pattern:len() + 1)\nlocal leaf\nif i < max then\nleaf = abspath:sub(i)\nelse\nleaf = fname\nend\nif leaf:startswith(\"/\") then\nleaf = leaf:sub(2)\nend\nlocal stem = \"\"\nif replacement:len() > 0 then\nstem, stars = replacement:gsub(\"%*\", \"\")\nif stars == 0 then\nleaf = path.getname(leaf)\nend\nelse\nleaf = path.getname(leaf)\nend\ntable.insert(matches, path.join(stem, leaf))\nend\nend\nend\n \n if #matches > 0 then\n -- for the sake of determinism, return the first alphabetically\n table.sort(matches)\n vpath = matches[1]\n end\nreturn path.trimdots(vpath)\nend\nfunction premake.hascppproject(sln)\nfor prj in premake.solution.eachproject(sln) do\nif premake.iscppproject(prj) then\nreturn true\nend\nend\nend\nfunctio"
- "n premake.hasdotnetproject(sln)\nfor prj in premake.solution.eachproject(sln) do\nif premake.isdotnetproject(prj) then\nreturn true\nend\nend\nend\nfunction premake.project.iscproject(prj)\nreturn prj.language == \"C\"\nend\nfunction premake.iscppproject(prj)\nreturn (prj.language == \"C\" or prj.language == \"C++\")\nend\nfunction premake.isdotnetproject(prj)\nreturn (prj.language == \"C#\")\nend\nfunction premake.isvalaproject(prj)\nreturn (prj.language == \"Vala\")\nend\nfunction premake.isswiftproject(prj)\nreturn (prj.language == \"Swift\")\nend\n",
+ "seif part == \"name\" then\nitem = path.getname(link)\nelseif part == \"basename\" then\nitem = path.getbasename(link)\nelse\nitem = link\nend\nif item:find(\"/\", nil, true) then\nitem = path.getrelative(cfg.project.location, item)\nend\nend\nif item then\nif pathstyle == \"windows\" and part ~= \"object\" then\nitem = path.translate(item, \"\\\\\")\nend\nif not table.contains(result, item) then\ntable.insert(result, item)\nend\nend\nend\nreturn result\nend\nfunction premake.getnamestyle(cfg)\nreturn premake.platforms[cfg.platform].namestyle or premake.gettool(cfg).namestyle or \"posix\"\nend\nfunction premake.getpathstyle(cfg)\nif premake.action.current().os == \"windows\" then\nreturn \"windows\"\nelse\nreturn \"posix\"\nend\nend\nfunction premake.gettarget(cfg, direction, pathstyle, namestyle, system)\nif system == \"bsd\" then\nsystem = \"linux\"\nend\nlocal kind = cfg.kind\nif premake.iscppproject(cfg) or premake.isvalaproject(cfg) then\nif (namestyle == \"windows\" or system == \"windows\")\nand kind =="
+ " \"SharedLib\" and direction == \"link\"\nand not cfg.flags.NoImportLib\nthen\nkind = \"StaticLib\"\nend\nif namestyle == \"posix\" and system == \"windows\" and kind ~= \"StaticLib\" then\nnamestyle = \"windows\"\nend\nend\nlocal field = \"build\"\nif direction == \"link\" and cfg.kind == \"SharedLib\" then\nfield = \"implib\"\nend\nlocal name = cfg[field..\"name\"] or cfg.targetname or cfg.project.name\nlocal dir = cfg[field..\"dir\"] or cfg.targetdir or path.getrelative(cfg.location, cfg.basedir)\nlocal subdir = cfg[field..\"subdir\"] or cfg.targetsubdir or \".\"\nlocal prefix = \"\"\nlocal suffix = \"\"\nlocal ext = \"\"\nlocal bundlepath, bundlename\ndir = path.join(dir, subdir)\nif namestyle == \"windows\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".exe\"\nelseif kind == \"SharedLib\" then\next = \".dll\"\nelseif kind == \"StaticLib\" then\next = \".lib\"\nend\nelseif namestyle == \"posix\" then\nif kind == \"WindowedApp\" and system == \"macosx\" and not cfg"
+ ".options.SkipBundling then\nbundlename = name .. \".app\"\nbundlepath = path.join(dir, bundlename)\ndir = path.join(bundlepath, \"Contents/MacOS\")\nelseif (kind == \"ConsoleApp\" or kind == \"WindowedApp\") and system == \"os2\" then\next = \".exe\"\nelseif kind == \"SharedLib\" then\nprefix = \"lib\"\next = iif(system == \"macosx\", \".dylib\", \".so\")\nelseif kind == \"StaticLib\" then\nprefix = \"lib\"\next = \".a\"\nend\nelseif namestyle == \"PS3\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".elf\"\nelseif kind == \"StaticLib\" then\nprefix = \"lib\"\next = \".a\"\nend\nelseif namestyle == \"Orbis\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".elf\"\nelseif kind == \"StaticLib\" then\nprefix = \"lib\"\next = \".a\"\nelseif kind == \"SharedLib\" then\next = \".prx\"\nend\nelseif namestyle == \"TegraAndroid\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" or kind == \"SharedLib\" then\nprefix = \"lib\"\next = \".so\"\nelseif kind == \"St"
+ "aticLib\" then\nprefix = \"lib\"\next = \".a\"\nend\nelseif namestyle == \"NX\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".nspd_root\"\nelseif kind == \"StaticLib\" then\next = \".a\"\nelseif kind == \"SharedLib\" then\next = \".nro\"\nend\nelseif namestyle == \"Emscripten\" then\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\next = \".html\"\nelseif kind == \"StaticLib\" then\next = \".a\"\nelseif kind == \"SharedLib\" then\next = \".js\"\nend\nend\nprefix = cfg[field..\"prefix\"] or cfg.targetprefix or prefix\nsuffix = cfg[field..\"suffix\"] or cfg.targetsuffix or suffix\next = cfg[field..\"extension\"] or cfg.targetextension or ext\nlocal result = { }\nresult.basename = name .. suffix\nresult.name = prefix .. name .. suffix .. ext\nresult.directory = dir\nresult.subdirectory = subdir\nresult.prefix = prefix\nresult.suffix = suffix\nresult.fullpath = path.join(result.directory, result.name)\nresult.bundlepath = bundlepath or resul"
+ "t.fullpath\nif pathstyle == \"windows\" then\nresult.directory = path.translate(result.directory, \"\\\\\")\nresult.subdirectory = path.translate(result.subdirectory, \"\\\\\")\nresult.fullpath = path.translate(result.fullpath, \"\\\\\")\nend\nreturn result\nend\nfunction premake.gettool(prj)\nif premake.iscppproject(prj) then\nif _OPTIONS.cc then\nreturn premake[_OPTIONS.cc]\nend\nlocal action = premake.action.current()\nif action.valid_tools then\nreturn premake[action.valid_tools.cc[1]]\nend\nreturn premake.gcc\nelseif premake.isdotnetproject(prj) then\nreturn premake.dotnet\nelseif premake.isswiftproject(prj) then\nreturn premake.swift\nelse\nreturn premake.valac\nend\nend\nfunction premake.project.getvpath(prj, abspath)\nlocal vpath = abspath\nlocal fname = path.getname(abspath)\nlocal max = abspath:len() - fname:len()\n -- First check for an exact match from the inverse vpaths\n if prj.inversevpaths and prj.inversevpaths[abspath] then\n return path.join(prj.inversevpaths["
+ "abspath], fname)\n end\n local matches = {}\nfor replacement, patterns in pairs(prj.vpaths or {}) do\nfor _, pattern in ipairs(patterns) do\nlocal i = abspath:find(path.wildcards(pattern))\nif i == 1 then\ni = pattern:find(\"*\", 1, true) or (pattern:len() + 1)\nlocal leaf\nif i < max then\nleaf = abspath:sub(i)\nelse\nleaf = fname\nend\nif leaf:startswith(\"/\") then\nleaf = leaf:sub(2)\nend\nlocal stem = \"\"\nif replacement:len() > 0 then\nstem, stars = replacement:gsub(\"%*\", \"\")\nif stars == 0 then\nleaf = path.getname(leaf)\nend\nelse\nleaf = path.getname(leaf)\nend\ntable.insert(matches, path.join(stem, leaf))\nend\nend\nend\n if #matches > 0 then\n -- for the sake of determinism, return the first alphabetically\n table.sort(matches)\n vpath = matches[1]\n end\nreturn path.trimdots(vpath)\nend\nfunction premake.hascppproject(sln)\nfor prj in premake.solution.eachproject(sln) do\nif premake.iscppproject(prj) then\nreturn true\nend\nend\nend"
+ "\nfunction premake.hasdotnetproject(sln)\nfor prj in premake.solution.eachproject(sln) do\nif premake.isdotnetproject(prj) then\nreturn true\nend\nend\nend\nfunction premake.project.iscproject(prj)\nlocal language = prj.language or prj.solution.language\nreturn language == \"C\"\nend\nfunction premake.iscppproject(prj)\nlocal language = prj.language or prj.solution.language\nreturn (language == \"C\" or language == \"C++\")\nend\nfunction premake.isdotnetproject(prj)\nlocal language = prj.language or prj.solution.language\nreturn (language == \"C#\")\nend\nfunction premake.isvalaproject(prj)\nlocal language = prj.language or prj.solution.language\nreturn (language == \"Vala\")\nend\nfunction premake.isswiftproject(prj)\nlocal language = prj.language or prj.solution.language\nreturn (language == \"Swift\")\nend\n",
/* base/config.lua */
"premake.config = { }\nlocal config = premake.config\nfunction premake.config.isdebugbuild(cfg)\nif cfg.flags.DebugRuntime then\nreturn true\nend\nif cfg.flags.ReleaseRuntime then\nreturn false\nend\nif cfg.flags.Optimize or cfg.flags.OptimizeSize or cfg.flags.OptimizeSpeed then\nreturn false\nend\nif not cfg.flags.Symbols then\nreturn false\nend\nreturn true\nend\nfunction premake.config.eachfile(cfg)\nlocal i = 0\nlocal t = cfg.files\nreturn function ()\ni = i + 1\nif (i <= #t) then\nlocal fcfg = cfg.__fileconfigs[t[i]]\nfcfg.vpath = premake.project.getvpath(cfg.project, fcfg.name)\nreturn fcfg\nend\nend\nend\nfunction premake.config.isincrementallink(cfg)\nif cfg.kind == \"StaticLib\" then\nreturn false\nend\nreturn not config.islinkeroptimizedbuild(cfg.flags) and not cfg.flags.NoIncrementalLink\nend\nfunction premake.config.isoptimizedbuild(flags)\nreturn flags.Optimize or flags.OptimizeSize or flags.OptimizeSpeed\nend\nfunction premake.config.islinkeroptimizedbuild(flags)\nreturn config.isoptimizedbuild(fl"
@@ -71,22 +72,22 @@ const char* builtin_scripts[] = {
/* base/bake.lua */
"premake.bake = { }\nlocal bake = premake.bake\nlocal nocopy =\n{\nblocks = true,\nkeywords = true,\nprojects = true,\n__configs = true,\n}\nlocal nocascade =\n{\nmakesettings = true,\n}\nlocal keeprelative =\n{\nbasedir = true,\nlocation = true,\n}\nfunction premake.getactiveterms(obj)\nlocal terms = { _action = _ACTION:lower(), os = os.get() }\nfor key, value in pairs(_OPTIONS) do\nif value ~= \"\" then\ntable.insert(terms, value:lower())\nelse\ntable.insert(terms, key:lower())\nend\nend\nreturn terms\nend\nfunction premake.iskeywordmatch(keyword, terms)\nif keyword:startswith(\"not \") then\nreturn not premake.iskeywordmatch(keyword:sub(5), terms)\nend\nfor _, pattern in ipairs(keyword:explode(\" or \")) do\nfor termkey, term in pairs(terms) do\nif term:match(pattern) == term then\nreturn termkey\nend\nend\nend\nend\nfunction premake.iskeywordsmatch(keywords, terms)\nlocal hasrequired = false\nfor _, keyword in ipairs(keywords) do\nlocal matched = premake.iskeywordmatch(keyword, terms)\nif not matched "
- "then\nreturn false\nend\nif matched == \"required\" then\nhasrequired = true\nend\nend\nif terms.required and not hasrequired then\nreturn false\nelse\nreturn true\nend\nend\nlocal function adjustpaths(location, obj)\nfunction adjustpathlist(list)\nfor i, p in ipairs(list) do\nlist[i] = path.getrelative(location, p)\nend\nend\nif obj.allfiles ~= nil then\nadjustpathlist(obj.allfiles)\nend\nfor name, value in pairs(obj) do\nlocal field = premake.fields[name]\nif field and value and not keeprelative[name] then\nif field.kind == \"path\" then\nobj[name] = path.getrelative(location, value)\nelseif field.kind == \"dirlist\" or field.kind == \"filelist\" then\nadjustpathlist(value)\nelseif field.kind == \"keypath\" then\nfor k,v in pairs(value) do\nadjustpathlist(v)\nend\nend\nend\nend\nend\nlocal function removevalue(tbl, remove)\nfor index, item in ipairs(tbl) do\nif item == remove then\ntable.remove(tbl, index)\nbreak\nend\nend\nend\nlocal function removevalues(tbl, removes)\nfor k, v in pairs(tbl) do\nfor _, pat"
- "tern in ipairs(removes) do\nif pattern == tbl[k] then\nif type(k) == \"number\" then\ntable.remove(tbl, k)\nelse\ntbl[k] = nil\nend\nbreak\nend\nend\nend\nend\nlocal function mergefield(kind, dest, src, mergecopiestotail)\nlocal tbl = dest or { }\nif kind == \"keyvalue\" or kind == \"keypath\" then\nfor key, value in pairs(src) do\ntbl[key] = mergefield(\"list\", tbl[key], value, mergecopiestotail)\nend\nelse\nfor _, item in ipairs(src) do\nif tbl[item] then\nif mergecopiestotail then\nremovevalue(tbl, item)\ntable.insert(tbl, item)\ntbl[item] = item\nend\nelse\ntable.insert(tbl, item)\ntbl[item] = item\nend\nend\nend\nreturn tbl\nend\nlocal function mergeobject(dest, src)\nif not src then\nreturn\nend\nfor fieldname, value in pairs(src) do\nif not nocopy[fieldname] then\nlocal field = premake.fields[fieldname]\nif field then\nif type(value) == \"table\" then\ndest[fieldname] = mergefield(field.kind, dest[fieldname], value, field.mergecopiestotail)\nif src.removes then\nremoves = src.removes[fieldname]\nif rem"
- "oves then\nremovevalues(dest[fieldname], removes)\nend\nend\nelse\ndest[fieldname] = value\nend\nelse\ndest[fieldname] = value\nend\nend\nend\nend\nlocal function merge(dest, obj, basis, terms, cfgname, pltname)\nlocal key = cfgname or \"\"\npltname = pltname or \"Native\"\nif pltname ~= \"Native\" then\nkey = key .. pltname\nend\nterms.config = (cfgname or \"\"):lower()\nterms.platform = pltname:lower()\nlocal cfg = {}\nmergeobject(cfg, basis[key])\nadjustpaths(obj.location, cfg)\nmergeobject(cfg, obj)\nif (cfg.kind) then\nterms['kind']=cfg.kind:lower()\nend\nfor _, blk in ipairs(obj.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, terms))then\nmergeobject(cfg, blk)\nif (cfg.kind and not cfg.terms.kind) then\ncfg.terms['kind'] = cfg.kind:lower()\nterms['kind'] = cfg.kind:lower()\nend\nend\nend\ncfg.name = cfgname\ncfg.platform = pltname\nfor k,v in pairs(terms) do\ncfg.terms[k] =v\nend\ndest[key] = cfg\nend\nlocal function collapse(obj, basis)\nlocal result = {}\nbasis = basis or {}\nlocal sln = ob"
- "j.solution or obj\nlocal terms = premake.getactiveterms(obj)\nmerge(result, obj, basis, terms)--this adjusts terms\nfor _, cfgname in ipairs(sln.configurations) do\nlocal terms_local = {}\nfor k,v in pairs(terms)do terms_local[k]=v end\nmerge(result, obj, basis, terms_local, cfgname, \"Native\")--terms cam also be adjusted here\nfor _, pltname in ipairs(sln.platforms or {}) do\nif pltname ~= \"Native\" then\nmerge(result, obj, basis,terms_local, cfgname, pltname)--terms also here\nend\nend\nend\nreturn result\nend\nlocal function builduniquedirs()\nlocal num_variations = 4\nlocal cfg_dirs = {}\nlocal hit_counts = {}\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dirs = { }\ndirs[1] = path.getabsolute(path.join(cfg.location, cfg.objdir or cfg.project.objdir or \"obj\"))\ndirs[2] = path.join(dirs[1], iif(cfg.platform == \"Native\", \"\", cfg.platform))\ndirs[3] = path.join(dirs[2], cfg.name)\ndirs[4] = path.join(dirs[3], cfg.project.nam"
- "e)\ncfg_dirs[cfg] = dirs\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, num_variations do\nlocal d = dirs[v]\nhit_counts[d] = (hit_counts[d] or 0) + 1\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dir\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, iif(cfg.flags.SingleOutputDir==true,num_variations-1,num_variations) do\ndir = cfg_dirs[cfg][v]\nif hit_counts[dir] == 1 then break end\nend\ncfg.objectsdir = path.getrelative(cfg.location, dir)\nend\nend\nend\nend\nlocal function buildtargets()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\ncfg.buildtarget = premake.gettarget(cfg, \"build\", pathstyle, namestyle, cfg.system)\ncfg.linktarget = premake.gettarget(cfg, \"link\", pathstyle, namestyle, cfg.system)\nif pathstyle == \"windows\" then\ncfg.objec"
- "tsdir = path.translate(cfg.objectsdir, \"\\\\\")\nend\nend\nend\nend\nend\n local function getCfgKind(cfg)\n if(cfg.kind) then\n return cfg.kind;\n end\n if(cfg.project.__configs[\"\"] and cfg.project.__configs[\"\"].kind) then\n return cfg.project.__configs[\"\"].kind;\n end\n return nil\n end\n local function getprojrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage)\n if(not cfg) then return end\n local foundUsePrjs = {};\n for _, useName in ipairs(cfg[searchField]) do\n local testName = useName:lower();\n if((not foundList[testName])) then\n local theProj = nil;\n local theUseProj = nil;\n for _, prj in ipairs(cfg.project.solution.projects) do\n if (prj.name:lower() == testName) then\n if(prj.usage) then\n theUseProj = prj;\n else\n theProj = prj;\n end\n end\n end\n --Must connect to a usage project.\n if(theUseProj) then\n foundList[testName] = true;\n local prjEntry = {\n name = testName,\n proj = theProj,\n usageProj = theUseProj,\n bLinkageOnly = bLinkage,\n"
- " };\n dstArray[testName] = prjEntry;\n table.insert(foundUsePrjs, theUseProj);\n end\n end\n end\n for _, usePrj in ipairs(foundUsePrjs) do\n --Links can only recurse through static libraries.\n if((searchField ~= \"links\") or\n (getCfgKind(usePrj.__configs[cfgname]) == \"StaticLib\")) then\n getprojrec(dstArray, foundList, usePrj.__configs[cfgname],\n cfgname, searchField, bLinkage);\n end\n end\n end\n --\n -- This function will recursively get all projects that the given configuration has in its \"uses\"\n -- field. The return values are a list of tables. Each table in that list contains the following:\n --name = The lowercase name of the project.\n --proj = The project. Can be nil if it is usage-only.\n --usageProj = The usage project. Can't be nil, as using a project that has no\n -- usage project is not put into the list.\n --bLinkageOnly = If this is true, then only the linkage information should be copied.\n -- The recursion will only look at the \"uses\" field on *usage* proje"
- "cts.\n -- This function will also add projects to the list that are mentioned in the \"links\"\n -- field of usage projects. These will only copy linker information, but they will recurse.\n -- through other \"links\" fields.\n --\n local function getprojectsconnections(cfg, cfgname)\n local dstArray = {};\n local foundList = {};\n foundList[cfg.project.name:lower()] = true;\n --First, follow the uses recursively.\n getprojrec(dstArray, foundList, cfg, cfgname, \"uses\", false);\n --Next, go through all of the usage projects and recursively get their links.\n --But only if they're not already there. Get the links as linkage-only.\n local linkArray = {};\n for prjName, prjEntry in pairs(dstArray) do\n getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname,\n \"links\", true);\n end\n --Copy from linkArray into dstArray.\n for prjName, prjEntry in pairs(linkArray) do\n dstArray[prjName] = prjEntry;\n end\n return dstArray;\n end\n local function isnameofproj(cfg, "
- "strName)\n local sln = cfg.project.solution;\n local strTest = strName:lower();\n for prjIx, prj in ipairs(sln.projects) do\n if (prj.name:lower() == strTest) then\n return true;\n end\n end\n return false;\n end\n --\n -- Copies the field from dstCfg to srcCfg.\n --\n local function copydependentfield(srcCfg, dstCfg, strSrcField)\n local srcField = premake.fields[strSrcField];\n local strDstField = strSrcField;\n if type(srcCfg[strSrcField]) == \"table\" then\n --handle paths.\n if (srcField.kind == \"dirlist\" or srcField.kind == \"filelist\") and\n (not keeprelative[strSrcField]) then\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField],\n path.rebase(p, srcCfg.project.location, dstCfg.project.location))\n end\n else\n if(strSrcField == \"links\") then\n for i,p in ipairs(srcCfg[strSrcField]) do\n if(not isnameofproj(dstCfg, p)) then\n table.insert(dstCfg[strDstField], p)\n else\n printf(\"Failed to copy '%s' from proj '%s'.\",\n p, srcCfg.project.nam"
- "e);\n end\n end\n else\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField], p)\n end\n end\n end\n else\n if(srcField.kind == \"path\" and (not keeprelative[strSrcField])) then\n dstCfg[strDstField] = path.rebase(srcCfg[strSrcField],\n prj.location, dstCfg.project.location);\n else\n dstCfg[strDstField] = srcCfg[strSrcField];\n end\n end\n end\n --\n -- This function will take the list of project entries and apply their usage project data\n -- to the given configuration. It will copy compiling information for the projects that are\n -- not listed as linkage-only. It will copy the linking information for projects only if\n -- the source project is not a static library. It won't copy linking information\n -- if the project is in this solution; instead it will add that project to the configuration's\n -- links field, expecting that Premake will handle the rest.\n --\n local function copyusagedata(cfg, cfgname, linkToProjs)\n local myPrj = cfg.project;\n local"
- " bIsStaticLib = (getCfgKind(cfg) == \"StaticLib\");\n for prjName, prjEntry in pairs(linkToProjs) do\n local srcPrj = prjEntry.usageProj;\n local srcCfg = srcPrj.__configs[cfgname];\n for name, field in pairs(premake.fields) do\n if(srcCfg[name]) then\n if(field.usagecopy) then\n if(not prjEntry.bLinkageOnly) then\n copydependentfield(srcCfg, cfg, name)\n end\n elseif(field.linkagecopy) then\n --Copy the linkage data if we're building a non-static thing\n --and this is a pure usage project. If it's not pure-usage, then\n --we will simply put the project's name in the links field later.\n if((not bIsStaticLib) and (not prjEntry.proj)) then\n copydependentfield(srcCfg, cfg, name)\n end\n end\n end\n end\n if((not bIsStaticLib) and prjEntry.proj) then\n table.insert(cfg.links, prjEntry.proj.name);\n end\n end\n end\n local function inverseliteralvpaths()\n for sln in premake.solution.each() do\n for _,prj in ipairs(sln.projects) do\n prj.inversevpaths = "
- "{}\n for replacement, patterns in pairs(prj.vpaths or {}) do\n for _, pattern in ipairs(patterns) do\n if string.find(pattern, \"*\") == nil then\n prj.inversevpaths[pattern] = replacement\n end\n end\n end\n end\n end\n end\nfunction premake.bake.buildconfigs()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nprj.location = prj.location or sln.location or prj.basedir\nadjustpaths(prj.location, prj)\nfor _, blk in ipairs(prj.blocks) do\nadjustpaths(prj.location, blk)\nend\nend\nsln.location = sln.location or sln.basedir\nend\n -- convert paths for imported projects to be relative to solution location\nfor sln in premake.solution.each() do\nfor _, iprj in ipairs(sln.importedprojects) do\niprj.location = path.getabsolute(iprj.location)\nend\nend\n inverseliteralvpaths()\nfor sln in premake.solution.each() do\n"
- "local basis = collapse(sln)\nfor _, prj in ipairs(sln.projects) do\nprj.__configs = collapse(prj, basis)\nfor _, cfg in pairs(prj.__configs) do\nbake.postprocess(prj, cfg)\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs(sln.projects) do\nif(not prj.usage) then\nfor cfgname, cfg in pairs(prj.__configs) do\nlocal usesPrjs = getprojectsconnections(cfg, cfgname);\ncopyusagedata(cfg, cfgname, usesPrjs)\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs(sln.projects) do\nfor cfgName, cfg in pairs(prj.__configs) do\ncfg.build = true\nlocal removes = nil\nif cfg.removes ~= nil then\nremoves = cfg.removes[\"platforms\"];\nend\nif removes ~= nil then\nfor _,p in ipairs(removes) do\nif p == cfg.platform then\ncfg.build = false\nend\nend\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nlocal removeList = {};\nfor index, prj in ipairs(sln.projects) do\nif(prj.usage) then\ntable.insert(removeList, 1, index); --Add in reverse order.\nend\nend\nfor "
- "_, index in ipairs(removeList) do\ntable.remove(sln.projects, index);\nend\nend\nbuilduniquedirs()\nbuildtargets(cfg)\nend\nfunction premake.bake.postprocess(prj, cfg)\ncfg.project = prj\ncfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true)\ncfg.longname = premake.getconfigname(cfg.name, cfg.platform)\ncfg.location = cfg.location or cfg.basedir\nlocal platform = premake.platforms[cfg.platform]\nif platform.iscrosscompiler then\ncfg.system = cfg.platform\nelse\ncfg.system = os.get()\nend\nif cfg.kind == \"Bundle\"\nand _ACTION ~= \"gmake\"\nand (_ACTION ~= \"ninja\" and (not prj.options or not prj.options.SkipBundling))\nand not _ACTION:match(\"xcode[0-9]\") then\ncfg.kind = \"SharedLib\"\nend\nif cfg.kind == \"SharedLib\" and platform.nosharedlibs then\ncfg.kind = \"StaticLib\"\nend\nlocal removefiles = cfg.removefiles\nif _ACTION == 'gmake' or _ACTION == 'ninja' then\nremovefiles = table.join(removefiles, cfg.excludes)\nend\nlocal removefilesDict = {}\nfor _, fname in ipairs(removefiles) do"
- "\nremovefilesDict[fname] = true\nend\nlocal files = {}\nfor _, fname in ipairs(cfg.files) do\nif removefilesDict[fname] == nil then\ntable.insert(files, fname)\nend\nend\ncfg.files = files\nlocal allfiles = {}\nlocal allfilesDict = {}\nif cfg.allfiles ~= nil then\nfor _, fname in ipairs(cfg.allfiles) do\nif allfilesDict[fname] == nil then\nif removefilesDict[fname] == nil then\nallfilesDict[fname] = true\ntable.insert(allfiles, fname)\nend\nend\nend\nend\ncfg.allfiles = allfiles\nfor name, field in pairs(premake.fields) do\nif field.isflags then\nlocal values = cfg[name]\nfor _, flag in ipairs(values) do values[flag] = true end\nend\nend\nlocal cfgfields = {\n{\"__fileconfigs\", cfg.files},\n{\"__allfileconfigs\", cfg.allfiles},\n}\nfor _, cfgfield in ipairs(cfgfields) do\nlocal fieldname = cfgfield[1]\nlocal field = cfgfield[2]\ncfg[fieldname] = { }\nfor _, fname in ipairs(field) do\nlocal fcfg = {}\nif premake._filelevelconfig then\ncfg.terms.required = fname:lower()\nfor _, blk in ipairs(cfg.project."
- "blocks) do\nif (premake.iskeywordsmatch(blk.keywords, cfg.terms)) then\nmergeobject(fcfg, blk)\nend\nend\nend\nfcfg.name = fname\ncfg[fieldname][fname] = fcfg\ntable.insert(cfg[fieldname], fcfg)\nend\nend\nend\n",
+ "then\nreturn false\nend\nif matched == \"required\" then\nhasrequired = true\nend\nend\nif terms.required and not hasrequired then\nreturn false\nelse\nreturn true\nend\nend\nlocal function adjustpaths(location, obj)\nfunction adjustpathlist(list)\nfor i, p in ipairs(list) do\nlist[i] = path.getrelative(location, p)\nend\nend\nif obj.allfiles ~= nil then\nadjustpathlist(obj.allfiles)\nend\nfor name, value in pairs(obj) do\nlocal field = premake.fields[name]\nif field and value and not keeprelative[name] then\nif field.kind == \"path\" then\nobj[name] = path.getrelative(location, value)\nelseif field.kind == \"dirlist\" or field.kind == \"filelist\" then\nadjustpathlist(value)\nelseif field.kind == \"keypath\" then\nfor k,v in pairs(value) do\nadjustpathlist(v)\nend\nend\nend\nend\nend\nlocal function removevalue(tbl, remove)\nfor index, item in ipairs(tbl) do\nif item == remove then\ntable.remove(tbl, index)\nbreak\nend\nend\nend\n local function removevalues(tbl, removes)\nfor i = #tbl, 1, -1 do\nfor _, patte"
+ "rn in ipairs(removes) do\nif pattern == tbl[i] then\ntable.remove(tbl, i)\nbreak\nend\nend\nend\nfor k, v in pairs(tbl) do\nfor _, pattern in ipairs(removes) do\nif pattern == tbl[k] then\ntbl[k] = nil\nbreak\nend\nend\nend\nend\nlocal function mergefield(kind, dest, src, mergecopiestotail)\nlocal tbl = dest or { }\nif kind == \"keyvalue\" or kind == \"keypath\" then\nfor key, value in pairs(src) do\ntbl[key] = mergefield(\"list\", tbl[key], value, mergecopiestotail)\nend\nelse\nfor _, item in ipairs(src) do\nif tbl[item] then\nif mergecopiestotail then\nremovevalue(tbl, item)\ntable.insert(tbl, item)\ntbl[item] = item\nend\nelse\ntable.insert(tbl, item)\ntbl[item] = item\nend\nend\nend\nreturn tbl\nend\nlocal function mergeobject(dest, src)\nif not src then\nreturn\nend\nfor fieldname, value in pairs(src) do\nif not nocopy[fieldname] then\nlocal field = premake.fields[fieldname]\nif field then\nif type(value) == \"table\" then\ndest[fieldname] = mergefield(field.kind, dest[fieldname], value, field.mergecopies"
+ "totail)\nif src.removes then\nremoves = src.removes[fieldname]\nif removes then\nremovevalues(dest[fieldname], removes)\nend\nend\nelse\ndest[fieldname] = value\nend\nelse\ndest[fieldname] = value\nend\nend\nend\nend\nlocal function merge(dest, obj, basis, terms, cfgname, pltname)\nlocal key = cfgname or \"\"\npltname = pltname or \"Native\"\nif pltname ~= \"Native\" then\nkey = key .. pltname\nend\nterms.config = (cfgname or \"\"):lower()\nterms.platform = pltname:lower()\nlocal cfg = {}\nmergeobject(cfg, basis[key])\nadjustpaths(obj.location, cfg)\nmergeobject(cfg, obj)\nif (cfg.kind) then\nterms['kind']=cfg.kind:lower()\nend\nfor _, blk in ipairs(obj.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, terms))then\nmergeobject(cfg, blk)\nif (cfg.kind and not cfg.terms.kind) then\ncfg.terms['kind'] = cfg.kind:lower()\nterms['kind'] = cfg.kind:lower()\nend\nend\nend\ncfg.name = cfgname\ncfg.platform = pltname\nfor k,v in pairs(terms) do\ncfg.terms[k] =v\nend\ndest[key] = cfg\nend\nlocal function collap"
+ "se(obj, basis)\nlocal result = {}\nbasis = basis or {}\nlocal sln = obj.solution or obj\nlocal terms = premake.getactiveterms(obj)\nmerge(result, obj, basis, terms)--this adjusts terms\nfor _, cfgname in ipairs(sln.configurations) do\nlocal terms_local = {}\nfor k,v in pairs(terms)do terms_local[k]=v end\nmerge(result, obj, basis, terms_local, cfgname, \"Native\")--terms cam also be adjusted here\nfor _, pltname in ipairs(sln.platforms or {}) do\nif pltname ~= \"Native\" then\nmerge(result, obj, basis,terms_local, cfgname, pltname)--terms also here\nend\nend\nend\nreturn result\nend\nlocal function builduniquedirs()\nlocal num_variations = 4\nlocal cfg_dirs = {}\nlocal hit_counts = {}\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dirs = { }\ndirs[1] = path.getabsolute(path.join(cfg.location, cfg.objdir or cfg.project.objdir or \"obj\"))\ndirs[2] = path.join(dirs[1], iif(cfg.platform == \"Native\", \"\", cfg.platform))\ndirs[3] = path"
+ ".join(dirs[2], cfg.name)\ndirs[4] = path.join(dirs[3], cfg.project.name)\ncfg_dirs[cfg] = dirs\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, num_variations do\nlocal d = dirs[v]\nhit_counts[d] = (hit_counts[d] or 0) + 1\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dir\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, iif(cfg.flags.SingleOutputDir==true,num_variations-1,num_variations) do\ndir = cfg_dirs[cfg][v]\nif hit_counts[dir] == 1 then break end\nend\ncfg.objectsdir = path.getrelative(cfg.location, dir)\nend\nend\nend\nend\nlocal function buildtargets()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\ncfg.buildtarget = premake.gettarget(cfg, \"build\", pathstyle, namestyle, cfg.system)\ncfg.linktarget = premake.gettarget(cfg, \"link\", pathstyl"
+ "e, namestyle, cfg.system)\nif pathstyle == \"windows\" then\ncfg.objectsdir = path.translate(cfg.objectsdir, \"\\\\\")\nend\nend\nend\nend\nend\n local function getCfgKind(cfg)\n if(cfg.kind) then\n return cfg.kind;\n end\n if(cfg.project.__configs[\"\"] and cfg.project.__configs[\"\"].kind) then\n return cfg.project.__configs[\"\"].kind;\n end\n return nil\n end\n local function getprojrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage)\n if(not cfg) then return end\n local foundUsePrjs = {};\n for _, useName in ipairs(cfg[searchField]) do\n local testName = useName:lower();\n if((not foundList[testName])) then\n local theProj = nil;\n local theUseProj = nil;\n for _, prj in ipairs(cfg.project.solution.projects) do\n if (prj.name:lower() == testName) then\n if(prj.usage) then\n theUseProj = prj;\n else\n theProj = prj;\n end\n end\n end\n --Must connect to a usage project.\n if(theUseProj) then\n foundList[testName] = true;\n local prjEntry = {\n name = testName,\n pr"
+ "oj = theProj,\n usageProj = theUseProj,\n bLinkageOnly = bLinkage,\n };\n dstArray[testName] = prjEntry;\n table.insert(foundUsePrjs, theUseProj);\n end\n end\n end\n for _, usePrj in ipairs(foundUsePrjs) do\n --Links can only recurse through static libraries.\n if((searchField ~= \"links\") or\n (getCfgKind(usePrj.__configs[cfgname]) == \"StaticLib\")) then\n getprojrec(dstArray, foundList, usePrj.__configs[cfgname],\n cfgname, searchField, bLinkage);\n end\n end\n end\n --\n -- This function will recursively get all projects that the given configuration has in its \"uses\"\n -- field. The return values are a list of tables. Each table in that list contains the following:\n --name = The lowercase name of the project.\n --proj = The project. Can be nil if it is usage-only.\n --usageProj = The usage project. Can't be nil, as using a project that has no\n -- usage project is not put into the list.\n --bLinkageOnly = If this is true, then only the linkage information should be copied.\n "
+ "-- The recursion will only look at the \"uses\" field on *usage* projects.\n -- This function will also add projects to the list that are mentioned in the \"links\"\n -- field of usage projects. These will only copy linker information, but they will recurse.\n -- through other \"links\" fields.\n --\n local function getprojectsconnections(cfg, cfgname)\n local dstArray = {};\n local foundList = {};\n foundList[cfg.project.name:lower()] = true;\n --First, follow the uses recursively.\n getprojrec(dstArray, foundList, cfg, cfgname, \"uses\", false);\n --Next, go through all of the usage projects and recursively get their links.\n --But only if they're not already there. Get the links as linkage-only.\n local linkArray = {};\n for prjName, prjEntry in pairs(dstArray) do\n getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname,\n \"links\", true);\n end\n --Copy from linkArray into dstArray.\n for prjName, prjEntry in pairs(linkArray) do\n dstArray[prjName] = prjEntry;"
+ "\n end\n return dstArray;\n end\n local function isnameofproj(cfg, strName)\n local sln = cfg.project.solution;\n local strTest = strName:lower();\n for prjIx, prj in ipairs(sln.projects) do\n if (prj.name:lower() == strTest) then\n return true;\n end\n end\n return false;\n end\n --\n -- Copies the field from dstCfg to srcCfg.\n --\n local function copydependentfield(srcCfg, dstCfg, strSrcField)\n local srcField = premake.fields[strSrcField];\n local strDstField = strSrcField;\n if type(srcCfg[strSrcField]) == \"table\" then\n --handle paths.\n if (srcField.kind == \"dirlist\" or srcField.kind == \"filelist\") and\n (not keeprelative[strSrcField]) then\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField],\n path.rebase(p, srcCfg.project.location, dstCfg.project.location))\n end\n else\n if(strSrcField == \"links\") then\n for i,p in ipairs(srcCfg[strSrcField]) do\n if(not isnameofproj(dstCfg, p)) then\n table.insert(dstCfg[strDstField], p)\n else\n p"
+ "rintf(\"Failed to copy '%s' from proj '%s'.\",\n p, srcCfg.project.name);\n end\n end\n else\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField], p)\n end\n end\n end\n else\n if(srcField.kind == \"path\" and (not keeprelative[strSrcField])) then\n dstCfg[strDstField] = path.rebase(srcCfg[strSrcField],\n prj.location, dstCfg.project.location);\n else\n dstCfg[strDstField] = srcCfg[strSrcField];\n end\n end\n end\n --\n -- This function will take the list of project entries and apply their usage project data\n -- to the given configuration. It will copy compiling information for the projects that are\n -- not listed as linkage-only. It will copy the linking information for projects only if\n -- the source project is not a static library. It won't copy linking information\n -- if the project is in this solution; instead it will add that project to the configuration's\n -- links field, expecting that Premake will handle the rest.\n --\n local function copyusag"
+ "edata(cfg, cfgname, linkToProjs)\n local myPrj = cfg.project;\n local bIsStaticLib = (getCfgKind(cfg) == \"StaticLib\");\n for prjName, prjEntry in pairs(linkToProjs) do\n local srcPrj = prjEntry.usageProj;\n local srcCfg = srcPrj.__configs[cfgname];\n for name, field in pairs(premake.fields) do\n if(srcCfg[name]) then\n if(field.usagecopy) then\n if(not prjEntry.bLinkageOnly) then\n copydependentfield(srcCfg, cfg, name)\n end\n elseif(field.linkagecopy) then\n --Copy the linkage data if we're building a non-static thing\n --and this is a pure usage project. If it's not pure-usage, then\n --we will simply put the project's name in the links field later.\n if((not bIsStaticLib) and (not prjEntry.proj)) then\n copydependentfield(srcCfg, cfg, name)\n end\n end\n end\n end\n if((not bIsStaticLib) and prjEntry.proj) then\n table.insert(cfg.links, prjEntry.proj.name);\n end\n end\n end\n local function inverseliteralvpaths()\n for sln in premake.solution.each() do\n for"
+ " _,prj in ipairs(sln.projects) do\n prj.inversevpaths = {}\n for replacement, patterns in pairs(prj.vpaths or {}) do\n for _, pattern in ipairs(patterns) do\n if string.find(pattern, \"*\") == nil then\n prj.inversevpaths[pattern] = replacement\n end\n end\n end\n end\n end\n end\nfunction premake.bake.buildconfigs()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nprj.location = prj.location or sln.location or prj.basedir\nadjustpaths(prj.location, prj)\nfor _, blk in ipairs(prj.blocks) do\nadjustpaths(prj.location, blk)\nend\nend\nsln.location = sln.location or sln.basedir\nend\n -- convert paths for imported projects to be relative to solution location\nfor sln in premake.solution.each() do\nfor _, iprj in ipairs(sln.importedprojects) do\niprj.location = path.getabsolute(iprj.location)\nend\nend\n"
+ " inverseliteralvpaths()\nfor sln in premake.solution.each() do\nlocal basis = collapse(sln)\nfor _, prj in ipairs(sln.projects) do\nprj.__configs = collapse(prj, basis)\nfor _, cfg in pairs(prj.__configs) do\nbake.postprocess(prj, cfg)\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs(sln.projects) do\nif(not prj.usage) then\nfor cfgname, cfg in pairs(prj.__configs) do\nlocal usesPrjs = getprojectsconnections(cfg, cfgname);\ncopyusagedata(cfg, cfgname, usesPrjs)\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs(sln.projects) do\nfor cfgName, cfg in pairs(prj.__configs) do\ncfg.build = true\nlocal removes = nil\nif cfg.removes ~= nil then\nremoves = cfg.removes[\"platforms\"];\nend\nif removes ~= nil then\nfor _,p in ipairs(removes) do\nif p == cfg.platform then\ncfg.build = false\nend\nend\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nlocal removeList = {};\nfor index, prj in ipairs(sln.projects) do\nif(prj.usage) then\ntabl"
+ "e.insert(removeList, 1, index); --Add in reverse order.\nend\nend\nfor _, index in ipairs(removeList) do\ntable.remove(sln.projects, index);\nend\nend\nbuilduniquedirs()\nbuildtargets(cfg)\nend\nfunction premake.bake.postprocess(prj, cfg)\ncfg.project = prj\ncfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true)\ncfg.longname = premake.getconfigname(cfg.name, cfg.platform)\ncfg.location = cfg.location or cfg.basedir\nlocal platform = premake.platforms[cfg.platform]\nif platform.iscrosscompiler then\ncfg.system = cfg.platform\nelse\ncfg.system = os.get()\nend\nif cfg.kind == \"Bundle\"\nand _ACTION ~= \"gmake\"\nand (_ACTION ~= \"ninja\" and (not prj.options or not prj.options.SkipBundling))\nand not _ACTION:match(\"xcode[0-9]\") then\ncfg.kind = \"SharedLib\"\nend\nif cfg.kind == \"SharedLib\" and platform.nosharedlibs then\ncfg.kind = \"StaticLib\"\nend\nlocal removefiles = cfg.removefiles\nif _ACTION == 'gmake' or _ACTION == 'ninja' then\nremovefiles = table.join(removefiles, cfg.excludes)\ne"
+ "nd\nlocal removefilesDict = {}\nfor _, fname in ipairs(removefiles) do\nremovefilesDict[fname] = true\nend\nlocal files = {}\nfor _, fname in ipairs(cfg.files) do\nif removefilesDict[fname] == nil then\ntable.insert(files, fname)\nend\nend\ncfg.files = files\nlocal allfiles = {}\nlocal allfilesDict = {}\nif cfg.allfiles ~= nil then\nfor _, fname in ipairs(cfg.allfiles) do\nif allfilesDict[fname] == nil then\nif removefilesDict[fname] == nil then\nallfilesDict[fname] = true\ntable.insert(allfiles, fname)\nend\nend\nend\nend\ncfg.allfiles = allfiles\nfor name, field in pairs(premake.fields) do\nif field.isflags then\nlocal values = cfg[name]\nfor _, flag in ipairs(values) do values[flag] = true end\nend\nend\nlocal cfgfields = {\n{\"__fileconfigs\", cfg.files},\n{\"__allfileconfigs\", cfg.allfiles},\n}\nfor _, cfgfield in ipairs(cfgfields) do\nlocal fieldname = cfgfield[1]\nlocal field = cfgfield[2]\ncfg[fieldname] = { }\nfor _, fname in ipairs(field) do\nlocal fcfg = {}\nif premake._filelevelconfig then"
+ "\ncfg.terms.required = fname:lower()\nfor _, blk in ipairs(cfg.project.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, cfg.terms)) then\nmergeobject(fcfg, blk)\nend\nend\nend\nfcfg.name = fname\ncfg[fieldname][fname] = fcfg\ntable.insert(cfg[fieldname], fcfg)\nend\nend\nend\n",
/* base/api.lua */
"premake.fields = {}\npremake.check_paths = false\nfunction premake.checkvalue(value, allowed)\nif (allowed) then\nif (type(allowed) == \"function\") then\nreturn allowed(value)\nelse\nfor _,v in ipairs(allowed) do\nif (value:lower() == v:lower()) then\nreturn v\nend\nend\nreturn nil, \"invalid value '\" .. value .. \"'\"\nend\nelse\nreturn value\nend\nend\nfunction premake.getobject(t)\nlocal container\nif (t == \"container\" or t == \"solution\") then\ncontainer = premake.CurrentContainer\nelse\ncontainer = premake.CurrentConfiguration\nend\nif t == \"solution\" then\nif typex(container) == \"project\" then\ncontainer = container.solution\nend\nif typex(container) ~= \"solution\" then\ncontainer = nil\nend\nend\nlocal msg\nif (not container) then\nif (t == \"container\") then\nmsg = \"no active solution or project\"\nelseif (t == \"solution\") then\nmsg = \"no active solution\"\nelse\nmsg = \"no active solution, project, or configuration\"\nend\nend\nreturn container, msg\nend\nfunction premake.setarray(obj, "
@@ -101,22 +102,23 @@ const char* builtin_scripts[] = {
"nd(_ACTION, \"vs\") ~= 1 then\nerror(\"Only available for visual studio actions\")\nend\nsln, err = premake.getobject(\"solution\")\nif not sln then\nerror(err)\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nlocal project = {}\nproject.location = location\nproject.group = group\nproject.flags = {}\ntable.insert(sln.importedprojects, project)\n end\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\nfunction enablefilelevelconfig()\npremake._filelevelconfig = true\nend\nfunction newapifield(field)\npremake.fields[field.name] = field\n_G[field.name] = function(value)\nreturn accessor(field.name, value)\nend\nif field.kind == \"list\"\nor field.kind == \"dirlist\"\nor field.kind == \"filelist\"\nor field.kind == \"absolutefilelist\"\nthen\nif field.name ~= \"removefiles\"\nand field.name ~= \"files\" then\n_G[\"remove\"..field.name] = function(value)\npremake.remove(field.name, value)\nend\nend\nend\nend\nnewapifield {\nname = \"arc"
"hivesplit_size\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"basedir\",\nkind = \"path\",\nscope = \"container\",\n}\nnewapifield {\nname = \"buildaction\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"Compile\",\n\"Copy\",\n\"Embed\",\n\"None\"\n}\n}\nnewapifield {\nname = \"buildoptions\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_asm\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_c\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_cpp\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_objc\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_objcpp\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_vala\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"clrreferences\",\nkind = \"list\",\nscope = \"container\",\n}\nnewapifield {\nname"
" = \"configurations\",\nkind = \"list\",\nscope = \"solution\",\n}\nnewapifield {\nname = \"custombuildtask\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"debugcmd\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"debugargs\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"debugdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"debugenvs\" ,\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"defines\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"deploymentoptions\",\nkind = \"list\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"dependency\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"deploymode\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"excludes\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"forcenative\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield "
- "{\nname = \"nopch\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"files\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"removefiles\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"flags\",\nkind = \"list\",\nscope = \"config\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_flags = {\nAntBuildDebuggable = 1,\nATL = 1,\nC7DebugInfo = 1,\nCpp11 = 1,\nCpp14 = 1,\nCpp17 = 1,\nCppLatest = 1,\nDebugEnvsDontMerge = 1,\nDebugEnvsInherit = 1,\nDeploymentContent = 1,\nEnableMinimalRebuild = 1,\nEnableSSE = 1,\nEnableSSE2 = 1,\nEnableAVX = 1,\nEnableAVX2 = 1,\nPedanticWarnings = 1,\nExtraWarnings = 1,\nFatalWarnings = 1,\nFloatFast = 1,\nFloatStrict = 1,\nFullSymbols = 1,\nGenerateMapFiles = 1,\nHotpatchable = 1,\nLinkSupportCircularDependencies = 1,\nManaged = 1,\nMinimumWarnings = 1,\nMFC = 1,\nNativeWChar = 1,\nNo64BitChecks = 1,\nNoBufferSecurityCheck = 1,\nNoEditAndContinue = 1,\nNoExceptions = 1,\nNo"
- "FramePointer = 1,\nNoImportLib = 1,\nNoIncrementalLink = 1,\nNoJMC = 1,\nNoManifest = 1,\nNoMultiProcessorCompilation = 1,\nNoNativeWChar = 1,\nNoOptimizeLink = 1,\nNoPCH = 1,\nNoRTTI = 1,\nNoRuntimeChecks = 1,\nNoWinMD = 1, -- explicitly disables Windows Metadata\nNoWinRT = 1, -- explicitly disables Windows Runtime Extension\nFastCall = 1,\nStdCall = 1,\nSingleOutputDir = 1,\nObjcARC = 1,\nOptimize = 1,\nOptimizeSize = 1,\nOptimizeSpeed = 1,\nDebugRuntime = 1,\nReleaseRuntime = 1,\nSEH = 1,\nStaticATL = 1,\nStaticRuntime = 1,\nSymbols = 1,\nUnicode = 1,\nUnitySupport = 1,\nUnsafe = 1,\nUnsignedChar = 1,\nUseFullPaths = 1,\nUseLDResponseFile = 1,\nUseObjectResponseFile = 1,\nWinMain = 1\n}\nlocal englishToAmericanSpelling =\n{\nnooptimiselink = 'nooptimizelink',\noptimise = 'optimize',\noptimisesize = 'optimizesize',\noptimisespeed = 'optimizespeed',\n}\nlocal lowervalue = value:lower()\nlowervalue = englishToAmericanSpelling[lowervalue] or lowervalue\nfor v, _ in pairs(allowed_flags) do\nif v:lower() =="
- " lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid flag\"\nend,\n}\nnewapifield {\nname = \"framework\",\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"1.0\",\n\"1.1\",\n\"2.0\",\n\"3.0\",\n\"3.5\",\n\"4.0\",\n\"4.5\",\n\"4.5.1\",\n\"4.5.2\",\n\"4.6\",\n\"4.6.1\",\n\"4.6.2\",\n}\n}\nnewapifield {\nname = \"iostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"macostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"tvostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"windowstargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"windowstargetplatformminversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"forcedincludes\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"imagepath\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"imageoptions"
- "\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibextension\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibname\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibprefix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibsuffix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"includedirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"systemincludedirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"userincludedirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"usingdirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"kind\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"ConsoleApp\",\n\"Window"
- "edApp\",\n\"StaticLib\",\n\"SharedLib\",\n\"Bundle\",\n}\n}\nnewapifield {\nname = \"language\",\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"C\",\n\"C++\",\n\"C#\",\n\"Vala\",\n\"Swift\",\n}\n}\nnewapifield {\nname = \"libdirs\",\nkind = \"dirlist\",\nscope = \"config\",\nlinkagecopy = true,\n}\nnewapifield {\nname = \"linkoptions\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"links\",\nkind = \"list\",\nscope = \"config\",\nallowed = function(value)\nif value:find('/', nil, true) then\nvalue = path.getabsolute(value)\nend\nreturn value\nend,\nlinkagecopy = true,\nmergecopiestotail = true,\n}\nnewapifield {\nname = \"location\",\nkind = \"path\",\nscope = \"container\",\n}\nnewapifield {\nname = \"makesettings\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"messageskip\",\nkind = \"list\",\nscope = \"solution\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_messages = {\nSkipCreatingMessage = 1,\nSkipBuild"
- "ingMessage = 1,\nSkipCleaningMessage = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_messages) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid message to skip\"\nend,\n}\nnewapifield {\nname = \"msgarchiving\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgcompile\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgprecompile\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgcompile_objc\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgresource\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msglinking\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"objdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"options\",\nkind = \"list\",\nscope = \"container\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_options = {\nForceCPP = 1,\nArchiveSplit = 1,"
- "\nSkipBundling = 1,\nXcodeLibrarySchemes = 1,\nXcodeSchemeNoConfigs = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_options) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid option\"\nend,\n}\nnewapifield {\nname = \"pchheader\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"pchsource\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"platforms\",\nkind = \"list\",\nscope = \"solution\",\nallowed = table.keys(premake.platforms),\n}\nnewapifield {\nname = \"postbuildcommands\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"prebuildcommands\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"postcompiletasks\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"prelinkcommands\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"propertysheets\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"pullmappingfile\","
- "\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"applicationdatadir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"finalizemetasource\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"resdefines\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"resincludedirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"resoptions\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"sdkreferences\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"startproject\",\nkind = \"string\",\nscope = \"solution\",\n}\nnewapifield {\nname = \"targetdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetsubdir\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetextension\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetname\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = "
- "\"targetprefix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetsuffix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"trimpaths\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"uuid\",\nkind = \"string\",\nscope = \"container\",\nallowed = function(value)\nlocal ok = true\nif (#value ~= 36) then ok = false end\nfor i=1,36 do\nlocal ch = value:sub(i,i)\nif (not ch:find(\"[ABCDEFabcdef0123456789-]\")) then ok = false end\nend\nif (value:sub(9,9) ~= \"-\") then ok = false end\nif (value:sub(14,14) ~= \"-\") then ok = false end\nif (value:sub(19,19) ~= \"-\") then ok = false end\nif (value:sub(24,24) ~= \"-\") then ok = false end\nif (not ok) then\nreturn nil, \"invalid UUID\"\nend\nreturn value:upper()\nend\n}\nnewapifield {\nname = \"uses\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"vapidirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"vpaths\",\nkind = \"keypath\",\nsco"
- "pe = \"container\",\n}\nnewapifield {\nname = \"vsimportreferences\",\nkind = \"filelist\",\nscope = \"container\",\n}\nnewapifield {\nname = \"dpiawareness\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"None\",\n\"High\",\n\"HighPerMonitor\",\n}\n}\nnewapifield {\nname = \"xcodeprojectopts\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"xcodetargetopts\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"xcodescriptphases\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"xcodecopyresources\",\nkind = \"table\",\nscope = \"project\",\n}\nnewapifield {\nname = \"xcodecopyframeworks\",\nkind = \"filelist\",\nscope = \"project\",\n}\nnewapifield {\nname = \"wholearchive\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"swiftmodulemaps\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_swift\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"linkopti"
- "ons_swift\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidtargetapi\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidminapi\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidarch\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"armv7-a\",\n\"armv7-a-hard\",\n\"arm64-v8a\",\n\"x86\",\n\"x86_64\",\n}\n}\nnewapifield {\nname = \"androidndktoolchainversion\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidstltype\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidcppstandard\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"c++98\",\n\"c++11\",\n\"c++1y\",\n\"gnu++98\",\n\"gnu++11\",\n\"gnu++1y\",\n}\n}\nnewapifield {\nname = \"androidlinker\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"bfd\",\n\"gold\",\n}\n}\nnewapifield {\nname = \"androiddebugintentparams\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = "
- "\"antbuildjavasourcedirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildjardirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildjardependencies\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildnativelibdirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildnativelibdependencies\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildassetsdirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"postsolutioncallbacks\",\nkind = \"list\",\nscope = \"solution\",\n}\nnewapifield {\nname = \"postprojectcallbacks\",\nkind = \"list\",\nscope = \"project\",\n}\n",
+ "{\nname = \"nopch\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"files\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"removefiles\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"flags\",\nkind = \"list\",\nscope = \"config\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_flags = {\nAntBuildDebuggable = 1,\nC7DebugInfo = 1,\nCpp11 = 1,\nCpp14 = 1,\nCpp17 = 1,\nCpp20 = 1,\nCppLatest = 1,\nDebugEnvsDontMerge = 1,\nDebugEnvsInherit = 1,\nDeploymentContent = 1,\nEnableMinimalRebuild = 1,\nEnableSSE = 1,\nEnableSSE2 = 1,\nEnableAVX = 1,\nEnableAVX2 = 1,\nPedanticWarnings = 1,\nExtraWarnings = 1,\nFatalWarnings = 1,\nFloatFast = 1,\nFloatStrict = 1,\nFullSymbols = 1,\nGenerateMapFiles = 1,\nHotpatchable = 1,\nLinkSupportCircularDependencies = 1,\nManaged = 1,\nMinimumWarnings = 1,\nNativeWChar = 1,\nNo64BitChecks = 1,\nNoBufferSecurityCheck = 1,\nNoEditAndContinue = 1,\nNoExceptions = 1,\nNoFramePoi"
+ "nter = 1,\nNoImportLib = 1,\nNoIncrementalLink = 1,\nNoJMC = 1,\nNoManifest = 1,\nNoMultiProcessorCompilation = 1,\nNoNativeWChar = 1,\nNoOptimizeLink = 1,\nNoPCH = 1,\nNoRTTI = 1,\nNoRuntimeChecks = 1,\nNoWinMD = 1, -- explicitly disables Windows Metadata\nNoWinRT = 1, -- explicitly disables Windows Runtime Extension\nFastCall = 1,\nStdCall = 1,\nSingleOutputDir = 1,\nObjcARC = 1,\nOptimize = 1,\nOptimizeSize = 1,\nOptimizeSpeed = 1,\nDebugRuntime = 1,\nReleaseRuntime = 1,\nSEH = 1,\nStaticRuntime = 1,\nSymbols = 1,\nUnicode = 1,\nUnitySupport = 1,\nUnsafe = 1,\nUnsignedChar = 1,\nUseFullPaths = 1,\nUseLDResponseFile = 1,\nUseObjectResponseFile = 1,\nWinMain = 1\n}\nlocal englishToAmericanSpelling =\n{\nnooptimiselink = 'nooptimizelink',\noptimise = 'optimize',\noptimisesize = 'optimizesize',\noptimisespeed = 'optimizespeed',\n}\nlocal lowervalue = value:lower()\nlowervalue = englishToAmericanSpelling[lowervalue] or lowervalue\nfor v, _ in pairs(allowed_flags) do\nif v:lower() == lowervalue then\nreturn"
+ " v\nend\nend\nreturn nil, \"invalid flag\"\nend,\n}\nnewapifield {\nname = \"framework\",\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"1.0\",\n\"1.1\",\n\"2.0\",\n\"3.0\",\n\"3.5\",\n\"4.0\",\n\"4.5\",\n\"4.5.1\",\n\"4.5.2\",\n\"4.6\",\n\"4.6.1\",\n\"4.6.2\",\n}\n}\nnewapifield {\nname = \"iostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"macostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"tvostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"visionostargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"windowstargetplatformversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"windowstargetplatformminversion\",\nkind = \"string\",\nscope = \"project\",\n}\nnewapifield {\nname = \"forcedincludes\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"imagepath\","
+ "\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"imageoptions\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibextension\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibname\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibprefix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"implibsuffix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"includedirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"systemincludedirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"userincludedirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"usingdirs\",\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n}\nnewapifield {\nname = \"kind\","
+ "\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"ConsoleApp\",\n\"WindowedApp\",\n\"StaticLib\",\n\"SharedLib\",\n\"Bundle\",\n}\n}\nnewapifield {\nname = \"language\",\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"C\",\n\"C++\",\n\"C#\",\n\"Vala\",\n\"Swift\",\n}\n}\nnewapifield {\nname = \"libdirs\",\nkind = \"dirlist\",\nscope = \"config\",\nlinkagecopy = true,\n}\nnewapifield {\nname = \"linkoptions\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"links\",\nkind = \"list\",\nscope = \"config\",\nallowed = function(value)\nif value:find('/', nil, true) then\nvalue = path.getabsolute(value)\nend\nreturn value\nend,\nlinkagecopy = true,\nmergecopiestotail = true,\n}\nnewapifield {\nname = \"location\",\nkind = \"path\",\nscope = \"container\",\n}\nnewapifield {\nname = \"makesettings\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"messageskip\",\nkind = \"list\",\nscope = \"solution\",\nisflags = true,\nusagecopy = true,\nallowed "
+ "= function(value)\nlocal allowed_messages = {\nSkipCreatingMessage = 1,\nSkipBuildingMessage = 1,\nSkipCleaningMessage = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_messages) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid message to skip\"\nend,\n}\nnewapifield {\nname = \"msgarchiving\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgcompile\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgprecompile\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgcompile_objc\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msgresource\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"msglinking\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"objdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"options\",\nkind = \"list\",\nscope = \"container\",\nisflags = true,\nusagecopy = true,\nallo"
+ "wed = function(value)\nlocal allowed_options = {\nForceCPP = 1,\nArchiveSplit = 1,\nSkipBundling = 1,\nXcodeLibrarySchemes = 1,\nXcodeSchemeNoConfigs = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_options) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid option\"\nend,\n}\nnewapifield {\nname = \"pchheader\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"pchsource\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"platforms\",\nkind = \"list\",\nscope = \"solution\",\nallowed = table.keys(premake.platforms),\n}\nnewapifield {\nname = \"postbuildcommands\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"prebuildcommands\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"postcompiletasks\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"prelinkcommands\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"propertysheets\",\nkind ="
+ " \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"pullmappingfile\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"applicationdatadir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"finalizemetasource\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"resdefines\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"resincludedirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"resoptions\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"sdkreferences\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"startproject\",\nkind = \"string\",\nscope = \"solution\",\n}\nnewapifield {\nname = \"targetdir\",\nkind = \"path\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetsubdir\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetextension\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"t"
+ "argetname\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetprefix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"targetsuffix\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"trimpaths\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"uuid\",\nkind = \"string\",\nscope = \"container\",\nallowed = function(value)\nlocal ok = true\nif (#value ~= 36) then ok = false end\nfor i=1,36 do\nlocal ch = value:sub(i,i)\nif (not ch:find(\"[ABCDEFabcdef0123456789-]\")) then ok = false end\nend\nif (value:sub(9,9) ~= \"-\") then ok = false end\nif (value:sub(14,14) ~= \"-\") then ok = false end\nif (value:sub(19,19) ~= \"-\") then ok = false end\nif (value:sub(24,24) ~= \"-\") then ok = false end\nif (not ok) then\nreturn nil, \"invalid UUID\"\nend\nreturn value:upper()\nend\n}\nnewapifield {\nname = \"uses\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"vapidirs\",\nkind = \"dirlist\",\nsc"
+ "ope = \"config\",\n}\nnewapifield {\nname = \"vpaths\",\nkind = \"keypath\",\nscope = \"container\",\n}\nnewapifield {\nname = \"vsimportreferences\",\nkind = \"filelist\",\nscope = \"container\",\n}\nnewapifield {\nname = \"dpiawareness\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"None\",\n\"High\",\n\"HighPerMonitor\",\n}\n}\nnewapifield {\nname = \"xcodeprojectopts\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"xcodetargetopts\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"xcodescriptphases\",\nkind = \"table\",\nscope = \"config\",\n}\nnewapifield {\nname = \"xcodecopyresources\",\nkind = \"table\",\nscope = \"project\",\n}\nnewapifield {\nname = \"xcodecopyframeworks\",\nkind = \"filelist\",\nscope = \"project\",\n}\nnewapifield {\nname = \"wholearchive\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"swiftmodulemaps\",\nkind = \"filelist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"buildoptions_swif"
+ "t\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"linkoptions_swift\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidtargetapi\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidminapi\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidarch\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"armv7-a\",\n\"armv7-a-hard\",\n\"arm64-v8a\",\n\"x86\",\n\"x86_64\",\n}\n}\nnewapifield {\nname = \"androidndktoolchainversion\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidstltype\",\nkind = \"string\",\nscope = \"config\",\n}\nnewapifield {\nname = \"androidcppstandard\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"c++98\",\n\"c++11\",\n\"c++1y\",\n\"gnu++98\",\n\"gnu++11\",\n\"gnu++1y\",\n}\n}\nnewapifield {\nname = \"androidlinker\",\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"bfd\",\n\"gold\",\n}\n}\nnewapifield {\nname = \"androiddebugi"
+ "ntentparams\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildjavasourcedirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildjardirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildjardependencies\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildnativelibdirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildnativelibdependencies\",\nkind = \"list\",\nscope = \"config\",\n}\nnewapifield {\nname = \"antbuildassetsdirs\",\nkind = \"dirlist\",\nscope = \"config\",\n}\nnewapifield {\nname = \"postsolutioncallbacks\",\nkind = \"list\",\nscope = \"solution\",\n}\nnewapifield {\nname = \"postprojectcallbacks\",\nkind = \"list\",\nscope = \"project\",\n}\n",
/* base/cmdline.lua */
"newoption\n{\ntrigger = \"cc\",\nvalue = \"VALUE\",\ndescription = \"Choose a C/C++ compiler set\",\nallowed = {\n{ \"gcc\", \"GNU GCC (gcc/g++)\" },\n{ \"ow\", \"OpenWatcom\" },\n{ \"ghs\", \"Green Hills Software\" },\n}\n}\nnewoption\n{\ntrigger = \"dotnet\",\nvalue = \"VALUE\",\ndescription = \"Choose a .NET compiler set\",\nallowed = {\n{ \"msnet\", \"Microsoft .NET (csc)\" },\n{ \"mono\", \"Novell Mono (mcs)\" },\n{ \"pnet\", \"Portable.NET (cscc)\" },\n}\n}\nnewoption\n{\ntrigger = \"file\",\nvalue = \"FILE\",\ndescription = \"Read FILE as a Premake script; default is 'premake4.lua'\"\n}\nnewoption\n{\ntrigger = \"help\",\ndescription = \"Display this information\"\n}\nnewoption\n{\ntrigger = \"os\",\nvalue = \"VALUE\",\ndescription = \"Generate files for a different operating system\",\nallowed = {\n{ \"bsd\", \"OpenBSD, NetBSD, or FreeBSD\" },\n{ \"linux\", \"Linux\" },\n{ \"macosx\", \"Apple Mac OS X\" },\n{ \"solaris\", \"Sola"
- "ris\" },\n{ \"windows\", \"Microsoft Windows\" },\n}\n}\nnewoption\n{\ntrigger = \"platform\",\nvalue = \"VALUE\",\ndescription = \"Add target architecture (if supported by action)\",\nallowed = {\n{ \"x32\", \"32-bit\" },\n{ \"x64\", \"64-bit\" },\n{ \"universal\", \"Mac OS X Universal, 32- and 64-bit\" },\n{ \"universal32\", \"Mac OS X Universal, 32-bit only\" },\n{ \"universal64\", \"Mac OS X Universal, 64-bit only\" },\n{ \"ps3\", \"Playstation 3\" },\n{ \"orbis\", \"Playstation 4\" },\n{ \"xbox360\", \"Xbox 360\" },\n{ \"durango\", \"Xbox One\" },\n{ \"ARM\", \"ARM\" },\n{ \"PowerPC\", \"PowerPC\" },\n}\n}\nnewoption\n{\ntrigger = \"scripts\",\nvalue = \"path\",\ndescription = \"Search for additional scripts on the given path\"\n}\nnewoption\n{\ntrigger = \"debug-profiler\",\ndescription = \"GENie script generation profiler.\"\n}\nnewoption\n{\ntrigger = \"version\",\ndescription = \"Display version information\"\n}\n",
+ "ris\" },\n{ \"windows\", \"Microsoft Windows\" },\n}\n}\nnewoption\n{\ntrigger = \"platform\",\nvalue = \"VALUE\",\ndescription = \"Add target architecture (if supported by action)\",\nallowed = {\n{ \"x32\", \"32-bit\" },\n{ \"x64\", \"64-bit\" },\n{ \"universal\", \"Mac OS X Universal, 32- and 64-bit\" },\n{ \"universal32\", \"Mac OS X Universal, 32-bit only\" },\n{ \"universal64\", \"Mac OS X Universal, 64-bit only\" },\n{ \"ps3\", \"Playstation 3\" },\n{ \"orbis\", \"Playstation 4\" },\n{ \"xbox360\", \"Xbox 360\" },\n{ \"durango\", \"Xbox One\" },\n{ \"ARM\", \"ARM\" },\n{ \"ARM64\", \"ARM64\" },\n{ \"PowerPC\", \"PowerPC\" },\n{ \"nx32\", \"Nintendo Switch, 32-bit only\" },\n{ \"nx64\", \"Nintendo Switch, 64-bit only\" },\n{ \"gdk-desktop\", \"GDK Windows Desktop\" },\n{ \"gdk-xboxone\", \"GDK Xbox One\" },\n{ \"gdk-scarlett\",\"GDK Xbox Scarlett\" },\n}\n}\nnewoption\n{\ntrigger = \"scripts\",\nvalue = \"path"
+ "\",\ndescription = \"Search for additional scripts on the given path\"\n}\nnewoption\n{\ntrigger = \"debug-profiler\",\ndescription = \"GENie script generation profiler.\"\n}\nnewoption\n{\ntrigger = \"version\",\ndescription = \"Display version information\"\n}\n",
/* base/inspect.lua */
"-- Copyright (c) 2013 Enrique García Cota\nlocal function smartQuote(str)\n if str:match('\"') and not str:match(\"'\") then\n return \"'\" .. str .. \"'\"\n end\n return '\"' .. str:gsub('\"', '\\\\\"') .. '\"'\nend\nlocal controlCharsTranslation = {\n [\"\\a\"] = \"\\\\a\", [\"\\b\"] = \"\\\\b\", [\"\\f\"] = \"\\\\f\", [\"\\n\"] = \"\\\\n\",\n [\"\\r\"] = \"\\\\r\", [\"\\t\"] = \"\\\\t\", [\"\\v\"] = \"\\\\v\"\n}\nlocal function escapeChar(c) return controlCharsTranslation[c] end\nlocal function escape(str)\n local result = str:gsub(\"\\\\\", \"\\\\\\\\\"):gsub(\"(%c)\", escapeChar)\n return result\nend\nlocal function isIdentifier(str)\n return type(str) == 'string' and str:match( \"^[_%a][_%a%d]*$\" )\nend\nlocal function isArrayKey(k, length)\n return type(k) == 'number' and 1 <= k and k <= length\nend\nlocal function isDictionaryKey(k, length)\n return not isArrayKey(k, length)\nend\nlocal defaultTypeOrders = {\n ['number'] = 1, ['boolean'] = 2, ['string'] = 3, ['table'] = 4,\n ['fu"
@@ -146,13 +148,13 @@ const char* builtin_scripts[] = {
"fg.kind == \"ConsoleApp\") then\nreturn \"Exe\"\nelseif (cfg.kind == \"WindowedApp\") then\nreturn \"WinExe\"\nelseif (cfg.kind == \"SharedLib\") then\nreturn \"Library\"\nend\nend\n",
/* tools/gcc.lua */
- "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.rc = \"windres\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nPedanticWarnings = \"-Wall -Wextra -pedantic\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nCpp11 = \"-std=c++11\",\nCpp14 = \"-std=c++14\",\nCpp17 = \"-std=c++17\",\nCppLatest = \"-std=c++2a\",\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\nlocal objcflags =\n{\nObjcARC = \"-fobjc-arc\",\n}\npremake.gcc.platforms =\n{\nNative = {\n"
- "cppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar = \"orbis-ar\",\ncppflag"
- "s = \"-MMD -MP\",\n},\nEmscripten = {\ncc = \"$(EMSCRIPTEN)/emcc\",\ncxx = \"$(EMSCRIPTEN)/em++\",\nar = \"$(EMSCRIPTEN)/emar\",\ncppflags = \"-MMD -MP\",\n}\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\ntable.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getobjcflags(cfg)\nreturn table.translate(cfg.flags, objcflags)\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then"
- "\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"Bundle\" then\ntable.insert(result, \"-bundle\")\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platform.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L\\\"' .. value .. '\\\"')\nend\nreturn result\nend\nfunction premake.gcc.islibfile(p)\nif path.getextension(p) == \".a\" then\nreturn true\nend\nreturn false\nend\nfunction premake.gcc.ge"
- "tlibfiles(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\nvalue = path.rebase(value, cfg.project.location, cfg.location)\ntable.insert(result, _MAKE.esc(value))\nelseif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.insert(result, '-l' .. _MAKE.esc(path.getname(value)))\nend\nend\nreturn result\nend\nfunction premake.gcc.wholearchive(lib)\nif premake.gcc.llvm then\nreturn {\"-force_load\", lib}\nelseif os.get() == \"macosx\" then\nreturn {\"-Wl,-force_load\", lib}\nelse\nreturn {\"-Wl,--whole-archive\", lib, \"-Wl,--no-whole-archive\"}\nend\nend\nfunction premake.gcc.getarchiveflags(prj, cfg, nd"
- "x)\nlocal result = {}\nif cfg.platform:startswith(\"Universal\") then\nif prj.options.ArchiveSplit then\nerror(\"gcc tool 'Universal*' platforms do not support split archives\")\nend\ntable.insert(result, '-o')\nelse\nif (not prj.options.ArchiveSplit) then\nif premake.gcc.llvm then\ntable.insert(result, 'rcs')\nelse\ntable.insert(result, '-rcs')\nend\nelse\nif premake.gcc.llvm then\nif (not ndx) then\ntable.insert(result, 'qc')\nelse\ntable.insert(result, 'cs')\nend\nelse\nif (not ndx) then\ntable.insert(result, '-qc')\nelse\ntable.insert(result, '-cs')\nend\nend\nend\nend\nreturn result\nend\nfunction premake.gcc.getdefines(defines)\nlocal result = { }\nfor _,def in ipairs(defines) do\ntable.insert(result, \"-D\" .. def)\nend\nreturn result\nend\nfunction premake.gcc.getincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-I\\\"\" .. dir .. \"\\\"\")\nend\nreturn result\nend\nfunction premake.gcc.getquoteincludedirs(includedirs)\nlocal result = { }\nfor _,d"
- "ir in ipairs(includedirs) do\ntable.insert(result, \"-iquote \\\"\" .. dir .. \"\\\"\")\nend\nreturn result\nend\nfunction premake.gcc.getsystemincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-isystem \\\"\" .. dir .. \"\\\"\")\nend\nreturn result\nend\nfunction premake.gcc.getcfgsettings(cfg)\nreturn platforms[cfg.platform].cfgsettings\nend\n",
+ "premake.gcc = { }\npremake.gcc.cc = \"gcc\"\npremake.gcc.cxx = \"g++\"\npremake.gcc.ar = \"ar\"\npremake.gcc.rc = \"windres\"\npremake.gcc.llvm = false\nlocal cflags =\n{\nEnableSSE = \"-msse\",\nEnableSSE2 = \"-msse2\",\nEnableAVX = \"-mavx\",\nEnableAVX2 = \"-mavx2\",\nPedanticWarnings = \"-Wall -Wextra -pedantic\",\nExtraWarnings = \"-Wall -Wextra\",\nFatalWarnings = \"-Werror\",\nFloatFast = \"-ffast-math\",\nFloatStrict = \"-ffloat-store\",\nNoFramePointer = \"-fomit-frame-pointer\",\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nCpp11 = \"-std=c++11\",\nCpp14 = \"-std=c++14\",\nCpp17 = \"-std=c++17\",\nCpp20 = \"-std=c++20\",\nCppLatest = \"-std=c++2b\",\nNoExceptions = \"-fno-exceptions\",\nNoRTTI = \"-fno-rtti\",\nUnsignedChar = \"-funsigned-char\",\n}\nlocal objcflags =\n{\nObjcARC = \"-fobjc-arc\",\n}\npremake."
+ "gcc.platforms =\n{\nNative = {\ncppflags = \"-MMD -MP\",\n},\nx32 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m32\",\n},\nx64 = {\ncppflags = \"-MMD -MP\",\nflags = \"-m64\",\n},\nUniversal = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch x86_64 -arch ppc -arch ppc64\",\n},\nUniversal32 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch i386 -arch ppc\",\n},\nUniversal64 = {\nar = \"libtool\",\ncppflags = \"-MMD -MP\",\nflags = \"-arch x86_64 -arch ppc64\",\n},\nPS3 = {\ncc = \"ppu-lv2-g++\",\ncxx = \"ppu-lv2-g++\",\nar = \"ppu-lv2-ar\",\ncppflags = \"-MMD -MP\",\n},\nWiiDev = {\ncppflags = \"-MMD -MP -I$(LIBOGC_INC) $(MACHDEP)\",\nldflags= \"-L$(LIBOGC_LIB) $(MACHDEP)\",\ncfgsettings = [[\n ifeq ($(strip $(DEVKITPPC)),)\n $(error \"DEVKITPPC environment variable is not set\")'\n endif\n include $(DEVKITPPC)/wii_rules']],\n},\nOrbis = {\ncc = \"orbis-clang\",\ncxx = \"orbis-clang++\",\nar "
+ " = \"orbis-ar\",\ncppflags = \"-MMD -MP\",\n},\nEmscripten = {\ncc = \"$(EMSCRIPTEN)/emcc\",\ncxx = \"$(EMSCRIPTEN)/em++\",\nar = \"$(EMSCRIPTEN)/emar\",\ncppflags = \"-MMD -MP\",\n},\nNX32 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"armv7l-nintendo-nx-eabihf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=armv7l\",\n},\nNX64 = {\ncc = \"clang\",\ncxx = \"clang++\",\nar = \"aarch64-nintendo-nx-elf-ar\",\ncppflags = \"-MMD -MP\",\nflags = \"-march=aarch64\",\n},\n}\nlocal platforms = premake.gcc.platforms\nfunction premake.gcc.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nif flags[1]:startswith(\"-MMD\") then\ntable.insert(flags, \"-MP\")\nend\nreturn flags\nend\nfunction premake.gcc.getcflags(cfg)\nlocal result = table.translate(cfg.flags, cflags)\ntable.insert(result, platforms[cfg.platform].flags)\nif cfg.system ~= \"windows\" and cfg.kind == \"SharedLib\" then\nt"
+ "able.insert(result, \"-fPIC\")\nend\nreturn result\nend\nfunction premake.gcc.getcxxflags(cfg)\nlocal result = table.translate(cfg.flags, cxxflags)\nreturn result\nend\nfunction premake.gcc.getobjcflags(cfg)\nreturn table.translate(cfg.flags, objcflags)\nend\nfunction premake.gcc.getldflags(cfg)\nlocal result = { }\nif not cfg.flags.Symbols then\nif cfg.system == \"macosx\" then\nelse\ntable.insert(result, \"-s\")\nend\nend\nif cfg.kind == \"Bundle\" then\ntable.insert(result, \"-bundle\")\nend\nif cfg.kind == \"SharedLib\" then\nif cfg.system == \"macosx\" then\ntable.insert(result, \"-dynamiclib\")\nelse\ntable.insert(result, \"-shared\")\nend\nif cfg.system == \"windows\" and not cfg.flags.NoImportLib then\ntable.insert(result, '-Wl,--out-implib=\"' .. cfg.linktarget.fullpath .. '\"')\nend\nend\nif cfg.kind == \"WindowedApp\" and cfg.system == \"windows\" then\ntable.insert(result, \"-mwindows\")\nend\nlocal platform = platforms[cfg.platform]\ntable.insert(result, platform.flags)\ntable.insert(result, platf"
+ "orm.ldflags)\nreturn result\nend\nfunction premake.gcc.getlibdirflags(cfg)\nlocal result = { }\nfor _, value in ipairs(premake.getlinks(cfg, \"all\", \"directory\")) do\ntable.insert(result, '-L\\\"' .. value .. '\\\"')\nend\nreturn result\nend\nfunction premake.gcc.islibfile(p)\nif path.getextension(p) == \".a\" then\nreturn true\nend\nreturn false\nend\nfunction premake.gcc.getlibfiles(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\ntable.insert(result, _MAKE.esc(value))\nend\nend\nreturn result\nend\nfunction premake.gcc.getlinkflags(cfg)\nlocal result = {}\nfor _, value in ipairs(premake.getlinks(cfg, \"system\", \"fullpath\")) do\nif premake.gcc.islibfile(value) then\nvalue = path.rebase(value, cfg.project.location, cfg.location)\ntable.insert(result, _MAKE.esc(value))\nelseif path.getextension(value) == \".framework\" then\ntable.insert(result, '-framework ' .. _MAKE.esc(path.getbasename(value)))\nelse\ntable.inser"
+ "t(result, '-l' .. _MAKE.esc(path.getname(value)))\nend\nend\nreturn result\nend\nfunction premake.gcc.wholearchive(lib)\nif premake.gcc.llvm then\nreturn {\"-force_load\", lib}\nelseif os.get() == \"macosx\" then\nreturn {\"-Wl,-force_load\", lib}\nelse\nreturn {\"-Wl,--whole-archive\", lib, \"-Wl,--no-whole-archive\"}\nend\nend\nfunction premake.gcc.getarchiveflags(prj, cfg, ndx)\nlocal result = {}\nif cfg.platform:startswith(\"Universal\") then\nif prj.options.ArchiveSplit then\nerror(\"gcc tool 'Universal*' platforms do not support split archives\")\nend\ntable.insert(result, '-o')\nelse\nif (not prj.options.ArchiveSplit) then\nif premake.gcc.llvm then\ntable.insert(result, 'rcs')\nelse\ntable.insert(result, '-rcs')\nend\nelse\nif premake.gcc.llvm then\nif (not ndx) then\ntable.insert(result, 'qc')\nelse\ntable.insert(result, 'cs')\nend\nelse\nif (not ndx) then\ntable.insert(result, '-qc')\nelse\ntable.insert(result, '-cs')\nend\nend\nend\nend\nreturn result\nend\nfunction premake.gcc.getdefines(defines)\nl"
+ "ocal result = { }\nfor _,def in ipairs(defines) do\ntable.insert(result, \"-D\" .. def)\nend\nreturn result\nend\nfunction premake.gcc.getincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-I\\\"\" .. dir .. \"\\\"\")\nend\nreturn result\nend\nfunction premake.gcc.getquoteincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-iquote \\\"\" .. dir .. \"\\\"\")\nend\nreturn result\nend\nfunction premake.gcc.getsystemincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-isystem \\\"\" .. dir .. \"\\\"\")\nend\nreturn result\nend\nfunction premake.gcc.getcfgsettings(cfg)\nreturn platforms[cfg.platform].cfgsettings\nend\n",
/* tools/ghs.lua */
"premake.ghs = { }\npremake.ghs.namestyle = \"PS3\"\npremake.ghs.cc = \"ccppc\"\npremake.ghs.cxx = \"cxppc\"\npremake.ghs.ar = \"cxppc\"\nlocal cflags =\n{\nFatalWarnings = \"--quit_after_warnings\",\nOptimize = \"-Ogeneral\",\nOptimizeSize = \"-Osize\",\nOptimizeSpeed = \"-Ospeed\",\nSymbols = \"-g\",\n}\nlocal cxxflags =\n{\nNoExceptions = \"--no_exceptions\",\nNoRTTI = \"--no_rtti\",\nUnsignedChar = \"--unsigned_chars\",\n}\npremake.ghs.platforms =\n{\nNative = {\ncppflags = \"-MMD\",\n},\nPowerPC = {\ncc = \"ccppc\",\ncxx = \"cxppc\",\nar = \"cxppc\",\ncppflags = \"-MMD\",\narflags = \"-archive -o\",\n},\nARM = {\ncc = \"ccarm\",\ncxx = \"cxarm\",\nar = \"cxarm\",\ncppflags = \"-MMD\",\narflags = \"-archive -o\",\n}\n}\nlocal platforms = premake.ghs.platforms\nfunction premake.ghs.getcppflags(cfg)\nlocal flags = { }\ntable.insert(flags, platforms[cfg.platform].cppflags)\nreturn flags\nend\nfunction premake.ghs.getcf"
@@ -172,9 +174,9 @@ const char* builtin_scripts[] = {
"esult = { }\nfor _,def in ipairs(defines) do\ntable.insert(result, '-D' .. def)\nend\nreturn result\nend\nfunction premake.snc.getincludedirs(includedirs)\nlocal result = { }\nfor _,dir in ipairs(includedirs) do\ntable.insert(result, \"-I\" .. _MAKE.esc(dir))\nend\nreturn result\nend\n",
/* tools/valac.lua */
- "premake.valac = { }\npremake.valac.valac = \"valac\"\npremake.valac.cc = \"gcc\"\nlocal valaflags =\n{\nDisableAssert = \"--disable-assert\", -- Disable assertions\nDisableSinceCheck = \"--disable-since-check\", -- Do not check whether used symbols exist in local packages\nDisableWarnings = \"--disable-warnings\", -- Disable warnings\nEnableChecking = \"--enable-checking\", -- Enable additional run-time checks\nEnableDeprecated = \"--enable-deprecated\", -- Enable deprecated features\nEnableExperimental = \"--enable-experimental\", -- Enable experimental features\nEnableExperimentalNonNull = \"--enable-experimental-non-null\", -- Enable experimental enhancements for non-null types\nEnableGObjectTracing = \"--enable-gobject-tracing\", -- Enable GObject creation tracing\nEnableMemProfiler = \"--enable-mem-profiler\", -- Enable GLib memory profiler\nEnableTh"
- "reading = \"--thread\", -- Enable multithreading support\nFatalWarnings = \"--fatal-warnings\", -- Treat warnings as fatal\nHideInternal = \"--hide-internal\", -- Hide symbols marked as internal\nNoStdPkg = \"--nostdpkg\", -- Do not include standard packages\nOptimize = \"-X -O2\",\nOptimizeSize = \"-X -Os\",\nOptimizeSpeed = \"-X -O3\",\nSymbols = \"-g\", -- Produce debug information\n}\npremake.valac.platforms = {}\nfunction premake.valac.getvalaflags(cfg)\nreturn table.translate(cfg.flags, valaflags)\nend\nfunction premake.valac.getlinks(links)\nlocal result = { }\nfor _, pkg in ipairs(links) do\ntable.insert(result, '--pkg ' .. pkg)\nend\nreturn result\nend\nfunction premake.valac.getdefines(defines)\nlocal result = { }\nfor _, def in ipairs(defines) do\ntable.insert(result, '-D ' .. def)\nend\nretu"
- "rn result\nend\nfunction premake.valac.getbuildoptions(buildoptions)\nlocal result = { }\nfor _, def in ipairs(buildoptions) do\ntable.insert(result, '-X ' .. def)\nend\nreturn result\nend\nfunction premake.valac.getvapidirs(vapidirs)\nlocal result = { }\nfor _, def in ipairs(vapidirs) do\ntable.insert(result, '--vapidir=' .. def)\nend\nreturn result\nend\n",
+ "premake.valac = { }\npremake.valac.valac = \"valac\"\npremake.valac.cc = premake.gcc.cc\npremake.valac.glibrc = \"glib-compile-resources\"\nlocal valaflags =\n{\nDisableAssert = \"--disable-assert\", -- Disable assertions\nDisableSinceCheck = \"--disable-since-check\", -- Do not check whether used symbols exist in local packages\nDisableWarnings = \"--disable-warnings\", -- Disable warnings\nEnableChecking = \"--enable-checking\", -- Enable additional run-time checks\nEnableDeprecated = \"--enable-deprecated\", -- Enable deprecated features\nEnableExperimental = \"--enable-experimental\", -- Enable experimental features\nEnableExperimentalNonNull = \"--enable-experimental-non-null\", -- Enable experimental enhancements for non-null types\nEnableGObjectTracing = \"--enable-gobject-tracing\", -- Enable GObject creation tracing\nEnableMemProfiler = \"--enable-mem-pro"
+ "filer\", -- Enable GLib memory profiler\nFatalWarnings = \"--fatal-warnings\", -- Treat warnings as fatal\nHideInternal = \"--hide-internal\", -- Hide symbols marked as internal\nNoStdPkg = \"--nostdpkg\", -- Do not include standard packages\nSymbols = \"-g\", -- Produce debug information\n}\nlocal valaccflags =\n{\nOptimize = \"-O2\",\nOptimizeSize = \"-Os\",\nOptimizeSpeed = \"-O3\",\nSymbols = \"-g\", -- Produce debug information\n}\npremake.valac.platforms =\n{\nNative = {\n},\nx64 = {\nflags = \"-m64\"\n},\n}\nfunction premake.valac.getvalaflags(cfg)\nreturn table.translate(cfg.flags, valaflags)\nend\nfunction premake.valac.getvalaccflags(cfg)\nreturn table.translate(cfg.flags, valaccflags)\nend\nfunction premake.valac.getlinks(links)\nlocal result = { }\nfor _, pkg in ipairs"
+ "(links) do\ntable.insert(result, '--pkg ' .. pkg)\nend\nreturn result\nend\nfunction premake.valac.getdefines(defines)\nlocal result = { }\nfor _, def in ipairs(defines) do\ntable.insert(result, '-D ' .. def)\nend\nreturn result\nend\nfunction premake.valac.getvapidirs(vapidirs)\nlocal result = { }\nfor _, def in ipairs(vapidirs) do\ntable.insert(result, '--vapidir=' .. def)\nend\nreturn result\nend\n",
/* tools/swift.lua */
"premake.swift = { }\npremake.swift.swiftc = \"swiftc\"\npremake.swift.swift = \"swift\"\npremake.swift.cc = \"gcc\"\npremake.swift.ar = \"ar\"\npremake.swift.ld = \"ld\"\npremake.swift.dsymutil = \"dsymutil\"\nlocal swiftcflags =\n{\nSymbols = \"-g\", -- Produce debug information\nDisableWarnings = \"--suppress-warnings\", -- Disable warnings\nFatalWarnings = \"--warnings-as-errors\", -- Treat warnings as fatal\nOptimize = \"-O -whole-module-optimization\",\nOptimizeSize = \"-O -whole-module-optimization\",\nOptimizeSpeed = \"-Ounchecked -whole-module-optimization\",\nMinimumWarnings = \"-minimum-warnings\",\n}\nlocal swiftlinkflags = {\nStaticRuntime = \"-static-stdlib\",\n}\npremake.swift.platforms = {\nNative = {\nswiftcflags = \"\",\nswiftlinkflags = \"\",\n},\nx64 = {\nswiftcflags = \"\",\nswiftlinkflags = \"\",\n}\n}\nlocal p"
@@ -201,31 +203,50 @@ const char* builtin_scripts[] = {
"t(res, \"__cache\", nil)\nreturn res\nend\nfunction Set_mt.__index(a, i)\nif type(i) == \"number\" then\nreturn get_cache(a)[i]\nend\nreturn Set_mt[i] or rawget(a, i)\nend\nSet_mt.__add = Set_mt.union\nSet_mt.__mul = Set_mt.intersection\nSet_mt.__sub = Set_mt.difference\nSet_mt.__len = Set_mt.len\nSet_mt.__concat = Set_mt.implode",
/* actions/cmake/_cmake.lua */
- "premake.cmake = { }\nnewaction {\ntrigger = \"cmake\",\nshortname = \"CMake\",\ndescription = \"Generate CMake project files\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"CMakeLists.txt\", premake.cmake.workspace)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%/CMakeLists.txt\", premake.cmake.project)\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, \"CMakeLists.txt\")\nend,\noncleanproject = function(prj)\npremake.clean.file(prj, \"%%/CMakeLists.txt\")\nend\n}",
+ "premake.cmake = { }\npremake.cmake.cmake_minimum_version = \"3.28.3\"\nnewaction {\ntrigger = \"cmake\",\nshortname = \"CMake\",\ndescription = \"Generate CMake project files\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"CMakeLists.txt\", premake.cmake.workspace)\npremake.generate(sln, \"cmake/\" .. sln.name .. \"/CMakeLists.txt\", premake.cmake.gateway)\npremake.generate(sln, \"CMakePresets.json\", premake.cmake.presets)\nend,\nonproject = function(prj)\nlocal raw = prj.project or prj\nlocal sln_name = raw.solution.name\npremake.generate(prj, \"cmake/\" .. sln_name .. \"/%%.cmake\", premake.cmake.project)\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, \"CMakeLists.txt\")\npremake.clean.file(sln, \"cmake/\" .. sln.name .. \"/CMakeLists.txt\")\npremake.clean.file(sln, \"CMakePresets.json"
+ "\")\nend,\noncleanproject = function(prj)\nlocal raw = prj.project or prj\nlocal sln_name = raw.solution.name\npremake.clean.file(prj, \"cmake/\" .. sln_name .. \"/%%.cmake\")\nend\n}",
/* actions/cmake/cmake_workspace.lua */
- "function premake.cmake.workspace(sln)\nif (sln.location ~= _WORKING_DIR) then\nlocal name = string.format(\"%s/CMakeLists.txt\", _WORKING_DIR)\nlocal f, err = io.open(name, \"wb\")\nif (not f) then\nerror(err, 0)\nend\nf:write('# CMakeLists autogenerated by GENie\\n')\nf:write('cmake_minimum_required(VERSION 2.8.4)\\n')\nf:write('\\n')\nf:write('add_subdirectory('.. path.getrelative(_WORKING_DIR, sln.location) ..')\\n')\nf:close()\nend\n_p('# CMakeLists autogenerated by GENie')\n_p('cmake_minimum_required(VERSION 2.8.4)')\n_p('')\nfor i,prj in ipairs(sln.projects) do\nlocal name = premake.esc(prj.name)\n_p('add_subdirectory(%s)', name)\nend\nend\n",
+ "function premake.cmake.workspace(sln)\n_p('# CMakeLists autogenerated by GENie')\n_p('# https://github.com/bkaradzic/GENie')\n_p('cmake_minimum_required(VERSION %s)', premake.cmake.cmake_minimum_version)\nif os.is(\"windows\") then\n_p('cmake_policy(SET CMP0091 NEW)')\nend\n_p('project(%s)', sln.name)\n_p('set(CMAKE_SUPPRESS_REGENERATION true)')\n_p('# Strip default /EHsc — each project manages exception handling explicitly')\n_p('if(MSVC)')\n_p(1, 'string(REPLACE \"/EHsc\" \"\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")')\n_p('endif()')\n_p('get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)')\n_p('if(NOT _isMultiConfig AND NOT CMAKE_BUILD_TYPE)')\n_p(1, 'message(FATAL_ERROR')\n_p(2, '\"CMAKE_BUILD_TYPE is not set.\"')\n_p(2, '\" Single-config generators require an explicit build type.\"')\n_p(2, '\" Use: cmake --preset <config> or -DCMAKE_BUILD_TYPE=<config>\"')\n_p(1, ')')\n_p('endif()')\n_p('set_property(GLOBAL PROPERTY USE_FOLDERS ON)')\n_p('set_property(GLOBAL PROPERTY PREDEFINED_TARGE"
+ "TS_FOLDER \"[GENie-Generated-CMake]\")')\n_p('add_subdirectory(cmake/%s)', sln.name)\nif sln.startproject then\n_p('set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT %s)', premake.esc(sln.startproject))\nend\nend\nfunction premake.cmake.gateway(sln)\n_p('# Auto-generated by GENie')\n_p('# https://github.com/bkaradzic/GENie')\nfor i,prj in ipairs(sln.projects) do\n_p('include(%s.cmake)', premake.esc(prj.name))\nend\nend\nfunction premake.cmake.presets(sln)\n_p('{')\n_p(' \"version\": 3,')\n_p(' \"configurePresets\": [')\n_p(' {')\n_p(' \"name\": \"default\",')\n_p(' \"binaryDir\": \"${sourceDir}/build\"')\n_p(' },')\nfor i, cfgname in ipairs(sln.configurations) do\nlocal comma = i < #sln.configurations and ',' or ''\n_p(' {')\n_p(' \"name\": \"%s\",', cfgname:lower())\n_p(' \"binaryDir\": \"${sourceDir}/build\",')\n_p(' \"cacheVariables\": {')\n_p(' \"CMAKE_BUILD_TYPE\": \"%s\"', cfgname)\n_p(' }')\n_p(' }%s', comma)\nend\n_p(' ]')"
+ "\n_p('}')\nend\n",
/* actions/cmake/cmake_project.lua */
- "local cmake = premake.cmake\nlocal tree = premake.tree\nlocal includestr = 'include_directories(../%s)'\nlocal definestr = 'add_definitions(-D%s)'\nlocal function is_excluded(prj, cfg, file)\n if table.icontains(prj.excludes, file) then\n return true\n end\n if table.icontains(cfg.excludes, file) then\n return true\n end\n return false\nend\nfunction cmake.excludedFiles(prj, cfg, src)\n for _, v in ipairs(src) do\n if (is_excluded(prj, cfg, v)) then\n _p(1, 'list(REMOVE_ITEM source_list ../%s)', v)\n end\n end\nend\nfunction cmake.list(value)\n if #value > 0 then\n return \" \" .. table.concat(value, \" \")\n else\n return \"\"\n end\nend\nfunction cmake.files(prj)\n local ret = {}\n local tr = premake.project.buildsourcetree(prj)\n tree.traverse(tr, {\n onbranchenter = function(node, depth)\n end,\n onbranchexit = function(node, depth)\n end,\n onleaf = function(node, depth)\n "
- " assert(node, \"unexpected empty node\")\n if node.cfg then\n table.insert(ret, node.cfg.name)\n _p(1, '../%s', node.cfg.name)\n end\n end,\n }, true, 1)\n return ret\nend\nfunction cmake.header(prj)\n _p('# %s project autogenerated by GENie', premake.action.current().shortname)\n _p('cmake_minimum_required(VERSION 2.8.4)')\n _p('')\n _p('project(%s)', premake.esc(prj.name))\nend\nfunction cmake.customtasks(prj)\n local dirs = {}\n local tasks = {}\n for _, custombuildtask in ipairs(prj.custombuildtask or {}) do\n for _, buildtask in ipairs(custombuildtask or {}) do\n table.insert(tasks, buildtask)\n local d = string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../%s\", path.getdirectory(path.getrelative(prj.location, buildtask[2])))\n if not table.contains(dirs, d) then\n table.insert(dirs, d)\n _p('file(MAKE_DIRECTORY \\\"%s\\\")', d)\n end\n "
- " end\n end\n _p('')\n for _, buildtask in ipairs(tasks) do\n local deps = string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../%s \", path.getrelative(prj.location, buildtask[1]))\n local outputs = string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../%s \", path.getrelative(prj.location, buildtask[2]))\n local msg = \"\"\n for _, depdata in ipairs(buildtask[3] or {}) do\n deps = deps .. string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../%s \", path.getrelative(prj.location, depdata))\n end\n _p('add_custom_command(')\n _p(1, 'OUTPUT %s', outputs)\n _p(1, 'DEPENDS %s', deps)\n for _, cmdline in ipairs(buildtask[4] or {}) do\n if (cmdline:sub(1, 1) ~= \"@\") then\n local cmd = cmdline\n local num = 1\n for _, depdata in ipairs(buildtask[3] or {}) do\n cmd = string.gsub(cmd, \"%$%(\" .. num .. \"%)\", string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../%s \", path.getrelative(pr"
- "j.location, depdata)))\n num = num + 1\n end\n cmd = string.gsub(cmd, \"%$%(<%)\", string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../%s \", path.getrelative(prj.location, buildtask[1])))\n cmd = string.gsub(cmd, \"%$%(@%)\", outputs)\n _p(1, 'COMMAND %s', cmd)\n else\n msg = cmdline\n end\n end\n _p(1, 'COMMENT \\\"%s\\\"', msg)\n _p(')')\n _p('')\n end\nend\nfunction cmake.depRules(prj)\n local maintable = {}\n for _, dependency in ipairs(prj.dependency) do\n for _, dep in ipairs(dependency) do\n if path.issourcefile(dep[1]) then\n local dep1 = premake.esc(path.getrelative(prj.location, dep[1]))\n local dep2 = premake.esc(path.getrelative(prj.location, dep[2]))\n if not maintable[dep1] then maintable[dep1] = {} end\n table.insert(maintable[dep1], dep2)\n end\n end\n "
- " end\n for key, _ in pairs(maintable) do\n local deplist = {}\n local depsname = string.format('%s_deps', path.getname(key))\n for _, d2 in pairs(maintable[key]) do\n table.insert(deplist, d2)\n end\n _p('set(')\n _p(1, depsname)\n for _, v in pairs(deplist) do\n _p(1, '${CMAKE_CURRENT_SOURCE_DIR}/../%s', v)\n end\n _p(')')\n _p('')\n _p('set_source_files_properties(')\n _p(1, '\\\"${CMAKE_CURRENT_SOURCE_DIR}/../%s\\\"', key)\n _p(1, 'PROPERTIES OBJECT_DEPENDS \\\"${%s}\\\"', depsname)\n _p(')')\n _p('')\n end\nend\nfunction cmake.commonRules(conf, str)\n local Dupes = {}\n local t2 = {}\n for _, cfg in ipairs(conf) do\n local cfgd = iif(str == includestr, cfg.includedirs, cfg.defines)\n for _, v in ipairs(cfgd) do\n if(t2[v] == #conf - 1) then\n _p(str, v)\n table.insert(Dupes, v)\n end\n if n"
- "ot t2[v] then\n t2[v] = 1\n else\n t2[v] = t2[v] + 1\n end\n end\n end\n return Dupes\nend\nfunction cmake.cfgRules(cfg, dupes, str)\n for _, v in ipairs(cfg) do\n if (not table.icontains(dupes, v)) then\n _p(1, str, v)\n end\n end\nend\nfunction cmake.removeCrosscompiler(platforms)\n for i = #platforms, 1, -1 do\n if premake.platforms[platforms[i]].iscrosscompiler then\n table.remove(platforms, i)\n end\n end\nend\nfunction cmake.project(prj)\n io.indent = \" \"\n cmake.header(prj)\n _p('set(')\n _p('source_list')\n local source_files = cmake.files(prj)\n _p(')')\n _p('')\n local nativeplatform = iif(os.is64bit(), \"x64\", \"x32\")\n local cc = premake.gettool(prj)\n local platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\n cmake.removeCrosscompiler(platforms)\n local configurations = {}\n for _, platform in ipairs(plat"
- "forms) do\n for cfg in premake.eachconfig(prj, platform) do\n -- TODO: Extend support for 32-bit targets on 64-bit hosts\n if cfg.platform == nativeplatform then\n table.insert(configurations, cfg)\n end\n end\n end\n local commonIncludes = cmake.commonRules(configurations, includestr)\n local commonDefines = cmake.commonRules(configurations, definestr)\n _p('')\n for _, cfg in ipairs(configurations) do\n _p('if(CMAKE_BUILD_TYPE MATCHES \\\"%s\\\")', cfg.name)\n -- list excluded files\n cmake.excludedFiles(prj, cfg, source_files)\n -- add includes directories\n cmake.cfgRules(cfg.includedirs, commonIncludes, includestr)\n -- add build defines\n cmake.cfgRules(cfg.defines, commonDefines, definestr)\n -- set CXX flags\n _p(1, 'set(CMAKE_CXX_FLAGS \\\"${CMAKE_CXX_FLAGS} %s\\\")', cmake.list(table.join(cc.getcppflags(cfg), cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptio"
- "ns, cfg.buildoptions_cpp)))\n -- set C flags\n _p(1, 'set(CMAKE_C_FLAGS \\\"${CMAKE_C_FLAGS} %s\\\")', cmake.list(table.join(cc.getcppflags(cfg), cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n _p('endif()')\n _p('')\n end\n -- force CPP if needed\n if (prj.options.ForceCPP) then\n _p('set_source_files_properties(${source_list} PROPERTIES LANGUAGE CXX)')\n end\n -- add custom tasks\n cmake.customtasks(prj)\n -- per-dependency build rules\n cmake.depRules(prj)\n for _, cfg in ipairs(configurations) do\n _p('if(CMAKE_BUILD_TYPE MATCHES \\\"%s\\\")', cfg.name)\n if (prj.kind == 'StaticLib') then\n _p(1, 'add_library(%s STATIC ${source_list})', premake.esc(cfg.buildtarget.basename))\n end\n if (prj.kind == 'SharedLib') then\n _p(1, 'add_library(%s SHARED ${source_list})', premake.esc(cfg.buildtarget.basename))\n end\n if (prj.kind == 'ConsoleApp' or prj.kind == 'WindowedApp') t"
- "hen\n _p(1, 'add_executable(%s ${source_list})', premake.esc(cfg.buildtarget.basename))\n _p(1, 'target_link_libraries(%s%s%s)', premake.esc(cfg.buildtarget.basename), cmake.list(premake.esc(premake.getlinks(cfg, \"siblings\", \"basename\"))), cmake.list(cc.getlinkflags(cfg)))\n end\n _p('endif()')\n _p('')\n end\nend",
+ "local cmake = premake.cmake\nlocal tree = premake.tree\nlocal function splitflags(flags)\nlocal result = {}\nfor _, flag in ipairs(flags) do\nfor word in flag:gmatch(\"%S+\") do\ntable.insert(result, word)\nend\nend\nreturn result\nend\nlocal msvc_cflags =\n{\n EnableSSE = \"/arch:SSE\",\n EnableSSE2 = \"/arch:SSE2\",\n EnableAVX = \"/arch:AVX\",\n EnableAVX2 = \"/arch:AVX2\",\n PedanticWarnings = \"/W4\",\n ExtraWarnings = \"/W4\",\n FatalWarnings = \"/WX\",\n FloatFast = \"/fp:fast\",\n FloatStrict = \"/fp:strict\",\n Optimize = \"/O2\",\n OptimizeSize = \"/O1\",\n OptimizeSpeed = \"/Ox\",\n Symbols = \"/Zi\",\n}\nlocal msvc_cxxflags =\n{\n Cpp14 = \"/std:c++14\",\n Cpp17 = \"/std:c++17\",\n Cpp20 = \"/std:c++20\",\n CppLatest = \"/std:c++latest\",\n NoRTTI = \"/GR-\",\n NoBufferSecurityCheck = \"/GS-\",\n}\nfunction cmake.getmsvc_cflags(cfg)\n return t"
+ "able.translate(cfg.flags, msvc_cflags)\nend\nfunction cmake.getmsvc_cxxflags(cfg)\n local result = table.translate(cfg.flags, msvc_cxxflags)\n if cfg.flags.NoExceptions then\n table.insert(result, \"/EHs-c-\")\n end\n -- Always enable conformance modes for MSVC\n table.insert(result, \"/Zc:__cplusplus\")\n table.insert(result, \"/Zc:preprocessor\")\n return result\nend\nlocal msvc_version_ranges = {\n vs2013 = { 1800, 1900 },\n vs2015 = { 1900, 1910 },\n vs2017 = { 1910, 1920 },\n vs2019 = { 1920, 1930 },\n vs2022 = { 1930, 1940 },\n vs2026 = { 1940, 1950 },\n}\nlocal function msvc_condition(matched_keyword)\n local range = msvc_version_ranges[matched_keyword]\n if range then\n return string.format(\"MSVC AND MSVC_VERSION GREATER_EQUAL %d AND MSVC_VERSION LESS %d\", range[1], range[2])\n end\n return \"MSVC\"\nend\nlocal function is_vs_action_keyword(keyword)\n -- Must start with \"vs\", then only digits and wildcard patterns [^/]* or .*\n "
+ "-- Must NOT contain %- (transformed from \"-\", indicates user-defined variant)\n if not keyword:match(\"^vs\") then\n return false\n end\n if keyword:find(\"%%%-\") then\n return false\n end\n -- After \"vs\", only digits, wildcard chars [^/]*, .*, or Lua pattern escapes\n local rest = keyword:sub(3)\n -- Strip known wildcard patterns\n rest = rest:gsub(\"%[%^/%]%*\", \"\") -- [^/]* from single *\n rest = rest:gsub(\"%.%*\", \"\") -- .* from **\n -- What remains should be only digits (or empty)\n return rest:match(\"^%d*$\") ~= nil\nend\nfunction cmake.getplatform_settings(prj, cfgname, match_fn, condition_fn)\n local groups = {}\n -- Get the raw project object (prj may be a baked config)\n local rawprj = prj.project or prj\n -- Scan both solution-level and project-level blocks\n local block_sources = {}\n if rawprj.solution and rawprj.solution.blocks then\n table.insert(block_sources, rawprj.solution.blocks)\n end\n if raw"
+ "prj.blocks then\n table.insert(block_sources, rawprj.blocks)\n end\n for _, blocks in ipairs(block_sources) do\n for _, blk in ipairs(blocks) do\n local matched_alt = nil\n local has_config_keyword = false\n local config_ok = true\n for _, kw in ipairs(blk.keywords) do\n -- Check each alternative in \"or\"-separated keywords\n for _, alt in ipairs(kw:explode(\" or \")) do\n alt = alt:match(\"^%s*(.-)%s*$\") -- trim\n if match_fn(alt) then\n matched_alt = alt\n end\n -- Check if this keyword is a config filter\n if cfgname and cfgname ~= \"\" then\n if alt:lower() == cfgname:lower() then\n has_config_keyword = true\n end\n end\n end\n end\n -- If cfgname specified, block must "
+ "either match it or not mention any known config\n if cfgname and cfgname ~= \"\" then\n local block_has_config_filter = false\n for _, kw in ipairs(blk.keywords) do\n for _, alt in ipairs(kw:explode(\" or \")) do\n alt = alt:match(\"^%s*(.-)%s*$\")\n local al = alt:lower()\n if al == \"debug\" or al == \"release\" or al == \"profile\" or al == \"development\" then\n block_has_config_filter = true\n end\n end\n end\n if block_has_config_filter and not has_config_keyword then\n config_ok = false\n end\n end\n if matched_alt and config_ok then\n local condition = condition_fn(matched_alt)\n if not groups[condition] then\n groups[condition] = {\n includedirs = {},"
+ "\n defines = {},\n buildoptions = {},\n linkoptions = {},\n links = {},\n }\n end\n local g = groups[condition]\n for _, v in ipairs(blk.includedirs or {}) do\n if path.isabsolute(v) then\n v = path.getrelative(rawprj.location, v)\n end\n if not table.contains(g.includedirs, v) then\n table.insert(g.includedirs, v)\n end\n end\n for _, v in ipairs(blk.defines or {}) do\n if not table.contains(g.defines, v) then\n table.insert(g.defines, v)\n end\n end\n for _, v in ipairs(blk.buildoptions or {}) do\n if not table.contains(g.buildoptions, v) then\n table.insert(g.buildoptions, v"
+ ")\n end\n end\n for _, v in ipairs(blk.linkoptions or {}) do\n if not table.contains(g.linkoptions, v) then\n table.insert(g.linkoptions, v)\n end\n end\n for _, v in ipairs(blk.links or {}) do\n if not table.contains(g.links, v) then\n table.insert(g.links, v)\n end\n end\n end\n end\n end\n -- Convert to sorted array (generic conditions first, then specific)\n local result = {}\n for condition, settings in pairs(groups) do\n table.insert(result, { condition = condition, settings = settings })\n end\n table.sort(result, function(a, b) return #a.condition < #b.condition end)\n return result\nend\nlocal function flatten_platform_groups(groups)\n local result = {\n includedirs = {},\n defines = {},\n buildoptions = {},\n lin"
+ "koptions = {},\n links = {},\n }\n for _, group in ipairs(groups) do\n for _, v in ipairs(group.settings.includedirs) do\n if not table.contains(result.includedirs, v) then table.insert(result.includedirs, v) end\n end\n for _, v in ipairs(group.settings.defines) do\n if not table.contains(result.defines, v) then table.insert(result.defines, v) end\n end\n for _, v in ipairs(group.settings.buildoptions) do\n if not table.contains(result.buildoptions, v) then table.insert(result.buildoptions, v) end\n end\n for _, v in ipairs(group.settings.linkoptions) do\n if not table.contains(result.linkoptions, v) then table.insert(result.linkoptions, v) end\n end\n for _, v in ipairs(group.settings.links) do\n if not table.contains(result.links, v) then table.insert(result.links, v) end\n end\n end\n return result\nend\nfunction cmake.getmsvc_settings(prj, cfgname)\n return cma"
+ "ke.getplatform_settings(prj, cfgname, is_vs_action_keyword, msvc_condition)\nend\nlocal function is_excluded(prj, cfg, file)\n if table.icontains(prj.excludes, file) then\n return true\n end\n if table.icontains(cfg.excludes, file) then\n return true\n end\n return false\nend\nfunction cmake.excludedFiles(prj, cfg, src)\n for _, v in ipairs(src) do\n if (is_excluded(prj, cfg, v)) then\n _p(1, 'list(REMOVE_ITEM source_list ../../%s)', v)\n end\n end\nend\nfunction cmake.commonExcludedFiles(prj, configurations, src)\n for _, v in ipairs(src) do\n local excludedCount = 0\n for _, cfg in ipairs(configurations) do\n if is_excluded(prj, cfg, v) then\n excludedCount = excludedCount + 1\n end\n end\n if excludedCount == #configurations then\n _p('list(REMOVE_ITEM source_list ../../%s)', v)\n end\n end\nend\nfunction cmake.list(value)\n if #value > 0 then\n retur"
+ "n \" \" .. table.concat(value, \" \")\n else\n return \"\"\n end\nend\nfunction cmake.listWrapped(value, prefix, postfix)\n if #value > 0 then\n return prefix .. table.concat(value, postfix .. prefix) .. postfix\n else\n return \"\"\n end\nend\nfunction cmake.files(prj)\n local ret = {}\n local tr = premake.project.buildsourcetree(prj)\n tree.traverse(tr, {\n onbranchenter = function(node, depth)\n end,\n onbranchexit = function(node, depth)\n end,\n onleaf = function(node, depth)\n assert(node, \"unexpected empty node\")\n if node.cfg then\n table.insert(ret, node.cfg.name)\n _p(1, '../../%s', node.cfg.name)\n end\n end,\n }, true, 1)\n return ret\nend\nfunction cmake.header(prj)\n _p('# %s project autogenerated by GENie', premake.action.current().shortname)\n _p('# https://github.com/bkaradzic/GENie')\n _p('cmake_minimum_required(VERSION %s)', pr"
+ "emake.cmake.cmake_minimum_version)\n if os.is(\"windows\") then\n -- Add support for CMP0091, see https://cmake.org/cmake/help/latest/policy/CMP0091.html\n _p('cmake_policy(SET CMP0091 NEW)')\n end\n _p('')\n _p('project(%s)', premake.esc(prj.name))\nend\nfunction cmake.customtasks(prj)\n local dirs = {}\n local tasks = {}\n for _, custombuildtask in ipairs(prj.custombuildtask or {}) do\n for _, buildtask in ipairs(custombuildtask or {}) do\n table.insert(tasks, buildtask)\n local d = string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../../%s\", path.getdirectory(path.getrelative(prj.location, buildtask[2])))\n if not table.contains(dirs, d) then\n table.insert(dirs, d)\n _p('file(MAKE_DIRECTORY \\\"%s\\\")', d)\n end\n end\n end\n _p('')\n for _, buildtask in ipairs(tasks) do\n local deps = string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../../%s \", path.getrelative(prj.location, b"
+ "uildtask[1]))\n local outputs = string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../../%s \", path.getrelative(prj.location, buildtask[2]))\n local msg = \"\"\n for _, depdata in ipairs(buildtask[3] or {}) do\n deps = deps .. string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../../%s \", path.getrelative(prj.location, depdata))\n end\n _p('add_custom_command(')\n _p(1, 'OUTPUT %s', outputs)\n _p(1, 'DEPENDS %s', deps)\n for _, cmdline in ipairs(buildtask[4] or {}) do\n if (cmdline:sub(1, 1) ~= \"@\") then\n local cmd = cmdline\n local num = 1\n for _, depdata in ipairs(buildtask[3] or {}) do\n cmd = string.gsub(cmd, \"%$%(\" .. num .. \"%)\", string.format(\"${CMAKE_CURRENT_SOURCE_DIR}/../../%s \", path.getrelative(prj.location, depdata)))\n num = num + 1\n end\n cmd = string.gsub(cmd, \"%$%(<%)\", string.format(\"${CMAKE_CURRENT_SOU"
+ "RCE_DIR}/../../%s \", path.getrelative(prj.location, buildtask[1])))\n cmd = string.gsub(cmd, \"%$%(@%)\", outputs)\n _p(1, 'COMMAND %s', cmd)\n else\n msg = cmdline\n end\n end\n _p(1, 'COMMENT \\\"%s\\\"', msg)\n _p(')')\n _p('')\n end\nend\nfunction cmake.depRules(prj)\n local maintable = {}\n for _, dependency in ipairs(prj.dependency) do\n for _, dep in ipairs(dependency) do\n if path.issourcefile(dep[1]) then\n local dep1 = premake.esc(path.getrelative(prj.location, dep[1]))\n local dep2 = premake.esc(path.getrelative(prj.location, dep[2]))\n if not maintable[dep1] then maintable[dep1] = {} end\n table.insert(maintable[dep1], dep2)\n end\n end\n end\n for key, _ in pairs(maintable) do\n local deplist = {}\n local depsname = string.format('%s_deps', path.getname(key))\n for _, d2 in"
+ " pairs(maintable[key]) do\n table.insert(deplist, d2)\n end\n _p('set(')\n _p(1, depsname)\n for _, v in pairs(deplist) do\n _p(1, '${CMAKE_CURRENT_SOURCE_DIR}/../../%s', v)\n end\n _p(')')\n _p('')\n _p('set_source_files_properties(')\n _p(1, '\"${CMAKE_CURRENT_SOURCE_DIR}/../../%s\"', key)\n _p(1, 'PROPERTIES OBJECT_DEPENDS \\\"${%s}\\\"', depsname)\n _p(')')\n _p('')\n end\nend\nfunction cmake.commonRules(conf, kind)\n local Dupes = {}\n local t2 = {}\n for _, cfg in ipairs(conf) do\n local cfgd = iif(kind == \"includes\", cfg.includedirs, cfg.defines)\n for _, v in ipairs(cfgd) do\n if(t2[v] == #conf - 1) then\n table.insert(Dupes, v)\n end\n if not t2[v] then\n t2[v] = 1\n else\n t2[v] = t2[v] + 1\n end\n end\n end\n return Dupes\nend\nfunction cmake.grouppath(prj)"
+ "\n if prj.group == nil then\n return nil\n end\n local parts = {}\n local grp = prj.group\n while grp ~= nil do\n table.insert(parts, 1, grp.name)\n grp = grp.parent\n end\n return table.concat(parts, \"/\")\nend\nfunction cmake.removeCrosscompiler(platforms)\n for i = #platforms, 1, -1 do\n if premake.platforms[platforms[i]].iscrosscompiler then\n table.remove(platforms, i)\n end\n end\nend\nfunction cmake.project(prj)\n io.indent = \" \"\n cmake.header(prj)\n _p('set(')\n _p('source_list')\n local source_files = cmake.files(prj)\n _p(')')\n _p('')\n local nativeplatform = iif(os.is64bit(), \"x64\", \"x32\")\n local cc = premake.gettool(prj)\n local platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\n cmake.removeCrosscompiler(platforms)\n local configurations = {}\n for _, platform in ipairs(platforms) do\n for cfg in premake.eachconfig(prj, platform) do\n "
+ " -- TODO: Extend support for 32-bit targets on 64-bit hosts\n if cfg.platform == nativeplatform then\n table.insert(configurations, cfg)\n end\n end\n end\n local commonIncludes = cmake.commonRules(configurations, \"includes\")\n local commonDefines = cmake.commonRules(configurations, \"defines\")\n _p('')\n -- file exclusions (unconditional for files excluded in all configs)\n cmake.commonExcludedFiles(prj, configurations, source_files)\n -- force CPP if needed\n if (prj.options.ForceCPP) then\n _p('set_source_files_properties(${source_list} PROPERTIES LANGUAGE CXX)')\n end\n -- add custom tasks\n cmake.customtasks(prj)\n -- per-dependency build rules\n cmake.depRules(prj)\n local targetname = premake.esc(prj.name)\n if (prj.kind == 'StaticLib') then\n _p('add_library(%s STATIC ${source_list})', targetname)\n end\n if (prj.kind == 'SharedLib') then\n _p('add_library(%s SHARED ${source_list})', "
+ "targetname)\n end\n if (prj.kind == 'ConsoleApp' or prj.kind == 'WindowedApp') then\n _p('add_executable(%s ${source_list})', targetname)\n local linklibs = {}\n for _, cfg in ipairs(configurations) do\n for _, link in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\n local lname = link.project.name\n if not table.contains(linklibs, lname) then\n table.insert(linklibs, lname)\n end\n end\n end\n -- sibling project link dependencies (compiler-agnostic)\n if #linklibs > 0 then\n _p('target_link_libraries(%s PRIVATE%s)', targetname, cmake.list(premake.esc(linklibs)))\n end\n -- GCC/Clang-specific link flags\n local libdirs = cmake.listWrapped(premake.esc(premake.getlinks(configurations[1], \"all\", \"directory\")), \" -L\\\"../../\", \"\\\"\")\n local gcc_linkflags = table.join(configurations[1].linkoptions, cc.getldflags(configura"
+ "tions[1]), cc.getlinkflags(configurations[1]))\n if #libdirs > 0 or #gcc_linkflags > 0 then\n _p('if(CMAKE_CXX_COMPILER_ID MATCHES \\\"GNU|Clang\\\")')\n _p(1, 'target_link_libraries(%s PRIVATE%s%s)', targetname, libdirs, cmake.list(gcc_linkflags))\n _p('endif()')\n end\n end\n -- common includes (target-scoped)\n for _, v in ipairs(commonIncludes) do\n _p('target_include_directories(%s PRIVATE ../../%s)', targetname, v)\n end\n -- common defines (target-scoped)\n for _, v in ipairs(commonDefines) do\n _p('target_compile_definitions(%s PRIVATE %s)', targetname, v)\n end\n -- per-config GCC/Clang compiler flags (target-scoped)\n for _, cfg in ipairs(configurations) do\n local cxx_flags = splitflags(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp))\n local c_flags = splitflags(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c))\n if #cxx_flags > 0"
+ " then\n _p('target_compile_options(%s PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:GNU,Clang>,$<CONFIG:%s>>:%s>)', targetname, cfg.name, table.concat(cxx_flags, ';'))\n end\n if #c_flags > 0 then\n _p('target_compile_options(%s PRIVATE $<$<AND:$<COMPILE_LANGUAGE:C>,$<C_COMPILER_ID:GNU,Clang>,$<CONFIG:%s>>:%s>)', targetname, cfg.name, table.concat(c_flags, ';'))\n end\n end\n -- per-config MSVC compile options (using target_compile_options for multi-config generator support)\n for _, cfg in ipairs(configurations) do\n local msvc_c = cmake.getmsvc_cflags(cfg)\n local msvc_cxx = cmake.getmsvc_cxxflags(cfg)\n -- also get MSVC-specific buildoptions from vs*-gated config blocks (flattened across versions)\n local msvc_settings = flatten_platform_groups(cmake.getmsvc_settings(prj, cfg.name))\n -- filter out buildoptions already covered by the flag tables\n local all_flags = table.join(msvc_c, msvc_cxx)\n "
+ "local msvc_buildopts = {}\n for _, v in ipairs(msvc_settings.buildoptions) do\n if not table.contains(all_flags, v) then\n table.insert(msvc_buildopts, v)\n end\n end\n if #msvc_c > 0 or #msvc_cxx > 0 or #msvc_buildopts > 0 then\n _p('target_compile_options(%s PRIVATE', targetname)\n if #msvc_cxx > 0 then\n _p(1, '$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:MSVC>,$<CONFIG:%s>>:%s>', cfg.name, table.concat(msvc_cxx, ';'))\n end\n local msvc_common = table.join(msvc_c, msvc_buildopts)\n if #msvc_common > 0 then\n _p(1, '$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:%s>>:%s>', cfg.name, table.concat(msvc_common, ';'))\n end\n _p(')')\n end\n end\n -- MSVC-specific includes, defines, links, and link options from vs*-gated blocks\n -- Version-specific settings (e.g. vs2019-only) get their own MSVC_VERSION conditions\n local msvc_grou"
+ "ps = cmake.getmsvc_settings(prj)\n for _, group in ipairs(msvc_groups) do\n local s = group.settings\n if #s.includedirs > 0 or #s.defines > 0 or #s.links > 0 or #s.buildoptions > 0 or #s.linkoptions > 0 then\n _p('if(%s)', group.condition)\n for _, v in ipairs(s.includedirs) do\n _p(1, 'target_include_directories(%s PRIVATE ../../%s)', targetname, v)\n end\n for _, v in ipairs(s.defines) do\n _p(1, 'target_compile_definitions(%s PRIVATE %s)', targetname, v)\n end\n if #s.buildoptions > 0 then\n _p(1, 'target_compile_options(%s PRIVATE %s)', targetname, table.concat(splitflags(s.buildoptions), ';'))\n end\n if #s.links > 0 then\n _p(1, 'target_link_libraries(%s PRIVATE%s)', targetname, cmake.list(s.links))\n end\n if #s.linkoptions > 0 then\n _p(1, 'target_link_options(%s PRIVATE%s)', targetname, cmake.list(s.li"
+ "nkoptions))\n end\n _p('endif()')\n end\n end\n -- project group (solution folder)\n local folder = cmake.grouppath(prj)\n if folder then\n _p('set_target_properties(%s PROPERTIES FOLDER \"%s\")', targetname, folder)\n end\n -- per-config includes and defines\n for _, cfg in ipairs(configurations) do\n for _, v in ipairs(cfg.includedirs) do\n if not table.icontains(commonIncludes, v) then\n _p('target_include_directories(%s PRIVATE $<$<CONFIG:%s>:../../%s>)', targetname, cfg.name, v)\n end\n end\n for _, v in ipairs(cfg.defines) do\n if not table.icontains(commonDefines, v) then\n _p('target_compile_definitions(%s PRIVATE $<$<CONFIG:%s>:%s>)', targetname, cfg.name, v)\n end\n end\n end\n -- debugdir → VS_DEBUGGER_WORKING_DIRECTORY (for executables)\n if prj.kind == 'ConsoleApp' or prj.kind == 'WindowedApp' then\n local debugdirs = {}\n "
+ " for _, cfg in ipairs(configurations) do\n if cfg.debugdir then\n debugdirs[cfg.name] = cfg.debugdir\n end\n end\n -- Check if all configs share the same debugdir\n local common_debugdir = nil\n local all_same = true\n for _, dir in pairs(debugdirs) do\n if common_debugdir == nil then\n common_debugdir = dir\n elseif dir ~= common_debugdir then\n all_same = false\n break\n end\n end\n if common_debugdir then\n if all_same then\n _p('set_target_properties(%s PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}/../../%s\")', targetname, common_debugdir)\n else\n for cfgname, dir in pairs(debugdirs) do\n _p('set_target_properties(%s PROPERTIES $<$<CONFIG:%s>:VS_DEBUGGER_WORKING_DIRECTORY> \"${CMAKE_CURRENT_SOURCE_DIR}/../../%s\")', targetname, cfgname, dir)\n"
+ " end\n end\n end\n end\n _p('')\nend",
/* actions/make/_make.lua */
- "_MAKE = { }\npremake.make = { }\nlocal make = premake.make\nfunction _MAKE.esc(value)\nlocal result\nif (type(value) == \"table\") then\nresult = { }\nfor _,v in ipairs(value) do\ntable.insert(result, _MAKE.esc(v))\nend\nreturn result\nelse\nresult = value:gsub(\"\\\\\", \"\\\\\\\\\")\nresult = result:gsub(\" \", \"\\\\ \")\nresult = result:gsub(\"%%(\", \"\\\\%(\")\nresult = result:gsub(\"%%)\", \"\\\\%)\")\nresult = result:gsub(\"$\\\\%((.-)\\\\%)\", \"$%(%1%)\")\nreturn result\nend\nend\nfunction _MAKE.escquote(value)\nlocal result\nif (type(value) == \"table\") then\nresult = { }\nfor _,v in ipairs(value) do\ntable.insert(result, _MAKE.escquote(v))\nend\nreturn result\nelse\nreturn value\nend\nend\nfunction premake.make_copyrule(source, target)\n_p('%s: %s', target, source)\n_p('\\t@echo Copying $(notdir %s)', target)\n_p('\\t-$(call COPY,%s,%s)', source, target)\nend\nfunction premake.make_mkdirrule(var)\n_p('\\t@echo Creating %s', var)\n_p('\\t-$(call MKDIR,%s)', var)\n_p('')\nend\nfunction make.list(val"
- "ue)\nif #value > 0 then\nreturn \" \" .. table.concat(value, \" \")\nelse\nreturn \"\"\nend\nend\nfunction _MAKE.getmakefilename(this, searchprjs)\nlocal count = 0\nfor sln in premake.solution.each() do\nif (sln.location == this.location) then count = count + 1 end\nif (searchprjs) then\nfor _,prj in ipairs(sln.projects) do\nif (prj.location == this.location) then count = count + 1 end\nend\nend\nend\nif (count == 1) then\nreturn \"Makefile\"\nelse\nreturn this.name .. \".make\"\nend\nend\nfunction _MAKE.getnames(tbl)\nlocal result = table.extract(tbl, \"name\")\nfor k,v in pairs(result) do\nresult[k] = _MAKE.esc(v)\nend\nreturn result\nend\nfunction make.settings(cfg, cc)\nif #cfg.makesettings > 0 then\nfor _, value in ipairs(cfg.makesettings) do\n_p(value)\nend\nend\nlocal toolsettings = cc.platforms[cfg.platform].cfgsettings\nif toolsettings then\n_p(toolsettings)\nend\nend\nnewaction {\ntrigger = \"gmake\",\nshortname = \"GNU Make\",\ndescription = \"Generate GNU makefiles for POSIX, MinG"
- "W, and Cygwin\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\", \"C#\", \"Vala\", \"Swift\" },\nvalid_tools = {\ncc = { \"gcc\", \"ghs\" },\ndotnet = { \"mono\", \"msnet\", \"pnet\" },\nvalac = { \"valac\" },\nswift = { \"swift\" },\n},\nonsolution = function(sln)\npremake.generate(sln, _MAKE.getmakefilename(sln, false), premake.make_solution)\nend,\nonproject = function(prj)\nlocal makefile = _MAKE.getmakefilename(prj, true)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, makefile, premake.make_csharp)\nelseif premake.iscppproject(prj) then\npremake.generate(prj, makefile, premake.make_cpp)\nelseif premake.isswiftproject(prj) then\npremake.generate(prj, makefile, premake.make_swift)\nelse\npremake.generate(prj, makefile, premake.make_vala)\nend\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, _MAKE.getmakefilename(sln, false))\nend,\noncleanproject = function(prj)\npremake.clean.file(p"
- "rj, _MAKE.getmakefilename(prj, true))\nend,\ngmake = {}\n}\n",
+ "_MAKE = { }\npremake.make = { }\nlocal make = premake.make\nfunction _MAKE.esc(value)\nlocal result\nif (type(value) == \"table\") then\nresult = { }\nfor _,v in ipairs(value) do\ntable.insert(result, _MAKE.esc(v))\nend\nreturn result\nelse\nresult = value:gsub(\"\\\\\", \"\\\\\\\\\")\nresult = result:gsub(\" \", \"\\\\ \")\nresult = result:gsub(\"%%(\", \"\\\\%(\")\nresult = result:gsub(\"%%)\", \"\\\\%)\")\nresult = result:gsub(\"$\\\\%((.-)\\\\%)\", \"$%(%1%)\")\nreturn result\nend\nend\nfunction _MAKE.escquote(value)\nlocal result\nif (type(value) == \"table\") then\nresult = { }\nfor _,v in ipairs(value) do\ntable.insert(result, _MAKE.escquote(v))\nend\nreturn result\nelse\nresult = value:gsub(\" \", \"\\\\ \")\nresult = result:gsub(\"\\\"\", \"\\\\\\\"\")\nreturn result\nend\nend\nfunction premake.make_copyrule(source, target)\n_p('%s: %s', target, source)\n_p('\\t@echo Copying $(notdir %s)', target)\n_p('\\t-$(call COPY,%s,%s)', source, target)\nend\nfunction premake.make_mkdirrule(var)\n_p('\\t@echo Cr"
+ "eating %s', var)\n_p('\\t-$(call MKDIR,%s)', var)\n_p('')\nend\nfunction make.list(value)\nif #value > 0 then\nreturn \" \" .. table.concat(value, \" \")\nelse\nreturn \"\"\nend\nend\nfunction _MAKE.getmakefilename(this, searchprjs)\nlocal count = 0\nfor sln in premake.solution.each() do\nif (sln.location == this.location) then count = count + 1 end\nif (searchprjs) then\nfor _,prj in ipairs(sln.projects) do\nif (prj.location == this.location) then count = count + 1 end\nend\nend\nend\nif (count == 1) then\nreturn \"Makefile\"\nelse\nreturn this.name .. \".make\"\nend\nend\nfunction _MAKE.getnames(tbl)\nlocal result = table.extract(tbl, \"name\")\nfor k,v in pairs(result) do\nresult[k] = _MAKE.esc(v)\nend\nreturn result\nend\nfunction make.settings(cfg, cc)\nif #cfg.makesettings > 0 then\nfor _, value in ipairs(cfg.makesettings) do\n_p(value)\nend\nend\nlocal toolsettings = cc.platforms[cfg.platform].cfgsettings\nif toolsettings then\n_p(toolsettings)\nend\nend\nnewaction {\ntrigger = \"gmake\",\nshort"
+ "name = \"GNU Make\",\ndescription = \"Generate GNU makefiles for POSIX, MinGW, and Cygwin\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\", \"C#\", \"Vala\", \"Swift\" },\nvalid_tools = {\ncc = { \"gcc\", \"ghs\" },\ndotnet = { \"mono\", \"msnet\", \"pnet\" },\nvalac = { \"valac\" },\nswift = { \"swift\" },\n},\nonsolution = function(sln)\npremake.generate(sln, _MAKE.getmakefilename(sln, false), premake.make_solution)\nend,\nonproject = function(prj)\nlocal makefile = _MAKE.getmakefilename(prj, true)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, makefile, premake.make_csharp)\nelseif premake.iscppproject(prj) then\npremake.generate(prj, makefile, premake.make_cpp)\nelseif premake.isswiftproject(prj) then\npremake.generate(prj, makefile, premake.make_swift)\nelse\npremake.generate(prj, makefile, premake.make_vala)\nend\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, _MAKE.ge"
+ "tmakefilename(sln, false))\nend,\noncleanproject = function(prj)\npremake.clean.file(prj, _MAKE.getmakefilename(prj, true))\nend,\ngmake = {}\n}\n",
/* actions/make/make_solution.lua */
- "function premake.make_solution(sln)\nlocal cc = premake[_OPTIONS.cc]\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\n_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# Type \"make help\" for usage help')\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(sln.configurations[1], platforms[1], true)))\n_p('endif')\n_p('export config')\n_p('')\nlocal projects = table.extract(sln.projects, \"name\")\ntable.sort(projects)\n_p('PROJECTS := %s', table.concat(_MAKE.esc(projects), \" \"))\n_p('')\n_p('.PHONY: all clean help $(PROJECTS)')\n_p('')\n_p('all: $(PROJECTS)')\n_p('')\nfor _, prj in ipairs(sln.projects) do\n_p('%s: %s', _MAKE.esc(prj.name), table.concat(_MAKE.esc(table.extract(premake.getdependencies(prj), \"name\")), \" \"))\nif (not sln.messageskip) or (not table.contains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p('\\t@echo \"==== Building %s ($(config)) ====\"', prj.name)\nend\n_p('\\t@${MAKE} --no-pr"
- "int-directory -C %s -f %s', _MAKE.esc(path.getrelative(sln.location, prj.location)), _MAKE.esc(_MAKE.getmakefilename(prj, true)))\n_p('')\nend\n_p('clean:')\nfor _ ,prj in ipairs(sln.projects) do\n_p('\\t@${MAKE} --no-print-directory -C %s -f %s clean', _MAKE.esc(path.getrelative(sln.location, prj.location)), _MAKE.esc(_MAKE.getmakefilename(prj, true)))\nend\n_p('')\n_p('help:')\n_p(1,'@echo \"Usage: make [config=name] [target]\"')\n_p(1,'@echo \"\"')\n_p(1,'@echo \"CONFIGURATIONS:\"')\nlocal cfgpairs = { }\nfor _, platform in ipairs(platforms) do\nfor _, cfgname in ipairs(sln.configurations) do\n_p(1,'@echo \" %s\"', premake.getconfigname(cfgname, platform, true))\nend\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"TARGETS:\"')\n_p(1,'@echo \" all (default)\"')\n_p(1,'@echo \" clean\"')\nfor _, prj in ipairs(sln.projects) do\n_p(1,'@echo \" %s\"', prj.name)\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"For more information, see https://github.com/bkaradzic/genie\"')\nend\n",
+ "function premake.make_solution(sln)\nlocal cc = premake[_OPTIONS.cc]\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\n_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# https://github.com/bkaradzic/GENie')\n_p('# Type \"make help\" for usage help')\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(sln.configurations[1], platforms[1], true)))\n_p('endif')\n_p('export config')\n_p('')\nlocal projects = table.extract(sln.projects, \"name\")\ntable.sort(projects)\n_p('PROJECTS := %s', table.concat(_MAKE.esc(projects), \" \"))\n_p('')\n_p('.PHONY: all clean help $(PROJECTS)')\n_p('')\n_p('all: $(PROJECTS)')\n_p('')\nfor _, prj in ipairs(sln.projects) do\n_p('%s: %s', _MAKE.esc(prj.name), table.concat(_MAKE.esc(table.extract(premake.getdependencies(prj), \"name\")), \" \"))\nif (not sln.messageskip) or (not table.contains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p('\\t@echo \"==== Building %s ($(config)) ===="
+ "\"', prj.name)\nend\n_p('\\t@${MAKE} --no-print-directory -C %s -f %s', _MAKE.esc(path.getrelative(sln.location, prj.location)), _MAKE.esc(_MAKE.getmakefilename(prj, true)))\n_p('')\nend\n_p('clean:')\nfor _ ,prj in ipairs(sln.projects) do\n_p('\\t@${MAKE} --no-print-directory -C %s -f %s clean', _MAKE.esc(path.getrelative(sln.location, prj.location)), _MAKE.esc(_MAKE.getmakefilename(prj, true)))\nend\n_p('')\n_p('help:')\n_p(1,'@echo \"Usage: make [config=name] [target]\"')\n_p(1,'@echo \"\"')\n_p(1,'@echo \"CONFIGURATIONS:\"')\nlocal cfgpairs = { }\nfor _, platform in ipairs(platforms) do\nfor _, cfgname in ipairs(sln.configurations) do\n_p(1,'@echo \" %s\"', premake.getconfigname(cfgname, platform, true))\nend\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"TARGETS:\"')\n_p(1,'@echo \" all (default)\"')\n_p(1,'@echo \" clean\"')\nfor _, prj in ipairs(sln.projects) do\n_p(1,'@echo \" %s\"', prj.name)\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"For more information, see https://github.com/bkaradzic/genie\"')\nend"
+ "\n",
/* actions/make/make_cpp.lua */
"-- --\npremake.make.cpp = { }\npremake.make.override = { }\npremake.make.makefile_ignore = false\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\nlocal action = premake.action.current()\npremake.gmake_cpp_header(prj, cc, platforms)\npremake.gmake_cpp_configs(prj, cc, platforms)\ntable.sort(prj.allfiles)\nlocal objdirs = {}\nlocal additionalobjdirs = {}\nfor _, file in ipairs(prj.allfiles) do\nif path.issourcefile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nadditionalobjdirs[_MAKE.esc(path.getdirectory(path.getrelative(prj.location,buildtask[2])))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in iter.sortByKeys(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\nfor dir, _"
@@ -233,110 +254,126 @@ const char* builtin_scripts[] = {
"URCES) $(OBJRESP) $(LDRESP) | $(TARGETDIR) $(OBJDIRS)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then\nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('endif')\n_p('\\t$(SILENT) $(LINKCMD) $(LINKOBJS)' .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\nelse\n_p('\\t$(call RM,$(TARGET))')\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(LINKOBJS))' .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p('\\t$(SILENT) $(LINKCMD_NDX)')\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCM"
"D)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(@)')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" and not prj.options.SkipBundling then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(P"
"REBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj, cc)\ncpp.dependencyRules(prj)\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal deps = string.format(\"%s \",path.getrelative(prj.location,buildtask[1]))\nfor _, depdata in ipairs(buildtask[3] or {}) do\ndeps = deps .. string.format(\"%s \",path.getrelative(prj.location,depdata))\nend\n_p('%s: %s | $(TARGETDIR) $(OBJDIRS)'\n,path.getrelative(prj.location,buildtask[2])\n, deps\n)\nfor _, cmdline in ipairs(buildtask[4] or {}) do\nlocal cmd = cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", \"$<\")\ncmd = string.gsub(cmd, \"%$%(@%)\", \"$@\")\n_p('\\t$(SILENT) %s',cmd)\nend\n_p('')\nend\nend\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,"
- "$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p(' -include $(OBJDIR)/$(notdir $(PCH))_objc.d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM = $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || "
- "exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = %s', cc.rc or 'windres')\n_p(' endif')\n_p('endif')\n_p('')\nif (not premake.make.makefile_ignore) then\n_p('MAKEFILE = %s', _MAKE.getmakefilename(prj, true))\n_p('')\nend\nend\nlocal function is_excluded(prj, cfg, file)\nif table.icontains(prj.excludes, file) then\nreturn true\nend\nif table.icontains(cfg.excludes, file) then\nreturn true\nend\nreturn false\nend\nfunction premake.gmake_cpp_configs(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(conf"
- "ig),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\nlocal targetDir = _MAKE.esc(cfg.buildtarget.directory)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', iif(targetDir == \"\", \".\", targetDir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(_MAKE.escquote(cc.getdefines(cfg.defines))))\nlocal id = make.list(cc.getincludedirs(cfg.includedirs));\nlocal uid = make.list(cc.getquoteincludedirs(cfg.userincludedirs))\nlocal sid = make.list(cc.getsystemincludedirs(cfg.systemincludedirs))\nif id ~= \"\" then\n_p(' INCLUDES +=%s', id)\nend\nif uid ~= \"\" then\n_p(' INCLUDES +=%s', uid)\nend\nif sid "
- "~= \"\" then\n_p(' INCLUDES +=%s', sid)\nend\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\ntable.sort(cfg.files)\nif cfg.flags.UseObjectResponseFile then\n_p(' OBJRESP = $(OBJDIR)/%s_objects', prj.name)\nelse\n_p(' OBJRESP =')\nend\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\nif not is_excluded(prj, cfg, file) then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-bui"
- "ld commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\n_p(' FORCE_INCLUDE_OBJC += -include $(OBJDIR)/$(notdir $(PCH))_objc')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,_MAKE.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), c"
- "fg.buildoptions, cfg.buildoptions_asm)))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getobjcflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cc.getobjcflags(cfg), cfg.buildoptions, cfg.buildoptions_objcpp)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\nlocal libdeps\nl"
- "ocal lddeps\nif #cfg.wholearchive > 0 then\nlibdeps = {}\nlddeps = {}\nfor _, linkcfg in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\nlocal linkpath = path.rebase(linkcfg.linktarget.fullpath, linkcfg.location, cfg.location)\nif table.icontains(cfg.wholearchive, linkcfg.project.name) then\nlddeps = table.join(lddeps, cc.wholearchive(linkpath))\nelse\ntable.insert(lddeps, linkpath)\nend\ntable.insert(libdeps, linkpath)\nend\nlibdeps = make.list(_MAKE.esc(libdeps))\nlddeps = make.list(_MAKE.esc(lddeps))\nelse\nlibdeps = make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\")))\nlddeps = libdeps\nend\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LIBDEPS +=%s', libdeps)\n_p(' LDDEPS +=%s', lddeps)\nif cfg.flags.UseLDResponseFile then\n_p(' LDRESP = $(OBJDIR)/%s_libs', prj.name)\n_p(' LIBS += @$(LDRESP)%s', make.list(cc.getlinkflags(cfg)))\nelse"
- "\n_p(' LDRESP =')\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nend\n_p(' EXTERNAL_LIBS +=%s', make.list(cc.getlibfiles(cfg)))\n_p(' LINKOBJS = %s', (cfg.flags.UseObjectResponseFile and \"@$(OBJRESP)\" or \"$(OBJECTS)\"))\nif cfg.kind == \"StaticLib\" then\nif (not prj.options.ArchiveSplit) then\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\nelse\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\n_p(' LINKCMD_NDX = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, true)))\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\nlocal startgroup = ''\nlocal endgroup = ''\nif (cfg.flags.LinkSupportCircularDependencies) then\nstartgroup = '-Wl,--start-group '\nendgroup = ' -Wl,--end-group'\nend\n_p(' LINKCMD = $(%s) -o $(TARGET) $(LINKOBJS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) %s$(LIBS)%s', tool, startgroup,"
- " endgroup)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\n_p(' GCH_OBJC = $(OBJDIR)/$(notdir $(PCH))_objc.gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) $(MAKEFILE) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('')\n_p('$(GCH_OBJC): $(PCH) $(MAKEFILE) | $(OBJDIR)'"
- ")\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_OBJCFLAGS) -x objective-c-header\", \"$(CXX) $(ALL_OBJCPPFLAGS) -x objective-c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj, cc)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\n_p('ifneq (,$(OBJRESP))')\n_p('$(OBJRESP): $(OBJECTS) | $(TARGETDIR) $(OBJDIRS)')\n_p('\\t$(SILENT) echo $^')\n_p('\\t$(SILENT) echo $^ > $@')\n_p('endif')\n_p('')\n_p('ifneq (,$(LDRESP))')\n_p('$(LDRESP): $(LDDEPS) | $(TARGETDIR) $(OBJDIRS)')\n_p('\\t$(SILENT) echo $^')\n_p('\\t$(SILENT) echo $^ > $@')\n_p('endif')\n_p('')\ntable.sort(prj.allfiles)\nfor _, file in ipairs(prj.allfiles or {}) do\nif path.issourcefile(file) then\nif (path.isobjcfile(file)) then\n_p('$(OBJDIR)/%s.o: %s $(GCH_OBJC) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path"
- ".removeext(file)))\n, _MAKE.esc(file)\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nelse\n_p('$(OBJDIR)/%s.o: %s $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nend\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\nif (path.iscfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE_OBJC) -o \"$@\" -c \"$<\"')\nelse\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCPPFLAGS) $(FORCE_INCLUDE_OBJC) -o \"$@\" -c \"$<\"')\nend\nelseif (path.isasmfile(file)) then\n_p('\\t$(SILENT) $(CC) $(ALL_ASMFLAGS) -o \"$@\" -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\n"
- "elseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.dependencyRules(prj)\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nif (dep[3]==nil or dep[3]==false) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(path.getrelative(prj.location, dep[1]))))\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nelse\n_p('%s: %s'\n, _MAKE.esc(dep[1])\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nend\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"', flags, objext)\nend\n",
+ "$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p(' -include $(OBJDIR)/$(notdir $(PCH))_objc.d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# https://github.com/bkaradzic/GENie')\n_p('')\n_p('.SUFFIXES:') -- Delete the default suffix rules.\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM "
+ " = $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = %s', cc.rc or 'windres')\n_p(' endif')\n_p('endif')\n_p('')\nif (not premake.make.makefile_ignore) then\n_p('MAKEFILE = %s', _MAKE.getmakefilename(prj, true))\n_p('')\nend\nend\nlocal function is_excluded(prj, cfg, file)\nif table.icontains(prj.excludes, file) then\nreturn true\nend\nif table.icontains(cfg.excludes, file) then\nreturn true\nend\nreturn false\nend\nfunction premake.gmake_cpp_configs(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremak"
+ "e.gmake_cpp_config(prj, cfg, cc)\nend\nend\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\nlocal targetDir = _MAKE.esc(cfg.buildtarget.directory)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', iif(targetDir == \"\", \".\", targetDir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(_MAKE.escquote(cc.getdefines(cfg.defines))))\nlocal id = make.list(cc.getincludedirs(cfg.includedirs));\nlocal uid = make.list(cc.getquoteincludedirs(cfg.userincludedirs))\nlocal sid = make.list(cc.getsystemincludedirs(cfg.systemincludedirs))\nif id ~= \"\" then"
+ "\n_p(' INCLUDES +=%s', id)\nend\nif uid ~= \"\" then\n_p(' INCLUDES +=%s', uid)\nend\nif sid ~= \"\" then\n_p(' INCLUDES +=%s', sid)\nend\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\ntable.sort(cfg.files)\nif cfg.flags.UseObjectResponseFile then\n_p(' OBJRESP = $(OBJDIR)/%s_objects', prj.name)\nelse\n_p(' OBJRESP =')\nend\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\nif not is_excluded(prj, cfg, file) then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\n"
+ "end\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\n_p(' FORCE_INCLUDE_OBJC += -include $(OBJDIR)/$(notdir $(PCH))_objc')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,_MAKE.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p('"
+ " ALL_ASMFLAGS += $(ASMFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_asm)))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getobjcflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_OBJCPPFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cc.getobjcflags(cfg), cfg.buildoptions, cfg.buildoptions_objcpp)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n "
+ " cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\nlocal libdeps\nlocal lddeps\nif #cfg.wholearchive > 0 then\nlibdeps = {}\nlddeps = {}\nfor _, linkcfg in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\nlocal linkpath = path.rebase(linkcfg.linktarget.fullpath, linkcfg.location, cfg.location)\nif table.icontains(cfg.wholearchive, linkcfg.project.name) then\nlddeps = table.join(lddeps, cc.wholearchive(linkpath))\nelse\ntable.insert(lddeps, linkpath)\nend\ntable.insert(libdeps, linkpath)\nend\nlibdeps = make.list(_MAKE.esc(libdeps))\nlddeps = make.list(_MAKE.esc(lddeps))\nelse\nlibdeps = make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\")))\nlddeps = libdeps\nend\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LIBDEPS +=%s', libdeps)\n_p(' LDDEPS +=%s', lddeps)\nif cfg.flags.UseLDResponseFile then\n_p(' LDRESP "
+ " = $(OBJDIR)/%s_libs', prj.name)\n_p(' LIBS += @$(LDRESP)%s', make.list(cc.getlinkflags(cfg)))\nelse\n_p(' LDRESP =')\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nend\n_p(' EXTERNAL_LIBS +=%s', make.list(cc.getlibfiles(cfg)))\n_p(' LINKOBJS = %s', (cfg.flags.UseObjectResponseFile and \"@$(OBJRESP)\" or \"$(OBJECTS)\"))\nif cfg.kind == \"StaticLib\" then\nif (not prj.options.ArchiveSplit) then\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\nelse\n_p(' LINKCMD = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, false)))\n_p(' LINKCMD_NDX = $(AR) %s $(TARGET)', make.list(cc.getarchiveflags(prj, cfg, true)))\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\nlocal startgroup = ''\nlocal endgroup = ''\nif (cfg.flags.LinkSupportCircularDependencies) then\nstartgroup = '-Wl,--start-group '\nendgroup = ' -Wl,--end-group'\nend\n_p(' LINKC"
+ "MD = $(%s) -o $(TARGET) $(LINKOBJS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) %s$(LIBS)%s', tool, startgroup, endgroup)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\n_p(' GCH_OBJC = $(OBJDIR)/$(notdir $(PCH))_objc.gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH) $(MAKEFILE) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_CFLAGS) -x c-header\", \"$(CXX) $(ALL_CXXFLAGS) -x c++-header\")\n_p('\\t$(SIL"
+ "ENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('')\n_p('$(GCH_OBJC): $(PCH) $(MAKEFILE) | $(OBJDIR)')\nif prj.msgprecompile then\n_p('\\t@echo ' .. prj.msgprecompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nlocal cmd = iif(prj.language == \"C\", \"$(CC) $(ALL_OBJCFLAGS) -x objective-c-header\", \"$(CXX) $(ALL_OBJCPPFLAGS) -x objective-c++-header\")\n_p('\\t$(SILENT) %s $(DEFINES) $(INCLUDES) -o \"$@\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj, cc)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\n_p('ifneq (,$(OBJRESP))')\n_p('$(OBJRESP): $(OBJECTS) | $(TARGETDIR) $(OBJDIRS)')\n_p('\\t$(SILENT) echo $^')\n_p('\\t$(SILENT) echo $^ > $@')\n_p('endif')\n_p('')\n_p('ifneq (,$(LDRESP))')\n_p('$(LDRESP): $(LDDEPS) | $(TARGETDIR) $(OBJDIRS)')\n_p('\\t$(SILENT) echo $^')\n_p('\\t$(SILENT) echo $^ > $@')\n_p('endif')\n_p('')\ntable.sort(prj.allfiles)\nfor _, file in ipairs(prj.allfiles or {}) do\nif path.issourcefile(file) then\nif (path.iso"
+ "bjcfile(file)) then\n_p('$(OBJDIR)/%s.o: %s $(GCH_OBJC) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nelse\n_p('$(OBJDIR)/%s.o: %s $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nend\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\nif (path.iscfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE_OBJC) -o \"$@\" -c \"$<\"')\nelse\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCPPFLAGS) $(FORCE_INCLUDE_OBJC) -o \"$@\" -c \"$<\"')\nend\nelseif (path.isasmfile(file)) then\n_p('\\t$(SILENT) $(CC) $(ALL_ASMFLAGS) -o \"$@\" -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \""
+ "o\")\nend\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.dependencyRules(prj)\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nif (dep[3]==nil or dep[3]==false) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(path.getrelative(prj.location, dep[1]))))\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nelse\n_p('%s: %s'\n, _MAKE.esc(dep[1])\n, _MAKE.esc(path.getrelative(prj.location, dep[2]))\n)\nend\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('"
+ "\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"', flags, objext)\nend\n",
/* actions/make/make_csharp.lua */
"local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\nlocal name = cfg.buildtarget.basename .. \".\"\nlocal dir = path.getdirectory(fname)\nif dir ~= \".\" then\nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Compile\" then"
- "\ntable.insert(sources, fcfg.name)\nelseif action == \"EmbeddedResource\" then\ntable.insert(embedded, fcfg.name)\nelseif action == \"Content\" then\ncopypairs[\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fcfg.name))] = _MAKE.esc(fcfg.name)\nelseif path.getname(fcfg.name):lower() == \"app.config\" then\ncopypairs[\"$(TARGET).config\"] = _MAKE.esc(fcfg.name)\nend\nend\nlocal paths = table.translate(prj.libdirs, function(v) return path.join(prj.basedir, v) end)\npaths = table.join({prj.basedir}, paths)\nfor _, libname in ipairs(premake.getlinks(prj, \"system\", \"fullpath\")) do\nlocal libdir = os.pathsearch(libname..\".dll\", unpack(paths))\nif (libdir) then\nlocal target = \"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(libname))\nlocal source = path.getrelative(prj.basedir, path.join(libdir, libname))..\".dll\"\ncopypairs[target] = _MAKE.esc(source)\nend\nend\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(prj.configu"
- "rations[1]:lower()))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('ifndef CSC')\n_p(' CSC=%s', csc.getcompilervar(prj))\n_p('endif')\n_p('')\n_p('ifndef RESGEN')\n_p(' RESGEN=resgen')\n_p('endif')\n_p('')\nlocal platforms = premake.filterplatforms(prj.solution, premake[_OPTIONS.cc].platforms)\ntable.insert(platforms, 1, \"\")\nfor cfg in premake.eachconfig(prj) "
- "do\npremake.gmake_cs_config(cfg, csc, cfglibs)\nend\n_p('# To maintain compatibility with VS.NET, these values must be set at the project level')\n_p('TARGET := $(TARGETDIR)/%s', _MAKE.esc(prj.buildtarget.name))\n_p('FLAGS += /t:%s %s', csc.getkind(prj):lower(), table.implode(_MAKE.esc(prj.libdirs), \"/lib:\", \"\", \" \"))\n_p('REFERENCES += %s', table.implode(_MAKE.esc(premake.getlinks(prj, \"system\", \"basename\")), \"/r:\", \".dll\", \" \"))\n_p('')\n_p('SOURCES := \\\\')\nfor _, fname in ipairs(sources) do\n_p('\\t%s \\\\', _MAKE.esc(path.translate(fname)))\nend\n_p('')\n_p('EMBEDFILES := \\\\')\nfor _, fname in ipairs(embedded) do\n_p('\\t%s \\\\', getresourcefilename(prj, fname))\nend\n_p('')\n_p('COPYFILES += \\\\')\nfor target, source in pairs(cfgpairs[anycfg]) do\n_p('\\t%s \\\\', target)\nend\nfor target, source in pairs(copypairs) do\n_p('\\t%s \\\\', target)\nend\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin"
- ",$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\n_p('all: $(TARGETDIR) $(OBJDIR) prebuild $(EMBEDFILES) $(COPYFILES) prelink $(TARGET)')\n_p('')\n_p('$(TARGET): $(SOURCES) $(EMBEDFILES) $(DEPENDS)')\n_p('\\t$(SILENT) $(CSC) /nologo /out:$@ $(FLAGS) $(REFERENCES) $(SOURCES) $(patsubst %%,/resource:%%,$(EMBEDFILES))')\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIR):')\npremake.make_mkdirrule(\"$(OBJDIR)\")\n_p('clean:')\n_p('\\t@echo Cleaning %s', prj.name)\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET) $(COPYFILES)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGETDIR)/%s.*) del $(subst /,\\\\\\\\,$(TARGETDIR)/%s.*)', prj.buildtarget.basename, prj.buildtarget.basename)\nfor target, source in pairs(cfgpairs"
- "[anycfg]) do\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,%s) del $(subst /,\\\\\\\\,%s)', target, target)\nend\nfor target, source in pairs(copypairs) do\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,%s) del $(subst /,\\\\\\\\,%s)', target, target)\nend\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\n_p('# Per-configuration copied file rules')\nfor cfg in premake.eachconfig(prj) do\n_p('ifneq (,$(findstring %s,$(config)))', _MAKE.esc(cfg.name:lower()))\nfor target, source in pairs(cfgpairs[cfg]) do\npremake.make_copyrule(source, target)\nend\n_p('endif')\n_p('')\nend\n_p('# Copied file rules')\nfor target, source in pairs(copypairs) do\npremake.make_copyrule(source, target)\nend\n_p('# Embedded file rules')\nfor _, fname in ipairs(embedded) do\nif path.getextension(fname) == \".resx\" then\n_p('%s: %s', getresourcefilename(prj, fname), "
- "_MAKE.esc(fname))\n_p('\\t$(SILENT) $(RESGEN) $^ $@')\nend\n_p('')\nend\nend\nfunction premake.gmake_cs_config(cfg, csc, cfglibs)\nlocal targetDir = _MAKE.esc(cfg.buildtarget.directory)\n_p('ifneq (,$(findstring %s,$(config)))', _MAKE.esc(cfg.name:lower()))\n_p(' TARGETDIR := %s', iif(targetDir == \"\", \".\", targetDir))\n_p(' OBJDIR := %s', _MAKE.esc(cfg.objectsdir))\n_p(' DEPENDS := %s', table.concat(_MAKE.esc(premake.getlinks(cfg, \"dependencies\", \"fullpath\")), \" \"))\n_p(' REFERENCES := %s', table.implode(_MAKE.esc(cfglibs[cfg]), \"/r:\", \"\", \" \"))\n_p(' FLAGS += %s %s', table.implode(cfg.defines, \"/d:\", \"\", \" \"), table.concat(table.join(csc.getflags(cfg), cfg.buildoptions), \" \"))\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link co"
- "mmands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p('endif')\n_p('')\nend\n",
+ "\ntable.insert(sources, fcfg.name)\nelseif action == \"EmbeddedResource\" then\ntable.insert(embedded, fcfg.name)\nelseif action == \"Content\" then\ncopypairs[\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fcfg.name))] = _MAKE.esc(fcfg.name)\nelseif path.getname(fcfg.name):lower() == \"app.config\" then\ncopypairs[\"$(TARGET).config\"] = _MAKE.esc(fcfg.name)\nend\nend\nlocal paths = table.translate(prj.libdirs, function(v) return path.join(prj.basedir, v) end)\npaths = table.join({prj.basedir}, paths)\nfor _, libname in ipairs(premake.getlinks(prj, \"system\", \"fullpath\")) do\nlocal libdir = os.pathsearch(libname..\".dll\", unpack(paths))\nif (libdir) then\nlocal target = \"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(libname))\nlocal source = path.getrelative(prj.basedir, path.join(libdir, libname))..\".dll\"\ncopypairs[target] = _MAKE.esc(source)\nend\nend\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# https://github.com/bkaradzic/GENie')\n_p('')\n_p('.SUFFIXES:')"
+ " -- Delete the default suffix rules.\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(prj.configurations[1]:lower()))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('ifndef CSC')\n_p(' CSC=%s', csc.getcompilervar(prj))\n_p('endif')\n_p('')\n_p('ifndef RESGEN')\n_p(' RESGEN=resgen')\n_p('endif')\n_p('')\nlocal platforms = premake.filterplatforms(prj.soluti"
+ "on, premake[_OPTIONS.cc].platforms)\ntable.insert(platforms, 1, \"\")\nfor cfg in premake.eachconfig(prj) do\npremake.gmake_cs_config(cfg, csc, cfglibs)\nend\n_p('# To maintain compatibility with VS.NET, these values must be set at the project level')\n_p('TARGET := $(TARGETDIR)/%s', _MAKE.esc(prj.buildtarget.name))\n_p('FLAGS += /t:%s %s', csc.getkind(prj):lower(), table.implode(_MAKE.esc(prj.libdirs), \"/lib:\", \"\", \" \"))\n_p('REFERENCES += %s', table.implode(_MAKE.esc(premake.getlinks(prj, \"system\", \"basename\")), \"/r:\", \".dll\", \" \"))\n_p('')\n_p('SOURCES := \\\\')\nfor _, fname in ipairs(sources) do\n_p('\\t%s \\\\', _MAKE.esc(path.translate(fname)))\nend\n_p('')\n_p('EMBEDFILES := \\\\')\nfor _, fname in ipairs(embedded) do\n_p('\\t%s \\\\', getresourcefilename(prj, fname))\nend\n_p('')\n_p('COPYFILES += \\\\')\nfor target, source in pairs(cfgpairs[anycfg]) do\n_p('\\t%s \\\\', target)\nend\nfor target, source in pairs(copypairs) do\n_p('\\t%s \\\\', target)\nend\n_p('')\n_p('SHELLTY"
+ "PE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\n_p('all: $(TARGETDIR) $(OBJDIR) prebuild $(EMBEDFILES) $(COPYFILES) prelink $(TARGET)')\n_p('')\n_p('$(TARGET): $(SOURCES) $(EMBEDFILES) $(DEPENDS)')\n_p('\\t$(SILENT) $(CSC) /nologo /out:$@ $(FLAGS) $(REFERENCES) $(SOURCES) $(patsubst %%,/resource:%%,$(EMBEDFILES))')\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIR):')\npremake.make_mkdirrule(\"$(OBJDIR)\")\n_p('clean:')\n_p('\\t@echo Cleaning %s', prj.name)\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET) $(COPYFILES)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGETDIR)/%s.*) del $(subst /,\\\\\\\\,$(TA"
+ "RGETDIR)/%s.*)', prj.buildtarget.basename, prj.buildtarget.basename)\nfor target, source in pairs(cfgpairs[anycfg]) do\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,%s) del $(subst /,\\\\\\\\,%s)', target, target)\nend\nfor target, source in pairs(copypairs) do\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,%s) del $(subst /,\\\\\\\\,%s)', target, target)\nend\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\n_p('# Per-configuration copied file rules')\nfor cfg in premake.eachconfig(prj) do\n_p('ifneq (,$(findstring %s,$(config)))', _MAKE.esc(cfg.name:lower()))\nfor target, source in pairs(cfgpairs[cfg]) do\npremake.make_copyrule(source, target)\nend\n_p('endif')\n_p('')\nend\n_p('# Copied file rules')\nfor target, source in pairs(copypairs) do\npremake.make_copyrule(source, target)\nend\n_p('# Embedded file rules')\nfor _, fname in ipairs(e"
+ "mbedded) do\nif path.getextension(fname) == \".resx\" then\n_p('%s: %s', getresourcefilename(prj, fname), _MAKE.esc(fname))\n_p('\\t$(SILENT) $(RESGEN) $^ $@')\nend\n_p('')\nend\nend\nfunction premake.gmake_cs_config(cfg, csc, cfglibs)\nlocal targetDir = _MAKE.esc(cfg.buildtarget.directory)\n_p('ifneq (,$(findstring %s,$(config)))', _MAKE.esc(cfg.name:lower()))\n_p(' TARGETDIR := %s', iif(targetDir == \"\", \".\", targetDir))\n_p(' OBJDIR := %s', _MAKE.esc(cfg.objectsdir))\n_p(' DEPENDS := %s', table.concat(_MAKE.esc(premake.getlinks(cfg, \"dependencies\", \"fullpath\")), \" \"))\n_p(' REFERENCES := %s', table.implode(_MAKE.esc(cfglibs[cfg]), \"/r:\", \"\", \" \"))\n_p(' FLAGS += %s %s', table.implode(cfg.defines, \"/d:\", \"\", \" \"), table.concat(table.join(csc.getflags(cfg), cfg.buildoptions), \" \"))\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p("
+ "' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p('endif')\n_p('')\nend\n",
/* actions/make/make_vala.lua */
- "local make = premake.make\nfunction premake.make_vala(prj)\nlocal valac = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, valac.platforms, \"Native\")\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM = $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || e"
- "xit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('VALAC = %s', valac.valac)\n_p('CC = %s', valac.cc)\n_p('')\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_valac_config(prj, cfg, valac)\nend\nend\n_p('SOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.issourcefile(file) then\nif not table.icontains(prj.excludes, file) then\n_p('\\t%s \\\\', _MAKE.esc(file))\nend\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\n_p('all: prebuild prelink $(TARGET) | $(TARGETDIR)')\n_p('\\t@:')\n_p('')\n_p('$(TARGET): $(SOURCES) | $(TARGETDIR)')\n_p('\\t$(SILENT) $(VALAC) -o $(TARGET) --cc=$(CC) $(FLAGS) $(SOURCES)')\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj"
- ".solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\nend\nfunction premake.gmake_valac_config(prj, cfg, valac)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\n_p(' TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(valac.getdefines(cfg.defines)))\n_p(' VAPIDIRS +=%s', make.list(valac.getvapidirs(cfg.vapidirs)))\n_p(' PKGS +=%s', make.list(valac.getlinks(cfg.links)))\n_p(' FLAGS += $(DEFINES) $(VAPIDIRS) $(PKGS)%s', make.list(table.join(valac.getvalaflags(cfg), valac.getbuildoptions(cfg.buildoptions), valac.getbuildoptions(cfg.buildoptions_c), c"
- "fg.buildoptions_vala)))\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p('endif')\n_p('')\nend\n",
+ "premake.make.vala = { }\npremake.make.makefile_ignore = false\nlocal vala = premake.make.vala\nlocal make = premake.make\nfunction premake.make_vala(prj)\nlocal valac = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, valac.platforms, \"Native\")\npremake.gmake_vala_header(prj, valac, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_valac_config(prj, cfg, valac)\nend\nend\nlocal objdirs = {}\nlocal additionalobjdirs = {}\nfor _, file in ipairs(prj.allfiles) do\nif path.issourcefile(file) or path.isgresource(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in iter.sortByKeys(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\nfor dir, _ in iter.sortByKeys(additionalobjdirs) do\n_p('\\t%s \\\\', dir)\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\n_p('all: $(OBJDIRS) $(TARGETDIR) prebuild prelink $(TARGET)')\n_p("
+ "'\\t@:')\n_p('')\n_p('$(TARGET): $(OBJECTS) | $(TARGETDIR)')\n_p('\\t@echo Linking %s', prj.name)\n_p('\\t$(SILENT) $(LINKCMD)')\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(@)')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p('')\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\nvala.fileRules(prj, valac)\nend\nfunction premake.gmake_vala_header(prj, valac, platforms)\n_p('# %s project makefile autoge"
+ "nerated by GENie', premake.action.current().shortname)\n_p('# https://github.com/bkaradzic/GENie')\n_p('')\n_p('.SUFFIXES:') -- Delete the default suffix rules.\n_p('')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM = $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')"
+ "\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('VALAC = %s', valac.valac)\n_p('CC = %s', valac.cc)\n_p('GLIBRC = %s', valac.glibrc)\n_p('')\nif (not premake.make.makefile_ignore) then\n_p('MAKEFILE = %s', _MAKE.getmakefilename(prj, true))\n_p('')\nend\nend\nlocal function is_excluded(prj, cfg, file)\nif table.icontains(prj.excludes, file) then\nreturn true\nend\nif table.icontains(cfg.excludes, file) then\nreturn true\nend\nreturn false\nend\nfunction premake.gmake_valac_config(prj, cfg, valac)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\n_p(' BASEDIR = %s', _MAKE.esc(path.getrelative(cfg.location, _WORKING_DIR)))\n_p(' OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(valac.getdefines(cfg.defines)))\n_p(' VAPIDIRS +=%s', make.list(valac.getvapidirs(cfg.vapidirs)))"
+ "\n_p(' PKGS +=%s', make.list(valac.getlinks(cfg.links)))\n_p(' FLAGS += $(DEFINES) $(VAPIDIRS) $(PKGS)%s', make.list(table.join(valac.getvalaflags(cfg), cfg.buildoptions_vala)))\n_p(' VALA_LDFLAGS= $(shell pkg-config --libs%s)', make.list(cfg.links))\n_p(' ALL_LDFLAGS+= $(LDFLAGS)%s $(VALA_LDFLAGS)', make.list(table.join(cfg.linkoptions)))\n_p(' LINKOBJS = %s', \"$(OBJECTS)\")\n_p(' VALA_CFLAGS = $(shell pkg-config --cflags%s)%s', make.list(cfg.links), make.list(valac.getvalaccflags(cfg)))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ARCH)%s $(VALA_CFLAGS)', make.list(table.join(cfg.buildoptions, cfg.buildoptions_c)))\n_p(' LINKCMD = $(CC) -o $(TARGET) $(LINKOBJS) $(ARCH) $(ALL_LDFLAGS)');\ntable.sort(cfg.files)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) or path.isgresource(file) then\nif not is_excluded(prj, cfg, file) then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' SOURCES := \\\\'"
+ ")\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) and path.isvalafile(file) then\nif not is_excluded(prj, cfg, file) then\n_p('\\t%s \\\\', _MAKE.esc(file))\nend\nend\nend\n_p('')\n_p(' GRESOURCES := \\\\')\nfor _, file in ipairs(cfg.files) do\nif path.isgresource(file) then\nif not is_excluded(prj, cfg, file) then\n_p('\\t%s \\\\', _MAKE.esc(file))\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p('endif')\n_p('')\nend\nfu"
+ "nction vala.fileRules(prj, cc)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\n_p('ifneq (,$(OBJRESP))')\n_p('$(OBJRESP): $(OBJECTS) | $(TARGETDIR) $(OBJDIRS)')\n_p('\\t$(SILENT) echo $^')\n_p('\\t$(SILENT) echo $^ > $@')\n_p('endif')\n_p('')\n_p('ifneq (,$(LDRESP))')\n_p('$(LDRESP): $(LDDEPS) | $(TARGETDIR) $(OBJDIRS)')\n_p('\\t$(SILENT) echo $^')\n_p('\\t$(SILENT) echo $^ > $@')\n_p('endif')\n_p('')\nlocal pattern_targets = \"\"\ntable.sort(prj.allfiles)\nfor _, file in ipairs(prj.allfiles or {}) do\nif path.issourcefile(file) or path.isgresource(file) then\nif path.isvalafile(file) or path.iscfile(file) or path.isgresource(file) then\nif path.isvalafile(file) or path.isgresource(file) then\n_p('$(OBJDIR)/%s.o: $(OBJDIR)/%s.c $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nif not path.isgresource(file) then\npattern_targets = patte"
+ "rn_targets\n.. \"$(OBJDIR)/\"\n.. _MAKE.esc(path.trimdots(path.removeext(file)))\n.. \".% \\\\\\n\" -- Pattern rule: https://stackoverflow.com/a/3077254\nend\nelse\n_p('$(OBJDIR)/%s.o: %s $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, file\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nend\nif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -c \"$<\"'\n, \"$(CC) $(ALL_CFLAGS)\"\n, _MAKE.esc(path.getbasename(file))\n)\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\n_p('')\nif path.isgresource(file) then\n_p('$(OBJDIR)/%s.c: %s $(GCH) $(MAKEFILE) | $(OBJDIR)/%s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n, _MAKE.esc(path.getdirectory(path.trimdots(file)))\n)\nif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) %s \"$<\" --target=\""
+ "$@\" --sourcedir=\"%s\" --generate'\n, \"$(GLIBRC)\"\n, _MAKE.esc(path.getdirectory(file))\n)\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\nend\n_p('')\nend\nend\nend\nif pattern_targets ~= \"\" then\n_p('%s: $(SOURCES) $(GRESOURCES) $(GCH) $(MAKEFILE)', pattern_targets)\nif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo [GEN] valac')\nend\n_p('\\t$(SILENT) %s $(SOURCES) --directory $(OBJDIR) --basedir $(BASEDIR) --gresources=$(GRESOURCES) -C'\n, \"$(VALAC) $(FLAGS)\"\n)\nfor _, task in ipairs(prj.postcompiletasks or {}) do\n_p('\\t$(SILENT) %s', task)\n_p('')\nend\nend\nend\n",
/* actions/make/make_swift.lua */
- "local make = premake.make\nlocal swift = { }\nfunction premake.make_swift(prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(1, 'config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(1, 'SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(1, 'SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(1, 'SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(1, 'SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(1, 'MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(1, 'COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(1, 'RM = $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(1, 'MKDIR = $(SILENT) mkdir \"$(subst /,"
- "\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(1, 'COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(1, 'RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('SWIFTC = %s', tool.swift)\n_p('SWIFTLINK = %s', tool.swiftc)\n_p('DSYMUTIL = %s', tool.dsymutil)\n_p('AR = %s', tool.ar)\n_p('')\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\nswift.generate_config(prj, cfg, tool)\nend\nend\n_p('.PHONY: ')\n_p('')\n_p('all: $(WORK_DIRS) $(TARGET)')\n_p('')\n_p('$(WORK_DIRS):')\n_p(1, '$(SILENT) $(call MKDIR,$@)')\n_p('')\n_p('SOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isswiftfile(file) then\n_p(1, '%s \\\\', _MAKE.esc(file))\nend\nend\n_p('')\nlocal objfiles = {}\n_p('OBJECTS_WITNESS := $(OBJDIR)/build.stamp')\n_p('OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isswiftfile(file) then\nlocal objname = _MAKE.esc(swift.objectname(file))\ntable.insert(objfiles, objnam"
- "e)\n_p(1, '%s \\\\', objname)\nend\nend\n_p('')\nswift.file_rules(prj, objfiles)\nswift.linker(prj, tool)\nswift.generate_clean(prj)\nend\nfunction swift.objectname(file)\nreturn path.join(\"$(OBJDIR)\", path.getname(file)..\".o\")\nend\nfunction swift.file_rules(prj, objfiles)\n_p('$(OBJECTS_WITNESS): $(SOURCES)')\n_p(1, \"@rm -f $(OBJDIR)/data.tmp\")\n_p(1, \"@touch $(OBJDIR)/data.tmp\")\n_p(1, \"$(SILENT) $(SWIFTC) -frontend -c $(SOURCES) -enable-objc-interop $(SDK) -I $(OUT_DIR) $(SWIFTC_FLAGS) -module-cache-path $(MODULECACHE_DIR) -D SWIFT_PACKAGE $(MODULE_MAPS) -emit-module-doc-path $(OUT_DIR)/$(MODULE_NAME).swiftdoc -module-name $(MODULE_NAME) -emit-module-path $(OUT_DIR)/$(MODULE_NAME).swiftmodule -num-threads 8 %s\", table.arglist(\"-o\", objfiles))\n_p(1, \"@mv -f $(OBJDIR)/data.tmp $(OBJECTS_WITNESS)\")\n_p('')\n_p('$(OBJECTS): $(OBJECTS_WITNESS)')\n_p(1, '@if test -f $@; then :; else \\\\')\n_p(2, 'rm -f $(OBJECTS_WITNESS); \\\\')\n_p(2, '$(MAKE) $(AM_MAKEFLAGS) $(OBJECTS_WITNESS); \\\\')\n_p(1, 'f"
- "i')\n_p('')\nend\nfunction swift.linker(prj, tool)\nlocal lddeps = make.list(premake.getlinks(prj, \"siblings\", \"fullpath\")) \nif prj.kind == \"StaticLib\" then\n_p(\"$(TARGET): $(OBJECTS) %s \", lddeps)\n_p(1, \"$(SILENT) $(AR) cr $(AR_FLAGS) $@ $(OBJECTS) %s\", (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\nelse\n_p(\"$(TARGET): $(OBJECTS) $(LDDEPS)\", lddeps)\n_p(1, \"$(SILENT) $(SWIFTLINK) $(SDK) -L $(OUT_DIR) -o $@ $(SWIFTLINK_FLAGS) $(LD_FLAGS) $(OBJECTS)\")\n_p(\"ifdef SYMBOLS\")\n_p(1, \"$(SILENT) $(DSYMUTIL) $(TARGET) -o $(SYMBOLS)\")\n_p(\"endif\")\nend\n_p('')\nend\nfunction swift.generate_clean(prj)\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('\\t$(SILENT) rm -rf $(SYMBOLS)')\n_p('\\t$(SILENT) rm -rf $(MODULECACHE_DIR"
- ")')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(SYMBOLS)) rmdir /s /q $(subst /,\\\\\\\\,$(SYMBOLS))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(MODULECACHE_DIR)) rmdir /s /q $(subst /,\\\\\\\\,$(MODULECACHE_DIR))')\n_p('endif')\n_p('')\nend\nfunction swift.generate_config(prj, cfg, tool)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\n_p(1, \"OUT_DIR = %s\", cfg.buildtarget.directory)\n _p(1, \"MODULECACHE_DIR = $(OUT_DIR)/ModuleCache\")\n_p(1, \"TARGET = $(OUT_DIR)/%s\", _MAKE.esc(cfg.buildtarget.name))\nlocal objdir = path.join(cfg.objectsdir, prj.name .. \".build\")\n_p(1, \"OBJDIR = %s\", objdir)\n_p(1, \"MODULE_NAME = %s\", prj.name)\n_p(1, \"MODULE_MAPS = %s\", make.list(tool.getmodulemaps(cfg)))\n_p(1, \"SWIFTC_FLAGS = %s\", make.list(tool.getswiftcflags(cfg)))\n_p(1, \"SWIFTLINK_FLA"
- "GS = %s\", make.list(tool.getswiftlinkflags(cfg)))\n_p(1, \"AR_FLAGS = %s\", make.list(tool.getarchiveflags(cfg, cfg, false)))\n_p(1, \"LD_FLAGS = %s\", make.list(tool.getldflags(cfg)))\n_p(1, \"LDDEPS = %s\", make.list(premake.getlinks(cfg, \"siblings\", \"fullpath\")))\nif cfg.flags.Symbols then\n_p(1, \"SYMBOLS = $(TARGET).dSYM\")\nend\nlocal sdk = tool.get_sdk_path(cfg)\nif sdk then\n_p(1, \"TOOLCHAIN_PATH = %s\", tool.get_toolchain_path(cfg))\n_p(1, \"SDK_PATH = %s\", sdk)\n_p(1, \"PLATFORM_PATH = %s\", tool.get_sdk_platform_path(cfg))\n_p(1, \"SDK = -sdk $(SDK_PATH)\")\nelse\n_p(1, \"SDK_PATH =\")\n_p(1, \"SDK =\")\nend\n_p(1,'WORK_DIRS = $(OUT_DIR) $(OBJDIR)')\n_p('endif')\n_p('')\nend",
+ "local make = premake.make\nlocal swift = { }\nfunction premake.make_swift(prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# https://github.com/bkaradzic/GENie')\n_p('')\n_p('.SUFFIXES:') -- Delete the default suffix rules.\n_p('')\n_p('ifndef config')\n_p(1, 'config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(1, 'SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(1, 'SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(1, 'SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(MAKESHELL)))')\n_p(1, 'SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(1, 'MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(1, 'COPY = $(SILENT) cp -fR \"$(1)"
+ "\" \"$(2)\"')\n_p(1, 'RM = $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(1, 'MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(1, 'COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(1, 'RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('SWIFTC = %s', tool.swift)\n_p('SWIFTLINK = %s', tool.swiftc)\n_p('DSYMUTIL = %s', tool.dsymutil)\n_p('AR = %s', tool.ar)\n_p('')\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\nswift.generate_config(prj, cfg, tool)\nend\nend\n_p('.PHONY: ')\n_p('')\n_p('all: $(WORK_DIRS) $(TARGET)')\n_p('')\n_p('$(WORK_DIRS):')\n_p(1, '$(SILENT) $(call MKDIR,$@)')\n_p('')\n_p('SOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isswiftfile(file) then\n_p(1, '%s \\\\', _MAKE.esc(file))\nend\nend\n_p('')\nlocal objfiles = {}\n_p('OBJECTS_WITNESS := $(OBJDIR)/build.stamp')\n_p('OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do"
+ "\nif path.isswiftfile(file) then\nlocal objname = _MAKE.esc(swift.objectname(file))\ntable.insert(objfiles, objname)\n_p(1, '%s \\\\', objname)\nend\nend\n_p('')\nswift.file_rules(prj, objfiles)\nswift.linker(prj, tool)\nswift.generate_clean(prj)\nend\nfunction swift.objectname(file)\nreturn path.join(\"$(OBJDIR)\", path.getname(file)..\".o\")\nend\nfunction swift.file_rules(prj, objfiles)\n_p('$(OBJECTS_WITNESS): $(SOURCES)')\n_p(1, \"@rm -f $(OBJDIR)/data.tmp\")\n_p(1, \"@touch $(OBJDIR)/data.tmp\")\n_p(1, \"$(SILENT) $(SWIFTC) -frontend -c $(SOURCES) -enable-objc-interop $(SDK) -I $(OUT_DIR) $(SWIFTC_FLAGS) -module-cache-path $(MODULECACHE_DIR) -D SWIFT_PACKAGE $(MODULE_MAPS) -emit-module-doc-path $(OUT_DIR)/$(MODULE_NAME).swiftdoc -module-name $(MODULE_NAME) -emit-module-path $(OUT_DIR)/$(MODULE_NAME).swiftmodule -num-threads 8 %s\", table.arglist(\"-o\", objfiles))\n_p(1, \"@mv -f $(OBJDIR)/data.tmp $(OBJECTS_WITNESS)\")\n_p('')\n_p('$(OBJECTS): $(OBJECTS_WITNESS)')\n_p(1, '@if test -f $@; then :; else "
+ "\\\\')\n_p(2, 'rm -f $(OBJECTS_WITNESS); \\\\')\n_p(2, '$(MAKE) $(AM_MAKEFLAGS) $(OBJECTS_WITNESS); \\\\')\n_p(1, 'fi')\n_p('')\nend\nfunction swift.linker(prj, tool)\nlocal lddeps = make.list(premake.getlinks(prj, \"siblings\", \"fullpath\"))\nif prj.kind == \"StaticLib\" then\n_p(\"$(TARGET): $(OBJECTS) %s \", lddeps)\n_p(1, \"$(SILENT) $(AR) cr $(AR_FLAGS) $@ $(OBJECTS) %s\", (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\nelse\n_p(\"$(TARGET): $(OBJECTS) $(LDDEPS)\", lddeps)\n_p(1, \"$(SILENT) $(SWIFTLINK) $(SDK) -L $(OUT_DIR) -o $@ $(SWIFTLINK_FLAGS) $(LD_FLAGS) $(OBJECTS)\")\n_p(\"ifdef SYMBOLS\")\n_p(1, \"$(SILENT) $(DSYMUTIL) $(TARGET) -o $(SYMBOLS)\")\n_p(\"endif\")\nend\n_p('')\nend\nfunction swift.generate_clean(prj)\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_"
+ "p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('\\t$(SILENT) rm -rf $(SYMBOLS)')\n_p('\\t$(SILENT) rm -rf $(MODULECACHE_DIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(SYMBOLS)) rmdir /s /q $(subst /,\\\\\\\\,$(SYMBOLS))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(MODULECACHE_DIR)) rmdir /s /q $(subst /,\\\\\\\\,$(MODULECACHE_DIR))')\n_p('endif')\n_p('')\nend\nfunction swift.generate_config(prj, cfg, tool)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\n_p(1, \"OUT_DIR = %s\", cfg.buildtarget.directory)\n _p(1, \"MODULECACHE_DIR = $(OUT_DIR)/ModuleCache\")\n_p(1, \"TARGET = $(OUT_DIR)/%s\", _MAKE.esc(cfg.buildtarget.name))\nlocal objdir = path.join(cfg.objectsdir, prj.name .. \".build\")\n_p(1, \"OBJDIR = %s\", objdir)\n_p(1, \"MODULE_NAME = %s\", prj.name)\n_p(1, \"MODULE_MAPS = %s\", make.list("
+ "tool.getmodulemaps(cfg)))\n_p(1, \"SWIFTC_FLAGS = %s\", make.list(tool.getswiftcflags(cfg)))\n_p(1, \"SWIFTLINK_FLAGS = %s\", make.list(tool.getswiftlinkflags(cfg)))\n_p(1, \"AR_FLAGS = %s\", make.list(tool.getarchiveflags(cfg, cfg, false)))\n_p(1, \"LD_FLAGS = %s\", make.list(tool.getldflags(cfg)))\n_p(1, \"LDDEPS = %s\", make.list(premake.getlinks(cfg, \"siblings\", \"fullpath\")))\nif cfg.flags.Symbols then\n_p(1, \"SYMBOLS = $(TARGET).dSYM\")\nend\nlocal sdk = tool.get_sdk_path(cfg)\nif sdk then\n_p(1, \"TOOLCHAIN_PATH = %s\", tool.get_toolchain_path(cfg))\n_p(1, \"SDK_PATH = %s\", sdk)\n_p(1, \"PLATFORM_PATH = %s\", tool.get_sdk_platform_path(cfg))\n_p(1, \"SDK = -sdk $(SDK_PATH)\")\nelse\n_p(1, \"SDK_PATH =\")\n_p(1, \"SDK =\")\nend\n_p(1,'WORK_DIRS = $(OUT_DIR) $(OBJDIR)')\n_p('endif')\n_p('')\nend\n",
/* actions/vstudio/_vstudio.lua */
- "premake.vstudio = { }\nlocal toolsets = {\nvs2010 = \"v100\",\nvs2012 = \"v110\",\nvs2013 = \"v120\",\nvs2015 = \"v140\",\nvs2017 = \"v141\",\nvs2019 = \"v142\",\nvsllvm = \"llvm\",\n}\npremake.vstudio.toolset = toolsets[_ACTION] or \"unknown?\"\npremake.vstudio.splashpath = ''\npremake.vstudio.xpwarning = true\nlocal vstudio = premake.vstudio\nvstudio.platforms = {\nany = \"Any CPU\",\nmixed = \"Mixed Platforms\",\nNative = \"Win32\",\nx86 = \"x86\",\nx32 = \"Win32\",\nx64 = \"x64\",\nPS3 = \"PS3\",\nXbox360 = \"Xbox 360\",\nARM = \"ARM\",\nOrbis = \"ORBIS\",\nDurango = \"Durango\",\nTegraAndroid = \"Tegra-Android\",\nNX32 = \"NX32\",\nNX64 = \"NX64\",\nEmscripten = \"Emscripten\",\n}\nfunction vstudio.arch(prj)\nif (prj.language == \"C#\") then\nreturn \"Any CPU\"\nelse\nreturn \"Win32\"\nend\nend\nfunction vstudio.iswinrt()\nreturn vstudio.storeapp ~= nil and vstudio.storeapp ~= ''\nend\nfunction vstudio.buildconfigs(sln)\nlocal cfgs = { }\nlocal platforms = premake.filter"
- "platforms(sln, vstudio.platforms, \"Native\")\nlocal hascpp = premake.hascppproject(sln)\nlocal hasdotnet = premake.hasdotnetproject(sln)\nif hasdotnet and (_ACTION > \"vs2008\" or hascpp) then\ntable.insert(platforms, 1, \"mixed\")\nend\nif hasdotnet and (_ACTION < \"vs2010\" or not hascpp) then\ntable.insert(platforms, 1, \"any\")\nend\nif _ACTION > \"vs2008\" then\nlocal platforms2010 = { }\nfor _, platform in ipairs(platforms) do\nif vstudio.platforms[platform] == \"Win32\" then\nif hascpp then\ntable.insert(platforms2010, platform)\nend\nif hasdotnet then\ntable.insert(platforms2010, \"x86\")\nend\nelse\ntable.insert(platforms2010, platform)\nend\nend\nplatforms = platforms2010\nend\nfor _, buildcfg in ipairs(sln.configurations) do\nfor _, platform in ipairs(platforms) do\nlocal entry = { }\nentry.src_buildcfg = buildcfg\nentry.src_platform = platform\nif platform ~= \"PS3\" or _ACTION > \"vs2008\" then\nentry.buildcfg = buildcfg\nentry.platform = vstudio.platforms[platform]\nelse\nentry.buildcfg = pla"
- "tform .. \" \" .. buildcfg\nentry.platform = \"Win32\"\nend\nentry.name = entry.buildcfg .. \"|\" .. entry.platform\nentry.isreal = (platform ~= \"any\" and platform ~= \"mixed\")\ntable.insert(cfgs, entry)\nend\nend\nreturn cfgs\nend\nfunction premake.vstudio.bakeimports(sln)\nfor _,iprj in ipairs(sln.importedprojects) do\nif string.find(iprj.location, \".csproj\") ~= nil then\niprj.language = \"C#\"\nelse\niprj.language = \"C++\"\nend\nlocal f, err = io.open(iprj.location, \"r\")\nif (not f) then\nerror(err, 1)\nend\nlocal projcontents = f:read(\"*all\")\nf:close()\nlocal found, _, uuid = string.find(projcontents, \"<ProjectGuid>{([%w%-]+)}</ProjectGuid>\")\nif not found then\nerror(\"Could not find ProjectGuid element in project \" .. iprj.location, 1)\nend\niprj.uuid = uuid\nif iprj.language == \"C++\" and string.find(projcontents, \"<CLRSupport>true</CLRSupport>\") then\niprj.flags.Managed = true\nend\niprj.relpath = path.getrelative(sln.location, iprj.location)\nend\nend\nfunction premake.vstudio.getimpo"
- "rtprj(prjpath, sln)\nfor _,iprj in ipairs(sln.importedprojects) do\nif prjpath == iprj.relpath then\nreturn iprj\nend\nend\nerror(\"Could not find reference import project \" .. prjpath, 1)\nend\nfunction vstudio.cleansolution(sln)\npremake.clean.file(sln, \"%%.sln\")\npremake.clean.file(sln, \"%%.suo\")\npremake.clean.file(sln, \"%%.ncb\")\npremake.clean.file(sln, \"%%.userprefs\")\npremake.clean.file(sln, \"%%.usertasks\")\nend\nfunction vstudio.cleanproject(prj)\nlocal fname = premake.project.getfilename(prj, \"%%\")\nos.remove(fname .. \".vcproj\")\nos.remove(fname .. \".vcproj.user\")\nos.remove(fname .. \".vcxproj\")\nos.remove(fname .. \".vcxproj.user\")\nos.remove(fname .. \".vcxproj.filters\")\nos.remove(fname .. \".csproj\")\nos.remove(fname .. \".csproj.user\")\nos.remove(fname .. \".pidb\")\nos.remove(fname .. \".sdf\")\nend\nfunction vstudio.cleantarget(name)\nos.remove(name .. \".pdb\")\nos.remove(name .. \".idb\")\nos.remove(name .. \".ilk\")\nos.remove(name .. \".vshost.exe\")\nos.remove(name ."
- ". \".exe.manifest\")\nend\nfunction vstudio.projectfile(prj)\nlocal pattern\nif prj.language == \"C#\" then\npattern = \"%%.csproj\"\nelse\npattern = iif(_ACTION > \"vs2008\", \"%%.vcxproj\", \"%%.vcproj\")\nend\nlocal fname = premake.project.getbasename(prj.name, pattern)\nfname = path.join(prj.location, fname)\nreturn fname\nend\nfunction vstudio.tool(prj)\nif (prj.language == \"C#\") then\nreturn \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\"\nelse\nreturn \"8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942\"\nend\nend\n",
+ "premake.vstudio = { }\nlocal toolsets = {\nvs2010 = \"v100\",\nvs2012 = \"v110\",\nvs2013 = \"v120\",\nvs2015 = \"v140\",\nvs2017 = \"v141\",\nvs2019 = \"v142\",\nvs2022 = \"v143\",\nvs2026 = \"v145\",\n}\npremake.vstudio.toolset = toolsets[_ACTION] or \"unknown?\"\npremake.vstudio.splashpath = ''\npremake.vstudio.xpwarning = true\nlocal vstudio = premake.vstudio\nvstudio.platforms = {\nany = \"Any CPU\",\nmixed = \"Mixed Platforms\",\nNative = \"Win32\",\nx86 = \"x86\",\nx32 = \"Win32\",\nx64 = \"x64\",\nPS3 = \"PS3\",\nXbox360 = \"Xbox 360\",\nARM = \"ARM\",\nARM64 = \"ARM64\",\nOrbis = \"ORBIS\",\nDurango = \"Durango\",\nTegraAndroid = \"Tegra-Android\",\nNX32 = \"NX32\",\nNX64 = \"NX64\",\nEmscripten = \"Emscripten\",\n[\"gdk-desktop\"] = \"Gaming.Desktop.x64\",\n[\"gdk-xboxone\"] = \"Gaming.Xbox.XboxOne.x64\",\n[\"gdk-scarlett\"] = \"Gaming.Xbox.Scarlett.x64\",\n}\nfunction vstudi"
+ "o.arch(prj)\nif (prj.language == \"C#\") then\nreturn \"Any CPU\"\nelse\nreturn \"Win32\"\nend\nend\nfunction vstudio.iswinrt()\nreturn vstudio.storeapp ~= nil and vstudio.storeapp ~= ''\nend\nfunction vstudio.isgdkconsole(cfg)\nfor _,p in pairs({\"gdk-xboxone\", \"gdk-scarlett\"}) do\nif cfg.platform == p then\nreturn true\nend\nend\nreturn false\nend\nfunction vstudio.isgdkdesktop(cfg)\nreturn cfg.platform == \"gdk-desktop\"\nend\nfunction vstudio.isgdk(cfg)\nreturn vstudio.isgdkconsole(cfg) or vstudio.isgdkdesktop(cfg)\nend\n \nfunction vstudio.buildconfigs(sln)\nlocal cfgs = { }\nlocal platforms = premake.filterplatforms(sln, vstudio.platforms, \"Native\")\nlocal hascpp = premake.hascppproject(sln)\nlocal hasdotnet = premake.hasdotnetproject(sln)\nif hasdotnet and (_ACTION > \"vs2008\" or hascpp) then\ntable.insert(platforms, 1, \"mixed\")\nend\nif hasdotnet and (_ACTION < \"vs2010\" or not hascpp) then\ntable.insert(platforms, 1, \"any\")\nend\nif _ACTION > \"vs2008\" then\nlocal platforms2010 ="
+ " { }\nfor _, platform in ipairs(platforms) do\nif vstudio.platforms[platform] == \"Win32\" then\nif hascpp then\ntable.insert(platforms2010, platform)\nend\nif hasdotnet then\ntable.insert(platforms2010, \"x86\")\nend\nelse\ntable.insert(platforms2010, platform)\nend\nend\nplatforms = platforms2010\nend\nfor _, buildcfg in ipairs(sln.configurations) do\nfor _, platform in ipairs(platforms) do\nlocal entry = { }\nentry.src_buildcfg = buildcfg\nentry.src_platform = platform\nif platform ~= \"PS3\" or _ACTION > \"vs2008\" then\nentry.buildcfg = buildcfg\nentry.platform = vstudio.platforms[platform]\nelse\nentry.buildcfg = platform .. \" \" .. buildcfg\nentry.platform = \"Win32\"\nend\nentry.name = entry.buildcfg .. \"|\" .. entry.platform\nentry.isreal = (platform ~= \"any\" and platform ~= \"mixed\")\ntable.insert(cfgs, entry)\nend\nend\nreturn cfgs\nend\nfunction premake.vstudio.bakeimports(sln)\nfor _,iprj in ipairs(sln.importedprojects) do\nif string.find(iprj.location, \".csproj\") ~= nil then\niprj.language"
+ " = \"C#\"\nelse\niprj.language = \"C++\"\nend\nlocal f, err = io.open(iprj.location, \"r\")\nif (not f) then\nerror(err, 1)\nend\nlocal projcontents = f:read(\"*all\")\nf:close()\nlocal found, _, uuid = string.find(projcontents, \"<ProjectGuid>{([%w%-]+)}</ProjectGuid>\")\nif not found then\nerror(\"Could not find ProjectGuid element in project \" .. iprj.location, 1)\nend\niprj.uuid = uuid\nif iprj.language == \"C++\" and string.find(projcontents, \"<CLRSupport>true</CLRSupport>\") then\niprj.flags.Managed = true\nend\niprj.relpath = path.getrelative(sln.location, iprj.location)\nend\nend\nfunction premake.vstudio.getimportprj(prjpath, sln)\nfor _,iprj in ipairs(sln.importedprojects) do\nif prjpath == iprj.relpath then\nreturn iprj\nend\nend\nerror(\"Could not find reference import project \" .. prjpath, 1)\nend\nfunction vstudio.cleansolution(sln)\npremake.clean.file(sln, \"%%.sln\")\npremake.clean.file(sln, \"%%.suo\")\npremake.clean.file(sln, \"%%.ncb\")\npremake.clean.file(sln, \"%%.userprefs\")\npremake."
+ "clean.file(sln, \"%%.usertasks\")\nend\nfunction vstudio.cleanproject(prj)\nlocal fname = premake.project.getfilename(prj, \"%%\")\nos.remove(fname .. \".vcproj\")\nos.remove(fname .. \".vcproj.user\")\nos.remove(fname .. \".vcxproj\")\nos.remove(fname .. \".vcxproj.user\")\nos.remove(fname .. \".vcxproj.filters\")\nos.remove(fname .. \".csproj\")\nos.remove(fname .. \".csproj.user\")\nos.remove(fname .. \".pidb\")\nos.remove(fname .. \".sdf\")\nend\nfunction vstudio.cleantarget(name)\nos.remove(name .. \".pdb\")\nos.remove(name .. \".idb\")\nos.remove(name .. \".ilk\")\nos.remove(name .. \".vshost.exe\")\nos.remove(name .. \".exe.manifest\")\nend\nfunction vstudio.projectfile(prj)\nlocal pattern\nif prj.language == \"C#\" then\npattern = \"%%.csproj\"\nelse\npattern = iif(_ACTION > \"vs2008\", \"%%.vcxproj\", \"%%.vcproj\")\nend\nlocal fname = premake.project.getbasename(prj.name, pattern)\nfname = path.join(prj.location, fname)\nreturn fname\nend\nfunction vstudio.tool(prj)\nif (prj.language == \"C#\") then"
+ "\nreturn \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\"\nelse\nreturn \"8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942\"\nend\nend\n",
/* actions/vstudio/vstudio_solution.lua */
- "premake.vstudio.sln2005 = { }\nlocal vstudio = premake.vstudio\nlocal sln2005 = premake.vstudio.sln2005\nfunction sln2005.generate(sln)\nio.eol = '\\r\\n'\nsln.vstudio_configs = premake.vstudio.buildconfigs(sln)\npremake.vstudio.bakeimports(sln)\n_p('\\239\\187\\191')\nsln2005.reorderProjects(sln)\nsln2005.header(sln)\nfor grp in premake.solution.eachgroup(sln) do\nsln2005.group(grp)\nend\nfor prj in premake.solution.eachproject(sln) do\nsln2005.project(prj)\nend\n \nfor _,iprj in ipairs(sln.importedprojects) do\nsln2005.importproject(iprj)\nend\n_p('Global')\nsln2005.platforms(sln)\nsln2005.project_platforms(sln)\nsln2005.properties(sln)\nsln2005.project_groups(sln)\n_p('EndGlobal')\nend\nfunction sln2005.reorderProjects(sln)\nif sln.startproject then\nfor i, prj in ipairs(sln.projects) do\nif sln.startproject == prj.name then\nlocal cur = prj.group\nwhile cur ~= nil do\nfor j, group in ipairs(sln.groups) do\nif group == cur then\ntable.remove(sln.groups, j)\nbreak\nend\nend\ntable.insert(sln.groups, 1"
- ", cur)\ncur = cur.parent\nend\ntable.remove(sln.projects, i)\ntable.insert(sln.projects, 1, prj)\nbreak\nend\nend\nend\nend\nfunction sln2005.header(sln)\nlocal action = premake.action.current()\n_p('Microsoft Visual Studio Solution File, Format Version %d.00', action.vstudio.solutionVersion)\nif(_ACTION:sub(3) == \"2015\" or _ACTION:sub(3) == \"2017\" or _ACTION:sub(3) == \"llvm\") then\n_p('# Visual Studio %s', action.vstudio.toolsVersion:sub(1,2))\nelse\n_p('# Visual Studio %s', _ACTION:sub(3))\nend\nend\nfunction sln2005.project(prj)\nlocal projpath = path.translate(path.getrelative(prj.solution.location, vstudio.projectfile(prj)), \"\\\\\")\n_p('Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"', vstudio.tool(prj), prj.name, projpath, prj.uuid)\nsln2005.projectdependencies(prj)\n_p('EndProject')\nend\nfunction sln2005.group(grp)\n_p('Project(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"%s\", \"%s\", \"{%s}\"', grp.name, grp.name, grp.uuid)\n_p('EndProject')\nend\n \nfunction sln2005.importproject(iprj)"
- "\n_p('Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"', vstudio.tool(iprj), path.getbasename(iprj.location), iprj.relpath, iprj.uuid)\n_p('EndProject')\nend\nfunction sln2005.projectdependencies(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\nlocal function compareuuid(a, b) return a.uuid < b.uuid end\ntable.sort(deps, compareuuid)\n_p('\\tProjectSection(ProjectDependencies) = postProject')\nfor _, dep in ipairs(deps) do\n_p('\\t\\t{%s} = {%s}', dep.uuid, dep.uuid)\nend\n_p('\\tEndProjectSection')\nend\nend\nfunction sln2005.platforms(sln)\n_p('\\tGlobalSection(SolutionConfigurationPlatforms) = preSolution')\nfor _, cfg in ipairs(sln.vstudio_configs) do\n_p('\\t\\t%s = %s', cfg.name, cfg.name)\nend\n_p('\\tEndGlobalSection')\nend\nfunction sln2005.project_platform(prj, sln)\nfor _, cfg in ipairs(sln.vstudio_configs) do\nlocal mapped\nlocal buildfor\nif premake.isdotnetproject(prj) then\nbuildfor = \"x64\"\nmapped = \"Any CPU\"\nelseif prj.flags and prj.flags.Managed then\nmapped = \"x64\"\nels"
- "e\nif cfg.platform == \"Any CPU\" or cfg.platform == \"Mixed Platforms\" then\nmapped = sln.vstudio_configs[3].platform\nelse\nmapped = cfg.platform\nend\nend\nlocal build_project = true\nif prj.solution ~= nil then\n build_project = premake.getconfig(prj, cfg.src_buildcfg, cfg.src_platform).build\nend\n_p('\\t\\t{%s}.%s.ActiveCfg = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)\nif build_project then\n if mapped == cfg.platform or cfg.platform == \"Mixed Platforms\" or buildfor == cfg.platform then\n _p('\\t\\t{%s}.%s.Build.0 = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)\n end\n if premake.vstudio.iswinrt() and prj.kind == \"WindowedApp\" then\n _p('\\t\\t{%s}.%s.Deploy.0 = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)\n end\nend\nend\nend\nfunction sln2005.project_platforms(sln)\n_p('\\tGlobalSection(ProjectConfigurationPlatforms) = postSolution')\nfor prj in premake.solution.eachproject(sln) do\nsln2005.project_platform(prj, sln)\nend\nfor _,iprj in ipairs(sln.imported"
- "projects) do\nsln2005.project_platform(iprj, sln)\nend\n_p('\\tEndGlobalSection')\nend\nfunction sln2005.properties(sln)\n_p('\\tGlobalSection(SolutionProperties) = preSolution')\n_p('\\t\\tHideSolutionNode = FALSE')\n_p('\\tEndGlobalSection')\nend\nfunction sln2005.project_groups(sln)\n_p('\\tGlobalSection(NestedProjects) = preSolution')\nfor grp in premake.solution.eachgroup(sln) do\nif grp.parent ~= nil then\n_p('\\t\\t{%s} = {%s}', grp.uuid, grp.parent.uuid)\nend\nend\nfor prj in premake.solution.eachproject(sln) do\nif prj.group ~= nil then\n_p('\\t\\t{%s} = {%s}', prj.uuid, prj.group.uuid)\nend\nend\nfor _,iprj in ipairs(sln.importedprojects) do\nif iprj.group ~= nil then\n_p('\\t\\t{%s} = {%s}', iprj.uuid, iprj.group.uuid)\nend\nend\n \n_p('\\tEndGlobalSection')\nend",
+ "premake.vstudio.sln2005 = { }\nlocal vstudio = premake.vstudio\nlocal sln2005 = premake.vstudio.sln2005\nfunction sln2005.generate(sln)\nio.eol = '\\r\\n'\nsln.vstudio_configs = premake.vstudio.buildconfigs(sln)\npremake.vstudio.bakeimports(sln)\n_p('\\239\\187\\191')\nsln2005.reorderProjects(sln)\nsln2005.header(sln)\n_p('# Generated by GENie https://github.com/bkaradzic/GENie')\nfor grp in premake.solution.eachgroup(sln) do\nsln2005.group(grp)\nend\nfor prj in premake.solution.eachproject(sln) do\nsln2005.project(prj)\nend\nfor _,iprj in ipairs(sln.importedprojects) do\nsln2005.importproject(iprj)\nend\n_p('Global')\nsln2005.platforms(sln)\nsln2005.project_platforms(sln)\nsln2005.properties(sln)\nsln2005.project_groups(sln)\n_p('EndGlobal')\nend\nfunction sln2005.reorderProjects(sln)\nif sln.startproject then\nfor i, prj in ipairs(sln.projects) do\nif sln.startproject == prj.name then\nlocal cur = prj.group\nwhile cur ~= nil do\nfor j, group in ipairs(sln.groups) do\nif group == cur then\ntable.remove(sln.gr"
+ "oups, j)\nbreak\nend\nend\ntable.insert(sln.groups, 1, cur)\ncur = cur.parent\nend\ntable.remove(sln.projects, i)\ntable.insert(sln.projects, 1, prj)\nbreak\nend\nend\nend\nend\nfunction sln2005.header(sln)\nlocal action = premake.action.current()\n_p('Microsoft Visual Studio Solution File, Format Version %d.00', action.vstudio.solutionVersion)\nif(_ACTION:sub(3) == \"2015\" or _ACTION:sub(3) == \"2017\") then\n_p('# Visual Studio %s', action.vstudio.toolsVersion:sub(1,2))\nelseif(_ACTION:sub(3) == \"2019\") then\n_p('# Visual Studio Version %s', action.vstudio.toolsVersion:sub(1,2))\nelse\n_p('# Visual Studio %s', _ACTION:sub(3))\nend\nend\nfunction sln2005.project(prj)\nlocal projpath = path.translate(path.getrelative(prj.solution.location, vstudio.projectfile(prj)), \"\\\\\")\n_p('Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"', vstudio.tool(prj), prj.name, projpath, prj.uuid)\nsln2005.projectdependencies(prj)\n_p('EndProject')\nend\nfunction sln2005.group(grp)\n_p('Project(\"{2150E333-8FDC-42A3-9474-1A3956D"
+ "46DE8}\") = \"%s\", \"%s\", \"{%s}\"', grp.name, grp.name, grp.uuid)\n_p('EndProject')\nend\nfunction sln2005.importproject(iprj)\n_p('Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"', vstudio.tool(iprj), path.getbasename(iprj.location), iprj.relpath, iprj.uuid)\n_p('EndProject')\nend\nfunction sln2005.projectdependencies(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\nlocal function compareuuid(a, b) return a.uuid < b.uuid end\ntable.sort(deps, compareuuid)\n_p('\\tProjectSection(ProjectDependencies) = postProject')\nfor _, dep in ipairs(deps) do\n_p('\\t\\t{%s} = {%s}', dep.uuid, dep.uuid)\nend\n_p('\\tEndProjectSection')\nend\nend\nfunction sln2005.platforms(sln)\n_p('\\tGlobalSection(SolutionConfigurationPlatforms) = preSolution')\nfor _, cfg in ipairs(sln.vstudio_configs) do\n_p('\\t\\t%s = %s', cfg.name, cfg.name)\nend\n_p('\\tEndGlobalSection')\nend\nfunction sln2005.project_platform(prj, sln)\nfor _, cfg in ipairs(sln.vstudio_configs) do\nlocal mapped\nlocal buildfor\nif premake.isdotn"
+ "etproject(prj) then\nbuildfor = \"x64\"\nmapped = \"Any CPU\"\nelseif prj.flags and prj.flags.Managed then\nmapped = \"x64\"\nelse\nif cfg.platform == \"Any CPU\" or cfg.platform == \"Mixed Platforms\" then\nmapped = sln.vstudio_configs[3].platform\nelse\nmapped = cfg.platform\nend\nend\nlocal build_project = true\nif prj.solution ~= nil then\n build_project = premake.getconfig(prj, cfg.src_buildcfg, cfg.src_platform).build\nend\n_p('\\t\\t{%s}.%s.ActiveCfg = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)\nif build_project then\n if mapped == cfg.platform or cfg.platform == \"Mixed Platforms\" or buildfor == cfg.platform then\n _p('\\t\\t{%s}.%s.Build.0 = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)\n end\n if premake.vstudio.iswinrt() and prj.kind == \"WindowedApp\" then\n _p('\\t\\t{%s}.%s.Deploy.0 = %s|%s', prj.uuid, cfg.name, cfg.buildcfg, mapped)\n end\n if premake.vstudio.isgdk(cfg) and prj.kind == \"WindowedApp\" then\n _p('\\t\\t{%s}.%s.Deploy.0 = %s|%s', prj.uu"
+ "id, cfg.name, cfg.buildcfg, mapped)\n end\nend\nend\nend\nfunction sln2005.project_platforms(sln)\n_p('\\tGlobalSection(ProjectConfigurationPlatforms) = postSolution')\nfor prj in premake.solution.eachproject(sln) do\nsln2005.project_platform(prj, sln)\nend\nfor _,iprj in ipairs(sln.importedprojects) do\nsln2005.project_platform(iprj, sln)\nend\n_p('\\tEndGlobalSection')\nend\nfunction sln2005.properties(sln)\n_p('\\tGlobalSection(SolutionProperties) = preSolution')\n_p('\\t\\tHideSolutionNode = FALSE')\n_p('\\tEndGlobalSection')\nend\nfunction sln2005.project_groups(sln)\n_p('\\tGlobalSection(NestedProjects) = preSolution')\nfor grp in premake.solution.eachgroup(sln) do\nif grp.parent ~= nil then\n_p('\\t\\t{%s} = {%s}', grp.uuid, grp.parent.uuid)\nend\nend\nfor prj in premake.solution.eachproject(sln) do\nif prj.group ~= nil then\n_p('\\t\\t{%s} = {%s}', prj.uuid, prj.group.uuid)\nend\nend\nfor _,iprj in ipairs(sln.importedprojects) do\nif iprj.group ~= nil then\n_p('\\t\\t{%s} = {%s}', iprj.uuid, iprj.gr"
+ "oup.uuid)\nend\nend\n_p('\\tEndGlobalSection')\nend\n",
+
+ /* actions/vstudio/vstudio_slnx.lua */
+ "premake.vstudio.slnx = {}\nlocal vstudio = premake.vstudio\nlocal slnx = premake.vstudio.slnx\nfunction slnx.generate(sln)\n io.eol = '\\r\\n'\n -- Precompute Visual Studio configurations\n sln.vstudio_configs = premake.vstudio.buildconfigs(sln)\n -- Prepare imported projects\n premake.vstudio.bakeimports(sln)\n -- Mark the file as Unicode\n _p('\\239\\187\\191')\n -- Write out solution file\n _p('<!-- Generated by GENie https://github.com/bkaradzic/GENie -->')\n _p('<Solution>')\n slnx.configurations(sln)\n for group in premake.solution.eachgroup(sln) do\n if #group.projects > 0 then\n slnx.group(group)\n end\n end\n for prj in premake.solution.eachproject(sln) do\n if prj.group == nil then\n slnx.project(prj)\n end\n end\n _p('</Solution>')\nend\nfunction slnx.group(group)\n local folderName = group.name .. \"/\"\n local groupParent = group.parent\n while groupParent ~= nil do\n folderName = grou"
+ "pParent.name .. \"/\" .. folderName\n groupParent = groupParent.parent\n end\n _p(' <Folder Name=\"/%s\">', folderName)\n for _, prj in ipairs(group.projects) do\n slnx.project(prj)\n end\n _p(' </Folder>')\nend\nfunction slnx.project(prj)\n -- Build a relative path from the solution file to the project file\n local projpath = path.translate(\n path.getrelative(prj.solution.location, vstudio.projectfile(prj)), \"\\\\\")\n local indent = ' '\n if prj.group ~= nil then\n indent = ' '\n end\n _p('%s<Project Path=\"%s\" Id=\"%s\" />', indent, projpath, prj.uuid)\nend\nfunction slnx.configurations(sln)\n local platforms = {}\n for _, cfg in ipairs(sln.vstudio_configs) do\n local platform = cfg.platform\n if platform == \"Any CPU\" or platform == \"Mixed Platforms\" then\n if not table.contains(platforms, \"Any CPU\") then\n table.insert(platforms, \"Any CPU\")\n end\n else\n if n"
+ "ot table.contains(platforms, platform) then\n table.insert(platforms, platform)\n end\n end\n end\n for prj in premake.solution.eachproject(sln) do\n if premake.isdotnetproject(prj) then\n if not table.contains(platforms, \"Any CPU\") then\n table.insert(platforms, \"Any CPU\")\n end\n end\n end\n table.sort(platforms)\n _p(' <Configurations>')\n for _, platform in ipairs(platforms) do\n _p(' <Platform Name=\"%s\" />', platform)\n end\n _p(' </Configurations>')\nend\n",
/* actions/vstudio/vstudio_vcxproj.lua */
"premake.vstudio.vc2010 = { }\nlocal vc2010 = premake.vstudio.vc2010\nlocal vstudio = premake.vstudio\nlocal function vs2010_config(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nif cfginfo.src_platform == \"TegraAndroid\" then\n_p(1,'<PropertyGroup Label=\"NsightTegraProject\">')\n_p(2,'<NsightTegraProjectRevisionNumber>11</NsightTegraProjectRevisionNumber>')\n_p(1,'</PropertyGroup>')\nbreak\nend\nend\n_p(1,'<ItemGroup Label=\"ProjectConfigurations\">')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\n_p(2,'<ProjectConfiguration Include=\"%s\">', premake.esc(cfginfo.name))\n_p(3,'<Configuration>%s</Configuration>',cfginfo.buildcfg)\n_p(3,'<Platform>%s</Platform>',cfginfo.platform)\n_p(2,'</ProjectConfiguration>')\nend\n_p(1,'</ItemGroup>')\nend\nlocal function vs2010_globals(prj)\nlocal action = premake.action.current()\n_p(1,'<PropertyGroup Label=\"Globals\">')\n_p(2, '<ProjectGuid>{%s}</ProjectGuid>',prj.uuid)\n_p(2, '<RootNamespace>%s</RootNamespace>',prj.name)\nif vstudio.store"
"app ~= \"durango\" then\nlocal windowsTargetPlatformVersion = prj.windowstargetplatformversion or action.vstudio.windowsTargetPlatformVersion\nif windowsTargetPlatformVersion ~= nil then\n_p(2,'<WindowsTargetPlatformVersion>%s</WindowsTargetPlatformVersion>',windowsTargetPlatformVersion)\nif windowsTargetPlatformVersion and string.startswith(windowsTargetPlatformVersion, \"10.\") then\n_p(2,'<WindowsTargetPlatformMinVersion>%s</WindowsTargetPlatformMinVersion>', prj.windowstargetplatformminversion or \"10.0.10240.0\")\nend\nend\nend\nif prj.flags and prj.flags.Managed then\nlocal frameworkVersion = prj.framework or \"4.0\"\n_p(2, '<TargetFrameworkVersion>v%s</TargetFrameworkVersion>', frameworkVersion)\n_p(2, '<Keyword>ManagedCProj</Keyword>')\nelseif vstudio.iswinrt() then\n_p(2, '<DefaultLanguage>en-US</DefaultLanguage>')\nif vstudio.storeapp == \"durango\" then\n_p(2, '<Keyword>Win32Proj</Keyword>')\n_p(2, '<ApplicationEnvironment>title</ApplicationEnvironment>')\n_p(2, '<MinimumVisualStudioVersion>14.0</Mi"
- "nimumVisualStudioVersion>')\n_p(2, '<TargetRuntime>Native</TargetRuntime>')\nelse\n_p(2, '<AppContainerApplication>true</AppContainerApplication>')\n_p(2, '<MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>')\n_p(2, '<ApplicationType>Windows Store</ApplicationType>')\n_p(2, '<ApplicationTypeRevision>%s</ApplicationTypeRevision>', vstudio.storeapp)\nend\nelse\n_p(2, '<Keyword>Win32Proj</Keyword>')\nend\nif _ACTION:sub(3) == \"2015\" or _ACTION:sub(3) == \"2017\" or _ACTION:sub(3) == \"2019\" or _ACTION:sub(3) == \"llvm\" then\n_p(2,'<PreferredToolArchitecture>x64</PreferredToolArchitecture>')\nend\nif (_ACTION:sub(3) == \"2017\" or _ACTION:sub(3) == \"llvm\")\nand os.isdir(path.join(os.getenv(\"VSINSTALLDIR\"), \"VC/Tools/MSVC/14.14.26428\")) then\n_p(2,'<VCToolsVersion>14.14.26428</VCToolsVersion>')\nend\nif not vstudio.xpwarning then\n_p(2, '<XPDeprecationWarning>false</XPDeprecationWarning>')\nend\n_p(1,'</PropertyGroup>')\nend\nfunction vc2010.config_type(config)\nlocal t =\n{\nSharedLib = \"Dyna"
- "micLibrary\",\nStaticLib = \"StaticLibrary\",\nConsoleApp = \"Application\",\nWindowedApp = \"Application\"\n}\nreturn t[config.kind]\nend\nlocal function if_config_and_platform()\nreturn 'Condition=\"\\'$(Configuration)|$(Platform)\\'==\\'%s\\'\"'\nend\nlocal function optimisation(cfg)\nlocal result = \"Disabled\"\nfor _, value in ipairs(cfg.flags) do\nif (value == \"Optimize\") then\nresult = \"Full\"\nelseif (value == \"OptimizeSize\") then\nresult = \"MinSpace\"\nelseif (value == \"OptimizeSpeed\") then\nresult = \"MaxSpeed\"\nend\nend\nreturn result\nend\nfunction vc2010.configurationPropertyGroup(cfg, cfginfo)\n_p(1, '<PropertyGroup '..if_config_and_platform() ..' Label=\"Configuration\">'\n, premake.esc(cfginfo.name))\nlocal is2019 = premake.action.current() == premake.action.get(\"vs2019\")\nif is2019 then\n _p(2, '<VCProjectVersion>%s</VCProjectVersion>', action.vstudio.toolsVersion)\nif cfg.flags.UnitySupport then\n _p(2, '<EnableUnitySupport>true</EnableUnitySupport>')\nend\nend\n_p(2, '<Confi"
- "gurationType>%s</ConfigurationType>', vc2010.config_type(cfg))\n_p(2, '<UseDebugLibraries>%s</UseDebugLibraries>', iif(optimisation(cfg) == \"Disabled\",\"true\",\"false\"))\n_p(2, '<PlatformToolset>%s</PlatformToolset>', premake.vstudio.toolset)\nif os.is64bit() then\n_p(2, '<PreferredToolArchitecture>x64</PreferredToolArchitecture>')\nend\nif cfg.flags.MFC then\n_p(2,'<UseOfMfc>%s</UseOfMfc>', iif(cfg.flags.StaticRuntime, \"Static\", \"Dynamic\"))\nend\nif cfg.flags.ATL or cfg.flags.StaticATL then\n_p(2,'<UseOfAtl>%s</UseOfAtl>', iif(cfg.flags.StaticATL, \"Static\", \"Dynamic\"))\nend\nif cfg.flags.Unicode then\n_p(2,'<CharacterSet>Unicode</CharacterSet>')\nend\nif cfg.flags.Managed then\n_p(2,'<CLRSupport>true</CLRSupport>')\nend\nif cfg.platform == \"TegraAndroid\" then\nif cfg.androidtargetapi then\n_p(2,'<AndroidTargetAPI>android-%s</AndroidTargetAPI>', cfg.androidtargetapi)\nend\nif cfg.androidminapi then\n_p(2,'<AndroidMinAPI>android-%s</AndroidMinAPI>', cfg.androidminapi)\nend\nif cfg.androidarch "
- "then\n_p(2,'<AndroidArch>%s</AndroidArch>', cfg.androidarch)\nend\nif cfg.androidndktoolchainversion then\n_p(2,'<NdkToolchainVersion>%s</NdkToolchainVersion>', cfg.androidndktoolchainversion)\nend\nif cfg.androidstltype then\n_p(2,'<AndroidStlType>%s</AndroidStlType>', cfg.androidstltype)\nend\nend\nif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\n_p(2,'<NintendoSdkRoot>$(NINTENDO_SDK_ROOT)\\\\</NintendoSdkRoot>')\n_p(2,'<NintendoSdkSpec>NX</NintendoSdkSpec>')\nif premake.config.isdebugbuild(cfg) then\n_p(2,'<NintendoSdkBuildType>Debug</NintendoSdkBuildType>')\nelse\n_p(2,'<NintendoSdkBuildType>Release</NintendoSdkBuildType>')\nend\nend\nif cfg.flags.Symbols and (premake.action.current() == premake.action.get(\"vs2017\") or is2019) then\n_p(2, '<DebugSymbols>true</DebugSymbols>')\nend\n_p(1,'</PropertyGroup>')\nend\nlocal function import_props(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,'<Imp"
- "ortGroup '..if_config_and_platform() ..' Label=\"PropertySheets\">'\n,premake.esc(cfginfo.name))\n_p(2,'<Import Project=\"$(UserRootDir)\\\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists(\\'$(UserRootDir)\\\\Microsoft.Cpp.$(Platform).user.props\\')\" Label=\"LocalAppDataPlatform\" />')\nif #cfg.propertysheets > 0 then\nlocal dirs = cfg.propertysheets\nfor _, dir in ipairs(dirs) do\n_p(2,'<Import Project=\"%s\" />', path.translate(dir))\nend\nend\n_p(1,'</ImportGroup>')\nend\nend\nlocal function add_trailing_backslash(dir)\nif dir:len() > 0 and dir:sub(-1) ~= \"\\\\\" then\nreturn dir..\"\\\\\"\nend\nreturn dir\nend\nfunction vc2010.outputProperties(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nlocal target = cfg.buildtarget\nlocal outdir = add_trailing_backslash(target.directory)\nlocal intdir = add_trailing_backslash(iif(action.vstudio.intDirAbsolute\n, path.translate(\n path.join(prj.solution.locati"
- "on, cfg.objectsdir)\n, '\\\\')\n, cfg.objectsdir\n))\n_p(1,'<PropertyGroup '..if_config_and_platform() ..'>', premake.esc(cfginfo.name))\n_p(2,'<OutDir>%s</OutDir>', iif(outdir:len() > 0, premake.esc(outdir), \".\\\\\"))\nif cfg.platform == \"Xbox360\" then\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>', premake.esc(target.name))\nend\n_p(2,'<IntDir>%s</IntDir>', premake.esc(intdir))\n_p(2,'<TargetName>%s</TargetName>', premake.esc(path.getbasename(target.name)))\n_p(2,'<TargetExt>%s</TargetExt>', premake.esc(path.getextension(target.name)))\nif cfg.kind == \"SharedLib\" then\nlocal ignore = (cfg.flags.NoImportLib ~= nil)\n_p(2,'<IgnoreImportLibrary>%s</IgnoreImportLibrary>', tostring(ignore))\nend\nif cfg.platform == \"Durango\" then\n_p(2, '<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>')\n_p(2, '<LibraryPath>$(Console_SdkLibPath)</LibraryPath>')\n_p(2, '<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>')\n_p(2, '<IncludePath>$(Console_"
- "SdkIncludeRoot)</IncludePath>')\n_p(2, '<ExecutablePath>$(Console_SdkRoot)bin;$(VCInstallDir)bin\\\\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\\\\Tools\\\\bin;$(VSInstallDir)Common7\\\\tools;$(VSInstallDir)Common7\\\\ide;$(ProgramFiles)\\\\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH);</ExecutablePath>')\nif cfg.imagepath then\n_p(2, '<LayoutDir>%s</LayoutDir>', cfg.imagepath)\nelse\n_p(2, '<LayoutDir>%s</LayoutDir>', prj.name)\nend\nif cfg.pullmappingfile ~= nil then\n_p(2,'<PullMappingFile>%s</PullMappingFile>', premake.esc(cfg.pullmappingfile))\nend\n_p(2, '<LayoutExtensionFilter>*.pdb;*.ilk;*.exp;*.lib;*.winmd;*.appxrecipe;*.pri;*.idb</LayoutExtensionFilter>')\n_p(2, '<IsolateConfigurationsOnDeploy>true</IsolateConfigurationsOnDeploy>')\nend\nif cfg.kind ~= \"StaticLib\" then\n_p(2,'<LinkIncremental>%s</LinkIncremental>', tostring(premake.config.isincrementallink(cfg)))\nend\nif cfg.applicationdatadir ~= nil then\n_p(2,'<ApplicationDataDir>%s</Applic"
- "ationDataDir>', premake.esc(cfg.applicationdatadir))\nend\nif cfg.flags.NoManifest then\n_p(2,'<GenerateManifest>false</GenerateManifest>')\nend\n_p(1,'</PropertyGroup>')\nend\nend\nlocal function runtime(cfg)\nlocal runtime\nlocal flags = cfg.flags\nif premake.config.isdebugbuild(cfg) then\nruntime = iif(flags.StaticRuntime and not flags.Managed, \"MultiThreadedDebug\", \"MultiThreadedDebugDLL\")\nelse\nruntime = iif(flags.StaticRuntime and not flags.Managed, \"MultiThreaded\", \"MultiThreadedDLL\")\nend\nreturn runtime\nend\nlocal function precompiled_header(cfg)\n if not cfg.flags.NoPCH and cfg.pchheader then\n_p(3,'<PrecompiledHeader>Use</PrecompiledHeader>')\n_p(3,'<PrecompiledHeaderFile>%s</PrecompiledHeaderFile>', cfg.pchheader)\nelse\n_p(3,'<PrecompiledHeader></PrecompiledHeader>')\nend\nend\nlocal function preprocessor(indent,cfg,escape)\nif #cfg.defines > 0 then\nlocal defines = table.concat(cfg.defines, \";\")\nif escape then\ndefines = defines:gsub('\"', '\\\\\"')\nend\nlocal isPreprocessorDef"
- "initionPresent = string.find(defines, \"%%%(PreprocessorDefinitions%)\")\nif isPreprocessorDefinitionPresent then\n_p(indent,'<PreprocessorDefinitions>%s</PreprocessorDefinitions>'\n,premake.esc(defines))\nelse\n_p(indent,'<PreprocessorDefinitions>%s;%%(PreprocessorDefinitions)</PreprocessorDefinitions>'\n,premake.esc(defines))\nend\nelse\n_p(indent,'<PreprocessorDefinitions></PreprocessorDefinitions>')\nend\nend\nlocal function include_dirs(indent,cfg)\nlocal includedirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systemincludedirs)\nif #includedirs> 0 then\n_p(indent,'<AdditionalIncludeDirectories>%s;%%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>'\n,premake.esc(path.translate(table.concat(includedirs, \";\"), '\\\\')))\nend\nend\nlocal function using_dirs(indent,cfg)\nif #cfg.usingdirs > 0 then\n_p(indent,'<AdditionalUsingDirectories>%s;%%(AdditionalUsingDirectories)</AdditionalUsingDirectories>'\n,premake.esc(path.translate(table.concat(cfg.usingdirs, \";\"), '\\\\')))\nend\nend"
- "\nlocal function resource_compile(cfg)\n_p(2,'<ResourceCompile>')\npreprocessor(3,cfg,true)\ninclude_dirs(3,cfg)\n_p(2,'</ResourceCompile>')\nend\nlocal function cppstandard_vs2017_or_2019(cfg)\nif cfg.flags.CppLatest then\n_p(3, '<LanguageStandard>stdcpplatest</LanguageStandard>')\n_p(3, '<EnableModules>true</EnableModules>')\nelseif cfg.flags.Cpp17 then\n_p(3, '<LanguageStandard>stdcpp17</LanguageStandard>')\nelseif cfg.flags.Cpp14 then\n_p(3, '<LanguageStandard>stdcpp14</LanguageStandard>')\nend\nend\nlocal function exceptions(cfg)\nif cfg.platform == \"Orbis\" then\nif cfg.flags.NoExceptions then\n_p(3, '<CppExceptions>false</CppExceptions>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nif cfg.flags.NoExceptions then\n_p(3, '<GccExceptionHandling>false</GccExceptionHandling>')\nend\nelse\nif cfg.flags.NoExceptions then\n_p(3, '<ExceptionHandling>false</ExceptionHandling>')\nelseif cfg.flags.SEH then\n_p(3, '<ExceptionHandling>Async</ExceptionHandling>')\nend\nend\nend\nlocal function rtti(cfg)\nif c"
- "fg.flags.NoRTTI and not cfg.flags.Managed then\n_p(3,'<RuntimeTypeInfo>false</RuntimeTypeInfo>')\nend\nend\nlocal function calling_convention(cfg)\nif cfg.flags.FastCall then\n_p(3,'<CallingConvention>FastCall</CallingConvention>')\nelseif cfg.flags.StdCall then\n_p(3,'<CallingConvention>StdCall</CallingConvention>')\nend\nend\nlocal function wchar_t_builtin(cfg)\nif cfg.flags.NativeWChar then\n_p(3,'<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>')\nelseif cfg.flags.NoNativeWChar then\n_p(3,'<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>')\nend\nend\nlocal function sse(cfg)\nif cfg.flags.EnableSSE then\n_p(3, '<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableSSE2 then\n_p(3, '<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableAVX then\n_p(3, '<EnableEnhancedInstructionSet>AdvancedVectorExtensions</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableAVX2 then"
- "\n_p(3, '<EnableEnhancedInstructionSet>AdvancedVectorExtensions2</EnableEnhancedInstructionSet>')\nend\nend\nlocal function floating_point(cfg)\nif cfg.platform == \"Orbis\" then\nif cfg.flags.FloatFast then\n_p(3,'<FastMath>true</FastMath>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nelse\nif cfg.flags.FloatFast then\n_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')\nelseif cfg.flags.FloatStrict and not cfg.flags.Managed then\n_p(3,'<FloatingPointModel>Strict</FloatingPointModel>')\nend\nend\nend\nlocal function debug_info(cfg)\nlocal debug_info = ''\nif cfg.flags.Symbols then\nif cfg.flags.C7DebugInfo then\ndebug_info = \"OldStyle\"\nelseif (action.vstudio.supports64bitEditContinue == false and cfg.platform == \"x64\")\nor not premake.config.iseditandcontinue(cfg)\nthen\ndebug_info = \"ProgramDatabase\"\nelse\ndebug_info = \"EditAndContinue\"\nend\nend\n_p(3,'<DebugInformationFormat>%s</DebugInformationFormat>',debug_info)\nend\nlocal function minimal_build(cfg)\nif premake.config.isdebugbuild("
- "cfg) and cfg.flags.EnableMinimalRebuild then\n_p(3,'<MinimalRebuild>true</MinimalRebuild>')\nelse\n_p(3,'<MinimalRebuild>false</MinimalRebuild>')\nend\nend\nlocal function compile_language(cfg)\nif cfg.options.ForceCPP then\n_p(3,'<CompileAs>CompileAsCpp</CompileAs>')\nelse\nif cfg.language == \"C\" then\n_p(3,'<CompileAs>CompileAsC</CompileAs>')\nend\nend\nend\nlocal function forcedinclude_files(indent,cfg)\nif #cfg.forcedincludes > 0 then\n_p(indent,'<ForcedIncludeFiles>%s</ForcedIncludeFiles>'\n,premake.esc(path.translate(table.concat(cfg.forcedincludes, \";\"), '\\\\')))\nend\nend\nlocal function vs10_clcompile(cfg)\n_p(2,'<ClCompile>')\nlocal unsignedChar = \"/J \"\nlocal buildoptions = cfg.buildoptions\nif cfg.platform == \"Orbis\" then\nunsignedChar = \"-funsigned-char \";\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nend\nif cfg.language == \"C\" and not cfg.options.ForceCPP then\nbuildoptions = table.join(buildoptions, cfg.buildoptions_c)\nelse\n"
- "buildoptions = table.join(buildoptions, cfg.buildoptions_cpp)\nend\n_p(3,'<AdditionalOptions>%s %s%%(AdditionalOptions)</AdditionalOptions>'\n, table.concat(premake.esc(buildoptions), \" \")\n, iif(cfg.flags.UnsignedChar and cfg.platform ~= \"TegraAndroid\", unsignedChar, \" \")\n)\nif cfg.platform == \"TegraAndroid\" then\n_p(3,'<SignedChar>%s</SignedChar>', tostring(cfg.flags.UnsignedChar == nil))\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nif cfg.androidcppstandard then\n_p(3,'<CppLanguageStandard>%s</CppLanguageStandard>', cfg.androidcppstandard)\nend\nend\nif cfg.platform == \"Orbis\" then\nlocal opt = optimisation(cfg)\nif opt == \"Disabled\" then\n_p(3,'<OptimizationLevel>Level0</OptimizationLevel>')\nelseif opt == \"MinSpace\" then\n_p(3,'<OptimizationLevel>Levelz</OptimizationLevel>') -- Oz is more aggressive than Os\nelseif opt == \"MaxSpeed\" then\n_p(3,'<OptimizationLevel>Level3</OptimizationLevel>')\nelse\n_p(3,'<OptimizationLevel>Level2</O"
- "ptimizationLevel>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nlocal opt = optimisation(cfg)\nif opt == \"Disabled\" then\n_p(3,'<OptimizationLevel>O0</OptimizationLevel>')\nelseif opt == \"MinSpace\" then\n_p(3,'<OptimizationLevel>Os</OptimizationLevel>')\nelseif opt == \"MaxSpeed\" then\n_p(3,'<OptimizationLevel>O3</OptimizationLevel>')\nelse\n_p(3,'<OptimizationLevel>O2</OptimizationLevel>')\nend\nelse\n_p(3,'<Optimization>%s</Optimization>', optimisation(cfg))\nend\ninclude_dirs(3, cfg)\nusing_dirs(3, cfg)\npreprocessor(3, cfg)\nminimal_build(cfg)\nif premake.config.isoptimizedbuild(cfg.flags) then\nif cfg.flags.NoOptimizeLink and cfg.flags.NoEditAndContinue then\n_p(3, '<StringPooling>false</StringPooling>')\n_p(3, '<FunctionLevelLinking>false</FunctionLevelLinking>')\nelse\n_p(3, '<StringPooling>true</StringPooling>')\n_p(3, '<FunctionLevelLinking>true</FunctionLevelLinking>')\nend\nelse\n_p(3, '<FunctionLevelLinking>true</FunctionLevelLinking>')\nif cfg.flags.NoRuntimeChecks then\n_p(3, '<Basic"
- "RuntimeChecks>Default</BasicRuntimeChecks>')\nelseif not cfg.flags.Managed then\n_p(3, '<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>')\nend\nif cfg.flags.ExtraWarnings then\nend\nend\nif cfg.platform == \"Durango\" or cfg.flags.NoWinRT then\n_p(3, '<CompileAsWinRT>false</CompileAsWinRT>')\nend\n_p(3, '<RuntimeLibrary>%s</RuntimeLibrary>', runtime(cfg))\nif cfg.flags.NoBufferSecurityCheck then\n_p(3, '<BufferSecurityCheck>false</BufferSecurityCheck>')\nend\nif not cfg.flags.NoMultiProcessorCompilation and not cfg.flags.EnableMinimalRebuild then\n_p(3, '<MultiProcessorCompilation>true</MultiProcessorCompilation>')\nelse\n_p(3, '<MultiProcessorCompilation>false</MultiProcessorCompilation>')\nend\nprecompiled_header(cfg)\nif cfg.platform == \"Orbis\" then\nif cfg.flags.PedanticWarnings then\n_p(3, '<Warnings>MoreWarnings</Warnings>')\n_p(3, '<ExtraWarnings>true</ExtraWarnings>')\nelseif cfg.flags.ExtraWarnings then\n_p(3, '<Warnings>NormalWarnings</Warnings>')\n_p(3, '<ExtraWarnings>true</ExtraWarning"
- "s>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<Warnings>WarningsOff</Warnings>')\n_p(3, '<ExtraWarnings>false</ExtraWarnings>')\nelse\n_p(3, '<Warnings>NormalWarnings</Warnings>')\n_p(3, '<ExtraWarnings>false</ExtraWarnings>')\nend\nif cfg.flags.FatalWarnings then\n_p(3, '<WarningsAsErrors>true</WarningsAsErrors>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nif cfg.flags.PedanticWarnings or cfg.flags.ExtraWarnings then\n_p(3, '<Warnings>AllWarnings</Warnings>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<Warnings>DisableAllWarnings</Warnings>')\nelse\n_p(3, '<Warnings>NormalWarnings</Warnings>')\nend\nif cfg.flags.FatalWarnings then\n_p(3, '<WarningsAsErrors>true</WarningsAsErrors>')\nend\nelse\nif cfg.flags.PedanticWarnings then\n_p(3, '<WarningLevel>EnableAllWarnings</WarningLevel>')\nelseif cfg.flags.ExtraWarnings then\n_p(3, '<WarningLevel>Level4</WarningLevel>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<WarningLevel>Level1</WarningLevel>')\nelse\n_p(3 ,'<WarningLevel>Level3</Warnin"
- "gLevel>')\nend\nend\nif cfg.flags.FatalWarnings then\n_p(3, '<TreatWarningAsError>true</TreatWarningAsError>')\nend\nif premake.action.current() == premake.action.get(\"vs2017\") or\n premake.action.current() == premake.action.get(\"vs2019\") then\ncppstandard_vs2017_or_2019(cfg)\nend\nexceptions(cfg)\nrtti(cfg)\ncalling_convention(cfg)\nwchar_t_builtin(cfg)\nsse(cfg)\nfloating_point(cfg)\ndebug_info(cfg)\nif _ACTION:sub(3) == \"llvm\" then\n_p(3,'<SupportJustMyCode>false</SupportJustMyCode>')\nend\nif cfg.flags.Symbols then\nif cfg.kind == \"StaticLib\" then\n_p(3, '<ProgramDataBaseFileName>$(OutDir)%s.pdb</ProgramDataBaseFileName>'\n, path.getbasename(cfg.buildtarget.name)\n)\nelse\n_p(3, '<ProgramDataBaseFileName>$(IntDir)%s.compile.pdb</ProgramDataBaseFileName>'\n, path.getbasename(cfg.buildtarget.name)\n)\nend\nend\nif cfg.flags.Hotpatchable then\n_p(3, '<CreateHotpatchableImage>true</CreateHotpatchableImage>')\nend\nif cfg.flags.NoFramePointer then\n_p(3, '<OmitFramePointers>true</OmitFramePointers>')"
- "\nend\nif cfg.flags.UseFullPaths then\n_p(3, '<UseFullPaths>true</UseFullPaths>')\nend\nif cfg.flags.NoJMC then\n_p(3,'<SupportJustMyCode>false</SupportJustMyCode>' )\nend\ncompile_language(cfg)\nforcedinclude_files(3,cfg);\nif vstudio.diagformat then\n_p(3, '<DiagnosticsFormat>%s</DiagnosticsFormat>', vstudio.diagformat)\nelse\n_p(3, '<DiagnosticsFormat>Caret</DiagnosticsFormat>')\nend\n_p(2,'</ClCompile>')\nend\nlocal function event_hooks(cfg)\nif #cfg.postbuildcommands> 0 then\n _p(2,'<PostBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.postbuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PostBuildEvent>')\nend\nif #cfg.prebuildcommands> 0 then\n _p(2,'<PreBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prebuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreBuildEvent>')\nend\nif #cfg.prelinkcommands> 0 then\n _p(2,'<PreLinkEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prelinkcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</Pr"
- "eLinkEvent>')\nend\nend\nlocal function additional_options(indent,cfg)\nif #cfg.linkoptions > 0 then\n_p(indent,'<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>',\ntable.concat(premake.esc(cfg.linkoptions), \" \"))\nend\nend\nlocal function link_target_machine(index,cfg)\nlocal platforms = {x32 = 'MachineX86', x64 = 'MachineX64'}\nif platforms[cfg.platform] then\n_p(index,'<TargetMachine>%s</TargetMachine>', platforms[cfg.platform])\nend\nend\nlocal function item_def_lib(prj, cfg)\nif cfg.kind == 'StaticLib' and cfg.platform ~= \"Xbox360\" then\n_p(1,'<Lib>')\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>',cfg.buildtarget.name)\nadditional_options(2,cfg)\nlink_target_machine(2,cfg)\nif _ACTION:sub(3) == \"llvm\" and prj.name == \"portaudio\" then -- MSVC-LLVM needs special help\n_p(2,'<AdditionalDependencies>ksuser.lib;%%(AdditionalDependencies)</AdditionalDependencies>')\nend\n_p(1,'</Lib>')\nend\nend\nlocal function import_lib(cfg)\nif cfg.kind == \"SharedLib\" then\nlocal implibname = cfg.linkt"
- "arget.fullpath\n_p(3,'<ImportLibrary>%s</ImportLibrary>',iif(cfg.flags.NoImportLib, cfg.objectsdir .. \"\\\\\" .. path.getname(implibname), implibname))\nend\nend\nlocal function hasmasmfiles(prj)\nlocal files = vc2010.getfilegroup(prj, \"MASM\")\nreturn #files > 0\nend\nlocal function ismanagedprj(prj, cfgname, pltname)\nlocal cfg = premake.getconfig(prj, cfgname, pltname)\nreturn cfg.flags.Managed == true\nend\nlocal function getcfglinks(cfg)\nlocal haswholearchive = #cfg.wholearchive > 0\nlocal msvcnaming = premake.getnamestyle(cfg) == \"windows\"\nlocal iscppprj = premake.iscppproject(cfg)\nlocal isnetprj = premake.isdotnetproject(cfg)\nlocal linkobjs = {}\nlocal links = iif(haswholearchive\n, premake.getlinks(cfg, \"all\", \"object\")\n, premake.getlinks(cfg, \"system\", \"fullpath\")\n)\nfor _, link in ipairs(links) do\nlocal name = nil\nlocal directory = nil\nlocal whole = nil\nif type(link) == \"table\" then\nif not ismanagedprj(link.project, cfg.name, cfg.platform) then\n"
- "name = link.linktarget.basename\ndirectory = path.rebase(link.linktarget.directory, link.location, cfg.location)\nwhole = table.icontains(cfg.wholearchive, link.project.name)\nend\nelse\nname = link\nwhole = table.icontains(cfg.wholearchive, link)\nend\nif name then\nif haswholearchive and msvcnaming then\nif iscppprj then\nname = name .. \".lib\"\nelseif isnetprj then\nname = name .. \".dll\"\nend\nend\ntable.insert(linkobjs, {name=name, directory=directory, wholearchive=whole})\nend\nend\nreturn linkobjs\nend\nlocal function vs10_masm(prj, cfg)\nif hasmasmfiles(prj) then\n_p(2, '<MASM>')\n_p(3,'<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>'\n, table.concat(premake.esc(table.join(cfg.buildoptions, cfg.buildoptions_asm)), \" \")\n)\nlocal includedirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systemincludedirs)\nif #includedirs > 0 then\n_p(3, '<IncludePaths>%s;%%(IncludePaths)</IncludePaths>'\n, premake.esc(path.translate(table.concat(includedirs, \";\"), '\\\\'"
- "))\n)\nend\nlocal defines = table.join(cfg.defines)\ntable.insertflat(defines, iif(premake.config.isdebugbuild(cfg), \"_DEBUG\", {}))\ntable.insert(defines, iif(cfg.platform == \"x64\", \"_WIN64\", \"_WIN32\"))\ntable.insert(defines, iif(prj.kind == \"SharedLib\", \"_EXPORT=EXPORT\", \"_EXPORT=\"))\n_p(3, '<PreprocessorDefinitions>%s;%%(PreprocessorDefinitions)</PreprocessorDefinitions>'\n, premake.esc(table.concat(defines, \";\"))\n)\nif cfg.flags.FatalWarnings then\n_p(3,'<TreatWarningsAsErrors>true</TreatWarningsAsErrors>')\nend\nif cfg.flags.MinimumWarnings then\n_p(3,'<WarningLevel>0</WarningLevel>')\nelse\n_p(3,'<WarningLevel>3</WarningLevel>')\nend\n_p(2, '</MASM>')\nend\nend\nlocal function additional_manifest(cfg)\nif(cfg.dpiawareness ~= nil) then\n_p(2,'<Manifest>')\nif(cfg.dpiawareness == \"None\") then\n_p(3, '<EnableDpiAwareness>false</EnableDpiAwareness>')\nend\nif(cfg.dpiawareness == \"High\") then\n_p(3, '<EnableDpiAwareness>true</EnableDpiAwareness>')\nend\nif(cfg.dpiawareness == \"HighPerMoni"
- "tor\") then\n_p(3, '<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>')\nend\n_p(2,'</Manifest>')\nend\nend\nfunction vc2010.link(cfg)\nlocal vs2017OrLater = premake.action.current() == premake.action.get(\"vs2017\") or\n premake.action.current() == premake.action.get(\"vs2019\")\nlocal vsllvm = premake.action.current() == premake.action.get(\"vsllvm\")\nlocal links = getcfglinks(cfg)\n_p(2,'<Link>')\n_p(3,'<SubSystem>%s</SubSystem>', iif(cfg.kind == \"ConsoleApp\", \"Console\", \"Windows\"))\nif (vs2017OrLater or vsllvm) and cfg.flags.FullSymbols then\n_p(3,'<GenerateDebugInformation>DebugFull</GenerateDebugInformation>')\nelse\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nend\nif cfg.flags.Symbols then\n_p(3, '<ProgramDatabaseFile>$(OutDir)%s.pdb</ProgramDatabaseFile>'\n, path.getbasename(cfg.buildtarget.name)\n)\nend\nif premake.config.islinkeroptimizedbuild(cfg.flags) then\nif cfg.platform == \"Orbis\" then\n_p(3,'<DataStripping>Stri"
- "pFuncsAndData</DataStripping>')\n_p(3,'<DuplicateStripping>true</DuplicateStripping>')\nelse\n_p(3,'<EnableCOMDATFolding>true</EnableCOMDATFolding>')\n_p(3,'<OptimizeReferences>true</OptimizeReferences>')\nend\nelseif cfg.platform == \"Orbis\" and premake.config.iseditandcontinue(cfg) then\n_p(3,'<EditAndContinue>true</EditAndContinue>')\nend\nif cfg.finalizemetasource ~= nil then\n_p(3,'<FinalizeMetaSource>%s</FinalizeMetaSource>', premake.esc(cfg.finalizemetasource))\nend\nif cfg.kind ~= 'StaticLib' then\nvc2010.additionalDependencies(3, cfg, links)\nvc2010.additionalLibraryDirectories(3, cfg, links)\n_p(3,'<OutputFile>$(OutDir)%s</OutputFile>', cfg.buildtarget.name)\nif vc2010.config_type(cfg) == 'Application' and not cfg.flags.WinMain and not cfg.flags.Managed then\nif cfg.flags.Unicode then\n_p(3,'<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>')\nelse\n_p(3,'<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>')\nend\nend\nimport_lib(cfg)\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile t"
- "hen\n_p(3,'<ModuleDefinitionFile>%s</ModuleDefinitionFile>', deffile)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nif cfg.flags.NoWinMD and vstudio.iswinrt() and prj.kind == \"WindowedApp\" then\n_p(3,'<GenerateWindowsMetadata>false</GenerateWindowsMetadata>' )\nend\nend\nif cfg.platform == \"TegraAndroid\" then\nif cfg.androidlinker then\n_p(3,'<UseLinker>%s</UseLinker>',cfg.androidlinker)\nend\nend\nif cfg.flags.Hotpatchable then\n_p(3, '<CreateHotPatchableImage>Enabled</CreateHotPatchableImage>')\nend\nif cfg.flags.GenerateMapFiles then\n_p(3, '<GenerateMapFile>true</GenerateMapFile>')\nend\n_p(2,'</Link>')\nif #cfg.wholearchive > 0 then\n_p(2, '<ProjectReference>')\n_p(3, '<LinkLibraryDependencies>false</LinkLibraryDependencies>')\n_p(2, '</ProjectReference>')\nend\nend\nfunction vc2010.additionalLibraryDirectories(tab, cfg, links)\nlocal dirs = cfg.libdirs\nfor _, link in ipairs(links) do\nif link.directory and not table.icontains(dirs, link.directory) then\ntable.insert(dirs, link.directo"
- "ry)\nend\nend\n_p(tab, '<AdditionalLibraryDirectories>%s;%%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>'\n, premake.esc(path.translate(table.concat(dirs, ';'), '\\\\'))\n)\nend\nfunction vc2010.additionalDependencies(tab, cfg, links)\nif #links > 0 then\nlocal deps = \"\"\nif cfg.platform == \"Orbis\" then\nlocal iswhole = false\nfor _, link in ipairs(links) do\nif link.wholearchive and not iswhole then\ndeps = deps .. \"--whole-archive;\"\niswhole = true\nelseif not link.wholearchive and iswhole then\ndeps = deps .. \"--no-whole-archive;\"\niswhole = false\nend\ndeps = deps .. \"-l\" .. link.name .. \";\"\nend\nelse\nfor _, link in ipairs(links) do\nif link.wholearchive then\ndeps = deps .. \"/WHOLEARCHIVE:\" .. link.name .. \";\"\nelse\ndeps = deps .. link.name .. \";\"\nend\nend\nend\nif cfg.platform == \"TegraAndroid\" then\ndeps = \"-Wl,--start-group;\" .. deps .. \";-Wl,--end-group\"\nend\n_p(tab, '<AdditionalDependencies>%s;%s</AdditionalDependencies>'\n, deps\n, iif(cfg.platform == \"D"
- "urango\"\n, '%(XboxExtensionsDependencies)'\n, '%(AdditionalDependencies)'\n)\n)\nelseif cfg.platform == \"Durango\" then\n_p(tab, '<AdditionalDependencies>%%(XboxExtensionsDependencies)</AdditionalDependencies>')\nend\nend\nfunction ant_build(prj, cfg)\nif cfg.platform == \"TegraAndroid\" then\nlocal files = vc2010.getfilegroup(prj, \"AndroidBuild\")\n_p(2,'<AntBuild>')\nif #files > 0 then\n_p(3,'<AndroidManifestLocation>%s</AndroidManifestLocation>',path.translate(files[1].name))\nend\nlocal isdebugbuild = premake.config.isdebugbuild(cfg)\n_p(3,'<AntBuildType>%s</AntBuildType>',iif(isdebugbuild, 'Debug','Release'))\n_p(3,'<Debuggable>%s</Debuggable>',tostring(cfg.flags.AntBuildDebuggable ~= nil))\nif #cfg.antbuildjavasourcedirs > 0 then\nlocal dirs = table.concat(cfg.antbuildjavasourcedirs,\";\")\n_p(3,'<JavaSourceDir>%s</JavaSourceDir>',dirs)\nend\nif #cfg.antbuildjardirs > 0 then\nlocal dirs = table.concat(cfg.antbuildjardirs,\";\")\n_p(3,'<JarDirectories>%s</JarDirectories>',dirs)\nend\nif #cfg.antbuildja"
- "rdependencies > 0 then\nlocal dirs = table.concat(cfg.antbuildjardependencies,\";\")\n_p(3,'<JarDependencies>%s</JarDependencies>',dirs)\nend\nif #cfg.antbuildnativelibdirs > 0 then\nlocal dirs = table.concat(cfg.antbuildnativelibdirs,\";\")\n_p(3,'<NativeLibDirectories>%s</NativeLibDirectories>',dirs)\nend\nif #cfg.antbuildnativelibdependencies > 0 then\nlocal dirs = table.concat(cfg.antbuildnativelibdependencies,\";\")\n_p(3,'<NativeLibDependencies>%s</NativeLibDependencies>',dirs)\nend\nif #cfg.antbuildassetsdirs > 0 then\nlocal dirs = table.concat(cfg.antbuildassetsdirs,\";\")\n_p(3,'<AssetsDirectories>%s</AssetsDirectories>',dirs)\nend\n_p(2,'</AntBuild>')\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,'<ItemDefinitionGroup ' ..if_config_and_platform() ..'>'\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(prj, cfg)\nvc2010."
- "link(cfg)\nant_build(prj, cfg)\nevent_hooks(cfg)\nvs10_masm(prj, cfg)\nadditional_manifest(cfg)\n_p(1,'</ItemDefinitionGroup>')\nend\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {},\nClInclude = {},\nMASM = {},\nObject = {},\nNone = {},\nResourceCompile = {},\nAppxManifest = {},\nAndroidBuild = {},\nNatvis = {},\nImage = {},\nDeploymentContent = {}\n}\nlocal foundAppxManifest = false\nfor file in premake.project.eachfile(prj, true) do\nif path.issourcefilevs(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\nif not table.icontains(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isobjectfile(file.name) then\ntable.insert(sortedfiles.Object, file)\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelseif path.isimagefile(file.name) then\ntable.insert(sortedfiles.Image, file)\nelseif"
- " path.isappxmanifest(file.name) then\nfoundAppxManifest = true\ntable.insert(sortedfiles.AppxManifest, file)\nelseif path.isandroidbuildfile(file.name) then\ntable.insert(sortedfiles.AndroidBuild, file)\nelseif path.isnatvis(file.name) then\ntable.insert(sortedfiles.Natvis, file)\nelseif path.isasmfile(file.name) then\ntable.insert(sortedfiles.MASM, file)\nelseif file.flags and table.icontains(file.flags, \"DeploymentContent\") then\ntable.insert(sortedfiles.DeploymentContent, file)\nelse\ntable.insert(sortedfiles.None, file)\nend\nend\nif vstudio.iswinrt() and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \"/Package.appxmanifest\"\nfcfg.vpath = premake.project.getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nlocal logo = {}\nlogo.name = prj.name .. \"/Logo.png\"\nlogo.vpath = logo.name\ntable.insert(sortedfiles.Image, logo)\nlocal smallLogo = {}\nsmallLogo.name = prj.name .. \"/SmallLogo.png\"\nsma"
- "llLogo.vpath = smallLogo.name\ntable.insert(sortedfiles.Image, smallLogo)\nlocal storeLogo = {}\nstoreLogo.name = prj.name .. \"/StoreLogo.png\"\nstoreLogo.vpath = storeLogo.name\ntable.insert(sortedfiles.Image, storeLogo)\nlocal splashScreen = {}\nsplashScreen.name = prj.name .. \"/SplashScreen.png\"\nsplashScreen.vpath = splashScreen.name\ntable.insert(sortedfiles.Image, splashScreen)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"Object\")\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.customtaskgroup(prj)\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\nvc2010.simplefilesgroup(prj, \"AppxManifest\")\nvc2010.simplefilesgroup(prj, \"AndroidBuild\")\nvc2010.simplefilesgroup(prj, \"Natvis\")\nvc2010.deploymentcontentgroup(prj, \"Image\")\nvc2010.deploymentcontentgroup(prj, \"DeploymentContent\", \"None\")\nend\nfunction vc2010.customtaskg"
- "roup(prj)\nlocal files = { }\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal fcfg = { }\nfcfg.name = path.getrelative(prj.location,buildtask[1])\nfcfg.vpath = path.trimdots(fcfg.name)\ntable.insert(files, fcfg)\nend\nend\nif #files > 0 then\n_p(1,'<ItemGroup>')\nlocal groupedBuildTasks = {}\nlocal buildTaskNames = {}\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nif (groupedBuildTasks[buildtask[1]] == nil) then\ngroupedBuildTasks[buildtask[1]] = {}\ntable.insert(buildTaskNames, buildtask[1])\nend\ntable.insert(groupedBuildTasks[buildtask[1]], buildtask)\nend\nend\nfor _, name in ipairs(buildTaskNames) do\ncustombuildtask = groupedBuildTasks[name]\n_p(2,'<CustomBuild Include=\\\"%s\\\">', path.translate(path.getrelative(prj.location,name), \"\\\\\"))\n_p(3,'<FileType>Text</FileType>')\nlocal cmd = \"\"\nlocal outputs = \"\"\nfor _, buildtask in ipairs(custombuildt"
- "ask or {}) do\nfor _, cmdline in ipairs(buildtask[4] or {}) do\ncmd = cmd .. cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[1])))\ncmd = string.gsub(cmd, \"%$%(@%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[2])))\ncmd = cmd .. \"\\r\\n\"\nend\noutputs = outputs .. path.getrelative(prj.location,buildtask[2]) .. \";\"\nend\n_p(3,'<Command>%s</Command>',cmd)\n_p(3,'<Outputs>%s%%(Outputs)</Outputs>',outputs)\n_p(3,'<SubType>Designer</SubType>')\n_p(3,'<Message></Message>')\n_p(2,'</CustomBuild>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfg"
- "info in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\nlocal prjexcluded = table.icontains(prj.excludes, file.name)\nlocal excludedcfgs = {}\nif not prjexcluded then\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal fileincfg = table.icontains(cfg.files, file.name)\nlocal cfgexcluded = table.icontains(cfg.excludes, file.name)\nif not fileincfg or cfgexcluded then\ntable.insert(excludedcfgs, vsconfig.name)\nend\nend\nend\nif subtype or prjexcluded or #excludedcfgs > 0 then\n_p(2, '<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\nif prjexcluded then\n_p(3, '<ExcludedFromBuild>true</ExcludedFromBuild>')\nelse\nfor _, cfgname in ipairs(excludedcfgs) do\n_p(3, '<Exclude"
- "dFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(cfgname)\n)\nend\nend\nif subtype then\n_p(3, '<SubType>%s</SubType>', subtype)\nend\n_p(2,'</%s>', section)\nelse\n_p(2, '<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\nend\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.deploymentcontentgroup(prj, section, filetype)\nif filetype == nil then\nfiletype = section\nend\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\n_p(2,'<%s Include=\\\"%s\\\">', filetype, path.translate(file.name, \"\\\\\"))\n_p(3,'<DeploymentContent>true</DeploymentContent>')\n_p(3,'<Link>%s</Link>', path.translate(file.vpath, \"\\\\\"))\n_p(2,'</%s>', filetype)\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.compilerfilesgroup(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cf"
- "ginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'<ItemGroup>')\nlocal existingBasenames = {};\nfor _, file in ipairs(files) do\nlocal filename = string.lower(path.getbasename(file.name))\nlocal disambiguation = existingBasenames[filename] or 0;\nexistingBasenames[filename] = disambiguation + 1\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '<ClCompile Include=\\\"%s\\\">', translatedpath)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal namestyle = premake.getnamestyle(cfg)\nif namestyle == \"TegraAndroid\" or namestyle == \"NX\" then\n_p(3, '<ObjectFileName '.. if_config_and_platform() .. '>$(IntDir)%s.o</ObjectFileName>', premake.esc(vsconfig.name), premake.esc(path.translate(path.trimdots(path.removeext(f"
- "ile.name)))) )\nelse\nif disambiguation > 0 then\n_p(3, '<ObjectFileName '.. if_config_and_platform() .. '>$(IntDir)%s\\\\</ObjectFileName>', premake.esc(vsconfig.name), tostring(disambiguation))\nend\nend\nend\nif path.iscxfile(file.name) then\n_p(3, '<CompileAsWinRT>true</CompileAsWinRT>')\n_p(3, '<RuntimeTypeInfo>true</RuntimeTypeInfo>')\n_p(3, '<PrecompiledHeader>NotUsing</PrecompiledHeader>')\nend\nif vstudio.iswinrt() and string.len(file.name) > 2 and string.sub(file.name, -2) == \".c\" then\n_p(3,'<CompileAsWinRT>FALSE</CompileAsWinRT>')\nend\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'<PrecompiledHeader '.. if_config_and_platform() .. '>Create</PrecompiledHeader>', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend\nend\nlocal nopch = table.icontains(prj.nopch, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig."
- "src_platform)\nif nopch or table.icontains(cfg.nopch, file.name) then\n_p(3,'<PrecompiledHeader '.. if_config_and_platform() .. '>NotUsing</PrecompiledHeader>', premake.esc(vsconfig.name))\nend\nend\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal fileincfg = table.icontains(cfg.files, file.name)\nlocal cfgexcluded = table.icontains(cfg.excludes, file.name)\nif excluded or not fileincfg or cfgexcluded then\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(vsconfig.name)\n)\nend\nend\nif prj.flags and prj.flags.Managed then\nlocal prjforcenative = table.icontains(prj.forcenative, file.name)\nfor _,vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nif prjforcenative or table.icontains(cfg.forcenative, file.name) then\n_p(3, '<CompileAsManaged ' .. if_config_and"
- "_platform() .. '>false</CompileAsManaged>', premake.esc(vsconfig.name))\nend\nend\nend\n_p(2,'</ClCompile>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.masmfiles(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"MASM\")\nif #files > 0 then\n_p(1, '<ItemGroup>')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '<MASM Include=\"%s\">', translatedpath)\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal fileincfg = table.icontains(cfg.files, file.name)\nlocal cfgexcluded = table.icontains(cfg.excludes, file.name)\nif excluded or not fileincfg or cfgexcluded then\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(vsconfig.name)\n)\nend\nend\n_p(2, '</MASM>')\nend\n_p(1, '</ItemGroup>')\nend\nend\nfunction vc2010.header(target"
- "s)\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('<Project%s ToolsVersion=\"%s\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">', t, action.vstudio.toolsVersion)\nend\nfunction premake.vs2010_vcxproj(prj)\nlocal usemasm = hasmasmfiles(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.Default.props\" />')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.props\" />')\n_p(1,'<ImportGroup Label=\"ExtensionSettings\">')\nif usemasm then\n_p(2, '<Import Project=\"$(VCTargetsPath)\\\\BuildCustomizations\\\\masm.props\" />')\nend\n_p(1,'</ImportGroup>')\nimport_props(prj)\n_p(1,'<PropertyGroup "
- "Label=\"UserMacros\" />')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.clrReferences(prj)\nvc2010.projectReferences(prj)\nvc2010.sdkReferences(prj)\nvc2010.masmfiles(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.targets\" />')\n_p(1,'<ImportGroup Label=\"ExtensionTargets\">')\nif usemasm then\n_p(2, '<Import Project=\"$(VCTargetsPath)\\\\BuildCustomizations\\\\masm.targets\" />')\nend\n_p(1,'</ImportGroup>')\n_p('</Project>')\nend\nfunction vc2010.clrReferences(prj)\nif #prj.clrreferences == 0 then\nreturn\nend\n_p(1,'<ItemGroup>')\nfor _, ref in ipairs(prj.clrreferences) do\nif os.isfile(ref) then\nlocal assembly = path.getbasename(ref)\n_p(2,'<Reference Include=\"%s\">', assembly)\n_p(3,'<HintPath>%s</HintPath>', path.getrelative(prj.location, ref))\n_p(2,'</Reference>')\nelse\n_p(2,'<Reference Include=\"%s\" />', ref)\nend\nend\n_p(1,'</ItemGroup>')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps == 0 and "
- "#prj.vsimportreferences == 0 then\nreturn\nend\nlocal function compareuuid(a, b) return a.uuid < b.uuid end\ntable.sort(deps, compareuuid)\ntable.sort(table.join(prj.vsimportreferences), compareuuid)\n_p(1,'<ItemGroup>')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'<ProjectReference Include=\\\"%s\\\">', path.translate(deppath, \"\\\\\"))\n_p(3,'<Project>{%s}</Project>', dep.uuid)\nif vstudio.iswinrt() then\n_p(3,'<ReferenceOutputAssembly>false</ReferenceOutputAssembly>')\nend\n_p(2,'</ProjectReference>')\nend\nfor _, ref in ipairs(prj.vsimportreferences) do\nlocal slnrelpath = path.rebase(ref, prj.location, sln.location)\nlocal iprj = premake.vstudio.getimportprj(slnrelpath, prj.solution)\n_p(2,'<ProjectReference Include=\\\"%s\\\">', ref)\n_p(3,'<Project>{%s}</Project>', iprj.uuid)\n_p(2,'</ProjectReference>')\nend\n_p(1,'</ItemGroup>')\nend\nfunction vc2010.sdkReferences(prj)\nlocal refs = prj.sdkreferences\nif #refs > 0 then\n_p(1,'<ItemGro"
- "up>')\nfor _, ref in ipairs(refs) do\n_p(2,'<SDKReference Include=\\\"%s\\\" />', ref)\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.debugdir(cfg)\nlocal isnx = (cfg.platform == \"NX32\" or cfg.platform == \"NX64\")\nlocal debuggerFlavor =\n iif(isnx, 'OasisNXDebugger'\n, iif(cfg.platform == \"Orbis\", 'ORBISDebugger'\n, iif(cfg.platform == \"Durango\", 'XboxOneVCppDebugger'\n, iif(cfg.platform == \"TegraAndroid\", 'AndroidDebugger'\n, iif(vstudio.iswinrt(), 'AppHostLocalDebugger'\n, 'WindowsLocalDebugger'\n)))))\n_p(2, '<DebuggerFlavor>%s</DebuggerFlavor>', debuggerFlavor)\nif cfg.debugdir and not vstudio.iswinrt() then\n_p(2, '<LocalDebuggerWorkingDirectory>%s</LocalDebuggerWorkingDirectory>'\n, path.translate(cfg.debugdir, '\\\\')\n)\nend\nif cfg.debugcmd then\n_p(2, '<LocalDebuggerCommand>%s</LocalDebuggerCommand>', cfg.debugcmd)\nend\nif cfg.debugargs then\n_p(2, '<LocalDebuggerCommandArguments>%s</LocalDebugge"
- "rCommandArguments>'\n, table.concat(cfg.debugargs, \" \")\n)\nend\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2, '<LocalDebuggerEnvironment>%s%s</LocalDebuggerEnvironment>'\n, table.concat(cfg.debugenvs, \"\\n\")\n, iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)', '')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2, '<LocalDebuggerMergeEnvironment>false</LocalDebuggerMergeEnvironment>')\nend\nend\nif cfg.deploymode then\n_p(2, '<DeployMode>%s</DeployMode>', cfg.deploymode)\nend\nif cfg.platform == \"TegraAndroid\" then\nif cfg.androiddebugintentparams then\n_p(2, '<IntentParams>%s</IntentParams>'\n, table.concat(cfg.androiddebugintentparams, \" \")\n)\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' <PropertyGroup '.. if_config_and_platform() ..'>', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\n_p"
- "(' </PropertyGroup>')\nend\n_p('</Project>')\nend\nlocal png1x1data = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, -- .PNG........IHDR\n0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, 0xdb, 0x56, -- .............%.V\n0xca, 0x00, 0x00, 0x00, 0x03, 0x50, 0x4c, 0x54, 0x45, 0x00, 0x00, 0x00, 0xa7, 0x7a, 0x3d, 0xda, -- .....PLTE....z=.\n0x00, 0x00, 0x00, 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, -- ....tRNS.@..f...\n0x0a, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xe2, -- .IDAT..c`.......\n0x21, 0xbc, 0x33, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, -- !.3....IEND.B`.\n}\nfunction png1x1(obj, filename)\nfilename = premake.project.getfilename(obj, filename)\nlocal f, err = io.open(filename, \"wb\")\nif f then\nfor _, byte in ipairs(png1x1data) do\nf:write(string.char(byte))\nend\nf:close()\nend\nend\nfunction premak"
- "e.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nif vstudio.storeapp == \"10.0\" then\n_p('<Package')\n_p(1, 'xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"')\n_p(1, 'xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"')\n_p(1, 'xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"')\n_p(1, 'IgnorableNamespaces=\"uap mp\">')\nelseif vstudio.storeapp == \"durango\" then\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\" xmlns:mx=\"http://schemas.microsoft.com/appx/2013/xbox/manifest\" IgnorableNamespaces=\"mx\">')\nend\n_p(1, '<Identity')\n_p(2, 'Name=\"' .. prj.uuid .. '\"')\n_p(2, 'Publisher=\"CN=Publisher\"')\n_p(2, 'Version=\"1.0.0.0\" />')\nif vstudio.storeapp == \"10.0\" then\n_p(1, '<mp:PhoneIdentity')\n_p(2, 'PhoneProductId=\"' .. prj.uuid .. '\"')\n_p(2, 'PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>')\nend\n_p(1, '<Properties>')\n_p(2, '<Di"
- "splayName>' .. prj.name .. '</DisplayName>')\n_p(2, '<PublisherDisplayName>PublisherDisplayName</PublisherDisplayName>')\n_p(2, '<Logo>' .. prj.name .. '\\\\StoreLogo.png</Logo>')\npng1x1(prj, \"%%/StoreLogo.png\")\n_p(2, '<Description>' .. prj.name .. '</Description>')\n_p(1,'</Properties>')\nif vstudio.storeapp == \"10.0\" then\n_p(1, '<Dependencies>')\n_p(2, '<TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.10069.0\" MaxVersionTested=\"10.0.10069.0\" />')\n_p(1, '</Dependencies>')\nelseif vstudio.storeapp == \"durango\" then\n_p(1, '<Prerequisites>')\n_p(2, '<OSMinVersion>6.2</OSMinVersion>')\n_p(2, '<OSMaxVersionTested>6.2</OSMaxVersionTested>')\n_p(1, '</Prerequisites>')\nend\n_p(1, '<Resources>')\n_p(2, '<Resource Language=\"en-us\"/>')\n_p(1, '</Resources>')\n_p(1, '<Applications>')\n_p(2, '<Application Id=\"App\"')\n_p(3, 'Executable=\"$targetnametoken$.exe\"')\n_p(3, 'EntryPoint=\"' .. prj.name .. '.App\">')\nif vstudio.storeapp == \"10.0\" then\n_p(3, '<uap:VisualElements')\n_p(4, 'Di"
- "splayName=\"' .. prj.name .. '\"')\n_p(4, 'Square150x150Logo=\"' .. prj.name .. '\\\\Logo.png\"')\npng1x1(prj, \"%%/Logo.png\")\nif vstudio.storeapp == \"10.0\" then\n_p(4, 'Square44x44Logo=\"' .. prj.name .. '\\\\SmallLogo.png\"')\npng1x1(prj, \"%%/SmallLogo.png\")\nelse\n_p(4, 'Square30x30Logo=\"' .. prj.name .. '\\\\SmallLogo.png\"')\npng1x1(prj, \"%%/SmallLogo.png\")\nend\n_p(4, 'Description=\"' .. prj.name .. '\"')\n_p(4, 'BackgroundColor=\"transparent\">')\n_p(4, '<uap:SplashScreen Image=\"' .. prj.name .. '\\\\SplashScreen.png\" />')\npng1x1(prj, \"%%/SplashScreen.png\")\n_p(3, '</uap:VisualElements>')\nelseif vstudio.storeapp == \"durango\" then\n_p(3, '<VisualElements')\n_p(4, 'DisplayName=\"' .. prj.name .. '\"')\n_p(4, 'Logo=\"' .. prj.name .. '\\\\Logo.png\"')\npng1x1(prj, \"%%/Logo.png\")\n_p(4, 'SmallLogo=\"' .. prj.name .. '\\\\SmallLogo.png\"')\npng1x1(prj, \"%%/SmallLogo.png\")\n_p(4, 'Description=\"' .. prj.name .. '\"')\n_p(4, 'ForegroundText=\"light\"')\n_p(4, 'BackgroundColor=\"transparent"
- "\">')\n_p(5, '<SplashScreen Image=\"' .. prj.name .. '\\\\SplashScreen.png\" />')\npng1x1(prj, \"%%/SplashScreen.png\")\n_p(3, '</VisualElements>')\n_p(3, '<Extensions>')\n_p(4, '<mx:Extension Category=\"xbox.system.resources\">')\n_p(4, '<mx:XboxSystemResources />')\n_p(4, '</mx:Extension>')\n_p(3, '</Extensions>')\nend\n_p(2, '</Application>')\n_p(1, '</Applications>')\n_p('</Package>')\nend\n",
+ "nimumVisualStudioVersion>')\n_p(2, '<TargetRuntime>Native</TargetRuntime>')\nelse\n_p(2, '<AppContainerApplication>true</AppContainerApplication>')\n_p(2, '<MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>')\n_p(2, '<ApplicationType>Windows Store</ApplicationType>')\n_p(2, '<ApplicationTypeRevision>%s</ApplicationTypeRevision>', vstudio.storeapp)\nend\nelse\n_p(2, '<Keyword>Win32Proj</Keyword>')\nend\nif not vstudio.xpwarning then\n_p(2, '<XPDeprecationWarning>false</XPDeprecationWarning>')\nend\n_p(1,'</PropertyGroup>')\nend\nfunction vc2010.config_type(config)\nlocal t =\n{\nSharedLib = \"DynamicLibrary\",\nStaticLib = \"StaticLibrary\",\nConsoleApp = \"Application\",\nWindowedApp = \"Application\"\n}\nreturn t[config.kind]\nend\nlocal function if_config_and_platform()\nreturn 'Condition=\"\\'$(Configuration)|$(Platform)\\'==\\'%s\\'\"'\nend\nlocal function optimisation(cfg)\nlocal result = \"Disabled\"\nfor _, value in ipairs(cfg.flags) do\nif (value == \"Optimize\") then\nresult = \"Full\"\nels"
+ "eif (value == \"OptimizeSize\") then\nresult = \"MinSpace\"\nelseif (value == \"OptimizeSpeed\") then\nresult = \"MaxSpeed\"\nend\nend\nreturn result\nend\nfunction vc2010.configurationPropertyGroup(cfg, cfginfo)\n_p(1, '<PropertyGroup '..if_config_and_platform() ..' Label=\"Configuration\">'\n, premake.esc(cfginfo.name))\nlocal is2019 = premake.action.current() == premake.action.get(\"vs2019\")\nlocal is2022 = premake.action.current() == premake.action.get(\"vs2022\")\nlocal is2026 = premake.action.current() == premake.action.get(\"vs2026\")\nif is2019 or is2022 or is2026 then\n _p(2, '<VCProjectVersion>%s</VCProjectVersion>', action.vstudio.toolsVersion)\nif cfg.flags.UnitySupport then\n _p(2, '<EnableUnitySupport>true</EnableUnitySupport>')\nend\nend\n_p(2, '<ConfigurationType>%s</ConfigurationType>', vc2010.config_type(cfg))\n_p(2, '<UseDebugLibraries>%s</UseDebugLibraries>', iif(optimisation(cfg) == \"Disabled\",\"true\",\"false\"))\n_p(2, '<PlatformToolset>%s</PlatformToolset>', premake.vstudio"
+ ".toolset)\nif os.is64bit() then\n_p(2, '<PreferredToolArchitecture>x64</PreferredToolArchitecture>')\nend\nif cfg.flags.Unicode then\n_p(2,'<CharacterSet>Unicode</CharacterSet>')\nend\nif cfg.flags.Managed then\n_p(2,'<CLRSupport>true</CLRSupport>')\nend\nif cfg.platform == \"TegraAndroid\" then\nif cfg.androidtargetapi then\n_p(2,'<AndroidTargetAPI>android-%s</AndroidTargetAPI>', cfg.androidtargetapi)\nend\nif cfg.androidminapi then\n_p(2,'<AndroidMinAPI>android-%s</AndroidMinAPI>', cfg.androidminapi)\nend\nif cfg.androidarch then\n_p(2,'<AndroidArch>%s</AndroidArch>', cfg.androidarch)\nend\nif cfg.androidndktoolchainversion then\n_p(2,'<NdkToolchainVersion>%s</NdkToolchainVersion>', cfg.androidndktoolchainversion)\nend\nif cfg.androidstltype then\n_p(2,'<AndroidStlType>%s</AndroidStlType>', cfg.androidstltype)\nend\nend\nif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\n_p(2,'<NintendoSdkRoot>$(NINTENDO_SDK_ROOT)\\\\</NintendoSdkRoot>')\n_p(2,'<NintendoSdkSpec>NX</NintendoSdkSpec>')\nif premake.c"
+ "onfig.isdebugbuild(cfg) then\n_p(2,'<NintendoSdkBuildType>Debug</NintendoSdkBuildType>')\nelse\n_p(2,'<NintendoSdkBuildType>Release</NintendoSdkBuildType>')\nend\nend\nif cfg.flags.Symbols and (premake.action.current() == premake.action.get(\"vs2017\") or is2019) then\n_p(2, '<DebugSymbols>true</DebugSymbols>')\nend\n_p(1,'</PropertyGroup>')\nend\nlocal function import_props(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,'<ImportGroup '..if_config_and_platform() ..' Label=\"PropertySheets\">'\n,premake.esc(cfginfo.name))\n_p(2,'<Import Project=\"$(UserRootDir)\\\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists(\\'$(UserRootDir)\\\\Microsoft.Cpp.$(Platform).user.props\\')\" Label=\"LocalAppDataPlatform\" />')\nif #cfg.propertysheets > 0 then\nlocal dirs = cfg.propertysheets\nfor _, dir in ipairs(dirs) do\nlocal translated = path.translate(dir)\n_p(2,'<Import Project=\"%s\" Condition=\"exists(\\'%s\\'"
+ ")\" />', translated, translated)\nend\nend\n_p(1,'</ImportGroup>')\nend\nend\nlocal function add_trailing_backslash(dir)\nif dir:len() > 0 and dir:sub(-1) ~= \"\\\\\" then\nreturn dir..\"\\\\\"\nend\nreturn dir\nend\nfunction vc2010.outputProperties(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nlocal target = cfg.buildtarget\nlocal outdir = add_trailing_backslash(target.directory)\nlocal intdir = add_trailing_backslash(iif(action.vstudio.intDirAbsolute\n, path.translate(\n path.join(prj.solution.location, cfg.objectsdir)\n, '\\\\')\n, cfg.objectsdir\n))\n_p(1,'<PropertyGroup '..if_config_and_platform() ..'>', premake.esc(cfginfo.name))\n_p(2,'<OutDir>%s</OutDir>', iif(outdir:len() > 0, premake.esc(outdir), \".\\\\\"))\nif cfg.platform == \"Xbox360\" then\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>', premake.esc(target.name))\nend\n_p(2,'<IntDir>%s</IntDir>', premake.esc(intdir))\n_p(2,'<TargetName>%s</TargetName"
+ ">', premake.esc(path.getbasename(target.name)))\n_p(2,'<TargetExt>%s</TargetExt>', premake.esc(path.getextension(target.name)))\nif cfg.kind == \"SharedLib\" then\nlocal ignore = (cfg.flags.NoImportLib ~= nil)\n_p(2,'<IgnoreImportLibrary>%s</IgnoreImportLibrary>', tostring(ignore))\nend\nif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\nif cfg.flags.Cpp17 then\n_p(2,'<CppLanguageStandard>Gnu++17</CppLanguageStandard>')\nelseif cfg.flags.Cpp20 then\n_p(2,'<CppLanguageStandard>Gnu++20</CppLanguageStandard>')\nend\nend\nif cfg.platform == \"Durango\" then\n_p(2, '<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>')\n_p(2, '<LibraryPath>$(Console_SdkLibPath)</LibraryPath>')\n_p(2, '<LibraryWPath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>')\n_p(2, '<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>')\n_p(2, '<ExecutablePath>$(Console_SdkRoot)bin;$(VCInstallDir)bin\\\\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstal"
+ "lDir)Common7\\\\Tools\\\\bin;$(VSInstallDir)Common7\\\\tools;$(VSInstallDir)Common7\\\\ide;$(ProgramFiles)\\\\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH);</ExecutablePath>')\nif cfg.imagepath then\n_p(2, '<LayoutDir>%s</LayoutDir>', cfg.imagepath)\nelse\n_p(2, '<LayoutDir>%s</LayoutDir>', prj.name)\nend\nif cfg.pullmappingfile ~= nil then\n_p(2,'<PullMappingFile>%s</PullMappingFile>', premake.esc(cfg.pullmappingfile))\nend\n_p(2, '<LayoutExtensionFilter>*.pdb;*.ilk;*.exp;*.lib;*.winmd;*.appxrecipe;*.pri;*.idb</LayoutExtensionFilter>')\n_p(2, '<IsolateConfigurationsOnDeploy>true</IsolateConfigurationsOnDeploy>')\nend\nif vstudio.isgdkconsole(cfg) then\n_p(2, '<ExecutablePath>$(Console_SdkRoot)bin;$(Console_SdkToolPath);$(ExecutablePath)</ExecutablePath>')\n_p(2, '<IncludePath>$(Console_SdkIncludeRoot)</IncludePath>')\n_p(2, '<ReferencePath>$(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</ReferencePath>')\n_p(2, '<LibraryPath>$(Console_SdkLibPath)</LibraryPath>')\n_p(2, '<LibraryWPath>$("
+ "Console_SdkLibPath);$(Console_SdkWindowsMetadataPath)</LibraryWPath>')\nend\nif vstudio.isgdkdesktop(cfg) then\n_p(2, '<IncludePath>$(Console_SdkIncludeRoot);$(IncludePath)</IncludePath>')\n_p(2, '<LibraryPath>$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>')\nend\nif cfg.kind ~= \"StaticLib\" then\n_p(2,'<LinkIncremental>%s</LinkIncremental>', tostring(premake.config.isincrementallink(cfg)))\nend\nif cfg.applicationdatadir ~= nil then\n_p(2,'<ApplicationDataDir>%s</ApplicationDataDir>', premake.esc(cfg.applicationdatadir))\nend\nif cfg.flags.NoManifest then\n_p(2,'<GenerateManifest>false</GenerateManifest>')\nend\n_p(1,'</PropertyGroup>')\nend\nend\nlocal function runtime(cfg)\nlocal runtime\nlocal flags = cfg.flags\nif premake.config.isdebugbuild(cfg) then\nruntime = iif(flags.StaticRuntime and not flags.Managed, \"MultiThreadedDebug\", \"MultiThreadedDebugDLL\")\nelse\nruntime = iif(flags.StaticRuntime and not flags.Managed, \"MultiThreaded\", \"MultiThreadedDLL\")\nend\nreturn runtime\nend\nlocal functi"
+ "on precompiled_header(cfg)\n if not cfg.flags.NoPCH and cfg.pchheader then\n_p(3,'<PrecompiledHeader>Use</PrecompiledHeader>')\n_p(3,'<PrecompiledHeaderFile>%s</PrecompiledHeaderFile>', cfg.pchheader)\nelse\n_p(3,'<PrecompiledHeader></PrecompiledHeader>')\nend\nend\nlocal function preprocessor(indent,cfg,escape)\nif #cfg.defines > 0 then\nlocal defines = table.concat(cfg.defines, \";\")\nif escape then\ndefines = defines:gsub('\"', '\\\\\"')\nend\nlocal isPreprocessorDefinitionPresent = string.find(defines, \"%%%(PreprocessorDefinitions%)\")\nif isPreprocessorDefinitionPresent then\n_p(indent,'<PreprocessorDefinitions>%s</PreprocessorDefinitions>'\n,premake.esc(defines))\nelse\n_p(indent,'<PreprocessorDefinitions>%s;%%(PreprocessorDefinitions)</PreprocessorDefinitions>'\n,premake.esc(defines))\nend\nelse\n_p(indent,'<PreprocessorDefinitions></PreprocessorDefinitions>')\nend\nend\nlocal function include_dirs(indent,cfg)\nlocal includedirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systeminclude"
+ "dirs)\nif #includedirs> 0 then\n_p(indent,'<AdditionalIncludeDirectories>%s;%%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>'\n,premake.esc(path.translate(table.concat(includedirs, \";\"), '\\\\')))\nend\nend\nlocal function include_resdirs(indent,cfg)\nif #cfg.resincludedirs> 0 then\n_p(indent,'<AdditionalIncludeDirectories>%s;%%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>'\n,premake.esc(path.translate(table.concat(cfg.resincludedirs, \";\"), '\\\\')))\nend\nend\nlocal function using_dirs(indent,cfg)\nif #cfg.usingdirs > 0 then\n_p(indent,'<AdditionalUsingDirectories>%s;%%(AdditionalUsingDirectories)</AdditionalUsingDirectories>'\n,premake.esc(path.translate(table.concat(cfg.usingdirs, \";\"), '\\\\')))\nend\nend\nlocal function resource_compile(cfg)\n_p(2,'<ResourceCompile>')\npreprocessor(3,cfg,true)\ninclude_resdirs(3,cfg)\n_p(2,'</ResourceCompile>')\nend\nlocal function cppstandard(cfg)\nif cfg.flags.CppLatest then\n_p(3, '<LanguageStandard>stdcpplatest</LanguageStandard>')"
+ "\n_p(3, '<EnableModules>true</EnableModules>')\nelseif cfg.flags.Cpp20 then\n_p(3, '<LanguageStandard>stdcpp20</LanguageStandard>')\nelseif cfg.flags.Cpp17 then\n_p(3, '<LanguageStandard>stdcpp17</LanguageStandard>')\nelseif cfg.flags.Cpp14 then\n_p(3, '<LanguageStandard>stdcpp14</LanguageStandard>')\nend\nend\nlocal function exceptions(cfg)\nif cfg.platform == \"Orbis\" then\nif cfg.flags.NoExceptions then\n_p(3, '<CppExceptions>false</CppExceptions>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nif cfg.flags.NoExceptions then\n_p(3, '<GccExceptionHandling>false</GccExceptionHandling>')\nend\nelseif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\nif cfg.flags.NoExceptions then\n_p(3, '<CppExceptions>false</CppExceptions>')\nelse\n_p(3, '<CppExceptions>true</CppExceptions>')\nend\nelse\nif cfg.flags.NoExceptions then\n_p(3, '<ExceptionHandling>false</ExceptionHandling>')\nelseif cfg.flags.SEH then\n_p(3, '<ExceptionHandling>Async</ExceptionHandling>')\nend\nend\nend\nlocal function rtti(cfg)"
+ "\nif cfg.flags.NoRTTI and not cfg.flags.Managed then\n_p(3,'<RuntimeTypeInfo>false</RuntimeTypeInfo>')\nend\nend\nlocal function calling_convention(cfg)\nif cfg.flags.FastCall then\n_p(3,'<CallingConvention>FastCall</CallingConvention>')\nelseif cfg.flags.StdCall then\n_p(3,'<CallingConvention>StdCall</CallingConvention>')\nend\nend\nlocal function wchar_t_builtin(cfg)\nif cfg.flags.NativeWChar then\n_p(3,'<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>')\nelseif cfg.flags.NoNativeWChar then\n_p(3,'<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>')\nend\nend\nlocal function sse(cfg)\nif cfg.flags.EnableSSE then\n_p(3, '<EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableSSE2 then\n_p(3, '<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableAVX then\n_p(3, '<EnableEnhancedInstructionSet>AdvancedVectorExtensions</EnableEnhancedInstructionSet>')\nelseif cfg.flags.EnableAVX2"
+ " then\n_p(3, '<EnableEnhancedInstructionSet>AdvancedVectorExtensions2</EnableEnhancedInstructionSet>')\nend\nend\nlocal function floating_point(cfg)\nif cfg.platform == \"Orbis\" then\nif cfg.flags.FloatFast then\n_p(3,'<FastMath>true</FastMath>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nelseif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\nif cfg.flags.FloatFast then\n_p(3, '<FastMath>true</FastMath>')\nend\nelse\nif cfg.flags.FloatFast then\n_p(3,'<FloatingPointModel>Fast</FloatingPointModel>')\nelseif cfg.flags.FloatStrict and not cfg.flags.Managed then\n_p(3,'<FloatingPointModel>Strict</FloatingPointModel>')\nend\nend\nend\nlocal function debug_info(cfg)\nlocal debug_info = ''\nif cfg.flags.Symbols then\nif cfg.flags.C7DebugInfo then\ndebug_info = \"OldStyle\"\nelseif (action.vstudio.supports64bitEditContinue == false and cfg.platform == \"x64\")\nor not premake.config.iseditandcontinue(cfg)\nthen\ndebug_info = \"ProgramDatabase\"\nelse\ndebug_info = \"EditAndContinue\"\nend\nend\n_p"
+ "(3,'<DebugInformationFormat>%s</DebugInformationFormat>',debug_info)\nend\nlocal function minimal_build(cfg)\nif premake.config.isdebugbuild(cfg) and cfg.flags.EnableMinimalRebuild then\n_p(3,'<MinimalRebuild>true</MinimalRebuild>')\nelse\n_p(3,'<MinimalRebuild>false</MinimalRebuild>')\nend\nend\nlocal function compile_language(cfg)\nif cfg.options.ForceCPP then\n_p(3,'<CompileAs>CompileAsCpp</CompileAs>')\nelse\nif cfg.language == \"C\" then\n_p(3,'<CompileAs>CompileAsC</CompileAs>')\nend\nend\nend\nlocal function forcedinclude_files(indent,cfg)\nif #cfg.forcedincludes > 0 then\n_p(indent,'<ForcedIncludeFiles>%s</ForcedIncludeFiles>'\n,premake.esc(path.translate(table.concat(cfg.forcedincludes, \";\"), '\\\\')))\nend\nend\nlocal function vs10_clcompile(cfg)\n_p(2,'<ClCompile>')\nlocal unsignedChar = \"/J \"\nlocal buildoptions = cfg.buildoptions\nif cfg.platform == \"Orbis\" then\nunsignedChar = \"-funsigned-char \";\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~"
+ "= nil))\nend\nif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\nunsignedChar = \"-funsigned-char \";\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nend\nif cfg.language == \"C\" and not cfg.options.ForceCPP then\nbuildoptions = table.join(buildoptions, cfg.buildoptions_c)\nelse\nbuildoptions = table.join(buildoptions, cfg.buildoptions_cpp)\nend\n_p(3,'<AdditionalOptions>%s %s%%(AdditionalOptions)</AdditionalOptions>'\n, table.concat(premake.esc(buildoptions), \" \")\n, iif(cfg.flags.UnsignedChar and cfg.platform ~= \"TegraAndroid\", unsignedChar, \" \")\n)\nif cfg.platform == \"TegraAndroid\" then\n_p(3,'<SignedChar>%s</SignedChar>', tostring(cfg.flags.UnsignedChar == nil))\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nif cfg.androidcppstandard then\n_p(3,'<CppLanguageStandard>%s</CppLanguageStandard>', cfg.androidcppstandard)\nend\nend\nif cfg.platform == \"Orbis\" then\nlocal opt = optim"
+ "isation(cfg)\nif opt == \"Disabled\" then\n_p(3,'<OptimizationLevel>Level0</OptimizationLevel>')\nelseif opt == \"MinSpace\" then\n_p(3,'<OptimizationLevel>Levelz</OptimizationLevel>') -- Oz is more aggressive than Os\nelseif opt == \"MaxSpeed\" then\n_p(3,'<OptimizationLevel>Level3</OptimizationLevel>')\nelse\n_p(3,'<OptimizationLevel>Level2</OptimizationLevel>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nlocal opt = optimisation(cfg)\nif opt == \"Disabled\" then\n_p(3,'<OptimizationLevel>O0</OptimizationLevel>')\nelseif opt == \"MinSpace\" then\n_p(3,'<OptimizationLevel>Os</OptimizationLevel>')\nelseif opt == \"MaxSpeed\" then\n_p(3,'<OptimizationLevel>O3</OptimizationLevel>')\nelse\n_p(3,'<OptimizationLevel>O2</OptimizationLevel>')\nend\nelseif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\nlocal opt = optimisation(cfg)\nif opt == \"Disabled\" then\n_p(3,'<OptimizationLevel>O0</OptimizationLevel>')\nelseif opt == \"MinSpace\" then\n_p(3,'<OptimizationLevel>Os</OptimizationLevel>')\nelse"
+ "if opt == \"MaxSpeed\" then\n_p(3,'<OptimizationLevel>O3</OptimizationLevel>')\nelse\n_p(3,'<OptimizationLevel>O2</OptimizationLevel>')\nend\nelse\n_p(3,'<Optimization>%s</Optimization>', optimisation(cfg))\nend\ninclude_dirs(3, cfg)\nusing_dirs(3, cfg)\npreprocessor(3, cfg)\nminimal_build(cfg)\nif premake.config.isoptimizedbuild(cfg.flags) then\nif cfg.flags.NoOptimizeLink and cfg.flags.NoEditAndContinue then\n_p(3, '<StringPooling>false</StringPooling>')\n_p(3, '<FunctionLevelLinking>false</FunctionLevelLinking>')\nelse\n_p(3, '<StringPooling>true</StringPooling>')\n_p(3, '<FunctionLevelLinking>true</FunctionLevelLinking>')\nend\nelse\n_p(3, '<FunctionLevelLinking>true</FunctionLevelLinking>')\nif cfg.flags.NoRuntimeChecks then\n_p(3, '<BasicRuntimeChecks>Default</BasicRuntimeChecks>')\nelseif not cfg.flags.Managed then\n_p(3, '<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>')\nend\nif cfg.flags.ExtraWarnings then\nend\nend\nif cfg.platform == \"Durango\" or cfg.flags.NoWinRT then\n_p(3, '<CompileA"
+ "sWinRT>false</CompileAsWinRT>')\nend\n_p(3, '<RuntimeLibrary>%s</RuntimeLibrary>', runtime(cfg))\nif cfg.flags.NoBufferSecurityCheck then\n_p(3, '<BufferSecurityCheck>false</BufferSecurityCheck>')\nend\nif not cfg.flags.NoMultiProcessorCompilation and not cfg.flags.EnableMinimalRebuild then\n_p(3, '<MultiProcessorCompilation>true</MultiProcessorCompilation>')\nelse\n_p(3, '<MultiProcessorCompilation>false</MultiProcessorCompilation>')\nend\nprecompiled_header(cfg)\nif cfg.platform == \"Orbis\" then\nif cfg.flags.PedanticWarnings then\n_p(3, '<Warnings>MoreWarnings</Warnings>')\n_p(3, '<ExtraWarnings>true</ExtraWarnings>')\nelseif cfg.flags.ExtraWarnings then\n_p(3, '<Warnings>NormalWarnings</Warnings>')\n_p(3, '<ExtraWarnings>true</ExtraWarnings>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<Warnings>WarningsOff</Warnings>')\n_p(3, '<ExtraWarnings>false</ExtraWarnings>')\nelse\n_p(3, '<Warnings>NormalWarnings</Warnings>')\n_p(3, '<ExtraWarnings>false</ExtraWarnings>')\nend\nif cfg.flags.FatalWarnings then"
+ "\n_p(3, '<WarningsAsErrors>true</WarningsAsErrors>')\nend\nelseif cfg.platform == \"TegraAndroid\" then\nif cfg.flags.PedanticWarnings or cfg.flags.ExtraWarnings then\n_p(3, '<Warnings>AllWarnings</Warnings>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<Warnings>DisableAllWarnings</Warnings>')\nelse\n_p(3, '<Warnings>NormalWarnings</Warnings>')\nend\nif cfg.flags.FatalWarnings then\n_p(3, '<WarningsAsErrors>true</WarningsAsErrors>')\nend\nelseif cfg.platform == \"NX32\" or cfg.platform == \"NX64\" then\nif cfg.flags.PedanticWarnings then\n_p(3, '<Warnings>MoreWarnings</Warnings>')\n_p(3, '<ExtraWarnings>true</ExtraWarnings>')\nelseif cfg.flags.ExtraWarnings then\n_p(3, '<Warnings>NormalWarnings</Warnings>')\n_p(3, '<ExtraWarnings>true</ExtraWarnings>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<Warnings>WarningsOff</Warnings>')\n_p(3, '<ExtraWarnings>false</ExtraWarnings>')\nelse\n_p(3, '<Warnings>NormalWarnings</Warnings>')\n_p(3, '<ExtraWarnings>false</ExtraWarnings>')\nend\nif cfg.flags.FatalWarnin"
+ "gs then\n_p(3, '<WarningsAsErrors>true</WarningsAsErrors>')\nend\nelse\nif cfg.flags.PedanticWarnings then\n_p(3, '<WarningLevel>EnableAllWarnings</WarningLevel>')\nelseif cfg.flags.ExtraWarnings then\n_p(3, '<WarningLevel>Level4</WarningLevel>')\nelseif cfg.flags.MinimumWarnings then\n_p(3, '<WarningLevel>Level1</WarningLevel>')\nelse\n_p(3 ,'<WarningLevel>Level3</WarningLevel>')\nend\nend\nif cfg.flags.FatalWarnings then\n_p(3, '<TreatWarningAsError>true</TreatWarningAsError>')\nend\nif premake.action.current() == premake.action.get(\"vs2017\") or\n premake.action.current() == premake.action.get(\"vs2019\") or\n premake.action.current() == premake.action.get(\"vs2022\") or\n premake.action.current() == premake.action.get(\"vs2026\") then\ncppstandard(cfg)\nend\nexceptions(cfg)\nrtti(cfg)\ncalling_convention(cfg)\nwchar_t_builtin(cfg)\nsse(cfg)\nfloating_point(cfg)\ndebug_info(cfg)\nif cfg.flags.Symbols then\nif cfg.kind == \"StaticLib\" then\n_p(3, '<ProgramDataBaseFileName>$(OutDir)%s.pdb</ProgramData"
+ "BaseFileName>'\n, path.getbasename(cfg.buildtarget.name)\n)\nelse\n_p(3, '<ProgramDataBaseFileName>$(IntDir)%s.compile.pdb</ProgramDataBaseFileName>'\n, path.getbasename(cfg.buildtarget.name)\n)\nend\nend\nif cfg.flags.Hotpatchable then\n_p(3, '<CreateHotpatchableImage>true</CreateHotpatchableImage>')\nend\nif cfg.flags.NoFramePointer then\n_p(3, '<OmitFramePointers>true</OmitFramePointers>')\nend\nif cfg.flags.UseFullPaths then\n_p(3, '<UseFullPaths>true</UseFullPaths>')\nend\nif cfg.flags.NoJMC then\n_p(3,'<SupportJustMyCode>false</SupportJustMyCode>' )\nend\ncompile_language(cfg)\nforcedinclude_files(3,cfg);\nif vstudio.diagformat then\n_p(3, '<DiagnosticsFormat>%s</DiagnosticsFormat>', vstudio.diagformat)\nelse\n_p(3, '<DiagnosticsFormat>Caret</DiagnosticsFormat>')\nend\n_p(2,'</ClCompile>')\nend\nlocal function event_hooks(cfg)\nif #cfg.postbuildcommands> 0 then\n _p(2,'<PostBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.postbuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</P"
+ "ostBuildEvent>')\nend\nif #cfg.prebuildcommands> 0 then\n _p(2,'<PreBuildEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prebuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreBuildEvent>')\nend\nif #cfg.prelinkcommands> 0 then\n _p(2,'<PreLinkEvent>')\n_p(3,'<Command>%s</Command>',premake.esc(table.implode(cfg.prelinkcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'</PreLinkEvent>')\nend\nend\nlocal function additional_options(indent,cfg)\nif #cfg.linkoptions > 0 then\n_p(indent,'<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>',\ntable.concat(premake.esc(cfg.linkoptions), \" \"))\nend\nend\nlocal function link_target_machine(index,cfg)\nlocal platforms = {x32 = 'MachineX86', x64 = 'MachineX64'}\nif platforms[cfg.platform] then\n_p(index,'<TargetMachine>%s</TargetMachine>', platforms[cfg.platform])\nend\nend\nlocal function item_def_lib(cfg)\nif cfg.kind == 'StaticLib' and cfg.platform ~= \"Xbox360\" then\n_p(1,'<Lib>')\n_p(2,'<OutputFile>$(OutDir)%s</OutputFile>',cfg.buil"
+ "dtarget.name)\nadditional_options(2,cfg)\nlink_target_machine(2,cfg)\n_p(1,'</Lib>')\nend\nend\nlocal function import_lib(cfg)\nif cfg.kind == \"SharedLib\" then\nlocal implibname = cfg.linktarget.fullpath\n_p(3,'<ImportLibrary>%s</ImportLibrary>',iif(cfg.flags.NoImportLib, cfg.objectsdir .. \"\\\\\" .. path.getname(implibname), implibname))\nend\nend\nlocal function hasmasmfiles(prj)\nlocal files = vc2010.getfilegroup(prj, \"MASM\")\nreturn #files > 0\nend\nlocal function ismanagedprj(prj, cfgname, pltname)\nlocal cfg = premake.getconfig(prj, cfgname, pltname)\nreturn cfg.flags.Managed == true\nend\nlocal function getcfglinks(cfg)\nlocal haswholearchive = #cfg.wholearchive > 0\nlocal msvcnaming = premake.getnamestyle(cfg) == \"windows\"\nlocal iscppprj = premake.iscppproject(cfg)\nlocal isnetprj = premake.isdotnetproject(cfg)\nlocal linkobjs = {}\nlocal links = iif(haswholearchive\n, premake.getlinks(cfg, \"all\", \"object\")\n, premake.getlinks(cfg, \"system\", \"fullpath\")\n)\nfor _, l"
+ "ink in ipairs(links) do\nlocal name = nil\nlocal directory = nil\nlocal whole = nil\nif type(link) == \"table\" then\nif not ismanagedprj(link.project, cfg.name, cfg.platform) then\nname = link.linktarget.basename\ndirectory = path.rebase(link.linktarget.directory, link.location, cfg.location)\nwhole = table.icontains(cfg.wholearchive, link.project.name)\nend\nelse\nname = link\nwhole = table.icontains(cfg.wholearchive, link)\nend\nif name then\nif haswholearchive and msvcnaming then\nif iscppprj then\nname = name .. \".lib\"\nelseif isnetprj then\nname = name .. \".dll\"\nend\nend\ntable.insert(linkobjs, {name=name, directory=directory, wholearchive=whole})\nend\nend\nreturn linkobjs\nend\nlocal function vs10_masm(prj, cfg)\nif hasmasmfiles(prj) then\n_p(2, '<MASM>')\n_p(3,'<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>'\n, table.concat(premake.esc(table.join(cfg.buildoptions, cfg.buildoptions_asm)), \" \")\n)\nlocal includedirs = table.join(cfg.userincludedirs, cfg"
+ ".includedirs, cfg.systemincludedirs)\nif #includedirs > 0 then\n_p(3, '<IncludePaths>%s;%%(IncludePaths)</IncludePaths>'\n, premake.esc(path.translate(table.concat(includedirs, \";\"), '\\\\'))\n)\nend\nlocal defines = table.join(cfg.defines)\ntable.insertflat(defines, iif(premake.config.isdebugbuild(cfg), \"_DEBUG\", {}))\ntable.insert(defines, iif(cfg.platform == \"x64\" or cfg.platform == \"ARM64\", \"_WIN64\", \"_WIN32\"))\ntable.insert(defines, iif(prj.kind == \"SharedLib\", \"_EXPORT=EXPORT\", \"_EXPORT=\"))\n_p(3, '<PreprocessorDefinitions>%s;%%(PreprocessorDefinitions)</PreprocessorDefinitions>'\n, premake.esc(table.concat(defines, \";\"))\n)\nif cfg.flags.FatalWarnings then\n_p(3,'<TreatWarningsAsErrors>true</TreatWarningsAsErrors>')\nend\nif cfg.flags.MinimumWarnings then\n_p(3,'<WarningLevel>0</WarningLevel>')\nelse\n_p(3,'<WarningLevel>3</WarningLevel>')\nend\n_p(2, '</MASM>')\nend\nend\nlocal function additional_manifest(cfg)\nif(cfg.dpiawareness ~= nil) then\n_p(2,'<Manifest>')\nif(cfg.dpiawarene"
+ "ss == \"None\") then\n_p(3, '<EnableDpiAwareness>false</EnableDpiAwareness>')\nend\nif(cfg.dpiawareness == \"High\") then\n_p(3, '<EnableDpiAwareness>true</EnableDpiAwareness>')\nend\nif(cfg.dpiawareness == \"HighPerMonitor\") then\n_p(3, '<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>')\nend\n_p(2,'</Manifest>')\nend\nend\nfunction vc2010.link(cfg)\nlocal vs2017OrLater = premake.action.current() == premake.action.get(\"vs2017\") or\n premake.action.current() == premake.action.get(\"vs2019\")\nlocal links = getcfglinks(cfg)\n_p(2,'<Link>')\n_p(3,'<SubSystem>%s</SubSystem>', iif(cfg.kind == \"ConsoleApp\", \"Console\", \"Windows\"))\nif vs2017OrLater and cfg.flags.FullSymbols then\n_p(3,'<GenerateDebugInformation>DebugFull</GenerateDebugInformation>')\nelse\n_p(3,'<GenerateDebugInformation>%s</GenerateDebugInformation>', tostring(cfg.flags.Symbols ~= nil))\nend\nif cfg.flags.Symbols then\n_p(3, '<ProgramDatabaseFile>$(OutDir)%s.pdb</ProgramDatabaseFile>'\n, path.getbasename(cfg.buildtarget."
+ "name)\n)\nend\nif premake.config.islinkeroptimizedbuild(cfg.flags) then\nif cfg.platform == \"Orbis\" then\n_p(3,'<DataStripping>StripFuncsAndData</DataStripping>')\n_p(3,'<DuplicateStripping>true</DuplicateStripping>')\nelse\n_p(3,'<EnableCOMDATFolding>true</EnableCOMDATFolding>')\n_p(3,'<OptimizeReferences>true</OptimizeReferences>')\nend\nelseif cfg.platform == \"Orbis\" and premake.config.iseditandcontinue(cfg) then\n_p(3,'<EditAndContinue>true</EditAndContinue>')\nend\nif cfg.finalizemetasource ~= nil then\n_p(3,'<FinalizeMetaSource>%s</FinalizeMetaSource>', premake.esc(cfg.finalizemetasource))\nend\nif cfg.kind ~= 'StaticLib' then\nvc2010.additionalDependencies(3, cfg, links)\nvc2010.additionalLibraryDirectories(3, cfg, links)\n_p(3,'<OutputFile>$(OutDir)%s</OutputFile>', cfg.buildtarget.name)\nif vc2010.config_type(cfg) == 'Application' and not cfg.flags.WinMain and not cfg.flags.Managed then\nif cfg.flags.Unicode then\n_p(3,'<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>')\nelse\n_p(3,'<EntryPoin"
+ "tSymbol>mainCRTStartup</EntryPointSymbol>')\nend\nend\nimport_lib(cfg)\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile then\n_p(3,'<ModuleDefinitionFile>%s</ModuleDefinitionFile>', deffile)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nif cfg.flags.NoWinMD and vstudio.iswinrt() and prj.kind == \"WindowedApp\" then\n_p(3,'<GenerateWindowsMetadata>false</GenerateWindowsMetadata>' )\nend\nend\nif cfg.platform == \"TegraAndroid\" then\nif cfg.androidlinker then\n_p(3,'<UseLinker>%s</UseLinker>',cfg.androidlinker)\nend\nend\nif cfg.flags.Hotpatchable then\n_p(3, '<CreateHotPatchableImage>Enabled</CreateHotPatchableImage>')\nend\nif cfg.flags.GenerateMapFiles then\n_p(3, '<GenerateMapFile>true</GenerateMapFile>')\nend\n_p(2,'</Link>')\nif #cfg.wholearchive > 0 then\n_p(2, '<ProjectReference>')\n_p(3, '<LinkLibraryDependencies>false</LinkLibraryDependencies>')\n_p(2, '</ProjectReference>')\nend\nend\nfunction vc2010.additionalLibraryDirectories(tab, cfg, links)\nlocal dirs = cfg.libdirs\nf"
+ "or _, link in ipairs(links) do\nif link.directory and not table.icontains(dirs, link.directory) then\ntable.insert(dirs, link.directory)\nend\nend\n_p(tab, '<AdditionalLibraryDirectories>%s;%%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>'\n, premake.esc(path.translate(table.concat(dirs, ';'), '\\\\'))\n)\nend\nfunction vc2010.additionalDependencies(tab, cfg, links)\nif #links > 0 then\nlocal deps = \"\"\nif cfg.platform == \"Orbis\" then\nlocal iswhole = false\nfor _, link in ipairs(links) do\nif link.wholearchive and not iswhole then\ndeps = deps .. \"--whole-archive;\"\niswhole = true\nelseif not link.wholearchive and iswhole then\ndeps = deps .. \"--no-whole-archive;\"\niswhole = false\nend\ndeps = deps .. \"-l\" .. link.name .. \";\"\nend\nelse\nfor _, link in ipairs(links) do\nif link.wholearchive then\ndeps = deps .. \"/WHOLEARCHIVE:\" .. link.name .. \";\"\nelse\ndeps = deps .. link.name .. \";\"\nend\nend\nend\nif cfg.platform == \"TegraAndroid\" then\ndeps = \"-Wl,--start-group;\" .. d"
+ "eps .. \";-Wl,--end-group\"\nend\nlocal adddeps =\n iif(cfg.platform == \"Durango\", '%(XboxExtensionsDependencies)'\n, iif(vstudio.isgdkconsole(cfg), '$(Console_Libs);%(XboxExtensionsDependencies);%(AdditionalDependencies)'\n, iif(vstudio.isgdkdesktop(cfg), '$(Console_Libs);%(AdditionalDependencies)'\n, '%(AdditionalDependencies)')))\n_p(tab, '<AdditionalDependencies>%s;%s</AdditionalDependencies>', deps, adddeps)\nelseif cfg.platform == \"Durango\" then\n_p(tab, '<AdditionalDependencies>%%(XboxExtensionsDependencies)</AdditionalDependencies>')\nelseif vstudio.isgdkconsole(cfg) then\n_p(tab, '<AdditionalDependencies>$(Console_Libs);%%(XboxExtensionsDependencies);%%(AdditionalDependencies)</AdditionalDependencies>')\nelseif vstudio.isgdkdesktop(cfg) then\n_p(tab, '<AdditionalDependencies>$(Console_Libs);%%(AdditionalDependencies)</AdditionalDependencies>')\nend\nend\nfunction ant_build(prj, cfg)\nif cfg.platform == \"TegraAndroid\" then\nlocal files = vc2"
+ "010.getfilegroup(prj, \"AndroidBuild\")\n_p(2,'<AntBuild>')\nif #files > 0 then\n_p(3,'<AndroidManifestLocation>%s</AndroidManifestLocation>',path.translate(files[1].name))\nend\nlocal isdebugbuild = premake.config.isdebugbuild(cfg)\n_p(3,'<AntBuildType>%s</AntBuildType>',iif(isdebugbuild, 'Debug','Release'))\n_p(3,'<Debuggable>%s</Debuggable>',tostring(cfg.flags.AntBuildDebuggable ~= nil))\nif #cfg.antbuildjavasourcedirs > 0 then\nlocal dirs = table.concat(cfg.antbuildjavasourcedirs,\";\")\n_p(3,'<JavaSourceDir>%s</JavaSourceDir>',dirs)\nend\nif #cfg.antbuildjardirs > 0 then\nlocal dirs = table.concat(cfg.antbuildjardirs,\";\")\n_p(3,'<JarDirectories>%s</JarDirectories>',dirs)\nend\nif #cfg.antbuildjardependencies > 0 then\nlocal dirs = table.concat(cfg.antbuildjardependencies,\";\")\n_p(3,'<JarDependencies>%s</JarDependencies>',dirs)\nend\nif #cfg.antbuildnativelibdirs > 0 then\nlocal dirs = table.concat(cfg.antbuildnativelibdirs,\";\")\n_p(3,'<NativeLibDirectories>%s</NativeLibDirectories>',dirs)\nend\nif #"
+ "cfg.antbuildnativelibdependencies > 0 then\nlocal dirs = table.concat(cfg.antbuildnativelibdependencies,\";\")\n_p(3,'<NativeLibDependencies>%s</NativeLibDependencies>',dirs)\nend\nif #cfg.antbuildassetsdirs > 0 then\nlocal dirs = table.concat(cfg.antbuildassetsdirs,\";\")\n_p(3,'<AssetsDirectories>%s</AssetsDirectories>',dirs)\nend\n_p(2,'</AntBuild>')\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,'<ItemDefinitionGroup ' ..if_config_and_platform() ..'>'\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nant_build(prj, cfg)\nevent_hooks(cfg)\nvs10_masm(prj, cfg)\nadditional_manifest(cfg)\n_p(1,'</ItemDefinitionGroup>')\nend\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {},\nClInclude = {},\nMASM = {},\nObject "
+ "= {},\nNone = {},\nResourceCompile = {},\nAppxManifest = {},\nAndroidBuild = {},\nNatvis = {},\nImage = {},\nDeploymentContent = {}\n}\nlocal foundAppxManifest = false\nfor file in premake.project.eachfile(prj, true) do\nif path.issourcefilevs(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\nif not table.icontains(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isobjectfile(file.name) then\ntable.insert(sortedfiles.Object, file)\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelseif path.isimagefile(file.name) then\ntable.insert(sortedfiles.Image, file)\nelseif path.isappxmanifest(file.name) then\nfoundAppxManifest = true\ntable.insert(sortedfiles.AppxManifest, file)\nelseif path.isandroidbuildfile(file.name) then\ntable.insert(sortedfiles.AndroidBuild, file)\nelseif path.isnatvis(file.name) then\ntable.insert(sortedfiles.Natvis, file)\nelseif path.isasmfile(file.name) then"
+ "\ntable.insert(sortedfiles.MASM, file)\nelseif file.flags and table.icontains(file.flags, \"DeploymentContent\") then\ntable.insert(sortedfiles.DeploymentContent, file)\nelse\ntable.insert(sortedfiles.None, file)\nend\nend\nif vstudio.iswinrt() and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \"/Package.appxmanifest\"\nfcfg.vpath = premake.project.getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nlocal logo = {}\nlogo.name = prj.name .. \"/Logo.png\"\nlogo.vpath = logo.name\ntable.insert(sortedfiles.Image, logo)\nlocal smallLogo = {}\nsmallLogo.name = prj.name .. \"/SmallLogo.png\"\nsmallLogo.vpath = smallLogo.name\ntable.insert(sortedfiles.Image, smallLogo)\nlocal storeLogo = {}\nstoreLogo.name = prj.name .. \"/StoreLogo.png\"\nstoreLogo.vpath = storeLogo.name\ntable.insert(sortedfiles.Image, storeLogo)\nlocal splashScreen = {}\nsplashScreen.name = prj.name .. \"/SplashScreen.png\"\nsplashScreen."
+ "vpath = splashScreen.name\ntable.insert(sortedfiles.Image, splashScreen)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"Object\")\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.customtaskgroup(prj)\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\nvc2010.simplefilesgroup(prj, \"AppxManifest\")\nvc2010.simplefilesgroup(prj, \"AndroidBuild\")\nvc2010.simplefilesgroup(prj, \"Natvis\")\nvc2010.deploymentcontentgroup(prj, \"Image\")\nvc2010.deploymentcontentgroup(prj, \"DeploymentContent\", \"None\")\nend\nfunction vc2010.customtaskgroup(prj)\nlocal files = { }\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal fcfg = { }\nfcfg.name = path.getrelative(prj.location,buildtask[1])\nfcfg.vpath = path.trimdots(fcfg.name)\ntable.insert(files, fcfg)\nend\nend\nif #files > 0 then"
+ "\n_p(1,'<ItemGroup>')\nlocal groupedBuildTasks = {}\nlocal buildTaskNames = {}\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nif (groupedBuildTasks[buildtask[1]] == nil) then\ngroupedBuildTasks[buildtask[1]] = {}\ntable.insert(buildTaskNames, buildtask[1])\nend\ntable.insert(groupedBuildTasks[buildtask[1]], buildtask)\nend\nend\nfor _, name in ipairs(buildTaskNames) do\ncustombuildtask = groupedBuildTasks[name]\n_p(2,'<CustomBuild Include=\\\"%s\\\">', path.translate(path.getrelative(prj.location,name), \"\\\\\"))\n_p(3,'<FileType>Text</FileType>')\nlocal cmd = \"\"\nlocal outputs = \"\"\nfor _, buildtask in ipairs(custombuildtask or {}) do\nfor _, cmdline in ipairs(buildtask[4] or {}) do\ncmd = cmd .. cmdline\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \",path.getrelative(prj.location,depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, \"%$%(<%)\", "
+ "string.format(\"%s \",path.getrelative(prj.location,buildtask[1])))\ncmd = string.gsub(cmd, \"%$%(@%)\", string.format(\"%s \",path.getrelative(prj.location,buildtask[2])))\ncmd = cmd .. \"\\r\\n\"\nend\noutputs = outputs .. path.getrelative(prj.location,buildtask[2]) .. \";\"\nend\n_p(3,'<Command>%s</Command>',cmd)\n_p(3,'<Outputs>%s%%(Outputs)</Outputs>',outputs)\n_p(3,'<SubType>Designer</SubType>')\n_p(3,'<Message></Message>')\n_p(2,'</CustomBuild>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\nlocal prjexcl"
+ "uded = table.icontains(prj.excludes, file.name)\nlocal excludedcfgs = {}\nif not prjexcluded then\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal fileincfg = table.icontains(cfg.files, file.name)\nlocal cfgexcluded = table.icontains(cfg.excludes, file.name)\nif not fileincfg or cfgexcluded then\ntable.insert(excludedcfgs, vsconfig.name)\nend\nend\nend\nif subtype or prjexcluded or #excludedcfgs > 0 then\n_p(2, '<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\nif prjexcluded then\n_p(3, '<ExcludedFromBuild>true</ExcludedFromBuild>')\nelse\nfor _, cfgname in ipairs(excludedcfgs) do\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(cfgname)\n)\nend\nend\nif subtype then\n_p(3, '<SubType>%s</SubType>', subtype)\nend\n_p(2,'</%s>', section)\nelse\n_p(2, '<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\nend\nend\n_p(1,'</ItemGroup>')"
+ "\nend\nend\nfunction vc2010.deploymentcontentgroup(prj, section, filetype)\nif filetype == nil then\nfiletype = section\nend\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'<ItemGroup>')\nfor _, file in ipairs(files) do\n_p(2,'<%s Include=\\\"%s\\\">', filetype, path.translate(file.name, \"\\\\\"))\n_p(3,'<DeploymentContent>true</DeploymentContent>')\n_p(3,'<Link>%s</Link>', path.translate(file.vpath, \"\\\\\"))\n_p(2,'</%s>', filetype)\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.compilerfilesgroup(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'<ItemGroup>')\nlocal existingBasenames = {};\nfor _, file i"
+ "n ipairs(files) do\nlocal filename = string.lower(path.getbasename(file.name))\nlocal disambiguation = existingBasenames[filename] or 0;\nexistingBasenames[filename] = disambiguation + 1\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '<ClCompile Include=\\\"%s\\\">', translatedpath)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal namestyle = premake.getnamestyle(cfg)\nif namestyle == \"TegraAndroid\" or namestyle == \"NX\" then\n_p(3, '<ObjectFileName '.. if_config_and_platform() .. '>$(IntDir)%s.o</ObjectFileName>', premake.esc(vsconfig.name), premake.esc(path.translate(path.trimdots(path.removeext(file.name)))) )\nelse\nif disambiguation > 0 then\n_p(3, '<ObjectFileName '.. if_config_and_platform() .. '>$(IntDir)%s\\\\</ObjectFileName>', premake.esc(vsconfig.name), tostring(disambiguation))\nend\nend\nend\nif path.iscxfile(file.name) then\n_p(3, '<CompileAsWinRT>true</CompileAsWinRT>')\n_p(3, '<RuntimeTypeInfo"
+ ">true</RuntimeTypeInfo>')\n_p(3, '<PrecompiledHeader>NotUsing</PrecompiledHeader>')\nend\nif vstudio.iswinrt() and string.len(file.name) > 2 and string.sub(file.name, -2) == \".c\" then\n_p(3,'<CompileAsWinRT>FALSE</CompileAsWinRT>')\nend\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'<PrecompiledHeader '.. if_config_and_platform() .. '>Create</PrecompiledHeader>', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend\nend\nlocal nopch = table.icontains(prj.nopch, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nif nopch or table.icontains(cfg.nopch, file.name) then\n_p(3,'<PrecompiledHeader '.. if_config_and_platform() .. '>NotUsing</PrecompiledHeader>', premake.esc(vsconfig.name))\nend\nend\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake"
+ ".getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal fileincfg = table.icontains(cfg.files, file.name)\nlocal cfgexcluded = table.icontains(cfg.excludes, file.name)\nif excluded or not fileincfg or cfgexcluded then\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(vsconfig.name)\n)\nend\nend\nif prj.flags and prj.flags.Managed then\nlocal prjforcenative = table.icontains(prj.forcenative, file.name)\nfor _,vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nif prjforcenative or table.icontains(cfg.forcenative, file.name) then\n_p(3, '<CompileAsManaged ' .. if_config_and_platform() .. '>false</CompileAsManaged>', premake.esc(vsconfig.name))\nend\nend\nend\n_p(2,'</ClCompile>')\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.masmfiles(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"MASM\")\nif #files > 0 then\n_p(1, '<ItemGroup>')\n"
+ "for _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '<MASM Include=\"%s\">', translatedpath)\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nlocal fileincfg = table.icontains(cfg.files, file.name)\nlocal cfgexcluded = table.icontains(cfg.excludes, file.name)\nif excluded or not fileincfg or cfgexcluded then\n_p(3, '<ExcludedFromBuild '\n.. if_config_and_platform()\n.. '>true</ExcludedFromBuild>'\n, premake.esc(vsconfig.name)\n)\nend\nend\n_p(2, '</MASM>')\nend\n_p(1, '</ItemGroup>')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\n_p('<!-- Generated by GENie https://github.com/bkaradzic/GENie -->')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('<Project%s ToolsVersion=\"%s\" xmlns=\"http://schemas.microsoft.com/developer/msbuild"
+ "/2003\">', t, action.vstudio.toolsVersion)\nend\nfunction premake.vs2010_vcxproj(prj)\nlocal usemasm = hasmasmfiles(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.Default.props\" />')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'<Import Project=\"$(VCTargetsPath)\\\\Microsoft.Cpp.props\" />')\n_p(1,'<ImportGroup Label=\"ExtensionSettings\">')\nif usemasm then\n_p(2, '<Import Project=\"$(VCTargetsPath)\\\\BuildCustomizations\\\\masm.props\" />')\nend\n_p(1,'</ImportGroup>')\nimport_props(prj)\n_p(1,'<PropertyGroup Label=\"UserMacros\" />')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.clrReferences(prj)\nvc2010.projectReferences(prj)\nvc2010.sdkReferences(prj)\nvc2010.masmfiles(prj)\n_p(1,'<Import Project=\"$(VCTargetsPath)"
+ "\\\\Microsoft.Cpp.targets\" />')\n_p(1,'<ImportGroup Label=\"ExtensionTargets\">')\nif usemasm then\n_p(2, '<Import Project=\"$(VCTargetsPath)\\\\BuildCustomizations\\\\masm.targets\" />')\nend\n_p(1,'</ImportGroup>')\n_p('</Project>')\nend\nfunction vc2010.clrReferences(prj)\nif #prj.clrreferences == 0 then\nreturn\nend\n_p(1,'<ItemGroup>')\nfor _, ref in ipairs(prj.clrreferences) do\nif os.isfile(ref) then\nlocal assembly = path.getbasename(ref)\n_p(2,'<Reference Include=\"%s\">', assembly)\n_p(3,'<HintPath>%s</HintPath>', path.getrelative(prj.location, ref))\n_p(2,'</Reference>')\nelse\n_p(2,'<Reference Include=\"%s\" />', ref)\nend\nend\n_p(1,'</ItemGroup>')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps == 0 and #prj.vsimportreferences == 0 then\nreturn\nend\nlocal function compareuuid(a, b) return a.uuid < b.uuid end\ntable.sort(deps, compareuuid)\ntable.sort(table.join(prj.vsimportreferences), compareuuid)\n_p(1,'<ItemGroup>')\nfor _, dep in ipairs(deps"
+ ") do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'<ProjectReference Include=\\\"%s\\\">', path.translate(deppath, \"\\\\\"))\n_p(3,'<Project>{%s}</Project>', dep.uuid)\nif vstudio.iswinrt() then\n_p(3,'<ReferenceOutputAssembly>false</ReferenceOutputAssembly>')\nend\n_p(2,'</ProjectReference>')\nend\nfor _, ref in ipairs(prj.vsimportreferences) do\nlocal slnrelpath = path.rebase(ref, prj.location, sln.location)\nlocal iprj = premake.vstudio.getimportprj(slnrelpath, prj.solution)\n_p(2,'<ProjectReference Include=\\\"%s\\\">', ref)\n_p(3,'<Project>{%s}</Project>', iprj.uuid)\n_p(2,'</ProjectReference>')\nend\n_p(1,'</ItemGroup>')\nend\nfunction vc2010.sdkReferences(prj)\nlocal refs = prj.sdkreferences\nif #refs > 0 then\n_p(1,'<ItemGroup>')\nfor _, ref in ipairs(refs) do\n_p(2,'<SDKReference Include=\\\"%s\\\" />', ref)\nend\n_p(1,'</ItemGroup>')\nend\nend\nfunction vc2010.debugdir(cfg)\nlocal isnx = (cfg.platform == \"NX32\" or cfg.platform == \"NX64\")\nlocal debuggerFlavor ="
+ "\n iif(isnx, 'OasisNXDebugger'\n, iif(cfg.platform == \"Orbis\", 'ORBISDebugger'\n, iif(cfg.platform == \"Durango\", 'XboxOneVCppDebugger'\n, iif(cfg.platform == \"TegraAndroid\", 'AndroidDebugger'\n, iif(vstudio.iswinrt(), 'AppHostLocalDebugger'\n, 'WindowsLocalDebugger'\n)))))\n_p(2, '<DebuggerFlavor>%s</DebuggerFlavor>', debuggerFlavor)\nif cfg.debugdir and not vstudio.iswinrt() then\n_p(2, '<LocalDebuggerWorkingDirectory>%s</LocalDebuggerWorkingDirectory>'\n, path.translate(cfg.debugdir, '\\\\')\n)\nend\nif cfg.debugcmd then\n_p(2, '<LocalDebuggerCommand>%s</LocalDebuggerCommand>', cfg.debugcmd)\nend\nif cfg.debugargs then\n_p(2, '<LocalDebuggerCommandArguments>%s</LocalDebuggerCommandArguments>'\n, table.concat(cfg.debugargs, \" \")\n)\nend\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2, '<LocalDebuggerEnvironment>%s%s</LocalDebuggerEnvironment>'\n, table.concat(cfg.debugenvs, \"\\n\")\n, iif(cfg.flags.DebugEnvsIn"
+ "herit,'\\n$(LocalDebuggerEnvironment)', '')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2, '<LocalDebuggerMergeEnvironment>false</LocalDebuggerMergeEnvironment>')\nend\nend\nif cfg.deploymode then\n_p(2, '<DeployMode>%s</DeployMode>', cfg.deploymode)\nend\nif cfg.platform == \"TegraAndroid\" then\nif cfg.androiddebugintentparams then\n_p(2, '<IntentParams>%s</IntentParams>'\n, table.concat(cfg.androiddebugintentparams, \" \")\n)\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' <PropertyGroup '.. if_config_and_platform() ..'>', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\n_p(' </PropertyGroup>')\nend\n_p('</Project>')\nend\nlocal png1x1data = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, -- .PNG........IHDR\n0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x"
+ "03, 0x00, 0x00, 0x00, 0x25, 0xdb, 0x56, -- .............%.V\n0xca, 0x00, 0x00, 0x00, 0x03, 0x50, 0x4c, 0x54, 0x45, 0x00, 0x00, 0x00, 0xa7, 0x7a, 0x3d, 0xda, -- .....PLTE....z=.\n0x00, 0x00, 0x00, 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, -- ....tRNS.@..f...\n0x0a, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xe2, -- .IDAT..c`.......\n0x21, 0xbc, 0x33, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, -- !.3....IEND.B`.\n}\nfunction png1x1(obj, filename)\nfilename = premake.project.getfilename(obj, filename)\nlocal f, err = io.open(filename, \"wb\")\nif f then\nfor _, byte in ipairs(png1x1data) do\nf:write(string.char(byte))\nend\nf:close()\nend\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('<?xml version=\"1.0\" encoding=\"utf-8\"?>')\nif vstudio.storeapp == \"10.0\" then\n_p('<Package')\n_p(1, 'xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windo"
+ "ws10\"')\n_p(1, 'xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"')\n_p(1, 'xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"')\n_p(1, 'IgnorableNamespaces=\"uap mp\">')\nelseif vstudio.storeapp == \"durango\" then\n_p('<Package xmlns=\"http://schemas.microsoft.com/appx/2010/manifest\" xmlns:mx=\"http://schemas.microsoft.com/appx/2013/xbox/manifest\" IgnorableNamespaces=\"mx\">')\nend\n_p(1, '<Identity')\n_p(2, 'Name=\"' .. prj.uuid .. '\"')\n_p(2, 'Publisher=\"CN=Publisher\"')\n_p(2, 'Version=\"1.0.0.0\" />')\nif vstudio.storeapp == \"10.0\" then\n_p(1, '<mp:PhoneIdentity')\n_p(2, 'PhoneProductId=\"' .. prj.uuid .. '\"')\n_p(2, 'PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>')\nend\n_p(1, '<Properties>')\n_p(2, '<DisplayName>' .. prj.name .. '</DisplayName>')\n_p(2, '<PublisherDisplayName>PublisherDisplayName</PublisherDisplayName>')\n_p(2, '<Logo>' .. prj.name .. '\\\\StoreLogo.png</Logo>')\npng1x1(prj, \"%%/StoreLogo.png\")\n_p(2, '<Description>' .. prj.na"
+ "me .. '</Description>')\n_p(1,'</Properties>')\nif vstudio.storeapp == \"10.0\" then\n_p(1, '<Dependencies>')\n_p(2, '<TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.10069.0\" MaxVersionTested=\"10.0.10069.0\" />')\n_p(1, '</Dependencies>')\nelseif vstudio.storeapp == \"durango\" then\n_p(1, '<Prerequisites>')\n_p(2, '<OSMinVersion>6.2</OSMinVersion>')\n_p(2, '<OSMaxVersionTested>6.2</OSMaxVersionTested>')\n_p(1, '</Prerequisites>')\nend\n_p(1, '<Resources>')\n_p(2, '<Resource Language=\"en-us\"/>')\n_p(1, '</Resources>')\n_p(1, '<Applications>')\n_p(2, '<Application Id=\"App\"')\n_p(3, 'Executable=\"$targetnametoken$.exe\"')\n_p(3, 'EntryPoint=\"' .. prj.name .. '.App\">')\nif vstudio.storeapp == \"10.0\" then\n_p(3, '<uap:VisualElements')\n_p(4, 'DisplayName=\"' .. prj.name .. '\"')\n_p(4, 'Square150x150Logo=\"' .. prj.name .. '\\\\Logo.png\"')\npng1x1(prj, \"%%/Logo.png\")\nif vstudio.storeapp == \"10.0\" then\n_p(4, 'Square44x44Logo=\"' .. prj.name .. '\\\\SmallLogo.png\"')\npng1x1(prj, \""
+ "%%/SmallLogo.png\")\nelse\n_p(4, 'Square30x30Logo=\"' .. prj.name .. '\\\\SmallLogo.png\"')\npng1x1(prj, \"%%/SmallLogo.png\")\nend\n_p(4, 'Description=\"' .. prj.name .. '\"')\n_p(4, 'BackgroundColor=\"transparent\">')\n_p(4, '<uap:SplashScreen Image=\"' .. prj.name .. '\\\\SplashScreen.png\" />')\npng1x1(prj, \"%%/SplashScreen.png\")\n_p(3, '</uap:VisualElements>')\nelseif vstudio.storeapp == \"durango\" then\n_p(3, '<VisualElements')\n_p(4, 'DisplayName=\"' .. prj.name .. '\"')\n_p(4, 'Logo=\"' .. prj.name .. '\\\\Logo.png\"')\npng1x1(prj, \"%%/Logo.png\")\n_p(4, 'SmallLogo=\"' .. prj.name .. '\\\\SmallLogo.png\"')\npng1x1(prj, \"%%/SmallLogo.png\")\n_p(4, 'Description=\"' .. prj.name .. '\"')\n_p(4, 'ForegroundText=\"light\"')\n_p(4, 'BackgroundColor=\"transparent\">')\n_p(5, '<SplashScreen Image=\"' .. prj.name .. '\\\\SplashScreen.png\" />')\npng1x1(prj, \"%%/SplashScreen.png\")\n_p(3, '</VisualElements>')\n_p(3, '<Extensions>')\n_p(4, '<mx:Extension Category=\"xbox.system.resources\">')\n_p(4, '<mx:Xbox"
+ "SystemResources />')\n_p(4, '</mx:Extension>')\n_p(3, '</Extensions>')\nend\n_p(2, '</Application>')\n_p(1, '</Applications>')\n_p('</Package>')\nend\n",
/* actions/vstudio/vstudio_vcxproj_filters.lua */
"local vc2010 = premake.vstudio.vc2010\nlocal project = premake.project\nfunction vc2010.filteridgroup(prj)\nlocal filters = { }\nlocal filterfound = false\nfor file in premake.project.eachfile(prj, true) do\nlocal folders = string.explode(file.vpath, \"/\", true)\nlocal path = \"\"\nfor i = 1, #folders - 1 do\nif not filterfound then\nfilterfound = true\n_p(1,'<ItemGroup>')\nend\npath = path .. folders[i]\nif not filters[path] then\nfilters[path] = true\n_p(2, '<Filter Include=\"%s\">', path)\n_p(3, '<UniqueIdentifier>{%s}</UniqueIdentifier>', os.uuid(path))\n_p(2, '</Filter>')\nend\npath = path .. \"\\\\\"\nend\nend\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal folders = string.explode(path.trimdots(path.getrelative(prj.location,buildtask[1])), \"/\", true)\nlocal path = \"\"\nfor i = 1, #folders - 1 do\nif not filterfound then\nfilterfound = true\n_p(1,'<ItemGroup>')\nend\npath = path .. folders[i]\nif not filters[path] then\nfilt"
@@ -367,9 +404,13 @@ const char* builtin_scripts[] = {
"premake.vstudio.vc2019 = {}\nlocal vc2019 = premake.vstudio.vc2019\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vs2019\",\nshortname = \"Visual Studio 2019\",\ndescription = \"Generate Microsoft Visual Studio 2019 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.vstudio.needAppxManifest = false\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.v"
"cxproj.filters\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%/Package.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.7.2\",\ntoolsVersion = \"16.0\",\nwindowsTargetPlatformVersion = \"10.0\",\nsupports64bitEditContinue = true,\nintDirAbsolute = false,\n}\n}\n",
- /* actions/vstudio/vsllvm.lua */
- "premake.vstudio.vcllvm = {}\nlocal vcllvm = premake.vstudio.vcllvm\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vsllvm\",\nshortname = \"Visual Studio LLVM\",\ndescription = \"Generate Microsoft Visual Studio LLVM project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.vstudio.needAppxManifest = false\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.v"
- "cxproj.filters\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%/Package.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.5.2\",\ntoolsVersion = \"15.0\",\nwindowsTargetPlatformVersion = \"8.1\",\nsupports64bitEditContinue = true,\nintDirAbsolute = true,\n}\n}\n",
+ /* actions/vstudio/vs2022.lua */
+ "premake.vstudio.vc2022 = {}\nlocal vc2022 = premake.vstudio.vc2022\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vs2022\",\nshortname = \"Visual Studio 2022\",\ndescription = \"Generate Microsoft Visual Studio 2022 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.vstudio.needAppxManifest = false\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.v"
+ "cxproj.filters\", vstudio.vc2010.generate_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%/Package.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"12\",\ntargetFramework = \"4.7.2\",\ntoolsVersion = \"16.0\",\nwindowsTargetPlatformVersion = \"10.0\",\nsupports64bitEditContinue = true,\nintDirAbsolute = false,\n}\n}\n",
+
+ /* actions/vstudio/vs2026.lua */
+ "premake.vstudio.vc2026 = {}\nlocal vstudio = premake.vstudio\nnewaction\n{\ntrigger = \"vs2026\",\nshortname = \"Visual Studio 2026\",\ndescription = \"Generate Microsoft Visual Studio 2026 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.slnx\", vstudio.slnx.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.vstudio.needAppxManifest = false\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filters\", vstudio.vc2010.generate"
+ "_filters)\nif premake.vstudio.needAppxManifest then\npremake.generate(prj, \"%%/Package.appxmanifest\", premake.vs2010_appxmanifest)\nend\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nsolutionVersion = \"slnx\",\ntargetFramework = \"4.7.2\",\ntoolsVersion = \"16.0\",\nwindowsTargetPlatformVersion = \"10.0\",\nsupports64bitEditContinue = true,\nintDirAbsolute = false,\n}\n}\n",
/* actions/xcode/_xcode.lua */
"premake.xcode = { }\nfunction premake.xcode.checkproject(prj)\nlocal last\nfor cfg in premake.eachconfig(prj) do\nif last and last ~= cfg.kind then\nerror(\"Project '\" .. prj.name .. \"' uses more than one target kind; not supported by Xcode\", 0)\nend\nlast = cfg.kind\nend\nend\npremake.xcode.toolset = \"macosx\"\n",
@@ -382,28 +423,29 @@ const char* builtin_scripts[] = {
"textension(node.path)] or\n(types[string.lower(path.getextension(node.path))] or \"text\")\nend\nfunction xcode.getproducttype(node)\nlocal types = {\nConsoleApp = \"com.apple.product-type.tool\",\nWindowedApp = node.cfg.options.SkipBundling and \"com.apple.product-type.tool\" or \"com.apple.product-type.application\",\nStaticLib = \"com.apple.product-type.library.static\",\nSharedLib = \"com.apple.product-type.library.dynamic\",\nBundle = node.cfg.options.SkipBundling and \"com.apple.product-type.tool\" or \"com.apple.product-type.bundle\",\n}\nreturn types[node.cfg.kind]\nend\nfunction xcode.gettargettype(node)\nlocal types = {\nConsoleApp = \"\\\"compiled.mach-o.executable\\\"\",\nWindowedApp = node.cfg.options.SkipBundling and \"\\\"compiled.mach-o.executable\\\"\" or \"wrapper.application\",\nStaticLib = \"archive.ar\",\nSharedLib = \"\\\"compiled.mach-o.dylib\\\"\",\nBundle = node.cfg.options.SkipBundling and \"\\\"compiled.mach-o.bundle\\\"\" or \"wrapper.cfbundle\",\n}\nreturn types"
"[node.cfg.kind]\nend\nfunction xcode.getxcodeprojname(prj)\nlocal fname = premake.project.getfilename(prj, \"%%.xcodeproj\")\nreturn fname\nend\nfunction xcode.isframework(fname)\nreturn (path.getextension(fname) == \".framework\" or path.getextension(fname) == \".tbd\")\nend\nfunction xcode.uuid(param)\nreturn os.uuid(param):upper():gsub('-',''):sub(0,24)\nend\nfunction xcode.newid(node, usage)\nlocal base = ''\nlocal prj = node.project\nif prj == nil then\nlocal parent = node.parent\nwhile parent ~= nil do\nif parent.project ~= nil then\nprj = parent.project\nbreak\nend\nparent = parent.parent\nend\nend\nif prj ~= nil then\nprj.uuidcounter = (prj.uuidcounter or 0) + 1\nbase = base .. prj.name .. \"$\" .. prj.uuidcounter .. \"$\"\nend\nbase = base .. \"$\" .. (node.path or node.name or \"\")\nbase = base .. \"$\" .. (usage or \"\")\nreturn xcode.uuid(base)\nend\nfunction xcode.getscriptphaselabel(cmd, count, cfg)\nreturn string.format(\"\\\"Script Phase %s [%s] (%s)\\\"\", count, cmd:match(\"(%w+)(.+)\"), iif"
"(cfg, xcode.getconfigname(cfg), \"all\"))\nend\nfunction xcode.getcopyphaselabel(type, count, target)\nreturn string.format(\"\\\"Copy %s %s [%s]\\\"\", type, count, target)\nend\nfunction xcode.preparesolution(sln)\nsln.xcode = { }\nsln.xcode.platforms = premake.filterplatforms(sln, premake.action.current().valid_platforms, \"Universal\")\nfor prj in premake.solution.eachproject(sln) do\nlocal cfg = premake.getconfig(prj, prj.configurations[1], sln.xcode.platforms[1])\nlocal node = premake.tree.new(path.getname(cfg.buildtarget.bundlepath))\nnode.cfg = cfg\nnode.id = premake.xcode.newid(node, \"product\")\nnode.targetid = premake.xcode.newid(node, \"target\")\nprj.xcode = {}\nprj.xcode.projectnode = node\nend\nend\nfunction xcode.printlist(list, tag, sort)\nif #list > 0 then\nif sort ~= nil and sort == true then\ntable.sort(list)\nend\n_p(4,'%s = (', tag)\nfor _, item in ipairs(list) do\nlocal escaped_item = item:gsub(\"\\\"\", \"\\\\\\\\\\\\\\\"\"):gsub(\"'\", \"\\\\\\\\'\")\n_p(5, '\"%s\",', escaped_item)\ne"
- "nd\n_p(4,');')\nend\nend\nfunction xcode.quotestr(str)\nif str:match(\"[^a-zA-Z0-9$._/]\") == nil then\nreturn str\nend\nreturn \"\\\"\" .. str:gsub(\"[\\\"\\\\\\\"]\", \"\\\\%0\") .. \"\\\"\"\nend\nfunction xcode.Header(tr, objversion)\n_p('// !$*UTF8*$!')\n_p('{')\n_p(1,'archiveVersion = 1;')\n_p(1,'classes = {')\n_p(1,'};')\n_p(1,'objectVersion = %d;', objversion)\n_p(1,'objects = {')\n_p('')\nend\nfunction xcode.PBXBuildFile(tr)\nlocal function gatherCopyFiles(which)\nlocal copyfiles = {}\nlocal targets = tr.project[which]\nif #targets > 0 then\nfor _, t in ipairs(targets) do\nfor __, tt in ipairs(t) do\ntable.insertflat(copyfiles, tt[2])\nend\nend\nend\nreturn table.translate(copyfiles, path.getname)\nend\nlocal function gatherCopyFrameworks(which)\nlocal copyfiles = {}\nlocal targets = tr.project[which]\nif #targets > 0 then\ntable.insertflat(copyfiles, targets)\nend\nreturn table.translate(copyfiles, path.getname)\nend\nlocal copyfiles = table.flatten({\ngatherCopyFiles('xcodecopyresources'),\ngatherCop"
- "yFrameworks('xcodecopyframeworks')\n})\n_p('/* Begin PBXBuildFile section */')\ntree.traverse(tr, {\nonnode = function(node)\nif node.buildid then\n_p(2,'%s /* %s in %s */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };',\nnode.buildid, node.name, xcode.getbuildcategory(node), node.id, node.name)\nend\nif table.icontains(copyfiles, node.name) then\n_p(2,'%s /* %s in %s */ = {isa = PBXBuildFile; fileRef = %s /* %s */; %s };',\nxcode.uuid(node.name .. 'in CopyFiles'), node.name, 'CopyFiles', node.id, node.name,\niif(xcode.isframework(node.name), \"settings = {ATTRIBUTES = (CodeSignOnCopy, ); };\", \"\")\n)\nend\nend\n})\n_p('/* End PBXBuildFile section */')\n_p('')\nend\nfunction xcode.PBXContainerItemProxy(tr)\nif #tr.projects.children > 0 then\n_p('/* Begin PBXContainerItemProxy section */')\nfor _, node in ipairs(tr.projects.children) do\n_p(2,'%s /* PBXContainerItemProxy */ = {', node.productproxyid)\n_p(3,'isa = PBXContainerItemProxy;')\n_p(3,'containerPortal = %s /* %s */;', node.id, path.getname(node.pat"
- "h))\n_p(3,'proxyType = 2;')\n_p(3,'remoteGlobalIDString = %s;', node.project.xcode.projectnode.id)\n_p(3,'remoteInfo = \"%s\";', node.project.xcode.projectnode.name)\n_p(2,'};')\n_p(2,'%s /* PBXContainerItemProxy */ = {', node.targetproxyid)\n_p(3,'isa = PBXContainerItemProxy;')\n_p(3,'containerPortal = %s /* %s */;', node.id, path.getname(node.path))\n_p(3,'proxyType = 1;')\n_p(3,'remoteGlobalIDString = %s;', node.project.xcode.projectnode.targetid)\n_p(3,'remoteInfo = \"%s\";', node.project.xcode.projectnode.name)\n_p(2,'};')\nend\n_p('/* End PBXContainerItemProxy section */')\n_p('')\nend\nend\nfunction xcode.PBXFileReference(tr,prj)\n_p('/* Begin PBXFileReference section */')\ntree.traverse(tr, {\nonleaf = function(node)\nif not node.path then\nreturn\nend\nif node.kind == \"product\" then\n_p(2,'%s /* %s */ = {isa = PBXFileReference; explicitFileType = %s; includeInIndex = 0; name = \"%s\"; path = \"%s\"; sourceTree = BUILT_PRODUCTS_DIR; };',\nnode.id, node.name, xcode.gettargettype(node), node.name, path"
- ".getname(node.cfg.buildtarget.bundlepath))\nelseif node.parent.parent == tr.projects then\nlocal relpath = path.getrelative(tr.project.location, node.parent.project.location)\n_p(2,'%s /* %s */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = \"%s\"; path = \"%s\"; sourceTree = SOURCE_ROOT; };',\nnode.parent.id, node.parent.name, node.parent.name, path.join(relpath, node.parent.name))\nelse\nlocal pth, src\nif xcode.isframework(node.path) then\nlocal nodePath = node.path\nlocal _, matchEnd, variable = string.find(nodePath, \"^%$%((.+)%)/\")\nif variable then\nnodePath = string.sub(nodePath, matchEnd + 1)\nend\nif string.find(nodePath,'/') then\nif string.find(nodePath,'^%.')then\nnodePath = path.getabsolute(path.join(tr.project.location, nodePath))\nend\npth = nodePath\nelseif path.getextension(nodePath)=='.tbd' then\npth = \"/usr/lib/\" .. nodePath\nelse\npth = \"/System/Library/Frameworks/\" .. nodePath\nend\nif variable then\nsrc = variable\nif string.find(pth, '^/') then\npth "
- "= string.sub(pth, 2)\nend\nelse\nsrc = \"<absolute>\"\nend\nelse\nsrc = \"<group>\"\nif node.location then\npth = node.location\nelseif node.parent.isvpath then\npth = node.cfg.name\nelse\npth = tree.getlocalpath(node)\nend\nend\nif (not prj.options.ForceCPP) then\n_p(2,'%s /* %s */ = {isa = PBXFileReference; lastKnownFileType = %s; name = \"%s\"; path = \"%s\"; sourceTree = \"%s\"; };',\nnode.id, node.name, xcode.getfiletype(node), node.name, pth, src)\nelse\n_p(2,'%s /* %s */ = {isa = PBXFileReference; explicitFileType = %s; name = \"%s\"; path = \"%s\"; sourceTree = \"%s\"; };',\nnode.id, node.name, xcode.getfiletypeForced(node), node.name, pth, src)\nend\nend\nend\n})\n_p('/* End PBXFileReference section */')\n_p('')\nend\nfunction xcode.PBXFrameworksBuildPhase(tr)\n_p('/* Begin PBXFrameworksBuildPhase section */')\n_p(2,'%s /* Frameworks */ = {', tr.products.children[1].fxstageid)\n_p(3,'isa = PBXFrameworksBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\ntree.traverse(tr.frameworks"
- ", {\nonleaf = function(node)\n_p(4,'%s /* %s in Frameworks */,', node.buildid, node.name)\nend\n})\ntree.traverse(tr.projects, {\nonleaf = function(node)\n_p(4,'%s /* %s in Frameworks */,', node.buildid, node.name)\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')\n_p(2,'};')\n_p('/* End PBXFrameworksBuildPhase section */')\n_p('')\nend\nfunction xcode.PBXGroup(tr)\n_p('/* Begin PBXGroup section */')\ntree.traverse(tr, {\nonnode = function(node)\nif (node.path and #node.children == 0) or node.kind == \"vgroup\" then\nreturn\nend\nif node.parent == tr.projects then\n_p(2,'%s /* Products */ = {', node.productgroupid)\nelse\n_p(2,'%s /* %s */ = {', node.id, node.name)\nend\n_p(3,'isa = PBXGroup;')\n_p(3,'children = (')\nfor _, childnode in ipairs(node.children) do\n_p(4,'%s /* %s */,', childnode.id, childnode.name)\nend\n_p(3,');')\nif node.parent == tr.projects then\n_p(3,'name = Products;')\nelse\n_p(3,'name = \"%s\";', node.name)\nif node.location then\n_p(3,'path = \"%s\";', node.location)"
- "\nelseif node.path and not node.isvpath then\nlocal p = node.path\nif node.parent.path then\np = path.getrelative(node.parent.path, node.path)\nend\n_p(3,'path = \"%s\";', p)\nend\nend\n_p(3,'sourceTree = \"<group>\";')\n_p(2,'};')\nend\n}, true)\n_p('/* End PBXGroup section */')\n_p('')\nend\nfunction xcode.PBXNativeTarget(tr)\n_p('/* Begin PBXNativeTarget section */')\nfor _, node in ipairs(tr.products.children) do\nlocal name = tr.project.name\nlocal function hasBuildCommands(which)\nif #tr.project[which] > 0 then\nreturn true\nend\nfor _, cfg in ipairs(tr.configs) do\nif #cfg[which] > 0 then\nreturn true\nend\nend\nend\nlocal function dobuildblock(id, label, which, action)\nif hasBuildCommands(which) then\nlocal commandcount = 0\nfor _, cfg in ipairs(tr.configs) do\ncommandcount = commandcount + #cfg[which]\nend\nif commandcount > 0 then\naction(id, label)\nend\nend\nend\nlocal function doscriptphases(which, action)\nlocal i = 0\nfor _, cfg in ipairs(tr.configs) do\nlocal cfgcmds = cfg[which]\nif cfgcmds ~"
- "= nil then\nfor __, scripts in ipairs(cfgcmds) do\nfor ___, script in ipairs(scripts) do\nlocal cmd = script[1]\nlocal label = xcode.getscriptphaselabel(cmd, i, cfg)\nlocal id = xcode.uuid(label)\naction(id, label)\ni = i + 1\nend\nend\nend\nend\nend\nlocal function docopyresources(which, action)\nif hasBuildCommands(which) then\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal i = 0\nfor _, t in ipairs(targets) do\nfor __, tt in ipairs(t) do\nlocal label = xcode.getcopyphaselabel('Resources', i, tt[1])\nlocal id = xcode.uuid(label)\naction(id, label)\ni = i + 1\nend\nend\nend\nend\nend\nlocal function docopyframeworks(which, action)\nif hasBuildCommands(which) then\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal label = \"Copy Frameworks\"\nlocal id = xcode.uuid(label)\naction(id, label)\nend\nend\nend\nlocal function _p_label(id, label)\n_p(4, '%s /* %s */,', id, label)\nend\n_p(2,'%s /* %s */ = {', node.targetid, name)\n_p(3,'isa = PBXNativeTarget;')\n_p(3,'buildConfigurationLi"
- "st = %s /* Build configuration list for PBXNativeTarget \"%s\" */;', node.cfgsection, name)\n_p(3,'buildPhases = (')\ndobuildblock('9607AE1010C857E500CD1376', 'Prebuild', 'prebuildcommands', _p_label)\n_p(4,'%s /* Resources */,', node.resstageid)\n_p(4,'%s /* Sources */,', node.sourcesid)\ndobuildblock('9607AE3510C85E7E00CD1376', 'Prelink', 'prelinkcommands', _p_label)\n_p(4,'%s /* Frameworks */,', node.fxstageid)\ndobuildblock('9607AE3710C85E8F00CD1376', 'Postbuild', 'postbuildcommands', _p_label)\ndoscriptphases(\"xcodescriptphases\", _p_label)\ndocopyresources(\"xcodecopyresources\", _p_label)\nif tr.project.kind == \"WindowedApp\" then\ndocopyframeworks(\"xcodecopyframeworks\", _p_label)\nend\n_p(3,');')\n_p(3,'buildRules = (')\n_p(3,');')\n_p(3,'dependencies = (')\nfor _, node in ipairs(tr.projects.children) do\n_p(4,'%s /* PBXTargetDependency */,', node.targetdependid)\nend\n_p(3,');')\n_p(3,'name = \"%s\";', name)\nlocal p\nif node.cfg.kind == \"ConsoleApp\" then\np = \"$(HOME)/bin\"\nelseif node.cfg.ki"
- "nd == \"WindowedApp\" then\np = \"$(HOME)/Applications\"\nend\nif p then\n_p(3,'productInstallPath = \"%s\";', p)\nend\n_p(3,'productName = \"%s\";', name)\n_p(3,'productReference = %s /* %s */;', node.id, node.name)\n_p(3,'productType = \"%s\";', xcode.getproducttype(node))\n_p(2,'};')\nend\n_p('/* End PBXNativeTarget section */')\n_p('')\nend\nfunction xcode.PBXProject(tr, compatVersion)\n_p('/* Begin PBXProject section */')\n_p(2,'__RootObject_ /* Project object */ = {')\n_p(3,'isa = PBXProject;')\n_p(3,'buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject \"%s\" */;', tr.name)\n_p(3,'compatibilityVersion = \"Xcode %s\";', compatVersion)\n_p(3,'hasScannedForEncodings = 1;')\n_p(3,'mainGroup = %s /* %s */;', tr.id, tr.name)\n_p(3,'projectDirPath = \"\";')\nif #tr.projects.children > 0 then\n_p(3,'projectReferences = (')\nfor _, node in ipairs(tr.projects.children) do\n_p(4,'{')\n_p(5,'ProductGroup = %s /* Products */;', node.productgroupid)\n_p(5,'ProjectRef = %s /* %s"
- " */;', node.id, path.getname(node.path))\n_p(4,'},')\nend\n_p(3,');')\nend\n_p(3,'projectRoot = \"\";')\n_p(3,'targets = (')\nfor _, node in ipairs(tr.products.children) do\n_p(4,'%s /* %s */,', node.targetid, node.name)\nend\n_p(3,');')\n_p(2,'};')\n_p('/* End PBXProject section */')\n_p('')\nend\nfunction xcode.PBXReferenceProxy(tr)\nif #tr.projects.children > 0 then\n_p('/* Begin PBXReferenceProxy section */')\ntree.traverse(tr.projects, {\nonleaf = function(node)\n_p(2,'%s /* %s */ = {', node.id, node.name)\n_p(3,'isa = PBXReferenceProxy;')\n_p(3,'fileType = %s;', xcode.gettargettype(node))\n_p(3,'path = \"%s\";', node.path)\n_p(3,'remoteRef = %s /* PBXContainerItemProxy */;', node.parent.productproxyid)\n_p(3,'sourceTree = BUILT_PRODUCTS_DIR;')\n_p(2,'};')\nend\n})\n_p('/* End PBXReferenceProxy section */')\n_p('')\nend\nend\nfunction xcode.PBXResourcesBuildPhase(tr)\n_p('/* Begin PBXResourcesBuildPhase section */')\nfor _, target in ipairs(tr.products.children) do\n_p(2,'%s /* Resources */ = {', target.r"
- "esstageid)\n_p(3,'isa = PBXResourcesBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\ntree.traverse(tr, {\nonnode = function(node)\nif xcode.getbuildcategory(node) == \"Resources\" then\n_p(4,'%s /* %s in Resources */,', node.buildid, node.name)\nend\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')\n_p(2,'};')\nend\n_p('/* End PBXResourcesBuildPhase section */')\n_p('')\nend\nfunction xcode.PBXShellScriptBuildPhase(tr)\nlocal wrapperWritten = false\nlocal function doblock(id, name, commands, files)\nif commands ~= nil then\ncommands = table.flatten(commands)\nend\nif #commands > 0 then\nif not wrapperWritten then\n_p('/* Begin PBXShellScriptBuildPhase section */')\nwrapperWritten = true\nend\n_p(2,'%s /* %s */ = {', id, name)\n_p(3,'isa = PBXShellScriptBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\n_p(3,');')\n_p(3,'inputPaths = (');\nif files ~= nil then\nfiles = table.flatten(files)\nif #files > 0 then\nfor _, file in ipairs(files) do\n_p("
- "4, '\"%s\",', file)\nend\nend\nend\n_p(3,');');\n_p(3,'name = %s;', name);\n_p(3,'outputPaths = (');\n_p(3,');');\n_p(3,'runOnlyForDeploymentPostprocessing = 0;');\n_p(3,'shellPath = /bin/sh;');\n_p(3,'shellScript = \"%s\";', table.concat(commands, \"\\\\n\"):gsub('\"', '\\\\\"'))\n_p(2,'};')\nend\nend\nlocal function wrapcommands(cmds, cfg)\nlocal commands = {}\nif #cmds > 0 then\ntable.insert(commands, 'if [ \"${CONFIGURATION}\" = \"' .. xcode.getconfigname(cfg) .. '\" ]; then')\nfor i = 1, #cmds do\nlocal cmd = cmds[i]\ncmd = cmd:gsub('\\\\','\\\\\\\\')\ntable.insert(commands, cmd)\nend\ntable.insert(commands, 'fi')\nend\nreturn commands\nend\nlocal function dobuildblock(id, name, which)\nlocal commands = {}\nfor _, cfg in ipairs(tr.configs) do\nlocal cfgcmds = wrapcommands(cfg[which], cfg)\nif #cfgcmds > 0 then\nfor i, cmd in ipairs(cfgcmds) do\ntable.insert(commands, cmd)\nend\nend\nend\ndoblock(id, name, commands)\nend\nlocal function doscriptphases(which)\nlocal i = 0\nfor _, cfg in ipairs(tr.configs) d"
- "o\nlocal cfgcmds = cfg[which]\nif cfgcmds ~= nil then\nfor __, scripts in ipairs(cfgcmds) do\nfor ___, script in ipairs(scripts) do\nlocal cmd = script[1]\nlocal files = script[2]\nlocal label = xcode.getscriptphaselabel(cmd, i, cfg)\nlocal id = xcode.uuid(label)\ndoblock(id, label, wrapcommands({cmd}, cfg), files)\ni = i + 1\nend\nend\nend\nend\nend\ndobuildblock(\"9607AE1010C857E500CD1376\", \"Prebuild\", \"prebuildcommands\")\ndobuildblock(\"9607AE3510C85E7E00CD1376\", \"Prelink\", \"prelinkcommands\")\ndobuildblock(\"9607AE3710C85E8F00CD1376\", \"Postbuild\", \"postbuildcommands\")\ndoscriptphases(\"xcodescriptphases\")\nif wrapperWritten then\n_p('/* End PBXShellScriptBuildPhase section */')\nend\nend\nfunction xcode.PBXSourcesBuildPhase(tr,prj)\n_p('/* Begin PBXSourcesBuildPhase section */')\nfor _, target in ipairs(tr.products.children) do\n_p(2,'%s /* Sources */ = {', target.sourcesid)\n_p(3,'isa = PBXSourcesBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\ntree.traverse(tr, {\no"
- "nleaf = function(node)\nif xcode.getbuildcategory(node) == \"Sources\" then\nif not table.icontains(prj.excludes, node.cfg.name) then -- if not excluded\n_p(4,'%s /* %s in Sources */,', node.buildid, node.name)\nend\nend\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')\n_p(2,'};')\nend\n_p('/* End PBXSourcesBuildPhase section */')\n_p('')\nend\nfunction xcode.PBXCopyFilesBuildPhase(tr)\nlocal wrapperWritten = false\nlocal function doblock(id, name, folderSpec, path, files)\nif #files > 0 then\nif not wrapperWritten then\n_p('/* Begin PBXCopyFilesBuildPhase section */')\nwrapperWritten = true\nend\n_p(2,'%s /* %s */ = {', id, name)\n_p(3,'isa = PBXCopyFilesBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'dstPath = \\\"%s\\\";', path)\n_p(3,'dstSubfolderSpec = \\\"%s\\\";', folderSpec)\n_p(3,'files = (')\ntree.traverse(tr, {\nonleaf = function(node)\nif table.icontains(files, node.name) then\n_p(4,'%s /* %s in %s */,',\nxcode.uuid(node.name .. 'in CopyFiles'), node.name, 'CopyFile"
- "s')\nend\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;');\n_p(2,'};')\nend\nend\nlocal function docopyresources(which)\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal i = 0\nfor _, t in ipairs(targets) do\nfor __, tt in ipairs(t) do\nlocal label = xcode.getcopyphaselabel('Resources', i, tt[1])\nlocal id = xcode.uuid(label)\nlocal files = table.translate(table.flatten(tt[2]), path.getname)\ndoblock(id, label, 7, tt[1], files)\ni = i + 1\nend\nend\nend\nend\nlocal function docopyframeworks(which)\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal label = \"Copy Frameworks\"\nlocal id = xcode.uuid(label)\nlocal files = table.translate(table.flatten(targets), path.getname)\ndoblock(id, label, 10, \"\", files)\nend\nend\ndocopyresources(\"xcodecopyresources\")\nif tr.project.kind == \"WindowedApp\" then\ndocopyframeworks(\"xcodecopyframeworks\")\nend\nif wrapperWritten then\n_p('/* End PBXCopyFilesBuildPhase section */')\nend\nend\nfunction xcode.PBXVariantGroup(tr"
- ")\n_p('/* Begin PBXVariantGroup section */')\ntree.traverse(tr, {\nonbranch = function(node)\nif node.kind == \"vgroup\" then\n_p(2,'%s /* %s */ = {', node.id, node.name)\n_p(3,'isa = PBXVariantGroup;')\n_p(3,'children = (')\nfor _, lang in ipairs(node.children) do\n_p(4,'%s /* %s */,', lang.id, lang.name)\nend\n_p(3,');')\n_p(3,'name = %s;', node.name)\n_p(3,'sourceTree = \"<group>\";')\n_p(2,'};')\nend\nend\n})\n_p('/* End PBXVariantGroup section */')\n_p('')\nend\nfunction xcode.PBXTargetDependency(tr)\nif #tr.projects.children > 0 then\n_p('/* Begin PBXTargetDependency section */')\ntree.traverse(tr.projects, {\nonleaf = function(node)\n_p(2,'%s /* PBXTargetDependency */ = {', node.parent.targetdependid)\n_p(3,'isa = PBXTargetDependency;')\n_p(3,'name = \"%s\";', node.name)\n_p(3,'targetProxy = %s /* PBXContainerItemProxy */;', node.parent.targetproxyid)\n_p(2,'};')\nend\n})\n_p('/* End PBXTargetDependency section */')\n_p('')\nend\nend\nfunction xcode.cfg_excluded_files(prj, cfg)\nlocal excluded = {}\nloc"
- "al function exclude_pattern(file)\nif path.isabsolute(file) then\nreturn file\nend\nlocal start, term = file:findlast(\"/%.%./\")\nif term then\nreturn path.join(\"*\", file:sub(term + 1))\nend\nstart, term = file:find(\"%.%./\")\nif start == 1 then\nreturn path.join(\"*\", file:sub(term + 1))\nend\nreturn path.join(\"*\", file)\nend\nlocal function add_file(file)\nlocal name = exclude_pattern(file)\nif not table.icontains(excluded, name) then\ntable.insert(excluded, name)\nend\nend\nlocal function verify_file(file)\nlocal name = exclude_pattern(file)\nif table.icontains(excluded, name) then\nerror(\"'\" .. file .. \"' would be excluded by the rule to exclude '\" .. name .. \"'\")\nend\nend\nfor _, file in ipairs(cfg.excludes) do\nadd_file(file)\nend\nfor _, file in ipairs(prj.allfiles) do\nif not table.icontains(prj.excludes, file) and not table.icontains(cfg.excludes, file) then\nif not table.icontains(cfg.files, file) then\nadd_file(file)\nelse\nverify_file(file)\nend\nend\nend\ntable.sort(excluded)\nreturn"
- " excluded\nend\nfunction xcode.XCBuildConfiguration_Impl(tr, id, opts, cfg)\nlocal cfgname = xcode.getconfigname(cfg)\n_p(2,'%s /* %s */ = {', id, cfgname)\n_p(3,'isa = XCBuildConfiguration;')\n_p(3,'buildSettings = {')\nfor k, v in table.sortedpairs(opts) do\nif type(v) == \"table\" then\nif #v > 0 then\n_p(4,'%s = (', k)\nfor i, v2 in ipairs(v) do\n_p(5,'%s,', xcode.quotestr(tostring(v2)))\nend\n_p(4,');')\nend\nelse\n_p(4,'%s = %s;', k, xcode.quotestr(tostring(v)))\nend\nend\n_p(3,'};')\n_p(3,'name = %s;', xcode.quotestr(cfgname))\n_p(2,'};')\nend\nlocal function add_options(options, extras)\nfor _, tbl in ipairs(extras) do\nfor tkey, tval in pairs(tbl) do\noptions[tkey] = tval\nend\nend\nend\nlocal function add_wholearchive_links(opts, cfg)\nif #cfg.wholearchive > 0 then\nlocal linkopts = {}\nfor _, depcfg in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\nif table.icontains(cfg.wholearchive, depcfg.project.name) then\nlocal linkpath = path.rebase(depcfg.linktarget.fullpath, depcfg.location, cf"
- "g.location)\ntable.insert(linkopts, \"-force_load\")\ntable.insert(linkopts, linkpath)\nend\nend\nif opts.OTHER_LDFLAGS then\nlinkopts = table.join(linkopts, opts.OTHER_LDFLAGS)\nend\nopts.OTHER_LDFLAGS = linkopts\nend\nend\nfunction xcode.XCBuildConfiguration(tr, prj, opts)\n_p('/* Begin XCBuildConfiguration section */')\nfor _, target in ipairs(tr.products.children) do\nfor _, cfg in ipairs(tr.configs) do\nlocal values = opts.ontarget(tr, target, cfg)\nadd_options(values, cfg.xcodetargetopts)\nxcode.XCBuildConfiguration_Impl(tr, cfg.xcode.targetid, values, cfg)\nend\nend\nfor _, cfg in ipairs(tr.configs) do\nlocal values = opts.onproject(tr, prj, cfg)\nadd_options(values, cfg.xcodeprojectopts)\nadd_wholearchive_links(values, cfg)\nxcode.XCBuildConfiguration_Impl(tr, cfg.xcode.projectid, values, cfg)\nend\n_p('/* End XCBuildConfiguration section */')\n_p('')\nend\nfunction xcode.XCBuildConfigurationList(tr)\nlocal sln = tr.project.solution\n_p('/* Begin XCConfigurationList section */')\nfor _, target in ipair"
- "s(tr.products.children) do\n_p(2,'%s /* Build configuration list for PBXNativeTarget \"%s\" */ = {', target.cfgsection, target.name)\n_p(3,'isa = XCConfigurationList;')\n_p(3,'buildConfigurations = (')\nfor _, cfg in ipairs(tr.configs) do\n_p(4,'%s /* %s */,', cfg.xcode.targetid, xcode.getconfigname(cfg))\nend\n_p(3,');')\n_p(3,'defaultConfigurationIsVisible = 0;')\n_p(3,'defaultConfigurationName = \"%s\";', xcode.getconfigname(tr.configs[1]))\n_p(2,'};')\nend\n_p(2,'1DEB928908733DD80010E9CD /* Build configuration list for PBXProject \"%s\" */ = {', tr.name)\n_p(3,'isa = XCConfigurationList;')\n_p(3,'buildConfigurations = (')\nfor _, cfg in ipairs(tr.configs) do\n_p(4,'%s /* %s */,', cfg.xcode.projectid, xcode.getconfigname(cfg))\nend\n_p(3,');')\n_p(3,'defaultConfigurationIsVisible = 0;')\n_p(3,'defaultConfigurationName = \"%s\";', xcode.getconfigname(tr.configs[1]))\n_p(2,'};')\n_p('/* End XCConfigurationList section */')\n_p('')\nend\nfunction xcode.Footer()\n_p(1,'};')\n_p('\\trootObject = __RootObject_ /*"
- " Project object */;')\n_p('}')\nend\n",
+ "nd\n_p(4,');')\nend\nend\nfunction xcode.quotestr(str)\nif str:match(\"[^a-zA-Z0-9$._/]\") == nil then\nreturn str\nend\nreturn \"\\\"\" .. str:gsub(\"[\\\"\\\\\\\"]\", \"\\\\%0\") .. \"\\\"\"\nend\nfunction xcode.setdeploymenttarget(cfg, def, opts)\nlocal get_opt = function(opt, def)\nreturn (opt and #opt > 0) and opt or def\nend\nlocal iosversion = get_opt(cfg.iostargetplatformversion, def.iOSTargetPlatformVersion)\nlocal macosversion = get_opt(cfg.macostargetplatformversion, def.macOSTargetPlatformVersion)\nlocal tvosversion = get_opt(cfg.tvostargetplatformversion, def.tvOSTargetPlatformVersion)\nlocal visionosversion = get_opt(cfg.visionostargetplatformversion, def.visionOSTargetPlatformVersion)\nif iosversion then\nopts.IPHONEOS_DEPLOYMENT_TARGET = iosversion\nelseif macosversion then\nopts.MACOSX_DEPLOYMENT_TARGET = macosversion\nelseif tvosversion then\nopts.TVOS_DEPLOYMENT_TARGET = tvosversion\nelseif visionosversion then\nopts.XROS_DEPLOYMENT_TARGET = tvosversion\nend\nend\nfunction xcode.Header(tr, o"
+ "bjversion)\n_p('// !$*UTF8*$!')\n_p('// Generated by GENie https://github.com/bkaradzic/GENie')\n_p('{')\n_p(1,'archiveVersion = 1;')\n_p(1,'classes = {')\n_p(1,'};')\n_p(1,'objectVersion = %d;', objversion)\n_p(1,'objects = {')\n_p('')\nend\nfunction xcode.PBXBuildFile(tr)\nlocal function gatherCopyFiles(which)\nlocal copyfiles = {}\nlocal targets = tr.project[which]\nif #targets > 0 then\nfor _, t in ipairs(targets) do\nfor __, tt in ipairs(t) do\ntable.insertflat(copyfiles, tt[2])\nend\nend\nend\nreturn table.translate(copyfiles, path.getname)\nend\nlocal function gatherCopyFrameworks(which)\nlocal copyfiles = {}\nlocal targets = tr.project[which]\nif #targets > 0 then\ntable.insertflat(copyfiles, targets)\nend\nreturn table.translate(copyfiles, path.getname)\nend\nlocal copyfiles = table.flatten({\ngatherCopyFiles('xcodecopyresources'),\ngatherCopyFrameworks('xcodecopyframeworks')\n})\n_p('/* Begin PBXBuildFile section */')\ntree.traverse(tr, {\nonnode = function(node)\nif node.buildid then\n_p(2,'%s /* %s"
+ " in %s */ = {isa = PBXBuildFile; fileRef = %s /* %s */; };',\nnode.buildid, node.name, xcode.getbuildcategory(node), node.id, node.name)\nend\nif table.icontains(copyfiles, node.name) then\n_p(2,'%s /* %s in %s */ = {isa = PBXBuildFile; fileRef = %s /* %s */; %s };',\nxcode.uuid(node.name .. 'in CopyFiles'), node.name, 'CopyFiles', node.id, node.name,\niif(xcode.isframework(node.name), \"settings = {ATTRIBUTES = (CodeSignOnCopy, ); };\", \"\")\n)\nend\nend\n})\n_p('/* End PBXBuildFile section */')\n_p('')\nend\nfunction xcode.PBXContainerItemProxy(tr)\nif #tr.projects.children > 0 then\n_p('/* Begin PBXContainerItemProxy section */')\nfor _, node in ipairs(tr.projects.children) do\n_p(2,'%s /* PBXContainerItemProxy */ = {', node.productproxyid)\n_p(3,'isa = PBXContainerItemProxy;')\n_p(3,'containerPortal = %s /* %s */;', node.id, path.getname(node.path))\n_p(3,'proxyType = 2;')\n_p(3,'remoteGlobalIDString = %s;', node.project.xcode.projectnode.id)\n_p(3,'remoteInfo = \"%s\";', node.project.xcode.projectnode.na"
+ "me)\n_p(2,'};')\n_p(2,'%s /* PBXContainerItemProxy */ = {', node.targetproxyid)\n_p(3,'isa = PBXContainerItemProxy;')\n_p(3,'containerPortal = %s /* %s */;', node.id, path.getname(node.path))\n_p(3,'proxyType = 1;')\n_p(3,'remoteGlobalIDString = %s;', node.project.xcode.projectnode.targetid)\n_p(3,'remoteInfo = \"%s\";', node.project.xcode.projectnode.name)\n_p(2,'};')\nend\n_p('/* End PBXContainerItemProxy section */')\n_p('')\nend\nend\nfunction xcode.PBXFileReference(tr,prj)\n_p('/* Begin PBXFileReference section */')\ntree.traverse(tr, {\nonleaf = function(node)\nif not node.path then\nreturn\nend\nif node.kind == \"product\" then\n_p(2,'%s /* %s */ = {isa = PBXFileReference; explicitFileType = %s; includeInIndex = 0; name = \"%s\"; path = \"%s\"; sourceTree = BUILT_PRODUCTS_DIR; };',\nnode.id, node.name, xcode.gettargettype(node), node.name, path.getname(node.cfg.buildtarget.bundlepath))\nelseif node.parent.parent == tr.projects then\nlocal relpath = path.getrelative(tr.project.location, node.parent.proje"
+ "ct.location)\n_p(2,'%s /* %s */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = \"%s\"; path = \"%s\"; sourceTree = SOURCE_ROOT; };',\nnode.parent.id, node.parent.name, node.parent.name, path.join(relpath, node.parent.name))\nelse\nlocal pth, src\nif xcode.isframework(node.path) then\nlocal nodePath = node.path\nlocal _, matchEnd, variable = string.find(nodePath, \"^%$%((.+)%)/\")\nif variable then\nnodePath = string.sub(nodePath, matchEnd + 1)\nend\nif string.find(nodePath,'/') then\nif string.find(nodePath,'^%.')then\nnodePath = path.getabsolute(path.join(tr.project.location, nodePath))\nend\npth = nodePath\nelseif path.getextension(nodePath)=='.tbd' then\npth = \"/usr/lib/\" .. nodePath\nelse\npth = \"/System/Library/Frameworks/\" .. nodePath\nend\nif variable then\nsrc = variable\nif string.find(pth, '^/') then\npth = string.sub(pth, 2)\nend\nelse\nsrc = \"<absolute>\"\nend\nelse\nsrc = \"<group>\"\nif node.location then\npth = node.location\nelseif node.parent.isvpath then\n"
+ "pth = node.cfg.name\nelse\npth = tree.getlocalpath(node)\nend\nend\nif (not prj.options.ForceCPP) then\n_p(2,'%s /* %s */ = {isa = PBXFileReference; lastKnownFileType = %s; name = \"%s\"; path = \"%s\"; sourceTree = \"%s\"; };',\nnode.id, node.name, xcode.getfiletype(node), node.name, pth, src)\nelse\n_p(2,'%s /* %s */ = {isa = PBXFileReference; explicitFileType = %s; name = \"%s\"; path = \"%s\"; sourceTree = \"%s\"; };',\nnode.id, node.name, xcode.getfiletypeForced(node), node.name, pth, src)\nend\nend\nend\n})\n_p('/* End PBXFileReference section */')\n_p('')\nend\nfunction xcode.PBXFrameworksBuildPhase(tr)\n_p('/* Begin PBXFrameworksBuildPhase section */')\n_p(2,'%s /* Frameworks */ = {', tr.products.children[1].fxstageid)\n_p(3,'isa = PBXFrameworksBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\ntree.traverse(tr.frameworks, {\nonleaf = function(node)\n_p(4,'%s /* %s in Frameworks */,', node.buildid, node.name)\nend\n})\ntree.traverse(tr.projects, {\nonleaf = function(node)\n_p(4,'%"
+ "s /* %s in Frameworks */,', node.buildid, node.name)\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')\n_p(2,'};')\n_p('/* End PBXFrameworksBuildPhase section */')\n_p('')\nend\nfunction xcode.PBXGroup(tr)\n_p('/* Begin PBXGroup section */')\ntree.traverse(tr, {\nonnode = function(node)\nif (node.path and #node.children == 0) or node.kind == \"vgroup\" then\nreturn\nend\nif node.parent == tr.projects then\n_p(2,'%s /* Products */ = {', node.productgroupid)\nelse\n_p(2,'%s /* %s */ = {', node.id, node.name)\nend\n_p(3,'isa = PBXGroup;')\n_p(3,'children = (')\nfor _, childnode in ipairs(node.children) do\n_p(4,'%s /* %s */,', childnode.id, childnode.name)\nend\n_p(3,');')\nif node.parent == tr.projects then\n_p(3,'name = Products;')\nelse\n_p(3,'name = \"%s\";', node.name)\nif node.location then\n_p(3,'path = \"%s\";', node.location)\nelseif node.path and not node.isvpath then\nlocal p = node.path\nif node.parent.path then\np = path.getrelative(node.parent.path, node.path)\nend\n_p(3,'path = "
+ "\"%s\";', p)\nend\nend\n_p(3,'sourceTree = \"<group>\";')\n_p(2,'};')\nend\n}, true)\n_p('/* End PBXGroup section */')\n_p('')\nend\nfunction xcode.PBXNativeTarget(tr)\n_p('/* Begin PBXNativeTarget section */')\nfor _, node in ipairs(tr.products.children) do\nlocal name = tr.project.name\nlocal function hasBuildCommands(which)\nif #tr.project[which] > 0 then\nreturn true\nend\nfor _, cfg in ipairs(tr.configs) do\nif #cfg[which] > 0 then\nreturn true\nend\nend\nend\nlocal function dobuildblock(id, label, which, action)\nif hasBuildCommands(which) then\nlocal commandcount = 0\nfor _, cfg in ipairs(tr.configs) do\ncommandcount = commandcount + #cfg[which]\nend\nif commandcount > 0 then\naction(id, label)\nend\nend\nend\nlocal function doscriptphases(which, action)\nlocal i = 0\nfor _, cfg in ipairs(tr.configs) do\nlocal cfgcmds = cfg[which]\nif cfgcmds ~= nil then\nfor __, scripts in ipairs(cfgcmds) do\nfor ___, script in ipairs(scripts) do\nlocal cmd = script[1]\nlocal label = xcode.getscriptphaselabel(cmd, i, c"
+ "fg)\nlocal id = xcode.uuid(label)\naction(id, label)\ni = i + 1\nend\nend\nend\nend\nend\nlocal function docopyresources(which, action)\nif hasBuildCommands(which) then\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal i = 0\nfor _, t in ipairs(targets) do\nfor __, tt in ipairs(t) do\nlocal label = xcode.getcopyphaselabel('Resources', i, tt[1])\nlocal id = xcode.uuid(label)\naction(id, label)\ni = i + 1\nend\nend\nend\nend\nend\nlocal function docopyframeworks(which, action)\nif hasBuildCommands(which) then\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal label = \"Copy Frameworks\"\nlocal id = xcode.uuid(label)\naction(id, label)\nend\nend\nend\nlocal function _p_label(id, label)\n_p(4, '%s /* %s */,', id, label)\nend\n_p(2,'%s /* %s */ = {', node.targetid, name)\n_p(3,'isa = PBXNativeTarget;')\n_p(3,'buildConfigurationList = %s /* Build configuration list for PBXNativeTarget \"%s\" */;', node.cfgsection, name)\n_p(3,'buildPhases = (')\ndobuildblock('9607AE1010C857E500CD1376', 'Pr"
+ "ebuild', 'prebuildcommands', _p_label)\n_p(4,'%s /* Resources */,', node.resstageid)\n_p(4,'%s /* Sources */,', node.sourcesid)\ndobuildblock('9607AE3510C85E7E00CD1376', 'Prelink', 'prelinkcommands', _p_label)\n_p(4,'%s /* Frameworks */,', node.fxstageid)\ndobuildblock('9607AE3710C85E8F00CD1376', 'Postbuild', 'postbuildcommands', _p_label)\ndoscriptphases(\"xcodescriptphases\", _p_label)\ndocopyresources(\"xcodecopyresources\", _p_label)\nif tr.project.kind == \"WindowedApp\" then\ndocopyframeworks(\"xcodecopyframeworks\", _p_label)\nend\n_p(3,');')\n_p(3,'buildRules = (')\n_p(3,');')\n_p(3,'dependencies = (')\nfor _, node in ipairs(tr.projects.children) do\n_p(4,'%s /* PBXTargetDependency */,', node.targetdependid)\nend\n_p(3,');')\n_p(3,'name = \"%s\";', name)\nlocal p\nif node.cfg.kind == \"ConsoleApp\" then\np = \"$(HOME)/bin\"\nelseif node.cfg.kind == \"WindowedApp\" then\np = \"$(HOME)/Applications\"\nend\nif p then\n_p(3,'productInstallPath = \"%s\";', p)\nend\n_p(3,'productName = \"%s\";', name)\n_p(3,"
+ "'productReference = %s /* %s */;', node.id, node.name)\n_p(3,'productType = \"%s\";', xcode.getproducttype(node))\n_p(2,'};')\nend\n_p('/* End PBXNativeTarget section */')\n_p('')\nend\nfunction xcode.PBXProject(tr, compatVersion)\n_p('/* Begin PBXProject section */')\n_p(2,'__RootObject_ /* Project object */ = {')\n_p(3,'isa = PBXProject;')\n_p(3,'buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject \"%s\" */;', tr.name)\n_p(3,'compatibilityVersion = \"Xcode %s\";', compatVersion)\n_p(3,'hasScannedForEncodings = 1;')\n_p(3,'mainGroup = %s /* %s */;', tr.id, tr.name)\n_p(3,'projectDirPath = \"\";')\nif #tr.projects.children > 0 then\n_p(3,'projectReferences = (')\nfor _, node in ipairs(tr.projects.children) do\n_p(4,'{')\n_p(5,'ProductGroup = %s /* Products */;', node.productgroupid)\n_p(5,'ProjectRef = %s /* %s */;', node.id, path.getname(node.path))\n_p(4,'},')\nend\n_p(3,');')\nend\n_p(3,'projectRoot = \"\";')\n_p(3,'targets = (')\nfor _, node in ipairs(tr.products.ch"
+ "ildren) do\n_p(4,'%s /* %s */,', node.targetid, node.name)\nend\n_p(3,');')\n_p(2,'};')\n_p('/* End PBXProject section */')\n_p('')\nend\nfunction xcode.PBXReferenceProxy(tr)\nif #tr.projects.children > 0 then\n_p('/* Begin PBXReferenceProxy section */')\ntree.traverse(tr.projects, {\nonleaf = function(node)\n_p(2,'%s /* %s */ = {', node.id, node.name)\n_p(3,'isa = PBXReferenceProxy;')\n_p(3,'fileType = %s;', xcode.gettargettype(node))\n_p(3,'path = \"%s\";', node.path)\n_p(3,'remoteRef = %s /* PBXContainerItemProxy */;', node.parent.productproxyid)\n_p(3,'sourceTree = BUILT_PRODUCTS_DIR;')\n_p(2,'};')\nend\n})\n_p('/* End PBXReferenceProxy section */')\n_p('')\nend\nend\nfunction xcode.PBXResourcesBuildPhase(tr)\n_p('/* Begin PBXResourcesBuildPhase section */')\nfor _, target in ipairs(tr.products.children) do\n_p(2,'%s /* Resources */ = {', target.resstageid)\n_p(3,'isa = PBXResourcesBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\ntree.traverse(tr, {\nonnode = function(node)\nif xcod"
+ "e.getbuildcategory(node) == \"Resources\" then\n_p(4,'%s /* %s in Resources */,', node.buildid, node.name)\nend\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')\n_p(2,'};')\nend\n_p('/* End PBXResourcesBuildPhase section */')\n_p('')\nend\nfunction xcode.PBXShellScriptBuildPhase(tr)\nlocal wrapperWritten = false\nlocal function doblock(id, name, commands, files)\nif commands ~= nil then\ncommands = table.flatten(commands)\nend\nif #commands > 0 then\nif not wrapperWritten then\n_p('/* Begin PBXShellScriptBuildPhase section */')\nwrapperWritten = true\nend\n_p(2,'%s /* %s */ = {', id, name)\n_p(3,'isa = PBXShellScriptBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\n_p(3,');')\n_p(3,'inputPaths = (');\nif files ~= nil then\nfiles = table.flatten(files)\nif #files > 0 then\nfor _, file in ipairs(files) do\n_p(4, '\"%s\",', file)\nend\nend\nend\n_p(3,');');\n_p(3,'name = %s;', name);\n_p(3,'outputPaths = (');\n_p(3,');');\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')"
+ ";\n_p(3,'shellPath = /bin/sh;');\n_p(3,'shellScript = \"%s\";', table.concat(commands, \"\\\\n\"):gsub('\"', '\\\\\"'))\n_p(2,'};')\nend\nend\nlocal function wrapcommands(cmds, cfg)\nlocal commands = {}\nif #cmds > 0 then\ntable.insert(commands, 'if [ \"${CONFIGURATION}\" = \"' .. xcode.getconfigname(cfg) .. '\" ]; then')\nfor i = 1, #cmds do\nlocal cmd = cmds[i]\ncmd = cmd:gsub('\\\\','\\\\\\\\')\ntable.insert(commands, cmd)\nend\ntable.insert(commands, 'fi')\nend\nreturn commands\nend\nlocal function dobuildblock(id, name, which)\nlocal commands = {}\nfor _, cfg in ipairs(tr.configs) do\nlocal cfgcmds = wrapcommands(cfg[which], cfg)\nif #cfgcmds > 0 then\nfor i, cmd in ipairs(cfgcmds) do\ntable.insert(commands, cmd)\nend\nend\nend\ndoblock(id, name, commands)\nend\nlocal function doscriptphases(which)\nlocal i = 0\nfor _, cfg in ipairs(tr.configs) do\nlocal cfgcmds = cfg[which]\nif cfgcmds ~= nil then\nfor __, scripts in ipairs(cfgcmds) do\nfor ___, script in ipairs(scripts) do\nlocal cmd = script[1]\nlocal "
+ "files = script[2]\nlocal label = xcode.getscriptphaselabel(cmd, i, cfg)\nlocal id = xcode.uuid(label)\ndoblock(id, label, wrapcommands({cmd}, cfg), files)\ni = i + 1\nend\nend\nend\nend\nend\ndobuildblock(\"9607AE1010C857E500CD1376\", \"Prebuild\", \"prebuildcommands\")\ndobuildblock(\"9607AE3510C85E7E00CD1376\", \"Prelink\", \"prelinkcommands\")\ndobuildblock(\"9607AE3710C85E8F00CD1376\", \"Postbuild\", \"postbuildcommands\")\ndoscriptphases(\"xcodescriptphases\")\nif wrapperWritten then\n_p('/* End PBXShellScriptBuildPhase section */')\nend\nend\nfunction xcode.PBXSourcesBuildPhase(tr,prj)\n_p('/* Begin PBXSourcesBuildPhase section */')\nfor _, target in ipairs(tr.products.children) do\n_p(2,'%s /* Sources */ = {', target.sourcesid)\n_p(3,'isa = PBXSourcesBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'files = (')\ntree.traverse(tr, {\nonleaf = function(node)\nif xcode.getbuildcategory(node) == \"Sources\" then\nif not table.icontains(prj.excludes, node.cfg.name) then -- if not excluded\n_p(4,'%s"
+ " /* %s in Sources */,', node.buildid, node.name)\nend\nend\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;')\n_p(2,'};')\nend\n_p('/* End PBXSourcesBuildPhase section */')\n_p('')\nend\nfunction xcode.PBXCopyFilesBuildPhase(tr)\nlocal wrapperWritten = false\nlocal function doblock(id, name, folderSpec, path, files)\nif #files > 0 then\nif not wrapperWritten then\n_p('/* Begin PBXCopyFilesBuildPhase section */')\nwrapperWritten = true\nend\n_p(2,'%s /* %s */ = {', id, name)\n_p(3,'isa = PBXCopyFilesBuildPhase;')\n_p(3,'buildActionMask = 2147483647;')\n_p(3,'dstPath = \\\"%s\\\";', path)\n_p(3,'dstSubfolderSpec = \\\"%s\\\";', folderSpec)\n_p(3,'files = (')\ntree.traverse(tr, {\nonleaf = function(node)\nif table.icontains(files, node.name) then\n_p(4,'%s /* %s in %s */,',\nxcode.uuid(node.name .. 'in CopyFiles'), node.name, 'CopyFiles')\nend\nend\n})\n_p(3,');')\n_p(3,'runOnlyForDeploymentPostprocessing = 0;');\n_p(2,'};')\nend\nend\nlocal function docopyresources(which)\nlocal targets = tr.p"
+ "roject[which]\nif #targets > 0 then\nlocal i = 0\nfor _, t in ipairs(targets) do\nfor __, tt in ipairs(t) do\nlocal label = xcode.getcopyphaselabel('Resources', i, tt[1])\nlocal id = xcode.uuid(label)\nlocal files = table.translate(table.flatten(tt[2]), path.getname)\ndoblock(id, label, 7, tt[1], files)\ni = i + 1\nend\nend\nend\nend\nlocal function docopyframeworks(which)\nlocal targets = tr.project[which]\nif #targets > 0 then\nlocal label = \"Copy Frameworks\"\nlocal id = xcode.uuid(label)\nlocal files = table.translate(table.flatten(targets), path.getname)\ndoblock(id, label, 10, \"\", files)\nend\nend\ndocopyresources(\"xcodecopyresources\")\nif tr.project.kind == \"WindowedApp\" then\ndocopyframeworks(\"xcodecopyframeworks\")\nend\nif wrapperWritten then\n_p('/* End PBXCopyFilesBuildPhase section */')\nend\nend\nfunction xcode.PBXVariantGroup(tr)\n_p('/* Begin PBXVariantGroup section */')\ntree.traverse(tr, {\nonbranch = function(node)\nif node.kind == \"vgroup\" then\n_p(2,'%s /* %s */ = {', node.id, no"
+ "de.name)\n_p(3,'isa = PBXVariantGroup;')\n_p(3,'children = (')\nfor _, lang in ipairs(node.children) do\n_p(4,'%s /* %s */,', lang.id, lang.name)\nend\n_p(3,');')\n_p(3,'name = %s;', node.name)\n_p(3,'sourceTree = \"<group>\";')\n_p(2,'};')\nend\nend\n})\n_p('/* End PBXVariantGroup section */')\n_p('')\nend\nfunction xcode.PBXTargetDependency(tr)\nif #tr.projects.children > 0 then\n_p('/* Begin PBXTargetDependency section */')\ntree.traverse(tr.projects, {\nonleaf = function(node)\n_p(2,'%s /* PBXTargetDependency */ = {', node.parent.targetdependid)\n_p(3,'isa = PBXTargetDependency;')\n_p(3,'name = \"%s\";', node.name)\n_p(3,'targetProxy = %s /* PBXContainerItemProxy */;', node.parent.targetproxyid)\n_p(2,'};')\nend\n})\n_p('/* End PBXTargetDependency section */')\n_p('')\nend\nend\nfunction xcode.cfg_excluded_files(prj, cfg)\nlocal excluded = {}\nlocal function exclude_pattern(file)\nif path.isabsolute(file) then\nreturn file\nend\nlocal start, term = file:findlast(\"/%.%./\")\nif term then\nreturn path.join("
+ "\"*\", file:sub(term + 1))\nend\nstart, term = file:find(\"%.%./\")\nif start == 1 then\nreturn path.join(\"*\", file:sub(term + 1))\nend\nreturn path.join(\"*\", file)\nend\nlocal function add_file(file)\nlocal name = exclude_pattern(file)\nif not table.icontains(excluded, name) then\ntable.insert(excluded, name)\nend\nend\nlocal function verify_file(file)\nlocal name = exclude_pattern(file)\nif table.icontains(excluded, name) then\nerror(\"'\" .. file .. \"' would be excluded by the rule to exclude '\" .. name .. \"'\")\nend\nend\nfor _, file in ipairs(cfg.excludes) do\nadd_file(file)\nend\nfor _, file in ipairs(prj.allfiles) do\nif not table.icontains(prj.excludes, file) and not table.icontains(cfg.excludes, file) then\nif not table.icontains(cfg.files, file) then\nadd_file(file)\nelse\nverify_file(file)\nend\nend\nend\ntable.sort(excluded)\nreturn excluded\nend\nfunction xcode.XCBuildConfiguration_Impl(tr, id, opts, cfg)\nlocal cfgname = xcode.getconfigname(cfg)\n_p(2,'%s /* %s */ = {', id, cfgname)\n_p(3,"
+ "'isa = XCBuildConfiguration;')\n_p(3,'buildSettings = {')\nfor k, v in table.sortedpairs(opts) do\nif type(v) == \"table\" then\nif #v > 0 then\n_p(4,'%s = (', k)\nfor i, v2 in ipairs(v) do\n_p(5,'%s,', xcode.quotestr(tostring(v2)))\nend\n_p(4,');')\nend\nelse\n_p(4,'%s = %s;', k, xcode.quotestr(tostring(v)))\nend\nend\n_p(3,'};')\n_p(3,'name = %s;', xcode.quotestr(cfgname))\n_p(2,'};')\nend\nlocal function add_options(options, extras)\nfor _, tbl in ipairs(extras) do\nfor tkey, tval in pairs(tbl) do\noptions[tkey] = tval\nend\nend\nend\nlocal function add_wholearchive_links(opts, cfg)\nif #cfg.wholearchive > 0 then\nlocal linkopts = {}\nfor _, depcfg in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\nif table.icontains(cfg.wholearchive, depcfg.project.name) then\nlocal linkpath = path.rebase(depcfg.linktarget.fullpath, depcfg.location, cfg.location)\ntable.insert(linkopts, \"-force_load\")\ntable.insert(linkopts, linkpath)\nend\nend\nif opts.OTHER_LDFLAGS then\nlinkopts = table.join(linkopts, opts"
+ ".OTHER_LDFLAGS)\nend\nopts.OTHER_LDFLAGS = linkopts\nend\nend\nfunction xcode.XCBuildConfiguration(tr, prj, opts)\n_p('/* Begin XCBuildConfiguration section */')\nfor _, target in ipairs(tr.products.children) do\nfor _, cfg in ipairs(tr.configs) do\nlocal values = opts.ontarget(tr, target, cfg)\nadd_options(values, cfg.xcodetargetopts)\nxcode.XCBuildConfiguration_Impl(tr, cfg.xcode.targetid, values, cfg)\nend\nend\nfor _, cfg in ipairs(tr.configs) do\nlocal values = opts.onproject(tr, prj, cfg)\nadd_options(values, cfg.xcodeprojectopts)\nadd_wholearchive_links(values, cfg)\nxcode.XCBuildConfiguration_Impl(tr, cfg.xcode.projectid, values, cfg)\nend\n_p('/* End XCBuildConfiguration section */')\n_p('')\nend\nfunction xcode.XCBuildConfigurationList(tr)\nlocal sln = tr.project.solution\n_p('/* Begin XCConfigurationList section */')\nfor _, target in ipairs(tr.products.children) do\n_p(2,'%s /* Build configuration list for PBXNativeTarget \"%s\" */ = {', target.cfgsection, target.name)\n_p(3,'isa = XCConfigurationL"
+ "ist;')\n_p(3,'buildConfigurations = (')\nfor _, cfg in ipairs(tr.configs) do\n_p(4,'%s /* %s */,', cfg.xcode.targetid, xcode.getconfigname(cfg))\nend\n_p(3,');')\n_p(3,'defaultConfigurationIsVisible = 0;')\n_p(3,'defaultConfigurationName = \"%s\";', xcode.getconfigname(tr.configs[1]))\n_p(2,'};')\nend\n_p(2,'1DEB928908733DD80010E9CD /* Build configuration list for PBXProject \"%s\" */ = {', tr.name)\n_p(3,'isa = XCConfigurationList;')\n_p(3,'buildConfigurations = (')\nfor _, cfg in ipairs(tr.configs) do\n_p(4,'%s /* %s */,', cfg.xcode.projectid, xcode.getconfigname(cfg))\nend\n_p(3,');')\n_p(3,'defaultConfigurationIsVisible = 0;')\n_p(3,'defaultConfigurationName = \"%s\";', xcode.getconfigname(tr.configs[1]))\n_p(2,'};')\n_p('/* End XCConfigurationList section */')\n_p('')\nend\nfunction xcode.versionge(version, reference)\nlocal vparts = string.explode(version, \".\", true)\nlocal rparts = string.explode(reference, \".\", true)\nfor i=1,#rparts do\nlocal rnum = tonumber(rparts[i]) or 0\nlocal vnum = tonumber("
+ "vparts[i]) or 0\nif vnum < rnum then\nreturn false\nend\nend\nreturn true\nend\nfunction xcode.Footer()\n_p(1,'};')\n_p('\\trootObject = __RootObject_ /* Project object */;')\n_p('}')\nend\n",
/* actions/xcode/xcode_project.lua */
"local xcode = premake.xcode\nlocal tree = premake.tree\nfunction xcode.buildprjtree(prj)\nlocal tr = premake.project.buildsourcetree(prj, true)\ntr.configs = {}\nfor _, cfgname in ipairs(prj.solution.configurations) do\nfor _, platform in ipairs(prj.solution.xcode.platforms) do\nlocal cfg = premake.getconfig(prj, cfgname, platform)\ncfg.xcode = {}\ncfg.xcode.targetid = xcode.newid(prj.xcode.projectnode, \"tgt:\"..platform..cfgname)\ncfg.xcode.projectid = xcode.newid(tr, \"prj:\"..platform..cfgname)\ntable.insert(tr.configs, cfg)\nend\nend\ntree.traverse(tr, {\nonbranch = function(node)\nif path.getextension(node.name) == \".lproj\" then\nlocal lang = path.getbasename(node.name) -- \"English\", \"French\", etc.\nfor _, filenode in ipairs(node.children) do\nlocal grpnode = node.parent.children[filenode.name]\nif not grpnode then\ngrpnode = tree.insert(node.parent, tree.new(filenode.name))\ngrpnode.kind = \"vgroup\"\nend\nfilenode.name = path.getbasename(lang)\ntree.insert(grpnode, filenode)\nend\ntree.remove(no"
@@ -412,63 +454,55 @@ const char* builtin_scripts[] = {
"(node, depth)\nif (node.location and node.parent and node.parent.location) then\nnode.location = path.getrelative(node.parent.location, node.location)\nend\nend\n}, true)\ntree.traverse(tr, {\nonnode = function(node)\nnode.id = xcode.newid(node)\nif xcode.getbuildcategory(node) then\nnode.buildid = xcode.newid(node, \"build\")\nend\nif string.endswith(node.name, \"Info.plist\") then\ntr.infoplist = node\nend\nif string.endswith(node.name, \".entitlements\") then\ntr.entitlements = node\nend\nend\n}, true)\nnode = tree.insert(tr.products, prj.xcode.projectnode)\nnode.kind = \"product\"\nnode.path = node.cfg.buildtarget.fullpath\nnode.cfgsection = xcode.newid(node, \"cfg\")\nnode.resstageid = xcode.newid(node, \"rez\")\nnode.sourcesid = xcode.newid(node, \"src\")\nnode.fxstageid = xcode.newid(node, \"fxs\")\nreturn tr\nend\n",
/* actions/xcode/xcode_scheme.lua */
- "local premake = premake\nlocal xcode = premake.xcode\nlocal function buildableref(indent, prj, cfg)\ncfg = cfg or premake.eachconfig(prj)()\n_p(indent + 0, '<BuildableReference')\n_p(indent + 1, 'BuildableIdentifier = \"primary\"')\n_p(indent + 1, 'BlueprintIdentifier = \"%s\"', prj.xcode.projectnode.targetid)\n_p(indent + 1, 'BuildableName = \"%s\"', cfg.buildtarget.name)\n_p(indent + 1, 'BlueprintName = \"%s\"', prj.name)\n_p(indent + 1, 'ReferencedContainer = \"container:%s.xcodeproj\">', prj.name)\n_p(indent + 0, '</BuildableReference>')\nend\nlocal function cmdlineargs(indent, cfg)\nif #cfg.debugargs > 0 then\n_p(indent, '<CommandLineArguments>')\nfor _, arg in ipairs(cfg.debugargs) do\n_p(indent + 1, '<CommandLineArgument')\n_p(indent + 2, 'argument = \"%s\"', arg)\n_p(indent + 2, 'isEnabled = \"YES\">')\n_p(indent + 1, '</CommandLineArgument>')\nend\n_p(indent, '</CommandLineArguments>')\nend\nend\nlocal function envvars(indent, cfg)\nif #cfg.debugenvs > 0 then\n_p(indent, '<EnvironmentVariables>')\nf"
- "or _, arg in ipairs(cfg.debugenvs) do\nlocal eq = arg:find(\"=\")\nlocal k = arg:sub(1, eq)\nlocal v = arg:sub(eq + 1)\n_p(indent + 1, '<EnvironmentVariable')\n_p(indent + 2, 'key = \"%s\"', arg:sub(1, eq))\n_p(indent + 2, 'value = \"%s\"', arg:sub(eq))\n_p(indent + 2, 'isEnabled = \"YES\">')\n_p(indent + 1, '</EnvironmentVariable>')\nend\n_p(indent, '</EnvironmentVariables>')\nend\nend\nlocal function workingdir(dir)\nif not path.isabsolute(dir) then\ndir = \"$PROJECT_DIR/\" .. dir\nend\nreturn dir\nend\nlocal function bestconfig(prj, fordebug)\nlocal bestcfg = nil\nlocal bestscore = -1\nfor cfg in premake.eachconfig(prj) do\nlocal score = 0\nif cfg.platform == \"Native\" then\nscore = score + 10\nend\nif fordebug and cfg.name == \"Debug\" then\nscore = score + 1\nend\nif not fordebug and cfg.name == \"Release\" then\nscore = score + 1\nend\nif score > bestscore then\nbestcfg = cfg\nbestscore = score\nend\nend\nreturn bestcfg\nend\nfunction xcode.scheme(tobuild, primary, schemecfg)\n_p('<?xml version=\"1.0\" "
- "encoding=\"UTF-8\"?>')\n_p('<Scheme')\n_p(1, 'LastUpgradeVersion = \"0940\"')\n_p(1, 'version = \"1.3\">')\n_p(1, '<BuildAction')\n_p(2, 'parallelizeBuildables = \"YES\"')\n_p(2, 'buildImplicitDependencies = \"YES\">')\n_p(2, '<BuildActionEntries>')\nfor _, prj in ipairs(tobuild) do\n_p(3, '<BuildActionEntry')\n_p(4, 'buildForTesting = \"YES\"')\n_p(4, 'buildForRunning = \"YES\"')\n_p(4, 'buildForProfiling = \"YES\"')\n_p(4, 'buildForArchiving = \"YES\"')\n_p(4, 'buildForAnalyzing = \"YES\">')\nbuildableref(4, prj)\n_p(3, '</BuildActionEntry>')\nend\nlocal debugcfg = schemecfg or bestconfig(primary, true)\nlocal releasecfg = schemecfg or bestconfig(primary, false)\nlocal debugname = xcode.getconfigname(debugcfg)\nlocal releasename = xcode.getconfigname(releasecfg)\n_p(2, '</BuildActionEntries>')\n_p(1, '</BuildAction>')\n_p(1, '<TestAction')\n_p(2, 'buildConfiguration = \"%s\"', debugname)\n_p(2, 'selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"')\n_p(2, 'selectedLauncherIdentifier"
- " = \"Xcode.DebuggerFoundation.Launcher.LLDB\"')\n_p(2, 'shouldUseLaunchSchemeArgsEnv = \"YES\">')\n_p(2, '<Testables>')\n_p(2, '</Testables>')\n_p(2, '<MacroExpansion>')\nbuildableref(3, primary, debugcfg)\n_p(2, '</MacroExpansion>')\n_p(2, '<AdditionalOptions>')\n_p(2, '</AdditionalOptions>')\n_p(1, '</TestAction>')\n_p(1, '<LaunchAction')\n_p(2, 'buildConfiguration = \"%s\"', debugname)\n_p(2, 'selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"')\n_p(2, 'selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"')\n_p(2, 'launchStyle = \"0\"')\nif debugcfg.debugdir then\n_p(2, 'useCustomWorkingDirectory = \"YES\"')\n_p(2, 'customWorkingDirectory = \"%s\"', workingdir(debugcfg.debugdir))\nelse\n_p(2, 'useCustomWorkingDirectory = \"NO\"')\nend\n_p(2, 'ignoresPersistentStateOnLaunch = \"NO\"')\n_p(2, 'debugDocumentVersioning = \"YES\"')\n_p(2, 'debugServiceExtension = \"internal\"')\n_p(2, 'allowLocationSimulation = \"YES\">')\nif debugcfg.debugcmd then\n_p(2, '<PathRunnable')"
- "\n_p(3, 'runnableDebuggingMode = \"0\"')\n_p(3, 'FilePath = \"%s\">', debugcfg.debugcmd)\n_p(2, '</PathRunnable>')\nelse\n_p(2, '<BuildableProductRunnable')\n_p(3, 'runnableDebuggingMode = \"0\">')\nbuildableref(3, primary, debugcfg)\n_p(2, '</BuildableProductRunnable>')\nend\ncmdlineargs(2, debugcfg)\nenvvars(2, debugcfg)\n_p(2, '<AdditionalOptions>')\n_p(2, '</AdditionalOptions>')\n_p(1, '</LaunchAction>')\n_p(1, '<ProfileAction')\n_p(2, 'buildConfiguration = \"%s\"', releasename)\n_p(2, 'shouldUseLaunchSchemeArgsEnv = \"YES\"')\n_p(2, 'savedToolIdentifier = \"\"')\nif releasecfg.debugdir then\n_p(2, 'useCustomWorkingDirectory = \"YES\"')\n_p(2, 'customWorkingDirectory = \"%s\"', workingdir(releasecfg.debugdir))\nelse\n_p(2, 'useCustomWorkingDirectory = \"NO\"')\nend\n_p(2, 'debugDocumentVersioning = \"YES\">')\n_p(2, '<BuildableProductRunnable')\n_p(3, 'runnableDebuggingMode = \"0\">')\nbuildableref(3, primary, releasecfg)\n_p(2, '</BuildableProductRunnable>')\ncmdlineargs(2, releasecfg)\nenvvars(2, release"
- "cfg)\n_p(1, '</ProfileAction>')\n_p(1, '<AnalyzeAction')\n_p(2, 'buildConfiguration = \"%s\">', debugname)\n_p(1, '</AnalyzeAction>')\n_p(1, '<ArchiveAction')\n_p(2, 'buildConfiguration = \"%s\"', releasename)\n_p(2, 'revealArchiveInOrganizer = \"YES\">')\n_p(1, '</ArchiveAction>')\n_p('</Scheme>')\nend\nfunction xcode.generate_schemes(prj, base_path)\nif (prj.kind == \"ConsoleApp\" or prj.kind == \"WindowedApp\") or (prj.options and prj.options.XcodeLibrarySchemes) then\nif prj.options and prj.options.XcodeSchemeNoConfigs then\npremake.generate(prj, path.join(base_path, \"%%.xcscheme\"),\nfunction(prj) xcode.scheme({prj}, prj) end)\nelse\nfor cfg in premake.eachconfig(prj) do\npremake.generate(prj, path.join(base_path, \"%% \" .. cfg.name .. \".xcscheme\"),\nfunction(prj) xcode.scheme({prj}, prj, cfg) end)\nend\nend\nend\nend\n",
+ "local premake = premake\nlocal xcode = premake.xcode\nlocal function buildableref(indent, prj, cfg)\ncfg = cfg or premake.eachconfig(prj)()\n_p(indent + 0, '<BuildableReference')\n_p(indent + 1, 'BuildableIdentifier = \"primary\"')\n_p(indent + 1, 'BlueprintIdentifier = \"%s\"', prj.xcode.projectnode.targetid)\n_p(indent + 1, 'BuildableName = \"%s.app\"', cfg.buildtarget.name)\n_p(indent + 1, 'BlueprintName = \"%s\"', prj.name)\n_p(indent + 1, 'ReferencedContainer = \"container:%s.xcodeproj\">', prj.name)\n_p(indent + 0, '</BuildableReference>')\nend\nlocal function cmdlineargs(indent, cfg)\nif #cfg.debugargs > 0 then\n_p(indent, '<CommandLineArguments>')\nfor _, arg in ipairs(cfg.debugargs) do\n_p(indent + 1, '<CommandLineArgument')\n_p(indent + 2, 'argument = \"%s\"', arg)\n_p(indent + 2, 'isEnabled = \"YES\">')\n_p(indent + 1, '</CommandLineArgument>')\nend\n_p(indent, '</CommandLineArguments>')\nend\nend\nlocal function envvars(indent, cfg)\nif #cfg.debugenvs > 0 then\n_p(indent, '<EnvironmentVariables>'"
+ ")\nfor _, arg in ipairs(cfg.debugenvs) do\nlocal eq = arg:find(\"=\")\nlocal k = arg:sub(1, eq)\nlocal v = arg:sub(eq + 1)\n_p(indent + 1, '<EnvironmentVariable')\n_p(indent + 2, 'key = \"%s\"', arg:sub(1, eq))\n_p(indent + 2, 'value = \"%s\"', arg:sub(eq))\n_p(indent + 2, 'isEnabled = \"YES\">')\n_p(indent + 1, '</EnvironmentVariable>')\nend\n_p(indent, '</EnvironmentVariables>')\nend\nend\nlocal function workingdir(dir)\nif not path.isabsolute(dir) then\ndir = \"$PROJECT_DIR/\" .. dir\nend\nreturn dir\nend\nlocal function bestconfig(prj, fordebug)\nlocal bestcfg = nil\nlocal bestscore = -1\nfor cfg in premake.eachconfig(prj) do\nlocal score = 0\nif cfg.platform == \"Native\" then\nscore = score + 10\nend\nif fordebug and cfg.name == \"Debug\" then\nscore = score + 1\nend\nif not fordebug and cfg.name == \"Release\" then\nscore = score + 1\nend\nif score > bestscore then\nbestcfg = cfg\nbestscore = score\nend\nend\nreturn bestcfg\nend\nfunction xcode.scheme(tobuild, primary, schemecfg)\n_p('<?xml version=\"1."
+ "0\" encoding=\"UTF-8\"?>')\n_p('<Scheme')\n_p(1, 'LastUpgradeVersion = \"0940\"')\n_p(1, 'version = \"1.3\">')\n_p(1, '<BuildAction')\n_p(2, 'parallelizeBuildables = \"YES\"')\n_p(2, 'buildImplicitDependencies = \"YES\">')\n_p(2, '<BuildActionEntries>')\nfor _, prj in ipairs(tobuild) do\n_p(3, '<BuildActionEntry')\n_p(4, 'buildForTesting = \"YES\"')\n_p(4, 'buildForRunning = \"YES\"')\n_p(4, 'buildForProfiling = \"YES\"')\n_p(4, 'buildForArchiving = \"YES\"')\n_p(4, 'buildForAnalyzing = \"YES\">')\nbuildableref(4, prj)\n_p(3, '</BuildActionEntry>')\nend\nlocal debugcfg = schemecfg or bestconfig(primary, true)\nlocal releasecfg = schemecfg or bestconfig(primary, false)\nlocal debugname = xcode.getconfigname(debugcfg)\nlocal releasename = xcode.getconfigname(releasecfg)\n_p(2, '</BuildActionEntries>')\n_p(1, '</BuildAction>')\n_p(1, '<TestAction')\n_p(2, 'buildConfiguration = \"%s\"', debugname)\n_p(2, 'selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"')\n_p(2, 'selectedLauncherIdenti"
+ "fier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"')\n_p(2, 'shouldUseLaunchSchemeArgsEnv = \"YES\">')\n_p(2, '<Testables>')\n_p(2, '</Testables>')\n_p(2, '<MacroExpansion>')\nbuildableref(3, primary, debugcfg)\n_p(2, '</MacroExpansion>')\n_p(2, '<AdditionalOptions>')\n_p(2, '</AdditionalOptions>')\n_p(1, '</TestAction>')\n_p(1, '<LaunchAction')\n_p(2, 'buildConfiguration = \"%s\"', debugname)\n_p(2, 'selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"')\n_p(2, 'selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"')\n_p(2, 'launchStyle = \"0\"')\nif debugcfg.debugdir then\n_p(2, 'useCustomWorkingDirectory = \"YES\"')\n_p(2, 'customWorkingDirectory = \"%s\"', workingdir(debugcfg.debugdir))\nelse\n_p(2, 'useCustomWorkingDirectory = \"NO\"')\nend\n_p(2, 'ignoresPersistentStateOnLaunch = \"NO\"')\n_p(2, 'debugDocumentVersioning = \"NO\"')\n_p(2, 'debugServiceExtension = \"internal\"')\n_p(2, 'allowLocationSimulation = \"YES\">')\nif debugcfg.debugcmd then\n_p(2, '<PathRunnable"
+ "')\n_p(3, 'runnableDebuggingMode = \"0\"')\n_p(3, 'FilePath = \"%s\">', debugcfg.debugcmd)\n_p(2, '</PathRunnable>')\nelse\n_p(2, '<BuildableProductRunnable')\n_p(3, 'runnableDebuggingMode = \"0\">')\nbuildableref(3, primary, debugcfg)\n_p(2, '</BuildableProductRunnable>')\nend\ncmdlineargs(2, debugcfg)\nenvvars(2, debugcfg)\n_p(2, '<AdditionalOptions>')\n_p(2, '</AdditionalOptions>')\n_p(1, '</LaunchAction>')\n_p(1, '<ProfileAction')\n_p(2, 'buildConfiguration = \"%s\"', releasename)\n_p(2, 'shouldUseLaunchSchemeArgsEnv = \"YES\"')\n_p(2, 'savedToolIdentifier = \"\"')\nif releasecfg.debugdir then\n_p(2, 'useCustomWorkingDirectory = \"YES\"')\n_p(2, 'customWorkingDirectory = \"%s\"', workingdir(releasecfg.debugdir))\nelse\n_p(2, 'useCustomWorkingDirectory = \"NO\"')\nend\n_p(2, 'debugDocumentVersioning = \"NO\">')\n_p(2, '<BuildableProductRunnable')\n_p(3, 'runnableDebuggingMode = \"0\">')\nbuildableref(3, primary, releasecfg)\n_p(2, '</BuildableProductRunnable>')\ncmdlineargs(2, releasecfg)\nenvvars(2, releas"
+ "ecfg)\n_p(1, '</ProfileAction>')\n_p(1, '<AnalyzeAction')\n_p(2, 'buildConfiguration = \"%s\">', debugname)\n_p(1, '</AnalyzeAction>')\n_p(1, '<ArchiveAction')\n_p(2, 'buildConfiguration = \"%s\"', releasename)\n_p(2, 'revealArchiveInOrganizer = \"YES\">')\n_p(1, '</ArchiveAction>')\n_p('</Scheme>')\nend\nfunction xcode.generate_schemes(prj, base_path)\nif (prj.kind == \"ConsoleApp\" or prj.kind == \"WindowedApp\") or (prj.options and prj.options.XcodeLibrarySchemes) then\nif prj.options and prj.options.XcodeSchemeNoConfigs then\npremake.generate(prj, path.join(base_path, \"%%.xcscheme\"),\nfunction(prj) xcode.scheme({prj}, prj) end)\nelse\nfor cfg in premake.eachconfig(prj) do\npremake.generate(prj, path.join(base_path, \"%% \" .. cfg.name .. \".xcscheme\"),\nfunction(prj) xcode.scheme({prj}, prj, cfg) end)\nend\nend\nend\nend\n",
/* actions/xcode/xcode_workspace.lua */
- "local premake = premake\nlocal xcode = premake.xcode\nxcode.allscheme = false\nfunction xcode.workspace_head()\n_p('<?xml version=\"1.0\" encoding=\"UTF-8\"?>')\n_p('<Workspace')\n_p(1,'version = \"1.0\">')\nend\nfunction xcode.workspace_tail()\n_p('</Workspace>')\nend\nfunction xcode.workspace_file_ref(prj, indent)\nlocal projpath = path.getrelative(prj.solution.location, prj.location)\nif projpath == '.' then projpath = ''\nelse projpath = projpath ..'/'\nend\n_p(indent, '<FileRef')\n_p(indent + 1, 'location = \"group:%s\">', projpath .. prj.name .. '.xcodeproj')\n_p(indent, '</FileRef>')\nend\nfunction xcode.workspace_group(grp, indent)\n_p(indent, '<Group')\n_p(indent + 1, 'location = \"container:\"')\n_p(indent + 1, 'name = \"%s\">', grp.name)\nlocal function comparenames(a, b)\nreturn a.name < b.name\nend\nlocal groups = table.join(grp.groups)\nlocal projects = table.join(grp.projects)\ntable.sort(groups, comparenames)\ntable.sort(projects, comparenames)\nfor _, child in ipairs(groups) do\nxcode.workspac"
- "e_group(child, indent + 1)\nend\nfor _, prj in ipairs(projects) do\nxcode.workspace_file_ref(prj, indent + 1)\nend\n_p(indent, '</Group>')\nend\nfunction xcode.workspace_generate(sln)\nxcode.preparesolution(sln)\nxcode.workspace_head()\nxcode.reorderProjects(sln)\nfor grp in premake.solution.eachgroup(sln) do\nif grp.parent == nil then\nxcode.workspace_group(grp, 1)\nend\nend\nfor prj in premake.solution.eachproject(sln) do\nif prj.group == nil then\nxcode.workspace_file_ref(prj, 1)\nend\nend\nxcode.workspace_tail()\nend\nfunction xcode.workspace_scheme(sln)\nif not xcode.allscheme then\nreturn false\nend\nlocal projects = {}\nlocal primary = nil\nfor prj in premake.solution.eachproject(sln) do\nif not primary or (sln.startproject == prj.name) then\nprimary = prj\nend\ntable.insert(projects, prj)\nend\nxcode.scheme(projects, primary)\nend\nfunction xcode.workspace_settings(sln)\n_p('<?xml version=\"1.0\" encoding=\"UTF-8\"?>')\n_p('<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/D"
- "TDs/PropertyList-1.0.dtd\">')\n_p('<plist version=\"1.0\">')\n_p('<dict>')\n_p(1, '<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>')\n_p(1, '<false/>')\n_p('</dict>')\n_p('</plist>')\nend\nfunction xcode.reorderProjects(sln)\nif sln.startproject then\nfor i, prj in ipairs(sln.projects) do\nif sln.startproject == prj.name then\nlocal cur = prj.group\nwhile cur ~= nil do\nfor j, group in ipairs(sln.groups) do\nif group == cur then\ntable.remove(sln.groups, j)\nbreak\nend\nend\ntable.insert(sln.groups, 1, cur)\ncur = cur.parent\nend\ntable.remove(sln.projects, i)\ntable.insert(sln.projects, 1, prj)\nbreak\nend\nend\nend\nend\n",
+ "local premake = premake\nlocal xcode = premake.xcode\nxcode.allscheme = false\nfunction xcode.workspace_head()\n_p('<?xml version=\"1.0\" encoding=\"UTF-8\"?>')\n_p('<!-- Generated by GENie https://github.com/bkaradzic/GENie -->')\n_p('<Workspace')\n_p(1,'version = \"1.0\">')\nend\nfunction xcode.workspace_tail()\n_p('</Workspace>')\nend\nfunction xcode.workspace_file_ref(prj, indent)\nlocal projpath = path.getrelative(prj.solution.location, prj.location)\nif projpath == '.' then projpath = ''\nelse projpath = projpath ..'/'\nend\n_p(indent, '<FileRef')\n_p(indent + 1, 'location = \"group:%s\">', projpath .. prj.name .. '.xcodeproj')\n_p(indent, '</FileRef>')\nend\nfunction xcode.workspace_group(grp, indent)\n_p(indent, '<Group')\n_p(indent + 1, 'location = \"container:\"')\n_p(indent + 1, 'name = \"%s\">', grp.name)\nlocal function comparenames(a, b)\nreturn a.name < b.name\nend\nlocal groups = table.join(grp.groups)\nlocal projects = table.join(grp.projects)\ntable.sort(groups, comparenames)\ntable.sort(proj"
+ "ects, comparenames)\nfor _, child in ipairs(groups) do\nxcode.workspace_group(child, indent + 1)\nend\nfor _, prj in ipairs(projects) do\nxcode.workspace_file_ref(prj, indent + 1)\nend\n_p(indent, '</Group>')\nend\nfunction xcode.workspace_generate(sln)\nxcode.preparesolution(sln)\nxcode.workspace_head()\nxcode.reorderProjects(sln)\nfor grp in premake.solution.eachgroup(sln) do\nif grp.parent == nil then\nxcode.workspace_group(grp, 1)\nend\nend\nfor prj in premake.solution.eachproject(sln) do\nif prj.group == nil then\nxcode.workspace_file_ref(prj, 1)\nend\nend\nxcode.workspace_tail()\nend\nfunction xcode.workspace_scheme(sln)\nif not xcode.allscheme then\nreturn false\nend\nlocal projects = {}\nlocal primary = nil\nfor prj in premake.solution.eachproject(sln) do\nif not primary or (sln.startproject == prj.name) then\nprimary = prj\nend\ntable.insert(projects, prj)\nend\nxcode.scheme(projects, primary)\nend\nfunction xcode.workspace_settings(sln)\n_p('<?xml version=\"1.0\" encoding=\"UTF-8\"?>')\n_p('<!DOCTYPE"
+ " plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">')\n_p('<plist version=\"1.0\">')\n_p('<dict>')\n_p(1, '<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>')\n_p(1, '<false/>')\n_p('</dict>')\n_p('</plist>')\nend\nfunction xcode.reorderProjects(sln)\nif sln.startproject then\nfor i, prj in ipairs(sln.projects) do\nif sln.startproject == prj.name then\nlocal cur = prj.group\nwhile cur ~= nil do\nfor j, group in ipairs(sln.groups) do\nif group == cur then\ntable.remove(sln.groups, j)\nbreak\nend\nend\ntable.insert(sln.groups, 1, cur)\ncur = cur.parent\nend\ntable.remove(sln.projects, i)\ntable.insert(sln.projects, 1, prj)\nbreak\nend\nend\nend\nend\n",
/* actions/xcode/xcode8.lua */
"local premake = premake\npremake.xcode8 = { }\nlocal xcode = premake.xcode\nlocal xcode8 = premake.xcode8\nfunction xcode8.XCBuildConfiguration_Target(tr, target, cfg)\nlocal cfgname = xcode.getconfigname(cfg)\nlocal installpaths = {\nConsoleApp = \"/usr/local/bin\",\nWindowedApp = \"$(HOME)/Applications\",\nSharedLib = \"/usr/local/lib\",\nStaticLib = \"/usr/local/lib\",\nBundle = \"$(LOCAL_LIBRARY_DIR)/Bundles\",\n}\nlocal options = {\nALWAYS_SEARCH_USER_PATHS = \"NO\",\nGCC_DYNAMIC_NO_PIC = \"NO\",\nGCC_MODEL_TUNING = \"G5\",\nINSTALL_PATH = installpaths[cfg.kind],\nPRODUCT_NAME = cfg.buildtarget.basename,\n}\nif not cfg.flags.Symbols then\noptions.DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\"\nend\nif cfg.kind ~= \"StaticLib\" and cfg.buildtarget.prefix ~= \"\" then\noptions.EXECUTABLE_PREFIX = cfg.buildtarget.prefix\nend\nif cfg.targetextension then\nlocal ext = cfg.targetextension\noptions.EXECUTABLE_EXTENSION = iif(ext:startswith(\".\"), ext:sub(2), ext)\nend\nif cfg.flags.ObjcARC then\noptions.CLA"
- "NG_ENABLE_OBJC_ARC = \"YES\"\nend\nlocal outdir = path.getdirectory(cfg.buildtarget.bundlepath)\nif outdir ~= \".\" then\noptions.CONFIGURATION_BUILD_DIR = outdir\nend\nif tr.infoplist then\noptions.INFOPLIST_FILE = tr.infoplist.cfg.name\nend\nlocal infoplist_file = nil\nfor _, v in ipairs(cfg.files) do\nif (string.find (string.lower (v), 'info.plist') ~= nil) then\ninfoplist_file = string.format('$(SRCROOT)/%s', v)\nend\nend\nif infoplist_file ~= nil then\noptions.INFOPLIST_FILE = infoplist_file\nend\nlocal action = premake.action.current()\nlocal get_opt = function(opt, def)\nreturn (opt and #opt > 0) and opt or def\nend\nlocal iosversion = get_opt(cfg.iostargetplatformversion, action.xcode.iOSTargetPlatformVersion)\nlocal macosversion = get_opt(cfg.macostargetplatformversion, action.xcode.macOSTargetPlatformVersion)\nlocal tvosversion = get_opt(cfg.tvostargetplatformversion, action.xcode.tvOSTargetPlatformVersion)\nif iosversion then\noptions.IPHONEOS_DEPLOYMENT_TARGET = iosversion\nelseif macosversion then"
- "\noptions.MACOSX_DEPLOYMENT_TARGET = macosversion\nelseif tvosversion then\noptions.TVOS_DEPLOYMENT_TARGET = tvosversion\nend\nif cfg.kind == \"Bundle\" and not cfg.options.SkipBundling then\noptions.PRODUCT_BUNDLE_IDENTIFIER = \"genie.\" .. cfg.buildtarget.basename:gsub(\"%s+\", \".\") --replace spaces with .\nlocal ext = cfg.targetextension\nif ext then\noptions.WRAPPER_EXTENSION = iif(ext:startswith(\".\"), ext:sub(2), ext)\nelse\noptions.WRAPPER_EXTENSION = \"bundle\"\nend\nend\nreturn options\nend\nfunction xcode8.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal cfgname = xcode.getconfigname(cfg)\nlocal archs = {\nNative = nil,\nx32 = \"i386\",\nx64 = \"x86_64\",\nUniversal32 = \"$(ARCHS_STANDARD_32_BIT)\",\nUniversal64 = \"$(ARCHS_STANDARD_64_BIT)\",\nUniversal = \"$(ARCHS_STANDARD_32_64_BIT)\",\n}\nlocal checks = {\n[\"-ffast-math\"] = cfg.flags.FloatFast,\n[\"-ffloat-store\"] = cfg.flags.FloatStrict,\n[\"-fomit-frame-pointer\"] = cfg.flags.NoFramePointer,\n}\nloc"
- "al cflags = { }\nfor flag, check in pairs(checks) do\nif check then\ntable.insert(cflags, flag)\nend\nend\nlocal ldflags = { }\nfor _, lib in ipairs(premake.getlinks(cfg, \"system\")) do\nif not xcode.isframework(lib) then\ntable.insert(ldflags, \"-l\" .. lib)\nend\nend\nlocal options = {\nARCHS = archs[cfg.platform],\nCLANG_WARN__DUPLICATE_METHOD_MATCH = \"YES\",\nCLANG_WARN_BOOL_CONVERSION = \"YES\",\nCLANG_WARN_CONSTANT_CONVERSION = \"YES\",\nCLANG_WARN_EMPTY_BODY = \"YES\",\nCLANG_WARN_ENUM_CONVERSION = \"YES\",\nCLANG_WARN_INFINITE_RECURSION = \"YES\",\nCLANG_WARN_INT_CONVERSION = \"YES\",\nCLANG_WARN_SUSPICIOUS_MOVE = \"YES\",\nCLANG_WARN_UNREACHABLE_CODE = \"YES\",\nCONFIGURATION_TEMP_DIR = \"$(OBJROOT)\",\nENABLE_STRICT_OBJC_MSGSEND = \"YES\",\nENABLE_TESTABILITY = \"YES\",\nGCC_C_LANGUAGE_STANDARD = \"gnu99\",\nGCC_NO_COMMON_BLOCKS = \"YES\",\nGCC_PREP"
- "ROCESSOR_DEFINITIONS = cfg.defines,\nGCC_SYMBOLS_PRIVATE_EXTERN = \"NO\",\nGCC_WARN_64_TO_32_BIT_CONVERSION = \"YES\",\nGCC_WARN_ABOUT_RETURN_TYPE = \"YES\",\nGCC_WARN_UNDECLARED_SELECTOR = \"YES\",\nGCC_WARN_UNINITIALIZED_AUTOS = \"YES\",\nGCC_WARN_UNUSED_FUNCTION = \"YES\",\nGCC_WARN_UNUSED_VARIABLE = \"YES\",\nHEADER_SEARCH_PATHS = table.join(cfg.includedirs, cfg.systemincludedirs),\nLIBRARY_SEARCH_PATHS = cfg.libdirs,\nOBJROOT = cfg.objectsdir,\nONLY_ACTIVE_ARCH = \"YES\",\nOTHER_CFLAGS = table.join(cflags, cfg.buildoptions, cfg.buildoptions_c),\nOTHER_CPLUSPLUSFLAGS = table.join(cflags, cfg.buildoptions, cfg.buildoptions_cpp),\nOTHER_LDFLAGS = table.join(ldflags, cfg.linkoptions),\nSDKROOT = xcode.toolset,\nUSER_HEADER_SEARCH_PATHS = cfg.userincludedirs,\n}\nif tr.entitlements then\nop"
- "tions.CODE_SIGN_ENTITLEMENTS = tr.entitlements.cfg.name\nend\nlocal targetdir = path.getdirectory(cfg.buildtarget.bundlepath)\nif targetdir ~= \".\" then\noptions.CONFIGURATION_BUILD_DIR = \"$(SYMROOT)\"\noptions.SYMROOT = targetdir\nend\nif cfg.flags.Symbols then\noptions.COPY_PHASE_STRIP = \"NO\"\nend\nlocal excluded = xcode.cfg_excluded_files(prj, cfg)\nif #excluded > 0 then\noptions.EXCLUDED_SOURCE_FILE_NAMES = excluded\nend\nif cfg.flags.NoExceptions then\noptions.GCC_ENABLE_CPP_EXCEPTIONS = \"NO\"\nend\nif cfg.flags.NoRTTI then\noptions.GCC_ENABLE_CPP_RTTI = \"NO\"\nend\nif cfg.flags.Symbols and not cfg.flags.NoEditAndContinue then\noptions.GCC_ENABLE_FIX_AND_CONTINUE = \"YES\"\nend\nif cfg.flags.NoExceptions then\noptions.GCC_ENABLE_OBJC_EXCEPTIONS = \"NO\"\nend\nif cfg.flags.Optimize or cfg.flags.OptimizeSize then\noptions.GCC_OPTIMIZATION_LEVEL = \"s\"\nelseif cfg.flags.OptimizeSpeed then\noptions.GCC_OPTIMIZATION_LEVEL = 3\nelse\noptions.GCC_OPTIMIZATION_LEVEL = 0\nend\nif cfg.pchheader and not cfg.f"
- "lags.NoPCH then\noptions.GCC_PRECOMPILE_PREFIX_HEADER = \"YES\"\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\noptions.GCC_PREFIX_HEADER = pch\nend\nif cfg.flags.FatalWarnings then\noptions.GCC_TREAT_WARNINGS_AS_ERRORS = \"YES\"\nend\nif cfg.kind == \"Bundle\" then\noptions.MACH_O_TYPE = \"mh_bundle\"\nend\nif cfg.flags.StaticRuntime then\noptions.STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = \"static\"\nend\nif cfg.flags.PedanticWarnings or cfg.flags.ExtraWarnings then\noptions.WARNING_CFLAGS = \"-Wall\"\nend\nif cfg.flags.Cpp11 then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++11\"\nelseif cfg.flags.Cpp14 or cfg.flags.CppLatest then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++14\"\nelseif cfg.flags.Cpp17 then\nif premake.action.current() == premake.action.get(\"xcode8\") then\nerror(\"X"
- "Code8 does not support C++17.\")\nend\nend\nfor _, val in ipairs(premake.xcode.parameters) do\nlocal eqpos = string.find(val, \"=\")\nif eqpos ~= nil then\nlocal key = string.trim(string.sub(val, 1, eqpos - 1))\nlocal value = string.trim(string.sub(val, eqpos + 1))\noptions[key] = value\nend\nend\nreturn options\nend\nfunction xcode8.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode8.XCBuildConfiguration_Target,\nonproject = xcode8.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Foote"
- "r(tr)\nend\nnewaction\n{\ntrigger = \"xcode8\",\nshortname = \"Xcode 8\",\ndescription = \"Generate Apple Xcode 8 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = {\nNative = \"Native\",\nx32 = \"Native 32-bit\",\nx64 = \"Native 64-bit\",\nUniversal = \"Universal\",\n},\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode8.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/"
- "xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
+ "NG_ENABLE_OBJC_ARC = \"YES\"\nend\noptions.CONFIGURATION_BUILD_DIR = \"$(SYSROOT)\"\nif tr.infoplist then\noptions.INFOPLIST_FILE = tr.infoplist.cfg.name\nend\nlocal infoplist_file = nil\nfor _, v in ipairs(cfg.files) do\nif (string.find (string.lower (v), 'info.plist') ~= nil) then\ninfoplist_file = string.format('$(SRCROOT)/%s', v)\nend\nend\nif infoplist_file ~= nil then\noptions.INFOPLIST_FILE = infoplist_file\nend\nlocal action = premake.action.current()\nxcode.setdeploymenttarget(cfg, action.xcode, options)\nif cfg.kind == \"Bundle\" and not cfg.options.SkipBundling then\noptions.PRODUCT_BUNDLE_IDENTIFIER = \"genie.\" .. cfg.buildtarget.basename:gsub(\"%s+\", \".\") --replace spaces with .\nlocal ext = cfg.targetextension\nif ext then\noptions.WRAPPER_EXTENSION = iif(ext:startswith(\".\"), ext:sub(2), ext)\nelse\noptions.WRAPPER_EXTENSION = \"bundle\"\nend\nend\nreturn options\nend\nfunction xcode8.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal cfgname = xcode.getconfigname(cfg)\nlocal archs = {\nNati"
+ "ve = nil,\nx32 = \"i386\",\nx64 = \"x86_64\",\nUniversal32 = \"$(ARCHS_STANDARD_32_BIT)\",\nUniversal64 = \"$(ARCHS_STANDARD_64_BIT)\",\nUniversal = \"$(ARCHS_STANDARD_32_64_BIT)\",\n}\nlocal checks = {\n[\"-ffast-math\"] = cfg.flags.FloatFast,\n[\"-ffloat-store\"] = cfg.flags.FloatStrict,\n[\"-fomit-frame-pointer\"] = cfg.flags.NoFramePointer,\n}\nlocal cflags = { }\nfor flag, check in pairs(checks) do\nif check then\ntable.insert(cflags, flag)\nend\nend\nlocal ldflags = { }\nfor _, lib in ipairs(premake.getlinks(cfg, \"system\")) do\nif not xcode.isframework(lib) then\ntable.insert(ldflags, \"-l\" .. lib)\nend\nend\nlocal defines = {}\nfor k, v in pairs(cfg.defines or {}) do\ndefines[k] = v:gsub('[\\'\"\\\\\\n\\r\\t ]', function (c) return ({ ['\\n'] = '\\\\n', ['\\r'] = '\\\\r', ['\\t'] = '\\\\t' })[c] or '\\\\'..c end)\nend\nlocal options = {\nARCHS = archs[cfg.platform],\nCLANG_WARN__DUPLICATE_METHOD_MATCH = \"YES\",\nCLANG_WARN_BOOL_CONV"
+ "ERSION = \"YES\",\nCLANG_WARN_CONSTANT_CONVERSION = \"YES\",\nCLANG_WARN_EMPTY_BODY = \"YES\",\nCLANG_WARN_ENUM_CONVERSION = \"YES\",\nCLANG_WARN_INFINITE_RECURSION = \"YES\",\nCLANG_WARN_INT_CONVERSION = \"YES\",\nCLANG_WARN_SUSPICIOUS_MOVE = \"YES\",\nCLANG_WARN_UNREACHABLE_CODE = \"YES\",\nCONFIGURATION_TEMP_DIR = \"$(OBJROOT)\",\nENABLE_STRICT_OBJC_MSGSEND = \"YES\",\nENABLE_TESTABILITY = \"YES\",\nGCC_C_LANGUAGE_STANDARD = \"gnu99\",\nGCC_NO_COMMON_BLOCKS = \"YES\",\nGCC_PREPROCESSOR_DEFINITIONS = defines,\nGCC_SYMBOLS_PRIVATE_EXTERN = \"NO\",\nGCC_WARN_64_TO_32_BIT_CONVERSION = \"YES\",\nGCC_WARN_ABOUT_RETURN_TYPE = \"YES\",\nGCC_WARN_UNDECLARED_SELECTOR = \"YES\",\nGCC_WARN_UNINITIALIZED_AUTOS = \"YES\",\nGCC_WARN_UNUSED_FUNCTION = \"YES\",\nGCC_WARN_UNUSED_VARIABLE = \"YES\",\nHEADER_SEARCH_PATHS = table.join(cf"
+ "g.includedirs, cfg.systemincludedirs),\nLIBRARY_SEARCH_PATHS = cfg.libdirs,\nOBJROOT = cfg.objectsdir,\nONLY_ACTIVE_ARCH = \"YES\",\nOTHER_CFLAGS = table.join(cflags, cfg.buildoptions, cfg.buildoptions_c),\nOTHER_CPLUSPLUSFLAGS = table.join(cflags, cfg.buildoptions, cfg.buildoptions_cpp),\nOTHER_LDFLAGS = table.join(ldflags, cfg.linkoptions),\nSDKROOT = xcode.toolset,\nUSER_HEADER_SEARCH_PATHS = cfg.userincludedirs,\n}\nif tr.entitlements then\noptions.CODE_SIGN_ENTITLEMENTS = tr.entitlements.cfg.name\nend\nlocal targetdir = path.getdirectory(cfg.buildtarget.bundlepath)\nif targetdir ~= \".\" then\noptions.CONFIGURATION_BUILD_DIR = \"$(SYMROOT)\"\noptions.SYMROOT = targetdir\nend\nif cfg.flags.Symbols then\noptions.COPY_PHASE_STRIP = \"NO\"\nend\nlocal excluded = xcode.cfg_excluded_files(prj, cfg)\nif #excluded > 0 then\noptions.EXCLUDED_SOURCE_FILE_NAMES = ex"
+ "cluded\nend\nif cfg.flags.NoExceptions then\noptions.GCC_ENABLE_CPP_EXCEPTIONS = \"NO\"\nend\nif cfg.flags.NoRTTI then\noptions.GCC_ENABLE_CPP_RTTI = \"NO\"\nend\nif cfg.flags.Symbols and not cfg.flags.NoEditAndContinue then\noptions.GCC_ENABLE_FIX_AND_CONTINUE = \"YES\"\nend\nif cfg.flags.NoExceptions then\noptions.GCC_ENABLE_OBJC_EXCEPTIONS = \"NO\"\nend\nif cfg.flags.Optimize or cfg.flags.OptimizeSize then\noptions.GCC_OPTIMIZATION_LEVEL = \"s\"\nelseif cfg.flags.OptimizeSpeed then\noptions.GCC_OPTIMIZATION_LEVEL = 3\nelse\noptions.GCC_OPTIMIZATION_LEVEL = 0\nend\nif cfg.pchheader and not cfg.flags.NoPCH then\noptions.GCC_PRECOMPILE_PREFIX_HEADER = \"YES\"\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\noptions.GCC_PREFIX_HEADER = pch\nend\nif cfg.flags.FatalWarnings then\nop"
+ "tions.GCC_TREAT_WARNINGS_AS_ERRORS = \"YES\"\nend\nif cfg.kind == \"Bundle\" then\noptions.MACH_O_TYPE = \"mh_bundle\"\nend\nif cfg.flags.StaticRuntime then\noptions.STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = \"static\"\nend\nif cfg.flags.PedanticWarnings or cfg.flags.ExtraWarnings then\noptions.WARNING_CFLAGS = \"-Wall\"\nend\nif cfg.flags.Cpp11 then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++11\"\nelseif cfg.flags.Cpp14 or cfg.flags.CppLatest then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++14\"\nelseif cfg.flags.Cpp17 then\nif premake.action.current() == premake.action.get(\"xcode8\") then\nerror(\"XCode8 does not support C++17.\")\nend\nend\nfor _, val in ipairs(premake.xcode.parameters) do\nlocal eqpos = string.find(val, \"=\")\nif eqpos ~= nil then\nlocal key = string.trim(string.sub(val, 1, eqpos - 1))\nlocal value = string.trim(string.sub(val, eqpos + 1))\noptions[key] = value\nend\nend\nreturn options\nend\nfunction xcode8.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuil"
+ "dFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode8.XCBuildConfiguration_Target,\nonproject = xcode8.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode8\",\nshortname = \"Xcode 8\",\ndescription = \"Generate Apple Xcode 8 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = {\nNative = \"Native\",\nx32 = \"Nati"
+ "ve 32-bit\",\nx64 = \"Native 64-bit\",\nUniversal = \"Universal\",\n},\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode8.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
/* actions/xcode/xcode9.lua */
- "local premake = premake\npremake.xcode9 = { }\nlocal xcode = premake.xcode\nlocal xcode8 = premake.xcode8\nlocal xcode9 = premake.xcode9\nfunction xcode9.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal options = xcode8.XCBuildConfiguration_Project(tr, prj, cfg)\nif cfg.flags.Cpp17 or cfg.flags.CppLatest then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++17\"\nend\nreturn table.merge(options, {\nCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = \"YES\",\nCLANG_WARN_COMMA = \"YES\",\nCLANG_WARN_NON_LITERAL_NULL_CONVERSION = \"YES\",\nCLANG_WARN_OBJC_LITERAL_CONVERSION = \"YES\",\nCLANG_WARN_RANGE_LOOP_ANALYSIS = \"YES\",\nCLANG_WARN_STRICT_PROTOTYPES = \"YES\",\n})\nend\nfunction xcode9.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxc"
- "ode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode8.XCBuildConfiguration_Target,\nonproject = xcode9.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode9\",\nshortname = \"Xcode 9\",\ndescription = \"Generate Apple Xcode 9 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = {\nNative = \"Native\",\nx32 = \"Native 32-bit\",\nx64 = \"Native 64-bit\",\nUniversal = \"Universal\",\n},\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.x"
- "cworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode9.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
+ "local premake = premake\npremake.xcode9 = { }\nlocal xcode = premake.xcode\nlocal xcode8 = premake.xcode8\nlocal xcode9 = premake.xcode9\nfunction xcode9.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal options = xcode8.XCBuildConfiguration_Project(tr, prj, cfg)\nif cfg.flags.Cpp17 then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++17\"\nelseif cfg.flags.Cpp20 or cfg.flags.CppLatest then\noptions.CLANG_CXX_LANGUAGE_STANDARD = \"c++20\"\nend\nreturn table.merge(options, {\nCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = \"YES\",\nCLANG_WARN_COMMA = \"YES\",\nCLANG_WARN_NON_LITERAL_NULL_CONVERSION = \"YES\",\nCLANG_WARN_OBJC_LITERAL_CONVERSION = \"YES\",\nCLANG_WARN_RANGE_LOOP_ANALYSIS = \"YES\",\nCLANG_WARN_STRICT_PROTOTYPES = \"YES\",\n})\nend\nfunction xcode9.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(t"
+ "r, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode8.XCBuildConfiguration_Target,\nonproject = xcode9.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode9\",\nshortname = \"Xcode 9\",\ndescription = \"Generate Apple Xcode 9 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = {\nNative = \"Native\",\nx32 = \"Native 32-bit\",\nx64 = \"Native 64-bit\",\nUniversal = \"Universal\",\n},\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/conte"
+ "nts.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode9.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
/* actions/xcode/xcode10.lua */
"local premake = premake\npremake.xcode10 = { }\nlocal xcode = premake.xcode\nlocal xcode8 = premake.xcode8\nlocal xcode9 = premake.xcode9\nlocal xcode10 = premake.xcode10\nfunction xcode10.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal options = xcode9.XCBuildConfiguration_Project(tr, prj, cfg)\nreturn table.merge(options, {\nCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = \"YES\",\nCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = \"YES\",\nCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = \"YES\",\nCLANG_WARN_COMMA = \"YES\",\nCLANG_WARN_NON_LITERAL_NULL_CONVERSION = \"YES\",\nCLANG_WARN_OBJC_LITERAL_CONVERSION = \"YES\",\nCLANG_WARN_RANGE_LOOP_ANALYSIS = \"YES\",\nCLANG_WARN_STRICT_PROTOTYPES = \"YES\",\n})\nend\nfunction xcode10.XCBuildConfiguration_Target(tr, target, cfg)\nlocal options = xcode8.XCBuildConfiguration_Target(tr, target, cfg)\nif not cfg.flags.ObjcARC then\noptions.CLANG_ENABLE_OBJC_WEAK = \"YES\"\nend\nreturn options\nend\nfunction xcode10.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)"
- "\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode10.XCBuildConfiguration_Target,\nonproject = xcode10.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode10\",\nshortname = \"Xcode 10\",\ndescription = \"Generate Apple Xcode 10 project files (experimental)\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = {"
- "\nNative = \"Native\",\nx32 = \"Native 32-bit\",\nx64 = \"Native 64-bit\",\nUniversal = \"Universal\",\n},\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode10.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
-
- /* actions/fastbuild/_fastbuild.lua */
- "premake.fastbuild = { }\nlocal fastbuild = premake.fastbuild\nnewaction\n{\ntrigger = \"vs2015-fastbuild\",\nshortname = \"FASTBuild VS2015\",\ndescription = \"Generate FASTBuild configuration files for Visual Studio 2015.\",\nvalid_kinds = {\n\"ConsoleApp\",\n\"WindowedApp\",\n\"StaticLib\",\n\"SharedLib\",\n\"Bundle\",\n},\nvalid_languages = {\n\"C\",\n\"C++\"\n},\nvalid_tools = {\ncc = {\n\"msc\"\n},\n},\nonsolution = function(sln)\npremake.generate(sln, \"fbuild.bff\", premake.fastbuild.solution)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.bff\", premake.fastbuild.project)\nend,\noncleansolution = function(sln)\npremake.clean.file(sln, \"fbuild.bff\")\nend,\noncleanproject = function(prj)\npremake.clean.file(prj, \"%%.bff\")\nend,\n}\n",
-
- /* actions/fastbuild/fastbuild_project.lua */
- "-- Generates a FASTBuild config file for a project.\nlocal function add_trailing_backslash(dir)\nif dir:len() > 0 and dir:sub(-1) ~= \"\\\\\" then\nreturn dir..\"\\\\\"\nend\nreturn dir\nend\nlocal function compile(indentlevel, prj, cfg, commonbasepath)\nlocal firstflag = true\nfor _, cfgexclude in ipairs(cfg.excludes) do\nif path.issourcefile(cfgexclude) then\nif firstflag then\n_p(indentlevel, '// Excluded files:')\nfirstflag = false\nend\n_p(indentlevel, \".CompilerInputFiles - '%s'\", cfgexclude)\nend\nend\nif not firstflag then\n_p('')\nend\n_p(indentlevel, \".CompilerOutputPath = '%s'\", add_trailing_backslash(cfg.objectsdir))\n_p(indentlevel, \".Defines = ''\")\nfor _, define in ipairs(cfg.defines) do\n_p(indentlevel+1, \"+ ' /D%s'\", define)\nend\nif cfg.kind == 'SharedLib' then\n_p(indentlevel+1, \"+ ' /D_WINDLL'\")\nend\n_p(indentlevel, \".IncludeDirs = ''\")\nlocal sortedincdirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systemincludedirs)\nlocal function getpathnodecount(p)\nlocal nodef"
- "inder = string.gmatch(p, \"[^\\\\/]+\")\nlocal result = 0\nlocal node = nodefinder()\nwhile node do\nresult = result + ((node ~= '.' and 1) or 0)\nnode = nodefinder()\nend\nreturn result\nend\nlocal stepsfrombase = {}\nfor _, includedir in ipairs(sortedincdirs) do\nstepsfrombase[includedir] = getpathnodecount(path.getrelative(commonbasepath, includedir))\nend\nlocal function includesort(a, b)\nif stepsfrombase[a] == stepsfrombase[b] then\nreturn a < b\nelse\nreturn stepsfrombase[a] < stepsfrombase[b]\nend\nend\ntable.sort(sortedincdirs, includesort)\nfor _, includedir in ipairs(sortedincdirs) do\n_p(indentlevel+1, \"+ ' /I\\\"%s\\\"'\", includedir)\nend\n_p(indentlevel+1, \"+ .MSVCIncludes\")\nlocal compileroptions = {\n'\"%1\"',\n'/nologo',\n'/c',\n'/Gm-',\n'/Zc:inline',\n'/errorReport:prompt',\n'/FS',\n}\nif cfg.options.ForceCPP then\ntable.insert(compileroptions, '/TP')\nend\nif cfg.flags.PedanticWarnings\nor cfg.flags.ExtraWarnings\nthen\ntable.insert(compileroptions, '/W4')\nend\nif (cfg.flags.NativeWChar"
- " == false or\ncfg.flags.NoNativeWChar) then\ntable.insert(compileroptions, '/Zc:wchar_t-')\nend\nif (cfg.flags.EnableMinimalRebuild or\ncfg.flags.NoMultiProcessorCompilation) then\nend\nif cfg.flags.FloatFast then\ntable.insert(compileroptions, '/fp:fast')\nelseif cfg.flags.FloatStrict then\ntable.insert(compileroptions, '/fp:strict')\nelse\ntable.insert(compileroptions, '/fp:precise')\nend\nif cfg.flags.FastCall then\ntable.insert(compileroptions, '/Gr')\nelseif cfg.flags.StdCall then\ntable.insert(compileroptions, '/Gd')\nend\nif cfg.flags.UnsignedChar then\ntable.insert(compileroptions, '/J')\nend\nif premake.config.isdebugbuild(cfg) then\nif cfg.flags.StaticRuntime then\ntable.insert(compileroptions, '/MTd')\nelse\ntable.insert(compileroptions, '/MDd')\nend\nelse\nif cfg.flags.StaticRuntime then\ntable.insert(compileroptions, '/MT')\nelse\ntable.insert(compileroptions, '/MD')\nend\nend\nif cfg.flags.Symbols then\nif (cfg.flags.C7DebugInfo) then\ntable.insert(compileroptions, '/Z7')\nelse\nif premake.config"
- ".iseditandcontinue(cfg) then\ntable.insert(compileroptions, '/ZI')\nelse\ntable.insert(compileroptions, '/Zi')\nend\nlocal targetdir = add_trailing_backslash(cfg.buildtarget.directory)\ntable.insert(compileroptions, string.format(\"/Fd\\\"%s%s.pdb\\\"\", targetdir, cfg.buildtarget.basename))\nend\nend\nlocal isoptimised = true\nif (cfg.flags.Optimize) then\ntable.insert(compileroptions, '/Ox')\nelseif (cfg.flags.OptimizeSize) then\ntable.insert(compileroptions, '/O1')\nelseif (cfg.flags.OptimizeSpeed) then\ntable.insert(compileroptions, '/O2')\nelse\nisoptimised = false\nend\nif isoptimised then\nif cfg.flags.NoOptimizeLink and cfg.flags.NoEditAndContinue then\ntable.insert(compileroptions, '/GF-')\ntable.insert(compileroptions, '/Gy-')\nelse\ntable.insert(compileroptions, '/GF')\ntable.insert(compileroptions, '/Gy')\nend\nelse\ntable.insert(compileroptions, '/Gy')\ntable.insert(compileroptions, '/Od')\ntable.insert(compileroptions, '/RTC1')\nend\nif cfg.flags.FatalWarnings then\ntable.insert(compileroptions, "
- "'/WX')\nelse\ntable.insert(compileroptions, '/WX-')\nend\nif cfg.platform == 'x32' then\nif cfg.flags.EnableSSE2 then\ntable.insert(compileroptions, '/arch:SSE2')\nelseif cfg.flags.EnableSSE then\ntable.insert(compileroptions, '/arch:SSE')\nend\nend\nif cfg.flags.NoExceptions then\nelse\nif cfg.flags.SEH then\ntable.insert(compileroptions, '/EHa')\nelse\ntable.insert(compileroptions, '/EHsc')\nend\nend\nif cfg.flags.NoRTTI then\ntable.insert(compileroptions, '/GR-')\nelse\ntable.insert(compileroptions, '/GR')\nend\nif cfg.flags.NoFramePointer then\ntable.insert(compileroptions, '/Oy-')\nelse\ntable.insert(compileroptions, '/Oy')\nend\nfor _, addloption in ipairs(cfg.buildoptions) do\ntable.insert(compileroptions, addloption)\nend\n_p(indentlevel, \".CompilerOptions = ''\")\nfor _, option in ipairs(compileroptions) do\n_p(indentlevel+1, \"+ ' %s'\", option)\nend\n_p(indentlevel+1, \"+ .IncludeDirs\")\n_p(indentlevel+1, \"+ .Defines\")\nif not cfg.flags.NoPCH and cfg.pchheader then\n_p(indentlevel, \".CompilerIn"
- "putFiles - '%s'\", cfg.pchsource)\n_p(indentlevel, \".PCHInputFile = '%s'\", cfg.pchsource)\n_p(indentlevel, \".PCHOutputFile = .CompilerOutputPath + '%s.pch'\", prj.name)\n_p(indentlevel, \".CompilerOptions + ' /Fp\\\"' + .CompilerOutputPath + '%s.pch\\\"'\", prj.name)\n_p(indentlevel, \".PCHOptions = .CompilerOptions\")\n_p(indentlevel+1, \"+ ' /Yc\\\"%s\\\"'\", cfg.pchheader)\n_p(indentlevel+1, \"+ ' /Fo\\\"%%3\\\"'\")\n_p(indentlevel, \".CompilerOptions + ' /Yu\\\"%s\\\"'\", cfg.pchheader)\nend\n_p(indentlevel+1, \"+ ' /Fo\\\"%%2\\\"'\") -- make sure the previous property is .CompilerOptions\nend\nlocal function library(prj, cfg, useconfig, commonbasepath)\n_p(1, \"Library('%s-%s-%s')\", prj.name, cfg.name, cfg.platform)\n_p(1, '{')\nuseconfig(2)\ncompile(2, prj, cfg, commonbasepath)\nlocal librarianoptions = {\n'\"%1\"',\n'/OUT:\"%2\"',\n'/NOLOGO',\n}\nif cfg.platform == 'x64' then\ntable.insert(librarianoptions, '/MACHINE:X64')\nelse\ntable.insert(librarianoptions, '/MACHINE:X86')\nend\n_p(2, \".Libraria"
- "nOptions = ''\")\nfor _, option in ipairs(librarianoptions) do\n_p(3, \"+ ' %s'\", option)\nend\n_p(2, \".LibrarianOutput = '%s'\", cfg.buildtarget.fullpath)\n_p(1, '}')\n_p('')\nend\nlocal function binary(prj, cfg, useconfig, bintype, commonbasepath)\n_p(1, \"ObjectList('%s_obj-%s-%s')\", prj.name, cfg.name, cfg.platform)\n_p(1, '{')\nuseconfig(2)\ncompile(2, prj, cfg, commonbasepath)\n_p(1, '}')\n_p('')\n_p(1, \"%s('%s-%s-%s')\", bintype, prj.name, cfg.name, cfg.platform)\n_p(1, '{')\nuseconfig(2)\n_p(2, '.Libraries = {')\n_p(3, \"'%s_obj-%s-%s',\", prj.name, cfg.name, cfg.platform) -- Refer to the ObjectList\nlocal sorteddeplibs = {}\nfor _, deplib in ipairs(premake.getlinks(cfg, \"dependencies\", \"basename\")) do\ntable.insert(sorteddeplibs, string.format(\"'%s-%s-%s',\", deplib, cfg.name, cfg.platform))\nend\ntable.sort(sorteddeplibs)\nfor _, deplib in ipairs(sorteddeplibs) do\n_p(3, deplib)\nend\n_p(3, '}')\n_p(2, '.LinkerLinkObjects = false')\nlocal linkeroptions = {\n'\"%1\"',\n'/OUT:\"%2\"',\n'/NOLOG"
- "O',\n'/errorReport:prompt',\n}\nlocal subsystemversion = '\",5.02\"'\nif cfg.platform == 'x32' then\nsubsystemversion = '\",5.01\"'\nend\nif cfg.kind == 'ConsoleApp' then\ntable.insert(linkeroptions, '/SUBSYSTEM:CONSOLE'..subsystemversion)\nelse\ntable.insert(linkeroptions, '/SUBSYSTEM:WINDOWS'..subsystemversion)\nend\nif cfg.kind == 'SharedLib' then\ntable.insert(linkeroptions, '/DLL')\nend\nif cfg.platform == 'x64' then\ntable.insert(linkeroptions, '/MACHINE:X64')\nelse\ntable.insert(linkeroptions, '/MACHINE:X86')\nend\nfor _, libdir in ipairs(cfg.libdirs) do\ntable.insert(linkeroptions, string.format('/LIBPATH:%s', path.translate(libdir, '\\\\')))\nend\nif not cfg.flags.WinMain and (cfg.kind == 'ConsoleApp' or cfg.kind == 'WindowedApp') then\nif cfg.flags.Unicode then\ntable.insert(linkeroptions, '/ENTRY:wmainCRTStartup')\nelse\ntable.insert(linkeroptions, '/ENTRY:mainCRTStartup')\nend\nend\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile then\ntable.insert(linkeroptions, '/DEF:%s', deffile)\nen"
- "d\nif (cfg.flags.Symbols ~= nil) then\ntable.insert(linkeroptions, '/DEBUG')\nend\nif premake.config.islinkeroptimizedbuild(cfg.flags) then\ntable.insert(linkeroptions, '/OPT:REF')\ntable.insert(linkeroptions, '/OPT:ICF')\nend\ntable.insert(linkeroptions, '/INCREMENTAL'..((premake.config.isincrementallink(cfg) and '') or ':NO'))\nfor _, addloption in ipairs(cfg.linkoptions) do\ntable.insert(linkeroptions, addloption)\nend\nlocal linklibs = premake.getlinks(cfg, \"all\", \"fullpath\")\nfor _, linklib in ipairs(linklibs) do\ntable.insert(linkeroptions, path.getname(linklib))\nend\ntable.sort(linkeroptions)\n_p(2, \".LinkerOptions = ''\")\nfor _, option in ipairs(linkeroptions) do\n_p(3, \"+ ' %s'\", option)\nend\n_p(3, \"+ .MSVCLibPaths\")\n_p(2, \".LinkerOutput = '%s'\", cfg.buildtarget.fullpath)\n_p(1, '}')\n_p('')\nend\nlocal function executable(prj, cfg, useconfig, commonbasepath)\nbinary(prj, cfg, useconfig, 'Executable', commonbasepath)\nend\nlocal function dll(prj, cfg, useconfig, commonbasepath)\nbinary("
- "prj, cfg, useconfig, 'DLL', commonbasepath)\nend\nlocal function alias(prj, cfg, target)\n_p(1, \"Alias('%s-%s-%s')\", prj.name, cfg.name, cfg.platform)\n_p(1, '{')\n_p(2, \".Targets = '%s'\", target)\n_p(1, '}')\n_p('')\nend\nfunction premake.fastbuild.project(prj)\nio.indent = ' '\n_p('// FASTBuild project configuration file autogenerated by GENie.')\n_p('')\n_p('{')\nlocal cppfiles = {}\nfor file in premake.project.eachfile(prj) do\nif path.issourcefile(file.name) then\ntable.insert(cppfiles, file.name)\nend\nend\nlocal commonbasepath = cppfiles[1]\nfor _, file in ipairs(cppfiles) do\ncommonbasepath = path.getcommonbasedir(commonbasepath..'/', file)\nend\n_p(1, \".CompilerInputFilesRoot = '%s/'\", commonbasepath)\n_p(1, '.CompilerInputFiles = {')\nfor _, file in ipairs(cppfiles) do\n_p(2, \"'%s',\", file)\nend\n_p(1, '}')\n_p('')\nlocal targetkindmap = {\nConsoleApp = executable,\nWindowedApp = executable,\nSharedLib = dll,\nStaticLib = library,\n}\nlocal useconfigmap = {\nx32 = function(indentlevel)\n_p"
- "(indentlevel, 'Using(.MSVCx86Config)')\n_p('')\nend,\nx64 = function(indentlevel)\n_p(indentlevel, 'Using(.MSVCx64Config)')\n_p('')\nend,\n}\nlocal nativeplatform = (os.is64bit() and 'x64') or 'x32'\nfor _, platform in ipairs(prj.solution.platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\nif cfg.platform == 'Native' then\nalias(prj, cfg, string.format('%s-%s-%s', prj.name, cfg.name, nativeplatform))\nelse\ntargetkindmap[prj.kind](prj, cfg, useconfigmap[cfg.platform], commonbasepath)\nend\nend\nend\n_p('}')\nend\n",
-
- /* actions/fastbuild/fastbuild_solution.lua */
- "-- Generates a FASTBuild config file for a solution.\nfunction premake.fastbuild.solution(sln)\nio.indent = ' '\n_p('// FastBuild solution configuration file. Generated by GENie.')\n_p('//------------------------------------------------------------------------------------')\n_p('// %s', sln.name)\n_p('//------------------------------------------------------------------------------------')\n_p('#import VS140COMNTOOLS')\nlocal is64bit = os.is64bit()\nlocal target64 = (is64bit and ' amd64') or ' x86_amd64'\nlocal target32 = (is64bit and ' amd64_x86') or ''\nlocal getvcvarscontent = [[\n@set INCLUDE=\n@set LIB=\n@set CommandPromptType=\n@set PreferredToolArchitecture=\n@set Platform=\n@set Path=%SystemRoot%\\System32;%SystemRoot%;%SystemRoot%\\System32\\wbem\n@call \"%VS140COMNTOOLS%..\\..\\VC\\vcvarsall.bat\" %1\n@echo %INCLUDE%\n@echo %LIB%\n@echo %CommandPromptType%\n@echo %PreferredToolArchitecture%\n@echo %Platform%\n@echo %Path%\n]]\nlocal getvcvarsfilepath = os.getenv('TEMP')..'\\\\getvcvars.bat'\nlocal"
- " getvcvarsfile = assert(io.open(getvcvarsfilepath, 'w'))\ngetvcvarsfile:write(getvcvarscontent)\ngetvcvarsfile:close()\nlocal vcvarsrawx86 = os.outputof(string.format('call \"%s\"%s', getvcvarsfilepath, target32))\nlocal vcvarsrawx64 = os.outputof(string.format('call \"%s\"%s', getvcvarsfilepath, target64))\nos.remove(getvcvarsfilepath)\nlocal msvcvars = {}\nmsvcvars.x32 = {}\nmsvcvars.x64 = {}\nlocal includeslibssplitter = string.gmatch(vcvarsrawx64, \"[^\\n]+\")\nmsvcvars.x64.includesraw = includeslibssplitter()\nmsvcvars.x64.libpathsraw = includeslibssplitter()\nmsvcvars.x64.commandprompttype = includeslibssplitter()\nmsvcvars.x64.preferredtoolarchitecture = includeslibssplitter()\nmsvcvars.x64.platform = includeslibssplitter()\nmsvcvars.x64.pathraw = includeslibssplitter()\nincludeslibssplitter = string.gmatch(vcvarsrawx86, \"[^\\n]+\")\nmsvcvars.x32.includesraw = includeslibssplitter()\nmsvcvars.x32.libpathsraw = includeslibssplitter()\nmsvcvars.x32.commandprompttype = includeslibssplitter()\nmsvcvars.x32"
- ".preferredtoolarchitecture = includeslibssplitter()\nmsvcvars.x32.platform = includeslibssplitter()\nmsvcvars.x32.pathraw = includeslibssplitter()\nlocal function printincludes(includesraw)\n_p(1, \".MSVCIncludes = ''\")\nfor i in string.gmatch(includesraw, \"[^;]+\") do\n_p(2, \"+ ' /I\\\"%s\\\"'\", i)\nend\nend\nlocal function printlibpaths(libpathsraw)\n_p(1, \".MSVCLibPaths = ''\")\nfor i in string.gmatch(libpathsraw, \"[^;]+\") do\n_p(2, \"+ ' /LIBPATH:\\\"%s\\\"'\", i)\nend\nend\nif is64bit then\n_p('.MSVCx64Config =')\n_p('[')\n_p(1, \".Compiler = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\amd64\\\\cl.exe'\")\n_p(1, \".Librarian = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\amd64\\\\lib.exe'\")\n_p(1, \".Linker = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\amd64\\\\link.exe'\")\nprintincludes(msvcvars.x64.includesraw)\nprintlibpaths(msvcvars.x64.libpathsraw)\n_p(']')\n_p('')\n_p('.MSVCx86Config =')\n_p('[')\n_p(1, \".Compiler = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\amd64_x86\\\\cl.exe'\")\n_p(1, \"."
- "Librarian = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\amd64_x86\\\\lib.exe'\")\n_p(1, \".Linker = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\amd64_x86\\\\link.exe'\")\nprintincludes(msvcvars.x32.includesraw)\nprintlibpaths(msvcvars.x32.libpathsraw)\n_p(']')\n_p('')\nelse\n_p('.MSVCx64Config =')\n_p('[')\n_p(1, \".Compiler = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\x86_amd64\\\\cl.exe'\")\n_p(1, \".Librarian = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\x86_amd64\\\\lib.exe'\")\n_p(1, \".Linker = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\x86_amd64\\\\link.exe'\")\nprintincludes(msvcvars.x64.includesraw)\nprintlibpaths(msvcvars.x64.libpathsraw)\n_p(']')\n_p('')\n_p('.MSVCx86Config =')\n_p('[')\n_p(1, \".Compiler = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\cl.exe'\")\n_p(1, \".Librarian = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\lib.exe'\")\n_p(1, \".Linker = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin\\\\link.exe'\")\nprintincludes(msvcvars.x32.includesraw)\nprintlibpaths(msvcvars.x32.libpathsraw)\n_p(']')"
- "\n_p('')\nend\nlocal msvcbin = '$VS140COMNTOOLS$..\\\\..\\\\VC\\\\bin' .. ((is64bit and '\\\\amd64') or '')\n_p('#import Path')\n_p('#import TMP')\n_p('#import SystemRoot')\n_p('')\n_p('Settings')\n_p('{')\n_p(1, '.Environment = {')\n_p(2, \"'Path=%s;$Path$',\", msvcbin)\n_p(2, \"'TMP=$TMP$',\")\n_p(2, \"'SystemRoot=$SystemRoot$',\")\n_p(2, '}')\n_p('}')\n_p('')\nlocal function projkindsort(a, b)\nlocal projvaluemap = {\nConsoleApp = 3,\nWindowedApp = 3,\nSharedLib = 2,\nStaticLib = 1,\n}\nif projvaluemap[a.kind] == projvaluemap[b.kind] then\nreturn a.name < b.name\nelse\nreturn projvaluemap[a.kind] < projvaluemap[b.kind]\nend\nend\nlocal sortedprojs = {}\nfor prj in premake.solution.eachproject(sln) do\ntable.insert(sortedprojs, prj)\nend\ntable.sort(sortedprojs, projkindsort)\nfor _, prj in ipairs(sortedprojs) do\nlocal fname = premake.project.getbasename(prj.name, '%%.bff')\nfname = path.join(prj.location, fname)\nfname = path.getrelative(sln.location, fname)\n_p('#include \"%s\"', fname)\nend\n_p('')"
- "\n_p('.ProjectVariants = {')\nfor _, plat in ipairs(sln.platforms) do\nfor _, cfg in ipairs(sln.configurations) do\n_p(1, \"'%s-%s',\", cfg, plat)\nend\nend\n_p('}')\n_p('')\n_p('ForEach(.Variant in .ProjectVariants)')\n_p('{')\n_p(1, \"Alias('all-$Variant$')\")\n_p(1, '{')\n_p(2, '.Targets = {')\nfor _, prj in ipairs(sortedprojs) do\n_p(3, \"'%s-$Variant$',\", prj.name)\nend\n_p(2, '}')\n_p(1, '}')\n_p('}')\nend\n",
+ "\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode10.XCBuildConfiguration_Target,\nonproject = xcode10.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode10\",\nshortname = \"Xcode 10\",\ndescription = \"Generate Apple Xcode 10 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = {\nNative = \"Nat"
+ "ive\",\nx32 = \"Native 32-bit\",\nx64 = \"Native 64-bit\",\nUniversal = \"Universal\",\n},\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode10.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
+
+ /* actions/xcode/xcode11.lua */
+ "local premake = premake\npremake.xcode11 = { }\nlocal xcode = premake.xcode\nlocal xcode10 = premake.xcode10\nlocal xcode11 = premake.xcode11\nfunction xcode11.XCBuildConfiguration_Target(tr, target, cfg)\nlocal options = xcode10.XCBuildConfiguration_Target(tr, target, cfg)\noptions.CODE_SIGN_IDENTITY = \"-\"\nreturn options\nend\nfunction xcode11.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode11.XCBuildConfiguration_Target,\nonproject = xcode10.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList"
+ "(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode11\",\nshortname = \"Xcode 11\",\ndescription = \"Generate Apple Xcode 11 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = { Native = \"Native\" },\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode11.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.cl"
+ "ean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
+
+ /* actions/xcode/xcode14.lua */
+ "local premake = premake\npremake.xcode14 = { }\nlocal xcode = premake.xcode\nlocal xcode10 = premake.xcode10\nlocal xcode11 = premake.xcode11\nlocal xcode14 = premake.xcode14\nfunction xcode14.XCBuildConfiguration_Target(tr, target, cfg)\nlocal options = xcode11.XCBuildConfiguration_Target(tr, target, cfg)\noptions.CODE_SIGN_IDENTITY = \"-\"\nlocal action = premake.action.current()\nxcode.setdeploymenttarget(cfg, action.xcode, options)\nlocal iosversion = options.IPHONEOS_DEPLOYMENT_TARGET\nlocal macosversion = options.MACOSX_DEPLOYMENT_TARGET\nlocal tvosversion = options.TVOS_DEPLOYMENT_TARGET\nif iosversion and not xcode.versionge(iosversion, \"11\") then\n error(\"XCode14 does not support deployment for iOS older than 11\")\nelseif macosversion and not xcode.versionge(macosversion, \"10.13\") then\n error(\"XCode14 does not support deployment for macOS older than 10.13\")\nelseif tvosversion and not xcode.versionge(tvosversion, \"11\") then\n error(\"XCode14 does not support deployment for tvOS older"
+ " than 11\")\nend\nreturn options\nend\nfunction xcode14.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal options = xcode10.XCBuildConfiguration_Project(tr, prj, cfg)\noptions.ENABLE_BITCODE = \"NO\" -- Bitcode is now deprecated.\nlocal action = premake.action.current()\nxcode.setdeploymenttarget(cfg, action.xcode, options)\nreturn options\nend\nfunction xcode14.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDependency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode14.XCBuildConfiguration_Target,\nonproject = xcode14.XCBuildConfiguration_Project,\n})\nxcode.XCBuildCon"
+ "figurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode14\",\nshortname = \"Xcode 14\",\ndescription = \"Generate Apple Xcode 14 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = { Native = \"Native\" },\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake.generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode14.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(pr"
+ "j)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\n},\n}\n",
+
+ /* actions/xcode/xcode15.lua */
+ "local premake = premake\npremake.xcode15 = { }\nlocal xcode = premake.xcode\nlocal xcode10 = premake.xcode10\nlocal xcode11 = premake.xcode11\nlocal xcode14 = premake.xcode14\nlocal xcode15 = premake.xcode15\nfunction xcode15.XCBuildConfiguration_Target(tr, target, cfg)\nlocal options = xcode11.XCBuildConfiguration_Target(tr, target, cfg)\noptions.CODE_SIGN_IDENTITY = \"-\"\nlocal action = premake.action.current()\nxcode.setdeploymenttarget(cfg, action.xcode, options)\nlocal iosversion = options.IPHONEOS_DEPLOYMENT_TARGET\nlocal macosversion = options.MACOSX_DEPLOYMENT_TARGET\nlocal tvosversion = options.TVOS_DEPLOYMENT_TARGET\nlocal xrosversion = options.XROS_DEPLOYMENT_TARGET\nif iosversion and not xcode.versionge(iosversion, \"12\") then\n error(\"XCode15 does not support deployment for iOS older than 12\")\nelseif macosversion and not xcode.versionge(macosversion, \"13.5\") then\n error(\"XCode15 does not support deployment for macOS older than 13.5\")\nelseif tvosversion and not xcode.versionge(tvos"
+ "version, \"12\") then\n error(\"XCode15 does not support deployment for tvOS older than 12\")\nelseif xrosversion and not xcode.versionge(xrosversion, \"1.0\") then\n error(\"XCode15 does not support deployment for visionOS older than 1.0\")\nend\nreturn options\nend\nfunction xcode15.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal options = xcode10.XCBuildConfiguration_Project(tr, prj, cfg)\nlocal action = premake.action.current()\nxcode.setdeploymenttarget(cfg, action.xcode, options)\nreturn options\nend\nfunction xcode15.project(prj)\nlocal tr = xcode.buildprjtree(prj)\nxcode.Header(tr, 48)\nxcode.PBXBuildFile(tr)\nxcode.PBXContainerItemProxy(tr)\nxcode.PBXFileReference(tr,prj)\nxcode.PBXFrameworksBuildPhase(tr)\nxcode.PBXGroup(tr)\nxcode.PBXNativeTarget(tr)\nxcode.PBXProject(tr, \"8.0\")\nxcode.PBXReferenceProxy(tr)\nxcode.PBXResourcesBuildPhase(tr)\nxcode.PBXShellScriptBuildPhase(tr)\nxcode.PBXCopyFilesBuildPhase(tr)\nxcode.PBXSourcesBuildPhase(tr,prj)\nxcode.PBXVariantGroup(tr)\nxcode.PBXTargetDepe"
+ "ndency(tr)\nxcode.XCBuildConfiguration(tr, prj, {\nontarget = xcode15.XCBuildConfiguration_Target,\nonproject = xcode15.XCBuildConfiguration_Project,\n})\nxcode.XCBuildConfigurationList(tr)\nxcode.Footer(tr)\nend\nnewaction\n{\ntrigger = \"xcode15\",\nshortname = \"Xcode 15\",\ndescription = \"Generate Apple Xcode 15 project files\",\nos = \"macosx\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = {\ncc = { \"gcc\" },\n},\nvalid_platforms = { Native = \"Native\" },\ndefault_platform = \"Native\",\nonsolution = function(sln)\npremake.generate(sln, \"%%.xcworkspace/contents.xcworkspacedata\", xcode.workspace_generate)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings\", xcode.workspace_settings)\npremake.generate(sln, \"%%.xcworkspace/xcshareddata/xcschemes/-ALL-.xcscheme\", xcode.workspace_scheme)\nend,\nonproject = function(prj)\npremake"
+ ".generate(prj, \"%%.xcodeproj/project.pbxproj\", xcode15.project)\nxcode.generate_schemes(prj, \"%%.xcodeproj/xcshareddata/xcschemes\")\nend,\noncleanproject = function(prj)\npremake.clean.directory(prj, \"%%.xcodeproj\")\npremake.clean.directory(prj, \"%%.xcworkspace\")\nend,\noncheckproject = xcode.checkproject,\nxcode = {\niOSTargetPlatformVersion = nil,\nmacOSTargetPlatformVersion = nil,\ntvOSTargetPlatformVersion = nil,\nvisionOSTargetPlatformVersion = nil,\n},\n}\n",
/* actions/ninja/_ninja.lua */
"premake.ninja = { }\nlocal p = premake\nnewaction\n{\ntrigger = \"ninja\",\nshortname = \"ninja\",\ndescription = \"Generate Ninja build files\",\nmodule = \"ninja\",\nvalid_kinds = {\"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\"},\nvalid_languages = {\"C\", \"C++\", \"Swift\"},\nvalid_tools = {\ncc = { \"gcc\" },\nswift = { \"swift\" },\n},\nonsolution = function(sln)\nio.eol = \"\\r\\n\"\nio.indent = \"\\t\"\nio.escaper(p.ninja.esc)\np.generate(sln, \"Makefile\", p.ninja.generate_solution)\nio.indent = \" \"\np.ninja.generate_ninja_builds(sln)\nend,\nonproject = function(prj)\nio.eol = \"\\r\\n\"\nio.indent = \" \"\nio.escaper(p.ninja.esc)\np.ninja.generate_project(prj)\nend,\noncleansolution = function(sln)\nfor _,name in ipairs(sln.configurations) do\npremake.clean.file(sln, p.ninja.get_solution_name(sln, name))\nend\nend,\noncleanproject = function(prj)\nend,\noncleantarget = function(prj)\nend,\n}\n",
@@ -480,66 +514,49 @@ const char* builtin_scripts[] = {
"w_cfg_proxy },\n}\nfunction get_proxy(cache, obj)\nif not cache[obj] then\ncache[obj] = cache.new(obj)\nend\nreturn cache[obj]\nend\nfunction ninja.get_proxy(typ, obj)\nif not proxy_cache[typ] then\nerror(\"invalid proxy type\")\nend\nreturn get_proxy(proxy_cache[typ], obj)\nend\n",
/* actions/ninja/ninja_solution.lua */
- "local ninja = premake.ninja\nlocal p = premake\nlocal solution = p.solution\nfunction ninja.generate_solution(sln)\nlocal cc = premake[_OPTIONS.cc]\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\n_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# Type \"make help\" for usage help')\n_p('')\n_p('NINJA=ninja')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(sln.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\nlocal projects = table.extract(sln.projects, \"name\")\ntable.sort(projects)\n_p('')\n_p('.PHONY: all clean help $(PROJECTS)')\n_p('')\n_p('all:')\nif (not sln.messageskip) or (not table.contains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p(1, '@echo \"==== Building all ($(config)) ====\"')\nend\n_p(1, '@${NINJA} -C ${config} all')\n_p('')\nfor _, prj in ipairs(sln.projects) do\nlocal prjx = ninja.get_proxy(\"prj\", prj)\n_p('%s:', _MAKE.esc(prj.name))\nif (not sln.messageskip) or (not table.c"
- "ontains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p(1, '@echo \"==== Building %s ($(config)) ====\"', prj.name)\nend\n_p(1, '@${NINJA} -C ${config} %s', prj.name)\n_p('')\nend\n_p('clean:')\n_p(1, '@${NINJA} -C ${config} -t clean')\n_p('')\n_p('help:')\n_p(1,'@echo \"Usage: make [config=name] [target]\"')\n_p(1,'@echo \"\"')\n_p(1,'@echo \"CONFIGURATIONS:\"')\nlocal cfgpairs = { }\nfor _, platform in ipairs(platforms) do\nfor _, cfgname in ipairs(sln.configurations) do\n_p(1,'@echo \" %s\"', premake.getconfigname(cfgname, platform, true))\nend\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"TARGETS:\"')\n_p(1,'@echo \" all (default)\"')\n_p(1,'@echo \" clean\"')\nfor _, prj in ipairs(sln.projects) do\n_p(1,'@echo \" %s\"', prj.name)\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"For more information, see https://github.com/bkaradzic/genie\"')\nend\nlocal generate\nlocal function getconfigs(sln, name, plat)\nlocal cfgs = {}\nfor prj in solution.eachproject(sln) do\nprj = ninja.get_proxy(\"prj\", prj)\nfor cfg "
- "in p.eachconfig(prj, plat) do\nif cfg.name == name then\ntable.insert(cfgs, cfg)\nend\nend\nend\nreturn cfgs\nend\nfunction ninja.generate_ninja_builds(sln)\nlocal cc = premake[_OPTIONS.cc]\nsln.getlocation = function(cfg, plat)\nreturn path.join(sln.location, premake.getconfigname(cfg, plat, true))\nend\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\nfor _,plat in ipairs(platforms) do\nfor _,name in ipairs(sln.configurations) do\np.generate(sln, ninja.get_solution_name(sln, name, plat), function(sln)\ngenerate(getconfigs(sln, name, plat))\nend)\nend\nend\nend\nfunction ninja.get_solution_name(sln, cfg, plat)\nreturn path.join(sln.getlocation(cfg, plat), \"build.ninja\")\nend\nfunction generate(prjcfgs)\nlocal cfgs = {}\nlocal cfg_start = nil\nlocal cfg_first = nil\nlocal cfg_first_lib = nil\n_p(\"# solution build file\")\n_p(\"# generated with GENie ninja\")\n_p(\"\")\n_p(\"# build projects\")\nfor _,cfg in ipairs(prjcfgs) do\nlocal key = cfg.project.name\nif not c"
- "fgs[key] then cfgs[key] = \"\" end\ncfgs[key] = cfg:getoutputfilename() .. \" \"\nif not cfgs[\"all\"] then cfgs[\"all\"] = \"\" end\ncfgs[\"all\"] = cfgs[\"all\"] .. cfg:getoutputfilename() .. \" \"\nif (cfg_start == nil) and (cfg.solution.startproject == key) then\ncfg_start = key\nend\nif (cfg_first == nil) and (cfg.kind == \"ConsoleApp\" or cfg.kind == \"WindowedApp\") then\ncfg_first = key\nend\nif (cfg_first_lib == nil) and (cfg.kind == \"StaticLib\" or cfg.kind == \"SharedLib\") then\ncfg_first_lib = key\nend\n_p(\"subninja \" .. cfg:getprojectfilename())\nend\n_p(\"\")\n_p(\"# targets\")\nfor cfg, outputs in iter.sortByKeys(cfgs) do\n_p(\"build \" .. cfg .. \": phony \" .. outputs)\nend\n_p(\"\")\n_p(\"# default target\")\n_p(\"default \" .. (cfg_start or cfg_first or cfg_first_lib))\n_p(\"\")\nend\n",
+ "local ninja = premake.ninja\nlocal p = premake\nlocal solution = p.solution\nfunction ninja.generate_solution(sln)\nlocal cc = premake[_OPTIONS.cc]\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\n_p('# %s solution makefile autogenerated by GENie', premake.action.current().shortname)\n_p('# https://github.com/bkaradzic/GENie')\n_p('# Type \"make help\" for usage help')\n_p('')\n_p('NINJA=ninja')\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(sln.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\nlocal projects = table.extract(sln.projects, \"name\")\ntable.sort(projects)\n_p('')\n_p('.PHONY: all clean help $(PROJECTS)')\n_p('')\n_p('all:')\nif (not sln.messageskip) or (not table.contains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p(1, '@echo \"==== Building all ($(config)) ====\"')\nend\n_p(1, '@${NINJA} -C ${config} all')\n_p('')\nfor _, prj in ipairs(sln.projects) do\nlocal prjx = ninja.get_proxy(\"prj\", prj)\n_p('%s:', _MAKE.esc(prj.name"
+ "))\nif (not sln.messageskip) or (not table.contains(sln.messageskip, \"SkipBuildingMessage\")) then\n_p(1, '@echo \"==== Building %s ($(config)) ====\"', prj.name)\nend\n_p(1, '@${NINJA} -C ${config} %s', prj.name)\n_p('')\nend\n_p('clean:')\n_p(1, '@${NINJA} -C ${config} -t clean')\n_p('')\n_p('help:')\n_p(1,'@echo \"Usage: make [config=name] [target]\"')\n_p(1,'@echo \"\"')\n_p(1,'@echo \"CONFIGURATIONS:\"')\nlocal cfgpairs = { }\nfor _, platform in ipairs(platforms) do\nfor _, cfgname in ipairs(sln.configurations) do\n_p(1,'@echo \" %s\"', premake.getconfigname(cfgname, platform, true))\nend\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"TARGETS:\"')\n_p(1,'@echo \" all (default)\"')\n_p(1,'@echo \" clean\"')\nfor _, prj in ipairs(sln.projects) do\n_p(1,'@echo \" %s\"', prj.name)\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"For more information, see https://github.com/bkaradzic/genie\"')\nend\nlocal generate\nlocal function getconfigs(sln, name, plat)\nlocal cfgs = {}\nfor prj in solution.eachproject(sln) do\np"
+ "rj = ninja.get_proxy(\"prj\", prj)\nfor cfg in p.eachconfig(prj, plat) do\nif cfg.name == name then\ntable.insert(cfgs, cfg)\nend\nend\nend\nreturn cfgs\nend\nfunction ninja.generate_ninja_builds(sln)\nlocal cc = premake[_OPTIONS.cc]\nsln.getlocation = function(cfg, plat)\nreturn path.join(sln.location, premake.getconfigname(cfg, plat, true))\nend\nlocal platforms = premake.filterplatforms(sln, cc.platforms, \"Native\")\nfor _,plat in ipairs(platforms) do\nfor _,name in ipairs(sln.configurations) do\np.generate(sln, ninja.get_solution_name(sln, name, plat), function(sln)\ngenerate(getconfigs(sln, name, plat))\nend)\nend\nend\nend\nfunction ninja.get_solution_name(sln, cfg, plat)\nreturn path.join(sln.getlocation(cfg, plat), \"build.ninja\")\nend\nfunction generate(prjcfgs)\nlocal cfgs = {}\nlocal cfg_start = nil\nlocal cfg_first = nil\nlocal cfg_first_lib = nil\n_p(\"# solution build file\")\n_p(\"# generated with GENie ninja\")\n_p(\"# https://github.com/bkaradzic/GENie\")\n_p(\"\")\n_p(\"# b"
+ "uild projects\")\nfor _,cfg in ipairs(prjcfgs) do\nlocal key = cfg.project.name\nif not cfgs[key] then cfgs[key] = \"\" end\ncfgs[key] = cfg:getoutputfilename() .. \" \"\nif not cfgs[\"all\"] then cfgs[\"all\"] = \"\" end\ncfgs[\"all\"] = cfgs[\"all\"] .. cfg:getoutputfilename() .. \" \"\nif (cfg_start == nil) and (cfg.solution.startproject == key) then\ncfg_start = key\nend\nif (cfg_first == nil) and (cfg.kind == \"ConsoleApp\" or cfg.kind == \"WindowedApp\") then\ncfg_first = key\nend\nif (cfg_first_lib == nil) and (cfg.kind == \"StaticLib\" or cfg.kind == \"SharedLib\") then\ncfg_first_lib = key\nend\n_p(\"subninja \" .. cfg:getprojectfilename())\nend\n_p(\"\")\n_p(\"# targets\")\nfor cfg, outputs in iter.sortByKeys(cfgs) do\n_p(\"build \" .. cfg .. \": phony \" .. outputs)\nend\n_p(\"\")\n_p(\"# default target\")\n_p(\"default \" .. (cfg_start or cfg_first or cfg_first_lib))\n_p(\"\")\nend\n",
/* actions/ninja/ninja_cpp.lua */
"premake.ninja.cpp = { }\nlocal ninja = premake.ninja\nlocal cpp = premake.ninja.cpp\nlocal p = premake\nlocal function wrap_ninja_cmd(c)\nif os.is(\"windows\") then\nreturn 'cmd /c \"' .. c .. '\"'\nelse\nreturn c\nend\nend\nfunction ninja.generate_cpp(prj)\nlocal pxy = ninja.get_proxy(\"prj\", prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in p.eachconfig(pxy, platform) do\np.generate(cfg, cfg:getprojectfilename(), function() cpp.generate_config(prj, cfg) end)\nend\nend\nend\nfunction cpp.generate_config(prj, cfg)\nlocal tool = premake.gettool(prj)\n_p('# Ninja build project file autogenerated by GENie')\n_p('# https://github.com/bkaradzic/GENie')\n_p(\"\")\n_p(\"ninja_required_version = 1.7\")\n_p(\"\")\nlocal flags = {\ndefines = ninja.list(tool.getdefines(cfg.defines)),\nincludes = ninja.list(table.join(tool.getincludedirs(cfg.includedirs), tool.getquoteincludedirs(cfg.us"
"erincludedirs), tool.getsystemincludedirs(cfg.systemincludedirs))),\ncppflags = ninja.list(tool.getcppflags(cfg)),\nasmflags = ninja.list(table.join(tool.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_asm)),\ncflags = ninja.list(table.join(tool.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)),\ncxxflags = ninja.list(table.join(tool.getcflags(cfg), tool.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)),\nobjcflags = ninja.list(table.join(tool.getcflags(cfg), tool.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)),\n}\n_p(\"\")\n_p(\"# core rules for \" .. cfg.name)\n_p(\"rule cc\")\n_p(\" command = \" .. wrap_ninja_cmd(tool.cc .. \" $defines $includes $flags -MMD -MF $out.d -c -o $out $in\"))\n_p(\" description = cc $out\")\n_p(\" depfile = $out.d\")\n_p(\" deps = gcc\")\n_p(\"\")\n_p(\"rule cxx\")\n_p(\" command = \" .. wrap_ninja_cmd(tool.cxx .. \" $defines $includes $flags -MMD -MF $out.d -c -o $out $in\"))\n_p(\" description = cxx $out\")\n_p(\" de"
- "pfile = $out.d\")\n_p(\" deps = gcc\")\n_p(\"\")\n_p(\"rule ar\")\n_p(\" command = \" .. wrap_ninja_cmd(tool.ar .. \" $flags $out @$out.rsp \" .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\")))\n_p(\" description = ar $out\")\n_p(\" rspfile = $out.rsp\")\n_p(\" rspfile_content = $in $libs\")\n_p(\"\")\nlocal link = iif(cfg.language == \"C\", tool.cc, tool.cxx)\n_p(\"rule link\")\nlocal startgroup = ''\nlocal endgroup = ''\nif (cfg.flags.LinkSupportCircularDependencies) then\nstartgroup = '-Wl,--start-group'\nendgroup = '-Wl,--end-group'\nend\n_p(\" command = \" .. wrap_ninja_cmd(\"$pre_link \" .. link .. \" -o $out @$out.rsp $all_ldflags $post_build\"))\n_p(\" description = link $out\")\n_p(\" rspfile = $out.rsp\")\n_p(\" rspfile_content = $all_outputfiles $walibs\" .. string.format(\"%s $libs %s\", startgroup, endgroup))\n_p(\"\")\n_p(\"rule exec\")\n_p(\" command = \" .. wrap_ninja_cmd(\"$command\"))\n"
- "_p(\" description = Run $type commands\")\n_p(\"\")\nif #cfg.prebuildcommands > 0 then\n_p(\"build __prebuildcommands_\" .. premake.esc(prj.name) .. \": exec\")\n_p(1, \"command = \" .. wrap_ninja_cmd(\"echo Running pre-build commands && \" .. table.implode(cfg.prebuildcommands, \"\", \"\", \" && \")))\n_p(1, \"type = pre-build\")\n_p(\"\")\nend\ncfg.pchheader_full = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, cfg.shortname, incdir))\nlocal testname = path.join(abspath, cfg.pchheader_full)\nif os.isfile(testname) then\ncfg.pchheader_full = path.getrelative(cfg.location, testname)\nbreak\nend\nend\ncpp.custombuildtask(prj, cfg)\ncpp.dependencyRules(prj, cfg)\ncpp.file_rules(prj, cfg, flags)\nlocal objfiles = {}\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\ntable.insert(objfiles, cpp.objectname(cfg, file))\nend\nend\n_p('')\ncpp.linker(prj, cfg, objfiles, tool, flags)\n_p(\"\")\nend\nfunction cpp.customb"
- "uildtask(prj, cfg)\nlocal cmd_index = 1\nlocal seen_commands = {}\nlocal command_by_name = {}\nlocal command_files = {}\nlocal prebuildsuffix = #cfg.prebuildcommands > 0 and \"||__prebuildcommands_\" .. premake.esc(prj.name) or \"\"\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nfor _, cmd in ipairs(buildtask[4] or {}) do\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \", path.getrelative(cfg.location, depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, '%$%(<%)', '$in')\ncmd = string.gsub(cmd, '%$%(@%)', '$out')\nlocal cmd_name -- shortened command name\nif seen_commands[cmd] == nil then\nlocal _, _, name = string.find(cmd, '([.%w]+)%s')\nname = 'cmd' .. cmd_index .. '_' .. string.gsub(name, '[^%w]', '_')\nseen_commands[cmd] = {\nname = name,\nindex = cmd_index,\n}\ncmd_index = cmd_index + 1\ncmd_name = name\nelse\ncmd_name = seen_commands[cmd].name\ne"
- "nd\nlocal index = seen_commands[cmd].index\nif command_files[index] == nil then\ncommand_files[index] = {}\nend\nlocal cmd_set = command_files[index]\ntable.insert(cmd_set, {\nbuildtask[1],\nbuildtask[2],\nbuildtask[3],\nseen_commands[cmd].name,\n})\ncommand_files[index] = cmd_set\ncommand_by_name[cmd_name] = cmd\nend\nend\nend\n_p(\"# custom build rules\")\nfor command, details in pairs(seen_commands) do\n_p(\"rule \" .. details.name)\n_p(1, \"command = \" .. wrap_ninja_cmd(command))\nend\nfor cmd_index, cmdsets in ipairs(command_files) do\nfor _, cmdset in ipairs(cmdsets) do\nlocal file_in = path.getrelative(cfg.location, cmdset[1])\nlocal file_out = path.getrelative(cfg.location, cmdset[2])\nlocal deps = ''\nfor i, dep in ipairs(cmdset[3]) do\ndeps = deps .. path.getrelative(cfg.location, dep) .. ' '\nend\n_p(\"build \" .. file_out .. ': ' .. cmdset[4] .. ' ' .. file_in .. ' | ' .. deps .. prebuildsuffix)\n_p(\"\")\nend\nend\nend\nfunction cpp.dependencyRules(prj, cfg)\nlocal extra_deps = {}\nlocal order_de"
- "ps = {}\nlocal extra_flags = {}\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nlocal objfilename = cpp.objectname(cfg, path.getrelative(prj.location, dep[1]))\nlocal dependency = path.getrelative(cfg.location, dep[2])\nif extra_deps[objfilename] == nil then\nextra_deps[objfilename] = {}\nend\ntable.insert(extra_deps[objfilename], dependency)\nend\nend\nlocal pchfilename = cfg.pchheader_full and cpp.pchname(cfg, cfg.pchheader_full) or ''\nfor _, file in ipairs(cfg.files) do\nlocal objfilename = file == cfg.pchheader and cpp.pchname(cfg, file) or cpp.objectname(cfg, file)\nif path.issourcefile(file) or file == cfg.pchheader then\nif #cfg.prebuildcommands > 0 then\nif order_deps[objfilename] == nil then\norder_deps[objfilename] = {}\nend\ntable.insert(order_deps[objfilename], '__prebuildcommands_' .. premake.esc(prj.name))\nend\nend\nif path.issourcefile(file) then\nif cfg.pchheader_full and not cfg.flags.NoPCH then\nlocal nopch = table.icontains(prj.nopch, file)"
- "\nif not nopch then\nlocal suffix = path.isobjcfile(file) and '_objc' or ''\nif extra_deps[objfilename] == nil then\nextra_deps[objfilename] = {}\nend\ntable.insert(extra_deps[objfilename], pchfilename .. suffix .. \".gch\")\nif extra_flags[objfilename] == nil then\nextra_flags[objfilename] = {}\nend\ntable.insert(extra_flags[objfilename], '-include ' .. pchfilename .. suffix)\nend\nend\nend\nend\ncfg.extra_deps = extra_deps\ncfg.order_deps = order_deps\ncfg.extra_flags = extra_flags\nend\nfunction cpp.objectname(cfg, file)\nreturn path.join(cfg.objectsdir, path.trimdots(path.removeext(file)) .. \".o\")\nend\nfunction cpp.pchname(cfg, file)\nreturn path.join(cfg.objectsdir, path.trimdots(file))\nend\nfunction cpp.file_rules(prj,cfg, flags)\n_p(\"# build files\")\nfor _, file in ipairs(cfg.files) do\n_p(\"# FILE: \" .. file)\nif cfg.pchheader_full == file then\nlocal pchfilename = cpp.pchname(cfg, file)\nlocal extra_deps = #cfg.extra_deps and '| ' .. table.concat(cfg.extra_deps[pchfilename] or {}, ' ') or ''\nl"
- "ocal order_deps = #cfg.order_deps and '|| ' .. table.concat(cfg.order_deps[pchfilename] or {}, ' ') or ''\nlocal extra_flags = #cfg.extra_flags and ' ' .. table.concat(cfg.extra_flags[pchfilename] or {}, ' ') or ''\n_p(\"build \" .. pchfilename .. \".gch : cxx \" .. file .. extra_deps .. order_deps)\n_p(1, \"flags = \" .. flags['cxxflags'] .. extra_flags .. iif(prj.language == \"C\", \"-x c-header\", \"-x c++-header\"))\n_p(1, \"includes = \" .. flags.includes)\n_p(1, \"defines = \" .. flags.defines)\n_p(\"build \" .. pchfilename .. \"_objc.gch : cxx \" .. file .. extra_deps .. order_deps)\n_p(1, \"flags = \" .. flags['objcflags'] .. extra_flags .. iif(prj.language == \"C\", \"-x objective-c-header\", \"-x objective-c++-header\"))\n_p(1, \"includes = \" .. flags.includes)\n_p(1, \"defines = \" .. flags.defines)\nelseif path.issourcefile(file) then\nlocal objfilename = cpp.objectname(cfg, file)\nlocal extra_deps = #cfg.extra_deps and '| ' .. table.concat(cfg.extra_deps[objfilename] or {}, ' ') or ''\nlo"
- "cal order_deps = #cfg.order_deps and '|| ' .. table.concat(cfg.order_deps[objfilename] or {}, ' ') or ''\nlocal extra_flags = #cfg.extra_flags and ' ' .. table.concat(cfg.extra_flags[objfilename] or {}, ' ') or ''\nlocal cflags = \"cflags\"\nif path.isobjcfile(file) then\n_p(\"build \" .. objfilename .. \": cxx \" .. file .. extra_deps .. order_deps)\ncflags = \"objcflags\"\nelseif path.isasmfile(file) then\n_p(\"build \" .. objfilename .. \": cc \" .. file .. extra_deps .. order_deps)\ncflags = \"asmflags\"\nelseif path.iscfile(file) and not cfg.options.ForceCPP then\n_p(\"build \" .. objfilename .. \": cc \" .. file .. extra_deps .. order_deps)\nelse\n_p(\"build \" .. objfilename .. \": cxx \" .. file .. extra_deps .. order_deps)\ncflags = \"cxxflags\"\nend\n_p(1, \"flags = \" .. flags[cflags] .. extra_flags)\n_p(1, \"includes = \" .. flags.includes)\n_p(1, \"defines = \" .. flags.defines)\nelseif path.isresourcefile(file) then\nend\nend\n_p(\"\")\nend\nfunction cpp.linker(prj, cfg, objfiles, tool)\nloca"
- "l all_ldflags = ninja.list(table.join(tool.getlibdirflags(cfg), tool.getldflags(cfg), cfg.linkoptions))\nlocal prebuildsuffix = #cfg.prebuildcommands > 0 and \"||__prebuildcommands\" or \"\"\nlocal libs = {}\nlocal walibs = {}\nlocal lddeps = {}\nif #cfg.wholearchive > 0 then\nfor _, linkcfg in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\nlocal linkpath = path.rebase(linkcfg.linktarget.fullpath, linkcfg.location, cfg.location)\ntable.insert(lddeps, linkpath)\nif table.icontains(cfg.wholearchive, linkcfg.project.name) then\ntable.insert(walibs, table.concat(tool.wholearchive(linkpath), ' '))\nelse\ntable.insert(libs, linkpath)\nend\nend\nelse\nlddeps = premake.getlinks(cfg, \"siblings\", \"fullpath\")\nlibs = lddeps\nend\nlddeps = ninja.list(lddeps)\nlibs = ninja.list(libs) .. \" \" .. ninja.list(tool.getlinkflags(cfg))\nwalibs = ninja.list(walibs)\nlocal function writevars()\n_p(1, \"all_ldflags = \" .. all_ldflags)\n"
- "_p(1, \"libs = \" .. libs)\n_p(1, \"walibs = \" .. walibs)\n_p(1, \"all_outputfiles = \" .. table.concat(objfiles, \" \"))\nif #cfg.prelinkcommands > 0 then\n_p(1, 'pre_link = echo Running pre-link commands && ' .. table.implode(cfg.prelinkcommands, \"\", \"\", \" && \") .. \" && \")\nend\nif #cfg.postbuildcommands > 0 then\n_p(1, 'post_build = && echo Running post-build commands && ' .. table.implode(cfg.postbuildcommands, \"\", \"\", \" && \"))\nend\nend\nif cfg.kind == \"StaticLib\" then\nlocal ar_flags = ninja.list(tool.getarchiveflags(cfg, cfg, false))\n_p(\"# link static lib\")\n_p(\"build \" .. cfg:getoutputfilename() .. \": ar \" .. table.concat(objfiles, \" \") .. \" | \" .. lddeps .. prebuildsuffix)\n_p(1, \"flags = \" .. ninja.list(tool.getarchiveflags(cfg, cfg, false)))\n_p(1, \"all_outputfiles = \" .. table.concat(objfiles, \" \"))\nelseif cfg.kind == \"SharedLib\" or cfg.kind == \"Bundle\" then\nlocal output = cfg:getoutputfilename()\n_p(\"# link shared lib\")\n_p("
- "\"build \" .. output .. \": link \" .. table.concat(objfiles, \" \") .. \" | \" .. lddeps .. prebuildsuffix)\nwritevars()\nelseif (cfg.kind == \"ConsoleApp\") or (cfg.kind == \"WindowedApp\") then\n_p(\"# link executable\")\n_p(\"build \" .. cfg:getoutputfilename() .. \": link \" .. table.concat(objfiles, \" \") .. \" | \" .. lddeps .. prebuildsuffix)\nwritevars()\nelse\np.error(\"ninja action doesn't support this kind of target \" .. cfg.kind)\nend\nend\n",
+ "pfile = $out.d\")\n_p(\" deps = gcc\")\n_p(\"\")\nif cfg.flags.UseObjectResponseFile then\n_p(\"rule ar\")\n_p(\" command = \" .. wrap_ninja_cmd(tool.ar .. \" $flags $out @$out.rsp \" .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\")))\n_p(\" description = ar $out\")\n_p(\" rspfile = $out.rsp\")\n_p(\" rspfile_content = $in $libs\")\n_p(\"\")\nelse\n_p(\"rule ar\")\n_p(\" command = \" .. wrap_ninja_cmd(tool.ar .. \" $flags $out $in $libs\" .. (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\")))\n_p(\" description = ar $out\")\n_p(\"\")\nend\nlocal link = iif(cfg.language == \"C\", tool.cc, tool.cxx)\n_p(\"rule link\")\nlocal startgroup = ''\nlocal endgroup = ''\nif (cfg.flags.LinkSupportCircularDependencies) then\nstartgroup = '-Wl,--start-group'\nendgroup = '-Wl,--end-group'\nend\nlocal rspfile_content = \"$all_outputfiles $walibs \" .. string.format(\"%s $libs %s\", startgroup, en"
+ "dgroup)\nif cfg.flags.UseLDResponseFile then\n_p(\" command = \" .. wrap_ninja_cmd(\"$pre_link \" .. link .. \" -o $out @$out.rsp $all_ldflags $post_build\"))\n_p(\" description = link $out\")\n_p(\" rspfile = $out.rsp\")\n_p(\" rspfile_content = %s\", rspfile_content)\n_p(\"\")\nelse\n_p(\" command = \" .. wrap_ninja_cmd(\"$pre_link \" .. link .. \" -o $out \" .. rspfile_content .. \" $all_ldflags $post_build\"))\n_p(\" description = link $out\")\n_p(\"\")\nend\n_p(\"rule exec\")\n_p(\" command = \" .. wrap_ninja_cmd(\"$command\"))\n_p(\" description = Run $type commands\")\n_p(\"\")\nif #cfg.prebuildcommands > 0 then\n_p(\"build __prebuildcommands_\" .. premake.esc(prj.name) .. \": exec\")\n_p(1, \"command = \" .. wrap_ninja_cmd(\"echo Running pre-build commands && \" .. table.implode(cfg.prebuildcommands, \"\", \"\", \" && \")))\n_p(1, \"type = pre-build\")\n_p(\"\")\nend\ncfg.pchheader_full = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal ab"
+ "spath = path.getabsolute(path.join(cfg.project.location, cfg.shortname, incdir))\nlocal testname = path.join(abspath, cfg.pchheader_full)\nif os.isfile(testname) then\ncfg.pchheader_full = path.getrelative(cfg.location, testname)\nbreak\nend\nend\ncpp.custombuildtask(prj, cfg)\ncpp.dependencyRules(prj, cfg)\ncpp.file_rules(prj, cfg, flags)\nlocal objfiles = {}\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\ntable.insert(objfiles, cpp.objectname(cfg, file))\nend\nend\n_p('')\ncpp.linker(prj, cfg, objfiles, tool, flags)\n_p(\"\")\nend\nfunction cpp.custombuildtask(prj, cfg)\nlocal cmd_index = 1\nlocal ninja_rules = {}\nlocal ninja_builds = {}\nlocal prebuildsuffix = #cfg.prebuildcommands > 0 and \"||__prebuildcommands_\" .. premake.esc(prj.name) or \"\"\nfor _, custombuildtask in ipairs(prj.custombuildtask or {}) do\nfor _, buildtask in ipairs(custombuildtask or {}) do\nlocal commands = {}\nfor _, cmd in ipairs(buildtask[4] or {}) do\nlocal num = 1\nfor _, depdata in ipairs(buildtask[3] or"
+ " {}) do\ncmd = string.gsub(cmd,\"%$%(\" .. num ..\"%)\", string.format(\"%s \", path.getrelative(cfg.location, depdata)))\nnum = num + 1\nend\ncmd = string.gsub(cmd, '%$%(<%)', '$in')\ncmd = string.gsub(cmd, '%$%(@%)', '$out')\ntable.insert(commands, cmd)\nend\nninja_rules[\"cmd_\" .. cmd_index] = commands\ntable.insert(ninja_builds, {\nfile_in = buildtask[1],\nfile_out = buildtask[2],\nrule = \"cmd_\" .. cmd_index,\ndeps = buildtask[3]\n})\ncmd_index = cmd_index + 1\nend\nend\n_p(\"# custom build rules\")\nfor rule, commands in pairs(ninja_rules) do\n_p(\"rule \" .. rule)\n_p(1, \"command = \" .. wrap_ninja_cmd(table.concat(commands, \" && \")))\nend\nfor i = 1,#ninja_builds do\nlocal build = ninja_builds[i]\nlocal deps = ''\nfor i, dep in ipairs(build.deps) do\ndeps = deps .. path.getrelative(cfg.location, dep) .. ' '\nend\n_p(\"build \" .. path.getrelative(cfg.location, build.file_out) .. ': ' .. build.rule .. ' ' .. path.getrelative(cfg.location, build.file_in) .. ' | ' .. deps .. prebuildsuffix)\n_p(\"\")"
+ "\nend\nend\nfunction cpp.dependencyRules(prj, cfg)\nlocal extra_deps = {}\nlocal order_deps = {}\nlocal extra_flags = {}\nfor _, dependency in ipairs(prj.dependency or {}) do\nfor _, dep in ipairs(dependency or {}) do\nlocal objfilename = cpp.objectname(cfg, path.getrelative(prj.location, dep[1]))\nlocal dependency = path.getrelative(cfg.location, dep[2])\nif extra_deps[objfilename] == nil then\nextra_deps[objfilename] = {}\nend\ntable.insert(extra_deps[objfilename], dependency)\nend\nend\nlocal pchfilename = cfg.pchheader_full and cpp.pchname(cfg, cfg.pchheader_full) or ''\nfor _, file in ipairs(cfg.files) do\nlocal objfilename = file == cfg.pchheader and cpp.pchname(cfg, file) or cpp.objectname(cfg, file)\nif path.issourcefile(file) or file == cfg.pchheader then\nif #cfg.prebuildcommands > 0 then\nif order_deps[objfilename] == nil then\norder_deps[objfilename] = {}\nend\ntable.insert(order_deps[objfilename], '__prebuildcommands_' .. premake.esc(prj.name))\nend\nend\nif path.issourcefile(file) then\nif cfg.pc"
+ "hheader_full and not cfg.flags.NoPCH then\nlocal nopch = table.icontains(prj.nopch, file)\nif not nopch then\nlocal suffix = path.isobjcfile(file) and '_objc' or ''\nif extra_deps[objfilename] == nil then\nextra_deps[objfilename] = {}\nend\ntable.insert(extra_deps[objfilename], pchfilename .. suffix .. \".gch\")\nif extra_flags[objfilename] == nil then\nextra_flags[objfilename] = {}\nend\ntable.insert(extra_flags[objfilename], '-include ' .. pchfilename .. suffix)\nend\nend\nend\nend\ncfg.extra_deps = extra_deps\ncfg.order_deps = order_deps\ncfg.extra_flags = extra_flags\nend\nfunction cpp.objectname(cfg, file)\nreturn path.join(cfg.objectsdir, path.trimdots(path.removeext(file)) .. \".o\")\nend\nfunction cpp.pchname(cfg, file)\nreturn path.join(cfg.objectsdir, path.trimdots(file))\nend\nfunction cpp.file_rules(prj,cfg, flags)\n_p(\"# build files\")\nfor _, file in ipairs(cfg.files) do\n_p(\"# FILE: \" .. file)\nif cfg.pchheader_full == file then\nlocal pchfilename = cpp.pchname(cfg, file)\nlocal extra_deps = "
+ "#cfg.extra_deps and '| ' .. table.concat(cfg.extra_deps[pchfilename] or {}, ' ') or ''\nlocal order_deps = #cfg.order_deps and '|| ' .. table.concat(cfg.order_deps[pchfilename] or {}, ' ') or ''\nlocal extra_flags = #cfg.extra_flags and ' ' .. table.concat(cfg.extra_flags[pchfilename] or {}, ' ') or ''\n_p(\"build \" .. pchfilename .. \".gch : cxx \" .. file .. extra_deps .. order_deps)\n_p(1, \"flags = \" .. flags['cxxflags'] .. extra_flags .. iif(prj.language == \"C\", \"-x c-header\", \"-x c++-header\"))\n_p(1, \"includes = \" .. flags.includes)\n_p(1, \"defines = \" .. flags.defines)\n_p(\"build \" .. pchfilename .. \"_objc.gch : cxx \" .. file .. extra_deps .. order_deps)\n_p(1, \"flags = \" .. flags['objcflags'] .. extra_flags .. iif(prj.language == \"C\", \"-x objective-c-header\", \"-x objective-c++-header\"))\n_p(1, \"includes = \" .. flags.includes)\n_p(1, \"defines = \" .. flags.defines)\nelseif path.issourcefile(file) then\nlocal objfilename = cpp.objectname(cfg, file)\nlocal extra_deps = #"
+ "cfg.extra_deps and '| ' .. table.concat(cfg.extra_deps[objfilename] or {}, ' ') or ''\nlocal order_deps = #cfg.order_deps and '|| ' .. table.concat(cfg.order_deps[objfilename] or {}, ' ') or ''\nlocal extra_flags = #cfg.extra_flags and ' ' .. table.concat(cfg.extra_flags[objfilename] or {}, ' ') or ''\nlocal cflags = \"cflags\"\nif path.isobjcfile(file) then\n_p(\"build \" .. objfilename .. \": cxx \" .. file .. extra_deps .. order_deps)\ncflags = \"objcflags\"\nelseif path.isasmfile(file) then\n_p(\"build \" .. objfilename .. \": cc \" .. file .. extra_deps .. order_deps)\ncflags = \"asmflags\"\nelseif path.iscfile(file) and not cfg.options.ForceCPP then\n_p(\"build \" .. objfilename .. \": cc \" .. file .. extra_deps .. order_deps)\nelse\n_p(\"build \" .. objfilename .. \": cxx \" .. file .. extra_deps .. order_deps)\ncflags = \"cxxflags\"\nend\n_p(1, \"flags = \" .. flags[cflags] .. extra_flags)\n_p(1, \"includes = \" .. flags.includes)\n_p(1, \"defines = \" .. flags.defines)\nelseif path.isresourcefile"
+ "(file) then\nend\nend\n_p(\"\")\nend\nfunction cpp.linker(prj, cfg, objfiles, tool)\nlocal all_ldflags = ninja.list(table.join(tool.getlibdirflags(cfg), tool.getldflags(cfg), cfg.linkoptions))\nlocal prebuildsuffix = #cfg.prebuildcommands > 0 and (\"||__prebuildcommands_\" .. premake.esc(prj.name)) or \"\"\nlocal libs = {}\nlocal walibs = {}\nlocal lddeps = {}\nif #cfg.wholearchive > 0 then\nfor _, linkcfg in ipairs(premake.getlinks(cfg, \"siblings\", \"object\")) do\nlocal linkpath = path.rebase(linkcfg.linktarget.fullpath, linkcfg.location, cfg.location)\ntable.insert(lddeps, linkpath)\nif table.icontains(cfg.wholearchive, linkcfg.project.name) then\ntable.insert(walibs, table.concat(tool.wholearchive(linkpath), ' '))\nelse\ntable.insert(libs, linkpath)\nend\nend\nelse\nlddeps = premake.getlinks(cfg, \"siblings\", \"fullpath\")\nlibs = lddeps\nend\nlddeps = ninja.list(lddeps)\nlibs = ninja.list(libs) .. \" \" .. ninja.list(tool.getlinkflags(cfg))\n"
+ "walibs = ninja.list(walibs)\nlocal function writevars()\n_p(1, \"all_ldflags = \" .. all_ldflags)\n_p(1, \"libs = \" .. libs)\n_p(1, \"walibs = \" .. walibs)\n_p(1, \"all_outputfiles = \" .. table.concat(objfiles, \" \"))\nif #cfg.prelinkcommands > 0 then\n_p(1, 'pre_link = echo Running pre-link commands && ' .. table.implode(cfg.prelinkcommands, \"\", \"\", \" && \") .. \" && \")\nend\nif #cfg.postbuildcommands > 0 then\n_p(1, 'post_build = && echo Running post-build commands && ' .. table.implode(cfg.postbuildcommands, \"\", \"\", \" && \"))\nend\nend\nif cfg.kind == \"StaticLib\" then\nlocal ar_flags = ninja.list(tool.getarchiveflags(cfg, cfg, false))\n_p(\"# link static lib\")\n_p(\"build \" .. cfg:getoutputfilename() .. \": ar \" .. table.concat(objfiles, \" \") .. \" | \" .. lddeps .. prebuildsuffix)\n_p(1, \"flags = \" .. ninja.list(tool.getarchiveflags(cfg, cfg, false)))\n_p(1, \"all_outputfiles = \" .. table.concat(objfiles, \" \"))\nelseif cfg.kind =="
+ " \"SharedLib\" or cfg.kind == \"Bundle\" then\nlocal output = cfg:getoutputfilename()\n_p(\"# link shared lib\")\n_p(\"build \" .. output .. \": link \" .. table.concat(objfiles, \" \") .. \" | \" .. lddeps .. prebuildsuffix)\nwritevars()\nelseif (cfg.kind == \"ConsoleApp\") or (cfg.kind == \"WindowedApp\") then\n_p(\"# link executable\")\n_p(\"build \" .. cfg:getoutputfilename() .. \": link \" .. table.concat(objfiles, \" \") .. \" | \" .. lddeps .. prebuildsuffix)\nwritevars()\nelse\np.error(\"ninja action doesn't support this kind of target \" .. cfg.kind)\nend\nend\n",
/* actions/ninja/ninja_swift.lua */
- "local ninja = premake.ninja\nlocal swift = {}\nlocal p = premake\nfunction ninja.generate_swift(prj)\nlocal pxy = ninja.get_proxy(\"prj\", prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in p.eachconfig(pxy, platform) do\np.generate(cfg, cfg:getprojectfilename(), function() swift.generate_config(prj, cfg) end)\nend\nend\nend\nfunction swift.generate_config(prj, cfg)\nlocal tool = premake.gettool(prj)\nlocal flags = {\nswiftcflags = ninja.list(tool.getswiftcflags(cfg)),\nswiftlinkflags = ninja.list(tool.getswiftlinkflags(cfg)),\n}\n_p(\"# Swift project build file\")\n_p(\"# generated with GENie ninja\")\n_p(\"\")\n_p(\"ninja_required_version = 1.7\")\n_p(\"\")\n_p(\"out_dir = %s\", cfg.buildtarget.directory)\n_p(\"obj_dir = %s\", path.join(cfg.objectsdir, prj.name .. \".build\"))\n_p(\"target = $out_dir/%s\", cfg.buildtarget.name)\n_p(\"module_name = %s\", prj.name)\n_p(\"module_"
- "maps = %s\", ninja.list(tool.getmodulemaps(cfg)))\n_p(\"swiftc_flags = %s\", flags.swiftcflags)\n_p(\"swiftlink_flags = %s\", flags.swiftlinkflags)\n_p(\"ar_flags = %s\", ninja.list(tool.getarchiveflags(cfg, cfg, false)))\n_p(\"ld_flags = %s\", ninja.list(tool.getldflags(cfg)))\nif cfg.flags.Symbols then\n_p(\"symbols = $target.dSYM\")\nsymbols_command = string.format(\"&& %s $target -o $symbols\", tool.dsymutil)\nelse\n_p(\"symbols = \")\nsymbols_command = \"\"\nend\nlocal sdk = tool.get_sdk_path(cfg)\nif sdk then\n_p(\"toolchain_path = %s\", tool.get_toolchain_path(cfg))\n_p(\"sdk_path = %s\", sdk)\n_p(\"platform_path = %s\", tool.get_sdk_platform_path(cfg))\n_p(\"sdk = -sdk $sdk_path\")\nelse\n_p(\"sdk_path =\")\n_p(\"sdk =\")\nend\n_p(\"\")\n_p(\"# core rules for %s\", cfg.name)\n_p(\"rule swiftc\")\n_p(1, \"command = %s -frontend -c $in -enable-objc-interop $sdk -I $out_dir $swiftc_flags -module-cache-path $out_dir/ModuleCache -D SWIFT_PACKAGE $module_maps -emit-module-doc-path $out_dir/$module_name.swift"
- "doc -module-name $module_name -emit-module-path $out_dir/$module_name.swiftmodule -num-threads 8 $obj_files\", tool.swift)\n_p(1, \"description = compile $out\")\n_p(\"\")\n_p(\"rule swiftlink\")\n_p(1, \"command = %s $sdk -L $out_dir -o $out $swiftlink_flags $ld_flags $in %s\", tool.swiftc, symbols_command)\n_p(1, \"description = create executable\")\n_p(\"\")\n_p(\"rule ar\")\n_p(1, \"command = %s cr $ar_flags $out $in %s\", tool.ar, (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p(1, \"description = ar $out\")\n_p(\"\")\nlocal objfiles = {}\nfor _, file in ipairs(cfg.files) do\nif path.isswiftfile(file) then\ntable.insert(objfiles, swift.objectname(cfg, file))\nend\nend\nswift.file_rules(cfg, objfiles)\n_p(\"\")\nswift.linker(prj, cfg, objfiles, tool)\nend\nfunction swift.objectname(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o\")\nend\nfunction swift.file_rules(cfg, objfiles)\n_p(\"build %s: swiftc %s\", ninja.list(objfiles), ninja.list(cfg"
- ".files))\n_p(1, \"obj_files = %s\", ninja.arglist(\"-o\", objfiles))\nend\nfunction swift.linker(prj, cfg, objfiles, tool)\nlocal lddeps = ninja.list(premake.getlinks(cfg, \"siblings\", \"fullpath\")) \nif cfg.kind == \"StaticLib\" then\n_p(\"build $target: ar %s | %s \", ninja.list(objfiles), lddeps)\nelse\nlocal lddeps = ninja.list(premake.getlinks(cfg, \"siblings\", \"fullpath\"))\n_p(\"build $target: swiftlink %s | %s\", ninja.list(objfiles), lddeps)\nend\nend\n",
+ "local ninja = premake.ninja\nlocal swift = {}\nlocal p = premake\nfunction ninja.generate_swift(prj)\nlocal pxy = ninja.get_proxy(\"prj\", prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in p.eachconfig(pxy, platform) do\np.generate(cfg, cfg:getprojectfilename(), function() swift.generate_config(prj, cfg) end)\nend\nend\nend\nfunction swift.generate_config(prj, cfg)\nlocal tool = premake.gettool(prj)\nlocal flags = {\nswiftcflags = ninja.list(tool.getswiftcflags(cfg)),\nswiftlinkflags = ninja.list(tool.getswiftlinkflags(cfg)),\n}\n_p(\"# Swift project build file\")\n_p(\"# generated with GENie ninja\")\n_p(\"# https://github.com/bkaradzic/GENie\")\n_p(\"\")\n_p(\"ninja_required_version = 1.7\")\n_p(\"\")\n_p(\"out_dir = %s\", cfg.buildtarget.directory)\n_p(\"obj_dir = %s\", path.join(cfg.objectsdir, prj.name .. \".build\"))\n_p(\"target = $out_dir/%s\", cfg.buildtarget.name)\n_p"
+ "(\"module_name = %s\", prj.name)\n_p(\"module_maps = %s\", ninja.list(tool.getmodulemaps(cfg)))\n_p(\"swiftc_flags = %s\", flags.swiftcflags)\n_p(\"swiftlink_flags = %s\", flags.swiftlinkflags)\n_p(\"ar_flags = %s\", ninja.list(tool.getarchiveflags(cfg, cfg, false)))\n_p(\"ld_flags = %s\", ninja.list(tool.getldflags(cfg)))\nif cfg.flags.Symbols then\n_p(\"symbols = $target.dSYM\")\nsymbols_command = string.format(\"&& %s $target -o $symbols\", tool.dsymutil)\nelse\n_p(\"symbols = \")\nsymbols_command = \"\"\nend\nlocal sdk = tool.get_sdk_path(cfg)\nif sdk then\n_p(\"toolchain_path = %s\", tool.get_toolchain_path(cfg))\n_p(\"sdk_path = %s\", sdk)\n_p(\"platform_path = %s\", tool.get_sdk_platform_path(cfg))\n_p(\"sdk = -sdk $sdk_path\")\nelse\n_p(\"sdk_path =\")\n_p(\"sdk =\")\nend\n_p(\"\")\n_p(\"# core rules for %s\", cfg.name)\n_p(\"rule swiftc\")\n_p(1, \"command = %s -frontend -c $in -enable-objc-interop $sdk -I $out_dir $swiftc_flags -module-cache-path $out_dir/ModuleCache -D SWIFT_PACKAGE $module_maps -em"
+ "it-module-doc-path $out_dir/$module_name.swiftdoc -module-name $module_name -emit-module-path $out_dir/$module_name.swiftmodule -num-threads 8 $obj_files\", tool.swift)\n_p(1, \"description = compile $out\")\n_p(\"\")\n_p(\"rule swiftlink\")\n_p(1, \"command = %s $sdk -L $out_dir -o $out $swiftlink_flags $ld_flags $in %s\", tool.swiftc, symbols_command)\n_p(1, \"description = create executable\")\n_p(\"\")\n_p(\"rule ar\")\n_p(1, \"command = %s cr $ar_flags $out $in %s\", tool.ar, (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p(1, \"description = ar $out\")\n_p(\"\")\nlocal objfiles = {}\nfor _, file in ipairs(cfg.files) do\nif path.isswiftfile(file) then\ntable.insert(objfiles, swift.objectname(cfg, file))\nend\nend\nswift.file_rules(cfg, objfiles)\n_p(\"\")\nswift.linker(prj, cfg, objfiles, tool)\nend\nfunction swift.objectname(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o\")\nend\nfunction swift.file_rules(cfg, objfiles)\n_p(\"build %s: swi"
+ "ftc %s\", ninja.list(objfiles), ninja.list(cfg.files))\n_p(1, \"obj_files = %s\", ninja.arglist(\"-o\", objfiles))\nend\nfunction swift.linker(prj, cfg, objfiles, tool)\nlocal lddeps = ninja.list(premake.getlinks(cfg, \"siblings\", \"fullpath\")) \nif cfg.kind == \"StaticLib\" then\n_p(\"build $target: ar %s | %s \", ninja.list(objfiles), lddeps)\nelse\nlocal lddeps = ninja.list(premake.getlinks(cfg, \"siblings\", \"fullpath\"))\n_p(\"build $target: swiftlink %s | %s\", ninja.list(objfiles), lddeps)\nend\nend\n",
/* actions/ninja/ninja_swift_incremental.lua */
- "local ninja = premake.ninja\nlocal swift = { }\nlocal p = premake\nfunction ninja.generate_swift_incremental(prj)\nlocal pxy = ninja.get_proxy(\"prj\", prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in p.eachconfig(pxy, platform) do\np.generate(cfg, cfg:getprojectfilename(), function() swift.generate_config(prj, cfg) end)\nend\nend\nend\nfunction swift.generate_config(prj, cfg)\nlocal tool = premake.gettool(prj)\nlocal flags = {\nswiftcflags = ninja.list(table.join(tool.getswiftcflags(cfg), cfg.buildoptions_swiftc)),\n}\n_p(\"# Swift project build file\")\n_p(\"# generated with GENie ninja\")\n_p(\"\")\n_p(\"ninja_required_version = 1.7\")\n_p(\"\")\n_p(\"out_dir = %s\", cfg.buildtarget.directory)\n_p(\"obj_dir = %s\", path.join(cfg.objectsdir, prj.name .. \".build\"))\n_p(\"module_name = %s\", prj.name)\n_p(\"module_maps = %s\", ninja.list(tool.getmodulemaps(cfg)))\n_p(\"swiftc_f"
- "lags = %s\", flags.swiftcflags)\n_p(\"swiftlink_flags = %s\", flags.swiftlinkflags)\n_p(\"ar_flags = %s\", ninja.list(tool.getarchiveflags(cfg, cfg, false)))\nlocal sdk = tool.get_sdk_path(cfg)\nif sdk then\n_p(\"toolchain_path = %s\", tool.get_toolchain_path(cfg))\n_p(\"sdk_path = %s\", sdk)\n_p(\"platform_path = %s\", tool.get_sdk_platform_path(cfg))\n_p(\"sdk = -sdk $sdk_path\")\n_p(\"ld_baseflags = -force_load $toolchain_path/usr/lib/arc/libarclite_macosx.a -L $out_dir -F $platform_path/Developer/Library/Frameworks -syslibroot $sdk_path -lobjc -lSystem -L $toolchain_path/usr/lib/swift/macosx -rpath $toolchain_path/usr/lib/swift/macosx -macosx_version_min 10.10.0 -no_objc_category_merging\")\nelse\n_p(\"sdk_path =\")\n_p(\"sdk =\")\n_p(\"ld_baseflags =\")\nend\n_p(\"\")\n_p(\"# core rules for %s\", cfg.name)\n_p(\"rule swiftc\")\n_p(1, \"command = %s -frontend -c -primary-file $in $files $target -enable-objc-interop $sdk -I $out_dir -enable-testing -module-cache-path $out_dir/ModuleCache -D SWIFT_PACKAGE $m"
- "odule_maps -emit-module-doc-path $out_doc_name swiftc_flags -module-name $module_name -emit-module-path $out_module_name -emit-dependencies-path $out.d -emit-reference-dependencies-path $obj_dir/$basename.swiftdeps -o $out\", tool.swiftc)\n_p(1, \"description = compile $out\")\n_p(\"\")\n_p(\"rule swiftm\")\n_p(1, \"command = %s -frontend -emit-module $in $parse_as_library swiftc_flags $target -enable-objc-interop $sdk -I $out_dir -F $platform_path/Developer/Library/Frameworks -enable-testing -module-cache-path $out_dir/ModuleCache -D SWIFT_PACKAGE $module_maps -emit-module-doc-path $out_dir/$module_name.swiftdoc -module-name $module_name -o $out\", tool.swift)\n_p(1, \"description = generate module\")\n_p(\"\")\n_p(\"rule swiftlink\")\n_p(1, \"command = %s $target $sdk $swiftlink_flags -L $out_dir -o $out_dir/$module_name -F $platform_path/Developer/Library/Frameworks $in\", tool.swiftc)\n_p(1, \"description = linking $target\")\n_p(\"\")\n_p(\"rule ar\")\n_p(1, \"command = %s cr $ar_flags $out $in $libs %s\""
- ", tool.ar, (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p(1, \"description = ar $out\")\n_p(\"\")\n_p(\"rule link\")\n_p(\" command = %s $in $ld_baseflags $all_ldflags $libs -o $out\", tool.ld)\n_p(\" description = link $out\")\n_p(\"\")\nswift.file_rules(cfg, flags)\nlocal objfiles = {}\nlocal modfiles = {}\nlocal docfiles = {}\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\ntable.insert(objfiles, swift.objectname(cfg, file))\ntable.insert(modfiles, swift.modulename(cfg, file))\ntable.insert(docfiles, swift.docname(cfg, file))\nend\nend\n_p(\"\")\nswift.linker(prj, cfg, {objfiles, modfiles, docfiles}, tool, flags)\n_p(\"\")\nend\nfunction swift.objectname(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o\")\nend\nfunction swift.modulename(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o.swiftmodule\")\nend\nfunction swift.docname(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o.swift"
- "doc\")\nend\nfunction swift.file_rules(cfg, flags)\n_p(\"# build files\")\nlocal sfiles = Set(cfg.files)\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\nif path.isswiftfile(file) then\nlocal objn = swift.objectname(cfg, file)\nlocal modn = swift.modulename(cfg, file)\nlocal docn = swift.docname(cfg, file)\n_p(\"build %s | %s %s: swiftc %s\", objn, modn, docn, file)\n_p(1, \"out_module_name = %s\", modn)\n_p(1, \"out_doc_name = %s\", docn)\n_p(1, \"files = \".. ninja.list(sfiles - {file}))\nbuild_flags = \"swiftcflags\"\nend\n_p(1, \"flags = \" .. flags[build_flags])\nelseif path.isresourcefile(file) then\nend\nend\n_p(\"\")\nend\nfunction swift.linker(prj, cfg, depfiles, tool)\nlocal all_ldflags = ninja.list(table.join(tool.getlibdirflags(cfg), tool.getldflags(cfg), cfg.linkoptions))\nlocal lddeps = ninja.list(premake.getlinks(cfg, \"siblings\", \"fullpath\")) \nlocal libs = lddeps .. \" \" .. ninja.list(tool.getlinkflags(cfg))\nlocal function writevars()\n_p(1, \"all_ldfl"
- "ags = \" .. all_ldflags)\n_p(1, \"libs = \" .. libs)\nend\nlocal objfiles, modfiles, docfiles = table.unpack(depfiles)\n_p(\"build $out_dir/$module_name.swiftmodule | $out_dir/$module_name.swiftdoc: swiftm %s | %s\", table.concat(modfiles, \" \"), table.concat(docfiles, \" \"))\n_p(\"\")\nlocal output = cfg:getoutputfilename()\nif cfg.kind == \"StaticLib\" then\nlocal ar_flags = ninja.list(tool.getarchiveflags(cfg, cfg, false))\n_p(\"build %s: ar %s | %s $out_dir/$module_name.swiftmodule $out_dir/$module_name.swiftdoc\", output, table.concat(objfiles, \" \"), lddeps)\n_p(1, \"flags = %s\", ninja.list(tool.getarchiveflags(cfg, cfg, false)))\nelseif cfg.kind == \"SharedLib\" then\n_p(\"build %s : swiftlink %s | %s $out_dir/$module_name.swiftmodule $out_dir/$module_name.swiftdoc\", output, table.concat(objfiles, \" \"), libs)\nwritevars()\nelseif (cfg.kind == \"ConsoleApp\") or (cfg.kind == \"WindowedApp\") then\n_p(\"build %s: swiftlink %s | %s $out_dir/$module_name.swiftmodule $out_dir/$module_name.swift"
- "doc\", output, table.concat(objfiles, \" \"), lddeps)\nelse\np.error(\"ninja action doesn't support this kind of target \" .. cfg.kind)\nend\nend\n",
-
- /* actions/qbs/_qbs.lua */
- "premake.qbs = { }\nlocal qbs = premake.qbs\nnewaction\n{\ntrigger = \"qbs\",\nshortname = \"qbs\",\ndescription = \"Generate QBS build files\",\nmodule = \"qbs\",\nvalid_kinds = {\"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\"},\nvalid_languages = {\"C\", \"C++\"},\nvalid_tools = {\ncc = { \"gcc\", \"msc\" },\n},\nonsolution = function(sln)\nio.eol = \"\\n\"\nio.indent = \"\\t\"\nio.escaper(qbs.esc)\npremake.generate(sln, sln.name .. \".creator.qbs\", qbs.generate_solution)\nio.indent = \" \"\npremake.generate(sln, sln.name .. \".creator.qbs.user\", qbs.generate_user)\nend,\nonproject = function(prj)\nio.eol = \"\\n\"\nio.indent = \"\\t\"\nio.escaper(qbs.esc)\npremake.generate(prj, prj.name .. \".qbs\", qbs.generate_project)\nend,\n}\n",
-
- /* actions/qbs/qbs_base.lua */
- "function premake.qbs.list(indent, name, table)\nif #table > 0 then\n_p(indent, '%s: [', name)\nfor _, item in ipairs(table) do\n_p(indent+1, '\"%s\",', item:gsub('\"', '\\\\\"'))\nend\n_p(indent+1, ']')\nend\nend",
-
- /* actions/qbs/qbs_solution.lua */
- "local qbs = premake.qbs\nfunction qbs.generate_solution(sln)\n_p('/*')\n_p(' * QBS project file autogenerated by GENie')\n_p(' * https://github.com/bkaradzic/GENie')\n_p(' */')\n_p('')\n_p('import qbs')\n_p('')\n_p(0, 'Project {')\n_p(1, 'references: [')\nfor prj in premake.solution.eachproject(sln) do\n_p(2, '\"' .. prj.name .. '.qbs\",')\nend\n_p(1, ']')\n_p(0, '}')\nend\nlocal function is_app(kind)\nif kind == \"ConsoleApp\" or kind == \"WindowedApp\" then\nreturn true\nend\nreturn false\nend\nfunction qbs.generate_user(sln)\n_p(0, '<?xml version=\"1.0\" encoding=\"UTF-8\"?>')\n_p(0, '<!DOCTYPE QtCreatorProject>')\n_p(0, '<!-- QBS project file autogenerated by GENie https://github.com/bkaradzic/GENie -->')\n_p(0, '<qtcreator>')\nlocal startProject = 0\nlocal idx = 0\nfor prj in premake.solution.eachproject(sln) do\nif is_app(prj.kind) then\nif sln.startproject == prj.name then\nstartProject = idx\nend\nidx = idx + 1\nend\nend\n_p(1, '<data>')\n_p(2, '<variable>ProjectExplorer.Project.Target.0</variable>')\n"
- "_p(2, '<valuemap type=\"QVariantMap\">')\n_p(3, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Desktop</value>')\n_p(3, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Desktop</value>')\nlocal qbsguid = \"\"\nlocal qbsprofile = \"\"\nlocal qtcreatordir = \"\"\nif _OS == \"windows\" then\nqtcreatordir = path.join(os.getenv(\"APPDATA\"), \"QtProject/qtcreator\")\nelse\nqtcreatordir = path.join(os.getenv(\"HOME\"), \".config/QtProject/qtcreator\")\nend\nlocal file = io.open(path.join(qtcreatordir, \"qbs.conf\"))\nif file == nil then\nfile = io.open(path.join(qtcreatordir, \"qbs/1.6.0/qbs.conf\"))\nend\nif file ~= nil then\nfor line in file:lines() do\nif line == \"[org]\" then\nlocal str = 'qt-project\\\\qbs\\\\preferences\\\\qtcreator\\\\kit\\\\%'\nlocal index = string.len(str)+1\nfor line in file:lines() do\nif index == string.find(line, '7B', index) then\nline = string.sub(line, index+2)\nqbsguid = string.sub(line, 1, 36)\nqbspro"
- "file = string.sub(line, 41)\nbreak\nend\nend\nelse\nlocal str = '\\t<key>org.qt-project.qbs.preferences.qtcreator.kit.'\nlocal index = string.len(str)+1\nfor line in file:lines() do\nif qbsguid == \"\" and index == string.find(line, '{', index) then\nline = string.sub(line, index+1)\nqbsguid = string.sub(line, 1, 36)\nelseif qbsguid ~= \"\" then\nqbsprofile = string.sub(line, 10, 29)\nbreak\nend\nend\nend\nbreak\nend\nio.close(file)\nend\n_p(3, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">{%s}</value>', qbsguid)\n_p(3, '<value type=\"int\" key=\"ProjectExplorer.Target.ActiveBuildConfiguration\">0</value>')\n_p(3, '<value type=\"int\" key=\"ProjectExplorer.Target.ActiveDeployConfiguration\">0</value>')\n_p(3, '<value type=\"int\" key=\"ProjectExplorer.Target.ActiveRunConfiguration\">%d</value>', startProject)\nidx = 0\nfor _, cfgname in ipairs(sln.configurations) do\n_p(3, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.BuildConfiguration.%d\">', idx)\n_p(4, '<value type"
- "=\"QString\" key=\"ProjectExplorer.BuildConfiguration.BuildDirectory\">build</value>')\n_p(4, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">')\n_p(5, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">')\n_p(6, '<value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>')\n_p(6, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\"></value>')\n_p(6, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Qbs Build</value>')\n_p(6, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qbs.BuildStep</value>')\n_p(6, '<value type=\"bool\" key=\"Qbs.CleanInstallRoot\">false</value>')\n_p(6, '<valuemap type=\"QVariantMap\" key=\"Qbs.Configuration\">')\n_p(7, '<value type=\"QString\" key=\"qbs.buildVariant\">%s</value>', cfgname:lower())\n_p(7, '<value type=\"QString\" key=\"qbs.profile\">%s</value>', qbsprofile)\n_p(6, '</valuemap>')\n_p(5, '</valuem"
- "ap>')\n_p(5, '<value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Build</value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\"></value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Build</value>')\n_p(4, '</valuemap>')\n_p(4, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.1\">')\n_p(5, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildStepList.Step.0\">')\n_p(6, '<value type=\"bool\" key=\"ProjectExplorer.BuildStep.Enabled\">true</value>')\n_p(6, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\"></value>')\n_p(6, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Qbs Clean</value>')\n_p(6, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qbs"
- ".CleanStep</value>')\n_p(6, '<value type=\"bool\" key=\"Qbs.CleanAll\">true</value>')\n_p(6, '<value type=\"bool\" key=\"Qbs.DryKeepGoing\">false</value>')\n_p(6, '<value type=\"bool\" key=\"Qbs.DryRun\">false</value>')\n_p(5, '</valuemap>')\n_p(5, '<value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">1</value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Clean</value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\"></value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">ProjectExplorer.BuildSteps.Clean</value>')\n_p(4, '</valuemap>')\n_p(4, '<value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">2</value>')\n_p(4, '<value type=\"bool\" key=\"ProjectExplorer.BuildConfiguration.ClearSystemEnvironment\">false</value>')\n_p(4, '<valuelist type=\"QVariantList\" key=\"ProjectExplorer.BuildConfiguration.UserEnvironmentChanges\"/>')\n_p(4, '<valu"
- "e type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">%s</value>', cfgname)\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\"></value>')\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qbs.QbsBuildConfiguration</value>')\n_p(3, '</valuemap>')\nidx = idx + 1\nend\n_p(3, '<value type=\"int\" key=\"ProjectExplorer.Target.BuildConfigurationCount\">%d</value>', idx)\n_p(3, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.DeployConfiguration.0\">')\n_p(4, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.BuildConfiguration.BuildStepList.0\">')\n_p(5, '<value type=\"int\" key=\"ProjectExplorer.BuildStepList.StepsCount\">0</value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy</value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\"></value>')\n_p(5, '<value type=\"QString\" key=\"ProjectExplorer.ProjectCo"
- "nfiguration.Id\">ProjectExplorer.BuildSteps.Deploy</value>')\n_p(4, '</valuemap>')\n_p(4, '<value type=\"int\" key=\"ProjectExplorer.BuildConfiguration.BuildStepListCount\">1</value>')\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">Deploy locally</value>')\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\">Qbs Install</value>')\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qbs.Deploy</value>')\n_p(3, '</valuemap>')\n_p(3, '<value type=\"int\" key=\"ProjectExplorer.Target.DeployConfigurationCount\">1</value>')\nidx = 0\nfor prj in premake.solution.eachproject(sln) do\nif is_app(prj.kind) then\n_p(3, '<valuemap type=\"QVariantMap\" key=\"ProjectExplorer.Target.RunConfiguration.%d\">', idx)\nif idx == startProject then\n_p(4, '<value type=\"int\" key=\"PE.EnvironmentAspect.Base\">2</value>')\nelse\n_p(4, '<value type=\"int\" key=\"PE.EnvironmentAspect.Base\">-1</value>')\nend\n_p(4, '<valuelist"
- " type=\"QVariantList\" key=\"PE.EnvironmentAspect.Changes\"/>')\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DefaultDisplayName\">%s</value>', prj.name)\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.DisplayName\"></value>')\n_p(4, '<value type=\"QString\" key=\"ProjectExplorer.ProjectConfiguration.Id\">Qbs.RunConfiguration:%s.%s---Qbs.RC.NameSeparator---%s</value>', prj.name, qbsprofile, prj.name)\n_p(4, '<value type=\"QString\" key=\"Qbs.RunConfiguration.CommandLineArguments\"></value>')\nlocal cfg = premake.getconfig(prj, nil, nil)\nif cfg.debugdir ~= nil then\n_p(4, '<value type=\"QString\" key=\"Qbs.RunConfiguration.WorkingDirectory\">%s</value>', cfg.debugdir)\nelse\n_p(4, '<value type=\"QString\" key=\"Qbs.RunConfiguration.WorkingDirectory\"></value>')\nend\n_p(3, '</valuemap>')\nidx = idx + 1\nend\nend\n_p(3, '<value type=\"int\" key=\"ProjectExplorer.Target.RunConfigurationCount\">%d</value>', idx)\n_p(2, '</valuemap>')\n_p(1, '</data>')\n_p(1,"
- " '<data>')\n_p(2, '<variable>ProjectExplorer.Project.TargetCount</variable>')\n_p(2, '<value type=\"int\">1</value>')\n_p(1, '</data>')\n_p(1, '<data>')\n_p(2, '<variable>Version</variable>')\n_p(2, '<value type=\"int\">18</value>')\n_p(1, '</data>')\n_p(0, '</qtcreator>')\nend\n",
-
- /* actions/qbs/qbs_cpp.lua */
- "local qbs = premake.qbs\nlocal function is_excluded(prj, cfg, file)\nif table.icontains(prj.excludes, file) then\nreturn true\nend\nif table.icontains(cfg.excludes, file) then\nreturn true\nend\nreturn false\nend\nfunction qbs.generate_project(prj)\nlocal indent = 0\n_p(indent, '/*')\n_p(indent, ' * QBS project file autogenerated by GENie')\n_p(indent, ' * https://github.com/bkaradzic/GENie')\n_p(indent, ' */')\n_p(indent, '')\n_p(indent, 'import qbs 1.0')\n_p(indent, '')\nif prj.kind == \"ConsoleApp\" then\n_p(indent, 'CppApplication {')\n_p(indent + 1, 'consoleApplication: true')\nelseif prj.kind == \"WindowedApp\" then\n_p(indent, 'CppApplication {')\n_p(indent + 1, 'consoleApplication: false')\nelseif prj.kind == \"StaticLib\" then\n_p(indent, 'StaticLibrary {')\nelseif prj.kind == \"SharedLib\" then\n_p(indent, 'DynamicLibrary {')\nend\nindent = indent + 1\n_p(indent, 'name: \"' .. prj.name .. '\"')\n_p(indent, 'Depends { name: \"cpp\" }')\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\nfor"
- " _, depprj in ipairs(deps) do\n_p(indent, 'Depends { name: \"%s\" }', depprj.name)\nend\nend\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\nif cfg.platform ~= \"Native\" then\n_p('');\n_p(indent, 'Properties { /* %s */', premake.getconfigname(cfg.name, cfg.platform, true))\nindent = indent + 1\nlocal arch = \"\"\nlocal linkerFlags = cfg.linkoptions\nif cfg.platform == \"x32\" then\narch = '&& qbs.architecture == \"x86\"'\nelseif cfg.platform == \"x64\" then\narch = '&& qbs.architecture == \"x86_64\"'\nend\nif cfg.name == \"Debug\" then\n_p(indent, 'condition: qbs.buildVariant == \"debug\" %s', arch)\nelse\n_p(indent, 'condition: qbs.buildVariant == \"release\" %s', arch)\nend\n_p(indent, 'targetName: \"%s\"', cfg.buildtarget.basename)\n_p(indent, 'destinationDirectory: \"%s\"', path.getabsolute('projects/qbs/' .. cfg.buildtarget.directory) .. '/')\nif c"
- "fg.flags.Cpp11 then\n_p(indent, 'cpp.cxxLanguageVersion: \"c++11\"')\nelseif cfg.flags.Cpp14 then\n_p(indent, 'cpp.cxxLanguageVersion: \"c++14\"')\nelseif cfg.flags.Cpp17 then\n_p(indent, 'cpp.cxxLanguageVersion: \"c++17\"')\nelse\n_p(indent, 'cpp.cxxLanguageVersion: \"c++98\"')\nend\nif os.is(\"windows\") then\nif not cfg.flags.WinMain and (cfg.kind == 'ConsoleApp' or cfg.kind == 'WindowedApp') then\nif cfg.flags.Unicode then\n_p(indent, 'cpp.entryPoint: \"wmainCRTStartup\"')\nelse\n_p(indent, 'cpp.entryPoint: \"mainCRTStartup\"')\nend\nend\nend\nqbs.list(\n indent\n, \"cpp.commonCompilerFlags\"\n, cfg.buildoptions\n)\nqbs.list(\n indent\n, \"cpp.cFlags\"\n, cfg.buildoptions_c\n)\nqbs.list(\n indent\n, \"cpp.cxxFlags\"\n, cfg.buildoptions_cpp\n)\nqbs.list(\n indent\n, \"cpp.objcFlags\"\n, cfg.buildoptions_objc\n)\nqbs.list(\n indent\n, \"cpp.objcxxFlags\"\n, cfg.buildoptions_objc\n)\nif cfg.flags.StaticRuntime then\n_p(indent, 'cpp.runtimeLibrary: \"static\"')\nelse\n_p(indent, 'cpp.runtimeLibrary: \"dyn"
- "amic\"')\nend\nif cfg.flags.PedanticWarnings\nor cfg.flags.ExtraWarnings\nthen\n_p(indent, 'cpp.warningLevel: \"all\"')\nelse\n_p(indent, 'cpp.warningLevel: \"default\"')\nend\nif cfg.flags.FatalWarnings then\n_p(indent, 'cpp.treatWarningsAsErrors: true')\nelse\n_p(indent, 'cpp.treatWarningsAsErrors: false')\nend\nif cfg.flags.NoRTTI then\n_p(indent, 'cpp.enableRtti: false')\nelse\n_p(indent, 'cpp.enableRtti: true')\nend\nif cfg.flags.NoExceptions then\n_p(indent, 'cpp.enableExceptions: false')\nelse\n_p(indent, 'cpp.enableExceptions: true')\nend\nif cfg.flags.Symbols then\n_p(indent, 'cpp.debugInformation: true')\nelse\n_p(indent, 'cpp.debugInformation: false')\nend\nif cfg.flags.Unicode then\n_p(indent, 'cpp.windowsApiCharacterSet: \"unicode\"')\nelse\n_p(indent, 'cpp.windowsApiCharacterSet: \"\"')\nend\nif not cfg.pchheader or cfg.flags.NoPCH then\n_p(indent, 'cpp.usePrecompiledHeader: false')\nelse\n_p(indent, 'cpp.usePrecompiledHeader: true')\n_p(indent, 'Group {')\n_p(indent+1, 'name: \"PCH\"')\n_p(inden"
- "t+1, 'files: [\"' .. cfg.pchheader .. '\"]')\n_p(indent+1, 'fileTags: [\"cpp_pch_src\"]')\n_p(indent, '}')\nend\nfor _, value in ipairs(cfg.flags) do\nif (value == \"Optimize\") then\nelseif (value == \"OptimizeSize\") then\n_p(indent, 'cpp.optimization: \"small\"')\nelseif (value == \"OptimizeSpeed\") then\n_p(indent, 'cpp.optimization: \"fast\"')\nend\nend\nqbs.list(\n indent\n, \"cpp.defines\"\n, cfg.defines\n)\nlocal sortedincdirs = table.join(cfg.userincludedirs, cfg.includedirs, cfg.systemincludedirs)\ntable.sort(sortedincdirs, includesort)\nqbs.list(\n indent\n, \"cpp.includePaths\"\n, sortedincdirs\n)\nqbs.list(\n indent\n, \"cpp.staticLibraries\"\n, premake.getlinks(cfg, \"system\", \"fullpath\")\n)\nqbs.list(\n indent\n, \"cpp.libraryPaths\"\n, cfg.libdirs\n)\nqbs.list(\n indent\n, \"cpp.linkerFlags\"\n, linkerFlags\n)\ntable.sort(prj.files)\nif #prj.files > 0 then\n_p(indent, 'files: [')\nfor _, file in ipairs(prj.files) do\nif path.iscfile(file)\nor path.iscppfile(file)\nor path.isobjcfile(fil"
- "e)\nor path.isresourcefile(file)\nor path.iscppheader(file) then\nif not is_excluded(prj, cfg, file) then\n_p(indent+1, '\"%s\",', file)\nend\nend\nend\n_p(indent+1, ']')\nend\nif #prj.excludes > 0 then\n_p(indent, 'excludeFiles: [')\ntable.sort(prj.excludes)\nfor _, file in ipairs(prj.excludes) do\nif path.issourcefile(file) then\n_p(indent+1, '\"%s\",', file)\nend\nend\n_p(indent+1, ']')\nend\nindent = indent - 1\n_p(indent, '}');\nend\nend\nend\nindent = indent - 1\n_p(indent, '}')\nend\n",
+ "local ninja = premake.ninja\nlocal swift = { }\nlocal p = premake\nfunction ninja.generate_swift_incremental(prj)\nlocal pxy = ninja.get_proxy(\"prj\", prj)\nlocal tool = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, tool.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in p.eachconfig(pxy, platform) do\np.generate(cfg, cfg:getprojectfilename(), function() swift.generate_config(prj, cfg) end)\nend\nend\nend\nfunction swift.generate_config(prj, cfg)\nlocal tool = premake.gettool(prj)\nlocal flags = {\nswiftcflags = ninja.list(table.join(tool.getswiftcflags(cfg), cfg.buildoptions_swiftc)),\n}\n_p(\"# Swift project build file\")\n_p(\"# generated with GENie ninja\")\n_p(\"# https://github.com/bkaradzic/GENie\")\n_p(\"\")\n_p(\"ninja_required_version = 1.7\")\n_p(\"\")\n_p(\"out_dir = %s\", cfg.buildtarget.directory)\n_p(\"obj_dir = %s\", path.join(cfg.objectsdir, prj.name .. \".build\"))\n_p(\"module_name = %s\", prj.name)\n_p(\"module_maps = %s\", ninja"
+ ".list(tool.getmodulemaps(cfg)))\n_p(\"swiftc_flags = %s\", flags.swiftcflags)\n_p(\"swiftlink_flags = %s\", flags.swiftlinkflags)\n_p(\"ar_flags = %s\", ninja.list(tool.getarchiveflags(cfg, cfg, false)))\nlocal sdk = tool.get_sdk_path(cfg)\nif sdk then\n_p(\"toolchain_path = %s\", tool.get_toolchain_path(cfg))\n_p(\"sdk_path = %s\", sdk)\n_p(\"platform_path = %s\", tool.get_sdk_platform_path(cfg))\n_p(\"sdk = -sdk $sdk_path\")\n_p(\"ld_baseflags = -force_load $toolchain_path/usr/lib/arc/libarclite_macosx.a -L $out_dir -F $platform_path/Developer/Library/Frameworks -syslibroot $sdk_path -lobjc -lSystem -L $toolchain_path/usr/lib/swift/macosx -rpath $toolchain_path/usr/lib/swift/macosx -macosx_version_min 10.10.0 -no_objc_category_merging\")\nelse\n_p(\"sdk_path =\")\n_p(\"sdk =\")\n_p(\"ld_baseflags =\")\nend\n_p(\"\")\n_p(\"# core rules for %s\", cfg.name)\n_p(\"rule swiftc\")\n_p(1, \"command = %s -frontend -c -primary-file $in $files $target -enable-objc-interop $sdk -I $out_dir -enable-testing -module-cache"
+ "-path $out_dir/ModuleCache -D SWIFT_PACKAGE $module_maps -emit-module-doc-path $out_doc_name swiftc_flags -module-name $module_name -emit-module-path $out_module_name -emit-dependencies-path $out.d -emit-reference-dependencies-path $obj_dir/$basename.swiftdeps -o $out\", tool.swiftc)\n_p(1, \"description = compile $out\")\n_p(\"\")\n_p(\"rule swiftm\")\n_p(1, \"command = %s -frontend -emit-module $in $parse_as_library swiftc_flags $target -enable-objc-interop $sdk -I $out_dir -F $platform_path/Developer/Library/Frameworks -enable-testing -module-cache-path $out_dir/ModuleCache -D SWIFT_PACKAGE $module_maps -emit-module-doc-path $out_dir/$module_name.swiftdoc -module-name $module_name -o $out\", tool.swift)\n_p(1, \"description = generate module\")\n_p(\"\")\n_p(\"rule swiftlink\")\n_p(1, \"command = %s $target $sdk $swiftlink_flags -L $out_dir -o $out_dir/$module_name -F $platform_path/Developer/Library/Frameworks $in\", tool.swiftc)\n_p(1, \"description = linking $target\")\n_p(\"\")\n_p(\"rule ar\")\n_p(1, "
+ "\"command = %s cr $ar_flags $out $in $libs %s\", tool.ar, (os.is(\"MacOSX\") and \" 2>&1 > /dev/null | sed -e '/.o) has no symbols$$/d'\" or \"\"))\n_p(1, \"description = ar $out\")\n_p(\"\")\n_p(\"rule link\")\n_p(\" command = %s $in $ld_baseflags $all_ldflags $libs -o $out\", tool.ld)\n_p(\" description = link $out\")\n_p(\"\")\nswift.file_rules(cfg, flags)\nlocal objfiles = {}\nlocal modfiles = {}\nlocal docfiles = {}\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\ntable.insert(objfiles, swift.objectname(cfg, file))\ntable.insert(modfiles, swift.modulename(cfg, file))\ntable.insert(docfiles, swift.docname(cfg, file))\nend\nend\n_p(\"\")\nswift.linker(prj, cfg, {objfiles, modfiles, docfiles}, tool, flags)\n_p(\"\")\nend\nfunction swift.objectname(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o\")\nend\nfunction swift.modulename(cfg, file)\nreturn path.join(\"$obj_dir\", path.getname(file)..\".o.swiftmodule\")\nend\nfunction swift.docname(cfg, file)\nreturn path.jo"
+ "in(\"$obj_dir\", path.getname(file)..\".o.swiftdoc\")\nend\nfunction swift.file_rules(cfg, flags)\n_p(\"# build files\")\nlocal sfiles = Set(cfg.files)\nfor _, file in ipairs(cfg.files) do\nif path.issourcefile(file) then\nif path.isswiftfile(file) then\nlocal objn = swift.objectname(cfg, file)\nlocal modn = swift.modulename(cfg, file)\nlocal docn = swift.docname(cfg, file)\n_p(\"build %s | %s %s: swiftc %s\", objn, modn, docn, file)\n_p(1, \"out_module_name = %s\", modn)\n_p(1, \"out_doc_name = %s\", docn)\n_p(1, \"files = \".. ninja.list(sfiles - {file}))\nbuild_flags = \"swiftcflags\"\nend\n_p(1, \"flags = \" .. flags[build_flags])\nelseif path.isresourcefile(file) then\nend\nend\n_p(\"\")\nend\nfunction swift.linker(prj, cfg, depfiles, tool)\nlocal all_ldflags = ninja.list(table.join(tool.getlibdirflags(cfg), tool.getldflags(cfg), cfg.linkoptions))\nlocal lddeps = ninja.list(premake.getlinks(cfg, \"siblings\", \"fullpath\")) \nlocal libs = lddeps .. \" \" .. ninja.list(tool.getlinkflags(cfg)"
+ ")\nlocal function writevars()\n_p(1, \"all_ldflags = \" .. all_ldflags)\n_p(1, \"libs = \" .. libs)\nend\nlocal objfiles, modfiles, docfiles = table.unpack(depfiles)\n_p(\"build $out_dir/$module_name.swiftmodule | $out_dir/$module_name.swiftdoc: swiftm %s | %s\", table.concat(modfiles, \" \"), table.concat(docfiles, \" \"))\n_p(\"\")\nlocal output = cfg:getoutputfilename()\nif cfg.kind == \"StaticLib\" then\nlocal ar_flags = ninja.list(tool.getarchiveflags(cfg, cfg, false))\n_p(\"build %s: ar %s | %s $out_dir/$module_name.swiftmodule $out_dir/$module_name.swiftdoc\", output, table.concat(objfiles, \" \"), lddeps)\n_p(1, \"flags = %s\", ninja.list(tool.getarchiveflags(cfg, cfg, false)))\nelseif cfg.kind == \"SharedLib\" then\n_p(\"build %s : swiftlink %s | %s $out_dir/$module_name.swiftmodule $out_dir/$module_name.swiftdoc\", output, table.concat(objfiles, \" \"), libs)\nwritevars()\nelseif (cfg.kind == \"ConsoleApp\") or (cfg.kind == \"WindowedApp\") then\n_p(\"build %s: swiftlink %s | %s $out_dir/$modu"
+ "le_name.swiftmodule $out_dir/$module_name.swiftdoc\", output, table.concat(objfiles, \" \"), lddeps)\nelse\np.error(\"ninja action doesn't support this kind of target \" .. cfg.kind)\nend\nend\n",
+
+ /* actions/jcdb/_jcdb.lua */
+ "newaction {\ntrigger = \"jcdb\",\nshortname = \"compile_commands.json\",\ndescription = \"Generate a compile_commands.json file.\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\", \"Bundle\" },\nvalid_languages = { \"C\", \"C++\" },\nvalid_tools = { cc = { \"gcc\" } },\nonsolution = function(sln)\nlocal jsonpath = path.join(sln.location, \"compile_commands.json\")\npremake.generate(sln, jsonpath, premake.jcdb.generate)\nend,\n}\n",
+
+ /* actions/jcdb/jcdb_solution.lua */
+ "premake.jcdb = {}\nlocal premake = premake\nlocal jcdb = premake.jcdb\nlocal encode_chars = {\n[0x22] = '\\\\\"',\n[0x5c] = \"\\\\\\\\\",\n[0x08] = \"\\\\b\",\n[0x0c] = \"\\\\f\",\n[0x0a] = \"\\\\n\",\n[0x0d] = \"\\\\r\",\n[0x09] = \"\\\\t\",\n}\nlocal function encode_string(s)\nlocal res = '\"'\nfor _, cp in utf8.codes(s) do\nif encode_chars[cp] then\nres = res..encode_chars[cp]\nelseif cp < 32 then\nres = res..string.format(\"\\\\u%04x\", cp)\nelse\nres = res..utf8.char(cp)\nend\nend\nreturn res..'\"'\nend\nlocal function escape_cmdline_arg(s)\nif s:find(\"%s\") then\ns = s:gsub(\"\\\\\", \"\\\\\\\\\")\ns = s:gsub('\"', '\\\\\"')\ns = '\"'..s..'\"'\nend\nreturn s\nend\nlocal function list(tbl)\nreturn iif(#tbl > 0, \" \"..table.concat(tbl, \" \"), \"\")\nend\nlocal function build_command(cfg, cc, file)\nlocal cmdline = \"\"\nlocal function app(s) cmdline = cmdline..s end\nif path.iscfile(file) or path.isasmfile(file) then\napp(cc.cc)\nelse\napp(cc.cxx)\nend\napp(list(cc.getcppflags(cfg)))\napp(list(cc.getdef"
+ "ines(cfg.defines)))\napp(list(cc.getincludedirs(cfg.includedirs)))\napp(list(cc.getquoteincludedirs(cfg.userincludedirs)))\napp(list(cc.getsystemincludedirs(cfg.systemincludedirs)))\napp(list(cc.getcflags(cfg)))\nif path.iscppfile(file) then\napp(list(cc.getcxxflags(cfg)))\nend\nif path.isasmfile(file) then\napp(list(cfg.buildoptions))\napp(list(cfg.buildoptions_asm))\nelseif path.isobjcfile(file) then\nlocal opts = iif(path.iscfile(file), cfg.buildoptions_objc, cfg.buildoptions_objcpp)\napp(list(cc.getobjcflags(cfg)))\napp(list(cfg.buildoptions))\napp(list(opts))\nelseif path.iscfile(file) then\napp(list(cfg.buildoptions))\napp(list(cfg.buildoptions_c))\nelse\napp(list(cfg.buildoptions))\napp(list(cfg.buildoptions_cpp))\nend\nif cfg.pchheader and not cfg.flags.NoPCH then\napp(\" -include \")\napp(escape_cmdline_arg(cfg.pchheader))\nend\nfor _, i in ipairs(cfg.forcedincludes) do\napp(\" -include \")\napp(escape_cmdline_arg(i))\nend\nlocal base = path.trimdots(path.removeext(file))..\".o\"\nlocal output = path."
+ "join(cfg.objectsdir, base)\napp(\" -o \")\napp(escape_cmdline_arg(output))\napp(\" -c \")\napp(escape_cmdline_arg(file))\nreturn cmdline\nend\nfunction jcdb.generate_config(prj, cfg, cc)\ntable.sort(cfg.files)\nlocal directory = path.getabsolute(prj.location)\nfor _, file in ipairs(cfg.files) do\nif path.iscppfile(file) or path.isasmfile(file) then\n_p(' { \"directory\": %s,', encode_string(directory))\n_p(' \"command\": %s,', encode_string(build_command(cfg, cc, file)))\n_p(' \"file\": %s },', encode_string(file))\nend\nend\nend\nfunction jcdb.generate_project(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\njcdb.generate_config(prj, cfg, cc)\nend\nend\nend\nfunction jcdb.generate(sln)\nfor _, prj in ipairs(sln.projects) do\njcdb.generate_project(prj)\nend\nio.captured = io.captured:gsub(\",%s$\", \"\")\nio.captured = \"[\"..io.eol..io.captur"
+ "ed..io.eol..\"]\"\nend\n",
/* _premake_main.lua */
"_WORKING_DIR = os.getcwd()\nlocal function injectplatform(platform)\nif not platform then return true end\nplatform = premake.checkvalue(platform, premake.fields.platforms.allowed)\nfor sln in premake.solution.each() do\nlocal platforms = sln.platforms or { }\nif #platforms == 0 then\ntable.insert(platforms, \"Native\")\nend\nif not table.contains(platforms, \"Native\") then\nreturn false, sln.name .. \" does not target native platform\\nNative platform settings are required for the --platform feature.\"\nend\nif not table.contains(platforms, platform) then\ntable.insert(platforms, platform)\nend\nsln.platforms = platforms\nend\nreturn true\nend\nfunction _premake_main(scriptpath)\nif (scriptpath) then\nlocal scripts = dofile(scriptpath .. \"/_manifest.lua\")\nfor _,v in ipairs(scripts) do\ndofile(scriptpath .. \"/\" .. v)\nend\nend\nlocal profiler = newProfiler()\nif (nil ~= _OPTIONS[\"debug-profiler\"]) then\nprofiler:start()\nend\n_PREMAKE_COMMAND = path.getabsolute(_PREMAKE_COMMAND)\npremake.action"
diff --git a/3rdparty/genie/src/host/version.h b/3rdparty/genie/src/host/version.h
index 91f561ceb56..7a963bb1439 100644
--- a/3rdparty/genie/src/host/version.h
+++ b/3rdparty/genie/src/host/version.h
@@ -1,3 +1,2 @@
-// This file is autogenerated, do not change it.
-#define VERSION 0
-#define VERSION_STR "<auto generated do not change>"
+#define VERSION 1181
+#define VERSION_STR "version ? (Local Build)"
diff --git a/3rdparty/genie/src/tools/gcc.lua b/3rdparty/genie/src/tools/gcc.lua
index 3c87aa2074a..30a9fa91d91 100644
--- a/3rdparty/genie/src/tools/gcc.lua
+++ b/3rdparty/genie/src/tools/gcc.lua
@@ -46,7 +46,8 @@
Cpp11 = "-std=c++11",
Cpp14 = "-std=c++14",
Cpp17 = "-std=c++17",
- CppLatest = "-std=c++2a",
+ Cpp20 = "-std=c++20",
+ CppLatest = "-std=c++2b",
NoExceptions = "-fno-exceptions",
NoRTTI = "-fno-rtti",
UnsignedChar = "-funsigned-char",
@@ -115,7 +116,21 @@
cxx = "$(EMSCRIPTEN)/em++",
ar = "$(EMSCRIPTEN)/emar",
cppflags = "-MMD -MP",
- }
+ },
+ NX32 = {
+ cc = "clang",
+ cxx = "clang++",
+ ar = "armv7l-nintendo-nx-eabihf-ar",
+ cppflags = "-MMD -MP",
+ flags = "-march=armv7l",
+ },
+ NX64 = {
+ cc = "clang",
+ cxx = "clang++",
+ ar = "aarch64-nintendo-nx-elf-ar",
+ cppflags = "-MMD -MP",
+ flags = "-march=aarch64",
+ },
}
local platforms = premake.gcc.platforms
diff --git a/3rdparty/genie/src/tools/valac.lua b/3rdparty/genie/src/tools/valac.lua
index 4101c2e04fd..43f65818cf4 100644
--- a/3rdparty/genie/src/tools/valac.lua
+++ b/3rdparty/genie/src/tools/valac.lua
@@ -12,7 +12,8 @@
--
premake.valac.valac = "valac"
- premake.valac.cc = "gcc"
+ premake.valac.cc = premake.gcc.cc
+ premake.valac.glibrc = "glib-compile-resources"
--
@@ -30,20 +31,37 @@
EnableExperimentalNonNull = "--enable-experimental-non-null", -- Enable experimental enhancements for non-null types
EnableGObjectTracing = "--enable-gobject-tracing", -- Enable GObject creation tracing
EnableMemProfiler = "--enable-mem-profiler", -- Enable GLib memory profiler
- EnableThreading = "--thread", -- Enable multithreading support
FatalWarnings = "--fatal-warnings", -- Treat warnings as fatal
HideInternal = "--hide-internal", -- Hide symbols marked as internal
NoStdPkg = "--nostdpkg", -- Do not include standard packages
- Optimize = "-X -O2",
- OptimizeSize = "-X -Os",
- OptimizeSpeed = "-X -O3",
Symbols = "-g", -- Produce debug information
}
- premake.valac.platforms = {}
+ local valaccflags =
+ {
+ Optimize = "-O2",
+ OptimizeSize = "-Os",
+ OptimizeSpeed = "-O3",
+ Symbols = "-g", -- Produce debug information
+ }
--
--- Returns a list of compiler flags, based on the supplied configuration.
+-- Map platforms to flags
+--
+
+ premake.valac.platforms =
+ {
+ Native = {
+ },
+ x64 = {
+ flags = "-m64"
+ },
+ }
+
+
+
+--
+-- Returns a list of compiler flags for `valac`, based on the supplied configuration.
--
function premake.valac.getvalaflags(cfg)
@@ -53,6 +71,16 @@
--
+-- Returns a list of compiler flags for `cc`, based on the supplied configuration.
+--
+
+ function premake.valac.getvalaccflags(cfg)
+ return table.translate(cfg.flags, valaccflags)
+ end
+
+
+
+--
-- Decorate pkgs for the Vala command line.
--
@@ -81,18 +109,6 @@
--
--- Decorate C flags for the Vala command line.
---
-
- function premake.valac.getbuildoptions(buildoptions)
- local result = { }
- for _, def in ipairs(buildoptions) do
- table.insert(result, '-X ' .. def)
- end
- return result
- end
-
---
-- Decorate vapidirs for the Vala command line.
--
diff --git a/3rdparty/genie/tests/actions/vstudio/test_vs2010_flags.lua b/3rdparty/genie/tests/actions/vstudio/test_vs2010_flags.lua
index 65b824ea725..be1784c223b 100644
--- a/3rdparty/genie/tests/actions/vstudio/test_vs2010_flags.lua
+++ b/3rdparty/genie/tests/actions/vstudio/test_vs2010_flags.lua
@@ -205,13 +205,6 @@ function vs10_flags.release_minimalRebuild_setToFalse()
test.string_contains(buffer,'<MinimalRebuild>false</MinimalRebuild>')
end
-function vs10_flags.mfc_useOfMfc_setToStatic()
- flags{"MFC"}
-
- local buffer = get_buffer()
- test.string_contains(buffer,'<UseOfMfc>Dynamic</UseOfMfc>')
-end
-
--there is not an option for /Z7 OldStyle
--/ZI is not compatible with /clr or x64_64
--minimal Rebuild requires /Zi in x86_64
diff --git a/3rdparty/genie/tests/actions/vstudio/vc200x/test_mfc.lua b/3rdparty/genie/tests/actions/vstudio/vc200x/test_mfc.lua
deleted file mode 100644
index cf0a54a6e54..00000000000
--- a/3rdparty/genie/tests/actions/vstudio/vc200x/test_mfc.lua
+++ /dev/null
@@ -1,98 +0,0 @@
---
--- tests/actions/vstudio/vc200x/test_mfc.lua
--- Validate ATL/MFC support in Visual Studio 200x C/C++ projects.
--- Copyright (c) 2011 Jason Perkins and the Premake project
---
-
- T.vstudio_vs200x_mfc = { }
- local suite = T.vstudio_vs200x_mfc
- local vc200x = premake.vstudio.vc200x
-
-
---
--- Setup
---
-
- local sln, prj, cfg
-
- function suite.setup()
- _ACTION = "vs2008"
- sln, prj = test.createsolution()
- end
-
- local function prepare(platform)
- premake.bake.buildconfigs()
- sln.vstudio_configs = premake.vstudio.buildconfigs(sln)
- cfg = premake.getconfig(prj, "Debug", platform)
- vc200x.Configuration("Debug|Win32", cfg)
- end
-
-
---
--- When MFC is enabled, it should match the runtime library linking
--- method (static or dynamic).
---
-
- function suite.useOfMfc_isDynamic_onSharedRuntime()
- flags { "MFC" }
- prepare()
- test.capture [[
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="."
- IntermediateDirectory="obj\Debug"
- ConfigurationType="1"
- UseOfMFC="2"
- CharacterSet="2"
- >
- ]]
- end
-
- function suite.useOfMfc_isStatic_onStaticRuntime()
- flags { "MFC", "StaticRuntime" }
- prepare()
- test.capture [[
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="."
- IntermediateDirectory="obj\Debug"
- ConfigurationType="1"
- UseOfMFC="1"
- CharacterSet="2"
- >
- ]]
- end
-
---
--- Same as above for ATL.
---
-
- function suite.useOfAtl_isDynamic_onSharedRuntime()
- flags { "ATL" }
- prepare()
- test.capture [[
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="."
- IntermediateDirectory="obj\Debug"
- ConfigurationType="1"
- UseOfATL="2"
- CharacterSet="2"
- >
- ]]
- end
-
- function suite.useOfAtl_isStatic_onStaticRuntime()
- flags { "StaticATL" }
- prepare()
- test.capture [[
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="."
- IntermediateDirectory="obj\Debug"
- ConfigurationType="1"
- UseOfATL="1"
- CharacterSet="2"
- >
- ]]
- end
diff --git a/3rdparty/genie/tests/actions/vstudio/vc2010/test_mfc.lua b/3rdparty/genie/tests/actions/vstudio/vc2010/test_mfc.lua
deleted file mode 100644
index 1ada1585673..00000000000
--- a/3rdparty/genie/tests/actions/vstudio/vc2010/test_mfc.lua
+++ /dev/null
@@ -1,60 +0,0 @@
---
--- tests/actions/vstudio/vc2010/test_mfc.lua
--- Validate MFC support in Visual Studio 2010 C/C++ projects.
--- Copyright (c) 2011 Jason Perkins and the Premake project
---
-
- T.vstudio_vs2010_mfc = { }
- local suite = T.vstudio_vs2010_mfc
- local vc2010 = premake.vstudio.vc2010
-
-
---
--- Setup
---
-
- local sln, prj, cfg
-
- function suite.setup()
- _ACTION = "vs2010"
- sln, prj = test.createsolution()
- end
-
- local function prepare(platform)
- premake.bake.buildconfigs()
- sln.vstudio_configs = premake.vstudio.buildconfigs(sln)
- cfg = premake.getconfig(prj, "Debug", platform)
- vc2010.configurationPropertyGroup(cfg, sln.vstudio_configs[1])
- end
-
-
---
--- When MFC is enabled, it should match the runtime library linking
--- method (static or dynamic).
---
-
- function suite.useOfMfc_isDynamic_onSharedRuntime()
- flags { "MFC" }
- prepare()
- test.capture [[
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>MultiByte</CharacterSet>
- <UseOfMfc>Dynamic</UseOfMfc>
- </PropertyGroup>
- ]]
- end
-
- function suite.useOfMfc_isStatic_onStaticRuntime()
- flags { "MFC", "StaticRuntime" }
- prepare()
- test.capture [[
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>MultiByte</CharacterSet>
- <UseOfMfc>Static</UseOfMfc>
- </PropertyGroup>
- ]]
- end
diff --git a/3rdparty/genie/tests/premake4.lua b/3rdparty/genie/tests/premake4.lua
index 30166e734a3..626eb3e06e1 100644
--- a/3rdparty/genie/tests/premake4.lua
+++ b/3rdparty/genie/tests/premake4.lua
@@ -98,7 +98,6 @@
dofile("actions/vstudio/vc200x/header.lua")
dofile("actions/vstudio/vc200x/test_files.lua")
dofile("actions/vstudio/vc200x/test_filters.lua")
- dofile("actions/vstudio/vc200x/test_mfc.lua")
-- Visual Studio 2010 C/C++ projects
dofile("actions/vstudio/vc2010/test_config_props.lua")
@@ -108,7 +107,6 @@
dofile("actions/vstudio/vc2010/test_filters.lua")
dofile("actions/vstudio/vc2010/test_link_settings.lua")
dofile("actions/vstudio/vc2010/test_links.lua")
- dofile("actions/vstudio/vc2010/test_mfc.lua")
dofile("actions/vstudio/vc2010/test_output_props.lua")
dofile("actions/vstudio/vc2010/test_pch.lua")
dofile("actions/vstudio/vc2010/test_project_refs.lua")
diff --git a/3rdparty/lua/Makefile b/3rdparty/lua/Makefile
index fef1af4821e..72ca8ff3cc1 100644
--- a/3rdparty/lua/Makefile
+++ b/3rdparty/lua/Makefile
@@ -36,7 +36,7 @@ RM= rm -f
# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======
# Convenience platforms targets.
-PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris
+PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris
# What to install.
TO_BIN= lua luac
@@ -46,7 +46,7 @@ TO_MAN= lua.1 luac.1
# Lua version and release.
V= 5.4
-R= $V.4
+R= $V.7
# Targets start here.
all: $(PLAT)
diff --git a/3rdparty/lua/README b/3rdparty/lua/README
index c394c69828b..fe99b874f61 100644
--- a/3rdparty/lua/README
+++ b/3rdparty/lua/README
@@ -1,5 +1,5 @@
-This is Lua 5.4.4, released on 13 Jan 2022.
+This is Lua 5.4.7, released on 13 Jun 2024.
For installation instructions, license details, and
further information about Lua, see doc/readme.html.
diff --git a/3rdparty/lua/doc/OSIApproved_100X125.png b/3rdparty/lua/doc/OSIApproved_100X125.png
new file mode 100644
index 00000000000..795f7a06ed5
--- /dev/null
+++ b/3rdparty/lua/doc/OSIApproved_100X125.png
Binary files differ
diff --git a/3rdparty/lua/doc/contents.html b/3rdparty/lua/doc/contents.html
index ab82eb4a927..e17104845a2 100644
--- a/3rdparty/lua/doc/contents.html
+++ b/3rdparty/lua/doc/contents.html
@@ -10,7 +10,7 @@
<BODY>
<H1>
-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
+<A HREF="https://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
Lua 5.4 Reference Manual
</H1>
@@ -18,7 +18,7 @@ Lua 5.4 Reference Manual
The reference manual is the official definition of the Lua language.
<BR>
For a complete introduction to Lua programming, see the book
-<A HREF="http://www.lua.org/pil/">Programming in Lua</A>.
+<A HREF="https://www.lua.org/pil/">Programming in Lua</A>.
<DIV CLASS="menubar">
<A HREF="manual.html">start</A>
@@ -27,14 +27,14 @@ For a complete introduction to Lua programming, see the book
&middot;
<A HREF="#index">index</A>
&middot;
-<A HREF="http://www.lua.org/manual/">other versions</A>
+<A HREF="https://www.lua.org/manual/">other versions</A>
</DIV>
<P>
<SMALL>
-Copyright &copy; 2020&ndash;2022 Lua.org, PUC-Rio.
+Copyright &copy; 2020&ndash;2024 Lua.org, PUC-Rio.
Freely available under the terms of the
-<A HREF="http://www.lua.org/license.html">Lua license</A>.
+<A HREF="https://www.lua.org/license.html">Lua license</A>.
</SMALL>
<H2><A NAME="contents">Contents</A></H2>
@@ -85,6 +85,8 @@ Freely available under the terms of the
<LI><A HREF="manual.html#3.4.9">3.4.9 &ndash; Table Constructors</A>
<LI><A HREF="manual.html#3.4.10">3.4.10 &ndash; Function Calls</A>
<LI><A HREF="manual.html#3.4.11">3.4.11 &ndash; Function Definitions</A>
+<LI><A HREF="manual.html#3.4.12">3.4.12 &ndash; Lists of expressions, multiple results, and adjustment<A>
+
</UL>
<LI><A HREF="manual.html#3.5">3.5 &ndash; Visibility Rules</A>
</UL>
@@ -613,7 +615,7 @@ Freely available under the terms of the
<A HREF="manual.html#pdf-LUA_HOOKLINE">LUA_HOOKLINE</A><BR>
<A HREF="manual.html#pdf-LUA_HOOKRET">LUA_HOOKRET</A><BR>
<A HREF="manual.html#pdf-LUA_HOOKTAILCALL">LUA_HOOKTAILCALL</A><BR>
-<A HREF="manual.html#pdf-LUAL_BUFFERSIZE">LUAL_BUFFERSIZE</A><BR>
+<A HREF="manual.html#pdf-LUA_LOADED_TABLE">LUA_LOADED_TABLE</A><BR>
<A HREF="manual.html#pdf-LUA_MASKCALL">LUA_MASKCALL</A><BR>
<A HREF="manual.html#pdf-LUA_MASKCOUNT">LUA_MASKCOUNT</A><BR>
<A HREF="manual.html#pdf-LUA_MASKLINE">LUA_MASKLINE</A><BR>
@@ -641,6 +643,7 @@ Freely available under the terms of the
<A HREF="manual.html#pdf-LUA_OPSHR">LUA_OPSHR</A><BR>
<A HREF="manual.html#pdf-LUA_OPSUB">LUA_OPSUB</A><BR>
<A HREF="manual.html#pdf-LUA_OPUNM">LUA_OPUNM</A><BR>
+<A HREF="manual.html#pdf-LUA_PRELOAD_TABLE">LUA_PRELOAD_TABLE</A><BR>
<A HREF="manual.html#pdf-LUA_REFNIL">LUA_REFNIL</A><BR>
<A HREF="manual.html#pdf-LUA_REGISTRYINDEX">LUA_REGISTRYINDEX</A><BR>
<A HREF="manual.html#pdf-LUA_RIDX_GLOBALS">LUA_RIDX_GLOBALS</A><BR>
@@ -657,6 +660,7 @@ Freely available under the terms of the
<A HREF="manual.html#pdf-LUA_TUSERDATA">LUA_TUSERDATA</A><BR>
<A HREF="manual.html#pdf-LUA_USE_APICHECK">LUA_USE_APICHECK</A><BR>
<A HREF="manual.html#pdf-LUA_YIELD">LUA_YIELD</A><BR>
+<A HREF="manual.html#pdf-LUAL_BUFFERSIZE">LUAL_BUFFERSIZE</A><BR>
</TD>
</TR>
@@ -664,10 +668,10 @@ Freely available under the terms of the
<P CLASS="footer">
Last update:
-Thu Jan 13 11:32:22 UTC 2022
+Thu May 9 14:47:09 UTC 2024
</P>
<!--
-Last change: revised for Lua 5.4.4
+Last change: revised for Lua 5.4.7
-->
</BODY>
diff --git a/3rdparty/lua/doc/lua.1 b/3rdparty/lua/doc/lua.1
index a46a1a67dd0..3c9e000234e 100644
--- a/3rdparty/lua/doc/lua.1
+++ b/3rdparty/lua/doc/lua.1
@@ -1,5 +1,5 @@
-.\" $Id: lua.man,v 1.14 2020/05/21 19:31:21 lhf Exp $
-.TH LUA 1 "$Date: 2020/05/21 19:31:21 $"
+.\" $Id: lua.man,v 1.14 2024/05/08 18:48:27 lhf Exp $
+.TH LUA 1 "$Date: 2024/05/08 18:48:27 $"
.SH NAME
lua \- Lua interpreter
.SH SYNOPSIS
@@ -86,11 +86,17 @@ execute statement
enter interactive mode after executing
.IR script .
.TP
-.BI \-l " name"
+.BI \-l " mod"
require library
-.I name
+.I mod
into global
-.IR name .
+.IR mod .
+.TP
+.BI \-l " g=mod"
+require library
+.I mod
+into global
+.IR g .
.TP
.B \-v
show version information.
@@ -117,7 +123,7 @@ and the version-neutral variants are ignored.
Code to be executed before command line options and scripts.
.TP
.B LUA_PATH, LUA_PATH_5_4
-Initial value of package.cpath,
+Initial value of package.path,
the path used by require to search for Lua loaders.
.TP
.B LUA_CPATH, LUA_CPATH_5_4
diff --git a/3rdparty/lua/doc/lua.css b/3rdparty/lua/doc/lua.css
index cbd0799d152..9013b445c65 100644
--- a/3rdparty/lua/doc/lua.css
+++ b/3rdparty/lua/doc/lua.css
@@ -143,6 +143,7 @@ table.book td.cover {
table.book img {
border: solid #000080 1px ;
+ border-radius: 2px ;
}
table.book span {
diff --git a/3rdparty/lua/doc/manual.html b/3rdparty/lua/doc/manual.html
index 61a8220d7fd..574c7432c0f 100644
--- a/3rdparty/lua/doc/manual.html
+++ b/3rdparty/lua/doc/manual.html
@@ -10,7 +10,7 @@
<BODY>
<H1>
-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
+<A HREF="https://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
Lua 5.4 Reference Manual
</H1>
@@ -19,9 +19,9 @@ by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes
<P>
<SMALL>
-Copyright &copy; 2020&ndash;2022 Lua.org, PUC-Rio.
+Copyright &copy; 2020&ndash;2024 Lua.org, PUC-Rio.
Freely available under the terms of the
-<a href="http://www.lua.org/license.html">Lua license</a>.
+<a href="https://www.lua.org/license.html">Lua license</a>.
</SMALL>
<DIV CLASS="menubar">
@@ -29,7 +29,7 @@ Freely available under the terms of the
&middot;
<A HREF="contents.html#index">index</A>
&middot;
-<A HREF="http://www.lua.org/manual/">other versions</A>
+<A HREF="https://www.lua.org/manual/">other versions</A>
</DIV>
<!-- ====================================================================== -->
@@ -63,7 +63,7 @@ and rapid prototyping.
<p>
Lua is implemented as a library, written in <em>clean C</em>,
-the common subset of Standard&nbsp;C and C++.
+the common subset of standard&nbsp;C and C++.
The Lua distribution includes a host program called <code>lua</code>,
which uses the Lua library to offer a complete,
standalone Lua interpreter,
@@ -391,7 +391,7 @@ Whenever there is an error,
an <em>error object</em>
is propagated with information about the error.
Lua itself only generates errors whose error object is a string,
-but programs may generate errors with
+but programs can generate errors with
any value as the error object.
It is up to the Lua program or its host to handle such error objects.
For historical reasons,
@@ -401,7 +401,7 @@ even though it does not have to be a string.
<p>
When you use <a href="#pdf-xpcall"><code>xpcall</code></a> (or <a href="#lua_pcall"><code>lua_pcall</code></a>, in C)
-you may give a <em>message handler</em>
+you can give a <em>message handler</em>
to be called in case of errors.
This function is called with the original error object
and returns a new error object.
@@ -453,7 +453,7 @@ which is then called a <em>metamethod</em>.
In the previous example, the key is the string "<code>__add</code>"
and the metamethod is the function that performs the addition.
Unless stated otherwise,
-a metamethod may in fact be any callable value,
+a metamethod can in fact be any callable value,
which is either a function or a value with a <code>__call</code> metamethod.
@@ -1379,7 +1379,9 @@ Lua also accepts hexadecimal constants,
which start with <code>0x</code> or <code>0X</code>.
Hexadecimal constants also accept an optional fractional part
plus an optional binary exponent,
-marked by a letter '<code>p</code>' or '<code>P</code>'.
+marked by a letter '<code>p</code>' or '<code>P</code>' and written in decimal.
+(For instance, <code>0x1.fp10</code> denotes 1984,
+which is <em>0x1f / 16</em> multiplied by <em>2<sup>10</sup></em>.)
<p>
@@ -1621,21 +1623,13 @@ Expressions are discussed in <a href="#3.4">&sect;3.4</a>.
<p>
Before the assignment,
the list of values is <em>adjusted</em> to the length of
-the list of variables.
-If there are more values than needed,
-the excess values are thrown away.
-If there are fewer values than needed,
-the list is extended with <b>nil</b>'s.
-If the list of expressions ends with a function call,
-then all values returned by that call enter the list of values,
-before the adjustment
-(except when the call is enclosed in parentheses; see <a href="#3.4">&sect;3.4</a>).
+the list of variables (see <a href="#3.4.12">&sect;3.4.12</a>).
<p>
If a variable is both assigned and read
inside a multiple assignment,
-Lua ensures all reads get the value of the variable
+Lua ensures that all reads get the value of the variable
before the assignment.
Thus the code
@@ -1731,7 +1725,7 @@ labels in Lua are considered statements too:
<p>
A label is visible in the entire block where it is defined,
except inside nested functions.
-A goto may jump to any visible label as long as it does not
+A goto can jump to any visible label as long as it does not
enter into the scope of a local variable.
A label should not be declared
where a label with the same name is visible,
@@ -1739,11 +1733,6 @@ even if this other label has been declared in an enclosing block.
<p>
-Labels and empty statements are called <em>void statements</em>,
-as they perform no actions.
-
-
-<p>
The <b>break</b> statement terminates the execution of a
<b>while</b>, <b>repeat</b>, or <b>for</b> loop,
skipping to the next statement after the loop:
@@ -2059,7 +2048,7 @@ function calls are explained in <a href="#3.4.10">&sect;3.4.10</a>;
table constructors are explained in <a href="#3.4.9">&sect;3.4.9</a>.
Vararg expressions,
denoted by three dots ('<code>...</code>'), can only be used when
-directly inside a vararg function;
+directly inside a variadic function;
they are explained in <a href="#3.4.11">&sect;3.4.11</a>.
@@ -2074,52 +2063,6 @@ the unary logical <b>not</b> (see <a href="#3.4.5">&sect;3.4.5</a>),
and the unary <em>length operator</em> (see <a href="#3.4.7">&sect;3.4.7</a>).
-<p>
-Both function calls and vararg expressions can result in multiple values.
-If a function call is used as a statement (see <a href="#3.3.6">&sect;3.3.6</a>),
-then its return list is adjusted to zero elements,
-thus discarding all returned values.
-If an expression is used as the last (or the only) element
-of a list of expressions,
-then no adjustment is made
-(unless the expression is enclosed in parentheses).
-In all other contexts,
-Lua adjusts the result list to one element,
-either discarding all values except the first one
-or adding a single <b>nil</b> if there are no values.
-
-
-<p>
-Here are some examples:
-
-<pre>
- f() -- adjusted to 0 results
- g(f(), x) -- f() is adjusted to 1 result
- g(x, f()) -- g gets x plus all results from f()
- a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil)
- a,b = ... -- a gets the first vararg argument, b gets
- -- the second (both a and b can get nil if there
- -- is no corresponding vararg argument)
-
- a,b,c = x, f() -- f() is adjusted to 2 results
- a,b,c = f() -- f() is adjusted to 3 results
- return f() -- returns all results from f()
- return ... -- returns all received vararg arguments
- return x,y,f() -- returns x, y, and all results from f()
- {f()} -- creates a list with all results from f()
- {...} -- creates a list with all vararg arguments
- {f(), nil} -- f() is adjusted to 1 result
-</pre>
-
-<p>
-Any expression enclosed in parentheses always results in only one value.
-Thus,
-<code>(f(x,y,z))</code> is always a single value,
-even if <code>f</code> returns several values.
-(The value of <code>(f(x,y,z))</code> is the first value returned by <code>f</code>
-or <b>nil</b> if <code>f</code> does not return any values.)
-
-
@@ -2252,8 +2195,9 @@ Note that bitwise operators do not do this coercion.
<p>
-Nonetheless, it is always a good practice not to rely on these
-implicit coercions, as they are not always applied;
+It is always a good practice not to rely on the
+implicit coercions from strings to numbers,
+as they are not always applied;
in particular, <code>"1"==1</code> is false and <code>"1"&lt;1</code> raises an error
(see <a href="#3.4.4">&sect;3.4.4</a>).
These coercions exist mainly for compatibility and may be removed
@@ -2558,9 +2502,9 @@ The order of the assignments in a constructor is undefined.
<p>
If the last field in the list has the form <code>exp</code>
-and the expression is a function call or a vararg expression,
+and the expression is a multires expression,
then all values returned by this expression enter the list consecutively
-(see <a href="#3.4.10">&sect;3.4.10</a>).
+(see <a href="#3.4.12">&sect;3.4.12</a>).
<p>
@@ -2624,7 +2568,7 @@ A call of the form <code>return <em>functioncall</em></code> not in the
scope of a to-be-closed variable is called a <em>tail call</em>.
Lua implements <em>proper tail calls</em>
(or <em>proper tail recursion</em>):
-in a tail call,
+In a tail call,
the called function reuses the stack entry of the calling function.
Therefore, there is no limit on the number of nested tail calls that
a program can execute.
@@ -2727,22 +2671,16 @@ initialized with the argument values:
</pre><p>
When a Lua function is called,
it adjusts its list of arguments to
-the length of its list of parameters,
-unless the function is a <em>vararg function</em>,
+the length of its list of parameters (see <a href="#3.4.12">&sect;3.4.12</a>),
+unless the function is a <em>variadic function</em>,
which is indicated by three dots ('<code>...</code>')
at the end of its parameter list.
-A vararg function does not adjust its argument list;
+A variadic function does not adjust its argument list;
instead, it collects all extra arguments and supplies them
to the function through a <em>vararg expression</em>,
which is also written as three dots.
The value of this expression is a list of all actual extra arguments,
-similar to a function with multiple results.
-If a vararg expression is used inside another expression
-or in the middle of a list of expressions,
-then its return list is adjusted to one element.
-If the expression is used as the last element of a list of expressions,
-then no adjustment is made
-(unless that last expression is enclosed in parentheses).
+similar to a function with multiple results (see <a href="#3.4.12">&sect;3.4.12</a>).
<p>
@@ -2803,6 +2741,122 @@ is syntactic sugar for
+<h3>3.4.12 &ndash; <a name="3.4.12">Lists of expressions, multiple results,
+and adjustment</a></h3>
+
+<p>
+Both function calls and vararg expressions can result in multiple values.
+These expressions are called <em>multires expressions</em>.
+
+
+<p>
+When a multires expression is used as the last element
+of a list of expressions,
+all results from the expression are added to the
+list of values produced by the list of expressions.
+Note that a single expression
+in a place that expects a list of expressions
+is the last expression in that (singleton) list.
+
+
+<p>
+These are the places where Lua expects a list of expressions:
+
+<ul>
+
+<li>A <b>return</b> statement,
+for instance <code>return e1, e2, e3</code> (see <a href="#3.3.4">&sect;3.3.4</a>).</li>
+
+<li>A table constructor,
+for instance <code>{e1, e2, e3}</code> (see <a href="#3.4.9">&sect;3.4.9</a>).</li>
+
+<li>The arguments of a function call,
+for instance <code>foo(e1, e2, e3)</code> (see <a href="#3.4.10">&sect;3.4.10</a>).</li>
+
+<li>A multiple assignment,
+for instance <code>a , b, c = e1, e2, e3</code> (see <a href="#3.3.3">&sect;3.3.3</a>).</li>
+
+<li>A local declaration,
+for instance <code>local a , b, c = e1, e2, e3</code> (see <a href="#3.3.7">&sect;3.3.7</a>).</li>
+
+<li>The initial values in a generic <b>for</b> loop,
+for instance <code>for k in e1, e2, e3 do ... end</code> (see <a href="#3.3.5">&sect;3.3.5</a>).</li>
+
+</ul><p>
+In the last four cases,
+the list of values from the list of expressions
+must be <em>adjusted</em> to a specific length:
+the number of parameters in a call to a non-variadic function
+(see <a href="#3.4.11">&sect;3.4.11</a>),
+the number of variables in a multiple assignment or
+a local declaration,
+and exactly four values for a generic <b>for</b> loop.
+The <em>adjustment</em> follows these rules:
+If there are more values than needed,
+the extra values are thrown away;
+if there are fewer values than needed,
+the list is extended with <b>nil</b>'s.
+When the list of expressions ends with a multires expression,
+all results from that expression enter the list of values
+before the adjustment.
+
+
+<p>
+When a multires expression is used
+in a list of expressions without being the last element,
+or in a place where the syntax expects a single expression,
+Lua adjusts the result list of that expression to one element.
+As a particular case,
+the syntax expects a single expression inside a parenthesized expression;
+therefore, adding parentheses around a multires expression
+forces it to produce exactly one result.
+
+
+<p>
+We seldom need to use a vararg expression in a place
+where the syntax expects a single expression.
+(Usually it is simpler to add a regular parameter before
+the variadic part and use that parameter.)
+When there is such a need,
+we recommend assigning the vararg expression
+to a single variable and using that variable
+in its place.
+
+
+<p>
+Here are some examples of uses of mutlres expressions.
+In all cases, when the construction needs
+"the n-th result" and there is no such result,
+it uses a <b>nil</b>.
+
+<pre>
+ print(x, f()) -- prints x and all results from f().
+ print(x, (f())) -- prints x and the first result from f().
+ print(f(), x) -- prints the first result from f() and x.
+ print(1 + f()) -- prints 1 added to the first result from f().
+ local x = ... -- x gets the first vararg argument.
+ x,y = ... -- x gets the first vararg argument,
+ -- y gets the second vararg argument.
+ x,y,z = w, f() -- x gets w, y gets the first result from f(),
+ -- z gets the second result from f().
+ x,y,z = f() -- x gets the first result from f(),
+ -- y gets the second result from f(),
+ -- z gets the third result from f().
+ x,y,z = f(), g() -- x gets the first result from f(),
+ -- y gets the first result from g(),
+ -- z gets the second result from g().
+ x,y,z = (f()) -- x gets the first result from f(), y and z get nil.
+ return f() -- returns all results from f().
+ return x, ... -- returns x and all received vararg arguments.
+ return x,y,f() -- returns x, y, and all results from f().
+ {f()} -- creates a list with all results from f().
+ {...} -- creates a list with all vararg arguments.
+ {f(), 5} -- creates a list with the first result from f() and 5.
+</pre>
+
+
+
+
<h2>3.5 &ndash; <a name="3.5">Visibility Rules</a></h2>
@@ -2813,6 +2867,7 @@ Lua is a lexically scoped language.
The scope of a local variable begins at the first statement after
its declaration and lasts until the last non-void statement
of the innermost block that includes the declaration.
+(<em>Void statements</em> are labels and empty statements.)
Consider the following example:
<pre>
@@ -3071,7 +3126,7 @@ In general,
Lua's garbage collection can free or move internal memory
and then invalidate pointers to internal strings.
To allow a safe use of these pointers,
-The API guarantees that any pointer to a string in a stack index
+the API guarantees that any pointer to a string in a stack index
is valid while the string value at that index is not removed from the stack.
(It can be moved to another index, though.)
When the index is a pseudo-index (referring to an upvalue),
@@ -3537,7 +3592,7 @@ It is used in the auxiliary library by <a href="#luaL_newstate"><code>luaL_newst
return realloc(ptr, nsize);
}
</pre><p>
-Note that Standard&nbsp;C ensures
+Note that ISO&nbsp;C ensures
that <code>free(NULL)</code> has no effect and that
<code>realloc(NULL,size)</code> is equivalent to <code>malloc(size)</code>.
@@ -3785,8 +3840,36 @@ when called through this function.
<p>
-(Exceptionally, this function was introduced in release 5.4.3.
-It is not present in previous 5.4 releases.)
+(This function was introduced in release&nbsp;5.4.3.)
+
+
+
+
+
+<hr><h3><a name="lua_closethread"><code>lua_closethread</code></a></h3><p>
+<span class="apii">[-0, +?, &ndash;]</span>
+<pre>int lua_closethread (lua_State *L, lua_State *from);</pre>
+
+<p>
+Resets a thread, cleaning its call stack and closing all pending
+to-be-closed variables.
+Returns a status code:
+<a href="#pdf-LUA_OK"><code>LUA_OK</code></a> for no errors in the thread
+(either the original error that stopped the thread or
+errors in closing methods),
+or an error status otherwise.
+In case of error,
+leaves the error object on the top of the stack.
+
+
+<p>
+The parameter <code>from</code> represents the coroutine that is resetting <code>L</code>.
+If there is no such coroutine,
+this parameter can be <code>NULL</code>.
+
+
+<p>
+(This function was introduced in release&nbsp;5.4.6.)
@@ -4542,7 +4625,7 @@ Pops a key from the stack,
and pushes a key&ndash;value pair from the table at the given index,
the "next" pair after the given key.
If there are no more elements in the table,
-then <a href="#lua_next"><code>lua_next</code></a> returns 0 and pushes nothing.
+then <a href="#lua_next"><code>lua_next</code></a> returns&nbsp;0 and pushes nothing.
<p>
@@ -4985,6 +5068,7 @@ Also returns&nbsp;0 if any of the indices are not valid.
<p>
Similar to <a href="#lua_gettable"><code>lua_gettable</code></a>, but does a raw access
(i.e., without metamethods).
+The value at <code>index</code> must be a table.
@@ -5051,6 +5135,7 @@ For other values, this call returns&nbsp;0.
<p>
Similar to <a href="#lua_settable"><code>lua_settable</code></a>, but does a raw assignment
(i.e., without metamethods).
+The value at <code>index</code> must be a table.
@@ -5166,15 +5251,9 @@ and then pops the top element.
<pre>int lua_resetthread (lua_State *L);</pre>
<p>
-Resets a thread, cleaning its call stack and closing all pending
-to-be-closed variables.
-Returns a status code:
-<a href="#pdf-LUA_OK"><code>LUA_OK</code></a> for no errors in the thread
-(either the original error that stopped the thread or
-errors in closing methods),
-or an error status otherwise.
-In case of error,
-leaves the error object on the top of the stack.
+This function is deprecated;
+it is equivalent to <a href="#lua_closethread"><code>lua_closethread</code></a> with
+<code>from</code> being <code>NULL</code>.
@@ -5492,7 +5571,7 @@ otherwise, returns <code>NULL</code>.
<hr><h3><a name="lua_toclose"><code>lua_toclose</code></a></h3><p>
-<span class="apii">[-0, +0, <em>m</em>]</span>
+<span class="apii">[-0, +0, <em>v</em>]</span>
<pre>void lua_toclose (lua_State *L, int index);</pre>
<p>
@@ -5513,6 +5592,11 @@ unless previously deactivated by <a href="#lua_closeslot"><code>lua_closeslot</c
<p>
+This function raises an error if the value at the given slot
+neither has a <code>__close</code> metamethod nor is a false value.
+
+
+<p>
This function should not be called for an index
that is equal to or below an active to-be-closed slot.
@@ -5585,6 +5669,12 @@ after its last character (as in&nbsp;C),
but can contain other zeros in its body.
+<p>
+This function can raise memory errors only
+when converting a number to a string
+(as then it may create a new string).
+
+
@@ -6033,7 +6123,7 @@ the number of parameters of the function
</li>
<li><b><code>isvararg</code>: </b>
-true if the function is a vararg function
+true if the function is a variadic function
(always true for C&nbsp;functions).
</li>
@@ -6773,7 +6863,7 @@ Equivalent to the sequence
<pre>void luaL_buffsub (luaL_Buffer *B, int n);</pre>
<p>
-Removes <code>n</code> bytes from the the buffer <code>B</code>
+Removes <code>n</code> bytes from the buffer <code>B</code>
(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).
The buffer must have at least that many bytes.
@@ -6968,8 +7058,8 @@ It is defined as the following macro:
<pre>
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
</pre><p>
-It returns <a href="#pdf-LUA_OK"><code>LUA_OK</code></a> if there are no errors,
-or an error code in case of errors (see <a href="#4.4.1">&sect;4.4.1</a>).
+It returns&nbsp;0 (<a href="#pdf-LUA_OK"><code>LUA_OK</code></a>) if there are no errors,
+or 1 in case of errors.
@@ -6986,8 +7076,8 @@ It is defined as the following macro:
<pre>
(luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
</pre><p>
-It returns <a href="#pdf-LUA_OK"><code>LUA_OK</code></a> if there are no errors,
-or an error code in case of errors (see <a href="#4.4.1">&sect;4.4.1</a>).
+It returns&nbsp;0 (<a href="#pdf-LUA_OK"><code>LUA_OK</code></a>) if there are no errors,
+or 1 in case of errors.
@@ -7294,7 +7384,7 @@ with <code>tname</code> in the registry.
<p>
Creates a new Lua state.
It calls <a href="#lua_newstate"><code>lua_newstate</code></a> with an
-allocator based on the standard&nbsp;C allocation functions
+allocator based on the ISO&nbsp;C allocation functions
and then sets a warning function and a panic function (see <a href="#4.4">&sect;4.4</a>)
that print messages to the standard error output.
@@ -7685,9 +7775,7 @@ to start the traceback.
<hr><h3><a name="luaL_typeerror"><code>luaL_typeerror</code></a></h3><p>
<span class="apii">[-0, +0, <em>v</em>]</span>
-<pre>const char *luaL_typeerror (lua_State *L,
- int arg,
- const char *tname);</pre>
+<pre>int luaL_typeerror (lua_State *L, int arg, const char *tname);</pre>
<p>
Raises a type error for the argument <code>arg</code>
@@ -8708,6 +8796,8 @@ When you require a module <code>modname</code> and
This variable is only a reference to the real table;
assignments to this variable do not change the
table used by <a href="#pdf-require"><code>require</code></a>.
+The real table is stored in the C registry (see <a href="#4.3">&sect;4.3</a>),
+indexed by the key <a name="pdf-LUA_LOADED_TABLE"><code>LUA_LOADED_TABLE</code></a>, a string.
@@ -8745,7 +8835,7 @@ including if necessary a path and an extension.
<p>
-This function is not supported by Standard&nbsp;C.
+This functionality is not supported by ISO&nbsp;C.
As such, it is only available on some platforms
(Windows, Linux, Mac OS X, Solaris, BSD,
plus other Unix systems that support the <code>dlfcn</code> standard).
@@ -8799,6 +8889,8 @@ A table to store loaders for specific modules
This variable is only a reference to the real table;
assignments to this variable do not change the
table used by <a href="#pdf-require"><code>require</code></a>.
+The real table is stored in the C registry (see <a href="#4.3">&sect;4.3</a>),
+indexed by the key <a name="pdf-LUA_PRELOAD_TABLE"><code>LUA_PRELOAD_TABLE</code></a>, a string.
@@ -9311,7 +9403,7 @@ according to the format string <code>fmt</code> (see <a href="#6.4.2">&sect;6.4.
<p>
-Returns the size of a string resulting from <a href="#pdf-string.pack"><code>string.pack</code></a>
+Returns the length of a string resulting from <a href="#pdf-string.pack"><code>string.pack</code></a>
with the given format.
The format string cannot have the variable-length options
'<code>s</code>' or '<code>z</code>' (see <a href="#6.4.2">&sect;6.4.2</a>).
@@ -10091,9 +10183,9 @@ Returns the arc sine of <code>x</code> (in radians).
<p>
-
+
Returns the arc tangent of <code>y/x</code> (in radians),
-but uses the signs of both arguments to find the
+using the signs of both arguments to find the
quadrant of the result.
It also handles correctly the case of <code>x</code> being zero.
@@ -10953,7 +11045,7 @@ The default value for <code>code</code> is <b>true</b>.
<p>
If the optional second argument <code>close</code> is true,
-closes the Lua state before exiting.
+the function closes the Lua state before exiting (see <a href="#lua_close"><code>lua_close</code></a>).
@@ -11195,13 +11287,13 @@ The returned table can contain all the fields returned by <a href="#lua_getinfo"
with the string <code>what</code> describing which fields to fill in.
The default for <code>what</code> is to get all information available,
except the table of valid lines.
-If present,
-the option '<code>f</code>'
+The option '<code>f</code>'
adds a field named <code>func</code> with the function itself.
-If present,
-the option '<code>L</code>'
-adds a field named <code>activelines</code> with the table of
-valid lines.
+The option '<code>L</code>' adds a field named <code>activelines</code>
+with the table of valid lines,
+provided the function is a Lua function.
+If the function has no debug information,
+the table is empty.
<p>
@@ -11503,12 +11595,18 @@ The options are:
<li><b><code>-i</code>: </b> enter interactive mode after running <em>script</em>;</li>
<li><b><code>-l <em>mod</em></code>: </b> "require" <em>mod</em> and assign the
result to global <em>mod</em>;</li>
+<li><b><code>-l <em>g=mod</em></code>: </b> "require" <em>mod</em> and assign the
+ result to global <em>g</em>;</li>
<li><b><code>-v</code>: </b> print version information;</li>
<li><b><code>-E</code>: </b> ignore environment variables;</li>
<li><b><code>-W</code>: </b> turn warnings on;</li>
<li><b><code>--</code>: </b> stop handling options;</li>
<li><b><code>-</code>: </b> execute <code>stdin</code> as a file and stop handling options.</li>
</ul><p>
+(The form <code>-l <em>g=mod</em></code> was introduced in release&nbsp;5.4.4.)
+
+
+<p>
After handling its options, <code>lua</code> runs the given <em>script</em>.
When called without arguments,
<code>lua</code> behaves as <code>lua -v -i</code>
@@ -11532,6 +11630,10 @@ Lua does not consult any environment variables.
In particular,
the values of <a href="#pdf-package.path"><code>package.path</code></a> and <a href="#pdf-package.cpath"><code>package.cpath</code></a>
are set with the default paths defined in <code>luaconf.h</code>.
+To signal to the libraries that this option is on,
+the stand-alone interpreter sets the field
+<code>"LUA_NOENV"</code> in the registry to a true value.
+Other libraries may consult this field for the same purpose.
<p>
@@ -11582,7 +11684,7 @@ If there is a script,
the script is called with arguments
<code>arg[1]</code>, &middot;&middot;&middot;, <code>arg[#arg]</code>.
Like all chunks in Lua,
-the script is compiled as a vararg function.
+the script is compiled as a variadic function.
<p>
@@ -11946,13 +12048,12 @@ and LiteralString, see <a href="#3.1">&sect;3.1</a>.)
-
<P CLASS="footer">
Last update:
-Thu Jan 13 11:33:16 UTC 2022
+Thu Jun 13 22:15:52 UTC 2024
</P>
<!--
-Last change: revised for Lua 5.4.4
+Last change: revised for Lua 5.4.7
-->
</body></html>
diff --git a/3rdparty/lua/doc/osi-certified-72x60.png b/3rdparty/lua/doc/osi-certified-72x60.png
deleted file mode 100644
index 07df5f6ee7a..00000000000
--- a/3rdparty/lua/doc/osi-certified-72x60.png
+++ /dev/null
Binary files differ
diff --git a/3rdparty/lua/doc/readme.html b/3rdparty/lua/doc/readme.html
index 8afe38de923..3bcefadfe9a 100644
--- a/3rdparty/lua/doc/readme.html
+++ b/3rdparty/lua/doc/readme.html
@@ -29,7 +29,7 @@ tt, kbd, code {
<BODY>
<H1>
-<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
+<A HREF="https://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
Welcome to Lua 5.4
</H1>
@@ -49,29 +49,31 @@ Welcome to Lua 5.4
<P>
Lua is a powerful, efficient, lightweight, embeddable scripting language
developed by a
-<A HREF="http://www.lua.org/authors.html">team</A>
+<A HREF="https://www.lua.org/authors.html">team</A>
at
-<A HREF="http://www.puc-rio.br/">PUC-Rio</A>,
+<A HREF="https://www.puc-rio.br/">PUC-Rio</A>,
the Pontifical Catholic University of Rio de Janeiro in Brazil.
Lua is
<A HREF="#license">free software</A>
used in
-<A HREF="http://www.lua.org/uses.html">many products and projects</A>
+<A HREF="https://www.lua.org/uses.html">many products and projects</A>
around the world.
<P>
Lua's
-<A HREF="http://www.lua.org/">official web site</A>
+<A HREF="https://www.lua.org/">official website</A>
provides complete information
about Lua,
including
an
-<A HREF="http://www.lua.org/about.html">executive summary</A>
+<A HREF="https://www.lua.org/about.html">executive summary</A>,
+tips on
+<A HREF="https://www.lua.org/start.html">getting started</A>,
and
updated
-<A HREF="http://www.lua.org/docs.html">documentation</A>,
+<A HREF="https://www.lua.org/docs.html">documentation</A>,
especially the
-<A HREF="http://www.lua.org/manual/5.4/">reference manual</A>,
+<A HREF="https://www.lua.org/manual/5.4/">reference manual</A>,
which may differ slightly from the
<A HREF="contents.html">local copy</A>
distributed in this package.
@@ -79,7 +81,7 @@ distributed in this package.
<H2><A NAME="install">Installing Lua</A></H2>
<P>
Lua is distributed in
-<A HREF="http://www.lua.org/ftp/">source</A>
+<A HREF="https://www.lua.org/ftp/">source</A>
form.
You need to build it before using it.
Building Lua should be straightforward
@@ -88,7 +90,7 @@ Lua is implemented in pure ANSI C and compiles unmodified in all known
platforms that have an ANSI C compiler.
Lua also compiles unmodified as C++.
The instructions given below for building Lua are for Unix-like platforms,
-such as Linux and Mac OS X.
+such as Linux and macOS.
See also
<A HREF="#other">instructions for other systems</A>
and
@@ -97,10 +99,7 @@ and
<P>
If you don't have the time or the inclination to compile Lua yourself,
get a binary from
-<A HREF="http://lua-users.org/wiki/LuaBinaries">LuaBinaries</A>.
-Try also
-<A HREF="http://luadist.org/">LuaDist</A>,
-a multi-platform distribution of Lua that includes batteries.
+<A HREF="https://luabinaries.sourceforge.net">LuaBinaries</A>.
<H3>Building Lua</H3>
<P>
@@ -110,7 +109,7 @@ Here are the details.
<OL>
<LI>
Open a terminal window and move to
-the top-level directory, which is named <TT>lua-5.4.4</TT>.
+the top-level directory, which is named <TT>lua-5.4.7</TT>.
The <TT>Makefile</TT> there controls both the build process and the installation process.
<P>
<LI>
@@ -121,7 +120,7 @@ The <TT>Makefile</TT> there controls both the build process and the installation
The platforms currently supported are:
<P>
<P CLASS="display">
- guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris
+ guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris
</P>
<P>
If your platform is listed, just do "<KBD>make xxx</KBD>", where xxx
@@ -214,8 +213,8 @@ then try "<KBD>make linux-readline MYLIBS=-ltermcap</KBD>".
record the changes you've made.
<P>
- On the other hand, if you need to customize some Lua features, you'll need
- to edit <TT>src/luaconf.h</TT> before building and installing Lua.
+ On the other hand, if you need to customize some Lua features,
+ edit <TT>src/luaconf.h</TT> before building and installing Lua.
The edited file will be the one installed, and
it will be used by any Lua clients that you build, to ensure consistency.
Further customization is available to experts by editing the Lua sources.
@@ -244,7 +243,7 @@ compiler:
</DL>
<P>
- To use Lua as a library in your own programs, you'll need to know how to
+ To use Lua as a library in your own programs, you need to know how to
create and use libraries with your compiler. Moreover, to dynamically load
C libraries for Lua, you'll need to know how to create dynamic libraries
and you'll need to make sure that the Lua API functions are accessible to
@@ -287,11 +286,11 @@ lists the
<H2><A NAME="license">License</A></H2>
<P>
-<A HREF="http://www.opensource.org/docs/definition.php">
-<IMG SRC="osi-certified-72x60.png" ALIGN="right" ALT="[osi certified]" STYLE="padding-left: 30px ;">
+<A HREF="https://opensource.org/osd">
+<IMG SRC="OSIApproved_100X125.png" ALIGN="right" ALT="[Open Source Initiative Approved License]" STYLE="padding-left: 1em" WIDTH=50>
</A>
Lua is free software distributed under the terms of the
-<A HREF="http://www.opensource.org/licenses/mit-license.html">MIT license</A>
+<A HREF="https://opensource.org/license/mit">MIT license</A>
reproduced below;
it may be used for any purpose, including commercial purposes,
at absolutely no cost without having to ask us.
@@ -299,11 +298,11 @@ at absolutely no cost without having to ask us.
The only requirement is that if you do use Lua,
then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation.
-For details, see
-<A HREF="http://www.lua.org/license.html">this</A>.
+For details, see the
+<A HREF="https://www.lua.org/license.html">license page</A>.
<BLOCKQUOTE STYLE="padding-bottom: 0em">
-Copyright &copy; 1994&ndash;2022 Lua.org, PUC-Rio.
+Copyright &copy; 1994&ndash;2024 Lua.org, PUC-Rio.
<P>
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -330,10 +329,10 @@ THE SOFTWARE.
<P CLASS="footer">
Last update:
-Mon Jan 3 09:54:18 UTC 2022
+Wed May 8 21:56:16 UTC 2024
</P>
<!--
-Last change: revised for Lua 5.4.4
+Last change: revised for Lua 5.4.7
-->
</BODY>
diff --git a/3rdparty/lua/src/Makefile b/3rdparty/lua/src/Makefile
index 1907381fef0..b7711963bcc 100644
--- a/3rdparty/lua/src/Makefile
+++ b/3rdparty/lua/src/Makefile
@@ -30,7 +30,7 @@ CMCFLAGS=
# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======
-PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris
+PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris
LUA_A= liblua.a
CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o
@@ -117,6 +117,9 @@ FreeBSD NetBSD OpenBSD freebsd:
generic: $(ALL)
+ios:
+ $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_IOS"
+
Linux linux: linux-noreadline
linux-noreadline:
diff --git a/3rdparty/lua/src/lapi.c b/3rdparty/lua/src/lapi.c
index 5ee65792d27..332e97d1695 100644
--- a/3rdparty/lua/src/lapi.c
+++ b/3rdparty/lua/src/lapi.c
@@ -60,27 +60,28 @@ const char lua_ident[] =
static TValue *index2value (lua_State *L, int idx) {
CallInfo *ci = L->ci;
if (idx > 0) {
- StkId o = ci->func + idx;
- api_check(L, idx <= L->ci->top - (ci->func + 1), "unacceptable index");
- if (o >= L->top) return &G(L)->nilvalue;
+ StkId o = ci->func.p + idx;
+ api_check(L, idx <= ci->top.p - (ci->func.p + 1), "unacceptable index");
+ if (o >= L->top.p) return &G(L)->nilvalue;
else return s2v(o);
}
else if (!ispseudo(idx)) { /* negative index */
- api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
- return s2v(L->top + idx);
+ api_check(L, idx != 0 && -idx <= L->top.p - (ci->func.p + 1),
+ "invalid index");
+ return s2v(L->top.p + idx);
}
else if (idx == LUA_REGISTRYINDEX)
return &G(L)->l_registry;
else { /* upvalues */
idx = LUA_REGISTRYINDEX - idx;
api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");
- if (ttisCclosure(s2v(ci->func))) { /* C closure? */
- CClosure *func = clCvalue(s2v(ci->func));
+ if (ttisCclosure(s2v(ci->func.p))) { /* C closure? */
+ CClosure *func = clCvalue(s2v(ci->func.p));
return (idx <= func->nupvalues) ? &func->upvalue[idx-1]
: &G(L)->nilvalue;
}
else { /* light C function or Lua function (through a hook)?) */
- api_check(L, ttislcf(s2v(ci->func)), "caller not a C function");
+ api_check(L, ttislcf(s2v(ci->func.p)), "caller not a C function");
return &G(L)->nilvalue; /* no upvalues */
}
}
@@ -94,14 +95,15 @@ static TValue *index2value (lua_State *L, int idx) {
l_sinline StkId index2stack (lua_State *L, int idx) {
CallInfo *ci = L->ci;
if (idx > 0) {
- StkId o = ci->func + idx;
- api_check(L, o < L->top, "invalid index");
+ StkId o = ci->func.p + idx;
+ api_check(L, o < L->top.p, "invalid index");
return o;
}
else { /* non-positive index */
- api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
+ api_check(L, idx != 0 && -idx <= L->top.p - (ci->func.p + 1),
+ "invalid index");
api_check(L, !ispseudo(idx), "invalid index");
- return L->top + idx;
+ return L->top.p + idx;
}
}
@@ -112,17 +114,12 @@ LUA_API int lua_checkstack (lua_State *L, int n) {
lua_lock(L);
ci = L->ci;
api_check(L, n >= 0, "negative 'n'");
- if (L->stack_last - L->top > n) /* stack large enough? */
+ if (L->stack_last.p - L->top.p > n) /* stack large enough? */
res = 1; /* yes; check is OK */
- else { /* no; need to grow stack */
- int inuse = cast_int(L->top - L->stack) + EXTRA_STACK;
- if (inuse > LUAI_MAXSTACK - n) /* can grow without overflow? */
- res = 0; /* no */
- else /* try to grow stack */
- res = luaD_growstack(L, n, 0);
- }
- if (res && ci->top < L->top + n)
- ci->top = L->top + n; /* adjust frame top */
+ else /* need to grow stack */
+ res = luaD_growstack(L, n, 0);
+ if (res && ci->top.p < L->top.p + n)
+ ci->top.p = L->top.p + n; /* adjust frame top */
lua_unlock(L);
return res;
}
@@ -134,11 +131,11 @@ LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
lua_lock(to);
api_checknelems(from, n);
api_check(from, G(from) == G(to), "moving among independent states");
- api_check(from, to->ci->top - to->top >= n, "stack overflow");
- from->top -= n;
+ api_check(from, to->ci->top.p - to->top.p >= n, "stack overflow");
+ from->top.p -= n;
for (i = 0; i < n; i++) {
- setobjs2s(to, to->top, from->top + i);
- to->top++; /* stack already checked by previous 'api_check' */
+ setobjs2s(to, to->top.p, from->top.p + i);
+ to->top.p++; /* stack already checked by previous 'api_check' */
}
lua_unlock(to);
}
@@ -172,12 +169,12 @@ LUA_API lua_Number lua_version (lua_State *L) {
LUA_API int lua_absindex (lua_State *L, int idx) {
return (idx > 0 || ispseudo(idx))
? idx
- : cast_int(L->top - L->ci->func) + idx;
+ : cast_int(L->top.p - L->ci->func.p) + idx;
}
LUA_API int lua_gettop (lua_State *L) {
- return cast_int(L->top - (L->ci->func + 1));
+ return cast_int(L->top.p - (L->ci->func.p + 1));
}
@@ -187,24 +184,24 @@ LUA_API void lua_settop (lua_State *L, int idx) {
ptrdiff_t diff; /* difference for new top */
lua_lock(L);
ci = L->ci;
- func = ci->func;
+ func = ci->func.p;
if (idx >= 0) {
- api_check(L, idx <= ci->top - (func + 1), "new top too large");
- diff = ((func + 1) + idx) - L->top;
+ api_check(L, idx <= ci->top.p - (func + 1), "new top too large");
+ diff = ((func + 1) + idx) - L->top.p;
for (; diff > 0; diff--)
- setnilvalue(s2v(L->top++)); /* clear new slots */
+ setnilvalue(s2v(L->top.p++)); /* clear new slots */
}
else {
- api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
+ api_check(L, -(idx+1) <= (L->top.p - (func + 1)), "invalid new top");
diff = idx + 1; /* will "subtract" index (as it is negative) */
}
- api_check(L, L->tbclist < L->top, "previous pop of an unclosed slot");
- newtop = L->top + diff;
- if (diff < 0 && L->tbclist >= newtop) {
+ api_check(L, L->tbclist.p < L->top.p, "previous pop of an unclosed slot");
+ newtop = L->top.p + diff;
+ if (diff < 0 && L->tbclist.p >= newtop) {
lua_assert(hastocloseCfunc(ci->nresults));
- luaF_close(L, newtop, CLOSEKTOP, 0);
+ newtop = luaF_close(L, newtop, CLOSEKTOP, 0);
}
- L->top = newtop; /* correct top only after closing any upvalue */
+ L->top.p = newtop; /* correct top only after closing any upvalue */
lua_unlock(L);
}
@@ -213,10 +210,9 @@ LUA_API void lua_closeslot (lua_State *L, int idx) {
StkId level;
lua_lock(L);
level = index2stack(L, idx);
- api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist == level,
+ api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist.p == level,
"no variable to close at given level");
- luaF_close(L, level, CLOSEKTOP, 0);
- level = index2stack(L, idx); /* stack may be moved */
+ level = luaF_close(L, level, CLOSEKTOP, 0);
setnilvalue(s2v(level));
lua_unlock(L);
}
@@ -245,7 +241,7 @@ l_sinline void reverse (lua_State *L, StkId from, StkId to) {
LUA_API void lua_rotate (lua_State *L, int idx, int n) {
StkId p, t, m;
lua_lock(L);
- t = L->top - 1; /* end of stack segment being rotated */
+ t = L->top.p - 1; /* end of stack segment being rotated */
p = index2stack(L, idx); /* start of segment */
api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'");
m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */
@@ -264,7 +260,7 @@ LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
api_check(L, isvalid(L, to), "invalid index");
setobj(L, to, fr);
if (isupvalue(toidx)) /* function upvalue? */
- luaC_barrier(L, clCvalue(s2v(L->ci->func)), fr);
+ luaC_barrier(L, clCvalue(s2v(L->ci->func.p)), fr);
/* LUA_REGISTRYINDEX does not need gc barrier
(collector revisits it before finishing collection) */
lua_unlock(L);
@@ -273,7 +269,7 @@ LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
LUA_API void lua_pushvalue (lua_State *L, int idx) {
lua_lock(L);
- setobj2s(L, L->top, index2value(L, idx));
+ setobj2s(L, L->top.p, index2value(L, idx));
api_incr_top(L);
lua_unlock(L);
}
@@ -342,12 +338,12 @@ LUA_API void lua_arith (lua_State *L, int op) {
api_checknelems(L, 2); /* all other operations expect two operands */
else { /* for unary operations, add fake 2nd operand */
api_checknelems(L, 1);
- setobjs2s(L, L->top, L->top - 1);
+ setobjs2s(L, L->top.p, L->top.p - 1);
api_incr_top(L);
}
/* first operand at top - 2, second at top - 1; result go to top - 2 */
- luaO_arith(L, op, s2v(L->top - 2), s2v(L->top - 1), L->top - 2);
- L->top--; /* remove second operand */
+ luaO_arith(L, op, s2v(L->top.p - 2), s2v(L->top.p - 1), L->top.p - 2);
+ L->top.p--; /* remove second operand */
lua_unlock(L);
}
@@ -373,7 +369,7 @@ LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {
- size_t sz = luaO_str2num(s, s2v(L->top));
+ size_t sz = luaO_str2num(s, s2v(L->top.p));
if (sz != 0)
api_incr_top(L);
return sz;
@@ -421,9 +417,9 @@ LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
o = index2value(L, idx); /* previous call may reallocate the stack */
}
if (len != NULL)
- *len = vslen(o);
+ *len = tsslen(tsvalue(o));
lua_unlock(L);
- return svalue(o);
+ return getstr(tsvalue(o));
}
@@ -500,7 +496,7 @@ LUA_API const void *lua_topointer (lua_State *L, int idx) {
LUA_API void lua_pushnil (lua_State *L) {
lua_lock(L);
- setnilvalue(s2v(L->top));
+ setnilvalue(s2v(L->top.p));
api_incr_top(L);
lua_unlock(L);
}
@@ -508,7 +504,7 @@ LUA_API void lua_pushnil (lua_State *L) {
LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
lua_lock(L);
- setfltvalue(s2v(L->top), n);
+ setfltvalue(s2v(L->top.p), n);
api_incr_top(L);
lua_unlock(L);
}
@@ -516,7 +512,7 @@ LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
lua_lock(L);
- setivalue(s2v(L->top), n);
+ setivalue(s2v(L->top.p), n);
api_incr_top(L);
lua_unlock(L);
}
@@ -531,7 +527,7 @@ LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
TString *ts;
lua_lock(L);
ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len);
- setsvalue2s(L, L->top, ts);
+ setsvalue2s(L, L->top.p, ts);
api_incr_top(L);
luaC_checkGC(L);
lua_unlock(L);
@@ -542,11 +538,11 @@ LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
LUA_API const char *lua_pushstring (lua_State *L, const char *s) {
lua_lock(L);
if (s == NULL)
- setnilvalue(s2v(L->top));
+ setnilvalue(s2v(L->top.p));
else {
TString *ts;
ts = luaS_new(L, s);
- setsvalue2s(L, L->top, ts);
+ setsvalue2s(L, L->top.p, ts);
s = getstr(ts); /* internal copy's address */
}
api_incr_top(L);
@@ -583,7 +579,7 @@ LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
lua_lock(L);
if (n == 0) {
- setfvalue(s2v(L->top), fn);
+ setfvalue(s2v(L->top.p), fn);
api_incr_top(L);
}
else {
@@ -592,13 +588,13 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
api_check(L, n <= MAXUPVAL, "upvalue index too large");
cl = luaF_newCclosure(L, n);
cl->f = fn;
- L->top -= n;
+ L->top.p -= n;
while (n--) {
- setobj2n(L, &cl->upvalue[n], s2v(L->top + n));
+ setobj2n(L, &cl->upvalue[n], s2v(L->top.p + n));
/* does not need barrier because closure is white */
lua_assert(iswhite(cl));
}
- setclCvalue(L, s2v(L->top), cl);
+ setclCvalue(L, s2v(L->top.p), cl);
api_incr_top(L);
luaC_checkGC(L);
}
@@ -609,9 +605,9 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
LUA_API void lua_pushboolean (lua_State *L, int b) {
lua_lock(L);
if (b)
- setbtvalue(s2v(L->top));
+ setbtvalue(s2v(L->top.p));
else
- setbfvalue(s2v(L->top));
+ setbfvalue(s2v(L->top.p));
api_incr_top(L);
lua_unlock(L);
}
@@ -619,7 +615,7 @@ LUA_API void lua_pushboolean (lua_State *L, int b) {
LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
lua_lock(L);
- setpvalue(s2v(L->top), p);
+ setpvalue(s2v(L->top.p), p);
api_incr_top(L);
lua_unlock(L);
}
@@ -627,7 +623,7 @@ LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
LUA_API int lua_pushthread (lua_State *L) {
lua_lock(L);
- setthvalue(L, s2v(L->top), L);
+ setthvalue(L, s2v(L->top.p), L);
api_incr_top(L);
lua_unlock(L);
return (G(L)->mainthread == L);
@@ -644,16 +640,16 @@ l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) {
const TValue *slot;
TString *str = luaS_new(L, k);
if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
- setobj2s(L, L->top, slot);
+ setobj2s(L, L->top.p, slot);
api_incr_top(L);
}
else {
- setsvalue2s(L, L->top, str);
+ setsvalue2s(L, L->top.p, str);
api_incr_top(L);
- luaV_finishget(L, t, s2v(L->top - 1), L->top - 1, slot);
+ luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot);
}
lua_unlock(L);
- return ttype(s2v(L->top - 1));
+ return ttype(s2v(L->top.p - 1));
}
@@ -680,13 +676,13 @@ LUA_API int lua_gettable (lua_State *L, int idx) {
TValue *t;
lua_lock(L);
t = index2value(L, idx);
- if (luaV_fastget(L, t, s2v(L->top - 1), slot, luaH_get)) {
- setobj2s(L, L->top - 1, slot);
+ if (luaV_fastget(L, t, s2v(L->top.p - 1), slot, luaH_get)) {
+ setobj2s(L, L->top.p - 1, slot);
}
else
- luaV_finishget(L, t, s2v(L->top - 1), L->top - 1, slot);
+ luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot);
lua_unlock(L);
- return ttype(s2v(L->top - 1));
+ return ttype(s2v(L->top.p - 1));
}
@@ -702,27 +698,27 @@ LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {
lua_lock(L);
t = index2value(L, idx);
if (luaV_fastgeti(L, t, n, slot)) {
- setobj2s(L, L->top, slot);
+ setobj2s(L, L->top.p, slot);
}
else {
TValue aux;
setivalue(&aux, n);
- luaV_finishget(L, t, &aux, L->top, slot);
+ luaV_finishget(L, t, &aux, L->top.p, slot);
}
api_incr_top(L);
lua_unlock(L);
- return ttype(s2v(L->top - 1));
+ return ttype(s2v(L->top.p - 1));
}
l_sinline int finishrawget (lua_State *L, const TValue *val) {
if (isempty(val)) /* avoid copying empty items to the stack */
- setnilvalue(s2v(L->top));
+ setnilvalue(s2v(L->top.p));
else
- setobj2s(L, L->top, val);
+ setobj2s(L, L->top.p, val);
api_incr_top(L);
lua_unlock(L);
- return ttype(s2v(L->top - 1));
+ return ttype(s2v(L->top.p - 1));
}
@@ -739,8 +735,8 @@ LUA_API int lua_rawget (lua_State *L, int idx) {
lua_lock(L);
api_checknelems(L, 1);
t = gettable(L, idx);
- val = luaH_get(t, s2v(L->top - 1));
- L->top--; /* remove key */
+ val = luaH_get(t, s2v(L->top.p - 1));
+ L->top.p--; /* remove key */
return finishrawget(L, val);
}
@@ -767,7 +763,7 @@ LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
Table *t;
lua_lock(L);
t = luaH_new(L);
- sethvalue2s(L, L->top, t);
+ sethvalue2s(L, L->top.p, t);
api_incr_top(L);
if (narray > 0 || nrec > 0)
luaH_resize(L, t, narray, nrec);
@@ -794,7 +790,7 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) {
break;
}
if (mt != NULL) {
- sethvalue2s(L, L->top, mt);
+ sethvalue2s(L, L->top.p, mt);
api_incr_top(L);
res = 1;
}
@@ -810,12 +806,12 @@ LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) {
o = index2value(L, idx);
api_check(L, ttisfulluserdata(o), "full userdata expected");
if (n <= 0 || n > uvalue(o)->nuvalue) {
- setnilvalue(s2v(L->top));
+ setnilvalue(s2v(L->top.p));
t = LUA_TNONE;
}
else {
- setobj2s(L, L->top, &uvalue(o)->uv[n - 1].uv);
- t = ttype(s2v(L->top));
+ setobj2s(L, L->top.p, &uvalue(o)->uv[n - 1].uv);
+ t = ttype(s2v(L->top.p));
}
api_incr_top(L);
lua_unlock(L);
@@ -835,14 +831,14 @@ static void auxsetstr (lua_State *L, const TValue *t, const char *k) {
TString *str = luaS_new(L, k);
api_checknelems(L, 1);
if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
- luaV_finishfastset(L, t, slot, s2v(L->top - 1));
- L->top--; /* pop value */
+ luaV_finishfastset(L, t, slot, s2v(L->top.p - 1));
+ L->top.p--; /* pop value */
}
else {
- setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */
+ setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */
api_incr_top(L);
- luaV_finishset(L, t, s2v(L->top - 1), s2v(L->top - 2), slot);
- L->top -= 2; /* pop value and key */
+ luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), slot);
+ L->top.p -= 2; /* pop value and key */
}
lua_unlock(L); /* lock done by caller */
}
@@ -862,12 +858,12 @@ LUA_API void lua_settable (lua_State *L, int idx) {
lua_lock(L);
api_checknelems(L, 2);
t = index2value(L, idx);
- if (luaV_fastget(L, t, s2v(L->top - 2), slot, luaH_get)) {
- luaV_finishfastset(L, t, slot, s2v(L->top - 1));
+ if (luaV_fastget(L, t, s2v(L->top.p - 2), slot, luaH_get)) {
+ luaV_finishfastset(L, t, slot, s2v(L->top.p - 1));
}
else
- luaV_finishset(L, t, s2v(L->top - 2), s2v(L->top - 1), slot);
- L->top -= 2; /* pop index and value */
+ luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), slot);
+ L->top.p -= 2; /* pop index and value */
lua_unlock(L);
}
@@ -885,14 +881,14 @@ LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {
api_checknelems(L, 1);
t = index2value(L, idx);
if (luaV_fastgeti(L, t, n, slot)) {
- luaV_finishfastset(L, t, slot, s2v(L->top - 1));
+ luaV_finishfastset(L, t, slot, s2v(L->top.p - 1));
}
else {
TValue aux;
setivalue(&aux, n);
- luaV_finishset(L, t, &aux, s2v(L->top - 1), slot);
+ luaV_finishset(L, t, &aux, s2v(L->top.p - 1), slot);
}
- L->top--; /* pop value */
+ L->top.p--; /* pop value */
lua_unlock(L);
}
@@ -902,16 +898,16 @@ static void aux_rawset (lua_State *L, int idx, TValue *key, int n) {
lua_lock(L);
api_checknelems(L, n);
t = gettable(L, idx);
- luaH_set(L, t, key, s2v(L->top - 1));
+ luaH_set(L, t, key, s2v(L->top.p - 1));
invalidateTMcache(t);
- luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
- L->top -= n;
+ luaC_barrierback(L, obj2gco(t), s2v(L->top.p - 1));
+ L->top.p -= n;
lua_unlock(L);
}
LUA_API void lua_rawset (lua_State *L, int idx) {
- aux_rawset(L, idx, s2v(L->top - 2), 2);
+ aux_rawset(L, idx, s2v(L->top.p - 2), 2);
}
@@ -927,9 +923,9 @@ LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
lua_lock(L);
api_checknelems(L, 1);
t = gettable(L, idx);
- luaH_setint(L, t, n, s2v(L->top - 1));
- luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
- L->top--;
+ luaH_setint(L, t, n, s2v(L->top.p - 1));
+ luaC_barrierback(L, obj2gco(t), s2v(L->top.p - 1));
+ L->top.p--;
lua_unlock(L);
}
@@ -940,11 +936,11 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) {
lua_lock(L);
api_checknelems(L, 1);
obj = index2value(L, objindex);
- if (ttisnil(s2v(L->top - 1)))
+ if (ttisnil(s2v(L->top.p - 1)))
mt = NULL;
else {
- api_check(L, ttistable(s2v(L->top - 1)), "table expected");
- mt = hvalue(s2v(L->top - 1));
+ api_check(L, ttistable(s2v(L->top.p - 1)), "table expected");
+ mt = hvalue(s2v(L->top.p - 1));
}
switch (ttype(obj)) {
case LUA_TTABLE: {
@@ -968,7 +964,7 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) {
break;
}
}
- L->top--;
+ L->top.p--;
lua_unlock(L);
return 1;
}
@@ -984,11 +980,11 @@ LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) {
if (!(cast_uint(n) - 1u < cast_uint(uvalue(o)->nuvalue)))
res = 0; /* 'n' not in [1, uvalue(o)->nuvalue] */
else {
- setobj(L, &uvalue(o)->uv[n - 1].uv, s2v(L->top - 1));
- luaC_barrierback(L, gcvalue(o), s2v(L->top - 1));
+ setobj(L, &uvalue(o)->uv[n - 1].uv, s2v(L->top.p - 1));
+ luaC_barrierback(L, gcvalue(o), s2v(L->top.p - 1));
res = 1;
}
- L->top--;
+ L->top.p--;
lua_unlock(L);
return res;
}
@@ -1000,7 +996,8 @@ LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) {
#define checkresults(L,na,nr) \
- api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \
+ api_check(L, (nr) == LUA_MULTRET \
+ || (L->ci->top.p - L->top.p >= (nr) - (na)), \
"results from function overflow current stack size")
@@ -1013,7 +1010,7 @@ LUA_API void lua_callk (lua_State *L, int nargs, int nresults,
api_checknelems(L, nargs+1);
api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
checkresults(L, nargs, nresults);
- func = L->top - (nargs+1);
+ func = L->top.p - (nargs+1);
if (k != NULL && yieldable(L)) { /* need to prepare continuation? */
L->ci->u.c.k = k; /* save continuation */
L->ci->u.c.ctx = ctx; /* save context */
@@ -1061,7 +1058,7 @@ LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,
api_check(L, ttisfunction(s2v(o)), "error handler must be a function");
func = savestack(L, o);
}
- c.func = L->top - (nargs+1); /* function to be called */
+ c.func = L->top.p - (nargs+1); /* function to be called */
if (k == NULL || !yieldable(L)) { /* no continuation or no yieldable? */
c.nresults = nresults; /* do a 'conventional' protected call */
status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);
@@ -1096,12 +1093,12 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
luaZ_init(L, &z, reader, data);
status = luaD_protectedparser(L, &z, chunkname, mode);
if (status == LUA_OK) { /* no errors? */
- LClosure *f = clLvalue(s2v(L->top - 1)); /* get newly created function */
+ LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */
if (f->nupvalues >= 1) { /* does it have an upvalue? */
/* get global table from registry */
const TValue *gt = getGtable(L);
/* set global table as 1st upvalue of 'f' (may be LUA_ENV) */
- setobj(L, f->upvals[0]->v, gt);
+ setobj(L, f->upvals[0]->v.p, gt);
luaC_barrier(L, f->upvals[0], gt);
}
}
@@ -1115,7 +1112,7 @@ LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) {
TValue *o;
lua_lock(L);
api_checknelems(L, 1);
- o = s2v(L->top - 1);
+ o = s2v(L->top.p - 1);
if (isLfunction(o))
status = luaU_dump(L, getproto(o), writer, data, strip);
else
@@ -1241,7 +1238,7 @@ LUA_API int lua_gc (lua_State *L, int what, ...) {
LUA_API int lua_error (lua_State *L) {
TValue *errobj;
lua_lock(L);
- errobj = s2v(L->top - 1);
+ errobj = s2v(L->top.p - 1);
api_checknelems(L, 1);
/* error object is the memory error message? */
if (ttisshrstring(errobj) && eqshrstr(tsvalue(errobj), G(L)->memerrmsg))
@@ -1259,12 +1256,12 @@ LUA_API int lua_next (lua_State *L, int idx) {
lua_lock(L);
api_checknelems(L, 1);
t = gettable(L, idx);
- more = luaH_next(L, t, L->top - 1);
+ more = luaH_next(L, t, L->top.p - 1);
if (more) {
api_incr_top(L);
}
else /* no more elements */
- L->top -= 1; /* remove key */
+ L->top.p -= 1; /* remove key */
lua_unlock(L);
return more;
}
@@ -1276,7 +1273,7 @@ LUA_API void lua_toclose (lua_State *L, int idx) {
lua_lock(L);
o = index2stack(L, idx);
nresults = L->ci->nresults;
- api_check(L, L->tbclist < o, "given index below or equal a marked one");
+ api_check(L, L->tbclist.p < o, "given index below or equal a marked one");
luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */
if (!hastocloseCfunc(nresults)) /* function not marked yet? */
L->ci->nresults = codeNresults(nresults); /* mark it */
@@ -1291,7 +1288,7 @@ LUA_API void lua_concat (lua_State *L, int n) {
if (n > 0)
luaV_concat(L, n);
else { /* nothing to concatenate */
- setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); /* push empty string */
+ setsvalue2s(L, L->top.p, luaS_newlstr(L, "", 0)); /* push empty string */
api_incr_top(L);
}
luaC_checkGC(L);
@@ -1303,7 +1300,7 @@ LUA_API void lua_len (lua_State *L, int idx) {
TValue *t;
lua_lock(L);
t = index2value(L, idx);
- luaV_objlen(L, L->top, t);
+ luaV_objlen(L, L->top.p, t);
api_incr_top(L);
lua_unlock(L);
}
@@ -1348,7 +1345,7 @@ LUA_API void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue) {
lua_lock(L);
api_check(L, 0 <= nuvalue && nuvalue < USHRT_MAX, "invalid value");
u = luaS_newudata(L, size, nuvalue);
- setuvalue(L, s2v(L->top), u);
+ setuvalue(L, s2v(L->top.p), u);
api_incr_top(L);
luaC_checkGC(L);
lua_unlock(L);
@@ -1374,7 +1371,7 @@ static const char *aux_upvalue (TValue *fi, int n, TValue **val,
Proto *p = f->p;
if (!(cast_uint(n) - 1u < cast_uint(p->sizeupvalues)))
return NULL; /* 'n' not in [1, p->sizeupvalues] */
- *val = f->upvals[n-1]->v;
+ *val = f->upvals[n-1]->v.p;
if (owner) *owner = obj2gco(f->upvals[n - 1]);
name = p->upvalues[n-1].name;
return (name == NULL) ? "(no name)" : getstr(name);
@@ -1390,7 +1387,7 @@ LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
lua_lock(L);
name = aux_upvalue(index2value(L, funcindex), n, &val, NULL);
if (name) {
- setobj2s(L, L->top, val);
+ setobj2s(L, L->top.p, val);
api_incr_top(L);
}
lua_unlock(L);
@@ -1408,8 +1405,8 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
api_checknelems(L, 1);
name = aux_upvalue(fi, n, &val, &owner);
if (name) {
- L->top--;
- setobj(L, val, s2v(L->top));
+ L->top.p--;
+ setobj(L, val, s2v(L->top.p));
luaC_barrier(L, owner, val);
}
lua_unlock(L);
diff --git a/3rdparty/lua/src/lapi.h b/3rdparty/lua/src/lapi.h
index 9e99cc44824..a742427cdc7 100644
--- a/3rdparty/lua/src/lapi.h
+++ b/3rdparty/lua/src/lapi.h
@@ -12,23 +12,26 @@
#include "lstate.h"
-/* Increments 'L->top', checking for stack overflows */
-#define api_incr_top(L) {L->top++; api_check(L, L->top <= L->ci->top, \
- "stack overflow");}
+/* Increments 'L->top.p', checking for stack overflows */
+#define api_incr_top(L) {L->top.p++; \
+ api_check(L, L->top.p <= L->ci->top.p, \
+ "stack overflow");}
/*
** If a call returns too many multiple returns, the callee may not have
** stack space to accommodate all results. In this case, this macro
-** increases its stack space ('L->ci->top').
+** increases its stack space ('L->ci->top.p').
*/
#define adjustresults(L,nres) \
- { if ((nres) <= LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; }
+ { if ((nres) <= LUA_MULTRET && L->ci->top.p < L->top.p) \
+ L->ci->top.p = L->top.p; }
/* Ensure the stack has at least 'n' elements */
-#define api_checknelems(L,n) api_check(L, (n) < (L->top - L->ci->func), \
- "not enough elements in the stack")
+#define api_checknelems(L,n) \
+ api_check(L, (n) < (L->top.p - L->ci->func.p), \
+ "not enough elements in the stack")
/*
diff --git a/3rdparty/lua/src/lauxlib.c b/3rdparty/lua/src/lauxlib.c
index 8ed1da1122f..923105ed317 100644
--- a/3rdparty/lua/src/lauxlib.c
+++ b/3rdparty/lua/src/lauxlib.c
@@ -80,6 +80,7 @@ static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {
int top = lua_gettop(L);
lua_getinfo(L, "f", ar); /* push function */
lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
+ luaL_checkstack(L, 6, "not enough stack"); /* slots for 'findfield' */
if (findfield(L, top + 1, 2)) {
const char *name = lua_tostring(L, -1);
if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */
@@ -249,11 +250,13 @@ LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {
return 1;
}
else {
+ const char *msg;
luaL_pushfail(L);
+ msg = (en != 0) ? strerror(en) : "(no extra info)";
if (fname)
- lua_pushfstring(L, "%s: %s", fname, strerror(en));
+ lua_pushfstring(L, "%s: %s", fname, msg);
else
- lua_pushstring(L, strerror(en));
+ lua_pushstring(L, msg);
lua_pushinteger(L, en);
return 3;
}
@@ -526,13 +529,14 @@ static void newbox (lua_State *L) {
/*
** Compute new size for buffer 'B', enough to accommodate extra 'sz'
-** bytes.
+** bytes. (The test for "not big enough" also gets the case when the
+** computation of 'newsize' overflows.)
*/
static size_t newbuffsize (luaL_Buffer *B, size_t sz) {
- size_t newsize = B->size * 2; /* double buffer size */
+ size_t newsize = (B->size / 2) * 3; /* buffer size * 1.5 */
if (l_unlikely(MAX_SIZET - sz < B->n)) /* overflow in (B->n + sz)? */
return luaL_error(B->L, "buffer too large");
- if (newsize < B->n + sz) /* double is not big enough? */
+ if (newsize < B->n + sz) /* not big enough? */
newsize = B->n + sz;
return newsize;
}
@@ -611,7 +615,7 @@ LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) {
** box (if existent) is not on the top of the stack. So, instead of
** calling 'luaL_addlstring', it replicates the code using -2 as the
** last argument to 'prepbuffsize', signaling that the box is (or will
-** be) bellow the string being added to the buffer. (Box creation can
+** be) below the string being added to the buffer. (Box creation can
** trigger an emergency GC, so we should not remove the string from the
** stack before we have the space guaranteed.)
*/
@@ -731,25 +735,29 @@ static const char *getF (lua_State *L, void *ud, size_t *size) {
static int errfile (lua_State *L, const char *what, int fnameindex) {
- const char *serr = strerror(errno);
+ int err = errno;
const char *filename = lua_tostring(L, fnameindex) + 1;
- lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);
+ if (err != 0)
+ lua_pushfstring(L, "cannot %s %s: %s", what, filename, strerror(err));
+ else
+ lua_pushfstring(L, "cannot %s %s", what, filename);
lua_remove(L, fnameindex);
return LUA_ERRFILE;
}
-static int skipBOM (LoadF *lf) {
- const char *p = "\xEF\xBB\xBF"; /* UTF-8 BOM mark */
- int c;
- lf->n = 0;
- do {
- c = getc(lf->f);
- if (c == EOF || c != *(const unsigned char *)p++) return c;
- lf->buff[lf->n++] = c; /* to be read by the parser */
- } while (*p != '\0');
- lf->n = 0; /* prefix matched; discard it */
- return getc(lf->f); /* return next character */
+/*
+** Skip an optional BOM at the start of a stream. If there is an
+** incomplete BOM (the first character is correct but the rest is
+** not), returns the first character anyway to force an error
+** (as no chunk can start with 0xEF).
+*/
+static int skipBOM (FILE *f) {
+ int c = getc(f); /* read first character */
+ if (c == 0xEF && getc(f) == 0xBB && getc(f) == 0xBF) /* correct BOM? */
+ return getc(f); /* ignore BOM and return next char */
+ else /* no (valid) BOM */
+ return c; /* return first character */
}
@@ -760,13 +768,13 @@ static int skipBOM (LoadF *lf) {
** first "valid" character of the file (after the optional BOM and
** a first-line comment).
*/
-static int skipcomment (LoadF *lf, int *cp) {
- int c = *cp = skipBOM(lf);
+static int skipcomment (FILE *f, int *cp) {
+ int c = *cp = skipBOM(f);
if (c == '#') { /* first line is a comment (Unix exec. file)? */
do { /* skip first line */
- c = getc(lf->f);
+ c = getc(f);
} while (c != EOF && c != '\n');
- *cp = getc(lf->f); /* skip end-of-line, if present */
+ *cp = getc(f); /* next character after comment, if present */
return 1; /* there was a comment */
}
else return 0; /* no comment */
@@ -785,18 +793,25 @@ LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,
}
else {
lua_pushfstring(L, "@%s", filename);
+ errno = 0;
lf.f = fopen(filename, "r");
if (lf.f == NULL) return errfile(L, "open", fnameindex);
}
- if (skipcomment(&lf, &c)) /* read initial portion */
- lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */
- if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */
- lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
- if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
- skipcomment(&lf, &c); /* re-read initial portion */
+ lf.n = 0;
+ if (skipcomment(lf.f, &c)) /* read initial portion */
+ lf.buff[lf.n++] = '\n'; /* add newline to correct line numbers */
+ if (c == LUA_SIGNATURE[0]) { /* binary file? */
+ lf.n = 0; /* remove possible newline */
+ if (filename) { /* "real" file? */
+ errno = 0;
+ lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
+ if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
+ skipcomment(lf.f, &c); /* re-read initial portion */
+ }
}
if (c != EOF)
lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */
+ errno = 0;
status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode);
readstatus = ferror(lf.f);
if (filename) fclose(lf.f); /* close file (even in case of errors) */
@@ -927,7 +942,7 @@ LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {
LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
luaL_checkstack(L, nup, "too many upvalues");
for (; l->name != NULL; l++) { /* fill the table with given functions */
- if (l->func == NULL) /* place holder? */
+ if (l->func == NULL) /* placeholder? */
lua_pushboolean(L, 0);
else {
int i;
@@ -1019,9 +1034,14 @@ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
}
+/*
+** Standard panic funcion just prints an error message. The test
+** with 'lua_type' avoids possible memory errors in 'lua_tostring'.
+*/
static int panic (lua_State *L) {
- const char *msg = lua_tostring(L, -1);
- if (msg == NULL) msg = "error object is not a string";
+ const char *msg = (lua_type(L, -1) == LUA_TSTRING)
+ ? lua_tostring(L, -1)
+ : "error object is not a string";
lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
msg);
return 0; /* return to Lua to abort */
diff --git a/3rdparty/lua/src/lcode.c b/3rdparty/lua/src/lcode.c
index 06425a1db80..87616140ebe 100644
--- a/3rdparty/lua/src/lcode.c
+++ b/3rdparty/lua/src/lcode.c
@@ -415,7 +415,7 @@ int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
/*
** Format and emit an 'iAsBx' instruction.
*/
-int luaK_codeAsBx (FuncState *fs, OpCode o, int a, int bc) {
+static int codeAsBx (FuncState *fs, OpCode o, int a, int bc) {
unsigned int b = bc + OFFSET_sBx;
lua_assert(getOpMode(o) == iAsBx);
lua_assert(a <= MAXARG_A && b <= MAXARG_Bx);
@@ -671,7 +671,7 @@ static int fitsBx (lua_Integer i) {
void luaK_int (FuncState *fs, int reg, lua_Integer i) {
if (fitsBx(i))
- luaK_codeAsBx(fs, OP_LOADI, reg, cast_int(i));
+ codeAsBx(fs, OP_LOADI, reg, cast_int(i));
else
luaK_codek(fs, reg, luaK_intK(fs, i));
}
@@ -680,7 +680,7 @@ void luaK_int (FuncState *fs, int reg, lua_Integer i) {
static void luaK_float (FuncState *fs, int reg, lua_Number f) {
lua_Integer fi;
if (luaV_flttointeger(f, &fi, F2Ieq) && fitsBx(fi))
- luaK_codeAsBx(fs, OP_LOADF, reg, cast_int(fi));
+ codeAsBx(fs, OP_LOADF, reg, cast_int(fi));
else
luaK_codek(fs, reg, luaK_numberK(fs, f));
}
@@ -776,7 +776,8 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) {
break;
}
case VLOCAL: { /* already in a register */
- e->u.info = e->u.var.ridx;
+ int temp = e->u.var.ridx;
+ e->u.info = temp; /* (can't do a direct assignment; values overlap) */
e->k = VNONRELOC; /* becomes a non-relocatable value */
break;
}
@@ -1025,7 +1026,7 @@ static int luaK_exp2K (FuncState *fs, expdesc *e) {
** in the range of R/K indices).
** Returns 1 iff expression is K.
*/
-int luaK_exp2RK (FuncState *fs, expdesc *e) {
+static int exp2RK (FuncState *fs, expdesc *e) {
if (luaK_exp2K(fs, e))
return 1;
else { /* not a constant in the right range: put it in a register */
@@ -1037,7 +1038,7 @@ int luaK_exp2RK (FuncState *fs, expdesc *e) {
static void codeABRK (FuncState *fs, OpCode o, int a, int b,
expdesc *ec) {
- int k = luaK_exp2RK(fs, ec);
+ int k = exp2RK(fs, ec);
luaK_codeABCk(fs, o, a, b, ec->u.info, k);
}
@@ -1215,7 +1216,7 @@ static void codenot (FuncState *fs, expdesc *e) {
/*
-** Check whether expression 'e' is a small literal string
+** Check whether expression 'e' is a short literal string
*/
static int isKstr (FuncState *fs, expdesc *e) {
return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B &&
@@ -1225,7 +1226,7 @@ static int isKstr (FuncState *fs, expdesc *e) {
/*
** Check whether expression 'e' is a literal integer.
*/
-int luaK_isKint (expdesc *e) {
+static int isKint (expdesc *e) {
return (e->k == VKINT && !hasjumps(e));
}
@@ -1235,7 +1236,7 @@ int luaK_isKint (expdesc *e) {
** proper range to fit in register C
*/
static int isCint (expdesc *e) {
- return luaK_isKint(e) && (l_castS2U(e->u.ival) <= l_castS2U(MAXARG_C));
+ return isKint(e) && (l_castS2U(e->u.ival) <= l_castS2U(MAXARG_C));
}
@@ -1244,7 +1245,7 @@ static int isCint (expdesc *e) {
** proper range to fit in register sC
*/
static int isSCint (expdesc *e) {
- return luaK_isKint(e) && fitsC(e->u.ival);
+ return isKint(e) && fitsC(e->u.ival);
}
@@ -1283,15 +1284,17 @@ void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non 'Kstr'? */
luaK_exp2anyreg(fs, t); /* put it in a register */
if (t->k == VUPVAL) {
- t->u.ind.t = t->u.info; /* upvalue index */
- t->u.ind.idx = k->u.info; /* literal string */
+ int temp = t->u.info; /* upvalue index */
+ lua_assert(isKstr(fs, k));
+ t->u.ind.t = temp; /* (can't do a direct assignment; values overlap) */
+ t->u.ind.idx = k->u.info; /* literal short string */
t->k = VINDEXUP;
}
else {
/* register index of the table */
t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info;
if (isKstr(fs, k)) {
- t->u.ind.idx = k->u.info; /* literal string */
+ t->u.ind.idx = k->u.info; /* literal short string */
t->k = VINDEXSTR;
}
else if (isCint(k)) {
@@ -1352,6 +1355,35 @@ static int constfolding (FuncState *fs, int op, expdesc *e1,
/*
+** Convert a BinOpr to an OpCode (ORDER OPR - ORDER OP)
+*/
+l_sinline OpCode binopr2op (BinOpr opr, BinOpr baser, OpCode base) {
+ lua_assert(baser <= opr &&
+ ((baser == OPR_ADD && opr <= OPR_SHR) ||
+ (baser == OPR_LT && opr <= OPR_LE)));
+ return cast(OpCode, (cast_int(opr) - cast_int(baser)) + cast_int(base));
+}
+
+
+/*
+** Convert a UnOpr to an OpCode (ORDER OPR - ORDER OP)
+*/
+l_sinline OpCode unopr2op (UnOpr opr) {
+ return cast(OpCode, (cast_int(opr) - cast_int(OPR_MINUS)) +
+ cast_int(OP_UNM));
+}
+
+
+/*
+** Convert a BinOpr to a tag method (ORDER OPR - ORDER TM)
+*/
+l_sinline TMS binopr2TM (BinOpr opr) {
+ lua_assert(OPR_ADD <= opr && opr <= OPR_SHR);
+ return cast(TMS, (cast_int(opr) - cast_int(OPR_ADD)) + cast_int(TM_ADD));
+}
+
+
+/*
** Emit code for unary expressions that "produce values"
** (everything but 'not').
** Expression to produce final result will be encoded in 'e'.
@@ -1389,12 +1421,15 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
** Emit code for binary expressions that "produce values" over
** two registers.
*/
-static void codebinexpval (FuncState *fs, OpCode op,
+static void codebinexpval (FuncState *fs, BinOpr opr,
expdesc *e1, expdesc *e2, int line) {
- int v2 = luaK_exp2anyreg(fs, e2); /* both operands are in registers */
+ OpCode op = binopr2op(opr, OPR_ADD, OP_ADD);
+ int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */
+ /* 'e1' must be already in a register or it is a constant */
+ lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
+ e1->k == VNONRELOC || e1->k == VRELOC);
lua_assert(OP_ADD <= op && op <= OP_SHR);
- finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN,
- cast(TMS, (op - OP_ADD) + TM_ADD));
+ finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, binopr2TM(opr));
}
@@ -1410,12 +1445,24 @@ static void codebini (FuncState *fs, OpCode op,
}
+/*
+** Code binary operators with K operand.
+*/
+static void codebinK (FuncState *fs, BinOpr opr,
+ expdesc *e1, expdesc *e2, int flip, int line) {
+ TMS event = binopr2TM(opr);
+ int v2 = e2->u.info; /* K index */
+ OpCode op = binopr2op(opr, OPR_ADD, OP_ADDK);
+ finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event);
+}
+
+
/* Try to code a binary operator negating its second operand.
** For the metamethod, 2nd operand must keep its original value.
*/
static int finishbinexpneg (FuncState *fs, expdesc *e1, expdesc *e2,
OpCode op, int line, TMS event) {
- if (!luaK_isKint(e2))
+ if (!isKint(e2))
return 0; /* not an integer constant */
else {
lua_Integer i2 = e2->u.ival;
@@ -1438,23 +1485,26 @@ static void swapexps (expdesc *e1, expdesc *e2) {
/*
+** Code binary operators with no constant operand.
+*/
+static void codebinNoK (FuncState *fs, BinOpr opr,
+ expdesc *e1, expdesc *e2, int flip, int line) {
+ if (flip)
+ swapexps(e1, e2); /* back to original order */
+ codebinexpval(fs, opr, e1, e2, line); /* use standard operators */
+}
+
+
+/*
** Code arithmetic operators ('+', '-', ...). If second operand is a
** constant in the proper range, use variant opcodes with K operands.
*/
static void codearith (FuncState *fs, BinOpr opr,
expdesc *e1, expdesc *e2, int flip, int line) {
- TMS event = cast(TMS, opr + TM_ADD);
- if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) { /* K operand? */
- int v2 = e2->u.info; /* K index */
- OpCode op = cast(OpCode, opr + OP_ADDK);
- finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event);
- }
- else { /* 'e2' is neither an immediate nor a K operand */
- OpCode op = cast(OpCode, opr + OP_ADD);
- if (flip)
- swapexps(e1, e2); /* back to original order */
- codebinexpval(fs, op, e1, e2, line); /* use standard operators */
- }
+ if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) /* K operand? */
+ codebinK(fs, opr, e1, e2, flip, line);
+ else /* 'e2' is neither an immediate nor a K operand */
+ codebinNoK(fs, opr, e1, e2, flip, line);
}
@@ -1471,35 +1521,27 @@ static void codecommutative (FuncState *fs, BinOpr op,
flip = 1;
}
if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */
- codebini(fs, cast(OpCode, OP_ADDI), e1, e2, flip, line, TM_ADD);
+ codebini(fs, OP_ADDI, e1, e2, flip, line, TM_ADD);
else
codearith(fs, op, e1, e2, flip, line);
}
/*
-** Code bitwise operations; they are all associative, so the function
+** Code bitwise operations; they are all commutative, so the function
** tries to put an integer constant as the 2nd operand (a K operand).
*/
static void codebitwise (FuncState *fs, BinOpr opr,
expdesc *e1, expdesc *e2, int line) {
int flip = 0;
- int v2;
- OpCode op;
- if (e1->k == VKINT && luaK_exp2RK(fs, e1)) {
+ if (e1->k == VKINT) {
swapexps(e1, e2); /* 'e2' will be the constant operand */
flip = 1;
}
- else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */
- op = cast(OpCode, opr + OP_ADD);
- codebinexpval(fs, op, e1, e2, line); /* all-register opcodes */
- return;
- }
- v2 = e2->u.info; /* index in K array */
- op = cast(OpCode, opr + OP_ADDK);
- lua_assert(ttisinteger(&fs->f->k[v2]));
- finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK,
- cast(TMS, opr + TM_ADD));
+ if (e2->k == VKINT && luaK_exp2K(fs, e2)) /* K operand? */
+ codebinK(fs, opr, e1, e2, flip, line);
+ else /* no constants */
+ codebinNoK(fs, opr, e1, e2, flip, line);
}
@@ -1507,25 +1549,27 @@ static void codebitwise (FuncState *fs, BinOpr opr,
** Emit code for order comparisons. When using an immediate operand,
** 'isfloat' tells whether the original value was a float.
*/
-static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
+static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
int r1, r2;
int im;
int isfloat = 0;
+ OpCode op;
if (isSCnumber(e2, &im, &isfloat)) {
/* use immediate operand */
r1 = luaK_exp2anyreg(fs, e1);
r2 = im;
- op = cast(OpCode, (op - OP_LT) + OP_LTI);
+ op = binopr2op(opr, OPR_LT, OP_LTI);
}
else if (isSCnumber(e1, &im, &isfloat)) {
/* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
r1 = luaK_exp2anyreg(fs, e2);
r2 = im;
- op = (op == OP_LT) ? OP_GTI : OP_GEI;
+ op = binopr2op(opr, OPR_LT, OP_GTI);
}
else { /* regular case, compare two registers */
r1 = luaK_exp2anyreg(fs, e1);
r2 = luaK_exp2anyreg(fs, e2);
+ op = binopr2op(opr, OPR_LT, OP_LT);
}
freeexps(fs, e1, e2);
e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
@@ -1551,7 +1595,7 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
op = OP_EQI;
r2 = im; /* immediate operand */
}
- else if (luaK_exp2RK(fs, e2)) { /* 1st expression is constant? */
+ else if (exp2RK(fs, e2)) { /* 2nd expression is constant? */
op = OP_EQK;
r2 = e2->u.info; /* constant index */
}
@@ -1568,16 +1612,16 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
/*
** Apply prefix operation 'op' to expression 'e'.
*/
-void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
+void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) {
static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};
luaK_dischargevars(fs, e);
- switch (op) {
+ switch (opr) {
case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */
- if (constfolding(fs, op + LUA_OPUNM, e, &ef))
+ if (constfolding(fs, opr + LUA_OPUNM, e, &ef))
break;
/* else */ /* FALLTHROUGH */
case OPR_LEN:
- codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line);
+ codeunexpval(fs, unopr2op(opr), e, line);
break;
case OPR_NOT: codenot(fs, e); break;
default: lua_assert(0);
@@ -1611,12 +1655,13 @@ void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
case OPR_SHL: case OPR_SHR: {
if (!tonumeral(v, NULL))
luaK_exp2anyreg(fs, v);
- /* else keep numeral, which may be folded with 2nd operand */
+ /* else keep numeral, which may be folded or used as an immediate
+ operand */
break;
}
case OPR_EQ: case OPR_NE: {
if (!tonumeral(v, NULL))
- luaK_exp2RK(fs, v);
+ exp2RK(fs, v);
/* else keep numeral, which may be an immediate operand */
break;
}
@@ -1706,30 +1751,27 @@ void luaK_posfix (FuncState *fs, BinOpr opr,
/* coded as (r1 >> -I) */;
}
else /* regular case (two registers) */
- codebinexpval(fs, OP_SHL, e1, e2, line);
+ codebinexpval(fs, opr, e1, e2, line);
break;
}
case OPR_SHR: {
if (isSCint(e2))
codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR); /* r1 >> I */
else /* regular case (two registers) */
- codebinexpval(fs, OP_SHR, e1, e2, line);
+ codebinexpval(fs, opr, e1, e2, line);
break;
}
case OPR_EQ: case OPR_NE: {
codeeq(fs, opr, e1, e2);
break;
}
- case OPR_LT: case OPR_LE: {
- OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
- codeorder(fs, op, e1, e2);
- break;
- }
case OPR_GT: case OPR_GE: {
/* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */
- OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ);
swapexps(e1, e2);
- codeorder(fs, op, e1, e2);
+ opr = cast(BinOpr, (opr - OPR_GT) + OPR_LT);
+ } /* FALLTHROUGH */
+ case OPR_LT: case OPR_LE: {
+ codeorder(fs, opr, e1, e2);
break;
}
default: lua_assert(0);
diff --git a/3rdparty/lua/src/lcode.h b/3rdparty/lua/src/lcode.h
index 32658244526..0b971fc4359 100644
--- a/3rdparty/lua/src/lcode.h
+++ b/3rdparty/lua/src/lcode.h
@@ -61,10 +61,8 @@ typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
LUAI_FUNC int luaK_code (FuncState *fs, Instruction i);
LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
-LUAI_FUNC int luaK_codeAsBx (FuncState *fs, OpCode o, int A, int Bx);
LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A,
int B, int C, int k);
-LUAI_FUNC int luaK_isKint (expdesc *e);
LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v);
LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
@@ -76,7 +74,6 @@ LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);
LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);
LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);
-LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);
LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
diff --git a/3rdparty/lua/src/lcorolib.c b/3rdparty/lua/src/lcorolib.c
index 785a1e81aa0..c64adf08a8e 100644
--- a/3rdparty/lua/src/lcorolib.c
+++ b/3rdparty/lua/src/lcorolib.c
@@ -76,7 +76,7 @@ static int luaB_auxwrap (lua_State *L) {
if (l_unlikely(r < 0)) { /* error? */
int stat = lua_status(co);
if (stat != LUA_OK && stat != LUA_YIELD) { /* error in the coroutine? */
- stat = lua_resetthread(co); /* close its tbc variables */
+ stat = lua_closethread(co, L); /* close its tbc variables */
lua_assert(stat != LUA_OK);
lua_xmove(co, L, 1); /* move error message to the caller */
}
@@ -172,7 +172,7 @@ static int luaB_close (lua_State *L) {
int status = auxstatus(L, co);
switch (status) {
case COS_DEAD: case COS_YIELD: {
- status = lua_resetthread(co);
+ status = lua_closethread(co, L);
if (status == LUA_OK) {
lua_pushboolean(L, 1);
return 1;
diff --git a/3rdparty/lua/src/ldebug.c b/3rdparty/lua/src/ldebug.c
index a716d95e22f..591b3528a77 100644
--- a/3rdparty/lua/src/ldebug.c
+++ b/3rdparty/lua/src/ldebug.c
@@ -31,7 +31,7 @@
-#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_VCCL)
+#define LuaClosure(f) ((f) != NULL && (f)->c.tt == LUA_VLCL)
static const char *funcnamefromcall (lua_State *L, CallInfo *ci,
@@ -182,10 +182,10 @@ static const char *upvalname (const Proto *p, int uv) {
static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
- if (clLvalue(s2v(ci->func))->p->is_vararg) {
+ if (clLvalue(s2v(ci->func.p))->p->is_vararg) {
int nextra = ci->u.l.nextraargs;
if (n >= -nextra) { /* 'n' is negative */
- *pos = ci->func - nextra - (n + 1);
+ *pos = ci->func.p - nextra - (n + 1);
return "(vararg)"; /* generic name for any vararg */
}
}
@@ -194,7 +194,7 @@ static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) {
- StkId base = ci->func + 1;
+ StkId base = ci->func.p + 1;
const char *name = NULL;
if (isLua(ci)) {
if (n < 0) /* access to vararg values? */
@@ -203,7 +203,7 @@ const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) {
name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci));
}
if (name == NULL) { /* no 'standard' name? */
- StkId limit = (ci == L->ci) ? L->top : ci->next->func;
+ StkId limit = (ci == L->ci) ? L->top.p : ci->next->func.p;
if (limit - base >= n && n > 0) { /* is 'n' inside 'ci' stack? */
/* generic name for any valid slot */
name = isLua(ci) ? "(temporary)" : "(C temporary)";
@@ -221,16 +221,16 @@ LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {
const char *name;
lua_lock(L);
if (ar == NULL) { /* information about non-active function? */
- if (!isLfunction(s2v(L->top - 1))) /* not a Lua function? */
+ if (!isLfunction(s2v(L->top.p - 1))) /* not a Lua function? */
name = NULL;
else /* consider live variables at function start (parameters) */
- name = luaF_getlocalname(clLvalue(s2v(L->top - 1))->p, n, 0);
+ name = luaF_getlocalname(clLvalue(s2v(L->top.p - 1))->p, n, 0);
}
else { /* active function; get information through 'ar' */
StkId pos = NULL; /* to avoid warnings */
name = luaG_findlocal(L, ar->i_ci, n, &pos);
if (name) {
- setobjs2s(L, L->top, pos);
+ setobjs2s(L, L->top.p, pos);
api_incr_top(L);
}
}
@@ -245,8 +245,8 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
lua_lock(L);
name = luaG_findlocal(L, ar->i_ci, n, &pos);
if (name) {
- setobjs2s(L, pos, L->top - 1);
- L->top--; /* pop value */
+ setobjs2s(L, pos, L->top.p - 1);
+ L->top.p--; /* pop value */
}
lua_unlock(L);
return name;
@@ -254,7 +254,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
static void funcinfo (lua_Debug *ar, Closure *cl) {
- if (noLuaClosure(cl)) {
+ if (!LuaClosure(cl)) {
ar->source = "=[C]";
ar->srclen = LL("=[C]");
ar->linedefined = -1;
@@ -288,29 +288,31 @@ static int nextline (const Proto *p, int currentline, int pc) {
static void collectvalidlines (lua_State *L, Closure *f) {
- if (noLuaClosure(f)) {
- setnilvalue(s2v(L->top));
+ if (!LuaClosure(f)) {
+ setnilvalue(s2v(L->top.p));
api_incr_top(L);
}
else {
- int i;
- TValue v;
const Proto *p = f->l.p;
int currentline = p->linedefined;
Table *t = luaH_new(L); /* new table to store active lines */
- sethvalue2s(L, L->top, t); /* push it on stack */
+ sethvalue2s(L, L->top.p, t); /* push it on stack */
api_incr_top(L);
- setbtvalue(&v); /* boolean 'true' to be the value of all indices */
- if (!p->is_vararg) /* regular function? */
- i = 0; /* consider all instructions */
- else { /* vararg function */
- lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP);
- currentline = nextline(p, currentline, 0);
- i = 1; /* skip first instruction (OP_VARARGPREP) */
- }
- for (; i < p->sizelineinfo; i++) { /* for each instruction */
- currentline = nextline(p, currentline, i); /* get its line */
- luaH_setint(L, t, currentline, &v); /* table[line] = true */
+ if (p->lineinfo != NULL) { /* proto with debug information? */
+ int i;
+ TValue v;
+ setbtvalue(&v); /* boolean 'true' to be the value of all indices */
+ if (!p->is_vararg) /* regular function? */
+ i = 0; /* consider all instructions */
+ else { /* vararg function */
+ lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP);
+ currentline = nextline(p, currentline, 0);
+ i = 1; /* skip first instruction (OP_VARARGPREP) */
+ }
+ for (; i < p->sizelineinfo; i++) { /* for each instruction */
+ currentline = nextline(p, currentline, i); /* get its line */
+ luaH_setint(L, t, currentline, &v); /* table[line] = true */
+ }
}
}
}
@@ -339,7 +341,7 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
}
case 'u': {
ar->nups = (f == NULL) ? 0 : f->c.nupvalues;
- if (noLuaClosure(f)) {
+ if (!LuaClosure(f)) {
ar->isvararg = 1;
ar->nparams = 0;
}
@@ -388,20 +390,20 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
lua_lock(L);
if (*what == '>') {
ci = NULL;
- func = s2v(L->top - 1);
+ func = s2v(L->top.p - 1);
api_check(L, ttisfunction(func), "function expected");
what++; /* skip the '>' */
- L->top--; /* pop function */
+ L->top.p--; /* pop function */
}
else {
ci = ar->i_ci;
- func = s2v(ci->func);
+ func = s2v(ci->func.p);
lua_assert(ttisfunction(func));
}
cl = ttisclosure(func) ? clvalue(func) : NULL;
status = auxgetinfo(L, what, ar, cl, ci);
if (strchr(what, 'f')) {
- setobj2s(L, L->top, func);
+ setobj2s(L, L->top.p, func);
api_incr_top(L);
}
if (strchr(what, 'L'))
@@ -417,40 +419,6 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
** =======================================================
*/
-static const char *getobjname (const Proto *p, int lastpc, int reg,
- const char **name);
-
-
-/*
-** Find a "name" for the constant 'c'.
-*/
-static void kname (const Proto *p, int c, const char **name) {
- TValue *kvalue = &p->k[c];
- *name = (ttisstring(kvalue)) ? svalue(kvalue) : "?";
-}
-
-
-/*
-** Find a "name" for the register 'c'.
-*/
-static void rname (const Proto *p, int pc, int c, const char **name) {
- const char *what = getobjname(p, pc, c, name); /* search for 'c' */
- if (!(what && *what == 'c')) /* did not find a constant name? */
- *name = "?";
-}
-
-
-/*
-** Find a "name" for a 'C' value in an RK instruction.
-*/
-static void rkname (const Proto *p, int pc, Instruction i, const char **name) {
- int c = GETARG_C(i); /* key index */
- if (GETARG_k(i)) /* is 'c' a constant? */
- kname(p, c, name);
- else /* 'c' is a register */
- rname(p, pc, c, name);
-}
-
static int filterpc (int pc, int jmptarget) {
if (pc < jmptarget) /* is code conditional (inside a jump)? */
@@ -509,28 +477,29 @@ static int findsetreg (const Proto *p, int lastpc, int reg) {
/*
-** Check whether table being indexed by instruction 'i' is the
-** environment '_ENV'
+** Find a "name" for the constant 'c'.
*/
-static const char *gxf (const Proto *p, int pc, Instruction i, int isup) {
- int t = GETARG_B(i); /* table index */
- const char *name; /* name of indexed variable */
- if (isup) /* is an upvalue? */
- name = upvalname(p, t);
- else
- getobjname(p, pc, t, &name);
- return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field";
+static const char *kname (const Proto *p, int index, const char **name) {
+ TValue *kvalue = &p->k[index];
+ if (ttisstring(kvalue)) {
+ *name = getstr(tsvalue(kvalue));
+ return "constant";
+ }
+ else {
+ *name = "?";
+ return NULL;
+ }
}
-static const char *getobjname (const Proto *p, int lastpc, int reg,
- const char **name) {
- int pc;
- *name = luaF_getlocalname(p, reg + 1, lastpc);
+static const char *basicgetobjname (const Proto *p, int *ppc, int reg,
+ const char **name) {
+ int pc = *ppc;
+ *name = luaF_getlocalname(p, reg + 1, pc);
if (*name) /* is a local? */
return "local";
/* else try symbolic execution */
- pc = findsetreg(p, lastpc, reg);
+ *ppc = pc = findsetreg(p, pc, reg);
if (pc != -1) { /* could find instruction? */
Instruction i = p->code[pc];
OpCode op = GET_OPCODE(i);
@@ -538,18 +507,80 @@ static const char *getobjname (const Proto *p, int lastpc, int reg,
case OP_MOVE: {
int b = GETARG_B(i); /* move from 'b' to 'a' */
if (b < GETARG_A(i))
- return getobjname(p, pc, b, name); /* get name for 'b' */
+ return basicgetobjname(p, ppc, b, name); /* get name for 'b' */
break;
}
+ case OP_GETUPVAL: {
+ *name = upvalname(p, GETARG_B(i));
+ return "upvalue";
+ }
+ case OP_LOADK: return kname(p, GETARG_Bx(i), name);
+ case OP_LOADKX: return kname(p, GETARG_Ax(p->code[pc + 1]), name);
+ default: break;
+ }
+ }
+ return NULL; /* could not find reasonable name */
+}
+
+
+/*
+** Find a "name" for the register 'c'.
+*/
+static void rname (const Proto *p, int pc, int c, const char **name) {
+ const char *what = basicgetobjname(p, &pc, c, name); /* search for 'c' */
+ if (!(what && *what == 'c')) /* did not find a constant name? */
+ *name = "?";
+}
+
+
+/*
+** Find a "name" for a 'C' value in an RK instruction.
+*/
+static void rkname (const Proto *p, int pc, Instruction i, const char **name) {
+ int c = GETARG_C(i); /* key index */
+ if (GETARG_k(i)) /* is 'c' a constant? */
+ kname(p, c, name);
+ else /* 'c' is a register */
+ rname(p, pc, c, name);
+}
+
+
+/*
+** Check whether table being indexed by instruction 'i' is the
+** environment '_ENV'
+*/
+static const char *isEnv (const Proto *p, int pc, Instruction i, int isup) {
+ int t = GETARG_B(i); /* table index */
+ const char *name; /* name of indexed variable */
+ if (isup) /* is 't' an upvalue? */
+ name = upvalname(p, t);
+ else /* 't' is a register */
+ basicgetobjname(p, &pc, t, &name);
+ return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field";
+}
+
+
+/*
+** Extend 'basicgetobjname' to handle table accesses
+*/
+static const char *getobjname (const Proto *p, int lastpc, int reg,
+ const char **name) {
+ const char *kind = basicgetobjname(p, &lastpc, reg, name);
+ if (kind != NULL)
+ return kind;
+ else if (lastpc != -1) { /* could find instruction? */
+ Instruction i = p->code[lastpc];
+ OpCode op = GET_OPCODE(i);
+ switch (op) {
case OP_GETTABUP: {
int k = GETARG_C(i); /* key index */
kname(p, k, name);
- return gxf(p, pc, i, 1);
+ return isEnv(p, lastpc, i, 1);
}
case OP_GETTABLE: {
int k = GETARG_C(i); /* key index */
- rname(p, pc, k, name);
- return gxf(p, pc, i, 0);
+ rname(p, lastpc, k, name);
+ return isEnv(p, lastpc, i, 0);
}
case OP_GETI: {
*name = "integer index";
@@ -558,24 +589,10 @@ static const char *getobjname (const Proto *p, int lastpc, int reg,
case OP_GETFIELD: {
int k = GETARG_C(i); /* key index */
kname(p, k, name);
- return gxf(p, pc, i, 0);
- }
- case OP_GETUPVAL: {
- *name = upvalname(p, GETARG_B(i));
- return "upvalue";
- }
- case OP_LOADK:
- case OP_LOADKX: {
- int b = (op == OP_LOADK) ? GETARG_Bx(i)
- : GETARG_Ax(p->code[pc + 1]);
- if (ttisstring(&p->k[b])) {
- *name = svalue(&p->k[b]);
- return "constant";
- }
- break;
+ return isEnv(p, lastpc, i, 0);
}
case OP_SELF: {
- rkname(p, pc, i, name);
+ rkname(p, lastpc, i, name);
return "method";
}
default: break; /* go through to return NULL */
@@ -627,7 +644,7 @@ static const char *funcnamefromcode (lua_State *L, const Proto *p,
default:
return NULL; /* cannot find a reasonable name */
}
- *name = getstr(G(L)->tmname[tm]) + 2;
+ *name = getshrstr(G(L)->tmname[tm]) + 2;
return "metamethod";
}
@@ -656,18 +673,19 @@ static const char *funcnamefromcall (lua_State *L, CallInfo *ci,
/*
-** Check whether pointer 'o' points to some value in the stack
-** frame of the current function. Because 'o' may not point to a
-** value in this stack, we cannot compare it with the region
-** boundaries (undefined behaviour in ISO C).
+** Check whether pointer 'o' points to some value in the stack frame of
+** the current function and, if so, returns its index. Because 'o' may
+** not point to a value in this stack, we cannot compare it with the
+** region boundaries (undefined behavior in ISO C).
*/
-static int isinstack (CallInfo *ci, const TValue *o) {
- StkId pos;
- for (pos = ci->func + 1; pos < ci->top; pos++) {
- if (o == s2v(pos))
- return 1;
+static int instack (CallInfo *ci, const TValue *o) {
+ int pos;
+ StkId base = ci->func.p + 1;
+ for (pos = 0; base + pos < ci->top.p; pos++) {
+ if (o == s2v(base + pos))
+ return pos;
}
- return 0; /* not found */
+ return -1; /* not found */
}
@@ -681,7 +699,7 @@ static const char *getupvalname (CallInfo *ci, const TValue *o,
LClosure *c = ci_func(ci);
int i;
for (i = 0; i < c->nupvalues; i++) {
- if (c->upvals[i]->v == o) {
+ if (c->upvals[i]->v.p == o) {
*name = upvalname(c->p, i);
return "upvalue";
}
@@ -708,9 +726,11 @@ static const char *varinfo (lua_State *L, const TValue *o) {
const char *kind = NULL;
if (isLua(ci)) {
kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
- if (!kind && isinstack(ci, o)) /* no? try a register */
- kind = getobjname(ci_func(ci)->p, currentpc(ci),
- cast_int(cast(StkId, o) - (ci->func + 1)), &name);
+ if (!kind) { /* not an upvalue? */
+ int reg = instack(ci, o); /* try a register */
+ if (reg >= 0) /* is 'o' a register? */
+ kind = getobjname(ci_func(ci)->p, currentpc(ci), reg, &name);
+ }
}
return formatvarinfo(L, kind, name);
}
@@ -807,10 +827,10 @@ l_noret luaG_errormsg (lua_State *L) {
if (L->errfunc != 0) { /* is there an error handling function? */
StkId errfunc = restorestack(L, L->errfunc);
lua_assert(ttisfunction(s2v(errfunc)));
- setobjs2s(L, L->top, L->top - 1); /* move argument */
- setobjs2s(L, L->top - 1, errfunc); /* push function */
- L->top++; /* assume EXTRA_STACK */
- luaD_callnoyield(L, L->top - 2, 1); /* call it */
+ setobjs2s(L, L->top.p, L->top.p - 1); /* move argument */
+ setobjs2s(L, L->top.p - 1, errfunc); /* push function */
+ L->top.p++; /* assume EXTRA_STACK */
+ luaD_callnoyield(L, L->top.p - 2, 1); /* call it */
}
luaD_throw(L, LUA_ERRRUN);
}
@@ -824,8 +844,11 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
va_start(argp, fmt);
msg = luaO_pushvfstring(L, fmt, argp); /* format message */
va_end(argp);
- if (isLua(ci)) /* if Lua function, add source:line information */
+ if (isLua(ci)) { /* if Lua function, add source:line information */
luaG_addinfo(L, msg, ci_func(ci)->p->source, getcurrentline(ci));
+ setobjs2s(L, L->top.p - 2, L->top.p - 1); /* remove 'msg' */
+ L->top.p--;
+ }
luaG_errormsg(L);
}
@@ -842,7 +865,7 @@ static int changedline (const Proto *p, int oldpc, int newpc) {
if (p->lineinfo == NULL) /* no debug information? */
return 0;
if (newpc - oldpc < MAXIWTHABS / 2) { /* not too far apart? */
- int delta = 0; /* line diference */
+ int delta = 0; /* line difference */
int pc = oldpc;
for (;;) {
int lineinfo = p->lineinfo[++pc];
@@ -860,6 +883,28 @@ static int changedline (const Proto *p, int oldpc, int newpc) {
/*
+** Traces Lua calls. If code is running the first instruction of a function,
+** and function is not vararg, and it is not coming from an yield,
+** calls 'luaD_hookcall'. (Vararg functions will call 'luaD_hookcall'
+** after adjusting its variable arguments; otherwise, they could call
+** a line/count hook before the call hook. Functions coming from
+** an yield already called 'luaD_hookcall' before yielding.)
+*/
+int luaG_tracecall (lua_State *L) {
+ CallInfo *ci = L->ci;
+ Proto *p = ci_func(ci)->p;
+ ci->u.l.trap = 1; /* ensure hooks will be checked */
+ if (ci->u.l.savedpc == p->code) { /* first instruction (not resuming)? */
+ if (p->is_vararg)
+ return 0; /* hooks will start at VARARGPREP instruction */
+ else if (!(ci->callstatus & CIST_HOOKYIELD)) /* not yieded? */
+ luaD_hookcall(L, ci); /* check 'call' hook */
+ }
+ return 1; /* keep 'trap' on */
+}
+
+
+/*
** Traces the execution of a Lua function. Called before the execution
** of each opcode, when debug is on. 'L->oldpc' stores the last
** instruction traced, to detect line changes. When entering a new
@@ -869,7 +914,7 @@ static int changedline (const Proto *p, int oldpc, int newpc) {
** invalid; if so, use zero as a valid value. (A wrong but valid 'oldpc'
** at most causes an extra call to a line hook.)
** This function is not "Protected" when called, so it should correct
-** 'L->top' before calling anything that can run the GC.
+** 'L->top.p' before calling anything that can run the GC.
*/
int luaG_traceexec (lua_State *L, const Instruction *pc) {
CallInfo *ci = L->ci;
@@ -882,17 +927,17 @@ int luaG_traceexec (lua_State *L, const Instruction *pc) {
}
pc++; /* reference is always next instruction */
ci->u.l.savedpc = pc; /* save 'pc' */
- counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT));
+ counthook = (mask & LUA_MASKCOUNT) && (--L->hookcount == 0);
if (counthook)
resethookcount(L); /* reset count */
else if (!(mask & LUA_MASKLINE))
return 1; /* no line hook and count != 0; nothing to be done now */
- if (ci->callstatus & CIST_HOOKYIELD) { /* called hook last time? */
+ if (ci->callstatus & CIST_HOOKYIELD) { /* hook yielded last time? */
ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */
return 1; /* do not call hook again (VM yielded, so it did not move) */
}
if (!isIT(*(ci->u.l.savedpc - 1))) /* top not being used? */
- L->top = ci->top; /* correct top */
+ L->top.p = ci->top.p; /* correct top */
if (counthook)
luaD_hook(L, LUA_HOOKCOUNT, -1, 0, 0); /* call count hook */
if (mask & LUA_MASKLINE) {
@@ -909,7 +954,6 @@ int luaG_traceexec (lua_State *L, const Instruction *pc) {
if (L->status == LUA_YIELD) { /* did hook yield? */
if (counthook)
L->hookcount = 1; /* undo decrement to zero */
- ci->u.l.savedpc--; /* undo increment (resume will increment it again) */
ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */
luaD_throw(L, LUA_YIELD);
}
diff --git a/3rdparty/lua/src/ldebug.h b/3rdparty/lua/src/ldebug.h
index 974960e99da..2bfce3cb5e7 100644
--- a/3rdparty/lua/src/ldebug.h
+++ b/3rdparty/lua/src/ldebug.h
@@ -15,7 +15,7 @@
/* Active Lua function (given call info) */
-#define ci_func(ci) (clLvalue(s2v((ci)->func)))
+#define ci_func(ci) (clLvalue(s2v((ci)->func.p)))
#define resethookcount(L) (L->hookcount = L->basehookcount)
@@ -58,6 +58,7 @@ LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg,
TString *src, int line);
LUAI_FUNC l_noret luaG_errormsg (lua_State *L);
LUAI_FUNC int luaG_traceexec (lua_State *L, const Instruction *pc);
+LUAI_FUNC int luaG_tracecall (lua_State *L);
#endif
diff --git a/3rdparty/lua/src/ldo.c b/3rdparty/lua/src/ldo.c
index a48e35f9dba..ea0529507e0 100644
--- a/3rdparty/lua/src/ldo.c
+++ b/3rdparty/lua/src/ldo.c
@@ -104,11 +104,11 @@ void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
}
default: {
lua_assert(errorstatus(errcode)); /* real error */
- setobjs2s(L, oldtop, L->top - 1); /* error message on current top */
+ setobjs2s(L, oldtop, L->top.p - 1); /* error message on current top */
break;
}
}
- L->top = oldtop + 1;
+ L->top.p = oldtop + 1;
}
@@ -121,7 +121,7 @@ l_noret luaD_throw (lua_State *L, int errcode) {
global_State *g = G(L);
errcode = luaE_resetthread(L, errcode); /* close all upvalues */
if (g->mainthread->errorJmp) { /* main thread has a handler? */
- setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */
+ setobjs2s(L, g->mainthread->top.p++, L->top.p - 1); /* copy error obj. */
luaD_throw(g->mainthread, errcode); /* re-throw in main thread */
}
else { /* no handler at all; abort */
@@ -157,16 +157,38 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
** Stack reallocation
** ===================================================================
*/
-static void correctstack (lua_State *L, StkId oldstack, StkId newstack) {
+
+
+/*
+** Change all pointers to the stack into offsets.
+*/
+static void relstack (lua_State *L) {
+ CallInfo *ci;
+ UpVal *up;
+ L->top.offset = savestack(L, L->top.p);
+ L->tbclist.offset = savestack(L, L->tbclist.p);
+ for (up = L->openupval; up != NULL; up = up->u.open.next)
+ up->v.offset = savestack(L, uplevel(up));
+ for (ci = L->ci; ci != NULL; ci = ci->previous) {
+ ci->top.offset = savestack(L, ci->top.p);
+ ci->func.offset = savestack(L, ci->func.p);
+ }
+}
+
+
+/*
+** Change back all offsets into pointers.
+*/
+static void correctstack (lua_State *L) {
CallInfo *ci;
UpVal *up;
- L->top = (L->top - oldstack) + newstack;
- L->tbclist = (L->tbclist - oldstack) + newstack;
+ L->top.p = restorestack(L, L->top.offset);
+ L->tbclist.p = restorestack(L, L->tbclist.offset);
for (up = L->openupval; up != NULL; up = up->u.open.next)
- up->v = s2v((uplevel(up) - oldstack) + newstack);
+ up->v.p = s2v(restorestack(L, up->v.offset));
for (ci = L->ci; ci != NULL; ci = ci->previous) {
- ci->top = (ci->top - oldstack) + newstack;
- ci->func = (ci->func - oldstack) + newstack;
+ ci->top.p = restorestack(L, ci->top.offset);
+ ci->func.p = restorestack(L, ci->func.offset);
if (isLua(ci))
ci->u.l.trap = 1; /* signal to update 'trap' in 'luaV_execute' */
}
@@ -176,44 +198,45 @@ static void correctstack (lua_State *L, StkId oldstack, StkId newstack) {
/* some space for error handling */
#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200)
-
/*
-** Reallocate the stack to a new size, correcting all pointers into
-** it. (There are pointers to a stack from its upvalues, from its list
-** of call infos, plus a few individual pointers.) The reallocation is
-** done in two steps (allocation + free) because the correction must be
-** done while both addresses (the old stack and the new one) are valid.
-** (In ISO C, any pointer use after the pointer has been deallocated is
-** undefined behavior.)
+** Reallocate the stack to a new size, correcting all pointers into it.
+** In ISO C, any pointer use after the pointer has been deallocated is
+** undefined behavior. So, before the reallocation, all pointers are
+** changed to offsets, and after the reallocation they are changed back
+** to pointers. As during the reallocation the pointers are invalid, the
+** reallocation cannot run emergency collections.
+**
** In case of allocation error, raise an error or return false according
** to 'raiseerror'.
*/
int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) {
int oldsize = stacksize(L);
int i;
- StkId newstack = luaM_reallocvector(L, NULL, 0,
- newsize + EXTRA_STACK, StackValue);
+ StkId newstack;
+ int oldgcstop = G(L)->gcstopem;
lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE);
+ relstack(L); /* change pointers to offsets */
+ G(L)->gcstopem = 1; /* stop emergency collection */
+ newstack = luaM_reallocvector(L, L->stack.p, oldsize + EXTRA_STACK,
+ newsize + EXTRA_STACK, StackValue);
+ G(L)->gcstopem = oldgcstop; /* restore emergency collection */
if (l_unlikely(newstack == NULL)) { /* reallocation failed? */
+ correctstack(L); /* change offsets back to pointers */
if (raiseerror)
luaM_error(L);
else return 0; /* do not raise an error */
}
- /* number of elements to be copied to the new stack */
- i = ((oldsize <= newsize) ? oldsize : newsize) + EXTRA_STACK;
- memcpy(newstack, L->stack, i * sizeof(StackValue));
- for (; i < newsize + EXTRA_STACK; i++)
+ L->stack.p = newstack;
+ correctstack(L); /* change offsets back to pointers */
+ L->stack_last.p = L->stack.p + newsize;
+ for (i = oldsize + EXTRA_STACK; i < newsize + EXTRA_STACK; i++)
setnilvalue(s2v(newstack + i)); /* erase new segment */
- correctstack(L, L->stack, newstack);
- luaM_freearray(L, L->stack, oldsize + EXTRA_STACK);
- L->stack = newstack;
- L->stack_last = L->stack + newsize;
return 1;
}
/*
-** Try to grow the stack by at least 'n' elements. when 'raiseerror'
+** Try to grow the stack by at least 'n' elements. When 'raiseerror'
** is true, raises any error; otherwise, return 0 in case of errors.
*/
int luaD_growstack (lua_State *L, int n, int raiseerror) {
@@ -227,35 +250,38 @@ int luaD_growstack (lua_State *L, int n, int raiseerror) {
luaD_throw(L, LUA_ERRERR); /* error inside message handler */
return 0; /* if not 'raiseerror', just signal it */
}
- else {
+ else if (n < LUAI_MAXSTACK) { /* avoids arithmetic overflows */
int newsize = 2 * size; /* tentative new size */
- int needed = cast_int(L->top - L->stack) + n;
+ int needed = cast_int(L->top.p - L->stack.p) + n;
if (newsize > LUAI_MAXSTACK) /* cannot cross the limit */
newsize = LUAI_MAXSTACK;
if (newsize < needed) /* but must respect what was asked for */
newsize = needed;
if (l_likely(newsize <= LUAI_MAXSTACK))
return luaD_reallocstack(L, newsize, raiseerror);
- else { /* stack overflow */
- /* add extra size to be able to handle the error message */
- luaD_reallocstack(L, ERRORSTACKSIZE, raiseerror);
- if (raiseerror)
- luaG_runerror(L, "stack overflow");
- return 0;
- }
}
+ /* else stack overflow */
+ /* add extra size to be able to handle the error message */
+ luaD_reallocstack(L, ERRORSTACKSIZE, raiseerror);
+ if (raiseerror)
+ luaG_runerror(L, "stack overflow");
+ return 0;
}
+/*
+** Compute how much of the stack is being used, by computing the
+** maximum top of all call frames in the stack and the current top.
+*/
static int stackinuse (lua_State *L) {
CallInfo *ci;
int res;
- StkId lim = L->top;
+ StkId lim = L->top.p;
for (ci = L->ci; ci != NULL; ci = ci->previous) {
- if (lim < ci->top) lim = ci->top;
+ if (lim < ci->top.p) lim = ci->top.p;
}
- lua_assert(lim <= L->stack_last);
- res = cast_int(lim - L->stack) + 1; /* part of stack in use */
+ lua_assert(lim <= L->stack_last.p + EXTRA_STACK);
+ res = cast_int(lim - L->stack.p) + 1; /* part of stack in use */
if (res < LUA_MINSTACK)
res = LUA_MINSTACK; /* ensure a minimum size */
return res;
@@ -273,17 +299,13 @@ static int stackinuse (lua_State *L) {
*/
void luaD_shrinkstack (lua_State *L) {
int inuse = stackinuse(L);
- int nsize = inuse * 2; /* proposed new size */
- int max = inuse * 3; /* maximum "reasonable" size */
- if (max > LUAI_MAXSTACK) {
- max = LUAI_MAXSTACK; /* respect stack limit */
- if (nsize > LUAI_MAXSTACK)
- nsize = LUAI_MAXSTACK;
- }
+ int max = (inuse > LUAI_MAXSTACK / 3) ? LUAI_MAXSTACK : inuse * 3;
/* if thread is currently not handling a stack overflow and its
size is larger than maximum "reasonable" size, shrink it */
- if (inuse <= LUAI_MAXSTACK && stacksize(L) > max)
+ if (inuse <= LUAI_MAXSTACK && stacksize(L) > max) {
+ int nsize = (inuse > LUAI_MAXSTACK / 2) ? LUAI_MAXSTACK : inuse * 2;
luaD_reallocstack(L, nsize, 0); /* ok if that fails */
+ }
else /* don't change stack */
condmovestack(L,{},{}); /* (change only for debugging) */
luaE_shrinkCI(L); /* shrink CI list */
@@ -292,7 +314,7 @@ void luaD_shrinkstack (lua_State *L) {
void luaD_inctop (lua_State *L) {
luaD_checkstack(L, 1);
- L->top++;
+ L->top.p++;
}
/* }================================================================== */
@@ -309,8 +331,8 @@ void luaD_hook (lua_State *L, int event, int line,
if (hook && L->allowhook) { /* make sure there is a hook */
int mask = CIST_HOOKED;
CallInfo *ci = L->ci;
- ptrdiff_t top = savestack(L, L->top); /* preserve original 'top' */
- ptrdiff_t ci_top = savestack(L, ci->top); /* idem for 'ci->top' */
+ ptrdiff_t top = savestack(L, L->top.p); /* preserve original 'top' */
+ ptrdiff_t ci_top = savestack(L, ci->top.p); /* idem for 'ci->top' */
lua_Debug ar;
ar.event = event;
ar.currentline = line;
@@ -320,11 +342,11 @@ void luaD_hook (lua_State *L, int event, int line,
ci->u2.transferinfo.ftransfer = ftransfer;
ci->u2.transferinfo.ntransfer = ntransfer;
}
- if (isLua(ci) && L->top < ci->top)
- L->top = ci->top; /* protect entire activation register */
+ if (isLua(ci) && L->top.p < ci->top.p)
+ L->top.p = ci->top.p; /* protect entire activation register */
luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
- if (ci->top < L->top + LUA_MINSTACK)
- ci->top = L->top + LUA_MINSTACK;
+ if (ci->top.p < L->top.p + LUA_MINSTACK)
+ ci->top.p = L->top.p + LUA_MINSTACK;
L->allowhook = 0; /* cannot call hooks inside a hook */
ci->callstatus |= mask;
lua_unlock(L);
@@ -332,8 +354,8 @@ void luaD_hook (lua_State *L, int event, int line,
lua_lock(L);
lua_assert(!L->allowhook);
L->allowhook = 1;
- ci->top = restorestack(L, ci_top);
- L->top = restorestack(L, top);
+ ci->top.p = restorestack(L, ci_top);
+ L->top.p = restorestack(L, top);
ci->callstatus &= ~mask;
}
}
@@ -364,7 +386,7 @@ void luaD_hookcall (lua_State *L, CallInfo *ci) {
*/
static void rethook (lua_State *L, CallInfo *ci, int nres) {
if (L->hookmask & LUA_MASKRET) { /* is return hook on? */
- StkId firstres = L->top - nres; /* index of first result */
+ StkId firstres = L->top.p - nres; /* index of first result */
int delta = 0; /* correction for vararg functions */
int ftransfer;
if (isLua(ci)) {
@@ -372,10 +394,10 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) {
if (p->is_vararg)
delta = ci->u.l.nextraargs + p->numparams + 1;
}
- ci->func += delta; /* if vararg, back to virtual 'func' */
- ftransfer = cast(unsigned short, firstres - ci->func);
+ ci->func.p += delta; /* if vararg, back to virtual 'func' */
+ ftransfer = cast(unsigned short, firstres - ci->func.p);
luaD_hook(L, LUA_HOOKRET, -1, ftransfer, nres); /* call it */
- ci->func -= delta;
+ ci->func.p -= delta;
}
if (isLua(ci = ci->previous))
L->oldpc = pcRel(ci->u.l.savedpc, ci_func(ci)->p); /* set 'oldpc' */
@@ -387,16 +409,16 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) {
** stack, below original 'func', so that 'luaD_precall' can call it. Raise
** an error if there is no '__call' metafield.
*/
-StkId luaD_tryfuncTM (lua_State *L, StkId func) {
+static StkId tryfuncTM (lua_State *L, StkId func) {
const TValue *tm;
StkId p;
checkstackGCp(L, 1, func); /* space for metamethod */
tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); /* (after previous GC) */
if (l_unlikely(ttisnil(tm)))
luaG_callerror(L, s2v(func)); /* nothing to call */
- for (p = L->top; p > func; p--) /* open space for metamethod */
+ for (p = L->top.p; p > func; p--) /* open space for metamethod */
setobjs2s(L, p, p-1);
- L->top++; /* stack space pre-allocated by the caller */
+ L->top.p++; /* stack space pre-allocated by the caller */
setobj2s(L, func, tm); /* metamethod is the new function to be called */
return func;
}
@@ -413,28 +435,29 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) {
int i;
switch (wanted) { /* handle typical cases separately */
case 0: /* no values needed */
- L->top = res;
+ L->top.p = res;
return;
case 1: /* one value needed */
if (nres == 0) /* no results? */
setnilvalue(s2v(res)); /* adjust with nil */
else /* at least one result */
- setobjs2s(L, res, L->top - nres); /* move it to proper place */
- L->top = res + 1;
+ setobjs2s(L, res, L->top.p - nres); /* move it to proper place */
+ L->top.p = res + 1;
return;
case LUA_MULTRET:
wanted = nres; /* we want all results */
break;
default: /* two/more results and/or to-be-closed variables */
if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */
- ptrdiff_t savedres = savestack(L, res);
L->ci->callstatus |= CIST_CLSRET; /* in case of yields */
L->ci->u2.nres = nres;
- luaF_close(L, res, CLOSEKTOP, 1);
+ res = luaF_close(L, res, CLOSEKTOP, 1);
L->ci->callstatus &= ~CIST_CLSRET;
- if (L->hookmask) /* if needed, call hook after '__close's */
+ if (L->hookmask) { /* if needed, call hook after '__close's */
+ ptrdiff_t savedres = savestack(L, res);
rethook(L, L->ci, nres);
- res = restorestack(L, savedres); /* close and hook can move stack */
+ res = restorestack(L, savedres); /* hook can move stack */
+ }
wanted = decodeNresults(wanted);
if (wanted == LUA_MULTRET)
wanted = nres; /* we want all results */
@@ -442,14 +465,14 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) {
break;
}
/* generic case */
- firstresult = L->top - nres; /* index of first result */
+ firstresult = L->top.p - nres; /* index of first result */
if (nres > wanted) /* extra results? */
nres = wanted; /* don't need them */
for (i = 0; i < nres; i++) /* move all results to correct place */
setobjs2s(L, res + i, firstresult + i);
for (; i < wanted; i++) /* complete wanted number of results */
setnilvalue(s2v(res + i));
- L->top = res + wanted; /* top points after the last result */
+ L->top.p = res + wanted; /* top points after the last result */
}
@@ -464,7 +487,7 @@ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) {
if (l_unlikely(L->hookmask && !hastocloseCfunc(wanted)))
rethook(L, ci, nres);
/* move results to proper place */
- moveresults(L, ci->func, nres, wanted);
+ moveresults(L, ci->func.p, nres, wanted);
/* function cannot be in any of these cases when returning */
lua_assert(!(ci->callstatus &
(CIST_HOOKED | CIST_YPCALL | CIST_FIN | CIST_TRAN | CIST_CLSRET)));
@@ -479,10 +502,10 @@ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) {
l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret,
int mask, StkId top) {
CallInfo *ci = L->ci = next_ci(L); /* new frame */
- ci->func = func;
+ ci->func.p = func;
ci->nresults = nret;
ci->callstatus = mask;
- ci->top = top;
+ ci->top.p = top;
return ci;
}
@@ -496,10 +519,10 @@ l_sinline int precallC (lua_State *L, StkId func, int nresults,
CallInfo *ci;
checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
L->ci = ci = prepCallInfo(L, func, nresults, CIST_C,
- L->top + LUA_MINSTACK);
- lua_assert(ci->top <= L->stack_last);
+ L->top.p + LUA_MINSTACK);
+ lua_assert(ci->top.p <= L->stack_last.p);
if (l_unlikely(L->hookmask & LUA_MASKCALL)) {
- int narg = cast_int(L->top - func) - 1;
+ int narg = cast_int(L->top.p - func) - 1;
luaD_hook(L, LUA_HOOKCALL, -1, 1, narg);
}
lua_unlock(L);
@@ -531,21 +554,21 @@ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func,
int nfixparams = p->numparams;
int i;
checkstackGCp(L, fsize - delta, func);
- ci->func -= delta; /* restore 'func' (if vararg) */
+ ci->func.p -= delta; /* restore 'func' (if vararg) */
for (i = 0; i < narg1; i++) /* move down function and arguments */
- setobjs2s(L, ci->func + i, func + i);
- func = ci->func; /* moved-down function */
+ setobjs2s(L, ci->func.p + i, func + i);
+ func = ci->func.p; /* moved-down function */
for (; narg1 <= nfixparams; narg1++)
setnilvalue(s2v(func + narg1)); /* complete missing arguments */
- ci->top = func + 1 + fsize; /* top for new function */
- lua_assert(ci->top <= L->stack_last);
+ ci->top.p = func + 1 + fsize; /* top for new function */
+ lua_assert(ci->top.p <= L->stack_last.p);
ci->u.l.savedpc = p->code; /* starting point */
ci->callstatus |= CIST_TAIL;
- L->top = func + narg1; /* set top */
+ L->top.p = func + narg1; /* set top */
return -1;
}
default: { /* not a function */
- func = luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */
+ func = tryfuncTM(L, func); /* try to get '__call' metamethod */
/* return luaD_pretailcall(L, ci, func, narg1 + 1, delta); */
narg1++;
goto retry; /* try again */
@@ -574,19 +597,19 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
case LUA_VLCL: { /* Lua function */
CallInfo *ci;
Proto *p = clLvalue(s2v(func))->p;
- int narg = cast_int(L->top - func) - 1; /* number of real arguments */
+ int narg = cast_int(L->top.p - func) - 1; /* number of real arguments */
int nfixparams = p->numparams;
int fsize = p->maxstacksize; /* frame size */
checkstackGCp(L, fsize, func);
L->ci = ci = prepCallInfo(L, func, nresults, 0, func + 1 + fsize);
ci->u.l.savedpc = p->code; /* starting point */
for (; narg < nfixparams; narg++)
- setnilvalue(s2v(L->top++)); /* complete missing arguments */
- lua_assert(ci->top <= L->stack_last);
+ setnilvalue(s2v(L->top.p++)); /* complete missing arguments */
+ lua_assert(ci->top.p <= L->stack_last.p);
return ci;
}
default: { /* not a function */
- func = luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */
+ func = tryfuncTM(L, func); /* try to get '__call' metamethod */
/* return luaD_precall(L, func, nresults); */
goto retry; /* try again with metamethod */
}
@@ -598,12 +621,17 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
** Call a function (C or Lua) through C. 'inc' can be 1 (increment
** number of recursive invocations in the C stack) or nyci (the same
** plus increment number of non-yieldable calls).
+** This function can be called with some use of EXTRA_STACK, so it should
+** check the stack before doing anything else. 'luaD_precall' already
+** does that.
*/
-l_sinline void ccall (lua_State *L, StkId func, int nResults, int inc) {
+l_sinline void ccall (lua_State *L, StkId func, int nResults, l_uint32 inc) {
CallInfo *ci;
L->nCcalls += inc;
- if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS))
+ if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) {
+ checkstackp(L, 0, func); /* free any use of EXTRA_STACK */
luaE_checkcstack(L);
+ }
if ((ci = luaD_precall(L, func, nResults)) != NULL) { /* Lua function? */
ci->callstatus = CIST_FRESH; /* mark that it is a "fresh" execute */
luaV_execute(L, ci); /* call it */
@@ -651,8 +679,7 @@ static int finishpcallk (lua_State *L, CallInfo *ci) {
else { /* error */
StkId func = restorestack(L, ci->u2.funcidx);
L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */
- luaF_close(L, func, status, 1); /* can yield or raise an error */
- func = restorestack(L, ci->u2.funcidx); /* stack may be moved */
+ func = luaF_close(L, func, status, 1); /* can yield or raise an error */
luaD_seterrorobj(L, status, func);
luaD_shrinkstack(L); /* restore stack size in case of overflow */
setcistrecst(ci, LUA_OK); /* clear original status */
@@ -740,8 +767,8 @@ static CallInfo *findpcall (lua_State *L) {
** coroutine error handler and should not kill the coroutine.)
*/
static int resume_error (lua_State *L, const char *msg, int narg) {
- L->top -= narg; /* remove args from the stack */
- setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */
+ L->top.p -= narg; /* remove args from the stack */
+ setsvalue2s(L, L->top.p, luaS_new(L, msg)); /* push error message */
api_incr_top(L);
lua_unlock(L);
return LUA_ERRRUN;
@@ -757,7 +784,7 @@ static int resume_error (lua_State *L, const char *msg, int narg) {
*/
static void resume (lua_State *L, void *ud) {
int n = *(cast(int*, ud)); /* number of arguments */
- StkId firstArg = L->top - n; /* first argument */
+ StkId firstArg = L->top.p - n; /* first argument */
CallInfo *ci = L->ci;
if (L->status == LUA_OK) /* starting a coroutine? */
ccall(L, firstArg - 1, LUA_MULTRET, 0); /* just call its body */
@@ -765,7 +792,11 @@ static void resume (lua_State *L, void *ud) {
lua_assert(L->status == LUA_YIELD);
L->status = LUA_OK; /* mark that it is running (again) */
if (isLua(ci)) { /* yielded inside a hook? */
- L->top = firstArg; /* discard arguments */
+ /* undo increment made by 'luaG_traceexec': instruction was not
+ executed yet */
+ lua_assert(ci->callstatus & CIST_HOOKYIELD);
+ ci->u.l.savedpc--;
+ L->top.p = firstArg; /* discard arguments */
luaV_execute(L, ci); /* just continue running Lua code */
}
else { /* 'common' yield */
@@ -808,7 +839,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
if (L->status == LUA_OK) { /* may be starting a coroutine */
if (L->ci != &L->base_ci) /* not in base level? */
return resume_error(L, "cannot resume non-suspended coroutine", nargs);
- else if (L->top - (L->ci->func + 1) == nargs) /* no function? */
+ else if (L->top.p - (L->ci->func.p + 1) == nargs) /* no function? */
return resume_error(L, "cannot resume dead coroutine", nargs);
}
else if (L->status != LUA_YIELD) /* ended with errors? */
@@ -826,11 +857,11 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
lua_assert(status == L->status); /* normal end or yield */
else { /* unrecoverable error */
L->status = cast_byte(status); /* mark thread as 'dead' */
- luaD_seterrorobj(L, status, L->top); /* push error message */
- L->ci->top = L->top;
+ luaD_seterrorobj(L, status, L->top.p); /* push error message */
+ L->ci->top.p = L->top.p;
}
*nresults = (status == LUA_YIELD) ? L->ci->u2.nyield
- : cast_int(L->top - (L->ci->func + 1));
+ : cast_int(L->top.p - (L->ci->func.p + 1));
lua_unlock(L);
return status;
}
@@ -985,7 +1016,7 @@ int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
p.dyd.gt.arr = NULL; p.dyd.gt.size = 0;
p.dyd.label.arr = NULL; p.dyd.label.size = 0;
luaZ_initbuffer(L, &p.buff);
- status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
+ status = luaD_pcall(L, f_parser, &p, savestack(L, L->top.p), L->errfunc);
luaZ_freebuffer(L, &p.buff);
luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size);
luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size);
diff --git a/3rdparty/lua/src/ldo.h b/3rdparty/lua/src/ldo.h
index 911e67f660a..56008ab30f0 100644
--- a/3rdparty/lua/src/ldo.h
+++ b/3rdparty/lua/src/ldo.h
@@ -8,6 +8,7 @@
#define ldo_h
+#include "llimits.h"
#include "lobject.h"
#include "lstate.h"
#include "lzio.h"
@@ -23,7 +24,7 @@
** at every check.
*/
#define luaD_checkstackaux(L,n,pre,pos) \
- if (l_unlikely(L->stack_last - L->top <= (n))) \
+ if (l_unlikely(L->stack_last.p - L->top.p <= (n))) \
{ pre; luaD_growstack(L, n, 1); pos; } \
else { condmovestack(L,pre,pos); }
@@ -32,11 +33,18 @@
-#define savestack(L,p) ((char *)(p) - (char *)L->stack)
-#define restorestack(L,n) ((StkId)((char *)L->stack + (n)))
+#define savestack(L,pt) (cast_charp(pt) - cast_charp(L->stack.p))
+#define restorestack(L,n) cast(StkId, cast_charp(L->stack.p) + (n))
/* macro to check stack size, preserving 'p' */
+#define checkstackp(L,n,p) \
+ luaD_checkstackaux(L, n, \
+ ptrdiff_t t__ = savestack(L, p), /* save 'p' */ \
+ p = restorestack(L, t__)) /* 'pos' part: restore 'p' */
+
+
+/* macro to check stack size and GC, preserving 'p' */
#define checkstackGCp(L,n,p) \
luaD_checkstackaux(L, n, \
ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \
@@ -58,11 +66,11 @@ LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
LUAI_FUNC void luaD_hook (lua_State *L, int event, int line,
int fTransfer, int nTransfer);
LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci);
-LUAI_FUNC int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1, int delta);
+LUAI_FUNC int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func,
+ int narg1, int delta);
LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int nResults);
LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults);
-LUAI_FUNC StkId luaD_tryfuncTM (lua_State *L, StkId func);
LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status);
LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,
ptrdiff_t oldtop, ptrdiff_t ef);
diff --git a/3rdparty/lua/src/ldump.c b/3rdparty/lua/src/ldump.c
index f848b669cbd..f231691b779 100644
--- a/3rdparty/lua/src/ldump.c
+++ b/3rdparty/lua/src/ldump.c
@@ -10,6 +10,7 @@
#include "lprefix.h"
+#include <limits.h>
#include <stddef.h>
#include "lua.h"
@@ -55,8 +56,11 @@ static void dumpByte (DumpState *D, int y) {
}
-/* dumpInt Buff Size */
-#define DIBS ((sizeof(size_t) * 8 / 7) + 1)
+/*
+** 'dumpSize' buffer size: each byte can store up to 7 bits. (The "+6"
+** rounds up the division.)
+*/
+#define DIBS ((sizeof(size_t) * CHAR_BIT + 6) / 7)
static void dumpSize (DumpState *D, size_t x) {
lu_byte buff[DIBS];
diff --git a/3rdparty/lua/src/lfunc.c b/3rdparty/lua/src/lfunc.c
index f5889a21d12..0945f241de2 100644
--- a/3rdparty/lua/src/lfunc.c
+++ b/3rdparty/lua/src/lfunc.c
@@ -50,8 +50,8 @@ void luaF_initupvals (lua_State *L, LClosure *cl) {
for (i = 0; i < cl->nupvalues; i++) {
GCObject *o = luaC_newobj(L, LUA_VUPVAL, sizeof(UpVal));
UpVal *uv = gco2upv(o);
- uv->v = &uv->u.value; /* make it closed */
- setnilvalue(uv->v);
+ uv->v.p = &uv->u.value; /* make it closed */
+ setnilvalue(uv->v.p);
cl->upvals[i] = uv;
luaC_objbarrier(L, cl, uv);
}
@@ -62,12 +62,11 @@ void luaF_initupvals (lua_State *L, LClosure *cl) {
** Create a new upvalue at the given level, and link it to the list of
** open upvalues of 'L' after entry 'prev'.
**/
-static UpVal *newupval (lua_State *L, int tbc, StkId level, UpVal **prev) {
+static UpVal *newupval (lua_State *L, StkId level, UpVal **prev) {
GCObject *o = luaC_newobj(L, LUA_VUPVAL, sizeof(UpVal));
UpVal *uv = gco2upv(o);
UpVal *next = *prev;
- uv->v = s2v(level); /* current value lives in the stack */
- uv->tbc = tbc;
+ uv->v.p = s2v(level); /* current value lives in the stack */
uv->u.open.next = next; /* link it to list of open upvalues */
uv->u.open.previous = prev;
if (next)
@@ -96,7 +95,7 @@ UpVal *luaF_findupval (lua_State *L, StkId level) {
pp = &p->u.open.next;
}
/* not found: create a new upvalue after 'pp' */
- return newupval(L, 0, level, pp);
+ return newupval(L, level, pp);
}
@@ -106,12 +105,12 @@ UpVal *luaF_findupval (lua_State *L, StkId level) {
** (This function assumes EXTRA_STACK.)
*/
static void callclosemethod (lua_State *L, TValue *obj, TValue *err, int yy) {
- StkId top = L->top;
+ StkId top = L->top.p;
const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE);
setobj2s(L, top, tm); /* will call metamethod... */
setobj2s(L, top + 1, obj); /* with 'self' as the 1st argument */
setobj2s(L, top + 2, err); /* and error msg. as 2nd argument */
- L->top = top + 3; /* add function and arguments */
+ L->top.p = top + 3; /* add function and arguments */
if (yy)
luaD_call(L, top, 0);
else
@@ -126,7 +125,7 @@ static void callclosemethod (lua_State *L, TValue *obj, TValue *err, int yy) {
static void checkclosemth (lua_State *L, StkId level) {
const TValue *tm = luaT_gettmbyobj(L, s2v(level), TM_CLOSE);
if (ttisnil(tm)) { /* no metamethod? */
- int idx = cast_int(level - L->ci->func); /* variable index */
+ int idx = cast_int(level - L->ci->func.p); /* variable index */
const char *vname = luaG_findlocal(L, L->ci, idx, NULL);
if (vname == NULL) vname = "?";
luaG_runerror(L, "variable '%s' got a non-closable value", vname);
@@ -160,23 +159,23 @@ static void prepcallclosemth (lua_State *L, StkId level, int status, int yy) {
** is used.)
*/
#define MAXDELTA \
- ((256ul << ((sizeof(L->stack->tbclist.delta) - 1) * 8)) - 1)
+ ((256ul << ((sizeof(L->stack.p->tbclist.delta) - 1) * 8)) - 1)
/*
** Insert a variable in the list of to-be-closed variables.
*/
void luaF_newtbcupval (lua_State *L, StkId level) {
- lua_assert(level > L->tbclist);
+ lua_assert(level > L->tbclist.p);
if (l_isfalse(s2v(level)))
return; /* false doesn't need to be closed */
checkclosemth(L, level); /* value must have a close method */
- while (cast_uint(level - L->tbclist) > MAXDELTA) {
- L->tbclist += MAXDELTA; /* create a dummy node at maximum delta */
- L->tbclist->tbclist.delta = 0;
+ while (cast_uint(level - L->tbclist.p) > MAXDELTA) {
+ L->tbclist.p += MAXDELTA; /* create a dummy node at maximum delta */
+ L->tbclist.p->tbclist.delta = 0;
}
- level->tbclist.delta = cast(unsigned short, level - L->tbclist);
- L->tbclist = level;
+ level->tbclist.delta = cast(unsigned short, level - L->tbclist.p);
+ L->tbclist.p = level;
}
@@ -196,10 +195,10 @@ void luaF_closeupval (lua_State *L, StkId level) {
StkId upl; /* stack index pointed by 'uv' */
while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) {
TValue *slot = &uv->u.value; /* new position for value */
- lua_assert(uplevel(uv) < L->top);
+ lua_assert(uplevel(uv) < L->top.p);
luaF_unlinkupval(uv); /* remove upvalue from 'openupval' list */
- setobj(L, slot, uv->v); /* move value to upvalue slot */
- uv->v = slot; /* now current value lives here */
+ setobj(L, slot, uv->v.p); /* move value to upvalue slot */
+ uv->v.p = slot; /* now current value lives here */
if (!iswhite(uv)) { /* neither white nor dead? */
nw2black(uv); /* closed upvalues cannot be gray */
luaC_barrier(L, uv, slot);
@@ -209,31 +208,32 @@ void luaF_closeupval (lua_State *L, StkId level) {
/*
-** Remove firt element from the tbclist plus its dummy nodes.
+** Remove first element from the tbclist plus its dummy nodes.
*/
static void poptbclist (lua_State *L) {
- StkId tbc = L->tbclist;
+ StkId tbc = L->tbclist.p;
lua_assert(tbc->tbclist.delta > 0); /* first element cannot be dummy */
tbc -= tbc->tbclist.delta;
- while (tbc > L->stack && tbc->tbclist.delta == 0)
+ while (tbc > L->stack.p && tbc->tbclist.delta == 0)
tbc -= MAXDELTA; /* remove dummy nodes */
- L->tbclist = tbc;
+ L->tbclist.p = tbc;
}
/*
** Close all upvalues and to-be-closed variables up to the given stack
-** level.
+** level. Return restored 'level'.
*/
-void luaF_close (lua_State *L, StkId level, int status, int yy) {
+StkId luaF_close (lua_State *L, StkId level, int status, int yy) {
ptrdiff_t levelrel = savestack(L, level);
luaF_closeupval(L, level); /* first, close the upvalues */
- while (L->tbclist >= level) { /* traverse tbc's down to that level */
- StkId tbc = L->tbclist; /* get variable index */
+ while (L->tbclist.p >= level) { /* traverse tbc's down to that level */
+ StkId tbc = L->tbclist.p; /* get variable index */
poptbclist(L); /* remove it from list */
prepcallclosemth(L, tbc, status, yy); /* close variable */
level = restorestack(L, levelrel);
}
+ return level;
}
diff --git a/3rdparty/lua/src/lfunc.h b/3rdparty/lua/src/lfunc.h
index dc1cebccd1b..3be265efb58 100644
--- a/3rdparty/lua/src/lfunc.h
+++ b/3rdparty/lua/src/lfunc.h
@@ -29,10 +29,10 @@
#define MAXUPVAL 255
-#define upisopen(up) ((up)->v != &(up)->u.value)
+#define upisopen(up) ((up)->v.p != &(up)->u.value)
-#define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v))
+#define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v.p))
/*
@@ -54,7 +54,7 @@ LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl);
LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level);
LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level);
-LUAI_FUNC void luaF_close (lua_State *L, StkId level, int status, int yy);
+LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, int status, int yy);
LUAI_FUNC void luaF_unlinkupval (UpVal *uv);
LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);
LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,
diff --git a/3rdparty/lua/src/lgc.c b/3rdparty/lua/src/lgc.c
index 42a73d813ac..5817f9eec35 100644
--- a/3rdparty/lua/src/lgc.c
+++ b/3rdparty/lua/src/lgc.c
@@ -252,12 +252,13 @@ void luaC_fix (lua_State *L, GCObject *o) {
/*
-** create a new collectable object (with given type and size) and link
-** it to 'allgc' list.
+** create a new collectable object (with given type, size, and offset)
+** and link it to 'allgc' list.
*/
-GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
+GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) {
global_State *g = G(L);
- GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));
+ char *p = cast_charp(luaM_newobject(L, novariant(tt), sz));
+ GCObject *o = cast(GCObject *, p + offset);
o->marked = luaC_white(g);
o->tt = tt;
o->next = g->allgc;
@@ -265,6 +266,11 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
return o;
}
+
+GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
+ return luaC_newobjdt(L, tt, sz, 0);
+}
+
/* }====================================================== */
@@ -301,7 +307,7 @@ static void reallymarkobject (global_State *g, GCObject *o) {
set2gray(uv); /* open upvalues are kept gray */
else
set2black(uv); /* closed upvalues are visited here */
- markvalue(g, uv->v); /* mark its content */
+ markvalue(g, uv->v.p); /* mark its content */
break;
}
case LUA_VUSERDATA: {
@@ -376,7 +382,7 @@ static int remarkupvals (global_State *g) {
work++;
if (!iswhite(uv)) { /* upvalue already visited? */
lua_assert(upisopen(uv) && isgray(uv));
- markvalue(g, uv->v); /* mark its value */
+ markvalue(g, uv->v.p); /* mark its value */
}
}
}
@@ -536,10 +542,12 @@ static void traversestrongtable (global_State *g, Table *h) {
static lu_mem traversetable (global_State *g, Table *h) {
const char *weakkey, *weakvalue;
const TValue *mode = gfasttm(g, h->metatable, TM_MODE);
+ TString *smode;
markobjectN(g, h->metatable);
- if (mode && ttisstring(mode) && /* is there a weak mode? */
- (cast_void(weakkey = strchr(svalue(mode), 'k')),
- cast_void(weakvalue = strchr(svalue(mode), 'v')),
+ if (mode && ttisshrstring(mode) && /* is there a weak mode? */
+ (cast_void(smode = tsvalue(mode)),
+ cast_void(weakkey = strchr(getshrstr(smode), 'k')),
+ cast_void(weakvalue = strchr(getshrstr(smode), 'v')),
(weakkey || weakvalue))) { /* is really weak? */
if (!weakkey) /* strong keys? */
traverseweakvalue(g, h);
@@ -620,19 +628,21 @@ static int traverseLclosure (global_State *g, LClosure *cl) {
*/
static int traversethread (global_State *g, lua_State *th) {
UpVal *uv;
- StkId o = th->stack;
+ StkId o = th->stack.p;
if (isold(th) || g->gcstate == GCSpropagate)
linkgclist(th, g->grayagain); /* insert into 'grayagain' list */
if (o == NULL)
return 1; /* stack not completely built yet */
lua_assert(g->gcstate == GCSatomic ||
th->openupval == NULL || isintwups(th));
- for (; o < th->top; o++) /* mark live elements in the stack */
+ for (; o < th->top.p; o++) /* mark live elements in the stack */
markvalue(g, s2v(o));
for (uv = th->openupval; uv != NULL; uv = uv->u.open.next)
markobject(g, uv); /* open upvalues cannot be collected */
if (g->gcstate == GCSatomic) { /* final traversal? */
- for (; o < th->stack_last + EXTRA_STACK; o++)
+ if (!g->gcemergency)
+ luaD_shrinkstack(th); /* do not change stack in emergency cycle */
+ for (o = th->top.p; o < th->stack_last.p + EXTRA_STACK; o++)
setnilvalue(s2v(o)); /* clear dead stack slice */
/* 'remarkupvals' may have removed thread from 'twups' list */
if (!isintwups(th) && th->openupval != NULL) {
@@ -640,8 +650,6 @@ static int traversethread (global_State *g, lua_State *th) {
g->twups = th;
}
}
- else if (!g->gcemergency)
- luaD_shrinkstack(th); /* do not change stack in emergency cycle */
return 1 + stacksize(th);
}
@@ -892,7 +900,7 @@ static GCObject *udata2finalize (global_State *g) {
static void dothecall (lua_State *L, void *ud) {
UNUSED(ud);
- luaD_callnoyield(L, L->top - 2, 0);
+ luaD_callnoyield(L, L->top.p - 2, 0);
}
@@ -909,16 +917,16 @@ static void GCTM (lua_State *L) {
int oldgcstp = g->gcstp;
g->gcstp |= GCSTPGC; /* avoid GC steps */
L->allowhook = 0; /* stop debug hooks during GC metamethod */
- setobj2s(L, L->top++, tm); /* push finalizer... */
- setobj2s(L, L->top++, &v); /* ... and its argument */
+ setobj2s(L, L->top.p++, tm); /* push finalizer... */
+ setobj2s(L, L->top.p++, &v); /* ... and its argument */
L->ci->callstatus |= CIST_FIN; /* will run a finalizer */
- status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0);
+ status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top.p - 2), 0);
L->ci->callstatus &= ~CIST_FIN; /* not running a finalizer anymore */
L->allowhook = oldah; /* restore hooks */
g->gcstp = oldgcstp; /* restore state */
if (l_unlikely(status != LUA_OK)) { /* error while running __gc? */
luaE_warnerror(L, "__gc");
- L->top--; /* pops error object */
+ L->top.p--; /* pops error object */
}
}
}
@@ -1041,7 +1049,25 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {
** =======================================================
*/
-static void setpause (global_State *g);
+
+/*
+** Set the "time" to wait before starting a new GC cycle; cycle will
+** start when memory use hits the threshold of ('estimate' * pause /
+** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero,
+** because Lua cannot even start with less than PAUSEADJ bytes).
+*/
+static void setpause (global_State *g) {
+ l_mem threshold, debt;
+ int pause = getgcparam(g->gcpause);
+ l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */
+ lua_assert(estimate > 0);
+ threshold = (pause < MAX_LMEM / estimate) /* overflow? */
+ ? estimate * pause /* no overflow */
+ : MAX_LMEM; /* overflow; truncate to maximum */
+ debt = gettotalbytes(g) - threshold;
+ if (debt > 0) debt = 0;
+ luaE_setdebt(g, debt);
+}
/*
@@ -1286,6 +1312,15 @@ static void atomic2gen (lua_State *L, global_State *g) {
/*
+** Set debt for the next minor collection, which will happen when
+** memory grows 'genminormul'%.
+*/
+static void setminordebt (global_State *g) {
+ luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul));
+}
+
+
+/*
** Enter generational mode. Must go until the end of an atomic cycle
** to ensure that all objects are correctly marked and weak tables
** are cleared. Then, turn all objects into old and finishes the
@@ -1297,6 +1332,7 @@ static lu_mem entergen (lua_State *L, global_State *g) {
luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */
numobjs = atomic(L); /* propagates all and then do the atomic stuff */
atomic2gen(L, g);
+ setminordebt(g); /* set debt assuming next cycle will be minor */
return numobjs;
}
@@ -1343,15 +1379,6 @@ static lu_mem fullgen (lua_State *L, global_State *g) {
/*
-** Set debt for the next minor collection, which will happen when
-** memory grows 'genminormul'%.
-*/
-static void setminordebt (global_State *g) {
- luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul));
-}
-
-
-/*
** Does a major collection after last collection was a "bad collection".
**
** When the program is building a big structure, it allocates lots of
@@ -1384,7 +1411,7 @@ static void stepgenfull (lua_State *L, global_State *g) {
setminordebt(g);
}
else { /* another bad collection; stay in incremental mode */
- g->GCestimate = gettotalbytes(g); /* first estimate */;
+ g->GCestimate = gettotalbytes(g); /* first estimate */
entersweep(L);
luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */
setpause(g);
@@ -1422,8 +1449,8 @@ static void genstep (lua_State *L, global_State *g) {
lu_mem numobjs = fullgen(L, g); /* do a major collection */
if (gettotalbytes(g) < majorbase + (majorinc / 2)) {
/* collected at least half of memory growth since last major
- collection; keep doing minor collections */
- setminordebt(g);
+ collection; keep doing minor collections. */
+ lua_assert(g->lastatomic == 0);
}
else { /* bad collection */
g->lastatomic = numobjs; /* signal that last collection was bad */
@@ -1450,26 +1477,6 @@ static void genstep (lua_State *L, global_State *g) {
/*
-** Set the "time" to wait before starting a new GC cycle; cycle will
-** start when memory use hits the threshold of ('estimate' * pause /
-** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero,
-** because Lua cannot even start with less than PAUSEADJ bytes).
-*/
-static void setpause (global_State *g) {
- l_mem threshold, debt;
- int pause = getgcparam(g->gcpause);
- l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */
- lua_assert(estimate > 0);
- threshold = (pause < MAX_LMEM / estimate) /* overflow? */
- ? estimate * pause /* no overflow */
- : MAX_LMEM; /* overflow; truncate to maximum */
- debt = gettotalbytes(g) - threshold;
- if (debt > 0) debt = 0;
- luaE_setdebt(g, debt);
-}
-
-
-/*
** Enter first sweep phase.
** The call to 'sweeptolive' makes the pointer point to an object
** inside the list (instead of to the header), so that the real sweep do
@@ -1599,7 +1606,7 @@ static lu_mem singlestep (lua_State *L) {
case GCSenteratomic: {
work = atomic(L); /* work is what was traversed by 'atomic' */
entersweep(L);
- g->GCestimate = gettotalbytes(g); /* first estimate */;
+ g->GCestimate = gettotalbytes(g); /* first estimate */
break;
}
case GCSswpallgc: { /* sweep "regular" objects */
@@ -1676,12 +1683,15 @@ static void incstep (lua_State *L, global_State *g) {
}
/*
-** performs a basic GC step if collector is running
+** Performs a basic GC step if collector is running. (If collector is
+** not running, set a reasonable debt to avoid it being called at
+** every single check.)
*/
void luaC_step (lua_State *L) {
global_State *g = G(L);
- lua_assert(!g->gcemergency);
- if (gcrunning(g)) { /* running? */
+ if (!gcrunning(g)) /* not running? */
+ luaE_setdebt(g, -2000);
+ else {
if(isdecGCmodegen(g))
genstep(L, g);
else
@@ -1702,6 +1712,8 @@ static void fullinc (lua_State *L, global_State *g) {
entersweep(L); /* sweep everything to turn them back to white */
/* finish any pending sweep phase to start a new cycle */
luaC_runtilstate(L, bitmask(GCSpause));
+ luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */
+ g->gcstate = GCSenteratomic; /* go straight to atomic phase */
luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */
/* estimate must be correct after a full GC cycle */
lua_assert(g->GCestimate == gettotalbytes(g));
diff --git a/3rdparty/lua/src/lgc.h b/3rdparty/lua/src/lgc.h
index 4a125634b9e..538f6edcccf 100644
--- a/3rdparty/lua/src/lgc.h
+++ b/3rdparty/lua/src/lgc.h
@@ -172,24 +172,27 @@
#define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0)
-#define luaC_barrier(L,p,v) ( \
- (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \
- luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0))
-
-#define luaC_barrierback(L,p,v) ( \
- (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \
- luaC_barrierback_(L,p) : cast_void(0))
-
#define luaC_objbarrier(L,p,o) ( \
(isblack(p) && iswhite(o)) ? \
luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0))
+#define luaC_barrier(L,p,v) ( \
+ iscollectable(v) ? luaC_objbarrier(L,p,gcvalue(v)) : cast_void(0))
+
+#define luaC_objbarrierback(L,p,o) ( \
+ (isblack(p) && iswhite(o)) ? luaC_barrierback_(L,p) : cast_void(0))
+
+#define luaC_barrierback(L,p,v) ( \
+ iscollectable(v) ? luaC_objbarrierback(L, p, gcvalue(v)) : cast_void(0))
+
LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o);
LUAI_FUNC void luaC_freeallobjects (lua_State *L);
LUAI_FUNC void luaC_step (lua_State *L);
LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);
LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);
+LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz,
+ size_t offset);
LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);
LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);
LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
diff --git a/3rdparty/lua/src/liolib.c b/3rdparty/lua/src/liolib.c
index b08397da45d..c5075f3e78a 100644
--- a/3rdparty/lua/src/liolib.c
+++ b/3rdparty/lua/src/liolib.c
@@ -245,8 +245,8 @@ static int f_gc (lua_State *L) {
*/
static int io_fclose (lua_State *L) {
LStream *p = tolstream(L);
- int res = fclose(p->f);
- return luaL_fileresult(L, (res == 0), NULL);
+ errno = 0;
+ return luaL_fileresult(L, (fclose(p->f) == 0), NULL);
}
@@ -272,6 +272,7 @@ static int io_open (lua_State *L) {
LStream *p = newfile(L);
const char *md = mode; /* to traverse/check mode */
luaL_argcheck(L, l_checkmode(md), 2, "invalid mode");
+ errno = 0;
p->f = fopen(filename, mode);
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
}
@@ -292,6 +293,7 @@ static int io_popen (lua_State *L) {
const char *mode = luaL_optstring(L, 2, "r");
LStream *p = newprefile(L);
luaL_argcheck(L, l_checkmodep(mode), 2, "invalid mode");
+ errno = 0;
p->f = l_popen(L, filename, mode);
p->closef = &io_pclose;
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
@@ -300,6 +302,7 @@ static int io_popen (lua_State *L) {
static int io_tmpfile (lua_State *L) {
LStream *p = newfile(L);
+ errno = 0;
p->f = tmpfile();
return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1;
}
@@ -567,6 +570,7 @@ static int g_read (lua_State *L, FILE *f, int first) {
int nargs = lua_gettop(L) - 1;
int n, success;
clearerr(f);
+ errno = 0;
if (nargs == 0) { /* no arguments? */
success = read_line(L, f, 1);
n = first + 1; /* to return 1 result */
@@ -660,6 +664,7 @@ static int io_readline (lua_State *L) {
static int g_write (lua_State *L, FILE *f, int arg) {
int nargs = lua_gettop(L) - arg;
int status = 1;
+ errno = 0;
for (; nargs--; arg++) {
if (lua_type(L, arg) == LUA_TNUMBER) {
/* optimization: could be done exactly as for strings */
@@ -678,7 +683,8 @@ static int g_write (lua_State *L, FILE *f, int arg) {
}
if (l_likely(status))
return 1; /* file handle already on stack top */
- else return luaL_fileresult(L, status, NULL);
+ else
+ return luaL_fileresult(L, status, NULL);
}
@@ -703,6 +709,7 @@ static int f_seek (lua_State *L) {
l_seeknum offset = (l_seeknum)p3;
luaL_argcheck(L, (lua_Integer)offset == p3, 3,
"not an integer in proper range");
+ errno = 0;
op = l_fseek(f, offset, mode[op]);
if (l_unlikely(op))
return luaL_fileresult(L, 0, NULL); /* error */
@@ -719,19 +726,25 @@ static int f_setvbuf (lua_State *L) {
FILE *f = tofile(L);
int op = luaL_checkoption(L, 2, NULL, modenames);
lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);
- int res = setvbuf(f, NULL, mode[op], (size_t)sz);
+ int res;
+ errno = 0;
+ res = setvbuf(f, NULL, mode[op], (size_t)sz);
return luaL_fileresult(L, res == 0, NULL);
}
static int io_flush (lua_State *L) {
- return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);
+ FILE *f = getiofile(L, IO_OUTPUT);
+ errno = 0;
+ return luaL_fileresult(L, fflush(f) == 0, NULL);
}
static int f_flush (lua_State *L) {
- return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL);
+ FILE *f = tofile(L);
+ errno = 0;
+ return luaL_fileresult(L, fflush(f) == 0, NULL);
}
@@ -773,7 +786,7 @@ static const luaL_Reg meth[] = {
** metamethods for file handles
*/
static const luaL_Reg metameth[] = {
- {"__index", NULL}, /* place holder */
+ {"__index", NULL}, /* placeholder */
{"__gc", f_gc},
{"__close", f_gc},
{"__tostring", f_tostring},
diff --git a/3rdparty/lua/src/llex.c b/3rdparty/lua/src/llex.c
index e99151787a6..5fc39a5cdec 100644
--- a/3rdparty/lua/src/llex.c
+++ b/3rdparty/lua/src/llex.c
@@ -128,7 +128,7 @@ l_noret luaX_syntaxerror (LexState *ls, const char *msg) {
** ensuring there is only one copy of each unique string. The table
** here is used as a set: the string enters as the key, while its value
** is irrelevant. We use the string itself as the value only because it
-** is a TValue readly available. Later, the code generation can change
+** is a TValue readily available. Later, the code generation can change
** this value.
*/
TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
@@ -138,12 +138,12 @@ TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
if (!ttisnil(o)) /* string already present? */
ts = keystrval(nodefromval(o)); /* get saved copy */
else { /* not in use yet */
- TValue *stv = s2v(L->top++); /* reserve stack space for string */
+ TValue *stv = s2v(L->top.p++); /* reserve stack space for string */
setsvalue(L, stv, ts); /* temporarily anchor the string */
luaH_finishset(L, ls->h, stv, o, stv); /* t[string] = string */
/* table is not a metatable, so it does not need to invalidate cache */
luaC_checkGC(L);
- L->top--; /* remove string from stack */
+ L->top.p--; /* remove string from stack */
}
return ts;
}
diff --git a/3rdparty/lua/src/llimits.h b/3rdparty/lua/src/llimits.h
index 52a32f92e30..1c826f7be20 100644
--- a/3rdparty/lua/src/llimits.h
+++ b/3rdparty/lua/src/llimits.h
@@ -71,11 +71,24 @@ typedef signed char ls_byte;
/*
-** conversion of pointer to unsigned integer:
-** this is for hashing only; there is no problem if the integer
-** cannot hold the whole pointer value
+** conversion of pointer to unsigned integer: this is for hashing only;
+** there is no problem if the integer cannot hold the whole pointer
+** value. (In strict ISO C this may cause undefined behavior, but no
+** actual machine seems to bother.)
*/
-#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX))
+#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \
+ __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+#if defined(UINTPTR_MAX) /* even in C99 this type is optional */
+#define L_P2I uintptr_t
+#else /* no 'intptr'? */
+#define L_P2I uintmax_t /* use the largest available integer */
+#endif
+#else /* C89 option */
+#define L_P2I size_t
+#endif
+
+#define point2uint(p) ((unsigned int)((L_P2I)(p) & UINT_MAX))
diff --git a/3rdparty/lua/src/lmathlib.c b/3rdparty/lua/src/lmathlib.c
index e0c61a168d9..43810634808 100644
--- a/3rdparty/lua/src/lmathlib.c
+++ b/3rdparty/lua/src/lmathlib.c
@@ -249,6 +249,15 @@ static int math_type (lua_State *L) {
** ===================================================================
*/
+/*
+** This code uses lots of shifts. ANSI C does not allow shifts greater
+** than or equal to the width of the type being shifted, so some shifts
+** are written in convoluted ways to match that restriction. For
+** preprocessor tests, it assumes a width of 32 bits, so the maximum
+** shift there is 31 bits.
+*/
+
+
/* number of binary digits in the mantissa of a float */
#define FIGS l_floatatt(MANT_DIG)
@@ -267,20 +276,23 @@ static int math_type (lua_State *L) {
/* try to find an integer type with at least 64 bits */
-#if (ULONG_MAX >> 31 >> 31) >= 3
+#if ((ULONG_MAX >> 31) >> 31) >= 3
/* 'long' has at least 64 bits */
#define Rand64 unsigned long
+#define SRand64 long
#elif !defined(LUA_USE_C89) && defined(LLONG_MAX)
/* there is a 'long long' type (which must have at least 64 bits) */
#define Rand64 unsigned long long
+#define SRand64 long long
-#elif (LUA_MAXUNSIGNED >> 31 >> 31) >= 3
+#elif ((LUA_MAXUNSIGNED >> 31) >> 31) >= 3
-/* 'lua_Integer' has at least 64 bits */
+/* 'lua_Unsigned' has at least 64 bits */
#define Rand64 lua_Unsigned
+#define SRand64 lua_Integer
#endif
@@ -319,23 +331,30 @@ static Rand64 nextrand (Rand64 *state) {
}
-/* must take care to not shift stuff by more than 63 slots */
-
-
/*
** Convert bits from a random integer into a float in the
** interval [0,1), getting the higher FIG bits from the
** random unsigned integer and converting that to a float.
+** Some old Microsoft compilers cannot cast an unsigned long
+** to a floating-point number, so we use a signed long as an
+** intermediary. When lua_Number is float or double, the shift ensures
+** that 'sx' is non negative; in that case, a good compiler will remove
+** the correction.
*/
/* must throw out the extra (64 - FIGS) bits */
#define shift64_FIG (64 - FIGS)
-/* to scale to [0, 1), multiply by scaleFIG = 2^(-FIGS) */
+/* 2^(-FIGS) == 2^-1 / 2^(FIGS-1) */
#define scaleFIG (l_mathop(0.5) / ((Rand64)1 << (FIGS - 1)))
static lua_Number I2d (Rand64 x) {
- return (lua_Number)(trim64(x) >> shift64_FIG) * scaleFIG;
+ SRand64 sx = (SRand64)(trim64(x) >> shift64_FIG);
+ lua_Number res = (lua_Number)(sx) * scaleFIG;
+ if (sx < 0)
+ res += l_mathop(1.0); /* correct the two's complement if negative */
+ lua_assert(0 <= res && res < 1);
+ return res;
}
/* convert a 'Rand64' to a 'lua_Unsigned' */
@@ -471,8 +490,6 @@ static lua_Number I2d (Rand64 x) {
#else /* 32 < FIGS <= 64 */
-/* must take care to not shift stuff by more than 31 slots */
-
/* 2^(-FIGS) = 1.0 / 2^30 / 2^3 / 2^(FIGS-33) */
#define scaleFIG \
(l_mathop(1.0) / (UONE << 30) / l_mathop(8.0) / (UONE << (FIGS - 33)))
@@ -500,12 +517,12 @@ static lua_Number I2d (Rand64 x) {
/* convert a 'Rand64' to a 'lua_Unsigned' */
static lua_Unsigned I2UInt (Rand64 x) {
- return ((lua_Unsigned)trim32(x.h) << 31 << 1) | (lua_Unsigned)trim32(x.l);
+ return (((lua_Unsigned)trim32(x.h) << 31) << 1) | (lua_Unsigned)trim32(x.l);
}
/* convert a 'lua_Unsigned' to a 'Rand64' */
static Rand64 Int2I (lua_Unsigned n) {
- return packI((lu_int32)(n >> 31 >> 1), (lu_int32)n);
+ return packI((lu_int32)((n >> 31) >> 1), (lu_int32)n);
}
#endif /* } */
diff --git a/3rdparty/lua/src/lmem.c b/3rdparty/lua/src/lmem.c
index 9029d588c12..9800a86fc02 100644
--- a/3rdparty/lua/src/lmem.c
+++ b/3rdparty/lua/src/lmem.c
@@ -22,25 +22,6 @@
#include "lstate.h"
-#if defined(EMERGENCYGCTESTS)
-/*
-** First allocation will fail whenever not building initial state.
-** (This fail will trigger 'tryagain' and a full GC cycle at every
-** allocation.)
-*/
-static void *firsttry (global_State *g, void *block, size_t os, size_t ns) {
- if (completestate(g) && ns > 0) /* frees never fail */
- return NULL; /* fail */
- else /* normal allocation */
- return (*g->frealloc)(g->ud, block, os, ns);
-}
-#else
-#define firsttry(g,block,os,ns) ((*g->frealloc)(g->ud, block, os, ns))
-#endif
-
-
-
-
/*
** About the realloc function:
@@ -60,6 +41,43 @@ static void *firsttry (global_State *g, void *block, size_t os, size_t ns) {
*/
+/*
+** Macro to call the allocation function.
+*/
+#define callfrealloc(g,block,os,ns) ((*g->frealloc)(g->ud, block, os, ns))
+
+
+/*
+** When an allocation fails, it will try again after an emergency
+** collection, except when it cannot run a collection. The GC should
+** not be called while the state is not fully built, as the collector
+** is not yet fully initialized. Also, it should not be called when
+** 'gcstopem' is true, because then the interpreter is in the middle of
+** a collection step.
+*/
+#define cantryagain(g) (completestate(g) && !g->gcstopem)
+
+
+
+
+#if defined(EMERGENCYGCTESTS)
+/*
+** First allocation will fail except when freeing a block (frees never
+** fail) and when it cannot try again; this fail will trigger 'tryagain'
+** and a full GC cycle at every allocation.
+*/
+static void *firsttry (global_State *g, void *block, size_t os, size_t ns) {
+ if (ns > 0 && cantryagain(g))
+ return NULL; /* fail */
+ else /* normal allocation */
+ return callfrealloc(g, block, os, ns);
+}
+#else
+#define firsttry(g,block,os,ns) callfrealloc(g, block, os, ns)
+#endif
+
+
+
/*
@@ -132,7 +150,7 @@ l_noret luaM_toobig (lua_State *L) {
void luaM_free_ (lua_State *L, void *block, size_t osize) {
global_State *g = G(L);
lua_assert((osize == 0) == (block == NULL));
- (*g->frealloc)(g->ud, block, osize, 0);
+ callfrealloc(g, block, osize, 0);
g->GCdebt -= osize;
}
@@ -140,19 +158,15 @@ void luaM_free_ (lua_State *L, void *block, size_t osize) {
/*
** In case of allocation fail, this function will do an emergency
** collection to free some memory and then try the allocation again.
-** The GC should not be called while state is not fully built, as the
-** collector is not yet fully initialized. Also, it should not be called
-** when 'gcstopem' is true, because then the interpreter is in the
-** middle of a collection step.
*/
static void *tryagain (lua_State *L, void *block,
size_t osize, size_t nsize) {
global_State *g = G(L);
- if (completestate(g) && !g->gcstopem) {
+ if (cantryagain(g)) {
luaC_fullgc(L, 1); /* try to free some memory... */
- return (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
+ return callfrealloc(g, block, osize, nsize); /* try again */
}
- else return NULL; /* cannot free any memory without a full state */
+ else return NULL; /* cannot run an emergency collection */
}
diff --git a/3rdparty/lua/src/loadlib.c b/3rdparty/lua/src/loadlib.c
index 6f9fa37366e..6d289fcebb8 100644
--- a/3rdparty/lua/src/loadlib.c
+++ b/3rdparty/lua/src/loadlib.c
@@ -25,15 +25,6 @@
/*
-** LUA_IGMARK is a mark to ignore all before it when building the
-** luaopen_ function name.
-*/
-#if !defined (LUA_IGMARK)
-#define LUA_IGMARK "-"
-#endif
-
-
-/*
** LUA_CSUBSEP is the character that replaces dots in submodule names
** when searching for a C loader.
** LUA_LSUBSEP is the character that replaces dots in submodule names
@@ -708,8 +699,13 @@ static const luaL_Reg ll_funcs[] = {
static void createsearcherstable (lua_State *L) {
- static const lua_CFunction searchers[] =
- {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL};
+ static const lua_CFunction searchers[] = {
+ searcher_preload,
+ searcher_Lua,
+ searcher_C,
+ searcher_Croot,
+ NULL
+ };
int i;
/* create 'searchers' table */
lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0);
diff --git a/3rdparty/lua/src/lobject.c b/3rdparty/lua/src/lobject.c
index 301aa900be0..9cfa5227eb4 100644
--- a/3rdparty/lua/src/lobject.c
+++ b/3rdparty/lua/src/lobject.c
@@ -62,7 +62,7 @@ static lua_Integer intarith (lua_State *L, int op, lua_Integer v1,
case LUA_OPBOR: return intop(|, v1, v2);
case LUA_OPBXOR: return intop(^, v1, v2);
case LUA_OPSHL: return luaV_shiftl(v1, v2);
- case LUA_OPSHR: return luaV_shiftl(v1, -v2);
+ case LUA_OPSHR: return luaV_shiftr(v1, v2);
case LUA_OPUNM: return intop(-, 0, v1);
case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);
default: lua_assert(0); return 0;
@@ -386,29 +386,39 @@ void luaO_tostring (lua_State *L, TValue *obj) {
** ===================================================================
*/
-/* size for buffer space used by 'luaO_pushvfstring' */
-#define BUFVFS 200
+/*
+** Size for buffer space used by 'luaO_pushvfstring'. It should be
+** (LUA_IDSIZE + MAXNUMBER2STR) + a minimal space for basic messages,
+** so that 'luaG_addinfo' can work directly on the buffer.
+*/
+#define BUFVFS (LUA_IDSIZE + MAXNUMBER2STR + 95)
/* buffer used by 'luaO_pushvfstring' */
typedef struct BuffFS {
lua_State *L;
- int pushed; /* number of string pieces already on the stack */
+ int pushed; /* true if there is a part of the result on the stack */
int blen; /* length of partial string in 'space' */
char space[BUFVFS]; /* holds last part of the result */
} BuffFS;
/*
-** Push given string to the stack, as part of the buffer, and
-** join the partial strings in the stack into one.
+** Push given string to the stack, as part of the result, and
+** join it to previous partial result if there is one.
+** It may call 'luaV_concat' while using one slot from EXTRA_STACK.
+** This call cannot invoke metamethods, as both operands must be
+** strings. It can, however, raise an error if the result is too
+** long. In that case, 'luaV_concat' frees the extra slot before
+** raising the error.
*/
-static void pushstr (BuffFS *buff, const char *str, size_t l) {
+static void pushstr (BuffFS *buff, const char *str, size_t lstr) {
lua_State *L = buff->L;
- setsvalue2s(L, L->top, luaS_newlstr(L, str, l));
- L->top++; /* may use one extra slot */
- buff->pushed++;
- luaV_concat(L, buff->pushed); /* join partial results into one */
- buff->pushed = 1;
+ setsvalue2s(L, L->top.p, luaS_newlstr(L, str, lstr));
+ L->top.p++; /* may use one slot from EXTRA_STACK */
+ if (!buff->pushed) /* no previous string on the stack? */
+ buff->pushed = 1; /* now there is one */
+ else /* join previous string with new one */
+ luaV_concat(L, 2);
}
@@ -454,7 +464,7 @@ static void addstr2buff (BuffFS *buff, const char *str, size_t slen) {
/*
-** Add a number to the buffer.
+** Add a numeral to the buffer.
*/
static void addnum2buff (BuffFS *buff, TValue *num) {
char *numbuff = getbuff(buff, MAXNUMBER2STR);
@@ -532,7 +542,7 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */
clearbuff(&buff); /* empty buffer into the stack */
lua_assert(buff.pushed == 1);
- return svalue(s2v(L->top - 1));
+ return getstr(tsvalue(s2v(L->top.p - 1)));
}
diff --git a/3rdparty/lua/src/lobject.h b/3rdparty/lua/src/lobject.h
index 0e05b3e42ea..980e42f8c27 100644
--- a/3rdparty/lua/src/lobject.h
+++ b/3rdparty/lua/src/lobject.h
@@ -52,6 +52,8 @@ typedef union Value {
lua_CFunction f; /* light C functions */
lua_Integer i; /* integer numbers */
lua_Number n; /* float numbers */
+ /* not used, but may avoid warnings for uninitialized value */
+ lu_byte ub;
} Value;
@@ -155,6 +157,17 @@ typedef union StackValue {
/* index to stack elements */
typedef StackValue *StkId;
+
+/*
+** When reallocating the stack, change all pointers to the stack into
+** proper offsets.
+*/
+typedef union {
+ StkId p; /* actual pointer */
+ ptrdiff_t offset; /* used while the stack is being reallocated */
+} StkIdRel;
+
+
/* convert a 'StackValue' to a 'TValue' */
#define s2v(o) (&(o)->val)
@@ -373,7 +386,7 @@ typedef struct GCObject {
typedef struct TString {
CommonHeader;
lu_byte extra; /* reserved words for short strings; "has hash" for longs */
- lu_byte shrlen; /* length for short strings */
+ lu_byte shrlen; /* length for short strings, 0xFF for long strings */
unsigned int hash;
union {
size_t lnglen; /* length for long strings */
@@ -385,19 +398,17 @@ typedef struct TString {
/*
-** Get the actual string (array of bytes) from a 'TString'.
+** Get the actual string (array of bytes) from a 'TString'. (Generic
+** version and specialized versions for long and short strings.)
*/
-#define getstr(ts) ((ts)->contents)
-
+#define getstr(ts) ((ts)->contents)
+#define getlngstr(ts) check_exp((ts)->shrlen == 0xFF, (ts)->contents)
+#define getshrstr(ts) check_exp((ts)->shrlen != 0xFF, (ts)->contents)
-/* get the actual string (array of bytes) from a Lua value */
-#define svalue(o) getstr(tsvalue(o))
/* get string length from 'TString *s' */
-#define tsslen(s) ((s)->tt == LUA_VSHRSTR ? (s)->shrlen : (s)->u.lnglen)
-
-/* get string length from 'TValue *o' */
-#define vslen(o) tsslen(tsvalue(o))
+#define tsslen(s) \
+ ((s)->shrlen != 0xFF ? (s)->shrlen : (s)->u.lnglen)
/* }================================================================== */
@@ -615,8 +626,10 @@ typedef struct Proto {
*/
typedef struct UpVal {
CommonHeader;
- lu_byte tbc; /* true if it represents a to-be-closed variable */
- TValue *v; /* points to stack or to its own value */
+ union {
+ TValue *p; /* points to stack or to its own value */
+ ptrdiff_t offset; /* used while the stack is being reallocated */
+ } v;
union {
struct { /* (when open) */
struct UpVal *next; /* linked list */
diff --git a/3rdparty/lua/src/lopcodes.h b/3rdparty/lua/src/lopcodes.h
index 7c274515960..46911cac14e 100644
--- a/3rdparty/lua/src/lopcodes.h
+++ b/3rdparty/lua/src/lopcodes.h
@@ -21,7 +21,7 @@ iABC C(8) | B(8) |k| A(8) | Op(7) |
iABx Bx(17) | A(8) | Op(7) |
iAsBx sBx (signed)(17) | A(8) | Op(7) |
iAx Ax(25) | Op(7) |
-isJ sJ(25) | Op(7) |
+isJ sJ (signed)(25) | Op(7) |
A signed argument is represented in excess K: the represented value is
the written unsigned value minus K, where K is half the maximum for the
@@ -210,15 +210,15 @@ OP_LOADNIL,/* A B R[A], R[A+1], ..., R[A+B] := nil */
OP_GETUPVAL,/* A B R[A] := UpValue[B] */
OP_SETUPVAL,/* A B UpValue[B] := R[A] */
-OP_GETTABUP,/* A B C R[A] := UpValue[B][K[C]:string] */
+OP_GETTABUP,/* A B C R[A] := UpValue[B][K[C]:shortstring] */
OP_GETTABLE,/* A B C R[A] := R[B][R[C]] */
OP_GETI,/* A B C R[A] := R[B][C] */
-OP_GETFIELD,/* A B C R[A] := R[B][K[C]:string] */
+OP_GETFIELD,/* A B C R[A] := R[B][K[C]:shortstring] */
-OP_SETTABUP,/* A B C UpValue[A][K[B]:string] := RK(C) */
+OP_SETTABUP,/* A B C UpValue[A][K[B]:shortstring] := RK(C) */
OP_SETTABLE,/* A B C R[A][R[B]] := RK(C) */
OP_SETI,/* A B C R[A][B] := RK(C) */
-OP_SETFIELD,/* A B C R[A][K[B]:string] := RK(C) */
+OP_SETFIELD,/* A B C R[A][K[B]:shortstring] := RK(C) */
OP_NEWTABLE,/* A B C k R[A] := {} */
diff --git a/3rdparty/lua/src/loslib.c b/3rdparty/lua/src/loslib.c
index 3e20d622bac..ba80d72c457 100644
--- a/3rdparty/lua/src/loslib.c
+++ b/3rdparty/lua/src/loslib.c
@@ -30,23 +30,14 @@
*/
#if !defined(LUA_STRFTIMEOPTIONS) /* { */
-/* options for ANSI C 89 (only 1-char options) */
-#define L_STRFTIMEC89 "aAbBcdHIjmMpSUwWxXyYZ%"
-
-/* options for ISO C 99 and POSIX */
-#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
- "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */
-
-/* options for Windows */
-#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \
- "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */
-
#if defined(LUA_USE_WINDOWS)
-#define LUA_STRFTIMEOPTIONS L_STRFTIMEWIN
-#elif defined(LUA_USE_C89)
-#define LUA_STRFTIMEOPTIONS L_STRFTIMEC89
+#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYzZ%" \
+ "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */
+#elif defined(LUA_USE_C89) /* ANSI C 89 (only 1-char options) */
+#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYZ%"
#else /* C99 specification */
-#define LUA_STRFTIMEOPTIONS L_STRFTIMEC99
+#define LUA_STRFTIMEOPTIONS "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
+ "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */
#endif
#endif /* } */
@@ -138,12 +129,21 @@
/* }================================================================== */
+#if !defined(l_system)
+#if defined(LUA_USE_IOS)
+/* Despite claiming to be ISO C, iOS does not implement 'system'. */
+#define l_system(cmd) ((cmd) == NULL ? 0 : -1)
+#else
+#define l_system(cmd) system(cmd) /* default definition */
+#endif
+#endif
+
static int os_execute (lua_State *L) {
const char *cmd = luaL_optstring(L, 1, NULL);
int stat;
errno = 0;
- stat = system(cmd);
+ stat = l_system(cmd);
if (cmd != NULL)
return luaL_execresult(L, stat);
else {
@@ -155,6 +155,7 @@ static int os_execute (lua_State *L) {
static int os_remove (lua_State *L) {
const char *filename = luaL_checkstring(L, 1);
+ errno = 0;
return luaL_fileresult(L, remove(filename) == 0, filename);
}
@@ -162,6 +163,7 @@ static int os_remove (lua_State *L) {
static int os_rename (lua_State *L) {
const char *fromname = luaL_checkstring(L, 1);
const char *toname = luaL_checkstring(L, 2);
+ errno = 0;
return luaL_fileresult(L, rename(fromname, toname) == 0, NULL);
}
@@ -260,9 +262,7 @@ static int getfield (lua_State *L, const char *key, int d, int delta) {
res = d;
}
else {
- /* unsigned avoids overflow when lua_Integer has 32 bits */
- if (!(res >= 0 ? (lua_Unsigned)res <= (lua_Unsigned)INT_MAX + delta
- : (lua_Integer)INT_MIN + delta <= res))
+ if (!(res >= 0 ? res - delta <= INT_MAX : INT_MIN + delta <= res))
return luaL_error(L, "field '%s' is out-of-bound", key);
res -= delta;
}
diff --git a/3rdparty/lua/src/lparser.c b/3rdparty/lua/src/lparser.c
index 3abe3d75187..2b888c7cff1 100644
--- a/3rdparty/lua/src/lparser.c
+++ b/3rdparty/lua/src/lparser.c
@@ -468,6 +468,7 @@ static void singlevar (LexState *ls, expdesc *var) {
expdesc key;
singlevaraux(fs, ls->envn, var, 1); /* get environment variable */
lua_assert(var->k != VVOID); /* this one must exist */
+ luaK_exp2anyregup(fs, var); /* but could be a constant */
codestring(&key, varname); /* key is variable name */
luaK_indexed(fs, var, &key); /* env[varname] */
}
@@ -520,12 +521,12 @@ static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) {
/*
** Solves the goto at index 'g' to given 'label' and removes it
-** from the list of pending goto's.
+** from the list of pending gotos.
** If it jumps into the scope of some variable, raises an error.
*/
static void solvegoto (LexState *ls, int g, Labeldesc *label) {
int i;
- Labellist *gl = &ls->dyd->gt; /* list of goto's */
+ Labellist *gl = &ls->dyd->gt; /* list of gotos */
Labeldesc *gt = &gl->arr[g]; /* goto to be resolved */
lua_assert(eqstr(gt->name, label->name));
if (l_unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */
@@ -579,7 +580,7 @@ static int newgotoentry (LexState *ls, TString *name, int line, int pc) {
/*
** Solves forward jumps. Check whether new label 'lb' matches any
** pending gotos in current block and solves them. Return true
-** if any of the goto's need to close upvalues.
+** if any of the gotos need to close upvalues.
*/
static int solvegotos (LexState *ls, Labeldesc *lb) {
Labellist *gl = &ls->dyd->gt;
@@ -600,7 +601,7 @@ static int solvegotos (LexState *ls, Labeldesc *lb) {
/*
** Create a new label with the given 'name' at the given 'line'.
** 'last' tells whether label is the last non-op statement in its
-** block. Solves all pending goto's to this new label and adds
+** block. Solves all pending gotos to this new label and adds
** a close instruction if necessary.
** Returns true iff it added a close instruction.
*/
@@ -673,19 +674,19 @@ static void leaveblock (FuncState *fs) {
LexState *ls = fs->ls;
int hasclose = 0;
int stklevel = reglevel(fs, bl->nactvar); /* level outside the block */
- if (bl->isloop) /* fix pending breaks? */
+ removevars(fs, bl->nactvar); /* remove block locals */
+ lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */
+ if (bl->isloop) /* has to fix pending breaks? */
hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0);
- if (!hasclose && bl->previous && bl->upval)
+ if (!hasclose && bl->previous && bl->upval) /* still need a 'close'? */
luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0);
- fs->bl = bl->previous;
- removevars(fs, bl->nactvar);
- lua_assert(bl->nactvar == fs->nactvar);
fs->freereg = stklevel; /* free registers */
ls->dyd->label.n = bl->firstlabel; /* remove local labels */
- if (bl->previous) /* inner block? */
- movegotosout(fs, bl); /* update pending gotos to outer block */
+ fs->bl = bl->previous; /* current block now is previous one */
+ if (bl->previous) /* was it a nested block? */
+ movegotosout(fs, bl); /* update pending gotos to enclosing block */
else {
- if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */
+ if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */
undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */
}
}
@@ -1021,10 +1022,11 @@ static int explist (LexState *ls, expdesc *v) {
}
-static void funcargs (LexState *ls, expdesc *f, int line) {
+static void funcargs (LexState *ls, expdesc *f) {
FuncState *fs = ls->fs;
expdesc args;
int base, nparams;
+ int line = ls->linenumber;
switch (ls->t.token) {
case '(': { /* funcargs -> '(' [ explist ] ')' */
luaX_next(ls);
@@ -1062,8 +1064,8 @@ static void funcargs (LexState *ls, expdesc *f, int line) {
}
init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
luaK_fixline(fs, line);
- fs->freereg = base+1; /* call remove function and arguments and leaves
- (unless changed) one result */
+ fs->freereg = base+1; /* call removes function and arguments and leaves
+ one result (unless changed later) */
}
@@ -1102,7 +1104,6 @@ static void suffixedexp (LexState *ls, expdesc *v) {
/* suffixedexp ->
primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
FuncState *fs = ls->fs;
- int line = ls->linenumber;
primaryexp(ls, v);
for (;;) {
switch (ls->t.token) {
@@ -1122,12 +1123,12 @@ static void suffixedexp (LexState *ls, expdesc *v) {
luaX_next(ls);
codename(ls, &key);
luaK_self(fs, v, &key);
- funcargs(ls, v, line);
+ funcargs(ls, v);
break;
}
case '(': case TK_STRING: case '{': { /* funcargs */
luaK_exp2nextreg(fs, v);
- funcargs(ls, v, line);
+ funcargs(ls, v);
break;
}
default: return;
@@ -1943,10 +1944,10 @@ LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
LexState lexstate;
FuncState funcstate;
LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */
- setclLvalue2s(L, L->top, cl); /* anchor it (to avoid being collected) */
+ setclLvalue2s(L, L->top.p, cl); /* anchor it (to avoid being collected) */
luaD_inctop(L);
lexstate.h = luaH_new(L); /* create table for scanner */
- sethvalue2s(L, L->top, lexstate.h); /* anchor it */
+ sethvalue2s(L, L->top.p, lexstate.h); /* anchor it */
luaD_inctop(L);
funcstate.f = cl->p = luaF_newproto(L);
luaC_objbarrier(L, cl, cl->p);
@@ -1960,7 +1961,7 @@ LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
/* all scopes should be correctly finished */
lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
- L->top--; /* remove scanner's table */
+ L->top.p--; /* remove scanner's table */
return cl; /* closure is on the stack, too */
}
diff --git a/3rdparty/lua/src/lstate.c b/3rdparty/lua/src/lstate.c
index 1ffe1a0f71c..7fefacba2c1 100644
--- a/3rdparty/lua/src/lstate.c
+++ b/3rdparty/lua/src/lstate.c
@@ -119,7 +119,7 @@ CallInfo *luaE_extendCI (lua_State *L) {
/*
** free all CallInfo structures not in use by a thread
*/
-void luaE_freeCI (lua_State *L) {
+static void freeCI (lua_State *L) {
CallInfo *ci = L->ci;
CallInfo *next = ci->next;
ci->next = NULL;
@@ -180,33 +180,33 @@ LUAI_FUNC void luaE_incCstack (lua_State *L) {
static void stack_init (lua_State *L1, lua_State *L) {
int i; CallInfo *ci;
/* initialize stack array */
- L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue);
- L1->tbclist = L1->stack;
+ L1->stack.p = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue);
+ L1->tbclist.p = L1->stack.p;
for (i = 0; i < BASIC_STACK_SIZE + EXTRA_STACK; i++)
- setnilvalue(s2v(L1->stack + i)); /* erase new stack */
- L1->top = L1->stack;
- L1->stack_last = L1->stack + BASIC_STACK_SIZE;
+ setnilvalue(s2v(L1->stack.p + i)); /* erase new stack */
+ L1->top.p = L1->stack.p;
+ L1->stack_last.p = L1->stack.p + BASIC_STACK_SIZE;
/* initialize first ci */
ci = &L1->base_ci;
ci->next = ci->previous = NULL;
ci->callstatus = CIST_C;
- ci->func = L1->top;
+ ci->func.p = L1->top.p;
ci->u.c.k = NULL;
ci->nresults = 0;
- setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */
- L1->top++;
- ci->top = L1->top + LUA_MINSTACK;
+ setnilvalue(s2v(L1->top.p)); /* 'function' entry for this 'ci' */
+ L1->top.p++;
+ ci->top.p = L1->top.p + LUA_MINSTACK;
L1->ci = ci;
}
static void freestack (lua_State *L) {
- if (L->stack == NULL)
+ if (L->stack.p == NULL)
return; /* stack not completely built yet */
L->ci = &L->base_ci; /* free the entire 'ci' list */
- luaE_freeCI(L);
+ freeCI(L);
lua_assert(L->nci == 0);
- luaM_freearray(L, L->stack, stacksize(L) + EXTRA_STACK); /* free stack */
+ luaM_freearray(L, L->stack.p, stacksize(L) + EXTRA_STACK); /* free stack */
}
@@ -248,7 +248,7 @@ static void f_luaopen (lua_State *L, void *ud) {
*/
static void preinit_thread (lua_State *L, global_State *g) {
G(L) = g;
- L->stack = NULL;
+ L->stack.p = NULL;
L->ci = NULL;
L->nci = 0;
L->twups = L; /* thread has no upvalues */
@@ -284,20 +284,16 @@ static void close_state (lua_State *L) {
LUA_API lua_State *lua_newthread (lua_State *L) {
- global_State *g;
+ global_State *g = G(L);
+ GCObject *o;
lua_State *L1;
lua_lock(L);
- g = G(L);
luaC_checkGC(L);
/* create new thread */
- L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
- L1->marked = luaC_white(g);
- L1->tt = LUA_VTHREAD;
- /* link it on list 'allgc' */
- L1->next = g->allgc;
- g->allgc = obj2gco(L1);
+ o = luaC_newobjdt(L, LUA_TTHREAD, sizeof(LX), offsetof(LX, l));
+ L1 = gco2th(o);
/* anchor it on L stack */
- setthvalue2s(L, L->top, L1);
+ setthvalue2s(L, L->top.p, L1);
api_incr_top(L);
preinit_thread(L1, g);
L1->hookmask = L->hookmask;
@@ -316,7 +312,7 @@ LUA_API lua_State *lua_newthread (lua_State *L) {
void luaE_freethread (lua_State *L, lua_State *L1) {
LX *l = fromstate(L1);
- luaF_closeupval(L1, L1->stack); /* close all upvalues */
+ luaF_closeupval(L1, L1->stack.p); /* close all upvalues */
lua_assert(L1->openupval == NULL);
luai_userstatefree(L, L1);
freestack(L1);
@@ -326,32 +322,41 @@ void luaE_freethread (lua_State *L, lua_State *L1) {
int luaE_resetthread (lua_State *L, int status) {
CallInfo *ci = L->ci = &L->base_ci; /* unwind CallInfo list */
- setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */
- ci->func = L->stack;
+ setnilvalue(s2v(L->stack.p)); /* 'function' entry for basic 'ci' */
+ ci->func.p = L->stack.p;
ci->callstatus = CIST_C;
if (status == LUA_YIELD)
status = LUA_OK;
L->status = LUA_OK; /* so it can run __close metamethods */
status = luaD_closeprotected(L, 1, status);
if (status != LUA_OK) /* errors? */
- luaD_seterrorobj(L, status, L->stack + 1);
+ luaD_seterrorobj(L, status, L->stack.p + 1);
else
- L->top = L->stack + 1;
- ci->top = L->top + LUA_MINSTACK;
- luaD_reallocstack(L, cast_int(ci->top - L->stack), 0);
+ L->top.p = L->stack.p + 1;
+ ci->top.p = L->top.p + LUA_MINSTACK;
+ luaD_reallocstack(L, cast_int(ci->top.p - L->stack.p), 0);
return status;
}
-LUA_API int lua_resetthread (lua_State *L) {
+LUA_API int lua_closethread (lua_State *L, lua_State *from) {
int status;
lua_lock(L);
+ L->nCcalls = (from) ? getCcalls(from) : 0;
status = luaE_resetthread(L, L->status);
lua_unlock(L);
return status;
}
+/*
+** Deprecated! Use 'lua_closethread' instead.
+*/
+LUA_API int lua_resetthread (lua_State *L) {
+ return lua_closethread(L, NULL);
+}
+
+
LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
int i;
lua_State *L;
@@ -426,9 +431,9 @@ void luaE_warning (lua_State *L, const char *msg, int tocont) {
** Generate a warning from an error message
*/
void luaE_warnerror (lua_State *L, const char *where) {
- TValue *errobj = s2v(L->top - 1); /* error object */
+ TValue *errobj = s2v(L->top.p - 1); /* error object */
const char *msg = (ttisstring(errobj))
- ? svalue(errobj)
+ ? getstr(tsvalue(errobj))
: "error object is not a string";
/* produce warning "error in %s (%s)" (where, msg) */
luaE_warning(L, "error in ", 1);
diff --git a/3rdparty/lua/src/lstate.h b/3rdparty/lua/src/lstate.h
index 61e82cde725..007704c826b 100644
--- a/3rdparty/lua/src/lstate.h
+++ b/3rdparty/lua/src/lstate.h
@@ -9,6 +9,11 @@
#include "lua.h"
+
+/* Some header files included here need this definition */
+typedef struct CallInfo CallInfo;
+
+
#include "lobject.h"
#include "ltm.h"
#include "lzio.h"
@@ -139,7 +144,7 @@ struct lua_longjmp; /* defined in ldo.c */
#define BASIC_STACK_SIZE (2*LUA_MINSTACK)
-#define stacksize(th) cast_int((th)->stack_last - (th)->stack)
+#define stacksize(th) cast_int((th)->stack_last.p - (th)->stack.p)
/* kinds of Garbage Collection */
@@ -169,14 +174,14 @@ typedef struct stringtable {
** - field 'transferinfo' is used only during call/returnhooks,
** before the function starts or after it ends.
*/
-typedef struct CallInfo {
- StkId func; /* function index in the stack */
- StkId top; /* top for this function */
+struct CallInfo {
+ StkIdRel func; /* function index in the stack */
+ StkIdRel top; /* top for this function */
struct CallInfo *previous, *next; /* dynamic call link */
union {
struct { /* only for Lua functions */
const Instruction *savedpc;
- volatile l_signalT trap;
+ volatile l_signalT trap; /* function is tracing lines/counts */
int nextraargs; /* # of extra arguments in vararg functions */
} l;
struct { /* only for C functions */
@@ -196,7 +201,7 @@ typedef struct CallInfo {
} u2;
short nresults; /* expected number of results from this function */
unsigned short callstatus;
-} CallInfo;
+};
/*
@@ -291,7 +296,7 @@ typedef struct global_State {
struct lua_State *mainthread;
TString *memerrmsg; /* message for memory-allocation errors */
TString *tmname[TM_N]; /* array with tag-method names */
- struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */
+ struct Table *mt[LUA_NUMTYPES]; /* metatables for basic types */
TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */
lua_WarnFunction warnf; /* warning function */
void *ud_warn; /* auxiliary data to 'warnf' */
@@ -306,13 +311,13 @@ struct lua_State {
lu_byte status;
lu_byte allowhook;
unsigned short nci; /* number of items in 'ci' list */
- StkId top; /* first free slot in the stack */
+ StkIdRel top; /* first free slot in the stack */
global_State *l_G;
CallInfo *ci; /* call info for current function */
- StkId stack_last; /* end of stack (last element + 1) */
- StkId stack; /* stack base */
+ StkIdRel stack_last; /* end of stack (last element + 1) */
+ StkIdRel stack; /* stack base */
UpVal *openupval; /* list of open upvalues in this stack */
- StkId tbclist; /* list of to-be-closed variables */
+ StkIdRel tbclist; /* list of to-be-closed variables */
GCObject *gclist;
struct lua_State *twups; /* list of threads with open upvalues */
struct lua_longjmp *errorJmp; /* current error recover point */
@@ -391,7 +396,6 @@ union GCUnion {
LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);
LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);
-LUAI_FUNC void luaE_freeCI (lua_State *L);
LUAI_FUNC void luaE_shrinkCI (lua_State *L);
LUAI_FUNC void luaE_checkcstack (lua_State *L);
LUAI_FUNC void luaE_incCstack (lua_State *L);
diff --git a/3rdparty/lua/src/lstring.c b/3rdparty/lua/src/lstring.c
index 13dcaf4259b..97757355c0b 100644
--- a/3rdparty/lua/src/lstring.c
+++ b/3rdparty/lua/src/lstring.c
@@ -36,7 +36,7 @@ int luaS_eqlngstr (TString *a, TString *b) {
lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR);
return (a == b) || /* same instance or... */
((len == b->u.lnglen) && /* equal length and ... */
- (memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */
+ (memcmp(getlngstr(a), getlngstr(b), len) == 0)); /* equal contents */
}
@@ -52,7 +52,7 @@ unsigned int luaS_hashlongstr (TString *ts) {
lua_assert(ts->tt == LUA_VLNGSTR);
if (ts->extra == 0) { /* no hash? */
size_t len = ts->u.lnglen;
- ts->hash = luaS_hash(getstr(ts), len, ts->hash);
+ ts->hash = luaS_hash(getlngstr(ts), len, ts->hash);
ts->extra = 1; /* now it has its hash */
}
return ts->hash;
@@ -157,6 +157,7 @@ static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) {
TString *luaS_createlngstrobj (lua_State *L, size_t l) {
TString *ts = createstrobj(L, l, LUA_VLNGSTR, G(L)->seed);
ts->u.lnglen = l;
+ ts->shrlen = 0xFF; /* signals that it is a long string */
return ts;
}
@@ -193,7 +194,7 @@ static TString *internshrstr (lua_State *L, const char *str, size_t l) {
TString **list = &tb->hash[lmod(h, tb->size)];
lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */
for (ts = *list; ts != NULL; ts = ts->u.hnext) {
- if (l == ts->shrlen && (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {
+ if (l == ts->shrlen && (memcmp(str, getshrstr(ts), l * sizeof(char)) == 0)) {
/* found! */
if (isdead(g, ts)) /* dead (but not collected yet)? */
changewhite(ts); /* resurrect it */
@@ -206,8 +207,8 @@ static TString *internshrstr (lua_State *L, const char *str, size_t l) {
list = &tb->hash[lmod(h, tb->size)]; /* rehash with new size */
}
ts = createstrobj(L, l, LUA_VSHRSTR, h);
- memcpy(getstr(ts), str, l * sizeof(char));
ts->shrlen = cast_byte(l);
+ memcpy(getshrstr(ts), str, l * sizeof(char));
ts->u.hnext = *list;
*list = ts;
tb->nuse++;
@@ -223,10 +224,10 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
return internshrstr(L, str, l);
else {
TString *ts;
- if (l_unlikely(l >= (MAX_SIZE - sizeof(TString))/sizeof(char)))
+ if (l_unlikely(l * sizeof(char) >= (MAX_SIZE - sizeof(TString))))
luaM_toobig(L);
ts = luaS_createlngstrobj(L, l);
- memcpy(getstr(ts), str, l * sizeof(char));
+ memcpy(getlngstr(ts), str, l * sizeof(char));
return ts;
}
}
diff --git a/3rdparty/lua/src/lstrlib.c b/3rdparty/lua/src/lstrlib.c
index 0b4fdbb7b5b..03167161df1 100644
--- a/3rdparty/lua/src/lstrlib.c
+++ b/3rdparty/lua/src/lstrlib.c
@@ -570,7 +570,7 @@ static const char *match_capture (MatchState *ms, const char *s, int l) {
static const char *match (MatchState *ms, const char *s, const char *p) {
if (l_unlikely(ms->matchdepth-- == 0))
luaL_error(ms->L, "pattern too complex");
- init: /* using goto's to optimize tail recursion */
+ init: /* using goto to optimize tail recursion */
if (p != ms->p_end) { /* end of pattern? */
switch (*p) {
case '(': { /* start capture */
diff --git a/3rdparty/lua/src/ltable.c b/3rdparty/lua/src/ltable.c
index 1b1cd2415b6..3353c047939 100644
--- a/3rdparty/lua/src/ltable.c
+++ b/3rdparty/lua/src/ltable.c
@@ -107,7 +107,7 @@ static const TValue absentkey = {ABSTKEYCONSTANT};
*/
static Node *hashint (const Table *t, lua_Integer i) {
lua_Unsigned ui = l_castS2U(i);
- if (ui <= (unsigned int)INT_MAX)
+ if (ui <= cast_uint(INT_MAX))
return hashmod(t, cast_int(ui));
else
return hashmod(t, ui);
@@ -252,15 +252,17 @@ LUAI_FUNC unsigned int luaH_realasize (const Table *t) {
return t->alimit; /* this is the size */
else {
unsigned int size = t->alimit;
- /* compute the smallest power of 2 not smaller than 'n' */
+ /* compute the smallest power of 2 not smaller than 'size' */
size |= (size >> 1);
size |= (size >> 2);
size |= (size >> 4);
size |= (size >> 8);
+#if (UINT_MAX >> 14) > 3 /* unsigned int has more than 16 bits */
size |= (size >> 16);
#if (UINT_MAX >> 30) > 3
size |= (size >> 32); /* unsigned int has more than 32 bits */
#endif
+#endif
size++;
lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size);
return size;
@@ -488,7 +490,7 @@ static void setnodevector (lua_State *L, Table *t, unsigned int size) {
luaG_runerror(L, "table overflow");
size = twoto(lsize);
t->node = luaM_newvector(L, size, Node);
- for (i = 0; i < (int)size; i++) {
+ for (i = 0; i < cast_int(size); i++) {
Node *n = gnode(t, i);
gnext(n) = 0;
setnilkey(n);
@@ -660,7 +662,8 @@ static Node *getfreepos (Table *t) {
** put new key in its main position; otherwise (colliding node is in its main
** position), new key goes to an empty position.
*/
-void luaH_newkey (lua_State *L, Table *t, const TValue *key, TValue *value) {
+static void luaH_newkey (lua_State *L, Table *t, const TValue *key,
+ TValue *value) {
Node *mp;
TValue aux;
if (l_unlikely(ttisnil(key)))
@@ -719,22 +722,36 @@ void luaH_newkey (lua_State *L, Table *t, const TValue *key, TValue *value) {
/*
** Search function for integers. If integer is inside 'alimit', get it
-** directly from the array part. Otherwise, if 'alimit' is not equal to
-** the real size of the array, key still can be in the array part. In
-** this case, try to avoid a call to 'luaH_realasize' when key is just
-** one more than the limit (so that it can be incremented without
-** changing the real size of the array).
+** directly from the array part. Otherwise, if 'alimit' is not
+** the real size of the array, the key still can be in the array part.
+** In this case, do the "Xmilia trick" to check whether 'key-1' is
+** smaller than the real size.
+** The trick works as follow: let 'p' be an integer such that
+** '2^(p+1) >= alimit > 2^p', or '2^(p+1) > alimit-1 >= 2^p'.
+** That is, 2^(p+1) is the real size of the array, and 'p' is the highest
+** bit on in 'alimit-1'. What we have to check becomes 'key-1 < 2^(p+1)'.
+** We compute '(key-1) & ~(alimit-1)', which we call 'res'; it will
+** have the 'p' bit cleared. If the key is outside the array, that is,
+** 'key-1 >= 2^(p+1)', then 'res' will have some bit on higher than 'p',
+** therefore it will be larger or equal to 'alimit', and the check
+** will fail. If 'key-1 < 2^(p+1)', then 'res' has no bit on higher than
+** 'p', and as the bit 'p' itself was cleared, 'res' will be smaller
+** than 2^p, therefore smaller than 'alimit', and the check succeeds.
+** As special cases, when 'alimit' is 0 the condition is trivially false,
+** and when 'alimit' is 1 the condition simplifies to 'key-1 < alimit'.
+** If key is 0 or negative, 'res' will have its higher bit on, so that
+** if cannot be smaller than alimit.
*/
const TValue *luaH_getint (Table *t, lua_Integer key) {
- if (l_castS2U(key) - 1u < t->alimit) /* 'key' in [1, t->alimit]? */
+ lua_Unsigned alimit = t->alimit;
+ if (l_castS2U(key) - 1u < alimit) /* 'key' in [1, t->alimit]? */
return &t->array[key - 1];
- else if (!limitequalsasize(t) && /* key still may be in the array part? */
- (l_castS2U(key) == t->alimit + 1 ||
- l_castS2U(key) - 1u < luaH_realasize(t))) {
+ else if (!isrealasize(t) && /* key still may be in the array part? */
+ (((l_castS2U(key) - 1u) & ~(alimit - 1u)) < alimit)) {
t->alimit = cast_uint(key); /* probably '#t' is here now */
return &t->array[key - 1];
}
- else {
+ else { /* key is not in the array part; check the hash */
Node *n = hashint(t, key);
for (;;) { /* check whether 'key' is somewhere in the chain */
if (keyisinteger(n) && keyival(n) == key)
@@ -975,6 +992,4 @@ Node *luaH_mainposition (const Table *t, const TValue *key) {
return mainpositionTV(t, key);
}
-int luaH_isdummy (const Table *t) { return isdummy(t); }
-
#endif
diff --git a/3rdparty/lua/src/ltable.h b/3rdparty/lua/src/ltable.h
index 7bbbcb213f8..8e689034234 100644
--- a/3rdparty/lua/src/ltable.h
+++ b/3rdparty/lua/src/ltable.h
@@ -41,8 +41,6 @@ LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key,
LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key);
LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
-LUAI_FUNC void luaH_newkey (lua_State *L, Table *t, const TValue *key,
- TValue *value);
LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key,
TValue *value);
LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key,
@@ -59,7 +57,6 @@ LUAI_FUNC unsigned int luaH_realasize (const Table *t);
#if defined(LUA_DEBUG)
LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
-LUAI_FUNC int luaH_isdummy (const Table *t);
#endif
diff --git a/3rdparty/lua/src/ltablib.c b/3rdparty/lua/src/ltablib.c
index 868d78fd83e..e6bc4d04af4 100644
--- a/3rdparty/lua/src/ltablib.c
+++ b/3rdparty/lua/src/ltablib.c
@@ -93,7 +93,7 @@ static int tremove (lua_State *L) {
lua_Integer pos = luaL_optinteger(L, 2, size);
if (pos != size) /* validate 'pos' if given */
/* check whether 'pos' is in [1, size + 1] */
- luaL_argcheck(L, (lua_Unsigned)pos - 1u <= (lua_Unsigned)size, 1,
+ luaL_argcheck(L, (lua_Unsigned)pos - 1u <= (lua_Unsigned)size, 2,
"position out of bounds");
lua_geti(L, 1, pos); /* result = t[pos] */
for ( ; pos < size; pos++) {
diff --git a/3rdparty/lua/src/ltm.c b/3rdparty/lua/src/ltm.c
index b657b783a80..07a060811d5 100644
--- a/3rdparty/lua/src/ltm.c
+++ b/3rdparty/lua/src/ltm.c
@@ -102,12 +102,12 @@ const char *luaT_objtypename (lua_State *L, const TValue *o) {
void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
const TValue *p2, const TValue *p3) {
- StkId func = L->top;
+ StkId func = L->top.p;
setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */
setobj2s(L, func + 1, p1); /* 1st argument */
setobj2s(L, func + 2, p2); /* 2nd argument */
setobj2s(L, func + 3, p3); /* 3rd argument */
- L->top = func + 4;
+ L->top.p = func + 4;
/* metamethod may yield only when called from Lua code */
if (isLuacode(L->ci))
luaD_call(L, func, 0);
@@ -119,18 +119,18 @@ void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1,
const TValue *p2, StkId res) {
ptrdiff_t result = savestack(L, res);
- StkId func = L->top;
+ StkId func = L->top.p;
setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */
setobj2s(L, func + 1, p1); /* 1st argument */
setobj2s(L, func + 2, p2); /* 2nd argument */
- L->top += 3;
+ L->top.p += 3;
/* metamethod may yield only when called from Lua code */
if (isLuacode(L->ci))
luaD_call(L, func, 1);
else
luaD_callnoyield(L, func, 1);
res = restorestack(L, result);
- setobjs2s(L, res, --L->top); /* move result to its place */
+ setobjs2s(L, res, --L->top.p); /* move result to its place */
}
@@ -165,7 +165,7 @@ void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
void luaT_tryconcatTM (lua_State *L) {
- StkId top = L->top;
+ StkId top = L->top.p;
if (l_unlikely(!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2,
TM_CONCAT)))
luaG_concaterror(L, s2v(top - 2), s2v(top - 1));
@@ -200,15 +200,15 @@ void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2,
*/
int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2,
TMS event) {
- if (callbinTM(L, p1, p2, L->top, event)) /* try original event */
- return !l_isfalse(s2v(L->top));
+ if (callbinTM(L, p1, p2, L->top.p, event)) /* try original event */
+ return !l_isfalse(s2v(L->top.p));
#if defined(LUA_COMPAT_LT_LE)
else if (event == TM_LE) {
/* try '!(p2 < p1)' for '(p1 <= p2)' */
L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */
- if (callbinTM(L, p2, p1, L->top, TM_LT)) {
+ if (callbinTM(L, p2, p1, L->top.p, TM_LT)) {
L->ci->callstatus ^= CIST_LEQ; /* clear mark */
- return l_isfalse(s2v(L->top));
+ return l_isfalse(s2v(L->top.p));
}
/* else error will remove this 'ci'; no need to clear mark */
}
@@ -238,20 +238,20 @@ int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2,
void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci,
const Proto *p) {
int i;
- int actual = cast_int(L->top - ci->func) - 1; /* number of arguments */
+ int actual = cast_int(L->top.p - ci->func.p) - 1; /* number of arguments */
int nextra = actual - nfixparams; /* number of extra arguments */
ci->u.l.nextraargs = nextra;
luaD_checkstack(L, p->maxstacksize + 1);
/* copy function to the top of the stack */
- setobjs2s(L, L->top++, ci->func);
+ setobjs2s(L, L->top.p++, ci->func.p);
/* move fixed parameters to the top of the stack */
for (i = 1; i <= nfixparams; i++) {
- setobjs2s(L, L->top++, ci->func + i);
- setnilvalue(s2v(ci->func + i)); /* erase original parameter (for GC) */
+ setobjs2s(L, L->top.p++, ci->func.p + i);
+ setnilvalue(s2v(ci->func.p + i)); /* erase original parameter (for GC) */
}
- ci->func += actual + 1;
- ci->top += actual + 1;
- lua_assert(L->top <= ci->top && ci->top <= L->stack_last);
+ ci->func.p += actual + 1;
+ ci->top.p += actual + 1;
+ lua_assert(L->top.p <= ci->top.p && ci->top.p <= L->stack_last.p);
}
@@ -261,10 +261,10 @@ void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) {
if (wanted < 0) {
wanted = nextra; /* get all extra arguments available */
checkstackGCp(L, nextra, where); /* ensure stack space */
- L->top = where + nextra; /* next instruction will need top */
+ L->top.p = where + nextra; /* next instruction will need top */
}
for (i = 0; i < wanted && i < nextra; i++)
- setobjs2s(L, where + i, ci->func - nextra + i);
+ setobjs2s(L, where + i, ci->func.p - nextra + i);
for (; i < wanted; i++) /* complete required results with nil */
setnilvalue(s2v(where + i));
}
diff --git a/3rdparty/lua/src/lua.c b/3rdparty/lua/src/lua.c
index 0f190044449..6da331f1186 100644
--- a/3rdparty/lua/src/lua.c
+++ b/3rdparty/lua/src/lua.c
@@ -115,12 +115,13 @@ static void l_message (const char *pname, const char *msg) {
/*
** Check whether 'status' is not OK and, if so, prints the error
-** message on the top of the stack. It assumes that the error object
-** is a string, as it was either generated by Lua or by 'msghandler'.
+** message on the top of the stack.
*/
static int report (lua_State *L, int status) {
if (status != LUA_OK) {
const char *msg = lua_tostring(L, -1);
+ if (msg == NULL)
+ msg = "(error message not a string)";
l_message(progname, msg);
lua_pop(L, 1); /* remove message */
}
@@ -177,10 +178,11 @@ static void print_version (void) {
** to the script (everything after 'script') go to positive indices;
** other arguments (before the script name) go to negative indices.
** If there is no script name, assume interpreter's name as base.
+** (If there is no interpreter's name either, 'script' is -1, so
+** table sizes are zero.)
*/
static void createargtable (lua_State *L, char **argv, int argc, int script) {
int i, narg;
- if (script == argc) script = 0; /* no script name? */
narg = argc - (script + 1); /* number of positive indices */
lua_createtable(L, narg, script + 1);
for (i = 0; i < argc; i++) {
@@ -209,12 +211,17 @@ static int dostring (lua_State *L, const char *s, const char *name) {
/*
** Receives 'globname[=modname]' and runs 'globname = require(modname)'.
+** If there is no explicit modname and globname contains a '-', cut
+** the suffix after '-' (the "version") to make the global name.
*/
static int dolibrary (lua_State *L, char *globname) {
int status;
+ char *suffix = NULL;
char *modname = strchr(globname, '=');
- if (modname == NULL) /* no explicit name? */
+ if (modname == NULL) { /* no explicit name? */
modname = globname; /* module name is equal to global name */
+ suffix = strchr(modname, *LUA_IGMARK); /* look for a suffix mark */
+ }
else {
*modname = '\0'; /* global name ends here */
modname++; /* module name starts after the '=' */
@@ -222,8 +229,11 @@ static int dolibrary (lua_State *L, char *globname) {
lua_getglobal(L, "require");
lua_pushstring(L, modname);
status = docall(L, 1, 1); /* call 'require(modname)' */
- if (status == LUA_OK)
+ if (status == LUA_OK) {
+ if (suffix != NULL) /* is there a suffix mark? */
+ *suffix = '\0'; /* remove suffix from global name */
lua_setglobal(L, globname); /* globname = require(modname) */
+ }
return report(L, status);
}
@@ -268,14 +278,23 @@ static int handle_script (lua_State *L, char **argv) {
/*
** Traverses all arguments from 'argv', returning a mask with those
-** needed before running any Lua code (or an error code if it finds
-** any invalid argument). 'first' returns the first not-handled argument
-** (either the script name or a bad argument in case of error).
+** needed before running any Lua code or an error code if it finds any
+** invalid argument. In case of error, 'first' is the index of the bad
+** argument. Otherwise, 'first' is -1 if there is no program name,
+** 0 if there is no script name, or the index of the script name.
*/
static int collectargs (char **argv, int *first) {
int args = 0;
int i;
- for (i = 1; argv[i] != NULL; i++) {
+ if (argv[0] != NULL) { /* is there a program name? */
+ if (argv[0][0]) /* not empty? */
+ progname = argv[0]; /* save it */
+ }
+ else { /* no program name */
+ *first = -1;
+ return 0;
+ }
+ for (i = 1; argv[i] != NULL; i++) { /* handle arguments */
*first = i;
if (argv[i][0] != '-') /* not an option? */
return args; /* stop handling options */
@@ -316,7 +335,7 @@ static int collectargs (char **argv, int *first) {
return has_error;
}
}
- *first = i; /* no script name */
+ *first = 0; /* no script name */
return args;
}
@@ -609,8 +628,8 @@ static int pmain (lua_State *L) {
char **argv = (char **)lua_touserdata(L, 2);
int script;
int args = collectargs(argv, &script);
+ int optlim = (script > 0) ? script : argc; /* first argv not an option */
luaL_checkversion(L); /* check that interpreter has correct version */
- if (argv[0] && argv[0][0]) progname = argv[0];
if (args == has_error) { /* bad arg? */
print_usage(argv[script]); /* 'script' has index of bad arg. */
return 0;
@@ -623,19 +642,21 @@ static int pmain (lua_State *L) {
}
luaL_openlibs(L); /* open standard libraries */
createargtable(L, argv, argc, script); /* create table 'arg' */
- lua_gc(L, LUA_GCGEN, 0, 0); /* GC in generational mode */
+ lua_gc(L, LUA_GCRESTART); /* start GC... */
+ lua_gc(L, LUA_GCGEN, 0, 0); /* ...in generational mode */
if (!(args & has_E)) { /* no option '-E'? */
if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */
return 0; /* error running LUA_INIT */
}
- if (!runargs(L, argv, script)) /* execute arguments -e and -l */
+ if (!runargs(L, argv, optlim)) /* execute arguments -e and -l */
return 0; /* something failed */
- if (script < argc && /* execute main script (if there is one) */
- handle_script(L, argv + script) != LUA_OK)
- return 0;
+ if (script > 0) { /* execute main script (if there is one) */
+ if (handle_script(L, argv + script) != LUA_OK)
+ return 0; /* interrupt in case of error */
+ }
if (args & has_i) /* -i option? */
doREPL(L); /* do read-eval-print loop */
- else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */
+ else if (script < 1 && !(args & (has_e | has_v))) { /* no active option? */
if (lua_stdin_is_tty()) { /* running in interactive mode? */
print_version();
doREPL(L); /* do read-eval-print loop */
@@ -654,6 +675,7 @@ int main (int argc, char **argv) {
l_message(argv[0], "cannot create state: not enough memory");
return EXIT_FAILURE;
}
+ lua_gc(L, LUA_GCSTOP); /* stop GC while building state */
lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */
lua_pushinteger(L, argc); /* 1st argument */
lua_pushlightuserdata(L, argv); /* 2nd argument */
diff --git a/3rdparty/lua/src/lua.h b/3rdparty/lua/src/lua.h
index e6618392cc7..f050dac0913 100644
--- a/3rdparty/lua/src/lua.h
+++ b/3rdparty/lua/src/lua.h
@@ -18,14 +18,14 @@
#define LUA_VERSION_MAJOR "5"
#define LUA_VERSION_MINOR "4"
-#define LUA_VERSION_RELEASE "4"
+#define LUA_VERSION_RELEASE "7"
#define LUA_VERSION_NUM 504
-#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 4)
+#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 7)
#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
-#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2022 Lua.org, PUC-Rio"
+#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2024 Lua.org, PUC-Rio"
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
@@ -131,6 +131,16 @@ typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);
+/*
+** Type used by the debug API to collect debug information
+*/
+typedef struct lua_Debug lua_Debug;
+
+
+/*
+** Functions to be called by the debugger in specific events
+*/
+typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
/*
@@ -153,7 +163,8 @@ extern const char lua_ident[];
LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
LUA_API void (lua_close) (lua_State *L);
LUA_API lua_State *(lua_newthread) (lua_State *L);
-LUA_API int (lua_resetthread) (lua_State *L);
+LUA_API int (lua_closethread) (lua_State *L, lua_State *from);
+LUA_API int (lua_resetthread) (lua_State *L); /* Deprecated! */
LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
@@ -442,12 +453,6 @@ LUA_API void (lua_closeslot) (lua_State *L, int idx);
#define LUA_MASKLINE (1 << LUA_HOOKLINE)
#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
-typedef struct lua_Debug lua_Debug; /* activation record */
-
-
-/* Functions to be called by the debugger in specific events */
-typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
-
LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);
LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);
@@ -492,7 +497,7 @@ struct lua_Debug {
/******************************************************************************
-* Copyright (C) 1994-2022 Lua.org, PUC-Rio.
+* Copyright (C) 1994-2024 Lua.org, PUC-Rio.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
diff --git a/3rdparty/lua/src/luac.c b/3rdparty/lua/src/luac.c
index f6db9cf656b..5f4a141bddd 100644
--- a/3rdparty/lua/src/luac.c
+++ b/3rdparty/lua/src/luac.c
@@ -121,7 +121,7 @@ static int doargs(int argc, char* argv[])
return i;
}
-#define FUNCTION "(function()end)();"
+#define FUNCTION "(function()end)();\n"
static const char* reader(lua_State* L, void* ud, size_t* size)
{
@@ -138,7 +138,7 @@ static const char* reader(lua_State* L, void* ud, size_t* size)
}
}
-#define toproto(L,i) getproto(s2v(L->top+(i)))
+#define toproto(L,i) getproto(s2v(L->top.p+(i)))
static const Proto* combine(lua_State* L, int n)
{
@@ -155,8 +155,6 @@ static const Proto* combine(lua_State* L, int n)
f->p[i]=toproto(L,i-n-1);
if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;
}
- luaM_freearray(L,f->lineinfo,f->sizelineinfo);
- f->sizelineinfo=0;
return f;
}
}
diff --git a/3rdparty/lua/src/luaconf.h b/3rdparty/lua/src/luaconf.h
index d42d14b7d5f..33bb580d17c 100644
--- a/3rdparty/lua/src/luaconf.h
+++ b/3rdparty/lua/src/luaconf.h
@@ -70,6 +70,12 @@
#endif
+#if defined(LUA_USE_IOS)
+#define LUA_USE_POSIX
+#define LUA_USE_DLOPEN
+#endif
+
+
/*
@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits.
*/
@@ -251,6 +257,15 @@
#endif
+
+/*
+** LUA_IGMARK is a mark to ignore all after it when building the
+** module name (e.g., used to build the luaopen_ function name).
+** Typically, the suffix after the mark is the module version,
+** as in "mod-v1.2.so".
+*/
+#define LUA_IGMARK "-"
+
/* }================================================================== */
@@ -728,7 +743,7 @@
** CHANGE it if you need a different limit. This limit is arbitrary;
** its only purpose is to stop Lua from consuming unlimited stack
** space (and to reserve some numbers for pseudo-indices).
-** (It must fit into max(size_t)/32.)
+** (It must fit into max(size_t)/32 and max(int)/2.)
*/
#if LUAI_IS32INT
#define LUAI_MAXSTACK 1000000
@@ -747,14 +762,15 @@
/*
@@ LUA_IDSIZE gives the maximum size for the description of the source
-@@ of a function in debug information.
+** of a function in debug information.
** CHANGE it if you want a different size.
*/
#define LUA_IDSIZE 60
/*
-@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
+@@ LUAL_BUFFERSIZE is the initial buffer size used by the lauxlib
+** buffer system.
*/
#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number)))
diff --git a/3rdparty/lua/src/lundump.c b/3rdparty/lua/src/lundump.c
index 5aa55c44578..e8d92a8534f 100644
--- a/3rdparty/lua/src/lundump.c
+++ b/3rdparty/lua/src/lundump.c
@@ -81,7 +81,7 @@ static size_t loadUnsigned (LoadState *S, size_t limit) {
static size_t loadSize (LoadState *S) {
- return loadUnsigned(S, ~(size_t)0);
+ return loadUnsigned(S, MAX_SIZET);
}
@@ -120,10 +120,10 @@ static TString *loadStringN (LoadState *S, Proto *p) {
}
else { /* long string */
ts = luaS_createlngstrobj(L, size); /* create string */
- setsvalue2s(L, L->top, ts); /* anchor it ('loadVector' can GC) */
+ setsvalue2s(L, L->top.p, ts); /* anchor it ('loadVector' can GC) */
luaD_inctop(L);
- loadVector(S, getstr(ts), size); /* load directly in final place */
- L->top--; /* pop string */
+ loadVector(S, getlngstr(ts), size); /* load directly in final place */
+ L->top.p--; /* pop string */
}
luaC_objbarrier(L, p, ts);
return ts;
@@ -248,6 +248,8 @@ static void loadDebug (LoadState *S, Proto *f) {
f->locvars[i].endpc = loadInt(S);
}
n = loadInt(S);
+ if (n != 0) /* does it have debug information? */
+ n = f->sizeupvalues; /* must be this many */
for (i = 0; i < n; i++)
f->upvalues[i].name = loadStringN(S, f);
}
@@ -321,7 +323,7 @@ LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
S.Z = Z;
checkHeader(&S);
cl = luaF_newLclosure(L, loadByte(&S));
- setclLvalue2s(L, L->top, cl);
+ setclLvalue2s(L, L->top.p, cl);
luaD_inctop(L);
cl->p = luaF_newproto(L);
luaC_objbarrier(L, cl, cl->p);
diff --git a/3rdparty/lua/src/lundump.h b/3rdparty/lua/src/lundump.h
index f3748a99807..a97676ca185 100644
--- a/3rdparty/lua/src/lundump.h
+++ b/3rdparty/lua/src/lundump.h
@@ -21,8 +21,7 @@
/*
** Encode major-minor version in one byte, one nibble for each
*/
-#define MYINT(s) (s[0]-'0') /* assume one-digit numerals */
-#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR))
+#define LUAC_VERSION (((LUA_VERSION_NUM / 100) * 16) + LUA_VERSION_NUM % 100)
#define LUAC_FORMAT 0 /* this is the official format */
diff --git a/3rdparty/lua/src/lutf8lib.c b/3rdparty/lua/src/lutf8lib.c
index e7bf098f6d0..3a5b9bc38a5 100644
--- a/3rdparty/lua/src/lutf8lib.c
+++ b/3rdparty/lua/src/lutf8lib.c
@@ -25,6 +25,9 @@
#define MAXUTF 0x7FFFFFFFu
+
+#define MSGInvalid "invalid UTF-8 code"
+
/*
** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits.
*/
@@ -35,7 +38,8 @@ typedef unsigned long utfint;
#endif
-#define iscont(p) ((*(p) & 0xC0) == 0x80)
+#define iscont(c) (((c) & 0xC0) == 0x80)
+#define iscontp(p) iscont(*(p))
/* from strlib */
@@ -65,7 +69,7 @@ static const char *utf8_decode (const char *s, utfint *val, int strict) {
int count = 0; /* to count number of continuation bytes */
for (; c & 0x40; c <<= 1) { /* while it needs continuation bytes... */
unsigned int cc = (unsigned char)s[++count]; /* read next byte */
- if ((cc & 0xC0) != 0x80) /* not a continuation byte? */
+ if (!iscont(cc)) /* not a continuation byte? */
return NULL; /* invalid byte sequence */
res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */
}
@@ -140,7 +144,7 @@ static int codepoint (lua_State *L) {
utfint code;
s = utf8_decode(s, &code, !lax);
if (s == NULL)
- return luaL_error(L, "invalid UTF-8 code");
+ return luaL_error(L, MSGInvalid);
lua_pushinteger(L, code);
n++;
}
@@ -190,16 +194,16 @@ static int byteoffset (lua_State *L) {
"position out of bounds");
if (n == 0) {
/* find beginning of current byte sequence */
- while (posi > 0 && iscont(s + posi)) posi--;
+ while (posi > 0 && iscontp(s + posi)) posi--;
}
else {
- if (iscont(s + posi))
+ if (iscontp(s + posi))
return luaL_error(L, "initial position is a continuation byte");
if (n < 0) {
while (n < 0 && posi > 0) { /* move back */
do { /* find beginning of previous character */
posi--;
- } while (posi > 0 && iscont(s + posi));
+ } while (posi > 0 && iscontp(s + posi));
n++;
}
}
@@ -208,7 +212,7 @@ static int byteoffset (lua_State *L) {
while (n > 0 && posi < (lua_Integer)len) {
do { /* find beginning of next character */
posi++;
- } while (iscont(s + posi)); /* (cannot pass final '\0') */
+ } while (iscontp(s + posi)); /* (cannot pass final '\0') */
n--;
}
}
@@ -226,15 +230,15 @@ static int iter_aux (lua_State *L, int strict) {
const char *s = luaL_checklstring(L, 1, &len);
lua_Unsigned n = (lua_Unsigned)lua_tointeger(L, 2);
if (n < len) {
- while (iscont(s + n)) n++; /* skip continuation bytes */
+ while (iscontp(s + n)) n++; /* go to next character */
}
if (n >= len) /* (also handles original 'n' being negative) */
return 0; /* no more codepoints */
else {
utfint code;
const char *next = utf8_decode(s + n, &code, strict);
- if (next == NULL)
- return luaL_error(L, "invalid UTF-8 code");
+ if (next == NULL || iscontp(next))
+ return luaL_error(L, MSGInvalid);
lua_pushinteger(L, n + 1);
lua_pushinteger(L, code);
return 2;
@@ -253,7 +257,8 @@ static int iter_auxlax (lua_State *L) {
static int iter_codes (lua_State *L) {
int lax = lua_toboolean(L, 2);
- luaL_checkstring(L, 1);
+ const char *s = luaL_checkstring(L, 1);
+ luaL_argcheck(L, !iscontp(s), 1, MSGInvalid);
lua_pushcfunction(L, lax ? iter_auxlax : iter_auxstrict);
lua_pushvalue(L, 1);
lua_pushinteger(L, 0);
diff --git a/3rdparty/lua/src/lvm.c b/3rdparty/lua/src/lvm.c
index 2ec34400319..fcd24e11dc8 100644
--- a/3rdparty/lua/src/lvm.c
+++ b/3rdparty/lua/src/lvm.c
@@ -91,8 +91,10 @@ static int l_strton (const TValue *obj, TValue *result) {
lua_assert(obj != result);
if (!cvt2num(obj)) /* is object not a string? */
return 0;
- else
- return (luaO_str2num(svalue(obj), result) == vslen(obj) + 1);
+ else {
+ TString *st = tsvalue(obj);
+ return (luaO_str2num(getstr(st), result) == tsslen(st) + 1);
+ }
}
@@ -366,30 +368,32 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
/*
-** Compare two strings 'ls' x 'rs', returning an integer less-equal-
-** -greater than zero if 'ls' is less-equal-greater than 'rs'.
+** Compare two strings 'ts1' x 'ts2', returning an integer less-equal-
+** -greater than zero if 'ts1' is less-equal-greater than 'ts2'.
** The code is a little tricky because it allows '\0' in the strings
-** and it uses 'strcoll' (to respect locales) for each segments
-** of the strings.
+** and it uses 'strcoll' (to respect locales) for each segment
+** of the strings. Note that segments can compare equal but still
+** have different lengths.
*/
-static int l_strcmp (const TString *ls, const TString *rs) {
- const char *l = getstr(ls);
- size_t ll = tsslen(ls);
- const char *r = getstr(rs);
- size_t lr = tsslen(rs);
+static int l_strcmp (const TString *ts1, const TString *ts2) {
+ const char *s1 = getstr(ts1);
+ size_t rl1 = tsslen(ts1); /* real length */
+ const char *s2 = getstr(ts2);
+ size_t rl2 = tsslen(ts2);
for (;;) { /* for each segment */
- int temp = strcoll(l, r);
+ int temp = strcoll(s1, s2);
if (temp != 0) /* not equal? */
return temp; /* done */
else { /* strings are equal up to a '\0' */
- size_t len = strlen(l); /* index of first '\0' in both strings */
- if (len == lr) /* 'rs' is finished? */
- return (len == ll) ? 0 : 1; /* check 'ls' */
- else if (len == ll) /* 'ls' is finished? */
- return -1; /* 'ls' is less than 'rs' ('rs' is not finished) */
- /* both strings longer than 'len'; go on comparing after the '\0' */
- len++;
- l += len; ll -= len; r += len; lr -= len;
+ size_t zl1 = strlen(s1); /* index of first '\0' in 's1' */
+ size_t zl2 = strlen(s2); /* index of first '\0' in 's2' */
+ if (zl2 == rl2) /* 's2' is finished? */
+ return (zl1 == rl1) ? 0 : 1; /* check 's1' */
+ else if (zl1 == rl1) /* 's1' is finished? */
+ return -1; /* 's1' is less than 's2' ('s2' is not finished) */
+ /* both strings longer than 'zl'; go on comparing after the '\0' */
+ zl1++; zl2++;
+ s1 += zl1; rl1 -= zl1; s2 += zl2; rl2 -= zl2;
}
}
}
@@ -608,8 +612,8 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {
if (tm == NULL) /* no TM? */
return 0; /* objects are different */
else {
- luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */
- return !l_isfalse(s2v(L->top));
+ luaT_callTMres(L, tm, t1, t2, L->top.p); /* call TM */
+ return !l_isfalse(s2v(L->top.p));
}
}
@@ -624,8 +628,9 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {
static void copy2buff (StkId top, int n, char *buff) {
size_t tl = 0; /* size already copied */
do {
- size_t l = vslen(s2v(top - n)); /* length of string being copied */
- memcpy(buff + tl, svalue(s2v(top - n)), l * sizeof(char));
+ TString *st = tsvalue(s2v(top - n));
+ size_t l = tsslen(st); /* length of string being copied */
+ memcpy(buff + tl, getstr(st), l * sizeof(char));
tl += l;
} while (--n > 0);
}
@@ -633,17 +638,17 @@ static void copy2buff (StkId top, int n, char *buff) {
/*
** Main operation for concatenation: concat 'total' values in the stack,
-** from 'L->top - total' up to 'L->top - 1'.
+** from 'L->top.p - total' up to 'L->top.p - 1'.
*/
void luaV_concat (lua_State *L, int total) {
if (total == 1)
return; /* "all" values already concatenated */
do {
- StkId top = L->top;
+ StkId top = L->top.p;
int n = 2; /* number of elements handled in this pass (at least 2) */
if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) ||
!tostring(L, s2v(top - 1)))
- luaT_tryconcatTM(L);
+ luaT_tryconcatTM(L); /* may invalidate 'top' */
else if (isemptystr(s2v(top - 1))) /* second operand is empty? */
cast_void(tostring(L, s2v(top - 2))); /* result is first operand */
else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */
@@ -651,13 +656,15 @@ void luaV_concat (lua_State *L, int total) {
}
else {
/* at least two non-empty string values; get as many as possible */
- size_t tl = vslen(s2v(top - 1));
+ size_t tl = tsslen(tsvalue(s2v(top - 1)));
TString *ts;
/* collect total length and number of strings */
for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) {
- size_t l = vslen(s2v(top - n - 1));
- if (l_unlikely(l >= (MAX_SIZE/sizeof(char)) - tl))
+ size_t l = tsslen(tsvalue(s2v(top - n - 1)));
+ if (l_unlikely(l >= MAX_SIZE - sizeof(TString) - tl)) {
+ L->top.p = top - total; /* pop strings to avoid wasting stack */
luaG_runerror(L, "string length overflow");
+ }
tl += l;
}
if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */
@@ -667,12 +674,12 @@ void luaV_concat (lua_State *L, int total) {
}
else { /* long string; copy strings directly to final result */
ts = luaS_createlngstrobj(L, tl);
- copy2buff(top, n, getstr(ts));
+ copy2buff(top, n, getlngstr(ts));
}
setsvalue2s(L, top - n, ts); /* create result */
}
- total -= n-1; /* got 'n' strings to create 1 new */
- L->top -= n-1; /* popped 'n' strings and pushed one */
+ total -= n - 1; /* got 'n' strings to create one new */
+ L->top.p -= n - 1; /* popped 'n' strings and pushed one */
} while (total > 1); /* repeat until only 1 result left */
}
@@ -763,12 +770,10 @@ lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) {
/* number of bits in an integer */
#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT)
+
/*
** Shift left operation. (Shift right just negates 'y'.)
*/
-#define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y))
-
-
lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
if (y < 0) { /* shift right? */
if (y <= -NBITS) return 0;
@@ -808,26 +813,26 @@ static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,
*/
void luaV_finishOp (lua_State *L) {
CallInfo *ci = L->ci;
- StkId base = ci->func + 1;
+ StkId base = ci->func.p + 1;
Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */
OpCode op = GET_OPCODE(inst);
switch (op) { /* finish its execution */
case OP_MMBIN: case OP_MMBINI: case OP_MMBINK: {
- setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top);
+ setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top.p);
break;
}
case OP_UNM: case OP_BNOT: case OP_LEN:
case OP_GETTABUP: case OP_GETTABLE: case OP_GETI:
case OP_GETFIELD: case OP_SELF: {
- setobjs2s(L, base + GETARG_A(inst), --L->top);
+ setobjs2s(L, base + GETARG_A(inst), --L->top.p);
break;
}
case OP_LT: case OP_LE:
case OP_LTI: case OP_LEI:
case OP_GTI: case OP_GEI:
case OP_EQ: { /* note that 'OP_EQI'/'OP_EQK' cannot yield */
- int res = !l_isfalse(s2v(L->top - 1));
- L->top--;
+ int res = !l_isfalse(s2v(L->top.p - 1));
+ L->top.p--;
#if defined(LUA_COMPAT_LT_LE)
if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */
ci->callstatus ^= CIST_LEQ; /* clear mark */
@@ -840,11 +845,11 @@ void luaV_finishOp (lua_State *L) {
break;
}
case OP_CONCAT: {
- StkId top = L->top - 1; /* top when 'luaT_tryconcatTM' was called */
+ StkId top = L->top.p - 1; /* top when 'luaT_tryconcatTM' was called */
int a = GETARG_A(inst); /* first element to concatenate */
int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */
setobjs2s(L, top - 2, top); /* put TM result in proper position */
- L->top = top - 1; /* top is one after last element (at top-2) */
+ L->top.p = top - 1; /* top is one after last element (at top-2) */
luaV_concat(L, total); /* concat them (may yield again) */
break;
}
@@ -856,7 +861,7 @@ void luaV_finishOp (lua_State *L) {
StkId ra = base + GETARG_A(inst);
/* adjust top to signal correct number of returns, in case the
return is "up to top" ('isIT') */
- L->top = ra + ci->u2.nres;
+ L->top.p = ra + ci->u2.nres;
/* repeat instruction to close other vars. and complete the return */
ci->u.l.savedpc--;
break;
@@ -898,6 +903,7 @@ void luaV_finishOp (lua_State *L) {
** operation, 'fop' is the float operation.
*/
#define op_arithI(L,iop,fop) { \
+ StkId ra = RA(i); \
TValue *v1 = vRB(i); \
int imm = GETARG_sC(i); \
if (ttisinteger(v1)) { \
@@ -926,6 +932,7 @@ void luaV_finishOp (lua_State *L) {
** Arithmetic operations over floats and others with register operands.
*/
#define op_arithf(L,fop) { \
+ StkId ra = RA(i); \
TValue *v1 = vRB(i); \
TValue *v2 = vRC(i); \
op_arithf_aux(L, v1, v2, fop); }
@@ -935,6 +942,7 @@ void luaV_finishOp (lua_State *L) {
** Arithmetic operations with K operands for floats.
*/
#define op_arithfK(L,fop) { \
+ StkId ra = RA(i); \
TValue *v1 = vRB(i); \
TValue *v2 = KC(i); lua_assert(ttisnumber(v2)); \
op_arithf_aux(L, v1, v2, fop); }
@@ -944,6 +952,7 @@ void luaV_finishOp (lua_State *L) {
** Arithmetic operations over integers and floats.
*/
#define op_arith_aux(L,v1,v2,iop,fop) { \
+ StkId ra = RA(i); \
if (ttisinteger(v1) && ttisinteger(v2)) { \
lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \
pc++; setivalue(s2v(ra), iop(L, i1, i2)); \
@@ -973,6 +982,7 @@ void luaV_finishOp (lua_State *L) {
** Bitwise operations with constant operand.
*/
#define op_bitwiseK(L,op) { \
+ StkId ra = RA(i); \
TValue *v1 = vRB(i); \
TValue *v2 = KC(i); \
lua_Integer i1; \
@@ -986,6 +996,7 @@ void luaV_finishOp (lua_State *L) {
** Bitwise operations with register operands.
*/
#define op_bitwise(L,op) { \
+ StkId ra = RA(i); \
TValue *v1 = vRB(i); \
TValue *v2 = vRC(i); \
lua_Integer i1; lua_Integer i2; \
@@ -1000,18 +1011,19 @@ void luaV_finishOp (lua_State *L) {
** integers.
*/
#define op_order(L,opi,opn,other) { \
- int cond; \
- TValue *rb = vRB(i); \
- if (ttisinteger(s2v(ra)) && ttisinteger(rb)) { \
- lua_Integer ia = ivalue(s2v(ra)); \
- lua_Integer ib = ivalue(rb); \
- cond = opi(ia, ib); \
- } \
- else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \
- cond = opn(s2v(ra), rb); \
- else \
- Protect(cond = other(L, s2v(ra), rb)); \
- docondjump(); }
+ StkId ra = RA(i); \
+ int cond; \
+ TValue *rb = vRB(i); \
+ if (ttisinteger(s2v(ra)) && ttisinteger(rb)) { \
+ lua_Integer ia = ivalue(s2v(ra)); \
+ lua_Integer ib = ivalue(rb); \
+ cond = opi(ia, ib); \
+ } \
+ else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \
+ cond = opn(s2v(ra), rb); \
+ else \
+ Protect(cond = other(L, s2v(ra), rb)); \
+ docondjump(); }
/*
@@ -1019,20 +1031,21 @@ void luaV_finishOp (lua_State *L) {
** always small enough to have an exact representation as a float.)
*/
#define op_orderI(L,opi,opf,inv,tm) { \
- int cond; \
- int im = GETARG_sB(i); \
- if (ttisinteger(s2v(ra))) \
- cond = opi(ivalue(s2v(ra)), im); \
- else if (ttisfloat(s2v(ra))) { \
- lua_Number fa = fltvalue(s2v(ra)); \
- lua_Number fim = cast_num(im); \
- cond = opf(fa, fim); \
- } \
- else { \
- int isf = GETARG_C(i); \
- Protect(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \
- } \
- docondjump(); }
+ StkId ra = RA(i); \
+ int cond; \
+ int im = GETARG_sB(i); \
+ if (ttisinteger(s2v(ra))) \
+ cond = opi(ivalue(s2v(ra)), im); \
+ else if (ttisfloat(s2v(ra))) { \
+ lua_Number fa = fltvalue(s2v(ra)); \
+ lua_Number fim = cast_num(im); \
+ cond = opf(fa, fim); \
+ } \
+ else { \
+ int isf = GETARG_C(i); \
+ Protect(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \
+ } \
+ docondjump(); }
/* }================================================================== */
@@ -1061,7 +1074,7 @@ void luaV_finishOp (lua_State *L) {
#define updatetrap(ci) (trap = ci->u.l.trap)
-#define updatebase(ci) (base = ci->func + 1)
+#define updatebase(ci) (base = ci->func.p + 1)
#define updatestack(ci) \
@@ -1096,7 +1109,7 @@ void luaV_finishOp (lua_State *L) {
** Whenever code can raise errors, the global 'pc' and the global
** 'top' must be correct to report occasional errors.
*/
-#define savestate(L,ci) (savepc(L), L->top = ci->top)
+#define savestate(L,ci) (savepc(L), L->top.p = ci->top.p)
/*
@@ -1116,7 +1129,7 @@ void luaV_finishOp (lua_State *L) {
/* 'c' is the limit of live values in the stack */
#define checkGC(L,c) \
- { luaC_condGC(L, (savepc(L), L->top = (c)), \
+ { luaC_condGC(L, (savepc(L), L->top.p = (c)), \
updatetrap(ci)); \
luai_threadyield(L); }
@@ -1128,7 +1141,6 @@ void luaV_finishOp (lua_State *L) {
updatebase(ci); /* correct stack */ \
} \
i = *(pc++); \
- ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \
}
#define vmdispatch(o) switch(o)
@@ -1148,72 +1160,73 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
startfunc:
trap = L->hookmask;
returning: /* trap already set */
- cl = clLvalue(s2v(ci->func));
+ cl = ci_func(ci);
k = cl->p->k;
pc = ci->u.l.savedpc;
- if (l_unlikely(trap)) {
- if (pc == cl->p->code) { /* first instruction (not resuming)? */
- if (cl->p->is_vararg)
- trap = 0; /* hooks will start after VARARGPREP instruction */
- else /* check 'call' hook */
- luaD_hookcall(L, ci);
- }
- ci->u.l.trap = 1; /* assume trap is on, for now */
- }
- base = ci->func + 1;
+ if (l_unlikely(trap))
+ trap = luaG_tracecall(L);
+ base = ci->func.p + 1;
/* main loop of interpreter */
for (;;) {
Instruction i; /* instruction being executed */
- StkId ra; /* instruction's A register */
vmfetch();
#if 0
/* low-level line tracing for debugging Lua */
printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p)));
#endif
- lua_assert(base == ci->func + 1);
- lua_assert(base <= L->top && L->top < L->stack_last);
+ lua_assert(base == ci->func.p + 1);
+ lua_assert(base <= L->top.p && L->top.p <= L->stack_last.p);
/* invalidate top for instructions not expecting it */
- lua_assert(isIT(i) || (cast_void(L->top = base), 1));
+ lua_assert(isIT(i) || (cast_void(L->top.p = base), 1));
vmdispatch (GET_OPCODE(i)) {
vmcase(OP_MOVE) {
+ StkId ra = RA(i);
setobjs2s(L, ra, RB(i));
vmbreak;
}
vmcase(OP_LOADI) {
+ StkId ra = RA(i);
lua_Integer b = GETARG_sBx(i);
setivalue(s2v(ra), b);
vmbreak;
}
vmcase(OP_LOADF) {
+ StkId ra = RA(i);
int b = GETARG_sBx(i);
setfltvalue(s2v(ra), cast_num(b));
vmbreak;
}
vmcase(OP_LOADK) {
+ StkId ra = RA(i);
TValue *rb = k + GETARG_Bx(i);
setobj2s(L, ra, rb);
vmbreak;
}
vmcase(OP_LOADKX) {
+ StkId ra = RA(i);
TValue *rb;
rb = k + GETARG_Ax(*pc); pc++;
setobj2s(L, ra, rb);
vmbreak;
}
vmcase(OP_LOADFALSE) {
+ StkId ra = RA(i);
setbfvalue(s2v(ra));
vmbreak;
}
vmcase(OP_LFALSESKIP) {
+ StkId ra = RA(i);
setbfvalue(s2v(ra));
pc++; /* skip next instruction */
vmbreak;
}
vmcase(OP_LOADTRUE) {
+ StkId ra = RA(i);
setbtvalue(s2v(ra));
vmbreak;
}
vmcase(OP_LOADNIL) {
+ StkId ra = RA(i);
int b = GETARG_B(i);
do {
setnilvalue(s2v(ra++));
@@ -1221,21 +1234,24 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_GETUPVAL) {
+ StkId ra = RA(i);
int b = GETARG_B(i);
- setobj2s(L, ra, cl->upvals[b]->v);
+ setobj2s(L, ra, cl->upvals[b]->v.p);
vmbreak;
}
vmcase(OP_SETUPVAL) {
+ StkId ra = RA(i);
UpVal *uv = cl->upvals[GETARG_B(i)];
- setobj(L, uv->v, s2v(ra));
+ setobj(L, uv->v.p, s2v(ra));
luaC_barrier(L, uv, s2v(ra));
vmbreak;
}
vmcase(OP_GETTABUP) {
+ StkId ra = RA(i);
const TValue *slot;
- TValue *upval = cl->upvals[GETARG_B(i)]->v;
+ TValue *upval = cl->upvals[GETARG_B(i)]->v.p;
TValue *rc = KC(i);
- TString *key = tsvalue(rc); /* key must be a string */
+ TString *key = tsvalue(rc); /* key must be a short string */
if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) {
setobj2s(L, ra, slot);
}
@@ -1244,6 +1260,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_GETTABLE) {
+ StkId ra = RA(i);
const TValue *slot;
TValue *rb = vRB(i);
TValue *rc = vRC(i);
@@ -1258,6 +1275,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_GETI) {
+ StkId ra = RA(i);
const TValue *slot;
TValue *rb = vRB(i);
int c = GETARG_C(i);
@@ -1272,10 +1290,11 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_GETFIELD) {
+ StkId ra = RA(i);
const TValue *slot;
TValue *rb = vRB(i);
TValue *rc = KC(i);
- TString *key = tsvalue(rc); /* key must be a string */
+ TString *key = tsvalue(rc); /* key must be a short string */
if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) {
setobj2s(L, ra, slot);
}
@@ -1285,10 +1304,10 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
}
vmcase(OP_SETTABUP) {
const TValue *slot;
- TValue *upval = cl->upvals[GETARG_A(i)]->v;
+ TValue *upval = cl->upvals[GETARG_A(i)]->v.p;
TValue *rb = KB(i);
TValue *rc = RKC(i);
- TString *key = tsvalue(rb); /* key must be a string */
+ TString *key = tsvalue(rb); /* key must be a short string */
if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) {
luaV_finishfastset(L, upval, slot, rc);
}
@@ -1297,6 +1316,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_SETTABLE) {
+ StkId ra = RA(i);
const TValue *slot;
TValue *rb = vRB(i); /* key (table is in 'ra') */
TValue *rc = RKC(i); /* value */
@@ -1311,6 +1331,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_SETI) {
+ StkId ra = RA(i);
const TValue *slot;
int c = GETARG_B(i);
TValue *rc = RKC(i);
@@ -1325,10 +1346,11 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_SETFIELD) {
+ StkId ra = RA(i);
const TValue *slot;
TValue *rb = KB(i);
TValue *rc = RKC(i);
- TString *key = tsvalue(rb); /* key must be a string */
+ TString *key = tsvalue(rb); /* key must be a short string */
if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) {
luaV_finishfastset(L, s2v(ra), slot, rc);
}
@@ -1337,6 +1359,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_NEWTABLE) {
+ StkId ra = RA(i);
int b = GETARG_B(i); /* log2(hash size) + 1 */
int c = GETARG_C(i); /* array size */
Table *t;
@@ -1346,7 +1369,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
if (TESTARG_k(i)) /* non-zero extra argument? */
c += GETARG_Ax(*pc) * (MAXARG_C + 1); /* add it to size */
pc++; /* skip extra argument */
- L->top = ra + 1; /* correct top in case of emergency GC */
+ L->top.p = ra + 1; /* correct top in case of emergency GC */
t = luaH_new(L); /* memory allocation */
sethvalue2s(L, ra, t);
if (b != 0 || c != 0)
@@ -1355,6 +1378,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_SELF) {
+ StkId ra = RA(i);
const TValue *slot;
TValue *rb = vRB(i);
TValue *rc = RKC(i);
@@ -1384,6 +1408,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_MODK) {
+ savestate(L, ci); /* in case of division by 0 */
op_arithK(L, luaV_mod, luaV_modf);
vmbreak;
}
@@ -1396,6 +1421,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_IDIVK) {
+ savestate(L, ci); /* in case of division by 0 */
op_arithK(L, luaV_idiv, luai_numidiv);
vmbreak;
}
@@ -1412,6 +1438,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_SHRI) {
+ StkId ra = RA(i);
TValue *rb = vRB(i);
int ic = GETARG_sC(i);
lua_Integer ib;
@@ -1421,6 +1448,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_SHLI) {
+ StkId ra = RA(i);
TValue *rb = vRB(i);
int ic = GETARG_sC(i);
lua_Integer ib;
@@ -1442,6 +1470,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_MOD) {
+ savestate(L, ci); /* in case of division by 0 */
op_arith(L, luaV_mod, luaV_modf);
vmbreak;
}
@@ -1454,6 +1483,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_IDIV) { /* floor division */
+ savestate(L, ci); /* in case of division by 0 */
op_arith(L, luaV_idiv, luai_numidiv);
vmbreak;
}
@@ -1478,6 +1508,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_MMBIN) {
+ StkId ra = RA(i);
Instruction pi = *(pc - 2); /* original arith. expression */
TValue *rb = vRB(i);
TMS tm = (TMS)GETARG_C(i);
@@ -1487,6 +1518,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_MMBINI) {
+ StkId ra = RA(i);
Instruction pi = *(pc - 2); /* original arith. expression */
int imm = GETARG_sB(i);
TMS tm = (TMS)GETARG_C(i);
@@ -1496,6 +1528,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_MMBINK) {
+ StkId ra = RA(i);
Instruction pi = *(pc - 2); /* original arith. expression */
TValue *imm = KB(i);
TMS tm = (TMS)GETARG_C(i);
@@ -1505,6 +1538,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_UNM) {
+ StkId ra = RA(i);
TValue *rb = vRB(i);
lua_Number nb;
if (ttisinteger(rb)) {
@@ -1519,6 +1553,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_BNOT) {
+ StkId ra = RA(i);
TValue *rb = vRB(i);
lua_Integer ib;
if (tointegerns(rb, &ib)) {
@@ -1529,6 +1564,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_NOT) {
+ StkId ra = RA(i);
TValue *rb = vRB(i);
if (l_isfalse(rb))
setbtvalue(s2v(ra));
@@ -1537,21 +1573,25 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_LEN) {
+ StkId ra = RA(i);
Protect(luaV_objlen(L, ra, vRB(i)));
vmbreak;
}
vmcase(OP_CONCAT) {
+ StkId ra = RA(i);
int n = GETARG_B(i); /* number of elements to concatenate */
- L->top = ra + n; /* mark the end of concat operands */
+ L->top.p = ra + n; /* mark the end of concat operands */
ProtectNT(luaV_concat(L, n));
- checkGC(L, L->top); /* 'luaV_concat' ensures correct top */
+ checkGC(L, L->top.p); /* 'luaV_concat' ensures correct top */
vmbreak;
}
vmcase(OP_CLOSE) {
+ StkId ra = RA(i);
Protect(luaF_close(L, ra, LUA_OK, 1));
vmbreak;
}
vmcase(OP_TBC) {
+ StkId ra = RA(i);
/* create new to-be-closed upvalue */
halfProtect(luaF_newtbcupval(L, ra));
vmbreak;
@@ -1561,6 +1601,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_EQ) {
+ StkId ra = RA(i);
int cond;
TValue *rb = vRB(i);
Protect(cond = luaV_equalobj(L, s2v(ra), rb));
@@ -1576,6 +1617,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_EQK) {
+ StkId ra = RA(i);
TValue *rb = KB(i);
/* basic types do not use '__eq'; we can use raw equality */
int cond = luaV_rawequalobj(s2v(ra), rb);
@@ -1583,6 +1625,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_EQI) {
+ StkId ra = RA(i);
int cond;
int im = GETARG_sB(i);
if (ttisinteger(s2v(ra)))
@@ -1611,11 +1654,13 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_TEST) {
+ StkId ra = RA(i);
int cond = !l_isfalse(s2v(ra));
docondjump();
vmbreak;
}
vmcase(OP_TESTSET) {
+ StkId ra = RA(i);
TValue *rb = vRB(i);
if (l_isfalse(rb) == GETARG_k(i))
pc++;
@@ -1626,11 +1671,12 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_CALL) {
+ StkId ra = RA(i);
CallInfo *newci;
int b = GETARG_B(i);
int nresults = GETARG_C(i) - 1;
if (b != 0) /* fixed number of arguments? */
- L->top = ra + b; /* top signals number of arguments */
+ L->top.p = ra + b; /* top signals number of arguments */
/* else previous instruction set top */
savepc(L); /* in case of errors */
if ((newci = luaD_precall(L, ra, nresults)) == NULL)
@@ -1642,54 +1688,57 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_TAILCALL) {
+ StkId ra = RA(i);
int b = GETARG_B(i); /* number of arguments + 1 (function) */
int n; /* number of results when calling a C function */
int nparams1 = GETARG_C(i);
/* delta is virtual 'func' - real 'func' (vararg functions) */
int delta = (nparams1) ? ci->u.l.nextraargs + nparams1 : 0;
if (b != 0)
- L->top = ra + b;
+ L->top.p = ra + b;
else /* previous instruction set top */
- b = cast_int(L->top - ra);
+ b = cast_int(L->top.p - ra);
savepc(ci); /* several calls here can raise errors */
if (TESTARG_k(i)) {
luaF_closeupval(L, base); /* close upvalues from current call */
- lua_assert(L->tbclist < base); /* no pending tbc variables */
- lua_assert(base == ci->func + 1);
+ lua_assert(L->tbclist.p < base); /* no pending tbc variables */
+ lua_assert(base == ci->func.p + 1);
}
if ((n = luaD_pretailcall(L, ci, ra, b, delta)) < 0) /* Lua function? */
goto startfunc; /* execute the callee */
else { /* C function? */
- ci->func -= delta; /* restore 'func' (if vararg) */
+ ci->func.p -= delta; /* restore 'func' (if vararg) */
luaD_poscall(L, ci, n); /* finish caller */
updatetrap(ci); /* 'luaD_poscall' can change hooks */
goto ret; /* caller returns after the tail call */
}
}
vmcase(OP_RETURN) {
+ StkId ra = RA(i);
int n = GETARG_B(i) - 1; /* number of results */
int nparams1 = GETARG_C(i);
if (n < 0) /* not fixed? */
- n = cast_int(L->top - ra); /* get what is available */
+ n = cast_int(L->top.p - ra); /* get what is available */
savepc(ci);
if (TESTARG_k(i)) { /* may there be open upvalues? */
ci->u2.nres = n; /* save number of returns */
- if (L->top < ci->top)
- L->top = ci->top;
+ if (L->top.p < ci->top.p)
+ L->top.p = ci->top.p;
luaF_close(L, base, CLOSEKTOP, 1);
updatetrap(ci);
updatestack(ci);
}
if (nparams1) /* vararg function? */
- ci->func -= ci->u.l.nextraargs + nparams1;
- L->top = ra + n; /* set call for 'luaD_poscall' */
+ ci->func.p -= ci->u.l.nextraargs + nparams1;
+ L->top.p = ra + n; /* set call for 'luaD_poscall' */
luaD_poscall(L, ci, n);
updatetrap(ci); /* 'luaD_poscall' can change hooks */
goto ret;
}
vmcase(OP_RETURN0) {
if (l_unlikely(L->hookmask)) {
- L->top = ra;
+ StkId ra = RA(i);
+ L->top.p = ra;
savepc(ci);
luaD_poscall(L, ci, 0); /* no hurry... */
trap = 1;
@@ -1697,15 +1746,16 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
else { /* do the 'poscall' here */
int nres;
L->ci = ci->previous; /* back to caller */
- L->top = base - 1;
+ L->top.p = base - 1;
for (nres = ci->nresults; l_unlikely(nres > 0); nres--)
- setnilvalue(s2v(L->top++)); /* all results are nil */
+ setnilvalue(s2v(L->top.p++)); /* all results are nil */
}
goto ret;
}
vmcase(OP_RETURN1) {
if (l_unlikely(L->hookmask)) {
- L->top = ra + 1;
+ StkId ra = RA(i);
+ L->top.p = ra + 1;
savepc(ci);
luaD_poscall(L, ci, 1); /* no hurry... */
trap = 1;
@@ -1714,12 +1764,13 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
int nres = ci->nresults;
L->ci = ci->previous; /* back to caller */
if (nres == 0)
- L->top = base - 1; /* asked for no results */
+ L->top.p = base - 1; /* asked for no results */
else {
+ StkId ra = RA(i);
setobjs2s(L, base - 1, ra); /* at least this result */
- L->top = base;
+ L->top.p = base;
for (; l_unlikely(nres > 1); nres--)
- setnilvalue(s2v(L->top++)); /* complete missing results */
+ setnilvalue(s2v(L->top.p++)); /* complete missing results */
}
}
ret: /* return from a Lua function */
@@ -1731,6 +1782,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
}
}
vmcase(OP_FORLOOP) {
+ StkId ra = RA(i);
if (ttisinteger(s2v(ra + 2))) { /* integer loop? */
lua_Unsigned count = l_castS2U(ivalue(s2v(ra + 1)));
if (count > 0) { /* still more iterations? */
@@ -1749,12 +1801,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_FORPREP) {
+ StkId ra = RA(i);
savestate(L, ci); /* in case of errors */
if (forprep(L, ra))
pc += GETARG_Bx(i) + 1; /* skip the loop */
vmbreak;
}
vmcase(OP_TFORPREP) {
+ StkId ra = RA(i);
/* create to-be-closed upvalue (if needed) */
halfProtect(luaF_newtbcupval(L, ra + 3));
pc += GETARG_Bx(i);
@@ -1763,7 +1817,8 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
goto l_tforcall;
}
vmcase(OP_TFORCALL) {
- l_tforcall:
+ l_tforcall: {
+ StkId ra = RA(i);
/* 'ra' has the iterator function, 'ra + 1' has the state,
'ra + 2' has the control variable, and 'ra + 3' has the
to-be-closed variable. The call will use the stack after
@@ -1771,29 +1826,31 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
*/
/* push function, state, and control variable */
memcpy(ra + 4, ra, 3 * sizeof(*ra));
- L->top = ra + 4 + 3;
+ L->top.p = ra + 4 + 3;
ProtectNT(luaD_call(L, ra + 4, GETARG_C(i))); /* do the call */
updatestack(ci); /* stack may have changed */
i = *(pc++); /* go to next instruction */
lua_assert(GET_OPCODE(i) == OP_TFORLOOP && ra == RA(i));
goto l_tforloop;
- }
+ }}
vmcase(OP_TFORLOOP) {
- l_tforloop:
+ l_tforloop: {
+ StkId ra = RA(i);
if (!ttisnil(s2v(ra + 4))) { /* continue loop? */
setobjs2s(L, ra + 2, ra + 4); /* save control variable */
pc -= GETARG_Bx(i); /* jump back */
}
vmbreak;
- }
+ }}
vmcase(OP_SETLIST) {
+ StkId ra = RA(i);
int n = GETARG_B(i);
unsigned int last = GETARG_C(i);
Table *h = hvalue(s2v(ra));
if (n == 0)
- n = cast_int(L->top - ra) - 1; /* get up to the top */
+ n = cast_int(L->top.p - ra) - 1; /* get up to the top */
else
- L->top = ci->top; /* correct top in case of emergency GC */
+ L->top.p = ci->top.p; /* correct top in case of emergency GC */
last += n;
if (TESTARG_k(i)) {
last += GETARG_Ax(*pc) * (MAXARG_C + 1);
@@ -1810,12 +1867,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
vmbreak;
}
vmcase(OP_CLOSURE) {
+ StkId ra = RA(i);
Proto *p = cl->p->p[GETARG_Bx(i)];
halfProtect(pushclosure(L, p, cl->upvals, base, ra));
checkGC(L, ra + 1);
vmbreak;
}
vmcase(OP_VARARG) {
+ StkId ra = RA(i);
int n = GETARG_C(i) - 1; /* required results */
Protect(luaT_getvarargs(L, ci, ra, n));
vmbreak;
diff --git a/3rdparty/lua/src/lvm.h b/3rdparty/lua/src/lvm.h
index 1bc16f3a50b..dba1ad27702 100644
--- a/3rdparty/lua/src/lvm.h
+++ b/3rdparty/lua/src/lvm.h
@@ -110,6 +110,11 @@ typedef enum {
luaC_barrierback(L, gcvalue(t), v); }
+/*
+** Shift right is the same as shift left with a negative 'y'
+*/
+#define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y))
+
LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
diff --git a/3rdparty/portmidi/.github/workflows/build.yml b/3rdparty/portmidi/.github/workflows/build.yml
new file mode 100644
index 00000000000..351b5cbf00c
--- /dev/null
+++ b/3rdparty/portmidi/.github/workflows/build.yml
@@ -0,0 +1,47 @@
+name: build
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - name: Ubuntu
+ os: ubuntu-latest
+ install_dir: ~/portmidi
+ cmake_extras: -DCMAKE_BUILD_TYPE=RelWithDebInfo
+ - name: macOS
+ os: macos-latest
+ install_dir: ~/portmidi
+ cmake_extras: -DCMAKE_BUILD_TYPE=RelWithDebInfo
+ - name: Windows
+ os: windows-latest
+ install_dir: C:\portmidi
+ cmake_config: --config RelWithDebInfo
+
+ name: ${{ matrix.name }}
+ runs-on: ${{ matrix.os }}
+ steps:
+ - name: Check out Git repository
+ uses: actions/checkout@v2
+ - name: "[Ubuntu] Install dependencies"
+ run: sudo apt install -y libasound2-dev
+ if: runner.os == 'Linux'
+ - name: Configure
+ run: cmake -D CMAKE_INSTALL_PREFIX=${{ matrix.install_dir }} ${{ matrix.cmake_extras }} -S . -B build
+ - name: Build
+ run: cmake --build build ${{ matrix.cmake_config }}
+ env:
+ CMAKE_BUILD_PARALLEL_LEVEL: 2
+ - name: Install
+ run: cmake --install . ${{ matrix.cmake_config }}
+ working-directory: build
+ - name: Upload Build Artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: ${{ matrix.name }} portmidi build
+ path: ${{ matrix.install_dir }}
diff --git a/3rdparty/portmidi/.github/workflows/docs.yml b/3rdparty/portmidi/.github/workflows/docs.yml
new file mode 100644
index 00000000000..d0e251b77da
--- /dev/null
+++ b/3rdparty/portmidi/.github/workflows/docs.yml
@@ -0,0 +1,28 @@
+name: Generate Docs
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ doxygen:
+ name: Doxygen
+ runs-on: ubuntu-latest
+ steps:
+ - name: "Check out repository"
+ uses: actions/checkout@v2
+
+ - name: Install Doxygen
+ run: sudo apt-get update && sudo apt-get install -y --no-install-recommends doxygen
+
+ - name: Generate Documentation
+ run: doxygen
+ working-directory: .
+
+ - name: Deploy to GitHub Pages
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: docs/html
diff --git a/3rdparty/portmidi/.gitignore b/3rdparty/portmidi/.gitignore
new file mode 100644
index 00000000000..19d66501fee
--- /dev/null
+++ b/3rdparty/portmidi/.gitignore
@@ -0,0 +1,62 @@
+.DS_Store
+build*/
+*~
+CMakeCache.txt
+CMakeFiles/
+CMakeScripts/
+/portmidi.pc
+/x64/
+/Debug/
+/Release/
+/pm_java/pmdefaults/pmdefaults.jar
+/pm_java/pmdefaults.sln
+/pm_java/pmjni.dir/
+/pm_java/x64/
+portmidi.build/
+cmake_install.cmake
+*.xcodeproj/
+/.vs/
+/portmidi.sln
+*.vcxproj
+*.vcxproj.filters
+*.vcxproj.user
+/Makefile
+/libportmidi.so*
+/libportmidi.a
+/libportmidi_static.a
+/libpmjni.so*
+/packaging/PortMidiConfig.cmake
+/packaging/PortMidiConfigVersion.cmake
+/packaging/portmidi.pc
+/pm_common/Makefile
+/pm_common/portmidi.dir/
+/pm_java/Makefile
+/pm_test/Debug/
+/pm_test/Release/
+/pm_test/Makefile
+/pm_test/fastrcv
+/pm_test/fastrcv.dir/
+/pm_test/latency
+/pm_test/latency.dir/
+/pm_test/midiclock
+/pm_test/midiclock.dir/
+/pm_test/midithread
+/pm_test/midithread.dir/
+/pm_test/midithru
+/pm_test/midithru.dir/
+/pm_test/mm
+/pm_test/mm.dir/
+/pm_test/multivirtual
+/pm_test/qtest
+/pm_test/qtest.dir/
+/pm_test/recvvirtual
+/pm_test/sendvirtual
+/pm_test/sysex
+/pm_test/sysex.dir/
+/pm_test/testio
+/pm_test/testio.dir/
+/pm_test/virttest
+/pm_test/fast
+/pm_test/fast.dir/
+/pm_test/pmlist
+/pm_test/pmlist.dir/
diff --git a/3rdparty/portmidi/ALL_BUILD.vcproj b/3rdparty/portmidi/ALL_BUILD.vcproj
deleted file mode 100644
index b99ce00bb18..00000000000
--- a/3rdparty/portmidi/ALL_BUILD.vcproj
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="ALL_BUILD"
- ProjectGUID="{E1C2664B-91BB-4D4F-868C-433164F81101}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="ALL_BUILD.dir\Debug"
- ConfigurationType="10"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- ExceptionHandling="0"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="ALL_BUILD.dir\Release"
- ConfigurationType="10"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- ExceptionHandling="0"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <Files>
- <File
- RelativePath=".\CMakeFiles\ALL_BUILD">
- </File>
- <Filter
- Name="CMake Rules"
- Filter="">
- <File
- RelativePath=".\CMakeFiles\ALL_BUILD.rule">
- <FileConfiguration
- Name="Debug|Win32">
- <Tool
- Name="VCCustomBuildTool"
- Description="Build all projects"
- CommandLine=""
- AdditionalDependencies=".\CMakeFiles\ALL_BUILD.rule"
- Outputs=".\CMakeFiles\ALL_BUILD"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32">
- <Tool
- Name="VCCustomBuildTool"
- Description="Build all projects"
- CommandLine=""
- AdditionalDependencies=".\CMakeFiles\ALL_BUILD.rule"
- Outputs=".\CMakeFiles\ALL_BUILD"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/CHANGELOG.txt b/3rdparty/portmidi/CHANGELOG.txt
index c2a083a5685..fee43309cd0 100644
--- a/3rdparty/portmidi/CHANGELOG.txt
+++ b/3rdparty/portmidi/CHANGELOG.txt
@@ -1,5 +1,26 @@
/* CHANGELOG FOR PORTMIDI
*
+ * 21Feb22 v2.0.3 Roger Dannenberg
+ * - this version allows multiple hardware devices to have the same name.
+ *
+ * 03Jan22 v2.0.2 Roger Dannenberg
+ * - many changes for CMake including install support
+ * - bare-bones Java and PmDefaults support. It runs, but no
+ * installation.
+ *
+ * 16Sep21 Roger Dannenberg
+ * - Added CreateVirtualInput and CreateVirtualOutput functions (macOS
+ * & Linux) only.
+ * - Fix for unicode endpoints on macOS CoreMIDI.
+ * - Parsing in macOS of realtime message embedded in short messages
+ * (can this actually happen?)
+ * - renamed pm_test/test.c to pm_test/testio.c
+ * - with this release, pm_java, pm_csharp, pm_cl, pm_python, pm_qt
+ * are marked as "legacy code" and README.txt's refer to other
+ * projects. I had hoped for "one-stop shopping" for language
+ * bindings, but developers decided to move work to independent
+ * repositories. Maybe that's better.
+ *
* 19Oct09 Roger Dannenberg
* - Changes dynamic library names from portmidi_d to portmidi to
* be backward-compatible with programs expecting a library by
diff --git a/3rdparty/portmidi/CMakeLists.txt b/3rdparty/portmidi/CMakeLists.txt
index 4919b78df62..650fd943510 100644
--- a/3rdparty/portmidi/CMakeLists.txt
+++ b/3rdparty/portmidi/CMakeLists.txt
@@ -1,77 +1,183 @@
# portmidi
-# Roger B. Dannenberg
-# 20 Sep 2009
-
-cmake_minimum_required(VERSION 2.6)
-
-if(UNIX)
- # allow user to set Release or Debug
- set(CMAKE_BUILD_TYPE Release CACHE STRING
- "Semicolon-separate list of supported configuration types")
- # set default directories but don't override cached values...
- set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE}
- CACHE STRING "libraries go here")
- set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE}
- CACHE STRING "libraries go here")
- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY
- ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE}
- CACHE STRING "executables go here")
-
-else(UNIX)
- # this does not seem to work for xcode:
- set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING
- "Semicolon-separate list of supported configuration types")
-endif(UNIX)
-
-#set(CMAKE_RELATIVE_PATHS ON CACHE STRING "avoid absolute paths" FORCE)
-
-# Clear out the built-in C++ compiler and link flags for each of the
-# unused configurations.
-set(CMAKE_CXX_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused")
-set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused")
-set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused")
-set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused")
-set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused")
-set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused")
-set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused")
-set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused")
-
-set(CMAKE_OSX_ARCHITECTURES i386 ppc x86_64 CACHE STRING "change to needed architecture for a smaller library" FORCE)
-
-PROJECT(portmidi)
-
-if(UNIX)
- # Problem: if there was an old Debug build and you change
- # CMAKE_BUILD_TYPE to Release, then the OUTPUT_DIRECTORY's will
- # still be Debug. Try to fix this by checking if the DIRECTORY's
- # look wrong, and if so, force them to the defaults:
- if(CMAKE_BUILD_TYPE MATCHES "Debug")
- set(BAD_DIR "Release")
- else(CMAKE_BUILD_TYPE MATCHES "Debug")
- set(BAD_DIR "Debug")
- endif(CMAKE_BUILD_TYPE MATCHES "Debug")
- # use library as reference -- if you give it a non-BAD_DIR location
- # then every other path is left alone
- if(CMAKE_LIBRARY_OUTPUT_DIRECTORY MATCHES ${BAD_DIR})
- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY
- ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE}
- CACHE STRING "executables go here" FORCE)
- set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
- ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE}
- CACHE STRING "libraries go here" FORCE)
- set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
- ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE}
- CACHE STRING "libraries go here" FORCE)
- endif(CMAKE_LIBRARY_OUTPUT_DIRECTORY MATCHES ${BAD_DIR})
-endif(UNIX)
+# Roger B. Dannenberg (and others)
+# Sep 2009 - 2021
+
+cmake_minimum_required(VERSION 3.21)
+# (ALSA::ALSA new in 3.12 and used in pm_common/CMakeLists.txt)
+# Some Java stuff failed on 3.17 but works with 3.20+
+
+cmake_policy(SET CMP0091 NEW) # enables MSVC_RUNTIME_LIBRARY target property
+
+# Previously, PortMidi versions were simply SVN commit version numbers.
+# Versions are now in the form x.y.z
+# Changed 1.0 to 2.0 because API is extended with virtual ports:
+set(SOVERSION "2")
+set(VERSION "2.0.3")
+
+project(portmidi VERSION "${VERSION}"
+ DESCRIPTION "Cross-Platform MIDI IO")
+
+set(LIBRARY_SOVERSION "${SOVERSION}")
+set(LIBRARY_VERSION "${VERSION}")
+
+option(BUILD_SHARED_LIBS "Build shared libraries" ON)
+
+option(PM_USE_STATIC_RUNTIME
+ "Use MSVC static runtime. Only applies when BUILD_SHARED_LIBS is OFF"
+ ON)
+
+# MSVCRT_DLL is used to construct the MSVC_RUNTIME_LIBRARY property
+# (see pm_common/CMakeLists.txt and pm_test/CMakeLists.txt)
+if(PM_USE_STATIC_RUNTIME AND NOT BUILD_SHARED_LIBS)
+ set(MSVCRT_DLL "")
+else()
+ set(MSVCRT_DLL "DLL")
+endif()
+
+# Always build with position-independent code (-fPIC)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9 CACHE STRING
+ "make for this OS version or higher")
+
+# PM_ACTUAL_LIB_NAME is in this scope -- see pm_common/CMakeLists.txt
+# PM_NEEDED_LIBS is in this scope -- see pm_common/CMakeLists.txt
+
+include(GNUInstallDirs)
+
+# Build Types
+# credit: http://cliutils.gitlab.io/modern-cmake/chapters/features.html
+set(DEFAULT_BUILD_TYPE "Release")
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ message(STATUS
+ "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
+ set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE
+ STRING "Choose the type of build." FORCE)
+ # Set the possible values of build type for cmake-gui
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
+endif()
+
+# where to put libraries? Everything goes here in this directory
+# (or Debug or Release, depending on the OS)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+
+option(BUILD_PMDEFAULTS
+ "build the legacy Java application PmDefaults" OFF)
+option(BUILD_JAVA_NATIVE_INTERFACE
+ "build the Java PortMidi interface library" OFF)
+
+# Defines are used in both portmidi (in pm_common/) and pmjni (in pm_java),
+# so define them here to be inherited by both libraries.
+#
+# PortMidi software architecture supports multiple system API's to lower-
+# level MIDI drivers, e.g. PMNULL (no drivers), Jack (but not supported yet),
+# and sndio (BSD, not supported yet). Interfaces are selected by defining,
+# e.g., PMALSA. (In principle, we should require PMCOREMIDI (for macOS)
+# and PMWINMM (for windows), but these are assumed.
+#
+if(APPLE OR WIN32)
+else(APPLE_OR_WIN32)
+ set(LINUX_DEFINES "PMALSA" CACHE STRING "must define either PMALSA or PMNULL")
+ add_compile_definitions(${LINUX_DEFINES})
+endif(APPLE OR WIN32)
+
+if(BUILD_JAVA_NATIVE_INTERFACE)
+ message(WARNING
+ "Java API and PmDefaults program updated 2021, but support has "
+ "been discontinued. If you need/use this, let developers know.")
+ set(PMJNI_IF_EXISTS "pmjni") # used by INSTALL below
+else(BUILD_JAVA_NATIVE_INTERFACE)
+ set(PMJNI_IF_EXISTS "") # used by INSTALL below
+ if(BUILD_PMDEFAULTS)
+ message(FATAL_ERROR
+ "Cannot build PM_Defaults program (BUILD_PM_DEFAULTS) without option "
+ "BUILD_JAVA_NATIVE_INTERFACE")
+ endif(BUILD_PMDEFAULTS)
+endif(BUILD_JAVA_NATIVE_INTERFACE)
+
+
+# Something like this might help if you need to build for a specific cpu type:
+# set(CMAKE_OSX_ARCHITECTURES x86_64 CACHE STRING
+# "change to support other architectures" FORCE)
include_directories(pm_common porttime)
add_subdirectory(pm_common)
-add_subdirectory(pm_test)
+option(BUILD_PORTMIDI_TESTS
+ "Build test programs, including midi monitor (mm)" OFF)
+if(BUILD_PORTMIDI_TESTS)
+ add_subdirectory(pm_test)
+endif(BUILD_PORTMIDI_TESTS)
+
+# See note above about Java support (probably) discontinued
+if(BUILD_JAVA_NATIVE_INTERFACE)
+ add_subdirectory(pm_java)
+endif(BUILD_JAVA_NATIVE_INTERFACE)
+
+# Install the libraries and headers (Linux and Mac OS X command line)
+INSTALL(TARGETS portmidi ${PMJNI_IF_EXISTS}
+ EXPORT PortMidiTargets
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+
+INSTALL(FILES
+ pm_common/portmidi.h
+ pm_common/pmutil.h
+ porttime/porttime.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+# pkgconfig - generate pc file
+# See https://cmake.org/cmake/help/latest/command/configure_file.html
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packaging/portmidi.pc.in
+ ${CMAKE_CURRENT_BINARY_DIR}/packaging/portmidi.pc @ONLY)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/packaging/portmidi.pc
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+
+# CMake config
+set(PORTMIDI_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/PortMidi")
+install(
+ EXPORT PortMidiTargets
+ FILE PortMidiTargets.cmake
+ NAMESPACE PortMidi::
+ DESTINATION "${PORTMIDI_INSTALL_CMAKEDIR}"
+)
+include(CMakePackageConfigHelpers)
+configure_package_config_file(packaging/PortMidiConfig.cmake.in
+ "${CMAKE_CURRENT_BINARY_DIR}/packaging/PortMidiConfig.cmake"
+ INSTALL_DESTINATION "${PORTMIDI_INSTALL_CMAKEDIR}"
+)
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/packaging/PortMidiConfigVersion.cmake"
+ VERSION "${CMAKE_PROJECT_VERSION}"
+ COMPATIBILITY SameMajorVersion
+)
+install(
+ FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/packaging/PortMidiConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/packaging/PortMidiConfigVersion.cmake"
+ DESTINATION "${PORTMIDI_INSTALL_CMAKEDIR}"
+)
+
+
-add_subdirectory(pm_dylib)
-# Cannot figure out how to make an xcode Java application with CMake
-add_subdirectory(pm_java)
+# Finding out what CMake is doing is really hard, e.g. COMPILE_FLAGS
+# does not include COMPILE_OPTIONS or COMPILE_DEFINTIONS. Thus, the
+# following report is probably not complete...
+MESSAGE(STATUS "PortMidi Library name: " ${PM_ACTUAL_LIB_NAME})
+MESSAGE(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
+MESSAGE(STATUS "Library Type: " ${LIB_TYPE})
+MESSAGE(STATUS "Compiler flags: " ${CMAKE_CXX_COMPILE_FLAGS})
+get_directory_property(prop COMPILE_DEFINITIONS)
+MESSAGE(STATUS "Compile definitions: " ${prop})
+get_directory_property(prop COMPILE_OPTIONS)
+MESSAGE(STATUS "Compile options: " ${prop})
+MESSAGE(STATUS "Compiler cxx debug flags: " ${CMAKE_CXX_FLAGS_DEBUG})
+MESSAGE(STATUS "Compiler cxx release flags: " ${CMAKE_CXX_FLAGS_RELEASE})
+MESSAGE(STATUS "Compiler cxx min size flags: " ${CMAKE_CXX_FLAGS_MINSIZEREL})
+MESSAGE(STATUS "Compiler cxx flags: " ${CMAKE_CXX_FLAGS})
diff --git a/3rdparty/portmidi/Doxyfile b/3rdparty/portmidi/Doxyfile
index 0adb6829325..95e37080b97 100644
--- a/3rdparty/portmidi/Doxyfile
+++ b/3rdparty/portmidi/Doxyfile
@@ -1,1472 +1,2682 @@
-# Doxyfile 1.5.5
+# Doxyfile 1.9.2
# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
+# doxygen (www.doxygen.org) for a project.
#
-# All text after a hash (#) is considered a comment and will be ignored
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
DOXYFILE_ENCODING = UTF-8
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
PROJECT_NAME = PortMidi
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
-PROJECT_NUMBER = 2.2.x
+PROJECT_BRIEF = "Cross-platform MIDI IO library"
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
-OUTPUT_DIRECTORY = .
+PROJECT_LOGO = portmusic_logo.png
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = ../github-portmidi-portmidi_docs
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
CREATE_SUBDIRS = NO
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
-# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene,
-# Spanish, Swedish, and Ukrainian.
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
OUTPUT_LANGUAGE = English
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
BRIEF_MEMBER_DESC = YES
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
+# The default value is: YES.
REPEAT_BRIEF = YES
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
# description.
+# The default value is: NO.
ALWAYS_DETAILED_SEC = NO
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
+# The default value is: NO.
INLINE_INHERITED_MEMB = NO
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
-FULL_PATH_NAMES = NO
+FULL_PATH_NAMES = YES
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-STRIP_FROM_PATH =
+STRIP_FROM_PATH =
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH =
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
SHORT_NAMES = NO
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
JAVADOC_AUTOBRIEF = YES
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
+JAVADOC_BANNER = NO
-MULTILINE_CPP_IS_BRIEF = NO
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS = YES
+QT_AUTOBRIEF = NO
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
-SEPARATE_MEMBER_PAGES = NO
+MULTILINE_CPP_IS_BRIEF = NO
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
-TAB_SIZE = 8
+PYTHON_DOCSTRING = YES
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
-ALIASES =
+INHERIT_DOCS = YES
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
-OPTIMIZE_OUTPUT_FOR_C = YES
+SEPARATE_MEMBER_PAGES = NO
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:^^"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
OPTIMIZE_OUTPUT_JAVA = NO
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
OPTIMIZE_FOR_FORTRAN = NO
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
OPTIMIZE_OUTPUT_VHDL = NO
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
BUILTIN_STL_SUPPORT = NO
# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
+# The default value is: NO.
CPP_CLI_SUPPORT = NO
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
SIP_SUPPORT = NO
-# For Microsoft's IDL there are propget and propput attributes to indicate getter
-# and setter methods for a property. Setting this option to YES (the default)
-# will make doxygen to replace the get and set methods by a property in the
-# documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
-# methods anyway, you should set this option to NO.
-# 1.5.7
-#IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
+# The default value is: NO.
DISTRIBUTE_GROUP_DOC = NO
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
SUBGROUPING = YES
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penality.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will rougly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols
-# 1.5.7
-# SYMBOL_CACHE_SIZE = 0
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = YES
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS = 1
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
EXTRACT_ALL = NO
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
EXTRACT_PRIVATE = NO
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
EXTRACT_STATIC = NO
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
-EXTRACT_LOCAL_CLASSES = NO
+EXTRACT_LOCAL_CLASSES = YES
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
EXTRACT_LOCAL_METHODS = NO
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespace are hidden.
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
EXTRACT_ANON_NSPACES = NO
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
HIDE_UNDOC_MEMBERS = NO
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
HIDE_UNDOC_CLASSES = NO
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
# documentation.
+# The default value is: NO.
HIDE_FRIEND_COMPOUNDS = NO
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
HIDE_IN_BODY_DOCS = NO
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
INTERNAL_DOCS = NO
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# The default value is: system dependent.
-CASE_SENSE_NAMES = YES
+CASE_SENSE_NAMES = NO
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
-HIDE_SCOPE_NAMES = NO
+HIDE_SCOPE_NAMES = YES
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
SHOW_INCLUDE_FILES = YES
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
INLINE_INFO = YES
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
SORT_MEMBER_DOCS = YES
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
SORT_BRIEF_DOCS = NO
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
-# the group names will appear in their defined order.
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
SORT_GROUP_NAMES = NO
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
SORT_BY_SCOPE_NAME = NO
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
GENERATE_TODOLIST = YES
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
GENERATE_TESTLIST = YES
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
GENERATE_BUGLIST = YES
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
GENERATE_DEPRECATEDLIST= YES
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
-ENABLED_SECTIONS =
+ENABLED_SECTIONS =
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
MAX_INITIALIZER_LINES = 30
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
SHOW_USED_FILES = YES
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
-# 1.5.7
-# SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page. This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-# 1.5.7
-# SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
-# doxygen. The layout file controls the global structure of the generated output files
-# in an output format independent way. The create the layout file that represents
-# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
-# file name after the option, if omitted DoxygenLayout.xml will be used as the name
-# of the layout file.
-# 1.5.7
-# LAYOUT_FILE =
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
-QUIET = YES
+QUIET = NO
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
WARNINGS = YES
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
-WARN_IF_UNDOCUMENTED = NO
+WARN_IF_UNDOCUMENTED = YES
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
+# The default value is: YES.
WARN_IF_DOC_ERROR = YES
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
+# The default value is: NO.
WARN_NO_PARAMDOC = NO
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text"
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
-WARN_LOGFILE =
+WARN_LOGFILE =
#---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
#---------------------------------------------------------------------------
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
-INPUT = \
- pm_common/portmidi.h \
- pm_common/portmidi.c \
+INPUT =pm_common porttime/porttime.h pm_common/pmutil.h
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# The default value is: UTF-8.
INPUT_ENCODING = UTF-8
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
-
-FILE_PATTERNS = *.h \
- *.c
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.l \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f18 \
+ *.f \
+ *.for \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.qsf \
+ *.ice
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
EXCLUDE =
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
# from the input.
+# The default value is: NO.
EXCLUDE_SYMLINKS = NO
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
-EXCLUDE_PATTERNS =
+EXCLUDE_PATTERNS =
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
-EXCLUDE_SYMBOLS =
+EXCLUDE_SYMBOLS = TRUE, FALSE, PMEXPORT
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
-EXAMPLE_PATH = ./pm_test
+EXAMPLE_PATH =
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
-EXAMPLE_PATTERNS = *.cxx \
- *.h \
- *.H \
- *.fl
+EXAMPLE_PATTERNS = *
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
EXAMPLE_RECURSIVE = NO
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
-IMAGE_PATH =
+IMAGE_PATH =
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output. If FILTER_PATTERNS is specified, this tag will be
-# ignored.
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
-INPUT_FILTER =
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
+FILTER_SOURCE_FILES = NO
-FILTER_PATTERNS =
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+FILTER_SOURCE_PATTERNS =
-FILTER_SOURCE_FILES = NO
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
#---------------------------------------------------------------------------
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
-SOURCE_BROWSER = YES
+SOURCE_BROWSER = NO
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
INLINE_SOURCES = NO
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
STRIP_CODE_COMMENTS = YES
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
-REFERENCED_BY_RELATION = YES
+REFERENCED_BY_RELATION = NO
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
-REFERENCES_RELATION = YES
+REFERENCES_RELATION = NO
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code. Otherwise they will link to the documentstion.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
REFERENCES_LINK_SOURCE = YES
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
USE_HTAGS = NO
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
VERBATIM_HEADERS = YES
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS = YES
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH =
+
#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
-COLS_IN_ALPHA_INDEX = 5
+ALPHABETICAL_INDEX = YES
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-IGNORE_PREFIX = Pm_
+IGNORE_PREFIX =
#---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
#---------------------------------------------------------------------------
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
GENERATE_HTML = YES
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_OUTPUT = html
+HTML_OUTPUT = docs
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_FILE_EXTENSION = .html
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded. For this to work a browser that supports
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_DYNAMIC_SECTIONS = NO
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
-
-GENERATE_DOCSET = YES
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_FEEDNAME = "Doxygen generated docs"
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_BUNDLE_ID = org.doxygen.Project
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_HTMLHELP = NO
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-CHM_FILE =
+CHM_FILE =
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-HHC_LOCATION =
+HHC_LOCATION =
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the main .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
GENERATE_CHI = NO
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-# 1.5.7
-# CHM_INDEX_ENCODING =
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
BINARY_TOC = NO
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
TOC_EXPAND = NO
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
-# are set, an additional index file will be generated that can be used as input for
-# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
-# HTML documentation.
-# 1.5.7
-# GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
-# 1.5.7
-# QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
-# 1.5.7
-# QHP_NAMESPACE = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
-# 1.5.7
-# QHP_VIRTUAL_FOLDER = doc
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file .
-# 1.5.7
-# QHG_LOCATION =
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
DISABLE_INDEX = NO
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = YES
+
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATOR_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
ENUM_VALUES_PER_LINE = 4
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to FRAME, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature. Other possible values
-# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list;
-# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
-# disables this behavior completely. For backwards compatibility with previous
-# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
-# respectively.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_TREEVIEW = YES
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT = png
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE =
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION = MathJax_2
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH =
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7-latest/tex.html
+# #tex-and-latex-extensions):
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using JavaScript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
+EXTERNAL_SEARCH = NO
-TREEVIEW_WIDTH = 200
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
-# 1.5.7
-# FORMULA_FONTSIZE = 10
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
-GENERATE_LATEX = YES
+GENERATE_LATEX = NO
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_OUTPUT = latex
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME =
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-MAKEINDEX_CMD_NAME = makeindex
+LATEX_MAKEINDEX_CMD = makeindex
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
COMPACT_LATEX = NO
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
+#
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-PAPER_TYPE = a4wide
+PDF_HYPERLINKS = YES
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-EXTRA_PACKAGES =
+USE_PDFLATEX = YES
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_HEADER =
+LATEX_BATCHMODE = NO
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-PDF_HYPERLINKS = YES
+LATEX_HIDE_INDICES = NO
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-USE_PDFLATEX = YES
+LATEX_BIB_STYLE = plain
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_BATCHMODE = YES
+LATEX_TIMESTAMP = NO
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_HIDE_INDICES = NO
+LATEX_EMOJI_DIRECTORY =
#---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
#---------------------------------------------------------------------------
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
GENERATE_RTF = NO
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_OUTPUT = rtf
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
COMPACT_RTF = NO
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
RTF_HYPERLINKS = NO
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_STYLESHEET_FILE =
+RTF_STYLESHEET_FILE =
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_EXTENSIONS_FILE =
+RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
#---------------------------------------------------------------------------
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
GENERATE_MAN = NO
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
MAN_OUTPUT = man
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
MAN_EXTENSION = .3
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
MAN_LINKS = NO
#---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
#---------------------------------------------------------------------------
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
GENERATE_XML = NO
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
XML_OUTPUT = xml
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
-XML_SCHEMA =
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
-XML_DTD =
+GENERATE_DOCBOOK = NO
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-XML_PROGRAMLISTING = YES
+DOCBOOK_OUTPUT = docbook
#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to Sqlite3 output
#---------------------------------------------------------------------------
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
GENERATE_PERLMOD = NO
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
PERLMOD_LATEX = NO
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader. This is useful
-# if you want to understand what is going on. On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
PERLMOD_PRETTY = YES
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-PERLMOD_MAKEVAR_PREFIX =
+PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
ENABLE_PREPROCESSING = YES
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
MACRO_EXPANSION = NO
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
EXPAND_ONLY_PREDEF = NO
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
SEARCH_INCLUDES = YES
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-INCLUDE_PATH =
+INCLUDE_PATH =
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-INCLUDE_FILE_PATTERNS =
+INCLUDE_FILE_PATTERNS =
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED = FL_DOXYGEN \
- HAVE_CAIRO \
- HAVE_GL \
- HAVE_GL_OVERLAY \
- FL_EXPORT:=
+PREDEFINED =
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED =
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
#---------------------------------------------------------------------------
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
-TAGFILES =
+TAGFILES =
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
-GENERATE_TAGFILE =
+GENERATE_TAGFILE =
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
ALLEXTERNALS = NO
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
EXTERNAL_GROUPS = YES
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
-PERL_PATH = /usr/bin/perl
+EXTERNAL_PAGES = YES
#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
# powerful graphs.
+# The default value is: YES.
-CLASS_DIAGRAMS = YES
+CLASS_DIAGRAMS = NO
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
-MSCGEN_PATH =
+DIA_PATH =
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
HIDE_UNDOC_RELATIONS = YES
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
HAVE_DOT = NO
-# By default doxygen will write a font called FreeSans.ttf to the output
-# directory and reference it in all dot files that doxygen generates. This
-# font does not include all possible unicode characters however, so when you need
-# these (or just want a differently looking font) you can specify the font name
-# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
-# which can be done by putting it in a standard location or by setting the
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
-# containing the font.
-# 1.5.7
-# DOT_FONTNAME = FreeSans
-
-# By default doxygen will tell dot to use the output directory to look for the
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a
-# different font using DOT_FONTNAME you can set the path where dot
-# can find it using this tag.
-# 1.5.7
-# DOT_FONTPATH =
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
CLASS_GRAPH = YES
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
COLLABORATION_GRAPH = YES
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
GROUP_GRAPHS = YES
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
UML_LOOK = NO
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD = 17
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
TEMPLATE_RELATIONS = NO
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDE_GRAPH = YES
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
INCLUDED_BY_GRAPH = YES
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
CALL_GRAPH = NO
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
CALLER_GRAPH = NO
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
GRAPHICAL_HIERARCHY = YES
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
DIRECTORY_GRAPH = YES
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
DOT_IMAGE_FORMAT = png
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
-DOT_PATH =
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
+PLANTUML_JAR_PATH =
-DOTFILE_DIRS =
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
DOT_GRAPH_MAX_NODES = 50
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
MAX_DOT_GRAPH_DEPTH = 0
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
DOT_TRANSPARENT = NO
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
DOT_MULTI_TARGETS = NO
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
GENERATE_LEGEND = YES
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
+# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
+# The default value is: YES.
DOT_CLEANUP = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
diff --git a/3rdparty/portmidi/README.md b/3rdparty/portmidi/README.md
new file mode 100644
index 00000000000..f8cb9106a81
--- /dev/null
+++ b/3rdparty/portmidi/README.md
@@ -0,0 +1,104 @@
+# PortMidi - Cross-Platform MIDI IO
+
+This is the canonical release of PortMidi.
+
+See other repositories within [PortMidi](https://github.com/PortMidi)
+for related code and bindings (although currently, not much is here).
+
+## [Full C API documentation is here.](https://portmidi.github.io/portmidi_docs/)
+
+## Compiling and Using PortMidi
+
+Use CMake (or ccmake) to create a Makefile for Linux/BSD or a
+project file for Xcode or MS Visual Studio. Use make or an IDE to compile:
+```
+cd portmidi # start in the top-level portmidi directory
+ccmake . # set any options interactively, type c to configure
+ # type g to generate a Makefile or IDE project
+ # type q to quit
+ # (alternatively, run the CMake GUI and use
+ # Configure and Generate buttons to build IDE project)
+make # compile sources and build PortMidi library
+ # (alternatively, open project file with your IDE)
+sudo make install # if you want to install to your system
+```
+
+**PmDefaults** is a Java-based program for setting default MIDI
+devices. It is necessary if you use `Pm_DefaultInputDeviceID()` or
+`Pm_DefaultOutputDeviceID()` to avoid implementing your own device
+browsing, selection and preferences in your applications. Enable
+`BUILD_PMDEFAULTS` and `BUILD_JAVA_NATIVE_INTERFACE` in ccmake, and
+see `pm_java/README.txt` for more information.
+
+See also notes in `pm_mac/README_MAC.txt`, `pm_win/README_WIN.txt` and
+`pm_linux/README_LINUX.txt`.
+
+## What's New?
+
+PortMidi has some fixes for Apple M1 cpus as of May 23, 2022. This has not yet
+been formally released to allow for further testing, but please use the latest
+code if you want to run on an M1.
+
+PortMidi has some changes in 2021:
+
+ - added Pm_CreateVirtualInput() and Pm_CreateVirtualOutput() functions that allow
+ applications to create named ports analogous to devices.
+
+ - improvements for macOS CoreMIDI include higher data rates for devices, better
+ handling of Unicode interface names in addition to virtual device creation.
+
+ - the notion of default devices, Pm_GetDefaultInputDeviceID(),
+ Pm_GetDefaultOutputDeviceID and the PmDefaults program have fallen into disuse
+ and are now deprecated.
+
+ - Native Interfaces for Python, Java, Go, Rust, Lua and more seem best left
+ to individual repos, so support within this repo has been dropped. A Java
+ interface is still here and probably usable -- let me know if you need it
+ and/or would like to help bring it up to date. I am happy to help with,
+ link to, or collaborate in supporting PortMidi for other languages.
+
+For up-to-date PortMidi for languages other than C/C++, check with
+developers. As of 27 Sep 2021, this (and SourceForge) is the only repo with
+the features described above.
+
+# Other Repositories
+
+PortMidi used to be part of the PortMedia suite, but this repo has been reduced to
+mostly just C/C++ code for PortMidi. You will find some other repositories in this PortMidi project
+set up for language bindings (volunteers and contributors are invited!). Other code removed from
+previous releases of PortMedia include:
+
+## PortSMF
+
+A Standard MIDI File (SMF) (and more) library is in the [portsmf repository](https://github.com/PortMidi/portsmf).
+
+PortSMF is a library for reading/writing/editing Standard MIDI Files. It is
+actually much more, with a general representation of events and updates with
+properties consisting of attributes and typed values. Familiar properties of
+pitch, time, duration, and channel are built into events and updates to make
+them faster to access and more compact.
+
+To my knowledge, PortSMF has the most complete and useful handling of MIDI
+tempo tracks. E.g., you can edit notes according to either beat or time, and
+you can edit tempo tracks, for example, flattening the tempo while preserving
+the beat alignment, preserving the real time while changing the tempo or
+stretching the tempo over some interval.
+
+In addition to Standard MIDI Files, PortSMF supports an ASCII representation
+called Allegro. PortSMF and Allegro are used for Audacity Note Tracks.
+
+## scorealign
+
+Scorealign used to be part of the PortMedia suite. It is now at the [scorealign repository](https://github.com/rbdannenberg/scorealign).
+
+Scorealign aligns
+audio-to-audio, audio-to-MIDI or MIDI-to-MIDI using dynamic time warping (DTW)
+of a computed chromagram representation. There are some added smoothing tricks
+to improve performance. This library is written in C and runs substantially
+faster than most other implementations, especially those written in MATLAB,
+due to the core DTW algorithm. Users should be warned that while chromagrams
+are robust features for alignment, they achieve robustness by operating at
+fairly high granularity, e.g., durations of around 100ms, which limits
+time precision. Other more recent algorithms can doubtless do better, but
+be cautious of claims, since it all depends on what assumptions you can
+make about the music.
diff --git a/3rdparty/portmidi/README.txt b/3rdparty/portmidi/README.txt
index 18d951e5f19..aa18b19f8d5 100644
--- a/3rdparty/portmidi/README.txt
+++ b/3rdparty/portmidi/README.txt
@@ -2,19 +2,16 @@ README for PortMidi
Roger B. Dannenberg
-VERSION: please use "svn info" to get info.
-
Documentation for PortMidi is found in pm_common/portmidi.h.
+Documentation in HTML is available at portmidi.github.io/portmidi_docs/
Additional documentation:
+ - README.md (overview, how to build, what's new)
- Windows: see pm_win/README_WIN.txt and pm_win/debugging_dlls.txt
- Linux: see pm_linux/README_LINUX.txt
- Mac OSX: see pm_mac/README_MAC.txt
- - Common Lisp: see pm_cl/README_CL.txt
- - Eclipse: see portmidi_cdt.zip (this was contributed as is; the dlls here
- are now -- Sep 09 -- out of date. What is really needed is a script
- to generate this release automatically so we can maintain it.)
- - C-Sharp: see pm_csharp.zip (also contributed as is)
+ - Other Languages: look for other repos at github.com/PortMidi,
+ and search README.md for pointers to other projects.
---------- some notes on the design of PortMidi ----------
@@ -82,3 +79,10 @@ abruptly terminate the program.
The Windows version (and perhaps others) also offers a DEBUG
compile-time option. See README_WIN.txt.
+
+RELEASE
+
+To make a new release, update VERSION variable in CMakeLists.txt.
+
+Update CHANGELOG.txt. What's new?
+
diff --git a/3rdparty/portmidi/ZERO_CHECK.vcproj b/3rdparty/portmidi/ZERO_CHECK.vcproj
deleted file mode 100644
index fb17304e882..00000000000
--- a/3rdparty/portmidi/ZERO_CHECK.vcproj
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="ZERO_CHECK"
- ProjectGUID="{28779535-7541-4FF5-AC12-FAFD66E894EC}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="ZERO_CHECK.dir\Debug"
- ConfigurationType="10"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- ExceptionHandling="0"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="ZERO_CHECK.dir\Release"
- ConfigurationType="10"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- ExceptionHandling="0"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories=".\pm_common;.\porttime;"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- </Configuration>
- </Configurations>
- <Files>
- <File
- RelativePath=".\CMakeFiles\ZERO_CHECK">
- </File>
- <Filter
- Name="CMake Rules"
- Filter="">
- <File
- RelativePath=".\CMakeFiles\ZERO_CHECK.rule">
- <FileConfiguration
- Name="Debug|Win32">
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- CommandLine=""
- AdditionalDependencies=".\CMakeFiles\ZERO_CHECK.rule"
- Outputs=".\CMakeFiles\ZERO_CHECK"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32">
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- CommandLine=""
- AdditionalDependencies=".\CMakeFiles\ZERO_CHECK.rule"
- Outputs=".\CMakeFiles\ZERO_CHECK"/>
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/packaging/PortMidiConfig.cmake.in b/3rdparty/portmidi/packaging/PortMidiConfig.cmake.in
new file mode 100644
index 00000000000..a04928a835d
--- /dev/null
+++ b/3rdparty/portmidi/packaging/PortMidiConfig.cmake.in
@@ -0,0 +1,10 @@
+@PACKAGE_INIT@
+
+include(CMakeFindDependencyMacro)
+if(UNIX AND NOT APPLE AND NOT HAIKU AND (@LINUX_DEFINES@ MATCHES ".*PMALSA.*"))
+ find_dependency(ALSA)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/PortMidiTargets.cmake")
+
+check_required_components(PortMidi)
diff --git a/3rdparty/portmidi/packaging/portmidi.pc.in b/3rdparty/portmidi/packaging/portmidi.pc.in
new file mode 100644
index 00000000000..bc608284b76
--- /dev/null
+++ b/3rdparty/portmidi/packaging/portmidi.pc.in
@@ -0,0 +1,11 @@
+prefix="@CMAKE_INSTALL_PREFIX@"
+exec_prefix="${prefix}"
+libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
+
+Name: @CMAKE_PROJECT_NAME@
+Description: @CMAKE_PROJECT_DESCRIPTION@
+Version: @CMAKE_PROJECT_VERSION@
+Cflags: -I${includedir}
+Libs: -L${libdir} -l@CMAKE_PROJECT_NAME@
+Requires.private: @PKGCONFIG_REQUIRES_PRIVATE@
diff --git a/3rdparty/portmidi/pm_cl/README_CL.txt b/3rdparty/portmidi/pm_cl/README_CL.txt
deleted file mode 100644
index be4c63591f6..00000000000
--- a/3rdparty/portmidi/pm_cl/README_CL.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-README_CL.txt for PortMidi
-Roger B. Dannenberg
-17 Jan 2007
-
-This is a Common Lisp interface to PortMidi.
-
-On Mac OSX, you need to build PortMidi as a dynamic link library
-before you can use PortMidi from Common Lisp.
-
-You can build PortMidi as a dynamic link library by running this:
-
-cd portmidi
-make -F pm_mac/Makefile.osx install-with-xcode
-
-This is just a shortcut for:
-
-cd portmidi/pm_mac
-sudo xcodebuild -project pm_mac.xcodeproj -configuration Deployment install DSTROOT=/
-
-You can check the file and the architecture for which it is built using:
- file /usr/local/lib/libportmidi.dylib
-
-If you've done this install of portmidi, then you should also have
- /usr/local/include/portmidi.h
-This will be necessary to successfully build the cffi interface below.
-
-To test PortMidi with Common Lisp, I (RBD) am using SBCL, which I
-downloaded from http://prdownloads.sourceforge.net/sbcl. Currently, I use
- sbcl-0.9.17-x86-darwin-binary.tar.bz2
-To install this, I unpacked it by just double-clicking in the finder. Then,
-from a command window, I became root using "sudo sh", and then typed:
-# INSTALL_ROOT=/usr/local
-# sh install.sh
-# exit
-
-I also downloaded cffi-061012.tar.gz from
- http://common-lisp.net/project/cffi/tarballs/?M=D
-
-To compile cffi, use the following, where "/Lisp/cffi/" is replaced by
-the actual directory of cffi, e.g.
- "/Users/rbd/sbcl-0.9.17-x86-darwin/cffi-061012":
-
-% sbcl
-* (require 'asdf)
-* (push "/Lisp/cffi/" asdf:*central-registry*)
-* (asdf:oos 'asdf:load-op :cffi)
-* (quit)
-
-Download Common Music's portmidi module from cvs and build the c side:
-(Replace "/Lisp" with your lisp directory, e.g.
-"/Users/rbd/sbcl-0.9.17-x86-darwin". These cvs commands will create
-a new directory, portmidi.)
-
-% cd /Lisp
-% export CVSROOT=:pserver:anonymous@commonmusic.cvs.sourceforge.net:/cvsroot/commonmusic
-% cvs login # press Return at password prompt
-% cvs checkout portmidi
-% cd portmidi
-% ./configure
-% make
-% cd ..
-
-Now compile/load the portmidi module just like cffi. Again, change
-"/Lisp/cffi/" and "/Lisp/portmidi" to correspond to your local file system.
-(Note that /Lisp becomes your lisp directory, and "cffi" becomes your
-cffi folder name, e.g. "cffi-061012".
-
-% sbcl
-* (require 'asdf)
-* (push "/Lisp/cffi/" asdf:*central-registry*)
-* (asdf:oos 'asdf:load-op :cffi)
-* (push "/Lisp/portmidi/" asdf:*central-registry*)
-* (asdf:oos 'asdf:load-op :portmidi)
-
-Look in the file /Lisp/portmidi/test.lisp for a test of the lisp interface to
-portmidi. For example, while still running sbcl:
-
-* (pm:portmidi) ; initialize portmidi
-* (pt:start) ; start time
-* (pt:time) ; get time
-* (pprint (pm:GetDeviceInfo)) ; get list of devices
-((:ID 0 :NAME "IAC Driver Bus 1" :TYPE :INPUT :OPEN NIL)
- (:ID 1 :NAME "IAC Driver Bus 1" :TYPE :OUTPUT :OPEN NIL))
-
-Notice that test.lisp assumes MIDI input devices are connected
-and uses some hard-wired device numbers, so it may not run
-as is without error.
-
-Since test.lisp uses some Common Music calls, I (RBD) wrote a
-simpler test, test-no-cm.lisp, which is in the same folder as
-this (README_CL.txt) file. To use it, first check that the
-values for outid (4) and inid (1) actually match PortMidi device
-id's for output and input devices, and make sure the input
-device is a keyboard that can generate a middle-C -- otherwise
-the program will hang waiting for input. Run sbcl from this
-pm_cl folder, and type:
-
-(load "test-no-cm.lisp")
-
-The program pauses frequently by calling (READ), so you
-should type t or something, then <RETURN> to continue.
-
-
-(Thanks to Leigh Smith and Rick Taube)
diff --git a/3rdparty/portmidi/pm_cl/cffi-portmidi.lisp b/3rdparty/portmidi/pm_cl/cffi-portmidi.lisp
deleted file mode 100644
index 4b3ad9c3e00..00000000000
--- a/3rdparty/portmidi/pm_cl/cffi-portmidi.lisp
+++ /dev/null
@@ -1,384 +0,0 @@
-;;; **********************************************************************
-;;; Copyright (C) 2005 Heinrich Taube, <taube (at) uiuc (dot) edu>
-;;;
-;;; This program is free software; you can redistribute it and/or
-;;; modify it under the terms of the Lisp Lesser Gnu Public License.
-;;; See http://www.cliki.net/LLGPL for the text of this agreement.
-;;; **********************************************************************
-
-
-;;; A CFFI interface to Portmidi. Should run in most Common Lisp
-;;; implementations on Linux, OS X and Windows. For information about
-;;; CFFI see http://common-lisp.net/project/cffi/
-
-(in-package :cl-user)
-
-(defvar *libportmidi*
- (let ((type #+(or darwin macos macosx) "dylib"
- #+(or linux linux-target (and unix pc386) freebsd) "so"
- #+(or win32 microsoft-32 cygwin) "dll")
- (paths (list "/usr/lib/" "/usr/local/lib/" *load-pathname*)))
- (loop for d in paths
- for p = (make-pathname :name "libportmidi" :type type
- :defaults d)
- when (probe-file p) do (return p)
- finally
- (error "Library \"portmidi.~A\" not found. Fix *libportmidi*."
- type))))
-
-;;; linux: guess i need to load porttime.so first (?) osx doesnt seem
-;;; to need this lib at all...
-
-#+(or linux (and clisp unix (not macos)))
-(let ((lpt (merge-pathnames "libporttime" *libportmidi*)))
- (if (probe-file lpt)
- (cffi:load-foreign-library lpt)
- (error "Porttime: ~a not found. Fix *libportmidi* path." lpt)))
-
-;;; load portmidi lib
-
-(cffi:load-foreign-library *libportmidi*)
-
-(defpackage :portmidi
- (:use :common-lisp)
- (:nicknames :pm :pt)
- (:shadow :initialize :terminate :time :start :stop :abort
- :close :read :write :poll)
- (:export :Initialize :Terminate
- :HasHostError :GetErrorText :GetHostErrorText
- :CountDevices :GetDefaultInputDeviceID
- :GetDefaultOutputDeviceID :GetDeviceInfo
- :Message :Message.status :Message.data1 :Message.data2
- :Event.message :Event.timestamp
- ;; event buffers added to api
- :EventBufferNew :EventBufferFree :EventBufferElt
- :EventBufferMap
- :OpenInput :OpenOutput :SetFilter :SetChannelMask
- :Abort :Close :Read :Write :Poll :WriteShort :WriteSysex
- ;; filtering constants
- :filt-active :filt-sysex :filt-clock :filt-play :filt-f9
- :filt-fd :filt-reset :filt-note :filt-channel-aftertouch
- :filt-poly-aftertouch :filt-program :filt-control
- :filt-pitchbend :filt-mtc :filt-song-position
- :filt-song-select :filt-tune :filt-tick :filt-undefined
- :filt-realtime :filt-aftertouch :filt-systemcommon
- ;; porttime.
- :Start :Stop :Started :Time
- ;; initialization insurers added to api
- :portmidi :*portmidi* ))
-
-(in-package :portmidi)
-
-(cffi:defcstruct pm-device-info
- (struct-version :int)
- (interf :pointer)
- (name :pointer)
- (input :int)
- (output :int)
- (opened :int))
-
-(cffi:define-foreign-type pm-message () ':long)
-(cffi:define-foreign-type pm-timestamp () ':long)
-(cffi:defcstruct pm-event
- (message pm-message)
- (timestamp pm-timestamp))
-(cffi:define-foreign-type pm-error () ':int)
-
-(cffi:define-foreign-type port-midi-stream () ':void)
-(cffi:define-foreign-type pm-device-id () ':int)
-(cffi:define-foreign-type pm-time-proc-ptr () ':pointer)
-(cffi:defcfun ("Pm_WriteSysEx" pm-write-sys-ex) pm-error (stream :pointer) (when pm-timestamp) (msg :pointer))
-(cffi:defcfun ("Pm_WriteShort" pm-write-short) pm-error (stream :pointer) (when pm-timestamp) (msg :long))
-(cffi:defcfun ("Pm_Write" pm-write) pm-error (stream :pointer) (buffer :pointer) (length :long))
-(cffi:defcfun ("Pm_Poll" pm-poll) pm-error (stream :pointer))
-(cffi:defcfun ("Pm_Read" pm-read) pm-error (stream :pointer) (buffer :pointer) (length :long))
-(cffi:defcfun ("Pm_Close" pm-close) pm-error (stream :pointer))
-(cffi:defcfun ("Pm_Abort" pm-abort) pm-error (stream :pointer))
-;(cffi:defcfun ("Pm_SetChannelMask" pm-set-channel-mask) pm-error (stream :pointer) (mask :int))
-(cffi:defcfun ("Pm_SetFilter" pm-set-filter) pm-error (stream :pointer) (filters :long))
-(cffi:defcfun ("Pm_OpenOutput" pm-open-output) pm-error (stream :pointer) (output-device pm-device-id) (output-driver-info :pointer) (buffer-size :long) (time-proc pm-time-proc-ptr) (time-info :pointer) (latency :long))
-(cffi:defcfun ("Pm_OpenInput" pm-open-input) pm-error (stream :pointer) (input-device pm-device-id) (input-driver-info :pointer) (buffer-size :long) (time-proc pm-time-proc-ptr) (time-info :pointer))
-(cffi:defcfun ("Pm_GetDeviceInfo" pm-get-device-info) :pointer (id pm-device-id))
-(cffi:defcfun ("Pm_GetDefaultOutputDeviceID" pm-get-default-output-device-id) pm-device-id)
-(cffi:defcfun ("Pm_GetDefaultInputDeviceID" pm-get-default-input-device-id) pm-device-id)
-(cffi:defcfun ("Pm_CountDevices" pm-count-devices) :int)
-(cffi:defcfun ("Pm_GetHostErrorText" pm-get-host-error-text) :void (msg :pointer) (len :unsigned-int))
-(cffi:defcfun ("Pm_GetErrorText" pm-get-error-text) :pointer (errnum pm-error))
-(cffi:defcfun ("Pm_HasHostError" pm-has-host-error) :int (stream :pointer))
-(cffi:defcfun ("Pm_Terminate" pm-terminate) pm-error)
-(cffi:defcfun ("Pm_Initialize" pm-initialize) pm-error)
-
-;;; porttime.h
-
-(cffi:define-foreign-type pt-error () ':int)
-(cffi:define-foreign-type pt-timestamp () ':long)
-(cffi:defcfun ("Pt_Start" pt-start) pt-error (a :int) (b :pointer) (c :pointer))
-(cffi:defcfun ("Pt_Stop" pt-stop) pt-error )
-(cffi:defcfun ("Pt_Started" pt-started) :int)
-(cffi:defcfun ("Pt_Time" pt-time) pt-timestamp)
-
-(defconstant true 1)
-(defconstant false 0)
-(defconstant pmNoError 0)
-(defconstant pmHostError -10000)
-(defconstant pm-no-device -1)
-(defconstant pm-default-sysex-buffer-size 1024)
-(defconstant filt-active 1)
-(defconstant filt-sysex 2)
-(defconstant filt-clock 4)
-(defconstant filt-play 8)
-(defconstant filt-f9 16)
-(defconstant filt-fd 32)
-(defconstant filt-reset 64)
-(defconstant filt-note 128)
-(defconstant filt-channel-aftertouch 256)
-(defconstant filt-poly-aftertouch 512)
-(defconstant filt-program 1024)
-(defconstant filt-control 2048)
-(defconstant filt-pitchbend 4096)
-(defconstant filt-mtc 8192)
-(defconstant filt-song-position 16384)
-(defconstant filt-song-select 32768)
-(defconstant filt-tune 65536)
-(defconstant filt-tick filt-f9)
-(defconstant filt-undefined (logior filt-f9 filt-fd))
-(defconstant filt-realtime (logior filt-active filt-sysex
- filt-clock filt-play
- filt-undefined filt-reset))
-(defconstant filt-aftertouch (logior filt-channel-aftertouch
- filt-poly-aftertouch ))
-(defconstant filt-systemcommon (logior filt-mtc filt-song-position
- filt-song-select filt-tune))
-(defvar *portmidi* nil) ; t if loaded
-
-;;;
-;;; utils
-;;;
-
-(defvar host-error-text (make-string 256 :initial-element #\*))
-
-(defmacro with-pm-error (form)
- (let ((v (gensym)))
- `(let ((,v ,form))
- (if (not (= ,v pmNoError))
- (if (= ,v pmHostError)
- (cffi:with-foreign-string (host-error host-error-text)
- (pm-get-host-error-text host-error
- (length host-error-text))
- (error "Host error is: ~a"
- (cffi:foreign-string-to-lisp host-error)))
- (error (cffi:foreign-string-to-lisp
- (pm-get-error-text ,v))))
- ,v))))
-
-(defun portmidi ()
- ;; initializer, call before using lib
- (or *portmidi*
- (progn (pm-initialize)
- (setq *portmidi* t))))
-
-(defun Message (status data1 data2)
- ;; portmidi messages are just unsigneds
- (logior (logand (ash data2 16) #xFF0000)
- (logand (ash data1 08) #xFF00)
- (logand status #xFF)))
-
-(defun Message.status (m)
- (logand m #xFF))
-
-(defun Message.data1 (m)
- (logand (ash m -08) #xFF))
-
-(defun Message.data2 (m)
- (logand (ash m -16) #xFF))
-
-;;; accessors
-
-(defun DeviceInfo.interf (ptr)
- (cffi:foreign-string-to-lisp
- (cffi:foreign-slot-value ptr 'pm-device-info 'interf)))
-
-(defun DeviceInfo.name (ptr)
- (cffi:foreign-string-to-lisp
- (cffi:foreign-slot-value ptr 'pm-device-info 'name)))
-
-(defun DeviceInfo.input (ptr)
- (if (= (cffi:foreign-slot-value ptr 'pm-device-info 'input) 0)
- nil
- t))
-
-(defun DeviceInfo.output (ptr)
- (if (= (cffi:foreign-slot-value ptr 'pm-device-info 'output) 0)
- nil
- t))
-
-(defun DeviceInfo.opened (ptr)
- (if (= (cffi:foreign-slot-value ptr 'pm-device-info 'opened) 0)
- nil
- t))
-
-(defun Event.message (e &optional (v nil vp))
- (if vp
- (progn
- (setf (cffi:foreign-slot-value e 'pm-event 'message) v)
- v)
- (cffi:foreign-slot-value e 'pm-event 'message)))
-
-(defun Event.timestamp (e &optional (v nil vp))
- (if vp
- (progn
- (setf (cffi:foreign-slot-value e 'pm-event 'timestamp) v)
- v)
- (cffi:foreign-slot-value e 'pm-event 'timestamp)))
-
-;;; functions
-
-(defun Initialize ()
- (with-pm-error (pm-initialize)))
-
-(defun terminate ()
- (with-pm-error (pm-terminate)))
-
-
-(defun HasHostError (pms)
- (pm-has-host-error pms))
-
-(defun GetErrorText (err)
- (pm-get-error-text err))
-
-; how do i do this?
-;(progn
-; (defalien "pm-GetHostErrorText" void (a c-string) (b unsigned-int))
-; (defun GetHostErrorText ()
-; (pm-GetHostErrorText 256)))
-
-(defun CountDevices ()
- (portmidi)
- (pm-count-devices ))
-
-(defun GetDefaultInputDeviceID ()
- (let ((id (pm-get-default-input-device-id )))
- (if (= id pm-no-device) nil id)))
-
-(defun GetDefaultOutputDeviceID ()
- (let ((id (pm-get-default-output-device-id )))
- (if (= id pm-no-device) nil id)))
-
-;replaced by lispy version end of file.
-;(defun GetDeviceInfo (id) (pm-get-device-info id))
-
-(defun OpenInput (device bufsiz)
- ;; portmidi: timer must be running before opening
- (unless (Started) (Start))
- (cffi:with-foreign-object (p1 :pointer)
- (let ((err (pm-open-input p1 device (cffi:null-pointer)
- bufsiz (cffi:null-pointer) (cffi:null-pointer))))
- (if (= err pmNoError)
- (cffi:mem-ref p1 :pointer)
- (error (pm-get-error-text err))))))
-
-(defun OpenOutput (device bufsiz latency)
- (unless (Started) (Start))
- (cffi:with-foreign-object (p1 :pointer) ;(p (* PortMidi))
- (let ((err (pm-open-output p1 device (cffi:null-pointer)
- bufsiz (cffi:null-pointer) (cffi:null-pointer)
- latency)))
- (if (= err pmNoError)
- (cffi:mem-ref p1 :pointer)
- (error (pm-get-error-text err))))))
-
-(defun SetFilter (a filts)
- (with-pm-error
- (pm-set-filter a filts)))
-
-;(defun SetChannelMask (pms mask)
-; (with-pm-error (pm-set-channel-mask pms mask)))
-
-(defun Abort (pms)
- (with-pm-error (pm-abort pms)))
-
-(defun Close (pms)
- (with-pm-error (pm-close pms)))
-
-(defun EventBufferFree (buf)
- (cffi:foreign-free buf))
-
-(defun EventBufferNew (len)
- (cffi:foreign-alloc 'pm-event :count len))
-
-(defun EventBufferElt (buf i)
- ;; buf is POINTER to buf
- (cffi:mem-aref buf 'pm-event i))
-
-(defun EventBufferSet (buffer index timestamp message)
- (setf (cffi:foreign-slot-value
- (cffi:mem-aref buffer 'pm-event index) 'pm-event 'timestamp)
- timestamp)
- (setf (cffi:foreign-slot-value
- (cffi:mem-aref buffer 'pm-event index) 'pm-event 'message)
- message)
- (values))
-
-(defun EventBufferMap (fn buf end)
- (loop for i below end
- for e = (EventBufferElt buf i)
- do (funcall fn (Event.message e) (Event.timestamp e)))
- (values))
-
-(defun Read (pms *evbuf len)
- (let ((res (pm-read pms *evbuf len)))
- (if (< res 0)
- (error (pm-get-error-text res))
- res)))
-
-(defun Poll (pms)
- (let ((res (pm-poll pms)))
- (cond ((= res 0) nil)
- ((= res 1) t)
- (t (error (pm-get-error-text res))))))
-
-(defun Write (pms *evbuf len)
- (with-pm-error (pm-write pms *evbuf len)))
-
-(defun WriteShort (pms when msg)
- (with-pm-error (pm-write-short pms when msg)))
-
-(defun WriteSysex (pms when string)
- (cffi:with-foreign-string (ptr string)
- (with-pm-error (pm-write-sys-ex pms when ptr))))
-
-;;; porttime.h
-
-(defun Started ()
- (let ((res (pt-started)))
- (if (= res false) nil t)))
-
-(defun Start ()
- ;; NB: This has to be called before opening output or input.
- ;; it seems that if its called 2x we get an error.
- (unless (Started)
- (with-pm-error (pt-start 1 (cffi:null-pointer) (cffi:null-pointer))))
- (values))
-
-(defun Stop ()
- (when (Started)
- (with-pm-error (pt-stop)))
- (values))
-
-(defun Time ()
- (pt-time))
-
-(defun GetDeviceInfo (&optional id)
- (flet ((getone (id)
- (let ((d (pm-get-device-info id)))
- (list :id id
- :name (DeviceInfo.name d)
- :type (if (DeviceInfo.input d) ':input ':output)
- :open (DeviceInfo.opened d)))))
- ;; make sure lib is initialized before checking devices
- (portmidi)
- (if id (getone id)
- (loop for i below (CountDevices)
- collect (getone i)))))
-
-(pushnew ':portmidi *features*)
diff --git a/3rdparty/portmidi/pm_cl/test-no-cm.lisp b/3rdparty/portmidi/pm_cl/test-no-cm.lisp
deleted file mode 100644
index fd8527e6298..00000000000
--- a/3rdparty/portmidi/pm_cl/test-no-cm.lisp
+++ /dev/null
@@ -1,112 +0,0 @@
-;; this is a half-baked sequence of PortMidi calls to test the interface
-;; No calls to Common Music are made, hence test-no-cm.lisp
-
-; setup cffi if it has not been done already
-(if (not (boundp '*clpath*))
- (load "setup-pm.lisp"))
-
-(defun println (s) (print s) (terpri))
-
-;; initialize portmidi lib
-(pm:portmidi)
-;; timer testing
-(pt:Start )
-(pt:Started)
-(format t "time is ~A, type something~%" (pt:Time))
-(read)
-(format t "time is ~A, type something~%" (pt:Time))
-(read)
-(pt:Time)
-(format t "time is ~A, type something~%" (pt:Time))
-
-;; device testing
-(pm:CountDevices)
-(pprint (pm:GetDeviceInfo ))
-(defparameter inid (pm:GetDefaultInputDeviceID ))
-(pm:GetDeviceInfo inid)
-(defparameter outid (pm:GetDefaultOutputDeviceID ))
-(pm:GetDeviceInfo outid)
-;; output testing
-(defparameter outid 4) ; 4 = my SimpleSynth
-(defparameter outdev (pm:OpenOutput outid 100 1000))
-(pm:getDeviceInfo outid) ; :OPEN should be T
-;; message tests
-(defun pm (m &optional (s t))
- (format s "#<message :op ~2,'0x :ch ~2,'0d :data1 ~3,'0d :data2 ~3,'0d>"
- (ash (logand (pm:Message.status m) #xf0) -4)
- (logand (pm:Message.status m) #x0f)
- (pm:Message.data1 m)
- (pm:Message.data2 m)))
-(defparameter on (pm:message #b10010000 60 64))
-(terpri)
-(pm on)
-(pm:Message.status on)
-(logand (ash (pm:Message.status on) -4) #x0f)
-(pm:Message.data1 on)
-(pm:Message.data2 on)
-(pm:WriteShort outdev (+ (pm:time) 100) on)
-(defparameter off (pm:message #b10000000 60 64))
-(terpri)
-(pm off)
-(terpri)
-(println "type something for note off")
-(read)
-(pm:WriteShort outdev (+ (pm:time) 100) off)
-(println "type something to close output device")
-(read)
-(pm:Close outdev)
-;; event buffer testing
-(defparameter buff (pm:EventBufferNew 8))
-(loop for i below 8 for x = (pm:EventBufferElt buff i)
- ;; set buffer events
- do
- (pm:Event.message x (pm:message #b1001000 (+ 60 i) (+ 100 i)))
- (pm:Event.timestamp x (* 1000 i)))
-(loop for i below 8 for x = (pm:EventBufferElt buff i)
- ;; check buffer contents
- collect (list (pm:Event.timestamp x)
- (pm:Message.data1 (pm:Event.message x))
- (pm:Message.data2 (pm:Event.message x))))
-(pm:EventBufferFree buff)
-;; input testing -- requires external midi keyboard
-(println (pm:GetDeviceInfo ))
-(defparameter inid 1) ; 1 = my external keyboard
-(defparameter indev (pm:OpenInput inid 256))
-(pm:GetDeviceInfo inid) ; :OPEN should be T
-(pm:SetFilter indev pm:filt-realtime) ; ignore active sensing etc.
-(println "poll says:")
-(println (pm:Poll indev))
-(println "play midi keyboard and type something")
-(read)
-;;
-;; ...play midi keyboard, then ...
-;;
-(println "poll says")
-(println (pm:Poll indev))
-(defparameter buff (pm:EventBufferNew 32))
-(defparameter num (pm:Read indev buff 32))
-(println "pm:Read gets")
-(println num)
-(println "input messages:")
-(pm:EventBufferMap (lambda (a b) b (terpri) (pm a))
- buff num)
-(pm:Poll indev)
-
-(println "play keyboard, to stop, play middle-C")
-
-;;; recv testing
-
-(defparameter pitch 0)
-(loop while (/= pitch 60) do
- (let ((n (pm:Read indev buff 1)))
- (cond ((= n 1)
- (pm:EventBufferMap
- (lambda (a b)
- b (pm a) (terpri)
- (setf pitch (pm:Message.data1 a)))
- buff n)))))
-
-(pm:EventBufferFree buff)
-(pm:Close indev)
-
-
diff --git a/3rdparty/portmidi/pm_common/CMakeLists.txt b/3rdparty/portmidi/pm_common/CMakeLists.txt
index e1710474ae3..062887bc111 100644
--- a/3rdparty/portmidi/pm_common/CMakeLists.txt
+++ b/3rdparty/portmidi/pm_common/CMakeLists.txt
@@ -1,32 +1,69 @@
-# pm_common
+# pm_common/CMakeLists.txt -- how to build portmidi library
+
+# creates the portmidi library
+# exports PM_NEEDED_LIBS to parent. It seems that PM_NEEDED_LIBS for
+# Linux should include Thread::Thread and ALSA::ALSA, but these
+# are not visible in other CMake files, even though the portmidi
+# target is. Therefore, Thread::Thread is replaced by
+# CMAKE_THREAD_LIBS_INIT and ALSA::ALSA is replaced by ALSA_LIBRARIES.
+# Is there a better way to do this? Maybe this whole file should be
+# at the parent level.
+
+# Support alternative name for static libraries to avoid confusion.
+# (In particular, Xcode has automatically converted portmidi.a to
+# portmidi.dylib without warning, so using portmidi-static.a eliminates
+# this possibility, but default for all libs is "portmidi"):
+set(PM_STATIC_LIB_NAME "portmidi" CACHE STRING
+ "For static builds, the PortMidi library name, e.g. portmidi-static.
+ Default is portmidi")
+set(PM_ACTUAL_LIB_NAME "portmidi")
+if(NOT BUILD_SHARED_LIBS)
+ set(PM_ACTUAL_LIB_NAME ${PM_STATIC_LIB_NAME})
+endif()
# set the build directory for libportmidi.a to be in portmidi, not in
-# portmidi/pm_common
+# portmidi/pm_common. Must be done here BEFORE add_library below.
if(APPLE OR WIN32)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
# set the build directory for .dylib libraries
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
-
- # the first time CMake configures, save off CMake's built-in flags
- if(NOT DEFAULT_DEBUG_FLAGS)
- set(DEFAULT_DEBUG_FLAGS ${CMAKE_C_FLAGS_DEBUG} CACHE
- STRING "CMake's default debug flags" FORCE)
- set(DEFAULT_RELEASE_FLAGS ${CMAKE_C_FLAGS_RELEASE} CACHE
- STRING "CMake's default release flags" FORCE)
- else(NOT DEFAULT_DEBUG_FLAGS)
- message(STATUS "DEFAULT_DEBUG_FLAGS not nil: " ${DEFAULT_DEBUG_FLAGS})
- endif(NOT DEFAULT_DEBUG_FLAGS)
-else(APPLE OR WIN32)
- set(LINUX_FLAGS "-DPMALSA")
endif(APPLE OR WIN32)
-if(APPLE)
- set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk CACHE
- PATH "-isysroot parameter for compiler" FORCE)
- set(CMAKE_C_FLAGS "-mmacosx-version-min=10.5" CACHE
- STRING "needed in conjunction with CMAKE_OSX_SYSROOT" FORCE)
-endif(APPLE)
+# we need full paths to sources because they are shared with other targets
+# (in particular pmjni). Set PMDIR to the top-level portmidi directory:
+get_filename_component(PMDIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
+set(PM_LIB_PUBLIC_SRC ${PMDIR}/pm_common/portmidi.c
+ ${PMDIR}/pm_common/pmutil.c
+ ${PMDIR}/porttime/porttime.c)
+add_library(portmidi ${PM_LIB_PUBLIC_SRC})
+
+# MSVCRT_DLL is "DLL" for shared runtime library, and "" for static:
+set_target_properties(portmidi PROPERTIES
+ VERSION ${LIBRARY_VERSION}
+ SOVERSION ${LIBRARY_SOVERSION}
+ OUTPUT_NAME "${PM_ACTUAL_LIB_NAME}"
+ MSVC_RUNTIME_LIBRARY
+ "MultiThreaded$<$<CONFIG:Debug>:Debug>${MSVCRT_DLL}"
+ WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+target_include_directories(portmidi PUBLIC
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+
+
+option(PM_CHECK_ERRORS
+"Insert a check for error return values at the end of each PortMidi function.
+If an error is encountered, a text message is printed using printf(), the user
+is asked to type ENTER, and then exit(-1) is called to clean up and terminate
+the program.
+
+You should not use PM_CHECK_ERRORS if printf() does not work (e.g. this is not
+a console application under Windows, or there is no visible console on some
+other OS), and you should not use PM_CHECK_ERRORS if you intend to recover
+from errors rather than abruptly terminate the program." OFF)
+if(PM_CHECK_ERRORS)
+ target_compile_definitions(portmidi PRIVATE PM_CHECK_ERRORS)
+endif(PM_CHECK_ERRORS)
macro(prepend_path RESULT PATH)
set(${RESULT})
@@ -35,94 +72,79 @@ macro(prepend_path RESULT PATH)
endforeach(FILE)
endmacro(prepend_path)
-set(CMAKE_C_FLAGS_DEBUG
- "${DEFAULT_DEBUG_FLAGS} -DPM_CHECK_ERRORS=1 -DDEBUG ${LINUX_FLAGS}"
- CACHE STRING "enable extra checks for debugging" FORCE)
-
-set(CMAKE_C_FLAGS_RELEASE "${DEFAULT_RELEASE_FLAGS} ${LINUX_FLAGS}"
- CACHE STRING "flags for release version" FORCE)
+# UNIX needs pthread library
+if(NOT WIN32)
+ set(THREADS_PREFER_PTHREAD_FLAG ON)
+ find_package(Threads REQUIRED)
+endif()
# first include the appropriate system-dependent file:
-if(UNIX)
- # add the -g switch for Linux and Mac OS X (not used in Win32)
- set (CMAKE_C_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}"
- CACHE STRING "enable extra checks for debugging" FORCE)
- if(APPLE)
- set(MACSRC pmmacosxcm pmmac readbinaryplist finddefault)
- prepend_path(LIBSRC ../pm_mac/ ${MACSRC})
- list(APPEND LIBSRC ../porttime/ptmacosx_mach)
-
- include_directories(${CMAKE_OSX_SYSROOT}/Developer/Headers/FlatCarbon)
- set(FRAMEWORK_PATH ${CMAKE_OSX_SYSROOT}/System/Library/Frameworks)
- set(COREAUDIO_LIB "${FRAMEWORK_PATH}/CoreAudio.framework")
- set(COREFOUNDATION_LIB "${FRAMEWORK_PATH}/CoreFoundation.framework")
- set(COREMIDI_LIB "${FRAMEWORK_PATH}/CoreMIDI.framework")
- set(CORESERVICES_LIB "${FRAMEWORK_PATH}/CoreServices.framework")
- set(PM_NEEDED_LIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB}
- ${COREMIDI_LIB} ${CORESERVICES_LIB}
- CACHE INTERNAL "")
-
- set(JAVAVM_LIB "${FRAMEWORK_PATH}/JavaVM.framework")
- set(JAVA_INCLUDE_PATHS ${JAVAVM_LIB}/Headers)
- message(STATUS "SYSROOT: " ${CMAKE_OSX_SYSROOT})
- else(APPLE)
- # LINUX settings...
- include(FindJNI)
- message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH})
- message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH})
- message(STATUS "JAVA_INCLUDE_PATH2 is " ${JAVA_INCLUDE_PATH2})
- message(STATUS "JAVA_JVM_LIBRARY is " ${JAVA_JVM_LIBRARY})
- set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
- # libjvm.so is found relative to JAVA_INCLUDE_PATH:
- set(JAVAVM_LIB ${JAVA_JVM_LIBRARY}/libjvm.so)
-
- set(LINUXSRC pmlinuxalsa pmlinux finddefault)
- prepend_path(LIBSRC ../pm_linux/ ${LINUXSRC})
- list(APPEND LIBSRC ../porttime/ptlinux)
-
- set(PM_NEEDED_LIBS pthread asound)
- endif(APPLE)
-else(UNIX)
- if(WIN32)
+if(UNIX AND APPLE)
+ set(Threads::Threads "" PARENT_SCOPE)
+ find_library(COREAUDIO_LIBRARY CoreAudio REQUIRED)
+ find_library(COREFOUNDATION_LIBRARY CoreFoundation REQUIRED)
+ find_library(COREMIDI_LIBRARY CoreMIDI REQUIRED)
+ find_library(CORESERVICES_LIBRARY CoreServices REQUIRED)
+ set(PM_LIB_PRIVATE_SRC
+ ${PMDIR}/porttime/ptmacosx_mach.c
+ ${PMDIR}/pm_mac/pmmac.c
+ ${PMDIR}/pm_mac/pmmacosxcm.c
+ ${PMDIR}/pm_mac/finddefault.c
+ ${PMDIR}/pm_mac/readbinaryplist.c)
+ set(PM_NEEDED_LIBS ${CMAKE_THREAD_LIBS_INIT} ${COREAUDIO_LIBRARY}
+ ${COREFOUNDATION_LIBRARY} ${COREMIDI_LIBRARY} ${CORESERVICES_LIBRARY}
+ PARENT_SCOPE)
+ target_link_libraries(portmidi PRIVATE Threads::Threads ${COREAUDIO_LIBRARY}
+ ${COREFOUNDATION_LIBRARY} ${COREMIDI_LIBRARY} ${CORESERVICES_LIBRARY})
+ # set to CMake default; is this right?:
+ set_target_properties(portmidi PROPERTIES MACOSX_RPATH ON)
+elseif(HAIKU)
+ set(PM_LIB_PRIVATE_SRC
+ ${PMDIR}/porttime/pthaiku.cpp
+ ${PMDIR}/pm_haiku/pmhaiku.cpp
+ ${PMDIR}/pm_linux/finddefault.c)
+ set(PM_NEEDED_LIBS be midi midi2 PARENT_SCOPE)
+ target_link_libraries(portmidi PRIVATE be midi midi2)
+elseif(UNIX)
+ target_compile_definitions(portmidi PRIVATE ${LINUX_FLAGS})
+ set(PM_LIB_PRIVATE_SRC
+ ${PMDIR}/porttime/ptlinux.c
+ ${PMDIR}/pm_linux/pmlinux.c
+ ${PMDIR}/pm_linux/pmlinuxnull.c
+ ${PMDIR}/pm_linux/finddefault.c)
+ if(${LINUX_DEFINES} MATCHES ".*PMALSA.*")
+ # Note that ALSA is not required if PMNULL is defined -- PortMidi will then
+ # compile without ALSA and report no MIDI devices. Later, PMSNDIO or PMJACK
+ # might be additional options.
+ find_package(ALSA REQUIRED)
+ list(APPEND PM_LIB_PRIVATE_SRC ${PMDIR}/pm_linux/pmlinuxalsa.c)
+ set(PM_NEEDED_LIBS ${CMAKE_THREAD_LIBS_INIT} ${ALSA_LIBRARIES} PARENT_SCOPE)
+ target_link_libraries(portmidi PRIVATE Threads::Threads ALSA::ALSA)
+ set(PKGCONFIG_REQUIRES_PRIVATE "alsa" PARENT_SCOPE)
+ else()
+ message(WARNING "No PMALSA, so PortMidi will not use ALSA, "
+ "and will not find or open MIDI devices.")
+ set(PM_NEEDED_LIBS ${CMAKE_THREAD_LIBS_INIT} PARENT_SCOPE)
+ target_link_libraries(portmidi PRIVATE Threads::Threads)
+ endif()
+elseif(WIN32)
+ set(PM_LIB_PRIVATE_SRC
+ ${PMDIR}/porttime/ptwinmm.c
+ ${PMDIR}/pm_win/pmwin.c
+ ${PMDIR}/pm_win/pmwinmm.c)
+ set(PM_NEEDED_LIBS winmm PARENT_SCOPE)
+ target_link_libraries(portmidi PRIVATE winmm)
+# if(NOT BUILD_SHARED_LIBS AND PM_USE_STATIC_RUNTIME)
# /MDd is multithread debug DLL, /MTd is multithread debug
# /MD is multithread DLL, /MT is multithread. Change to static:
- include(../pm_win/static.cmake)
-
- include(FindJNI)
-
- set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
- # message(STATUS "JAVA_INCLUDE_PATHS: " ${JAVA_INCLUDE_PATHS})
-
- set(WINSRC pmwin pmwinmm)
- prepend_path(LIBSRC ../pm_win/ ${WINSRC})
- list(APPEND LIBSRC ../porttime/ptwinmm)
- set(PM_NEEDED_LIBS winmm.lib)
- endif(WIN32)
-endif(UNIX)
-set(JNI_EXTRA_LIBS ${PM_NEEDED_LIBS} ${JAVA_JVM_LIBRARY})
-
-# this completes the list of library sources by adding shared code
-list(APPEND LIBSRC pmutil portmidi)
-
-# now add the shared files to make the complete list of library sources
-add_library(portmidi-static ${LIBSRC})
-set_target_properties(portmidi-static PROPERTIES OUTPUT_NAME "portmidi_s")
-target_link_libraries(portmidi-static ${PM_NEEDED_LIBS})
+# include(../pm_win/static.cmake)
+# endif()
+else()
+ message(FATAL_ERROR "Operating system not supported.")
+endif()
-# define the jni library
-include_directories(${JAVA_INCLUDE_PATHS})
+set(PM_LIB_PUBLIC_SRC ${PM_LIB_PUBLIC_SRC} PARENT_SCOPE) # export to parent
+set(PM_LIB_PRIVATE_SRC ${PM_LIB_PRIVATE_SRC} PARENT_SCOPE) # export to parent
-set(JNISRC ${LIBSRC} ../pm_java/pmjni/pmjni.c)
-add_library(pmjni SHARED ${JNISRC})
-target_link_libraries(pmjni ${JNI_EXTRA_LIBS})
-set_target_properties(pmjni PROPERTIES EXECUTABLE_EXTENSION "jnilib")
+target_sources(portmidi PRIVATE ${PM_LIB_PRIVATE_SRC})
-# install the libraries (Linux and Mac OS X command line)
-if(UNIX)
- INSTALL(TARGETS portmidi-static pmjni
- LIBRARY DESTINATION /usr/local/lib
- ARCHIVE DESTINATION /usr/local/lib)
-# .h files installed by pm_dylib/CMakeLists.txt, so don't need them here
-# INSTALL(FILES portmidi.h ../porttime/porttime.h
-# DESTINATION /usr/local/include)
-endif(UNIX)
diff --git a/3rdparty/portmidi/pm_common/pminternal.h b/3rdparty/portmidi/pm_common/pminternal.h
index 6b6242026dd..80efbb07f64 100644
--- a/3rdparty/portmidi/pm_common/pminternal.h
+++ b/3rdparty/portmidi/pm_common/pminternal.h
@@ -1,4 +1,4 @@
-/* pminternal.h -- header for interface implementations */
+/** @file pminternal.h header for PortMidi implementations */
/* this file is included by files that implement library internals */
/* Here is a guide to implementers:
@@ -17,6 +17,8 @@
assumptions about pm_fns_type functions are given below.
*/
+/** @cond INTERNAL - add INTERNAL to Doxygen ENABLED_SECTIONS to include */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -27,8 +29,10 @@ extern int pm_initialized; /* see note in portmidi.c */
void *pm_alloc(size_t s);
void pm_free(void *ptr);
-/* if an error occurs while opening or closing a midi stream, set these: */
-extern int pm_hosterror;
+/* if a host error (an error reported by the host MIDI API that is not
+ * mapped to a PortMidi error code) occurs in a synchronous operation
+ * (i.e., not in a callback from another thread) set these: */
+extern int pm_hosterror; /* boolean */
extern char pm_hosterror_text[PM_HOST_ERROR_MSG_LEN];
struct pm_internal_struct;
@@ -51,31 +55,30 @@ typedef PmTimestamp (*pm_synchronize_fn)(struct pm_internal_struct *midi);
of the open fails */
typedef PmError (*pm_open_fn)(struct pm_internal_struct *midi,
void *driverInfo);
+typedef PmError (*pm_create_fn)(int is_input, const char *name,
+ void *driverInfo);
+typedef PmError (*pm_delete_fn)(PmDeviceID id);
typedef PmError (*pm_abort_fn)(struct pm_internal_struct *midi);
/* pm_close_fn should clean up all memory and close the device if any
part of the close fails. */
typedef PmError (*pm_close_fn)(struct pm_internal_struct *midi);
typedef PmError (*pm_poll_fn)(struct pm_internal_struct *midi);
-typedef void (*pm_host_error_fn)(struct pm_internal_struct *midi, char * msg,
- unsigned int len);
-typedef unsigned int (*pm_has_host_error_fn)(struct pm_internal_struct *midi);
+typedef unsigned int (*pm_check_host_error_fn)(struct pm_internal_struct *midi);
typedef struct {
pm_write_short_fn write_short; /* output short MIDI msg */
pm_begin_sysex_fn begin_sysex; /* prepare to send a sysex message */
pm_end_sysex_fn end_sysex; /* marks end of sysex message */
pm_write_byte_fn write_byte; /* accumulate one more sysex byte */
- pm_write_realtime_fn write_realtime; /* send real-time message within sysex */
+ pm_write_realtime_fn write_realtime; /* send real-time msg within sysex */
pm_write_flush_fn write_flush; /* send any accumulated but unsent data */
- pm_synchronize_fn synchronize; /* synchronize portmidi time to stream time */
+ pm_synchronize_fn synchronize; /* synchronize PM time to stream time */
pm_open_fn open; /* open MIDI device */
pm_abort_fn abort; /* abort */
pm_close_fn close; /* close device */
pm_poll_fn poll; /* read pending midi events into portmidi buffer */
- pm_has_host_error_fn has_host_error; /* true when device has had host
- error message */
- pm_host_error_fn host_error; /* provide text readable host error message
- for device (clears and resets) */
+ pm_check_host_error_fn check_host_error; /* true when device has had host */
+ /* error; sets pm_hosterror and writes message to pm_hosterror_text */
} pm_fns_node, *pm_fns_type;
@@ -83,23 +86,25 @@ typedef struct {
extern pm_fns_node pm_none_dictionary;
typedef struct {
- PmDeviceInfo pub; /* some portmidi state also saved in here (for autmatic
- device closing (see PmDeviceInfo struct) */
- void *descriptor; /* ID number passed to win32 multimedia API open */
- void *internalDescriptor; /* points to PmInternal device, allows automatic
- device closing */
+ PmDeviceInfo pub; /* some portmidi state also saved in here (for automatic
+ device closing -- see PmDeviceInfo struct) */
+ int deleted; /* is this is a deleted virtual device? */
+ void *descriptor; /* ID number passed to win32 multimedia API open,
+ * coreMIDI endpoint, etc., representing the device */
+ struct pm_internal_struct *pm_internal; /* points to PmInternal device */
+ /* when the device is open, allows automatic device closing */
pm_fns_type dictionary;
} descriptor_node, *descriptor_type;
extern int pm_descriptor_max;
-extern descriptor_type descriptors;
-extern int pm_descriptor_index;
+extern descriptor_type pm_descriptors;
+extern int pm_descriptor_len;
typedef uint32_t (*time_get_proc_type)(void *time_info);
typedef struct pm_internal_struct {
- int device_id; /* which device is open (index to descriptors) */
- short write_flag; /* MIDI_IN, or MIDI_OUT */
+ int device_id; /* which device is open (index to pm_descriptors) */
+ short is_input; /* MIDI IN (true) or MIDI OUT (false) */
PmTimeProcPtr time_proc; /* where to get the time */
void *time_info; /* pass this to get_time() */
@@ -129,7 +134,7 @@ typedef struct pm_internal_struct {
PmTimestamp now; /* set by PmWrite to current time */
int first_message; /* initially true, used to run first synchronization */
pm_fns_type dictionary; /* implementation functions */
- void *descriptor; /* system-dependent state */
+ void *api_info; /* system-dependent state */
/* the following are used to expedite sysex data */
/* on windows, in debug mode, based on some profiling, these optimizations
* cut the time to process sysex bytes from about 7.5 to 0.26 usec/byte,
@@ -138,7 +143,7 @@ typedef struct pm_internal_struct {
*/
unsigned char *fill_base; /* addr of ptr to sysex data */
uint32_t *fill_offset_ptr; /* offset of next sysex byte */
- int32_t fill_length; /* how many sysex bytes to write */
+ uint32_t fill_length; /* how many sysex bytes to write */
} PmInternal;
@@ -155,8 +160,11 @@ PmTimestamp none_synchronize(PmInternal *midi);
PmError pm_fail_fn(PmInternal *midi);
PmError pm_fail_timestamp_fn(PmInternal *midi, PmTimestamp timestamp);
PmError pm_success_fn(PmInternal *midi);
-PmError pm_add_device(char *interf, char *name, int input, void *descriptor,
- pm_fns_type dictionary);
+PmError pm_add_interf(const char *interf, pm_create_fn create_fn,
+ pm_delete_fn delete_fn);
+PmError pm_add_device(const char *interf, const char *name, int is_input,
+ int is_virtual, void *descriptor, pm_fns_type dictionary);
+void pm_undo_add_device(int id);
uint32_t pm_read_bytes(PmInternal *midi, const unsigned char *data, int len,
PmTimestamp timestamp);
void pm_read_short(PmInternal *midi, PmEvent *event);
@@ -176,3 +184,4 @@ int pm_find_default_device(char *pattern, int is_input);
}
#endif
+/** @endcond */
diff --git a/3rdparty/portmidi/pm_common/pmjni.vcproj b/3rdparty/portmidi/pm_common/pmjni.vcproj
deleted file mode 100644
index b783f3e0c54..00000000000
--- a/3rdparty/portmidi/pm_common/pmjni.vcproj
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="pmjni"
- ProjectGUID="{87B548BD-F5CE-4D1F-9181-390966AC5855}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="pmjni.dir\Debug"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,pmjni_EXPORTS"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../Debug/pmjni.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,pmjni_EXPORTS"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,pmjni_EXPORTS"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib &quot;C:\Program Files\Java\jdk1.6.0_16\include\..\lib\jvm.lib&quot; "
- OutputFile="..\Debug\pmjni.dll"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="..\Debug\pmjni.pdb"
- GenerateDebugInformation="TRUE"
- ImportLibrary="..\Debug\pmjni.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="pmjni.dir\Release"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,pmjni_EXPORTS"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../Release/pmjni.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,pmjni_EXPORTS"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,pmjni_EXPORTS"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib &quot;C:\Program Files\Java\jdk1.6.0_16\include\..\lib\jvm.lib&quot; "
- OutputFile="..\Release\pmjni.dll"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="..\Release\pmjni.pdb"
- ImportLibrary="..\Release\pmjni.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_win\pmwin.c">
- </File>
- <File
- RelativePath="..\pm_win\pmwinmm.c">
- </File>
- <File
- RelativePath="..\porttime\ptwinmm.c">
- </File>
- <File
- RelativePath="..\pm_common\pmutil.c">
- </File>
- <File
- RelativePath="..\pm_common\portmidi.c">
- </File>
- <File
- RelativePath="..\pm_java\pmjni\pmjni.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_common/pmutil.c b/3rdparty/portmidi/pm_common/pmutil.c
index 7d0abe35337..a70fe2fa1f8 100644
--- a/3rdparty/portmidi/pm_common/pmutil.c
+++ b/3rdparty/portmidi/pm_common/pmutil.c
@@ -8,7 +8,7 @@
#include "pmutil.h"
#include "pminternal.h"
-#if defined(WIN32) || defined(_MSC_VER)
+#ifdef WIN32
#define bzero(addr, siz) memset(addr, 0, siz)
#endif
diff --git a/3rdparty/portmidi/pm_common/pmutil.h b/3rdparty/portmidi/pm_common/pmutil.h
index ef5ee4bf84a..17f6984a0d7 100644
--- a/3rdparty/portmidi/pm_common/pmutil.h
+++ b/3rdparty/portmidi/pm_common/pmutil.h
@@ -1,31 +1,48 @@
-/* pmutil.h -- some helpful utilities for building midi
- applications that use PortMidi
+/** @file pmutil.h lock-free queue for building MIDI
+ applications with PortMidi.
+
+ PortMidi is not reentrant, and locks can suffer from priority
+ inversion. To support coordination between system callbacks, a
+ high-priority thread created with PortTime, and the main
+ application thread, PortMidi uses a lock-free, non-blocking
+ queue. The queue implementation is not particular to MIDI and is
+ available for other uses.
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
+/** @defgroup grp_pmutil Lock-free Queue
+ @{
+*/
+
+/** The queue representation is opaque. Declare a queue as PmQueue * */
typedef void PmQueue;
-/*
- A single-reader, single-writer queue is created by
- Pm_QueueCreate(), which takes the number of messages and
- the message size as parameters. The queue only accepts
- fixed sized messages. Returns NULL if memory cannot be allocated.
+/** create a single-reader, single-writer queue.
+
+ @param num_msgs the number of messages the queue can hold
+
+ @param the fixed message size
+
+ @return the allocated and initialized queue, or NULL if memory
+ cannot be allocated. Allocation uses #pm_malloc().
+
+ The queue only accepts fixed sized messages.
This queue implementation uses the "light pipe" algorithm which
operates correctly even with multi-processors and out-of-order
memory writes. (see Alexander Dokumentov, "Lock-free Interprocess
- Communication," Dr. Dobbs Portal, http://www.ddj.com/,
- articleID=189401457, June 15, 2006. This algorithm requires
- that messages be translated to a form where no words contain
- zeros. Each word becomes its own "data valid" tag. Because of
- this translation, we cannot return a pointer to data still in
- the queue when the "peek" method is called. Instead, a buffer
- is preallocated so that data can be copied there. Pm_QueuePeek()
- dequeues a message into this buffer and returns a pointer to
- it. A subsequent Pm_Dequeue() will copy from this buffer.
+ Communication," Dr. Dobbs Portal, http://www.ddj.com/,
+ articleID=189401457, June 15, 2006. This algorithm requires that
+ messages be translated to a form where no words contain
+ zeros. Each word becomes its own "data valid" tag. Because of this
+ translation, we cannot return a pointer to data still in the queue
+ when the "peek" method is called. Instead, a buffer is
+ preallocated so that data can be copied there. Pm_QueuePeek()
+ dequeues a message into this buffer and returns a pointer to it. A
+ subsequent Pm_Dequeue() will copy from this buffer.
This implementation does not try to keep reader/writer data in
separate cache lines or prevent thrashing on cache lines.
@@ -36,92 +53,127 @@ typedef void PmQueue;
of the cache line, especially if messages are smaller than
cache lines. See the Dokumentov article for explanation.
- The algorithm is extended to handle "overflow" reporting. To report
- an overflow, the sender writes the current tail position to a field.
- The receiver must acknowlege receipt by zeroing the field. The sender
- will not send more until the field is zeroed.
-
- Pm_QueueDestroy() destroys the queue and frees its storage.
+ The algorithm is extended to handle "overflow" reporting. To
+ report an overflow, the sender writes the current tail position to
+ a field. The receiver must acknowlege receipt by zeroing the
+ field. The sender will not send more until the field is zeroed.
*/
-
PMEXPORT PmQueue *Pm_QueueCreate(long num_msgs, int32_t bytes_per_msg);
+
+/** destroy a queue and free its storage.
+
+ @param queue a queue created by #Pm_QueueCreate().
+
+ @return pmNoError or an error code.
+
+ Uses #pm_free().
+
+ */
PMEXPORT PmError Pm_QueueDestroy(PmQueue *queue);
-/*
- Pm_Dequeue() removes one item from the queue, copying it into msg.
- Returns 1 if successful, and 0 if the queue is empty.
- Returns pmBufferOverflow if what would have been the next thing
- in the queue was dropped due to overflow. (So when overflow occurs,
- the receiver can receive a queue full of messages before getting the
- overflow report. This protocol ensures that the reader will be
+/** remove one message from the queue, copying it into \p msg.
+
+ @param queue a queue created by #Pm_QueueCreate().
+
+ @param msg address to which the message, if any, is copied.
+
+ @return 1 if successful, and 0 if the queue is empty. Returns
+ #pmBufferOverflow if what would have been the next thing in the
+ queue was dropped due to overflow. (So when overflow occurs, the
+ receiver can receive a queue full of messages before getting the
+ overflow report. This protocol ensures that the reader will be
notified when data is lost due to overflow.
*/
PMEXPORT PmError Pm_Dequeue(PmQueue *queue, void *msg);
+/** insert one message into the queue, copying it from \p msg.
-/*
- Pm_Enqueue() inserts one item into the queue, copying it from msg.
- Returns pmNoError if successful and pmBufferOverflow if the queue was
- already full. If pmBufferOverflow is returned, the overflow flag is set.
+ @param queue a queue created by #Pm_QueueCreate().
+
+ @param msg address of the message to be enqueued.
+
+ @return #pmNoError if successful and #pmBufferOverflow if the
+ queue was already full. If #pmBufferOverflow is returned, the
+ overflow flag is set.
*/
PMEXPORT PmError Pm_Enqueue(PmQueue *queue, void *msg);
+/** test if the queue is full.
-/*
- Pm_QueueFull() returns non-zero if the queue is full
- Pm_QueueEmpty() returns non-zero if the queue is empty
+ @param queue a queue created by #Pm_QueueCreate().
- Either condition may change immediately because a parallel
- enqueue or dequeue operation could be in progress. Furthermore,
- Pm_QueueEmpty() is optimistic: it may say false, when due to
- out-of-order writes, the full message has not arrived. Therefore,
- Pm_Dequeue() could still return 0 after Pm_QueueEmpty() returns
- false. On the other hand, Pm_QueueFull() is pessimistic: if it
- returns false, then Pm_Enqueue() is guaranteed to succeed.
+ @return non-zero iff the queue is empty, and @pmBadPtr if \p queue
+ is NULL.
- Error conditions: Pm_QueueFull() returns pmBadPtr if queue is NULL.
- Pm_QueueEmpty() returns FALSE if queue is NULL.
+ The full condition may change immediately because a parallel
+ dequeue operation could be in progress. The result is
+ pessimistic: if it returns false (zero) to the single writer, then
+ #Pm_Enqueue() is guaranteed to succeed.
*/
PMEXPORT int Pm_QueueFull(PmQueue *queue);
+
+/** test if the queue is empty.
+
+ @param queue a queue created by #Pm_QueueCreate().
+
+ @return zero iff the queue is either empty or NULL.
+
+ The empty condition may change immediately because a parallel
+ enqueue operation could be in progress. Furthermore, the
+ result is optimistic: it may say false, when due to
+ out-of-order writes, the full message has not arrived. Therefore,
+ #Pm_Dequeue() could still return 0 after #Pm_QueueEmpty() returns
+ false.
+*/
PMEXPORT int Pm_QueueEmpty(PmQueue *queue);
+/** get a pointer to the item at the head of the queue.
-/*
- Pm_QueuePeek() returns a pointer to the item at the head of the queue,
- or NULL if the queue is empty. The item is not removed from the queue.
- Pm_QueuePeek() will not indicate when an overflow occurs. If you want
- to get and check pmBufferOverflow messages, use the return value of
- Pm_QueuePeek() *only* as an indication that you should call
- Pm_Dequeue(). At the point where a direct call to Pm_Dequeue() would
- return pmBufferOverflow, Pm_QueuePeek() will return NULL but internally
- clear the pmBufferOverflow flag, enabling Pm_Enqueue() to resume
- enqueuing messages. A subsequent call to Pm_QueuePeek()
- will return a pointer to the first message *after* the overflow.
- Using this as an indication to call Pm_Dequeue(), the first call
- to Pm_Dequeue() will return pmBufferOverflow. The second call will
- return success, copying the same message pointed to by the previous
- Pm_QueuePeek().
-
- When to use Pm_QueuePeek(): (1) when you need to look at the message
+ @param queue a queue created by #Pm_QueueCreate().
+
+ @result a pointer to the head message or NULL if the queue is empty.
+
+ The message is not removed from the queue. #Pm_QueuePeek() will
+ not indicate when an overflow occurs. If you want to get and check
+ #pmBufferOverflow messages, use the return value of
+ #Pm_QueuePeek() *only* as an indication that you should call
+ #Pm_Dequeue(). At the point where a direct call to #Pm_Dequeue()
+ would return #pmBufferOverflow, #Pm_QueuePeek() will return NULL,
+ but internally clear the #pmBufferOverflow flag, enabling
+ #Pm_Enqueue() to resume enqueuing messages. A subsequent call to
+ #Pm_QueuePeek() will return a pointer to the first message *after*
+ the overflow. Using this as an indication to call #Pm_Dequeue(),
+ the first call to #Pm_Dequeue() will return #pmBufferOverflow. The
+ second call will return success, copying the same message pointed
+ to by the previous #Pm_QueuePeek().
+
+ When to use #Pm_QueuePeek(): (1) when you need to look at the message
data to decide who should be called to receive it. (2) when you need
to know a message is ready but cannot accept the message.
- Note that Pm_QueuePeek() is not a fast check, so if possible, you
- might as well just call Pm_Dequeue() and accept the data if it is there.
+ Note that #Pm_QueuePeek() is not a fast check, so if possible, you
+ might as well just call #Pm_Dequeue() and accept the data if it is there.
*/
PMEXPORT void *Pm_QueuePeek(PmQueue *queue);
-/*
- Pm_SetOverflow() allows the writer (enqueuer) to signal an overflow
- condition to the reader (dequeuer). E.g. when transfering data from
- the OS to an application, if the OS indicates a buffer overrun,
- Pm_SetOverflow() can be used to insure that the reader receives a
- pmBufferOverflow result from Pm_Dequeue(). Returns pmBadPtr if queue
- is NULL, returns pmBufferOverflow if buffer is already in an overflow
- state, returns pmNoError if successfully set overflow state.
+/** allows the writer (enqueuer) to signal an overflow
+ condition to the reader (dequeuer).
+
+ @param queue a queue created by #Pm_QueueCreate().
+
+ @return #pmNoError if overflow is set, or #pmBadPtr if queue is
+ NULL, or #pmBufferOverflow if buffer is already in an overflow
+ state.
+
+ E.g., when transfering data from the OS to an application, if the
+ OS indicates a buffer overrun, #Pm_SetOverflow() can be used to
+ insure that the reader receives a #pmBufferOverflow result from
+ #Pm_Dequeue().
*/
PMEXPORT PmError Pm_SetOverflow(PmQueue *queue);
+/** @} */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/3rdparty/portmidi/pm_common/portmidi-dynamic.vcproj b/3rdparty/portmidi/pm_common/portmidi-dynamic.vcproj
deleted file mode 100644
index 42b4a271a20..00000000000
--- a/3rdparty/portmidi/pm_common/portmidi-dynamic.vcproj
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="portmidi-dynamic"
- ProjectGUID="{7283FAD1-7415-4061-A19A-FF5C7BCE9306}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="portmidi-dynamic.dir\Debug"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="3"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,portmidi_dynamic_EXPORTS"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="C:/Users/rbd/portmedia/portmidi/Debug/portmidi.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,portmidi_dynamic_EXPORTS"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,portmidi_dynamic_EXPORTS"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib "
- OutputFile="C:\Users\rbd\portmedia\portmidi\Debug\portmidi.dll"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="C:\Users\rbd\portmedia\portmidi\Debug\portmidi.pdb"
- GenerateDebugInformation="TRUE"
- ImportLibrary="C:\Users\rbd\portmedia\portmidi\Debug\portmidi.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="portmidi-dynamic.dir\Release"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="2"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,portmidi_dynamic_EXPORTS"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="C:/Users/rbd/portmedia/portmidi/Release/portmidi.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,portmidi_dynamic_EXPORTS"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,portmidi_dynamic_EXPORTS"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib "
- OutputFile="C:\Users\rbd\portmedia\portmidi\Release\portmidi.dll"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="C:\Users\rbd\portmedia\portmidi\Release\portmidi.pdb"
- ImportLibrary="C:\Users\rbd\portmedia\portmidi\Release\portmidi.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <File
- RelativePath="C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt">
- <FileConfiguration
- Name="Debug|Win32">
- <Tool
- Name="VCCustomBuildTool"
- Description="Building Custom Rule C:/Users/rbd/portmedia/portmidi/pm_common/CMakeLists.txt"
- CommandLine="&quot;C:\Program Files\CMake 2.6\bin\cmake.exe&quot; -HC:/Users/rbd/portmedia/portmidi -BC:/Users/rbd/portmedia/portmidi --check-stamp-file CMakeFiles/generate.stamp"
- AdditionalDependencies="C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;&quot;C:\Program Files\CMake 2.6\share\cmake-2.6\Modules\FindJNI.cmake&quot;;C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;"
- Outputs="CMakeFiles\generate.stamp"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32">
- <Tool
- Name="VCCustomBuildTool"
- Description="Building Custom Rule C:/Users/rbd/portmedia/portmidi/pm_common/CMakeLists.txt"
- CommandLine="&quot;C:\Program Files\CMake 2.6\bin\cmake.exe&quot; -HC:/Users/rbd/portmedia/portmidi -BC:/Users/rbd/portmedia/portmidi --check-stamp-file CMakeFiles/generate.stamp"
- AdditionalDependencies="C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;&quot;C:\Program Files\CMake 2.6\share\cmake-2.6\Modules\FindJNI.cmake&quot;;C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;"
- Outputs="CMakeFiles\generate.stamp"/>
- </FileConfiguration>
- </File>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="C:\Users\rbd\portmedia\portmidi\pm_win\pmwin.c">
- </File>
- <File
- RelativePath="C:\Users\rbd\portmedia\portmidi\pm_win\pmwinmm.c">
- </File>
- <File
- RelativePath="C:\Users\rbd\portmedia\portmidi\porttime\ptwinmm.c">
- </File>
- <File
- RelativePath="C:\Users\rbd\portmedia\portmidi\pm_common\pmutil.c">
- </File>
- <File
- RelativePath="C:\Users\rbd\portmedia\portmidi\pm_common\portmidi.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_common/portmidi-static.vcproj b/3rdparty/portmidi/pm_common/portmidi-static.vcproj
deleted file mode 100644
index 4702b2d1e31..00000000000
--- a/3rdparty/portmidi/pm_common/portmidi-static.vcproj
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="portmidi-static"
- ProjectGUID="{2985D5DA-D91E-44E0-924B-E612B6AA33F6}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="portmidi-static.dir\Debug"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../Debug/portmidi_s.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\Debug\portmidi_s.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="portmidi-static.dir\Release"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../Release/portmidi_s.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;&quot;C:\Program Files\Java\jdk1.6.0_16\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_16\include\win32&quot;;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\Release\portmidi_s.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_win\pmwin.c">
- </File>
- <File
- RelativePath="..\pm_win\pmwinmm.c">
- </File>
- <File
- RelativePath="..\porttime\ptwinmm.c">
- </File>
- <File
- RelativePath="..\pm_common\pmutil.c">
- </File>
- <File
- RelativePath="..\pm_common\portmidi.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_common/portmidi.c b/3rdparty/portmidi/pm_common/portmidi.c
index 2ed9171e781..7c906dcae42 100644
--- a/3rdparty/portmidi/pm_common/portmidi.c
+++ b/3rdparty/portmidi/pm_common/portmidi.c
@@ -1,7 +1,5 @@
-#ifdef _MSC_VER
- #pragma warning(disable: 4244) // stop warnings about downsize typecasts
- #pragma warning(disable: 4018) // stop warnings about signed/unsigned
-#endif
+/* portmidi.c -- cross-platform MIDI I/O library */
+/* see license.txt for license */
#include "stdlib.h"
#include "string.h"
@@ -36,12 +34,21 @@
#define is_empty(midi) ((midi)->tail == (midi)->head)
-/* this is not static so that pm_init can set it directly if
+/* this is not static so that pm_init can set it directly
* (see pmmac.c:pm_init())
*/
int pm_initialized = FALSE;
-int pm_hosterror;
+int pm_hosterror; /* boolean */
+
+/* if PM_CHECK_ERRORS is enabled, but the caller wants to
+ * handle an error condition, declare this as extern and
+ * set to FALSE (this override is provided specifically
+ * for the test program virttest.c, where pmNameConflict
+ * is expected in a call to Pm_CreateVirtualInput()):
+ */
+int pm_check_errors = TRUE;
+
char pm_hosterror_text[PM_HOST_ERROR_MSG_LEN];
#ifdef PM_CHECK_ERRORS
@@ -54,15 +61,16 @@ static void prompt_and_exit(void)
{
char line[STRING_MAX];
printf("type ENTER...");
- fgets(line, STRING_MAX, stdin);
+ char *rslt = fgets(line, STRING_MAX, stdin);
/* this will clean up open ports: */
exit(-1);
}
-
static PmError pm_errmsg(PmError err)
{
- if (err == pmHostError) {
+ if (!pm_check_errors) { /* see pm_check_errors declaration above */
+ ;
+ } else if (err == pmHostError) {
/* it seems pointless to allocate memory and copy the string,
* so I will do the work of Pm_GetHostErrorText directly
*/
@@ -87,52 +95,193 @@ system implementation of portmidi interface
*/
int pm_descriptor_max = 0;
-int pm_descriptor_index = 0;
-descriptor_type descriptors = NULL;
+int pm_descriptor_len = 0;
+descriptor_type pm_descriptors = NULL;
+
+/* interface pm_descriptors are simple: an array of string/fnptr pairs: */
+#define MAX_INTERF 4
+static struct {
+ const char *interf;
+ pm_create_fn create_fn;
+ pm_delete_fn delete_fn;
+} pm_interf_list[MAX_INTERF];
+
+static int pm_interf_list_len = 0;
+
+
+/* pm_add_interf -- describe an interface to library
+ *
+ * This is called at initialization time, once for each
+ * supported interface (e.g., CoreMIDI). The strings
+ * are retained but NOT COPIED, so do not destroy them!
+ *
+ * The purpose is to register functions that create/delete
+ * a virtual input or output device.
+ *
+ * returns pmInsufficientMemor if interface memory is
+ * exceeded, otherwise returns pmNoError.
+ */
+PmError pm_add_interf(const char *interf, pm_create_fn create_fn,
+ pm_delete_fn delete_fn)
+{
+ if (pm_interf_list_len >= MAX_INTERF) {
+ return pmInsufficientMemory;
+ }
+ pm_interf_list[pm_interf_list_len].interf = interf;
+ pm_interf_list[pm_interf_list_len].create_fn = create_fn;
+ pm_interf_list[pm_interf_list_len].delete_fn = delete_fn;
+ pm_interf_list_len++;
+ return pmNoError;
+}
+
+
+PmError pm_create_virtual(PmInternal *midi, int is_input, const char *interf,
+ const char *name, void *device_info)
+{
+ int i;
+ if (pm_interf_list_len == 0) {
+ return pmNotImplemented;
+ }
+ if (!interf) {
+ /* default interface is the first one */
+ interf = pm_interf_list[0].interf;
+ }
+ for (i = 0; i < pm_interf_list_len; i++) {
+ if (strcmp(pm_interf_list[i].interf,
+ interf) == 0) {
+ int id = (*pm_interf_list[i].create_fn)(is_input, name,
+ device_info);
+ pm_descriptors[id].pub.is_virtual = TRUE;
+ return id;
+ }
+ }
+ return pmInterfaceNotSupported;
+}
+
/* pm_add_device -- describe interface/device pair to library
*
* This is called at intialization time, once for each
- * interface (e.g. DirectSound) and device (e.g. SoundBlaster 1)
- * The strings are retained but NOT COPIED, so do not destroy them!
+ * interface (e.g. DirectSound) and device (e.g. SoundBlaster 1).
+ * This is also called when user creates a virtual device.
+ *
+ * Normally, increasing integer indices are returned. If the device
+ * is virtual, a linear search is performed to ensure that the name
+ * is unique. If the name is already taken, the call will fail and
+ * no device is added.
+ *
+ * interf is assumed to be static memory, so it is NOT COPIED and
+ * NOT FREED.
+ * name is owned by caller, COPIED if needed, and FREED by PortMidi.
+ * Caller is resposible for freeing name when pm_add_device returns.
*
- * returns pmInvalidDeviceId if device memory is exceeded
- * otherwise returns pmNoError
+ * returns pmInvalidDeviceId if device memory is exceeded or a virtual
+ * device would take the name of an existing device.
+ * otherwise returns index (portmidi device_id) of the added device
*/
-PmError pm_add_device(char *interf, char *name, int input,
- void *descriptor, pm_fns_type dictionary) {
- if (pm_descriptor_index >= pm_descriptor_max) {
- // expand descriptors
+PmError pm_add_device(const char *interf, const char *name, int is_input,
+ int is_virtual, void *descriptor, pm_fns_type dictionary) {
+ /* printf("pm_add_device: %s %s %d %p %p\n",
+ interf, name, is_input, descriptor, dictionary); */
+ int device_id;
+ PmDeviceInfo *d;
+ /* if virtual, search for duplicate name or unused ID; otherwise,
+ * just add a new device at the next integer available:
+ */
+ for (device_id = (is_virtual ? 0 : pm_descriptor_len);
+ device_id < pm_descriptor_len; device_id++) {
+ d = &pm_descriptors[device_id].pub;
+ d->structVersion = 200;
+ if (strcmp(d->interf, interf) == 0 && strcmp(d->name, name) == 0) {
+ /* only reuse a name if it is a deleted virtual device with
+ * a matching direction (input or output) */
+ if (pm_descriptors[device_id].deleted && is_input == d->input) {
+ /* here, we know d->is_virtual because only virtual devices
+ * can be deleted, and we know is_virtual because we are
+ * in this loop.
+ */
+ pm_free((void *) d->name); /* reuse this device entry */
+ d->name = NULL;
+ break;
+ /* name conflict exists if the new device appears to others as
+ * the same direction (input or output) as the existing device.
+ * Note that virtual inputs appear to others as outputs and
+ * vice versa.
+ * The direction of the new virtual device to others is "output"
+ * if is_input, i.e., virtual inputs appear to others as outputs.
+ * The existing device appears to others as "output" if
+ * (d->is_virtual == d->input) by the same logic.
+ * The compare will detect if device directions are the same:
+ */
+ } else if (is_input == (d->is_virtual == d->input)) {
+ return pmNameConflict;
+ }
+ }
+ }
+ if (device_id >= pm_descriptor_max) {
+ // expand pm_descriptors
descriptor_type new_descriptors = (descriptor_type)
pm_alloc(sizeof(descriptor_node) * (pm_descriptor_max + 32));
if (!new_descriptors) return pmInsufficientMemory;
- if (descriptors) {
- memcpy(new_descriptors, descriptors,
+ if (pm_descriptors) {
+ memcpy(new_descriptors, pm_descriptors,
sizeof(descriptor_node) * pm_descriptor_max);
- free(descriptors);
+ pm_free(pm_descriptors);
}
pm_descriptor_max += 32;
- descriptors = new_descriptors;
+ pm_descriptors = new_descriptors;
+ }
+ if (device_id == pm_descriptor_len) {
+ pm_descriptor_len++; /* extending array of pm_descriptors */
}
- descriptors[pm_descriptor_index].pub.interf = interf;
- descriptors[pm_descriptor_index].pub.name = name;
- descriptors[pm_descriptor_index].pub.input = input;
- descriptors[pm_descriptor_index].pub.output = !input;
+ d = &pm_descriptors[device_id].pub;
+ d->interf = interf;
+ d->name = pm_alloc(strlen(name) + 1);
+ if (!d->name) {
+ return pmInsufficientMemory;
+ }
+#pragma warning(suppress: 4996) // don't use suggested strncpy_s
+ strcpy(d->name, name);
+ d->input = is_input;
+ d->output = !is_input;
+ d->is_virtual = FALSE; /* caller should set to TRUE if this is virtual */
/* default state: nothing to close (for automatic device closing) */
- descriptors[pm_descriptor_index].pub.opened = FALSE;
+ d->opened = FALSE;
+
+ pm_descriptors[device_id].deleted = FALSE;
/* ID number passed to win32 multimedia API open */
- descriptors[pm_descriptor_index].descriptor = descriptor;
+ pm_descriptors[device_id].descriptor = descriptor;
/* points to PmInternal, allows automatic device closing */
- descriptors[pm_descriptor_index].internalDescriptor = NULL;
+ pm_descriptors[device_id].pm_internal = NULL;
- descriptors[pm_descriptor_index].dictionary = dictionary;
-
- pm_descriptor_index++;
+ pm_descriptors[device_id].dictionary = dictionary;
- return pmNoError;
+ return device_id;
+}
+
+
+/* Undo a successful call to pm_add_device(). If a new device was
+ * allocated, it must be the last device in pm_descriptors, so it is
+ * easy to delete by decrementing the length of pm_descriptors, but
+ * first free the name (which was copied to the heap). Otherwise,
+ * the device must be a virtual device that was created previously
+ * and is in the interior of the array of pm_descriptors. Leave it,
+ * but mark it as deleted.
+ */
+void pm_undo_add_device(int id)
+{
+ /* Clear some fields (not all are strictly necessary) */
+ pm_descriptors[id].deleted = TRUE;
+ pm_descriptors[id].descriptor = NULL;
+ pm_descriptors[id].pm_internal = NULL;
+
+ if (id == pm_descriptor_len - 1) {
+ pm_free(pm_descriptors[id].pub.name);
+ pm_descriptor_len--;
+ }
}
@@ -144,7 +293,7 @@ int pm_find_default_device(char *pattern, int is_input)
int id = pmNoDevice;
int i;
/* first parse pattern into name, interf parts */
- char *interf_pref = (char *)""; /* initially assume it is not there */
+ char const *interf_pref = ""; /* initially assume it is not there */
char *name_pref = strstr(pattern, ", ");
if (name_pref) { /* found separator, adjust the pointer */
@@ -154,7 +303,7 @@ int pm_find_default_device(char *pattern, int is_input)
} else {
name_pref = pattern; /* whole string is the name pattern */
}
- for (i = 0; i < pm_descriptor_index; i++) {
+ for (i = 0; i < pm_descriptor_len; i++) {
const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
if (info->input == is_input &&
strstr(info->name, name_pref) &&
@@ -173,56 +322,71 @@ portmidi implementation
====================================================================
*/
-PMEXPORT int Pm_CountDevices( void ) {
+PMEXPORT int Pm_CountDevices(void)
+{
Pm_Initialize();
/* no error checking -- Pm_Initialize() does not fail */
- return pm_descriptor_index;
+ return pm_descriptor_len;
}
-PMEXPORT const PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ) {
+PMEXPORT const PmDeviceInfo* Pm_GetDeviceInfo(PmDeviceID id)
+{
Pm_Initialize(); /* no error check needed */
- if (id >= 0 && id < pm_descriptor_index) {
- return &descriptors[id].pub;
+ if (id >= 0 && id < pm_descriptor_len && !pm_descriptors[id].deleted) {
+ return &pm_descriptors[id].pub;
}
return NULL;
}
/* pm_success_fn -- "noop" function pointer */
-PmError pm_success_fn(PmInternal *midi) {
+PmError pm_success_fn(PmInternal *midi)
+{
return pmNoError;
}
/* none_write -- returns an error if called */
-PmError none_write_short(PmInternal *midi, PmEvent *buffer) {
+PmError none_write_short(PmInternal *midi, PmEvent *buffer)
+{
return pmBadPtr;
}
/* pm_fail_timestamp_fn -- placeholder for begin_sysex and flush */
-PmError pm_fail_timestamp_fn(PmInternal *midi, PmTimestamp timestamp) {
+PmError pm_fail_timestamp_fn(PmInternal *midi, PmTimestamp timestamp)
+{
return pmBadPtr;
}
PmError none_write_byte(PmInternal *midi, unsigned char byte,
- PmTimestamp timestamp) {
+ PmTimestamp timestamp)
+{
return pmBadPtr;
}
/* pm_fail_fn -- generic function, returns error if called */
-PmError pm_fail_fn(PmInternal *midi) {
+PmError pm_fail_fn(PmInternal *midi)
+{
return pmBadPtr;
}
-static PmError none_open(PmInternal *midi, void *driverInfo) {
+static PmError none_open(PmInternal *midi, void *driverInfo)
+{
return pmBadPtr;
}
-static void none_get_host_error(PmInternal * midi, char * msg, unsigned int len) {
+
+static void none_get_host_error(PmInternal * midi, char * msg,
+ unsigned int len)
+{
*msg = 0; // empty string
}
-static unsigned int none_has_host_error(PmInternal * midi) {
+
+static unsigned int none_check_host_error(PmInternal * midi)
+{
return FALSE;
}
-PmTimestamp none_synchronize(PmInternal *midi) {
+
+PmTimestamp none_synchronize(PmInternal *midi)
+{
return 0;
}
@@ -238,15 +402,15 @@ pm_fns_node pm_none_dictionary = {
none_write_flush,
none_synchronize,
none_open,
- none_abort,
+ none_abort,
none_close,
none_poll,
- none_has_host_error,
- none_get_host_error
+ none_check_host_error,
};
-PMEXPORT const char *Pm_GetErrorText( PmError errnum ) {
+PMEXPORT const char *Pm_GetErrorText(PmError errnum)
+{
const char *msg;
switch(errnum)
@@ -255,47 +419,59 @@ PMEXPORT const char *Pm_GetErrorText( PmError errnum ) {
msg = "";
break;
case pmHostError:
- msg = "PortMidi: `Host error'";
+ msg = "PortMidi: Host error";
break;
case pmInvalidDeviceId:
- msg = "PortMidi: `Invalid device ID'";
+ msg = "PortMidi: Invalid device ID";
break;
case pmInsufficientMemory:
- msg = "PortMidi: `Insufficient memory'";
+ msg = "PortMidi: Insufficient memory";
break;
case pmBufferTooSmall:
- msg = "PortMidi: `Buffer too small'";
+ msg = "PortMidi: Buffer too small";
break;
case pmBadPtr:
- msg = "PortMidi: `Bad pointer'";
+ msg = "PortMidi: Bad pointer";
break;
case pmInternalError:
- msg = "PortMidi: `Internal PortMidi Error'";
+ msg = "PortMidi: Internal PortMidi Error";
break;
case pmBufferOverflow:
- msg = "PortMidi: `Buffer overflow'";
+ msg = "PortMidi: Buffer overflow";
break;
case pmBadData:
- msg = "PortMidi: `Invalid MIDI message Data'";
+ msg = "PortMidi: Invalid MIDI message Data";
break;
case pmBufferMaxSize:
- msg = "PortMidi: `Buffer cannot be made larger'";
+ msg = "PortMidi: Buffer cannot be made larger";
+ break;
+ case pmNotImplemented:
+ msg = "PortMidi: Function is not implemented";
+ break;
+ case pmInterfaceNotSupported:
+ msg = "PortMidi: Interface not supported";
break;
- default:
- msg = "PortMidi: `Illegal error number'";
+ case pmNameConflict:
+ msg = "PortMidi: Cannot create virtual device: name is taken";
+ break;
+ default:
+ msg = "PortMidi: Illegal error number";
break;
}
return msg;
}
-/* This can be called whenever you get a pmHostError return value.
+/* This can be called whenever you get a pmHostError return value
+ * or TRUE from Pm_HasHostError().
* The error will always be in the global pm_hosterror_text.
*/
-PMEXPORT void Pm_GetHostErrorText(char * msg, unsigned int len) {
+PMEXPORT void Pm_GetHostErrorText(char * msg, unsigned int len)
+{
assert(msg);
assert(len > 0);
if (pm_hosterror) {
+#pragma warning(suppress: 4996) // don't use suggested strncpy_s
strncpy(msg, (char *) pm_hosterror_text, len);
pm_hosterror = FALSE;
pm_hosterror_text[0] = 0; /* clear the message; not necessary, but it
@@ -307,24 +483,22 @@ PMEXPORT void Pm_GetHostErrorText(char * msg, unsigned int len) {
}
-PMEXPORT int Pm_HasHostError(PortMidiStream * stream) {
+PMEXPORT int Pm_HasHostError(PortMidiStream * stream)
+{
if (pm_hosterror) return TRUE;
if (stream) {
PmInternal * midi = (PmInternal *) stream;
- pm_hosterror = (*midi->dictionary->has_host_error)(midi);
- if (pm_hosterror) {
- midi->dictionary->host_error(midi, pm_hosterror_text,
- PM_HOST_ERROR_MSG_LEN);
- /* now error message is global */
- return TRUE;
- }
+ return (*midi->dictionary->check_host_error)(midi);
}
return FALSE;
}
-PMEXPORT PmError Pm_Initialize( void ) {
+PMEXPORT PmError Pm_Initialize(void)
+{
if (!pm_initialized) {
+ pm_descriptor_len = 0;
+ pm_interf_list_len = 0;
pm_hosterror = FALSE;
pm_hosterror_text[0] = 0; /* the null string */
pm_init();
@@ -334,16 +508,24 @@ PMEXPORT PmError Pm_Initialize( void ) {
}
-PMEXPORT PmError Pm_Terminate( void ) {
+PMEXPORT PmError Pm_Terminate(void)
+{
if (pm_initialized) {
pm_term();
- // if there are no devices, descriptors might still be NULL
- if (descriptors != NULL) {
- free(descriptors);
- descriptors = NULL;
+ /* if there are no devices, pm_descriptors might still be NULL */
+ if (pm_descriptors != NULL) {
+ int i; /* free names copied into pm_descriptors */
+ for (i = 0; i < pm_descriptor_len; i++) {
+ if (pm_descriptors[i].pub.name) {
+ pm_free(pm_descriptors[i].pub.name);
+ }
+ }
+ pm_free(pm_descriptors);
+ pm_descriptors = NULL;
}
- pm_descriptor_index = 0;
+ pm_descriptor_len = 0;
pm_descriptor_max = 0;
+ pm_interf_list_len = 0;
pm_initialized = FALSE;
}
return pmNoError;
@@ -354,7 +536,8 @@ PMEXPORT PmError Pm_Terminate( void ) {
/*
* returns number of messages actually read, or error code
*/
-PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length) {
+PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length)
+{
PmInternal *midi = (PmInternal *) stream;
int n = 0;
PmError err = pmNoError;
@@ -362,9 +545,9 @@ PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length) {
/* arg checking */
if(midi == NULL)
err = pmBadPtr;
- else if(!descriptors[midi->device_id].pub.opened)
+ else if(!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
- else if(!descriptors[midi->device_id].pub.input)
+ else if(!pm_descriptors[midi->device_id].pub.input)
err = pmBadPtr;
/* First poll for data in the buffer...
* This either simply checks for data, or attempts first to fill the buffer
@@ -375,9 +558,7 @@ PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length) {
if (err != pmNoError) {
if (err == pmHostError) {
- midi->dictionary->host_error(midi, pm_hosterror_text,
- PM_HOST_ERROR_MSG_LEN);
- pm_hosterror = TRUE;
+ midi->dictionary->check_host_error(midi);
}
return pm_errmsg(err);
}
@@ -395,7 +576,7 @@ PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length) {
return n;
}
-PMEXPORT PmError Pm_Poll( PortMidiStream *stream )
+PMEXPORT PmError Pm_Poll(PortMidiStream *stream)
{
PmInternal *midi = (PmInternal *) stream;
PmError err;
@@ -404,23 +585,18 @@ PMEXPORT PmError Pm_Poll( PortMidiStream *stream )
/* arg checking */
if(midi == NULL)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.opened)
+ else if (!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.input)
+ else if (!pm_descriptors[midi->device_id].pub.input)
err = pmBadPtr;
else
err = (*(midi->dictionary->poll))(midi);
if (err != pmNoError) {
- if (err == pmHostError) {
- midi->dictionary->host_error(midi, pm_hosterror_text,
- PM_HOST_ERROR_MSG_LEN);
- pm_hosterror = TRUE;
- }
return pm_errmsg(err);
}
- return !Pm_QueueEmpty(midi->queue);
+ return (PmError) !Pm_QueueEmpty(midi->queue);
}
@@ -432,11 +608,6 @@ static PmError pm_end_sysex(PmInternal *midi)
{
PmError err = (*midi->dictionary->end_sysex)(midi, 0);
midi->sysex_in_progress = FALSE;
- if (err == pmHostError) {
- midi->dictionary->host_error(midi, pm_hosterror_text,
- PM_HOST_ERROR_MSG_LEN);
- pm_hosterror = TRUE;
- }
return err;
}
@@ -445,7 +616,8 @@ static PmError pm_end_sysex(PmInternal *midi)
Pm_WriteSysEx all operate a state machine that "outputs" calls to
write_short, begin_sysex, write_byte, end_sysex, and write_realtime */
-PMEXPORT PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, int32_t length)
+PMEXPORT PmError Pm_Write(PortMidiStream *stream, PmEvent *buffer,
+ int32_t length)
{
PmInternal *midi = (PmInternal *) stream;
PmError err = pmNoError;
@@ -456,9 +628,9 @@ PMEXPORT PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, int32_t leng
/* arg checking */
if(midi == NULL)
err = pmBadPtr;
- else if(!descriptors[midi->device_id].pub.opened)
+ else if(!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
- else if(!descriptors[midi->device_id].pub.output)
+ else if(!pm_descriptors[midi->device_id].pub.output)
err = pmBadPtr;
else
err = pmNoError;
@@ -569,16 +741,15 @@ PMEXPORT PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, int32_t leng
err = (*midi->dictionary->write_flush)(midi, 0);
pm_write_error:
if (err == pmHostError) {
- midi->dictionary->host_error(midi, pm_hosterror_text,
- PM_HOST_ERROR_MSG_LEN);
- pm_hosterror = TRUE;
+ midi->dictionary->check_host_error(midi);
}
error_exit:
return pm_errmsg(err);
}
-PMEXPORT PmError Pm_WriteShort(PortMidiStream *stream, PmTimestamp when, PmMessage msg)
+PMEXPORT PmError Pm_WriteShort(PortMidiStream *stream, PmTimestamp when,
+ PmMessage msg)
{
PmEvent event;
@@ -666,79 +837,110 @@ end_of_sysex:
-PMEXPORT PmError Pm_OpenInput(PortMidiStream** stream,
- PmDeviceID inputDevice,
- void *inputDriverInfo,
- int32_t bufferSize,
- PmTimeProcPtr time_proc,
- void *time_info)
+PmError pm_create_internal(PmInternal **stream, PmDeviceID device_id,
+ int is_input, int latency, PmTimeProcPtr time_proc,
+ void *time_info, int buffer_size)
{
PmInternal *midi;
- PmError err = pmNoError;
- pm_hosterror = FALSE;
- *stream = NULL;
-
- /* arg checking */
- if (inputDevice < 0 || inputDevice >= pm_descriptor_index)
- err = pmInvalidDeviceId;
- else if (!descriptors[inputDevice].pub.input)
- err = pmInvalidDeviceId;
- else if(descriptors[inputDevice].pub.opened)
- err = pmInvalidDeviceId;
-
- if (err != pmNoError)
- goto error_return;
-
+ if (device_id < 0 || device_id >= pm_descriptor_len) {
+ return pmInvalidDeviceId;
+ }
+ if (latency < 0) { /* force a legal value */
+ latency = 0;
+ }
/* create portMidi internal data */
midi = (PmInternal *) pm_alloc(sizeof(PmInternal));
*stream = midi;
if (!midi) {
- err = pmInsufficientMemory;
- goto error_return;
+ return pmInsufficientMemory;
}
- midi->device_id = inputDevice;
- midi->write_flag = FALSE;
+ midi->device_id = device_id;
+ midi->is_input = is_input;
midi->time_proc = time_proc;
+ /* if latency != 0, we need a time reference for output.
+ we always need a time reference for input.
+ If none is provided, use PortTime library */
+ if (time_proc == NULL && (latency != 0 || is_input)) {
+ if (!Pt_Started())
+ Pt_Start(1, 0, 0);
+ /* time_get does not take a parameter, so coerce */
+ midi->time_proc = (PmTimeProcPtr) Pt_Time;
+ }
midi->time_info = time_info;
- /* windows adds timestamps in the driver and these are more accurate than
- using a time_proc, so do not automatically provide a time proc. Non-win
- implementations may want to provide a default time_proc in their
- system-specific midi_out_open() method.
- */
- if (bufferSize <= 0) bufferSize = 256; /* default buffer size */
- midi->queue = Pm_QueueCreate(bufferSize, (int32_t) sizeof(PmEvent));
- if (!midi->queue) {
- /* free portMidi data */
- *stream = NULL;
- pm_free(midi);
- err = pmInsufficientMemory;
- goto error_return;
+ if (is_input) {
+ midi->latency = 0; /* unused by input */
+ if (buffer_size <= 0) buffer_size = 256; /* default buffer size */
+ midi->queue = Pm_QueueCreate(buffer_size, (int32_t) sizeof(PmEvent));
+ if (!midi->queue) {
+ /* free portMidi data */
+ *stream = NULL;
+ pm_free(midi);
+ return pmInsufficientMemory;
+ }
+ } else {
+ /* if latency zero, output immediate (timestamps ignored) */
+ /* if latency < 0, use 0 but don't return an error */
+ if (latency < 0) latency = 0;
+ midi->latency = latency;
+ midi->queue = NULL; /* unused by output; input needs to allocate: */
}
- midi->buffer_len = bufferSize; /* portMidi input storage */
- midi->latency = 0; /* not used */
+ midi->buffer_len = buffer_size; /* portMidi input storage */
midi->sysex_in_progress = FALSE;
midi->sysex_message = 0;
midi->sysex_message_count = 0;
- midi->filters = PM_FILT_ACTIVE;
+ midi->filters = (is_input ? PM_FILT_ACTIVE : 0);
midi->channel_mask = 0xFFFF;
midi->sync_time = 0;
midi->first_message = TRUE;
- midi->dictionary = descriptors[inputDevice].dictionary;
+ midi->api_info = NULL;
midi->fill_base = NULL;
midi->fill_offset_ptr = NULL;
midi->fill_length = 0;
- descriptors[inputDevice].internalDescriptor = midi;
+ midi->dictionary = pm_descriptors[device_id].dictionary;
+ pm_descriptors[device_id].pm_internal = midi;
+ return pmNoError;
+}
+
+
+PMEXPORT PmError Pm_OpenInput(PortMidiStream** stream,
+ PmDeviceID inputDevice,
+ void *inputDriverInfo,
+ int32_t bufferSize,
+ PmTimeProcPtr time_proc,
+ void *time_info)
+{
+ PmInternal *midi = NULL;
+ PmError err = pmNoError;
+ pm_hosterror = FALSE;
+ *stream = NULL; /* invariant: *stream == midi */
+
+ /* arg checking */
+ if (!pm_descriptors[inputDevice].pub.input)
+ err = pmInvalidDeviceId;
+ else if (pm_descriptors[inputDevice].pub.opened)
+ err = pmInvalidDeviceId;
+ if (err != pmNoError)
+ goto error_return;
+
+ /* common initialization of PmInternal structure (midi): */
+ err = pm_create_internal(&midi, inputDevice, TRUE, 0, time_proc,
+ time_info, bufferSize);
+ *stream = midi;
+ if (err) {
+ goto error_return;
+ }
+
/* open system dependent input device */
err = (*midi->dictionary->open)(midi, inputDriverInfo);
if (err) {
*stream = NULL;
- descriptors[inputDevice].internalDescriptor = NULL;
+ pm_descriptors[inputDevice].pm_internal = NULL;
/* free portMidi data */
Pm_QueueDestroy(midi->queue);
pm_free(midi);
} else {
/* portMidi input open successful */
- descriptors[inputDevice].pub.opened = TRUE;
+ pm_descriptors[inputDevice].pub.opened = TRUE;
}
error_return:
/* note: if there is a pmHostError, it is the responsibility
@@ -750,12 +952,12 @@ error_return:
PMEXPORT PmError Pm_OpenOutput(PortMidiStream** stream,
- PmDeviceID outputDevice,
- void *outputDriverInfo,
- int32_t bufferSize,
- PmTimeProcPtr time_proc,
- void *time_info,
- int32_t latency )
+ PmDeviceID outputDevice,
+ void *outputDriverInfo,
+ int32_t bufferSize,
+ PmTimeProcPtr time_proc,
+ void *time_info,
+ int32_t latency)
{
PmInternal *midi;
PmError err = pmNoError;
@@ -763,62 +965,33 @@ PMEXPORT PmError Pm_OpenOutput(PortMidiStream** stream,
*stream = NULL;
/* arg checking */
- if (outputDevice < 0 || outputDevice >= pm_descriptor_index)
+ if (outputDevice < 0 || outputDevice >= pm_descriptor_len)
err = pmInvalidDeviceId;
- else if (!descriptors[outputDevice].pub.output)
+ else if (!pm_descriptors[outputDevice].pub.output)
err = pmInvalidDeviceId;
- else if (descriptors[outputDevice].pub.opened)
+ else if (pm_descriptors[outputDevice].pub.opened)
err = pmInvalidDeviceId;
if (err != pmNoError)
goto error_return;
- /* create portMidi internal data */
- midi = (PmInternal *) pm_alloc(sizeof(PmInternal));
- *stream = midi;
- if (!midi) {
- err = pmInsufficientMemory;
+ /* common initialization of PmInternal structure (midi): */
+ err = pm_create_internal(&midi, outputDevice, FALSE, latency, time_proc,
+ time_info, bufferSize);
+ *stream = midi;
+ if (err) {
goto error_return;
}
- midi->device_id = outputDevice;
- midi->write_flag = TRUE;
- midi->time_proc = time_proc;
- /* if latency > 0, we need a time reference. If none is provided,
- use PortTime library */
- if (time_proc == NULL && latency != 0) {
- if (!Pt_Started())
- Pt_Start(1, 0, 0);
- /* time_get does not take a parameter, so coerce */
- midi->time_proc = (PmTimeProcPtr) Pt_Time;
- }
- midi->time_info = time_info;
- midi->buffer_len = bufferSize;
- midi->queue = NULL; /* unused by output */
- /* if latency zero, output immediate (timestamps ignored) */
- /* if latency < 0, use 0 but don't return an error */
- if (latency < 0) latency = 0;
- midi->latency = latency;
- midi->sysex_in_progress = FALSE;
- midi->sysex_message = 0; /* unused by output */
- midi->sysex_message_count = 0; /* unused by output */
- midi->filters = 0; /* not used for output */
- midi->channel_mask = 0xFFFF;
- midi->sync_time = 0;
- midi->first_message = TRUE;
- midi->dictionary = descriptors[outputDevice].dictionary;
- midi->fill_base = NULL;
- midi->fill_offset_ptr = NULL;
- midi->fill_length = 0;
- descriptors[outputDevice].internalDescriptor = midi;
+
/* open system dependent output device */
err = (*midi->dictionary->open)(midi, outputDriverInfo);
if (err) {
*stream = NULL;
- descriptors[outputDevice].internalDescriptor = NULL;
+ pm_descriptors[outputDevice].pm_internal = NULL;
/* free portMidi data */
pm_free(midi);
} else {
/* portMidi input open successful */
- descriptors[outputDevice].pub.opened = TRUE;
+ pm_descriptors[outputDevice].pub.opened = TRUE;
}
error_return:
/* note: system-dependent code must set pm_hosterror and
@@ -828,6 +1001,91 @@ error_return:
}
+static PmError create_virtual_device(const char *name, const char *interf,
+ void *device_info, int is_input)
+{
+ PmError err = pmNoError;
+ int i;
+ pm_hosterror = FALSE;
+
+ /* arg checking */
+ if (!name) {
+ err = pmInvalidDeviceId;
+ goto error_return;
+ }
+
+ Pm_Initialize(); /* just in case */
+
+ /* create the virtual device */
+ if (pm_interf_list_len == 0) {
+ return pmNotImplemented;
+ }
+ if (!interf) {
+ /* default interface is the first one */
+ interf = pm_interf_list[0].interf;
+ }
+ /* look up and call the create_fn for interf(ace), e.g. "CoreMIDI" */
+ for (i = 0; i < pm_interf_list_len; i++) {
+ if (strcmp(pm_interf_list[i].interf, interf) == 0) {
+ int id = (*pm_interf_list[i].create_fn)(is_input,
+ name, device_info);
+ /* id could be pmNameConflict or an actual descriptor index */
+ if (id >= 0) {
+ pm_descriptors[id].pub.is_virtual = TRUE;
+ }
+ err = id;
+ goto error_return;
+ }
+ }
+ err = pmInterfaceNotSupported;
+
+error_return:
+ /* note: if there is a pmHostError, it is the responsibility
+ * of the system-dependent code (*midi->dictionary->open)()
+ * to set pm_hosterror and pm_hosterror_text
+ */
+ return pm_errmsg(err);
+}
+
+
+PMEXPORT PmError Pm_CreateVirtualInput(const char *name,
+ const char *interf,
+ void *deviceInfo)
+{
+ return create_virtual_device(name, interf, deviceInfo, TRUE);
+}
+
+PMEXPORT PmError Pm_CreateVirtualOutput(const char *name, const char *interf,
+ void *deviceInfo)
+{
+ return create_virtual_device(name, interf, deviceInfo, FALSE);
+}
+
+PmError Pm_DeleteVirtualDevice(PmDeviceID id)
+{
+ int i;
+ const char *interf = pm_descriptors[id].pub.interf;
+ PmError err = pmBadData; /* returned if we cannot find the interface-
+ * specific delete function */
+ /* arg checking */
+ if (id < 0 || id >= pm_descriptor_len ||
+ pm_descriptors[id].pub.opened || pm_descriptors[id].deleted) {
+ return pmInvalidDeviceId;
+ }
+ /* delete function pointer is in interfaces list */
+ for (i = 0; i < pm_interf_list_len; i++) {
+ if (strcmp(pm_interf_list[i].interf, interf) == 0) {
+ err = (*pm_interf_list[i].delete_fn)(id);
+ break;
+ }
+ }
+ pm_descriptors[id].deleted = TRUE;
+ /* (pm_internal should already be NULL because !pub.opened) */
+ pm_descriptors[id].pm_internal = NULL;
+ pm_descriptors[id].descriptor = NULL;
+ return err;
+}
+
PMEXPORT PmError Pm_SetChannelMask(PortMidiStream *stream, int mask)
{
PmInternal *midi = (PmInternal *) stream;
@@ -842,14 +1100,15 @@ PMEXPORT PmError Pm_SetChannelMask(PortMidiStream *stream, int mask)
}
-PMEXPORT PmError Pm_SetFilter(PortMidiStream *stream, int32_t filters) {
+PMEXPORT PmError Pm_SetFilter(PortMidiStream *stream, int32_t filters)
+{
PmInternal *midi = (PmInternal *) stream;
PmError err = pmNoError;
/* arg checking */
if (midi == NULL)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.opened)
+ else if (!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
else
midi->filters = filters;
@@ -857,7 +1116,8 @@ PMEXPORT PmError Pm_SetFilter(PortMidiStream *stream, int32_t filters) {
}
-PMEXPORT PmError Pm_Close( PortMidiStream *stream ) {
+PMEXPORT PmError Pm_Close(PortMidiStream *stream)
+{
PmInternal *midi = (PmInternal *) stream;
PmError err = pmNoError;
@@ -866,10 +1126,10 @@ PMEXPORT PmError Pm_Close( PortMidiStream *stream ) {
if (midi == NULL) /* midi must point to something */
err = pmBadPtr;
/* if it is an open device, the device_id will be valid */
- else if (midi->device_id < 0 || midi->device_id >= pm_descriptor_index)
+ else if (midi->device_id < 0 || midi->device_id >= pm_descriptor_len)
err = pmBadPtr;
/* and the device should be in the opened state */
- else if (!descriptors[midi->device_id].pub.opened)
+ else if (!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
if (err != pmNoError)
@@ -878,8 +1138,8 @@ PMEXPORT PmError Pm_Close( PortMidiStream *stream ) {
/* close the device */
err = (*midi->dictionary->close)(midi);
/* even if an error occurred, continue with cleanup */
- descriptors[midi->device_id].internalDescriptor = NULL;
- descriptors[midi->device_id].pub.opened = FALSE;
+ pm_descriptors[midi->device_id].pm_internal = NULL;
+ pm_descriptors[midi->device_id].pub.opened = FALSE;
if (midi->queue) Pm_QueueDestroy(midi->queue);
pm_free(midi);
error_return:
@@ -889,56 +1149,57 @@ error_return:
return pm_errmsg(err);
}
-PmError Pm_Synchronize( PortMidiStream* stream ) {
+PmError Pm_Synchronize(PortMidiStream* stream)
+{
PmInternal *midi = (PmInternal *) stream;
PmError err = pmNoError;
if (midi == NULL)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.output)
+ else if (!pm_descriptors[midi->device_id].pub.output)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.opened)
+ else if (!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
else
midi->first_message = TRUE;
return err;
}
-PMEXPORT PmError Pm_Abort( PortMidiStream* stream ) {
+PMEXPORT PmError Pm_Abort(PortMidiStream* stream)
+{
PmInternal *midi = (PmInternal *) stream;
PmError err;
/* arg checking */
if (midi == NULL)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.output)
+ else if (!pm_descriptors[midi->device_id].pub.output)
err = pmBadPtr;
- else if (!descriptors[midi->device_id].pub.opened)
+ else if (!pm_descriptors[midi->device_id].pub.opened)
err = pmBadPtr;
else
err = (*midi->dictionary->abort)(midi);
if (err == pmHostError) {
- midi->dictionary->host_error(midi, pm_hosterror_text,
- PM_HOST_ERROR_MSG_LEN);
- pm_hosterror = TRUE;
+ midi->dictionary->check_host_error(midi);
}
return pm_errmsg(err);
}
-/* pm_channel_filtered returns non-zero if the channel mask is blocking the current channel */
+/* pm_channel_filtered returns non-zero if the channel mask is
+ blocking the current channel */
#define pm_channel_filtered(status, mask) \
((((status) & 0xF0) != 0xF0) && (!(Pm_Channel((status) & 0x0F) & (mask))))
-/* The following two functions will checks to see if a MIDI message matches
- the filtering criteria. Since the sysex routines only want to filter realtime messages,
- we need to have separate routines.
+/* The following two functions will checks to see if a MIDI message
+ matches the filtering criteria. Since the sysex routines only want
+ to filter realtime messages, we need to have separate routines.
*/
-/* pm_realtime_filtered returns non-zero if the filter will kill the current message.
- Note that only realtime messages are checked here.
+/* pm_realtime_filtered returns non-zero if the filter will kill the
+ current message. Note that only realtime messages are checked here.
*/
#define pm_realtime_filtered(status, filters) \
((((status) & 0xF0) == 0xF0) && ((1 << ((status) & 0xF)) & (filters)))
@@ -959,18 +1220,21 @@ PMEXPORT PmError Pm_Abort( PortMidiStream* stream ) {
}*/
-/* pm_status_filtered returns non-zero if a filter will kill the current message, based on status.
- Note that sysex and real time are not checked. It is up to the subsystem (winmm, core midi, alsa)
- to filter sysex, as it is handled more easily and efficiently at that level.
- Realtime message are filtered in pm_realtime_filtered.
+/* pm_status_filtered returns non-zero if a filter will kill the
+ current message, based on status. Note that sysex and real time are
+ not checked. It is up to the subsystem (winmm, core midi, alsa) to
+ filter sysex, as it is handled more easily and efficiently at that
+ level. Realtime message are filtered in pm_realtime_filtered.
*/
-#define pm_status_filtered(status, filters) ((1 << (16 + ((status) >> 4))) & (filters))
+#define pm_status_filtered(status, filters) \
+ ((1 << (16 + ((status) >> 4))) & (filters))
/*
return ((status == MIDI_NOTE_ON) && (filters & PM_FILT_NOTE))
|| ((status == MIDI_NOTE_OFF) && (filters & PM_FILT_NOTE))
- || ((status == MIDI_CHANNEL_AT) && (filters & PM_FILT_CHANNEL_AFTERTOUCH))
+ || ((status == MIDI_CHANNEL_AT) &&
+ (filters & PM_FILT_CHANNEL_AFTERTOUCH))
|| ((status == MIDI_POLY_AT) && (filters & PM_FILT_POLY_AFTERTOUCH))
|| ((status == MIDI_PROGRAM) && (filters & PM_FILT_PROGRAM))
|| ((status == MIDI_CONTROL) && (filters & PM_FILT_CONTROL))
diff --git a/3rdparty/portmidi/pm_common/portmidi.h b/3rdparty/portmidi/pm_common/portmidi.h
index c57432fae12..1a4c7e7d0ab 100644
--- a/3rdparty/portmidi/pm_common/portmidi.h
+++ b/3rdparty/portmidi/pm_common/portmidi.h
@@ -48,69 +48,43 @@ extern "C" {
*
* NOTES ON HOST ERROR REPORTING:
*
- * PortMidi errors (of type PmError) are generic, system-independent errors.
- * When an error does not map to one of the more specific PmErrors, the
- * catch-all code pmHostError is returned. This means that PortMidi has
- * retained a more specific system-dependent error code. The caller can
- * get more information by calling Pm_HasHostError() to test if there is
- * a pending host error, and Pm_GetHostErrorText() to get a text string
- * describing the error. Host errors are reported on a per-device basis
- * because only after you open a device does PortMidi have a place to
- * record the host error code. I.e. only
- * those routines that receive a (PortMidiStream *) argument check and
- * report errors. One exception to this is that Pm_OpenInput() and
- * Pm_OpenOutput() can report errors even though when an error occurs,
- * there is no PortMidiStream* to hold the error. Fortunately, both
- * of these functions return any error immediately, so we do not really
- * need per-device error memory. Instead, any host error code is stored
- * in a global, pmHostError is returned, and the user can call
- * Pm_GetHostErrorText() to get the error message (and the invalid stream
- * parameter will be ignored.) The functions
- * pm_init and pm_term do not fail or raise
- * errors. The job of pm_init is to locate all available devices so that
- * the caller can get information via PmDeviceInfo(). If an error occurs,
- * the device is simply not listed as available.
- *
- * Host errors come in two flavors:
- * a) host error
- * b) host error during callback
- * These can occur w/midi input or output devices. (b) can only happen
- * asynchronously (during callback routines), whereas (a) only occurs while
- * synchronously running PortMidi and any resulting system dependent calls.
- * Both (a) and (b) are reported by the next read or write call. You can
- * also query for asynchronous errors (b) at any time by calling
- * Pm_HasHostError().
+ * PortMidi errors (of type PmError) are generic,
+ * system-independent errors. When an error does not map to one of
+ * the more specific PmErrors, the catch-all code pmHostError is
+ * returned. This means that PortMidi has retained a more specific
+ * system-dependent error code. The caller can get more information
+ * by calling Pm_GetHostErrorText() to get a text string describing
+ * the error. Host errors can arise asynchronously from callbacks,
+ * * so there is no specific return code. Asynchronous errors are
+ * checked and reported by Pm_Poll. You can also check by calling
+ * Pm_HasHostError(). If this returns TRUE, Pm_GetHostErrorText()
+ * will return a text description of the error.
*
* NOTES ON COMPILE-TIME SWITCHES
*
- * DEBUG assumes stdio and a console. Use this if you want automatic, simple
- * error reporting, e.g. for prototyping. If you are using MFC or some
- * other graphical interface with no console, DEBUG probably should be
- * undefined.
- * PM_CHECK_ERRORS more-or-less takes over error checking for return values,
- * stopping your program and printing error messages when an error
- * occurs. This also uses stdio for console text I/O.
+ * DEBUG assumes stdio and a console. Use this if you want
+ * automatic, simple error reporting, e.g. for prototyping. If
+ * you are using MFC or some other graphical interface with no
+ * console, DEBUG probably should be undefined.
+ * PM_CHECK_ERRORS more-or-less takes over error checking for
+ * return values, stopping your program and printing error
+ * messages when an error occurs. This also uses stdio for
+ * console text I/O. You can selectively disable this error
+ * checking by declaring extern int pm_check_errors; and
+ * setting pm_check_errors = FALSE; You can also reenable.
*/
+/**
+ \defgroup grp_basics Basic Definitions
+ @{
+*/
-#ifndef WIN32
-// Linux and OS X have stdint.h
#include <stdint.h>
-#else
-#ifndef INT32_DEFINED
-// rather than having users install a special .h file for windows,
-// just put the required definitions inline here. porttime.h uses
-// these too, so the definitions are (unfortunately) duplicated there
-typedef int int32_t;
-typedef unsigned int uint32_t;
-#define INT32_DEFINED
-#endif
-#endif
-//#ifdef _WINDLL
-//#define PMEXPORT __declspec(dllexport)
-//#else
+#ifdef _WINDLL
+#define PMEXPORT __declspec(dllexport)
+#else
#define PMEXPORT
-//#endif
+#endif
#ifndef FALSE
#define FALSE 0
@@ -122,113 +96,206 @@ typedef unsigned int uint32_t;
/* default size of buffers for sysex transmission: */
#define PM_DEFAULT_SYSEX_BUFFER_SIZE 1024
-/** List of portmidi errors.*/
+
typedef enum {
- pmNoError = 0,
- pmNoData = 0, /**< A "no error" return that also indicates no data avail. */
- pmGotData = 1, /**< A "no error" return that also indicates data available */
+ pmNoError = 0, /**< Normal return value indicating no error. */
+ pmNoData = 0, /**< @brief No error, also indicates no data available.
+ * Use this constant where a value greater than zero would
+ * indicate data is available.
+ */
+ pmGotData = 1, /**< A "no error" return also indicating data available. */
pmHostError = -10000,
- pmInvalidDeviceId, /** out of range or
+ pmInvalidDeviceId, /**< Out of range or
* output device when input is requested or
* input device when output is requested or
- * device is already opened
+ * device is already opened.
*/
pmInsufficientMemory,
pmBufferTooSmall,
pmBufferOverflow,
- pmBadPtr, /* PortMidiStream parameter is NULL or
+ pmBadPtr, /**< #PortMidiStream parameter is NULL or
* stream is not opened or
* stream is output when input is required or
- * stream is input when output is required */
- pmBadData, /** illegal midi data, e.g. missing EOX */
+ * stream is input when output is required. */
+ pmBadData, /**< Illegal midi data, e.g., missing EOX. */
pmInternalError,
- pmBufferMaxSize /** buffer is already as large as it can be */
- /* NOTE: If you add a new error type, be sure to update Pm_GetErrorText() */
-} PmError;
+ pmBufferMaxSize, /**< Buffer is already as large as it can be. */
+ pmNotImplemented, /**< The function is not implemented, nothing was done. */
+ pmInterfaceNotSupported, /**< The requested interface is not supported. */
+ pmNameConflict /**< Cannot create virtual device because name is taken. */
+ /* NOTE: If you add a new error type, you must update Pm_GetErrorText(). */
+} PmError; /**< @brief @enum PmError PortMidi error code; a common return type.
+ * No error is indicated by zero; errors are indicated by < 0.
+ */
/**
- Pm_Initialize() is the library initialisation function - call this before
+ Pm_Initialize() is the library initialization function - call this before
using the library.
+
+ *NOTE:* PortMidi scans for available devices when #Pm_Initialize
+ is called. To observe subsequent changes in the available
+ devices, you must shut down PortMidi by calling #Pm_Terminate and
+ then restart by calling #Pm_Initialize again. *IMPORTANT*: On
+ MacOS, #Pm_Initialize *must* always be called on the same
+ thread. Otherwise, changes in the available MIDI devices will
+ *not* be seen by PortMidi. As an example, if you start PortMidi in
+ a thread for processing MIDI, do not try to rescan devices by
+ calling #Pm_Initialize in a GUI thread. Instead, start PortMidi
+ the first time and every time in the GUI thread. Alternatively,
+ let the GUI request a restart in the MIDI thread. (These
+ restrictions only apply to macOS.) Speaking of threads, on all
+ platforms, you are allowed to call #Pm_Initialize in one thread,
+ yet send MIDI or poll for incoming MIDI in another
+ thread. However, PortMidi is not "thread safe," which means you
+ cannot allow threads to call PortMidi functions concurrently.
+
+ @return pmNoError.
+
+ PortMidi is designed to support multiple interfaces (such as ALSA,
+ CoreMIDI and WinMM). It is possible to return pmNoError because there
+ are no supported interfaces. In that case, zero devices will be
+ available.
*/
-PMEXPORT PmError Pm_Initialize( void );
+PMEXPORT PmError Pm_Initialize(void);
/**
Pm_Terminate() is the library termination function - call this after
using the library.
*/
-PMEXPORT PmError Pm_Terminate( void );
+PMEXPORT PmError Pm_Terminate(void);
-/** A single PortMidiStream is a descriptor for an open MIDI device.
-*/
+/** Represents an open MIDI device. */
typedef void PortMidiStream;
+
+/** A shorter form of #PortMidiStream. */
#define PmStream PortMidiStream
-/**
- Test whether stream has a pending host error. Normally, the client finds
- out about errors through returned error codes, but some errors can occur
- asynchronously where the client does not
- explicitly call a function, and therefore cannot receive an error code.
- The client can test for a pending error using Pm_HasHostError(). If true,
- the error can be accessed and cleared by calling Pm_GetErrorText().
- Errors are also cleared by calling other functions that can return
- errors, e.g. Pm_OpenInput(), Pm_OpenOutput(), Pm_Read(), Pm_Write(). The
- client does not need to call Pm_HasHostError(). Any pending error will be
- reported the next time the client performs an explicit function call on
- the stream, e.g. an input or output operation. Until the error is cleared,
- no new error codes will be obtained, even for a different stream.
+/** Test whether stream has a pending host error. Normally, the client
+ finds out about errors through returned error codes, but some
+ errors can occur asynchronously where the client does not
+ explicitly call a function, and therefore cannot receive an error
+ code. The client can test for a pending error using
+ Pm_HasHostError(). If true, the error can be accessed by calling
+ Pm_GetHostErrorText(). Pm_Poll() is similar to Pm_HasHostError(),
+ but if there is no error, it will return TRUE (1) if there is a
+ pending input message.
*/
-PMEXPORT int Pm_HasHostError( PortMidiStream * stream );
+PMEXPORT int Pm_HasHostError(PortMidiStream * stream);
-/** Translate portmidi error number into human readable message.
+/** Translate portmidi error number into human readable message.
These strings are constants (set at compile time) so client has
- no need to allocate storage
+ no need to allocate storage.
*/
-PMEXPORT const char *Pm_GetErrorText( PmError errnum );
+PMEXPORT const char *Pm_GetErrorText(PmError errnum);
-/** Translate portmidi host error into human readable message.
+/** Translate portmidi host error into human readable message.
These strings are computed at run time, so client has to allocate storage.
After this routine executes, the host error is cleared.
*/
PMEXPORT void Pm_GetHostErrorText(char * msg, unsigned int len);
-#define HDRLENGTH 50
-#define PM_HOST_ERROR_MSG_LEN 256u /* any host error msg will occupy less
- than this number of characters */
-
-/**
- Device enumeration mechanism.
-
- Device ids range from 0 to Pm_CountDevices()-1.
+/** Any host error msg has at most this many characters, including EOS. */
+#define PM_HOST_ERROR_MSG_LEN 256u
+/** Devices are represented as small integers. Device ids range from 0
+ to Pm_CountDevices()-1. Pm_GetDeviceInfo() is used to get information
+ about the device, and Pm_OpenInput() and PmOpenOutput() are used to
+ open the device.
*/
typedef int PmDeviceID;
+
+/** This PmDeviceID (constant) value represents no device and may be
+ returned by Pm_GetDefaultInputDeviceID() or
+ Pm_GetDefaultOutputDeviceID() if no default exists.
+*/
#define pmNoDevice -1
-typedef struct {
- int structVersion; /**< this internal structure version */
- const char *interf; /**< underlying MIDI API, e.g. MMSystem or DirectX */
- const char *name; /**< device name, e.g. USB MidiSport 1x1 */
- int input; /**< true iff input is available */
- int output; /**< true iff output is available */
- int opened; /**< used by generic PortMidi code to do error checking on arguments */
+/** MIDI device information is returned in this structure, which is
+ owned by PortMidi and read-only to applications. See Pm_GetDeviceInfo().
+*/
+#define PM_DEVICEINFO_VERS 200
+typedef struct {
+ int structVersion; /**< @brief this internal structure version */
+ const char *interf; /**< @brief underlying MIDI API, e.g.
+ "MMSystem" or "DirectX" */
+ char *name; /**< @brief device name, e.g. "USB MidiSport 1x1" */
+ int input; /**< @brief true iff input is available */
+ int output; /**< @brief true iff output is available */
+ int opened; /**< @brief used by generic PortMidi for error checking */
+ int is_virtual; /**< @brief true iff this is/was a virtual device */
} PmDeviceInfo;
-/** Get devices count, ids range from 0 to Pm_CountDevices()-1. */
-PMEXPORT int Pm_CountDevices( void );
-/**
- Pm_GetDefaultInputDeviceID(), Pm_GetDefaultOutputDeviceID()
+/** Get devices count, ids range from 0 to Pm_CountDevices()-1. */
+PMEXPORT int Pm_CountDevices(void);
+/**
Return the default device ID or pmNoDevice if there are no devices.
The result (but not pmNoDevice) can be passed to Pm_OpenMidi().
- The default device can be specified using a small application
- named pmdefaults that is part of the PortMidi distribution. This
- program in turn uses the Java Preferences object created by
+ The use of these functions is not recommended. There is no natural
+ "default device" on any system, so defaults must be set by users.
+ (Currently, PortMidi just returns the first device it finds as
+ "default".) The (unsolved) problem is how to implement simple
+ preferences for a cross-platform library. (More notes follow, but
+ you can stop reading here.)
+
+ To implement preferences, you need (1) a standard place to put
+ them, (2) a representation for the preferences, (3) a graphical
+ interface to test and set preferences, (4) a "natural" way to
+ invoke the preference-setting program. To solve (3), PortMidi
+ originally chose to use Java and Swing to implement a
+ cross-platform GUI program called "pmdefaults." Java's Preferences
+ class already provide a location (problem 1) and representation
+ (problem 2). However, this solution was complex, requiring
+ PortMidi to parse binary Java preference files and requiring users
+ to install and invoke Java programs. It did not seem possible to
+ integrate pmdefaults into the system preference subsystems on
+ macOS, Windows, and Linux, so the user had to install and run
+ pmdefaults as an application. Moreover, Java is falling out of
+ favor.
+
+ A simpler solution is pass the burden to applications. It is easy
+ to scan devices with PortMidi and build a device menu, and to save
+ menu selections in application preferences for next time. This is
+ my recommendation for any GUI program. For simple command-line
+ applications and utilities, see pm_test where all the test
+ programs now accept device numbers on the command line and/or
+ prompt for their entry.
+
+ Some advice for preferences: MIDI devices used to be built-in or
+ plug-in cards, so the numbers rarely changed. Now MIDI devices are
+ often plug-in USB devices, so device numbers change, and you
+ probably need to design to reinitialize PortMidi to rescan
+ devices. MIDI is pretty stateless, so this isn't a big problem,
+ although it means you cannot find a new device while playing or
+ recording MIDI.
+
+ Since device numbering can change whenever a USB device is plugged
+ in, preferences should record *names* of devices rather than
+ device numbers. It is simple enough to use string matching to find
+ a prefered device, so PortMidi does not provide any built-in
+ lookup function. See below for details of the Java preferences API.
+
+ In the future, I would like to remove the legacy code that parses
+ Java preference data (macOS plist, linux prefs.xml, Windows
+ registry entries) and replace it with something more useful. Maybe
+ something really simple: $HOME/.portmidi? Or maybe a new
+ pmdefaults written with PyGame? Or use QT? If applications write
+ their own preferences, maybe a minimal command line preference
+ setter is all that's needed? Or maybe command line application
+ users are happy without a preference system? Comments and
+ proposals are welcome.
+
+ For completeness, here is a description of the original use of
+ Java for preference setting: The default device can be specified
+ using a small application named pmdefaults that is part of the
+ PortMidi distribution. This program in turn uses the Java
+ Preferences object created by
java.util.prefs.Preferences.userRoot().node("/PortMidi"); the
- preference is set by calling
- prefs.put("PM_RECOMMENDED_OUTPUT_DEVICE", prefName);
- or prefs.put("PM_RECOMMENDED_INPUT_DEVICE", prefName);
+ preference is set by calling
+ prefs.put("PM_RECOMMENDED_OUTPUT_DEVICE", prefName); or
+ prefs.put("PM_RECOMMENDED_INPUT_DEVICE", prefName);
In the statements above, prefName is a string describing the
MIDI device in the form "interf, name" where interf identifies
@@ -248,143 +315,274 @@ PMEXPORT int Pm_CountDevices( void );
the entire preference string is interpreted as a name, and the
interface part is the empty string, which matches anything.
- On the MAC, preferences are stored in
- /Users/$NAME/Library/Preferences/com.apple.java.util.prefs.plist
+ On the MAC, preferences are stored in
+ /Users/$NAME/Library/Preferences/com.apple.java.util.prefs.plist
which is a binary file. In addition to the pmdefaults program,
there are utilities that can read and edit this preference file.
-
- On the PC,
-
- On Linux,
-
+ On Windows, the Registry is used. On Linux, preferences are in an
+ XML file.
*/
-PMEXPORT PmDeviceID Pm_GetDefaultInputDeviceID( void );
-/** see PmDeviceID Pm_GetDefaultInputDeviceID() */
-PMEXPORT PmDeviceID Pm_GetDefaultOutputDeviceID( void );
+PMEXPORT PmDeviceID Pm_GetDefaultInputDeviceID(void);
-/**
- PmTimestamp is used to represent a millisecond clock with arbitrary
- start time. The type is used for all MIDI timestampes and clocks.
+/** @brief see PmDeviceID Pm_GetDefaultInputDeviceID() */
+PMEXPORT PmDeviceID Pm_GetDefaultOutputDeviceID(void);
+
+/** Represents a millisecond clock with arbitrary start time.
+ This type is used for all MIDI timestamps and clocks.
*/
typedef int32_t PmTimestamp;
typedef PmTimestamp (*PmTimeProcPtr)(void *time_info);
/** TRUE if t1 before t2 */
#define PmBefore(t1,t2) ((t1-t2) < 0)
+/** @} */
/**
\defgroup grp_device Input/Output Devices Handling
@{
*/
-/**
- Pm_GetDeviceInfo() returns a pointer to a PmDeviceInfo structure
- referring to the device specified by id.
- If id is out of range the function returns NULL.
+/** Get a PmDeviceInfo structure describing a MIDI device.
+
+ @param id the device to be queried.
- The returned structure is owned by the PortMidi implementation and must
- not be manipulated or freed. The pointer is guaranteed to be valid
- between calls to Pm_Initialize() and Pm_Terminate().
-*/
-PMEXPORT const PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id );
+ If \p id is out of range or if the device designates a deleted
+ virtual device, the function returns NULL.
-/**
- Pm_OpenInput() and Pm_OpenOutput() open devices.
+ The returned structure is owned by the PortMidi implementation and
+ must not be manipulated or freed. The pointer is guaranteed to be
+ valid between calls to Pm_Initialize() and Pm_Terminate().
+*/
+PMEXPORT const PmDeviceInfo *Pm_GetDeviceInfo(PmDeviceID id);
- stream is the address of a PortMidiStream pointer which will receive
- a pointer to the newly opened stream.
+/** Open a MIDI device for input.
- inputDevice is the id of the device used for input (see PmDeviceID above).
+ @param stream the address of a #PortMidiStream pointer which will
+ receive a pointer to the newly opened stream.
- inputDriverInfo is a pointer to an optional driver specific data structure
- containing additional information for device setup or handle processing.
- inputDriverInfo is never required for correct operation. If not used
- inputDriverInfo should be NULL.
+ @param inputDevice the ID of the device to be opened (see #PmDeviceID).
- outputDevice is the id of the device used for output (see PmDeviceID above.)
+ @param inputDriverInfo a pointer to an optional driver-specific
+ data structure containing additional information for device setup
+ or handle processing. This parameter is never required for correct
+ operation. If not used, specify NULL.
- outputDriverInfo is a pointer to an optional driver specific data structure
- containing additional information for device setup or handle processing.
- outputDriverInfo is never required for correct operation. If not used
- outputDriverInfo should be NULL.
+ @param bufferSize the number of input events to be buffered
+ waiting to be read using Pm_Read(). Messages will be lost if the
+ number of unread messages exceeds this value.
- For input, the buffersize specifies the number of input events to be
- buffered waiting to be read using Pm_Read(). For output, buffersize
- specifies the number of output events to be buffered waiting for output.
- (In some cases -- see below -- PortMidi does not buffer output at all
- and merely passes data to a lower-level API, in which case buffersize
- is ignored.)
-
- latency is the delay in milliseconds applied to timestamps to determine
- when the output should actually occur. (If latency is < 0, 0 is assumed.)
- If latency is zero, timestamps are ignored and all output is delivered
- immediately. If latency is greater than zero, output is delayed until the
- message timestamp plus the latency. (NOTE: the time is measured relative
- to the time source indicated by time_proc. Timestamps are absolute,
- not relative delays or offsets.) In some cases, PortMidi can obtain
- better timing than your application by passing timestamps along to the
- device driver or hardware. Latency may also help you to synchronize midi
- data to audio data by matching midi latency to the audio buffer latency.
-
- time_proc is a pointer to a procedure that returns time in milliseconds. It
- may be NULL, in which case a default millisecond timebase (PortTime) is
- used. If the application wants to use PortTime, it should start the timer
- (call Pt_Start) before calling Pm_OpenInput or Pm_OpenOutput. If the
- application tries to start the timer *after* Pm_OpenInput or Pm_OpenOutput,
- it may get a ptAlreadyStarted error from Pt_Start, and the application's
+ @param time_proc (address of) a procedure that returns time in
+ milliseconds. It may be NULL, in which case a default millisecond
+ timebase (PortTime) is used. If the application wants to use
+ PortTime, it should start the timer (call Pt_Start) before calling
+ Pm_OpenInput or Pm_OpenOutput. If the application tries to start
+ the timer *after* Pm_OpenInput or Pm_OpenOutput, it may get a
+ ptAlreadyStarted error from Pt_Start, and the application's
preferred time resolution and callback function will be ignored.
- time_proc result values are appended to incoming MIDI data, and time_proc
- times are used to schedule outgoing MIDI data (when latency is non-zero).
+ \p time_proc result values are appended to incoming MIDI data,
+ normally by mapping system-provided timestamps to the \p time_proc
+ timestamps to maintain the precision of system-provided
+ timestamps.
- time_info is a pointer passed to time_proc.
+ @param time_info is a pointer passed to time_proc.
- Example: If I provide a timestamp of 5000, latency is 1, and time_proc
- returns 4990, then the desired output time will be when time_proc returns
- timestamp+latency = 5001. This will be 5001-4990 = 11ms from now.
-
- return value:
- Upon success Pm_Open() returns PmNoError and places a pointer to a
- valid PortMidiStream in the stream argument.
- If a call to Pm_Open() fails a nonzero error code is returned (see
- PMError above) and the value of port is invalid.
+ @return #pmNoError and places a pointer to a valid
+ #PortMidiStream in the stream argument. If the open operation
+ fails, a nonzero error code is returned (see #PMError) and
+ the value of stream is invalid.
Any stream that is successfully opened should eventually be closed
by calling Pm_Close().
-
*/
-PMEXPORT PmError Pm_OpenInput( PortMidiStream** stream,
+PMEXPORT PmError Pm_OpenInput(PortMidiStream** stream,
PmDeviceID inputDevice,
void *inputDriverInfo,
int32_t bufferSize,
PmTimeProcPtr time_proc,
- void *time_info );
+ void *time_info);
+
+/** Open a MIDI device for output.
+
+ @param stream the address of a #PortMidiStream pointer which will
+ receive a pointer to the newly opened stream.
+
+ @param outputDevice the ID of the device to be opened (see #PmDeviceID).
+
+ @param outputDriverInfo a pointer to an optional driver-specific
+ data structure containing additional information for device setup
+ or handle processing. This parameter is never required for correct
+ operation. If not used, specify NULL.
+
+ @param bufferSize the number of output events to be buffered
+ waiting for output. In some cases -- see below -- PortMidi does
+ not buffer output at all and merely passes data to a lower-level
+ API, in which case \p bufferSize is ignored. Since MIDI speeds now
+ vary from 1 to 50 or more messages per ms (over USB), put some
+ thought into this number. E.g. if latency is 20ms and you want to
+ burst 100 messages in that time (5000 messages per second), you
+ should set \p bufferSize to at least 100. The default on Windows
+ assumes an average rate of 500 messages per second and in this
+ example, output would be slowed waiting for free buffers.
+
+ @param latency the delay in milliseconds applied to timestamps
+ to determine when the output should actually occur. (If latency is
+ < 0, 0 is assumed.) If latency is zero, timestamps are ignored
+ and all output is delivered immediately. If latency is greater
+ than zero, output is delayed until the message timestamp plus the
+ latency. (NOTE: the time is measured relative to the time source
+ indicated by time_proc. Timestamps are absolute, not relative
+ delays or offsets.) In some cases, PortMidi can obtain better
+ timing than your application by passing timestamps along to the
+ device driver or hardware, so the best strategy to minimize jitter
+ is: wait until the real time to send the message, compute the
+ message, attach the *ideal* output time (not the current real
+ time, because some time may have elapsed), and send the
+ message. The \p latency will be added to the timestamp, and
+ provided the elapsed computation time has not exceeded \p latency,
+ the message will be delivered according to the timestamp. If the
+ real time is already past the timestamp, the message will be
+ delivered as soon as possible. Latency may also help you to
+ synchronize MIDI data to audio data by matching \p latency to the
+ audio buffer latency.
+
+ @param time_proc (address of) a pointer to a procedure that
+ returns time in milliseconds. It may be NULL, in which case a
+ default millisecond timebase (PortTime) is used. If the
+ application wants to use PortTime, it should start the timer (call
+ Pt_Start) before calling #Pm_OpenInput or #Pm_OpenOutput. If the
+ application tries to start the timer *after* #Pm_OpenInput or
+ #Pm_OpenOutput, it may get a #ptAlreadyStarted error from #Pt_Start,
+ and the application's preferred time resolution and callback
+ function will be ignored. \p time_proc times are used to schedule
+ outgoing MIDI data (when latency is non-zero), usually by mapping
+ from time_proc timestamps to internal system timestamps to
+ maintain the precision of system-supported timing.
+
+ @param time_info a pointer passed to time_proc.
+
+ @return #pmNoError and places a pointer to a valid #PortMidiStream
+ in the stream argument. If the operation fails, a nonzero error
+ code is returned (see PMError) and the value of \p stream is
+ invalid.
+
+ Note: ALSA appears to have a fixed-size priority queue for timed
+ output messages. Testing indicates the queue can hold a little
+ over 400 3-byte MIDI messages. Thus, you can send 10,000
+ messages/second if the latency is 30ms (30ms * 10000 msgs/sec *
+ 0.001 sec/ms = 300 msgs), but not if the latency is 50ms
+ (resulting in about 500 pending messages, which is greater than
+ the 400 message limit). Since timestamps in ALSA are relative,
+ they are of less value than absolute timestamps in macOS and
+ Windows. This is a limitation of ALSA and apparently a design
+ flaw.
+
+ Example 1: If I provide a timestamp of 5000, latency is 1, and
+ time_proc returns 4990, then the desired output time will be when
+ time_proc returns timestamp+latency = 5001. This will be 5001-4990
+ = 11ms from now.
+
+ Example 2: If I want to send at exactly 5010, and latency is 10, I
+ should wait until 5000, compute the messages and provide a
+ timestamp of 5000. As long as computation takes less than 10ms,
+ the message will be delivered at time 5010.
+
+ Example 3 (recommended): It is often convenient to ignore latency.
+ E.g. if a sequence says to output at time 5010, just wait until
+ 5010, compute the message and use 5010 for the timestamp. Delivery
+ will then be at 5010+latency, but unless you are synchronizing to
+ something else, the absolute delay by latency will not matter.
-PMEXPORT PmError Pm_OpenOutput( PortMidiStream** stream,
+ Any stream that is successfully opened should eventually be closed
+ by calling Pm_Close().
+*/
+PMEXPORT PmError Pm_OpenOutput(PortMidiStream** stream,
PmDeviceID outputDevice,
void *outputDriverInfo,
int32_t bufferSize,
PmTimeProcPtr time_proc,
void *time_info,
- int32_t latency );
+ int32_t latency);
+
+/** Create a virtual input device.
+
+ @param name gives the virtual device name, which is visible to
+ other applications.
+
+ @param interf is the interface (System API) used to create the
+ device Default interfaces are "MMSystem", "CoreMIDI" and
+ "ALSA". Currently, these are the only ones implemented, but future
+ implementations could support DirectMusic, Jack, sndio, or others.
+
+ @param deviceInfo contains interface-dependent additional
+ information, e.g., hints or options. There are none at present, and
+ NULL is the recommended value.
+
+ @return a device ID or #pmNameConflict (\p name is invalid or
+ already exists) or #pmInterfaceNotSupported (\p interf is does not
+ match a supported interface).
+
+ The created virtual device appears to other applications as if it
+ is an output device. The device must be opened to obtain a stream
+ and read from it.
+
+ Virtual devices are not supported by Windows (Multimedia API). Calls
+ on Windows do nothing except return #pmNotImplemented.
+*/
+PMEXPORT PmError Pm_CreateVirtualInput(const char *name,
+ const char *interf,
+ void *deviceInfo);
+
+/** Create a virtual output device.
+
+ @param name gives the virtual device name, which is visible to
+ other applications.
+
+ @param interf is the interface (System API) used to create the
+ device Default interfaces are "MMSystem", "CoreMIDI" and
+ "ALSA". Currently, these are the only ones implemented, but future
+ implementations could support DirectMusic, Jack, sndio, or others.
+
+ @param deviceInfo contains interface-dependent additional
+ information, e.g., hints or options. There are none at present, and
+ NULL is the recommended value.
+
+ @return a device ID or #pmInvalidDeviceId (\p name is invalid or
+ already exists) or #pmInterfaceNotSupported (\p interf is does not
+ match a supported interface).
+
+ The created virtual device appears to other applications as if it
+ is an input device. The device must be opened to obtain a stream
+ and write to it.
+
+ Virtual devices are not supported by Windows (Multimedia API). Calls
+ on Windows do nothing except return #pmNotImplemented.
+*/
+PMEXPORT PmError Pm_CreateVirtualOutput(const char *name,
+ const char *interf,
+ void *deviceInfo);
+
+/** Remove a virtual device.
+
+ @param device a device ID (small integer) designating the device.
+
+ The device is removed; other applications can no longer see or open
+ this virtual device, which may be either for input or output. The
+ device must not be open. The device ID may be reused, but existing
+ devices are not renumbered. This means that the device ID could be
+ in the range from 0 to #Pm_CountDevices(), yet the device ID does
+ not designate a device. In that case, passing the ID to
+ #Pm_GetDeviceInfo() will return NULL.
+
+ @return #pmNoError if the device was deleted or #pmInvalidDeviceId
+ if the device is open, already deleted, or \p device is out of
+ range.
+*/
+PMEXPORT PmError Pm_DeleteVirtualDevice(PmDeviceID device);
/** @} */
/**
- \defgroup grp_events_filters Events and Filters Handling
+ @defgroup grp_events_filters Events and Filters Handling
@{
*/
-/* \function PmError Pm_SetFilter( PortMidiStream* stream, int32_t filters )
- Pm_SetFilter() sets filters on an open input stream to drop selected
- input types. By default, only active sensing messages are filtered.
- To prohibit, say, active sensing and sysex messages, call
- Pm_SetFilter(stream, PM_FILT_ACTIVE | PM_FILT_SYSEX);
-
- Filtering is useful when midi routing or midi thru functionality is being
- provided by the user application.
- For example, you may want to exclude timing messages (clock, MTC, start/stop/continue),
- while allowing note-related messages to pass.
- Or you may be using a sequencer or drum-machine for MIDI clock information but want to
- exclude any notes it may play.
- */
-
/* Filter bit-mask definitions */
/** filter active sensing messages (0xFE): */
#define PM_FILT_ACTIVE (1 << 0x0E)
@@ -412,7 +610,8 @@ PMEXPORT PmError Pm_OpenOutput( PortMidiStream** stream,
/** per-note aftertouch (0xA0-0xAF) */
#define PM_FILT_POLY_AFTERTOUCH (1 << 0x1A)
/** filter both channel and poly aftertouch */
-#define PM_FILT_AFTERTOUCH (PM_FILT_CHANNEL_AFTERTOUCH | PM_FILT_POLY_AFTERTOUCH)
+#define PM_FILT_AFTERTOUCH (PM_FILT_CHANNEL_AFTERTOUCH | \
+ PM_FILT_POLY_AFTERTOUCH)
/** Program changes (0xC0-0xCF) */
#define PM_FILT_PROGRAM (1 << 0x1C)
/** Control Changes (CC's) (0xB0-0xBF)*/
@@ -425,20 +624,48 @@ PMEXPORT PmError Pm_OpenOutput( PortMidiStream** stream,
#define PM_FILT_SONG_POSITION (1 << 0x02)
/** Song Select (0xF3)*/
#define PM_FILT_SONG_SELECT (1 << 0x03)
-/** Tuning request (0xF6)*/
+/** Tuning request (0xF6) */
#define PM_FILT_TUNE (1 << 0x06)
/** All System Common messages (mtc, song position, song select, tune request) */
-#define PM_FILT_SYSTEMCOMMON (PM_FILT_MTC | PM_FILT_SONG_POSITION | PM_FILT_SONG_SELECT | PM_FILT_TUNE)
+#define PM_FILT_SYSTEMCOMMON (PM_FILT_MTC | PM_FILT_SONG_POSITION | \
+ PM_FILT_SONG_SELECT | PM_FILT_TUNE)
+
+
+/* Set filters on an open input stream to drop selected input types.
+
+ @param stream an open MIDI input stream.
+ @param filters indicate message types to filter (block).
-PMEXPORT PmError Pm_SetFilter( PortMidiStream* stream, int32_t filters );
+ @return #pmNoError or an error code.
+ By default, only active sensing messages are filtered.
+ To prohibit, say, active sensing and sysex messages, call
+ Pm_SetFilter(stream, PM_FILT_ACTIVE | PM_FILT_SYSEX);
+
+ Filtering is useful when midi routing or midi thru functionality
+ is being provided by the user application.
+ For example, you may want to exclude timing messages (clock, MTC,
+ start/stop/continue), while allowing note-related messages to pass.
+ Or you may be using a sequencer or drum-machine for MIDI clock
+ information but want to exclude any notes it may play.
+ */
+PMEXPORT PmError Pm_SetFilter(PortMidiStream* stream, int32_t filters);
+
+/** Create a mask that filters one channel. */
#define Pm_Channel(channel) (1<<(channel))
-/**
- Pm_SetChannelMask() filters incoming messages based on channel.
- The mask is a 16-bit bitfield corresponding to appropriate channels.
- The Pm_Channel macro can assist in calling this function.
- i.e. to set receive only input on channel 1, call with
+
+/** Filter incoming messages based on channel.
+
+ @param stream an open MIDI input stream.
+
+ @param mask indicates channels to be received.
+
+ @return #pmNoError or an error code.
+
+ The \p mask is a 16-bit bitfield corresponding to appropriate channels.
+ The #Pm_Channel macro can assist in calling this function.
+ I.e. to receive only input on channel 1, call with
Pm_SetChannelMask(Pm_Channel(1));
Multiple channels should be OR'd together, like
Pm_SetChannelMask(Pm_Channel(10) | Pm_Channel(11))
@@ -451,71 +678,94 @@ PMEXPORT PmError Pm_SetFilter( PortMidiStream* stream, int32_t filters );
*/
PMEXPORT PmError Pm_SetChannelMask(PortMidiStream *stream, int mask);
-/**
- Pm_Abort() terminates outgoing messages immediately
- The caller should immediately close the output port;
- this call may result in transmission of a partial midi message.
- There is no abort for Midi input because the user can simply
- ignore messages in the buffer and close an input device at
- any time.
+/** Terminate outgoing messages immediately.
+
+ @param stream an open MIDI output stream.
+
+ @result #pmNoError or an error code.
+
+ The caller should immediately close the output port; this call may
+ result in transmission of a partial MIDI message. There is no
+ abort for Midi input because the user can simply ignore messages
+ in the buffer and close an input device at any time. If the
+ specified behavior cannot be achieved through the system-level
+ interface (ALSA, CoreMIDI, etc.), the behavior may be that of
+ Pm_Close().
*/
-PMEXPORT PmError Pm_Abort( PortMidiStream* stream );
+PMEXPORT PmError Pm_Abort(PortMidiStream* stream);
-/**
- Pm_Close() closes a midi stream, flushing any pending buffers.
- (PortMidi attempts to close open streams when the application
- exits -- this is particularly difficult under Windows.)
-*/
-PMEXPORT PmError Pm_Close( PortMidiStream* stream );
+/** Close a midi stream, flush any pending buffers if possible.
-/**
- Pm_Synchronize() instructs PortMidi to (re)synchronize to the
- time_proc passed when the stream was opened. Typically, this
- is used when the stream must be opened before the time_proc
- reference is actually advancing. In this case, message timing
- may be erratic, but since timestamps of zero mean
- "send immediately," initialization messages with zero timestamps
- can be written without a functioning time reference and without
- problems. Before the first MIDI message with a non-zero
- timestamp is written to the stream, the time reference must
- begin to advance (for example, if the time_proc computes time
- based on audio samples, time might begin to advance when an
- audio stream becomes active). After time_proc return values
- become valid, and BEFORE writing the first non-zero timestamped
- MIDI message, call Pm_Synchronize() so that PortMidi can observe
- the difference between the current time_proc value and its
- MIDI stream time.
+ @param stream an open MIDI input or output stream.
+
+ @result #pmNoError or an error code.
+
+ If the system-level interface (ALSA, CoreMIDI, etc.) does not
+ support flushing remaining messages, the behavior may be one of
+ the following (most preferred first): block until all pending
+ timestamped messages are delivered; deliver messages to a server
+ or kernel process for later delivery but return immediately; drop
+ messages (as in Pm_Abort()). Therefore, to be safe, applications
+ should wait until the output queue is empty before calling
+ Pm_Close(). E.g. calling Pt_Sleep(100 + latency); will give a
+ 100ms "cushion" beyond latency (if any) before closing.
+*/
+PMEXPORT PmError Pm_Close(PortMidiStream* stream);
+
+/** (re)synchronize to the time_proc passed when the stream was opened.
+
+ @param stream an open MIDI input or output stream.
+
+ @result #pmNoError or an error code.
+
+ Typically, this is used when the stream must be opened before the
+ time_proc reference is actually advancing. In this case, message
+ timing may be erratic, but since timestamps of zero mean "send
+ immediately," initialization messages with zero timestamps can be
+ written without a functioning time reference and without
+ problems. Before the first MIDI message with a non-zero timestamp
+ is written to the stream, the time reference must begin to advance
+ (for example, if the time_proc computes time based on audio
+ samples, time might begin to advance when an audio stream becomes
+ active). After time_proc return values become valid, and BEFORE
+ writing the first non-zero timestamped MIDI message, call
+ Pm_Synchronize() so that PortMidi can observe the difference
+ between the current time_proc value and its MIDI stream time.
- In the more normal case where time_proc
- values advance continuously, there is no need to call
- Pm_Synchronize. PortMidi will always synchronize at the
- first output message and periodically thereafter.
+ In the more normal case where time_proc values advance
+ continuously, there is no need to call #Pm_Synchronize. PortMidi
+ will always synchronize at the first output message and
+ periodically thereafter.
*/
-PmError Pm_Synchronize( PortMidiStream* stream );
+PMEXPORT PmError Pm_Synchronize(PortMidiStream* stream);
-/**
- Pm_Message() encodes a short Midi message into a 32-bit word. If data1
+/** Encode a short Midi message into a 32-bit word. If data1
and/or data2 are not present, use zero.
-
- Pm_MessageStatus(), Pm_MessageData1(), and
- Pm_MessageData2() extract fields from a 32-bit midi message.
*/
#define Pm_Message(status, data1, data2) \
((((data2) << 16) & 0xFF0000) | \
(((data1) << 8) & 0xFF00) | \
((status) & 0xFF))
+/** Extract the status field from a 32-bit midi message. */
#define Pm_MessageStatus(msg) ((msg) & 0xFF)
+/** Extract the 1st data field (e.g., pitch) from a 32-bit midi message. */
#define Pm_MessageData1(msg) (((msg) >> 8) & 0xFF)
+/** Extract the 2nd data field (e.g., velocity) from a 32-bit midi message. */
#define Pm_MessageData2(msg) (((msg) >> 16) & 0xFF)
-typedef int32_t PmMessage; /**< see PmEvent */
+typedef uint32_t PmMessage; /**< @brief see #PmEvent */
/**
- All midi data comes in the form of PmEvent structures. A sysex
+ All MIDI data comes in the form of PmEvent structures. A sysex
message is encoded as a sequence of PmEvent structures, with each
structure carrying 4 bytes of the message, i.e. only the first
PmEvent carries the status byte.
+ All other MIDI messages take 1 to 3 bytes and are encoded in a whole
+ PmMessage with status in the low-order byte and remaining bytes
+ unused, i.e., a 3-byte note-on message will occupy 3 low-order bytes
+ of PmMessage, leaving the high-order byte unused.
+
Note that MIDI allows nested messages: the so-called "real-time" MIDI
messages can be inserted into the MIDI byte stream at any location,
including within a sysex message. MIDI real-time messages are one-byte
@@ -555,8 +805,8 @@ typedef int32_t PmMessage; /**< see PmEvent */
messages should be sent in the correct order, and timestamps MUST
be non-decreasing. See also "Example" for Pm_OpenOutput() above.
- A sysex message will generally fill many PmEvent structures. On
- output to a PortMidiStream with non-zero latency, the first timestamp
+ A sysex message will generally fill many #PmEvent structures. On
+ output to a #PortMidiStream with non-zero latency, the first timestamp
on sysex message data will determine the time to begin sending the
message. PortMidi implementations may ignore timestamps for the
remainder of the sysex message.
@@ -580,71 +830,127 @@ typedef struct {
PmTimestamp timestamp;
} PmEvent;
-/**
- @}
-*/
+/** @} */
+
/** \defgroup grp_io Reading and Writing Midi Messages
@{
*/
-/**
- Pm_Read() retrieves midi data into a buffer, and returns the number
- of events read. Result is a non-negative number unless an error occurs,
- in which case a PmError value will be returned.
+/** Retrieve midi data into a buffer.
- Buffer Overflow
+ @param stream the open input stream.
- The problem: if an input overflow occurs, data will be lost, ultimately
- because there is no flow control all the way back to the data source.
- When data is lost, the receiver should be notified and some sort of
- graceful recovery should take place, e.g. you shouldn't resume receiving
- in the middle of a long sysex message.
+ @return the number of events read, or, if the result is negative,
+ a #PmError value will be returned.
- With a lock-free fifo, which is pretty much what we're stuck with to
- enable portability to the Mac, it's tricky for the producer and consumer
- to synchronously reset the buffer and resume normal operation.
+ The Buffer Overflow Problem
- Solution: the buffer managed by PortMidi will be flushed when an overflow
- occurs. The consumer (Pm_Read()) gets an error message (pmBufferOverflow)
- and ordinary processing resumes as soon as a new message arrives. The
- remainder of a partial sysex message is not considered to be a "new
- message" and will be flushed as well.
+ The problem: if an input overflow occurs, data will be lost,
+ ultimately because there is no flow control all the way back to
+ the data source. When data is lost, the receiver should be
+ notified and some sort of graceful recovery should take place,
+ e.g. you shouldn't resume receiving in the middle of a long sysex
+ message.
+ With a lock-free fifo, which is pretty much what we're stuck with
+ to enable portability to the Mac, it's tricky for the producer and
+ consumer to synchronously reset the buffer and resume normal
+ operation.
+
+ Solution: the entire buffer managed by PortMidi will be flushed
+ when an overflow occurs. The consumer (Pm_Read()) gets an error
+ message (#pmBufferOverflow) and ordinary processing resumes as
+ soon as a new message arrives. The remainder of a partial sysex
+ message is not considered to be a "new message" and will be
+ flushed as well.
*/
-PMEXPORT int Pm_Read( PortMidiStream *stream, PmEvent *buffer, int32_t length );
+PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length);
-/**
- Pm_Poll() tests whether input is available,
- returning TRUE, FALSE, or an error value.
+/** Test whether input is available.
+
+ @param stream an open input stream.
+
+ @return TRUE, FALSE, or an error value.
+
+ If there was an asynchronous error, pmHostError is returned and you must
+ call again to determine if input is (also) available.
+
+ You should probably *not* use this function. Call Pm_Read()
+ instead. If it returns 0, then there is no data available. It is
+ possible for Pm_Poll() to return TRUE before the complete message
+ is available, so Pm_Read() could return 0 even after Pm_Poll()
+ returns TRUE. Only call Pm_Poll() if you want to know that data is
+ probably available even though you are not ready to receive data.
*/
-PMEXPORT PmError Pm_Poll( PortMidiStream *stream);
+PMEXPORT PmError Pm_Poll(PortMidiStream *stream);
-/**
- Pm_Write() writes midi data from a buffer. This may contain:
+/** Write MIDI data from a buffer.
+
+ @param stream an open output stream.
+
+ @param buffer (address of) an array of MIDI event data.
+
+ @param length the length of the \p buffer.
+
+ @return TRUE, FALSE, or an error value.
+
+ \b buffer may contain:
- short messages
- or
- sysex messages that are converted into a sequence of PmEvent
structures, e.g. sending data from a file or forwarding them
- from midi input.
+ from midi input, with 4 SysEx bytes per PmEvent message,
+ low-order byte first, until the last message, which may
+ contain from 1 to 4 bytes ending in MIDI EOX (0xF7).
+ - PortMidi allows 1-byte real-time messages to be embedded
+ within SysEx messages, but only on 4-byte boundaries so
+ that SysEx data always uses a full 4 bytes (except possibly
+ at the end). Each real-time message always occupies a full
+ PmEvent (3 of the 4 bytes in the PmEvent's message are
+ ignored) even when embedded in a SysEx message.
Use Pm_WriteSysEx() to write a sysex message stored as a contiguous
array of bytes.
Sysex data may contain embedded real-time messages.
+
+ \p buffer is managed by the caller. The buffer may be destroyed
+ as soon as this call returns.
*/
-PMEXPORT PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, int32_t length );
+PMEXPORT PmError Pm_Write(PortMidiStream *stream, PmEvent *buffer,
+ int32_t length);
-/**
- Pm_WriteShort() writes a timestamped non-system-exclusive midi message.
- Messages are delivered in order as received, and timestamps must be
- non-decreasing. (But timestamps are ignored if the stream was opened
- with latency = 0.)
+/** Write a timestamped non-system-exclusive midi message.
+
+ @param stream an open output stream.
+
+ @param when timestamp for the event.
+
+ @param msg the data for the event.
+
+ @result #pmNoError or an error code.
+
+ Messages are delivered in order, and timestamps must be
+ non-decreasing. (But timestamps are ignored if the stream was
+ opened with latency = 0, and otherwise, non-decreasing timestamps
+ are "corrected" to the lowest valid value.)
*/
-PMEXPORT PmError Pm_WriteShort( PortMidiStream *stream, PmTimestamp when, int32_t msg);
+PMEXPORT PmError Pm_WriteShort(PortMidiStream *stream, PmTimestamp when,
+ PmMessage msg);
-/**
- Pm_WriteSysEx() writes a timestamped system-exclusive midi message.
+/** Write a timestamped system-exclusive midi message.
+
+ @param stream an open output stream.
+
+ @param when timestamp for the event.
+
+ @param msg the sysex message, terminated with an EOX status byte.
+
+ @result #pmNoError or an error code.
+
+ \p msg is managed by the caller and may be destroyed when this
+ call returns.
*/
-PMEXPORT PmError Pm_WriteSysEx( PortMidiStream *stream, PmTimestamp when, unsigned char *msg);
+PMEXPORT PmError Pm_WriteSysEx(PortMidiStream *stream, PmTimestamp when,
+ unsigned char *msg);
/** @} */
diff --git a/3rdparty/portmidi/pm_csharp/README.txt b/3rdparty/portmidi/pm_csharp/README.txt
deleted file mode 100644
index 06a1ad4e390..00000000000
--- a/3rdparty/portmidi/pm_csharp/README.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-This code was offered by Aaron Oxford as is. The pm_managed directory contains the code. If you develop a more complete C# wrapper for PortMidi, please consider contributing your code to the project. -RBD
-
----- from Aaron Oxford ----
-
-I've attached the managed C++ project which I've inserted into my 2005 version of PortMIDI's VS solution. I wouldn't think the functions I've implemented would have changed so it all should still work with the latest version of PM. Obviously you won't want to permanently embed this since it means the whole solution can only be built under VS2005, but it's easy for a VS2005 user to insert the project after the solution is converted or even just build it separately.
-
-Making the managed wrapper turned out to be dead easy in the end (it was more of a battle finding the correct build settings & SDK's and learning to configure VS than anything else). Anyone wanting to use something I've not implemented yet simply needs to add more stubs like this
-
- int Pm_Initialize()
- {
- ::Pm_Initialize();
- return 0;
- }
-
-to the code. To call from C# it's just a matter of
-
- ManagedPortMIDI mpm = new ManagedPortMIDI();
- int err = mpm.Pm_Initialize();
-
-Anyway as the little code example above indicates, the support really is basic and more likely than not to break at the first hint of something unexpected. As I said, I'd be happy to contribute but I don't think there's much to contribute yet. :-)
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp b/3rdparty/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp
deleted file mode 100644
index 84033ec021d..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "stdafx.h"
-
-using namespace System;
-using namespace System::Reflection;
-using namespace System::Runtime::CompilerServices;
-using namespace System::Runtime::InteropServices;
-using namespace System::Security::Permissions;
-
-//
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly:AssemblyTitleAttribute("pm_managed")];
-[assembly:AssemblyDescriptionAttribute("")];
-[assembly:AssemblyConfigurationAttribute("")];
-[assembly:AssemblyCompanyAttribute("Innovative Computer Solutions")];
-[assembly:AssemblyProductAttribute("pm_managed")];
-[assembly:AssemblyCopyrightAttribute("Copyright (c) Innovative Computer Solutions 2006")];
-[assembly:AssemblyTrademarkAttribute("")];
-[assembly:AssemblyCultureAttribute("")];
-
-//
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the value or you can default the Revision and Build Numbers
-// by using the '*' as shown below:
-
-[assembly:AssemblyVersionAttribute("1.0.*")];
-
-[assembly:ComVisible(false)];
-
-[assembly:CLSCompliantAttribute(true)];
-
-[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/ReadMe.txt b/3rdparty/portmidi/pm_csharp/pm_managed/ReadMe.txt
deleted file mode 100644
index b01b06306cc..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/ReadMe.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-========================================================================
- DYNAMIC LINK LIBRARY : pm_managed Project Overview
-========================================================================
-
-AppWizard has created this pm_managed DLL for you.
-
-This file contains a summary of what you will find in each of the files that
-make up your pm_managed application.
-
-pm_managed.vcproj
- This is the main project file for VC++ projects generated using an Application Wizard.
- It contains information about the version of Visual C++ that generated the file, and
- information about the platforms, configurations, and project features selected with the
- Application Wizard.
-
-pm_managed.cpp
- This is the main DLL source file.
-
-pm_managed.h
- This file contains a class declaration.
-
-AssemblyInfo.cpp
- Contains custom attributes for modifying assembly metadata.
-
-/////////////////////////////////////////////////////////////////////////////
-Other notes:
-
-AppWizard uses "TODO:" to indicate parts of the source code you
-should add to or customize.
-
-/////////////////////////////////////////////////////////////////////////////
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.cpp b/3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.cpp
deleted file mode 100644
index de4058cb399..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-// stdafx.cpp : source file that includes just the standard includes
-// pm_managed.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.h b/3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.h
deleted file mode 100644
index 3cc4c24ef9f..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/Stdafx.h
+++ /dev/null
@@ -1,7 +0,0 @@
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/app.ico b/3rdparty/portmidi/pm_csharp/pm_managed/app.ico
deleted file mode 100644
index 3a5525fd794..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/app.ico
+++ /dev/null
Binary files differ
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/app.rc b/3rdparty/portmidi/pm_csharp/pm_managed/app.rc
deleted file mode 100644
index 41481bfc263..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/app.rc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon placed first or with lowest ID value becomes application icon
-
-LANGUAGE 9, 3
-#pragma code_page(1252)
-1 ICON "app.ico"
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
- "\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.cpp b/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.cpp
deleted file mode 100644
index 5389314e613..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.cpp
+++ /dev/null
@@ -1,6 +0,0 @@
-// This is the main DLL file.
-
-#include "stdafx.h"
-
-#include "pm_managed.h"
-
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.h b/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.h
deleted file mode 100644
index 21898368ec8..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// pm_managed.h
-
-#pragma once
-
-#include "portmidi.h"
-
-using namespace System;
-
-namespace pm_managed {
-
-
- public ref class MpmDeviceInfo
- {
- public:
- int structVersion;
- System::String^ interf; /* underlying MIDI API, e.g. MMSystem or DirectX */
- System::String^ name; /* device name, e.g. USB MidiSport 1x1 */
- bool input; /* true iff input is available */
- bool output; /* true iff output is available */
- int opened; /* used by generic PortMidi code to do error checking on arguments */
-
- MpmDeviceInfo(const PmDeviceInfo* info)
- {
- structVersion = info->structVersion;
- input = (info->input != 0);
- output = (info->output != 0);
- opened = info->opened;
-
- interf = gcnew System::String(info->interf);
- name = gcnew System::String(info->name);
- }
- };
-
- public ref class ManagedPortMIDI
- {
- public:
- int Pm_Initialize()
- {
- ::Pm_Initialize();
- return 0;
- }
-
- int Pm_CountDevices()
- {
- return ::Pm_CountDevices();
- }
-
- MpmDeviceInfo^ Pm_GetDeviceInfo(int id)
- {
- return gcnew MpmDeviceInfo(::Pm_GetDeviceInfo(id));
- }
- };
-}
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.vcproj b/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.vcproj
deleted file mode 100644
index 4ce2052fe35..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/pm_managed.vcproj
+++ /dev/null
@@ -1,260 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="pm_managed"
- ProjectGUID="{65AABD9A-F5E3-4A30-8BC3-9C732B5447CF}"
- RootNamespace="pm_managed"
- Keyword="ManagedCProj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)pm_managed\$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="2"
- CharacterSet="1"
- ManagedExtensions="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../pm_common"
- PreprocessorDefinitions="WIN32;_DEBUG"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(NoInherit) winmm.lib ..\pm_win\Debug\portmidi.lib ..\porttime\Debug\porttime.lib ..\pm_win\Debug\pm_dll.lib"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- AssemblyDebug="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)pm_managed\$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="2"
- CharacterSet="1"
- ManagedExtensions="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- FavorSizeOrSpeed="1"
- AdditionalIncludeDirectories="../pm_common"
- PreprocessorDefinitions="WIN32;NDEBUG"
- RuntimeLibrary="2"
- UsePrecompiledHeader="2"
- WarningLevel="3"
- DebugInformationFormat="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="$(NoInherit) winmm.lib ..\pm_win\Release\portmidi.lib ..\porttime\Release\porttime.lib ..\pm_win\Release\pm_dll.lib"
- LinkIncremental="1"
- ManifestFile="$(OutDir)\pm_managed.dll.manifest"
- GenerateDebugInformation="false"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- OutputManifestFile="$(OutDir)\pm_managed.dll.manifest"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="rem mt.exe manifest Release\pm_managed.dll.manifest -outputresource:Release\pm_managed.dll;2"
- />
- </Configuration>
- </Configurations>
- <References>
- <AssemblyReference
- RelativePath="System.dll"
- AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- />
- <AssemblyReference
- RelativePath="System.Data.dll"
- AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
- />
- <AssemblyReference
- RelativePath="System.XML.dll"
- AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
- />
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\AssemblyInfo.cpp"
- >
- </File>
- <File
- RelativePath=".\pm_managed.cpp"
- >
- </File>
- <File
- RelativePath=".\Stdafx.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- UsePrecompiledHeader="1"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- UsePrecompiledHeader="1"
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath=".\pm_managed.h"
- >
- </File>
- <File
- RelativePath=".\resource.h"
- >
- </File>
- <File
- RelativePath=".\Stdafx.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath=".\app.ico"
- >
- </File>
- <File
- RelativePath=".\app.rc"
- >
- </File>
- </Filter>
- <File
- RelativePath=".\ReadMe.txt"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_csharp/pm_managed/resource.h b/3rdparty/portmidi/pm_csharp/pm_managed/resource.h
deleted file mode 100644
index d5ac7c42aa0..00000000000
--- a/3rdparty/portmidi/pm_csharp/pm_managed/resource.h
+++ /dev/null
@@ -1,3 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by app.rc
diff --git a/3rdparty/portmidi/pm_dylib/CMakeLists.txt b/3rdparty/portmidi/pm_dylib/CMakeLists.txt
deleted file mode 100644
index f693dd6511a..00000000000
--- a/3rdparty/portmidi/pm_dylib/CMakeLists.txt
+++ /dev/null
@@ -1,127 +0,0 @@
-# pm_dylib
-
-# set the build directory for libraries to be in portmidi, not in
-# portmidi/pm_dylib
-if(APPLE OR WIN32)
- # set the build directory for .dylib libraries
- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
- set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
- # the "archive" output directory says where to put portmidi.lib, the
- # static part of the lib/dll pair:
- set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
-
- # the first time CMake configures, save off CMake's built-in flags
- if(NOT DEFAULT_DEBUG_FLAGS)
- set(DEFAULT_DEBUG_FLAGS ${CMAKE_C_FLAGS_DEBUG} CACHE
- STRING "CMake's default debug flags" FORCE)
- set(DEFAULT_RELEASE_FLAGS ${CMAKE_C_FLAGS_RELEASE} CACHE
- STRING "CMake's default release flags" FORCE)
- else(NOT DEFAULT_DEBUG_FLAGS)
- message(STATUS "DEFAULT_DEBUG_FLAGS not nil: " ${DEFAULT_DEBUG_FLAGS})
- endif(NOT DEFAULT_DEBUG_FLAGS)
-else(APPLE OR WIN32)
- set(LINUX_FLAGS "-DPMALSA")
-endif(APPLE OR WIN32)
-
-macro(prepend_path RESULT PATH)
- set(${RESULT})
- foreach(FILE ${ARGN})
- list(APPEND ${RESULT} "${PATH}${FILE}")
- endforeach(FILE)
-endmacro(prepend_path)
-
-set(CMAKE_C_FLAGS_DEBUG
- "${DEFAULT_DEBUG_FLAGS} -DPM_CHECK_ERRORS=1 -DDEBUG ${LINUX_FLAGS}"
- CACHE STRING "enable extra checks for debugging" FORCE)
-
-set(CMAKE_C_FLAGS_RELEASE "${DEFAULT_RELEASE_FLAGS} ${LINUX_FLAGS}"
- CACHE STRING "flags for release version" FORCE)
-
-# first include the appropriate system-dependent file:
-if(UNIX)
- # add the -g switch for Linux and Mac OS X (not used in Win32)
- set (CMAKE_C_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}"
- CACHE STRING "enable extra checks for debugging" FORCE)
- if(APPLE)
- set(MACSRC pmmacosxcm pmmac readbinaryplist finddefault)
- prepend_path(LIBSRC ../pm_mac/ ${MACSRC})
- list(APPEND LIBSRC ../porttime/ptmacosx_mach)
-
- include_directories(${CMAKE_OSX_SYSROOT}/Developer/Headers/FlatCarbon)
- set(FRAMEWORK_PATH ${CMAKE_OSX_SYSROOT}/System/Library/Frameworks)
- set(COREAUDIO_LIB "${FRAMEWORK_PATH}/CoreAudio.framework")
- set(COREFOUNDATION_LIB "${FRAMEWORK_PATH}/CoreFoundation.framework")
- set(COREMIDI_LIB "${FRAMEWORK_PATH}/CoreMIDI.framework")
- set(CORESERVICES_LIB "${FRAMEWORK_PATH}/CoreServices.framework")
- set(PM_NEEDED_LIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB}
- ${COREMIDI_LIB} ${CORESERVICES_LIB}
- CACHE INTERNAL "")
-
- set(JAVAVM_LIB "${FRAMEWORK_PATH}/JavaVM.framework")
- set(JAVA_INCLUDE_PATHS ${JAVAVM_LIB}/Headers)
- set(INSTALL_NAME_DIR "/usr/local/lib")
- message(STATUS "SYSROOT: " ${CMAKE_OSX_SYSROOT})
- else(APPLE)
- # LINUX settings...
- include(FindJNI)
- # message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH})
- # message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH})
- # note: should use JAVA_JVM_LIB_PATH, but it is not set properly
- # note: user might need to set JAVA_INCLUDE_PATH manually
- #
- # this will probably break on BSD and other Unix systems; the fix
- # depends on whether FindJNI can find Java or not. If yes, then
- # we should try to rely on automatically set JAVA_INCLUDE_PATH and
- # JAVA_INCLUDE_PATH2; if no, then we need to make both JAVA_INCLUDE_PATH
- # and JAVA_INCLUDE_PATH2 set by user (will need clear documentation
- # because JAVA_INCLUDE_PATH2 is pretty obscure)
- set(JAVA_INCLUDE_PATH ${JAVA_INCLUDE_PATH-UNKNOWN}
- CACHE STRING "where to find Java SDK include directory")
- set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH}/linux)
- # libjvm.so is found relative to JAVA_INCLUDE_PATH:
- set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../jre/lib/i386/client/libjvm.so)
-
- set(LINUXSRC pmlinuxalsa pmlinux finddefault)
- prepend_path(LIBSRC ../pm_linux/ ${LINUXSRC})
- list(APPEND LIBSRC ../porttime/ptlinux)
-
- set(PM_NEEDED_LIBS pthread asound)
- endif(APPLE)
-else(UNIX)
- if(WIN32)
- # /MDd is multithread debug DLL, /MTd is multithread debug
- # /MD is multithread DLL, /MT is multithread
-
- include(FindJNI)
- # note: should use JAVA_JVM_LIB_PATH, but it is not set properly
- set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../lib/jvm.lib)
-
- set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
- # message(STATUS "JAVA_INCLUDE_PATHS: " ${JAVA_INCLUDE_PATHS})
-
- set(WINSRC pmwin pmwinmm)
- prepend_path(LIBSRC ../pm_win/ ${WINSRC})
- list(APPEND LIBSRC ../porttime/ptwinmm)
- set(PM_NEEDED_LIBS winmm.lib)
- # message(STATUS "JAVAVM_LIB: " ${JAVAVM_LIB})
- endif(WIN32)
-endif(UNIX)
-set(JNI_EXTRA_LIBS ${PM_NEEDED_LIBS} ${JAVAVM_LIB})
-
-# this completes the list of library sources by adding shared code
-set(SHARED_FILES pmutil portmidi)
-prepend_path(SHARED_PATHS ../pm_common/ ${SHARED_FILES})
-list(APPEND LIBSRC ${SHARED_PATHS})
-
-add_library(portmidi-dynamic SHARED ${LIBSRC})
-set_target_properties(portmidi-dynamic PROPERTIES OUTPUT_NAME "portmidi")
-target_link_libraries(portmidi-dynamic ${PM_NEEDED_LIBS})
-
-# install the libraries (Linux and Mac OS X command line)
-if(UNIX)
- INSTALL(TARGETS portmidi-dynamic
- LIBRARY DESTINATION /usr/local/lib
- ARCHIVE DESTINATION /usr/local/lib)
- INSTALL(FILES ../pm_common/portmidi.h ../porttime/porttime.h
- DESTINATION /usr/local/include)
-endif(UNIX)
diff --git a/3rdparty/portmidi/pm_dylib/README.txt b/3rdparty/portmidi/pm_dylib/README.txt
deleted file mode 100644
index 133a01e94ab..00000000000
--- a/3rdparty/portmidi/pm_dylib/README.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-pm_dylib
-
-The purpose of this directory is to provide a separate CMakeLists.txt
-file for building a dynamic link library version of portmidi. This
-version (in Windows) is linked using the Multithreaded C Runtime DLL
-whereas the static library version in ../pm_common uses the (static)
-Multithreaded C Runtime. There's no good reason not to build both
-versions of portmidi in ../pm_common, but (the current) Cmake
-has the restriction that you must either share compiler flags across
-configurations (debug and release) or across targets (static and
-dynamic). Here, we need individual settings for all combinations.
diff --git a/3rdparty/portmidi/pm_dylib/portmidi-dynamic.vcproj b/3rdparty/portmidi/pm_dylib/portmidi-dynamic.vcproj
deleted file mode 100644
index eeb83b3aecd..00000000000
--- a/3rdparty/portmidi/pm_dylib/portmidi-dynamic.vcproj
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="portmidi-dynamic"
- ProjectGUID="{7283FAD1-7415-4061-A19A-FF5C7BCE9306}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="portmidi-dynamic.dir\Debug"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="3"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,portmidi_dynamic_EXPORTS"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../Debug/portmidi.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,portmidi_dynamic_EXPORTS"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;,portmidi_dynamic_EXPORTS"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib "
- OutputFile="..\Debug\portmidi.dll"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="..\Debug\portmidi.pdb"
- GenerateDebugInformation="TRUE"
- ImportLibrary="..\Debug\portmidi.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="portmidi-dynamic.dir\Release"
- ConfigurationType="2"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="2"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,portmidi_dynamic_EXPORTS"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../Release/portmidi.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,portmidi_dynamic_EXPORTS"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;,portmidi_dynamic_EXPORTS"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib "
- OutputFile="..\Release\portmidi.dll"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="..\Release\portmidi.pdb"
- ImportLibrary="..\Release\portmidi.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_win\pmwin.c">
- </File>
- <File
- RelativePath="..\pm_win\pmwinmm.c">
- </File>
- <File
- RelativePath="..\porttime\ptwinmm.c">
- </File>
- <File
- RelativePath="..\pm_common\pmutil.c">
- </File>
- <File
- RelativePath="..\pm_common\portmidi.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_haiku/pmhaiku.cpp b/3rdparty/portmidi/pm_haiku/pmhaiku.cpp
new file mode 100644
index 00000000000..6d21d8c5a67
--- /dev/null
+++ b/3rdparty/portmidi/pm_haiku/pmhaiku.cpp
@@ -0,0 +1,514 @@
+/* pmhaiku.cpp -- PortMidi os-dependent code */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <vector>
+#include <MidiConsumer.h>
+#include <MidiEndpoint.h>
+#include <MidiProducer.h>
+#include <MidiRoster.h>
+#include <MidiSynth.h>
+#include "portmidi.h"
+#include "pmutil.h"
+#include "pminternal.h"
+
+// as long as Java on Haiku uses ~/.java/... to store user preferences, we can directly reuse the Linux version
+// (it shouldn't, see https://github.com/haikuports/haikuports/issues/7119)
+extern "C" {
+#include "../pm_linux/finddefault.h"
+}
+
+namespace {
+ struct PmInputConsumer : BMidiLocalConsumer {
+ PmInputConsumer(PmInternal *midi) :
+ BMidiLocalConsumer("PortMidi input consumer"),
+ midi(midi)
+ {
+ }
+
+
+ void Data(uchar *data, size_t length, bool atomic, bigtime_t time)
+ {
+ if (!atomic)
+ return; // should these be also supported?
+
+ if (data[0] == B_SYS_EX_START) {
+ pm_read_bytes(midi, data, length, time / 1000);
+ } else {
+ PmEvent event;
+ switch (length) {
+ case 1:
+ event.message = Pm_Message(data[0], 0, 0);
+ break;
+ case 2:
+ event.message = Pm_Message(data[0], data[1], 0);
+ break;
+ case 3:
+ event.message = Pm_Message(data[0], data[1], data[2]);
+ break;
+ default:
+ printf("Unexpected message length for short message, got %" B_PRIuSIZE "\n", length);
+ break;
+ }
+ event.timestamp = time / 1000;
+ pm_read_short(midi, &event);
+ }
+ }
+
+ private:
+ PmInternal *midi;
+ };
+
+ struct PmOutputInfo {
+ BMidiLocalProducer *producer;
+ std::vector<unsigned char> sysexBuffer;
+ };
+
+ struct PmSynthOutputInfo {
+ BMidiSynth midiSynth;
+ std::vector<unsigned char> sysexBuffer;
+ };
+
+
+ PmTimestamp synchronize(PmInternal *midi)
+ {
+ return 0;
+ }
+
+
+ PmError in_open(PmInternal *midi, void *driverInfo)
+ {
+ int32 endpointID = (int32)(intptr_t)pm_descriptors[midi->device_id].descriptor;
+ BMidiProducer *producer = BMidiRoster::FindProducer(endpointID);
+ if (!producer)
+ return pmInvalidDeviceId;
+ PmInputConsumer *consumer = new PmInputConsumer(midi);
+ status_t status = producer->Connect(consumer);
+ if (status != B_OK) {
+ consumer->Release();
+ producer->Release();
+ strcpy(pm_hosterror_text, strerror(status));
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ midi->api_info = consumer;
+ producer->Release();
+ return pmNoError;
+ }
+
+
+ PmError in_abort(PmInternal *midi)
+ {
+ return pmNoError;
+ }
+
+
+ PmError in_close(PmInternal *midi)
+ {
+ int32 endpointID = (int32)(intptr_t)pm_descriptors[midi->device_id].descriptor;
+ BMidiProducer *producer = BMidiRoster::FindProducer(endpointID);
+ if (!producer)
+ return pmInvalidDeviceId;
+ PmInputConsumer *consumer = (PmInputConsumer*)midi->api_info;
+ status_t status = producer->Disconnect(consumer);
+ if (status != B_OK) {
+ consumer->Release();
+ producer->Release();
+ strcpy(pm_hosterror_text, strerror(status));
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ consumer->Release();
+ midi->api_info = NULL;
+ producer->Release();
+ return pmNoError;
+ }
+
+
+ PmError out_open(PmInternal *midi, void *driverInfo)
+ {
+ int32 endpointID = (int32)(intptr_t)pm_descriptors[midi->device_id].descriptor;
+ BMidiConsumer *consumer = BMidiRoster::FindConsumer(endpointID);
+ if (!consumer)
+ return pmInvalidDeviceId;
+ BMidiLocalProducer *producer = new BMidiLocalProducer("PortMidi output producer");
+ status_t status = producer->Connect(consumer);
+ if (status != B_OK) {
+ consumer->Release();
+ producer->Release();
+ strcpy(pm_hosterror_text, strerror(status));
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ PmOutputInfo *info = new PmOutputInfo;
+ info->producer = producer;
+ midi->api_info = info;
+ consumer->Release();
+ return pmNoError;
+ }
+
+
+ PmError out_abort(PmInternal *midi)
+ {
+ return pmNoError;
+ }
+
+
+ PmError out_close(PmInternal *midi)
+ {
+ int32 endpointID = (int32)(intptr_t)pm_descriptors[midi->device_id].descriptor;
+ BMidiConsumer *consumer = BMidiRoster::FindConsumer(endpointID);
+ if (!consumer)
+ return pmInvalidDeviceId;
+ PmOutputInfo *info = (PmOutputInfo*)midi->api_info;
+ status_t status = info->producer->Disconnect(consumer);
+ if (status != B_OK) {
+ consumer->Release();
+ midi->api_info = NULL;
+ info->producer->Release();
+ delete info;
+ strcpy(pm_hosterror_text, strerror(status));
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ consumer->Release();
+ midi->api_info = NULL;
+ info->producer->Release();
+ delete info;
+ return pmNoError;
+ }
+
+
+ // copied from the macOS implementation
+ size_t midi_length(uchar status)
+ {
+ int high, low;
+ static size_t high_lengths[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x00 through 0x70 */
+ 3, 3, 3, 3, 2, 2, 3, 1 /* 0x80 through 0xf0 */
+ };
+ static size_t low_lengths[] = {
+ 1, 2, 3, 2, 1, 1, 1, 1, /* 0xf0 through 0xf8 */
+ 1, 1, 1, 1, 1, 1, 1, 1 /* 0xf9 through 0xff */
+ };
+
+ high = status >> 4;
+ low = status & 15;
+
+ return (high != 0xF) ? high_lengths[high] : low_lengths[low];
+ }
+
+
+ PmError write_short(PmInternal *midi, PmEvent *buffer)
+ {
+ PmOutputInfo *info = (PmOutputInfo*)midi->api_info;
+ uchar data[3];
+ data[0] = Pm_MessageStatus(buffer->message);
+ data[1] = Pm_MessageData1(buffer->message);
+ data[2] = Pm_MessageData2(buffer->message);
+ size_t length = midi_length(data[0]);
+
+ info->producer->SprayData(data, length, true, buffer->timestamp * 1000);
+
+ // TODO: handle latency != 0
+ return pmNoError;
+ }
+
+
+ PmError begin_sysex(PmInternal *midi, PmTimestamp timestamp)
+ {
+ PmOutputInfo *info = (PmOutputInfo*)midi->api_info;
+ info->sysexBuffer.clear();
+ return pmNoError;
+ }
+
+
+ PmError end_sysex(PmInternal *midi, PmTimestamp timestamp)
+ {
+ PmOutputInfo *info = (PmOutputInfo*)midi->api_info;
+ info->producer->SpraySystemExclusive(&info->sysexBuffer[0], info->sysexBuffer.size(), timestamp * 1000);
+ info->sysexBuffer.clear();
+ return pmNoError;
+ }
+
+
+ PmError write_byte(PmInternal *midi, unsigned char byte, PmTimestamp timestamp)
+ {
+ PmOutputInfo *info = (PmOutputInfo*)midi->api_info;
+ info->sysexBuffer.push_back(byte);
+ return pmNoError;
+ }
+
+
+ PmError write_realtime(PmInternal *midi, PmEvent *buffer)
+ {
+ PmOutputInfo *info = (PmOutputInfo*)midi->api_info;
+ info->producer->SpraySystemRealTime(Pm_MessageStatus(buffer->message), buffer->timestamp * 1000);
+ return pmNoError;
+ }
+
+
+ PmError synth_open(PmInternal *midi, void *driverInfo)
+ {
+ PmSynthOutputInfo *info = new PmSynthOutputInfo;
+ info->midiSynth.EnableInput(true, true);
+ midi->api_info = info;
+ return pmNoError;
+ }
+
+
+ PmError synth_abort(PmInternal *midi)
+ {
+ return pmNoError;
+ }
+
+
+ PmError synth_close(PmInternal *midi)
+ {
+ PmSynthOutputInfo *info = (PmSynthOutputInfo*)midi->api_info;
+ delete info;
+ midi->api_info = NULL;
+ return pmNoError;
+ }
+
+
+ PmError write_short_synth(PmInternal *midi, PmEvent *buffer)
+ {
+ PmSynthOutputInfo *info = (PmSynthOutputInfo*)midi->api_info;
+ uchar data[3];
+ data[0] = Pm_MessageStatus(buffer->message);
+ data[1] = Pm_MessageData1(buffer->message);
+ data[2] = Pm_MessageData2(buffer->message);
+
+ switch(data[0] & 0xf0) {
+ case B_NOTE_OFF:
+ info->midiSynth.NoteOff((data[0] & 0x0f) + 1, data[1], data[2], buffer->timestamp);
+ break;
+ case B_NOTE_ON:
+ info->midiSynth.NoteOn((data[0] & 0x0f) + 1, data[1], data[2], buffer->timestamp);
+ break;
+ case B_KEY_PRESSURE:
+ info->midiSynth.KeyPressure((data[0] & 0x0f + 1), data[1], data[2], buffer->timestamp);
+ break;
+ case B_CONTROL_CHANGE:
+ info->midiSynth.ControlChange((data[0] & 0x0f) + 1, data[1], data[2], buffer->timestamp);
+ break;
+ case B_PROGRAM_CHANGE:
+ info->midiSynth.ProgramChange((data[0] & 0x0f) + 1, data[1], buffer->timestamp);
+ break;
+ case B_CHANNEL_PRESSURE:
+ info->midiSynth.ChannelPressure((data[0] & 0x0f) + 1, data[1], buffer->timestamp);
+ break;
+ case B_PITCH_BEND:
+ info->midiSynth.PitchBend((data[0] & 0x0f) + 1, data[1], data[2], buffer->timestamp);
+ break;
+ }
+
+ // TODO: handle latency != 0
+ return pmNoError;
+ }
+
+
+ PmError begin_sysex_synth(PmInternal *midi, PmTimestamp timestamp)
+ {
+ PmSynthOutputInfo *info = (PmSynthOutputInfo*)midi->api_info;
+ info->sysexBuffer.clear();
+ return pmNoError;
+ }
+
+
+ PmError end_sysex_synth(PmInternal *midi, PmTimestamp timestamp)
+ {
+ PmSynthOutputInfo *info = (PmSynthOutputInfo*)midi->api_info;
+ info->midiSynth.SystemExclusive(&info->sysexBuffer[0], info->sysexBuffer.size(), timestamp);
+ info->sysexBuffer.clear();
+ return pmNoError;
+ }
+
+
+ PmError write_byte_synth(PmInternal *midi, unsigned char byte, PmTimestamp timestamp)
+ {
+ PmSynthOutputInfo *info = (PmSynthOutputInfo*)midi->api_info;
+ info->sysexBuffer.push_back(byte);
+ return pmNoError;
+ }
+
+
+ PmError write_realtime_synth(PmInternal *midi, PmEvent *buffer)
+ {
+ PmSynthOutputInfo *info = (PmSynthOutputInfo*)midi->api_info;
+ info->midiSynth.SystemRealTime(Pm_MessageStatus(buffer->message), buffer->timestamp);
+ return pmNoError;
+ }
+
+
+ PmError write_flush(PmInternal *midi, PmTimestamp timestamp)
+ {
+ return pmNoError;
+ }
+
+
+ unsigned int check_host_error(PmInternal *midi)
+ {
+ return 0;
+ }
+
+
+ pm_fns_node pm_in_dictionary = {
+ none_write_short,
+ none_sysex,
+ none_sysex,
+ none_write_byte,
+ none_write_short,
+ none_write_flush,
+ synchronize,
+ in_open,
+ in_abort,
+ in_close,
+ success_poll,
+ check_host_error
+ };
+
+ pm_fns_node pm_out_dictionary = {
+ write_short,
+ begin_sysex,
+ end_sysex,
+ write_byte,
+ write_realtime,
+ write_flush,
+ synchronize,
+ out_open,
+ out_abort,
+ out_close,
+ none_poll,
+ check_host_error
+ };
+
+
+ pm_fns_node pm_synth_dictionary = {
+ write_short_synth,
+ begin_sysex_synth,
+ end_sysex_synth,
+ write_byte_synth,
+ write_realtime_synth,
+ write_flush,
+ synchronize,
+ synth_open,
+ synth_abort,
+ synth_close,
+ none_poll,
+ check_host_error
+ };
+
+
+ PmError create_virtual(int is_input, const char *name, void *driverInfo)
+ {
+ BMidiEndpoint *endpoint = is_input ? (BMidiEndpoint*)new BMidiLocalProducer(name) : new BMidiLocalConsumer(name);
+ if (!endpoint->IsValid()) {
+ endpoint->Release();
+ strcpy(pm_hosterror_text, "Endpoint could not be created");
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ status_t status = endpoint->Register();
+ if (status != B_OK) {
+ endpoint->Release();
+ strcpy(pm_hosterror_text, strerror(status));
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ return pm_add_device(const_cast<char*>("Haiku MIDI kit"), name, is_input, TRUE, (void*)(intptr_t)endpoint->ID(), is_input ? &pm_in_dictionary : &pm_out_dictionary);
+ }
+
+ PmError delete_virtual(PmDeviceID id)
+ {
+ int32 endpointID = (int32)(intptr_t)pm_descriptors[id].descriptor;
+ BMidiEndpoint *endpoint = BMidiRoster::FindEndpoint(endpointID);
+ //TODO: handle connected producers and consumers
+ status_t status = endpoint->Unregister();
+ // release twice to actually free the endpoint (FindEndpoint increases the ref-count)
+ endpoint->Release();
+ endpoint->Release();
+ if (status != B_OK) {
+ strcpy(pm_hosterror_text, strerror(status));
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ return pmNoError;
+ }
+
+ PmDeviceID pm_default_input_device_id = -1;
+ PmDeviceID pm_default_output_device_id = -1;
+}
+
+extern "C" {
+ void pm_init()
+ {
+ pm_add_interf(const_cast<char*>("Haiku MIDI kit"), create_virtual, delete_virtual);
+
+ pm_add_device(const_cast<char*>("Haiku MIDI kit"), "Soft Synth", FALSE, FALSE, NULL, &pm_synth_dictionary);
+
+ int32 id = 0;
+ BMidiEndpoint *endpoint;
+
+ while ((endpoint = BMidiRoster::NextEndpoint(&id)) != NULL) {
+ bool isInput = endpoint->IsProducer();
+ pm_add_device(const_cast<char*>("Haiku MIDI kit"), endpoint->Name(), isInput, FALSE, (void*)(intptr_t)id, isInput ? &pm_in_dictionary : &pm_out_dictionary);
+ endpoint->Release();
+ }
+
+ // the following (default device handling) is copied from the Linux implementation
+
+ // this is set when we return to Pm_Initialize, but we need it
+ // now in order to (successfully) call Pm_CountDevices()
+ pm_initialized = TRUE;
+ pm_default_input_device_id = find_default_device(
+ const_cast<char*>("/PortMidi/PM_RECOMMENDED_INPUT_DEVICE"), TRUE,
+ pm_default_input_device_id);
+ pm_default_output_device_id = find_default_device(
+ const_cast<char*>("/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE"), FALSE,
+ pm_default_output_device_id);
+ }
+
+
+ void pm_term()
+ {
+ int i;
+ for (i = 0; i < pm_descriptor_len; i++) {
+ PmInternal *midi = pm_descriptors[i].pm_internal;
+ if (midi && midi->api_info) {
+ // device is still open, close it
+ (*midi->dictionary->close)(midi);
+ }
+ if (pm_descriptors[i].pub.is_virtual && !pm_descriptors[i].deleted) {
+ delete_virtual(i);
+ }
+ }
+ }
+
+
+ PmDeviceID Pm_GetDefaultInputDeviceID()
+ {
+ Pm_Initialize();
+ return pm_default_input_device_id;
+ }
+
+
+ PmDeviceID Pm_GetDefaultOutputDeviceID()
+ {
+ Pm_Initialize();
+ return pm_default_output_device_id;
+ }
+
+
+ void *pm_alloc(size_t s)
+ {
+ return malloc(s);
+ }
+
+
+ void pm_free(void *ptr)
+ {
+ free(ptr);
+ }
+}
diff --git a/3rdparty/portmidi/pm_java/CMakeLists.txt b/3rdparty/portmidi/pm_java/CMakeLists.txt
index a3506202792..0bec03f04ae 100644
--- a/3rdparty/portmidi/pm_java/CMakeLists.txt
+++ b/3rdparty/portmidi/pm_java/CMakeLists.txt
@@ -1,47 +1,86 @@
-# pm_java
+# pm_java/CMakeLists.txt -- builds pmjni and pmdefaults program
+find_package(Java)
+message(STATUS "Java_JAVA_EXECUTABLE is " ${Java_JAVA_EXECUTABLE})
+
+if(BUILD_PMDEFAULTS)
+ # Since pmdefaults and pmdefaults.bat are in the source tree and look
+ # for libpmjni in the same tree, out-of-source build will not create
+ # a working pmdefaults (without more work):
+ if(NOT (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}))
+ message(WARNING "PmDefaults only works when run in the pm_java/pmdefaults directory after an in-source build. This is an out-of-source build, so [probably] libpmjni will be built out-of-source, pmdefaults.jar will be built in-source, and the pmdefaults[.bat] script remains in-source. Rebuild in-source to use PmDefaults or adjust the file locations and scripts to suit yourself.")
+ endif()
+
+ set(JPORTMIDICLASS JPortMidi.class JPortMidiException.class
+ JPortMidiApi.class)
+ set(PMDEFAULTSCLASS PmDefaultsFrame.class PmDefaults.class)
+ prepend_path(JPORTMIDIPATH jportmidi/ ${JPORTMIDICLASS})
+ prepend_path(PMDEFAULTSPATH pmdefaults/ ${PMDEFAULTSCLASS})
+ set(PMDEFAULTS_ALL ${JPORTMIDIPATH} ${PMDEFAULTSPATH})
+
+ project(pmdefaults NONE)
+ include(UseJava)
+ add_jar(pmdefaults
+ SOURCES pmdefaults/PmDefaults.java pmdefaults/PmDefaultsFrame.java
+ jportmidi/JPortMidi.java jportmidi/JPortMidiApi.java
+ jportmidi/JPortMidiException.java
+ RESOURCES NAMESPACE "." pmdefaults/portmusic_logo.png
+ MANIFEST pmdefaults/manifest.txt
+ OUTPUT_DIR pmdefaults)
+ if(WIN32)
+ set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../jre/lib/i386/client/libjvm.so)
+ endif()
+ add_dependencies(pmdefaults pmjni)
+endif(BUILD_PMDEFAULTS)
+
+# Build pmjni
+# this CMakeLists.txt is only loaded if BUILD_JAVA_NATIVE_INTERFACE
+# This jni library includes portmidi sources to give just
+# one library for JPortMidi users to manage rather than two.
if(UNIX)
- if(APPLE)
- # java not dealt with in CMake -- see pm_mac/pm_mac.xcodeproj
- else(APPLE)
- # linux
- set(JPORTMIDICLASS JPortMidi.class JPortMidiException.class
- JPortMidiApi.class)
- set(PMDEFAULTSCLASS PmDefaultsFrame.class PmDefaults.class)
- prepend_path(JPORTMIDICLASS2 jportmidi/ ${JPORTMIDICLASS})
- prepend_path(PMDEFAULTSCLASS2 pmdefaults/ ${PMDEFAULTSCLASS})
- set(PMDEFAULTS_ALL_CLASSES ${JPORTMIDICLASS2} ${PMDEFAULTSCLASS2})
- # message(STATUS "PMDEFAULTS_ALL_CLASSES is " ${PMDEFAULTS_ALL_CLASSES})
- add_custom_command(OUTPUT pmdefaults/PmDefaultsFrame.class
- COMMAND javac -classpath . pmdefaults/PmDefaultsFrame.java
- MAIN_DEPENDENCY pmdefaults/PmDefaultsFrame.java
- DEPENDS pmdefaults/PmDefaults.java
- WORKING_DIRECTORY pm_java)
- add_custom_command(OUTPUT pmdefaults/PmDefaults.class
- COMMAND javac -classpath . pmdefaults/PmDefaults.java
- MAIN_DEPENDENCY pmdefaults/PmDefaults.java
- DEPENDS pmdefaults/PmDefaultsFrame.java
- WORKING_DIRECTORY pm_java)
- add_custom_command(OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar
- COMMAND cp pmdefaults/portmusic_logo.png .
- COMMAND jar cmf pmdefaults/manifest.txt pmdefaults.jar
- pmdefaults/*.class portmusic_logo.png jportmidi/*.class
- COMMAND chmod +x pmdefaults/pmdefaults
- COMMAND cp pmdefaults/pmdefaults ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
- COMMAND mv pmdefaults.jar ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
- COMMAND rm portmusic_logo.png
- MAIN_DEPENDENCY pmdefaults/PmDefaults.class
- DEPENDS ${PMDEFAULTS_ALL_CLASSES}
- WORKING_DIRECTORY pm_java)
- add_custom_target(pmdefaults_target ALL
- DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar)
- # message(STATUS "add_custom_target: pmdefaults.jar")
-
- # install the libraries (Linux only)
- INSTALL(FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar
- DESTINATION /usr/share/java)
- INSTALL(PROGRAMS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults
- DESTINATION /usr/local/bin)
- endif(APPLE)
-endif(UNIX)
-# In windows, use pm_java/make.bat
+ include(FindJNI)
+ # message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH})
+ # message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH})
+ # note: should use JAVA_JVM_LIB_PATH, but it is not set properly
+ # note: user might need to set JAVA_INCLUDE_PATH manually
+ #
+ # this will probably break on BSD and other Unix systems; the fix
+ # depends on whether FindJNI can find Java or not. If yes, then
+ # we should try to rely on automatically set JAVA_INCLUDE_PATH and
+ # JAVA_INCLUDE_PATH2; if no, then we need to make both JAVA_INCLUDE_PATH
+ # and JAVA_INCLUDE_PATH2 set by user (will need clear documentation
+ # because JAVA_INCLUDE_PATH2 is pretty obscure)
+ set(JAVA_INCLUDE_PATH ${JAVA_INCLUDE_PATH-UNKNOWN}
+ CACHE STRING "where to find Java SDK include directory")
+ # libjvm.so is found relative to JAVA_INCLUDE_PATH:
+ if (HAIKU)
+ set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH}/haiku)
+ else()
+ set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH}/linux)
+ endif()
+elseif(WIN32)
+ include(FindJNI)
+ # note: should use JAVA_JVM_LIB_PATH, but it is not set properly
+ set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../lib/jvm.lib)
+
+ set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
+ # message(STATUS "JAVA_INCLUDE_PATHS: " ${JAVA_INCLUDE_PATHS})
+ # message(STATUS "JAVAVM_LIB: " ${JAVAVM_LIB})
+endif()
+
+add_library(pmjni SHARED pmjni/pmjni.c)
+target_sources(pmjni PRIVATE ${PM_LIB_PUBLIC_SRC} ${PM_LIB_PRIVATE_SRC})
+message(STATUS "Java paths ${JAVA_INCLUDE_PATHS}")
+# message(STATUS "Java pmjni src: pmjni/pmjni.c ${PM_LIB_SHARED_SRC} "
+# "${PM_LIB_PRIVATE_SRC}")
+target_include_directories(pmjni PUBLIC ${JAVA_INCLUDE_PATHS})
+target_link_libraries(pmjni ${PM_NEEDED_LIBS})
+set_target_properties(pmjni PROPERTIES
+ VERSION ${LIBRARY_VERSION}
+ SOVERSION ${LIBRARY_SOVERSION}
+ LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
+ ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
+ EXECUTABLE_EXTENSION "jnilib"
+ MACOSX_RPATH ON)
+
diff --git a/3rdparty/portmidi/pm_java/JavaExe.exe b/3rdparty/portmidi/pm_java/JavaExe.exe
deleted file mode 100644
index 8886d2e8672..00000000000
--- a/3rdparty/portmidi/pm_java/JavaExe.exe
+++ /dev/null
Binary files differ
diff --git a/3rdparty/portmidi/pm_java/README.txt b/3rdparty/portmidi/pm_java/README.txt
index 44c6fab4508..bf0d73768b2 100644
--- a/3rdparty/portmidi/pm_java/README.txt
+++ b/3rdparty/portmidi/pm_java/README.txt
@@ -1,33 +1,70 @@
README.txt
Roger B. Dannenberg
16 Jun 2009
+updated 2021
-This directory was created to implement PmDefaults, a program to
-set default input and output devices for PortMidi applications.
+This directory implements a JNI library so that Java programs can use
+the PortMidi API. This was mainly created to implement PmDefaults, a
+program to set default input and output devices for PortMidi
+applications.
-There are three main sub-projects here:
- 1) pmjni -- a JNI (Java Native Interface) to access PortMidi
- 2) jportmidi -- a Java class to access PortMidi (uses pmjni)
- 3) pmdefaults -- the PmDefaults application (uses jportmidi)
+PmDefaults never found much use. I recommend you implement
+per-application preferences and store default PortMidi device
+numbers for input and output there. (Or better yet, store
+device *names* since numbers can change if you plug in or
+remove USB devices.)
-For Mac OS X, you should build the PmDefaults application in Xcode.
+Even without PmDefaults, a PortMidi API for Java is probably an
+improvement over other Java libraries, but there is very little MIDI
+development in Java, so I have not maintained this API. The only thing
+probably seriously wrong now is an interface to the
+Pm_CreateVirtualInput and Pm_CreateVirtualOutput functions, which are
+new additions.
-For Win32, an installer for PmDefaults is included in setup/.
-To build from sources, you should first build everything including
-the portmidi dll (that will be used by the Java application) using
-Visual C++ and a provided .sln file in the portmidi home directory.
-Then, run make.bat in this directory. The subdirectory win32 will be
-created with the application pmdefaults.exe. You can run this application
-in the normal way. To move the application, you need to copy *everything*
-in win32. To build setup/pmdefaults-setup.exe, I have used both
-Setup Generator from Gentee software and Inno Setup from jrsoftware.org.
-A script for Inno Setup is included in this directory, but since paths
-seem to be absolute, you will have to adjust the paths in the script
-before you use it.
+I will leave the code here, and if there is a demand, please either
+update it or let your needs be known. Perhaps I or someone can help.
+
+==================================================================
----- implementation notes ----
+BUILDING PmDefaults PROGRAM
-For windows, we use the free software JavaExe.exe. The copy here was
+You must have a JDK installed (Java development kit including javac
+(the Java compiler), jni.h, etc.
+
+Test java on the command line, e.g., type: javac -version
+
+Enable these options in the main CMakeLists.txt file (run CMake
+from your top-level repository directory):
+ BUILD_JAVA_NATIVE_INTERFACE
+ BUILD_PMDEFAULTS
+In my Ubuntu linux with jdk-15, ccmake was unable to find my JDK, so
+I have to manually set CMake variables as follows (type 't' to see
+these in ccmake):
+ JAVA_AWT_INCLUDE_PATH /usr/lib/jvm/jdk-15/include
+ JAVA_AWT_LIBRARY /usr/lib/jvm/jdk-15/lib
+ JAVA_INCLUDE_PATH /usr/lib/jvm/jdk-15/include
+ JAVA_INCLUDE_PATH2 /usr/lib/jvm/jdk-15/include
+ JAVA_JVM_LIBRARY /usr/lib/jvm/jdk-15/lib
+Of course, your paths may differ.
+
+
+RUNNING PmDefaults PROGRAM
+
+After building the pmdefaults target with make, Visual Studio, or Xcode:
+In Windows:
+ [from the command line:]
+ cd portmidi\pm_java\pmdefaults -- change to this directory
+ pmdefaults -- runs pmdefaults.bat
+ [or from the finder:]
+ double-click on pmdefaults.bat
+In macOS and Linux:
+ cd portmidi\pm_java\pmdefaults -- change to this directory
+ ./pmdefaults -- shell script to invoke java
+
+
+---- old implementation notes ----
+
+For Windows, we use the free software JavaExe.exe. The copy here was
downloaded from
http://software.techrepublic.com.com/abstract.aspx?kw=javaexe&docid=767485
@@ -40,9 +77,3 @@ Java application jar file and then *renaming* JavaExe.exe to the name
of the jar file, but keeping the .exe extension. (See make.bat for this
step.) Documentation for JavaExe can be obtained by downloading the
whole program from the URL(s) above.
-
-
-
-
-
-
diff --git a/3rdparty/portmidi/pm_java/UpdateRsrcJavaExe.exe b/3rdparty/portmidi/pm_java/UpdateRsrcJavaExe.exe
deleted file mode 100644
index 492ec1679ea..00000000000
--- a/3rdparty/portmidi/pm_java/UpdateRsrcJavaExe.exe
+++ /dev/null
Binary files differ
diff --git a/3rdparty/portmidi/pm_java/jportmidi/JPortMidi.java b/3rdparty/portmidi/pm_java/jportmidi/JPortMidi.java
index dd3cc2a1c3a..7116e19640a 100644
--- a/3rdparty/portmidi/pm_java/jportmidi/JPortMidi.java
+++ b/3rdparty/portmidi/pm_java/jportmidi/JPortMidi.java
@@ -77,7 +77,9 @@ public class JPortMidi {
throw new JPortMidiException(pmStreamOpen,
"RefreshDeviceLists called while stream is open");
}
+ if (trace) System.out.println("Pm_Terminate");
checkError(pm.Pm_Terminate());
+ if (trace) System.out.println("Pm_Initialize");
checkError(pm.Pm_Initialize());
}
diff --git a/3rdparty/portmidi/pm_java/mac-make.sh b/3rdparty/portmidi/pm_java/mac-make.sh
deleted file mode 100644
index e5e9592b0a0..00000000000
--- a/3rdparty/portmidi/pm_java/mac-make.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-# script to build a jar file to run PmDefaults from the command line on OS X
-# (This is for debugging. Normally, you would use XCode to build PmDefaults.app.)
-
-# Compile the java Portidi interface classes.
-javac jportmidi/*.java
-
-# Compile the pmdefaults application.
-javac -classpath . pmdefaults/*.java
-
-# Temporarily copy the portmusic_logo.png file here to add to the jar file.
-cp pmdefaults/portmusic_logo.png .
-
-# Create a directory to hold the distribution.
-mkdir mac-osx
-
-# Copy the interface DLL to the distribution directory.
-cp ../Release/libpmjni.dylib mac-osx
-
-# Create a java archive (jar) file of the distribution.
-jar cmf pmdefaults/manifest.txt mac-osx/pmdefaults.jar pmdefaults/*.class portmusic_logo.png jportmidi/*.class
-
-# Clean up the temporary image file now that it is in the jar file.
-rm portmusic_logo.png
-
-echo "You now have a jar file in mac-osx"
-
diff --git a/3rdparty/portmidi/pm_java/pmdefaults-setup-script.iss b/3rdparty/portmidi/pm_java/pmdefaults-setup-script.iss
deleted file mode 100644
index c7fe5f57e34..00000000000
--- a/3rdparty/portmidi/pm_java/pmdefaults-setup-script.iss
+++ /dev/null
@@ -1,44 +0,0 @@
-; Script generated by the Inno Setup Script Wizard.
-; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
-
-[Setup]
-; NOTE: The value of AppId uniquely identifies this application.
-; Do not use the same AppId value in installers for other applications.
-; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
-AppId={{5094958B-3CD7-4780-A883-69C9E5B95AEF}
-AppName=PmDefaults
-AppVerName=PmDefaults
-AppPublisher=Roger Dannenberg - Carnegie Mellon University
-AppPublisherURL=http://portmedia.sourceforge.net/
-AppSupportURL=http://portmedia.sourceforge.net/
-AppUpdatesURL=http://portmedia.sourceforge.net/
-DefaultDirName={pf}\PmDefaults
-DefaultGroupName=PmDefaults
-LicenseFile=C:\Users\rbd\portmedia\portmidi\pm_java\win32\license.txt
-OutputBaseFilename=setup
-SetupIconFile=C:\Users\rbd\portmedia\portmidi\pm_java\pmdefaults\pmdefaults.ico
-Compression=lzma
-SolidCompression=yes
-
-[Languages]
-Name: "english"; MessagesFile: "compiler:Default.isl"
-
-[Tasks]
-Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
-Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
-
-[Files]
-Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\pmdefaults.exe"; DestDir: "{app}"; Flags: ignoreversion
-Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\pmdefaults.jar"; DestDir: "{app}"; Flags: ignoreversion
-Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\pmjni.dll"; DestDir: "{app}"; Flags: ignoreversion
-Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\license.txt"; DestDir: "{app}"; Flags: ignoreversion
-; NOTE: Don't use "Flags: ignoreversion" on any shared system files
-
-[Icons]
-Name: "{group}\PmDefaults"; Filename: "{app}\pmdefaults.exe"
-Name: "{commondesktop}\PmDefaults"; Filename: "{app}\pmdefaults.exe"; Tasks: desktopicon
-Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\PmDefaults"; Filename: "{app}\pmdefaults.exe"; Tasks: quicklaunchicon
-
-[Run]
-Filename: "{app}\pmdefaults.exe"; Description: "{cm:LaunchProgram,PmDefaults}"; Flags: nowait postinstall skipifsilent
-
diff --git a/3rdparty/portmidi/pm_java/pmdefaults/PmDefaults.java b/3rdparty/portmidi/pm_java/pmdefaults/PmDefaults.java
index 20708fc9b66..4cfdb9da96a 100644
--- a/3rdparty/portmidi/pm_java/pmdefaults/PmDefaults.java
+++ b/3rdparty/portmidi/pm_java/pmdefaults/PmDefaults.java
@@ -1,11 +1,15 @@
// PmDefaults -- a small application to set PortMIDI default input/output
package pmdefaults;
+import javax.swing.SwingUtilities;
public class PmDefaults {
public static void main(String[] args) {
System.out.println("starting main");
- new PmDefaultsFrame("PortMIDI Setup");
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ new PmDefaultsFrame("PortMIDI Setup");
+ }
+ });
}
}
-
diff --git a/3rdparty/portmidi/pm_java/pmdefaults/README.txt b/3rdparty/portmidi/pm_java/pmdefaults/README.txt
index e0a4d4b40e8..39fa1fd2c2f 100644
--- a/3rdparty/portmidi/pm_java/pmdefaults/README.txt
+++ b/3rdparty/portmidi/pm_java/pmdefaults/README.txt
@@ -2,20 +2,19 @@ README.txt
Roger B. Dannenberg
2 Jan 2009
-PmDefaults is a program to set default input and output devices for PortMidi
-applications. After running the PmDefaults program and choosing devices,
-identifiers for these devices will be returned by
-Pm_GetDefaultInputDeviceID() and Pm_GetDefaultOutputDeviceID().
+PmDefaults is a program to set default input and output devices for
+PortMidi applications. After running the PmDefaults program and
+choosing devices, identifiers for these devices will be returned by
+calls (within any program) to Pm_GetDefaultInputDeviceID() and
+Pm_GetDefaultOutputDeviceID().
Included in this directory are:
manifest.txt -- used in pmdefaults.jar
-pmdefaults-icon.* -- various icons for applications
-pmdefaults-license.txt -- a version of portmidi/license.txt formatted for
- the windows installer
+pmdefaults-license.txt -- license text
+pmdefaults-icon.{bmp,xcf,png,gif} -- icons
+pmdefaults.{ico,icns} - icons
portmusic_logo.png -- a logo displayed by the pmdefaults application
-readme-win32.txt -- this becomes the readme file for the pmdefaults
- application. It is copied to win32/README.txt by make.bat
-TO BUILD THE APPLICATION: see ../README.txt
+TO BUILD AND RUN THE APPLICATION: see ../README.txt
diff --git a/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults b/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults
index 80162469ae0..fb01fbf0f67 100644
--- a/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults
+++ b/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults
@@ -1 +1,8 @@
-java -jar /usr/share/java/pmdefaults.jar > /dev/null
+#!/bin/sh
+# Run PmDefaults, the GUI to select default MIDI input and output for PortMidi
+# Due to the locations of the .jar file and libpmjni, this script only runs
+# from <portmidi-repo-path>/pm_java/pmdefaults. PmDefaults is minimally
+# supported -- if you would like it to appear as an app on your desktop,
+# contact the developer(s) and let us know it's actually being used.
+# library path here includes directory locations for macOS and Linux.
+java -Djava.library.path=../../Release:../../Debug:../.. -jar pmdefaults.jar > /dev/null
diff --git a/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-license.txt b/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-license.txt
index 317f70e0eb6..703923c25b9 100644
--- a/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-license.txt
+++ b/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-license.txt
@@ -3,8 +3,6 @@ LICENSE INFORMATION
PmDefaults is a small program to set default MIDI input and output
devices for other programs using the PortMidi library.
-Latest version available at: http://sourceforge.net/projects/portmedia
-
Copyright (c) 1999-2000 Ross Bencina and Phil Burk
Copyright (c) 2001-2009 Roger B. Dannenberg
diff --git a/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.bat b/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.bat
new file mode 100644
index 00000000000..7ebfdf75e08
--- /dev/null
+++ b/3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.bat
@@ -0,0 +1 @@
+java -Djava.library.path="../../Release;../../Debug" -jar pmdefaults.jar
diff --git a/3rdparty/portmidi/pm_java/pmdefaults/readme-win32.txt b/3rdparty/portmidi/pm_java/pmdefaults/readme-win32.txt
deleted file mode 100644
index 5ff168bd715..00000000000
--- a/3rdparty/portmidi/pm_java/pmdefaults/readme-win32.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-README.txt
-Roger B. Dannenberg
-1 Jan 2009
-
-This directory contains files that implement:
-
-pmdefaults -- a program to set PortMidi default input/output devices
-
-You can copy and rename this *whole directory* to move the application
-to a convenient place. The application to run is pmdefaults.exe.
-
diff --git a/3rdparty/portmidi/pm_java/pmjni/pmjni-VC8.vcproj b/3rdparty/portmidi/pm_java/pmjni/pmjni-VC8.vcproj
deleted file mode 100644
index 1b42bfac9bd..00000000000
--- a/3rdparty/portmidi/pm_java/pmjni/pmjni-VC8.vcproj
+++ /dev/null
@@ -1,225 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="pmjni"
- ProjectGUID="{7AA255C8-48BF-40AC-97BA-F7E7BA4DDAA8}"
- RootNamespace="pmjni"
- Keyword="Win32Proj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="2"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;$(SolutionDir)\pm_common&quot;;&quot;$(SolutionDir)\porttime&quot;;&quot;$(ProjectDir)&quot;;&quot;E:\Program Files\Java\jdk1.5.0_14\include&quot;;&quot;E:\Program Files\Java\jdk1.5.0_14\include\win32&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PMJNI_EXPORTS"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="2"
- CharacterSet="2"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="&quot;$(SolutionDir)\pm_common&quot;;&quot;$(SolutionDir)\porttime&quot;;&quot;$(ProjectDir)&quot;;&quot;E:\Program Files\Java\jdk1.5.0_14\include&quot;;&quot;E:\Program Files\Java\jdk1.5.0_14\include\win32&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PMJNI_EXPORTS"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="winmm.lib"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\pmjni.c"
- >
- </File>
- <File
- RelativePath="..\..\pm_common\pmutil.c"
- >
- </File>
- <File
- RelativePath="..\..\pm_win\pmwin.c"
- >
- </File>
- <File
- RelativePath="..\..\pm_win\pmwinmm.c"
- >
- </File>
- <File
- RelativePath="..\..\pm_common\portmidi.c"
- >
- </File>
- <File
- RelativePath="..\..\porttime\porttime.c"
- >
- </File>
- <File
- RelativePath="..\..\porttime\ptwinmm.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_java/pmjni/pmjni.c b/3rdparty/portmidi/pm_java/pmjni/pmjni.c
index 95e51dda4c5..c60cffb45eb 100644
--- a/3rdparty/portmidi/pm_java/pmjni/pmjni.c
+++ b/3rdparty/portmidi/pm_java/pmjni/pmjni.c
@@ -13,11 +13,11 @@
// the size of a pointer. Finally cast int to pointer. All this
// is supposed to avoid C compiler warnings and (worse) losing
// address bits.
-#define PMSTREAM(obj, fid) ((PmStream *) (long) (*env)->GetLongField(env, obj, fid))
+#define PMSTREAM(obj, fid) ((PmStream *) (intptr_t) (*env)->GetLongField(env, obj, fid))
// Cast stream to long to convert integer to pointer, then expand
// integer to 64-bit jlong. This avoids compiler warnings.
#define SET_PMSTREAM(obj, fid, stream) \
- (*env)->SetLongField(env, obj, fid, (jlong) (long) stream)
+ (*env)->SetLongField(env, obj, fid, (jlong) (intptr_t) stream)
/*
diff --git a/3rdparty/portmidi/pm_java/setup/pmdefaults-setup.exe b/3rdparty/portmidi/pm_java/setup/pmdefaults-setup.exe
deleted file mode 100644
index 78ef52c3e44..00000000000
--- a/3rdparty/portmidi/pm_java/setup/pmdefaults-setup.exe
+++ /dev/null
Binary files differ
diff --git a/3rdparty/portmidi/pm_linux/README_LINUX.txt b/3rdparty/portmidi/pm_linux/README_LINUX.txt
index 818793e570f..cfbc43f571a 100644
--- a/3rdparty/portmidi/pm_linux/README_LINUX.txt
+++ b/3rdparty/portmidi/pm_linux/README_LINUX.txt
@@ -1,45 +1,25 @@
README_LINUX.txt for PortMidi
Roger Dannenberg
-14 Oct 2009
+6 Dec 2012, revised May 2022
-To make PortMidi, you need cmake and the Java SDK.
-Go back up to the portmidi directory and type:
+Contents:
+ To make PortMidi
+ The pmdefaults program
+ Setting LD_LIBRARY_PATH
+ A note about amd64
+ Using autoconf
+ Using configure
+ Changelog
-ccmake .
-Type 'c' (configure) and then 'g' (generate). You may have
-to manually set JAVA_INCLUDE_PATH and JAVA_JVM_LIBRARY
-by typing 't' (toggle to advanced mode) and using the
-editor to change the fields. You can find possible values
-for JAVA_INCLUDE_PATH by typing "locate jni.h", and for
-JAVA_JVM_LIBRARY by typing locate libjvm".
-
-You also need JAVA_INCLUDE_PATH2, but this will normally
-be set automatically after you set JAVA_INCLUDE_PATH and
-run "configure" (type "c" to ccmake). Normally,
-JAVA_INCLUDE_PATH2 is the linux subdirectory within
-JAVA_INCLUDE_PATH.
-
-Notice that the CMAKE_BUILD_TYPE can be Debug or Release.
-Stick with Release if you are not debugging.
-
-After successfully generating make files with ccmake, you
-can run make:
-
-make
-
-The Makefile will build all test programs and the portmidi
-library. For experimental software,
-especially programs running from the command line, we
-recommend using the Debug version -- it will terminate your
-program and print a helpful message if any PortMidi
-function returns an error code. (Released software should
-check for error codes and handle them, but for quick,
-non-critical projects, the automatic "print and die"
-handling can save some work.)
+See ../README.md for general instructions.
THE pmdefaults PROGRAM
+(This may be obsolete. It is older than `../README.md` which
+also discusses pmdefaults, and Java support may be removed
+unless someone claims they use it... -RBD)
+
You should install pmdefaults. It provides a graphical interface
for selecting default MIDI IN and OUT devices so that you don't
have to build device selection interfaces into all your programs
@@ -72,7 +52,7 @@ export LD_LIBRARY_PATH
A NOTE ABOUT AMD64:
-When compiling portmidi under linux on an AMD64, I had to add the -fPIC
+When compiling portmidi under linux on an AMD64, I had to add the -fPIC
flag to the gcc flags.
Reason: when trying to build John Harrison's pyPortMidi gcc bailed out
@@ -90,6 +70,12 @@ be "PIC-enabled".
CHANGELOG
+27-may-2022 Roger B. Dannenberg
+ Some updates to this file.
+
+6-dec-2012 Roger B. Dannenberg
+ Copied notes on Autoconf from Audacity sources
+
22-jan-2010 Roger B. Dannenberg
Updated instructions about Java paths
diff --git a/3rdparty/portmidi/pm_linux/finddefault.c b/3rdparty/portmidi/pm_linux/finddefault.c
index c3077701a60..6189a8b7148 100644
--- a/3rdparty/portmidi/pm_linux/finddefault.c
+++ b/3rdparty/portmidi/pm_linux/finddefault.c
@@ -7,8 +7,9 @@
#include <string.h>
#include <ctype.h>
#include "portmidi.h"
-
-extern int pm_find_default_device(char *pattern, int is_input);
+#include "pmutil.h"
+#include "pminternal.h"
+#include "finddefault.h"
#define STRING_MAX 256
@@ -21,7 +22,7 @@ void skip_spaces(FILE *inf)
}
/* trim leading spaces and match a string */
-int match_string(FILE *inf, char *s)
+int match_string(FILE *inf, const char *s)
{
skip_spaces(inf);
while (*s && *s == getc(inf)) s++;
@@ -29,19 +30,21 @@ int match_string(FILE *inf, char *s)
}
-/* Parse preference files, find default device, search devices --
+/*
+ Parse preference files, find default device, search devices --
*/
-PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
+PmDeviceID find_default_device(const char *path, int input, PmDeviceID id)
/* path -- the name of the preference we are searching for
input -- true iff this is an input device
id -- current default device id
returns matching device id if found, otherwise id
*/
{
- static char *pref_2 = (char *)"/.java/.userPrefs/";
- static char *pref_3 = (char *)"prefs.xml";
- char *pref_1 = getenv("HOME");
- char *full_name, *path_ptr;
+ static char const *const pref_2 = "/.java/.userPrefs/";
+ static char const *const pref_3 = "prefs.xml";
+ const char *pref_1 = getenv("HOME");
+ const char *path_ptr;
+ char *full_name;
FILE *inf;
int c, i;
if (!pref_1) goto nopref; // cannot find preference file
@@ -54,8 +57,8 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
if (*path == '/') path++; // skip initial slash in path
path_ptr = strrchr(path, '/');
if (path_ptr) { // copy up to slash after full_name
- path_ptr++;
int offset = strlen(full_name);
+ path_ptr++;
memcpy(full_name + offset, path, path_ptr - path);
full_name[offset + path_ptr - path] = 0; // end of string
} else {
@@ -63,7 +66,6 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
}
strcat(full_name, pref_3);
inf = fopen(full_name, "r");
- free(full_name);
if (!inf) goto nopref; // cannot open preference file
// We're not going to build or link in a full XML parser.
// Instead, find the path string and quoute. Then, look for
@@ -74,9 +76,9 @@ PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
// look for quote string quote
if (!match_string(inf, path_ptr)) continue; // path not found
if (getc(inf) != '"') continue; // path not found, keep scanning
- if (!match_string(inf, (char *)"value")) goto nopref; // value not found
- if (!match_string(inf, (char *)"=")) goto nopref; // = not found
- if (!match_string(inf, (char *)"\"")) goto nopref; // quote not found
+ if (!match_string(inf, "value")) goto nopref; // value not found
+ if (!match_string(inf, "=")) goto nopref; // = not found
+ if (!match_string(inf, "\"")) goto nopref; // quote not found
// now read the value up to the close quote
for (i = 0; i < STRING_MAX; i++) {
if ((c = getc(inf)) == '"') break;
diff --git a/3rdparty/portmidi/pm_linux/finddefault.h b/3rdparty/portmidi/pm_linux/finddefault.h
new file mode 100644
index 00000000000..4599fff8697
--- /dev/null
+++ b/3rdparty/portmidi/pm_linux/finddefault.h
@@ -0,0 +1,5 @@
+/* finddefault.h -- find_default_device() declaration
+ Roger Dannenberg, Jan 2021
+*/
+
+PmDeviceID find_default_device(const char *path, int input, PmDeviceID id);
diff --git a/3rdparty/portmidi/pm_linux/pmlinux.c b/3rdparty/portmidi/pm_linux/pmlinux.c
index b05c54fccb9..05ac332c368 100644
--- a/3rdparty/portmidi/pm_linux/pmlinux.c
+++ b/3rdparty/portmidi/pm_linux/pmlinux.c
@@ -14,6 +14,7 @@
#include "portmidi.h"
#include "pmutil.h"
#include "pminternal.h"
+#include "finddefault.h"
#ifdef PMALSA
#include "pmlinuxalsa.h"
@@ -23,32 +24,34 @@
#include "pmlinuxnull.h"
#endif
+#if !(defined(PMALSA) || defined(PMNULL))
+#error One of PMALSA or PMNULL must be defined
+#endif
+
PmDeviceID pm_default_input_device_id = -1;
PmDeviceID pm_default_output_device_id = -1;
-extern PmDeviceID find_default_device(char *path, int input, PmDeviceID id);
-
-void pm_init()
+void pm_init(void)
{
/* Note: it is not an error for PMALSA to fail to initialize.
* It may be a design error that the client cannot query what subsystems
* are working properly other than by looking at the list of available
* devices.
*/
- #ifdef PMALSA
- pm_linuxalsa_init();
- #endif
- #ifdef PMNULL
+#ifdef PMALSA
+ pm_linuxalsa_init();
+#endif
+#ifdef PMNULL
pm_linuxnull_init();
- #endif
+#endif
// this is set when we return to Pm_Initialize, but we need it
// now in order to (successfully) call Pm_CountDevices()
pm_initialized = TRUE;
pm_default_input_device_id = find_default_device(
- (char *)"/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE,
+ "/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE,
pm_default_input_device_id);
pm_default_output_device_id = find_default_device(
- (char *)"/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE,
+ "/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE,
pm_default_output_device_id);
}
@@ -57,14 +60,17 @@ void pm_term(void)
#ifdef PMALSA
pm_linuxalsa_term();
#endif
+ #ifdef PMNULL
+ pm_linuxnull_term();
+ #endif
}
-PmDeviceID Pm_GetDefaultInputDeviceID() {
+PmDeviceID Pm_GetDefaultInputDeviceID(void) {
Pm_Initialize();
return pm_default_input_device_id;
}
-PmDeviceID Pm_GetDefaultOutputDeviceID() {
+PmDeviceID Pm_GetDefaultOutputDeviceID(void) {
Pm_Initialize();
return pm_default_output_device_id;
}
diff --git a/3rdparty/portmidi/pm_linux/pmlinuxalsa.c b/3rdparty/portmidi/pm_linux/pmlinuxalsa.c
index 9ca2cf72adf..62b82d73b25 100644
--- a/3rdparty/portmidi/pm_linux/pmlinuxalsa.c
+++ b/3rdparty/portmidi/pm_linux/pmlinuxalsa.c
@@ -7,6 +7,11 @@
* Jason Cohen, Rico Colon, Matt Filippone (Alsa 0.5.x implementation)
*/
+/* omit this code if PMALSA is not defined -- this mechanism allows
+ * selection of different MIDI interfaces (at compile time).
+ */
+#ifdef PMALSA
+
#include "stdlib.h"
#include "portmidi.h"
#include "pmutil.h"
@@ -15,16 +20,8 @@
#include "string.h"
#include "porttime.h"
#include "pmlinux.h"
-#include <alsa/asoundlib.h>
-
-typedef unsigned int UINT32;
-__extension__ typedef unsigned long long UINT64;
-#ifdef PTR64
-typedef UINT64 FPTR;
-#else
-typedef UINT32 FPTR;
-#endif
+#include <alsa/asoundlib.h>
/* I used many print statements to debug this code. I left them in the
* source, and you can turn them on by changing false to true below:
@@ -40,10 +37,9 @@ typedef UINT32 FPTR;
#endif
/* to store client/port in the device descriptor */
-
-#define MAKE_DESCRIPTOR(client, port) ((void*)(FPTR)(((client) << 8) | (port)))
-#define GET_DESCRIPTOR_CLIENT(info) ((((int)(FPTR)(info)) >> 8) & 0xff)
-#define GET_DESCRIPTOR_PORT(info) (((int)(FPTR)(info)) & 0xff)
+#define MAKE_DESCRIPTOR(client, port) ((void*)(long)(((client) << 8) | (port)))
+#define GET_DESCRIPTOR_CLIENT(info) ((((long)(info)) >> 8) & 0xff)
+#define GET_DESCRIPTOR_PORT(info) (((long)(info)) & 0xff)
#define BYTE unsigned char
@@ -54,14 +50,16 @@ static snd_seq_t *seq = NULL; // all input comes here,
// output queue allocated on seq
static int queue, queue_used; /* one for all ports, reference counted */
-typedef struct alsa_descriptor_struct {
+#define PORT_IS_CLOSED -999999
+
+typedef struct alsa_info_struct {
+ int is_virtual;
int client;
int port;
int this_port;
int in_sysex;
snd_midi_event_t *parser;
- int error; /* host error code */
-} alsa_descriptor_node, *alsa_descriptor_type;
+} alsa_info_node, *alsa_info_type;
/* get_alsa_error_text -- copy error text to potentially short string */
@@ -69,36 +67,45 @@ typedef struct alsa_descriptor_struct {
static void get_alsa_error_text(char *msg, int len, int err)
{
int errlen = strlen(snd_strerror(err));
- if (errlen < len) {
+ if (errlen > 0 && errlen < len) {
strcpy(msg, snd_strerror(err));
} else if (len > 20) {
sprintf(msg, "Alsa error %d", err);
- } else if (len > 4) {
- strcpy(msg, "Alsa");
} else {
msg[0] = 0;
}
}
+static PmError check_hosterror(int err)
+{
+ if (err < 0) {
+ get_alsa_error_text(pm_hosterror_text, PM_HOST_ERROR_MSG_LEN, err);
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ return pmNoError;
+}
+
+
/* queue is shared by both input and output, reference counted */
static PmError alsa_use_queue(void)
{
+ int err = 0;
if (queue_used == 0) {
snd_seq_queue_tempo_t *tempo;
queue = snd_seq_alloc_queue(seq);
if (queue < 0) {
- pm_hosterror = queue;
- return pmHostError;
+ return check_hosterror(queue);
}
snd_seq_queue_tempo_alloca(&tempo);
snd_seq_queue_tempo_set_tempo(tempo, 480000);
snd_seq_queue_tempo_set_ppq(tempo, 480);
- pm_hosterror = snd_seq_set_queue_tempo(seq, queue, tempo);
- if (pm_hosterror < 0)
- return pmHostError;
-
+ err = snd_seq_set_queue_tempo(seq, queue, tempo);
+ if (err < 0) {
+ return check_hosterror(err);
+ }
snd_seq_start_queue(seq, queue, NULL);
snd_seq_drain_output(seq);
}
@@ -135,77 +142,87 @@ static int midi_message_length(PmMessage message)
}
-static PmError alsa_out_open(PmInternal *midi, void *driverInfo)
+static alsa_info_type alsa_info_create(int client_port, long id, int is_virtual)
{
- void *client_port = descriptors[midi->device_id].descriptor;
- alsa_descriptor_type desc = (alsa_descriptor_type)
- pm_alloc(sizeof(alsa_descriptor_node));
- snd_seq_port_info_t *info;
- int err;
+ alsa_info_type info = (alsa_info_type) pm_alloc(sizeof(alsa_info_node));
+ info->is_virtual = is_virtual;
+ info->this_port = id;
+ info->client = GET_DESCRIPTOR_CLIENT(client_port);
+ info->port = GET_DESCRIPTOR_PORT(client_port);
+ info->in_sysex = 0;
+ return info;
+}
- if (!desc) return pmInsufficientMemory;
-
- snd_seq_port_info_alloca(&info);
- snd_seq_port_info_set_port(info, midi->device_id);
- snd_seq_port_info_set_capability(info, SND_SEQ_PORT_CAP_WRITE |
- SND_SEQ_PORT_CAP_READ);
- snd_seq_port_info_set_type(info, SND_SEQ_PORT_TYPE_MIDI_GENERIC |
- SND_SEQ_PORT_TYPE_APPLICATION);
- snd_seq_port_info_set_port_specified(info, 1);
- err = snd_seq_create_port(seq, info);
- if (err < 0) goto free_desc;
- /* fill in fields of desc, which is passed to pm_write routines */
- midi->descriptor = desc;
- desc->client = GET_DESCRIPTOR_CLIENT(client_port);
- desc->port = GET_DESCRIPTOR_PORT(client_port);
- desc->this_port = midi->device_id;
- desc->in_sysex = 0;
-
- desc->error = 0;
+static PmError alsa_out_open(PmInternal *midi, void *driverInfo)
+{
+ int id = midi->device_id;
+ void *client_port = pm_descriptors[id].descriptor;
+ alsa_info_type ainfo = alsa_info_create((long) client_port, id,
+ pm_descriptors[id].pub.is_virtual);
+ snd_seq_port_info_t *pinfo;
+ int err = 0;
+ int queue_used = 0;
- err = snd_midi_event_new(PM_DEFAULT_SYSEX_BUFFER_SIZE, &desc->parser);
+ if (!ainfo) return pmInsufficientMemory;
+ midi->api_info = ainfo;
+
+ if (!ainfo->is_virtual) {
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_port(pinfo, id);
+ snd_seq_port_info_set_capability(pinfo, SND_SEQ_PORT_CAP_WRITE |
+ SND_SEQ_PORT_CAP_READ);
+ snd_seq_port_info_set_type(pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC |
+ SND_SEQ_PORT_TYPE_APPLICATION);
+ snd_seq_port_info_set_port_specified(pinfo, 1);
+ err = snd_seq_create_port(seq, pinfo);
+ if (err < 0) goto free_ainfo;
+ }
+
+ err = snd_midi_event_new(PM_DEFAULT_SYSEX_BUFFER_SIZE, &ainfo->parser);
if (err < 0) goto free_this_port;
if (midi->latency > 0) { /* must delay output using a queue */
err = alsa_use_queue();
if (err < 0) goto free_parser;
+ queue_used++;
+ }
- err = snd_seq_connect_to(seq, desc->this_port, desc->client, desc->port);
+ if (!ainfo->is_virtual) {
+ err = snd_seq_connect_to(seq, ainfo->this_port, ainfo->client,
+ ainfo->port);
if (err < 0) goto unuse_queue; /* clean up and return on error */
- } else {
- err = snd_seq_connect_to(seq, desc->this_port, desc->client, desc->port);
- if (err < 0) goto free_parser; /* clean up and return on error */
- }
+ }
return pmNoError;
unuse_queue:
- alsa_unuse_queue();
+ if (queue_used > 0) /* only for latency>0 case */
+ alsa_unuse_queue();
free_parser:
- snd_midi_event_free(desc->parser);
+ snd_midi_event_free(ainfo->parser);
free_this_port:
- snd_seq_delete_port(seq, desc->this_port);
- free_desc:
- pm_free(desc);
- pm_hosterror = err;
- if (err < 0) {
- get_alsa_error_text(pm_hosterror_text, PM_HOST_ERROR_MSG_LEN, err);
- }
- return pmHostError;
+ snd_seq_delete_port(seq, ainfo->this_port);
+ free_ainfo:
+ pm_free(ainfo);
+ return check_hosterror(err);
}
static PmError alsa_write_byte(PmInternal *midi, unsigned char byte,
- PmTimestamp timestamp)
+ PmTimestamp timestamp)
{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
+ alsa_info_type info = (alsa_info_type) midi->api_info;
snd_seq_event_t ev;
- int err;
+ int err = 0;
snd_seq_ev_clear(&ev);
- if (snd_midi_event_encode_byte(desc->parser, byte, &ev) == 1) {
- snd_seq_ev_set_dest(&ev, desc->client, desc->port);
- snd_seq_ev_set_source(&ev, desc->this_port);
+ if (snd_midi_event_encode_byte(info->parser, byte, &ev) == 1) {
+ if (info->is_virtual) {
+ snd_seq_ev_set_subs(&ev);
+ } else {
+ snd_seq_ev_set_dest(&ev, info->client, info->port);
+ }
+ snd_seq_ev_set_source(&ev, info->this_port);
if (midi->latency > 0) {
/* compute relative time of event = timestamp - now + latency */
PmTimestamp now = (midi->time_proc ?
@@ -235,126 +252,165 @@ static PmError alsa_write_byte(PmInternal *midi, unsigned char byte,
ev.dest.client = SND_SEQ_ADDRESS_SUBSCRIBERS; */
snd_seq_ev_set_direct(&ev);
}
- VERBOSE printf("sending event\n");
+ VERBOSE printf("sending event, timestamp %d (%d+%dns) (%s, %s)\n",
+ ev.time.tick, ev.time.time.tv_sec, ev.time.time.tv_nsec,
+ (ev.flags & SND_SEQ_TIME_STAMP_MASK ? "real" : "tick"),
+ (ev.flags & SND_SEQ_TIME_MODE_MASK ? "rel" : "abs"));
err = snd_seq_event_output(seq, &ev);
- if (err < 0) {
- desc->error = err;
- return pmHostError;
- }
}
- return pmNoError;
+ return check_hosterror(err);
}
static PmError alsa_out_close(PmInternal *midi)
{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
- if (!desc) return pmBadPtr;
-
- if ((pm_hosterror = snd_seq_disconnect_to(seq, desc->this_port,
- desc->client, desc->port))) {
- // if there's an error, try to delete the port anyway, but don't
- // change the pm_hosterror value so we retain the first error
- snd_seq_delete_port(seq, desc->this_port);
- } else { // if there's no error, delete the port and retain any error
- pm_hosterror = snd_seq_delete_port(seq, desc->this_port);
+ alsa_info_type info = (alsa_info_type) midi->api_info;
+ int err = 0;
+ int error2 = 0;
+ if (!info) return pmBadPtr;
+
+ if (info->this_port != PORT_IS_CLOSED) {
+ if (!info->is_virtual) {
+ err = snd_seq_disconnect_to(seq, info->this_port,
+ info->client, info->port);
+ /* even if there was an error, we still try to delete the port */
+ error2 = snd_seq_delete_port(seq, info->this_port);
+
+ if (!err) { /* retain original error if there was one */
+ err = error2; /* otherwise, use port delete status */
+ }
+ }
}
if (midi->latency > 0) alsa_unuse_queue();
- snd_midi_event_free(desc->parser);
- midi->descriptor = NULL; /* destroy the pointer to signify "closed" */
- pm_free(desc);
- if (pm_hosterror) {
- get_alsa_error_text(pm_hosterror_text, PM_HOST_ERROR_MSG_LEN,
- pm_hosterror);
- return pmHostError;
+ snd_midi_event_free(info->parser);
+ midi->api_info = NULL; /* destroy the pointer to signify "closed" */
+ pm_free(info);
+ return check_hosterror(err);
+}
+
+
+static PmError alsa_create_virtual(int is_input, const char *name,
+ void *device_info)
+{
+ snd_seq_port_info_t *pinfo;
+ int err;
+ int client, port;
+
+ /* we need the id to set the port. */
+ PmDeviceID id = pm_add_device("ALSA", name, is_input, TRUE, NULL,
+ (is_input ? &pm_linuxalsa_in_dictionary :
+ &pm_linuxalsa_out_dictionary));
+ if (id < 0) { /* error -- out of memory? */
+ return id;
}
- return pmNoError;
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_capability(pinfo,
+ (is_input ? SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE :
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ));
+ snd_seq_port_info_set_type(pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC |
+ SND_SEQ_PORT_TYPE_APPLICATION);
+ snd_seq_port_info_set_name(pinfo, name);
+ snd_seq_port_info_set_port(pinfo, id);
+ snd_seq_port_info_set_port_specified(pinfo, 1);
+ /* next 3 lines needed to generate timestamp - PaulLiu */
+ snd_seq_port_info_set_timestamping(pinfo, 1);
+ snd_seq_port_info_set_timestamp_real(pinfo, 0);
+ snd_seq_port_info_set_timestamp_queue(pinfo, queue);
+ err = snd_seq_create_port(seq, pinfo);
+ if (err < 0) {
+ pm_undo_add_device(id);
+ return check_hosterror(err);
+ }
+ client = snd_seq_port_info_get_client(pinfo);
+ port = snd_seq_port_info_get_port(pinfo);
+ pm_descriptors[id].descriptor = MAKE_DESCRIPTOR(client, port);
+ return id;
}
+ static PmError alsa_delete_virtual(PmDeviceID id)
+ {
+ int err = snd_seq_delete_port(seq, id);
+ return check_hosterror(err);
+ }
+
+
static PmError alsa_in_open(PmInternal *midi, void *driverInfo)
{
- void *client_port = descriptors[midi->device_id].descriptor;
- alsa_descriptor_type desc = (alsa_descriptor_type)
- pm_alloc(sizeof(alsa_descriptor_node));
- snd_seq_port_info_t *info;
+ int id = midi->device_id;
+ void *client_port = pm_descriptors[id].descriptor;
+ alsa_info_type ainfo = alsa_info_create((long) client_port, id,
+ pm_descriptors[id].pub.is_virtual);
+ snd_seq_port_info_t *pinfo;
snd_seq_port_subscribe_t *sub;
snd_seq_addr_t addr;
- int err;
-
- if (!desc) return pmInsufficientMemory;
+ int err = 0;
+ int is_virtual = pm_descriptors[id].pub.is_virtual;
+ if (!ainfo) return pmInsufficientMemory;
+ midi->api_info = ainfo;
+
err = alsa_use_queue();
- if (err < 0) goto free_desc;
+ if (err < 0) goto free_ainfo;
- snd_seq_port_info_alloca(&info);
- snd_seq_port_info_set_port(info, midi->device_id);
- snd_seq_port_info_set_capability(info, SND_SEQ_PORT_CAP_WRITE |
- SND_SEQ_PORT_CAP_READ);
- snd_seq_port_info_set_type(info, SND_SEQ_PORT_TYPE_MIDI_GENERIC |
- SND_SEQ_PORT_TYPE_APPLICATION);
- snd_seq_port_info_set_port_specified(info, 1);
- err = snd_seq_create_port(seq, info);
- if (err < 0) goto free_queue;
-
- /* fill in fields of desc, which is passed to pm_write routines */
- midi->descriptor = desc;
- desc->client = GET_DESCRIPTOR_CLIENT(client_port);
- desc->port = GET_DESCRIPTOR_PORT(client_port);
- desc->this_port = midi->device_id;
- desc->in_sysex = 0;
-
- desc->error = 0;
-
- VERBOSE printf("snd_seq_connect_from: %d %d %d\n",
- desc->this_port, desc->client, desc->port);
- snd_seq_port_subscribe_alloca(&sub);
- addr.client = snd_seq_client_id(seq);
- addr.port = desc->this_port;
- snd_seq_port_subscribe_set_dest(sub, &addr);
- addr.client = desc->client;
- addr.port = desc->port;
- snd_seq_port_subscribe_set_sender(sub, &addr);
- snd_seq_port_subscribe_set_time_update(sub, 1);
- /* this doesn't seem to work: messages come in with real timestamps */
- snd_seq_port_subscribe_set_time_real(sub, 0);
- err = snd_seq_subscribe_port(seq, sub);
- /* err =
- snd_seq_connect_from(seq, desc->this_port, desc->client, desc->port); */
- if (err < 0) goto free_this_port; /* clean up and return on error */
+ if (is_virtual) {
+ ainfo->is_virtual = TRUE;
+ } else {
+ /* create a port for this alsa client (seq) where the port
+ number matches the portmidi device ID of the input device */
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_port(pinfo, id);
+ snd_seq_port_info_set_capability(pinfo, SND_SEQ_PORT_CAP_WRITE |
+ SND_SEQ_PORT_CAP_READ);
+ snd_seq_port_info_set_type(pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC |
+ SND_SEQ_PORT_TYPE_APPLICATION);
+ snd_seq_port_info_set_port_specified(pinfo, 1);
+ err = snd_seq_create_port(seq, pinfo);
+ if (err < 0) goto free_queue;
+
+ /* forward messages from input to this alsa client, so this
+ * alsa client is the destination, and the destination port is the
+ * port we just created using the device ID as port number
+ */
+ snd_seq_port_subscribe_alloca(&sub);
+ addr.client = snd_seq_client_id(seq);
+ addr.port = ainfo->this_port;
+ snd_seq_port_subscribe_set_dest(sub, &addr);
+
+ /* forward from the sender which is the device named by
+ client and port */
+ addr.client = ainfo->client;
+ addr.port = ainfo->port;
+ snd_seq_port_subscribe_set_sender(sub, &addr);
+ snd_seq_port_subscribe_set_time_update(sub, 1);
+ /* this doesn't seem to work: messages come in with real timestamps */
+ snd_seq_port_subscribe_set_time_real(sub, 0);
+ err = snd_seq_subscribe_port(seq, sub);
+ if (err < 0) goto free_this_port; /* clean up and return on error */
+ }
return pmNoError;
-
free_this_port:
- snd_seq_delete_port(seq, desc->this_port);
+ snd_seq_delete_port(seq, ainfo->this_port);
free_queue:
alsa_unuse_queue();
- free_desc:
- pm_free(desc);
- pm_hosterror = err;
- if (err < 0) {
- get_alsa_error_text(pm_hosterror_text, PM_HOST_ERROR_MSG_LEN, err);
- }
- return pmHostError;
+ free_ainfo:
+ pm_free(ainfo);
+ return check_hosterror(err);
}
static PmError alsa_in_close(PmInternal *midi)
{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
- if (!desc) return pmBadPtr;
- if ((pm_hosterror = snd_seq_disconnect_from(seq, desc->this_port,
- desc->client, desc->port))) {
- snd_seq_delete_port(seq, desc->this_port); /* try to close port */
- } else {
- pm_hosterror = snd_seq_delete_port(seq, desc->this_port);
+ int err = 0;
+ alsa_info_type info = (alsa_info_type) midi->api_info;
+ if (!info) return pmBadPtr;
+ /* virtual ports stay open because the represent devices */
+ if (!info->is_virtual && info->this_port != PORT_IS_CLOSED) {
+ err = snd_seq_delete_port(seq, info->this_port);
}
alsa_unuse_queue();
- pm_free(desc);
- if (pm_hosterror) {
- get_alsa_error_text(pm_hosterror_text, PM_HOST_ERROR_MSG_LEN,
- pm_hosterror);
- return pmHostError;
- }
- return pmNoError;
+ midi->api_info = NULL;
+ pm_free(info);
+ return check_hosterror(err);
}
@@ -370,11 +426,11 @@ static PmError alsa_abort(PmInternal *midi)
* upgrade my entire Linux OS -RBD
*/
/*
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
+ info_type info = (info_type) midi->api_info;
snd_seq_remove_events_t info;
snd_seq_addr_t addr;
- addr.client = desc->client;
- addr.port = desc->port;
+ addr.client = info->client;
+ addr.port = info->port;
snd_seq_remove_events_set_dest(&info, &addr);
snd_seq_remove_events_set_condition(&info, SND_SEQ_REMOVE_DEST);
pm_hosterror = snd_seq_remove_events(seq, &info);
@@ -389,65 +445,14 @@ static PmError alsa_abort(PmInternal *midi)
}
-#ifdef GARBAGE
-This is old code here temporarily for reference
-static PmError alsa_write(PmInternal *midi, PmEvent *buffer, int32_t length)
-{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
- int i, bytes;
- unsigned char byte;
- PmMessage msg;
-
- desc->error = 0;
- for (; length > 0; length--, buffer++) {
- VERBOSE printf("message 0x%x\n", buffer->message);
- if (Pm_MessageStatus(buffer->message) == MIDI_SYSEX)
- desc->in_sysex = TRUE;
- if (desc->in_sysex) {
- msg = buffer->message;
- for (i = 0; i < 4; i++) {
- byte = msg; /* extract next byte to send */
- alsa_write_byte(midi, byte, buffer->timestamp);
- if (byte == MIDI_EOX) {
- desc->in_sysex = FALSE;
- break;
- }
- if (desc->error < 0) break;
- msg >>= 8; /* shift next byte into position */
- }
- } else {
- bytes = midi_message_length(buffer->message);
- msg = buffer->message;
- for (i = 0; i < bytes; i++) {
- byte = msg; /* extract next byte to send */
- VERBOSE printf("sending 0x%x\n", byte);
- alsa_write_byte(midi, byte, buffer->timestamp);
- if (desc->error < 0) break;
- msg >>= 8; /* shift next byte into position */
- }
- }
- }
- if (desc->error < 0) return pmHostError;
-
- VERBOSE printf("snd_seq_drain_output: 0x%x\n", (unsigned int) seq);
- desc->error = snd_seq_drain_output(seq);
- if (desc->error < 0) return pmHostError;
-
- desc->error = pmNoError;
- return pmNoError;
-}
-#endif
-
-
static PmError alsa_write_flush(PmInternal *midi, PmTimestamp timestamp)
{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
- VERBOSE printf("snd_seq_drain_output: 0x%x\n", (unsigned int)(FPTR) seq);
- desc->error = snd_seq_drain_output(seq);
- if (desc->error < 0) return pmHostError;
-
- desc->error = pmNoError;
- return pmNoError;
+ int err;
+ alsa_info_type info = (alsa_info_type) midi->api_info;
+ if (!info) return pmBadPtr;
+ VERBOSE printf("snd_seq_drain_output: %p\n", seq);
+ err = snd_seq_drain_output(seq);
+ return check_hosterror(err);
}
@@ -456,16 +461,16 @@ static PmError alsa_write_short(PmInternal *midi, PmEvent *event)
int bytes = midi_message_length(event->message);
PmMessage msg = event->message;
int i;
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
+ alsa_info_type info = (alsa_info_type) midi->api_info;
+ if (!info) return pmBadPtr;
for (i = 0; i < bytes; i++) {
unsigned char byte = msg;
VERBOSE printf("sending 0x%x\n", byte);
alsa_write_byte(midi, byte, event->timestamp);
- if (desc->error < 0) break;
+ if (pm_hosterror) break;
msg >>= 8; /* shift next byte into position */
}
- if (desc->error < 0) return pmHostError;
- desc->error = pmNoError;
+ if (pm_hosterror) return pmHostError;
return pmNoError;
}
@@ -489,25 +494,50 @@ static PmTimestamp alsa_synchronize(PmInternal *midi)
static void handle_event(snd_seq_event_t *ev)
{
int device_id = ev->dest.port;
- PmInternal *midi = descriptors[device_id].internalDescriptor;
+ PmInternal *midi = pm_descriptors[device_id].pm_internal;
+ // There is a race condition when closing a device and
+ // continuing to poll other open devices. The closed device may
+ // have outstanding events from before the close operation.
+ if (!midi) {
+ return;
+ }
PmEvent pm_ev;
- PmTimeProcPtr time_proc = midi->time_proc;
- PmTimestamp timestamp;
+ PmTimestamp timestamp = midi->time_proc(midi->time_info);
/* time stamp should be in ticks, using our queue where 1 tick = 1ms */
- assert((ev->flags & SND_SEQ_TIME_STAMP_MASK) == SND_SEQ_TIME_STAMP_TICK);
+ /* assert((ev->flags & SND_SEQ_TIME_STAMP_MASK) == SND_SEQ_TIME_STAMP_TICK);
+ * Currently, event timestamp is ignored. See long note below. */
- /* if no time_proc, just return "native" ticks (ms) */
- if (time_proc == NULL) {
- timestamp = ev->time.tick;
- } else { /* translate time to time_proc basis */
+ VERBOSE {
+ /* translate time to time_proc basis */
snd_seq_queue_status_t *queue_status;
snd_seq_queue_status_alloca(&queue_status);
snd_seq_get_queue_status(seq, queue, queue_status);
- /* return (now - alsa_now) + alsa_timestamp */
- timestamp = (*time_proc)(midi->time_info) + ev->time.tick -
- snd_seq_queue_status_get_tick_time(queue_status);
+ printf("handle_event: alsa_now %d, "
+ "event timestamp %d (%d+%dns) (%s, %s)\n",
+ snd_seq_queue_status_get_tick_time(queue_status),
+ ev->time.tick, ev->time.time.tv_sec, ev->time.time.tv_nsec,
+ (ev->flags & SND_SEQ_TIME_STAMP_MASK ? "real" : "tick"),
+ (ev->flags & SND_SEQ_TIME_MODE_MASK ? "rel" : "abs"));
+ /* OLD: portmidi timestamp is (now - alsa_now) + alsa_timestamp */
+ /* timestamp = (*time_proc)(midi->time_info) + ev->time.tick -
+ snd_seq_queue_status_get_tick_time(queue_status); */
}
+ /* CURRENT: portmidi timestamp is "now". In a test, timestamps from
+ * hardware (MIDI over USB) were timestamped with the current ALSA
+ * time (snd_seq_queue_status_get_tick_time) and flags indicating
+ * absolute ticks, but timestamps from another application's virtual
+ * port, sent direct with 0 absolute ticks, were received with a
+ * large value that is apparently the time since the start time of
+ * the other application. Without any reference to our local time,
+ * this seems useless. PortMidi is supposed to return the local
+ * PortMidi time of the arrival of the message, so the best we can
+ * do is set the timestamp to our local clock. This seems to be a
+ * design flaw in ALSA -- I pointed this out a decade ago, but if
+ * there is a workaround, I'd still like to know. Maybe there is a
+ * way to use absolute real time and maybe that's sharable across
+ * applications by referencing the system time?
+ */
pm_ev.timestamp = timestamp;
switch (ev->type) {
case SND_SEQ_EVENT_NOTEON:
@@ -618,12 +648,31 @@ static void handle_event(snd_seq_event_t *ev)
pm_read_bytes(midi, ptr, ev->data.ext.len, timestamp);
break;
}
+ case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: {
+ /* this happens if you have an input port open and the
+ * device or application with virtual ports closes. We
+ * mark the port as closed to avoid closing a 2nd time
+ * when Pm_Close() is called.
+ */
+ alsa_info_type info = (alsa_info_type) midi->api_info;
+ /* printf("SND_SEQ_EVENT_UNSUBSCRIBE message\n"); */
+ info->this_port = PORT_IS_CLOSED;
+ break;
+ }
+ case SND_SEQ_EVENT_PORT_SUBSCRIBED:
+ break; /* someone connected to a virtual output port, not reported */
+ default:
+ printf("portmidi handle_event: not handled type %x\n", ev->type);
+ break;
}
}
static PmError alsa_poll(PmInternal *midi)
{
+ if (!midi) {
+ return pmBadPtr;
+ }
snd_seq_event_t *ev;
/* expensive check for input data, gets data from device: */
while (snd_seq_event_input_pending(seq, TRUE) > 0) {
@@ -641,10 +690,9 @@ static PmError alsa_poll(PmInternal *midi)
handle_event(ev);
} else if (rslt == -ENOSPC) {
int i;
- for (i = 0; i < pm_descriptor_index; i++) {
- if (descriptors[i].pub.input) {
- PmInternal *midi = (PmInternal *)
- descriptors[i].internalDescriptor;
+ for (i = 0; i < pm_descriptor_len; i++) {
+ if (pm_descriptors[i].pub.input) {
+ PmInternal *midi = pm_descriptors[i].pm_internal;
/* careful, device may not be open! */
if (midi) Pm_SetOverflow(midi->queue);
}
@@ -656,18 +704,9 @@ static PmError alsa_poll(PmInternal *midi)
}
-static unsigned int alsa_has_host_error(PmInternal *midi)
-{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
- return desc->error;
-}
-
-
-static void alsa_get_host_error(PmInternal *midi, char *msg, unsigned int len)
+static unsigned int alsa_check_host_error(PmInternal *midi)
{
- alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor;
- int err = (pm_hosterror || desc->error);
- get_alsa_error_text(msg, len, err);
+ return FALSE;
}
@@ -683,8 +722,7 @@ pm_fns_node pm_linuxalsa_in_dictionary = {
alsa_abort,
alsa_in_close,
alsa_poll,
- alsa_has_host_error,
- alsa_get_host_error
+ alsa_check_host_error
};
pm_fns_node pm_linuxalsa_out_dictionary = {
@@ -699,8 +737,7 @@ pm_fns_node pm_linuxalsa_out_dictionary = {
alsa_abort,
alsa_out_close,
none_poll,
- alsa_has_host_error,
- alsa_get_host_error
+ alsa_check_host_error
};
@@ -718,13 +755,16 @@ char *pm_strdup(const char *s)
}
-PmError pm_linuxalsa_init( void )
+PmError pm_linuxalsa_init(void)
{
int err;
snd_seq_client_info_t *cinfo;
snd_seq_port_info_t *pinfo;
unsigned int caps;
+ /* Register interface ALSA with create_virtual fn */
+ pm_add_interf("ALSA", &alsa_create_virtual, &alsa_delete_virtual);
+
/* Previously, the last parameter was SND_SEQ_NONBLOCK, but this
* would cause messages to be dropped if the ALSA buffer fills up.
* The correct behavior is for writes to block until there is
@@ -735,56 +775,61 @@ PmError pm_linuxalsa_init( void )
* call seq_event_input_pending() to avoid blocking.
*/
err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0);
- if (err < 0) return err;
+ if (err < 0) goto error_return;
snd_seq_client_info_alloca(&cinfo);
snd_seq_port_info_alloca(&pinfo);
snd_seq_client_info_set_client(cinfo, -1);
while (snd_seq_query_next_client(seq, cinfo) == 0) {
- snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+ snd_seq_port_info_set_client(pinfo,
+ snd_seq_client_info_get_client(cinfo));
snd_seq_port_info_set_port(pinfo, -1);
while (snd_seq_query_next_port(seq, pinfo) == 0) {
if (snd_seq_port_info_get_client(pinfo) == SND_SEQ_CLIENT_SYSTEM)
continue; /* ignore Timer and Announce ports on client 0 */
caps = snd_seq_port_info_get_capability(pinfo);
- if (!(caps & (SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_SUBS_WRITE)))
+ if (!(caps & (SND_SEQ_PORT_CAP_SUBS_READ |
+ SND_SEQ_PORT_CAP_SUBS_WRITE)))
continue; /* ignore if you cannot read or write port */
if (caps & SND_SEQ_PORT_CAP_SUBS_WRITE) {
if (pm_default_output_device_id == -1)
- pm_default_output_device_id = pm_descriptor_index;
- // FIXME: pm_strdup() result is leaked
- pm_add_device((char *)"ALSA",
- pm_strdup(snd_seq_port_info_get_name(pinfo)),
- FALSE,
- MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
- snd_seq_port_info_get_port(pinfo)),
- &pm_linuxalsa_out_dictionary);
+ pm_default_output_device_id = pm_descriptor_len;
+ pm_add_device("ALSA",
+ pm_strdup(snd_seq_port_info_get_name(pinfo)),
+ FALSE, FALSE,
+ MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
+ snd_seq_port_info_get_port(pinfo)),
+ &pm_linuxalsa_out_dictionary);
}
if (caps & SND_SEQ_PORT_CAP_SUBS_READ) {
if (pm_default_input_device_id == -1)
- pm_default_input_device_id = pm_descriptor_index;
- // FIXME: pm_strdup() result is leaked
- pm_add_device((char *)"ALSA",
- pm_strdup(snd_seq_port_info_get_name(pinfo)),
- TRUE,
- MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
- snd_seq_port_info_get_port(pinfo)),
- &pm_linuxalsa_in_dictionary);
+ pm_default_input_device_id = pm_descriptor_len;
+ pm_add_device("ALSA",
+ pm_strdup(snd_seq_port_info_get_name(pinfo)),
+ TRUE, FALSE,
+ MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
+ snd_seq_port_info_get_port(pinfo)),
+ &pm_linuxalsa_in_dictionary);
}
}
}
return pmNoError;
+ error_return:
+ pm_linuxalsa_term(); /* clean up */
+ return check_hosterror(err);
}
-
+
void pm_linuxalsa_term(void)
{
if (seq) {
snd_seq_close(seq);
- pm_free(descriptors);
- descriptors = NULL;
- pm_descriptor_index = 0;
+ pm_free(pm_descriptors);
+ pm_descriptors = NULL;
+ pm_descriptor_len = 0;
pm_descriptor_max = 0;
}
}
+
+#endif
diff --git a/3rdparty/portmidi/pm_linux/pmlinuxnull.c b/3rdparty/portmidi/pm_linux/pmlinuxnull.c
new file mode 100644
index 00000000000..841440917ad
--- /dev/null
+++ b/3rdparty/portmidi/pm_linux/pmlinuxnull.c
@@ -0,0 +1,31 @@
+/*
+ * pmlinuxnull.c -- system specific definitions
+ *
+ * written by:
+ * Roger Dannenberg
+ *
+ * If there is no ALSA, you can define PMNULL and build PortMidi. It will
+ * not report any devices, so you will not be able to open any, but if
+ * you wanted to disable MIDI from some application, this could be used.
+ * Mainly, this code shows the possibility of supporting multiple
+ * interfaces, e.g., ALSA and Sndio on BSD, or ALSA and Jack on Linux.
+ * But as of Dec, 2021, the only supported MIDI API for Linux is ALSA.
+ */
+
+#ifdef PMNULL
+
+#include "portmidi.h"
+#include "pmlinuxnull.h"
+
+
+PmError pm_linuxnull_init(void)
+{
+ return pmNoError;
+}
+
+
+void pm_linuxnull_term(void)
+{
+}
+
+#endif
diff --git a/3rdparty/portmidi/pm_linux/pmlinuxnull.h b/3rdparty/portmidi/pm_linux/pmlinuxnull.h
new file mode 100644
index 00000000000..52607eb01bf
--- /dev/null
+++ b/3rdparty/portmidi/pm_linux/pmlinuxnull.h
@@ -0,0 +1,6 @@
+/* pmlinuxnull.h -- system-specific definitions */
+
+PmError pm_linuxnull_init(void);
+void pm_linuxnull_term(void);
+
+
diff --git a/3rdparty/portmidi/pm_mac/Makefile.osx b/3rdparty/portmidi/pm_mac/Makefile.osx
index 8c6862e28f0..e34e33a92ff 100644
--- a/3rdparty/portmidi/pm_mac/Makefile.osx
+++ b/3rdparty/portmidi/pm_mac/Makefile.osx
@@ -4,7 +4,7 @@
# Sep 2009
# NOTE: you can use
-# make -f pm_osx/Makefile.osx configuration=Release
+# make -f pm_mac/Makefile.osx configuration=Release
# to override the default Debug configuration
configuration=Release
@@ -23,12 +23,12 @@ all: $(CONFIG)/CMakeCache.txt
cd $(CONFIG); make
$(CONFIG)/CMakeCache.txt:
- rm -f CMakeCache.txt
+ rm -f $(CONFIG)/CMakeCache.txt
mkdir -p $(CONFIG)
cd $(CONFIG); cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=$(CONFIG)
-**** For instructions: make -f pm_mac\Makefile.osx help ****\n'
+**** For instructions: make -f pm_mac/Makefile.osx help ****\n'
help:
echo $$'\n\n\
@@ -63,6 +63,8 @@ cleaner: clean
rm -f pm_java/pmjni/Release/*.jnilib
cleanest: cleaner
+ rm -f Debug/CMakeCache.txt Release/CMakeCache.txt
+ rm -f CMakeCache.txt
rm -f Debug/libportmidi_s.a Release/libportmidi_s.a
rm -f pm_test/Debug/test pm_test/Debug/sysex pm_test/Debug/midithread
rm -f pm_test/Debug/latency pm_test/Debug/midithru
diff --git a/3rdparty/portmidi/pm_mac/README_MAC.txt b/3rdparty/portmidi/pm_mac/README_MAC.txt
index 1650dccecce..12cc40bbc17 100644
--- a/3rdparty/portmidi/pm_mac/README_MAC.txt
+++ b/3rdparty/portmidi/pm_mac/README_MAC.txt
@@ -1,163 +1,76 @@
README_MAC.txt for PortMidi
Roger Dannenberg
20 nov 2009
-revised 20 Sep 2010 for Xcode 3.2.4 and CMake 8.2-2
+revised 20 Sep 2010 for Xcode 4.3.2 and CMake 2.8.8
+revised Jan 2022 for the PortMidi/portmidi repo on github.com
+
+This documents how I build PortMidi for macOS. It's not the only way,
+and command-line/scripting enthusiasts will say it's not even a good
+way. Feel free to contribute your approach if you are willing to
+describe it carefully and test it.
+
+Install Xcode and the CMake application, CMake.app. I use the GUI
+version of CMake which makes it easy to see/edit variables and
+options.
+
+==== USING CMAKE ====
+
+Run CMake.app and select your portmidi repo working directory as the
+location for source and build. (Yes, I use so called "in-tree"
+builds -- it doesn't hurt, but I don't think it is necessary.)
+
+Default settings should all be fine, but select options under BUILD if
+you wish:
+
+BUILD_NATIVE_JAVA_INTERFACE and BUILD_PMDEFAULTS to build a Java-based
+GUI for setting default MIDI devices. (Otherwise, calls to
+Pm_DefaultInputDevice() and Pm_DefaultOutputDevice() will not be
+useful, but maybe you are not going to use these anyway -- up to you.)
+
+BUILD_PORTMIDI_TESTS to create some test programs. Of particular
+interest are test/mm, a handy command-line MIDI Input Monitor, and
+test/testio, a simple command-line program to send or receive some
+MIDI notes in case you need a quick test: What devices do I have? Does
+this input work? Does this output work?
+
+I disable BUILD_SHARED_LIBS and always link statically: Static linking only
+adds about 40KB to any application and then you don't have to worry
+about versions, instally, copying or finding the dynamic link library,
+etc.
+
+To make sure you link statically, I rename the library to
+libportmidi_static.a. To do this, set PM_STATIC_LIB_NAME (in CMake,
+under the "PM" group) to "portmidi_static", and of course your
+application will have to specify portmidi_static as the library to
+link to.
+
+If you are building simple command-line applications, you might want
+to enable PM_CHECK_ERRORS. If you do, then calls into the PortMidi
+library will print error messages and exit in the event of an error
+(such as trying to open a device that does not exist). This saves you
+from having to check for errors everytime you call a library function
+or getting confused when errors are detected but not reported. For
+high-quality applications, do NOT enable PM_CHECK_ERRORS -- any
+failure could immediately abort your whole application, which is not
+very friendly to users.
+
+Click on Configure (maybe a couple of times).
+
+Click on Generate and make an Xcode project.
+
+Open portmidi/portmidi.xcodeproj with Xcode and build what you
+need. The simplest thing is to build the ALL_BUILD target. Be careful
+to specify a Debug or Release depending on what you want. "ALL_BUILD"
+is a misnomer -- it only builds the version you select.
+
+PmDefaults is minimally supported and may be removed in 2023 unless we
+hear from users. To run it,
+(1) make sure java runs from the command line.
+(2) run the following command in an open Terminal:
+ cd portmidi/pm_java/pmdefaults
+ ./pmdefaults
+
+Feel free to write a short script that cd's to your pmdefaults
+directory and runs pmdefaults, and put that script somewhere on your
+path so you can type it anywhere.
-To build PortMidi for Mac OS X, you must install Xcode and
-CMake.
-
-CMake can build either command-line Makefiles or Xcode projects.
-These approaches are described in separate sections below.
-
-==== CLEANING UP ====
-(Skip this for now, but later you might want start from a clean
-slate.)
-
-Start in the portmedia/portmidi directory.
-
-make -f pm_mac/Makefile.osx clean
-
-will remove .o, CMakeFiles, and other intermediate files.
-
-Using "cleaner" instead of "clean" will also remove jni-related
-intermediate files.
-
-Using "cleanest" instead of "clean" or "cleaner" will also remove
-application binaries and the portmidi libraries. (It will not
-uninstall anything, however.)
-
-==== USING CMAKE (AND COMMAND LINE TOOLS) ====
-
-Start in the portmedia/portmidi directory.
-
-make -f pm_mac/Makefile.osx
-
-(Begin note: make will invoke cmake to build a Makefile and then make to
-build portmidi. This extra level allows you to correctly build
-both Release and Debug versions. Release is the default, so to get
-the Debug version, use:
-
-make -f pm_mac/Makefile.osx configuration=Debug
-)
-
-Release version executables and libraries are now in
- portmedia/portmidi/Release
-
-Debug version executables and libraries are created in
- portmedia/portmidi/Debug
-The Debug versions are compiled with PM_CHECK_ERRORS which
-prints an error message and aborts when an error code is returned
-by PortMidi functions. This is useful for small command line
-applications. Otherwise, you should check and handle error returns
-in your program.
-
-You can install portmidi as follows:
-
-cd Release; sudo make install
-
-This will install /usr/local/include/{portmidi.h, porttime.h}
-and /usr/local/lib/{libportmidi.dylib, libportmidi_s.a, libpmjni.dylib}
-
-You should now make the pmdefaults.app:
-
-make -f pm_mac/Makefile.osx pmdefaults
-
-NOTE: pmdefaults.app will be in pm_mac/Release/.
-
-Please copy pmdefaults.app to your Applications folder or wherever
-you would normally expect to find it.
-
-==== USING CMAKE TO BUILD Xcode PROJECT ====
-
-Before you can use Xcode, you need a portmidi.xcodeproj file.
-CMake builds a location-dependent Xcode project, so unfortunately
-it is not easy to provide an Xcode project that is ready to use.
-Therefore, you should make your own. Once you have it, you can
-use it almost like any other Xcode project, and you will not have
-to go back to CMake.
-
-(1) Install CMake if you do not have it already.
-
-(2) Open portmedia/portmidi/CMakeLists.txt with CMake
-
-(3) Use Configure and Generate buttons
-
-(4) This creates portmedia/portmidi/portmidi.xcodeproj.
-
-Note: You will also use pm_mac/pm_mac.xcodeproj, which
-is not generated by CMake.
-
-(5) Open portmidi/portmidi.xcodeproj with Xcode and
-build what you need. The simplest thing is to build the
-ALL_BUILD target. The default will be to build the Debug
-version, but you may want to change this to Release.
-
-NOTE: ALL_BUILD may report errors. Try simply building again
-or rebuilding specific targets that fail until they build
-without errors. There appears to be a race condition or
-missing dependencies in the build system.
-
-The Debug version is compiled with PM_CHECK_ERRORS, and the
-Release version is not. PM_CHECK_ERRORS will print an error
-message and exit your program if any error is returned from
-a call into PortMidi.
-
-CMake (currently) also creates MinSizRel and RelWithDebInfo
-versions, but only because I cannot figure out how to disable
-them.
-
-You will probably want the application PmDefaults, which sets
-default MIDI In and Out devices for PortMidi. You may also
-want to build a Java application using PortMidi. Since I have
-not figured out how to use CMake to make an OS X Java application,
-use pm_mac/pm_mac.xcodeproj as follows:
-
-(6) open pm_mac/pm_mac.xcodeproj
-
-(7) pm_java/pmjni/portmidi_JportmidiApi.h is needed
-by libpmjni.jnilib, the Java native interface library. Since
-portmidi_JportmidiApi.h is included with PortMidi, you can skip
-to step 8, but if you really want to rebuild everything from
-scratch, build the JPortMidiHeaders project first, and continue
-with step 8:
-
-(8) If you did not build libpmjni.dylib using portmidi.xcodeproj,
-do it now. (It depends on portmidi_JportmidiApi.h, and the
-PmDefaults project depends on libpmjni.dylib.)
-
-(9) Returning to pm_mac.xcodeproj, build the PmDefaults program.
-
-(10) If you wish, copy pm_mac/build/Deployment/PmDefaults.app to
-your applications folder.
-
-(11) If you want to install libportmidi.dylib, first make it with
-Xcode, then
- sudo make -f pm_mac/Makefile.osx install
-This command will install /usr/local/include/{porttime.h, portmidi.h}
-and /usr/local/lib/libportmidi.dylib
-Note that the "install" function of xcode creates portmidi/Release
-and does not install the library to /usr/local/lib, so please use
-the command line installer.
-
-
-CHANGELOG
-
-20-Sep-2010 Roger B. Dannenberg
- Adapted to Xcode 3.2.4
-20-Nov-2009 Roger B. Dannenberg
- Added some install instructions
-26-Sep-2009 Roger B. Dannenberg
- More changes for using CMake, Makefiles, XCode
-20-Sep-2009 Roger B. Dannenberg
- Modifications for using CMake
-14-Sep-2009 Roger B. Dannenberg
- Modifications for using CMake
-17-Jan-2007 Roger B. Dannenberg
- Explicit instructions for Xcode
-15-Jan-2007 Roger B. Dannenberg
- Changed instructions because of changes to Makefile.osx
-07-Oct-2006 Roger B. Dannenberg
- Added directions for xcodebuild
-29-aug-2006 Roger B. Dannenberg
- Updated this documentation.
-
diff --git a/3rdparty/portmidi/pm_mac/finddefault.c b/3rdparty/portmidi/pm_mac/finddefault.c
index bc95a4001a6..b4556e98d91 100644
--- a/3rdparty/portmidi/pm_mac/finddefault.c
+++ b/3rdparty/portmidi/pm_mac/finddefault.c
@@ -17,14 +17,14 @@
plist files (user and system) open at once (due to a simple
memory management scheme).
*/
-PmDeviceID find_default_device(char *path, int input, PmDeviceID id)
+PmDeviceID find_default_device(const char *path, int input, PmDeviceID id)
/* path -- the name of the preference we are searching for
input -- true iff this is an input device
id -- current default device id
returns matching device id if found, otherwise id
*/
{
- static char *pref_file = (char *)"com.apple.java.util.prefs.plist";
+ static char const *const pref_file = "com.apple.java.util.prefs.plist";
char *pref_str = NULL;
// read device preferences
value_ptr prefs = bplist_read_user_pref(pref_file);
diff --git a/3rdparty/portmidi/pm_mac/osxsupport.h b/3rdparty/portmidi/pm_mac/osxsupport.h
deleted file mode 100644
index 7771868d12a..00000000000
--- a/3rdparty/portmidi/pm_mac/osxsupport.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- osxsupport.h - Cocoa glue to emulated deprecated old Carbon path finder functions
-*/
-
-#ifndef _OSXSUPPORT_H_
-#define _OSXSUPPORT_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-char *FindPrefsDir(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/3rdparty/portmidi/pm_mac/osxsupport.m b/3rdparty/portmidi/pm_mac/osxsupport.m
deleted file mode 100644
index 1cf457f6bdb..00000000000
--- a/3rdparty/portmidi/pm_mac/osxsupport.m
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- osxsupport.m - Cocoa glue to emulated deprecated old Carbon path finder functions
-*/
-
-#import <Cocoa/Cocoa.h>
-#import <AvailabilityMacros.h>
-#include "osxsupport.h"
-
-// convert an NSString to a C string
-#ifndef OSX_PPC
-static char *StringToChar(NSString *str)
-{
- const char *charstr = [str UTF8String];
- char *resstr = (char *)malloc(strlen(charstr)+1);
-
- strcpy(resstr, charstr);
- return resstr;
-}
-
-char *FindPrefsDir(void)
-{
- char *resstr = NULL;
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES);
-
- if ([paths count] > 0)
- {
- resstr = StringToChar([paths objectAtIndex:0]) ;
- }
-
- [pool release];
-
- return resstr;
-}
-#endif
-
diff --git a/3rdparty/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj b/3rdparty/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj
deleted file mode 100644
index 0d06e565eae..00000000000
--- a/3rdparty/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,594 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 44;
- objects = {
-
-/* Begin PBXAggregateTarget section */
- 3D634CAB1247805C0020F829 /* JPortMidiHeaders */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = 3D634CAE1247807A0020F829 /* Build configuration list for PBXAggregateTarget "JPortMidiHeaders" */;
- buildPhases = (
- 3D634CAA1247805C0020F829 /* ShellScript */,
- );
- dependencies = (
- 3D634CB0124781580020F829 /* PBXTargetDependency */,
- );
- name = JPortMidiHeaders;
- productName = JPortMidiHeaders;
- };
- 3DE2142D124662AA0033C839 /* CopyJavaSources */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = 3DE21434124662FF0033C839 /* Build configuration list for PBXAggregateTarget "CopyJavaSources" */;
- buildPhases = (
- 3DE2142C124662AA0033C839 /* CopyFiles */,
- );
- comments = "The reason for copying files here is that the Compile Java target looks in a particular place for sources. It would be much better to simply have Compile Java look in the original location for all sources, but I don't know how to do that. -RBD\n";
- dependencies = (
- );
- name = CopyJavaSources;
- productName = CopyJavaSources;
- };
- 89D0F1C90F3B704E007831A7 /* PmDefaults */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = 89D0F1D20F3B7080007831A7 /* Build configuration list for PBXAggregateTarget "PmDefaults" */;
- buildPhases = (
- );
- dependencies = (
- 89D0F1D10F3B7062007831A7 /* PBXTargetDependency */,
- 89D0F1CD0F3B7062007831A7 /* PBXTargetDependency */,
- 3DE21431124662C50033C839 /* PBXTargetDependency */,
- );
- name = PmDefaults;
- productName = pmdefaults;
- };
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
- 3DE2137F124653FB0033C839 /* portmusic_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE2137E124653FB0033C839 /* portmusic_logo.png */; };
- 3DE21435124663860033C839 /* PmDefaultsFrame.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE2137D124653CB0033C839 /* PmDefaultsFrame.java */; };
- 3DE214361246638A0033C839 /* PmDefaults.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE2137B1246538B0033C839 /* PmDefaults.java */; };
- 3DE214371246638F0033C839 /* JPortMidiException.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE21382124654DE0033C839 /* JPortMidiException.java */; };
- 3DE214381246638F0033C839 /* JPortMidiApi.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE21381124654CF0033C839 /* JPortMidiApi.java */; };
- 3DE214391246638F0033C839 /* JPortMidi.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE21380124654BC0033C839 /* JPortMidi.java */; };
- 3DE216131246AC0E0033C839 /* libpmjni.dylib in Copy Java Resources */ = {isa = PBXBuildFile; fileRef = 3DE216101246ABE30033C839 /* libpmjni.dylib */; };
- 3DE216951246D57A0033C839 /* pmdefaults.icns in Resources */ = {isa = PBXBuildFile; fileRef = 3DE216901246C6410033C839 /* pmdefaults.icns */; };
- 89C3F2920F5250A300B0048E /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 89C3F2900F5250A300B0048E /* Credits.rtf */; };
- 89D0F0240F392F20007831A7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 89D0F0210F392F20007831A7 /* InfoPlist.strings */; };
- 89D0F0410F39306C007831A7 /* JavaApplicationStub in Copy Executable */ = {isa = PBXBuildFile; fileRef = 89D0F03E0F39304A007831A7 /* JavaApplicationStub */; };
- 89D0F16A0F3A124E007831A7 /* pmdefaults.jar in Copy Java Resources */ = {isa = PBXBuildFile; fileRef = 89D0F15D0F3A0FF7007831A7 /* pmdefaults.jar */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 3D634CAF124781580020F829 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D0F1C90F3B704E007831A7;
- remoteInfo = PmDefaults;
- };
- 3DE21430124662C50033C839 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3DE2142D124662AA0033C839;
- remoteInfo = CopyJavaSources;
- };
- 3DE2145D124666900033C839 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3DE2142D124662AA0033C839;
- remoteInfo = CopyJavaSources;
- };
- 89D0F1CC0F3B7062007831A7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 8D1107260486CEB800E47090;
- remoteInfo = "Assemble Application";
- };
- 89D0F1D00F3B7062007831A7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89D0F0480F393A6F007831A7;
- remoteInfo = "Compile Java";
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 3DE2142C124662AA0033C839 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "${PROJECT_DIR}/pmdefaults/src/java";
- dstSubfolderSpec = 0;
- files = (
- 3DE21435124663860033C839 /* PmDefaultsFrame.java in CopyFiles */,
- 3DE214361246638A0033C839 /* PmDefaults.java in CopyFiles */,
- 3DE214371246638F0033C839 /* JPortMidiException.java in CopyFiles */,
- 3DE214381246638F0033C839 /* JPortMidiApi.java in CopyFiles */,
- 3DE214391246638F0033C839 /* JPortMidi.java in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89D0F0440F393070007831A7 /* Copy Executable */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 6;
- files = (
- 89D0F0410F39306C007831A7 /* JavaApplicationStub in Copy Executable */,
- );
- name = "Copy Executable";
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89D0F11F0F394189007831A7 /* Copy Java Resources */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 15;
- files = (
- 89D0F16A0F3A124E007831A7 /* pmdefaults.jar in Copy Java Resources */,
- 3DE216131246AC0E0033C839 /* libpmjni.dylib in Copy Java Resources */,
- );
- name = "Copy Java Resources";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 3DE2137B1246538B0033C839 /* PmDefaults.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = PmDefaults.java; path = ../pm_java/pmdefaults/PmDefaults.java; sourceTree = SOURCE_ROOT; };
- 3DE2137D124653CB0033C839 /* PmDefaultsFrame.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = PmDefaultsFrame.java; path = ../pm_java/pmdefaults/PmDefaultsFrame.java; sourceTree = SOURCE_ROOT; };
- 3DE2137E124653FB0033C839 /* portmusic_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = portmusic_logo.png; path = ../pm_java/pmdefaults/portmusic_logo.png; sourceTree = SOURCE_ROOT; };
- 3DE21380124654BC0033C839 /* JPortMidi.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = JPortMidi.java; path = ../pm_java/jportmidi/JPortMidi.java; sourceTree = SOURCE_ROOT; };
- 3DE21381124654CF0033C839 /* JPortMidiApi.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = JPortMidiApi.java; path = ../pm_java/jportmidi/JPortMidiApi.java; sourceTree = SOURCE_ROOT; };
- 3DE21382124654DE0033C839 /* JPortMidiException.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = JPortMidiException.java; path = ../pm_java/jportmidi/JPortMidiException.java; sourceTree = SOURCE_ROOT; };
- 3DE213841246555A0033C839 /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = /System/Library/Frameworks/CoreMIDI.framework; sourceTree = "<absolute>"; };
- 3DE21390124655760033C839 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
- 3DE213BE1246557F0033C839 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
- 3DE216101246ABE30033C839 /* libpmjni.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpmjni.dylib; path = ../Release/libpmjni.dylib; sourceTree = SOURCE_ROOT; };
- 3DE216901246C6410033C839 /* pmdefaults.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = pmdefaults.icns; path = ../pm_java/pmdefaults/pmdefaults.icns; sourceTree = SOURCE_ROOT; };
- 89C3F2910F5250A300B0048E /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; };
- 89D0F0220F392F20007831A7 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
- 89D0F0230F392F20007831A7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
- 89D0F03E0F39304A007831A7 /* JavaApplicationStub */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = JavaApplicationStub; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub; sourceTree = "<absolute>"; };
- 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaNativeFoundation.framework; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework; sourceTree = "<absolute>"; };
- 89D0F1390F3948A9007831A7 /* pmdefaults/make */ = {isa = PBXFileReference; lastKnownFileType = folder; path = pmdefaults/make; sourceTree = "<group>"; };
- 89D0F15D0F3A0FF7007831A7 /* pmdefaults.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = pmdefaults.jar; path = build/Release/pmdefaults.jar; sourceTree = SOURCE_ROOT; };
- 89D0F1860F3A2442007831A7 /* JavaVM.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaVM.framework; path = /System/Library/Frameworks/JavaVM.framework; sourceTree = "<absolute>"; };
- 8D1107320486CEB800E47090 /* PmDefaults.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PmDefaults.app; sourceTree = BUILT_PRODUCTS_DIR; };
-/* End PBXFileReference section */
-
-/* Begin PBXGroup section */
- 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
- isa = PBXGroup;
- children = (
- 3DE213841246555A0033C839 /* CoreMIDI.framework */,
- 3DE21390124655760033C839 /* CoreFoundation.framework */,
- 3DE213BE1246557F0033C839 /* CoreAudio.framework */,
- 89D0F1860F3A2442007831A7 /* JavaVM.framework */,
- 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */,
- );
- name = "Linked Frameworks";
- sourceTree = "<group>";
- };
- 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
- isa = PBXGroup;
- children = (
- );
- name = "Other Frameworks";
- sourceTree = "<group>";
- };
- 19C28FACFE9D520D11CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 89D0F15D0F3A0FF7007831A7 /* pmdefaults.jar */,
- 8D1107320486CEB800E47090 /* PmDefaults.app */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 29B97314FDCFA39411CA2CEA /* pmdefaults */ = {
- isa = PBXGroup;
- children = (
- 3DE216101246ABE30033C839 /* libpmjni.dylib */,
- 89D0F0260F392F48007831A7 /* Source */,
- 89D0F0200F392F20007831A7 /* Resources */,
- 89D0F1390F3948A9007831A7 /* pmdefaults/make */,
- 29B97323FDCFA39411CA2CEA /* Frameworks */,
- 19C28FACFE9D520D11CA2CBB /* Products */,
- );
- name = pmdefaults;
- sourceTree = "<group>";
- };
- 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
- 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 3DE2136A124652E20033C839 /* pm_java */ = {
- isa = PBXGroup;
- children = (
- 3DE21379124653150033C839 /* pmdefaults */,
- 3DE2137A1246531D0033C839 /* jportmidi */,
- );
- name = pm_java;
- path = ..;
- sourceTree = "<group>";
- };
- 3DE21379124653150033C839 /* pmdefaults */ = {
- isa = PBXGroup;
- children = (
- 3DE2137D124653CB0033C839 /* PmDefaultsFrame.java */,
- 3DE2137B1246538B0033C839 /* PmDefaults.java */,
- );
- name = pmdefaults;
- sourceTree = "<group>";
- };
- 3DE2137A1246531D0033C839 /* jportmidi */ = {
- isa = PBXGroup;
- children = (
- 3DE21382124654DE0033C839 /* JPortMidiException.java */,
- 3DE21381124654CF0033C839 /* JPortMidiApi.java */,
- 3DE21380124654BC0033C839 /* JPortMidi.java */,
- );
- name = jportmidi;
- sourceTree = "<group>";
- };
- 89D0F0200F392F20007831A7 /* Resources */ = {
- isa = PBXGroup;
- children = (
- 3DE216901246C6410033C839 /* pmdefaults.icns */,
- 3DE2137E124653FB0033C839 /* portmusic_logo.png */,
- 89C3F2900F5250A300B0048E /* Credits.rtf */,
- 89D0F0230F392F20007831A7 /* Info.plist */,
- 89D0F0210F392F20007831A7 /* InfoPlist.strings */,
- 89D0F03E0F39304A007831A7 /* JavaApplicationStub */,
- );
- name = Resources;
- path = pmdefaults/resources;
- sourceTree = "<group>";
- };
- 89D0F0260F392F48007831A7 /* Source */ = {
- isa = PBXGroup;
- children = (
- 3DE2136A124652E20033C839 /* pm_java */,
- );
- name = Source;
- path = pmdefaults/src;
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXLegacyTarget section */
- 89D0F0480F393A6F007831A7 /* Compile Java */ = {
- isa = PBXLegacyTarget;
- buildArgumentsString = "-e -f \"${SRCROOT}/make/build.xml\" -debug \"$ACTION\"";
- buildConfigurationList = 89D0F04B0F393AB7007831A7 /* Build configuration list for PBXLegacyTarget "Compile Java" */;
- buildPhases = (
- );
- buildToolPath = /usr/bin/ant;
- buildWorkingDirectory = "";
- dependencies = (
- 3DE2145E124666900033C839 /* PBXTargetDependency */,
- );
- name = "Compile Java";
- passBuildSettingsInEnvironment = 1;
- productName = "Compile Java";
- };
-/* End PBXLegacyTarget section */
-
-/* Begin PBXNativeTarget section */
- 8D1107260486CEB800E47090 /* Assemble Application */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Assemble Application" */;
- buildPhases = (
- 89D0F0440F393070007831A7 /* Copy Executable */,
- 89D0F11F0F394189007831A7 /* Copy Java Resources */,
- 8D1107290486CEB800E47090 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "Assemble Application";
- productInstallPath = "$(HOME)/Applications";
- productName = pmdefaults;
- productReference = 8D1107320486CEB800E47090 /* PmDefaults.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 29B97313FDCFA39411CA2CEA /* Project object */ = {
- isa = PBXProject;
- buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "pm_mac" */;
- compatibilityVersion = "Xcode 3.0";
- developmentRegion = English;
- hasScannedForEncodings = 1;
- knownRegions = (
- English,
- Japanese,
- French,
- German,
- );
- mainGroup = 29B97314FDCFA39411CA2CEA /* pmdefaults */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 3D634CAB1247805C0020F829 /* JPortMidiHeaders */,
- 89D0F1C90F3B704E007831A7 /* PmDefaults */,
- 3DE2142D124662AA0033C839 /* CopyJavaSources */,
- 89D0F0480F393A6F007831A7 /* Compile Java */,
- 8D1107260486CEB800E47090 /* Assemble Application */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 8D1107290486CEB800E47090 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3DE216951246D57A0033C839 /* pmdefaults.icns in Resources */,
- 89D0F0240F392F20007831A7 /* InfoPlist.strings in Resources */,
- 89C3F2920F5250A300B0048E /* Credits.rtf in Resources */,
- 3DE2137F124653FB0033C839 /* portmusic_logo.png in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- 3D634CAA1247805C0020F829 /* ShellScript */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "echo BUILT_PRODUCTS_DIR is ${BUILT_PRODUCTS_DIR}\njavah -classpath \"${BUILT_PRODUCTS_DIR}/pmdefaults.jar\" -force -o \"${BUILT_PRODUCTS_DIR}/jportmidi_JportMidiApi.h\" \"jportmidi.JPortMidiApi\"\nmv \"${BUILT_PRODUCTS_DIR}/jportmidi_JportMidiApi.h\" ../pm_java/pmjni/\necho \"Created ../pm_java/pmjni/jportmidi_JportMidiApi.h\"\n";
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 3D634CB0124781580020F829 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D0F1C90F3B704E007831A7 /* PmDefaults */;
- targetProxy = 3D634CAF124781580020F829 /* PBXContainerItemProxy */;
- };
- 3DE21431124662C50033C839 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3DE2142D124662AA0033C839 /* CopyJavaSources */;
- targetProxy = 3DE21430124662C50033C839 /* PBXContainerItemProxy */;
- };
- 3DE2145E124666900033C839 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3DE2142D124662AA0033C839 /* CopyJavaSources */;
- targetProxy = 3DE2145D124666900033C839 /* PBXContainerItemProxy */;
- };
- 89D0F1CD0F3B7062007831A7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 8D1107260486CEB800E47090 /* Assemble Application */;
- targetProxy = 89D0F1CC0F3B7062007831A7 /* PBXContainerItemProxy */;
- };
- 89D0F1D10F3B7062007831A7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89D0F0480F393A6F007831A7 /* Compile Java */;
- targetProxy = 89D0F1D00F3B7062007831A7 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
- 89C3F2900F5250A300B0048E /* Credits.rtf */ = {
- isa = PBXVariantGroup;
- children = (
- 89C3F2910F5250A300B0048E /* English */,
- );
- name = Credits.rtf;
- sourceTree = "<group>";
- };
- 89D0F0210F392F20007831A7 /* InfoPlist.strings */ = {
- isa = PBXVariantGroup;
- children = (
- 89D0F0220F392F20007831A7 /* English */,
- );
- name = InfoPlist.strings;
- sourceTree = "<group>";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 3D634CAC1247805C0020F829 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = JPortMidiHeaders;
- };
- name = Debug;
- };
- 3D634CAD1247805C0020F829 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- PRODUCT_NAME = JPortMidiHeaders;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 3DE2142E124662AB0033C839 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = CopyJavaSources;
- };
- name = Debug;
- };
- 3DE2142F124662AB0033C839 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- PRODUCT_NAME = CopyJavaSources;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 89D0F0490F393A6F007831A7 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = pmdefaults;
- SRCROOT = ./pmdefaults;
- };
- name = Debug;
- };
- 89D0F04A0F393A6F007831A7 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = pmdefaults;
- SRCROOT = ./pmdefaults;
- };
- name = Release;
- };
- 89D0F1CA0F3B704F007831A7 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = pmdefaults;
- };
- name = Debug;
- };
- 89D0F1CB0F3B704F007831A7 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = pmdefaults;
- };
- name = Release;
- };
- C01FCF4B08A954540054247B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CONFIGURATION_BUILD_DIR = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
- COPY_PHASE_STRIP = NO;
- INFOPLIST_FILE = pmdefaults/resources/Info.plist;
- INSTALL_PATH = "$(HOME)/Applications";
- PRODUCT_NAME = pmdefaults;
- WRAPPER_EXTENSION = app;
- };
- name = Debug;
- };
- C01FCF4C08A954540054247B /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CONFIGURATION_BUILD_DIR = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- INFOPLIST_FILE = pmdefaults/resources/Info.plist;
- INSTALL_PATH = "$(HOME)/Applications";
- PRODUCT_NAME = PmDefaults;
- WRAPPER_EXTENSION = app;
- };
- name = Release;
- };
- C01FCF4F08A954540054247B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- };
- name = Debug;
- };
- C01FCF5008A954540054247B /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 3D634CAE1247807A0020F829 /* Build configuration list for PBXAggregateTarget "JPortMidiHeaders" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3D634CAC1247805C0020F829 /* Debug */,
- 3D634CAD1247805C0020F829 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 3DE21434124662FF0033C839 /* Build configuration list for PBXAggregateTarget "CopyJavaSources" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3DE2142E124662AB0033C839 /* Debug */,
- 3DE2142F124662AB0033C839 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D0F04B0F393AB7007831A7 /* Build configuration list for PBXLegacyTarget "Compile Java" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D0F0490F393A6F007831A7 /* Debug */,
- 89D0F04A0F393A6F007831A7 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 89D0F1D20F3B7080007831A7 /* Build configuration list for PBXAggregateTarget "PmDefaults" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 89D0F1CA0F3B704F007831A7 /* Debug */,
- 89D0F1CB0F3B704F007831A7 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Assemble Application" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C01FCF4B08A954540054247B /* Debug */,
- C01FCF4C08A954540054247B /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C01FCF4E08A954540054247B /* Build configuration list for PBXProject "pm_mac" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C01FCF4F08A954540054247B /* Debug */,
- C01FCF5008A954540054247B /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
-}
diff --git a/3rdparty/portmidi/pm_mac/pmdefaults/make/build.xml b/3rdparty/portmidi/pm_mac/pmdefaults/make/build.xml
deleted file mode 100644
index bd08c682082..00000000000
--- a/3rdparty/portmidi/pm_mac/pmdefaults/make/build.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="pmdefaults" default="jar" basedir="..">
-
- <!-- Global Properties -->
- <property environment="env"/>
-
-
- <!-- building in Xcode -->
- <condition property="product" value="${env.PRODUCT_NAME}">
- <isset property="env.PRODUCT_NAME"/>
- </condition>
-
- <condition property="src" value="${env.SRCROOT}/src">
- <isset property="env.SRCROOT"/>
- </condition>
-
- <condition property="obj" value="${env.OBJECT_FILE_DIR}">
- <isset property="env.OBJECT_FILE_DIR"/>
- </condition>
-
- <condition property="dst" value="${env.BUILT_PRODUCTS_DIR}">
- <isset property="env.BUILT_PRODUCTS_DIR"/>
- </condition>
-
-
- <!-- building from the command line -->
- <condition property="src" value="src">
- <not>
- <isset property="src"/>
- </not>
- </condition>
-
- <condition property="obj" value="build/obj">
- <not>
- <isset property="obj"/>
- </not>
- </condition>
-
- <condition property="dst" value="build">
- <not>
- <isset property="dst"/>
- </not>
- </condition>
-
- <condition property="product" value="pmdefaults">
- <not>
- <isset property="product"/>
- </not>
- </condition>
-
-
- <!-- Targets -->
- <target name="init" description="Create build directories">
- <mkdir dir="${obj}/${product}"/>
- <mkdir dir="${dst}"/>
- </target>
-
- <target name="compile" depends="init" description="Compile">
- <javac destdir="${obj}/${product}" deprecation="on" source="1.5" target="1.5" fork="true" debug="true" debuglevel="lines,source">
- <src path="${src}/java"/>
- <classpath path="${src}/../lib/eawt-stubs.jar"/>
- </javac>
- </target>
-
- <target name="copy" depends="init" description="Copy resources">
-
- </target>
-
- <target name="jar" depends="compile, copy" description="Assemble Jar file">
- <jar jarfile="${dst}/${product}.jar" basedir="${obj}/${product}" manifest="resources/Manifest" index="true"/>
- </target>
-
- <target name="install" depends="jar" description="Alias for 'jar'">
- <!-- sent by Xcode -->
- </target>
-
- <target name="clean" description="Removes build directories">
- <!-- sent by Xcode -->
- <delete dir="${obj}/${product}"/>
- <delete file="${dst}/${product}.jar"/>
- </target>
-
- <target name="installhdrs" description="">
- <!-- sent by Xcode -->
- <echo>"Nothing to do for install-headers phase"</echo>
- </target>
-</project>
diff --git a/3rdparty/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh b/3rdparty/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh
deleted file mode 100644
index 2217580d0d3..00000000000
--- a/3rdparty/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-
-# Prints all class references made by all classes in a Jar file
-# Depends on the output formatting of javap
-
-# create a temporary working directory
-dir=`mktemp -d $TMPDIR/classrefs.XXXXXX`
-
-asm_dump="$dir/asm_dump"
-all_classes="$dir/all_classes"
-
-# for each class in a Jar file, dump the full assembly
-javap -c -classpath "$1" `/usr/bin/jar tf "$1" | grep "\.class" | sort | xargs | sed -e 's/\.class//g'` > $asm_dump
-
-# dump the initial list of all classes in the Jar file
-/usr/bin/jar tf $1 | grep "\.class" | sed -e 's/\.class//g' >> $all_classes
-
-# dump all static class references
-cat $asm_dump | grep //class | awk -F"//class " '{print $2}' | sort | uniq >> $all_classes
-
-# dump all references to classes made in methods
-cat $asm_dump | grep //Method | awk -F"//Method " '{print $2}' | sort | uniq | grep "\." | awk -F"." '{print $1}' | sort | uniq >> $all_classes
-
-# dump all references to classes by direct field access
-cat $asm_dump | grep //Field | awk -F"//Field " '{print $2}' | sort | uniq | grep "\:L" | awk -F"\:L" '{print $2}' | sort | uniq | awk -F"\;" '{print $1}' >> $all_classes
-
-# sort and reformat
-sort $all_classes | uniq | grep -v "\"" | sed -e 's/\//\./g'
-
-# cleanup
-rm -rf $dir
diff --git a/3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf b/3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf
deleted file mode 100644
index 18f83781e7b..00000000000
--- a/3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf
+++ /dev/null
@@ -1,14 +0,0 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
-
-\f0\b\fs24 \cf0 Author:
-\b0 \
- Roger B. Dannenberg\
-\
-
-\b With special thanks to:
-\b0 \
- National Science Foundation\
-} \ No newline at end of file
diff --git a/3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.strings b/3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.strings
deleted file mode 100644
index c7e5600f98a..00000000000
--- a/3rdparty/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/3rdparty/portmidi/pm_mac/pmdefaults/resources/Info.plist b/3rdparty/portmidi/pm_mac/pmdefaults/resources/Info.plist
deleted file mode 100644
index 58bedb45013..00000000000
--- a/3rdparty/portmidi/pm_mac/pmdefaults/resources/Info.plist
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>JavaApplicationStub</string>
- <key>CFBundleIconFile</key>
- <string>pmdefaults.icns</string>
- <key>CFBundleIdentifier</key>
- <string></string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>PmDefaults</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>????</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>CFBundleShortVersionString</key>
- <string>1.0</string>
- <key>Java</key>
- <dict>
- <key>ClassPath</key>
- <string>$JAVAROOT/pmdefaults.jar</string>
- <key>JVMVersion</key>
- <string>1.5+</string>
- <key>MainClass</key>
- <string>pmdefaults.PmDefaults</string>
- <key>Properties</key>
- <dict>
- <key>apple.laf.useScreenMenuBar</key>
- <string>true</string>
- </dict>
- </dict>
-</dict>
-</plist>
diff --git a/3rdparty/portmidi/pm_mac/pmdefaults/resources/Manifest b/3rdparty/portmidi/pm_mac/pmdefaults/resources/Manifest
deleted file mode 100644
index 5dee9b0dc13..00000000000
--- a/3rdparty/portmidi/pm_mac/pmdefaults/resources/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-Main-Class: pmdefaults/PmDefaults
diff --git a/3rdparty/portmidi/pm_mac/pmmac.c b/3rdparty/portmidi/pm_mac/pmmac.c
index d3c08cceb9d..6c310022465 100644
--- a/3rdparty/portmidi/pm_mac/pmmac.c
+++ b/3rdparty/portmidi/pm_mac/pmmac.c
@@ -26,10 +26,10 @@ void pm_init(void)
pm_initialized = TRUE;
if (!err) {
pm_default_input_device_id = find_default_device(
- (char *)"/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE,
+ "/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE,
pm_default_input_device_id);
pm_default_output_device_id = find_default_device(
- (char *)"/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE,
+ "/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE,
pm_default_output_device_id);
}
}
@@ -47,7 +47,8 @@ PmDeviceID Pm_GetDefaultInputDeviceID(void)
return pm_default_input_device_id;
}
-PmDeviceID Pm_GetDefaultOutputDeviceID(void) {
+PmDeviceID Pm_GetDefaultOutputDeviceID(void)
+{
Pm_Initialize();
return pm_default_output_device_id;
}
diff --git a/3rdparty/portmidi/pm_mac/pmmac.h b/3rdparty/portmidi/pm_mac/pmmac.h
index 6cc0392c3f4..6b64fff2a95 100644
--- a/3rdparty/portmidi/pm_mac/pmmac.h
+++ b/3rdparty/portmidi/pm_mac/pmmac.h
@@ -1,4 +1,4 @@
/* pmmac.h */
extern PmDeviceID pm_default_input_device_id;
-extern PmDeviceID pm_default_output_device_id; \ No newline at end of file
+extern PmDeviceID pm_default_output_device_id;
diff --git a/3rdparty/portmidi/pm_mac/pmmacosxcm.c b/3rdparty/portmidi/pm_mac/pmmacosxcm.c
index 71177dded11..81c531e033b 100644
--- a/3rdparty/portmidi/pm_mac/pmmacosxcm.c
+++ b/3rdparty/portmidi/pm_mac/pmmacosxcm.c
@@ -9,21 +9,67 @@
*/
/* Notes:
- since the input and output streams are represented by MIDIEndpointRef
- values and almost no other state, we store the MIDIEndpointRef on
- descriptors[midi->device_id].descriptor. The only other state we need
- is for errors: we need to know if there is an error and if so, what is
- the error text. We use a structure with two kinds of
- host error: "error" and "callback_error". That way, asynchronous callbacks
- do not interfere with other error information.
+
+ Since the input and output streams are represented by
+ MIDIEndpointRef values and almost no other state, we store the
+ MIDIEndpointRef on pm_descriptors[midi->device_id].descriptor.
- OS X does not seem to have an error-code-to-text function, so we will
- just use text messages instead of error codes.
+ OS X does not seem to have an error-code-to-text function, so we
+ will just use text messages instead of error codes.
+
+ Virtual device input synchronization: Once we create a virtual
+ device, it is always "on" and receiving messages, but it must drop
+ messages unless the device has been opened with Pm_OpenInput. To
+ open, the main thread should create all the data structures, then
+ call OSMemoryBarrier so that writes are observed, then set
+ is_opened = TRUE. To close without locks, we need to get the
+ callback to set is_opened to FALSE before we free data structures;
+ otherwise, there's a race condition where closing could delete
+ structures in use by the virtual_read_callback function. We send
+ 8 MIDI resets (FF) in a single packet to our own port to signal
+ the virtual_read_callback to close it. Then, we wait for the
+ callback to recognize the "close" packet and reset is_opened.
+
+ Device scanning is done when you first open an application.
+ PortMIDI does not actively update the devices. Instead, you must
+ Pm_Terminate() and Pm_Initialize(), basically starting over. But
+ CoreMIDI does not have a way to shut down(!), and even
+ MIDIClientDispose() somehow retains state (and docs say do not
+ call it even if it worked). The solution, apparently, is to
+ call CFRunLoopRunInMode(), which somehow updates CoreMIDI
+ state.
+
+ But when do we call CFRunLoopRunInMode()? I tried calling it
+ in midi_in_poll() which is called when you call Pm_Read() since
+ that is called often. I observed that this caused the program
+ to block for as long as 50ms and fairly often for 2 or 3ms.
+ What was Apple thinking? Is it really OK to design systems that
+ can only function with a tricky multi-threaded, non-blocking
+ priority-based solution, and then not provide a proof of concept
+ or documentation? Or is Apple's design really flawed? If anyone
+ at Apple reads this, please let me know -- I'm curious.
+
+ But I digress... Here's the PortMidi approach: Since
+ CFRunLoopRunInMode() is potentially a non-realtime operation,
+ we only call it in Pm_Initialize(), where other calls to look
+ up devices and device names are quite slow to begin with. Again,
+ PortMidi does not actively scan for new or deleted devices, so
+ if devices change, you won't see it until the next Pm_Terminate
+ and Pm_Initialize.
+
+ Calling CFRunLoopRunInMode() once is probably not enough. There
+ might be better way, but it seems to work to just call it 100
+ times and insert 20 1ms delays (in case some inter-process
+ communication or synchronization is going on).
+ This adds 20ms to the wall time of Pm_Initialize(), but it
+ typically runs 30ms to much more (~4s), so this has little impact.
*/
#include <stdlib.h>
-//#define CM_DEBUG 1
+/* turn on lots of debugging print statements */
+#define CM_DEBUG if (0)
+/* #define CM_DEBUG if (1) */
#include "portmidi.h"
#include "pmutil.h"
@@ -39,39 +85,101 @@
#include <CoreMIDI/MIDIServices.h>
#include <CoreAudio/HostTime.h>
#include <unistd.h>
+#include <libkern/OSAtomic.h>
#define PACKET_BUFFER_SIZE 1024
-/* maximum overall data rate (OS X limit is 15000 bytes/second) */
-#define MAX_BYTES_PER_S 14000
-
-/* Apple reports that packets are dropped when the MIDI bytes/sec
- exceeds 15000. This is computed by "tracking the number of MIDI
- bytes scheduled into 1-second buckets over the last six seconds
- and averaging these counts."
-
- This is apparently based on timestamps, not on real time, so
- we have to avoid constructing packets that schedule high speed
- output even if the actual writes are delayed (which was my first
- solution).
-
- The LIMIT_RATE symbol, if defined, enables code to modify
- timestamps as follows:
- After each packet is formed, the next allowable timestamp is
- computed as this_packet_time + this_packet_len * delay_per_byte
+/* maximum overall data rate (OS X limits MIDI rate in case there
+ * is a cycle among IAC ports.
+ */
- This is the minimum timestamp allowed in the next packet.
+#define MAX_BYTES_PER_S 5400
- Note that this distorts accurate timestamps somewhat.
+/* Apple reports that packets are dropped when the MIDI bytes/sec
+ exceeds 15000. This is computed by "tracking the number of MIDI
+ bytes scheduled into 1-second buckets over the last six seconds and
+ averaging these counts." This was confirmed in measurements
+ (2021) with pm_test/fast.c and pm_test/fastrcv.c Now, in 2022, with
+ macOS 12, pm_test/fast{rcv}.c show problems begin at 6000 bytes/sec.
+ Previously, we set MAX_BYTES_PER_S to 14000. This is reduced to
+ 5400 based on testing (which shows 5700 is too high) to fix the
+ packet loss problem that showed up with macOS 12.
+
+ Experiments show this restriction applies to IAC bus MIDI, but not
+ to hardware interfaces. (I measured 0.5 Mbps each way over USB to a
+ Teensy 3.2 microcontroller implementing a USB MIDI loopback. Maybe
+ it would get 1 Mbps one-way, which would make the CoreMIDI
+ restriction 18x slower than USB. Maybe other USB MIDI
+ implementations are faster -- USB top speed for other protocols is
+ certainly higher than 1 Mbps!)
+
+ This is apparently based on timestamps, not on real time, so we
+ have to avoid constructing packets that schedule high speed output
+ regardless of when writes occur. The solution is to alter
+ timestamps to limit data rates. This adds a slight time
+ distortion, e.g. an 11 note chord with all notes on the same
+ timestamp will be altered so that the last message is delayed by
+ 11 messages x 3 bytes/message / 5400 bytes/second = 6.1 ms.
+ Note that this is about 2x MIDI speed, but at least 18x slower
+ than USB MIDI.
+
+ Altering timestamps creates another problem, which is that a sender
+ that exceeds the maximum rate can queue up an unbounded number of
+ messages. With non-USB MIDI devices, you could be writing 5x faster
+ to CoreMIDI than the hardware interface can send, causing an
+ unbounded backlog, not to mention that the output stream will be a
+ steady byte stream (e.g., one 3-byte MIDI message every 0.55 ms),
+ losing any original timing or rhythm. PortMidi does not guarantee
+ delivery if, over the long run, you write faster than the hardware
+ can send.
+
+ The LIMIT_RATE symbol, if defined (which is the default), enables
+ code to modify timestamps for output to an IAC device as follows:
+
+ Before a packet is formed, the message timestamp is set to the
+ maximum of the PortMidi timestamp (converted to CoreMIDI time)
+ and min_next_time. After each send, min_next_time is updated to
+ the packet time + packet length * delay_per_byte, which limits
+ the scheduled bytes-per-second. Also, after each packet list
+ flush, min_next_time is updated to the maximum of min_next_time
+ and the real time, which prevents many bytes to be scheduled in
+ the past. (We could more directly just say packets are never
+ scheduled in the past, but we prefer to get the current time -- a
+ system call -- only when we perform the more expensive operation
+ of flushing packets, so that's when we update min_next_time to
+ the current real time. If we are sending a lot, we have to flush
+ a lot, so the time will be updated frequently when it matters.)
+
+ This possible adjustment to timestamps can distort accurate
+ timestamps by up to 0.556 us per 3-byte MIDI message.
+
+ Nothing blocks the sender from queueing up an arbitrary number of
+ messages. Timestamps should be used for accurate timing by sending
+ timestamped messages a little ahead of real time, not for
+ scheduling an entire MIDI sequence at once!
*/
#define LIMIT_RATE 1
#define SYSEX_BUFFER_SIZE 128
+/* What is the maximum PortMidi device number for an IAC device? A
+ * cleaner design would be to not use the endpoint as our device
+ * representation. Instead, we could have a private extensible struct
+ * to keep all device information, including whether the device is
+ * implemented with the AppleMIDIIACDriver, which we need because we
+ * have to limit the data rate to this particular driver to avoid
+ * dropping messages. Rather than rewrite a lot of code, I am just
+ * allocating 64 bytes to flag which devices are IAC ones. If an IAC
+ * device number is greater than 63, PortMidi will fail to limit
+ * writes to it, but will not complain and will not access memory
+ * outside the 64-element array of char.
+ */
+#define MAX_IAC_NUM 63
#define VERBOSE_ON 1
#define VERBOSE if (VERBOSE_ON)
-#define MIDI_SYSEX 0xf0
-#define MIDI_EOX 0xf7
+#define MIDI_SYSEX 0xf0
+#define MIDI_EOX 0xf7
+#define MIDI_CLOCK 0xf8
#define MIDI_STATUS_MASK 0x80
// "Ref"s are pointers on 32-bit machines and ints on 64 bit machines
@@ -82,18 +190,17 @@
#define NULL_REF NULL
#endif
-static MIDIClientRef client = NULL_REF; /* Client handle to the MIDI server */
-static MIDIPortRef portIn = NULL_REF; /* Input port handle */
-static MIDIPortRef portOut = NULL_REF; /* Output port handle */
+static MIDIClientRef client = NULL_REF; /* Client handle to the MIDI server */
+static MIDIPortRef portIn = NULL_REF; /* Input port handle */
+static MIDIPortRef portOut = NULL_REF; /* Output port handle */
+static char isIAC[MAX_IAC_NUM + 1]; /* is device an IAC device */
extern pm_fns_node pm_macosx_in_dictionary;
extern pm_fns_node pm_macosx_out_dictionary;
-typedef struct midi_macosxcm_struct {
- PmTimestamp sync_time; /* when did we last determine delta? */
+typedef struct coremidi_info_struct {
+ int is_virtual; /* virtual device (TRUE) or actual device (FALSE)? */
UInt64 delta; /* difference between stream time and real time in ns */
- UInt64 last_time; /* last output time in host units*/
- int first_message; /* tells midi_write to sychronize timestamps */
int sysex_mode; /* middle of sending sysex */
uint32_t sysex_word; /* accumulate data when receiving sysex */
uint32_t sysex_byte_count; /* count how many received */
@@ -103,26 +210,34 @@ typedef struct midi_macosxcm_struct {
MIDIPacketList *packetList; /* a pointer to packetBuffer */
MIDIPacket *packet;
Byte sysex_buffer[SYSEX_BUFFER_SIZE]; /* temp storage for sysex data */
- MIDITimeStamp sysex_timestamp; /* timestamp to use with sysex data */
+ MIDITimeStamp sysex_timestamp; /* host timestamp to use with sysex data */
/* allow for running status (is running status possible here? -rbd): -cpr */
unsigned char last_command;
int32_t last_msg_length;
- /* limit midi data rate (a CoreMidi requirement): */
- UInt64 min_next_time; /* when can the next send take place? */
- int byte_count; /* how many bytes in the next packet list? */
+ UInt64 min_next_time; /* when can the next send take place? (host time) */
+ int isIACdevice;
Float64 us_per_host_tick; /* host clock frequency, units of min_next_time */
UInt64 host_ticks_per_byte; /* host clock units per byte at maximum rate */
-} midi_macosxcm_node, *midi_macosxcm_type;
+} coremidi_info_node, *coremidi_info_type;
/* private function declarations */
-MIDITimeStamp timestamp_pm_to_cm(PmTimestamp timestamp);
-PmTimestamp timestamp_cm_to_pm(MIDITimeStamp timestamp);
+MIDITimeStamp timestamp_pm_to_cm(PmTimestamp timestamp); // returns host time
+PmTimestamp timestamp_cm_to_pm(MIDITimeStamp timestamp); // returns ms
-char* cm_get_full_endpoint_name(MIDIEndpointRef endpoint);
+char* cm_get_full_endpoint_name(MIDIEndpointRef endpoint, int *isIAC);
+
+static PmError check_hosterror(OSStatus err, const char *msg)
+{
+ if (err != noErr) {
+ sprintf(pm_hosterror_text, "Host error %ld: %s", (long) err, msg);
+ pm_hosterror = TRUE;
+ return pmHostError;
+ }
+ return pmNoError;
+}
-static int
-midi_length(int32_t msg)
+static int midi_length(int32_t msg)
{
int status, high, low;
static int high_lengths[] = {
@@ -143,31 +258,31 @@ midi_length(int32_t msg)
static PmTimestamp midi_synchronize(PmInternal *midi)
{
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- UInt64 pm_stream_time_2 =
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ UInt64 pm_stream_time_2 = // current time in ns
AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
- PmTimestamp real_time;
- UInt64 pm_stream_time;
+ PmTimestamp real_time; // in ms
+ UInt64 pm_stream_time; // in ns
/* if latency is zero and this is an output, there is no
time reference and midi_synchronize should never be called */
assert(midi->time_proc);
- assert(!(midi->write_flag && midi->latency == 0));
+ assert(midi->is_input || midi->latency != 0);
do {
/* read real_time between two reads of stream time */
pm_stream_time = pm_stream_time_2;
real_time = (*midi->time_proc)(midi->time_info);
- pm_stream_time_2 = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
+ pm_stream_time_2 = AudioConvertHostTimeToNanos(
+ AudioGetCurrentHostTime());
/* repeat if more than 0.5 ms has elapsed */
} while (pm_stream_time_2 > pm_stream_time + 500000);
- m->delta = pm_stream_time - ((UInt64) real_time * (UInt64) 1000000);
- m->sync_time = real_time;
+ info->delta = pm_stream_time - ((UInt64) real_time * (UInt64) 1000000);
+ midi->sync_time = real_time;
return real_time;
}
-static void
-process_packet(MIDIPacket *packet, PmEvent *event,
- PmInternal *midi, midi_macosxcm_type m)
+static void process_packet(MIDIPacket *packet, PmEvent *event,
+ PmInternal *midi, coremidi_info_type info)
{
/* handle a packet of MIDI messages from CoreMIDI */
/* there may be multiple short messages in one packet (!) */
@@ -176,9 +291,9 @@ process_packet(MIDIPacket *packet, PmEvent *event,
while (remaining_length > 0) {
if (cur_packet_data[0] == MIDI_SYSEX ||
/* are we in the middle of a sysex message? */
- (m->last_command == 0 &&
+ (info->last_command == 0 &&
!(cur_packet_data[0] & MIDI_STATUS_MASK))) {
- m->last_command = 0; /* no running status */
+ info->last_command = 0; /* no running status */
unsigned int amt = pm_read_bytes(midi, cur_packet_data,
remaining_length,
event->timestamp);
@@ -188,7 +303,7 @@ process_packet(MIDIPacket *packet, PmEvent *event,
/* this should never happen, because pm_read_bytes should
* get and read all EOX bytes*/
midi->sysex_in_progress = FALSE;
- m->last_command = 0;
+ info->last_command = 0;
} else if (cur_packet_data[0] & MIDI_STATUS_MASK) {
/* compute the length of the next (short) msg in packet */
unsigned int cur_message_length = midi_length(cur_packet_data[0]);
@@ -199,8 +314,15 @@ process_packet(MIDIPacket *packet, PmEvent *event,
/* since there's no more data, we're done */
return;
}
- m->last_msg_length = cur_message_length;
- m->last_command = cur_packet_data[0];
+ if (cur_packet_data[0] < MIDI_SYSEX) {
+ /* channel messages set running status */
+ info->last_command = cur_packet_data[0];
+ info->last_msg_length = cur_message_length;
+ } else if (cur_packet_data[0] < MIDI_CLOCK) {
+ /* system messages clear running status */
+ info->last_command = 0;
+ info->last_msg_length = 0;
+ }
switch (cur_message_length) {
case 1:
event->message = Pm_Message(cur_packet_data[0], 0, 0);
@@ -220,9 +342,9 @@ process_packet(MIDIPacket *packet, PmEvent *event,
return; /* give up on packet if continued after assert */
}
pm_read_short(midi, event);
- remaining_length -= m->last_msg_length;
- cur_packet_data += m->last_msg_length;
- } else if (m->last_msg_length > remaining_length + 1) {
+ remaining_length -= cur_message_length;
+ cur_packet_data += cur_message_length;
+ } else if (info->last_msg_length > remaining_length + 1) {
/* we have running status, but not enough data */
#ifdef DEBUG
printf("PortMidi debug msg: not enough data in CoreMIDI packet");
@@ -230,427 +352,588 @@ process_packet(MIDIPacket *packet, PmEvent *event,
/* since there's no more data, we're done */
return;
} else { /* output message using running status */
- switch (m->last_msg_length) {
+ switch (info->last_msg_length) {
case 1:
- event->message = Pm_Message(m->last_command, 0, 0);
+ event->message = Pm_Message(info->last_command, 0, 0);
break;
case 2:
- event->message = Pm_Message(m->last_command,
+ event->message = Pm_Message(info->last_command,
cur_packet_data[0], 0);
break;
case 3:
- event->message = Pm_Message(m->last_command,
+ event->message = Pm_Message(info->last_command,
cur_packet_data[0],
cur_packet_data[1]);
break;
default:
/* last_msg_length is invalid -- internal PortMIDI error */
- assert(m->last_msg_length == 1);
+ assert(info->last_msg_length == 1);
}
pm_read_short(midi, event);
- remaining_length -= (m->last_msg_length - 1);
- cur_packet_data += (m->last_msg_length - 1);
+ remaining_length -= (info->last_msg_length - 1);
+ cur_packet_data += (info->last_msg_length - 1);
}
}
}
-
/* called when MIDI packets are received */
-static void
-readProc(const MIDIPacketList *newPackets, void *refCon, void *connRefCon)
+static void read_callback(const MIDIPacketList *newPackets, PmInternal *midi)
{
- PmInternal *midi;
- midi_macosxcm_type m;
PmEvent event;
MIDIPacket *packet;
unsigned int packetIndex;
uint32_t now;
unsigned int status;
-
-#ifdef CM_DEBUG
- printf("readProc: numPackets %d: ", newPackets->numPackets);
-#endif
-
/* Retrieve the context for this connection */
- midi = (PmInternal *) connRefCon;
- m = (midi_macosxcm_type) midi->descriptor;
- assert(m);
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ assert(info);
+
+ CM_DEBUG printf("read_callback: numPackets %d: ", newPackets->numPackets);
/* synchronize time references every 100ms */
now = (*midi->time_proc)(midi->time_info);
- if (m->first_message || m->sync_time + 100 /*ms*/ < now) {
+ if (midi->first_message || midi->sync_time + 100 /*ms*/ < now) {
/* time to resync */
now = midi_synchronize(midi);
- m->first_message = FALSE;
+ midi->first_message = FALSE;
}
packet = (MIDIPacket *) &newPackets->packet[0];
- /* printf("readproc packet status %x length %d\n", packet->data[0],
- packet->length); */
+ /* hardware devices get untimed messages and apply timestamps. We
+ * want to preserve them because they should be more accurate than
+ * applying the current time here. virtual devices just pass on the
+ * packet->timeStamp, which could be anything. PortMidi says the
+ * PortMidi timestamp is the time the message is received. We do not
+ * know if we are receiving from a device driver or a virtual device.
+ * PortMidi sends to virtual devices get a current timestamp, so we
+ * can treat them as the receive time. If the timestamp is zero,
+ * suggested by CoreMIDI as the value to use for immediate delivery,
+ * then we plug in `now` which is obtained above. If another
+ * application sends bogus non-zero timestamps, we will convert them
+ * to this port's reference time and pass them as event.timestamp.
+ * Receiver beware.
+ */
+ CM_DEBUG printf("read_callback packet @ %lld ns (host %lld) "
+ "status %x length %d\n",
+ AudioConvertHostTimeToNanos(AudioGetCurrentHostTime()),
+ AudioGetCurrentHostTime(),
+ packet->data[0], packet->length);
for (packetIndex = 0; packetIndex < newPackets->numPackets; packetIndex++) {
/* Set the timestamp and dispatch this message */
- event.timestamp = (PmTimestamp) /* explicit conversion */ (
- (AudioConvertHostTimeToNanos(packet->timeStamp) - m->delta) /
+ CM_DEBUG printf(" packet->timeStamp %lld ns %lld host\n",
+ packet->timeStamp,
+ AudioConvertHostTimeToNanos(packet->timeStamp));
+ if (packet->timeStamp == 0) {
+ event.timestamp = now;
+ } else {
+ event.timestamp = (PmTimestamp) /* explicit conversion */ (
+ (AudioConvertHostTimeToNanos(packet->timeStamp) - info->delta) /
(UInt64) 1000000);
+ }
status = packet->data[0];
/* process packet as sysex data if it begins with MIDI_SYSEX, or
MIDI_EOX or non-status byte with no running status */
-#ifdef CM_DEBUG
- printf(" %d", packet->length);
-#endif
+ CM_DEBUG printf(" len %d stat %x\n", packet->length, status);
if (status == MIDI_SYSEX || status == MIDI_EOX ||
- ((!(status & MIDI_STATUS_MASK)) && !m->last_command)) {
- /* previously was: !(status & MIDI_STATUS_MASK)) {
+ ((!(status & MIDI_STATUS_MASK)) && !info->last_command)) {
+ /* previously was: !(status & MIDI_STATUS_MASK)) {
* but this could mistake running status for sysex data
*/
/* reset running status data -cpr */
- m->last_command = 0;
- m->last_msg_length = 0;
+ info->last_command = 0;
+ info->last_msg_length = 0;
/* printf("sysex packet length: %d\n", packet->length); */
pm_read_bytes(midi, packet->data, packet->length, event.timestamp);
} else {
- process_packet(packet, &event, midi, m);
+ process_packet(packet, &event, midi, info);
}
packet = MIDIPacketNext(packet);
}
-#ifdef CM_DEBUG
- printf("\n");
-#endif
}
-static PmError
-midi_in_open(PmInternal *midi, void *driverInfo)
+/* callback for real devices - redirects to read_callback */
+static void device_read_callback(const MIDIPacketList *newPackets,
+ void *refCon, void *connRefCon)
+{
+ read_callback(newPackets, (PmInternal *) connRefCon);
+}
+
+
+/* callback for virtual devices - redirects to read_callback */
+static void virtual_read_callback(const MIDIPacketList *newPackets,
+ void *refCon, void *connRefCon)
+{
+ /* this refCon is the device ID -- if there is a valid ID and
+ the pm_descriptors table has a non-null pointer to a PmInternal,
+ then then device is open and should receive this data */
+ PmDeviceID id = (PmDeviceID) (size_t) refCon;
+ if (id >= 0 && id < pm_descriptor_len) {
+ if (pm_descriptors[id].pub.opened) {
+ /* check for close request (7 reset status bytes): */
+ if (newPackets->numPackets == 1 &&
+ newPackets->packet[0].length == 8 &&
+ /* CoreMIDI declares packets with 4-byte alignment, so we
+ * should be safe to test for 8 0xFF's as 2 32-bit values: */
+ *(SInt32 *) &newPackets->packet[0].data[0] == -1 &&
+ *(SInt32 *) &newPackets->packet[0].data[4] == -1) {
+ CM_DEBUG printf("got close request packet\n");
+ pm_descriptors[id].pub.opened = FALSE;
+ return;
+ } else {
+ read_callback(newPackets, pm_descriptors[id].pm_internal);
+ }
+ }
+ }
+}
+
+
+/* allocate and initialize our internal coremidi connection info */
+static coremidi_info_type create_macosxcm_info(int is_virtual, int is_input)
+{
+ coremidi_info_type info = (coremidi_info_type)
+ pm_alloc(sizeof(coremidi_info_node));
+ if (!info) {
+ return NULL;
+ }
+ info->is_virtual = is_virtual;
+ info->delta = 0;
+ info->sysex_mode = FALSE;
+ info->sysex_word = 0;
+ info->sysex_byte_count = 0;
+ info->packet = NULL;
+ info->last_command = 0;
+ info->last_msg_length = 0;
+ info->min_next_time = 0;
+ info->isIACdevice = FALSE;
+ info->us_per_host_tick = 1000000.0 / AudioGetHostClockFrequency();
+ info->host_ticks_per_byte =
+ (UInt64) (1000000.0 / (info->us_per_host_tick * MAX_BYTES_PER_S));
+ info->packetList = (is_input ? NULL :
+ (MIDIPacketList *) info->packetBuffer);
+ return info;
+}
+
+
+static PmError midi_in_open(PmInternal *midi, void *driverInfo)
{
MIDIEndpointRef endpoint;
- midi_macosxcm_type m;
+ coremidi_info_type info;
OSStatus macHostError;
+ int is_virtual = pm_descriptors[midi->device_id].pub.is_virtual;
- /* insure that we have a time_proc for timing */
- if (midi->time_proc == NULL) {
- if (!Pt_Started())
- Pt_Start(1, 0, 0);
- /* time_get does not take a parameter, so coerce */
- midi->time_proc = (PmTimeProcPtr) Pt_Time;
- }
- endpoint = (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor;
- if (endpoint == NULL_REF) {
- return pmInvalidDeviceId;
+ /* if this is an external device, descriptor is a MIDIEndpointRef.
+ * if this is a virtual device for this application, descriptor is NULL.
+ */
+ if (!is_virtual) {
+ endpoint = (MIDIEndpointRef) (intptr_t)
+ pm_descriptors[midi->device_id].descriptor;
+ if (endpoint == NULL_REF) {
+ return pmInvalidDeviceId;
+ }
}
- m = (midi_macosxcm_type) pm_alloc(sizeof(midi_macosxcm_node)); /* create */
- midi->descriptor = m;
- if (!m) {
+ info = create_macosxcm_info(is_virtual, TRUE);
+ midi->api_info = info;
+ if (!info) {
return pmInsufficientMemory;
}
- m->error[0] = 0;
- m->callback_error[0] = 0;
- m->sync_time = 0;
- m->delta = 0;
- m->last_time = 0;
- m->first_message = TRUE;
- m->sysex_mode = FALSE;
- m->sysex_word = 0;
- m->sysex_byte_count = 0;
- m->packetList = NULL;
- m->packet = NULL;
- m->last_command = 0;
- m->last_msg_length = 0;
-
- macHostError = MIDIPortConnectSource(portIn, endpoint, midi);
- if (macHostError != noErr) {
- pm_hosterror = macHostError;
- sprintf(pm_hosterror_text,
- "Host error %ld: MIDIPortConnectSource() in midi_in_open()",
- (long) macHostError);
- midi->descriptor = NULL;
- pm_free(m);
- return pmHostError;
+ if (!is_virtual) {
+ macHostError = MIDIPortConnectSource(portIn, endpoint, midi);
+ if (macHostError != noErr) {
+ midi->api_info = NULL;
+ pm_free(info);
+ return check_hosterror(macHostError,
+ "MIDIPortConnectSource() in midi_in_open()");
+ }
}
-
return pmNoError;
}
-static PmError
-midi_in_close(PmInternal *midi)
+static PmError midi_in_close(PmInternal *midi)
{
MIDIEndpointRef endpoint;
OSStatus macHostError;
PmError err = pmNoError;
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
- if (!m) return pmBadPtr;
+ if (!info) return pmBadPtr;
- endpoint = (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor;
+ endpoint = (MIDIEndpointRef) (intptr_t)
+ pm_descriptors[midi->device_id].descriptor;
if (endpoint == NULL_REF) {
- pm_hosterror = pmBadPtr;
+ return pmBadPtr;
}
- /* shut off the incoming messages before freeing data structures */
- macHostError = MIDIPortDisconnectSource(portIn, endpoint);
- if (macHostError != noErr) {
- pm_hosterror = macHostError;
- sprintf(pm_hosterror_text,
- "Host error %ld: MIDIPortDisconnectSource() in midi_in_close()",
- (long) macHostError);
- err = pmHostError;
+ if (!info->is_virtual) {
+ /* shut off the incoming messages before freeing data structures */
+ macHostError = MIDIPortDisconnectSource(portIn, endpoint);
+ /* If the source closes, you get paramErr == -50 here. It seems
+ * possible to monitor changes like sources closing by getting
+ * notifications ALL changes, but the CoreMIDI documentation is
+ * really terrible overall, and it seems easier to just ignore
+ * this host error.
+ */
+ if (macHostError != noErr && macHostError != -50) {
+ pm_hosterror = TRUE;
+ err = check_hosterror(macHostError,
+ "MIDIPortDisconnectSource() in midi_in_close()");
+ }
+ } else {
+ /* make "close virtual port" message */
+ SInt64 close_port_bytes = 0xFFFFFFFFFFFFFFFF;
+ /* memory requirements: packet count (4), timestamp (8), length (2),
+ * data (8). Total: 22, but we allocate plenty more:
+ */
+ Byte packetBuffer[64];
+ MIDIPacketList *plist = (MIDIPacketList *) packetBuffer;
+ MIDIPacket *packet = MIDIPacketListInit(plist);
+ MIDIPacketListAdd(plist, 64, packet, 0, 8,
+ (const Byte *) &close_port_bytes);
+ macHostError = MIDISend(portOut, endpoint, plist);
+ if (macHostError != noErr) {
+ err = check_hosterror(macHostError, "MIDISend() (PortMidi close "
+ "port packet) in midi_in_close()");
+ }
+ /* when packet is delivered, callback thread will clear opened;
+ * we must wait for that before removing the input queues etc.
+ * Maybe this could use signals of some kind, but if signals use
+ * locks, locks can cause priority inversion problems, so we will
+ * just sleep as needed. On the MIDI timescale, inserting a 0.5ms
+ * latency should be OK, as the application has no business
+ * opening/closing devices during time-critical moments.
+ *
+ * We expect the MIDI thread to close the device quickly (<0.5ms),
+ * but we wait up to 50ms in case something terrible happens like
+ * getting paged out in the middle of deliving packets to this
+ * virtual device. If there is still no response, we time out and
+ * force the close without the MIDI thread (even this will probably
+ * succeed - the problem would be: this thread proceeds to delete
+ * the input queues, and the freed memory is reallocated and
+ * overwritten so that queues are no longer usable. Meanwhile,
+ * the MIDI thread has already begun to deliver packets, so the
+ * check for opened == TRUE passed, but MIDI thread does not insert
+ * into queue until queue is freed, reallocated and overwritten.
+ */
+ for (int i = 0; i < 100; i++) { /* up to 50ms delay */
+ if (!pm_descriptors[midi->device_id].pub.opened) {
+ break;
+ }
+ usleep(500); /* 0.5ms */
+ }
+ pm_descriptors[midi->device_id].pub.opened = FALSE; /* force it */
}
-
- midi->descriptor = NULL;
- pm_free(midi->descriptor);
-
+ midi->api_info = NULL;
+ pm_free(info);
return err;
}
-static PmError
-midi_out_open(PmInternal *midi, void *driverInfo)
+static PmError midi_out_open(PmInternal *midi, void *driverInfo)
{
- midi_macosxcm_type m;
+ coremidi_info_type info;
+ int is_virtual = pm_descriptors[midi->device_id].pub.is_virtual;
- m = (midi_macosxcm_type) pm_alloc(sizeof(midi_macosxcm_node)); /* create */
- midi->descriptor = m;
- if (!m) {
+ info = create_macosxcm_info(is_virtual, FALSE);
+ if (midi->device_id <= MAX_IAC_NUM) {
+ info->isIACdevice = isIAC[midi->device_id];
+ CM_DEBUG printf("midi_out_open isIACdevice %d\n", info->isIACdevice);
+ }
+ midi->api_info = info;
+ if (!info) {
return pmInsufficientMemory;
}
- m->error[0] = 0;
- m->callback_error[0] = 0;
- m->sync_time = 0;
- m->delta = 0;
- m->last_time = 0;
- m->first_message = TRUE;
- m->sysex_mode = FALSE;
- m->sysex_word = 0;
- m->sysex_byte_count = 0;
- m->packetList = (MIDIPacketList *) m->packetBuffer;
- m->packet = NULL;
- m->last_command = 0;
- m->last_msg_length = 0;
- m->min_next_time = 0;
- m->byte_count = 0;
- m->us_per_host_tick = 1000000.0 / AudioGetHostClockFrequency();
- m->host_ticks_per_byte = (UInt64) (1000000.0 /
- (m->us_per_host_tick * MAX_BYTES_PER_S));
return pmNoError;
}
-static PmError
-midi_out_close(PmInternal *midi)
+static PmError midi_out_close(PmInternal *midi)
{
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- if (!m) return pmBadPtr;
-
- midi->descriptor = NULL;
- pm_free(midi->descriptor);
-
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ if (!info) return pmBadPtr;
+ midi->api_info = NULL;
+ pm_free(info);
return pmNoError;
}
-static PmError
-midi_abort(PmInternal *midi)
+
+/* MIDIDestinationCreate apparently cannot create a virtual device
+ * without a callback and a "refCon" parameter, but when we create
+ * a virtual device, we do not want a PortMidi stream yet -- that
+ * should wait for the user to open the stream. So, for the refCon,
+ * use the PortMidi device ID. The callback will check if the
+ * device is opened within PortMidi, and if so, use the pm_descriptors
+ * table to locate the corresponding PmStream.
+ */
+static PmError midi_create_virtual(int is_input, const char *name,
+ void *device_info)
{
- PmError err = pmNoError;
OSStatus macHostError;
- MIDIEndpointRef endpoint =
- (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor;
- macHostError = MIDIFlushOutput(endpoint);
+ MIDIEndpointRef endpoint;
+ CFStringRef nameRef;
+ PmDeviceID id = pm_add_device("CoreMIDI", name, is_input, TRUE, NULL,
+ (is_input ? &pm_macosx_in_dictionary :
+ &pm_macosx_out_dictionary));
+ if (id < 0) { /* error -- out of memory or name conflict? */
+ return id;
+ }
+
+ nameRef = CFStringCreateWithCString(NULL, name, kCFStringEncodingASCII);
+ if (is_input) {
+ macHostError = MIDIDestinationCreate(client, nameRef,
+ virtual_read_callback, (void *) (intptr_t) id,
+ &endpoint);
+ } else {
+ macHostError = MIDISourceCreate(client, nameRef, &endpoint);
+ }
+ CFRelease(nameRef);
+
if (macHostError != noErr) {
- pm_hosterror = macHostError;
- sprintf(pm_hosterror_text,
- "Host error %ld: MIDIFlushOutput()", (long) macHostError);
- err = pmHostError;
+ /* undo the device we just allocated */
+ pm_undo_add_device(id);
+ return check_hosterror(macHostError, (is_input ?
+ "MIDIDestinationCreate() in midi_create_virtual()" :
+ "MIDISourceCreate() in midi_create_virtual()"));
}
- return err;
+ pm_descriptors[id].descriptor = (void *) (intptr_t) endpoint;
+ return id;
}
-static PmError
-midi_write_flush(PmInternal *midi, PmTimestamp timestamp)
+static PmError midi_delete_virtual(PmDeviceID id)
{
+ MIDIEndpointRef endpoint;
OSStatus macHostError;
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- MIDIEndpointRef endpoint =
- (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor;
- assert(m);
+ PmError err = pmNoError;
+
+ endpoint = (MIDIEndpointRef) (long) pm_descriptors[id].descriptor;
+ if (endpoint == NULL_REF) {
+ return pmBadPtr;
+ }
+ macHostError = MIDIEndpointDispose(endpoint);
+ return check_hosterror(macHostError,
+ "MIDIEndpointDispose() in midi_in_close()");
+}
+
+
+static PmError midi_abort(PmInternal *midi)
+{
+ PmError err = pmNoError;
+ OSStatus macHostError;
+ MIDIEndpointRef endpoint = (MIDIEndpointRef) (intptr_t)
+ pm_descriptors[midi->device_id].descriptor;
+ macHostError = MIDIFlushOutput(endpoint);
+ return check_hosterror(macHostError,
+ "MIDIFlushOutput() in midi_abort()");
+}
+
+
+static PmError midi_write_flush(PmInternal *midi, PmTimestamp timestamp)
+{
+ OSStatus macHostError = noErr;
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ MIDIEndpointRef endpoint = (MIDIEndpointRef) (intptr_t)
+ pm_descriptors[midi->device_id].descriptor;
+ assert(info);
assert(endpoint);
- if (m->packet != NULL) {
+ if (info->packet != NULL) {
/* out of space, send the buffer and start refilling it */
- /* before we can send, maybe delay to limit data rate. OS X allows
- * 15KB/s. */
- UInt64 now = AudioGetCurrentHostTime();
- if (now < m->min_next_time) {
- usleep((useconds_t)
- ((m->min_next_time - now) * m->us_per_host_tick));
+ /* update min_next_time each flush to support rate limit */
+ UInt64 host_now = AudioGetCurrentHostTime();
+ if (host_now > info->min_next_time)
+ info->min_next_time = host_now;
+ if (info->is_virtual) {
+ macHostError = MIDIReceived(endpoint, info->packetList);
+ } else {
+ macHostError = MIDISend(portOut, endpoint, info->packetList);
}
- macHostError = MIDISend(portOut, endpoint, m->packetList);
- m->packet = NULL; /* indicate no data in packetList now */
- m->min_next_time = now + m->byte_count * m->host_ticks_per_byte;
- m->byte_count = 0;
- if (macHostError != noErr) goto send_packet_error;
+ info->packet = NULL; /* indicate no data in packetList now */
}
- return pmNoError;
-
-send_packet_error:
- pm_hosterror = macHostError;
- sprintf(pm_hosterror_text,
- "Host error %ld: MIDISend() in midi_write()",
- (long) macHostError);
- return pmHostError;
-
+ return check_hosterror(macHostError, (info->is_virtual ?
+ "MIDIReceived() in midi_write()" :
+ "MIDISend() in midi_write()"));
}
-static PmError
-send_packet(PmInternal *midi, Byte *message, unsigned int messageLength,
- MIDITimeStamp timestamp)
+static PmError send_packet(PmInternal *midi, Byte *message,
+ unsigned int messageLength, MIDITimeStamp timestamp)
{
PmError err;
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- assert(m);
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ assert(info);
- /* printf("add %d to packet %p len %d\n", message[0], m->packet, messageLength); */
- m->packet = MIDIPacketListAdd(m->packetList, sizeof(m->packetBuffer),
- m->packet, timestamp, messageLength,
- message);
- m->byte_count += messageLength;
- if (m->packet == NULL) {
+ CM_DEBUG printf("add %d to packet %p len %d timestamp %lld @ %lld ns "
+ "(host %lld)\n",
+ message[0], info->packet, messageLength, timestamp,
+ AudioConvertHostTimeToNanos(AudioGetCurrentHostTime()),
+ AudioGetCurrentHostTime());
+ info->packet = MIDIPacketListAdd(info->packetList,
+ sizeof(info->packetBuffer), info->packet,
+ timestamp, messageLength, message);
+#if defined(LIMIT_SEND_RATE) && (LIMIT_SEND_RATE != 0)
+ info->byte_count += messageLength;
+#endif
+ if (info->packet == NULL) {
/* out of space, send the buffer and start refilling it */
/* make midi->packet non-null to fool midi_write_flush into sending */
- m->packet = (MIDIPacket *) 4;
+ info->packet = (MIDIPacket *) 4;
/* timestamp is 0 because midi_write_flush ignores timestamp since
* timestamps are already in packets. The timestamp parameter is here
* because other API's need it. midi_write_flush can be called
* from system-independent code that must be cross-API.
*/
if ((err = midi_write_flush(midi, 0)) != pmNoError) return err;
- m->packet = MIDIPacketListInit(m->packetList);
- assert(m->packet); /* if this fails, it's a programming error */
- m->packet = MIDIPacketListAdd(m->packetList, sizeof(m->packetBuffer),
- m->packet, timestamp, messageLength,
- message);
- assert(m->packet); /* can't run out of space on first message */
+ info->packet = MIDIPacketListInit(info->packetList);
+ assert(info->packet); /* if this fails, it's a programming error */
+ info->packet = MIDIPacketListAdd(info->packetList,
+ sizeof(info->packetBuffer), info->packet,
+ timestamp, messageLength, message);
+ assert(info->packet); /* can't run out of space on first message */
}
return pmNoError;
}
-static PmError
-midi_write_short(PmInternal *midi, PmEvent *event)
+static PmError midi_write_short(PmInternal *midi, PmEvent *event)
{
PmTimestamp when = event->timestamp;
PmMessage what = event->message;
MIDITimeStamp timestamp;
- UInt64 when_ns;
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
Byte message[4];
unsigned int messageLength;
- if (m->packet == NULL) {
- m->packet = MIDIPacketListInit(m->packetList);
+ if (info->packet == NULL) {
+ info->packet = MIDIPacketListInit(info->packetList);
/* this can never fail, right? failure would indicate something
unrecoverable */
- assert(m->packet);
+ assert(info->packet);
}
- /* compute timestamp */
- if (when == 0) when = midi->now;
- /* if latency == 0, midi->now is not valid. We will just set it to zero */
- if (midi->latency == 0) when = 0;
- when_ns = ((UInt64) (when + midi->latency) * (UInt64) 1000000) + m->delta;
- timestamp = (MIDITimeStamp) AudioConvertNanosToHostTime(when_ns);
+ /* PortMidi specifies that incoming timestamps are the receive
+ * time. Devices attach their receive times, but virtual devices
+ * do not. Instead, they pass along whatever timestamp was sent to
+ * them. We do not know if we are connected to real or virtual
+ * device. To avoid wild timestamps on the receiving end, we
+ * consider 2 cases: PortMidi timestamp is zero or latency is
+ * zero. Both mean send immediately, so we attach the current time
+ * which will go out immediately and arrive with a sensible
+ * timestamp (not zero and not zero mapped to the client's local
+ * time). Otherwise, we assume the timestamp is reasonable. It
+ * might be slighly in the past, but we pass it along after
+ * translation to MIDITimeStamp units.
+ *
+ * Compute timestamp: use current time if timestamp is zero or
+ * latency is zero. Both mean no timing and send immediately.
+ */
+ if (when == 0 || midi->latency == 0) {
+ timestamp = AudioGetCurrentHostTime();
+ } else { /* translate PortMidi time + latency to CoreMIDI time */
+ timestamp = ((UInt64) (when + midi->latency) * (UInt64) 1000000) +
+ info->delta;
+ timestamp = AudioConvertNanosToHostTime(timestamp);
+ }
message[0] = Pm_MessageStatus(what);
message[1] = Pm_MessageData1(what);
message[2] = Pm_MessageData2(what);
messageLength = midi_length(what);
-
- /* make sure we go foreward in time */
- if (timestamp < m->min_next_time) timestamp = m->min_next_time;
-
- #ifdef LIMIT_RATE
- if (timestamp < m->last_time)
- timestamp = m->last_time;
- m->last_time = timestamp + messageLength * m->host_ticks_per_byte;
- #endif
+#ifdef LIMIT_RATE
+ /* Make sure we go forward in time. */
+ if (timestamp < info->min_next_time) {
+ timestamp = info->min_next_time;
+ }
+ /* Note that if application is way behind and slowly catching up, then
+ * timestamps could be increasing faster than real time, and since
+ * timestamps are used to estimate data rate, our estimate could be
+ * low, causing CoreMIDI to drop packets. This seems very unlikely.
+ */
+ if (info->isIACdevice || info->is_virtual) {
+ info->min_next_time = timestamp + messageLength *
+ info->host_ticks_per_byte;
+ }
+#endif
/* Add this message to the packet list */
return send_packet(midi, message, messageLength, timestamp);
}
-static PmError
-midi_begin_sysex(PmInternal *midi, PmTimestamp when)
+static PmError midi_begin_sysex(PmInternal *midi, PmTimestamp when)
{
UInt64 when_ns;
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- assert(m);
- m->sysex_byte_count = 0;
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ assert(info);
+ info->sysex_byte_count = 0;
/* compute timestamp */
if (when == 0) when = midi->now;
/* if latency == 0, midi->now is not valid. We will just set it to zero */
if (midi->latency == 0) when = 0;
- when_ns = ((UInt64) (when + midi->latency) * (UInt64) 1000000) + m->delta;
- m->sysex_timestamp = (MIDITimeStamp) AudioConvertNanosToHostTime(when_ns);
+ when_ns = ((UInt64) (when + midi->latency) * (UInt64) 1000000) +
+ info->delta;
+ info->sysex_timestamp =
+ (MIDITimeStamp) AudioConvertNanosToHostTime(when_ns);
+ UInt64 now; /* only make system time call when writing a virtual port */
+ if (info->is_virtual && info->sysex_timestamp <
+ (now = AudioGetCurrentHostTime())) {
+ info->sysex_timestamp = now;
+ }
- if (m->packet == NULL) {
- m->packet = MIDIPacketListInit(m->packetList);
+ if (info->packet == NULL) {
+ info->packet = MIDIPacketListInit(info->packetList);
/* this can never fail, right? failure would indicate something
unrecoverable */
- assert(m->packet);
+ assert(info->packet);
}
return pmNoError;
}
-static PmError
-midi_end_sysex(PmInternal *midi, PmTimestamp when)
+static PmError midi_end_sysex(PmInternal *midi, PmTimestamp when)
{
PmError err;
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- assert(m);
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ assert(info);
+#ifdef LIMIT_RATE
/* make sure we go foreward in time */
- if (m->sysex_timestamp < m->min_next_time)
- m->sysex_timestamp = m->min_next_time;
-
- #ifdef LIMIT_RATE
- if (m->sysex_timestamp < m->last_time)
- m->sysex_timestamp = m->last_time;
- m->last_time = m->sysex_timestamp + m->sysex_byte_count *
- m->host_ticks_per_byte;
- #endif
+ if (info->sysex_timestamp < info->min_next_time)
+ info->sysex_timestamp = info->min_next_time;
+
+ if (info->isIACdevice) {
+ info->min_next_time = info->sysex_timestamp + info->sysex_byte_count *
+ info->host_ticks_per_byte;
+ }
+#endif
/* now send what's in the buffer */
- err = send_packet(midi, m->sysex_buffer, m->sysex_byte_count,
- m->sysex_timestamp);
- m->sysex_byte_count = 0;
+ err = send_packet(midi, info->sysex_buffer, info->sysex_byte_count,
+ info->sysex_timestamp);
+ info->sysex_byte_count = 0;
if (err != pmNoError) {
- m->packet = NULL; /* flush everything in the packet list */
- return err;
+ info->packet = NULL; /* flush everything in the packet list */
}
- return pmNoError;
+ return err;
}
-static PmError
-midi_write_byte(PmInternal *midi, unsigned char byte, PmTimestamp timestamp)
+static PmError midi_write_byte(PmInternal *midi, unsigned char byte,
+ PmTimestamp timestamp)
{
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- assert(m);
- if (m->sysex_byte_count >= SYSEX_BUFFER_SIZE) {
+ coremidi_info_type info = (coremidi_info_type) midi->api_info;
+ assert(info);
+ if (info->sysex_byte_count >= SYSEX_BUFFER_SIZE) {
PmError err = midi_end_sysex(midi, timestamp);
if (err != pmNoError) return err;
}
- m->sysex_buffer[m->sysex_byte_count++] = byte;
+ info->sysex_buffer[info->sysex_byte_count++] = byte;
return pmNoError;
}
-static PmError
-midi_write_realtime(PmInternal *midi, PmEvent *event)
+static PmError midi_write_realtime(PmInternal *midi, PmEvent *event)
{
/* to send a realtime message during a sysex message, first
flush all pending sysex bytes into packet list */
@@ -660,27 +943,10 @@ midi_write_realtime(PmInternal *midi, PmEvent *event)
return midi_write_short(midi, event);
}
-static unsigned int midi_has_host_error(PmInternal *midi)
-{
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- return (m->callback_error[0] != 0) || (m->error[0] != 0);
-}
-
-static void midi_get_host_error(PmInternal *midi, char *msg, unsigned int len)
+static unsigned int midi_check_host_error(PmInternal *midi)
{
- midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor;
- msg[0] = 0; /* initialize to empty string */
- if (m) { /* make sure there is an open device to examine */
- if (m->error[0]) {
- strncpy(msg, m->error, len);
- m->error[0] = 0; /* clear the error */
- } else if (m->callback_error[0]) {
- strncpy(msg, m->callback_error, len);
- m->callback_error[0] = 0; /* clear the error */
- }
- msg[len - 1] = 0; /* make sure string is terminated */
- }
+ return FALSE;
}
@@ -695,6 +961,7 @@ MIDITimeStamp timestamp_pm_to_cm(PmTimestamp timestamp)
}
}
+
PmTimestamp timestamp_cm_to_pm(MIDITimeStamp timestamp)
{
UInt64 nanos;
@@ -708,179 +975,170 @@ PmTimestamp timestamp_cm_to_pm(MIDITimeStamp timestamp)
//////////////////////////////////////
// Obtain the name of an endpoint without regard for whether it has connections.
// The result should be released by the caller.
-CFStringRef EndpointName(MIDIEndpointRef endpoint, bool isExternal)
+CFStringRef EndpointName(MIDIEndpointRef endpoint, bool isExternal, int *isIAC)
{
- CFMutableStringRef result = CFStringCreateMutable(NULL, 0);
- CFStringRef str;
-
- // begin with the endpoint's name
- str = NULL;
- MIDIObjectGetStringProperty(endpoint, kMIDIPropertyName, &str);
- if (str != NULL) {
- CFStringAppend(result, str);
- CFRelease(str);
- }
+ CFMutableStringRef result = CFStringCreateMutable(NULL, 0);
+ CFStringRef str;
+ *isIAC = FALSE;
- MIDIEntityRef entity = NULL_REF;
- MIDIEndpointGetEntity(endpoint, &entity);
- if (entity == NULL_REF)
- // probably virtual
- return result;
-
- if (CFStringGetLength(result) == 0) {
- // endpoint name has zero length -- try the entity
+ // begin with the endpoint's name
str = NULL;
- MIDIObjectGetStringProperty(entity, kMIDIPropertyName, &str);
+ MIDIObjectGetStringProperty(endpoint, kMIDIPropertyName, &str);
if (str != NULL) {
- CFStringAppend(result, str);
- CFRelease(str);
- }
- }
- // now consider the device's name
- MIDIDeviceRef device = NULL_REF;
- MIDIEntityGetDevice(entity, &device);
- if (device == NULL_REF)
- return result;
-
- str = NULL;
- MIDIObjectGetStringProperty(device, kMIDIPropertyName, &str);
- if (CFStringGetLength(result) == 0) {
- CFRelease(result);
- return str;
- }
- if (str != NULL) {
- // if an external device has only one entity, throw away
- // the endpoint name and just use the device name
- if (isExternal && MIDIDeviceGetNumberOfEntities(device) < 2) {
- CFRelease(result);
- return str;
- } else {
- if (CFStringGetLength(str) == 0) {
+ CFStringAppend(result, str);
CFRelease(str);
+ }
+ MIDIEntityRef entity = NULL_REF;
+ MIDIEndpointGetEntity(endpoint, &entity);
+ if (entity == NULL_REF) {
+ // probably virtual
return result;
- }
- // does the entity name already start with the device name?
- // (some drivers do this though they shouldn't)
- // if so, do not prepend
- if (CFStringCompareWithOptions( result, /* endpoint name */
- str /* device name */,
- CFRangeMake(0, CFStringGetLength(str)), 0) != kCFCompareEqualTo) {
- // prepend the device name to the entity name
- if (CFStringGetLength(result) > 0)
- CFStringInsert(result, 0, CFSTR(" "));
- CFStringInsert(result, 0, str);
- }
- CFRelease(str);
- }
- }
- return result;
-}
-
+ }
+ if (!isExternal) { /* detect IAC devices */
+ //extern const CFStringRef kMIDIPropertyDriverOwner;
+ MIDIObjectGetStringProperty(entity, kMIDIPropertyDriverOwner, &str);
+ if (str != NULL) {
+ char s[32]; /* driver name may truncate, but that's OK */
+ CFStringGetCString(str, s, 31, kCFStringEncodingUTF8);
+ s[31] = 0; /* make sure it is terminated just to be safe */
+ CM_DEBUG printf("driver %s\n", s);
+ *isIAC = (strcmp(s, "com.apple.AppleMIDIIACDriver") == 0);
+ }
+ }
-// Obtain the name of an endpoint, following connections.
-// The result should be released by the caller.
-static CFStringRef ConnectedEndpointName(MIDIEndpointRef endpoint)
-{
- CFMutableStringRef result = CFStringCreateMutable(NULL, 0);
- CFStringRef str;
- OSStatus err;
- long i;
-
- // Does the endpoint have connections?
- CFDataRef connections = NULL;
- long nConnected = 0;
- bool anyStrings = false;
- err = MIDIObjectGetDataProperty(endpoint, kMIDIPropertyConnectionUniqueID, &connections);
- if (connections != NULL) {
- // It has connections, follow them
- // Concatenate the names of all connected devices
- nConnected = CFDataGetLength(connections) / (int32_t) sizeof(MIDIUniqueID);
- if (nConnected) {
- const SInt32 *pid = (const SInt32 *)(CFDataGetBytePtr(connections));
- for (i = 0; i < nConnected; ++i, ++pid) {
- MIDIUniqueID id = EndianS32_BtoN(*pid);
- MIDIObjectRef connObject;
- MIDIObjectType connObjectType;
- err = MIDIObjectFindByUniqueID(id, &connObject, &connObjectType);
- if (err == noErr) {
- if (connObjectType == kMIDIObjectType_ExternalSource ||
- connObjectType == kMIDIObjectType_ExternalDestination) {
- // Connected to an external device's endpoint (10.3 and later).
- str = EndpointName((MIDIEndpointRef)(connObject), true);
- } else {
- // Connected to an external device (10.2) (or something else, catch-all)
- str = NULL;
- MIDIObjectGetStringProperty(connObject, kMIDIPropertyName, &str);
- }
- if (str != NULL) {
- if (anyStrings)
- CFStringAppend(result, CFSTR(", "));
- else anyStrings = true;
+ if (CFStringGetLength(result) == 0) {
+ // endpoint name has zero length -- try the entity
+ str = NULL;
+ MIDIObjectGetStringProperty(entity, kMIDIPropertyName, &str);
+ if (str != NULL) {
CFStringAppend(result, str);
CFRelease(str);
- }
}
- }
}
- CFRelease(connections);
- }
- if (anyStrings)
- return result;
+ // now consider the device's name
+ MIDIDeviceRef device = NULL_REF;
+ MIDIEntityGetDevice(entity, &device);
+ if (device == NULL_REF)
+ return result;
- // Here, either the endpoint had no connections, or we failed to obtain names for any of them.
- return EndpointName(endpoint, false);
+ str = NULL;
+ MIDIObjectGetStringProperty(device, kMIDIPropertyName, &str);
+ if (CFStringGetLength(result) == 0) {
+ CFRelease(result);
+ return str;
+ }
+ if (str != NULL) {
+ // if an external device has only one entity, throw away
+ // the endpoint name and just use the device name
+ if (isExternal && MIDIDeviceGetNumberOfEntities(device) < 2) {
+ CFRelease(result);
+ return str;
+ } else {
+ if (CFStringGetLength(str) == 0) {
+ CFRelease(str);
+ return result;
+ }
+ // does the entity name already start with the device name?
+ // (some drivers do this though they shouldn't)
+ // if so, do not prepend
+ if (CFStringCompareWithOptions(result, /* endpoint name */
+ str, /* device name */
+ CFRangeMake(0, CFStringGetLength(str)), 0) !=
+ kCFCompareEqualTo) {
+ // prepend the device name to the entity name
+ if (CFStringGetLength(result) > 0)
+ CFStringInsert(result, 0, CFSTR(" "));
+ CFStringInsert(result, 0, str);
+ }
+ CFRelease(str);
+ }
+ }
+ return result;
}
-char* cm_get_full_endpoint_name(MIDIEndpointRef endpoint)
+// Obtain the name of an endpoint, following connections.
+// The result should be released by the caller.
+static CFStringRef ConnectedEndpointName(MIDIEndpointRef endpoint, int *isIAC)
{
-#ifdef OLDCODE
- MIDIEntityRef entity;
- MIDIDeviceRef device;
+ CFMutableStringRef result = CFStringCreateMutable(NULL, 0);
+ CFStringRef str;
+ OSStatus err;
+ long i;
+
+ // Does the endpoint have connections?
+ CFDataRef connections = NULL;
+ long nConnected = 0;
+ bool anyStrings = false;
+ err = MIDIObjectGetDataProperty(endpoint, kMIDIPropertyConnectionUniqueID,
+ &connections);
+ if (connections != NULL) {
+ // It has connections, follow them
+ // Concatenate the names of all connected devices
+ nConnected = CFDataGetLength(connections) /
+ (int32_t) sizeof(MIDIUniqueID);
+ if (nConnected) {
+ const SInt32 *pid = (const SInt32 *)(CFDataGetBytePtr(connections));
+ for (i = 0; i < nConnected; ++i, ++pid) {
+ MIDIUniqueID id = EndianS32_BtoN(*pid);
+ MIDIObjectRef connObject;
+ MIDIObjectType connObjectType;
+ err = MIDIObjectFindByUniqueID(id, &connObject,
+ &connObjectType);
+ if (err == noErr) {
+ if (connObjectType == kMIDIObjectType_ExternalSource ||
+ connObjectType == kMIDIObjectType_ExternalDestination) {
+ // Connected to an external device's endpoint (>=10.3)
+ str = EndpointName((MIDIEndpointRef)(connObject), true,
+ isIAC);
+ } else {
+ // Connected to an external device (10.2)
+ // (or something else, catch-all)
+ str = NULL;
+ MIDIObjectGetStringProperty(connObject,
+ kMIDIPropertyName, &str);
+ }
+ if (str != NULL) {
+ if (anyStrings)
+ CFStringAppend(result, CFSTR(", "));
+ else anyStrings = true;
+ CFStringAppend(result, str);
+ CFRelease(str);
+ }
+ }
+ }
+ }
+ CFRelease(connections);
+ }
+ if (anyStrings)
+ return result; // caller should release result
- CFStringRef endpointName = NULL;
- CFStringRef deviceName = NULL;
-#endif
- CFStringRef fullName = NULL;
- CFStringEncoding defaultEncoding;
- char* newName;
+ CFRelease(result);
- /* get the default string encoding */
- defaultEncoding = CFStringGetSystemEncoding();
+ // Here, either the endpoint had no connections, or we failed to
+ // obtain names for any of them.
+ return EndpointName(endpoint, false, isIAC);
+}
- fullName = ConnectedEndpointName(endpoint);
-
-#ifdef OLDCODE
- /* get the entity and device info */
- MIDIEndpointGetEntity(endpoint, &entity);
- MIDIEntityGetDevice(entity, &device);
- /* create the nicely formated name */
- MIDIObjectGetStringProperty(endpoint, kMIDIPropertyName, &endpointName);
- MIDIObjectGetStringProperty(device, kMIDIPropertyName, &deviceName);
- if (deviceName != NULL) {
- fullName = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@: %@"),
- deviceName, endpointName);
- } else {
- fullName = endpointName;
- }
-#endif
- /* copy the string into our buffer */
- newName = (char *) malloc(CFStringGetLength(fullName) + 1);
- CFStringGetCString(fullName, newName, CFStringGetLength(fullName) + 1,
- defaultEncoding);
+char *cm_get_full_endpoint_name(MIDIEndpointRef endpoint, int *isIAC)
+{
+ /* Thanks to Dan Wilcox for fixes for Unicode handling */
+ CFStringRef fullName = ConnectedEndpointName(endpoint, isIAC);
+ CFIndex utf16_len = CFStringGetLength(fullName) + 1;
+ CFIndex max_byte_len = CFStringGetMaximumSizeForEncoding(
+ utf16_len, kCFStringEncodingUTF8) + 1;
+ char* pmname = (char *) pm_alloc(CFStringGetLength(fullName) + 1);
+
+ /* copy the string into our buffer; note that there may be some wasted
+ space, but the total waste is not large */
+ CFStringGetCString(fullName, pmname, max_byte_len, kCFStringEncodingUTF8);
/* clean up */
-#ifdef OLDCODE
- if (endpointName) CFRelease(endpointName);
- if (deviceName) CFRelease(deviceName);
-#endif
if (fullName) CFRelease(fullName);
-
- return newName;
+ return pmname;
}
-
pm_fns_node pm_macosx_in_dictionary = {
none_write_short,
@@ -894,8 +1152,7 @@ pm_fns_node pm_macosx_in_dictionary = {
midi_abort,
midi_in_close,
success_poll,
- midi_has_host_error,
- midi_get_host_error,
+ midi_check_host_error
};
pm_fns_node pm_macosx_out_dictionary = {
@@ -910,23 +1167,50 @@ pm_fns_node pm_macosx_out_dictionary = {
midi_abort,
midi_out_close,
success_poll,
- midi_has_host_error,
- midi_get_host_error,
+ midi_check_host_error
};
+/* We do nothing with callbacks, but generating the callbacks also
+ * updates CoreMIDI state. Callback may not be essential, but calling
+ * the CFRunLoopRunInMode is necessary.
+ */
+void cm_notify(const MIDINotification *msg, void *refCon)
+{
+ /* for debugging, trace change notifications:
+ const char *descr[] = {
+ "undefined (0)",
+ "kMIDIMsgSetupChanged",
+ "kMIDIMsgObjectAdded",
+ "kMIDIMsgObjectRemoved",
+ "kMIDIMsgPropertyChanged",
+ "kMIDIMsgThruConnectionsChanged",
+ "kMIDIMsgSerialPortOwnerChanged",
+ "kMIDIMsgIOError"};
+
+ printf("MIDI Notify, messageID %d (%s)\n", (int) msg->messageID,
+ descr[(int) msg->messageID]);
+ */
+ return;
+}
+
+
PmError pm_macosxcm_init(void)
{
ItemCount numInputs, numOutputs, numDevices;
MIDIEndpointRef endpoint;
int i;
- OSStatus macHostError;
- char *error_text;
+ OSStatus macHostError = noErr;
+ const char *error_text;
+
+ memset(isIAC, 0, sizeof(isIAC)); /* initialize all FALSE */
+
+ /* Register interface CoreMIDI with create_virtual fn */
+ pm_add_interf("CoreMIDI", &midi_create_virtual, &midi_delete_virtual);
+ /* no check for error return because this always succeeds */
/* Determine the number of MIDI devices on the system */
numDevices = MIDIGetNumberOfDevices();
- numInputs = MIDIGetNumberOfSources();
- numOutputs = MIDIGetNumberOfDestinations();
/* Return prematurely if no devices exist on the system
Note that this is not an error. There may be no devices.
@@ -937,74 +1221,88 @@ PmError pm_macosxcm_init(void)
return pmNoError;
}
-
/* Initialize the client handle */
- macHostError = MIDIClientCreate(CFSTR("PortMidi"), NULL, NULL, &client);
+ if (client == NULL_REF) {
+ macHostError = MIDIClientCreate(CFSTR("PortMidi"), &cm_notify, NULL,
+ &client);
+ } else { /* see notes above on device scanning */
+ for (int i = 0; i < 100; i++) {
+ // look for any changes before scanning for devices
+ CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
+ if (i % 5 == 0) Pt_Sleep(1); /* insert 20 delays */
+ }
+ }
if (macHostError != noErr) {
- error_text = (char *)"MIDIClientCreate() in pm_macosxcm_init()";
+ error_text = "MIDIClientCreate() in pm_macosxcm_init()";
goto error_return;
}
+ numInputs = MIDIGetNumberOfSources();
+ numOutputs = MIDIGetNumberOfDestinations();
/* Create the input port */
- macHostError = MIDIInputPortCreate(client, CFSTR("Input port"), readProc,
- NULL, &portIn);
+ macHostError = MIDIInputPortCreate(client, CFSTR("Input port"),
+ device_read_callback, NULL, &portIn);
if (macHostError != noErr) {
- error_text = (char *)"MIDIInputPortCreate() in pm_macosxcm_init()";
+ error_text = "MIDIInputPortCreate() in pm_macosxcm_init()";
goto error_return;
}
-
+
/* Create the output port */
macHostError = MIDIOutputPortCreate(client, CFSTR("Output port"), &portOut);
if (macHostError != noErr) {
- error_text = (char *)"MIDIOutputPortCreate() in pm_macosxcm_init()";
+ error_text = "MIDIOutputPortCreate() in pm_macosxcm_init()";
goto error_return;
}
/* Iterate over the MIDI input devices */
for (i = 0; i < numInputs; i++) {
+ int isIACflag;
endpoint = MIDIGetSource(i);
if (endpoint == NULL_REF) {
continue;
}
-
/* set the first input we see to the default */
if (pm_default_input_device_id == -1)
- pm_default_input_device_id = pm_descriptor_index;
+ pm_default_input_device_id = pm_descriptor_len;
/* Register this device with PortMidi */
- pm_add_device((char *)"CoreMIDI", cm_get_full_endpoint_name(endpoint),
- TRUE, (void *) (long) endpoint, &pm_macosx_in_dictionary);
+ pm_add_device("CoreMIDI",
+ cm_get_full_endpoint_name(endpoint, &isIACflag), TRUE, FALSE,
+ (void *) (intptr_t) endpoint, &pm_macosx_in_dictionary);
}
/* Iterate over the MIDI output devices */
for (i = 0; i < numOutputs; i++) {
+ int isIACflag;
+ PmDeviceID id;
endpoint = MIDIGetDestination(i);
if (endpoint == NULL_REF) {
continue;
}
-
/* set the first output we see to the default */
if (pm_default_output_device_id == -1)
- pm_default_output_device_id = pm_descriptor_index;
+ pm_default_output_device_id = pm_descriptor_len;
/* Register this device with PortMidi */
- pm_add_device((char *)"CoreMIDI", cm_get_full_endpoint_name(endpoint),
- FALSE, (void *) (long) endpoint,
- &pm_macosx_out_dictionary);
+ id = pm_add_device("CoreMIDI",
+ cm_get_full_endpoint_name(endpoint, &isIACflag), FALSE, FALSE,
+ (void *) (intptr_t) endpoint, &pm_macosx_out_dictionary);
+ /* if this is an IAC device, tuck that info away for write functions */
+ if (isIACflag && id <= MAX_IAC_NUM) {
+ isIAC[id] = TRUE;
+ }
}
return pmNoError;
error_return:
- pm_hosterror = macHostError;
- sprintf(pm_hosterror_text, "Host error %ld: %s\n", (long) macHostError,
- error_text);
pm_macosxcm_term(); /* clear out any opened ports */
- return pmHostError;
+ return check_hosterror(macHostError, error_text);
}
void pm_macosxcm_term(void)
{
- if (client != NULL_REF) MIDIClientDispose(client);
+ /* docs say do not explicitly dispose of client
+ if (client != NULL_REF) MIDIClientDispose(client); */
if (portIn != NULL_REF) MIDIPortDispose(portIn);
if (portOut != NULL_REF) MIDIPortDispose(portOut);
}
diff --git a/3rdparty/portmidi/pm_mac/pmmacosxcm.h b/3rdparty/portmidi/pm_mac/pmmacosxcm.h
index ea79902d40b..ab8b5edbcb7 100644
--- a/3rdparty/portmidi/pm_mac/pmmacosxcm.h
+++ b/3rdparty/portmidi/pm_mac/pmmacosxcm.h
@@ -3,4 +3,4 @@
PmError pm_macosxcm_init(void);
void pm_macosxcm_term(void);
-PmDeviceID find_default_device(char *path, int input, PmDeviceID id);
+PmDeviceID find_default_device(const char *path, int input, PmDeviceID id);
diff --git a/3rdparty/portmidi/pm_mac/readbinaryplist.c b/3rdparty/portmidi/pm_mac/readbinaryplist.c
index c24a40a809e..9564e700d0b 100644
--- a/3rdparty/portmidi/pm_mac/readbinaryplist.c
+++ b/3rdparty/portmidi/pm_mac/readbinaryplist.c
@@ -3,26 +3,28 @@
readbinaryplist.c -- Roger B. Dannenberg, Jun 2008
Based on ReadBinaryPList.m by Jens Ayton, 2007
-Note that this code is intended to read preference files and has an upper
-bound on file size (currently 100MB) and assumes in some places that 32 bit
-offsets are sufficient.
+Note that this code is intended to read preference files and has an
+upper bound on file size (currently 100MB) and assumes in some places
+that 32 bit offsets are sufficient.
Here are his comments:
Reader for binary property list files (version 00).
-This has been found to work on all 566 binary plists in my ~/Library/Preferences/
-and /Library/Preferences/ directories. This probably does not provide full
-test coverage. It has also been found to provide different data to Apple's
-implementation when presented with a key-value archive. This is because Apple's
-implementation produces undocumented CFKeyArchiverUID objects. My implementation
-produces dictionaries instead, matching the in-file representation used in XML
-and OpenStep plists. See extract_uid().
-
-Full disclosure: in implementing this software, I read one comment and one
-struct defintion in CFLite, Apple's implementation, which is under the APSL
-license. I also deduced the information about CFKeyArchiverUID from that code.
-However, none of the implementation was copied.
+This has been found to work on all 566 binary plists in my
+~/Library/Preferences/ and /Library/Preferences/ directories. This
+probably does not provide full test coverage. It has also been found
+to provide different data to Apple's implementation when presented
+with a key-value archive. This is because Apple's implementation
+produces undocumented CFKeyArchiverUID objects. My implementation
+produces dictionaries instead, matching the in-file representation
+used in XML and OpenStep plists. See extract_uid().
+
+Full disclosure: in implementing this software, I read one comment and
+one struct defintion in CFLite, Apple's implementation, which is under
+the APSL license. I also deduced the information about
+CFKeyArchiverUID from that code. However, none of the implementation
+was copied.
Copyright (C) 2007 Jens Ayton
@@ -33,16 +35,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
@@ -72,21 +74,19 @@ memory requested or calls longjmp, so callers don't have to check.
*/
#include <sys/types.h>
-#include <sys/param.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <sys/stat.h>
#include "readbinaryplist.h"
-#include "osxsupport.h"
#include <Carbon/Carbon.h>
#define NO 0
#define YES 1
#define BOOL int
-//#define MAXPATHLEN 256
+#define MAX_PATH_LEN 256
/* there are 2 levels of error logging/printing:
* BPLIST_LOG and BPLIST_LOG_VERBOSE
@@ -99,22 +99,21 @@ memory requested or calls longjmp, so callers don't have to check.
* parameters like printf but might be a no-op.
*/
-#define BPLIST_LOG_VERBOSE 0
-#define BPLIST_LOG 0
+/* #define BPLIST_LOG_VERBOSE 1 */
-#if BPLIST_LOG_VERBOSE
+#if defined(BPLIST_LOG_VERBOSE) && (BPLIST_LOG_VERBOSE != 0)
#ifndef BPLIST_LOG
#define BPLIST_LOG 1
#endif
#endif
-#if BPLIST_LOG
+#if defined(BPLIST_LOG) && (BPLIST_LOG != 0)
#define bplist_log printf
#else
#define bplist_log(...)
#endif
-#if BPLIST_LOG_VERBOSE
+#if defined(BPLIST_LOG_VERBOSE) && (BPLIST_LOG_VERBOSE != 0)
#define bplist_log_verbose bplist_log
#else
#define bplist_log_verbose(...)
@@ -207,10 +206,12 @@ typedef struct bplist_info
static value_ptr bplist_read_pldata(pldata_ptr data);
-static value_ptr bplist_read_pref(char *filename, OSType folder_type);
-static uint64_t read_sized_int(bplist_info_ptr bplist, uint64_t offset, uint8_t size);
+static value_ptr bplist_read_pref(const char *filename, OSType folder_type);
+static uint64_t read_sized_int(bplist_info_ptr bplist, uint64_t offset,
+ uint8_t size);
static uint64_t read_offset(bplist_info_ptr bplist, uint64_t index);
-static BOOL read_self_sized_int(bplist_info_ptr bplist, uint64_t offset, uint64_t *outValue, size_t *outSize);
+static BOOL read_self_sized_int(bplist_info_ptr bplist, uint64_t offset,
+ uint64_t *outValue, size_t *outSize);
static value_ptr extract_object(bplist_info_ptr bplist, uint64_t objectRef);
static value_ptr extract_simple(bplist_info_ptr bplist, uint64_t offset);
@@ -219,7 +220,8 @@ static value_ptr extract_real(bplist_info_ptr bplist, uint64_t offset);
static value_ptr extract_date(bplist_info_ptr bplist, uint64_t offset);
static value_ptr extract_data(bplist_info_ptr bplist, uint64_t offset);
static value_ptr extract_ascii_string(bplist_info_ptr bplist, uint64_t offset);
-static value_ptr extract_unicode_string(bplist_info_ptr bplist, uint64_t offset);
+static value_ptr extract_unicode_string(bplist_info_ptr bplist,
+ uint64_t offset);
static value_ptr extract_uid(bplist_info_ptr bplist, uint64_t offset);
static value_ptr extract_array(bplist_info_ptr bplist, uint64_t offset);
static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset);
@@ -236,15 +238,18 @@ void value_set_integer(value_ptr v, int64_t i) {
v->tag = kTAG_INT; v->integer = i;
}
+
void value_set_real(value_ptr v, double d) {
v->tag = kTAG_REAL; v->real = d;
}
+
// d is seconds since 1 January 2001
void value_set_date(value_ptr v, double d) {
v->tag = kTAG_DATE; v->real = d;
}
+
void value_set_ascii_string(value_ptr v, const uint8_t *s, size_t len) {
v->tag = kTAG_ASCIISTRING;
v->string = (char *) allocate(len + 1);
@@ -252,6 +257,7 @@ void value_set_ascii_string(value_ptr v, const uint8_t *s, size_t len) {
v->string[len] = 0;
}
+
void value_set_unicode_string(value_ptr v, const uint8_t *s, size_t len) {
v->tag = kTAG_UNICODESTRING;
v->string = (char *) allocate(len + 1);
@@ -276,8 +282,10 @@ void value_set_data(value_ptr v, const uint8_t *data, size_t len) {
printf("value at %p gets data at %p\n", v, pldata);
}
+
// caller releases ownership of array to value_ptr v
-void value_set_array(value_ptr v, value_ptr *array, size_t length) {
+void value_set_array(value_ptr v, value_ptr *array, size_t length)
+{
array_ptr a = (array_ptr) allocate(sizeof(array_node));
a->array = array;
a->length = length;
@@ -285,8 +293,10 @@ void value_set_array(value_ptr v, value_ptr *array, size_t length) {
v->array = a;
}
+
// caller releases ownership of dict to value_ptr v
-void value_set_dict(value_ptr v, dict_ptr dict) {
+void value_set_dict(value_ptr v, dict_ptr dict)
+{
v->tag = kTAG_DICTIONARY;
v->dict = dict;
}
@@ -334,7 +344,7 @@ BOOL is_binary_plist(pldata_ptr data)
}
-value_ptr bplist_read_file(char *filename)
+value_ptr bplist_read_file(const char *filename)
{
struct stat stbuf;
pldata_node pldata;
@@ -343,7 +353,7 @@ value_ptr bplist_read_file(char *filename)
value_ptr value;
int rslt = stat(filename, &stbuf);
if (rslt) {
- #if BPLIST_LOG
+ #if defined(BPLIST_LOG) && (BPLIST_LOG != 0)
perror("in stat");
#endif
bplist_log("Could not stat %s, error %d\n", filename, rslt);
@@ -380,12 +390,11 @@ value_ptr bplist_read_file(char *filename)
return value;
}
-// use old Carbon method on PPC
-#ifdef OSX_PPC
-value_ptr bplist_read_pref(char *filename, OSType folder_type)
+
+value_ptr bplist_read_pref(const char *filename, OSType folder_type)
{
FSRef prefdir;
- char cstr[MAXPATHLEN];
+ char cstr[MAX_PATH_LEN];
OSErr err = FSFindFolder(kOnAppropriateDisk, folder_type,
FALSE, &prefdir);
@@ -393,57 +402,23 @@ value_ptr bplist_read_pref(char *filename, OSType folder_type)
bplist_log("Error finding preferences folder: %d\n", err);
return NULL;
}
- err = FSRefMakePath(&prefdir, (UInt8 *) cstr, (UInt32) (MAXPATHLEN - 1));
+ err = FSRefMakePath(&prefdir, (UInt8 *) cstr, (UInt32) (MAX_PATH_LEN - 1));
if (err) {
bplist_log("Error making path name for preferences folder: %d\n", err);
return NULL;
}
- strlcat(cstr, "/", MAXPATHLEN);
- strlcat(cstr, filename, MAXPATHLEN);
+ strlcat(cstr, "/", MAX_PATH_LEN);
+ strlcat(cstr, filename, MAX_PATH_LEN);
return bplist_read_file(cstr);
}
-#else
-value_ptr bplist_read_pref(char *filename, OSType folder_type)
-{
- char cstr[MAXPATHLEN];
- char *foundstr;
-
- memset(cstr, 0, MAXPATHLEN);
-
- // for later OS X, the user preferences folder (~/Library/Preferences) is not available directly from Cocoa,
- // Apple documentation suggests just using POSIX APIs like so.
- if (folder_type == kPreferencesFolderType)
- {
- strlcpy(cstr, getenv("HOME"), MAXPATHLEN);
- strlcat(cstr, "/Library/Preferences", MAXPATHLEN);
- }
- else // the system preferences folder (~/Library/PreferencePanes) is accessible from Cocoa however
- {
- foundstr = FindPrefsDir();
-
- if (!foundstr) {
- bplist_log("Error finding preferences folder\n");
- return NULL;
- }
-
- strlcat(cstr, foundstr, MAXPATHLEN);
- free(foundstr);
- foundstr = NULL;
- }
-
- strlcat(cstr, "/", MAXPATHLEN);
- strlcat(cstr, filename, MAXPATHLEN);
-
- return bplist_read_file(cstr);
-}
-#endif
-value_ptr bplist_read_system_pref(char *filename) {
+
+value_ptr bplist_read_system_pref(const char *filename) {
return bplist_read_pref(filename, kSystemPreferencesFolderType);
}
-value_ptr bplist_read_user_pref(char *filename) {
+value_ptr bplist_read_user_pref(const char *filename) {
return bplist_read_pref(filename, kPreferencesFolderType);
}
@@ -774,7 +749,7 @@ static value_ptr extract_date(bplist_info_ptr bplist, uint64_t offset)
uint64_t bplist_get_a_size(bplist_info_ptr bplist,
- uint64_t *offset_ptr, char *msg)
+ uint64_t *offset_ptr, const char *msg)
{
uint64_t size = bplist->data_bytes[*offset_ptr] & 0x0F;
(*offset_ptr)++;
@@ -814,7 +789,7 @@ static value_ptr extract_data(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length);
- if ((size = bplist_get_a_size(bplist, &offset, (char *)"data")) == UINT64_MAX)
+ if ((size = bplist_get_a_size(bplist, &offset, "data")) == UINT64_MAX)
return NULL;
value = value_create();
@@ -831,7 +806,7 @@ static value_ptr extract_ascii_string(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length);
- if ((size = bplist_get_a_size(bplist, &offset, (char *)"ascii string")) ==
+ if ((size = bplist_get_a_size(bplist, &offset, "ascii string")) ==
UINT64_MAX)
return NULL;
@@ -850,7 +825,7 @@ static value_ptr extract_unicode_string(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length);
- if ((size = bplist_get_a_size(bplist, &offset, (char *)"unicode string")) ==
+ if ((size = bplist_get_a_size(bplist, &offset, "unicode string")) ==
UINT64_MAX)
return NULL;
@@ -911,7 +886,7 @@ static value_ptr extract_array(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length);
- if ((count = bplist_get_a_size(bplist, &offset, (char *)"array")) == UINT64_MAX)
+ if ((count = bplist_get_a_size(bplist, &offset, "array")) == UINT64_MAX)
return NULL;
if (count > UINT64_MAX / bplist->object_ref_size - offset) {
@@ -973,7 +948,7 @@ static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset)
assert(bplist->data_bytes != NULL && offset < bplist->length);
- if ((count = bplist_get_a_size(bplist, &offset, (char *)"array")) == UINT64_MAX)
+ if ((count = bplist_get_a_size(bplist, &offset, "array")) == UINT64_MAX)
return NULL;
if (count > UINT64_MAX / (bplist->object_ref_size * 2) - offset) {
@@ -1037,7 +1012,7 @@ char *value_get_asciistring(value_ptr v)
}
-value_ptr value_dict_lookup_using_string(value_ptr v, char *key)
+value_ptr value_dict_lookup_using_string(value_ptr v, const char *key)
{
dict_ptr dict;
if (v->tag != kTAG_DICTIONARY) return NULL; // not a dictionary
@@ -1053,7 +1028,7 @@ value_ptr value_dict_lookup_using_string(value_ptr v, char *key)
return NULL; /* not found */
}
-value_ptr value_dict_lookup_using_path(value_ptr v, char *path)
+value_ptr value_dict_lookup_using_path(value_ptr v, const char *path)
{
char key[MAX_KEY_SIZE];
while (*path) { /* more to the path */
diff --git a/3rdparty/portmidi/pm_mac/readbinaryplist.h b/3rdparty/portmidi/pm_mac/readbinaryplist.h
index e82056a0b79..8b096d08e2e 100644
--- a/3rdparty/portmidi/pm_mac/readbinaryplist.h
+++ b/3rdparty/portmidi/pm_mac/readbinaryplist.h
@@ -71,16 +71,16 @@ typedef struct value_struct {
} value_node, *value_ptr;
-value_ptr bplist_read_file(char *filename);
-value_ptr bplist_read_user_pref(char *filename);
-value_ptr bplist_read_system_pref(char *filename);
+value_ptr bplist_read_file(const char *filename);
+value_ptr bplist_read_user_pref(const char *filename);
+value_ptr bplist_read_system_pref(const char *filename);
void bplist_free_data(void);
/*************** functions for accessing values ****************/
char *value_get_asciistring(value_ptr v);
-value_ptr value_dict_lookup_using_string(value_ptr v, char *key);
-value_ptr value_dict_lookup_using_path(value_ptr v, char *path);
+value_ptr value_dict_lookup_using_string(value_ptr v, const char *key);
+value_ptr value_dict_lookup_using_path(value_ptr v, const char *path);
/*************** functions for debugging ***************/
diff --git a/3rdparty/portmidi/pm_mingw/README-MINGW.txt b/3rdparty/portmidi/pm_mingw/README-MINGW.txt
deleted file mode 100644
index e01a7fed441..00000000000
--- a/3rdparty/portmidi/pm_mingw/README-MINGW.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-README-MINGW.txt -- note on MinGW and PortMidi
-
-Roger Dannenberg
-20 Sep 2010
-
-Fabian Rutte writes that CMake can build files for Code::Blocks
-under MinGW.
-
-I would guess that a simple Unix Makefile output from CMake would
-also work, but I haven't tested it.
-
diff --git a/3rdparty/portmidi/pm_mingw/eclipse/README.txt b/3rdparty/portmidi/pm_mingw/eclipse/README.txt
deleted file mode 100644
index 2b58e13ab17..00000000000
--- a/3rdparty/portmidi/pm_mingw/eclipse/README.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-These files, dot-cproject and dot-project, come from Philip Martin
-(posted on Media_api mailing list on September 3, 2008).
-He writes: "I do not have a makefile. I used Eclipse + CDT to build
-PortMidi using MinGw. ... The two files .project and .cproject I
-believe must be in the root of the portmidi tree to work with Eclipse.
-... I have only compiled the relevant sources into one .dll here."
-
-The .project and .cproject files have been renamed to dot-project and
-dot-cproject here to make them more visible. To use them, you will
-need to rename them to .project and .cproject, and probably move them
-to the portmidi tree root.
-
-At this time, no one is actively maintaining Eclipse or MinGw versions
-of PortMidi, so these files may be out-of-date or have other problems.
-Feel free to submit updates or discuss the possibility of maintaining
-these or some equivalent files for MinGw.
-
-Update, 20 Sep 2010: CMake supports Code::Blocks in conjunction with
-MinGW.
-
-Roger Dannenberg
-18-Oct-2008
-
diff --git a/3rdparty/portmidi/pm_mingw/eclipse/dot-cproject b/3rdparty/portmidi/pm_mingw/eclipse/dot-cproject
deleted file mode 100644
index 06b47e3f567..00000000000
--- a/3rdparty/portmidi/pm_mingw/eclipse/dot-cproject
+++ /dev/null
@@ -1,710 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 4.0.0?>
-
-<cproject>
-<storageModule moduleId="org.eclipse.cdt.core.settings">
-<cconfiguration id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004">
-<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004" moduleId="org.eclipse.cdt.core.settings" name="Debug">
-<externalSettings>
-<externalSetting>
-<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/PortMidi"/>
-<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/PortMidi/Debug"/>
-</externalSetting>
-</externalSettings>
-<extensions>
-<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-</extensions>
-</storageModule>
-<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-<configuration artifactExtension="dll" artifactName="PortMidi" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.so.debug">
-<folderInfo id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004." name="/" resourcePath="">
-<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.so.debug.1545417885" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.so.debug">
-<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.so.debug.415542300" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.so.debug"/>
-<builder buildPath="${workspace_loc:/PortMidi/Debug}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.592172807" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.so.debug.1889129808" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.so.debug">
-<option id="gnu.both.asm.option.flags.1498736889" name="Assembler flags" superClass="gnu.both.asm.option.flags"/>
-<option id="gnu.both.asm.option.include.paths.1734867019" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_common}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_win}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/porttime}&quot;"/>
-</option>
-<option id="gnu.both.asm.option.warnings.nowarn.1657300607" name="Suppress warnings (-W)" superClass="gnu.both.asm.option.warnings.nowarn"/>
-<option id="gnu.both.asm.option.version.1995252368" name="Announce version (-v)" superClass="gnu.both.asm.option.version"/>
-<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1250436110" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1211487028" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.debug.81091790" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.debug">
-<option id="gnu.cpp.compiler.mingw.so.debug.option.optimization.level.1750954034" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.so.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-<option id="gnu.cpp.compiler.mingw.so.debug.option.debugging.level.1357163228" name="Debug Level" superClass="gnu.cpp.compiler.mingw.so.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug.428547337" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug">
-<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.so.debug.option.optimization.level.1361318269" name="Optimization Level" superClass="gnu.c.compiler.mingw.so.debug.option.optimization.level" valueType="enumerated"/>
-<option id="gnu.c.compiler.mingw.so.debug.option.debugging.level.798971050" name="Debug Level" superClass="gnu.c.compiler.mingw.so.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-<option id="gnu.c.compiler.option.preprocessor.nostdinc.635731758" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc"/>
-<option id="gnu.c.compiler.option.preprocessor.preprocess.1129104455" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess"/>
-<option id="gnu.c.compiler.option.preprocessor.def.symbols.924940285" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"/>
-<option id="gnu.c.compiler.option.preprocessor.undef.symbol.1996330931" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" valueType="undefDefinedSymbols">
-<listOptionValue builtIn="false" value="_STDCALL_SUPPORTED"/>
-</option>
-<option id="gnu.c.compiler.option.include.paths.276080219" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_common}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_win}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/porttime}&quot;"/>
-</option>
-<option id="gnu.c.compiler.option.optimization.flags.1032442929" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags"/>
-<option id="gnu.c.compiler.option.debugging.other.509079500" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other"/>
-<option id="gnu.c.compiler.option.debugging.gprof.708510440" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof"/>
-<option id="gnu.c.compiler.option.debugging.prof.1379528770" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof"/>
-<option id="gnu.c.compiler.option.warnings.syntax.76950723" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax"/>
-<option id="gnu.c.compiler.option.warnings.pedantic.503180272" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic"/>
-<option id="gnu.c.compiler.option.warnings.pedantic.error.332437973" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error"/>
-<option id="gnu.c.compiler.option.warnings.nowarn.1830350073" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn"/>
-<option id="gnu.c.compiler.option.warnings.allwarn.77655170" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn"/>
-<option id="gnu.c.compiler.option.warnings.toerrors.1707691615" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors"/>
-<option id="gnu.c.compiler.option.misc.other.1929071594" name="Other flags" superClass="gnu.c.compiler.option.misc.other"/>
-<option id="gnu.c.compiler.option.misc.verbose.1368165423" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose"/>
-<option id="gnu.c.compiler.option.misc.ansi.1130235771" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi"/>
-<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.532732416" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.so.debug.2093989251" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.so.debug">
-<option defaultValue="true" id="gnu.c.link.mingw.so.debug.option.shared.210833175" name="Shared (-shared)" superClass="gnu.c.link.mingw.so.debug.option.shared" valueType="boolean"/>
-<option id="gnu.c.link.option.nostart.1109377759" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/>
-<option id="gnu.c.link.option.nodeflibs.1969639513" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/>
-<option id="gnu.c.link.option.nostdlibs.1939458836" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs"/>
-<option id="gnu.c.link.option.strip.1926939147" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/>
-<option id="gnu.c.link.option.noshared.1390204753" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/>
-<option id="gnu.c.link.option.libs.2043660134" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
-<listOptionValue builtIn="false" value="winmm"/>
-</option>
-<option id="gnu.c.link.option.paths.1702926265" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
-<option id="gnu.c.link.option.ldflags.1184725311" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-mwindows" valueType="string"/>
-<option id="gnu.c.link.option.other.2085141015" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/>
-<option id="gnu.c.link.option.userobjs.1490648701" name="Other objects" superClass="gnu.c.link.option.userobjs"/>
-<option id="gnu.c.link.option.soname.437120219" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname" value="PortMidi.dll" valueType="string"/>
-<option id="gnu.c.link.option.implname.205634723" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname" value="libPortMidi_dll.a" valueType="string"/>
-<option id="gnu.c.link.option.defname.571020719" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname" value="PortMidi_dll.def" valueType="string"/>
-<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.916986463" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-</inputType>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.debug.1822206806" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.debug">
-<option defaultValue="true" id="gnu.cpp.link.mingw.so.debug.option.shared.408251443" name="Shared (-shared)" superClass="gnu.cpp.link.mingw.so.debug.option.shared" valueType="boolean"/>
-</tool>
-</toolChain>
-</folderInfo>
-<sourceEntries>
-<entry excluding="pm_cl/|pm_linux/|pm_mac/|pm_test/|porttime/ptlinux.c|porttime/ptmacosx_cf.c|porttime/ptmacosx_mach.c" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
-</sourceEntries>
-</configuration>
-</storageModule>
-<storageModule moduleId="scannerConfiguration">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.release.413200248;cdt.managedbuild.config.gnu.mingw.so.release.413200248.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.343495978;cdt.managedbuild.tool.gnu.c.compiler.input.611335297">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-</scannerConfigBuildInfo>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004;cdt.managedbuild.config.gnu.mingw.so.debug.1580321004.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug.428547337;cdt.managedbuild.tool.gnu.c.compiler.input.532732416">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-</scannerConfigBuildInfo>
-</storageModule>
-<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
-</cconfiguration>
-<cconfiguration id="cdt.managedbuild.config.gnu.mingw.so.release.413200248">
-<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.so.release.413200248" moduleId="org.eclipse.cdt.core.settings" name="Release">
-<externalSettings>
-<externalSetting>
-<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/PortMidi"/>
-<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/PortMidi/Release"/>
-</externalSetting>
-</externalSettings>
-<extensions>
-<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-</extensions>
-</storageModule>
-<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-<configuration artifactExtension="dll" artifactName="PortMidi" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.so.release.413200248" name="Release" parent="cdt.managedbuild.config.gnu.mingw.so.release">
-<folderInfo id="cdt.managedbuild.config.gnu.mingw.so.release.413200248." name="/" resourcePath="">
-<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.so.release.965704931" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.so.release">
-<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.so.release.1343771960" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.so.release"/>
-<builder buildPath="${workspace_loc:/PortMidi/Release}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1650720234" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.so.release.1392864745" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.so.release">
-<option id="gnu.both.asm.option.include.paths.591264871" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_common}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_win}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/porttime}&quot;"/>
-</option>
-<option id="gnu.both.asm.option.flags.1143807089" superClass="gnu.both.asm.option.flags"/>
-<option id="gnu.both.asm.option.warnings.nowarn.1142377463" superClass="gnu.both.asm.option.warnings.nowarn"/>
-<option id="gnu.both.asm.option.version.1007025248" superClass="gnu.both.asm.option.version"/>
-<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754592443" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.503109969" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.release.1693369280" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.release">
-<option id="gnu.cpp.compiler.mingw.so.release.option.optimization.level.1169326010" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.so.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
-<option id="gnu.cpp.compiler.mingw.so.release.option.debugging.level.1197288488" name="Debug Level" superClass="gnu.cpp.compiler.mingw.so.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.343495978" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release">
-<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.so.release.option.optimization.level.79718900" name="Optimization Level" superClass="gnu.c.compiler.mingw.so.release.option.optimization.level" valueType="enumerated"/>
-<option id="gnu.c.compiler.mingw.so.release.option.debugging.level.778378875" name="Debug Level" superClass="gnu.c.compiler.mingw.so.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-<option id="gnu.c.compiler.option.include.paths.140256948" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_common}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/pm_win}&quot;"/>
-<listOptionValue builtIn="false" value="&quot;${workspace_loc:/PortMidi/porttime}&quot;"/>
-</option>
-<option id="gnu.c.compiler.option.preprocessor.def.symbols.960115196" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"/>
-<option id="gnu.c.compiler.option.preprocessor.undef.symbol.1891593123" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" valueType="undefDefinedSymbols">
-<listOptionValue builtIn="false" value="_STDCALL_SUPPORTED"/>
-</option>
-<option id="gnu.c.compiler.option.preprocessor.nostdinc.824573539" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc"/>
-<option id="gnu.c.compiler.option.preprocessor.preprocess.2045908914" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess"/>
-<option id="gnu.c.compiler.option.optimization.flags.1668114371" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags"/>
-<option id="gnu.c.compiler.option.debugging.other.26702882" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other"/>
-<option id="gnu.c.compiler.option.debugging.gprof.1849481872" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof"/>
-<option id="gnu.c.compiler.option.debugging.prof.370891777" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof"/>
-<option id="gnu.c.compiler.option.warnings.syntax.814238128" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax"/>
-<option id="gnu.c.compiler.option.warnings.pedantic.1130364543" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic"/>
-<option id="gnu.c.compiler.option.warnings.pedantic.error.1833423377" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error"/>
-<option id="gnu.c.compiler.option.warnings.nowarn.842847161" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn"/>
-<option id="gnu.c.compiler.option.warnings.allwarn.1245259653" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn"/>
-<option id="gnu.c.compiler.option.warnings.toerrors.329299856" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors"/>
-<option id="gnu.c.compiler.option.misc.other.1436833008" name="Other flags" superClass="gnu.c.compiler.option.misc.other"/>
-<option id="gnu.c.compiler.option.misc.verbose.1418051288" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose"/>
-<option id="gnu.c.compiler.option.misc.ansi.592723919" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi"/>
-<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.611335297" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release.556134685" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release">
-<option defaultValue="true" id="gnu.c.link.mingw.so.release.option.shared.1619560956" name="Shared (-shared)" superClass="gnu.c.link.mingw.so.release.option.shared" valueType="boolean"/>
-<option id="gnu.c.link.option.ldflags.1804407715" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-mwindows" valueType="string"/>
-<option id="gnu.c.link.option.soname.621315524" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname" value="PortMidi.dll" valueType="string"/>
-<option id="gnu.c.link.option.implname.236027258" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname" value="libPortMidi_dll.a" valueType="string"/>
-<option id="gnu.c.link.option.defname.1144978768" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname" value="PortMidi_dll.def" valueType="string"/>
-<option id="gnu.c.link.option.nostart.623404099" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/>
-<option id="gnu.c.link.option.nodeflibs.51119036" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/>
-<option id="gnu.c.link.option.nostdlibs.2099774502" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs"/>
-<option id="gnu.c.link.option.strip.1270839234" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/>
-<option id="gnu.c.link.option.noshared.715377715" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/>
-<option id="gnu.c.link.option.libs.246748928" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
-<listOptionValue builtIn="false" value="winmm"/>
-</option>
-<option id="gnu.c.link.option.paths.1166408208" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
-<option id="gnu.c.link.option.other.1932058041" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/>
-<option id="gnu.c.link.option.userobjs.1397357824" name="Other objects" superClass="gnu.c.link.option.userobjs"/>
-<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.363448189" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-</inputType>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.release.1088983873" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.release">
-<option defaultValue="true" id="gnu.cpp.link.mingw.so.release.option.shared.2023092585" name="Shared (-shared)" superClass="gnu.cpp.link.mingw.so.release.option.shared" valueType="boolean"/>
-</tool>
-</toolChain>
-</folderInfo>
-<sourceEntries>
-<entry excluding="pm_cl/|pm_linux/|pm_mac/|pm_test/|porttime/ptlinux.c|porttime/ptmacosx_cf.c|porttime/ptmacosx_mach.c" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
-</sourceEntries>
-</configuration>
-</storageModule>
-<storageModule moduleId="scannerConfiguration">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.release.413200248;cdt.managedbuild.config.gnu.mingw.so.release.413200248.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.343495978;cdt.managedbuild.tool.gnu.c.compiler.input.611335297">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-</scannerConfigBuildInfo>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004;cdt.managedbuild.config.gnu.mingw.so.debug.1580321004.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug.428547337;cdt.managedbuild.tool.gnu.c.compiler.input.532732416">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-</scannerConfigBuildInfo>
-</storageModule>
-<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
-</cconfiguration>
-</storageModule>
-<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-<project id="PortMidi.cdt.managedbuild.target.gnu.mingw.so.812075522" name="Shared Library" projectType="cdt.managedbuild.target.gnu.mingw.so"/>
-</storageModule>
-</cproject>
diff --git a/3rdparty/portmidi/pm_mingw/eclipse/dot-project b/3rdparty/portmidi/pm_mingw/eclipse/dot-project
deleted file mode 100644
index 57b1a6ab1e0..00000000000
--- a/3rdparty/portmidi/pm_mingw/eclipse/dot-project
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>PortMidi</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
- <triggers>clean,full,incremental,</triggers>
- <arguments>
- <dictionary>
- <key>org.eclipse.cdt.make.core.contents</key>
- <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildLocation</key>
- <value>${workspace_loc:/PortMidi/Debug}</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableFullBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
- <value>false</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.append_environment</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>?name?</key>
- <value></value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.stopOnError</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildArguments</key>
- <value></value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildCommand</key>
- <value>make</value>
- </dictionary>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
- <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
- <nature>org.eclipse.cdt.core.cnature</nature>
- </natures>
-</projectDescription>
diff --git a/3rdparty/portmidi/pm_mingw/msys/README-MSYS.txt b/3rdparty/portmidi/pm_mingw/msys/README-MSYS.txt
deleted file mode 100644
index 6f3cd69daa7..00000000000
--- a/3rdparty/portmidi/pm_mingw/msys/README-MSYS.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Old code was removed from this directory because CMake provides an
-up-to-date way to use MinGW. See portmidi/pm_mingw/README-MINGW.txt.
-
-Roger Dannenberg
-20-Sep-2010
-
-
-
diff --git a/3rdparty/portmidi/pm_python/README_PYTHON.txt b/3rdparty/portmidi/pm_python/README_PYTHON.txt
deleted file mode 100644
index b592869f3b9..00000000000
--- a/3rdparty/portmidi/pm_python/README_PYTHON.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-PyPortMidi v0.03 03/15/05
-Python wrappings for PortMidi
-John Harrison
-harrison@media.mit.edu
-
-Modified by Roger B. Dannenberg, Nov 2009
-
-PyPortMidi
-----------
-
-PyPortMidi is a Python wrapper for PortMidi. PortMidi is a cross-platform
-C library for realtime MIDI control. Using PyPortMidi, you can send and
-receive MIDI data in realtime from Python.
-
-Besides using PyPortMidi to communicate to synthesizers and the
-like, it is possible to use PyPortMidi as a way to send MIDI messages
-between software packages on the same computer. For example, Using
-PyPortMidi and MIDI-YOKE on a Windows machine, it is possible to send
-realtime MIDI messages between programs on the same computer using
-loopback virtual MIDI ports. (At this time, MIDI-YOKE does not appear
-to run on Windows Vista.)
-
-PyPortMidi is cross-platform, but it will require some small
-changes in the setup.py file for it to install correctly on Linux
-machines. The changes should be pretty straightforward, and I am
-anxious to work with a Linux user on the port.
-
-PyPortMidi works with Python 2.6 and Python 3.1, although the ports
-are mostly separate because of various language incompatibilities.
-
-Please see README26.txt for information about the Python 2.6 version.
-
-See README31.txt for information about the Python 3.1 version.
-
diff --git a/3rdparty/portmidi/pm_python/pyportmidi/__init__.py b/3rdparty/portmidi/pm_python/pyportmidi/__init__.py
deleted file mode 100644
index 0f3fc4b44cd..00000000000
--- a/3rdparty/portmidi/pm_python/pyportmidi/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-
-from .midi import *
-
diff --git a/3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.c b/3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.c
deleted file mode 100644
index 7d700349e18..00000000000
--- a/3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.c
+++ /dev/null
@@ -1,5663 +0,0 @@
-/* Generated by Cython 0.12.1 on Sun Sep 26 13:30:09 2010 */
-
-#define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
-#ifndef Py_PYTHON_H
- #error Python headers needed to compile C extensions, please install development version of Python.
-#else
-
-#ifndef PY_LONG_LONG
- #define PY_LONG_LONG LONG_LONG
-#endif
-#ifndef DL_EXPORT
- #define DL_EXPORT(t) t
-#endif
-#if PY_VERSION_HEX < 0x02040000
- #define METH_COEXIST 0
- #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
- #define PyDict_Contains(d,o) PySequence_Contains(d,o)
-#endif
-
-#if PY_VERSION_HEX < 0x02050000
- typedef int Py_ssize_t;
- #define PY_SSIZE_T_MAX INT_MAX
- #define PY_SSIZE_T_MIN INT_MIN
- #define PY_FORMAT_SIZE_T ""
- #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
- #define PyInt_AsSsize_t(o) PyInt_AsLong(o)
- #define PyNumber_Index(o) PyNumber_Int(o)
- #define PyIndex_Check(o) PyNumber_Check(o)
- #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
-#endif
-
-#if PY_VERSION_HEX < 0x02060000
- #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
- #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
- #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size)
- #define PyVarObject_HEAD_INIT(type, size) \
- PyObject_HEAD_INIT(type) size,
- #define PyType_Modified(t)
-
- typedef struct {
- void *buf;
- PyObject *obj;
- Py_ssize_t len;
- Py_ssize_t itemsize;
- int readonly;
- int ndim;
- char *format;
- Py_ssize_t *shape;
- Py_ssize_t *strides;
- Py_ssize_t *suboffsets;
- void *internal;
- } Py_buffer;
-
- #define PyBUF_SIMPLE 0
- #define PyBUF_WRITABLE 0x0001
- #define PyBUF_FORMAT 0x0004
- #define PyBUF_ND 0x0008
- #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
- #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
- #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
- #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
- #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-
-#endif
-
-#if PY_MAJOR_VERSION < 3
- #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-#else
- #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#endif
-
-#if PY_MAJOR_VERSION >= 3
- #define Py_TPFLAGS_CHECKTYPES 0
- #define Py_TPFLAGS_HAVE_INDEX 0
-#endif
-
-#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
- #define Py_TPFLAGS_HAVE_NEWBUFFER 0
-#endif
-
-#if PY_MAJOR_VERSION >= 3
- #define PyBaseString_Type PyUnicode_Type
- #define PyString_Type PyUnicode_Type
- #define PyString_CheckExact PyUnicode_CheckExact
-#else
- #define PyBytes_Type PyString_Type
- #define PyBytes_CheckExact PyString_CheckExact
-#endif
-
-#if PY_MAJOR_VERSION >= 3
- #define PyInt_Type PyLong_Type
- #define PyInt_Check(op) PyLong_Check(op)
- #define PyInt_CheckExact(op) PyLong_CheckExact(op)
- #define PyInt_FromString PyLong_FromString
- #define PyInt_FromUnicode PyLong_FromUnicode
- #define PyInt_FromLong PyLong_FromLong
- #define PyInt_FromSize_t PyLong_FromSize_t
- #define PyInt_FromSsize_t PyLong_FromSsize_t
- #define PyInt_AsLong PyLong_AsLong
- #define PyInt_AS_LONG PyLong_AS_LONG
- #define PyInt_AsSsize_t PyLong_AsSsize_t
- #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
- #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
- #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y)
- #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y)
-#else
- #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y)
- #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y)
-
-#endif
-
-#if PY_MAJOR_VERSION >= 3
- #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func)
-#endif
-
-#if !defined(WIN32) && !defined(MS_WINDOWS)
- #ifndef __stdcall
- #define __stdcall
- #endif
- #ifndef __cdecl
- #define __cdecl
- #endif
- #ifndef __fastcall
- #define __fastcall
- #endif
-#else
- #define _USE_MATH_DEFINES
-#endif
-
-#if PY_VERSION_HEX < 0x02050000
- #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n)))
- #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
- #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n)))
-#else
- #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n))
- #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
- #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n))
-#endif
-
-#if PY_VERSION_HEX < 0x02050000
- #define __Pyx_NAMESTR(n) ((char *)(n))
- #define __Pyx_DOCSTR(n) ((char *)(n))
-#else
- #define __Pyx_NAMESTR(n) (n)
- #define __Pyx_DOCSTR(n) (n)
-#endif
-#ifdef __cplusplus
-#define __PYX_EXTERN_C extern "C"
-#else
-#define __PYX_EXTERN_C extern
-#endif
-#include <math.h>
-#define __PYX_HAVE_API___pyportmidi
-#include "portmidi.h"
-#include "porttime.h"
-
-#ifndef CYTHON_INLINE
- #if defined(__GNUC__)
- #define CYTHON_INLINE __inline__
- #elif defined(_MSC_VER)
- #define CYTHON_INLINE __inline
- #else
- #define CYTHON_INLINE
- #endif
-#endif
-
-typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
-
-
-/* Type Conversion Predeclarations */
-
-#if PY_MAJOR_VERSION < 3
-#define __Pyx_PyBytes_FromString PyString_FromString
-#define __Pyx_PyBytes_FromStringAndSize PyString_FromStringAndSize
-#define __Pyx_PyBytes_AsString PyString_AsString
-#else
-#define __Pyx_PyBytes_FromString PyBytes_FromString
-#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
-#define __Pyx_PyBytes_AsString PyBytes_AsString
-#endif
-
-#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((char*)s)
-#define __Pyx_PyBytes_AsUString(s) ((unsigned char*) __Pyx_PyBytes_AsString(s))
-
-#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
-static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
-
-#if !defined(T_PYSSIZET)
-#if PY_VERSION_HEX < 0x02050000
-#define T_PYSSIZET T_INT
-#elif !defined(T_LONGLONG)
-#define T_PYSSIZET \
- ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \
- ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : -1))
-#else
-#define T_PYSSIZET \
- ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \
- ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : \
- ((sizeof(Py_ssize_t) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))
-#endif
-#endif
-
-
-#if !defined(T_ULONGLONG)
-#define __Pyx_T_UNSIGNED_INT(x) \
- ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \
- ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
- ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \
- ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : -1))))
-#else
-#define __Pyx_T_UNSIGNED_INT(x) \
- ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \
- ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
- ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \
- ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : \
- ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
-#endif
-#if !defined(T_LONGLONG)
-#define __Pyx_T_SIGNED_INT(x) \
- ((sizeof(x) == sizeof(char)) ? T_BYTE : \
- ((sizeof(x) == sizeof(short)) ? T_SHORT : \
- ((sizeof(x) == sizeof(int)) ? T_INT : \
- ((sizeof(x) == sizeof(long)) ? T_LONG : -1))))
-#else
-#define __Pyx_T_SIGNED_INT(x) \
- ((sizeof(x) == sizeof(char)) ? T_BYTE : \
- ((sizeof(x) == sizeof(short)) ? T_SHORT : \
- ((sizeof(x) == sizeof(int)) ? T_INT : \
- ((sizeof(x) == sizeof(long)) ? T_LONG : \
- ((sizeof(x) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))))
-#endif
-
-#define __Pyx_T_FLOATING(x) \
- ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
- ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
-
-#if !defined(T_SIZET)
-#if !defined(T_ULONGLONG)
-#define T_SIZET \
- ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \
- ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : -1))
-#else
-#define T_SIZET \
- ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \
- ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : \
- ((sizeof(size_t) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))
-#endif
-#endif
-
-static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
-static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
-
-#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-
-
-#ifdef __GNUC__
-/* Test for GCC > 2.95 */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
-#define likely(x) __builtin_expect(!!(x), 1)
-#define unlikely(x) __builtin_expect(!!(x), 0)
-#else /* __GNUC__ > 2 ... */
-#define likely(x) (x)
-#define unlikely(x) (x)
-#endif /* __GNUC__ > 2 ... */
-#else /* __GNUC__ */
-#define likely(x) (x)
-#define unlikely(x) (x)
-#endif /* __GNUC__ */
-
-static PyObject *__pyx_m;
-static PyObject *__pyx_b;
-static PyObject *__pyx_empty_tuple;
-static PyObject *__pyx_empty_bytes;
-static int __pyx_lineno;
-static int __pyx_clineno = 0;
-static const char * __pyx_cfilenm= __FILE__;
-static const char *__pyx_filename;
-static const char **__pyx_f;
-
-
-/* Type declarations */
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":394
- *
- *
- * cdef class Input: # <<<<<<<<<<<<<<
- * """
- * class Input:
- */
-
-struct __pyx_obj_11_pyportmidi_Input {
- PyObject_HEAD
- PmStream *midi;
- int debug;
- int i;
-};
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":201
- * return Pm_Channel(chan-1)
- *
- * cdef class Output: # <<<<<<<<<<<<<<
- * """
- * class Output:
- */
-
-struct __pyx_obj_11_pyportmidi_Output {
- PyObject_HEAD
- int i;
- PmStream *midi;
- int debug;
- int _aborted;
-};
-
-#ifndef CYTHON_REFNANNY
- #define CYTHON_REFNANNY 0
-#endif
-
-#if CYTHON_REFNANNY
- typedef struct {
- void (*INCREF)(void*, PyObject*, int);
- void (*DECREF)(void*, PyObject*, int);
- void (*GOTREF)(void*, PyObject*, int);
- void (*GIVEREF)(void*, PyObject*, int);
- void* (*SetupContext)(const char*, int, const char*);
- void (*FinishContext)(void**);
- } __Pyx_RefNannyAPIStruct;
- static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
- static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) {
- PyObject *m = NULL, *p = NULL;
- void *r = NULL;
- m = PyImport_ImportModule((char *)modname);
- if (!m) goto end;
- p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
- if (!p) goto end;
- r = PyLong_AsVoidPtr(p);
- end:
- Py_XDECREF(p);
- Py_XDECREF(m);
- return (__Pyx_RefNannyAPIStruct *)r;
- }
- #define __Pyx_RefNannySetupContext(name) void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
- #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
- #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
- #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)
-#else
- #define __Pyx_RefNannySetupContext(name)
- #define __Pyx_RefNannyFinishContext()
- #define __Pyx_INCREF(r) Py_INCREF(r)
- #define __Pyx_DECREF(r) Py_DECREF(r)
- #define __Pyx_GOTREF(r)
- #define __Pyx_GIVEREF(r)
- #define __Pyx_XDECREF(r) Py_XDECREF(r)
-#endif /* CYTHON_REFNANNY */
-#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)
-#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)
-
-static void __Pyx_RaiseDoubleKeywordsError(
- const char* func_name, PyObject* kw_name); /*proto*/
-
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
- Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
-
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/
-
-
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
- PyObject *r;
- if (!j) return NULL;
- r = PyObject_GetItem(o, j);
- Py_DECREF(j);
- return r;
-}
-
-
-#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
- __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \
- __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
- if (likely(o != Py_None)) {
- if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
- PyObject *r = PyList_GET_ITEM(o, i);
- Py_INCREF(r);
- return r;
- }
- else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
- PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
- Py_INCREF(r);
- return r;
- }
- }
- return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-}
-
-#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
- __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \
- __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
- if (likely(o != Py_None)) {
- if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
- PyObject *r = PyTuple_GET_ITEM(o, i);
- Py_INCREF(r);
- return r;
- }
- else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
- PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
- Py_INCREF(r);
- return r;
- }
- }
- return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-}
-
-
-#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
- __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \
- __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
- PyObject *r;
- if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
- r = PyList_GET_ITEM(o, i);
- Py_INCREF(r);
- }
- else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
- r = PyTuple_GET_ITEM(o, i);
- Py_INCREF(r);
- }
- else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
- r = PySequence_GetItem(o, i);
- }
- else {
- r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
- }
- return r;
-}
-
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
- if (likely(PyList_CheckExact(L))) {
- if (PyList_Append(L, x) < 0) return NULL;
- Py_INCREF(Py_None);
- return Py_None; /* this is just to have an accurate signature */
- }
- else {
- PyObject *r, *m;
- m = __Pyx_GetAttrString(L, "append");
- if (!m) return NULL;
- r = PyObject_CallFunctionObjArgs(m, x, NULL);
- Py_DECREF(m);
- return r;
- }
-}
-
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmDeviceID(PmDeviceID);
-
-static CYTHON_INLINE PmDeviceID __Pyx_PyInt_from_py_PmDeviceID(PyObject *);
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PtTimestamp(PtTimestamp);
-
-static int __Pyx_Print(PyObject *, int); /*proto*/
-#if PY_MAJOR_VERSION >= 3
-static PyObject* __pyx_print = 0;
-static PyObject* __pyx_print_kwargs = 0;
-#endif
-
-static int __Pyx_PrintOne(PyObject *o); /*proto*/
-
-static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
-
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmMessage(PmMessage);
-
-static CYTHON_INLINE PmMessage __Pyx_PyInt_from_py_PmMessage(PyObject *);
-
-static CYTHON_INLINE PmTimestamp __Pyx_PyInt_from_py_PmTimestamp(PyObject *);
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmTimestamp(PmTimestamp);
-
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
-
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
-
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
-
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);
-
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);
-
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);
-
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
-
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
-
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
-
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
-
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
-
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);
-
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
-
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
-
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
-
-static void __Pyx_AddTraceback(const char *funcname); /*proto*/
-
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
-/* Module declarations from _pyportmidi */
-
-static PyTypeObject *__pyx_ptype_11_pyportmidi_Output = 0;
-static PyTypeObject *__pyx_ptype_11_pyportmidi_Input = 0;
-#define __Pyx_MODULE_NAME "_pyportmidi"
-int __pyx_module_is_main__pyportmidi = 0;
-
-/* Implementation of _pyportmidi */
-static PyObject *__pyx_builtin_Exception;
-static PyObject *__pyx_builtin_IndexError;
-static PyObject *__pyx_builtin_range;
-static char __pyx_k_1[] = "Opening Midi Output";
-static char __pyx_k_2[] = "Unable to open Midi OutputDevice=";
-static char __pyx_k_3[] = " err=";
-static char __pyx_k_4[] = "Closing MIDI output stream and destroying instance";
-static char __pyx_k_5[] = "midi Output not open.";
-static char __pyx_k_6[] = "midi Output aborted. Need to call Close after Abort.";
-static char __pyx_k_7[] = "maximum list length is 1024";
-static char __pyx_k_8[] = " arguments in event list";
-static char __pyx_k_9[] = " : ";
-static char __pyx_k_10[] = "writing to midi buffer";
-static char __pyx_k_11[] = "Writing to MIDI buffer";
-static char __pyx_k_12[] = "MIDI input opened.";
-static char __pyx_k_13[] = "Closing MIDI input stream and destroying instance";
-static char __pyx_k_14[] = "midi Input not open.";
-static char __pyx_k_15[] = "maximum buffer length is 1024";
-static char __pyx_k_16[] = "minimum buffer length is 1";
-static char __pyx_k_17[] = "0.07";
-static char __pyx_k_18[] = "FILT_CHANNEL_AFTERTOUCH";
-static char __pyx_k_19[] = "FILT_POLY_AFTERTOUCH";
-static char __pyx_k_20[] = "Initialize (line 132)";
-static char __pyx_k_21[] = "Terminate (line 139)";
-static char __pyx_k_22[] = "GetDeviceInfo (line 156)";
-static char __pyx_k_23[] = "Time (line 173)";
-static char __pyx_k_24[] = "GetErrorText (line 180)";
-static char __pyx_k_25[] = "Channel (line 187)";
-static char __pyx_k_26[] = "Output._check_open (line 248)";
-static char __pyx_k_27[] = "Output.Close (line 258)";
-static char __pyx_k_28[] = "Output.Abort (line 274)";
-static char __pyx_k_29[] = "Output.Write (line 293)";
-static char __pyx_k_30[] = "Output.WriteShort (line 333)";
-static char __pyx_k_31[] = "Output.WriteSysEx (line 356)";
-static char __pyx_k_32[] = "Input._check_open (line 422)";
-static char __pyx_k_33[] = "Input.Close (line 430)";
-static char __pyx_k_34[] = "Input.SetFilter (line 447)";
-static char __pyx_k_35[] = "Input.SetChannelMask (line 481)";
-static char __pyx_k_36[] = "Input.Poll (line 502)";
-static char __pyx_k_37[] = "Input.Read (line 514)";
-static char __pyx_k__B[] = "B";
-static char __pyx_k__i[] = "i";
-static char __pyx_k__msg[] = "msg";
-static char __pyx_k__Poll[] = "Poll";
-static char __pyx_k__Read[] = "Read";
-static char __pyx_k__TRUE[] = "TRUE";
-static char __pyx_k__Time[] = "Time";
-static char __pyx_k__midi[] = "midi";
-static char __pyx_k__name[] = "name";
-static char __pyx_k__when[] = "when";
-static char __pyx_k__Abort[] = "Abort";
-static char __pyx_k__Close[] = "Close";
-static char __pyx_k__FALSE[] = "FALSE";
-static char __pyx_k__Input[] = "Input";
-static char __pyx_k__Write[] = "Write";
-static char __pyx_k__array[] = "array";
-static char __pyx_k__data1[] = "data1";
-static char __pyx_k__data2[] = "data2";
-static char __pyx_k__debug[] = "debug";
-static char __pyx_k__input[] = "input";
-static char __pyx_k__range[] = "range";
-static char __pyx_k__Output[] = "Output";
-static char __pyx_k__interf[] = "interf";
-static char __pyx_k__opened[] = "opened";
-static char __pyx_k__output[] = "output";
-static char __pyx_k__status[] = "status";
-static char __pyx_k__Channel[] = "Channel";
-static char __pyx_k__FILT_F9[] = "FILT_F9";
-static char __pyx_k__FILT_FD[] = "FILT_FD";
-static char __pyx_k__latency[] = "latency";
-static char __pyx_k__message[] = "message";
-static char __pyx_k__FILT_MTC[] = "FILT_MTC";
-static char __pyx_k____main__[] = "__main__";
-static char __pyx_k____test__[] = "__test__";
-static char __pyx_k___aborted[] = "_aborted";
-static char __pyx_k__tostring[] = "tostring";
-static char __pyx_k__Exception[] = "Exception";
-static char __pyx_k__FILT_NOTE[] = "FILT_NOTE";
-static char __pyx_k__FILT_PLAY[] = "FILT_PLAY";
-static char __pyx_k__FILT_TICK[] = "FILT_TICK";
-static char __pyx_k__FILT_TUNE[] = "FILT_TUNE";
-static char __pyx_k__SetFilter[] = "SetFilter";
-static char __pyx_k__Terminate[] = "Terminate";
-static char __pyx_k__timestamp[] = "timestamp";
-static char __pyx_k__FILT_CLOCK[] = "FILT_CLOCK";
-static char __pyx_k__FILT_RESET[] = "FILT_RESET";
-static char __pyx_k__FILT_SYSEX[] = "FILT_SYSEX";
-static char __pyx_k__IndexError[] = "IndexError";
-static char __pyx_k__Initialize[] = "Initialize";
-static char __pyx_k__WriteShort[] = "WriteShort";
-static char __pyx_k__WriteSysEx[] = "WriteSysEx";
-static char __pyx_k__buffersize[] = "buffersize";
-static char __pyx_k__FILT_ACTIVE[] = "FILT_ACTIVE";
-static char __pyx_k__InputDevice[] = "InputDevice";
-static char __pyx_k____version__[] = "__version__";
-static char __pyx_k___check_open[] = "_check_open";
-static char __pyx_k__FILT_CONTROL[] = "FILT_CONTROL";
-static char __pyx_k__FILT_PROGRAM[] = "FILT_PROGRAM";
-static char __pyx_k__GetErrorText[] = "GetErrorText";
-static char __pyx_k__OutputDevice[] = "OutputDevice";
-static char __pyx_k__FILT_REALTIME[] = "FILT_REALTIME";
-static char __pyx_k__GetDeviceInfo[] = "GetDeviceInfo";
-static char __pyx_k__FILT_PITCHBEND[] = "FILT_PITCHBEND";
-static char __pyx_k__FILT_UNDEFINED[] = "FILT_UNDEFINED";
-static char __pyx_k__SetChannelMask[] = "SetChannelMask";
-static char __pyx_k__FILT_AFTERTOUCH[] = "FILT_AFTERTOUCH";
-static char __pyx_k__FILT_SONG_SELECT[] = "FILT_SONG_SELECT";
-static char __pyx_k__FILT_SONG_POSITION[] = "FILT_SONG_POSITION";
-static PyObject *__pyx_kp_s_1;
-static PyObject *__pyx_kp_s_10;
-static PyObject *__pyx_kp_s_11;
-static PyObject *__pyx_kp_s_12;
-static PyObject *__pyx_kp_s_13;
-static PyObject *__pyx_kp_s_14;
-static PyObject *__pyx_kp_s_15;
-static PyObject *__pyx_kp_s_16;
-static PyObject *__pyx_kp_s_17;
-static PyObject *__pyx_n_s_18;
-static PyObject *__pyx_n_s_19;
-static PyObject *__pyx_kp_s_2;
-static PyObject *__pyx_kp_u_20;
-static PyObject *__pyx_kp_u_21;
-static PyObject *__pyx_kp_u_22;
-static PyObject *__pyx_kp_u_23;
-static PyObject *__pyx_kp_u_24;
-static PyObject *__pyx_kp_u_25;
-static PyObject *__pyx_kp_u_26;
-static PyObject *__pyx_kp_u_27;
-static PyObject *__pyx_kp_u_28;
-static PyObject *__pyx_kp_u_29;
-static PyObject *__pyx_kp_s_3;
-static PyObject *__pyx_kp_u_30;
-static PyObject *__pyx_kp_u_31;
-static PyObject *__pyx_kp_u_32;
-static PyObject *__pyx_kp_u_33;
-static PyObject *__pyx_kp_u_34;
-static PyObject *__pyx_kp_u_35;
-static PyObject *__pyx_kp_u_36;
-static PyObject *__pyx_kp_u_37;
-static PyObject *__pyx_kp_s_4;
-static PyObject *__pyx_kp_s_5;
-static PyObject *__pyx_kp_s_6;
-static PyObject *__pyx_kp_s_7;
-static PyObject *__pyx_kp_s_8;
-static PyObject *__pyx_kp_s_9;
-static PyObject *__pyx_n_s__Abort;
-static PyObject *__pyx_n_s__B;
-static PyObject *__pyx_n_s__Channel;
-static PyObject *__pyx_n_s__Close;
-static PyObject *__pyx_n_s__Exception;
-static PyObject *__pyx_n_s__FALSE;
-static PyObject *__pyx_n_s__FILT_ACTIVE;
-static PyObject *__pyx_n_s__FILT_AFTERTOUCH;
-static PyObject *__pyx_n_s__FILT_CLOCK;
-static PyObject *__pyx_n_s__FILT_CONTROL;
-static PyObject *__pyx_n_s__FILT_F9;
-static PyObject *__pyx_n_s__FILT_FD;
-static PyObject *__pyx_n_s__FILT_MTC;
-static PyObject *__pyx_n_s__FILT_NOTE;
-static PyObject *__pyx_n_s__FILT_PITCHBEND;
-static PyObject *__pyx_n_s__FILT_PLAY;
-static PyObject *__pyx_n_s__FILT_PROGRAM;
-static PyObject *__pyx_n_s__FILT_REALTIME;
-static PyObject *__pyx_n_s__FILT_RESET;
-static PyObject *__pyx_n_s__FILT_SONG_POSITION;
-static PyObject *__pyx_n_s__FILT_SONG_SELECT;
-static PyObject *__pyx_n_s__FILT_SYSEX;
-static PyObject *__pyx_n_s__FILT_TICK;
-static PyObject *__pyx_n_s__FILT_TUNE;
-static PyObject *__pyx_n_s__FILT_UNDEFINED;
-static PyObject *__pyx_n_s__GetDeviceInfo;
-static PyObject *__pyx_n_s__GetErrorText;
-static PyObject *__pyx_n_s__IndexError;
-static PyObject *__pyx_n_s__Initialize;
-static PyObject *__pyx_n_s__Input;
-static PyObject *__pyx_n_s__InputDevice;
-static PyObject *__pyx_n_s__Output;
-static PyObject *__pyx_n_s__OutputDevice;
-static PyObject *__pyx_n_s__Poll;
-static PyObject *__pyx_n_s__Read;
-static PyObject *__pyx_n_s__SetChannelMask;
-static PyObject *__pyx_n_s__SetFilter;
-static PyObject *__pyx_n_s__TRUE;
-static PyObject *__pyx_n_s__Terminate;
-static PyObject *__pyx_n_s__Time;
-static PyObject *__pyx_n_s__Write;
-static PyObject *__pyx_n_s__WriteShort;
-static PyObject *__pyx_n_s__WriteSysEx;
-static PyObject *__pyx_n_s____main__;
-static PyObject *__pyx_n_s____test__;
-static PyObject *__pyx_n_s____version__;
-static PyObject *__pyx_n_s___aborted;
-static PyObject *__pyx_n_s___check_open;
-static PyObject *__pyx_n_s__array;
-static PyObject *__pyx_n_s__buffersize;
-static PyObject *__pyx_n_s__data1;
-static PyObject *__pyx_n_s__data2;
-static PyObject *__pyx_n_s__debug;
-static PyObject *__pyx_n_s__i;
-static PyObject *__pyx_n_s__input;
-static PyObject *__pyx_n_s__interf;
-static PyObject *__pyx_n_s__latency;
-static PyObject *__pyx_n_s__message;
-static PyObject *__pyx_n_s__midi;
-static PyObject *__pyx_n_s__msg;
-static PyObject *__pyx_n_s__name;
-static PyObject *__pyx_n_s__opened;
-static PyObject *__pyx_n_s__output;
-static PyObject *__pyx_n_s__range;
-static PyObject *__pyx_n_s__status;
-static PyObject *__pyx_n_s__timestamp;
-static PyObject *__pyx_n_s__tostring;
-static PyObject *__pyx_n_s__when;
-static PyObject *__pyx_int_0;
-static PyObject *__pyx_int_1;
-static PyObject *__pyx_int_8;
-static PyObject *__pyx_int_16;
-static PyObject *__pyx_int_0x1;
-static PyObject *__pyx_int_0x2;
-static PyObject *__pyx_int_0x4;
-static PyObject *__pyx_int_0x8;
-static PyObject *__pyx_int_0x10;
-static PyObject *__pyx_int_0x20;
-static PyObject *__pyx_int_0x30;
-static PyObject *__pyx_int_0x40;
-static PyObject *__pyx_int_0x7F;
-static PyObject *__pyx_int_0x80;
-static PyObject *__pyx_int_0xFF;
-static PyObject *__pyx_int_1024;
-static PyObject *__pyx_int_4096;
-static PyObject *__pyx_int_0x100;
-static PyObject *__pyx_int_0x200;
-static PyObject *__pyx_int_0x300;
-static PyObject *__pyx_int_0x400;
-static PyObject *__pyx_int_0x800;
-static PyObject *__pyx_int_0x1000;
-static PyObject *__pyx_int_0x2000;
-static PyObject *__pyx_int_0x4000;
-static PyObject *__pyx_int_0x8000;
-static PyObject *__pyx_int_0xFF00;
-static PyObject *__pyx_int_0x10000;
-static PyObject *__pyx_int_0xFF0000;
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":132
- * TRUE=1
- *
- * def Initialize(): # <<<<<<<<<<<<<<
- * """
- * Initialize: call this first
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_Initialize(PyObject *__pyx_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_Initialize[] = "\nInitialize: call this first\n ";
-static PyObject *__pyx_pf_11_pyportmidi_Initialize(PyObject *__pyx_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannySetupContext("Initialize");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":136
- * Initialize: call this first
- * """
- * Pm_Initialize() # <<<<<<<<<<<<<<
- * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/
- *
- */
- Pm_Initialize();
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":137
- * """
- * Pm_Initialize()
- * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ # <<<<<<<<<<<<<<
- *
- * def Terminate():
- */
- Pt_Start(1, NULL, NULL);
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":139
- * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/
- *
- * def Terminate(): # <<<<<<<<<<<<<<
- * """
- * Terminate: call this to clean up Midi streams when done.
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_Terminate(PyObject *__pyx_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_Terminate[] = "\nTerminate: call this to clean up Midi streams when done.\nIf you do not call this on Windows machines when you are\ndone with MIDI, your system may crash.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_Terminate(PyObject *__pyx_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- __Pyx_RefNannySetupContext("Terminate");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":145
- * done with MIDI, your system may crash.
- * """
- * Pm_Terminate() # <<<<<<<<<<<<<<
- *
- * def GetDefaultInputDeviceID():
- */
- Pm_Terminate();
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":147
- * Pm_Terminate()
- *
- * def GetDefaultInputDeviceID(): # <<<<<<<<<<<<<<
- * return Pm_GetDefaultInputDeviceID()
- *
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_GetDefaultInputDeviceID(PyObject *__pyx_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_11_pyportmidi_GetDefaultInputDeviceID(PyObject *__pyx_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- __Pyx_RefNannySetupContext("GetDefaultInputDeviceID");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":148
- *
- * def GetDefaultInputDeviceID():
- * return Pm_GetDefaultInputDeviceID() # <<<<<<<<<<<<<<
- *
- * def GetDefaultOutputDeviceID():
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = __Pyx_PyInt_to_py_PmDeviceID(Pm_GetDefaultInputDeviceID()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.GetDefaultInputDeviceID");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":150
- * return Pm_GetDefaultInputDeviceID()
- *
- * def GetDefaultOutputDeviceID(): # <<<<<<<<<<<<<<
- * return Pm_GetDefaultOutputDeviceID()
- *
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_GetDefaultOutputDeviceID(PyObject *__pyx_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_11_pyportmidi_GetDefaultOutputDeviceID(PyObject *__pyx_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- __Pyx_RefNannySetupContext("GetDefaultOutputDeviceID");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":151
- *
- * def GetDefaultOutputDeviceID():
- * return Pm_GetDefaultOutputDeviceID() # <<<<<<<<<<<<<<
- *
- * def CountDevices():
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = __Pyx_PyInt_to_py_PmDeviceID(Pm_GetDefaultOutputDeviceID()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.GetDefaultOutputDeviceID");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":153
- * return Pm_GetDefaultOutputDeviceID()
- *
- * def CountDevices(): # <<<<<<<<<<<<<<
- * return Pm_CountDevices()
- *
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_CountDevices(PyObject *__pyx_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_11_pyportmidi_CountDevices(PyObject *__pyx_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- __Pyx_RefNannySetupContext("CountDevices");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":154
- *
- * def CountDevices():
- * return Pm_CountDevices() # <<<<<<<<<<<<<<
- *
- * def GetDeviceInfo(i):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = PyInt_FromLong(Pm_CountDevices()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.CountDevices");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":156
- * return Pm_CountDevices()
- *
- * def GetDeviceInfo(i): # <<<<<<<<<<<<<<
- * """
- * GetDeviceInfo(<device number>): returns 5 parameters
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_GetDeviceInfo(PyObject *__pyx_self, PyObject *__pyx_v_i); /*proto*/
-static char __pyx_doc_11_pyportmidi_GetDeviceInfo[] = "\nGetDeviceInfo(<device number>): returns 5 parameters\n - underlying MIDI API\n - device name\n - TRUE iff input is available\n - TRUE iff output is available\n - TRUE iff device stream is already open\n ";
-static PyObject *__pyx_pf_11_pyportmidi_GetDeviceInfo(PyObject *__pyx_self, PyObject *__pyx_v_i) {
- PmDeviceInfo *__pyx_v_info;
- PyObject *__pyx_r = NULL;
- PmDeviceID __pyx_t_1;
- int __pyx_t_2;
- PyObject *__pyx_t_3 = NULL;
- PyObject *__pyx_t_4 = NULL;
- PyObject *__pyx_t_5 = NULL;
- PyObject *__pyx_t_6 = NULL;
- PyObject *__pyx_t_7 = NULL;
- PyObject *__pyx_t_8 = NULL;
- __Pyx_RefNannySetupContext("GetDeviceInfo");
- __pyx_self = __pyx_self;
- __Pyx_INCREF(__pyx_v_i);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":168
- *
- * # disregarding the constness from Pm_GetDeviceInfo, since pyrex doesn't do const.
- * info = <PmDeviceInfo *>Pm_GetDeviceInfo(i) # <<<<<<<<<<<<<<
- *
- * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened
- */
- __pyx_t_1 = __Pyx_PyInt_from_py_PmDeviceID(__pyx_v_i); if (unlikely((__pyx_t_1 == (PmDeviceID)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_info = ((PmDeviceInfo *)Pm_GetDeviceInfo(__pyx_t_1));
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":170
- * info = <PmDeviceInfo *>Pm_GetDeviceInfo(i)
- *
- * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened # <<<<<<<<<<<<<<
- * else: return
- *
- */
- __pyx_t_2 = (__pyx_v_info != NULL);
- if (__pyx_t_2) {
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_info->interf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_3));
- __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_info->name); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_4));
- __pyx_t_5 = PyInt_FromLong(__pyx_v_info->input); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_5);
- __pyx_t_6 = PyInt_FromLong(__pyx_v_info->output); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __pyx_t_7 = PyInt_FromLong(__pyx_v_info->opened); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_7);
- __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_8);
- PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_t_3));
- __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
- PyTuple_SET_ITEM(__pyx_t_8, 1, ((PyObject *)__pyx_t_4));
- __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
- PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_5);
- __Pyx_GIVEREF(__pyx_t_5);
- PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_6);
- __Pyx_GIVEREF(__pyx_t_6);
- PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_t_7);
- __Pyx_GIVEREF(__pyx_t_7);
- __pyx_t_3 = 0;
- __pyx_t_4 = 0;
- __pyx_t_5 = 0;
- __pyx_t_6 = 0;
- __pyx_t_7 = 0;
- __pyx_r = __pyx_t_8;
- __pyx_t_8 = 0;
- goto __pyx_L0;
- goto __pyx_L5;
- }
- /*else*/ {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":171
- *
- * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened
- * else: return # <<<<<<<<<<<<<<
- *
- * def Time():
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- }
- __pyx_L5:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_XDECREF(__pyx_t_4);
- __Pyx_XDECREF(__pyx_t_5);
- __Pyx_XDECREF(__pyx_t_6);
- __Pyx_XDECREF(__pyx_t_7);
- __Pyx_XDECREF(__pyx_t_8);
- __Pyx_AddTraceback("_pyportmidi.GetDeviceInfo");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_i);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":173
- * else: return
- *
- * def Time(): # <<<<<<<<<<<<<<
- * """
- * Time() returns the current time in ms
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_Time(PyObject *__pyx_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_Time[] = "\nTime() returns the current time in ms\nof the PortMidi timer\n ";
-static PyObject *__pyx_pf_11_pyportmidi_Time(PyObject *__pyx_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- __Pyx_RefNannySetupContext("Time");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":178
- * of the PortMidi timer
- * """
- * return Pt_Time() # <<<<<<<<<<<<<<
- *
- * def GetErrorText(err):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = __Pyx_PyInt_to_py_PtTimestamp(Pt_Time()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.Time");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":180
- * return Pt_Time()
- *
- * def GetErrorText(err): # <<<<<<<<<<<<<<
- * """
- * GetErrorText(<err num>) returns human-readable error
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_GetErrorText(PyObject *__pyx_self, PyObject *__pyx_v_err); /*proto*/
-static char __pyx_doc_11_pyportmidi_GetErrorText[] = "\nGetErrorText(<err num>) returns human-readable error\nmessages translated from error numbers\n ";
-static PyObject *__pyx_pf_11_pyportmidi_GetErrorText(PyObject *__pyx_self, PyObject *__pyx_v_err) {
- PyObject *__pyx_r = NULL;
- PmError __pyx_t_1;
- PyObject *__pyx_t_2 = NULL;
- __Pyx_RefNannySetupContext("GetErrorText");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":185
- * messages translated from error numbers
- * """
- * return Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * def Channel(chan):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __pyx_r = ((PyObject *)__pyx_t_2);
- __pyx_t_2 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("_pyportmidi.GetErrorText");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":187
- * return Pm_GetErrorText(err)
- *
- * def Channel(chan): # <<<<<<<<<<<<<<
- * """
- * Channel(<chan>) is used with ChannelMask on input MIDI streams.
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_Channel(PyObject *__pyx_self, PyObject *__pyx_v_chan); /*proto*/
-static char __pyx_doc_11_pyportmidi_Channel[] = "\nChannel(<chan>) is used with ChannelMask on input MIDI streams.\nExample: to receive input on channels 1 and 10 on a MIDI\n stream called MidiIn:\nMidiIn.SetChannelMask(pypm.Channel(1) | pypm.Channel(10))\n\nnote: PyPortMidi Channel function has been altered from\n the original PortMidi c call to correct for what\n seems to be a bug --- i.e. channel filters were\n all numbered from 0 to 15 instead of 1 to 16.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_Channel(PyObject *__pyx_self, PyObject *__pyx_v_chan) {
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- __Pyx_RefNannySetupContext("Channel");
- __pyx_self = __pyx_self;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":199
- * all numbered from 0 to 15 instead of 1 to 16.
- * """
- * return Pm_Channel(chan-1) # <<<<<<<<<<<<<<
- *
- * cdef class Output:
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_1 = PyNumber_Subtract(__pyx_v_chan, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __pyx_t_1 = PyInt_FromLong(Pm_Channel(__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_r = __pyx_t_1;
- __pyx_t_1 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.Channel");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":214
- * cdef int _aborted
- *
- * def __init__(self, OutputDevice, latency=0): # <<<<<<<<<<<<<<
- *
- * cdef PmError err
- */
-
-static int __pyx_pf_11_pyportmidi_6Output___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_11_pyportmidi_6Output___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_OutputDevice = 0;
- PyObject *__pyx_v_latency = 0;
- PmError __pyx_v_err;
- PmTimeProcPtr __pyx_v_PmPtr;
- PyObject *__pyx_v_s;
- int __pyx_r;
- int __pyx_t_1;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- long __pyx_t_4;
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__OutputDevice,&__pyx_n_s__latency,0};
- __Pyx_RefNannySetupContext("__init__");
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
- PyObject* values[2] = {0,0};
- values[1] = ((PyObject *)__pyx_int_0);
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 0:
- values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__OutputDevice);
- if (likely(values[0])) kw_args--;
- else goto __pyx_L5_argtuple_error;
- case 1:
- if (kw_args > 1) {
- PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__latency);
- if (unlikely(value)) { values[1] = value; kw_args--; }
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- }
- __pyx_v_OutputDevice = values[0];
- __pyx_v_latency = values[1];
- } else {
- __pyx_v_latency = ((PyObject *)__pyx_int_0);
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 2: __pyx_v_latency = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: __pyx_v_OutputDevice = PyTuple_GET_ITEM(__pyx_args, 0);
- break;
- default: goto __pyx_L5_argtuple_error;
- }
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- __pyx_L3_error:;
- __Pyx_AddTraceback("_pyportmidi.Output.__init__");
- return -1;
- __pyx_L4_argument_unpacking_done:;
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_OutputDevice);
- __Pyx_INCREF(__pyx_v_latency);
- __pyx_v_s = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":220
- * cdef PmTimeProcPtr PmPtr
- *
- * self.i = OutputDevice # <<<<<<<<<<<<<<
- * self.debug = 0
- * self._aborted = 0
- */
- __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_OutputDevice); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->i = __pyx_t_1;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":221
- *
- * self.i = OutputDevice
- * self.debug = 0 # <<<<<<<<<<<<<<
- * self._aborted = 0
- *
- */
- ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":222
- * self.i = OutputDevice
- * self.debug = 0
- * self._aborted = 0 # <<<<<<<<<<<<<<
- *
- * if latency == 0:
- */
- ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->_aborted = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":224
- * self._aborted = 0
- *
- * if latency == 0: # <<<<<<<<<<<<<<
- * PmPtr = NULL
- * else:
- */
- __pyx_t_2 = PyObject_RichCompare(__pyx_v_latency, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (__pyx_t_3) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":225
- *
- * if latency == 0:
- * PmPtr = NULL # <<<<<<<<<<<<<<
- * else:
- * PmPtr = <PmTimeProcPtr>&Pt_Time
- */
- __pyx_v_PmPtr = NULL;
- goto __pyx_L6;
- }
- /*else*/ {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":227
- * PmPtr = NULL
- * else:
- * PmPtr = <PmTimeProcPtr>&Pt_Time # <<<<<<<<<<<<<<
- * if self.debug: print "Opening Midi Output"
- * # Why is bufferSize 0 here?
- */
- __pyx_v_PmPtr = ((PmTimestamp (*)(void *))(&Pt_Time));
- }
- __pyx_L6:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":228
- * else:
- * PmPtr = <PmTimeProcPtr>&Pt_Time
- * if self.debug: print "Opening Midi Output" # <<<<<<<<<<<<<<
- * # Why is bufferSize 0 here?
- * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency)
- */
- __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug;
- if (__pyx_t_1) {
- if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L7;
- }
- __pyx_L7:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":230
- * if self.debug: print "Opening Midi Output"
- * # Why is bufferSize 0 here?
- * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) # <<<<<<<<<<<<<<
- * if err < 0:
- * s = Pm_GetErrorText(err)
- */
- __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_v_latency); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_err = Pm_OpenOutput((&((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi), ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->i, NULL, 0, __pyx_v_PmPtr, NULL, __pyx_t_4);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":231
- * # Why is bufferSize 0 here?
- * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency)
- * if err < 0: # <<<<<<<<<<<<<<
- * s = Pm_GetErrorText(err)
- * # Something's amiss here - if we try to throw an Exception
- */
- __pyx_t_3 = (__pyx_v_err < 0);
- if (__pyx_t_3) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":232
- * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency)
- * if err < 0:
- * s = Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- * # Something's amiss here - if we try to throw an Exception
- * # here, we crash.
- */
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_DECREF(__pyx_v_s);
- __pyx_v_s = ((PyObject *)__pyx_t_2);
- __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":235
- * # Something's amiss here - if we try to throw an Exception
- * # here, we crash.
- * if not err == -10000: # <<<<<<<<<<<<<<
- * raise Exception,s
- * else:
- */
- __pyx_t_3 = (!(__pyx_v_err == -10000));
- if (__pyx_t_3) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":236
- * # here, we crash.
- * if not err == -10000:
- * raise Exception,s # <<<<<<<<<<<<<<
- * else:
- * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s
- */
- __Pyx_Raise(__pyx_builtin_Exception, __pyx_v_s, 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L9;
- }
- /*else*/ {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":238
- * raise Exception,s
- * else:
- * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s # <<<<<<<<<<<<<<
- *
- * def __dealloc__(self):
- */
- __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(((PyObject *)__pyx_kp_s_2));
- PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_2));
- __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_2));
- __Pyx_INCREF(__pyx_v_OutputDevice);
- PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_OutputDevice);
- __Pyx_GIVEREF(__pyx_v_OutputDevice);
- __Pyx_INCREF(((PyObject *)__pyx_kp_s_3));
- PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_kp_s_3));
- __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_3));
- __Pyx_INCREF(__pyx_v_s);
- PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_s);
- __Pyx_GIVEREF(__pyx_v_s);
- if (__Pyx_Print(__pyx_t_2, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- }
- __pyx_L9:;
- goto __pyx_L8;
- }
- __pyx_L8:;
-
- __pyx_r = 0;
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("_pyportmidi.Output.__init__");
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_s);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_OutputDevice);
- __Pyx_DECREF(__pyx_v_latency);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":240
- * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s
- *
- * def __dealloc__(self): # <<<<<<<<<<<<<<
- * if self.debug: print "Closing MIDI output stream and destroying instance"
- * #err = Pm_Abort(self.midi)
- */
-
-static void __pyx_pf_11_pyportmidi_6Output___dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_11_pyportmidi_6Output___dealloc__(PyObject *__pyx_v_self) {
- PyObject *__pyx_v_err;
- int __pyx_t_1;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- PmError __pyx_t_4;
- __Pyx_RefNannySetupContext("__dealloc__");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __pyx_v_err = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":241
- *
- * def __dealloc__(self):
- * if self.debug: print "Closing MIDI output stream and destroying instance" # <<<<<<<<<<<<<<
- * #err = Pm_Abort(self.midi)
- * #if err < 0: raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug;
- if (__pyx_t_1) {
- if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":244
- * #err = Pm_Abort(self.midi)
- * #if err < 0: raise Exception, Pm_GetErrorText(err)
- * err = Pm_Close(self.midi) # <<<<<<<<<<<<<<
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_t_2 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_v_err);
- __pyx_v_err = __pyx_t_2;
- __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":245
- * #if err < 0: raise Exception, Pm_GetErrorText(err)
- * err = Pm_Close(self.midi)
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_t_2 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (__pyx_t_3) {
- __pyx_t_4 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("_pyportmidi.Output.__dealloc__");
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_err);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":248
- *
- *
- * def _check_open(self): # <<<<<<<<<<<<<<
- * """ checks to see if the midi is open, and if not, raises an error.
- * """
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_6Output__check_open(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_6Output__check_open[] = " checks to see if the midi is open, and if not, raises an error.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_6Output__check_open(PyObject *__pyx_v_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- int __pyx_t_1;
- int __pyx_t_2;
- __Pyx_RefNannySetupContext("_check_open");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":252
- * """
- *
- * if self.midi == NULL: # <<<<<<<<<<<<<<
- * raise Exception, "midi Output not open."
- *
- */
- __pyx_t_1 = (((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi == NULL);
- if (__pyx_t_1) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":253
- *
- * if self.midi == NULL:
- * raise Exception, "midi Output not open." # <<<<<<<<<<<<<<
- *
- * if self._aborted:
- */
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_kp_s_5), 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":255
- * raise Exception, "midi Output not open."
- *
- * if self._aborted: # <<<<<<<<<<<<<<
- * raise Exception, "midi Output aborted. Need to call Close after Abort."
- *
- */
- __pyx_t_2 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->_aborted;
- if (__pyx_t_2) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":256
- *
- * if self._aborted:
- * raise Exception, "midi Output aborted. Need to call Close after Abort." # <<<<<<<<<<<<<<
- *
- * def Close(self):
- */
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_kp_s_6), 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_AddTraceback("_pyportmidi.Output._check_open");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":258
- * raise Exception, "midi Output aborted. Need to call Close after Abort."
- *
- * def Close(self): # <<<<<<<<<<<<<<
- * """
- * Close()
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_6Output_Close(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_6Output_Close[] = "\nClose()\n closes a midi stream, flushing any pending buffers.\n (PortMidi attempts to close open streams when the application\n exits -- this is particularly difficult under Windows.)\n ";
-static PyObject *__pyx_pf_11_pyportmidi_6Output_Close(PyObject *__pyx_v_self, PyObject *unused) {
- PyObject *__pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- PmError __pyx_t_3;
- __Pyx_RefNannySetupContext("Close");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __pyx_v_err = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":268
- * # return
- *
- * err = Pm_Close(self.midi) # <<<<<<<<<<<<<<
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_1 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_v_err);
- __pyx_v_err = __pyx_t_1;
- __pyx_t_1 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":269
- *
- * err = Pm_Close(self.midi)
- * if err < 0: # <<<<<<<<<<<<<<
- * raise Exception, Pm_GetErrorText(err)
- * #self.midi = NULL
- */
- __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (__pyx_t_2) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":270
- * err = Pm_Close(self.midi)
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- * #self.midi = NULL
- *
- */
- __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_1));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.Output.Close");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_err);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":274
- *
- *
- * def Abort(self): # <<<<<<<<<<<<<<
- * """
- * Abort() terminates outgoing messages immediately
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_6Output_Abort(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_6Output_Abort[] = "\nAbort() terminates outgoing messages immediately\n The caller should immediately close the output port;\n this call may result in transmission of a partial midi message.\n There is no abort for Midi input because the user can simply\n ignore messages in the buffer and close an input device at\n any time.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_6Output_Abort(PyObject *__pyx_v_self, PyObject *unused) {
- PyObject *__pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- PmError __pyx_t_3;
- __Pyx_RefNannySetupContext("Abort");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __pyx_v_err = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":286
- * # return
- *
- * err = Pm_Abort(self.midi) # <<<<<<<<<<<<<<
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_1 = PyInt_FromLong(Pm_Abort(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_v_err);
- __pyx_v_err = __pyx_t_1;
- __pyx_t_1 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":287
- *
- * err = Pm_Abort(self.midi)
- * if err < 0: # <<<<<<<<<<<<<<
- * raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (__pyx_t_2) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":288
- * err = Pm_Abort(self.midi)
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * self._aborted = 1
- */
- __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_1));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":290
- * raise Exception, Pm_GetErrorText(err)
- *
- * self._aborted = 1 # <<<<<<<<<<<<<<
- *
- *
- */
- ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->_aborted = 1;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.Output.Abort");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_err);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":293
- *
- *
- * def Write(self, data): # <<<<<<<<<<<<<<
- * """
- * Write(data)
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_6Output_Write(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static char __pyx_doc_11_pyportmidi_6Output_Write[] = "\nWrite(data)\n output a series of MIDI information in the form of a list:\n Write([[[status <,data1><,data2><,data3>],timestamp],\n [[status <,data1><,data2><,data3>],timestamp],...])\n <data> fields are optional\n example: choose program change 1 at time 20000 and\n send note 65 with velocity 100 500 ms later.\n Write([[[0xc0,0,0],20000],[[0x90,60,100],20500]])\n notes:\n 1. timestamps will be ignored if latency = 0.\n 2. To get a note to play immediately, send MIDI info with\n timestamp read from function Time.\n 3. understanding optional data fields:\n Write([[[0xc0,0,0],20000]]) is equivalent to\n Write([[[0xc0],20000]])\n ";
-static PyObject *__pyx_pf_11_pyportmidi_6Output_Write(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
- PmEvent __pyx_v_buffer[1024];
- PmError __pyx_v_err;
- int __pyx_v_i;
- PyObject *__pyx_v_loop1;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- Py_ssize_t __pyx_t_3;
- int __pyx_t_4;
- Py_ssize_t __pyx_t_5;
- PyObject *__pyx_t_6 = NULL;
- Py_ssize_t __pyx_t_7;
- int __pyx_t_8;
- PyObject *__pyx_t_9 = NULL;
- PyObject *__pyx_t_10 = NULL;
- PmMessage __pyx_t_11;
- PmTimestamp __pyx_t_12;
- __Pyx_RefNannySetupContext("Write");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_data);
- __pyx_v_loop1 = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":315
- * cdef int i
- *
- * self._check_open() # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":318
- *
- *
- * if len(data) > 1024: raise IndexError, 'maximum list length is 1024' # <<<<<<<<<<<<<<
- * else:
- * for loop1 in range(len(data)):
- */
- __pyx_t_3 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_4 = (__pyx_t_3 > 1024);
- if (__pyx_t_4) {
- __Pyx_Raise(__pyx_builtin_IndexError, ((PyObject *)__pyx_kp_s_7), 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- /*else*/ {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":320
- * if len(data) > 1024: raise IndexError, 'maximum list length is 1024'
- * else:
- * for loop1 in range(len(data)): # <<<<<<<<<<<<<<
- * if ((len(data[loop1][0]) > 4) |
- * (len(data[loop1][0]) < 1)):
- */
- __pyx_t_5 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
- __Pyx_GIVEREF(__pyx_t_2);
- __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
- __pyx_t_3 = 0; __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1);
- } else {
- __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- }
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- for (;;) {
- if (likely(PyList_CheckExact(__pyx_t_1))) {
- if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
- __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
- } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {
- if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
- __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
- } else {
- __pyx_t_2 = PyIter_Next(__pyx_t_1);
- if (!__pyx_t_2) {
- if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- break;
- }
- __Pyx_GOTREF(__pyx_t_2);
- }
- __Pyx_DECREF(__pyx_v_loop1);
- __pyx_v_loop1 = __pyx_t_2;
- __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":321
- * else:
- * for loop1 in range(len(data)):
- * if ((len(data[loop1][0]) > 4) | # <<<<<<<<<<<<<<
- * (len(data[loop1][0]) < 1)):
- * raise IndexError, str(len(data[loop1][0]))+' arguments in event list'
- */
- __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_5 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":322
- * for loop1 in range(len(data)):
- * if ((len(data[loop1][0]) > 4) |
- * (len(data[loop1][0]) < 1)): # <<<<<<<<<<<<<<
- * raise IndexError, str(len(data[loop1][0]))+' arguments in event list'
- * buffer[loop1].message = 0
- */
- __pyx_t_6 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- __pyx_t_7 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_4 = ((__pyx_t_5 > 4) | (__pyx_t_7 < 1));
- if (__pyx_t_4) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":323
- * if ((len(data[loop1][0]) > 4) |
- * (len(data[loop1][0]) < 1)):
- * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' # <<<<<<<<<<<<<<
- * buffer[loop1].message = 0
- * for i in range(len(data[loop1][0])):
- */
- __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_7 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_6);
- __Pyx_GIVEREF(__pyx_t_6);
- __pyx_t_6 = 0;
- __pyx_t_6 = PyObject_Call(((PyObject *)((PyObject*)&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyNumber_Add(__pyx_t_6, ((PyObject *)__pyx_kp_s_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_2, 0);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L8;
- }
- __pyx_L8:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":324
- * (len(data[loop1][0]) < 1)):
- * raise IndexError, str(len(data[loop1][0]))+' arguments in event list'
- * buffer[loop1].message = 0 # <<<<<<<<<<<<<<
- * for i in range(len(data[loop1][0])):
- * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i))
- */
- __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- (__pyx_v_buffer[__pyx_t_7]).message = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":325
- * raise IndexError, str(len(data[loop1][0]))+' arguments in event list'
- * buffer[loop1].message = 0
- * for i in range(len(data[loop1][0])): # <<<<<<<<<<<<<<
- * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i))
- * buffer[loop1].timestamp = data[loop1][1]
- */
- __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_7 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
- __pyx_v_i = __pyx_t_8;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":326
- * buffer[loop1].message = 0
- * for i in range(len(data[loop1][0])):
- * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) # <<<<<<<<<<<<<<
- * buffer[loop1].timestamp = data[loop1][1]
- * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp
- */
- __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_6 = __Pyx_PyInt_to_py_PmMessage((__pyx_v_buffer[__pyx_t_5]).message); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_9);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
- __pyx_t_9 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_9);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyInt_FromLong((8 * __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_10 = PyNumber_Lshift(__pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_10);
- __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyNumber_Add(__pyx_t_6, __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
- __pyx_t_11 = __Pyx_PyInt_from_py_PmMessage(__pyx_t_2); if (unlikely((__pyx_t_11 == (PmMessage)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- (__pyx_v_buffer[__pyx_t_5]).message = __pyx_t_11;
- }
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":327
- * for i in range(len(data[loop1][0])):
- * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i))
- * buffer[loop1].timestamp = data[loop1][1] # <<<<<<<<<<<<<<
- * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp
- * if self.debug: print "writing to midi buffer"
- */
- __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_2, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_10);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_12 = __Pyx_PyInt_from_py_PmTimestamp(__pyx_t_10); if (unlikely((__pyx_t_12 == (PmTimestamp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
- __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- (__pyx_v_buffer[__pyx_t_5]).timestamp = __pyx_t_12;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":328
- * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i))
- * buffer[loop1].timestamp = data[loop1][1]
- * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp # <<<<<<<<<<<<<<
- * if self.debug: print "writing to midi buffer"
- * err= Pm_Write(self.midi, buffer, len(data))
- */
- __pyx_t_8 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug;
- if (__pyx_t_8) {
- __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_10 = __Pyx_PyInt_to_py_PmMessage((__pyx_v_buffer[__pyx_t_5]).message); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_10);
- __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_2 = __Pyx_PyInt_to_py_PmTimestamp((__pyx_v_buffer[__pyx_t_5]).timestamp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_6 = PyTuple_New(5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_6);
- __Pyx_INCREF(__pyx_v_loop1);
- PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_loop1);
- __Pyx_GIVEREF(__pyx_v_loop1);
- __Pyx_INCREF(((PyObject *)__pyx_kp_s_9));
- PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_kp_s_9));
- __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_9));
- PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_10);
- __Pyx_GIVEREF(__pyx_t_10);
- __Pyx_INCREF(((PyObject *)__pyx_kp_s_9));
- PyTuple_SET_ITEM(__pyx_t_6, 3, ((PyObject *)__pyx_kp_s_9));
- __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_9));
- PyTuple_SET_ITEM(__pyx_t_6, 4, __pyx_t_2);
- __Pyx_GIVEREF(__pyx_t_2);
- __pyx_t_10 = 0;
- __pyx_t_2 = 0;
- if (__Pyx_Print(__pyx_t_6, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
- goto __pyx_L11;
- }
- __pyx_L11:;
- }
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":329
- * buffer[loop1].timestamp = data[loop1][1]
- * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp
- * if self.debug: print "writing to midi buffer" # <<<<<<<<<<<<<<
- * err= Pm_Write(self.midi, buffer, len(data))
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_8 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug;
- if (__pyx_t_8) {
- if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_10)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L12;
- }
- __pyx_L12:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":330
- * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp
- * if self.debug: print "writing to midi buffer"
- * err= Pm_Write(self.midi, buffer, len(data)) # <<<<<<<<<<<<<<
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_t_3 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_err = Pm_Write(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi, __pyx_v_buffer, __pyx_t_3);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":331
- * if self.debug: print "writing to midi buffer"
- * err= Pm_Write(self.midi, buffer, len(data))
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * def WriteShort(self, status, data1 = 0, data2 = 0):
- */
- __pyx_t_4 = (__pyx_v_err < 0);
- if (__pyx_t_4) {
- __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_1));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L13;
- }
- __pyx_L13:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_6);
- __Pyx_XDECREF(__pyx_t_9);
- __Pyx_XDECREF(__pyx_t_10);
- __Pyx_AddTraceback("_pyportmidi.Output.Write");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_loop1);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_data);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":333
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- * def WriteShort(self, status, data1 = 0, data2 = 0): # <<<<<<<<<<<<<<
- * """
- * WriteShort(status <, data1><, data2>)
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteShort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_11_pyportmidi_6Output_WriteShort[] = "\nWriteShort(status <, data1><, data2>)\n output MIDI information of 3 bytes or less.\n data fields are optional\n status byte could be:\n 0xc0 = program change\n 0x90 = note on\n etc.\n data bytes are optional and assumed 0 if omitted\n example: note 65 on with velocity 100\n WriteShort(0x90,65,100)\n ";
-static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteShort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_status = 0;
- PyObject *__pyx_v_data1 = 0;
- PyObject *__pyx_v_data2 = 0;
- PmEvent __pyx_v_buffer[1];
- PmError __pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- PmMessage __pyx_t_4;
- int __pyx_t_5;
- int __pyx_t_6;
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__status,&__pyx_n_s__data1,&__pyx_n_s__data2,0};
- __Pyx_RefNannySetupContext("WriteShort");
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
- PyObject* values[3] = {0,0,0};
- values[1] = ((PyObject *)__pyx_int_0);
- values[2] = ((PyObject *)__pyx_int_0);
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
- case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 0:
- values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__status);
- if (likely(values[0])) kw_args--;
- else goto __pyx_L5_argtuple_error;
- case 1:
- if (kw_args > 1) {
- PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__data1);
- if (unlikely(value)) { values[1] = value; kw_args--; }
- }
- case 2:
- if (kw_args > 1) {
- PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__data2);
- if (unlikely(value)) { values[2] = value; kw_args--; }
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "WriteShort") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- }
- __pyx_v_status = values[0];
- __pyx_v_data1 = values[1];
- __pyx_v_data2 = values[2];
- } else {
- __pyx_v_data1 = ((PyObject *)__pyx_int_0);
- __pyx_v_data2 = ((PyObject *)__pyx_int_0);
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 3: __pyx_v_data2 = PyTuple_GET_ITEM(__pyx_args, 2);
- case 2: __pyx_v_data1 = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: __pyx_v_status = PyTuple_GET_ITEM(__pyx_args, 0);
- break;
- default: goto __pyx_L5_argtuple_error;
- }
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("WriteShort", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- __pyx_L3_error:;
- __Pyx_AddTraceback("_pyportmidi.Output.WriteShort");
- return NULL;
- __pyx_L4_argument_unpacking_done:;
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_status);
- __Pyx_INCREF(__pyx_v_data1);
- __Pyx_INCREF(__pyx_v_data2);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":348
- * cdef PmEvent buffer[1]
- * cdef PmError err
- * self._check_open() # <<<<<<<<<<<<<<
- *
- * buffer[0].timestamp = Pt_Time()
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":350
- * self._check_open()
- *
- * buffer[0].timestamp = Pt_Time() # <<<<<<<<<<<<<<
- * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF))
- * if self.debug: print "Writing to MIDI buffer"
- */
- (__pyx_v_buffer[0]).timestamp = Pt_Time();
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":351
- *
- * buffer[0].timestamp = Pt_Time()
- * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) # <<<<<<<<<<<<<<
- * if self.debug: print "Writing to MIDI buffer"
- * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length
- */
- __pyx_t_2 = PyNumber_Lshift(__pyx_v_data2, __pyx_int_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_1 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF0000); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyNumber_Lshift(__pyx_v_data1, __pyx_int_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF00); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyNumber_Or(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_t_3 = PyNumber_And(__pyx_v_status, __pyx_int_0xFF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_1 = PyNumber_Or(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_t_4 = __Pyx_PyInt_from_py_PmMessage(__pyx_t_1); if (unlikely((__pyx_t_4 == (PmMessage)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- (__pyx_v_buffer[0]).message = __pyx_t_4;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":352
- * buffer[0].timestamp = Pt_Time()
- * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF))
- * if self.debug: print "Writing to MIDI buffer" # <<<<<<<<<<<<<<
- * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length
- * if err < 0 : raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_5 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug;
- if (__pyx_t_5) {
- if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_11)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":353
- * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF))
- * if self.debug: print "Writing to MIDI buffer"
- * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length # <<<<<<<<<<<<<<
- * if err < 0 : raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_v_err = Pm_Write(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi, __pyx_v_buffer, 1);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":354
- * if self.debug: print "Writing to MIDI buffer"
- * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length
- * if err < 0 : raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * def WriteSysEx(self, when, msg):
- */
- __pyx_t_6 = (__pyx_v_err < 0);
- if (__pyx_t_6) {
- __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_1));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L7;
- }
- __pyx_L7:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("_pyportmidi.Output.WriteShort");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_status);
- __Pyx_DECREF(__pyx_v_data1);
- __Pyx_DECREF(__pyx_v_data2);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":356
- * if err < 0 : raise Exception, Pm_GetErrorText(err)
- *
- * def WriteSysEx(self, when, msg): # <<<<<<<<<<<<<<
- * """
- * WriteSysEx(<timestamp>,<msg>)
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteSysEx(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_11_pyportmidi_6Output_WriteSysEx[] = "\n WriteSysEx(<timestamp>,<msg>)\n writes a timestamped system-exclusive midi message.\n <msg> can be a *list* or a *string*\n example:\n (assuming y is an input MIDI stream)\n y.WriteSysEx(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7')\n is equivalent to\n y.WriteSysEx(pypm.Time,\n [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7])\n ";
-static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteSysEx(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_when = 0;
- PyObject *__pyx_v_msg = 0;
- PmError __pyx_v_err;
- char *__pyx_v_cmsg;
- PtTimestamp __pyx_v_CurTime;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- PyObject *__pyx_t_4 = NULL;
- char *__pyx_t_5;
- PmTimestamp __pyx_t_6;
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__when,&__pyx_n_s__msg,0};
- __Pyx_RefNannySetupContext("WriteSysEx");
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
- PyObject* values[2] = {0,0};
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 0:
- values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__when);
- if (likely(values[0])) kw_args--;
- else goto __pyx_L5_argtuple_error;
- case 1:
- values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__msg);
- if (likely(values[1])) kw_args--;
- else {
- __Pyx_RaiseArgtupleInvalid("WriteSysEx", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "WriteSysEx") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- }
- __pyx_v_when = values[0];
- __pyx_v_msg = values[1];
- } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
- goto __pyx_L5_argtuple_error;
- } else {
- __pyx_v_when = PyTuple_GET_ITEM(__pyx_args, 0);
- __pyx_v_msg = PyTuple_GET_ITEM(__pyx_args, 1);
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("WriteSysEx", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- __pyx_L3_error:;
- __Pyx_AddTraceback("_pyportmidi.Output.WriteSysEx");
- return NULL;
- __pyx_L4_argument_unpacking_done:;
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_when);
- __Pyx_INCREF(__pyx_v_msg);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":372
- * cdef PtTimestamp CurTime
- *
- * self._check_open() # <<<<<<<<<<<<<<
- *
- * if type(msg) is list:
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":374
- * self._check_open()
- *
- * if type(msg) is list: # <<<<<<<<<<<<<<
- * msg = array.array('B',msg).tostring() # Markus Pfaff contribution
- * cmsg = msg
- */
- __pyx_t_3 = (((PyObject *)Py_TYPE(__pyx_v_msg)) == ((PyObject *)((PyObject*)&PyList_Type)));
- if (__pyx_t_3) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":375
- *
- * if type(msg) is list:
- * msg = array.array('B',msg).tostring() # Markus Pfaff contribution # <<<<<<<<<<<<<<
- * cmsg = msg
- *
- */
- __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(((PyObject *)__pyx_n_s__B));
- PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_n_s__B));
- __Pyx_GIVEREF(((PyObject *)__pyx_n_s__B));
- __Pyx_INCREF(__pyx_v_msg);
- PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_msg);
- __Pyx_GIVEREF(__pyx_v_msg);
- __pyx_t_4 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_4);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__tostring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
- __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_4);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __Pyx_DECREF(__pyx_v_msg);
- __pyx_v_msg = __pyx_t_4;
- __pyx_t_4 = 0;
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":376
- * if type(msg) is list:
- * msg = array.array('B',msg).tostring() # Markus Pfaff contribution
- * cmsg = msg # <<<<<<<<<<<<<<
- *
- * CurTime = Pt_Time()
- */
- __pyx_t_5 = __Pyx_PyBytes_AsString(__pyx_v_msg); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_cmsg = __pyx_t_5;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":378
- * cmsg = msg
- *
- * CurTime = Pt_Time() # <<<<<<<<<<<<<<
- * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg)
- * if err < 0 : raise Exception, Pm_GetErrorText(err)
- */
- __pyx_v_CurTime = Pt_Time();
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":379
- *
- * CurTime = Pt_Time()
- * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg) # <<<<<<<<<<<<<<
- * if err < 0 : raise Exception, Pm_GetErrorText(err)
- * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my
- */
- __pyx_t_6 = __Pyx_PyInt_from_py_PmTimestamp(__pyx_v_when); if (unlikely((__pyx_t_6 == (PmTimestamp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_err = Pm_WriteSysEx(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi, __pyx_t_6, ((unsigned char *)__pyx_v_cmsg));
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":380
- * CurTime = Pt_Time()
- * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg)
- * if err < 0 : raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my
- * pass # win32 machine crashes w/ multiple SysEx
- */
- __pyx_t_3 = (__pyx_v_err < 0);
- if (__pyx_t_3) {
- __pyx_t_4 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_4));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L7;
- }
- __pyx_L7:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":381
- * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg)
- * if err < 0 : raise Exception, Pm_GetErrorText(err)
- * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my # <<<<<<<<<<<<<<
- * pass # win32 machine crashes w/ multiple SysEx
- *
- */
- while (1) {
- __pyx_t_3 = (Pt_Time() == __pyx_v_CurTime);
- if (!__pyx_t_3) break;
- }
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_4);
- __Pyx_AddTraceback("_pyportmidi.Output.WriteSysEx");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_when);
- __Pyx_DECREF(__pyx_v_msg);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":404
- * cdef int i
- *
- * def __init__(self, InputDevice, buffersize=4096): # <<<<<<<<<<<<<<
- * cdef PmError err
- * self.i = InputDevice
- */
-
-static int __pyx_pf_11_pyportmidi_5Input___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_11_pyportmidi_5Input___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
- PyObject *__pyx_v_InputDevice = 0;
- PyObject *__pyx_v_buffersize = 0;
- PmError __pyx_v_err;
- int __pyx_r;
- int __pyx_t_1;
- long __pyx_t_2;
- int __pyx_t_3;
- PyObject *__pyx_t_4 = NULL;
- static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__InputDevice,&__pyx_n_s__buffersize,0};
- __Pyx_RefNannySetupContext("__init__");
- if (unlikely(__pyx_kwds)) {
- Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
- PyObject* values[2] = {0,0};
- values[1] = ((PyObject *)__pyx_int_4096);
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
- case 0: break;
- default: goto __pyx_L5_argtuple_error;
- }
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 0:
- values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__InputDevice);
- if (likely(values[0])) kw_args--;
- else goto __pyx_L5_argtuple_error;
- case 1:
- if (kw_args > 1) {
- PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__buffersize);
- if (unlikely(value)) { values[1] = value; kw_args--; }
- }
- }
- if (unlikely(kw_args > 0)) {
- if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- }
- __pyx_v_InputDevice = values[0];
- __pyx_v_buffersize = values[1];
- } else {
- __pyx_v_buffersize = ((PyObject *)__pyx_int_4096);
- switch (PyTuple_GET_SIZE(__pyx_args)) {
- case 2: __pyx_v_buffersize = PyTuple_GET_ITEM(__pyx_args, 1);
- case 1: __pyx_v_InputDevice = PyTuple_GET_ITEM(__pyx_args, 0);
- break;
- default: goto __pyx_L5_argtuple_error;
- }
- }
- goto __pyx_L4_argument_unpacking_done;
- __pyx_L5_argtuple_error:;
- __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
- __pyx_L3_error:;
- __Pyx_AddTraceback("_pyportmidi.Input.__init__");
- return -1;
- __pyx_L4_argument_unpacking_done:;
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_InputDevice);
- __Pyx_INCREF(__pyx_v_buffersize);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":406
- * def __init__(self, InputDevice, buffersize=4096):
- * cdef PmError err
- * self.i = InputDevice # <<<<<<<<<<<<<<
- * self.debug = 0
- * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL)
- */
- __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_InputDevice); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->i = __pyx_t_1;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":407
- * cdef PmError err
- * self.i = InputDevice
- * self.debug = 0 # <<<<<<<<<<<<<<
- * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL)
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- */
- ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->debug = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":408
- * self.i = InputDevice
- * self.debug = 0
- * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) # <<<<<<<<<<<<<<
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- * if self.debug: print "MIDI input opened."
- */
- __pyx_t_2 = __Pyx_PyInt_AsLong(__pyx_v_buffersize); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_err = Pm_OpenInput((&((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi), ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->i, NULL, __pyx_t_2, (&Pt_Time), NULL);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":409
- * self.debug = 0
- * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL)
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- * if self.debug: print "MIDI input opened."
- *
- */
- __pyx_t_3 = (__pyx_v_err < 0);
- if (__pyx_t_3) {
- __pyx_t_4 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_4));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":410
- * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL)
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- * if self.debug: print "MIDI input opened." # <<<<<<<<<<<<<<
- *
- * def __dealloc__(self):
- */
- __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->debug;
- if (__pyx_t_1) {
- if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_12)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L7;
- }
- __pyx_L7:;
-
- __pyx_r = 0;
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_4);
- __Pyx_AddTraceback("_pyportmidi.Input.__init__");
- __pyx_r = -1;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_InputDevice);
- __Pyx_DECREF(__pyx_v_buffersize);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":412
- * if self.debug: print "MIDI input opened."
- *
- * def __dealloc__(self): # <<<<<<<<<<<<<<
- * cdef PmError err
- * if self.debug: print "Closing MIDI input stream and destroying instance"
- */
-
-static void __pyx_pf_11_pyportmidi_5Input___dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_11_pyportmidi_5Input___dealloc__(PyObject *__pyx_v_self) {
- PmError __pyx_v_err;
- int __pyx_t_1;
- int __pyx_t_2;
- PyObject *__pyx_t_3 = NULL;
- __Pyx_RefNannySetupContext("__dealloc__");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":414
- * def __dealloc__(self):
- * cdef PmError err
- * if self.debug: print "Closing MIDI input stream and destroying instance" # <<<<<<<<<<<<<<
- *
- * err = Pm_Close(self.midi)
- */
- __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->debug;
- if (__pyx_t_1) {
- if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_13)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":416
- * if self.debug: print "Closing MIDI input stream and destroying instance"
- *
- * err = Pm_Close(self.midi) # <<<<<<<<<<<<<<
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err)
- */
- __pyx_v_err = Pm_Close(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":417
- *
- * err = Pm_Close(self.midi)
- * if err < 0: # <<<<<<<<<<<<<<
- * raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_t_2 = (__pyx_v_err < 0);
- if (__pyx_t_2) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":418
- * err = Pm_Close(self.midi)
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_t_3 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_3));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_3), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_3);
- __Pyx_AddTraceback("_pyportmidi.Input.__dealloc__");
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":422
- *
- *
- * def _check_open(self): # <<<<<<<<<<<<<<
- * """ checks to see if the midi is open, and if not, raises an error.
- * """
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_5Input__check_open(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_5Input__check_open[] = " checks to see if the midi is open, and if not, raises an error.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_5Input__check_open(PyObject *__pyx_v_self, PyObject *unused) {
- PyObject *__pyx_r = NULL;
- int __pyx_t_1;
- __Pyx_RefNannySetupContext("_check_open");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":426
- * """
- *
- * if self.midi == NULL: # <<<<<<<<<<<<<<
- * raise Exception, "midi Input not open."
- *
- */
- __pyx_t_1 = (((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi == NULL);
- if (__pyx_t_1) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":427
- *
- * if self.midi == NULL:
- * raise Exception, "midi Input not open." # <<<<<<<<<<<<<<
- *
- *
- */
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_kp_s_14), 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_AddTraceback("_pyportmidi.Input._check_open");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":430
- *
- *
- * def Close(self): # <<<<<<<<<<<<<<
- * """
- * Close()
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_5Input_Close(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_5Input_Close[] = "\nClose()\n closes a midi stream, flushing any pending buffers.\n (PortMidi attempts to close open streams when the application\n exits -- this is particularly difficult under Windows.)\n ";
-static PyObject *__pyx_pf_11_pyportmidi_5Input_Close(PyObject *__pyx_v_self, PyObject *unused) {
- PyObject *__pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- int __pyx_t_2;
- PmError __pyx_t_3;
- __Pyx_RefNannySetupContext("Close");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __pyx_v_err = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":440
- * # return
- *
- * err = Pm_Close(self.midi) # <<<<<<<<<<<<<<
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_1 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_v_err);
- __pyx_v_err = __pyx_t_1;
- __pyx_t_1 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":441
- *
- * err = Pm_Close(self.midi)
- * if err < 0: # <<<<<<<<<<<<<<
- * raise Exception, Pm_GetErrorText(err)
- * #self.midi = NULL
- */
- __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- if (__pyx_t_2) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":442
- * err = Pm_Close(self.midi)
- * if err < 0:
- * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- * #self.midi = NULL
- *
- */
- __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_1));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_AddTraceback("_pyportmidi.Input.Close");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_err);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":447
- *
- *
- * def SetFilter(self, filters): # <<<<<<<<<<<<<<
- * """
- * SetFilter(<filters>) sets filters on an open input stream
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_5Input_SetFilter(PyObject *__pyx_v_self, PyObject *__pyx_v_filters); /*proto*/
-static char __pyx_doc_11_pyportmidi_5Input_SetFilter[] = "\n SetFilter(<filters>) sets filters on an open input stream\n to drop selected input types. By default, only active sensing\n messages are filtered. To prohibit, say, active sensing and\n sysex messages, call\n SetFilter(stream, FILT_ACTIVE | FILT_SYSEX);\n\n Filtering is useful when midi routing or midi thru functionality\n is being provided by the user application.\n For example, you may want to exclude timing messages\n (clock, MTC, start/stop/continue), while allowing note-related\n messages to pass. Or you may be using a sequencer or drum-machine\n for MIDI clock information but want to exclude any notes\n it may play.\n\n Note: SetFilter empties the buffer after setting the filter,\n just in case anything got through.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_5Input_SetFilter(PyObject *__pyx_v_self, PyObject *__pyx_v_filters) {
- PmEvent __pyx_v_buffer[1];
- PmError __pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- long __pyx_t_3;
- int __pyx_t_4;
- __Pyx_RefNannySetupContext("SetFilter");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_filters);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":469
- * cdef PmError err
- *
- * self._check_open() # <<<<<<<<<<<<<<
- *
- *
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":472
- *
- *
- * err = Pm_SetFilter(self.midi, filters) # <<<<<<<<<<<<<<
- *
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- */
- __pyx_t_3 = __Pyx_PyInt_AsLong(__pyx_v_filters); if (unlikely((__pyx_t_3 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_err = Pm_SetFilter(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_t_3);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":474
- * err = Pm_SetFilter(self.midi, filters)
- *
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * while(Pm_Poll(self.midi) != pmNoError):
- */
- __pyx_t_4 = (__pyx_v_err < 0);
- if (__pyx_t_4) {
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":476
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- * while(Pm_Poll(self.midi) != pmNoError): # <<<<<<<<<<<<<<
- *
- * err = Pm_Read(self.midi,buffer,1)
- */
- while (1) {
- __pyx_t_4 = (Pm_Poll(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi) != pmNoError);
- if (!__pyx_t_4) break;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":478
- * while(Pm_Poll(self.midi) != pmNoError):
- *
- * err = Pm_Read(self.midi,buffer,1) # <<<<<<<<<<<<<<
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_v_err = Pm_Read(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_v_buffer, 1);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":479
- *
- * err = Pm_Read(self.midi,buffer,1)
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * def SetChannelMask(self, mask):
- */
- __pyx_t_4 = (__pyx_v_err < 0);
- if (__pyx_t_4) {
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L8;
- }
- __pyx_L8:;
- }
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("_pyportmidi.Input.SetFilter");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_filters);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":481
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- * def SetChannelMask(self, mask): # <<<<<<<<<<<<<<
- * """
- * SetChannelMask(<mask>) filters incoming messages based on channel.
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_5Input_SetChannelMask(PyObject *__pyx_v_self, PyObject *__pyx_v_mask); /*proto*/
-static char __pyx_doc_11_pyportmidi_5Input_SetChannelMask[] = "\n SetChannelMask(<mask>) filters incoming messages based on channel.\n The mask is a 16-bit bitfield corresponding to appropriate channels\n Channel(<channel>) can assist in calling this function.\n i.e. to set receive only input on channel 1, call with\n SetChannelMask(Channel(1))\n Multiple channels should be OR'd together, like\n SetChannelMask(Channel(10) | Channel(11))\n note: PyPortMidi Channel function has been altered from\n the original PortMidi c call to correct for what\n seems to be a bug --- i.e. channel filters were\n all numbered from 0 to 15 instead of 1 to 16.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_5Input_SetChannelMask(PyObject *__pyx_v_self, PyObject *__pyx_v_mask) {
- PmError __pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- int __pyx_t_4;
- __Pyx_RefNannySetupContext("SetChannelMask");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_mask);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":497
- * cdef PmError err
- *
- * self._check_open() # <<<<<<<<<<<<<<
- *
- * err = Pm_SetChannelMask(self.midi,mask)
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":499
- * self._check_open()
- *
- * err = Pm_SetChannelMask(self.midi,mask) # <<<<<<<<<<<<<<
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- */
- __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_mask); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_v_err = Pm_SetChannelMask(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_t_3);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":500
- *
- * err = Pm_SetChannelMask(self.midi,mask)
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- *
- * def Poll(self):
- */
- __pyx_t_4 = (__pyx_v_err < 0);
- if (__pyx_t_4) {
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("_pyportmidi.Input.SetChannelMask");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_mask);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":502
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- *
- * def Poll(self): # <<<<<<<<<<<<<<
- * """
- * Poll tests whether input is available,
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_5Input_Poll(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static char __pyx_doc_11_pyportmidi_5Input_Poll[] = "\n Poll tests whether input is available,\n returning TRUE, FALSE, or an error value.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_5Input_Poll(PyObject *__pyx_v_self, PyObject *unused) {
- PmError __pyx_v_err;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- __Pyx_RefNannySetupContext("Poll");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":508
- * """
- * cdef PmError err
- * self._check_open() # <<<<<<<<<<<<<<
- *
- * err = Pm_Poll(self.midi)
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":510
- * self._check_open()
- *
- * err = Pm_Poll(self.midi) # <<<<<<<<<<<<<<
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- * return err
- */
- __pyx_v_err = Pm_Poll(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":511
- *
- * err = Pm_Poll(self.midi)
- * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<<
- * return err
- *
- */
- __pyx_t_3 = (__pyx_v_err < 0);
- if (__pyx_t_3) {
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":512
- * err = Pm_Poll(self.midi)
- * if err < 0: raise Exception, Pm_GetErrorText(err)
- * return err # <<<<<<<<<<<<<<
- *
- * def Read(self,length):
- */
- __Pyx_XDECREF(__pyx_r);
- __pyx_t_2 = PyInt_FromLong(__pyx_v_err); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_r = __pyx_t_2;
- __pyx_t_2 = 0;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_AddTraceback("_pyportmidi.Input.Poll");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":514
- * return err
- *
- * def Read(self,length): # <<<<<<<<<<<<<<
- * """
- * Read(length): returns up to <length> midi events stored in
- */
-
-static PyObject *__pyx_pf_11_pyportmidi_5Input_Read(PyObject *__pyx_v_self, PyObject *__pyx_v_length); /*proto*/
-static char __pyx_doc_11_pyportmidi_5Input_Read[] = "\nRead(length): returns up to <length> midi events stored in\nthe buffer and returns them as a list:\n[[[status,data1,data2,data3],timestamp],\n [[status,data1,data2,data3],timestamp],...]\nexample: Read(50) returns all the events in the buffer,\n up to 50 events.\n ";
-static PyObject *__pyx_pf_11_pyportmidi_5Input_Read(PyObject *__pyx_v_self, PyObject *__pyx_v_length) {
- PmEvent __pyx_v_buffer[1024];
- PyObject *__pyx_v_x;
- PyObject *__pyx_v_NumEvents;
- PyObject *__pyx_v_loop;
- PyObject *__pyx_r = NULL;
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- int __pyx_t_3;
- long __pyx_t_4;
- PmError __pyx_t_5;
- Py_ssize_t __pyx_t_6;
- Py_ssize_t __pyx_t_7;
- PyObject *__pyx_t_8 = NULL;
- PyObject *__pyx_t_9 = NULL;
- PyObject *__pyx_t_10 = NULL;
- PyObject *__pyx_t_11 = NULL;
- __Pyx_RefNannySetupContext("Read");
- __Pyx_INCREF((PyObject *)__pyx_v_self);
- __Pyx_INCREF(__pyx_v_length);
- __pyx_v_x = Py_None; __Pyx_INCREF(Py_None);
- __pyx_v_NumEvents = Py_None; __Pyx_INCREF(Py_None);
- __pyx_v_loop = Py_None; __Pyx_INCREF(Py_None);
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":525
- * cdef PmEvent buffer[1024]
- *
- * self._check_open() # <<<<<<<<<<<<<<
- *
- * x = []
- */
- __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":527
- * self._check_open()
- *
- * x = [] # <<<<<<<<<<<<<<
- *
- * if length > 1024: raise IndexError, 'maximum buffer length is 1024'
- */
- __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_DECREF(__pyx_v_x);
- __pyx_v_x = ((PyObject *)__pyx_t_2);
- __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":529
- * x = []
- *
- * if length > 1024: raise IndexError, 'maximum buffer length is 1024' # <<<<<<<<<<<<<<
- * if length < 1: raise IndexError, 'minimum buffer length is 1'
- * NumEvents = Pm_Read(self.midi,buffer,length)
- */
- __pyx_t_2 = PyObject_RichCompare(__pyx_v_length, __pyx_int_1024, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (__pyx_t_3) {
- __Pyx_Raise(__pyx_builtin_IndexError, ((PyObject *)__pyx_kp_s_15), 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L5;
- }
- __pyx_L5:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":530
- *
- * if length > 1024: raise IndexError, 'maximum buffer length is 1024'
- * if length < 1: raise IndexError, 'minimum buffer length is 1' # <<<<<<<<<<<<<<
- * NumEvents = Pm_Read(self.midi,buffer,length)
- * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents)
- */
- __pyx_t_2 = PyObject_RichCompare(__pyx_v_length, __pyx_int_1, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (__pyx_t_3) {
- __Pyx_Raise(__pyx_builtin_IndexError, ((PyObject *)__pyx_kp_s_16), 0);
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L6;
- }
- __pyx_L6:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":531
- * if length > 1024: raise IndexError, 'maximum buffer length is 1024'
- * if length < 1: raise IndexError, 'minimum buffer length is 1'
- * NumEvents = Pm_Read(self.midi,buffer,length) # <<<<<<<<<<<<<<
- * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents)
- * x=[]
- */
- __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_v_length); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_2 = PyInt_FromLong(Pm_Read(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_v_buffer, __pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_v_NumEvents);
- __pyx_v_NumEvents = __pyx_t_2;
- __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":532
- * if length < 1: raise IndexError, 'minimum buffer length is 1'
- * NumEvents = Pm_Read(self.midi,buffer,length)
- * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) # <<<<<<<<<<<<<<
- * x=[]
- * if NumEvents >= 1:
- */
- __pyx_t_2 = PyObject_RichCompare(__pyx_v_NumEvents, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (__pyx_t_3) {
- __pyx_t_5 = ((PmError)PyInt_AsLong(__pyx_v_NumEvents)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0);
- __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
- {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- goto __pyx_L7;
- }
- __pyx_L7:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":533
- * NumEvents = Pm_Read(self.midi,buffer,length)
- * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents)
- * x=[] # <<<<<<<<<<<<<<
- * if NumEvents >= 1:
- * for loop in range(NumEvents):
- */
- __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_2));
- __Pyx_DECREF(__pyx_v_x);
- __pyx_v_x = ((PyObject *)__pyx_t_2);
- __pyx_t_2 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":534
- * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents)
- * x=[]
- * if NumEvents >= 1: # <<<<<<<<<<<<<<
- * for loop in range(NumEvents):
- * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp])
- */
- __pyx_t_2 = PyObject_RichCompare(__pyx_v_NumEvents, __pyx_int_1, Py_GE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (__pyx_t_3) {
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":535
- * x=[]
- * if NumEvents >= 1:
- * for loop in range(NumEvents): # <<<<<<<<<<<<<<
- * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp])
- * return x
- */
- __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_INCREF(__pyx_v_NumEvents);
- PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_NumEvents);
- __Pyx_GIVEREF(__pyx_v_NumEvents);
- __pyx_t_1 = PyObject_Call(__pyx_builtin_range, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
- __pyx_t_6 = 0; __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2);
- } else {
- __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- }
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
- for (;;) {
- if (likely(PyList_CheckExact(__pyx_t_2))) {
- if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break;
- __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++;
- } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
- if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
- __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++;
- } else {
- __pyx_t_1 = PyIter_Next(__pyx_t_2);
- if (!__pyx_t_1) {
- if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- break;
- }
- __Pyx_GOTREF(__pyx_t_1);
- }
- __Pyx_DECREF(__pyx_v_loop);
- __pyx_v_loop = __pyx_t_1;
- __pyx_t_1 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":536
- * if NumEvents >= 1:
- * for loop in range(NumEvents):
- * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) # <<<<<<<<<<<<<<
- * return x
- */
- __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_1 = __Pyx_PyInt_to_py_PmMessage(((__pyx_v_buffer[__pyx_t_7]).message & 0xff)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_8 = __Pyx_PyInt_to_py_PmMessage((((__pyx_v_buffer[__pyx_t_7]).message >> 8) & 0xFF)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_8);
- __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_9 = __Pyx_PyInt_to_py_PmMessage((((__pyx_v_buffer[__pyx_t_7]).message >> 16) & 0xFF)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_9);
- __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_10 = __Pyx_PyInt_to_py_PmMessage((((__pyx_v_buffer[__pyx_t_7]).message >> 24) & 0xFF)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_10);
- __pyx_t_11 = PyList_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_11));
- PyList_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
- __Pyx_GIVEREF(__pyx_t_1);
- PyList_SET_ITEM(__pyx_t_11, 1, __pyx_t_8);
- __Pyx_GIVEREF(__pyx_t_8);
- PyList_SET_ITEM(__pyx_t_11, 2, __pyx_t_9);
- __Pyx_GIVEREF(__pyx_t_9);
- PyList_SET_ITEM(__pyx_t_11, 3, __pyx_t_10);
- __Pyx_GIVEREF(__pyx_t_10);
- __pyx_t_1 = 0;
- __pyx_t_8 = 0;
- __pyx_t_9 = 0;
- __pyx_t_10 = 0;
- __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_t_10 = __Pyx_PyInt_to_py_PmTimestamp((__pyx_v_buffer[__pyx_t_7]).timestamp); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_10);
- __pyx_t_9 = PyList_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_9));
- PyList_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_11));
- __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
- PyList_SET_ITEM(__pyx_t_9, 1, __pyx_t_10);
- __Pyx_GIVEREF(__pyx_t_10);
- __pyx_t_11 = 0;
- __pyx_t_10 = 0;
- __pyx_t_10 = __Pyx_PyObject_Append(__pyx_v_x, ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_10);
- __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
- __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
- }
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- goto __pyx_L8;
- }
- __pyx_L8:;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":537
- * for loop in range(NumEvents):
- * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp])
- * return x # <<<<<<<<<<<<<<
- */
- __Pyx_XDECREF(__pyx_r);
- __Pyx_INCREF(__pyx_v_x);
- __pyx_r = __pyx_v_x;
- goto __pyx_L0;
-
- __pyx_r = Py_None; __Pyx_INCREF(Py_None);
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_8);
- __Pyx_XDECREF(__pyx_t_9);
- __Pyx_XDECREF(__pyx_t_10);
- __Pyx_XDECREF(__pyx_t_11);
- __Pyx_AddTraceback("_pyportmidi.Input.Read");
- __pyx_r = NULL;
- __pyx_L0:;
- __Pyx_DECREF(__pyx_v_x);
- __Pyx_DECREF(__pyx_v_NumEvents);
- __Pyx_DECREF(__pyx_v_loop);
- __Pyx_DECREF((PyObject *)__pyx_v_self);
- __Pyx_DECREF(__pyx_v_length);
- __Pyx_XGIVEREF(__pyx_r);
- __Pyx_RefNannyFinishContext();
- return __pyx_r;
-}
-
-static PyObject *__pyx_tp_new_11_pyportmidi_Output(PyTypeObject *t, PyObject *a, PyObject *k) {
- PyObject *o = (*t->tp_alloc)(t, 0);
- if (!o) return 0;
- return o;
-}
-
-static void __pyx_tp_dealloc_11_pyportmidi_Output(PyObject *o) {
- {
- PyObject *etype, *eval, *etb;
- PyErr_Fetch(&etype, &eval, &etb);
- ++Py_REFCNT(o);
- __pyx_pf_11_pyportmidi_6Output___dealloc__(o);
- if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
- --Py_REFCNT(o);
- PyErr_Restore(etype, eval, etb);
- }
- (*Py_TYPE(o)->tp_free)(o);
-}
-
-static struct PyMethodDef __pyx_methods_11_pyportmidi_Output[] = {
- {__Pyx_NAMESTR("_check_open"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output__check_open, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output__check_open)},
- {__Pyx_NAMESTR("Close"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_Close, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_Close)},
- {__Pyx_NAMESTR("Abort"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_Abort, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_Abort)},
- {__Pyx_NAMESTR("Write"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_Write, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_Write)},
- {__Pyx_NAMESTR("WriteShort"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_WriteShort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_WriteShort)},
- {__Pyx_NAMESTR("WriteSysEx"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_WriteSysEx, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_WriteSysEx)},
- {0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_Output = {
- 0, /*nb_add*/
- 0, /*nb_subtract*/
- 0, /*nb_multiply*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_divide*/
- #endif
- 0, /*nb_remainder*/
- 0, /*nb_divmod*/
- 0, /*nb_power*/
- 0, /*nb_negative*/
- 0, /*nb_positive*/
- 0, /*nb_absolute*/
- 0, /*nb_nonzero*/
- 0, /*nb_invert*/
- 0, /*nb_lshift*/
- 0, /*nb_rshift*/
- 0, /*nb_and*/
- 0, /*nb_xor*/
- 0, /*nb_or*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_coerce*/
- #endif
- 0, /*nb_int*/
- #if PY_MAJOR_VERSION >= 3
- 0, /*reserved*/
- #else
- 0, /*nb_long*/
- #endif
- 0, /*nb_float*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_oct*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_hex*/
- #endif
- 0, /*nb_inplace_add*/
- 0, /*nb_inplace_subtract*/
- 0, /*nb_inplace_multiply*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_inplace_divide*/
- #endif
- 0, /*nb_inplace_remainder*/
- 0, /*nb_inplace_power*/
- 0, /*nb_inplace_lshift*/
- 0, /*nb_inplace_rshift*/
- 0, /*nb_inplace_and*/
- 0, /*nb_inplace_xor*/
- 0, /*nb_inplace_or*/
- 0, /*nb_floor_divide*/
- 0, /*nb_true_divide*/
- 0, /*nb_inplace_floor_divide*/
- 0, /*nb_inplace_true_divide*/
- #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
- 0, /*nb_index*/
- #endif
-};
-
-static PySequenceMethods __pyx_tp_as_sequence_Output = {
- 0, /*sq_length*/
- 0, /*sq_concat*/
- 0, /*sq_repeat*/
- 0, /*sq_item*/
- 0, /*sq_slice*/
- 0, /*sq_ass_item*/
- 0, /*sq_ass_slice*/
- 0, /*sq_contains*/
- 0, /*sq_inplace_concat*/
- 0, /*sq_inplace_repeat*/
-};
-
-static PyMappingMethods __pyx_tp_as_mapping_Output = {
- 0, /*mp_length*/
- 0, /*mp_subscript*/
- 0, /*mp_ass_subscript*/
-};
-
-static PyBufferProcs __pyx_tp_as_buffer_Output = {
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getreadbuffer*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getwritebuffer*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getsegcount*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getcharbuffer*/
- #endif
- #if PY_VERSION_HEX >= 0x02060000
- 0, /*bf_getbuffer*/
- #endif
- #if PY_VERSION_HEX >= 0x02060000
- 0, /*bf_releasebuffer*/
- #endif
-};
-
-PyTypeObject __pyx_type_11_pyportmidi_Output = {
- PyVarObject_HEAD_INIT(0, 0)
- __Pyx_NAMESTR("_pyportmidi.Output"), /*tp_name*/
- sizeof(struct __pyx_obj_11_pyportmidi_Output), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- __pyx_tp_dealloc_11_pyportmidi_Output, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- &__pyx_tp_as_number_Output, /*tp_as_number*/
- &__pyx_tp_as_sequence_Output, /*tp_as_sequence*/
- &__pyx_tp_as_mapping_Output, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- &__pyx_tp_as_buffer_Output, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
- __Pyx_DOCSTR("\nclass Output:\n define an output MIDI stream. Takes the form:\n x = pypm.Output(MidiOutputDevice, latency)\n latency is in ms.\n If latency = 0 then timestamps for output are ignored.\n "), /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- __pyx_methods_11_pyportmidi_Output, /*tp_methods*/
- 0, /*tp_members*/
- 0, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- __pyx_pf_11_pyportmidi_6Output___init__, /*tp_init*/
- 0, /*tp_alloc*/
- __pyx_tp_new_11_pyportmidi_Output, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
- 0, /*tp_del*/
- #if PY_VERSION_HEX >= 0x02060000
- 0, /*tp_version_tag*/
- #endif
-};
-
-static PyObject *__pyx_tp_new_11_pyportmidi_Input(PyTypeObject *t, PyObject *a, PyObject *k) {
- PyObject *o = (*t->tp_alloc)(t, 0);
- if (!o) return 0;
- return o;
-}
-
-static void __pyx_tp_dealloc_11_pyportmidi_Input(PyObject *o) {
- {
- PyObject *etype, *eval, *etb;
- PyErr_Fetch(&etype, &eval, &etb);
- ++Py_REFCNT(o);
- __pyx_pf_11_pyportmidi_5Input___dealloc__(o);
- if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
- --Py_REFCNT(o);
- PyErr_Restore(etype, eval, etb);
- }
- (*Py_TYPE(o)->tp_free)(o);
-}
-
-static struct PyMethodDef __pyx_methods_11_pyportmidi_Input[] = {
- {__Pyx_NAMESTR("_check_open"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input__check_open, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input__check_open)},
- {__Pyx_NAMESTR("Close"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_Close, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_Close)},
- {__Pyx_NAMESTR("SetFilter"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_SetFilter, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_SetFilter)},
- {__Pyx_NAMESTR("SetChannelMask"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_SetChannelMask, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_SetChannelMask)},
- {__Pyx_NAMESTR("Poll"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_Poll, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_Poll)},
- {__Pyx_NAMESTR("Read"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_Read, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_Read)},
- {0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_Input = {
- 0, /*nb_add*/
- 0, /*nb_subtract*/
- 0, /*nb_multiply*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_divide*/
- #endif
- 0, /*nb_remainder*/
- 0, /*nb_divmod*/
- 0, /*nb_power*/
- 0, /*nb_negative*/
- 0, /*nb_positive*/
- 0, /*nb_absolute*/
- 0, /*nb_nonzero*/
- 0, /*nb_invert*/
- 0, /*nb_lshift*/
- 0, /*nb_rshift*/
- 0, /*nb_and*/
- 0, /*nb_xor*/
- 0, /*nb_or*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_coerce*/
- #endif
- 0, /*nb_int*/
- #if PY_MAJOR_VERSION >= 3
- 0, /*reserved*/
- #else
- 0, /*nb_long*/
- #endif
- 0, /*nb_float*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_oct*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_hex*/
- #endif
- 0, /*nb_inplace_add*/
- 0, /*nb_inplace_subtract*/
- 0, /*nb_inplace_multiply*/
- #if PY_MAJOR_VERSION < 3
- 0, /*nb_inplace_divide*/
- #endif
- 0, /*nb_inplace_remainder*/
- 0, /*nb_inplace_power*/
- 0, /*nb_inplace_lshift*/
- 0, /*nb_inplace_rshift*/
- 0, /*nb_inplace_and*/
- 0, /*nb_inplace_xor*/
- 0, /*nb_inplace_or*/
- 0, /*nb_floor_divide*/
- 0, /*nb_true_divide*/
- 0, /*nb_inplace_floor_divide*/
- 0, /*nb_inplace_true_divide*/
- #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
- 0, /*nb_index*/
- #endif
-};
-
-static PySequenceMethods __pyx_tp_as_sequence_Input = {
- 0, /*sq_length*/
- 0, /*sq_concat*/
- 0, /*sq_repeat*/
- 0, /*sq_item*/
- 0, /*sq_slice*/
- 0, /*sq_ass_item*/
- 0, /*sq_ass_slice*/
- 0, /*sq_contains*/
- 0, /*sq_inplace_concat*/
- 0, /*sq_inplace_repeat*/
-};
-
-static PyMappingMethods __pyx_tp_as_mapping_Input = {
- 0, /*mp_length*/
- 0, /*mp_subscript*/
- 0, /*mp_ass_subscript*/
-};
-
-static PyBufferProcs __pyx_tp_as_buffer_Input = {
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getreadbuffer*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getwritebuffer*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getsegcount*/
- #endif
- #if PY_MAJOR_VERSION < 3
- 0, /*bf_getcharbuffer*/
- #endif
- #if PY_VERSION_HEX >= 0x02060000
- 0, /*bf_getbuffer*/
- #endif
- #if PY_VERSION_HEX >= 0x02060000
- 0, /*bf_releasebuffer*/
- #endif
-};
-
-PyTypeObject __pyx_type_11_pyportmidi_Input = {
- PyVarObject_HEAD_INIT(0, 0)
- __Pyx_NAMESTR("_pyportmidi.Input"), /*tp_name*/
- sizeof(struct __pyx_obj_11_pyportmidi_Input), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- __pyx_tp_dealloc_11_pyportmidi_Input, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- &__pyx_tp_as_number_Input, /*tp_as_number*/
- &__pyx_tp_as_sequence_Input, /*tp_as_sequence*/
- &__pyx_tp_as_mapping_Input, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- &__pyx_tp_as_buffer_Input, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
- __Pyx_DOCSTR("\nclass Input:\n define an input MIDI stream. Takes the form:\n x = pypm.Input(MidiInputDevice)\n "), /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- __pyx_methods_11_pyportmidi_Input, /*tp_methods*/
- 0, /*tp_members*/
- 0, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- __pyx_pf_11_pyportmidi_5Input___init__, /*tp_init*/
- 0, /*tp_alloc*/
- __pyx_tp_new_11_pyportmidi_Input, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
- 0, /*tp_del*/
- #if PY_VERSION_HEX >= 0x02060000
- 0, /*tp_version_tag*/
- #endif
-};
-
-static struct PyMethodDef __pyx_methods[] = {
- {__Pyx_NAMESTR("Initialize"), (PyCFunction)__pyx_pf_11_pyportmidi_Initialize, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Initialize)},
- {__Pyx_NAMESTR("Terminate"), (PyCFunction)__pyx_pf_11_pyportmidi_Terminate, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Terminate)},
- {__Pyx_NAMESTR("GetDefaultInputDeviceID"), (PyCFunction)__pyx_pf_11_pyportmidi_GetDefaultInputDeviceID, METH_NOARGS, __Pyx_DOCSTR(0)},
- {__Pyx_NAMESTR("GetDefaultOutputDeviceID"), (PyCFunction)__pyx_pf_11_pyportmidi_GetDefaultOutputDeviceID, METH_NOARGS, __Pyx_DOCSTR(0)},
- {__Pyx_NAMESTR("CountDevices"), (PyCFunction)__pyx_pf_11_pyportmidi_CountDevices, METH_NOARGS, __Pyx_DOCSTR(0)},
- {__Pyx_NAMESTR("GetDeviceInfo"), (PyCFunction)__pyx_pf_11_pyportmidi_GetDeviceInfo, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_GetDeviceInfo)},
- {__Pyx_NAMESTR("Time"), (PyCFunction)__pyx_pf_11_pyportmidi_Time, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Time)},
- {__Pyx_NAMESTR("GetErrorText"), (PyCFunction)__pyx_pf_11_pyportmidi_GetErrorText, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_GetErrorText)},
- {__Pyx_NAMESTR("Channel"), (PyCFunction)__pyx_pf_11_pyportmidi_Channel, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Channel)},
- {0, 0, 0, 0}
-};
-
-static void __pyx_init_filenames(void); /*proto*/
-
-#if PY_MAJOR_VERSION >= 3
-static struct PyModuleDef __pyx_moduledef = {
- PyModuleDef_HEAD_INIT,
- __Pyx_NAMESTR("_pyportmidi"),
- 0, /* m_doc */
- -1, /* m_size */
- __pyx_methods /* m_methods */,
- NULL, /* m_reload */
- NULL, /* m_traverse */
- NULL, /* m_clear */
- NULL /* m_free */
-};
-#endif
-
-static __Pyx_StringTabEntry __pyx_string_tab[] = {
- {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
- {&__pyx_kp_s_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 0, 1, 0},
- {&__pyx_kp_s_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 0, 1, 0},
- {&__pyx_kp_s_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 0, 1, 0},
- {&__pyx_kp_s_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 0, 1, 0},
- {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
- {&__pyx_kp_s_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 0, 1, 0},
- {&__pyx_kp_s_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 0, 1, 0},
- {&__pyx_kp_s_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 0, 1, 0},
- {&__pyx_n_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 1},
- {&__pyx_n_s_19, __pyx_k_19, sizeof(__pyx_k_19), 0, 0, 1, 1},
- {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
- {&__pyx_kp_u_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 1, 0, 0},
- {&__pyx_kp_u_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 1, 0, 0},
- {&__pyx_kp_u_22, __pyx_k_22, sizeof(__pyx_k_22), 0, 1, 0, 0},
- {&__pyx_kp_u_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 1, 0, 0},
- {&__pyx_kp_u_24, __pyx_k_24, sizeof(__pyx_k_24), 0, 1, 0, 0},
- {&__pyx_kp_u_25, __pyx_k_25, sizeof(__pyx_k_25), 0, 1, 0, 0},
- {&__pyx_kp_u_26, __pyx_k_26, sizeof(__pyx_k_26), 0, 1, 0, 0},
- {&__pyx_kp_u_27, __pyx_k_27, sizeof(__pyx_k_27), 0, 1, 0, 0},
- {&__pyx_kp_u_28, __pyx_k_28, sizeof(__pyx_k_28), 0, 1, 0, 0},
- {&__pyx_kp_u_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 1, 0, 0},
- {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},
- {&__pyx_kp_u_30, __pyx_k_30, sizeof(__pyx_k_30), 0, 1, 0, 0},
- {&__pyx_kp_u_31, __pyx_k_31, sizeof(__pyx_k_31), 0, 1, 0, 0},
- {&__pyx_kp_u_32, __pyx_k_32, sizeof(__pyx_k_32), 0, 1, 0, 0},
- {&__pyx_kp_u_33, __pyx_k_33, sizeof(__pyx_k_33), 0, 1, 0, 0},
- {&__pyx_kp_u_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 1, 0, 0},
- {&__pyx_kp_u_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 1, 0, 0},
- {&__pyx_kp_u_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 1, 0, 0},
- {&__pyx_kp_u_37, __pyx_k_37, sizeof(__pyx_k_37), 0, 1, 0, 0},
- {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0},
- {&__pyx_kp_s_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 1, 0},
- {&__pyx_kp_s_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 0, 1, 0},
- {&__pyx_kp_s_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 0, 1, 0},
- {&__pyx_kp_s_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 0, 1, 0},
- {&__pyx_kp_s_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 0, 1, 0},
- {&__pyx_n_s__Abort, __pyx_k__Abort, sizeof(__pyx_k__Abort), 0, 0, 1, 1},
- {&__pyx_n_s__B, __pyx_k__B, sizeof(__pyx_k__B), 0, 0, 1, 1},
- {&__pyx_n_s__Channel, __pyx_k__Channel, sizeof(__pyx_k__Channel), 0, 0, 1, 1},
- {&__pyx_n_s__Close, __pyx_k__Close, sizeof(__pyx_k__Close), 0, 0, 1, 1},
- {&__pyx_n_s__Exception, __pyx_k__Exception, sizeof(__pyx_k__Exception), 0, 0, 1, 1},
- {&__pyx_n_s__FALSE, __pyx_k__FALSE, sizeof(__pyx_k__FALSE), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_ACTIVE, __pyx_k__FILT_ACTIVE, sizeof(__pyx_k__FILT_ACTIVE), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_AFTERTOUCH, __pyx_k__FILT_AFTERTOUCH, sizeof(__pyx_k__FILT_AFTERTOUCH), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_CLOCK, __pyx_k__FILT_CLOCK, sizeof(__pyx_k__FILT_CLOCK), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_CONTROL, __pyx_k__FILT_CONTROL, sizeof(__pyx_k__FILT_CONTROL), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_F9, __pyx_k__FILT_F9, sizeof(__pyx_k__FILT_F9), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_FD, __pyx_k__FILT_FD, sizeof(__pyx_k__FILT_FD), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_MTC, __pyx_k__FILT_MTC, sizeof(__pyx_k__FILT_MTC), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_NOTE, __pyx_k__FILT_NOTE, sizeof(__pyx_k__FILT_NOTE), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_PITCHBEND, __pyx_k__FILT_PITCHBEND, sizeof(__pyx_k__FILT_PITCHBEND), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_PLAY, __pyx_k__FILT_PLAY, sizeof(__pyx_k__FILT_PLAY), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_PROGRAM, __pyx_k__FILT_PROGRAM, sizeof(__pyx_k__FILT_PROGRAM), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_REALTIME, __pyx_k__FILT_REALTIME, sizeof(__pyx_k__FILT_REALTIME), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_RESET, __pyx_k__FILT_RESET, sizeof(__pyx_k__FILT_RESET), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_SONG_POSITION, __pyx_k__FILT_SONG_POSITION, sizeof(__pyx_k__FILT_SONG_POSITION), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_SONG_SELECT, __pyx_k__FILT_SONG_SELECT, sizeof(__pyx_k__FILT_SONG_SELECT), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_SYSEX, __pyx_k__FILT_SYSEX, sizeof(__pyx_k__FILT_SYSEX), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_TICK, __pyx_k__FILT_TICK, sizeof(__pyx_k__FILT_TICK), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_TUNE, __pyx_k__FILT_TUNE, sizeof(__pyx_k__FILT_TUNE), 0, 0, 1, 1},
- {&__pyx_n_s__FILT_UNDEFINED, __pyx_k__FILT_UNDEFINED, sizeof(__pyx_k__FILT_UNDEFINED), 0, 0, 1, 1},
- {&__pyx_n_s__GetDeviceInfo, __pyx_k__GetDeviceInfo, sizeof(__pyx_k__GetDeviceInfo), 0, 0, 1, 1},
- {&__pyx_n_s__GetErrorText, __pyx_k__GetErrorText, sizeof(__pyx_k__GetErrorText), 0, 0, 1, 1},
- {&__pyx_n_s__IndexError, __pyx_k__IndexError, sizeof(__pyx_k__IndexError), 0, 0, 1, 1},
- {&__pyx_n_s__Initialize, __pyx_k__Initialize, sizeof(__pyx_k__Initialize), 0, 0, 1, 1},
- {&__pyx_n_s__Input, __pyx_k__Input, sizeof(__pyx_k__Input), 0, 0, 1, 1},
- {&__pyx_n_s__InputDevice, __pyx_k__InputDevice, sizeof(__pyx_k__InputDevice), 0, 0, 1, 1},
- {&__pyx_n_s__Output, __pyx_k__Output, sizeof(__pyx_k__Output), 0, 0, 1, 1},
- {&__pyx_n_s__OutputDevice, __pyx_k__OutputDevice, sizeof(__pyx_k__OutputDevice), 0, 0, 1, 1},
- {&__pyx_n_s__Poll, __pyx_k__Poll, sizeof(__pyx_k__Poll), 0, 0, 1, 1},
- {&__pyx_n_s__Read, __pyx_k__Read, sizeof(__pyx_k__Read), 0, 0, 1, 1},
- {&__pyx_n_s__SetChannelMask, __pyx_k__SetChannelMask, sizeof(__pyx_k__SetChannelMask), 0, 0, 1, 1},
- {&__pyx_n_s__SetFilter, __pyx_k__SetFilter, sizeof(__pyx_k__SetFilter), 0, 0, 1, 1},
- {&__pyx_n_s__TRUE, __pyx_k__TRUE, sizeof(__pyx_k__TRUE), 0, 0, 1, 1},
- {&__pyx_n_s__Terminate, __pyx_k__Terminate, sizeof(__pyx_k__Terminate), 0, 0, 1, 1},
- {&__pyx_n_s__Time, __pyx_k__Time, sizeof(__pyx_k__Time), 0, 0, 1, 1},
- {&__pyx_n_s__Write, __pyx_k__Write, sizeof(__pyx_k__Write), 0, 0, 1, 1},
- {&__pyx_n_s__WriteShort, __pyx_k__WriteShort, sizeof(__pyx_k__WriteShort), 0, 0, 1, 1},
- {&__pyx_n_s__WriteSysEx, __pyx_k__WriteSysEx, sizeof(__pyx_k__WriteSysEx), 0, 0, 1, 1},
- {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
- {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
- {&__pyx_n_s____version__, __pyx_k____version__, sizeof(__pyx_k____version__), 0, 0, 1, 1},
- {&__pyx_n_s___aborted, __pyx_k___aborted, sizeof(__pyx_k___aborted), 0, 0, 1, 1},
- {&__pyx_n_s___check_open, __pyx_k___check_open, sizeof(__pyx_k___check_open), 0, 0, 1, 1},
- {&__pyx_n_s__array, __pyx_k__array, sizeof(__pyx_k__array), 0, 0, 1, 1},
- {&__pyx_n_s__buffersize, __pyx_k__buffersize, sizeof(__pyx_k__buffersize), 0, 0, 1, 1},
- {&__pyx_n_s__data1, __pyx_k__data1, sizeof(__pyx_k__data1), 0, 0, 1, 1},
- {&__pyx_n_s__data2, __pyx_k__data2, sizeof(__pyx_k__data2), 0, 0, 1, 1},
- {&__pyx_n_s__debug, __pyx_k__debug, sizeof(__pyx_k__debug), 0, 0, 1, 1},
- {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1},
- {&__pyx_n_s__input, __pyx_k__input, sizeof(__pyx_k__input), 0, 0, 1, 1},
- {&__pyx_n_s__interf, __pyx_k__interf, sizeof(__pyx_k__interf), 0, 0, 1, 1},
- {&__pyx_n_s__latency, __pyx_k__latency, sizeof(__pyx_k__latency), 0, 0, 1, 1},
- {&__pyx_n_s__message, __pyx_k__message, sizeof(__pyx_k__message), 0, 0, 1, 1},
- {&__pyx_n_s__midi, __pyx_k__midi, sizeof(__pyx_k__midi), 0, 0, 1, 1},
- {&__pyx_n_s__msg, __pyx_k__msg, sizeof(__pyx_k__msg), 0, 0, 1, 1},
- {&__pyx_n_s__name, __pyx_k__name, sizeof(__pyx_k__name), 0, 0, 1, 1},
- {&__pyx_n_s__opened, __pyx_k__opened, sizeof(__pyx_k__opened), 0, 0, 1, 1},
- {&__pyx_n_s__output, __pyx_k__output, sizeof(__pyx_k__output), 0, 0, 1, 1},
- {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},
- {&__pyx_n_s__status, __pyx_k__status, sizeof(__pyx_k__status), 0, 0, 1, 1},
- {&__pyx_n_s__timestamp, __pyx_k__timestamp, sizeof(__pyx_k__timestamp), 0, 0, 1, 1},
- {&__pyx_n_s__tostring, __pyx_k__tostring, sizeof(__pyx_k__tostring), 0, 0, 1, 1},
- {&__pyx_n_s__when, __pyx_k__when, sizeof(__pyx_k__when), 0, 0, 1, 1},
- {0, 0, 0, 0, 0, 0, 0}
-};
-static int __Pyx_InitCachedBuiltins(void) {
- __pyx_builtin_Exception = __Pyx_GetName(__pyx_b, __pyx_n_s__Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_n_s__IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- return 0;
- __pyx_L1_error:;
- return -1;
-}
-
-static int __Pyx_InitGlobals(void) {
- if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_8 = PyInt_FromLong(8); if (unlikely(!__pyx_int_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_16 = PyInt_FromLong(16); if (unlikely(!__pyx_int_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x1 = PyInt_FromLong(0x1); if (unlikely(!__pyx_int_0x1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x2 = PyInt_FromLong(0x2); if (unlikely(!__pyx_int_0x2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x4 = PyInt_FromLong(0x4); if (unlikely(!__pyx_int_0x4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x8 = PyInt_FromLong(0x8); if (unlikely(!__pyx_int_0x8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x10 = PyInt_FromLong(0x10); if (unlikely(!__pyx_int_0x10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x20 = PyInt_FromLong(0x20); if (unlikely(!__pyx_int_0x20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x30 = PyInt_FromLong(0x30); if (unlikely(!__pyx_int_0x30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x40 = PyInt_FromLong(0x40); if (unlikely(!__pyx_int_0x40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x7F = PyInt_FromLong(0x7F); if (unlikely(!__pyx_int_0x7F)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x80 = PyInt_FromLong(0x80); if (unlikely(!__pyx_int_0x80)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0xFF = PyInt_FromLong(0xFF); if (unlikely(!__pyx_int_0xFF)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_1024 = PyInt_FromLong(1024); if (unlikely(!__pyx_int_1024)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_4096 = PyInt_FromLong(4096); if (unlikely(!__pyx_int_4096)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x100 = PyInt_FromLong(0x100); if (unlikely(!__pyx_int_0x100)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x200 = PyInt_FromLong(0x200); if (unlikely(!__pyx_int_0x200)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x300 = PyInt_FromLong(0x300); if (unlikely(!__pyx_int_0x300)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x400 = PyInt_FromLong(0x400); if (unlikely(!__pyx_int_0x400)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x800 = PyInt_FromLong(0x800); if (unlikely(!__pyx_int_0x800)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x1000 = PyInt_FromLong(0x1000); if (unlikely(!__pyx_int_0x1000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x2000 = PyInt_FromLong(0x2000); if (unlikely(!__pyx_int_0x2000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x4000 = PyInt_FromLong(0x4000); if (unlikely(!__pyx_int_0x4000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x8000 = PyInt_FromLong(0x8000); if (unlikely(!__pyx_int_0x8000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0xFF00 = PyInt_FromLong(0xFF00); if (unlikely(!__pyx_int_0xFF00)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0x10000 = PyInt_FromLong(0x10000); if (unlikely(!__pyx_int_0x10000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- __pyx_int_0xFF0000 = PyInt_FromLong(0xFF0000); if (unlikely(!__pyx_int_0xFF0000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- return 0;
- __pyx_L1_error:;
- return -1;
-}
-
-#if PY_MAJOR_VERSION < 3
-PyMODINIT_FUNC init_pyportmidi(void); /*proto*/
-PyMODINIT_FUNC init_pyportmidi(void)
-#else
-PyMODINIT_FUNC PyInit__pyportmidi(void); /*proto*/
-PyMODINIT_FUNC PyInit__pyportmidi(void)
-#endif
-{
- PyObject *__pyx_t_1 = NULL;
- PyObject *__pyx_t_2 = NULL;
- PyObject *__pyx_t_3 = NULL;
- #if CYTHON_REFNANNY
- void* __pyx_refnanny = NULL;
- __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
- if (!__Pyx_RefNanny) {
- PyErr_Clear();
- __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
- if (!__Pyx_RefNanny)
- Py_FatalError("failed to import 'refnanny' module");
- }
- __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit__pyportmidi(void)", __LINE__, __FILE__);
- #endif
- __pyx_init_filenames();
- __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- #if PY_MAJOR_VERSION < 3
- __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- #else
- __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- #endif
- /*--- Library function declarations ---*/
- /*--- Threads initialization code ---*/
- #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
- #ifdef WITH_THREAD /* Python build with threading support? */
- PyEval_InitThreads();
- #endif
- #endif
- /*--- Module creation code ---*/
- #if PY_MAJOR_VERSION < 3
- __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_pyportmidi"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
- #else
- __pyx_m = PyModule_Create(&__pyx_moduledef);
- #endif
- if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- #if PY_MAJOR_VERSION < 3
- Py_INCREF(__pyx_m);
- #endif
- __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
- if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- /*--- Initialize various global constants etc. ---*/
- if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- if (__pyx_module_is_main__pyportmidi) {
- if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
- }
- /*--- Builtin init code ---*/
- if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- /*--- Global init code ---*/
- /*--- Function export code ---*/
- /*--- Type init code ---*/
- if (PyType_Ready(&__pyx_type_11_pyportmidi_Output) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- if (__Pyx_SetAttrString(__pyx_m, "Output", (PyObject *)&__pyx_type_11_pyportmidi_Output) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_ptype_11_pyportmidi_Output = &__pyx_type_11_pyportmidi_Output;
- if (PyType_Ready(&__pyx_type_11_pyportmidi_Input) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- if (__Pyx_SetAttrString(__pyx_m, "Input", (PyObject *)&__pyx_type_11_pyportmidi_Input) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __pyx_ptype_11_pyportmidi_Input = &__pyx_type_11_pyportmidi_Input;
- /*--- Type import code ---*/
- /*--- Function import code ---*/
- /*--- Execution code ---*/
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":7
- * # harrison@media.mit.edu
- * # written in Pyrex
- * __version__="0.07" # <<<<<<<<<<<<<<
- *
- * import array
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s____version__, ((PyObject *)__pyx_kp_s_17)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":9
- * __version__="0.07"
- *
- * import array # <<<<<<<<<<<<<<
- *
- * # CHANGES:
- */
- __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__array), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_1);
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__array, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":108
- * PtTimestamp Pt_Time()
- *
- * FILT_ACTIVE=0x1 # <<<<<<<<<<<<<<
- * FILT_SYSEX=0x2
- * FILT_CLOCK=0x4
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_ACTIVE, __pyx_int_0x1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":109
- *
- * FILT_ACTIVE=0x1
- * FILT_SYSEX=0x2 # <<<<<<<<<<<<<<
- * FILT_CLOCK=0x4
- * FILT_PLAY=0x8
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_SYSEX, __pyx_int_0x2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":110
- * FILT_ACTIVE=0x1
- * FILT_SYSEX=0x2
- * FILT_CLOCK=0x4 # <<<<<<<<<<<<<<
- * FILT_PLAY=0x8
- * FILT_F9=0x10
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_CLOCK, __pyx_int_0x4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":111
- * FILT_SYSEX=0x2
- * FILT_CLOCK=0x4
- * FILT_PLAY=0x8 # <<<<<<<<<<<<<<
- * FILT_F9=0x10
- * FILT_TICK=0x10
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_PLAY, __pyx_int_0x8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":112
- * FILT_CLOCK=0x4
- * FILT_PLAY=0x8
- * FILT_F9=0x10 # <<<<<<<<<<<<<<
- * FILT_TICK=0x10
- * FILT_FD=0x20
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_F9, __pyx_int_0x10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":113
- * FILT_PLAY=0x8
- * FILT_F9=0x10
- * FILT_TICK=0x10 # <<<<<<<<<<<<<<
- * FILT_FD=0x20
- * FILT_UNDEFINED=0x30
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_TICK, __pyx_int_0x10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":114
- * FILT_F9=0x10
- * FILT_TICK=0x10
- * FILT_FD=0x20 # <<<<<<<<<<<<<<
- * FILT_UNDEFINED=0x30
- * FILT_RESET=0x40
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_FD, __pyx_int_0x20) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":115
- * FILT_TICK=0x10
- * FILT_FD=0x20
- * FILT_UNDEFINED=0x30 # <<<<<<<<<<<<<<
- * FILT_RESET=0x40
- * FILT_REALTIME=0x7F
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_UNDEFINED, __pyx_int_0x30) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":116
- * FILT_FD=0x20
- * FILT_UNDEFINED=0x30
- * FILT_RESET=0x40 # <<<<<<<<<<<<<<
- * FILT_REALTIME=0x7F
- * FILT_NOTE=0x80
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_RESET, __pyx_int_0x40) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":117
- * FILT_UNDEFINED=0x30
- * FILT_RESET=0x40
- * FILT_REALTIME=0x7F # <<<<<<<<<<<<<<
- * FILT_NOTE=0x80
- * FILT_CHANNEL_AFTERTOUCH=0x100
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_REALTIME, __pyx_int_0x7F) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":118
- * FILT_RESET=0x40
- * FILT_REALTIME=0x7F
- * FILT_NOTE=0x80 # <<<<<<<<<<<<<<
- * FILT_CHANNEL_AFTERTOUCH=0x100
- * FILT_POLY_AFTERTOUCH=0x200
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_NOTE, __pyx_int_0x80) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":119
- * FILT_REALTIME=0x7F
- * FILT_NOTE=0x80
- * FILT_CHANNEL_AFTERTOUCH=0x100 # <<<<<<<<<<<<<<
- * FILT_POLY_AFTERTOUCH=0x200
- * FILT_AFTERTOUCH=0x300
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s_18, __pyx_int_0x100) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":120
- * FILT_NOTE=0x80
- * FILT_CHANNEL_AFTERTOUCH=0x100
- * FILT_POLY_AFTERTOUCH=0x200 # <<<<<<<<<<<<<<
- * FILT_AFTERTOUCH=0x300
- * FILT_PROGRAM=0x400
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s_19, __pyx_int_0x200) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":121
- * FILT_CHANNEL_AFTERTOUCH=0x100
- * FILT_POLY_AFTERTOUCH=0x200
- * FILT_AFTERTOUCH=0x300 # <<<<<<<<<<<<<<
- * FILT_PROGRAM=0x400
- * FILT_CONTROL=0x800
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_AFTERTOUCH, __pyx_int_0x300) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":122
- * FILT_POLY_AFTERTOUCH=0x200
- * FILT_AFTERTOUCH=0x300
- * FILT_PROGRAM=0x400 # <<<<<<<<<<<<<<
- * FILT_CONTROL=0x800
- * FILT_PITCHBEND=0x1000
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_PROGRAM, __pyx_int_0x400) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":123
- * FILT_AFTERTOUCH=0x300
- * FILT_PROGRAM=0x400
- * FILT_CONTROL=0x800 # <<<<<<<<<<<<<<
- * FILT_PITCHBEND=0x1000
- * FILT_MTC=0x2000
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_CONTROL, __pyx_int_0x800) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":124
- * FILT_PROGRAM=0x400
- * FILT_CONTROL=0x800
- * FILT_PITCHBEND=0x1000 # <<<<<<<<<<<<<<
- * FILT_MTC=0x2000
- * FILT_SONG_POSITION=0x4000
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_PITCHBEND, __pyx_int_0x1000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":125
- * FILT_CONTROL=0x800
- * FILT_PITCHBEND=0x1000
- * FILT_MTC=0x2000 # <<<<<<<<<<<<<<
- * FILT_SONG_POSITION=0x4000
- * FILT_SONG_SELECT=0x8000
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_MTC, __pyx_int_0x2000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":126
- * FILT_PITCHBEND=0x1000
- * FILT_MTC=0x2000
- * FILT_SONG_POSITION=0x4000 # <<<<<<<<<<<<<<
- * FILT_SONG_SELECT=0x8000
- * FILT_TUNE=0x10000
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_SONG_POSITION, __pyx_int_0x4000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":127
- * FILT_MTC=0x2000
- * FILT_SONG_POSITION=0x4000
- * FILT_SONG_SELECT=0x8000 # <<<<<<<<<<<<<<
- * FILT_TUNE=0x10000
- * FALSE=0
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_SONG_SELECT, __pyx_int_0x8000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":128
- * FILT_SONG_POSITION=0x4000
- * FILT_SONG_SELECT=0x8000
- * FILT_TUNE=0x10000 # <<<<<<<<<<<<<<
- * FALSE=0
- * TRUE=1
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_TUNE, __pyx_int_0x10000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":129
- * FILT_SONG_SELECT=0x8000
- * FILT_TUNE=0x10000
- * FALSE=0 # <<<<<<<<<<<<<<
- * TRUE=1
- *
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FALSE, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":130
- * FILT_TUNE=0x10000
- * FALSE=0
- * TRUE=1 # <<<<<<<<<<<<<<
- *
- * def Initialize():
- */
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s__TRUE, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
- /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":1
- * # pyPortMidi # <<<<<<<<<<<<<<
- * # Python bindings for PortMidi
- * # John Harrison
- */
- __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(((PyObject *)__pyx_t_1));
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Initialize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__");
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_20), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Terminate); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_21), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GetDeviceInfo); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__");
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_22), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_23), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GetErrorText); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__");
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_24), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Channel); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_25), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s___check_open); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_26), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Close); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_27), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Abort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_28), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Write); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_29), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__WriteShort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_30), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__WriteSysEx); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_31), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s___check_open); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_32), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Close); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_33), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__SetFilter); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_34), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__SetChannelMask); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_35), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Poll); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_36), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_2);
- __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Read); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_GOTREF(__pyx_t_3);
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
- __Pyx_GOTREF(__pyx_t_2);
- __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
- if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_37), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
- if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
- __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
- goto __pyx_L0;
- __pyx_L1_error:;
- __Pyx_XDECREF(__pyx_t_1);
- __Pyx_XDECREF(__pyx_t_2);
- __Pyx_XDECREF(__pyx_t_3);
- if (__pyx_m) {
- __Pyx_AddTraceback("init _pyportmidi");
- Py_DECREF(__pyx_m); __pyx_m = 0;
- } else if (!PyErr_Occurred()) {
- PyErr_SetString(PyExc_ImportError, "init _pyportmidi");
- }
- __pyx_L0:;
- __Pyx_RefNannyFinishContext();
- #if PY_MAJOR_VERSION < 3
- return;
- #else
- return __pyx_m;
- #endif
-}
-
-static const char *__pyx_filenames[] = {
- "_pyportmidi.pyx",
-};
-
-/* Runtime support code */
-
-static void __pyx_init_filenames(void) {
- __pyx_f = __pyx_filenames;
-}
-
-static void __Pyx_RaiseDoubleKeywordsError(
- const char* func_name,
- PyObject* kw_name)
-{
- PyErr_Format(PyExc_TypeError,
- #if PY_MAJOR_VERSION >= 3
- "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
- #else
- "%s() got multiple values for keyword argument '%s'", func_name,
- PyString_AS_STRING(kw_name));
- #endif
-}
-
-static void __Pyx_RaiseArgtupleInvalid(
- const char* func_name,
- int exact,
- Py_ssize_t num_min,
- Py_ssize_t num_max,
- Py_ssize_t num_found)
-{
- Py_ssize_t num_expected;
- const char *number, *more_or_less;
-
- if (num_found < num_min) {
- num_expected = num_min;
- more_or_less = "at least";
- } else {
- num_expected = num_max;
- more_or_less = "at most";
- }
- if (exact) {
- more_or_less = "exactly";
- }
- number = (num_expected == 1) ? "" : "s";
- PyErr_Format(PyExc_TypeError,
- #if PY_VERSION_HEX < 0x02050000
- "%s() takes %s %d positional argument%s (%d given)",
- #else
- "%s() takes %s %zd positional argument%s (%zd given)",
- #endif
- func_name, more_or_less, num_expected, number, num_found);
-}
-
-static int __Pyx_ParseOptionalKeywords(
- PyObject *kwds,
- PyObject **argnames[],
- PyObject *kwds2,
- PyObject *values[],
- Py_ssize_t num_pos_args,
- const char* function_name)
-{
- PyObject *key = 0, *value = 0;
- Py_ssize_t pos = 0;
- PyObject*** name;
- PyObject*** first_kw_arg = argnames + num_pos_args;
-
- while (PyDict_Next(kwds, &pos, &key, &value)) {
- name = first_kw_arg;
- while (*name && (**name != key)) name++;
- if (*name) {
- values[name-argnames] = value;
- } else {
- #if PY_MAJOR_VERSION < 3
- if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
- #else
- if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
- #endif
- goto invalid_keyword_type;
- } else {
- for (name = first_kw_arg; *name; name++) {
- #if PY_MAJOR_VERSION >= 3
- if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
- PyUnicode_Compare(**name, key) == 0) break;
- #else
- if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
- _PyString_Eq(**name, key)) break;
- #endif
- }
- if (*name) {
- values[name-argnames] = value;
- } else {
- /* unexpected keyword found */
- for (name=argnames; name != first_kw_arg; name++) {
- if (**name == key) goto arg_passed_twice;
- #if PY_MAJOR_VERSION >= 3
- if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
- PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
- #else
- if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
- _PyString_Eq(**name, key)) goto arg_passed_twice;
- #endif
- }
- if (kwds2) {
- if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
- } else {
- goto invalid_keyword;
- }
- }
- }
- }
- }
- return 0;
-arg_passed_twice:
- __Pyx_RaiseDoubleKeywordsError(function_name, **name);
- goto bad;
-invalid_keyword_type:
- PyErr_Format(PyExc_TypeError,
- "%s() keywords must be strings", function_name);
- goto bad;
-invalid_keyword:
- PyErr_Format(PyExc_TypeError,
- #if PY_MAJOR_VERSION < 3
- "%s() got an unexpected keyword argument '%s'",
- function_name, PyString_AsString(key));
- #else
- "%s() got an unexpected keyword argument '%U'",
- function_name, key);
- #endif
-bad:
- return -1;
-}
-
-
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
- PyObject *__import__ = 0;
- PyObject *empty_list = 0;
- PyObject *module = 0;
- PyObject *global_dict = 0;
- PyObject *empty_dict = 0;
- PyObject *list;
- __import__ = __Pyx_GetAttrString(__pyx_b, "__import__");
- if (!__import__)
- goto bad;
- if (from_list)
- list = from_list;
- else {
- empty_list = PyList_New(0);
- if (!empty_list)
- goto bad;
- list = empty_list;
- }
- global_dict = PyModule_GetDict(__pyx_m);
- if (!global_dict)
- goto bad;
- empty_dict = PyDict_New();
- if (!empty_dict)
- goto bad;
- module = PyObject_CallFunctionObjArgs(__import__,
- name, global_dict, empty_dict, list, NULL);
-bad:
- Py_XDECREF(empty_list);
- Py_XDECREF(__import__);
- Py_XDECREF(empty_dict);
- return module;
-}
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmDeviceID(PmDeviceID val) {
- const PmDeviceID neg_one = (PmDeviceID)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PmDeviceID) < sizeof(long)) {
- return PyInt_FromLong((long)val);
- } else if (sizeof(PmDeviceID) == sizeof(long)) {
- if (is_unsigned)
- return PyLong_FromUnsignedLong((unsigned long)val);
- else
- return PyInt_FromLong((long)val);
- } else { /* (sizeof(PmDeviceID) > sizeof(long)) */
- if (is_unsigned)
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val);
- else
- return PyLong_FromLongLong((PY_LONG_LONG)val);
- }
-}
-
-static CYTHON_INLINE PmDeviceID __Pyx_PyInt_from_py_PmDeviceID(PyObject* x) {
- const PmDeviceID neg_one = (PmDeviceID)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PmDeviceID) == sizeof(char)) {
- if (is_unsigned)
- return (PmDeviceID)__Pyx_PyInt_AsUnsignedChar(x);
- else
- return (PmDeviceID)__Pyx_PyInt_AsSignedChar(x);
- } else if (sizeof(PmDeviceID) == sizeof(short)) {
- if (is_unsigned)
- return (PmDeviceID)__Pyx_PyInt_AsUnsignedShort(x);
- else
- return (PmDeviceID)__Pyx_PyInt_AsSignedShort(x);
- } else if (sizeof(PmDeviceID) == sizeof(int)) {
- if (is_unsigned)
- return (PmDeviceID)__Pyx_PyInt_AsUnsignedInt(x);
- else
- return (PmDeviceID)__Pyx_PyInt_AsSignedInt(x);
- } else if (sizeof(PmDeviceID) == sizeof(long)) {
- if (is_unsigned)
- return (PmDeviceID)__Pyx_PyInt_AsUnsignedLong(x);
- else
- return (PmDeviceID)__Pyx_PyInt_AsSignedLong(x);
- } else if (sizeof(PmDeviceID) == sizeof(PY_LONG_LONG)) {
- if (is_unsigned)
- return (PmDeviceID)__Pyx_PyInt_AsUnsignedLongLong(x);
- else
- return (PmDeviceID)__Pyx_PyInt_AsSignedLongLong(x);
-#if 0
- } else if (sizeof(PmDeviceID) > sizeof(short) &&
- sizeof(PmDeviceID) < sizeof(int)) { /* __int32 ILP64 ? */
- if (is_unsigned)
- return (PmDeviceID)__Pyx_PyInt_AsUnsignedInt(x);
- else
- return (PmDeviceID)__Pyx_PyInt_AsSignedInt(x);
-#endif
- }
- PyErr_SetString(PyExc_TypeError, "PmDeviceID");
- return (PmDeviceID)-1;
-}
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PtTimestamp(PtTimestamp val) {
- const PtTimestamp neg_one = (PtTimestamp)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PtTimestamp) < sizeof(long)) {
- return PyInt_FromLong((long)val);
- } else if (sizeof(PtTimestamp) == sizeof(long)) {
- if (is_unsigned)
- return PyLong_FromUnsignedLong((unsigned long)val);
- else
- return PyInt_FromLong((long)val);
- } else { /* (sizeof(PtTimestamp) > sizeof(long)) */
- if (is_unsigned)
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val);
- else
- return PyLong_FromLongLong((PY_LONG_LONG)val);
- }
-}
-
-#if PY_MAJOR_VERSION < 3
-static PyObject *__Pyx_GetStdout(void) {
- PyObject *f = PySys_GetObject((char *)"stdout");
- if (!f) {
- PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
- }
- return f;
-}
-
-static int __Pyx_Print(PyObject *arg_tuple, int newline) {
- PyObject *f;
- PyObject* v;
- int i;
-
- if (!(f = __Pyx_GetStdout()))
- return -1;
- for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {
- if (PyFile_SoftSpace(f, 1)) {
- if (PyFile_WriteString(" ", f) < 0)
- return -1;
- }
- v = PyTuple_GET_ITEM(arg_tuple, i);
- if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)
- return -1;
- if (PyString_Check(v)) {
- char *s = PyString_AsString(v);
- Py_ssize_t len = PyString_Size(v);
- if (len > 0 &&
- isspace(Py_CHARMASK(s[len-1])) &&
- s[len-1] != ' ')
- PyFile_SoftSpace(f, 0);
- }
- }
- if (newline) {
- if (PyFile_WriteString("\n", f) < 0)
- return -1;
- PyFile_SoftSpace(f, 0);
- }
- return 0;
-}
-
-#else /* Python 3 has a print function */
-
-static int __Pyx_Print(PyObject *arg_tuple, int newline) {
- PyObject* kwargs = 0;
- PyObject* result = 0;
- PyObject* end_string;
- if (!__pyx_print) {
- __pyx_print = __Pyx_GetAttrString(__pyx_b, "print");
- if (!__pyx_print)
- return -1;
- }
- if (!newline) {
- if (!__pyx_print_kwargs) {
- __pyx_print_kwargs = PyDict_New();
- if (!__pyx_print_kwargs)
- return -1;
- end_string = PyUnicode_FromStringAndSize(" ", 1);
- if (!end_string)
- return -1;
- if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) {
- Py_DECREF(end_string);
- return -1;
- }
- Py_DECREF(end_string);
- }
- kwargs = __pyx_print_kwargs;
- }
- result = PyObject_Call(__pyx_print, arg_tuple, kwargs);
- if (!result)
- return -1;
- Py_DECREF(result);
- return 0;
-}
-
-#endif
-
-#if PY_MAJOR_VERSION < 3
-
-static int __Pyx_PrintOne(PyObject *o) {
- PyObject *f;
- if (!(f = __Pyx_GetStdout()))
- return -1;
- if (PyFile_SoftSpace(f, 0)) {
- if (PyFile_WriteString(" ", f) < 0)
- return -1;
- }
- if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0)
- return -1;
- if (PyFile_WriteString("\n", f) < 0)
- return -1;
- return 0;
- /* the line below is just to avoid compiler
- * compiler warnings about unused functions */
- return __Pyx_Print(NULL, 0);
-}
-
-#else /* Python 3 has a print function */
-
-static int __Pyx_PrintOne(PyObject *o) {
- int res;
- PyObject* arg_tuple = PyTuple_New(1);
- if (unlikely(!arg_tuple))
- return -1;
- Py_INCREF(o);
- PyTuple_SET_ITEM(arg_tuple, 0, o);
- res = __Pyx_Print(arg_tuple, 1);
- Py_DECREF(arg_tuple);
- return res;
-}
-
-#endif
-
-static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
- PyObject *result;
- result = PyObject_GetAttr(dict, name);
- if (!result)
- PyErr_SetObject(PyExc_NameError, name);
- return result;
-}
-
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
- PyObject *tmp_type, *tmp_value, *tmp_tb;
- PyThreadState *tstate = PyThreadState_GET();
-
- tmp_type = tstate->curexc_type;
- tmp_value = tstate->curexc_value;
- tmp_tb = tstate->curexc_traceback;
- tstate->curexc_type = type;
- tstate->curexc_value = value;
- tstate->curexc_traceback = tb;
- Py_XDECREF(tmp_type);
- Py_XDECREF(tmp_value);
- Py_XDECREF(tmp_tb);
-}
-
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
- PyThreadState *tstate = PyThreadState_GET();
- *type = tstate->curexc_type;
- *value = tstate->curexc_value;
- *tb = tstate->curexc_traceback;
-
- tstate->curexc_type = 0;
- tstate->curexc_value = 0;
- tstate->curexc_traceback = 0;
-}
-
-
-#if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
- Py_XINCREF(type);
- Py_XINCREF(value);
- Py_XINCREF(tb);
- /* First, check the traceback argument, replacing None with NULL. */
- if (tb == Py_None) {
- Py_DECREF(tb);
- tb = 0;
- }
- else if (tb != NULL && !PyTraceBack_Check(tb)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: arg 3 must be a traceback or None");
- goto raise_error;
- }
- /* Next, replace a missing value with None */
- if (value == NULL) {
- value = Py_None;
- Py_INCREF(value);
- }
- #if PY_VERSION_HEX < 0x02050000
- if (!PyClass_Check(type))
- #else
- if (!PyType_Check(type))
- #endif
- {
- /* Raising an instance. The value should be a dummy. */
- if (value != Py_None) {
- PyErr_SetString(PyExc_TypeError,
- "instance exception may not have a separate value");
- goto raise_error;
- }
- /* Normalize to raise <class>, <instance> */
- Py_DECREF(value);
- value = type;
- #if PY_VERSION_HEX < 0x02050000
- if (PyInstance_Check(type)) {
- type = (PyObject*) ((PyInstanceObject*)type)->in_class;
- Py_INCREF(type);
- }
- else {
- type = 0;
- PyErr_SetString(PyExc_TypeError,
- "raise: exception must be an old-style class or instance");
- goto raise_error;
- }
- #else
- type = (PyObject*) Py_TYPE(type);
- Py_INCREF(type);
- if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: exception class must be a subclass of BaseException");
- goto raise_error;
- }
- #endif
- }
-
- __Pyx_ErrRestore(type, value, tb);
- return;
-raise_error:
- Py_XDECREF(value);
- Py_XDECREF(type);
- Py_XDECREF(tb);
- return;
-}
-
-#else /* Python 3+ */
-
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
- if (tb == Py_None) {
- tb = 0;
- } else if (tb && !PyTraceBack_Check(tb)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: arg 3 must be a traceback or None");
- goto bad;
- }
- if (value == Py_None)
- value = 0;
-
- if (PyExceptionInstance_Check(type)) {
- if (value) {
- PyErr_SetString(PyExc_TypeError,
- "instance exception may not have a separate value");
- goto bad;
- }
- value = type;
- type = (PyObject*) Py_TYPE(value);
- } else if (!PyExceptionClass_Check(type)) {
- PyErr_SetString(PyExc_TypeError,
- "raise: exception class must be a subclass of BaseException");
- goto bad;
- }
-
- PyErr_SetObject(type, value);
-
- if (tb) {
- PyThreadState *tstate = PyThreadState_GET();
- PyObject* tmp_tb = tstate->curexc_traceback;
- if (tb != tmp_tb) {
- Py_INCREF(tb);
- tstate->curexc_traceback = tb;
- Py_XDECREF(tmp_tb);
- }
- }
-
-bad:
- return;
-}
-#endif
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmMessage(PmMessage val) {
- const PmMessage neg_one = (PmMessage)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PmMessage) < sizeof(long)) {
- return PyInt_FromLong((long)val);
- } else if (sizeof(PmMessage) == sizeof(long)) {
- if (is_unsigned)
- return PyLong_FromUnsignedLong((unsigned long)val);
- else
- return PyInt_FromLong((long)val);
- } else { /* (sizeof(PmMessage) > sizeof(long)) */
- if (is_unsigned)
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val);
- else
- return PyLong_FromLongLong((PY_LONG_LONG)val);
- }
-}
-
-static CYTHON_INLINE PmMessage __Pyx_PyInt_from_py_PmMessage(PyObject* x) {
- const PmMessage neg_one = (PmMessage)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PmMessage) == sizeof(char)) {
- if (is_unsigned)
- return (PmMessage)__Pyx_PyInt_AsUnsignedChar(x);
- else
- return (PmMessage)__Pyx_PyInt_AsSignedChar(x);
- } else if (sizeof(PmMessage) == sizeof(short)) {
- if (is_unsigned)
- return (PmMessage)__Pyx_PyInt_AsUnsignedShort(x);
- else
- return (PmMessage)__Pyx_PyInt_AsSignedShort(x);
- } else if (sizeof(PmMessage) == sizeof(int)) {
- if (is_unsigned)
- return (PmMessage)__Pyx_PyInt_AsUnsignedInt(x);
- else
- return (PmMessage)__Pyx_PyInt_AsSignedInt(x);
- } else if (sizeof(PmMessage) == sizeof(long)) {
- if (is_unsigned)
- return (PmMessage)__Pyx_PyInt_AsUnsignedLong(x);
- else
- return (PmMessage)__Pyx_PyInt_AsSignedLong(x);
- } else if (sizeof(PmMessage) == sizeof(PY_LONG_LONG)) {
- if (is_unsigned)
- return (PmMessage)__Pyx_PyInt_AsUnsignedLongLong(x);
- else
- return (PmMessage)__Pyx_PyInt_AsSignedLongLong(x);
-#if 0
- } else if (sizeof(PmMessage) > sizeof(short) &&
- sizeof(PmMessage) < sizeof(int)) { /* __int32 ILP64 ? */
- if (is_unsigned)
- return (PmMessage)__Pyx_PyInt_AsUnsignedInt(x);
- else
- return (PmMessage)__Pyx_PyInt_AsSignedInt(x);
-#endif
- }
- PyErr_SetString(PyExc_TypeError, "PmMessage");
- return (PmMessage)-1;
-}
-
-static CYTHON_INLINE PmTimestamp __Pyx_PyInt_from_py_PmTimestamp(PyObject* x) {
- const PmTimestamp neg_one = (PmTimestamp)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PmTimestamp) == sizeof(char)) {
- if (is_unsigned)
- return (PmTimestamp)__Pyx_PyInt_AsUnsignedChar(x);
- else
- return (PmTimestamp)__Pyx_PyInt_AsSignedChar(x);
- } else if (sizeof(PmTimestamp) == sizeof(short)) {
- if (is_unsigned)
- return (PmTimestamp)__Pyx_PyInt_AsUnsignedShort(x);
- else
- return (PmTimestamp)__Pyx_PyInt_AsSignedShort(x);
- } else if (sizeof(PmTimestamp) == sizeof(int)) {
- if (is_unsigned)
- return (PmTimestamp)__Pyx_PyInt_AsUnsignedInt(x);
- else
- return (PmTimestamp)__Pyx_PyInt_AsSignedInt(x);
- } else if (sizeof(PmTimestamp) == sizeof(long)) {
- if (is_unsigned)
- return (PmTimestamp)__Pyx_PyInt_AsUnsignedLong(x);
- else
- return (PmTimestamp)__Pyx_PyInt_AsSignedLong(x);
- } else if (sizeof(PmTimestamp) == sizeof(PY_LONG_LONG)) {
- if (is_unsigned)
- return (PmTimestamp)__Pyx_PyInt_AsUnsignedLongLong(x);
- else
- return (PmTimestamp)__Pyx_PyInt_AsSignedLongLong(x);
-#if 0
- } else if (sizeof(PmTimestamp) > sizeof(short) &&
- sizeof(PmTimestamp) < sizeof(int)) { /* __int32 ILP64 ? */
- if (is_unsigned)
- return (PmTimestamp)__Pyx_PyInt_AsUnsignedInt(x);
- else
- return (PmTimestamp)__Pyx_PyInt_AsSignedInt(x);
-#endif
- }
- PyErr_SetString(PyExc_TypeError, "PmTimestamp");
- return (PmTimestamp)-1;
-}
-
-static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmTimestamp(PmTimestamp val) {
- const PmTimestamp neg_one = (PmTimestamp)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(PmTimestamp) < sizeof(long)) {
- return PyInt_FromLong((long)val);
- } else if (sizeof(PmTimestamp) == sizeof(long)) {
- if (is_unsigned)
- return PyLong_FromUnsignedLong((unsigned long)val);
- else
- return PyInt_FromLong((long)val);
- } else { /* (sizeof(PmTimestamp) > sizeof(long)) */
- if (is_unsigned)
- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val);
- else
- return PyLong_FromLongLong((PY_LONG_LONG)val);
- }
-}
-
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
- const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(unsigned char) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(unsigned char)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to unsigned char" :
- "value too large to convert to unsigned char");
- }
- return (unsigned char)-1;
- }
- return (unsigned char)val;
- }
- return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
- const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(unsigned short) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(unsigned short)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to unsigned short" :
- "value too large to convert to unsigned short");
- }
- return (unsigned short)-1;
- }
- return (unsigned short)val;
- }
- return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
- const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(unsigned int) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(unsigned int)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to unsigned int" :
- "value too large to convert to unsigned int");
- }
- return (unsigned int)-1;
- }
- return (unsigned int)val;
- }
- return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
- const char neg_one = (char)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(char) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(char)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to char" :
- "value too large to convert to char");
- }
- return (char)-1;
- }
- return (char)val;
- }
- return (char)__Pyx_PyInt_AsLong(x);
-}
-
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
- const short neg_one = (short)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(short) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(short)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to short" :
- "value too large to convert to short");
- }
- return (short)-1;
- }
- return (short)val;
- }
- return (short)__Pyx_PyInt_AsLong(x);
-}
-
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
- const int neg_one = (int)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(int) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(int)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to int" :
- "value too large to convert to int");
- }
- return (int)-1;
- }
- return (int)val;
- }
- return (int)__Pyx_PyInt_AsLong(x);
-}
-
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
- const signed char neg_one = (signed char)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(signed char) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(signed char)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to signed char" :
- "value too large to convert to signed char");
- }
- return (signed char)-1;
- }
- return (signed char)val;
- }
- return (signed char)__Pyx_PyInt_AsSignedLong(x);
-}
-
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
- const signed short neg_one = (signed short)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(signed short) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(signed short)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to signed short" :
- "value too large to convert to signed short");
- }
- return (signed short)-1;
- }
- return (signed short)val;
- }
- return (signed short)__Pyx_PyInt_AsSignedLong(x);
-}
-
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
- const signed int neg_one = (signed int)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
- if (sizeof(signed int) < sizeof(long)) {
- long val = __Pyx_PyInt_AsLong(x);
- if (unlikely(val != (long)(signed int)val)) {
- if (!unlikely(val == -1 && PyErr_Occurred())) {
- PyErr_SetString(PyExc_OverflowError,
- (is_unsigned && unlikely(val < 0)) ?
- "can't convert negative value to signed int" :
- "value too large to convert to signed int");
- }
- return (signed int)-1;
- }
- return (signed int)val;
- }
- return (signed int)__Pyx_PyInt_AsSignedLong(x);
-}
-
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
- const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_VERSION_HEX < 0x03000000
- if (likely(PyInt_Check(x))) {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to unsigned long");
- return (unsigned long)-1;
- }
- return (unsigned long)val;
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
- if (unlikely(Py_SIZE(x) < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to unsigned long");
- return (unsigned long)-1;
- }
- return PyLong_AsUnsignedLong(x);
- } else {
- return PyLong_AsLong(x);
- }
- } else {
- unsigned long val;
- PyObject *tmp = __Pyx_PyNumber_Int(x);
- if (!tmp) return (unsigned long)-1;
- val = __Pyx_PyInt_AsUnsignedLong(tmp);
- Py_DECREF(tmp);
- return val;
- }
-}
-
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
- const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_VERSION_HEX < 0x03000000
- if (likely(PyInt_Check(x))) {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to unsigned PY_LONG_LONG");
- return (unsigned PY_LONG_LONG)-1;
- }
- return (unsigned PY_LONG_LONG)val;
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
- if (unlikely(Py_SIZE(x) < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to unsigned PY_LONG_LONG");
- return (unsigned PY_LONG_LONG)-1;
- }
- return PyLong_AsUnsignedLongLong(x);
- } else {
- return PyLong_AsLongLong(x);
- }
- } else {
- unsigned PY_LONG_LONG val;
- PyObject *tmp = __Pyx_PyNumber_Int(x);
- if (!tmp) return (unsigned PY_LONG_LONG)-1;
- val = __Pyx_PyInt_AsUnsignedLongLong(tmp);
- Py_DECREF(tmp);
- return val;
- }
-}
-
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
- const long neg_one = (long)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_VERSION_HEX < 0x03000000
- if (likely(PyInt_Check(x))) {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to long");
- return (long)-1;
- }
- return (long)val;
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
- if (unlikely(Py_SIZE(x) < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to long");
- return (long)-1;
- }
- return PyLong_AsUnsignedLong(x);
- } else {
- return PyLong_AsLong(x);
- }
- } else {
- long val;
- PyObject *tmp = __Pyx_PyNumber_Int(x);
- if (!tmp) return (long)-1;
- val = __Pyx_PyInt_AsLong(tmp);
- Py_DECREF(tmp);
- return val;
- }
-}
-
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
- const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_VERSION_HEX < 0x03000000
- if (likely(PyInt_Check(x))) {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to PY_LONG_LONG");
- return (PY_LONG_LONG)-1;
- }
- return (PY_LONG_LONG)val;
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
- if (unlikely(Py_SIZE(x) < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to PY_LONG_LONG");
- return (PY_LONG_LONG)-1;
- }
- return PyLong_AsUnsignedLongLong(x);
- } else {
- return PyLong_AsLongLong(x);
- }
- } else {
- PY_LONG_LONG val;
- PyObject *tmp = __Pyx_PyNumber_Int(x);
- if (!tmp) return (PY_LONG_LONG)-1;
- val = __Pyx_PyInt_AsLongLong(tmp);
- Py_DECREF(tmp);
- return val;
- }
-}
-
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
- const signed long neg_one = (signed long)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_VERSION_HEX < 0x03000000
- if (likely(PyInt_Check(x))) {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to signed long");
- return (signed long)-1;
- }
- return (signed long)val;
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
- if (unlikely(Py_SIZE(x) < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to signed long");
- return (signed long)-1;
- }
- return PyLong_AsUnsignedLong(x);
- } else {
- return PyLong_AsLong(x);
- }
- } else {
- signed long val;
- PyObject *tmp = __Pyx_PyNumber_Int(x);
- if (!tmp) return (signed long)-1;
- val = __Pyx_PyInt_AsSignedLong(tmp);
- Py_DECREF(tmp);
- return val;
- }
-}
-
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
- const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
- const int is_unsigned = neg_one > const_zero;
-#if PY_VERSION_HEX < 0x03000000
- if (likely(PyInt_Check(x))) {
- long val = PyInt_AS_LONG(x);
- if (is_unsigned && unlikely(val < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to signed PY_LONG_LONG");
- return (signed PY_LONG_LONG)-1;
- }
- return (signed PY_LONG_LONG)val;
- } else
-#endif
- if (likely(PyLong_Check(x))) {
- if (is_unsigned) {
- if (unlikely(Py_SIZE(x) < 0)) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to signed PY_LONG_LONG");
- return (signed PY_LONG_LONG)-1;
- }
- return PyLong_AsUnsignedLongLong(x);
- } else {
- return PyLong_AsLongLong(x);
- }
- } else {
- signed PY_LONG_LONG val;
- PyObject *tmp = __Pyx_PyNumber_Int(x);
- if (!tmp) return (signed PY_LONG_LONG)-1;
- val = __Pyx_PyInt_AsSignedLongLong(tmp);
- Py_DECREF(tmp);
- return val;
- }
-}
-
-#include "compile.h"
-#include "frameobject.h"
-#include "traceback.h"
-
-static void __Pyx_AddTraceback(const char *funcname) {
- PyObject *py_srcfile = 0;
- PyObject *py_funcname = 0;
- PyObject *py_globals = 0;
- PyCodeObject *py_code = 0;
- PyFrameObject *py_frame = 0;
-
- #if PY_MAJOR_VERSION < 3
- py_srcfile = PyString_FromString(__pyx_filename);
- #else
- py_srcfile = PyUnicode_FromString(__pyx_filename);
- #endif
- if (!py_srcfile) goto bad;
- if (__pyx_clineno) {
- #if PY_MAJOR_VERSION < 3
- py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
- #else
- py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
- #endif
- }
- else {
- #if PY_MAJOR_VERSION < 3
- py_funcname = PyString_FromString(funcname);
- #else
- py_funcname = PyUnicode_FromString(funcname);
- #endif
- }
- if (!py_funcname) goto bad;
- py_globals = PyModule_GetDict(__pyx_m);
- if (!py_globals) goto bad;
- py_code = PyCode_New(
- 0, /*int argcount,*/
- #if PY_MAJOR_VERSION >= 3
- 0, /*int kwonlyargcount,*/
- #endif
- 0, /*int nlocals,*/
- 0, /*int stacksize,*/
- 0, /*int flags,*/
- __pyx_empty_bytes, /*PyObject *code,*/
- __pyx_empty_tuple, /*PyObject *consts,*/
- __pyx_empty_tuple, /*PyObject *names,*/
- __pyx_empty_tuple, /*PyObject *varnames,*/
- __pyx_empty_tuple, /*PyObject *freevars,*/
- __pyx_empty_tuple, /*PyObject *cellvars,*/
- py_srcfile, /*PyObject *filename,*/
- py_funcname, /*PyObject *name,*/
- __pyx_lineno, /*int firstlineno,*/
- __pyx_empty_bytes /*PyObject *lnotab*/
- );
- if (!py_code) goto bad;
- py_frame = PyFrame_New(
- PyThreadState_GET(), /*PyThreadState *tstate,*/
- py_code, /*PyCodeObject *code,*/
- py_globals, /*PyObject *globals,*/
- 0 /*PyObject *locals*/
- );
- if (!py_frame) goto bad;
- py_frame->f_lineno = __pyx_lineno;
- PyTraceBack_Here(py_frame);
-bad:
- Py_XDECREF(py_srcfile);
- Py_XDECREF(py_funcname);
- Py_XDECREF(py_code);
- Py_XDECREF(py_frame);
-}
-
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
- while (t->p) {
- #if PY_MAJOR_VERSION < 3
- if (t->is_unicode) {
- *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
- } else if (t->intern) {
- *t->p = PyString_InternFromString(t->s);
- } else {
- *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
- }
- #else /* Python 3+ has unicode identifiers */
- if (t->is_unicode | t->is_str) {
- if (t->intern) {
- *t->p = PyUnicode_InternFromString(t->s);
- } else if (t->encoding) {
- *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
- } else {
- *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
- }
- } else {
- *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
- }
- #endif
- if (!*t->p)
- return -1;
- ++t;
- }
- return 0;
-}
-
-/* Type Conversion Functions */
-
-static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
- if (x == Py_True) return 1;
- else if ((x == Py_False) | (x == Py_None)) return 0;
- else return PyObject_IsTrue(x);
-}
-
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
- PyNumberMethods *m;
- const char *name = NULL;
- PyObject *res = NULL;
-#if PY_VERSION_HEX < 0x03000000
- if (PyInt_Check(x) || PyLong_Check(x))
-#else
- if (PyLong_Check(x))
-#endif
- return Py_INCREF(x), x;
- m = Py_TYPE(x)->tp_as_number;
-#if PY_VERSION_HEX < 0x03000000
- if (m && m->nb_int) {
- name = "int";
- res = PyNumber_Int(x);
- }
- else if (m && m->nb_long) {
- name = "long";
- res = PyNumber_Long(x);
- }
-#else
- if (m && m->nb_int) {
- name = "int";
- res = PyNumber_Long(x);
- }
-#endif
- if (res) {
-#if PY_VERSION_HEX < 0x03000000
- if (!PyInt_Check(res) && !PyLong_Check(res)) {
-#else
- if (!PyLong_Check(res)) {
-#endif
- PyErr_Format(PyExc_TypeError,
- "__%s__ returned non-%s (type %.200s)",
- name, name, Py_TYPE(res)->tp_name);
- Py_DECREF(res);
- return NULL;
- }
- }
- else if (!PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError,
- "an integer is required");
- }
- return res;
-}
-
-static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
- Py_ssize_t ival;
- PyObject* x = PyNumber_Index(b);
- if (!x) return -1;
- ival = PyInt_AsSsize_t(x);
- Py_DECREF(x);
- return ival;
-}
-
-static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
-#if PY_VERSION_HEX < 0x02050000
- if (ival <= LONG_MAX)
- return PyInt_FromLong((long)ival);
- else {
- unsigned char *bytes = (unsigned char *) &ival;
- int one = 1; int little = (int)*(unsigned char*)&one;
- return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
- }
-#else
- return PyInt_FromSize_t(ival);
-#endif
-}
-
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
- unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
- if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {
- return (size_t)-1;
- } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {
- PyErr_SetString(PyExc_OverflowError,
- "value too large to convert to size_t");
- return (size_t)-1;
- }
- return (size_t)val;
-}
-
-
-#endif /* Py_PYTHON_H */
diff --git a/3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.pyx b/3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.pyx
deleted file mode 100644
index e43bd2b28b4..00000000000
--- a/3rdparty/portmidi/pm_python/pyportmidi/_pyportmidi.pyx
+++ /dev/null
@@ -1,537 +0,0 @@
-# pyPortMidi
-# Python bindings for PortMidi
-# John Harrison
-# http://sound.media.mit.edu/~harrison
-# harrison@media.mit.edu
-# written in Pyrex
-__version__="0.07"
-
-import array
-
-# CHANGES:
-
-# 0.0.5: (June 1st, 2009)
-# Output no longer calls abort when it deallocates.
-# Added abort and close methods.
-# Need to call Abort() explicityly if you want that to happen.
-
-
-#
-# 0.0.3: (March 15, 2005)
-# changed everything from tuples to lists
-# return 4 values for PmRead instead of 3 (for SysEx)
-# minor fixes for flexibility and error checking
-# flushed out DistUtils package and added Mac and Linux compile support
-# Markus Pfaff: added ability for WriteSysEx to accept lists as well
-# as strings
-
-# 0.0.2:
-# fixed pointer to function calls to avoid necessity of pyport library
-
-# 0.0.1:
-# initial release
-
-cdef extern from "portmidi.h":
- ctypedef enum PmError:
- pmNoError = 0,
- pmHostError = -10000,
- pmInvalidDeviceId, #/* out of range or output device when input is requested or vice versa */
- pmInsufficientMemory,
- pmBufferTooSmall,
- pmBufferOverflow,
- pmBadPtr,
- pmBadData, #/* illegal midi data, e.g. missing EOX */
- pmInternalError,
- pmBufferMaxSize, #/* buffer is already as large as it can be */
- PmError Pm_Initialize()
- PmError Pm_Terminate()
- ctypedef void PortMidiStream
- ctypedef PortMidiStream PmStream # CHECK THIS!
- ctypedef int PmDeviceID
- int Pm_HasHostError( PortMidiStream * stream )
- char *Pm_GetErrorText( PmError errnum )
- Pm_GetHostErrorText(char * msg, unsigned int len)
- ctypedef struct PmDeviceInfo:
- int structVersion
- char *interf #/* underlying MIDI API, e.g. MMSystem or DirectX */
- char *name #/* device name, e.g. USB MidiSport 1x1 */
- int input #/* true iff input is available */
- int output #/* true iff output is available */
- int opened #/* used by generic PortMidi code to do error checking on arguments */
- int Pm_CountDevices()
- PmDeviceID Pm_GetDefaultInputDeviceID()
- PmDeviceID Pm_GetDefaultOutputDeviceID()
- ctypedef long PmTimestamp
- ctypedef PmTimestamp (*PmTimeProcPtr)(void *time_info)
- #PmBefore is not defined...
- PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id )
- PmError Pm_OpenInput( PortMidiStream** stream,
- PmDeviceID inputDevice,
- void *inputDriverInfo,
- long bufferSize,
- long (*PmPtr) (), # long = PtTimestamp
- void *time_info )
- PmError Pm_OpenOutput( PortMidiStream** stream,
- PmDeviceID outputDevice,
- void *outputDriverInfo,
- long bufferSize,
- #long (*PmPtr) (), # long = PtTimestamp
- PmTimeProcPtr time_proc, # long = PtTimestamp
- void *time_info,
- long latency )
- PmError Pm_SetFilter( PortMidiStream* stream, long filters )
- PmError Pm_Abort( PortMidiStream* stream )
- PmError Pm_Close( PortMidiStream* stream )
- ctypedef long PmMessage
- ctypedef struct PmEvent:
- PmMessage message
- PmTimestamp timestamp
- PmError Pm_Read( PortMidiStream *stream, PmEvent *buffer, long length )
- PmError Pm_Poll( PortMidiStream *stream)
- int Pm_Channel(int channel)
- PmError Pm_SetChannelMask(PortMidiStream *stream, int mask)
- PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, long length )
- PmError Pm_WriteSysEx( PortMidiStream *stream, PmTimestamp when, unsigned char *msg)
-
-cdef extern from "porttime.h":
- ctypedef enum PtError:
- ptNoError = 0,
- ptHostError = -10000,
- ptAlreadyStarted,
- ptAlreadyStopped,
- ptInsufficientMemory
- ctypedef long PtTimestamp
- ctypedef void (* PtCallback)( PtTimestamp timestamp, void *userData )
- PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
- PtTimestamp Pt_Time()
-
-FILT_ACTIVE=0x1
-FILT_SYSEX=0x2
-FILT_CLOCK=0x4
-FILT_PLAY=0x8
-FILT_F9=0x10
-FILT_TICK=0x10
-FILT_FD=0x20
-FILT_UNDEFINED=0x30
-FILT_RESET=0x40
-FILT_REALTIME=0x7F
-FILT_NOTE=0x80
-FILT_CHANNEL_AFTERTOUCH=0x100
-FILT_POLY_AFTERTOUCH=0x200
-FILT_AFTERTOUCH=0x300
-FILT_PROGRAM=0x400
-FILT_CONTROL=0x800
-FILT_PITCHBEND=0x1000
-FILT_MTC=0x2000
-FILT_SONG_POSITION=0x4000
-FILT_SONG_SELECT=0x8000
-FILT_TUNE=0x10000
-FALSE=0
-TRUE=1
-
-def Initialize():
- """
-Initialize: call this first
- """
- Pm_Initialize()
- Pt_Start(1, NULL, NULL) # /* equiv to TIME_START: start timer w/ ms accuracy */
-
-def Terminate():
- """
-Terminate: call this to clean up Midi streams when done.
-If you do not call this on Windows machines when you are
-done with MIDI, your system may crash.
- """
- Pm_Terminate()
-
-def GetDefaultInputDeviceID():
- return Pm_GetDefaultInputDeviceID()
-
-def GetDefaultOutputDeviceID():
- return Pm_GetDefaultOutputDeviceID()
-
-def CountDevices():
- return Pm_CountDevices()
-
-def GetDeviceInfo(i):
- """
-GetDeviceInfo(<device number>): returns 5 parameters
- - underlying MIDI API
- - device name
- - TRUE iff input is available
- - TRUE iff output is available
- - TRUE iff device stream is already open
- """
- cdef PmDeviceInfo *info
-
- # disregarding the constness from Pm_GetDeviceInfo, since pyrex doesn't do const.
- info = <PmDeviceInfo *>Pm_GetDeviceInfo(i)
-
- if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened
- else: return
-
-def Time():
- """
-Time() returns the current time in ms
-of the PortMidi timer
- """
- return Pt_Time()
-
-def GetErrorText(err):
- """
-GetErrorText(<err num>) returns human-readable error
-messages translated from error numbers
- """
- return Pm_GetErrorText(err)
-
-def Channel(chan):
- """
-Channel(<chan>) is used with ChannelMask on input MIDI streams.
-Example: to receive input on channels 1 and 10 on a MIDI
- stream called MidiIn:
-MidiIn.SetChannelMask(pypm.Channel(1) | pypm.Channel(10))
-
-note: PyPortMidi Channel function has been altered from
- the original PortMidi c call to correct for what
- seems to be a bug --- i.e. channel filters were
- all numbered from 0 to 15 instead of 1 to 16.
- """
- return Pm_Channel(chan-1)
-
-cdef class Output:
- """
-class Output:
- define an output MIDI stream. Takes the form:
- x = pypm.Output(MidiOutputDevice, latency)
- latency is in ms.
- If latency = 0 then timestamps for output are ignored.
- """
- cdef int i
- cdef PmStream *midi
- cdef int debug
- cdef int _aborted
-
- def __init__(self, OutputDevice, latency=0):
-
- cdef PmError err
- #cdef PtTimestamp (*PmPtr) ()
- cdef PmTimeProcPtr PmPtr
-
- self.i = OutputDevice
- self.debug = 0
- self._aborted = 0
-
- if latency == 0:
- PmPtr = NULL
- else:
- PmPtr = <PmTimeProcPtr>&Pt_Time
- if self.debug: print "Opening Midi Output"
- # Why is bufferSize 0 here?
- err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency)
- if err < 0:
- s = Pm_GetErrorText(err)
- # Something's amiss here - if we try to throw an Exception
- # here, we crash.
- if not err == -10000:
- raise Exception,s
- else:
- print "Unable to open Midi OutputDevice=",OutputDevice," err=",s
-
- def __dealloc__(self):
- if self.debug: print "Closing MIDI output stream and destroying instance"
- #err = Pm_Abort(self.midi)
- #if err < 0: raise Exception, Pm_GetErrorText(err)
- err = Pm_Close(self.midi)
- if err < 0: raise Exception, Pm_GetErrorText(err)
-
-
- def _check_open(self):
- """ checks to see if the midi is open, and if not, raises an error.
- """
-
- if self.midi == NULL:
- raise Exception, "midi Output not open."
-
- if self._aborted:
- raise Exception, "midi Output aborted. Need to call Close after Abort."
-
- def Close(self):
- """
-Close()
- closes a midi stream, flushing any pending buffers.
- (PortMidi attempts to close open streams when the application
- exits -- this is particularly difficult under Windows.)
- """
- #if not self.midi:
- # return
-
- err = Pm_Close(self.midi)
- if err < 0:
- raise Exception, Pm_GetErrorText(err)
- #self.midi = NULL
-
-
- def Abort(self):
- """
-Abort() terminates outgoing messages immediately
- The caller should immediately close the output port;
- this call may result in transmission of a partial midi message.
- There is no abort for Midi input because the user can simply
- ignore messages in the buffer and close an input device at
- any time.
- """
- #if not self.midi:
- # return
-
- err = Pm_Abort(self.midi)
- if err < 0:
- raise Exception, Pm_GetErrorText(err)
-
- self._aborted = 1
-
-
- def Write(self, data):
- """
-Write(data)
- output a series of MIDI information in the form of a list:
- Write([[[status <,data1><,data2><,data3>],timestamp],
- [[status <,data1><,data2><,data3>],timestamp],...])
- <data> fields are optional
- example: choose program change 1 at time 20000 and
- send note 65 with velocity 100 500 ms later.
- Write([[[0xc0,0,0],20000],[[0x90,60,100],20500]])
- notes:
- 1. timestamps will be ignored if latency = 0.
- 2. To get a note to play immediately, send MIDI info with
- timestamp read from function Time.
- 3. understanding optional data fields:
- Write([[[0xc0,0,0],20000]]) is equivalent to
- Write([[[0xc0],20000]])
- """
- cdef PmEvent buffer[1024]
- cdef PmError err
- cdef int i
-
- self._check_open()
-
-
- if len(data) > 1024: raise IndexError, 'maximum list length is 1024'
- else:
- for loop1 in range(len(data)):
- if ((len(data[loop1][0]) > 4) |
- (len(data[loop1][0]) < 1)):
- raise IndexError, str(len(data[loop1][0]))+' arguments in event list'
- buffer[loop1].message = 0
- for i in range(len(data[loop1][0])):
- buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i))
- buffer[loop1].timestamp = data[loop1][1]
- if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp
- if self.debug: print "writing to midi buffer"
- err= Pm_Write(self.midi, buffer, len(data))
- if err < 0: raise Exception, Pm_GetErrorText(err)
-
- def WriteShort(self, status, data1 = 0, data2 = 0):
- """
-WriteShort(status <, data1><, data2>)
- output MIDI information of 3 bytes or less.
- data fields are optional
- status byte could be:
- 0xc0 = program change
- 0x90 = note on
- etc.
- data bytes are optional and assumed 0 if omitted
- example: note 65 on with velocity 100
- WriteShort(0x90,65,100)
- """
- cdef PmEvent buffer[1]
- cdef PmError err
- self._check_open()
-
- buffer[0].timestamp = Pt_Time()
- buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF))
- if self.debug: print "Writing to MIDI buffer"
- err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length
- if err < 0 : raise Exception, Pm_GetErrorText(err)
-
- def WriteSysEx(self, when, msg):
- """
- WriteSysEx(<timestamp>,<msg>)
- writes a timestamped system-exclusive midi message.
- <msg> can be a *list* or a *string*
- example:
- (assuming y is an input MIDI stream)
- y.WriteSysEx(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7')
- is equivalent to
- y.WriteSysEx(pypm.Time,
- [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7])
- """
- cdef PmError err
- cdef char *cmsg
- cdef PtTimestamp CurTime
-
- self._check_open()
-
- if type(msg) is list:
- msg = array.array('B',msg).tostring() # Markus Pfaff contribution
- cmsg = msg
-
- CurTime = Pt_Time()
- err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg)
- if err < 0 : raise Exception, Pm_GetErrorText(err)
- while Pt_Time() == CurTime: # wait for SysEx to go thru or...my
- pass # win32 machine crashes w/ multiple SysEx
-
-
-
-
-
-
-
-
-
-
-
-cdef class Input:
- """
-class Input:
- define an input MIDI stream. Takes the form:
- x = pypm.Input(MidiInputDevice)
- """
- cdef PmStream *midi
- cdef int debug
- cdef int i
-
- def __init__(self, InputDevice, buffersize=4096):
- cdef PmError err
- self.i = InputDevice
- self.debug = 0
- err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL)
- if err < 0: raise Exception, Pm_GetErrorText(err)
- if self.debug: print "MIDI input opened."
-
- def __dealloc__(self):
- cdef PmError err
- if self.debug: print "Closing MIDI input stream and destroying instance"
-
- err = Pm_Close(self.midi)
- if err < 0:
- raise Exception, Pm_GetErrorText(err)
-
-
-
- def _check_open(self):
- """ checks to see if the midi is open, and if not, raises an error.
- """
-
- if self.midi == NULL:
- raise Exception, "midi Input not open."
-
-
- def Close(self):
- """
-Close()
- closes a midi stream, flushing any pending buffers.
- (PortMidi attempts to close open streams when the application
- exits -- this is particularly difficult under Windows.)
- """
- #if not self.midi:
- # return
-
- err = Pm_Close(self.midi)
- if err < 0:
- raise Exception, Pm_GetErrorText(err)
- #self.midi = NULL
-
-
-
- def SetFilter(self, filters):
- """
- SetFilter(<filters>) sets filters on an open input stream
- to drop selected input types. By default, only active sensing
- messages are filtered. To prohibit, say, active sensing and
- sysex messages, call
- SetFilter(stream, FILT_ACTIVE | FILT_SYSEX);
-
- Filtering is useful when midi routing or midi thru functionality
- is being provided by the user application.
- For example, you may want to exclude timing messages
- (clock, MTC, start/stop/continue), while allowing note-related
- messages to pass. Or you may be using a sequencer or drum-machine
- for MIDI clock information but want to exclude any notes
- it may play.
-
- Note: SetFilter empties the buffer after setting the filter,
- just in case anything got through.
- """
- cdef PmEvent buffer[1]
- cdef PmError err
-
- self._check_open()
-
-
- err = Pm_SetFilter(self.midi, filters)
-
- if err < 0: raise Exception, Pm_GetErrorText(err)
-
- while(Pm_Poll(self.midi) != pmNoError):
-
- err = Pm_Read(self.midi,buffer,1)
- if err < 0: raise Exception, Pm_GetErrorText(err)
-
- def SetChannelMask(self, mask):
- """
- SetChannelMask(<mask>) filters incoming messages based on channel.
- The mask is a 16-bit bitfield corresponding to appropriate channels
- Channel(<channel>) can assist in calling this function.
- i.e. to set receive only input on channel 1, call with
- SetChannelMask(Channel(1))
- Multiple channels should be OR'd together, like
- SetChannelMask(Channel(10) | Channel(11))
- note: PyPortMidi Channel function has been altered from
- the original PortMidi c call to correct for what
- seems to be a bug --- i.e. channel filters were
- all numbered from 0 to 15 instead of 1 to 16.
- """
- cdef PmError err
-
- self._check_open()
-
- err = Pm_SetChannelMask(self.midi,mask)
- if err < 0: raise Exception, Pm_GetErrorText(err)
-
- def Poll(self):
- """
- Poll tests whether input is available,
- returning TRUE, FALSE, or an error value.
- """
- cdef PmError err
- self._check_open()
-
- err = Pm_Poll(self.midi)
- if err < 0: raise Exception, Pm_GetErrorText(err)
- return err
-
- def Read(self,length):
- """
-Read(length): returns up to <length> midi events stored in
-the buffer and returns them as a list:
-[[[status,data1,data2,data3],timestamp],
- [[status,data1,data2,data3],timestamp],...]
-example: Read(50) returns all the events in the buffer,
- up to 50 events.
- """
- cdef PmEvent buffer[1024]
-
- self._check_open()
-
- x = []
-
- if length > 1024: raise IndexError, 'maximum buffer length is 1024'
- if length < 1: raise IndexError, 'minimum buffer length is 1'
- NumEvents = Pm_Read(self.midi,buffer,length)
- if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents)
- x=[]
- if NumEvents >= 1:
- for loop in range(NumEvents):
- x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp])
- return x
diff --git a/3rdparty/portmidi/pm_python/pyportmidi/midi.py b/3rdparty/portmidi/pm_python/pyportmidi/midi.py
deleted file mode 100644
index 71e4f2b4b8f..00000000000
--- a/3rdparty/portmidi/pm_python/pyportmidi/midi.py
+++ /dev/null
@@ -1,566 +0,0 @@
-"""
-Module for interacting with midi input and output.
-
-The midi module can send output to midi devices, and get input
-from midi devices. It can also list midi devices on the system.
-
-Including real midi devices, and virtual ones.
-
-It uses the portmidi library. Is portable to which ever platforms
-portmidi supports (currently windows, OSX, and linux).
-"""
-
-import atexit
-
-
-
-_init = False
-_pypm = None
-
-
-__all__ = [ "Input",
- "MidiException",
- "Output",
- "get_count",
- "get_default_input_id",
- "get_default_output_id",
- "get_device_info",
- "init",
- "quit",
- "time",
- ]
-
-__theclasses__ = ["Input", "Output"]
-
-
-def init():
- """initialize the midi module
- pyportmidi.init(): return None
-
- Call the initialisation function before using the midi module.
-
- It is safe to call this more than once.
- """
- global _init, _pypm
- if not _init:
- import pyportmidi._pyportmidi
- _pypm = pyportmidi._pyportmidi
-
- _pypm.Initialize()
- _init = True
- atexit.register(quit)
-
-
-def quit():
- """uninitialize the midi module
- pyportmidi.quit(): return None
-
-
- Called automatically atexit if you don't call it.
-
- It is safe to call this function more than once.
- """
- global _init, _pypm
- if _init:
- # TODO: find all Input and Output classes and close them first?
- _pypm.Terminate()
- _init = False
- del _pypm
-
-def _check_init():
- if not _init:
- raise RuntimeError("pyportmidi not initialised.")
-
-def get_count():
- """gets the number of devices.
- pyportmidi.get_count(): return num_devices
-
-
- Device ids range from 0 to get_count() -1
- """
- _check_init()
- return _pypm.CountDevices()
-
-
-
-
-def get_default_input_id():
- """gets default input device number
- pyportmidi.get_default_input_id(): return default_id
-
-
- Return the default device ID or -1 if there are no devices.
- The result can be passed to the Input()/Ouput() class.
-
- On the PC, the user can specify a default device by
- setting an environment variable. For example, to use device #1.
-
- set PM_RECOMMENDED_INPUT_DEVICE=1
-
- The user should first determine the available device ID by using
- the supplied application "testin" or "testout".
-
- In general, the registry is a better place for this kind of info,
- and with USB devices that can come and go, using integers is not
- very reliable for device identification. Under Windows, if
- PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is
- *NOT* found in the environment, then the default device is obtained
- by looking for a string in the registry under:
- HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device
- and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device
- for a string. The number of the first device with a substring that
- matches the string exactly is returned. For example, if the string
- in the registry is "USB", and device 1 is named
- "In USB MidiSport 1x1", then that will be the default
- input because it contains the string "USB".
-
- In addition to the name, get_device_info() returns "interf", which
- is the interface name. (The "interface" is the underlying software
- system or API used by PortMidi to access devices. Examples are
- MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.)
- At present, the only Win32 interface is "MMSystem", the only Linux
- interface is "ALSA", and the only Max OS X interface is "CoreMIDI".
- To specify both the interface and the device name in the registry,
- separate the two with a comma and a space, e.g.:
- MMSystem, In USB MidiSport 1x1
- In this case, the string before the comma must be a substring of
- the "interf" string, and the string after the space must be a
- substring of the "name" name string in order to match the device.
-
- Note: in the current release, the default is simply the first device
- (the input or output device with the lowest PmDeviceID).
- """
- return _pypm.GetDefaultInputDeviceID()
-
-
-
-
-def get_default_output_id():
- """gets default output device number
- pyportmidi.get_default_output_id(): return default_id
-
-
- Return the default device ID or -1 if there are no devices.
- The result can be passed to the Input()/Ouput() class.
-
- On the PC, the user can specify a default device by
- setting an environment variable. For example, to use device #1.
-
- set PM_RECOMMENDED_OUTPUT_DEVICE=1
-
- The user should first determine the available device ID by using
- the supplied application "testin" or "testout".
-
- In general, the registry is a better place for this kind of info,
- and with USB devices that can come and go, using integers is not
- very reliable for device identification. Under Windows, if
- PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is
- *NOT* found in the environment, then the default device is obtained
- by looking for a string in the registry under:
- HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device
- and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device
- for a string. The number of the first device with a substring that
- matches the string exactly is returned. For example, if the string
- in the registry is "USB", and device 1 is named
- "In USB MidiSport 1x1", then that will be the default
- input because it contains the string "USB".
-
- In addition to the name, get_device_info() returns "interf", which
- is the interface name. (The "interface" is the underlying software
- system or API used by PortMidi to access devices. Examples are
- MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.)
- At present, the only Win32 interface is "MMSystem", the only Linux
- interface is "ALSA", and the only Max OS X interface is "CoreMIDI".
- To specify both the interface and the device name in the registry,
- separate the two with a comma and a space, e.g.:
- MMSystem, In USB MidiSport 1x1
- In this case, the string before the comma must be a substring of
- the "interf" string, and the string after the space must be a
- substring of the "name" name string in order to match the device.
-
- Note: in the current release, the default is simply the first device
- (the input or output device with the lowest PmDeviceID).
- """
- _check_init()
- return _pypm.GetDefaultOutputDeviceID()
-
-
-def get_device_info(an_id):
- """ returns information about a midi device
- pyportmidi.get_device_info(an_id): return (interf, name, input, output, opened)
-
- interf - a text string describing the device interface, eg 'ALSA'.
- name - a text string for the name of the device, eg 'Midi Through Port-0'
- input - 0, or 1 if the device is an input device.
- output - 0, or 1 if the device is an output device.
- opened - 0, or 1 if the device is opened.
-
- If the id is out of range, the function returns None.
- """
- _check_init()
- return _pypm.GetDeviceInfo(an_id)
-
-
-class Input(object):
- """Input is used to get midi input from midi devices.
- Input(device_id)
- Input(device_id, buffer_size)
-
- buffer_size -the number of input events to be buffered waiting to
- be read using Input.read()
- """
-
- def __init__(self, device_id, buffer_size=4096):
- """
- The buffer_size specifies the number of input events to be buffered
- waiting to be read using Input.read().
- """
- _check_init()
-
- if device_id == -1:
- raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.")
-
- try:
- r = get_device_info(device_id)
- except TypeError:
- raise TypeError("an integer is required")
- except OverflowError:
- raise OverflowError("long int too large to convert to int")
-
- # and now some nasty looking error checking, to provide nice error
- # messages to the kind, lovely, midi using people of whereever.
- if r:
- interf, name, input, output, opened = r
- if input:
- try:
- self._input = _pypm.Input(device_id, buffer_size)
- except TypeError:
- raise TypeError("an integer is required")
- self.device_id = device_id
-
- elif output:
- raise MidiException("Device id given is not a valid input id, it is an output id.")
- else:
- raise MidiException("Device id given is not a valid input id.")
- else:
- raise MidiException("Device id invalid, out of range.")
-
-
-
-
- def _check_open(self):
- if self._input is None:
- raise MidiException("midi not open.")
-
-
-
- def close(self):
- """ closes a midi stream, flushing any pending buffers.
- Input.close(): return None
-
- PortMidi attempts to close open streams when the application
- exits -- this is particularly difficult under Windows.
- """
- _check_init()
- if not (self._input is None):
- self._input.Close()
- self._input = None
-
-
-
- def read(self, num_events):
- """reads num_events midi events from the buffer.
- Input.read(num_events): return midi_event_list
-
- Reads from the Input buffer and gives back midi events.
- [[[status,data1,data2,data3],timestamp],
- [[status,data1,data2,data3],timestamp],...]
- """
- _check_init()
- self._check_open()
- return self._input.Read(num_events)
-
-
- def poll(self):
- """returns true if there's data, or false if not.
- Input.poll(): return Bool
-
- raises a MidiException on error.
- """
- _check_init()
- self._check_open()
-
- r = self._input.Poll()
- if r == _pypm.TRUE:
- return True
- elif r == _pypm.FALSE:
- return False
- else:
- err_text = GetErrorText(r)
- raise MidiException( (r, err_text) )
-
-
-
-
-class Output(object):
- """Output is used to send midi to an output device
- Output(device_id)
- Output(device_id, latency = 0)
- Output(device_id, buffer_size = 4096)
- Output(device_id, latency, buffer_size)
-
- The buffer_size specifies the number of output events to be
- buffered waiting for output. (In some cases -- see below --
- PortMidi does not buffer output at all and merely passes data
- to a lower-level API, in which case buffersize is ignored.)
-
- latency is the delay in milliseconds applied to timestamps to determine
- when the output should actually occur. (If latency is < 0, 0 is
- assumed.)
-
- If latency is zero, timestamps are ignored and all output is delivered
- immediately. If latency is greater than zero, output is delayed until
- the message timestamp plus the latency. (NOTE: time is measured
- relative to the time source indicated by time_proc. Timestamps are
- absolute, not relative delays or offsets.) In some cases, PortMidi
- can obtain better timing than your application by passing timestamps
- along to the device driver or hardware. Latency may also help you
- to synchronize midi data to audio data by matching midi latency to
- the audio buffer latency.
-
- """
-
- def __init__(self, device_id, latency = 0, buffer_size = 4096):
- """Output(device_id)
- Output(device_id, latency = 0)
- Output(device_id, buffer_size = 4096)
- Output(device_id, latency, buffer_size)
-
- The buffer_size specifies the number of output events to be
- buffered waiting for output. (In some cases -- see below --
- PortMidi does not buffer output at all and merely passes data
- to a lower-level API, in which case buffersize is ignored.)
-
- latency is the delay in milliseconds applied to timestamps to determine
- when the output should actually occur. (If latency is < 0, 0 is
- assumed.)
-
- If latency is zero, timestamps are ignored and all output is delivered
- immediately. If latency is greater than zero, output is delayed until
- the message timestamp plus the latency. (NOTE: time is measured
- relative to the time source indicated by time_proc. Timestamps are
- absolute, not relative delays or offsets.) In some cases, PortMidi
- can obtain better timing than your application by passing timestamps
- along to the device driver or hardware. Latency may also help you
- to synchronize midi data to audio data by matching midi latency to
- the audio buffer latency.
- """
-
- _check_init()
- self._aborted = 0
-
- if device_id == -1:
- raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.")
-
- try:
- r = get_device_info(device_id)
- except TypeError:
- raise TypeError("an integer is required")
- except OverflowError:
- raise OverflowError("long int too large to convert to int")
-
- # and now some nasty looking error checking, to provide nice error
- # messages to the kind, lovely, midi using people of whereever.
- if r:
- interf, name, input, output, opened = r
- if output:
- try:
- self._output = _pypm.Output(device_id, latency)
- except TypeError:
- raise TypeError("an integer is required")
- self.device_id = device_id
-
- elif input:
- raise MidiException("Device id given is not a valid output id, it is an input id.")
- else:
- raise MidiException("Device id given is not a valid output id.")
- else:
- raise MidiException("Device id invalid, out of range.")
-
- def _check_open(self):
- if self._output is None:
- raise MidiException("midi not open.")
-
- if self._aborted:
- raise MidiException("midi aborted.")
-
-
- def close(self):
- """ closes a midi stream, flushing any pending buffers.
- Output.close(): return None
-
- PortMidi attempts to close open streams when the application
- exits -- this is particularly difficult under Windows.
- """
- _check_init()
- if not (self._output is None):
- self._output.Close()
- self._output = None
-
- def abort(self):
- """terminates outgoing messages immediately
- Output.abort(): return None
-
- The caller should immediately close the output port;
- this call may result in transmission of a partial midi message.
- There is no abort for Midi input because the user can simply
- ignore messages in the buffer and close an input device at
- any time.
- """
-
- _check_init()
- if self._output:
- self._output.Abort()
- self._aborted = 1
-
-
-
-
-
- def write(self, data):
- """writes a list of midi data to the Output
- Output.write(data)
-
- writes series of MIDI information in the form of a list:
- write([[[status <,data1><,data2><,data3>],timestamp],
- [[status <,data1><,data2><,data3>],timestamp],...])
- <data> fields are optional
- example: choose program change 1 at time 20000 and
- send note 65 with velocity 100 500 ms later.
- write([[[0xc0,0,0],20000],[[0x90,60,100],20500]])
- notes:
- 1. timestamps will be ignored if latency = 0.
- 2. To get a note to play immediately, send MIDI info with
- timestamp read from function Time.
- 3. understanding optional data fields:
- write([[[0xc0,0,0],20000]]) is equivalent to
- write([[[0xc0],20000]])
-
- Can send up to 1024 elements in your data list, otherwise an
- IndexError exception is raised.
- """
- _check_init()
- self._check_open()
-
- self._output.Write(data)
-
-
- def write_short(self, status, data1 = 0, data2 = 0):
- """write_short(status <, data1><, data2>)
- Output.write_short(status)
- Output.write_short(status, data1 = 0, data2 = 0)
-
- output MIDI information of 3 bytes or less.
- data fields are optional
- status byte could be:
- 0xc0 = program change
- 0x90 = note on
- etc.
- data bytes are optional and assumed 0 if omitted
- example: note 65 on with velocity 100
- write_short(0x90,65,100)
- """
- _check_init()
- self._check_open()
- self._output.WriteShort(status, data1, data2)
-
-
- def write_sys_ex(self, when, msg):
- """writes a timestamped system-exclusive midi message.
- Output.write_sys_ex(when, msg)
-
- msg - can be a *list* or a *string*
- when - a timestamp in miliseconds
- example:
- (assuming o is an onput MIDI stream)
- o.write_sys_ex(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7')
- is equivalent to
- o.write_sys_ex(pyportmidi.time(),
- [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7])
- """
- _check_init()
- self._check_open()
- self._output.WriteSysEx(when, msg)
-
-
- def note_on(self, note, velocity=None, channel = 0):
- """turns a midi note on. Note must be off.
- Output.note_on(note, velocity=None, channel = 0)
-
- Turn a note on in the output stream. The note must already
- be off for this to work correctly.
- """
- if velocity is None:
- velocity = 0
-
- if not (0 <= channel <= 15):
- raise ValueError("Channel not between 0 and 15.")
-
- self.write_short(0x90+channel, note, velocity)
-
- def note_off(self, note, velocity=None, channel = 0):
- """turns a midi note off. Note must be on.
- Output.note_off(note, velocity=None, channel = 0)
-
- Turn a note off in the output stream. The note must already
- be on for this to work correctly.
- """
- if velocity is None:
- velocity = 0
-
- if not (0 <= channel <= 15):
- raise ValueError("Channel not between 0 and 15.")
-
- self.write_short(0x80 + channel, note, velocity)
-
-
- def set_instrument(self, instrument_id, channel = 0):
- """select an instrument, with a value between 0 and 127
- Output.set_instrument(instrument_id, channel = 0)
-
- """
- if not (0 <= instrument_id <= 127):
- raise ValueError("Undefined instrument id: %d" % instrument_id)
-
- if not (0 <= channel <= 15):
- raise ValueError("Channel not between 0 and 15.")
-
- self.write_short(0xc0+channel, instrument_id)
-
-
-
-def time():
- """returns the current time in ms of the PortMidi timer
- pyportmidi.time(): return time
-
- The time is reset to 0, when the module is inited.
- """
- return _pypm.Time()
-
-
-
-
-
-
-
-
-class MidiException(Exception):
- """MidiException(errno) that can be raised.
- """
- def __init__(self, value):
- self.parameter = value
- def __str__(self):
- return repr(self.parameter)
-
-
-
diff --git a/3rdparty/portmidi/pm_python/setup.py b/3rdparty/portmidi/pm_python/setup.py
deleted file mode 100644
index 14ab1c758af..00000000000
--- a/3rdparty/portmidi/pm_python/setup.py
+++ /dev/null
@@ -1,185 +0,0 @@
-import sys
-import os
-import logging
-
-from distutils.core import setup, Command
-from distutils.extension import Extension
-try:
- from Cython.Distutils import build_ext
-except ImportError:
- logging.warn("Cython is preferred over pyrex for python3 compatibility.")
- from Pyrex.Distutils import build_ext
-
-
-
-
-
-DESCRIPTION = open('README_PYTHON.txt').read()
-CHANGES = open('CHANGES.txt').read()
-TODO = open('TODO.txt').read()
-
-EXTRAS = {}
-
-long_description = DESCRIPTION + CHANGES + TODO
-#import sys
-#if "checkdocs" in sys.argv:
-# print long_description
-
-
-METADATA = {
- 'name': 'pyportmidi',
- 'version': '0.0.7',
- 'license': 'MIT License',
- 'url': 'http://pypi.python.org/pyportmidi/',
- 'author': 'John Harrison, Roger B. Dannenberg, Rene Dudfield, others...',
- 'author_email': 'renesd@gmail.com',
- 'maintainer': 'Rene Dudfield',
- 'maintainer_email': 'renesd@gmail.com',
- 'description': 'Python Wrappings for PortMidi #python. CHANGES: new package layout.',
- 'long_description': long_description,
- 'classifiers': [
- 'Development Status :: 2 - Pre-Alpha',
- 'Intended Audience :: Developers',
- 'Intended Audience :: Information Technology',
- 'License :: OSI Approved :: BSD License',
- 'Operating System :: MacOS :: MacOS X',
- 'Operating System :: Microsoft :: Windows',
- 'Operating System :: POSIX :: Linux',
- 'Programming Language :: Cython',
- 'Programming Language :: C',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.5',
- 'Programming Language :: Python :: 2.6',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.0',
- 'Programming Language :: Python :: 3.1',
- 'Programming Language :: Python :: 3.2',
- 'Topic :: Multimedia :: Sound/Audio :: MIDI',
- 'Topic :: Software Development :: Libraries',
- ],
-}
-
-
-if "bdist_msi" in sys.argv:
- # hack the version name to a format msi doesn't have trouble with
- METADATA["version"] = METADATA["version"].replace("pre", "a0")
- METADATA["version"] = METADATA["version"].replace("rc", "b0")
- METADATA["version"] = METADATA["version"].replace("release", "")
-
-
-
-
-
-# allow optionally using setuptools for bdist_egg.
-using_setuptools = False
-
-if "-setuptools" in sys.argv:
- using_setuptools = True
-
- from setuptools import setup, Command
- sys.argv.remove ("-setuptools")
-
- EXTRAS.update({'include_package_data': True,
- 'install_requires': [],
- 'zip_safe': False,
- 'test_suite' : 'pyportmidi.tests',
- }
- )
-
-
-# test command. For doing 'python setup.py test'
-class TestCommand(Command):
- user_options = [ ]
-
- def initialize_options(self):
- self._dir = os.getcwd()
-
- def finalize_options(self):
- pass
-
- def run(self):
- '''
- runs the tests with default options.
- '''
- import pyportmidi.tests
- pyportmidi.tests.main()
-
- #import subprocess
- #return subprocess.call([sys.executable, "run_tests.py"])
-
-
-cmdclass = {'build_ext': build_ext}
-
-# we use our test command.
-if not using_setuptools:
- import os
- cmdclass['test'] = TestCommand
-
-
-
-scripts = []
-
-PACKAGEDATA = {
- 'cmdclass': cmdclass,
-
- 'package_dir': {'pyportmidi': 'pyportmidi',
- #'pyportmidi.tests': 'test',
- #'pyportmidi.docs': 'docs',
- #'pyportmidi.examples': 'examples',
-
- },
- 'packages': ['pyportmidi',
- 'pyportmidi.tests',
- ],
- 'scripts': scripts,
-}
-
-
-PACKAGEDATA.update(METADATA)
-PACKAGEDATA.update(EXTRAS)
-
-
-
-if sys.platform == 'win32':
- print "Found Win32 platform"
- EXTENSION = dict(
- ext_modules=[
- Extension("pyportmidi._pyportmidi", [os.path.join("pyportmidi", "_pyportmidi.pyx")],
- library_dirs = ["../Release"],
- libraries = ["portmidi", "winmm"],
- include_dirs = ["../porttime"],
-# define_macros = [("_WIN32_", None)]) # needed by portmidi.h
- extra_compile_args = ["/DWIN32"]) # needed by portmidi.h
- ]
- )
-elif sys.platform == 'darwin':
- print "Found darwin (OS X) platform"
- library_dirs = ["/usr/local/lib"]
- include_dirs = ["/usr/local/include"]
- EXTENSION = dict(
- ext_modules=[
- Extension("pyportmidi._pyportmidi", [os.path.join("pyportmidi", "_pyportmidi.pyx")],
- library_dirs = library_dirs,
- include_dirs = include_dirs,
- libraries = ["portmidi"],
- extra_link_args=["-framework", "CoreFoundation",
- "-framework", "CoreMIDI",
- "-framework", "CoreAudio"])
- ]
- )
-else:
- print "Assuming Linux platform"
- EXTENSION = dict(
- ext_modules=[
- Extension("pyportmidi._pyportmidi", [os.path.join("pyportmidi", "_pyportmidi.pyx")],
- library_dirs=["./linux"],
- libraries = ["portmidi", "asound", "pthread"]
- )
- ]
-
- )
-
-PACKAGEDATA.update(EXTENSION)
-
-setup(**PACKAGEDATA)
diff --git a/3rdparty/portmidi/pm_qt/README_QT.txt b/3rdparty/portmidi/pm_qt/README_QT.txt
deleted file mode 100644
index 181ad9f5a16..00000000000
--- a/3rdparty/portmidi/pm_qt/README_QT.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-README_QT.txt for PortMidi
-Richard Starfield
-20 Sep 2010
-
-This is a QtCreator build file for PortMidi.
-
-To build PortMidi on Windows with QtCreator:
-
-Move portmidi/pm_qt/portmidi.pro to portmidi/portmidi.pro
-
-Open portmidi.pro in QtCreator, change to the release build option and build all to compile the static library.
-
-This has been tested in Windows. The project file does include Linux build switches but they haven't been tested yet.
-
-To compile a DLL instead of a static library change line 11 from "CONFIG += staticlib" to "CONFIG += DLL"
diff --git a/3rdparty/portmidi/pm_qt/portmidi.pro b/3rdparty/portmidi/pm_qt/portmidi.pro
deleted file mode 100644
index d2298f7596a..00000000000
--- a/3rdparty/portmidi/pm_qt/portmidi.pro
+++ /dev/null
@@ -1,47 +0,0 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2010-09-02T12:50:47
-#
-#-------------------------------------------------
-
-QT -= core gui
-
-TARGET = portmidi
-TEMPLATE = lib
-CONFIG += staticlib # replace this with DLL for dynamic link on Windows
-
-INCLUDEPATH = pm_common/ porttime/
-
-win32 {
- INCLUDEPATH += pm_win/
- LIBS += -lwinmm
- SOURCES += pm_win/pmwinmm.c \
- pm_win/pmwin.c
- HEADERS += pm_win/pmwinmm.h
-}
-
-# this build hasn't been tested on Linux yet
-unix {
- DEFINES += PMALSA
- INCLUDEPATH += pm_linux/
- LIBS += -lasound
- SOURCES += pm_linux/finddefault.c \
- pm_linux/pmlinux.c \
- pm_linux/pmlinuxalsa.c
- HEADERS += pm_linux/pmlinux.h pm_linux/pmlinuxalsa.h
-}
-
-
-DEFINES -= UNICODE
-
-SOURCES += \
- pm_common/portmidi.c \
- pm_common/pmutil.c \
- porttime/porttime.c \
- porttime/ptwinmm.c
-
-HEADERS += \
- pm_common/pmutil.h \
- pm_common/pminternal.h \
- pm_common/portmidi.h \
- porttime/porttime.h
diff --git a/3rdparty/portmidi/pm_test/CMakeLists.txt b/3rdparty/portmidi/pm_test/CMakeLists.txt
index b89074b0bd5..ae0fe48b53d 100644
--- a/3rdparty/portmidi/pm_test/CMakeLists.txt
+++ b/3rdparty/portmidi/pm_test/CMakeLists.txt
@@ -1,4 +1,4 @@
-# pm_test
+# CMake file to build tests in this directory: pm_test
# set the build directory to be in portmidi, not in portmidi/pm_test
# this is required for Xcode:
@@ -6,21 +6,41 @@ if(APPLE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
endif(APPLE)
-if(WIN32)
-include(../pm_win/static.cmake)
-endif(WIN32)
+# if(WIN32)
+# if(NOT BUILD_SHARED_LIBS)
+ # /MDd is multithread debug DLL, /MTd is multithread debug
+ # /MD is multithread DLL, /MT is multithread. Change to static:
+# include(../pm_win/static.cmake)
+# endif()
+# endif(WIN32)
+
+if(HAIKU)
+ add_compile_options(-fPIC) # Haiku x86_64 needs this explicitly
+endif()
-macro(make_a_test name)
+macro(add_test name)
add_executable(${name} ${name}.c)
- target_link_libraries(${name} portmidi-static ${PM_NEEDED_LIBS})
- add_dependencies(${name} portmidi-static)
-endmacro(make_a_test)
+ target_link_libraries(${name} PRIVATE portmidi)
+ set_property(TARGET ${name} PROPERTY MSVC_RUNTIME_LIBRARY
+ "MultiThreaded$<$<CONFIG:Debug>:Debug>${MSVCRT_DLL}")
+endmacro(add_test)
-make_a_test(test)
-make_a_test(midithread)
-make_a_test(midithru)
-make_a_test(sysex)
-make_a_test(latency)
-make_a_test(mm)
-make_a_test(midiclock)
-make_a_test(qtest)
+add_test(testio)
+add_test(midithread)
+add_test(midithru)
+add_test(sysex)
+add_test(latency)
+add_test(mm)
+add_test(midiclock)
+add_test(qtest)
+add_test(fast)
+add_test(fastrcv)
+add_test(pmlist)
+if(WIN32)
+# windows does not implement Pm_CreateVirtualInput or Pm_CreateVirtualOutput
+else(WIN32)
+add_test(recvvirtual)
+add_test(sendvirtual)
+add_test(multivirtual)
+add_test(virttest)
+endif(WIN32)
diff --git a/3rdparty/portmidi/pm_test/README.txt b/3rdparty/portmidi/pm_test/README.txt
new file mode 100644
index 00000000000..b5a83d693b8
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/README.txt
@@ -0,0 +1,376 @@
+README.txt - for pm_test directory
+
+These are all test programs for PortMidi
+
+Because device numbers depend on the system, there is no automated
+script to run all tests on PortMidi.
+
+To run the full set of tests manually:
+
+Note: everything is run from the ../Debug or ../Release directory.
+Actual or example input is marked with >>, e.g., >>0 means type 0<ENTER>
+Comments are shown in square brackets [like this]
+
+1. ./qtest -- output should show a bunch of tests and no error message.
+
+2. ./testio [test input]
+Latency in ms: >>0
+enter your choice... >>1
+Type input number: >>6 [pick a working input device]
+[play some notes, look for note-on (0x90) with pitch and velocity data]
+
+3. ./testio [test input (fail w/assert)]
+Latency in ms: >>0
+enter your choice... >>2
+Type input number: >>6 [pick a working input device]
+[play some notes, program will abort after 5 messages
+(this test only applies to a Debug build, otherwise
+the assert() macro is disabled.)]
+
+4. ./testio [test input (fail w/NULL assign)]
+Latency in ms: >>0
+enter your choice... >>3
+Type input number: >>6 [pick a working input device]
+[play some notes, program will Segmentation fault after 5 messages
+(this test may not Segfault in the Release build; if not
+try testing with a Debug build.)]
+
+5. ./testio [test output, no latency]
+Latency in ms: >>0
+enter your choice... >>4
+Type output number: >>2 [pick a working output device]
+>> [type ENTER when prompted (7 times)]
+[hear note on, note off, note on, note off, chord]
+
+6. ./testio [test output, latency > 0]
+Latency in ms: >>300
+enter your choice... >>4
+Type output number: >>2 [pick a working output device]
+>> [type ENTER when prompted (7 times)]
+[hear note on, note off, note on, note off, arpeggiated chord
+ (delay of 300ms should be apparent)]
+
+7. ./testio [for both, no latency]
+Latency in ms: >>0
+enter your choice... >>5
+Type input number: >>6 [pick a working input device]
+Type output number: >>2 [pick a working output device]
+[play notes on input, hear them on output]
+
+8. ./testio [for both, latency > 0]
+Latency in ms: >>300
+enter your choice... >>5
+Type input number: >>6 [pick a working input device]
+Type output number: >>2 [pick a working output device]
+[play notes on input, hear them on output (delay of 300ms is apparent)]
+
+9. ./testio [stream test]
+Latency in ms: >>0 [does not matter]
+enter your choice... >>6
+Type output number: >>2 [pick a working output device]
+>> [type ENTER to start]
+[hear 4 notes: C D E F# at one note per second, then all turn off]
+ready to close and terminate... (type ENTER) :>> [type ENTER (twice)]
+
+10. ./testio [isochronous out]
+Latency in ms: >>300
+enter your choice... >>7
+Type output number: >>2 [pick a working output device]
+ready to send program 1 change... (type ENTER): >> [type ENTER]
+[hear 80 notes, exactly 4 notes per second, no jitter]
+
+11. ./latency [no MIDI, histogram]
+Choose timer period (in ms, >= 1): >>1
+? >>1 [No MIDI traffic option]
+[wait about 10 seconds]
+>> [type ENTER]
+[output should be something like ... Maximum latency: 1 milliseconds]
+
+12. ./latency [MIDI input, histogram]
+Choose timer period (in ms, >= 1): >>1
+? >>2 [MIDI input option]
+Midi input device number: >>6 [pick a working input device]
+[wait about 5 seconds, play input for 10 seconds ]
+>> [type ENTER]
+[output should be something like ... Maximum latency: 3 milliseconds]
+
+13. ./latency [MIDI output, histogram]
+Choose timer period (in ms, >= 1): >>1
+? >>3 [MIDI output option]
+Midi output device number: >>2 [pick a working output device]
+Midi output should be sent every __ callback iterations: >>50
+[wait until you hear notes for 5 or 10 seconds]
+>> [type ENTER to stop]
+[output should be something like ... Maximum latency: 2 milliseconds]
+
+14. ./latency [MIDI input and output, histogram]
+Choose timer period (in ms, >= 1): >>1
+? >>4 [MIDI input and output option]
+Midi input device number: >>6 [pick a working input device]
+Midi output device number: >>2 [pick a working output device]
+Midi output should be sent every __ callback iterations: >>50
+[wait until you hear notes, simultaneously play notes for 5 or 10 seconds]
+>> [type ENTER to stop]
+[output should be something like ... Maximum latency: 1 milliseconds]
+
+15. ./mm [test with device input]
+Type input device number: >>6 [pick a working input device]
+[play some notes, see notes printed]
+>>q [Type q ENTER when finished to exit]
+
+16. ./midithread -i 6 -o 2 [use working input/output device numbers]
+>>5 [enter a transposition number]
+[play some notes, hear parallel 4ths]
+>>q [quit after ENTER a couple of times]
+
+17. ./midiclock [in one shell]
+ ./mm [in another shell]
+[Goal is send clock messages to MIDI monitor program. This requires
+ either a hardware loopback (MIDI cable from OUT to IN on interface)
+ or a software loopback (macOS IAC bus or ALSA MIDI Through Port)]
+[For midiclock application:]
+ Type output device number: >>0 [pick a device with loopback]
+ Type ENTER to start MIDI CLOCK: >> [type ENTER]
+[For mm application:]
+ Type input device number: >>1 [pick device with loopback]
+ [Wait a few seconds]
+ >>s [to get Clock Count]
+ >>s [expect to get a higher Clock Count]
+[For midiclock application:]
+ >>c [turn off clocks]
+[For mm application:]
+ >>s [to get Clock Count]
+ >>s [expect to Clock Count stays the same]
+[For midiclock application:]
+ >>t [turn on time code, see Time Code Quarter Frame messages from mm]
+ >>q [to quit]
+[For mm application:]
+ >>q [to quit]
+
+18. ./midithru -i 6 -o 2 [use working input/output device numbers]
+[Play notes on input evice; notes are sent immediately and also with a
+ 2 sec delay to the output device; program terminates in 60 seconds or
+ when you play B3 (B below Middle C)]
+>> [ENTER to exit]
+
+19. ./recvvirtual [in one shell, macOS and Linux only]
+ ./testio [in another shell]
+[For testio application:]
+ Latency in ms: >>0
+ enter your choice... >>4 [test output]
+ Type output number: >>9 [select the "portmidi (output)" device]
+ [type ENTER to each prompt, see that recvvirtual "Got message 0"
+ through "Got message 9"]
+ >> [ENTER to quit]
+[For recvvirtual application:]
+ >> [ENTER to quit]
+
+20. ./sendvirtual [in one shell, macOS and Linux only]
+ ./mm [in another shell]
+[For mm application:]
+ Type input device number: >>10 [select the "portmidi" device]
+[For sendvirtual application:]
+ Type ENTER to send messages: >> [type ENTER]
+ [see NoteOn and off messages received by mm for Key 60-64]
+ >> [ENTER to quit]
+[For mm application:]
+ >>q [and ENTER twice to quit]
+
+21. ./sysex [no latency]
+[This requires either a hardware loopback (MIDI cable from OUT to IN
+ on interface) or a software loopback (macOS IAC bus or ALSA MIDI
+ Through Port)]
+>>l [for loopback test]
+Type output device number: >>0 [pick output device to loopback]
+Latency in milliseconds: >>0
+Type input device number: >>0 [pick input device for loopback]
+[Program will send 100,000 bytes. After awhile, program will quit.
+ You can read the Cummulative bytes/sec value.]
+
+22. ./sysex [latency > 0]
+[This requires either a hardware loopback (MIDI cable from OUT to IN
+ on interface) or a software loopback (macOS IAC bus or ALSA MIDI
+ Through Port)]
+>>l [for loopback test]
+Type output device number: >>0 [pick output device to loopback]
+Latency in milliseconds: >>100
+Type input device number: >>0 [pick input device for loopback]
+[Program will send 100,000 bytes. After awhile, program will quit. You
+ can read the Cummulative bytes/sec value; it is affected by latency.]
+
+23. ./fast [no latency]
+ ./fastrcv [in another shell]
+[This is a speed check, especially for macOSX IAC bus connections,
+ which are known to drop messages if you send messages too fast.
+ fast and fastrcv must use a loopback to function.]
+[In fastrcv:]
+ Input device number: >>1 [pick a non-hardware device if possible]
+[In fast:]
+ Latency in ms: >>0
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>0 [pick a non-hardware device if possible]
+ sending output...
+[see message counts and times; on Linux you should get about 10000
+ messages/s; on macOS you should get about 1800 messages/s; Windows
+ does not have software ports, so data rate might be limited by the
+ loopback device you use.]
+
+Check output of fastrcv: there should be no errors, just msg/sec.]
+
+24. ./fast [latency > 0]
+ ./fastrcv [in another shell]
+[This is a speed check, especially for macOSX IAC bus connections,
+ which are known to drop messages if you send messages too fast.
+ fast and fastrcv must use a loopback to function.]
+[In fastrcv:]
+ Input device number: >>1 [pick a non-hardware device if possible]
+[In fast:]
+ Latency in ms: >>30 [Note for ALSA, use latency * msgs/ms < 400]
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>0 [pick a non-hardware device if possible]
+ sending output...
+[see message counts and times; on Linux you should get about 10000
+ messages/s; on macOS you should get about 1800 messages/s; Windows
+ does not have software ports, so data rate might be limited by the
+ loopback device you use.]
+
+Check output of fastrcv: there should be no errors, just msg/sec.]
+
+25. ./fast [virtual output port, latency = 0, macOS and Linux only]
+ ./fastrcv [in another shell]
+[Start fast first:]
+ Latency in ms: >>0
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>9 [enter number listed for "Create virtual
+ port named 'fast' (output)"]
+ Pausing so you can connect a receiver to the newly created
+ "fast" port. Type ENTER to proceed:
+[In fastrcv:]
+ Input device number: >>3 [pick the device named "fast (input)"]
+[In fast:]
+ >> [type ENTER to start]
+[see message counts and times as above ]
+
+Check output of fastrcv: there should be no errors, just msg/sec.]
+
+26. ./fast [virtual output port, latency > 0, macOS and Linux only]
+ ./fastrcv [in another shell]
+[Start fast first:]
+ Latency in ms: >>30 [Note for ALSA, use latency * msgs/ms < 400]
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>9 [enter number listed for "Create virtual
+ port named 'fast' (output)"]
+ Pausing so you can connect a receiver to the newly created
+ "fast" port. Type ENTER to proceed:
+[In fastrcv:]
+ Input device number: >>3 [pick the device named "fast (input)"]
+[In fast:]
+ >> [type ENTER to start]
+[see message counts and times as above ]
+
+Check output of fastrcv: there should be no errors, just msg/sec.]
+
+27. ./fast [latency = 0, macOS and Linux only]
+ ./fastrcv [virtual input port, in another shell]
+[In fastrcv:]
+ Input device number: >>8 [enter number listed for "Create virtual
+ port named 'fastrcv' (input)"]
+[In fast:]
+ Latency in ms: >>0
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>7 [pick the device named "fastrcv (output)"]
+ sending output...
+[see message counts and times as above ]
+
+Check output of fastrcv: there should be no errors, just msg/sec.]
+
+28. ./fast [latency > 0, macOS and Linux only]
+ ./fastrcv [virtual input port, in another shell]
+[In fastrcv:]
+ Input device number: >>8 [enter number listed for "Create virtual
+ port named 'fastrcv' (input)"]
+[In fast:]
+ Latency in ms: >>30 [Note for ALSA, use latency * msgs/ms < 400]
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>7 [pick the device named "fastrcv (output)"]
+ sending output...
+[see message counts and times as above ]
+
+Check output of fastrcv: there should be no errors, just msg/sec.]
+
+29. ./midithru -v -n [virtual input and output, macOS and Linux only]
+ ./fast [latency = 0]
+ ./fastrcv [in another shell]
+[Start midithru first, it will run for 60 seconds]
+[In fastrcv:]
+ Input device number: >>3 [pick the device named
+ port named "midithru (input)"]
+[In fast:]
+ Latency in ms: >>0
+ Rate in messages per second: >>10000
+ Duration in seconds: >>10
+ Output device number: >>8 [pick the device named "midithru (output)"]
+ sending output...
+[see message counts and times as above, on Mac, output from fast to
+ midithru AND output from midithru to fastrcv are rate limited, so
+ as in other tests, it will take more than 10s to receive all the
+ messages and the receiving message rate will be about 1800 messages/second]
+
+30. ./multivirtual [macOS and Linux only]
+ ./testio
+ ./testio
+[Start multivirtual first]
+[In first testio:]
+ Latency in ms: >>0
+ enter your choice... >>5 [test both]
+ Type input number: >>1 [pick portmidi1 (input)
+ Type output number: >>4 [pick portmidi1 (output)
+[In second testio:]
+ Latency in ms: >>10
+ enter your choice... >>5 [test both]
+ Type input number: >>2 [pick portmidi2 (input)
+ Type output number: >>5 [pick portmidi2 (output)
+[In multivirtual:]
+ Type ENTER to send messages: >> [type ENTER to start]
+[see that each testio gets 11 messages (0 to 10) at reasonable times
+ (e.g. 2077 to 7580, and the "@" times (real times) should match the
+ timestamps). multivirtual should also report reasonable times and
+ line near the end of output should be "Got 11 messages from
+ portmidi1 and 11 from portmidi2; expected 11."]
+
+31. ./multivirtual [macOS and Linux only]
+ ./multivirtual
+[Second instance should report "PortMidi call failed...
+ PortMidi: Cannot create virtual device: name is taken"]
+
+32. pmdefaults (if built, requires Java and some CMake options)
+ [must be run from pm_java/pmdefaults]
+ ./testio
+[In pmdefaults:
+ Select an input device. Input should flash the green
+ test light.
+ Select an output device. Test button should play a note.
+ Save the selections.
+ Quit the program.]
+[In testio:]
+ Latency in ms: >>0
+ enter your choice... >>5 [test both]
+ [In the device list, default devices are marked. They
+ should match the devices selected with pmdefaults.]
+ ^C to quit.
+33. pmlist
+ ./pmlist [check the output]
+ [plug in or remove a device]
+ >> [type RETURN]
+ [check for changes in device list]
+ >>q
+
+
+
+
diff --git a/3rdparty/portmidi/pm_test/fast.c b/3rdparty/portmidi/pm_test/fast.c
new file mode 100644
index 00000000000..102697e456e
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/fast.c
@@ -0,0 +1,290 @@
+/* fast.c -- send many MIDI messages very fast.
+ *
+ * This is a stress test created to explore reports of
+ * pm_write() call blocking (forever) on Linux when
+ * sending very dense MIDI sequences.
+ *
+ * Modified 8 Aug 2017 with -n to send expired timestamps
+ * to test a theory about why Linux ALSA hangs in Audacity.
+ *
+ * Modified 9 Aug 2017 with -m, -p to test when timestamps are
+ * wrapping from negative to positive or positive to negative.
+ *
+ * Roger B. Dannenberg, Aug 2017
+ */
+
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define DEVICE_INFO NULL
+#define DRIVER_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+#define STRING_MAX 80 /* used for console input */
+// need to get declaration for Sleep()
+#ifdef WIN32
+#include "windows.h"
+#else
+#include <unistd.h>
+#define Sleep(n) usleep(n * 1000)
+#endif
+
+
+int32_t latency = 0;
+int32_t msgrate = 0;
+int deviceno = -9999;
+int duration = 0;
+int expired_timestamps = FALSE;
+int use_timeoffset = 0;
+
+/* read a number from console */
+/**/
+int get_number(const char *prompt)
+{
+ int n = 0, i;
+ fputs(prompt, stdout);
+ while (n != 1) {
+ n = scanf("%d", &i);
+ while (getchar() != '\n') ;
+ }
+ return i;
+}
+
+
+/* get_time -- the time reference. Normally, this will be the default
+ * time, Pt_Time(), but if you use the -p or -m option, the time
+ * reference will start at an offset of -10s for -m, or
+ * maximum_time - 10s for -p, so that we can observe what happens
+ * with negative time or when time changes sign or wraps (by
+ * generating output for more than 10s).
+ */
+PmTimestamp get_time(void *info)
+{
+ PmTimestamp now = (PmTimestamp) (Pt_Time() + use_timeoffset);
+ return now;
+}
+
+
+void fast_test()
+{
+ PmStream *midi;
+ char line[STRING_MAX];
+ int pause = FALSE; /* pause if this is a virtual output port */
+ PmError err = pmNoError;
+ /* output buffer size should be a little more than
+ msgrate * latency / 1000. PortMidi will guarantee
+ a minimum of latency / 2 */
+ int buffer_size = msgrate * latency / 900;
+ PmTimestamp start, now;
+ int msgcnt = 0;
+ int polling_count = 0;
+ int pitch = 60;
+ int printtime = 1000;
+
+ /* It is recommended to start timer before PortMidi */
+ TIME_START;
+
+ /* open output device */
+ if (deviceno == Pm_CountDevices()) {
+ deviceno = Pm_CreateVirtualOutput("fast", NULL, DEVICE_INFO);
+ if (deviceno >= 0) {
+ err = Pm_OpenOutput(&midi, deviceno, DRIVER_INFO, buffer_size,
+ get_time, NULL, latency);
+ pause = TRUE;
+ }
+ } else if (err >= pmNoError) {
+ err = Pm_OpenOutput(&midi, deviceno, DRIVER_INFO, buffer_size,
+ get_time, NULL, latency);
+ }
+ if (err == pmHostError) {
+ Pm_GetHostErrorText(line, STRING_MAX);
+ printf("PortMidi found host error...\n %s\n", line);
+ goto done;
+ } else if (err < 0) {
+ printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err));
+ goto done;
+ }
+ printf("Midi Output opened with %ld ms latency.\n", (long) latency);
+ if (pause) {
+ printf("Pausing so you can connect a receiver to the newly created\n"
+ " \"fast\" port. Type ENTER to proceed: ");
+ while (getchar() != '\n') ;
+ }
+ /* wait a sec after printing previous line */
+ start = get_time(NULL) + 1000;
+ while (start > get_time(NULL)) {
+ Sleep(10);
+ }
+ printf("sending output...\n");
+ fflush(stdout); /* make sure message goes to console */
+
+ /* every 10ms send on/off pairs at timestamps set to current time */
+ now = get_time(NULL);
+ /* if expired_timestamps, we want to send timestamps that have
+ * expired. They should be sent immediately, but there's a suggestion
+ * that negative delay might cause problems in the ALSA implementation
+ * so this is something we can test using the -n flag.
+ */
+ if (expired_timestamps) {
+ now = now - 2 * latency;
+ }
+
+ while (((PmTimestamp) (now - start)) < duration * 1000 || pitch != 60) {
+ /* how many messages do we send? Total should be
+ * (elapsed * rate) / 1000
+ */
+ int send_total = (((PmTimestamp) ((now - start))) * msgrate) / 1000;
+ /* always send until pitch would be 60 so if we run again, the
+ next pitch (60) will be expected */
+ if (msgcnt < send_total) {
+ if ((msgcnt & 1) == 0) {
+ Pm_WriteShort(midi, now, Pm_Message(0x90, pitch, 100));
+ } else {
+ Pm_WriteShort(midi, now, Pm_Message(0x90, pitch, 0));
+ /* play 60, 61, 62, ... 71, then wrap back to 60, 61, ... */
+ pitch = (pitch - 59) % 12 + 60;
+ }
+ msgcnt += 1;
+ if (((PmTimestamp) (now - start)) >= printtime) {
+ printf("%d at %dms, polling count %d\n", msgcnt, now - start,
+ polling_count);
+ fflush(stdout); /* make sure message goes to console */
+ printtime += 1000; /* next msg in 1s */
+ }
+ }
+ now = get_time(NULL);
+ polling_count++;
+ }
+ /* close device (this not explicitly needed in most implementations) */
+ printf("ready to close and terminate... (type RETURN):");
+ while (getchar() != '\n') ;
+
+ Pm_Close(midi);
+ done:
+ Pm_Terminate();
+ printf("done closing and terminating...\n");
+}
+
+
+void show_usage()
+{
+ printf("Usage: fast [-h] [-l latency] [-r rate] [-d device] [-s dur] "
+ "[-n] [-p] [-m]\n"
+ ", where latency is in ms,\n"
+ " rate is messages per second,\n"
+ " device is the PortMidi device number,\n"
+ " dur is the length of the test in seconds,\n"
+ " -n means send timestamps in the past,\n"
+ " -p means use a large positive time offset,\n"
+ " -m means use a large negative time offset, and\n"
+ " -h means help.\n");
+}
+
+int main(int argc, char *argv[])
+{
+ int default_in;
+ int default_out;
+ char *deflt;
+ int i = 0;
+ int latency_valid = FALSE;
+ int rate_valid = FALSE;
+ int device_valid = FALSE;
+ int dur_valid = FALSE;
+
+ if (sizeof(void *) == 8)
+ printf("Apparently this is a 64-bit machine.\n");
+ else if (sizeof(void *) == 4)
+ printf ("Apparently this is a 32-bit machine.\n");
+
+ if (argc <= 1) {
+ show_usage();
+ } else {
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-h") == 0) {
+ show_usage();
+ } else if (strcmp(argv[i], "-l") == 0 && (i + 1 < argc)) {
+ i = i + 1;
+ latency = atoi(argv[i]);
+ printf("Latency will be %ld\n", (long) latency);
+ latency_valid = TRUE;
+ } else if (strcmp(argv[i], "-r") == 0) {
+ i = i + 1;
+ msgrate = atoi(argv[i]);
+ printf("Rate will be %d messages/second\n", msgrate);
+ rate_valid = TRUE;
+ } else if (strcmp(argv[i], "-d") == 0) {
+ i = i + 1;
+ deviceno = atoi(argv[i]);
+ printf("Device will be %d\n", deviceno);
+ } else if (strcmp(argv[i], "-s") == 0) {
+ i = i + 1;
+ duration = atoi(argv[i]);
+ printf("Duration will be %d seconds\n", duration);
+ dur_valid = TRUE;
+ } else if (strcmp(argv[i], "-n") == 0) {
+ printf("Sending expired timestamps (-n)\n");
+ expired_timestamps = TRUE;
+ } else if (strcmp(argv[i], "-p") == 0) {
+ printf("Time offset set to 2147473648 (-p)\n");
+ use_timeoffset = 2147473648;
+ } else if (strcmp(argv[i], "-m") == 0) {
+ printf("Time offset set to -10000 (-m)\n");
+ use_timeoffset = -10000;
+ } else {
+ show_usage();
+ }
+ }
+ }
+
+ if (!latency_valid) {
+ // coerce to known size
+ latency = (int32_t) get_number("Latency in ms: ");
+ }
+
+ if (!rate_valid) {
+ // coerce from "%d" to known size
+ msgrate = (int32_t) get_number("Rate in messages per second: ");
+ }
+
+ if (!dur_valid) {
+ duration = get_number("Duration in seconds: ");
+ }
+
+ /* list device information */
+ default_in = Pm_GetDefaultInputDeviceID();
+ default_out = Pm_GetDefaultOutputDeviceID();
+ for (i = 0; i < Pm_CountDevices(); i++) {
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (info->output) {
+ printf("%d: %s, %s", i, info->interf, info->name);
+ if (i == deviceno) {
+ device_valid = TRUE;
+ deflt = "selected ";
+ } else if (i == default_out) {
+ deflt = "default ";
+ } else {
+ deflt = "";
+ }
+ printf(" (%soutput)\n", deflt);
+ }
+ }
+ printf("%d: Create virtual port named \"fast\"", i);
+ if (i == deviceno) {
+ device_valid = TRUE;
+ deflt = "selected ";
+ } else {
+ deflt = "";
+ }
+ printf(" (%soutput)\n", deflt);
+
+ if (!device_valid) {
+ deviceno = get_number("Output device number: ");
+ }
+
+ fast_test();
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/fastrcv.c b/3rdparty/portmidi/pm_test/fastrcv.c
new file mode 100644
index 00000000000..daee40c5fa0
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/fastrcv.c
@@ -0,0 +1,255 @@
+/* fastrcv.c -- send many MIDI messages very fast.
+ *
+ * This is a stress test created to explore reports of
+ * pm_write() call blocking (forever) on Linux when
+ * sending very dense MIDI sequences.
+ *
+ * Modified 8 Aug 2017 with -n to send expired timestamps
+ * to test a theory about why Linux ALSA hangs in Audacity.
+ *
+ * Roger B. Dannenberg, Aug 2017
+ */
+
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define INPUT_BUFFER_SIZE 1000 /* big to avoid losing any input */
+#define DEVICE_INFO NULL
+#define DRIVER_INFO NULL
+#define TIME_PROC ((PmTimeProcPtr) Pt_Time)
+#define TIME_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+#define STRING_MAX 80 /* used for console input */
+// need to get declaration for Sleep()
+#ifdef WIN32
+#include "windows.h"
+#else
+#include <unistd.h>
+#define Sleep(n) usleep(n * 1000)
+#endif
+
+
+int deviceno = -9999;
+int verbose = FALSE;
+
+
+static void prompt_and_exit(void)
+{
+ printf("type ENTER...");
+ while (getchar() != '\n') ;
+ /* this will clean up open ports: */
+ exit(-1);
+}
+
+
+static PmError checkerror(PmError err)
+{
+ if (err == pmHostError) {
+ /* it seems pointless to allocate memory and copy the string,
+ * so I will do the work of Pm_GetHostErrorText directly
+ */
+ char errmsg[80];
+ Pm_GetHostErrorText(errmsg, 80);
+ printf("PortMidi found host error...\n %s\n", errmsg);
+ prompt_and_exit();
+ } else if (err < 0) {
+ printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err));
+ prompt_and_exit();
+ }
+ return err;
+}
+
+
+/* read a number from console */
+/**/
+int get_number(const char *prompt)
+{
+ int n = 0, i;
+ fputs(prompt, stdout);
+ while (n != 1) {
+ n = scanf("%d", &i);
+ while (getchar() != '\n') ;
+ }
+ return i;
+}
+
+
+void fastrcv_test()
+{
+ PmStream * midi;
+ PmError status, length;
+ PmEvent buffer[1];
+ PmTimestamp start;
+ /* every 10ms read all messages, keep counts */
+ /* every 1000ms, print report */
+ int msgcnt = 0;
+ /* expect repeating sequence of 60 through 71, alternating on/off */
+ int expected_pitch = 60;
+ int expected_on = TRUE;
+ int report_time;
+ PmTimestamp last_timestamp = -1;
+ PmTimestamp last_delta = -1;
+
+ /* It is recommended to start timer before PortMidi */
+ TIME_START;
+
+ /* open output device */
+ if (deviceno == Pm_CountDevices()) {
+ int id = Pm_CreateVirtualInput("fastrcv", NULL, DEVICE_INFO);
+ if (id < 0) checkerror(id); /* error reporting */
+ checkerror(Pm_OpenInput(&midi, id, DRIVER_INFO,
+ INPUT_BUFFER_SIZE, TIME_PROC, TIME_INFO));
+ } else {
+ Pm_OpenInput(&midi, deviceno, DRIVER_INFO, INPUT_BUFFER_SIZE,
+ TIME_PROC, TIME_INFO);
+ }
+ printf("Midi Input opened.\n");
+
+ /* wait a sec after printing previous line */
+ start = Pt_Time() + 1000;
+ while (start > Pt_Time()) {
+ Sleep(10);
+ }
+
+ report_time = Pt_Time() + 1000; /* report every 1s */
+ while (TRUE) {
+ PmTimestamp now = Pt_Time();
+ status = Pm_Poll(midi);
+ if (status == TRUE) {
+ length = Pm_Read(midi, buffer, 1);
+ if (length > 0) {
+ int status = Pm_MessageStatus(buffer[0].message);
+ if (status == 0x80) { /* convert NoteOff to NoteOn, vel=0 */
+ status = 0x90;
+ buffer[0].message = Pm_Message(status,
+ Pm_MessageData1(buffer[0].message), 0);
+ }
+ /* only listen to NOTEON messages */
+ if (status == 0x90) {
+ int pitch = Pm_MessageData1(buffer[0].message);
+ int vel = Pm_MessageData2(buffer[0].message);
+ int is_on = (vel > 0);
+ if (verbose) {
+ printf("Note pitch %d vel %d\n", pitch, vel);
+ }
+ msgcnt++;
+ if (pitch != expected_pitch || expected_on != is_on) {
+ printf("Unexpected note-on: pitch %d vel %d, "
+ "expected: pitch %d Note%s\n", pitch, vel,
+ expected_pitch, (expected_on ? "On" : "Off"));
+ }
+ if (is_on) {
+ expected_on = FALSE;
+ expected_pitch = pitch;
+ } else {
+ expected_on = TRUE;
+ expected_pitch = (pitch + 1) % 72;
+ if (expected_pitch < 60) expected_pitch = 60;
+ }
+ if (last_timestamp >= 0) {
+ last_delta = buffer[0].timestamp - last_timestamp;
+ }
+ last_timestamp = buffer[0].timestamp;
+ }
+ }
+ }
+ if (now >= report_time) {
+ printf("%d msgs/sec", msgcnt);
+ /* if available, print the last timestamp and last delta time */
+ if (last_timestamp >= 0) {
+ printf(" last timestamp %d", (int) last_timestamp);
+ last_timestamp = -1;
+ }
+ if (last_delta >= 0) {
+ printf(" last delta time %d", (int) last_delta);
+ last_delta = -1;
+ }
+ printf("\n");
+ report_time += 1000;
+ msgcnt = 0;
+ }
+ }
+}
+
+
+void show_usage()
+{
+ printf("Usage: fastrcv [-h] [-v] [-d device], where\n"
+ "device is the PortMidi device number,\n"
+ "-h means help,\n"
+ "-v means verbose (print messages)\n");
+}
+
+int main(int argc, char *argv[])
+{
+ int default_in;
+ int default_out;
+ char *deflt;
+
+ int i = 0, n = 0;
+ int test_input = 0, test_output = 0, test_both = 0, somethingStupid = 0;
+ int stream_test = 0;
+ int device_valid = FALSE;
+
+ if (sizeof(void *) == 8)
+ printf("Apparently this is a 64-bit machine.\n");
+ else if (sizeof(void *) == 4)
+ printf ("Apparently this is a 32-bit machine.\n");
+
+ if (argc <= 1) {
+ show_usage();
+ } else {
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-h") == 0) {
+ show_usage();
+ } else if (strcmp(argv[i], "-v") == 0) {
+ verbose = TRUE;
+ } else if (strcmp(argv[i], "-d") == 0) {
+ i = i + 1;
+ deviceno = atoi(argv[i]);
+ printf("Device will be %d\n", deviceno);
+ } else {
+ show_usage();
+ }
+ }
+ }
+
+ /* list device information */
+ default_in = Pm_GetDefaultInputDeviceID();
+ default_out = Pm_GetDefaultOutputDeviceID();
+ for (i = 0; i < Pm_CountDevices(); i++) {
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (!info->output) {
+ printf("%d: %s, %s", i, info->interf, info->name);
+ if (i == deviceno) {
+ device_valid = TRUE;
+ deflt = "selected ";
+ } else if (i == default_out) {
+ deflt = "default ";
+ } else {
+ deflt = "";
+ }
+ printf(" (%sinput)\n", deflt);
+ }
+ }
+ printf("%d: Create virtual port named \"fastrcv\"", i);
+ if (i == deviceno) {
+ device_valid = TRUE;
+ deflt = "selected ";
+ } else {
+ deflt = "";
+ }
+ printf(" (%sinput)\n", deflt);
+
+ if (!device_valid) {
+ deviceno = get_number("Input device number: ");
+ }
+
+ fastrcv_test();
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/latency.c b/3rdparty/portmidi/pm_test/latency.c
index bfcdc0ca0a3..fe355511c1e 100644
--- a/3rdparty/portmidi/pm_test/latency.c
+++ b/3rdparty/portmidi/pm_test/latency.c
@@ -87,7 +87,7 @@ CHANGE LOG
#define min(a, b) ((a) <= (b) ? (a) : (b))
#endif
-int get_number(char *prompt);
+int get_number(const char *prompt);
PtTimestamp previous_callback_time = 0;
@@ -116,7 +116,7 @@ void pt_callback(PtTimestamp timestamp, void *userData)
/* send a note on/off if user requested it */
if (test_out && (iteration % output_period == 0)) {
PmEvent buffer[1];
- buffer[0].timestamp = Pt_Time(NULL);
+ buffer[0].timestamp = Pt_Time();
if (note_on) {
/* note off */
buffer[0].message = Pm_Message(0x90, 60, 0);
@@ -157,7 +157,6 @@ void pt_callback(PtTimestamp timestamp, void *userData)
int main()
{
- char line[STRING_MAX];
int i;
int len;
int choice;
@@ -231,17 +230,17 @@ int main()
}
}
- printf("%s%s", "Latency measurements will start in 5 seconds. ",
- "Type return to stop: ");
+ printf("Latency measurements will start in 5 seconds. "
+ "Type return to stop: ");
Pt_Start(period, &pt_callback, 0);
- fgets(line, STRING_MAX, stdin);
+ while (getchar() != '\n') ;
stop = Pt_Time();
Pt_Stop();
/* courteously turn off the last note, if necessary */
if (note_on) {
PmEvent buffer[1];
- buffer[0].timestamp = Pt_Time(NULL);
+ buffer[0].timestamp = Pt_Time();
buffer[0].message = Pm_Message(0x90, 60, 0);
Pm_Write(out, buffer, 1);
}
@@ -260,7 +259,7 @@ int main()
printf("\nNote that due to rounding, actual latency can be 1ms higher\n");
printf("than the numbers reported here.\n");
printf("Type return to exit...");
- fgets(line, STRING_MAX, stdin);
+ while (getchar() != '\n') ;
if(choice == 2)
Pm_Close(in);
@@ -276,15 +275,13 @@ int main()
/* read a number from console */
-int get_number(char *prompt)
-{
- char line[STRING_MAX];
+int get_number(const char *prompt)
+{
int n = 0, i;
- printf(prompt);
+ fputs(prompt, stdout);
while (n != 1) {
n = scanf("%d", &i);
- fgets(line, STRING_MAX, stdin);
-
+ while (getchar() != '\n') ;
}
return i;
}
diff --git a/3rdparty/portmidi/pm_test/latency.vcproj b/3rdparty/portmidi/pm_test/latency.vcproj
deleted file mode 100644
index 9a79300abdc..00000000000
--- a/3rdparty/portmidi/pm_test/latency.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="latency"
- ProjectGUID="{41D78CBF-B04B-4561-BA4A-AC238C40633D}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="latency.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/latency.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\latency.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/latency.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\latency.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="latency.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/latency.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\latency.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/latency.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\latency.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\latency.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/midiclock.c b/3rdparty/portmidi/pm_test/midiclock.c
index 60fcf7a9aad..f0a68974a1c 100644
--- a/3rdparty/portmidi/pm_test/midiclock.c
+++ b/3rdparty/portmidi/pm_test/midiclock.c
@@ -24,7 +24,7 @@ typedef int boolean;
#define OUTPUT_BUFFER_SIZE 0
#define DRIVER_INFO NULL
-#define TIME_PROC ((int32_t (*)(void *)) Pt_Time)
+#define TIME_PROC ((PmTimeProcPtr) Pt_Time)
#define TIME_INFO NULL
#define LATENCY 0
#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
@@ -163,15 +163,13 @@ void timer_poll(PtTimestamp timestamp, void *userData)
/* read a number from console */
/**/
-int get_number(char *prompt)
+int get_number(const char *prompt)
{
- char line[STRING_MAX];
int n = 0, i;
- printf(prompt);
+ fputs(prompt, stdout);
while (n != 1) {
n = scanf("%d", &i);
- fgets(line, STRING_MAX, stdin);
-
+ while (getchar() != '\n') ;
}
return i;
}
@@ -236,7 +234,6 @@ private void doascii(char c)
*/
int main(int argc, char **argv)
{
- char s[STRING_MAX]; /* console input */
int outp;
PmError err;
int i;
@@ -256,22 +253,20 @@ int main(int argc, char **argv)
err = Pm_OpenOutput(&midi, outp, DRIVER_INFO, OUTPUT_BUFFER_SIZE,
TIME_PROC, TIME_INFO, LATENCY);
if (err) {
- printf(Pm_GetErrorText(err));
+ puts(Pm_GetErrorText(err));
goto error_exit_no_device;
}
active = true;
- printf("Type RETURN to start MIDI CLOCK:\n");
- if (!fgets(s, STRING_MAX, stdin)) goto error_exit;
+ printf("Type ENTER to start MIDI CLOCK:\n");
+ while (getchar() != '\n') ;
send_start_stop = true; /* send START and then CLOCKs */
while (!done) {
- if (fgets(s, STRING_MAX, stdin)) {
- doascii(s[0]);
- }
+ doascii(getchar());
+ while (getchar() != '\n') ;
}
- error_exit:
active = false;
Pt_Sleep(2); /* this is to allow callback to complete -- it's
real time, so it's either ok and it runs on
diff --git a/3rdparty/portmidi/pm_test/midiclock.vcproj b/3rdparty/portmidi/pm_test/midiclock.vcproj
deleted file mode 100644
index 2c9cf02e9c5..00000000000
--- a/3rdparty/portmidi/pm_test/midiclock.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="midiclock"
- ProjectGUID="{9B448D22-EC7E-4BD8-A552-B268D843CC3C}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="midiclock.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/midiclock.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\midiclock.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/midiclock.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\midiclock.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="midiclock.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/midiclock.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\midiclock.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/midiclock.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\midiclock.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\midiclock.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/midithread.c b/3rdparty/portmidi/pm_test/midithread.c
index fab9794f2da..ea0613bc5eb 100644
--- a/3rdparty/portmidi/pm_test/midithread.c
+++ b/3rdparty/portmidi/pm_test/midithread.c
@@ -164,22 +164,36 @@ void process_midi(PtTimestamp timestamp, void *userData)
void exit_with_message(char *msg)
{
- char line[STRING_MAX];
printf("%s\n", msg);
- fgets(line, STRING_MAX, stdin);
+ while (getchar() != '\n') ;
exit(1);
}
-int main()
+int main(int argc, char *argv[])
{
- int id;
int32_t n;
const PmDeviceInfo *info;
char line[STRING_MAX];
int spin;
int done = FALSE;
-
- /* determine what type of test to run */
+ int i;
+ int input = -1, output = -1;
+
+ printf("Usage: midithread [-i input] [-o output]\n"
+ "where input and output are portmidi device numbers\n");
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-i") == 0) {
+ i++;
+ input = atoi(argv[i]);
+ printf("Input device number: %d\n", input);
+ } else if (strcmp(argv[i], "-o") == 0) {
+ i++;
+ output = atoi(argv[i]);
+ printf("Output device number: %d\n", output);
+ } else {
+ return -1;
+ }
+ }
printf("begin PortMidi multithread test...\n");
/* note that it is safe to call PortMidi from the main thread for
@@ -221,32 +235,32 @@ int main()
Pm_Initialize();
- id = Pm_GetDefaultOutputDeviceID();
- info = Pm_GetDeviceInfo(id);
+ output = (output < 0 ? Pm_GetDefaultOutputDeviceID() : output);
+ info = Pm_GetDeviceInfo(output);
if (info == NULL) {
- printf("Could not open default output device (%d).", id);
+ printf("Could not open output device (%d).", output);
exit_with_message("");
}
printf("Opening output device %s %s\n", info->interf, info->name);
/* use zero latency because we want output to be immediate */
- Pm_OpenOutput(&midi_out,
- id,
+ Pm_OpenOutput(&midi_out,
+ output,
DRIVER_INFO,
OUTPUT_BUFFER_SIZE,
TIME_PROC,
TIME_INFO,
LATENCY);
- id = Pm_GetDefaultInputDeviceID();
- info = Pm_GetDeviceInfo(id);
+ input = (input < 0 ? Pm_GetDefaultInputDeviceID() : input);
+ info = Pm_GetDeviceInfo(input);
if (info == NULL) {
- printf("Could not open default input device (%d).", id);
+ printf("Could not open default input device (%d).", input);
exit_with_message("");
}
printf("Opening input device %s %s\n", info->interf, info->name);
Pm_OpenInput(&midi_in,
- id,
+ input,
DRIVER_INFO,
INPUT_BUFFER_SIZE,
TIME_PROC,
@@ -257,18 +271,17 @@ int main()
this simple assignment is safe */
printf("Enter midi input; it will be transformed as specified by...\n");
- printf("%s\n%s\n%s\n",
- "Type 'q' to quit, 'm' to monitor next pitch, t to toggle thru or",
- "type a number to specify transposition.",
- "Must terminate with [ENTER]");
+ printf("Type 'q' to quit, 'm' to monitor next pitch, t to toggle thru or\n"
+ "type a number to specify transposition.\n"
+ "Must terminate with [ENTER]\n");
while (!done) {
int32_t msg;
int input;
int len;
- fgets(line, STRING_MAX, stdin);
+ if (!fgets(line, STRING_MAX, stdin)) break; /* no stdin? */
/* remove the newline: */
- len = strlen(line);
+ len = (int) strlen(line);
if (len > 0) line[len - 1] = 0; /* overwrite the newline char */
if (strcmp(line, "q") == 0) {
msg = QUIT_MSG;
@@ -323,7 +336,8 @@ int main()
Pm_Close(midi_in);
Pm_Close(midi_out);
- printf("finished portMidi multithread test...enter any character to quit [RETURN]...");
- fgets(line, STRING_MAX, stdin);
+ fputs("finished portMidi multithread test.\n"
+ "type ENTER to quit:", stdout);
+ while (getchar() != '\n') ;
return 0;
}
diff --git a/3rdparty/portmidi/pm_test/midithread.vcproj b/3rdparty/portmidi/pm_test/midithread.vcproj
deleted file mode 100644
index 83c82a7bec0..00000000000
--- a/3rdparty/portmidi/pm_test/midithread.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="midithread"
- ProjectGUID="{EED7440D-04E3-4948-92DB-C85B4ADB1D82}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="midithread.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/midithread.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\midithread.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/midithread.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\midithread.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="midithread.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/midithread.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\midithread.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/midithread.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\midithread.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\midithread.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/midithru.c b/3rdparty/portmidi/pm_test/midithru.c
index 8ad723138e4..a9df5ccf5e6 100644
--- a/3rdparty/portmidi/pm_test/midithru.c
+++ b/3rdparty/portmidi/pm_test/midithru.c
@@ -1,18 +1,21 @@
/* midithru.c -- example program implementing background thru processing */
-/* suppose you want low-latency midi-thru processing, but your application
- wants to take advantage of the input buffer and timestamped data so that
- it does not have to operate with very low latency.
-
- This program illustrates how to use a timer callback from PortTime to
- implement a low-latency process that handles midi thru, including correctly
- merging midi data from the application with midi data from the input port.
-
- The main application, which runs in the main program thread, will use an
- interface similar to that of PortMidi, but since PortMidi does not allow
- concurrent threads to share access to a stream, the application will
- call private methods that transfer MIDI messages to and from the timer
- thread. All PortMidi API calls are made from the timer thread.
+/* suppose you want low-latency midi-thru processing, but your
+ application wants to take advantage of the input buffer and
+ timestamped data so that it does not have to operate with very low
+ latency.
+
+ This program illustrates how to use a timer callback from PortTime
+ to implement a low-latency process that handles midi thru,
+ including correctly merging midi data from the application with
+ midi data from the input port.
+
+ The main application, which runs in the main program thread, will
+ use an interface similar to that of PortMidi, but since PortMidi
+ does not allow concurrent threads to share access to a stream, the
+ application will call private methods that transfer MIDI messages
+ to and from the timer thread using lock-free queues. All PortMidi
+ API calls are made from the timer thread.
*/
/* DESIGN
@@ -78,11 +81,14 @@ global variable current_timestamp.
#define MIDI_SYSEX 0xf0
#define MIDI_EOX 0xf7
+#define STRING_MAX 80 /* used for console input */
-/* active is set true when midi processing should start */
+/* active is set true when midi processing should start, must be
+ * volatile to force thread to check for updates by other thread */
int active = FALSE;
-/* process_midi_exit_flag is set when the timer thread shuts down */
-int process_midi_exit_flag;
+/* process_midi_exit_flag is set when the timer thread shuts down;
+ * must be volatile so it is re-read in the while loop that waits on it */
+volatile int process_midi_exit_flag;
PmStream *midi_in;
PmStream *midi_out;
@@ -92,12 +98,43 @@ PmStream *midi_out;
#define OUT_QUEUE_SIZE 1024
PmQueue *in_queue;
PmQueue *out_queue;
-PmTimestamp current_timestamp = 0;
+/* this is volatile because it is set in the process_midi callback and
+ * the main thread reads it to sense elapsed time. Without volatile, the
+ * optimizer can put it in a register and not see the updates.
+ */
+volatile PmTimestamp current_timestamp = 0;
int thru_sysex_in_progress = FALSE;
int app_sysex_in_progress = FALSE;
PmTimestamp last_timestamp = 0;
+static void prompt_and_exit(void)
+{
+ printf("type ENTER...");
+ while (getchar() != '\n') ;
+ /* this will clean up open ports: */
+ exit(-1);
+}
+
+
+static PmError checkerror(PmError err)
+{
+ if (err == pmHostError) {
+ /* it seems pointless to allocate memory and copy the string,
+ * so I will do the work of Pm_GetHostErrorText directly
+ */
+ char errmsg[80];
+ Pm_GetHostErrorText(errmsg, 80);
+ printf("PortMidi found host error...\n %s\n", errmsg);
+ prompt_and_exit();
+ } else if (err < 0) {
+ printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err));
+ prompt_and_exit();
+ }
+ return err;
+}
+
+
/* time proc parameter for Pm_MidiOpen */
PmTimestamp midithru_time_proc(void *info)
{
@@ -117,8 +154,6 @@ void process_midi(PtTimestamp timestamp, void *userData)
PmEvent buffer; /* just one message at a time */
current_timestamp++; /* update every millisecond */
- /* if (current_timestamp % 1000 == 0)
- printf("time %d\n", current_timestamp); */
/* do nothing until initialization completes */
if (!active) {
@@ -222,14 +257,13 @@ void process_midi(PtTimestamp timestamp, void *userData)
void exit_with_message(char *msg)
{
#define STRING_MAX 80
- char line[STRING_MAX];
printf("%s\nType ENTER...", msg);
- fgets(line, STRING_MAX, stdin);
+ while (getchar() != '\n') ;
exit(1);
}
-void initialize()
+void initialize(int input, int output, int virtual)
/* set up midi processing thread and open midi streams */
{
/* note that it is safe to call PortMidi from the main thread for
@@ -246,7 +280,6 @@ void initialize()
*/
const PmDeviceInfo *info;
- int id;
/* make the message queues */
in_queue = Pm_QueueCreate(IN_QUEUE_SIZE, sizeof(PmEvent));
@@ -260,36 +293,63 @@ void initialize()
Pm_Initialize();
- id = Pm_GetDefaultOutputDeviceID();
- info = Pm_GetDeviceInfo(id);
- if (info == NULL) {
- printf("Could not open default output device (%d).", id);
- exit_with_message("");
+ if (output < 0) {
+ if (!virtual) {
+ output = Pm_GetDefaultOutputDeviceID();
+ }
}
- printf("Opening output device %s %s\n", info->interf, info->name);
-
- /* use zero latency because we want output to be immediate */
- Pm_OpenOutput(&midi_out,
- id,
- NULL /* driver info */,
- OUT_QUEUE_SIZE,
- &midithru_time_proc,
- NULL /* time info */,
- 0 /* Latency */);
-
- id = Pm_GetDefaultInputDeviceID();
- info = Pm_GetDeviceInfo(id);
- if (info == NULL) {
- printf("Could not open default input device (%d).", id);
- exit_with_message("");
+ if (output >= 0) {
+ info = Pm_GetDeviceInfo(output);
+ if (info == NULL) {
+ printf("Could not open default output device (%d).", output);
+ exit_with_message("");
+ }
+
+ printf("Opening output device %s %s\n", info->interf, info->name);
+
+ /* use zero latency because we want output to be immediate */
+ Pm_OpenOutput(&midi_out,
+ output,
+ NULL /* driver info */,
+ OUT_QUEUE_SIZE,
+ &midithru_time_proc,
+ NULL /* time info */,
+ 0 /* Latency */);
+ } else { /* send to virtual port */
+ int id;
+ printf("Opening virtual output device \"midithru\"\n");
+ id = Pm_CreateVirtualOutput("midithru", NULL, NULL);
+ if (id < 0) checkerror(id); /* error reporting */
+ checkerror(Pm_OpenOutput(&midi_out, id, NULL, OUT_QUEUE_SIZE,
+ &midithru_time_proc, NULL, 0));
+ }
+ if (input < 0) {
+ if (!virtual) {
+ input = Pm_GetDefaultInputDeviceID();
+ }
+ }
+ if (input >= 0) {
+ info = Pm_GetDeviceInfo(input);
+ if (info == NULL) {
+ printf("Could not open default input device (%d).", input);
+ exit_with_message("");
+ }
+
+ printf("Opening input device %s %s\n", info->interf, info->name);
+ Pm_OpenInput(&midi_in,
+ input,
+ NULL /* driver info */,
+ 0 /* use default input size */,
+ &midithru_time_proc,
+ NULL /* time info */);
+ } else { /* receive from virtual port */
+ int id;
+ printf("Opening virtual input device \"midithru\"\n");
+ id = Pm_CreateVirtualInput("midithru", NULL, NULL);
+ if (id < 0) checkerror(id); /* error reporting */
+ checkerror(Pm_OpenInput(&midi_in, id, NULL, 0,
+ &midithru_time_proc, NULL));
}
- printf("Opening input device %s %s\n", info->interf, info->name);
- Pm_OpenInput(&midi_in,
- id,
- NULL /* driver info */,
- 0 /* use default input size */,
- &midithru_time_proc,
- NULL /* time info */);
/* Note: if you set a filter here, then this will filter what goes
to the MIDI THRU port. You may not want to do this.
*/
@@ -330,15 +390,42 @@ int main(int argc, char *argv[])
{
PmTimestamp last_time = 0;
PmEvent buffer;
-
- /* determine what type of test to run */
+ int i;
+ int input = -1, output = -1;
+ int virtual = FALSE;
+ int delay_enable = TRUE;
+
+ printf("Usage: midithru [-i input] [-o output] [-v] [-n]\n"
+ "where input and output are portmidi device numbers\n"
+ "if -v and input and/or output are not specified,\n"
+ "then virtual ports are created and used instead.\n"
+ "-n turns off the default MIDI delay effect.\n");
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-i") == 0) {
+ i++;
+ input = atoi(argv[i]);
+ printf("Input device number: %d\n", input);
+ } else if (strcmp(argv[i], "-o") == 0) {
+ i++;
+ output = atoi(argv[i]);
+ printf("Output device number: %d\n", output);
+ } else if (strcmp(argv[i], "-v") == 0) {
+ virtual = TRUE;
+ } else if (strcmp(argv[i], "-n") == 0) {
+ delay_enable = FALSE;
+ printf("delay_effect is disabled\n");
+ } else {
+ return -1;
+ }
+ }
printf("begin PortMidi midithru program...\n");
- initialize(); /* set up and start midi processing */
+ initialize(input, output, virtual); /* set up and start midi processing */
- printf("%s\n%s\n",
- "This program will run for 60 seconds, or until you play middle C,",
- "echoing all input with a 2 second delay.");
+ printf("This program will run for 60 seconds, "
+ "or until you play B below middle C,\n"
+ "All input is sent immediately, implementing software MIDI THRU.\n"
+ "Also, all input is echoed with a 2 second delay.\n");
while (current_timestamp < 60000) {
/* just to make the point that this is not a low-latency process,
@@ -350,11 +437,13 @@ int main(int argc, char *argv[])
while (Pm_Dequeue(in_queue, &buffer) == 1) {
/* printf("timestamp %d\n", buffer.timestamp); */
/* printf("message %x\n", buffer.message); */
- buffer.timestamp = buffer.timestamp + 2000; /* delay */
- Pm_Enqueue(out_queue, &buffer);
- /* play middle C to break out of loop */
+ if (delay_enable) {
+ buffer.timestamp = buffer.timestamp + 2000; /* delay */
+ Pm_Enqueue(out_queue, &buffer);
+ }
+ /* play B3 to break out of loop */
if (Pm_MessageStatus(buffer.message) == 0x90 &&
- Pm_MessageData1(buffer.message) == 60) {
+ Pm_MessageData1(buffer.message) == 59) {
goto quit_now;
}
}
diff --git a/3rdparty/portmidi/pm_test/midithru.vcproj b/3rdparty/portmidi/pm_test/midithru.vcproj
deleted file mode 100644
index cf6dfdffe6c..00000000000
--- a/3rdparty/portmidi/pm_test/midithru.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="midithru"
- ProjectGUID="{80193DD1-2C02-4A4C-BDF8-49623AD6F556}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="midithru.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/midithru.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\midithru.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/midithru.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\midithru.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="midithru.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/midithru.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\midithru.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/midithru.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\midithru.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\midithru.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/mm.c b/3rdparty/portmidi/pm_test/mm.c
index 0f2a52ee267..8fe5358b591 100644
--- a/3rdparty/portmidi/pm_test/mm.c
+++ b/3rdparty/portmidi/pm_test/mm.c
@@ -110,20 +110,18 @@ private void showhelp();
private void showbytes(PmMessage data, int len, boolean newline);
private void showstatus(boolean flag);
private void doascii(char c);
-private int get_number(char *prompt);
+private int get_number(const char *prompt);
/* read a number from console */
/**/
-int get_number(char *prompt)
+int get_number(const char *prompt)
{
- char line[STRING_MAX];
int n = 0, i;
- printf(prompt);
+ fputs(prompt, stdout);
while (n != 1) {
n = scanf("%d", &i);
- fgets(line, STRING_MAX, stdin);
-
+ while (getchar() != '\n') ;
}
return i;
}
@@ -136,7 +134,7 @@ void receive_poll(PtTimestamp timestamp, void *userData)
if (!active) return;
while ((count = Pm_Read(midi_in, &event, 1))) {
if (count == 1) output(event.message);
- else printf(Pm_GetErrorText(count));
+ else puts(Pm_GetErrorText(count));
}
}
@@ -160,7 +158,7 @@ int main(int argc, char **argv)
/* use porttime callback to empty midi queue and print */
Pt_Start(1, receive_poll, 0);
/* list device information */
- printf("MIDI input devices:\n");
+ puts("MIDI input devices:");
for (i = 0; i < Pm_CountDevices(); i++) {
const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
if (info->input) printf("%d: %s, %s\n", i, info->interf, info->name);
@@ -168,7 +166,7 @@ int main(int argc, char **argv)
inp = get_number("Type input device number: ");
err = Pm_OpenInput(&midi_in, inp, NULL, 512, NULL, NULL);
if (err) {
- printf(Pm_GetErrorText(err));
+ puts(Pm_GetErrorText(err));
Pt_Stop();
mmexit(1);
}
@@ -177,10 +175,8 @@ int main(int argc, char **argv)
printf("Midi Monitor ready.\n");
active = true;
while (!done) {
- char s[100];
- if (fgets(s, 100, stdin)) {
- doascii(s[0]);
- }
+ doascii(getchar());
+ while (getchar() != '\n') ;
}
active = false;
Pm_Close(midi_in);
@@ -484,8 +480,8 @@ private int put_pitch(int p)
"gs", "a", "bf", "b" };
/* note octave correction below */
sprintf(result, "%s%d", ptos[p % 12], (p / 12) - 1);
- printf(result);
- return strlen(result);
+ fputs(result, stdout);
+ return (int) strlen(result);
}
@@ -534,7 +530,8 @@ private void showhelp()
printf(" ------------- ----- ------------- -----\n");
printf(" Channels 1 - 16 Programs 1 - 128\n");
printf(" Controllers 0 - 127 After Touch 0 - 127\n");
- printf(" Loudness 0 - 127 Pitch Bend 0 - 16383, center = 8192\n");
+ printf(" Loudness 0 - 127 Pitch Bend 0 - 16383, "
+ "center = 8192\n");
printf(" Pitches 0 - 127, 60 = c4 = middle C\n");
printf(" \n");
printf("n toggles notes");
@@ -568,5 +565,5 @@ private void showhelp()
private void showstatus(boolean flag)
{
- printf(", now %s\n", flag ? "ON" : "OFF" );
+ printf(", now %s\n", flag ? "ON" : "OFF");
}
diff --git a/3rdparty/portmidi/pm_test/mm.vcproj b/3rdparty/portmidi/pm_test/mm.vcproj
deleted file mode 100644
index 78baa9f95ad..00000000000
--- a/3rdparty/portmidi/pm_test/mm.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="mm"
- ProjectGUID="{EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="mm.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/mm.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\mm.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/mm.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\mm.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="mm.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/mm.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\mm.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/mm.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\mm.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\mm.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/multivirtual.c b/3rdparty/portmidi/pm_test/multivirtual.c
new file mode 100644
index 00000000000..059bc50e4f9
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/multivirtual.c
@@ -0,0 +1,224 @@
+/* multivirtual.c -- test for creating two input and two output virtual ports */
+/*
+ * Roger B. Dannenberg
+ * Oct 2021
+ */
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define OUTPUT_BUFFER_SIZE 0
+#define DEVICE_INFO NULL
+#define DRIVER_INFO NULL
+#define TIME_PROC ((PmTimeProcPtr) Pt_Time)
+#define TIME_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+int latency = 0;
+
+static void prompt_and_exit(void)
+{
+ printf("type ENTER...");
+ while (getchar() != '\n') ;
+ /* this will clean up open ports: */
+ exit(-1);
+}
+
+
+static PmError checkerror(PmError err)
+{
+ if (err == pmHostError) {
+ /* it seems pointless to allocate memory and copy the string,
+ * so I will do the work of Pm_GetHostErrorText directly
+ */
+ char errmsg[80];
+ Pm_GetHostErrorText(errmsg, 80);
+ printf("PortMidi found host error...\n %s\n", errmsg);
+ prompt_and_exit();
+ } else if (err < 0) {
+ printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err));
+ prompt_and_exit();
+ }
+ return err;
+}
+
+static int msg_count[2] = {0, 0};
+
+void poll_input(PmStream *in, int which)
+{
+ PmEvent buffer[1];
+ int pitch, expected, length;
+ PmError status = Pm_Poll(in);
+ if (status == TRUE) {
+ length = Pm_Read(in, buffer, 1);
+ if (length > 0) {
+ printf("Got message %d from portmidi%d: "
+ "time %ld, %2x %2x %2x\n",
+ msg_count[which], which + 1, (long) buffer[0].timestamp,
+ (status = Pm_MessageStatus(buffer[0].message)),
+ (pitch = Pm_MessageData1(buffer[0].message)),
+ Pm_MessageData2(buffer[0].message));
+ if (status == 0x90) { /* 1 & 2 are on/off 60, 3 & 4 are 61, etc. */
+ expected = (((msg_count[which] - 1) / 2) % 12) + 60 +
+ which * 12;
+ if (pitch != expected) {
+ printf("WARNING: expected pitch %d, got pitch %d\n",
+ expected, pitch);
+ }
+ }
+ msg_count[which]++;
+ } else {
+ assert(0);
+ }
+ }
+}
+
+
+void wait_until(PmTimestamp when, PmStream *in1, PmStream *in2)
+{
+ while (when > Pt_Time()) {
+ poll_input(in1, 0);
+ poll_input(in2, 1);
+ Pt_Sleep(10);
+ }
+}
+
+
+/* create one virtual output device and one input device */
+void init(const char *name, PmStream **midi_out, PmStream **midi_in,
+ int *id_out, int *id_in)
+{
+ PmEvent buffer[1];
+
+ *id_out = checkerror(Pm_CreateVirtualOutput(name, NULL, DEVICE_INFO));
+ checkerror(Pm_OpenOutput(midi_out, *id_out, DRIVER_INFO, OUTPUT_BUFFER_SIZE,
+ TIME_PROC, TIME_INFO, latency));
+ printf("Virtual Output \"%s\" id %d created and opened.\n", name, *id_out);
+
+ *id_in = checkerror(Pm_CreateVirtualInput(name, NULL, DRIVER_INFO));
+ checkerror(Pm_OpenInput(midi_in, *id_in, NULL, 0, NULL, NULL));
+ printf("Virtual Input \"%s\" id %d created and opened.\n", name, *id_in);
+ Pm_SetFilter(*midi_in, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX);
+ /* empty the buffer after setting filter, just in case anything
+ got through */
+ while (Pm_Read(*midi_in, buffer, 1)) ;
+}
+
+
+void main_test(int num)
+{
+ PmStream *midi1_out;
+ PmStream *midi2_out;
+ PmStream *midi1_in;
+ PmStream *midi2_in;
+ int id1_out;
+ int id2_out;
+ int id1_in;
+ int id2_in;
+ int32_t next_time;
+ PmEvent buffer[1];
+ PmTimestamp timestamp;
+ int pitch = 60;
+ int expected_count = num + 1; /* add 1 for MIDI Program message */
+
+ /* It is recommended to start timer before Midi; otherwise, PortMidi may
+ start the timer with its (default) parameters
+ */
+ TIME_START;
+
+ init("portmidi1", &midi1_out, &midi1_in, &id1_out, &id1_in);
+ init("portmidi2", &midi2_out, &midi2_in, &id2_out, &id2_in);
+
+ printf("Type ENTER to send messages: ");
+ while (getchar() != '\n') ;
+
+ buffer[0].timestamp = Pt_Time();
+#define PROGRAM 0
+ buffer[0].message = Pm_Message(0xC0, PROGRAM, 0);
+ Pm_Write(midi1_out, buffer, 1);
+ Pm_Write(midi2_out, buffer, 1);
+ next_time = Pt_Time() + 1000; /* wait 1s */
+ while (num > 0) {
+ wait_until(next_time, midi1_in, midi2_in);
+ Pm_WriteShort(midi1_out, next_time, Pm_Message(0x90, pitch, 100));
+ Pm_WriteShort(midi2_out, next_time, Pm_Message(0x90, pitch + 12, 100));
+ printf("Note On pitch %d\n", pitch);
+ num--;
+ next_time += 500;
+
+ wait_until(next_time, midi1_in, midi2_in);
+ Pm_WriteShort(midi1_out, next_time, Pm_Message(0x90, pitch, 0));
+ Pm_WriteShort(midi2_out, next_time, Pm_Message(0x90, pitch + 12, 0));
+ printf("Note Off pitch %d\n", pitch);
+ num--;
+ pitch = (pitch + 1) % 12 + 60;
+ next_time += 500;
+ }
+ wait_until(next_time, midi1_in, midi2_in); /* get final note-offs */
+
+ printf("Got %d messages from portmidi1 and %d from portmidi2; "
+ "expected %d.\n", msg_count[0], msg_count[1], expected_count);
+
+ /* close devices (this not explicitly needed in most implementations) */
+ printf("ready to close...");
+ checkerror(Pm_Close(midi1_out));
+ checkerror(Pm_Close(midi2_out));
+ checkerror(Pm_Close(midi1_in));
+ checkerror(Pm_Close(midi2_in));
+ printf("done closing.\nNow delete the virtual devices...");
+ checkerror(Pm_DeleteVirtualDevice(id1_out));
+ checkerror(Pm_DeleteVirtualDevice(id1_in));
+ checkerror(Pm_DeleteVirtualDevice(id2_out));
+ checkerror(Pm_DeleteVirtualDevice(id2_in));
+ printf("done deleting.\n");
+}
+
+
+void show_usage()
+{
+ printf("Usage: multivirtual [-h] [-l latency-in-ms] [n]\n"
+ " -h for this message,\n"
+ " -l ms designates latency for precise timing (default 0),\n"
+ " n is number of message to send each output, not counting\n"
+ " initial program change.\n"
+ "sends change program to 1, then one note per second with 0.5s on,\n"
+ "0.5s off, for n/2 seconds to both output ports portmidi1 and\n"
+ "portmidi2. portmidi1 gets pitches from C4 (60). portmidi2 gets\n"
+ "pitches an octave higher. Latency >0 uses the device driver for \n"
+ "precise timing (see PortMidi documentation). Inputs print what\n"
+ "they get and print WARNING if they get something unexpected.\n"
+ "The expected test is use two instances of testio to loop\n"
+ "portmidi1 back to portmidi1 and portmidi2 back to portmidi2.\n");
+ exit(0);
+}
+
+
+int main(int argc, char *argv[])
+{
+ int num = 10;
+ int i;
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-h") == 0) {
+ show_usage();
+ } else if (strcmp(argv[i], "-l") == 0 && (i + 1 < argc)) {
+ i = i + 1;
+ latency = atoi(argv[i]);
+ printf("Latency will be %d\n", latency);
+ } else {
+ num = atoi(argv[1]);
+ if (num <= 0) {
+ show_usage();
+ }
+ printf("Sending %d messages.\n", num);
+ }
+ }
+
+ main_test(num);
+
+ printf("finished sendvirtual test...type ENTER to quit...");
+ while (getchar() != '\n') ;
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/pmlist.c b/3rdparty/portmidi/pm_test/pmlist.c
new file mode 100644
index 00000000000..5e3d1dbc359
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/pmlist.c
@@ -0,0 +1,63 @@
+/* pmlist.c -- list portmidi devices and numbers
+ *
+ * This program lists devices. When you type return, it
+ * restarts portmidi and lists devices again. It is mainly
+ * a test for shutting down and restarting.
+ *
+ * Roger B. Dannenberg, Feb 2022
+ */
+
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define DEVICE_INFO NULL
+#define DRIVER_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+#define STRING_MAX 80 /* used for console input */
+
+void show_usage()
+{
+ printf("Usage: pmlist [-h]\n -h means help.\n"
+ " Type return to rescan and list devices, q<ret> to quit\n");
+}
+
+
+int main(int argc, char *argv[])
+{
+ if (argc > 1) {
+ show_usage();
+ exit(0);
+ }
+
+ while (1) {
+ char input[STRING_MAX];
+ const char *deflt;
+ const char *in_or_out;
+ int default_in, default_out, i;
+
+ // Pm_Initialize();
+ /* list device information */
+ default_in = Pm_GetDefaultInputDeviceID();
+ default_out = Pm_GetDefaultOutputDeviceID();
+ for (i = 0; i < Pm_CountDevices(); i++) {
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ printf("%d: %s, %s", i, info->interf, info->name);
+ deflt = "";
+ if (i == default_out || i == default_in) {
+ deflt = "default ";
+ }
+ in_or_out = (info->input ? "input" : "output");
+ printf(" (%s%s)\n", deflt, in_or_out);
+ }
+ if (fgets(input, STRING_MAX, stdin) && input[0] == 'q') {
+ return 0;
+ }
+ Pm_Terminate();
+ }
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/qtest.vcproj b/3rdparty/portmidi/pm_test/qtest.vcproj
deleted file mode 100644
index 70a8025b98d..00000000000
--- a/3rdparty/portmidi/pm_test/qtest.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="qtest"
- ProjectGUID="{2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="qtest.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/qtest.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\qtest.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/qtest.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\qtest.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="qtest.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/qtest.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\qtest.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/qtest.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\qtest.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\qtest.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/recvvirtual.c b/3rdparty/portmidi/pm_test/recvvirtual.c
new file mode 100644
index 00000000000..8ac97bed54c
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/recvvirtual.c
@@ -0,0 +1,125 @@
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define INPUT_BUFFER_SIZE 100
+#define DRIVER_INFO NULL
+#define TIME_PROC ((PmTimeProcPtr) Pt_Time)
+#define TIME_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+#define STRING_MAX 80 /* used for console input */
+
+static void prompt_and_exit(void)
+{
+ printf("type ENTER...");
+ while (getchar() != '\n') ;
+ /* this will clean up open ports: */
+ exit(-1);
+}
+
+
+static PmError checkerror(PmError err)
+{
+ if (err == pmHostError) {
+ /* it seems pointless to allocate memory and copy the string,
+ * so I will do the work of Pm_GetHostErrorText directly
+ */
+ char errmsg[80];
+ Pm_GetHostErrorText(errmsg, 80);
+ printf("PortMidi found host error...\n %s\n", errmsg);
+ prompt_and_exit();
+ } else if (err < 0) {
+ printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err));
+ prompt_and_exit();
+ }
+ return err;
+}
+
+
+void main_test_input(int num)
+{
+ PmStream *midi;
+ PmError status, length;
+ PmEvent buffer[1];
+ int id;
+ int i = 0; /* count messages as they arrive */
+ /* It is recommended to start timer before Midi; otherwise, PortMidi may
+ start the timer with its (default) parameters
+ */
+ TIME_START;
+
+ /* create a virtual input device */
+ id = checkerror(Pm_CreateVirtualInput("portmidi", NULL, DRIVER_INFO));
+ checkerror(Pm_OpenInput(&midi, id, NULL, 0, NULL, NULL));
+
+ printf("Midi Input opened. Reading %d Midi messages...\n", num);
+ Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX);
+ /* empty the buffer after setting filter, just in case anything
+ got through */
+ while (Pm_Poll(midi)) {
+ Pm_Read(midi, buffer, 1);
+ }
+ /* now start paying attention to messages */
+ while (i < num) {
+ status = Pm_Poll(midi);
+ if (status == TRUE) {
+ length = Pm_Read(midi, buffer, 1);
+ if (length > 0) {
+ printf("Got message %d: time %ld, %2lx %2lx %2lx\n",
+ i,
+ (long) buffer[0].timestamp,
+ (long) Pm_MessageStatus(buffer[0].message),
+ (long) Pm_MessageData1(buffer[0].message),
+ (long) Pm_MessageData2(buffer[0].message));
+ i++;
+ } else {
+ assert(0);
+ }
+ }
+ }
+
+ /* close device (this not explicitly needed in most implementations) */
+ printf("ready to close...");
+ Pm_Close(midi);
+ printf("done closing.\nNow delete the virtual device...");
+ checkerror(Pm_DeleteVirtualDevice(id));
+ printf("done deleting.\n");
+}
+
+
+void show_usage()
+{
+ printf("Usage: recvvirtual [-h] [n]\n use -h for this message,\n"
+ " n is number of message to wait for.\n");
+ exit(0);
+}
+
+
+int main(int argc, char *argv[])
+{
+ char line[STRING_MAX];
+ int num = 10;
+
+ if (argc > 2) {
+ show_usage();
+ } else if (argc == 2) {
+ if (strcmp(argv[1], "-h") == 0) {
+ show_usage();
+ } else {
+ num = atoi(argv[1]);
+ if (num <= 0) {
+ show_usage();
+ }
+ }
+ }
+
+ main_test_input(num);
+
+ printf("finished portMidi test...type ENTER to quit...");
+ while (getchar() != '\n') ;
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/sendvirtual.c b/3rdparty/portmidi/pm_test/sendvirtual.c
new file mode 100644
index 00000000000..14c6e9ea658
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/sendvirtual.c
@@ -0,0 +1,148 @@
+/* sendvirtual.c -- test for creating a virtual device and sending to it */
+/*
+ * Roger B. Dannenberg
+ * Sep 2021
+ */
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define OUTPUT_BUFFER_SIZE 0
+#define DEVICE_INFO NULL
+#define DRIVER_INFO NULL
+#define TIME_PROC ((PmTimeProcPtr) Pt_Time)
+#define TIME_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+int latency = 0;
+
+static void prompt_and_exit(void)
+{
+ printf("type ENTER...");
+ while (getchar() != '\n') ;
+ /* this will clean up open ports: */
+ exit(-1);
+}
+
+
+static PmError checkerror(PmError err)
+{
+ if (err == pmHostError) {
+ /* it seems pointless to allocate memory and copy the string,
+ * so I will do the work of Pm_GetHostErrorText directly
+ */
+ char errmsg[80];
+ Pm_GetHostErrorText(errmsg, 80);
+ printf("PortMidi found host error...\n %s\n", errmsg);
+ prompt_and_exit();
+ } else if (err < 0) {
+ printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err));
+ prompt_and_exit();
+ }
+ return err;
+}
+
+
+void wait_until(PmTimestamp when)
+{
+ PtTimestamp now = Pt_Time();
+ if (when > now) {
+ Pt_Sleep(when - now);
+ }
+}
+
+
+void main_test_output(int num)
+{
+ PmStream *midi;
+ int32_t next_time;
+ PmEvent buffer[1];
+ PmTimestamp timestamp;
+ int pitch = 60;
+ int id;
+
+ /* It is recommended to start timer before Midi; otherwise, PortMidi may
+ start the timer with its (default) parameters
+ */
+ TIME_START;
+
+ /* create a virtual output device */
+ id = checkerror(Pm_CreateVirtualOutput("portmidi", NULL, DEVICE_INFO));
+ checkerror(Pm_OpenOutput(&midi, id, DRIVER_INFO, OUTPUT_BUFFER_SIZE,
+ TIME_PROC, TIME_INFO, latency));
+
+ printf("Midi Output Virtual Device \"portmidi\" created.\n");
+ printf("Type ENTER to send messages: ");
+ while (getchar() != '\n') ;
+
+ buffer[0].timestamp = Pt_Time();
+#define PROGRAM 0
+ buffer[0].message = Pm_Message(0xC0, PROGRAM, 0);
+ Pm_Write(midi, buffer, 1);
+ next_time = Pt_Time() + 1000; /* wait 1s */
+ while (num > 0) {
+ wait_until(next_time);
+ Pm_WriteShort(midi, next_time, Pm_Message(0x90, pitch, 100));
+ printf("Note On pitch %d\n", pitch);
+ num--;
+ next_time += 500;
+
+ wait_until(next_time);
+ Pm_WriteShort(midi, next_time, Pm_Message(0x90, pitch, 0));
+ printf("Note Off pitch %d\n", pitch);
+ num--;
+ pitch = (pitch + 1) % 12 + 60;
+ next_time += 500;
+ }
+
+ /* close device (this not explicitly needed in most implementations) */
+ printf("ready to close...");
+ Pm_Close(midi);
+ printf("done closing.\nNow delete the virtual device...");
+ checkerror(Pm_DeleteVirtualDevice(id));
+ printf("done deleting.\n");
+}
+
+
+void show_usage()
+{
+ printf("Usage: sendvirtual [-h] [-l latency-in-ms] [n]\n"
+ " -h for this message,\n"
+ " -l ms designates latency for precise timing (default 0),\n"
+ " n is number of message to send.\n"
+ "sends change program to 1, then one note per second with 0.5s on,\n"
+ "0.5s off, for n/2 seconds. Latency >0 uses the device driver for \n"
+ "precise timing (see PortMidi documentation).\n");
+ exit(0);
+}
+
+
+int main(int argc, char *argv[])
+{
+ int num = 10;
+ int i;
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-h") == 0) {
+ show_usage();
+ } else if (strcmp(argv[i], "-l") == 0 && (i + 1 < argc)) {
+ i = i + 1;
+ latency = atoi(argv[i]);
+ printf("Latency will be %d\n", latency);
+ } else {
+ num = atoi(argv[1]);
+ if (num <= 0) {
+ show_usage();
+ }
+ printf("Sending %d messages.\n", num);
+ }
+ }
+
+ main_test_output(num);
+
+ printf("finished sendvirtual test...type ENTER to quit...");
+ while (getchar() != '\n') ;
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/sysex.c b/3rdparty/portmidi/pm_test/sysex.c
index 7bbcf0eedfd..81964961670 100644
--- a/3rdparty/portmidi/pm_test/sysex.c
+++ b/3rdparty/portmidi/pm_test/sysex.c
@@ -21,6 +21,11 @@
#define Sleep(n) usleep(n * 1000)
#endif
+// enable some extra printing
+#ifndef VERBOSE
+#define VERBOSE 0
+#endif
+
#define MIDI_SYSEX 0xf0
#define MIDI_EOX 0xf7
@@ -35,15 +40,13 @@ int latency = 0;
/* read a number from console */
/**/
-int get_number(char *prompt)
+int get_number(const char *prompt)
{
- char line[STRING_MAX];
int n = 0, i;
- printf(prompt);
+ fputs(prompt, stdout);
while (n != 1) {
n = scanf("%d", &i);
- fgets(line, STRING_MAX, stdin);
-
+ while (getchar() != '\n') ;
}
return i;
}
@@ -58,7 +61,6 @@ void loopback_test()
PmStream *midi_in;
PmStream *midi_out;
unsigned char msg[1024];
- char line[80];
int32_t len;
int i;
int data;
@@ -90,7 +92,7 @@ void loopback_test()
srand((unsigned int) Pt_Time()); /* seed for random numbers */
begin_time = Pt_Time();
- while (1) {
+ while (total_bytes < 100000) {
PmError count;
int32_t start_time;
int error_position = -1; /* 0; -1; -1 for continuous */
@@ -100,9 +102,11 @@ void loopback_test()
/* set error_position above to 0 for interactive, -1 for */
/* continuous */
if (error_position >= 0) {
+ int c;
printf("Type return to send message, q to quit: ");
- fgets(line, STRING_MAX, stdin);
- if (line[0] == 'q') goto cleanup;
+ while ((c = getchar()) != '\n') {
+ if (c == 'q') goto cleanup;
+ }
}
/* compose the message */
@@ -125,17 +129,38 @@ void loopback_test()
printf("Before sending anything, a MIDI message was found in\n");
printf("the input buffer. Please try again.\n");
break;
- }
+ }
- /* send the message */
- printf("Sending %d byte sysex message.\n", len + 2);
- Pm_WriteSysEx(midi_out, 0, msg);
+ /* send the message two ways: 1) Pm_WriteSysEx, 2) Pm_Write */
+ if (total_bytes & 1) {
+ printf("Sending %d byte sysex msg via Pm_WriteSysEx.\n", len + 2);
+ Pm_WriteSysEx(midi_out, 0, msg);
+ } else {
+ PmEvent event = {0, 0};
+ int bits = 0;
+ printf("Sending %d byte sysex msg via Pm_Write(s).\n", len + 2);
+ for (i = 0; i < len + 2; i++) {
+ event.message |= (msg[i] << bits);
+ bits += 8;
+ if (bits == 32) { /* full message - send it */
+ Pm_Write(midi_out, &event, 1);
+ bits = 0;
+ event.message = 0;
+ }
+ }
+ if (bits > 0) { /* last message is partially full */
+ Pm_Write(midi_out, &event, 1);
+ }
+ }
/* receive the message and compare to msg[] */
data = 0;
shift = 0;
i = 0;
start_time = Pt_Time();
+ if (VERBOSE) {
+ printf("start_time %d\n", start_time);
+ }
error_position = -1;
/* allow up to 2 seconds for transmission */
while (data != MIDI_EOX && start_time + 2000 > Pt_Time()) {
@@ -144,10 +169,10 @@ void loopback_test()
Sleep(1); /* be nice: give some CPU time to the system */
continue; /* continue polling for input */
}
-
- /* printf("read %lx ", event.message);
- fflush(stdout); */
-
+ if (VERBOSE) {
+ printf("read %08x ", event.message);
+ fflush(stdout);
+ }
/* compare 4 bytes of data until you reach an eox */
for (shift = 0; shift < 32 && (data != MIDI_EOX); shift += 8) {
data = (event.message >> shift) & 0xFF;
@@ -160,18 +185,20 @@ void loopback_test()
}
}
if (error_position >= 0) {
- printf("Error at byte %d: sent %x recd %x.\n", error_position,
- expected, actual);
+ printf("Error at time %d byte %d: sent %x recd %x.\n", Pt_Time(),
+ error_position, expected, actual);
break;
} else if (i != len + 2) {
- printf("Error: byte %d not received.\n", i);
+ printf("Error at time %d: byte %d not received.\n", Pt_Time(), i);
break;
} else {
int seconds = (Pt_Time() - begin_time) / 1000;
- if (seconds == 0) seconds = 1;
+ if (seconds == 0) seconds = 1;
printf("Correctly received %d byte sysex message.\n", i);
- total_bytes += i;
- printf("Cummulative bytes/sec: %d\n", total_bytes / seconds);
+ total_bytes += i;
+ printf("Cummulative bytes/sec: %d, %d%% done.\n",
+ (int) (total_bytes / seconds),
+ (int) (100 * total_bytes / 100000));
}
}
cleanup:
@@ -378,7 +405,7 @@ void receive_sysex()
printf("Midi Input opened, type file for sysex data: ");
/* open file */
- fgets(line, STRING_MAX, stdin);
+ if (!fgets(line, STRING_MAX, stdin)) return; /* no more stdin? */
/* remove the newline character */
if (strlen(line) > 0) line[strlen(line) - 1] = 0;
f = fopen(line, "w");
@@ -443,7 +470,7 @@ void send_sysex()
printf("Midi Output opened, type file with sysex data: ");
/* open file */
- fgets(line, STRING_MAX, stdin);
+ if (!fgets(line, STRING_MAX, stdin)) return; /* no more stdin? */
/* remove the newline character */
if (strlen(line) > 0) line[strlen(line) - 1] = 0;
f = fopen(line, "r");
@@ -487,7 +514,6 @@ void send_sysex()
int main()
{
int i;
- char line[80];
/* list device information */
for (i = 0; i < Pm_CountDevices(); i++) {
@@ -498,11 +524,13 @@ int main()
printf("\n");
}
while (1) {
+ char cmd;
printf("Type r to receive sysex, s to send,"
" l for loopback test, m to send multiple,"
" n to receive multiple, q to quit: ");
- fgets(line, STRING_MAX, stdin);
- switch (line[0]) {
+ cmd = getchar();
+ while (getchar() != '\n') ;
+ switch (cmd) {
case 'r':
receive_sysex();
break;
diff --git a/3rdparty/portmidi/pm_test/sysex.vcproj b/3rdparty/portmidi/pm_test/sysex.vcproj
deleted file mode 100644
index dabeecb255c..00000000000
--- a/3rdparty/portmidi/pm_test/sysex.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="sysex"
- ProjectGUID="{71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="sysex.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/sysex.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\sysex.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/sysex.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\sysex.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="sysex.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/sysex.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\sysex.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/sysex.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\sysex.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\sysex.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/test.c b/3rdparty/portmidi/pm_test/test.c
deleted file mode 100644
index 03d6331adef..00000000000
--- a/3rdparty/portmidi/pm_test/test.c
+++ /dev/null
@@ -1,489 +0,0 @@
-#include "portmidi.h"
-#include "porttime.h"
-#include "stdlib.h"
-#include "stdio.h"
-#include "string.h"
-#include "assert.h"
-
-#define INPUT_BUFFER_SIZE 100
-#define OUTPUT_BUFFER_SIZE 0
-#define DRIVER_INFO NULL
-#define TIME_PROC ((int32_t (*)(void *)) Pt_Time)
-#define TIME_INFO NULL
-#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
-
-#define STRING_MAX 80 /* used for console input */
-
-int32_t latency = 0;
-
-/* crash the program to test whether midi ports are closed */
-/**/
-void doSomethingReallyStupid() {
- int * tmp = NULL;
- *tmp = 5;
-}
-
-
-/* exit the program without any explicit cleanup */
-/**/
-void doSomethingStupid() {
- assert(0);
-}
-
-
-/* read a number from console */
-/**/
-int get_number(char *prompt)
-{
- char line[STRING_MAX];
- int n = 0, i;
- printf(prompt);
- while (n != 1) {
- n = scanf("%d", &i);
- fgets(line, STRING_MAX, stdin);
-
- }
- return i;
-}
-
-
-/*
- * the somethingStupid parameter can be set to simulate a program crash.
- * We want PortMidi to close Midi ports automatically in the event of a
- * crash because Windows does not (and this may cause an OS crash)
- */
-void main_test_input(unsigned int somethingStupid) {
- PmStream * midi;
- PmError status, length;
- PmEvent buffer[1];
- int num = 10;
- int i = get_number("Type input number: ");
- /* It is recommended to start timer before Midi; otherwise, PortMidi may
- start the timer with its (default) parameters
- */
- TIME_START;
-
- /* open input device */
- Pm_OpenInput(&midi,
- i,
- DRIVER_INFO,
- INPUT_BUFFER_SIZE,
- TIME_PROC,
- TIME_INFO);
-
- printf("Midi Input opened. Reading %d Midi messages...\n", num);
- Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX);
- /* empty the buffer after setting filter, just in case anything
- got through */
- while (Pm_Poll(midi)) {
- Pm_Read(midi, buffer, 1);
- }
- /* now start paying attention to messages */
- i = 0; /* count messages as they arrive */
- while (i < num) {
- status = Pm_Poll(midi);
- if (status == TRUE) {
- length = Pm_Read(midi,buffer, 1);
- if (length > 0) {
- printf("Got message %d: time %ld, %2lx %2lx %2lx\n",
- i,
- (long) buffer[0].timestamp,
- (long) Pm_MessageStatus(buffer[0].message),
- (long) Pm_MessageData1(buffer[0].message),
- (long) Pm_MessageData2(buffer[0].message));
- i++;
- } else {
- assert(0);
- }
- }
- /* simulate crash if somethingStupid is 1 or 2 */
- if ((i > (num/2)) && (somethingStupid == 1)) {
- doSomethingStupid();
- } else if ((i > (num/2)) && (somethingStupid == 2)) {
- doSomethingReallyStupid();
- }
- }
-
- /* close device (this not explicitly needed in most implementations) */
- printf("ready to close...");
-
- Pm_Close(midi);
- printf("done closing...");
-}
-
-
-
-void main_test_output() {
- PmStream * midi;
- char line[80];
- int32_t off_time;
- int chord[] = { 60, 67, 76, 83, 90 };
- #define chord_size 5
- PmEvent buffer[chord_size];
- PmTimestamp timestamp;
-
- /* determine which output device to use */
- int i = get_number("Type output number: ");
-
- /* It is recommended to start timer before PortMidi */
- TIME_START;
-
- /* open output device -- since PortMidi avoids opening a timer
- when latency is zero, we will pass in a NULL timer pointer
- for that case. If PortMidi tries to access the time_proc,
- we will crash, so this test will tell us something. */
- Pm_OpenOutput(&midi,
- i,
- DRIVER_INFO,
- OUTPUT_BUFFER_SIZE,
- (latency == 0 ? NULL : TIME_PROC),
- (latency == 0 ? NULL : TIME_INFO),
- latency);
- printf("Midi Output opened with %ld ms latency.\n", (long) latency);
-
- /* output note on/off w/latency offset; hold until user prompts */
- printf("ready to send program 1 change... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
- /* if we were writing midi for immediate output, we could always use
- timestamps of zero, but since we may be writing with latency, we
- will explicitly set the timestamp to "now" by getting the time.
- The source of timestamps should always correspond to the TIME_PROC
- and TIME_INFO parameters used in Pm_OpenOutput(). */
- buffer[0].timestamp = TIME_PROC(TIME_INFO);
- /* Send a program change to increase the chances we will hear notes */
- /* Program 0 is usually a piano, but you can change it here: */
-#define PROGRAM 0
- buffer[0].message = Pm_Message(0xC0, PROGRAM, 0);
- Pm_Write(midi, buffer, 1);
-
- printf("ready to note-on... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
- buffer[0].timestamp = TIME_PROC(TIME_INFO);
- buffer[0].message = Pm_Message(0x90, 60, 100);
- Pm_Write(midi, buffer, 1);
- printf("ready to note-off... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
- buffer[0].timestamp = TIME_PROC(TIME_INFO);
- buffer[0].message = Pm_Message(0x90, 60, 0);
- Pm_Write(midi, buffer, 1);
-
- /* output short note on/off w/latency offset; hold until user prompts */
- printf("ready to note-on (short form)... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
- Pm_WriteShort(midi, TIME_PROC(TIME_INFO),
- Pm_Message(0x90, 60, 100));
- printf("ready to note-off (short form)... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
- Pm_WriteShort(midi, TIME_PROC(TIME_INFO),
- Pm_Message(0x90, 60, 0));
-
- /* output several note on/offs to test timing.
- Should be 1s between notes */
- printf("chord will arpeggiate if latency > 0\n");
- printf("ready to chord-on/chord-off... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
- timestamp = TIME_PROC(TIME_INFO);
- for (i = 0; i < chord_size; i++) {
- buffer[i].timestamp = timestamp + 1000 * i;
- buffer[i].message = Pm_Message(0x90, chord[i], 100);
- }
- Pm_Write(midi, buffer, chord_size);
-
- off_time = timestamp + 1000 + chord_size * 1000;
- while (TIME_PROC(TIME_INFO) < off_time)
- /* busy wait */;
- for (i = 0; i < chord_size; i++) {
- buffer[i].timestamp = timestamp + 1000 * i;
- buffer[i].message = Pm_Message(0x90, chord[i], 0);
- }
- Pm_Write(midi, buffer, chord_size);
-
- /* close device (this not explicitly needed in most implementations) */
- printf("ready to close and terminate... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
-
- Pm_Close(midi);
- Pm_Terminate();
- printf("done closing and terminating...\n");
-}
-
-
-void main_test_both()
-{
- int i = 0;
- int in, out;
- PmStream * midi, * midiOut;
- PmEvent buffer[1];
- PmError status, length;
- int num = 10;
-
- in = get_number("Type input number: ");
- out = get_number("Type output number: ");
-
- /* In is recommended to start timer before PortMidi */
- TIME_START;
-
- Pm_OpenOutput(&midiOut,
- out,
- DRIVER_INFO,
- OUTPUT_BUFFER_SIZE,
- TIME_PROC,
- TIME_INFO,
- latency);
- printf("Midi Output opened with %ld ms latency.\n", (long) latency);
- /* open input device */
- Pm_OpenInput(&midi,
- in,
- DRIVER_INFO,
- INPUT_BUFFER_SIZE,
- TIME_PROC,
- TIME_INFO);
- printf("Midi Input opened. Reading %d Midi messages...\n",num);
- Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK);
- /* empty the buffer after setting filter, just in case anything
- got through */
- while (Pm_Poll(midi)) {
- Pm_Read(midi, buffer, 1);
- }
- i = 0;
- while (i < num) {
- status = Pm_Poll(midi);
- if (status == TRUE) {
- length = Pm_Read(midi,buffer,1);
- if (length > 0) {
- Pm_Write(midiOut, buffer, 1);
- printf("Got message %d: time %ld, %2lx %2lx %2lx\n",
- i,
- (long) buffer[0].timestamp,
- (long) Pm_MessageStatus(buffer[0].message),
- (long) Pm_MessageData1(buffer[0].message),
- (long) Pm_MessageData2(buffer[0].message));
- i++;
- } else {
- assert(0);
- }
- }
- }
-
- /* close midi devices */
- Pm_Close(midi);
- Pm_Close(midiOut);
- Pm_Terminate();
-}
-
-
-/* main_test_stream exercises windows winmm API's stream mode */
-/* The winmm stream mode is used for latency>0, and sends
- timestamped messages. The timestamps are relative (delta)
- times, whereas PortMidi times are absolute. Since peculiar
- things happen when messages are not always sent in advance,
- this function allows us to exercise the system and test it.
- */
-void main_test_stream() {
- PmStream * midi;
- char line[80];
- PmEvent buffer[16];
-
- /* determine which output device to use */
- int i = get_number("Type output number: ");
-
- latency = 500; /* ignore LATENCY for this test and
- fix the latency at 500ms */
-
- /* It is recommended to start timer before PortMidi */
- TIME_START;
-
- /* open output device */
- Pm_OpenOutput(&midi,
- i,
- DRIVER_INFO,
- OUTPUT_BUFFER_SIZE,
- TIME_PROC,
- TIME_INFO,
- latency);
- printf("Midi Output opened with %ld ms latency.\n", (long) latency);
-
- /* output note on/off w/latency offset; hold until user prompts */
- printf("ready to send output... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
-
- /* if we were writing midi for immediate output, we could always use
- timestamps of zero, but since we may be writing with latency, we
- will explicitly set the timestamp to "now" by getting the time.
- The source of timestamps should always correspond to the TIME_PROC
- and TIME_INFO parameters used in Pm_OpenOutput(). */
- buffer[0].timestamp = TIME_PROC(TIME_INFO);
- buffer[0].message = Pm_Message(0xC0, 0, 0);
- buffer[1].timestamp = buffer[0].timestamp;
- buffer[1].message = Pm_Message(0x90, 60, 100);
- buffer[2].timestamp = buffer[0].timestamp + 1000;
- buffer[2].message = Pm_Message(0x90, 62, 100);
- buffer[3].timestamp = buffer[0].timestamp + 2000;
- buffer[3].message = Pm_Message(0x90, 64, 100);
- buffer[4].timestamp = buffer[0].timestamp + 3000;
- buffer[4].message = Pm_Message(0x90, 66, 100);
- buffer[5].timestamp = buffer[0].timestamp + 4000;
- buffer[5].message = Pm_Message(0x90, 60, 0);
- buffer[6].timestamp = buffer[0].timestamp + 4000;
- buffer[6].message = Pm_Message(0x90, 62, 0);
- buffer[7].timestamp = buffer[0].timestamp + 4000;
- buffer[7].message = Pm_Message(0x90, 64, 0);
- buffer[8].timestamp = buffer[0].timestamp + 4000;
- buffer[8].message = Pm_Message(0x90, 66, 0);
-
- Pm_Write(midi, buffer, 9);
-#ifdef SEND8
- /* Now, we're ready for the real test.
- Play 4 notes at now, now+500, now+1000, and now+1500
- Then wait until now+2000.
- Play 4 more notes as before.
- We should hear 8 evenly spaced notes. */
- now = TIME_PROC(TIME_INFO);
- for (i = 0; i < 4; i++) {
- buffer[i * 2].timestamp = now + (i * 500);
- buffer[i * 2].message = Pm_Message(0x90, 60, 100);
- buffer[i * 2 + 1].timestamp = now + 250 + (i * 500);
- buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0);
- }
- Pm_Write(midi, buffer, 8);
-
- while (Pt_Time() < now + 2500)
- /* busy wait */;
- /* now we are 500 ms behind schedule, but since the latency
- is 500, the delay should not be audible */
- now += 2000;
- for (i = 0; i < 4; i++) {
- buffer[i * 2].timestamp = now + (i * 500);
- buffer[i * 2].message = Pm_Message(0x90, 60, 100);
- buffer[i * 2 + 1].timestamp = now + 250 + (i * 500);
- buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0);
- }
- Pm_Write(midi, buffer, 8);
-#endif
- /* close device (this not explicitly needed in most implementations) */
- printf("ready to close and terminate... (type RETURN):");
- fgets(line, STRING_MAX, stdin);
-
- Pm_Close(midi);
- Pm_Terminate();
- printf("done closing and terminating...\n");
-}
-
-
-void show_usage()
-{
- printf("Usage: test [-h] [-l latency-in-ms]\n");
- exit(0);
-}
-
-int main(int argc, char *argv[])
-{
- int default_in;
- int default_out;
- int i = 0, n = 0;
- char line[STRING_MAX];
- int test_input = 0, test_output = 0, test_both = 0, somethingStupid = 0;
- int stream_test = 0;
- int latency_valid = FALSE;
-
- if (sizeof(void *) == 8)
- printf("Apparently this is a 64-bit machine.\n");
- else if (sizeof(void *) == 4)
- printf ("Apparently this is a 32-bit machine.\n");
-
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-h") == 0) {
- show_usage();
- } else if (strcmp(argv[i], "-l") == 0 && (i + 1 < argc)) {
- i = i + 1;
- latency = atoi(argv[i]);
- printf("Latency will be %ld\n", (long) latency);
- latency_valid = TRUE;
- } else {
- show_usage();
- }
- }
-
- while (!latency_valid) {
- int lat; // declared int to match "%d"
- printf("Latency in ms: ");
- if (scanf("%d", &lat) == 1) {
- latency = (int32_t) lat; // coerce from "%d" to known size
- latency_valid = TRUE;
- }
- }
-
- /* determine what type of test to run */
- printf("begin portMidi test...\n");
- printf("%s%s%s%s%s",
- "enter your choice...\n 1: test input\n",
- " 2: test input (fail w/assert)\n",
- " 3: test input (fail w/NULL assign)\n",
- " 4: test output\n 5: test both\n",
- " 6: stream test\n");
- while (n != 1) {
- n = scanf("%d", &i);
- fgets(line, STRING_MAX, stdin);
- switch(i) {
- case 1:
- test_input = 1;
- break;
- case 2:
- test_input = 1;
- somethingStupid = 1;
- break;
- case 3:
- test_input = 1;
- somethingStupid = 2;
- break;
- case 4:
- test_output = 1;
- break;
- case 5:
- test_both = 1;
- break;
- case 6:
- stream_test = 1;
- break;
- default:
- printf("got %d (invalid input)\n", n);
- break;
- }
- }
-
- /* list device information */
- default_in = Pm_GetDefaultInputDeviceID();
- default_out = Pm_GetDefaultOutputDeviceID();
- for (i = 0; i < Pm_CountDevices(); i++) {
- char *deflt;
- const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
- if (((test_input | test_both) & info->input) |
- ((test_output | test_both | stream_test) & info->output)) {
- printf("%d: %s, %s", i, info->interf, info->name);
- if (info->input) {
- deflt = (i == default_in ? "default " : "");
- printf(" (%sinput)", deflt);
- }
- if (info->output) {
- deflt = (i == default_out ? "default " : "");
- printf(" (%soutput)", deflt);
- }
- printf("\n");
- }
- }
-
- /* run test */
- if (stream_test) {
- main_test_stream();
- } else if (test_input) {
- main_test_input(somethingStupid);
- } else if (test_output) {
- main_test_output();
- } else if (test_both) {
- main_test_both();
- }
-
- printf("finished portMidi test...type ENTER to quit...");
- fgets(line, STRING_MAX, stdin);
- return 0;
-}
diff --git a/3rdparty/portmidi/pm_test/test.vcproj b/3rdparty/portmidi/pm_test/test.vcproj
deleted file mode 100644
index 7458c31e865..00000000000
--- a/3rdparty/portmidi/pm_test/test.vcproj
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="test"
- ProjectGUID="{0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}"
- Keyword="Win32Proj">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="test.dir\Debug"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- BasicRuntimeChecks="3"
- CompileAs="1"
- DebugInformationFormat="3"
- ExceptionHandling="0"
- InlineFunctionExpansion="0"
- Optimization="0"
- RuntimeLibrary="1"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- AssemblerListingLocation="Debug"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Debug/test.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\&quot;Debug\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386 /debug"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Debug\test.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="2"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Debug/test.pdb"
- GenerateDebugInformation="TRUE"
- SubSystem="1"
- ImportLibrary="..\pm_test\Debug\test.lib"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="test.dir\Release"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalOptions=" /Zm1000"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- CompileAs="1"
- ExceptionHandling="0"
- InlineFunctionExpansion="2"
- Optimization="2"
- RuntimeLibrary="0"
- WarningLevel="3"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- AssemblerListingLocation="Release"
- ObjectFile="$(IntDir)\"
- ProgramDataBaseFileName="../pm_test/Release/test.pdb"
-/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\pm_common;..\porttime;"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"/>
- <Tool
- Name="VCMIDLTool"
- PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\&quot;Release\&quot;"
- MkTypLibCompatible="FALSE"
- TargetEnvironment="1"
- GenerateStublessProxies="TRUE"
- TypeLibraryName="$(InputName).tlb"
- OutputDirectory="$(IntDir)"
- HeaderFileName="$(InputName).h"
- DLLDataFileName=""
- InterfaceIdentifierFileName="$(InputName)_i.c"
- ProxyFileName="$(InputName)_p.c"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCLinkerTool"
- AdditionalOptions=" /STACK:10000000 /machine:I386"
- AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib "
- OutputFile="..\pm_test\Release\test.exe"
- Version="0.0"
- GenerateManifest="TRUE"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- ProgramDataBaseFile="../pm_test/Release/test.pdb"
- SubSystem="1"
- ImportLibrary="..\pm_test\Release\test.lib"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="">
- <File
- RelativePath="..\pm_test\test.c">
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/pm_test/testio.c b/3rdparty/portmidi/pm_test/testio.c
new file mode 100644
index 00000000000..c71ae087307
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/testio.c
@@ -0,0 +1,535 @@
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define INPUT_BUFFER_SIZE 100
+#define OUTPUT_BUFFER_SIZE 0
+#define DRIVER_INFO NULL
+#define TIME_PROC ((int32_t (*)(void *)) Pt_Time)
+#define TIME_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+#define WAIT_FOR_ENTER while (getchar() != '\n') ;
+
+int32_t latency = 0;
+int verbose = FALSE;
+
+/* crash the program to test whether midi ports are closed */
+/**/
+void doSomethingReallyStupid() {
+ int * tmp = NULL;
+ *tmp = 5;
+}
+
+
+/* exit the program without any explicit cleanup */
+/**/
+void doSomethingStupid() {
+ assert(0);
+}
+
+
+/* read a number from console */
+/**/
+int get_number(const char *prompt)
+{
+ int n = 0, i;
+ fputs(prompt, stdout);
+ while (n != 1) {
+ n = scanf("%d", &i);
+ WAIT_FOR_ENTER
+ }
+ return i;
+}
+
+
+/*
+ * the somethingStupid parameter can be set to simulate a program crash.
+ * We want PortMidi to close Midi ports automatically in the event of a
+ * crash because Windows does not (and this may cause an OS crash)
+ */
+void main_test_input(unsigned int somethingStupid) {
+ PmStream * midi;
+ PmError status, length;
+ PmEvent buffer[1];
+ int num = 10;
+ int i = get_number("Type input number: ");
+ /* It is recommended to start timer before Midi; otherwise, PortMidi may
+ start the timer with its (default) parameters
+ */
+ TIME_START;
+
+ /* open input device */
+ Pm_OpenInput(&midi,
+ i,
+ DRIVER_INFO,
+ INPUT_BUFFER_SIZE,
+ TIME_PROC,
+ TIME_INFO);
+
+ printf("Midi Input opened. Reading %d Midi messages...\n", num);
+ Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX);
+ /* empty the buffer after setting filter, just in case anything
+ got through */
+ while (Pm_Poll(midi)) {
+ Pm_Read(midi, buffer, 1);
+ }
+ /* now start paying attention to messages */
+ i = 0; /* count messages as they arrive */
+ while (i < num) {
+ status = Pm_Poll(midi);
+ if (status == TRUE) {
+ length = Pm_Read(midi, buffer, 1);
+ if (length > 0) {
+ printf("Got message %d @ time %ld: timestamp %ld, "
+ "%2lx %2lx %2lx\n", i, (long) Pt_Time(),
+ (long) buffer[0].timestamp,
+ (long) Pm_MessageStatus(buffer[0].message),
+ (long) Pm_MessageData1(buffer[0].message),
+ (long) Pm_MessageData2(buffer[0].message));
+ i++;
+ } else {
+ assert(0);
+ }
+ }
+ /* simulate crash if somethingStupid is 1 or 2 */
+ if ((i > (num/2)) && (somethingStupid == 1)) {
+ doSomethingStupid();
+ } else if ((i > (num/2)) && (somethingStupid == 2)) {
+ doSomethingReallyStupid();
+ }
+ }
+
+ /* close device (this not explicitly needed in most implementations) */
+ printf("ready to close...");
+
+ Pm_Close(midi);
+ printf("done closing...");
+}
+
+
+
+void main_test_output(int isochronous_test)
+{
+ PmStream * midi;
+ int32_t off_time;
+ int chord[] = { 60, 67, 76, 83, 90 };
+ #define chord_size 5
+ PmEvent buffer[chord_size];
+ PmTimestamp timestamp;
+
+ /* determine which output device to use */
+ int i = get_number("Type output number: ");
+
+ /* It is recommended to start timer before PortMidi */
+ TIME_START;
+
+ /* open output device -- since PortMidi avoids opening a timer
+ when latency is zero, we will pass in a NULL timer pointer
+ for that case. If PortMidi tries to access the time_proc,
+ we will crash, so this test will tell us something. */
+ Pm_OpenOutput(&midi,
+ i,
+ DRIVER_INFO,
+ OUTPUT_BUFFER_SIZE,
+ (latency == 0 ? NULL : TIME_PROC),
+ (latency == 0 ? NULL : TIME_INFO),
+ latency);
+ printf("Midi Output opened with %ld ms latency.\n", (long) latency);
+
+ /* output note on/off w/latency offset; hold until user prompts */
+ printf("ready to send program 1 change... (type ENTER):");
+ WAIT_FOR_ENTER
+ /* if we were writing midi for immediate output, we could always use
+ timestamps of zero, but since we may be writing with latency, we
+ will explicitly set the timestamp to "now" by getting the time.
+ The source of timestamps should always correspond to the TIME_PROC
+ and TIME_INFO parameters used in Pm_OpenOutput(). */
+ buffer[0].timestamp = Pt_Time();
+ /* Send a program change to increase the chances we will hear notes */
+ /* Program 0 is usually a piano, but you can change it here: */
+#define PROGRAM 0
+ buffer[0].message = Pm_Message(0xC0, PROGRAM, 0);
+ Pm_Write(midi, buffer, 1);
+
+ if (isochronous_test) { // play 4 notes per sec for 20s
+ int count;
+ PmTimestamp start;
+ if (latency < 100) {
+ printf("Warning: latency < 100, but this test sends messages"
+ " at times that are jittered by up to 100ms, so you"
+ " may hear uneven timing\n");
+ }
+ printf("Starting in 1s..."); fflush(stdout);
+ Pt_Sleep(1000);
+ start = Pt_Time();
+ for (count = 0; count < 80; count++) {
+ PmTimestamp next_time;
+ buffer[0].timestamp = start + count * 250;
+ buffer[0].message = Pm_Message(0x90, 69, 100);
+ buffer[1].timestamp = start + count * 250 + 200;
+ buffer[1].message = Pm_Message(0x90, 69, 0);
+ Pm_Write(midi, buffer, 2);
+ next_time = start + (count + 1) * 250;
+ // sleep for a random time up to 100ms to add jitter to
+ // the times at which we send messages. PortMidi timing
+ // should remove the jitter if latency > 100
+ while (Pt_Time() < next_time) {
+ Pt_Sleep(rand() % 100);
+ }
+ }
+ printf("Done sending 80 notes at 4 notes per second.\n");
+ } else {
+ printf("ready to note-on... (type ENTER):");
+ WAIT_FOR_ENTER
+ buffer[0].timestamp = Pt_Time();
+ buffer[0].message = Pm_Message(0x90, 60, 100);
+ Pm_Write(midi, buffer, 1);
+ printf("ready to note-off... (type ENTER):");
+ WAIT_FOR_ENTER
+ buffer[0].timestamp = Pt_Time();
+ buffer[0].message = Pm_Message(0x90, 60, 0);
+ Pm_Write(midi, buffer, 1);
+
+ /* output short note on/off w/latency offset; hold until user prompts */
+ printf("ready to note-on (short form)... (type ENTER):");
+ WAIT_FOR_ENTER
+ Pm_WriteShort(midi, Pt_Time(),
+ Pm_Message(0x90, 60, 100));
+ printf("ready to note-off (short form)... (type ENTER):");
+ WAIT_FOR_ENTER
+ Pm_WriteShort(midi, Pt_Time(),
+ Pm_Message(0x90, 60, 0));
+
+ /* output several note on/offs to test timing.
+ Should be 1s between notes */
+ if (latency == 0) {
+ printf("chord should not arpeggiate, latency == 0\n");
+ } else {
+ printf("chord should arpeggiate (latency = %ld > 0\n",
+ (long) latency);
+ }
+ printf("ready to chord-on/chord-off... (type ENTER):");
+ WAIT_FOR_ENTER
+ timestamp = Pt_Time();
+ printf("starting timestamp %ld\n", (long) timestamp);
+ for (i = 0; i < chord_size; i++) {
+ buffer[i].timestamp = timestamp + 1000 * i;
+ buffer[i].message = Pm_Message(0x90, chord[i], 100);
+ }
+ Pm_Write(midi, buffer, chord_size);
+
+ off_time = timestamp + 1000 + chord_size * 1000;
+ while (Pt_Time() < off_time)
+ Pt_Sleep(10); /* wait */
+ for (i = 0; i < chord_size; i++) {
+ buffer[i].timestamp = timestamp + 1000 * i;
+ buffer[i].message = Pm_Message(0x90, chord[i], 0);
+ }
+ Pm_Write(midi, buffer, chord_size);
+ }
+
+ /* close device (this not explicitly needed in most implementations) */
+ printf("ready to close and terminate... (type ENTER):");
+ WAIT_FOR_ENTER
+
+ Pm_Close(midi);
+ Pm_Terminate();
+ printf("done closing and terminating...\n");
+}
+
+
+void main_test_both()
+{
+ int i = 0;
+ int in, out;
+ PmStream * midi, * midiOut;
+ PmEvent buffer[1];
+ PmError status, length;
+ int num = 11;
+
+ in = get_number("Type input number: ");
+ out = get_number("Type output number: ");
+
+ /* In is recommended to start timer before PortMidi */
+ TIME_START;
+
+ Pm_OpenOutput(&midiOut,
+ out,
+ DRIVER_INFO,
+ OUTPUT_BUFFER_SIZE,
+ TIME_PROC,
+ TIME_INFO,
+ latency);
+ printf("Midi Output opened with %ld ms latency.\n", (long) latency);
+ /* open input device */
+ Pm_OpenInput(&midi,
+ in,
+ DRIVER_INFO,
+ INPUT_BUFFER_SIZE,
+ TIME_PROC,
+ TIME_INFO);
+ printf("Midi Input opened. Reading %d Midi messages...\n", num);
+ Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK);
+ /* empty the buffer after setting filter, just in case anything
+ got through */
+ while (Pm_Poll(midi)) {
+ Pm_Read(midi, buffer, 1);
+ }
+ i = 0;
+ while (i < num) {
+ status = Pm_Poll(midi);
+ if (status == TRUE) {
+ length = Pm_Read(midi,buffer,1);
+ if (length > 0) {
+ Pm_Write(midiOut, buffer, 1);
+ printf("Got message %d @ time %ld: timestamp %ld, "
+ "%2lx %2lx %2lx\n", i, (long) Pt_Time(),
+ (long) buffer[0].timestamp,
+ (long) Pm_MessageStatus(buffer[0].message),
+ (long) Pm_MessageData1(buffer[0].message),
+ (long) Pm_MessageData2(buffer[0].message));
+ i++;
+ } else {
+ assert(0);
+ }
+ }
+ }
+ /* allow time for last message to go out */
+ Pt_Sleep(100 + latency);
+
+ /* close midi devices */
+ Pm_Close(midi);
+ Pm_Close(midiOut);
+ Pm_Terminate();
+}
+
+
+/* main_test_stream exercises windows winmm API's stream mode */
+/* The winmm stream mode is used for latency>0, and sends
+ timestamped messages. The timestamps are relative (delta)
+ times, whereas PortMidi times are absolute. Since peculiar
+ things happen when messages are not always sent in advance,
+ this function allows us to exercise the system and test it.
+ */
+void main_test_stream() {
+ PmStream * midi;
+ PmEvent buffer[16];
+
+ /* determine which output device to use */
+ int i = get_number("Type output number: ");
+
+ latency = 500; /* ignore LATENCY for this test and
+ fix the latency at 500ms */
+
+ /* It is recommended to start timer before PortMidi */
+ TIME_START;
+
+ /* open output device */
+ Pm_OpenOutput(&midi,
+ i,
+ DRIVER_INFO,
+ OUTPUT_BUFFER_SIZE,
+ TIME_PROC,
+ TIME_INFO,
+ latency);
+ printf("Midi Output opened with %ld ms latency.\n", (long) latency);
+
+ /* output note on/off w/latency offset; hold until user prompts */
+ printf("ready to send output... (type ENTER):");
+ WAIT_FOR_ENTER
+
+ /* if we were writing midi for immediate output, we could always use
+ timestamps of zero, but since we may be writing with latency, we
+ will explicitly set the timestamp to "now" by getting the time.
+ The source of timestamps should always correspond to the TIME_PROC
+ and TIME_INFO parameters used in Pm_OpenOutput(). */
+ buffer[0].timestamp = Pt_Time();
+ buffer[0].message = Pm_Message(0xC0, 0, 0);
+ buffer[1].timestamp = buffer[0].timestamp;
+ buffer[1].message = Pm_Message(0x90, 60, 100);
+ buffer[2].timestamp = buffer[0].timestamp + 1000;
+ buffer[2].message = Pm_Message(0x90, 62, 100);
+ buffer[3].timestamp = buffer[0].timestamp + 2000;
+ buffer[3].message = Pm_Message(0x90, 64, 100);
+ buffer[4].timestamp = buffer[0].timestamp + 3000;
+ buffer[4].message = Pm_Message(0x90, 66, 100);
+ buffer[5].timestamp = buffer[0].timestamp + 4000;
+ buffer[5].message = Pm_Message(0x90, 60, 0);
+ buffer[6].timestamp = buffer[0].timestamp + 4000;
+ buffer[6].message = Pm_Message(0x90, 62, 0);
+ buffer[7].timestamp = buffer[0].timestamp + 4000;
+ buffer[7].message = Pm_Message(0x90, 64, 0);
+ buffer[8].timestamp = buffer[0].timestamp + 4000;
+ buffer[8].message = Pm_Message(0x90, 66, 0);
+
+ Pm_Write(midi, buffer, 9);
+#ifdef SEND8
+ /* Now, we're ready for the real test.
+ Play 4 notes at now, now+500, now+1000, and now+1500
+ Then wait until now+2000.
+ Play 4 more notes as before.
+ We should hear 8 evenly spaced notes. */
+ now = Pt_Time();
+ for (i = 0; i < 4; i++) {
+ buffer[i * 2].timestamp = now + (i * 500);
+ buffer[i * 2].message = Pm_Message(0x90, 60, 100);
+ buffer[i * 2 + 1].timestamp = now + 250 + (i * 500);
+ buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0);
+ }
+ Pm_Write(midi, buffer, 8);
+
+ while (Pt_Time() < now + 2500)
+ Pt_Sleep(10);
+ /* now we are 500 ms behind schedule, but since the latency
+ is 500, the delay should not be audible */
+ now += 2000;
+ for (i = 0; i < 4; i++) {
+ buffer[i * 2].timestamp = now + (i * 500);
+ buffer[i * 2].message = Pm_Message(0x90, 60, 100);
+ buffer[i * 2 + 1].timestamp = now + 250 + (i * 500);
+ buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0);
+ }
+ Pm_Write(midi, buffer, 8);
+#endif
+ /* close device (this not explicitly needed in most implementations) */
+ printf("ready to close and terminate... (type ENTER):");
+ WAIT_FOR_ENTER
+
+ Pm_Close(midi);
+ Pm_Terminate();
+ printf("done closing and terminating...\n");
+}
+
+
+void show_usage()
+{
+ printf("Usage: test [-h] [-l latency-in-ms] [-v]\n"
+ " -h for this help message (only)\n"
+ " -l for latency\n"
+ " -v for verbose (enables more output)\n");
+}
+
+int main(int argc, char *argv[])
+{
+ int default_in;
+ int default_out;
+ int i = 0, n = 0;
+ int test_input = 0, test_output = 0, test_both = 0, somethingStupid = 0;
+ int isochronous_test = 0;
+ int stream_test = 0;
+ int latency_valid = FALSE;
+
+ show_usage();
+ if (sizeof(void *) == 8)
+ printf("Apparently this is a 64-bit machine.\n");
+ else if (sizeof(void *) == 4)
+ printf ("Apparently this is a 32-bit machine.\n");
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-h") == 0) {
+ exit(0);
+ } else if (strcmp(argv[i], "-l") == 0 && (i + 1 < argc)) {
+ i = i + 1;
+ latency = atoi(argv[i]);
+ printf("Latency will be %ld\n", (long) latency);
+ latency_valid = TRUE;
+ } else if (strcmp(argv[i], "-v") == 0) {
+ printf("Verbose is now TRUE\n");
+ verbose = TRUE; /* not currently used for anything */
+ } else {
+ show_usage();
+ exit(0);
+ }
+ }
+
+ while (!latency_valid) {
+ int lat; // declared int to match "%d"
+ printf("Latency in ms: ");
+ if (scanf("%d", &lat) == 1) {
+ latency = (int32_t) lat; // coerce from "%d" to known size
+ latency_valid = TRUE;
+ }
+ }
+
+ /* determine what type of test to run */
+ printf("begin portMidi test...\n");
+ printf("enter your choice...\n 1: test input\n"
+ " 2: test input (fail w/assert)\n"
+ " 3: test input (fail w/NULL assign)\n"
+ " 4: test output\n 5: test both\n"
+ " 6: stream test (for WinMM)\n"
+ " 7. isochronous out\n");
+ while (n != 1) {
+ n = scanf("%d", &i);
+ WAIT_FOR_ENTER
+ switch(i) {
+ case 1:
+ test_input = 1;
+ break;
+ case 2:
+ test_input = 1;
+ somethingStupid = 1;
+ break;
+ case 3:
+ test_input = 1;
+ somethingStupid = 2;
+ break;
+ case 4:
+ test_output = 1;
+ break;
+ case 5:
+ test_both = 1;
+ break;
+ case 6:
+ stream_test = 1;
+ break;
+ case 7:
+ test_output = 1;
+ isochronous_test = 1;
+ break;
+ default:
+ printf("got %d (invalid input)\n", n);
+ break;
+ }
+ }
+
+ /* list device information */
+ default_in = Pm_GetDefaultInputDeviceID();
+ default_out = Pm_GetDefaultOutputDeviceID();
+ for (i = 0; i < Pm_CountDevices(); i++) {
+ char *deflt;
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (((test_input | test_both) & info->input) |
+ ((test_output | test_both | stream_test) & info->output)) {
+ printf("%d: %s, %s", i, info->interf, info->name);
+ if (info->input) {
+ deflt = (i == default_in ? "default " : "");
+ printf(" (%sinput)", deflt);
+ }
+ if (info->output) {
+ deflt = (i == default_out ? "default " : "");
+ printf(" (%soutput)", deflt);
+ }
+ printf("\n");
+ }
+ }
+
+ /* run test */
+ if (stream_test) {
+ main_test_stream();
+ } else if (test_input) {
+ main_test_input(somethingStupid);
+ } else if (test_output) {
+ main_test_output(isochronous_test);
+ } else if (test_both) {
+ main_test_both();
+ }
+
+ printf("finished portMidi test...type ENTER to quit...");
+ WAIT_FOR_ENTER
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_test/virttest.c b/3rdparty/portmidi/pm_test/virttest.c
new file mode 100644
index 00000000000..1aeb09b8c54
--- /dev/null
+++ b/3rdparty/portmidi/pm_test/virttest.c
@@ -0,0 +1,339 @@
+/* virttest.c -- test for creating/deleting virtual ports */
+/*
+ * Roger B. Dannenberg
+ * Oct 2021
+
+This test is performed by running 2 instances of the program. The
+first instance makes input and output ports named portmidi and waits
+for a message. The second tries to do the same, but will fail because
+portmidi already exists. It then opens portmidi (both input and
+output). In greater detail:
+
+FIRST INSTANCE SECOND INSTANCE
+-------------- ---------------
+
+initialize PortMidi initialize PortMidi
+create portmidi in
+create portmidi out
+wait for input
+ create portmidi in -> fails
+ open portmidi in/out
+ send to portmidi
+recv from portmidi
+send to portmidi
+wait 1s recv from portmidi
+ close portmidi in and out
+ terminate PortMidi
+list all devices:
+ - check for correct number
+ - check for good description of portmidi in port (open)
+ - check for good description of portmidi out port (open)
+close portmidi in
+list all devices:
+ - check for correct number
+ - check for good description of portmidi in port (closed)
+ - check for good description of portmidi out port (open)
+close portmidi out
+list all devices:
+ - check for correct number
+ - check for good description of portmidi in port (closed)
+ - check for good description of portmidi out port (closed)
+delete portmidi in
+ - check for correct number
+ - check for NULL description of portmidi in port
+ - check for good description of portmidi out port (closed)
+delete portmidi out
+ - check for correct number
+ - check for NULL description of portmidi in port
+ - check for NULL description of portmidi out port
+terminate portmidi
+REPEAT 3 TIMES wait 2 seconds to give head start to other instance
+ REPEAT 3 TIMES
+ */
+
+#include "portmidi.h"
+#include "porttime.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "assert.h"
+
+#define OUTPUT_BUFFER_SIZE 0
+#define INPUT_BUFFER_SIZE 10
+#define DEVICE_INFO NULL
+#define DRIVER_INFO NULL
+#define TIME_PROC ((PmTimeProcPtr) Pt_Time)
+#define TIME_INFO NULL
+#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
+
+
+static void prompt_and_exit(void)
+{
+ printf("type ENTER...");
+ while (getchar() != '\n') ;
+ /* this will clean up open ports: */
+ exit(-1);
+}
+
+
+static PmError printerror(PmError err, const char *msg)
+{
+ if (err == pmHostError) {
+ /* it seems pointless to allocate memory and copy the string,
+ * so I will do the work of Pm_GetHostErrorText directly
+ */
+ char errmsg[80];
+ Pm_GetHostErrorText(errmsg, 80);
+ printf("%s\n %s\n", msg, errmsg);
+ } else if (err < 0) {
+ printf("%s\n %s\n", msg, Pm_GetErrorText(err));
+ }
+ return err;
+}
+
+
+static PmError checkerror(PmError err)
+{
+ if (err < 0) {
+ printerror(err, "PortMidi call failed...");
+ prompt_and_exit();
+ }
+ return err;
+}
+
+
+void wait_until(PmTimestamp when)
+{
+ PtTimestamp now = Pt_Time();
+ if (when > now) {
+ Pt_Sleep(when - now);
+ }
+}
+
+
+void show_usage()
+{
+ printf("Usage: virttest\n"
+ " run two instances to test virtual port create/delete\n");
+}
+
+
+void check_info(int id, char stat, int input, int virtual)
+{
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(id);
+ if (stat == 'd') {
+ if (info) {
+ printf("Expected device %d to be deleted.\n", id);
+ prompt_and_exit();
+ }
+ return;
+ }
+ if (!info) {
+ printf("Expected device %d to not be deleted.\n", id);
+ prompt_and_exit();
+ }
+ if (strcmp("portmidi", info->name) != 0) {
+ printf("Device %d name is %s, not \"portmidi\".\n", id, info->name);
+ prompt_and_exit();
+ }
+ if (info->input != input || (!info->output) != input) {
+ printf("Device %d input/output fields are wrong.\n", id);
+ prompt_and_exit();
+ }
+ if ((!info->opened && stat == 'o') || (info->opened && stat == 'c')) {
+ printf("Device %d opened==%d, status should be %c.\n", id,
+ info->opened, stat);
+ prompt_and_exit();
+ }
+ if (info->is_virtual != virtual) {
+ printf("Expected device %d to be virtual.\n", id);
+ prompt_and_exit();
+ }
+}
+
+
+/* stat is 'o' for open, 'c' for closed, 'd' for deleted device */
+void check_ports(int cnt, int in_id, char in_stat,
+ int out_id, char out_stat, int virtual)
+{
+ if (cnt != Pm_CountDevices()) {
+ printf("Device count changed from %d to %d.\n", cnt, Pm_CountDevices());
+ prompt_and_exit();
+ }
+ check_info(in_id, in_stat, TRUE, virtual);
+ check_info(out_id, out_stat, FALSE, virtual);
+}
+
+
+void devices_list()
+{
+ int i;
+ for (i = 0; i < Pm_CountDevices(); i++) {
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (info) {
+ printf("%d: %s %s %s %s\n", i, info->name,
+ (info->input ? "input" : "output"),
+ (info->is_virtual ? "virtual" : "real_device"),
+ (info->opened ? "opened" : "closed"));
+ }
+ }
+}
+
+
+void test2()
+{
+ PmStream *out = NULL;
+ PmStream *in = NULL;
+ int out_id;
+ int in_id;
+ PmEvent buffer[1];
+ PmTimestamp timestamp;
+ int pitch = 60;
+ int device_count = 0;
+ int i;
+
+ printf("This must be virttest instance #2\n");
+
+ /* find and open portmidi in and out */
+ device_count = Pm_CountDevices();
+ for (i = 0; i < device_count; i++) {
+ const PmDeviceInfo *info = Pm_GetDeviceInfo(i);
+ if (info && strcmp(info->name, "portmidi") == 0) {
+ if (info->input) {
+ checkerror(Pm_OpenInput(&in, i, DRIVER_INFO,
+ INPUT_BUFFER_SIZE, TIME_PROC, TIME_INFO));
+ in_id = i;
+ } else {
+ checkerror(Pm_OpenOutput(&out, i, DRIVER_INFO,
+ OUTPUT_BUFFER_SIZE, NULL, NULL, 0));
+ out_id = i;
+ }
+ }
+ }
+ if (!in) {
+ printf("Did not open portmidi as input (virtual output).\n");
+ prompt_and_exit();
+ }
+ if (!out) {
+ printf("Did not open portmidi as output (virtual input).\n");
+ prompt_and_exit();
+ }
+ printf("Input device %d and output device %d are open.\n", in_id, out_id);
+
+ /* send a message */
+ buffer[0].timestamp = 0;
+ buffer[0].message = Pm_Message(0x90, pitch, 100);
+ checkerror(Pm_Write(out, buffer, 1));
+
+ /* wait for reply */
+ printf("Sent message, waiting for reply...\n");
+ while (Pm_Read(in, buffer, 1) < 1) Pt_Sleep(10);
+
+ printf("********** GOT THE MESSAGE, SHUTTING DOWN ************\n");
+
+ /* close in */
+ checkerror(Pm_Close(in));
+ check_ports(device_count, in_id, 'c', out_id, 'o', FALSE);
+ printf("Closed input %d\n", in_id);
+
+ /* close out */
+ checkerror(Pm_Close(out));
+ check_ports(device_count, in_id, 'c', out_id, 'c', FALSE);
+ printf("Closed output %d\n", out_id);
+
+ Pt_Sleep(1000);
+ /* wrap it up */
+ Pm_Terminate();
+ printf("Got reply and terminated...\n");
+ Pt_Sleep(2000); /* 2 seconds because other is waiting 1s. */
+ /* 1 more second to make sure other shuts down before test repeats. */
+}
+
+extern int pm_check_errors;
+
+void test()
+{
+ PmStream *out;
+ PmStream *in;
+ int out_id;
+ int in_id;
+ PmEvent buffer[1];
+ PmTimestamp timestamp;
+ int device_count = 0;
+
+ TIME_START;
+
+ printf("******** INITIALIZING PORTMIDI ***********\n");
+ timestamp = Pt_Time();
+ Pm_Initialize();
+ printf("Pm_Initialize took %dms\n", Pt_Time() - timestamp);
+ devices_list();
+
+ pm_check_errors = FALSE; /* otherwise, PM_CHECK_ERRORS, if defined, */
+ /* can cause this program to report an error and exit on pmNameConflict. */
+ in_id = Pm_CreateVirtualInput("portmidi", NULL, DEVICE_INFO);
+ pm_check_errors = TRUE; /* there should be no other errors */
+ if (in_id < 0) {
+ printerror(in_id, "Pm_CreateVirtualInput failed...");
+ test2();
+ return;
+ }
+ printf("Created portmidi virtual input; this is virttest instance #1\n");
+ out_id = checkerror(Pm_CreateVirtualOutput("portmidi", NULL, DRIVER_INFO));
+ device_count = Pm_CountDevices();
+
+ checkerror(Pm_OpenInput(&in, in_id, NULL, 0, NULL, NULL));
+ checkerror(Pm_OpenOutput(&out, out_id, DRIVER_INFO, OUTPUT_BUFFER_SIZE,
+ TIME_PROC, TIME_INFO, 0));
+ printf("Created/Opened input %d and output %d\n", in_id, out_id);
+ Pm_SetFilter(in, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX);
+ /* empty the buffer after setting filter, just in case anything
+ got through */
+ while (Pm_Read(in, buffer, 1)) ;
+
+ /* wait for input */
+ printf("Waiting for input...\n");
+ while (Pm_Read(in, buffer, 1) < 1) Pt_Sleep(10);
+
+ /* send two replies (only one would be fine) */
+ checkerror(Pm_Write(out, buffer, 1));
+ printf("Received input, writing output...\n");
+
+ /* wait 1s so receiver can get the message before we shut down */
+ Pt_Sleep(1000);
+ printf("****** Closing everything and shutting down...\n");
+
+ /* expect 2 open ports */
+ check_ports(device_count, in_id, 'o', out_id, 'o', TRUE);
+ /* close in */
+ checkerror(Pm_Close(in));
+ check_ports(device_count, in_id, 'c', out_id, 'o', TRUE);
+
+ /* close out */
+ checkerror(Pm_Close(out));
+ check_ports(device_count, in_id, 'c', out_id, 'c', TRUE);
+
+ /* delete in */
+ checkerror(Pm_DeleteVirtualDevice(in_id));
+ check_ports(device_count, in_id, 'd', out_id, 'c', TRUE);
+
+ /* delete out */
+ checkerror(Pm_DeleteVirtualDevice(out_id));
+ check_ports(device_count, in_id, 'd', out_id, 'd', TRUE);
+
+ /* we are done */
+ Pm_Terminate();
+}
+
+
+int main(int argc, char *argv[])
+{
+ int i;
+ show_usage();
+ for (i = 0; i < 3; i++) {
+ test();
+ }
+ printf("finished virttest (SUCCESS). Type ENTER to quit...");
+ while (getchar() != '\n') ;
+ return 0;
+}
diff --git a/3rdparty/portmidi/pm_win/README_WIN.txt b/3rdparty/portmidi/pm_win/README_WIN.txt
index fb9cff1583d..77d18680783 100644
--- a/3rdparty/portmidi/pm_win/README_WIN.txt
+++ b/3rdparty/portmidi/pm_win/README_WIN.txt
@@ -2,7 +2,7 @@ File: PortMidi Win32 Readme
Author: Belinda Thom, June 16 2002
Revised by: Roger Dannenberg, June 2002, May 2004, June 2007,
Umpei Kurokawa, June 2007
- Roger Dannenberg Sep 2009
+ Roger Dannenberg Sep 2009, May 2022
Contents:
Using Portmidi
@@ -18,187 +18,32 @@ Contents:
USING PORTMIDI:
=============================================================================
-Using Microsoft Visual C++ project files (provided with PortMidi), there
-are two configurations of the PortMidi library. The Debug version is
-intended for debugging, especially in a console application. The Debug
-version enables some extra error checking and outputs some text as well
-as a prompt to type ENTER so that you don't lose any debugging text when
-the program exits. You can turn off this extra debugging info by taking
-out the compile-time definition for DEBUG. (But leave _DEBUG, which I
-think is important for compiling in Debug mode.) This debugging version also
-defines PM_CHECK_ERRORS, which forces a check for error return codes from
-every call to PortMidi. You can disable this checking (especially if you
-want to handle error codes in your own way) by removing PM_CHECK_ERRORS
-from the predefined symbols list in the Settings dialog box.
+I recommend building a static library and linking with your
+application. PortMidi is not large. See ../README.md for
+basic compiling instructions.
-PortMidi is designed to run without a console and should work perfectly
-well within a graphical user interface application. The Release version
-is both optimized and lacking the debugging printout code of the Debug
-version.
-
-Read the portmidi.h file for PortMidi API details on using the PortMidi API.
-See <...>\pm_test\test.c and other files in pm_test for usage examples.
-
-=============================================================================
-TO INSTALL PORTMIDI:
-=============================================================================
-1) get current source from the portmedia project at SourceForge.net
-
-2) copy source into directory: <...>\portmidi
-
-=============================================================================
-TO COMPILE PORTMIDI:
-=============================================================================
-
-3) cd to or open the portmidi directory
-
-4) start or click on the portmidi.sln workspace (note, all Visual Studio
- files are built by CMake. If you need a different version or have
- problems with paths, try rebuilding the Visual Studio project files
- using CMake -- See "Using other versions of visual C++" below.)
-
-5) the following projects exist within this workspace:
- - portmidi-static, portmidi-dynamic (versions of the PortMidi library)
- - test (simple midi I/O testing)
- - midithread (an example illustrating low-latency MIDI processing
- using a dedicated low-latency thread)
- - sysex (simple sysex message I/O testing)
- - latency (uses porttime to measure system latency)
- - midithru (an example illustrating software MIDI THRU)
- - qtest (a test of the new multicore-safe queue implementation)
- - mm (allows monitoring of midi messages)
- - pmjni (a dll to provide an interface to PortMidi for Java)
-
-6) set the Java SDK path using one of two methods:
- Method 1: open portmidi/CMakeLists.txt with CMake, configure, and
- generate -- this should find the Java SDK path and update your
- solution and project files
- Method 2: (does not require CMake):
- - open the pmjni project properties
- - visit Configuration Properties, C/C++, General
- - find Additional Include Directories property and open the editor (...)
- - at the end of the list, you will find two paths mentioning Java
- - these are absolute paths to the Java SDK; you'll need to install the
- Java SDK (from Sun) and update these directories in order to build
- this project.
- - similarly, the Linker->Input->Additional Dependencies list has a
- path to the jvm.lib file, which needs to be correct(ed).
-
-6) use Build->Batch Build ... to build everything in the project. If a
- build fails, try building again. There seem to be some missing
- dependencies, so you may have to "ALL_BUILD" several times before
- everything builds successfully.
-
-7) The settings for these projects were distributed in the zip file, so
- compile should just work.
-
-8) run test project; use the menu that shows up from the command prompt to
- test that portMidi works on your system. tests include:
- - verify midi output works
- - verify midi input works
-
-9) run other projects if you wish: sysex, latency, midithread, mm,
- qtest, midithru
-
-10) compile the java code:
- - cd pm_java
- - make.bat
- + If there is a problem running javac, note that you must have
- a path to javac.exe on your PATH environment variable. Edit
- your path (in Vista) using Control Panel > User Accounts >
- User Accounts > Change my environment variables; then select
- Path and click Edit... After changing, you will have to
- restart the command window to see any effect.
- + In Vista, you may get a warning about running
- UpdateRsrcJavaExe.exe. This is called by make.bat, and you
- should allow the program to run.
- + Note that make.bat does not build pmjni\jportmidi_JPortMidiApi.h
- because it is included in the distribution. You can rebuild it
- from sources as follows:
- cd pm_java
- javah jportmidi.JPortMidiApi
- move jportmidi_JPortMidiApi pmjni\jportmidi_JPortMidiApi.h
-
-11) you might wish to move pm_java/win32 to another location; run the
- pmdefaults.exe program from the (entire) win32 directory to use
- PmDefaults. This program let's you select default input/output
- midi devices for PortMidi applications.
-
-============================================================================
-ABOUT CMAKE
-============================================================================
-
-cmake was used to generate .vcproj files. cmake embeds absolute paths
-into .vcproj files, which makes the files non-portable to other systems.
-To work around this problem, pm_win\clean_up_vcproj.bat can be used to
-replace absolute paths with relative paths. To use it, you will need to
-install gawk and set your search path to allow you to execute gawk, e.g.
-my path includes "C:\Program Files\GnuWin32\bin;". You will also need to
-edit pm_win\clean_up_vcproj.awk, replacing C:\Users\rbd\portmidi with
-whatever absolute path cmake uses in your vcproj files.
-
-This is not a general or robust fix, but it seems to work with the
-vcproj files currently created by CMake.
-
-============================================================================
-USING OTHER VERSIONS OF VISUAL C++
-============================================================================
+The Windows version has a couple of extra switches: You can define
+DEBUG and MMDEBUG for a few extra messages (see the code).
-You can use cmake to make Visual Studio solution and project files.
-If you do not want to use the provided Version 9 project files, install
-cmake, run it, set the "Where is the source code" box to your portmidi
-directory, and click on Configure. A menu will allow you to choose the
-Visual Studio project version you want. Click Configure once again, then
-Generate, and you should be all set to open portmidi.sln.
+If PM_CHECK_ERRORS is defined, PortMidi reports and exits on any
+error. This requires terminal output to see, and aborts your
+application, so it's only intended for quick command line programs
+where you do not care to check return values and handle errors
+more robustly.
-============================================================================
-TO CREATE YOUR OWN PORTMIDI CLIENT APPLICATION:
-============================================================================
-
-NOTE: this section needs to be reviewed and tested. My suggestion would
-be to copy the test project file (test.dsp) and modify it. -RBD
+PortMidi is designed to run without a console and should work perfectly
+well within a graphical user interface application.
-The easiest way is to start a new project w/in the portMidi workspace:
+Read the portmidi.h file for PortMidi API details on using the PortMidi API.
+See <...>\pm_test\testio.c and other files in pm_test for usage examples.
-1) To open new project:
- - File->New->Projects
- - Location: <...>\portmidi\<yourProjectName>
- - check Add to current workspace
- - select Win32 Console Application (recommended for now)
- - do *NOT* select the "make dependency" box (you will explicitly do this
- in the next step)
- - Click OK
- - Select "An Empty Project" and click Finish
+There are many other programs in pm_test, including a MIDI monitor.
- In Visual C++ 2005 Express Edition,
- - File->New->Projects
- - Location: <...>\portmidi\<yourProjectName>
- - select Add to solution
- - select CLR Empty project in CLR
- - select Win32 Console Application in Win32
- - select Empty project in General
-
-2) Now this project will be the active project. Make it explicitly depend
- on PortMidi dll:
- - Project->Dependencies
- - Click pm_dll
-
-3) add whatever files you wish to add to your new project, using portMidi
- calls as desired (see USING PORTMIDI at top of this readme)
-
-4) when you include portMidi files, do so like this:
- - #include "..\pm_common\portmidi.h"
- - etc.
-
-5) build and run your project
============================================================================
DESIGN NOTES
============================================================================
-PortMidi for Win32 exists as a simple static library,
-with Win32-specific code in pmwin.c and MM-specific code in pmwinmm.c.
-
Orderly cleanup after errors are encountered is based on a fixed order of
steps and state changes to reflect each step. Here's the order:
@@ -218,8 +63,7 @@ To open input:
- return
- return
-SYSEX HANDLING -- the most complex, least exercised, and therefore most
- buggy part of PortMidi (but maybe bugs are finally gone)
+SYSEX HANDLING
There are three cases: simple output, stream output, input
Each must deal with:
@@ -327,15 +171,4 @@ part of PortMidi is allowed to directly copy sysex bytes to
"fill_base[*fill_offset_ptr++]" until *fill_offset_ptr reaches
fill_length. See the code for details.
------------
-
-Additional notes on using VS 2005 (maybe this is obsolete now?):
-
-1) Make sure "Configuration: All Configurations" is selected in all of the following Properties modifications!
-
-2) In my case the project defaulted to compiling all .c files with the C++ compiler, which was disastrous. I had to go to set Properties for each file, to wit: Expand Configuration Properties, Expand C/C++, Select Advanced, set the Compile As popup to Compile as C Code (/TC). (For better or worse, the project I inherited has a bunch of .c files that rely on C++ features, so I couldn't reliably set this the project properties level.)
-
-3) While you're there, make sure that the C/C++ -> General -> "Compile with Common Language Runtime support" is set to "No Common Language Runtime support" (the C compiler *can't* support CLR, but VS won't do anything useful like automatically set the two options to match)-.
-
-4) I never got VS precompiled header thing to work sensibly, so I took the path of least resistance and turned PCH's off for all my files. Properties -> Configuration Properties -> C/C++ -> Precompiled Headers -> Create/Use Precompiled Header popup set to "Not Using Precompiled Headers". The compiler is reasonably fast even if it has to parse all the header files, so unless someone wants to explain VS's PCHs to me, the hell with it, I say.
diff --git a/3rdparty/portmidi/pm_win/clean_cmake.bat b/3rdparty/portmidi/pm_win/clean_cmake.bat
deleted file mode 100644
index e9579e67d3f..00000000000
--- a/3rdparty/portmidi/pm_win/clean_cmake.bat
+++ /dev/null
@@ -1,6 +0,0 @@
-del /Q ..\CMakeFiles
-del /Q ..\CMakeCache.txt
-del /Q ..\pm_test\CMakeFiles
-del /Q ..\pm_common\CMakeFiles
-del /Q ..\pm_dylib\CMakeFiles
-
diff --git a/3rdparty/portmidi/pm_win/clean_up_vcproj.awk b/3rdparty/portmidi/pm_win/clean_up_vcproj.awk
deleted file mode 100644
index a3eadfcb848..00000000000
--- a/3rdparty/portmidi/pm_win/clean_up_vcproj.awk
+++ /dev/null
@@ -1,70 +0,0 @@
-# gawk script to convert CMake-generated Visual Studio projects into
-# stand-alone project files
-#
-# Roger Dannenberg, October 2009
-#
-# the result uses relative path names (so you can install the project on
-# any machine and use it)
-#
-# NOTE: to run this, you must assign base_relative to the relative path
-# from the vcproj file to portmidi, e.g. base_relative=.. or base_relative=.
-
-BEGIN {
- state = "normal";
- #=================IMPORTANT====================
- # change the following path to the path in which
- # the CMakeLists.txt file resides:
- base_path = "C:\\\\Users\\\\rbd\\\\portmedia\\\\portmidi";
- #==============================================
-
- base_path_2 = base_path;
- gsub("\\\\\\\\", "/", base_path_2)
- cmake_stuff = 0; # flag to print <file> ... </file> text
-}
-# this case removes CMake phases from project
-state == "cmakelists" {
- # print "IN CMAKELISTS "
- file_text = file_text "\n" $0 # collect the <file> ... </file> section
- if (index($0, "CMakeLists.txt") > 0) {
- cmake_stuff = 1 # remember to delete this <file> ... </file> section
- }
-
- if (index($0, "</File>") > 0) {
- state = "normal";
- if (cmake_stuff == 0) {
- gsub(base_path, base_relative, file_text)
- gsub(base_path_2, base_relative, file_text)
- print file_text;
- }
- cmake_stuff = 0;
- };
- next
-}
-
-# this is the normal case, not in buildPhases list
-state == "normal" {
- # print "NOT IN BUILD PHASES"
- # take out all the absolute paths
- gsub(base_path, base_relative, $0);
- gsub(base_path_2, base_relative, $0);
- # special processing for <file> ... </file> text:
- if ($0 ~ "<File$") {
- file_text = $0;
- cmake_stuff = 0; # innocent (keep text) until proven guilty
- state = "cmakelists";
- next # do not print this line
- };
- # THIS CODE WOULD ALLOW portmidi-static and portmidi-dynamic IN
- # pm_commmon. I DECIDED TO TRY PUTTING THEM IN SEPARATE DIRECTORIES
- # INSTEAD.
- # Use static libraries for everything except portmidi-dynamic
- #if (($0 ~ "RuntimeLibrary=") && (base_relative ~ "dynamic")) {
- # if ($0 ~ 2) {
- # $0 = "\t\t\t\tRuntimeLibrary=\"0\"";
- # } else if ($0 ~ 3) {
- # $0 = "\t\t\t\tRuntimeLibrary=\"1\"";
- # }
- print $0;
- next
-}
-
diff --git a/3rdparty/portmidi/pm_win/clean_up_vcproj.bat b/3rdparty/portmidi/pm_win/clean_up_vcproj.bat
deleted file mode 100644
index 0557876431c..00000000000
--- a/3rdparty/portmidi/pm_win/clean_up_vcproj.bat
+++ /dev/null
@@ -1,76 +0,0 @@
-@echo off
-rem Start this program in portmidi\pm_win
-cd ..\pm_common
-
-rename portmidi-static.vcproj portmidi-static.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. portmidi-static.vcproj-cmake > portmidi-static.vcproj
-del portmidi-static.vcproj-cmake
-echo portmidi-static
-
-rename pmjni.vcproj pmjni.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. pmjni.vcproj-cmake > pmjni.vcproj
-del pmjni.vcproj-cmake
-echo pmjni
-
-cd ../pm_dylib
-
-rename portmidi-dynamic.vcproj portmidi-dynamic.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. portmidi-dynamic.vcproj-cmake > portmidi-dynamic.vcproj
-del portmidi-dynamic.vcproj-cmake
-echo portmidi-dynamic
-
-cd ..\pm_test
-
-rename latency.vcproj latency.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. latency.vcproj-cmake > latency.vcproj
-del latency.vcproj-cmake
-echo latency
-
-rename midiclock.vcproj midiclock.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. midiclock.vcproj-cmake > midiclock.vcproj
-del midiclock.vcproj-cmake
-echo midiclock
-
-rename midithread.vcproj midithread.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. midithread.vcproj-cmake > midithread.vcproj
-del midithread.vcproj-cmake
-echo midithread
-
-rename midithru.vcproj midithru.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. midithru.vcproj-cmake > midithru.vcproj
-del midithru.vcproj-cmake
-echo midithru
-
-rename mm.vcproj mm.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. mm.vcproj-cmake > mm.vcproj
-del mm.vcproj-cmake
-echo mm
-
-rename qtest.vcproj qtest.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. qtest.vcproj-cmake > qtest.vcproj
-del qtest.vcproj-cmake
-echo qtest
-
-rename sysex.vcproj sysex.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. sysex.vcproj-cmake > sysex.vcproj
-del sysex.vcproj-cmake
-echo sysex
-
-rename test.vcproj test.vcproj-cmake
-gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. test.vcproj-cmake > test.vcproj
-del test.vcproj-cmake
-
-cd ..
-echo test
-
-rename ALL_BUILD.vcproj ALL_BUILD.vcproj-cmake
-gawk -f pm_win\clean_up_vcproj.awk -v base_relative=. ALL_BUILD.vcproj-cmake > ALL_BUILD.vcproj
-del ALL_BUILD.vcproj-cmake
-echo ALL_BUILD
-
-rename ZERO_CHECK.vcproj ZERO_CHECK.vcproj-cmake
-gawk -f pm_win\clean_up_vcproj.awk -v base_relative=. ZERO_CHECK.vcproj-cmake > ZERO_CHECK.vcproj
-del ZERO_CHECK.vcproj-cmake
-echo ZERO_CHECK
-
-cd pm_win
diff --git a/3rdparty/portmidi/pm_win/pmwin.c b/3rdparty/portmidi/pm_win/pmwin.c
index a57ed878df6..cca83be08ca 100644
--- a/3rdparty/portmidi/pm_win/pmwin.c
+++ b/3rdparty/portmidi/pm_win/pmwin.c
@@ -20,7 +20,6 @@
#ifdef DEBUG
#include "stdio.h"
#endif
-#undef UNICODE
#include <windows.h>
/* pm_exit is called when the program exits.
@@ -29,23 +28,21 @@
*/
static void pm_exit(void) {
pm_term();
-#ifdef DEBUG
-#define STRING_MAX 80
- {
- char line[STRING_MAX];
- printf("Type ENTER...\n");
- /* note, w/o this prompting, client console application can not see one
- of its errors before closing. */
- fgets(line, STRING_MAX, stdin);
- }
-#endif
}
+static BOOL WINAPI ctrl_c_handler(DWORD fdwCtrlType)
+{
+ exit(1); /* invokes pm_exit() */
+ ExitProcess(1); /* probably never called */
+ return TRUE;
+}
+
/* pm_init is the windows-dependent initialization.*/
void pm_init(void)
{
atexit(pm_exit);
+ SetConsoleCtrlHandler(ctrl_c_handler, TRUE);
#ifdef DEBUG
printf("registered pm_exit with atexit()\n");
#endif
@@ -59,40 +56,41 @@ void pm_term(void) {
}
-static PmDeviceID pm_get_default_device_id(int is_input, char *key) {
+static PmDeviceID pm_get_default_device_id(int is_input, const char *key) {
HKEY hkey;
#define PATTERN_MAX 256
char pattern[PATTERN_MAX];
- DWORD pattern_max = PATTERN_MAX;
+ long pattern_max = PATTERN_MAX;
DWORD dwType;
/* Find first input or device -- this is the default. */
PmDeviceID id = pmNoDevice;
int i, j;
Pm_Initialize(); /* make sure descriptors exist! */
- for (i = 0; i < pm_descriptor_index; i++) {
- if (descriptors[i].pub.input == is_input) {
+ for (i = 0; i < pm_descriptor_len; i++) {
+ if (pm_descriptors[i].pub.input == is_input) {
id = i;
break;
}
}
/* Look in registry for a default device name pattern. */
- if (RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey) !=
+ if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) {
return id;
}
- if (RegOpenKeyExA(hkey, "JavaSoft", 0, KEY_READ, &hkey) !=
+ if (RegOpenKeyEx(hkey, "JavaSoft", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) {
return id;
}
- if (RegOpenKeyExA(hkey, "Prefs", 0, KEY_READ, &hkey) !=
+ if (RegOpenKeyEx(hkey, "Prefs", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) {
return id;
}
- if (RegOpenKeyExA(hkey, "/Port/Midi", 0, KEY_READ, &hkey) !=
+ if (RegOpenKeyEx(hkey, "/Port/Midi", 0, KEY_READ, &hkey) !=
ERROR_SUCCESS) {
return id;
}
- if (RegQueryValueExA(hkey, key, NULL, &dwType, (BYTE *)pattern, &pattern_max) !=
+ if (RegQueryValueEx(hkey, key, NULL, &dwType, (BYTE *) pattern,
+ (DWORD *) &pattern_max) !=
ERROR_SUCCESS) {
return id;
}
@@ -118,15 +116,15 @@ static PmDeviceID pm_get_default_device_id(int is_input, char *key) {
}
-PmDeviceID Pm_GetDefaultInputDeviceID() {
+PmDeviceID Pm_GetDefaultInputDeviceID(void) {
return pm_get_default_device_id(TRUE,
- (char *)"/P/M_/R/E/C/O/M/M/E/N/D/E/D_/I/N/P/U/T_/D/E/V/I/C/E");
+ "/P/M_/R/E/C/O/M/M/E/N/D/E/D_/I/N/P/U/T_/D/E/V/I/C/E");
}
-PmDeviceID Pm_GetDefaultOutputDeviceID() {
+PmDeviceID Pm_GetDefaultOutputDeviceID(void) {
return pm_get_default_device_id(FALSE,
- (char *)"/P/M_/R/E/C/O/M/M/E/N/D/E/D_/O/U/T/P/U/T_/D/E/V/I/C/E");
+ "/P/M_/R/E/C/O/M/M/E/N/D/E/D_/O/U/T/P/U/T_/D/E/V/I/C/E");
}
diff --git a/3rdparty/portmidi/pm_win/pmwinmm.c b/3rdparty/portmidi/pm_win/pmwinmm.c
index f8b97301bc7..dfe0255ac22 100644
--- a/3rdparty/portmidi/pm_win/pmwinmm.c
+++ b/3rdparty/portmidi/pm_win/pmwinmm.c
@@ -1,16 +1,12 @@
/* pmwinmm.c -- system specific definitions */
-#ifdef _MSC_VER
- #pragma warning(disable: 4133) // stop warnings about implicit typecasts
-#endif
-
#ifndef _WIN32_WINNT
/* without this define, InitializeCriticalSectionAndSpinCount is
* undefined. This version level means "Windows 2000 and higher"
*/
#define _WIN32_WINNT 0x0500
#endif
-#undef UNICODE
+
#include "windows.h"
#include "mmsystem.h"
#include "portmidi.h"
@@ -20,28 +16,10 @@
#include <string.h>
#include "porttime.h"
-#ifndef _WINDOWS_H
-typedef unsigned int UINT32;
-#endif
-
-#ifndef _WINDOWS_H
-#ifdef _MSC_VER
-typedef unsigned __int64 UINT64;
-#else
-__extension__ typedef unsigned long long UINT64;
-#endif
-#endif
-
-#ifdef PTR64
-typedef UINT64 FPTR;
-#else
-typedef UINT32 FPTR;
-#endif
-
/* asserts used to verify portMidi code logic is sound; later may want
something more graceful */
#include <assert.h>
-#ifdef DEBUG
+#ifdef MMDEBUG
/* this printf stuff really important for debugging client app w/host errors.
probably want to do something else besides read/write from/to console
for portability, however */
@@ -59,13 +37,9 @@ static void CALLBACK winmm_in_callback(HMIDIIN hMidiIn,
UINT wMsg, DWORD_PTR dwInstance,
DWORD_PTR dwParam1, DWORD_PTR dwParam2);
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
- DWORD_PTR dwInstance, DWORD_PTR dwParam1,
+ DWORD_PTR dwInstance,
+ DWORD_PTR dwParam1,
DWORD_PTR dwParam2);
-#ifdef USE_SYSEX_BUFFERS
-static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg,
- DWORD_PTR dwInstance, DWORD_PTR dwParam1,
- DWORD_PTR dwParam2);
-#endif
extern pm_fns_node pm_winmm_in_dictionary;
extern pm_fns_node pm_winmm_out_dictionary;
@@ -115,10 +89,6 @@ The following constants help to represent these design parameters:
#define MIDIHDR_SYSEX_BUFFER_LENGTH(x) ((x) + sizeof(long)*3)
/* A MIDIHDR with a sysex message is the buffer length plus the header size */
#define MIDIHDR_SYSEX_SIZE(x) (MIDIHDR_SYSEX_BUFFER_LENGTH(x) + sizeof(MIDIHDR))
-#ifdef USE_SYSEX_BUFFERS
-/* Size of a MIDIHDR with a buffer contaning multiple MIDIEVENT structures */
-#define MIDIHDR_SIZE(x) ((x) + sizeof(MIDIHDR))
-#endif
/*
==============================================================================
@@ -135,7 +105,7 @@ MIDIOUTCAPS midi_out_mapper_caps;
UINT midi_num_outputs = 0;
/* per device info */
-typedef struct midiwinmm_struct {
+typedef struct winmm_info_struct {
union {
HMIDISTRM stream; /* windows handle for stream */
HMIDIOUT out; /* windows handle for out calls */
@@ -151,13 +121,6 @@ typedef struct midiwinmm_struct {
int num_buffers; /* how many buffers allocated in buffers array */
int next_buffer; /* index of next buffer to send */
HANDLE buffer_signal; /* used to wait for buffer to become free */
-#ifdef USE_SYSEX_BUFFERS
- /* sysex buffers will be allocated only when
- * a sysex message is sent. The size of the buffer is fixed.
- */
- LPMIDIHDR sysex_buffers[NUM_SYSEX_BUFFERS]; /* pool of buffers for sysex data */
- int next_sysex_buffer; /* index of next sysexbuffer to send */
-#endif
unsigned long last_time; /* last output time */
int first_message; /* flag: treat first message differently */
int sysex_mode; /* middle of sending sysex */
@@ -167,9 +130,8 @@ typedef struct midiwinmm_struct {
unsigned long sync_time; /* when did we last determine delta? */
long delta; /* difference between stream time and
real time */
- int error; /* host error from doing port midi call */
CRITICAL_SECTION lock; /* prevents reentrant callbacks (input only) */
-} midiwinmm_node, *midiwinmm_type;
+} winmm_info_node, *winmm_info_type;
/*
@@ -198,9 +160,9 @@ static void pm_winmm_general_inputs(void)
if (wRtn == MMSYSERR_NOERROR) {
/* ignore errors here -- if pm_descriptor_max is exceeded, some
devices will not be accessible. */
- pm_add_device((char *)"MMSystem", midi_in_caps[i].szPname, TRUE,
- (void *)(FPTR)i,
- &pm_winmm_in_dictionary);
+#pragma warning(suppress: 4047) // coerce non-pointer to pointer is OK
+ pm_add_device("MMSystem", midi_in_caps[i].szPname, TRUE, FALSE,
+ (void *) (intptr_t) i, &pm_winmm_in_dictionary);
}
}
}
@@ -217,8 +179,9 @@ static void pm_winmm_mapper_input(void)
(LPMIDIINCAPS) & midi_in_mapper_caps,
sizeof(MIDIINCAPS));
if (wRtn == MMSYSERR_NOERROR) {
- pm_add_device((char *)"MMSystem", midi_in_mapper_caps.szPname, TRUE,
- (void *)(FPTR)MIDIMAPPER, &pm_winmm_in_dictionary);
+#pragma warning(suppress: 4047) // coerce non-pointer to pointer is OK
+ pm_add_device("MMSystem", midi_in_mapper_caps.szPname, TRUE, FALSE,
+ (void *) (intptr_t) MIDIMAPPER, &pm_winmm_in_dictionary);
}
}
@@ -228,7 +191,7 @@ static void pm_winmm_general_outputs(void)
UINT i;
DWORD wRtn;
midi_num_outputs = midiOutGetNumDevs();
- midi_out_caps = pm_alloc( sizeof(MIDIOUTCAPS) * midi_num_outputs );
+ midi_out_caps = pm_alloc(sizeof(MIDIOUTCAPS) * midi_num_outputs);
if (midi_out_caps == NULL) {
/* no error is reported -- see pm_winmm_general_inputs */
@@ -239,9 +202,9 @@ static void pm_winmm_general_outputs(void)
wRtn = midiOutGetDevCaps(i, (LPMIDIOUTCAPS) & midi_out_caps[i],
sizeof(MIDIOUTCAPS));
if (wRtn == MMSYSERR_NOERROR) {
- pm_add_device((char *)"MMSystem", midi_out_caps[i].szPname, FALSE,
- (void *)(FPTR)i,
- &pm_winmm_out_dictionary);
+#pragma warning(suppress: 4047) // coerce non-pointer to pointer is OK
+ pm_add_device("MMSystem", midi_out_caps[i].szPname, FALSE, FALSE,
+ (void *) (intptr_t) i, &pm_winmm_out_dictionary);
}
}
}
@@ -256,23 +219,18 @@ static void pm_winmm_mapper_output(void)
wRtn = midiOutGetDevCaps((UINT) MIDIMAPPER, (LPMIDIOUTCAPS)
& midi_out_mapper_caps, sizeof(MIDIOUTCAPS));
if (wRtn == MMSYSERR_NOERROR) {
- pm_add_device((char *)"MMSystem", midi_out_mapper_caps.szPname, FALSE,
- (void *)(FPTR)MIDIMAPPER, &pm_winmm_out_dictionary);
+#pragma warning(suppress: 4047) // coerce non-pointer to pointer is OK
+ pm_add_device("MMSystem", midi_out_mapper_caps.szPname, FALSE, FALSE,
+ (void *) (intptr_t) MIDIMAPPER, &pm_winmm_out_dictionary);
}
}
/*
-=========================================================================================
+============================================================================
host error handling
-=========================================================================================
+============================================================================
*/
-static unsigned int winmm_has_host_error(PmInternal * midi)
-{
- midiwinmm_type m = (midiwinmm_type)midi->descriptor;
- return m->error;
-}
-
/* str_copy_len -- like strcat, but won't overrun the destination string */
/*
@@ -280,41 +238,30 @@ static unsigned int winmm_has_host_error(PmInternal * midi)
*/
static int str_copy_len(char *dst, char *src, int len)
{
+ // Note: Visual C will suggest using a non-portable strncpy_s here
+#pragma warning(suppress: 4996) // suppress warning for just this line
strncpy(dst, src, len);
/* just in case suffex is greater then len, terminate with zero */
dst[len - 1] = 0;
- return strlen(dst);
+ return (int) strlen(dst);
}
-static void winmm_get_host_error(PmInternal * midi, char * msg, UINT len)
+static unsigned int winmm_check_host_error(PmInternal *midi)
{
- /* precondition: midi != NULL */
- midiwinmm_node * m = (midiwinmm_node *) midi->descriptor;
- char *hdr1 = (char *)"Host error: ";
- //char *hdr2 = (char *)"Host callback error: ";
-
- msg[0] = 0; /* initialize result string to empty */
-
- if (descriptors[midi->device_id].pub.input) {
- /* input and output use different winmm API calls */
- if (m) { /* make sure there is an open device to examine */
- if (m->error != MMSYSERR_NOERROR) {
- int n = str_copy_len(msg, hdr1, len);
- /* read and record host error */
- midiInGetErrorText(m->error, msg + n, len - n);
- //assert(err == MMSYSERR_NOERROR);
- m->error = MMSYSERR_NOERROR;
- }
- }
- } else { /* output port */
- if (m) {
- if (m->error != MMSYSERR_NOERROR) {
- int n = str_copy_len(msg, hdr1, len);
- midiOutGetErrorText(m->error, msg + n, len - n);
- //assert(err == MMSYSERR_NOERROR);
- m->error = MMSYSERR_NOERROR;
- }
+ return FALSE;
+}
+
+
+static void improve_winerr(int pm_hosterror, char *message)
+{
+ if (pm_hosterror == MMSYSERR_NOMEM) {
+ /* add explanation to Window's confusing error message */
+ /* if there's room: */
+ if (PM_HOST_ERROR_MSG_LEN - strlen(pm_hosterror_text) > 60) {
+#pragma warning(suppress: 4996) // don't use suggested strcat_s
+ strcat(pm_hosterror_text, " Probably this MIDI device is open "
+ "in another application.");
}
}
}
@@ -339,123 +286,59 @@ static MIDIHDR *allocate_buffer(long data_size)
return hdr;
}
-#ifdef USE_SYSEX_BUFFERS
-static MIDIHDR *allocate_sysex_buffer(long data_size)
-{
- /* we're actually allocating more than data_size because the buffer
- * will include the MIDIEVENT header in addition to the data
- */
- LPMIDIHDR hdr = (LPMIDIHDR) pm_alloc(MIDIHDR_SYSEX_SIZE(data_size));
- MIDIEVENT *evt;
- if (!hdr) return NULL;
- evt = (MIDIEVENT *) (hdr + 1); /* place MIDIEVENT after header */
- hdr->lpData = (LPSTR) evt;
- hdr->dwFlags = 0;
- hdr->dwUser = 0;
- return hdr;
-}
-#endif
-static PmError allocate_buffers(midiwinmm_type m, long data_size, long count)
+static PmError allocate_buffers(winmm_info_type info, long data_size,
+ long count)
{
int i;
/* buffers is an array of count pointers to MIDIHDR/MIDIEVENT struct */
- m->num_buffers = 0; /* in case no memory can be allocated */
- m->buffers = (LPMIDIHDR *) pm_alloc(sizeof(LPMIDIHDR) * count);
- if (!m->buffers) return pmInsufficientMemory;
- m->max_buffers = count;
+ info->num_buffers = 0; /* in case no memory can be allocated */
+ info->buffers = (LPMIDIHDR *) pm_alloc(sizeof(LPMIDIHDR) * count);
+ if (!info->buffers) return pmInsufficientMemory;
+ info->max_buffers = count;
for (i = 0; i < count; i++) {
LPMIDIHDR hdr = allocate_buffer(data_size);
if (!hdr) { /* free everything allocated so far and return */
- for (i = i - 1; i >= 0; i--) pm_free(m->buffers[i]);
- pm_free(m->buffers);
- m->max_buffers = 0;
+ for (i = i - 1; i >= 0; i--) pm_free(info->buffers[i]);
+ pm_free(info->buffers);
+ info->max_buffers = 0;
return pmInsufficientMemory;
}
- m->buffers[i] = hdr; /* this may be NULL if allocation fails */
+ info->buffers[i] = hdr; /* this may be NULL if allocation fails */
}
- m->num_buffers = count;
+ info->num_buffers = count;
return pmNoError;
}
-#ifdef USE_SYSEX_BUFFERS
-static PmError allocate_sysex_buffers(midiwinmm_type m, long data_size)
-{
- PmError rslt = pmNoError;
- /* sysex_buffers is an array of count pointers to MIDIHDR/MIDIEVENT struct */
- int i;
- for (i = 0; i < NUM_SYSEX_BUFFERS; i++) {
- LPMIDIHDR hdr = allocate_sysex_buffer(data_size);
-
- if (!hdr) rslt = pmInsufficientMemory;
- m->sysex_buffers[i] = hdr; /* this may be NULL if allocation fails */
- hdr->dwFlags = 0; /* mark as free */
- }
- return rslt;
-}
-#endif
-
-#ifdef USE_SYSEX_BUFFERS
-static LPMIDIHDR get_free_sysex_buffer(PmInternal *midi)
-{
- LPMIDIHDR r = NULL;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- if (!m->sysex_buffers[0]) {
- if (allocate_sysex_buffers(m, SYSEX_BYTES_PER_BUFFER)) {
- return NULL;
- }
- }
- /* busy wait until we find a free buffer */
- while (TRUE) {
- int i;
- for (i = 0; i < NUM_SYSEX_BUFFERS; i++) {
- /* cycle through buffers, modulo NUM_SYSEX_BUFFERS */
- m->next_sysex_buffer++;
- if (m->next_sysex_buffer >= NUM_SYSEX_BUFFERS) m->next_sysex_buffer = 0;
- r = m->sysex_buffers[m->next_sysex_buffer];
- if ((r->dwFlags & MHDR_PREPARED) == 0) goto found_sysex_buffer;
- }
- /* after scanning every buffer and not finding anything, block */
- if (WaitForSingleObject(m->buffer_signal, 1000) == WAIT_TIMEOUT) {
-#ifdef DEBUG
- printf("PortMidi warning: get_free_sysex_buffer() wait timed out after 1000ms\n");
-#endif
- }
- }
-found_sysex_buffer:
- r->dwBytesRecorded = 0;
- r->dwBufferLength = 0; /* changed to correct value later */
- return r;
-}
-#endif
static LPMIDIHDR get_free_output_buffer(PmInternal *midi)
{
LPMIDIHDR r = NULL;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
while (TRUE) {
int i;
- for (i = 0; i < m->num_buffers; i++) {
- /* cycle through buffers, modulo m->num_buffers */
- m->next_buffer++;
- if (m->next_buffer >= m->num_buffers) m->next_buffer = 0;
- r = m->buffers[m->next_buffer];
+ for (i = 0; i < info->num_buffers; i++) {
+ /* cycle through buffers, modulo info->num_buffers */
+ info->next_buffer++;
+ if (info->next_buffer >= info->num_buffers) info->next_buffer = 0;
+ r = info->buffers[info->next_buffer];
if ((r->dwFlags & MHDR_PREPARED) == 0) goto found_buffer;
}
/* after scanning every buffer and not finding anything, block */
- if (WaitForSingleObject(m->buffer_signal, 1000) == WAIT_TIMEOUT) {
-#ifdef DEBUG
- printf("PortMidi warning: get_free_output_buffer() wait timed out after 1000ms\n");
+ if (WaitForSingleObject(info->buffer_signal, 1000) == WAIT_TIMEOUT) {
+#ifdef MMDEBUG
+ printf("PortMidi warning: get_free_output_buffer() "
+ "wait timed out after 1000ms\n");
#endif
/* if we're trying to send a sysex message, maybe the
* message is too big and we need more message buffers.
* Expand the buffer pool by 128KB using 1024-byte buffers.
*/
/* first, expand the buffers array if necessary */
- if (!m->buffers_expanded) {
+ if (!info->buffers_expanded) {
LPMIDIHDR *new_buffers = (LPMIDIHDR *) pm_alloc(
- (m->num_buffers + NUM_EXPANSION_BUFFERS) *
- sizeof(LPMIDIHDR));
+ (info->num_buffers + NUM_EXPANSION_BUFFERS) *
+ sizeof(LPMIDIHDR));
/* if no memory, we could return a no-memory error, but user
* probably will be unprepared to deal with it. Maybe the
* MIDI driver is temporarily hung so we should just wait.
@@ -463,21 +346,21 @@ static LPMIDIHDR get_free_output_buffer(PmInternal *midi)
*/
if (!new_buffers) continue;
/* copy buffers to new_buffers and replace buffers */
- memcpy(new_buffers, m->buffers,
- m->num_buffers * sizeof(LPMIDIHDR));
- pm_free(m->buffers);
- m->buffers = new_buffers;
- m->max_buffers = m->num_buffers + NUM_EXPANSION_BUFFERS;
- m->buffers_expanded = TRUE;
+ memcpy(new_buffers, info->buffers,
+ info->num_buffers * sizeof(LPMIDIHDR));
+ pm_free(info->buffers);
+ info->buffers = new_buffers;
+ info->max_buffers = info->num_buffers + NUM_EXPANSION_BUFFERS;
+ info->buffers_expanded = TRUE;
}
/* next, add one buffer and return it */
- if (m->num_buffers < m->max_buffers) {
+ if (info->num_buffers < info->max_buffers) {
r = allocate_buffer(EXPANSION_BUFFER_LEN);
/* again, if there's no memory, we may not really be
* dead -- maybe the system is temporarily hung and
* we can just wait longer for a message buffer */
if (!r) continue;
- m->buffers[m->num_buffers++] = r;
+ info->buffers[info->num_buffers++] = r;
goto found_buffer; /* break out of 2 loops */
}
/* else, we've allocated all NUM_EXPANSION_BUFFERS buffers,
@@ -493,63 +376,20 @@ found_buffer:
return r;
}
-#ifdef EXPANDING_SYSEX_BUFFERS
-note: this is not working code, but might be useful if you want
- to grow sysex buffers.
-static PmError resize_sysex_buffer(PmInternal *midi, long old_size, long new_size)
-{
- LPMIDIHDR big;
- int i;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- /* buffer must be smaller than 64k, but be also a multiple of 4 */
- if (new_size > 65520) {
- if (old_size >= 65520)
- return pmBufferMaxSize;
- else
- new_size = 65520;
- }
- /* allocate a bigger message */
- big = allocate_sysex_buffer(new_size);
- /* printf("expand to %d bytes\n", new_size);*/
- if (!big) return pmInsufficientMemory;
- m->error = midiOutPrepareHeader(m->handle.out, big, sizeof(MIDIHDR));
- if (m->error) {
- pm_free(big);
- return pmHostError;
- }
- /* make sure we're not going to overwrite any memory */
- assert(old_size <= new_size);
- memcpy(big->lpData, m->hdr->lpData, old_size);
- /* keep track of how many sysex bytes are in message so far */
- big->dwBytesRecorded = m->hdr->dwBytesRecorded;
- big->dwBufferLength = new_size;
- /* find which buffer this was, and replace it */
- for (i = 0; i < NUM_SYSEX_BUFFERS; i++) {
- if (m->sysex_buffers[i] == m->hdr) {
- m->sysex_buffers[i] = big;
- m->sysex_buffer_size[i] = new_size;
- pm_free(m->hdr);
- m->hdr = big;
- break;
- }
- }
- assert(i != NUM_SYSEX_BUFFERS);
-
- return pmNoError;
-}
-#endif
-
/*
-=========================================================================================
+============================================================================
begin midi input implementation
-=========================================================================================
+============================================================================
*/
-static PmError allocate_input_buffer(HMIDIIN h, long buffer_len)
+static unsigned int allocate_input_buffer(HMIDIIN h, long buffer_len)
{
LPMIDIHDR hdr = allocate_buffer(buffer_len);
if (!hdr) return pmInsufficientMemory;
+ /* note: pm_hosterror is normally a boolean, but here, we store Win
+ * error code. The caller must test the value for nonzero, set
+ * pm_hosterror_text, and then set pm_hosterror to TRUE */
pm_hosterror = midiInPrepareHeader(h, hdr, sizeof(MIDIHDR));
if (pm_hosterror) {
pm_free(hdr);
@@ -560,49 +400,51 @@ static PmError allocate_input_buffer(HMIDIIN h, long buffer_len)
}
+static winmm_info_type winmm_info_create(void)
+{
+ winmm_info_type info = (winmm_info_type) pm_alloc(sizeof(winmm_info_node));
+ info->handle.in = NULL;
+ info->handle.out = NULL;
+ info->buffers = NULL; /* not used for input */
+ info->num_buffers = 0; /* not used for input */
+ info->max_buffers = 0; /* not used for input */
+ info->buffers_expanded = FALSE; /* not used for input */
+ info->next_buffer = 0; /* not used for input */
+ info->buffer_signal = 0; /* not used for input */
+ info->last_time = 0;
+ info->first_message = TRUE; /* not used for input */
+ info->sysex_mode = FALSE;
+ info->sysex_word = 0;
+ info->sysex_byte_count = 0;
+ info->hdr = NULL; /* not used for input */
+ info->sync_time = 0;
+ info->delta = 0;
+ return info;
+}
+
+
static PmError winmm_in_open(PmInternal *midi, void *driverInfo)
{
DWORD dwDevice;
int i = midi->device_id;
int max_sysex_len = midi->buffer_len * 4;
int num_input_buffers = max_sysex_len / INPUT_SYSEX_LEN;
- midiwinmm_type m;
+ winmm_info_type info;
- dwDevice = (DWORD)(FPTR)descriptors[i].descriptor;
+ dwDevice = (DWORD) (intptr_t) pm_descriptors[i].descriptor;
/* create system dependent device data */
- m = (midiwinmm_type) pm_alloc(sizeof(midiwinmm_node)); /* create */
- midi->descriptor = m;
- if (!m) goto no_memory;
- m->handle.in = NULL;
- m->buffers = NULL; /* not used for input */
- m->num_buffers = 0; /* not used for input */
- m->max_buffers = FALSE; /* not used for input */
- m->buffers_expanded = 0; /* not used for input */
- m->next_buffer = 0; /* not used for input */
- m->buffer_signal = 0; /* not used for input */
-#ifdef USE_SYSEX_BUFFERS
- for (i = 0; i < NUM_SYSEX_BUFFERS; i++)
- m->sysex_buffers[i] = NULL; /* not used for input */
- m->next_sysex_buffer = 0; /* not used for input */
-#endif
- m->last_time = 0;
- m->first_message = TRUE; /* not used for input */
- m->sysex_mode = FALSE;
- m->sysex_word = 0;
- m->sysex_byte_count = 0;
- m->hdr = NULL; /* not used for input */
- m->sync_time = 0;
- m->delta = 0;
- m->error = MMSYSERR_NOERROR;
- /* 4000 is based on Windows documentation -- that's the value used in the
- memory manager. It's small enough that it should not hurt performance even
- if it's not optimal.
+ info = winmm_info_create();
+ midi->api_info = info;
+ if (!info) goto no_memory;
+ /* 4000 is based on Windows documentation -- that's the value used
+ in the memory manager. It's small enough that it should not
+ hurt performance even if it's not optimal.
*/
- InitializeCriticalSectionAndSpinCount(&m->lock, 4000);
+ InitializeCriticalSectionAndSpinCount(&info->lock, 4000);
/* open device */
pm_hosterror = midiInOpen(
- &(m->handle.in), /* input device handle */
+ &(info->handle.in), /* input device handle */
dwDevice, /* device ID */
(DWORD_PTR) winmm_in_callback, /* callback address */
(DWORD_PTR) midi, /* callback instance data */
@@ -612,31 +454,34 @@ static PmError winmm_in_open(PmInternal *midi, void *driverInfo)
if (num_input_buffers < MIN_INPUT_BUFFERS)
num_input_buffers = MIN_INPUT_BUFFERS;
for (i = 0; i < num_input_buffers; i++) {
- if (allocate_input_buffer(m->handle.in, INPUT_SYSEX_LEN)) {
+ if (allocate_input_buffer(info->handle.in, INPUT_SYSEX_LEN)) {
/* either pm_hosterror was set, or the proper return code
is pmInsufficientMemory */
goto close_device;
}
}
/* start device */
- pm_hosterror = midiInStart(m->handle.in);
- if (pm_hosterror) goto reset_device;
- return pmNoError;
+ pm_hosterror = midiInStart(info->handle.in);
+ if (!pm_hosterror) {
+ return pmNoError;
+ }
/* undo steps leading up to the detected error */
-reset_device:
+
/* ignore return code (we already have an error to report) */
- midiInReset(m->handle.in);
+ midiInReset(info->handle.in);
close_device:
- midiInClose(m->handle.in); /* ignore return code */
+ midiInClose(info->handle.in); /* ignore return code */
free_descriptor:
- midi->descriptor = NULL;
- pm_free(m);
+ midi->api_info = NULL;
+ pm_free(info);
no_memory:
if (pm_hosterror) {
- midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
+ int err = midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN);
- //assert(err == MMSYSERR_NOERROR);
+ assert(err == MMSYSERR_NOERROR);
+ improve_winerr(pm_hosterror, (char *) pm_hosterror_text);
+ pm_hosterror = TRUE;
return pmHostError;
}
/* if !pm_hosterror, then the error must be pmInsufficientMemory */
@@ -646,12 +491,6 @@ no_memory:
to free the parameter midi */
}
-static PmError winmm_in_poll(PmInternal *midi) {
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- return m->error;
-}
-
-
/* winmm_in_close -- close an open midi input device */
/*
@@ -659,24 +498,24 @@ static PmError winmm_in_poll(PmInternal *midi) {
*/
static PmError winmm_in_close(PmInternal *midi)
{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- if (!m) return pmBadPtr;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ if (!info) return pmBadPtr;
/* device to close */
- if ((pm_hosterror = midiInStop(m->handle.in))) {
- midiInReset(m->handle.in); /* try to reset and close port */
- midiInClose(m->handle.in);
- } else if ((pm_hosterror = midiInReset(m->handle.in))) {
- midiInClose(m->handle.in); /* best effort to close midi port */
+ if ((pm_hosterror = midiInStop(info->handle.in))) {
+ midiInReset(info->handle.in); /* try to reset and close port */
+ midiInClose(info->handle.in);
+ } else if ((pm_hosterror = midiInReset(info->handle.in))) {
+ midiInClose(info->handle.in); /* best effort to close midi port */
} else {
- pm_hosterror = midiInClose(m->handle.in);
+ pm_hosterror = midiInClose(info->handle.in);
}
- midi->descriptor = NULL;
- DeleteCriticalSection(&m->lock);
- pm_free(m); /* delete */
+ midi->api_info = NULL;
+ DeleteCriticalSection(&info->lock);
+ pm_free(info); /* delete */
if (pm_hosterror) {
- midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
+ int err = midiInGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN);
- //assert(err == MMSYSERR_NOERROR);
+ assert(err == MMSYSERR_NOERROR);
return pmHostError;
}
return pmNoError;
@@ -685,19 +524,19 @@ static PmError winmm_in_close(PmInternal *midi)
/* Callback function executed via midiInput SW interrupt (via midiInOpen). */
static void FAR PASCAL winmm_in_callback(
- HMIDIIN hMidiIn, /* midiInput device Handle */
- UINT wMsg, /* midi msg */
- DWORD_PTR dwInstance, /* application data */
- DWORD_PTR dwParam1, /* MIDI data */
+ HMIDIIN hMidiIn, /* midiInput device Handle */
+ UINT wMsg, /* midi msg */
+ DWORD_PTR dwInstance, /* application data */
+ DWORD_PTR dwParam1, /* MIDI data */
DWORD_PTR dwParam2) /* device timestamp (wrt most recent midiInStart) */
{
- //static int entry = 0;
- PmInternal *midi = (PmInternal *)(FPTR) dwInstance;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
+ static int entry = 0;
+ PmInternal *midi = (PmInternal *) dwInstance;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
/* NOTE: we do not just EnterCriticalSection() here because an
* MIM_CLOSE message arrives when the port is closed, but then
- * the m->lock has been destroyed.
+ * the info->lock has been destroyed.
*/
switch (wMsg) {
@@ -708,8 +547,7 @@ static void FAR PASCAL winmm_in_callback(
* hardware interrupt? -- but I've seen reentrant behavior
* using a debugger, so it happens.
*/
- //long new_driver_time;
- EnterCriticalSection(&m->lock);
+ EnterCriticalSection(&info->lock);
/* dwParam1 is MIDI data received, packed into DWORD w/ 1st byte of
message LOB;
@@ -717,8 +555,6 @@ static void FAR PASCAL winmm_in_callback(
in [ms] from when midiInStart called.
each message is expanded to include the status byte */
- //new_driver_time = dwParam2;
-
if ((dwParam1 & 0x80) == 0) {
/* not a status byte -- ignore it. This happened running the
sysex.c test under Win2K with MidiMan USB 1x1 interface,
@@ -733,16 +569,16 @@ static void FAR PASCAL winmm_in_callback(
event.message = (PmMessage)dwParam1;
pm_read_short(midi, &event);
}
- LeaveCriticalSection(&m->lock);
+ LeaveCriticalSection(&info->lock);
break;
}
case MIM_LONGDATA: {
- MIDIHDR *lpMidiHdr = (MIDIHDR *)(FPTR)dwParam1;
+ MIDIHDR *lpMidiHdr = (MIDIHDR *) dwParam1;
unsigned char *data = (unsigned char *) lpMidiHdr->lpData;
unsigned int processed = 0;
int remaining = lpMidiHdr->dwBytesRecorded;
- EnterCriticalSection(&m->lock);
+ EnterCriticalSection(&info->lock);
/* printf("midi_in_callback -- lpMidiHdr %x, %d bytes, %2x...\n",
lpMidiHdr, lpMidiHdr->dwBytesRecorded, *data); */
if (midi->time_proc)
@@ -761,24 +597,24 @@ static void FAR PASCAL winmm_in_callback(
case, we do not want to send them back to the interface (if
we do, the interface will not close, and Windows OS may hang). */
if (lpMidiHdr->dwBytesRecorded > 0) {
- //MMRESULT rslt;
+ MMRESULT rslt;
lpMidiHdr->dwBytesRecorded = 0;
lpMidiHdr->dwFlags = 0;
/* note: no error checking -- can this actually fail? */
- midiInPrepareHeader(hMidiIn, lpMidiHdr, sizeof(MIDIHDR));
- //assert(rslt == MMSYSERR_NOERROR);
+ rslt = midiInPrepareHeader(hMidiIn, lpMidiHdr, sizeof(MIDIHDR));
+ assert(rslt == MMSYSERR_NOERROR);
/* note: I don't think this can fail except possibly for
* MMSYSERR_NOMEM, but the pain of reporting this
* unlikely but probably catastrophic error does not seem
* worth it.
*/
- midiInAddBuffer(hMidiIn, lpMidiHdr, sizeof(MIDIHDR));
- //assert(rslt == MMSYSERR_NOERROR);
- LeaveCriticalSection(&m->lock);
+ rslt = midiInAddBuffer(hMidiIn, lpMidiHdr, sizeof(MIDIHDR));
+ assert(rslt == MMSYSERR_NOERROR);
+ LeaveCriticalSection(&info->lock);
} else {
midiInUnprepareHeader(hMidiIn,lpMidiHdr,sizeof(MIDIHDR));
- LeaveCriticalSection(&m->lock);
+ LeaveCriticalSection(&info->lock);
pm_free(lpMidiHdr);
}
break;
@@ -799,15 +635,15 @@ static void FAR PASCAL winmm_in_callback(
}
/*
-=========================================================================================
+===========================================================================
begin midi output implementation
-=========================================================================================
+===========================================================================
*/
/* begin helper routines used by midiOutStream interface */
/* add_to_buffer -- adds timestamped short msg to buffer, returns fullp */
-static int add_to_buffer(midiwinmm_type m, LPMIDIHDR hdr,
+static int add_to_buffer(winmm_info_type m, LPMIDIHDR hdr,
unsigned long delta, unsigned long msg)
{
unsigned long *ptr = (unsigned long *)
@@ -823,14 +659,14 @@ static int add_to_buffer(midiwinmm_type m, LPMIDIHDR hdr,
}
-static PmTimestamp pm_time_get(midiwinmm_type m)
+static PmTimestamp pm_time_get(winmm_info_type info)
{
MMTIME mmtime;
- //MMRESULT wRtn;
+ MMRESULT wRtn;
mmtime.wType = TIME_TICKS;
mmtime.u.ticks = 0;
- midiStreamPosition(m->handle.stream, &mmtime, sizeof(mmtime));
- //assert(wRtn == MMSYSERR_NOERROR);
+ wRtn = midiStreamPosition(info->handle.stream, &mmtime, sizeof(mmtime));
+ assert(wRtn == MMSYSERR_NOERROR);
return mmtime.u.ticks;
}
@@ -842,49 +678,27 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo)
{
DWORD dwDevice;
int i = midi->device_id;
- midiwinmm_type m;
+ winmm_info_type info;
MIDIPROPTEMPO propdata;
MIDIPROPTIMEDIV divdata;
int max_sysex_len = midi->buffer_len * 4;
int output_buffer_len;
int num_buffers;
- dwDevice = (DWORD)(FPTR) descriptors[i].descriptor;
- /* create system dependent device data */
- m = (midiwinmm_type) pm_alloc(sizeof(midiwinmm_node)); /* create */
- midi->descriptor = m;
- if (!m) goto no_memory;
- m->handle.out = NULL;
- m->buffers = NULL;
- m->num_buffers = 0;
- m->max_buffers = 0;
- m->buffers_expanded = FALSE;
- m->next_buffer = 0;
-#ifdef USE_SYSEX_BUFFERS
- m->sysex_buffers[0] = NULL;
- m->sysex_buffers[1] = NULL;
- m->next_sysex_buffer = 0;
-#endif
- m->last_time = 0;
- m->first_message = TRUE; /* we treat first message as special case */
- m->sysex_mode = FALSE;
- m->sysex_word = 0;
- m->sysex_byte_count = 0;
- m->hdr = NULL;
- m->sync_time = 0;
- m->delta = 0;
- m->error = MMSYSERR_NOERROR;
+ dwDevice = (DWORD) (intptr_t) pm_descriptors[i].descriptor;
+ /* create system dependent device data */
+ info = winmm_info_create();
+ midi->api_info = info;
+ if (!info) goto no_memory;
/* create a signal */
- m->buffer_signal = CreateEvent(NULL, FALSE, FALSE, NULL);
-
+ info->buffer_signal = CreateEvent(NULL, FALSE, FALSE, NULL);
/* this should only fail when there are very serious problems */
- assert(m->buffer_signal);
-
+ assert(info->buffer_signal);
/* open device */
if (midi->latency == 0) {
/* use simple midi out calls */
pm_hosterror = midiOutOpen(
- (LPHMIDIOUT) & m->handle.out, /* device Handle */
+ (LPHMIDIOUT) & info->handle.out, /* device Handle */
dwDevice, /* device ID */
/* note: same callback fn as for StreamOpen: */
(DWORD_PTR) winmm_streamout_callback, /* callback fn */
@@ -893,7 +707,7 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo)
} else {
/* use stream-based midi output (schedulable in future) */
pm_hosterror = midiStreamOpen(
- &m->handle.stream, /* device Handle */
+ &info->handle.stream, /* device Handle */
(LPUINT) & dwDevice, /* device ID pointer */
1, /* reserved, must be 1 */
(DWORD_PTR) winmm_streamout_callback,
@@ -910,41 +724,32 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo)
if (output_buffer_len < MIN_SIMPLE_SYSEX_LEN)
output_buffer_len = MIN_SIMPLE_SYSEX_LEN;
} else {
- //long dur = 0;
- //num_buffers = (int)(double)max((double)midi->buffer_len, (double)midi->latency / 2);
- if (midi->buffer_len > (midi->latency / 2))
- {
- num_buffers = midi->buffer_len;
- }
- else
- {
- num_buffers = (midi->latency / 2);
- }
-
+ long dur = 0;
+ num_buffers = max(midi->buffer_len, midi->latency / 2);
if (num_buffers < MIN_STREAM_BUFFERS)
num_buffers = MIN_STREAM_BUFFERS;
output_buffer_len = STREAM_BUFFER_LEN;
propdata.cbStruct = sizeof(MIDIPROPTEMPO);
propdata.dwTempo = 480000; /* microseconds per quarter */
- pm_hosterror = midiStreamProperty(m->handle.stream,
+ pm_hosterror = midiStreamProperty(info->handle.stream,
(LPBYTE) & propdata,
MIDIPROP_SET | MIDIPROP_TEMPO);
if (pm_hosterror) goto close_device;
divdata.cbStruct = sizeof(MIDIPROPTEMPO);
divdata.dwTimeDiv = 480; /* divisions per quarter */
- pm_hosterror = midiStreamProperty(m->handle.stream,
+ pm_hosterror = midiStreamProperty(info->handle.stream,
(LPBYTE) & divdata,
MIDIPROP_SET | MIDIPROP_TIMEDIV);
if (pm_hosterror) goto close_device;
}
/* allocate buffers */
- if (allocate_buffers(m, output_buffer_len, num_buffers))
+ if (allocate_buffers(info, output_buffer_len, num_buffers))
goto free_buffers;
/* start device */
if (midi->latency != 0) {
- pm_hosterror = midiStreamRestart(m->handle.stream);
+ pm_hosterror = midiStreamRestart(info->handle.stream);
if (pm_hosterror != MMSYSERR_NOERROR) goto free_buffers;
}
return pmNoError;
@@ -952,15 +757,16 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo)
free_buffers:
/* buffers are freed below by winmm_out_delete */
close_device:
- midiOutClose(m->handle.out);
+ midiOutClose(info->handle.out);
free_descriptor:
- midi->descriptor = NULL;
+ midi->api_info = NULL;
winmm_out_delete(midi); /* frees buffers and m */
no_memory:
if (pm_hosterror) {
- midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
+ int err = midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN);
- //assert(err == MMSYSERR_NOERROR);
+ assert(err == MMSYSERR_NOERROR);
+ improve_winerr(pm_hosterror, (char *) pm_hosterror_text);
return pmHostError;
}
return pmInsufficientMemory;
@@ -973,50 +779,43 @@ static void winmm_out_delete(PmInternal *midi)
{
int i;
/* delete system dependent device data */
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- if (m) {
- if (m->buffer_signal) {
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ if (info) {
+ if (info->buffer_signal) {
/* don't report errors -- better not to stop cleanup */
- CloseHandle(m->buffer_signal);
+ CloseHandle(info->buffer_signal);
}
/* if using stream output, free buffers */
- for (i = 0; i < m->num_buffers; i++) {
- if (m->buffers[i]) pm_free(m->buffers[i]);
+ for (i = 0; i < info->num_buffers; i++) {
+ if (info->buffers[i]) pm_free(info->buffers[i]);
}
- m->num_buffers = 0;
- pm_free(m->buffers);
- m->max_buffers = 0;
-#ifdef USE_SYSEX_BUFFERS
- /* free sysex buffers */
- for (i = 0; i < NUM_SYSEX_BUFFERS; i++) {
- if (m->sysex_buffers[i]) pm_free(m->sysex_buffers[i]);
- }
-#endif
+ info->num_buffers = 0;
+ pm_free(info->buffers);
+ info->max_buffers = 0;
}
- midi->descriptor = NULL;
- pm_free(m); /* delete */
+ midi->api_info = NULL;
+ pm_free(info); /* delete */
}
/* see comments for winmm_in_close */
static PmError winmm_out_close(PmInternal *midi)
{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- if (m->handle.out) {
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ if (info->handle.out) {
/* device to close */
if (midi->latency == 0) {
- pm_hosterror = midiOutClose(m->handle.out);
+ pm_hosterror = midiOutClose(info->handle.out);
} else {
- pm_hosterror = midiStreamClose(m->handle.stream);
+ pm_hosterror = midiStreamClose(info->handle.stream);
}
/* regardless of outcome, free memory */
winmm_out_delete(midi);
}
if (pm_hosterror) {
- midiOutGetErrorText(pm_hosterror,
- (char *) pm_hosterror_text,
+ int err = midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
PM_HOST_ERROR_MSG_LEN);
- //assert(err == MMSYSERR_NOERROR);
+ assert(err == MMSYSERR_NOERROR);
return pmHostError;
}
return pmNoError;
@@ -1025,42 +824,53 @@ static PmError winmm_out_close(PmInternal *midi)
static PmError winmm_out_abort(PmInternal *midi)
{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- m->error = MMSYSERR_NOERROR;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
/* only stop output streams */
if (midi->latency > 0) {
- m->error = midiStreamStop(m->handle.stream);
+ pm_hosterror = midiStreamStop(info->handle.stream);
+ if (pm_hosterror) {
+ int err;
+ err = midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
+ PM_HOST_ERROR_MSG_LEN);
+ assert(err == MMSYSERR_NOERROR);
+ return pmHostError;
+ }
}
- return m->error ? pmHostError : pmNoError;
+ return pmNoError;
}
static PmError winmm_write_flush(PmInternal *midi, PmTimestamp timestamp)
{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- assert(m);
- if (m->hdr) {
- m->error = midiOutPrepareHeader(m->handle.out, m->hdr,
- sizeof(MIDIHDR));
- if (m->error) {
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ assert(info);
+ if (info->hdr) {
+ pm_hosterror = midiOutPrepareHeader(info->handle.out, info->hdr,
+ sizeof(MIDIHDR));
+ if (pm_hosterror) {
/* do not send message */
} else if (midi->latency == 0) {
/* As pointed out by Nigel Brown, 20Sep06, dwBytesRecorded
* should be zero. This is set in get_free_sysex_buffer().
* The msg length goes in dwBufferLength in spite of what
* Microsoft documentation says (or doesn't say). */
- m->hdr->dwBufferLength = m->hdr->dwBytesRecorded;
- m->hdr->dwBytesRecorded = 0;
- m->error = midiOutLongMsg(m->handle.out, m->hdr, sizeof(MIDIHDR));
+ info->hdr->dwBufferLength = info->hdr->dwBytesRecorded;
+ info->hdr->dwBytesRecorded = 0;
+ pm_hosterror = midiOutLongMsg(info->handle.out, info->hdr,
+ sizeof(MIDIHDR));
} else {
- m->error = midiStreamOut(m->handle.stream, m->hdr,
- sizeof(MIDIHDR));
+ pm_hosterror = midiStreamOut(info->handle.stream, info->hdr,
+ sizeof(MIDIHDR));
}
midi->fill_base = NULL;
- m->hdr = NULL;
- if (m->error) {
- m->hdr->dwFlags = 0; /* release the buffer */
+ info->hdr = NULL;
+ if (pm_hosterror) {
+ int err;
+ info->hdr->dwFlags = 0; /* release the buffer */
+ err = midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
+ PM_HOST_ERROR_MSG_LEN);
+ assert(err == MMSYSERR_NOERROR);
return pmHostError;
}
}
@@ -1068,98 +878,40 @@ static PmError winmm_write_flush(PmInternal *midi, PmTimestamp timestamp)
}
-
-#ifdef GARBAGE
-static PmError winmm_write_sysex_byte(PmInternal *midi, unsigned char byte)
-{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- unsigned char *msg_buffer;
-
- /* at the beginning of sysex, m->hdr is NULL */
- if (!m->hdr) { /* allocate a buffer if none allocated yet */
- m->hdr = get_free_output_buffer(midi);
- if (!m->hdr) return pmInsufficientMemory;
- m->sysex_byte_count = 0;
- }
- /* figure out where to write byte */
- msg_buffer = (unsigned char *) (m->hdr->lpData);
- assert(m->hdr->lpData == (char *) (m->hdr + 1));
-
- /* check for overflow */
- if (m->sysex_byte_count >= m->hdr->dwBufferLength) {
- /* allocate a bigger message -- double it every time */
- LPMIDIHDR big = allocate_buffer(m->sysex_byte_count * 2);
- /* printf("expand to %d bytes\n", m->sysex_byte_count * 2); */
- if (!big) return pmInsufficientMemory;
- m->error = midiOutPrepareHeader(m->handle.out, big,
- sizeof(MIDIHDR));
- if (m->error) {
- m->hdr = NULL;
- return pmHostError;
- }
- memcpy(big->lpData, msg_buffer, m->sysex_byte_count);
- msg_buffer = (unsigned char *) (big->lpData);
- if (m->buffers[0] == m->hdr) {
- m->buffers[0] = big;
- pm_free(m->hdr);
- /* printf("freed m->hdr\n"); */
- } else if (m->buffers[1] == m->hdr) {
- m->buffers[1] = big;
- pm_free(m->hdr);
- /* printf("freed m->hdr\n"); */
- }
- m->hdr = big;
- }
-
- /* append byte to message */
- msg_buffer[m->sysex_byte_count++] = byte;
-
- /* see if we have a complete message */
- if (byte == MIDI_EOX) {
- m->hdr->dwBytesRecorded = m->sysex_byte_count;
- /*
- { int i; int len = m->hdr->dwBytesRecorded;
- printf("OutLongMsg %d ", len);
- for (i = 0; i < len; i++) {
- printf("%2x ", msg_buffer[i]);
- }
- }
- */
- m->error = midiOutLongMsg(m->handle.out, m->hdr, sizeof(MIDIHDR));
- m->hdr = NULL; /* stop using this message buffer */
- if (m->error) return pmHostError;
- }
- return pmNoError;
-}
-#endif
-
-
static PmError winmm_write_short(PmInternal *midi, PmEvent *event)
{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
PmError rslt = pmNoError;
- assert(m);
+ assert(info);
if (midi->latency == 0) { /* use midiOut interface, ignore timestamps */
- m->error = midiOutShortMsg(m->handle.out, event->message);
- if (m->error) rslt = pmHostError;
+ pm_hosterror = midiOutShortMsg(info->handle.out, event->message);
+ if (pm_hosterror) {
+ int err;
+ info->hdr->dwFlags = 0; /* release the buffer */
+ err = midiOutGetErrorText(pm_hosterror, (char *) pm_hosterror_text,
+ PM_HOST_ERROR_MSG_LEN);
+ assert(err == MMSYSERR_NOERROR);
+ return pmHostError;
+ }
} else { /* use midiStream interface -- pass data through buffers */
unsigned long when = event->timestamp;
unsigned long delta;
int full;
if (when == 0) when = midi->now;
/* when is in real_time; translate to intended stream time */
- when = when + m->delta + midi->latency;
+ when = when + info->delta + midi->latency;
/* make sure we don't go backward in time */
- if (when < m->last_time) when = m->last_time;
- delta = when - m->last_time;
- m->last_time = when;
+ if (when < info->last_time) when = info->last_time;
+ delta = when - info->last_time;
+ info->last_time = when;
/* before we insert any data, we must have a buffer */
- if (m->hdr == NULL) {
+ if (info->hdr == NULL) {
/* stream interface: buffers allocated when stream is opened */
- m->hdr = get_free_output_buffer(midi);
+ info->hdr = get_free_output_buffer(midi);
}
- full = add_to_buffer(m, m->hdr, delta, event->message);
+ full = add_to_buffer(info, info->hdr, delta, event->message);
+ /* note: winmm_write_flush sets pm_hosterror etc. on host error */
if (full) rslt = winmm_write_flush(midi, when);
}
return rslt;
@@ -1169,7 +921,7 @@ static PmError winmm_write_short(PmInternal *midi, PmEvent *event)
#ifndef winmm_begin_sysex
static PmError winmm_begin_sysex(PmInternal *midi, PmTimestamp timestamp)
{
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
+ winmm_info_type m = (winmm_info_type) midi->api_info;
PmError rslt = pmNoError;
if (midi->latency == 0) {
@@ -1188,9 +940,9 @@ static PmError winmm_end_sysex(PmInternal *midi, PmTimestamp timestamp)
* what happens if we exit early and don't finish the sysex msg
* and clean up
*/
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
PmError rslt = pmNoError;
- LPMIDIHDR hdr = m->hdr;
+ LPMIDIHDR hdr = info->hdr;
if (!hdr) return rslt; /* something bad happened earlier,
do not report an error because it would have been
reported (at least) once already */
@@ -1200,15 +952,15 @@ static PmError winmm_end_sysex(PmInternal *midi, PmTimestamp timestamp)
if (midi->latency == 0) {
#ifdef DEBUG_PRINT_BEFORE_SENDING_SYSEX
/* DEBUG CODE: */
- { int i; int len = m->hdr->dwBufferLength;
+ { int i; int len = info->hdr->dwBufferLength;
printf("OutLongMsg %d ", len);
for (i = 0; i < len; i++) {
- printf("%2x ", (unsigned char) (m->hdr->lpData[i]));
+ printf("%2x ", (unsigned char) (info->hdr->lpData[i]));
}
}
#endif
} else {
- /* Using stream interface. There are accumulated bytes in m->hdr
+ /* Using stream interface. There are accumulated bytes in info->hdr
to send using midiStreamOut
*/
/* add bytes recorded to MIDIEVENT length, but don't
@@ -1228,16 +980,15 @@ static PmError winmm_write_byte(PmInternal *midi, unsigned char byte,
{
/* write a sysex byte */
PmError rslt = pmNoError;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- LPMIDIHDR hdr = m->hdr;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ LPMIDIHDR hdr = info->hdr;
unsigned char *msg_buffer;
- assert(m);
+ assert(info);
if (!hdr) {
- m->hdr = hdr = get_free_output_buffer(midi);
+ info->hdr = hdr = get_free_output_buffer(midi);
assert(hdr);
- midi->fill_base = (unsigned char *)(FPTR) m->hdr->lpData;
- midi->fill_offset_ptr = (uint32_t *)&(hdr->dwBytesRecorded);
-
+ midi->fill_base = (unsigned char *) info->hdr->lpData;
+ midi->fill_offset_ptr = (uint32_t *) &(hdr->dwBytesRecorded);
/* when buffer fills, Pm_WriteSysEx will revert to calling
* pmwin_write_byte, which expect to have space, so leave
* one byte free for pmwin_write_byte. Leave another byte
@@ -1250,11 +1001,11 @@ static PmError winmm_write_byte(PmInternal *midi, unsigned char byte,
unsigned long *ptr;
if (when == 0) when = midi->now;
/* when is in real_time; translate to intended stream time */
- when = when + m->delta + midi->latency;
+ when = when + info->delta + midi->latency;
/* make sure we don't go backward in time */
- if (when < m->last_time) when = m->last_time;
- delta = when - m->last_time;
- m->last_time = when;
+ if (when < info->last_time) when = info->last_time;
+ delta = when - info->last_time;
+ info->last_time = when;
ptr = (unsigned long *) hdr->lpData;
*ptr++ = delta;
@@ -1276,31 +1027,10 @@ static PmError winmm_write_byte(PmInternal *midi, unsigned char byte,
return rslt;
}
-#ifdef EXPANDING_SYSEX_BUFFERS
-note: this code is here as an aid in case you want sysex buffers
- to expand to hold large messages completely. If so, you
- will want to change SYSEX_BYTES_PER_BUFFER above to some
- variable that remembers the buffer size. A good place to
- put this value would be in the hdr->dwUser field.
-
- rslt = resize_sysex_buffer(midi, m->sysex_byte_count,
- m->sysex_byte_count * 2);
-
- if (rslt == pmBufferMaxSize) /* if the buffer can't be resized */
-#endif
-#ifdef EXPANDING_SYSEX_BUFFERS
- int bytesRecorded = hdr->dwBytesRecorded; /* this field gets wiped out, so we'll save it */
- rslt = resize_sysex_buffer(midi, bytesRecorded, 2 * bytesRecorded);
- hdr->dwBytesRecorded = bytesRecorded;
-
- if (rslt == pmBufferMaxSize) /* if buffer can't be resized */
-#endif
-
-
static PmTimestamp winmm_synchronize(PmInternal *midi)
{
- midiwinmm_type m;
+ winmm_info_type info;
unsigned long pm_stream_time_2;
unsigned long real_time;
unsigned long pm_stream_time;
@@ -1309,60 +1039,30 @@ static PmTimestamp winmm_synchronize(PmInternal *midi)
if (midi->latency == 0) return 0;
/* figure out the time */
- m = (midiwinmm_type) midi->descriptor;
- pm_stream_time_2 = pm_time_get(m);
+ info = (winmm_info_type) midi->api_info;
+ pm_stream_time_2 = pm_time_get(info);
do {
/* read real_time between two reads of stream time */
pm_stream_time = pm_stream_time_2;
real_time = (*midi->time_proc)(midi->time_info);
- pm_stream_time_2 = pm_time_get(m);
+ pm_stream_time_2 = pm_time_get(info);
/* repeat if more than 1ms elapsed */
} while (pm_stream_time_2 > pm_stream_time + 1);
- m->delta = pm_stream_time - real_time;
- m->sync_time = real_time;
+ info->delta = pm_stream_time - real_time;
+ info->sync_time = real_time;
return real_time;
}
-#ifdef USE_SYSEX_BUFFERS
-/* winmm_out_callback -- recycle sysex buffers */
-static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg,
- DWORD_PTR dwInstance, DWORD_PTR dwParam1,
- DWORD_PTR dwParam2)
-{
- PmInternal *midi = (PmInternal *) dwInstance;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- LPMIDIHDR hdr = (LPMIDIHDR) dwParam1;
- int err = 0; /* set to 0 so that no buffer match will also be an error */
-
- /* Future optimization: eliminate UnprepareHeader calls -- they aren't
- necessary; however, this code uses the prepared-flag to indicate which
- buffers are free, so we need to do something to flag empty buffers if
- we leave them prepared
- */
- /*
- printf("out_callback: hdr %x, wMsg %x, MOM_DONE %x\n",
- hdr, wMsg, MOM_DONE);
- */
- if (wMsg == MOM_DONE) {
- MMRESULT ret = midiOutUnprepareHeader(m->handle.out, hdr,
- sizeof(MIDIHDR));
- assert(ret == MMSYSERR_NOERROR);
- }
- /* notify waiting sender that a buffer is available */
- err = SetEvent(m->buffer_signal);
- assert(err); /* false -> error */
-}
-#endif
/* winmm_streamout_callback -- unprepare (free) buffer header */
static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
- PmInternal *midi = (PmInternal *)(FPTR) dwInstance;
- LPMIDIHDR hdr = (LPMIDIHDR)(FPTR) dwParam1;
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- //int err;
+ PmInternal *midi = (PmInternal *) dwInstance;
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ LPMIDIHDR hdr = (LPMIDIHDR) dwParam1;
+ int err;
/* Even if an error is pending, I think we should unprepare msgs and
signal their arrival
@@ -1370,20 +1070,20 @@ static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg,
/* printf("streamout_callback: hdr %x, wMsg %x, MOM_DONE %x\n",
hdr, wMsg, MOM_DONE); */
if (wMsg == MOM_DONE) {
- midiOutUnprepareHeader(m->handle.out, hdr,
+ MMRESULT ret = midiOutUnprepareHeader(info->handle.out, hdr,
sizeof(MIDIHDR));
- //assert(ret == MMSYSERR_NOERROR);
+ assert(ret == MMSYSERR_NOERROR);
}
/* signal client in case it is blocked waiting for buffer */
- SetEvent(m->buffer_signal);
- //assert(err); /* false -> error */
+ err = SetEvent(info->buffer_signal);
+ assert(err); /* false -> error */
}
/*
-=========================================================================================
+===========================================================================
begin exported functions
-=========================================================================================
+===========================================================================
*/
#define winmm_in_abort pm_fail_fn
@@ -1398,9 +1098,8 @@ pm_fns_node pm_winmm_in_dictionary = {
winmm_in_open,
winmm_in_abort,
winmm_in_close,
- winmm_in_poll,
- winmm_has_host_error,
- winmm_get_host_error
+ success_poll,
+ winmm_check_host_error
};
pm_fns_node pm_winmm_out_dictionary = {
@@ -1408,15 +1107,14 @@ pm_fns_node pm_winmm_out_dictionary = {
winmm_begin_sysex,
winmm_end_sysex,
winmm_write_byte,
- winmm_write_short, /* short realtime message */
+ /* short realtime message: */ winmm_write_short,
winmm_write_flush,
winmm_synchronize,
winmm_out_open,
winmm_out_abort,
winmm_out_close,
none_poll,
- winmm_has_host_error,
- winmm_get_host_error
+ winmm_check_host_error
};
@@ -1445,28 +1143,21 @@ void pm_winmm_init( void )
void pm_winmm_term( void )
{
int i;
-#ifdef DEBUG
- char msg[PM_HOST_ERROR_MSG_LEN];
+#ifdef MMDEBUG
int doneAny = 0;
printf("pm_winmm_term called\n");
#endif
- for (i = 0; i < pm_descriptor_index; i++) {
- PmInternal * midi = descriptors[i].internalDescriptor;
+ for (i = 0; i < pm_descriptor_len; i++) {
+ PmInternal *midi = pm_descriptors[i].pm_internal;
if (midi) {
- midiwinmm_type m = (midiwinmm_type) midi->descriptor;
- if (m->handle.out) {
+ winmm_info_type info = (winmm_info_type) midi->api_info;
+ if (info->handle.out) {
/* close next open device*/
-#ifdef DEBUG
+#ifdef MMDEBUG
if (doneAny == 0) {
printf("begin closing open devices...\n");
doneAny = 1;
}
- /* report any host errors; this EXTEREMELY useful when
- trying to debug client app */
- if (winmm_has_host_error(midi)) {
- winmm_get_host_error(midi, msg, PM_HOST_ERROR_MSG_LEN);
- printf("%s\n", msg);
- }
#endif
/* close all open ports */
(*midi->dictionary->close)(midi);
@@ -1481,11 +1172,11 @@ void pm_winmm_term( void )
pm_free(midi_out_caps);
midi_out_caps = NULL;
}
-#ifdef DEBUG
+#ifdef MMDEBUG
if (doneAny) {
printf("warning: devices were left open. They have been closed.\n");
}
printf("pm_winmm_term exiting\n");
#endif
- pm_descriptor_index = 0;
+ pm_descriptor_len = 0;
}
diff --git a/3rdparty/portmidi/pm_win/pmwinmm.h b/3rdparty/portmidi/pm_win/pmwinmm.h
index 94742001bcd..a429ca1afb9 100644
--- a/3rdparty/portmidi/pm_win/pmwinmm.h
+++ b/3rdparty/portmidi/pm_win/pmwinmm.h
@@ -1,4 +1,4 @@
-/* midiwin32.h -- system-specific definitions */
+/* pmwinmm.h -- system-specific definitions for windows multimedia API */
void pm_winmm_init( void );
void pm_winmm_term( void );
diff --git a/3rdparty/portmidi/pm_win/static.cmake b/3rdparty/portmidi/pm_win/static.cmake
index ebad662aeb4..88a115c9228 100644
--- a/3rdparty/portmidi/pm_win/static.cmake
+++ b/3rdparty/portmidi/pm_win/static.cmake
@@ -1,4 +1,12 @@
# static.cmake -- change flags to link with static runtime libraries
+#
+# Even when BUILD_SHARED_LIBS is OFF, CMake specifies linking wtih
+# multithread DLL, so you give inconsistent linking instructions
+# resulting in warning messages from MS Visual Studio. If you want
+# a static binary, I've found this approach works to eliminate
+# warnings and make everything static:
+#
+# Changes /MD (multithread DLL) to /MT (multithread static)
if(MSVC)
foreach(flag_var
diff --git a/3rdparty/portmidi/portmidi.sln b/3rdparty/portmidi/portmidi.sln
deleted file mode 100644
index e5521924d12..00000000000
--- a/3rdparty/portmidi/portmidi.sln
+++ /dev/null
@@ -1,147 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ALL_BUILD", ".\ALL_BUILD.vcproj", "{E1C2664B-91BB-4D4F-868C-433164F81101}"
- ProjectSection(ProjectDependencies) = postProject
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- {41D78CBF-B04B-4561-BA4A-AC238C40633D} = {41D78CBF-B04B-4561-BA4A-AC238C40633D}
- {9B448D22-EC7E-4BD8-A552-B268D843CC3C} = {9B448D22-EC7E-4BD8-A552-B268D843CC3C}
- {EED7440D-04E3-4948-92DB-C85B4ADB1D82} = {EED7440D-04E3-4948-92DB-C85B4ADB1D82}
- {80193DD1-2C02-4A4C-BDF8-49623AD6F556} = {80193DD1-2C02-4A4C-BDF8-49623AD6F556}
- {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF} = {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}
- {87B548BD-F5CE-4D1F-9181-390966AC5855} = {87B548BD-F5CE-4D1F-9181-390966AC5855}
- {7283FAD1-7415-4061-A19A-FF5C7BCE9306} = {7283FAD1-7415-4061-A19A-FF5C7BCE9306}
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1} = {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}
- {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD} = {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}
- {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A} = {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZERO_CHECK", ".\ZERO_CHECK.vcproj", "{28779535-7541-4FF5-AC12-FAFD66E894EC}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "latency", "pm_test\latency.vcproj", "{41D78CBF-B04B-4561-BA4A-AC238C40633D}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "midiclock", "pm_test\midiclock.vcproj", "{9B448D22-EC7E-4BD8-A552-B268D843CC3C}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "midithread", "pm_test\midithread.vcproj", "{EED7440D-04E3-4948-92DB-C85B4ADB1D82}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "midithru", "pm_test\midithru.vcproj", "{80193DD1-2C02-4A4C-BDF8-49623AD6F556}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mm", "pm_test\mm.vcproj", "{EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pmjni", "pm_common\pmjni.vcproj", "{87B548BD-F5CE-4D1F-9181-390966AC5855}"
- ProjectSection(ProjectDependencies) = postProject
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portmidi-dynamic", "pm_dylib\portmidi-dynamic.vcproj", "{7283FAD1-7415-4061-A19A-FF5C7BCE9306}"
- ProjectSection(ProjectDependencies) = postProject
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portmidi-static", "pm_common\portmidi-static.vcproj", "{2985D5DA-D91E-44E0-924B-E612B6AA33F6}"
- ProjectSection(ProjectDependencies) = postProject
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtest", "pm_test\qtest.vcproj", "{2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sysex", "pm_test\sysex.vcproj", "{71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "pm_test\test.vcproj", "{0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}"
- ProjectSection(ProjectDependencies) = postProject
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6}
- {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {E1C2664B-91BB-4D4F-868C-433164F81101}.Debug|Win32.ActiveCfg = Debug|Win32
- {E1C2664B-91BB-4D4F-868C-433164F81101}.Release|Win32.ActiveCfg = Release|Win32
- {28779535-7541-4FF5-AC12-FAFD66E894EC}.Debug|Win32.ActiveCfg = Debug|Win32
- {28779535-7541-4FF5-AC12-FAFD66E894EC}.Debug|Win32.Build.0 = Debug|Win32
- {28779535-7541-4FF5-AC12-FAFD66E894EC}.Release|Win32.ActiveCfg = Release|Win32
- {28779535-7541-4FF5-AC12-FAFD66E894EC}.Release|Win32.Build.0 = Release|Win32
- {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Debug|Win32.ActiveCfg = Debug|Win32
- {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Debug|Win32.Build.0 = Debug|Win32
- {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Release|Win32.ActiveCfg = Release|Win32
- {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Release|Win32.Build.0 = Release|Win32
- {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Debug|Win32.ActiveCfg = Debug|Win32
- {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Debug|Win32.Build.0 = Debug|Win32
- {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Release|Win32.ActiveCfg = Release|Win32
- {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Release|Win32.Build.0 = Release|Win32
- {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Debug|Win32.ActiveCfg = Debug|Win32
- {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Debug|Win32.Build.0 = Debug|Win32
- {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Release|Win32.ActiveCfg = Release|Win32
- {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Release|Win32.Build.0 = Release|Win32
- {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Debug|Win32.ActiveCfg = Debug|Win32
- {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Debug|Win32.Build.0 = Debug|Win32
- {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Release|Win32.ActiveCfg = Release|Win32
- {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Release|Win32.Build.0 = Release|Win32
- {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Debug|Win32.ActiveCfg = Debug|Win32
- {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Debug|Win32.Build.0 = Debug|Win32
- {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Release|Win32.ActiveCfg = Release|Win32
- {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Release|Win32.Build.0 = Release|Win32
- {87B548BD-F5CE-4D1F-9181-390966AC5855}.Debug|Win32.ActiveCfg = Debug|Win32
- {87B548BD-F5CE-4D1F-9181-390966AC5855}.Debug|Win32.Build.0 = Debug|Win32
- {87B548BD-F5CE-4D1F-9181-390966AC5855}.Release|Win32.ActiveCfg = Release|Win32
- {87B548BD-F5CE-4D1F-9181-390966AC5855}.Release|Win32.Build.0 = Release|Win32
- {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Debug|Win32.ActiveCfg = Debug|Win32
- {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Debug|Win32.Build.0 = Debug|Win32
- {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Release|Win32.ActiveCfg = Release|Win32
- {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Release|Win32.Build.0 = Release|Win32
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Debug|Win32.ActiveCfg = Debug|Win32
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Debug|Win32.Build.0 = Debug|Win32
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Release|Win32.ActiveCfg = Release|Win32
- {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Release|Win32.Build.0 = Release|Win32
- {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Debug|Win32.ActiveCfg = Debug|Win32
- {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Debug|Win32.Build.0 = Debug|Win32
- {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Release|Win32.ActiveCfg = Release|Win32
- {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Release|Win32.Build.0 = Release|Win32
- {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Debug|Win32.ActiveCfg = Debug|Win32
- {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Debug|Win32.Build.0 = Debug|Win32
- {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Release|Win32.ActiveCfg = Release|Win32
- {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Release|Win32.Build.0 = Release|Win32
- {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Debug|Win32.ActiveCfg = Debug|Win32
- {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Debug|Win32.Build.0 = Debug|Win32
- {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Release|Win32.ActiveCfg = Release|Win32
- {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/3rdparty/portmidi/portmidi_cdt.zip b/3rdparty/portmidi/portmidi_cdt.zip
deleted file mode 100644
index eaa2d7970cb..00000000000
--- a/3rdparty/portmidi/portmidi_cdt.zip
+++ /dev/null
Binary files differ
diff --git a/3rdparty/portmidi/porttime/porttime-VC8.vcproj b/3rdparty/portmidi/porttime/porttime-VC8.vcproj
deleted file mode 100644
index 9a4562495b2..00000000000
--- a/3rdparty/portmidi/porttime/porttime-VC8.vcproj
+++ /dev/null
@@ -1,225 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="porttime"
- ProjectGUID="{338224B8-D575-408D-BACF-95C557B429BE}"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\Release"
- IntermediateDirectory=".\Release"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\Release/porttime.pch"
- AssemblerListingLocation=".\Release/"
- ObjectFile=".\Release/"
- ProgramDataBaseFileName=".\Release/"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\Release\porttime.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Release/porttime.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\Debug"
- IntermediateDirectory=".\Debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="_LIB;WIN32;_DEBUG"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\Debug/porttime.pch"
- AssemblerListingLocation=".\Debug/"
- ObjectFile=".\Debug/"
- ProgramDataBaseFileName=".\Debug/"
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\Debug\porttime.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Debug/porttime.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="porttime.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="ptwinmm.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="porttime.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/porttime/porttime.dsp b/3rdparty/portmidi/porttime/porttime.dsp
deleted file mode 100644
index 2771842af31..00000000000
--- a/3rdparty/portmidi/porttime/porttime.dsp
+++ /dev/null
@@ -1,104 +0,0 @@
-# Microsoft Developer Studio Project File - Name="porttime" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=porttime - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "porttime.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "porttime.mak" CFG="porttime - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "porttime - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "porttime - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "porttime - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "porttime - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_LIB" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "USE_DLL_FOR_CLEANUP" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "porttime - Win32 Release"
-# Name "porttime - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\porttime.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ptwinmm.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\porttime.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/3rdparty/portmidi/porttime/porttime.h b/3rdparty/portmidi/porttime/porttime.h
index f5ffd5c1f49..29d93dc2c59 100644
--- a/3rdparty/portmidi/porttime/porttime.h
+++ b/3rdparty/portmidi/porttime/porttime.h
@@ -1,4 +1,4 @@
-/* porttime.h -- portable interface to millisecond timer */
+/** @file porttime.h portable interface to millisecond timer. */
/* CHANGE LOG FOR PORTTIME
10-Jun-03 Mark Nelson & RBD
@@ -25,8 +25,16 @@ extern "C" {
#endif
#ifndef PMEXPORT
+#ifdef _WINDLL
+#define PMEXPORT __declspec(dllexport)
+#else
#define PMEXPORT
#endif
+#endif
+
+/** @defgroup grp_porttime PortTime: Millisecond Timer
+ @{
+*/
typedef enum {
ptNoError = 0, /* success */
@@ -34,55 +42,57 @@ typedef enum {
ptAlreadyStarted, /* cannot start timer because it is already started */
ptAlreadyStopped, /* cannot stop timer because it is already stopped */
ptInsufficientMemory /* memory could not be allocated */
-} PtError;
-
+} PtError; /**< @brief @enum PtError PortTime error code; a common return type.
+ * No error is indicated by zero; errors are indicated by < 0.
+ */
+/** real time or time offset in milliseconds. */
typedef int32_t PtTimestamp;
-typedef void (PtCallback)( PtTimestamp timestamp, void *userData );
+/** a function that gets a current time */
+typedef void (PtCallback)(PtTimestamp timestamp, void *userData);
-/*
- Pt_Start() starts a real-time service.
+/** start a real-time clock service.
- resolution is the timer resolution in ms. The time will advance every
- resolution ms.
+ @param resolution the timer resolution in ms. The time will advance every
+ \p resolution ms.
- callback is a function pointer to be called every resolution ms.
+ @param callback a function pointer to be called every resolution ms.
- userData is passed to callback as a parameter.
+ @param userData is passed to \p callback as a parameter.
- return value:
- Upon success, returns ptNoError. See PtError for other values.
+ @return #ptNoError on success. See #PtError for other values.
*/
PMEXPORT PtError Pt_Start(int resolution, PtCallback *callback, void *userData);
-/*
- Pt_Stop() stops the timer.
+/** stop the timer.
- return value:
- Upon success, returns ptNoError. See PtError for other values.
+ @return #ptNoError on success. See #PtError for other values.
*/
PMEXPORT PtError Pt_Stop(void);
-/*
- Pt_Started() returns true iff the timer is running.
+/** test if the timer is running.
+
+ @return TRUE or FALSE
*/
PMEXPORT int Pt_Started(void);
-/*
- Pt_Time() returns the current time in ms.
+/** get the current time in ms.
+
+ @return the current time
*/
PMEXPORT PtTimestamp Pt_Time(void);
-/*
- Pt_Sleep() pauses, allowing other threads to run.
+/** pauses the current thread, allowing other threads to run.
- duration is the length of the pause in ms. The true duration
+ @param duration the length of the pause in ms. The true duration
of the pause may be rounded to the nearest or next clock tick
- as determined by resolution in Pt_Start().
+ as determined by resolution in #Pt_Start().
*/
PMEXPORT void Pt_Sleep(int32_t duration);
+/** @} */
+
#ifdef __cplusplus
}
#endif
diff --git a/3rdparty/portmidi/porttime/porttime.vcproj b/3rdparty/portmidi/porttime/porttime.vcproj
deleted file mode 100644
index a386cce6257..00000000000
--- a/3rdparty/portmidi/porttime/porttime.vcproj
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="PortTime"
- ProjectGUID="{338224B8-D575-408D-BACF-95C557B429BE}"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\$(OutDir)\porttime.pch"
- AssemblerListingLocation=".\$(OutDir)\"
- ObjectFile=".\$(OutDir)\"
- ProgramDataBaseFileName=".\$(OutDir)\"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\$(OutDir)\porttime.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\$(OutDir)\porttime.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="_LIB;WIN32;_DEBUG"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- PrecompiledHeaderFile=".\$(OutDir)\porttime.pch"
- AssemblerListingLocation=".\$(OutDir)\"
- ObjectFile=".\$(OutDir)\"
- ProgramDataBaseFileName=".\$(OutDir)\"
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\$(OutDir)\porttime.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\$(OutDir)\porttime.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath=".\porttime.c"
- >
- </File>
- <File
- RelativePath=".\porttime.h"
- >
- </File>
- <File
- RelativePath=".\ptwinmm.c"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/3rdparty/portmidi/porttime/pthaiku.cpp b/3rdparty/portmidi/porttime/pthaiku.cpp
new file mode 100644
index 00000000000..9d8de14fd3d
--- /dev/null
+++ b/3rdparty/portmidi/porttime/pthaiku.cpp
@@ -0,0 +1,88 @@
+// pthaiku.cpp - portable timer implementation for Haiku
+
+#include "porttime.h"
+#include <Looper.h>
+#include <MessageRunner.h>
+#include <OS.h>
+
+namespace {
+ const uint32 timerMessage = 'PTTM';
+
+ struct TimerLooper : BLooper {
+ TimerLooper() : BLooper() {
+ }
+
+
+ virtual void MessageReceived(BMessage *message)
+ {
+ PtCallback *callback;
+ void *userData;
+ if (message->what == timerMessage && message->FindPointer("callback", (void**)&callback) == B_OK && message->FindPointer("userData", &userData) == B_OK) {
+ (*callback)(Pt_Time(), userData);
+ }
+ BLooper::MessageReceived(message);
+ }
+ };
+
+ bool time_started_flag = false;
+ bigtime_t time_offset;
+ TimerLooper *timerLooper;
+ BMessageRunner *timerRunner;
+}
+
+extern "C" {
+ PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
+ {
+ if (time_started_flag) return ptAlreadyStarted;
+ time_offset = system_time();
+ if (callback) {
+ timerLooper = new TimerLooper;
+ timerLooper->Run();
+ BMessenger target(timerLooper);
+ BMessage message(timerMessage);
+ message.AddPointer("callback", (void*)callback);
+ message.AddPointer("userData", userData);
+ bigtime_t interval = resolution * 1000;
+ timerRunner = new BMessageRunner(target, &message, interval);
+ if(timerRunner->InitCheck() != B_OK) {
+ delete timerRunner;
+ timerRunner = NULL;
+ timerLooper->PostMessage(B_QUIT_REQUESTED);
+ timerLooper = NULL;
+ return ptHostError;
+ }
+ }
+ time_started_flag = true;
+ return ptNoError;
+ }
+
+
+ PtError Pt_Stop()
+ {
+ if (!time_started_flag) return ptAlreadyStopped;
+ time_started_flag = false;
+ delete timerRunner;
+ timerRunner = NULL;
+ timerLooper->PostMessage(B_QUIT_REQUESTED);
+ timerLooper = NULL;
+ return ptNoError;
+ }
+
+
+ int Pt_Started()
+ {
+ return time_started_flag;
+ }
+
+
+ PtTimestamp Pt_Time()
+ {
+ return (system_time() - time_offset) / 1000;
+ }
+
+
+ void Pt_Sleep(int32_t duration)
+ {
+ snooze(duration * 1000);
+ }
+}
diff --git a/3rdparty/portmidi/porttime/ptlinux.c b/3rdparty/portmidi/porttime/ptlinux.c
index c58107c36ad..7302e212311 100644
--- a/3rdparty/portmidi/porttime/ptlinux.c
+++ b/3rdparty/portmidi/porttime/ptlinux.c
@@ -29,7 +29,7 @@ CHANGE LOG
#include <unistd.h>
#include <sys/types.h>
#include "porttime.h"
-#include "sys/time.h"
+#include "time.h"
#include "sys/resource.h"
#include "sys/timeb.h"
#include "pthread.h"
@@ -38,7 +38,7 @@ CHANGE LOG
#define FALSE 0
static int time_started_flag = FALSE;
-static struct timeval time_offset = {0, 0};
+static struct timespec time_offset = {0, 0};
static pthread_t pt_thread_pid;
static int pt_thread_created = FALSE;
@@ -79,7 +79,8 @@ static void *Pt_CallbackProc(void *p)
PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
{
if (time_started_flag) return ptNoError;
- gettimeofday(&time_offset, NULL); /* need this set before process runs */
+ /* need this set before process runs: */
+ clock_gettime(CLOCK_MONOTONIC_RAW, &time_offset);
if (callback) {
int res;
pt_callback_parameters *parms = (pt_callback_parameters *)
@@ -99,7 +100,7 @@ PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
}
-PtError Pt_Stop()
+PtError Pt_Stop(void)
{
/* printf("Pt_Stop called\n"); */
pt_callback_proc_id++;
@@ -112,20 +113,20 @@ PtError Pt_Stop()
}
-int Pt_Started()
+int Pt_Started(void)
{
return time_started_flag;
}
-PtTimestamp Pt_Time()
+PtTimestamp Pt_Time(void)
{
- long seconds, milliseconds;
- struct timeval now;
- gettimeofday(&now, NULL);
+ long seconds, ms;
+ struct timespec now;
+ clock_gettime(CLOCK_MONOTONIC_RAW, &now);
seconds = now.tv_sec - time_offset.tv_sec;
- milliseconds = now.tv_usec - time_offset.tv_usec;
- return seconds * 1000 + milliseconds;
+ ms = (now.tv_nsec - time_offset.tv_nsec) / 1000000; /* round down */
+ return seconds * 1000 + ms;
}
@@ -133,6 +134,3 @@ void Pt_Sleep(int32_t duration)
{
usleep(duration * 1000);
}
-
-
-
diff --git a/3rdparty/portmidi/porttime/ptmacosx_cf.c b/3rdparty/portmidi/porttime/ptmacosx_cf.c
index 3eb0de12f82..1bc9658d216 100644
--- a/3rdparty/portmidi/porttime/ptmacosx_cf.c
+++ b/3rdparty/portmidi/porttime/ptmacosx_cf.c
@@ -111,7 +111,7 @@ PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
}
-PtError Pt_Stop()
+PtError Pt_Stop(void)
{
printf("Pt_Stop called\n");
@@ -121,13 +121,13 @@ PtError Pt_Stop()
}
-int Pt_Started()
+int Pt_Started(void)
{
return time_started_flag;
}
-PtTimestamp Pt_Time()
+PtTimestamp Pt_Time(void)
{
CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();
return (PtTimestamp) ((now - startTime) * 1000.0);
diff --git a/3rdparty/portmidi/porttime/ptmacosx_mach.c b/3rdparty/portmidi/porttime/ptmacosx_mach.c
index 7327818075f..bc6a1a01084 100644
--- a/3rdparty/portmidi/porttime/ptmacosx_mach.c
+++ b/3rdparty/portmidi/porttime/ptmacosx_mach.c
@@ -4,20 +4,29 @@
#include <stdio.h>
#include <CoreAudio/HostTime.h>
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <mach/mach_time.h>
-#include <mach/clock.h>
+#import <mach/mach.h>
+#import <mach/mach_error.h>
+#import <mach/mach_time.h>
+#import <mach/clock.h>
#include <unistd.h>
+#include <AvailabilityMacros.h>
#include "porttime.h"
#include "sys/time.h"
#include "pthread.h"
-#if !defined NSEC_PER_MSEC
-#define NSEC_PER_MSEC 1000000ull
+#ifndef NSEC_PER_MSEC
+#define NSEC_PER_MSEC 1000000
+#endif
+#define THREAD_IMPORTANCE 63
+
+// QOS headers are available as of macOS 10.10
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101000
+#include "sys/qos.h"
+#define HAVE_APPLE_QOS 1
+#else
+#undef HAVE_APPLE_QOS
#endif
-#define THREAD_IMPORTANCE 30
static int time_started_flag = FALSE;
static UInt64 start_time;
@@ -47,7 +56,7 @@ static void *Pt_CallbackProc(void *p)
(thread_policy_t)&extendedPolicy,
THREAD_EXTENDED_POLICY_COUNT);
if (error != KERN_SUCCESS) {
- mach_error((char *)"Couldn't set thread timeshare policy", error);
+ mach_error("Couldn't set thread timeshare policy", error);
}
precedencePolicy.importance = THREAD_IMPORTANCE;
@@ -55,22 +64,65 @@ static void *Pt_CallbackProc(void *p)
(thread_policy_t)&precedencePolicy,
THREAD_PRECEDENCE_POLICY_COUNT);
if (error != KERN_SUCCESS) {
- mach_error((char *)"Couldn't set thread precedence policy", error);
+ mach_error("Couldn't set thread precedence policy", error);
}
+ // Most important, set real-time constraints.
+
+ // Define the guaranteed and max fraction of time for the audio thread.
+ // These "duty cycle" values can range from 0 to 1. A value of 0.5
+ // means the scheduler would give half the time to the thread.
+ // These values have empirically been found to yield good behavior.
+ // Good means that audio performance is high and other threads won't starve.
+ const double kGuaranteedAudioDutyCycle = 0.75;
+ const double kMaxAudioDutyCycle = 0.85;
+
+ // Define constants determining how much time the audio thread can
+ // use in a given time quantum. All times are in milliseconds.
+
+ // About 128 frames @44.1KHz
+ const double kTimeQuantum = 2.9;
+
+ // Time guaranteed each quantum.
+ const double kAudioTimeNeeded = kGuaranteedAudioDutyCycle * kTimeQuantum;
+
+ // Maximum time each quantum.
+ const double kMaxTimeAllowed = kMaxAudioDutyCycle * kTimeQuantum;
+ // Get the conversion factor from milliseconds to absolute time
+ // which is what the time-constraints call needs.
+ mach_timebase_info_data_t tb_info;
+ mach_timebase_info(&tb_info);
+ double ms_to_abs_time =
+ ((double)tb_info.denom / (double)tb_info.numer) * 1000000;
+
+ thread_time_constraint_policy_data_t time_constraints;
+ time_constraints.period = (uint32_t)(kTimeQuantum * ms_to_abs_time);
+ time_constraints.computation = (uint32_t)(kAudioTimeNeeded * ms_to_abs_time);
+ time_constraints.constraint = (uint32_t)(kMaxTimeAllowed * ms_to_abs_time);
+ time_constraints.preemptible = 0;
+
+ error = thread_policy_set(mach_thread_self(),
+ THREAD_TIME_CONSTRAINT_POLICY,
+ (thread_policy_t)&time_constraints,
+ THREAD_TIME_CONSTRAINT_POLICY_COUNT);
+ if (error != KERN_SUCCESS) {
+ mach_error("Couldn't set thread precedence policy", error);
+ }
+
/* to kill a process, just increment the pt_callback_proc_id */
- /* printf("pt_callback_proc_id %d, id %d\n", pt_callback_proc_id, parameters->id); */
+ /* printf("pt_callback_proc_id %d, id %d\n", pt_callback_proc_id,
+ parameters->id); */
while (pt_callback_proc_id == parameters->id) {
/* wait for a multiple of resolution ms */
UInt64 wait_time;
int delay = mytime++ * parameters->resolution - Pt_Time();
- PtTimestamp timestamp;
+ PtTimestamp timestamp;
if (delay < 0) delay = 0;
wait_time = AudioConvertNanosToHostTime((UInt64)delay * NSEC_PER_MSEC);
wait_time += AudioGetCurrentHostTime();
- error = mach_wait_until(wait_time);
- timestamp = Pt_Time();
+ mach_wait_until(wait_time);
+ timestamp = Pt_Time();
(*(parameters->callback))(timestamp, parameters->userData);
}
free(parameters);
@@ -93,7 +145,26 @@ PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
parms->resolution = resolution;
parms->callback = callback;
parms->userData = userData;
+
+#ifdef HAVE_APPLE_QOS
+ pthread_attr_t qosAttribute;
+ pthread_attr_init(&qosAttribute);
+ pthread_attr_set_qos_class_np(&qosAttribute,
+ QOS_CLASS_USER_INTERACTIVE, 0);
+
+ res = pthread_create(&pt_thread_pid, &qosAttribute, Pt_CallbackProc,
+ parms);
+#else
res = pthread_create(&pt_thread_pid, NULL, Pt_CallbackProc, parms);
+#endif
+
+ struct sched_param sp;
+ memset(&sp, 0, sizeof(struct sched_param));
+ sp.sched_priority = sched_get_priority_max(SCHED_RR);
+ if (pthread_setschedparam(pthread_self(), SCHED_RR, &sp) == -1) {
+ return ptHostError;
+ }
+
if (res != 0) return ptHostError;
}
diff --git a/3rdparty/portmidi/porttime/ptwinmm.c b/3rdparty/portmidi/porttime/ptwinmm.c
index 17675bd6c6a..05f5c74eea3 100644
--- a/3rdparty/portmidi/porttime/ptwinmm.c
+++ b/3rdparty/portmidi/porttime/ptwinmm.c
@@ -38,7 +38,7 @@ PMEXPORT PtError Pt_Start(int resolution, PtCallback *callback, void *userData)
}
-PMEXPORT PtError Pt_Stop()
+PMEXPORT PtError Pt_Stop(void)
{
if (!time_started_flag) return ptAlreadyStopped;
if (time_callback && timer_id) {
@@ -52,13 +52,13 @@ PMEXPORT PtError Pt_Stop()
}
-PMEXPORT int Pt_Started()
+PMEXPORT int Pt_Started(void)
{
return time_started_flag;
}
-PMEXPORT PtTimestamp Pt_Time()
+PMEXPORT PtTimestamp Pt_Time(void)
{
return timeGetTime() - time_offset;
}
diff --git a/3rdparty/softfloat/README.txt b/3rdparty/softfloat/README.txt
deleted file mode 100644
index 9500d25e8a3..00000000000
--- a/3rdparty/softfloat/README.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-MAME note: this package is derived from the following original SoftFloat
-package and has been "re-packaged" to work with MAME's conventions and
-build system. The source files come from bits64/ and bits64/templates
-in the original distribution as MAME requires a compiler with a 64-bit
-integer type.
-
-
-Package Overview for SoftFloat Release 2b
-
-John R. Hauser
-2002 May 27
-
-
-----------------------------------------------------------------------------
-Overview
-
-SoftFloat is a software implementation of floating-point that conforms to
-the IEC/IEEE Standard for Binary Floating-Point Arithmetic. SoftFloat is
-distributed in the form of C source code. Compiling the SoftFloat sources
-generates two things:
-
--- A SoftFloat object file (typically `softfloat.o') containing the complete
- set of IEC/IEEE floating-point routines.
-
--- A `timesoftfloat' program for evaluating the speed of the SoftFloat
- routines. (The SoftFloat module is linked into this program.)
-
-The SoftFloat package is documented in four text files:
-
- SoftFloat.txt Documentation for using the SoftFloat functions.
- SoftFloat-source.txt Documentation for compiling SoftFloat.
- SoftFloat-history.txt History of major changes to SoftFloat.
- timesoftfloat.txt Documentation for using `timesoftfloat'.
-
-Other files in the package comprise the source code for SoftFloat.
-
-Please be aware that some work is involved in porting this software to other
-targets. It is not just a matter of getting `make' to complete without
-error messages. I would have written the code that way if I could, but
-there are fundamental differences between systems that can't be hidden.
-You should not attempt to compile SoftFloat without first reading both
-`SoftFloat.txt' and `SoftFloat-source.txt'.
-
-
-----------------------------------------------------------------------------
-Legal Notice
-
-SoftFloat was written by me, John R. Hauser. This work was made possible in
-part by the International Computer Science Institute, located at Suite 600,
-1947 Center Street, Berkeley, California 94704. Funding was partially
-provided by the National Science Foundation under grant MIP-9311980. The
-original version of this code was written as part of a project to build
-a fixed-point vector processor in collaboration with the University of
-California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL
-LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO
-FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER
-SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES,
-COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE
-SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, provided
-that the minimal documentation requirements stated in the source code are
-satisfied.
-
-
-----------------------------------------------------------------------------
-Contact Information
-
-At the time of this writing, the most up-to-date information about
-SoftFloat and the latest release can be found at the Web page `http://
-www.cs.berkeley.edu/~jhauser/arithmetic/SoftFloat.html'.
-
-
diff --git a/3rdparty/softfloat/f2xm1.c b/3rdparty/softfloat/f2xm1.c
deleted file mode 100644
index bd5db4471a7..00000000000
--- a/3rdparty/softfloat/f2xm1.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/*============================================================================
-This source file is an extension to the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b, written for Bochs (x86 achitecture simulator)
-floating point emulation.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-=============================================================================*/
-
-/*============================================================================
- * Written for Bochs (x86 achitecture simulator) by
- * Stanislav Shwartsman [sshwarts at sourceforge net]
- * ==========================================================================*/
-
-#define FLOAT128
-
-#define USE_estimateDiv128To64
-#include "mamesf.h"
-#include "softfloat.h"
-#include "fpu_constant.h"
-
-#define packFloat_128(zHi, zLo) {(zHi), (zLo)}
-#define PACK_FLOAT_128(hi,lo) packFloat_128(LIT64(hi),LIT64(lo))
-
-static const floatx80 floatx80_negone = packFloatx80(1, 0x3fff, 0x8000000000000000U);
-static const floatx80 floatx80_neghalf = packFloatx80(1, 0x3ffe, 0x8000000000000000U);
-static const float128 float128_ln2 =
- packFloat_128(0x3ffe62e42fefa39eU, 0xf35793c7673007e6U);
-
-#define LN2_SIG_HI 0xb17217f7d1cf79abU
-#define LN2_SIG_LO 0xc000000000000000U /* 67-bit precision */
-
-#define EXP_ARR_SIZE 15
-
-static float128 exp_arr[EXP_ARR_SIZE] =
-{
- PACK_FLOAT_128(0x3fff000000000000, 0x0000000000000000), /* 1 */
- PACK_FLOAT_128(0x3ffe000000000000, 0x0000000000000000), /* 2 */
- PACK_FLOAT_128(0x3ffc555555555555, 0x5555555555555555), /* 3 */
- PACK_FLOAT_128(0x3ffa555555555555, 0x5555555555555555), /* 4 */
- PACK_FLOAT_128(0x3ff8111111111111, 0x1111111111111111), /* 5 */
- PACK_FLOAT_128(0x3ff56c16c16c16c1, 0x6c16c16c16c16c17), /* 6 */
- PACK_FLOAT_128(0x3ff2a01a01a01a01, 0xa01a01a01a01a01a), /* 7 */
- PACK_FLOAT_128(0x3fefa01a01a01a01, 0xa01a01a01a01a01a), /* 8 */
- PACK_FLOAT_128(0x3fec71de3a556c73, 0x38faac1c88e50017), /* 9 */
- PACK_FLOAT_128(0x3fe927e4fb7789f5, 0xc72ef016d3ea6679), /* 10 */
- PACK_FLOAT_128(0x3fe5ae64567f544e, 0x38fe747e4b837dc7), /* 11 */
- PACK_FLOAT_128(0x3fe21eed8eff8d89, 0x7b544da987acfe85), /* 12 */
- PACK_FLOAT_128(0x3fde6124613a86d0, 0x97ca38331d23af68), /* 13 */
- PACK_FLOAT_128(0x3fda93974a8c07c9, 0xd20badf145dfa3e5), /* 14 */
- PACK_FLOAT_128(0x3fd6ae7f3e733b81, 0xf11d8656b0ee8cb0) /* 15 */
-};
-
-#define EXP_BIAS 0x3FFF
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloatx80Frac( floatx80 a )
-{
- return a.low;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloatx80Exp( floatx80 a )
-{
- return a.high & 0x7FFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the extended double-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloatx80Sign( floatx80 a )
-{
- return a.high>>15;
-
-}
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal extended double-precision floating-point value
-| represented by the denormalized significand `aSig'. The normalized exponent
-| and significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-INLINE void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr, uint64_t *zSigPtr)
-{
- int shiftCount = countLeadingZeros64(aSig);
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-}
-
-
-/*----------------------------------------------------------------------------
-| Takes extended double-precision floating-point NaN `a' and returns the
-| appropriate NaN result. If `a' is a signaling NaN, the invalid exception
-| is raised.
-*----------------------------------------------------------------------------*/
-
-INLINE floatx80 propagateFloatx80NaN(floatx80 a)
-{
- if (floatx80_is_signaling_nan(a))
- float_raise(float_flag_invalid);
-
- a.low |= 0xC000000000000000U;
-
- return a;
-}
-
-// 2 3 4 n
-// f(x) ~ C + (C * x) + (C * x) + (C * x) + (C * x) + ... + (C * x)
-// 0 1 2 3 4 n
-//
-// -- 2k -- 2k+1
-// p(x) = > C * x q(x) = > C * x
-// -- 2k -- 2k+1
-//
-// f(x) ~ [ p(x) + x * q(x) ]
-//
-
-static float128 EvalPoly(float128 x, float128 *arr, unsigned n)
-{
- float128 x2 = float128_mul(x, x);
- unsigned i;
-
- assert(n > 1);
-
- float128 r1 = arr[--n];
- i = n;
- while(i >= 2) {
- r1 = float128_mul(r1, x2);
- i -= 2;
- r1 = float128_add(r1, arr[i]);
- }
- if (i) r1 = float128_mul(r1, x);
-
- float128 r2 = arr[--n];
- i = n;
- while(i >= 2) {
- r2 = float128_mul(r2, x2);
- i -= 2;
- r2 = float128_add(r2, arr[i]);
- }
- if (i) r2 = float128_mul(r2, x);
-
- return float128_add(r1, r2);
-}
-
-/* required -1 < x < 1 */
-static float128 poly_exp(float128 x)
-{
-/*
- // 2 3 4 5 6 7 8 9
- // x x x x x x x x x
- // e - 1 ~ x + --- + --- + --- + --- + --- + --- + --- + --- + ...
- // 2! 3! 4! 5! 6! 7! 8! 9!
- //
- // 2 3 4 5 6 7 8
- // x x x x x x x x
- // = x [ 1 + --- + --- + --- + --- + --- + --- + --- + --- + ... ]
- // 2! 3! 4! 5! 6! 7! 8! 9!
- //
- // 8 8
- // -- 2k -- 2k+1
- // p(x) = > C * x q(x) = > C * x
- // -- 2k -- 2k+1
- // k=0 k=0
- //
- // x
- // e - 1 ~ x * [ p(x) + x * q(x) ]
- //
-*/
- float128 t = EvalPoly(x, exp_arr, EXP_ARR_SIZE);
- return float128_mul(t, x);
-}
-
-// =================================================
-// x
-// FX2M1 Compute 2 - 1
-// =================================================
-
-//
-// Uses the following identities:
-//
-// 1. ----------------------------------------------------------
-// x x*ln(2)
-// 2 = e
-//
-// 2. ----------------------------------------------------------
-// 2 3 4 5 n
-// x x x x x x x
-// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
-// 1! 2! 3! 4! 5! n!
-//
-
-floatx80 f2xm1(floatx80 a)
-{
- bits64 zSig0, zSig1, zSig2;
-
- bits64 aSig = extractFloatx80Frac(a);
- sbits32 aExp = extractFloatx80Exp(a);
- int aSign = extractFloatx80Sign(a);
-
- if (aExp == 0x7FFF) {
- if ((bits64) (aSig<<1))
- return propagateFloatx80NaN(a);
-
- return (aSign) ? floatx80_negone : a;
- }
-
- if (aExp == 0) {
- if (aSig == 0) return a;
- float_raise(float_flag_denormal | float_flag_inexact);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
-
- tiny_argument:
- mul128By64To192(LN2_SIG_HI, LN2_SIG_LO, aSig, &zSig0, &zSig1, &zSig2);
- if (0 < (sbits64) zSig0) {
- shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
- --aExp;
- }
- return
- roundAndPackFloatx80(80, aSign, aExp, zSig0, zSig1);
- }
-
- float_raise(float_flag_inexact);
-
- if (aExp < 0x3FFF)
- {
- if (aExp < EXP_BIAS-68)
- goto tiny_argument;
-
- /* ******************************** */
- /* using float128 for approximation */
- /* ******************************** */
-
- float128 x = floatx80_to_float128(a);
- x = float128_mul(x, float128_ln2);
- x = poly_exp(x);
- return float128_to_floatx80(x);
- }
- else
- {
- if (a.high == 0xBFFF && ! (aSig<<1))
- return floatx80_neghalf;
-
- return a;
- }
-}
diff --git a/3rdparty/softfloat/fpatan.c b/3rdparty/softfloat/fpatan.c
deleted file mode 100644
index db4e1f983d2..00000000000
--- a/3rdparty/softfloat/fpatan.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/*============================================================================
-This source file is an extension to the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b, written for Bochs (x86 achitecture simulator)
-floating point emulation.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-=============================================================================*/
-
-/*============================================================================
- * Written for Bochs (x86 achitecture simulator) by
- * Stanislav Shwartsman [sshwarts at sourceforge net]
- * Adapted for 3rdparty/softfloat in MAME by Calvin Buckley (05/2021)
- * ==========================================================================*/
-
-#define FLOAT128
-
-#include "mamesf.h"
-#include "softfloat.h"
-//#include "softfloat-specialize"
-#include "fpu_constant.h"
-
-/* XXX: These are common w/ fsincos/fyl2x; should be moved to common header? */
-#define packFloat_128(zHi, zLo) {(zHi), (zLo)}
-#define packFloat2x128m(zHi, zLo) {(zHi), (zLo)}
-#define PACK_FLOAT_128(hi,lo) packFloat2x128m(LIT64(hi),LIT64(lo))
-#define EXP_BIAS 0x3FFF
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloatx80Frac( floatx80 a )
-{
- return a.low;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloatx80Exp( floatx80 a )
-{
- return a.high & 0x7FFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the extended double-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloatx80Sign( floatx80 a )
-{
- return a.high>>15;
-
-}
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal extended double-precision floating-point value
-| represented by the denormalized significand `aSig'. The normalized exponent
-| and significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-INLINE void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr, uint64_t *zSigPtr)
-{
- int shiftCount = countLeadingZeros64(aSig);
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is a
-| NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-INLINE int floatx80_is_nan(floatx80 a)
-{
- return ((a.high & 0x7FFF) == 0x7FFF) && (int64_t) (a.low<<1);
-}
-
-/*----------------------------------------------------------------------------
-| Takes two extended double-precision floating-point values `a' and `b', one
-| of which is a NaN, and returns the appropriate NaN result. If either `a' or
-| `b' is a signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-INLINE floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b )
-{
- flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
-
- aIsNaN = floatx80_is_nan( a );
- aIsSignalingNaN = floatx80_is_signaling_nan( a );
- bIsNaN = floatx80_is_nan( b );
- bIsSignalingNaN = floatx80_is_signaling_nan( b );
- a.low |= LIT64( 0xC000000000000000 );
- b.low |= LIT64( 0xC000000000000000 );
- if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid );
- if ( aIsNaN ) {
- return ( aIsSignalingNaN & bIsNaN ) ? b : a;
- }
- else {
- return b;
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the quadruple-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloat128Exp( float128 a )
-{
- return ( a.high>>48 ) & 0x7FFF;
-
-}
-
-/* end copied */
-
-#define FPATAN_ARR_SIZE 11
-
-static const float128 float128_one =
- packFloat_128(0x3fff000000000000U, 0x0000000000000000U);
-static const float128 float128_sqrt3 =
- packFloat_128(0x3fffbb67ae8584caU, 0xa73b25742d7078b8U);
-static const floatx80 floatx80_one = packFloatx80(0, 0x3fff, 0x8000000000000000U);
-static const floatx80 floatx80_pi =
- packFloatx80(0, 0x4000, 0xc90fdaa22168c235U);
-
-static const float128 float128_pi2 =
- packFloat_128(0x3fff921fb54442d1U, 0x8469898CC5170416U);
-static const float128 float128_pi4 =
- packFloat_128(0x3ffe921fb54442d1U, 0x8469898CC5170416U);
-static const float128 float128_pi6 =
- packFloat_128(0x3ffe0c152382d736U, 0x58465BB32E0F580FU);
-
-static float128 atan_arr[FPATAN_ARR_SIZE] =
-{
- PACK_FLOAT_128(0x3fff000000000000, 0x0000000000000000), /* 1 */
- PACK_FLOAT_128(0xbffd555555555555, 0x5555555555555555), /* 3 */
- PACK_FLOAT_128(0x3ffc999999999999, 0x999999999999999a), /* 5 */
- PACK_FLOAT_128(0xbffc249249249249, 0x2492492492492492), /* 7 */
- PACK_FLOAT_128(0x3ffbc71c71c71c71, 0xc71c71c71c71c71c), /* 9 */
- PACK_FLOAT_128(0xbffb745d1745d174, 0x5d1745d1745d1746), /* 11 */
- PACK_FLOAT_128(0x3ffb3b13b13b13b1, 0x3b13b13b13b13b14), /* 13 */
- PACK_FLOAT_128(0xbffb111111111111, 0x1111111111111111), /* 15 */
- PACK_FLOAT_128(0x3ffae1e1e1e1e1e1, 0xe1e1e1e1e1e1e1e2), /* 17 */
- PACK_FLOAT_128(0xbffaaf286bca1af2, 0x86bca1af286bca1b), /* 19 */
- PACK_FLOAT_128(0x3ffa861861861861, 0x8618618618618618) /* 21 */
-};
-
-extern float128 OddPoly(float128 x, float128 *arr, unsigned n);
-
-/* |x| < 1/4 */
-static float128 poly_atan(float128 x1)
-{
-/*
- // 3 5 7 9 11 13 15 17
- // x x x x x x x x
- // atan(x) ~ x - --- + --- - --- + --- - ---- + ---- - ---- + ----
- // 3 5 7 9 11 13 15 17
- //
- // 2 4 6 8 10 12 14 16
- // x x x x x x x x
- // = x * [ 1 - --- + --- - --- + --- - ---- + ---- - ---- + ---- ]
- // 3 5 7 9 11 13 15 17
- //
- // 5 5
- // -- 4k -- 4k+2
- // p(x) = > C * x q(x) = > C * x
- // -- 2k -- 2k+1
- // k=0 k=0
- //
- // 2
- // atan(x) ~ x * [ p(x) + x * q(x) ]
- //
-*/
- return OddPoly(x1, atan_arr, FPATAN_ARR_SIZE);
-}
-
-// =================================================
-// FPATAN Compute y * log (x)
-// 2
-// =================================================
-
-//
-// Uses the following identities:
-//
-// 1. ----------------------------------------------------------
-//
-// atan(-x) = -atan(x)
-//
-// 2. ----------------------------------------------------------
-//
-// x + y
-// atan(x) + atan(y) = atan -------, xy < 1
-// 1-xy
-//
-// x + y
-// atan(x) + atan(y) = atan ------- + PI, x > 0, xy > 1
-// 1-xy
-//
-// x + y
-// atan(x) + atan(y) = atan ------- - PI, x < 0, xy > 1
-// 1-xy
-//
-// 3. ----------------------------------------------------------
-//
-// atan(x) = atan(INF) + atan(- 1/x)
-//
-// x-1
-// atan(x) = PI/4 + atan( ----- )
-// x+1
-//
-// x * sqrt(3) - 1
-// atan(x) = PI/6 + atan( ----------------- )
-// x + sqrt(3)
-//
-// 4. ----------------------------------------------------------
-// 3 5 7 9 2n+1
-// x x x x n x
-// atan(x) = x - --- + --- - --- + --- - ... + (-1) ------ + ...
-// 3 5 7 9 2n+1
-//
-
-floatx80 floatx80_fpatan(floatx80 a, floatx80 b)
-{
- uint64_t aSig = extractFloatx80Frac(a);
- int32_t aExp = extractFloatx80Exp(a);
- int aSign = extractFloatx80Sign(a);
- uint64_t bSig = extractFloatx80Frac(b);
- int32_t bExp = extractFloatx80Exp(b);
- int bSign = extractFloatx80Sign(b);
-
- int zSign = aSign ^ bSign;
-
- if (bExp == 0x7FFF)
- {
- if ((uint64_t) (bSig<<1))
- return propagateFloatx80NaN(a, b);
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1))
- return propagateFloatx80NaN(a, b);
-
- if (aSign) { /* return 3PI/4 */
- return roundAndPackFloatx80(80, bSign,
- FLOATX80_3PI4_EXP, FLOAT_3PI4_HI, FLOAT_3PI4_LO);
- }
- else { /* return PI/4 */
- return roundAndPackFloatx80(80, bSign,
- FLOATX80_PI4_EXP, FLOAT_PI_HI, FLOAT_PI_LO);
- }
- }
-
- if (aSig && (aExp == 0))
- float_raise(float_flag_denormal);
-
- /* return PI/2 */
- return roundAndPackFloatx80(80, bSign, FLOATX80_PI2_EXP, FLOAT_PI_HI, FLOAT_PI_LO);
- }
- if (aExp == 0x7FFF)
- {
- if ((uint64_t) (aSig<<1))
- return propagateFloatx80NaN(a, b);
-
- if (bSig && (bExp == 0))
- float_raise(float_flag_denormal);
-
-return_PI_or_ZERO:
-
- if (aSign) { /* return PI */
- return roundAndPackFloatx80(80, bSign, FLOATX80_PI_EXP, FLOAT_PI_HI, FLOAT_PI_LO);
- } else { /* return 0 */
- return packFloatx80(bSign, 0, 0);
- }
- }
- if (bExp == 0)
- {
- if (bSig == 0) {
- if (aSig && (aExp == 0)) float_raise(float_flag_denormal);
- goto return_PI_or_ZERO;
- }
-
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(bSig, &bExp, &bSig);
- }
- if (aExp == 0)
- {
- if (aSig == 0) /* return PI/2 */
- return roundAndPackFloatx80(80, bSign, FLOATX80_PI2_EXP, FLOAT_PI_HI, FLOAT_PI_LO);
-
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
-
- float_raise(float_flag_inexact);
-
- /* |a| = |b| ==> return PI/4 */
- if (aSig == bSig && aExp == bExp)
- return roundAndPackFloatx80(80, bSign, FLOATX80_PI4_EXP, FLOAT_PI_HI, FLOAT_PI_LO);
-
- /* ******************************** */
- /* using float128 for approximation */
- /* ******************************** */
-
- float128 a128 = normalizeRoundAndPackFloat128(0, aExp-0x10, aSig, 0);
- float128 b128 = normalizeRoundAndPackFloat128(0, bExp-0x10, bSig, 0);
- float128 x;
- int swap = 0, add_pi6 = 0, add_pi4 = 0;
-
- if (aExp > bExp || (aExp == bExp && aSig > bSig))
- {
- x = float128_div(b128, a128);
- }
- else {
- x = float128_div(a128, b128);
- swap = 1;
- }
-
- int32_t xExp = extractFloat128Exp(x);
-
- if (xExp <= EXP_BIAS-40)
- goto approximation_completed;
-
- if (x.high >= 0x3ffe800000000000U) // 3/4 < x < 1
- {
- /*
- arctan(x) = arctan((x-1)/(x+1)) + pi/4
- */
- float128 t1 = float128_sub(x, float128_one);
- float128 t2 = float128_add(x, float128_one);
- x = float128_div(t1, t2);
- add_pi4 = 1;
- }
- else
- {
- /* argument correction */
- if (xExp >= 0x3FFD) // 1/4 < x < 3/4
- {
- /*
- arctan(x) = arctan((x*sqrt(3)-1)/(x+sqrt(3))) + pi/6
- */
- float128 t1 = float128_mul(x, float128_sqrt3);
- float128 t2 = float128_add(x, float128_sqrt3);
- x = float128_sub(t1, float128_one);
- x = float128_div(x, t2);
- add_pi6 = 1;
- }
- }
-
- x = poly_atan(x);
- if (add_pi6) x = float128_add(x, float128_pi6);
- if (add_pi4) x = float128_add(x, float128_pi4);
-
-approximation_completed:
- if (swap) x = float128_sub(float128_pi2, x);
- floatx80 result = float128_to_floatx80(x);
- if (zSign) result = floatx80_chs(result);
- int rSign = extractFloatx80Sign(result);
- if (!bSign && rSign)
- return floatx80_add(result, floatx80_pi);
- if (bSign && !rSign)
- return floatx80_sub(result, floatx80_pi);
- return result;
-}
-
-// The former function maps to x87 FPATAN, but we can simulate 68881 FATAN with
-// it by simply hardcoding one here.
-floatx80 floatx80_fatan(floatx80 a)
-{
- return floatx80_fpatan(a, floatx80_one);
-}
diff --git a/3rdparty/softfloat/fpu_constant.h b/3rdparty/softfloat/fpu_constant.h
deleted file mode 100644
index fdd9719eb99..00000000000
--- a/3rdparty/softfloat/fpu_constant.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*============================================================================
-This source file is an extension to the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b, written for Bochs (x86 achitecture simulator)
-floating point emulation.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-=============================================================================*/
-
-#ifndef _FPU_CONSTANTS_H_
-#define _FPU_CONSTANTS_H_
-
-// Pentium CPU uses only 68-bit precision M_PI approximation
-#define BETTER_THAN_PENTIUM
-
-/*============================================================================
- * Written for Bochs (x86 achitecture simulator) by
- * Stanislav Shwartsman [sshwarts at sourceforge net]
- * ==========================================================================*/
-
-//////////////////////////////
-// PI, PI/2, PI/4 constants
-//////////////////////////////
-
-#define FLOATX80_PI_EXP (0x4000)
-
-// 128-bit PI fraction
-#ifdef BETTER_THAN_PENTIUM
-#define FLOAT_PI_HI (0xc90fdaa22168c234U)
-#define FLOAT_PI_LO (0xc4c6628b80dc1cd1U)
-#else
-#define FLOAT_PI_HI (0xc90fdaa22168c234U)
-#define FLOAT_PI_LO (0xC000000000000000U)
-#endif
-
-#define FLOATX80_PI2_EXP (0x3FFF)
-#define FLOATX80_PI4_EXP (0x3FFE)
-
-//////////////////////////////
-// 3PI/4 constant
-//////////////////////////////
-
-#define FLOATX80_3PI4_EXP (0x4000)
-
-// 128-bit 3PI/4 fraction
-#ifdef BETTER_THAN_PENTIUM
-#define FLOAT_3PI4_HI (0x96cbe3f9990e91a7U)
-#define FLOAT_3PI4_LO (0x9394c9e8a0a5159cU)
-#else
-#define FLOAT_3PI4_HI (0x96cbe3f9990e91a7U)
-#define FLOAT_3PI4_LO (0x9000000000000000U)
-#endif
-
-//////////////////////////////
-// 1/LN2 constant
-//////////////////////////////
-
-#define FLOAT_LN2INV_EXP (0x3FFF)
-
-// 128-bit 1/LN2 fraction
-#ifdef BETTER_THAN_PENTIUM
-#define FLOAT_LN2INV_HI (0xb8aa3b295c17f0bbU)
-#define FLOAT_LN2INV_LO (0xbe87fed0691d3e89U)
-#else
-#define FLOAT_LN2INV_HI (0xb8aa3b295c17f0bbU)
-#define FLOAT_LN2INV_LO (0xC000000000000000U)
-#endif
-
-#endif
diff --git a/3rdparty/softfloat/fsincos.c b/3rdparty/softfloat/fsincos.c
deleted file mode 100644
index a57b9ccbf87..00000000000
--- a/3rdparty/softfloat/fsincos.c
+++ /dev/null
@@ -1,645 +0,0 @@
-/*============================================================================
-This source file is an extension to the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b, written for Bochs (x86 achitecture simulator)
-floating point emulation.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-=============================================================================*/
-
-/*============================================================================
- * Written for Bochs (x86 achitecture simulator) by
- * Stanislav Shwartsman [sshwarts at sourceforge net]
- * ==========================================================================*/
-
-#define FLOAT128
-
-#define USE_estimateDiv128To64
-#include "mamesf.h"
-#include "softfloat.h"
-//#include "softfloat-specialize"
-#include "fpu_constant.h"
-
-static const floatx80 floatx80_one = packFloatx80(0, 0x3fff, 0x8000000000000000U);
-static const floatx80 floatx80_default_nan = packFloatx80(0, 0xffff, 0xffffffffffffffffU);
-
-#define packFloat2x128m(zHi, zLo) {(zHi), (zLo)}
-#define PACK_FLOAT_128(hi,lo) packFloat2x128m(LIT64(hi),LIT64(lo))
-
-#define EXP_BIAS 0x3FFF
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloatx80Frac( floatx80 a )
-{
- return a.low;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloatx80Exp( floatx80 a )
-{
- return a.high & 0x7FFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the extended double-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloatx80Sign( floatx80 a )
-{
- return a.high>>15;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes extended double-precision floating-point NaN `a' and returns the
-| appropriate NaN result. If `a' is a signaling NaN, the invalid exception
-| is raised.
-*----------------------------------------------------------------------------*/
-
-INLINE floatx80 propagateFloatx80NaNOneArg(floatx80 a)
-{
- if (floatx80_is_signaling_nan(a))
- float_raise(float_flag_invalid);
-
- a.low |= 0xC000000000000000U;
-
- return a;
-}
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal extended double-precision floating-point value
-| represented by the denormalized significand `aSig'. The normalized exponent
-| and significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr, uint64_t *zSigPtr)
-{
- int shiftCount = countLeadingZeros64(aSig);
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-}
-
-/* reduce trigonometric function argument using 128-bit precision
- M_PI approximation */
-static uint64_t argument_reduction_kernel(uint64_t aSig0, int Exp, uint64_t *zSig0, uint64_t *zSig1)
-{
- uint64_t term0, term1, term2;
- uint64_t aSig1 = 0;
-
- shortShift128Left(aSig1, aSig0, Exp, &aSig1, &aSig0);
- uint64_t q = estimateDiv128To64(aSig1, aSig0, FLOAT_PI_HI);
- mul128By64To192(FLOAT_PI_HI, FLOAT_PI_LO, q, &term0, &term1, &term2);
- sub128(aSig1, aSig0, term0, term1, zSig1, zSig0);
- while ((int64_t)(*zSig1) < 0) {
- --q;
- add192(*zSig1, *zSig0, term2, 0, FLOAT_PI_HI, FLOAT_PI_LO, zSig1, zSig0, &term2);
- }
- *zSig1 = term2;
- return q;
-}
-
-static int reduce_trig_arg(int expDiff, int &zSign, uint64_t &aSig0, uint64_t &aSig1)
-{
- uint64_t term0, term1, q = 0;
-
- if (expDiff < 0) {
- shift128Right(aSig0, 0, 1, &aSig0, &aSig1);
- expDiff = 0;
- }
- if (expDiff > 0) {
- q = argument_reduction_kernel(aSig0, expDiff, &aSig0, &aSig1);
- }
- else {
- if (FLOAT_PI_HI <= aSig0) {
- aSig0 -= FLOAT_PI_HI;
- q = 1;
- }
- }
-
- shift128Right(FLOAT_PI_HI, FLOAT_PI_LO, 1, &term0, &term1);
- if (! lt128(aSig0, aSig1, term0, term1))
- {
- int lt = lt128(term0, term1, aSig0, aSig1);
- int eq = eq128(aSig0, aSig1, term0, term1);
-
- if ((eq && (q & 1)) || lt) {
- zSign = !zSign;
- ++q;
- }
- if (lt) sub128(FLOAT_PI_HI, FLOAT_PI_LO, aSig0, aSig1, &aSig0, &aSig1);
- }
-
- return (int)(q & 3);
-}
-
-#define SIN_ARR_SIZE 11
-#define COS_ARR_SIZE 11
-
-static float128 sin_arr[SIN_ARR_SIZE] =
-{
- PACK_FLOAT_128(0x3fff000000000000, 0x0000000000000000), /* 1 */
- PACK_FLOAT_128(0xbffc555555555555, 0x5555555555555555), /* 3 */
- PACK_FLOAT_128(0x3ff8111111111111, 0x1111111111111111), /* 5 */
- PACK_FLOAT_128(0xbff2a01a01a01a01, 0xa01a01a01a01a01a), /* 7 */
- PACK_FLOAT_128(0x3fec71de3a556c73, 0x38faac1c88e50017), /* 9 */
- PACK_FLOAT_128(0xbfe5ae64567f544e, 0x38fe747e4b837dc7), /* 11 */
- PACK_FLOAT_128(0x3fde6124613a86d0, 0x97ca38331d23af68), /* 13 */
- PACK_FLOAT_128(0xbfd6ae7f3e733b81, 0xf11d8656b0ee8cb0), /* 15 */
- PACK_FLOAT_128(0x3fce952c77030ad4, 0xa6b2605197771b00), /* 17 */
- PACK_FLOAT_128(0xbfc62f49b4681415, 0x724ca1ec3b7b9675), /* 19 */
- PACK_FLOAT_128(0x3fbd71b8ef6dcf57, 0x18bef146fcee6e45) /* 21 */
-};
-
-static float128 cos_arr[COS_ARR_SIZE] =
-{
- PACK_FLOAT_128(0x3fff000000000000, 0x0000000000000000), /* 0 */
- PACK_FLOAT_128(0xbffe000000000000, 0x0000000000000000), /* 2 */
- PACK_FLOAT_128(0x3ffa555555555555, 0x5555555555555555), /* 4 */
- PACK_FLOAT_128(0xbff56c16c16c16c1, 0x6c16c16c16c16c17), /* 6 */
- PACK_FLOAT_128(0x3fefa01a01a01a01, 0xa01a01a01a01a01a), /* 8 */
- PACK_FLOAT_128(0xbfe927e4fb7789f5, 0xc72ef016d3ea6679), /* 10 */
- PACK_FLOAT_128(0x3fe21eed8eff8d89, 0x7b544da987acfe85), /* 12 */
- PACK_FLOAT_128(0xbfda93974a8c07c9, 0xd20badf145dfa3e5), /* 14 */
- PACK_FLOAT_128(0x3fd2ae7f3e733b81, 0xf11d8656b0ee8cb0), /* 16 */
- PACK_FLOAT_128(0xbfca6827863b97d9, 0x77bb004886a2c2ab), /* 18 */
- PACK_FLOAT_128(0x3fc1e542ba402022, 0x507a9cad2bf8f0bb) /* 20 */
-};
-
-extern float128 OddPoly (float128 x, float128 *arr, unsigned n);
-
-/* 0 <= x <= pi/4 */
-INLINE float128 poly_sin(float128 x)
-{
- // 3 5 7 9 11 13 15
- // x x x x x x x
- // sin (x) ~ x - --- + --- - --- + --- - ---- + ---- - ---- =
- // 3! 5! 7! 9! 11! 13! 15!
- //
- // 2 4 6 8 10 12 14
- // x x x x x x x
- // = x * [ 1 - --- + --- - --- + --- - ---- + ---- - ---- ] =
- // 3! 5! 7! 9! 11! 13! 15!
- //
- // 3 3
- // -- 4k -- 4k+2
- // p(x) = > C * x > 0 q(x) = > C * x < 0
- // -- 2k -- 2k+1
- // k=0 k=0
- //
- // 2
- // sin(x) ~ x * [ p(x) + x * q(x) ]
- //
-
- return OddPoly(x, sin_arr, SIN_ARR_SIZE);
-}
-
-extern float128 EvenPoly(float128 x, float128 *arr, unsigned n);
-
-/* 0 <= x <= pi/4 */
-INLINE float128 poly_cos(float128 x)
-{
- // 2 4 6 8 10 12 14
- // x x x x x x x
- // cos (x) ~ 1 - --- + --- - --- + --- - ---- + ---- - ----
- // 2! 4! 6! 8! 10! 12! 14!
- //
- // 3 3
- // -- 4k -- 4k+2
- // p(x) = > C * x > 0 q(x) = > C * x < 0
- // -- 2k -- 2k+1
- // k=0 k=0
- //
- // 2
- // cos(x) ~ [ p(x) + x * q(x) ]
- //
-
- return EvenPoly(x, cos_arr, COS_ARR_SIZE);
-}
-
-INLINE void sincos_invalid(floatx80 *sin_a, floatx80 *cos_a, floatx80 a)
-{
- if (sin_a) *sin_a = a;
- if (cos_a) *cos_a = a;
-}
-
-INLINE void sincos_tiny_argument(floatx80 *sin_a, floatx80 *cos_a, floatx80 a)
-{
- if (sin_a) *sin_a = a;
- if (cos_a) *cos_a = floatx80_one;
-}
-
-static floatx80 sincos_approximation(int neg, float128 r, uint64_t quotient)
-{
- if (quotient & 0x1) {
- r = poly_cos(r);
- neg = 0;
- } else {
- r = poly_sin(r);
- }
-
- floatx80 result = float128_to_floatx80(r);
- if (quotient & 0x2)
- neg = ! neg;
-
- if (neg)
- result = floatx80_chs(result);
-
- return result;
-}
-
-// =================================================
-// SFFSINCOS Compute sin(x) and cos(x)
-// =================================================
-
-//
-// Uses the following identities:
-// ----------------------------------------------------------
-//
-// sin(-x) = -sin(x)
-// cos(-x) = cos(x)
-//
-// sin(x+y) = sin(x)*cos(y)+cos(x)*sin(y)
-// cos(x+y) = sin(x)*sin(y)+cos(x)*cos(y)
-//
-// sin(x+ pi/2) = cos(x)
-// sin(x+ pi) = -sin(x)
-// sin(x+3pi/2) = -cos(x)
-// sin(x+2pi) = sin(x)
-//
-
-int sf_fsincos(floatx80 a, floatx80 *sin_a, floatx80 *cos_a)
-{
- uint64_t aSig0, aSig1 = 0;
- int32_t aExp, zExp, expDiff;
- int aSign, zSign;
- int q = 0;
-
- aSig0 = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- /* invalid argument */
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig0<<1)) {
- sincos_invalid(sin_a, cos_a, propagateFloatx80NaNOneArg(a));
- return 0;
- }
-
- float_raise(float_flag_invalid);
- sincos_invalid(sin_a, cos_a, floatx80_default_nan);
- return 0;
- }
-
- if (aExp == 0) {
- if (aSig0 == 0) {
- sincos_tiny_argument(sin_a, cos_a, a);
- return 0;
- }
-
-// float_raise(float_flag_denormal);
-
- /* handle pseudo denormals */
- if (! (aSig0 & 0x8000000000000000U))
- {
- float_raise(float_flag_inexact);
- if (sin_a)
- float_raise(float_flag_underflow);
- sincos_tiny_argument(sin_a, cos_a, a);
- return 0;
- }
-
- normalizeFloatx80Subnormal(aSig0, &aExp, &aSig0);
- }
-
- zSign = aSign;
- zExp = EXP_BIAS;
- expDiff = aExp - zExp;
-
- /* argument is out-of-range */
- if (expDiff >= 63)
- return -1;
-
- float_raise(float_flag_inexact);
-
- if (expDiff < -1) { // doesn't require reduction
- if (expDiff <= -68) {
- a = packFloatx80(aSign, aExp, aSig0);
- sincos_tiny_argument(sin_a, cos_a, a);
- return 0;
- }
- zExp = aExp;
- }
- else {
- q = reduce_trig_arg(expDiff, zSign, aSig0, aSig1);
- }
-
- /* **************************** */
- /* argument reduction completed */
- /* **************************** */
-
- /* using float128 for approximation */
- float128 r = normalizeRoundAndPackFloat128(0, zExp-0x10, aSig0, aSig1);
-
- if (aSign) q = -q;
- if (sin_a) *sin_a = sincos_approximation(zSign, r, q);
- if (cos_a) *cos_a = sincos_approximation(zSign, r, q+1);
-
- return 0;
-}
-
-int floatx80_fsin(floatx80 &a)
-{
- return sf_fsincos(a, &a, 0);
-}
-
-int floatx80_fcos(floatx80 &a)
-{
- return sf_fsincos(a, 0, &a);
-}
-
-// =================================================
-// FPTAN Compute tan(x)
-// =================================================
-
-//
-// Uses the following identities:
-//
-// 1. ----------------------------------------------------------
-//
-// sin(-x) = -sin(x)
-// cos(-x) = cos(x)
-//
-// sin(x+y) = sin(x)*cos(y)+cos(x)*sin(y)
-// cos(x+y) = sin(x)*sin(y)+cos(x)*cos(y)
-//
-// sin(x+ pi/2) = cos(x)
-// sin(x+ pi) = -sin(x)
-// sin(x+3pi/2) = -cos(x)
-// sin(x+2pi) = sin(x)
-//
-// 2. ----------------------------------------------------------
-//
-// sin(x)
-// tan(x) = ------
-// cos(x)
-//
-
-int floatx80_ftan(floatx80 &a)
-{
- uint64_t aSig0, aSig1 = 0;
- int32_t aExp, zExp, expDiff;
- int aSign, zSign;
- int q = 0;
-
- aSig0 = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
-
- /* invalid argument */
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig0<<1))
- {
- a = propagateFloatx80NaNOneArg(a);
- return 0;
- }
-
- float_raise(float_flag_invalid);
- a = floatx80_default_nan;
- return 0;
- }
-
- if (aExp == 0) {
- if (aSig0 == 0) return 0;
-// float_raise(float_flag_denormal);
- /* handle pseudo denormals */
- if (! (aSig0 & 0x8000000000000000U))
- {
- float_raise(float_flag_inexact | float_flag_underflow);
- return 0;
- }
- normalizeFloatx80Subnormal(aSig0, &aExp, &aSig0);
- }
-
- zSign = aSign;
- zExp = EXP_BIAS;
- expDiff = aExp - zExp;
-
- /* argument is out-of-range */
- if (expDiff >= 63)
- return -1;
-
- float_raise(float_flag_inexact);
-
- if (expDiff < -1) { // doesn't require reduction
- if (expDiff <= -68) {
- a = packFloatx80(aSign, aExp, aSig0);
- return 0;
- }
- zExp = aExp;
- }
- else {
- q = reduce_trig_arg(expDiff, zSign, aSig0, aSig1);
- }
-
- /* **************************** */
- /* argument reduction completed */
- /* **************************** */
-
- /* using float128 for approximation */
- float128 r = normalizeRoundAndPackFloat128(0, zExp-0x10, aSig0, aSig1);
-
- float128 sin_r = poly_sin(r);
- float128 cos_r = poly_cos(r);
-
- if (q & 0x1) {
- r = float128_div(cos_r, sin_r);
- zSign = ! zSign;
- } else {
- r = float128_div(sin_r, cos_r);
- }
-
- a = float128_to_floatx80(r);
- if (zSign)
- a = floatx80_chs(a);
-
- return 0;
-}
-
-// 2 3 4 n
-// f(x) ~ C + (C * x) + (C * x) + (C * x) + (C * x) + ... + (C * x)
-// 0 1 2 3 4 n
-//
-// -- 2k -- 2k+1
-// p(x) = > C * x q(x) = > C * x
-// -- 2k -- 2k+1
-//
-// f(x) ~ [ p(x) + x * q(x) ]
-//
-
-float128 EvalPoly(float128 x, float128 *arr, unsigned n)
-{
- float128 x2 = float128_mul(x, x);
- unsigned i;
-
- assert(n > 1);
-
- float128 r1 = arr[--n];
- i = n;
- while(i >= 2) {
- r1 = float128_mul(r1, x2);
- i -= 2;
- r1 = float128_add(r1, arr[i]);
- }
- if (i) r1 = float128_mul(r1, x);
-
- float128 r2 = arr[--n];
- i = n;
- while(i >= 2) {
- r2 = float128_mul(r2, x2);
- i -= 2;
- r2 = float128_add(r2, arr[i]);
- }
- if (i) r2 = float128_mul(r2, x);
-
- return float128_add(r1, r2);
-}
-
-// 2 4 6 8 2n
-// f(x) ~ C + (C * x) + (C * x) + (C * x) + (C * x) + ... + (C * x)
-// 0 1 2 3 4 n
-//
-// -- 4k -- 4k+2
-// p(x) = > C * x q(x) = > C * x
-// -- 2k -- 2k+1
-//
-// 2
-// f(x) ~ [ p(x) + x * q(x) ]
-//
-
-float128 EvenPoly(float128 x, float128 *arr, unsigned n)
-{
- return EvalPoly(float128_mul(x, x), arr, n);
-}
-
-// 3 5 7 9 2n+1
-// f(x) ~ (C * x) + (C * x) + (C * x) + (C * x) + (C * x) + ... + (C * x)
-// 0 1 2 3 4 n
-// 2 4 6 8 2n
-// = x * [ C + (C * x) + (C * x) + (C * x) + (C * x) + ... + (C * x)
-// 0 1 2 3 4 n
-//
-// -- 4k -- 4k+2
-// p(x) = > C * x q(x) = > C * x
-// -- 2k -- 2k+1
-//
-// 2
-// f(x) ~ x * [ p(x) + x * q(x) ]
-//
-
-float128 OddPoly(float128 x, float128 *arr, unsigned n)
-{
- return float128_mul(x, EvenPoly(x, arr, n));
-}
-
-/*----------------------------------------------------------------------------
-| Scales extended double-precision floating-point value in operand `a' by
-| value `b'. The function truncates the value in the second operand 'b' to
-| an integral value and adds that value to the exponent of the operand 'a'.
-| The operation performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-extern floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b );
-
-floatx80 floatx80_scale(floatx80 a, floatx80 b)
-{
- sbits32 aExp, bExp;
- bits64 aSig, bSig;
-
- // handle unsupported extended double-precision floating encodings
-/* if (floatx80_is_unsupported(a) || floatx80_is_unsupported(b))
- {
- float_raise(float_flag_invalid);
- return floatx80_default_nan;
- }*/
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- int aSign = extractFloatx80Sign(a);
- bSig = extractFloatx80Frac(b);
- bExp = extractFloatx80Exp(b);
- int bSign = extractFloatx80Sign(b);
-
- if (aExp == 0x7FFF) {
- if ((bits64) (aSig<<1) || ((bExp == 0x7FFF) && (bits64) (bSig<<1)))
- {
- return propagateFloatx80NaN(a, b);
- }
- if ((bExp == 0x7FFF) && bSign) {
- float_raise(float_flag_invalid);
- return floatx80_default_nan;
- }
- if (bSig && (bExp == 0)) float_raise(float_flag_denormal);
- return a;
- }
- if (bExp == 0x7FFF) {
- if ((bits64) (bSig<<1)) return propagateFloatx80NaN(a, b);
- if ((aExp | aSig) == 0) {
- if (! bSign) {
- float_raise(float_flag_invalid);
- return floatx80_default_nan;
- }
- return a;
- }
- if (aSig && (aExp == 0)) float_raise(float_flag_denormal);
- if (bSign) return packFloatx80(aSign, 0, 0);
- return packFloatx80(aSign, 0x7FFF, 0x8000000000000000U);
- }
- if (aExp == 0) {
- if (aSig == 0) return a;
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
- if (bExp == 0) {
- if (bSig == 0) return a;
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(bSig, &bExp, &bSig);
- }
-
- if (bExp > 0x400E) {
- /* generate appropriate overflow/underflow */
- return roundAndPackFloatx80(80, aSign,
- bSign ? -0x3FFF : 0x7FFF, aSig, 0);
- }
- if (bExp < 0x3FFF) return a;
-
- int shiftCount = 0x403E - bExp;
- bSig >>= shiftCount;
- sbits32 scale = bSig;
- if (bSign) scale = -scale; /* -32768..32767 */
- return
- roundAndPackFloatx80(80, aSign, aExp+scale, aSig, 0);
-}
diff --git a/3rdparty/softfloat/fyl2x.c b/3rdparty/softfloat/fyl2x.c
deleted file mode 100644
index ed75e3e569c..00000000000
--- a/3rdparty/softfloat/fyl2x.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/*============================================================================
-This source file is an extension to the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b, written for Bochs (x86 achitecture simulator)
-floating point emulation.
-float_raise(float_flag_invalid)
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-=============================================================================*/
-
-/*============================================================================
- * Written for Bochs (x86 achitecture simulator) by
- * Stanislav Shwartsman [sshwarts at sourceforge net]
- * Adapted for lib/softfloat in MESS by Hans Ostermeyer (03/2012)
- * ==========================================================================*/
-
-#define FLOAT128
-
-#define USE_estimateDiv128To64
-#include "mamesf.h"
-#include "softfloat.h"
-//#include "softfloat-specialize"
-#include "fpu_constant.h"
-
-static const floatx80 floatx80_log10_2 = packFloatx80(0, 0x3ffd, 0x9a209a84fbcff798U);
-static const floatx80 floatx80_ln_2 = packFloatx80(0, 0x3ffe, 0xb17217f7d1cf79acU);
-static const floatx80 floatx80_one = packFloatx80(0, 0x3fff, 0x8000000000000000U);
-static const floatx80 floatx80_default_nan = packFloatx80(0, 0xffff, 0xffffffffffffffffU);
-
-#define packFloat_128(zHi, zLo) {(zHi), (zLo)}
-#define PACK_FLOAT_128(hi,lo) packFloat_128(LIT64(hi),LIT64(lo))
-
-#define EXP_BIAS 0x3FFF
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloatx80Frac( floatx80 a )
-{
- return a.low;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloatx80Exp( floatx80 a )
-{
- return a.high & 0x7FFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the extended double-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloatx80Sign( floatx80 a )
-{
- return a.high>>15;
-
-}
-
-#if 0
-/*----------------------------------------------------------------------------
-| Takes extended double-precision floating-point NaN `a' and returns the
-| appropriate NaN result. If `a' is a signaling NaN, the invalid exception
-| is raised.
-*----------------------------------------------------------------------------*/
-
-INLINE floatx80 propagateFloatx80NaNOneArg(floatx80 a)
-{
- if (floatx80_is_signaling_nan(a))
- float_raise(float_flag_invalid);
-
- a.low |= 0xC000000000000000U;
-
- return a;
-}
-#endif
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal extended double-precision floating-point value
-| represented by the denormalized significand `aSig'. The normalized exponent
-| and significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-INLINE void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr, uint64_t *zSigPtr)
-{
- int shiftCount = countLeadingZeros64(aSig);
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-}
-
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is a
-| NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-INLINE int floatx80_is_nan(floatx80 a)
-{
- return ((a.high & 0x7FFF) == 0x7FFF) && (int64_t) (a.low<<1);
-}
-
-/*----------------------------------------------------------------------------
-| Takes two extended double-precision floating-point values `a' and `b', one
-| of which is a NaN, and returns the appropriate NaN result. If either `a' or
-| `b' is a signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-static floatx80 propagateFloatx80NaN(floatx80 a, floatx80 b)
-{
- int aIsNaN = floatx80_is_nan(a);
- int aIsSignalingNaN = floatx80_is_signaling_nan(a);
- int bIsNaN = floatx80_is_nan(b);
- int bIsSignalingNaN = floatx80_is_signaling_nan(b);
- a.low |= 0xC000000000000000U;
- b.low |= 0xC000000000000000U;
- if (aIsSignalingNaN | bIsSignalingNaN) float_raise(float_flag_invalid);
- if (aIsSignalingNaN) {
- if (bIsSignalingNaN) goto returnLargerSignificand;
- return bIsNaN ? b : a;
- }
- else if (aIsNaN) {
- if (bIsSignalingNaN | ! bIsNaN) return a;
- returnLargerSignificand:
- if (a.low < b.low) return b;
- if (b.low < a.low) return a;
- return (a.high < b.high) ? a : b;
- }
- else {
- return b;
- }
-}
-
-static const float128 float128_one =
- packFloat_128(0x3fff000000000000U, 0x0000000000000000U);
-static const float128 float128_two =
- packFloat_128(0x4000000000000000U, 0x0000000000000000U);
-
-static const float128 float128_ln2inv2 =
- packFloat_128(0x400071547652b82fU, 0xe1777d0ffda0d23aU);
-
-#define SQRT2_HALF_SIG 0xb504f333f9de6484U
-
-extern float128 OddPoly(float128 x, float128 *arr, unsigned n);
-
-#define L2_ARR_SIZE 9
-
-static float128 ln_arr[L2_ARR_SIZE] =
-{
- PACK_FLOAT_128(0x3fff000000000000, 0x0000000000000000), /* 1 */
- PACK_FLOAT_128(0x3ffd555555555555, 0x5555555555555555), /* 3 */
- PACK_FLOAT_128(0x3ffc999999999999, 0x999999999999999a), /* 5 */
- PACK_FLOAT_128(0x3ffc249249249249, 0x2492492492492492), /* 7 */
- PACK_FLOAT_128(0x3ffbc71c71c71c71, 0xc71c71c71c71c71c), /* 9 */
- PACK_FLOAT_128(0x3ffb745d1745d174, 0x5d1745d1745d1746), /* 11 */
- PACK_FLOAT_128(0x3ffb3b13b13b13b1, 0x3b13b13b13b13b14), /* 13 */
- PACK_FLOAT_128(0x3ffb111111111111, 0x1111111111111111), /* 15 */
- PACK_FLOAT_128(0x3ffae1e1e1e1e1e1, 0xe1e1e1e1e1e1e1e2) /* 17 */
-};
-
-static float128 poly_ln(float128 x1)
-{
-/*
- //
- // 3 5 7 9 11 13 15
- // 1+u u u u u u u u
- // 1/2 ln --- ~ u + --- + --- + --- + --- + ---- + ---- + ---- =
- // 1-u 3 5 7 9 11 13 15
- //
- // 2 4 6 8 10 12 14
- // u u u u u u u
- // = u * [ 1 + --- + --- + --- + --- + ---- + ---- + ---- ] =
- // 3 5 7 9 11 13 15
- //
- // 3 3
- // -- 4k -- 4k+2
- // p(u) = > C * u q(u) = > C * u
- // -- 2k -- 2k+1
- // k=0 k=0
- //
- // 1+u 2
- // 1/2 ln --- ~ u * [ p(u) + u * q(u) ]
- // 1-u
- //
-*/
- return OddPoly(x1, ln_arr, L2_ARR_SIZE);
-}
-
-/* required sqrt(2)/2 < x < sqrt(2) */
-static float128 poly_l2(float128 x)
-{
- /* using float128 for approximation */
- float128 x_p1 = float128_add(x, float128_one);
- float128 x_m1 = float128_sub(x, float128_one);
- x = float128_div(x_m1, x_p1);
- x = poly_ln(x);
- x = float128_mul(x, float128_ln2inv2);
- return x;
-}
-
-static float128 poly_l2p1(float128 x)
-{
- /* using float128 for approximation */
- float128 x_p2 = float128_add(x, float128_two);
- x = float128_div(x, x_p2);
- x = poly_ln(x);
- x = float128_mul(x, float128_ln2inv2);
- return x;
-}
-
-// =================================================
-// FYL2X Compute y * log (x)
-// 2
-// =================================================
-
-//
-// Uses the following identities:
-//
-// 1. ----------------------------------------------------------
-// ln(x)
-// log (x) = -------, ln (x*y) = ln(x) + ln(y)
-// 2 ln(2)
-//
-// 2. ----------------------------------------------------------
-// 1+u x-1
-// ln (x) = ln -----, when u = -----
-// 1-u x+1
-//
-// 3. ----------------------------------------------------------
-// 3 5 7 2n+1
-// 1+u u u u u
-// ln ----- = 2 [ u + --- + --- + --- + ... + ------ + ... ]
-// 1-u 3 5 7 2n+1
-//
-
-floatx80 fyl2x(floatx80 a, floatx80 b)
-{
- uint64_t aSig = extractFloatx80Frac(a);
- int32_t aExp = extractFloatx80Exp(a);
- int aSign = extractFloatx80Sign(a);
- uint64_t bSig = extractFloatx80Frac(b);
- int32_t bExp = extractFloatx80Exp(b);
- int bSign = extractFloatx80Sign(b);
-
- int zSign = bSign ^ 1;
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)
- || ((bExp == 0x7FFF) && (uint64_t) (bSig<<1)))
- {
- return propagateFloatx80NaN(a, b);
- }
- if (aSign)
- {
-invalid:
- float_raise(float_flag_invalid);
- return floatx80_default_nan;
- }
- else {
- if (bExp == 0) {
- if (bSig == 0) goto invalid;
- float_raise(float_flag_denormal);
- }
- return packFloatx80(bSign, 0x7FFF, 0x8000000000000000U);
- }
- }
- if (bExp == 0x7FFF)
- {
- if ((uint64_t) (bSig<<1)) return propagateFloatx80NaN(a, b);
- if (aSign && (uint64_t)(aExp | aSig)) goto invalid;
- if (aSig && (aExp == 0))
- float_raise(float_flag_denormal);
- if (aExp < 0x3FFF) {
- return packFloatx80(zSign, 0x7FFF, 0x8000000000000000U);
- }
- if (aExp == 0x3FFF && ((uint64_t) (aSig<<1) == 0)) goto invalid;
- return packFloatx80(bSign, 0x7FFF, 0x8000000000000000U);
- }
- if (aExp == 0) {
- if (aSig == 0) {
- if ((bExp | bSig) == 0) goto invalid;
- float_raise(float_flag_divbyzero);
- return packFloatx80(zSign, 0x7FFF, 0x8000000000000000U);
- }
- if (aSign) goto invalid;
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
- if (aSign) goto invalid;
- if (bExp == 0) {
- if (bSig == 0) {
- if (aExp < 0x3FFF) return packFloatx80(zSign, 0, 0);
- return packFloatx80(bSign, 0, 0);
- }
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(bSig, &bExp, &bSig);
- }
- if (aExp == 0x3FFF && ((uint64_t) (aSig<<1) == 0))
- return packFloatx80(bSign, 0, 0);
-
- float_raise(float_flag_inexact);
-
- int ExpDiff = aExp - 0x3FFF;
- aExp = 0;
- if (aSig >= SQRT2_HALF_SIG) {
- ExpDiff++;
- aExp--;
- }
-
- /* ******************************** */
- /* using float128 for approximation */
- /* ******************************** */
-
- uint64_t zSig0, zSig1;
- shift128Right(aSig<<1, 0, 16, &zSig0, &zSig1);
- float128 x = packFloat128(0, aExp+0x3FFF, zSig0, zSig1);
- x = poly_l2(x);
- x = float128_add(x, int64_to_float128((int64_t) ExpDiff));
- return floatx80_mul(b, float128_to_floatx80(x));
-}
-
-// =================================================
-// FYL2XP1 Compute y * log (x + 1)
-// 2
-// =================================================
-
-//
-// Uses the following identities:
-//
-// 1. ----------------------------------------------------------
-// ln(x)
-// log (x) = -------
-// 2 ln(2)
-//
-// 2. ----------------------------------------------------------
-// 1+u x
-// ln (x+1) = ln -----, when u = -----
-// 1-u x+2
-//
-// 3. ----------------------------------------------------------
-// 3 5 7 2n+1
-// 1+u u u u u
-// ln ----- = 2 [ u + --- + --- + --- + ... + ------ + ... ]
-// 1-u 3 5 7 2n+1
-//
-
-floatx80 fyl2xp1(floatx80 a, floatx80 b)
-{
- int32_t aExp, bExp;
- uint64_t aSig, bSig, zSig0, zSig1, zSig2;
- int aSign, bSign;
-
- aSig = extractFloatx80Frac(a);
- aExp = extractFloatx80Exp(a);
- aSign = extractFloatx80Sign(a);
- bSig = extractFloatx80Frac(b);
- bExp = extractFloatx80Exp(b);
- bSign = extractFloatx80Sign(b);
- int zSign = aSign ^ bSign;
-
- if (aExp == 0x7FFF) {
- if ((uint64_t) (aSig<<1)
- || ((bExp == 0x7FFF) && (uint64_t) (bSig<<1)))
- {
- return propagateFloatx80NaN(a, b);
- }
- if (aSign)
- {
-invalid:
- float_raise(float_flag_invalid);
- return floatx80_default_nan;
- }
- else {
- if (bExp == 0) {
- if (bSig == 0) goto invalid;
- float_raise(float_flag_denormal);
- }
- return packFloatx80(bSign, 0x7FFF, 0x8000000000000000U);
- }
- }
- if (bExp == 0x7FFF)
- {
- if ((uint64_t) (bSig<<1))
- return propagateFloatx80NaN(a, b);
-
- if (aExp == 0) {
- if (aSig == 0) goto invalid;
- float_raise(float_flag_denormal);
- }
-
- return packFloatx80(zSign, 0x7FFF, 0x8000000000000000U);
- }
- if (aExp == 0) {
- if (aSig == 0) {
- if (bSig && (bExp == 0)) float_raise(float_flag_denormal);
- return packFloatx80(zSign, 0, 0);
- }
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
- }
- if (bExp == 0) {
- if (bSig == 0) return packFloatx80(zSign, 0, 0);
- float_raise(float_flag_denormal);
- normalizeFloatx80Subnormal(bSig, &bExp, &bSig);
- }
-
- float_raise(float_flag_inexact);
-
- if (aSign && aExp >= 0x3FFF)
- return a;
-
- if (aExp >= 0x3FFC) // big argument
- {
- return fyl2x(floatx80_add(a, floatx80_one), b);
- }
-
- // handle tiny argument
- if (aExp < EXP_BIAS-70)
- {
- // first order approximation, return (a*b)/ln(2)
- int32_t zExp = aExp + FLOAT_LN2INV_EXP - 0x3FFE;
-
- mul128By64To192(FLOAT_LN2INV_HI, FLOAT_LN2INV_LO, aSig, &zSig0, &zSig1, &zSig2);
- if (0 < (int64_t) zSig0) {
- shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
- --zExp;
- }
-
- zExp = zExp + bExp - 0x3FFE;
- mul128By64To192(zSig0, zSig1, bSig, &zSig0, &zSig1, &zSig2);
- if (0 < (int64_t) zSig0) {
- shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
- --zExp;
- }
-
- return
- roundAndPackFloatx80(80, aSign ^ bSign, zExp, zSig0, zSig1);
- }
-
- /* ******************************** */
- /* using float128 for approximation */
- /* ******************************** */
-
- shift128Right(aSig<<1, 0, 16, &zSig0, &zSig1);
- float128 x = packFloat128(aSign, aExp, zSig0, zSig1);
- x = poly_l2p1(x);
- return floatx80_mul(b, float128_to_floatx80(x));
-}
-
-floatx80 floatx80_flognp1(floatx80 a)
-{
- return fyl2xp1(a, floatx80_ln_2);
-}
-
-floatx80 floatx80_flogn(floatx80 a)
-{
- return fyl2x(a, floatx80_ln_2);
-}
-
-floatx80 floatx80_flog2(floatx80 a)
-{
- return fyl2x(a, floatx80_one);
-}
-
-floatx80 floatx80_flog10(floatx80 a)
-{
- return fyl2x(a, floatx80_log10_2);
-}
diff --git a/3rdparty/softfloat/mamesf.h b/3rdparty/softfloat/mamesf.h
deleted file mode 100644
index 437f54834e3..00000000000
--- a/3rdparty/softfloat/mamesf.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*----------------------------------------------------------------------------
-| One of the macros `BIGENDIAN' or `LITTLEENDIAN' must be defined.
-*----------------------------------------------------------------------------*/
-#ifdef LSB_FIRST
-#define LITTLEENDIAN
-#else
-#define BIGENDIAN
-#endif
-
-/*----------------------------------------------------------------------------
-| The macro `BITS64' can be defined to indicate that 64-bit integer types are
-| supported by the compiler.
-*----------------------------------------------------------------------------*/
-#define BITS64
-
-/*----------------------------------------------------------------------------
-| Each of the following `typedef's defines the most convenient type that holds
-| integers of at least as many bits as specified. For example, `uint8' should
-| be the most convenient type that can hold unsigned integers of as many as
-| 8 bits. The `flag' type must be able to hold either a 0 or 1. For most
-| implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed
-| to the same as `int'.
-*----------------------------------------------------------------------------*/
-#include "assert.h"
-#include "osdcomm.h"
-
-typedef int8_t flag;
-typedef uint8_t uint8;
-typedef int8_t int8;
-typedef uint16_t uint16;
-typedef int16_t int16;
-typedef uint32_t uint32;
-typedef int32_t int32;
-typedef uint64_t uint64;
-typedef int64_t int64;
-
-/*----------------------------------------------------------------------------
-| Each of the following `typedef's defines a type that holds integers
-| of _exactly_ the number of bits specified. For instance, for most
-| implementation of C, `bits16' and `sbits16' should be `typedef'ed to
-| `unsigned short int' and `signed short int' (or `short int'), respectively.
-*----------------------------------------------------------------------------*/
-typedef uint8_t bits8;
-typedef int8_t sbits8;
-typedef uint16_t bits16;
-typedef int16_t sbits16;
-typedef uint32_t bits32;
-typedef int32_t sbits32;
-typedef uint64_t bits64;
-typedef int64_t sbits64;
-
-/*----------------------------------------------------------------------------
-| The `LIT64' macro takes as its argument a textual integer literal and
-| if necessary ``marks'' the literal as having a 64-bit integer type.
-| For example, the GNU C Compiler (`gcc') requires that 64-bit literals be
-| appended with the letters `LL' standing for `long long', which is `gcc's
-| name for the 64-bit integer type. Some compilers may allow `LIT64' to be
-| defined as the identity macro: `#define LIT64( a ) a'.
-*----------------------------------------------------------------------------*/
-#define LIT64( a ) a##ULL
-
-/*----------------------------------------------------------------------------
-| The macro `INLINE' can be used before functions that should be inlined. If
-| a compiler does not support explicit inlining, this macro should be defined
-| to be `static'.
-*----------------------------------------------------------------------------*/
-#define INLINE static inline
diff --git a/3rdparty/softfloat/milieu.h b/3rdparty/softfloat/milieu.h
deleted file mode 100644
index 10687b755d0..00000000000
--- a/3rdparty/softfloat/milieu.h
+++ /dev/null
@@ -1,42 +0,0 @@
-
-/*============================================================================
-
-This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
-Package, Release 2b.
-
-Written by John R. Hauser. This work was made possible in part by the
-International Computer Science Institute, located at Suite 600, 1947 Center
-Street, Berkeley, California 94704. Funding was partially provided by the
-National Science Foundation under grant MIP-9311980. The original version
-of this code was written as part of a project to build a fixed-point vector
-processor in collaboration with the University of California at Berkeley,
-overseen by Profs. Nelson Morgan and John Wawrzynek. More information
-is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
-arithmetic/SoftFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-
-=============================================================================*/
-
-/*----------------------------------------------------------------------------
-| Include common integer types and flags.
-*----------------------------------------------------------------------------*/
-#include "mamesf.h"
-
-/*----------------------------------------------------------------------------
-| Symbolic Boolean literals.
-*----------------------------------------------------------------------------*/
-#define FALSE 0
-#define TRUE 1
diff --git a/3rdparty/softfloat/softfloat-macros b/3rdparty/softfloat/softfloat-macros
deleted file mode 100644
index f58a30472ac..00000000000
--- a/3rdparty/softfloat/softfloat-macros
+++ /dev/null
@@ -1,732 +0,0 @@
-
-/*============================================================================
-
-This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b.
-
-Written by John R. Hauser. This work was made possible in part by the
-International Computer Science Institute, located at Suite 600, 1947 Center
-Street, Berkeley, California 94704. Funding was partially provided by the
-National Science Foundation under grant MIP-9311980. The original version
-of this code was written as part of a project to build a fixed-point vector
-processor in collaboration with the University of California at Berkeley,
-overseen by Profs. Nelson Morgan and John Wawrzynek. More information
-is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
-arithmetic/SoftFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal notice) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-
-=============================================================================*/
-
-/*----------------------------------------------------------------------------
-| Shifts `a' right by the number of bits given in `count'. If any nonzero
-| bits are shifted off, they are ``jammed'' into the least significant bit of
-| the result by setting the least significant bit to 1. The value of `count'
-| can be arbitrarily large; in particular, if `count' is greater than 32, the
-| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
-| The result is stored in the location pointed to by `zPtr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void shift32RightJamming( bits32 a, int16 count, bits32 *zPtr )
-{
- bits32 z;
-
- if ( count == 0 ) {
- z = a;
- }
- else if ( count < 32 ) {
- z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 );
- }
- else {
- z = ( a != 0 );
- }
- *zPtr = z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts `a' right by the number of bits given in `count'. If any nonzero
-| bits are shifted off, they are ``jammed'' into the least significant bit of
-| the result by setting the least significant bit to 1. The value of `count'
-| can be arbitrarily large; in particular, if `count' is greater than 64, the
-| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
-| The result is stored in the location pointed to by `zPtr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void shift64RightJamming( bits64 a, int16 count, bits64 *zPtr )
-{
- bits64 z;
-
- if ( count == 0 ) {
- z = a;
- }
- else if ( count < 64 ) {
- z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 );
- }
- else {
- z = ( a != 0 );
- }
- *zPtr = z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64
-| _plus_ the number of bits given in `count'. The shifted result is at most
-| 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'. The
-| bits shifted off form a second 64-bit result as follows: The _last_ bit
-| shifted off is the most-significant bit of the extra result, and the other
-| 63 bits of the extra result are all zero if and only if _all_but_the_last_
-| bits shifted off were all zero. This extra result is stored in the location
-| pointed to by `z1Ptr'. The value of `count' can be arbitrarily large.
-| (This routine makes more sense if `a0' and `a1' are considered to form
-| a fixed-point value with binary point between `a0' and `a1'. This fixed-
-| point value is shifted right by the number of bits given in `count', and
-| the integer part of the result is returned at the location pointed to by
-| `z0Ptr'. The fractional part of the result may be slightly corrupted as
-| described above, and is returned at the location pointed to by `z1Ptr'.)
-*----------------------------------------------------------------------------*/
-
-INLINE void
- shift64ExtraRightJamming(
- bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
-{
- bits64 z0, z1;
- int8 negCount = ( - count ) & 63;
-
- if ( count == 0 ) {
- z1 = a1;
- z0 = a0;
- }
- else if ( count < 64 ) {
- z1 = ( a0<<negCount ) | ( a1 != 0 );
- z0 = a0>>count;
- }
- else {
- if ( count == 64 ) {
- z1 = a0 | ( a1 != 0 );
- }
- else {
- z1 = ( ( a0 | a1 ) != 0 );
- }
- z0 = 0;
- }
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
-| number of bits given in `count'. Any bits shifted off are lost. The value
-| of `count' can be arbitrarily large; in particular, if `count' is greater
-| than 128, the result will be 0. The result is broken into two 64-bit pieces
-| which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- shift128Right(
- bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
-{
- bits64 z0, z1;
- int8 negCount = ( - count ) & 63;
-
- if ( count == 0 ) {
- z1 = a1;
- z0 = a0;
- }
- else if ( count < 64 ) {
- z1 = ( a0<<negCount ) | ( a1>>count );
- z0 = a0>>count;
- }
- else {
- z1 = ( count < 64 ) ? ( a0>>( count & 63 ) ) : 0;
- z0 = 0;
- }
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
-| number of bits given in `count'. If any nonzero bits are shifted off, they
-| are ``jammed'' into the least significant bit of the result by setting the
-| least significant bit to 1. The value of `count' can be arbitrarily large;
-| in particular, if `count' is greater than 128, the result will be either
-| 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or
-| nonzero. The result is broken into two 64-bit pieces which are stored at
-| the locations pointed to by `z0Ptr' and `z1Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- shift128RightJamming(
- bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
-{
- bits64 z0, z1;
- int8 negCount = ( - count ) & 63;
-
- if ( count == 0 ) {
- z1 = a1;
- z0 = a0;
- }
- else if ( count < 64 ) {
- z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 );
- z0 = a0>>count;
- }
- else {
- if ( count == 64 ) {
- z1 = a0 | ( a1 != 0 );
- }
- else if ( count < 128 ) {
- z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 );
- }
- else {
- z1 = ( ( a0 | a1 ) != 0 );
- }
- z0 = 0;
- }
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right
-| by 64 _plus_ the number of bits given in `count'. The shifted result is
-| at most 128 nonzero bits; these are broken into two 64-bit pieces which are
-| stored at the locations pointed to by `z0Ptr' and `z1Ptr'. The bits shifted
-| off form a third 64-bit result as follows: The _last_ bit shifted off is
-| the most-significant bit of the extra result, and the other 63 bits of the
-| extra result are all zero if and only if _all_but_the_last_ bits shifted off
-| were all zero. This extra result is stored in the location pointed to by
-| `z2Ptr'. The value of `count' can be arbitrarily large.
-| (This routine makes more sense if `a0', `a1', and `a2' are considered
-| to form a fixed-point value with binary point between `a1' and `a2'. This
-| fixed-point value is shifted right by the number of bits given in `count',
-| and the integer part of the result is returned at the locations pointed to
-| by `z0Ptr' and `z1Ptr'. The fractional part of the result may be slightly
-| corrupted as described above, and is returned at the location pointed to by
-| `z2Ptr'.)
-*----------------------------------------------------------------------------*/
-
-INLINE void
- shift128ExtraRightJamming(
- bits64 a0,
- bits64 a1,
- bits64 a2,
- int16 count,
- bits64 *z0Ptr,
- bits64 *z1Ptr,
- bits64 *z2Ptr
- )
-{
- bits64 z0, z1, z2;
- int8 negCount = ( - count ) & 63;
-
- if ( count == 0 ) {
- z2 = a2;
- z1 = a1;
- z0 = a0;
- }
- else {
- if ( count < 64 ) {
- z2 = a1<<negCount;
- z1 = ( a0<<negCount ) | ( a1>>count );
- z0 = a0>>count;
- }
- else {
- if ( count == 64 ) {
- z2 = a1;
- z1 = a0;
- }
- else {
- a2 |= a1;
- if ( count < 128 ) {
- z2 = a0<<negCount;
- z1 = a0>>( count & 63 );
- }
- else {
- z2 = ( count == 128 ) ? a0 : ( a0 != 0 );
- z1 = 0;
- }
- }
- z0 = 0;
- }
- z2 |= ( a2 != 0 );
- }
- *z2Ptr = z2;
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the
-| number of bits given in `count'. Any bits shifted off are lost. The value
-| of `count' must be less than 64. The result is broken into two 64-bit
-| pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- shortShift128Left(
- bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
-{
-
- *z1Ptr = a1<<count;
- *z0Ptr =
- ( count == 0 ) ? a0 : ( a0<<count ) | ( a1>>( ( - count ) & 63 ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left
-| by the number of bits given in `count'. Any bits shifted off are lost.
-| The value of `count' must be less than 64. The result is broken into three
-| 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
-| `z1Ptr', and `z2Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- shortShift192Left(
- bits64 a0,
- bits64 a1,
- bits64 a2,
- int16 count,
- bits64 *z0Ptr,
- bits64 *z1Ptr,
- bits64 *z2Ptr
- )
-{
- bits64 z0, z1, z2;
- int8 negCount;
-
- z2 = a2<<count;
- z1 = a1<<count;
- z0 = a0<<count;
- if ( 0 < count ) {
- negCount = ( ( - count ) & 63 );
- z1 |= a2>>negCount;
- z0 |= a1>>negCount;
- }
- *z2Ptr = z2;
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit
-| value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so
-| any carry out is lost. The result is broken into two 64-bit pieces which
-| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- add128(
- bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 *z0Ptr, bits64 *z1Ptr )
-{
- bits64 z1;
-
- z1 = a1 + b1;
- *z1Ptr = z1;
- *z0Ptr = a0 + b0 + ( z1 < a1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the
-| 192-bit value formed by concatenating `b0', `b1', and `b2'. Addition is
-| modulo 2^192, so any carry out is lost. The result is broken into three
-| 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
-| `z1Ptr', and `z2Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- add192(
- bits64 a0,
- bits64 a1,
- bits64 a2,
- bits64 b0,
- bits64 b1,
- bits64 b2,
- bits64 *z0Ptr,
- bits64 *z1Ptr,
- bits64 *z2Ptr
- )
-{
- bits64 z0, z1, z2;
- uint8 carry0, carry1;
-
- z2 = a2 + b2;
- carry1 = ( z2 < a2 );
- z1 = a1 + b1;
- carry0 = ( z1 < a1 );
- z0 = a0 + b0;
- z1 += carry1;
- z0 += ( z1 < carry1 );
- z0 += carry0;
- *z2Ptr = z2;
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the
-| 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo
-| 2^128, so any borrow out (carry out) is lost. The result is broken into two
-| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and
-| `z1Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- sub128(
- bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 *z0Ptr, bits64 *z1Ptr )
-{
-
- *z1Ptr = a1 - b1;
- *z0Ptr = a0 - b0 - ( a1 < b1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2'
-| from the 192-bit value formed by concatenating `a0', `a1', and `a2'.
-| Subtraction is modulo 2^192, so any borrow out (carry out) is lost. The
-| result is broken into three 64-bit pieces which are stored at the locations
-| pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- sub192(
- bits64 a0,
- bits64 a1,
- bits64 a2,
- bits64 b0,
- bits64 b1,
- bits64 b2,
- bits64 *z0Ptr,
- bits64 *z1Ptr,
- bits64 *z2Ptr
- )
-{
- bits64 z0, z1, z2;
- uint8 borrow0, borrow1;
-
- z2 = a2 - b2;
- borrow1 = ( a2 < b2 );
- z1 = a1 - b1;
- borrow0 = ( a1 < b1 );
- z0 = a0 - b0;
- z0 -= ( z1 < borrow1 );
- z1 -= borrow1;
- z0 -= borrow0;
- *z2Ptr = z2;
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Multiplies `a' by `b' to obtain a 128-bit product. The product is broken
-| into two 64-bit pieces which are stored at the locations pointed to by
-| `z0Ptr' and `z1Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void mul64To128( bits64 a, bits64 b, bits64 *z0Ptr, bits64 *z1Ptr )
-{
- bits32 aHigh, aLow, bHigh, bLow;
- bits64 z0, zMiddleA, zMiddleB, z1;
-
- aLow = a;
- aHigh = a>>32;
- bLow = b;
- bHigh = b>>32;
- z1 = ( (bits64) aLow ) * bLow;
- zMiddleA = ( (bits64) aLow ) * bHigh;
- zMiddleB = ( (bits64) aHigh ) * bLow;
- z0 = ( (bits64) aHigh ) * bHigh;
- zMiddleA += zMiddleB;
- z0 += ( ( (bits64) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 );
- zMiddleA <<= 32;
- z1 += zMiddleA;
- z0 += ( z1 < zMiddleA );
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Multiplies the 128-bit value formed by concatenating `a0' and `a1' by
-| `b' to obtain a 192-bit product. The product is broken into three 64-bit
-| pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and
-| `z2Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- mul128By64To192(
- bits64 a0,
- bits64 a1,
- bits64 b,
- bits64 *z0Ptr,
- bits64 *z1Ptr,
- bits64 *z2Ptr
- )
-{
- bits64 z0, z1, z2, more1;
-
- mul64To128( a1, b, &z1, &z2 );
- mul64To128( a0, b, &z0, &more1 );
- add128( z0, more1, 0, z1, &z0, &z1 );
- *z2Ptr = z2;
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the
-| 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit
-| product. The product is broken into four 64-bit pieces which are stored at
-| the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'.
-*----------------------------------------------------------------------------*/
-
-INLINE void
- mul128To256(
- bits64 a0,
- bits64 a1,
- bits64 b0,
- bits64 b1,
- bits64 *z0Ptr,
- bits64 *z1Ptr,
- bits64 *z2Ptr,
- bits64 *z3Ptr
- )
-{
- bits64 z0, z1, z2, z3;
- bits64 more1, more2;
-
- mul64To128( a1, b1, &z2, &z3 );
- mul64To128( a1, b0, &z1, &more2 );
- add128( z1, more2, 0, z2, &z1, &z2 );
- mul64To128( a0, b0, &z0, &more1 );
- add128( z0, more1, 0, z1, &z0, &z1 );
- mul64To128( a0, b1, &more1, &more2 );
- add128( more1, more2, 0, z2, &more1, &z2 );
- add128( z0, z1, 0, more1, &z0, &z1 );
- *z3Ptr = z3;
- *z2Ptr = z2;
- *z1Ptr = z1;
- *z0Ptr = z0;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns an approximation to the 64-bit integer quotient obtained by dividing
-| `b' into the 128-bit value formed by concatenating `a0' and `a1'. The
-| divisor `b' must be at least 2^63. If q is the exact quotient truncated
-| toward zero, the approximation returned lies between q and q + 2 inclusive.
-| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit
-| unsigned integer is returned.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b )
-{
- bits64 b0, b1;
- bits64 rem0, rem1, term0, term1;
- bits64 z;
-
- if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF );
- b0 = b>>32;
- z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32;
- mul64To128( b, z, &term0, &term1 );
- sub128( a0, a1, term0, term1, &rem0, &rem1 );
- while ( ( (sbits64) rem0 ) < 0 ) {
- z -= LIT64( 0x100000000 );
- b1 = b<<32;
- add128( rem0, rem1, b0, b1, &rem0, &rem1 );
- }
- rem0 = ( rem0<<32 ) | ( rem1>>32 );
- z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns an approximation to the square root of the 32-bit significand given
-| by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of
-| `aExp' (the least significant bit) is 1, the integer returned approximates
-| 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp'
-| is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either
-| case, the approximation returned lies strictly within +/-2 of the exact
-| value.
-*----------------------------------------------------------------------------*/
-
-INLINE bits32 estimateSqrt32( int16 aExp, bits32 a )
-{
- static const bits16 sqrtOddAdjustments[] = {
- 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0,
- 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67
- };
- static const bits16 sqrtEvenAdjustments[] = {
- 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E,
- 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002
- };
- int8 index;
- bits32 z;
-
- index = ( a>>27 ) & 15;
- if ( aExp & 1 ) {
- z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ index ];
- z = ( ( a / z )<<14 ) + ( z<<15 );
- a >>= 1;
- }
- else {
- z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ index ];
- z = a / z + z;
- z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 );
- if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 );
- }
- return ( (bits32) ( ( ( (bits64) a )<<31 ) / z ) ) + ( z>>1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the number of leading 0 bits before the most-significant 1 bit of
-| `a'. If `a' is zero, 32 is returned.
-*----------------------------------------------------------------------------*/
-
-static int8 countLeadingZeros32( bits32 a )
-{
- static const int8 countLeadingZerosHigh[] = {
- 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 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,
- 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,
- 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,
- 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
- };
- int8 shiftCount;
-
- shiftCount = 0;
- if ( a < 0x10000 ) {
- shiftCount += 16;
- a <<= 16;
- }
- if ( a < 0x1000000 ) {
- shiftCount += 8;
- a <<= 8;
- }
- shiftCount += countLeadingZerosHigh[ a>>24 ];
- return shiftCount;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the number of leading 0 bits before the most-significant 1 bit of
-| `a'. If `a' is zero, 64 is returned.
-*----------------------------------------------------------------------------*/
-
-static int8 countLeadingZeros64( bits64 a )
-{
- int8 shiftCount;
-
- shiftCount = 0;
- if ( a < ( (bits64) 1 )<<32 ) {
- shiftCount += 32;
- }
- else {
- a >>= 32;
- }
- shiftCount += countLeadingZeros32( a );
- return shiftCount;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1'
-| is equal to the 128-bit value formed by concatenating `b0' and `b1'.
-| Otherwise, returns 0.
-*----------------------------------------------------------------------------*/
-
-INLINE flag eq128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
-{
-
- return ( a0 == b0 ) && ( a1 == b1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
-| than or equal to the 128-bit value formed by concatenating `b0' and `b1'.
-| Otherwise, returns 0.
-*----------------------------------------------------------------------------*/
-
-INLINE flag le128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
-{
-
- return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 <= b1 ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
-| than the 128-bit value formed by concatenating `b0' and `b1'. Otherwise,
-| returns 0.
-*----------------------------------------------------------------------------*/
-
-INLINE flag lt128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
-{
-
- return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 < b1 ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is
-| not equal to the 128-bit value formed by concatenating `b0' and `b1'.
-| Otherwise, returns 0.
-*----------------------------------------------------------------------------*/
-
-INLINE flag ne128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
-{
-
- return ( a0 != b0 ) || ( a1 != b1 );
-
-}
-
-/*-----------------------------------------------------------------------------
-| Changes the sign of the extended double-precision floating-point value 'a'.
-| The operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-INLINE floatx80 floatx80_chs(floatx80 reg)
-{
- reg.high ^= 0x8000;
- return reg;
-}
-
diff --git a/3rdparty/softfloat/softfloat-specialize b/3rdparty/softfloat/softfloat-specialize
deleted file mode 100644
index 9865c9dda82..00000000000
--- a/3rdparty/softfloat/softfloat-specialize
+++ /dev/null
@@ -1,470 +0,0 @@
-
-/*============================================================================
-
-This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
-Arithmetic Package, Release 2b.
-
-Written by John R. Hauser. This work was made possible in part by the
-International Computer Science Institute, located at Suite 600, 1947 Center
-Street, Berkeley, California 94704. Funding was partially provided by the
-National Science Foundation under grant MIP-9311980. The original version
-of this code was written as part of a project to build a fixed-point vector
-processor in collaboration with the University of California at Berkeley,
-overseen by Profs. Nelson Morgan and John Wawrzynek. More information
-is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
-arithmetic/SoftFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-
-=============================================================================*/
-
-/*----------------------------------------------------------------------------
-| Underflow tininess-detection mode, statically initialized to default value.
-| (The declaration in `softfloat.h' must match the `int8' type here.)
-*----------------------------------------------------------------------------*/
-int8 float_detect_tininess = float_tininess_after_rounding;
-
-/*----------------------------------------------------------------------------
-| Raises the exceptions specified by `flags'. Floating-point traps can be
-| defined here if desired. It is currently not possible for such a trap to
-| substitute a result value. If traps are not implemented, this routine
-| should be simply `float_exception_flags |= flags;'.
-*----------------------------------------------------------------------------*/
-
-void float_raise( int8 flags )
-{
-
- float_exception_flags |= flags;
-
-}
-
-/*----------------------------------------------------------------------------
-| Internal canonical NaN format.
-*----------------------------------------------------------------------------*/
-typedef struct {
- flag sign;
- bits64 high, low;
-} commonNaNT;
-
-/*----------------------------------------------------------------------------
-| The pattern for a default generated single-precision NaN.
-*----------------------------------------------------------------------------*/
-#define float32_default_nan 0xFFFFFFFF
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is a NaN;
-| otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag float32_is_nan( float32 a )
-{
-
- return ( 0xFF000000 < (bits32) ( a<<1 ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is a signaling
-| NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag float32_is_signaling_nan( float32 a )
-{
-
- return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point NaN
-| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-
-static commonNaNT float32ToCommonNaN( float32 a )
-{
- commonNaNT z;
-
- if ( float32_is_signaling_nan( a ) ) float_raise( float_flag_invalid );
- z.sign = a>>31;
- z.low = 0;
- z.high = ( (bits64) a )<<41;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the canonical NaN `a' to the single-
-| precision floating-point format.
-*----------------------------------------------------------------------------*/
-
-static float32 commonNaNToFloat32( commonNaNT a )
-{
-
- return ( ( (bits32) a.sign )<<31 ) | 0x7FC00000 | ( a.high>>41 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes two single-precision floating-point values `a' and `b', one of which
-| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
-| signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-static float32 propagateFloat32NaN( float32 a, float32 b )
-{
- flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
-
- aIsNaN = float32_is_nan( a );
- aIsSignalingNaN = float32_is_signaling_nan( a );
- bIsNaN = float32_is_nan( b );
- bIsSignalingNaN = float32_is_signaling_nan( b );
- a |= 0x00400000;
- b |= 0x00400000;
- if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid );
- if ( aIsNaN ) {
- return ( aIsSignalingNaN & bIsNaN ) ? b : a;
- }
- else {
- return b;
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| The pattern for a default generated double-precision NaN.
-*----------------------------------------------------------------------------*/
-#define float64_default_nan LIT64( 0xFFFFFFFFFFFFFFFF )
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is a NaN;
-| otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag float64_is_nan( float64 a )
-{
-
- return ( LIT64( 0xFFE0000000000000 ) < (bits64) ( a<<1 ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is a signaling
-| NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag float64_is_signaling_nan( float64 a )
-{
-
- return
- ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
- && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point NaN
-| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-
-static commonNaNT float64ToCommonNaN( float64 a )
-{
- commonNaNT z;
-
- if ( float64_is_signaling_nan( a ) ) float_raise( float_flag_invalid );
- z.sign = a>>63;
- z.low = 0;
- z.high = a<<12;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the canonical NaN `a' to the double-
-| precision floating-point format.
-*----------------------------------------------------------------------------*/
-
-static float64 commonNaNToFloat64( commonNaNT a )
-{
-
- return
- ( ( (bits64) a.sign )<<63 )
- | LIT64( 0x7FF8000000000000 )
- | ( a.high>>12 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes two double-precision floating-point values `a' and `b', one of which
-| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
-| signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-static float64 propagateFloat64NaN( float64 a, float64 b )
-{
- flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
-
- aIsNaN = float64_is_nan( a );
- aIsSignalingNaN = float64_is_signaling_nan( a );
- bIsNaN = float64_is_nan( b );
- bIsSignalingNaN = float64_is_signaling_nan( b );
- a |= LIT64( 0x0008000000000000 );
- b |= LIT64( 0x0008000000000000 );
- if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid );
- if ( aIsNaN ) {
- return ( aIsSignalingNaN & bIsNaN ) ? b : a;
- }
- else {
- return b;
- }
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| The pattern for a default generated extended double-precision NaN. The
-| `high' and `low' values hold the most- and least-significant bits,
-| respectively.
-*----------------------------------------------------------------------------*/
-#define floatx80_default_nan_high 0xFFFF
-#define floatx80_default_nan_low LIT64( 0xFFFFFFFFFFFFFFFF )
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is a
-| NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_is_nan( floatx80 a )
-{
-
- return ( ( a.high & 0x7FFF ) == 0x7FFF ) && (bits64) ( a.low<<1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is a
-| signaling NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_is_signaling_nan( floatx80 a )
-{
- bits64 aLow;
-
- aLow = a.low & ~ LIT64( 0x4000000000000000 );
- return
- ( ( a.high & 0x7FFF ) == 0x7FFF )
- && (bits64) ( aLow<<1 )
- && ( a.low == aLow );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point NaN `a' to the canonical NaN format. If `a' is a signaling NaN, the
-| invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-static commonNaNT floatx80ToCommonNaN( floatx80 a )
-{
- commonNaNT z;
-
- if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid );
- z.sign = a.high>>15;
- z.low = 0;
- z.high = a.low<<1;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the canonical NaN `a' to the extended
-| double-precision floating-point format.
-*----------------------------------------------------------------------------*/
-
-static floatx80 commonNaNToFloatx80( commonNaNT a )
-{
- floatx80 z;
-
- z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 );
- z.high = ( ( (bits16) a.sign )<<15 ) | 0x7FFF;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes two extended double-precision floating-point values `a' and `b', one
-| of which is a NaN, and returns the appropriate NaN result. If either `a' or
-| `b' is a signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b )
-{
- flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
-
- aIsNaN = floatx80_is_nan( a );
- aIsSignalingNaN = floatx80_is_signaling_nan( a );
- bIsNaN = floatx80_is_nan( b );
- bIsSignalingNaN = floatx80_is_signaling_nan( b );
- a.low |= LIT64( 0xC000000000000000 );
- b.low |= LIT64( 0xC000000000000000 );
- if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid );
- if ( aIsNaN ) {
- return ( aIsSignalingNaN & bIsNaN ) ? b : a;
- }
- else {
- return b;
- }
-
-}
-
-#define EXP_BIAS 0x3FFF
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloatx80Frac( floatx80 a )
-{
-
- return a.low;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the extended double-precision floating-point
-| value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloatx80Exp( floatx80 a )
-{
-
- return a.high & 0x7FFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the extended double-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloatx80Sign( floatx80 a )
-{
-
- return a.high>>15;
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| The pattern for a default generated quadruple-precision NaN. The `high' and
-| `low' values hold the most- and least-significant bits, respectively.
-*----------------------------------------------------------------------------*/
-#define float128_default_nan_high LIT64( 0xFFFFFFFFFFFFFFFF )
-#define float128_default_nan_low LIT64( 0xFFFFFFFFFFFFFFFF )
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is a NaN;
-| otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag float128_is_nan( float128 a )
-{
-
- return
- ( LIT64( 0xFFFE000000000000 ) <= (bits64) ( a.high<<1 ) )
- && ( a.low || ( a.high & LIT64( 0x0000FFFFFFFFFFFF ) ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is a
-| signaling NaN; otherwise returns 0.
-*----------------------------------------------------------------------------*/
-
-flag float128_is_signaling_nan( float128 a )
-{
-
- return
- ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE )
- && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point NaN
-| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
-| exception is raised.
-*----------------------------------------------------------------------------*/
-
-static commonNaNT float128ToCommonNaN( float128 a )
-{
- commonNaNT z;
-
- if ( float128_is_signaling_nan( a ) ) float_raise( float_flag_invalid );
- z.sign = a.high>>63;
- shortShift128Left( a.high, a.low, 16, &z.high, &z.low );
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the canonical NaN `a' to the quadruple-
-| precision floating-point format.
-*----------------------------------------------------------------------------*/
-
-static float128 commonNaNToFloat128( commonNaNT a )
-{
- float128 z;
-
- shift128Right( a.high, a.low, 16, &z.high, &z.low );
- z.high |= ( ( (bits64) a.sign )<<63 ) | LIT64( 0x7FFF800000000000 );
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes two quadruple-precision floating-point values `a' and `b', one of
-| which is a NaN, and returns the appropriate NaN result. If either `a' or
-| `b' is a signaling NaN, the invalid exception is raised.
-*----------------------------------------------------------------------------*/
-
-static float128 propagateFloat128NaN( float128 a, float128 b )
-{
- flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
-
- aIsNaN = float128_is_nan( a );
- aIsSignalingNaN = float128_is_signaling_nan( a );
- bIsNaN = float128_is_nan( b );
- bIsSignalingNaN = float128_is_signaling_nan( b );
- a.high |= LIT64( 0x0000800000000000 );
- b.high |= LIT64( 0x0000800000000000 );
- if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid );
- if ( aIsNaN ) {
- return ( aIsSignalingNaN & bIsNaN ) ? b : a;
- }
- else {
- return b;
- }
-
-}
-
-#endif
-
diff --git a/3rdparty/softfloat/softfloat.c b/3rdparty/softfloat/softfloat.c
deleted file mode 100644
index edd4def337b..00000000000
--- a/3rdparty/softfloat/softfloat.c
+++ /dev/null
@@ -1,4941 +0,0 @@
-
-/*============================================================================
-
-This C source file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
-Package, Release 2b.
-
-Written by John R. Hauser. This work was made possible in part by the
-International Computer Science Institute, located at Suite 600, 1947 Center
-Street, Berkeley, California 94704. Funding was partially provided by the
-National Science Foundation under grant MIP-9311980. The original version
-of this code was written as part of a project to build a fixed-point vector
-processor in collaboration with the University of California at Berkeley,
-overseen by Profs. Nelson Morgan and John Wawrzynek. More information
-is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
-arithmetic/SoftFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-
-=============================================================================*/
-
-#include "milieu.h"
-#include "softfloat.h"
-
-/*----------------------------------------------------------------------------
-| Floating-point rounding mode, extended double-precision rounding precision,
-| and exception flags.
-*----------------------------------------------------------------------------*/
-int8 float_exception_flags = 0;
-#ifdef FLOATX80
-int8 floatx80_rounding_precision = 80;
-#endif
-
-int8 float_rounding_mode = float_round_nearest_even;
-
-/*----------------------------------------------------------------------------
-| Functions and definitions to determine: (1) whether tininess for underflow
-| is detected before or after rounding by default, (2) what (if anything)
-| happens when exceptions are raised, (3) how signaling NaNs are distinguished
-| from quiet NaNs, (4) the default generated quiet NaNs, and (5) how NaNs
-| are propagated from function inputs to output. These details are target-
-| specific.
-*----------------------------------------------------------------------------*/
-#include "softfloat-specialize"
-
-/*----------------------------------------------------------------------------
-| Takes a 64-bit fixed-point value `absZ' with binary point between bits 6
-| and 7, and returns the properly rounded 32-bit integer corresponding to the
-| input. If `zSign' is 1, the input is negated before being converted to an
-| integer. Bit 63 of `absZ' must be zero. Ordinarily, the fixed-point input
-| is simply rounded to an integer, with the inexact exception raised if the
-| input cannot be represented exactly as an integer. However, if the fixed-
-| point input is too large, the invalid exception is raised and the largest
-| positive or negative integer is returned.
-*----------------------------------------------------------------------------*/
-
-static int32 roundAndPackInt32( flag zSign, bits64 absZ )
-{
- int8 roundingMode;
- flag roundNearestEven;
- int8 roundIncrement, roundBits;
- int32 z;
-
- roundingMode = float_rounding_mode;
- roundNearestEven = ( roundingMode == float_round_nearest_even );
- roundIncrement = 0x40;
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- roundIncrement = 0;
- }
- else {
- roundIncrement = 0x7F;
- if ( zSign ) {
- if ( roundingMode == float_round_up ) roundIncrement = 0;
- }
- else {
- if ( roundingMode == float_round_down ) roundIncrement = 0;
- }
- }
- }
- roundBits = absZ & 0x7F;
- absZ = ( absZ + roundIncrement )>>7;
- absZ &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven );
- z = absZ;
- if ( zSign ) z = - z;
- if ( ( absZ>>32 ) || ( z && ( ( z < 0 ) ^ zSign ) ) ) {
- float_raise( float_flag_invalid );
- return zSign ? (sbits32) 0x80000000 : 0x7FFFFFFF;
- }
- if ( roundBits ) float_exception_flags |= float_flag_inexact;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes the 128-bit fixed-point value formed by concatenating `absZ0' and
-| `absZ1', with binary point between bits 63 and 64 (between the input words),
-| and returns the properly rounded 64-bit integer corresponding to the input.
-| If `zSign' is 1, the input is negated before being converted to an integer.
-| Ordinarily, the fixed-point input is simply rounded to an integer, with
-| the inexact exception raised if the input cannot be represented exactly as
-| an integer. However, if the fixed-point input is too large, the invalid
-| exception is raised and the largest positive or negative integer is
-| returned.
-*----------------------------------------------------------------------------*/
-
-static int64 roundAndPackInt64( flag zSign, bits64 absZ0, bits64 absZ1 )
-{
- int8 roundingMode;
- flag roundNearestEven, increment;
- int64 z;
-
- roundingMode = float_rounding_mode;
- roundNearestEven = ( roundingMode == float_round_nearest_even );
- increment = ( (sbits64) absZ1 < 0 );
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- increment = 0;
- }
- else {
- if ( zSign ) {
- increment = ( roundingMode == float_round_down ) && absZ1;
- }
- else {
- increment = ( roundingMode == float_round_up ) && absZ1;
- }
- }
- }
- if ( increment ) {
- ++absZ0;
- if ( absZ0 == 0 ) goto overflow;
- absZ0 &= ~ ( ( (bits64) ( absZ1<<1 ) == 0 ) & roundNearestEven );
- }
- z = absZ0;
- if ( zSign ) z = - z;
- if ( z && ( ( z < 0 ) ^ zSign ) ) {
- overflow:
- float_raise( float_flag_invalid );
- return
- zSign ? (sbits64) LIT64( 0x8000000000000000 )
- : LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- if ( absZ1 ) float_exception_flags |= float_flag_inexact;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the single-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits32 extractFloat32Frac( float32 a )
-{
- return a & 0x007FFFFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the single-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int16 extractFloat32Exp( float32 a )
-{
- return ( a>>23 ) & 0xFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the single-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloat32Sign( float32 a )
-{
- return a>>31;
-
-}
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal single-precision floating-point value represented
-| by the denormalized significand `aSig'. The normalized exponent and
-| significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-static void
- normalizeFloat32Subnormal( bits32 aSig, int16 *zExpPtr, bits32 *zSigPtr )
-{
- int8 shiftCount;
-
- shiftCount = countLeadingZeros32( aSig ) - 8;
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-
-}
-
-/*----------------------------------------------------------------------------
-| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
-| single-precision floating-point value, returning the result. After being
-| shifted into the proper positions, the three fields are simply added
-| together to form the result. This means that any integer portion of `zSig'
-| will be added into the exponent. Since a properly normalized significand
-| will have an integer portion equal to 1, the `zExp' input should be 1 less
-| than the desired result exponent whenever `zSig' is a complete, normalized
-| significand.
-*----------------------------------------------------------------------------*/
-
-INLINE float32 packFloat32( flag zSign, int16 zExp, bits32 zSig )
-{
- return ( ( (bits32) zSign )<<31 ) + ( ( (bits32) zExp )<<23 ) + zSig;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and significand `zSig', and returns the proper single-precision floating-
-| point value corresponding to the abstract input. Ordinarily, the abstract
-| value is simply rounded and packed into the single-precision format, with
-| the inexact exception raised if the abstract input cannot be represented
-| exactly. However, if the abstract value is too large, the overflow and
-| inexact exceptions are raised and an infinity or maximal finite value is
-| returned. If the abstract value is too small, the input value is rounded to
-| a subnormal number, and the underflow and inexact exceptions are raised if
-| the abstract input cannot be represented exactly as a subnormal single-
-| precision floating-point number.
-| The input significand `zSig' has its binary point between bits 30
-| and 29, which is 7 bits to the left of the usual location. This shifted
-| significand must be normalized or smaller. If `zSig' is not normalized,
-| `zExp' must be 0; in that case, the result returned is a subnormal number,
-| and it must not require rounding. In the usual case that `zSig' is
-| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent.
-| The handling of underflow and overflow follows the IEC/IEEE Standard for
-| Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float32 roundAndPackFloat32( flag zSign, int16 zExp, bits32 zSig )
-{
- int8 roundingMode;
- flag roundNearestEven;
- int8 roundIncrement, roundBits;
- flag isTiny;
-
- roundingMode = float_rounding_mode;
- roundNearestEven = ( roundingMode == float_round_nearest_even );
- roundIncrement = 0x40;
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- roundIncrement = 0;
- }
- else {
- roundIncrement = 0x7F;
- if ( zSign ) {
- if ( roundingMode == float_round_up ) roundIncrement = 0;
- }
- else {
- if ( roundingMode == float_round_down ) roundIncrement = 0;
- }
- }
- }
- roundBits = zSig & 0x7F;
- if ( 0xFD <= (bits16) zExp ) {
- if ( ( 0xFD < zExp )
- || ( ( zExp == 0xFD )
- && ( (sbits32) ( zSig + roundIncrement ) < 0 ) )
- ) {
- float_raise( float_flag_overflow | float_flag_inexact );
- return packFloat32( zSign, 0xFF, 0 ) - ( roundIncrement == 0 );
- }
- if ( zExp < 0 ) {
- isTiny =
- ( float_detect_tininess == float_tininess_before_rounding )
- || ( zExp < -1 )
- || ( zSig + roundIncrement < 0x80000000 );
- shift32RightJamming( zSig, - zExp, &zSig );
- zExp = 0;
- roundBits = zSig & 0x7F;
- if ( isTiny && roundBits ) float_raise( float_flag_underflow );
- }
- }
- if ( roundBits ) float_exception_flags |= float_flag_inexact;
- zSig = ( zSig + roundIncrement )>>7;
- zSig &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven );
- if ( zSig == 0 ) zExp = 0;
- return packFloat32( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and significand `zSig', and returns the proper single-precision floating-
-| point value corresponding to the abstract input. This routine is just like
-| `roundAndPackFloat32' except that `zSig' does not have to be normalized.
-| Bit 31 of `zSig' must be zero, and `zExp' must be 1 less than the ``true''
-| floating-point exponent.
-*----------------------------------------------------------------------------*/
-
-static float32
- normalizeRoundAndPackFloat32( flag zSign, int16 zExp, bits32 zSig )
-{
- int8 shiftCount;
-
- shiftCount = countLeadingZeros32( zSig ) - 1;
- return roundAndPackFloat32( zSign, zExp - shiftCount, zSig<<shiftCount );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the fraction bits of the double-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloat64Frac( float64 a )
-{
- return a & LIT64( 0x000FFFFFFFFFFFFF );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the double-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int16 extractFloat64Exp( float64 a )
-{
- return ( a>>52 ) & 0x7FF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the double-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloat64Sign( float64 a )
-{
- return a>>63;
-
-}
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal double-precision floating-point value represented
-| by the denormalized significand `aSig'. The normalized exponent and
-| significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-static void
- normalizeFloat64Subnormal( bits64 aSig, int16 *zExpPtr, bits64 *zSigPtr )
-{
- int8 shiftCount;
-
- shiftCount = countLeadingZeros64( aSig ) - 11;
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-
-}
-
-/*----------------------------------------------------------------------------
-| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
-| double-precision floating-point value, returning the result. After being
-| shifted into the proper positions, the three fields are simply added
-| together to form the result. This means that any integer portion of `zSig'
-| will be added into the exponent. Since a properly normalized significand
-| will have an integer portion equal to 1, the `zExp' input should be 1 less
-| than the desired result exponent whenever `zSig' is a complete, normalized
-| significand.
-*----------------------------------------------------------------------------*/
-
-INLINE float64 packFloat64( flag zSign, int16 zExp, bits64 zSig )
-{
- return ( ( (bits64) zSign )<<63 ) + ( ( (bits64) zExp )<<52 ) + zSig;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and significand `zSig', and returns the proper double-precision floating-
-| point value corresponding to the abstract input. Ordinarily, the abstract
-| value is simply rounded and packed into the double-precision format, with
-| the inexact exception raised if the abstract input cannot be represented
-| exactly. However, if the abstract value is too large, the overflow and
-| inexact exceptions are raised and an infinity or maximal finite value is
-| returned. If the abstract value is too small, the input value is rounded
-| to a subnormal number, and the underflow and inexact exceptions are raised
-| if the abstract input cannot be represented exactly as a subnormal double-
-| precision floating-point number.
-| The input significand `zSig' has its binary point between bits 62
-| and 61, which is 10 bits to the left of the usual location. This shifted
-| significand must be normalized or smaller. If `zSig' is not normalized,
-| `zExp' must be 0; in that case, the result returned is a subnormal number,
-| and it must not require rounding. In the usual case that `zSig' is
-| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent.
-| The handling of underflow and overflow follows the IEC/IEEE Standard for
-| Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float64 roundAndPackFloat64( flag zSign, int16 zExp, bits64 zSig )
-{
- int8 roundingMode;
- flag roundNearestEven;
- int16 roundIncrement, roundBits;
- flag isTiny;
-
- roundingMode = float_rounding_mode;
- roundNearestEven = ( roundingMode == float_round_nearest_even );
- roundIncrement = 0x200;
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- roundIncrement = 0;
- }
- else {
- roundIncrement = 0x3FF;
- if ( zSign ) {
- if ( roundingMode == float_round_up ) roundIncrement = 0;
- }
- else {
- if ( roundingMode == float_round_down ) roundIncrement = 0;
- }
- }
- }
- roundBits = zSig & 0x3FF;
- if ( 0x7FD <= (bits16) zExp ) {
- if ( ( 0x7FD < zExp )
- || ( ( zExp == 0x7FD )
- && ( (sbits64) ( zSig + roundIncrement ) < 0 ) )
- ) {
- float_raise( float_flag_overflow | float_flag_inexact );
- return packFloat64( zSign, 0x7FF, 0 ) - ( roundIncrement == 0 );
- }
- if ( zExp < 0 ) {
- isTiny =
- ( float_detect_tininess == float_tininess_before_rounding )
- || ( zExp < -1 )
- || ( zSig + roundIncrement < LIT64( 0x8000000000000000 ) );
- shift64RightJamming( zSig, - zExp, &zSig );
- zExp = 0;
- roundBits = zSig & 0x3FF;
- if ( isTiny && roundBits ) float_raise( float_flag_underflow );
- }
- }
- if ( roundBits ) float_exception_flags |= float_flag_inexact;
- zSig = ( zSig + roundIncrement )>>10;
- zSig &= ~ ( ( ( roundBits ^ 0x200 ) == 0 ) & roundNearestEven );
- if ( zSig == 0 ) zExp = 0;
- return packFloat64( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and significand `zSig', and returns the proper double-precision floating-
-| point value corresponding to the abstract input. This routine is just like
-| `roundAndPackFloat64' except that `zSig' does not have to be normalized.
-| Bit 63 of `zSig' must be zero, and `zExp' must be 1 less than the ``true''
-| floating-point exponent.
-*----------------------------------------------------------------------------*/
-
-static float64
- normalizeRoundAndPackFloat64( flag zSign, int16 zExp, bits64 zSig )
-{
- int8 shiftCount;
-
- shiftCount = countLeadingZeros64( zSig ) - 1;
- return roundAndPackFloat64( zSign, zExp - shiftCount, zSig<<shiftCount );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal extended double-precision floating-point value
-| represented by the denormalized significand `aSig'. The normalized exponent
-| and significand are stored at the locations pointed to by `zExpPtr' and
-| `zSigPtr', respectively.
-*----------------------------------------------------------------------------*/
-
-static void
- normalizeFloatx80Subnormal( bits64 aSig, int32 *zExpPtr, bits64 *zSigPtr )
-{
- int8 shiftCount;
-
- shiftCount = countLeadingZeros64( aSig );
- *zSigPtr = aSig<<shiftCount;
- *zExpPtr = 1 - shiftCount;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and extended significand formed by the concatenation of `zSig0' and `zSig1',
-| and returns the proper extended double-precision floating-point value
-| corresponding to the abstract input. Ordinarily, the abstract value is
-| rounded and packed into the extended double-precision format, with the
-| inexact exception raised if the abstract input cannot be represented
-| exactly. However, if the abstract value is too large, the overflow and
-| inexact exceptions are raised and an infinity or maximal finite value is
-| returned. If the abstract value is too small, the input value is rounded to
-| a subnormal number, and the underflow and inexact exceptions are raised if
-| the abstract input cannot be represented exactly as a subnormal extended
-| double-precision floating-point number.
-| If `roundingPrecision' is 32 or 64, the result is rounded to the same
-| number of bits as single or double precision, respectively. Otherwise, the
-| result is rounded to the full precision of the extended double-precision
-| format.
-| The input significand must be normalized or smaller. If the input
-| significand is not normalized, `zExp' must be 0; in that case, the result
-| returned is a subnormal number, and it must not require rounding. The
-| handling of underflow and overflow follows the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-// roundAndPackFloatx80 is now also used in fyl2x.c
-
-/* static */ floatx80
- roundAndPackFloatx80(
- int8 roundingPrecision, flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1
- )
-{
- int8 roundingMode;
- flag roundNearestEven, increment, isTiny;
- int64 roundIncrement, roundMask, roundBits;
-
- roundingMode = float_rounding_mode;
- roundNearestEven = ( roundingMode == float_round_nearest_even );
- if ( roundingPrecision == 80 ) goto precision80;
- if ( roundingPrecision == 64 ) {
- roundIncrement = LIT64( 0x0000000000000400 );
- roundMask = LIT64( 0x00000000000007FF );
- }
- else if ( roundingPrecision == 32 ) {
- roundIncrement = LIT64( 0x0000008000000000 );
- roundMask = LIT64( 0x000000FFFFFFFFFF );
- }
- else {
- goto precision80;
- }
- zSig0 |= ( zSig1 != 0 );
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- roundIncrement = 0;
- }
- else {
- roundIncrement = roundMask;
- if ( zSign ) {
- if ( roundingMode == float_round_up ) roundIncrement = 0;
- }
- else {
- if ( roundingMode == float_round_down ) roundIncrement = 0;
- }
- }
- }
- roundBits = zSig0 & roundMask;
- if ( 0x7FFD <= (bits32) ( zExp - 1 ) ) {
- if ( ( 0x7FFE < zExp )
- || ( ( zExp == 0x7FFE ) && ( zSig0 + roundIncrement < zSig0 ) )
- ) {
- goto overflow;
- }
- if ( zExp <= 0 ) {
- isTiny =
- ( float_detect_tininess == float_tininess_before_rounding )
- || ( zExp < 0 )
- || ( zSig0 <= zSig0 + roundIncrement );
- shift64RightJamming( zSig0, 1 - zExp, &zSig0 );
- zExp = 0;
- roundBits = zSig0 & roundMask;
- if ( isTiny && roundBits ) float_raise( float_flag_underflow );
- if ( roundBits ) float_exception_flags |= float_flag_inexact;
- zSig0 += roundIncrement;
- if ( (sbits64) zSig0 < 0 ) zExp = 1;
- roundIncrement = roundMask + 1;
- if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) {
- roundMask |= roundIncrement;
- }
- zSig0 &= ~ roundMask;
- return packFloatx80( zSign, zExp, zSig0 );
- }
- }
- if ( roundBits ) float_exception_flags |= float_flag_inexact;
- zSig0 += roundIncrement;
- if ( zSig0 < roundIncrement ) {
- ++zExp;
- zSig0 = LIT64( 0x8000000000000000 );
- }
- roundIncrement = roundMask + 1;
- if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) {
- roundMask |= roundIncrement;
- }
- zSig0 &= ~ roundMask;
- if ( zSig0 == 0 ) zExp = 0;
- return packFloatx80( zSign, zExp, zSig0 );
- precision80:
- increment = ( (sbits64) zSig1 < 0 );
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- increment = 0;
- }
- else {
- if ( zSign ) {
- increment = ( roundingMode == float_round_down ) && zSig1;
- }
- else {
- increment = ( roundingMode == float_round_up ) && zSig1;
- }
- }
- }
- if ( 0x7FFD <= (bits32) ( zExp - 1 ) ) {
- if ( ( 0x7FFE < zExp )
- || ( ( zExp == 0x7FFE )
- && ( zSig0 == LIT64( 0xFFFFFFFFFFFFFFFF ) )
- && increment
- )
- ) {
- roundMask = 0;
- overflow:
- float_raise( float_flag_overflow | float_flag_inexact );
- if ( ( roundingMode == float_round_to_zero )
- || ( zSign && ( roundingMode == float_round_up ) )
- || ( ! zSign && ( roundingMode == float_round_down ) )
- ) {
- return packFloatx80( zSign, 0x7FFE, ~ roundMask );
- }
- return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( zExp <= 0 ) {
- isTiny =
- ( float_detect_tininess == float_tininess_before_rounding )
- || ( zExp < 0 )
- || ! increment
- || ( zSig0 < LIT64( 0xFFFFFFFFFFFFFFFF ) );
- shift64ExtraRightJamming( zSig0, zSig1, 1 - zExp, &zSig0, &zSig1 );
- zExp = 0;
- if ( isTiny && zSig1 ) float_raise( float_flag_underflow );
- if ( zSig1 ) float_exception_flags |= float_flag_inexact;
- if ( roundNearestEven ) {
- increment = ( (sbits64) zSig1 < 0 );
- }
- else {
- if ( zSign ) {
- increment = ( roundingMode == float_round_down ) && zSig1;
- }
- else {
- increment = ( roundingMode == float_round_up ) && zSig1;
- }
- }
- if ( increment ) {
- ++zSig0;
- zSig0 &=
- ~ ( ( (bits64) ( zSig1<<1 ) == 0 ) & roundNearestEven );
- if ( (sbits64) zSig0 < 0 ) zExp = 1;
- }
- return packFloatx80( zSign, zExp, zSig0 );
- }
- }
- if ( zSig1 ) float_exception_flags |= float_flag_inexact;
- if ( increment ) {
- ++zSig0;
- if ( zSig0 == 0 ) {
- ++zExp;
- zSig0 = LIT64( 0x8000000000000000 );
- }
- else {
- zSig0 &= ~ ( ( (bits64) ( zSig1<<1 ) == 0 ) & roundNearestEven );
- }
- }
- else {
- if ( zSig0 == 0 ) zExp = 0;
- }
- return packFloatx80( zSign, zExp, zSig0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent
-| `zExp', and significand formed by the concatenation of `zSig0' and `zSig1',
-| and returns the proper extended double-precision floating-point value
-| corresponding to the abstract input. This routine is just like
-| `roundAndPackFloatx80' except that the input significand does not have to be
-| normalized.
-*----------------------------------------------------------------------------*/
-
-static floatx80
- normalizeRoundAndPackFloatx80(
- int8 roundingPrecision, flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1
- )
-{
- int8 shiftCount;
-
- if ( zSig0 == 0 ) {
- zSig0 = zSig1;
- zSig1 = 0;
- zExp -= 64;
- }
- shiftCount = countLeadingZeros64( zSig0 );
- shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 );
- zExp -= shiftCount;
- return
- roundAndPackFloatx80( roundingPrecision, zSign, zExp, zSig0, zSig1 );
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the least-significant 64 fraction bits of the quadruple-precision
-| floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloat128Frac1( float128 a )
-{
- return a.low;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the most-significant 48 fraction bits of the quadruple-precision
-| floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE bits64 extractFloat128Frac0( float128 a )
-{
- return a.high & LIT64( 0x0000FFFFFFFFFFFF );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the exponent bits of the quadruple-precision floating-point value
-| `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE int32 extractFloat128Exp( float128 a )
-{
- return ( a.high>>48 ) & 0x7FFF;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the sign bit of the quadruple-precision floating-point value `a'.
-*----------------------------------------------------------------------------*/
-
-INLINE flag extractFloat128Sign( float128 a )
-{
- return a.high>>63;
-
-}
-
-/*----------------------------------------------------------------------------
-| Normalizes the subnormal quadruple-precision floating-point value
-| represented by the denormalized significand formed by the concatenation of
-| `aSig0' and `aSig1'. The normalized exponent is stored at the location
-| pointed to by `zExpPtr'. The most significant 49 bits of the normalized
-| significand are stored at the location pointed to by `zSig0Ptr', and the
-| least significant 64 bits of the normalized significand are stored at the
-| location pointed to by `zSig1Ptr'.
-*----------------------------------------------------------------------------*/
-
-static void
- normalizeFloat128Subnormal(
- bits64 aSig0,
- bits64 aSig1,
- int32 *zExpPtr,
- bits64 *zSig0Ptr,
- bits64 *zSig1Ptr
- )
-{
- int8 shiftCount;
-
- if ( aSig0 == 0 ) {
- shiftCount = countLeadingZeros64( aSig1 ) - 15;
- if ( shiftCount < 0 ) {
- *zSig0Ptr = aSig1>>( - shiftCount );
- *zSig1Ptr = aSig1<<( shiftCount & 63 );
- }
- else {
- *zSig0Ptr = aSig1<<shiftCount;
- *zSig1Ptr = 0;
- }
- *zExpPtr = - shiftCount - 63;
- }
- else {
- shiftCount = countLeadingZeros64( aSig0 ) - 15;
- shortShift128Left( aSig0, aSig1, shiftCount, zSig0Ptr, zSig1Ptr );
- *zExpPtr = 1 - shiftCount;
- }
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 32-bit two's complement integer `a'
-| to the single-precision floating-point format. The conversion is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 int32_to_float32( int32 a )
-{
- flag zSign;
-
- if ( a == 0 ) return 0;
- if ( a == (sbits32) 0x80000000 ) return packFloat32( 1, 0x9E, 0 );
- zSign = ( a < 0 );
- return normalizeRoundAndPackFloat32( zSign, 0x9C, zSign ? - a : a );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 32-bit two's complement integer `a'
-| to the double-precision floating-point format. The conversion is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 int32_to_float64( int32 a )
-{
- flag zSign;
- uint32 absA;
- int8 shiftCount;
- bits64 zSig;
-
- if ( a == 0 ) return 0;
- zSign = ( a < 0 );
- absA = zSign ? - a : a;
- shiftCount = countLeadingZeros32( absA ) + 21;
- zSig = absA;
- return packFloat64( zSign, 0x432 - shiftCount, zSig<<shiftCount );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 32-bit two's complement integer `a'
-| to the extended double-precision floating-point format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 int32_to_floatx80( int32 a )
-{
- flag zSign;
- uint32 absA;
- int8 shiftCount;
- bits64 zSig;
-
- if ( a == 0 ) return packFloatx80( 0, 0, 0 );
- zSign = ( a < 0 );
- absA = zSign ? - a : a;
- shiftCount = countLeadingZeros32( absA ) + 32;
- zSig = absA;
- return packFloatx80( zSign, 0x403E - shiftCount, zSig<<shiftCount );
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 32-bit two's complement integer `a' to
-| the quadruple-precision floating-point format. The conversion is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 int32_to_float128( int32 a )
-{
- flag zSign;
- uint32 absA;
- int8 shiftCount;
- bits64 zSig0;
-
- if ( a == 0 ) return packFloat128( 0, 0, 0, 0 );
- zSign = ( a < 0 );
- absA = zSign ? - a : a;
- shiftCount = countLeadingZeros32( absA ) + 17;
- zSig0 = absA;
- return packFloat128( zSign, 0x402E - shiftCount, zSig0<<shiftCount, 0 );
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 64-bit two's complement integer `a'
-| to the single-precision floating-point format. The conversion is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 int64_to_float32( int64 a )
-{
- flag zSign;
- uint64 absA;
- int8 shiftCount;
-// bits32 zSig;
-
- if ( a == 0 ) return 0;
- zSign = ( a < 0 );
- absA = zSign ? - a : a;
- shiftCount = countLeadingZeros64( absA ) - 40;
- if ( 0 <= shiftCount ) {
- return packFloat32( zSign, 0x95 - shiftCount, absA<<shiftCount );
- }
- else {
- shiftCount += 7;
- if ( shiftCount < 0 ) {
- shift64RightJamming( absA, - shiftCount, &absA );
- }
- else {
- absA <<= shiftCount;
- }
- return roundAndPackFloat32( zSign, 0x9C - shiftCount, absA );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 64-bit two's complement integer `a'
-| to the double-precision floating-point format. The conversion is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 int64_to_float64( int64 a )
-{
- flag zSign;
-
- if ( a == 0 ) return 0;
- if ( a == (sbits64) LIT64( 0x8000000000000000 ) ) {
- return packFloat64( 1, 0x43E, 0 );
- }
- zSign = ( a < 0 );
- return normalizeRoundAndPackFloat64( zSign, 0x43C, zSign ? - a : a );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 64-bit two's complement integer `a'
-| to the extended double-precision floating-point format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 int64_to_floatx80( int64 a )
-{
- flag zSign;
- uint64 absA;
- int8 shiftCount;
-
- if ( a == 0 ) return packFloatx80( 0, 0, 0 );
- zSign = ( a < 0 );
- absA = zSign ? - a : a;
- shiftCount = countLeadingZeros64( absA );
- return packFloatx80( zSign, 0x403E - shiftCount, absA<<shiftCount );
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the 64-bit two's complement integer `a' to
-| the quadruple-precision floating-point format. The conversion is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 int64_to_float128( int64 a )
-{
- flag zSign;
- uint64 absA;
- int8 shiftCount;
- int32 zExp;
- bits64 zSig0, zSig1;
-
- if ( a == 0 ) return packFloat128( 0, 0, 0, 0 );
- zSign = ( a < 0 );
- absA = zSign ? - a : a;
- shiftCount = countLeadingZeros64( absA ) + 49;
- zExp = 0x406E - shiftCount;
- if ( 64 <= shiftCount ) {
- zSig1 = 0;
- zSig0 = absA;
- shiftCount -= 64;
- }
- else {
- zSig1 = absA;
- zSig0 = 0;
- }
- shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 );
- return packFloat128( zSign, zExp, zSig0, zSig1 );
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the 32-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic---which means in particular that the conversion is rounded
-| according to the current rounding mode. If `a' is a NaN, the largest
-| positive integer is returned. Otherwise, if the conversion overflows, the
-| largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int32 float32_to_int32( float32 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits32 aSig;
- bits64 aSig64;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- if ( ( aExp == 0xFF ) && aSig ) aSign = 0;
- if ( aExp ) aSig |= 0x00800000;
- shiftCount = 0xAF - aExp;
- aSig64 = aSig;
- aSig64 <<= 32;
- if ( 0 < shiftCount ) shift64RightJamming( aSig64, shiftCount, &aSig64 );
- return roundAndPackInt32( aSign, aSig64 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the 32-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic, except that the conversion is always rounded toward zero.
-| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
-| the conversion overflows, the largest integer with the same sign as `a' is
-| returned.
-*----------------------------------------------------------------------------*/
-
-int32 float32_to_int32_round_to_zero( float32 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits32 aSig;
- int32 z;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- shiftCount = aExp - 0x9E;
- if ( 0 <= shiftCount ) {
- if ( a != 0xCF000000 ) {
- float_raise( float_flag_invalid );
- if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) return 0x7FFFFFFF;
- }
- return (sbits32) 0x80000000;
- }
- else if ( aExp <= 0x7E ) {
- if ( aExp | aSig ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- aSig = ( aSig | 0x00800000 )<<8;
- z = aSig>>( - shiftCount );
- if ( (bits32) ( aSig<<( shiftCount & 31 ) ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- if ( aSign ) z = - z;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the 64-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic---which means in particular that the conversion is rounded
-| according to the current rounding mode. If `a' is a NaN, the largest
-| positive integer is returned. Otherwise, if the conversion overflows, the
-| largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int64 float32_to_int64( float32 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits32 aSig;
- bits64 aSig64, aSigExtra;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- shiftCount = 0xBE - aExp;
- if ( shiftCount < 0 ) {
- float_raise( float_flag_invalid );
- if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- if ( aExp ) aSig |= 0x00800000;
- aSig64 = aSig;
- aSig64 <<= 40;
- shift64ExtraRightJamming( aSig64, 0, shiftCount, &aSig64, &aSigExtra );
- return roundAndPackInt64( aSign, aSig64, aSigExtra );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the 64-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic, except that the conversion is always rounded toward zero. If
-| `a' is a NaN, the largest positive integer is returned. Otherwise, if the
-| conversion overflows, the largest integer with the same sign as `a' is
-| returned.
-*----------------------------------------------------------------------------*/
-
-int64 float32_to_int64_round_to_zero( float32 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits32 aSig;
- bits64 aSig64;
- int64 z;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- shiftCount = aExp - 0xBE;
- if ( 0 <= shiftCount ) {
- if ( a != 0xDF000000 ) {
- float_raise( float_flag_invalid );
- if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- else if ( aExp <= 0x7E ) {
- if ( aExp | aSig ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- aSig64 = aSig | 0x00800000;
- aSig64 <<= 40;
- z = aSig64>>( - shiftCount );
- if ( (bits64) ( aSig64<<( shiftCount & 63 ) ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- if ( aSign ) z = - z;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the double-precision floating-point format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float32_to_float64( float32 a )
-{
- flag aSign;
- int16 aExp;
- bits32 aSig;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- if ( aExp == 0xFF ) {
- if ( aSig ) return commonNaNToFloat64( float32ToCommonNaN( a ) );
- return packFloat64( aSign, 0x7FF, 0 );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat64( aSign, 0, 0 );
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- --aExp;
- }
- return packFloat64( aSign, aExp + 0x380, ( (bits64) aSig )<<29 );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the extended double-precision floating-point format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 float32_to_floatx80( float32 a )
-{
- flag aSign;
- int16 aExp;
- bits32 aSig;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- if ( aExp == 0xFF ) {
- if ( aSig ) return commonNaNToFloatx80( float32ToCommonNaN( a ) );
- return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 );
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- }
- aSig |= 0x00800000;
- return packFloatx80( aSign, aExp + 0x3F80, ( (bits64) aSig )<<40 );
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the single-precision floating-point value
-| `a' to the double-precision floating-point format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float32_to_float128( float32 a )
-{
- flag aSign;
- int16 aExp;
- bits32 aSig;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- if ( aExp == 0xFF ) {
- if ( aSig ) return commonNaNToFloat128( float32ToCommonNaN( a ) );
- return packFloat128( aSign, 0x7FFF, 0, 0 );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat128( aSign, 0, 0, 0 );
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- --aExp;
- }
- return packFloat128( aSign, aExp + 0x3F80, ( (bits64) aSig )<<25, 0 );
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Rounds the single-precision floating-point value `a' to an integer, and
-| returns the result as a single-precision floating-point value. The
-| operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_round_to_int( float32 a )
-{
- flag aSign;
- int16 aExp;
- bits32 lastBitMask, roundBitsMask;
- int8 roundingMode;
- float32 z;
-
- aExp = extractFloat32Exp( a );
- if ( 0x96 <= aExp ) {
- if ( ( aExp == 0xFF ) && extractFloat32Frac( a ) ) {
- return propagateFloat32NaN( a, a );
- }
- return a;
- }
- if ( aExp <= 0x7E ) {
- if ( (bits32) ( a<<1 ) == 0 ) return a;
- float_exception_flags |= float_flag_inexact;
- aSign = extractFloat32Sign( a );
- switch ( float_rounding_mode ) {
- case float_round_nearest_even:
- if ( ( aExp == 0x7E ) && extractFloat32Frac( a ) ) {
- return packFloat32( aSign, 0x7F, 0 );
- }
- break;
- case float_round_down:
- return aSign ? 0xBF800000 : 0;
- case float_round_up:
- return aSign ? 0x80000000 : 0x3F800000;
- }
- return packFloat32( aSign, 0, 0 );
- }
- lastBitMask = 1;
- lastBitMask <<= 0x96 - aExp;
- roundBitsMask = lastBitMask - 1;
- z = a;
- roundingMode = float_rounding_mode;
- if ( roundingMode == float_round_nearest_even ) {
- z += lastBitMask>>1;
- if ( ( z & roundBitsMask ) == 0 ) z &= ~ lastBitMask;
- }
- else if ( roundingMode != float_round_to_zero ) {
- if ( extractFloat32Sign( z ) ^ ( roundingMode == float_round_up ) ) {
- z += roundBitsMask;
- }
- }
- z &= ~ roundBitsMask;
- if ( z != a ) float_exception_flags |= float_flag_inexact;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the absolute values of the single-precision
-| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated
-| before being returned. `zSign' is ignored if the result is a NaN.
-| The addition is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float32 addFloat32Sigs( float32 a, float32 b, flag zSign )
-{
- int16 aExp, bExp, zExp;
- bits32 aSig, bSig, zSig;
- int16 expDiff;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- bSig = extractFloat32Frac( b );
- bExp = extractFloat32Exp( b );
- expDiff = aExp - bExp;
- aSig <<= 6;
- bSig <<= 6;
- if ( 0 < expDiff ) {
- if ( aExp == 0xFF ) {
- if ( aSig ) return propagateFloat32NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- --expDiff;
- }
- else {
- bSig |= 0x20000000;
- }
- shift32RightJamming( bSig, expDiff, &bSig );
- zExp = aExp;
- }
- else if ( expDiff < 0 ) {
- if ( bExp == 0xFF ) {
- if ( bSig ) return propagateFloat32NaN( a, b );
- return packFloat32( zSign, 0xFF, 0 );
- }
- if ( aExp == 0 ) {
- ++expDiff;
- }
- else {
- aSig |= 0x20000000;
- }
- shift32RightJamming( aSig, - expDiff, &aSig );
- zExp = bExp;
- }
- else {
- if ( aExp == 0xFF ) {
- if ( aSig | bSig ) return propagateFloat32NaN( a, b );
- return a;
- }
- if ( aExp == 0 ) return packFloat32( zSign, 0, ( aSig + bSig )>>6 );
- zSig = 0x40000000 + aSig + bSig;
- zExp = aExp;
- goto roundAndPack;
- }
- aSig |= 0x20000000;
- zSig = ( aSig + bSig )<<1;
- --zExp;
- if ( (sbits32) zSig < 0 ) {
- zSig = aSig + bSig;
- ++zExp;
- }
- roundAndPack:
- return roundAndPackFloat32( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the absolute values of the single-
-| precision floating-point values `a' and `b'. If `zSign' is 1, the
-| difference is negated before being returned. `zSign' is ignored if the
-| result is a NaN. The subtraction is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float32 subFloat32Sigs( float32 a, float32 b, flag zSign )
-{
- int16 aExp, bExp, zExp;
- bits32 aSig, bSig, zSig;
- int16 expDiff;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- bSig = extractFloat32Frac( b );
- bExp = extractFloat32Exp( b );
- expDiff = aExp - bExp;
- aSig <<= 7;
- bSig <<= 7;
- if ( 0 < expDiff ) goto aExpBigger;
- if ( expDiff < 0 ) goto bExpBigger;
- if ( aExp == 0xFF ) {
- if ( aSig | bSig ) return propagateFloat32NaN( a, b );
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- if ( aExp == 0 ) {
- aExp = 1;
- bExp = 1;
- }
- if ( bSig < aSig ) goto aBigger;
- if ( aSig < bSig ) goto bBigger;
- return packFloat32( float_rounding_mode == float_round_down, 0, 0 );
- bExpBigger:
- if ( bExp == 0xFF ) {
- if ( bSig ) return propagateFloat32NaN( a, b );
- return packFloat32( zSign ^ 1, 0xFF, 0 );
- }
- if ( aExp == 0 ) {
- ++expDiff;
- }
- else {
- aSig |= 0x40000000;
- }
- shift32RightJamming( aSig, - expDiff, &aSig );
- bSig |= 0x40000000;
- bBigger:
- zSig = bSig - aSig;
- zExp = bExp;
- zSign ^= 1;
- goto normalizeRoundAndPack;
- aExpBigger:
- if ( aExp == 0xFF ) {
- if ( aSig ) return propagateFloat32NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- --expDiff;
- }
- else {
- bSig |= 0x40000000;
- }
- shift32RightJamming( bSig, expDiff, &bSig );
- aSig |= 0x40000000;
- aBigger:
- zSig = aSig - bSig;
- zExp = aExp;
- normalizeRoundAndPack:
- --zExp;
- return normalizeRoundAndPackFloat32( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the single-precision floating-point values `a'
-| and `b'. The operation is performed according to the IEC/IEEE Standard for
-| Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_add( float32 a, float32 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloat32Sign( a );
- bSign = extractFloat32Sign( b );
- if ( aSign == bSign ) {
- return addFloat32Sigs( a, b, aSign );
- }
- else {
- return subFloat32Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the single-precision floating-point values
-| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
-| for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_sub( float32 a, float32 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloat32Sign( a );
- bSign = extractFloat32Sign( b );
- if ( aSign == bSign ) {
- return subFloat32Sigs( a, b, aSign );
- }
- else {
- return addFloat32Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of multiplying the single-precision floating-point values
-| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
-| for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_mul( float32 a, float32 b )
-{
- flag aSign, bSign, zSign;
- int16 aExp, bExp, zExp;
- bits32 aSig, bSig;
- bits64 zSig64;
- bits32 zSig;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- bSig = extractFloat32Frac( b );
- bExp = extractFloat32Exp( b );
- bSign = extractFloat32Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0xFF ) {
- if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) {
- return propagateFloat32NaN( a, b );
- }
- if ( ( bExp | bSig ) == 0 ) {
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- return packFloat32( zSign, 0xFF, 0 );
- }
- if ( bExp == 0xFF ) {
- if ( bSig ) return propagateFloat32NaN( a, b );
- if ( ( aExp | aSig ) == 0 ) {
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- return packFloat32( zSign, 0xFF, 0 );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat32( zSign, 0, 0 );
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) return packFloat32( zSign, 0, 0 );
- normalizeFloat32Subnormal( bSig, &bExp, &bSig );
- }
- zExp = aExp + bExp - 0x7F;
- aSig = ( aSig | 0x00800000 )<<7;
- bSig = ( bSig | 0x00800000 )<<8;
- shift64RightJamming( ( (bits64) aSig ) * bSig, 32, &zSig64 );
- zSig = zSig64;
- if ( 0 <= (sbits32) ( zSig<<1 ) ) {
- zSig <<= 1;
- --zExp;
- }
- return roundAndPackFloat32( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of dividing the single-precision floating-point value `a'
-| by the corresponding value `b'. The operation is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_div( float32 a, float32 b )
-{
- flag aSign, bSign, zSign;
- int16 aExp, bExp, zExp;
- bits32 aSig, bSig, zSig;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- bSig = extractFloat32Frac( b );
- bExp = extractFloat32Exp( b );
- bSign = extractFloat32Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0xFF ) {
- if ( aSig ) return propagateFloat32NaN( a, b );
- if ( bExp == 0xFF ) {
- if ( bSig ) return propagateFloat32NaN( a, b );
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- return packFloat32( zSign, 0xFF, 0 );
- }
- if ( bExp == 0xFF ) {
- if ( bSig ) return propagateFloat32NaN( a, b );
- return packFloat32( zSign, 0, 0 );
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) {
- if ( ( aExp | aSig ) == 0 ) {
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- float_raise( float_flag_divbyzero );
- return packFloat32( zSign, 0xFF, 0 );
- }
- normalizeFloat32Subnormal( bSig, &bExp, &bSig );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat32( zSign, 0, 0 );
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- }
- zExp = aExp - bExp + 0x7D;
- aSig = ( aSig | 0x00800000 )<<7;
- bSig = ( bSig | 0x00800000 )<<8;
- if ( bSig <= ( aSig + aSig ) ) {
- aSig >>= 1;
- ++zExp;
- }
- zSig = ( ( (bits64) aSig )<<32 ) / bSig;
- if ( ( zSig & 0x3F ) == 0 ) {
- zSig |= ( (bits64) bSig * zSig != ( (bits64) aSig )<<32 );
- }
- return roundAndPackFloat32( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the remainder of the single-precision floating-point value `a'
-| with respect to the corresponding value `b'. The operation is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_rem( float32 a, float32 b )
-{
- flag aSign, zSign;
- int16 aExp, bExp, expDiff;
- bits32 aSig, bSig;
- bits32 q;
- bits64 aSig64, bSig64, q64;
- bits32 alternateASig;
- sbits32 sigMean;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- bSig = extractFloat32Frac( b );
- bExp = extractFloat32Exp( b );
-// bSign = extractFloat32Sign( b );
- if ( aExp == 0xFF ) {
- if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) {
- return propagateFloat32NaN( a, b );
- }
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- if ( bExp == 0xFF ) {
- if ( bSig ) return propagateFloat32NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) {
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- normalizeFloat32Subnormal( bSig, &bExp, &bSig );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return a;
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- }
- expDiff = aExp - bExp;
- aSig |= 0x00800000;
- bSig |= 0x00800000;
- if ( expDiff < 32 ) {
- aSig <<= 8;
- bSig <<= 8;
- if ( expDiff < 0 ) {
- if ( expDiff < -1 ) return a;
- aSig >>= 1;
- }
- q = ( bSig <= aSig );
- if ( q ) aSig -= bSig;
- if ( 0 < expDiff ) {
- q = ( ( (bits64) aSig )<<32 ) / bSig;
- q >>= 32 - expDiff;
- bSig >>= 2;
- aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q;
- }
- else {
- aSig >>= 2;
- bSig >>= 2;
- }
- }
- else {
- if ( bSig <= aSig ) aSig -= bSig;
- aSig64 = ( (bits64) aSig )<<40;
- bSig64 = ( (bits64) bSig )<<40;
- expDiff -= 64;
- while ( 0 < expDiff ) {
- q64 = estimateDiv128To64( aSig64, 0, bSig64 );
- q64 = ( 2 < q64 ) ? q64 - 2 : 0;
- aSig64 = - ( ( bSig * q64 )<<38 );
- expDiff -= 62;
- }
- expDiff += 64;
- q64 = estimateDiv128To64( aSig64, 0, bSig64 );
- q64 = ( 2 < q64 ) ? q64 - 2 : 0;
- q = q64>>( 64 - expDiff );
- bSig <<= 6;
- aSig = ( ( aSig64>>33 )<<( expDiff - 1 ) ) - bSig * q;
- }
- do {
- alternateASig = aSig;
- ++q;
- aSig -= bSig;
- } while ( 0 <= (sbits32) aSig );
- sigMean = aSig + alternateASig;
- if ( ( sigMean < 0 ) || ( ( sigMean == 0 ) && ( q & 1 ) ) ) {
- aSig = alternateASig;
- }
- zSign = ( (sbits32) aSig < 0 );
- if ( zSign ) aSig = - aSig;
- return normalizeRoundAndPackFloat32( aSign ^ zSign, bExp, aSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the square root of the single-precision floating-point value `a'.
-| The operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float32_sqrt( float32 a )
-{
- flag aSign;
- int16 aExp, zExp;
- bits32 aSig, zSig;
- bits64 rem, term;
-
- aSig = extractFloat32Frac( a );
- aExp = extractFloat32Exp( a );
- aSign = extractFloat32Sign( a );
- if ( aExp == 0xFF ) {
- if ( aSig ) return propagateFloat32NaN( a, 0 );
- if ( ! aSign ) return a;
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- if ( aSign ) {
- if ( ( aExp | aSig ) == 0 ) return a;
- float_raise( float_flag_invalid );
- return float32_default_nan;
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return 0;
- normalizeFloat32Subnormal( aSig, &aExp, &aSig );
- }
- zExp = ( ( aExp - 0x7F )>>1 ) + 0x7E;
- aSig = ( aSig | 0x00800000 )<<8;
- zSig = estimateSqrt32( aExp, aSig ) + 2;
- if ( ( zSig & 0x7F ) <= 5 ) {
- if ( zSig < 2 ) {
- zSig = 0x7FFFFFFF;
- goto roundAndPack;
- }
- aSig >>= aExp & 1;
- term = ( (bits64) zSig ) * zSig;
- rem = ( ( (bits64) aSig )<<32 ) - term;
- while ( (sbits64) rem < 0 ) {
- --zSig;
- rem += ( ( (bits64) zSig )<<1 ) | 1;
- }
- zSig |= ( rem != 0 );
- }
- shift32RightJamming( zSig, 1, &zSig );
- roundAndPack:
- return roundAndPackFloat32( 0, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is equal to
-| the corresponding value `b', and 0 otherwise. The comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float32_eq( float32 a, float32 b )
-{
- if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
- || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
- ) {
- if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- return ( a == b ) || ( (bits32) ( ( a | b )<<1 ) == 0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is less than
-| or equal to the corresponding value `b', and 0 otherwise. The comparison
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float32_le( float32 a, float32 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
- || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloat32Sign( a );
- bSign = extractFloat32Sign( b );
- if ( aSign != bSign ) return aSign || ( (bits32) ( ( a | b )<<1 ) == 0 );
- return ( a == b ) || ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is less than
-| the corresponding value `b', and 0 otherwise. The comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float32_lt( float32 a, float32 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
- || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloat32Sign( a );
- bSign = extractFloat32Sign( b );
- if ( aSign != bSign ) return aSign && ( (bits32) ( ( a | b )<<1 ) != 0 );
- return ( a != b ) && ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is equal to
-| the corresponding value `b', and 0 otherwise. The invalid exception is
-| raised if either operand is a NaN. Otherwise, the comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float32_eq_signaling( float32 a, float32 b )
-{
- if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
- || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- return ( a == b ) || ( (bits32) ( ( a | b )<<1 ) == 0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is less than or
-| equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not
-| cause an exception. Otherwise, the comparison is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float32_le_quiet( float32 a, float32 b )
-{
- flag aSign, bSign;
-// int16 aExp, bExp;
-
- if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
- || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
- ) {
- if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloat32Sign( a );
- bSign = extractFloat32Sign( b );
- if ( aSign != bSign ) return aSign || ( (bits32) ( ( a | b )<<1 ) == 0 );
- return ( a == b ) || ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the single-precision floating-point value `a' is less than
-| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an
-| exception. Otherwise, the comparison is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float32_lt_quiet( float32 a, float32 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
- || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
- ) {
- if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloat32Sign( a );
- bSign = extractFloat32Sign( b );
- if ( aSign != bSign ) return aSign && ( (bits32) ( ( a | b )<<1 ) != 0 );
- return ( a != b ) && ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the 32-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic---which means in particular that the conversion is rounded
-| according to the current rounding mode. If `a' is a NaN, the largest
-| positive integer is returned. Otherwise, if the conversion overflows, the
-| largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int32 float64_to_int32( float64 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits64 aSig;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( ( aExp == 0x7FF ) && aSig ) aSign = 0;
- if ( aExp ) aSig |= LIT64( 0x0010000000000000 );
- shiftCount = 0x42C - aExp;
- if ( 0 < shiftCount ) shift64RightJamming( aSig, shiftCount, &aSig );
- return roundAndPackInt32( aSign, aSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the 32-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic, except that the conversion is always rounded toward zero.
-| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
-| the conversion overflows, the largest integer with the same sign as `a' is
-| returned.
-*----------------------------------------------------------------------------*/
-
-int32 float64_to_int32_round_to_zero( float64 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits64 aSig, savedASig;
- int32 z;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( 0x41E < aExp ) {
- if ( ( aExp == 0x7FF ) && aSig ) aSign = 0;
- goto invalid;
- }
- else if ( aExp < 0x3FF ) {
- if ( aExp || aSig ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- aSig |= LIT64( 0x0010000000000000 );
- shiftCount = 0x433 - aExp;
- savedASig = aSig;
- aSig >>= shiftCount;
- z = aSig;
- if ( aSign ) z = - z;
- if ( ( z < 0 ) ^ aSign ) {
- invalid:
- float_raise( float_flag_invalid );
- return aSign ? (sbits32) 0x80000000 : 0x7FFFFFFF;
- }
- if ( ( aSig<<shiftCount ) != savedASig ) {
- float_exception_flags |= float_flag_inexact;
- }
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the 64-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic---which means in particular that the conversion is rounded
-| according to the current rounding mode. If `a' is a NaN, the largest
-| positive integer is returned. Otherwise, if the conversion overflows, the
-| largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int64 float64_to_int64( float64 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits64 aSig, aSigExtra;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( aExp ) aSig |= LIT64( 0x0010000000000000 );
- shiftCount = 0x433 - aExp;
- if ( shiftCount <= 0 ) {
- if ( 0x43E < aExp ) {
- float_raise( float_flag_invalid );
- if ( ! aSign
- || ( ( aExp == 0x7FF )
- && ( aSig != LIT64( 0x0010000000000000 ) ) )
- ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- aSigExtra = 0;
- aSig <<= - shiftCount;
- }
- else {
- shift64ExtraRightJamming( aSig, 0, shiftCount, &aSig, &aSigExtra );
- }
- return roundAndPackInt64( aSign, aSig, aSigExtra );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the 64-bit two's complement integer format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic, except that the conversion is always rounded toward zero.
-| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
-| the conversion overflows, the largest integer with the same sign as `a' is
-| returned.
-*----------------------------------------------------------------------------*/
-
-int64 float64_to_int64_round_to_zero( float64 a )
-{
- flag aSign;
- int16 aExp, shiftCount;
- bits64 aSig;
- int64 z;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( aExp ) aSig |= LIT64( 0x0010000000000000 );
- shiftCount = aExp - 0x433;
- if ( 0 <= shiftCount ) {
- if ( 0x43E <= aExp ) {
- if ( a != LIT64( 0xC3E0000000000000 ) ) {
- float_raise( float_flag_invalid );
- if ( ! aSign
- || ( ( aExp == 0x7FF )
- && ( aSig != LIT64( 0x0010000000000000 ) ) )
- ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- z = aSig<<shiftCount;
- }
- else {
- if ( aExp < 0x3FE ) {
- if ( aExp | aSig ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- z = aSig>>( - shiftCount );
- if ( (bits64) ( aSig<<( shiftCount & 63 ) ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- }
- if ( aSign ) z = - z;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the single-precision floating-point format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float64_to_float32( float64 a )
-{
- flag aSign;
- int16 aExp;
- bits64 aSig;
- bits32 zSig;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( aExp == 0x7FF ) {
- if ( aSig ) return commonNaNToFloat32( float64ToCommonNaN( a ) );
- return packFloat32( aSign, 0xFF, 0 );
- }
- shift64RightJamming( aSig, 22, &aSig );
- zSig = aSig;
- if ( aExp || zSig ) {
- zSig |= 0x40000000;
- aExp -= 0x381;
- }
- return roundAndPackFloat32( aSign, aExp, zSig );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the extended double-precision floating-point format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 float64_to_floatx80( float64 a )
-{
- flag aSign;
- int16 aExp;
- bits64 aSig;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( aExp == 0x7FF ) {
- if ( aSig ) return commonNaNToFloatx80( float64ToCommonNaN( a ) );
- return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 );
- normalizeFloat64Subnormal( aSig, &aExp, &aSig );
- }
- return
- packFloatx80(
- aSign, aExp + 0x3C00, ( aSig | LIT64( 0x0010000000000000 ) )<<11 );
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the double-precision floating-point value
-| `a' to the quadruple-precision floating-point format. The conversion is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float64_to_float128( float64 a )
-{
- flag aSign;
- int16 aExp;
- bits64 aSig, zSig0, zSig1;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( aExp == 0x7FF ) {
- if ( aSig ) return commonNaNToFloat128( float64ToCommonNaN( a ) );
- return packFloat128( aSign, 0x7FFF, 0, 0 );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat128( aSign, 0, 0, 0 );
- normalizeFloat64Subnormal( aSig, &aExp, &aSig );
- --aExp;
- }
- shift128Right( aSig, 0, 4, &zSig0, &zSig1 );
- return packFloat128( aSign, aExp + 0x3C00, zSig0, zSig1 );
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Rounds the double-precision floating-point value `a' to an integer, and
-| returns the result as a double-precision floating-point value. The
-| operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_round_to_int( float64 a )
-{
- flag aSign;
- int16 aExp;
- bits64 lastBitMask, roundBitsMask;
- int8 roundingMode;
- float64 z;
-
- aExp = extractFloat64Exp( a );
- if ( 0x433 <= aExp ) {
- if ( ( aExp == 0x7FF ) && extractFloat64Frac( a ) ) {
- return propagateFloat64NaN( a, a );
- }
- return a;
- }
- if ( aExp < 0x3FF ) {
- if ( (bits64) ( a<<1 ) == 0 ) return a;
- float_exception_flags |= float_flag_inexact;
- aSign = extractFloat64Sign( a );
- switch ( float_rounding_mode ) {
- case float_round_nearest_even:
- if ( ( aExp == 0x3FE ) && extractFloat64Frac( a ) ) {
- return packFloat64( aSign, 0x3FF, 0 );
- }
- break;
- case float_round_down:
- return aSign ? LIT64( 0xBFF0000000000000 ) : 0;
- case float_round_up:
- return
- aSign ? LIT64( 0x8000000000000000 ) : LIT64( 0x3FF0000000000000 );
- }
- return packFloat64( aSign, 0, 0 );
- }
- lastBitMask = 1;
- lastBitMask <<= 0x433 - aExp;
- roundBitsMask = lastBitMask - 1;
- z = a;
- roundingMode = float_rounding_mode;
- if ( roundingMode == float_round_nearest_even ) {
- z += lastBitMask>>1;
- if ( ( z & roundBitsMask ) == 0 ) z &= ~ lastBitMask;
- }
- else if ( roundingMode != float_round_to_zero ) {
- if ( extractFloat64Sign( z ) ^ ( roundingMode == float_round_up ) ) {
- z += roundBitsMask;
- }
- }
- z &= ~ roundBitsMask;
- if ( z != a ) float_exception_flags |= float_flag_inexact;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the absolute values of the double-precision
-| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated
-| before being returned. `zSign' is ignored if the result is a NaN.
-| The addition is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float64 addFloat64Sigs( float64 a, float64 b, flag zSign )
-{
- int16 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig;
- int16 expDiff;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- bSig = extractFloat64Frac( b );
- bExp = extractFloat64Exp( b );
- expDiff = aExp - bExp;
- aSig <<= 9;
- bSig <<= 9;
- if ( 0 < expDiff ) {
- if ( aExp == 0x7FF ) {
- if ( aSig ) return propagateFloat64NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- --expDiff;
- }
- else {
- bSig |= LIT64( 0x2000000000000000 );
- }
- shift64RightJamming( bSig, expDiff, &bSig );
- zExp = aExp;
- }
- else if ( expDiff < 0 ) {
- if ( bExp == 0x7FF ) {
- if ( bSig ) return propagateFloat64NaN( a, b );
- return packFloat64( zSign, 0x7FF, 0 );
- }
- if ( aExp == 0 ) {
- ++expDiff;
- }
- else {
- aSig |= LIT64( 0x2000000000000000 );
- }
- shift64RightJamming( aSig, - expDiff, &aSig );
- zExp = bExp;
- }
- else {
- if ( aExp == 0x7FF ) {
- if ( aSig | bSig ) return propagateFloat64NaN( a, b );
- return a;
- }
- if ( aExp == 0 ) return packFloat64( zSign, 0, ( aSig + bSig )>>9 );
- zSig = LIT64( 0x4000000000000000 ) + aSig + bSig;
- zExp = aExp;
- goto roundAndPack;
- }
- aSig |= LIT64( 0x2000000000000000 );
- zSig = ( aSig + bSig )<<1;
- --zExp;
- if ( (sbits64) zSig < 0 ) {
- zSig = aSig + bSig;
- ++zExp;
- }
- roundAndPack:
- return roundAndPackFloat64( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the absolute values of the double-
-| precision floating-point values `a' and `b'. If `zSign' is 1, the
-| difference is negated before being returned. `zSign' is ignored if the
-| result is a NaN. The subtraction is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float64 subFloat64Sigs( float64 a, float64 b, flag zSign )
-{
- int16 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig;
- int16 expDiff;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- bSig = extractFloat64Frac( b );
- bExp = extractFloat64Exp( b );
- expDiff = aExp - bExp;
- aSig <<= 10;
- bSig <<= 10;
- if ( 0 < expDiff ) goto aExpBigger;
- if ( expDiff < 0 ) goto bExpBigger;
- if ( aExp == 0x7FF ) {
- if ( aSig | bSig ) return propagateFloat64NaN( a, b );
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- if ( aExp == 0 ) {
- aExp = 1;
- bExp = 1;
- }
- if ( bSig < aSig ) goto aBigger;
- if ( aSig < bSig ) goto bBigger;
- return packFloat64( float_rounding_mode == float_round_down, 0, 0 );
- bExpBigger:
- if ( bExp == 0x7FF ) {
- if ( bSig ) return propagateFloat64NaN( a, b );
- return packFloat64( zSign ^ 1, 0x7FF, 0 );
- }
- if ( aExp == 0 ) {
- ++expDiff;
- }
- else {
- aSig |= LIT64( 0x4000000000000000 );
- }
- shift64RightJamming( aSig, - expDiff, &aSig );
- bSig |= LIT64( 0x4000000000000000 );
- bBigger:
- zSig = bSig - aSig;
- zExp = bExp;
- zSign ^= 1;
- goto normalizeRoundAndPack;
- aExpBigger:
- if ( aExp == 0x7FF ) {
- if ( aSig ) return propagateFloat64NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- --expDiff;
- }
- else {
- bSig |= LIT64( 0x4000000000000000 );
- }
- shift64RightJamming( bSig, expDiff, &bSig );
- aSig |= LIT64( 0x4000000000000000 );
- aBigger:
- zSig = aSig - bSig;
- zExp = aExp;
- normalizeRoundAndPack:
- --zExp;
- return normalizeRoundAndPackFloat64( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the double-precision floating-point values `a'
-| and `b'. The operation is performed according to the IEC/IEEE Standard for
-| Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_add( float64 a, float64 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloat64Sign( a );
- bSign = extractFloat64Sign( b );
- if ( aSign == bSign ) {
- return addFloat64Sigs( a, b, aSign );
- }
- else {
- return subFloat64Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the double-precision floating-point values
-| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
-| for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_sub( float64 a, float64 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloat64Sign( a );
- bSign = extractFloat64Sign( b );
- if ( aSign == bSign ) {
- return subFloat64Sigs( a, b, aSign );
- }
- else {
- return addFloat64Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of multiplying the double-precision floating-point values
-| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
-| for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_mul( float64 a, float64 b )
-{
- flag aSign, bSign, zSign;
- int16 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig0, zSig1;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- bSig = extractFloat64Frac( b );
- bExp = extractFloat64Exp( b );
- bSign = extractFloat64Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0x7FF ) {
- if ( aSig || ( ( bExp == 0x7FF ) && bSig ) ) {
- return propagateFloat64NaN( a, b );
- }
- if ( ( bExp | bSig ) == 0 ) {
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- return packFloat64( zSign, 0x7FF, 0 );
- }
- if ( bExp == 0x7FF ) {
- if ( bSig ) return propagateFloat64NaN( a, b );
- if ( ( aExp | aSig ) == 0 ) {
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- return packFloat64( zSign, 0x7FF, 0 );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat64( zSign, 0, 0 );
- normalizeFloat64Subnormal( aSig, &aExp, &aSig );
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) return packFloat64( zSign, 0, 0 );
- normalizeFloat64Subnormal( bSig, &bExp, &bSig );
- }
- zExp = aExp + bExp - 0x3FF;
- aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<10;
- bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11;
- mul64To128( aSig, bSig, &zSig0, &zSig1 );
- zSig0 |= ( zSig1 != 0 );
- if ( 0 <= (sbits64) ( zSig0<<1 ) ) {
- zSig0 <<= 1;
- --zExp;
- }
- return roundAndPackFloat64( zSign, zExp, zSig0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of dividing the double-precision floating-point value `a'
-| by the corresponding value `b'. The operation is performed according to
-| the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_div( float64 a, float64 b )
-{
- flag aSign, bSign, zSign;
- int16 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig;
- bits64 rem0, rem1;
- bits64 term0, term1;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- bSig = extractFloat64Frac( b );
- bExp = extractFloat64Exp( b );
- bSign = extractFloat64Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0x7FF ) {
- if ( aSig ) return propagateFloat64NaN( a, b );
- if ( bExp == 0x7FF ) {
- if ( bSig ) return propagateFloat64NaN( a, b );
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- return packFloat64( zSign, 0x7FF, 0 );
- }
- if ( bExp == 0x7FF ) {
- if ( bSig ) return propagateFloat64NaN( a, b );
- return packFloat64( zSign, 0, 0 );
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) {
- if ( ( aExp | aSig ) == 0 ) {
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- float_raise( float_flag_divbyzero );
- return packFloat64( zSign, 0x7FF, 0 );
- }
- normalizeFloat64Subnormal( bSig, &bExp, &bSig );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloat64( zSign, 0, 0 );
- normalizeFloat64Subnormal( aSig, &aExp, &aSig );
- }
- zExp = aExp - bExp + 0x3FD;
- aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<10;
- bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11;
- if ( bSig <= ( aSig + aSig ) ) {
- aSig >>= 1;
- ++zExp;
- }
- zSig = estimateDiv128To64( aSig, 0, bSig );
- if ( ( zSig & 0x1FF ) <= 2 ) {
- mul64To128( bSig, zSig, &term0, &term1 );
- sub128( aSig, 0, term0, term1, &rem0, &rem1 );
- while ( (sbits64) rem0 < 0 ) {
- --zSig;
- add128( rem0, rem1, 0, bSig, &rem0, &rem1 );
- }
- zSig |= ( rem1 != 0 );
- }
- return roundAndPackFloat64( zSign, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the remainder of the double-precision floating-point value `a'
-| with respect to the corresponding value `b'. The operation is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_rem( float64 a, float64 b )
-{
- flag aSign, zSign;
- int16 aExp, bExp, expDiff;
- bits64 aSig, bSig;
- bits64 q, alternateASig;
- sbits64 sigMean;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- bSig = extractFloat64Frac( b );
- bExp = extractFloat64Exp( b );
-// bSign = extractFloat64Sign( b );
- if ( aExp == 0x7FF ) {
- if ( aSig || ( ( bExp == 0x7FF ) && bSig ) ) {
- return propagateFloat64NaN( a, b );
- }
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- if ( bExp == 0x7FF ) {
- if ( bSig ) return propagateFloat64NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) {
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- normalizeFloat64Subnormal( bSig, &bExp, &bSig );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return a;
- normalizeFloat64Subnormal( aSig, &aExp, &aSig );
- }
- expDiff = aExp - bExp;
- aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<11;
- bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11;
- if ( expDiff < 0 ) {
- if ( expDiff < -1 ) return a;
- aSig >>= 1;
- }
- q = ( bSig <= aSig );
- if ( q ) aSig -= bSig;
- expDiff -= 64;
- while ( 0 < expDiff ) {
- q = estimateDiv128To64( aSig, 0, bSig );
- q = ( 2 < q ) ? q - 2 : 0;
- aSig = - ( ( bSig>>2 ) * q );
- expDiff -= 62;
- }
- expDiff += 64;
- if ( 0 < expDiff ) {
- q = estimateDiv128To64( aSig, 0, bSig );
- q = ( 2 < q ) ? q - 2 : 0;
- q >>= 64 - expDiff;
- bSig >>= 2;
- aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q;
- }
- else {
- aSig >>= 2;
- bSig >>= 2;
- }
- do {
- alternateASig = aSig;
- ++q;
- aSig -= bSig;
- } while ( 0 <= (sbits64) aSig );
- sigMean = aSig + alternateASig;
- if ( ( sigMean < 0 ) || ( ( sigMean == 0 ) && ( q & 1 ) ) ) {
- aSig = alternateASig;
- }
- zSign = ( (sbits64) aSig < 0 );
- if ( zSign ) aSig = - aSig;
- return normalizeRoundAndPackFloat64( aSign ^ zSign, bExp, aSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the square root of the double-precision floating-point value `a'.
-| The operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float64_sqrt( float64 a )
-{
- flag aSign;
- int16 aExp, zExp;
- bits64 aSig, zSig, doubleZSig;
- bits64 rem0, rem1, term0, term1;
-// float64 z;
-
- aSig = extractFloat64Frac( a );
- aExp = extractFloat64Exp( a );
- aSign = extractFloat64Sign( a );
- if ( aExp == 0x7FF ) {
- if ( aSig ) return propagateFloat64NaN( a, a );
- if ( ! aSign ) return a;
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- if ( aSign ) {
- if ( ( aExp | aSig ) == 0 ) return a;
- float_raise( float_flag_invalid );
- return float64_default_nan;
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return 0;
- normalizeFloat64Subnormal( aSig, &aExp, &aSig );
- }
- zExp = ( ( aExp - 0x3FF )>>1 ) + 0x3FE;
- aSig |= LIT64( 0x0010000000000000 );
- zSig = estimateSqrt32( aExp, aSig>>21 );
- aSig <<= 9 - ( aExp & 1 );
- zSig = estimateDiv128To64( aSig, 0, zSig<<32 ) + ( zSig<<30 );
- if ( ( zSig & 0x1FF ) <= 5 ) {
- doubleZSig = zSig<<1;
- mul64To128( zSig, zSig, &term0, &term1 );
- sub128( aSig, 0, term0, term1, &rem0, &rem1 );
- while ( (sbits64) rem0 < 0 ) {
- --zSig;
- doubleZSig -= 2;
- add128( rem0, rem1, zSig>>63, doubleZSig | 1, &rem0, &rem1 );
- }
- zSig |= ( ( rem0 | rem1 ) != 0 );
- }
- return roundAndPackFloat64( 0, zExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is equal to the
-| corresponding value `b', and 0 otherwise. The comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float64_eq( float64 a, float64 b )
-{
- if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
- || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
- ) {
- if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- return ( a == b ) || ( (bits64) ( ( a | b )<<1 ) == 0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is less than or
-| equal to the corresponding value `b', and 0 otherwise. The comparison is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float64_le( float64 a, float64 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
- || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloat64Sign( a );
- bSign = extractFloat64Sign( b );
- if ( aSign != bSign ) return aSign || ( (bits64) ( ( a | b )<<1 ) == 0 );
- return ( a == b ) || ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is less than
-| the corresponding value `b', and 0 otherwise. The comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float64_lt( float64 a, float64 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
- || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloat64Sign( a );
- bSign = extractFloat64Sign( b );
- if ( aSign != bSign ) return aSign && ( (bits64) ( ( a | b )<<1 ) != 0 );
- return ( a != b ) && ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is equal to the
-| corresponding value `b', and 0 otherwise. The invalid exception is raised
-| if either operand is a NaN. Otherwise, the comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float64_eq_signaling( float64 a, float64 b )
-{
- if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
- || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- return ( a == b ) || ( (bits64) ( ( a | b )<<1 ) == 0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is less than or
-| equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not
-| cause an exception. Otherwise, the comparison is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float64_le_quiet( float64 a, float64 b )
-{
- flag aSign, bSign;
-// int16 aExp, bExp;
-
- if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
- || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
- ) {
- if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloat64Sign( a );
- bSign = extractFloat64Sign( b );
- if ( aSign != bSign ) return aSign || ( (bits64) ( ( a | b )<<1 ) == 0 );
- return ( a == b ) || ( aSign ^ ( a < b ) );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the double-precision floating-point value `a' is less than
-| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an
-| exception. Otherwise, the comparison is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float64_lt_quiet( float64 a, float64 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
- || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
- ) {
- if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloat64Sign( a );
- bSign = extractFloat64Sign( b );
- if ( aSign != bSign ) return aSign && ( (bits64) ( ( a | b )<<1 ) != 0 );
- return ( a != b ) && ( aSign ^ ( a < b ) );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the 32-bit two's complement integer format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic---which means in particular that the conversion
-| is rounded according to the current rounding mode. If `a' is a NaN, the
-| largest positive integer is returned. Otherwise, if the conversion
-| overflows, the largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int32 floatx80_to_int32( floatx80 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- if ( ( aExp == 0x7FFF ) && (bits64) ( aSig<<1 ) ) aSign = 0;
- shiftCount = 0x4037 - aExp;
- if ( shiftCount <= 0 ) shiftCount = 1;
- shift64RightJamming( aSig, shiftCount, &aSig );
- return roundAndPackInt32( aSign, aSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the 32-bit two's complement integer format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic, except that the conversion is always rounded
-| toward zero. If `a' is a NaN, the largest positive integer is returned.
-| Otherwise, if the conversion overflows, the largest integer with the same
-| sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int32 floatx80_to_int32_round_to_zero( floatx80 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig, savedASig;
- int32 z;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- if ( 0x401E < aExp ) {
- if ( ( aExp == 0x7FFF ) && (bits64) ( aSig<<1 ) ) aSign = 0;
- goto invalid;
- }
- else if ( aExp < 0x3FFF ) {
- if ( aExp || aSig ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- shiftCount = 0x403E - aExp;
- savedASig = aSig;
- aSig >>= shiftCount;
- z = aSig;
- if ( aSign ) z = - z;
- if ( ( z < 0 ) ^ aSign ) {
- invalid:
- float_raise( float_flag_invalid );
- return aSign ? (sbits32) 0x80000000 : 0x7FFFFFFF;
- }
- if ( ( aSig<<shiftCount ) != savedASig ) {
- float_exception_flags |= float_flag_inexact;
- }
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the 64-bit two's complement integer format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic---which means in particular that the conversion
-| is rounded according to the current rounding mode. If `a' is a NaN,
-| the largest positive integer is returned. Otherwise, if the conversion
-| overflows, the largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int64 floatx80_to_int64( floatx80 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig, aSigExtra;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- shiftCount = 0x403E - aExp;
- if ( shiftCount <= 0 ) {
- if ( shiftCount ) {
- float_raise( float_flag_invalid );
- if ( ! aSign
- || ( ( aExp == 0x7FFF )
- && ( aSig != LIT64( 0x8000000000000000 ) ) )
- ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- aSigExtra = 0;
- }
- else {
- shift64ExtraRightJamming( aSig, 0, shiftCount, &aSig, &aSigExtra );
- }
- return roundAndPackInt64( aSign, aSig, aSigExtra );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the 64-bit two's complement integer format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic, except that the conversion is always rounded
-| toward zero. If `a' is a NaN, the largest positive integer is returned.
-| Otherwise, if the conversion overflows, the largest integer with the same
-| sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int64 floatx80_to_int64_round_to_zero( floatx80 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig;
- int64 z;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- shiftCount = aExp - 0x403E;
- if ( 0 <= shiftCount ) {
- aSig &= LIT64( 0x7FFFFFFFFFFFFFFF );
- if ( ( a.high != 0xC03E ) || aSig ) {
- float_raise( float_flag_invalid );
- if ( ! aSign || ( ( aExp == 0x7FFF ) && aSig ) ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- else if ( aExp < 0x3FFF ) {
- if ( aExp | aSig ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- z = aSig>>( - shiftCount );
- if ( (bits64) ( aSig<<( shiftCount & 63 ) ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- if ( aSign ) z = - z;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the single-precision floating-point format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 floatx80_to_float32( floatx80 a )
-{
- flag aSign;
- int32 aExp;
- bits64 aSig;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig<<1 ) ) {
- return commonNaNToFloat32( floatx80ToCommonNaN( a ) );
- }
- return packFloat32( aSign, 0xFF, 0 );
- }
- shift64RightJamming( aSig, 33, &aSig );
- if ( aExp || aSig ) aExp -= 0x3F81;
- return roundAndPackFloat32( aSign, aExp, aSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the double-precision floating-point format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 floatx80_to_float64( floatx80 a )
-{
- flag aSign;
- int32 aExp;
- bits64 aSig, zSig;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig<<1 ) ) {
- return commonNaNToFloat64( floatx80ToCommonNaN( a ) );
- }
- return packFloat64( aSign, 0x7FF, 0 );
- }
- shift64RightJamming( aSig, 1, &zSig );
- if ( aExp || aSig ) aExp -= 0x3C01;
- return roundAndPackFloat64( aSign, aExp, zSig );
-
-}
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the extended double-precision floating-
-| point value `a' to the quadruple-precision floating-point format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 floatx80_to_float128( floatx80 a )
-{
- flag aSign;
- int16 aExp;
- bits64 aSig, zSig0, zSig1;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- if ( ( aExp == 0x7FFF ) && (bits64) ( aSig<<1 ) ) {
- return commonNaNToFloat128( floatx80ToCommonNaN( a ) );
- }
- shift128Right( aSig<<1, 0, 16, &zSig0, &zSig1 );
- return packFloat128( aSign, aExp, zSig0, zSig1 );
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Rounds the extended double-precision floating-point value `a' to an integer,
-| and returns the result as an extended quadruple-precision floating-point
-| value. The operation is performed according to the IEC/IEEE Standard for
-| Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_round_to_int( floatx80 a )
-{
- flag aSign;
- int32 aExp;
- bits64 lastBitMask, roundBitsMask;
- int8 roundingMode;
- floatx80 z;
-
- aExp = extractFloatx80Exp( a );
- if ( 0x403E <= aExp ) {
- if ( ( aExp == 0x7FFF ) && (bits64) ( extractFloatx80Frac( a )<<1 ) ) {
- return propagateFloatx80NaN( a, a );
- }
- return a;
- }
- if ( aExp < 0x3FFF ) {
- if ( ( aExp == 0 )
- && ( (bits64) ( extractFloatx80Frac( a )<<1 ) == 0 ) ) {
- return a;
- }
- float_exception_flags |= float_flag_inexact;
- aSign = extractFloatx80Sign( a );
- switch ( float_rounding_mode ) {
- case float_round_nearest_even:
- if ( ( aExp == 0x3FFE ) && (bits64) ( extractFloatx80Frac( a )<<1 )
- ) {
- return
- packFloatx80( aSign, 0x3FFF, LIT64( 0x8000000000000000 ) );
- }
- break;
- case float_round_down:
- return
- aSign ?
- packFloatx80( 1, 0x3FFF, LIT64( 0x8000000000000000 ) )
- : packFloatx80( 0, 0, 0 );
- case float_round_up:
- return
- aSign ? packFloatx80( 1, 0, 0 )
- : packFloatx80( 0, 0x3FFF, LIT64( 0x8000000000000000 ) );
- }
- return packFloatx80( aSign, 0, 0 );
- }
- lastBitMask = 1;
- lastBitMask <<= 0x403E - aExp;
- roundBitsMask = lastBitMask - 1;
- z = a;
- roundingMode = float_rounding_mode;
- if ( roundingMode == float_round_nearest_even ) {
- z.low += lastBitMask>>1;
- if ( ( z.low & roundBitsMask ) == 0 ) z.low &= ~ lastBitMask;
- }
- else if ( roundingMode != float_round_to_zero ) {
- if ( extractFloatx80Sign( z ) ^ ( roundingMode == float_round_up ) ) {
- z.low += roundBitsMask;
- }
- }
- z.low &= ~ roundBitsMask;
- if ( z.low == 0 ) {
- ++z.high;
- z.low = LIT64( 0x8000000000000000 );
- }
- if ( z.low != a.low ) float_exception_flags |= float_flag_inexact;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the absolute values of the extended double-
-| precision floating-point values `a' and `b'. If `zSign' is 1, the sum is
-| negated before being returned. `zSign' is ignored if the result is a NaN.
-| The addition is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static floatx80 addFloatx80Sigs( floatx80 a, floatx80 b, flag zSign )
-{
- int32 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig0, zSig1;
- int32 expDiff;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- bSig = extractFloatx80Frac( b );
- bExp = extractFloatx80Exp( b );
- expDiff = aExp - bExp;
- if ( 0 < expDiff ) {
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) --expDiff;
- shift64ExtraRightJamming( bSig, 0, expDiff, &bSig, &zSig1 );
- zExp = aExp;
- }
- else if ( expDiff < 0 ) {
- if ( bExp == 0x7FFF ) {
- if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
- return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( aExp == 0 ) ++expDiff;
- shift64ExtraRightJamming( aSig, 0, - expDiff, &aSig, &zSig1 );
- zExp = bExp;
- }
- else {
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( ( aSig | bSig )<<1 ) ) {
- return propagateFloatx80NaN( a, b );
- }
- return a;
- }
- zSig1 = 0;
- zSig0 = aSig + bSig;
- if ( aExp == 0 ) {
- normalizeFloatx80Subnormal( zSig0, &zExp, &zSig0 );
- goto roundAndPack;
- }
- zExp = aExp;
- goto shiftRight1;
- }
- zSig0 = aSig + bSig;
- if ( (sbits64) zSig0 < 0 ) goto roundAndPack;
- shiftRight1:
- shift64ExtraRightJamming( zSig0, zSig1, 1, &zSig0, &zSig1 );
- zSig0 |= LIT64( 0x8000000000000000 );
- ++zExp;
- roundAndPack:
- return
- roundAndPackFloatx80(
- floatx80_rounding_precision, zSign, zExp, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the absolute values of the extended
-| double-precision floating-point values `a' and `b'. If `zSign' is 1, the
-| difference is negated before being returned. `zSign' is ignored if the
-| result is a NaN. The subtraction is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static floatx80 subFloatx80Sigs( floatx80 a, floatx80 b, flag zSign )
-{
- int32 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig0, zSig1;
- int32 expDiff;
- floatx80 z;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- bSig = extractFloatx80Frac( b );
- bExp = extractFloatx80Exp( b );
- expDiff = aExp - bExp;
- if ( 0 < expDiff ) goto aExpBigger;
- if ( expDiff < 0 ) goto bExpBigger;
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( ( aSig | bSig )<<1 ) ) {
- return propagateFloatx80NaN( a, b );
- }
- float_raise( float_flag_invalid );
- z.low = floatx80_default_nan_low;
- z.high = floatx80_default_nan_high;
- return z;
- }
- if ( aExp == 0 ) {
- aExp = 1;
- bExp = 1;
- }
- zSig1 = 0;
- if ( bSig < aSig ) goto aBigger;
- if ( aSig < bSig ) goto bBigger;
- return packFloatx80( float_rounding_mode == float_round_down, 0, 0 );
- bExpBigger:
- if ( bExp == 0x7FFF ) {
- if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
- return packFloatx80( zSign ^ 1, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( aExp == 0 ) ++expDiff;
- shift128RightJamming( aSig, 0, - expDiff, &aSig, &zSig1 );
- bBigger:
- sub128( bSig, 0, aSig, zSig1, &zSig0, &zSig1 );
- zExp = bExp;
- zSign ^= 1;
- goto normalizeRoundAndPack;
- aExpBigger:
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) --expDiff;
- shift128RightJamming( bSig, 0, expDiff, &bSig, &zSig1 );
- aBigger:
- sub128( aSig, 0, bSig, zSig1, &zSig0, &zSig1 );
- zExp = aExp;
- normalizeRoundAndPack:
- return
- normalizeRoundAndPackFloatx80(
- floatx80_rounding_precision, zSign, zExp, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the extended double-precision floating-point
-| values `a' and `b'. The operation is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_add( floatx80 a, floatx80 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloatx80Sign( a );
- bSign = extractFloatx80Sign( b );
- if ( aSign == bSign ) {
- return addFloatx80Sigs( a, b, aSign );
- }
- else {
- return subFloatx80Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the extended double-precision floating-
-| point values `a' and `b'. The operation is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_sub( floatx80 a, floatx80 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloatx80Sign( a );
- bSign = extractFloatx80Sign( b );
- if ( aSign == bSign ) {
- return subFloatx80Sigs( a, b, aSign );
- }
- else {
- return addFloatx80Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of multiplying the extended double-precision floating-
-| point values `a' and `b'. The operation is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_mul( floatx80 a, floatx80 b )
-{
- flag aSign, bSign, zSign;
- int32 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig0, zSig1;
- floatx80 z;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- bSig = extractFloatx80Frac( b );
- bExp = extractFloatx80Exp( b );
- bSign = extractFloatx80Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig<<1 )
- || ( ( bExp == 0x7FFF ) && (bits64) ( bSig<<1 ) ) ) {
- return propagateFloatx80NaN( a, b );
- }
- if ( ( bExp | bSig ) == 0 ) goto invalid;
- return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( bExp == 0x7FFF ) {
- if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
- if ( ( aExp | aSig ) == 0 ) {
- invalid:
- float_raise( float_flag_invalid );
- z.low = floatx80_default_nan_low;
- z.high = floatx80_default_nan_high;
- return z;
- }
- return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloatx80( zSign, 0, 0 );
- normalizeFloatx80Subnormal( aSig, &aExp, &aSig );
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) return packFloatx80( zSign, 0, 0 );
- normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
- }
- zExp = aExp + bExp - 0x3FFE;
- mul64To128( aSig, bSig, &zSig0, &zSig1 );
- if ( 0 < (sbits64) zSig0 ) {
- shortShift128Left( zSig0, zSig1, 1, &zSig0, &zSig1 );
- --zExp;
- }
- return
- roundAndPackFloatx80(
- floatx80_rounding_precision, zSign, zExp, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of dividing the extended double-precision floating-point
-| value `a' by the corresponding value `b'. The operation is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_div( floatx80 a, floatx80 b )
-{
- flag aSign, bSign, zSign;
- int32 aExp, bExp, zExp;
- bits64 aSig, bSig, zSig0, zSig1;
- bits64 rem0, rem1, rem2, term0, term1, term2;
- floatx80 z;
-
- aSig = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- bSig = extractFloatx80Frac( b );
- bExp = extractFloatx80Exp( b );
- bSign = extractFloatx80Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b );
- if ( bExp == 0x7FFF ) {
- if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
- goto invalid;
- }
- return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( bExp == 0x7FFF ) {
- if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
- return packFloatx80( zSign, 0, 0 );
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) {
- if ( ( aExp | aSig ) == 0 ) {
- invalid:
- float_raise( float_flag_invalid );
- z.low = floatx80_default_nan_low;
- z.high = floatx80_default_nan_high;
- return z;
- }
- float_raise( float_flag_divbyzero );
- return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
- }
- if ( aExp == 0 ) {
- if ( aSig == 0 ) return packFloatx80( zSign, 0, 0 );
- normalizeFloatx80Subnormal( aSig, &aExp, &aSig );
- }
- zExp = aExp - bExp + 0x3FFE;
- rem1 = 0;
- if ( bSig <= aSig ) {
- shift128Right( aSig, 0, 1, &aSig, &rem1 );
- ++zExp;
- }
- zSig0 = estimateDiv128To64( aSig, rem1, bSig );
- mul64To128( bSig, zSig0, &term0, &term1 );
- sub128( aSig, rem1, term0, term1, &rem0, &rem1 );
- while ( (sbits64) rem0 < 0 ) {
- --zSig0;
- add128( rem0, rem1, 0, bSig, &rem0, &rem1 );
- }
- zSig1 = estimateDiv128To64( rem1, 0, bSig );
- if ( (bits64) ( zSig1<<1 ) <= 8 ) {
- mul64To128( bSig, zSig1, &term1, &term2 );
- sub128( rem1, 0, term1, term2, &rem1, &rem2 );
- while ( (sbits64) rem1 < 0 ) {
- --zSig1;
- add128( rem1, rem2, 0, bSig, &rem1, &rem2 );
- }
- zSig1 |= ( ( rem1 | rem2 ) != 0 );
- }
- return
- roundAndPackFloatx80(
- floatx80_rounding_precision, zSign, zExp, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the remainder of the extended double-precision floating-point value
-| `a' with respect to the corresponding value `b'. The operation is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_rem( floatx80 a, floatx80 b )
-{
- flag aSign, zSign;
- int32 aExp, bExp, expDiff;
- bits64 aSig0, aSig1, bSig;
- bits64 q, term0, term1, alternateASig0, alternateASig1;
- floatx80 z;
-
- aSig0 = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- bSig = extractFloatx80Frac( b );
- bExp = extractFloatx80Exp( b );
-// bSign = extractFloatx80Sign( b );
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig0<<1 )
- || ( ( bExp == 0x7FFF ) && (bits64) ( bSig<<1 ) ) ) {
- return propagateFloatx80NaN( a, b );
- }
- goto invalid;
- }
- if ( bExp == 0x7FFF ) {
- if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- if ( bSig == 0 ) {
- invalid:
- float_raise( float_flag_invalid );
- z.low = floatx80_default_nan_low;
- z.high = floatx80_default_nan_high;
- return z;
- }
- normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
- }
- if ( aExp == 0 ) {
- if ( (bits64) ( aSig0<<1 ) == 0 ) return a;
- normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 );
- }
- bSig |= LIT64( 0x8000000000000000 );
- zSign = aSign;
- expDiff = aExp - bExp;
- aSig1 = 0;
- if ( expDiff < 0 ) {
- if ( expDiff < -1 ) return a;
- shift128Right( aSig0, 0, 1, &aSig0, &aSig1 );
- expDiff = 0;
- }
- q = ( bSig <= aSig0 );
- if ( q ) aSig0 -= bSig;
- expDiff -= 64;
- while ( 0 < expDiff ) {
- q = estimateDiv128To64( aSig0, aSig1, bSig );
- q = ( 2 < q ) ? q - 2 : 0;
- mul64To128( bSig, q, &term0, &term1 );
- sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 );
- shortShift128Left( aSig0, aSig1, 62, &aSig0, &aSig1 );
- expDiff -= 62;
- }
- expDiff += 64;
- if ( 0 < expDiff ) {
- q = estimateDiv128To64( aSig0, aSig1, bSig );
- q = ( 2 < q ) ? q - 2 : 0;
- q >>= 64 - expDiff;
- mul64To128( bSig, q<<( 64 - expDiff ), &term0, &term1 );
- sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 );
- shortShift128Left( 0, bSig, 64 - expDiff, &term0, &term1 );
- while ( le128( term0, term1, aSig0, aSig1 ) ) {
- ++q;
- sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 );
- }
- }
- else {
- term1 = 0;
- term0 = bSig;
- }
- sub128( term0, term1, aSig0, aSig1, &alternateASig0, &alternateASig1 );
- if ( lt128( alternateASig0, alternateASig1, aSig0, aSig1 )
- || ( eq128( alternateASig0, alternateASig1, aSig0, aSig1 )
- && ( q & 1 ) )
- ) {
- aSig0 = alternateASig0;
- aSig1 = alternateASig1;
- zSign = ! zSign;
- }
- return
- normalizeRoundAndPackFloatx80(
- 80, zSign, bExp + expDiff, aSig0, aSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the square root of the extended double-precision floating-point
-| value `a'. The operation is performed according to the IEC/IEEE Standard
-| for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_sqrt( floatx80 a )
-{
- flag aSign;
- int32 aExp, zExp;
- bits64 aSig0, aSig1, zSig0, zSig1, doubleZSig0;
- bits64 rem0, rem1, rem2, rem3, term0, term1, term2, term3;
- floatx80 z;
-
- aSig0 = extractFloatx80Frac( a );
- aExp = extractFloatx80Exp( a );
- aSign = extractFloatx80Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( (bits64) ( aSig0<<1 ) ) return propagateFloatx80NaN( a, a );
- if ( ! aSign ) return a;
- goto invalid;
- }
- if ( aSign ) {
- if ( ( aExp | aSig0 ) == 0 ) return a;
- invalid:
- float_raise( float_flag_invalid );
- z.low = floatx80_default_nan_low;
- z.high = floatx80_default_nan_high;
- return z;
- }
- if ( aExp == 0 ) {
- if ( aSig0 == 0 ) return packFloatx80( 0, 0, 0 );
- normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 );
- }
- zExp = ( ( aExp - 0x3FFF )>>1 ) + 0x3FFF;
- zSig0 = estimateSqrt32( aExp, aSig0>>32 );
- shift128Right( aSig0, 0, 2 + ( aExp & 1 ), &aSig0, &aSig1 );
- zSig0 = estimateDiv128To64( aSig0, aSig1, zSig0<<32 ) + ( zSig0<<30 );
- doubleZSig0 = zSig0<<1;
- mul64To128( zSig0, zSig0, &term0, &term1 );
- sub128( aSig0, aSig1, term0, term1, &rem0, &rem1 );
- while ( (sbits64) rem0 < 0 ) {
- --zSig0;
- doubleZSig0 -= 2;
- add128( rem0, rem1, zSig0>>63, doubleZSig0 | 1, &rem0, &rem1 );
- }
- zSig1 = estimateDiv128To64( rem1, 0, doubleZSig0 );
- if ( ( zSig1 & LIT64( 0x3FFFFFFFFFFFFFFF ) ) <= 5 ) {
- if ( zSig1 == 0 ) zSig1 = 1;
- mul64To128( doubleZSig0, zSig1, &term1, &term2 );
- sub128( rem1, 0, term1, term2, &rem1, &rem2 );
- mul64To128( zSig1, zSig1, &term2, &term3 );
- sub192( rem1, rem2, 0, 0, term2, term3, &rem1, &rem2, &rem3 );
- while ( (sbits64) rem1 < 0 ) {
- --zSig1;
- shortShift128Left( 0, zSig1, 1, &term2, &term3 );
- term3 |= 1;
- term2 |= doubleZSig0;
- add192( rem1, rem2, rem3, 0, term2, term3, &rem1, &rem2, &rem3 );
- }
- zSig1 |= ( ( rem1 | rem2 | rem3 ) != 0 );
- }
- shortShift128Left( 0, zSig1, 1, &zSig0, &zSig1 );
- zSig0 |= doubleZSig0;
- return
- roundAndPackFloatx80(
- floatx80_rounding_precision, 0, zExp, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is
-| equal to the corresponding value `b', and 0 otherwise. The comparison is
-| performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_eq( floatx80 a, floatx80 b )
-{
- if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( a )<<1 ) )
- || ( ( extractFloatx80Exp( b ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( b )<<1 ) )
- ) {
- if ( floatx80_is_signaling_nan( a )
- || floatx80_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- return
- ( a.low == b.low )
- && ( ( a.high == b.high )
- || ( ( a.low == 0 )
- && ( (bits16) ( ( a.high | b.high )<<1 ) == 0 ) )
- );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is
-| less than or equal to the corresponding value `b', and 0 otherwise. The
-| comparison is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_le( floatx80 a, floatx80 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( a )<<1 ) )
- || ( ( extractFloatx80Exp( b ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( b )<<1 ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloatx80Sign( a );
- bSign = extractFloatx80Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- || ( ( ( (bits16) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- == 0 );
- }
- return
- aSign ? le128( b.high, b.low, a.high, a.low )
- : le128( a.high, a.low, b.high, b.low );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is
-| less than the corresponding value `b', and 0 otherwise. The comparison
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_lt( floatx80 a, floatx80 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( a )<<1 ) )
- || ( ( extractFloatx80Exp( b ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( b )<<1 ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloatx80Sign( a );
- bSign = extractFloatx80Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- && ( ( ( (bits16) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- != 0 );
- }
- return
- aSign ? lt128( b.high, b.low, a.high, a.low )
- : lt128( a.high, a.low, b.high, b.low );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is equal
-| to the corresponding value `b', and 0 otherwise. The invalid exception is
-| raised if either operand is a NaN. Otherwise, the comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_eq_signaling( floatx80 a, floatx80 b )
-{
- if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( a )<<1 ) )
- || ( ( extractFloatx80Exp( b ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( b )<<1 ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- return
- ( a.low == b.low )
- && ( ( a.high == b.high )
- || ( ( a.low == 0 )
- && ( (bits16) ( ( a.high | b.high )<<1 ) == 0 ) )
- );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is less
-| than or equal to the corresponding value `b', and 0 otherwise. Quiet NaNs
-| do not cause an exception. Otherwise, the comparison is performed according
-| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_le_quiet( floatx80 a, floatx80 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( a )<<1 ) )
- || ( ( extractFloatx80Exp( b ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( b )<<1 ) )
- ) {
- if ( floatx80_is_signaling_nan( a )
- || floatx80_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloatx80Sign( a );
- bSign = extractFloatx80Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- || ( ( ( (bits16) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- == 0 );
- }
- return
- aSign ? le128( b.high, b.low, a.high, a.low )
- : le128( a.high, a.low, b.high, b.low );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the extended double-precision floating-point value `a' is less
-| than the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause
-| an exception. Otherwise, the comparison is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag floatx80_lt_quiet( floatx80 a, floatx80 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( a )<<1 ) )
- || ( ( extractFloatx80Exp( b ) == 0x7FFF )
- && (bits64) ( extractFloatx80Frac( b )<<1 ) )
- ) {
- if ( floatx80_is_signaling_nan( a )
- || floatx80_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloatx80Sign( a );
- bSign = extractFloatx80Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- && ( ( ( (bits16) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- != 0 );
- }
- return
- aSign ? lt128( b.high, b.low, a.high, a.low )
- : lt128( a.high, a.low, b.high, b.low );
-
-}
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the 32-bit two's complement integer format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic---which means in particular that the conversion is rounded
-| according to the current rounding mode. If `a' is a NaN, the largest
-| positive integer is returned. Otherwise, if the conversion overflows, the
-| largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int32 float128_to_int32( float128 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig0, aSig1;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( ( aExp == 0x7FFF ) && ( aSig0 | aSig1 ) ) aSign = 0;
- if ( aExp ) aSig0 |= LIT64( 0x0001000000000000 );
- aSig0 |= ( aSig1 != 0 );
- shiftCount = 0x4028 - aExp;
- if ( 0 < shiftCount ) shift64RightJamming( aSig0, shiftCount, &aSig0 );
- return roundAndPackInt32( aSign, aSig0 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the 32-bit two's complement integer format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic, except that the conversion is always rounded toward zero. If
-| `a' is a NaN, the largest positive integer is returned. Otherwise, if the
-| conversion overflows, the largest integer with the same sign as `a' is
-| returned.
-*----------------------------------------------------------------------------*/
-
-int32 float128_to_int32_round_to_zero( float128 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig0, aSig1, savedASig;
- int32 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- aSig0 |= ( aSig1 != 0 );
- if ( 0x401E < aExp ) {
- if ( ( aExp == 0x7FFF ) && aSig0 ) aSign = 0;
- goto invalid;
- }
- else if ( aExp < 0x3FFF ) {
- if ( aExp || aSig0 ) float_exception_flags |= float_flag_inexact;
- return 0;
- }
- aSig0 |= LIT64( 0x0001000000000000 );
- shiftCount = 0x402F - aExp;
- savedASig = aSig0;
- aSig0 >>= shiftCount;
- z = aSig0;
- if ( aSign ) z = - z;
- if ( ( z < 0 ) ^ aSign ) {
- invalid:
- float_raise( float_flag_invalid );
- return aSign ? (sbits32) 0x80000000 : 0x7FFFFFFF;
- }
- if ( ( aSig0<<shiftCount ) != savedASig ) {
- float_exception_flags |= float_flag_inexact;
- }
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the 64-bit two's complement integer format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic---which means in particular that the conversion is rounded
-| according to the current rounding mode. If `a' is a NaN, the largest
-| positive integer is returned. Otherwise, if the conversion overflows, the
-| largest integer with the same sign as `a' is returned.
-*----------------------------------------------------------------------------*/
-
-int64 float128_to_int64( float128 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig0, aSig1;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( aExp ) aSig0 |= LIT64( 0x0001000000000000 );
- shiftCount = 0x402F - aExp;
- if ( shiftCount <= 0 ) {
- if ( 0x403E < aExp ) {
- float_raise( float_flag_invalid );
- if ( ! aSign
- || ( ( aExp == 0x7FFF )
- && ( aSig1 || ( aSig0 != LIT64( 0x0001000000000000 ) ) )
- )
- ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- shortShift128Left( aSig0, aSig1, - shiftCount, &aSig0, &aSig1 );
- }
- else {
- shift64ExtraRightJamming( aSig0, aSig1, shiftCount, &aSig0, &aSig1 );
- }
- return roundAndPackInt64( aSign, aSig0, aSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the 64-bit two's complement integer format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic, except that the conversion is always rounded toward zero.
-| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
-| the conversion overflows, the largest integer with the same sign as `a' is
-| returned.
-*----------------------------------------------------------------------------*/
-
-int64 float128_to_int64_round_to_zero( float128 a )
-{
- flag aSign;
- int32 aExp, shiftCount;
- bits64 aSig0, aSig1;
- int64 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( aExp ) aSig0 |= LIT64( 0x0001000000000000 );
- shiftCount = aExp - 0x402F;
- if ( 0 < shiftCount ) {
- if ( 0x403E <= aExp ) {
- aSig0 &= LIT64( 0x0000FFFFFFFFFFFF );
- if ( ( a.high == LIT64( 0xC03E000000000000 ) )
- && ( aSig1 < LIT64( 0x0002000000000000 ) ) ) {
- if ( aSig1 ) float_exception_flags |= float_flag_inexact;
- }
- else {
- float_raise( float_flag_invalid );
- if ( ! aSign || ( ( aExp == 0x7FFF ) && ( aSig0 | aSig1 ) ) ) {
- return LIT64( 0x7FFFFFFFFFFFFFFF );
- }
- }
- return (sbits64) LIT64( 0x8000000000000000 );
- }
- z = ( aSig0<<shiftCount ) | ( aSig1>>( ( - shiftCount ) & 63 ) );
- if ( (bits64) ( aSig1<<shiftCount ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- }
- else {
- if ( aExp < 0x3FFF ) {
- if ( aExp | aSig0 | aSig1 ) {
- float_exception_flags |= float_flag_inexact;
- }
- return 0;
- }
- z = aSig0>>( - shiftCount );
- if ( aSig1
- || ( shiftCount && (bits64) ( aSig0<<( shiftCount & 63 ) ) ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- }
- if ( aSign ) z = - z;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the single-precision floating-point format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float32 float128_to_float32( float128 a )
-{
- flag aSign;
- int32 aExp;
- bits64 aSig0, aSig1;
- bits32 zSig;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) {
- return commonNaNToFloat32( float128ToCommonNaN( a ) );
- }
- return packFloat32( aSign, 0xFF, 0 );
- }
- aSig0 |= ( aSig1 != 0 );
- shift64RightJamming( aSig0, 18, &aSig0 );
- zSig = aSig0;
- if ( aExp || zSig ) {
- zSig |= 0x40000000;
- aExp -= 0x3F81;
- }
- return roundAndPackFloat32( aSign, aExp, zSig );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the double-precision floating-point format. The conversion
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float64 float128_to_float64( float128 a )
-{
- flag aSign;
- int32 aExp;
- bits64 aSig0, aSig1;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) {
- return commonNaNToFloat64( float128ToCommonNaN( a ) );
- }
- return packFloat64( aSign, 0x7FF, 0 );
- }
- shortShift128Left( aSig0, aSig1, 14, &aSig0, &aSig1 );
- aSig0 |= ( aSig1 != 0 );
- if ( aExp || aSig0 ) {
- aSig0 |= LIT64( 0x4000000000000000 );
- aExp -= 0x3C01;
- }
- return roundAndPackFloat64( aSign, aExp, aSig0 );
-
-}
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Returns the result of converting the quadruple-precision floating-point
-| value `a' to the extended double-precision floating-point format. The
-| conversion is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 float128_to_floatx80( float128 a )
-{
- flag aSign;
- int32 aExp;
- bits64 aSig0, aSig1;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) {
- return commonNaNToFloatx80( float128ToCommonNaN( a ) );
- }
- return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
- }
- if ( aExp == 0 ) {
- if ( ( aSig0 | aSig1 ) == 0 ) return packFloatx80( aSign, 0, 0 );
- normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 );
- }
- else {
- aSig0 |= LIT64( 0x0001000000000000 );
- }
- shortShift128Left( aSig0, aSig1, 15, &aSig0, &aSig1 );
- return roundAndPackFloatx80( 80, aSign, aExp, aSig0, aSig1 );
-
-}
-
-#endif
-
-/*----------------------------------------------------------------------------
-| Rounds the quadruple-precision floating-point value `a' to an integer, and
-| returns the result as a quadruple-precision floating-point value. The
-| operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_round_to_int( float128 a )
-{
- flag aSign;
- int32 aExp;
- bits64 lastBitMask, roundBitsMask;
- int8 roundingMode;
- float128 z;
-
- aExp = extractFloat128Exp( a );
- if ( 0x402F <= aExp ) {
- if ( 0x406F <= aExp ) {
- if ( ( aExp == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) )
- ) {
- return propagateFloat128NaN( a, a );
- }
- return a;
- }
- lastBitMask = 1;
- lastBitMask = ( lastBitMask<<( 0x406E - aExp ) )<<1;
- roundBitsMask = lastBitMask - 1;
- z = a;
- roundingMode = float_rounding_mode;
- if ( roundingMode == float_round_nearest_even ) {
- if ( lastBitMask ) {
- add128( z.high, z.low, 0, lastBitMask>>1, &z.high, &z.low );
- if ( ( z.low & roundBitsMask ) == 0 ) z.low &= ~ lastBitMask;
- }
- else {
- if ( (sbits64) z.low < 0 ) {
- ++z.high;
- if ( (bits64) ( z.low<<1 ) == 0 ) z.high &= ~1;
- }
- }
- }
- else if ( roundingMode != float_round_to_zero ) {
- if ( extractFloat128Sign( z )
- ^ ( roundingMode == float_round_up ) ) {
- add128( z.high, z.low, 0, roundBitsMask, &z.high, &z.low );
- }
- }
- z.low &= ~ roundBitsMask;
- }
- else {
- if ( aExp < 0x3FFF ) {
- if ( ( ( (bits64) ( a.high<<1 ) ) | a.low ) == 0 ) return a;
- float_exception_flags |= float_flag_inexact;
- aSign = extractFloat128Sign( a );
- switch ( float_rounding_mode ) {
- case float_round_nearest_even:
- if ( ( aExp == 0x3FFE )
- && ( extractFloat128Frac0( a )
- | extractFloat128Frac1( a ) )
- ) {
- return packFloat128( aSign, 0x3FFF, 0, 0 );
- }
- break;
- case float_round_down:
- return
- aSign ? packFloat128( 1, 0x3FFF, 0, 0 )
- : packFloat128( 0, 0, 0, 0 );
- case float_round_up:
- return
- aSign ? packFloat128( 1, 0, 0, 0 )
- : packFloat128( 0, 0x3FFF, 0, 0 );
- }
- return packFloat128( aSign, 0, 0, 0 );
- }
- lastBitMask = 1;
- lastBitMask <<= 0x402F - aExp;
- roundBitsMask = lastBitMask - 1;
- z.low = 0;
- z.high = a.high;
- roundingMode = float_rounding_mode;
- if ( roundingMode == float_round_nearest_even ) {
- z.high += lastBitMask>>1;
- if ( ( ( z.high & roundBitsMask ) | a.low ) == 0 ) {
- z.high &= ~ lastBitMask;
- }
- }
- else if ( roundingMode != float_round_to_zero ) {
- if ( extractFloat128Sign( z )
- ^ ( roundingMode == float_round_up ) ) {
- z.high |= ( a.low != 0 );
- z.high += roundBitsMask;
- }
- }
- z.high &= ~ roundBitsMask;
- }
- if ( ( z.low != a.low ) || ( z.high != a.high ) ) {
- float_exception_flags |= float_flag_inexact;
- }
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the absolute values of the quadruple-precision
-| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated
-| before being returned. `zSign' is ignored if the result is a NaN.
-| The addition is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float128 addFloat128Sigs( float128 a, float128 b, flag zSign )
-{
- int32 aExp, bExp, zExp;
- bits64 aSig0, aSig1, bSig0, bSig1, zSig0, zSig1, zSig2;
- int32 expDiff;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- bSig1 = extractFloat128Frac1( b );
- bSig0 = extractFloat128Frac0( b );
- bExp = extractFloat128Exp( b );
- expDiff = aExp - bExp;
- if ( 0 < expDiff ) {
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- --expDiff;
- }
- else {
- bSig0 |= LIT64( 0x0001000000000000 );
- }
- shift128ExtraRightJamming(
- bSig0, bSig1, 0, expDiff, &bSig0, &bSig1, &zSig2 );
- zExp = aExp;
- }
- else if ( expDiff < 0 ) {
- if ( bExp == 0x7FFF ) {
- if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b );
- return packFloat128( zSign, 0x7FFF, 0, 0 );
- }
- if ( aExp == 0 ) {
- ++expDiff;
- }
- else {
- aSig0 |= LIT64( 0x0001000000000000 );
- }
- shift128ExtraRightJamming(
- aSig0, aSig1, 0, - expDiff, &aSig0, &aSig1, &zSig2 );
- zExp = bExp;
- }
- else {
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 | bSig0 | bSig1 ) {
- return propagateFloat128NaN( a, b );
- }
- return a;
- }
- add128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 );
- if ( aExp == 0 ) return packFloat128( zSign, 0, zSig0, zSig1 );
- zSig2 = 0;
- zSig0 |= LIT64( 0x0002000000000000 );
- zExp = aExp;
- goto shiftRight1;
- }
- aSig0 |= LIT64( 0x0001000000000000 );
- add128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 );
- --zExp;
- if ( zSig0 < LIT64( 0x0002000000000000 ) ) goto roundAndPack;
- ++zExp;
- shiftRight1:
- shift128ExtraRightJamming(
- zSig0, zSig1, zSig2, 1, &zSig0, &zSig1, &zSig2 );
- roundAndPack:
- return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the absolute values of the quadruple-
-| precision floating-point values `a' and `b'. If `zSign' is 1, the
-| difference is negated before being returned. `zSign' is ignored if the
-| result is a NaN. The subtraction is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-static float128 subFloat128Sigs( float128 a, float128 b, flag zSign )
-{
- int32 aExp, bExp, zExp;
- bits64 aSig0, aSig1, bSig0, bSig1, zSig0, zSig1;
- int32 expDiff;
- float128 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- bSig1 = extractFloat128Frac1( b );
- bSig0 = extractFloat128Frac0( b );
- bExp = extractFloat128Exp( b );
- expDiff = aExp - bExp;
- shortShift128Left( aSig0, aSig1, 14, &aSig0, &aSig1 );
- shortShift128Left( bSig0, bSig1, 14, &bSig0, &bSig1 );
- if ( 0 < expDiff ) goto aExpBigger;
- if ( expDiff < 0 ) goto bExpBigger;
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 | bSig0 | bSig1 ) {
- return propagateFloat128NaN( a, b );
- }
- float_raise( float_flag_invalid );
- z.low = float128_default_nan_low;
- z.high = float128_default_nan_high;
- return z;
- }
- if ( aExp == 0 ) {
- aExp = 1;
- bExp = 1;
- }
- if ( bSig0 < aSig0 ) goto aBigger;
- if ( aSig0 < bSig0 ) goto bBigger;
- if ( bSig1 < aSig1 ) goto aBigger;
- if ( aSig1 < bSig1 ) goto bBigger;
- return packFloat128( float_rounding_mode == float_round_down, 0, 0, 0 );
- bExpBigger:
- if ( bExp == 0x7FFF ) {
- if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b );
- return packFloat128( zSign ^ 1, 0x7FFF, 0, 0 );
- }
- if ( aExp == 0 ) {
- ++expDiff;
- }
- else {
- aSig0 |= LIT64( 0x4000000000000000 );
- }
- shift128RightJamming( aSig0, aSig1, - expDiff, &aSig0, &aSig1 );
- bSig0 |= LIT64( 0x4000000000000000 );
- bBigger:
- sub128( bSig0, bSig1, aSig0, aSig1, &zSig0, &zSig1 );
- zExp = bExp;
- zSign ^= 1;
- goto normalizeRoundAndPack;
- aExpBigger:
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- --expDiff;
- }
- else {
- bSig0 |= LIT64( 0x4000000000000000 );
- }
- shift128RightJamming( bSig0, bSig1, expDiff, &bSig0, &bSig1 );
- aSig0 |= LIT64( 0x4000000000000000 );
- aBigger:
- sub128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 );
- zExp = aExp;
- normalizeRoundAndPack:
- --zExp;
- return normalizeRoundAndPackFloat128( zSign, zExp - 14, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of adding the quadruple-precision floating-point values
-| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
-| for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_add( float128 a, float128 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloat128Sign( a );
- bSign = extractFloat128Sign( b );
- if ( aSign == bSign ) {
- return addFloat128Sigs( a, b, aSign );
- }
- else {
- return subFloat128Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of subtracting the quadruple-precision floating-point
-| values `a' and `b'. The operation is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_sub( float128 a, float128 b )
-{
- flag aSign, bSign;
-
- aSign = extractFloat128Sign( a );
- bSign = extractFloat128Sign( b );
- if ( aSign == bSign ) {
- return subFloat128Sigs( a, b, aSign );
- }
- else {
- return addFloat128Sigs( a, b, aSign );
- }
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of multiplying the quadruple-precision floating-point
-| values `a' and `b'. The operation is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_mul( float128 a, float128 b )
-{
- flag aSign, bSign, zSign;
- int32 aExp, bExp, zExp;
- bits64 aSig0, aSig1, bSig0, bSig1, zSig0, zSig1, zSig2, zSig3;
- float128 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- bSig1 = extractFloat128Frac1( b );
- bSig0 = extractFloat128Frac0( b );
- bExp = extractFloat128Exp( b );
- bSign = extractFloat128Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0x7FFF ) {
- if ( ( aSig0 | aSig1 )
- || ( ( bExp == 0x7FFF ) && ( bSig0 | bSig1 ) ) ) {
- return propagateFloat128NaN( a, b );
- }
- if ( ( bExp | bSig0 | bSig1 ) == 0 ) goto invalid;
- return packFloat128( zSign, 0x7FFF, 0, 0 );
- }
- if ( bExp == 0x7FFF ) {
- if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b );
- if ( ( aExp | aSig0 | aSig1 ) == 0 ) {
- invalid:
- float_raise( float_flag_invalid );
- z.low = float128_default_nan_low;
- z.high = float128_default_nan_high;
- return z;
- }
- return packFloat128( zSign, 0x7FFF, 0, 0 );
- }
- if ( aExp == 0 ) {
- if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( zSign, 0, 0, 0 );
- normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 );
- }
- if ( bExp == 0 ) {
- if ( ( bSig0 | bSig1 ) == 0 ) return packFloat128( zSign, 0, 0, 0 );
- normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 );
- }
- zExp = aExp + bExp - 0x4000;
- aSig0 |= LIT64( 0x0001000000000000 );
- shortShift128Left( bSig0, bSig1, 16, &bSig0, &bSig1 );
- mul128To256( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1, &zSig2, &zSig3 );
- add128( zSig0, zSig1, aSig0, aSig1, &zSig0, &zSig1 );
- zSig2 |= ( zSig3 != 0 );
- if ( LIT64( 0x0002000000000000 ) <= zSig0 ) {
- shift128ExtraRightJamming(
- zSig0, zSig1, zSig2, 1, &zSig0, &zSig1, &zSig2 );
- ++zExp;
- }
- return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the result of dividing the quadruple-precision floating-point value
-| `a' by the corresponding value `b'. The operation is performed according to
-| the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_div( float128 a, float128 b )
-{
- flag aSign, bSign, zSign;
- int32 aExp, bExp, zExp;
- bits64 aSig0, aSig1, bSig0, bSig1, zSig0, zSig1, zSig2;
- bits64 rem0, rem1, rem2, rem3, term0, term1, term2, term3;
- float128 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- bSig1 = extractFloat128Frac1( b );
- bSig0 = extractFloat128Frac0( b );
- bExp = extractFloat128Exp( b );
- bSign = extractFloat128Sign( b );
- zSign = aSign ^ bSign;
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, b );
- if ( bExp == 0x7FFF ) {
- if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b );
- goto invalid;
- }
- return packFloat128( zSign, 0x7FFF, 0, 0 );
- }
- if ( bExp == 0x7FFF ) {
- if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b );
- return packFloat128( zSign, 0, 0, 0 );
- }
- if ( bExp == 0 ) {
- if ( ( bSig0 | bSig1 ) == 0 ) {
- if ( ( aExp | aSig0 | aSig1 ) == 0 ) {
- invalid:
- float_raise( float_flag_invalid );
- z.low = float128_default_nan_low;
- z.high = float128_default_nan_high;
- return z;
- }
- float_raise( float_flag_divbyzero );
- return packFloat128( zSign, 0x7FFF, 0, 0 );
- }
- normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 );
- }
- if ( aExp == 0 ) {
- if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( zSign, 0, 0, 0 );
- normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 );
- }
- zExp = aExp - bExp + 0x3FFD;
- shortShift128Left(
- aSig0 | LIT64( 0x0001000000000000 ), aSig1, 15, &aSig0, &aSig1 );
- shortShift128Left(
- bSig0 | LIT64( 0x0001000000000000 ), bSig1, 15, &bSig0, &bSig1 );
- if ( le128( bSig0, bSig1, aSig0, aSig1 ) ) {
- shift128Right( aSig0, aSig1, 1, &aSig0, &aSig1 );
- ++zExp;
- }
- zSig0 = estimateDiv128To64( aSig0, aSig1, bSig0 );
- mul128By64To192( bSig0, bSig1, zSig0, &term0, &term1, &term2 );
- sub192( aSig0, aSig1, 0, term0, term1, term2, &rem0, &rem1, &rem2 );
- while ( (sbits64) rem0 < 0 ) {
- --zSig0;
- add192( rem0, rem1, rem2, 0, bSig0, bSig1, &rem0, &rem1, &rem2 );
- }
- zSig1 = estimateDiv128To64( rem1, rem2, bSig0 );
- if ( ( zSig1 & 0x3FFF ) <= 4 ) {
- mul128By64To192( bSig0, bSig1, zSig1, &term1, &term2, &term3 );
- sub192( rem1, rem2, 0, term1, term2, term3, &rem1, &rem2, &rem3 );
- while ( (sbits64) rem1 < 0 ) {
- --zSig1;
- add192( rem1, rem2, rem3, 0, bSig0, bSig1, &rem1, &rem2, &rem3 );
- }
- zSig1 |= ( ( rem1 | rem2 | rem3 ) != 0 );
- }
- shift128ExtraRightJamming( zSig0, zSig1, 0, 15, &zSig0, &zSig1, &zSig2 );
- return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the remainder of the quadruple-precision floating-point value `a'
-| with respect to the corresponding value `b'. The operation is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_rem( float128 a, float128 b )
-{
- flag aSign, zSign;
- int32 aExp, bExp, expDiff;
- bits64 aSig0, aSig1, bSig0, bSig1, q, term0, term1, term2;
- bits64 allZero, alternateASig0, alternateASig1, sigMean1;
- sbits64 sigMean0;
- float128 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- bSig1 = extractFloat128Frac1( b );
- bSig0 = extractFloat128Frac0( b );
- bExp = extractFloat128Exp( b );
-// bSign = extractFloat128Sign( b );
- if ( aExp == 0x7FFF ) {
- if ( ( aSig0 | aSig1 )
- || ( ( bExp == 0x7FFF ) && ( bSig0 | bSig1 ) ) ) {
- return propagateFloat128NaN( a, b );
- }
- goto invalid;
- }
- if ( bExp == 0x7FFF ) {
- if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b );
- return a;
- }
- if ( bExp == 0 ) {
- if ( ( bSig0 | bSig1 ) == 0 ) {
- invalid:
- float_raise( float_flag_invalid );
- z.low = float128_default_nan_low;
- z.high = float128_default_nan_high;
- return z;
- }
- normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 );
- }
- if ( aExp == 0 ) {
- if ( ( aSig0 | aSig1 ) == 0 ) return a;
- normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 );
- }
- expDiff = aExp - bExp;
- if ( expDiff < -1 ) return a;
- shortShift128Left(
- aSig0 | LIT64( 0x0001000000000000 ),
- aSig1,
- 15 - ( expDiff < 0 ),
- &aSig0,
- &aSig1
- );
- shortShift128Left(
- bSig0 | LIT64( 0x0001000000000000 ), bSig1, 15, &bSig0, &bSig1 );
- q = le128( bSig0, bSig1, aSig0, aSig1 );
- if ( q ) sub128( aSig0, aSig1, bSig0, bSig1, &aSig0, &aSig1 );
- expDiff -= 64;
- while ( 0 < expDiff ) {
- q = estimateDiv128To64( aSig0, aSig1, bSig0 );
- q = ( 4 < q ) ? q - 4 : 0;
- mul128By64To192( bSig0, bSig1, q, &term0, &term1, &term2 );
- shortShift192Left( term0, term1, term2, 61, &term1, &term2, &allZero );
- shortShift128Left( aSig0, aSig1, 61, &aSig0, &allZero );
- sub128( aSig0, 0, term1, term2, &aSig0, &aSig1 );
- expDiff -= 61;
- }
- if ( -64 < expDiff ) {
- q = estimateDiv128To64( aSig0, aSig1, bSig0 );
- q = ( 4 < q ) ? q - 4 : 0;
- q >>= - expDiff;
- shift128Right( bSig0, bSig1, 12, &bSig0, &bSig1 );
- expDiff += 52;
- if ( expDiff < 0 ) {
- shift128Right( aSig0, aSig1, - expDiff, &aSig0, &aSig1 );
- }
- else {
- shortShift128Left( aSig0, aSig1, expDiff, &aSig0, &aSig1 );
- }
- mul128By64To192( bSig0, bSig1, q, &term0, &term1, &term2 );
- sub128( aSig0, aSig1, term1, term2, &aSig0, &aSig1 );
- }
- else {
- shift128Right( aSig0, aSig1, 12, &aSig0, &aSig1 );
- shift128Right( bSig0, bSig1, 12, &bSig0, &bSig1 );
- }
- do {
- alternateASig0 = aSig0;
- alternateASig1 = aSig1;
- ++q;
- sub128( aSig0, aSig1, bSig0, bSig1, &aSig0, &aSig1 );
- } while ( 0 <= (sbits64) aSig0 );
- add128(
- aSig0, aSig1, alternateASig0, alternateASig1, (bits64 *)&sigMean0, &sigMean1 );
- if ( ( sigMean0 < 0 )
- || ( ( ( sigMean0 | sigMean1 ) == 0 ) && ( q & 1 ) ) ) {
- aSig0 = alternateASig0;
- aSig1 = alternateASig1;
- }
- zSign = ( (sbits64) aSig0 < 0 );
- if ( zSign ) sub128( 0, 0, aSig0, aSig1, &aSig0, &aSig1 );
- return
- normalizeRoundAndPackFloat128( aSign ^ zSign, bExp - 4, aSig0, aSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns the square root of the quadruple-precision floating-point value `a'.
-| The operation is performed according to the IEC/IEEE Standard for Binary
-| Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-float128 float128_sqrt( float128 a )
-{
- flag aSign;
- int32 aExp, zExp;
- bits64 aSig0, aSig1, zSig0, zSig1, zSig2, doubleZSig0;
- bits64 rem0, rem1, rem2, rem3, term0, term1, term2, term3;
- float128 z;
-
- aSig1 = extractFloat128Frac1( a );
- aSig0 = extractFloat128Frac0( a );
- aExp = extractFloat128Exp( a );
- aSign = extractFloat128Sign( a );
- if ( aExp == 0x7FFF ) {
- if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, a );
- if ( ! aSign ) return a;
- goto invalid;
- }
- if ( aSign ) {
- if ( ( aExp | aSig0 | aSig1 ) == 0 ) return a;
- invalid:
- float_raise( float_flag_invalid );
- z.low = float128_default_nan_low;
- z.high = float128_default_nan_high;
- return z;
- }
- if ( aExp == 0 ) {
- if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( 0, 0, 0, 0 );
- normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 );
- }
- zExp = ( ( aExp - 0x3FFF )>>1 ) + 0x3FFE;
- aSig0 |= LIT64( 0x0001000000000000 );
- zSig0 = estimateSqrt32( aExp, aSig0>>17 );
- shortShift128Left( aSig0, aSig1, 13 - ( aExp & 1 ), &aSig0, &aSig1 );
- zSig0 = estimateDiv128To64( aSig0, aSig1, zSig0<<32 ) + ( zSig0<<30 );
- doubleZSig0 = zSig0<<1;
- mul64To128( zSig0, zSig0, &term0, &term1 );
- sub128( aSig0, aSig1, term0, term1, &rem0, &rem1 );
- while ( (sbits64) rem0 < 0 ) {
- --zSig0;
- doubleZSig0 -= 2;
- add128( rem0, rem1, zSig0>>63, doubleZSig0 | 1, &rem0, &rem1 );
- }
- zSig1 = estimateDiv128To64( rem1, 0, doubleZSig0 );
- if ( ( zSig1 & 0x1FFF ) <= 5 ) {
- if ( zSig1 == 0 ) zSig1 = 1;
- mul64To128( doubleZSig0, zSig1, &term1, &term2 );
- sub128( rem1, 0, term1, term2, &rem1, &rem2 );
- mul64To128( zSig1, zSig1, &term2, &term3 );
- sub192( rem1, rem2, 0, 0, term2, term3, &rem1, &rem2, &rem3 );
- while ( (sbits64) rem1 < 0 ) {
- --zSig1;
- shortShift128Left( 0, zSig1, 1, &term2, &term3 );
- term3 |= 1;
- term2 |= doubleZSig0;
- add192( rem1, rem2, rem3, 0, term2, term3, &rem1, &rem2, &rem3 );
- }
- zSig1 |= ( ( rem1 | rem2 | rem3 ) != 0 );
- }
- shift128ExtraRightJamming( zSig0, zSig1, 0, 14, &zSig0, &zSig1, &zSig2 );
- return roundAndPackFloat128( 0, zExp, zSig0, zSig1, zSig2 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is equal to
-| the corresponding value `b', and 0 otherwise. The comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float128_eq( float128 a, float128 b )
-{
- if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
- || ( ( extractFloat128Exp( b ) == 0x7FFF )
- && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
- ) {
- if ( float128_is_signaling_nan( a )
- || float128_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- return
- ( a.low == b.low )
- && ( ( a.high == b.high )
- || ( ( a.low == 0 )
- && ( (bits64) ( ( a.high | b.high )<<1 ) == 0 ) )
- );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is less than
-| or equal to the corresponding value `b', and 0 otherwise. The comparison
-| is performed according to the IEC/IEEE Standard for Binary Floating-Point
-| Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float128_le( float128 a, float128 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
- || ( ( extractFloat128Exp( b ) == 0x7FFF )
- && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloat128Sign( a );
- bSign = extractFloat128Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- || ( ( ( (bits64) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- == 0 );
- }
- return
- aSign ? le128( b.high, b.low, a.high, a.low )
- : le128( a.high, a.low, b.high, b.low );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is less than
-| the corresponding value `b', and 0 otherwise. The comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float128_lt( float128 a, float128 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
- || ( ( extractFloat128Exp( b ) == 0x7FFF )
- && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- aSign = extractFloat128Sign( a );
- bSign = extractFloat128Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- && ( ( ( (bits64) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- != 0 );
- }
- return
- aSign ? lt128( b.high, b.low, a.high, a.low )
- : lt128( a.high, a.low, b.high, b.low );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is equal to
-| the corresponding value `b', and 0 otherwise. The invalid exception is
-| raised if either operand is a NaN. Otherwise, the comparison is performed
-| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float128_eq_signaling( float128 a, float128 b )
-{
- if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
- || ( ( extractFloat128Exp( b ) == 0x7FFF )
- && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
- ) {
- float_raise( float_flag_invalid );
- return 0;
- }
- return
- ( a.low == b.low )
- && ( ( a.high == b.high )
- || ( ( a.low == 0 )
- && ( (bits64) ( ( a.high | b.high )<<1 ) == 0 ) )
- );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is less than
-| or equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not
-| cause an exception. Otherwise, the comparison is performed according to the
-| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float128_le_quiet( float128 a, float128 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
- || ( ( extractFloat128Exp( b ) == 0x7FFF )
- && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
- ) {
- if ( float128_is_signaling_nan( a )
- || float128_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloat128Sign( a );
- bSign = extractFloat128Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- || ( ( ( (bits64) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- == 0 );
- }
- return
- aSign ? le128( b.high, b.low, a.high, a.low )
- : le128( a.high, a.low, b.high, b.low );
-
-}
-
-/*----------------------------------------------------------------------------
-| Returns 1 if the quadruple-precision floating-point value `a' is less than
-| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an
-| exception. Otherwise, the comparison is performed according to the IEC/IEEE
-| Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-flag float128_lt_quiet( float128 a, float128 b )
-{
- flag aSign, bSign;
-
- if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
- && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
- || ( ( extractFloat128Exp( b ) == 0x7FFF )
- && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
- ) {
- if ( float128_is_signaling_nan( a )
- || float128_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid );
- }
- return 0;
- }
- aSign = extractFloat128Sign( a );
- bSign = extractFloat128Sign( b );
- if ( aSign != bSign ) {
- return
- aSign
- && ( ( ( (bits64) ( ( a.high | b.high )<<1 ) ) | a.low | b.low )
- != 0 );
- }
- return
- aSign ? lt128( b.high, b.low, a.high, a.low )
- : lt128( a.high, a.low, b.high, b.low );
-
-}
-
-#endif
diff --git a/3rdparty/softfloat/softfloat.h b/3rdparty/softfloat/softfloat.h
deleted file mode 100644
index a97408c3222..00000000000
--- a/3rdparty/softfloat/softfloat.h
+++ /dev/null
@@ -1,463 +0,0 @@
-
-/*============================================================================
-
-This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
-Package, Release 2b.
-
-Written by John R. Hauser. This work was made possible in part by the
-International Computer Science Institute, located at Suite 600, 1947 Center
-Street, Berkeley, California 94704. Funding was partially provided by the
-National Science Foundation under grant MIP-9311980. The original version
-of this code was written as part of a project to build a fixed-point vector
-processor in collaboration with the University of California at Berkeley,
-overseen by Profs. Nelson Morgan and John Wawrzynek. More information
-is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
-arithmetic/SoftFloat.html'.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
-been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
-RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
-AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
-COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
-EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
-INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
-OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, so long as
-(1) the source code for the derivative work includes prominent notice that
-the work is derivative, and (2) the source code includes prominent notice with
-these four paragraphs for those parts of this code that are retained.
-
-=============================================================================*/
-
-/*----------------------------------------------------------------------------
-| The macro `FLOATX80' must be defined to enable the extended double-precision
-| floating-point format `floatx80'. If this macro is not defined, the
-| `floatx80' type will not be defined, and none of the functions that either
-| input or output the `floatx80' type will be defined. The same applies to
-| the `FLOAT128' macro and the quadruple-precision format `float128'.
-*----------------------------------------------------------------------------*/
-#define FLOATX80
-#define FLOAT128
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE floating-point types.
-*----------------------------------------------------------------------------*/
-typedef bits32 float32;
-typedef bits64 float64;
-#ifdef FLOATX80
-typedef struct {
- bits16 high;
- bits64 low;
-} floatx80;
-#endif
-#ifdef FLOAT128
-typedef struct {
- bits64 high, low;
-} float128;
-#endif
-
-/*----------------------------------------------------------------------------
-| Primitive arithmetic functions, including multi-word arithmetic, and
-| division and square root approximations. (Can be specialized to target if
-| desired.)
-*----------------------------------------------------------------------------*/
-#include "softfloat-macros"
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE floating-point underflow tininess-detection mode.
-*----------------------------------------------------------------------------*/
-extern int8 float_detect_tininess;
-enum {
- float_tininess_after_rounding = 0,
- float_tininess_before_rounding = 1
-};
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE floating-point rounding mode.
-*----------------------------------------------------------------------------*/
-extern int8 float_rounding_mode;
-enum {
- float_round_nearest_even = 0,
- float_round_to_zero = 1,
- float_round_down = 2,
- float_round_up = 3
-};
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE floating-point exception flags.
-*----------------------------------------------------------------------------*/
-extern int8 float_exception_flags;
-enum {
- float_flag_invalid = 0x01, float_flag_denormal = 0x02, float_flag_divbyzero = 0x04, float_flag_overflow = 0x08,
- float_flag_underflow = 0x10, float_flag_inexact = 0x20
-};
-
-/*----------------------------------------------------------------------------
-| Routine to raise any or all of the software IEC/IEEE floating-point
-| exception flags.
-*----------------------------------------------------------------------------*/
-void float_raise( int8 );
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE integer-to-floating-point conversion routines.
-*----------------------------------------------------------------------------*/
-float32 int32_to_float32( int32 );
-float64 int32_to_float64( int32 );
-#ifdef FLOATX80
-floatx80 int32_to_floatx80( int32 );
-#endif
-#ifdef FLOAT128
-float128 int32_to_float128( int32 );
-#endif
-float32 int64_to_float32( int64 );
-float64 int64_to_float64( int64 );
-#ifdef FLOATX80
-floatx80 int64_to_floatx80( int64 );
-#endif
-#ifdef FLOAT128
-float128 int64_to_float128( int64 );
-#endif
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE single-precision conversion routines.
-*----------------------------------------------------------------------------*/
-int32 float32_to_int32( float32 );
-int32 float32_to_int32_round_to_zero( float32 );
-int64 float32_to_int64( float32 );
-int64 float32_to_int64_round_to_zero( float32 );
-float64 float32_to_float64( float32 );
-#ifdef FLOATX80
-floatx80 float32_to_floatx80( float32 );
-#endif
-#ifdef FLOAT128
-float128 float32_to_float128( float32 );
-#endif
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE single-precision operations.
-*----------------------------------------------------------------------------*/
-float32 float32_round_to_int( float32 );
-float32 float32_add( float32, float32 );
-float32 float32_sub( float32, float32 );
-float32 float32_mul( float32, float32 );
-float32 float32_div( float32, float32 );
-float32 float32_rem( float32, float32 );
-float32 float32_sqrt( float32 );
-flag float32_eq( float32, float32 );
-flag float32_le( float32, float32 );
-flag float32_lt( float32, float32 );
-flag float32_eq_signaling( float32, float32 );
-flag float32_le_quiet( float32, float32 );
-flag float32_lt_quiet( float32, float32 );
-flag float32_is_signaling_nan( float32 );
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE double-precision conversion routines.
-*----------------------------------------------------------------------------*/
-int32 float64_to_int32( float64 );
-int32 float64_to_int32_round_to_zero( float64 );
-int64 float64_to_int64( float64 );
-int64 float64_to_int64_round_to_zero( float64 );
-float32 float64_to_float32( float64 );
-#ifdef FLOATX80
-floatx80 float64_to_floatx80( float64 );
-#endif
-#ifdef FLOAT128
-float128 float64_to_float128( float64 );
-#endif
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE double-precision operations.
-*----------------------------------------------------------------------------*/
-float64 float64_round_to_int( float64 );
-float64 float64_add( float64, float64 );
-float64 float64_sub( float64, float64 );
-float64 float64_mul( float64, float64 );
-float64 float64_div( float64, float64 );
-float64 float64_rem( float64, float64 );
-float64 float64_sqrt( float64 );
-flag float64_eq( float64, float64 );
-flag float64_le( float64, float64 );
-flag float64_lt( float64, float64 );
-flag float64_eq_signaling( float64, float64 );
-flag float64_le_quiet( float64, float64 );
-flag float64_lt_quiet( float64, float64 );
-flag float64_is_signaling_nan( float64 );
-
-#ifdef FLOATX80
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE extended double-precision conversion routines.
-*----------------------------------------------------------------------------*/
-int32 floatx80_to_int32( floatx80 );
-int32 floatx80_to_int32_round_to_zero( floatx80 );
-int64 floatx80_to_int64( floatx80 );
-int64 floatx80_to_int64_round_to_zero( floatx80 );
-float32 floatx80_to_float32( floatx80 );
-float64 floatx80_to_float64( floatx80 );
-#ifdef FLOAT128
-float128 floatx80_to_float128( floatx80 );
-#endif
-floatx80 floatx80_scale(floatx80 a, floatx80 b);
-
-/*----------------------------------------------------------------------------
-| Packs the sign `zSign', exponent `zExp', and significand `zSig' into an
-| extended double-precision floating-point value, returning the result.
-*----------------------------------------------------------------------------*/
-
-INLINE floatx80 packFloatx80( flag zSign, int32 zExp, bits64 zSig )
-{
- floatx80 z;
-
- z.low = zSig;
- z.high = ( ( (bits16) zSign )<<15 ) + zExp;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE extended double-precision rounding precision. Valid
-| values are 32, 64, and 80.
-*----------------------------------------------------------------------------*/
-extern int8 floatx80_rounding_precision;
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE extended double-precision operations.
-*----------------------------------------------------------------------------*/
-floatx80 floatx80_round_to_int( floatx80 );
-floatx80 floatx80_add( floatx80, floatx80 );
-floatx80 floatx80_sub( floatx80, floatx80 );
-floatx80 floatx80_mul( floatx80, floatx80 );
-floatx80 floatx80_div( floatx80, floatx80 );
-floatx80 floatx80_rem( floatx80, floatx80 );
-floatx80 floatx80_sqrt( floatx80 );
-flag floatx80_eq( floatx80, floatx80 );
-flag floatx80_le( floatx80, floatx80 );
-flag floatx80_lt( floatx80, floatx80 );
-flag floatx80_eq_signaling( floatx80, floatx80 );
-flag floatx80_le_quiet( floatx80, floatx80 );
-flag floatx80_lt_quiet( floatx80, floatx80 );
-flag floatx80_is_signaling_nan( floatx80 );
-
-int floatx80_fsin(floatx80 &a);
-int floatx80_fcos(floatx80 &a);
-int floatx80_ftan(floatx80 &a);
-
-floatx80 floatx80_fpatan(floatx80 a, floatx80 b);
-floatx80 floatx80_fatan(floatx80 a);
-
-floatx80 floatx80_flognp1(floatx80 a);
-floatx80 floatx80_flogn(floatx80 a);
-floatx80 floatx80_flog2(floatx80 a);
-floatx80 floatx80_flog10(floatx80 a);
-
-// roundAndPackFloatx80 used to be in softfloat-round-pack, is now in softfloat.c
-floatx80 roundAndPackFloatx80(int8 roundingPrecision, flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1);
-
-#endif
-
-#ifdef FLOAT128
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE quadruple-precision conversion routines.
-*----------------------------------------------------------------------------*/
-int32 float128_to_int32( float128 );
-int32 float128_to_int32_round_to_zero( float128 );
-int64 float128_to_int64( float128 );
-int64 float128_to_int64_round_to_zero( float128 );
-float32 float128_to_float32( float128 );
-float64 float128_to_float64( float128 );
-#ifdef FLOATX80
-floatx80 float128_to_floatx80( float128 );
-#endif
-
-/*----------------------------------------------------------------------------
-| Software IEC/IEEE quadruple-precision operations.
-*----------------------------------------------------------------------------*/
-float128 float128_round_to_int( float128 );
-float128 float128_add( float128, float128 );
-float128 float128_sub( float128, float128 );
-float128 float128_mul( float128, float128 );
-float128 float128_div( float128, float128 );
-float128 float128_rem( float128, float128 );
-float128 float128_sqrt( float128 );
-flag float128_eq( float128, float128 );
-flag float128_le( float128, float128 );
-flag float128_lt( float128, float128 );
-flag float128_eq_signaling( float128, float128 );
-flag float128_le_quiet( float128, float128 );
-flag float128_lt_quiet( float128, float128 );
-flag float128_is_signaling_nan( float128 );
-
-/*----------------------------------------------------------------------------
-| Packs the sign `zSign', the exponent `zExp', and the significand formed
-| by the concatenation of `zSig0' and `zSig1' into a quadruple-precision
-| floating-point value, returning the result. After being shifted into the
-| proper positions, the three fields `zSign', `zExp', and `zSig0' are simply
-| added together to form the most significant 32 bits of the result. This
-| means that any integer portion of `zSig0' will be added into the exponent.
-| Since a properly normalized significand will have an integer portion equal
-| to 1, the `zExp' input should be 1 less than the desired result exponent
-| whenever `zSig0' and `zSig1' concatenated form a complete, normalized
-| significand.
-*----------------------------------------------------------------------------*/
-
-INLINE float128
- packFloat128( flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1 )
-{
- float128 z;
-
- z.low = zSig1;
- z.high = ( ( (bits64) zSign )<<63 ) + ( ( (bits64) zExp )<<48 ) + zSig0;
- return z;
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and extended significand formed by the concatenation of `zSig0', `zSig1',
-| and `zSig2', and returns the proper quadruple-precision floating-point value
-| corresponding to the abstract input. Ordinarily, the abstract value is
-| simply rounded and packed into the quadruple-precision format, with the
-| inexact exception raised if the abstract input cannot be represented
-| exactly. However, if the abstract value is too large, the overflow and
-| inexact exceptions are raised and an infinity or maximal finite value is
-| returned. If the abstract value is too small, the input value is rounded to
-| a subnormal number, and the underflow and inexact exceptions are raised if
-| the abstract input cannot be represented exactly as a subnormal quadruple-
-| precision floating-point number.
-| The input significand must be normalized or smaller. If the input
-| significand is not normalized, `zExp' must be 0; in that case, the result
-| returned is a subnormal number, and it must not require rounding. In the
-| usual case that the input significand is normalized, `zExp' must be 1 less
-| than the ``true'' floating-point exponent. The handling of underflow and
-| overflow follows the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-INLINE float128
- roundAndPackFloat128(
- flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1, bits64 zSig2 )
-{
- int8 roundingMode;
- flag roundNearestEven, increment, isTiny;
-
- roundingMode = float_rounding_mode;
- roundNearestEven = ( roundingMode == float_round_nearest_even );
- increment = ( (sbits64) zSig2 < 0 );
- if ( ! roundNearestEven ) {
- if ( roundingMode == float_round_to_zero ) {
- increment = 0;
- }
- else {
- if ( zSign ) {
- increment = ( roundingMode == float_round_down ) && zSig2;
- }
- else {
- increment = ( roundingMode == float_round_up ) && zSig2;
- }
- }
- }
- if ( 0x7FFD <= (bits32) zExp ) {
- if ( ( 0x7FFD < zExp )
- || ( ( zExp == 0x7FFD )
- && eq128(
- LIT64( 0x0001FFFFFFFFFFFF ),
- LIT64( 0xFFFFFFFFFFFFFFFF ),
- zSig0,
- zSig1
- )
- && increment
- )
- ) {
- float_raise( float_flag_overflow | float_flag_inexact );
- if ( ( roundingMode == float_round_to_zero )
- || ( zSign && ( roundingMode == float_round_up ) )
- || ( ! zSign && ( roundingMode == float_round_down ) )
- ) {
- return
- packFloat128(
- zSign,
- 0x7FFE,
- LIT64( 0x0000FFFFFFFFFFFF ),
- LIT64( 0xFFFFFFFFFFFFFFFF )
- );
- }
- return packFloat128( zSign, 0x7FFF, 0, 0 );
- }
- if ( zExp < 0 ) {
- isTiny =
- ( float_detect_tininess == float_tininess_before_rounding )
- || ( zExp < -1 )
- || ! increment
- || lt128(
- zSig0,
- zSig1,
- LIT64( 0x0001FFFFFFFFFFFF ),
- LIT64( 0xFFFFFFFFFFFFFFFF )
- );
- shift128ExtraRightJamming(
- zSig0, zSig1, zSig2, - zExp, &zSig0, &zSig1, &zSig2 );
- zExp = 0;
- if ( isTiny && zSig2 ) float_raise( float_flag_underflow );
- if ( roundNearestEven ) {
- increment = ( (sbits64) zSig2 < 0 );
- }
- else {
- if ( zSign ) {
- increment = ( roundingMode == float_round_down ) && zSig2;
- }
- else {
- increment = ( roundingMode == float_round_up ) && zSig2;
- }
- }
- }
- }
- if ( zSig2 ) float_exception_flags |= float_flag_inexact;
- if ( increment ) {
- add128( zSig0, zSig1, 0, 1, &zSig0, &zSig1 );
- zSig1 &= ~ ( ( zSig2 + zSig2 == 0 ) & roundNearestEven );
- }
- else {
- if ( ( zSig0 | zSig1 ) == 0 ) zExp = 0;
- }
- return packFloat128( zSign, zExp, zSig0, zSig1 );
-
-}
-
-/*----------------------------------------------------------------------------
-| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
-| and significand formed by the concatenation of `zSig0' and `zSig1', and
-| returns the proper quadruple-precision floating-point value corresponding
-| to the abstract input. This routine is just like `roundAndPackFloat128'
-| except that the input significand has fewer bits and does not have to be
-| normalized. In all cases, `zExp' must be 1 less than the ``true'' floating-
-| point exponent.
-*----------------------------------------------------------------------------*/
-
-INLINE float128
- normalizeRoundAndPackFloat128(
- flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1 )
-{
- int8 shiftCount;
- bits64 zSig2;
-
- if ( zSig0 == 0 ) {
- zSig0 = zSig1;
- zSig1 = 0;
- zExp -= 64;
- }
- shiftCount = countLeadingZeros64( zSig0 ) - 15;
- if ( 0 <= shiftCount ) {
- zSig2 = 0;
- shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 );
- }
- else {
- shift128ExtraRightJamming(
- zSig0, zSig1, 0, - shiftCount, &zSig0, &zSig1, &zSig2 );
- }
- zExp -= shiftCount;
- return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 );
-
-}
-#endif
diff --git a/3rdparty/softfloat3/bochs_ext/f2xm1.c b/3rdparty/softfloat3/bochs_ext/f2xm1.c
index a8201937660..bc8544edd63 100644
--- a/3rdparty/softfloat3/bochs_ext/f2xm1.c
+++ b/3rdparty/softfloat3/bochs_ext/f2xm1.c
@@ -25,27 +25,40 @@ these four paragraphs for those parts of this code that are retained.
#define FLOAT128
+#include "../build/MAME/platform.h"
+
#include "../source/include/softfloat.h"
#include "../source/include/internals.h"
#include "softfloat-extra.h"
#include "softfloat-helpers.h"
#include "softfloat-specialize.h"
+static const extFloat80_t floatx80_posone = packFloatx80(0, 0x3fff, uint64_t(0x8000000000000000));
static const extFloat80_t floatx80_negone = packFloatx80(1, 0x3fff, uint64_t(0x8000000000000000));
static const extFloat80_t floatx80_neghalf = packFloatx80(1, 0x3ffe, uint64_t(0x8000000000000000));
+static const float128_t float128_e =
+ packFloat128(uint64_t(0x40005BF0A8B14576), uint64_t(0x95355FB8AC404E7A));
static const float128_t float128_ln2 =
packFloat128(uint64_t(0x3ffe62e42fefa39e), uint64_t(0xf35793c7673007e6));
+static const float128_t float128_ln10 =
+ packFloat128(uint64_t(0x400026bb1bbb5551), uint64_t(0x582dd4adac5705a6));
#ifdef BETTER_THAN_PENTIUM
#define LN2_SIG_HI uint64_t(0xb17217f7d1cf79ab)
#define LN2_SIG_LO uint64_t(0xc9e3b39800000000) /* 96 bit precision */
+#define LN10_SIG_HI uint64_t(0xae585ba95bb0a2aa)
+#define LN10_SIG_LO uint64_t(0x763776d400000000) /* 96 bit precision */
+
#else
#define LN2_SIG_HI uint64_t(0xb17217f7d1cf79ab)
#define LN2_SIG_LO uint64_t(0xc000000000000000) /* 67-bit precision */
+#define LN10_SIG_HI uint64_t(0xae585ba95bb0a2aa)
+#define LN10_SIG_LO uint64_t(0x7000000000000000) /* 67-bit precision */
+
#endif
#define EXP_ARR_SIZE 15
@@ -75,25 +88,25 @@ extern float128_t EvalPoly(float128_t x, const float128_t *arr, int n);
static float128_t poly_exp(float128_t x)
{
/*
- // 2 3 4 5 6 7 8 9
- // x x x x x x x x x
- // e - 1 ~ x + --- + --- + --- + --- + --- + --- + --- + --- + ...
- // 2! 3! 4! 5! 6! 7! 8! 9!
- //
- // 2 3 4 5 6 7 8
- // x x x x x x x x
- // = x [ 1 + --- + --- + --- + --- + --- + --- + --- + --- + ... ]
- // 2! 3! 4! 5! 6! 7! 8! 9!
- //
- // 8 8
- // -- 2k -- 2k+1
- // p(x) = > C * x q(x) = > C * x
- // -- 2k -- 2k+1
- // k=0 k=0
- //
- // x
- // e - 1 ~ x * [ p(x) + x * q(x) ]
- //
+ 2 3 4 5 6 7 8 9
+ x x x x x x x x x
+ e - 1 ~ x + --- + --- + --- + --- + --- + --- + --- + --- + ...
+ 2! 3! 4! 5! 6! 7! 8! 9!
+
+ 2 3 4 5 6 7 8
+ x x x x x x x x
+ = x [ 1 + --- + --- + --- + --- + --- + --- + --- + --- + ... ]
+ 2! 3! 4! 5! 6! 7! 8! 9!
+
+ 8 8
+ -- 2k -- 2k+1
+ p(x) = > C * x q(x) = > C * x
+ -- 2k -- 2k+1
+ k=0 k=0
+
+ x
+ e - 1 ~ x * [ p(x) + x * q(x) ]
+
*/
float128_t t = EvalPoly(x, (const float128_t*) exp_arr, EXP_ARR_SIZE);
return f128_mul(t, x);
@@ -184,3 +197,295 @@ extFloat80_t extFloat80_2xm1(extFloat80_t a)
return a;
}
}
+
+// =================================================
+// x
+// Compute e
+// =================================================
+
+//
+// Uses the following identities:
+//
+// 1. ----------------------------------------------------------
+// 2 3 4 5 n
+// x x x x x x x
+// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
+// 1! 2! 3! 4! 5! n!
+//
+extFloat80_t extFloat80_etox(extFloat80_t a)
+{
+ uint64_t zSig0, zSig1, zSig2;
+ struct exp32_sig64 normExpSig;
+
+ // handle unsupported extended double-precision floating encodings
+ if (extF80_isUnsupported(a)) {
+ softfloat_exceptionFlags |= softfloat_flag_invalid;
+ return floatx80_default_nan;
+ }
+
+ uint64_t aSig = extF80_fraction(a);
+ int32_t aExp = extF80_exp(a);
+ int aSign = extF80_sign(a);
+
+ if (aExp == 0x7FFF) {
+ if (aSig << 1) {
+ const uint128 nan = softfloat_propagateNaNExtF80UI(a.signExp, aSig, 0, 0);
+ extFloat80_t rv;
+ rv.signExp = nan.v64;
+ rv.signif = nan.v0;
+ return rv;
+ }
+
+ return (aSign) ? floatx80_negone : a;
+ }
+
+ if (! aExp) {
+ if (! aSig) return a;
+ softfloat_exceptionFlags |= softfloat_flag_inexact; // denormal also
+ normExpSig = softfloat_normSubnormalExtF80Sig(aSig);
+ aExp = normExpSig.exp + 1;
+ aSig = normExpSig.sig;
+
+ mul128By64To192(0x1000000000000000, 0, aSig, &zSig0, &zSig1, &zSig2);
+ if (0 < (int64_t) zSig0) {
+ shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
+ --aExp;
+ }
+ return softfloat_roundPackToExtF80(aSign, aExp, zSig0, zSig1, 80);
+ }
+
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
+
+ const extFloat80_t base = f128_to_extF80(float128_e);
+ extFloat80_t val = floatx80_posone;
+ float128_t x;
+
+ while (!(extF80_lt(a, floatx80_posone))) {
+ val = extF80_mul(val, base);
+
+ if (extF80_exp(val) == 0x7FFF) { // inf
+ goto ret;
+ }
+
+ a = extF80_sub(a, floatx80_posone);
+ }
+
+ while (extF80_le(a, floatx80_negone)) {
+ val = extF80_div(val, base);
+
+ if (!extF80_exp(val)) { // subnormal
+ goto ret;
+ }
+
+ a = extF80_add(a, floatx80_posone);
+ }
+
+ret:
+ /* ******************************** */
+ /* using float128 for approximation */
+ /* ******************************** */
+ x = extF80_to_f128(a);
+ x = poly_exp(x);
+
+ val = extF80_mul(val, extF80_add(f128_to_extF80(x), floatx80_posone));
+
+ return val;
+}
+
+// =================================================
+// x
+// Compute 2
+// =================================================
+
+//
+// Uses the following identities:
+//
+// 1. ----------------------------------------------------------
+// x x*ln(2)
+// 2 = e
+//
+// 2. ----------------------------------------------------------
+// 2 3 4 5 n
+// x x x x x x x
+// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
+// 1! 2! 3! 4! 5! n!
+//
+extFloat80_t extFloat80_2tox(extFloat80_t a)
+{
+ uint64_t zSig0, zSig1, zSig2;
+ struct exp32_sig64 normExpSig;
+
+ // handle unsupported extended double-precision floating encodings
+ if (extF80_isUnsupported(a)) {
+ softfloat_exceptionFlags |= softfloat_flag_invalid;
+ return floatx80_default_nan;
+ }
+
+ uint64_t aSig = extF80_fraction(a);
+ int32_t aExp = extF80_exp(a);
+ int aSign = extF80_sign(a);
+
+ if (aExp == 0x7FFF) { // inf or NaN
+ if (aSig << 1) { // NaN
+ const uint128 nan = softfloat_propagateNaNExtF80UI(a.signExp, aSig, 0, 0);
+ extFloat80_t rv;
+ rv.signExp = nan.v64;
+ rv.signif = nan.v0;
+ return rv;
+ }
+
+ return (aSign) ? floatx80_negone : a; // -inf or +inf
+ }
+
+ if (! aExp) { // subnormal
+ if (! aSig) return a;
+ softfloat_exceptionFlags |= softfloat_flag_inexact; // denormal also
+ normExpSig = softfloat_normSubnormalExtF80Sig(aSig);
+ aExp = normExpSig.exp + 1;
+ aSig = normExpSig.sig;
+
+ mul128By64To192(LN2_SIG_HI, LN2_SIG_LO, aSig, &zSig0, &zSig1, &zSig2);
+ if (0 < (int64_t) zSig0) {
+ shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
+ --aExp;
+ }
+ return softfloat_roundPackToExtF80(aSign, aExp, zSig0, zSig1, 80);
+ }
+
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
+
+ const extFloat80_t base = i32_to_extF80(2);
+ extFloat80_t val = floatx80_posone;
+ float128_t x;
+
+ while (!(extF80_lt(a, floatx80_posone))) {
+ val = extF80_mul(val, base);
+
+ if (extF80_exp(val) == 0x7FFF) { // inf
+ goto ret;
+ }
+
+ a = extF80_sub(a, floatx80_posone);
+ }
+
+ while (extF80_le(a, floatx80_negone)) {
+ val = extF80_div(val, base);
+
+ if (!extF80_exp(val)) { // subnormal
+ goto ret;
+ }
+
+ a = extF80_add(a, floatx80_posone);
+ }
+
+ret:
+ /* ******************************** */
+ /* using float128 for approximation */
+ /* ******************************** */
+ x = extF80_to_f128(a);
+ x = f128_mul(x, float128_ln2);
+ x = poly_exp(x);
+
+ val = extF80_mul(val, extF80_add(f128_to_extF80(x), floatx80_posone));
+
+ return val;
+}
+
+// =================================================
+// x
+// Compute 10
+// =================================================
+
+//
+// Uses the following identities:
+//
+// 1. ----------------------------------------------------------
+// x x*ln(10)
+// 2 = e
+//
+// 2. ----------------------------------------------------------
+// 2 3 4 5 n
+// x x x x x x x
+// e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
+// 1! 2! 3! 4! 5! n!
+//
+extFloat80_t extFloat80_10tox(extFloat80_t a)
+{
+ uint64_t zSig0, zSig1, zSig2;
+ struct exp32_sig64 normExpSig;
+
+ // handle unsupported extended double-precision floating encodings
+ if (extF80_isUnsupported(a)) {
+ softfloat_exceptionFlags |= softfloat_flag_invalid;
+ return floatx80_default_nan;
+ }
+
+ uint64_t aSig = extF80_fraction(a);
+ int32_t aExp = extF80_exp(a);
+ int aSign = extF80_sign(a);
+
+ if (aExp == 0x7FFF) {
+ if (aSig << 1) {
+ const uint128 nan = softfloat_propagateNaNExtF80UI(a.signExp, aSig, 0, 0);
+ extFloat80_t rv;
+ rv.signExp = nan.v64;
+ rv.signif = nan.v0;
+ return rv;
+ }
+
+ return (aSign) ? floatx80_negone : a;
+ }
+
+ if (! aExp) {
+ if (! aSig) return a;
+ softfloat_exceptionFlags |= softfloat_flag_inexact; // denormal also
+ normExpSig = softfloat_normSubnormalExtF80Sig(aSig);
+ aExp = normExpSig.exp + 1;
+ aSig = normExpSig.sig;
+
+ mul128By64To192(LN10_SIG_HI, LN10_SIG_LO, aSig, &zSig0, &zSig1, &zSig2);
+ if (0 < (int64_t) zSig0) {
+ shortShift128Left(zSig0, zSig1, 1, &zSig0, &zSig1);
+ --aExp;
+ }
+ return softfloat_roundPackToExtF80(aSign, aExp, zSig0, zSig1, 80);
+ }
+
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
+
+ const extFloat80_t base = i32_to_extF80(10);
+ extFloat80_t val = floatx80_posone;
+ float128_t x;
+
+ while (!(extF80_lt(a, floatx80_posone))) {
+ val = extF80_mul(val, base);
+
+ if (extF80_exp(val) == 0x7FFF) { // inf
+ goto ret;
+ }
+
+ a = extF80_sub(a, floatx80_posone);
+ }
+
+ while (extF80_le(a, floatx80_negone)) {
+ val = extF80_div(val, base);
+
+ if (!extF80_exp(val)) { // subnormal
+ goto ret;
+ }
+
+ a = extF80_add(a, floatx80_posone);
+ }
+
+ret:
+ /* ******************************** */
+ /* using float128 for approximation */
+ /* ******************************** */
+ x = extF80_to_f128(a);
+ x = f128_mul(x, float128_ln10);
+ x = poly_exp(x);
+
+ val = extF80_mul(val, extF80_add(f128_to_extF80(x), floatx80_posone));
+
+ return val;
+}
diff --git a/3rdparty/softfloat3/bochs_ext/isNaN.c b/3rdparty/softfloat3/bochs_ext/isNaN.c
new file mode 100644
index 00000000000..248d6efda36
--- /dev/null
+++ b/3rdparty/softfloat3/bochs_ext/isNaN.c
@@ -0,0 +1,69 @@
+/*============================================================================
+
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
+Package, Release 3e, by John R. Hauser.
+
+Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
+California. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions, and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. Neither the name of the University nor the names of its contributors may
+ be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+=============================================================================*/
+
+#include <stdbool.h>
+
+#include "../source/include/softfloat.h"
+#include "../source/include/internals.h"
+#include "../source/8086/specialize.h"
+
+bool f16_isNaN(float16_t a)
+{
+ return isNaNF16UI(a.v);
+}
+
+bool f32_isNaN(float32_t a)
+{
+ return isNaNF32UI(a.v);
+}
+
+bool f64_isNaN(float64_t a)
+{
+ return isNaNF64UI(a.v);
+}
+
+bool extF80_isNaN(extFloat80_t a)
+{
+ return isNaNExtF80UI(a.signExp, a.signif);
+}
+
+bool f128_isNaN(float128_t a)
+{
+ union ui128_f128 u;
+
+ u.f = a;
+
+ return isNaNF128UI(u.ui.v64, u.ui.v0);
+}
diff --git a/3rdparty/softfloat3/bochs_ext/softfloat3_ext.h b/3rdparty/softfloat3/bochs_ext/softfloat3_ext.h
index a12675901bc..f6be9418169 100644
--- a/3rdparty/softfloat3/bochs_ext/softfloat3_ext.h
+++ b/3rdparty/softfloat3/bochs_ext/softfloat3_ext.h
@@ -11,8 +11,16 @@ extFloat80_t extFloat80_getman(extFloat80_t a);
extFloat80_t extFloat80_fyl2x(extFloat80_t a, extFloat80_t b);
extFloat80_t extFloat80_fyl2xp1(extFloat80_t a, extFloat80_t b);
extFloat80_t extFloat80_2xm1(extFloat80_t a);
+extFloat80_t extFloat80_etox(extFloat80_t a);
+extFloat80_t extFloat80_2tox(extFloat80_t a);
+extFloat80_t extFloat80_10tox(extFloat80_t a);
extFloat80_t extFloat80_lognp1(extFloat80_t a);
extFloat80_t extFloat80_logn(extFloat80_t a);
extFloat80_t extFloat80_log2(extFloat80_t a);
extFloat80_t extFloat80_log10(extFloat80_t a);
extFloat80_t extFloat80_scale(extFloat80_t a, extFloat80_t b);
+bool f16_isNaN(float16_t a);
+bool f32_isNaN(float32_t a);
+bool f64_isNaN(float64_t a);
+bool extF80_isNaN(extFloat80_t a);
+bool f128_isNaN(float128_t a);
diff --git a/3rdparty/softfloat3/build/MAME/platform.h b/3rdparty/softfloat3/build/MAME/platform.h
index 6fd29db58fd..f49392880ce 100644
--- a/3rdparty/softfloat3/build/MAME/platform.h
+++ b/3rdparty/softfloat3/build/MAME/platform.h
@@ -56,6 +56,7 @@ Softfloat 3 MAME modifications
#include <intrin.h>
// MSVC has __lzcnt16 as well, but opts-GCC.h expects __lzcnt for uint16_t and uint32_t
+// FIXME: this requires the ABM instruction set extension and shouldn't be enabled if it isn't available
#if defined(_M_IX86) || defined(_M_AMD64)
#define __builtin_clz __lzcnt
#endif // defined(_M_IX86) || defined(_M_AMD64)
@@ -64,14 +65,14 @@ Softfloat 3 MAME modifications
#define __builtin_clzll __lzcnt64
#endif // defined(_M_AMD64)
-#else // defined(_MSC_VER)
+#else // defined(_MSC_VER) && !defined(__clang__))
-// true for GCC and Clang on Intel and ARM, and MSVC on Intel.
#define SOFTFLOAT_BUILTIN_CLZ 1
-#if defined(PTR64)
+
+#if defined(__SIZEOF_INT128__)
#define SOFTFLOAT_INTRINSIC_INT128 1
-#endif // defined(PTR64)
+#endif // defined(__SIZEOF_INT128__)
-#endif // defined(_MSC_VER)
+#endif // defined(_MSC_VER) && !defined(__clang__)
#include "../../source/include/opts-GCC.h"
diff --git a/3rdparty/sol2/sol/sol.hpp b/3rdparty/sol2/sol/sol.hpp
index 1a9375d996d..04fd7e4958d 100644
--- a/3rdparty/sol2/sol/sol.hpp
+++ b/3rdparty/sol2/sol/sol.hpp
@@ -6747,12 +6747,9 @@ namespace sol {
/// one.
///
/// \group emplace
- template <class... Args>
- T& emplace(Args&&... args) noexcept {
- static_assert(std::is_constructible<T, Args&&...>::value, "T must be constructible with Args");
-
- *this = nullopt;
- this->construct(std::forward<Args>(args)...);
+ T& emplace(T& arg) noexcept {
+ m_value = &arg;
+ return **this;
}
/// Swaps this optional with the other.
diff --git a/3rdparty/ymfm/buildall.cpp b/3rdparty/ymfm/examples/buildall/buildall.cpp
index 40bd75e2864..40bd75e2864 100644
--- a/3rdparty/ymfm/buildall.cpp
+++ b/3rdparty/ymfm/examples/buildall/buildall.cpp
diff --git a/3rdparty/ymfm/src/ymfm.h b/3rdparty/ymfm/src/ymfm.h
index 47ff90072cc..18a3f94211c 100644
--- a/3rdparty/ymfm/src/ymfm.h
+++ b/3rdparty/ymfm/src/ymfm.h
@@ -42,6 +42,7 @@
#include <cstdio>
#include <cstring>
#include <algorithm>
+#include <array>
#include <memory>
#include <string>
#include <vector>
@@ -110,17 +111,6 @@ inline int32_t clamp(int32_t value, int32_t minval, int32_t maxval)
//-------------------------------------------------
-// array_size - return the size of an array
-//-------------------------------------------------
-
-template<typename ArrayType, int ArraySize>
-constexpr uint32_t array_size(ArrayType (&array)[ArraySize])
-{
- return ArraySize;
-}
-
-
-//-------------------------------------------------
// count_leading_zeros - return the number of
// leading zeros in a 32-bit value; CPU-optimized
// versions for various architectures are included
@@ -254,7 +244,8 @@ inline int16_t roundtrip_fp(int32_t value)
// apply the shift back and forth to zero out bits that are lost
exponent -= 1;
- return (value >> exponent) << exponent;
+ int32_t mask = (1 << exponent) - 1;
+ return value & ~mask;
}
@@ -350,24 +341,29 @@ public:
{
// create file
char name[20];
- sprintf(name, "wavlog-%02d.wav", m_index);
+ snprintf(&name[0], sizeof(name), "wavlog-%02d.wav", m_index);
FILE *out = fopen(name, "wb");
// make the wav file header
uint8_t header[44];
memcpy(&header[0], "RIFF", 4);
- *(uint32_t *)&header[4] = m_buffer.size() * 2 + 44 - 8;
+ put_u32(&header[4], m_buffer.size() * 2 + 44 - 8);
memcpy(&header[8], "WAVE", 4);
memcpy(&header[12], "fmt ", 4);
- *(uint32_t *)&header[16] = 16;
- *(uint16_t *)&header[20] = 1;
- *(uint16_t *)&header[22] = Channels;
- *(uint32_t *)&header[24] = m_samplerate;
- *(uint32_t *)&header[28] = m_samplerate * 2 * Channels;
- *(uint16_t *)&header[32] = 2 * Channels;
- *(uint16_t *)&header[34] = 16;
+ put_u32(&header[16], 16);
+ put_u16(&header[20], 1);
+ put_u16(&header[22], Channels);
+ put_u32(&header[24], m_samplerate);
+ put_u32(&header[28], m_samplerate * 2 * Channels);
+ put_u16(&header[32], 2 * Channels);
+ put_u16(&header[34], 16);
memcpy(&header[36], "data", 4);
- *(uint32_t *)&header[40] = m_buffer.size() * 2 + 44 - 44;
+ put_u32(&header[40], m_buffer.size() * 2 + 44 - 44);
+
+#if (defined(__BYTE_ORDER__) && ((defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) || (__BYTE_ORDER__ == 4321))) || (!defined(__BYTE_ORDER__) && !defined(__LITTLE_ENDIAN__))
+ for (int16_t &sample : m_buffer)
+ sample = int16_t(uint16_t((uint16_t(sample) >> 8) | (uint16_t(sample) << 8)));
+#endif
// write header then data
fwrite(&header[0], 1, sizeof(header), out);
@@ -399,6 +395,20 @@ public:
}
private:
+ static void put_u32(uint8_t *buffer, uint32_t value)
+ {
+ buffer[0] = uint8_t((value >> 0) & 0x00ff);
+ buffer[1] = uint8_t((value >> 8) & 0x00ff);
+ buffer[2] = uint8_t((value >> 16) & 0x00ff);
+ buffer[3] = uint8_t((value >> 24) & 0x00ff);
+ }
+
+ static void put_u16(uint8_t *buffer, uint16_t value)
+ {
+ buffer[0] = uint8_t((value >> 0) & 0x00ff);
+ buffer[1] = uint8_t((value >> 8) & 0x00ff);
+ }
+
// internal state
uint32_t m_index;
uint32_t m_samplerate;
@@ -483,6 +493,8 @@ public:
class ymfm_engine_callbacks
{
public:
+ virtual ~ymfm_engine_callbacks() = default;
+
// timer callback; called by the interface when a timer fires
virtual void engine_timer_expired(uint32_t tnum) = 0;
@@ -504,6 +516,8 @@ class ymfm_interface
template<typename RegisterType> friend class fm_engine_base;
public:
+ virtual ~ymfm_interface() = default;
+
// the following functions must be implemented by any derived classes; the
// default implementations are sufficient for some minimal operation, but will
// likely need to be overridden to integrate with the outside world; they are
diff --git a/3rdparty/ymfm/src/ymfm_adpcm.cpp b/3rdparty/ymfm/src/ymfm_adpcm.cpp
index 4bc22beb2b0..0917e7c361a 100644
--- a/3rdparty/ymfm/src/ymfm_adpcm.cpp
+++ b/3rdparty/ymfm/src/ymfm_adpcm.cpp
@@ -390,13 +390,13 @@ void adpcm_b_registers::save_restore(ymfm_saved_state &state)
adpcm_b_channel::adpcm_b_channel(adpcm_b_engine &owner, uint32_t addrshift) :
m_address_shift(addrshift),
m_status(STATUS_BRDY),
- m_curnibble(0),
- m_curbyte(0),
- m_dummy_read(0),
+ m_buffer(0),
+ m_nibbles(0),
m_position(0),
m_curaddress(0),
m_accumulator(0),
- m_prev_accum(0),
+ m_output(0),
+ m_prev_output(0),
m_adpcm_step(STEP_MIN),
m_regs(owner.regs()),
m_owner(owner)
@@ -411,13 +411,13 @@ adpcm_b_channel::adpcm_b_channel(adpcm_b_engine &owner, uint32_t addrshift) :
void adpcm_b_channel::reset()
{
m_status = STATUS_BRDY;
- m_curnibble = 0;
- m_curbyte = 0;
- m_dummy_read = 0;
+ m_buffer = 0;
+ m_nibbles = 0;
m_position = 0;
m_curaddress = 0;
m_accumulator = 0;
- m_prev_accum = 0;
+ m_output = 0;
+ m_prev_output = 0;
m_adpcm_step = STEP_MIN;
}
@@ -429,13 +429,13 @@ void adpcm_b_channel::reset()
void adpcm_b_channel::save_restore(ymfm_saved_state &state)
{
state.save_restore(m_status);
- state.save_restore(m_curnibble);
- state.save_restore(m_curbyte);
- state.save_restore(m_dummy_read);
+ state.save_restore(m_buffer);
+ state.save_restore(m_nibbles);
state.save_restore(m_position);
state.save_restore(m_curaddress);
state.save_restore(m_accumulator);
- state.save_restore(m_prev_accum);
+ state.save_restore(m_output);
+ state.save_restore(m_prev_output);
state.save_restore(m_adpcm_step);
}
@@ -447,9 +447,11 @@ void adpcm_b_channel::save_restore(ymfm_saved_state &state)
void adpcm_b_channel::clock()
{
// only process if active and not recording (which we don't support)
- if (!m_regs.execute() || m_regs.record() || (m_status & STATUS_PLAYING) == 0)
+ if (!m_regs.execute() || m_regs.record() || (m_status & STATUS_INTERNAL_PLAYING) == 0)
{
- m_status &= ~STATUS_PLAYING;
+ m_prev_output = m_output;
+ m_position = 0;
+ set_reset_status(0, STATUS_INTERNAL_PLAYING);
return;
}
@@ -459,76 +461,63 @@ void adpcm_b_channel::clock()
if (position < 0x10000)
return;
- // if we're about to process nibble 0, fetch sample
- if (m_curnibble == 0)
+ // if we have nibbles available, process them
+ if (m_nibbles != 0)
{
- // playing from RAM/ROM
- if (m_regs.external())
- m_curbyte = m_owner.intf().ymfm_external_read(ACCESS_ADPCM_B, m_curaddress);
- }
+ // fetch the next nibble
+ uint8_t data = consume_nibbles(1);
- // extract the nibble from our current byte
- uint8_t data = uint8_t(m_curbyte << (4 * m_curnibble)) >> 4;
- m_curnibble ^= 1;
+ // forecast to next forecast: 1/8, 3/8, 5/8, 7/8, 9/8, 11/8, 13/8, 15/8
+ int32_t delta = (2 * bitfield(data, 0, 3) + 1) * m_adpcm_step / 8;
+ if (bitfield(data, 3))
+ delta = -delta;
- // we just processed the last nibble
- if (m_curnibble == 0)
- {
- // if playing from RAM/ROM, check the end/limit address or advance
- if (m_regs.external())
- {
- // handle the sample end, either repeating or stopping
- if (at_end())
- {
- // if repeating, go back to the start
- if (m_regs.repeat())
- load_start();
-
- // otherwise, done; set the EOS bit
- else
- {
- m_accumulator = 0;
- m_prev_accum = 0;
- m_status = (m_status & ~STATUS_PLAYING) | STATUS_EOS;
- debug::log_keyon("%s\n", "ADPCM EOS");
- return;
- }
- }
+ // add and clamp to 16 bits
+ m_accumulator = clamp(m_accumulator + delta, -32768, 32767);
- // wrap at the limit address
- else if (at_limit())
- m_curaddress = 0;
+ // scale the ADPCM step: 0.9, 0.9, 0.9, 0.9, 1.2, 1.6, 2.0, 2.4
+ static uint8_t const s_step_scale[8] = { 57, 57, 57, 57, 77, 102, 128, 153 };
+ m_adpcm_step = clamp((m_adpcm_step * s_step_scale[bitfield(data, 0, 3)]) / 64, STEP_MIN, STEP_MAX);
- // otherwise, advance the current address
- else
- {
- m_curaddress++;
- m_curaddress &= 0xffffff;
- }
- }
+ // make the new output equal to the accumulator
+ m_prev_output = m_output;
+ m_output = m_accumulator;
- // if CPU-driven, copy the next byte and request more
- else
+ // if we've drained all the nibbles, that means we're at a repeat point or end of sample
+ if (m_nibbles == 0)
{
- m_curbyte = m_regs.cpudata();
- m_status |= STATUS_BRDY;
+ // reset the ADPCM state (but leave output alone)
+ m_accumulator = 0;
+ m_adpcm_step = STEP_MIN;
+
+ // always set EOS bit, even if repeating
+ set_reset_status(STATUS_EOS);
+ debug::log_keyon("%s\n", "ADPCM EOS");
+
+ // clear playing flag if we're not repeating
+ if (!m_regs.repeat())
+ set_reset_status(0, STATUS_INTERNAL_PLAYING);
}
}
- // remember previous value for interpolation
- m_prev_accum = m_accumulator;
-
- // forecast to next forecast: 1/8, 3/8, 5/8, 7/8, 9/8, 11/8, 13/8, 15/8
- int32_t delta = (2 * bitfield(data, 0, 3) + 1) * m_adpcm_step / 8;
- if (bitfield(data, 3))
- delta = -delta;
+ // if we don't have at least 3 nibbles in the buffer, request more data
+ if ((m_status & STATUS_INTERNAL_PLAYING) != 0 && m_nibbles < 3)
+ {
+ // if we hit the end address after this fetch, handle looping/ending
+ if (request_data())
+ {
+ // the final 3 samples are not played; chop them from the stream
+ consume_nibbles(3);
- // add and clamp to 16 bits
- m_accumulator = clamp(m_accumulator + delta, -32768, 32767);
+ // this should always end up as 1; the logic above assumes we will hit
+ // 0 nibbles after processing the next one
+ assert(m_nibbles == 1);
- // scale the ADPCM step: 0.9, 0.9, 0.9, 0.9, 1.2, 1.6, 2.0, 2.4
- static uint8_t const s_step_scale[8] = { 57, 57, 57, 57, 77, 102, 128, 153 };
- m_adpcm_step = clamp((m_adpcm_step * s_step_scale[bitfield(data, 0, 3)]) / 64, STEP_MIN, STEP_MAX);
+ // if repeating, set the current address back to start for next fetch
+ if (m_regs.repeat())
+ latch_addresses();
+ }
+ }
}
@@ -545,7 +534,7 @@ void adpcm_b_channel::output(ymfm_output<NumOutputs> &output, uint32_t rshift) c
return;
// do a linear interpolation between samples
- int32_t result = (m_prev_accum * int32_t((m_position ^ 0xffff) + 1) + m_accumulator * int32_t(m_position)) >> 16;
+ int32_t result = (m_prev_output * int32_t((m_position ^ 0xffff) + 1) + m_output * int32_t(m_position)) >> 16;
// apply volume (level) in a linear fashion and reduce
result = (result * int32_t(m_regs.level())) >> (8 + rshift);
@@ -568,37 +557,8 @@ uint8_t adpcm_b_channel::read(uint32_t regnum)
// register 8 reads over the bus under some conditions
if (regnum == 0x08 && !m_regs.execute() && !m_regs.record() && m_regs.external())
- {
- // two dummy reads are consumed first
- if (m_dummy_read != 0)
- {
- load_start();
- m_dummy_read--;
- }
-
- // read the data
- else
- {
- // read from outside of the chip
- result = m_owner.intf().ymfm_external_read(ACCESS_ADPCM_B, m_curaddress++);
+ result = read_ram();
- // did we hit the end? if so, signal EOS
- if (at_end())
- {
- m_status = STATUS_EOS | STATUS_BRDY;
- debug::log_keyon("%s\n", "ADPCM EOS");
- }
- else
- {
- // signal ready
- m_status = STATUS_BRDY;
- }
-
- // wrap at the limit address
- if (at_limit())
- m_curaddress = 0;
- }
- }
return result;
}
@@ -613,68 +573,76 @@ void adpcm_b_channel::write(uint32_t regnum, uint8_t value)
// dummy read counter
if (regnum == 0x00)
{
- if (m_regs.execute())
+ // reset flag stops playback and holds output, but does not clear the
+ // externally-visible playing flag
+ if (m_regs.resetflag())
+ set_reset_status(STATUS_BRDY | (((m_status & STATUS_INTERNAL_PLAYING) != 0) ? STATUS_EOS : 0), STATUS_INTERNAL_PLAYING);
+
+ // all other modes set up for an operation
+ else
{
- load_start();
-
- // don't log masked channels
- if ((debug::GLOBAL_ADPCM_B_CHANNEL_MASK & 1) != 0)
- debug::log_keyon("KeyOn ADPCM-B: rep=%d spk=%d pan=%d%d dac=%d 8b=%d rom=%d ext=%d rec=%d start=%04X end=%04X pre=%04X dn=%04X lvl=%02X lim=%04X\n",
- m_regs.repeat(),
- m_regs.speaker(),
- m_regs.pan_left(),
- m_regs.pan_right(),
- m_regs.dac_enable(),
- m_regs.dram_8bit(),
- m_regs.rom_ram(),
- m_regs.external(),
- m_regs.record(),
- m_regs.start(),
- m_regs.end(),
- m_regs.prescale(),
- m_regs.delta_n(),
- m_regs.level(),
- m_regs.limit());
+ // initialize the core state; appears to leave EOS flag alone until next execute
+ set_reset_status(STATUS_BRDY, STATUS_PLAYING | STATUS_INTERNAL_DRAIN | STATUS_INTERNAL_PLAYING | STATUS_INTERNAL_SUPPRESS_WRITE);
+
+ // flag the address to be latched at the next access; this is necessary
+ // because it is allowed to program the start/stop addresses after this
+ // command byte is written
+ m_curaddress = LATCH_ADDRESS;
+
+ // if playing, set the playing status
+ if (m_regs.execute())
+ {
+ m_buffer = 0;
+ m_nibbles = 0;
+ m_position = 0;
+ m_accumulator = 0;
+ m_adpcm_step = STEP_MIN;
+ m_output = 0;
+
+ set_reset_status(STATUS_PLAYING | STATUS_INTERNAL_PLAYING, STATUS_EOS);
+
+ // don't log masked channels
+ if ((debug::GLOBAL_ADPCM_B_CHANNEL_MASK & 1) != 0)
+ debug::log_keyon("KeyOn ADPCM-B: rep=%d spk=%d pan=%d%d dac=%d 8b=%d rom=%d ext=%d rec=%d start=%04X end=%04X pre=%04X dn=%04X lvl=%02X lim=%04X\n",
+ m_regs.repeat(),
+ m_regs.speaker(),
+ m_regs.pan_left(),
+ m_regs.pan_right(),
+ m_regs.dac_enable(),
+ m_regs.dram_8bit(),
+ m_regs.rom_ram(),
+ m_regs.external(),
+ m_regs.record(),
+ m_regs.start(),
+ m_regs.end(),
+ m_regs.prescale(),
+ m_regs.delta_n(),
+ m_regs.level(),
+ m_regs.limit());
+ }
}
- else
- m_status &= ~STATUS_EOS;
- if (m_regs.resetflag())
- reset();
- if (m_regs.external())
- m_dummy_read = 2;
}
// register 8 writes over the bus under some conditions
else if (regnum == 0x08)
{
- // if writing from the CPU during execute, clear the ready flag
- if (m_regs.execute() && !m_regs.record() && !m_regs.external())
- m_status &= ~STATUS_BRDY;
-
- // if writing during "record", pass through as data
- else if (!m_regs.execute() && m_regs.record() && m_regs.external())
+ // writing during execute
+ if (m_regs.execute())
{
- // clear out dummy reads and set start address
- if (m_dummy_read != 0)
- {
- load_start();
- m_dummy_read = 0;
- }
+ // if writing from the CPU during execute, clear the ready flag; data will be picked
+ // up on next fetch
+ if (!m_regs.record() && !m_regs.external())
+ set_reset_status(0, STATUS_BRDY);
+ }
- // did we hit the end? if so, signal EOS
- if (at_end())
- {
- debug::log_keyon("%s\n", "ADPCM EOS");
- m_status = STATUS_EOS | STATUS_BRDY;
- }
+ // if writing to external data, process record mode, which writes data to RAM
+ else if (m_regs.external() && m_regs.record())
+ write_ram(value);
- // otherwise, write the data and signal ready
- else
- {
- m_owner.intf().ymfm_external_write(ACCESS_ADPCM_B, m_curaddress++, value);
- m_status = STATUS_BRDY;
- }
- }
+ // writes in external non-record mode appear to behave like a read in that it will advance
+ // the address and consume a nibble, but the last written value will still be present
+ else
+ read_ram();
}
}
@@ -702,20 +670,164 @@ uint32_t adpcm_b_channel::address_shift() const
//-------------------------------------------------
-// load_start - load the start address and
-// initialize the state
+// advance_address - advance the address, checking
+// for end/limit values at programmed boundaries;
+// returns true if the end is hit
//-------------------------------------------------
-void adpcm_b_channel::load_start()
+bool adpcm_b_channel::advance_address()
{
- m_status = (m_status & ~STATUS_EOS) | STATUS_PLAYING;
- m_curaddress = m_regs.external() ? (m_regs.start() << address_shift()) : 0;
- m_curnibble = 0;
- m_curbyte = 0;
- m_position = 0;
- m_accumulator = 0;
- m_prev_accum = 0;
- m_adpcm_step = STEP_MIN;
+ // if we're fetching the last byte of a unit, check ending conditions
+ auto shift = address_shift();
+ auto mask = (1 << shift) - 1;
+
+ // should never get here with an uninitialized current address
+ assert(m_curaddress != LATCH_ADDRESS);
+
+ // if at the end of a unit, check for end/limit
+ if ((m_curaddress & mask) == mask)
+ {
+ // shift off the low address bits and check against the end
+ uint32_t unitaddr = m_curaddress >> shift;
+ if (unitaddr == m_regs.end())
+ return true;
+
+ // wrap at the limit address; this does not report any status
+ else if (unitaddr == m_regs.limit())
+ {
+ m_curaddress = 0;
+ return false;
+ }
+ }
+
+ // advance the address
+ m_curaddress = (m_curaddress + 1) & 0xffffff;
+ return false;
+}
+
+
+//-------------------------------------------------
+// request_data - request another byte of data
+// for the buffer; used by both playback and
+// data reading code
+//-------------------------------------------------
+
+bool adpcm_b_channel::request_data()
+{
+ // pick up the current address if this is the first read
+ if (m_curaddress == LATCH_ADDRESS)
+ latch_addresses();
+
+ // if CPU-driven, just set the flag and return true
+ if (!m_regs.external())
+ {
+ // if data was written, consume it
+ if ((m_status & STATUS_BRDY) == 0)
+ append_buffer_byte(m_regs.cpudata());
+ set_reset_status(STATUS_BRDY);
+ return false;
+ }
+
+ // append the new byte to our buffer; also write to the cpudata register to match
+ // behavior of dummy reads from real chip
+ uint8_t data = m_owner.intf().ymfm_external_read(ACCESS_ADPCM_B, m_curaddress);
+ append_buffer_byte(data);
+ m_regs.write(0x08, data);
+
+ // advance the address, returning true if we hit the end
+ return advance_address();
+}
+
+
+//-------------------------------------------------
+// read_ram - perform a read cycle from RAM/ROM
+//-------------------------------------------------
+
+uint8_t adpcm_b_channel::read_ram()
+{
+ // if this is the first read, ensure there is at least 2 bytes of data available,
+ // padding with the cpudata register if needed
+ if (m_curaddress == LATCH_ADDRESS)
+ {
+ set_reset_status(0, STATUS_INTERNAL_DRAIN);
+ while (m_nibbles < 4)
+ append_buffer_byte(m_regs.cpudata());
+ }
+
+ // if we have the nibbles, return them
+ uint8_t result = consume_nibbles(2);
+ set_reset_status(STATUS_BRDY);
+
+ // if we previously hit the end and we're draining, see if we're out
+ if ((m_status & STATUS_INTERNAL_DRAIN) != 0)
+ {
+ // if we run out of nibbles, mark end of sample and reset the address
+ if (m_nibbles == 0)
+ {
+ set_reset_status(STATUS_EOS, STATUS_INTERNAL_DRAIN);
+
+ // if repeating, add one dummy sample and issue a fetch of the first byte
+ if (m_regs.repeat())
+ {
+ append_buffer_byte(m_regs.cpudata());
+ m_curaddress = m_regs.start() << address_shift();
+ request_data();
+ }
+
+ // otherwise, reset the address
+ else
+ m_curaddress = LATCH_ADDRESS;
+ }
+ }
+
+ // if not draining, then request more data and start draining if we hit the end
+ else if (request_data())
+ set_reset_status(STATUS_INTERNAL_DRAIN);
+
+ return result;
+}
+
+
+//-------------------------------------------------
+// write_ram - perform a write cycle to RAM
+//-------------------------------------------------
+
+void adpcm_b_channel::write_ram(uint8_t value)
+{
+ // normal write case, unsuppressed
+ if ((m_status & STATUS_INTERNAL_SUPPRESS_WRITE) == 0)
+ {
+ // latch the current address if this is the first write
+ if (m_curaddress == LATCH_ADDRESS)
+ latch_addresses();
+
+ // write the data
+ m_owner.intf().ymfm_external_write(ACCESS_ADPCM_B, m_curaddress, value);
+ set_reset_status(STATUS_BRDY);
+
+ // advance; if we hit the end, signal EOS and put ourselves back in the latching state
+ if (advance_address())
+ {
+ set_reset_status(STATUS_EOS);
+ m_curaddress = LATCH_ADDRESS;
+
+ // in the repeat case, suppress further writes
+ if (m_regs.repeat())
+ set_reset_status(STATUS_INTERNAL_SUPPRESS_WRITE);
+ }
+ }
+
+ // suppressed writes after reaching stop address in repeat mode; note that this runs
+ // immediately after the EOS condition above, as well as on subsequent writes
+ if ((m_status & STATUS_INTERNAL_SUPPRESS_WRITE) != 0)
+ {
+ // reset the buffer to 4 nibbles with 0 and the value written, then trigger a read
+ // cycle which will consume the 0 and clock in the next byte, leaving the value
+ // written as the next byte to consume
+ m_buffer = value << 16;
+ m_nibbles = 4;
+ read_ram();
+ }
}
diff --git a/3rdparty/ymfm/src/ymfm_adpcm.h b/3rdparty/ymfm/src/ymfm_adpcm.h
index d74e24f2770..ef27b36427b 100644
--- a/3rdparty/ymfm/src/ymfm_adpcm.h
+++ b/3rdparty/ymfm/src/ymfm_adpcm.h
@@ -214,6 +214,8 @@ private:
// ======================> adpcm_b_registers
//
+// See https://github.com/hyano/opna-analyze/blob/main/doc/OPNA.md for details on ADPCM timing
+//
// ADPCM-B register map:
//
// System-wide registers:
@@ -263,6 +265,7 @@ public:
void save_restore(ymfm_saved_state &state);
// direct read/write access
+ uint8_t read(uint32_t index) const { return m_regdata[index]; }
void write(uint32_t index, uint8_t data) { m_regdata[index] = data; }
// system-wide registers
@@ -301,11 +304,22 @@ class adpcm_b_channel
static constexpr int32_t STEP_MIN = 127;
static constexpr int32_t STEP_MAX = 24576;
+ static constexpr uint32_t LATCH_ADDRESS = 0xffffffff;
+
public:
- static constexpr uint8_t STATUS_EOS = 0x01;
- static constexpr uint8_t STATUS_BRDY = 0x02;
- static constexpr uint8_t STATUS_PLAYING = 0x04;
+ // publicly visible status bits
+ static constexpr uint32_t STATUS_EOS = 0x01;
+ static constexpr uint32_t STATUS_BRDY = 0x02;
+ static constexpr uint32_t STATUS_PLAYING = 0x04;
+
+private:
+ // internal status bits
+ static constexpr uint32_t STATUS_EXTERNAL = STATUS_EOS | STATUS_BRDY | STATUS_PLAYING;
+ static constexpr uint32_t STATUS_INTERNAL_DRAIN = 0x08;
+ static constexpr uint32_t STATUS_INTERNAL_PLAYING = 0x10;
+ static constexpr uint32_t STATUS_INTERNAL_SUPPRESS_WRITE = 0x20;
+public:
// constructor
adpcm_b_channel(adpcm_b_engine &owner, uint32_t addrshift);
@@ -326,7 +340,10 @@ public:
void output(ymfm_output<NumOutputs> &output, uint32_t rshift) const;
// return the status register
- uint8_t status() const { return m_status; }
+ uint8_t status() const { return m_status & STATUS_EXTERNAL; }
+
+ // clear bits in the status register
+ void clear_status(uint8_t status) { m_status &= ~(status & STATUS_EXTERNAL); }
// handle special register reads
uint8_t read(uint32_t regnum);
@@ -335,31 +352,56 @@ public:
void write(uint32_t regnum, uint8_t value);
private:
- // helper - return the current address shift
+ // update the status register
+ void set_reset_status(uint32_t set, uint32_t reset = 0) { m_status = (m_status & ~reset) | set; }
+
+ // return the current address shift
uint32_t address_shift() const;
- // load the start address
- void load_start();
+ // advance the address by one byte, return true if the end address was hit
+ bool advance_address();
+
+ // request the next byte of data
+ bool request_data();
- // limit checker; stops at the last byte of the chunk described by address_shift()
- bool at_limit() const { return (m_curaddress == (((m_regs.limit() + 1) << address_shift()) - 1)); }
+ // perform a read cycle from RAM/ROM
+ uint8_t read_ram();
- // end checker; stops at the last byte of the chunk described by address_shift()
- bool at_end() const { return (m_curaddress == (((m_regs.end() + 1) << address_shift()) - 1)); }
+ // perform a write cycle to RAM
+ void write_ram(uint8_t value);
+
+ // latch the current address
+ void latch_addresses() { m_curaddress = m_regs.external() ? (m_regs.start() << address_shift()) : 0; }
+
+ // append a byte to our internal buffer
+ void append_buffer_byte(uint8_t data)
+ {
+ m_buffer |= data << (24 - 4 * m_nibbles);
+ m_nibbles += 2;
+ }
+
+ // consume the requested number of nibbles from the buffer
+ uint32_t consume_nibbles(uint8_t count)
+ {
+ uint32_t result = m_buffer >> (32 - 4 * count);
+ m_buffer <<= 4 * count;
+ m_nibbles = (m_nibbles > count) ? (m_nibbles - count) : 0;
+ return result;
+ }
// internal state
- uint32_t const m_address_shift; // address bits shift-left
- uint32_t m_status; // currently playing?
- uint32_t m_curnibble; // index of the current nibble
- uint32_t m_curbyte; // current byte of data
- uint32_t m_dummy_read; // dummy read tracker
- uint32_t m_position; // current fractional position
- uint32_t m_curaddress; // current address
- int32_t m_accumulator; // accumulator
- int32_t m_prev_accum; // previous accumulator (for linear interp)
- int32_t m_adpcm_step; // next forecast
- adpcm_b_registers &m_regs; // reference to registers
- adpcm_b_engine &m_owner; // reference to our owner
+ uint32_t const m_address_shift; // address bits shift-left
+ uint32_t m_status; // currently playing?
+ uint32_t m_buffer; // buffer of bytes read, left-justified
+ uint32_t m_nibbles; // number of nibbles in m_bytebuffer
+ uint32_t m_position; // current fractional position
+ uint32_t m_curaddress; // current address
+ int32_t m_accumulator; // accumulator
+ int32_t m_output; // current output value
+ int32_t m_prev_output; // previous output value (for linear interp)
+ int32_t m_adpcm_step; // next forecast
+ adpcm_b_registers &m_regs; // reference to registers
+ adpcm_b_engine &m_owner; // reference to our owner
};
@@ -392,6 +434,7 @@ public:
// status
uint8_t status() const { return m_channel->status(); }
+ void clear_status(uint8_t status) { m_channel->clear_status(status); }
// return a reference to our interface
ymfm_interface &intf() { return m_intf; }
diff --git a/3rdparty/ymfm/src/ymfm_fm.h b/3rdparty/ymfm/src/ymfm_fm.h
index 81795f8fe43..d40409fddfd 100644
--- a/3rdparty/ymfm/src/ymfm_fm.h
+++ b/3rdparty/ymfm/src/ymfm_fm.h
@@ -267,7 +267,7 @@ public:
// assign operators
void assign(uint32_t index, fm_operator<RegisterType> *op)
{
- assert(index < array_size(m_op));
+ assert(index < m_op.size());
m_op[index] = op;
if (op != nullptr)
op->set_choffs(m_choffs);
@@ -330,7 +330,7 @@ private:
uint32_t m_choffs; // channel offset in registers
int16_t m_feedback[2]; // feedback memory for operator 1
mutable int16_t m_feedback_in; // next input value for op 1 feedback (set in output)
- fm_operator<RegisterType> *m_op[4]; // up to 4 operators
+ std::array<fm_operator<RegisterType> *, 4> m_op; // up to 4 operators
RegisterType &m_regs; // direct reference to registers
fm_engine_base<RegisterType> &m_owner; // reference to the owning engine
};
diff --git a/3rdparty/ymfm/src/ymfm_fm.ipp b/3rdparty/ymfm/src/ymfm_fm.ipp
index 78e3a62d9c8..675424839ce 100644
--- a/3rdparty/ymfm/src/ymfm_fm.ipp
+++ b/3rdparty/ymfm/src/ymfm_fm.ipp
@@ -839,12 +839,12 @@ void fm_channel<RegisterType>::save_restore(ymfm_saved_state &state)
template<class RegisterType>
void fm_channel<RegisterType>::keyonoff(uint32_t states, keyon_type type, uint32_t chnum)
{
- for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
+ for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
m_op[opnum]->keyonoff(bitfield(states, opnum), type);
if (debug::LOG_KEYON_EVENTS && ((debug::GLOBAL_FM_CHANNEL_MASK >> chnum) & 1) != 0)
- for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
+ for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
debug::log_keyon("%c%s\n", bitfield(states, opnum) ? '+' : '-', m_regs.log_keyon(m_choffs, m_op[opnum]->opoffs()).c_str());
}
@@ -860,7 +860,7 @@ bool fm_channel<RegisterType>::prepare()
uint32_t active_mask = 0;
// prepare all operators and determine if they are active
- for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
+ for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
if (m_op[opnum]->prepare())
active_mask |= 1 << opnum;
@@ -880,7 +880,7 @@ void fm_channel<RegisterType>::clock(uint32_t env_counter, int32_t lfo_raw_pm)
m_feedback[0] = m_feedback[1];
m_feedback[1] = m_feedback_in;
- for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
+ for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
m_op[opnum]->clock(env_counter, lfo_raw_pm);
@@ -888,7 +888,7 @@ void fm_channel<RegisterType>::clock(uint32_t env_counter, int32_t lfo_raw_pm)
useful temporary code for envelope debugging
if (m_choffs == 0x101)
{
- for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
+ for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
{
auto &op = *m_op[((opnum & 1) << 1) | ((opnum >> 1) & 1)];
printf(" %c%03X%c%c ",
@@ -1504,6 +1504,8 @@ void fm_engine_base<RegisterType>::update_timer(uint32_t tnum, uint32_t enable,
template<class RegisterType>
void fm_engine_base<RegisterType>::engine_timer_expired(uint32_t tnum)
{
+ assert(tnum == 0 || tnum == 1);
+
// update status
if (tnum == 0 && m_regs.enable_timer_a())
set_reset_status(STATUS_TIMERA, 0);
@@ -1515,7 +1517,7 @@ void fm_engine_base<RegisterType>::engine_timer_expired(uint32_t tnum)
for (uint32_t chnum = 0; chnum < CHANNELS; chnum++)
if (bitfield(RegisterType::CSM_TRIGGER_MASK, chnum))
{
- m_channel[chnum]->keyonoff(1, KEYON_CSM, chnum);
+ m_channel[chnum]->keyonoff(0xf, KEYON_CSM, chnum);
m_modified_channels |= 1 << chnum;
}
diff --git a/3rdparty/ymfm/src/ymfm_misc.h b/3rdparty/ymfm/src/ymfm_misc.h
index 0c3e2fa2310..628d128f699 100644
--- a/3rdparty/ymfm/src/ymfm_misc.h
+++ b/3rdparty/ymfm/src/ymfm_misc.h
@@ -90,5 +90,4 @@ protected:
}
-
#endif // YMFM_MISC_H
diff --git a/3rdparty/ymfm/src/ymfm_opl.cpp b/3rdparty/ymfm/src/ymfm_opl.cpp
index f3f62955ecb..46f93c708df 100644
--- a/3rdparty/ymfm/src/ymfm_opl.cpp
+++ b/3rdparty/ymfm/src/ymfm_opl.cpp
@@ -386,9 +386,9 @@ std::string opl_registers_base<Revision>::log_keyon(uint32_t choffs, uint32_t op
uint32_t opnum = (opoffs & 31) - 2 * ((opoffs & 31) / 8) + 18 * bitfield(opoffs, 8);
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%2u.%02u freq=%04X fb=%u alg=%X mul=%X tl=%02X ksr=%u ns=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%2u.%02u freq=%04X fb=%u alg=%X mul=%X tl=%02X ksr=%u ns=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u",
chnum, opnum,
ch_block_freq(choffs),
ch_feedback(choffs),
@@ -405,25 +405,25 @@ std::string opl_registers_base<Revision>::log_keyon(uint32_t choffs, uint32_t op
op_eg_sustain(opoffs));
if (OUTPUTS > 1)
- end += sprintf(end, " out=%c%c%c%c",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " out=%c%c%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-',
ch_output_2(choffs) ? '0' : '-',
ch_output_3(choffs) ? '1' : '-');
if (op_lfo_am_enable(opoffs) != 0)
- end += sprintf(end, " am=%u", lfo_am_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", lfo_am_depth());
if (op_lfo_pm_enable(opoffs) != 0)
- end += sprintf(end, " pm=%u", lfo_pm_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", lfo_pm_depth());
if (waveform_enable() && op_waveform(opoffs) != 0)
- end += sprintf(end, " wf=%u", op_waveform(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " wf=%u", op_waveform(opoffs));
if (is_rhythm(choffs))
- end += sprintf(end, " rhy=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " rhy=1");
if (DYNAMIC_OPS)
{
operator_mapping map;
operator_map(map);
if (bitfield(map.chan[chnum], 16, 8) != 0xff)
- end += sprintf(end, " 4op");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " 4op");
}
return buffer;
@@ -685,9 +685,9 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%u.%02u freq=%04X inst=%X fb=%u mul=%X",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X inst=%X fb=%u mul=%X",
chnum, opnum,
ch_block_freq(choffs),
ch_instrument(choffs),
@@ -695,11 +695,11 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
op_multiple(opoffs));
if (bitfield(opoffs, 0) == 1 || (is_rhythm(choffs) && choffs >= 6))
- end += sprintf(end, " vol=%X", op_volume(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " vol=%X", op_volume(opoffs));
else
- end += sprintf(end, " tl=%02X", ch_total_level(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " tl=%02X", ch_total_level(choffs));
- end += sprintf(end, " ksr=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u/%u",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " ksr=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u/%u",
op_ksr(opoffs),
op_ksl(opoffs),
op_attack_rate(opoffs),
@@ -710,13 +710,13 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
ch_sustain(choffs));
if (op_lfo_am_enable(opoffs))
- end += sprintf(end, " am=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=1");
if (op_lfo_pm_enable(opoffs))
- end += sprintf(end, " pm=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=1");
if (op_waveform(opoffs) != 0)
- end += sprintf(end, " wf=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " wf=1");
if (is_rhythm(choffs))
- end += sprintf(end, " rhy=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " rhy=1");
return buffer;
}
@@ -1012,6 +1012,8 @@ void y8950::write_data(uint8_t data)
{
case 0x04: // IRQ control
m_fm.write(m_address, data);
+ if ((data & STATUS_ADPCM_B_EOS) != 0)
+ m_adpcm_b.clear_status(adpcm_b_channel::STATUS_EOS);
read_status();
break;
@@ -1715,9 +1717,15 @@ uint8_t ymf278b::read_status()
uint8_t ymf278b::read_data_pcm()
{
- // write to FM
+ // read from PCM
if (bitfield(m_address, 9) != 0)
- return m_pcm.read(m_address & 0xff);
+ {
+ uint8_t result = m_pcm.read(m_address & 0xff);
+ if ((m_address & 0xff) == 0x02)
+ result |= 0x20;
+
+ return result;
+ }
return 0;
}
diff --git a/3rdparty/ymfm/src/ymfm_opl.h b/3rdparty/ymfm/src/ymfm_opl.h
index 843e5b274d2..71b098e974a 100644
--- a/3rdparty/ymfm/src/ymfm_opl.h
+++ b/3rdparty/ymfm/src/ymfm_opl.h
@@ -52,7 +52,7 @@ namespace ymfm
//
// System-wide registers:
// 01 xxxxxxxx Test register
-// --x----- Enable OPL compatibility mode [OPL2 only] (1 = enable)
+// --x----- Enable OPL compatibility mode [OPL2 only] (0 = enable)
// 02 xxxxxxxx Timer A value (4 * OPN)
// 03 xxxxxxxx Timer B value
// 04 x------- RST
@@ -243,7 +243,7 @@ public:
uint32_t op_decay_rate(uint32_t opoffs) const { return byte(0x60, 0, 4, opoffs); }
uint32_t op_sustain_level(uint32_t opoffs) const { return byte(0x80, 4, 4, opoffs); }
uint32_t op_release_rate(uint32_t opoffs) const { return byte(0x80, 0, 4, opoffs); }
- uint32_t op_waveform(uint32_t opoffs) const { return IsOpl2Plus ? byte(0xe0, 0, newflag() ? 3 : 2, opoffs) : 0; }
+ uint32_t op_waveform(uint32_t opoffs) const { return waveform_enable() ? byte(0xe0, 0, newflag() ? 3 : 2, opoffs) : 0; }
protected:
// return a bitfield extracted from a byte
diff --git a/3rdparty/ymfm/src/ymfm_opm.cpp b/3rdparty/ymfm/src/ymfm_opm.cpp
index 544bbe89a29..03f54fb9039 100644
--- a/3rdparty/ymfm/src/ymfm_opm.cpp
+++ b/3rdparty/ymfm/src/ymfm_opm.cpp
@@ -60,17 +60,17 @@ opm_registers::opm_registers() :
{
// waveform 0 is a sawtooth
uint8_t am = index ^ 0xff;
- int8_t pm = int8_t(index);
+ uint8_t pm = index;
m_lfo_waveform[0][index] = am | (pm << 8);
// waveform 1 is a square wave
am = bitfield(index, 7) ? 0 : 0xff;
- pm = int8_t(am ^ 0x80);
+ pm = am ^ 0x80;
m_lfo_waveform[1][index] = am | (pm << 8);
// waveform 2 is a triangle wave
am = bitfield(index, 7) ? (index << 1) : ((index ^ 0xff) << 1);
- pm = int8_t(bitfield(index, 6) ? am : ~am);
+ pm = bitfield(index, 6) ? am : ~am;
m_lfo_waveform[2][index] = am | (pm << 8);
// waveform 3 is noise; it is filled in dynamically
@@ -330,7 +330,7 @@ uint32_t opm_registers::compute_phase_step(uint32_t choffs, uint32_t opoffs, opd
if (pm_sensitivity < 6)
delta += lfo_raw_pm >> (6 - pm_sensitivity);
else
- delta += lfo_raw_pm << (pm_sensitivity - 5);
+ delta += uint32_t(lfo_raw_pm) << (pm_sensitivity - 5);
}
// apply delta and convert to a frequency number
@@ -354,9 +354,9 @@ std::string opm_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%u.%02u freq=%04X dt2=%u dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt2=%u dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
chnum, opnum,
ch_block_freq(choffs),
op_detune2(opoffs),
@@ -376,14 +376,14 @@ std::string opm_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
bool am = (lfo_am_depth() != 0 && ch_lfo_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am)
- end += sprintf(end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
bool pm = (lfo_pm_depth() != 0 && ch_lfo_pm_sens(choffs) != 0);
if (pm)
- end += sprintf(end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
if (am || pm)
- end += sprintf(end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
if (noise_enable() && opoffs == 31)
- end += sprintf(end, " noise=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " noise=1");
return buffer;
}
diff --git a/3rdparty/ymfm/src/ymfm_opn.cpp b/3rdparty/ymfm/src/ymfm_opn.cpp
index 053ad97701c..5f418636a87 100644
--- a/3rdparty/ymfm/src/ymfm_opn.cpp
+++ b/3rdparty/ymfm/src/ymfm_opn.cpp
@@ -143,26 +143,23 @@ bool opn_registers_base<IsOpnA>::write(uint16_t index, uint8_t data, uint32_t &c
assert(index < REGISTERS);
// writes in the 0xa0-af/0x1a0-af region are handled as latched pairs
- // borrow unused registers 0xb8-bf/0x1b8-bf as temporary holding locations
+ // borrow unused registers 0xb8-bf as temporary holding locations
if ((index & 0xf0) == 0xa0)
{
if (bitfield(index, 0, 2) == 3)
return false;
uint32_t latchindex = 0xb8 | bitfield(index, 3);
- if (IsOpnA)
- latchindex |= index & 0x100;
// writes to the upper half just latch (only low 6 bits matter)
if (bitfield(index, 2))
- m_regdata[latchindex] = data | 0x80;
+ m_regdata[latchindex] = data & 0x3f;
- // writes to the lower half only commit if the latch is there
- else if (bitfield(m_regdata[latchindex], 7))
+ // writes to the lower half also apply said latch
+ else
{
m_regdata[index] = data;
- m_regdata[index | 4] = m_regdata[latchindex] & 0x3f;
- m_regdata[latchindex] = 0;
+ m_regdata[index | 4] = m_regdata[latchindex];
}
return false;
}
@@ -409,9 +406,9 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
}
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
chnum, opnum,
block_freq,
op_detune(opoffs),
@@ -427,21 +424,21 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
op_sustain_level(opoffs));
if (OUTPUTS > 1)
- end += sprintf(end, " out=%c%c",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " out=%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-');
if (op_ssg_eg_enable(opoffs))
- end += sprintf(end, " ssg=%X", op_ssg_eg_mode(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " ssg=%X", op_ssg_eg_mode(opoffs));
bool am = (op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
- end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (ch_lfo_pm_sens(choffs) != 0);
if (pm)
- end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
- end += sprintf(end, " lfo=%02X", lfo_rate());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X", lfo_rate());
if (multi_freq() && choffs == 2)
- end += sprintf(end, " multi=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " multi=1");
return buffer;
}
@@ -1240,7 +1237,10 @@ void ym2608::write_data_hi(uint8_t data)
{
// 110: IRQ flag control
if (bitfield(data, 7))
+ {
m_fm.set_reset_status(0, 0xff);
+ m_adpcm_b.clear_status(adpcm_b_channel::STATUS_EOS | adpcm_b_channel::STATUS_PLAYING);
+ }
else
{
m_flag_control = data;
@@ -2027,6 +2027,8 @@ void ym2610::write_data(uint8_t data)
// 1C: EOS flag reset
m_flag_mask = ~data & EOS_FLAGS_MASK;
m_eos_status &= ~(data & EOS_FLAGS_MASK);
+ if (bitfield(data, 7))
+ m_adpcm_b.clear_status(adpcm_b_channel::STATUS_EOS);
}
else
{
diff --git a/3rdparty/ymfm/src/ymfm_opn.h b/3rdparty/ymfm/src/ymfm_opn.h
index bab68ed93c5..daed8b0bf24 100644
--- a/3rdparty/ymfm/src/ymfm_opn.h
+++ b/3rdparty/ymfm/src/ymfm_opn.h
@@ -793,7 +793,7 @@ public:
ymf276(ymfm_interface &intf) : ym2612(intf) { }
// generate one sample of sound
- void generate(output_data *output, uint32_t numsamples);
+ void generate(output_data *output, uint32_t numsamples = 1);
};
}
diff --git a/3rdparty/ymfm/src/ymfm_opq.cpp b/3rdparty/ymfm/src/ymfm_opq.cpp
index 3467c0ddf95..78ae1616409 100644
--- a/3rdparty/ymfm/src/ymfm_opq.cpp
+++ b/3rdparty/ymfm/src/ymfm_opq.cpp
@@ -339,9 +339,9 @@ std::string opq_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%u.%02u freq=%04X dt=%+2d fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt=%+2d fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
chnum, opnum,
(opoffs & 1) ? ch_block_freq_24(choffs) : ch_block_freq_13(choffs),
int32_t(op_detune(opoffs)) - 0x20,
@@ -360,14 +360,14 @@ std::string opq_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
bool am = (lfo_enable() && op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
- end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (lfo_enable() && ch_lfo_pm_sens(choffs) != 0);
if (pm)
- end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
- end += sprintf(end, " lfo=%02X", lfo_rate());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X", lfo_rate());
if (ch_reverb(choffs))
- end += sprintf(end, " reverb");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " reverb");
return buffer;
}
diff --git a/3rdparty/ymfm/src/ymfm_opx.h b/3rdparty/ymfm/src/ymfm_opx.h
new file mode 100644
index 00000000000..f8ee1c34f18
--- /dev/null
+++ b/3rdparty/ymfm/src/ymfm_opx.h
@@ -0,0 +1,290 @@
+// BSD 3-Clause License
+//
+// Copyright (c) 2021, Aaron Giles
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef YMFM_OPX_H
+#define YMFM_OPX_H
+
+#pragma once
+
+#include "ymfm.h"
+#include "ymfm_fm.h"
+
+namespace ymfm
+{
+
+//*********************************************************
+// REGISTER CLASSES
+//*********************************************************
+
+// ======================> opx_registers
+
+//
+// OPX register map:
+//
+// System-wide registers:
+//
+// Per-channel registers (channel in address bits 0-2)
+//
+// Per-operator registers (4 banks):
+// 00-0F x------- Enable
+// -xxxx--- EXT out
+// -------x Key on
+// 10-1F xxxxxxxx LFO frequency
+// 20-2F xx------ AM sensitivity (0-3)
+// --xxx--- PM sensitivity (0-7)
+// ------xx LFO waveform (0=disable, 1=saw, 2=
+// 30-3F -xxx---- Detune (0-7)
+// ----xxxx Multiple (0-15)
+// 40-4F -xxxxxxx Total level (0-127)
+// 50-5F xxx----- Key scale (0-7)
+// ---xxxxx Attack rate (0-31)
+// 60-6F ---xxxxx Decay rate (0-31)
+// 70-7F ---xxxxx Sustain rate (0-31)
+// 80-8F xxxx---- Sustain level (0-15)
+// ----xxxx Release rate (0-15)
+// 90-9F xxxxxxxx Frequency number (low 8 bits)
+// A0-AF xxxx---- Block (0-15)
+// ----xxxx Frequency number (high 4 bits)
+// B0-BF x------- Acc on
+// -xxx---- Feedback level (0-7)
+// -----xxx Waveform (0-7, 7=PCM)
+// C0-CF ----xxxx Algorithm (0-15)
+// D0-DF xxxx---- CH0 level (0-15)
+// ----xxxx CH1 level (0-15)
+// E0-EF xxxx---- CH2 level (0-15)
+// ----xxxx CH3 level (0-15)
+//
+
+class opx_registers : public fm_registers_base
+{
+ // LFO waveforms are 256 entries long
+ static constexpr uint32_t LFO_WAVEFORM_LENGTH = 256;
+
+public:
+ // constants
+ static constexpr uint32_t OUTPUTS = 8;
+ static constexpr uint32_t CHANNELS = 24;
+ static constexpr uint32_t ALL_CHANNELS = (1 << CHANNELS) - 1;
+ static constexpr uint32_t OPERATORS = CHANNELS * 2;
+ static constexpr uint32_t WAVEFORMS = 8;
+ static constexpr uint32_t REGISTERS = 0x800;
+ static constexpr uint32_t DEFAULT_PRESCALE = 8;
+ static constexpr uint32_t EG_CLOCK_DIVIDER = 2;
+ static constexpr uint32_t CSM_TRIGGER_MASK = ALL_CHANNELS;
+ static constexpr uint32_t REG_MODE = 0x14;
+ static constexpr uint8_t STATUS_TIMERA = 0x01;
+ static constexpr uint8_t STATUS_TIMERB = 0x02;
+ static constexpr uint8_t STATUS_BUSY = 0x80;
+ static constexpr uint8_t STATUS_IRQ = 0;
+
+ // constructor
+ opx_registers();
+
+ // reset to initial state
+ void reset();
+
+ // save/restore
+ void save_restore(ymfm_saved_state &state);
+
+ // map channel number to register offset
+ static constexpr uint32_t channel_offset(uint32_t chnum)
+ {
+ assert(chnum < CHANNELS);
+ return chnum;
+ }
+
+ // map operator number to register offset
+ static constexpr uint32_t operator_offset(uint32_t opnum)
+ {
+ assert(opnum < OPERATORS);
+ return opnum;
+ }
+
+ // return an array of operator indices for each channel
+ struct operator_mapping { uint32_t chan[CHANNELS]; };
+ void operator_map(operator_mapping &dest) const;
+
+ // handle writes to the register array
+ bool write(uint16_t index, uint8_t data, uint32_t &chan, uint32_t &opmask);
+
+ // clock the noise and LFO, if present, returning LFO PM value
+ int32_t clock_noise_and_lfo();
+
+ // return the AM offset from LFO for the given channel
+ uint32_t lfo_am_offset(uint32_t choffs) const;
+
+ // return the current noise state, gated by the noise clock
+ uint32_t noise_state() const { return m_noise_state; }
+
+ // caching helpers
+ void cache_operator_data(uint32_t choffs, uint32_t opoffs, opdata_cache &cache);
+
+ // compute the phase step, given a PM value
+ uint32_t compute_phase_step(uint32_t choffs, uint32_t opoffs, opdata_cache const &cache, int32_t lfo_raw_pm);
+
+ // log a key-on event
+ std::string log_keyon(uint32_t choffs, uint32_t opoffs);
+
+ // system-wide registers
+ uint32_t noise_frequency() const { return byte(0x0f, 0, 5); }
+ uint32_t noise_enable() const { return byte(0x0f, 7, 1); }
+ uint32_t timer_a_value() const { return word(0x10, 0, 8, 0x11, 0, 2); }
+ uint32_t timer_b_value() const { return byte(0x12, 0, 8); }
+ uint32_t csm() const { return byte(0x14, 7, 1); }
+ uint32_t reset_timer_b() const { return byte(0x14, 5, 1); }
+ uint32_t reset_timer_a() const { return byte(0x14, 4, 1); }
+ uint32_t enable_timer_b() const { return byte(0x14, 3, 1); }
+ uint32_t enable_timer_a() const { return byte(0x14, 2, 1); }
+ uint32_t load_timer_b() const { return byte(0x14, 1, 1); }
+ uint32_t load_timer_a() const { return byte(0x14, 0, 1); }
+ uint32_t lfo2_pm_depth() const { return byte(0x148, 0, 7); } // fake
+ uint32_t lfo2_rate() const { return byte(0x16, 0, 8); }
+ uint32_t lfo2_am_depth() const { return byte(0x17, 0, 7); }
+ uint32_t lfo_rate() const { return byte(0x18, 0, 8); }
+ uint32_t lfo_am_depth() const { return byte(0x19, 0, 7); }
+ uint32_t lfo_pm_depth() const { return byte(0x149, 0, 7); } // fake
+ uint32_t output_bits() const { return byte(0x1b, 6, 2); }
+ uint32_t lfo2_sync() const { return byte(0x1b, 5, 1); }
+ uint32_t lfo_sync() const { return byte(0x1b, 4, 1); }
+ uint32_t lfo2_waveform() const { return byte(0x1b, 2, 2); }
+ uint32_t lfo_waveform() const { return byte(0x1b, 0, 2); }
+
+ // per-channel registers
+ uint32_t ch_volume(uint32_t choffs) const { return byte(0x00, 0, 8, choffs); }
+ uint32_t ch_output_any(uint32_t choffs) const { return byte(0x20, 7, 1, choffs) | byte(0x30, 0, 1, choffs); }
+ uint32_t ch_output_0(uint32_t choffs) const { return byte(0x30, 0, 1, choffs); }
+ uint32_t ch_output_1(uint32_t choffs) const { return byte(0x20, 7, 1, choffs) | byte(0x30, 0, 1, choffs); }
+ uint32_t ch_output_2(uint32_t choffs) const { return 0; }
+ uint32_t ch_output_3(uint32_t choffs) const { return 0; }
+ uint32_t ch_key_on(uint32_t choffs) const { return byte(0x20, 6, 1, choffs); }
+ uint32_t ch_feedback(uint32_t choffs) const { return byte(0x20, 3, 3, choffs); }
+ uint32_t ch_algorithm(uint32_t choffs) const { return byte(0x20, 0, 3, choffs); }
+ uint32_t ch_block_freq(uint32_t choffs) const { return word(0x28, 0, 7, 0x30, 2, 6, choffs); }
+ uint32_t ch_lfo_pm_sens(uint32_t choffs) const { return byte(0x38, 4, 3, choffs); }
+ uint32_t ch_lfo_am_sens(uint32_t choffs) const { return byte(0x38, 0, 2, choffs); }
+ uint32_t ch_lfo2_pm_sens(uint32_t choffs) const { return byte(0x140, 4, 3, choffs); } // fake
+ uint32_t ch_lfo2_am_sens(uint32_t choffs) const { return byte(0x140, 0, 2, choffs); } // fake
+
+ // per-operator registers
+ uint32_t op_detune(uint32_t opoffs) const { return byte(0x40, 4, 3, opoffs); }
+ uint32_t op_multiple(uint32_t opoffs) const { return byte(0x40, 0, 4, opoffs); }
+ uint32_t op_fix_range(uint32_t opoffs) const { return byte(0x40, 4, 3, opoffs); }
+ uint32_t op_fix_frequency(uint32_t opoffs) const { return byte(0x40, 0, 4, opoffs); }
+ uint32_t op_waveform(uint32_t opoffs) const { return byte(0x100, 4, 3, opoffs); } // fake
+ uint32_t op_fine(uint32_t opoffs) const { return byte(0x100, 0, 4, opoffs); } // fake
+ uint32_t op_total_level(uint32_t opoffs) const { return byte(0x60, 0, 7, opoffs); }
+ uint32_t op_ksr(uint32_t opoffs) const { return byte(0x80, 6, 2, opoffs); }
+ uint32_t op_fix_mode(uint32_t opoffs) const { return byte(0x80, 5, 1, opoffs); }
+ uint32_t op_attack_rate(uint32_t opoffs) const { return byte(0x80, 0, 5, opoffs); }
+ uint32_t op_lfo_am_enable(uint32_t opoffs) const { return byte(0xa0, 7, 1, opoffs); }
+ uint32_t op_decay_rate(uint32_t opoffs) const { return byte(0xa0, 0, 5, opoffs); }
+ uint32_t op_detune2(uint32_t opoffs) const { return byte(0xc0, 6, 2, opoffs); }
+ uint32_t op_sustain_rate(uint32_t opoffs) const { return byte(0xc0, 0, 5, opoffs); }
+ uint32_t op_eg_shift(uint32_t opoffs) const { return byte(0x120, 6, 2, opoffs); } // fake
+ uint32_t op_reverb_rate(uint32_t opoffs) const { return byte(0x120, 0, 3, opoffs); } // fake
+ uint32_t op_sustain_level(uint32_t opoffs) const { return byte(0xe0, 4, 4, opoffs); }
+ uint32_t op_release_rate(uint32_t opoffs) const { return byte(0xe0, 0, 4, opoffs); }
+
+protected:
+ // return a bitfield extracted from a byte
+ uint32_t byte(uint32_t offset, uint32_t start, uint32_t count, uint32_t extra_offset = 0) const
+ {
+ return bitfield(m_regdata[offset + extra_offset], start, count);
+ }
+
+ // return a bitfield extracted from a pair of bytes, MSBs listed first
+ uint32_t word(uint32_t offset1, uint32_t start1, uint32_t count1, uint32_t offset2, uint32_t start2, uint32_t count2, uint32_t extra_offset = 0) const
+ {
+ return (byte(offset1, start1, count1, extra_offset) << count2) | byte(offset2, start2, count2, extra_offset);
+ }
+
+ // internal state
+ uint32_t m_lfo_counter[2]; // LFO counter
+ uint32_t m_noise_lfsr; // noise LFSR state
+ uint8_t m_noise_counter; // noise counter
+ uint8_t m_noise_state; // latched noise state
+ uint8_t m_noise_lfo; // latched LFO noise value
+ uint8_t m_lfo_am[2]; // current LFO AM value
+ uint8_t m_regdata[REGISTERS]; // register data
+ uint16_t m_phase_substep[OPERATORS]; // phase substep for fixed frequency
+ int16_t m_lfo_waveform[4][LFO_WAVEFORM_LENGTH]; // LFO waveforms; AM in low 8, PM in upper 8
+ uint16_t m_waveform[WAVEFORMS][WAVEFORM_LENGTH]; // waveforms
+};
+
+
+
+//*********************************************************
+// IMPLEMENTATION CLASSES
+//*********************************************************
+
+// ======================> ymf271
+
+class ymf271
+{
+public:
+ using fm_engine = fm_engine_base<opx_registers>;
+ static constexpr uint32_t OUTPUTS = fm_engine::OUTPUTS;
+ using output_data = fm_engine::output_data;
+
+ // constructor
+ ymf271(ymfm_interface &intf);
+
+ // reset
+ void reset();
+
+ // save/restore
+ void save_restore(ymfm_saved_state &state);
+
+ // pass-through helpers
+ uint32_t sample_rate(uint32_t input_clock) const { return m_fm.sample_rate(input_clock); }
+ void invalidate_caches() { m_fm.invalidate_caches(); }
+
+ // read access
+ uint8_t read_status();
+ uint8_t read(uint32_t offset);
+
+ // write access
+ void write_address(uint8_t data);
+ void write_data(uint8_t data);
+ void write(uint32_t offset, uint8_t data);
+
+ // generate one sample of sound
+ void generate(output_data *output, uint32_t numsamples = 1);
+
+protected:
+ // internal state
+ uint8_t m_address; // address register
+ fm_engine m_fm; // core FM engine
+};
+
+}
+
+
+#endif // YMFM_OPX_H
diff --git a/3rdparty/ymfm/src/ymfm_opz.cpp b/3rdparty/ymfm/src/ymfm_opz.cpp
index adeefd79f19..1178417bb8a 100644
--- a/3rdparty/ymfm/src/ymfm_opz.cpp
+++ b/3rdparty/ymfm/src/ymfm_opz.cpp
@@ -129,17 +129,17 @@ opz_registers::opz_registers() :
{
// waveform 0 is a sawtooth
uint8_t am = index ^ 0xff;
- int8_t pm = int8_t(index);
+ uint8_t pm = index;
m_lfo_waveform[0][index] = am | (pm << 8);
// waveform 1 is a square wave
am = bitfield(index, 7) ? 0 : 0xff;
- pm = int8_t(am ^ 0x80);
+ pm = am ^ 0x80;
m_lfo_waveform[1][index] = am | (pm << 8);
// waveform 2 is a triangle wave
am = bitfield(index, 7) ? (index << 1) : ((index ^ 0xff) << 1);
- pm = int8_t(bitfield(index, 6) ? am : ~am);
+ pm = bitfield(index, 6) ? am : ~am;
m_lfo_waveform[2][index] = am | (pm << 8);
// waveform 3 is noise; it is filled in dynamically
@@ -555,16 +555,16 @@ std::string opz_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
- char *end = &buffer[0];
+ int end = 0;
- end += sprintf(end, "%u.%02u", chnum, opnum);
+ end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u", chnum, opnum);
if (op_fix_mode(opoffs))
- end += sprintf(end, " fixfreq=%X fine=%X shift=%X", op_fix_frequency(opoffs), op_fine(opoffs), op_fix_range(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " fixfreq=%X fine=%X shift=%X", op_fix_frequency(opoffs), op_fine(opoffs), op_fix_range(opoffs));
else
- end += sprintf(end, " freq=%04X dt2=%u fine=%X", ch_block_freq(choffs), op_detune2(opoffs), op_fine(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " freq=%04X dt2=%u fine=%X", ch_block_freq(choffs), op_detune2(opoffs), op_fine(opoffs));
- end += sprintf(end, " dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
op_detune(opoffs),
ch_feedback(choffs),
ch_algorithm(choffs),
@@ -580,32 +580,32 @@ std::string opz_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
ch_output_1(choffs) ? 'R' : '-');
if (op_eg_shift(opoffs) != 0)
- end += sprintf(end, " egshift=%u", op_eg_shift(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " egshift=%u", op_eg_shift(opoffs));
bool am = (lfo_am_depth() != 0 && ch_lfo_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am)
- end += sprintf(end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
bool pm = (lfo_pm_depth() != 0 && ch_lfo_pm_sens(choffs) != 0);
if (pm)
- end += sprintf(end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
if (am || pm)
- end += sprintf(end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
bool am2 = (lfo2_am_depth() != 0 && ch_lfo2_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am2)
- end += sprintf(end, " am2=%u/%02X", ch_lfo2_am_sens(choffs), lfo2_am_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " am2=%u/%02X", ch_lfo2_am_sens(choffs), lfo2_am_depth());
bool pm2 = (lfo2_pm_depth() != 0 && ch_lfo2_pm_sens(choffs) != 0);
if (pm2)
- end += sprintf(end, " pm2=%u/%02X", ch_lfo2_pm_sens(choffs), lfo2_pm_depth());
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " pm2=%u/%02X", ch_lfo2_pm_sens(choffs), lfo2_pm_depth());
if (am2 || pm2)
- end += sprintf(end, " lfo2=%02X/%c", lfo2_rate(), "WQTN"[lfo2_waveform()]);
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo2=%02X/%c", lfo2_rate(), "WQTN"[lfo2_waveform()]);
if (op_reverb_rate(opoffs) != 0)
- end += sprintf(end, " rev=%u", op_reverb_rate(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " rev=%u", op_reverb_rate(opoffs));
if (op_waveform(opoffs) != 0)
- end += sprintf(end, " wf=%u", op_waveform(opoffs));
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " wf=%u", op_waveform(opoffs));
if (noise_enable() && opoffs == 31)
- end += sprintf(end, " noise=1");
+ end += snprintf(&buffer[end], sizeof(buffer) - end, " noise=1");
return buffer;
}
diff --git a/3rdparty/ymfm/src/ymfm_pcm.cpp b/3rdparty/ymfm/src/ymfm_pcm.cpp
index 50595133bf7..34417490ccd 100644
--- a/3rdparty/ymfm/src/ymfm_pcm.cpp
+++ b/3rdparty/ymfm/src/ymfm_pcm.cpp
@@ -46,7 +46,6 @@ namespace ymfm
void pcm_registers::reset()
{
std::fill_n(&m_regdata[0], REGISTERS, 0);
- m_regdata[0x02] = 0x20;
m_regdata[0xf8] = 0x1b;
}
diff --git a/3rdparty/ymfm/src/ymfm_ssg.h b/3rdparty/ymfm/src/ymfm_ssg.h
index 749ad146fe7..cb7ec9e7c41 100644
--- a/3rdparty/ymfm/src/ymfm_ssg.h
+++ b/3rdparty/ymfm/src/ymfm_ssg.h
@@ -49,6 +49,8 @@ namespace ymfm
class ssg_override
{
public:
+ virtual ~ssg_override() = default;
+
// reset our status
virtual void ssg_reset() = 0;
diff --git a/3rdparty/zlib/CMakeLists.txt b/3rdparty/zlib/CMakeLists.txt
index 7f1b69f4a37..15ceebe787e 100644
--- a/3rdparty/zlib/CMakeLists.txt
+++ b/3rdparty/zlib/CMakeLists.txt
@@ -3,7 +3,9 @@ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
project(zlib C)
-set(VERSION "1.3")
+set(VERSION "1.3.1")
+
+option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" ON)
set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
@@ -148,7 +150,9 @@ if(MINGW)
endif(MINGW)
add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+target_include_directories(zlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+target_include_directories(zlibstatic PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
set_target_properties(zlib PROPERTIES SOVERSION 1)
@@ -166,7 +170,7 @@ endif()
if(UNIX)
# On unix-like platforms the library is almost always called libz
set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
- if(NOT APPLE)
+ if(NOT APPLE AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX))
set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
endif()
elseif(BUILD_SHARED_LIBS AND WIN32)
@@ -193,21 +197,22 @@ endif()
#============================================================================
# Example binaries
#============================================================================
-
-add_executable(example test/example.c)
-target_link_libraries(example zlib)
-add_test(example example)
-
-add_executable(minigzip test/minigzip.c)
-target_link_libraries(minigzip zlib)
-
-if(HAVE_OFF64_T)
- add_executable(example64 test/example.c)
- target_link_libraries(example64 zlib)
- set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
- add_test(example64 example64)
-
- add_executable(minigzip64 test/minigzip.c)
- target_link_libraries(minigzip64 zlib)
- set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+if(ZLIB_BUILD_EXAMPLES)
+ add_executable(example test/example.c)
+ target_link_libraries(example zlib)
+ add_test(example example)
+
+ add_executable(minigzip test/minigzip.c)
+ target_link_libraries(minigzip zlib)
+
+ if(HAVE_OFF64_T)
+ add_executable(example64 test/example.c)
+ target_link_libraries(example64 zlib)
+ set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+ add_test(example64 example64)
+
+ add_executable(minigzip64 test/minigzip.c)
+ target_link_libraries(minigzip64 zlib)
+ set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+ endif()
endif()
diff --git a/3rdparty/zlib/ChangeLog b/3rdparty/zlib/ChangeLog
index 8707988ac18..b801a1031ec 100644
--- a/3rdparty/zlib/ChangeLog
+++ b/3rdparty/zlib/ChangeLog
@@ -1,6 +1,16 @@
ChangeLog file for zlib
+Changes in 1.3.1 (22 Jan 2024)
+- Reject overflows of zip header fields in minizip
+- Fix bug in inflateSync() for data held in bit buffer
+- Add LIT_MEM define to use more memory for a small deflate speedup
+- Fix decision on the emission of Zip64 end records in minizip
+- Add bounds checking to ERR_MSG() macro, used by zError()
+- Neutralize zip file traversal attacks in miniunz
+- Fix a bug in ZLIB_DEBUG compiles in check_match()
+- Various portability and appearance improvements
+
Changes in 1.3 (18 Aug 2023)
- Remove K&R function definitions and zlib2ansi
- Fix bug in deflateBound() for level 0 and memLevel 9
diff --git a/3rdparty/zlib/FAQ b/3rdparty/zlib/FAQ
index 55f1cdc22f6..92f5d3e29fa 100644
--- a/3rdparty/zlib/FAQ
+++ b/3rdparty/zlib/FAQ
@@ -14,8 +14,7 @@ The latest zlib FAQ is at http://zlib.net/zlib_faq.html
2. Where can I get a Windows DLL version?
The zlib sources can be compiled without change to produce a DLL. See the
- file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
- precompiled DLL are found in the zlib web site at http://zlib.net/ .
+ file win32/DLL_FAQ.txt in the zlib distribution.
3. Where can I get a Visual Basic interface to zlib?
diff --git a/3rdparty/zlib/Makefile.in b/3rdparty/zlib/Makefile.in
index 34d3cd722f8..cb8b00a9b07 100644
--- a/3rdparty/zlib/Makefile.in
+++ b/3rdparty/zlib/Makefile.in
@@ -1,5 +1,5 @@
# Makefile for zlib
-# Copyright (C) 1995-2017 Jean-loup Gailly, Mark Adler
+# Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
# To compile and test, type:
@@ -22,13 +22,13 @@ CFLAGS=-O
SFLAGS=-O
LDFLAGS=
-TEST_LDFLAGS=$(LDFLAGS) -L. libz.a
+TEST_LIBS=-L. libz.a
LDSHARED=$(CC)
CPP=$(CC) -E
STATICLIB=libz.a
SHAREDLIB=libz.so
-SHAREDLIBV=libz.so.1.3
+SHAREDLIBV=libz.so.1.3.1
SHAREDLIBM=libz.so.1
LIBS=$(STATICLIB) $(SHAREDLIBV)
@@ -282,10 +282,10 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a
-@rmdir objs
example$(EXE): example.o $(STATICLIB)
- $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(TEST_LIBS)
minigzip$(EXE): minigzip.o $(STATICLIB)
- $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(TEST_LIBS)
examplesh$(EXE): example.o $(SHAREDLIBV)
$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV)
@@ -294,10 +294,10 @@ minigzipsh$(EXE): minigzip.o $(SHAREDLIBV)
$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV)
example64$(EXE): example64.o $(STATICLIB)
- $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ example64.o $(TEST_LIBS)
minigzip64$(EXE): minigzip64.o $(STATICLIB)
- $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip64.o $(TEST_LIBS)
install-libs: $(LIBS)
-@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi
@@ -360,7 +360,7 @@ zconf: $(SRCDIR)zconf.h.in
cp -p $(SRCDIR)zconf.h.in zconf.h
minizip-test: static
- cd contrib/minizip && { CFLAGS="$(CFLAGS)" $(MAKE) test ; cd ../.. ; }
+ cd contrib/minizip && { CC="$(CC)" CFLAGS="$(CFLAGS)" $(MAKE) test ; cd ../.. ; }
minizip-clean:
cd contrib/minizip && { $(MAKE) clean ; cd ../.. ; }
diff --git a/3rdparty/zlib/README b/3rdparty/zlib/README
index e02fc5aa206..c5f917540b6 100644
--- a/3rdparty/zlib/README
+++ b/3rdparty/zlib/README
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.3 is a general purpose data compression library. All the code is
+zlib 1.3.1 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
@@ -31,7 +31,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available at
https://marknelson.us/posts/1997/01/01/zlib-engine.html .
-The changes made in version 1.3 are documented in the file ChangeLog.
+The changes made in version 1.3.1 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory contrib/ .
@@ -83,7 +83,7 @@ Acknowledgments:
Copyright notice:
- (C) 1995-2023 Jean-loup Gailly and Mark Adler
+ (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/3rdparty/zlib/configure b/3rdparty/zlib/configure
index cc867c94474..c55098afc4a 100644
--- a/3rdparty/zlib/configure
+++ b/3rdparty/zlib/configure
@@ -25,7 +25,7 @@ if test $SRCDIR = "."; then
ZINCOUT="-I."
SRCDIR=""
else
- ZINC='-include zconf.h'
+ ZINC='-I. -include zconf.h'
ZINCOUT='-I. -I$(SRCDIR)'
SRCDIR="$SRCDIR/"
fi
@@ -44,7 +44,8 @@ STATICLIB=libz.a
# extract zlib version numbers from zlib.h
VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}zlib.h`
-VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h`
+VER3=`echo ${VER}|sed -n -e 's/\([0-9]\{1,\}\(\\.[0-9]\{1,\}\)\{1,2\}\).*/\1/p'`
+VER1=`echo ${VER}|sed -n -e 's/\([0-9]\{1,\}\)\\..*/\1/p'`
# establish commands for library building
if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then
@@ -263,7 +264,7 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then
SHAREDLIB=libz$shared_ext
SHAREDLIBV=libz.$VER$shared_ext
SHAREDLIBM=libz.$VER1$shared_ext
- LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER"}
+ LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"}
if "${CROSS_PREFIX}libtool" -V 2>&1 | grep Apple > /dev/null; then
AR="${CROSS_PREFIX}libtool"
elif libtool -V 2>&1 | grep Apple > /dev/null; then
@@ -441,7 +442,7 @@ EOF
if test $shared -eq 1; then
echo Checking for shared library support... | tee -a configure.log
# we must test in two steps (cc then ld), required at least on SunOS 4.x
- if try $CC -w -c $SFLAGS $test.c &&
+ if try $CC -c $SFLAGS $test.c &&
try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then
echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log
elif test -z "$old_cc" -a -z "$old_cflags"; then
diff --git a/3rdparty/zlib/contrib/delphi/ZLib.pas b/3rdparty/zlib/contrib/delphi/ZLib.pas
index 814ffa6706a..93fa4c9edb0 100644
--- a/3rdparty/zlib/contrib/delphi/ZLib.pas
+++ b/3rdparty/zlib/contrib/delphi/ZLib.pas
@@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
const OutBuf: Pointer; BufSize: Integer);
const
- zlib_version = '1.3.0';
+ zlib_version = '1.3.1';
type
EZlibError = class(Exception);
diff --git a/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs
index bffe6093c3b..9b6c3907460 100644
--- a/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs
+++ b/3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs
@@ -34,7 +34,7 @@ namespace DotZLib
}
/// <summary>
- /// Initializes a new instance of the checksum generator basewith a specified value
+ /// Initializes a new instance of the checksum generator base with a specified value
/// </summary>
/// <param name="initialValue">The value to set the current checksum to</param>
public ChecksumGeneratorBase(uint initialValue)
diff --git a/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
index 209c8de4fb1..d81554b0aca 100644
--- a/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
+++ b/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
@@ -156,7 +156,7 @@ namespace DotZLibTests
public void Info_Version()
{
Info info = new Info();
- Assert.AreEqual("1.3.0", Info.Version);
+ Assert.AreEqual("1.3.1", Info.Version);
Assert.AreEqual(32, info.SizeOfUInt);
Assert.AreEqual(32, info.SizeOfULong);
Assert.AreEqual(32, info.SizeOfPointer);
diff --git a/3rdparty/zlib/contrib/infback9/inftree9.c b/3rdparty/zlib/contrib/infback9/inftree9.c
index dc38f24de96..ac707ed3fbd 100644
--- a/3rdparty/zlib/contrib/infback9/inftree9.c
+++ b/3rdparty/zlib/contrib/infback9/inftree9.c
@@ -1,5 +1,5 @@
/* inftree9.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2023 Mark Adler
+ * Copyright (C) 1995-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate9_copyright[] =
- " inflate9 1.3 Copyright 1995-2023 Mark Adler ";
+ " inflate9 1.3.1 Copyright 1995-2024 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -59,7 +59,7 @@ int inflate_table9(codetype type, unsigned short FAR *lens, unsigned codes,
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
- 133, 133, 133, 133, 144, 198, 203};
+ 133, 133, 133, 133, 144, 203, 77};
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
diff --git a/3rdparty/zlib/contrib/infback9/inftree9.h b/3rdparty/zlib/contrib/infback9/inftree9.h
index 2c1252f57de..ab2ea28b2ba 100644
--- a/3rdparty/zlib/contrib/infback9/inftree9.h
+++ b/3rdparty/zlib/contrib/infback9/inftree9.h
@@ -41,8 +41,8 @@ typedef struct {
examples/enough.c found in the zlib distribution. The arguments to that
program are the number of symbols, the initial root table size, and the
maximum bit length of a code. "enough 286 9 15" for literal/length codes
- returns returns 852, and "enough 32 6 15" for distance codes returns 594.
- The initial root table size (9 or 6) is found in the fifth argument of the
+ returns 852, and "enough 32 6 15" for distance codes returns 594. The
+ initial root table size (9 or 6) is found in the fifth argument of the
inflate_table() calls in infback9.c. If the root table size is changed,
then these maximum sizes would be need to be recalculated and updated. */
#define ENOUGH_LENS 852
diff --git a/3rdparty/zlib/contrib/iostream3/zfstream.h b/3rdparty/zlib/contrib/iostream3/zfstream.h
index 8574479ae1e..3dabc0f97d5 100644
--- a/3rdparty/zlib/contrib/iostream3/zfstream.h
+++ b/3rdparty/zlib/contrib/iostream3/zfstream.h
@@ -413,7 +413,7 @@ template<typename T1, typename T2>
class gzomanip2
{
public:
- // Allows insertor to peek at internals
+ // Allows inserter to peek at internals
template <typename Ta, typename Tb>
friend gzofstream&
operator<<(gzofstream&,
@@ -452,7 +452,7 @@ template<typename T1, typename T2>
: func(f), val1(v1), val2(v2)
{ }
-// Insertor applies underlying manipulator function to stream
+// Inserter applies underlying manipulator function to stream
template<typename T1, typename T2>
inline gzofstream&
operator<<(gzofstream& s, const gzomanip2<T1,T2>& m)
diff --git a/3rdparty/zlib/contrib/minizip/Makefile b/3rdparty/zlib/contrib/minizip/Makefile
index aac76e07f6b..3d927ec149e 100644
--- a/3rdparty/zlib/contrib/minizip/Makefile
+++ b/3rdparty/zlib/contrib/minizip/Makefile
@@ -1,4 +1,4 @@
-CC=cc
+CC?=cc
CFLAGS := $(CFLAGS) -O -I../..
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
diff --git a/3rdparty/zlib/contrib/minizip/configure.ac b/3rdparty/zlib/contrib/minizip/configure.ac
index df80e5b7e13..15ec917189c 100644
--- a/3rdparty/zlib/contrib/minizip/configure.ac
+++ b/3rdparty/zlib/contrib/minizip/configure.ac
@@ -1,7 +1,7 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
-AC_INIT([minizip], [1.3.0], [bugzilla.redhat.com])
+AC_INIT([minizip], [1.3.1], [bugzilla.redhat.com])
AC_CONFIG_SRCDIR([minizip.c])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
diff --git a/3rdparty/zlib/contrib/minizip/ioapi.h b/3rdparty/zlib/contrib/minizip/ioapi.h
index c588a18d034..a2d2e6e60d9 100644
--- a/3rdparty/zlib/contrib/minizip/ioapi.h
+++ b/3rdparty/zlib/contrib/minizip/ioapi.h
@@ -144,7 +144,7 @@ typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream)
typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uLong offset, int origin);
-/* here is the "old" 32 bits structure structure */
+/* here is the "old" 32 bits structure */
typedef struct zlib_filefunc_def_s
{
open_file_func zopen_file;
diff --git a/3rdparty/zlib/contrib/minizip/miniunz.c b/3rdparty/zlib/contrib/minizip/miniunz.c
index a12aec8bea2..d627c4226bc 100644
--- a/3rdparty/zlib/contrib/minizip/miniunz.c
+++ b/3rdparty/zlib/contrib/minizip/miniunz.c
@@ -79,7 +79,7 @@
/* change_file_date : change the date/time of a file
filename : the filename of the file where date/time must be modified
- dosdate : the new date at the MSDos format (4 bytes)
+ dosdate : the new date at the MSDOS format (4 bytes)
tmu_date : the SAME new date at the tm_unz format */
static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_date) {
#ifdef _WIN32
@@ -186,7 +186,7 @@ static int makedir(const char *newdir) {
}
static void do_banner(void) {
- printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
+ printf("MiniUnz 1.1, demo of zLib + Unz package written by Gilles Vollant\n");
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
}
@@ -356,6 +356,20 @@ static int do_extract_currentfile(unzFile uf, const int* popt_extract_without_pa
else
write_filename = filename_withoutpath;
+ if (write_filename[0]!='\0')
+ {
+ const char* relative_check = write_filename;
+ while (relative_check[1]!='\0')
+ {
+ if (relative_check[0]=='.' && relative_check[1]=='.')
+ write_filename = relative_check;
+ relative_check++;
+ }
+ }
+
+ while (write_filename[0]=='/' || write_filename[0]=='.')
+ write_filename++;
+
err = unzOpenCurrentFilePassword(uf,password);
if (err!=UNZ_OK)
{
diff --git a/3rdparty/zlib/contrib/minizip/unzip.c b/3rdparty/zlib/contrib/minizip/unzip.c
index ed763f89f1f..ea05b7d62a0 100644
--- a/3rdparty/zlib/contrib/minizip/unzip.c
+++ b/3rdparty/zlib/contrib/minizip/unzip.c
@@ -117,7 +117,7 @@
const char unz_copyright[] =
" unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
-/* unz_file_info_interntal contain internal info about a file in zipfile*/
+/* unz_file_info64_internal contain internal info about a file in zipfile*/
typedef struct unz_file_info64_internal_s
{
ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
@@ -450,7 +450,7 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
return CENTRALDIRINVALID;
- /* number of the disk with the start of the zip64 end of central directory */
+ /* number of the disk with the start of the zip64 end of central directory */
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
return CENTRALDIRINVALID;
if (uL != 0)
@@ -497,9 +497,9 @@ local unzFile unzOpenInternal(const void *path,
ZPOS64_T central_pos;
uLong uL;
- uLong number_disk; /* number of the current dist, used for
+ uLong number_disk; /* number of the current disk, used for
spanning ZIP, unsupported, always 0*/
- uLong number_disk_with_CD; /* number the the disk with central dir, used
+ uLong number_disk_with_CD; /* number the disk with central dir, used
for spanning ZIP, unsupported, always 0*/
ZPOS64_T number_entry_CD; /* total number of entries in
the central dir
diff --git a/3rdparty/zlib/contrib/minizip/unzip.h b/3rdparty/zlib/contrib/minizip/unzip.h
index 14105840f6d..5cfc9c6274e 100644
--- a/3rdparty/zlib/contrib/minizip/unzip.h
+++ b/3rdparty/zlib/contrib/minizip/unzip.h
@@ -306,7 +306,7 @@ extern int ZEXPORT unzGetCurrentFileInfo(unzFile file,
Get Info about the current file
if pfile_info!=NULL, the *pfile_info structure will contain some info about
the current file
- if szFileName!=NULL, the filemane string will be copied in szFileName
+ if szFileName!=NULL, the filename string will be copied in szFileName
(fileNameBufferSize is the size of the buffer)
if extraField!=NULL, the extra field information will be copied in extraField
(extraFieldBufferSize is the size of the buffer).
diff --git a/3rdparty/zlib/contrib/minizip/zip.c b/3rdparty/zlib/contrib/minizip/zip.c
index 3d3d4caddef..60bdffac348 100644
--- a/3rdparty/zlib/contrib/minizip/zip.c
+++ b/3rdparty/zlib/contrib/minizip/zip.c
@@ -575,7 +575,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
return 0;
- /* number of the disk with the start of the zip64 end of central directory */
+ /* number of the disk with the start of the zip64 end of central directory */
if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
return 0;
if (uL != 0)
@@ -614,9 +614,9 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit) {
ZPOS64_T central_pos;
uLong uL;
- uLong number_disk; /* number of the current dist, used for
+ uLong number_disk; /* number of the current disk, used for
spanning ZIP, unsupported, always 0*/
- uLong number_disk_with_CD; /* number the the disk with central dir, used
+ uLong number_disk_with_CD; /* number of the disk with central dir, used
for spanning ZIP, unsupported, always 0*/
ZPOS64_T number_entry;
ZPOS64_T number_entry_CD; /* total number of entries in
@@ -1043,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c
return ZIP_PARAMERROR;
#endif
+ // The filename and comment length must fit in 16 bits.
+ if ((filename!=NULL) && (strlen(filename)>0xffff))
+ return ZIP_PARAMERROR;
+ if ((comment!=NULL) && (strlen(comment)>0xffff))
+ return ZIP_PARAMERROR;
+ // The extra field length must fit in 16 bits. If the member also requires
+ // a Zip64 extra block, that will also need to fit within that 16-bit
+ // length, but that will be checked for later.
+ if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff))
+ return ZIP_PARAMERROR;
+
zi = (zip64_internal*)file;
if (zi->in_opened_file_inzip == 1)
@@ -1597,7 +1608,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_si
if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree)
{
- // we can not write more data to the buffer that we have room for.
+ // we cannot write more data to the buffer that we have room for.
return ZIP_BADZIPFILE;
}
@@ -1861,7 +1872,7 @@ extern int ZEXPORT zipClose(zipFile file, const char* global_comment) {
free_linkedlist(&(zi->central_dir));
pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
- if(pos >= 0xffffffff || zi->number_entry > 0xFFFF)
+ if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF)
{
ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream);
Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip);
diff --git a/3rdparty/zlib/contrib/minizip/zip.h b/3rdparty/zlib/contrib/minizip/zip.h
index 5fc08413241..3e230d3405f 100644
--- a/3rdparty/zlib/contrib/minizip/zip.h
+++ b/3rdparty/zlib/contrib/minizip/zip.h
@@ -177,9 +177,9 @@ extern int ZEXPORT zipOpenNewFileInZip64(zipFile file,
filename : the filename in zip (if NULL, '-' without quote will be used
*zipfi contain supplemental information
if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
- contains the extrafield data the the local header
+ contains the extrafield data for the local header
if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
- contains the extrafield data the the local header
+ contains the extrafield data for the global header
if comment != NULL, comment contain the comment string
method contain the compression method (0 for store, Z_DEFLATED for deflate)
level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
diff --git a/3rdparty/zlib/contrib/nuget/nuget.csproj b/3rdparty/zlib/contrib/nuget/nuget.csproj
new file mode 100644
index 00000000000..68627f034aa
--- /dev/null
+++ b/3rdparty/zlib/contrib/nuget/nuget.csproj
@@ -0,0 +1,43 @@
+<Project Sdk="Microsoft.Build.NoTargets/3.5.6">
+
+ <PropertyGroup>
+ <TargetFramework>net6.0</TargetFramework>
+ <PackageId>madler.zlib.redist</PackageId>
+ <PackageId Condition="$([MSBuild]::IsOSPlatform('Windows'))">$(PackageId).win</PackageId>
+ <PackageId Condition="$([MSBuild]::IsOSPlatform('Linux'))">$(PackageId).linux</PackageId>
+ <PackageId Condition="$([MSBuild]::IsOSPlatform('OSX'))">$(PackageId).osx</PackageId>
+ <Copyright>(C) 1995-2024 Jean-loup Gailly and Mark Adler</Copyright>
+ <version>1.3.1</version>
+ <PackageDescription>NuGet Package for consuming native builds of zlib into .NET without complexity.</PackageDescription>
+ <!--
+ Warns about not having any lib or ref assemblies (.NET Assemblies) in those directories.
+ Native only packages that is to be consumed in .NET should not require these.
+ -->
+ <NoWarn>NU5128</NoWarn>
+ <PackageOutputPath>$(MSBuildProjectDirectory)</PackageOutputPath>
+ <Authors>Jean-loup Gailly and Mark Adler</Authors>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <None Include="../../LICENSE" Pack="true" PackagePath="" />
+ <!-- Package up Windows builds. -->
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/x86/ZlibDll$(Configuration)/zlibwapi.dll" Pack="true" PackagePath="runtimes/win-x86/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/x64/ZlibDll$(Configuration)/zlibwapi.dll" Pack="true" PackagePath="runtimes/win-x64/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/arm/ZlibDll$(Configuration)/zlibwapi.dll" Pack="true" PackagePath="runtimes/win-arm/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/arm64/ZlibDll$(Configuration)/zlibwapi.dll" Pack="true" PackagePath="runtimes/win-arm64/native" />
+ <!-- Include debug symbols as well as we never know if they might actually be needed in the future. -->
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/x86/ZlibDll$(Configuration)/zlibwapi.pdb" Pack="true" PackagePath="runtimes/win-x86/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/x64/ZlibDll$(Configuration)/zlibwapi.pdb" Pack="true" PackagePath="runtimes/win-x64/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/arm/ZlibDll$(Configuration)/zlibwapi.pdb" Pack="true" PackagePath="runtimes/win-arm/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="../vstudio/vc17/arm64/ZlibDll$(Configuration)/zlibwapi.pdb" Pack="true" PackagePath="runtimes/win-arm64/native" />
+ <!-- Package up Linux builds. -->
+ <None Condition="$([MSBuild]::IsOSPlatform('Linux'))" Include="./linux-x86/libz.so" Pack="true" PackagePath="runtimes/linux-x86/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Linux'))" Include="./linux-x64/libz.so" Pack="true" PackagePath="runtimes/linux-x64/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Linux'))" Include="./linux-arm/libz.so" Pack="true" PackagePath="runtimes/linux-arm/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('Linux'))" Include="./linux-arm64/libz.so" Pack="true" PackagePath="runtimes/linux-arm64/native" />
+ <!-- Package up MacOS builds. -->
+ <None Condition="$([MSBuild]::IsOSPlatform('OSX'))" Include="./osx-x64/libz.dylib" Pack="true" PackagePath="runtimes/osx-x64/native" />
+ <None Condition="$([MSBuild]::IsOSPlatform('OSX'))" Include="./osx-arm64/libz.dylib" Pack="true" PackagePath="runtimes/osx-arm64/native" />
+ </ItemGroup>
+
+</Project>
diff --git a/3rdparty/zlib/contrib/nuget/nuget.sln b/3rdparty/zlib/contrib/nuget/nuget.sln
new file mode 100644
index 00000000000..46ee8deab8f
--- /dev/null
+++ b/3rdparty/zlib/contrib/nuget/nuget.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nuget", "nuget.csproj", "{B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/3rdparty/zlib/contrib/pascal/zlibpas.pas b/3rdparty/zlib/contrib/pascal/zlibpas.pas
index a2b24a593fa..0cf0e7b82dc 100644
--- a/3rdparty/zlib/contrib/pascal/zlibpas.pas
+++ b/3rdparty/zlib/contrib/pascal/zlibpas.pas
@@ -10,7 +10,7 @@ unit zlibpas;
interface
const
- ZLIB_VERSION = '1.3.0';
+ ZLIB_VERSION = '1.3.1';
ZLIB_VERNUM = $12a0;
type
diff --git a/3rdparty/zlib/contrib/puff/puff.c b/3rdparty/zlib/contrib/puff/puff.c
index 6737ff6153f..d759825ab1d 100644
--- a/3rdparty/zlib/contrib/puff/puff.c
+++ b/3rdparty/zlib/contrib/puff/puff.c
@@ -593,10 +593,10 @@ local int fixed(struct state *s)
* provided for each of the literal/length symbols, and for each of the
* distance symbols.
*
- * - If a symbol is not used in the block, this is represented by a zero as
- * as the code length. This does not mean a zero-length code, but rather
- * that no code should be created for this symbol. There is no way in the
- * deflate format to represent a zero-length code.
+ * - If a symbol is not used in the block, this is represented by a zero as the
+ * code length. This does not mean a zero-length code, but rather that no
+ * code should be created for this symbol. There is no way in the deflate
+ * format to represent a zero-length code.
*
* - The maximum number of bits in a code is 15, so the possible lengths for
* any code are 1..15.
diff --git a/3rdparty/zlib/contrib/vstudio/readme.txt b/3rdparty/zlib/contrib/vstudio/readme.txt
index 8f6a677c60b..061bbc0e2d7 100644
--- a/3rdparty/zlib/contrib/vstudio/readme.txt
+++ b/3rdparty/zlib/contrib/vstudio/readme.txt
@@ -1,4 +1,4 @@
-Building instructions for the DLL versions of Zlib 1.3.0
+Building instructions for the DLL versions of Zlib 1.3.1
========================================================
This directory contains projects that build zlib and minizip using
@@ -40,6 +40,12 @@ Build instructions for Visual Studio 2015 (32 bits or 64 bits)
- Decompress current zlib, including all contrib/* files
- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015
+Build instructions for Visual Studio 2022 (64 bits)
+--------------------------------------------------------------
+- Decompress current zlib, including all contrib/* files
+- Open contrib\vstudio\vc143\zlibvc.sln with Microsoft Visual C++ 2022
+
+
Important
---------
@@ -71,5 +77,5 @@ Additional notes
Gilles Vollant
info@winimage.com
-Visual Studio 2013 and 2015 Projects from Sean Hunt
+Visual Studio 2013, 2015, and 2022 Projects from Sean Hunt
seandhunt_7@yahoo.com
diff --git a/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc
index 57fb31a3216..a55f341c74c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 3, 0, 0
- PRODUCTVERSION 1, 3, 0, 0
+ FILEVERSION 1, 3, 1, 0
+ PRODUCTVERSION 1, 3, 1, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.3.0\0"
+ VALUE "FileVersion", "1.3.1\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2023 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc10/zlibvc.def b/3rdparty/zlib/contrib/vstudio/vc10/zlibvc.def
index c34923505a0..53947cc31b7 100644
--- a/3rdparty/zlib/contrib/vstudio/vc10/zlibvc.def
+++ b/3rdparty/zlib/contrib/vstudio/vc10/zlibvc.def
@@ -1,7 +1,7 @@
LIBRARY
; zlib data compression and ZIP file I/O library
-VERSION 1.3
+VERSION 1.3.1
EXPORTS
adler32 @1
diff --git a/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc
index 57fb31a3216..a55f341c74c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 3, 0, 0
- PRODUCTVERSION 1, 3, 0, 0
+ FILEVERSION 1, 3, 1, 0
+ PRODUCTVERSION 1, 3, 1, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.3.0\0"
+ VALUE "FileVersion", "1.3.1\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2023 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc11/zlibvc.def b/3rdparty/zlib/contrib/vstudio/vc11/zlibvc.def
index c34923505a0..53947cc31b7 100644
--- a/3rdparty/zlib/contrib/vstudio/vc11/zlibvc.def
+++ b/3rdparty/zlib/contrib/vstudio/vc11/zlibvc.def
@@ -1,7 +1,7 @@
LIBRARY
; zlib data compression and ZIP file I/O library
-VERSION 1.3
+VERSION 1.3.1
EXPORTS
adler32 @1
diff --git a/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc
index 57fb31a3216..a55f341c74c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 3, 0, 0
- PRODUCTVERSION 1, 3, 0, 0
+ FILEVERSION 1, 3, 1, 0
+ PRODUCTVERSION 1, 3, 1, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.3.0\0"
+ VALUE "FileVersion", "1.3.1\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2023 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc12/zlibvc.def b/3rdparty/zlib/contrib/vstudio/vc12/zlibvc.def
index c34923505a0..53947cc31b7 100644
--- a/3rdparty/zlib/contrib/vstudio/vc12/zlibvc.def
+++ b/3rdparty/zlib/contrib/vstudio/vc12/zlibvc.def
@@ -1,7 +1,7 @@
LIBRARY
; zlib data compression and ZIP file I/O library
-VERSION 1.3
+VERSION 1.3.1
EXPORTS
adler32 @1
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc
index 57fb31a3216..a55f341c74c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 3, 0, 0
- PRODUCTVERSION 1, 3, 0, 0
+ FILEVERSION 1, 3, 1, 0
+ PRODUCTVERSION 1, 3, 1, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.3.0\0"
+ VALUE "FileVersion", "1.3.1\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2023 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.def b/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.def
index c34923505a0..53947cc31b7 100644
--- a/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.def
+++ b/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.def
@@ -1,7 +1,7 @@
LIBRARY
; zlib data compression and ZIP file I/O library
-VERSION 1.3
+VERSION 1.3.1
EXPORTS
adler32 @1
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/miniunz.vcxproj b/3rdparty/zlib/contrib/vstudio/vc17/miniunz.vcxproj
new file mode 100644
index 00000000000..68ef16588b2
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/miniunz.vcxproj
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694382A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <OutDir>arm64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir>arm64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <OutDir>arm64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir>arm64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <OutDir>arm\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir>arm\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <OutDir>arm\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir>arm\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\miniunz.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/minizip.vcxproj b/3rdparty/zlib/contrib/vstudio/vc17/minizip.vcxproj
new file mode 100644
index 00000000000..dd3c52e70c9
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/minizip.vcxproj
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <OutDir>arm64\MiniZip$(Configuration)\</OutDir>
+ <IntDir>arm64\MiniZip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <OutDir>arm64\MiniZip$(Configuration)\</OutDir>
+ <IntDir>arm64\MiniZip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <OutDir>arm\MiniZip$(Configuration)\</OutDir>
+ <IntDir>arm\MiniZip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <OutDir>arm\MiniZip$(Configuration)\</OutDir>
+ <IntDir>arm\MiniZip$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\minizip.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/testzlib.vcxproj b/3rdparty/zlib/contrib/vstudio/vc17/testzlib.vcxproj
new file mode 100644
index 00000000000..4cc99b3ffe1
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/testzlib.vcxproj
@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|ARM">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|ARM64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <RootNamespace>testzlib</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <OutDir>arm64\TestZlib$(Configuration)\</OutDir>
+ <IntDir>arm64\TestZlib$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <OutDir>arm64\TestZlib$(Configuration)\</OutDir>
+ <IntDir>arm64\TestZlib$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">
+ <OutDir>arm64\TestZlib$(Configuration)\</OutDir>
+ <IntDir>arm64\TestZlib$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <OutDir>arm\TestZlib$(Configuration)\</OutDir>
+ <IntDir>arm\TestZlib$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <OutDir>arm\TestZlib$(Configuration)\</OutDir>
+ <IntDir>arm\TestZlib$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">
+ <OutDir>arm\TestZlib$(Configuration)\</OutDir>
+ <IntDir>arm\TestZlib$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj b/3rdparty/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj
new file mode 100644
index 00000000000..73bba55da80
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694366A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <OutDir>arm64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <OutDir>arm64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <OutDir>arm\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <OutDir>arm\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc17/zlib.rc
new file mode 100644
index 00000000000..a55f341c74c
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1, 3, 1, 0
+ PRODUCTVERSION 1, 3, 1, 0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
+ VALUE "FileVersion", "1.3.1\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlibwapi.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/zlibstat.vcxproj b/3rdparty/zlib/contrib/vstudio/vc17/zlibstat.vcxproj
new file mode 100644
index 00000000000..b946ac2a90f
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/zlibstat.vcxproj
@@ -0,0 +1,602 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|ARM">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|ARM64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}</ProjectGuid>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <OutDir>arm64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir>arm64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <OutDir>arm64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir>arm64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">
+ <OutDir>arm64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir>arm64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <OutDir>arm\ZlibStat$(Configuration)\</OutDir>
+ <IntDir>arm\ZlibStat$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <OutDir>arm\ZlibStat$(Configuration)\</OutDir>
+ <IntDir>arm\ZlibStat$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">
+ <OutDir>arm\ZlibStat$(Configuration)\</OutDir>
+ <IntDir>arm\ZlibStat$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Midl />
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl />
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Midl />
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">
+ <Midl />
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">
+ <Midl />
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c" />
+ <ClCompile Include="..\..\minizip\zip.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.def b/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.def
new file mode 100644
index 00000000000..53947cc31b7
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.def
@@ -0,0 +1,158 @@
+LIBRARY
+; zlib data compression and ZIP file I/O library
+
+VERSION 1.3.1
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+ inflateCopy @42
+ inflateBackInit_ @43
+ inflateBack @44
+ inflateBackEnd @45
+ compressBound @46
+ deflateBound @47
+ gzclearerr @48
+ gzungetc @49
+ zlibCompileFlags @50
+ deflatePrime @51
+ deflatePending @52
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unzOpenCurrentFile3 @69
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+ unzOpen2 @77
+ unzOpenCurrentFile2 @78
+ unzOpenCurrentFilePassword @79
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
+ zipOpenNewFileInZip2 @86
+ zipCloseFileInZipRaw @87
+ zipOpen2 @88
+ zipOpenNewFileInZip3 @89
+
+ unzGetFilePos @100
+ unzGoToFilePos @101
+
+ fill_win32_filefunc @110
+
+; zlibwapi v1.2.4 added:
+ fill_win32_filefunc64 @111
+ fill_win32_filefunc64A @112
+ fill_win32_filefunc64W @113
+
+ unzOpen64 @120
+ unzOpen2_64 @121
+ unzGetGlobalInfo64 @122
+ unzGetCurrentFileInfo64 @124
+ unzGetCurrentFileZStreamPos64 @125
+ unztell64 @126
+ unzGetFilePos64 @127
+ unzGoToFilePos64 @128
+
+ zipOpen64 @130
+ zipOpen2_64 @131
+ zipOpenNewFileInZip64 @132
+ zipOpenNewFileInZip2_64 @133
+ zipOpenNewFileInZip3_64 @134
+ zipOpenNewFileInZip4_64 @135
+ zipCloseFileInZipRaw64 @136
+
+; zlib1 v1.2.4 added:
+ adler32_combine @140
+ crc32_combine @142
+ deflateSetHeader @144
+ deflateTune @145
+ gzbuffer @146
+ gzclose_r @147
+ gzclose_w @148
+ gzdirect @149
+ gzoffset @150
+ inflateGetHeader @156
+ inflateMark @157
+ inflatePrime @158
+ inflateReset2 @159
+ inflateUndermine @160
+
+; zlib1 v1.2.6 added:
+ gzgetc_ @161
+ inflateResetKeep @163
+ deflateResetKeep @164
+
+; zlib1 v1.2.7 added:
+ gzopen_w @165
+
+; zlib1 v1.2.8 added:
+ inflateGetDictionary @166
+ gzvprintf @167
+
+; zlib1 v1.2.9 added:
+ inflateCodesUsed @168
+ inflateValidate @169
+ uncompress2 @170
+ gzfread @171
+ gzfwrite @172
+ deflateGetDictionary @173
+ adler32_z @174
+ crc32_z @175
+
+; zlib1 v1.2.12 added:
+ crc32_combine_gen @176
+ crc32_combine_gen64 @177
+ crc32_combine_op @178
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.sln b/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.sln
new file mode 100644
index 00000000000..67896b7470d
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.sln
@@ -0,0 +1,179 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.4.33015.44
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ ReleaseWithoutAsm|ARM = ReleaseWithoutAsm|ARM
+ ReleaseWithoutAsm|ARM64 = ReleaseWithoutAsm|ARM64
+ ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
+ ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.Build.0 = Debug|ARM
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.ActiveCfg = Release|ARM
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.Build.0 = Release|ARM
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.Build.0 = Release|ARM64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.ActiveCfg = Debug|ARM
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.Build.0 = Debug|ARM
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.Build.0 = Debug|ARM64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.ActiveCfg = Release|ARM
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.Build.0 = Release|ARM
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.ActiveCfg = Release|ARM64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.Build.0 = Release|ARM64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.ActiveCfg = Debug|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.Build.0 = Debug|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.Build.0 = Debug|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.ActiveCfg = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.Build.0 = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.ActiveCfg = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.Build.0 = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.ActiveCfg = Debug|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.Build.0 = Debug|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.Build.0 = Debug|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.ActiveCfg = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.Build.0 = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.ActiveCfg = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.Build.0 = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {EAA58685-56D9-43F2-8703-FD2CB020745E}
+ EndGlobalSection
+EndGlobal
diff --git a/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.vcxproj b/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.vcxproj
new file mode 100644
index 00000000000..10a7a901efe
--- /dev/null
+++ b/3rdparty/zlib/contrib/vstudio/vc17/zlibvc.vcxproj
@@ -0,0 +1,875 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|ARM">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|ARM64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8FD826F8-3739-44E6-8CC8-997122E53B8D}</ProjectGuid>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</GenerateManifest>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" />
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">zlibwapi</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <OutDir>arm64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <OutDir>arm\ZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm\ZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <OutDir>arm64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">
+ <OutDir>arm64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <OutDir>arm\ZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm\ZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">
+ <OutDir>arm\ZlibDll$(Configuration)\</OutDir>
+ <IntDir>arm\ZlibDll$(Configuration)\Tmp\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|ARM'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\minizip\iowin32.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\deflate.h" />
+ <ClInclude Include="..\..\..\infblock.h" />
+ <ClInclude Include="..\..\..\infcodes.h" />
+ <ClInclude Include="..\..\..\inffast.h" />
+ <ClInclude Include="..\..\..\inftrees.h" />
+ <ClInclude Include="..\..\..\infutil.h" />
+ <ClInclude Include="..\..\..\zconf.h" />
+ <ClInclude Include="..\..\..\zlib.h" />
+ <ClInclude Include="..\..\..\zutil.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc
index 57fb31a3216..a55f341c74c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 3, 0, 0
- PRODUCTVERSION 1, 3, 0, 0
+ FILEVERSION 1, 3, 1, 0
+ PRODUCTVERSION 1, 3, 1, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.3.0\0"
+ VALUE "FileVersion", "1.3.1\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2023 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc9/zlibvc.def b/3rdparty/zlib/contrib/vstudio/vc9/zlibvc.def
index c34923505a0..53947cc31b7 100644
--- a/3rdparty/zlib/contrib/vstudio/vc9/zlibvc.def
+++ b/3rdparty/zlib/contrib/vstudio/vc9/zlibvc.def
@@ -1,7 +1,7 @@
LIBRARY
; zlib data compression and ZIP file I/O library
-VERSION 1.3
+VERSION 1.3.1
EXPORTS
adler32 @1
diff --git a/3rdparty/zlib/deflate.c b/3rdparty/zlib/deflate.c
index bd011751920..012ea8148e8 100644
--- a/3rdparty/zlib/deflate.c
+++ b/3rdparty/zlib/deflate.c
@@ -1,5 +1,5 @@
/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -52,7 +52,7 @@
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.3 Copyright 1995-2023 Jean-loup Gailly and Mark Adler ";
+ " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -493,7 +493,7 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
* symbols from which it is being constructed.
*/
- s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
+ s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS);
s->pending_buf_size = (ulg)s->lit_bufsize * 4;
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
@@ -503,8 +503,14 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
deflateEnd (strm);
return Z_MEM_ERROR;
}
+#ifdef LIT_MEM
+ s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1));
+ s->l_buf = s->pending_buf + (s->lit_bufsize << 2);
+ s->sym_end = s->lit_bufsize - 1;
+#else
s->sym_buf = s->pending_buf + s->lit_bufsize;
s->sym_end = (s->lit_bufsize - 1) * 3;
+#endif
/* We avoid equality with lit_bufsize*3 because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64K-1 bytes.
@@ -720,9 +726,15 @@ int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) {
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
s = strm->state;
+#ifdef LIT_MEM
+ if (bits < 0 || bits > 16 ||
+ (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3))
+ return Z_BUF_ERROR;
+#else
if (bits < 0 || bits > 16 ||
s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
return Z_BUF_ERROR;
+#endif
do {
put = Buf_size - s->bi_valid;
if (put > bits)
@@ -1294,7 +1306,7 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
- ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
+ ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS);
if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
ds->pending_buf == Z_NULL) {
@@ -1305,10 +1317,15 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
- zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+ zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS);
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+#ifdef LIT_MEM
+ ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1));
+ ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2);
+#else
ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
+#endif
ds->l_desc.dyn_tree = ds->dyn_ltree;
ds->d_desc.dyn_tree = ds->dyn_dtree;
@@ -1539,13 +1556,21 @@ local uInt longest_match(deflate_state *s, IPos cur_match) {
*/
local void check_match(deflate_state *s, IPos start, IPos match, int length) {
/* check that the match is indeed a match */
- if (zmemcmp(s->window + match,
- s->window + start, length) != EQUAL) {
- fprintf(stderr, " start %u, match %u, length %d\n",
- start, match, length);
+ Bytef *back = s->window + (int)match, *here = s->window + start;
+ IPos len = length;
+ if (match == (IPos)-1) {
+ /* match starts one byte before the current window -- just compare the
+ subsequent length-1 bytes */
+ back++;
+ here++;
+ len--;
+ }
+ if (zmemcmp(back, here, len) != EQUAL) {
+ fprintf(stderr, " start %u, match %d, length %d\n",
+ start, (int)match, length);
do {
- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
- } while (--length != 0);
+ fprintf(stderr, "(%02x %02x)", *back++, *here++);
+ } while (--len != 0);
z_error("invalid match");
}
if (z_verbose > 1) {
diff --git a/3rdparty/zlib/deflate.h b/3rdparty/zlib/deflate.h
index 8696791429f..300c6ada62b 100644
--- a/3rdparty/zlib/deflate.h
+++ b/3rdparty/zlib/deflate.h
@@ -1,5 +1,5 @@
/* deflate.h -- internal compression state
- * Copyright (C) 1995-2018 Jean-loup Gailly
+ * Copyright (C) 1995-2024 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -23,6 +23,10 @@
# define GZIP
#endif
+/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at
+ the cost of a larger memory footprint */
+/* #define LIT_MEM */
+
/* ===========================================================================
* Internal compression state.
*/
@@ -217,7 +221,14 @@ typedef struct internal_state {
/* Depth of each subtree used as tie breaker for trees of equal frequency
*/
+#ifdef LIT_MEM
+# define LIT_BUFS 5
+ ushf *d_buf; /* buffer for distances */
+ uchf *l_buf; /* buffer for literals/lengths */
+#else
+# define LIT_BUFS 4
uchf *sym_buf; /* buffer for distances and literals/lengths */
+#endif
uInt lit_bufsize;
/* Size of match buffer for literals/lengths. There are 4 reasons for
@@ -239,7 +250,7 @@ typedef struct internal_state {
* - I can't count above 4
*/
- uInt sym_next; /* running index in sym_buf */
+ uInt sym_next; /* running index in symbol buffer */
uInt sym_end; /* symbol table full when sym_next reaches this */
ulg opt_len; /* bit length of current block with optimal trees */
@@ -318,6 +329,25 @@ void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
extern const uch ZLIB_INTERNAL _dist_code[];
#endif
+#ifdef LIT_MEM
+# define _tr_tally_lit(s, c, flush) \
+ { uch cc = (c); \
+ s->d_buf[s->sym_next] = 0; \
+ s->l_buf[s->sym_next++] = cc; \
+ s->dyn_ltree[cc].Freq++; \
+ flush = (s->sym_next == s->sym_end); \
+ }
+# define _tr_tally_dist(s, distance, length, flush) \
+ { uch len = (uch)(length); \
+ ush dist = (ush)(distance); \
+ s->d_buf[s->sym_next] = dist; \
+ s->l_buf[s->sym_next++] = len; \
+ dist--; \
+ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+ s->dyn_dtree[d_code(dist)].Freq++; \
+ flush = (s->sym_next == s->sym_end); \
+ }
+#else
# define _tr_tally_lit(s, c, flush) \
{ uch cc = (c); \
s->sym_buf[s->sym_next++] = 0; \
@@ -337,6 +367,7 @@ void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
s->dyn_dtree[d_code(dist)].Freq++; \
flush = (s->sym_next == s->sym_end); \
}
+#endif
#else
# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
# define _tr_tally_dist(s, distance, length, flush) \
diff --git a/3rdparty/zlib/doc/algorithm.txt b/3rdparty/zlib/doc/algorithm.txt
index c97f495020b..029e5a31349 100644
--- a/3rdparty/zlib/doc/algorithm.txt
+++ b/3rdparty/zlib/doc/algorithm.txt
@@ -77,7 +77,7 @@ table took no time (and if you had infinite memory), then there would only
be a first level table to cover all the way to the longest code. However,
building the table ends up taking a lot longer for more bits since short
codes are replicated many times in such a table. What inflate() does is
-simply to make the number of bits in the first table a variable, and then
+simply to make the number of bits in the first table a variable, and then
to set that variable for the maximum speed.
For inflate, which has 286 possible codes for the literal/length tree, the size
diff --git a/3rdparty/zlib/examples/gzlog.c b/3rdparty/zlib/examples/gzlog.c
index b977802dd6e..da1b02e7337 100644
--- a/3rdparty/zlib/examples/gzlog.c
+++ b/3rdparty/zlib/examples/gzlog.c
@@ -212,8 +212,8 @@
to the appropriate recovery below. If there is no foo.add file, provide
a zero data length to the recovery. In that case, the append recovery
restores the foo.gz to the previous compressed + uncompressed data state.
- For the the compress recovery, a missing foo.add file results in foo.gz
- being restored to the previous compressed-only data state.
+ For the compress recovery, a missing foo.add file results in foo.gz being
+ restored to the previous compressed-only data state.
- Append recovery:
- Pick up append at + step above
- Compress recovery:
diff --git a/3rdparty/zlib/examples/zran.c b/3rdparty/zlib/examples/zran.c
index 32c93686c60..d3135955b02 100644
--- a/3rdparty/zlib/examples/zran.c
+++ b/3rdparty/zlib/examples/zran.c
@@ -267,7 +267,7 @@ static inline void append_bits(unsigned value, int bits,
}
}
-// Insert enough bits in the form of empty deflate blocks in front of the the
+// Insert enough bits in the form of empty deflate blocks in front of the
// low bits bits of value, in order to bring the sequence to a byte boundary.
// Then feed that to inflate(). This does what inflatePrime() does, except that
// a negative value of bits is not supported. bits must be in 0..16. If the
diff --git a/3rdparty/zlib/gzguts.h b/3rdparty/zlib/gzguts.h
index f9375047e8c..eba72085bb7 100644
--- a/3rdparty/zlib/gzguts.h
+++ b/3rdparty/zlib/gzguts.h
@@ -1,5 +1,5 @@
/* gzguts.h -- zlib internal header definitions for gz* operations
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -210,9 +210,5 @@ char ZLIB_INTERNAL *gz_strwinerror(DWORD error);
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
value -- needed when comparing unsigned to z_off64_t, which is signed
(possible z_off64_t types off_t, off64_t, and long are all signed) */
-#ifdef INT_MAX
-# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
-#else
unsigned ZLIB_INTERNAL gz_intmax(void);
-# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
-#endif
+#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
diff --git a/3rdparty/zlib/gzlib.c b/3rdparty/zlib/gzlib.c
index 29fc4486fba..983153cc8e4 100644
--- a/3rdparty/zlib/gzlib.c
+++ b/3rdparty/zlib/gzlib.c
@@ -1,5 +1,5 @@
/* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004-2019 Mark Adler
+ * Copyright (C) 2004-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -563,20 +563,20 @@ void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) {
#endif
}
-#ifndef INT_MAX
/* portably return maximum value for an int (when limits.h presumed not
available) -- we need to do this to cover cases where 2's complement not
used, since C standard permits 1's complement and sign-bit representations,
otherwise we could just use ((unsigned)-1) >> 1 */
unsigned ZLIB_INTERNAL gz_intmax(void) {
- unsigned p, q;
-
- p = 1;
+#ifdef INT_MAX
+ return INT_MAX;
+#else
+ unsigned p = 1, q;
do {
q = p;
p <<= 1;
p++;
} while (p > q);
return q >> 1;
-}
#endif
+}
diff --git a/3rdparty/zlib/inflate.c b/3rdparty/zlib/inflate.c
index b0757a9b249..94ecff015a9 100644
--- a/3rdparty/zlib/inflate.c
+++ b/3rdparty/zlib/inflate.c
@@ -1387,7 +1387,7 @@ int ZEXPORT inflateSync(z_streamp strm) {
/* if first time, start search in bit buffer */
if (state->mode != SYNC) {
state->mode = SYNC;
- state->hold <<= state->bits & 7;
+ state->hold >>= state->bits & 7;
state->bits -= state->bits & 7;
len = 0;
while (state->bits >= 8) {
diff --git a/3rdparty/zlib/inftrees.c b/3rdparty/zlib/inftrees.c
index 8a208c2daa8..98cfe164458 100644
--- a/3rdparty/zlib/inftrees.c
+++ b/3rdparty/zlib/inftrees.c
@@ -1,5 +1,5 @@
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2023 Mark Adler
+ * Copyright (C) 1995-2024 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.3 Copyright 1995-2023 Mark Adler ";
+ " inflate 1.3.1 Copyright 1995-2024 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -57,7 +57,7 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 198, 203};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
diff --git a/3rdparty/zlib/inftrees.h b/3rdparty/zlib/inftrees.h
index a10712d8cb5..396f74b5da7 100644
--- a/3rdparty/zlib/inftrees.h
+++ b/3rdparty/zlib/inftrees.h
@@ -41,8 +41,8 @@ typedef struct {
examples/enough.c found in the zlib distribution. The arguments to that
program are the number of symbols, the initial root table size, and the
maximum bit length of a code. "enough 286 9 15" for literal/length codes
- returns returns 852, and "enough 30 6 15" for distance codes returns 592.
- The initial root table size (9 or 6) is found in the fifth argument of the
+ returns 852, and "enough 30 6 15" for distance codes returns 592. The
+ initial root table size (9 or 6) is found in the fifth argument of the
inflate_table() calls in inflate.c and infback.c. If the root table size is
changed, then these maximum sizes would be need to be recalculated and
updated. */
diff --git a/3rdparty/zlib/old/visual-basic.txt b/3rdparty/zlib/old/visual-basic.txt
index 57efe58124e..3c8d2a42dfc 100644
--- a/3rdparty/zlib/old/visual-basic.txt
+++ b/3rdparty/zlib/old/visual-basic.txt
@@ -115,7 +115,7 @@ SUCCESS Then
ReDim Preserve bytaryCpr(lngCprSiz - 1)
Open strCprPth For Binary Access Write As #1
Put #1, , bytaryCpr()
- Put #1, , lngOriSiz 'Add the the original size value to the end
+ Put #1, , lngOriSiz 'Add the original size value to the end
(last 4 bytes)
Close #1
Else
diff --git a/3rdparty/zlib/os400/README400 b/3rdparty/zlib/os400/README400
index 6dd41aa6510..30ed5a12c68 100644
--- a/3rdparty/zlib/os400/README400
+++ b/3rdparty/zlib/os400/README400
@@ -1,4 +1,4 @@
- ZLIB version 1.3.0 for OS/400 installation instructions
+ ZLIB version 1.3.1 for OS/400 installation instructions
1) Download and unpack the zlib tarball to some IFS directory.
(i.e.: /path/to/the/zlib/ifs/source/directory)
diff --git a/3rdparty/zlib/os400/zlib.inc b/3rdparty/zlib/os400/zlib.inc
index 0d9e2f2090b..744729ab9dd 100644
--- a/3rdparty/zlib/os400/zlib.inc
+++ b/3rdparty/zlib/os400/zlib.inc
@@ -1,7 +1,7 @@
* ZLIB.INC - Interface to the general purpose compression library
*
* ILE RPG400 version by Patrick Monnerat, DATASPHERE.
- * Version 1.3.0
+ * Version 1.3.1
*
*
* WARNING:
@@ -22,12 +22,12 @@
*
* Versioning information.
*
- D ZLIB_VERSION C '1.3.0'
+ D ZLIB_VERSION C '1.3.1'
D ZLIB_VERNUM C X'12a0'
D ZLIB_VER_MAJOR C 1
D ZLIB_VER_MINOR C 3
D ZLIB_VER_REVISION...
- D C 0
+ D C 1
D ZLIB_VER_SUBREVISION...
D C 0
*
diff --git a/3rdparty/zlib/qnx/package.qpg b/3rdparty/zlib/qnx/package.qpg
index d882af2bfb3..4877e0ef013 100644
--- a/3rdparty/zlib/qnx/package.qpg
+++ b/3rdparty/zlib/qnx/package.qpg
@@ -25,10 +25,10 @@
<QPG:Files>
<QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
<QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
- <QPG:Add file="../libz.so.1.3.0" install="/opt/lib/" user="root:bin" permission="644"/>
- <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.3.0"/>
- <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.3.0"/>
- <QPG:Add file="../libz.so.1.3.0" install="/opt/lib/" component="slib"/>
+ <QPG:Add file="../libz.so.1.3.1" install="/opt/lib/" user="root:bin" permission="644"/>
+ <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.3.1"/>
+ <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.3.1"/>
+ <QPG:Add file="../libz.so.1.3.1" install="/opt/lib/" component="slib"/>
</QPG:Files>
<QPG:PackageFilter>
@@ -63,7 +63,7 @@
</QPM:ProductDescription>
<QPM:ReleaseDescription>
- <QPM:ReleaseVersion>1.3.0</QPM:ReleaseVersion>
+ <QPM:ReleaseVersion>1.3.1</QPM:ReleaseVersion>
<QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
<QPM:ReleaseStability>Stable</QPM:ReleaseStability>
<QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
diff --git a/3rdparty/zlib/test/example.c b/3rdparty/zlib/test/example.c
index 582a17a3ce9..c3521dd5934 100644
--- a/3rdparty/zlib/test/example.c
+++ b/3rdparty/zlib/test/example.c
@@ -36,12 +36,12 @@ static uLong dictId; /* Adler32 value of the dictionary */
#ifdef Z_SOLO
-void *myalloc(void *q, unsigned n, unsigned m) {
+static void *myalloc(void *q, unsigned n, unsigned m) {
(void)q;
return calloc(n, m);
}
-void myfree(void *q, void *p) {
+static void myfree(void *q, void *p) {
(void)q;
free(p);
}
@@ -57,7 +57,7 @@ static free_func zfree = (free_func)0;
/* ===========================================================================
* Test compress() and uncompress()
*/
-void test_compress(Byte *compr, uLong comprLen, Byte *uncompr,
+static void test_compress(Byte *compr, uLong comprLen, Byte *uncompr,
uLong uncomprLen) {
int err;
uLong len = (uLong)strlen(hello)+1;
@@ -81,7 +81,7 @@ void test_compress(Byte *compr, uLong comprLen, Byte *uncompr,
/* ===========================================================================
* Test read/write of .gz files
*/
-void test_gzio(const char *fname, Byte *uncompr, uLong uncomprLen) {
+static void test_gzio(const char *fname, Byte *uncompr, uLong uncomprLen) {
#ifdef NO_GZCOMPRESS
fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
#else
@@ -163,7 +163,7 @@ void test_gzio(const char *fname, Byte *uncompr, uLong uncomprLen) {
/* ===========================================================================
* Test deflate() with small buffers
*/
-void test_deflate(Byte *compr, uLong comprLen) {
+static void test_deflate(Byte *compr, uLong comprLen) {
z_stream c_stream; /* compression stream */
int err;
uLong len = (uLong)strlen(hello)+1;
@@ -198,7 +198,7 @@ void test_deflate(Byte *compr, uLong comprLen) {
/* ===========================================================================
* Test inflate() with small buffers
*/
-void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
+static void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
uLong uncomprLen) {
int err;
z_stream d_stream; /* decompression stream */
@@ -237,7 +237,7 @@ void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
/* ===========================================================================
* Test deflate() with large buffers and dynamic change of compression level
*/
-void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr,
+static void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr,
uLong uncomprLen) {
z_stream c_stream; /* compression stream */
int err;
@@ -290,7 +290,7 @@ void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr,
/* ===========================================================================
* Test inflate() with large buffers
*/
-void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
+static void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
uLong uncomprLen) {
int err;
z_stream d_stream; /* decompression stream */
@@ -329,7 +329,7 @@ void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
/* ===========================================================================
* Test deflate() with full flush
*/
-void test_flush(Byte *compr, uLong *comprLen) {
+static void test_flush(Byte *compr, uLong *comprLen) {
z_stream c_stream; /* compression stream */
int err;
uInt len = (uInt)strlen(hello)+1;
@@ -364,7 +364,8 @@ void test_flush(Byte *compr, uLong *comprLen) {
/* ===========================================================================
* Test inflateSync()
*/
-void test_sync(Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen) {
+static void test_sync(Byte *compr, uLong comprLen, Byte *uncompr,
+ uLong uncomprLen) {
int err;
z_stream d_stream; /* decompression stream */
@@ -404,7 +405,7 @@ void test_sync(Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen) {
/* ===========================================================================
* Test deflate() with preset dictionary
*/
-void test_dict_deflate(Byte *compr, uLong comprLen) {
+static void test_dict_deflate(Byte *compr, uLong comprLen) {
z_stream c_stream; /* compression stream */
int err;
@@ -438,7 +439,7 @@ void test_dict_deflate(Byte *compr, uLong comprLen) {
/* ===========================================================================
* Test inflate() with a preset dictionary
*/
-void test_dict_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
+static void test_dict_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
uLong uncomprLen) {
int err;
z_stream d_stream; /* decompression stream */
diff --git a/3rdparty/zlib/test/minigzip.c b/3rdparty/zlib/test/minigzip.c
index 8a21ddfb57e..134e10e6c3e 100644
--- a/3rdparty/zlib/test/minigzip.c
+++ b/3rdparty/zlib/test/minigzip.c
@@ -149,12 +149,12 @@ static void pwinerror (s)
# include <unistd.h> /* for unlink() */
#endif
-void *myalloc(void *q, unsigned n, unsigned m) {
+static void *myalloc(void *q, unsigned n, unsigned m) {
(void)q;
return calloc(n, m);
}
-void myfree(void *q, void *p) {
+static void myfree(void *q, void *p) {
(void)q;
free(p);
}
@@ -167,7 +167,7 @@ typedef struct gzFile_s {
z_stream strm;
} *gzFile;
-gzFile gz_open(const char *path, int fd, const char *mode) {
+static gzFile gz_open(const char *path, int fd, const char *mode) {
gzFile gz;
int ret;
@@ -201,15 +201,15 @@ gzFile gz_open(const char *path, int fd, const char *mode) {
return gz;
}
-gzFile gzopen(const char *path, const char *mode) {
+static gzFile gzopen(const char *path, const char *mode) {
return gz_open(path, -1, mode);
}
-gzFile gzdopen(int fd, const char *mode) {
+static gzFile gzdopen(int fd, const char *mode) {
return gz_open(NULL, fd, mode);
}
-int gzwrite(gzFile gz, const void *buf, unsigned len) {
+static int gzwrite(gzFile gz, const void *buf, unsigned len) {
z_stream *strm;
unsigned char out[BUFLEN];
@@ -227,7 +227,7 @@ int gzwrite(gzFile gz, const void *buf, unsigned len) {
return len;
}
-int gzread(gzFile gz, void *buf, unsigned len) {
+static int gzread(gzFile gz, void *buf, unsigned len) {
int ret;
unsigned got;
unsigned char in[1];
@@ -258,7 +258,7 @@ int gzread(gzFile gz, void *buf, unsigned len) {
return len - strm->avail_out;
}
-int gzclose(gzFile gz) {
+static int gzclose(gzFile gz) {
z_stream *strm;
unsigned char out[BUFLEN];
@@ -283,7 +283,7 @@ int gzclose(gzFile gz) {
return Z_OK;
}
-const char *gzerror(gzFile gz, int *err) {
+static const char *gzerror(gzFile gz, int *err) {
*err = gz->err;
return gz->msg;
}
@@ -295,7 +295,7 @@ static char *prog;
/* ===========================================================================
* Display error message and exit
*/
-void error(const char *msg) {
+static void error(const char *msg) {
fprintf(stderr, "%s: %s\n", prog, msg);
exit(1);
}
@@ -303,9 +303,9 @@ void error(const char *msg) {
#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */
/* Try compressing the input file at once using mmap. Return Z_OK if
- * if success, Z_ERRNO otherwise.
+ * success, Z_ERRNO otherwise.
*/
-int gz_compress_mmap(FILE *in, gzFile out) {
+static int gz_compress_mmap(FILE *in, gzFile out) {
int len;
int err;
int ifd = fileno(in);
@@ -338,7 +338,7 @@ int gz_compress_mmap(FILE *in, gzFile out) {
* Compress input to output then close both files.
*/
-void gz_compress(FILE *in, gzFile out) {
+static void gz_compress(FILE *in, gzFile out) {
local char buf[BUFLEN];
int len;
int err;
@@ -366,7 +366,7 @@ void gz_compress(FILE *in, gzFile out) {
/* ===========================================================================
* Uncompress input to output then close both files.
*/
-void gz_uncompress(gzFile in, FILE *out) {
+static void gz_uncompress(gzFile in, FILE *out) {
local char buf[BUFLEN];
int len;
int err;
@@ -390,7 +390,7 @@ void gz_uncompress(gzFile in, FILE *out) {
* Compress the given file: create a corresponding .gz file and remove the
* original.
*/
-void file_compress(char *file, char *mode) {
+static void file_compress(char *file, char *mode) {
local char outfile[MAX_NAME_LEN];
FILE *in;
gzFile out;
@@ -426,7 +426,7 @@ void file_compress(char *file, char *mode) {
/* ===========================================================================
* Uncompress the given file and remove the original.
*/
-void file_uncompress(char *file) {
+static void file_uncompress(char *file) {
local char buf[MAX_NAME_LEN];
char *infile, *outfile;
FILE *out;
diff --git a/3rdparty/zlib/treebuild.xml b/3rdparty/zlib/treebuild.xml
index 1d1b007707c..930b00be4a8 100644
--- a/3rdparty/zlib/treebuild.xml
+++ b/3rdparty/zlib/treebuild.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" ?>
-<package name="zlib" version="1.3">
- <library name="zlib" dlversion="1.3" dlname="z">
+<package name="zlib" version="1.3.1">
+ <library name="zlib" dlversion="1.3.1" dlname="z">
<property name="description"> zip compression library </property>
<property name="include-target-dir" value="$(@PACKAGE/install-includedir)" />
diff --git a/3rdparty/zlib/trees.c b/3rdparty/zlib/trees.c
index 8dbdc40bacc..6a523ef34e3 100644
--- a/3rdparty/zlib/trees.c
+++ b/3rdparty/zlib/trees.c
@@ -1,5 +1,5 @@
/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2021 Jean-loup Gailly
+ * Copyright (C) 1995-2024 Jean-loup Gailly
* detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -899,14 +899,19 @@ local void compress_block(deflate_state *s, const ct_data *ltree,
const ct_data *dtree) {
unsigned dist; /* distance of matched string */
int lc; /* match length or unmatched char (if dist == 0) */
- unsigned sx = 0; /* running index in sym_buf */
+ unsigned sx = 0; /* running index in symbol buffers */
unsigned code; /* the code to send */
int extra; /* number of extra bits to send */
if (s->sym_next != 0) do {
+#ifdef LIT_MEM
+ dist = s->d_buf[sx];
+ lc = s->l_buf[sx++];
+#else
dist = s->sym_buf[sx++] & 0xff;
dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
lc = s->sym_buf[sx++];
+#endif
if (dist == 0) {
send_code(s, lc, ltree); /* send a literal byte */
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
@@ -931,8 +936,12 @@ local void compress_block(deflate_state *s, const ct_data *ltree,
}
} /* literal or match pair ? */
- /* Check that the overlay between pending_buf and sym_buf is ok: */
+ /* Check for no overlay of pending_buf on needed symbols */
+#ifdef LIT_MEM
+ Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow");
+#else
Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
+#endif
} while (sx < s->sym_next);
@@ -1082,9 +1091,14 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
* the current block must be flushed.
*/
int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) {
+#ifdef LIT_MEM
+ s->d_buf[s->sym_next] = (ush)dist;
+ s->l_buf[s->sym_next++] = (uch)lc;
+#else
s->sym_buf[s->sym_next++] = (uch)dist;
s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
s->sym_buf[s->sym_next++] = (uch)lc;
+#endif
if (dist == 0) {
/* lc is the unmatched char */
s->dyn_ltree[lc].Freq++;
diff --git a/3rdparty/zlib/win32/DLL_FAQ.txt b/3rdparty/zlib/win32/DLL_FAQ.txt
index 12c009018c3..d8cf5f31e3d 100644
--- a/3rdparty/zlib/win32/DLL_FAQ.txt
+++ b/3rdparty/zlib/win32/DLL_FAQ.txt
@@ -3,7 +3,7 @@
This document describes the design, the rationale, and the usage
-of the official DLL build of zlib, named ZLIB1.DLL. If you have
+of the common DLL build of zlib, named ZLIB1.DLL. If you have
general questions about zlib, you should see the file "FAQ" found
in the zlib distribution, or at the following location:
http://www.gzip.org/zlib/zlib_faq.html
@@ -11,13 +11,9 @@ in the zlib distribution, or at the following location:
1. What is ZLIB1.DLL, and how can I get it?
- - ZLIB1.DLL is the official build of zlib as a DLL.
+ - ZLIB1.DLL is the common build of zlib as a DLL.
(Please remark the character '1' in the name.)
- Pointers to a precompiled ZLIB1.DLL can be found in the zlib
- web site at:
- http://www.zlib.net/
-
Applications that link to ZLIB1.DLL can rely on the following
specification:
@@ -379,18 +375,6 @@ in the zlib distribution, or at the following location:
code. But you can make your own private DLL build, under a
different file name, as suggested in the previous answer.
-
-17. I made my own ZLIB1.DLL build. Can I test it for compliance?
-
- - We prefer that you download the official DLL from the zlib
- web site. If you need something peculiar from this DLL, you
- can send your suggestion to the zlib mailing list.
-
- However, in case you do rebuild the DLL yourself, you can run
- it with the test programs found in the DLL distribution.
- Running these test programs is not a guarantee of compliance,
- but a failure can imply a detected problem.
-
**
This document is written and maintained by
diff --git a/3rdparty/zlib/win32/README-WIN32.txt b/3rdparty/zlib/win32/README-WIN32.txt
index 384c988fa84..14e6398ef3a 100644
--- a/3rdparty/zlib/win32/README-WIN32.txt
+++ b/3rdparty/zlib/win32/README-WIN32.txt
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.3.0 is a general purpose data compression library. All the code is
+zlib 1.3.1 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
@@ -16,13 +16,13 @@ is http://zlib.net/ . Before reporting a problem, please check this site to
verify that you have the latest version of zlib; otherwise get the latest
version and check whether the problem still exists or not.
-PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html
-before asking for help.
+PLEASE read DLL_FAQ.txt, and the zlib FAQ http://zlib.net/zlib_faq.html before
+asking for help.
Manifest:
-The package zlib-1.3.0-win32-x86.zip will contain the following files:
+The package zlib-1.3.1-win32-x86.zip will contain the following files:
README-WIN32.txt This document
ChangeLog Changes since previous zlib packages
diff --git a/3rdparty/zlib/zconf.h b/3rdparty/zlib/zconf.h
index fb76ffe312a..62adc8d8431 100644
--- a/3rdparty/zlib/zconf.h
+++ b/3rdparty/zlib/zconf.h
@@ -1,5 +1,5 @@
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -300,14 +300,6 @@
# endif
#endif
-#ifndef Z_ARG /* function prototypes for stdarg */
-# if defined(STDC) || defined(Z_HAVE_STDARG_H)
-# define Z_ARG(args) args
-# else
-# define Z_ARG(args) ()
-# endif
-#endif
-
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
diff --git a/3rdparty/zlib/zconf.h.cmakein b/3rdparty/zlib/zconf.h.cmakein
index 310c43928a2..0abe3bc9d8f 100644
--- a/3rdparty/zlib/zconf.h.cmakein
+++ b/3rdparty/zlib/zconf.h.cmakein
@@ -1,5 +1,5 @@
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -302,14 +302,6 @@
# endif
#endif
-#ifndef Z_ARG /* function prototypes for stdarg */
-# if defined(STDC) || defined(Z_HAVE_STDARG_H)
-# define Z_ARG(args) args
-# else
-# define Z_ARG(args) ()
-# endif
-#endif
-
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
diff --git a/3rdparty/zlib/zconf.h.in b/3rdparty/zlib/zconf.h.in
index fb76ffe312a..62adc8d8431 100644
--- a/3rdparty/zlib/zconf.h.in
+++ b/3rdparty/zlib/zconf.h.in
@@ -1,5 +1,5 @@
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -300,14 +300,6 @@
# endif
#endif
-#ifndef Z_ARG /* function prototypes for stdarg */
-# if defined(STDC) || defined(Z_HAVE_STDARG_H)
-# define Z_ARG(args) args
-# else
-# define Z_ARG(args) ()
-# endif
-#endif
-
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
diff --git a/3rdparty/zlib/zlib.3 b/3rdparty/zlib/zlib.3
index 4dd28967534..c716020ea9c 100644
--- a/3rdparty/zlib/zlib.3
+++ b/3rdparty/zlib/zlib.3
@@ -1,4 +1,4 @@
-.TH ZLIB 3 "18 Aug 2023"
+.TH ZLIB 3 "22 Jan 2024"
.SH NAME
zlib \- compression/decompression library
.SH SYNOPSIS
@@ -105,9 +105,9 @@ before asking for help.
Send questions and/or comments to zlib@gzip.org,
or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
.SH AUTHORS AND LICENSE
-Version 1.3
+Version 1.3.1
.LP
-Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler
+Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
.LP
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/3rdparty/zlib/zlib.3.pdf b/3rdparty/zlib/zlib.3.pdf
index da12d37183a..b224532bdd8 100644
--- a/3rdparty/zlib/zlib.3.pdf
+++ b/3rdparty/zlib/zlib.3.pdf
Binary files differ
diff --git a/3rdparty/zlib/zlib.h b/3rdparty/zlib/zlib.h
index 6b7244f9943..8d4b932eaf6 100644
--- a/3rdparty/zlib/zlib.h
+++ b/3rdparty/zlib/zlib.h
@@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.3, August 18th, 2023
+ version 1.3.1, January 22nd, 2024
- Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -37,11 +37,11 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.3"
-#define ZLIB_VERNUM 0x1300
+#define ZLIB_VERSION "1.3.1"
+#define ZLIB_VERNUM 0x1310
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 3
-#define ZLIB_VER_REVISION 0
+#define ZLIB_VER_REVISION 1
#define ZLIB_VER_SUBREVISION 0
/*
@@ -936,10 +936,10 @@ ZEXTERN int ZEXPORT inflateSync(z_streamp strm);
inflateSync returns Z_OK if a possible full flush point has been found,
Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
- In the success case, the application may save the current current value of
- total_in which indicates where valid compressed data was found. In the
- error case, the application may repeatedly call inflateSync, providing more
- input each time, until success or end of the input data.
+ In the success case, the application may save the current value of total_in
+ which indicates where valid compressed data was found. In the error case,
+ the application may repeatedly call inflateSync, providing more input each
+ time, until success or end of the input data.
*/
ZEXTERN int ZEXPORT inflateCopy(z_streamp dest,
@@ -1758,14 +1758,14 @@ ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2);
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
- len2.
+ len2. len2 must be non-negative.
*/
/*
ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2);
Return the operator corresponding to length len2, to be used with
- crc32_combine_op().
+ crc32_combine_op(). len2 must be non-negative.
*/
ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op);
diff --git a/3rdparty/zlib/zutil.h b/3rdparty/zlib/zutil.h
index 902a304cc2d..48dd7febae6 100644
--- a/3rdparty/zlib/zutil.h
+++ b/3rdparty/zlib/zutil.h
@@ -1,5 +1,5 @@
/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -56,7 +56,7 @@ typedef unsigned long ulg;
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */
-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)]
#define ERR_RETURN(strm,err) \
return (strm->msg = ERR_MSG(err), (err))
@@ -137,17 +137,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# endif
#endif
-#if defined(MACOS) || defined(TARGET_OS_MAC)
+#if defined(MACOS)
# define OS_CODE 7
-# ifndef Z_SOLO
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-# include <unix.h> /* for fdopen */
-# else
-# ifndef fdopen
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# endif
-# endif
-# endif
#endif
#ifdef __acorn
@@ -170,18 +161,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define OS_CODE 19
#endif
-#if defined(_BEOS_) || defined(RISCOS)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-#endif
-
-#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
-# if defined(_WIN32_WCE)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# else
-# define fdopen(fd,type) _fdopen(fd,type)
-# endif
-#endif
-
#if defined(__BORLANDC__) && !defined(MSDOS)
#pragma warn -8004
#pragma warn -8008
diff --git a/COPYING b/COPYING
index 9bce36d1b49..86def8b77e3 100644
--- a/COPYING
+++ b/COPYING
@@ -11,7 +11,7 @@ distributions.
MAME
-Copyright (c) 1997-2024 MAMEdev and contributors
+Copyright (c) 1997-2026 MAMEdev and contributors
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2, as provided
@@ -55,6 +55,9 @@ Other Information
the author or the affirmer.
+AES-256-CBC
+Copyright (c) 2024 Hallo Weeks
+
Asio C++ Library
Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -161,10 +164,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Expat
Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and
Clark Cooper
-Copyright (c) 2001-2019 Expat maintainers
+Copyright (c) 2001-2025 Expat maintainers
Lua - a powerful, fast, lightweight, embeddable scripting language
-Copyright (c) 1994-2017 Lua.org, PUC-Rio
+Copyright (c) 1994-2024 Lua.org, PUC-Rio
LuaFileSystem - File System Library for Lua
Copyright (c) 2003-2015 Kepler Project
diff --git a/README.md b/README.md
index c8d61bbe84d..1ee2c4b3fbc 100644
--- a/README.md
+++ b/README.md
@@ -1,32 +1,31 @@
+# MAME
-# **MAME** #
+## What is MAME?
-[![Join the chat at https://gitter.im/mamedev/mame](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mamedev/mame?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+MAME is a multi-purpose emulation framework.
-Continuous integration build status:
+MAME's purpose is to preserve decades of software history. As electronic technology continues to rush forward, MAME prevents this important "vintage" software from being lost and forgotten. This is achieved by documenting the hardware and how it functions. The source code to MAME serves as this documentation. The fact that the software is usable serves primarily to validate the accuracy of the documentation (how else can you prove that you have recreated the hardware faithfully?). Over time, MAME (originally stood for Multiple Arcade Machine Emulator) absorbed the sister-project MESS (Multi Emulator Super System), so MAME now documents a wide variety of (mostly vintage) computers, video game consoles and calculators, in addition to the arcade video games that were its initial focus.
-| OS/Compiler | Status |
-| --------------------------- |:-------------:|
-| Linux/clang and GCC | ![CI (Linux)](https://github.com/mamedev/mame/workflows/CI%20(Linux)/badge.svg) |
-| Windows/MinGW GCC and clang | ![CI (Windows)](https://github.com/mamedev/mame/workflows/CI%20(Windows)/badge.svg) |
-| macOS/clang | ![CI (macOS)](https://github.com/mamedev/mame/workflows/CI%20(macOS)/badge.svg) |
-| UI Translations | ![Compile UI translations](https://github.com/mamedev/mame/workflows/Compile%20UI%20translations/badge.svg) |
-| Documentation | ![Build documentation](https://github.com/mamedev/mame/workflows/Build%20documentation/badge.svg) |
-| BGFX Shaders | ![Rebuild BGFX shaders](https://github.com/mamedev/mame/workflows/Rebuild%20BGFX%20shaders/badge.svg) |
+## Where can I find out more?
-Static analysis status for entire build (except for third-party parts of project):
+* [Official MAME Development Team Site](https://www.mamedev.org/) (includes binary downloads, wiki, forums, and more)
+* [MAME Testers](https://mametesters.org/) (official bug tracker for MAME)
-[![Coverity Scan Status](https://scan.coverity.com/projects/5727/badge.svg?flat=1)](https://scan.coverity.com/projects/mame-emulator)
+### Community
-What is MAME?
-=============
+* [MAME Forums on bannister.org](https://forums.bannister.org/ubbthreads.php?ubb=cfrm&c=5)
+* [r/MAME](https://www.reddit.com/r/MAME/) on Reddit
+* [MAMEWorld Forums](https://www.mameworld.info/ubbthreads/)
-MAME is a multi-purpose emulation framework.
+## Development
-MAME's purpose is to preserve decades of software history. As electronic technology continues to rush forward, MAME prevents this important "vintage" software from being lost and forgotten. This is achieved by documenting the hardware and how it functions. The source code to MAME serves as this documentation. The fact that the software is usable serves primarily to validate the accuracy of the documentation (how else can you prove that you have recreated the hardware faithfully?). Over time, MAME (originally stood for Multiple Arcade Machine Emulator) absorbed the sister-project MESS (Multi Emulator Super System), so MAME now documents a wide variety of (mostly vintage) computers, video game consoles and calculators, in addition to the arcade video games that were its initial focus.
+![Alt](https://repobeats.axiom.co/api/embed/8461d8ae4630322dafc736fc25782de214b49630.svg "Repobeats analytics image")
+
+### CI status and code scanning
+
+[![CI (Linux)](https://github.com/mamedev/mame/workflows/CI%20(Linux)/badge.svg)](https://github.com/mamedev/mame/actions/workflows/ci-linux.yml) [![CI (Windows](https://github.com/mamedev/mame/workflows/CI%20(Windows)/badge.svg)](https://github.com/mamedev/mame/actions/workflows/ci-windows.yml) [![CI (macOS)](https://github.com/mamedev/mame/workflows/CI%20(macOS)/badge.svg)](https://github.com/mamedev/mame/actions/workflows/ci-macos.yml) [![Compile UI translations](https://github.com/mamedev/mame/workflows/Compile%20UI%20translations/badge.svg)](https://github.com/mamedev/mame/actions/workflows/language.yml) [![Build documentation](https://github.com/mamedev/mame/workflows/Build%20documentation/badge.svg)](https://github.com/mamedev/mame/actions/workflows/docs.yml) [![Coverity Scan Status](https://scan.coverity.com/projects/5727/badge.svg?flat=1)](https://scan.coverity.com/projects/mame-emulator)
-How to compile?
-===============
+### How to compile?
If you're on a UNIX-like system (including Linux and macOS), it could be as easy as typing
@@ -52,27 +51,15 @@ Visual Studio builds are also possible, but you still need [build environment](h
In order to generate solution and project files just run:
```
-make vs2019
+make vs2022
```
or use this command to build it directly using msbuild
```
-make vs2019 MSBUILD=1
+make vs2022 MSBUILD=1
```
-
-Where can I find out more?
-=============
-
-* [Official MAME Development Team Site](https://www.mamedev.org/) (includes binary downloads, wiki, forums, and more)
-* [Official MESS Wiki](http://mess.redump.net/)
-* [MAME Testers](https://mametesters.org/) (official bug tracker for MAME and MESS)
-
-
-Contributing
-=============
-
-## Coding standard
+### Coding standard
MAME source code should be viewed and edited with your editor set to use four spaces per tab. Tabs are used for initial indentation of lines, with one tab used per indentation level. Spaces are used for other alignment within a line.
@@ -82,9 +69,7 @@ All contributors need to either add a standard header for license info (on new f
See more specific [C++ Coding Guidelines](https://docs.mamedev.org/contributing/cxx.html) on our documentation web site.
-
-License
-=======
+## License
The MAME project as a whole is made available under the terms of the
[GNU General Public License, version 2](http://opensource.org/licenses/GPL-2.0)
@@ -99,10 +84,10 @@ Please note that MAME is a registered trademark of Gregory Ember, and permission
is required to use the "MAME" name, logo, or wordmark.
<a href="http://opensource.org/licenses/GPL-2.0" target="_blank">
-<img align="right" src="http://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png">
+<img align="right" width="100" src="https://opensource.org/wp-content/uploads/2009/06/OSIApproved.svg">
</a>
- Copyright (c) 1997-2024 MAMEdev and contributors
+ Copyright (c) 1997-2026 MAMEdev and contributors
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2, as provided in
@@ -113,4 +98,4 @@ is required to use the "MAME" name, logo, or wordmark.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
-Please see COPYING for more details.
+Please see [COPYING](COPYING) for more details.
diff --git a/android-project/LICENSE b/android-project/LICENSE
index 1c4f0fe4393..500600b2d81 100644
--- a/android-project/LICENSE
+++ b/android-project/LICENSE
@@ -1,27 +1,29 @@
-Copyright (c) 1997-2024, MAMEdev and contributors
+Copyright (c) 1997-2026, MAMEdev and contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
+modification, are permitted provided that the following conditions are
+met:
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
-* Neither the name of bsd3 nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/android-project/app/src/main/AndroidManifest.xml b/android-project/app/src/main/AndroidManifest.xml
index 37320df98a9..7a1ac5316c5 100644
--- a/android-project/app/src/main/AndroidManifest.xml
+++ b/android-project/app/src/main/AndroidManifest.xml
@@ -4,8 +4,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mamedev.mame"
- android:versionCode="268"
- android:versionName="0.268"
+ android:versionCode="287"
+ android:versionName="0.287"
android:installLocation="auto">
<!-- OpenGL ES 2.0 -->
diff --git a/ctrlr/hotrod.cfg b/ctrlr/hotrod.cfg
index 93d44424a46..914e2cf6c2c 100644
--- a/ctrlr/hotrod.cfg
+++ b/ctrlr/hotrod.cfg
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<mameconfig version="10">
<system name="default">
diff --git a/ctrlr/hotrodse.cfg b/ctrlr/hotrodse.cfg
index f91a45dfde4..81391c90e60 100644
--- a/ctrlr/hotrodse.cfg
+++ b/ctrlr/hotrodse.cfg
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<mameconfig version="10">
<system name="default">
diff --git a/ctrlr/scorpionxg.cfg b/ctrlr/scorpionxg.cfg
index cf7d544981c..6db01dd047e 100644
--- a/ctrlr/scorpionxg.cfg
+++ b/ctrlr/scorpionxg.cfg
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<mameconfig version="10">
<system name="default">
diff --git a/ctrlr/slikstik.cfg b/ctrlr/slikstik.cfg
index d1ffe4c46b4..172a157f6b6 100644
--- a/ctrlr/slikstik.cfg
+++ b/ctrlr/slikstik.cfg
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<mameconfig version="10">
<system name="default">
diff --git a/ctrlr/xarcade.cfg b/ctrlr/xarcade.cfg
index b05fce74b1d..1aca512873c 100644
--- a/ctrlr/xarcade.cfg
+++ b/ctrlr/xarcade.cfg
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<mameconfig version="10">
<system name="default">
diff --git a/dist.mak b/dist.mak
index edbb4cd67cb..ab45eb1e78d 100644
--- a/dist.mak
+++ b/dist.mak
@@ -7,39 +7,30 @@
###########################################################################
ifeq ($(OS),Windows_NT)
-OS := windows
+ OS := windows
else
-UNAME := $(shell uname -mps)
-ifeq ($(firstword $(filter Linux,$(UNAME))),Linux)
-OS := linux
-endif
-ifeq ($(firstword $(filter Solaris,$(UNAME))),Solaris)
-OS := solaris
-endif
-ifeq ($(firstword $(filter SunOS,$(UNAME))),SunOS)
-OS := solaris
-endif
-ifeq ($(firstword $(filter FreeBSD,$(UNAME))),FreeBSD)
-OS := freebsd
-endif
-ifeq ($(firstword $(filter GNU/kFreeBSD,$(UNAME))),GNU/kFreeBSD)
-OS := freebsd
-endif
-ifeq ($(firstword $(filter NetBSD,$(UNAME))),NetBSD)
-OS := netbsd
-endif
-ifeq ($(firstword $(filter OpenBSD,$(UNAME))),OpenBSD)
-OS := openbsd
-endif
-ifeq ($(firstword $(filter Darwin,$(UNAME))),Darwin)
-OS := osx
-endif
-ifeq ($(firstword $(filter Haiku,$(UNAME))),Haiku)
-OS := haiku
-endif
-ifndef OS
-$(error Unable to detect OS from uname -a: $(UNAME))
-endif
+ UNAME := $(shell uname -mps)
+ ifeq ($(firstword $(filter Linux,$(UNAME))),Linux)
+ OS := linux
+ else ifeq ($(firstword $(filter Solaris,$(UNAME))),Solaris)
+ OS := solaris
+ else ifeq ($(firstword $(filter SunOS,$(UNAME))),SunOS)
+ OS := solaris
+ else ifeq ($(firstword $(filter FreeBSD,$(UNAME))),FreeBSD)
+ OS := freebsd
+ else ifeq ($(firstword $(filter GNU/kFreeBSD,$(UNAME))),GNU/kFreeBSD)
+ OS := freebsd
+ else ifeq ($(firstword $(filter NetBSD,$(UNAME))),NetBSD)
+ OS := netbsd
+ else ifeq ($(firstword $(filter OpenBSD,$(UNAME))),OpenBSD)
+ OS := openbsd
+ else ifeq ($(firstword $(filter Darwin,$(UNAME))),Darwin)
+ OS := osx
+ else ifeq ($(firstword $(filter Haiku,$(UNAME))),Haiku)
+ OS := haiku
+ else ifndef OS
+ $(error Unable to detect OS from uname -a: $(UNAME))
+ endif
endif
ifndef TARGETOS
@@ -48,14 +39,18 @@ endif
EXE :=
ifeq ($(OS),windows)
-EXE := .exe
-PROJECTTYPE := mingw-gcc
+ EXE := .exe
+ ifeq ($(MSYSTEM),CLANG64)
+ PROJECTTYPE := mingw-clang
+ else ifeq ($(MSYSTEM),CLANGARM64)
+ PROJECTTYPE := mingw-clang
+ else
+ PROJECTTYPE := mingw-gcc
+ endif
+else ifeq ($(OS),osx)
+ PROJECTTYPE := osx_clang
else
-ifeq ($(OS),osx)
-PROJECTTYPE := osx_clang
-else
-PROJECTTYPE := $(OS)_gcc
-endif
+ PROJECTTYPE := $(OS)_gcc
endif
ifeq ($(DEBUG),1)
@@ -75,11 +70,9 @@ endif
SHELLTYPE := msdos
ifeq (,$(ComSpec)$(COMSPEC))
SHELLTYPE := posix
-endif
-ifeq (/bin,$(findstring /bin,$(SHELL)))
+else ifeq (/bin,$(findstring /bin,$(SHELL)))
SHELLTYPE := posix
-endif
-ifeq (/bin,$(findstring /bin,$(MAKESHELL)))
+else ifeq (/bin,$(findstring /bin,$(MAKESHELL)))
SHELLTYPE := posix
endif
@@ -99,6 +92,12 @@ MAINBIN := $(TARGET)$(MAINBINVARIANT)
BINDIR := build/$(PROJECTTYPE)/bin/$(BUILDARCH)/$(BUILDVARIANT)
STAGEDIR := build/release/$(BUILDARCH)/$(BUILDVARIANT)/$(TARGET)
+ifeq ($(OS),windows)
+ SYMFILE := $(addsuffix .sym,$(MAINBIN))
+else
+ SYMFILE :=
+endif
+
BINARIES = $(MAINBIN) castool chdman floptool imgtool jedutil ldresample ldverify nltool nlwav romcmp unidasm
SIMPLE_DIRS := ctrlr docs/legal docs/man docs/swlist hash ini/examples ini/presets
LOCALISATIONS := $(wildcard language/*/*.mo)
@@ -106,7 +105,7 @@ COPIED_FILES := COPYING uismall.bdf roms/dir.txt $(foreach DIR,$(SIMPLE_DIRS),$(
CREATED_DIRS := docs ini roms $(SIMPLE_DIRS) language $(dir $(LOCALISATIONS))
GEN_FOLDERS := $(addprefix $(STAGEDIR)/,$(CREATED_DIRS))
-COPY_BINARIES := $(addprefix $(STAGEDIR)/,$(addsuffix $(EXE),$(BINARIES)))
+COPY_BINARIES := $(addprefix $(STAGEDIR)/,$(addsuffix $(EXE),$(BINARIES)) $(SYMFILE))
COPY_FILES := $(addprefix $(STAGEDIR)/,$(COPIED_FILES))
all: $(COPY_BINARIES) $(COPY_FILES) $(STAGEDIR)/docs/MAME.pdf
@@ -117,10 +116,13 @@ clean:
$(GEN_FOLDERS):
$(call MKDIR,$@)
-$(STAGEDIR)/%: $(BINDIR)/% | $(GEN_FOLDERS)
+$(STAGEDIR)/%$(EXE): $(BINDIR)/%$(EXE) | $(GEN_FOLDERS)
$(call COPY,$<,$@)
$(SILENT) strip $@
+$(STAGEDIR)/%.sym: $(BINDIR)/%.sym | $(GEN_FOLDERS)
+ $(call COPY,$<,$@)
+
$(STAGEDIR)/%: % | $(GEN_FOLDERS)
$(call COPY,$<,$@)
@@ -128,6 +130,6 @@ $(STAGEDIR)/docs/MAME.pdf: docs/build/latex/MAME.pdf | $(GEN_FOLDERS)
$(call COPY,$<,$@)
docs/build/latex/MAME.pdf:
- $(MAKE) -C docs latexpdf
+ $(MAKE) -C docs PAPER=a4 latexpdf
.PHONY: all clean
diff --git a/docs/Makefile b/docs/Makefile
index b5c45c82ca7..48b674871a7 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -8,8 +8,8 @@ PAPER =
BUILDDIR = build
# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
+PAPEROPT_a4 = -D latex_elements.papersize=a4paper
+PAPEROPT_letter = -D latex_elements.papersize=letterpaper
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
diff --git a/docs/man/mame.6 b/docs/man/mame.6
index 3d83084e4c0..1a967cc829e 100644
--- a/docs/man/mame.6
+++ b/docs/man/mame.6
@@ -578,25 +578,17 @@ Enable cropping of artwork to the game screen area only. This
option can also be controlled via the Video Options menu in the user
interface. The default is OFF (\-noartwork_crop).
.TP
-.B \-[no]use_backdrops, \-[no]backdrop
-Enables/disables the display of backdrops. The default is ON
-(\-use_backdrops).
+.B \-fallback_artwork \fIartworkname
+Specifies fallback artwork if no external artwork or internal driver layout
+is defined. If external artwork for the system is present or a layout is
+included in the driver for the system, then that will take precedence.
.TP
-.B \-[no]use_overlays, \-[no]overlay
-Enables/disables the display of overlays. The default is ON
-(\-use_overlays).
+.B \-override_artwork \fIartworkname
+Specifies override artwork for external artwork and internal driver layout.
.TP
-.B \-[no]use_bezels, \-[no]bezel
-Enables/disables the display of bezels. The default is ON
-(\-use_bezels).
-.TP
-.B \-[no]use_cpanels, \-[no]cpanel
-Enables/disables the display of cpanels. The default is ON
-(\-use_bezels).
-.TP
-.B \-[no]use_marquees, \-[no]marquee
-Enables/disables the display of marquees. The default is ON
-(\-use_bezels).
+.B \-artwork_font, \-artfont \fIfontname
+Specifies the name of a font file to use for artwork text elements.
+The specifics are the same as the \-uifont option.
.\"
.\" *******************************************************
.SS Screen options
@@ -745,7 +737,7 @@ Default is OFF (\-nosyncrefresh).
.\" SDL specific
.\" +++++++++++++++++++++++++++++++++++++++++++++++++++++++
.B NOTE:
-All the options in this group are available only with softare video
+All the options in this group are available only with software video
rendering subsystem, i.e \fB\-video soft\fR.
.TP
.B \-prescale\fR [\fIvalue\fR]
@@ -907,7 +899,7 @@ Split full screen image across monitors. Default is OFF (\-nouseallheads).
.SS Sound options
.\" *******************************************************
.TP
-.B \-sound\fR [\fIsdl\fR|\fIportaudio\fR|\fIcoreaudio\fR|\fIdsound\fR|\fIxaudio2\fR|\fInone\fR]
+.B \-sound\fR [\fIsdl\fR|\fIportaudio\fR|\fIcoreaudio\fR|\fIwasapi\fR|\fIxaudio2\fR|\fInone\fR]
Specifies which sound subsystem to use for audio output:
.br
\fBsdl\fR uses the Simple DirectMedia Layer audio output system
@@ -916,17 +908,18 @@ Specifies which sound subsystem to use for audio output:
\fBportaudio\fR uses the PortAudio library which supports low-latency
output and multiple audio APIs.
.br
-\fBcoreaudio\fR uses the Core Audio API which supports low-latency
-output and AudioUnit effects (only available on macOS).
+\fBcoreaudio\fR uses the CoreAudio API (supports AudioUnit effects, only
+available on macOS).
.br
-\fBdsound\fR uses the DirectSound API (only available on Windows).
+\fBwasapi\fR uses the Windows Audio Session API (WASAPI) (only available
+on Windows).
.br
-\fBxaudio2\fR uses the XAudio2 API which supports low-latency output
-(only available on Windows).
+\fBxaudio2\fR uses the XAudio2 API (does not support sound input, only
+available on Windows).
.br
\fBnone\fR produces no audio output.
.br
-Default is 'dsound' on Windows, 'coreaudio' on macOS or 'sdl' on other
+Default is 'wasapi' on Windows, 'coreaudio' on macOS or 'sdl' on other
platforms.
.TP
.B \-samplerate, \-srf \fIvalue
@@ -938,32 +931,27 @@ cause higher audio quality but slower emulation speed. The default is
.B \-[no]samples
Use samples if available. The default is ON (\-samples).
.TP
-.B \-[no]compressor
-Enable audio compressor. It temporarily reduces the overall volume when
-the audio output is overdriven. The default is ON (\-compressor).
-.TP
.B \-volume, \-vol \fIvalue
Sets the startup volume. It can later be changed with the user interface
-(see Keys section). The volume is an attenuation in dB: e.g.,
+(see Keys section). The volume is in dB: e.g.,
"\-volume \-12" will start with \-12dB attenuation. The default is 0.
.\" +++++++++++++++++++++++++++++++++++++++++++++++++++++++
.\" SDL specific
.\" +++++++++++++++++++++++++++++++++++++++++++++++++++++++
.TP
-.B \-audio_latency \fIvalue
+.B \-audio_latency, \-alat \fIvalue
This controls the amount of latency built into the audio streaming.
-The exact behavior depends on the selected audio output module (see
-the \-sound option). Smaller values provide less audio delay while
-requiring better system performance. Higher values increase audio
-delay but may help avoid buffer under-runs and audio interruptions.
-The default is 1.
+Smaller values provide less audio delay while requiring better system
+performance. Higher values increase audio delay but may help avoid
+buffer under-runs and audio interruptions. The default is 0 and will
+pick a sane duration.
.\"
.\" *******************************************************
.SS Input options
.\" *******************************************************
.TP
.B \-[no]coin_lockout, \-[no]coinlock
-Enables simulation of the "coin lockout" feature that is implmeneted
+Enables simulation of the "coin lockout" feature that is implemented
on a number of game PCBs. It was up to the operator whether or not
the coin lockout outputs were actually connected to the coin
mechanisms. If this feature is enabled, then attempts to enter a coin
@@ -1172,7 +1160,7 @@ information. The default is OFF (\-noverbose).
.TP
.B \-[no]update_in_pause
Enables updating the screen bitmap while the game is paused. This is
-useful for debuggin in some scenarios (and gets in the way in others).
+useful for debugging in some scenarios (and gets in the way in others).
Default is OFF (\-noupdate_in_pause).
.TP
.B \-[no]debug, \-[no]d
diff --git a/docs/source/advanced/bgfx.rst b/docs/source/advanced/bgfx.rst
index bb6e4205fa3..ccdf16aba99 100644
--- a/docs/source/advanced/bgfx.rst
+++ b/docs/source/advanced/bgfx.rst
@@ -66,7 +66,7 @@ make sure the following options are set correctly:
Now, you may want to take a moment to look below at the Configuration Settings
section to see how to set up these next options.
-As explained in :ref:`advanced-multi-CFG`, MAME has a order in which it
+As explained in :ref:`advanced-multicfg-order`, MAME has a order in which it
processes INI files. The BGFX settings can be edited in ``mame.ini``, but to
take full advantage of the power of MAME’s configuration files, you’ll want to
copy the BGFX settings from ``mame.ini`` to one of the other configuration files
@@ -86,21 +86,22 @@ bgfx_path
the *bgfx* folder in your MAME installation folder.
bgfx_backend
Selects a rendering backend for BGFX to use. Possible choices include
- ``d3d9``, ``d3d11``, ``d3d12``, ``opengl``, ``gles``, ``metal``, and
- ```vulkan``. The default is ``**auto**``, which will let MAME choose the
+ ``auto``, ``d3d9``, ``d3d11``, ``d3d12``, ``opengl``, ``gles``, ``metal``,
+ and ``vulkan``. The default is ``auto``, which will let MAME choose the
best selection for you.
- * ``d3d9`` -- Direct3D 9.0 Renderer (Requires Windows XP or higher)
- * ``d3d11`` -- Direct3D 11.0 Renderer (Requires Windows Vista with
- Direct3D 11 update, or Windows 7 or higher)
- * ``d3d12`` -- Direct3D 12.0 Renderer (Requires Windows 10 or higher)
+ * ``d3d9`` -- Direct3D 9.0 Renderer (May require the DirectX End-User
+ Runtime to be installed)
+ * ``d3d11`` -- Direct3D 11.0 Renderer
+ * ``d3d12`` -- Direct3D 12.0 Renderer
* ``opengl`` -- OpenGL Renderer (Requires OpenGL drivers, may work better on
some video cards, supported on Linux and macOS)
* ``gles`` -- OpenGL ES Renderer (Supported with some low-power GPUs)
* ``metal`` -- Apple Metal Graphics API (Requires macOS 10.11 El Capitan or
newer)
* ``vulkan`` -- Vulkan Renderer (Requires Windows or Linux with compatible
- GPU drivers.
+ GPU drivers)
+ * ``auto`` -- MAME will automatically choose the best selection for you.
bgfx_debug
Enables BGFX debugging features. Most users will not need to use this.
bgfx_screen_chains
diff --git a/docs/source/advanced/ctrlr_config.rst b/docs/source/advanced/ctrlr_config.rst
index 1f19924e741..13ffa34b050 100644
--- a/docs/source/advanced/ctrlr_config.rst
+++ b/docs/source/advanced/ctrlr_config.rst
@@ -20,18 +20,20 @@ arcade-style controllers.
Controller configuration files are an XML application, using the ``.cfg``
filename extension. MAME searches for controller configuration files in the
-directories specified using the ``ctrlrpath`` option. A controller
-configuration file is selected by setting the ``ctrlr`` option to its filename,
-excluding the ``.cfg`` extension (e.g. set the ``ctrlr`` option to
-``scorpionxg`` to use **scorpionxg.cfg**). It is an error if the specified
-controller configuration file does not exist, or if it contains no sections
-applicable to the emulated system.
+directories specified using the :ref:`ctrlrpath <mame-commandline-ctrlrpath>`
+option. A controller configuration file is selected by setting the ``ctrlr``
+option to its filename, excluding the ``.cfg`` extension (e.g. set the ``ctrlr``
+option to ``scorpionxg`` to use **scorpionxg.cfg**). It is an error if the
+specified controller configuration file does not exist, or if it contains no
+sections applicable to the emulated system.
Controller configuration files use implementation-dependent input tokens. The
values available and their precise meanings depend on the exact version of MAME
used, the input devices connected, the selected input provider modules
-(``keyboardprovider``, ``mouseprovider``, ``lightgunprovider`` and
-``joystickprovider`` options), and possibly other settings.
+(:ref:`keyboardprovider <mame-commandline-keyboardprovider>`,
+:ref:`mouseprovider <mame-commandline-mouseprovider>`, :ref:`lightgunprovider
+<mame-commandline-lightgunprovider>` and :ref:`joystickprovider
+<mame-commandline-joystickprovider>` options), and possibly other settings.
.. _ctrlrcfg-structure:
diff --git a/docs/source/advanced/glsl.rst b/docs/source/advanced/glsl.rst
index d2cec7052c7..008849325e4 100644
--- a/docs/source/advanced/glsl.rst
+++ b/docs/source/advanced/glsl.rst
@@ -54,7 +54,7 @@ Once you've found settings you like, write the numbers down on a notepad and exi
Configuration Editing
---------------------
-As referenced in :ref:`advanced-multi-CFG`, MAME has a order in which it processes INI files. The GLSL settings can be edited in ``mame.ini``, but to take full advantage of the power of MAME's config files, you'll want to copy the GLSL settings from mame.ini to one of the other config files and make changes there.
+As referenced in :ref:`advanced-multicfg-order`, MAME has a order in which it processes INI files. The GLSL settings can be edited in ``mame.ini``, but to take full advantage of the power of MAME's config files, you'll want to copy the GLSL settings from mame.ini to one of the other config files and make changes there.
For instance, once you've found GLSL settings you think are appropriate for Neo Geo games, you can put those settings into neogeo.ini so that all Neo-Geo games will be able to take advantage of those settings without needing to add it to every game INI manually.
diff --git a/docs/source/advanced/hlsl.rst b/docs/source/advanced/hlsl.rst
index 218e3be0564..f9d8e22f211 100644
--- a/docs/source/advanced/hlsl.rst
+++ b/docs/source/advanced/hlsl.rst
@@ -56,7 +56,7 @@ Once you've found settings you like, write the numbers down on a notepad and exi
Configuration Editing
---------------------
-As referenced in :ref:`advanced-multi-CFG`, MAME has a order in which it processes INI files. The HLSL settings can be edited in ``mame.ini``, but to take full advantage of the power of MAME's config files, you'll want to copy the HLSL settings from mame.ini to one of the other config files and make changes there.
+As referenced in :ref:`advanced-multicfg-order`, MAME has a order in which it processes INI files. The HLSL settings can be edited in ``mame.ini``, but to take full advantage of the power of MAME's config files, you'll want to copy the HLSL settings from mame.ini to one of the other config files and make changes there.
For instance, once you've found HLSL settings you think are appropriate for Neo Geo games, you can put those settings into ``neogeo.ini`` so that all Neo-Geo games will be able to take advantage of those settings without needing to add it to every game INI manually.
diff --git a/docs/source/advanced/linux-lightguns.rst b/docs/source/advanced/linux-lightguns.rst
index 630605c4ae9..9463b00edc8 100644
--- a/docs/source/advanced/linux-lightguns.rst
+++ b/docs/source/advanced/linux-lightguns.rst
@@ -1,63 +1,76 @@
Linux Lightguns
===============
-Many lightguns (especially the Ultimarc AimTrak) may work better in MAME under Linux when using a slightly more complicated configuration. The instructions here are for getting an AimTrak working on Ubuntu using udev and Xorg, but other Linux distributions and lightguns may work with some changes to the steps.
+Many lightguns (especially the Ultimarc AimTrak) may work better in MAME under
+Linux when using a slightly more complicated configuration. The instructions
+here are for getting an AimTrak working on Ubuntu using udev and Xorg, but other
+Linux distributions and lightguns may work with some changes to the steps.
Configure udev rules
--------------------
-For the AimTrak, each lightgun exposes several USB devices once connected: 2 mouse emulation devices, and 1 joystick emulation device. We need to instruct libinput via udev to ignore all but the correct emulated mouse device. This prevents each lightgun from producing multiple mouse devices, which would result in non-deterministic selection between the "good" and "bad" emulated mouse devices by Xorg.
+For the AimTrak, each lightgun exposes several USB devices once connected: 2
+mouse emulation devices, and 1 joystick emulation device. We need to instruct
+libinput via udev to ignore all but the correct emulated mouse device. This
+prevents each lightgun from producing multiple mouse devices, which would result
+in non-deterministic selection between the "good" and "bad" emulated mouse
+devices by Xorg.
-Create a new file named ``/etc/udev/rules.d/65-aimtrak.rules`` and place the following contents into it:
+Create a new file named ``/etc/udev/rules.d/65-aimtrak.rules`` and place the
+following contents into it::
-| # Set mode (0666) & disable libinput handling to avoid X11 picking up the wrong
-| # interfaces/devices.
-| SUBSYSTEMS=="usb", ATTRS{idVendor}=="d209", ATTRS{idProduct}=="160*",
-| MODE="0666", ENV{ID_INPUT}="", ENV{LIBINPUT_IGNORE_DEVICE}="1"
-|
-| # For ID_USB_INTERFACE_NUM==2, re-enable libinput handling.
-| SUBSYSTEMS=="usb", ATTRS{idVendor}=="d209", ATTRS{idProduct}=="160*",
-| ENV{ID_USB_INTERFACE_NUM}=="02", ENV{ID_INPUT}="1",
-| ENV{LIBINPUT_IGNORE_DEVICE}="0"
-|
+ # Set mode (0666) & disable libinput handling to avoid X11 picking up the wrong
+ # interfaces/devices.
+ SUBSYSTEMS=="usb", ATTRS{idVendor}=="d209", ATTRS{idProduct}=="160*",
+ MODE="0666", ENV{ID_INPUT}="", ENV{LIBINPUT_IGNORE_DEVICE}="1"
-This configuration will be correct for the AimTrak lightguns, however each brand of lightgun will require their own settings.
+ # For ID_USB_INTERFACE_NUM==2, re-enable libinput handling.
+ SUBSYSTEMS=="usb", ATTRS{idVendor}=="d209", ATTRS{idProduct}=="160*",
+ ENV{ID_USB_INTERFACE_NUM}=="02", ENV{ID_INPUT}="1",
+ ENV{LIBINPUT_IGNORE_DEVICE}="0"
+
+This configuration will be correct for the AimTrak lightguns, however each brand
+of lightgun will require their own settings.
Configure Xorg inputs
---------------------
-Next, we'll configure Xorg to treat the lightguns as a "Floating" device. This is important for multiple lightguns to work correctly and ensures each gun's emulated mouse pointer is NOT merged with the main system mouse pointer.
+Next, we'll configure Xorg to treat the lightguns as a "Floating" device. This
+is important for multiple lightguns to work correctly and ensures each gun's
+emulated mouse pointer is NOT merged with the main system mouse pointer.
-In ``/etc/X11/xorg.conf.d/60-aimtrak.conf`` we will need:
+In ``/etc/X11/xorg.conf.d/60-aimtrak.conf`` we will need::
-| Section "InputClass"
-| Identifier "AimTrak Guns"
-| MatchDevicePath "/dev/input/event*"
-| MatchUSBID "d209:160*"
-| Driver "libinput"
-| Option "Floating" "yes"
-| Option "AutoServerLayout" "no"
-| EndSection
-|
+ Section "InputClass"
+ Identifier "AimTrak Guns"
+ MatchDevicePath "/dev/input/event*"
+ MatchUSBID "d209:160*"
+ Driver "libinput"
+ Option "Floating" "yes"
+ Option "AutoServerLayout" "no"
+ EndSection
Configure MAME
--------------
-Next, we'll need to configure MAME via ``mame.ini`` to use the new lightgun device(s).
-
-* lightgun 1
-* lightgun_device lightgun
-* lightgunprovider x11
-
-These first three lines tell MAME to enable lightgun support, to tell MAME that we're using a lightgun instead of a mouse, and to use the x11 provider.
+Next, we'll need to configure MAME via ``mame.ini`` to use the new lightgun
+device(s)::
-* lightgun_index1 "Ultimarc ATRAK Device #1"
-* lightgun_index2 "Ultimarc ATRAK Device #2"
-* lightgun_index3 "Ultimarc ATRAK Device #3"
-* lightgun_index4 "Ultimarc ATRAK Device #4"
+ lightgun 1
+ lightgun_device lightgun
+ lightgunprovider x11
-These next lines then tell MAME to keep lightguns consistent across sessions.
+These first three lines tell MAME to enable lightgun support, to tell MAME that
+we're using a lightgun instead of a mouse, and to use the x11 provider::
-* offscreen_reload 1
+ lightgun_index1 "Ultimarc ATRAK Device #1"
+ lightgun_index2 "Ultimarc ATRAK Device #2"
+ lightgun_index3 "Ultimarc ATRAK Device #3"
+ lightgun_index4 "Ultimarc ATRAK Device #4"
-Lastly, as most lightgun games require offscreen reloading and we're using a device that actually can point away from the screen, we enable that functionality.
+Lastly, as many lightgun games require aiming away from the screen and firing to
+reload, you may reloading and we're using a device that represents that as a
+separate button, you will need to configure the :ref:`off-screen reload helper
+plugin <plugins-offscreenreload>` or :ref:`input macro plugin
+<plugins-inputmacro>` to translate this to the axis and button inputs that these
+games expect.
diff --git a/docs/source/advanced/multiconfig.rst b/docs/source/advanced/multiconfig.rst
index d81853d4734..25afad4051f 100644
--- a/docs/source/advanced/multiconfig.rst
+++ b/docs/source/advanced/multiconfig.rst
@@ -1,12 +1,15 @@
Multiple Configuration Files
============================
-MAME has a very powerful configuration file system that can allow you to tweak settings on a per-game, per-system, or even per-monitor type basis, but requires careful thought about how you arrange your configs.
+MAME has a very powerful configuration file system that can allow you to tweak
+settings on a per-game, per-system, or even per-monitor type basis, but requires
+careful thought about how you arrange your configuration files.
-.. _advanced-multi-CFG:
-Order of Config Loading
------------------------
+.. _advanced-multicfg-order:
+
+Order of Configurattion File Loading
+------------------------------------
1. The command line is parsed first, and any settings passed that way *will take
precedence over anything in an INI file*.
@@ -100,7 +103,7 @@ Examples of Config Loading Order
8. ``smleague.ini`` (parent system)
9. ``finlarch.ini`` (system)
-*Remember command line parameters take precedence over all else!*
+*Remember command line argument take precedence over all else!*
Tricks to Make Life Easier
@@ -110,3 +113,14 @@ Some users may have a wall-mounted or otherwise rotatable monitor, and may wish
to actually play vertical games with the rotated display. The easiest way to
accomplish this is to put your rotation modifiers into ``vertical.ini``, where
they will only affect vertical games.
+
+
+Multiple Search Folders
+-----------------------
+
+If you include paths to multiple folders in your :ref:`inipath setting
+<mame-commandline-inipath>`, MAME will search for each INI file in each of the
+specified folders in the order they are listed. If a file with the same name is
+found in multiple folders, settings from files found earlier have precedence
+over settings in files found later. MAME always saves INI files to the first
+folder specified in your inipath setting.
diff --git a/docs/source/advanced/paths.rst b/docs/source/advanced/paths.rst
index d16247a42cb..501a7a47116 100644
--- a/docs/source/advanced/paths.rst
+++ b/docs/source/advanced/paths.rst
@@ -7,7 +7,7 @@ MAME has a specific order it uses when checking for user files such as ROM sets
Order of Path Loading
---------------------
-Let's use an example of the cheat file for AfterBurner 2 for Sega Genesis/MegaDrive (aburner2 in the megadrive softlist), and your cheatpath is set to "cheat" (as per the default) -- this is how MAME will search for that cheat file:
+Let's use an example of the cheat file for After Burner 2 for Sega Genesis/MegaDrive (aburner2 in the megadrive softlist), and your cheatpath is set to "cheat" (as per the default) -- this is how MAME will search for that cheat file:
1. ``cheat/megadriv/aburner2.xml``
2. ``cheat/megadriv.zip`` -> ``aburner2.xml``
diff --git a/docs/source/commandline/commandline-all.rst b/docs/source/commandline/commandline-all.rst
index fe093cc0d86..9165d7d0d2d 100644
--- a/docs/source/commandline/commandline-all.rst
+++ b/docs/source/commandline/commandline-all.rst
@@ -1125,18 +1125,16 @@ Configuration Options
- ``mame.ini``
- ``debug.ini`` (if the debugger is enabled)
- - ``source/``\ *<driver>*\ ``.ini`` (based on the source filename of the driver)
- ``vertical.ini`` (for systems with vertical monitor orientation)
- ``horizont.ini`` (for systems with horizontal monitor orientation)
- - ``arcade.ini`` (for systems in source added with ``GAME()`` macro)
- - ``console.ini`` (for systems in source added with ``CONS()`` macro)
- - ``computer.ini`` (for systems in source added with ``COMP()`` macro)
- - ``othersys.ini`` (for systems in source added with ``SYST()`` macro)
- - ``vector.ini`` (for vector systems only)
+ - ``raster.ini`` (for raster display systems only)
+ - ``vector.ini`` (for vector display systems only)
+ - ``lcd.ini`` (for matrix display systems only)
+ - ``source/``\ *<driver>*\ ``.ini`` (based on the source filename of the driver)
- *<parent>*\ ``.ini`` (for clones only, may be called recursively)
- *<systemname>*\ ``.ini``
- (See :ref:`advanced-multi-CFG` for further details)
+ (See :ref:`advanced-multicfg-order` for further details)
The settings in the later INIs override those in the earlier INIs. So, for
example, if you wanted to disable overlay effects in the vector systems, you
@@ -1354,7 +1352,7 @@ Core Search Path Options
Specifies the default path from which to load loose software image files.
- The default is ``sofware`` (that is, a directory ``software`` in the current
+ The default is ``software`` (that is, a directory ``software`` in the current
working directory).
Example:
@@ -1811,7 +1809,7 @@ Core State/Playback Options
All save states will be stored inside sta\c64\robby\
.. Tip:: Note that even on Microsoft Windows, you should use ``/`` as your
- path seperator for **-statename**
+ path separator for **-statename**
.. _mame-commandline-noburnin:
@@ -2591,7 +2589,7 @@ Core Artwork Options
.. _mame-commandline-fallbackartwork:
-**-fallback_artwork**
+**-fallback_artwork** *<artwork name>*
Specifies fallback artwork if no external artwork or internal driver layout
is defined. If external artwork for the system is present or a layout is
@@ -2606,10 +2604,9 @@ Core Artwork Options
``horizontal.ini`` and ``vertical.ini`` to specify different
fallback artwork choices for horizontal and vertical systems.
-
.. _mame-commandline-overrideartwork:
-**-override_artwork**
+**-override_artwork** *<artwork name>*
Specifies override artwork for external artwork and internal driver layout.
@@ -2618,6 +2615,24 @@ Core Artwork Options
mame galaga -override_artwork puckman
+.. _mame-commandline-artworkfont:
+
+**-artwork_font** / **-artfont** *<fontname>*
+
+ Specifies the font to use for artwork text elements. The same
+ considerations apply as for the UI font (see the :ref:`uifont option
+ <mame-commandline-uifont>`).
+
+ Note that artwork is typically designed around a sans serif font with tight
+ character spacing (e.g. **Tahoma**, which is the default on Windows). Using
+ a font with wider character spacing or a fixed pitch font (e.g. a Courier
+ family font) may result in text positioning issues.
+
+ Example:
+ .. code-block:: bash
+
+ mame starwbc -artwork_font "Comic Sans MS"
+
.. _mame-commandline-screenoptions:
@@ -2950,26 +2965,12 @@ Core Sound Options
mame qbert -nosamples
-.. _mame-commandline-nocompressor:
-
-**-[no]compressor**
-
- Enable audio compressor. It temporarily reduces the overall volume when
- the audio output is overdriven.
-
- The default is ON (**-compressor**).
-
- Example:
- .. code-block:: bash
-
- mame popeye -nocompressor
-
.. _mame-commandline-volume:
**-volume** / **-vol** *<value>*
Sets the initial sound volume. It can be changed later with the user
- interface (see Keys section). The volume is an attenuation in decibels:
+ interface (see Keys section). The volume is in decibels:
e.g. "**-volume -12**" will start with -12 dB attenuation. Note that if the
volume is changed in the user interface it will be saved to the
configuration file for the system. The value from the configuration file
@@ -2984,20 +2985,21 @@ Core Sound Options
.. _mame-commandline-sound:
-**-sound** *<dsound | coreaudio | sdl | xaudio2 | portaudio | none>*
+**-sound** *<wasapi | xaudio2 | coreaudio | pipewire | pulse | sdl | portaudio | none>*
- Specifies which sound subsystem to use. Selecting ``none`` disables sound
- output altogether (sound hardware is still emulated).
+ Specifies which sound module to use. Selecting ``none`` disables sound
+ output and input altogether (sound hardware is still emulated).
- On Windows and Linux, *portaudio* is likely to give the lowest possible
- latency, while Mac users will find *coreaudio* provides the best results.
+ Available features, performance and latency vary between sound modules.
+ You may have to change the value of the :ref:`latency option
+ <mame-commandline-audiolatency>` if you change the sound module.
When using the ``sdl`` sound subsystem, the audio API to use may be selected
by setting the *SDL_AUDIODRIVER* environment variable. Available audio APIs
depend on the operating system. On Windows, it may be necessary to set
``SDL_AUDIODRIVER=directsound`` if no sound output is produced by default.
- The default is ``dsound`` on Windows. On Mac, ``coreaudio`` is the default.
+ The default is ``wasapi`` on Windows. On Mac, ``coreaudio`` is the default.
On all other platforms, ``sdl`` is the default.
Example:
@@ -3005,58 +3007,92 @@ Core Sound Options
mame pacman -sound portaudio
-.. list-table:: Supported sound subsystems per-platform
- :header-rows: 0
+.. list-table:: Sound module supported platforms and features
+ :header-rows: 1
:stub-columns: 0
- * - **Microsoft Windows**
- - dsound
- - xaudio2
- - portaudio
- -
- - sdl [#SoundWinSDL]_.
- - none
- * - **macOS**
- -
- -
- - portaudio
- - coreaudio
- - sdl
- - none
- * - **Linux** and others
- -
- -
- - portaudio
- -
- - sdl
- - none
+ * - Module
+ - Supported OS
+ - Input
+ - Output monitoring
+ - Multi-channel
+ - Device changes
+ * - ``wasapi``
+ - Windows
+ - Yes
+ - Yes
+ - Yes
+ - Yes
+ * - ``xaudio2``
+ - Windows
+ - No
+ - No
+ - Yes
+ - Yes
+ * - ``coreaudio``
+ - macOS
+ - No
+ - No
+ - No
+ - No
+ * - ``pipewire``
+ - Linux
+ - Yes
+ - ?
+ - Yes
+ - Yes
+ * - ``pulse``
+ - Linux
+ - No
+ - No
+ - Yes
+ - Yes
+ * - ``sdl``
+ - All [#SoundWinSDL]_
+ - No
+ - No
+ - Yes [#SoundSDLMultiChannel]_
+ - No
+ * - ``portaudio``
+ - All
+ - Yes
+ - Yes [#SoundPortAudioMonitoring]_
+ - Yes
+ - No
.. rubric:: Footnotes
-.. [#SoundWinSDL] While SDL is not a supported option on official builds for Windows, you can compile MAME with SDL support on Windows.
+.. [#SoundWinSDL] While SDL is not a supported option on official MAME builds
+ for Windows, you can compile MAME with SDL support on Windows.
+
+.. [#SoundSDLMultiChannel] MAME requires SDL 2.0.16 or later for multi-channel
+ sound support.
+
+.. [#SoundPortAudioMonitoring] PortAudio support for output monitoring depends
+ on the platform and sound API.
.. _mame-commandline-audiolatency:
-**-audio_latency** *<value>*
+**-audio_latency** *<value>* / **-alat** *<value>*
- The exact behavior depends on the selected audio output module. Smaller
- values provide less audio delay while requiring better system performance.
- Higher values increase audio delay but may help avoid buffer under-runs and
- audio interruptions.
+ Audio latency, conventionally in number of audio frames (1 audio frame is 20ms).
+ It is not required to supply whole numbers, eg. a value of ``1.5`` is 30ms).
+ Smaller values provide less audio delay while requiring better system
+ performance. Larger values increase audio delay but may help avoid buffer
+ under-runs and audio interruptions. A value of ``0`` will use the default
+ for the selected sound module.
- The default is ``1``.
+ You may need to change the value of this option if you change the sound module
+ using the :ref:`sound option <mame-commandline-sound>`. This option is
+ unsupported on sound modules ``pipewire``, ``pulse``, ``sdl``.
- * For PortAudio, see the section on :ref:`-pa_latency <mame-commandline-palatency>`.
- * XAudio2 calculates audio_latency as 10ms steps.
- * DSound calculates audio_latency as 10ms steps.
- * CoreAudio calculates audio_latency as 25ms steps.
- * SDL calculates audio_latency as Xms steps.
+ The default is ``0``.
Example:
.. code-block:: bash
- mame galaga -audio_latency 1
+ mame galaga -audio_latency 2
.. _mame-commandline-inputoptions:
@@ -3233,24 +3269,6 @@ Core Input Options
mame apple2e -ui_active
-.. _mame-commandline-nooffscreenreload:
-
-**-[no]offscreen_reload** / **-[no]reload**
-
- Controls whether or not MAME treats a second button input from a lightgun as
- a reload signal. In this case, MAME will report the gun's position as
- (0,MAX) with the trigger held, which is equivalent to an offscreen reload.
-
- This is only needed for games that required you to shoot offscreen to
- reload, and then only if your gun does not support off screen reloads.
-
- The default is OFF (**-nooffscreen_reload**).
-
- Example:
- .. code-block:: bash
-
- mame lethalen -offscreen_reload
-
.. _mame-commandline-joystickmap:
**-joystick_map** *<map>* / **-joymap** *<map>*
@@ -3292,7 +3310,7 @@ Core Input Options
Generally you will want to set up the **-joystick_map** setting in the
per-system ``<system>.ini`` file as opposed to the main ``MAME.INI``
file so that the mapping only affects the systems you want it to. See
- :ref:`Multiple Configuration Files <advanced-multi-CFG>` for further
+ :ref:`Multiple Configuration Files <advanced-multicfg-order>` for further
details on per-system configuration.
Maps are defined as a string of numbers and characters. Since the grid is
@@ -3677,8 +3695,9 @@ Debugging Options
Acts as a remote debugging server for the GNU debugger (GDB). Only a
small subset of the CPUs emulated by MAME are supported. Use the
:ref:`debugger_port <mame-commandline-debuggerport>` option to set the
- listening port on the loopback interface. Supported on all platforms
- with TCP socket support.
+ listening port and the
+ :ref:`debugger_host <mame-commandline-debuggerhost>` option to set the
+ address to bind to. Supported on all platforms with TCP socket support.
Example:
.. code-block:: bash
@@ -3732,11 +3751,26 @@ Debugging Options
mame ibm_5150 -watchdog 30
+.. _mame-commandline-debuggerhost:
+
+**-debugger_host** *<address>*
+
+ Set the IP address to listen on to accept GDB connections when using the
+ GDB stub debugger module (see the
+ :ref:`debugger <mame-commandline-debugger>` option).
+
+ The default is ``localhost``.
+
+ Example:
+ .. code-block:: bash
+
+ mame rfjet -debug -debugger gdbstub -debugger_host 0.0.0.0
+
.. _mame-commandline-debuggerport:
**-debugger_port** *<port>*
- Set the TCP port number to listen on for GDB connections when using the GDB
+ Set the TCP port number to accept GDB connections on when using the GDB
stub debugger module (see the :ref:`debugger <mame-commandline-debugger>`
option).
@@ -3805,7 +3839,7 @@ Core Communication Options
Local port to bind to. This can be any traditional communications port as
an unsigned 16-bit integer (0-65535).
- The default value is ``15122``.
+ The default value is ``15112``.
Example:
.. code-block:: bash
@@ -3834,7 +3868,7 @@ Core Communication Options
Remote port to connect to. This can be any traditional communications port
as an unsigned 16-bit integer (0-65535).
- The default value is "``15122``".
+ The default value is "``15112``".
Example:
.. code-block:: bash
@@ -3864,7 +3898,9 @@ Core Misc Options
**-[no]drc**
- Enable DRC (dynamic recompiler) CPU core if available for maximum speed.
+ Enable DRC (dynamic recompiler) CPU cores if available. Turn this option
+ off to use interpreter CPU cores if available. This option does not affect
+ CPUs that only support one core type.
The default is ON (**-drc**).
@@ -3873,18 +3909,37 @@ Core Misc Options
mame ironfort -nodrc
+.. _mame-commandline-drcrwx:
+
+**\-[no]drc_rwx**
+
+ Allow DRC CPU cores to use memory that is simultaneously writable and
+ executable if supported. Turning this option off may decrease performance.
+ This option only affects DRC CPU cores, and has no effect in configurations
+ that do not allow memory to be simultaneously writable and executable (e.g.
+ recent versions of macOS and NetBSD).
+
+ The default is ON (**-drc_rwx**).
+
+ Example:
+ .. code-block:: bash
+
+ mame fiveside -nodrc_rwx
+
.. _mame-commandline-drcusec:
**\-[no]drc_use_c**
- Force DRC to use the C code backend.
+ Force DRC CPU cores to use the portable C code back-end when a native
+ back-end is available. This option only affects DRC CPU cores, and has no
+ effect if a native DRC back-end is not available.
The default is OFF (**-nodrc_use_c**).
Example:
.. code-block:: bash
- mame ironfort -drc_use_c
+ mame vamphalf -drc_use_c
.. _mame-commandline-drcloguml:
@@ -3933,7 +3988,7 @@ Core Misc Options
Activates the cheat menu with autofire options and other tricks from the
cheat database, if present. This also activates additional options on the
- slider menu for overclocking/underclocking.
+ slider menu for overall speed and overclocking/underclocking.
*Be advised that savestates created with cheats on may not work correctly
with this turned off and vice-versa.*
@@ -3962,12 +4017,21 @@ Core Misc Options
**-uifont** *<fontname>*
- Specifies the name of a font file to use for the UI font. If this font
- cannot be found or cannot be loaded, the system will fall back to its
- built-in UI font. On some platforms *fontname* can be a system font name
- instead of a BDF font file.
+ Specifies the font to use for UI text. If this font cannot be found or
+ cannot be loaded, MAME will fall back to its built-in UI font. Supported
+ fonts depend on the platform and selected UI font provider module. In some
+ configurations, *fontname* can be a system font name or a path to a TrueType
+ font file. In all cases, a path to a BDF (Adobe Glyph Bitmap Distribution
+ Format) font file can be used.
+
+ Note that characters available depend on the font, and many fonts do not
+ cover multiple writing systems and languages, or symbols like arrows.
+ Depending on the configuration, MAME may not automatically substitute
+ characters from other fonts. Characters that are not available may be
+ replaced with substitute glyphs (often rectangles).
- The default is ``default`` (use the OSD-determined default font).
+ The default is ``default`` (use the default font determined by the UI font
+ provider module).
Example:
.. code-block:: bash
@@ -4187,96 +4251,3 @@ HTTP Server Options
.. code-block:: bash
mame apple2 -http -http_port 6502 -http_root C:\Users\me\appleweb\root
-
-
-.. _mame-commandline-portaudio:
-
-PortAudio Options
------------------
-
-.. _mame-commandline-paapi:
-
-**-pa_api** *API*
-
- Choose which API that PortAudio should use to talk to your sound hardware. You can use **-verbose** to see which APIs are available.
-
- The default is ``none``.
-
- Example 1:
- .. code-block:: bash
-
- mame -sound portaudio -verbose
- Attempting load of mame.ini
- ...
- PortAudio: API MME has 20 devices
- PortAudio: MME: " - Input"
- PortAudio: MME: "Microphone (3- USB Camera-B4.09"
- PortAudio: MME: "Line (AVerMedia Live Gamer HD 2"
- PortAudio: MME: "Digital Audio Interface (AVerMe"
- PortAudio: MME: "Headset Microphone (Razer Krake"
- ...
- PortAudio: MME: " - Output"
- PortAudio: MME: "Headset Earphone (Razer Kraken "
- PortAudio: MME: "Digital Audio (S/PDIF) (High De"
- PortAudio: MME: "NX-EDG27 (NVIDIA High Definitio"
- ...
- PortAudio: API Windows DirectSound has 20 devices
- PortAudio: Windows DirectSound: "Primary Sound Capture Driver"
- PortAudio: Windows DirectSound: "Headset Microphone (Razer Kraken 7.1 V2)"
- PortAudio: Windows DirectSound: "Primary Sound Driver" (default)
- PortAudio: Windows DirectSound: "Headset Earphone (Razer Kraken 7.1 V2)"
- PortAudio: Windows DirectSound: "Digital Audio (S/PDIF) (High Definition Audio Device)"
- PortAudio: Windows DirectSound: "NX-EDG27 (NVIDIA High Definition Audio)"
- ...
- PortAudio: API Windows WASAPI has 18 devices
- PortAudio: Windows WASAPI: "Headset Earphone (Razer Kraken 7.1 V2)"
- PortAudio: Windows WASAPI: "Digital Audio (S/PDIF) (High Definition Audio Device)"
- PortAudio: Windows WASAPI: "NX-EDG27 (NVIDIA High Definition Audio)"
- PortAudio: Windows WASAPI: "Headset Microphone (Razer Kraken 7.1 V2)"
- ...
- PortAudio: API Windows WDM-KS has 22 devices
- PortAudio: Windows WDM-KS: "Output (NVIDIA High Definition Audio)"
- PortAudio: Windows WDM-KS: "SPDIF Out (HD Audio SPDIF out)"
- PortAudio: Windows WDM-KS: "Headset Microphone (Razer Kraken 7.1 V2)"
- PortAudio: Windows WDM-KS: "Headset Earphone (Razer Kraken 7.1 V2)"
- PortAudio: Windows WDM-KS: "Microphone (VDVAD Wave)"
- PortAudio: Windows WDM-KS: "Speakers (VDVAD Wave)"
- ...
- PortAudio: Sample rate is 48000 Hz, device output latency is 218.67 ms
- PortAudio: Allowed additional buffering latency is 18.00 ms/864 frames
-
- Example 2:
- .. code-block:: bash
-
- mame suprmrio -sound portaudio -pa_api "Windows WASAPI"
-
-.. _mame-commandline-padevice:
-
-**-pa_device** *device*
-
- Choose which sound device to output through. This would typically be one of
- the outputs on your sound card or a USB headset.
-
- The default is ``none``.
-
- Example:
- .. code-block:: bash
-
- mame suprmrio -sound portaudio -pa_api "Windows WASAPI" -pa_device "NX-EDG27 (NVIDIA High Definition Audio)"
-
-.. _mame-commandline-palatency:
-
-**-pa_latency** *latency*
-
- Choose the buffer size for PortAudio output; this is specified in seconds.
- Lower numbers have less latency but may increase stutter in the sound.
- Decimal places are supported. Try starting from 0.20 and decrease or
- increase until you find the best number your hardware and OS are capable of
- handling.
-
- The default is ``0``.
-
- Example:
- .. code-block:: bash
-
- mame suprmrio -sound portaudio -pa_api "Windows WASAPI" -pa_device "NX-EDG27 (NVIDIA High Definition Audio)" -pa_latency 0.20
diff --git a/docs/source/commandline/commandline-index.rst b/docs/source/commandline/commandline-index.rst
index c62dfef518b..76f4e5cb5cc 100644
--- a/docs/source/commandline/commandline-index.rst
+++ b/docs/source/commandline/commandline-index.rst
@@ -201,6 +201,7 @@ Core Artwork Options
| :ref:`[no]artwork_crop <mame-commandline-noartworkcrop>`
| :ref:`fallback_artwork <mame-commandline-fallbackartwork>`
| :ref:`override_artwork <mame-commandline-overrideartwork>`
+| :ref:`artwork_font <mame-commandline-artworkfont>`
Core Screen Options
@@ -246,7 +247,6 @@ Core Sound Options
| :ref:`samplerate <mame-commandline-samplerate>`
| :ref:`[no]samples <mame-commandline-nosamples>`
-| :ref:`[no]compressor <mame-commandline-nocompressor>`
| :ref:`volume <mame-commandline-volume>`
| :ref:`sound <mame-commandline-sound>`
| :ref:`audio_latency <mame-commandline-audiolatency>`
@@ -264,7 +264,6 @@ Core Input Options
| :ref:`[no]multimouse <mame-commandline-nomultimouse>`
| :ref:`[no]steadykey <mame-commandline-nosteadykey>`
| :ref:`[no]ui_active <mame-commandline-uiactive>`
-| :ref:`[no]offscreen_reload <mame-commandline-nooffscreenreload>`
| :ref:`joystick_map <mame-commandline-joystickmap>`
| :ref:`joystick_deadzone <mame-commandline-joystickdeadzone>`
| :ref:`joystick_saturation <mame-commandline-joysticksaturation>`
@@ -298,6 +297,7 @@ Core Debugging Options
| :ref:`debugscript <mame-commandline-debugscript>`
| :ref:`[no]update_in_pause <mame-commandline-updateinpause>`
| :ref:`watchdog <mame-commandline-watchdog>`
+| :ref:`debugger_host <mame-commandline-debuggerhost>`
| :ref:`debugger_port <mame-commandline-debuggerport>`
| :ref:`debugger_font <mame-commandline-debuggerfont>`
| :ref:`debugger_font_size <mame-commandline-debuggerfontsize>`
@@ -317,6 +317,7 @@ Core Misc Options
~~~~~~~~~~~~~~~~~
| :ref:`[no]drc <mame-commandline-drc>`
+| :ref:`[no]drc_rwx <mame-commandline-drcrwx>`
| :ref:`[no]drc_use_c <mame-commandline-drcusec>`
| :ref:`[no]drc_log_uml <mame-commandline-drcloguml>`
| :ref:`[no]drc_log_native <mame-commandline-drclognative>`
@@ -352,14 +353,6 @@ HTTP Server Options
| :ref:`http_root <mame-commandline-httproot>`
-PortAudio Options
-~~~~~~~~~~~~~~~~~
-
-| :ref:`pa_api <mame-commandline-paapi>`
-| :ref:`pa_device <mame-commandline-padevice>`
-| :ref:`pa_latency <mame-commandline-palatency>`
-
-
Windows-Specific Command-line Options
-------------------------------------
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 63dd0bfed6a..c3b95d9e190 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -56,16 +56,16 @@ master_doc = 'index'
# General information about the project.
project = u'MAME Documentation'
-copyright = u'1997-2024, MAMEdev and contributors'
+copyright = u'1997-2026, MAMEdev and contributors'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = '0.268'
+version = '0.288'
# The full version, including alpha/beta/rc tags.
-release = '0.268'
+release = '0.288'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -264,7 +264,7 @@ texinfo_documents = [
#texinfo_show_urls = 'footnote'
# Add download links at bottom left when the MAMEDEV environment
-# varaible is set. See versions.html in the _template folder.
+# variable is set. See versions.html in the _template folder.
try:
html_context
except NameError:
diff --git a/docs/source/contributing/index.rst b/docs/source/contributing/index.rst
index a3dc9e4bec9..f7f992fc2bc 100644
--- a/docs/source/contributing/index.rst
+++ b/docs/source/contributing/index.rst
@@ -49,7 +49,7 @@ Things that are helpful to include:
video output bugs, note your video hardware (GPU), driver version, and
the MAME video output module you’re using. For input handling bugs,
include the input peripherals and MAME input modules you’re using.
-* The exact version of MAME you’re using, including a git commit digest
+* The exact version of MAME you’re using, including a Git commit digest
if it isn’t a tagged release version, and any non-standard build
options.
* The exact system and software being emulated (may not be applicable
@@ -79,7 +79,7 @@ source code. The source code also includes:
`reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_
markup.
* The supplied :ref:`plugins <plugins>`, written in
- `Lua 5.3 <https://www.lua.org/manual/5.3/>`_.
+ `Lua 5.4 <https://www.lua.org/manual/5.4/>`_.
* Internal layouts for emulated machines that need to display more than
a simple video screen. These are an XML application
:ref:`described here <layfile>`.
@@ -93,8 +93,8 @@ Our primary source code repository is
`hosted on GitHub <https://github.com/mamedev/mame/>`_. We prefer to
receive source code contributions in the form of
`pull requests <https://github.com/mamedev/mame/pulls>`_. You’ll need
-to learn the basics of git distributed version control and familiarise
-yourself with the git tools. The basic process for creating a pull
+to learn the basics of Git distributed version control and familiarise
+yourself with the Git tools. The basic process for creating a pull
request is as follows:
* Sign up for an account on GitHub.
@@ -143,7 +143,8 @@ to all kinds of changes):
* When submitting any new non-arcade machine, but especially a machine
which does not auto-boot and requires some interaction to start up
and be usable, consider adding usage instructions to the
- `System-Specific Setup and Information <https://wiki.mamedev.org/index.php/System-Specific_Setup_and_Information>`_
+ `System-Specific Setup and Information
+ <https://wiki.mamedev.org/index.php/System-Specific_Setup_and_Information>`_
page of the `MAME Wiki <https://wiki.mamedev.org>`_. Anyone can edit
the wiki after creating an account, and sub-pages for your system
which discuss technical details of the system are also welcome.
diff --git a/docs/source/contributing/softlist.rst b/docs/source/contributing/softlist.rst
index afcfa78ffb0..3cfc84d1c5d 100644
--- a/docs/source/contributing/softlist.rst
+++ b/docs/source/contributing/softlist.rst
@@ -125,6 +125,12 @@ Multiple ``info`` elements with the same ``name`` may be present if
appropriate. This is frequently seen for software sold using different
titles in different regions.
+Prefer multiple ``info`` elements with the same ``name`` attribute over
+combining multiple values into a single element. For example if a piece
+of software supports multiple user interface languages, use multiple
+``info`` elements with ``name="language"`` attributes. This makes
+filtering and database queries more practical.
+
MAME displays metadata from ``info`` elements in the software selection
menu. The following ``name`` attributes are recognised specifically,
and can show localised names:
@@ -150,6 +156,8 @@ install
Installation instructions.
isbn
ISBN for software included with a commercial book.
+language
+ User interface language supported by the software.
oem
Original equipment manufacturer, typically used with customised
versions of software distributed by a hardware vendor.
diff --git a/docs/source/debugger/exceptionpoint.rst b/docs/source/debugger/exceptionpoint.rst
index 52a8ee67a19..46ce7b8d41a 100644
--- a/docs/source/debugger/exceptionpoint.rst
+++ b/docs/source/debugger/exceptionpoint.rst
@@ -1,21 +1,21 @@
.. _debugger-exceptionpoint-list:
-Exception Point Debugger Commands
-=================================
+Exceptionpoint Debugger Commands
+================================
:ref:`debugger-command-epset`
- sets a new exception point
+ sets a new exceptionpoint
:ref:`debugger-command-epclear`
- clears a specific exception point or all exception points
+ clears a specific exceptionpoint or all exceptionpoints
:ref:`debugger-command-epdisable`
- disables a specific exception point or all exception points
+ disables a specific exceptionpoint or all exceptionpoints
:ref:`debugger-command-epenable`
- enables a specific exception point or all exception points
+ enables a specific exceptionpoint or all exceptionpoints
:ref:`debugger-command-eplist`
- lists exception points
+ lists exceptionpoints
-Exception points halt execution and activate the debugger when
-a CPU raises a particular exception number.
+Exceptionpoints halt execution and activate the debugger when a CPU
+raises a particular exception number.
.. _debugger-command-epset:
@@ -25,24 +25,24 @@ epset
**ep[set] <type>[,<condition>[,<action>]]**
-Sets a new exception point for exceptions of type **<type>**. The
+Sets a new exceptionpoint for exceptions of type **<type>**. The
optional **<condition>** parameter lets you specify an expression that
-will be evaluated each time the exception point is hit. If the result
-of the expression is true (non-zero), the exception point will actually
+will be evaluated each time the exceptionpoint is hit. If the result
+of the expression is true (non-zero), the exceptionpoint will actually
halt execution at the start of the exception handler; otherwise,
execution will continue with no notification. The optional **<action>**
-parameter provides a command that is executed whenever the exception
-point is hit and the **<condition>** is true. Note that you may need to
-embed the action within braces ``{ }`` in order to prevent commas and
-semicolons from being interpreted as applying to the ``epset`` command
-itself.
+parameter provides a command that is executed whenever the
+exceptionpoint is hit and the **<condition>** is true. Note that you
+may need to embed the action within braces ``{ }`` in order to prevent
+commas and semicolons from being interpreted as applying to the
+``epset`` command itself.
The numbering of exceptions depends upon the CPU type. Causes of
exceptions may include internally or externally vectored interrupts,
errors occurring within instructions and system calls.
-Each exception point that is set is assigned an index which can be used
-in other exception point commands to reference this exception point.
+Each exceptionpoint that is set is assigned an index which can be used
+in other exceptionpoint commands to reference this exceptionpoint.
Examples:
@@ -60,17 +60,17 @@ epclear
**epclear [<epnum>[,…]]**
-The epclear command clears exception points. If **<epnum>** is
-specified, only the requested exception points are cleared, otherwise
-all exception points are cleared.
+The epclear command clears exceptionpoints. If **<epnum>** is
+specified, only the requested exceptionpoints are cleared, otherwise
+all exceptionpoints are cleared.
Examples:
``epclear 3``
- Clear exception point index 3.
+ Clear exceptionpoint index 3.
``epclear``
- Clear all exception points.
+ Clear all exceptionpoints.
Back to :ref:`debugger-exceptionpoint-list`
@@ -82,19 +82,19 @@ epdisable
**epdisable [<epnum>[,…]]**
-The epdisable command disables exception points. If **<epnum>** is
-specified, only the requested exception points are disabled, otherwise
-all exception points are disabled. Note that disabling an exception
-point does not delete it, it just temporarily marks the exception
-point as inactive.
+The epdisable command disables exceptionpoints. If **<epnum>** is
+specified, only the requested exceptionpoints are disabled, otherwise
+all exceptionpoints are disabled. Note that disabling an
+exceptionpoint does not delete it, it just temporarily marks the
+exceptionpoint as inactive.
Examples:
``epdisable 3``
- Disable exception point index 3.
+ Disable exceptionpoint index 3.
``epdisable``
- Disable all exception points.
+ Disable all exceptionpoints.
Back to :ref:`debugger-exceptionpoint-list`
@@ -106,17 +106,17 @@ epenable
**epenable [<epnum>[,…]]**
-The epenable command enables exception points. If **<epnum>** is
-specified, only the requested exception points are enabled, otherwise
-all exception points are enabled.
+The epenable command enables exceptionpoints. If **<epnum>** is
+specified, only the requested exceptionpoints are enabled, otherwise
+all exceptionpoints are enabled.
Examples:
``epenable 3``
- Enable exception point index 3.
+ Enable exceptionpoint index 3.
``epenable``
- Enable all exception points.
+ Enable all exceptionpoints.
Back to :ref:`debugger-exceptionpoint-list`
@@ -128,7 +128,7 @@ eplist
**eplist**
-The eplist command lists all the current exception points, along with
+The eplist command lists all the current exceptionpoints, along with
their index and any conditions or actions attached to them.
Back to :ref:`debugger-exceptionpoint-list`
diff --git a/docs/source/debugger/index.rst b/docs/source/debugger/index.rst
index 2947d0253ac..a035a7e13c0 100644
--- a/docs/source/debugger/index.rst
+++ b/docs/source/debugger/index.rst
@@ -158,6 +158,10 @@ Examples:
Address 9660 in the default address space of the device with the
absolute tag ``:ram``, or the ``ram`` space of the root machine
device.
+``1883:vram.m``
+ Address 1883 in the memory region with the absolute tag ``:vram``.
+``1923:sprites.s``
+ Address 1923 in the memory share with the absolute tag ``:sprites``.
The examples here include a lot of corner cases, but in general the
debugger should take the most likely meaning for a device or address
@@ -327,6 +331,7 @@ The size may optionally be preceded by an access type specification:
* ``o`` specifies direct read/write pointer access defaulting to space 3
(opcodes)
* ``m`` specifies a memory region
+* ``s`` specifies a memory share
Finally, this may be preceded by a tag and/or address space name
followed by a dot (``.``).
diff --git a/docs/source/debugger/memory.rst b/docs/source/debugger/memory.rst
index dfb5914b5a9..4828dd41387 100644
--- a/docs/source/debugger/memory.rst
+++ b/docs/source/debugger/memory.rst
@@ -65,6 +65,7 @@ find
----
**f[ind][{d|i|o}] <address>[:<space>],<length>[,<data>[,…]]**
+**f[ind] <address>:<memory>.{m|s},<length>[,<data>[,…]]**
Search through memory for the specified sequence of data. The
**<address>** is the address to begin searching from, optionally
@@ -114,6 +115,7 @@ fill
----
**fill[{d|i|o}] <address>[:<space>],<length>[,<data>[,…]]**
+**fill <address>:<memory>.{m|s},<length>[,<data>[,…]]**
Overwrite a block of memory with copies of the supplied data sequence.
The **<address>** specifies the address to begin writing at, optionally
@@ -146,6 +148,7 @@ dump
----
**dump[{d|i|o}] <filename>,<address>[:<space>],<length>[,<group>[,<ascii>[,<rowsize>]]]**
+**dump <filename>,<address>:<memory>.{m|s},<length>[,<group>[,<ascii>[,<rowsize>]]]**
Dump memory to the text file specified by the **<filename>** parameter.
The **<address>** specifies the address to start dumping from,
@@ -190,6 +193,7 @@ strdump
-------
**strdump[{d|i|o}] <filename>,<address>[:<space>],<length>[,<term>]**
+**strdump <filename>,<address>:<memory>.{m|s},<length>[,<term>]**
Dump memory to the text file specified by the **<filename>** parameter.
The **<address>** specifies the address to start dumping from,
@@ -205,7 +209,10 @@ By default, the data will be interpreted as a series of NUL-terminated
(ASCIIZ) strings, the dump will have one string per line, and C-style
escapes sequences will be used for bytes that do not represent printable
ASCII characters. The optional **<term>** parameter can be used to
-specify a different string terminator character.
+specify a different string terminator character. If **<term>** is equal
+to -0x80, strings will be treated as terminating after any byte with the
+most significant bit set, and the most significant bit will be ignored
+when printing characters.
Back to :ref:`debugger-memory-list`
@@ -216,6 +223,7 @@ save
----
**save[{d|i|o}] <filename>,<address>[:<space>],<length>**
+**save <filename>,<address>:<memory>.{m|s},<length>**
Save raw memory to the binary file specified by the **<filename>**
parameter. The **<address>** specifies the address to start saving
@@ -260,6 +268,9 @@ start saving from, and the **<length>** specifies how much memory to
save. The range **<address>** through **<address>+<length>-1**,
inclusive, will be output to the file.
+Alternetevely use :ref:`debugger-command-save` syntax:
+``save <filename>,<address>:<region>.m,<length>``
+
Examples:
``saver data.bin,200,100,:monitor``
@@ -278,6 +289,7 @@ load
----
**load[{d|i|o}] <filename>,<address>[:<space>][,<length>]**
+**load <filename>,<address>:<memory>.{m|s}[,<length>]**
Load raw memory from the binary file specified by the **<filename>**
parameter. The **<address>** specifies the address to start loading to,
@@ -334,6 +346,9 @@ through **<address>+<length>-1**, inclusive, will be read in from the
file. If the **<length>** is zero, or is greater than the total length
of the file, the entire contents of the file will be loaded but no more.
+Alternetevely use :ref:`debugger-command-load` syntax:
+``load <filename>,<address>:<region>.m[,<length>]``
+
Examples:
``loadr data.bin,200,100,:monitor``
diff --git a/docs/source/initialsetup/compilingmame.rst b/docs/source/initialsetup/compilingmame.rst
index 0df34f5d12b..7a248928c56 100644
--- a/docs/source/initialsetup/compilingmame.rst
+++ b/docs/source/initialsetup/compilingmame.rst
@@ -8,9 +8,9 @@ Compiling MAME
All Platforms
-------------
-* To compile MAME, you need a C++17 compiler and runtime library. We
- support building with GCC version 10.3 or later and clang version 11
- or later. MAME should run with GNU libstdc++ version 10.3 or later or
+* To compile MAME, you need a C++20 compiler and runtime library. We
+ support building with GCC version 11 or later and clang version 13 or
+ later. MAME should run with GNU libstdc++ version 11 or later or
libc++ version 11 or later. The initial release of any major version
of GCC should be avoided. For example, if you want to compile MAME
with GCC 12, you should use version 12.1 or later.
@@ -83,16 +83,11 @@ sources in parallel::
Microsoft Windows
-----------------
-MAME for Windows is built using the MSYS2 environment. You will need Windows 7
-or later and a reasonably up-to-date MSYS2 installation. We strongly recommend
-building MAME on a 64-bit system. Instructions may need to be adjusted for
-32-bit systems.
+MAME for Windows is built using the MSYS2 environment. You will need a 64-bit
+version of Windows 10 1809 or later and a reasonably up-to-date MSYS2
+installation. Building for 64-bit ARM (AArch64) requires a 64-bit ARM system
+running Windows 11 or later.
-* A pre-packaged MSYS2 installation including the prerequisites for building
- MAME can be downloaded from the `MAME Build Tools
- <http://mamedev.org/tools/>`_ page.
-* After initial installation, you can update the MSYS2 environment using the
- **pacman** (Arch package manage) command.
* By default, MAME will be built using native Windows OS interfaces for
window management, audio/video output, font rendering, etc. If you want to
use the portable SDL (Simple DirectMedia Layer) interfaces instead, you can
@@ -101,94 +96,116 @@ building MAME on a 64-bit system. Instructions may need to be adjusted for
will need to install the MSYS2 packages for SDL 2 version 2.0.14 or later.
* By default, MAME will include the native Windows debugger. To also include
the portable Qt debugger, add **USE_QTDEBUG=1** to the make options. You
- will need to install the MSYS2 packages for Qt 5.
+ will need to install the MSYS2 packages for Qt 6.
Using a standard MSYS2 installation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-You may also build MAME using a standard MSYS2 installation and adding the tools
-needed for building MAME. These instructions assume you have some familiarity
-with MSYS2 and the **pacman** package manager.
+MAME is built for Windows using a standard MSYS2 installation with additional
+packages installed to provide the development tools needed for building MAME.
+These instructions assume you have some familiarity with MSYS2 and the
+**pacman** package manager.
* Install the MSYS2 environment from the `MSYS2 homepage
<https://www.msys2.org/>`_.
-* Download the latest version of the ``mame-essentials`` package from the
- `MAME package repository <https://repo.mamedev.org/x86_64/>`_ and install it
- using the **pacman** command.
-* Add the ``mame`` package repository to ``/etc/pacman.conf`` using
- ``/etc/pacman.d/mirrorlist.mame`` for locations, and disable signature
- verification for this repository (``SigLevel = Never``).
* Install packages necessary to build MAME. At the very least, you’ll need
- ``bash``, ``git``, ``make``.
-* For 64-bit builds you’ll need ``mingw-w64-x86_64-gcc`` and
- ``mingw-w64-x86_64-python``.
-* For 32-bit builds you’ll need ``mingw-w64-i686-gcc`` and
- ``mingw-w64-i686-python``.
+ ``bash``, ``git`` and ``make``.
* For debugging you may want to install ``gdb``.
-* To link using the LLVM linker (generally much faster than the GNU linker),
- you’ll need ``mingw-w64-x86_64-lld`` and ``mingw-w64-x86_64-libc++`` for
- 64-bit builds, or ``mingw-w64-i686-lld`` and ``mingw-w64-i686-libc++`` for
- 32-bit builds.
-* To build against the portable SDL interfaces, you’ll need
- ``mingw-w64-x86_64-SDL2`` and ``mingw-w64-x86_64-SDL2_ttf`` for 64-bit builds,
- or ``mingw-w64-i686-SDL2`` and ``mingw-w64-i686-SDL2_ttf`` for 32-bit builds.
-* To build the Qt debugger, you’ll need ``mingw-w64-x86_64-qt5`` for 64-bit
- builds, or ``mingw-w64-i686-qt5`` for 32-bit builds.
-* To build the HTML user/developer documentation, you’ll need
- ``mingw-w64-x86_64-librsvg``, ``mingw-w64-x86_64-python-sphinx``,
- ``mingw-w64-x86_64-python-sphinx_rtd_theme`` and
- ``mingw-w64-x86_64-python-sphinxcontrib-svg2pdfconverter`` for a 64-bit MinGW
- environment (or alternatively ``mingw-w64-i686-librsvg``,
- ``mingw-w64-i686-python-sphinx``, ``mingw-w64-i686-python-sphinx_rtd_theme``
- and ``mingw-w64-x86_64-python-sphinxcontrib-svg2pdfconverter`` a 32-bit MinGW
- environment).
-* To build the PDF documentation, you’ll additionally need
- ``mingw-w64-x86_64-texlive-latex-extra`` and
- ``mingw-w64-x86_64-texlive-fonts-recommended`` (or
- ``mingw-w64-i686-texlive-latex-extra`` and
- ``mingw-w64-i686-texlive-fonts-recommended`` for a 32-but MinGW environment).
* To generate API documentation from source, you’ll need ``doxygen``.
* If you plan to rebuild bgfx shaders and you want to rebuild the GLSL parser,
you’ll need ``bison``.
-* For 64-bit builds, open **MSYS2 MinGW 64-bit** from the start menu, and set
- up the environment variables ``MINGW64`` to ``/mingw64`` and ``MINGW32`` to an
- empty string (e.g. using the command **export MINGW64=/mingw64 MINGW32=** in
- the Bash shell).
-* For 32-bit builds, open **MSYS2 MinGW 32-bit** from the start menu, and set
- up the environment variables ``MINGW32`` to ``/mingw32`` and ``MINGW64`` to an
- empty string (e.g. using the command **export MINGW32=/mingw32 MINGW64=** in
- the Bash shell).
-
-For example you could use these commands to ensure you have the packages you
-need to compile MAME, omitting the ones for configurations you don’t plan to
-build for or combining multiple **pacman** commands to install more packages at
-once::
-
- pacman -Syu
- pacman -S curl git make
- pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-libc++ mingw-w64-x86_64-lld mingw-w64-x86_64-python
- pacman -S mingw-w64-x86_64-SDL2 mingw-w64-x86_64-SDL2_ttf
- pacman -S mingw-w64-x86_64-qt5
- pacman -S mingw-w64-i686-gcc mingw-w64-i686-libc++ mingw-w64-i686-lld mingw-w64-i686-python
- pacman -S mingw-w64-i686-SDL2 mingw-w64-i686-SDL2_ttf
- pacman -S mingw-w64-i686-qt5
-
-You could use these commands to install the current version of the
-mame-essentials package and add the MAME package repository to your pacman
-configuration::
-
- curl -O "https://repo.mamedev.org/x86_64/mame-essentials-1.0.6-1-x86_64.pkg.tar.xz"
- pacman -U mame-essentials-1.0.6-1-x86_64.pkg.tar.xz
- echo -e '\n[mame]\nInclude = /etc/pacman.d/mirrorlist.mame\nSigLevel = Never' >> /etc/pacman.conf
+
+The additional packages you’ll need depend on the CPU architecture you’re
+building for.
+
+**64-bit x86-64 (libstdc++/UCRT)**
+
+* You’ll need ``mingw-w64-ucrt-x86_64-gcc`` and
+ ``mingw-w64-ucrt-x86_64-python``.
+* To compile using the clang compiler, you’ll also need
+ ``mingw-w64-ucrt-x86_64-clang``.
+* To use the LLVM linker and archiver (generally much faster than the GNU linker
+ and archiver), you’ll need ``mingw-w64-ucrt-x86_64-lld``,
+ ``mingw-w64-ucrt-x86_64-llvm-tools``, ``mingw-w64-ucrt-x86_64-llvm`` and
+ ``mingw-w64-ucrt-x86_64-libc++``.
+* To build against the portable SDL interfaces, you’ll need
+ ``mingw-w64-ucrt-x86_64-SDL2`` and ``mingw-w64-ucrt-x86_64-SDL2_ttf``.
+* To build the Qt debugger, you’ll need ``mingw-w64-ucrt-x86_64-qt6-base``.
+* To build the HTML user/developer documentation, you’ll need
+ ``mingw-w64-ucrt-x86_64-librsvg``, ``mingw-w64-ucrt-x86_64-python-sphinx``,
+ ``mingw-w64-ucrt-x86_64-python-sphinx_rtd_theme`` and
+ ``mingw-w64-ucrt-x86_64-python-sphinxcontrib-svg2pdfconverter``.
+* To build the PDF documentation, you’ll additionally need
+ ``mingw-w64-ucrt-x86_64-texlive-latex-extra`` and
+ ``mingw-w64-ucrt-x86_64-texlive-fonts-recommended``.
+* Open the **ucrt64.exe** helper from the **msys64** installation folder or the
+ **MSYS2 UCRT64** shortcut from the start menu to start a Bash shell configured
+ with the correct paths and environment variables.
+
+**64-bit x86-64 (libc++/UCRT)**
+
+* You’ll need ``mingw-w64-clang-x86_64-clang``,
+ ``mingw-w64-clang-x86_64-python`` and ``mingw-w64-clang-x86_64-gcc-compat``.
+* To use the LLVM linker and archiver (generally much faster than the GNU linker
+ and archiver), you’ll need ``mingw-w64-clang-x86_64-lld``,
+ ``mingw-w64-clang-x86_64-llvm-tools``, ``mingw-w64-clang-x86_64-llvm`` and
+ ``mingw-w64-clang-x86_64-libc++``.
+* To build against the portable SDL interfaces, you’ll need
+ ``mingw-w64-clang-x86_64-SDL2`` and ``mingw-w64-clang-x86_64-SDL2_ttf``.
+* To build the Qt debugger, you’ll need ``mingw-w64-clang-x86_64-qt6-base``.
+* To build the HTML user/developer documentation, you’ll need
+ ``mingw-w64-clang-x86_64-librsvg``, ``mingw-w64-clang-x86_64-python-sphinx``,
+ ``mingw-w64-clang-x86_64-python-sphinx_rtd_theme`` and
+ ``mingw-w64-clang-x86_64-python-sphinxcontrib-svg2pdfconverter``.
+* To build the PDF documentation, you’ll additionally need
+ ``mingw-w64-clang-x86_64-texlive-latex-extra`` and
+ ``mingw-w64-clang-x86_64-texlive-fonts-recommended``.
+* Open the **clang64.exe** helper from the **msys64** installation folder or use
+ the **MSYS2 CLANG64** shortcut to start a Bash shell configured with the
+ correct paths and environment variables.
+
+**64-bit ARM (libc++/UCRT)**
+
+* You’ll need ``mingw-w64-clang-aarch64-clang``,
+ ``mingw-w64-clang-aarch64-python`` and ``mingw-w64-clang-aarch64-gcc-compat``.
+* To use the LLVM linker and archiver (generally much faster than the GNU linker
+ and archiver), you’ll need ``mingw-w64-clang-aarch64-lld``,
+ ``mingw-w64-clang-aarch64-llvm-tools``, ``mingw-w64-clang-aarch64-llvm`` and
+ ``mingw-w64-clang-aarch64-libc++``.
+* To build against the portable SDL interfaces, you’ll need
+ ``mingw-w64-clang-aarch64-SDL2`` and ``mingw-w64-clang-aarch64-SDL2_ttf``.
+* To build the Qt debugger, you’ll need ``mingw-w64-clang-aarch64-qt6-base``.
+* To build the HTML user/developer documentation, you’ll need
+ ``mingw-w64-clangarm64-x86_64-librsvg``,
+ ``mingw-w64-clangarm64-x86_64-python-sphinx``,
+ ``mingw-w64-clangarm64-x86_64-python-sphinx_rtd_theme`` and
+ ``mingw-w64-clangarm64-x86_64-python-sphinxcontrib-svg2pdfconverter``.
+* It is not currently possible to build the PDF documentation using the
+ CLANGARM64 environment as the TeX Live tools do not work. You may be able
+ to use the UCRT64 or CLANG64 environment to build the PDF documentation on a
+ 64-bit ARM system.
+* Open the **clangarm64.exe** helper from the **msys64** installation folder or
+ use the **MSYS2 CLANGARM64** shortcut to start a Bash shell configured with
+ the correct paths and environment variables.
+
+**32-bit x86**
+
+It is no longer possible to compile 32-bit x86 MAME build using an MSYS2
+environment. Up-to-date 32-bit versions of GCC exceed the available address
+space when compiling MAME’s address space classes and Lua bindings. MSYS2 no
+longer provides 32-bit x86 LLVM and clang packages. To build MAME for 32-bit
+x86 systems, you must use an environment that allows cross-compiling for a
+32-bit target using 64-bit tools (e.g. using a MinGW environment on a Linux
+system).
Building with Microsoft Visual Studio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-* You can generate Visual Studio 2019 projects using **make vs2019**. The
+* You can generate Visual Studio 2022 projects using **make vs2022**. The
solution and project files will be created in
- ``build/projects/windows/mame/vs2019`` by default (the name of the ``build``
+ ``build/projects/windows/mame/vs2022`` by default (the name of the ``build``
folder can be changed using the ``BUILDDIR`` option). This will always
- regenerate the settings, so **REGENIE=1** is *not* needed.
+ regenerate the projects, so **REGENIE=1** is *not* needed.
* Adding **MSBUILD=1** to the make options will build the solution using
the Microsoft Build Engine after generating the project files. Note that this
requires paths and environment variables to be configured so the correct
@@ -210,10 +227,10 @@ with helpful information on using the pacman package management tool.
The MSYS2 environment includes two kinds of tools: MSYS2 tools designed to work
in a UNIX-like environment on top of Windows, and MinGW tools designed to work
in a more Windows-like environment. The MSYS2 tools are installed in
-``/usr/bin`` while the MinGW tools are installed in ``/ming64/bin`` and/or
-``/mingw32/bin`` (relative to the MSYS2 installation directory). MSYS2 tools
-work best in an MSYS2 terminal, while MinGW tools work best in a Microsoft
-command prompt.
+``/usr/bin`` while the MinGW tools are installed in ``/ucrt64/bin``,
+``/clang64/bin`` and/or ``/clangarm64/bin`` (relative to the MSYS2 installation
+directory). MSYS2 tools work best in an MSYS2 terminal, while MinGW tools work
+best in a Microsoft command prompt.
The most obvious symptom of this is that arrow keys don’t work in interactive
programs if you run them in the wrong kind of terminal. If you run MinGW gdb or
@@ -222,27 +239,28 @@ be possible to interrupt an attached program with gdb. Similarly it may be very
difficult to edit using MSYS2 vim in a Microsoft command prompt window.
MAME is built using the MinGW compilers, so the MinGW directories are included
-earlier in the ``PATH`` for the build environments. If you want to use an
-interactive MSYS2 program from an MSYS2 shell, you may need to type the absolute
-path to avoid using the MinGW equivalent instead.
+earlier in the ``PATH`` environment variable for the build environments. If you
+want to use an interactive MSYS2 program from an MSYS2 shell, you may need to
+type the absolute path to avoid using the MinGW equivalent instead.
MSYS2 gdb may have issues debugging MinGW programs like MAME. You may get
better results by installing the MinGW version of gdb and running it from a
Microsoft command prompt window to debug MAME.
-GNU make supports both POSIX-style shells (e.g. bash) and the Microsoft cmd.exe
-shell. One issue to be aware of when using the cmd.exe shell is that the
-``copy`` command doesn’t provide a useful exit status, so file copy tasks can
-fail silently.
+GNU Make supports both POSIX-style shells (e.g. bash) and the Microsoft cmd.exe
+shell. When using the cmd.exe shell, the ``copy`` command doesn’t provide a
+useful exit status, so file copy tasks can fail silently. This may cause your
+build to appear to succeed while producing incorrect results. The command to
+link MAME exceeds the maximum command length supported by the cmd.exe shell, so
+you will not be able to produce a complete build of MAME. As such, we recommend
+that you *do not* install MinGW versions of GNU Make, and use the MSYS2 version
+of GNU Make from the ``make`` package.
-It is not possible to cross-compile a 32-bit version of MAME using 64-bit MinGW
-tools on Windows, the 32-bit MinGW tools must be used. This causes issues due
-to the size of MAME. It is not possible to link a full 32-bit MAME build
-including the SDL OS-dependent layer and the Qt debugger. GNU ld and lld will
-both run out of memory, leaving an output file that doesn’t work. It’s also
-impossible to make a 32-bit build with full local variable symbols. GCC may run
-out of memory, and certain source files may exceed the limit of 32,768 sections
-imposed by the PE/COFF object file format.
+A complete build of MAME including line number symbols exceeds the size limit
+imposed by the PE file format and cannot be run. Workarounds include including
+only a subset of the systems supported by MAME, extracting symbols to a separate
+file and stripping excess symbols from the MAME executable, or compiling MAME
+using clang with the option to place symbols in external PDB files.
.. _compiling-fedora:
@@ -253,7 +271,7 @@ Fedora Linux
You’ll need a few prerequisites from your Linux distribution. Make sure you get
SDL 2 version 2.0.14 or later as earlier versions lack required functionality::
- sudo dnf install gcc gcc-c++ SDL2-devel SDL2_ttf-devel libXi-devel libXinerama-devel qt5-qtbase-devel qt5-qttools expat-devel fontconfig-devel alsa-lib-devel pulseaudio-libs-devel
+ sudo dnf install git gcc gcc-c++ SDL2-devel SDL2_ttf-devel libXi-devel libXinerama-devel qt6-qtbase-devel expat-devel fontconfig-devel alsa-lib-devel pulseaudio-libs-devel
If you want to use the more efficient LLVM tools for archiving static libraries
and linking, you’ll need to install the corresponding packages::
@@ -269,7 +287,7 @@ the theme and the SVG converter::
The HTML documentation can be built with this command::
- make -C docs SPHINXBUILD=sphinx-build-3 html
+ make -C docs html
.. _compiling-ubuntu:
@@ -280,7 +298,7 @@ Debian and Ubuntu (including Raspberry Pi and ODROID devices)
You’ll need a few prerequisites from your Linux distribution. Make sure you get
SDL 2 version 2.0.14 or later as earlier versions lack required functionality::
- sudo apt-get install git build-essential python3 libsdl2-dev libsdl2-ttf-dev libfontconfig-dev libpulse-dev qtbase5-dev qtbase5-dev-tools qtchooser qt5-qmake
+ sudo apt-get install git build-essential python3 libsdl2-dev libsdl2-ttf-dev libfontconfig-dev libpulse-dev qt6-base-dev qt6-base-dev-tools qtchooser
Compilation is exactly as described above in All Platforms. Note the Ubuntu
Linux modifies GCC to enable the GNU C Library “fortify source” feature by
@@ -294,7 +312,7 @@ Arch Linux
You’ll need a few prerequisites from your distro::
- sudo pacman -S base-devel git sdl2_ttf python libxinerama libpulse alsa-lib qt5-base
+ sudo pacman -S base-devel git sdl2_ttf python libxinerama libpulse alsa-lib qt6-base
Compilation is exactly as described above in All Platforms.
@@ -353,7 +371,7 @@ above in All Platforms.
Emscripten Javascript and HTML
------------------------------
-First, download and install Emscripten 2.0.25 or later by following the
+First, download and install Emscripten 3.1.35 or later by following the
instructions at the `official site <https://emscripten.org/docs/getting_started/downloads.html>`_.
Once Emscripten has been installed, it should be possible to compile MAME
@@ -445,7 +463,7 @@ can install these packages with
pacman -S mingw-w64-x86_64-librsvg mingw-w64-x86_64-python-sphinx mingw-w64-x86_64-python-sphinxcontrib-svg2pdfconverter
If you intend to make a PDF via LaTeX, you’ll need to install a LaTeX
-distribution such as TeX Live:
+distribution such as TeX Live:
.. code-block:: bash
@@ -471,7 +489,7 @@ On Debian, you’ll need to install the **librsvg2-bin** package:
sudo apt-get install librsvg2-bin
If you intend to make a PDF via LaTeX, you’ll need to install a LaTeX
-distribution such as TeX Live:
+distribution such as TeX Live:
.. code-block:: bash
@@ -510,10 +528,10 @@ BUILDDIR
REGENIE
Set to **1** to force project files to be regenerated.
VERBOSE
- Set to **1** to show full commands when using GNU make as the build tool.
+ Set to **1** to show full commands when using GNU Make as the build tool.
This option applies immediately without needing regenerate project files.
IGNORE_GIT
- Set to **1** to skip the working tree scan and not attempt to embed a git
+ Set to **1** to skip the working tree scan and not attempt to embed a Git
revision description in the version string.
Tool locations
@@ -529,6 +547,8 @@ OVERRIDE_LD
Set the linker command. This is often not necessary or useful because the C
or C++ compiler command is used to invoke the linker. (This sets the target
linker command when cross-compiling.)
+OVERRIDE_AR
+ Set static library archiver command.
PYTHON_EXECUTABLE
Set the Python interpreter command. You need Python 3.2 or later to build
MAME.
@@ -545,7 +565,7 @@ Including subsets of supported systems
SUBTARGET
Set emulator subtarget to build. Some pre-defined subtargets are provided,
using Lua scripts in *scripts/target/mame* and system driver filter files in
- *src/mame*. User-defined substargets can be created using the **SOURCES**
+ *src/mame*. User-defined subtargets can be created using the **SOURCES**
or **SOURCEFILTER** option.
SOURCES
Specify system driver source files and/or folders to include. Usually used
@@ -624,6 +644,14 @@ SYMLEVEL
similar compilers, **1** includes line number tables and external variables,
**2** also includes local variables, and **3** also includes macro
definitions.
+PDB_SYMBOLS
+ Set to **1** to generate CodeView format symbols in separate PDB files,
+ allowing source-level debugging using Microsoft Visual Studio or WinDbg.
+ It can also be used with other tools that can load symbols from PDB files,
+ e.g. the Intel VTune and AMD µProf performance analysis tools. This option
+ is only supported for MinGW builds using the clang compiler and the LLVM
+ linker (lld). This option only takes effect if the **SYMBOLS** option is
+ set to a non-zero value.
ARCHOPTS
Additional command-line options to pass to the compiler and linker. This is
useful for supplying code generation or ABI options, for example to enable
@@ -700,13 +728,6 @@ USE_SYSTEM_LIB_PUGIXML
Known Issues
------------
-Issues with specific compiler versions
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-* GCC 7 for 32-bit x86 targets produces spurious out-of-bounds access warnings.
- Adding **NOWERROR=1** to your build options works around this by not treating
- warnings as errors.
-
GNU C Library fortify source feature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -730,7 +751,7 @@ the ``_FORTIFY_SOURCE`` macro is set in the RPM build environment, and not by
distributing a modified version of GCC.)
If you get compilation errors in ``bits/string_fortified.h`` you should first
-ensure that the ``_FORTIY_SOURCE`` macro is defined via the environment (e.g.
+ensure that the ``_FORTIFY_SOURCE`` macro is defined via the environment (e.g.
a **CFLAGS** or **CXXFLAGS** environment variable). You can check to see
whether the ``_FORTIFY_SOURCE`` macro is a built-in macro with your version of
GCC with a command like this:
@@ -742,30 +763,24 @@ around it by adding **-U_FORTIFY_SOURCE** to the compiler flags (e.g. by using
the **ARCHOPTS** setting, or setting the **CFLAGS** and **CXXFLAGS** environment
variables.
+Issues affecting MinGW clang
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+MinGW clang and llvm can give spurious undefined symbol errors when linking
+using CodeView format symbols with high symbol detail levels. If you encounter
+undefined symbol errors when linking with **PDB_SYMBOLS=1** to produce CodeView
+format symbols, try setting **SYMLEVEL=1** to reduce the symbol detail level
+(line number tables will still be included, but local variables will be
+omitted).
+
Issues affecting Microsoft Visual Studio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Microsoft introduced a new version of XAudio2 with Windows 8 that’s incompatible
-with the version included with DirectX for prior Windows versions at the API
-level. Newer versions of the Microsoft Windows SDK include headers and libraries
-for the new version of XAudio2. By default, the target Windows version is set to
-Windows Vista (6.0) when compiling MAME, which prevents the use of this version
-of the XAudio2 headers and libraries. To build MAME with XAudio2 support using
-the Microsoft Windows SDK, you must do one of the following:
-
-* Add ``MODERN_WIN_API=1`` to the options passed to make when generating the
- Visual Studio project files. This will set the target Windows version to
- Windows 8 (6.2). The resulting binaries may not run on earlier versions of
- Windows.
-* Install the DirectX SDL and configure the **osd_windows** project to search
- the DirectX header/library paths before searching the Microsoft Windows SDK
- paths.
-
The MSVC compiler produces spurious warnings about potentially uninitialised
local variables. You currently need to add ``NOWERROR=1`` to the options passed
to make when generating the Visual Studio project files. This stops warnings
from being treated as errors. (MSVC seems to lack options to control which
-specific warnings are treated as error, which other compilers support.)
+specific warnings are treated as errors, which other compilers support.)
.. _compiling-unusual:
@@ -783,6 +798,16 @@ over a network). To use the LLVM linker with GCC, ensure the LLVM linker is
installed and add ``-fuse-ld=lld`` to the linker options (e.g. in the
**LDFLAGS** environment variable or in the **ARCHOPTS** setting).
+Creating static libraries using the LLVM archiver
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The LLVM archiver is generally faster than the GNU archiver that is used by
+default. This is more pronounced on systems with a high overhead for file
+system operations (e.g. Microsoft Windows, or when compiling on a disk mounted
+over a network). To use the LLVM archiver, ensure the LLVM archiver is
+installed and add ``OVERRIDE_AR=llvm-ar`` to the options passed to make when
+generating the project files.
+
Cross-compiling MAME
~~~~~~~~~~~~~~~~~~~~
@@ -822,7 +847,7 @@ Using a GCC/GNU libstdc++ installation in a non-standard location on Linux
GCC may be built and installed to a custom location, typically by supplying the
**--prefix=** option to the **configure** command. This may be useful if you
want to build MAME on a Linux distribution that still uses a version of GNU
-libstdC++ that predates C++17 support. To use an alternate GCC installation to,
+libstdc++ that predates C++20 support. To use an alternate GCC installation to
build MAME, set the C and C++ compilers to the full paths to the **gcc** and
**g++** commands, and add the library path to the run-time search path. If you
installed GCC in /opt/local/gcc72, you might use a command like this::
diff --git a/docs/source/initialsetup/mameintro.rst b/docs/source/initialsetup/mameintro.rst
index 61be99b68a9..57813b8556c 100644
--- a/docs/source/initialsetup/mameintro.rst
+++ b/docs/source/initialsetup/mameintro.rst
@@ -68,14 +68,22 @@ MAME is written in C++, and has been ported to numerous platforms. Over time, as
computer hardware has evolved, the MAME code has evolved as well to take
advantage of the greater processing power and hardware capabilities offered.
-The official MAME binaries are compiled and designed to run on a standard
-Windows-based system. The minimum requirements are:
-
-* Intel Core 2-series CPU or equivalent, at least 2.0 GHz
-* 64-bit OS (Windows 7 or later on Windows, macOS 10.9 or later on Mac)
+The official MAME binary packages are compiled and designed to run on standard
+Windows-based systems. The minimum requirements are:
+
+* An x86-64 CPU implementing the x86-64v2 feature set (16-byte compare/exchange,
+ ``lahf``/``sahf`` instructions in long mode, population count instruction and
+ SSE 4.2), or
+* An Arm CPU implementing the ARMv8.2-A feature set
+* A 64-bit edition of Windows 10 or later
* 4 GB RAM
-* DirectX 9.0c for Windows
-* A Direct3D, or OpenGL capable graphics card
+* DirectX 9.0c for Windows
+* A Direct3D or OpenGL capable GPU with support for non-power-of-two texture
+ sizes
+
+In general, any x86-64 CPU from 2015 onwards or the vast majority of 64-bit Arm
+CPUs from 2018 onwards should be suitable. It is possible to compile MAME
+yourself with support for older CPUs at the cost of some performance.
Of course, the minimum requirements are just that: minimal. You may not get
optimal performance from such a system, but MAME should run. Modern versions of
diff --git a/docs/source/license.rst b/docs/source/license.rst
index aaffd97a169..0b4741bb938 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -12,7 +12,7 @@ would encourage new contributors to distribute files under this license.
Please note that MAME is a registered trademark of Gregory Ember, and permission
is required to use the “MAME” name, logo, or wordmark.
- Copyright (c) 1997-2024 MAMEDev and contributors
+ Copyright (c) 1997-2026 MAMEDev and contributors
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/docs/source/luascript/ref-common.rst b/docs/source/luascript/ref-common.rst
index c08d3676621..6a7c735951c 100644
--- a/docs/source/luascript/ref-common.rst
+++ b/docs/source/luascript/ref-common.rst
@@ -99,6 +99,12 @@ emu.add_machine_post_load_notifier(callback)
Add a callback to receive notification after the emulated system is restored
to a previously saved state. Returns a
:ref:`notifier subscription <luascript-ref-notifiersub>`.
+emu.register_sound_update(callback)
+ Add a callback to receive new samples that have been created. The samples
+ are coming from the sound devices for which the hook property has been set
+ to true. The callback gets one parameter which is a hash with device tag
+ as key and a (channel-sized) vector of (buffer-sized) vector of samples
+ in the -1..1 range.
emu.print_error(message)
Print an error message.
emu.print_warning(message)
diff --git a/docs/source/luascript/ref-core.rst b/docs/source/luascript/ref-core.rst
index 7b72d90ebdb..29234691592 100644
--- a/docs/source/luascript/ref-core.rst
+++ b/docs/source/luascript/ref-core.rst
@@ -197,6 +197,8 @@ machine:popmessage([msg])
machine:logerror(msg)
Writes the message to the machine error log. This may be displayed in a
debugger window, written to a file, or written to the standard error output.
+machine:side_effects_disabled()
+ Returns a Boolean indicating whether side effects are disabled.
Properties
~~~~~~~~~~
@@ -404,9 +406,8 @@ sound.debugger_mute (read/write)
sound.system_mute (read/write)
A Boolean indicating whether sound output is muted at the request of the
emulated system.
-sound.attenuation (read/write)
- The output volume attenuation in decibels. Should generally be a negative
- integer or zero.
+sound.volume (read/write)
+ The output volume in decibels. Should generally be a negative or zero.
sound.recording (read-only)
A Boolean indicating whether sound output is currently being recorded to a
WAV file.
diff --git a/docs/source/luascript/ref-devices.rst b/docs/source/luascript/ref-devices.rst
index 1c3eabdbd2d..b28670183f6 100644
--- a/docs/source/luascript/ref-devices.rst
+++ b/docs/source/luascript/ref-devices.rst
@@ -67,6 +67,9 @@ manager.machine.images
manager.machine.slots
Returns a device enumerator that will iterate over
:ref:`slot devices <luascript-ref-dislot>` in the system.
+manager.machine.sounds
+ Returns a device enumerator that will iterate over
+ :ref:`sound devices <luascript-ref-disound>` in the system.
emu.device_enumerator(device, [depth])
Returns a device enumerator that will iterate over
:ref:`devices <luascript-ref-device>` in the sub-tree starting at the
@@ -456,6 +459,67 @@ screen.palette (read-only)
format.
+.. _luascript-ref-vectordev:
+
+Vector device
+-------------
+
+Wraps MAME’s ``vector_device`` class, which represents an emulated X/Y vector display.
+
+Instantiation
+~~~~~~~~~~~~~
+
+manager.machine.vector_devices[tag]
+ Gets a vector device by tag relative to the root machine device, or ``nil``
+ if no such device exists or it is not a vector device.
+
+Base classes
+~~~~~~~~~~~~
+
+* :ref:`luascript-ref-device`
+
+Methods
+~~~~~~~
+
+vector:add_frame_begin_notifier(callback)
+ Add a callback to receive notifications when the processing of vectors
+ begins. The callback is not passed any arguments.
+ Returns a :ref:`notifier subscription <luascript-ref-notifiersub>`.
+vector:add_frame_end_notifier(callback)
+ Add a callback to receive notifications when the processing of vectors
+ begins. The callback is not passed any arguments.
+ Returns a :ref:`notifier subscription <luascript-ref-notifiersub>`.
+vector:add_line_notifier(callback)
+ Add a callback to receive notifications when the vector beam moves
+ between two points with a non-zero beam intensity. The callback is
+ passed the following arguments, in order:
+
+ - **lastx:** The old horizontal beam position.
+ - **lasty:** The old vertical beam position.
+ - **x:** The current horizontal beam position.
+ - **y:** The current vertical beam position.
+ - **color:** The beam color, as a 24-bit RGB value.
+ - **intensity:** The beam intensity, as an 8-bit value.
+ - **width:** The configured pixel width of the virtual vector display.
+ - **height:** The configured pixel width of the virtual vector display.
+
+ Returns a :ref:`notifier subscription <luascript-ref-notifiersub>`.
+vector:add_move_notifier(callback)
+ Add a callback to receive notifications when the vector beam moves
+ with an intensity of zero. Provided as a convenience feature as
+ the previous position and intensity of the beam is not meaningful
+ when "jumping" the vector beam. The callback is passed the following
+ arguments, in order:
+
+ - **x:** The current horizontal beam position.
+ - **y:** The current vertical beam position.
+ - **color:** The beam color, as a 24-bit RGB value.
+ - **width:** The configured pixel width of the virtual vector display.
+ - **height:** The configured pixel width of the virtual vector display.
+
+ Returns a :ref:`notifier subscription <luascript-ref-notifiersub>`.
+
+
.. _luascript-ref-cassdev:
Cassette image device
@@ -624,6 +688,52 @@ image.device (read-only)
The underlying :ref:`device <luascript-ref-device>`.
+.. _luascript-ref-disound:
+
+Sound device interface
+----------------------
+
+Wraps MAME’s ``device_sound_interface`` class which is a mix-in implemented by
+devices that input and/or output sound.
+
+Instantiation
+~~~~~~~~~~~~~
+
+manager.machine.sounds[tag]
+ Gets an sound device by tag relative to the root machine device, or ``nil``
+ if no such device exists or it is not a slot device.
+
+Properties
+~~~~~~~~~~
+
+sound.inputs (read-only)
+ Number of sound inputs of the device.
+
+sound.outputs (read-only)
+ Number of sound outputs of the device.
+
+sound.microphone (read-only)
+ True if the device is a microphone, false otherwise
+
+sound.speaker (read-only)
+ True if the device is a speaker, false otherwise
+
+sound.io_positions[] (read-only)
+ Non-empty only for microphones and speakers, indicates the positions of
+ the inputs or outputs as (x, y, z) coordinates (e.g. [-0.2, 0.0, 1.0])
+
+sound.io_names[] (read-only)
+ Non-empty only for microphones and speakers, indicates the positions of
+ the inputs or outputs as strings (e.g. Front Left)
+
+sound.hook
+ A boolean indicating whether to tap the output samples of this device in
+ the global sound hook.
+
+sound.device (read-only)
+ The underlying :ref:`device <luascript-ref-device>`.
+
+
.. _luascript-ref-dislot:
Slot device interface
diff --git a/docs/source/luascript/ref-input.rst b/docs/source/luascript/ref-input.rst
index f146d6c78ff..0130f500e58 100644
--- a/docs/source/luascript/ref-input.rst
+++ b/docs/source/luascript/ref-input.rst
@@ -269,6 +269,20 @@ field:set_value(value)
field:clear_value()
Clear programmatically overridden value and restore the field’s regular
behaviour.
+field:set_sensitivity(sensitivity)
+ Set the sensitivity or gain for analog fields. Raises an error for digital
+ fields.
+field:set_keydelta(sensitivity)
+ Set the sensitivity to corresponding digital increment/decrement inputs for
+ analog fields. Raises an error for digital fields.
+field:set_centerdelta(sensitivity)
+ Set the speed at which non-wrapping analog fields return to their default
+ values after associated digital increment/decrement inputs are released.
+ Raises an error for digital fields and wrapping analog fields.
+field:set_analog_reverse(reverse)
+ Set whether an analog field’s value increases in the opposite direction to
+ the convention (e.g. larger values when a pedal is released or a joystick is
+ moved to the left). Raises an error for digital fields.
field:set_input_seq(seqtype, seq)
Set the :ref:`input sequence <luascript-ref-inputseq>` for the specified
sequence type. This is used to configure per-machine input settings. The
@@ -319,6 +333,32 @@ field.maxvalue (read-only)
The maximum allowed value for analog fields, or ``nil`` for digital fields.
field.sensitivity (read-only)
The sensitivity or gain for analog fields, or ``nil`` for digital fields.
+field.default_sensitivity (read-only)
+ The default sensitivity or gain for analog fields, or ``nil`` for digital
+ fields.
+field.keydelta (read-only)
+ The sensitivity to corresponding digital increment/decrement inputs for
+ analog fields, or ``nil`` for digital fields.
+field.default_keydelta (read-only)
+ The default sensitivity to corresponding digital increment/decrement inputs
+ for analog fields, or ``nil`` for digital fields.
+field.centerdelta (read-only)
+ The speed at which non-wrapping analog fields return to their default values
+ after associated digital increment/decrement inputs are released, or ``nil``
+ for digital fields and wrapping analog fields.
+field.default_centerdelta (read-only)
+ The default speed at which non-wrapping analog fields return to their
+ default values after associated digital increment/decrement inputs are
+ released, or ``nil`` for digital fields and wrapping analog fields.
+field.analog_reverse (read-only)
+ A Boolean indicating whether the value increases in the opposite direction
+ to the convention for analog fields (e.g. larger values when a pedal is
+ released or a joystick is moved to the left), or ``nil`` for digital fields.
+field.default_analog_reverse (read-only)
+ A Boolean indicating whether the value increases in the opposite direction
+ to the convention by default for analog fields (e.g. larger values when a
+ pedal is released or a joystick is moved to the left), or ``nil`` for
+ digital fields.
field.way (read-only)
The number of directions allowed by the restrictor plate/gate for a digital
joystick, or zero (0) for other inputs.
@@ -333,22 +373,12 @@ field.is_digital_joystick (read-only)
switch.
field.enabled (read-only)
A Boolean indicating whether the field is enabled.
-field.optional (read-only)
- A Boolean indicating whether the field is optional and not required to use
- the emulated system.
field.cocktail (read-only)
A Boolean indicating whether the field is only used when the system is
configured for a cocktail table cabinet.
field.toggle (read-only)
A Boolean indicating whether the field corresponds to a hardware toggle
switch or push-on, push-off button.
-field.rotated (read-only)
- A Boolean indicating whether the field corresponds to a control that is
- rotated relative its standard orientation.
-field.analog_reverse (read-only)
- A Boolean indicating whether the field corresponds to an analog control that
- increases in the opposite direction to the convention (e.g. larger values
- when a pedal is released or a joystick is moved to the left).
field.analog_reset (read-only)
A Boolean indicating whether the field corresponds to an incremental
position input (e.g. a dial or trackball axis) that should be reset to zero
diff --git a/docs/source/luascript/ref-mem.rst b/docs/source/luascript/ref-mem.rst
index 0987889d3dc..3bad440ae34 100644
--- a/docs/source/luascript/ref-mem.rst
+++ b/docs/source/luascript/ref-mem.rst
@@ -123,7 +123,8 @@ space:install_read_tap(start, end, name, callback)
Installs a :ref:`pass-through handler <luascript-ref-addrspacetap>` that
will receive notifications on reads from the specified range of addresses in
the address space. The start and end addresses are inclusive. The name
- must be a string, and the callback must be a function.
+ must be a string, and the callback must be a function. Returns the new
+ pass-through handler.
The callback is passed three arguments for the access offset, the data read,
and the memory access mask. The offset is the absolute offset into the
@@ -134,7 +135,8 @@ space:install_write_tap(start, end, name, callback)
Installs a :ref:`pass-through handler <luascript-ref-addrspacetap>` that
will receive notifications on write to the specified range of addresses in
the address space. The start and end addresses are inclusive. The name
- must be a string, and the callback must be a function.
+ must be a string, and the callback must be a function. Returns the new
+ pass-through handler.
The callback is passed three arguments for the access offset, the data
written, and the memory access mask. The offset is the absolute offset into
diff --git a/docs/source/plugins/autofire.rst b/docs/source/plugins/autofire.rst
index 2cb974626d2..5dd8eb21cf0 100644
--- a/docs/source/plugins/autofire.rst
+++ b/docs/source/plugins/autofire.rst
@@ -44,11 +44,10 @@ The options for adding a new autofire button or modifying an existing autofire
button are the same.
Select **Input** to set the emulated button that you want to simulate pressing
-repeatedly. Currently, only player buttons are supported. Typically you’ll set
-this to the primary fire button for shooting games. This is most often *P1
-Button 1* or the equivalent for another player, but it might have a
-different name. On Konami’s Gradius games, *P1 Button 2* is the primary fire
-button.
+repeatedly. Only digital inputs are supported. Typically you’ll set this to
+the primary fire button for shooting games. This is most often *P1 Button 1*
+or the equivalent for another player, but it might have a different name. On
+Konami’s Gradius games, *P1 Button 2* is the primary fire button.
Select **Hotkey** to set the control (or combination of controls) you’ll use to
activate the autofire button. This can be any combination that MAME supports
@@ -75,6 +74,13 @@ When modifying an existing autofire button, select **Done** or press the UI
Cancel key to return to the list of autofire buttons. Changes take effect
immediately.
+When modifying an existing autofire button, select **Delete** to delete the
+autofire button. The autofire button will be deleted immediately when you
+select **Delete** without requiring additional confirmation. You can also
+delete an autofire button by highlighting it in the list of autofire buttons
+and pressing the UI Clear key (Del/Delete/Forward Delete on the keyboard by
+default).
+
.. _plugins-autofire-notes:
diff --git a/docs/source/plugins/data.rst b/docs/source/plugins/data.rst
index 01c5d641307..3a754dd3501 100644
--- a/docs/source/plugins/data.rst
+++ b/docs/source/plugins/data.rst
@@ -25,7 +25,7 @@ The following files are supported:
history.xml
From Gaming-History (formerly Arcade-History)
mameinfo.dat
- From `MASH’s MAMEINFO <https://mameinfo.mameworld.info/>`_
+ From `MASH’s MAMEINFO <https://mashinfo.github.io/mameinfo/>`_
messinfo.dat
From `progetto-SNAPS MESSINFO.dat
<https://www.progettosnaps.net/messinfo/>`_
diff --git a/docs/source/plugins/index.rst b/docs/source/plugins/index.rst
index 38dfb393f3e..e6c6f57373f 100644
--- a/docs/source/plugins/index.rst
+++ b/docs/source/plugins/index.rst
@@ -70,5 +70,6 @@ sample code that you can use as a starting point when writing your own plugins.
hiscore
inputmacro
layout
+ offscreenreload
timecode
timer
diff --git a/docs/source/plugins/inputmacro.rst b/docs/source/plugins/inputmacro.rst
index 959faa05fbe..0cdbc0c25ad 100644
--- a/docs/source/plugins/inputmacro.rst
+++ b/docs/source/plugins/inputmacro.rst
@@ -20,11 +20,13 @@ the running events in Track & Field, or the eating minigame in Daisu-Kiss.
To configure the input macro plugin, activate the main menu (press **Tab**
during emulation by default), select **Plugin Options**, and then select **Input
Macros**. Configured input macros for the current system are listed, along with
-their activation sequences (initially there will be no input macros configured).
-Select a macro to edit it, or choose **Add macro** to set up a new input macro.
-See :ref:`plugins-inputmacro-settings` for details on editing input macros. You
-can delete an input macro by highlighting it in the menu and pressing the UI
-Clear key (Del/Delete/Forward Delete on the keyboard by default).
+their activation combinations (initially there will be no input macros
+configured). Select a macro to edit it, or choose **Add macro** to set up a new
+input macro. See :ref:`plugins-inputmacro-settings` for details on editing
+input macros. You can delete an input macro by highlighting it in the menu and
+pressing the UI Clear key (Del/Delete/Forward Delete on the keyboard by
+default). You can also delete a macro by selecting the macro to edit it and
+then selecting **Delete macro** from the menu.
Input macros are saved in the **inputmacro** folder in the plugin data folder
(see the :ref:`homepath option <mame-commandline-homepath>`). A file is created
@@ -44,7 +46,7 @@ The options for editing input macros are the same whether you’re creating a ne
macro or editing an existing macro. Input macros consist of a sequence of
*steps*. Each step optionally waits for a configurable delay, then activates
one or more emulated inputs for a specified duration. You can choose what
-should happen if the activation sequence is still held when the final step of
+should happen if the activation combination is still held when the final step of
the macro completes: the emulated inputs can be released, the final step can be
prolonged, or the macro can loop back to any step in the sequence.
@@ -61,21 +63,21 @@ whole:
controls) you want to use to activate the macro. Keep in mind that regular
input assignments still apply, so you will probably want to use a combination
that isn’t being used for any other emulated input in the system.
-* Set **On release** to specify what should happen if the activation sequence is
- released before the macro completes. When set to *Stop immediately*, any
+* Set **On release** to specify what should happen if the activation combination
+ is released before the macro completes. When set to *Stop immediately*, any
emulated inputs activated by the macro will be released immediately, and no
further steps will be processed; when set to *Complete macro*, the macro will
continue to be processed until the end of the final step.
-* Set **When held** to specify what should happen if the activation sequence is
- held after the final step of the macro completes. When set to *Release*, any
- inputs activated by the macro will be released, and the macro will not be
- reactivated until the activation sequence is released and pressed again; when
- set to *Prolong step <n>* where *<n>* is the number of the final step of the
- macro, the emulated inputs activated by the final step of the macro will
- remain active until the activation sequence is released; when set to *Loop to
- step <n>* where *<n>* is a step number, macro processing will return to that
- step, including its delay, if the activation sequence is held after the final
- step completes.
+* Set **When held** to specify what should happen if the activation combination
+ is held after the final step of the macro completes. When set to *Release*,
+ any inputs activated by the macro will be released, and the macro will not be
+ reactivated until the activation combination is released and pressed again;
+ when set to *Prolong step <n>* where *<n>* is the number of the final step of
+ the macro, the emulated inputs activated by the final step of the macro will
+ remain active until the activation combination is released; when set to *Loop
+ to step <n>* where *<n>* is a step number, macro processing will return to
+ that step, including its delay, if the activation combination is held after
+ the final step completes.
Each step has delay, duration and input settings:
@@ -88,12 +90,17 @@ Each step has delay, duration and input settings:
completing the macro in the case of the final step). You can reset the
setting to one frame by pressing the UI Clear key.
* Set the **Input** settings to the emulated inputs to activate for the step.
- Only non-toggle digital inputs are supported. Select **Add input** to set
- multiple inputs for a step (this option will only appear after you set the
- first input for the initially created step when creating a new macro). If
- the step has multiple inputs, you can highlight an input on the menu and press
- the UI Clear key to delete it (all steps must have at least one input, so you
- can’t delete the only input for a step).
+ Only non-toggle digital inputs and non-wrapping analog inputs are supported.
+ Select **Add input** to set multiple inputs for a step (this option will only
+ appear after you set the first input for the initially created step when
+ creating a new macro). If the step has multiple inputs, you can highlight an
+ input on the menu and press the UI Clear key to delete it (all steps must have
+ at least one input, so you can’t delete the only input for a step).
+* For analog inputs, you can set the desired **Value** that the input should
+ have at each step. You can adjust the value by pressing the UI Left and UI
+ Right keys, or type a numeric value and press the UI Select key to accept the
+ new value. The value will be limited to the valid range for the input.
+ Pressing the UI Clear key will set the default value for the input.
* If the macro has multiple steps, you can select **Delete step** to delete a
step (this options does not appear if the macro only has a single step).
Remember to check that the **On release** and **When held** settings are
@@ -109,16 +116,22 @@ item will only appear after you set the first input for the initially created
step when creating a new macro.
When creating a new macro, there is a **Cancel** option that changes to
-**Create** after you set the activating sequence and the first input for the
+**Create** after you set the activation combination and the first input for the
initially created step. Select **Create** to finish creating the macro and
return to the list of input macros. The new macro will be added at the end of
the list. Press the UI Back key, or select **Cancel** before setting the
-activation sequence/input, to return to the previous menu without creating the
-new macro.
+activation combination/input, to return to the previous menu without creating
+the new macro.
When editing an existing macro, select **Done** or press the UI Back key to
return to the list of input macros. Changes take effect immediately.
+When editing an existing macro, select **Delete macro** to delete the macro.
+The macro will be deleted immediately when you select **Delete macro** without
+requiring additional confirmation. You can also delete a macro by highlighting
+it in the list of macros and pressing the UI Clear key (Del/Delete/Forward
+Delete on the keyboard by default).
+
.. _plugins-inputmacro-examples:
@@ -225,6 +238,59 @@ pressing a single key:
* **Input 1**: P1 Jab Punch
This macro involves steps that activate multiple inputs. The macro will
-complete if the activation sequence is released early, allowing you to tap the
-key momentarily to perform the move. Holding the activation sequence holds down
-the attack button.
+complete if the activation combination is released early, allowing you to tap
+the key momentarily to perform the move. Holding the activation sequence holds
+down the attack button.
+
+Virtua Cop Aim Off-Screen
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This macro allows you to hold a key to simulate pointing the lightgun away from
+the screen:
+
+* **Name**: 1P Aim Off-Screen
+* **Activation combination**: Kbd Alt
+* **On release**: Stop immediately
+* **When held**: Prolong step 1
+* **Step 1**:
+
+ * **Delay (frames)**: 0
+ * **Duration (frames)**: 1
+ * **Input 1**: Lightgun X
+ * **Value (131-630)**: 131
+ * **Input 2**: Lightgun Y
+ * **Value (36-425)**: 36
+
+This macro involves setting analog input values.
+
+Invasion: The Abductors Reload
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to reload, this game requires the lightgun to be pointed away from the
+screen for about a tenth of a second before pulling the trigger, and it requires
+the trigger to be held for a similar duration. This makes it unsuitable for use
+with the :ref:`Off-Screen Reload Helper plugin <plugins-offscreenreload>`.
+However, you can use a two-step macro to produce the required actions when
+pressing a key or button:
+
+* **Name**: 1P Reload
+* **Activation combination**: Kbd Shift
+* **On release**: Complete macro
+* **When held**: Prolong step 2
+* **Step 1**:
+
+ * **Delay (frames)**: 0
+ * **Duration (frames)**: 6
+ * **Input 1**: Lightgun X
+ * **Value (0-255)**: 255
+* **Step 2**:
+
+ * **Delay (frames)**: 0
+ * **Duration (frames)**: 6
+ * **Input 1**: Lightgun X
+ * **Value (0-255)**: 255
+ * **Input 2**: P1 Button 1
+
+This macro involves multiple steps, setting analog input values, activating
+multiple inputs simultaneously, and completing the macro even if the activation
+combination is only pressed momentarily.
diff --git a/docs/source/plugins/offscreenreload.rst b/docs/source/plugins/offscreenreload.rst
new file mode 100644
index 00000000000..99985876fda
--- /dev/null
+++ b/docs/source/plugins/offscreenreload.rst
@@ -0,0 +1,90 @@
+.. _plugins-offscreenreload:
+
+Off-Screen Reload Helper Plugin
+===============================
+
+.. contents:: :local:
+
+
+.. _plugins-offscreenreload-intro:
+
+Introduction
+------------
+
+The off-screen reload helper plugin makes it easier to play games that require
+you to aim a lightgun away from the screen to perform actions (usually
+reloading). You can use a key or button combination to simulate aiming the
+lightgun away from the screen and pulling the trigger.
+
+To configure the off-screen reload helper plugin, activate the main menu (press
+**Tab** during emulation by default), select **Plugin Options**, and then select
+**Off-Screen Reload Helper**. Configured off-screen reload helpers for the
+current system are listed, along with their activation sequences (initially
+there will be no off-screen reload helpers configured). Select a reload helper
+to edit it, or choose **Add reload helper** to set up a new off-screen reload
+helper. See :ref:`plugins-offscreenreload-settings` for details on editing
+off-screen reload helpers. You can delete an off-screen reload helper by
+highlighting it in the menu and pressing the UI Clear key (Del/Delete/Forward
+Delete on the keyboard by default). You can also delete an off-screen reload
+helper by selecting it to edit it and then selecting **Delete reload helper**
+from the menu.
+
+This plugin works with games that recognise the simple condition of pulling the
+lightgun trigger while one of the lightgun axes reports its minimum value. This
+includes, for example, Lethal Enforcers and Virtua cop. Some games, for example
+Invasion: The Abductors, have more complex requirements to trigger reloading.
+Although this plugin is not suitable for use with those games, you can use the
+:ref:`Input Macro plugin <plugins-inputmacro>` to use a key or button
+combination to reload easily.
+
+Off-screen reload helpers are saved in the **offscreenreload** folder in the
+plugin data folder (see the :ref:`homepath option <mame-commandline-homepath>`).
+A file is created for each system with off-screen reload helpers configured,
+named according to the system’s short name (or ROM set name), with the extension
+``.cfg``. For example, input macros for the parent version of Lethal Enforcers
+will be saved in the file **lethalen.cfg** in the **offscreenreload** folder in
+your plugin data folder. The off-screen reload helpers are stored in JSON
+format.
+
+
+.. _plugins-offscreenreload-settings:
+
+Editing off-screen reload helpers
+---------------------------------
+
+The options for editing off-screen reload helpers are the same whether you’re
+creating a new reload helper or editing an existing one. An off-screen reload
+helper need an *axis input* (usually Y axis for the player’s lightgun), and a
+*trigger input* (usually button 1 for the player, corresponding to the
+lightgun’s trigger).
+
+* Select **Reload combination** to set the control (or combination of controls)
+ you want to use to activate the off-screen reload helper. You will probably
+ want to use a combination that isn’t being used for any other emulated input
+ in the system.
+* Select **Axis input** to set the axis input (often **Lightgun Y** for the
+ first player, or **Lightgun 2 Y** for the second player). Only non-wrapping
+ analog inputs are supported.
+* Select **Trigger input** to set the trigger input (often **P1 Button 1** for
+ the first player, or **P2 Button 1** for the second player). Only non-toggle
+ digital inputs are supported. The plugin attempts to guess the trigger input
+ when you change the axis input.
+
+When creating a new off-screen reload helper, there is a **Cancel** option that
+changes to **Create** after you set the reload combination, axis input and
+trigger input. Select **Create** to finish creating the reload helper and
+return to the list of off-screen reload helpers. The new reload helper will be
+added at the end of the list. Press the UI Back key, or select **Cancel**
+before setting the reload sequence/inputs, to return to the previous menu
+without creating the new reload helper.
+
+When editing an existing off-screen reload helper, select **Done** or press the
+UI Back key to return to the list of off-screen reload helpers. Changes take
+effect immediately.
+
+When editing an existing off-screen reload helper, select **Delete reload
+helper** to delete it. The off-screen reload helper will be deleted immediately
+when you select **Delete reload helper** without requiring additional
+confirmation. You can also delete an off-screen reload helper by highlighting
+it in the list of reload helpers and pressing the UI Clear key
+(Del/Delete/Forward Delete on the keyboard by default).
diff --git a/docs/source/techspecs/audio_effects.rst b/docs/source/techspecs/audio_effects.rst
new file mode 100644
index 00000000000..04e3763e5bd
--- /dev/null
+++ b/docs/source/techspecs/audio_effects.rst
@@ -0,0 +1,147 @@
+Audio effects
+=============
+
+.. contents:: :local:
+
+
+1. Generalities
+---------------
+
+The audio effects are effects that are applied to the sound between
+the speaker devices and the actual sound output. In the current
+implementation the effect chain is fixed (but not the effect
+parameters), and the parameters are stored in the cfg files. They are
+honestly not really designed for extensibility yet, if ever.
+
+Adding an effect requires working on four parts:
+
+* audio_effects/aeffects.* for effect object creation and "publishing"
+* audio_effects/youreffect.* for the effect implementation
+* frontend/mame/ui/audioeffects.cpp to be able to instantiate the effect configuration menu
+* frontend/mame/ui/audioyoureffect.* to implement the effect configuration menu
+
+2. audio_effects/aeffects.*
+---------------------------
+
+The audio_effect class in the aeffect sources provides three things:
+
+* an enum value to designate the effect type and which must match its
+ position in the chain (iow, the effect chain follows the enum order),
+ in the .h
+* the effect name in the audio_effect::effect_names array in the .cpp
+* the creation of a correct effect object in audio_effect::create in the .cpp
+
+
+
+3. audio_effects/youreffect.*
+-----------------------------
+
+This is where you implement the effect. It takes the shape of an
+audio_effect_youreffect class which derives from audio_effect.
+
+The methods to implement are:
+
+.. code-block:: C++
+
+ audio_effect_youreffect(u32 sample_rate, audio_effect *def);
+
+ virtual int type() const override;
+ virtual void config_load(util::xml::data_node const *ef_node) override;
+ virtual void config_save(util::xml::data_node *ef_node) const override;
+ virtual void default_changed() override;
+ virtual u32 history_size() const; // optional
+
+The constructor must pass the parameters to ``audio_effect`` and
+initialize the effect parameters. ``type`` must return the enum value
+for the effect. ``config_load`` and ``config_save`` should load or
+save the effect parameters from/to the cfg file xml tree.
+``default_changed`` is called when the parameters in ``m_default`` are
+changed and the parameters may need to be updated. ``history_size``
+allows to tell how many samples should still be available of the
+previous input frame. Note that this number must not depend on the
+parameters and only on the sample rate.
+
+An effect has a number of parameters that can come from three sources:
+
+* fixed default value
+* equivalent effect object from the default effect chain
+* user setting through the UI
+
+The first two are recognized through the value of ``m_default`` which
+gets the value of ``def`` in the constructor. When it's nullptr, the
+value to use when not set by the user is the fixed one, otherwise it's
+the one in ``m_default``.
+
+At minimum an effect should have a parameter allowing to bypass it.
+
+Managing a parameter uses four methods:
+
+* ``type param() const;`` returns the current parameter value
+* ``void set_param(type value);`` sets the current parameter value and marks it as set by the user
+* ``bool isset_param() const;`` returns true is the parameter was set by the user
+* ``void reset_param();`` resets the parameter to the default value (from m_default or fixed) and marks it as not set by the user
+
+``config_save`` must only save the user-set parameters.
+``config_load`` must retrieve the parameters that are present and mark
+them as set by the user and reset all the others.
+
+Finally the actual implementation goes into the ``apply`` method:
+
+.. code-block:: C++
+
+ virtual void apply(const emu::detail::output_buffer_flat<sample_t> &src, emu::detail::output_buffer_flat<sample_t> &dest) override;
+
+That method takes two buffers with the same number of channels and has
+to apply the effect to ``src`` to produce ``dest``. The
+``output_buffer_flat`` is non-interleaved with independent per-channel
+buffers.
+
+To make bypassing easier, the ``copy(src, dest)`` method of
+audio_effect allows to copy the samples from ``src`` to ``dest``
+without changing them.
+
+The effect application part should looks like:
+
+.. code-block:: C++
+
+ u32 samples = src.available_samples();
+ dest.prepare_space(samples);
+ u32 channels = src.channels();
+
+ // generate channels * samples results and put them in dest
+
+ dest.commit(samples);
+
+To get pointers to the buffers, one uses:
+
+.. code-block:: C++
+
+ const sample_t *source = src.ptrs(channel, source_index); // source_index must be in [-history_size()..samples-1]
+ sample_t *destination = dest.ptrw(channel, destination_index); // destination_index must be in [0..samples-1]
+
+The samples pointed by source and destination are contiguous. The
+number of channels will not change from one apply call to another, the
+number of samples will vary though. Also the call happens in a
+different thread than the main thread and also in a different thread
+than the parameter setting calls are made from.
+
+
+
+
+4. frontend/mame/ui/audioeffects.cpp
+------------------------------------
+
+Here it suffices to add a creation of the menu
+menu_audio_effect_youreffect in menu_audio_effects::handle. The menu
+effect will pick the effect names from audio_effect (in aeffect.*).
+
+
+5. frontend/mame/ui/audioyoureffect.*
+-------------------------------------
+
+This is used to implement the configuration menu for the effect. It's
+a little complicated because it needs to generate the list of
+parameters and their values, set left or right arrow flags depending
+on the possible modifications, dim them (FLAG_INVERT) when not set by
+the user, and manage the arrows and clear keys to change them. Just
+copy an existing one and change it as needed.
diff --git a/docs/source/techspecs/cpu_device.rst b/docs/source/techspecs/cpu_device.rst
index a3ca460796e..6b566a53ac3 100644
--- a/docs/source/techspecs/cpu_device.rst
+++ b/docs/source/techspecs/cpu_device.rst
@@ -140,7 +140,7 @@ The main loop then looks like this:
void device::execute_run()
{
if(m_inst_substate)
- call appropriate restarted instrution handler
+ call appropriate restarted instruction handler
while(m_icount > 0) {
debugger_instruction_hook(m_pc);
call appropriate non-restarted instruction handler
@@ -157,11 +157,73 @@ It is not a requirement to use a generator-based that method, but a
different one which does not have unacceptable performance
implications has not yet been found.
+3.4 Bus contention cpu_device interface
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-3.4 Interaction with DRC
+The main way to setup bus contention is through the memory maps.
+Lower-level access can be obtained through some methods on cpu_device
+though.
+
+.. code-block:: C++
+
+ bool cpu_device::access_before_time(u64 access_time, u64 current_time) noexcept;
+
+The method ``access_before_time`` allows to try to run an access at a
+given time in cpu cycles. It takes the current time
+(``total_cycles()``) and the expected time for the access. If there
+aren't enough cycles to reach that time the remaining cycles are eaten
+and the method returns true to tell not to do the access and call the
+method again eventually. Otherwise enough cycles are eaten to reach
+the access time and false is returned to tell to do the access.
+
+
+.. code-block:: C++
+
+ bool cpu_device::access_before_delay(u32 cycles, const void *tag) noexcept;
+
+The method ``access_before_delay`` allows to try to run an access
+after a given delay. The tag is an opaque, non-nullptr value used to
+characterize the source of the delay, so that the delay is not applied
+multiple times. Similarly to the previous method cycles are eaten and
+true is returned to abort the access, false to execute it.
+
+.. code-block:: C++
+
+ void cpu_device::access_after_delay(u32 cycles) noexcept;
+
+The method ``access_after_delay`` allows to add a delay after an
+access is done. There is no abort possible, hence no return boolean.
+
+.. code-block:: C++
+
+ void cpu_device::defer_access() noexcept;
+
+The method ``defer_access`` tells the cpu that we need to wait for an
+external event. It marks the access as to be redone, and eats all the
+remaining cycles of the timeslice. The idea is then that the access
+will be retried after time advances up to the next global system
+synchronisation event (sync, timer timeout or set_input_line). This
+is the method to use when for instance waiting on a magic latch for
+data expected from scsi transfers, which happen on timer timeouts.
+
+.. code-block:: C++
+
+ void cpu_device::retry_access() noexcept;
+
+The method ``retry_access`` tells the cpu that the access will need to
+be retried, and nothing else. This can easily reach a situation of
+livelock, so be careful. It is used for instance to simulate a wait
+line (for the z80 for instance) which is controlled through
+set_input_line. The idea is that the device setting wait does the
+set_input_line and a retry_access. The cpu core, as long as the wait
+line is set just eats cycles. Then, when the line is cleared the core
+will retry the access.
+
+
+3.5 Interaction with DRC
~~~~~~~~~~~~~~~~~~~~~~~~
At this point, interruptibility and DRC are entirely incompatible. We
do not have a method to quit the generated code before or after an
-access. It's theorically possible but definitely non-trivial.
+access. It's theoretically possible but definitely non-trivial.
diff --git a/docs/source/techspecs/device_sound_interface.rst b/docs/source/techspecs/device_sound_interface.rst
new file mode 100644
index 00000000000..80331b633f6
--- /dev/null
+++ b/docs/source/techspecs/device_sound_interface.rst
@@ -0,0 +1,319 @@
+The device_sound_interface
+==========================
+
+.. contents:: :local:
+
+
+1. The sound system
+-------------------
+
+The device sound interface is the entry point for devices that handle
+sound input and/or output. The sound system is built on the concept
+of *streams* which connect devices together with resampling and mixing
+applied transparently as needed. Microphones (audio input) and
+speakers (audio output) are specific known devices which use the same
+interface.
+
+2. Devices using device_sound_interface
+---------------------------------------
+
+2.1 Initialisation
+~~~~~~~~~~~~~~~~~~
+
+Sound streams must be created in the device_start (or
+interface_pre_start) method.
+
+.. code-block:: C++
+
+ sound_stream *stream_alloc(int inputs, int outputs, int sample_rate, sound_stream_flags flags = STREAM_DEFAULT_FLAGS);
+
+A stream is created with ``stream_alloc``. It takes the number of
+input and output channels, the sample rate and optionally flags.
+
+The sample rate can be SAMPLE_RATE_INPUT_ADAPTIVE,
+SAMPLE_RATE_OUTPUT_ADAPTIVE or SAMPLE_RATE_ADAPTIVE. In that case the
+chosen sample rate is the highest one among the inputs, outputs or
+both respectively. In case of loop, the chosen sample rate is the
+configured global sample rate.
+
+The only available non-default flag is STREAM_SYNCHRONOUS. When set,
+the sound generation method will be called for every sample
+individually. It's necessary for DSPs that run a program on every
+sample. but on the other hand it's expensive, so only to be used when
+required.
+
+Devices can create multiple streams. It's rare though. Some Yamaha
+chips should but don't. Inputs and outputs are numbered from 0 and
+arrange all streams in the order they are created.
+
+
+2.2 Sound input/output
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ virtual void sound_stream_update(sound_stream &stream);
+
+This method is required to be implemented to consume the input samples
+and/or compute the output ones. The stream to update for is passed as
+the parameter. See the streams section, specifically sample access,
+to see how to write the method.
+
+
+2.3 Stream information
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ int inputs() const;
+ int outputs() const;
+ std::pair<sound_stream *, int> input_to_stream_input(int inputnum) const;
+ std::pair<sound_stream *, int> output_to_stream_output(int outputnum) const;
+
+The method ``inputs`` returns the total number of inputs in the
+streams created by the device. The method ``outputs`` similarly
+counts the outputs. The other two methods allow to grab the stream
+and channel number for the device corresponding to the global input or
+output number.
+
+
+2.4 Gain management
+~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ float input_gain(int inputnum) const;
+ float output_gain(int outputnum) const;
+ void set_input_gain(int inputnum, float gain);
+ void set_output_gain(int outputnum, float gain);
+ void set_route_gain(int source_channel, device_sound_interface *target, int target_channel, float gain);
+
+ float user_output_gain() const;
+ float user_output_gain(int outputnum) const;
+ void set_user_output_gain(float gain);
+ void set_user_output_gain(int outputnum, float gain);
+
+Those methods allow to set the gain on every step of the routes
+between streams. All gains are multipliers, with default value 1.0.
+The steps are, from samples output in ``sound_stream_update`` to
+samples read in the next device's ``sound_stream_update``:
+
+* Per-channel output gain
+* Per-channel user output gain
+* Per-device user output gain
+* Per-route gain
+* Per-channel input gain
+
+The user gains must not be set from the driver, they're for use by the
+user interface (the sliders) and are saved in the game configuration.
+The other gains are for driver/device use, and are saved in save
+states.
+
+
+2.5 Routing setup
+~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ device_sound_interface &add_route(u32 output, const device_finder<T, R> &target, double gain, u32 channel = 0)
+ device_sound_interface &add_route(u32 output, const char *target, double gain, u32 channel = 0);
+ device_sound_interface &add_route(u32 output, device_sound_interface &target, double gain, u32 channel = 0);
+
+ device_sound_interface &reset_routes();
+
+Routes between devices, e.g. between streams, are set at configuration
+time. The method ``add_route`` must be called on the source device
+and gives the channel on the source device, the target device, the
+gain, and optionally the channel on the target device. The constant
+``ALL_OUTPUTS`` can be used to add a route from every channel of the
+source to a given channel of the destination.
+
+The method ``reset_routes`` is used to remove all the routes setup on
+a given source device.
+
+
+.. code-block:: C++
+
+ u32 get_sound_requested_inputs() const;
+ u32 get_sound_requested_outputs() const;
+ u64 get_sound_requested_inputs_mask() const;
+ u64 get_sound_requested_outputs_mask() const;
+
+Those methods are useful for devices which want to behave differently
+depending on what routes are set up on them. You get either the max
+number of requested channel plus one (which is the number of channels
+when all channels are routed, but is more useful when there are gaps)
+or a mask of use for channels 0-63. Note that ``ALL_OUTPUTS`` does
+not register any specific output or output count.
+
+
+
+3. Streams
+----------
+
+3.1 Generalities
+~~~~~~~~~~~~~~~~
+
+Streams are endpoints associated with devices and, when connected
+together, ensure the transmission of audio data between them. A
+stream has a number of inputs (which can be zero) and outputs (same)
+and one sample rate which is common to all inputs and outputs. The
+connections are set up at the machine configuration level and the sound
+system ensures mixing and resampling is done transparently.
+
+Samples in streams are encoded as sample_t. In the current
+implementation, this is a float. Nominal values are between -1 and 1,
+but clamping at the device level is not recommended (unless that's
+what happens in hardware of course) because the gain values, volume
+and effects can easily avoid saturation.
+
+They are implemented in the class ``sound_stream``.
+
+
+3.2 Characteristics
+~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ device_t &device() const;
+ bool input_adaptive() const;
+ bool output_adaptive() const;
+ bool synchronous() const;
+ u32 input_count() const;
+ u32 output_count() const;
+ u32 sample_rate() const;
+ attotime sample_period() const;
+
+
+3.3 Sample access
+~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ s32 samples() const;
+
+ void put(s32 output, s32 index, sample_t sample);
+ void put_clamp(s32 output, s32 index, sample_t sample, sample_t clamp = 1.0);
+ void put_int(s32 output, s32 index, s32 sample, s32 max);
+ void put_int_clamp(s32 output, s32 index, s32 sample, s32 maxclamp);
+ void add(s32 output, s32 index, sample_t sample);
+ void add_int(s32 output, s32 index, s32 sample, s32 max);
+ void fill(s32 output, sample_t value, s32 start, s32 count);
+ void fill(s32 output, sample_t value, s32 start);
+ void fill(s32 output, sample_t value);
+ void copy(s32 output, s32 input, s32 start, s32 count);
+ void copy(s32 output, s32 input, s32 start);
+ void copy(s32 output, s32 input);
+ sample_t get(s32 input, s32 index) const;
+ sample_t get_output(s32 output, s32 index) const;
+
+Those are the methods used to implement ``sound_stream_update``.
+First ``samples`` tells how many samples to consume and/or generate.
+The to-generate samples, if any, are pre-cleared (e.g. set to zero).
+
+Input samples are retrieved with ``get``, where ``input`` is the
+stream channel number and ``index`` the sample number.
+
+Generated samples are written with the put variants. ``put`` sets a
+sample_t in channel ``output`` at position ``index``. ``put_clamp``
+does the same but first clamps the value to +/-``clamp``. ``put_int``
+does it with an integer ``sample`` but pre-divides it by ``max``.
+``put_int_clamp`` does the same but also pre-clamps within
+-``maxclamp`` and ``maxclamp``-1, which is the normal range for a
+2-complement value.
+
+``add`` and ``add_int`` are similar but add the value of the sample to
+what's there instead of replacing. ``get_output`` gets the currently
+stored output value.
+
+``fill`` sets a range of an output channel to a given ``value``.
+``start`` tells where to start (default index 0), ``count`` how many
+(default up to the end of the buffer).
+
+``copy`` does the same as fill but gets its value from the identical
+position in an input channel.
+
+Note that clamping should not be used unless it actually happens in
+hardware. Between gains and effects there is a fair chance saturation
+can be avoided later in the chain.
+
+
+3.4 Timing
+~~~~~~~~~~
+
+.. code-block:: C++
+
+ u32 sample_rate() const;
+ attotime sample_period() const;
+
+ u64 start_index() const;
+ u64 end_index() const;
+ attotime start_time() const;
+ attotime end_time() const;
+
+ attotime sample_to_time(u64 index) const;
+
+``sample_rate`` gives the current sample rate of the stream and
+``sample_period`` the corresponding duration.
+
+Within a call to the update callback, ``start_index`` gives the number
+(starting at zero at system power on) and ``start_time`` the time of
+the first sample to compute in the update. ``end_index`` and
+``end_time`` correspondingly indicate one past the last sample to
+update, or in other words the first sample of the next update call.
+Outside of an update callback, they all point to the first sample of
+the next update call.
+
+Finally ``sample_to_time`` allows to convert from a sample number to a
+time.
+
+Note that in case of change of sample rate sample numbers are
+recalculated to end up as if the stream had had the new rate from the
+start. And the times will still be such that sample 0 is at time 0.
+
+
+3.5 Gain management
+~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ float user_output_gain() const;
+ void set_user_output_gain(float gain);
+ float user_output_gain(s32 output) const;
+ void set_user_output_gain(s32 output, float gain);
+
+ float input_gain(s32 input) const;
+ void set_input_gain(s32 input, float gain);
+ void apply_input_gain(s32 input, float gain);
+ float output_gain(s32 output) const;
+ void set_output_gain(s32 output, float gain);
+ void apply_output_gain(s32 output, float gain);
+
+
+This is similar to the device gain control, with a twist: apply
+multiplies the current gain by the given value.
+
+
+3.6 Misc. actions
+~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ void set_sample_rate(u32 sample_rate);
+ void update();
+
+The method ``set_sample_rate`` allows to change the sample rate of the
+stream. The method ``update`` triggers a call of
+``sound_stream_update`` on the stream and the ones it depends on to
+reach the current time in terms of samples.
+
+
+4. Devices using device_mixer_interface
+---------------------------------------
+
+The device mixer interface is used for devices that want to relay
+sound in the device tree without acting on it. It's very useful on
+for instance slot devices connectors, where the slot device may have
+an audio connection with the main system. They are routed like every
+other sound device, create the streams automatically and copy input to
+output. Nothing needs to be done in the device.
diff --git a/docs/source/techspecs/floppy.rst b/docs/source/techspecs/floppy.rst
index 39060d4eddf..f910d08fb29 100644
--- a/docs/source/techspecs/floppy.rst
+++ b/docs/source/techspecs/floppy.rst
@@ -66,7 +66,7 @@ The data is structured at two levels: how individual bits (or nibbles, or bytes)
All floppy controllers, even the wonkiest like the Apple II one, start by dividing the track in equally-sized cells. They're angular sections in the middle of which a magnetic orientation inversion may be present. From a hardware point of view the cells are seen as durations, which combined with the floppy rotation give the section. For instance the standard MFM cell size for a 3" double-density floppy is 2us, which combined with the also standard 300 rpm rotational speed gives an angular size of 1/100000th of a turn. Another way of saying it is that there are 100K cells in a 3" DD track.
-In every cell there may or may not be a magnetic orientation transition, e.g. a pulse coming from (reading) or going to (writing) the floppy drive. A cell with a pulse is traditionally noted '1', and one without '0'. Two constraints apply to the cell contents though. First, pulses must not be too close together or they'll blur each-other and/or be filtered out. The limit is slightly better than 1/50000th of a turn for single and double density floppies, half that for HD floppys, and half that again for ED floppies with perpendicular recording. Second, they must not be too away from each other or either the AGC is going to get wonky and introduce phantom pulses or the controller is going to lose sync and get a wrong timing on the cells on reading. Conservative rule of thumb is not to have more than three consecutive '0' cells.
+In every cell there may or may not be a magnetic orientation transition, e.g. a pulse coming from (reading) or going to (writing) the floppy drive. A cell with a pulse is traditionally noted '1', and one without '0'. Two constraints apply to the cell contents though. First, pulses must not be too close together or they'll blur each-other and/or be filtered out. The limit is slightly better than 1/50000th of a turn for single and double density floppies, half that for HD floppies, and half that again for ED floppies with perpendicular recording. Second, they must not be too away from each other or either the AGC is going to get wonky and introduce phantom pulses or the controller is going to lose sync and get a wrong timing on the cells on reading. Conservative rule of thumb is not to have more than three consecutive '0' cells.
Of course protections play with that to make formats not reproducible by the system controller, either breaking the three-zeroes rule or playing with the cells durations/sizes.
@@ -108,7 +108,7 @@ Other encodings exist, like M2FM, but they're very rare and system-specific.
2.3.1.6. Reading back encoded data
``````````````````````````````````
-Writing encoded data is easy: you only need a clock at the appropriate frequency and send or not a pulse on the clock edges. Reading back the data is where the fun is. Cells are a logical construct and not a physical measurable entity. Rotational speeds very around the defined one (±2% is not rare), and local perturbations (air turbulence, surface distance…) make the instantaneous speed very variable in general. So to extract the cell values stream, the controller must dynamically synchronize with the pulse train that the floppy head picks up. The principle is simple: a cell-sized duration window is built within which the presence of at least one pulse indicates the cell is a '1', and the absence of any a '0'. After reaching the end of the window, the starting time is moved appropriately to try to keep the observed pulse at the exact middle of the window. This allows the phase to be corrected on every '1' cell, making the synchronization work if the rotational speed is not too off. Subsequent generations of controllers used Phase-Locked Loops (PLLs) which vary both phase and window duration to adapt better to inaccuarate rotational speeds, usually with a tolerance of ±15%.
+Writing encoded data is easy: you only need a clock at the appropriate frequency and send or not a pulse on the clock edges. Reading back the data is where the fun is. Cells are a logical construct and not a physical measurable entity. Rotational speeds very around the defined one (±2% is not rare), and local perturbations (air turbulence, surface distance…) make the instantaneous speed very variable in general. So to extract the cell values stream, the controller must dynamically synchronize with the pulse train that the floppy head picks up. The principle is simple: a cell-sized duration window is built within which the presence of at least one pulse indicates the cell is a '1', and the absence of any a '0'. After reaching the end of the window, the starting time is moved appropriately to try to keep the observed pulse at the exact middle of the window. This allows the phase to be corrected on every '1' cell, making the synchronization work if the rotational speed is not too off. Subsequent generations of controllers used Phase-Locked Loops (PLLs) which vary both phase and window duration to adapt better to inaccurate rotational speeds, usually with a tolerance of ±15%.
Once the cell data stream is extracted, decoding depends on the encoding. In the FM and MFM case the only question is to recognize data bits from clock bits, while in GCR the start position of the first group should be found. That second level of synchronization is handled at a higher level using patterns not found in a normal stream.
diff --git a/docs/source/techspecs/index.rst b/docs/source/techspecs/index.rst
index 73767b32e59..72c678b4ca6 100644
--- a/docs/source/techspecs/index.rst
+++ b/docs/source/techspecs/index.rst
@@ -15,9 +15,13 @@ MAME’s source or working on scripts that run within the MAME framework.
device_memory_interface
device_rom_interface
device_disasm_interface
+ device_sound_interface
memory
cpu_device
floppy
nscsi
m6502
+ uml_instructions
poly_manager
+ audio_effects
+ osd_audio
diff --git a/docs/source/techspecs/layout_files.rst b/docs/source/techspecs/layout_files.rst
index a014756a32b..60dafcd2f36 100644
--- a/docs/source/techspecs/layout_files.rst
+++ b/docs/source/techspecs/layout_files.rst
@@ -362,10 +362,8 @@ This is an example opening tag for a top-level ``mamelayout`` element:
<mamelayout version="2">
In general, children of the top-level ``mamelayout`` element are processed in
-reading order from top to bottom. The exception is that, for historical
-reasons, views are processed last. This means views see the final values of all
-parameters at the end of the ``mamelayout`` element, and may refer to elements
-and groups that appear after them.
+reading order from top to bottom. Elements and groups must be defined before
+they can be used.
The following elements are allowed inside the top-level ``mamelayout`` element:
@@ -511,12 +509,13 @@ image
layout file. Image file formats are detected by examining the content of
the files, file name extensions are ignored.
text
- Draws text in using the UI font in the specified colour. The text to draw
- must be supplied using a ``string`` attribute. An ``align`` attribute may
- be supplied to set text alignment. If present, the ``align`` attribute must
- be an integer, where 0 (zero) means centred, 1 (one) means left-aligned, and
- 2 (two) means right-aligned. If the ``align`` attribute is absent, the text
- will be centred.
+ Draws text in the specified colour, using the artwork font. The text to
+ draw must be supplied using a ``string`` attribute. An ``align`` attribute
+ may be supplied to set text alignment. If present, the ``align`` attribute
+ must be an integer, where 0 (zero) means centred, 1 (one) means
+ left-aligned, 2 (two) means right-aligned, and 3 (three) means that the text
+ will be stretched horizontally to fill its bounds. If the ``align``
+ attribute is absent, the text will be centred.
led7seg
Draws a standard seven-segment (plus decimal point) digital LED/fluorescent
display in the specified colour. The low eight bits of the element’s state
@@ -557,17 +556,18 @@ led16segsc
additional bits correspond to the decimal point and comma tail. Unlit
segments are drawn at low intensity (0x20/0xff).
simplecounter
- Displays the numeric value of the element’s state using the system font in
- the specified colour. The value is formatted in decimal notation. A
+ Displays the numeric value of the element’s state in the specified colour,
+ using the artwork font. The value is formatted in decimal notation. A
``digits`` attribute may be supplied to specify the minimum number of digits
to display. If present, the ``digits`` attribute must be a positive
integer; if absent, a minimum of two digits will be displayed. A
``maxstate`` attribute may be supplied to specify the maximum state value to
display. If present, the ``maxstate`` attribute must be a non-negative
- number; if absent it defaults to 999. An ``align`` attribute may be supplied
- to set text alignment. If present, the ``align`` attribute must be an
- integer, where 0 (zero) means centred, 1 (one) means left-aligned, and 2
- (two) means right-aligned; if absent, the text will be centred.
+ number; if absent it defaults to 999. An ``align`` attribute may be
+ supplied to set text alignment. If present, the ``align`` attribute must be
+ an integer, where 0 (zero) means centred, 1 (one) means left-aligned, and 3
+ (three) means that the text will be stretched horizontally to fill its
+ bounds. If the ``align`` attribute is absent, the text will be centred.
An example element that draws a static left-aligned text string:
@@ -684,11 +684,7 @@ This is an example of a valid opening tag for a ``view`` element:
<view name="Control panel">
A view creates a nested parameter scope inside the parameter scope of the
-top-level ``mamelayout`` element. For historical reasons, ``view`` elements are
-processed *after* all other child elements of the top-level ``mamelayout``
-element. This means a view can reference elements and groups that appear after
-it in the file, and parameters from the enclosing scope will have their final
-values from the end of the ``mamelayout`` element.
+top-level ``mamelayout`` element.
A ``view`` element may have a ``showpointers`` attribute to set whether mouse
and pen pointers should be shown for the view. If present, the value must be
@@ -1203,7 +1199,7 @@ must be an integer specifying the bits of the I/O port field that the item
should activate. This sample shows instantiation of clickable buttons:
The ``clickthrough`` attribute controls whether clicks can pass through the view
-item to other view items drawn above it. The ``clickthrough`` attribute must be
+item to other view items drawn below it. The ``clickthrough`` attribute must be
``yes`` or ``no`` if present. The default is ``no`` (clicks do not pass
through) for view items with ``inputtag`` and ``inputmask`` attributes, and
``yes`` (clicks pass through) for other view items.
@@ -1395,8 +1391,8 @@ layouts, MAME automatically generates views based on the machine configuration.
The following views will be automatically generated:
* If the system has no screens and no viable views were found in the internal
- and external layouts, MAME will load a view that shows the message “No screens
- attached to the system”.
+ and external layouts, MAME will load a view that shows the message “No visual
+ output.”
* For each emulated screen, MAME will generate a view showing the screen at its
physical aspect ratio with rotation applied.
* For each emulated screen where the configured pixel aspect ratio doesn’t match
@@ -1502,5 +1498,5 @@ internal layouts included in MAME.
Effectively using groups as a procedural programming language to build up an
image of a trainer board.
`beena.lay <https://git.redump.net/mame/tree/src/mame/layout/beena.lay?h=mame0261>`_
- Using event-based scripting to dynamically position elements and draw elemnt
+ Using event-based scripting to dynamically position elements and draw element
content programmatically.
diff --git a/docs/source/techspecs/m6502.rst b/docs/source/techspecs/m6502.rst
index 7d67423abb8..6e2a4523b41 100644
--- a/docs/source/techspecs/m6502.rst
+++ b/docs/source/techspecs/m6502.rst
@@ -92,7 +92,7 @@ At a minimum, the class must include a constructor and an enum picking up the co
If the CPU has its own dispatch table, the class must also include the declaration (but not definition) of **disasm_entries**, **do_exec_full** and **do_exec_partial**, the declaration and definition of **disasm_disassemble** (identical for all classes but refers to the class-specific **disasm_entries** array) and include the .inc file (which provides the missing definitions). Support for the generation must also be added to CPU.mak.
-If the CPU has in addition its own opcodes, their declaration must be done through a macro, see f.i. m65c02. The .inc file will provide the definitions.
+If the CPU has in addition its own opcodes, their declaration must be done through a macro, see e.g. m65c02. The .inc file will provide the definitions.
Dispatch tables
@@ -365,7 +365,7 @@ A negative icount means that the CPU won't be able to do anything for some time
Multi-dispatch variants
-----------------------
-Some variants currently in the process of being supported change instruction set depending on an internal flag, either switching to a 16-bits mode or changing some register accesses to memory accesses. This is handled by having multiple dispatch tables for the CPU, the d<CPU>.lst not being 257 entries anymore but 256*n+1. The variable **inst_state_base** must select which instruction table to use at a given time. It must be a multiple of 256, and is in fact simply OR-ed to the first instruction byte to get the dispatch table index (aka inst_state).
+Some variants currently in the process of being supported change instruction set depending on an internal flag, either switching to a 16-bit mode or changing some register accesses to memory accesses. This is handled by having multiple dispatch tables for the CPU, the d<CPU>.lst not being 257 entries anymore but 256*n+1. The variable **inst_state_base** must select which instruction table to use at a given time. It must be a multiple of 256, and is in fact simply OR-ed to the first instruction byte to get the dispatch table index (aka inst_state).
Current TO-DO:
--------------
@@ -374,6 +374,6 @@ Current TO-DO:
- Integrate the I/O subsystems in the 4510
-- Possibly integrate the sound subsytem in the rp2a03
+- Possibly integrate the sound subsystem in the rp2a03
- Add decent hookups for the Apple 3 madness
diff --git a/docs/source/techspecs/memory.rst b/docs/source/techspecs/memory.rst
index 9f0a31758c7..aa877d0101d 100644
--- a/docs/source/techspecs/memory.rst
+++ b/docs/source/techspecs/memory.rst
@@ -282,7 +282,7 @@ view can be re-enabled at any time.
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Some specific CPUs have been upgraded to be interruptible which allows
-to add bus contention and wait states capabitilites. Being
+to add bus contention and wait states capabilities. Being
interruptible means, in practice, that an instruction can be
interrupted at any time and the execute_run method of the core exited.
Other devices can then run, then eventually controls returns to the
@@ -950,7 +950,7 @@ data passed around. A write tap happens before the access, and can
change the value to be written. A read tap happens after the access,
and can change the value returned.
-Taps must be of the same width and alignement than the bus. Multiple
+Taps must be of the same width and alignment as the bus. Multiple
taps can act over the same addresses.
The ``memory_passthrough_handler`` object collates a number of taps
diff --git a/docs/source/techspecs/nscsi.rst b/docs/source/techspecs/nscsi.rst
index da3773a30ff..022c269fa5c 100644
--- a/docs/source/techspecs/nscsi.rst
+++ b/docs/source/techspecs/nscsi.rst
@@ -128,7 +128,7 @@ In **scsi_command()**, the device can either handle the command or pass it up wi
To handle the command, a number of methods are available:
-- **get_lun(lua-set-in-command)** will give you the LUN to work on (the in-command one can be overriden by a message-level one).
+- **get_lun(lua-set-in-command)** will give you the LUN to work on (the in-command one can be overridden by a message-level one).
- **bad_lun()** replies to the host that the specific LUN is unsupported.
diff --git a/docs/source/techspecs/osd_audio.rst b/docs/source/techspecs/osd_audio.rst
new file mode 100644
index 00000000000..290e992c781
--- /dev/null
+++ b/docs/source/techspecs/osd_audio.rst
@@ -0,0 +1,363 @@
+OSD audio support
+=================
+
+Introduction
+------------
+
+The audio support in Mame tries to allow the user to freely map
+between the emulated system audio outputs (called speakers) and the
+host system audio. A part of it is the OSD support, where a
+host-specific module ensures the interface between Mame and the host.
+This is the documentation for that module.
+
+Note: this is currently output-only, but input should follow.
+
+
+Capabilities
+------------
+
+The OSD interface is designed to allow three levels of support,
+depending on what the API allows and the amount of effort to expend.
+Those are:
+
+* Level 1: One or more audio targets, only one stream allowed per target
+ (aka exclusive mode)
+* Level 2: One or more audio targets, multiple streams per target
+* Level 3: One or more audio targets, multiple streams per target, user-visible
+ per-stream-channel volume control
+
+In any case we support having the user use an external interface to
+change the target of a stream and, in level 3, change the volumes. By
+support we mean storing the information in the per-game configuration
+and keeping the internal UI in sync.
+
+
+Terminology
+-----------
+
+For this module, we use the terms:
+
+* node: some object we can send audio to. Can be physical, like speakers,
+ or virtual, like an effect system. It should have a unique, user-presentable
+ name for the UI.
+* port: a channel of a node, has a name (non-unique, like "front left") and a
+ 3D position
+* stream: a connection to a node with allows to send audio to it
+
+
+Reference documentation
+-----------------------
+
+Adding a module
+~~~~~~~~~~~~~~~
+
+Adding a module is done by adding a cpp file to src/osd/modules/sound
+which follows this structure,
+
+.. code-block:: C++
+
+ // License/copyright
+ #include "sound_module.h"
+ #include "modules/osdmodules.h"
+
+ #ifdef MODULE_SUPPORT_KEY
+
+ #include "modules/lib/osdobj_common.h"
+
+ // [...]
+ namespace osd {
+ namespace {
+
+ class sound_module_class : public osd_module, public sound_module
+ {
+ sound_module_class() : osd_module(OSD_SOUND_PROVIDER, "module_name"),
+ sound_module()
+ // ...
+ };
+
+ }
+ }
+ #else
+ namespace osd { namespace {
+ MODULE_NOT_SUPPORTED(sound_module_class, OSD_SOUND_PROVIDER, "module_name")
+ }}
+ #endif
+
+ MODULE_DEFINITION(SOUND_MODULE_KEY, osd::sound_module_class)
+
+In that code, four names must be chosen:
+
+* MODULE_SUPPORT_KEY some #define coming from the genie scripts to tell that
+ this particular module can be compiled (like NO_USE_PIPEWIRE or SDLMAME_MACOSX)
+* sound_module_class is the name of the class which makes up the module
+ (like sound_coreaudio)
+* module_name is the name to be used in -sound <xxx> to select that particular
+ module (like coreaudio)
+* SOUND_MODULE_KEY is a symbol that represents the module internally (like
+ SOUND_COREAUDIO)
+
+The file path needs to be added to scripts/src/osd/modules.lua in
+osdmodulesbuild() and the module reference to
+src/osd/modules/lib/osdobj_common.cpp in
+osd_common_t::register_options with the line:
+
+.. code-block:: C++
+
+ REGISTER_MODULE(m_mod_man, SOUND_MODULE_KEY);
+
+This should ensure that the module is reachable through -sound <xxx>
+on the appropriate hosts.
+
+
+Interface
+~~~~~~~~~
+
+The full interface is:
+
+.. code-block:: C++
+
+ virtual bool split_streams_per_source() const override;
+ virtual bool external_per_channel_volume() const override;
+
+ virtual int init(osd_interface &osd, osd_options const &options) override;
+ virtual void exit() override;
+
+ virtual uint32_t get_generation() override;
+ virtual osd::audio_info get_information() override;
+ virtual uint32_t stream_sink_open(uint32_t node, std::string name, uint32_t rate) override;
+ virtual uint32_t stream_source_open(uint32_t node, std::string name, uint32_t rate) override;
+ virtual void stream_set_volumes(uint32_t id, const std::vector<float> &db) override;
+ virtual void stream_close(uint32_t id) override;
+ virtual void stream_sink_update(uint32_t id, const int16_t *buffer, int samples_this_frame) override;
+ virtual void stream_source_update(uint32_t id, int16_t *buffer, int samples_this_frame) override;
+
+
+The class sound_module provides defaults for minimum capabilities: one
+stereo target and stream at default sample rate. To support that,
+only *init*, *exit* and *stream_update* need to be implemented.
+*init* is called at startup and *exit* when quitting and can do
+whatever they need to do. *stream_sink_update* will be called on a
+regular basis with a buffer of sample_this_frame * 2 * int16_t with the
+audio to play. From this point in the documentation we'll assume more
+than a single stereo channel is wanted.
+
+
+Capabilities
+~~~~~~~~~~~~
+
+Two methods are used by the module to indicate the level of capability
+of the module:
+
+* split_streams_per_source() should return true when having multiple streams
+ for one target is expected (e.g. Level 2 or 3)
+* external_per_channel_volume() should return true when the streams have
+ per-channel volume control that can be externally controlled (e.g. Level 3)
+
+
+Hardware information and generations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The core runs on the assumption that the host hardware capabilities
+can change at any time (bluetooth devices coming and going, usb
+hot-plugging...) and that the module has some way to keep tabs on what
+is happening, possibly using multi-threading. To keep it
+lightweight-ish, we use the concept of a *generation* which is a
+32-bit number that is incremented by the module every time something
+changes. The core checks the current generation value at least once
+every update (once per frame, usually) and if it changed asks for the
+new state and detects and handles the differences. *generation*
+should be "eventually stable", e.g. it eventually stops changing when
+the user stops changing things all the time. A systematic increment
+every frame would be a bad idea.
+
+.. code-block:: C++
+
+ virtual uint32_t get_generation() override;
+
+That method returns the current generation number. It's called at a
+minimum once per update, which usually means per frame. It should be
+reasonably lightweight when nothing special happens.
+
+.. code-block: C++
+
+ virtual osd::audio_info get_information() override;
+
+ struct audio_rate_range {
+ uint32_t m_default_rate;
+ uint32_t m_min_rate;
+ uint32_t m_max_rate;
+ };
+
+ struct audio_info {
+ struct node_info {
+ std::string m_name;
+ std::string m_display_name;
+ uint32_t m_id;
+ audio_rate_range m_rate;
+ std::vector<std::string> m_port_names;
+ std::vector<std::array<double, 3>> m_port_positions;
+ uint32_t m_sinks;
+ uint32_t m_sources;
+ };
+
+ struct stream_info {
+ uint32_t m_id;
+ uint32_t m_node;
+ std::vector<float> m_volumes;
+ };
+
+ uint32_t m_generation;
+ uint32_t m_default_sink;
+ uint32_t m_default_source;
+ std::vector<node_info> m_nodes;
+ std::vector<stream_info> m_streams;
+ };
+
+This method must provide all the information about the current state
+of the host and the module. This state is:
+
+* m_generation: The current generation number
+* m_nodes: The vector available nodes (*node_info*)
+
+ * m_name: The name of the node to be used in non-user-visible configurations (can be a uuid or equivalent)
+ * m_display_name: The name of the node to be used in the user interfaces (should be readable)
+ * m_id: The numeric ID of the node
+ * m_rate: The minimum, maximum and preferred sample rate for the node
+ * m_port_names: The vector of port names
+ * m_port_positions: The vector of 3D position of the ports. Refer to
+ src/emu/speaker.h for the "standard" positions
+ * m_sinks: Number of sinks (inputs)
+ * m_sources: Number of sources (outputs)
+
+* m_default_sink: ID of the node that is the current "system default" for
+ audio output, 0 if there's no such concept
+* m_default_source: same for audio input (currently unused)
+* m_streams: The vector of active streams (*stream_info*)
+
+ * m_id: The numeric ID of the stream
+ * m_node: The target node of the stream
+ * m_volumes: empty if *external_per_channel_volume* is false, current volume
+ value per-channel otherwise
+
+IDs, for nodes and streams, are (independent) 32-bit unsigned non-zero
+values associated to respectively nodes and streams. IDs should not
+be reused. A node that goes away then comes back should get a new ID.
+A stream closing does not allow reuse of its ID.
+
+If a node has both sources and sinks, the sources are *monitors* of
+the sinks, e.g. they're loopbacks. They should have the same count in
+such a case.
+
+Nodes must be independent. It must be possible to open streams to two
+different nodes at the same time. Be careful of multi-api libraries
+that collide between apis. In addition, with monitoring streams
+(input on an output), it must be possible to open different streams
+for input and output. If it's not the case, do not publish the
+monitoring inputs.
+
+When external control exists, a module should change the value of
+*stream_info::m_node* when the user changes it, and same for
+*stream_info::m_volumes*. Generation number should be incremented
+when this happens, so that the core knows to look for changes.
+
+Volumes are floats in dB, where 0 means 100% and -96 means no sound.
+audio.h provides osd::db_to_linear and osd::linear_to_db if such a
+conversion is needed.
+
+Positions have two special values: unknown() means the position of the
+speaker or microphone is unknown, but it should be used anyway. The
+used position will be centered. map_on_request_only() means the input
+or output should not be used on full mappings but only when explicitly
+requested with a channel mapping.
+
+There is an inherent race condition with this system, because things
+can change at any point after returning for the method. The idea is
+that the information returned must be internally consistent (a stream
+should not point to a node ID that does not exist in the structure,
+same for default sink) and that any external change from that state
+should increment the generation number, but that's it. Through the
+generation system the core will eventually be in sync with reality.
+
+
+Input and output streams
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ virtual uint32_t stream_sink_open(uint32_t node, std::string name, uint32_t rate) override;
+ virtual uint32_t stream_source_open(uint32_t node, std::string name, uint32_t rate) override;
+ virtual void stream_set_volumes(uint32_t id, const std::vector<float> &db) override;
+ virtual void stream_close(uint32_t id) override;
+ virtual void stream_sink_update(uint32_t id, const int16_t *buffer, int samples_this_frame) override;
+ virtual void stream_source_update(uint32_t id, int16_t *buffer, int samples_this_frame) override;
+
+Streams are the concept used to send or receive audio from/to the host
+audio system. A stream is first opened through *stream_sink_open* for
+speakers and *stream_source_open* for microphones and targets a
+specific node at a specific sample rate. It is given a name for use
+by the host sound services for user UI purposes (currently the game
+name if split_streams_per_source is false, the
+speaker_device/microphone_device tag if true). The returned ID must
+be a non-zero, never-used-before for streams value in case of success.
+Failures, like when the node went away between the *get_information*
+call and the open one, should be silent and return zero.
+
+*stream_set_volumes* is used only when *external_per_channel_volume*
+is true and is used by the core to set the per-channel volume. The
+call should just be ignored if the stream ID does not exist (or is
+zero). Do not try to apply volumes in the module if the host API
+doesn't provide for it, let the core handle it.
+
+*stream_close* closes a stream, The call should just be ignored if the
+stream ID does not exist (or is zero).
+
+Opening a stream, closing a stream or changing the volume does not
+need to touch the generation number.
+
+*stream_sink_update* is the method used to send data to the node
+through a given stream. It provides a buffer of *samples_this_frame*
+* *node channel count* channel-interleaved int16_t values. The
+lifetime of the data in the buffer or the buffer pointer itself is
+undefined after return from the method call. The call should just be
+ignored if the stream ID does not exist (or is zero).
+
+*stream_source_update* is the equivalent to retrieve data from a node,
+writing to the buffer instead of reading from it. The constraints are
+identical.
+
+When a stream goes away because the target node is lost it should just
+be removed from the information, and the core will pick up the node
+departure and close the stream.
+
+Given the assumed raceness of the interface, all the methods should be
+tolerant of obsolete or zero IDs being used by the core, and that is
+why ID reuse must be avoided. Also the update methods and the
+open/close/volume ones may be called at the same time in different
+threads.
+
+
+Helper class *abuffer*
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C++
+
+ class abuffer {
+ public:
+ abuffer(uint32_t channels);
+ void get(int16_t *data, uint32_t samples);
+ void push(const int16_t *data, uint32_t samples);
+ uint32_t channels() const;
+ };
+
+The class *abuffer* is a helper provided by *sound_module* to buffer
+audio input or output. It automatically drops data when there is
+an overflow and duplicates the last sample on underflow. It must
+first be initialized with the number of channels, which can be
+retrieved with *channels()* if needed. *push* sends
+*samples* * *channels* 16-bit samples in the buffer. *get* retrieves
+*samples* * *channels* 16-bit samples from the buffer, on a FIFO basis.
+
+It is not protected against multithreading, but uses no class
+variables. So just don't read and write from one specific abuffer
+instance at the same time. The system sound interface mandated
+locking should be enough to ensure that.
diff --git a/docs/source/techspecs/poly_manager.rst b/docs/source/techspecs/poly_manager.rst
index d30a57c39c3..8dd4f7ee0fb 100644
--- a/docs/source/techspecs/poly_manager.rst
+++ b/docs/source/techspecs/poly_manager.rst
@@ -556,7 +556,7 @@ typically have many more object-wide parameters defined here::
bitmap_rgb32 *dest; // pointer to the rendering bitmap
bitmap_ind16 *depth; // pointer to the depth bitmap
rgb_t color; // overall color (for clearing and flat shaded case)
- uint16_t depthval; // fixed depth v alue (for clearing)
+ uint16_t depthval; // fixed depth value (for clearing)
};
Now it’s time to define our renderer class, which we derive from **poly_manager**. As
@@ -1018,7 +1018,7 @@ returned in **chunk**:
* **chunk** is a reference to a variable that will be set to the actual number of
contiguous items available starting at **index**. If **chunk** is less than **count**,
- then the caller should process the **chunk** items returned, then call ``countiguous()``
+ then the caller should process the **chunk** items returned, then call ``contiguous()``
again at (**index** + **chunk**) to access the rest.
**Return value:** a pointer to the first item in the contiguous chunk. No range checking
diff --git a/docs/source/techspecs/uml_instructions.rst b/docs/source/techspecs/uml_instructions.rst
new file mode 100644
index 00000000000..0613f941a76
--- /dev/null
+++ b/docs/source/techspecs/uml_instructions.rst
@@ -0,0 +1,4457 @@
+.. _umlinst:
+
+UML Instruction Reference
+=========================
+
+.. contents::
+ :local:
+ :depth: 2
+
+
+.. _umlinst-intro:
+
+Introduction
+------------
+
+UML is the instruction set used by MAME’s recompiler framework.
+Code running on emulated guest CPUs is translated to UML instructions,
+and back-ends convert the UML instructions to a form that can be
+executed or interpreted on the host system.
+
+Many UML instruction have multiple instruction sizes. Integer
+instructions default to 32-bit size. Adding a ``D`` or ``d`` prefix to
+the mnemonic changes to 64-bit size (double word). Floating point
+instructions use the mnemonic prefix/suffix ``FS`` or ``fs`` for
+IEEE 754 32-bit format (single precision) or or the prefix/suffix ``FD``
+or ``fd`` for IEEE 754 64-bit format (double precision).
+
+
+.. _umlinst-special:
+
+Special value types
+-------------------
+
+.. _umlinst-conditions:
+
+Conditions
+~~~~~~~~~~
+
++-------------+--------------------------------+-------------+--------------------+
+| Disassembly | Mnemonic | Usage | Flags tested |
++=============+================================+=============+====================+
+| ``z`` | zero | ``COND_Z`` | ``Z`` |
+| +--------------------------------+-------------+ |
+| | equal | ``COND_E`` | |
++-------------+--------------------------------+-------------+--------------------+
+| ``nz`` | not zero | ``COND_NZ`` | ``!Z`` |
+| +--------------------------------+-------------+ |
+| | not equal | ``COND_NE`` | |
++-------------+--------------------------------+-------------+--------------------+
+| ``s`` | sign set | ``COND_S`` | ``S`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``ns`` | sign not set | ``COND_NS`` | ``!S`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``c`` | carry | ``COND_C`` | ``C`` |
+| +--------------------------------+-------------+ |
+| | below (unsigned) | ``COND_B`` | |
++-------------+--------------------------------+-------------+--------------------+
+| ``nc`` | no carry | ``COND_NC`` | ``!C`` |
+| +--------------------------------+-------------+ |
+| | above or equal (unsigned) | ``COND_AE`` | |
++-------------+--------------------------------+-------------+--------------------+
+| ``v`` | overflow (signed) | ``COND_V`` | ``V`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``nv`` | no overflow (signed) | ``COND_NV`` | ``!V`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``u`` | unordered | ``COND_U`` | ``U`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``nu`` | not unordered | ``COND_NU`` | ``!U`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``a`` | above (unsigned) | ``COND_A`` | ``!Z && !C`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``be`` | below or equal (unsigned) | ``COND_BE`` | ``Z || C`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``g`` | greater than (signed) | ``COND_G`` | ``!Z && (S == V)`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``le`` | less than or equal (signed) | ``COND_LE`` | ``Z || (S != V)`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``l`` | less than (signed) | ``COND_L`` | ``S != V`` |
++-------------+--------------------------------+-------------+--------------------+
+| ``ge`` | greater than or equal (signed) | ``COND_GE`` | ``S == V`` |
++-------------+--------------------------------+-------------+--------------------+
+
+.. _umlinst-flagmask:
+
+Flag masks
+~~~~~~~~~~
+
++-------+-------------+-----------+----------------+
+| Value | Disassembly | Mnemonic | Usage |
++=======+=============+===========+================+
+| 0x01 | ``C`` | carry | ``FLAG_C`` |
++-------+-------------+-----------+----------------+
+| 0x02 | ``V`` | overflow | ``FLAG_V`` |
++-------+-------------+-----------+----------------+
+| 0x04 | ``Z`` | zero | ``FLAG_Z`` |
++-------+-------------+-----------+----------------+
+| 0x08 | ``S`` | sign | ``FLAG_S`` |
++-------+-------------+-----------+----------------+
+| 0x10 | ``U`` | unordered | ``FLAG_U`` |
++-------+-------------+-----------+----------------+
+| 0x00 | | | ``FLAGS_NONE`` |
++-------+-------------+-----------+----------------+
+| 0x1f | ``USZVC`` | | ``FLAGS_ALL`` |
++-------+-------------+-----------+----------------+
+
+.. _umlinst-roundmode:
+
+Floating point rounding modes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
++-------+-------------+----------+-------------------+---------------------------------------+
+| Value | Disassembly | Mnemonic | Usage | Mode |
++=======+=============+==========+===================+=======================================+
+| 0 | ``trunc`` | truncate | ``ROUND_TRUNC`` | Round toward zero |
++-------+-------------+----------+-------------------+---------------------------------------+
+| 1 | ``round`` | round | ``ROUND_ROUND`` | Round to nearest, round half to even |
++-------+-------------+----------+-------------------+---------------------------------------+
+| 2 | ``ceil`` | ceiling | ``ROUND_CEIL`` | Round toward positive infinity |
++-------+-------------+----------+-------------------+---------------------------------------+
+| 3 | ``floor`` | floor | ``ROUND_FLOOR`` | Round toward negative infinity |
++-------+-------------+----------+-------------------+---------------------------------------+
+| | ``default`` | default | ``ROUND_DEFAULT`` | Use the current default rounding mode |
++-------+-------------+----------+-------------------+---------------------------------------+
+
+
+.. _umlinst-flow:
+
+Flow control
+------------
+
+.. _umlinst-comment:
+
+COMMENT
+~~~~~~~
+
+Insert a comment into logged UML code.
+
++--------------------+---------------------------------+
+| Disassembly | Usage |
++====================+=================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| comment string | UML_COMMENT(block, string); |
++--------------------+---------------------------------+
+
+Operands
+^^^^^^^^
+
+string
+ The comment text as a pointer to a NUL-terminated string. This must
+ remain valid until code is generated for the block.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-nop:
+
+NOP
+~~~
+
+No operation.
+
++-----------------+---------------------+
+| Disassembly | Usage |
++=================+=====================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| nop | UML_NOP(block); |
++-----------------+---------------------+
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-label:
+
+LABEL
+~~~~~
+
+Associate a location with a label number local to the current generated
+code block. Label numbers must not be reused within a generated code
+block. The :ref:`JMP <umlinst-jmp>` instruction may be used to transfer
+control to the location associated with a label number.
+
++-------------------+------------------------------+
+| Disassembly | Usage |
++===================+==============================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| label label | UML_LABEL(block, label); |
++-------------------+------------------------------+
+
+Operands
+^^^^^^^^
+
+label (label number)
+ The label number to associate with the current location. A label
+ number must not be used more than once within a generated code
+ block.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-handle:
+
+HANDLE
+~~~~~~
+
+Mark a location as an entry point of a subroutine. Subroutines may be
+called using the :ref:`CALLH <umlinst-callh>` and :ref:`EXH
+<umlinst-exh>` instructions, and also by the `HASHJMP <umlinst-hashjmp>`
+if no location is associated with the specified mode and emulated
+program counter.
+
++--------------------+--------------------------------+
+| Disassembly | Usage |
++====================+================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| handle handle | UML_HANDLE(block, handle); |
++--------------------+--------------------------------+
+
+Operands
+^^^^^^^^
+
+handle (code handle)
+ The code handle to bind to the current location. The handle must
+ already be allocated, and must not have been bound since the last
+ generated code reset (all handles are implicitly unbound when
+ resetting the generated code cache).
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-hash:
+
+HASH
+~~~~
+
+Associate a location with the specified mode and emulated program
+counter values. The :ref:`HASHJMP <umlinst-hashjmp>` instruction may be
+used to transfer control to the location associated with a mode and
+emulated program counter value. HASH instructions are not permitted in
+invariant code blocks.
+
+This is usually used to mark the location of the generated code for an
+emulated instruction or sequence of instructions.
+
++---------------------+------------------------------+
+| Disassembly | Usage |
++=====================+==============================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| hash mode,pc | UML_HASH(block, mode, pc); |
++---------------------+------------------------------+
+
+Operands
+^^^^^^^^
+
+mode (32-bit – immediate, map variable)
+ The mode to associate with the current location in the generated
+ code. Must be greater than or equal to zero and less than the
+ number of modes specified when creating the recompiler context.
+pc (32-bit – immediate, map variable)
+ The emulated program counter value to associate with the current
+ location in the generated code.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-jmp:
+
+JMP
+~~~
+
+Jump to the location associated with a label number within the current
+block.
+
++------------------------+-----------------------------------+
+| Disassembly | Usage |
++========================+===================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| jmp label | UML_JMP(block, label); |
+| jmp label,cond | UML_JMPc(block, cond, label); |
++------------------------+-----------------------------------+
+
+Operands
+^^^^^^^^
+
+label (label number)
+ The label number associated with the location to jump to in the
+ current generated code block. The label number must be associated
+ with a location in the generated code block before the block is
+ finalised.
+cond (condition)
+ If supplied, a condition that must be met to jump to the specified
+ label. If the condition is not met, execution will continue with
+ the following instruction.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-callh:
+
+CALLH
+~~~~~
+
+Call the subroutine beginning at the specified code handle.
+
++-------------------------+--------------------------------------+
+| Disassembly | Usage |
++=========================+======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| callh handle | UML_CALLH(block, handle); |
+| callh handle,cond | UML_CALLHc(block, cond, handle); |
++-------------------------+--------------------------------------+
+
+Operands
+^^^^^^^^
+
+handle (code handle)
+ Handle located at the entry point of the subroutine to call. The
+ handle must already be allocated but does not need to be bound until
+ the instruction is executed. Calling a handle that was unbound at
+ code generation time may produce less efficient code than calling a
+ handle that was already bound.
+cond (condition)
+ If supplied, a condition that must be met for the subroutine to be
+ called. If the condition is not met, the subroutine will not be
+ called.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-exh:
+
+EXH
+~~~
+
+Set the ``EXP`` register and call the subroutine beginning at the
+specified code handle. The ``EXP`` register is a 32-bit special
+function register that may be retrieved with the :ref:`GETEXP
+<umlinst-getexp>` instruction.
+
++-----------------------------+-----------------------------------------+
+| Disassembly | Usage |
++=============================+=========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| exh handle,arg | UML_EXH(block, handle, arg); |
+| exh handle,arg,cond | UML_EXHc(block, handle, arg, cond); |
++-----------------------------+-----------------------------------------+
+
+Operands
+^^^^^^^^
+
+handle (code handle)
+ Handle located at the entry point of the subroutine to call. The
+ handle must already be allocated but does not need to be bound until
+ the instruction is executed. Calling a handle that was unbound at
+ code generation time may produce less efficient code than calling a
+ handle that was already bound.
+arg (32-bit – memory, integer register, immediate, map variable)
+ Value to store in the ``EXP`` register.
+cond (condition)
+ If supplied, a condition that must be met for the subroutine to be
+ called. If the condition is not met, the subroutine will not be
+ called and the ``EXP`` register will not be modified.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``arg`` operand are truncated to 32 bits.
+
+.. _umlinst-ret:
+
+RET
+~~~
+
+Return from a subroutine, transferring control to the instruction
+following the :ref:`CALLH <umlinst-callh>` or :ref:`EXH <umlinst-exh>`
+instruction used to call the subroutine. This instruction must only be
+used within generated code subroutines. The :ref:`EXIT <umlinst-exit>`
+instruction must be used to exit from the generated code.
+
++------------------+----------------------------+
+| Disassembly | Usage |
++==================+============================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| ret | UML_RET(block); |
+| ret cond | UML_RETc(block, cond); |
++------------------+----------------------------+
+
+Operands
+^^^^^^^^
+
+cond (condition)
+ If supplied, a condition that must be met to return from the
+ subroutine. If the condition is not met, execution will continue
+ with the following instruction.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-hashjmp:
+
+HASHJMP
+~~~~~~~
+
+Unwind all nested generated code subroutine frames and transfer control
+to the location associated with the specified mode and emulated program
+counter values. If no location is associated with the specified mode
+and program counter values, call the subroutine beginning at the
+specified code handle. Note that all nested generated code subroutine
+frames are unwound in either case.
+
+This is usually used to jump to the generated code corresponding to the
+emulated code at a particular address when it is not known to be in the
+current generated code block or when the mode changes.
+
++----------------------------+-----------------------------------------+
+| Disassembly | Usage |
++============================+=========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| hashjmp mode,pc,handle | UML_HASHJMP(block, mode, pc, handle); |
++----------------------------+-----------------------------------------+
+
+Operands
+^^^^^^^^
+
+mode (32-bit – memory, integer register, immediate, map variable)
+ The mode associated with the location in the generated code to
+ transfer control to. Must be greater than or equal to zero and less
+ than the number of modes specified when creating the recompiler
+ context.
+pc (32-bit – memory, integer register, immediate, map variable)
+ The emulated program counter value associated with the location in
+ the generated code to transfer control to.
+handle (code handle)
+ Handle located at the entry point of the subroutine to call if no
+ location in the generated code is associated with the specified mode
+ and emulated program counter values. The handle must already be
+ allocated but does not need to be bound until the instruction is
+ executed. Calling a handle that was unbound at code generation time
+ may produce less efficient code than calling a handle that was
+ already bound.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-exit:
+
+EXIT
+~~~~
+
+Exit from the generated code, returning control to the caller. May be
+used from within any level of nested subroutine calls in the generated
+code.
+
++-----------------------+----------------------------------+
+| Disassembly | Usage |
++=======================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| exit arg, | UML_EXIT(block, arg); |
+| exit arg,,cond | UML_EXITc(block, arg, cond); |
++-----------------------+----------------------------------+
+
+Operands
+^^^^^^^^
+
+arg (32-bit – memory, integer register, immediate, map variable)
+ The value to return to the caller.
+cond (condition)
+ If supplied, a condition that must be met to exit from the generated
+ code. If the condition is not met, execution will continue with the
+ following instruction.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``arg`` operand are truncated to 32 bits.
+
+.. _umlinst-callc:
+
+CALLC
+~~~~~
+
+Call a C function with the signature ``void (*)(T *)`` or
+``void (*)(T &)`` (i.e. a function with a single pointer or reference
+parameter that does not return a value).
+
++---------------------------+-----------------------------------------+
+| Disassembly | Usage |
++===========================+=========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| callc func,arg | UML_CALLC(block, func, arg); |
+| callc func,arg,cond | UML_CALLCc(block, func, arg, cond); |
++---------------------------+-----------------------------------------+
+
+Operands
+^^^^^^^^
+
+func (C function)
+ Function pointer to the function to call.
+arg (memory)
+ Argument to pass to the function.
+cond (condition)
+ If supplied, a condition that must be met for the function to be
+ called. If the condition is not met, the function will not be
+ called.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+.. _umlinst-debug:
+
+DEBUG
+~~~~~
+
+Call the debugger instruction hook function if appropriate.
+
+If the debugger is active, this should be executed before each emulated
+instruction. Any emulated CPU state kept in UML registers should be
+flushed to memory before executing this instruction and reloaded
+afterwards to ensure the debugger can display and modify values
+correctly.
+
++-----------------+---------------------------+
+| Disassembly | Usage |
++=================+===========================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| debug pc | UML_DEBUG(block, pc); |
++-----------------+---------------------------+
+
+Operands
+^^^^^^^^
+
+pc (32-bit – memory, integer register, immediate, map variable)
+ The emulated program counter value to supply to the debugger
+ instruction hook function.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``pc`` operand are truncated to 32 bits.
+
+.. _umlinst-break:
+
+BREAK
+~~~~~
+
+Break into the host debugger if attached. Has no effect or crashes if
+no host debugger is attached depending on the host system and
+configuration. This is intended as a developer aid and should not be
+left in final code.
+
++-----------------+-----------------------+
+| Disassembly | Usage |
++=================+=======================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| break | UML_BREAK(block); |
++-----------------+-----------------------+
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+
+.. _umlinst-control:
+
+Status and control
+------------------
+
+.. _umlinst-set:
+
+SET
+~~~
+
+Conditionally set integer to zero or one depending on flags.
+
++----------------------+----------------------------------+
+| Disassembly | Usage |
++======================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| set dst,cond | UML_SETc(block, dst); |
+| dset dst,cond | UML_DSETc(block, cond, dst); |
++----------------------+----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination that will be set to zero (0) if the condition is not
+ met or one (1) if the condition is met.
+cond (condition)
+ A condition to test. The destination will be set to zero (0) if the
+ condition is not met or one (1) if the condition is met.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-carry:
+
+CARRY
+~~~~~
+
+Set the carry flag.
+
++---------------------+----------------------------------+
+| Disassembly | Usage |
++=====================+==================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| carry src,bit | UML_CARRY(block, src, bit); |
+| dcarry src,bit | UML_DCARRY(block, src, bit); |
++---------------------+----------------------------------+
+
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ An integer value containing a bit to be copied to the carry flag.
+bit (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The index of the bit to copy to the carry flag. Bits are numbered
+ starting at zero for the least significant bit position, ascending
+ toward the most significant bit position. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the selected bit of the ``src`` operand.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``bit`` operand are truncated to five or six
+ bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-setflgs:
+
+SETFLGS
+~~~~~~~
+
+Set the flags arbitrarily.
+
++-----------------+-------------------------------+
+| Disassembly | Usage |
++=================+===============================+
+| .. code-block:: | .. code-block:: |
+| | |
+| setflgs src | UML_SETFLGS(block, src); |
++-----------------+-------------------------------+
+
+The five least significant bits of the value of ``src`` are copied to
+the flags. Bits are copied to the **carry (C)**, **overflow (V)**,
+**zero (Z)**, **sign (S)** and **unordered (U)** flags, starting from
+the least significant bit position.
+
+Operands
+^^^^^^^^
+
+src (32-bit – memory, integer register, immediate, map variable)
+ The value to copy to the flags. Only the least significant five
+ bits of this operand are used.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of bit 0 of the ``src`` operand, counting from the
+ least significant bit starting from zero.
+overflow (V)
+ Set to the value of bit 1 of the ``src`` operand, counting from the
+ least significant bit starting from zero.
+zero (Z)
+ Set to the value of bit 2 of the ``src`` operand, counting from the
+ least significant bit starting from zero.
+sign (S)
+ Set to the value of bit 3 of the ``src`` operand, counting from the
+ least significant bit starting from zero.
+unordered (U)
+ Set to the value of bit 4 of the ``src`` operand, counting from the
+ least significant bit starting from zero.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-getflgs:
+
+GETFLGS
+~~~~~~~
+
+Copy flags.
+
++----------------------+------------------------------------+
+| Disassembly | Usage |
++======================+====================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| getflgs dst,mask | UML_GETFLGS(block, dst, mask); |
++----------------------+------------------------------------+
+
+The flags corresponding to bit positions that are set in ``mask`` are
+copied to the corresponding bit positions in ``dst``. Bit positions
+corresponding in ``dst`` that do not correspond to flags or that
+correspond to bit positions that are clear in ``mask`` are cleared.
+
+Back-ends may be able to generate more efficient code if fewer bit
+positions are set in ``mask``.
+
+Operands
+^^^^^^^^
+
+src (32-bit – memory, integer register)
+ The destination where the flags corresponding to bit positions that
+ are set in the ``mask`` operand will be copied.
+mask (flag mask – immediate, map variable)
+ The mask to specify which flags to copy. Only the least significant
+ five bits of this operand are used.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-setfmod:
+
+SETFMOD
+~~~~~~~
+
+Set the default floating point rounding mode. The default rounding mode
+is used for floating point arithmetic and for floating point to integer
+conversion when ``ROUND_DEFAULT`` is specified.
+
++-------------------+--------------------------------+
+| Disassembly | Usage |
++===================+================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| setfmod round | UML_SETFMOD(block, round); |
++-------------------+--------------------------------+
+
+Operands
+^^^^^^^^
+
+round (32-bit – memory, integer register, immediate, map variable)
+ The rounding mode to set as the default. Only the two least
+ significant bits of the value are used. Must be 0 (``ROUND_TRUNC``)
+ to round toward zero, 1 (``ROUND_ROUND``) to round to nearest, 2
+ (``ROUND_CEIL``) to round toward positive infinity, or 3
+ (``ROUND_FLOOR``) to round toward negative infinity.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-getfmod:
+
+GETFMOD
+~~~~~~~
+
+Get the current default floating point rounding mode set by the most
+recent :ref:`SETFMOD <umlinst-setfmod>` or :ref:`RESTORE
+<umlinst-restore>` instruction.
+
++-----------------+------------------------------+
+| Disassembly | Usage |
++=================+==============================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| getfmod dst | UML_GETFMOD(block, dst); |
++-----------------+------------------------------+
+
+Note that the result of this instruction may not correspond to the
+actual effective default rounding mode between entering the generated
+code and executing the first :ref:`SETFMOD <umlinst-setfmod>` or
+:ref:`RESTORE <umlinst-restore>` instruction.
+
+Operands
+^^^^^^^^
+
+dst (32-bit – memory, integer register)
+ The destination where the current default rounding mode will be
+ stored. Will be set to 0 (``ROUND_TRUNC``) for round toward zero, 1
+ (``ROUND_ROUND``) for round to nearest, 2 (``ROUND_CEIL``) for round
+ toward positive infinity, or 3 (``ROUND_FLOOR``) for round toward
+ negative infinity.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-restore:
+
+RESTORE
+~~~~~~~
+
+Set the contents of the UML integer and floating point registers, the
+contents of the ``EXP`` register, the flags and the default floating
+point rounding mode from a ``drcuml_machine_state`` structure.
+
++-----------------+------------------------------+
+| Disassembly | Usage |
++=================+==============================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| restore src | UML_RESTORE(block, src); |
++-----------------+------------------------------+
+
+Restores program-visible UML state from a structure in memory. The
+subroutine call stack and current instruction pointer are not changed.
+Execution continues with the following UML instruction.
+
+src (``drcuml_machine_state`` structure – memory)
+ The source that will be used to set program-visible UML machine
+ state. This may be any host memory location accessible by the
+ application. It is not restricted to the recompiler cache.
+
+Flags
+^^^^^
+
+carry (C)
+ Set from the ``src`` operand.
+overflow (V)
+ Set from the ``src`` operand.
+zero (Z)
+ Set from the ``src`` operand.
+sign (S)
+ Set from the ``src`` operand.
+unordered (U)
+ Set from the ``src`` operand.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-save:
+
+SAVE
+~~~~
+
+Copy the contents of the UML integer and floating point registers, the
+contents of the ``EXP`` register, the flags and the default floating
+point rounding mode to a ``drcuml_machine_state`` structure.
+
++-----------------+---------------------------+
+| Disassembly | Usage |
++=================+===========================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| save dst | UML_SAVE(block, dst); |
++-----------------+---------------------------+
+
+Saves program-visible UML state to a structure in memory that can
+subsequently be restored using the :ref:`RESTORE <umlinst-restore>`
+instruction. The subroutine call stack and current instruction pointer
+are not saved.
+
+Note that the saved floating point rounding mode may not correspond to
+the actual effective default rounding mode between entering the
+generated code and executing the first :ref:`SETFMOD <umlinst-setfmod>`
+or :ref:`RESTORE <umlinst-restore>` instruction.
+
+Operands
+^^^^^^^^
+
+dst (``drcuml_machine_state`` structure – memory)
+ The destination where program-visible UML machine state will be
+ saved. This may be any host memory location accessible by the
+ application. It is not restricted to the recompiler cache.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+
+.. _umlinst-datamove:
+
+Data movement
+-------------
+
+.. _umlinst-mov:
+
+MOV
+~~~
+
+Copy an integer value.
+
++--------------------------+---------------------------------------+
+| Disassembly | Usage |
++==========================+=======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| mov dst,src | UML_MOV(block, dst, src); |
+| mov dst,src,cond | UML_MOVc(block, cond, dst, src); |
+| dmov dst,src | UML_DMOV(block, dst, src); |
+| dmov dst,src,cond | UML_DMOVc(block, cond, dst, src); |
++--------------------------+---------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the value will be copied to.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The source value to copy.
+cond (condition)
+ If supplied, a condition that must be met to copy the value. If the
+ condition is not met, the instruction will have no effect.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Converted to :ref:`NOP <umlinst-nop>` if the ``src`` and ``dst``
+ operands refer to the same memory location or register and the
+ instruction size is no larger than the destination size.
+
+.. _umlinst-fmov:
+
+FMOV
+~~~~
+
+Copy a floating point value. The binary value will be preserved even if
+it is not a valid representation of a floating point number.
+
++--------------------------+----------------------------------------+
+| Disassembly | Usage |
++==========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsmov dst,src | UML_FSMOV(block, dst, src); |
+| fsmov dst,src,cond | UML_FSMOVc(block, cond, dst, src); |
+| fdmov dst,src | UML_FDMOV(block, dst, src); |
+| fdmov dst,src,cond | UML_FDMOVc(block, cond, dst, src); |
++--------------------------+----------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the value will be copied to.
+src (32-bit or 64-bit – memory, floating point register)
+ The source value to copy.
+cond (condition)
+ If supplied, a condition that must be met to copy the value. If the
+ condition is not met, the instruction will have no effect.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`NOP <umlinst-nop>` if the ``src`` and ``dst``
+ operands refer to the same memory location or register.
+
+.. _umlinst-fcopyi:
+
+FCOPYI
+~~~~~~
+
+Reinterpret an integer value as a floating point value. The binary
+value will be preserved even if it is not a valid representation of a
+floating point number.
+
++---------------------+-----------------------------------+
+| Disassembly | Usage |
++=====================+===================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fscopyi dst,src | UML_FSCOPYI(block, dst, src); |
+| fdcopyi dst,src | UML_FDCOPYI(block, dst, src); |
++---------------------+-----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the value will be copied to.
+src (32-bit or 64-bit – memory, integer register)
+ The source value to copy.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-icopyf:
+
+ICOPYF
+~~~~~~
+
+Reinterpret a floating point value as an integer value. The binary
+value will be preserved even if it is not a valid representation of a
+floating point number.
+
++---------------------+-----------------------------------+
+| Disassembly | Usage |
++=====================+===================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| icopyfs dst,src | UML_ICOPYFS(block, dst, src); |
+| icopyfd dst,src | UML_ICOPYFD(block, dst, src); |
++---------------------+-----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the value will be copied to.
+src (32-bit or 64-bit – memory, floating point register)
+ The source value to copy.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-load:
+
+LOAD
+~~~~
+
+Load an unsigned integer value from a memory location with variable
+displacement. The value is zero-extended to the size of the
+destination. Host system rules for integer alignment must be followed.
+
++---------------------------------------+------------------------------------------------------+
+| Disassembly | Usage |
++=======================================+======================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| load dst,base,index,size_scale | UML_LOAD(block, dst, base, index, size, scale); |
+| dload dst,base,index,size_scale | UML_DLOAD(block, dst, base, index, size, scale); |
++---------------------------------------+------------------------------------------------------+
+
+This instruction can be used to read a value from any host memory
+location accessible by the application. It is not restricted to the
+recompiler cache.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the value read from memory will be stored.
+base (memory)
+ The base address of the area of memory to read from.
+index (32-bit – memory, integer register, immediate, map variable)
+ The displacement value added to the base address to calculate the
+ address to read from. This value may be scaled by a factor of 1, 2,
+ 4 or 8 depending on the ``scale`` operand. Note that this is always
+ a 32-bit operand interpreted as a signed integer, irrespective of
+ the instruction size.
+size (access size)
+ The size of the value to read. Must be ``SIZE_BYTE`` (8-bit),
+ ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or ``SIZE_QWORD``
+ (64-bit). Note that this operand controls the size of the value
+ read from memory while the instruction size sets the size of the
+ ``dst`` operand.
+scale (index scale)
+ The scale factor to apply to the ``index`` operand. Must be
+ ``SCALE_x1``, ``SCALE_x2``, ``SCALE_x4`` or ``SCALE_x8`` to multiply
+ by 1, 2, 4 or 8, respectively (shift left by 0, 1, 2 or 3 bits).
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-loads:
+
+LOADS
+~~~~~
+
+Load a signed integer value from a memory location with variable
+displacement. The value is sign-extended to the size of the
+destination. Host system rules for integer alignment must be followed.
+
++---------------------------------------+-------------------------------------------------------+
+| Disassembly | Usage |
++=======================================+=======================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| loads dst,base,index,size_scale | UML_LOADS(block, dst, base, index, size, scale); |
+| dloads dst,base,index,size_scale | UML_DLOADS(block, dst, base, index, size, scale); |
++---------------------------------------+-------------------------------------------------------+
+
+This instruction can be used to read a value from any host memory
+location accessible by the application. It is not restricted to the
+recompiler cache.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the value read from memory will be stored.
+base (memory)
+ The base address of the area of memory to read from.
+index (32-bit – memory, integer register, immediate, map variable)
+ The displacement value added to the base address to calculate the
+ address to read from. This value may be scaled by a factor of 1, 2,
+ 4 or 8 depending on the ``scale`` operand. Note that this is always
+ a 32-bit operand interpreted as a signed integer, irrespective of
+ the instruction size.
+size (access size)
+ The size of the value to read. Must be ``SIZE_BYTE`` (8-bit),
+ ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or ``SIZE_QWORD``
+ (64-bit). Note that this operand controls the size of the value
+ read from memory while the instruction size sets the size of the
+ ``dst`` operand.
+scale (index scale)
+ The scale factor to apply to the ``index`` operand. Must be
+ ``SCALE_x1``, ``SCALE_x2``, ``SCALE_x4`` or ``SCALE_x8`` to multiply
+ by 1, 2, 4 or 8, respectively (shift left by 0, 1, 2 or 3 bits).
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-store:
+
+STORE
+~~~~~
+
+Store an integer value to a location in memory with variable
+displacement. Host system rules for integer alignment must be followed.
+
++---------------------------------------+-------------------------------------------------------+
+| Disassembly | Usage |
++=======================================+=======================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| store base,index,src,size_scale | UML_STORE(block, base, index, src, size, scale); |
+| dstore base,index,src,size_scale | UML_DSTORE(block, base, index, src, size, scale); |
++---------------------------------------+-------------------------------------------------------+
+
+This instruction can be used to write a value to any host memory
+location accessible by the application. It is not restricted to the
+recompiler cache.
+
+Operands
+^^^^^^^^
+
+base (memory)
+ The base address of the area of memory to write to.
+index (32-bit – memory, integer register, immediate, map variable)
+ The displacement value added to the base address to calculate the
+ address to write to. This value may be scaled by a factor of 1, 2,
+ 4 or 8 depending on the ``scale`` operand. Note that this is always
+ a 32-bit operand interpreted as a signed integer, irrespective of
+ the instruction size.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to write to memory.
+size (access size)
+ The size of the value to write. Must be ``SIZE_BYTE`` (8-bit),
+ ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or ``SIZE_QWORD``
+ (64-bit). Note that this operand controls the size of the value
+ written to memory while the instruction size sets the size of the
+ ``src`` operand.
+scale (index scale)
+ The scale factor to apply to the ``index`` operand. Must be
+ ``SCALE_x1``, ``SCALE_x2``, ``SCALE_x4`` or ``SCALE_x8`` to multiply
+ by 1, 2, 4 or 8, respectively (shift left by 0, 1, 2 or 3 bits).
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-fload:
+
+FLOAD
+~~~~~
+
+Load a floating point value from a memory location with variable
+displacement. The binary value will be preserved even if it is not a
+valid representation of a floating point number. Host system rules for
+memory access alignment must be followed.
+
++----------------------------+------------------------------------------+
+| Disassembly | Usage |
++============================+==========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsload dst,base,index | UML_FSLOAD(block, dst, base, index); |
+| fdload dst,base,index | UML_FDLOAD(block, dst, base, index); |
++----------------------------+------------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the value read from memory will be stored.
+base (memory)
+ The base address of the area of memory to read from.
+index (32-bit – memory, integer register, immediate, map variable)
+ The displacement value added to the base address to calculate the
+ address to read from. This value will be scaled by the instruction
+ size (multiplied by 4 or 8). Note that this is always a 32-bit
+ operand interpreted as a signed integer, irrespective of the
+ instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-fstore:
+
+FSTORE
+~~~~~~
+
+Store a floating point value to a memory location with variable
+displacement. The binary value will be preserved even if it is not a
+valid representation of a floating point number. Host system rules for
+memory access alignment must be followed.
+
++----------------------------+-------------------------------------------+
+| Disassembly | Usage |
++============================+===========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsstore base,index,src | UML_FSSTORE(block, base, index, src); |
+| fdstore base,index,src | UML_FDSTORE(block, base, index, src); |
++----------------------------+-------------------------------------------+
+
+Operands
+^^^^^^^^
+
+base (memory)
+ The base address of the area of memory to write to.
+index (32-bit – memory, integer register, immediate, map variable)
+ The displacement value added to the base address to calculate the
+ address to write to. This value will be scaled by the instruction
+ size (multiplied by 4 or 8). Note that this is always a 32-bit
+ operand interpreted as a signed integer, irrespective of the
+ instruction size.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to write to memory.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-getexp:
+
+GETEXP
+~~~~~~
+
+Copy the value of the ``EXP`` register. The ``EXP`` register can be set
+using the :ref:`EXH <umlinst-exh>` instruction.
+
++-----------------+-----------------------------+
+| Disassembly | Usage |
++=================+=============================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| getexp dst | UML_GETEXP(block, dst); |
++-----------------+-----------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit – memory, integer register)
+ The destination to copy the value of the ``EXP`` register to. Note
+ that the ``EXP`` register can only hold a 32-bit value.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-mapvar:
+
+MAPVAR
+~~~~~~
+
+Set the value of a map variable starting at the current location in the
+current generated code block.
+
++--------------------------+---------------------------------------+
+| Disassembly | Usage |
++==========================+=======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| mapvar mapvar,value | UML_MAPVAR(block, mapvar, value); |
++--------------------------+---------------------------------------+
+
+Operands
+^^^^^^^^
+
+mapvar (map variable)
+ The map variable to set the value of.
+value (32-bit – immediate, map variable)
+ The value to set the map variable to. Note that map variables can
+ only hold 32-bit values.
+
+Flags
+^^^^^
+
+carry (C)
+ Unchanged.
+overflow (V)
+ Unchanged.
+zero (Z)
+ Unchanged.
+sign (S)
+ Unchanged.
+unordered (U)
+ Unchanged.
+
+.. _umlinst-recover:
+
+RECOVER
+~~~~~~~
+
+Retrieve the value of a map variable at the location of the call
+instruction in the outermost generated code frame. This instruction
+should only be used from within a generated code subroutine. Results
+are undefined if this instruction is executed from outside any
+generated code subroutines.
+
++------------------------+--------------------------------------+
+| Disassembly | Usage |
++========================+======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| recover dst,mapvar | UML_RECOVER(block, dst, mapvar); |
++------------------------+--------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit – memory, integer register)
+ The destination to copy the value of the map variable to. Note that
+ map variables can only hold 32-bit values.
+mapvar (map variable)
+ The map variable to retrieve the value of from the outermost
+ generated code frame.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+
+.. _umlinst-memaccess:
+
+Emulated memory access
+----------------------
+
+.. _umlinst-read:
+
+READ
+~~~~
+
+Read from an emulated address space. The access mask is implied to have
+all bits set.
+
++---------------------------------+-----------------------------------------------+
+| Disassembly | Usage |
++=================================+===============================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| read dst,addr,space_size | UML_READ(block, dst, addr, size, space); |
+| dread dst,addr,space_size | UML_DREAD(block, dst, addr, size, space); |
++---------------------------------+-----------------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the value read from the emulated address space
+ will be stored.
+addr (32-bit – memory, integer register, immediate, map variable)
+ The address to read from in the emulated address space. Note that
+ this is always a 32-bit operand, irrespective of the instruction
+ size.
+size (access size)
+ The size of the emulated memory access. Must be ``SIZE_BYTE``
+ (8-bit), ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or
+ ``SIZE_QWORD`` (64-bit). Note that this operand controls the size
+ of the emulated memory access while the instruction size sets the
+ size of the ``dst`` operand.
+space (address space number)
+ An integer identifying the address space to read from. May be
+ ``SPACE_PROGRAM``, ``SPACE_DATA``, ``SPACE_IO`` or ``SPACE_OPCODES``
+ for one of the common CPU address spaces, or a non-negative integer
+ cast to ``memory_space``.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``addr`` operand are truncated to 32 bits.
+
+.. _umlinst-readm:
+
+READM
+~~~~~
+
+Read from an emulated address space with access mask specified.
+
++--------------------------------------+------------------------------------------------------+
+| Disassembly | Usage |
++======================================+======================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| readm dst,addr,mask,space_size | UML_READM(block, dst, addr, mask, size, space); |
+| dreadm dst,addr,mask,space_size | UML_DREADM(block, dst, addr, mask, size, space); |
++--------------------------------------+------------------------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the value read from the emulated address space
+ will be stored.
+addr (32-bit – memory, integer register, immediate, map variable)
+ The address to read from in the emulated address space. Note that
+ this is always a 32-bit operand, irrespective of the instruction
+ size.
+mask (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The access mask for the emulated memory access.
+size (access size)
+ The size of the emulated memory access. Must be ``SIZE_BYTE``
+ (8-bit), ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or
+ ``SIZE_QWORD`` (64-bit). Note that this operand controls the size
+ of the emulated memory access while the instruction size sets the
+ size of the ``dst`` and ``mask`` operands.
+space (address space number)
+ An integer identifying the address space to read from. May be
+ ``SPACE_PROGRAM``, ``SPACE_DATA``, ``SPACE_IO`` or ``SPACE_OPCODES``
+ for one of the common CPU address spaces, or a non-negative integer
+ cast to ``memory_space``.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``addr`` operand are truncated to 32 bits.
+* Immediate values for the ``mask`` operand are truncated to the access
+ size.
+* Converted to :ref:`READ <umlinst-read>` if the ``mask`` operand is an
+ immediate value with all bits set.
+
+.. _umlinst-write:
+
+WRITE
+~~~~~
+
+Write to an emulated address space. The access mask is implied to have
+all bits set.
+
++---------------------------------+------------------------------------------------+
+| Disassembly | Usage |
++=================================+================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| write addr,src,space_size | UML_WRITE(block, addr, src, size, space); |
+| dwrite addr,src,space_size | UML_DWRITE(block, addr, src, size, space); |
++---------------------------------+------------------------------------------------+
+
+Operands
+^^^^^^^^
+
+addr (32-bit – memory, integer register, immediate, map variable)
+ The address to write to in the emulated address space. Note that
+ this is always a 32-bit operand, irrespective of the instruction
+ size.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to write to the emulated address space.
+size (access size)
+ The size of the emulated memory access. Must be ``SIZE_BYTE``
+ (8-bit), ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or
+ ``SIZE_QWORD`` (64-bit). Note that this operand controls the size
+ of the emulated memory access while the instruction size sets the
+ size of the ``src`` operand.
+space (address space number)
+ An integer identifying the address space to read from. May be
+ ``SPACE_PROGRAM``, ``SPACE_DATA``, ``SPACE_IO`` or ``SPACE_OPCODES``
+ for one of the common CPU address spaces, or a non-negative integer
+ cast to ``memory_space``.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``addr`` operand are truncated to 32 bits.
+* Immediate values for the ``src`` operand are truncated to the access
+ size.
+
+.. _umlinst-writem:
+
+WRITEM
+~~~~~~
+
+Write to an emulated address space with access mask specified.
+
++--------------------------------------+-------------------------------------------------------+
+| Disassembly | Usage |
++======================================+=======================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| writem addr,src,mask,space_size | UML_WRITEM(block, addr, src, mask, size, space); |
+| dwritem addr,src,mask,space_size | UML_DWRITEM(block, addr, src, mask, size, space); |
++--------------------------------------+-------------------------------------------------------+
+
+Operands
+^^^^^^^^
+
+addr (32-bit – memory, integer register, immediate, map variable)
+ The address to write to in the emulated address space. Note that
+ this is always a 32-bit operand, irrespective of the instruction
+ size.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to write to the emulated address space.
+mask (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The access mask for the emulated memory access.
+size (access size)
+ The size of the emulated memory access. Must be ``SIZE_BYTE``
+ (8-bit), ``SIZE_WORD`` (16-bit), ``SIZE_DWORD`` (32-bit) or
+ ``SIZE_QWORD`` (64-bit). Note that this operand controls the size
+ of the emulated memory access while the instruction size sets the
+ size of the ``src`` and ``mask`` operands.
+space (address space number)
+ An integer identifying the address space to read from. May be
+ ``SPACE_PROGRAM``, ``SPACE_DATA``, ``SPACE_IO`` or ``SPACE_OPCODES``
+ for one of the common CPU address spaces, or a non-negative integer
+ cast to ``memory_space``.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``addr`` operand are truncated to 32 bits.
+* Immediate values for the ``src`` and ``mask`` operands are truncated
+ to the access size.
+* Converted to :ref:`WRITE <umlinst-read>` if the ``mask`` operand is an
+ immediate value with all bits set.
+
+.. _umlinst-fread:
+
+FREAD
+~~~~~
+
+Read a floating point value from an emulated address space. The binary
+value will be preserved even if it is not a valid representation of a
+floating point number. The access mask is implied to have all bits set.
+
++---------------------------------+------------------------------------------+
+| Disassembly | Usage |
++=================================+==========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsread dst,addr,space_size | UML_FSREAD(block, dst, addr, space); |
+| fdread dst,addr,space_size | UML_FDREAD(block, dst, addr, space); |
++---------------------------------+------------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the value read from the emulated address space
+ will be stored.
+addr (32-bit – memory, integer register, immediate, map variable)
+ The address to read from in the emulated address space. Note that
+ this is always a 32-bit operand, irrespective of the instruction
+ size.
+space (address space number)
+ An integer identifying the address space to read from. May be
+ ``SPACE_PROGRAM``, ``SPACE_DATA``, ``SPACE_IO`` or ``SPACE_OPCODES``
+ for one of the common CPU address spaces, or a non-negative integer
+ cast to ``memory_space``.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``addr`` operand are truncated to 32 bits.
+
+.. _umlinst-fwrite:
+
+FWRITE
+~~~~~~
+
+Write a floating point value to an emulated address space. The binary
+value will be preserved even if it is not a valid representation of a
+floating point number. The access mask is implied to have all bits set.
+
++---------------------------------+-------------------------------------------+
+| Disassembly | Usage |
++=================================+===========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fswrite addr,src,space_size | UML_FSWRITE(block, addr, src, space); |
+| fdwrite addr,src,space_size | UML_FDWRITE(block, addr, src, space); |
++---------------------------------+-------------------------------------------+
+
+Operands
+^^^^^^^^
+
+addr (32-bit – memory, integer register, immediate, map variable)
+ The address to write to in the emulated address space. Note that
+ this is always a 32-bit operand, irrespective of the instruction
+ size.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to write to the emulated address space.
+ will be stored.
+space (address space number)
+ An integer identifying the address space to read from. May be
+ ``SPACE_PROGRAM``, ``SPACE_DATA``, ``SPACE_IO`` or ``SPACE_OPCODES``
+ for one of the common CPU address spaces, or a non-negative integer
+ cast to ``memory_space``.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``addr`` operand are truncated to 32 bits.
+
+
+.. _umlinst-intarith:
+
+Integer arithmetic and logic
+----------------------------
+
+.. _umlinst-add:
+
+ADD
+~~~
+
+Add two integers.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| add dst,src1,src2 | UML_ADD(block, dst, src1, src2); |
+| dadd dst,src1,src2 | UML_DADD(block, dst, src1, src2); |
++---------------------------+---------------------------------------+
+
+Calculates ``dst = src1 + src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the sum will be stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The first addend.
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The second addend.
+
+Flags
+^^^^^
+
+carry (C)
+ Set in the case of arithmetic carry out of the most significant bit,
+ or cleared otherwise (unsigned overflow).
+overflow (V)
+ Set in the case of signed two’s complement overflow, or cleared
+ otherwise.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src1`` and ``src2`` operands are both
+ immediate values and the carry and overflow flags are not required.
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`AND <umlinst-and>` if
+ the ``src1`` operand or ``src2`` operand is the immediate value zero
+ and the carry and overflow flags are not required.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+* If the ``src2`` and ``dst`` operands refer to the same register or
+ memory location, the ``src1`` and ``src2`` operands are exchanged.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-addc:
+
+ADDC
+~~~~
+
+Add two integers and the carry flag.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| addc dst,src1,src2 | UML_ADDC(block, dst, src1, src2); |
+| daddc dst,src1,src2 | UML_DADDC(block, dst, src1, src2); |
++---------------------------+----------------------------------------+
+
+Calculates ``dst = src1 + src2 + C``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the sum will be stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The first addend.
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The second addend.
+
+Flags
+^^^^^
+
+carry (C)
+ Set in the case of arithmetic carry out of the most significant bit,
+ or cleared otherwise (unsigned overflow).
+overflow (V)
+ Set in the case of signed two’s complement overflow, or cleared
+ otherwise.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+* If the ``src2`` and ``dst`` operands refer to the same register or
+ memory location, the ``src1`` and ``src2`` operands are exchanged.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-sub:
+
+SUB
+~~~
+
+Subtract an integer from another integer.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| sub dst,src1,src2 | UML_SUB(block, dst, src1, src2); |
+| dsub dst,src1,src2 | UML_DSUB(block, dst, src1, src2); |
++---------------------------+---------------------------------------+
+
+Calculates ``dst = src1 - src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the difference will be stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The minuend (the value to subtract from).
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The subtrahend (the value to subtract).
+
+Flags
+^^^^^
+
+carry (C)
+ Set if the subtrahend is a larger unsigned value than the minuend,
+ or cleared otherwise (unsigned overflow, or arithmetic borrow).
+overflow (V)
+ Set in the case of signed two’s complement overflow, or cleared
+ otherwise.
+zero (Z)
+ Set if the result is zero, or cleared otherwise (set if the minuend
+ and subtrahend are equal, or cleared otherwise).
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src1`` and ``src2`` operands are both
+ immediate values and the carry and overflow flags are not required.
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`AND <umlinst-and>` if
+ the ``src2`` operand is the immediate value zero and the carry and
+ overflow flags are not required.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+
+.. _umlinst-subb:
+
+SUBB
+~~~~
+
+Subtract an integer and the carry flag from another integer.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| subb dst,src1,src2 | UML_SUBB(block, dst, src1, src2); |
+| dsubb dst,src1,src2 | UML_DSUBB(block, dst, src1, src2); |
++---------------------------+----------------------------------------+
+
+Calculates ``dst = src1 - src2 - C``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the difference will be stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The minuend (the value to subtract from).
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The subtrahend (the value to subtract).
+
+Flags
+^^^^^
+
+carry (C)
+ Set if the subtrahend plus the carry flag is a larger unsigned value
+ than the minuend, or cleared otherwise (unsigned overflow, or
+ arithmetic borrow).
+overflow (V)
+ Set in the case of signed two’s complement overflow, or cleared
+ otherwise.
+zero (Z)
+ Set if the result is zero, or cleared otherwise (set if the minuend
+ is equal to the subtrahend plus the carry flag, or cleared
+ otherwise).
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+
+.. _umlinst-cmp:
+
+CMP
+~~~
+
+Compare two integers and set the flags as though they were subtracted.
+
++-----------------------+----------------------------------+
+| Disassembly | Usage |
++=======================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| cmp src1,src2 | UML_CMP(block, src1, src2); |
+| dcmp src1,src2 | UML_DCMP(block, src1, src2); |
++-----------------------+----------------------------------+
+
+Sets the flags based on calculating ``src1 - src2`` but discards the
+result of the subtraction.
+
+Operands
+^^^^^^^^
+
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The left-hand side value to compare, or the minuend (the value to
+ subtract from).
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The right-hand side value to compare, or the subtrahend (the value
+ to subtract).
+
+Flags
+^^^^^
+
+carry (C)
+ Set if the unsigned value of the ``src1`` operand is smaller than
+ the unsigned value of the ``src2`` operand, or cleared otherwise.
+overflow (V)
+ Set if subtracting the value of the ``src2`` operand from the value
+ of the ``src1`` operand would result in two’s complement overflow,
+ or cleared otherwise.
+zero (Z)
+ Set if the values of the ``src1`` and ``src2`` operands are equal,
+ or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result of
+ subtracting the value of the ``src2`` operand from the value of the
+ ``src1`` operand (set if the result would be a negative signed
+ integer, or cleared otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`NOP <umlinst-nop>` if no flags are required.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+
+.. _umlinst-and:
+
+AND
+~~~
+
+Calculate the bitwise logical conjunction of two integers (result bits
+will be set if the corresponding bits are set in both inputs).
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| and dst,src1,src2 | UML_AND(block, dst, src1, src2); |
+| dand dst,src1,src2 | UML_DAND(block, dst, src1, src2); |
++---------------------------+---------------------------------------+
+
+Calculates ``dst = src1 & src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the logical conjunction will be stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The first input.
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The second input.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` if the ``src1`` and ``src2``
+ operands refer to the same memory location or register, the ``src1``
+ and ``src2`` operands are both immediate values or one of them is an
+ immediate value with all bits set or no bits set and flags are not
+ required.
+* Converted to :ref:`OR <umlinst-or>` if the ``src1`` and ``src2``
+ operands are both immediate values with all bits set and flags are
+ required.
+* Converted to :ref:`TEST <umlinst-test>` if the instruction size is
+ 64 bits or the ``dst`` operand refers to a memory location, one of the
+ ``src1`` and ``src2`` operands refer to the same memory location or
+ register as ``dst``, the other source operand refers to the same
+ memory location or register or is an immediate value with all bits
+ set, and flags are required.
+* If the ``src1`` and ``src2`` operands are both immediate values, the
+ conjunction is not zero and flags are required, ``src1`` is replaced
+ with the conjunction and ``src2`` is set to an immediate value with
+ all bits set.
+* If the ``src1`` and ``src2`` operands are both immediate values and
+ the conjunction is zero or either the ``src1`` or ``src2`` operand is
+ the immediate value zero and flags are required, ``src1`` is set to
+ refer to the same memory location or register as ``dst`` and ``src2``
+ is set to the immediate value zero.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+* If the ``src2`` and ``dst`` operands refer to the same register or
+ memory location, the ``src1`` and ``src2`` operands are exchanged.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-test:
+
+TEST
+~~~~
+
+Set the flags based on the bitwise logical conjunction of two integers.
+
++-----------------------+-----------------------------------+
+| Disassembly | Usage |
++=======================+===================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| test src1,src2 | UML_TEST(block, src1, src2); |
+| dtest src1,src2 | UML_DTEST(block, src1, src2); |
++-----------------------+-----------------------------------+
+
+Sets the flags based on calculating ``src1 & src2`` but discards the
+result of the conjunction.
+
+Operands
+^^^^^^^^
+
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The first input.
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The second input.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result of the conjunction is zero, or cleared otherwise.
+sign (S)
+ Set if the most significant bit is set in both inputs, or cleared
+ otherwise (set if the both inputs are negative signed integers, or
+ cleared otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`NOP <umlinst-nop>` if flags are not required.
+* If the ``src1`` and ``src2`` operands are both immediate values and
+ the bitwise logical conjunction is not zero, the ``src1`` operand is
+ set to the conjunction and the ``src2`` operand is set to an immediate
+ value with all bits set.
+* If either of the ``src1`` and ``src2`` operands is the immediate value
+ zero or the ``src1`` and ``src2`` operands are both immediate values
+ and the bitwise logical conjunction is zero, the ``src1`` and ``src2``
+ operands are both set to the immediate value zero.
+* If the ``src1`` and ``src2`` operands refer to the same memory
+ location or register, the ``src2`` operand is set to an immediate
+ value with all bits set. * Immediate values for the ``src1`` and
+ ``src2`` operands are truncated to the instruction size.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-or:
+
+OR
+~~
+
+Calculate the bitwise logical inclusive disjunction of two integers (result bits
+will be set if the corresponding bits are set in either input).
+
++---------------------------+--------------------------------------+
+| Disassembly | Usage |
++===========================+======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| or dst,src1,src2 | UML_OR(block, dst, src1, src2); |
+| dor dst,src1,src2 | UML_DOR(block, dst, src1, src2); |
++---------------------------+--------------------------------------+
+
+Calculates ``dst = src1 | src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the logical inclusive disjunction will be
+ stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The first input.
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The second input.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` if the ``src1`` and ``src2``
+ operands are both immediate values or one of the ``src1`` or ``src2``
+ operands is an immediate value with all bits set and flags are not
+ required.
+* Converted to :ref:`AND <umlinst-and>` if the ``src1`` and ``src2``
+ operands are both immediate values and the inclusive disjunction does
+ not have all bits set and flags are required.
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`TEST <umlinst-test>` if the ``src1`` and ``src2`` operands refer
+ to the same memory location or register or if one of the ``src1`` and
+ ``src2`` operands is the immediate value zero.
+* If one of the ``src1`` and ``src2`` operands is an immediate value
+ with all bits set or the ``src1`` and ``src2`` operands are both
+ immediate values and the inclusive disjunction has all bits set and
+ flags are required, ``src1`` is set to refer to the same memory
+ location or register as ``dst`` and ``src2`` is set to an immediate
+ value with all bits set.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+* If the ``src2`` and ``dst`` operands refer to the same register or
+ memory location, the ``src1`` and ``src2`` operands are exchanged.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-xor:
+
+XOR
+~~~
+
+Calculate the bitwise logical exclusive disjunction of two integers
+(result bits will be set if the corresponding bit is set in one input
+and unset in the other input).
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| xor dst,src1,src2 | UML_XOR(block, dst, src1, src2); |
+| dxor dst,src1,src2 | UML_DXOR(block, dst, src1, src2); |
++---------------------------+---------------------------------------+
+
+Calculates ``dst = src1 ^ src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the logical exclusive disjunction will be
+ stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The first input.
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The second input.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>`,
+ :ref:`TEST <umlinst-test>` or :ref:`OR <umlinst-or>` if the ``src1``
+ and ``src2`` operands are both immediate values, if one of the
+ ``src1`` and ``src2`` operands is the immediate value zero or if the
+ ``src1`` and ``src2`` operands refer to the same memory location or
+ register.
+
+.. _umlinst-sext:
+
+SEXT
+~~~~
+
+Sign extend an integer value.
+
++--------------------------+---------------------------------------+
+| Disassembly | Usage |
++==========================+=======================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| sext dst,src,size | UML_SEXT(block, dst, src, size); |
+| dsext dst,src,size | UML_DSEXT(block, dst, src, size); |
++--------------------------+---------------------------------------+
+
+Sets ``dst`` to the value of ``src`` sign extended from the size
+specified by the ``size`` operand to the instruction size.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the sign extended value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to sign extend.
+size (access size)
+ The size of the value to sign extend. Must be ``SIZE_BYTE``
+ (8-bit), ``SIZE_WORD`` (16-bit) or ``SIZE_DWORD`` (32-bit).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` operand is an immediate value or
+ if the ``size`` operand specifies a size no smaller than the
+ instruction size.
+
+.. _umlinst-lzcnt:
+
+LZCNT
+~~~~~
+
+Count the number of contiguous left-aligned zero bits in an integer
+(count leading zeroes).
+
++---------------------+----------------------------------+
+| Disassembly | Usage |
++=====================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| lzcnt dst,src | UML_LZCNT(block, dst, src); |
+| dlzcnt dst,src | UML_DLZCNT(block, dst, src); |
++---------------------+----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The input value in which to count left-aligned zero bits.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise (set to the most
+ significant bit of the input).
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`AND <umlinst-and>` if
+ the ``src`` operand is an immediate value.
+
+.. _umlinst-tzcnt:
+
+TZCNT
+~~~~~
+
+Count the number of contiguous right-aligned zero bits in an integer
+(count trailing zeroes).
+
++---------------------+----------------------------------+
+| Disassembly | Usage |
++=====================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| tzcnt dst,src | UML_TZCNT(block, dst, src); |
+| dtzcnt dst,src | UML_DTZCNT(block, dst, src); |
++---------------------+----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The input value in which to count right-aligned zero bits.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise (set to the least
+ significant bit of the input).
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`AND <umlinst-and>` if
+ the ``src`` operand is an immediate value.
+
+
+.. _umlinst-intmuldiv:
+
+Integer multiply and divide
+---------------------------
+
+.. _umlinst-mullw:
+
+MULLW
+~~~~~
+
+Multiply two integer values.
+
++---------------------------+------------------------------------------+
+| Disassembly | Usage |
++===========================+==========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| mululw dst,src1,src2 | UML_MULULW(block, dst, src1, src2); |
+| mulslw dst,src1,src2 | UML_MULSLW(block, dst, src1, src2); |
+| dmululw dst,src1,src2 | UML_DMULULW(block, dst, src1, src2); |
+| dmulslw dst,src1,src2 | UML_DMULSLW(block, dst, src1, src2); |
++---------------------------+------------------------------------------+
+
+Calculates ``dst = src1 * src2`` producing a result the same size as the
+inputs. MULULW and DMULULW take unsigned integer values as inputs and
+produce an unsigned integer value as a result, while MULSLW and DMULSLW
+take signed integer values as inputs and produce a signed integer value
+as a result. Note that the distinction between signed and unsigned
+values only affects the calculation of the overflow flag for this
+instruction. It does not affect the result of the multiplication.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the product will be stored.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The multiplicand (the value to multiply).
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The multiplier (the value to multiply by).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Set if the full result of the multiplication cannot be represented
+ within the instruction size.
+zero (Z)
+ Set if the result is zero, or cleared otherwise. Note that this is
+ based on the possibly truncated result value, not the full result of
+ the multiplication.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise). Note that this is based on the possibly truncated
+ result value, not the full result of the multiplication.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src1`` and ``src2`` operands are both
+ immediate values or either the ``src1`` or ``src2`` operand is the
+ immediate value zero or one and the overflow flag is not required.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+* If the ``src2`` and ``dst`` operands refer to the same register or
+ memory location, the ``src1`` and ``src2`` operands are exchanged.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-mul:
+
+MUL
+~~~
+
+Multiply two integer values, possibly producing an extended result.
+
++--------------------------------+----------------------------------------------+
+| Disassembly | Usage |
++================================+==============================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| mulu dst,edst,src1,src2 | UML_MULU(block, dst, edst, src1, src2); |
+| muls dst,edst,src1,src2 | UML_MULS(block, dst, edst, src1, src2); |
+| dmulu dst,edst,src1,src2 | UML_DMULU(block, dst, edst, src1, src2); |
+| dmuls dst,edst,src1,src2 | UML_DMULS(block, dst, edst, src1, src2); |
++--------------------------------+----------------------------------------------+
+
+Calculates ``edst:dst = src1 * src2`` if the ``dst`` and ``edst``
+operands do not refer to the same register or memory location, or
+``dst = src1 * src2`` if the ``dst`` and ``edst`` operands refer to the
+same register or memory location. MULU and DMULU take unsigned integer
+values as inputs and produce an unsigned integer value as a result,
+while MULS and DMULS take signed integer values as inputs and produce a
+signed integer value as a result.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the least significant half of the full product
+ will be stored.
+edst (32-bit or 64-bit – memory, integer register)
+ The destination where the most significant half of the full product
+ will be stored if this operand does not refer to the same memory
+ location or register as the ``dst`` operand. If this operand refers
+ to the same memory location or register as the ``dst`` operand, the
+ most significant half of the full product will be discarded,
+ producing a result the same size as the inputs.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The multiplicand (the value to multiply).
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The multiplier (the value to multiply by).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Set if the full result of the multiplication cannot be represented
+ within the instruction size.
+zero (Z)
+ Set if the full result of the multiplication is zero, or cleared
+ otherwise. Note that this is based on the full result of the
+ multiplication even when the ``dst`` and ``edst`` operands refer to
+ the same memory location or register, causing the result to be
+ truncated.
+sign (S)
+ Set to the value of the most significant bit of the full result of
+ the multiplication (set if the result is a negative signed integer
+ value, or cleared otherwise). Note that this is based on the full
+ result of the multiplication even when the ``dst`` and ``edst``
+ operands refer to the same memory location or register, causing the
+ result to be truncated.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MULLW <umlinst-mullw>` if the ``dst`` and ``edst``
+ operands refer to the same memory location or register and the zero
+ and sign flags are not required.
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``dst`` and ``edst`` operands refer to
+ the same memory location or register, the ``src1`` and ``src2``
+ operands are both immediate values or either the ``src1`` or ``src2``
+ operand is the immediate value zero, the most significant half of the
+ full result of the multiplication is the sign extension of the least
+ significant half or the sign flag is not required, and the overflow
+ flag is not required.
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`AND <umlinst-and>` if
+ the ``dst`` and ``edst`` operands refer to the same memory location or
+ register, either the ``src1`` or ``src2`` operand is the immediate
+ value one, signed multiplication is being performed or the sign flag
+ is not required, and the overflow flag is not required.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+* If the ``src1`` operand is an immediate value and the ``src2`` operand
+ is not an immediate value, the ``src1`` and ``src2`` operands are
+ exchanged.
+
+.. _umlinst-div:
+
+DIV
+~~~
+
+Divide an integer value by another integer value.
+
++--------------------------------+----------------------------------------------+
+| Disassembly | Usage |
++================================+==============================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| divu dst,edst,src1,src2 | UML_DIVU(block, dst, edst, src1, src2); |
+| divs dst,edst,src1,src2 | UML_DIVS(block, dst, edst, src1, src2); |
+| ddivu dst,edst,src1,src2 | UML_DDIVU(block, dst, edst, src1, src2); |
+| ddivs dst,edst,src1,src2 | UML_DDIVS(block, dst, edst, src1, src2); |
++--------------------------------+----------------------------------------------+
+
+If the value of ``src2`` is not zero, the value of ``src1`` is divided
+by the value of ``src2``, the quotient is stored in the memory location
+or register referred to by ``dst``, and the remainder is stored in the
+memory location or register referred to by ``edst`` if the ``dst`` and
+``edst`` operands do not refer to the same memory location or register.
+
+If the value of ``src2`` is zero, the overflow flag is set and the
+values of the memory locations or registers referred to by the ``dst``
+and ``edst`` operands are undefined.
+
+DIVU and DDIVU take unsigned integer values as inputs and produce
+unsigned integer values as results, while DIVS and DDIVS take signed
+integer values as inputs and produce signed integer values as results.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the quotient will be stored if the value of
+ the ``src2`` operand is not zero.
+edst (32-bit or 64-bit – memory, integer register)
+ The destination where the value of the remainder will be stored if
+ this operand does not refer to the same memory location or register
+ as the ``dst`` operand and the value of the ``src2`` operand is not
+ zero.
+src1 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The dividend (the value to divide).
+src2 (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The divisor (the value to divide by).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Set if the divisor (the value of the ``src2`` operand) is zero, or
+ cleared otherwise.
+zero (Z)
+ Set if the divisor (the value of the ``src2`` operand) is not zero
+ and the quotient is zero, or cleared otherwise.
+sign (S)
+ Set to the most significant bit of the quotient (set if the quotient
+ is a negative signed integer value) if the divisor (the value of the
+ ``src2`` operand) is not zero, or cleared otherwise.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``dst`` and ``edst`` operands refer to
+ the same memory location or register, the ``src1`` and ``src2``
+ operands are both immediate values or ``src2`` operand is the
+ immediate value one, the ``src2`` operand is not the immediate value
+ zero, and the overflow flag is not required.
+* Immediate values for the ``src1`` and ``src2`` operands are truncated
+ to the instruction size.
+
+
+.. _umlinst-intshift:
+
+Integer shift and rotate
+------------------------
+
+.. _umlinst-shl:
+
+SHL
+~~~
+
+Shift an integer value to the left (toward the most significant bit
+position), shifting zeroes into the least significant bit.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| shl dst,src,count | UML_SHL(block, dst, src, count); |
+| dshl dst,src,count | UML_DSHL(block, dst, src, count); |
++---------------------------+---------------------------------------+
+
+Sets ``dst`` to the value of ``src`` shifted left by ``count`` bit
+positions modulo the operand size in bits. Zeroes are shifted into the
+least significant bit position.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the shifted value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to shift.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to shift by. Only the least significant
+ five bits or six bits of this operand are used, depending on the
+ instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the most significant
+ bit position if the shift count modulo the operand size in bits is
+ non-zero, or cleared if the shift count modulo the operand size in
+ bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` and ``count`` operands are both
+ immediate values or the ``count`` operand is the immediate value zero
+ and the carry flag is not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-shr:
+
+SHR
+~~~
+
+Shift an integer value to the right (toward the least significant bit
+position), shifting zeroes into the most significant bit.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| shr dst,src,count | UML_SHR(block, dst, src, count); |
+| dshr dst,src,count | UML_DSHR(block, dst, src, count); |
++---------------------------+---------------------------------------+
+
+Sets ``dst`` to the value of ``src`` shifted right by ``count`` bit
+positions modulo the operand size in bits. Zeroes are shifted into the
+most significant bit position.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the shifted value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to shift.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to shift by. Only the least significant
+ five bits or six bits of this operand are used, depending on the
+ instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the least
+ significant bit position if the shift count modulo the operand size
+ in bits is non-zero, or cleared if the shift count modulo the
+ operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` and ``count`` operands are both
+ immediate values or the ``count`` operand is the immediate value zero
+ and the carry flag is not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-sar:
+
+SAR
+~~~
+
+Shift an integer value to the right (toward the least significant bit
+position), preserving the value of the most significant bit.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| sar dst,src,count | UML_SAR(block, dst, src, count); |
+| dsar dst,src,count | UML_DSAR(block, dst, src, count); |
++---------------------------+---------------------------------------+
+
+Sets ``dst`` to the value of ``src`` shifted right by ``count`` bit
+positions modulo the operand size in bits. The value of the most
+significant bit is preserved after each shift step.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the shifted value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to shift.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to shift by. Only the least significant
+ five bits or six bits of this operand are used, depending on the
+ instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the least
+ significant bit position if the shift count modulo the operand size
+ in bits is non-zero, or cleared if the shift count modulo the
+ operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` and ``count`` operands are both
+ immediate values or the ``count`` operand is the immediate value zero
+ and the carry flag is not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-rol:
+
+ROL
+~~~
+
+Rotate an integer value to the left (toward the most significant bit
+position). Bits shifted out of the most significant bit position are
+shifted into the least significant bit position.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| rol dst,src,count | UML_ROL(block, dst, src, count); |
+| drol dst,src,count | UML_DROL(block, dst, src, count); |
++---------------------------+---------------------------------------+
+
+Sets ``dst`` to the value of ``src`` rotated left by ``count`` bit
+positions.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to rotated.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit rotated out of the most significant
+ bit position (set to the least significant bit of the result) if the
+ shift count modulo the operand size in bits is non-zero, or cleared
+ if the shift count modulo the operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` and ``count`` operands are both
+ immediate values or the ``count`` operand is the immediate value zero
+ and the carry flag is not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-ror:
+
+ROR
+~~~
+
+Rotate an integer value to the right (toward the least significant bit
+position). Bits shifted out of the least significant bit position are
+shifted into the most significant bit position.
+
++---------------------------+---------------------------------------+
+| Disassembly | Usage |
++===========================+=======================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| ror dst,src,count | UML_ROR(block, dst, src, count); |
+| dror dst,src,count | UML_DROR(block, dst, src, count); |
++---------------------------+---------------------------------------+
+
+Sets ``dst`` to the value of ``src`` rotated right by ``count`` bit
+positions.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to rotated.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit rotated out of the least
+ significant bit position (set to the most significant bit of the
+ result) if the shift count modulo the operand size in bits is
+ non-zero, or cleared if the shift count modulo the operand size in
+ bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` and ``count`` operands are both
+ immediate values or the ``count`` operand is the immediate value zero
+ and the carry flag is not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-rolc:
+
+ROLC
+~~~~
+
+Rotate an integer value concatenated with the carry flag to the left
+(toward the most significant bit position). For each step, the carry
+flag is shifted into the least significant bit position, and the carry
+flag is set to the bit shifted out of the most significant bit position.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| rolc dst,src,count | UML_ROLC(block, dst, src, count); |
+| drolc dst,src,count | UML_DROLC(block, dst, src, count); |
++---------------------------+----------------------------------------+
+
+Sets ``dst`` to the value of ``src`` concatenated with the carry flag
+rotated left by ``count`` bit positions modulo the operand size in bits.
+For each shift step, the current value of the carry flag is shifted into
+the least significant bit position, and the carry flag is set to the
+value of the bit shifted out of the most significant bit position.
+
+Note that although this instruction rotates a 33-bit or 65-bit value
+(including the carry flag), the shift count is interpreted modulo 32 or
+64.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to rotated.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the least
+ significant bit position if the shift count modulo the operand size
+ in bits is non-zero, or unchanged if the shift count modulo the
+ operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`NOP <umlinst-nop>` if
+ the ``count`` operand is the immediate value zero and the zero and
+ sign flags are not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-rorc:
+
+RORC
+~~~~
+
+Rotate an integer value concatenated with the carry flag to the right
+(toward the least significant bit position). For each step, the carry
+flag is shifted into the most significant bit position, and the carry
+flag is set to the bit shifted out of the least significant bit
+position.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| rorc dst,src,count | UML_RORC(block, dst, src, count); |
+| drorc dst,src,count | UML_DRORC(block, dst, src, count); |
++---------------------------+----------------------------------------+
+
+Sets ``dst`` to the value of ``src`` concatenated with the carry flag
+rotated right by ``count`` bit positions modulo the operand size in
+bits. For each shift step, the current value of the carry flag is
+shifted into the most significant bit position, and the carry flag is
+set to the value of the bit shifted out of the least significant bit
+position.
+
+Note that although this instruction rotates a 33-bit or 65-bit value
+(including the carry flag), the shift count is interpreted modulo 32 or
+64.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to rotated.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the least
+ significant bit position if the shift count modulo the operand size
+ in bits is non-zero, or unchanged if the shift count modulo the
+ operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`NOP <umlinst-nop>` if
+ the ``count`` operand is the immediate value zero and the zero and
+ sign flags are not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-bfx:
+
+BFX
+~~~
+
+Extract a contiguous bit field from an integer value.
+
++---------------------------------+-----------------------------------------------+
+| Disassembly | Usage |
++=================================+===============================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| bfxu dst,src,shift,width | UML_BFXU(block, dst, src, shift, width); |
+| bfxs dst,src,shift,width | UML_BFXS(block, dst, src, shift, width); |
+| dbfxu dst,src,shift,width | UML_DBFXU(block, dst, src, shift, width); |
+| dbfxs dst,src,shift,width | UML_DBFXS(block, dst, src, shift, width); |
++---------------------------------+-----------------------------------------------+
+
+Extracts and right-aligns a contiguous bit field from the value of
+``src``, specified by its least significant bit position and width in
+bits. The field must be narrower than the ``src`` operand, but it may
+wrap around from the most significant bit position to the least
+significant bit position. BFXU and DBFXU zero-extend an unsigned field,
+while BFXS and DBFXS sign-extend a signed field.
+
+Back-ends may be able to optimise some forms of this instruction for
+example when the ``shift`` and ``width`` operands are both immediate
+values.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the extracted field will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to extract a contiguous bit field from.
+shift (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The position of the least significant bit of the field to extract,
+ where zero is the least significant bit position, and bit numbers
+ increase toward the most significant bit position. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+width (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The width of the field to extract in bits. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size. The result is undefined if the
+ width modulo the instruction size in bits is zero.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src``, ``shift`` and ``width``
+ operands are all immediate values, or if the ``width`` operand is the
+ immediate value zero.
+* Converted to :ref:`SHR <umlinst-shr>` or :ref:`SAR <umlinst-sar>` if
+ the ``src`` operand is not an immediate value, the ``shift`` and
+ ``width`` operands are both immediate values, and the sum of the value
+ of the ``shift`` operand and the value of the ``width`` operand is
+ equal to the instruction size in bits.
+* BFXU and DBFXU are converted to :ref:`AND <umlinst-and>` if the
+ ``shift`` operand is the immediate value zero and ``width`` operand is
+ an immediate value.
+* BFXS and DBFXS are converted to :ref:`SEXT <umlinst-sext>` if the
+ ``shift`` operand is the immediate value zero and ``width`` operand is
+ the immediate value 8, 16 or 32.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``shift`` and ``width`` operands are
+ truncated to five or six bits for 32-bit or 64-bit operands,
+ respectively.
+
+.. _umlinst-roland:
+
+ROLAND
+~~~~~~
+
+Rotate and mask an integer value. The value is rotated to the left
+(toward the most significant bit position). Bits shifted out of the
+most significant bit position are shifted into the least significant bit
+position. The logical conjunction of the rotated value and the mask is
+then calculated.
+
++--------------------------------+------------------------------------------------+
+| Disassembly | Usage |
++================================+================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| roland dst,src,count,mask | UML_ROLAND(block, dst, src, count, mask); |
+| droland dst,src,count,mask | UML_DROLAND(block, dst, src, count, mask); |
++--------------------------------+------------------------------------------------+
+
+Sets ``dst`` to the logical conjunction of the value of ``src`` rotated
+left by ``count`` bit positions and the value of ``mask``.
+
+Back-ends may be able to optimise some forms of this instruction, for
+example when the ``count`` and ``mask`` operands are both immediate
+values.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated and masked value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to be rotated and masked.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+mask (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The mask to calculate the logical conjunction with.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` and ``count`` operands are both
+ immediate values, or if either the ``count`` or ``mask`` operand is
+ the immediate value zero.
+* Converted to :ref:`ROL <umlinst-rol>` if the ``mask`` operand is an
+ immediate value with all bits set.
+* Converted to :ref:`SHL <umlinst-shl>` if the ``count`` operand is an
+ immediate value and the ``mask`` operand is an immediate value
+ containing a single contiguous left-aligned sequence of set bits of
+ the appropriate length for the value of the ``count`` operand.
+* Converted to :ref:`SHR <umlinst-shr>` or :ref:`BFX <umlinst-bfx>` if
+ the ``count`` operand is an immediate value and the ``mask`` operand
+ is an immediate value containing a single contiguous right-aligned
+ sequence of set bits.
+* Immediate values for the ``src`` and ``mask`` operands are truncated
+ to the instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-rolins:
+
+ROLINS
+~~~~~~
+
+Rotate an integer value and combine with the destination value using a
+mask. The value is rotated to the left (toward the most significant bit
+position). Bits shifted out of the most significant bit position are
+shifted into the least significant bit position. The rotated value is
+then combined with the destination value: for bit positions that are set
+in the mask, the corresponding bit position values are copied from the
+rotated value to the destination; for bit positions that are clear in
+the mask, the corresponding bit position values in the destination are
+preserved.
+
++--------------------------------+------------------------------------------------+
+| Disassembly | Usage |
++================================+================================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| rolins dst,src,count,mask | UML_ROLINS(block, dst, src, count, mask); |
+| drolins dst,src,count,mask | UML_DROLINS(block, dst, src, count, mask); |
++--------------------------------+------------------------------------------------+
+
+Rotates the value of ``src`` left by ``count`` bit positions and then
+copies bit values to ``dst`` where the corresponding bit positions are
+set in ``mask``.
+
+Back-ends may be able to optimise some forms of this instruction, for
+example when the ``count`` and ``mask`` operands are both immediate
+values.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination that will be combined with the rotated value.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to be rotated and masked.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+mask (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The mask to control which bit positions are copied from the rotated
+ value and which bit positions are preserved in the destination.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`ROL <umlinst-rol>`, :ref:`AND <umlinst-and>`,
+ :ref:`OR <umlinst-or>` or :ref:`MOV <umlinst-mov>` if the ``mask``
+ operand is an immediate value with all bits set or the immediate value
+ zero.
+* Immediate values for the ``src`` and ``mask`` operands are truncated
+ to the instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-bswap:
+
+BSWAP
+~~~~~
+
+Reverse the order of bytes within an integer value.
+
++---------------------+----------------------------------+
+| Disassembly | Usage |
++=====================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| bswap dst,src | UML_BSWAP(block, dst, src); |
+| dbswap dst,src | UML_DBSWAP(block, dst, src); |
++---------------------+----------------------------------+
+
+This instruction can be used to convert between big Endian and little
+Endian byte order.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to have its byte order reversed.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>`, :ref:`AND <umlinst-and>` or
+ :ref:`OR <umlinst-or>` if the ``src`` operand is an immediate value.
+
+
+.. _umlinst-fparith:
+
+Floating point arithmetic
+-------------------------
+
+.. _umlinst-fadd:
+
+FADD
+~~~~
+
+Add two floating point numbers.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsadd dst,src1,src2 | UML_FSADD(block, dst, src1, src2); |
+| fdadd dst,src1,src2 | UML_FDADD(block, dst, src1, src2); |
++---------------------------+----------------------------------------+
+
+Calculates ``dst = src1 + src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the sum will be stored.
+src1 (32-bit or 64-bit – memory, floating point register)
+ The first addend.
+src2 (32-bit or 64-bit – memory, floating point register)
+ The second addend.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fsub:
+
+FSUB
+~~~~
+
+Subtract a floating point number from another floating point number.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fssub dst,src1,src2 | UML_FSSUB(block, dst, src1, src2); |
+| fdsub dst,src1,src2 | UML_FDSUB(block, dst, src1, src2); |
++---------------------------+----------------------------------------+
+
+Calculates ``dst = src1 - src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the difference will be stored.
+src1 (32-bit or 64-bit – memory, floating point register)
+ The minuend (the value to subtract from).
+src2 (32-bit or 64-bit – memory, floating point register)
+ The subtrahend (the value to subtract).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fcmp:
+
+FCMP
+~~~~
+
+Compare two floating-point numbers and set the carry, zero and unordered
+flags.
+
++-----------------------+-----------------------------------+
+| Disassembly | Usage |
++=======================+===================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fscmp src1,src2 | UML_FSCMP(block, src1, src2); |
+| fdcmp src1,src2 | UML_FDCMP(block, src1, src2); |
++-----------------------+-----------------------------------+
+
+Operands
+^^^^^^^^
+
+src1 (32-bit or 64-bit – memory, floating point register)
+ The left-hand side value to compare.
+src2 (32-bit or 64-bit – memory, floating point register)
+ The right-hand side value to compare.
+
+Flags
+^^^^^
+
+carry (C)
+ Set if the value of ``src1`` is less than the value of ``src2``, or
+ cleared otherwise.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the values of ``src1`` and ``src2`` are equal, or cleared
+ otherwise.
+sign (S)
+ Undefined.
+unordered (U)
+ Set if either ``src1`` or ``src2`` is not a number (NaN), or cleared
+ otherwise.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fmul:
+
+FMUL
+~~~~
+
+Multiply two floating point numbers.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsmul dst,src1,src2 | UML_FSMUL(block, dst, src1, src2); |
+| fdmul dst,src1,src2 | UML_FDMUL(block, dst, src1, src2); |
++---------------------------+----------------------------------------+
+
+Calculates ``dst = src1 * src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the product will be stored.
+src1 (32-bit or 64-bit – memory, floating point register)
+ The multiplicand (the value to multiply).
+src2 (32-bit or 64-bit – memory, floating point register)
+ The multiplier (the value to multiply by).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fdiv:
+
+FDIV
+~~~~
+
+Divide a floating point number by another floating point number.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsdiv dst,src1,src2 | UML_FSDIV(block, dst, src1, src2); |
+| fddiv dst,src1,src2 | UML_FDDIV(block, dst, src1, src2); |
++---------------------------+----------------------------------------+
+
+Calculates ``dst = src1 / src2``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the quotient will be stored.
+src1 (32-bit or 64-bit – memory, floating point register)
+ The dividend (the value to divide).
+src2 (32-bit or 64-bit – memory, floating point register)
+ The divisor (the value to divide by).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fneg:
+
+FNEG
+~~~~
+
+Negate a floating point number.
+
++---------------------+---------------------------------+
+| Disassembly | Usage |
++=====================+=================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsneg dst,src | UML_FSNEG(block, dst, src); |
+| fdneg dst,src | UML_FDNEG(block, dst, src); |
++---------------------+---------------------------------+
+
+Calculates ``dst = -src``.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to be negated.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fabs:
+
+FABS
+~~~~
+
+Calculate the absolute value of a floating point number.
+
++---------------------+---------------------------------+
+| Disassembly | Usage |
++=====================+=================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsabs dst,src | UML_FSABS(block, dst, src); |
+| fdabs dst,src | UML_FDABS(block, dst, src); |
++---------------------+---------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to calculate the absolute value of.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-fsqrt:
+
+FSQRT
+~~~~~
+
+Calculate the square root of a floating point number.
+
++---------------------+----------------------------------+
+| Disassembly | Usage |
++=====================+==================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fssqrt dst,src | UML_FSSQRT(block, dst, src); |
+| fdsqrt dst,src | UML_FDSQRT(block, dst, src); |
++---------------------+----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the square root will be stored.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to calculate the square root of.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-frecip:
+
+FRECIP
+~~~~~~
+
+Calculate an approximate reciprocal value of a floating point number.
+The algorithm used, precision and nature of inaccuracies in the
+approximation are unspecified.
+
++---------------------+---------------------------------+
+| Disassembly | Usage |
++=====================+=================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsabs dst,src | UML_FSABS(block, dst, src); |
+| fdabs dst,src | UML_FDABS(block, dst, src); |
++---------------------+---------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to approximate the reciprocal of.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-frsqrt:
+
+FRSQRT
+~~~~~~
+
+Calculate an approximate reciprocal value of the square root of a
+floating point number. The algorithm used, precision and nature of
+inaccuracies in the approximation are unspecified.
+
++---------------------+-----------------------------------+
+| Disassembly | Usage |
++=====================+===================================+
+| .. code-block:: | .. code-block:: C++ |
+| | |
+| fsrsqrt dst,src | UML_FSRSQRT(block, dst, src); |
+| fdrsqrt dst,src | UML_FDRSQRT(block, dst, src); |
++---------------------+-----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the result will be stored.
+src (32-bit or 64-bit – memory, floating point register)
+ The value to approximate the reciprocal of the square root of.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-frnds:
+
+FRNDS
+~~~~~
+
+Round a 64-bit floating point value to 32-bit precision. The current
+default rounding type set using the :ref:`SETFMOD <umlinst-setfmod>` is
+used. Note that the instruction size must always be 64 bits for this
+instruction.
+
++---------------------+----------------------------------+
+| Disassembly | Usage |
++=====================+==================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| fdrnds dst,src | UML_FDRNDS(block, dst, src); |
++---------------------+----------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (64-bit – memory, floating point register)
+ The destination where the rounded value will be stored.
+src (64-bit – memory, floating point register)
+ The floating point value to round to 32-bit precision.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+
+.. _umlinst-fpconv:
+
+Floating point conversion
+-------------------------
+
+.. _umlinst-ftoint:
+
+FTOINT
+~~~~~~
+
+Convert a floating point number to a signed two’s complement integer.
+
++--------------------------------+------------------------------------------------+
+| Disassembly | Usage |
++================================+================================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| fstoint dst,src,size,round | UML_FSTOINT(block, dst, src, size, round); |
+| fdtoint dst,src,size,round | UML_FDTOINT(block, dst, src, size, round); |
++--------------------------------+------------------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the integer value will be stored. The
+ size/format is controlled by the ``size`` operand.
+src (32-bit or 64-bit – memory, floating point register)
+ The floating point value to convert to an integer. The instruction
+ size sets the size/format of this operand.
+size (access size)
+ The size of the result. Must be ``SIZE_DWORD`` (32-bit) or
+ ``SIZE_QWORD`` (64-bit). Note that this operand controls the size
+ of the ``dst`` operand while the instruction size sets the size of
+ the ``src`` operand.
+round (rounding type)
+ The rounding type to use. Must be ``ROUND_ROUND`` (round to
+ nearest), ``ROUND_CEIL`` (round toward positive infinity),
+ ``ROUND_FLOOR`` (round toward negative infinity), ``ROUND_TRUNC``
+ (round toward zero) or ``ROUND_DEFAULT`` (use the current default
+ rounding type set using the :ref:`SETFMOD <umlinst-setfmod>`
+ instruction).
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+No simplifications are applied to this instruction.
+
+.. _umlinst-ffrint:
+
+FFRINT
+~~~~~~
+
+Convert a signed two’s complement integer to a floating point number.
+
++--------------------------+-----------------------------------------+
+| Disassembly | Usage |
++==========================+=========================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| fsfrint dst,src,size | UML_FSFRINT(block, dst, src, size); |
+| fdfrint dst,src,size | UML_FDFRINT(block, dst, src, size); |
++--------------------------+-----------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the floating point value will be stored. The
+ instruction size sets the size/format of this operand.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The integer value to convert to a floating point value. The
+ size/format is controlled by the ``size`` operand.
+size (access size)
+ The size of the input. Must be ``SIZE_DWORD`` (32-bit) or
+ ``SIZE_QWORD`` (64-bit). Note that this operand controls the size
+ of the ``src`` operand while the instruction size sets the size of
+ the ``dst`` operand.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Immediate values for the ``src`` operand are truncated to the size set
+ using the ``size`` operand.
+
+.. _umlinst-ffrflt:
+
+FFRFLT
+~~~~~~
+
+Convert between floating point formats. The current default rounding
+type set using the :ref:`SETFMOD <umlinst-setfmod>` is used if
+applicable.
+
++--------------------------+-----------------------------------------+
+| Disassembly | Usage |
++==========================+=========================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| fsfrflt dst,src,size | UML_FSFRFLT(block, dst, src, size); |
+| fdfrflt dst,src,size | UML_FDFRFLT(block, dst, src, size); |
++--------------------------+-----------------------------------------+
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, floating point register)
+ The destination where the converted value will be stored. The
+ instruction size sets the size/format of this operand.
+src (32-bit or 64-bit – memory, floating point register)
+ The floating point value to convert. The size/format is controlled
+ by the ``size`` operand.
+size (access size)
+ The size of the input. Must be ``SIZE_SHORT`` (32-bit) or
+ ``SIZE_DOUBLE`` (64-bit). Note that this operand controls the size
+ of the ``src`` operand while the instruction size sets the size of
+ the ``dst`` operand.
+
+Flags
+^^^^^
+
+carry (C)
+ Undefined.
+overflow (V)
+ Undefined.
+zero (Z)
+ Undefined.
+sign (S)
+ Undefined.
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`FMOV <umlinst-fmov>` or :ref:`NOP <umlinst-nop>` if
+ the ``dst`` and ``src`` operands have the same size/format.
diff --git a/docs/source/tools/floptool.rst b/docs/source/tools/floptool.rst
index bf71c296aee..c2b34cced02 100644
--- a/docs/source/tools/floptool.rst
+++ b/docs/source/tools/floptool.rst
@@ -139,12 +139,6 @@ These are the formats supported by Floptool for conversion to other formats.
File extensions: dsk, do, po
-**A2_RWTS18**
-
- Apple II RWTS18-type image
-
- File extensions: rti
-
**A2_EDD**
Apple II EDD image
diff --git a/docs/source/usingmame/defaultkeys.rst b/docs/source/usingmame/defaultkeys.rst
index 9892c86cb1f..a5a76580c41 100644
--- a/docs/source/usingmame/defaultkeys.rst
+++ b/docs/source/usingmame/defaultkeys.rst
@@ -35,22 +35,22 @@ and saving/loading save states.
If you are running with -debug, this key sends a ‘break’ in emulation.
- When a slider control is visible, you can use the following keys to control
- it:
+ When a slider control is visible, the keyboard controls are the same as
+ in the Slider Controls menu:
* **Up** - select previous parameter to modify.
* **Down** - select next parameter to modify.
* **Left** - decrease the value of the selected parameter.
* **Right** - increase the value of the selected parameter.
- * **Enter** - reset parameter value to its default.
+ * **Delete** - reset parameter value to its default.
+ * **Alt+Left** - decrease the value by the largest amount.
* **Control+Left** - decrease the value by 10x.
* **Shift+Left** - decrease the value by 0.1x.
- * **Alt+Left** - decrease the value by the smallest amount.
+ * **Shift+Alt+Left** - decrease the value by the smallest amount.
+ * **Alt+Right** - increase the value by the largest amount.
* **Control+Right** - increase the value by 10x.
* **Shift+Right** - increase the value by 0.1x.
- * **Alt+Right** - increase the value by the smallest amount.
- * **End** - temporarily hide the On Screen Display.
- * **Home** - bring the On Screen Display back after hiding it.
+ * **Shift+Alt+Right** - increase the value by the smallest amount.
**Up Arrow**
Highlight previous UI menu option.
**Down Arrow**
@@ -88,14 +88,16 @@ and saving/loading save states.
Use the Enter key to switch between the three modes (palette, graphics, and
tilemaps).
- Press F4 again to turn off the display.
+ Press F4 again to turn off the viewer.
The key controls in each mode vary slightly:
Palette/colortable mode:
* **[** **]** - switch between palette devices.
* **Up**/**Down** - scroll up/down one line at a time.
- * **Page Up**/**Page Down** - scroll up/down one page at a time.
+ * **Shift+Up**/**Down** - scroll right/left one cell at a time.
+ * **Page Up**/**Page Down** - scroll up/down one page at a time (hold
+ Control or Alt to scroll 10 or 100 pages).
* **Home**/**End** - move to top/bottom of list.
* **-**/**+** - increase/decrease the number of colors per row.
* **0** - restore the default number of colors per row.
@@ -105,12 +107,15 @@ and saving/loading save states.
* **[** **]** - switch between different graphics sets.
* **Up**/**Down** - scroll up/down one line at a time.
- * **Page Up**/**Page Down** - scroll up/down one page at a time.
+ * **Shift+Up**/**Down** - scroll right/left one cell at a time.
+ * **Page Up**/**Page Down** - scroll up/down one page at a time (hold
+ Control or Alt to scroll 10 or 100 pages).
* **Home**/**End** - move to top/bottom of list.
- * **Left**/**Right** - change color displayed.
+ * **Left**/**Right** - change color displayed (hold Control or Alt for
+ wider control).
* **R** - rotate tiles 90 degrees clockwise.
- * **-**/**+** - increase/decrease the number of tiles per row (hold Shift to
- restrict to integer scale factors).
+ * **-**/**+** - increase/decrease the number of tiles per row (hold Shift
+ to restrict to integer scale factors).
* **0** - restore the default number of tiles per row (hold Shift to
restrict to integer scale factors).
* **Enter** - switch to tilemap viewer.
@@ -254,6 +259,8 @@ the standard keyboard configuration.
Usually a tilt switch or shock sensor that will end the current game, reset
credits and/or reset the machine if the machine is knocked excessively hard
or moved. Most commonly found on pinball machines.
+**O**
+ Door Interlock (A coin door for example)
**-** *(not numeric keypad)*
Volume Down
@@ -538,7 +545,7 @@ This list shows the standard keyboard configuration.
Player 1 Hanafuda No
**O**
Player 1 Taiwanese Mahjong O
-**Semicolon**
+**P**
Player 1 Taiwanese Mahjong P
**Q**
Player 1 Taiwanese Mahjong Q
@@ -582,6 +589,7 @@ buttons.
navigate the internal operator service menus)
**0** *(not numeric keypad)*
Service 2
+
Book-Keeping (for machines that have this functionality)
**-** *(not numeric keypad)*
Service 3
@@ -595,27 +603,25 @@ buttons.
Deal
**L**
Stand
-**4** *(not numeric keypad)*
- Take Score
-
- For games that allow gambling winnings in a double-or-nothing bonus game,
- this takes the winnings from the main game.
-**3** *(not numeric keypad)*
+**D**
Double Up
For games that allow gambling winnings in a double-or-nothing bonus game,
this gambles the winnings from the main game in the bonus game.
-**D**
+**F**
Half Gamble
Used by games that allow gambling half or all of the winnings from the main
- game in the bonus game.
+ game in the bonus game, this stakes half the winnings from the main game.
+**G**
+ Take Score
+
+ For games that allow gambling winnings in a double-or-nothing bonus game,
+ this stakes the winnings from the main game.
**A**
- High
+ High/big
**S**
- Low
-**O**
- Door
+ Low/small
.. _default-blackjack-keys:
diff --git a/docs/source/usingmame/frontends.rst b/docs/source/usingmame/frontends.rst
index 730b84cef6a..b4fcd993a96 100644
--- a/docs/source/usingmame/frontends.rst
+++ b/docs/source/usingmame/frontends.rst
@@ -28,14 +28,9 @@ starting point.
tightly and effectively replace MAME’s internal user interface. It has
many useful features for home computer emulation. Written in C++, the
`source code is on GitHub <https://github.com/npwoods/bletchmame>`__.
-`IV/Play <http://www.mameui.info/>`__ (Microsoft Windows)
- A simple Windows program for launching systems in MAME. Written in C#, the
- `source code is on GitHub <https://github.com/Mataniko/IV-Play>`__.
-`Emu Loader <http://emuloader.mameworld.info/>`__ (Microsoft Windows)
- Emu Loader provides a Windows interface for launching systems in multiple
- emulators, including MAME, Supermodel and DEMUL. Written in Delphi Pascal,
- the source code is available
- `on the download page <https://emuloader.mameworld.info/downloads.htm>`__.
+`IV/Play <https://john-iv.github.io/iv-play/>`__ (Microsoft Windows)
+ IV/Play has a customisable interface designed to be navigated with a
+ keyboard. It supports software lists and has flexible filtering.
`Retrofire <https://e2j.net/downloads/>`__ (Japanese, Microsoft Windows)
Provides a Japanese-language graphical interface for launching systems or
software in MAME.
diff --git a/docs/source/usingmame/mamemenus.rst b/docs/source/usingmame/mamemenus.rst
index ebade1e5188..4a1157046f3 100644
--- a/docs/source/usingmame/mamemenus.rst
+++ b/docs/source/usingmame/mamemenus.rst
@@ -110,6 +110,13 @@ Network Devices
Shows the Network Devices menu, where you can set up emulated network
adapters that support bridging to a host network. This item is not shown if
there are no network adaptors that support bridging in the running system.
+Audio Mixer
+ Shows the :ref:`Audio Mixer <menus-audiomixer>` menu, where you configure
+ how MAME routes sound from the emulated system to host system sound outputs,
+ and from host system sound inputs to the emulated system.
+Audio Effects
+ Shows the :ref:`Audio Effects <menus-audioeffects>` menu, where you can
+ configure audio effects applied to emulated sound output.
Slider Controls
Shows the Slider Controls menu, where you can adjust various settings,
including video adjustments and individual sound channel levels.
@@ -285,3 +292,187 @@ graphical form below the menu. Digital control states are either zero
ID** to copy the device’s ID to the clipboard. This is useful for setting up
:ref:`stable controller IDs <devicemap>` in :ref:`controller configuration files
<ctrlrcfg>`.
+
+
+.. _menus-audiomixer:
+
+Audio Mixer menu
+----------------
+
+The Audio Mixer menu allows you to configure how MAME routes sound from emulated
+speakers to system sound outputs, and from system sound inputs to emulated
+microphones. There are two kinds of routes: *full routes*, and *channel
+routes*:
+
+* A full output route sends sound from all channels of an emulated sound output
+ device to a host sound output. MAME automatically decides how to assign
+ emulated channels (typically speakers) to output channels, based on speaker
+ position information.
+* Similarly, a full input route sends sound from a host sound input to all
+ channels of an emulated sound input device. MAME automatically decides how
+ to assign input channels to emulated channels (typically microphones), based
+ on microphone position information.
+* A channel route sends sound from a single emulated sound output channel to a
+ single host sound output channel, or from a single host sound input channel to
+ a single emulated sound input channel.
+
+Only one full route is allowed for each combination of an emulated sound output
+or input device and host sound output or input. Only one channel route is
+allowed between an individual emulated channel and an individual host sound
+channel.
+
+Routes are grouped by emulated device. For each device, full routes are listed
+before channel routes. For each route, you can select the system sound output
+or input and adjust the volume from -96 dB (quietest) to +12 dB (loudest). For
+channel routes, you can also select the individual emulated channel and host
+channel. Select **Remove this route** to remove a route.
+
+Select **Add new full route** to add a new full route to that group. If
+possible, it will be added and the menu highlight will move to the newly added
+route. If routes between the highlighted device and every host output/input
+already exist, no route will be added.
+
+Select **Add new channel route** to add a new channel route to that group. If
+possible, it will be added and the menu highlight will move to the newly added
+route. If routes between all channels for the highlighted device and every
+host output/input channel already exist, no route will be added.
+
+Some sound modules allow channel assignments and volumes to be controlled using
+an external mixer interface (for example the PipeWire module for Linux has this
+capability). In these cases, MAME does its best to follow the changes you make
+in the external mixer interface and save changes in its configuration.
+
+The audio routes are saved in the system configuration file.
+
+
+.. _menus-audioeffects:
+
+Audio Effects menu
+------------------
+
+The Audio Effects menu allows you to configure audio effects that are applied
+to emulated sound output before it’s routed to host sound outputs. An
+independent effect chain is applied for each emulated sound output device.
+
+The effect chain itself is not configurable. It always consists of these four
+effects, in this order:
+
+* Filters
+* Compressor
+* Reverb
+* Equalizer
+
+When editing parameters for an output device’s effect chain, inherited default
+parameter values are showing dimmed, while parameter values set for that chain
+are shown in the normal text colour. Press the UI Clear key (Del/Delete/Forward
+Delete on the keyboard by default) to reset a parameter to use the inherited
+default value.
+
+Edit the **Default** chain to set default parameter value that can be inherited
+by output device chains. When editing the **Default** chain, you can restore
+the built-in default value for a parameter by pressing the UI Clear key
+(Del/Delete/Forward Delete on the keyboard by default).
+
+By default, the high-pass filter is enabled, with minimal cutoff frequency for
+DC offset removal. All other effects are bypassed (technically, the equalizer
+effect is active too, but all bands are set to 0 dB so it's still turned off).
+
+The Audio Effects menu also allows you to configure the algorithm used for audio
+sample rate conversion. The default **LoFi** algorithm has modest CPU
+requirements. The recommended **HQ** algorithm provides higher quality sample
+rate conversion at the expense of requiring substantially higher CPU
+performance.
+
+The **HQ** algorithm has additional parameters. Increasing the **HQ latency**
+can improve quality. If it's increased too much and multiple sound chips are
+used, the latencies will stack up and you will end up with too much lag at the
+end. When decreasing the latency below 1 ms, the resampler will lose its
+potential (in fact, it will sound similar to MAME's lower quality resampler from
+before version 0.278). Increasing the **HQ filter max size** or **HQ filter max
+phases** can improve quality at the expense of higher CPU performance
+requirements.
+
+
+Filter effect
+~~~~~~~~~~~~~
+
+This effect implements a second-order high-pass filter and a second-order
+low-pass filter. The high-pass filter allows DC offsets to be removed. The
+low-pass filter can simulate the poor high-frequency response typical of many
+arcade cabinets and television sets.
+
+The Q factor controls how sharp the transition from the stop band to the
+passband is. Higher factors provide a sharper transition. Values over 0.71
+cause the filter to amplify frequencies close to the cutoff frequency, which
+may be surprising or undesirable.
+
+
+Compressor effect
+~~~~~~~~~~~~~~~~~
+
+This effect provides dynamic range compression (it is based on a
+reimplementation of Alain Paul’s Versatile Compressor). Dynamic range
+compression reduces the difference in volume between the softest and loudest
+sounds. It’s useful in a variety of situations, for example it can help make
+quiet sounds more audible over background noise.
+
+The parameters are:
+
+Threshold
+ The level at which the amplification fully stops.
+Ratio
+ The maximum amplification.
+Attack
+ The reaction time to loud sounds to reduce the amplification.
+Release
+ The reaction time to allow the amplification to go back up.
+Input gain
+ The amplification level at the input.
+Output gain
+ The amplification level at the output.
+Convexity
+ The shape of the relationship between distance to the threshold and ratio
+ value. Higher values give a steeper shape.
+Channel link
+ At 100%, all channels of an output device are amplified identically, while
+ at 0% they are fully independent. Intermediate values give intermediate
+ behaviour.
+Feedback
+ Allows some of the output to be fed back to the input.
+Inertia
+ Higher values make the ratio change more slowly.
+Inertia decay
+ Tweaks the impact of the Inertia.
+Ceiling
+ The maximum level allowed just before the output amplification. Causes
+ soft clipping at that level.
+
+By setting **Attack** to 0 ms, **Release** to Infinite, and **Ratio** to
+Infinity:1, the compressor will turn into a brickwall limiter (leave the
+advanced settings to default). If you increase **Input gain** on top of that,
+with a **Threshold** of eg. -3 dB, it will act like a dynamic normalizer.
+
+
+Reverb effect
+~~~~~~~~~~~~~
+
+Not documented yet.
+
+
+Equalizer effect
+~~~~~~~~~~~~~~~~
+
+A five-band parametric equalizer, allowing to amplify or attenuate specific
+frequency bands.
+
+The three middle filters are bandpass/bandreject filters, meaning they amplify
+or attenuate frequencies around the configured centre frequency. The first
+and last filters can also be configured as bandpass/bandreject filter by setting
+the mode to **Peak**. Setting the mode to **Shelf** causes the filter to
+amplify or attenuate all frequencies below (for the first filter) or above (for
+the last filter) the configured cutoff frequency.
+
+The Q factor controls the sharpness of the peak or trough in frequency response
+for bandpass/bandreject filters (the Q factor is not adjustable for **Shelf**
+mode). Higher Q factors give a sharper shape, affecting a narrower range of
+frequencies.
diff --git a/docs/source/usingmame/usingmame.rst b/docs/source/usingmame/usingmame.rst
index 4fa014fe3da..d110e53cbf5 100644
--- a/docs/source/usingmame/usingmame.rst
+++ b/docs/source/usingmame/usingmame.rst
@@ -109,4 +109,4 @@ pre-existing mame.ini by copying changed options into it.
Once you are more confident with MAME options, you may want to adjust the
configuration of your setup a bit more. In this case, keep in mind the order in
-which options are read; see :ref:`advanced-multi-CFG` for details.
+which options are read; see :ref:`advanced-multicfg-order` for details.
diff --git a/docs/source/whatis.rst b/docs/source/whatis.rst
index e6e93382ea3..f3a3bd8244a 100644
--- a/docs/source/whatis.rst
+++ b/docs/source/whatis.rst
@@ -19,7 +19,7 @@ that were its initial focus.
|
| **MAME®**
-| **Copyright © 1997-2024 MAMEdev and contributors**
+| **Copyright © 1997-2026 MAMEdev and contributors**
| **MAME is a registered trademark of Gregory Ember**
|
diff --git a/docs/update.sh b/docs/update.sh
index 8ec416471f7..adf6de5248e 100755
--- a/docs/update.sh
+++ b/docs/update.sh
@@ -7,7 +7,7 @@ REMOTE=$(git rev-parse @{u})
BASE=$(git merge-base @ @{u})
if [ $LOCAL = $REMOTE ]; then
- echo "Up-to-date"
+ /bin/true
elif [ $LOCAL = $BASE ]; then
echo "Need to pull"
git pull
diff --git a/hash/32x.xml b/hash/32x.xml
index 7cda580da51..c4d428a7978 100644
--- a/hash/32x.xml
+++ b/hash/32x.xml
@@ -14,10 +14,13 @@ license:CC0-1.0
<!-- Confirmed dump by ElBarto -->
- <software name="doom">
+ <software name="doom" supported="partial">
<description>Doom (Europe)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Missing [PWM] samples
+]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
<feature name="pcb" value="171-6885A" />
@@ -59,7 +62,7 @@ license:CC0-1.0
</part>
</software>
- <software name="swa" supported="no">
+ <software name="swa">
<description>Star Wars Arcade (Europe)</description>
<year>1994</year>
<publisher>Sega</publisher>
@@ -75,8 +78,7 @@ license:CC0-1.0
</part>
</software>
- <!-- boot OK -->
- <software name="toughman">
+ <software name="toughman" supported="yes">
<description>Toughman Contest (Europe, USA)</description>
<year>1995</year>
<publisher>Electronic Arts</publisher>
@@ -93,11 +95,14 @@ license:CC0-1.0
</part>
</software>
- <!-- Has 3d geometry bugs on attract mode with SH2 DRC, crashes if you attempt to enter into main menu -->
<software name="vrdx" supported="no">
<description>Virtua Racing Deluxe (Europe)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Some 3d geometry bugs when [-drc] is used
+Accesses [cart] backup RAM
+]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
<feature name="pcb" value="171-6885A" />
@@ -169,10 +174,13 @@ license:CC0-1.0
<!-- Old interleaved/unconfirmed dump -->
<!-- PCB info and part numbers are taken from SMS Power and from nepereny's PCB pictures and other sources -->
- <software name="aburner">
+ <software name="aburner" supported="partial">
<description>After Burner Complete (Europe)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+[PWM] samples are too quiet
+]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="2097152">
@@ -370,10 +378,13 @@ license:CC0-1.0
</part>
</software>
- <software name="darxide">
+ <software name="darxide" supported="partial">
<description>Darxide (Europe)</description>
<year>1995</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+[PWM] samples are too quiet
+]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="2097152">
@@ -563,6 +574,9 @@ license:CC0-1.0
<description>Ecco the Dolphin CinePak Demo (Japan, USA, developer cart)</description>
<year>199?</year>
<publisher>&lt;unknown&gt;</publisher>
+ <notes><![CDATA[
+Black screen after Sega logo, tight loops at comms RAM dword read $a15120
+]]></notes>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="3145728">
<rom name="ecco the dolphin cinepak demo (japan, usa) (developer cart).bin" size="3145728" crc="b06178df" sha1="10409f2245b058e8a32cba51e1ea391ca4480108" />
@@ -586,6 +600,9 @@ license:CC0-1.0
<description>36 Great Holes Starring Fred Couples (Europe)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Missing [SRAM] cart interface, may hang
+]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="3145728">
@@ -598,6 +615,9 @@ license:CC0-1.0
<description>36 Great Holes Starring Fred Couples (Japan, USA)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Missing [SRAM] cart interface, may hang
+]]></notes>
<info name="serial" value="GM-5002 (JPN)"/>
<info name="release" value="19950224 (JPN)"/>
<info name="alt_title" value="ゴルフマガジンプレゼンツ 36グレイトホールズ スターリング フレッド コプルス"/>
@@ -1009,10 +1029,13 @@ license:CC0-1.0
</part>
</software>
- <software name="chaotix">
+ <software name="chaotix" supported="partial">
<description>Chaotix (Europe)</description>
<year>1995</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Missing [SRAM] cart interface
+]]></notes>
<info name="alt_title" value="Knuckles' Chaotix (Box)"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
@@ -1022,10 +1045,13 @@ license:CC0-1.0
</part>
</software>
- <software name="chaotixju" cloneof="chaotix">
+ <software name="chaotixju" cloneof="chaotix" supported="partial">
<description>Chaotix (Japan, USA)</description>
<year>1995</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Missing [SRAM] cart interface
+]]></notes>
<info name="serial" value="GM-5003 (JPN)"/>
<info name="release" value="19950421 (JPN)"/>
<info name="alt_title" value="カオティクス フィーチャリング ナックルズ ザ エキドゥナ, Knuckles' Chaotix (USA Box)"/>
@@ -1632,11 +1658,13 @@ license:CC0-1.0
</part>
</software>
- <!-- missing I2C hookup so POST fails with blue/black vertical stripes (same I2C type as plain MD version) -->
<software name="nbajamte" supported="no">
<description>NBA Jam T.E. - Tournament Edition (World)</description>
<year>1995</year>
<publisher>Acclaim Entertainment</publisher>
+ <notes><![CDATA[
+Missing [I2C] hookup so POST fails with blue/black vertical stripes (same I2C type as plain MD version)
+]]></notes>
<info name="serial" value="T-8102A (JPN)"/>
<info name="release" value="19950901 (JPN)"/>
<info name="alt_title" value="NBAジャム トーナメントエディション"/>
@@ -1647,11 +1675,14 @@ license:CC0-1.0
</part>
</software>
- <!-- black screen, missing h irq? -->
<software name="nflqb" supported="no">
<description>NFL Quarterback Club ~ NFL Quarterback '95 (World)</description>
<year>1995</year>
<publisher>Acclaim Entertainment</publisher>
+ <notes><![CDATA[
+Black screen, all CPUs lock up in comms RAM.
+Master SH-2 enables HINT
+]]></notes>
<info name="serial" value="T-8103A (JPN)"/>
<info name="release" value="19950714 (JPN)"/>
<info name="alt_title" value="NFL クォーターバッククラブ'95"/>
@@ -1662,10 +1693,17 @@ license:CC0-1.0
</part>
</software>
- <software name="pitfall">
+ <software name="pitfall" supported="no">
<description>Pitfall - The Mayan Adventure (USA)</description>
<year>1995</year>
<publisher>Activision</publisher>
+ <notes><![CDATA[
+left/right column sprites don't wraparound properly (webs in stage 1, first boss intro roar) (verify)
+Waterfall in stage 2 is static on left side, looks less prominent in YT videos (verify)
+Update: writes to no man's land area with [SH-2] around $0009'0xxx, very likely cache shenanigans
+Randomly crashed once during stage 2
+Reportedly runs at 30 FPS on real HW
+]]></notes>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="3145728">
@@ -1698,11 +1736,14 @@ license:CC0-1.0
</part>
</software>
- <!-- black screen after Sega logo -->
<software name="sangoku4" supported="no">
<description>Sangokushi IV (Japan)</description>
<year>1994</year>
<publisher>Koei</publisher>
+ <notes><![CDATA[
+Black screen after Sega logo, [Master SH-2] corrupts stack
+Accesses [cart] backup RAM
+]]></notes>
<info name="serial" value="T-7601A (JPN)"/>
<info name="release" value="19950728 (JPN)"/>
<info name="alt_title" value="三国志IV"/>
@@ -1824,12 +1865,14 @@ license:CC0-1.0
</part>
</software>
- <!-- boot OK, OSD and player sprite aren't drawn -->
- <software name="soulstar" supported="no">
+ <software name="soulstar" supported="partial">
<!-- The dumper also released larger size files, which were this exact dump padded with 0xff up to the end of the file -->
<description>SoulStar X (USA, prototype)</description>
<year>1995</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+[m68k] writes to cart space at $8a2xxx (Backup RAM? NOP-ed out?)
+]]></notes>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="2097152">
@@ -1891,7 +1934,7 @@ license:CC0-1.0
</part>
</software>
- <software name="swaj" cloneof="swa" supported="no">
+ <software name="swaj" cloneof="swa">
<description>Star Wars Arcade (Japan)</description>
<year>1994</year>
<publisher>Sega</publisher>
@@ -1905,7 +1948,7 @@ license:CC0-1.0
</part>
</software>
- <software name="swau" cloneof="swa" supported="no">
+ <software name="swau" cloneof="swa">
<description>Star Wars Arcade (USA)</description>
<year>1994</year>
<publisher>Sega</publisher>
@@ -2119,6 +2162,7 @@ license:CC0-1.0
</part>
</software>
+ <!-- TODO: crashed once in stage 1 -->
<software name="tmek">
<description>T-Mek (Europe, USA)</description>
<year>1995</year>
@@ -2250,6 +2294,12 @@ license:CC0-1.0
<description>Time Warner 32X CMD Download Cartridge</description>
<year>199?</year>
<publisher>Time Warner Interactive</publisher>
+ <notes><![CDATA[
+Black screen, needs tighter sync after FIFO rewrite (?)
+Uses [DE-9] port 2 button B for something
+[Slave SH-2] tests [SCI] port
+Writes 0x0f1f to $a130e0 in undefined [cart] area
+]]></notes>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="262144">
<rom name="time warner 32x cmd download cartridge.bin" size="262144" crc="6c2176ca" sha1="460439b83ce50021339acf5fca4a63b45c0c1c0b" />
@@ -2389,6 +2439,10 @@ license:CC0-1.0
<description>Virtua Racing Deluxe (Japan)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Some 3d geometry bugs with [-drc]
+Accesses [cart] backup RAM
+]]></notes>
<info name="serial" value="GM-5001 (JPN)"/>
<info name="release" value="19941216 (JPN)"/>
<info name="alt_title" value="バーチャレーシング デラックス"/>
@@ -2404,6 +2458,10 @@ license:CC0-1.0
<description>Virtua Racing Deluxe (USA)</description>
<year>1994</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Some 3d geometry bugs when [-drc] is used
+Accesses [cart] backup RAM
+]]></notes>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="_32x_cart">
<!-- Dump To Be Confirmed (and split in properly sized parts) (nepereny's) -->
@@ -2453,10 +2511,13 @@ license:CC0-1.0
</part>
</software>
- <software name="wsb">
+ <software name="wsb" supported="no">
<description>World Series Baseball Starring Deion Sanders (USA)</description>
<year>1995</year>
<publisher>Sega</publisher>
+ <notes><![CDATA[
+Extensive checks for [cart] SRAM space, boots back to main menu if a new league is created
+]]></notes>
<sharedfeat name="compatibility" value="NTSC-J,NTSC-U,PAL"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="3145728">
@@ -2465,10 +2526,15 @@ license:CC0-1.0
</part>
</software>
- <software name="wwfraw">
+ <!-- TODO: sometimes it corrupts sound? -->
+ <software name="wwfraw" supported="no">
<description>WWF Raw (World)</description>
<year>1994</year>
<publisher>Acclaim Entertainment</publisher>
+ <notes><![CDATA[
+Background doesn't draw with [-nodrc], uses [SH-2] cache for cartridge RAM write
+]]></notes>
+ <info name="usage" value="Supports 4-players thru teamplay option"/>
<info name="serial" value="T-8101A (JPN)"/>
<info name="release" value="19950901 (JPN)"/>
<sharedfeat name="compatibility" value="NTSC-J,NTSC-U,PAL"/>
@@ -2479,11 +2545,13 @@ license:CC0-1.0
</part>
</software>
- <!-- invisible 32x layer -->
- <software name="wwfag" supported="no">
+ <software name="wwfag" supported="partial">
<description>WWF WrestleMania - The Arcade Game (USA)</description>
<year>1995</year>
<publisher>Acclaim Entertainment</publisher>
+ <notes><![CDATA[
+Missing [PWM] samples
+]]></notes>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="4194304">
<rom name="wwf wrestlemania - the arcade game (usa).bin" size="4194304" crc="61833503" sha1="551eedc963cba0e1410b3d229b332ef9ea061469" />
@@ -2491,11 +2559,13 @@ license:CC0-1.0
</part>
</software>
- <!-- black screen after choosing a level, requires SH2 SCI support -->
<software name="xmen" supported="no">
<description>X-Men (USA, prototype)</description>
<year>1995</year>
<publisher>&lt;unknown&gt;</publisher>
+ <notes><![CDATA[
+Black screen after choosing a level, requires SH-2 [SCI] support
+]]></notes>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="4194304">
diff --git a/hash/3do.xml b/hash/3do.xml
new file mode 100644
index 00000000000..d54c5b94668
--- /dev/null
+++ b/hash/3do.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+
+NOTES:
+- 3DO notoriously has no explicit region lock, but we may still opt-in for a sharedfeat later:
+\- Japanese games may require the kanji ROM (not present on USA/Europe systems);
+\- fz1j also has a switch for 240p mode (also available on other models via DIY mods), some SWs
+ aren't coded with it in mind so will either run at double speed or outright crash during
+ gameplay (e.g. Yuu Yuu Hakusho, Ultraman Powered);
+\- A bunch of PAL games will refuse to run on NTSC systems
+ (e.g. The Way of the Warrior, Wolfenstein 3D)
+\- OS will also boot from CD if it's newer than the one present in BIOS. This can cause issues on
+ later models with Anvil chipset, where the BIOS is newer instead (e.g. Road Rash, Bust a Move)
+- As per https://github.com/mamedev/mame/issues/10308#issuecomment-3779261350 several games have
+ multiple indices over a given track. These are intentionally omitted until we have a solution.
+
+-->
+<softwarelist name="3do" description="3DO CD-ROMs">
+
+ <!-- http://redump.org/disc/13798/ -->
+ <software name="cpquazar" supported="no">
+ <description>Captain Quazar (USA)</description>
+ <year>1996</year>
+ <publisher>The 3DO Company</publisher>
+ <info name="barcode" value="7 90561 02379 1"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="captain quazar (usa)" sha1="89614a3d92d839e50d2f49586a500a7e87550870"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- http://redump.org/disc/46905/ -->
+ <software name="cowcasn" supported="no">
+ <description>Cowboy Casino (USA)</description>
+ <year>1994</year>
+ <publisher>IntelliPlay</publisher>
+ <info name="barcode" value="7 69139 84119 8"/>
+ <info name="serial" value="SCC-01-3DO"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="cowboy casino (usa)" sha1="de6bec33f1e71f401be0c166fdb6a8a8129fd6a4"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- http://redump.org/disc/47940/ -->
+ <software name="espnfit" supported="no">
+ <description>ESPN Fitness Pros: Step Aerobics (USA)</description>
+ <year>1994</year>
+ <publisher>IntelliPlay</publisher>
+ <info name="alt_title" value="ESPN Step Aerobics"/>
+ <info name="barcode" value="7 69139 84500 4"/>
+ <info name="serial" value="SEF-01-3DO"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="espn fitness pros - step aerobics (usa)" sha1="2edafbf67c30d57b6729e585b44ea513f4057e31"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- http://redump.org/disc/58378/ -->
+ <software name="vpreika" supported="no">
+ <description>Virtual Puppet Reika (Japan)</description>
+ <year>1994</year>
+ <publisher>Kuki</publisher>
+ <info name="alt_title" value="バーチャル・パペット レイカ"/>
+ <info name="barcode" value="4 984824 047532"/>
+ <info name="jasrac_id" value="V-941396"/>
+ <info name="release" value="19941007"/>
+ <info name="serial" value="FZ-SJ2451"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="virtual puppet reika (japan)" sha1="4ce00a80bcda8fd6db17c92d60f4bff8f8c2f8d5"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- http://redump.org/disc/89371/ -->
+ <software name="virtuoso" supported="no">
+ <description>Virtuoso (USA)</description>
+ <year>1995</year>
+ <publisher>Data East</publisher>
+ <info name="barcode" value="0 13252 01900 3"/>
+ <info name="developer" value="Elite Systems"/>
+ <info name="serial" value="DE1900"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="virtuoso (usa)" sha1="53dae9f7bc34f28aeb27ac4060fdc7c12ca54dd9"/>
+ </diskarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/3do_m2.xml b/hash/3do_m2.xml
index 1061e6d6a5a..41b1d251e5e 100644
--- a/hash/3do_m2.xml
+++ b/hash/3do_m2.xml
@@ -14,10 +14,10 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
<rom name="imsa racing.iso" size="671399936" crc="96e9befa"/>
<rom name="imsa racing.cue" size="77" crc="590c368f"/>
-->
- <description>IMSA Racing (Unreleased)</description>
+ <description>IMSA Racing (unreleased)</description>
<year>199?</year>
<publisher>3DO</publisher>
- <part name="cdrom" interface="3do_m2_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="imsa racing" sha1="533f8ed17f684b2798c9fae5d7e834a7d4d81147" />
</diskarea>
@@ -30,13 +30,13 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
<year>199?</year>
<publisher>GM</publisher>
<info name="ring_code" value="1601-CD-0030"/>
- <part name="cdrom1" interface="3do_m2_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="1 of 2"/>
<diskarea name="cdrom">
<disk name="oldsmobile (disc 1)" status="nodump" />
</diskarea>
</part>
- <part name="cdrom2" interface="3do_m2_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="2 of 2"/>
<diskarea name="cdrom">
<disk name="oldsmobile (disc 2)" sha1="b1f5ad85818ca628c5d7e41d7dd321e69934cf2a" />
@@ -50,7 +50,7 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
<description>Shooter 2D</description>
<year>2008</year>
<publisher>Games That Weren't</publisher>
- <part name="cdrom" interface="3do_m2_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shootr2d" sha1="b53e4186fcb496282584bead5cdaad9fef2293d9" />
</diskarea>
diff --git a/hash/a2600.xml b/hash/a2600.xml
index 2a27809c2d6..76f4e546e1d 100644
--- a/hash/a2600.xml
+++ b/hash/a2600.xml
@@ -259,7 +259,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<description>3-D Genesis (prototype)</description>
<year>1983</year>
<publisher>Amiga</publisher>
- <info name="programmer" value="Jerry Lawson, Dan Mcelroy" />
+ <info name="programmer" value="Jerry Lawson" />
+ <info name="programmer" value="Dan Mcelroy" />
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f8" />
@@ -273,7 +274,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<description>3-D Ghost Attack (prototype)</description>
<year>1983</year>
<publisher>Amiga</publisher>
- <info name="programmer" value="michael k. glass, jerry lawson" />
+ <info name="programmer" value="Michael K. Glass" />
+ <info name="programmer" value="Jerry Lawson" />
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f6" />
@@ -287,7 +289,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<description>3-D Havoc (prototype)</description>
<year>1983</year>
<publisher>Amiga</publisher>
- <info name="programmer" value="Frank Ellis, Jerry Lawson" />
+ <info name="programmer" value="Frank Ellis" />
+ <info name="programmer" value="Jerry Lawson" />
<info name="serial" value="2110"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a2600_cart">
@@ -552,7 +555,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<year>1983</year>
<publisher>Mattel Electronics</publisher>
<info name="serial" value="4317" />
- <info name="programmer" value="Hal Finney, Glenn Hightower" />
+ <info name="programmer" value="Hal Finney" />
+ <info name="programmer" value="Glenn Hightower" />
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<dataarea name="rom" size="4096">
@@ -566,7 +570,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<year>1989</year>
<publisher>Telegames</publisher>
<info name="serial" value="4317 A009" />
- <info name="programmer" value="Hal Finney, Glenn Hightower" />
+ <info name="programmer" value="Hal Finney" />
+ <info name="programmer" value="Glenn Hightower" />
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<dataarea name="rom" size="4096">
@@ -767,7 +772,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<year>1983</year>
<publisher>Atari</publisher>
<info name="serial" value="CX26103" />
- <info name="programmer" value="Michael Callahan &amp; Preston Stuart" />
+ <info name="programmer" value="Michael Callahan " />
+ <info name="programmer" value="Preston Stuart" />
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f8" />
@@ -783,7 +789,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<year>1983</year>
<publisher>Atari</publisher>
<info name="serial" value="CX26103" />
- <info name="programmer" value="Michael Callahan &amp; Preston Stuart" />
+ <info name="programmer" value="Michael Callahan " />
+ <info name="programmer" value="Preston Stuart" />
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f8" />
@@ -799,7 +806,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<year>1983</year>
<publisher>Atari</publisher>
<info name="serial" value="CX26103" />
- <info name="programmer" value="Michael Callahan &amp; Preston Stuart" />
+ <info name="programmer" value="Michael Callahan " />
+ <info name="programmer" value="Preston Stuart" />
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f8" />
@@ -815,7 +823,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<year>1983</year>
<publisher>Atari</publisher>
<info name="serial" value="CX26103" />
- <info name="programmer" value="Michael Callahan &amp; Preston Stuart" />
+ <info name="programmer" value="Michael Callahan " />
+ <info name="programmer" value="Preston Stuart" />
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f8" />
@@ -859,7 +868,8 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<description>AndroMan on the Moon (prototype)</description>
<year>1984</year>
<publisher>Western Technologies</publisher>
- <info name="programmer" value="Michael Case, Lenny Carlson" />
+ <info name="programmer" value="Michael Case" />
+ <info name="programmer" value="Lenny Carlson" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_f8" />
<dataarea name="rom" size="8192">
@@ -5129,26 +5139,48 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
<description>Dig Dug</description>
<year>1983</year>
<publisher>Atari</publisher>
+ <info name="serial" value="CX2677" />
+ <info name="programmer" value="Douglas B. Macrae" />
+ <sharedfeat name="compatibility" value="NTSC" />
+ <part name="cart" interface="a2600_cart">
+ <!-- SuperChip CO20231-01 -->
+ <feature name="slot" value="a26_f6" />
+ <dataarea name="rom" size="16384">
+ <rom name="co25077-22.bin" size="16384" crc="ee7b80d1" sha1="79e746524520da546249149c33614fc23a4f2a51"/>
+ </dataarea>
+ <dataarea name="ram" size="128">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="digduge" cloneof="digdug">
+ <description>Dig Dug (PAL)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
<part name="cart" interface="a2600_cart">
<!-- SuperChip -->
<feature name="slot" value="a26_f6" />
<dataarea name="rom" size="16384">
- <rom name="dig dug (1983) (atari - gcc, douglas b. macrae) (cx2677).bin" size="16384" crc="ee7b80d1" sha1="79e746524520da546249149c33614fc23a4f2a51"/>
+ <rom name="dig dug (1983) (atari - gcc, douglas b. macrae) (cx2677, cx2677p) (pal).bin" size="16384" crc="de5c5553" sha1="816abcef9cc8fca5007cc400534e84d00285f199"/>
</dataarea>
<dataarea name="ram" size="128">
</dataarea>
</part>
</software>
- <software name="digduge" cloneof="digdug">
- <description>Dig Dug (PAL)</description>
+ <software name="digdugea" cloneof="digdug">
+ <description>Dig Dug (PAL, alt)</description>
<year>1983</year>
<publisher>Atari</publisher>
+ <info name="serial" value="2677" />
+ <!-- Actual silver label only has 2677 and end label has DIG DUG TM P" -->
+ <info name="programmer" value="Douglas B. Macrae" />
+ <sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
- <!-- SuperChip -->
- <feature name="slot" value="a26_f6" />
+ <!-- SuperChip CO20231-01 -->
+ <feature name="slot" value="a26_f6" />
<dataarea name="rom" size="16384">
- <rom name="dig dug (1983) (atari - gcc, douglas b. macrae) (cx2677, cx2677p) (pal).bin" size="16384" crc="de5c5553" sha1="816abcef9cc8fca5007cc400534e84d00285f199"/>
+ <rom name="co26077-29(pal).bin" size="16384" crc="8c550791" sha1="8d991206e286aa781433c68a56eea6b2f97bab2d"/>
</dataarea>
<dataarea name="ram" size="128">
</dataarea>
@@ -6164,6 +6196,47 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
</part>
</software>
+ <!-- https://forums.atariage.com/topic/210515-new-2600-homebrews-heartbreak-fix-it-felix-sr-joy-ride/ -->
+ <software name="felixsr">
+ <description>Fix-It Felix Sr.</description>
+ <year>2013</year>
+ <publisher>Cybearg</publisher>
+ <info name="release" value="20130327"/>
+ <sharedfeat name="compatibility" value="NTSC"/>
+ <part name="cart" interface="a2600_cart">
+ <dataarea name="rom" size="4096">
+ <rom name="fix-it felix sr. (ntsc).bin" size="4096" crc="4f066bc9" sha1="296d9c1ef7b214b863516822c7a38009559f3a2a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="felixsre" cloneof="felixsr">
+ <description>Fix-It Felix Sr. (PAL)</description>
+ <year>2013</year>
+ <publisher>Cybearg</publisher>
+ <info name="release" value="20130327"/>
+ <sharedfeat name="compatibility" value="PAL" />
+ <part name="cart" interface="a2600_cart">
+ <dataarea name="rom" size="4096">
+ <rom name="fix-it felix sr. (pal50).bin" size="4096" crc="a0a88a0c" sha1="8942868cead351fffd1914fd52b523bdc774dace"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Is this meant for a console mod? -->
+ <software name="felixsrea" cloneof="felixsr" supported="no">
+ <description>Fix-It Felix Sr. (PAL60)</description>
+ <year>2013</year>
+ <publisher>Cybearg</publisher>
+ <info name="release" value="20130327"/>
+ <sharedfeat name="compatibility" value="PAL" />
+ <part name="cart" interface="a2600_cart">
+ <dataarea name="rom" size="4096">
+ <rom name="fix-it felix sr. (pal60).bin" size="4096" crc="b0677067" sha1="5a258bdfdf1c72c7b74d1a90f7fb8f7a4d3f7cc7"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="festival">
<description>Festival (PAL)</description>
<year>1983</year>
@@ -17720,17 +17793,6 @@ MOS Atari-made game NTSC ROMs had a CO16xxx number and PAL ROMs had CO17xxx numb
</part>
</software>
- <software name="unkact2">
- <description>Unknown Activision Game #2 (prototype)</description>
- <year>1983</year>
- <publisher>Activision</publisher>
- <part name="cart" interface="a2600_cart">
- <dataarea name="rom" size="4096">
- <rom name="unknown activision game #2 (1983) (activision) (prototype).bin" size="4096" crc="5c009ea0" sha1="a25c4b33e1c86895cb63635bd6ca5b8379a206b3"/>
- </dataarea>
- </part>
- </software>
-
<software name="unkuniv">
<description>Unknown Universal Game (prototype)</description>
<year>1983</year>
diff --git a/hash/a2600_cass.xml b/hash/a2600_cass.xml
index 29e812633e8..68d2487759d 100644
--- a/hash/a2600_cass.xml
+++ b/hash/a2600_cass.xml
@@ -342,7 +342,8 @@ meant to be used when there were problems loading the contents from Side A.
<description>Meteoroids (prototype)</description>
<year>1982</year>
<publisher>Arcadia Corporation</publisher>
- <info name="developer" value="Steve Hales &amp; Stephen Harland Landrum"/>
+ <info name="developer" value="Steve Hales" />
+ <info name="developer" value="Stephen Harland Landrum" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cass" interface="a2600_cass">
<dataarea name="cass" size="8448">
@@ -565,7 +566,8 @@ meant to be used when there were problems loading the contents from Side A.
<publisher>Arcadia Corporation</publisher>
<notes>Also contains preview versions of Communist Mutants from Space and Fireball.</notes>
<info name="serial" value="AR-4102"/>
- <info name="developer" value="Steve Hales &amp; Stephen Harland Landrum"/>
+ <info name="developer" value="Steve Hales" />
+ <info name="developer" value="Stephen Harland Landrum" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cassa" interface="a2600_cass">
<dataarea name="cass" size="12398976">
@@ -586,7 +588,8 @@ meant to be used when there were problems loading the contents from Side A.
<publisher>Starpath Corporation</publisher>
<notes>Also contains preview versions of Fireball, Dragonstomper, Communist Mutants from Space, Escape from the Mindmaster.</notes>
<info name="serial" value="AR-4102"/>
- <info name="developer" value="Steve Hales &amp; Stephen Harland Landrum"/>
+ <info name="developer" value="Steve Hales" />
+ <info name="developer" value="Stephen Harland Landrum" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cassa" interface="a2600_cass">
<dataarea name="cass" size="21008842">
@@ -605,7 +608,8 @@ meant to be used when there were problems loading the contents from Side A.
<description>Suicide Mission (prototype)</description>
<year>1982</year>
<publisher>Arcadia Corporation</publisher>
- <info name="developer" value="Steve Hales &amp; Stephen Harland Landrum"/>
+ <info name="developer" value="Steve Hales" />
+ <info name="developer" value="Stephen Harland Landrum" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cass" interface="a2600_cass">
<dataarea name="cass" size="8448">
@@ -619,7 +623,8 @@ meant to be used when there were problems loading the contents from Side A.
<year>1983</year>
<publisher>Starpath Corporation</publisher>
<info name="serial" value="AR-4401"/>
- <info name="developer" value="Steve Mundry &amp; Scott Nelson"/>
+ <info name="developer" value="Steve Mundry" />
+ <info name="developer" value="Scott Nelson" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cass1" interface="a2600_cass">
<dataarea name="cass" size="8448">
@@ -643,7 +648,8 @@ meant to be used when there were problems loading the contents from Side A.
<year>1983</year>
<publisher>Starpath Corporation</publisher>
<info name="serial" value="AR-4401"/>
- <info name="developer" value="Steve Mundry &amp; Scott Nelson"/>
+ <info name="developer" value="Steve Mundry" />
+ <info name="developer" value="Scott Nelson" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cass1" interface="a2600_cass">
<dataarea name="cass" size="8448">
@@ -690,7 +696,8 @@ meant to be used when there were problems loading the contents from Side A.
<year>1983</year>
<publisher>Starpath Corporation</publisher>
<info name="serial" value="AR-4201"/>
- <info name="developer" value="Stephen Harland Landrum &amp; Jon Leupp"/>
+ <info name="developer" value="Stephen Harland Landrum" />
+ <info name="developer" value="Jon Leupp" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cass" interface="a2600_cass">
<dataarea name="cass" size="8448">
@@ -704,7 +711,8 @@ meant to be used when there were problems loading the contents from Side A.
<year>1983</year>
<publisher>Starpath Corporation</publisher>
<info name="serial" value="AR-4201"/>
- <info name="developer" value="Stephen Harland Landrum &amp; Jon Leupp"/>
+ <info name="developer" value="Stephen Harland Landrum" />
+ <info name="developer" value="Jon Leupp" />
<sharedfeat name="requirement" value="scharger"/>
<part name="cass" interface="a2600_cass">
<dataarea name="cass" size="8448">
diff --git a/hash/a7800.xml b/hash/a7800.xml
index e28d3b848dc..3f0cf384cf6 100644
--- a/hash/a7800.xml
+++ b/hash/a7800.xml
@@ -6,6 +6,7 @@ license:CC0-1.0
Atari 7800 Software List
Prototype information obtained from http://www.atariprotos.com
Other list info obtained from http://www.atari7800.org and http://www.atariage.com
+Some hardware and software information obtained from Dan Boris https://atarihq.com/danb/7800cart/a7800cart.shtml
Atari 7800 Known Model Numbers
@@ -182,9 +183,52 @@ Super Pacman (2008)
Wasp (2009)
Notes:
-The Atari 7800, like many early consoles, had cartridges with more than 1 chip on board. This list currently shows the older (all-in-1)
-type of rom dumps. Effort will be made at a later date to split them and document the chips/labels/markings on them.
-
+- Most games contain only one ROM and only a small number contain more than one ROM,
+ generally limited to early 32kB games (2x 16kB), the 48kB games (1x 16kB + 1x 32kB) and
+ a few later releases that use one or two 64kB or 128kB ROMs.
+
+- Many carts have part of the ROM number printed on the cart end label so a lot of them are almost
+ known even without seeing the actual ROM. The game# of NTSC ROMs is often prefixed with C300050 or
+ C300051. Earlier games have C300048 and C300049 prefix.
+ PAL games use the same game#, often prefixed with C300711 or C300712.
+ For general mask ROM identification of actual chips these numbers could be helpful and have been
+ added as a comment next to games where the real ROM marking is unknown.
+ Examples of known label and ROMs....
+ Barnyard Blaster Cart Label = CA400065-059
+ Barnyard Blaster ROM Marking = C300051-059A
+ Mario Bros. Cart Label = CA400065-050
+ Mario Bros. ROM Marking = C300050-050A
+
+- The size of the ROM (in bytes) and number of ROM chips present is defined and restricted by the
+ type of cart PCB used. There were only a few different types of cart PCBs used for Atari 7800 games.
+ Unlike Atari 2600 custom game ROMs which contained bankswitching logic, Atari 7800 carts use normal
+ (JEDEC or non-JEDEC) mask ROMs with the only difference being an active-high OE (vs active-low OE on
+ regular EPROMs) and all bankswitching is done with external logic. Therefore it is relatively easy to
+ guess if a ROM is hacked for emulators, merged to one file or cut/underdumped just by checking the PCB
+ type because the PCB only supports specific size ROMs.
+
+- Some carts have an additional static RAM instead of ROM which is often configured with solder-blob jumpers.
+ These RAMs were previously documented as 16kB for all affected games but that was an incorrect assumption.
+ While those games appear to use no more than 16kB RAM, 28 pin static RAMs can only be 6264 (8kB) or 62256 (32kB).
+ Where a game requires 8kB a 6264 RAM is populated on the cart PCB.
+ Where a game requires 16kB a 62256 RAM is populated on the cart PCB and the highest address line (A14) is ignored.
+
+- A7800 random ROM dumps found on the net containing plain text in the first 128 bytes is a header hacked
+ onto the beginning of the image for use with early emulators. All of these dumps are bad and do not work
+ on real hardware. However they can be manually fixed by deleting the header which is the first 128 bytes.
+ The size of the resulting file will be a correct power-of-2 file size that fits fully into an EPROM.
+ The images in this list are correct and (with the exception of a few) all work in emulation and on real hardware.
+
+- For consistency purposes for official period-correct releases, where ROM numbers are unknown the ROM name is
+ the same as the MAME short name.
+
+- Cart PCB numbers are documented where known. Many PAL carts use a different PCB vs the NTSC cart. In some cases
+ they are assumed to be the same but some have been found to be different. Most PAL carts are completely undocumented
+ and have made up ROM names because the info is not available and they are too expensive to buy just to open it to
+ document a couple of numbers.
+
+ If you have A7800 carts and want to help, please provide information and verification of ROM numbers and cart PCB
+ numbers to improve this documentation.
-->
<softwarelist name="a7800" description="Atari 7800 cartridges">
@@ -195,9 +239,9 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<publisher>Atari</publisher>
<info name="serial" value="C300358"/>
<part name="cart" interface="a7800_cart">
- <feature name="slot" value="a78_pokey" />
- <dataarea name="rom" size="16384">
- <rom name="devcard.bin" size="16384" crc="3fbe74ce" sha1="4df3657f57e3086bee26fb5c6ea946c509d08553"/>
+ <feature name="slot" value="a78_pokey" /> <!-- wrong, cart doesn't contain a POKEY chip -->
+ <dataarea name="rom" size="0x4000">
+ <rom name="devcard.bin" size="0x4000" crc="3fbe74ce" sha1="4df3657f57e3086bee26fb5c6ea946c509d08553"/>
</dataarea>
</part>
</software>
@@ -209,8 +253,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<info name="serial" value="CB101195"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="diagtest.bin" size="32768" crc="a1eaa7c1" sha1="76ec76c423d88bdf739e673c051c5b9c174881c6"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="diagtest.bin" size="0x8000" crc="a1eaa7c1" sha1="76ec76c423d88bdf739e673c051c5b9c174881c6"/>
</dataarea>
</part>
</software>
@@ -222,8 +266,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<publisher>Atari</publisher>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="testcart.bin" size="16384" crc="729dd769" sha1="ea4df28c6bedc09f7013013f257c984aed9b5319" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="testcart.bin" size="0x4000" crc="729dd769" sha1="ea4df28c6bedc09f7013013f257c984aed9b5319" />
</dataarea>
</part>
</software>
@@ -233,11 +277,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / NOVA Game Design. Inc.</publisher>
<info name="serial" value="CX7846"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="aceoface.bin" size="131072" crc="05a2b94c" sha1="efd20bd321a81d67fb6430d9ba93d23fb90d8029"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-046a.u1 -->
+ <rom name="aceofaceu.bin" size="0x20000" crc="05a2b94c" sha1="efd20bd321a81d67fb6430d9ba93d23fb90d8029"/>
</dataarea>
</part>
</software>
@@ -247,11 +292,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / NOVA Game Design. Inc.</publisher>
<info name="serial" value="CX7846"/>
+ <info name="pcb" value="C300595 REV A"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="aceofaeu.bin" size="131072" crc="20c5db80" sha1="c43249ba2d38441461e5ffe07ad2e0b46ab1c6df"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300712-046a_(c)atari_1989_wr269212-20_8927.u1" size="0x20000" crc="20c5db80" sha1="c43249ba2d38441461e5ffe07ad2e0b46ab1c6df"/>
</dataarea>
</part>
</software>
@@ -262,12 +308,13 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7855"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="147456">
- <rom name="alienbrg.bin" size="147456" crc="c8849d36" sha1="a8629fac962cc20b263a60bb2d2386d605713387"/>
+ <dataarea name="rom" size="0x24000"> <!-- Actually two ROMs, 128kB and 16kB. ROM possibly c300051-055a.u1 and c300050-055a.u4 -->
+ <rom name="alienbrgu.bin" size="0x24000" crc="c8849d36" sha1="a8629fac962cc20b263a60bb2d2386d605713387"/>
</dataarea>
</part>
</software>
@@ -278,12 +325,13 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7855"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="147456">
- <rom name="alienbeu.bin" size="147456" crc="6a19f0fe" sha1="990711ae451d901a960af8ad9ae70813f16257b1"/>
+ <dataarea name="rom" size="0x24000"> <!-- Actually two ROMs, 128kB and 16kB -->
+ <rom name="alienbrg.bin" size="0x24000" crc="6a19f0fe" sha1="990711ae451d901a960af8ad9ae70813f16257b1"/>
</dataarea>
</part>
</software>
@@ -309,15 +357,21 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7802"/>
+ <info name="pcb" value="CO24926-001 REV."/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="astroids.bin" size="16384" crc="dfb93f40" sha1="d96ec4e043fcdacab367d8a69d29904b3b2896f1"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="c300048-002a.u1" size="0x4000" crc="dfb93f40" sha1="d96ec4e043fcdacab367d8a69d29904b3b2896f1"/>
</dataarea>
</part>
</software>
+<!-- Asteroids (PAL) is built into the PAL BIOS, run a7800p without a cart and Asteroids runs.
+ The version may not be equivalent to the NTSC version due to limited BIOS ROM space.
+ Was a separate PAL Asteroids cart ever produced?
+-->
+
<software name="astdeluxu" cloneof="astdelux">
<description>Asteroids Deluxe (NTSC)</description>
<year>2007</year>
@@ -326,8 +380,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="asteroids deluxe (ntsc).bin" size="32768" crc="56239d62" sha1="514fb53dcd8c47251fcbe5047bb2d9d13ccf6aef"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="asteroids deluxe (ntsc).bin" size="0x8000" crc="56239d62" sha1="514fb53dcd8c47251fcbe5047bb2d9d13ccf6aef"/>
</dataarea>
</part>
</software>
@@ -340,8 +394,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="asteroids deluxe (pal).bin" size="32768" crc="ab72ea89" sha1="341c7be2823e69e95a61567cb79042c140278c4c"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="asteroids deluxe (pal).bin" size="0x8000" crc="ab72ea89" sha1="341c7be2823e69e95a61567cb79042c140278c4c"/>
</dataarea>
</part>
</software>
@@ -379,11 +433,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Lucasfilm</publisher>
<info name="serial" value="CX7815"/>
+ <info name="pcb" value="C026461 7800 POKEY CART REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_pokey" />
- <dataarea name="rom" size="32768">
- <rom name="ballblzr.bin" size="32768" crc="a4c4808b" sha1="4eb5424360691a38b199d91a0e2c9095d0862dbe"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c300049-015a-01.u1" size="0x8000" crc="a4c4808b" sha1="4eb5424360691a38b199d91a0e2c9095d0862dbe"/>
</dataarea>
</part>
</software>
@@ -393,11 +448,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988?</year>
<publisher>Atari / Lucasfilm</publisher>
<info name="serial" value="CX7815"/>
+ <info name="pcb" value="C026461 7800 POKEY CART REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_pokey" />
- <dataarea name="rom" size="32768">
- <rom name="ballbleu.bin" size="32768" crc="aff85565" sha1="1aa1a508ada1521ae1d373a6860681093e3f851c"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="ballblaz.bin" size="0x8000" crc="aff85565" sha1="1aa1a508ada1521ae1d373a6860681093e3f851c"/>
</dataarea>
</part>
</software>
@@ -412,12 +468,13 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7859"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="131072">
- <rom name="barnyard.bin" size="131072" crc="ed0a587d" sha1="cbcde3d85c8778dea402394568677884cd781de3"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-059a.u1" size="0x20000" crc="ed0a587d" sha1="cbcde3d85c8778dea402394568677884cd781de3"/>
</dataarea>
</part>
</software>
@@ -427,12 +484,14 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7859"/>
+ <info name="pcb" value="C300701-001 REV A"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="131072">
- <rom name="barnyaeu.bin" size="131072" crc="02764a86" sha1="a5797cf7e747bbd755c99fde6936caa15fbba6b1"/>
+ <dataarea name="rom" size="0x20000"> <!-- / on label date changed to . -->
+ <rom name="c300712-059a_(c)_8.1.89_9940.u1" size="0x10000" crc="d320e4ff" sha1="c035ba99abc2eb5154f7f778189bef22cfbf0704" offset="0"/>
+ <rom name="c300712-059a_(c)_8.1.89_3d45.u2" size="0x10000" crc="fc697a4c" sha1="87e5c4e329b61bb262150bbb6b1fe2bbe91369b6" offset="0x10000"/>
</dataarea>
</part>
</software>
@@ -446,8 +505,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="bseblleu.bin" size="32768" crc="68d48fdc" sha1="c44fe244206590abc26fbbd520a5726353899e35"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="baseball.bin" size="0x8000" crc="68d48fdc" sha1="c44fe244206590abc26fbbd520a5726353899e35"/>
</dataarea>
</part>
</software>
@@ -460,8 +519,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_pokey" />
- <dataarea name="rom" size="32768">
- <rom name="bd7800demo.bin" size="32768" crc="7873b949" sha1="a3eaff991cec95040aff53e0c26a862c3dfcc05e"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="bd7800demo.bin" size="0x8000" crc="7873b949" sha1="a3eaff991cec95040aff53e0c26a862c3dfcc05e"/>
</dataarea>
</part>
</software>
@@ -488,8 +547,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="bonq.bin" size="49152" crc="3124b41c" sha1="379ae22a8c8a1c518ba5eb29ad0826dd2daca954"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="bonq.bin" size="0xc000" crc="3124b41c" sha1="379ae22a8c8a1c518ba5eb29ad0826dd2daca954"/>
</dataarea>
</part>
</software>
@@ -499,11 +558,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7880"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="bsktbrwl.bin" size="131072" crc="c8b9d7b5" sha1="39877a4c88498bf6656451e3d1acaf7e8638bdfd"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-080a.u1 -->
+ <rom name="bsktbrwlu.bin" size="0x20000" crc="c8b9d7b5" sha1="39877a4c88498bf6656451e3d1acaf7e8638bdfd"/>
</dataarea>
</part>
</software>
@@ -513,11 +573,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7880"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="bsktbreu.bin" size="131072" crc="a4265d4b" sha1="e7ef6b11bb6836ff7d11a25f8d4e2c9361fa69b3"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="bsktbrwl.bin" size="0x20000" crc="a4265d4b" sha1="e7ef6b11bb6836ff7d11a25f8d4e2c9361fa69b3"/>
</dataarea>
</part>
</software>
@@ -527,11 +588,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7801"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="centpede.bin" size="16384" crc="020efe25" sha1="c8377ad7fb6afec5c88c14a23a68e2ecebba4e5a"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="c300048-001a.u1" size="0x4000" crc="020efe25" sha1="c8377ad7fb6afec5c88c14a23a68e2ecebba4e5a"/>
</dataarea>
</part>
</software>
@@ -541,11 +603,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986?</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7801"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="centpeeu.bin" size="16384" crc="33f8a8f6" sha1="323f9fc4fde9aa6fcbaac8ae300aaa06bafa745a"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="centiped.bin" size="0x4000" crc="33f8a8f6" sha1="323f9fc4fde9aa6fcbaac8ae300aaa06bafa745a"/>
</dataarea>
</part>
</software>
@@ -555,11 +618,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari / Brøderbund</publisher>
<info name="serial" value="CX7821"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="choplift.bin" size="32768" crc="419bff61" sha1="6df15e73494d0a498dd044753a27544214210b14"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c300049-021a-01.u1" size="0x8000" crc="419bff61" sha1="6df15e73494d0a498dd044753a27544214210b14"/>
</dataarea>
</part>
</software>
@@ -569,11 +633,13 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari / Brøderbund</publisher>
<info name="serial" value="CX7821"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="choplieu.bin" size="49152" crc="12efeb07" sha1="f2fe1c82e5b333f4c59f76a28a9d379228596d89"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="choplift.u1" size="0x4000" crc="2bca3128" sha1="43bfff365d2104a98b1358f636e7138900538fea" offset="0"/>
+ <rom name="choplift.u2" size="0x8000" crc="b4b0e0cd" sha1="f260a436687920f4f15d0452777aab1483e12168" offset="0x4000"/>
</dataarea>
</part>
</software>
@@ -583,11 +649,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Atari / Data East</publisher>
<info name="serial" value="CX7838"/>
+ <info name="pcb" value="C301105-001 REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_pokey" />
- <dataarea name="rom" size="131072">
- <rom name="commando.bin" size="131072" crc="cd1a98c5" sha1="f8ae7da650ad38675b81675b77096794a9cd52e8"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-038a.u1" size="0x20000" crc="cd1a98c5" sha1="f8ae7da650ad38675b81675b77096794a9cd52e8"/>
</dataarea>
</part>
</software>
@@ -597,11 +664,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Atari / Data East</publisher>
<info name="serial" value="CX7838"/>
+ <info name="pcb" value="C301105-001 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_pokey" />
- <dataarea name="rom" size="131072">
- <rom name="commaneu.bin" size="131072" crc="7c211612" sha1="2bdad24967fe4f5492ae294b1ccf8f148930a419"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="commando.bin" size="0x20000" crc="7c211612" sha1="2bdad24967fe4f5492ae294b1ccf8f148930a419"/>
</dataarea>
</part>
</software>
@@ -611,11 +679,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7836"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="cracked.bin" size="131072" crc="e645fd1f" sha1="664d267d1245d5698cbf6ff0622ee0d629da3a11"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-036a.u1" size="0x20000" crc="e645fd1f" sha1="664d267d1245d5698cbf6ff0622ee0d629da3a11"/>
</dataarea>
</part>
</software>
@@ -625,11 +694,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7836"/>
+ <info name="pcb" value="C300565-XXX"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="crackeu.bin" size="131072" crc="50fd19cb" sha1="0c1a7806e431efbf0c826a11b92d74eb45e08661"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="cracked.bin" size="0x20000" crc="50fd19cb" sha1="0c1a7806e431efbf0c826a11b92d74eb45e08661"/>
</dataarea>
</part>
</software>
@@ -668,12 +738,14 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Exidy</publisher>
<info name="serial" value="CX7844"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="147456">
- <rom name="crossbow.bin" size="147456" crc="d2ea5686" sha1="d5e47da88e232cd9ea059e133e7c0f13d921a04c"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="c300051-044b.u1" size="0x20000" crc="00c7cd49" sha1="9fcb4672d8c43d7c744afa5f7b0f058b6ded07f7" offset="0"/>
+ <rom name="c300048-044a-01.u4" size="0x4000" crc="03471364" sha1="a129cda5cafbc66d85dd8b46312494a7e6c03d44" offset="0x20000"/>
</dataarea>
</part>
</software>
@@ -684,12 +756,14 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Exidy</publisher>
<info name="serial" value="CX7844"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="147456">
- <rom name="crossbeu.bin" size="147456" crc="e93d8894" sha1="f26d292210a91a714b4b87712ff53b8e49da611e"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="c300709-044a_(c)atari_1989_wr239333-25_8937.u2" size="0x4000" crc="e5534275" sha1="e7df5ac0911f985aed3e0043e11d794d3539893b" offset="0"/>
+ <rom name="c300709-044a_(c)atari_1989_wr269332-20_8939.u1" size="0x20000" crc="04db789c" sha1="8957f4e7f82c78a4f92d9ea7756feeb5114943a9" offset="0x4000"/>
</dataarea>
</part>
</software>
@@ -699,11 +773,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7837"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="darkchmb.bin" size="131072" crc="366777f1" sha1="848077f15114fec31f8290be2583566f4486fe65"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-037b.u1" size="0x20000" crc="366777f1" sha1="848077f15114fec31f8290be2583566f4486fe65"/>
</dataarea>
</part>
</software>
@@ -713,11 +788,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7837"/>
+ <info name="pcb" value="C300565-XXX"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="darkcheu.bin" size="131072" crc="c93a563e" sha1="2b888c95b31109ffd0441f586ba18f21a3a4f22e"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="darkcham.bin" size="0x20000" crc="c93a563e" sha1="2b888c95b31109ffd0441f586ba18f21a3a4f22e"/>
</dataarea>
</part>
</software>
@@ -726,16 +802,18 @@ type of rom dumps. Effort will be made at a later date to split them and docume
3/9/87 - No-Hit - Missing 1 Chip (27128 SUM16=90DA)
3/25/87 - Nearly Complete - (27256 SUM16=345C) (27128 SUM16=9815)
-->
+
<software name="dsrtflcnu" cloneof="dsrtflcn">
<description>Desert Falcon (NTSC)</description>
<year>1987</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7811"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dsrtflcn.bin" size="49152" crc="a1dc0899" sha1="725f893f9a98926c627ef37eacc3f241620c3ffc"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300050-011a.u1" size="0x10000" crc="372ae19b" sha1="aa22b7c1af19b39243e30f05a9d65d20d3aa430f"/>
</dataarea>
</part>
</software>
@@ -745,11 +823,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7811"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dsrtflcp.bin" size="49152" crc="53e277f6" sha1="bbb8aa88879f2ec6039673ccdbbebebc565346bc"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="dsrtflcna.bin" size="0x10000" crc="c5149ef4" sha1="12320d6069c5dd2b7edc171a79a2f159c557c869"/>
</dataarea>
</part>
</software>
@@ -759,11 +838,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7811"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dsrtfleu.bin" size="49152" crc="33991ee8" sha1="185d104614e23699e074e850d5ab8c36a159071c"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="dsrtflcn.bin" size="0x10000" crc="a56ff7ea" sha1="c2fff2cce82310396a749dc2a37feba80c35c82f"/>
</dataarea>
</part>
</software>
@@ -771,16 +851,18 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<!-- Dig Dug - Late Stage WIP Prototype
8-16-84 (2764 "FF LO 8" SUM16=029E) (2764 "FF HI E" SUM16=845F)
-->
+
<software name="digdugu" cloneof="digdug">
<description>Dig Dug (NTSC)</description>
<year>1986</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7803"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="digdugp.bin" size="16384" crc="50cb13f3" sha1="19cee8dc40fabd7022bedc27e4896c09e3cadfdd"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="c300048-003a-01.u1" size="0x4000" crc="50cb13f3" sha1="19cee8dc40fabd7022bedc27e4896c09e3cadfdd"/>
</dataarea>
</part>
</software>
@@ -790,11 +872,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986?</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7803"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="digdugeu.bin" size="32768" crc="efab7077" sha1="ce05d3270b0e0d36d80a4f0731d0173cb5921bce"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="digdug.bin" size="0x8000" crc="efab7077" sha1="ce05d3270b0e0d36d80a4f0731d0173cb5921bce"/>
</dataarea>
</part>
</software>
@@ -804,11 +887,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Nintendo</publisher>
<info name="serial" value="CX7848"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dnkykong.bin" size="49152" crc="065e063f" sha1="820c852caa7957179bf7d6faf2e6922dde5a1a8e"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300050-048a.u1" size="0x10000" crc="72bd4bfd" sha1="1ecec7224368ab454e8d4ef29b1393e446ac87fb"/>
</dataarea>
</part>
</software>
@@ -818,11 +902,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Nintendo</publisher>
<info name="serial" value="CX7848"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dnkykoeu.bin" size="49152" crc="0a43d1c5" sha1="dc69fa8fdf3fcba8557195358b8d206463652e0f"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="dkong.bin" size="0x10000" crc="7ea09c07" sha1="511f5cd8428f47c5dcd51c44fc37d31234e3311e"/>
</dataarea>
</part>
</software>
@@ -832,11 +917,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Nintendo</publisher>
<info name="serial" value="CX7849"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dnkykgjr.bin" size="49152" crc="1c5a1082" sha1="e9392259fff682fcc3476009771a3cfd7d5bdb6d"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300050-049a.u1" size="0x10000" crc="8aacf980" sha1="0a1ac22a699a2a9705cd19953d61b95101bc3007"/>
</dataarea>
</part>
</software>
@@ -846,11 +932,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Nintendo</publisher>
<info name="serial" value="CX7849"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="dnkykjeu.bin" size="49152" crc="c784dbac" sha1="2626a9cd3326b8ce0ee0e834e17a0eedae005669"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="dkongjr.bin" size="0x10000" crc="b367966e" sha1="28891404f825608c92ca69457ce2b6bd370e345e"/>
</dataarea>
</part>
</software>
@@ -860,11 +947,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Activision / Technos</publisher>
<info name="serial" value="AM-050-04"/>
+ <info name="pcb" value="04623-01"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_act" />
<dataarea name="rom" size="0x20000">
- <rom name="dbledrgn.bin" size="0x20000" crc="f20773d5" sha1="df67dad8bbf3813e7b96362c55ed4af40d831277"/>
+ <rom name="double_dragon_@_7800_ver_1.0_cs_b255_(c)_1989_activision.u1" size="0x20000" crc="f20773d5" sha1="df67dad8bbf3813e7b96362c55ed4af40d831277"/>
</dataarea>
</part>
</software>
@@ -874,11 +962,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Activision / Technos</publisher>
<info name="serial" value="AM-050-04"/>
+ <info name="pcb" value="04623-01"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_act" />
<dataarea name="rom" size="0x20000">
- <rom name="dbledreu.bin" size="0x20000" crc="4d634bf5" sha1="da7d495ac858c3b1f66aeb6e981c25bd08d44bd8"/>
+ <rom name="ddragon.bin" size="0x20000" crc="4d634bf5" sha1="da7d495ac858c3b1f66aeb6e981c25bd08d44bd8"/>
</dataarea>
</part>
</software>
@@ -888,6 +977,7 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Absolute Entertainment</publisher>
<info name="serial" value="AP-044-04"/>
+ <info name="pcb" value="03386-02"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_abs" />
@@ -897,16 +987,21 @@ type of rom dumps. Effort will be made at a later date to split them and docume
</part>
</software>
+<!-- Seen: F18 Hornet ROM marking 'DEI-370NR-HRNTDA1 (C) NCR N8932 609-2826002 F836167'
+ Is this different to existing f18 dump or is the f18u ROM name made-up or partial?
+-->
+
<software name="f18">
<description>F-18 Hornet (PAL)</description>
<year>1988</year>
<publisher>Absolute Entertainment</publisher>
<info name="serial" value="AP044-04"/>
+ <info name="pcb" value="03386-02"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_abs" />
- <dataarea name="rom" size="65536">
- <rom name="f18horeu.bin" size="65536" crc="e5d714b0" sha1="673d912b2f9ab7a43f95e0e90bd80249b360fe0d"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="f18.bin" size="0x10000" crc="e5d714b0" sha1="673d912b2f9ab7a43f95e0e90bd80249b360fe0d"/>
</dataarea>
</part>
</software>
@@ -944,11 +1039,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7854"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="fatalrun.bin" size="131072" crc="a44df354" sha1="69aab1e6ef332c6844c693ac41965e4c33ff822a"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-054a.u1 -->
+ <rom name="fatalrunu.bin" size="0x20000" crc="a44df354" sha1="69aab1e6ef332c6844c693ac41965e4c33ff822a"/>
</dataarea>
</part>
</software>
@@ -958,11 +1054,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7854"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="fatalreu.bin" size="131072" crc="2a0a93be" sha1="f23173d2e42bca0767f3d8ecb6bb1c0d23dde996"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="fatalrun.bin" size="0x20000" crc="2a0a93be" sha1="f23173d2e42bca0767f3d8ecb6bb1c0d23dde996"/>
</dataarea>
</part>
</software>
@@ -972,11 +1069,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Accolade</publisher>
<info name="serial" value="CX7851"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="fghtnght.bin" size="131072" crc="720ebc74" sha1="1e8a8704a77b15e70cbc72b0ae9bc25fb91d7c21"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-051a.u1 -->
+ <rom name="fightnu.bin" size="0x20000" crc="720ebc74" sha1="1e8a8704a77b15e70cbc72b0ae9bc25fb91d7c21"/>
</dataarea>
</part>
</software>
@@ -986,25 +1084,30 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1988</year>
<publisher>Atari / Accolade</publisher>
<info name="serial" value="CX7851"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="fghtngeu.bin" size="131072" crc="64d9c4be" sha1="ded89f3a4ac0d95aa158c98302b7939e5b89e4c6"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="fightn.bin" size="0x20000" crc="64d9c4be" sha1="ded89f3a4ac0d95aa158c98302b7939e5b89e4c6"/>
</dataarea>
</part>
</software>
+<!-- Food Fight (NTSC) with mask ROM marking 'C028404-38' on PCB 'CA024927 - REV'. Possibly earlier release or same?
+-->
+
<software name="foodfu" cloneof="foodf">
<description>Food Fight (NTSC)</description>
<year>1986</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7804"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="foodfght.bin" size="32768" crc="e64a5cde" sha1="3f5f42d5aaf6ccd4979658a1387aac5933549357"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c300049-004a-01.u1" size="0x8000" crc="e64a5cde" sha1="3f5f42d5aaf6ccd4979658a1387aac5933549357"/>
</dataarea>
</part>
</software>
@@ -1017,7 +1120,7 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
<dataarea name="rom" size="0x8000">
- <rom name="ff lo 8 8-16-84 029e.u2" size="0x4000" crc="47d02bb1" sha1="48539447a5a247c57faadd7236281844609e8fc0" offset="0x0000"/>
+ <rom name="ff lo 8 8-16-84 029e.u2" size="0x4000" crc="47d02bb1" sha1="48539447a5a247c57faadd7236281844609e8fc0" offset="0"/>
<rom name="ff hi e 8-16-84 845f.u1" size="0x2000" crc="ea1f5502" sha1="fa2fa3c5aa20ebd5f55d8182dadc822bdbba1ac5" offset="0x4000"/>
<rom size="0x2000" offset="0x6000" loadflag="reload"/>
</dataarea>
@@ -1029,11 +1132,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986?</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7804"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="foodfgeu.bin" size="49152" crc="c64549ec" sha1="40b8e5eeb9e9ad7239963ed79dc085092ccbec4c"/>
+ <dataarea name="rom" size="0xc000"> <!-- Actually two ROMs, 32kB and 16kB -->
+ <rom name="foodf.bin" size="0xc000" crc="c64549ec" sha1="40b8e5eeb9e9ad7239963ed79dc085092ccbec4c"/>
</dataarea>
</part>
</software>
@@ -1056,11 +1160,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7805"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="galagap.bin" size="32768" crc="1a0a3eb3" sha1="33178d682564d70955e13d0633359e87b512253b"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c028405-38.u1" size="0x8000" crc="1a0a3eb3" sha1="33178d682564d70955e13d0633359e87b512253b"/>
</dataarea>
</part>
</software>
@@ -1070,11 +1175,13 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986?</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7805"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="galagaeu.bin" size="49152" crc="5990a9f8" sha1="f1ae5df03cf90041380d77c1b49c94611443330b"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="galaga.u1" size="0x4000" crc="3e9cc975" sha1="530ac5e76d4d6054f35649cbd0aad0e440506fc2" offset="0"/>
+ <rom name="galaga.u2" size="0x8000" crc="b9cdad80" sha1="c6edd56ed74928c09e362de4973e43f915968b10" offset="0x4000"/>
</dataarea>
</part>
</software>
@@ -1087,8 +1194,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop1.bin" size="49152" crc="715e1a2f" sha1="e153927b3463148d3fbeef2d28980c281562cc09"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop1.bin" size="0xc000" crc="715e1a2f" sha1="e153927b3463148d3fbeef2d28980c281562cc09"/>
</dataarea>
</part>
</software>
@@ -1101,8 +1208,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop2.bin" size="49152" crc="0f2f66f8" sha1="5784f40216dbc487e80dabd532ae89b2de4bdcc4"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop2.bin" size="0xc000" crc="0f2f66f8" sha1="5784f40216dbc487e80dabd532ae89b2de4bdcc4"/>
</dataarea>
</part>
</software>
@@ -1115,8 +1222,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop3.bin" size="49152" crc="3796705f" sha1="b365d2bf0a5b238eff5f1a4cdc9b7ece2cace38d"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop3.bin" size="0xc000" crc="3796705f" sha1="b365d2bf0a5b238eff5f1a4cdc9b7ece2cace38d"/>
</dataarea>
</part>
</software>
@@ -1129,8 +1236,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop4.bin" size="49152" crc="15de2327" sha1="c5793c362a69c7e82191caffa0a830e67fe21dc5"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop4.bin" size="0xc000" crc="15de2327" sha1="c5793c362a69c7e82191caffa0a830e67fe21dc5"/>
</dataarea>
</part>
</software>
@@ -1143,8 +1250,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop5.bin" size="49152" crc="9fa0fbda" sha1="1c536bb5870f315eecbdea6660beb7de9371f0f8"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop5.bin" size="0xc000" crc="9fa0fbda" sha1="1c536bb5870f315eecbdea6660beb7de9371f0f8"/>
</dataarea>
</part>
</software>
@@ -1157,8 +1264,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop6.bin" size="49152" crc="40b629a1" sha1="f644c5d071c49d75e1487cd06b91da778697ff23"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop6.bin" size="0xc000" crc="40b629a1" sha1="f644c5d071c49d75e1487cd06b91da778697ff23"/>
</dataarea>
</part>
</software>
@@ -1172,8 +1279,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop7.bin" size="49152" crc="b05cf8d2" sha1="78eaa5c8e89129596f2f9a7a4517e51eefbd857f"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop7.bin" size="0xc000" crc="b05cf8d2" sha1="78eaa5c8e89129596f2f9a7a4517e51eefbd857f"/>
</dataarea>
</part>
</software>
@@ -1186,8 +1293,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="gatop8.bin" size="49152" crc="e51eb3bc" sha1="e8d29920fe466ea8bfe292e0f135c0e24a48aaad"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="gatop8.bin" size="0xc000" crc="e51eb3bc" sha1="e8d29920fe466ea8bfe292e0f135c0e24a48aaad"/>
</dataarea>
</part>
</software>
@@ -1200,8 +1307,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="hangly-man.bin" size="16384" crc="8560a801" sha1="f8654387ff648abbe1e6d8f49b8f8b33f803b917"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="hangly-man.bin" size="0x4000" crc="8560a801" sha1="f8654387ff648abbe1e6d8f49b8f8b33f803b917"/>
</dataarea>
</part>
</software>
@@ -1210,16 +1317,18 @@ type of rom dumps. Effort will be made at a later date to split them and docume
5/1/87 (27256 SUM16=19B3) (27128 SUM16=AF4D)
1/20/88 Not Enc. (27256, 27128 - unknown SUM16)
-->
+
<software name="hattricku" cloneof="hattrick">
<description>Hat Trick (NTSC)</description>
<year>1987</year>
<publisher>Atari / Bally Sente</publisher>
<info name="serial" value="CX7829"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="hattrick.bin" size="49152" crc="cf6f4a6c" sha1="14c0cfd01df1c725f399c23810e4854a639fce52"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300050-029a.u1" size="0x10000" crc="5999a36e" sha1="31c8b61d502c48ad0fd40ee18408953b821ab10d"/>
</dataarea>
</part>
</software>
@@ -1229,11 +1338,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari / Bally Sente</publisher>
<info name="serial" value="CX7829"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="hattrieu.bin" size="49152" crc="057d9c3c" sha1="0e9fa678bb4aedc7bb7cf5d38fe27556c4c2bbbd"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="hattrick.bin" size="0x10000" crc="938b753e" sha1="1c67bb2e5e9726be47615ae833677b6dcb8ba2b1"/>
</dataarea>
</part>
</software>
@@ -1243,11 +1353,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1990</year>
<publisher>Atari / SNK</publisher>
<info name="serial" value="CX7862"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="ikariwar.bin" size="131072" crc="8a6c1f15" sha1="e368c6c7ffca5ffac314dec1effea4e2c809519a"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-062a.u1 -->
+ <rom name="ikariu.bin" size="0x20000" crc="8a6c1f15" sha1="e368c6c7ffca5ffac314dec1effea4e2c809519a"/>
</dataarea>
</part>
</software>
@@ -1257,11 +1368,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7862"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="ikariweu.bin" size="131072" crc="cb621cdc" sha1="275cae6c693d9bd1906fdc684460ec596869bbad"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="ikari.bin" size="0x20000" crc="cb621cdc" sha1="275cae6c693d9bd1906fdc684460ec596869bbad"/>
</dataarea>
</part>
</software>
@@ -1271,13 +1383,31 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari / Epyx</publisher>
<info name="serial" value="CX7832"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="impssble.bin" size="131072" crc="3b1f2f47" sha1="5437c0efb63a349953ec047efe6ec24144ed6914"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-032a.u1" size="0x20000" crc="3b1f2f47" sha1="5437c0efb63a349953ec047efe6ec24144ed6914"/>
+ </dataarea>
+ <dataarea name="ram" size="0x2000">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impmissbf" cloneof="impmiss">
+ <description>Impossible Mission (NTSC, bug-fix)</description> <!-- bug patched to make it possible to complete the game -->
+ <year>1987</year>
+ <publisher>Atari / Epyx</publisher>
+ <info name="serial" value="CX7832"/>
+ <info name="pcb" value="C300565-XXX"/>
+ <sharedfeat name="compatibility" value="NTSC"/>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_sg_ram" />
+ <dataarea name="rom" size="0x20000">
+ <rom name="impmissbf.bin" size="0x20000" crc="c4b61d17" sha1="a27c0c376ac10245f53818acb7462dcd2735da2d"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x2000">
</dataarea>
</part>
</software>
@@ -1287,13 +1417,14 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1987</year>
<publisher>Atari / Epyx</publisher>
<info name="serial" value="CX7832"/>
+ <info name="pcb" value="C300565-XXX"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="impssbeu.bin" size="131072" crc="994af6e0" sha1="9770b61472510aba1cf3ea35ceca1859c3493676"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="impmiss.bin" size="0x20000" crc="994af6e0" sha1="9770b61472510aba1cf3ea35ceca1859c3493676"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x2000">
</dataarea>
</part>
</software>
@@ -1303,13 +1434,14 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Atari / Softgold</publisher>
<info name="serial" value="CX7857"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="jinks.bin" size="131072" crc="0818d8cd" sha1="472bc12c437b015a9e317bac092529f3295033b8"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-057a.u1" size="0x20000" crc="0818d8cd" sha1="472bc12c437b015a9e317bac092529f3295033b8"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x2000">
</dataarea>
</part>
</software>
@@ -1319,13 +1451,14 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1989</year>
<publisher>Atari / Softgold</publisher>
<info name="serial" value="CX7857"/>
+ <info name="pcb" value="C300565-XXX"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="jinkseu.bin" size="131072" crc="9207ed3b" sha1="eb16de0c3d5c4e769ae2314ba21c4dd3bca33c88"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="jinks.bin" size="0x20000" crc="9207ed3b" sha1="eb16de0c3d5c4e769ae2314ba21c4dd3bca33c88"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x2000">
</dataarea>
</part>
</software>
@@ -1338,8 +1471,8 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="jr pac-man (ntsc).bin" size="32768" crc="0198aed4" sha1="f6d51d9c0eaf03c47e1e2d3774fd16c3ba3a59e3"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="jr pac-man (ntsc).bin" size="0x8000" crc="0198aed4" sha1="f6d51d9c0eaf03c47e1e2d3774fd16c3ba3a59e3"/>
</dataarea>
</part>
</software>
@@ -1349,11 +1482,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986</year>
<publisher>Atari / Williams</publisher>
<info name="serial" value="CX7806"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="joust.bin" size="32768" crc="2c430bce" sha1="1ccd7c232bcfd5a65d26b9decfe4eceadcbe314c"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c300049-006a.u1" size="0x8000" crc="2c430bce" sha1="1ccd7c232bcfd5a65d26b9decfe4eceadcbe314c"/>
</dataarea>
</part>
</software>
@@ -1363,11 +1497,12 @@ type of rom dumps. Effort will be made at a later date to split them and docume
<year>1986?</year>
<publisher>Atari / Williams</publisher>
<info name="serial" value="CX7806"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="jousteu.bin" size="49152" crc="9b3be616" sha1="aae5b9ee00c39d577858aba9d1fd791194be2c0c"/>
+ <dataarea name="rom" size="0xc000"> <!-- Actually two ROMs, 32kB and 16kB -->
+ <rom name="joust.bin" size="0xc000" crc="9b3be616" sha1="aae5b9ee00c39d577858aba9d1fd791194be2c0c"/>
</dataarea>
</part>
</software>
@@ -1392,16 +1527,19 @@ This prototype also has a minor coding change that makes it unplayable in 7800 e
enable the joystick buttons and then reset another register. This prototype does not perform the reset on the second register making
the buttons not work in emulators.
-->
+
<software name="karatekau" cloneof="karateka">
<description>Karateka (NTSC)</description>
<year>1987</year>
<publisher>Atari / Brøderbund</publisher>
<info name="serial" value="CX7822"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="karateka.bin" size="49152" crc="fec21472" sha1="9fb97bbc7dcc610251cee1695c48b82a087f32d2"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="c300048-022a-01.u1" size="0x4000" crc="8a88d96d" sha1="40ccda4a0f7bc434c8823f3e60e2b9a9d60bb26f" offset="0"/>
+ <rom name="c300049-022a-01.u2" size="0x8000" crc="cee2324e" sha1="89f24abb4efb373d6b7e9ecf567ebf74436a5725" offset="0x4000"/>
</dataarea>
</part>
</software>
@@ -1411,11 +1549,12 @@ the buttons not work in emulators.
<year>1987</year>
<publisher>Atari / Brøderbund</publisher>
<info name="serial" value="CX7822"/>
+ <info name="pcb" value="C300703"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="65536">
- <rom name="karateeu.bin" size="65536" crc="6c8d9e68" sha1="c5f25c88eefe0c7b3571ab3c3ec5185e537eb151"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300711-022a.u5" size="0x10000" crc="6c8d9e68" sha1="c5f25c88eefe0c7b3571ab3c3ec5185e537eb151"/>
</dataarea>
</part>
</software>
@@ -1435,8 +1574,8 @@ Saarna for debugging the problem)
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="klax.bin" size="131072" crc="f26621e3" sha1="0ea6a04b8f9713040ce57b6f23a6589f98409d46"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="klax.bin" size="0x20000" crc="f26621e3" sha1="0ea6a04b8f9713040ce57b6f23a6589f98409d46"/>
</dataarea>
</part>
</software>
@@ -1449,8 +1588,8 @@ Saarna for debugging the problem)
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="kungfums.bin" size="32768" crc="297899bb" sha1="8824bffdf4f30a8191e581752a75259a663092ca"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="kungfumu.bin" size="0x8000" crc="297899bb" sha1="8824bffdf4f30a8191e581752a75259a663092ca"/>
</dataarea>
</part>
</software>
@@ -1463,8 +1602,8 @@ Saarna for debugging the problem)
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="kungfueu.bin" size="32768" crc="c1531fc4" sha1="0f0e24246d9e684b7f900a362fb08878b232580c"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="kungfum.bin" size="0x8000" crc="c1531fc4" sha1="0f0e24246d9e684b7f900a362fb08878b232580c"/>
</dataarea>
</part>
</software>
@@ -1474,11 +1613,12 @@ Saarna for debugging the problem)
<year>1988</year>
<publisher>Atari / Nintendo</publisher>
<info name="serial" value="CX7850"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="mariobro.bin" size="49152" crc="8021a13b" sha1="12e04b67094af622641c536379c69ecad2ee98ed"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300050-050a.u1" size="0x10000" crc="795bd49f" sha1="dce85872a8e8e9d250fd34cb946070c80c3e5eed"/>
</dataarea>
</part>
</software>
@@ -1488,11 +1628,12 @@ Saarna for debugging the problem)
<year>1988</year>
<publisher>Atari / Nintendo</publisher>
<info name="serial" value="CX7850"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="mariobeu.bin" size="49152" crc="efad3d9d" sha1="881beff5103713e655fed80b32e0bbd774e78ee8"/>
+ <dataarea name="rom" size="0xc000"> <!-- either two separate ROMs or one 64kB ROM with 0xFF padding? -->
+ <rom name="mario.bin" size="0xc000" crc="efad3d9d" sha1="881beff5103713e655fed80b32e0bbd774e78ee8"/>
</dataarea>
</part>
</software>
@@ -1502,11 +1643,12 @@ Saarna for debugging the problem)
<year>1989</year>
<publisher>Atari / Technos</publisher>
<info name="serial" value="CX7863"/>
+ <info name="pcb" value="C300595 REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="matmania.bin" size="131072" crc="aba91829" sha1="bb849b603cf1091e4f032936b209ff33fc3b714e"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-063a.u1" size="0x20000" crc="aba91829" sha1="bb849b603cf1091e4f032936b209ff33fc3b714e"/>
</dataarea>
</part>
</software>
@@ -1516,11 +1658,12 @@ Saarna for debugging the problem)
<year>1989</year>
<publisher>Atari / Technos</publisher>
<info name="serial" value="CX7863"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="matmaneu.bin" size="131072" crc="065f3873" sha1="119bb784f1a0638cc6778841131ca1766e94a112"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="matmania.bin" size="0x20000" crc="065f3873" sha1="119bb784f1a0638cc6778841131ca1766e94a112"/>
</dataarea>
</part>
</software>
@@ -1530,11 +1673,12 @@ Saarna for debugging the problem)
<year>1989</year>
<publisher>Atari / Accolade</publisher>
<info name="serial" value="CX7847"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="mean18.bin" size="131072" crc="cf21d9ac" sha1="a3e50c0e56c9675ffb1b6439f40789bc64c606b2"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-047a.u1 -->
+ <rom name="mean18u.bin" size="0x20000" crc="cf21d9ac" sha1="a3e50c0e56c9675ffb1b6439f40789bc64c606b2"/>
</dataarea>
</part>
</software>
@@ -1544,11 +1688,12 @@ Saarna for debugging the problem)
<year>1989</year>
<publisher>Atari / Accolade</publisher>
<info name="serial" value="CX7847"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="mean18eu.bin" size="131072" crc="3cec4be8" sha1="47702ee71c64af4ada09cd41122c779c7d8d94f1"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="mean18.bin" size="0x20000" crc="3cec4be8" sha1="47702ee71c64af4ada09cd41122c779c7d8d94f1"/>
</dataarea>
</part>
</software>
@@ -1558,12 +1703,13 @@ Saarna for debugging the problem)
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7875"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="131072">
- <rom name="meltdown.bin" size="131072" crc="4a8f2171" sha1="e601c45aaa1cc25f01493867664c8b9fefeca70e"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-075a.u1 -->
+ <rom name="meltdownu.bin" size="0x20000" crc="4a8f2171" sha1="e601c45aaa1cc25f01493867664c8b9fefeca70e"/>
</dataarea>
</part>
</software>
@@ -1573,12 +1719,13 @@ Saarna for debugging the problem)
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7875"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="131072">
- <rom name="meltdoeu.bin" size="131072" crc="177fc850" sha1="ac448f369c3c6334415095e4ff344fdd73b473be"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="meltdown.bin" size="0x20000" crc="177fc850" sha1="ac448f369c3c6334415095e4ff344fdd73b473be"/>
</dataarea>
</part>
</software>
@@ -1619,8 +1766,8 @@ Saarna for debugging the problem)
<info name="serial" value="CX7890"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="miaproto.bin" size="147456" crc="ff7a4c60" sha1="26b0b187a43bf9a9397cb5e8b0033e8833f48f88"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="miaproto.bin" size="0x24000" crc="ff7a4c60" sha1="26b0b187a43bf9a9397cb5e8b0033e8833f48f88"/>
</dataarea>
</part>
</software>
@@ -1630,6 +1777,7 @@ Saarna for debugging the problem)
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7879"/>
+ <info name="pcb" value="C300595 REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
@@ -1644,11 +1792,12 @@ Saarna for debugging the problem)
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7879"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="midmuteu.bin" size="131072" crc="7ca6d521" sha1="85f0e0556df65c0732f71ab3f2bbde3615355f72"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="midnight.bin" size="0x20000" crc="7ca6d521" sha1="85f0e0556df65c0732f71ab3f2bbde3615355f72"/>
</dataarea>
</part>
</software>
@@ -1695,11 +1844,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7852"/>
+ <info name="pcb" value="C300595 REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="mtrpsych.bin" size="131072" crc="1e219482" sha1="b9381f4d0413b6c48e27f26ed94c7a9eb1a49624"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-052a.u1" size="0x20000" crc="1e219482" sha1="b9381f4d0413b6c48e27f26ed94c7a9eb1a49624"/>
</dataarea>
</part>
</software>
@@ -1709,11 +1859,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7852"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="mtrpsyeu.bin" size="131072" crc="38bb45ba" sha1="3b72d6b3e28ca9182f1f25dc57115d2ec33aa63e"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="mpsycho.bin" size="0x20000" crc="38bb45ba" sha1="3b72d6b3e28ca9182f1f25dc57115d2ec33aa63e"/>
</dataarea>
</part>
</software>
@@ -1726,8 +1877,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="miss pac-attack.bin" size="16384" crc="b4557dd7" sha1="446660edd243da39602d1b673ff13a84239b66d4"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="miss pac-attack.bin" size="0x4000" crc="b4557dd7" sha1="446660edd243da39602d1b673ff13a84239b66d4"/>
</dataarea>
</part>
</software>
@@ -1737,11 +1888,12 @@ almost nothing like the prototype.
<year>1986</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7807"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="mspacman.bin" size="16384" crc="e42fc700" sha1="ff22e21fc953a288453c40eb6fc5378d42b871f6"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="c300048-007a.u1" size="0x4000" crc="e42fc700" sha1="ff22e21fc953a288453c40eb6fc5378d42b871f6"/>
</dataarea>
</part>
</software>
@@ -1751,11 +1903,12 @@ almost nothing like the prototype.
<year>1986?</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7807"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="mspacmeu.bin" size="32768" crc="8421033a" sha1="a5b0826a130acf8b8dbc59ef980d40b802c22b30"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="mspacman.bin" size="0x8000" crc="8421033a" sha1="a5b0826a130acf8b8dbc59ef980d40b802c22b30"/>
</dataarea>
</part>
</software>
@@ -1765,11 +1918,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7870"/>
+ <info name="pcb" value="C300595 REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="ninjaglf.bin" size="131072" crc="cb48e8dc" sha1="96d0e59e703770eea8d8d9c2c4e5a87ce6f2de76"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-070a.u1" size="0x20000" crc="cb48e8dc" sha1="96d0e59e703770eea8d8d9c2c4e5a87ce6f2de76"/>
</dataarea>
</part>
</software>
@@ -1779,11 +1933,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7870"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="ninjageu.bin" size="131072" crc="2b5382b7" sha1="99ce5711e38ff7ef3311216f954cf0ab70e289cf"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="ninjaglf.bin" size="0x20000" crc="2b5382b7" sha1="99ce5711e38ff7ef3311216f954cf0ab70e289cf"/>
</dataarea>
</part>
</software>
@@ -1793,25 +1948,33 @@ almost nothing like the prototype.
<year>1987</year>
<publisher>Atari / Electronic Arts</publisher>
<info name="serial" value="CX7824"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="oneonone.bin" size="49152" crc="7d9370fb" sha1="5173f892a8d70aeca6c324c138c56208e0db2b98"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="c300049-024a.u1" size="0x4000" crc="c6720761" sha1="46ceb458949759c4d379f543609aa622023e814e" offset="0"/>
+ <rom name="c300048-024a.u2" size="0x8000" crc="278b05eb" sha1="79c2c75951ccf391e6ed4fbdf644e22f92c63864" offset="0x4000"/>
</dataarea>
</part>
</software>
+<!-- One On One (NTSC)
+ PCB Type "C026445-001 7800 48K ROM REV A"
+ C300048-024A.U1 (16kB) and C028424-001.U2 (32kB), both (C)1987 - One On One (NTSC), old ROM name for U2, possibly earlier release or identical?
+-->
+
<software name="1on1">
<description>One On One (PAL)</description>
<year>1987</year>
<publisher>Atari / Electronic Arts</publisher>
<info name="serial" value="CX7824"/>
+ <info name="pcb" value="C300565-XXX"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="oneonoeu.bin" size="49152" crc="7a628295" sha1="01dfc5e4e615cf20ee4f07245285f85684ee445d"/>
+ <dataarea name="rom" size="0xc000"> <!-- likely 64kB ROM with 0xFF padding -->
+ <rom name="1on1.bin" size="0xc000" crc="7a628295" sha1="01dfc5e4e615cf20ee4f07245285f85684ee445d"/>
</dataarea>
</part>
</software>
@@ -1824,8 +1987,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="peterose.bin" size="32768" crc="f33d4dfa" sha1="ffb4fbed8d8f28ea71668542b7ebd019955c5a11"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="baseballu.bin" size="0x8000" crc="f33d4dfa" sha1="ffb4fbed8d8f28ea71668542b7ebd019955c5a11"/>
</dataarea>
</part>
</software>
@@ -1838,8 +2001,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="pacman.bin" size="16384" crc="d5d08d7e" sha1="f427806eae13e3c4ab8afdbe366ab1ec219d0047"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="pacman.bin" size="0x4000" crc="d5d08d7e" sha1="f427806eae13e3c4ab8afdbe366ab1ec219d0047"/>
</dataarea>
</part>
</software>
@@ -1852,8 +2015,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="ultra pac-man.bin" size="32768" crc="4baeac35" sha1="63a98f74ada1ce08ee0137e437395cc17b67a4d9"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="ultra pac-man.bin" size="0x8000" crc="4baeac35" sha1="63a98f74ada1ce08ee0137e437395cc17b67a4d9"/>
</dataarea>
</part>
</software>
@@ -1866,8 +2029,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="pac-man collection (ntsc).bin" size="32768" crc="553ea894" sha1="3b579d8827898a94b16225632a9870d22224b6bc"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="pac-man collection (ntsc).bin" size="0x8000" crc="553ea894" sha1="3b579d8827898a94b16225632a9870d22224b6bc"/>
</dataarea>
</part>
</software>
@@ -1880,8 +2043,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="pac-man collection (pal).bin" size="32768" crc="74517c71" sha1="ed0414e4b7c5ac10b0d7a5e19ee9c8e9ee61442f"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="pac-man collection (pal).bin" size="0x8000" crc="74517c71" sha1="ed0414e4b7c5ac10b0d7a5e19ee9c8e9ee61442f"/>
</dataarea>
</part>
</software>
@@ -1894,8 +2057,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="pac-man plus.bin" size="16384" crc="e2dc056e" sha1="7dd18c8c7e82c813531f80ef2fe981c340f41c20"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="pac-man plus.bin" size="0x4000" crc="e2dc056e" sha1="7dd18c8c7e82c813531f80ef2fe981c340f41c20"/>
</dataarea>
</part>
</software>
@@ -1908,8 +2071,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="pac-pollux.bin" size="16384" crc="1b3dd167" sha1="2f079cd0fb6d92fd5261fe567ae0a6407a722f44"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="pac-pollux.bin" size="0x4000" crc="1b3dd167" sha1="2f079cd0fb6d92fd5261fe567ae0a6407a722f44"/>
</dataarea>
</part>
</software>
@@ -1921,8 +2084,8 @@ almost nothing like the prototype.
<info name="serial" value="CX7891"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="65536">
- <rom name="pitfghtr.bin" size="65536" crc="a5e75537" sha1="378addef67aca55500f0f5f9f0075dcb177406b5"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="pitfight.bin" size="0x10000" crc="a5e75537" sha1="378addef67aca55500f0f5f9f0075dcb177406b5"/>
</dataarea>
</part>
</software>
@@ -1932,11 +2095,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7868"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="planetsm.bin" size="131072" crc="4e3b9e64" sha1="503b975fc1f8edc16110ac2c5b884c4e8b2b6efb"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-068a.u1 -->
+ <rom name="planetsmu.bin" size="0x20000" crc="4e3b9e64" sha1="503b975fc1f8edc16110ac2c5b884c4e8b2b6efb"/>
</dataarea>
</part>
</software>
@@ -1946,11 +2110,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7868"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="planeteu.bin" size="131072" crc="95dc7e96" sha1="f12cbb576607ec38d6111f4346412ccc5bfbcf42"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="planetsm.bin" size="0x20000" crc="95dc7e96" sha1="f12cbb576607ec38d6111f4346412ccc5bfbcf42"/>
</dataarea>
</part>
</software>
@@ -1961,24 +2126,29 @@ almost nothing like the prototype.
<publisher>Tynesoft</publisher>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="plutos.bin" size="131072" crc="2f211f7f" sha1="fa55d6a366b237917f18487fc51817394839a3bc"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="plutos.bin" size="0x20000" crc="2f211f7f" sha1="fa55d6a366b237917f18487fc51817394839a3bc"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x4000">
</dataarea>
</part>
</software>
+ <!-- Pole Position II (NTSC) seen with mask ROM marking 'C028408-01'. Possibly earlier release?
+ PCB Type "C025474-001", ROMs C028108_LO.U1 and C028208_HI.U2 - Pole Position early 32kB ROM version?
+ -->
+
<software name="polepos2u" cloneof="polepos2">
<description>Pole Position II (NTSC)</description>
<year>1986</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7808"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="polepos2.bin" size="32768" crc="a85fb962" sha1="ccfa6f3f83ddbed2a2fb32735fea316a718fbaaa"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c028408-38.u1" size="0x8000" crc="a85fb962" sha1="ccfa6f3f83ddbed2a2fb32735fea316a718fbaaa"/>
</dataarea>
</part>
</software>
@@ -1988,16 +2158,25 @@ almost nothing like the prototype.
<year>1987</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7808"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="pleps2eu.bin" size="32768" crc="d751c7a6" sha1="268e53b5b2117bf853e0aae6adb0b2d3aad8ad5c"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="polepos2.bin" size="0x8000" crc="d751c7a6" sha1="268e53b5b2117bf853e0aae6adb0b2d3aad8ad5c"/>
</dataarea>
</part>
</software>
-<!-- This allegedly is a 7800 BIOS that ended up on a cartridge. As a cartridge it doesn't run on real hardware? -->
+<!-- This allegedly is a 7800 BIOS that ended up on a cartridge. As a cartridge it doesn't run on real hardware?
+ In reality this is more likely to be similar to the early 32kB release using 2x 16kB ROMs documented here...
+ https://www.atari7800.org/museum/7800NTSCsoftwarelist.htm
+ "C028108 LO.U1" checksum 3C77
+ "C028208 HI.U2" checksum 35B4
+ Perhaps dumped incorrectly? Or intended to be the built-in game in the BIOS?
+ When loaded U1+U2 it matches more than 55% of the common Pole Position 2 single 32kB ROM version.
+ It still doesn't run but regardless, this is currently being loaded in the wrong order.
+-->
<software name="polepos2p" cloneof="polepos2" supported="no">
<description>Pole Position II (prototype)</description>
<year>198?</year>
@@ -2005,7 +2184,7 @@ almost nothing like the prototype.
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
<dataarea name="rom" size="0x8000">
- <rom name="ppii lo.u2" size="0x4000" crc="ba6d7560" sha1="ae00f45eefd37d39ac26092b2a2c82d252714582" offset="0x0000"/>
+ <rom name="ppii lo.u2" size="0x4000" crc="ba6d7560" sha1="ae00f45eefd37d39ac26092b2a2c82d252714582" offset="0"/>
<rom name="pole position ii hi.u1" size="0x4000" crc="547b7906" sha1="f7122f917a37d176960e81bdb0d68e8877cfa5e6" offset="0x4000"/>
</dataarea>
</part>
@@ -2020,7 +2199,7 @@ almost nothing like the prototype.
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_act" />
<dataarea name="rom" size="0x20000">
- <rom name="rampage.bin" size="0x20000" crc="d2876ee2" sha1="17401f85fe8b453a6b43b3d0035d993b90568efc"/>
+ <rom name="dei-364nr-rmpgda1_(c)_ncr_a8928_609-2936005.u1" size="0x20000" crc="d2876ee2" sha1="17401f85fe8b453a6b43b3d0035d993b90568efc"/>
</dataarea>
</part>
</software>
@@ -2033,25 +2212,25 @@ almost nothing like the prototype.
<info name="serial" value="CX7892"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="rampart.bin" size="131072" crc="e8c2a662" sha1="53516794cb442208af5d54760324c006510553b3"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="rampart.bin" size="0x20000" crc="e8c2a662" sha1="53516794cb442208af5d54760324c006510553b3"/>
</dataarea>
</part>
</software>
<software name="fractal">
<description>Rescue on Fractalus (NTSC, prototype)</description>
- <!-- 2 x 27128 - U2 (LO), U3 (HI) -->
+ <!-- 2 x 27128 - U2 (LO), U3 (HI), 1x 6116 (2kx8-bit) SRAM -->
<year>1984</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7816"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_mram" />
- <dataarea name="rom" size="32768">
- <rom name="rescuefr.bin" size="32768" crc="9a74fbf2" sha1="6653022f38e553d475896a918850158eaf8f77ff"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="fractal.bin" size="0x8000" crc="9a74fbf2" sha1="6653022f38e553d475896a918850158eaf8f77ff"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x800">
</dataarea>
</part>
</software>
@@ -2089,11 +2268,12 @@ almost nothing like the prototype.
<year>1986</year>
<publisher>Atari / Williams</publisher>
<info name="serial" value="CX7809"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="robotron.bin" size="32768" crc="cb22305d" sha1="ccc9753cdcbd2a2f8cb7966b8227801ba0bfd41d"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c300049-009a-01.u1" size="0x8000" crc="cb22305d" sha1="ccc9753cdcbd2a2f8cb7966b8227801ba0bfd41d"/>
</dataarea>
</part>
</software>
@@ -2103,11 +2283,12 @@ almost nothing like the prototype.
<year>1988</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7834"/>
+ <info name="pcb" value="C100339 REV. 7800 SUPERCART"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="65536">
- <rom name="rsbsebll.bin" size="65536" crc="b1508030" sha1="9a9f60251d049630099f56d2d3efb013828b8a2c"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300514-034a.u1" size="0x10000" crc="b1508030" sha1="9a9f60251d049630099f56d2d3efb013828b8a2c"/>
</dataarea>
</part>
</software>
@@ -2120,8 +2301,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="santa simon.bin" size="49152" crc="30d641ff" sha1="610e08f226c66b15ff699b02c736ce5ce7a8a862"/>
+ <dataarea name="rom" size="0xc000">
+ <rom name="santa simon.bin" size="0xc000" crc="30d641ff" sha1="610e08f226c66b15ff699b02c736ce5ce7a8a862"/>
</dataarea>
</part>
</software>
@@ -2145,11 +2326,12 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7879"/>
+ <info name="pcb" value="C300595 REV A"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="scrpyard.bin" size="131072" crc="5cc8c34f" sha1="f2249321d0cc296b9f9e516bbc5ecc9aab56ca22"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-079a.u1" size="0x20000" crc="5cc8c34f" sha1="f2249321d0cc296b9f9e516bbc5ecc9aab56ca22"/>
</dataarea>
</part>
</software>
@@ -2159,26 +2341,29 @@ almost nothing like the prototype.
<year>1990</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7879"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="scrpyrde.bin" size="131072" crc="46dd9662" sha1="ebfed67cfeebc6a558dbb087e4784e5e5258c2e1"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="scrapdog.bin" size="0x20000" crc="46dd9662" sha1="ebfed67cfeebc6a558dbb087e4784e5e5258c2e1"/>
</dataarea>
</part>
</software>
<software name="sentinelu" cloneof="sentinel" supported="no">
- <description>Sentinel (NTSC, prototype)</description>
+ <description>Sentinel (NTSC)</description>
<year>1991</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7869"/>
+ <info name="pcb" value="C300703"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="131072">
- <rom name="sentinel.bin" size="131072" crc="2fddad78" sha1="bd7de03a28b168c992bcaa96539c2310f3bfe30c"/>
+ <dataarea name="rom" size="0x20000"> <!-- note / in date (on rom stickers) replaced with . and 8 in date may be 0? -->
+ <rom name="sentinel_c300051-069a_7800_ntsc_#1_11.21.8_59f1.u1" size="0x10000" crc="60339c1e" sha1="8e3a2547c389394fd2626c9cbb85927ee6a8d48c" offset="0"/>
+ <rom name="sentinel_c300051-069a_7800_ntsc_#2_11.21.8_0ece.u5" size="0x10000" crc="a6274fa8" sha1="28e3835e9d4cf31c60ce01dbcdd14ee8b16ed2f8" offset="0x10000"/>
</dataarea>
</part>
</software>
@@ -2188,12 +2373,13 @@ almost nothing like the prototype.
<year>1991</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7869"/>
+ <info name="pcb" value="C300703"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
<feature name="peripheral" value="lightgun" />
- <dataarea name="rom" size="131072">
- <rom name="sentineu.bin" size="131072" crc="47340df9" sha1="6d85a73a56d2f02ff439736eace86691aa613444"/>
+ <dataarea name="rom" size="0x20000"> <!-- Actually two 64kB ROMs -->
+ <rom name="sentinel.bin" size="0x20000" crc="47340df9" sha1="6d85a73a56d2f02ff439736eace86691aa613444"/>
</dataarea>
</part>
</software>
@@ -2204,10 +2390,10 @@ almost nothing like the prototype.
<publisher>Tynesoft</publisher>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="sirius.bin" size="131072" crc="65ae616e" sha1="cd9f6dea96f102262065d7472e73121b67f9e244"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="sirius.bin" size="0x20000" crc="65ae616e" sha1="cd9f6dea96f102262065d7472e73121b67f9e244"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x4000">
</dataarea>
</part>
</software>
@@ -2219,8 +2405,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="space duel (ntsc).bin" size="32768" crc="ef2d2560" sha1="199d06cf7f54bb0a1fa328d3cff955f4bcf90450"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="space duel (ntsc).bin" size="0x8000" crc="ef2d2560" sha1="199d06cf7f54bb0a1fa328d3cff955f4bcf90450"/>
</dataarea>
</part>
</software>
@@ -2233,8 +2419,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="space duel (pal).bin" size="32768" crc="0e6a8443" sha1="03d3c7e6255fc6f1b8bbf6dc3ccdbaf51b7eabf7"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="space duel (pal).bin" size="0x8000" crc="0e6a8443" sha1="03d3c7e6255fc6f1b8bbf6dc3ccdbaf51b7eabf7"/>
</dataarea>
</part>
</software>
@@ -2247,8 +2433,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="spaceinvaders (ntsc).bin" size="16384" crc="9c3086eb" sha1="167c06a5d9364f3359bb531d5533f4ff49283d47"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="spaceinvaders (ntsc).bin" size="0x4000" crc="9c3086eb" sha1="167c06a5d9364f3359bb531d5533f4ff49283d47"/>
</dataarea>
</part>
</software>
@@ -2261,8 +2447,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="16384">
- <rom name="spaceinvaders (pal).bin" size="16384" crc="90d7aad3" sha1="0b17368b9f3328f41d29ca4f0d04ab25e1aad55e"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="spaceinvaders (pal).bin" size="0x4000" crc="90d7aad3" sha1="0b17368b9f3328f41d29ca4f0d04ab25e1aad55e"/>
</dataarea>
</part>
</software>
@@ -2275,8 +2461,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="xev78_signed.bin" size="32768" crc="67c8af57" sha1="f76f2a212747e06ac452da8dbeb0ad093b24d793"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="xev78_signed.bin" size="0x8000" crc="67c8af57" sha1="f76f2a212747e06ac452da8dbeb0ad093b24d793"/>
</dataarea>
</part>
</software>
@@ -2289,8 +2475,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="star wars 7800.bin" size="32768" crc="8678f1c0" sha1="9ac24aa0563be93d72bcf83c52a8acdbbfc63729"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="star wars 7800.bin" size="0x8000" crc="8678f1c0" sha1="9ac24aa0563be93d72bcf83c52a8acdbbfc63729"/>
</dataarea>
</part>
</software>
@@ -2300,13 +2486,14 @@ almost nothing like the prototype.
<year>1987</year>
<publisher>Atari / Epyx</publisher>
<info name="serial" value="CX7826"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="smmrgame.bin" size="131072" crc="65c6df3f" sha1="31d46b32a2aa8d5bd6028cff1f41037426b22409"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="sumgames.bin" size="0x20000" crc="65c6df3f" sha1="31d46b32a2aa8d5bd6028cff1f41037426b22409"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x4000">
</dataarea>
</part>
</software>
@@ -2316,11 +2503,12 @@ almost nothing like the prototype.
<year>1989</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7828"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="suprhuey.bin" size="49152" crc="71846500" sha1="29aea9e90c446942001fd08d3c4c929f4ce048d7"/>
+ <dataarea name="rom" size="0xc000"> <!-- Actually two ROMs, 32kB and 16kB. Possibly c300051-028a & c300050-028a -->
+ <rom name="suphueyu.bin" size="0xc000" crc="71846500" sha1="29aea9e90c446942001fd08d3c4c929f4ce048d7"/>
</dataarea>
</part>
</software>
@@ -2330,11 +2518,12 @@ almost nothing like the prototype.
<year>1989</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7828"/>
+ <info name="pcb" value="C026445-001 7800 48K ROM REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="suprhueu.bin" size="49152" crc="6b27ea2c" sha1="469e03ee1e22ef0978c8095a38d662d34a413723"/>
+ <dataarea name="rom" size="0xc000"> <!-- Actually two ROMs, 32kB and 16kB -->
+ <rom name="suprhuey.bin" size="0xc000" crc="6b27ea2c" sha1="469e03ee1e22ef0978c8095a38d662d34a413723"/>
</dataarea>
</part>
</software>
@@ -2375,8 +2564,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="sprskate.bin" size="32768" crc="13b68650" sha1="666d9383c112b66026898e6002b803801e269c51"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="supskateu.bin" size="0x8000" crc="13b68650" sha1="666d9383c112b66026898e6002b803801e269c51"/>
</dataarea>
</part>
</software>
@@ -2389,8 +2578,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="sprskaeu.bin" size="32768" crc="8f167ba9" sha1="fab349584af7b6b3f9b034af3034f43257e2c25f"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="supskate.bin" size="0x8000" crc="8f167ba9" sha1="fab349584af7b6b3f9b034af3034f43257e2c25f"/>
</dataarea>
</part>
</software>
@@ -2403,8 +2592,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="65536">
- <rom name="tankcmnd.bin" size="65536" crc="db91b181" sha1="1d2975d754806416a25a821db6a9fe389bf5d946"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="tank.bin" size="0x10000" crc="db91b181" sha1="1d2975d754806416a25a821db6a9fe389bf5d946"/>
</dataarea>
</part>
</software>
@@ -2417,8 +2606,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="titlemat.bin" size="32768" crc="bc23c57b" sha1="80d11bcbb953ccd8bf3c3e64162711e7edb95090"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="prowresu.bin" size="0x8000" crc="bc23c57b" sha1="80d11bcbb953ccd8bf3c3e64162711e7edb95090"/>
</dataarea>
</part>
</software>
@@ -2431,8 +2620,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="titlemeu.bin" size="32768" crc="16b54d5b" sha1="7ab281c9b69692823b3b6b594856172363c507b5"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="prowres.bin" size="0x8000" crc="16b54d5b" sha1="7ab281c9b69692823b3b6b594856172363c507b5"/>
</dataarea>
</part>
</software>
@@ -2445,8 +2634,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="tomcat.bin" size="32768" crc="513cb9ee" sha1="80c615fb60d0004c1accde25e42759572e030928"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="tomcatu.bin" size="0x8000" crc="513cb9ee" sha1="80c615fb60d0004c1accde25e42759572e030928"/>
</dataarea>
</part>
</software>
@@ -2459,58 +2648,66 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="tomcateu.bin" size="32768" crc="b01205bf" sha1="825381773593365b5ca7eeca968cca00879eee71"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="tomcat.bin" size="0x8000" crc="b01205bf" sha1="825381773593365b5ca7eeca968cca00879eee71"/>
</dataarea>
</part>
</software>
<software name="tdown">
- <description>Touchdown Football</description>
+ <description>Touchdown Football (NTSC)</description>
<year>1988</year>
<publisher>Atari</publisher>
<info name="serial" value="CX7823"/>
+ <info name="pcb" value="C300703"/> <!-- PCB type not verified -->
+ <sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="tchdown.bin" size="131072" crc="aae12695" sha1="364bf0fef8a67f7e66761c76a3a6a0dd186f04aa"/>
+ <dataarea name="rom" size="0x20000"> <!-- Actually two 64kB ROMs. Possibly c300051-023a.u1 and c300050-023a.u5, -->
+ <rom name="tdown.bin" size="0x20000" crc="aae12695" sha1="364bf0fef8a67f7e66761c76a3a6a0dd186f04aa"/>
</dataarea>
</part>
</software>
+<!-- right difficulty set to "B - LEFT POSITION" cycles through levels, not a bug -->
<software name="towertopu" cloneof="towertop">
<description>Tower Toppler (NTSC)</description>
<year>1988</year>
<publisher>Atari / U.S. Gold</publisher>
<info name="serial" value="CX7856"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="65536">
- <rom name="twrtpllr.bin" size="65536" crc="4407ba04" sha1="53976013986e0ad3694ab9c021420b8172465de7"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="c300050-056a.u1" size="0x10000" crc="4407ba04" sha1="53976013986e0ad3694ab9c021420b8172465de7"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x2000">
</dataarea>
</part>
</software>
+<!-- right difficulty set to "B - LEFT POSITION" cycles through levels, not a bug -->
<software name="towertop">
<description>Tower Toppler (PAL)</description>
<year>1988</year>
<publisher>Atari / U.S. Gold</publisher>
<info name="serial" value="CX7856"/>
+ <info name="pcb" value="C300565-XXX"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="65536">
- <rom name="twrtpleu.bin" size="65536" crc="0f87fd7b" sha1="56e1b795e80382edb376e4536d1dee539d4ac548"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="towertop.bin" size="0x10000" crc="0f87fd7b" sha1="56e1b795e80382edb376e4536d1dee539d4ac548"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x2000">
</dataarea>
</part>
</software>
-<!-- An earlier development version, v1.05, with CRC AE1117DD does not run correctly on real hardware. On hardware and in MAME neither the player nor wasp sprites are displayed, though the game logic otherwise seems to run. -->
+<!-- An earlier development version of Wasp, v1.05, with CRC AE1117DD does not run correctly on real hardware. On hardware and in MAME
+ neither the player nor wasp sprites are displayed, though the game logic otherwise seems to run. -->
+
<software name="wasp">
<description>Wasp!</description>
<year>2009</year>
@@ -2532,8 +2729,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="65536">
- <rom name="waterski.bin" size="65536" crc="930b30df" sha1="621c67c2228843405445222743ba3d7c1f04a3c4"/>
+ <dataarea name="rom" size="0x10000">
+ <rom name="waterski.bin" size="0x10000" crc="930b30df" sha1="621c67c2228843405445222743ba3d7c1f04a3c4"/>
</dataarea>
</part>
</software>
@@ -2543,34 +2740,36 @@ almost nothing like the prototype.
<year>1987</year>
<publisher>Atari / Epyx</publisher>
<info name="serial" value="CX7831"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="wingames.bin" size="131072" crc="8981b531" sha1="b3725d6f0834c68ac62ce13eb9eb0d01d1124e5e"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="c300051-031a.u1" size="0x20000" crc="8981b531" sha1="b3725d6f0834c68ac62ce13eb9eb0d01d1124e5e"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x4000">
</dataarea>
</part>
</software>
<!-- This version features a lot *LESS* sounds than the newer version:
- e.g. no sound in bobsled ans ski jump games!
- Dump is confirmed from multiple carts, and it was probably used in
- some erlier production run, until they found out the mistake and
+ e.g. no sound in bobsled and ski jump games!
+ Dump is confirmed from multiple carts. It was probably used in
+ an earlier production run until they found out the mistake and
replaced it with the complete version -->
<software name="wingameso" cloneof="wingames">
<description>Winter Games (NTSC, older?)</description>
<year>1987</year>
<publisher>Atari / Epyx</publisher>
<info name="serial" value="CX7831"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg_ram" />
- <dataarea name="rom" size="131072">
- <rom name="wingameso.bin" size="131072" crc="cf648e88" sha1="361501982f4795c2d79fb6519e5c56452ebc5774"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="wingameso.bin" size="0x20000" crc="cf648e88" sha1="361501982f4795c2d79fb6519e5c56452ebc5774"/>
</dataarea>
- <dataarea name="ram" size="16384">
+ <dataarea name="ram" size="0x4000">
</dataarea>
</part>
</software>
@@ -2593,11 +2792,12 @@ almost nothing like the prototype.
<year>1987</year>
<publisher>Atari / Bally Midway Mfg. Co.</publisher>
<info name="serial" value="CX7858"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="xnophobe.bin" size="131072" crc="5fd9a141" sha1="867adbfd7539ff81e68726ed6f5ff7326409539f"/>
+ <dataarea name="rom" size="0x20000"> <!-- possibly c300051-058a.u1 -->
+ <rom name="xenophobu.bin" size="0x20000" crc="5fd9a141" sha1="867adbfd7539ff81e68726ed6f5ff7326409539f"/>
</dataarea>
</part>
</software>
@@ -2607,11 +2807,12 @@ almost nothing like the prototype.
<year>1987</year>
<publisher>Atari / Bally Midway Mfg. Co.</publisher>
<info name="serial" value="CX7858"/>
+ <info name="pcb" value="C300595 REV A"/> <!-- PCB type not verified -->
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg" />
- <dataarea name="rom" size="131072">
- <rom name="xnophoeu.bin" size="131072" crc="cf0e44f1" sha1="b2cf7d6164d6e5acd47e9f6d7cf60bb0f775b4a3"/>
+ <dataarea name="rom" size="0x20000">
+ <rom name="xenophob.bin" size="0x20000" crc="cf0e44f1" sha1="b2cf7d6164d6e5acd47e9f6d7cf60bb0f775b4a3"/>
</dataarea>
</part>
</software>
@@ -2621,11 +2822,12 @@ almost nothing like the prototype.
<year>1986</year>
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7810"/>
+ <info name="pcb" value="CO24926-001 REV. B"/>
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="32768">
- <rom name="xevious.bin" size="32768" crc="75fc124f" sha1="1d4f0335b152239553534fcbbacdca273802e3bd"/>
+ <dataarea name="rom" size="0x8000">
+ <rom name="c028410a-38.u1" size="0x8000" crc="75fc124f" sha1="1d4f0335b152239553534fcbbacdca273802e3bd"/>
</dataarea>
</part>
</software>
@@ -2638,7 +2840,7 @@ almost nothing like the prototype.
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
<dataarea name="rom" size="0x8000">
- <rom name="xevious 5-10 lo.u2" size="0x4000" crc="b154c59a" sha1="b94959e60e84c97dabc002f39f03c781376c35f7" offset="0x0000"/>
+ <rom name="xevious 5-10 lo.u2" size="0x4000" crc="b154c59a" sha1="b94959e60e84c97dabc002f39f03c781376c35f7" offset="0"/>
<rom name="xevious 5-10 hi.u1" size="0x4000" crc="9d3622b5" sha1="5cc9585f8c3f5dd0106990fde24883756868f437" offset="0x4000"/>
</dataarea>
</part>
@@ -2646,14 +2848,15 @@ almost nothing like the prototype.
<software name="xevious">
<description>Xevious (PAL)</description>
- <year>1986?</year>
+ <year>1989</year> <!-- Year on ROM label is 18th May 1989. In-game copyright still says 1983 and 1984 -->
<publisher>Atari / Namco</publisher>
<info name="serial" value="CX7810"/>
+ <info name="pcb" value="C300565-XXX"/>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_rom" />
- <dataarea name="rom" size="49152">
- <rom name="xevioeu.bin" size="49152" crc="d5ac738b" sha1="81647c8ce432f891328631b57dd3268dd315f8e8"/>
+ <dataarea name="rom" size="0x10000"> <!-- original label date / changed to . -->
+ <rom name="xevious_c300711-010a_7800_pal_5.18.89_db12.u1" size="0x10000" crc="435a9a89" sha1="b03efeb6bf573da212800045697b71aaebeb46fe"/>
</dataarea>
</part>
</software>
@@ -2667,10 +2870,10 @@ almost nothing like the prototype.
<info name="serial" value="CX78HSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_hsc" />
- <dataarea name="rom" size="4096">
- <rom name="highscre.bin" size="4096" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164"/>
+ <dataarea name="rom" size="0x1000">
+ <rom name="highscre.bin" size="0x1000" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164"/>
</dataarea>
- <dataarea name="nvram" size="2048">
+ <dataarea name="nvram" size="0x800">
</dataarea>
</part>
</software>
@@ -2682,10 +2885,10 @@ almost nothing like the prototype.
<publisher>&lt;homebrew&gt;</publisher>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_xboard" />
- <dataarea name="rom" size="1">
+ <dataarea name="rom" size="0x1">
<!-- this entry behaves just as passthrough, even if in fact the chips shall be socketed on the PCB! -->
</dataarea>
- <dataarea name="ram" size="131072">
+ <dataarea name="ram" size="0x20000">
</dataarea>
</part>
</software>
@@ -2697,12 +2900,12 @@ almost nothing like the prototype.
<publisher>&lt;homebrew&gt;</publisher>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_xm" />
- <dataarea name="rom" size="4096">
- <rom name="highscre.bin" size="4096" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164"/>
+ <dataarea name="rom" size="0x1000">
+ <rom name="highscre.bin" size="0x1000" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164"/>
</dataarea>
- <dataarea name="ram" size="131072">
+ <dataarea name="ram" size="0x20000">
</dataarea>
- <dataarea name="nvram" size="2048">
+ <dataarea name="nvram" size="0x800">
</dataarea>
</part>
</software>
@@ -2719,8 +2922,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="dkxm_demo_v12_pal.bin" size="147456" crc="9f6c0600" sha1="18409eace880dda3646792f9ec050a87a3b1b382"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="dkxm_demo_v12_pal.bin" size="0x24000" crc="9f6c0600" sha1="18409eace880dda3646792f9ec050a87a3b1b382"/>
</dataarea>
</part>
</software>
@@ -2733,8 +2936,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="dkxm_demo_v12_ntsc.bin" size="147456" crc="8b06bb4b" sha1="3129cbc91dc8f223f00db5c3273a4a330320be99"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="dkxm_demo_v12_ntsc.bin" size="0x24000" crc="8b06bb4b" sha1="3129cbc91dc8f223f00db5c3273a4a330320be99"/>
</dataarea>
</part>
</software>
@@ -2750,8 +2953,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="dkxm_final_demo_pal_hsc.bin" size="147456" crc="6510b674" sha1="65b723b470d287af51e9888813149c43fb11ac26"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="dkxm_final_demo_pal_hsc.bin" size="0x24000" crc="6510b674" sha1="65b723b470d287af51e9888813149c43fb11ac26"/>
</dataarea>
</part>
</software>
@@ -2764,14 +2967,12 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="dkxm_final_demo_ntsc_hsc.bin" size="147456" crc="2c67fea7" sha1="7825c1946e3c7492fa9bbfae33029cd68c0d1135"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="dkxm_final_demo_ntsc_hsc.bin" size="0x24000" crc="2c67fea7" sha1="7825c1946e3c7492fa9bbfae33029cd68c0d1135"/>
</dataarea>
</part>
</software>
-
-
<!-- an older version? sound is broken, did it work on the real hardware? -->
<software name="dkongxmo" cloneof="dkongxm" supported="no">
<description>Donkey Kong (PAL, demo, XM enhanced, older)</description>
@@ -2781,8 +2982,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="dkxm_final_demo_pal.bin" size="147456" crc="d362712e" sha1="118c462d6698bd23c378785f80062fdd7d65ca00"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="dkxm_final_demo_pal.bin" size="0x24000" crc="d362712e" sha1="118c462d6698bd23c378785f80062fdd7d65ca00"/>
</dataarea>
</part>
</software>
@@ -2795,8 +2996,8 @@ almost nothing like the prototype.
<sharedfeat name="compatibility" value="NTSC"/>
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
- <rom name="dkxm_final_demo_ntsc.bin" size="147456" crc="6e170055" sha1="f4da231312da06ff9e8af5681b5013b14886b455"/>
+ <dataarea name="rom" size="0x24000">
+ <rom name="dkxm_final_demo_ntsc.bin" size="0x24000" crc="6e170055" sha1="f4da231312da06ff9e8af5681b5013b14886b455"/>
</dataarea>
</part>
</software>
@@ -2809,9 +3010,263 @@ almost nothing like the prototype.
<info name="programmer" value="TEP392" />
<part name="cart" interface="a7800_cart">
<feature name="slot" value="a78_sg9" />
- <dataarea name="rom" size="147456">
+ <dataarea name="rom" size="0x24000">
<rom name="dkxm_final_demo.bin" size="0x20000" crc="fd503bd4" sha1="454d754a0c4603323e476d9418f343a6a1a0d017" offset="0x4000" />
- <rom size="0x4000" offset="0x0000" loadflag="continue" />
+ <rom size="0x4000" offset="0" loadflag="continue" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Inufuto Homebrew -->
+
+ <software name="aerial">
+ <description>Aerial</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="aerial.bin" size="0x8000" crc="1e4593db" sha1="af87626303bf076bb8f5250f14ab705b5ec218d3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="antiair">
+ <description>AntiAir</description>
+ <year>2024</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="antiair.bin" size="0x8000" crc="bfce8dee" sha1="db1a4a63f481fa64b520d0d1c74905bad7d187e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ascend">
+ <description>Ascend</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="ascend.bin" size="0x8000" crc="d581ef7b" sha1="7d023f4bccff1eac5a1189742cbd180bc7945a4f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="awass">
+ <description>Awass</description>
+ <year>2026</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="awass.bin" size="0x8000" crc="b89e3605" sha1="4e02c582369b009bc767ad513dae686eb77c8eb4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="battlot">
+ <description>Battlot</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="battlot.bin" size="0x8000" crc="a4199a30" sha1="583ed08ecf5bdf71e563ea4d46fbfce15747a57e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bootskell">
+ <description>Bootskell</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="bootskell.bin" size="0x4000" crc="7b3dfd62" sha1="7f4a7f9a8970f11a44b815476d49b640b7607855" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cacorm">
+ <description>Cacorm</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="cacorm.bin" size="0x4000" crc="7419e768" sha1="98f946ff4f9ef420a2e76697d6cdf27d6a275337" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cavit">
+ <description>Cavit</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="cavit.bin" size="0x8000" crc="885c29af" sha1="0bdccc6a4115177893d3841ce6ad0dcfcf21664a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cracky">
+ <description>Cracky</description>
+ <year>2023</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="cracky.bin" size="0x4000" crc="59677a47" sha1="ccc90d001967904f7df04e1382736e76cd0d5dce" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guntus">
+ <description>Guntus</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="guntus.bin" size="0x8000" crc="45cca116" sha1="4e7b98f00c956928a0443fc513da6699b5d50417" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hopman">
+ <description>Hopman</description>
+ <year>2023</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="hopman.bin" size="0x4000" crc="2a0d1e6b" sha1="48cd71a5f1ecf0ee58e4cdb95cd3ef8504eeccff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impetus">
+ <description>Impetus</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="impetus.bin" size="0x8000" crc="a0a0da0c" sha1="7f879b35e749f8030fe5787d2fde2644fac62ec8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lift">
+ <description>Lift</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="lift.bin" size="0x4000" crc="d34fd674" sha1="57e4b7db1071a2b68cf4afa6bf8751cd540ca8c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mazy">
+ <description>Mazy</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="mazy.bin" size="0x8000" crc="47be8090" sha1="b9843548636a954b2e8d78282082c7699ed56280" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mazy2">
+ <description>Mazy2</description>
+ <year>2025</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="mazy2.bin" size="0x8000" crc="499de304" sha1="8623981e67db9a2d796012303ab2c31c423fbca7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mieyen">
+ <description>Mieyen</description>
+ <year>2025</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="mieyen.bin" size="0x8000" crc="5d3babdc" sha1="c173ff433b4a469eba1730a91b5003fb3b6973af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="neuras">
+ <description>Neuras</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="neuras.a78" size="0x8000" crc="993046ed" sha1="7be4ae126825318fed16442fd2afffd130f05af4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="osotos">
+ <description>Osotos</description>
+ <year>2024</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="osotos.bin" size="0x8000" crc="b223e461" sha1="8ac41eb9a1964b70da1c14b14c451f4577e256d6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ruptus">
+ <description>Ruptus</description>
+ <year>2022</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="ruptus.bin" size="0x8000" crc="056c6d48" sha1="6c5cccbdcb64aff62883542c043b5baa7f233ccc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="svellas">
+ <description>Svellas</description>
+ <year>2025</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="svellas.bin" size="0x8000" crc="716476ed" sha1="d98d0b48e59a43dba1bbeb72fd0f5637e316222f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="yewdow">
+ <description>Yewdow</description>
+ <year>2023</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="a7800_cart">
+ <feature name="slot" value="a78_rom" />
+ <dataarea name="rom" size="0x8000">
+ <rom name="yewdow.bin" size="0x8000" crc="ad176c55" sha1="6a0ce23aa25b624bdea13d7f3dccebcf167ec63d" />
</dataarea>
</part>
</software>
diff --git a/hash/a800.xml b/hash/a800.xml
index 0b942cb6956..203d68aeb18 100644
--- a/hash/a800.xml
+++ b/hash/a800.xml
@@ -3565,7 +3565,7 @@ Hangs on green screen, looping on [PIO porta] read/writes, expects tablet comms
</part>
</software>
- <software name="lprfct80" supported ="no">
+ <software name="lprfct80" supported="no">
<description>Letter Perfect (80 column version)</description>
<year>1981</year>
<publisher>LJK</publisher>
diff --git a/hash/a800_flop.xml b/hash/a800_flop.xml
index 928b2465265..e4caa883247 100644
--- a/hash/a800_flop.xml
+++ b/hash/a800_flop.xml
@@ -7,7 +7,8 @@ license:CC0-1.0
(skeleton list)
note: many 'original' floppy images are in .atx format, whereas cracked / unprotected ones are .atr format
- .atx is unsupported, although apparently has been reverse engineered (insert info link here)
+ .atx is unsupported, although apparently has been reverse engineered
+ (https://www.whizzosoftware.com/sio2arduino/vapi.html)
There are also images in .xex format, which are raw executable files and
needs to be loaded thru a DOS loader or an SD card cartridge, for all purposes they won't fit here.
diff --git a/hash/abc1600_flop.xml b/hash/abc1600_flop.xml
index 4ae03b67f58..98e98d17178 100644
--- a/hash/abc1600_flop.xml
+++ b/hash/abc1600_flop.xml
@@ -6,170 +6,170 @@ license:CC0-1.0
<softwarelist name="abc1600_flop" description="Luxor ABC 1600 diskettes">
<software name="abcenix">
- <description>ABCenix 5.12</description>
- <year>198?</year>
+ <description>ABCenix 5.18</description>
+ <year>1986</year>
<publisher>Luxor</publisher>
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="mount"/>
- <dataarea name="flop" size="598257">
- <rom name="mount.td0" size="598257" crc="7057462d" sha1="20d271dd18c6a5beb60f52bd5fb28759c03d3193"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_mount_XXX.img" size="655360" crc="ae417a82" sha1="e62a770cab8b49b146d98470ea71cab40260bdb4"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="grund1"/>
- <dataarea name="flop" size="620712">
- <rom name="grund1_7.td0" size="620712" crc="d6042354" sha1="7b24d57af344bba232502fe55c15350be9ccf389"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_1(7).img" size="655360" crc="bc23eba9" sha1="ff79ba411526571c1478fab91cf3e9e8b310d683"/>
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="grund2"/>
- <dataarea name="flop" size="623256">
- <rom name="grund2_7.td0" size="623256" crc="952b99ee" sha1="3711180a6dab355ee892a23cb85f44d6f11eb9a2"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_2(7).img" size="655360" crc="d790e468" sha1="afe44322410d413ee7d632a12ec23211ebb84a9e"/>
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
<feature name="part_id" value="grund3"/>
- <dataarea name="flop" size="609084">
- <rom name="grund3_7.td0" size="609084" crc="f942e438" sha1="a6028a8e3abd1f6d38deffa88a83ec796dce31c4"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_3(7).img" size="655360" crc="fc624bec" sha1="7bb81bdd6c95c7037bb4874b73a400efbc27bcf5"/>
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
<feature name="part_id" value="grund4"/>
- <dataarea name="flop" size="641648">
- <rom name="grund4_7.td0" size="641648" crc="38537a0f" sha1="009593963177f27b803707ee7a5436d731939d49"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_4(7).img" size="655360" crc="acb9307b" sha1="419f0ebcff5707d8ab934be24a711cb2b90d5032"/>
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
<feature name="part_id" value="grund5"/>
- <dataarea name="flop" size="630248">
- <rom name="grund5_7.td0" size="630248" crc="e769e8cc" sha1="12d8055fb7a01e134b84d263bfd7e215296f24b4"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_5(7).img" size="655360" crc="f247ee5c" sha1="6300c0b706a02b75bfdeee61124e3af607c29a54"/>
</dataarea>
</part>
<part name="flop7" interface="floppy_5_25">
<feature name="part_id" value="grund6"/>
- <dataarea name="flop" size="639152">
- <rom name="grund6_7.td0" size="639152" crc="020d2d7c" sha1="733b1b8abae20afd7aa95cb2ac19f3e2d0a7ed03"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_6(7).img" size="655360" crc="23dab3a5" sha1="6a371bcf000ade3f92f7b53410bb359fe54043a7"/>
</dataarea>
</part>
<part name="flop8" interface="floppy_5_25">
<feature name="part_id" value="grund7"/>
- <dataarea name="flop" size="580734">
- <rom name="grund7_7.td0" size="580734" crc="a756f817" sha1="fcd2832af1abfebdcd813e6568a959b498b7a3b2"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ABCenix_grund_XXX_7(7).img" size="655360" crc="29cb7b76" sha1="b9c406a60cb4dbfabc59aa0f3e66885a7461d0ca"/>
</dataarea>
</part>
<part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="uppg5_18"/>
+ <dataarea name="flop" size="596556">
+ <rom name="uppg5_18.td0" size="596556" crc="0e6d00e2" sha1="77538ce8260ca52cb328d08901443fa2ba7ee778"/>
+ </dataarea>
+ </part>
+
+ <part name="flop10" interface="floppy_5_25">
<feature name="part_id" value="man1"/>
<dataarea name="flop" size="549680">
<rom name="man1_5.td0" size="549680" crc="92ffa304" sha1="538dd1bf3f7a39e5d48bd6887e887d387d362835"/>
</dataarea>
</part>
- <part name="flop10" interface="floppy_5_25">
+ <part name="flop11" interface="floppy_5_25">
<feature name="part_id" value="man2"/>
<dataarea name="flop" size="479260">
<rom name="man2_5.td0" size="479260" crc="f2b62529" sha1="c9b75ff27571e07c7f09ceb92f27d9213f54bd1e"/>
</dataarea>
</part>
- <part name="flop11" interface="floppy_5_25">
+ <part name="flop12" interface="floppy_5_25">
<feature name="part_id" value="man3"/>
<dataarea name="flop" size="605552">
<rom name="man3_5.td0" size="605552" crc="5ae669f0" sha1="efc10b69e190d3d088655c94b951399c3b322099"/>
</dataarea>
</part>
- <part name="flop12" interface="floppy_5_25">
+ <part name="flop13" interface="floppy_5_25">
<feature name="part_id" value="man4"/>
<dataarea name="flop" size="588256">
<rom name="man4_5.td0" size="588256" crc="f6a9bb84" sha1="5554c9fbfbec73bd4e7934f5b8b405e872d9783c"/>
</dataarea>
</part>
- <part name="flop13" interface="floppy_5_25">
+ <part name="flop14" interface="floppy_5_25">
<feature name="part_id" value="man5"/>
<dataarea name="flop" size="90914">
<rom name="man5_5.td0" size="90914" crc="b861fbe0" sha1="22a0306b3421106cdf5ed3ecdf250fb8b81e6f94"/>
</dataarea>
</part>
- <part name="flop14" interface="floppy_5_25">
+ <part name="flop15" interface="floppy_5_25">
<feature name="part_id" value="utv1"/>
<dataarea name="flop" size="590991">
<rom name="utv1_9.td0" size="590991" crc="ff5f7d19" sha1="2683912f9d746ebda72d493b5bec8703280c7f0d"/>
</dataarea>
</part>
- <part name="flop15" interface="floppy_5_25">
+ <part name="flop16" interface="floppy_5_25">
<feature name="part_id" value="utv2"/>
<dataarea name="flop" size="624001">
<rom name="utv2_9.td0" size="624001" crc="2bf7950f" sha1="73872a837143492b000113db7c15b159c5798190"/>
</dataarea>
</part>
- <part name="flop16" interface="floppy_5_25">
+ <part name="flop17" interface="floppy_5_25">
<feature name="part_id" value="utv3"/>
<dataarea name="flop" size="624576">
<rom name="utv3_9.td0" size="624576" crc="eaba675e" sha1="ab0b5f606289b40fe9ff1af0d2e8acdcc0afb1f3"/>
</dataarea>
</part>
- <part name="flop17" interface="floppy_5_25">
+ <part name="flop18" interface="floppy_5_25">
<feature name="part_id" value="utv4"/>
<dataarea name="flop" size="569901">
<rom name="utv4_9.td0" size="569901" crc="d5fd2c6c" sha1="1713b57efe0c72cd181ae70498a8d0ec8ab9d5ed"/>
</dataarea>
</part>
- <part name="flop18" interface="floppy_5_25">
+ <part name="flop19" interface="floppy_5_25">
<feature name="part_id" value="utv5"/>
<dataarea name="flop" size="599249">
<rom name="utv5_9.td0" size="599249" crc="bb964b7a" sha1="cd88904ff7ccda7e338dd52ee5e663a38e29385d"/>
</dataarea>
</part>
- <part name="flop19" interface="floppy_5_25">
+ <part name="flop20" interface="floppy_5_25">
<feature name="part_id" value="utv6"/>
<dataarea name="flop" size="594658">
<rom name="utv6_9.td0" size="594658" crc="c9a97dd0" sha1="d737c33e04bb74e8c79cab6c73c60b51c7a8e31b"/>
</dataarea>
</part>
- <part name="flop20" interface="floppy_5_25">
+ <part name="flop21" interface="floppy_5_25">
<feature name="part_id" value="utv7"/>
<dataarea name="flop" size="577404">
<rom name="utv7_9.td0" size="577404" crc="04e6b1f8" sha1="35f5beaf3d753abce79ce398d931bdfb37bec9df"/>
</dataarea>
</part>
- <part name="flop21" interface="floppy_5_25">
+ <part name="flop22" interface="floppy_5_25">
<feature name="part_id" value="utv8"/>
<dataarea name="flop" size="584170">
<rom name="utv8_9.td0" size="584170" crc="cb82267e" sha1="caf704ee999bb2169239b360aa16abac4016dbbb"/>
</dataarea>
</part>
- <part name="flop22" interface="floppy_5_25">
+ <part name="flop23" interface="floppy_5_25">
<feature name="part_id" value="utv9"/>
<dataarea name="flop" size="382960">
<rom name="utv9_9.td0" size="382960" crc="1a5448a1" sha1="515f72dc556b1460f0e44ac12f7d8951eb86c94b"/>
</dataarea>
</part>
-
- <part name="flop23" interface="floppy_5_25">
- <feature name="part_id" value="uppg5_18"/>
- <dataarea name="flop" size="596556">
- <rom name="uppg5_18.td0" size="596556" crc="0e6d00e2" sha1="77538ce8260ca52cb328d08901443fa2ba7ee778"/>
- </dataarea>
- </part>
</software>
<software name="systest">
diff --git a/hash/abc1600_hdd.xml b/hash/abc1600_hdd.xml
index 4396716b781..37de56e40ea 100644
--- a/hash/abc1600_hdd.xml
+++ b/hash/abc1600_hdd.xml
@@ -1,32 +1,21 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
-license:CC0
+license:CC0-1.0
-->
<softwarelist name="abc1600_hdd" description="Luxor ABC 1600 hard disks">
- <software name="micr1325a">
- <description>Formatted Micropolis 1325A 69MB</description>
- <year>198?</year>
- <publisher>unknown</publisher>
+
+ <software name="abcenix">
+ <description>ABCenix 5.18</description>
+ <year>1986</year>
+ <publisher>Luxor</publisher>
<!-- Micropolis 1325A 69MB -->
<part name="hdd" interface="scsi_hdd">
<diskarea name="harddriv">
- <disk name="micr1325a" sha1="683180e8ac8f3b097e9f5c1a6950544e6e65a4d1" writeable="yes" />
+ <disk name="abcenix518" sha1="17215ac3c63b8f46664c437a9e92189e69f3a2bb" writeable="yes" />
</diskarea>
</part>
</software>
- <software name="necd5126a">
- <description>Formatted NEC D5216A 20MB</description>
- <year>198?</year>
- <publisher>unknown</publisher>
-
- <!-- NEC D5126A 20MB -->
- <part name="hdd" interface="scsi_hdd">
- <diskarea name="harddriv">
- <disk name="necd5126a" sha1="541ffe714517afc29ded60778066b7be5538e08f" writeable="yes" />
- </diskarea>
- </part>
- </software>
</softwarelist>
diff --git a/hash/abc832_flop.xml b/hash/abc832_flop.xml
index cc39b1704a1..44f8181bb39 100644
--- a/hash/abc832_flop.xml
+++ b/hash/abc832_flop.xml
@@ -406,4 +406,60 @@ license:CC0-1.0
</part>
</software>
+ <software name="teletex800" supported="no">
+ <description>Teletex 800</description>
+ <year>1986</year>
+ <publisher>Luxor</publisher>
+ <sharedfeat name="requirement" value="pr:teletex800"/>
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="TELETEXT 800 V1.33" />
+ <dataarea name="flop" size="655360">
+ <rom name="TELETEXT_800_v1.33_832.img" size="655360" crc="128279b3" sha1="167c1b8ad63c182019af4a023a1dedebd22e1baa"/>
+ </dataarea>
+ </part>
+
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Televerket Teletext 85 Flexskiva 9604" />
+ <dataarea name="flop" size="655360">
+ <rom name="Televerket Teletext 85 Flexskiva 9604.img" size="655360" crc="c448fae2" sha1="f51af696b8f80c1d3fda8af5a799b9d95ca3cf23"/>
+ </dataarea>
+ </part>
+
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="SYSTEMSKIVA ABC 80 (DP)" />
+ <dataarea name="flop" size="3212288">
+ <rom name="SYSTEMSKIVA_ABC_80_(DP).hfe" size="3212288" crc="230993be" sha1="4c0f689a0c2fdb636be99de0a9b18afe05407b81"/>
+ </dataarea>
+ </part>
+
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="860305 P00088-3 800-830" />
+ <dataarea name="flop" size="3137024">
+ <rom name="860305_P00088-3_800-830.hfe" size="3137024" crc="18f18757" sha1="e2545f7c025ee1b1c10f507e77e821d793b3dee1"/>
+ </dataarea>
+ </part>
+
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="ORD-reda Programskiva 860331" />
+ <dataarea name="flop" size="3162112">
+ <rom name="ORD-reda Programskiva.hfe" size="3162112" crc="de112362" sha1="b3369d95d58078f6ca57ac590b27985bb12e0cb6"/>
+ </dataarea>
+ </part>
+
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="ORD-reda Textskiva 8 (Demo) 860331" />
+ <dataarea name="flop" size="3212288">
+ <rom name="ORD-reda Textskiva 8 (Demo).hfe" size="3212288" crc="b10bbdb6" sha1="575b5153b050c2100f6ecceea9184d56a9f5934e"/>
+ </dataarea>
+ </part>
+
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="ORD-reda PRINTER/FLEX data 860331" />
+ <dataarea name="flop" size="3187200">
+ <rom name="ORD-reda PRINTER-FLEX data.hfe" size="3187200" crc="98fcd553" sha1="e608b6c9f630da552be2f3d07f27d534613de6af"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/adam_cass.xml b/hash/adam_cass.xml
index e5f1552233c..c872fe47d9a 100644
--- a/hash/adam_cass.xml
+++ b/hash/adam_cass.xml
@@ -984,7 +984,7 @@ license:CC0-1.0
</software>
<software name="macadama" cloneof="macadam">
- <description>MacADAM (Fra, Alt)</description>
+ <description>MacADAM (France, alt)</description>
<year>1984</year>
<publisher>CBS Loisors - Coleco of France</publisher>
diff --git a/hash/aim65_cart.xml b/hash/aim65_cart.xml
index 2f5655890a4..f5051c82ec7 100644
--- a/hash/aim65_cart.xml
+++ b/hash/aim65_cart.xml
@@ -45,7 +45,7 @@ license:CC0-1.0
</software>
<!-- Found on a Comelta DRAC-1 machine. -->
- <software name="basic11a">
+ <software name="basic11a" cloneof="basic11">
<description>AIM 65 BASIC v1.1 (alt)</description>
<year>1978</year>
<publisher>Rockwell/Microsoft</publisher>
diff --git a/hash/alice90.xml b/hash/alice90.xml
index c830c44aefe..f90bf918eed 100644
--- a/hash/alice90.xml
+++ b/hash/alice90.xml
@@ -47,6 +47,8 @@ Thanks to DCALICE (http://alice32.free.fr) for info!
<description>Galixian</description>
<year>1984</year>
<publisher>Sprites</publisher>
+ <info name="author" value="François Chaumartin" />
+ <info name="serial" value="AE 001" />
<part name="cass" interface="mc10_cass">
<dataarea name="cass" size="20961">
diff --git a/hash/amiga_a1000.xml b/hash/amiga_a1000.xml
deleted file mode 100644
index 1cf25c628d6..00000000000
--- a/hash/amiga_a1000.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
-<!--
-license:CC0-1.0
-
-This list contains the system software specific to the Amiga 1000
--->
-
-<softwarelist name="amiga_a1000" description="Commodore Amiga 1000 System disks">
-
- <!-- Version 1.0 -->
-
- <software name="wbenc10">
- <description>Workbench 1.0</description>
- <year>1985</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Kickstart 1.0" />
- <dataarea name="flop" size="901120">
- <rom name="327244-01_kickstart.adf" size="901120" crc="fc1c4ce8" sha1="e2f7fd40b5f626f1719628e720bc4440cca7c961"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.0" />
- <dataarea name="flop" size="901120">
- <rom name="327245-01_workbench.adf" size="901120" crc="9578c4db" sha1="8d853d46a9817161ba0a4f493ae6856d36e8d685"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Extras 1.0" />
- <dataarea name="flop" size="901120">
- <rom name="327246-01_extras.adf" size="901120" crc="6cf114a5" sha1="895f0157c8ec8b9233ec1550e1531a28e11277b4"/>
- </dataarea>
- </part>
- </software>
-
- <software name="wbenc10n" cloneof="wbenc10">
- <!-- Same disks, different part numbers? -->
- <description>Workbench 1.0 (US)</description>
- <year>1985</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Extras 1.0" />
- <dataarea name="flop" size="901120">
- <rom name="317451-01_extras.adf" size="901120" crc="6cf114a5" sha1="895f0157c8ec8b9233ec1550e1531a28e11277b4"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.0" />
- <dataarea name="flop" size="901120">
- <rom name="317481-01_workbench.adf" size="901120" crc="9578c4db" sha1="8d853d46a9817161ba0a4f493ae6856d36e8d685"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Kickstart 1.0" />
- <dataarea name="flop" size="901120">
- <rom name="317483-01_kickstart.adf" size="901120" crc="fc1c4ce8" sha1="e2f7fd40b5f626f1719628e720bc4440cca7c961"/>
- </dataarea>
- </part>
- </software>
-
- <!-- Version 1.1 -->
-
- <software name="wbenc11">
- <description>Workbench 1.1</description>
- <year>1986</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Extras 1.1" />
- <dataarea name="flop" size="901120">
- <rom name="316167-01_extras.adf" size="901120" crc="9c9fb14c" sha1="45a2506556ce3b13404194b26d04f451984c689a"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
- <feature name="part_id" value="Kickstart 1.1" />
- <dataarea name="flop" size="901120">
- <rom name="327244-02_kickstart_pal.adf" size="901120" crc="70d0030a" sha1="0d79e2444421e5b66b5f295a5d3685d286208128"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.1" />
- <dataarea name="flop" size="901120">
- <rom name="327245-02_workbench.adf" size="901120" crc="0be0603c" status="nodump"/>
- </dataarea>
- </part>
- <!-- Kaleidoscope (316160-01, 317489-01)? -->
- </software>
-
- <software name="wbenc11n" cloneof="wbenc11">
- <description>Workbench 1.1 (US)</description>
- <year>1985</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Extras 1.1" />
- <dataarea name="flop" size="901120">
- <rom name="316167-01_extras.adf" size="901120" crc="9c9fb14c" sha1="45a2506556ce3b13404194b26d04f451984c689a"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.1" />
- <dataarea name="flop" size="901120">
- <rom name="317481-02_workbench.adf" size="901120" status="nodump"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Kickstart 1.1" />
- <dataarea name="flop" size="901120">
- <rom name="317483-02_kickstart_ntsc.adf" size="901120" crc="73789bf8" sha1="68b667395be3a50be86fb6ad78155e1741255822"/>
- </dataarea>
- </part>
- <!-- Kaleidoscope (316160-01, 317489-01)? -->
- </software>
-
- <!-- Version 1.2 -->
-
- <software name="wbenc12">
- <description>Workbench 1.2</description>
- <year>1986</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2" />
- <dataarea name="flop" size="901120">
- <rom name="317481-03_workbench.adf" size="901120" status="nodump"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Alternate P/N: 380663-01 (Europe?) -->
- <feature name="part_id" value="Kickstart 1.2" />
- <dataarea name="flop" size="901120">
- <rom name="317483-03_kickstart.adf" size="901120" crc="9d68d211" sha1="44682d10a7f62896b46180491d60db4ee8c30529"/>
- </dataarea>
- </part>
- <!-- Extras 1.2? -->
- </software>
-
- <!-- Version 1.3 -->
-
- <software name="wbenc13">
- <description>Workbench 1.3</description>
- <year>1988</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3" />
- <dataarea name="flop" size="901120">
- <rom name="317746-01_workbench.adf" size="901120" status="nodump"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Kickstart 1.3" />
- <dataarea name="flop" size="901120">
- <rom name="317747-01_kickstart.adf" size="901120" crc="5fd0ef3b" sha1="a80b001b98a997969bf709cecd07f8578f861148"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Extras 1.3" />
- <dataarea name="flop" size="901120">
- <rom name="317748-01_extras.adf" size="901120" status="nodump"/>
- </dataarea>
- </part>
- </software>
-
- <!-- EmuTOS -->
-
- <software name="emutos93">
- <description>EmuTOS 0.9.3</description>
- <year>2014</year>
- <publisher>EmuTOS development team</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="EmuTOS 0.9.3" />
- <dataarea name="flop" size="901120">
- <rom name="emutos_093.adf" size="901120" crc="96f5cc88" sha1="fa3a3aa314d50e1131a5b65a048519c76c836bd2"/>
- </dataarea>
- </part>
- </software>
-
-</softwarelist>
diff --git a/hash/amiga_a3000.xml b/hash/amiga_a3000.xml
deleted file mode 100644
index 2e3c6ac0f83..00000000000
--- a/hash/amiga_a3000.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
-<!--
-license:CC0-1.0
-
-This list contains the system software specific to the Amiga 3000:
-SuperKickstart disks, SCSI installation disks and AMIX
--->
-
-<softwarelist name="amiga_a3000" description="Commodore Amiga 3000 System disks">
-
- <!-- SuperKickstart -->
-
- <software name="sk201">
- <description>Kickstart 2.01</description>
- <year>1990</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Kickstart 2.01" />
- <dataarea name="flop" size="901120">
- <rom name="367245-03_kickstart.adf" size="901120" crc="79c58ce8" sha1="8e738fb5a9d293c8321cf5055c06f368d43a6e2b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sk204">
- <description>Kickstart 2.04</description>
- <year>1991</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Kickstart 2.04" />
- <dataarea name="flop" size="901120">
- <rom name="367245-06_kickstart.adf" size="901120" crc="87ad0c5b" sha1="922ec2776766a6568f3e2de37101c497067948e4"/>
- </dataarea>
- </part>
- </software>
-
- <!-- A3000 Installation disks -->
-
- <software name="a3kin203">
- <description>A3000 Install Disk 2.03</description>
- <year>1991</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A3000 Install Disk 2.03" />
- <dataarea name="flop" size="901120">
- <rom name="335603-04_install.adf" size="901120" crc="9a3cc466" sha1="b12a225890a3957bb01dcbfba44c046c19e19c8f"/>
- </dataarea>
- </part>
- </software>
-
- <!-- Amiga UNIX System V Release 4 -->
- <!-- TODO: Part numbers -->
-
- <software name="amix11">
- <description>UNIX System V Release 4 Amiga Version 1.1</description>
- <year>1990</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 1 (Boot)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_11_boot.adf" size="901120" crc="83a9c798" sha1="7b530cb8ff39933c7cef2ee6349a9b2d147e6a6d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_11_root.adf" size="901120" crc="9ac8c76e" sha1="61f06cf47c12930ff9677c57a8464c549c5fb839" />
- </dataarea>
- </part>
- <part name="tape" interface="a3000_cass">
- <feature name="part_id" value="Installation Tape"/>
- <dataarea name="cass" size="1">
- <rom name="cass" size="0" status="nodump" />
- </dataarea>
- </part>
- </software>
-
- <software name="amix201" cloneof="amix11">
- <description>UNIX System V Release 4 Amiga Version 2.01</description>
- <year>199?</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 1 (Boot)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_201_boot.adf" size="901120" crc="7e3ecc6b" sha1="63d0144296e63b8ea09e4c1b2a85d1e09dc111e5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_201_root.adf" size="901120" crc="c8fef4fd" sha1="840a23a93329b4f68113515f9bf466bb15af1bc7" />
- </dataarea>
- </part>
- <part name="tape" interface="a3000_cass">
- <feature name="part_id" value="Installation Tape"/>
- <dataarea name="cass" size="1">
- <rom name="cass" size="0" status="nodump" />
- </dataarea>
- </part>
- </software>
-
- <software name="amix203" cloneof="amix11">
- <description>UNIX System V Release 4 Amiga Version 2.03</description>
- <year>199?</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 1 (Boot)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_203_boot.adf" size="901120" crc="a10249c1" sha1="5c62519528d92a6e8a7b88d9879d9d0903e90ad2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_203_root.adf" size="901120" crc="6859ae85" sha1="ed38709d4f9b7a1cfc42112038e74b75587de73f" />
- </dataarea>
- </part>
- <part name="tape" interface="a3000_cass">
- <feature name="part_id" value="Installation Tape"/>
- <dataarea name="cass" size="1">
- <rom name="cass" size="0" status="nodump" />
- </dataarea>
- </part>
- </software>
-
- <software name="amix21" cloneof="amix11">
- <description>UNIX System V Release 4 Amiga Version 2.1</description>
- <year>199?</year>
- <publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 1 (Boot)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_21_boot.adf" size="901120" crc="99a92138" sha1="c3c444fdf00275b8a1d57d3da8556267977d940a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_21_root.adf" size="901120" crc="7c134fcd" sha1="586cba2c40e007d09f634647e15e33a5ac4ba069" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Patch Disk"/>
- <dataarea name="flop" size="901120">
- <rom name="amix_patch_21.adf" size="901120" crc="6b401165" sha1="325df79e3ca52709d47512227d187c87ed4c9472" />
- </dataarea>
- </part>
- <part name="tape" interface="a3000_cass">
- <feature name="part_id" value="Installation Tape"/>
- <dataarea name="cass" size="1">
- <rom name="cass" size="0" status="nodump" />
- </dataarea>
- </part>
- </software>
-
-</softwarelist>
diff --git a/hash/amiga_amix.xml b/hash/amiga_amix.xml
new file mode 100644
index 00000000000..c8ef2f1c742
--- /dev/null
+++ b/hash/amiga_amix.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!--
+
+license: CC0-1.0
+
+This list contains images for the Amiga UNIX System V Release 4 (AMIX)
+
+-->
+
+<softwarelist name="amiga_amix" description="Commodore AMIX disks">
+
+ <!-- TODO: Part numbers -->
+
+ <software name="amix11">
+ <description>UNIX System V Release 4 Amiga Version 1.1</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 1 (Boot)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_11_boot.adf" size="901120" crc="83a9c798" sha1="7b530cb8ff39933c7cef2ee6349a9b2d147e6a6d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_11_root.adf" size="901120" crc="9ac8c76e" sha1="61f06cf47c12930ff9677c57a8464c549c5fb839" />
+ </dataarea>
+ </part>
+ <part name="tape" interface="a3000_cass">
+ <feature name="part_id" value="Installation Tape"/>
+ <dataarea name="cass" size="1">
+ <rom name="cass" size="0" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amix201" cloneof="amix11">
+ <description>UNIX System V Release 4 Amiga Version 2.01</description>
+ <year>199?</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 1 (Boot)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_201_boot.adf" size="901120" crc="7e3ecc6b" sha1="63d0144296e63b8ea09e4c1b2a85d1e09dc111e5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_201_root.adf" size="901120" crc="c8fef4fd" sha1="840a23a93329b4f68113515f9bf466bb15af1bc7" />
+ </dataarea>
+ </part>
+ <part name="tape" interface="a3000_cass">
+ <feature name="part_id" value="Installation Tape"/>
+ <dataarea name="cass" size="1">
+ <rom name="cass" size="0" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amix203" cloneof="amix11">
+ <description>UNIX System V Release 4 Amiga Version 2.03</description>
+ <year>199?</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 1 (Boot)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_203_boot.adf" size="901120" crc="a10249c1" sha1="5c62519528d92a6e8a7b88d9879d9d0903e90ad2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_203_root.adf" size="901120" crc="6859ae85" sha1="ed38709d4f9b7a1cfc42112038e74b75587de73f" />
+ </dataarea>
+ </part>
+ <part name="tape" interface="a3000_cass">
+ <feature name="part_id" value="Installation Tape"/>
+ <dataarea name="cass" size="1">
+ <rom name="cass" size="0" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amix21" cloneof="amix11">
+ <description>UNIX System V Release 4 Amiga Version 2.1</description>
+ <year>199?</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 1 (Boot)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_21_boot.adf" size="901120" crc="99a92138" sha1="c3c444fdf00275b8a1d57d3da8556267977d940a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Installation Disk 2 (Root file system)"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_21_root.adf" size="901120" crc="7c134fcd" sha1="586cba2c40e007d09f634647e15e33a5ac4ba069" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Patch Disk"/>
+ <dataarea name="flop" size="901120">
+ <rom name="amix_patch_21.adf" size="901120" crc="6b401165" sha1="325df79e3ca52709d47512227d187c87ed4c9472" />
+ </dataarea>
+ </part>
+ <part name="tape" interface="a3000_cass">
+ <feature name="part_id" value="Installation Tape"/>
+ <dataarea name="cass" size="1">
+ <rom name="cass" size="0" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/amiga_apps.xml b/hash/amiga_apps.xml
index 700bd513a84..d4ab603cacc 100644
--- a/hash/amiga_apps.xml
+++ b/hash/amiga_apps.xml
@@ -116,7 +116,7 @@ license:CC0-1.0
</part>
</software>
- <software name ="suprdupr">
+ <software name="suprdupr">
<description>SuperDuper 2.02</description>
<year>19??</year>
<publisher>Amitech Denmark</publisher>
diff --git a/hash/amiga_cd.xml b/hash/amiga_cd.xml
new file mode 100644
index 00000000000..25c7de7f098
--- /dev/null
+++ b/hash/amiga_cd.xml
@@ -0,0 +1,347 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+
+http://redump.org/discs/system/acd
+-->
+<softwarelist name="amiga_cd" description="Commodore AmigaCD images">
+
+<!-- !Operating Systems -->
+
+ <software name="redhat51" supported="no">
+ <!-- "for Amiga 68k" -->
+ <description>Red Hat Linux 5.1</description>
+ <year>1998</year>
+ <publisher>Red Hat</publisher>
+ <notes><![CDATA[
+Requires a machine with 68020 (not EC variants) + FPU + MMU (A3000 or A4000)
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="redhat_5_1_m68k" sha1="d61a967ca60fe1f85dd485ad6b535fa07b5cee8b"/>
+ </diskarea>
+ </part>
+ </software>
+
+<!-- !Games -->
+
+ <software name="bigred" supported="no">
+ <description>The Big Red Adventure (Europe)</description>
+ <year>1997</year>
+ <publisher>Power Computing</publisher>
+ <notes><![CDATA[
+Requires an AGA machine with enough installed Fast RAM on it
+[Denise] pitch corruption during intro
+Uses [Denise] BPLCON3 SPRESx
+[Paula] volume gets incredibly loud during intro (verify)
+Not extensively tested
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="big_red_adventure_(1997)(ludomedia-power_computing)[m4]" sha1="4883a7e4418321c649e4df9a66958b51697656fb"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="finlodys" supported="no">
+ <!-- http://redump.org/disc/18527/ -->
+ <!-- "Peter Spinaze's Final Odyssey" on introduction screen -->
+ <description>Final Odyssey: Theseus Verses the Minotaur (Europe)</description>
+ <year>1997</year>
+ <publisher>Vulcan Software</publisher>
+ <notes><![CDATA[
+Requires an ECS or AGA machine with enough installed Fast RAM on it
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="final_odyssey_-_theseus_verses_the_minotaur_(europe)_(en,de,es,it,no,da,fi)" sha1="db1763b926a90175470871361e02047d0cc457f8"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="gunbee" supported="no">
+ <!-- http://redump.org/disc/41238/ -->
+ <description>Gunbee F-99: The Kidnapping of Lady Akiko (Europe)</description>
+ <year>1998</year>
+ <!-- APC &amp; TCP? -->
+ <publisher>&lt;coverdisk&gt;</publisher>
+ <notes><![CDATA[
+https://amr.abime.net/issue_273_contents
+[Paula] BGM ch. 0 and ch. 1 goes silent after first note, eventually leading to hang after intro (loops waiting for irqs)
+[Denise] heavy delay offsets during intro, flips FMODE between $000c and $000d
+]]></notes>
+ <!-- December '98 -->
+ <!-- TODO: comes packaged with a 2 CD edition -->
+ <info name="magazine" value="Amiga Format 117 - AFCD33" />
+ <info name="usage" value="CD drawer default position needs to scroll down" />
+
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="gunbee_f-99_-_the_kidnapping_of_lady_akiko_(europe)_(en,de)" sha1="123d4efea6a0587e47c3cf61fc2e0909737939b1"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="kangfu" supported="no">
+ <!-- "CD-32, A1200, A4000" on cover art -->
+ <description>Kang Fu</description>
+ <year>1996</year>
+ <publisher>GREat Effects Development (GREED)</publisher>
+ <notes><![CDATA[
+Plenty of [AGA] bugs
+Uses [Denise] BPLCON3 SPRESx
+Has [CDROM] redbook tracks
+cd32: unsupported [Akiko] close tray after CD32 BIOS plays back music, will otherwise throw "Out of Memory" afterwards.
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="kangfu_cd32" sha1="804503915194e87ac44ab4cc9f412444efbc2ee6" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="pballdmg" supported="no">
+ <!-- http://redump.org/disc/16919/ -->
+ <description>Pinball Brain Damage (Europe)</description>
+ <year>1997</year>
+ <!-- Packaging Design: Epic Marketing -->
+ <publisher>APC &amp; TCP</publisher>
+ <notes><![CDATA[
+Intro and main menu use [Lisa] BPLCON3 SPRESx
+Optional [Lisa] SHRES mode in gameplay
+Very easy to ball stuck in table 2 (verify, https://forums.bannister.org/ubbthreads.php?ubb=showflat&Number=124163#Post124163)
+Editor and HD Install untested
+]]></notes>
+ <!-- TODO: verify assign BrainDamage: "Brain Damage:" before install as Erratum note -->
+ <info name="usage" value="CD drawer default position needs to scroll right" />
+ <info name="developer" value="Mind's Eye Entertainment"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="pinball_brain_damage_(europe)" sha1="883518fb03b69ec1460b22cbb57a52845b9324cd"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="wendetta" supported="no">
+ <!-- "A1200/A4000 CD32" on cover art -->
+ <!-- http://redump.org/disc/106519/ -->
+ <description>Wendetta 2175 (Europe)</description>
+ <year>1996</year>
+ <publisher>Skills</publisher>
+ <notes><![CDATA[
+[Lisa] Uses SPRESx for intro credits text
+[Lisa] heavy graphic corruptions in ship select and gameplay
+]]></notes>
+ <info name="developer" value="Vortex Design" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="wendetta_2175_(europe)" sha1="c7a4e4c9cc2acbe6b561bf2230c22529d6592e8c"/>
+ </diskarea>
+ </part>
+ </software>
+
+<!-- !Collections -->
+
+ <software name="17bitph4" supported="no">
+ <!-- http://redump.org/disc/20852/ -->
+ <description>17 Bit - Phase Four (Europe)</description>
+ <year>1994</year>
+ <publisher>Almathera</publisher>
+ <notes><![CDATA[
+Disks 2801-3351 of 17 Bit PD Library
+Requires stable [FDC] write
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="17_bit_-_phase_four_(europe)" sha1="1673a4027e1a581996c14b5d062610fffb92856e"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="17bit5th" supported="no">
+ <!-- http://redump.org/disc/20853/ -->
+ <description>17 Bit - The Fifth Dimension (Europe)</description>
+ <year>1995</year>
+ <!-- No publisher on CD covers, assume Almathera went bankrupt at this point -->
+ <publisher>17 Bit Software</publisher>
+ <notes><![CDATA[
+Disks 3352-3870 of 17 Bit PD Library
+Requires stable [FDC] write
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="17_bit_-_the_fifth_dimension_(europe)" sha1="a294d8426310f7fe46be156050958c5322d6aad2"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="17bitlv6" supported="no">
+ <!-- http://redump.org/disc/20854/ -->
+ <description>17 Bit - Level 6 (Europe)</description>
+ <!-- Year and publisher from info file -->
+ <year>1997</year>
+ <publisher>Epic Marketing / Quartz Public Domain</publisher>
+ <notes><![CDATA[
+Disks 3870-4567 of 17 Bit PD Library
+Requires stable [FDC] write
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="17_bit_-_level_6_(europe)" sha1="cd0d8bfc52861fd98eefe991343c9969b2ffa513"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="amigames" supported="partial">
+ <description>Aminet Games</description>
+ <year>2000</year>
+ <publisher>Schatztruhe</publisher>
+ <notes><![CDATA[
+https://wiki.aminet.net/Aminet_Games
+Not extensively tested, some games known to use ECS or AGA features. (cfr. BrutalTenia)
+]]></notes>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="aminet_games" sha1="2c95d94df50fbe9c4f11a90ca926cf880693e49b" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="emuplus" supported="no">
+ <!-- http://redump.org/disc/43683/ -->
+ <description>Emulators Unlimited Plus (Germany)</description>
+ <!-- Unknown release date, file datestamps all have unlikely '92 or '78 -->
+ <!-- Has a tool for Psion Series 3/a (page 6 of Information complete list) so mid-to-late 90s possible -->
+ <year>1995?</year>
+ <!-- Epic Marketing? -->
+ <publisher>&lt;unknown&gt;</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="emulators_unlimited_plus_(germany)_(en,de)" sha1="51ac9436545afdc39def039eeffea69d3f0e110c"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="10on10" supported="partial">
+ <description>Ten on Ten Compilation (Europe)</description>
+ <year>1995</year>
+ <publisher>Almathera</publisher>
+ <notes><![CDATA[
+Disc 1 has various unsupported collection of Amiga ParNet and SerNet tools
+cd32: disc 1 AmigaKicks\chess has GFX pitch corruption and uncontrollable pointer, [joytest] reset
+cd32: disc 10 black screen
+]]></notes>
+ <info name="usage" value="CD32: In order to load any other disc in this collection, insert disc 1 then hold right mouse button at startup for being prompted to disc swap with any other CD in this collection, then soft reset machine"/>
+ <part name="cdrom1" interface="cdrom">
+ <!-- <category>Applications</category> -->
+ <!-- http://redump.org/disc/18550/ -->
+ <!-- <rom name="Almathera Comms &amp; Networking CD (Europe).cue" size="106" crc="803a023b" md5="3dd92c3d34ed3cda877dfa31ce492fa6" sha1="fea81c0d76b0f7c84798b9de72d9acc678226530"/> -->
+ <!-- <rom name="Almathera Comms &amp; Networking CD (Europe).bin" size="248571120" crc="f9991efe" md5="cca00b0125a0f164b6bc73fb6339ee11" sha1="b4520eb166407bd00e54b9cbaf31212b3f54bc7a"/> -->
+ <feature name="part_id" value="Almathera Comms &amp; Networking CD"/>
+ <diskarea name="cdrom">
+ <disk name="almathera comms &amp; networking cd (europe)" sha1="9996f33406c3c26b4e2be9d7f86d59156fdd48d0"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom2" interface="cdrom">
+ <!-- <category>Applications</category> -->
+ <!-- http://redump.org/disc/18548/ -->
+ <!-- <rom name="CDPD 1 (Europe).cue" size="81" crc="7e261a25" md5="961b2e9c6f18b5167fe713c0545ca9a2" sha1="f0e60c1c6f0b3a86494a7f46c676a36b363f9bcc"/> -->
+ <!-- <rom name="CDPD 1 (Europe).bin" size="746776464" crc="30c57806" md5="43b45e0afd4a960359d0ed1ba9120ae7" sha1="4a743f0feba8e20040e3b1ff77c051e57f9222ff"/> -->
+ <feature name="part_id" value="CDPD 1"/>
+ <diskarea name="cdrom">
+ <disk name="cdpd 1 (europe)" sha1="dcb79ff4d466778cc92d5ccd177f2c97ef7f1d02"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom3" interface="cdrom">
+ <!-- <category>Applications</category> -->
+ <!-- http://redump.org/disc/18548/ -->
+ <!-- <rom name="CDPD 2 (Europe).cue" size="81" crc="958c5298" md5="1f456742c84b59639360e5105b0a2205" sha1="9f8e7a02a6369833885d6bfdc75c9714378e1551"/> -->
+ <!-- <rom name="CDPD 2 (Europe).bin" size="658442400" crc="a94c14cc" md5="73e3a9b78888aee9e9754793d797bfd1" sha1="57b63e986dd15ba49362e1ff02eabe4a754b412f"/> -->
+ <feature name="part_id" value="CDPD 2"/>
+ <diskarea name="cdrom">
+ <disk name="cdpd 2 (europe)" sha1="9c3f2a0cb7933fd10694d80f75bb93fbab5c755e"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom4" interface="cdrom">
+ <!-- <category>Multimedia</category> -->
+ <!-- http://redump.org/disc/18551/ -->
+ <!-- <rom name="Demo 1 (Europe).cue" size="81" crc="0f256c23" md5="23d4594e745f3174e8b9b8ecfcac1f34" sha1="73317088554a3c8aa8b3ca5feaeb3ff63b062585"/> -->
+ <!-- <rom name="Demo 1 (Europe).bin" size="708610560" crc="9ee5043f" md5="30d0e664799138e2c8d641b48d4192c0" sha1="42966b2d2f0ffd5540ec795861eb8b15f7076899"/> -->
+ <feature name="part_id" value="Demo 1"/>
+ <diskarea name="cdrom">
+ <disk name="demo 1 (europe)" sha1="ef7c7c992fd7bc7fea080ec43357314999e6785b"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom5" interface="cdrom">
+ <!-- <category>Multimedia</category> -->
+ <!-- http://redump.org/disc/18523/ -->
+ <!-- <rom name="World Vista (Europe).cue" size="86" crc="74387a47" md5="2194ac62bf9b48f0608aac799428e47e" sha1="705c4eb8cdfadc98b66a924c0aadc15046b77875"/> -->
+ <!-- <rom name="World Vista (Europe).bin" size="502789392" crc="b2113b15" md5="8ec646ed17c575139d644efcf1566fbd" sha1="5b71c5976c388dd7a6e870ca36840c7accd50701"/> -->
+ <feature name="part_id" value="World Vista"/>
+ <diskarea name="cdrom">
+ <disk name="world vista (europe)" sha1="7b73c1ac1a25cc7b10b2a91b118dde3684128482"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom6" interface="cdrom">
+ <!-- <category>Educational</category> -->
+ <!-- http://redump.org/disc/18522/ -->
+ <!-- <rom name="Illustrated Works of Shakespeare (Europe).cue" size="107" crc="abb7e3a0" md5="0f3e783ca41909d10a74c9d45191f3d3" sha1="b2438bd35b8e60b2ebd2d3ef501e6b1d28eab6ef"/> -->
+ <!-- <rom name="Illustrated Works of Shakespeare (Europe).bin" size="53214000" crc="29c9634c" md5="a6984256d64d0daad5423575a805b41e" sha1="bab8b78ce7c95da36b650394cfbc285af7726da0"/> -->
+ <feature name="part_id" value="Illustrated Works of Shakespeare"/>
+ <diskarea name="cdrom">
+ <disk name="illustrated works of shakespeare (europe)" sha1="5e54c12eda0c560b48f96df7dfba53990a6cdeea"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom7" interface="cdrom">
+ <!-- <category>Multimedia</category> -->
+ <!-- http://redump.org/disc/18521/ -->
+ <!-- <rom name="Pandora's CD (Europe) (Alt).cue" size="93" crc="6685c80c" md5="8147396f05b2b7b17b55821d9678c982" sha1="620f0c1437e2ea13adf14baf3895fc55b5c988e5"/> -->
+ <!-- <rom name="Pandora's CD (Europe) (Alt).bin" size="458738784" crc="ddb7e392" md5="e7740666bced9f7a96da85ad9b4d113f" sha1="adac7c881f641bfc4667fcf8e7469886906548ea"/> -->
+ <feature name="part_id" value="Pandora's CD"/>
+ <diskarea name="cdrom">
+ <disk name="pandora's cd (europe) (alt)" sha1="488241b997f026533444b05e60357be3b5d78f41"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom8" interface="cdrom">
+ <!-- <category>Games</category> -->
+ <!-- http://redump.org/disc/18520/ -->
+ <!-- <rom name="Team Yankee (Europe) (Ten on Ten).cue" size="99" crc="606f0162" md5="8c173ad5d43a8447e924ce5075a7471c" sha1="62e5d539082c8d4796a8057577e6e59906193298"/> -->
+ <!-- <rom name="Team Yankee (Europe) (Ten on Ten).bin" size="7079520" crc="de95d6f2" md5="efc8a6b9face11df7a53ba32c74bbb2a" sha1="713bd1aaefe59e15af61771abffde3c89b5b9d2c"/> -->
+ <feature name="part_id" value="Team Yankee"/>
+ <diskarea name="cdrom">
+ <disk name="team yankee (europe) (ten on ten)" sha1="70e8946f4b161ca3011c523cb007180196762d8c"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom9" interface="cdrom">
+ <!-- <category>Multimedia</category> -->
+ <!-- http://redump.org/disc/18519/ -->
+ <!-- <rom name="Almathera Photo Library CD, The (Europe).cue" size="106" crc="68b31c99" md5="ea8423140d0209f04755a2505bef109f" sha1="1941996df3ce012770172fbc7f6552bd34b9503e"/> -->
+ <!-- <rom name="Almathera Photo Library CD, The (Europe).bin" size="636801648" crc="75ecfbe4" md5="c1957cc3701c16379261420285f11677" sha1="dc1f8e27a0831476d694548fe1021c73974523c6"/> -->
+ <feature name="part_id" value="The Almathera Photo Library CD"/>
+ <diskarea name="cdrom">
+ <disk name="almathera photo library cd, the (europe)" sha1="abcba2861161369b3394344792d491c85f6cb24d"/>
+ </diskarea>
+ </part>
+
+ <part name="cdrom10" interface="cdrom">
+ <!-- <category>Multimedia</category> -->
+ <!-- http://redump.org/disc/18518/ -->
+ <!-- <rom name="Almathera Clipart &amp; Fonts CD, The (Europe).cue" size="108" crc="78acde0b" md5="0440ed5c13780246105b0ea4b76ed7ca" sha1="d644a15e06b84a308dfee8e543d214d2ebadc0ea"/> -->
+ <!-- <rom name="Almathera Clipart &amp; Fonts CD, The (Europe).bin" size="230662992" crc="89ab1b59" md5="efcc9acae92fe1cf7975c41c38ad30a1" sha1="039ab9c11793fd66ac74e34fbc44d138babfb666"/> -->
+ <feature name="part_id" value="The Almathera Clipart &amp; Fonts CD"/>
+ <diskarea name="cdrom">
+ <disk name="almathera clipart &amp; fonts cd, the (europe)" sha1="dba531dac0190bd355b8a7cd4128355c3b077641"/>
+ </diskarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/amiga_demos.xml b/hash/amiga_demos.xml
index ac9b967c814..19b65dab436 100644
--- a/hash/amiga_demos.xml
+++ b/hash/amiga_demos.xml
@@ -27,11 +27,27 @@ TODO:
</part>
</software>
+ <software name="interfer" supported="no">
+ <description>Interference (demo)</description>
+ <year>1993</year>
+ <publisher>&lt;homebrew&gt;</publisher>
+ <info name="developer" value="Sanity"/>
+ <info name="release" value="19930424"/>
+ <!-- OCS/ECS -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="sanity-interference.adf" size="901120" crc="7075359f" sha1="8dc41dccf7dab7b742f9fd21d3e2d2055120f3dc"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="miseryd2" supported="no">
<description>Misery Dentro 2 (demo)</description>
<year>1993</year>
<publisher>&lt;homebrew&gt;</publisher>
- <info name="developer" value="Masque of TRSI, Tristar and Red Sector Inc."/>
+ <!-- https://demozoo.org/groups/69/ -->
+ <info name="developer" value="Masque of TRSI" />
+ <info name="developer" value="Tristar and Red Sector Inc." />
<info name="release" value="19930328"/>
<!-- 2nd place in CeBIT 1993 Amiga Demo Competition in Germany -->
<!-- OCS/ECS -->
@@ -42,6 +58,20 @@ TODO:
</part>
</software>
+ <software name="puggs" supported="no">
+ <description>Puggs In Space (demo)</description>
+ <year>1989</year>
+ <publisher>&lt;homebrew&gt;</publisher>
+ <info name="developer" value="Dionysus"/>
+ <!-- 10th best demo in EuroChart Top Ten #3 -->
+ <!-- OCS/ECS -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="dionysus-puggsinspace.adf" size="901120" crc="c55e5390" sha1="b8af05dc8905c1e215f3b2b4c450020d890add25"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="elysium" supported="no">
<description>Sanity Elysium (demo)</description>
<year>1991</year>
diff --git a/hash/amiga_flop.xml b/hash/amiga_flop.xml
index 7146ba18af8..efe0d569799 100644
--- a/hash/amiga_flop.xml
+++ b/hash/amiga_flop.xml
@@ -164,7 +164,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam011a" cloneof="assam011" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 01.1 (Alt 2)</description>
+ <description>Audio Magic Vol 01.1 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -176,7 +176,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam011b" cloneof="assam011" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 01.1 (Alt)</description>
+ <description>Audio Magic Vol 01.1 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -200,7 +200,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam020a" cloneof="assam020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 02.0 (Alt 2)</description>
+ <description>Audio Magic Vol 02.0 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -212,7 +212,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam020b" cloneof="assam020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 02.0 (Alt)</description>
+ <description>Audio Magic Vol 02.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -236,7 +236,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam030a" cloneof="assam030" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 03.0 (Alt)</description>
+ <description>Audio Magic Vol 03.0 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -261,7 +261,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam040a" cloneof="assam040" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 04.0 (Bad? ERRDMS)</description>
+ <description>Audio Magic Vol 04.0 (bad? ERRDMS)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19930209" />
@@ -287,7 +287,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam050a" cloneof="assam050" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 05.0 (Alt)</description>
+ <description>Audio Magic Vol 05.0 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19931103" />
@@ -326,7 +326,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam07a" cloneof="assam07" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 07 (Alt)</description>
+ <description>Audio Magic Vol 07 (alt)</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940520" />
@@ -352,7 +352,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam08a" cloneof="assam08" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 08 (Alt)</description>
+ <description>Audio Magic Vol 08 (alt)</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940726" />
@@ -390,7 +390,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam10a" cloneof="assam10" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 10 (Alt)</description>
+ <description>Audio Magic Vol 10 (alt)</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940817" />
@@ -451,7 +451,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assam14a" cloneof="assam14" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Audio Magic Vol 14 (Alt)</description>
+ <description>Audio Magic Vol 14 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -487,7 +487,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assbts1a" cloneof="assbts1" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Back to Skool 1 (Alt)</description>
+ <description>Back to Skool 1 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -535,7 +535,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asscnc2a" cloneof="asscnc2" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Crunch-N-Copy Utils II (Alt 2)</description>
+ <description>Crunch-N-Copy Utils II (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -547,7 +547,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asscnc2b" cloneof="asscnc2" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Crunch-N-Copy Utils II (Alt 3)</description>
+ <description>Crunch-N-Copy Utils II (alt 3)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -559,7 +559,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asscnc2c" cloneof="asscnc2" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Crunch-N-Copy Utils II (Alt)</description>
+ <description>Crunch-N-Copy Utils II (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -595,7 +595,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assdskcpa" cloneof="assdskcp" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Copiers (Alt)</description>
+ <description>Disk Copiers (alt)</description>
<year>1991</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -620,7 +620,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asshl010a" cloneof="asshl010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Helper Vol 01.0 (Alt)</description>
+ <description>Disk Helper Vol 01.0 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19931119" />
@@ -646,7 +646,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asshl020a" cloneof="asshl020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Helper Vol 02.0 (Alt)</description>
+ <description>Disk Helper Vol 02.0 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19931218" />
@@ -659,7 +659,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asshl030" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Helper Vol 03.0 (Alt) [WB]</description>
+ <description>Disk Helper Vol 03.0 (alt) [WB]</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940926" />
@@ -709,7 +709,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asshl050a" cloneof="asshl050" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Helper Vol 05.0 (Alt)</description>
+ <description>Disk Helper Vol 05.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -733,7 +733,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asshl060a" cloneof="asshl060" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Helper Vol 06.0 (Alt)</description>
+ <description>Disk Helper Vol 06.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -757,7 +757,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asshl070a" cloneof="asshl070" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Disk Helper Vol 07.0 (Alt)</description>
+ <description>Disk Helper Vol 07.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -891,7 +891,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assicon1a" cloneof="assicon1" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Magic Icons Vol 1.0 (Alt)</description>
+ <description>Magic Icons Vol 1.0 (alt)</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940208" />
@@ -966,7 +966,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmpr10a" cloneof="assmpr10" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Print Vol 1.0 (Alt 2)</description>
+ <description>Multi Print Vol 1.0 (alt 2)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19931105" />
@@ -979,7 +979,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmpr10b" cloneof="assmpr10" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Print Vol 1.0 (Alt)</description>
+ <description>Multi Print Vol 1.0 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19931105" />
@@ -992,7 +992,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmpr10c" cloneof="assmpr10" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Print Vol 1.0 (Overdumped?)</description>
+ <description>Multi Print Vol 1.0 (overdumped?)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<info name="release" value="19931105" />
@@ -1043,7 +1043,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmpr40a" cloneof="assmpr40" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Print Vol 4.0 (Alt)</description>
+ <description>Multi Print Vol 4.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1079,7 +1079,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmv010a" cloneof="assmv010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Vision Vol 01.0 (Alt 2)</description>
+ <description>Multi Vision Vol 01.0 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1091,7 +1091,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmv010b" cloneof="assmv010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Vision Vol 01.0 (Alt)</description>
+ <description>Multi Vision Vol 01.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1165,7 +1165,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmv060a" cloneof="assmv060" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Vision Vol 06.0 (Alt 2)</description>
+ <description>Multi Vision Vol 06.0 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1177,7 +1177,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmv060b" cloneof="assmv060" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Vision Vol 06.0 (Alt 3)</description>
+ <description>Multi Vision Vol 06.0 (alt 3)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1189,7 +1189,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmv060c" cloneof="assmv060" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Vision Vol 06.0 (Alt)</description>
+ <description>Multi Vision Vol 06.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1213,7 +1213,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assmv070a" cloneof="assmv070" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Multi Vision Vol 07.0 (Alt)</description>
+ <description>Multi Vision Vol 07.0 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1297,7 +1297,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assoff3a" cloneof="assoff3" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Office Helper Vol 3 (Alt)</description>
+ <description>Office Helper Vol 3 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1321,7 +1321,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assoff4a" cloneof="assoff4" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Office Helper Vol 4 (Alt)</description>
+ <description>Office Helper Vol 4 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1345,7 +1345,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd001a" cloneof="asspd001" supported="no">
- <description>PD Games Volume 001 (Tanx, Roller-Pede, Amigoids, Cave Runner, Avatris) (Alt)</description>
+ <description>PD Games Volume 001 (Tanx, Roller-Pede, Amigoids, Cave Runner, Avatris) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1357,7 +1357,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd001b" cloneof="asspd001" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 001 (Tanx, Roller-Pede, Amigoids, Cave Runner, Avatris) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 001 (Tanx, Roller-Pede, Amigoids, Cave Runner, Avatris) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1369,7 +1369,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd001c" cloneof="asspd001" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 001 (Tanx, Roller-Pede, Amigoids, Cave Runner, Avatris) (Overdumped?)</description>
+ <description>PD Games Volume 001 (Tanx, Roller-Pede, Amigoids, Cave Runner, Avatris) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1381,7 +1381,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd002" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (Alt 2)</description>
+ <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1393,7 +1393,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd002a" cloneof="asspd002" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (Alt)</description>
+ <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1405,7 +1405,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd002b" cloneof="asspd002" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1417,7 +1417,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd002c" cloneof="asspd002" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (Overdumped?)</description>
+ <description>PD Games Volume 002 (Girl Action, Missile Command, Invaders, Bally 2, Maze Game, Think Ahead) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1429,7 +1429,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd003" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 003 (Megaball, Drip) (Alt 2)</description>
+ <description>PD Games Volume 003 (Megaball, Drip) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1441,7 +1441,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd003a" cloneof="asspd003" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 003 (Megaball, Drip) (Alt)</description>
+ <description>PD Games Volume 003 (Megaball, Drip) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1453,7 +1453,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd003b" cloneof="asspd003" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 003 (Megaball, Drip) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 003 (Megaball, Drip) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1465,7 +1465,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd003c" cloneof="asspd003" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 003 (Megaball, Drip) (Overdumped?)</description>
+ <description>PD Games Volume 003 (Megaball, Drip) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1477,7 +1477,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd004" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (Alt 2)</description>
+ <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1489,7 +1489,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd004a" cloneof="asspd004" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (Alt)</description>
+ <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1501,7 +1501,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd004b" cloneof="asspd004" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1513,7 +1513,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd004c" cloneof="asspd004" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (Overdumped?)</description>
+ <description>PD Games Volume 004 (Jumper, Gomoku, Cracker, Jumpy, Turbo Duel, Klondike) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1525,7 +1525,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd005" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (Alt 2)</description>
+ <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1537,7 +1537,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd005a" cloneof="asspd005" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (Alt)</description>
+ <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1549,7 +1549,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd005b" cloneof="asspd005" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1561,7 +1561,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd005c" cloneof="asspd005" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (Overdumped?)</description>
+ <description>PD Games Volume 005 (Go Looly, Retaliator, Raid) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1573,7 +1573,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd006" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (Alt 2)</description>
+ <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1585,7 +1585,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd006a" cloneof="asspd006" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (Alt)</description>
+ <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1597,7 +1597,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd006b" cloneof="asspd006" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1609,7 +1609,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd006c" cloneof="asspd006" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (Overdumped?)</description>
+ <description>PD Games Volume 006 (Downhill Challenge, Pacman 87, Metagalactic Llamas, Welltrix) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1621,7 +1621,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd007" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (Alt 2)</description>
+ <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1633,7 +1633,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd007a" cloneof="asspd007" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (Alt)</description>
+ <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1645,7 +1645,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd007b" cloneof="asspd007" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1657,7 +1657,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd007c" cloneof="asspd007" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (Overdumped?)</description>
+ <description>PD Games Volume 007 (Destination Moonbase, Trix, Nightworks, Clauds Runner) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1669,7 +1669,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd008" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (Alt 2)</description>
+ <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1681,7 +1681,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd008a" cloneof="asspd008" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (Alt)</description>
+ <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1693,7 +1693,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd008b" cloneof="asspd008" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1705,7 +1705,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd008c" cloneof="asspd008" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (Overdumped?)</description>
+ <description>PD Games Volume 008 (Air Ace II, H-Ball, Number Fumbler, Snake-Pit) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1717,7 +1717,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd009" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (Alt 2)</description>
+ <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1729,7 +1729,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd009a" cloneof="asspd009" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (Alt)</description>
+ <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1741,7 +1741,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd009b" cloneof="asspd009" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1754,7 +1754,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
<!-- bad? not bootable? -->
<software name="asspd009c" cloneof="asspd009" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (Overdumped?)</description>
+ <description>PD Games Volume 009 (Blizzard 512KB, Battle Pong) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1766,7 +1766,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (Alt 2)</description>
+ <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1778,7 +1778,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd010a" cloneof="asspd010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (Alt)</description>
+ <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1790,7 +1790,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd010b" cloneof="asspd010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (Hacked by ALE)</description> <!-- additional startup message inserted -->
+ <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (hacked by ALE)</description> <!-- additional startup message inserted -->
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1802,7 +1802,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd010c" cloneof="asspd010" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (Overdumped?)</description>
+ <description>PD Games Volume 010 (Pick Out, Escape, Sys, Pipeline) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1814,7 +1814,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd011" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 011 (Alt 2)</description>
+ <description>PD Games Volume 011 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1826,7 +1826,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd011a" cloneof="asspd011" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 011 (Alt)</description>
+ <description>PD Games Volume 011 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1838,7 +1838,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd011b" cloneof="asspd011" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 011 (Hacked by ALE)</description>
+ <description>PD Games Volume 011 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1850,7 +1850,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd011c" cloneof="asspd011" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 011 (Overdumped?)</description>
+ <description>PD Games Volume 011 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1862,7 +1862,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd012" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 012 (Alt 2)</description>
+ <description>PD Games Volume 012 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1874,7 +1874,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd012a" cloneof="asspd012" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 012 (Alt)</description>
+ <description>PD Games Volume 012 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1886,7 +1886,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd012b" cloneof="asspd012" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 012 (Hacked by ALE)</description>
+ <description>PD Games Volume 012 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1898,7 +1898,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd012c" cloneof="asspd012" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 012 (Overdumped?)</description>
+ <description>PD Games Volume 012 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1910,7 +1910,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd013" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 013 (Alt 2)</description>
+ <description>PD Games Volume 013 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1922,7 +1922,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd013a" cloneof="asspd013" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 013 (Alt)</description>
+ <description>PD Games Volume 013 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1934,7 +1934,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd013b" cloneof="asspd013" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 013 (Hacked by ALE)</description>
+ <description>PD Games Volume 013 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1946,7 +1946,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd013c" cloneof="asspd013" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 013 (Overdumped?)</description>
+ <description>PD Games Volume 013 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1958,7 +1958,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd014" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 014 (Alt 2)</description>
+ <description>PD Games Volume 014 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1970,7 +1970,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd014a" cloneof="asspd014" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 014 (Alt)</description>
+ <description>PD Games Volume 014 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1982,7 +1982,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd014b" cloneof="asspd014" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 014 (Hacked by ALE)</description>
+ <description>PD Games Volume 014 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1994,7 +1994,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd014c" cloneof="asspd014" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 014 (Overdumped?)</description>
+ <description>PD Games Volume 014 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2006,7 +2006,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd015" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 015 (Alt 2)</description>
+ <description>PD Games Volume 015 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2018,7 +2018,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd015a" cloneof="asspd015" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 015 (Alt)</description>
+ <description>PD Games Volume 015 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2030,7 +2030,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd015b" cloneof="asspd015" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 015 (Hacked by ALE)</description>
+ <description>PD Games Volume 015 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2042,7 +2042,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd015c" cloneof="asspd015" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 015 (Overdumped?)</description>
+ <description>PD Games Volume 015 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2054,7 +2054,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd016" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 016 (Alt)</description>
+ <description>PD Games Volume 016 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2066,7 +2066,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd016a" cloneof="asspd016" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 016 (Hacked by ALE)</description>
+ <description>PD Games Volume 016 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2078,7 +2078,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd016b" cloneof="asspd016" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 016 (Overdumped?)</description>
+ <description>PD Games Volume 016 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2090,7 +2090,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd017" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 017 (Alt 2)</description>
+ <description>PD Games Volume 017 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2102,7 +2102,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd017a" cloneof="asspd017" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 017 (Alt)</description>
+ <description>PD Games Volume 017 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2114,7 +2114,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd017b" cloneof="asspd017" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 017 (Hacked by ALE)</description>
+ <description>PD Games Volume 017 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2126,7 +2126,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd017c" cloneof="asspd017" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 017 (Overdumped?)</description>
+ <description>PD Games Volume 017 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2138,7 +2138,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd018" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 018 (Alt 2)</description>
+ <description>PD Games Volume 018 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2150,7 +2150,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd018a" cloneof="asspd018" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 018 (Alt)</description>
+ <description>PD Games Volume 018 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2162,7 +2162,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd018b" cloneof="asspd018" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 018 (Hacked by ALE)</description>
+ <description>PD Games Volume 018 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2174,7 +2174,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd018c" cloneof="asspd018" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 018 (Overdumped?)</description>
+ <description>PD Games Volume 018 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2186,7 +2186,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd019" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 019 (Alt 2)</description>
+ <description>PD Games Volume 019 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2198,7 +2198,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd019a" cloneof="asspd019" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 019 (Alt)</description>
+ <description>PD Games Volume 019 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2210,7 +2210,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd019b" cloneof="asspd019" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 019 (Hacked by ALE)</description>
+ <description>PD Games Volume 019 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2222,7 +2222,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd019c" cloneof="asspd019" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 019 (Overdumped?)</description>
+ <description>PD Games Volume 019 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2234,7 +2234,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 020 (Alt 2)</description>
+ <description>PD Games Volume 020 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2246,7 +2246,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd020a" cloneof="asspd020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 020 (Alt)</description>
+ <description>PD Games Volume 020 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2258,7 +2258,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd020b" cloneof="asspd020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 020 (Hacked by ALE)</description>
+ <description>PD Games Volume 020 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2270,7 +2270,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd020c" cloneof="asspd020" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 020 (Overdumped?)</description>
+ <description>PD Games Volume 020 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2282,7 +2282,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd021" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 021 (Alt)</description>
+ <description>PD Games Volume 021 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2294,7 +2294,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd021a" cloneof="asspd021" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 021 (Hacked by ALE)</description>
+ <description>PD Games Volume 021 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2306,7 +2306,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd021b" cloneof="asspd021" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 021 (Overdumped?)</description>
+ <description>PD Games Volume 021 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2318,7 +2318,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd022" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 022 (Alt)</description>
+ <description>PD Games Volume 022 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2330,7 +2330,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd022a" cloneof="asspd022" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 022 (Hacked by ALE)</description>
+ <description>PD Games Volume 022 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2342,7 +2342,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd022b" cloneof="asspd022" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 022 (Overdumped?)</description>
+ <description>PD Games Volume 022 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2354,7 +2354,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd023" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 023 (Alt)</description>
+ <description>PD Games Volume 023 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2366,7 +2366,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd023a" cloneof="asspd023" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 023 (Hacked by ALE)</description>
+ <description>PD Games Volume 023 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2378,7 +2378,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd023b" cloneof="asspd023" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 023 (Overdumped?)</description>
+ <description>PD Games Volume 023 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2390,7 +2390,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd024" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 024 (Bad?)</description>
+ <description>PD Games Volume 024 (bad?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2402,7 +2402,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd024a" cloneof="asspd024" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 024 (Hacked by ALE)</description>
+ <description>PD Games Volume 024 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2414,7 +2414,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd024b" cloneof="asspd024" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 024 (Overdumped?)</description>
+ <description>PD Games Volume 024 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2426,7 +2426,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd025" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 025 (Alt)</description>
+ <description>PD Games Volume 025 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2438,7 +2438,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd025a" cloneof="asspd025" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 025 (Hacked by ALE)</description>
+ <description>PD Games Volume 025 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2462,7 +2462,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd025c" cloneof="asspd025" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 025 (Overdumped?)</description>
+ <description>PD Games Volume 025 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2474,7 +2474,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd026" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 026 (Alt)</description>
+ <description>PD Games Volume 026 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2486,7 +2486,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd026a" cloneof="asspd026" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 026 (Hacked by ALE)</description>
+ <description>PD Games Volume 026 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2498,7 +2498,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd026b" cloneof="asspd026" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 026 (Overdumped?)</description>
+ <description>PD Games Volume 026 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2510,7 +2510,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd027" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 027 (Alt)</description>
+ <description>PD Games Volume 027 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2522,7 +2522,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd027a" cloneof="asspd027" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 027 (Hacked by ALE)</description>
+ <description>PD Games Volume 027 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2534,7 +2534,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd027b" cloneof="asspd027" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 027 (Overdumped?)</description>
+ <description>PD Games Volume 027 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2546,7 +2546,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd028" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 028 (Alt)</description>
+ <description>PD Games Volume 028 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2558,7 +2558,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd028a" cloneof="asspd028" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 028 (Hacked by ALE)</description>
+ <description>PD Games Volume 028 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2570,7 +2570,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd028b" cloneof="asspd028" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 028 (Overdumped?)</description>
+ <description>PD Games Volume 028 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2594,7 +2594,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd029a" cloneof="asspd029" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 029 (Hacked by ALE)</description>
+ <description>PD Games Volume 029 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2606,7 +2606,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd029b" cloneof="asspd029" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 029 (Overdumped?)</description>
+ <description>PD Games Volume 029 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2630,7 +2630,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd030" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 030 (Alt 2)</description>
+ <description>PD Games Volume 030 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2642,7 +2642,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd030a" cloneof="asspd030" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 030 (Alt)</description>
+ <description>PD Games Volume 030 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2654,7 +2654,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd030b" cloneof="asspd030" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 030 (Hacked by ALE)</description>
+ <description>PD Games Volume 030 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2666,7 +2666,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd030c" cloneof="asspd030" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 030 (Overdumped?)</description>
+ <description>PD Games Volume 030 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2678,7 +2678,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd031" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 031 (Alt)</description>
+ <description>PD Games Volume 031 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2690,7 +2690,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd031a" cloneof="asspd031" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 031 (Hacked by ALE)</description>
+ <description>PD Games Volume 031 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2702,7 +2702,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd031b" cloneof="asspd031" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 031 (Overdumped?)</description>
+ <description>PD Games Volume 031 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2714,7 +2714,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd032" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 032 (Alt)</description>
+ <description>PD Games Volume 032 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2726,7 +2726,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd032a" cloneof="asspd032" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 032 (Hacked by ALE)</description>
+ <description>PD Games Volume 032 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2738,7 +2738,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd032b" cloneof="asspd032" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 032 (Overdumped?)</description>
+ <description>PD Games Volume 032 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2750,7 +2750,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd033" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 033 (Alt)</description>
+ <description>PD Games Volume 033 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2762,7 +2762,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd033a" cloneof="asspd033" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 033 (Hacked by ALE)</description>
+ <description>PD Games Volume 033 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2774,7 +2774,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd033b" cloneof="asspd033" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 033 (Overdumped?)</description>
+ <description>PD Games Volume 033 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2810,7 +2810,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd034b" cloneof="asspd034" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 034 (Hacked by ALE)</description>
+ <description>PD Games Volume 034 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2822,7 +2822,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd034c" cloneof="asspd034" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 034 (Overdumped?)</description>
+ <description>PD Games Volume 034 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2846,7 +2846,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd035a" cloneof="asspd035" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 035 (Hacked by ALE)</description>
+ <description>PD Games Volume 035 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2858,7 +2858,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd035b" cloneof="asspd035" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 035 (older menu, not for A1200) (Overdumped?)</description>
+ <description>PD Games Volume 035 (older menu, not for A1200) (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2870,7 +2870,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd036" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 036 (Alt)</description>
+ <description>PD Games Volume 036 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2882,7 +2882,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd036a" cloneof="asspd036" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 036 (older menu) (Hacked by ALE)</description>
+ <description>PD Games Volume 036 (older menu) (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2894,7 +2894,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd036b" cloneof="asspd036" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 036 (Overdumped?)</description>
+ <description>PD Games Volume 036 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2906,7 +2906,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd037" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 037 (Alt)</description>
+ <description>PD Games Volume 037 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2918,7 +2918,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd037a" cloneof="asspd037" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 037 (Hacked by ALE)</description>
+ <description>PD Games Volume 037 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2930,7 +2930,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd037b" cloneof="asspd037" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 037 (Overdumped?)</description>
+ <description>PD Games Volume 037 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2942,7 +2942,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd038" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 038 (Alt)</description>
+ <description>PD Games Volume 038 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2954,7 +2954,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd038a" cloneof="asspd038" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 038 (Hacked by ALE)</description>
+ <description>PD Games Volume 038 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2966,7 +2966,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd038b" cloneof="asspd038" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 038 (Overdumped?)</description>
+ <description>PD Games Volume 038 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2978,7 +2978,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd039" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 039 (Alt)</description>
+ <description>PD Games Volume 039 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2990,7 +2990,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd039a" cloneof="asspd039" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 039 (Hacked by ALE)</description>
+ <description>PD Games Volume 039 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3002,7 +3002,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd039b" cloneof="asspd039" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 039 (Overdumped?)</description>
+ <description>PD Games Volume 039 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3014,7 +3014,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd040" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 040 (Alt)</description>
+ <description>PD Games Volume 040 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3026,7 +3026,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd040a" cloneof="asspd040" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 040 (Hacked by ALE)</description>
+ <description>PD Games Volume 040 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3038,7 +3038,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd040b" cloneof="asspd040" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 040 (Overdumped?)</description>
+ <description>PD Games Volume 040 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3050,7 +3050,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd041" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 041 (Alt)</description>
+ <description>PD Games Volume 041 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3062,7 +3062,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd041a" cloneof="asspd041" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 041 (Hacked by ALE)</description>
+ <description>PD Games Volume 041 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3074,7 +3074,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd041b" cloneof="asspd041" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 041 (Overdumped?)</description>
+ <description>PD Games Volume 041 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3086,7 +3086,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd042" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 042 (Alt)</description>
+ <description>PD Games Volume 042 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3098,7 +3098,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd042a" cloneof="asspd042" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 042 (Hacked by ALE)</description>
+ <description>PD Games Volume 042 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3110,7 +3110,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd042b" cloneof="asspd042" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 042 (Overdumped?)</description>
+ <description>PD Games Volume 042 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3122,7 +3122,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd043" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 043 (Alt)</description>
+ <description>PD Games Volume 043 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3134,7 +3134,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd043a" cloneof="asspd043" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 043 (Hacked by ALE)</description>
+ <description>PD Games Volume 043 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3146,7 +3146,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd043b" cloneof="asspd043" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 043 (Overdumped?)</description>
+ <description>PD Games Volume 043 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3158,7 +3158,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd044" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 044 (Alt)</description>
+ <description>PD Games Volume 044 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3170,7 +3170,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd044a" cloneof="asspd044" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 044 (Hacked by ALE)</description>
+ <description>PD Games Volume 044 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3182,7 +3182,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd044b" cloneof="asspd044" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 044 (Overdumped?)</description>
+ <description>PD Games Volume 044 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3194,7 +3194,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd045" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 045 (Alt)</description>
+ <description>PD Games Volume 045 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3206,7 +3206,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd045a" cloneof="asspd045" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 045 (Hacked by ALE)</description>
+ <description>PD Games Volume 045 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3218,7 +3218,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd045b" cloneof="asspd045" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 045 (Overdumped?)</description>
+ <description>PD Games Volume 045 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3230,7 +3230,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd046" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 046 (Alt)</description>
+ <description>PD Games Volume 046 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3242,7 +3242,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd046a" cloneof="asspd046" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 046 (Hacked by ALE)</description>
+ <description>PD Games Volume 046 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3266,7 +3266,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd046c" cloneof="asspd046" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 046 (Overdumped?)</description>
+ <description>PD Games Volume 046 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3278,7 +3278,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd047" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 047 (Alt)</description>
+ <description>PD Games Volume 047 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3290,7 +3290,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd047a" cloneof="asspd047" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 047 (Hacked by ALE)</description>
+ <description>PD Games Volume 047 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3302,7 +3302,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd047b" cloneof="asspd047" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 047 (Overdumped?)</description>
+ <description>PD Games Volume 047 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3314,7 +3314,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd048" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 048 (Alt)</description>
+ <description>PD Games Volume 048 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3326,7 +3326,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd048a" cloneof="asspd048" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 048 (Hacked by ALE)</description>
+ <description>PD Games Volume 048 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3338,7 +3338,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd048b" cloneof="asspd048" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 048 (Overdumped?)</description>
+ <description>PD Games Volume 048 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3350,7 +3350,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd049" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 049 (Alt)</description>
+ <description>PD Games Volume 049 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3362,7 +3362,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd049a" cloneof="asspd049" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 049 (Hacked by ALE)</description>
+ <description>PD Games Volume 049 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3374,7 +3374,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd049b" cloneof="asspd049" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 049 (Overdumped?)</description>
+ <description>PD Games Volume 049 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3386,7 +3386,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd050" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 050 (Alt)</description>
+ <description>PD Games Volume 050 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3398,7 +3398,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd050a" cloneof="asspd050" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 050 (Hacked by ALE)</description>
+ <description>PD Games Volume 050 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3410,7 +3410,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd050b" cloneof="asspd050" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 050 (Overdumped?)</description>
+ <description>PD Games Volume 050 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3423,7 +3423,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
<software name="asspd051" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 051 (Hacked by ALE)</description>
+ <description>PD Games Volume 051 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3435,7 +3435,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd051a" cloneof="asspd051" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 051 (Overdumped?)</description>
+ <description>PD Games Volume 051 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3447,7 +3447,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd052" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 052 (Hacked by ALE)</description>
+ <description>PD Games Volume 052 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3459,7 +3459,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd052a" cloneof="asspd052" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 052 (Overdumped?)</description>
+ <description>PD Games Volume 052 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3471,7 +3471,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd053" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 053 (Alt)</description>
+ <description>PD Games Volume 053 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3483,7 +3483,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd053a" cloneof="asspd053" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 053 (Hacked by ALE)</description>
+ <description>PD Games Volume 053 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3495,7 +3495,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd053b" cloneof="asspd053" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 053 (Overdumped?)</description>
+ <description>PD Games Volume 053 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3507,7 +3507,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd054" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 054 (Alt)</description>
+ <description>PD Games Volume 054 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3519,7 +3519,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd054a" cloneof="asspd054" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 054 (Hacked by ALE)</description>
+ <description>PD Games Volume 054 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3531,7 +3531,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd054b" cloneof="asspd054" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 054 (Overdumped?)</description>
+ <description>PD Games Volume 054 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3543,7 +3543,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd055" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 055 (Alt)</description>
+ <description>PD Games Volume 055 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3555,7 +3555,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd055a" cloneof="asspd055" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 055 (Hacked by ALE)</description>
+ <description>PD Games Volume 055 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3567,7 +3567,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd055b" cloneof="asspd055" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 055 (Overdumped?)</description>
+ <description>PD Games Volume 055 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3579,7 +3579,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd056" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 056 (Alt)</description>
+ <description>PD Games Volume 056 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3591,7 +3591,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd056a" cloneof="asspd056" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 056 (Hacked by ALE)</description>
+ <description>PD Games Volume 056 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3603,7 +3603,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd056b" cloneof="asspd056" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 056 (Overdumped?)</description>
+ <description>PD Games Volume 056 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3615,7 +3615,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd057" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 057 (Hacked by ALE)</description>
+ <description>PD Games Volume 057 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3627,7 +3627,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd057a" cloneof="asspd057" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 057 (Overdumped?)</description>
+ <description>PD Games Volume 057 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3639,7 +3639,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd058" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 058 (Alt)</description>
+ <description>PD Games Volume 058 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3651,7 +3651,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd058a" cloneof="asspd058" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 058 (Hacked by ALE)</description>
+ <description>PD Games Volume 058 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3663,7 +3663,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd058b" cloneof="asspd058" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 058 (Overdumped?)</description>
+ <description>PD Games Volume 058 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3675,7 +3675,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd059" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 059 (Alt)</description>
+ <description>PD Games Volume 059 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3687,7 +3687,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd059a" cloneof="asspd059" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 059 (Hacked by ALE)</description>
+ <description>PD Games Volume 059 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3699,7 +3699,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd059b" cloneof="asspd059" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 059 (Overdumped?)</description>
+ <description>PD Games Volume 059 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3711,7 +3711,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd060" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 060 (Alt)</description>
+ <description>PD Games Volume 060 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3723,7 +3723,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd060a" cloneof="asspd060" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 060 (Overdumped?)</description>
+ <description>PD Games Volume 060 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3735,7 +3735,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd061" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 061 (Hacked by ALE)</description>
+ <description>PD Games Volume 061 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3747,7 +3747,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd061a" cloneof="asspd061" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 061 (Overdumped?)</description>
+ <description>PD Games Volume 061 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3759,7 +3759,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd062" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 062 (Alt)</description>
+ <description>PD Games Volume 062 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3771,7 +3771,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd062a" cloneof="asspd062" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 062 (Hacked by ALE)</description>
+ <description>PD Games Volume 062 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3783,7 +3783,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd062b" cloneof="asspd062" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 062 (Overdumped?)</description>
+ <description>PD Games Volume 062 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3795,7 +3795,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd063" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 063 (Hacked by ALE)</description>
+ <description>PD Games Volume 063 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3807,7 +3807,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd063a" cloneof="asspd063" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 063 (Overdumped?)</description>
+ <description>PD Games Volume 063 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3819,7 +3819,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd064" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 064 (Hacked by ALE)</description>
+ <description>PD Games Volume 064 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3831,7 +3831,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd064a" cloneof="asspd064" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 064 (Overdumped?)</description>
+ <description>PD Games Volume 064 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3843,7 +3843,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd065" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 065 (Hacked by ALE)</description>
+ <description>PD Games Volume 065 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3855,7 +3855,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd065a" cloneof="asspd065" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 065 (Overdumped?)</description>
+ <description>PD Games Volume 065 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3867,7 +3867,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd066" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 066 (Alt)</description>
+ <description>PD Games Volume 066 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3879,7 +3879,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd066a" cloneof="asspd066" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 066 (Hacked by ALE)</description>
+ <description>PD Games Volume 066 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3891,7 +3891,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd066b" cloneof="asspd066" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 066 (Overdumped?)</description>
+ <description>PD Games Volume 066 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3903,7 +3903,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd067" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 067 (Hacked by ALE)</description>
+ <description>PD Games Volume 067 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3915,7 +3915,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd067a" cloneof="asspd067" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 067 (Overdumped?)</description>
+ <description>PD Games Volume 067 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3927,7 +3927,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd068" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 068 (Hacked by ALE)</description>
+ <description>PD Games Volume 068 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3939,7 +3939,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd068a" cloneof="asspd068" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 068 (Overdumped?)</description>
+ <description>PD Games Volume 068 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3951,7 +3951,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd069" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 069 (Hacked by ALE)</description>
+ <description>PD Games Volume 069 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3963,7 +3963,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd069a" cloneof="asspd069" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 069 (Overdumped?)</description>
+ <description>PD Games Volume 069 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3975,7 +3975,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd070" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 070 (Hacked by ALE)</description>
+ <description>PD Games Volume 070 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3987,7 +3987,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd070a" cloneof="asspd070" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 070 (Overdumped?)</description>
+ <description>PD Games Volume 070 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -3999,7 +3999,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd071" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 071 (Hacked by ALE)</description>
+ <description>PD Games Volume 071 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4011,7 +4011,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd071a" cloneof="asspd071" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 071 (Overdumped?)</description>
+ <description>PD Games Volume 071 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4023,7 +4023,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd072" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 072 (Alt)</description>
+ <description>PD Games Volume 072 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4035,7 +4035,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd072a" cloneof="asspd072" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 072 (Hacked by ALE)</description>
+ <description>PD Games Volume 072 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4047,7 +4047,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd072b" cloneof="asspd072" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 072 (Overdumped?)</description>
+ <description>PD Games Volume 072 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4059,7 +4059,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd073" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 073 (Hacked by ALE)</description>
+ <description>PD Games Volume 073 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4071,7 +4071,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd073a" cloneof="asspd073" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 073 (Overdumped?)</description>
+ <description>PD Games Volume 073 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4083,7 +4083,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd074" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 074 (Alt)</description>
+ <description>PD Games Volume 074 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4095,7 +4095,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd074a" cloneof="asspd074" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 074 (Hacked by ALE)</description>
+ <description>PD Games Volume 074 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4107,7 +4107,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd074b" cloneof="asspd074" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 074 (Overdumped?)</description>
+ <description>PD Games Volume 074 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4119,7 +4119,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd075" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 075 (Alt)</description>
+ <description>PD Games Volume 075 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4131,7 +4131,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd075a" cloneof="asspd075" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 075 (Hacked by ALE)</description>
+ <description>PD Games Volume 075 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4143,7 +4143,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd075b" cloneof="asspd075" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 075 (Overdumped?)</description>
+ <description>PD Games Volume 075 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4155,7 +4155,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd076" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 076 (Alt)</description>
+ <description>PD Games Volume 076 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4167,7 +4167,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd076a" cloneof="asspd076" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 076 (Hacked by ALE)</description>
+ <description>PD Games Volume 076 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4179,7 +4179,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd076b" cloneof="asspd076" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 076 (Overdumped?)</description>
+ <description>PD Games Volume 076 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4191,7 +4191,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd077" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 077 (Alt)</description>
+ <description>PD Games Volume 077 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4203,7 +4203,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd077a" cloneof="asspd077" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 077 (Hacked by ALE)</description>
+ <description>PD Games Volume 077 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4215,7 +4215,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd077b" cloneof="asspd077" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 077 (Overdumped?)</description>
+ <description>PD Games Volume 077 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4227,7 +4227,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd078" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 078 (Alt)</description>
+ <description>PD Games Volume 078 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4239,7 +4239,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd078a" cloneof="asspd078" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 078 (Hacked by ALE)</description>
+ <description>PD Games Volume 078 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4251,7 +4251,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd078b" cloneof="asspd078" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 078 (Overdumped?)</description>
+ <description>PD Games Volume 078 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4263,7 +4263,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd079" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 079 (Alt)</description>
+ <description>PD Games Volume 079 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4275,7 +4275,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd079a" cloneof="asspd079" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 079 (Hacked by ALE)</description>
+ <description>PD Games Volume 079 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4287,7 +4287,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd079b" cloneof="asspd079" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 079 (Overdumped?)</description>
+ <description>PD Games Volume 079 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4299,7 +4299,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd080" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 080 (Alt)</description>
+ <description>PD Games Volume 080 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4311,7 +4311,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd080a" cloneof="asspd080" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 080 (Hacked by ALE)</description>
+ <description>PD Games Volume 080 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4323,7 +4323,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd080b" cloneof="asspd080" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 080 (Overdumped?)</description>
+ <description>PD Games Volume 080 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4335,7 +4335,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd081" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 081 (Alt)</description>
+ <description>PD Games Volume 081 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4347,7 +4347,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd081a" cloneof="asspd081" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 081 (Hacked by ALE)</description>
+ <description>PD Games Volume 081 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4359,7 +4359,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd081b" cloneof="asspd081" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 081 (Overdumped?)</description>
+ <description>PD Games Volume 081 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4371,7 +4371,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd082" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 082 (Alt)</description>
+ <description>PD Games Volume 082 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4383,7 +4383,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd082a" cloneof="asspd082" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 082 (Hacked by ALE)</description>
+ <description>PD Games Volume 082 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4395,7 +4395,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd082b" cloneof="asspd082" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 082 (Overdumped?)</description>
+ <description>PD Games Volume 082 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4407,7 +4407,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd083" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 083 (Alt)</description>
+ <description>PD Games Volume 083 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4419,7 +4419,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd083a" cloneof="asspd083" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 083 (Hacked by ALE)</description>
+ <description>PD Games Volume 083 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4431,7 +4431,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd083b" cloneof="asspd083" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 083 (Overdumped?)</description>
+ <description>PD Games Volume 083 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4443,7 +4443,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd084" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 084 (Alt)</description>
+ <description>PD Games Volume 084 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4455,7 +4455,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd084a" cloneof="asspd084" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 084 (Hacked by ALE)</description>
+ <description>PD Games Volume 084 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4467,7 +4467,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd084b" cloneof="asspd084" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 084 (Overdumped?)</description>
+ <description>PD Games Volume 084 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4479,7 +4479,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd085" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 085 (Alt)</description>
+ <description>PD Games Volume 085 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4491,7 +4491,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd085a" cloneof="asspd085" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 085 (Hacked by ALE)</description>
+ <description>PD Games Volume 085 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4503,7 +4503,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd085b" cloneof="asspd085" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 085 (Overdumped?)</description>
+ <description>PD Games Volume 085 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4515,7 +4515,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd086" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 086 (Alt)</description>
+ <description>PD Games Volume 086 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4527,7 +4527,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd086a" cloneof="asspd086" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 086 (Hacked by ALE)</description>
+ <description>PD Games Volume 086 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4539,7 +4539,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd086b" cloneof="asspd086" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 086 (Overdumped?)</description>
+ <description>PD Games Volume 086 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4551,7 +4551,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd087" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 087 (Alt)</description>
+ <description>PD Games Volume 087 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4563,7 +4563,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd087a" cloneof="asspd087" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 087 (Hacked by ALE)</description>
+ <description>PD Games Volume 087 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4575,7 +4575,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd087b" cloneof="asspd087" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 087 (Overdumped?)</description>
+ <description>PD Games Volume 087 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4587,7 +4587,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd088" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 088 (Alt)</description>
+ <description>PD Games Volume 088 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4599,7 +4599,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd088a" cloneof="asspd088" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 088 (Hacked by ALE)</description>
+ <description>PD Games Volume 088 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4611,7 +4611,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd088b" cloneof="asspd088" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 088 (Overdumped?)</description>
+ <description>PD Games Volume 088 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4623,7 +4623,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd089" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 089 (Alt)</description>
+ <description>PD Games Volume 089 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4635,7 +4635,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd089a" cloneof="asspd089" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 089 (Hacked by ALE)</description>
+ <description>PD Games Volume 089 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4647,7 +4647,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd089b" cloneof="asspd089" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 089 (Overdumped?)</description>
+ <description>PD Games Volume 089 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4659,7 +4659,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd090" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 090 (Alt)</description>
+ <description>PD Games Volume 090 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4671,7 +4671,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd090a" cloneof="asspd090" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 090 (Hacked by ALE)</description>
+ <description>PD Games Volume 090 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4683,7 +4683,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd090b" cloneof="asspd090" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 090 (Overdumped?)</description>
+ <description>PD Games Volume 090 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4695,7 +4695,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd091" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 091 (Alt)</description>
+ <description>PD Games Volume 091 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4707,7 +4707,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd091a" cloneof="asspd091" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 091 (Hacked by ALE)</description>
+ <description>PD Games Volume 091 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4719,7 +4719,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd091b" cloneof="asspd091" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 091 (Overdumped?)</description>
+ <description>PD Games Volume 091 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4731,7 +4731,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd092" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 092 (Alt)</description>
+ <description>PD Games Volume 092 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4743,7 +4743,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd092a" cloneof="asspd092" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 092 (Hacked by ALE)</description>
+ <description>PD Games Volume 092 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4755,7 +4755,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd092b" cloneof="asspd092" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 092 (Overdumped?)</description>
+ <description>PD Games Volume 092 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4767,7 +4767,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd093" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 093 (Alt)</description>
+ <description>PD Games Volume 093 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4779,7 +4779,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd093a" cloneof="asspd093" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 093 (Hacked by ALE)</description>
+ <description>PD Games Volume 093 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4791,7 +4791,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd093b" cloneof="asspd093" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 093 (Overdumped?)</description>
+ <description>PD Games Volume 093 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4803,7 +4803,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd094" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 094 (Alt)</description>
+ <description>PD Games Volume 094 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4815,7 +4815,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd094a" cloneof="asspd094" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 094 (Hacked by ALE)</description>
+ <description>PD Games Volume 094 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4827,7 +4827,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd094b" cloneof="asspd094" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 094 (Overdumped?)</description>
+ <description>PD Games Volume 094 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4839,7 +4839,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd095" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 095 (Hacked by ALE)</description>
+ <description>PD Games Volume 095 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4851,7 +4851,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd095a" cloneof="asspd095" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 095 (Overdumped?)</description>
+ <description>PD Games Volume 095 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4863,7 +4863,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd096" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 096 (Alt)</description>
+ <description>PD Games Volume 096 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4875,7 +4875,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd096a" cloneof="asspd096" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 096 (Hacked by ALE)</description>
+ <description>PD Games Volume 096 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4887,7 +4887,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd096b" cloneof="asspd096" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 096 (Overdumped?)</description>
+ <description>PD Games Volume 096 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4899,7 +4899,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd097" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 097 (Alt)</description>
+ <description>PD Games Volume 097 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4911,7 +4911,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd097a" cloneof="asspd097" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 097 (Hacked by ALE)</description>
+ <description>PD Games Volume 097 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4923,7 +4923,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd097b" cloneof="asspd097" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 097 (Overdumped?)</description>
+ <description>PD Games Volume 097 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4935,7 +4935,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd098" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 098 (Alt)</description>
+ <description>PD Games Volume 098 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4947,7 +4947,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd098a" cloneof="asspd098" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 098 (Hacked by ALE)</description>
+ <description>PD Games Volume 098 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4959,7 +4959,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd098b" cloneof="asspd098" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 098 (Overdumped?)</description>
+ <description>PD Games Volume 098 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4971,7 +4971,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd099" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 099 (Alt)</description>
+ <description>PD Games Volume 099 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4983,7 +4983,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd099a" cloneof="asspd099" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 099 (Hacked by ALE)</description>
+ <description>PD Games Volume 099 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -4995,7 +4995,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd099b" cloneof="asspd099" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 099 (Overdumped?)</description>
+ <description>PD Games Volume 099 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5007,7 +5007,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd100" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 100 (Alt)</description>
+ <description>PD Games Volume 100 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5019,7 +5019,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd100a" cloneof="asspd100" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 100 (Hacked by ALE)</description>
+ <description>PD Games Volume 100 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5031,7 +5031,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd100b" cloneof="asspd100" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 100 (Overdumped?)</description>
+ <description>PD Games Volume 100 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5043,7 +5043,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd101" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 101 (Alt)</description>
+ <description>PD Games Volume 101 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5055,7 +5055,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd101a" cloneof="asspd101" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 101 (Hacked by ALE)</description>
+ <description>PD Games Volume 101 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5067,7 +5067,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd101b" cloneof="asspd101" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 101 (Overdumped?)</description>
+ <description>PD Games Volume 101 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5079,7 +5079,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd102" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 102 (Alt)</description>
+ <description>PD Games Volume 102 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5091,7 +5091,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd102a" cloneof="asspd102" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 102 (Hacked by ALE)</description>
+ <description>PD Games Volume 102 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5103,7 +5103,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd102b" cloneof="asspd102" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 102 (Overdumped?)</description>
+ <description>PD Games Volume 102 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5115,7 +5115,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd103" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 103 (Alt)</description>
+ <description>PD Games Volume 103 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5127,7 +5127,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd103a" cloneof="asspd103" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 103 (Hacked by ALE)</description>
+ <description>PD Games Volume 103 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5139,7 +5139,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd103b" cloneof="asspd103" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 103 (Overdumped?)</description>
+ <description>PD Games Volume 103 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5151,7 +5151,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd104" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 104 (Alt)</description>
+ <description>PD Games Volume 104 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5163,7 +5163,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd104a" cloneof="asspd104" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 104 (Hacked by ALE)</description>
+ <description>PD Games Volume 104 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5175,7 +5175,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd104b" cloneof="asspd104" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 104 (Overdumped?)</description>
+ <description>PD Games Volume 104 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5187,7 +5187,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd105" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 105 (Alt)</description>
+ <description>PD Games Volume 105 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5199,7 +5199,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd105a" cloneof="asspd105" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 105 (Hacked by ALE)</description>
+ <description>PD Games Volume 105 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5211,7 +5211,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd105b" cloneof="asspd105" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 105 (Overdumped?)</description>
+ <description>PD Games Volume 105 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5223,7 +5223,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd106" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 106 (Alt)</description>
+ <description>PD Games Volume 106 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5235,7 +5235,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd106a" cloneof="asspd106" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 106 (Hacked by ALE)</description>
+ <description>PD Games Volume 106 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5247,7 +5247,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd106b" cloneof="asspd106" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 106 (Overdumped?)</description>
+ <description>PD Games Volume 106 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5259,7 +5259,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd107" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 107 (Hacked by ALE)</description>
+ <description>PD Games Volume 107 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5271,7 +5271,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd107a" cloneof="asspd107" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 107 (Overdumped?)</description>
+ <description>PD Games Volume 107 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5283,7 +5283,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd108" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 108 (Alt)</description>
+ <description>PD Games Volume 108 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5295,7 +5295,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd108a" cloneof="asspd108" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 108 (Hacked by ALE)</description>
+ <description>PD Games Volume 108 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5307,7 +5307,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd108b" cloneof="asspd108" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 108 (Overdumped?)</description>
+ <description>PD Games Volume 108 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5319,7 +5319,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd109" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 109 (Alt)</description>
+ <description>PD Games Volume 109 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5331,7 +5331,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd109a" cloneof="asspd109" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 109 (Hacked by ALE)</description>
+ <description>PD Games Volume 109 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5343,7 +5343,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd109b" cloneof="asspd109" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 109 (Overdumped?)</description>
+ <description>PD Games Volume 109 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5355,7 +5355,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd110" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 110 (Alt)</description>
+ <description>PD Games Volume 110 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5367,7 +5367,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd110a" cloneof="asspd110" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 110 (Hacked by ALE)</description>
+ <description>PD Games Volume 110 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5379,7 +5379,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd110b" cloneof="asspd110" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 110 (Overdumped?)</description>
+ <description>PD Games Volume 110 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5391,7 +5391,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd111" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 111 (Alt)</description>
+ <description>PD Games Volume 111 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5403,7 +5403,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd111a" cloneof="asspd111" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 111 (Hacked by ALE)</description>
+ <description>PD Games Volume 111 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5415,7 +5415,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd111b" cloneof="asspd111" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 111 (Overdumped?)</description>
+ <description>PD Games Volume 111 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5427,7 +5427,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd112" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 112 (Alt)</description>
+ <description>PD Games Volume 112 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5439,7 +5439,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd112a" cloneof="asspd112" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 112 (Hacked by ALE)</description>
+ <description>PD Games Volume 112 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5451,7 +5451,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd112b" cloneof="asspd112" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 112 (Overdumped?)</description>
+ <description>PD Games Volume 112 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5463,7 +5463,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd113" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 113 (Alt)</description>
+ <description>PD Games Volume 113 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5475,7 +5475,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd113a" cloneof="asspd113" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 113 (Hacked by ALE)</description>
+ <description>PD Games Volume 113 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5487,7 +5487,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd113b" cloneof="asspd113" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 113 (Overdumped?)</description>
+ <description>PD Games Volume 113 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5499,7 +5499,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd114" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 114 (Alt)</description>
+ <description>PD Games Volume 114 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5511,7 +5511,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd114a" cloneof="asspd114" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 114 (Hacked by ALE)</description>
+ <description>PD Games Volume 114 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5523,7 +5523,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd114b" cloneof="asspd114" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 114 (Overdumped?)</description>
+ <description>PD Games Volume 114 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5535,7 +5535,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd115" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 115 (Alt)</description>
+ <description>PD Games Volume 115 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5547,7 +5547,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd115a" cloneof="asspd115" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 115 (Hacked by ALE)</description>
+ <description>PD Games Volume 115 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5559,7 +5559,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd115b" cloneof="asspd115" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 115 (Overdumped?)</description>
+ <description>PD Games Volume 115 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5571,7 +5571,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd116" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 116 (Alt)</description>
+ <description>PD Games Volume 116 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5583,7 +5583,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd116a" cloneof="asspd116" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 116 (Hacked by ALE)</description>
+ <description>PD Games Volume 116 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5595,7 +5595,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd116b" cloneof="asspd116" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 116 (Overdumped?)</description>
+ <description>PD Games Volume 116 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5607,7 +5607,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd117" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 117 (Alt)</description>
+ <description>PD Games Volume 117 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5619,7 +5619,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd117a" cloneof="asspd117" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 117 (Hacked by ALE)</description>
+ <description>PD Games Volume 117 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5631,7 +5631,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd117b" cloneof="asspd117" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 117 (Overdumped?)</description>
+ <description>PD Games Volume 117 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5643,7 +5643,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd118" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 118 (Alt)</description>
+ <description>PD Games Volume 118 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5655,7 +5655,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd118a" cloneof="asspd118" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 118 (Hacked by ALE)</description>
+ <description>PD Games Volume 118 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5667,7 +5667,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd118b" cloneof="asspd118" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 118 (Overdumped?)</description>
+ <description>PD Games Volume 118 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5679,7 +5679,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd119" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 119 (Alt)</description>
+ <description>PD Games Volume 119 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5691,7 +5691,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd119a" cloneof="asspd119" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 119 (Hacked by ALE)</description>
+ <description>PD Games Volume 119 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5703,7 +5703,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd119b" cloneof="asspd119" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 119 (Overdumped?)</description>
+ <description>PD Games Volume 119 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5715,7 +5715,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd120" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 120 (Alt)</description>
+ <description>PD Games Volume 120 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5727,7 +5727,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd120a" cloneof="asspd120" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 120 (Hacked by ALE)</description>
+ <description>PD Games Volume 120 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5739,7 +5739,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd120b" cloneof="asspd120" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 120 (Overdumped?)</description>
+ <description>PD Games Volume 120 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5751,7 +5751,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd121" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 121 (Alt)</description>
+ <description>PD Games Volume 121 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5763,7 +5763,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd121a" cloneof="asspd121" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 121 (Hacked by ALE)</description>
+ <description>PD Games Volume 121 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5775,7 +5775,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd121b" cloneof="asspd121" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 121 (Overdumped?)</description>
+ <description>PD Games Volume 121 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5787,7 +5787,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd122" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 122 (Alt)</description>
+ <description>PD Games Volume 122 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5799,7 +5799,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd122a" cloneof="asspd122" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 122 (Hacked by ALE)</description>
+ <description>PD Games Volume 122 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5811,7 +5811,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd122b" cloneof="asspd122" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 122 (Overdumped?)</description>
+ <description>PD Games Volume 122 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5823,7 +5823,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd123" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 123 (Alt)</description>
+ <description>PD Games Volume 123 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5835,7 +5835,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd123a" cloneof="asspd123" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 123 (Hacked by ALE)</description>
+ <description>PD Games Volume 123 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5847,7 +5847,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd123b" cloneof="asspd123" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 123 (Overdumped?)</description>
+ <description>PD Games Volume 123 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5859,7 +5859,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd124" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 124 (Alt)</description>
+ <description>PD Games Volume 124 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5871,7 +5871,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd124a" cloneof="asspd124" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 124 (Hacked by ALE)</description>
+ <description>PD Games Volume 124 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5883,7 +5883,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd124b" cloneof="asspd124" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 124 (Overdumped?)</description>
+ <description>PD Games Volume 124 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5895,7 +5895,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd125" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 125 (Alt)</description>
+ <description>PD Games Volume 125 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5907,7 +5907,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd125a" cloneof="asspd125" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 125 (Hacked by ALE)</description>
+ <description>PD Games Volume 125 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5919,7 +5919,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd125b" cloneof="asspd125" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 125 (Overdumped?)</description>
+ <description>PD Games Volume 125 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5931,7 +5931,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd126" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 126 (Alt)</description>
+ <description>PD Games Volume 126 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5943,7 +5943,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd126a" cloneof="asspd126" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 126 (Hacked by ALE)</description>
+ <description>PD Games Volume 126 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5955,7 +5955,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd126b" cloneof="asspd126" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 126 (Overdumped?)</description>
+ <description>PD Games Volume 126 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5967,7 +5967,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd127" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 127 (Alt)</description>
+ <description>PD Games Volume 127 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5979,7 +5979,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd127a" cloneof="asspd127" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 127 (Hacked by ALE)</description>
+ <description>PD Games Volume 127 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -5991,7 +5991,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd127b" cloneof="asspd127" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 127 (Overdumped?)</description>
+ <description>PD Games Volume 127 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6003,7 +6003,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd128" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 128 (Alt)</description>
+ <description>PD Games Volume 128 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6015,7 +6015,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd128a" cloneof="asspd128" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 128 (Hacked by ALE)</description>
+ <description>PD Games Volume 128 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6027,7 +6027,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd128b" cloneof="asspd128" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 128 (Overdumped?)</description>
+ <description>PD Games Volume 128 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6039,7 +6039,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd129" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 129 (Hacked by ALE)</description>
+ <description>PD Games Volume 129 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6051,7 +6051,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd129a" cloneof="asspd129" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 129 (Overdumped?)</description>
+ <description>PD Games Volume 129 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6063,7 +6063,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd130" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 130 (Alt)</description>
+ <description>PD Games Volume 130 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6075,7 +6075,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd130a" cloneof="asspd130" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 130 (Hacked by ALE)</description>
+ <description>PD Games Volume 130 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6087,7 +6087,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd130b" cloneof="asspd130" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 130 (Overdumped?)</description>
+ <description>PD Games Volume 130 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6099,7 +6099,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd131" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 131 (Alt)</description>
+ <description>PD Games Volume 131 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6111,7 +6111,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd131a" cloneof="asspd131" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 131 (Hacked by ALE)</description>
+ <description>PD Games Volume 131 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6123,7 +6123,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd131b" cloneof="asspd131" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 131 (Overdumped?)</description>
+ <description>PD Games Volume 131 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6135,7 +6135,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd132" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 132 (Alt)</description>
+ <description>PD Games Volume 132 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6147,7 +6147,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd132a" cloneof="asspd132" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 132 (Hacked by ALE)</description>
+ <description>PD Games Volume 132 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6159,7 +6159,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd132b" cloneof="asspd132" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 132 (Overdumped?)</description>
+ <description>PD Games Volume 132 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6171,7 +6171,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd133" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 133 (Alt)</description>
+ <description>PD Games Volume 133 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6183,7 +6183,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd133a" cloneof="asspd133" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 133 (Hacked by ALE)</description>
+ <description>PD Games Volume 133 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6195,7 +6195,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd133b" cloneof="asspd133" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 133 (Overdumped?)</description>
+ <description>PD Games Volume 133 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6207,7 +6207,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd134" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 134 (Alt)</description>
+ <description>PD Games Volume 134 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6219,7 +6219,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd134a" cloneof="asspd134" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 134 (Hacked by ALE)</description>
+ <description>PD Games Volume 134 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6231,7 +6231,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd134b" cloneof="asspd134" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 134 (Overdumped?)</description>
+ <description>PD Games Volume 134 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6243,7 +6243,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd135" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 135 (Alt)</description>
+ <description>PD Games Volume 135 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6255,7 +6255,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd135a" cloneof="asspd135" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 135 (Hacked by ALE)</description>
+ <description>PD Games Volume 135 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6267,7 +6267,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd135b" cloneof="asspd135" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 135 (Overdumped?)</description>
+ <description>PD Games Volume 135 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6279,7 +6279,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd136" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 136 (Alt)</description>
+ <description>PD Games Volume 136 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6291,7 +6291,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd136a" cloneof="asspd136" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 136 (Hacked by ALE)</description>
+ <description>PD Games Volume 136 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6303,7 +6303,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd136b" cloneof="asspd136" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 136 (Overdumped?)</description>
+ <description>PD Games Volume 136 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6315,7 +6315,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd137" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 137 (Alt)</description>
+ <description>PD Games Volume 137 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6327,7 +6327,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd137a" cloneof="asspd137" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 137 (Hacked by ALE)</description>
+ <description>PD Games Volume 137 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6339,7 +6339,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd137b" cloneof="asspd137" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 137 (Overdumped?)</description>
+ <description>PD Games Volume 137 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6351,7 +6351,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd138" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 138 (Alt)</description>
+ <description>PD Games Volume 138 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6363,7 +6363,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd138a" cloneof="asspd138" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 138 (Hacked by ALE)</description>
+ <description>PD Games Volume 138 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6375,7 +6375,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd138b" cloneof="asspd138" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 138 (Overdumped?)</description>
+ <description>PD Games Volume 138 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6387,7 +6387,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd139" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 139 (Alt)</description>
+ <description>PD Games Volume 139 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6399,7 +6399,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd139a" cloneof="asspd139" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 139 (Hacked by ALE)</description>
+ <description>PD Games Volume 139 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6411,7 +6411,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd139b" cloneof="asspd139" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 139 (Overdumped?)</description>
+ <description>PD Games Volume 139 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6423,7 +6423,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd140" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 140 (Alt)</description>
+ <description>PD Games Volume 140 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6435,7 +6435,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd140a" cloneof="asspd140" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 140 (Hacked by ALE)</description>
+ <description>PD Games Volume 140 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6447,7 +6447,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd140b" cloneof="asspd140" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 140 (Overdumped?)</description>
+ <description>PD Games Volume 140 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6459,7 +6459,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd141" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 141 (Alt)</description>
+ <description>PD Games Volume 141 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6471,7 +6471,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd141a" cloneof="asspd141" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 141 (Hacked by ALE)</description>
+ <description>PD Games Volume 141 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6483,7 +6483,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd141b" cloneof="asspd141" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 141 (Overdumped?)</description>
+ <description>PD Games Volume 141 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6495,7 +6495,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd142" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 142 (Hacked by ALE)</description>
+ <description>PD Games Volume 142 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6507,7 +6507,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd142a" cloneof="asspd142" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 142 (Overdumped?)</description>
+ <description>PD Games Volume 142 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6519,7 +6519,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd143" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 143 (Hacked by ALE)</description>
+ <description>PD Games Volume 143 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6531,7 +6531,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd143a" cloneof="asspd143" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 143 (Overdumped?)</description>
+ <description>PD Games Volume 143 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6543,7 +6543,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd144" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 144 (Hacked by ALE)</description>
+ <description>PD Games Volume 144 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6555,7 +6555,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd144a" cloneof="asspd144" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 144 (Overdumped?)</description>
+ <description>PD Games Volume 144 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6567,7 +6567,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd145" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 145 (Hacked by ALE)</description>
+ <description>PD Games Volume 145 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6579,7 +6579,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd145a" cloneof="asspd145" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 145 (Overdumped?)</description>
+ <description>PD Games Volume 145 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6591,7 +6591,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd146" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 146 (Hacked by ALE)</description>
+ <description>PD Games Volume 146 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6603,7 +6603,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd146a" cloneof="asspd146" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 146 (Overdumped?)</description>
+ <description>PD Games Volume 146 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6615,7 +6615,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd147" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 147 (Hacked by ALE)</description>
+ <description>PD Games Volume 147 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6627,7 +6627,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd147a" cloneof="asspd147" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 147 (Overdumped?)</description>
+ <description>PD Games Volume 147 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6639,7 +6639,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd148" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 148 (Hacked by ALE)</description>
+ <description>PD Games Volume 148 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6651,7 +6651,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd148a" cloneof="asspd148" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 148 (Overdumped?)</description>
+ <description>PD Games Volume 148 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6663,7 +6663,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd149" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 149 (Hacked by ALE)</description>
+ <description>PD Games Volume 149 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6675,7 +6675,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd149a" cloneof="asspd149" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 149 (Overdumped?)</description>
+ <description>PD Games Volume 149 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6687,7 +6687,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd150" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 150 (Hacked by ALE)</description>
+ <description>PD Games Volume 150 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6699,7 +6699,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd150a" cloneof="asspd150" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 150 (Overdumped?)</description>
+ <description>PD Games Volume 150 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6711,7 +6711,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd151" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 151 (Hacked by ALE)</description>
+ <description>PD Games Volume 151 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6723,7 +6723,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd151a" cloneof="asspd151" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 151 (Overdumped?)</description>
+ <description>PD Games Volume 151 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6735,7 +6735,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd152" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 152 (Hacked by ALE)</description>
+ <description>PD Games Volume 152 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6747,7 +6747,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd152a" cloneof="asspd152" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 152 (Overdumped?)</description>
+ <description>PD Games Volume 152 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6759,7 +6759,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd153" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 153 (Hacked by ALE)</description>
+ <description>PD Games Volume 153 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6771,7 +6771,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd153a" cloneof="asspd153" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 153 (Overdumped?)</description>
+ <description>PD Games Volume 153 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6783,7 +6783,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd154" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 154 (Hacked by ALE)</description>
+ <description>PD Games Volume 154 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6795,7 +6795,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd154a" cloneof="asspd154" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 154 (Overdumped?)</description>
+ <description>PD Games Volume 154 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6807,7 +6807,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd155" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 155 (Hacked by ALE)</description>
+ <description>PD Games Volume 155 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6819,7 +6819,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd155a" cloneof="asspd155" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 155 (Overdumped?)</description>
+ <description>PD Games Volume 155 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6831,7 +6831,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd156" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 156 (Hacked by ALE)</description>
+ <description>PD Games Volume 156 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6843,7 +6843,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd156a" cloneof="asspd156" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 156 (Overdumped?)</description>
+ <description>PD Games Volume 156 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6855,7 +6855,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd157" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 157 (Hacked by ALE)</description>
+ <description>PD Games Volume 157 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6867,7 +6867,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd157a" cloneof="asspd157" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 157 (Overdumped?)</description>
+ <description>PD Games Volume 157 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6879,7 +6879,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd158" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 158 (Hacked by ALE)</description>
+ <description>PD Games Volume 158 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6891,7 +6891,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd158a" cloneof="asspd158" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 158 (Overdumped?)</description>
+ <description>PD Games Volume 158 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6903,7 +6903,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd159" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 159 (Hacked by ALE)</description>
+ <description>PD Games Volume 159 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6915,7 +6915,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd159a" cloneof="asspd159" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 159 (Overdumped?)</description>
+ <description>PD Games Volume 159 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6927,7 +6927,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd160" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 160 (Hacked by ALE)</description>
+ <description>PD Games Volume 160 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6939,7 +6939,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd160a" cloneof="asspd160" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 160 (Overdumped?)</description>
+ <description>PD Games Volume 160 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6951,7 +6951,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd161" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 161 (Hacked by ALE)</description>
+ <description>PD Games Volume 161 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6963,7 +6963,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd161a" cloneof="asspd161" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 161 (Overdumped?)</description>
+ <description>PD Games Volume 161 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6975,7 +6975,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd162" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 162 (Hacked by ALE)</description>
+ <description>PD Games Volume 162 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6987,7 +6987,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd162a" cloneof="asspd162" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 162 (Overdumped?)</description>
+ <description>PD Games Volume 162 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -6999,7 +6999,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd163" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 163 (Hacked by ALE)</description>
+ <description>PD Games Volume 163 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7011,7 +7011,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd163a" cloneof="asspd163" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 163 (Overdumped?)</description>
+ <description>PD Games Volume 163 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7023,7 +7023,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd164" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 164 (Hacked by ALE)</description>
+ <description>PD Games Volume 164 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7035,7 +7035,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd164a" cloneof="asspd164" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 164 (Overdumped?)</description>
+ <description>PD Games Volume 164 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7047,7 +7047,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd165" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 165 (Hacked by ALE)</description>
+ <description>PD Games Volume 165 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7059,7 +7059,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd165a" cloneof="asspd165" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 165 (Overdumped?)</description>
+ <description>PD Games Volume 165 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7071,7 +7071,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd166" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 166 (Hacked by ALE)</description>
+ <description>PD Games Volume 166 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7083,7 +7083,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd166a" cloneof="asspd166" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 166 (Overdumped?)</description>
+ <description>PD Games Volume 166 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7095,7 +7095,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd167" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 167 (Hacked by ALE)</description>
+ <description>PD Games Volume 167 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7107,7 +7107,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd167a" cloneof="asspd167" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 167 (Overdumped?)</description>
+ <description>PD Games Volume 167 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7119,7 +7119,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd168" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 168 (Hacked by ALE)</description>
+ <description>PD Games Volume 168 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7131,7 +7131,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd168a" cloneof="asspd168" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 168 (Overdumped?)</description>
+ <description>PD Games Volume 168 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7143,7 +7143,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd169" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 169 (Hacked by ALE)</description>
+ <description>PD Games Volume 169 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7155,7 +7155,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd169a" cloneof="asspd169" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 169 (Overdumped?)</description>
+ <description>PD Games Volume 169 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7167,7 +7167,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd170" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 170 (Hacked by ALE)</description>
+ <description>PD Games Volume 170 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7179,7 +7179,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd170a" cloneof="asspd170" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 170 (Overdumped?)</description>
+ <description>PD Games Volume 170 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7191,7 +7191,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd171" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 171 (Hacked by ALE)</description>
+ <description>PD Games Volume 171 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7203,7 +7203,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd171a" cloneof="asspd171" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 171 (Overdumped?)</description>
+ <description>PD Games Volume 171 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7215,7 +7215,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd172" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 172 (Hacked by ALE)</description>
+ <description>PD Games Volume 172 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7227,7 +7227,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd172a" cloneof="asspd172" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 172 (Overdumped?)</description>
+ <description>PD Games Volume 172 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7239,7 +7239,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd173" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 173 (Hacked by ALE)</description>
+ <description>PD Games Volume 173 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7251,7 +7251,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd173a" cloneof="asspd173" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 173 (Overdumped?)</description>
+ <description>PD Games Volume 173 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7263,7 +7263,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd174" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 174 (Hacked by ALE)</description>
+ <description>PD Games Volume 174 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7275,7 +7275,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd174a" cloneof="asspd174" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 174 (Overdumped?)</description>
+ <description>PD Games Volume 174 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7287,7 +7287,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd175" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 175 (Hacked by ALE)</description>
+ <description>PD Games Volume 175 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7299,7 +7299,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd175a" cloneof="asspd175" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 175 (Overdumped?)</description>
+ <description>PD Games Volume 175 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7311,7 +7311,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd176" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 176 (Alt)</description>
+ <description>PD Games Volume 176 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7323,7 +7323,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd176a" cloneof="asspd176" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 176 (Hacked by ALE)</description>
+ <description>PD Games Volume 176 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7335,7 +7335,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd176b" cloneof="asspd176" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 176 (Overdumped?)</description>
+ <description>PD Games Volume 176 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7347,7 +7347,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd177" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 177 (Alt 2)</description>
+ <description>PD Games Volume 177 (alt 2)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7359,7 +7359,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd177a" cloneof="asspd177" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 177 (Alt)</description>
+ <description>PD Games Volume 177 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7371,7 +7371,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd177b" cloneof="asspd177" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 177 (Overdumped?)</description>
+ <description>PD Games Volume 177 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7383,7 +7383,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd178" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 178 (Hacked by ALE)</description>
+ <description>PD Games Volume 178 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7395,7 +7395,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd178a" cloneof="asspd178" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 178 (Overdumped?)</description>
+ <description>PD Games Volume 178 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7407,7 +7407,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd179" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 179 (Hacked by ALE)</description>
+ <description>PD Games Volume 179 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7419,7 +7419,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd179a" cloneof="asspd179" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 179 (Overdumped?)</description>
+ <description>PD Games Volume 179 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7431,7 +7431,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd180" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 180 (Hacked by ALE)</description>
+ <description>PD Games Volume 180 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7443,7 +7443,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd180a" cloneof="asspd180" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 180 (Overdumped?)</description>
+ <description>PD Games Volume 180 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7455,7 +7455,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd181" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 181 (Hacked by ALE)</description>
+ <description>PD Games Volume 181 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7467,7 +7467,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd181a" cloneof="asspd181" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 181 (Overdumped?)</description>
+ <description>PD Games Volume 181 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7479,7 +7479,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd182" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 182 (Hacked by ALE)</description>
+ <description>PD Games Volume 182 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7491,7 +7491,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd182a" cloneof="asspd182" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 182 (Overdumped?)</description>
+ <description>PD Games Volume 182 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7503,7 +7503,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd183" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 183 (Hacked by ALE)</description>
+ <description>PD Games Volume 183 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7515,7 +7515,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd183a" cloneof="asspd183" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 183 (Overdumped?)</description>
+ <description>PD Games Volume 183 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7527,7 +7527,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd184" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 184 (Hacked by ALE)</description>
+ <description>PD Games Volume 184 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7539,7 +7539,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd184a" cloneof="asspd184" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 184 (Overdumped?)</description>
+ <description>PD Games Volume 184 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7551,7 +7551,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd185" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 185 (Hacked by ALE)</description>
+ <description>PD Games Volume 185 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7563,7 +7563,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd185a" cloneof="asspd185" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 185 (Overdumped?)</description>
+ <description>PD Games Volume 185 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7575,7 +7575,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd186" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 186 (Hacked by ALE)</description>
+ <description>PD Games Volume 186 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7587,7 +7587,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd186a" cloneof="asspd186" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 186 (Overdumped?)</description>
+ <description>PD Games Volume 186 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7599,7 +7599,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd187" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 187 (Hacked by ALE)</description>
+ <description>PD Games Volume 187 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7611,7 +7611,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd187a" cloneof="asspd187" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 187 (Overdumped?)</description>
+ <description>PD Games Volume 187 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7623,7 +7623,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd188" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 188 (Hacked by ALE)</description>
+ <description>PD Games Volume 188 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7635,7 +7635,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd188a" cloneof="asspd188" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 188 (Overdumped?)</description>
+ <description>PD Games Volume 188 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7647,7 +7647,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd189" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 189 (Hacked by ALE)</description>
+ <description>PD Games Volume 189 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7659,7 +7659,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd189a" cloneof="asspd189" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 189 (Overdumped?)</description>
+ <description>PD Games Volume 189 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7671,7 +7671,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd190" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 190 (Hacked by ALE)</description>
+ <description>PD Games Volume 190 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7683,7 +7683,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd190a" cloneof="asspd190" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 190 (Overdumped?)</description>
+ <description>PD Games Volume 190 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7695,7 +7695,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd191" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 191 (Hacked by ALE)</description>
+ <description>PD Games Volume 191 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7707,7 +7707,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd191a" cloneof="asspd191" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 191 (Overdumped?)</description>
+ <description>PD Games Volume 191 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7719,7 +7719,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd192" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 192 (Hacked by ALE)</description>
+ <description>PD Games Volume 192 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7731,7 +7731,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd192a" cloneof="asspd192" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 192 (Overdumped?)</description>
+ <description>PD Games Volume 192 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7743,7 +7743,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd193" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 193 (Hacked by ALE)</description>
+ <description>PD Games Volume 193 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7755,7 +7755,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd193a" cloneof="asspd193" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 193 (Overdumped?)</description>
+ <description>PD Games Volume 193 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7767,7 +7767,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd194" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 194 (Hacked by ALE)</description>
+ <description>PD Games Volume 194 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7779,7 +7779,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd194a" cloneof="asspd194" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 194 (Overdumped?)</description>
+ <description>PD Games Volume 194 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7791,7 +7791,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd195" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 195 (Hacked by ALE)</description>
+ <description>PD Games Volume 195 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7803,7 +7803,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd195a" cloneof="asspd195" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 195 (Overdumped?)</description>
+ <description>PD Games Volume 195 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7815,7 +7815,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd196" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 196 (Hacked by ALE)</description>
+ <description>PD Games Volume 196 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7827,7 +7827,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd196a" cloneof="asspd196" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 196 (Overdumped?)</description>
+ <description>PD Games Volume 196 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7839,7 +7839,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd197" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 197 (Hacked by ALE)</description>
+ <description>PD Games Volume 197 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7851,7 +7851,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd197a" cloneof="asspd197" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 197 (Overdumped?)</description>
+ <description>PD Games Volume 197 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7863,7 +7863,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd198" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 198 (Hacked by ALE)</description>
+ <description>PD Games Volume 198 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7875,7 +7875,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd198a" cloneof="asspd198" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 198 (Overdumped?)</description>
+ <description>PD Games Volume 198 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7887,7 +7887,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd199" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 199 (Hacked by ALE)</description>
+ <description>PD Games Volume 199 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7899,7 +7899,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd199a" cloneof="asspd199" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 199 (Overdumped?)</description>
+ <description>PD Games Volume 199 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7911,7 +7911,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd200" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 200 (Alt)</description>
+ <description>PD Games Volume 200 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7923,7 +7923,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd200a" cloneof="asspd200" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 200 (Hacked by ALE)</description>
+ <description>PD Games Volume 200 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7935,7 +7935,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd200b" cloneof="asspd200" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 200 (Overdumped?)</description>
+ <description>PD Games Volume 200 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7947,7 +7947,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd201" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 201 (Alt)</description>
+ <description>PD Games Volume 201 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7959,7 +7959,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd201a" cloneof="asspd201" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 201 (Hacked by ALE)</description>
+ <description>PD Games Volume 201 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7971,7 +7971,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd201b" cloneof="asspd201" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 201 (Overdumped?)</description>
+ <description>PD Games Volume 201 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7983,7 +7983,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd202" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 202 (Hacked by ALE)</description>
+ <description>PD Games Volume 202 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -7995,7 +7995,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd202a" cloneof="asspd202" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 202 (Overdumped?)</description>
+ <description>PD Games Volume 202 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8019,7 +8019,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd203" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 203 (Alt)</description>
+ <description>PD Games Volume 203 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8031,7 +8031,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd203a" cloneof="asspd203" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 203 (Overdumped?)</description>
+ <description>PD Games Volume 203 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8043,7 +8043,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd204" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 204 (Alt)</description>
+ <description>PD Games Volume 204 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8055,7 +8055,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd204a" cloneof="asspd204" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 204 (Overdumped?)</description>
+ <description>PD Games Volume 204 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8067,7 +8067,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd205" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 205 (Alt)</description>
+ <description>PD Games Volume 205 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8079,7 +8079,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd205a" cloneof="asspd205" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 205 (Overdumped?)</description>
+ <description>PD Games Volume 205 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8091,7 +8091,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd206" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 206 (Alt)</description>
+ <description>PD Games Volume 206 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8103,7 +8103,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd206a" cloneof="asspd206" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 206 (Overdumped?)</description>
+ <description>PD Games Volume 206 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8115,7 +8115,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd207" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 207 (Alt)</description>
+ <description>PD Games Volume 207 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8127,7 +8127,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd207a" cloneof="asspd207" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 207 (Overdumped?)</description>
+ <description>PD Games Volume 207 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8139,7 +8139,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd208" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 208 (Alt)</description>
+ <description>PD Games Volume 208 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8151,7 +8151,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd208a" cloneof="asspd208" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 208 (Overdumped?)</description>
+ <description>PD Games Volume 208 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8163,7 +8163,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd209" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 209 (Alt)</description>
+ <description>PD Games Volume 209 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8175,7 +8175,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd209a" cloneof="asspd209" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 209 (Overdumped?)</description>
+ <description>PD Games Volume 209 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8187,7 +8187,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd210" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 210 (Alt)</description>
+ <description>PD Games Volume 210 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8199,7 +8199,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd210a" cloneof="asspd210" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 210 (Overdumped?)</description>
+ <description>PD Games Volume 210 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8211,7 +8211,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd211" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 211 (Hacked by ALE)</description>
+ <description>PD Games Volume 211 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8223,7 +8223,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd211a" cloneof="asspd211" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 211 (Overdumped?)</description>
+ <description>PD Games Volume 211 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8235,7 +8235,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd212" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 212 (Alt)</description>
+ <description>PD Games Volume 212 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8247,7 +8247,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd212a" cloneof="asspd212" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 212 (Overdumped?)</description>
+ <description>PD Games Volume 212 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8259,7 +8259,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd213" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 213 (Alt)</description>
+ <description>PD Games Volume 213 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8271,7 +8271,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd213a" cloneof="asspd213" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 213 (Overdumped?)</description>
+ <description>PD Games Volume 213 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8283,7 +8283,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd214" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 214 (Alt)</description>
+ <description>PD Games Volume 214 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8295,7 +8295,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd214a" cloneof="asspd214" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 214 (Overdumped?)</description>
+ <description>PD Games Volume 214 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8307,7 +8307,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd215" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 215 (Alt)</description>
+ <description>PD Games Volume 215 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8319,7 +8319,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd215a" cloneof="asspd215" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 215 (Overdumped?)</description>
+ <description>PD Games Volume 215 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8331,7 +8331,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd216" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 216 (Hacked by ALE)</description>
+ <description>PD Games Volume 216 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8343,7 +8343,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd216a" cloneof="asspd216" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 216 (Overdumped?)</description>
+ <description>PD Games Volume 216 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8355,7 +8355,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd217" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 217 (Alt)</description>
+ <description>PD Games Volume 217 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8367,7 +8367,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd217a" cloneof="asspd217" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 217 (Overdumped?)</description>
+ <description>PD Games Volume 217 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8379,7 +8379,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd218" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 218 (Alt)</description>
+ <description>PD Games Volume 218 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8391,7 +8391,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd218a" cloneof="asspd218" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 218 (Overdumped?)</description>
+ <description>PD Games Volume 218 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8403,7 +8403,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd219" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 219 (Alt)</description>
+ <description>PD Games Volume 219 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8415,7 +8415,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd219a" cloneof="asspd219" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 219 (Overdumped?)</description>
+ <description>PD Games Volume 219 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8427,7 +8427,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd220" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 220 (Alt)</description>
+ <description>PD Games Volume 220 (alt)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8439,7 +8439,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd220a" cloneof="asspd220" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 220 (Overdumped?)</description>
+ <description>PD Games Volume 220 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8451,7 +8451,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd221" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 221 (Hacked by ALE)</description>
+ <description>PD Games Volume 221 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8463,7 +8463,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd221a" cloneof="asspd221" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 221 (Overdumped?)</description>
+ <description>PD Games Volume 221 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8475,7 +8475,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd222" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 222 (Hacked by ALE)</description>
+ <description>PD Games Volume 222 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8487,7 +8487,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd222a" cloneof="asspd222" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 222 (Overdumped?)</description>
+ <description>PD Games Volume 222 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8499,7 +8499,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd223" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 223 (Hacked by ALE)</description>
+ <description>PD Games Volume 223 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8511,7 +8511,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd223a" cloneof="asspd223" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 223 (Overdumped?)</description>
+ <description>PD Games Volume 223 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8523,7 +8523,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd224" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 224 (Hacked by ALE)</description>
+ <description>PD Games Volume 224 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8535,7 +8535,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd224a" cloneof="asspd224" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 224 (Overdumped?)</description>
+ <description>PD Games Volume 224 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8547,7 +8547,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd225" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 225 (Hacked by ALE)</description>
+ <description>PD Games Volume 225 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8559,7 +8559,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd225a" cloneof="asspd225" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 225 (Overdumped?)</description>
+ <description>PD Games Volume 225 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8571,7 +8571,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd226" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 226 (Hacked by ALE)</description>
+ <description>PD Games Volume 226 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8583,7 +8583,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd226a" cloneof="asspd226" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 226 (Overdumped?)</description>
+ <description>PD Games Volume 226 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8595,7 +8595,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd227" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 227 (Hacked by ALE)</description>
+ <description>PD Games Volume 227 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8607,7 +8607,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd227a" cloneof="asspd227" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 227 (Overdumped?)</description>
+ <description>PD Games Volume 227 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8619,7 +8619,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd228" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 228 (Hacked by ALE)</description>
+ <description>PD Games Volume 228 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8631,7 +8631,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd228a" cloneof="asspd228" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 228 (Overdumped?)</description>
+ <description>PD Games Volume 228 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8643,7 +8643,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd229" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 229 (Hacked by ALE)</description>
+ <description>PD Games Volume 229 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8655,7 +8655,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd229a" cloneof="asspd229" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 229 (Overdumped?)</description>
+ <description>PD Games Volume 229 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8667,7 +8667,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd230" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 230 (Hacked by ALE)</description>
+ <description>PD Games Volume 230 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8679,7 +8679,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd230a" cloneof="asspd230" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 230 (Overdumped?)</description>
+ <description>PD Games Volume 230 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8691,7 +8691,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd231" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 231 (Hacked by ALE)</description>
+ <description>PD Games Volume 231 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8703,7 +8703,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd231a" cloneof="asspd231" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 231 (Overdumped?)</description>
+ <description>PD Games Volume 231 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8715,7 +8715,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd232" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 232 (Hacked by ALE)</description>
+ <description>PD Games Volume 232 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8727,7 +8727,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd232a" cloneof="asspd232" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 232 (Overdumped?)</description>
+ <description>PD Games Volume 232 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8739,7 +8739,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd233" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 233 (Hacked by ALE)</description>
+ <description>PD Games Volume 233 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8751,7 +8751,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd233a" cloneof="asspd233" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 233 (Overdumped?)</description>
+ <description>PD Games Volume 233 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8763,7 +8763,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd234" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 234 (Hacked by ALE)</description>
+ <description>PD Games Volume 234 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8775,7 +8775,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd234a" cloneof="asspd234" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 234 (Overdumped?)</description>
+ <description>PD Games Volume 234 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8787,7 +8787,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd235" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 235 (Hacked by ALE)</description>
+ <description>PD Games Volume 235 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8799,7 +8799,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd235a" cloneof="asspd235" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 235 (Overdumped?)</description>
+ <description>PD Games Volume 235 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8811,7 +8811,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd236" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 236 (Hacked by ALE)</description>
+ <description>PD Games Volume 236 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8823,7 +8823,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd236a" cloneof="asspd236" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 236 (Overdumped?)</description>
+ <description>PD Games Volume 236 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8835,7 +8835,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd237" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 237 (Hacked by ALE)</description>
+ <description>PD Games Volume 237 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8847,7 +8847,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd237a" cloneof="asspd237" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 237 (Overdumped?)</description>
+ <description>PD Games Volume 237 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8859,7 +8859,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd238" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 238 (Hacked by ALE)</description>
+ <description>PD Games Volume 238 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8871,7 +8871,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd238a" cloneof="asspd238" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 238 (Overdumped?)</description>
+ <description>PD Games Volume 238 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8883,7 +8883,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd239" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 239 (Hacked by ALE)</description>
+ <description>PD Games Volume 239 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8895,7 +8895,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd239a" cloneof="asspd239" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 239 (Overdumped?)</description>
+ <description>PD Games Volume 239 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8907,7 +8907,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd240" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 240 (Hacked by ALE)</description>
+ <description>PD Games Volume 240 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8919,7 +8919,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd240a" cloneof="asspd240" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 240 (Overdumped?)</description>
+ <description>PD Games Volume 240 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8931,7 +8931,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd241" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 241 (Hacked by ALE)</description>
+ <description>PD Games Volume 241 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8943,7 +8943,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd241a" cloneof="asspd241" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 241 (Overdumped?)</description>
+ <description>PD Games Volume 241 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8955,7 +8955,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd242" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 242 (Hacked by ALE)</description>
+ <description>PD Games Volume 242 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8967,7 +8967,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd242a" cloneof="asspd242" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 242 (Overdumped?)</description>
+ <description>PD Games Volume 242 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8979,7 +8979,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd243" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 243 (Hacked by ALE)</description>
+ <description>PD Games Volume 243 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -8991,7 +8991,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd243a" cloneof="asspd243" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 243 (Overdumped?)</description>
+ <description>PD Games Volume 243 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9003,7 +9003,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd244" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 244 (Hacked by ALE)</description>
+ <description>PD Games Volume 244 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9015,7 +9015,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd244a" cloneof="asspd244" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 244 (Overdumped?)</description>
+ <description>PD Games Volume 244 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9027,7 +9027,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd245" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 245 (Hacked by ALE)</description>
+ <description>PD Games Volume 245 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9039,7 +9039,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd245a" cloneof="asspd245" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 245 (Overdumped?)</description>
+ <description>PD Games Volume 245 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9051,7 +9051,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd246" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 246 (Hacked by ALE)</description>
+ <description>PD Games Volume 246 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9063,7 +9063,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd246a" cloneof="asspd246" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 246 (Overdumped?)</description>
+ <description>PD Games Volume 246 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9075,7 +9075,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd247" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 247 (Hacked by ALE)</description>
+ <description>PD Games Volume 247 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9087,7 +9087,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd247a" cloneof="asspd247" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 247 (Overdumped?)</description>
+ <description>PD Games Volume 247 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9099,7 +9099,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd248" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 248 (Hacked by ALE)</description>
+ <description>PD Games Volume 248 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9111,7 +9111,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd248a" cloneof="asspd248" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 248 (Overdumped?)</description>
+ <description>PD Games Volume 248 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9123,7 +9123,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd249" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 249 (Hacked by ALE)</description>
+ <description>PD Games Volume 249 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9135,7 +9135,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd249a" cloneof="asspd249" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 249 (Overdumped?)</description>
+ <description>PD Games Volume 249 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9147,7 +9147,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd250" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 250 (Hacked by ALE)</description>
+ <description>PD Games Volume 250 (hacked by ALE)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9159,7 +9159,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asspd250a" cloneof="asspd250" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>PD Games Volume 250 (Overdumped?)</description>
+ <description>PD Games Volume 250 (overdumped?)</description>
<year>199?</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9327,7 +9327,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="rassrms1a" cloneof="assrms1" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>R.M.S Special Music Vol 1 (Alt)</description>
+ <description>R.M.S Special Music Vol 1 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9351,7 +9351,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assrms2a" cloneof="assrms2" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>R.M.S Special Music Vol 2 (Alt)</description>
+ <description>R.M.S Special Music Vol 2 (alt)</description>
<year>1993</year>
<publisher>The Assassins</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9376,7 +9376,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="assvirus" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Virus Killers (Bad? ERRDMS)</description>
+ <description>Virus Killers (bad? ERRDMS)</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940210" />
@@ -9402,7 +9402,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="asswb2uta" cloneof="asswb2ut" supported="no"> <!-- TOSEC 2012-12-28 -->
- <description>Workbench 2-3 Utils Vol 1.0 (Alt)</description>
+ <description>Workbench 2-3 Utils Vol 1.0 (alt)</description>
<year>1994</year>
<publisher>The Assassins</publisher>
<info name="release" value="19940123" />
@@ -9415,7 +9415,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="raypoker">
- <description>RAY Pokeri 100 mk (Fin)</description>
+ <description>RAY Pokeri 100 mk (Finland)</description>
<year>1991</year>
<publisher>Las Vegas Games</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9427,7 +9427,7 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</software>
<software name="raypoker2" cloneof="raypoker">
- <description>RAY Pokeri 200 mk (Fin)</description>
+ <description>RAY Pokeri 200 mk (Finland)</description>
<year>1992</year>
<publisher>Las Vegas Games</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -9438,5 +9438,17 @@ General Purpose Amiga Floppy Software List, anything listed here may, or may not
</part>
</software>
+ <software name="emutos93">
+ <description>EmuTOS 0.9.3</description>
+ <year>2014</year>
+ <publisher>EmuTOS development team</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="EmuTOS 0.9.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="emutos_093.adf" size="901120" crc="96f5cc88" sha1="fa3a3aa314d50e1131a5b65a048519c76c836bd2"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/amiga_hardware.xml b/hash/amiga_hardware.xml
index 79401555fdd..7a7079549ac 100644
--- a/hash/amiga_hardware.xml
+++ b/hash/amiga_hardware.xml
@@ -18,53 +18,78 @@ license:CC0-1.0
</part>
</software>
- <software name="a590">
- <!-- For Epson SCSI (P/N: 312711-01) -->
- <description>A590 Setup Disk 1.1 (SCSI Harddisk)</description>
+ <!-- For use with Epson XT drives -->
+ <software name="a590_epson">
+ <description>A590 Setup Disk 1.1 (Epson Hard Disk)</description>
<year>1989</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A590 Setup Disk 1.1 (SCSI Harddisk)" />
<dataarea name="flop" size="901120">
- <rom name="317734-01_a590_scsi.adf" size="901120" crc="a560a938" sha1="9c6136c6580779a948cd1c0b50cb229512af415c"/>
+ <rom name="317734-01_a590_epson.adf" size="901120" crc="a560a938" sha1="9c6136c6580779a948cd1c0b50cb229512af415c" />
</dataarea>
</part>
</software>
- <software name="a590_wd" cloneof="a590">
- <!-- Earlier version P/N: 317734-02? -->
- <!-- For WD93028-X-A (P/N: 312711-03) -->
- <!-- Cylinders 782 (615), Heads 2 (4), Sectors/Track 27, Precomp 784, LZone 781, Bytes/Sector 512 -->
- <description>A590 Setup Disk 1.23 (Western Digital Harddisk)</description>
+ <!-- For use with Western Digital XT drives -->
+ <!-- Modified "Drive definitions" file -->
+ <software name="a590_wd17" cloneof="a590_epson">
+ <description>A590 Setup Disk 1.7 (Western Digital Hard Disk)</description>
+ <year>1989</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="317734-02_a590_wd.adf" size="901120" crc="8337cc98" sha1="fd9f80cf6f18bc97161e867bde55724193cd2802" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- For use with Western Digital XT drives -->
+ <software name="a590_wd123" cloneof="a590_epson">
+ <description>A590 Setup Disk 1.23 (Western Digital Hard Disk)</description>
<year>1990</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A590 Setup Disk 1.23 (Western Digital Harddisk)" />
<dataarea name="flop" size="901120">
- <rom name="317734-03_a590_wd.adf" size="901120" crc="a88fda41" sha1="7424f8645e1903e3e4ec8bb824186868319be1f3"/>
+ <rom name="317734-03_a590_wd.adf" size="901120" crc="a88fda41" sha1="7424f8645e1903e3e4ec8bb824186868319be1f3" />
</dataarea>
</part>
</software>
- <software name="a590_seagate" cloneof="a590">
- <description>A590 Setup Disk 1.23 (Seagate Harddisk)</description>
- <year>1988</year>
+ <!-- For use with Seagate XT drives -->
+ <software name="a590_seagate" cloneof="a590_epson">
+ <description>A590 Setup Disk 1.23 (Seagate Hard Disk)</description>
+ <year>1990</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="901120">
- <rom name="317734-04.adf" size="901120" crc="7f1623a7" sha1="1f3e20206eb83f60745e19538de3123089c8da24"/>
+ <rom name="317734-04_a590_seagate.adf" size="901120" crc="7f1623a7" sha1="1f3e20206eb83f60745e19538de3123089c8da24" />
</dataarea>
</part>
</software>
+ <!-- Missing: 317734-05 A590 Setup Disk (Western Digital Hard Disk) -->
+
+ <!-- For use with SCSI drives -->
+ <!--
+ <software name="a590_scsi">
+ <description>A590 Setup Disk (SCSI Hard Disk)</description>
+ <year>1991</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="317734-06_a590_scsi.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+ -->
+
<software name="a590_ram">
<description>A590 RAM Test Software</description>
<year>1990</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A590 RAM Test Software" />
<dataarea name="flop" size="901120">
- <rom name="317830-01_a590_ram_test.adf" size="901120" crc="6583d1d0" sha1="7779b825b8555956d341ff7e909ab71d89e2321c"/>
+ <rom name="317830-01_a590_ram_test.adf" size="901120" crc="6583d1d0" sha1="7779b825b8555956d341ff7e909ab71d89e2321c" />
</dataarea>
</part>
</software>
@@ -74,35 +99,47 @@ license:CC0-1.0
<year>1988</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A2024 JumpStart" />
<dataarea name="flop" size="901120">
- <rom name="317809-01_a2024_jumpstart.adf" size="901120" crc="dad46588" sha1="30c2c1f1d98bd008b2c67f3b23480181935d4b01"/>
+ <rom name="317809-01_a2024_jumpstart.adf" size="901120" crc="dad46588" sha1="30c2c1f1d98bd008b2c67f3b23480181935d4b01" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Missing: 317806-01 A2091 Setup Disk (referenced in the service manual) -->
+ <!-- Missing: 317806-02 A2091 Setup Disk (if it exists) -->
+
+ <!-- Modified "Drive definitions" file -->
+ <software name="a2091_127">
+ <description>A2091 Setup Disk 1.27</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="317806-03_a2091_setup.adf" size="901120" crc="1ec584cf" sha1="d3de14c860d56679e645d28ef5b30d54ec95cc07" status="baddump" />
</dataarea>
</part>
</software>
- <software name="a2091">
- <!-- From service manual: Install (US): 317806-01, Install (De): 317807-01 (earlier versions?) -->
- <!-- Harddisk: 313440-01 SCSI Quantum -->
+ <software name="a2091_130" cloneof="a2091_127">
<description>A2091 Setup Disk 1.30</description>
<year>1991</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A2091 Setup Disk 1.30" />
<dataarea name="flop" size="901120">
- <rom name="317806-04_a2091_setup.adf" size="901120" crc="122c8f93" sha1="603e106c1a44a209171610af8d48bc35ad31c9bc"/>
+ <rom name="317806-04_a2091_setup.adf" size="901120" crc="122c8f93" sha1="603e106c1a44a209171610af8d48bc35ad31c9bc" />
</dataarea>
</part>
</software>
+ <!-- Missing: 317807-01 A2091 Setup Disk (De) (referenced in the service manual) -->
+
<software name="a2058">
<description>A2058 RAM Test Disk</description>
<year>1988</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A2058 RAM Test Disk" />
<dataarea name="flop" size="901120">
- <rom name="317719-01_a2058_ram_test.adf" size="901120" crc="5dba7fc3" sha1="76fbce4bef7df0f6042c85376d9bdfd4d4911e74"/>
+ <rom name="317719-01_a2058_ram_test.adf" size="901120" crc="5dba7fc3" sha1="76fbce4bef7df0f6042c85376d9bdfd4d4911e74" />
</dataarea>
</part>
</software>
@@ -112,9 +149,8 @@ license:CC0-1.0
<year>1990</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A2232 Install" />
<dataarea name="flop" size="901120">
- <rom name="317769-01_a2232_install.adf" size="901120" crc="3caa21b7" sha1="24f47f6f88712f046303b8812a598043440a5e6d"/>
+ <rom name="317769-01_a2232_install.adf" size="901120" crc="3caa21b7" sha1="24f47f6f88712f046303b8812a598043440a5e6d" />
</dataarea>
</part>
</software>
@@ -124,9 +160,8 @@ license:CC0-1.0
<year>1990</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A2300 Genlock Demo" />
<dataarea name="flop" size="901120">
- <rom name="317718-02_a2300_genlock_demo.adf" size="901120" crc="464ff0f6" sha1="26b94e8d52d35e2746b74610bb9b65eb2f899297"/>
+ <rom name="317718-02_a2300_genlock_demo.adf" size="901120" crc="464ff0f6" sha1="26b94e8d52d35e2746b74610bb9b65eb2f899297" />
</dataarea>
</part>
</software>
@@ -136,9 +171,87 @@ license:CC0-1.0
<year>1990</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="A2232 Test / Demo" />
<dataarea name="flop" size="901120">
- <rom name="317210-01_a2320_test_demo.adf" size="901120" crc="cff98aae" sha1="f46f7de0d908ed68abfd784d84b964cbce7dc503"/>
+ <rom name="317210-01_a2320_test_demo.adf" size="901120" crc="cff98aae" sha1="f46f7de0d908ed68abfd784d84b964cbce7dc503" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bscscsi13">
+ <description>bsc SCSI Installation Disk Version 1.3</description>
+ <year>1992</year>
+ <publisher>bsc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="bsc_scsi_13.adf" size="901120" crc="9fa2502f" sha1="b46433831367d29bf1ac0903c8622ecef9f1325a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bschdinst24">
+ <description>bsc HDInstTools Version 2.4 + GigaMem Version 3.0</description>
+ <year>1993</year>
+ <publisher>bsc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="bsc_hdinst_24.adf" size="901120" crc="fd9e6961" sha1="c68fa9e8be5aff5ef87db8eaf9d66c5ce894ed5d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bschdinst215">
+ <description>bsc HDInstTools Version 2.15 + GigaMem Version 3.0</description>
+ <year>1993</year>
+ <publisher>bsc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="bsc_hdinst_215.adf" size="901120" crc="eabbd380" sha1="48927e29663c6c1752fd0277e6f23dfcc06b7443" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bschdinst32">
+ <description>bsc HDInstTools Version 3.2 + GigaMem Version 3.0</description>
+ <year>1994</year>
+ <publisher>bsc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="bsc_hdinst_32.adf" size="901120" crc="f94b1a39" sha1="b825eeeeba3118d1ca8993561e606bc7e190bf3c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bschdinst35">
+ <description>bsc HDInstTools Version 3.5 + GigaMem Version 3.0</description>
+ <year>1995</year>
+ <publisher>bsc</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="bsc_hdinst_35.adf" size="901120" crc="f6e0bb86" sha1="69fb58385cb7caf4e11c337872c3764b22301462" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="r2dia">
+ <description>Rainbow II Diashow Professional V1.92</description>
+ <year>1992</year>
+ <publisher>Omega Datentechnik</publisher>
+ <info name="usage" value="Requires FrameMaster Zorro card and FPU" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="rainbow2_diashow.adf" size="901120" crc="201b34eb" sha1="7d8d4e4b58f438d25b32f78106c944f7d264de17" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="r2painter">
+ <description>RainbowPainter V0.99b</description>
+ <year>1992</year>
+ <publisher>Omega Datentechnik</publisher>
+ <info name="usage" value="Requires FrameMaster Zorro card and FPU" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="901120">
+ <rom name="rainbowpainter.adf" size="901120" crc="bda4991f" sha1="4b8d73487fcc92a2f8d21bf24c42ad373c28bc5f" />
</dataarea>
</part>
</software>
diff --git a/hash/amiga_workbench.xml b/hash/amiga_workbench.xml
index 9232766e525..4b6d980690c 100644
--- a/hash/amiga_workbench.xml
+++ b/hash/amiga_workbench.xml
@@ -3,33 +3,70 @@
<!--
-license:CC0-1.0
+license: CC0-1.0
-List of known part numbers
+Workbench is the operating system of the Amiga. The last version produced
+by Commodore is 3.1 (this version was also re-released by Escom). Versions
+3.5 and 3.9 were produced by Haage & Partner and the name changed to
+AmigaOS. Hyperion Entertainment then took over development and released
+Version 4.0 and 4.1. In addition, they are releasing updates for the classic
+3.1 release of Workbench running on all Amigas. The latest update was
+released in April 2023 and is numbered 3.2.2.1.
+
+Below is an incomplete list of Commodore part numbers:
315746-02 Extras 1.3 (De) (difference to 317790-01?)
-315747-02 Workbench 1.3 Rev. 34.20 (De) (difference to 317791-01?)
+315747-02 Workbench 1.3 Rev. 34.20 (De) (difference to 317791-01?) [crc 33891c41]
+316160-01 (Electronic Arts disk)
316167-01 Extras 1.1
316391-01 Workbench 1.2
-317235-01 Workbench 2.0 A3000
-317235-02 Extras 2.0 A3000
+317234-01 Extras 1.4/2.0 A3000 (International)
+317235-01 Extras 1.4 A3000 (US)
+317235-02 Extras 2.0 A3000 (US)
317235-04 Extras 2.03 A3000
+317236-01 Extras 1.4/2.0 A3000 (De)
+317240-01 Workbench 1.4/2.0 A3000 (International)
+317241-01 Workbench 1.4/2.0 A3000 (UK)
+317242-01 Workbench 1.4/2.0 A3000 (Fr)
+317243-01 Workbench 1.4/2.0 A3000 (It)
+317244-01 Workbench 1.4/2.0 A3000 (De)
+317245-01 Workbench 1.4/2.0 A3000 (Sp)
+317246-01 Workbench 1.4/2.0 A3000 (Dk)
+317247-01 Workbench 1.4/2.0 A3000 (No)
+317248-01 Workbench 1.4/2.0 A3000 (Se)
+317249-01 Workbench 1.4/2.0 A3000 (Be)
+317451-01 ABasiC (part of release 1.0)
+317481-01 Workbench 1.0
+317481-02 Workbench 1.1
+317481-03 Workbench 1.2 A1000
+317483-01 Kickstart 1.0
+317483-02 Kickstart 1.1
+317483-03 Kickstart 1.2
+317488-01 Amiga BASIC 1.1 A1000
+317488-02 Amiga BASIC 1.2 A500
+317489-01 Kaleidoscope
+317608-01 Workbench 1.2 A500
317608-03 Workbench 1.2 Rev. 33.56 A500
317610-03 Workbench 1.2 Rev. 33.56 A500 (De)
317612-01 Workbench 1.2 Rev. 33.56 A500 (Fr/Be)
317613-01 Workbench 1.2 Rev. 33.56 A500 (It)
317615-01 Workbench 1.2 Rev. 33.56 A500 (Se/Fi)
+317617-01 Workbench 1.2 Rev. 33.56 A500 (Dk)
+317617-02 Workbench 1.2 A500 (Dk) Okt. 87
+317619-01 A500 (probably Workbench 1.2 Rev. 33.56 A500 (No))
317621-01 Workbench 1.2 Rev. 33.56 A500 (Ch)
-317746-01 Workbench 1.3 Rev. 34.20 (US)
-317746-03 Workbench 1.3.2 Rev. 34.28 (US)
-317746-04 Workbench 1.3.3 Rev. 34.34 (US)
-317748-01 Extras 1.3
-317748-02 Extras 1.3.3
-317787-01 Workbench 1.3 Rev. 34.20 (International)
-317787-03 Workbench 1.3.2 Rev. 34.28 (International)
-317787-04 Workbench 1.3.3 Rev. 34.34 (International)
-317788-01 Extras 1.3
-317788-02 Extras 1.3
+317746-01 Workbench 1.3 Rev. 34.20 (Enhancer Software)
+317746-03 Workbench 1.3.2 Rev. 34.28 (Enhancer Software)
+317746-04 Workbench 1.3.3 Rev. 34.34 (Enhancer Software)
+317747-01 Kickstart 1.3 (Enhancer Software)
+317748-01 Extras 1.3 (Enhancer Software)
+317748-02 Extras 1.3.3 (Enhancer Software)
+317759-01 PC Bridgeboards Disk
+317787-01 Workbench 1.3 Rev. 34.20 (US)
+317787-03 Workbench 1.3.2 Rev. 34.28 (US)
+317787-04 Workbench 1.3.3 Rev. 34.34 (US)
+317788-01 Extras 1.3 (International)
+317788-02 Extras 1.3.3 (International)
317789-01 Workbench 1.3 Rev. 34.20 (UK)
317789-03 Workbench 1.3.2 Rev. 34.28 (UK)
317789-04 Workbench 1.3.3 Rev. 34.34 (UK)
@@ -56,33 +93,53 @@ List of known part numbers
317797-01 Workbench 1.3 Rev. 34.20 (It)
317797-03 Workbench 1.3.2 Rev. 34.28 (It)
317797-04 Workbench 1.3.3 Rev. 34.34 (It)
+317798-01 Workbench 1.3 Rev. 34.20 (Dk)
+317798-03 Workbench 1.3.2 Rev. 34.28 (Dk)
+317798-04 Workbench 1.3.3 Rev. 34.34 (Dk)
+317894-01 Amiga 500A Tutorial
317954-01 Extras 2.0 A3000
-317954-02 Workbench 2.0 A3000
-317954-03 Workbench 2.0 A3000 (De)
+317954-01 Workbench 1.4 A3000 (US)
+317954-02 Workbench 2.0 A3000 (International)
+317954-03 Workbench 2.0 A3000 (US)
317954-04 Workbench 2.03 A3000
+327244-01 Kickstart 1.0
+327244-02 Kickstart 1.1 PAL
327245-01 Workbench 1.0
327245-02 Workbench 1.1 Rev. 32.34 A1000 PAL
327246-01 Extras 1.0
-335603-02 Install 2.0 A3000
+335603-02 Install 2.01 A3000
335603-03 Install 2.0 A3000
335603-04 Install 2.03 A3000
+367245-05 Kickstart 2.03 A3000
+367245-06 Kickstart 2.04 A3000
367270-01 Workbench 1.3.2 Rev. 34.28 A3000 (International)
+367270-02 Workbench 1.3 A3000
367272-01 Extras 1.3 A3000
367617-01 Extras 1.3.3
367618-01 Extras 1.3.3 Rev. 34.34 (International)
-367813-01 Workbench 2.04 Rev. 37.67
+367813-01 Workbench 2.04 Rev. 37.67 (US/International)
367813-03 Workbench 2.05 Rev. 37.71
+367814-01 Workbench 2.04 Rev. 37.67 (Ca/Fr)
+367815-01 Workbench 2.04 Rev. 37.67 (UK)
+367816-01 Workbench 2.04 Rev. 37.67 (De)
+367817-01 Workbench 2.04 Rev. 37.67 (Fr/Be)
+367818-01 Workbench 2.04 Rev. 37.67 (It)
+367819-01 Workbench 2.04 Rev. 37.67 (Sp)
+367820-01 Workbench 2.04 Rev. 37.67 (Sw)
+367821-01 Workbench 2.04 Rev. 37.67 (No)
+367822-01 Workbench 2.04 Rev. 37.67 (Se/Fi)
+367823-01 Workbench 2.04 Rev. 37.67 (Dk)
367824-01 Extras 2.04
-367824-04 Extras 2.05
+367824-04 Extras 2.05 Rev. 37.71
367825-01 Fonts 2.04
-367825-03 Fonts 2.05
+367825-03 Fonts 2.05 Rev. 37.71
367826-01 Install 2.04 A3000
367826-02 Install 2.04
-367826-03 Install 2.05
-367943-01 Install 2.05
-367959-01 Workbench 2.05
-367960-01 Extras 2.05
-367968-01 Fonts 2.05
+367826-03 Install 2.05 SCSI Install
+367943-01 Install 2.05 A600HD Rev. 37.71
+367959-01 Workbench 2.05 Rev. 37.72
+367960-01 Extras 2.05 Rev. 37.72
+367968-01 Fonts 2.05 Rev. 37.72
370126-02 Install 3.0
370127-02 Workbench 3.0
370128-01 Extras 3.0
@@ -100,6 +157,7 @@ List of known part numbers
370169-01 Fonts 2.1
370170-01 Locale 2.1
370172-01 Locale 2.1 International
+370173-03 A3000T-040 68040 Support Library (was this distributed with certain 2.1 releases?)
370191-01 Fonts 3.0
370192-01 Fonts 3.0
370299-97 Install 3.1 A4000T
@@ -111,12 +169,15 @@ List of known part numbers
370301-97 Extras 3.1 A4000T
370301-98 Extras 3.1
370301-99 Fonts 3.1
+380663-01 Kickstart 1.2
380706-05 Extras 1.2
-380706-09 Extras 1.2
+380706-09 Extras 1.2 27.04.87
380706-10 Extras 1.2 (De)
+380706-11 Extras 1.2 (Dk)
380724-07 Workbench 1.2 Rev. 33.53 A2000
380724-09 Workbench 1.2 Rev. 33.56 A2000
380724-10 Workbench 1.2 Rev. 33.56 A2000 (De)
+380921-05 The Very First
380927-01 Workbench 1.2 Rev. 33.56 A500 (UK)
-->
@@ -129,13 +190,22 @@ List of known part numbers
<description>Workbench 1.0</description>
<year>1985</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- or 317483-01? -->
+ <feature name="part_id" value="Kickstart 1.0" />
+ <dataarea name="flop" size="901120">
+ <rom name="327244-01_kickstart.adf" size="901120" crc="fc1c4ce8" sha1="e2f7fd40b5f626f1719628e720bc4440cca7c961" />
+ </dataarea>
+ </part>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- or 317481-01? -->
<feature name="part_id" value="Workbench 1.0" />
<dataarea name="flop" size="901120">
<rom name="327245-01_workbench.adf" size="901120" crc="d6ef5192" sha1="c7ea69ed5e85ec599165ab201619646c9b5729ba" status="baddump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- or 317451-01? should contain ABasiC and Tutor -->
<feature name="part_id" value="Extras 1.0" />
<dataarea name="flop" size="901120">
<rom name="327246-01_extras.adf" size="901120" status="nodump" />
@@ -147,55 +217,128 @@ List of known part numbers
<software name="wb11">
<description>Workbench 1.1</description>
- <year>1985</year>
+ <year>1986</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="317481-02_workbench.adf" size="901120" crc="a629bd97" sha1="d8cc4e0a66d284aab499ff81c9527048bb47ff91" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- listed with this crc at the workbench project -->
+ <feature name="part_id" value="Kickstart 1.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="317483-02_kickstart.adf" size="901120" crc="73789bf8" sha1="68b667395be3a50be86fb6ad78155e1741255822" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- or 316167-01? crc could be 4c1791d8 -->
+ <feature name="part_id" value="Extras 1.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="317488-01_extras.adf" size="901120" crc="9c9fb14c" sha1="45a2506556ce3b13404194b26d04f451984c689a" />
+ </dataarea>
+ </part>
+ <!-- 317489-01 Kaleidoscope? -->
+ </software>
+
+ <software name="wb11pal">
+ <description>Workbench 1.1 (PAL)</description>
+ <year>1986</year>
+ <publisher>Commodore</publisher>
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Kickstart 1.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="327244-02_kickstart.adf" size="901120" crc="70d0030a" sha1="0d79e2444421e5b66b5f295a5d3685d286208128" />
+ </dataarea>
+ </part>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
<feature name="part_id" value="Workbench 1.1" />
<dataarea name="flop" size="901120">
<rom name="327245-02_workbench.adf" size="901120" crc="a629bd97" sha1="d8cc4e0a66d284aab499ff81c9527048bb47ff91" status="baddump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found, crc should be 4c1791d8 -->
<feature name="part_id" value="Extras 1.1" />
<dataarea name="flop" size="901120">
<rom name="316167-01_extras.adf" size="901120" crc="9c9fb14c" sha1="45a2506556ce3b13404194b26d04f451984c689a" />
</dataarea>
</part>
+ <!-- Kaleidoscope? -->
</software>
<!-- Version 1.2 -->
+ <!-- A1000 version? -->
+ <software name="wb12_de">
+ <description>Workbench 1.2 Rev. 33.43 (De)</description>
+ <year>1986</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.2 (De)" />
+ <dataarea name="flop" size="901120">
+ <rom name="unkpn_workbench.adf" size="901120" crc="ee85e669" sha1="726f091c5ed60b7e9faaca375ca2ee63fb451666" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <feature name="part_id" value="Extras 1.2 (De)" />
+ <dataarea name="flop" size="901120">
+ <rom name="unkpn_extras.adf" size="901120" crc="6f9c810c" sha1="39075ee4504012d21db67cb46b1426807b802c18" />
+ </dataarea>
+ </part>
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- pn unverified, might also be 380663-01 -->
+ <feature name="part_id" value="Kickstart 1.2" />
+ <dataarea name="flop" size="901120">
+ <rom name="317483-03_kickstart.adf" size="901120" crc="9d68d211" sha1="44682d10a7f62896b46180491d60db4ee8c30529" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Enhancer Software? -->
<software name="wb12">
<description>Workbench 1.2 Rev. 33.56 A500/A2000</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.56 A500/A2000" />
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.2 A500/A2000" />
<dataarea name="flop" size="901120">
- <!-- Part number unverified -->
+ <!-- pn unverified -->
<rom name="316391-01_workbench.adf" size="901120" crc="bfbf5df9" sha1="7ede18dcd66de3b1e1f87a5869c21294823da214" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
<feature name="part_id" value="Extras 1.2" />
<dataarea name="flop" size="901120">
- <!-- Part number unverified -->
+ <!-- or 317488-02? might belong to an earlier rev? dated 1986-11-04 -->
<rom name="380706-05_extras.adf" size="901120" crc="7763563b" sha1="51ca15f3ebb4360aabad32014174c411a00b0ecb" />
</dataarea>
</part>
+ <part name="kickstart" interface="floppy_3_5">
+ <feature name="part_id" value="Kickstart 1.2" />
+ <dataarea name="flop" size="901120">
+ <!-- listed with this crc at the workbench project (might also be 380663-01) -->
+ <rom name="317483-03_kickstart.adf" size="901120" crc="9d68d211" sha1="44682d10a7f62896b46180491d60db4ee8c30529" />
+ </dataarea>
+ </part>
</software>
<software name="wb12_a500">
- <description>Workbench 1.2 Rev. 33.56 A500</description>
+ <description>Workbench 1.2 Rev. 33.56 A500 (US)</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.56 A500" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.2 A500 (US)" />
<dataarea name="flop" size="901120">
<rom name="317608-03_workbench.adf" size="901120" crc="94318e6a" sha1="bf8f1542aa525847e22bd3e913247848eb540da0" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.2" />
<dataarea name="flop" size="901120">
<rom name="380706-09_extras.adf" size="901120" crc="46383329" sha1="40356f28c980b9b2ae778cc9d06f7a462a10d46e" />
@@ -207,13 +350,15 @@ List of known part numbers
<description>Workbench 1.2 Rev. 33.56 A500 (UK)</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.56 A500 (UK)" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.2 A500 (UK)" />
<dataarea name="flop" size="901120">
- <rom name="380927-01_workbench.adf" size="901120" status="nodump"/>
+ <rom name="380927-01_workbench.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.2" />
<dataarea name="flop" size="901120">
<rom name="380706-09_extras.adf" size="901120" crc="46383329" sha1="40356f28c980b9b2ae778cc9d06f7a462a10d46e" />
@@ -225,13 +370,15 @@ List of known part numbers
<description>Workbench 1.2 Rev. 33.56 A500 (De)</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.56 A500 (De)" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.2 A500 (De)" />
<dataarea name="flop" size="901120">
<rom name="317610-03_workbench.adf" size="901120" status="nodump"/>
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.2 (De)" />
<dataarea name="flop" size="901120">
<rom name="380706-10_extras.adf" size="901120" crc="af130813" sha1="f7a38640155cfd4d369769349f02aa7686973bcf" />
@@ -239,22 +386,27 @@ List of known part numbers
</part>
</software>
- <!-- 317612-01 Workbench 1.2 Rev. 33.56 A500 (Fr/Be) -->
+ <!-- 317612-01 Workbench 1.2 Rev. 33.56 A500 (Fr/Be) [label found] -->
<!-- 317613-01 Workbench 1.2 Rev. 33.56 A500 (It) -->
- <!-- 317615-01 Workbench 1.2 Rev. 33.56 A500 (Se/Fi) -->
- <!-- 317621-01 Workbench 1.2 Rev. 33.56 A500 (Ch) -->
+ <!-- 317615-01 Workbench 1.2 Rev. 33.56 A500 (Se/Fi) [label found] -->
+ <!-- 317617-01 Workbench 1.2 Rev. 33.56 A500 (Dk) [label found] -->
+ <!-- 317617-02 Workbench 1.2 A500 (Dk) Okt. 87 -->
+ <!-- 317619-01 A500 (probably No) -->
+ <!-- 317621-01 Workbench 1.2 Rev. 33.56 A500 (Ch) [label found] -->
<software name="wb12_a2000">
<description>Workbench 1.2 Rev. 33.56 A2000</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.56 A2000" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.2 A2000" />
<dataarea name="flop" size="901120">
- <rom name="380724-09_workbench.adf" size="901120" status="nodump"/>
+ <rom name="380724-09_workbench.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.2" />
<dataarea name="flop" size="901120">
<rom name="380706-09_extras.adf" size="901120" crc="46383329" sha1="40356f28c980b9b2ae778cc9d06f7a462a10d46e" />
@@ -266,13 +418,14 @@ List of known part numbers
<description>Workbench 1.2 Rev. 33.56 A2000 (De)</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.56 A2000 (De)" />
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.2 A2000 (De)" />
<dataarea name="flop" size="901120">
<rom name="380724-10_workbench.adf" size="901120" crc="4ac89111" sha1="73f8dea3b56bb337a22d5c5f8b447df4f10a4fb0" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.2 (De)" />
<dataarea name="flop" size="901120">
<rom name="380706-10_extras.adf" size="901120" crc="af130813" sha1="f7a38640155cfd4d369769349f02aa7686973bcf" />
@@ -285,13 +438,13 @@ List of known part numbers
<description>Workbench 1.2 Rev. 33.61 A500/A2000</description>
<year>1987</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.2 Rev. 33.61 A500/A2000" />
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.2 A500/A2000" />
<dataarea name="flop" size="901120">
<rom name="unkpn_workbench_12r3361.adf" size="901120" crc="f1674acf" sha1="6c5a7d91ea638cd001d3c52fac55bafb0a3ae890" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
<feature name="part_id" value="Extras 1.2" />
<dataarea name="flop" size="901120">
<rom name="unkpn_extras_12.adf" size="901120" crc="08f6785b" sha1="2edfbec0a82f8f5d133526365544a2e78f916c7b" />
@@ -301,20 +454,46 @@ List of known part numbers
<!-- Version 1.3 -->
- <!-- 317746-01 Workbench 1.3 (US) -->
-
<software name="wb13">
- <description>Workbench 1.3 Rev. 34.20</description>
+ <description>Workbench 1.3 Rev. 34.20 (Enhancer Software)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3 Rev. 34.20" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found, crc probably 99f1d1fb -->
+ <feature name="part_id" value="Workbench 1.3" />
<dataarea name="flop" size="901120">
- <rom name="317787-01_workbench.adf" size="901120" status="nodump"/>
+ <rom name="317746-01_workbench.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Kickstart 1.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="317747-01_kickstart.adf" size="901120" crc="5fd0ef3b" sha1="a80b001b98a997969bf709cecd07f8578f861148" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project as unverified -->
+ <feature name="part_id" value="Extras 1.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="317748-01_extras.adf" size="901120" crc="404a5f8d" sha1="80017dde2269a90ae559c8dee5ef40432bc8720a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wb13_us">
+ <description>Workbench 1.3 Rev. 34.20 (US)</description>
+ <year>1988</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3 (US)" />
+ <dataarea name="flop" size="901120">
+ <rom name="317787-01_workbench.adf" size="901120" crc="7d315949" sha1="d33f072138bd1ef462a50a6217147f6626f6bd31" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3" />
<dataarea name="flop" size="901120">
<rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
@@ -326,14 +505,15 @@ List of known part numbers
<description>Workbench 1.3 Rev. 34.20 (UK)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3 Rev. 34.20 (UK)" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3 (UK)" />
<dataarea name="flop" size="901120">
<rom name="317789-01_workbench.adf" size="901120" crc="30bef4c6" sha1="44bace7520746691969d08f28dd68ef5ab2f15fb" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3" />
<dataarea name="flop" size="901120">
<rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
@@ -345,14 +525,16 @@ List of known part numbers
<description>Workbench 1.3 Rev. 34.20 (De)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3 Rev. 34.20 (De)" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- label with pn 315747-02 found, listed at the workbench project with crc 33891c41 -->
+ <feature name="part_id" value="Workbench 1.3 (De)" />
<dataarea name="flop" size="901120">
- <rom name="317791-01_workbench.adf" size="901120" status="nodump"/>
+ <rom name="317791-01_workbench.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <!-- original label with pn 315746-02 found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3 (De)" />
<dataarea name="flop" size="901120">
<rom name="317790-01_extras.adf" size="901120" crc="bc1f2c03" sha1="62dab0a803fe01bcd05d7cf20447e46af09669ff" />
@@ -360,30 +542,73 @@ List of known part numbers
</part>
</software>
- <!-- 317792-01 Workbench 1.3 (Fr/Be) -->
- <!-- 317793-01 Workbench 1.3 (No) -->
+ <!-- 317792-01 Workbench 1.3 (Fr/Be) [label found] -->
+
+ <software name="wb13_no" cloneof="wb13">
+ <description>Workbench 1.3 Rev. 34.21 (No)</description>
+ <year>1988</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.3 (No)" />
+ <dataarea name="flop" size="901120">
+ <rom name="317793-01_workbench.adf" size="901120" crc="8f107dd6" sha1="f9b05508d3ee04ac84d44f5c41d67ff4e842e6d7" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- is this something official? contains norway specific printer drivers -->
+ <feature name="part_id" value="Extras 1.3 (No)" />
+ <dataarea name="flop" size="901120">
+ <rom name="unkpn_extras.adf" size="901120" crc="7b27b35a" sha1="0b95704fb0ec8d3bd6390d1934789c741a348417" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- 317794-01 Workbench 1.3 (Es) -->
<!-- 317795-01 Workbench 1.3 (Ch) -->
- <!-- 317796-01 Workbench 1.3 (Se/Fi) -->
- <!-- 317797-01 Workbench 1.3 (It) -->
+ <!-- 317796-01 Workbench 1.3 (Se/Fi) [label found] -->
+ <!-- 317797-01 Workbench 1.3 (It) [label found] -->
+
+ <software name="wb13_dk" cloneof="wb13">
+ <description>Workbench 1.3 Rev. 34.20 (Dk)</description>
+ <year>1988</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3 (Dk)" />
+ <dataarea name="flop" size="901120">
+ <rom name="317798-01_workbench.adf" size="901120" crc="6b3bc3b2" sha1="d48769a027c3a156bcc11f9a04fadb5301407552" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras 1.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Version 1.3.1 -->
+
+ <!-- Very limited release only. Label found which claims "VER. 1.3.1 REV 34.25" (included with an Enhancer set) -->
<!-- Version 1.3.2 -->
- <!-- 317746-03 Workbench 1.3.2 (US) -->
+ <!-- 317746-03 Workbench 1.3.2 (Enhancer Software) -->
<software name="wb132">
- <description>Workbench 1.3.2</description>
+ <description>Workbench 1.3.2 Rev. 34.28 (US)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3.2" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3.2 (US)" />
<dataarea name="flop" size="901120">
- <rom name="317787-03_workbench.adf" size="901120" status="nodump"/>
+ <rom name="317787-03_workbench.adf" size="901120" crc="a80cfe5c" sha1="45bb76bb3ee393b36ce8b38edea609e2a346b3a5" status="baddump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
- <!-- Possibly this should be 317788-02? -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3" />
<dataarea name="flop" size="901120">
<rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
@@ -395,16 +620,15 @@ List of known part numbers
<description>Workbench 1.3.2 Rev. 34.28 (UK)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found, crc should be c5692f06 -->
<feature name="part_id" value="Workbench 1.3.2 (UK)" />
<dataarea name="flop" size="901120">
- <rom name="317789-03_workbench.adf" size="901120" crc="c5692f06" status="nodump"/>
+ <rom name="317789-03_workbench.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
- <!-- Possibly this should be 317788-02? -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3" />
<dataarea name="flop" size="901120">
<rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
@@ -413,17 +637,19 @@ List of known part numbers
</software>
<software name="wb132_de" cloneof="wb132">
- <description>Workbench 1.3.2 (De)</description>
+ <description>Workbench 1.3.2 Rev. 34.28 (De)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Workbench 1.3.2 (De)" />
<dataarea name="flop" size="901120">
<rom name="317791-03_workbench.adf" size="901120" crc="e0a29775" sha1="3e2a5e064d8efb4feb64b85b7b26bfaa4f07aa0a" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <!-- original label with pn 315746-02 found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3 (De)" />
<dataarea name="flop" size="901120">
<rom name="317790-01_extras.adf" size="901120" crc="bc1f2c03" sha1="62dab0a803fe01bcd05d7cf20447e46af09669ff" />
@@ -431,23 +657,44 @@ List of known part numbers
</part>
</software>
- <!-- 317792-03 Workbench 1.3.2 (Fr/Be) -->
+ <!-- 317792-03 Workbench 1.3.2 (Fr/Be) [label found] -->
<!-- 317793-03 Workbench 1.3.2 (No) -->
- <!-- 317794-03 Workbench 1.3.2 (Es) -->
+
+ <software name="wb132_es" cloneof="wb132">
+ <description>Workbench 1.3.2 Rev. 34.28 (Es)</description>
+ <year>1988</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 1.3.2 (Es)" />
+ <dataarea name="flop" size="901120">
+ <rom name="317794-03_workbench.adf" size="901120" crc="e84cd11c" sha1="c5127904ecf864e1a8be770405a02f583ef11ccc" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras 1.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- 317795-03 Workbench 1.3.2 (Ch) -->
<!-- 317796-03 Workbench 1.3.2 (Se/Fi) -->
<software name="wb132_it" cloneof="wb132">
- <description>Workbench 1.3.2 (It)</description>
+ <description>Workbench 1.3.2 Rev. 34.28 (It)</description>
<year>1988</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
<feature name="part_id" value="Workbench 1.3.2 (It)" />
<dataarea name="flop" size="901120">
- <rom name="317797-03_workbench.adf" size="901120" status="nodump"/>
+ <rom name="317797-03_workbench.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3" />
<dataarea name="flop" size="901120">
<rom name="317788-01_extras.adf" size="901120" crc="2f9cea9f" sha1="7fe6b33427eb860fad67540146480d62349e27ca" />
@@ -455,38 +702,70 @@ List of known part numbers
</part>
</software>
+ <!-- 317798-03 Workbench 1.3.2 (Dk) [label found] -->
+
+ <software name="wb132_a3000" cloneof="wb132">
+ <description>Workbench 1.3.2 Rev. 34.28 A3000 (US)</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found, crc should be 32ba99d1 -->
+ <feature name="part_id" value="Workbench 1.3.2 A3000 (US)" />
+ <dataarea name="flop" size="901120">
+ <rom name="367270-01_workbench.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Extras 1.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="367272-01_extras.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Version 1.3.3 -->
- <software name="wb133_us" cloneof="wb133">
- <description>Workbench 1.3.3 (US)</description>
+ <software name="wb133">
+ <description>Workbench 1.3.3 Rev. 34.34 (Enhancer Software)</description>
<year>1990</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3.3 (US)" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3.3" />
<dataarea name="flop" size="901120">
<rom name="317746-04_workbench.adf" size="901120" crc="bf299bca" sha1="8bac53a89cd1fe5a7762de9bd61a1592f10af2df" status="baddump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Extras 1.3 (US)" />
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Kickstart 1.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="317747-01_kickstart.adf" size="901120" crc="5fd0ef3b" sha1="a80b001b98a997969bf709cecd07f8578f861148" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Extras 1.3.3" />
<dataarea name="flop" size="901120">
<rom name="317748-02_extras.adf" size="901120" crc="256a4b82" sha1="465a65aa89fe4b016fee968ef75ab08de9bdfbc6" />
</dataarea>
</part>
</software>
- <software name="wb133">
- <description>Workbench 1.3.3</description>
- <year>1988</year>
+ <software name="wb133_us" cloneof="wb133">
+ <description>Workbench 1.3.3 Rev. 34.34 (US)</description>
+ <year>1990</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 1.3.3" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3.3 (US)" />
<dataarea name="flop" size="901120">
<rom name="317787-04_workbench.adf" size="901120" status="nodump"/>
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3.3" />
<dataarea name="flop" size="901120">
<rom name="367618-01_extras.adf" size="901120" crc="e8eb34c4" sha1="98b2d23004aa4f70e6e07fae92e36b303ab8e471" />
@@ -495,18 +774,18 @@ List of known part numbers
</software>
<software name="wb133_uk" cloneof="wb133">
- <description>Workbench 1.3.3 (UK)</description>
- <year>1988</year>
+ <description>Workbench 1.3.3 Rev. 34.34 (UK)</description>
+ <year>1990</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <!-- Modified -->
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
<feature name="part_id" value="Workbench 1.3.3 (UK)" />
<dataarea name="flop" size="901120">
<rom name="317789-04_workbench.adf" size="901120" crc="f0ac4901" sha1="598a61b0d41fd16f8af5166067337ceda350c2b5" status="baddump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 1.3.3" />
<dataarea name="flop" size="901120">
<rom name="367618-01_extras.adf" size="901120" crc="e8eb34c4" sha1="98b2d23004aa4f70e6e07fae92e36b303ab8e471" />
@@ -515,54 +794,201 @@ List of known part numbers
</software>
<software name="wb133_de" cloneof="wb133">
- <description>Workbench 1.3.3 (De)</description>
+ <description>Workbench 1.3.3 Rev. 34.34 (De)</description>
<year>1990</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
<feature name="part_id" value="Workbench 1.3.3 (De)" />
<dataarea name="flop" size="901120">
- <rom name="317791-04_workbench.adf" size="901120" status="nodump" />
+ <rom name="317791-04_workbench.adf" size="901120" crc="aa7f9b30" sha1="a8d8e140c15b0ed9bfb6ab286dfae7ad5103d4e7" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found -->
<feature name="part_id" value="Extras 1.3.3 (De)" />
<dataarea name="flop" size="901120">
- <rom name="317790-02_extras.adf" size="901120" status="nodump" />
+ <rom name="317790-02_extras.adf" size="901120" crc="78c9d37d" sha1="a31c2505e20fc9c5d0537a7a6bb723ae8740dc49" />
</dataarea>
</part>
</software>
- <!-- 317796-04 Workbench 1.3.3 (Se/Fi) -->
+ <software name="wb133_fr" cloneof="wb133">
+ <description>Workbench 1.3.3 Rev. 34.34 (Fr/Be)</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project as unverified -->
+ <feature name="part_id" value="Workbench 1.3.3 (Fr/Be)" />
+ <dataarea name="flop" size="901120">
+ <rom name="317792-04_workbench.adf" size="901120" crc="3df8a000" sha1="b9a8097bd1f65145927ab4100ab157ba0deb5598" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras 1.3.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="367618-01_extras.adf" size="901120" crc="e8eb34c4" sha1="98b2d23004aa4f70e6e07fae92e36b303ab8e471" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- 317793-04 Workbench 1.3.3 (No) -->
+ <!-- 317794-04 Workbench 1.3.3 (Es) -->
+ <!-- 317795-04 Workbench 1.3.3 (Ch) -->
+ <!-- 317796-04 Workbench 1.3.3 (Se/Fi) [label found] -->
<!-- 317797-04 Workbench 1.3.3 (It) -->
+ <software name="wb133_dk" cloneof="wb133">
+ <description>Workbench 1.3.3 Rev. 34.34 (Dk)</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench 1.3.3 (Dk)" />
+ <dataarea name="flop" size="901120">
+ <rom name="317798-04_workbench.adf" size="901120" crc="6395ec1f" sha1="8d8314faa3b5fbc472c11d5fc669358522c1d00b" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras 1.3.3" />
+ <dataarea name="flop" size="901120">
+ <rom name="367618-01_extras.adf" size="901120" crc="e8eb34c4" sha1="98b2d23004aa4f70e6e07fae92e36b303ab8e471" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Version 2.0 -->
+
+ <software name="wb20">
+ <description>Workbench 2.0 Rev. 36.68 A3000</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <feature name="part_id" value="Workbench 2.0" />
+ <dataarea name="flop" size="901120">
+ <rom name="317235-01_workbench.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <feature name="part_id" value="Extras 2.0" />
+ <dataarea name="flop" size="901120">
+ <rom name="317235-02_extras.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="kickstart" interface="floppy_3_5">
+ <feature name="part_id" value="Kickstart 2.0" />
+ <dataarea name="flop" size="901120">
+ <rom name="367245-02_kickstart.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <!-- Install disk? -->
+ </software>
+
+ <!-- Version 2.01 -->
+
+ <software name="wb201">
+ <description>Workbench 2.01 Rev. 36.69 A3000</description>
+ <year>1990</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- crc should be 3e62fbc0 -->
+ <feature name="part_id" value="Workbench 2.01" />
+ <dataarea name="flop" size="901120">
+ <rom name="317954-02_workbench.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <feature name="part_id" value="Extras 2.01" />
+ <dataarea name="flop" size="901120">
+ <rom name="317954-01_extras.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="install" interface="floppy_3_5">
+ <feature name="part_id" value="Install 2.01" />
+ <dataarea name="flop" size="901120">
+ <rom name="335603-02_install.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="kickstart" interface="floppy_3_5">
+ <feature name="part_id" value="Kickstart 2.01" />
+ <dataarea name="flop" size="901120">
+ <rom name="367245-03_kickstart.adf" size="901120" crc="79c58ce8" sha1="8e738fb5a9d293c8321cf5055c06f368d43a6e2b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Version 2.02 -->
+
+ <!-- Probably the 335603-03 Install Disk? -->
+ <!-- 317235-02 Extras here? crc should be 47112b69 -->
+
+ <!-- Version 2.03 -->
+
+ <software name="wb203">
+ <description>Workbench 2.03 Rev. 36.102 A3000</description>
+ <year>1991</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- crc should be 6a12963e -->
+ <feature name="part_id" value="Workbench 2.03" />
+ <dataarea name="flop" size="901120">
+ <rom name="317954-04_workbench.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- crc should be bfe0d8cf -->
+ <feature name="part_id" value="Extras 2.03" />
+ <dataarea name="flop" size="901120">
+ <rom name="317235-04_extras.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="install" interface="floppy_3_5">
+ <!-- bad? crc should be c18842d3 -->
+ <feature name="part_id" value="Install Disk 2.03" />
+ <dataarea name="flop" size="901120">
+ <rom name="335603-04_install.adf" size="901120" crc="9a3cc466" sha1="b12a225890a3957bb01dcbfba44c046c19e19c8f" />
+ </dataarea>
+ </part>
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- crc should be 4bf14fc0 -->
+ <feature name="part_id" value="Kickstart 2.03" />
+ <dataarea name="flop" size="901120">
+ <rom name="367245-05_kickstart.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Version 2.04 -->
<software name="wb204">
<description>Workbench 2.04 Rev. 37.67</description>
<year>1991</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="workbench" interface="floppy_3_5">
+ <!-- listed with this crc at the workbench project -->
<feature name="part_id" value="Workbench 2.04" />
<dataarea name="flop" size="901120">
<rom name="367813-01_workbench.adf" size="901120" crc="57714d34" sha1="8d5c0310a86f14fb3e6a1da001ceb50b9a592c51" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
- <feature name="part_id" value="Extras 2.04" />
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras Version 2.04" />
<dataarea name="flop" size="901120">
<rom name="367824-01_extras.adf" size="901120" crc="a019b6b9" sha1="dc6a940c3474a1d90856541c179f4105eadadbbf" />
</dataarea>
</part>
- <part name="flop3" interface="floppy_3_5">
- <!-- Probably good dump -->
+ <part name="fonts" interface="floppy_3_5">
+ <!-- listed with this crc at the workbench project -->
<feature name="part_id" value="Fonts 2.04" />
<dataarea name="flop" size="901120">
<rom name="367825-01_fonts.adf" size="901120" crc="2f88c0f6" sha1="22827246c3147c9f9585d029a0f1ebe5fade584e" />
</dataarea>
</part>
- <part name="flop4" interface="floppy_3_5">
+ <part name="install" interface="floppy_3_5">
+ <!-- listed with this crc at the workbench project -->
<feature name="part_id" value="Install 2.04" />
<dataarea name="flop" size="901120">
<rom name="367826-02_install.adf" size="901120" crc="74f4f26b" sha1="4a6f66823dc9320eb807106b2e98eaba3800c197" />
@@ -570,78 +996,228 @@ List of known part numbers
</part>
</software>
+ <software name="wb204_a3000" cloneof="wb204">
+ <description>Workbench 2.04 Rev. 37.67 A3000</description>
+ <year>1991</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- listed with this crc at the workbench project -->
+ <feature name="part_id" value="Workbench 2.04" />
+ <dataarea name="flop" size="901120">
+ <rom name="367813-01_workbench.adf" size="901120" crc="57714d34" sha1="8d5c0310a86f14fb3e6a1da001ceb50b9a592c51" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras Version 2.04" />
+ <dataarea name="flop" size="901120">
+ <rom name="367824-01_extras.adf" size="901120" crc="a019b6b9" sha1="dc6a940c3474a1d90856541c179f4105eadadbbf" />
+ </dataarea>
+ </part>
+ <part name="fonts" interface="floppy_3_5">
+ <!-- listed with this crc at the workbench project -->
+ <feature name="part_id" value="Fonts 2.04" />
+ <dataarea name="flop" size="901120">
+ <rom name="367825-01_fonts.adf" size="901120" crc="2f88c0f6" sha1="22827246c3147c9f9585d029a0f1ebe5fade584e" />
+ </dataarea>
+ </part>
+ <part name="install" interface="floppy_3_5">
+ <feature name="part_id" value="Install 2.04" />
+ <dataarea name="flop" size="901120">
+ <rom name="367826-01_install.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="kickstart" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="A3000 Kickstart Version 2.04" />
+ <dataarea name="flop" size="901120">
+ <rom name="367245-06_kickstart.adf" size="901120" crc="87ad0c5b" sha1="922ec2776766a6568f3e2de37101c497067948e4" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Version 2.05 -->
<software name="wb205">
<description>Workbench 2.05 Rev. 37.71</description>
<year>1992</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Workbench 2.05" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Workbench Version 2.05" />
<dataarea name="flop" size="901120">
<rom name="367813-03_workbench.adf" size="901120" crc="be1cc8b9" sha1="4d5c1830e04d1302fdad1eb85638104ab94fb353" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Extras 2.05" />
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras Version 2.05" />
<dataarea name="flop" size="901120">
<rom name="367824-04_extras.adf" size="901120" crc="86daec05" sha1="96bcab8d0d5f05d5fac879436bcc85514d912acc"/>
</dataarea>
</part>
- <part name="flop3" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Fonts 2.05" />
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Fonts Version 2.05" />
<dataarea name="flop" size="901120">
<rom name="367825-03_fonts.adf" size="901120" crc="7401aba4" sha1="21124a9695f90b926184ee00ac575217a6373c3d" />
</dataarea>
</part>
- <part name="flop4" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="A600HD Install 2.05" />
+ <part name="install" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="A600HD Install Disk Version 2.05" />
<dataarea name="flop" size="901120">
<rom name="367943-01_install.adf" size="901120" crc="bbdc194c" sha1="66cf349d250f8da83fae3509d8a49bbf7602677f" />
</dataarea>
</part>
+ <!-- install disk with crc c285c0aa listed at the workbench project as verified -->
+ <!-- only difference is a slightly newer filesystem creation date, is it offical? -->
+ </software>
+
+ <software name="wb205_a3000" cloneof="wb205">
+ <description>Workbench 2.05 Rev. 37.71 A3000</description>
+ <year>1992</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Workbench Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367813-03_workbench.adf" size="901120" crc="be1cc8b9" sha1="4d5c1830e04d1302fdad1eb85638104ab94fb353" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367824-04_extras.adf" size="901120" crc="86daec05" sha1="96bcab8d0d5f05d5fac879436bcc85514d912acc"/>
+ </dataarea>
+ </part>
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Fonts Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367825-03_fonts.adf" size="901120" crc="7401aba4" sha1="21124a9695f90b926184ee00ac575217a6373c3d" />
+ </dataarea>
+ </part>
+ <part name="install" interface="floppy_3_5">
+ <!-- original label found but unverified, contains a3000 specific files -->
+ <feature name="part_id" value="SCSI Install Disk Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367826-03_install.adf" size="901120" crc="27789c2f" sha1="ea7de9081bc485665be72746ace21355c87c1ab1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Only delivered with A600 non-HD models? -->
+ <software name="wb205_3772">
+ <description>Workbench 2.05 Rev. 37.72</description>
+ <year>1992</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found -->
+ <feature name="part_id" value="Workbench Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367959-01_workbench.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found, crc should be 2ec25826 -->
+ <feature name="part_id" value="Extras Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367960-01_extras.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found, crc should be 0f4d1bbd -->
+ <feature name="part_id" value="Fonts Version 2.05" />
+ <dataarea name="flop" size="901120">
+ <rom name="367968-01_fonts.adf" size="901120" status="nodump" />
+ </dataarea>
+ </part>
</software>
<!-- Version 2.1 -->
+ <!-- 370152-01 Workbench 2.1 Rev. 38.31 En/No/Se [label found] -->
+
+ <software name="wb21_3835" cloneof="wb21">
+ <description>Workbench 2.1 Rev. 38.35</description>
+ <year>1992</year>
+ <publisher>Commodore</publisher>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- crc should be 811cb955 -->
+ <feature name="part_id" value="Workbench 2.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370155-01_workbench.adf" size="901120" crc="78e1c97d" sha1="e6b571309593f248e3acddcdb42cd31f7cad9423" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- crc should be 4a26e812 -->
+ <feature name="part_id" value="Extras 2.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370159-01_extras.adf" size="901120" crc="2eb06588" sha1="8e3a292f96e4f5c0f5b67180670630d91122d560" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found, crc should be d93c40a1 -->
+ <feature name="part_id" value="Fonts 2.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370160-01_fonts.adf" size="901120" crc="c4e1857d" sha1="037eb15fd2473f2d93879d7a00220aea312d9f63" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="install" interface="floppy_3_5">
+ <!-- crc should be 09a0cd0b -->
+ <feature name="part_id" value="Install 2.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370166-01_install.adf" size="901120" crc="9388e8a6" sha1="030485bff4e157246e4104ec5ad34a705e1f1fd9" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="locale" interface="floppy_3_5">
+ <!-- original label found, crc should be 5eae8e5d -->
+ <feature name="part_id" value="Locale 2.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370172-01_locale.adf" size="901120" crc="e8d1afb0" sha1="826f71d85110bd6eb63fa7d57ebdf3df8ffe0a44" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- 370167-01 Workbench 2.1 Rev. 38.35 -->
+
<software name="wb21">
<description>Workbench 2.1 Rev. 38.36</description>
<year>1992</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Install 2.1" />
+ <part name="install" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Install Disk Version 2.1" />
<dataarea name="flop" size="901120">
<rom name="370166-02_install.adf" size="901120" crc="78288c6e" sha1="d92d1218ee28e1057ce776d4c0f4ee12426d53d9" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Workbench 2.1" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Workbench Version 2.1" />
<dataarea name="flop" size="901120">
<rom name="370167-02_workbench.adf" size="901120" crc="47bc4f1c" sha1="57e630711fc98a57b6a3ee5b126e302f76d4989a" />
</dataarea>
</part>
- <part name="flop3" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Extras 2.1" />
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras Version 2.1" />
<dataarea name="flop" size="901120">
<rom name="370168-01_extras.adf" size="901120" crc="0b64e83d" sha1="34b765f7bbe3dc0370cc448b8eacdca540238ad6" />
</dataarea>
</part>
- <part name="flop4" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Fonts 2.1" />
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Fonts Version 2.1" />
<dataarea name="flop" size="901120">
<rom name="370169-01_fonts.adf" size="901120" crc="38dd8f2c" sha1="4444b0acd8c39d918ef29b79443522d76b2ff485" />
</dataarea>
</part>
- <part name="flop5" interface="floppy_3_5">
- <!-- Verified dump -->
- <feature name="part_id" value="Locale 2.1" />
+ <part name="locale" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Locale Version 2.1" />
<dataarea name="flop" size="901120">
<rom name="370170-01_locale.adf" size="901120" crc="0d6f6b6b" sha1="20a330dbb002edd543e1eac527ea87e54dc496a3" />
</dataarea>
@@ -650,148 +1226,208 @@ List of known part numbers
<!-- Version 3.0 -->
+ <!-- Disks with "incomplete" PN. Really different? -->
+ <!-- 370126 Install 3.0 -->
+ <!-- 370127 Workbench 3.0 [label found] -->
+ <!-- 370128 Extras 3.0 [label found] -->
+ <!-- 370129 Locale 3.0 [label found] -->
+ <!-- 370191 Fonts 3.0 [label found] -->
+ <!-- 370150 Storage 3.0 [label found] -->
+
<software name="wb30">
<description>Workbench 3.0 Rev. 39.29</description>
<year>1992</year>
<publisher>Commodore</publisher>
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Install 3.0" />
+ <part name="install" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Install Disk Version 3.0" />
<dataarea name="flop" size="901120">
<rom name="370126-02_install.adf" size="901120" crc="6fa2d2b4" sha1="ba24b4172339b9198e4f724a6804d0c6eb5e394b" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Probably good dump -->
- <feature name="part_id" value="Workbench 3.0" />
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Workbench Version 3.0" />
<dataarea name="flop" size="901120">
<rom name="370127-02_workbench.adf" size="901120" crc="a4d9752d" sha1="e663c92a9c88fa38d02bbb299bea8ce70c56b417" />
</dataarea>
</part>
- <part name="flop3" interface="floppy_3_5">
- <!-- Probably good dump -->
- <feature name="part_id" value="Extras 3.0" />
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Extras Version 3.0" />
<dataarea name="flop" size="901120">
<rom name="370128-01_extras.adf" size="901120" crc="95da642d" sha1="74304711678ebd3287f816ae250b47bd4d8f5195" />
</dataarea>
</part>
- <part name="flop4" interface="floppy_3_5">
- <!-- Probably good dump -->
- <feature name="part_id" value="Locale 3.0" />
+ <part name="locale" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Locale Version 3.0" />
<dataarea name="flop" size="901120">
<rom name="370129-01_locale.adf" size="901120" crc="67835fe5" sha1="00d0670a9060ab7805dc2fa7e2e856b33a828043" />
</dataarea>
</part>
- <part name="flop5" interface="floppy_3_5">
- <!-- Probably good dump -->
- <feature name="part_id" value="Storage 3.0" />
+ <part name="storage" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Storage Version 3.0" />
<dataarea name="flop" size="901120">
<rom name="370150-01_storage.adf" size="901120" crc="0c8c24d5" sha1="93cab7cd05471e8fde63cb1d512b048cd593aebc" />
</dataarea>
</part>
- <part name="flop6" interface="floppy_3_5">
- <!-- This might be 370130-01 (intellifonts on disk) -->
- <feature name="part_id" value="Fonts 3.0" />
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Fonts Version 3.0" />
<dataarea name="flop" size="901120">
- <rom name="fonts30a.adf" size="901120" crc="6a8188bb" sha1="ce0e9e7f03f26918333e120b2740407684d0b619" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_3_5">
- <!-- This might be 370192-01 (intellifonts deleted, not recoverable) -->
- <feature name="part_id" value="Fonts 3.0 (without intellifonts)" />
- <dataarea name="flop" size="901120">
- <rom name="fonts30.adf" size="901120" crc="d7364bb4" sha1="4531651fe34a7f0a2dc1a1523ed4c2507670f5a6" />
+ <rom name="370130-01_fonts.adf" size="901120" crc="6a8188bb" sha1="ce0e9e7f03f26918333e120b2740407684d0b619" />
</dataarea>
</part>
+ <!-- 370191-01 Fonts 3.0 [crc should be 242ff841] -->
+ <!-- 370192-01 Fonts 3.0 -->
</software>
<!-- Version 3.1 -->
+ <!-- Missing: There is also a release on HD disks -->
+
<software name="wb31">
<description>Workbench 3.1 Rev. 40.42</description>
+ <year>1994</year>
+ <publisher>Commodore</publisher>
+ <part name="install" interface="floppy_3_5">
+ <!-- original label found, crc should be 5a039e90 -->
+ <feature name="part_id" value="Install Version 3.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370299-98_install.adf" size="901120" crc="2bd9d105" sha1="27c8d7042da3a8c7a21742129970bd7e56b7e828" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="storage" interface="floppy_3_5">
+ <!-- original label found, crc should be 4bd38ef4 -->
+ <feature name="part_id" value="Storage Version 3.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370299-99_storage.adf" size="901120" crc="b16ae967" sha1="5cfccf6d596fbafd75336a2f086c920e25b3fe50" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
+ <feature name="part_id" value="Workbench Version 3.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370300-98_workbench.adf" size="901120" crc="d233484c" sha1="ca5b96eaac70558273d3158f476a4e39ca8c7f75" />
+ </dataarea>
+ </part>
+ <part name="locale" interface="floppy_3_5">
+ <!-- original label found, crc should be e0e5de81 -->
+ <feature name="part_id" value="Locale Version 3.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370300-99_locale.adf" size="901120" crc="92f2770a" sha1="f4f360ef6b5cf560fe7d7999829aa2b9d536898e" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found, crc should be 32f55078 -->
+ <feature name="part_id" value="Extras Version 3.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370301-98_extras.adf" size="901120" crc="786a7c59" sha1="0a887f5e1f3b2f2af5b5d4c689cc00ea83414137" status="baddump" />
+ </dataarea>
+ </part>
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found, crc should be 63470de4 -->
+ <feature name="part_id" value="Fonts Version 3.1" />
+ <dataarea name="flop" size="901120">
+ <rom name="370301-99_fonts.adf" size="901120" crc="a152083d" sha1="69f5e5b5ccb626b5aebf29e9ad2e7bd8864cc3c7" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- ESCOM releases below -->
+ <!-- Some disk labels show the same PN as the Commodore release, however the content seems different -->
+
+ <software name="wb31_escom" cloneof="wb31">
+ <description>Workbench 3.1 Rev. 40.42 (ESCOM)</description>
<year>1995</year>
<publisher>ESCOM</publisher>
- <part name="flop1" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="install" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Install 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370299-98_install.adf" size="901120" crc="27b3c15a" sha1="96d1fa31a61a29f4c1fe7d4659e0e32a3fa6b5f8" />
+ <rom name="escom_install.adf" size="901120" crc="27b3c15a" sha1="96d1fa31a61a29f4c1fe7d4659e0e32a3fa6b5f8" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="workbench" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Workbench 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370300-98_workbench.adf" size="901120" crc="576b08f9" sha1="486ea9520e60051c20ec01329d5a0fe3bb10b4fc" />
+ <rom name="escom_workbench.adf" size="901120" crc="576b08f9" sha1="486ea9520e60051c20ec01329d5a0fe3bb10b4fc" />
</dataarea>
</part>
- <part name="flop3" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="locale" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Locale 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370300-99_locale.adf" size="901120" crc="92f2770a" sha1="f4f360ef6b5cf560fe7d7999829aa2b9d536898e" />
+ <rom name="escom_locale.adf" size="901120" crc="92f2770a" sha1="f4f360ef6b5cf560fe7d7999829aa2b9d536898e" />
</dataarea>
</part>
- <part name="flop4" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="extras" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Extras 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370301-98_extras.adf" size="901120" crc="786a7c59" sha1="0a887f5e1f3b2f2af5b5d4c689cc00ea83414137" />
+ <rom name="escom_extras.adf" size="901120" crc="786a7c59" sha1="0a887f5e1f3b2f2af5b5d4c689cc00ea83414137" />
</dataarea>
</part>
- <part name="flop5" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Fonts 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370301-99_fonts.adf" size="901120" crc="a152083d" sha1="69f5e5b5ccb626b5aebf29e9ad2e7bd8864cc3c7" />
+ <rom name="escom_fonts.adf" size="901120" crc="a152083d" sha1="69f5e5b5ccb626b5aebf29e9ad2e7bd8864cc3c7" />
</dataarea>
</part>
- <part name="flop6" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="storage" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Storage 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370299-99_storage.adf" size="901120" crc="b16ae967" sha1="5cfccf6d596fbafd75336a2f086c920e25b3fe50" />
+ <rom name="escom_storage.adf" size="901120" crc="b16ae967" sha1="5cfccf6d596fbafd75336a2f086c920e25b3fe50" />
</dataarea>
</part>
</software>
- <software name="wb31_a4k" cloneof="wb31">
- <description>Workbench 3.1 Rev. 40.42 (A4000T)</description>
+ <software name="wb31_a4000t" cloneof="wb31">
+ <description>Workbench 3.1 Rev. 40.42 A4000T (ESCOM)</description>
<year>1995</year>
<publisher>ESCOM</publisher>
- <part name="flop1" interface="floppy_3_5">
+ <part name="install" interface="floppy_3_5">
+ <!-- pn 370299-97? original label found -->
<feature name="part_id" value="Install 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370299-97_install.adf" size="901120" status="nodump" />
+ <rom name="escom_install_a4000t.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_3_5">
+ <part name="workbench" interface="floppy_3_5">
+ <!-- pn 370300-97? original label found, crc should be 92847a4c -->
<feature name="part_id" value="Workbench 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370300-97_workbench.adf" size="901120" status="nodump" />
+ <rom name="escom_workbench_a4000t.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop3" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="locale" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Locale 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370300-99_locale.adf" size="901120" crc="92f2770a" sha1="f4f360ef6b5cf560fe7d7999829aa2b9d536898e" />
+ <rom name="escom_locale.adf" size="901120" crc="92f2770a" sha1="f4f360ef6b5cf560fe7d7999829aa2b9d536898e" />
</dataarea>
</part>
- <part name="flop4" interface="floppy_3_5">
+ <part name="extras" interface="floppy_3_5">
+ <!-- pn 370301-97? original label found, crc should be 4f4f2e7d -->
<feature name="part_id" value="Extras 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370301-97_extras.adf" size="901120" status="nodump" />
+ <rom name="escom_extras_a4000t.adf" size="901120" status="nodump" />
</dataarea>
</part>
- <part name="flop5" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="fonts" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Fonts 3.1" />
<dataarea name="flop" size="901120">
- <rom name="370301-99_fonts.adf" size="901120" crc="a152083d" sha1="69f5e5b5ccb626b5aebf29e9ad2e7bd8864cc3c7" />
+ <rom name="escom_fonts.adf" size="901120" crc="a152083d" sha1="69f5e5b5ccb626b5aebf29e9ad2e7bd8864cc3c7" />
</dataarea>
</part>
- <part name="flop6" interface="floppy_3_5">
- <!-- Verified dump -->
+ <part name="storage" interface="floppy_3_5">
+ <!-- original label found and listed with this crc at the workbench project -->
<feature name="part_id" value="Storage 3.1" />
<dataarea name="flop" size="901120">
<rom name="370299-99_storage.adf" size="901120" crc="b16ae967" sha1="5cfccf6d596fbafd75336a2f086c920e25b3fe50" />
diff --git a/hash/amigaaga_flop.xml b/hash/amigaaga_flop.xml
index 6729a737f0f..174e97159b9 100644
--- a/hash/amigaaga_flop.xml
+++ b/hash/amigaaga_flop.xml
@@ -8,6 +8,9 @@ license:CC0-1.0
The software listed here is not designed for use on systems without the AGA chipset and
will not function.
+
+ Note:
+ - Please use [Lisa] / [Alice] tag where issues are specifically for amiga/amigaaga.cpp
-->
<softwarelist name="amigaaga_flop" description="Commodore Amiga AGA disk images">
@@ -82,9 +85,10 @@ Some animations seems too fast
<year>1994</year>
<publisher>Virgin Interactive</publisher>
<notes><![CDATA[
-Boots to a purple and blue flickering screen, [FDC] dsksync
+Boots to a purple and blue flickering screen, [FDC] dsksync (DDFSTRT/DDFSTOP issue?)
+[keyboard] eats inputs on copy protection screens
]]></notes>
- <info name="usage" value="Requires AGA" />
+ <info name="usage" value="Requires AGA, sports manual copy protection" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1049612">
@@ -645,7 +649,7 @@ Corrupt tiles if you switch languages in language select menu
<software name="brutaldx" supported="no">
<!-- SPS (CAPS) release 1837 -->
- <description>Brutal Football - Deluxe Edition (Europe)</description>
+ <description>Brutal Sports Series: Football - Deluxe Edition (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, AGA, PAL) -->
<year>1993</year>
@@ -654,6 +658,8 @@ Corrupt tiles if you switch languages in language select menu
Not extensively tested
Gameplay is too fast
]]></notes>
+ <!-- cover/floppy title -->
+ <info name="alt_title" value="Brutal Football" />
<info name="usage" value="Requires AGA" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
@@ -2526,7 +2532,7 @@ Red screen when "Out to lunch is loading" displays, [FDC]
<year>1995</year>
<publisher>21st Century Entertainment</publisher>
<notes><![CDATA[
-Bitplane overlay is offset on title screen
+[Lisa] Bitplane overlay is offset on title screen
Doesn't draw left bumper during gameplay [Copper]?
]]></notes>
<info name="usage" value="Requires AGA" />
@@ -3635,7 +3641,7 @@ ATK test: C:0 H:U Bad
<year>1996</year>
<publisher>21st Century</publisher>
<notes><![CDATA[
-Has no cursor on main menu
+[Denise] has no cursor on main menu, should output with plane 0x10 (pfxpri 0x3f), amigaocs_flop:swiv related trick?
On gameplay unthrottle emulation causes idle vertical scroll to be slower
]]></notes>
<info name="usage" value="Requires AGA" />
@@ -4981,13 +4987,14 @@ Pressing TAB key will switch to NTSC mode (?), which cuts off bottom of screen
</part>
</software>
- <software name="dxgalaga" supported="partial">
+ <software name="dxgalaga" supported="no">
<description>Deluxe Galaga (AGA, v2.6B, 19950903)</description>
<year>1995</year>
<publisher>Edgar Vigdal</publisher>
<notes><![CDATA[
-Guru Meditation when run stand-alone
-Throws "file is missing" when installed to HDD
+Guru Meditation when run stand-alone (fixed)
+[Denise] bonus items and enemy to player bullets don't collide in gameplay, CLXCON even mask
+TODO: Throws "file is missing" when installed to HDD
]]></notes>
<info name="usage" value="Requires AGA" />
diff --git a/hash/amigaocs_flop.xml b/hash/amigaocs_flop.xml
index a1e42e6f033..e05b2d396c5 100644
--- a/hash/amigaocs_flop.xml
+++ b/hash/amigaocs_flop.xml
@@ -98,7 +98,6 @@ license:CC0-1.0
<softwarelist name="amigaocs_flop" description="Commodore Amiga OCS disk images">
<!-- Not listed in SPS? -->
-
<software name="hostile" supported="no">
<description>Hostile Breed (Europe, prototype)</description>
<year>199?</year>
@@ -691,7 +690,7 @@ ATK test: OK
</part>
</software>
- <software name="abanplc" supported="no">
+ <software name="abanplc" supported="partial">
<!-- SPS (CAPS) release 1000 -->
<description>Abandoned Places - A Time for Heroes (Europe)</description>
<!-- retail, standalone -->
@@ -699,7 +698,7 @@ ATK test: OK
<year>1992</year>
<publisher>Electronic Zoo</publisher>
<notes><![CDATA[
-Missing mouse pointer, [Copper] or [Denise] sprites
+One line of [Sprite] corruption for mouse pointer in main menu (works afterwards)
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -1269,7 +1268,6 @@ ATK test: OK
<year>1989</year>
<publisher>Tomahawk</publisher>
<notes><![CDATA[
-boot OK
Credit text colors are a bit off on title screen (verify)
ATK test: OK
]]></notes>
@@ -1282,7 +1280,7 @@ ATK test: OK
<software name="aburner" supported="no">
<!-- SPS (CAPS) release 95 -->
- <description>Afterburner (Europe)</description>
+ <description>After Burner (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1988</year>
@@ -1306,7 +1304,7 @@ ATK test: failed
<software name="aburneru" cloneof="aburner" supported="no">
<!-- SPS (CAPS) release 947 -->
- <description>Afterburner (USA)</description>
+ <description>After Burner (USA)</description>
<!-- budget, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1988</year>
@@ -1329,7 +1327,7 @@ ATK test: failed
<year>1989</year>
<publisher>Dinamic</publisher>
<notes><![CDATA[
-No input works on title screen
+No input works on title screen (works in WHDLoad)
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -1681,7 +1679,7 @@ ATK test: C:0 H:U Bad
</part>
</software>
- <software name="abreed" supported="no">
+ <software name="abreed" supported="partial">
<!-- SPS (CAPS) release 998 -->
<description>Alien Breed (Europe)</description>
<!-- retail, standalone -->
@@ -1689,9 +1687,8 @@ ATK test: C:0 H:U Bad
<year>1991</year>
<publisher>Team 17</publisher>
<notes><![CDATA[
-Throws "amiga_fdc_device::live_run - cur_live.bit_counter > 8" after credits display
-Motor keeps spinning badly on disk swap screen(s) (verify)
-No player sprite, red dots incorrectly drawn on several elements during gameplay (namely alien enemies)
+Throws "amiga_fdc_device::live_run - cur_live.bit_counter > 8" after credits display (worked around)
+Player HP bars slightly corrupted, [Sprite] DMA triggers
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -2033,7 +2030,9 @@ Runs slightly fast (verify)
ATK test: OK
]]></notes>
<!-- from ranking screen -->
- <info name="developer" value="Kyle Hodgetts, Tony Windsor, Barry Smith" />
+ <info name="developer" value="Kyle Hodgetts" />
+ <info name="developer" value="Tony Windsor" />
+ <info name="developer" value="Barry Smith" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
<rom name="(sps1921)alpha-1.ipf" size="1049612" crc="f890bd14" sha1="8a604afc3d7b17ec17fd7b69b3f79af46d0d368b"/>
@@ -2725,6 +2724,8 @@ ATK test: failed
<year>1994</year>
<publisher>Virgin</publisher>
<notes><![CDATA[
+Guru Meditation 00000004.00001970 at bootup
+[Copper] cuts bottom part of screen badly during gameplay, uses SKIP
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -3545,9 +3546,10 @@ ATK test: C:0 H:U Bad
<notes><![CDATA[
ATK test: OK
]]></notes>
+ <!-- baddump: Sector 1086 damaged by Lamer Exterminator -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049180">
- <rom name="(sps2159)astatin.ipf" size="1049180" crc="8817db76" sha1="74a4d3f19c165c5fe3277f5534ea0a453da5fae1"/>
+ <rom name="(sps2159)astatin.ipf" size="1049180" crc="8817db76" sha1="74a4d3f19c165c5fe3277f5534ea0a453da5fae1" status="baddump"/>
</dataarea>
</part>
</software>
@@ -3761,6 +3763,10 @@ ATK test: failed
<year>1989</year>
<publisher>Mindware</publisher>
<notes><![CDATA[
+Black screen after initial credits, [FDC] DSKSYNC $a425
+[Denise] title off with defbitoffs
+[Denise] bitplanes off by a whole screen size in gameplay
+WHDLoad issue #5120 (for Hot Shots release?)
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -3787,7 +3793,7 @@ ATK test: C:0 H:U 1 Sector Bad
</part>
</software>
- <software name="australo" supported="no">
+ <software name="australo" supported="partial">
<!-- SPS (CAPS) release 809 -->
<description>Australo Piticus Mechanicus (Europe)</description>
<!-- retail, standalone -->
@@ -3795,8 +3801,13 @@ ATK test: C:0 H:U 1 Sector Bad
<year>1988</year>
<publisher>Timewarp</publisher>
<notes><![CDATA[
+Aliased sound SFX samples during gameplay, ch. 0 and 3 [Paula] audxlch_w points to file structure (verify, unlikely)
+Pressing HELP on "run TaskForceInfo" will quick load then skip each profile (verify)
ATK test: OK
]]></notes>
+ <!-- Omake: "copy protection" with SYSTEM at second prompt, "logon superoper helix", -->
+ <!-- "help" for further commands -->
+ <info name="usage" value="To enter main game, type anything at first prompt then GAME at second" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
<rom name="(sps809)australopiticusmechanicus.ipf" size="1049612" crc="2650009b" sha1="4cb791388927cadb0ce6ac928404092bc62f49ca"/>
@@ -4200,7 +4211,7 @@ ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
- <rom name="(sps1591)backgammon.ipf" size="1049612" crc="efbe5e06" sha1="8e586af18898906f691aa1afcc782392bfd42d46"/>
+ <rom name="(sps1591)backgammon.ipf" size="1049612" crc="efbe5e06" sha1="8e586af18898906f691aa1afcc782392bfd42d46" />
</dataarea>
</part>
</software>
@@ -4212,10 +4223,11 @@ ATK test: OK
<!-- (Amiga, OCS, PAL) -->
<year>1987</year>
<publisher>King Size</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: SCA bootblock -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049180">
- <rom name="(sps206)backgammon.ipf" size="1049180" crc="b7e159cb" sha1="64a12d9db73c704195ce0d6733fb3c52cc5fba7b" status="baddump"/>
+ <rom name="(sps206)backgammon.ipf" size="1049180" crc="b7e159cb" sha1="64a12d9db73c704195ce0d6733fb3c52cc5fba7b" status="baddump" />
</dataarea>
</part>
</software>
@@ -4995,6 +5007,7 @@ ATK test: OK
<software name="batman" supported="no">
<!-- SPS (CAPS) release 6 -->
+ <!-- TODO: check why people refers to this as "Batman: The Movie" -->
<description>Batman (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
@@ -5017,7 +5030,7 @@ ATK test: C:0 H:U Bad
</part>
</software>
- <software name="batman1" cloneof="batman" supported="no">
+ <software name="batman1" cloneof="batman" supported="yes">
<!-- SPS (CAPS) release 19 -->
<description>Batman (Europe, Single Disk)</description>
<!-- retail, standalone -->
@@ -5025,7 +5038,6 @@ ATK test: C:0 H:U Bad
<year>1989</year>
<publisher>Ocean</publisher>
<notes><![CDATA[
-Black screen, [CIAB] fails on comparing a TOD 9 > 0x115 at PC=de4
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -5220,7 +5232,7 @@ Fatal errors in ipf_decode::generate_timings type 4
</part>
</software>
- <software name="batlisle" supported="no">
+ <software name="batlisle" supported="partial">
<!-- SPS (CAPS) release 1991 -->
<description>Battle Isle (Europe)</description>
<!-- retail, standalone -->
@@ -5228,6 +5240,7 @@ Fatal errors in ipf_decode::generate_timings type 4
<year>1991</year>
<publisher>Blue Byte</publisher>
<notes><![CDATA[
+[Denise] overscan cut off to the far right
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -5382,6 +5395,7 @@ ATK test: OK
<year>1989</year>
<publisher>Hewson</publisher>
<notes><![CDATA[
+Guru Meditation 00000004.00001970
ATK test: C:0 H:U 1 Sector Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -5528,7 +5542,7 @@ ATK test: OK
</part>
</software>
- <software name="bckid" supported="no">
+ <software name="bckid" supported="partial">
<!-- SPS (CAPS) release 435 -->
<description>B.C. Kid (Europe)</description>
<!-- retail, standalone -->
@@ -5536,6 +5550,8 @@ ATK test: OK
<year>1992</year>
<publisher>Ubi Soft</publisher>
<notes><![CDATA[
+Should run at 57 Hz, pings [Denise] ECS $dff1c0 CRTC regs
+cfr. https://eab.abime.net/showthread.php?t=51954
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -5588,7 +5604,8 @@ ATK test: OK
<!-- (Amiga, OCS, PAL) -->
<year>1989</year>
<publisher>Magic Bytes</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: NorthStar 2 Bootblock -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1043202">
<rom name="(sps1304)beam.ipf" size="1043202" crc="7b894a65" sha1="d88c483405e7b3cb3c1ab2e4fb374036f342e032" status="baddump"/>
@@ -6380,6 +6397,7 @@ ATK test: C:1 Bad
<year>1992</year>
<publisher>Psygnosis</publisher>
<notes><![CDATA[
+Title screen is unresponsive, keeps prompting for "Press Left Mouse Button", [FDC] with adkcon=$3100 (heavy activity)
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -6406,7 +6424,7 @@ ATK test: failed
</part>
</software>
- <software name="biochall" supported="no">
+ <software name="biochall" supported="yes">
<!-- SPS (CAPS) release 1733 -->
<description>Bio Challenge (Europe)</description>
<!-- retail, standalone -->
@@ -6431,6 +6449,7 @@ ATK test: C:79 H:U 1 Sector Bad
<year>1989</year>
<publisher>Delphine</publisher>
<notes><![CDATA[
+Guru Meditation 0000000b.00001970
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -6842,6 +6861,7 @@ ATK test: C:0 H:U Bad
<year>1993</year>
<publisher>Core Design</publisher>
<notes><![CDATA[
+[Denise] scrolling jitters, both vertical and horizontal
ATK test: C:0 H:U Bad, C:67 H:L 1 Sector Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -7015,6 +7035,7 @@ ATK test: OK
<year>1989</year>
<publisher>Psygnosis</publisher>
<notes><![CDATA[
+Cursor sprite is invisible on shops
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -7261,7 +7282,7 @@ fatalerrors when trying to mount "Incompatible image format or corrupted data"
</part>
</software>
- <software name="bmx" supported="no">
+ <software name="bmx" supported="yes">
<!-- SPS (CAPS) release 2059 -->
<description>BMX Simulator (Europe)</description>
<!-- retail, standalone -->
@@ -7319,7 +7340,7 @@ ATK test: OK
</part>
</software>
- <software name="bblow" supported="no">
+ <software name="bblow" supported="partial">
<!-- SPS (CAPS) release 1147 -->
<description>Body Blows (Europe, v2)</description>
<!-- retail, standalone -->
@@ -7327,6 +7348,8 @@ ATK test: OK
<year>1993</year>
<publisher>Team 17</publisher>
<notes><![CDATA[
+Individual 1 frame of GFX corruptions during gameplay (particularly on jumps)
+Slightly erratic gameplay timings (verify)
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -7525,6 +7548,7 @@ ATK test: OK
<year>1992</year>
<publisher>Thalamus</publisher>
<notes><![CDATA[
+Keeps pinging [FDC] DSKDAT R during gameplay
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -7606,6 +7630,8 @@ ATK test: OK
<year>1991</year>
<publisher>Silmarils</publisher>
<notes><![CDATA[
+Guru Meditation 0000000B.0000A880 if pressing mouse button before title screen appears
+Mouse cursor is uncontrollable, [joytest] reset counters
ATK test: C:79 H:U 1 Sector Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -7814,7 +7840,7 @@ Fatal errors in ipf_decode::generate_timings type 4
new68k: white screen
Title screen background glitches out [Copper]
Map screen mosaic effect is off [Copper]
-Gameplay has no [Denise] sprites [Copper]
+Gameplay missing [Denise] lives counter, missing background [Copper]
https://codetapper.com/amiga/sprite-tricks/brian-the-lion/
ATK test: OK
]]></notes>
@@ -7923,7 +7949,7 @@ ATK test: OK
</part>
</software>
- <software name="brutal" supported="no">
+ <software name="brutal" supported="partial">
<!-- SPS (CAPS) release 181 -->
<description>Brutal - Paws of Fury (Europe)</description>
<!-- retail, standalone -->
@@ -7931,6 +7957,7 @@ ATK test: OK
<year>1995</year>
<publisher>GameTek</publisher>
<notes><![CDATA[
+Options menu don't show any color change for ON OFF items (verify, copper list very bare)
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -7949,7 +7976,7 @@ ATK test: OK
<software name="brutalfb" supported="no">
<!-- SPS (CAPS) release 209 -->
- <description>Brutal Football (Europe)</description>
+ <description>Brutal Sports Series: Football (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1993</year>
@@ -7957,6 +7984,8 @@ ATK test: OK
<notes><![CDATA[
ATK test: OK
]]></notes>
+ <!-- cover/floppy title -->
+ <info name="alt_title" value="Brutal Football" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1049180">
@@ -8131,6 +8160,7 @@ ATK test: C:0 H:U Bad
<year>1988</year>
<publisher>Accolade</publisher>
<notes><![CDATA[
+Demo inputs may desync, noticeable on 020+ machines
ATK test: C:0 H:U 1 Sector Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -9926,7 +9956,7 @@ ATK test: OK
<software name="ckrynn" supported="no">
<!-- SPS (CAPS) release 986 -->
- <description>Champions of Krynn (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Champions of Krynn (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1990</year>
@@ -10177,9 +10207,10 @@ ATK test: C:0 H:U Bad
<notes><![CDATA[
ATK test: OK
]]></notes>
+ <!-- baddump: Sector 1369 damaged by Lamer Exterminator -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049180">
- <rom name="(sps2804)chariotsofwrath.ipf" size="1049180" crc="80a90a55" sha1="3a82d6211323170f4ac9ad5bf815e5fe06c75a8b"/>
+ <rom name="(sps2804)chariotsofwrath.ipf" size="1049180" crc="80a90a55" sha1="3a82d6211323170f4ac9ad5bf815e5fe06c75a8b" status="baddump" />
</dataarea>
</part>
</software>
@@ -10259,13 +10290,14 @@ ATK test: C:0 H:U Bad
<!-- (Amiga, OCS, PAL) -->
<year>1990</year>
<publisher>Ocean</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1049304">
<rom name="(sps1246)chasehqii-specialcriminalinvestigation_disk1.ipf" size="1049304" crc="7c1fd4ab" sha1="7fe8f14785d048c1e9fad7e4b162f998107f1e3c"/>
</dataarea>
</part>
+ <!-- baddump: Lamer Exterminator Bootblock -->
<part name="flop2" interface="floppy_3_5">
<feature name="part_id" value="Disk 2" />
<dataarea name="flop" size="1049612">
@@ -11818,7 +11850,9 @@ Runs slightly fast (verify)
ATK test: OK
]]></notes>
<!-- from ranking screen -->
- <info name="developer" value="Kyle Hodgetts, Tony Windsor, Barry Smith" />
+ <info name="developer" value="Kyle Hodgetts" />
+ <info name="developer" value="Tony Windsor" />
+ <info name="developer" value="Barry Smith" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
@@ -12066,6 +12100,7 @@ ATK test: OK
</part>
</software>
+ <!-- "F40 Pursuit Simulator" alt version known to exist (title screen) -->
<software name="crazycr2" supported="no">
<!-- SPS (CAPS) release 311 -->
<description>Crazy Cars II (Europe)</description>
@@ -12124,6 +12159,7 @@ ATK test: C:79 H:U 1 Sector Bad
</part>
</software>
+ <!-- PD version known to exist https://www.aminet.net/package/game/jump/CrazySueII -->
<software name="crazsue2" supported="no">
<!-- SPS (CAPS) release 2195 -->
<description>Crazy Sue... Goes On (Europe)</description>
@@ -12132,10 +12168,13 @@ ATK test: C:79 H:U 1 Sector Bad
<year>1992</year>
<publisher>&lt;coverdisk&gt;</publisher>
<notes><![CDATA[
+TODO: test me in full, is track 43 onward bad just a side effect of using RNC cruncher?
ATK test: C:43 onward Bad
]]></notes>
+ <info name="alt_title" value="Crazy Sue II" />
<info name="magazine" value="Amiga Mania" />
<info name="release" value="199209xx" />
+ <!-- Omake: type "HIRONZMUSJUMPSHOE" on title screen to enable cheat mode -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="572608">
<rom name="(sps2195)crazysueii.ipf" size="572608" crc="972f6c69" sha1="72ecd9fddce9b9574c980df895a518e551925cff"/>
@@ -12591,7 +12630,7 @@ ATK test: C:0 H:U Bad
<software name="azurebnd" supported="no">
<!-- SPS (CAPS) release 982 -->
- <description>Curse of the Azure Bonds (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Curse of the Azure Bonds (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1990</year>
@@ -13554,7 +13593,7 @@ ATK test: OK
<software name="dkkrynn" supported="no">
<!-- SPS (CAPS) release 987 -->
- <description>Death Knights of Krynn (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Death Knights of Krynn (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1991</year>
@@ -15329,7 +15368,7 @@ ATK test: failed
<software name="dflame" supported="no">
<!-- SPS (CAPS) release 985 -->
- <description>Dragons of Flame (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Dragons of Flame (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1989</year>
@@ -15399,7 +15438,7 @@ ATK test: C:0 H:U Bad
<software name="drgstrik" supported="no">
<!-- SPS (CAPS) release 1479 -->
- <description>DragonStrike (USA, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - DragonStrike (USA, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1990</year>
@@ -16228,7 +16267,7 @@ ATK test: OK
</part>
</software>
- <software name="dynablst" supported="no">
+ <software name="dynablst" supported="yes">
<!-- SPS (CAPS) release 664 -->
<description>Dyna Blaster (Europe)</description>
<!-- retail, standalone -->
@@ -16238,6 +16277,7 @@ ATK test: OK
<notes><![CDATA[
ATK test: OK
]]></notes>
+ <info name="usage" value="Requires adaptator in Centronics port (player 1 is in port 3)" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
<rom name="(sps664)dynablaster.ipf" size="1049612" crc="cb1f037c" sha1="11d6f5d65ae7affd4e6ab90bcfde1e725d217560"/>
@@ -16414,6 +16454,8 @@ ATK test: C:0 H:U 1 Sector Bad
<year>1990</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
+Requires audiotape playback to go along with intro (otherwise silent)
+TODO: is this a Multi 5 release, where every region got its own language audio?
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -17122,7 +17164,7 @@ ATK test: OK
<year>1994</year>
<publisher>Empire Software</publisher>
<notes><![CDATA[
-Soccer field background GFX has serious glitches during gameplay, wrong [Blitter] copies
+Soccer field background GFX has serious glitches during gameplay, wrong [Blitter] copies (can't repro, assume fixed)
ATK test: OK
]]></notes>
<info name="usage" value="Sports score card copy-protection at first half time"/>
@@ -17402,8 +17444,9 @@ ATK test: OK
<!-- (Amiga, OCS, PAL) -->
<year>1988</year>
<publisher>Grandslam</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
<info name="alt_title" value="Espionage - The Computer Game (Box)" />
+ <!-- baddump: NorthStar 2 Bootblock -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
<rom name="(sps11)espionage.ipf" size="1049612" crc="258a0c8e" sha1="604fbea189f9f2a1dc252bb9dc952f4af2f3b051" status="baddump"/>
@@ -17846,7 +17889,7 @@ ATK test: OK
<software name="eyebehol" supported="no">
<!-- SPS (CAPS) release 116 -->
- <description>Eye of the Beholder (Europe)</description>
+ <description>Advanced Dungeons &amp; Dragons - Eye of the Beholder (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1991</year>
@@ -17876,7 +17919,7 @@ ATK test: OK
<software name="eyebeholg" cloneof="eyebehol" supported="no">
<!-- SPS (CAPS) release 680 -->
- <description>Eye of the Beholder (Germany)</description>
+ <description>Advanced Dungeons &amp; Dragons - Eye of the Beholder (Germany)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1991</year>
@@ -17906,7 +17949,7 @@ ATK test: OK
<software name="eyebeho2" supported="no">
<!-- SPS (CAPS) release 834 -->
- <description>Eye of the Beholder II - The Legend of Darkmoon (Europe)</description>
+ <description>Advanced Dungeons &amp; Dragons - Eye of the Beholder II: The Legend of Darkmoon (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1992</year>
@@ -17942,7 +17985,7 @@ ATK test: OK
<software name="eyebeho2g" cloneof="eyebeho2" supported="no">
<!-- SPS (CAPS) release 681 -->
- <description>Eye of the Beholder II - Legende von Darkmoon (Germany)</description>
+ <description>Advanced Dungeons &amp; Dragons - Eye of the Beholder II - Legende von Darkmoon (Germany)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1992</year>
@@ -18178,14 +18221,16 @@ ATK test: failed
<software name="fa18" supported="no">
<!-- SPS (CAPS) release 119 -->
- <description>FA18 Interceptor (Europe)</description>
+ <description>F/A-18 Interceptor (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
- <year>199?</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1988</year>
+ <publisher>Electronic Arts</publisher>
<notes><![CDATA[
ATK test: OK
]]></notes>
+ <!-- TODO: untested afterwards -->
+ <info name="usage" value="Sports code wheel copy-protection"/>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049180">
<rom name="(sps119)fa18interceptor.ipf" size="1049180" crc="3a323362" sha1="a4285482aee97cf5243bcfc5ac0e3cde6a1d4e69"/>
@@ -18981,6 +19026,7 @@ ATK test: C:0 H:U Bad
<year>1991</year>
<publisher>Storm</publisher>
<notes><![CDATA[
+Runs too fast
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -21172,6 +21218,7 @@ ATK test: failed
<software name="gearwork" supported="no">
<!-- SPS (CAPS) release 1028 -->
+ <!-- Also known as Clik Clak (US?) -->
<description>Gear Works (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
@@ -21460,7 +21507,7 @@ ATK test: C:79 Bad
</part>
</software>
- <software name="ghoulsvf" supported="no">
+ <software name="ghoulsvf" supported="partial">
<!-- SPS (CAPS) release 1985 -->
<description>Ghouls 'n' Ghosts &amp; Venus the Flytrap (Europe, Chart Attack)</description>
<!-- retail, standalone -->
@@ -21468,7 +21515,7 @@ ATK test: C:79 Bad
<year>1991</year>
<publisher>Gremlin Graphics</publisher>
<notes><![CDATA[
-gng: throws "amiga_fdc_device::live_run - cur_live.bit_counter > 8" then fatalerrors after DSKDAT access
+gng: throws "amiga_fdc_device::live_run - cur_live.bit_counter > 8" then fatalerrors after DSKDAT access (fixed)
venus: asks to swap disk with incorrect pitch GFX then throws DSKDAT R and hangs (fixed)
venus: [Denise] offset bitplanes (game area, weapon bar, bonus stages)
ATK test: OK
@@ -23534,7 +23581,7 @@ ATK test: OK
<software name="herolanc" supported="no">
<!-- SPS (CAPS) release 778 -->
- <description>Heroes of the Lance (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1988</year>
@@ -23822,7 +23869,7 @@ ATK test: OK
<software name="hillsfar" supported="no">
<!-- SPS (CAPS) release 981 -->
- <description>Hillsfar (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Hillsfar (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1989</year>
@@ -23839,7 +23886,7 @@ ATK test: OK
<software name="hillsfarg" cloneof="hillsfar" supported="no">
<!-- SPS (CAPS) release 961 -->
- <description>Hillsfar (Germany, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons - Hillsfar (Germany, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1989</year>
@@ -29543,7 +29590,7 @@ ATK test: OK
<!-- (Amiga, OCS, PAL) -->
<year>1990</year>
<publisher>Rainbow Arts</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1049180">
@@ -29556,6 +29603,7 @@ ATK test: OK
<rom name="(sps1589)legendoffaerghail_disk2.ipf" size="1049180" crc="f12792ce" sha1="089a3f0df65662aadadefab3a8502a07c4cfe49b"/>
</dataarea>
</part>
+ <!-- baddump: Byte Bandit Bootblock -->
<part name="flop3" interface="floppy_3_5">
<feature name="part_id" value="Disk 3" />
<dataarea name="flop" size="1049180">
@@ -30362,7 +30410,6 @@ fatalerrors when trying to mount "Incompatible image format or corrupted data"
<publisher>Ocean</publisher>
<notes><![CDATA[
black screen [FDC] dsksync (fixed)
-masked Lethal Weapon intro text has raster issue, [Copper] expects +56 scanlines
TODO: Needs multiple presses with no video feedback on mission select section?
TODO: test extensively before promoting
ATK test: C:0 H:U Bad
@@ -30460,7 +30507,7 @@ ATK test: C:0 H:U Bad
<year>1991</year>
<publisher>Mindscape</publisher>
<notes><![CDATA[
-Mouse cursor is uncontrollable, [joytest] reset counter
+Mouse cursor is uncontrollable, [joytest] reset counters
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -30599,7 +30646,7 @@ ATK test: OK
<notes><![CDATA[
Has DIW alignment issues (stage intro text, in-game), first boss background layer has wrong colors.
a500/a500p: doesn't draw any sprite
-a1200: major GFX pitch corruption on bitplanes (regressed after adding extended [Denise] delays)
+a1200: doesn't show player sprite at first boss (with colors fixed here)
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -30910,6 +30957,7 @@ ATK test: OK
<year>1990</year>
<publisher>Audiogenic</publisher>
<notes><![CDATA[
+Unresponsive [keyboard] space key when prompted to start a game.
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -30921,7 +30969,9 @@ ATK test: C:0 H:U Bad
<software name="lotr1" supported="no">
<!-- SPS (CAPS) release 1299 -->
- <description>Lord of the Rings Vol. I (Europe)</description>
+ <!-- "J.R.R. Tolkien's The Lord of the Rings" on box art and manual covers -->
+ <!-- "Lord of The Rings" on title and disk covers -->
+ <description>The Lord of the Rings Vol. I (Europe)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1991</year>
@@ -30951,7 +31001,7 @@ ATK test: OK
<software name="lotr1f" cloneof="lotr1" supported="no">
<!-- SPS (CAPS) release 2373 -->
- <description>Lord of the Rings Vol. I (France)</description>
+ <description>The Lord of the Rings Vol. I (France)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1991</year>
@@ -30981,7 +31031,7 @@ ATK test: OK
<software name="lotr1g" cloneof="lotr1" supported="no">
<!-- SPS (CAPS) release 2536 -->
- <description>Lord of the Rings Vol. I (Germany)</description>
+ <description>The Lord of the Rings Vol. I (Germany)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1991</year>
@@ -31105,7 +31155,7 @@ ATK test: C:0 H:U 1 Sector Bad
</part>
</software>
- <software name="lostpatr" supported="no">
+ <software name="lostpatr" supported="partial">
<!-- SPS (CAPS) release 773 -->
<description>Lost Patrol (Europe)</description>
<!-- retail, standalone -->
@@ -31113,9 +31163,8 @@ ATK test: C:0 H:U 1 Sector Bad
<year>1990</year>
<publisher>Ocean</publisher>
<notes><![CDATA[
-Garbage on language screen select then black screen [FDC] copy protection check at PC=243ac (enables 68k trace mode)
-new68k: [FDC] read error
-Ocean logo has serious pitch issues
+[FDC] copy protection check at PC=243ac (enables 68k trace mode, fixed)
+[Denise] Ocean logo has erratic delay scrolling
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -31132,7 +31181,7 @@ ATK test: C:0 H:U Bad
</part>
</software>
- <software name="lostpatru" cloneof="lostpatr" supported="no">
+ <software name="lostpatru" cloneof="lostpatr" supported="partial">
<!-- SPS (CAPS) release 498 -->
<description>Lost Patrol (USA)</description>
<!-- retail, standalone -->
@@ -31140,7 +31189,6 @@ ATK test: C:0 H:U Bad
<year>1990</year>
<publisher>Ocean</publisher>
<notes><![CDATA[
-black screen
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -31289,7 +31337,7 @@ ATK test: OK
<year>1990</year>
<publisher>Gremlin Graphics</publisher>
<notes><![CDATA[
-Locks up after Kickstart (white screen)
+Takes forever to enter gameplay
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -31307,6 +31355,7 @@ ATK test: failed
<year>1990</year>
<publisher>Gremlin Graphics</publisher>
<notes><![CDATA[
+Takes forever to enter gameplay
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -31324,6 +31373,7 @@ ATK test: OK
<year>1990</year>
<publisher>Gremlin Graphics</publisher>
<notes><![CDATA[
+Takes forever to enter gameplay
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -31341,9 +31391,9 @@ ATK test: failed
<year>1992</year>
<publisher>Gremlin Graphics</publisher>
<notes><![CDATA[
-black screen
ATK test: failed
]]></notes>
+ <info name="usage" value="Sports manual copy protection" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1009712">
@@ -31366,7 +31416,7 @@ ATK test: failed
<year>1991</year>
<publisher>Gremlin Graphics</publisher>
<notes><![CDATA[
-Locks up after Kickstart (white screen)
+Locks up after Kickstart (white screen), tight loops for [FDC] DSKBLK with DMACON off, "DISK ERROR NUMBER 2" if bypassed
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -33027,7 +33077,7 @@ ATK test: OK
</part>
</software>
- <software name="micromac" supported="no">
+ <software name="micromac" supported="yes">
<!-- SPS (CAPS) release 357 -->
<description>Micro Machines (Europe)</description>
<!-- retail, standalone -->
@@ -33035,7 +33085,6 @@ ATK test: OK
<year>1993</year>
<publisher>Codemasters</publisher>
<notes><![CDATA[
-White screen
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -33099,7 +33148,7 @@ ATK test: OK
</part>
</software>
- <software name="mpsoccer" supported="no">
+ <software name="mpsoccer" supported="yes">
<!-- SPS (CAPS) release 1078 -->
<description>MicroProse Soccer (Europe, Soccer Stars)</description>
<!-- retail, standalone -->
@@ -33107,7 +33156,6 @@ ATK test: OK
<year>1989</year>
<publisher>MicroProse</publisher>
<notes><![CDATA[
-Hangs after selecting a game mode on title screen
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -34880,8 +34928,6 @@ ATK test: OK
<year>1989</year>
<publisher>Psyclapse</publisher>
<notes><![CDATA[
-black screen with eventually running irq at $ffffff, [FDC] dsksync (fixed)
-Hangs on [CIA] timer A readback while setting mode $99 (fixed)
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -36186,7 +36232,8 @@ ATK test: failed
<year>1988</year>
<publisher>Ariolasoft</publisher>
<info name="alt_title" value="Ooze - Als die Geister mürbe wurden (Box)" />
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: PvL Virus Protector v5.0 Bootblock -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
<rom name="(sps1255)ooze.ipf" size="1049612" crc="40d448b7" sha1="66c53d7a931bae8c5436db777c19e40893fd0c9d" status="baddump"/>
@@ -37016,7 +37063,7 @@ ATK test: C:even H:L 1 Sector Bad
</part>
</software>
- <software name="pang" supported="no">
+ <software name="pang" supported="yes">
<!-- SPS (CAPS) release 929 -->
<description>Pang (Europe)</description>
<!-- retail, standalone -->
@@ -37024,8 +37071,6 @@ ATK test: C:even H:L 1 Sector Bad
<year>1990</year>
<publisher>Ocean</publisher>
<notes><![CDATA[
-Throws a Guru Meditation on first boot, boots afterwards, [CIAB]?
-black screen after level select, trashes memory, [FDC]
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -38371,14 +38416,17 @@ ATK test: OK
<software name="poolrad" supported="no">
<!-- SPS (CAPS) release 555 -->
- <description>Pool of Radiance (Europe, v1.0)</description>
+ <description>Advanced Dungeons &amp; Dragons: Pool of Radiance (Europe, v1.0)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1990</year>
<publisher>U.S. Gold</publisher>
<notes><![CDATA[
ATK test: OK
+TODO: untested
]]></notes>
+ <info name="usage" value="Sports code wheel copy-protection" />
+
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk A" />
<dataarea name="flop" size="1049612">
@@ -38395,7 +38443,7 @@ ATK test: OK
<software name="pooldark" supported="no">
<!-- SPS (CAPS) release 984 -->
- <description>Pools of Darkness (Europe, v1.0 19920309)</description>
+ <description>Advanced Dungeons &amp; Dragons - Pools of Darkness (Europe, v1.0 19920309)</description>
<!-- retail, standalone -->
<!-- (Amiga, OCS, PAL) -->
<year>1992</year>
@@ -39077,7 +39125,8 @@ ATK test: OK
<!-- (Amiga, OCS, PAL) -->
<year>1988</year>
<publisher>MicroProse</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: Byte Warrior (DASA) Bootblock -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1049612">
<rom name="(sps712)presidentismissing,the.ipf" size="1049612" crc="03a617da" sha1="d5d5028f8b834567ee9b5a55264a9b860f00b6f8" status="baddump"/>
@@ -41582,7 +41631,7 @@ ATK test: failed
</part>
</software>
- <software name="roadrash" supported="no">
+ <software name="roadrash" supported="partial">
<!-- SPS (CAPS) release 1313 -->
<description>Road Rash (Europe)</description>
<!-- retail, standalone -->
@@ -41591,7 +41640,9 @@ ATK test: failed
<publisher>Electronic Arts</publisher>
<notes><![CDATA[
Hangs with color cycle genlock at boot, [FDC] dsksync (fixed)
-Keeps asking "insert disk 2" while disk 2 is in [FDC]
+Keeps asking "insert disk 2" while disk 2 is in [FDC] (fixed)
+Gameplay logic falls apart on 020+ machines (verify)
+Slightly off [Denise] delay offsets on 020+ machines for mountain backgrounds (verify)
ATK test: OK
]]></notes>
<info name="usage" value="Sports manual copy-protection (bike stats)"/>
@@ -42039,7 +42090,7 @@ ATK test: OK
<publisher>Storm</publisher>
<notes><![CDATA[
Black screen [FDC] copy protection check at PC=3ed8 (enables 68k trace mode) (fixed)
-Gameplay doesn't draw status bar on the right, [Copper] sprites
+Gameplay doesn't draw status bar on the right, [Copper] sprites. Works on a1200 (sets NTSC) and in a4000
https://codetapper.com/amiga/sprite-tricks/rod-land/
ATK test: C:0 H:U Bad
]]></notes>
@@ -43147,6 +43198,7 @@ ATK test: OK
<year>1991</year>
<publisher>U.S. Gold</publisher>
<notes><![CDATA[
+WHDLoad has issues reading disk 3, baddump?
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -43729,9 +43781,10 @@ ATK test: OK
<publisher>Psygnosis</publisher>
<notes><![CDATA[
Red screen, [FDC] dsksync (fixed)
-Title screen shows with foreground garbage, [Copper] sprites
+Title screen shows with foreground garbage, bad [FDC] data?
https://codetapper.com/amiga/sprite-tricks/shadow-of-the-beast/
Hangs during first intro in gameplay
+Split up [Denise] bitplanes on a top row, [Copper]?
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -44190,7 +44243,8 @@ ATK test: C:0 H:U Bad
<!-- (Amiga, OCS, PAL) -->
<year>1993</year>
<publisher>Accrosoft</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: SADDAM disk-validator -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disquette 0" />
<dataarea name="flop" size="1049180">
@@ -45817,7 +45871,6 @@ ATK test: C:79 Bad
<year>1993</year>
<publisher>Krisalis</publisher>
<notes><![CDATA[
-new68k: trashes memory after initial loading, reports regressed track reading in ATK, [FDC] or [CIA]
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -47803,7 +47856,8 @@ ATK test: OK
<!-- (Amiga, OCS, PAL) -->
<year>1988</year>
<publisher>Logotron</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: SCA Bootblock -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Boot Disk" />
<dataarea name="flop" size="1049612">
@@ -49310,8 +49364,9 @@ ATK test: OK
<year>1993</year>
<publisher>Team 17</publisher>
<notes><![CDATA[
-Red screen [FDC] dsksync
-Has serious GFX pitch issues on gameplay, no sprites with a500p (update: regressed with a500 too, [Copper]?)
+Red screen [FDC] dsksync (fixed?)
+Main sprite randomly don't show up, [Copper]?
+Green ball attack sometimes don't show up when firing straight right
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -49622,8 +49677,7 @@ ATK test: OK
<publisher>Discovery</publisher>
<notes><![CDATA[
black screen [FDC] dsksync (fixed)
-Has sprite GFX vertical strip on first loaded map screen
-Has incorrect transparent pixels across gameplay (cfr. player sprite left boot, spears in stage 2, barrels in stage 3)
+[Blitter] incorrect transparent pixels across gameplay (cfr. player sprite left boot, spears in stage 2, barrels in stage 3)
Game Over screen has [Denise] GFX glitch
TODO: verify collision detection (cfr. attack doesn't trigger when extremely near enemies, pickups)
TODO: verify this with a500p once [FDC] dsksync bug is actually fixed
@@ -57164,7 +57218,8 @@ ATK test: failed
<!-- (Amiga, OCS, PAL) -->
<year>1989</year>
<publisher>Ubi Soft</publisher>
- <info name="additional" value="Mastered with virus" />
+ <info name="warning" value="Mastered with virus" />
+ <!-- baddump: Lamer Exterminator Bootblock -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1055523">
<rom name="(sps2768)zombi.ipf" size="1055523" crc="97261026" sha1="922fdade85ab40968c3c4d028ab841151573d572" status="baddump"/>
diff --git a/hash/apfimag_cass.xml b/hash/apfimag_cass.xml
index 0bbf6bcbe3c..076d2c399e6 100644
--- a/hash/apfimag_cass.xml
+++ b/hash/apfimag_cass.xml
@@ -21,7 +21,7 @@ Once the tape has finished loading, just type RUN to start the loaded program --
<description>16K Letter Writter</description>
<year>1982</year>
<publisher>Milt Perry</publisher>
- <info name="usage" value="Requires 16K RAM" />
+ <info name="required_ram" value="16K" />
<part name="cass" interface="apf_cass">
<dataarea name="cass" size="1743020">
<rom name="m_perry_16k_letter_writter(16k).wav" size="1743020" crc="d1ca5e2d" sha1="4c844e54836d4f1de0bf4d653860c5c20444d304"/>
@@ -33,7 +33,7 @@ Once the tape has finished loading, just type RUN to start the loaded program --
<description>An Adventure in Murder</description>
<year>198?</year>
<publisher>R. Eisman</publisher>
- <info name="usage" value="Requires 16K RAM" />
+ <info name="required_ram" value="16K" />
<part name="cass" interface="apf_cass">
<dataarea name="cass" size="2030598">
<rom name="r_eisman_adventure_in_murder(16k).wav" size="2030598" crc="5fbd2aed" sha1="aca54da042c60b96fd7288f6a5df54d7239757c8"/>
@@ -45,7 +45,7 @@ Once the tape has finished loading, just type RUN to start the loaded program --
<description>ALPHAbit</description>
<year>19??</year>
<publisher>MR R's</publisher>
- <info name="usage" value="Requires 16K RAM" />
+ <info name="required_ram" value="16K" />
<part name="cass" interface="apf_cass">
<dataarea name="cass" size="1750444">
<rom name="mr_rs_alphabit(16k).wav" size="1750444" crc="f7eb904d" sha1="19dfca668cc5c54af0278553f5600ba3e8bdd9ee"/>
@@ -318,7 +318,7 @@ checks whether the user is typing the program printed in the manual, for each le
<!-- glitched gfx -->
<software name="defendyca" cloneof="defendyc" supported="partial">
- <description>Defender (York 10 Computerware, Alt)</description>
+ <description>Defender (York 10 Computerware, alt)</description>
<year>19??</year>
<publisher>York 10 Computerware</publisher>
<part name="cass" interface="apf_cass">
@@ -422,7 +422,7 @@ checks whether the user is typing the program printed in the manual, for each le
<!-- Escape 2 does not load correctly -->
<software name="lg3in1" supported="partial">
- <description>Escape + 21 + Escape 2 (Bad?)</description>
+ <description>Escape + 21 + Escape 2 (bad?)</description>
<year>198?</year>
<publisher>Lacroix Games</publisher>
<info name="usage" value="Wait 1 or 2 secs from PLAY press and Return" />
@@ -501,7 +501,7 @@ checks whether the user is typing the program printed in the manual, for each le
</software>
<software name="froggy" supported="no">
- <description>Froggy (Bad?)</description>
+ <description>Froggy (bad?)</description>
<year>198?</year>
<publisher>E. Beckett</publisher>
<part name="cass" interface="apf_cass">
@@ -605,7 +605,7 @@ checks whether the user is typing the program printed in the manual, for each le
<!-- It does not load properly -->
<software name="llander" supported="no">
- <description>Lunar Lander (Bad?)</description>
+ <description>Lunar Lander (bad?)</description>
<year>19??</year>
<publisher>IM-1 in a Million Club Newsletter</publisher>
<part name="cass" interface="apf_cass">
@@ -652,7 +652,7 @@ checks whether the user is typing the program printed in the manual, for each le
<description>Mission: Improbable - Mission Alpha</description>
<year>1982</year>
<publisher>Geo-Grafix</publisher>
- <info name="usage" value="Requires 16K RAM" />
+ <info name="required_ram" value="16K" />
<part name="cass" interface="apf_cass">
<dataarea name="cass" size="10269596">
<rom name="geo_grafix_mission-improbable_alpha(16k).wav" size="10269596" crc="29a0d823" sha1="75e7b305f2004af57fa9b1347c3e2f12cb68d525"/>
@@ -861,7 +861,7 @@ checks whether the user is typing the program printed in the manual, for each le
<description>Space Shuttle</description>
<year>19??</year>
<publisher>York 10 Computerware</publisher>
- <info name="usage" value="Requires 16K RAM" />
+ <info name="required_ram" value="16K" />
<part name="cass" interface="apf_cass">
<dataarea name="cass" size="1759916">
<rom name="york_10_computerware_space_shuttle(16k).wav" size="1759916" crc="66a43b5a" sha1="1644bc35920e81876de630feb59d4ab761b87563"/>
@@ -928,7 +928,7 @@ checks whether the user is typing the program printed in the manual, for each le
<!-- Space Hunt does not seem to load fine, it was listed as an "Improved version of the above"... -->
<software name="gg2in1a" cloneof="gg2in1" supported="partial">
- <description>Super 21 + Space Hunt (Alt?)</description>
+ <description>Super 21 + Space Hunt (alt?)</description>
<year>1983</year>
<publisher>Geo-Grafix</publisher>
<part name="cass" interface="apf_cass">
@@ -987,7 +987,7 @@ checks whether the user is typing the program printed in the manual, for each le
<description>Transport + 15 Matches</description>
<year>19??</year>
<publisher>R. T. Carman</publisher>
- <info name="usage" value="Transport requires 16K RAM" />
+ <info name="required_ram" value="Transport requires 16K RAM" />
<part name="cass" interface="apf_cass">
<dataarea name="cass" size="3680094">
<rom name="r_t_carman_transport(16k)_15_matches.wav" size="3680094" crc="5673884c" sha1="538ea35a11ce95243da6cb6bf568b8f840bbe40d"/>
@@ -1203,7 +1203,7 @@ checks whether the user is typing the program printed in the manual, for each le
<!-- Unsure what this is... Investigate! -->
<software name="primera">
- <description>Primera? (Bad?)</description>
+ <description>Primera? (bad?)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="apf_cass">
diff --git a/hash/apfm1000.xml b/hash/apfm1000.xml
index 4b07527b903..a253c6450a0 100644
--- a/hash/apfm1000.xml
+++ b/hash/apfm1000.xml
@@ -109,7 +109,7 @@ license:CC0-1.0
</software>
<software name="catenaa">
- <description>Catena (Alt)</description>
+ <description>Catena (alt)</description>
<year>1979</year>
<publisher>APF</publisher>
<info name="serial" value="MG1002" />
diff --git a/hash/apogee.xml b/hash/apogee.xml
index e7b8ef69daa..c7817f170a2 100644
--- a/hash/apogee.xml
+++ b/hash/apogee.xml
@@ -427,7 +427,7 @@ license:CC0-1.0
</software>
<software name="marsa" cloneof="mars">
- <description>MARS (Alt)</description>
+ <description>MARS (alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="I, Play, G" />
diff --git a/hash/apple1.xml b/hash/apple1.xml
index 2618856ffba..c00447e15f7 100644
--- a/hash/apple1.xml
+++ b/hash/apple1.xml
@@ -28,7 +28,7 @@ Basic programs:
<description>Apple I Basic</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T001X-->
+ <info name="partno" value="A1T001X" />
<info name="usage" value="Load at E000.EFFFR, enter at E000R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="6644780">
@@ -39,7 +39,7 @@ Basic programs:
<!-- This version does seem to work better than the above, so we include it temporarily until we fix the subtle bug causing the parent not to be loaded properly -->
<software name="basica" cloneof="basic">
- <description>Apple I Basic (Alt)</description>
+ <description>Apple I Basic (alt)</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
<info name="usage" value="Load at E000.EFFFR, enter at E000R" />
@@ -114,7 +114,7 @@ Basic programs:
<description>Dis-Assembler</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T008X-->
+ <info name="partno" value="A1T008X" />
<info name="usage" value="Load at 800.09FFR, enter at 09F0R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="1905164">
@@ -127,7 +127,7 @@ Basic programs:
<description>Extended Monitor</description>
<year>1977</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T009X-->
+ <info name="partno" value="A1T009X" />
<info name="usage" value="Load at 0800.0FFFR, enter at 0F3DR" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="2146422">
@@ -152,7 +152,7 @@ Basic programs:
<description>Lunar Lander</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T003X-->
+ <info name="partno" value="A1T003X" />
<info name="usage" value="Load at 300.0A00R, enter at 0300R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="3350056">
@@ -165,7 +165,7 @@ Basic programs:
<description>Mastermind</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T002X-->
+ <info name="partno" value="A1T002X" />
<info name="usage" value="Load at 300.03FFR, enter at 0300R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="1196032">
@@ -241,7 +241,7 @@ Basic programs:
<description>Blackjack</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T004X-->
+ <info name="partno" value="A1T004X" />
<info name="usage" value="First load BASIC, then load at 4A.00FFR800.0FFFR, enter at E2B3R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="5751412">
@@ -350,7 +350,7 @@ Basic programs:
<description>Hamurabi (Apple)</description>
<year>1976</year>
<publisher>Apple Computer Inc</publisher>
- <!-- P/N A1T005X-->
+ <info name="partno" value="A1T005X" />
<info name="usage" value="First load BASIC, then load at 4A.00FFR300.FFFR, enter at E2B3R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="6953140">
@@ -445,7 +445,8 @@ Basic programs:
<description>Apple Startrek</description>
<year>1976</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T006X "Mini-Startrek" -->
+ <info name="alt_title" value="Mini-Startrek" />
+ <info name="partno" value="A1T006X" />
<!-- "Apple Startrek" from Interface Age Magazine -->
<info name="usage" value="First load BASIC, then load at 4A.00FFR300.FFFR, enter at E2B3R" />
<part name="cass" interface="apple1_cass">
@@ -483,7 +484,8 @@ Basic programs:
<description>TREK II</description>
<year>1977</year>
<publisher>Apple Computer Inc.</publisher>
- <!-- P/N A1T007X "16K-Startrek" -->
+ <info name="alt_title" value="16K-Startrek" />
+ <info name="partno" value="A1T007X" />
<info name="usage" value="First load BASIC, then load at 4A.00FFR0300.2FFFR, enter at E2B3R" />
<part name="cass" interface="apple1_cass">
<dataarea name="cass" size="8022016">
diff --git a/hash/apple2_cass.xml b/hash/apple2_cass.xml
index ce300c87069..5116ecaebb4 100644
--- a/hash/apple2_cass.xml
+++ b/hash/apple2_cass.xml
@@ -5,21 +5,22 @@ license:CC0-1.0
-->
<softwarelist name="apple2_cass" description="Apple II cassettes">
+ <!-- To enter BASIC after powering on:
+ AppleII : Type Ctrl-B (nothing shows) and press <Enter>
+ AppleIIe : Press Ctrl-F12
-<!-- To enter Basic after powering on:
-AppleII : Type Ctrl-B (nothing shows) and press <Enter>
-AppleIIe : Press Ctrl-F12
-
-To load and run a tape:
-1. Set up the machine for the type of tape: Monitor "*", Integer BASIC ">", or Applesoft BASIC "]".
-2. Enter the address information or type LOAD for BASIC programs but do not press <Return>.
-3. Play the tape, wait for the leader sound then press <Return>.
-4. Enter the address information or type RUN for BASIC programs and press <Return> to run the program. -->
+ To load and run a tape:
+ 1. Set up the machine for the type of tape: Monitor "*", Integer BASIC ">", or Applesoft BASIC "]".
+ 2. Enter the address information or type LOAD for BASIC programs but do not press <Return>.
+ 3. Play the tape, wait for the leader sound then press <Return>.
+ 4. Enter the address information or type RUN for BASIC programs and press <Return> to run the program. -->
<software name="3dartgra">
<description>3D Art Graphics</description>
<year>1978</year>
- <publisher>Unknown</publisher>
+ <publisher>&lt;unknown&gt;</publisher>
+ <info name="author" value="Kazuyama Miyazawa" />
+ <info name="required_ram" value="16K" />
<info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="3D Art Graphics" />
@@ -30,13 +31,16 @@ To load and run a tape:
</software>
<software name="3ddockin">
- <description>3D-Docking</description>
+ <description>3-D Docking</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Chris Oberth" />
+ <info name="partno" value="AP125" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00345" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="3D-Docking" />
+ <feature name="part_id" value="3-D Docking" />
<dataarea name="cass" size="4876844">
<rom name="3d-docking (1978)(programma international, inc.).wav" size="4876844" crc="eb124a5d" sha1="8d6c6d971611caf5fc4c3bb0e64e24768cb1785c"/>
</dataarea>
@@ -44,12 +48,13 @@ To load and run a tape:
</software>
<software name="3dstarfi">
- <description>3D Star Fire</description>
- <year>19??</year>
- <publisher>Unknown</publisher>
+ <description>3-D Star Fire</description>
+ <year>1980</year>
+ <publisher>Tsukumo Original Software</publisher>
+ <info name="required_ram" value="24K" />
<info name="usage" value="*30.3FR" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="3D Star Fire" />
+ <feature name="part_id" value="3-D Star Fire" />
<dataarea name="cass" size="8052074">
<rom name="3-d star fire (1980)(tukumo original software).wav" size="8052074" crc="6ab161f2" sha1="504cdfbd49686afa542e03db7315803b40699877"/>
</dataarea>
@@ -60,7 +65,10 @@ To load and run a tape:
<description>Ack-Ack</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
- <info name="usage" value="*200.2000R 8K" />
+ <info name="author" value="Jim Anderson" />
+ <info name="required_ram" value="8K" />
+ <info name="serial" value="AP001" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Ack-Ack" />
<dataarea name="cass" size="5661708">
@@ -73,8 +81,9 @@ To load and run a tape:
<description>Computer Acquire</description>
<year>1982</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4060102" />
- <info name="usage" value="*800.3FA4R 0800G 16K" />
+ <info name="usage" value="*800.3FA4R 0800G" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Computer Acquire" />
<dataarea name="cass" size="8344952">
@@ -87,8 +96,9 @@ To load and run a tape:
<description>Computer Acquire (original)</description>
<year>1980</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4006002" />
- <info name="usage" value="*280.3E9R 800.3F19R 0800G 16K" />
+ <info name="usage" value="*280.3E9R 800.3F19R 0800G" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Computer Acquire" />
<dataarea name="cass" size="4781660">
@@ -97,11 +107,13 @@ To load and run a tape:
</part>
</software>
- <software name="advent0">
- <description>Adventure 0 - Special Sampler</description>
+ <software name="saga0ssamp">
+ <description>Scott Adams Graphic Adventure #0: Special Sampler (Adventureland)</description>
<year>1979</year>
<publisher>Adventure International</publisher>
- <info name="usage" value="*800.5777R 800G 24K" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="*800.5777R 800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Adventure Sampler" />
<dataarea name="cass" size="2646052">
@@ -110,11 +122,13 @@ To load and run a tape:
</part>
</software>
- <software name="advent1">
- <description>Adventure 1 - Adventure Land</description>
+ <software name="saga1aland">
+ <description>Scott Adams Graphic Adventure #1: Adventureland</description>
<year>1979</year>
<publisher>Adventure International</publisher>
- <info name="usage" value="*800.5777R 800G 24K" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="*800.5777R 800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Adventure Land" />
<dataarea name="cass" size="5705366">
@@ -123,11 +137,13 @@ To load and run a tape:
</part>
</software>
- <software name="advent3">
- <description>Adventure 3 - Mission Impossible</description>
+ <software name="saga3misimp">
+ <description>Scott Adams Graphic Adventure #3: Mission Impossible</description>
<year>1979</year>
<publisher>Adventure International</publisher>
- <info name="usage" value="*800.5777R 800G 24K" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="*800.5777R 800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Mission Impossible" />
<dataarea name="cass" size="11143724">
@@ -136,11 +152,13 @@ To load and run a tape:
</part>
</software>
- <software name="advent4">
- <description>Adventure 4 - Voodoo Castle</description>
+ <software name="saga4voocas">
+ <description>Scott Adams Graphic Adventure #4: Voodoo Castle</description>
<year>1979</year>
<publisher>Adventure International</publisher>
- <info name="usage" value="*800.5777R 800G 24K" />
+ <info name="programmer" value="Alexis Adams" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="*800.5777R 800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Voodoo Castle" />
<dataarea name="cass" size="2693420">
@@ -149,12 +167,15 @@ To load and run a tape:
</part>
</software>
- <software name="aligren" supported="partial"><!-- requires cassette audio player -->
+ <software name="aligren" supported="partial">
+ <!-- requires cassette audio player -->
<description>Alignment Test Tone / Renumber</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2024-00" />
- <info name="usage" value="cass1 audio, cass2 ]Load 16K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Alignment Test Tone" />
<dataarea name="cass" size="5677100">
@@ -169,12 +190,16 @@ To load and run a tape:
</part>
</software>
- <software name="aligsam" supported="partial"><!-- requires cassette audio player -->
+ <software name="aligsam" supported="partial">
+ <!-- requires cassette audio player -->
<description>Alignment Test Tone / Sampler</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="author" value="B. Tognazzini (Sampler)" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-0002-02" />
- <info name="usage" value="cass1 >Load 16K, cass2 >HIMEM:16384 >Load 16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >HIMEM:16384 >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Alignment Test Tone" />
<dataarea name="cass" size="5677100">
@@ -193,8 +218,9 @@ To load and run a tape:
<description>Andromeda Conquest</description>
<year>1982</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4200102" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Andromeda Conquest" />
<dataarea name="cass" size="3811372">
@@ -207,7 +233,8 @@ To load and run a tape:
<description>Apple-2 Trek</description>
<year>1977</year>
<publisher>Apple Computer, Inc.</publisher>
- <info name="usage" value=">HIMEM:16384 >Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">HIMEM:16384 >Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Apple-2 Trek" />
<dataarea name="cass" size="8449462">
@@ -220,8 +247,11 @@ To load and run a tape:
<description>Apple Bowl</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="cass1: 16K" />
+ <info name="required_ram" value="cass2: 32K" />
<info name="serial" value="600-2022-00" />
- <info name="usage" value="cass1 PROGRAMMERS AID #1 >Load 16K, cass2 >Load 32K" />
+ <info name="usage" value="cass1: >Load (requires Programmer's Aid #1)" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Apple Bowl 16K" />
<dataarea name="cass" size="3903776">
@@ -240,8 +270,9 @@ To load and run a tape:
<description>Apple Casino</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADG0108" />
- <info name="usage" value=">Load 16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Apple Casino" />
<dataarea name="cass" size="5349420">
@@ -254,8 +285,9 @@ To load and run a tape:
<description>Apple Derby</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="12K" />
<info name="serial" value="ACG0107" />
- <info name="usage" value=">Load 12K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Apple Derby" />
<dataarea name="cass" size="8189852">
@@ -268,8 +300,9 @@ To load and run a tape:
<description>Apple ][ Organ</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="32K" />
<info name="serial" value="AHG0112" />
- <info name="usage" value="]Load 32K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Apple ][ Organ" />
<dataarea name="cass" size="4191276">
@@ -280,9 +313,12 @@ To load and run a tape:
<software name="aplesoft">
<description>Applesoft IIa</description>
- <year>1977</year>
+ <year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="002-0007-01" />
+ <info name="partno" value="A2T0004X" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Applesoft IIa" />
<dataarea name="cass" size="9322474">
@@ -291,12 +327,14 @@ To load and run a tape:
</part>
</software>
- <software name="aplstqrt" supported="no"><!-- requires modem -->
+ <software name="aplstqrt" supported="no">
+ <!-- requires modem -->
<description>Apple Stock Quote Reporter</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="000-0017-00" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Apple Stock Quote Reporter" />
<dataarea name="cass" size="6640828">
@@ -309,8 +347,9 @@ To load and run a tape:
<description>Apple Trek</description>
<year>1977</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2013-01" />
- <info name="usage" value=">Load 16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Apple Trek" />
<dataarea name="cass" size="3996802">
@@ -323,8 +362,11 @@ To load and run a tape:
<description>Apple-Vision / Biorhythms</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="author" value="R. Bishop (Applevision)" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="685-0005-00" />
- <info name="usage" value="cass1 >HIMEM:16384 >Load 16K, cass2 Load 16K" />
+ <info name="usage" value="cass1: >HIMEM:16384 >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Applevision" />
<dataarea name="cass" size="2063394">
@@ -343,9 +385,11 @@ To load and run a tape:
<description>Applesoft ][ Floating Point BASIC / Floating Point BASIC Demo</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2006-00" />
<info name="partno" value="A2T0004X" />
- <info name="usage" value="cass1 >Load 16K, cass2 ]Load 16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Applesoft ][ floating point BASIC" />
<dataarea name="cass" size="3260004">
@@ -364,8 +408,9 @@ To load and run a tape:
<description>Assembler</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="8K" />
<info name="serial" value="ABS0110" />
- <info name="usage" value=">Load 8K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Assembler" />
<dataarea name="cass" size="5953068">
@@ -378,8 +423,9 @@ To load and run a tape:
<description>Applesoft Utility Programs</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="24K" />
<info name="serial" value="03504" />
- <info name="usage" value="]Load 24K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Applesoft Utilities" />
<dataarea name="cass" size="1634092">
@@ -392,8 +438,9 @@ To load and run a tape:
<description>Air Traffic Controller</description>
<year>1980</year>
<publisher>Creative Computing Software</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="CS-4008" />
- <info name="usage" value="*2400.3340R 2400G 16K" />
+ <info name="usage" value="*2400.3340R 2400G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Air Traffic Controller" />
<dataarea name="cass" size="1483820">
@@ -406,8 +453,9 @@ To load and run a tape:
<description>B-1 Nuclear Bomber</description>
<year>1980</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4000002" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="B-1 Nuclear Bomber" />
<dataarea name="cass" size="3018500">
@@ -420,15 +468,16 @@ To load and run a tape:
<description>Beneath Apple Manor</description>
<year>1978</year>
<publisher>The Software Factory</publisher>
- <info name="usage" value="cass1 *800.B00R then cass2 >LOAD, LOMEM:2816, RUN, after CHAIN BAM1 >LOAD, GOTO0 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="cass1 *800.B00R then cass2 >LOAD, LOMEM:2816, RUN, after CHAIN BAM1 >LOAD, GOTO0" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Beneath Apple Manor load 1" />
+ <feature name="part_id" value="Side A" />
<dataarea name="cass" size="8260652">
<rom name="beneath apple manor (1978)(software factory) side A.wav" size="8260652" crc="21685790" sha1="21a7000cc0d8e751602bf7e57b9094281f42695e"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Beneath Apple Manor load 2" />
+ <feature name="part_id" value="Side B" />
<dataarea name="cass" size="15841288">
<rom name="beneath apple manor (1978)(software factory) side B.wav" size="15841288" crc="0388b520" sha1="dffb5e885a4c77f3d95cd29ef1573feea8d6f85f"/>
</dataarea>
@@ -439,8 +488,10 @@ To load and run a tape:
<description>Baseball</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Charles Sullivan" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00124" />
- <info name="usage" value="*200.4000R 16K" />
+ <info name="usage" value="*200.4000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Baseball" />
<dataarea name="cass" size="10511916">
@@ -453,8 +504,11 @@ To load and run a tape:
<description>Battlestar I</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Richard Kaplan" />
+ <info name="partno" value="AP024" />
+ <info name="required_ram" value="32K" />
<info name="serial" value="00393" />
- <info name="usage" value="*200.8000R 32K" />
+ <info name="usage" value="*200.8000R" />
<!-- program doesn't load if tape started at beginning so start at 0:20 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Battlestar I" />
@@ -468,8 +522,10 @@ To load and run a tape:
<description>Black Jack / Slot Machine</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="8K" />
<info name="serial" value="002-0011-00" />
- <info name="usage" value="cass1 >Load 8K, cass2 >Load 8K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Black Jack" />
<dataarea name="cass" size="9268268">
@@ -501,7 +557,10 @@ To load and run a tape:
<description>Bomber</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="author" value="Bob Bishop" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="BBB-878" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Bomber" />
<dataarea name="cass" size="2072620">
@@ -514,16 +573,19 @@ To load and run a tape:
<description>Bowling / Trilogy</description>
<year>1979</year>
<publisher>Instant Software, Inc.</publisher>
+ <info name="required_ram" value="cass1: 20K" />
+ <info name="required_ram" value="cass2: 8K" />
<info name="serial" value="0040A" />
- <info name="usage" value="cass1 ]Load 20K, cass2 >Load 8K" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Bowling" />
+ <feature name="part_id" value="Side A: Bowling" />
<dataarea name="cass" size="8120876">
<rom name="bowling (1979)(instant software).wav" size="8120876" crc="98f1a8f5" sha1="4b45badbc712d9ebefd0f1fb03f5e077af82123e"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Trilogy" />
+ <feature name="part_id" value="Side B: Trilogy" />
<dataarea name="cass" size="13566128">
<rom name="trilogy (1979)(instant software).wav" size="13566128" crc="24e01f0f" sha1="7200180beb402d089f7dbc13a4d921cdcb269aa0"/>
</dataarea>
@@ -534,8 +596,10 @@ To load and run a tape:
<description>Brian's Theme / Phone List</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
- <info name="serial" value="600-2027-00"/>
- <info name="usage" value="cass1 ]Load 16K, cass2 ]Load16K" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="600-2027-00" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Brian's Theme" />
<dataarea name="cass" size="1075026">
@@ -551,11 +615,13 @@ To load and run a tape:
</software>
<software name="briccol">
- <description>Brick out / Color Demonstration Programs</description>
+ <description>Brick Out / Color Demonstration Programs</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="685-0003-00" />
- <info name="usage" value="cass1 >Load 16K, cass2 >Load 16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Brick Out" />
<dataarea name="cass" size="4003116">
@@ -574,7 +640,8 @@ To load and run a tape:
<description>Bridge Challenger</description>
<year>1978</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Bridge Challenger" />
<dataarea name="cass" size="2265644">
@@ -587,7 +654,9 @@ To load and run a tape:
<description>Breakout / Color Demos</description>
<year>1977</year>
<publisher>Apple Computer, Inc.</publisher>
- <info name="usage" value="cass1 >Load 4K, cass2 >Load 4K" />
+ <info name="required_ram" value="4K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Breakout" />
<dataarea name="cass" size="1409068">
@@ -606,18 +675,21 @@ To load and run a tape:
<description>Breakout / Color Graphics</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="partno" value="A2T0003X" />
+ <info name="required_ram" value="4K" />
<info name="serial" value="600-2014-00" />
- <info name="usage" value="cass1 >Load 4K, cass2 >Load 4K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Breakout" />
<dataarea name="cass" size="1127548">
- <rom name="color graphics (1978)(apple computer).wav" size="1127548" crc="f829f060" sha1="e1b5b432ad2bf1974c934ac57d08a625181e6b9c"/>
+ <rom name="breakout (1978)(apple computer).wav" size="1127548" crc="f829f060" sha1="e1b5b432ad2bf1974c934ac57d08a625181e6b9c"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
<feature name="part_id" value="Color Graphics" />
<dataarea name="cass" size="1544236">
- <rom name="breakout (1978)(apple computer).wav" size="1544236" crc="64441f07" sha1="37da93d0a057a718031395f6c83c57c9a8d3daf0"/>
+ <rom name="color graphics (1978)(apple computer).wav" size="1544236" crc="64441f07" sha1="37da93d0a057a718031395f6c83c57c9a8d3daf0"/>
</dataarea>
</part>
</software>
@@ -626,8 +698,11 @@ To load and run a tape:
<description>Canter Downs</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Harry Tarnoff" />
+ <info name="partno" value="AP031" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00438" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Canter Downs" />
<dataarea name="cass" size="4652588">
@@ -640,7 +715,9 @@ To load and run a tape:
<description>Checkbook 1</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="002-0005-01" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Checkbook 1" />
<dataarea name="cass" size="3815212">
@@ -653,8 +730,10 @@ To load and run a tape:
<description>Color Demosoft / Little Brickout</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2023-00" />
- <info name="usage" value="cass1 ]Load 16K, cass2 ]Load 16K" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Color Demosoft" />
<dataarea name="cass" size="1391234">
@@ -673,8 +752,11 @@ To load and run a tape:
<description>Color Sketch / Supermath</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="author" value="R. Graff (Supermath)" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="685-0004-00" />
- <info name="usage" value="cass1 >Load 16K, cass2 >Load 16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Colorsketch" />
<dataarea name="cass" size="4058668">
@@ -693,8 +775,9 @@ To load and run a tape:
<description>Complex Mathematics</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="01204" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Complex Mathematics" />
<dataarea name="cass" size="1499948">
@@ -707,8 +790,9 @@ To load and run a tape:
<description>Conflict 2500</description>
<year>1981</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="40007001" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Conflict 2500" />
<dataarea name="cass" size="4012332">
@@ -717,19 +801,23 @@ To load and run a tape:
</part>
</software>
- <software name="craps" supported="partial"><!-- cass2 requires light pen -->
+ <software name="craps" supported="partial">
<description>Craps / Bright Pen Craps</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value="cass1 >Load 24K, cass2 >Load 24K" />
+ <info name="author" value="Roger Walker" />
+ <info name="serial" value="ACW-479" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load (requires light pen)" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Craps" />
+ <feature name="part_id" value="Side 1: Craps" />
<dataarea name="cass" size="3705900">
<rom name="craps (1979)(softape) side 1.wav" size="3705900" crc="1453953e" sha1="53f560ddffeabb16ff55b3c3145a33af53693422"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Bright Pen Craps" />
+ <feature name="part_id" value="Side 2: Bright Pen Craps" />
<dataarea name="cass" size="3719724">
<rom name="craps (1979)(softape) side 2.wav" size="3719724" crc="f9906e12" sha1="2a9b4f3f922f91417d610973e55e5099e8544c97"/>
</dataarea>
@@ -753,7 +841,10 @@ To load and run a tape:
<description>Crazy Eights</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Load 24K" />
+ <info name="author" value="William Smith" />
+ <info name="required_ram" value="24K" />
+ <info name="serial" value="ACW-479" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Crazy Eights" />
<dataarea name="cass" size="3120684">
@@ -766,8 +857,9 @@ To load and run a tape:
<description>Cubik</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="24K" />
<info name="serial" value="ADG0113" />
- <info name="usage" value=">Load 24K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Cubik" />
<dataarea name="cass" size="4861228">
@@ -777,10 +869,16 @@ To load and run a tape:
</software>
<software name="dateston">
- <description>DUNJONQUEST- Datestones of Ryn</description>
+ <description>Dunjonquest: Datestones of Ryn</description>
<year>1979</year>
<publisher>Automated Simulations</publisher>
- <info name="usage" value="]Load 32K" />
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Jim Connelley" />
+ <info name="required_ram" value="32K" />
+ <info name="usage" value="]Load" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Datestones of Ryn" />
<dataarea name="cass" size="3578924">
@@ -789,12 +887,16 @@ To load and run a tape:
</part>
</software>
- <software name="datmtel" supported="partial"><!-- requires modem -->
+ <software name="datmtel" supported="partial">
+ <!-- requires modem -->
<description>Datamover / Telepong</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="partno" value="A2T0012X" />
+ <info name="required_ram" value="4K" />
<info name="serial" value="002-0016-00" />
- <info name="usage" value="cass1 *800.A4FR >LOMEM:2700 4K, cass2 >Load 4K" />
+ <info name="usage" value="cass1: *800.A4FR >LOMEM:2700" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Datamover" />
<dataarea name="cass" size="456748">
@@ -813,8 +915,11 @@ To load and run a tape:
<description>Depth Charge</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Chris Oberth" />
+ <info name="partno" value="AP045" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00628" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Depth Charge" />
<dataarea name="cass" size="8130604">
@@ -827,7 +932,8 @@ To load and run a tape:
<description>Disk-O-Tape</description>
<year>1980</year>
<publisher>Dann McCreary</publisher>
- <info name="usage" value="Load DOS 3.3 then *200.240R 32K" />
+ <info name="required_ram" value="32K" />
+ <info name="usage" value="Load DOS 3.3 then *200.240R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Disk-O-Tape" />
<dataarea name="cass" size="3544108">
@@ -840,8 +946,9 @@ To load and run a tape:
<description>Dnieper River Line</description>
<year>1982</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4170101" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Dnieper River Line" />
<dataarea name="cass" size="2866988">
@@ -854,7 +961,8 @@ To load and run a tape:
<description>Don't Fall</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 8K" />
+ <info name="required_ram" value="8K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Don't Fall" />
<dataarea name="cass" size="4988972">
@@ -867,8 +975,11 @@ To load and run a tape:
<description>Echo</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="David Kalmich" />
+ <info name="partno" value="AP049" />
+ <info name="required_ram" value="8K" />
<info name="serial" value="00432" />
- <info name="usage" value="*200.2000R 8K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Echo" />
<dataarea name="cass" size="3164460">
@@ -881,7 +992,10 @@ To load and run a tape:
<description>Electronic Index-Card File</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="author" value="Bob Bishop" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="ECF-878" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Electronic Index-Card File" />
<dataarea name="cass" size="1962284">
@@ -894,7 +1008,9 @@ To load and run a tape:
<description>Enchanted Island</description>
<year>1980</year>
<publisher>Mad Hatter Software</publisher>
- <info name="usage" value="]Load 16K" />
+ <info name="author" value="Greg Hassett" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Enchanted Island" />
<dataarea name="cass" size="7966252">
@@ -907,8 +1023,9 @@ To load and run a tape:
<description>Engineering Mathematics - 1</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="01304" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Engineering Mathematics 1" />
<dataarea name="cass" size="1662508">
@@ -921,7 +1038,9 @@ To load and run a tape:
<description>Escape!</description>
<year>1978</year>
<publisher>Micro Users Software Exchange</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="author" value="Silas S. Warner" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Escape" />
<dataarea name="cass" size="1820204">
@@ -948,8 +1067,9 @@ To load and run a tape:
<description>Financial Wizard 2</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADF0114" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Financial Wizard 2" />
<dataarea name="cass" size="3562540">
@@ -962,8 +1082,9 @@ To load and run a tape:
<description>Financial Wizard 3</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADF0115" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Financial Wizard 3" />
<dataarea name="cass" size="2872364">
@@ -976,8 +1097,9 @@ To load and run a tape:
<description>Financial Wizard 4</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADF0118" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Financial Wizard 4" />
<dataarea name="cass" size="2769964">
@@ -990,8 +1112,10 @@ To load and run a tape:
<description>Basic Finance I / Penny Arcade</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2025-00" />
- <info name="usage" value="cass1 ]Load 16K, cass2 ]Load 16K" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Finance I" />
<dataarea name="cass" size="2721326">
@@ -1010,8 +1134,9 @@ To load and run a tape:
<description>Football Predictions</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="00184" />
- <info name="usage" value="*200.4000R 16K" />
+ <info name="usage" value="*200.4000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Football Predictions" />
<dataarea name="cass" size="8885164">
@@ -1021,19 +1146,23 @@ To load and run a tape:
</software>
<software name="forte">
- <description>Forte / Forte Music</description>
+ <description>Forté</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value="cass1 >Load 16K, cass2 2 programs after loading Forte 0:08 0:30 %Load" />
+ <info name="author" value="Gary J. Shannon" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="FES-279" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: 2 programs after loading Forte 0:08 0:30 %Load" />
<!-- first music program doesn't load if tape started at beginning -->
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Forte" />
+ <feature name="part_id" value="Side 1: Forté" />
<dataarea name="cass" size="2882604">
<rom name="forte (1979)(softape).wav" size="2882604" crc="8a397319" sha1="ca4d838645d0d3af8817bd375ebe4ecf0829a6c2"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Forte Music" />
+ <feature name="part_id" value="Side 2: Forté Music" />
<dataarea name="cass" size="2872364">
<rom name="forte music (1979)(softape).wav" size="2872364" crc="50aaa2a6" sha1="f2ef9dd28676d424b7140044217d67ee3cc3b023"/>
</dataarea>
@@ -1043,7 +1172,8 @@ To load and run a tape:
<software name="funpaki">
<description>Funpak I</description>
<year>1978</year>
- <publisher>System Design Lab</publisher>
+ <publisher>Systems Design Lab</publisher>
+ <info name="required_ram" value="16K" />
<info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Funpak I" />
@@ -1057,6 +1187,7 @@ To load and run a tape:
<description>Galaxian</description>
<year>19??</year>
<publisher>unknown</publisher>
+ <info name="required_ram" value="24K" />
<info name="usage" value="*800.1FFFR 1000G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Galaxian" />
@@ -1070,8 +1201,9 @@ To load and run a tape:
<description>Galaxy</description>
<year>1982</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4190101" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Galaxy" />
<dataarea name="cass" size="2049644">
@@ -1084,6 +1216,7 @@ To load and run a tape:
<description>Galaxy Travel</description>
<year>1980</year>
<publisher>Tsukumo Original Software</publisher>
+ <info name="alt_title" value="ギャラクシートラベル" />
<info name="usage" value="*0200.6000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Galaxy Travel" />
@@ -1094,11 +1227,12 @@ To load and run a tape:
</software>
<software name="gamepwb2">
- <description>A Beginner's Guide to Game Prgrams and Number Programs (Tape 2)</description>
+ <description>A Beginner's Guide to Game Programs and Number Programs (Tape 2)</description>
<year>1977</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="00304" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Beginner's Guide 2" />
<dataarea name="cass" size="1500972">
@@ -1111,8 +1245,9 @@ To load and run a tape:
<description>A Beginner's Guide to Game Programs (Tape 3)</description>
<year>1977</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="00404" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Beginner's Guide 3" />
<dataarea name="cass" size="1954604">
@@ -1125,7 +1260,9 @@ To load and run a tape:
<description>Gammon Gambler</description>
<year>1979</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="]HGR ]POKE34,20 *30.3FFFR 16K" />
+ <info name="author" value="Willy Chaplin" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="]HGR ]POKE34,20 *30.3FFFR" />
<!-- 32k version on side B not dumped -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Gammon Gambler" />
@@ -1139,7 +1276,9 @@ To load and run a tape:
<description>Global War</description>
<year>1979</year>
<publisher>Micro Users Software Exchange</publisher>
- <info name="usage" value="]Load 32K" />
+ <info name="author" value="Alan Boyd" />
+ <info name="required_ram" value="32K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Global War" />
<dataarea name="cass" size="8757292">
@@ -1152,8 +1291,9 @@ To load and run a tape:
<description>Guns of Fort Defiance</description>
<year>1981</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="48K" />
<info name="serial" value="4130101" />
- <info name="usage" value="]Load 48K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Guns of Fort Defiance" />
<dataarea name="cass" size="4169460">
@@ -1166,8 +1306,9 @@ To load and run a tape:
<description>Haunted House</description>
<year>1978</year>
<publisher>Creative Computing Software</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="CS-4005" />
- <info name="usage" value=">Load 16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Haunted House" />
<dataarea name="cass" size="2004524">
@@ -1180,8 +1321,10 @@ To load and run a tape:
<description>Hires Boxing</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="partno" value="AP061" />
+ <info name="required_ram" value="24K" />
<info name="serial" value="00508" />
- <info name="usage" value="*200.6000R 24K" />
+ <info name="usage" value="*200.6000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Hires Boxing" />
<dataarea name="cass" size="13711404">
@@ -1194,8 +1337,9 @@ To load and run a tape:
<description>High Resolution Graphics</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2016-00" />
- <info name="usage" value="*C00.FFFR >Load >HIMEM:8192 16K" />
+ <info name="usage" value="*C00.FFFR >Load >HIMEM:8192" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="High Resolution Graphics" />
<dataarea name="cass" size="2788396">
@@ -1205,12 +1349,13 @@ To load and run a tape:
</software>
<software name="hiresgrp">
- <description>Highres Graphic Printer</description>
+ <description>Hires Graphic Printer</description>
<year>1979</year>
- <publisher>System Design Lab</publisher>
+ <publisher>Systems Design Lab</publisher>
+ <info name="required_ram" value="16K" />
<info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="Highres Graphic Printer" />
+ <feature name="part_id" value="Hires Graphic Printer" />
<dataarea name="cass" size="2644780">
<rom name="hires graphic printer (1979)(systems design lab).wav" size="2644780" crc="59f0f006" sha1="1f1d1ca6389fcb797756adfcd5b4b6d9979f4e60"/>
</dataarea>
@@ -1218,12 +1363,13 @@ To load and run a tape:
</software>
<software name="hirespla">
- <description>Highres Playground</description>
+ <description>Hires Playground</description>
<year>1979</year>
- <publisher>System Design Lab</publisher>
+ <publisher>Systems Design Lab</publisher>
+ <info name="required_ram" value="16K" /><!-- 24K required to use page 2 -->
<info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="Highres Playground" />
+ <feature name="part_id" value="Hires Playground" />
<dataarea name="cass" size="2646572">
<rom name="hires playground (1979)(systems design lab).wav" size="2646572" crc="272178d3" sha1="6f56e644c9d093dac663735aa35bbd94df1aeb52"/>
</dataarea>
@@ -1234,8 +1380,11 @@ To load and run a tape:
<description>Hangman / Color Math</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="partno" value="A2T0007X" />
+ <info name="required_ram" value="4K" />
<info name="serial" value="002-0010-00" />
- <info name="usage" value="cass1 >Load 4K, cass2 >Load 4K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Hangman" />
<dataarea name="cass" size="1365000">
@@ -1254,8 +1403,9 @@ To load and run a tape:
<description>Hopalong Cassidy / Lemonade Stand</description>
<year>1979</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="600-2026-00" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Hopalong Cassidy" />
<dataarea name="cass" size="4846636">
@@ -1274,7 +1424,11 @@ To load and run a tape:
<description>House of Seven Gables / Journey to the Center of the Earth</description>
<year>19??</year>
<publisher>Compu-Things</publisher>
- <info name="usage" value="cass1 ]Load 16K, cass2 ]Load 16K" />
+ <!-- May have been previously and separately released by Mad Hatter Software -->
+ <info name="author" value="Greg Hassett" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="House of Seven Gables" />
<dataarea name="cass" size="11567148">
@@ -1293,7 +1447,9 @@ To load and run a tape:
<description>I Got Mine</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Himem:8192 >Load 24K" />
+ <info name="author" value="Bill Depew" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value=">Himem:8192 >Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="I Got Mine" />
<dataarea name="cass" size="1796652">
@@ -1306,7 +1462,9 @@ To load and run a tape:
<description>Journey to Atlantis</description>
<year>1979</year>
<publisher>Mad Hatter Software</publisher>
- <info name="usage" value="]Load 16K" />
+ <info name="author" value="Greg Hassett" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Journey to Atlantis" />
<dataarea name="cass" size="7323180">
@@ -1319,6 +1477,9 @@ To load and run a tape:
<description>Jupiter Express</description>
<year>1979</year>
<publisher>Softape</publisher>
+ <info name="author" value="Gary J. Shannon" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="JES-179" />
<info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Jupiter Express" />
@@ -1332,8 +1493,11 @@ To load and run a tape:
<description>Kaleidoscope</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Chris Oberth" />
+ <info name="partno" value="AP074" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00435" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<!-- program doesn't load if tape started at beginning so start at 0:04 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Kaleidoscope" />
@@ -1347,8 +1511,9 @@ To load and run a tape:
<description>Lords of Karma</description>
<year>1980</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="32K" />
<info name="serial" value="4005002" />
- <info name="usage" value="*0800.7FFFR 0800G 32K" />
+ <info name="usage" value="*0800.7FFFR 0800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Lords of Karma" />
<dataarea name="cass" size="8095936">
@@ -1361,7 +1526,8 @@ To load and run a tape:
<description>Kidstuff</description>
<year>1978</year>
<publisher>Speakeasy Software Ltd.</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Kidstuff" />
<dataarea name="cass" size="4413484">
@@ -1374,8 +1540,10 @@ To load and run a tape:
<description>Laserblast</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="partno" value="AP076" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00034" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Laserblast" />
<dataarea name="cass" size="2503468">
@@ -1388,7 +1556,9 @@ To load and run a tape:
<description>Learning BASIC, Pt. 1 &amp; 2</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value="cass1 >Load 16K, cass2 >Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Learning BASIC part 1" />
<dataarea name="cass" size="9259564">
@@ -1407,7 +1577,8 @@ To load and run a tape:
<description>Learning BASIC, Pt. 3</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Learning BASIC part 3" />
<dataarea name="cass" size="9042988">
@@ -1420,8 +1591,10 @@ To load and run a tape:
<description>Leases / Loans</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="002-0014-00" />
- <info name="usage" value="cass1 ]Load 16K, cass2 ]Load 16K" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Leases" />
<dataarea name="cass" size="1874784">
@@ -1440,8 +1613,10 @@ To load and run a tape:
<description>Lunar Lander</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="partno" value="AP081" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00393" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Lunar Lander" />
<dataarea name="cass" size="4652332">
@@ -1454,7 +1629,8 @@ To load and run a tape:
<description>Lunar Lander II</description>
<year>19??</year>
<publisher>Sensible Software</publisher>
- <info name="usage" value="]Load 24K" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Lunar Lander" />
<dataarea name="cass" size="2448940">
@@ -1467,8 +1643,11 @@ To load and run a tape:
<description>Magic Squares</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="David Kalmick" />
+ <info name="partno" value="AP083" />
+ <info name="required_ram" value="32K" />
<info name="serial" value="00193" />
- <info name="usage" value="*200.6000R 32K" />
+ <info name="usage" value="*200.6000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Magic Squares" />
<dataarea name="cass" size="6194220">
@@ -1481,8 +1660,11 @@ To load and run a tape:
<description>Match Wits</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="R. J. Nitto" />
+ <info name="partno" value="AP085" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00193" />
- <info name="usage" value="*200.4000R 16K" />
+ <info name="usage" value="*200.4000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Match Wits" />
<dataarea name="cass" size="4586540">
@@ -1508,7 +1690,9 @@ To load and run a tape:
<description>Maze Game</description>
<year>1978</year>
<publisher>Micro Users Software Exchange</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="author" value="Silas S. Warner" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Maze Game" />
<dataarea name="cass" size="9117740">
@@ -1521,15 +1705,16 @@ To load and run a tape:
<description>Memory Builder</description>
<year>1978</year>
<publisher>Program Design, Inc.</publisher>
- <info name="usage" value="cass1 >Load, cass2 >Load" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Memory Builder 1 &amp; 2" />
+ <feature name="part_id" value="Side A: Memory Builder 1 &amp; 2" />
<dataarea name="cass" size="4521260">
<rom name="memory builder (1978)(program design) side a.wav" size="4521260" crc="15211b88" sha1="49ffd89eea719bd99bb1ffa8221b511aefd5e973"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Memory Builder 3 &amp; 4" />
+ <feature name="part_id" value="Side B: Memory Builder 3 &amp; 4" />
<dataarea name="cass" size="4507180">
<rom name="memory builder (1978)(program design) side b.wav" size="4507180" crc="9b994c4e" sha1="e564271c02fe61dfbf4cf7d55e0525acbc827de9"/>
</dataarea>
@@ -1540,6 +1725,7 @@ To load and run a tape:
<description>Memory Check</description>
<year>19??</year>
<publisher>Tsukumo Original Software</publisher>
+ <info name="alt_title" value="メモリーチェック" />
<info name="usage" value="*0030.03FFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Memory Check" />
@@ -1553,7 +1739,8 @@ To load and run a tape:
<description>Microchess 2.0</description>
<year>1978</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="*2000.2200R 2000G 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*2000.2200R 2000G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Microchess 2.0" />
<dataarea name="cass" size="4349366">
@@ -1566,7 +1753,10 @@ To load and run a tape:
<description>Microgammon 1.0</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="author" value="Steve Baker" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="MGB-279" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Microgammon 1.0" />
<dataarea name="cass" size="4144428">
@@ -1579,8 +1769,10 @@ To load and run a tape:
<description>Micro Invaders</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="ESD Laboratory Co." />
+ <info name="required_ram" value="24K" />
<info name="serial" value="01301" />
- <info name="usage" value="*200.4000R 24K" />
+ <info name="usage" value="*200.4000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Micro Invaders" />
<dataarea name="cass" size="8362028">
@@ -1593,7 +1785,8 @@ To load and run a tape:
<description>microtrivia</description>
<year>1978</year>
<publisher>Speakeasy Software Ltd.</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Microtrivia" />
<dataarea name="cass" size="3970604">
@@ -1606,8 +1799,9 @@ To load and run a tape:
<description>Midway Campaign</description>
<year>1980</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4001002" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Midway Campaign" />
<dataarea name="cass" size="4139402">
@@ -1620,6 +1814,8 @@ To load and run a tape:
<description>Missile Command v1.2</description>
<year>1981</year>
<publisher>Urban E. Soft</publisher>
+ <info name="required_ram" value="48K" />
+ <info name="serial" value="APMG-02" />
<info name="usage" value="*30.7FFFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Missile Command" />
@@ -1629,11 +1825,17 @@ To load and run a tape:
</part>
</software>
- <software name="mmdofmem" supported="partial"><!-- requires cassette audio player -->
+ <software name="mmdofmem" supported="partial">
+ <!-- requires cassette audio player -->
<description>Don't Fall! / Memory Aide</description>
<year>1978</year>
<publisher>Magnemedia Inc.</publisher>
- <info name="usage" value="cass1 audio, cass2 >Load 8K, cass3 audio, cass4 >Load 8K" />
+ <info name="required_ram" value="cass2: 8K" />
+ <info name="required_ram" value="cass4: 8K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: >Load" />
+ <info name="usage" value="cass3: audio" />
+ <info name="usage" value="cass4: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Don't Fall Instructions" />
<dataarea name="cass" size="9620780">
@@ -1660,11 +1862,17 @@ To load and run a tape:
</part>
</software>
- <software name="mmgradra" supported="partial"><!-- requires cassette audio player -->
+ <software name="mmgradra" supported="partial">
+ <!-- requires cassette audio player -->
<description>Grading Routine / Drawing</description>
<year>1978</year>
<publisher>Magnemedia Inc.</publisher>
- <info name="usage" value="cass1 audio, cass2 >Load 16K, cass3 audio, cass4 >Load 4K" />
+ <info name="required_ram" value="cass2: 16K" />
+ <info name="required_ram" value="cass4: 4K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: >Load" />
+ <info name="usage" value="cass3: audio" />
+ <info name="usage" value="cass4: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Grading Routine Instructions" />
<dataarea name="cass" size="9923116">
@@ -1691,11 +1899,17 @@ To load and run a tape:
</part>
</software>
- <software name="mmstukey" supported="partial"><!-- requires cassette audio player -->
+ <software name="mmstukey" supported="partial">
+ <!-- requires cassette audio player -->
<description>Study Aide / Keyboard Organ</description>
<year>1978</year>
<publisher>Magnemedia Inc.</publisher>
- <info name="usage" value="cass1 audio, cass2 >Load 8K, cass3 audio, cass4 >Load 4K" />
+ <info name="required_ram" value="cass2: 8K" />
+ <info name="required_ram" value="cass4: 4K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: >Load" />
+ <info name="usage" value="cass3: audio" />
+ <info name="usage" value="cass4: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Study Aide Instructions" />
<dataarea name="cass" size="15785516">
@@ -1722,11 +1936,17 @@ To load and run a tape:
</part>
</software>
- <software name="mmsuptru" supported="partial"><!-- requires cassette audio player -->
+ <software name="mmsuptru" supported="partial">
+ <!-- requires cassette audio player -->
<description>Super Math / True/False Quiz</description>
<year>1978</year>
<publisher>Magnemedia Inc.</publisher>
- <info name="usage" value="cass1 audio, cass2 >Load 16K, cass3 audio, cass4 >Load 4K" />
+ <info name="required_ram" value="cass2: 16K" />
+ <info name="required_ram" value="cass4: 4K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: >Load" />
+ <info name="usage" value="cass3: audio" />
+ <info name="usage" value="cass4: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Supermath Instructions" />
<dataarea name="cass" size="10584108">
@@ -1753,11 +1973,17 @@ To load and run a tape:
</part>
</software>
- <software name="mmvarmat" supported="partial"><!-- requires cassette audio player -->
+ <software name="mmvarmat" supported="partial">
+ <!-- requires cassette audio player -->
<description>Variable Message / Matching Quiz</description>
<year>1978</year>
<publisher>Magnemedia Inc.</publisher>
- <info name="usage" value="cass1 audio, cass2 >Load 8K, cass3 audio, cass4 >Load 4K" />
+ <info name="required_ram" value="cass2: 8K" />
+ <info name="required_ram" value="cass4: 4K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: >Load" />
+ <info name="usage" value="cass3: audio" />
+ <info name="usage" value="cass4: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Variable Message Instructions" />
<dataarea name="cass" size="19404332">
@@ -1785,10 +2011,11 @@ To load and run a tape:
</software>
<software name="module1">
- <description>Module 1</description>
+ <description>Instant Library: Module 1</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<!-- side 2 not dumped -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 1: Advanced Dragon Maze, Digital Derby, Saucer War" />
@@ -1799,10 +2026,11 @@ To load and run a tape:
</software>
<software name="module2">
- <description>Module 2</description>
+ <description>Instant Library: Module 2</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<!-- program doesn't load if tape started at beginning so start at 0:08 or second copy at 1:10 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 2: 3-D plot, Etch-A-Sketch, Star" />
@@ -1813,10 +2041,11 @@ To load and run a tape:
</software>
<software name="module3">
- <description>Module 3</description>
+ <description>Instant Library: Module 3</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 3: Othello, Mastermind, Seven" />
<dataarea name="cass" size="5348396">
@@ -1826,10 +2055,11 @@ To load and run a tape:
</software>
<software name="module4">
- <description>Module 4</description>
+ <description>Instant Library: Module 4</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<!-- program doesn't load if tape started at beginning so start at second copy at 1:50 -->
<!-- side 2 not dumped -->
<part name="cass" interface="apple2_cass">
@@ -1841,10 +2071,11 @@ To load and run a tape:
</software>
<software name="module5">
- <description>Module 5</description>
+ <description>Instant Library: Module 5</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 5: Awari, Towers of Hanoi, Hex-Pawn" />
<dataarea name="cass" size="5303340">
@@ -1854,10 +2085,11 @@ To load and run a tape:
</software>
<software name="module6">
- <description>Module 6</description>
+ <description>Instant Library: Module 6</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 6: Apple '21'" />
<dataarea name="cass" size="5631020">
@@ -1867,10 +2099,11 @@ To load and run a tape:
</software>
<software name="module7">
- <description>Module 7</description>
+ <description>Instant Library: Module 7</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 7: Hyper-Life, 8 Color Demos" />
<dataarea name="cass" size="5633068">
@@ -1880,10 +2113,11 @@ To load and run a tape:
</software>
<software name="module8">
- <description>Module 8</description>
+ <description>Instant Library: Module 8</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="*30.3FFFR 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*30.3FFFR" />
<!-- program doesn't load if tape started at beginning so start at 0:05 second copy at 1:50 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Module 8: UFO, Clean Sweep/Pong Practice, Star Wars, Luner Lander" />
@@ -1894,10 +2128,11 @@ To load and run a tape:
</software>
<software name="morlocst">
- <description>DUNJONQUEST- Morloc's Tower</description>
+ <description>Dunjonquest: Morloc's Tower</description>
<year>1979</year>
<publisher>Automated Simulations</publisher>
- <info name="usage" value="]Load 48K" />
+ <info name="required_ram" value="48K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Dunjonquest Morloc's Tower" />
<dataarea name="cass" size="8045612">
@@ -1910,8 +2145,11 @@ To load and run a tape:
<description>Moto-Cross</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Chris Oberth" />
+ <info name="partno" value="AP087" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00194" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<!-- program doesn't load if tape started at beginning so start at 0:06 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Moto-Cross" />
@@ -1925,7 +2163,9 @@ To load and run a tape:
<description>Music Box and Kaleidoscope</description>
<year>1978</year>
<publisher>Micro Users Software Exchange</publisher>
- <info name="usage" value=">*300.1B00R 8K" />
+ <info name="author" value="E. Zaron" />
+ <info name="required_ram" value="8K" />
+ <info name="usage" value=">*300.1B00R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Music Box" />
<dataarea name="cass" size="2036268">
@@ -1938,15 +2178,19 @@ To load and run a tape:
<description>Music Kaleidoscope</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value="cass1 >Load 4K, cass2 ]Load 4K" />
+ <info name="author" value="Bob Bishop" />
+ <info name="required_ram" value="4K" />
+ <info name="serial" value="COB-878" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Music Kaleidoscope" />
+ <feature name="part_id" value="Side 1: Music Kaleidoscope (Integer BASIC)" />
<dataarea name="cass" size="2955820">
<rom name="music kaleidoscope (1979)(softape) side 1.wav" size="2955820" crc="9ef30815" sha1="d4fe23e351110d4dd7930dfab0b10851357344dc"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Music Kaleidoscope" />
+ <feature name="part_id" value="Side 2: Music Kaleidoscope (Applesoft)" />
<dataarea name="cass" size="7469612">
<rom name="music kaleidoscope (1979)(softape) side 2.wav" size="7469612" crc="a5d03e48" sha1="81fb90cd5b30cd7fa8c6f169e6d234dd96b90656"/>
</dataarea>
@@ -1957,8 +2201,9 @@ To load and run a tape:
<description>North Atlantic Convoy Raider</description>
<year>1980</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4002002" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="North Atlantic Convoy Raider" />
<dataarea name="cass" size="2596010">
@@ -1971,8 +2216,9 @@ To load and run a tape:
<description>Oil Tycoon</description>
<year>1980</year>
<publisher>Instant Software, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="0079A" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Oil Tycoon" />
<dataarea name="cass" size="6613036">
@@ -1998,15 +2244,20 @@ To load and run a tape:
<description>Othello</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value="cass1 >Load 16K, cass2 ]Load 16K" />
+ <info name="alt_title" value="Super Othello" />
+ <info name="author" value="Gary Shannon" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="OHS-279" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Othello" />
+ <feature name="part_id" value="Side 1: Othello (Integer BASIC)" />
<dataarea name="cass" size="4076588">
<rom name="othello (1979)(softape) side 1.wav" size="4076588" crc="55e45fe2" sha1="ffa69cefa9b0cbe3e3e583301b75f0eb5f0317e5"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Othello" />
+ <feature name="part_id" value="Side 2: Othello (Applesoft)" />
<dataarea name="cass" size="4403756">
<rom name="othello (1979)(softape) side 2.wav" size="4403756" crc="6b81866b" sha1="430b5c4ec8f93f9e21a5dd964f62abf3a525cb8c"/>
</dataarea>
@@ -2017,7 +2268,8 @@ To load and run a tape:
<description>The Patient Professor 16K</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Patient Professor" />
<dataarea name="cass" size="9436716">
@@ -2030,7 +2282,8 @@ To load and run a tape:
<description>The Patient Professor 24K</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 24K" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Patient Professor" />
<dataarea name="cass" size="13443116">
@@ -2043,7 +2296,9 @@ To load and run a tape:
<description>Peg Jump</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
- <info name="usage" value="*200.2000R 16K" />
+ <info name="partno" value="AP090" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Peg Jump" />
<dataarea name="cass" size="4906388">
@@ -2056,8 +2311,11 @@ To load and run a tape:
<description>Phasor Zap</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Chris Oberth" />
+ <info name="partno" value="AP093" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00097" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Phasor Zap" />
<dataarea name="cass" size="5661020">
@@ -2070,8 +2328,11 @@ To load and run a tape:
<description>Pinball / Infinite Number of Monkeys</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="author" value="C. Kellner (Pinball)" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="685-0006-00" />
- <info name="usage" value="cass1 >Load 16K, cass2 >Load 16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Pinball" />
<dataarea name="cass" size="5128556">
@@ -2087,13 +2348,15 @@ To load and run a tape:
</software>
<software name="pirates">
- <description>Pirates!</description>
+ <description>Pirates</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Don Graham" />
+ <info name="required_ram" value="8K" />
<info name="serial" value="00189" />
- <info name="usage" value="*200.4000R 8K" />
+ <info name="usage" value="*200.4000R" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="Pirates!" />
+ <feature name="part_id" value="Pirates" />
<dataarea name="cass" size="5294124">
<rom name="pirates (1978)(programma international, inc.).wav" size="5294124" crc="400133d2" sha1="f8b3269b4995bfc113bdcef8d2a18683f6349e03"/>
</dataarea>
@@ -2104,8 +2367,9 @@ To load and run a tape:
<description>Planet Miners</description>
<year>1981</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4004001" />
- <info name="usage" value="]Load 16K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Planet Miners" />
<dataarea name="cass" size="4165402">
@@ -2118,7 +2382,9 @@ To load and run a tape:
<description>Planetoids</description>
<year>1981</year>
<publisher>Adventure International</publisher>
- <info name="usage" value="*800.1E66R 800G 24K" />
+ <info name="programmer" value="Marc Goodman" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="*800.1E66R 800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Planetoids" />
<dataarea name="cass" size="4227450">
@@ -2131,15 +2397,16 @@ To load and run a tape:
<description>Preschool IQ-Builder</description>
<year>1978</year>
<publisher>Program Design, Inc.</publisher>
- <info name="usage" value="cass1 >Load 6 programs 0:00 0:48 1:47 2:46 3:36 4:36, cass2 >Load" />
+ <info name="usage" value="cass1: >Load 6 programs 0:00 0:48 1:47 2:46 3:36 4:36" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Same and Different" />
+ <feature name="part_id" value="Side A: Same and Different" />
<dataarea name="cass" size="6924332">
<rom name="preschool iq builder (1978)(program design, inc.) side 1.wav" size="6924332" crc="e29302ae" sha1="e99e8452651dee538fad6bf18bcba9a347c4c1a9"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Letter Builder" />
+ <feature name="part_id" value="Side B: Letter Builder" />
<dataarea name="cass" size="720172">
<rom name="preschool iq builder (1978)(program design, inc.) side 2.wav" size="720172" crc="d1fe773c" sha1="896a0ea693c2753ea1180b27aaa8de47edf51ca1"/>
</dataarea>
@@ -2147,9 +2414,12 @@ To load and run a tape:
</software>
<software name="puckman">
- <description>Puck Man</description>
+ <description>Apple Puck Man</description>
<year>1981</year>
<publisher>Star Craft</publisher>
+ <info name="programmer" value="Jun Wada" />
+ <info name="required_ram" value="48K" />
+ <info name="serial" value="AG-018" />
<info name="usage" value="*200.1200R" />
<part name="cass" interface="apple2_cass">
<dataarea name="cass" size="13283372">
@@ -2162,7 +2432,8 @@ To load and run a tape:
<description>Quiz Baseball</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Quiz Baseball" />
<dataarea name="cass" size="8737324">
@@ -2175,15 +2446,18 @@ To load and run a tape:
<description>Racer</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value="cass1 >Load 24K, cass2 ]Load 24K" />
+ <info name="author" value="Lou Haehn" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Racer" />
+ <feature name="part_id" value="Side 1: Racer (Integer BASIC)" />
<dataarea name="cass" size="1743916">
<rom name="racer (1979)(softape) side 1.wav" size="1743916" crc="9fa3e14d" sha1="5a6239e82e28caf066b493807f7fbc45cd258ff1"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Racer" />
+ <feature name="part_id" value="Side 2: Racer (Applesoft)" />
<dataarea name="cass" size="2028076">
<rom name="racer (1979)(softape) side 2.wav" size="2028076" crc="6759ee32" sha1="19c9745ad458d7aed5007c3d008e84559b4d9a4c"/>
</dataarea>
@@ -2194,8 +2468,9 @@ To load and run a tape:
<description>Radar Interceptor</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="32K" />
<info name="serial" value="AHG0125" />
- <info name="usage" value=">Load 32K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Radar Interceptor" />
<dataarea name="cass" size="10623600">
@@ -2208,9 +2483,10 @@ To load and run a tape:
<description>RAM Test</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
- <info name="serial" value="600-2003-00" />
<info name="partno" value="A2T0006X" />
- <info name="usage" value="*280.3FFR start.length CTRL+Y 4K" />
+ <info name="required_ram" value="4K" />
+ <info name="serial" value="600-2003-00" />
+ <info name="usage" value="*280.3FFR start.length CTRL+Y" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="RAM Test" />
<dataarea name="cass" size="1430664">
@@ -2236,6 +2512,8 @@ To load and run a tape:
<description>Renju</description>
<year>1980</year>
<publisher>Tsukumo Electronics</publisher>
+ <info name="alt_title" value="連珠" />
+ <info name="required_ram" value="24K" />
<info name="usage" value="*200.3FFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Renju" />
@@ -2249,7 +2527,10 @@ To load and run a tape:
<description>Retreat</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
- <info name="usage" value="*200.2000R 8K" />
+ <info name="author" value="Don Graham" />
+ <info name="partno" value="AP101" />
+ <info name="required_ram" value="8K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Retreat" />
<dataarea name="cass" size="5260494">
@@ -2262,8 +2543,9 @@ To load and run a tape:
<description>Revive - A Utility Program for the Apple</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="03604" />
- <info name="usage" value="*300.3CFR 16K" />
+ <info name="usage" value="*300.3CFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Revive" />
<dataarea name="cass" size="944428">
@@ -2276,8 +2558,9 @@ To load and run a tape:
<description>Rocket Pilot</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADG0101" />
- <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C 16K" />
+ <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Rocket Pilot" />
<dataarea name="cass" size="7916076">
@@ -2290,7 +2573,9 @@ To load and run a tape:
<description>Road Race / Saucer War</description>
<year>19??</year>
<publisher>Wise Owl Workshop</publisher>
- <info name="usage" value="cass1 *800.2000R Ctrl+B LOMEM:8000 >Load, cass2 >Load" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="cass1: *800.2000R Ctrl+B LOMEM:8000 >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Road Race" />
<dataarea name="cass" size="6708268">
@@ -2309,7 +2594,9 @@ To load and run a tape:
<description>Roulette</description>
<year>1979</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Load 24K" />
+ <info name="author" value="Roger Walker" />
+ <info name="required_ram" value="24K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Roulette" />
<dataarea name="cass" size="3073068">
@@ -2322,8 +2609,10 @@ To load and run a tape:
<description>Sahara Warriors Commando / French Foreign Legion</description>
<year>1979</year>
<publisher>Instant Software, Inc.</publisher>
+ <info name="required_ram" value="8K" />
<info name="serial" value="0080A" />
- <info name="usage" value="cass1 >Load 8K, cass2 >Load 8K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Sahara Warriors Commando" />
<dataarea name="cass" size="3418412">
@@ -2342,8 +2631,9 @@ To load and run a tape:
<description>Sargon I</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="24K" />
<info name="serial" value="00604" />
- <info name="usage" value="*800.2CFFR 800G 24K" />
+ <info name="usage" value="*800.2CFFR 800G" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Sargon I" />
<dataarea name="cass" size="3535916">
@@ -2356,8 +2646,9 @@ To load and run a tape:
<description>Sargon II</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="24K" />
<info name="serial" value="03404" />
- <info name="usage" value="*30.3FFR 24K" />
+ <info name="usage" value="*30.3FFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Sargon II" />
<dataarea name="cass" size="3978796">
@@ -2370,8 +2661,9 @@ To load and run a tape:
<description>Saucer Invasion</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADG0102" />
- <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C 16K" />
+ <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Saucer Invasion" />
<dataarea name="cass" size="7673900">
@@ -2385,7 +2677,10 @@ To load and run a tape:
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
<info name="serial" value="002-0015-00" />
- <info name="usage" value="cass1 ]Load 16K, cass2 ]Load 20K" />
+ <info name="required_ram" value="cass1: 16K" />
+ <info name="required_ram" value="cass2: 20K" />
+ <info name="usage" value="cass1: ]Load" />
+ <info name="usage" value="cass2: ]Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Savings" />
<dataarea name="cass" size="3288108">
@@ -2401,10 +2696,10 @@ To load and run a tape:
</software>
<software name="soft8103">
- <description>Softside Mar 1981</description>
+ <description>SoftSide March 1981 (V3N6)</description>
<year>1981</year>
- <publisher>Softside</publisher>
- <info name="usage" value="]Load 4 programs: Title 0:00, Minigolf 0:33, Strategy Strike 1:40, Math Decathlon 2:40" />
+ <publisher>SoftSide Publications</publisher>
+ <info name="usage" value="]Load 4 programs: Title 0:00, Mini Golf 0:33, Strategy Strike 1:40, Math Decathlon 2:40" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide Mar 1981" />
<dataarea name="cass" size="9112502">
@@ -2414,9 +2709,9 @@ To load and run a tape:
</software>
<software name="soft8105">
- <description>Softside May 1981</description>
+ <description>SoftSide May 1981 (V4N8)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 4 programs: Title 0:00, Math Decathlon 0:37, Galaxia 2:18, Trivia 3:28" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide May 1981" />
@@ -2427,9 +2722,9 @@ To load and run a tape:
</software>
<software name="soft8106">
- <description>Softside June 1981</description>
+ <description>SoftSide June 1981 (V4N9)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 3 programs: 0:00 Hexadecimal Puzzle, 0:48 Old Glory, 1:30 Math Decathlon" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide June 1981" />
@@ -2440,9 +2735,9 @@ To load and run a tape:
</software>
<software name="soft8107">
- <description>Softside July 1981</description>
+ <description>SoftSide July 1981 (V4N10)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 4 programs: 0:00 Kidnapped, 1:49 4-Player Volleyball, 2:44 Micro-Drafter, 3:51 Chemistry Drill" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide July 1981" />
@@ -2453,9 +2748,9 @@ To load and run a tape:
</software>
<software name="soft8108">
- <description>Softside August 1981</description>
+ <description>SoftSide August 1981 (V4N11)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 3 programs: 0:00 Shark, 0:52 Quest 1, 2:30 Battlefield" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide August 1981" />
@@ -2466,9 +2761,9 @@ To load and run a tape:
</software>
<software name="soft8109">
- <description>Softside September 1981</description>
+ <description>SoftSide September 1981 (V4N12)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 3 programs: 0:00 Orienteering at Jacque's Coulee, 2:00 Challenge!, 3:27 Mixed Graphics and Text" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide September 1981" />
@@ -2479,9 +2774,9 @@ To load and run a tape:
</software>
<software name="soft8110">
- <description>Softside October 1981</description>
+ <description>SoftSide October 1981 (V5N1)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 2 programs: 0:00 Leyte, 1:06 The Arena of the Octos" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide October 1981" />
@@ -2492,9 +2787,9 @@ To load and run a tape:
</software>
<software name="soft8112">
- <description>Softside December 1981</description>
+ <description>SoftSide December 1981 (V5N3)</description>
<year>1981</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 3 programs: 0:00 Titan, 1:42 Microtext 1.0, 2:33 Aircraft Commander" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide December 1981" />
@@ -2505,9 +2800,9 @@ To load and run a tape:
</software>
<software name="soft8201">
- <description>Softside January 1982</description>
+ <description>SoftSide January 1982 (V5N4)</description>
<year>1982</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 4 programs: 0:00 Gambler, 1:40 Word Wars, 3:05 Microtext 1.1, 4:03 Apple Capture" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide January 1982" />
@@ -2518,9 +2813,9 @@ To load and run a tape:
</software>
<software name="soft8205">
- <description>Softside May 1982</description>
+ <description>SoftSide May 1982 (V5N8)</description>
<year>1982</year>
- <publisher>Softside</publisher>
+ <publisher>SoftSide Publications</publisher>
<info name="usage" value="]Load 4 programs: 0:00 and 0:50 Solitaire, 1:43 Micro-Man, 2:43 Remark Writer-Formatter, 3:13 April F.O.O.L.S." />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SoftSide May 1982" />
@@ -2531,12 +2826,12 @@ To load and run a tape:
</software>
<software name="soft8207">
- <description>Softside July 1982</description>
+ <description>SoftSide June/July 1982 (V5N9, #30)</description>
<year>1982</year>
- <publisher>Softside</publisher>
- <info name="usage" value="]Load 5 programs: 0:00 Escape from the Dungeon of the Gods, 1:35 Swat, 2:08 Code Breaker, 3:03 Defined Function, 3:38 Space Float" />
+ <publisher>SoftSide Publications</publisher>
+ <info name="usage" value="]Load 5 programs: 0:00 Escape from the Dungeon of the Gods, 1:35 SWAT, 2:08 Code Breaker, 3:03 Defined Function, 3:38 Space Float" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="SoftSide July 1982" />
+ <feature name="part_id" value="SoftSide Issue 30" />
<dataarea name="cass" size="5479212">
<rom name="softside jul 1982 (1982)(softside).wav" size="5479212" crc="4c4363e4" sha1="f3cd6557ed709c13555b0cc67091fdbf40026104"/>
</dataarea>
@@ -2544,12 +2839,12 @@ To load and run a tape:
</software>
<software name="soft820a">
- <description>Softside July 1982 Computers in Education</description>
+ <description>SoftSide August 1982 (V5N10, #31)</description>
<year>1982</year>
- <publisher>Softside</publisher>
- <info name="usage" value="]Load 3 programs: 0:00 Cats, 1:02 Snake Scramble, 1:33 Puzzle Jumble" />
+ <publisher>SoftSide Publications</publisher>
+ <info name="usage" value="]Load 3 programs: 0:00 C.A.T.S., 1:02 Snake Scramble, 1:33 Puzzle Jumble" />
<part name="cass" interface="apple2_cass">
- <feature name="part_id" value="SoftSide July 1982 Computers in Education" />
+ <feature name="part_id" value="SoftSide Issue 31" />
<dataarea name="cass" size="3550764">
<rom name="softside jul 1982 computers in education (1982)(softside).wav" size="3550764" crc="6ae8be1c" sha1="b712888c96329b2c3c9a0c50b2bac98d4b784e5e"/>
</dataarea>
@@ -2560,8 +2855,9 @@ To load and run a tape:
<description>Songs in the Key of Apple</description>
<year>1979</year>
<publisher>Hayden Book Company</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="03304" />
- <info name="usage" value=">Load 16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Songs in the Key of Apple" />
<dataarea name="cass" size="1653036">
@@ -2574,8 +2870,9 @@ To load and run a tape:
<description>Space Maze</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADG0104" />
- <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C 16K" />
+ <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Space Maze" />
<dataarea name="cass" size="7637548">
@@ -2588,8 +2885,9 @@ To load and run a tape:
<description>Space War</description>
<year>1979</year>
<publisher>Instant Software, Inc.</publisher>
+ <info name="required_ram" value="8K" />
<info name="serial" value="0096A" />
- <info name="usage" value=">Load 8K" />
+ <info name="usage" value=">Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Space War" />
<dataarea name="cass" size="1437740">
@@ -2602,8 +2900,11 @@ To load and run a tape:
<description>Speedway</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Bob Flannagan" />
+ <info name="partno" value="AP109" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00190" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Speedway" />
<dataarea name="cass" size="2460716">
@@ -2616,8 +2917,9 @@ To load and run a tape:
<description>Spider Tag</description>
<year>1980</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="00125" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<!-- program doesn't load if tape started at beginning so start at 0:17 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Spider Tag" />
@@ -2631,7 +2933,9 @@ To load and run a tape:
<description>Star Blazer</description>
<year>1981</year>
<publisher>Star Craft</publisher>
- <info name="usage" value="*30.3FFR 48K" />
+ <info name="author" value="Tony Suzuki" />
+ <info name="required_ram" value="48K" />
+ <info name="usage" value="*30.3FFR" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Star Blazer" />
<dataarea name="cass" size="3793196">
@@ -2640,11 +2944,12 @@ To load and run a tape:
</part>
</software>
- <software name="starques">
- <description>STARQUEST Rescue at Rigel</description>
+ <software name="sqresrig">
+ <description>Starquest: Rescue at Rigel</description>
<year>1980</year>
<publisher>Automated Simulations</publisher>
- <info name="usage" value="]Load 32K" />
+ <info name="required_ram" value="32K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Star Quest Rescue at Rigel" />
<dataarea name="cass" size="25599020">
@@ -2657,8 +2962,9 @@ To load and run a tape:
<description>Star Wars</description>
<year>1978</year>
<publisher>Powersoft, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="ADG0103" />
- <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C 16K" />
+ <info name="usage" value="*4A.FFR800.1FFFR Ctrl+C" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Star Wars" />
<dataarea name="cass" size="4311084">
@@ -2671,8 +2977,11 @@ To load and run a tape:
<description>Statistics</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Sherwin Steffin" />
+ <info name="partno" value="AP113" />
+ <info name="required_ram" value="24K" />
<info name="serial" value="00162" />
- <info name="usage" value="]Load 24K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Statistics" />
<dataarea name="cass" size="4048940">
@@ -2685,8 +2994,9 @@ To load and run a tape:
<description>Stocks &amp; Bonds</description>
<year>1982</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="32K" />
<info name="serial" value="4096101" />
- <info name="usage" value="]Load 32K" />
+ <info name="usage" value="]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Stocks &amp; Bonds" />
<dataarea name="cass" size="3417644">
@@ -2699,15 +3009,16 @@ To load and run a tape:
<description>Story Builder</description>
<year>1978</year>
<publisher>Program Design, Inc.</publisher>
- <info name="usage" value="cass1 Story Builder 0:00, Fractured Nursery Rhymes 0:45, More Fractured Nursery Rhymes 1:25, cass2 >Load" />
+ <info name="usage" value="cass1: Story Builder 0:00, Fractured Nursery Rhymes 0:45, More Fractured Nursery Rhymes 1:25" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Story Builder" />
+ <feature name="part_id" value="Side A: Story Builder" />
<dataarea name="cass" size="2804268">
<rom name="story builder (1978)(program design, inc.).wav" size="2804268" crc="0f426918" sha1="5e71e374f35f222c981daebf801f1069ace1b728"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Word Master" />
+ <feature name="part_id" value="Side B: Word Master" />
<dataarea name="cass" size="804140">
<rom name="word master (1978)(program design, inc.).wav" size="804140" crc="36b3c41c" sha1="e8880e7541d143ae18876cba2e9f3278e211ebe9"/>
</dataarea>
@@ -2719,8 +3030,10 @@ To load and run a tape:
<description>Startrek / Starwars</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="002-0006-00" />
- <info name="usage" value="cass1 >Load 16K, cass2 >Load 16K" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Startrek" />
<dataarea name="cass" size="4134574">
@@ -2735,11 +3048,14 @@ To load and run a tape:
</part>
</software>
- <software name="studyaid" supported="partial" cloneof="mmstukey"><!-- requires cassette audio player -->
+ <software name="studyaid" supported="partial" cloneof="mmstukey">
+ <!-- requires cassette audio player -->
<description>Study Aide</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value="cass1 audio, cass2 >Load 8K" />
+ <info name="required_ram" value="8K" />
+ <info name="usage" value="cass1: audio" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Study Aide Instructions" />
<dataarea name="cass" size="8520748">
@@ -2758,7 +3074,8 @@ To load and run a tape:
<description>Super Arithmetica</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Super Arithmetica" />
<dataarea name="cass" size="9414188">
@@ -2784,8 +3101,10 @@ To load and run a tape:
<description>Super Othello</description>
<year>1979</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="partno" value="AP120" />
+ <info name="required_ram" value="16K" />
<info name="serial" value="00261" />
- <info name="usage" value="*200.2000R 16K" />
+ <info name="usage" value="*200.2000R" />
<!-- program doesn't load if tape started at beginning so start at 0:20 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Super Othello" />
@@ -2799,8 +3118,10 @@ To load and run a tape:
<description>Super Starwars</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="partno" value="AP121" />
+ <info name="required_ram" value="32K" />
<info name="serial" value="00327" />
- <info name="usage" value="*200.6000R 32K" />
+ <info name="usage" value="*200.6000R" />
<!-- program doesn't load if tape started at beginning so start at 0:25 -->
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Super Starwars" />
@@ -2814,7 +3135,8 @@ To load and run a tape:
<description>SuperMath</description>
<year>1980</year>
<publisher>Innerglo</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="SuperMath" />
<dataarea name="cass" size="8937516">
@@ -2823,7 +3145,8 @@ To load and run a tape:
</part>
</software>
- <software name="sweettal" supported="no"><!-- requires Sweet Talker card -->
+ <software name="sweettal" supported="no">
+ <!-- requires Sweet Talker card -->
<description>Sweet Talker</description>
<year>1981</year>
<publisher>Micromint, Inc.</publisher>
@@ -2840,7 +3163,10 @@ To load and run a tape:
<description>The Talking Calculator</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="author" value="Bob Bishop" />
+ <info name="required_ram" value="16K" />
+ <info name="serial" value="TCB-978" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Talking Calculator" />
<dataarea name="cass" size="4154412">
@@ -2853,8 +3179,9 @@ To load and run a tape:
<description>Tanktics</description>
<year>1981</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="4012001" />
- <info name="usage" value="]Load stop tape ]RUN play tape 16K" />
+ <info name="usage" value="]Load stop tape ]RUN play tape" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Tanktics" />
<dataarea name="cass" size="3308844">
@@ -2867,7 +3194,9 @@ To load and run a tape:
<description>Tank War</description>
<year>1978</year>
<publisher>Micro Users Software Exchange</publisher>
- <info name="usage" value="*3F0.2000R 16K" />
+ <info name="author" value="E. Zaron" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="*3F0.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Tank War" />
<dataarea name="cass" size="3493676">
@@ -2876,12 +3205,15 @@ To load and run a tape:
</part>
</software>
- <software name="tapmatt" supported="no"><!-- cass1 requires Tape Measure PROM card --><!-- cass2 requires cassette audio player -->
+ <software name="tapmatt" supported="no">
+ <!-- cass1 requires Tape Measure PROM card -->
+ <!-- cass2 requires cassette audio player -->
<description>Tape Measure / Alignment Test Tone</description>
<year>1978</year>
<publisher>Apple Computer, Inc.</publisher>
<info name="serial" value="685-0001-00" />
- <info name="usage" value="cass1 use with PROM card in slot 1, *C100G; cass2 audio" />
+ <info name="usage" value="cass1: *C100G (Use with PROM card in slot 1)" />
+ <info name="usage" value="cass2: audio" />
<part name="cass1" interface="apple2_cass">
<feature name="part_id" value="Tape Measure" />
<dataarea name="cass" size="5863468">
@@ -2896,19 +3228,25 @@ To load and run a tape:
</part>
</software>
- <software name="tictspec" supported="partial"><!-- requires cassette audio player -->
+ <software name="tictspec" supported="partial">
+ <!-- requires cassette audio player -->
<description>Tic-Tac-Talker / Spectrum Analysis</description>
<year>1978</year>
<publisher>Softape</publisher>
- <info name="usage" value="cass1 >Load 24K, cass2 >Load 4K" />
+ <info name="author" value="Bill Depew" />
+ <info name="required_ram" value="cass1: 24K" />
+ <info name="required_ram" value="cass2: 4K" />
+ <info name="serial" value="TTT-978" />
+ <info name="usage" value="cass1: >Load" />
+ <info name="usage" value="cass2: >Load" />
<part name="cass1" interface="apple2_cass">
- <feature name="part_id" value="Tic-Tac-Talker" />
+ <feature name="part_id" value="Side A: Tic-Tac-Talker" />
<dataarea name="cass" size="5725228">
<rom name="tic-tac-talker (1978)(softape).wav" size="5725228" crc="47ff1faa" sha1="77baa051d6dfdc8b3287c41f2907e3aa0756d37f"/>
</dataarea>
</part>
<part name="cass2" interface="apple2_cass">
- <feature name="part_id" value="Spectrum Analysis" />
+ <feature name="part_id" value="Side B: Spectrum Analysis" />
<dataarea name="cass" size="1769516">
<rom name="spectrum analysis (1978)(softape).wav" size="1769516" crc="f728971a" sha1="281b8ee1096fc1017efbc1572fbb187f5a3082e0"/>
</dataarea>
@@ -2919,8 +3257,11 @@ To load and run a tape:
<description>Time Clock</description>
<year>1978</year>
<publisher>Programma International, Inc.</publisher>
+ <info name="author" value="Harry Tarnoff" />
+ <info name="partno" value="AP126" />
+ <info name="required_ram" value="8K" />
<info name="serial" value="00097" />
- <info name="usage" value="*200.2000R 8K" />
+ <info name="usage" value="*200.2000R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Time Clock" />
<dataarea name="cass" size="5442092">
@@ -2933,8 +3274,9 @@ To load and run a tape:
<description>Typing Tutor</description>
<year>1979</year>
<publisher>Microsoft Consumer Products</publisher>
+ <info name="required_ram" value="16K" />
<info name="serial" value="24B02" />
- <info name="usage" value=">Load 16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Typing Tutor" />
<dataarea name="cass" size="1951788">
@@ -2947,6 +3289,7 @@ To load and run a tape:
<description>U-Draw</description>
<year>1978</year>
<publisher>Micro Users Software Exchange</publisher>
+ <info name="author" value="E. Zaron" />
<info name="usage" value="*300.1B00R" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="U-Draw" />
@@ -2960,8 +3303,9 @@ To load and run a tape:
<description>Voyager I</description>
<year>1981</year>
<publisher>Microcomputer Games</publisher>
+ <info name="required_ram" value="32K" />
<info name="serial" value="41801011" />
- <info name="usage" value="*1000.1300R stop tape ]POKE104,64:POKE 103,1:POKE16384,0 ]Load 32K" />
+ <info name="usage" value="*1000.1300R stop tape ]POKE104,64:POKE 103,1:POKE16384,0 ]Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Voyager I" />
<dataarea name="cass" size="2204716">
@@ -2974,7 +3318,8 @@ To load and run a tape:
<description>Warlords</description>
<year>1978</year>
<publisher>Speakeasy Software Ltd.</publisher>
- <info name="usage" value=">Load 16K" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value=">Load" />
<part name="cass" interface="apple2_cass">
<feature name="part_id" value="Warlords" />
<dataarea name="cass" size="3660844">
@@ -2983,4 +3328,22 @@ To load and run a tape:
</part>
</software>
+ <software name="wheeldeal" supported="no">
+ <description>Wheeler Dealers</description>
+ <year>1978</year>
+ <publisher>Speakeasy Software</publisher>
+ <info name="programmer" value="Danielle Bunten Berry" />
+ <info name="required_ram" value="16K" />
+ <info name="usage" value="Shipped with special hardware controllers, but joystick or paddeles can be used by defining directional movement (not button press) to each player." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE" />
+ <!-- Dump released: 2024-05-09 -->
+ <!-- simulation game -->
+ <part name="cass" interface="apple2_cass">
+ <feature name="part_id" value="Wheeler Dealers" />
+ <dataarea name="cass" size="6462138">
+ <rom name="wheeler dealers (1978) (speakeasy software, ltd.).wav" size="6462138" crc="83abeab4" sha1="5af05f91a712d5e2ccaa03606d269574405fecfa" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/apple2_flop_clcracked.xml b/hash/apple2_flop_clcracked.xml
index 956907f2717..9449da1846d 100644
--- a/hash/apple2_flop_clcracked.xml
+++ b/hash/apple2_flop_clcracked.xml
@@ -14,75 +14,36 @@ license:CC0-1.0
complete dumps for the following sets:
Set "esidioms" (Essential Idioms) is missing disk #1.
- Set "colorme" (Color Me) is missing Tink! Tonk! Side B.
Set "mthtutsb" (Math Tutor: Subtraction) is missing disk #1.
Set "prcgramr" (Practical Grammar) is missing disks #1-13.
Set "qmile41" (The Quarter Mile (version 4.1) is missing disks #1, 4, and 5.
Set "succread" (Success with Reading) is thought to be missing story A/B.
+ Set "succtype" (Success with Typing) is missing disk 3 and 4.
Set "sentdiag" (Sentence Diagramming) is missing disk #5.
Set "schlread" (Scholastic Reading Comprehension) is likely missing several.
Set "basfrcc" (Basic Fraction Concepts) is missing side A.
Set "shvrbgl3" (Scoring Higher: Verbal Grade Level 3) is missing disk 12.
Set "frogdog2" (Frogs, Dogs, Kittens, and Kids 2 (version 10.18.88)) may be
- missing disks 1-3, but it is unknown if those exist.
+ missing disks 1-3, but it is unknown if those exist. May have been shipped with Frogs, Dogs, Kittens, and Kids 1,
+ which has the same version and 3 disks.
Set "matactl4" (Mathematics Activities Courseware Level 4) is missing
disk 1. Disk 2 does boot, so it's usable. Is there a disk 3?
Set "matactl6" (Mathematics Activities Courseware Level 6) may be missing
disks A and B. Disk C does boot, so it's usable.
Set "asatprep" (ARCO Computer Preparation for the SAT) is missing
disks 1, 2, and 7.
+ Set "microz23" (Microzine 23) is missing disk 2 containing the "greetings" application.
+ Set "microz25" (Microzine 25) is missing disk 2 containing the "blueprint maker" application.
+ Set "microz26" (Microzine 26) is missing disk 2 containing the "congratulations" application.
+ Set "slidshop10" (Slide Shop (version 1.0)) is missing disks 3 and 4 containing borders and clip art.
+ Set "cbookmkr" (The Comic Book Maker (version 1.2)) is missing disk 2 containing clip art.
+ Set "advanalo" (Advanced Analogies (version 29.06.84)) is missing disk 1. Disk 2 is usable.
+ Set "verbsh" (Verbs (version 09.15.87) (Hartley Courseware)) is missing disk 2.
+ Set "verbsh083186" (Verbs (version 08.31.86) (Hartley Courseware)) is missing disk 1.
+ Set "spdrdr2b" (Speed Reader II (version 09.12.86)) is missing disk 2.
-->
- <!--Set "hhlngvwl" (Hugo Hound's Vowel Sounds) may be missing disk 2 - "Short Vowels" based on manual found later.-->
-
- <!-- Imperfect cracks for Epyx software were missing and never added
- to this list, thus only the corrected versions are listed here. -->
-
- <software name="101mword">
- <description>101 Misused Words (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Learning Seed Company</publisher>
- <info name="release" value="2016-04-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="101 misused words (4am crack).dsk" size="143360" crc="49662c0d" sha1="b71a873630ef10333695890ab66a7bd80a9ef06e" />
- </dataarea>
- </part>
- </software>
-
- <software name="123dmult">
- <description>1-2-3 Digit Multiplication (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-04-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="1-2-3 digit multiplication (4am crack).dsk" size="143360" crc="78461261" sha1="c8b8e76295be278b0faa2a10c255b3c3f7b7468c" />
- </dataarea>
- </part>
- </software>
-
- <software name="2400ad">
- <description>2400 A.D. (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2018-09-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="2400 a.d. (4am crack) side a.dsk" size="143360" crc="b213865f" sha1="6f32418850fa522019233743e19ceac5bd961c95" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="2400 a.d. (4am crack) side b.dsk" size="143360" crc="30248b30" sha1="6154a819e207104af57b262c950fa225a8b0d1a1" />
- </dataarea>
- </part>
- </software>
+ <!-- Set "hhlngvwl" (Hugo Hound's Vowel Sounds) may be missing disk 2 - "Short Vowels" based on manual found later. -->
<software name="alcazar">
<description>Alcazar the Forgotten Fortress (cleanly cracked)</description>
@@ -109,37 +70,6 @@ license:CC0-1.0
</part>
</software>
- <software name="amchal">
- <description>The American Challenge (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="american challenge, the (1986)(mindscape)(trex crack).dsk" size="143360" crc="26af56f8" sha1="89d4c5c1a232a0c6ef1960d9da0e05e626890e55" />
- </dataarea>
- </part>
- </software>
-
- <software name="batlches">
- <description>Battle Chess (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Interplay</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop1" size="143360">
- <rom name="battle chess side a (1990)(interplay)(trex crack).dsk" size="143360" crc="a81e4ae5" sha1="5b0e79fa0d4257a4855864c9324840cc1a41284e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop1" size="143360">
- <rom name="battle chess side b (1990)(interplay)(trex crack)[unk filesys].dsk" size="143360" crc="54359fd3" sha1="19b3ed795c9827f580df77f559ad02eca55455b9" />
- </dataarea>
- </part>
- </software>
-
<software name="batman">
<description>Batman (cleanly cracked)</description>
<year>1988</year>
@@ -193,18 +123,6 @@ license:CC0-1.0
</part>
</software>
- <software name="cntdsht">
- <description>Countdown to Shutdown (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Activision</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="countdown to shutdown (1985)(activision)(trex crack).dsk" size="143360" crc="cf4ac129" sha1="ee6843930f3c78c738f3ef4cf1e306ef5897d8af" />
- </dataarea>
- </part>
- </software>
-
<software name="cogito">
<description>Cogito! (cleanly cracked)</description>
<year>1984</year>
@@ -218,37 +136,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crismntn">
- <description>Crisis Mountain (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crisis mountain (1982)(synergistic software)(4am crack).dsk" size="143360" crc="f43e80de" sha1="1bbdbe1a89ea35dce064406b79cee8cb10da81a4" />
- </dataarea>
- </part>
- </software>
-
- <software name="dmaster">
- <description>Dungeon Master's Assistant (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Strategic Simulations</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop1" size="143360">
- <rom name="dungeon master's assistant side a (1988)(ssi)(trex crack)[rdos].dsk" size="143360" crc="14904b40" sha1="9a8953ed45bb36f340b13db1eb6d75a26e498815" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop1" size="143360">
- <rom name="dungeon master's assistant side b (1988)(ssi)(trex crack)[rdos].dsk" size="143360" crc="fafa454c" sha1="169ec625b5d72f6c624534e4c031915a0e36c82d" />
- </dataarea>
- </part>
- </software>
-
<software name="genesis">
<description>Genesis (cleanly cracked)</description>
<year>1983</year>
@@ -278,7 +165,7 @@ license:CC0-1.0
<description>Hardball (cleanly cracked)</description>
<year>1985</year>
<publisher>Accolade</publisher>
- <!--"Hardball!" is a 1985 sports game developed by Bob Whitehead, Dan Thompson, Mimi Doggett (graphics), and Ed Bogas (music), and distributed by Accolade.-->
+ <!-- "Hardball!" is a 1985 sports game developed by Bob Whitehead, Dan Thompson, Mimi Doggett (graphics), and Ed Bogas (music), and distributed by Accolade. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -287,23 +174,11 @@ license:CC0-1.0
</part>
</software>
- <software name="hhmack">
- <description>Hard Hat Mack (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="hard hat mack clean crack.dsk" size="143360" crc="eb4733c7" sha1="32e01bbc99ac6c71fbcd424b9259624699dee5bf" />
- </dataarea>
- </part>
- </software>
-
<software name="lawwest">
<description>Law of the West (cleanly cracked)</description>
<year>1985</year>
<publisher>Accolade</publisher>
- <!--"Law of the West" is a 1985 adventure game developed by Alan Miller (design), Tom McWilliams (Apple II port), Mimi Doggett (graphics), and Ed Bogas (music), and distributed by Accolade.-->
+ <!-- "Law of the West" is a 1985 adventure game developed by Alan Miller (design), Tom McWilliams (Apple II port), Mimi Doggett (graphics), and Ed Bogas (music), and distributed by Accolade. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -339,71 +214,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mspac">
- <description>Ms. Pac Man (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atari</publisher>
- <info name="release" value="2015-03-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ms. pac-man (atari)(4am crack).dsk" size="143360" crc="7b7196fc" sha1="49b21f8c3a838c12b2d785f4342432212698c0bb" />
- </dataarea>
- </part>
- </software>
-
- <software name="pacman">
- <description>Pac-Man (Atari) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atari</publisher>
- <info name="release" value="2015-03-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pac-man (atari)(4am crack).dsk" size="143360" crc="988e08f1" sha1="5eb20be8a79227715177b65cd0ea4a34be273629" />
- </dataarea>
- </part>
- </software>
-
- <software name="pacmand">
- <description>Pac-Man (Datasoft) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Datasoft</publisher>
- <info name="release" value="2015-03-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pac-man (datasoft)(4am crack).dsk" size="143360" crc="9852a378" sha1="dd4cec96fd37aba85f5bd2a5b75d0656904765d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="pacmant">
- <description>Pac-Man (Thunder Mountain) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2015-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pac-man (thunder mountain)(4am crack).dsk" size="143360" crc="82379bed" sha1="9b3e1b9e78dcfb1f8f55925c9bf2f6161423004d" />
- </dataarea>
- </part>
- </software>
-
- <software name="paperboy">
- <description>Paperboy (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Mindscape / Atari</publisher>
- <info name="release" value="2014-05-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="paperboy (4am crack).dsk" size="143360" crc="e0914bc0" sha1="37da2f836f9182c53931a8f08827f72826f844ac" />
- </dataarea>
- </part>
- </software>
-
<software name="pigpen">
<description>Pigpen (cleanly cracked)</description>
<year>1982</year>
@@ -440,32 +250,6 @@ license:CC0-1.0
</part>
</software>
- <software name="racter">
- <description>Racter (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-12-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="racter (4am crack).dsk" size="143360" crc="4a8d1fdf" sha1="338edfaf156b86b09a1e46a20b359097f23bf9ad" />
- </dataarea>
- </part>
- </software>
-
- <software name="rambop2">
- <description>Rambo First Blood Part II (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rambo first blood part ii (4am crack).dsk" size="143360" crc="81d373ce" sha1="811d257c3a20f6af54eb4e0c88d65fe90c1afed1" />
- </dataarea>
- </part>
- </software>
-
<software name="rampage">
<description>Rampage (cleanly cracked)</description>
<year>1988</year>
@@ -564,131 +348,6 @@ license:CC0-1.0
</part>
</software>
- <software name="xevious">
- <description>Xevious (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Mindscape</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="xevious (4am crack).dsk" size="143360" crc="c0965f9a" sha1="11b8f8761b4d5cfb333d95dfe7064a3115febab6" />
- </dataarea>
- </part>
- </software>
-
- <software name="123seqme">
- <description>1-2-3 Sequence Me (cleanly cracked)</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="1-2-3 sequence me (4am crack).dsk" size="143360" crc="7e2ec77e" sha1="01fa783c5bd63d04e4280308e3eae48ca546c330" />
- </dataarea>
- </part>
- </software>
-
- <software name="agentusa">
- <description>Agent USA (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-05-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="agent usa (4am crack).dsk" size="143360" crc="13057c2c" sha1="6cecfadfadf2c7ffbcbdfaba3205d479d978a812" />
- </dataarea>
- </part>
- </software>
-
- <software name="alcwndrl">
- <description>Alice in Wonderland (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2015-05-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="alice in wonderland (4am crack) side a.dsk" size="143360" crc="46d03565" sha1="bf3ea2cdf0c5fb63aff9686605c2cae84774c62f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="alice in wonderland (4am crack) side b.dsk" size="143360" crc="f03e007e" sha1="fd960bf392beaa9f081ff36a9f621cd1ce5e3c92" />
- </dataarea>
- </part>
- </software>
-
- <software name="algeplus">
- <description>Alge-Blaster Plus! (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates, Inc.</publisher>
- <info name="release" value="2014-11-17"/>
- <info name="usage" value="Works with Apple II Mouse Card in slot 4: -sl4 mouse" />
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Program Disk Side 1"/>
- <dataarea name="flop" size="143360">
- <rom name="alge-blaster plus (4am crack) program disk side 1.dsk" size="143360" crc="e8d890c7" sha1="e2dbdde612c1da4543d79a6a8bd793a9a3501320" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Program Disk Side 2"/>
- <dataarea name="flop" size="143360">
- <rom name="alge-blaster plus (4am crack) program disk side 2.dsk" size="143360" crc="90c22d74" sha1="75d3c345e93dfe177ae4e2c5cd85bd770bead924" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Data Disk Side 1"/>
- <dataarea name="flop" size="143360">
- <rom name="alge-blaster plus (4am crack) data disk side 1.dsk" size="143360" crc="cbd1a613" sha1="fde73dbad3ede97e2e1758b2f20fcf42e5756c5d" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Data Disk Side 2"/>
- <dataarea name="flop" size="143360">
- <rom name="alge-blaster plus (4am crack) data disk side 2.dsk" size="143360" crc="8d94d796" sha1="8716509d1e68ad38f269d411b6c67838d4e9c4e8" />
- </dataarea>
- </part>
- </software>
-
- <software name="algernon">
- <description>Algernon (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-03-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="algernon (4am crack).dsk" size="143360" crc="7f4cd588" sha1="7356d7d510690126ee36270a415dac857553387a" />
- </dataarea>
- </part>
- </software>
-
- <software name="amhisadv">
- <description>American History Adventure (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Queue</publisher>
- <info name="release" value="2015-12-22"/>
- <!-- This crack was updated on 2015-12-22 to fix compatibility with some
- less-accurate emulators. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="american history adventure (4am crack) disk 1.dsk" size="143360" crc="edc59ce1" sha1="70cfc2f59c69b2dbf96a30ce5cfde65019ba066f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="american history adventure (4am crack) disk 2.dsk" size="143360" crc="fb844c49" sha1="7536c32a6ab54997c696a367e2ed887ce1c15bb3" />
- </dataarea>
- </part>
- </software>
-
<software name="animkngd">
<description>Animal Kingdom (cleanly cracked)</description>
<year>1985</year>
@@ -709,19 +368,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ballblzr">
- <description>BallBlazer (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Lucasfilm Games</publisher>
- <info name="release" value="2015-05-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ballblazer (4am crack).dsk" size="143360" crc="aa48b3a9" sha1="ecc85c358ccb8373e9872733ed00a40f9b2bcad2" />
- </dataarea>
- </part>
- </software>
-
<software name="bandsaw">
<description>Band Saw and Shaper Safety (cleanly cracked)</description>
<year>1986</year>
@@ -761,38 +407,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bbmttafh">
- <description>Big Book Maker: Tall Tales and American Folk Heroes (cleanly cracked)</description>
- <year>1991</year>
- <publisher>Queue</publisher>
- <info name="release" value="2015-03-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="big book maker (4am crack) disk 1 side a.dsk" size="143360" crc="3f18085e" sha1="b69bdab8c4840a0922ac65b765bc3d20a38cfbd1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="big book maker (4am crack) disk 1 side b.dsk" size="143360" crc="1142180f" sha1="cc8cd090bb644c31ec7229a0d79f135cc9e7f732" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="big book maker (4am crack) disk 2 side a.dsk" size="143360" crc="b13c5630" sha1="8b6771472e2f977b5dc30d48ba8cbf8680b635a4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="big book maker (4am crack) disk 2 side b.dsk" size="143360" crc="b75798e9" sha1="1c25c3a721a731cb9bedc01da8d3440eac2db099" />
- </dataarea>
- </part>
- </software>
-
<software name="bingoha">
<description>Bingo Bugglebee Presents: Home Alone (cleanly cracked)</description>
<year>1985</year>
@@ -819,59 +433,6 @@ license:CC0-1.0
</part>
</software>
- <software name="binomult">
- <description>Binomial Multiplication (Mindscape) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-11-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="binomial multiplication (4am crack).dsk" size="143360" crc="362c9ff4" sha1="566aa3c2a2f25dfbaef9df91e0ac4b339e916a41" />
- </dataarea>
- </part>
- </software>
-
- <software name="blzpdls">
- <description>Blazing Paddles (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2014-08-20"/>
- <info name="usage" value="Works with Apple II Mouse Card in slot 4: -sl4 mouse" />
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="blazing paddles (4am crack).dsk" size="143360" crc="db4aa57d" sha1="152cc04080e100822bf919879232d175c64e9610" />
- </dataarea>
- </part>
- </software>
-
- <software name="bmblgmes">
- <description>Bumble Games (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bumble games (4am crack).dsk" size="143360" crc="0a7eb17b" sha1="9e8fcc6b51003311510165e2ec80b4a9099cb8e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="bounce">
- <description>Bounce (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-03-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bounce (4am crack).dsk" size="143360" crc="c112a513" sha1="a991ab2abbac0ee2490ce6b0f0b29d6e1b04d120" />
- </dataarea>
- </part>
- </software>
-
<software name="btime">
<description>BurgerTime (cleanly cracked)</description>
<year>1982</year>
@@ -885,167 +446,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bzone">
- <description>Battlezone (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battlezone (4am crack).dsk" size="143360" crc="2678f9d7" sha1="7909815721d8a885e1052e6e4023059101ff27b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="calgames">
- <description>California Games (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-08-20"/>
- <!-- On Aug 29th 2021, 4AM recracked "California Games" from
- the original disks to fix previously undetected data corruption
- in disk 2. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="california games (4am crack) side a.dsk" size="143360" crc="284f014d" sha1="97a5a792a936e13131ae37c3bdd32369d1eea8c0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="california games (4am crack) side b.dsk" size="143360" crc="9e2d3164" sha1="4e47f5e088936218c9d5d627b6a0deecd3cec652" />
- </dataarea>
- </part>
- </software>
-
- <software name="calskils">
- <description>Calendar Skills (version 08.31.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware, Inc.</publisher>
- <info name="release" value="2014-12-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="calendar skills (4am crack).dsk" size="143360" crc="0a607950" sha1="15b8a8a76d0e00003a8ba222add1d80fc0f06d23" />
- </dataarea>
- </part>
- </software>
-
- <software name="casegtr">
- <description>Case of the Great Train Robbery: Fact and Opinion (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="case of the great train robbery (4am crack).dsk" size="143360" crc="794cb785" sha1="ddfc5c5c859132efd6fd6436cec44d30e26165b5" />
- </dataarea>
- </part>
- </software>
-
- <software name="centiped">
- <description>Centipede (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="centipede (atari) (4am crack).dsk" size="143360" crc="6ed28f00" sha1="51e06dd3727148b5a2f809f2a46bd9e0281b3869" />
- </dataarea>
- </part>
- </software>
-
- <software name="chalmath">
- <description>Challenge Math (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="challenge math (4am crack).dsk" size="143360" crc="13ca32af" sha1="77fd54dfe5bc0b3775c43d38540a3f3366d25c24" />
- </dataarea>
- </part>
- </software>
-
- <software name="chbr123">
- <description>Charlie Brown's 1-2-3s (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Random House</publisher>
- <info name="release" value="2015-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="charlie brown's 1-2-3s (4am crack) side a.dsk" size="143360" crc="22ff5067" sha1="5b09390b3c438284f9ea534ee755fe57899dabc4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="charlie brown's 1-2-3s (4am crack) side b.dsk" size="143360" crc="7ea28429" sha1="5d5f985d2fc3d899f1a6b6cf16448c387a677c41" />
- </dataarea>
- </part>
- </software>
-
- <software name="chbrabc">
- <description>Charlie Brown's ABCs (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Random House</publisher>
- <info name="release" value="2015-02-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="charlie brown's abc's (4am crack) side a.dsk" size="143360" crc="d727b6f6" sha1="1af44fa21e611564ab3929aec753cc4e160d8b80" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="charlie brown's abc's (4am crack) side b.dsk" size="143360" crc="5bb8d11e" sha1="d394b12ad488c50e69c07367c7bd55b07d3aed6d" />
- </dataarea>
- </part>
- </software>
-
- <software name="chldrnr">
- <description>Championship Lode Runner (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2015-03-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="championship lode runner (4am crack).dsk" size="143360" crc="c950c3b1" sha1="67035e6a4960ce764d216ab265b0f887ec053f67" />
- </dataarea>
- </part>
- </software>
-
- <software name="chwrest">
- <description>Championship Wrestling (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2015-03-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="championship wrestling (4am crack) side a.dsk" size="143360" crc="9b562e29" sha1="8b7ff536b52238ea0ee048d0ef98c72c159b1a54" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="championship wrestling (4am crack) side b.dsk" size="143360" crc="5e513adf" sha1="76946879b72976b6477a0ffa68c8a9a677c3550b" />
- </dataarea>
- </part>
- </software>
-
<software name="clabcalc">
<description>Computer Laboratory for Calculus (cleanly cracked)</description>
<year>1985</year>
@@ -1072,47 +472,6 @@ license:CC0-1.0
</part>
</software>
- <software name="colorme">
- <description>Color Me (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-08-19"/>
- <info name="usage" value="Side B of Tink! Tonk! remains missing." />
- <!-- Missing: Tink! Tonk! side B needs to be redumped as the existing
- image is a duplicate of Hugga Bunch side A. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Program Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="colorme (4am crack).dsk" size="143360" crc="668c0c95" sha1="b5056d99267615a564a2d49c76b09c1a6e10a0d8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Picture Disk - Hugga Bunch - Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="colorme (4am crack) picture disk - hugga bunch - side a.dsk" size="143360" crc="6afeb028" sha1="206788a5ad07b1d7e7d5dabe936d4bb1c1608a2b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Picture Disk - Hugga Bunch - Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="colorme (4am crack) picture disk - hugga bunch - side b.dsk" size="143360" crc="227c37ce" sha1="18e1f544389770a6a74d97c585e2a7e6a8a5674c" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Picture Disk - Tink Tonk - Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="colorme (4am crack) picture disk - tink tonk - side a.dsk" size="143360" crc="8444dd7f" sha1="14cb015848ec215f928484db6bc5d9abb4693c56" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Picture Disk - Tink Tonk - Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="colorme (4am crack) picture disk - tink tonk - side b.dsk" size="143360" status="nodump" />
- </dataarea>
- </part>
- </software>
-
<software name="commando">
<description>Commando (cleanly cracked)</description>
<year>1987</year>
@@ -1179,26 +538,6 @@ license:CC0-1.0
</part>
</software>
- <software name="creation">
- <description>Creation (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2015-04-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="creation (4am crack) side a.dsk" size="143360" crc="24686294" sha1="f103a1bb993cfe484baccc0b2fd51d569c5429b8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="creation (4am crack) side b.dsk" size="143360" crc="52b81661" sha1="435881b4f3f75fc7317fbccf10690c653c9cade1" />
- </dataarea>
- </part>
- </software>
-
<software name="crumbetr">
<description>Crumb Eater (cleanly cracked)</description>
<year>1983</year>
@@ -1225,19 +564,6 @@ license:CC0-1.0
</part>
</software>
- <software name="deathswd">
- <description>Death Sword (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-05-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="deathsword (4am crack).dsk" size="143360" crc="a728ed2b" sha1="6b8eb1a4658a38cb95f10f627d34e7d03c843550" />
- </dataarea>
- </part>
- </software>
-
<software name="decimals">
<description>Decimals (version 3.0) (cleanly cracked)</description>
<year>1982</year>
@@ -1251,84 +577,6 @@ license:CC0-1.0
</part>
</software>
- <software name="defender">
- <description>Defender (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="defender (atari) (4am crack).dsk" size="143360" crc="eb9aec1b" sha1="0c5298ab6459bb966c7147157206c660fd8b6a7e" />
- </dataarea>
- </part>
- </software>
-
- <software name="digduga">
- <description>Dig Dug (Atarisoft) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dig dug (4am crack).dsk" size="143360" crc="99539f27" sha1="83bf4ae29434cc2da72f8aba34bdff8bdcdfbe92" />
- </dataarea>
- </part>
- </software>
-
- <software name="digdug">
- <description>Dig Dug (Thunder Mountain) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2015-05-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dig dug (thunder mountain) (4am crack).dsk" size="143360" crc="c3222178" sha1="959cfb565cff98eebea13de5c8ac6342d9ce04b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="dinoeggs">
- <description>Dino Eggs (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Micro Fun</publisher>
- <info name="release" value="2014-03-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dino eggs (4am crack).dsk" size="143360" crc="f5778567" sha1="a85a4a7997ba99c4fe1abae3b1e9480830ebedf9" />
- </dataarea>
- </part>
- </software>
-
- <software name="divebmbr">
- <description>Dive Bomber (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2015-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dive bomber (4am crack).dsk" size="143360" crc="fc854511" sha1="a99c822380d41ddfde8d35b290d47aa241528b44" />
- </dataarea>
- </part>
- </software>
-
- <software name="dkong">
- <description>Donkey Kong (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="donkey kong (4am crack).dsk" size="143360" crc="a6e8f2ce" sha1="7e18fd14bcf2a6f380533c6c7552c10c793c768d" />
- </dataarea>
- </part>
- </software>
-
<software name="dyohachd">
<description>Design Your Own Home: Architectural Design (cleanly cracked)</description>
<year>1984</year>
@@ -1446,32 +694,6 @@ license:CC0-1.0
</part>
</software>
- <software name="expsctmp">
- <description>Exploring Science: Temperature (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-11-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="exploring science - temperature (4am crack).dsk" size="143360" crc="616c17ea" sha1="dc3fd5d610265b88c840c5859f42b15a09720ed3" />
- </dataarea>
- </part>
- </software>
-
- <software name="1stdegle">
- <description>First Degree Linear Equations (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-11-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="first degree linear equations (4am crack).dsk" size="143360" crc="bc9f6657" sha1="8ecb52e40aaa9b2888d7c3c10d6dc80ef265309b" />
- </dataarea>
- </part>
- </software>
-
<software name="fantlrd">
<description>Professor Davensteev's Fantasy Land (Red Level) (cleanly cracked)</description>
<year>1983</year>
@@ -1498,19 +720,6 @@ license:CC0-1.0
</part>
</software>
- <software name="fctalgex">
- <description>Factoring Algebraic Expressions (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-11-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="factoring algebraic expressions (4am crack).dsk" size="143360" crc="3b6386ab" sha1="2b691e14b3b72a8b05e09045dc569847685e32d5" />
- </dataarea>
- </part>
- </software>
-
<software name="finfacts">
<description>Financial Facts (cleanly cracked)</description>
<year>1981</year>
@@ -1524,19 +733,6 @@ license:CC0-1.0
</part>
</software>
- <software name="flshsphc">
- <description>Flash Spell Helicopter (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Microcomputer Workships Courseware</publisher>
- <info name="release" value="2015-03-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="flash spell helicopter (4am crack).dsk" size="143360" crc="503ec206" sha1="89b39a4a31ddffcd4c2c0373906c2eef45e09f0a" />
- </dataarea>
- </part>
- </software>
-
<software name="flycolor">
<description>Flying Colors (cleanly cracked)</description>
<year>1983</year>
@@ -1550,39 +746,6 @@ license:CC0-1.0
</part>
</software>
- <software name="forcemtn">
- <description>Force and Motion (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Queue, Inc.</publisher>
- <info name="release" value="2015-03-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="force and motion (4am crack) disk 1.dsk" size="143360" crc="a338ba73" sha1="4ddb1788cd67f4f85ebbac4995f9817a1334f6cf" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="force and motion (4am crack) disk 2.dsk" size="143360" crc="4a1e54f2" sha1="8a1863172a8e782425b14c3f09995e9dfb444024" />
- </dataarea>
- </part>
- </software>
-
- <software name="fornext">
- <description>FOR Your NEXT Adventure: FOR-NEXT Loops (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-04-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="for your next adventure (4am crack).dsk" size="143360" crc="f93a7783" sha1="6179cde57a15ee564be7da68b410d89a4dd26dc8" />
- </dataarea>
- </part>
- </software>
-
<software name="frctns2">
<description>Fractions II: Addition, Subtraction, Multiplication, and Division (cleanly cracked)</description>
<year>1987</year>
@@ -1629,32 +792,6 @@ license:CC0-1.0
</part>
</software>
- <software name="frogdog">
- <description>Frogs, Dogs, Kittens, and Kids 1 (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="frogs, dogs, kittens, and kids 1 (4am crack) disk 1.dsk" size="143360" crc="ab28d4d3" sha1="4d2644e78bb8ef4d6df9ae808861c9c5e5e91a5e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="frogs, dogs, kittens, and kids 1 (4am crack) disk 2.dsk" size="143360" crc="6e24da32" sha1="4076f55cb2563df30b2c4f75a9bece77e54cffd6" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="frogs, dogs, kittens, and kids 1 (4am crack) disk 3.dsk" size="143360" crc="c156dc96" sha1="9965dc051410c7c8b907550dd4b65bbdca07b331" />
- </dataarea>
- </part>
- </software>
-
<software name="frogger2">
<description>Frogger II: Threedeep (cleanly cracked)</description>
<year>1984</year>
@@ -1668,45 +805,6 @@ license:CC0-1.0
</part>
</software>
- <software name="frogger">
- <description>Frogger (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2015-03-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="frogger (4am crack).dsk" size="143360" crc="2f85b867" sha1="8e0c597e4f51657874dd72da47e7ec8686c17abc" />
- </dataarea>
- </part>
- </software>
-
- <software name="galaxat">
- <description>Galaxian (Atarisoft) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="galaxian (atari) (4am crack).dsk" size="143360" crc="b2087527" sha1="06da74bcbe71432bd541ba310a5bde1b72b84dda" />
- </dataarea>
- </part>
- </software>
-
- <software name="galaxian">
- <description>Galaxian (Thunder Mountain) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2015-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="galaxian (thunder mountain) (4am crack).dsk" size="143360" crc="6b23c74a" sha1="3ff5a0d74d193b194ea5b0ddf761034736e18ac6" />
- </dataarea>
- </part>
- </software>
-
<software name="garfleyw">
<description>Garfield Eat Your Words (cleanly cracked)</description>
<year>1985</year>
@@ -1740,61 +838,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gertrude">
- <description>Gertrude's Secrets (version 1.2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2014-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's secrets (4am crack).dsk" size="143360" crc="a8602d95" sha1="281f09574ca6be91f52182da51429487de6c770d" />
- </dataarea>
- </part>
- </software>
-
- <software name="gramgrem">
- <description>Grammar Gremlins (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Davidson &amp; Associates, Inc.</publisher>
- <info name="release" value="2015-04-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="grammar gremlins (4am crack) side a.dsk" size="143360" crc="6c8489fa" sha1="38428a2f090900660fa4ff581e770004b71ad801" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="grammar gremlins (4am crack) side b.dsk" size="143360" crc="b07ee7b3" sha1="0c4171e8a85bd5627a8c3a25da4c29cc68c2038b" />
- </dataarea>
- </part>
- </software>
-
- <software name="gramgr87">
- <description>Grammar Gremlins (1987) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates, Inc.</publisher>
- <info name="release" value="2019-05-10"/>
- <!-- On May 10th, 2019, updated disk image from new source to fix some
- minor data corruption on side A, track $1C -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="grammar gremlins 1987 (4am crack) side a.dsk" size="143360" crc="31adc94a" sha1="40527334a0d59281b6559f2464018fae8fc807ac" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="grammar gremlins 1987 (4am crack) side b.dsk" size="143360" crc="21e242be" sha1="1f922b9c30bea0d4a9e2bdbdb66d67da8bd361f8" />
- </dataarea>
- </part>
- </software>
-
<software name="grammst2">
<description>Grammar Mastery II (cleanly cracked)</description>
<year>1987</year>
@@ -1905,32 +948,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gremlins">
- <description>Gremlins (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gremlins (4am crack).dsk" size="143360" crc="72059242" sha1="02f4609e5d795e2cfa1cf4ebb55f32f698169f1b" />
- </dataarea>
- </part>
- </software>
-
- <software name="grphlnfc">
- <description>Graphing Linear Functions (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops Courseware</publisher>
- <info name="release" value="2014-04-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="graphing linear functions (4am crack).dsk" size="143360" crc="c47060a2" sha1="9f634221a056f569829cf1f1e32423815864a000" />
- </dataarea>
- </part>
- </software>
-
<software name="gulfstrk">
<description>Gulf Strike (cleanly cracked)</description>
<year>1985</year>
@@ -1944,20 +961,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gumball">
- <description>Gumball (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2016-06-08"/>
- <!-- Corrected image September 24th, 2016 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gumball (4am &amp; san inc crack).dsk" size="143360" crc="ca1dde79" sha1="76bf52bf011442f01414976d706514ef21999354" />
- </dataarea>
- </part>
- </software>
-
<software name="heredog">
<description>Heredity Dog (cleanly cracked)</description>
<year>1983</year>
@@ -1971,26 +974,6 @@ license:CC0-1.0
</part>
</software>
- <software name="homewrtr">
- <description>Homework Writer (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-01-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="homework writer (4am crack) side a.dsk" size="143360" crc="9f679792" sha1="b4a8db1ec71e52049f5f06f51cc4587b2022c4e3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="homework writer (4am crack) side b.dsk" size="143360" crc="aeb2abe1" sha1="786f32a81eada81297f0c93c5525bdede2a7ffbe" />
- </dataarea>
- </part>
- </software>
-
<software name="housefir">
<description>House-A-Fire! (cleanly cracked)</description>
<year>1988</year>
@@ -2011,39 +994,6 @@ license:CC0-1.0
</part>
</software>
- <software name="howwest">
- <description>How The West Was One + Three x Four (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-05-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="how the west was one + three x four (4am crack).dsk" size="143360" crc="590f6a8b" sha1="2b7972b3700fb4f8aad2578647ec3bab81bc29a5" />
- </dataarea>
- </part>
- </software>
-
- <software name="impmiss2">
- <description>Impossible Mission II (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-09-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="impossible mission ii (4am crack) side a.dsk" size="143360" crc="a219d468" sha1="98a1aa883ad0a46ee30f043d431138ec4382d205" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="impossible mission ii (4am crack) side b.dsk" size="143360" crc="7968cf85" sha1="b4853d27a3b3aee986f4c4ea5b8f908a9423c782" />
- </dataarea>
- </part>
- </software>
-
<software name="invscmth">
<description>Investigating Secondary Mathematics with Computers (cleanly cracked)</description>
<year>1985</year>
@@ -2074,59 +1024,15 @@ license:CC0-1.0
<info name="release" value="2014-08-19"/>
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="jack and the beanstalk (4am crack) side a.dsk" size="143360" crc="cb5e3608" sha1="1149edac8268b2da7c903710300ca8dbcb17bf96" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="jack and the beanstalk (4am crack) side b.dsk" size="143360" crc="e5a6aa47" sha1="5cbbb059730dc49348a4f012f2890545f38522ff" />
- </dataarea>
- </part>
- </software>
-
- <software name="jmpmthfl">
- <description>Jumping Math Flash (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-04-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="jumping math flash (4am crack).dsk" size="143360" crc="0448adab" sha1="20f73a8ee2fa305d3d9403d3915c319fe60bdbdc" />
- </dataarea>
- </part>
- </software>
-
- <software name="jumpman">
- <description>Jumpman (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-09-15"/>
-
- <part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
- <rom name="jumpman (4am crack) side a.dsk" size="143360" crc="4f291aa3" sha1="1c43eac018c0a04e70177cf413d7b20b4eaa3a89" />
+ <rom name="jack and the beanstalk (4am crack) side a.dsk" size="143360" crc="cb5e3608" sha1="1149edac8268b2da7c903710300ca8dbcb17bf96" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
- <rom name="jumpman (4am crack) side b.dsk" size="143360" crc="90312d4c" sha1="0ba7c41afbb31c93e4dc602da12cf577876dbc2c" />
- </dataarea>
- </part>
- </software>
-
- <software name="junghunt">
- <description>Jungle Hunt (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Atarisoft</publisher>
- <info name="release" value="2015-03-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="jungle hunt (4am crack).dsk" size="143360" crc="81b074fd" sha1="939e07e5aa2a0cd3792fa50f52c868657e35bb6b" />
+ <rom name="jack and the beanstalk (4am crack) side b.dsk" size="143360" crc="e5a6aa47" sha1="5cbbb059730dc49348a4f012f2890545f38522ff" />
</dataarea>
</part>
</software>
@@ -2157,58 +1063,6 @@ license:CC0-1.0
</part>
</software>
- <software name="viewkill">
- <description>James Bond 007 in: A View to a Kill (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="james bond 007 in a view to a kill (4am crack).dsk" size="143360" crc="578c98cb" sha1="60fbf677d59b7a61d1f9d14deed1d0a50ccf9a92" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrnktime">
- <description>A Newbery Adventure - A Wrinkle in Time (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-03-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="a newbery adventure - a wrinkle in time (4am crack).dsk" size="143360" crc="76275127" sha1="8134d7e6c74917c1ab16abe33005b55eb0d53e25" />
- </dataarea>
- </part>
- </software>
-
- <software name="adjectiv">
- <description>Adjectives (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="adjectives (4am crack).dsk" size="143360" crc="a7bcb572" sha1="9fb33b14557dd5d0bd8ccd5a691a5e2f7b2f125b" />
- </dataarea>
- </part>
- </software>
-
- <software name="adjct062984">
- <description>Adjectives (version 06.29.84) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-12-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="adjectives 06.29.84 (4am crack).dsk" size="143360" crc="ae4afb02" sha1="d78d91b0d4d3d11d098721470ed504ca978561c6" />
- </dataarea>
- </part>
- </software>
-
<software name="agendafl">
<description>Agenda Files (cleanly cracked)</description>
<year>1981</year>
@@ -2242,11 +1096,13 @@ license:CC0-1.0
<info name="release" value="2017-07-12"/>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="air raid pearl harbor (4am crack) side a.dsk" size="143360" crc="0b595d0e" sha1="0d37d9fc5e87aab354c49c789edca117a100f30e" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="air raid pearl harbor (4am crack) side b.dsk" size="143360" crc="3c761ff7" sha1="99edd40be58e355390bd2b51df6ffb282689ba62" />
</dataarea>
@@ -2334,25 +1190,12 @@ license:CC0-1.0
</part>
</software>
- <software name="eaalibab">
- <description>Ali Baba and the Forty Thieves (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ali baba and the forty thieves (4am and san inc crack).dsk" size="143360" crc="85829ce0" sha1="ef4868fee81fc6d2b7c75ed100d5569c6c3c187d" />
- </dataarea>
- </part>
- </software>
-
<software name="aliclogo">
<description>Alice in LogoLand (cleanly cracked)</description>
<year>1982</year>
<publisher>Krell Software</publisher>
<info name="release" value="2014-08-20"/>
- <!--"Alice in Logoland" is a disk of sample Logo programs that was
+ <!-- "Alice in Logoland" is a disk of sample Logo programs that was
bundled with Krell's Logo, distributed by Krell Software. -->
<part name="flop1" interface="floppy_5_25">
@@ -2362,44 +1205,6 @@ license:CC0-1.0
</part>
</software>
- <software name="alcwndrlr2">
- <description>Alice in Wonderland rev. 2 (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="alice in wonderland rev. 2 (4am crack) side a.dsk" size="143360" crc="e9a946e8" sha1="1d23a33c504df204af50d32093010c41f15d8cdc" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="alice in wonderland rev. 2 (4am crack) side b.dsk" size="143360" crc="f249da10" sha1="9ec87f245a6ad0a0414f0b5b1a9c66da94719db0" />
- </dataarea>
- </part>
- </software>
-
- <software name="algeblst">
- <description>Alge-Blaster (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2016-12-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="alge-blaster (4am crack) side a.dsk" size="143360" crc="6281add0" sha1="ee14ba87d154b8892406b76b28df07153e94b012" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="alge-blaster (4am crack) side b.dsk" size="143360" crc="df699a73" sha1="35835eb83a959ef0ba8b63683b3f674f3955d0aa" />
- </dataarea>
- </part>
- </software>
-
<software name="trhuntft">
<description>A Treasure Hunt of Facts (version 84-02) (cleanly cracked)</description>
<year>1984</year>
@@ -2432,16 +1237,19 @@ license:CC0-1.0
in the previous version not working on some machines. -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
<dataarea name="flop" size="143360">
<rom name="all about america (4am crack) - disk 1a - story disk.dsk" size="143360" crc="0bbbe3b9" sha1="a0e81016f97b414752140ea967c94180ace28ca8" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
<dataarea name="flop" size="143360">
<rom name="all about america (4am crack) - disk 1b - questions and answers.dsk" size="143360" crc="29a58302" sha1="42249ed8018708f51e758c579b22d5c480907e63" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
<dataarea name="flop" size="143360">
<rom name="all about america (4am crack) - disk 2a - maps and quizzes.dsk" size="143360" crc="93b110dd" sha1="75e378b79110c4d45a6c7774b04e98ae2aa87f7c" />
</dataarea>
@@ -2461,16 +1269,19 @@ license:CC0-1.0
documentation purposes. -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
<dataarea name="flop" size="143360">
<rom name="all about america (imperfect 4am crack) - disk 1a - story disk.dsk" size="143360" crc="5bb77698" sha1="d3ca0e38606c545d0d119242f92032268bdede62" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
<dataarea name="flop" size="143360">
<rom name="all about america (imperfect 4am crack) - disk 1b - questions and answers.dsk" size="143360" crc="29a58302" sha1="42249ed8018708f51e758c579b22d5c480907e63" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
<dataarea name="flop" size="143360">
<rom name="all about america (imperfect 4am crack) - disk 2a - maps and quizzes.dsk" size="143360" crc="93b110dd" sha1="75e378b79110c4d45a6c7774b04e98ae2aa87f7c" />
</dataarea>
@@ -2506,19 +1317,6 @@ license:CC0-1.0
</part>
</software>
- <software name="algncroc">
- <description>Alligators and Crocodiles (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-06-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="alligators and crocodiles (4am crack).dsk" size="143360" crc="9912e92c" sha1="5bd30ca5f6ddaca8df5567d6462c769c71080772" />
- </dataarea>
- </part>
- </software>
-
<software name="alphbsts">
<description>Alphabet Beasts and Company (cleanly cracked)</description>
<year>1983</year>
@@ -2558,19 +1356,6 @@ license:CC0-1.0
</part>
</software>
- <software name="alphseq">
- <description>Alphabetization Sequence (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="alphabetization sequence (4am crack).dsk" size="143360" crc="fa88a171" sha1="fbb98ef8dd1cea5fa94b238ee4e7e5b5ca59f774" />
- </dataarea>
- </part>
- </software>
-
<software name="alphblue">
<description>Alphabetizing - Blue Level (cleanly cracked)</description>
<year>1983</year>
@@ -2585,7 +1370,7 @@ license:CC0-1.0
</software>
<software name="altregof">
- <description>Alter Ego (female version) (cleanly cracked)</description>
+ <description>Alter Ego (female version, cleanly cracked)</description>
<year>1986</year>
<publisher>Activision</publisher>
<info name="release" value="2018-01-17"/>
@@ -2629,7 +1414,7 @@ license:CC0-1.0
</software>
<software name="alterego">
- <description>Alter Ego (male version) (cleanly cracked)</description>
+ <description>Alter Ego (male version, cleanly cracked)</description>
<year>1985</year>
<publisher>Activision</publisher>
<info name="release" value="2017-01-28"/>
@@ -2672,62 +1457,18 @@ license:CC0-1.0
</part>
</software>
- <software name="americ2c">
- <description>America Coast to Coast (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2017-05-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="america coast to coast (4am crack).dsk" size="143360" crc="005e3a68" sha1="17a70b6908fbbe38dedc5a54ce2490643b7c41fa" />
- </dataarea>
- </part>
- </software>
-
- <software name="ahistac4">
- <description>American History Achievement IV: World War II - Present (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2016-12-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="american history achievement iv - world war ii - present (4am crack).dsk" size="143360" crc="e53068bf" sha1="89b0e0a99726e4ec63d646a89a3edbb693883a38" />
- </dataarea>
- </part>
- </software>
-
- <software name="analotut">
- <description>Analogies Tutorial (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-09-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="analogies tutorial (4am crack) disk 1.dsk" size="143360" crc="f2d040aa" sha1="04091d08bb34a915f6da1e638fa3aedba5f4c635" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="analogies tutorial (4am crack) disk 2.dsk" size="143360" crc="d437c9d8" sha1="08c3fa26acc6046eeab2aa4ccf2c8163e9fef257" />
- </dataarea>
- </part>
- </software>
-
<software name="ancleg">
<description>Ancient Legends (cleanly cracked)</description>
<year>2016</year>
<publisher>No Publisher</publisher>
<info name="release" value="2016-09-08"/>
- <!--"Ancient Legends" is a 2016 roleplaying adventure game by
+ <!-- "Ancient Legends" is a 2016 role-playing adventure game by
Seth Sternberger, Martin Haye, Brendan Robert, Dave Schmenk, and
Andrew Hogan. This is version 1.0, released at Kansasfest 2016.
Only five physical copies of this version were ever produced. Updated
versions and source code can be found at
https://github.com/badvision/lawless-legends/tree/master/Example%20Content/Ancient%20Legends
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
@@ -2743,132 +1484,6 @@ license:CC0-1.0
</part>
</software>
- <software name="anihomesas">
- <description>Animal Homes and Stories (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-02-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="animal homes and stories (4am crack).dsk" size="143360" crc="d2459e64" sha1="eabb18e5b30fcdbbc3d5125f2244c9d800c8c9d9" />
- </dataarea>
- </part>
- </software>
-
- <software name="anihotel">
- <description>Animal Hotel (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2017-03-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="animal hotel (4am crack).dsk" size="143360" crc="1a3ebd0a" sha1="06e87b90198feefe446e66a86bb154758bd34c3a" />
- </dataarea>
- </part>
- </software>
-
- <software name="anisurvecho">
- <description>Animal Survival for Echo Voice System (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="animal survival for echo voice system (4am crack).dsk" size="143360" crc="30a307c2" sha1="f54a31561dbb5d4b192c9a3eeebbbf76113bda61" />
- </dataarea>
- </part>
- </software>
-
- <software name="anisurvufonic">
- <description>Animal Survival for Ufonic Voice System (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-04-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="animal survival for ufonic voice system (4am crack).dsk" size="143360" crc="d0c777e6" sha1="e88f5b99d3263ea53f40a084d557829e06d3f272" />
- </dataarea>
- </part>
- </software>
-
- <software name="animate">
- <description>Animate (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-06-28"/>
- <!-- "Animate" is a 1986 graphics program created by Steven Ohmert and distributed by Broderbund Software. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (4am crack) disk 1.dsk" size="143360" crc="4b89c917" sha1="46a77dfe78c3516362666699542433293aa03260" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (4am crack) disk 2.dsk" size="143360" crc="c16d5674" sha1="b4b4f800338b0c87fab7c8df5fba53decc396cfe" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Character Library"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (4am crack) disk 3 - character library.dsk" size="143360" crc="6491c465" sha1="403b8534858b9cb74564ea5832e5b72cd055b846" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Background Library"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (4am crack) disk 4 - background library.dsk" size="143360" crc="e32a2cd4" sha1="d469e03996f33e2bbe237993e1cb29652e4bd5a2" />
- </dataarea>
- </part>
- </software>
-
- <software name="animateb" cloneof="animate">
- <description>Animate (imperfect clean crack)</description>
- <year>1986</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-06-28"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (imperfect 4am crack) disk 1.dsk" size="143360" crc="ad7eb4c2" sha1="034ac6879ae76c2b26b674718f002ad8eb754b6b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (imperfect 4am crack) disk 2.dsk" size="143360" crc="279a2ba1" sha1="86c74c50ac197ac4aed10ab67cd0c2aae4ba9bec" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Character Library"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (imperfect 4am crack) disk 3 - character library.dsk" size="143360" crc="6491c465" sha1="403b8534858b9cb74564ea5832e5b72cd055b846" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Background Library"/>
- <dataarea name="flop" size="143360">
- <rom name="animate (imperfect 4am crack) disk 4 - background library.dsk" size="143360" crc="e32a2cd4" sha1="d469e03996f33e2bbe237993e1cb29652e4bd5a2" />
- </dataarea>
- </part>
- </software>
-
<software name="ankh">
<description>Ankh (cleanly cracked)</description>
<year>1983</year>
@@ -2902,32 +1517,6 @@ license:CC0-1.0
</part>
</software>
- <software name="antsyn1">
- <description>Antonyms/Synonyms 1 (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="antonyms-synonyms 1 (4am crack).dsk" size="143360" crc="da8ccd2d" sha1="fbcb6ed003652a74ef22603fbc1c5934b8722c59" />
- </dataarea>
- </part>
- </software>
-
- <software name="antsyn2v587">
- <description>Antonyms/Synonyms 2 v05.25.87 (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="antonyms-synonyms 2 v05.25.87 (4am crack).dsk" size="143360" crc="7f73b233" sha1="91ed0961daed6c02b47cdd4ea3c1c952366a9877" />
- </dataarea>
- </part>
- </software>
-
<software name="aphasia1">
<description>Aphasia I (cleanly cracked)</description>
<year>1983</year>
@@ -2980,21 +1569,8 @@ license:CC0-1.0
</part>
</software>
- <software name="aplcdspd">
- <description>Apple Cider Spider (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="apple cider spider (4am crack).dsk" size="143360" crc="55fe5386" sha1="b72cc7e52dfce29df0e6bd95dbdba79203edc850" />
- </dataarea>
- </part>
- </software>
-
<software name="a2tstdsk">
- <description>Apple II Test Disk (cleanly cracked)</description>
+ <description>Apple ][ Test Disk (cleanly cracked)</description>
<year>1983</year>
<publisher>Shawnee Mission Unified School District</publisher>
<info name="release" value="2017-09-17"/>
@@ -3022,71 +1598,6 @@ license:CC0-1.0
</part>
</software>
- <software name="apvatlan">
- <description>Apventure to Atlantis (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2017-07-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="apventure to atlantis (4am crack).dsk" size="143360" crc="6234256c" sha1="96e6ad0e0507f9d1b903e8afe184f6b6aa572848" />
- </dataarea>
- </part>
- </software>
-
- <software name="aquatron">
- <description>Aquatron (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="aquatron (4am crack).dsk" size="143360" crc="104e87d8" sha1="0ed3e1ec30a2712356c7d504d38605d810f4e83c" />
- </dataarea>
- </part>
- </software>
-
- <software name="arcbootc">
- <description>Arcade Boot Camp (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-09-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="arcade boot camp (4am crack).dsk" size="143360" crc="07d556c3" sha1="e0a12dc797f5f358b5222f3753efdfc655a134e1" />
- </dataarea>
- </part>
- </software>
-
- <software name="archon">
- <description>Archon (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="archon (4am and san inc crack).dsk" size="143360" crc="10d510bf" sha1="7b21537ae9b795a048f11fbc68ed3439a4f55ccf" />
- </dataarea>
- </part>
- </software>
-
- <software name="archon2">
- <description>Archon II - Adept (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="archon ii - adept (4am and san inc crack).dsk" size="143360" crc="7fc59edf" sha1="1eb8d39fe5887749b0a08bd1f9ab5f1f9b1ccde2" />
- </dataarea>
- </part>
- </software>
-
<software name="asatprep">
<description>ARCO Computer Preparation for the SAT (cleanly cracked)</description>
<year>1984</year>
@@ -3146,19 +1657,6 @@ license:CC0-1.0
</part>
</software>
- <software name="arctfox">
- <description>Arcticfox (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="arcticfox (4am and san inc crack).dsk" size="143360" crc="d62e1aac" sha1="ed918010e0cf79373e3f4a7b8036a9fb3a6b7e13" />
- </dataarea>
- </part>
- </software>
-
<software name="ardyardv">
<description>Ardy the Aardvark (cleanly cracked)</description>
<year>1983</year>
@@ -3224,37 +1722,6 @@ license:CC0-1.0
</part>
</software>
- <software name="autoduel">
- <description>Autoduel (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Origin Software</publisher>
- <info name="release" value="2016-12-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="autoduel (4am crack) side a.dsk" size="143360" crc="350c4b8a" sha1="5db8161849c9a9a62c4ddc32f7f861e0dfab3677" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="autoduel (4am crack) side b.dsk" size="143360" crc="2b3bc3f2" sha1="71526cb681ee837408a187c7a38bc2e681657ebd" />
- </dataarea>
- </part>
- </software>
-
- <software name="axisassn">
- <description>Axis Assassin (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="axis assassin (4am and san inc crack).dsk" size="143360" crc="cf88fcce" sha1="b68477e6dad6235e767cf06a55cc00de797e5ea6" />
- </dataarea>
- </part>
- </software>
-
<software name="backtime">
<description>Back in Time (cleanly cracked)</description>
<year>1984</year>
@@ -3312,183 +1779,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bsstoryb">
- <description>Bank Street StoryBook (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2015-07-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street storybook (4am crack) side a.dsk" size="143360" crc="152bc072" sha1="c2ae39f44ef1fabe6dc6c9fbfe65a6a20376d2e0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street storybook (4am crack) side b.dsk" size="143360" crc="0b2b3b94" sha1="dfe929080798f5485fba63aeb361f4740cfcc340" />
- </dataarea>
- </part>
- </software>
-
- <software name="bsstoryb11">
- <description>Bank Street StoryBook (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2017-01-10"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street storybook 1.1 (4am crack) side a.dsk" size="143360" crc="afecb034" sha1="e6262712e05ca562b79c1c6d99973837d8d259ac" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street storybook 1.1 (4am crack) side b.dsk" size="143360" crc="edfd36dd" sha1="d9cd259e8652942ea3ab876805d01dbc565ad25c" />
- </dataarea>
- </part>
- </software>
-
- <software name="bsstoryb11b" cloneof="bsstoryb11">
- <description>Bank Street StoryBook 1.1 (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2017-01-10"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street storybook 1.1 (imperfect 4am crack) side a.dsk" size="143360" crc="ffe02515" sha1="c969465833554dca4d030aaaeca8e6c131dba727" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street storybook 1.1 (imperfect 4am crack) side b.dsk" size="143360" crc="bfc9ab7f" sha1="32eaf443c837bfdbe2ae1cfb020e7b04a48a8977" />
- </dataarea>
- </part>
- </software>
-
- <software name="bswriter2">
- <description>Bank Street Writer II (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-01-17"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street writer ii (4am crack) disk 1.dsk" size="143360" crc="6f5c9ced" sha1="07486f52eb8355494e72ed2fc4fcdfe8b3b13ed0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street writer ii (4am crack) disk 2.dsk" size="143360" crc="23adadb3" sha1="9cbd40664e6ad1da4134bf891ddf0e1e5d29bca9" />
- </dataarea>
- </part>
- </software>
-
- <software name="bswriter2b" cloneof="bswriter2">
- <description>Bank Street Writer II (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-01-17"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street writer ii (imperfect 4am crack) disk 1.dsk" size="143360" crc="2a23b716" sha1="5b69dbe5a41a87a61c9ca70f0d47d6ed555f4ef2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bank street writer ii (imperfect 4am crack) disk 2.dsk" size="143360" crc="23adadb3" sha1="9cbd40664e6ad1da4134bf891ddf0e1e5d29bca9" />
- </dataarea>
- </part>
- </software>
-
- <software name="bballalph">
- <description>Banner Books - All Along The Alphabet (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - all along the alphabet (4am crack) disk 1 - program.dsk" size="143360" crc="884d1c6e" sha1="2b6cb2a7537bb33cb92a0c7579970cfa84ba5282" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - all along the alphabet (4am crack) disk 2 - backgrounds.dsk" size="143360" crc="4557a716" sha1="3dfd5ba20bbab469979d8b4db99be1ceb50855bb" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - all along the alphabet (4am crack) disk 3 - clip art.dsk" size="143360" crc="e70b438d" sha1="795fe37d96181f310c22bed4481bd0122a07b0b3" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - all along the alphabet (4am crack) disk 4 - fonts and more clip art.dsk" size="143360" crc="fe83f19c" sha1="c8c42746382ef4946d376323877aca30a7d95ef8" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbyrscday">
- <description>Banner Books - Your School Day (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - your school day (4am crack) disk 1 - program.dsk" size="143360" crc="4ebf955a" sha1="5d12523d3f2bdd5e973459b4da0df2581b188a9a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - your school day (4am crack) disk 2 - backgrounds.dsk" size="143360" crc="12276401" sha1="eac0b8dc4e1a2de379e19628c161f42338be7a6f" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - your school day (4am crack) disk 3 - clip art.dsk" size="143360" crc="00d80ed0" sha1="4c09e1e49156645ce8999a7f8140f7be92d1062b" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="banner books - your school day (4am crack) disk 4 - fonts and more clip art.dsk" size="143360" crc="4c6e5790" sha1="d46ba374921645375c1c3382e2c73053f839a1eb" />
- </dataarea>
- </part>
- </software>
-
- <software name="bannerch">
- <description>Bannercatch (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-12-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bannercatch (4am crack).dsk" size="143360" crc="7db317c1" sha1="a61a47943d0c7b38a08f459812aa2dd26d401cd6" />
- </dataarea>
- </part>
- </software>
-
<software name="baron21">
<description>Baron (version 2.1) (cleanly cracked)</description>
<year>1985</year>
@@ -3496,11 +1786,13 @@ license:CC0-1.0
<info name="release" value="2015-12-27"/>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="baron 2.1 (4am crack) side a.dsk" size="143360" crc="121a83f8" sha1="11ddc8e6eb4ab01a738ac91ef3e501f4bde2354c" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="baron 2.1 (4am crack) side b.dsk" size="143360" crc="d6e2449c" sha1="5512a7736f600544ba4976d19281d72c899b5321" />
</dataarea>
@@ -3546,91 +1838,6 @@ license:CC0-1.0
</part>
</software>
- <software name="baselectron">
- <description>Basic Electronics: Atomic Theory (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - atomic theory (4am crack).dsk" size="143360" crc="fb97d56c" sha1="e9fc04b84376b4c47e9eedfcb438e6e6fae7d953" />
- </dataarea>
- </part>
- </software>
-
- <software name="baselectronfun">
- <description>Basic Electronics: Electronic Fundamentals (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - electronic fundamentals (4am crack).dsk" size="143360" crc="575773ae" sha1="07424601c6457cacb190f5ff4494b12b777d4310" />
- </dataarea>
- </part>
- </software>
-
- <software name="baselectronmath">
- <description>Basic Electronics: Electronic Math (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - electronic math (4am crack) disk 1.dsk" size="143360" crc="8ad3d213" sha1="ba0305c4d5fda1149af699a616fa80bc01223b37" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - electronic math (4am crack) disk 2.dsk" size="143360" crc="938881b1" sha1="0ab63120fde49a7427147dd2c4424e1f53ab382c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - electronic math (4am crack) disk 3.dsk" size="143360" crc="448ef725" sha1="81c9c6f3de904c7b6e3edcdefd29c1e172938031" />
- </dataarea>
- </part>
- </software>
-
- <software name="baselectronepsc">
- <description>Basic Electronics: Electronic Prefixes, Symbols, and Components (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - electronic prefixes, symbols, and components (4am crack).dsk" size="143360" crc="39e96e00" sha1="9bda85d68c124453ee864d9c6dbc966dcc42ee21" />
- </dataarea>
- </part>
- </software>
-
- <software name="belctrndc">
- <description>Basic Electronics: Fundamentals of DC Circuitry (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - fundamentals of dc circuitry (4am crack) disk 1.dsk" size="143360" crc="8846e62a" sha1="8409e5e8cb85e2e79609c481e7b3942151f26da3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - fundamentals of dc circuitry (4am crack) disk 2.dsk" size="143360" crc="efd88e20" sha1="7613f57ef6d0b06d3c76522363e6482bb27955cb" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="basic electronics - fundamentals of dc circuitry (4am crack) disk 3.dsk" size="143360" crc="8fd5f148" sha1="6a905e36719137702cf41746d4a213cb67dff357" />
- </dataarea>
- </part>
- </software>
-
<software name="basicmathdec">
<description>Basic Math Competency Skill Building: Decimals (cleanly cracked)</description>
<year>1984</year>
@@ -3690,110 +1897,19 @@ license:CC0-1.0
<info name="release" value="2016-03-24"/>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
<rom name="basic vocabulary builder - spanish (4am crack) disk 1.dsk" size="143360" crc="38ecd897" sha1="2c2a8dbbf1af6f2c6a729725912c76ac1d1a93df" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="143360">
<rom name="basic vocabulary builder - spanish (4am crack) disk 2.dsk" size="143360" crc="c9457bcd" sha1="35e10c624c0b5fc348f5082434c7267257f38ccd" />
</dataarea>
</part>
</software>
- <software name="battcmdr">
- <description>Battalion Commander (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battalion commander (4am and san inc crack).dsk" size="143360" crc="9bb6a4d2" sha1="f2bb31c76fd954bd384557dd249c06e75f3de6b7" />
- </dataarea>
- </part>
- </software>
-
- <software name="batlcrsr">
- <description>Battle Cruiser (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle cruiser (4am crack) side a.dsk" size="143360" crc="7ce792e8" sha1="f3b00a8f2be27228a16dafccfb26b0223a2d220c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle cruiser (4am crack) side b.dsk" size="143360" crc="8fe6c98c" sha1="3bc19b5abf445cb2362e747a898987ba627377e7" />
- </dataarea>
- </part>
- </software>
-
- <software name="batfrnrm">
- <description>Battle For Normandy (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle for normandy (4am and san inc crack).dsk" size="143360" crc="5be154db" sha1="f4ee84b0a54b64ad596814e87a6f502c1f494772" />
- </dataarea>
- </part>
- </software>
-
- <software name="batlgrp">
- <description>Battle Group (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle group (4am and san inc crack) side a.dsk" size="143360" crc="1650cf51" sha1="158a6d248004716fd962ae5e40dfa4f602dab533" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle group (4am and san inc crack) side b.dsk" size="143360" crc="f3505586" sha1="3b7818a1f76531421da36d2044c009452b4586a8" />
- </dataarea>
- </part>
- </software>
-
- <software name="batlantm15">
- <description>Battle of Antietam (version 1.5) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle of antietam v1.5 (4am crack) side a.dsk" size="143360" crc="bf0565ab" sha1="088489190e4db38a637176d5e944af6e8b8a8d73" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="battle of antietam v1.5 (4am crack) side b.dsk" size="143360" crc="9d406c7e" sha1="7b0fd2712180837f2277944a3ca708e83fc1f302" />
- </dataarea>
- </part>
- </software>
-
- <software name="bcqft">
- <description>BC's Quest For Tires (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2016-07-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bc's quest for tires (4am crack).dsk" size="143360" crc="02bcb008" sha1="9c84d81a2e493c5fb6a5b86949b42b901cd4ae50" />
- </dataarea>
- </part>
- </software>
-
<software name="behndwhl">
<description>Behind the Wheel, Blue Level (cleanly cracked)</description>
<year>1985</year>
@@ -3807,37 +1923,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bellhop">
- <description>Bellhop (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-10-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bellhop (4am crack).dsk" size="143360" crc="b5a5c914" sha1="fac8017d1810673c8cda26f2e342d30695dba29f" />
- </dataarea>
- </part>
- </software>
-
- <software name="belwrt">
- <description>Below the Root (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2018-11-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="below the root (4am crack) side a.dsk" size="143360" crc="b546f694" sha1="e4a03625fd40389af5f787c39f574c1eed569547" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="below the root (4am crack) side b.dsk" size="143360" crc="3298fdc6" sha1="f6b2a638a96afb4c99e182ff6ee477763bb440fa" />
- </dataarea>
- </part>
- </software>
-
<software name="biblebb">
<description>Bible Baseball (cleanly cracked)</description>
<year>1983</year>
@@ -3858,45 +1943,19 @@ license:CC0-1.0
<info name="release" value="2017-09-03"/>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="bible discovery (4am crack) side a.dsk" size="143360" crc="36772405" sha1="33bf215292b2f4b830e17773b85881b7c6b954b7" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="bible discovery (4am crack) side b.dsk" size="143360" crc="584d4137" sha1="f255d2477d6ca9a712762124b56bd754f769bb77" />
</dataarea>
</part>
</software>
- <software name="bbmftanr">
- <description>Big Book Maker: Favorite Fairy Tales and Nursery Rhymes (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 1 - program.dsk" size="143360" crc="fcbe4f9c" sha1="c299ef910d0cbcd17f295a5574d9dc9f0a6b8e1c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 2 - backgrounds and frames.dsk" size="143360" crc="df5fd2c9" sha1="a266331593a80884784cc2ca14940f0a91b19310" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 3 - clip art.dsk" size="143360" crc="46d33ee2" sha1="124ccdea4cd957c8172af7bbadb323a752b8bc53" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 4 - more clip art.dsk" size="143360" crc="7c95be06" sha1="7225e7c0552edceaca7465404992d301f619b25d" />
- </dataarea>
- </part>
- </software>
-
<software name="brmania">
<description>Big Red Mania (cleanly cracked)</description>
<year>1983</year>
@@ -3923,19 +1982,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bioach2rad">
- <description>Biology Achievement II: Reproduction and Development (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2016-12-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="biology achievement ii - reproduction and development (4am crack).dsk" size="143360" crc="974b5c03" sha1="fd85daa0a50aae9b8c32ff6e92410155ee083820" />
- </dataarea>
- </part>
- </software>
-
<software name="biomes">
<description>Biomes (cleanly cracked)</description>
<year>1986</year>
@@ -3949,32 +1995,6 @@ license:CC0-1.0
</part>
</software>
- <software name="birds">
- <description>Birds (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="birds (4am crack).dsk" size="143360" crc="91f81dc3" sha1="fd2f8aa567c50de22b758577d9adebd23fffcd37" />
- </dataarea>
- </part>
- </software>
-
- <software name="blkrsfndrs">
- <description>Blockers and Finders (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-05-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="blockers and finders (4am crack).dsk" size="143360" crc="fea7e692" sha1="7932d1beb2833254f04ca67f1122f9d8ac843107" />
- </dataarea>
- </part>
- </software>
-
<software name="blupwdrgrysmk">
<description>Blue Powder Grey Smoke (cleanly cracked)</description>
<year>1986</year>
@@ -3997,32 +2017,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bolo">
- <description>Bolo (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2018-10-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bolo (4am crack).dsk" size="143360" crc="6494af2c" sha1="0a2c77c0fe3199e4b7eb27774c924ced182479e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="bombaley">
- <description>Bomb Alley (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bomb alley (4am and san inc crack).dsk" size="143360" crc="6c6fc199" sha1="6be0041ec12aa85709d6305f7a86e654d7055a53" />
- </dataarea>
- </part>
- </software>
-
<software name="brwdtime">
<description>Borrowed Time (cleanly cracked)</description>
<year>1985</year>
@@ -4030,79 +2024,19 @@ license:CC0-1.0
<info name="release" value="2016-11-19"/>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="borrowed time (4am crack) side a.dsk" size="143360" crc="cc77a096" sha1="a4c57ed42fc787359b63bef35aea1ad3f07b3013" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="borrowed time (4am crack) side b.dsk" size="143360" crc="171858b1" sha1="7a7aa0257d615b01dbca6e57edb433e89f8efa38" />
</dataarea>
</part>
</software>
- <software name="bldrdash">
- <description>Boulder Dash (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="boulder dash (4am and san inc crack).dsk" size="143360" crc="c19abe7f" sha1="cbd285cfb7cc19fd62e6b63f5b2f0e911efcefa7" />
- </dataarea>
- </part>
- </software>
-
- <software name="bldkit">
- <description>Boulderdash Construction Kit (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2017-05-16"/>
- <!-- "Boulderdash Construction Kit" is a 1987 arcade game developed by Pat Montelo and Fernando Herrera. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="boulderdash construction kit (4am crack).dsk" size="143360" crc="45ef5172" sha1="c1524de4e9ce9033be2bca3ef2b0dc39c37d2bf7" />
- </dataarea>
- </part>
- </software>
-
- <software name="bldkitb" cloneof="bldkit">
- <description>Boulderdash Construction Kit (imperfect clean crack)</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2017-05-16"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="boulderdash construction kit (imperfect 4am crack).dsk" size="143360" crc="cf7fac16" sha1="d190de3042f2684cae2b2cb0c9484d454b4b6b1a" />
- </dataarea>
- </part>
- </software>
-
- <software name="bnckmg">
- <description>Bouncing Kamungas (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-05-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bouncing kamungas (4am crack).dsk" size="143360" crc="7c949f6a" sha1="7afe51c5db44bfdfa190c8fa14ebfd1c18551ece" />
- </dataarea>
- </part>
- </software>
-
<software name="bxintadd">
<description>Box Introduces Addition (cleanly cracked)</description>
<year>1984</year>
@@ -4149,11 +2083,13 @@ license:CC0-1.0
<info name="release" value="2016-03-06"/>
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
<rom name="building reading skills (4am crack) disk 1.dsk" size="143360" crc="a069b8dc" sha1="fdb987deefa045e446503eba3225e9c7ca098a76" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="143360">
<rom name="building reading skills (4am crack) disk 2.dsk" size="143360" crc="0a0561b3" sha1="745b84d902653e38020b3def727c4e8903bd6393" />
</dataarea>
@@ -4173,202 +2109,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bbrdmkcac">
- <description>Bulletin Board Maker: City and Country (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - city and country (4am crack) disk 1 - program.dsk" size="143360" crc="1a5e353b" sha1="fa690b186d9cab2eb032761a1c3bb7ab2297cdec" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - city and country (4am crack) disk 2 - posters.dsk" size="143360" crc="660831a7" sha1="972031daf29338ba13d0b9c833fb208875f5b1a1" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - city and country (4am crack) disk 3 - clip art.dsk" size="143360" crc="c1c3fe82" sha1="c7beeb4b02cacfea18259205881fe687aa568abe" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - city and country (4am crack) disk 4 - frames and fonts.dsk" size="143360" crc="2fdef73b" sha1="aa460059fabea91a0875e8cc53b64c70749347bd" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbrdmkyn">
- <description>Bulletin Board Maker: Your Neighborhood (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - your neighborhood (4am crack) disk 1 - program.dsk" size="143360" crc="bca2832a" sha1="9d2394c1e4052eb4a818c28ed934ffe9e8679033" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - your neighborhood (4am crack) disk 2 - posters.dsk" size="143360" crc="ae2302c0" sha1="9b734bc4060b0a0863197431aabc1cd250c28171" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - your neighborhood (4am crack) disk 3 - clip art.dsk" size="143360" crc="17ac02d0" sha1="c5dd685d8908a1ff11d7be4110014a792ce538d1" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bulletin board maker - your neighborhood (4am crack) disk 4 - frames and fonts.dsk" size="143360" crc="785796b8" sha1="4913ced081bf2ed9bc3419e5b31162d56da9a9dc" />
- </dataarea>
- </part>
- </software>
-
- <software name="bumblplt82">
- <description>Bumble Plot (1982) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Apple Computer</publisher>
- <info name="release" value="2016-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bumble plot (1982) (4am crack).dsk" size="143360" crc="007bf1e3" sha1="4150eb9ab436be6c44810e5815acd3087f927514" />
- </dataarea>
- </part>
- </software>
-
- <software name="bumblplt12">
- <description>Bumble Plot (version 1.2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bumble plot 1.2 (4am crack).dsk" size="143360" crc="3e79f3ac" sha1="24ab23e8ecf5d893e740ea0e1ca704a91f5fedb9" />
- </dataarea>
- </part>
- </software>
-
- <software name="canbbltz">
- <description>Cannonball Blitz (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-01-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cannonball blitz (4am crack).dsk" size="143360" crc="dc1f57a6" sha1="cf21476eeae8ce0f725f5740dad778b561034989" />
- </dataarea>
- </part>
- </software>
-
- <software name="capit">
- <description>Capitalization (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-07-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization (4am crack) disk 1 - practice.dsk" size="143360" crc="b86aec47" sha1="cbaedc77ebdd217be1400490597f905c9f2a78bb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization (4am crack) disk 2 - test.dsk" size="143360" crc="bef6c07d" sha1="16f77b48b02a4d1cddd1f3c0eba6b1d997a95ace" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization (educational activities) (4am crack).dsk" size="143360" crc="4eebb8e5" sha1="605ed1f07cfa2596f50749a7e37ee0ae4a6334ce" />
- </dataarea>
- </part>
- </software>
-
- <software name="capitpr">
- <description>Capitalization Practice (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization practice (4am crack).dsk" size="143360" crc="8ecf1ba6" sha1="8db53f4cf4b82a107d415f36b4d15968a26b74fa" />
- </dataarea>
- </part>
- </software>
-
- <software name="capittst">
- <description>Capitalization Test (version 01.29.87) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization test (4am crack).dsk" size="143360" crc="fd55ae25" sha1="803d5cc2f253090ee301b5fef7eefe00f0acfa18" />
- </dataarea>
- </part>
- </software>
-
- <software name="capitv15">
- <description>Capitalization (version 1.5) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gamco Industries</publisher>
- <info name="release" value="2017-07-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization v1.5 (4am crack).dsk" size="143360" crc="91700bd8" sha1="ebec31c7aeac632408897faf232cbc04668fcd50" />
- </dataarea>
- </part>
- </software>
-
- <software name="carrierf">
- <description>Carrier Force (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="carrier force (4am and san inc crack).dsk" size="143360" crc="25cfeacf" sha1="7c1798d02b520b577d04e80654a939c07fa9b0e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="cartels">
- <description>Cartels and Cutthroats (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cartels and cutthroats (4am and san inc crack).dsk" size="143360" crc="c60bdd16" sha1="c0c2a3664bfdef8ed036d8ba8fde047fc6dfc5e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="casechic">
- <description>Case of the Missing Chick: Finding The Main Idea (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="case of the missing chick (4am crack).dsk" size="143360" crc="c6bfecda" sha1="f434cf814040b36130e54456bcafcdb9b5559c89" />
- </dataarea>
- </part>
- </software>
-
<software name="cstlwolf">
<description>Castle Wolfenstein (cleanly cracked)</description>
<year>1981</year>
@@ -4382,156 +2122,6 @@ license:CC0-1.0
</part>
</software>
- <software name="catdetg">
- <description>Categorizing: Detective Games (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-10-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="categorizing - detective games (4am crack).dsk" size="143360" crc="61c8e48a" sha1="e8a1c84e3b004054b5aadc27d0b7074b33a95202" />
- </dataarea>
- </part>
- </software>
-
- <software name="catsktns">
- <description>Cats and Kittens (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-07-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cats and kittens (4am crack).dsk" size="143360" crc="9c58daac" sha1="3aee34a9d3d7bb64306162b509db4f93c5f81148" />
- </dataarea>
- </part>
- </software>
-
- <software name="cntralnc">
- <description>Centauri Alliance (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-01-17"/>
- <!-- "Centauri Alliance" is a 1990 roleplaying game by Michael Cranford, Tom Wilcox, Diane Wilcox, Gene Hamm, and Nancy Morris, and distributed by Broderbund Software. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (4am crack) disk 1a - boot.dsk" size="143360" crc="d8e5afd5" sha1="2204460e183a8fa4471419db510d976e2853f3d5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Roster"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (4am crack) disk 1b - roster.dsk" size="143360" crc="e258fb1e" sha1="daf12471584e5a6c3fc3e501e9334adb35c38ea7" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Scenario 1"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (4am crack) disk 2a - scenery 1.dsk" size="143360" crc="4d026cd8" sha1="c9f610fd2a6d08a4ee5bf3fa46f260ed56984121" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Scenario 2"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (4am crack) disk 2b - scenery 2.dsk" size="143360" crc="0d976331" sha1="b6830cb95028bce75ca509964eb701ff5b96f7c2" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A - Scenario 3"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (4am crack) disk 3a - scenery 3.dsk" size="143360" crc="5ed890de" sha1="518301730baaef9fa2cbde4cecf73bd3c35b6353" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B - Scenario 4"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (4am crack) disk 3b - scenery 4.dsk" size="143360" crc="f0926edf" sha1="8bf06e1dc19fcc9be58e0bf0b5c24819a688b64d" />
- </dataarea>
- </part>
- </software>
-
- <software name="cntralncb" cloneof="cntralnc">
- <description>Centauri Alliance (imperfect clean crack)</description>
- <year>1990</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-01-17"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (imperfect 4am crack) boot.dsk" size="143360" crc="6575734c" sha1="91de6b82846f547963388541a1b9472d81c41219" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Roster"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (imperfect 4am crack) roster.dsk" size="143360" crc="e258fb1e" sha1="daf12471584e5a6c3fc3e501e9334adb35c38ea7" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Scenario 1"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (imperfect 4am crack) scenery 1.dsk" size="143360" crc="4d026cd8" sha1="c9f610fd2a6d08a4ee5bf3fa46f260ed56984121" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Scenario 2"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (imperfect 4am crack) scenery 2.dsk" size="143360" crc="0d976331" sha1="b6830cb95028bce75ca509964eb701ff5b96f7c2" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A - Scenario 3"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (imperfect 4am crack) scenery 3.dsk" size="143360" crc="5ed890de" sha1="518301730baaef9fa2cbde4cecf73bd3c35b6353" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B - Scenario 4"/>
- <dataarea name="flop" size="143360">
- <rom name="centauri alliance (imperfect 4am crack) scenery 4.dsk" size="143360" crc="f0926edf" sha1="8bf06e1dc19fcc9be58e0bf0b5c24819a688b64d" />
- </dataarea>
- </part>
- </software>
-
- <software name="cestlvie">
- <description>C'est La Vie (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Adventure International</publisher>
- <info name="release" value="2018-04-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="c'est la vie (4am crack).dsk" size="143360" crc="b16f4e64" sha1="c491578b32e6d845c80e5331a611ade99510b097" />
- </dataarea>
- </part>
- </software>
-
- <software name="chsntcom">
- <description>Challenge Sentence Combining (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing Company</publisher>
- <info name="release" value="2017-04-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="challenge sentence combining (4am crack).dsk" size="143360" crc="ac771b9f" sha1="6b03e7dc7889064d68f2a172952c9b4edcd3e845" />
- </dataarea>
- </part>
- </software>
-
<software name="chmpbase">
<description>Championship Baseball (cleanly cracked)</description>
<year>1986</year>
@@ -4552,19 +2142,6 @@ license:CC0-1.0
</part>
</software>
- <software name="chmpgolf">
- <description>Championship Golf (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2018-06-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="championship golf (4am crack).dsk" size="143360" crc="632254c5" sha1="c4613b775f652be87706f89362ebf61bcdd43239" />
- </dataarea>
- </part>
- </software>
-
<software name="cimpfracmix">
<description>Changing Improper Fractions to Mixed Numbers (cleanly cracked)</description>
<year>1990</year>
@@ -4591,39 +2168,6 @@ license:CC0-1.0
</part>
</software>
- <software name="chcougkng">
- <description>Chariots, Cougars, and Kings (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-09-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="chariots, cougars, and kings (4am crack) disk 1.dsk" size="143360" crc="8fc9df9f" sha1="d966d3a65ff4eb861d9faa58fb491a33c4b94fe8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="chariots, cougars, and kings (4am crack) disk 2.dsk" size="143360" crc="57dcc568" sha1="fccb739ccc8dcddd00b60dcabad2745909f0f517" />
- </dataarea>
- </part>
- </software>
-
- <software name="chemach1">
- <description>Chemistry Achievement I - Mathematics of Chemistry (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2016-12-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="chemistry achievement i - mathematics of chemistry (4am crack).dsk" size="143360" crc="ba07c4b2" sha1="eb5bc54515e501710a6d5a3dd73591c5cbef882c" />
- </dataarea>
- </part>
- </software>
-
<software name="circsub">
<description>Circus Subtraction (cleanly cracked)</description>
<year>1986</year>
@@ -4637,58 +2181,6 @@ license:CC0-1.0
</part>
</software>
- <software name="cacoppos">
- <description>City and Country Opposites (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Random House</publisher>
- <info name="release" value="2017-09-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="city and country opposites (4am crack).dsk" size="143360" crc="2036f4f0" sha1="35fd975f31d90ec2a02facc66babb8de507e4579" />
- </dataarea>
- </part>
- </software>
-
- <software name="clock">
- <description>Clock: Time Teaching (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-06-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="clock (4am crack).dsk" size="143360" crc="623754cc" sha1="29c9a23e6fcdd04933e5992e1f9aac0d9ba458b0" />
- </dataarea>
- </part>
- </software>
-
- <software name="clock032090">
- <description>Clock (v03.20.90) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-12-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="clock 03.20.90 (4am crack).dsk" size="143360" crc="e00e5ffb" sha1="abf0c1ba72ac2d7fb97c26ed56b4a38499f27cbf" />
- </dataarea>
- </part>
- </software>
-
- <software name="clock070683">
- <description>Clock 07.06.83 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-08-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="clock 07.06.83 (4am crack).dsk" size="143360" crc="db9c1a4a" sha1="ad3dbcef068a2d90c00a811696440a5e34f4bb96" />
- </dataarea>
- </part>
- </software>
-
<software name="clozthnk">
<description>Cloze Thinking (cleanly cracked)</description>
<year>1985</year>
@@ -4716,115 +2208,6 @@ license:CC0-1.0
</part>
</software>
- <software name="clzreadc">
- <description>Clozed Reading Comprehension (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="clozed reading comprehension (4am crack).dsk" size="143360" crc="1a19fb92" sha1="7e7b46e3f747bd4c0686769bebc05395170e3f4f" />
- </dataarea>
- </part>
- </software>
-
- <software name="clozeplslvlc">
- <description>Cloze-Plus Level C (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level c (4am crack) disk 1.dsk" size="143360" crc="bbc05b82" sha1="2528765e405d880575f80d75f29a313c638a32e9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level c (4am crack) disk 2.dsk" size="143360" crc="3212d424" sha1="1be9c3078ea25bb2b2b6f6685eed7dcf9203bf36" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level c (4am crack) disk 3.dsk" size="143360" crc="e0a96a5a" sha1="b8a903e5242dbfe052e024d19fc48779712831f4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level c (4am crack) disk 4.dsk" size="143360" crc="0965e196" sha1="8acd0ed0f6e0673e1454e7f42dbb78cf8230adb6" />
- </dataarea>
- </part>
- </software>
-
- <software name="clozeplslvld">
- <description>Cloze-Plus Level D (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level d (4am crack) disk 1.dsk" size="143360" crc="98c4164e" sha1="1006f03d8bbb53c9e33fdcece77528468fd7dca3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level d (4am crack) disk 2.dsk" size="143360" crc="b2794b32" sha1="65218239901d4029fa2ca33a46614ebb5234f607" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level d (4am crack) disk 3.dsk" size="143360" crc="3abfc44a" sha1="439c0e8917388d9a7cc3e3cd02abe7e48423080e" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level d (4am crack) disk 4.dsk" size="143360" crc="8416bb90" sha1="b3335e463071bc8e1194bdacc866b7d6e1c19868" />
- </dataarea>
- </part>
- </software>
-
- <software name="clozeplslvle">
- <description>Cloze-Plus Level E (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level e (4am crack) disk 1.dsk" size="143360" crc="74f58bdf" sha1="86e4c2d6a6213388bbda3e0843efb3464a4671bb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level e (4am crack) disk 2.dsk" size="143360" crc="38bce5b3" sha1="437f7c8df4af1087f39351d3b891f4b2e041ff84" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level e (4am crack) disk 3.dsk" size="143360" crc="fb04ebf6" sha1="4f4a2dddd90703be5fc016a2d211c6b95ee0c009" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="cloze-plus level e (4am crack) disk 4.dsk" size="143360" crc="dc2744b5" sha1="ed7629b3edc287553e453c63fc9941a61bdd4941" />
- </dataarea>
- </part>
- </software>
-
<software name="clgbrd8182d">
<description>College Board 81-82 demo (cleanly cracked)</description>
<year>1981</year>
@@ -4870,58 +2253,6 @@ license:CC0-1.0
</part>
</software>
- <software name="coloncqt">
- <description>Colonial Conquest (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="colonial conquest (4am crack).dsk" size="143360" crc="5f56187d" sha1="52040bb086d1239624f58245304ebf395b40c039" />
- </dataarea>
- </part>
- </software>
-
- <software name="colormes">
- <description>Color Me (Softsmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Softsmith</publisher>
- <info name="release" value="2018-08-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="color me (softsmith)(4am crack).dsk" size="143360" crc="0e22f1fc" sha1="522d338af7fa956e2c1b62eab2fa88141d8e5e75" />
- </dataarea>
- </part>
- </software>
-
- <software name="commasq">
- <description>Commas (Queue) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Queue</publisher>
- <info name="release" value="2016-04-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="commas (queue) (4am crack).dsk" size="143360" crc="660e3e38" sha1="a53cb117b0fb39f4b5906e657d66f706c1146520" />
- </dataarea>
- </part>
- </software>
-
- <software name="commnwin">
- <description>Persona's Communicate and Win (cleanly cracked)</description>
- <year>????</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2018-10-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="communicate and win (4am crack).dsk" size="143360" crc="0e983c2d" sha1="a95ce215249c05d37727114f887285ecdf9b854e" />
- </dataarea>
- </part>
- </software>
-
<software name="compnumb">
<description>Comparing Numbers (cleanly cracked)</description>
<year>1984</year>
@@ -5092,37 +2423,12 @@ license:CC0-1.0
</part>
</software>
- <software name="cmpairct">
- <description>Computer Air Combat (version 1.1) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-11-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="computer air combat v1.1 (4am and san inc crack).dsk" size="143360" crc="c90ddc0a" sha1="61910011bd88739e2d3c16b9f0d1272202974caa" />
- </dataarea>
- </part>
- </software>
-
- <software name="cmpambsh">
- <description>Computer Ambush (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="computer ambush (4am and san inc crack).dsk" size="143360" crc="8916ce80" sha1="4526f179ce891997e45bfc2d727a3a6559c8d297" />
- </dataarea>
- </part>
- </software>
-
<software name="caalgebb">
<description>Computer Assisted Problem Solving for Beginning Algebra (cleanly cracked)</description>
<year>1984</year>
<publisher>Unknown</publisher>
- <info name="programmer" value="Chris W. Avery and Charles B. Barker"/>
+ <info name="programmer" value="Chris W. Avery" />
+ <info name="programmer" value="Charles B. Barker" />
<info name="release" value="2017-09-06"/>
<!-- Publisher is unknown. Authors are Chris W. Avery and Charles B.
Barker. -->
@@ -5145,7 +2451,8 @@ license:CC0-1.0
<description>Computer Assisted Problem Solving for Intermediate Algebra (cleanly cracked)</description>
<year>1984</year>
<publisher>Unknown</publisher>
- <info name="programmer" value="Chris W. Avery and Charles B. Barker"/>
+ <info name="programmer" value="Chris W. Avery" />
+ <info name="programmer" value="Charles B. Barker" />
<info name="release" value="2017-09-06"/>
<!-- Publisher is unknown. Authors are Chris W. Avery and Charles B.
Barker. -->
@@ -5168,7 +2475,8 @@ license:CC0-1.0
<description>Computer Assisted Problem Solving for Pre-Algebra (cleanly cracked)</description>
<year>1984</year>
<publisher>Unknown</publisher>
- <info name="programmer" value="Chris W. Avery and Charles B. Barker"/>
+ <info name="programmer" value="Chris W. Avery" />
+ <info name="programmer" value="Charles B. Barker" />
<info name="release" value="2017-09-05"/>
<!-- Publisher is unknown. Authors are Chris W. Avery and Charles B.
Barker. -->
@@ -5187,24 +2495,6 @@ license:CC0-1.0
</part>
</software>
- <software name="cmpbaseb">
- <description>Computer Baseball (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="computer baseball (4am and san inc crack).dsk" size="143360" crc="1e13b893" sha1="6417e6a78c821c6d6c8ac344f5acd3ce5aaa4e7d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="computer baseball 1983 teams disk (4am and san inc crack).dsk" size="143360" crc="9d4d81fc" sha1="9343d764c844459f2e6c42a539505619c9d567e7"/>
- </dataarea>
- </part>
- </software>
-
<software name="cmpdiscv">
<description>Computer Discovery (cleanly cracked)</description>
<year>1981</year>
@@ -5329,19 +2619,6 @@ license:CC0-1.0
</part>
</software>
- <software name="cmpqbse">
- <description>Computer Quarterback Second Edition (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="computer quarterback second edition (4am and san inc crack).dsk" size="143360" crc="bffa5b04" sha1="b1e64b47ea375e782333f0943255dbd18f6cac43" />
- </dataarea>
- </part>
- </software>
-
<software name="craphasics">
<description>Computerized Reading for Aphasics (cleanly cracked)</description>
<year>1984</year>
@@ -5404,52 +2681,6 @@ license:CC0-1.0
</part>
</software>
- <software name="7ctygold">
- <description>Seven Cities of Gold (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="seven cities of gold (4am and san inc crack) side a.dsk" size="143360" crc="f9566cfe" sha1="ed194e27de65d7ec89e59834ceab579f92735900" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="seven cities of gold (4am and san inc crack) side b.dsk" size="143360" crc="5456b895" sha1="4fc6b15de84729ee06594b485e28b8da647f506b" />
- </dataarea>
- </part>
- </software>
-
- <software name="cwrdcnc">
- <description>Concentrate on Words and Concepts (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="concentrate on words and concepts (4am crack).dsk" size="143360" crc="a499b85e" sha1="cb4a4984606dcc206efdf3c6dd81fcad2a3ffc85" />
- </dataarea>
- </part>
- </software>
-
- <software name="cwrdcnc2">
- <description>Concentrate on Words and Concepts II (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="concentrate on words and concepts ii (4am crack).dsk" size="143360" crc="dc837455" sha1="cb6accb75b13992bb0c43201a71b8605d203af0b" />
- </dataarea>
- </part>
- </software>
-
<software name="concent">
<description>Concentration (cleanly cracked)</description>
<year>1984</year>
@@ -5607,19 +2838,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crnsmanr">
- <description>Cranston Manor (cleanly cracked)</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-12-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cranston manor (4am and san inc crack).dsk" size="143360" crc="814e2e10" sha1="69c0f1d75d96eff41592fed5aeafbbb1c8efb625" />
- </dataarea>
- </part>
- </software>
-
<software name="crzymazy">
<description>Crazy Mazey (cleanly cracked)</description>
<year>1982</year>
@@ -5633,32 +2851,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crtlsns">
- <description>Create Lessons (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-09-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="create lessons (4am crack).dsk" size="143360" crc="1f31e91d" sha1="fab6f6726e6e7ccae1bd6d97d98cddc0d602a2be" />
- </dataarea>
- </part>
- </software>
-
- <software name="crtsplt">
- <description>Create-Spell It (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hartley Software</publisher>
- <info name="release" value="2015-07-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="create-spell it (4am crack).dsk" size="143360" crc="a267f38f" sha1="87bb35ac7d03222c1938726a5478a633c1e1bf53" />
- </dataarea>
- </part>
- </software>
-
<software name="crtvplay">
<description>Creative Play (cleanly cracked)</description>
<year>1982</year>
@@ -5708,91 +2900,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crtunl">
- <description>Creativity, Unlimited (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="creativity, unlimited (4am crack) disk 1.dsk" size="143360" crc="62885e4f" sha1="58d279591627785dd2a02b94acea32e9fccbcd56" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="creativity, unlimited (4am crack) disk 2.dsk" size="143360" crc="c7f8fa13" sha1="bcb27b7cd326571f8fa8060587cd4fbef128d8ca" />
- </dataarea>
- </part>
- </software>
-
- <software name="crchorus">
- <description>Creature Chorus (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2017-09-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="creature chorus (4am crack).dsk" size="143360" crc="d7c1dc71" sha1="4afb4a8addd19ddb05b6c082bd8b1762607449b1" />
- </dataarea>
- </part>
- </software>
-
- <software name="crmagic">
- <description>Creature Magic (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="creature magic (4am crack).dsk" size="143360" crc="aec69309" sha1="b93ffbd4db04d85689a1240fe6b5157aa27216ea" />
- </dataarea>
- </part>
- </software>
-
- <software name="cotn">
- <description>Creatures of the Night (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="creatures of the night (4am crack).dsk" size="143360" crc="433144be" sha1="b110fe624a8d91159b7464f941f3daeac96ecb4a" />
- </dataarea>
- </part>
- </software>
-
- <software name="crmstopr">
- <description>Crime Stopper (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2018-08-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crime stopper (4am crack).dsk" size="143360" crc="045b7082" sha1="d0a76363471a6d4f721f8e6506c6b32af2f74e25" />
- </dataarea>
- </part>
- </software>
-
- <software name="crmwave">
- <description>Crime Wave (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-02-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crime wave (4am crack).dsk" size="143360" crc="c0bc686d" sha1="0cdf8482c26ee748127cce617c6b903c523c1dd3" />
- </dataarea>
- </part>
- </software>
-
<software name="crossbow">
<description>Crossbow (cleanly cracked)</description>
<year>1988</year>
@@ -5813,45 +2920,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crosfire">
- <description>Crossfire (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2016-07-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crossfire (4am crack).dsk" size="143360" crc="e29b77bf" sha1="4973418f446ddbc224650681acc802990557f2f6" />
- </dataarea>
- </part>
- </software>
-
- <software name="crwnarth">
- <description>Crown of Arthain (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Micro Lab</publisher>
- <info name="release" value="2018-10-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crown of arthain (4am crack).dsk" size="143360" crc="7e0723ca" sha1="375ec42326da5ef055a2bd7c59ddbdf1f3cb2b10" />
- </dataarea>
- </part>
- </software>
-
- <software name="crush">
- <description>Crush Crumble and Chomp (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2017-01-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crush crumble and chomp (4am crack).dsk" size="143360" crc="847d6fac" sha1="247d8154186c7a60e2df3f72972eb03023c7b4fe" />
- </dataarea>
- </part>
- </software>
-
<software name="crycub84">
<description>Crypto Cube 1984 (cleanly cracked)</description>
<year>1984</year>
@@ -5904,26 +2972,6 @@ license:CC0-1.0
</part>
</software>
- <software name="cutnpste">
- <description>Cut and Paste (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="cut and paste (4am and san inc crack) disk 1 - program.dsk" size="143360" crc="28bdee63" sha1="547dc7c1115e336b3efcbf245048a2e681dc28ed" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Sample documents"/>
- <dataarea name="flop" size="143360">
- <rom name="cut and paste (4am and san inc crack) disk 2 - sample documents.dsk" size="143360" crc="7c90015a" sha1="c6575f00d84eb9c1517f58ac845fa03e80203917" />
- </dataarea>
- </part>
- </software>
-
<software name="cutthr23">
<description>Cutthroats (Revision 23) (cleanly cracked)</description>
<year>1984</year>
@@ -5996,26 +3044,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dcaribbn">
- <description>Death in the Caribbean (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Micro-Fun</publisher>
- <info name="release" value="2017-06-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="death in the caribbean (4am crack) side a.dsk" size="143360" crc="af85d089" sha1="35363c2cfe65816b75a7e3cdf399575947946822" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="death in the caribbean (4am crack) side b.dsk" size="143360" crc="3db3229e" sha1="a8696b41a0c5a1e332cd0d4274740635fc71519a" />
- </dataarea>
- </part>
- </software>
-
<software name="decdungn">
<description>Decimal Dungeon (cleanly cracked)</description>
<year>1985</year>
@@ -6211,19 +3239,6 @@ license:CC0-1.0
</part>
</software>
- <software name="destroyr">
- <description>Destroyer (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2015-08-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="destroyer (4am crack).dsk" size="143360" crc="b1822286" sha1="09e405feb27cfc121b98abae0ca578a35bc37c04" />
- </dataarea>
- </part>
- </software>
-
<software name="devbwrt1">
<description>Developing Basic Writing Skills Level I (cleanly cracked)</description>
<year>1986</year>
@@ -6288,77 +3303,6 @@ license:CC0-1.0
</part>
</software>
- <software name="digdugd">
- <description>Dig Dug (Datasoft) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Datasoft</publisher>
- <info name="release" value="2015-06-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dig dug (datasoft) (4am crack).dsk" size="143360" crc="28dc7f9b" sha1="2c81ade8250936b7a4751958328c93bf8f3323c4" />
- </dataarea>
- </part>
- </software>
-
- <software name="dinospel">
- <description>Dino Spell (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-02-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dino spell (4am crack).dsk" size="143360" crc="e3c34a5b" sha1="8d79015abfb90f48fc8f3e64608c22251b30d3f2" />
- </dataarea>
- </part>
- </software>
-
- <software name="dinodays">
- <description>Dinosaur Days (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2015-12-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days (4am crack) disk 1a.dsk" size="143360" crc="05ef2a8f" sha1="e74b858e4fdf571ff7e0b5a852ad45d8320f6b50" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days (4am crack) disk 1b.dsk" size="143360" crc="8884a001" sha1="7ba45d752f982d35bb7e0b352356d68fef0a58c5" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days (4am crack) disk 2a.dsk" size="143360" crc="76806f96" sha1="9480680338c180066d45a029a1305f3489320b70" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days (4am crack) disk 2b.dsk" size="143360" crc="f852ff6b" sha1="5e7ff2df1615d736c7e94a4c3f5403112ec7d5a0" />
- </dataarea>
- </part>
- </software>
-
- <software name="discover">
- <description>Discover: A Science Experiment (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-06-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="discover (4am crack).dsk" size="143360" crc="97748a98" sha1="bec47f45e9a31f0f2ac16bc1b40587264f948417" />
- </dataarea>
- </part>
- </software>
-
<software name="dscimeth">
<description>Discovering the Scientific Method - Snigs, Flirks, and Blorgs (cleanly cracked)</description>
<year>1984</year>
@@ -6372,32 +3316,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dwrdbird">
- <description>Diskovery Word Bird (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="diskovery word bird (4am crack).dsk" size="143360" crc="ec6d61d0" sha1="b3e57d81f4a0bced5be67ad8930cbff6cddf511a" />
- </dataarea>
- </part>
- </software>
-
- <software name="divfract">
- <description>Dividing Fractions (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2015-06-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dividing fractions (4am crack).dsk" size="143360" crc="b6676369" sha1="89d4c43db5a8f29d1c16ca931ae19853b31382e4" />
- </dataarea>
- </part>
- </software>
-
<software name="diveasy">
<description>Division Made Easy (cleanly cracked)</description>
<year>1987</year>
@@ -6450,39 +3368,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dogspups">
- <description>Dogs and Puppies (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dogs and puppies (4am crack).dsk" size="143360" crc="b83e6676" sha1="c829406c3c4ae34acef9b60d62a17b337cd5c822" />
- </dataarea>
- </part>
- </software>
-
- <software name="ddplaygr">
- <description>Donald Duck's Playground (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-07-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="donald duck's playground (4am and san inc crack) side a.dsk" size="143360" crc="39ebc5ab" sha1="ca1e3627e48ad941e7f582867594363c1d6c2e0b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="donald duck's playground (4am and san inc crack) side b.dsk" size="143360" crc="7dcb1d1f" sha1="ed07cbd18281aecbc7fdb787505da5605f6a84d4" />
- </dataarea>
- </part>
- </software>
-
<software name="dondra">
<description>Dondra - A New Beginning (cleanly cracked)</description>
<year>1987</year>
@@ -6580,26 +3465,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dblntbl">
- <description>Double 'N' Trouble (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-01-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="double 'n' trouble (4am crack) disk 1.dsk" size="143360" crc="c2c787c4" sha1="ebb8f4a4b01d10e592f786107e8a200d4a10f2e2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="double 'n' trouble (4am crack) disk 2.dsk" size="143360" crc="163fc3bf" sha1="a743f98e2cb4ffddb9b74361d6a3c7a7bba40edb" />
- </dataarea>
- </part>
- </software>
-
<software name="dbltrbl">
<description>Double Trouble (cleanly cracked)</description>
<year>1983</year>
@@ -6613,32 +3478,6 @@ license:CC0-1.0
</part>
</software>
- <software name="drptalkw">
- <description>Dr. Peet's Talk-Writer (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-10-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dr. peet's talk-writer (4am crack).dsk" size="143360" crc="b85b3951" sha1="b6cd92d0479f14333c645b905b01d784154f1113" />
- </dataarea>
- </part>
- </software>
-
- <software name="drptabcd">
- <description>Dr. Peet's Talk-Writer ABC Discovery (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-10-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dr. peet's talk-writer abc discovery (4am crack).dsk" size="143360" crc="0bb2abd4" sha1="b52911975205ae95f742ace10a6a632a15485f88" />
- </dataarea>
- </part>
- </software>
-
<software name="drgnfire">
<description>Dragon Fire (cleanly cracked)</description>
<year>1981</year>
@@ -6652,19 +3491,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dragkeep">
- <description>Dragon's Keep (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-01-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dragon's keep (4am crack).dsk" size="143360" crc="20828805" sha1="4dc98e853585a4b58dd1eec12d07a202600ce78c" />
- </dataarea>
- </part>
- </software>
-
<software name="erlybird">
<description>Early Bird (cleanly cracked)</description>
<year>1983</year>
@@ -6691,118 +3517,6 @@ license:CC0-1.0
</part>
</software>
- <software name="erulneg">
- <description>Early Emerging Rules - Negation (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="early emerging rules - negation (4am crack).dsk" size="143360" crc="88235a8d" sha1="258bf21890c7bd813f23d25570c4f2623e16692a" />
- </dataarea>
- </part>
- </software>
-
- <software name="erulplur">
- <description>Early Emerging Rules - Plurals (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="early emerging rules - plurals (4am crack).dsk" size="143360" crc="1fe05fda" sha1="801e84cefecca5257bf797cbfae4db30a020c3d8" />
- </dataarea>
- </part>
- </software>
-
- <software name="ehbible">
- <description>Early Heroes of the Bible (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Baker Book House</publisher>
- <info name="release" value="2016-07-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="early heroes of the bible (4am crack) side a.dsk" size="143360" crc="ee55836a" sha1="a6b2eabf4a3eca66c040e61893342381819161a2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="early heroes of the bible (4am crack) side b.dsk" size="143360" crc="65c85c93" sha1="f3acacc26c8c57ca0c68dab3615865c7f2e0222f" />
- </dataarea>
- </part>
- </software>
-
- <software name="eskl0686">
- <description>Early Skills (version 06.05.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Sample lessons"/>
- <dataarea name="flop" size="143360">
- <rom name="early skills v06.05.86 (4am crack) disk 1 - sample lessons.dsk" size="143360" crc="b8f3df77" sha1="e81b2bde2d13b585f0d5942f2a3b2ef04e4ba5ec" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Create your own lessons"/>
- <dataarea name="flop" size="143360">
- <rom name="early skills v06.05.86 (4am crack) disk 2 - create your own lessons.dsk" size="143360" crc="f082a4a7" sha1="bec5e510100f18150c0f2a4e38be634e93690803" />
- </dataarea>
- </part>
- </software>
-
- <software name="ethorbst">
- <description>Earth Orbit Stations (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="earth orbit stations (4am and san inc crack) disk 1 - boot.dsk" size="143360" crc="d203bbc7" sha1="f320fcf100db49de86787ed9f1025b65bd3ca7dc" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Archive"/>
- <dataarea name="flop" size="143360">
- <rom name="earth orbit stations (4am and san inc crack) disk 2 - archive.dsk" size="143360" crc="870733af" sha1="6822dd8975a5944b65ea0df88fefea531ed223d0" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Mission"/>
- <dataarea name="flop" size="143360">
- <rom name="earth orbit stations (4am and san inc crack) disk 3 - mission.dsk" size="143360" crc="68a4fb0e" sha1="e187f8e8b9597a9f49bc1de31912e64c78fef126" />
- </dataarea>
- </part>
- </software>
-
- <software name="equakesf">
- <description>Earthquake San Francisco 1906 (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Adventure International</publisher>
- <info name="release" value="2018-10-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="earthquake san francisco 1906 (4am crack) side a.dsk" size="143360" crc="93119894" sha1="e46eebbd8797f966f1c94277f10df0402b58bc48" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="earthquake san francisco 1906 (4am crack) side b.dsk" size="143360" crc="eab2180c" sha1="f49986c6ab5d57b5a1fa81069a592c621dd30b57" />
- </dataarea>
- </part>
- </software>
-
<software name="easygrph">
<description>EasyGraph (cleanly cracked)</description>
<year>1984</year>
@@ -6868,19 +3582,6 @@ license:CC0-1.0
</part>
</software>
- <software name="elmusksd">
- <description>Elements of Music - Key-Signatures Drill (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2019-01-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="elements of music - key-signatures drill (4am crack).dsk" size="143360" crc="b2601218" sha1="97df9c952211c29b5af8c237d801df49faa8986d" />
- </dataarea>
- </part>
- </software>
-
<software name="elite">
<description>Elite (cleanly cracked)</description>
<year>1985</year>
@@ -6966,113 +3667,6 @@ license:CC0-1.0
</part>
</software>
- <software name="engachv1">
- <description>English Achievement I (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english achievement i (4am crack).dsk" size="143360" crc="d3818808" sha1="a1085cc381fd71c5aee432dbe3218bd440615bf1" />
- </dataarea>
- </part>
- </software>
-
- <software name="engachv2">
- <description>English Achievement II (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english achievement ii (4am crack).dsk" size="143360" crc="30bb37ad" sha1="dcb3a2ed75c909191da9a23590002bdfe1f437af" />
- </dataarea>
- </part>
- </software>
-
- <software name="engachv3">
- <description>English Achievement III (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english achievement iii (4am crack).dsk" size="143360" crc="0c828a5c" sha1="5a6eb7bf49d871b2281f508e687dd13eb3f317ed" />
- </dataarea>
- </part>
- </software>
-
- <software name="engachv4">
- <description>English Achievement IV (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-02"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english achievement iv (4am crack).dsk" size="143360" crc="f7b34b87" sha1="10eb4f6db081b38e319037130e684af174f62e73" />
- </dataarea>
- </part>
- </software>
-
- <software name="engachv4b">
- <description>English Achievement IV (imperfect clean crack)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english achievement iv (imperfect 4am crack).dsk" size="143360" crc="477d5b33" sha1="6c6e6db183a8555544bb76fffb1cd25476d8f2d3" />
- </dataarea>
- </part>
- </software>
-
- <software name="engachv5">
- <description>English Achievement V (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english achievement v (4am crack).dsk" size="143360" crc="78e09ab8" sha1="beffbfc431808e4607ced49e66715a8f048c7c18" />
- </dataarea>
- </part>
- </software>
-
- <software name="engchlng">
- <description>English Challenge (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Learning Seed Company</publisher>
- <info name="release" value="2016-04-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="english challenge (4am crack).dsk" size="143360" crc="e23b7121" sha1="ede48949b246423dc9e311f03ff40f778ec090e5" />
- </dataarea>
- </part>
- </software>
-
- <software name="epidemic">
- <description>Epidemic (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="epidemic (4am and san inc crack).dsk" size="143360" crc="5851d9eb" sha1="44ecac88bf299f6cd28475bb1641f62506d6f11f" />
- </dataarea>
- </part>
- </software>
-
<software name="epoch">
<description>Epoch (cleanly cracked)</description>
<year>1981</year>
@@ -7099,19 +3693,6 @@ license:CC0-1.0
</part>
</software>
- <software name="escarctr">
- <description>Escape from Arcturus (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2018-04-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="escape from arcturus (4am crack).dsk" size="143360" crc="f5f2cf9d" sha1="39399ee63d2e12d91edd58d0c2f609ef8defe9ae" />
- </dataarea>
- </part>
- </software>
-
<software name="esrngstn">
<description>Escape from Rungistan (cleanly cracked)</description>
<year>1982</year>
@@ -7154,16 +3735,19 @@ license:CC0-1.0
missing. -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
<rom name="essential idioms (4am crack) disk 1.dsk" size="143360" status="nodump" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="143360">
<rom name="essential idioms (4am crack) disk 2.dsk" size="143360" crc="6beb5b85" sha1="b8af6d4fca50f25cb9908329ebe9b82b26efeb59" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
<dataarea name="flop" size="143360">
<rom name="essential idioms (4am crack) disk 3.dsk" size="143360" crc="4297a46c" sha1="6cce8d619813c5c7a165ef4b4defdcb8954f6ba7" />
</dataarea>
@@ -7210,26 +3794,6 @@ license:CC0-1.0
</part>
</software>
- <software name="examazon">
- <description>Expedition Amazon (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2016-08-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="expedition amazon (4am crack) side a.dsk" size="143360" crc="b7bd4d32" sha1="3effbf439395e69d197e5f919a7cf8892bb35058" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="expedition amazon (4am crack) side b (boot).dsk" size="143360" crc="4cbb6e00" sha1="0974f4f34520234c741e67de535e664eb9b9396a" />
- </dataarea>
- </part>
- </software>
-
<software name="explsci">
<description>Explorations in Science (cleanly cracked)</description>
<year>1985</year>
@@ -7250,19 +3814,6 @@ license:CC0-1.0
</part>
</software>
- <software name="factopin">
- <description>Fact or Opinion (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-08-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fact or opinion (4am crack).dsk" size="143360" crc="cc153b60" sha1="d7605540583b5705f754a41085f3795fb0205814" />
- </dataarea>
- </part>
- </software>
-
<software name="factors">
<description>Factors (cleanly cracked)</description>
<year>1990</year>
@@ -7379,100 +3930,6 @@ license:CC0-1.0
</part>
</software>
- <software name="felonyth">
- <description>Felony (Thunder Mountain release) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2018-03-16"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="felony (thunder mountain release)(4am crack).dsk" size="143360" crc="af368f3c" sha1="e4859b633b8ecf100c11bb10e26ff6a28c9217de" />
- </dataarea>
- </part>
- </software>
-
- <software name="felonythb" cloneof="felonyth">
- <description>Felony (Thunder Mountain release) (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2018-03-16"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="felony (thunder mountain release) (imperfect 4am crack).dsk" size="143360" crc="ff3a1a1d" sha1="6b5fc4a04b74ad75f9dd249313d9c4db49890c78" />
- </dataarea>
- </part>
- </software>
-
- <software name="fldofire">
- <description>Field of Fire (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="field of fire (4am crack) side a.dsk" size="143360" crc="d3e4c252" sha1="89860de4872254fb034f5f91a2c58f3f7fe76b8b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="field of fire (4am crack) side b.dsk" size="143360" crc="a75578a7" sha1="64db2524da2375767eec272656dc24ba3e50ba61" />
- </dataarea>
- </part>
- </software>
-
- <software name="50mcrs11">
- <description>Fifty Mission Crush (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fifty mission crush v1.1 (4am and san inc crack).dsk" size="143360" crc="01e9f083" sha1="28a74d8f98bc262a550d9b591c6d8df18dfb13ee" />
- </dataarea>
- </part>
- </software>
-
- <software name="50mcrs12">
- <description>Fifty Mission Crush (version 1.2) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fifty mission crush v1.2 (4am and san inc crack).dsk" size="143360" crc="56078d1b" sha1="2261d4a95ebdba5a9b46c6d108c20d89390d5822" />
- </dataarea>
- </part>
- </software>
-
- <software name="fcommand">
- <description>Fighter Command (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fighter command (4am and san inc crack).dsk" size="143360" crc="c9f6b276" sha1="d83f4b6bfaa1c154845da9f01d8503557eaf5cdf" />
- </dataarea>
- </part>
- </software>
-
<software name="finmngr">
<description>Finance Manager (cleanly cracked)</description>
<year>1984</year>
@@ -7499,19 +3956,6 @@ license:CC0-1.0
</part>
</software>
- <software name="fincookb">
- <description>Financial Cookbook (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="financial cookbook (4am and san inc crack).dsk" size="143360" crc="04c51906" sha1="40d77a2ec410a5dc163489a75ed9dd52b545d5eb" />
- </dataarea>
- </part>
- </software>
-
<software name="bbfindrhyme">
<description>Bingo Bugglebee Presents: Find the Rhyme (cleanly cracked)</description>
<year>1985</year>
@@ -7525,32 +3969,6 @@ license:CC0-1.0
</part>
</software>
- <software name="fmawordp">
- <description>First Math Adventures - Understanding Word Problems (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="first math adventures - understanding word problems (4am crack).dsk" size="143360" crc="9a95072c" sha1="6eac6298542b7bcb6864ffbe171777e13a44ba8b" />
- </dataarea>
- </part>
- </software>
-
- <software name="fstartwr">
- <description>First Start Writing Program (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="first start writing program (4am crack).dsk" size="143360" crc="993e1183" sha1="813dbcb0ba217d9d83dbdfb171d602d19b744dfc" />
- </dataarea>
- </part>
- </software>
-
<software name="fstrphn1">
<description>First Steps to Reading - Phonics One (cleanly cracked)</description>
<year>1985</year>
@@ -7577,32 +3995,6 @@ license:CC0-1.0
</part>
</software>
- <software name="firsverb">
- <description>First Verbs (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="first verbs (4am crack).dsk" size="143360" crc="f66c56e9" sha1="be3b5694468bfbd8ce06b7134eb2310941e661a0" />
- </dataarea>
- </part>
- </software>
-
- <software name="firsword">
- <description>First Words (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="first words (4am crack).dsk" size="143360" crc="ce1b6cf2" sha1="d32231f12cb7434609d79fc079b6c4eafd88aa5d" />
- </dataarea>
- </part>
- </software>
-
<software name="5rowaddsub">
<description>Five in a Row - Addition and Subtraction (cleanly cracked)</description>
<year>1992</year>
@@ -7724,32 +4116,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ds12lcdir">
- <description>Following Directions - One and Two Level Commands - Directional Terms (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="following directions - one and two level commands - directional terms (4am crack).dsk" size="143360" crc="ef378a48" sha1="e2024a50327590f016630b32228a10f74e2ea45e" />
- </dataarea>
- </part>
- </software>
-
- <software name="ds12lcspat">
- <description>Following Directions - One and Two Level Commands - Spatial Relations (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="following directions - one and two level commands - spatial relations (4am crack).dsk" size="143360" crc="e273eb35" sha1="b5d6f16048003f0acf8624f74deea16013f444f6" />
- </dataarea>
- </part>
- </software>
-
<software name="fdgrpuzl">
<description>Food Group Puzzles (cleanly cracked)</description>
<year>1985</year>
@@ -7776,19 +4142,6 @@ license:CC0-1.0
</part>
</software>
- <software name="4wordlft">
- <description>FourWord and WordLift (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fourword and wordlift (4am crack).dsk" size="143360" crc="1cf9f2be" sha1="c261d104cadd5bf9420110eb96a3d869b08a7769" />
- </dataarea>
- </part>
- </software>
-
<software name="fracactn">
<description>Fraction Action (cleanly cracked)</description>
<year>1984</year>
@@ -7900,44 +4253,6 @@ license:CC0-1.0
</part>
</software>
- <software name="frogdog2">
- <description>Frogs, Dogs, Kittens, and Kids 2 (version 10.18.88) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-23"/>
- <!-- Disks are labelled as disks 4, 5, and 6, so probably no missing
- disks. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="frogs, dogs, kittens, and kids 2 (4am crack) disk 4.dsk" size="143360" crc="1cd38d23" sha1="b26e4fa8de88f316c734cc3b31b162f58b3df48a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="frogs, dogs, kittens, and kids 2 (4am crack) disk 5.dsk" size="143360" crc="296df7a1" sha1="2986e6ff7a47a4c4403bf7070d1960c05f6288fe" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="frogs, dogs, kittens, and kids 2 (4am crack) disk 6.dsk" size="143360" crc="76fdae35" sha1="25c0fe6cec9e80d1481f230901f0ea688568b09f" />
- </dataarea>
- </part>
- </software>
-
- <software name="abc2xyz">
- <description>From ABC to XYZ (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-10-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="from abc to xyz (4am crack).dsk" size="143360" crc="591aca27" sha1="4b44f051064c41fb1ef8e5d2f16484040064496f" />
- </dataarea>
- </part>
- </software>
-
<software name="fnctpict">
<description>Function Pictures (cleanly cracked)</description>
<year>1983</year>
@@ -7977,46 +4292,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gijoe">
- <description>G.I. Joe (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2015-08-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="g.i. joe (4am crack) side a.dsk" size="143360" crc="61f508bf" sha1="ae0e0ca335b5152ace0a9e763f23f9790c30b22c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="g.i. joe (4am crack) side b.dsk" size="143360" crc="10af5953" sha1="76e0c59cb14d9d1ad4ae43cdf502c9d1704be89b" />
- </dataarea>
- </part>
- </software>
-
- <software name="galacadv">
- <description>Galactic Adventures (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="galactic adventures (4am and san inc crack) disk 1.dsk" size="143360" crc="80965f35" sha1="63f76e541b1133dea7c0e786a80ab0203a37ef4b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="galactic adventures (4am and san inc crack) disk 2.dsk" size="143360" crc="a662f54f" sha1="f07350c1acd2d349b65ae98f0b03925c4d4405e1" />
- </dataarea>
- </part>
- </software>
-
<software name="glxygate">
<description>Galaxy Gates (cleanly cracked)</description>
<year>1981</year>
@@ -8135,39 +4410,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gelflingadventur">
- <description>Gelfling Adventure (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-10-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="gelfling adventure (4am and san inc crack) side a.dsk" size="143360" crc="f6f4d6c5" sha1="910fdbe541dfa4cad4b1fe4870f22d3a18386bc1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="gelfling adventure (4am and san inc crack) side b.dsk" size="143360" crc="cf0fa125" sha1="4b131e5beb2d1a06b52f743c00eca79eb3d753b3" />
- </dataarea>
- </part>
- </software>
-
- <software name="gemswarr">
- <description>Gemstone Warrior (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2016-12-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gemstone warrior (4am crack).dsk" size="143360" crc="ba9acfd0" sha1="4c47b66f16628bd3e4202923b8c5630f7ee4f29f" />
- </dataarea>
- </part>
- </software>
-
<software name="geoadvus">
<description>Geography Adventure USA (cleanly cracked)</description>
<year>1983</year>
@@ -8292,26 +4534,6 @@ license:CC0-1.0
</part>
</software>
- <software name="geopol90">
- <description>Geopolitique 1990 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Geopol"/>
- <dataarea name="flop" size="143360">
- <rom name="geopolitique 1990 (4am and san inc crack) side a - geopol.dsk" size="143360" crc="6e43a875" sha1="8cee72288cca5ebfc573206e0b64489f5263d392" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Geowar"/>
- <dataarea name="flop" size="143360">
- <rom name="geopolitique 1990 (4am and san inc crack) side b - geowar.dsk" size="143360" crc="3c19f5c2" sha1="84331f1cfb7f54ce446e88031d85c1ccfc825dae" />
- </dataarea>
- </part>
- </software>
-
<software name="geowhiz">
<description>GeoWhiz (cleanly cracked)</description>
<year>1990</year>
@@ -8338,104 +4560,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gertrudepuz10">
- <description>Gertrude's Puzzles (version 1.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2016-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's puzzles 1.0 (4am crack).dsk" size="143360" crc="d9511af5" sha1="6f99bb857b392f8dd58030b5464ef2ce19f96932" />
- </dataarea>
- </part>
- </software>
-
- <software name="gertrudepuz">
- <description>Gertrude's Puzzles (version 1.2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-05-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's puzzles 1.2 (4am crack).dsk" size="143360" crc="5f794fa0" sha1="3b65f8e778dc7dd61ae64d6780d298474a1955a3" />
- </dataarea>
- </part>
- </software>
-
- <software name="gertrudesec10">
- <description>Gertrude's Secrets (version 1.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-08-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's secrets 1.0 (4am crack).dsk" size="143360" crc="969de34c" sha1="53f470ec6d1e31844c2433d7546a5d3965a0dbaa" />
- </dataarea>
- </part>
- </software>
-
- <software name="gertrudesec13">
- <description>Gertrude's Secrets (version 1.3) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-12-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's secrets 1.3 (4am crack).dsk" size="143360" crc="98652042" sha1="881cac9cb46e7d38df878875b242fbb84e909a46" />
- </dataarea>
- </part>
- </software>
-
- <software name="gt2point">
- <description>Get to the Point (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="get to the point (4am crack).dsk" size="143360" crc="8a844d12" sha1="56570db68370579bb94f46915ab415586756d41d" />
- </dataarea>
- </part>
- </software>
-
- <software name="rdyreadadd">
- <description>Getting Ready to Read and Add (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-04-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="getting ready to read and add (4am crack).dsk" size="143360" crc="6150a8a8" sha1="b8a8d8e9f6eeeeb70e53c2c21b2409c269933549" />
- </dataarea>
- </part>
- </software>
-
- <software name="gtysburg">
- <description>Gettysburg - The Turning Point (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="gettysburg - the turning point (4am crack) side a.dsk" size="143360" crc="26a53290" sha1="309bd7e30750765700b2cab3fe442c48a1d1e190" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="gettysburg - the turning point (4am crack) side b.dsk" size="143360" crc="62372db7" sha1="f5e13ee7ffa10c241f55818371232bf29b05b5e4" />
- </dataarea>
- </part>
- </software>
-
<software name="gflfootb">
<description>GFL Championship Football (cleanly cracked)</description>
<year>1987</year>
@@ -8462,67 +4586,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gneenotg">
- <description>Gnee or Not Gnee (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gnee or not gnee (4am crack).dsk" size="143360" crc="76379016" sha1="c2257c5fdacc6b4c44d52cd053aee225fd7a59fb" />
- </dataarea>
- </part>
- </software>
-
- <software name="gohayden">
- <description>Go (Hayden) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Co.</publisher>
- <info name="release" value="2016-07-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="go (4am crack).dsk" size="143360" crc="014b2a73" sha1="70a43566885d69bfe902a21103341a431da731a6" />
- </dataarea>
- </part>
- </software>
-
- <software name="goldfngr">
- <description>Goldfinger (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-10-06"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="goldfinger (4am crack).dsk" size="143360" crc="987c2c2a" sha1="05fbd7813b573749c6de8421edb3d2a6aeb8cbdd" />
- </dataarea>
- </part>
- </software>
-
- <software name="goldfngrb" cloneof="goldfngr">
- <description>Goldfinger (imperfect clean crack)</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-10-06"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="goldfinger (imperfect 4am crack).dsk" size="143360" crc="7e8b51ff" sha1="a986bb4d486ef2b067f3983498f957571042cb22" />
- </dataarea>
- </part>
- </software>
-
<software name="grmrbase">
<description>Grammar Baseball (cleanly cracked)</description>
<year>1991</year>
@@ -8569,26 +4632,6 @@ license:CC0-1.0
</part>
</software>
- <software name="grmrmch1">
- <description>Grammar Mechanics Level 1 (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2016-07-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="grammar mechanics level 1 (4am crack) side a.dsk" size="143360" crc="15d7ba0a" sha1="ac51b9f464f2d1bacb6fab26985895684dfebc04" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="grammar mechanics level 1 (4am crack) side b.dsk" size="143360" crc="0ff30165" sha1="31222d63f82d458976e7e7b3a4abaaef9ae53298" />
- </dataarea>
- </part>
- </software>
-
<software name="gprixfacts">
<description>Grand Prix - Basic Facts Heat (cleanly cracked)</description>
<year>1982</year>
@@ -8628,39 +4671,6 @@ license:CC0-1.0
</part>
</software>
- <software name="graphmkr">
- <description>Graph Maker: Introduction to Graphs and Charts (cleanly cracked)</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="graph maker (4am crack).dsk" size="143360" crc="9d72fa98" sha1="2b478a8b410d6e759cd30d2d113f801dd3cb1516" />
- </dataarea>
- </part>
- </software>
-
- <software name="grphconv">
- <description>Graphics Converter (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2015-09-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="graphics converter (4am crack) side a.dsk" size="143360" crc="d9da1eea" sha1="ce2f7cbc94914a6389fd2bed09f04fdfdb2765a4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="graphics converter (4am crack) side b.dsk" size="143360" crc="5a7fb582" sha1="fd0d6d62c5c8058282fb04088dc2da5b29df73dd" />
- </dataarea>
- </part>
- </software>
-
<software name="grphmstr">
<description>GraphMaster (cleanly cracked)</description>
<year>1984</year>
@@ -8687,45 +4697,6 @@ license:CC0-1.0
</part>
</software>
- <software name="jawbrkr">
- <description>Jawbreaker (cleanly cracked)</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-12-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="jawbreaker (4am and san inc crack).dsk" size="143360" crc="f55436ad" sha1="22063ea09385db9f5c2f285dc09fecc327b6a30e" />
- </dataarea>
- </part>
- </software>
-
- <software name="juglrb14">
- <description>Juggles' Rainbow (version 1.4) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2016-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="juggles' rainbow (4am crack).dsk" size="143360" crc="7c06ce26" sha1="72ad78d84728be4aa1198208c095cd5ae37467d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="juglrb82">
- <description>Juggles' Rainbow (Early Version) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Apple Computer</publisher>
- <info name="release" value="2016-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="juggles' rainbow (1982) (4am crack).dsk" size="143360" crc="e48d5319" sha1="9c0552c190290dde74b4414d96ce3ca0d7d16d39" />
- </dataarea>
- </part>
- </software>
-
<software name="ltlcompp">
<description>Little Computer People (cleanly cracked)</description>
<year>1986</year>
@@ -8805,39 +4776,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mthblstr">
- <description>Math Blaster (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2014-08-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster (4am crack) side a.dsk" size="143360" crc="e555976d" sha1="b8b3f31bfc70264cde2e13c024f439ac933ead7b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster (4am crack) side b.dsk" size="143360" crc="6bd32fd2" sha1="afc00c60cd1c8d401c937fb4556fbb03fb76bfee" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathman">
- <description>Math Man (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-04-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math man (4am crack).dsk" size="143360" crc="08a69116" sha1="c90a4524d58bf13040ed7bf9cacc670f33893a36" />
- </dataarea>
- </part>
- </software>
-
<software name="mathmaze">
<description>Math Maze (cleanly cracked)</description>
<year>1983</year>
@@ -8851,65 +4789,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mathrabt">
- <description>Math Rabbit (cleanly cracked)</description>
- <year>1985</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2014-04-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math rabbit (4am crack).dsk" size="143360" crc="e3b25282" sha1="6e1f2b1e27be7a9438f46ef25fe04fd7bbf0c63d" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathrb11">
- <description>Math Rabbit (version 1.1) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-08-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math rabbit 1.1 (4am crack).dsk" size="143360" crc="53cd9a2f" sha1="98bac9b9218515116c97182b11337183db93a031" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathshop">
- <description>Math Shop (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="math shop (4am crack) side a.dsk" size="143360" crc="016c176c" sha1="31d78135bd05185fbed2fb7c3e4a47ef104411ca" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="math shop (4am crack) side b.dsk" size="143360" crc="5a058721" sha1="3a7429a177c00ddd7a8bc6fd7ee052025c281ef0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathwrd2">
- <description>Math Word Problems Grade 2 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Queue</publisher>
- <info name="release" value="2014-10-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math word problems grade 2 (4am crack).dsk" size="143360" crc="42aed3e4" sha1="dbedef74f9280c321141e383579e7dd834b44728" />
- </dataarea>
- </part>
- </software>
-
<software name="megabots">
<description>Megabots (cleanly cracked)</description>
<year>1986</year>
@@ -8923,695 +4802,6 @@ license:CC0-1.0
</part>
</software>
- <software name="microz1">
- <description>Microzine 1 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-11-20"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 1 (4am crack) side a.dsk" size="143360" crc="9e666b8a" sha1="ec96944073b36f5d7464230459dfe09a9b2eca65" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 1 (4am crack) side b.dsk" size="143360" crc="cb976c03" sha1="1f5e59cf060c878952ed3c0b75eded361d349d9b" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz2">
- <description>Microzine 2 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-10-25"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 2 (4am crack) side a.dsk" size="143360" crc="72bb6ddd" sha1="9aee8893352c1d4120e9c1982376795c79d20f13" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 2 (4am crack) side b.dsk" size="143360" crc="25257804" sha1="71586b80a5615afa6d343455d83bafd2693076bc" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz3">
- <description>Microzine 3 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-06-06"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 3 (4am crack) side a.dsk" size="143360" crc="7c9bbc2b" sha1="c1236457b86e0cf323971af437f628e55edd14a7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 3 (4am crack) side b.dsk" size="143360" crc="b6b7481e" sha1="2c9873412400a825dfe1dc3176a2a70fc45be600" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz4">
- <description>Microzine 4 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-09-27"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 4 (4am crack) side a.dsk" size="143360" crc="96b1dfcc" sha1="6a491c14cf99ccb3f8e2a824a4fe01ad94d2d778" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 4 (4am crack) side b.dsk" size="143360" crc="fd39ac1c" sha1="24b5c754ab766be82b81e144c49841fad0c039af" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz5">
- <description>Microzine 5 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-18"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 5 (4am crack) side a.dsk" size="143360" crc="d7c11cf2" sha1="6c5b6d8cff999cf4830a5a417ac3afca71e7084f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 5 (4am crack) side b.dsk" size="143360" crc="518c5ae6" sha1="6c628a1cd850373c8dfdb924a41fb4e8353ac2c0" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz6">
- <description>Microzine 6 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-30"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 6 (4am crack) side a.dsk" size="143360" crc="6be25dc8" sha1="c3dfc7b20c43c82a5d121eed4c7e350c4e009a87" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 6 (4am crack) side b.dsk" size="143360" crc="e6b262e2" sha1="64a1f11e61afe1fc8cb8c84b1ae69fa9d085ee53" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz7">
- <description>Microzine 7 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-23"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 7 (4am crack) side a.dsk" size="143360" crc="591e67f8" sha1="0c49c240a23b5a85fd726ef48b69846c59ba4004" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 7 (4am crack) side b.dsk" size="143360" crc="963acf79" sha1="cdaa13217113d64d45cad49e87807bb7d6755a34" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz7b" cloneof="microz7">
- <description>Microzine 7 (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-23"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 7 (imperfect 4am crack) side a.dsk" size="143360" crc="0912f2d9" sha1="f97ce5e1a31a860ba5555b0f1d033af87eba6c46" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 7 (imperfect 4am crack) side b.dsk" size="143360" crc="963acf79" sha1="cdaa13217113d64d45cad49e87807bb7d6755a34" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz8">
- <description>Microzine 8 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-29"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 8 (4am crack) side a.dsk" size="143360" crc="cfe70144" sha1="19530e59961ff79c8c24b8be85b4517bcaacbc30" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 8 (4am crack) side b.dsk" size="143360" crc="5a596733" sha1="2e2e6b3dae2e60703e91823900cdb0bafd1cf62a" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz9">
- <description>Microzine 9 (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-23"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 9 (4am crack) side a.dsk" size="143360" crc="3f254d1a" sha1="ce91eee0736aa177ebdf980b6be36de841f25de0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 9 (4am crack) side b.dsk" size="143360" crc="b67df29c" sha1="7ffd5df5a86c6dafc580b5e63d8c27c66823177f" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz9b" cloneof="microz9">
- <description>Microzine 9 (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-23"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 9 (imperfect 4am crack) side a.dsk" size="143360" crc="6f29d83b" sha1="bfe3a40473da56bc0e020ad8423b68a6b7fdbd29" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 9 (imperfect 4am crack) side b.dsk" size="143360" crc="e67167bd" sha1="feebeb1e9dce3ed06322256f67d8da963b486be0" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz11">
- <description>Microzine 11 (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-23"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 11 (4am crack) side a.dsk" size="143360" crc="0abc0997" sha1="3bb156c59d8cd499751485c3499333d65da329b4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 11 (4am crack) side b.dsk" size="143360" crc="69dbf006" sha1="5b30ed2febb8d290b3570d6dce3983afd6522de6" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz12">
- <description>Microzine 12 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-15"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 12 (4am crack) side a.dsk" size="143360" crc="4e34eb06" sha1="3c5efbbd14b9fab9df9c9e1ef6d1ca045e70902c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 12 (4am crack) side b.dsk" size="143360" crc="ba3ee938" sha1="68a23c114a1f47e1b925e3898d7ca7459a5561ed" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz13">
- <description>Microzine 13 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-22"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 13 (4am crack) side a.dsk" size="143360" crc="101b052b" sha1="7d79c8b905b5759bb586cd87b96a71cf82b9c01d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 13 (4am crack) side b.dsk" size="143360" crc="eeeb2466" sha1="df92e9da8127c02d7bf856e05e3ede430266cfcd" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz14">
- <description>Microzine 14 (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-01-27"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 14 (4am crack) side a.dsk" size="143360" crc="d85e30b8" sha1="be0ff9c0d7d46cb57a3106de4ef7ba8ee23d8eee" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 14 (4am crack) side b.dsk" size="143360" crc="194f42a3" sha1="57e4ef80ae4be866e153e6c7feaf579995fcb53c" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz14b" cloneof="microz14">
- <description>Microzine 14 (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-01-27"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 14 (imperfect 4am crack) side a.dsk" size="143360" crc="a57b307f" sha1="5d0a1364bfd62c1451ba8a1a1c770a06a14ab4a3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 14 (imperfect 4am crack) side b.dsk" size="143360" crc="6c3093e1" sha1="6771508ffbeed75a6007888df944250ced006e77" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz15">
- <description>Microzine 15 (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-28"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 15 (4am crack) side a.dsk" size="143360" crc="4d657f14" sha1="f596ce8e2baa51165ac48a6e2817b9e35ee29384" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 15 (4am crack) side b.dsk" size="143360" crc="480860b7" sha1="a96328311c52e7485c263665b32ad217cd7b9ce4" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz16">
- <description>Microzine 16 (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-28"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 16 (4am crack) side a.dsk" size="143360" crc="bc17e015" sha1="762ffd978514ff11375def0cef2dd3d98f5daf3d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 16 (4am crack) side b.dsk" size="143360" crc="4d55c818" sha1="6ca337e6b6cdf9cd359add5af663920e7f758842" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz17">
- <description>Microzine 17 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-15"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 17 (4am crack) side a.dsk" size="143360" crc="1ae5dafb" sha1="e6f094eac3eef6aeb087e216cd06cb9a19b48636" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 17 (4am crack) side b.dsk" size="143360" crc="0b54abab" sha1="1bc21af7fbb0b487f2cefdcd8bc8aefe6d41dadb" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz18">
- <description>Microzine 18 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-15"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 18 (4am crack) side a.dsk" size="143360" crc="5629d036" sha1="9d4056e9cc7e15837ee7130acf6a191feb6ebff5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 18 (4am crack) side b.dsk" size="143360" crc="de57b45a" sha1="7bcec7ca4b8c850ca320633d22f1b79503252869" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz19">
- <description>Microzine 19 (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-03"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 19 (4am crack) side a.dsk" size="143360" crc="017db69b" sha1="ffea42ceb5b2dce7e07ec1a2a00f31fb2bb1f7cb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 19 (4am crack) side b.dsk" size="143360" crc="8851de17" sha1="6a163f247a6951303c40c48db43380979b636520" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz20">
- <description>Microzine 20 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-16"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 20 (4am crack) side a.dsk" size="143360" crc="06366c44" sha1="4b89af730aeb13dd468986401d24f24ae4ed27a3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 20 (4am crack) side b.dsk" size="143360" crc="a7aae272" sha1="72cf4c2039500d8f790a7c7d692c1727c25fa299" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz21">
- <description>Microzine 21 (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-03"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 21 (4am crack) side a.dsk" size="143360" crc="f1dfb9a1" sha1="766968384da072fb8f4b8d2e7975d8cfa14b0325" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 21 (4am crack) side b.dsk" size="143360" crc="ddf708c5" sha1="a73c3e3812edfa8192ff38ae3d689b12a45cb84f" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz22">
- <description>Microzine 22 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-16"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 22 (4am crack) disk 1 side a.dsk" size="143360" crc="3d7ff291" sha1="5d2a09f8f00c74aa521711f8a4a65e8f988fba45" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 22 (4am crack) disk 1 side b.dsk" size="143360" crc="8bba3bf3" sha1="e218a1f1851bf15e6683519d773ec6bebd6e9549" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 22 (4am crack) disk 2.dsk" size="143360" crc="6680bd05" sha1="83b165874ab626007a5438fe3336f607266538da" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz23">
- <description>Microzine 23 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-09-30"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 23 (4am crack) side a.dsk" size="143360" crc="f889c02f" sha1="400706e9421826d0aa4db897b3ac3fcfa3c757d5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 23 (4am crack) side b.dsk" size="143360" crc="29f864ad" sha1="059d64998daa7579a2d17bf7a2205d58f9e912f4" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz24">
- <description>Microzine 24 (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-03"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 24 (4am crack) disk 1 side a.dsk" size="143360" crc="e7862317" sha1="869a6a75c17e8a36453bf2b744338fa26aa156c4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 24 (4am crack) disk 1 side b.dsk" size="143360" crc="c6fb87ab" sha1="29cc0fcb3056114f16f65cb9882798eac11ba870" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 24 (4am crack) disk 2.dsk" size="143360" crc="75dd81e1" sha1="45d6d33704a13e0b71acbdac7eb8923a3f7f1172" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz25">
- <description>Microzine 25 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-08-14"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 25 (4am crack) side a.dsk" size="143360" crc="de74fe0a" sha1="51c8e5923503377a2e89fe15dc8a97fcc33b2c60" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 25 (4am crack) side b.dsk" size="143360" crc="45e94581" sha1="13f3c3179ab4f47905f0732956c70d36ec37b54a" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz26">
- <description>Microzine 26 (cleanly cracked)</description>
- <year>????</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-08-20"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 26 (4am crack) side a.dsk" size="143360" crc="f38b0586" sha1="59c4e0bd0b942e2f35b1d4bab94f90bfb01e19a7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 26 (4am crack) side b.dsk" size="143360" crc="62ddd009" sha1="525a8a3b609bffb20e32cf555e94bdfa072057a9" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz27">
- <description>Microzine 27 (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-08-03"/>
- <!-- "Microzine" is an educational disk-based magazine
- published by Scholastic between 1983 and 1992. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 27 (4am crack) disk 1 side a.dsk" size="143360" crc="dd23e9a6" sha1="c8a16a146d2ee2668bd4176f84ef6447fa59a277" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 27 (4am crack) disk 1 side b.dsk" size="143360" crc="78901b86" sha1="07ffc243b5e1efc24765652847cd2b3ca431259e" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 27 (4am crack) disk 2 side a.dsk" size="143360" crc="5e2e691b" sha1="9f250c761a6f7999b72da0235627347a90221d89" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="microzine 27 (4am crack) disk 2 side b.dsk" size="143360" crc="0eef531f" sha1="edfedfe58247cad9da28dbfbf6f0fe07c9608a68" />
- </dataarea>
- </part>
- </software>
-
<software name="mightmg1">
<description>Might and Magic: Book One - Secret of the Inner Sanctum (cleanly cracked)</description>
<year>1986</year>
@@ -9664,84 +4854,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mtwnpar12">
- <description>Moptown Parade (version 1.2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="moptown parade (4am crack).dsk" size="143360" crc="ff062b97" sha1="2d7d7b01a621c0c9aab97df33a9f983cc7568bd0" />
- </dataarea>
- </part>
- </software>
-
- <software name="msnglnksclsc">
- <description>M-ss-ng L-nks - Classics Old and New (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-01-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="m-ss-ng l-nks - classics old and new (4am crack).dsk" size="143360" crc="e77c27e8" sha1="f6daf25c36163b9531209e578666d93c54d553f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="msnglnks">
- <description>M-ss-ng L-nks (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-05-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="m-ss-ng l-nks (4am crack).dsk" size="143360" crc="e06faf5c" sha1="e79bbc293d71411f6be73687128b921856d8dd67" />
- </dataarea>
- </part>
- </software>
-
- <software name="msnglnksmicr">
- <description>M-ss-ng L-nks MicroEncyclopedia (1987 Revised Edition) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-02-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="m-ss-ng l-nks microencyclopedia (1987 revised edition) (4am crack).dsk" size="143360" crc="a457cc3e" sha1="703e7cedabe2394af56f8674f900e710e5951f94" />
- </dataarea>
- </part>
- </software>
-
- <software name="msnglnksyplit">
- <description>M-ss-ng L-nks Young People's Literature (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-09-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="m-ss-ng l-nks young people's literature (4am crack).dsk" size="143360" crc="dffcf526" sha1="a47e2ab5494c7928b06a5f0b85b6b8a9eaca1b3e" />
- </dataarea>
- </part>
- </software>
-
- <software name="msnglnksygl83">
- <description>M-ss-ng L-nks Young People's Literature (1983 Version) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-02-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="m-ss-ng l-nks young people's literature 1983 (4am crack).dsk" size="143360" crc="07750529" sha1="fc1b8aeee05765177043571e3562b67090f73411" />
- </dataarea>
- </part>
- </software>
-
<software name="sbmultdv">
<description>Multiplication and Division (cleanly cracked)</description>
<year>1987</year>
@@ -9755,59 +4867,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mrdrbt12">
- <description>Mystery Master: Murder by the Dozen (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2014-07-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="murder by the dozen (4am crack).dsk" size="143360" crc="852886ae" sha1="60f8158cca62be57309174ad8729303b73958894" />
- </dataarea>
- </part>
- </software>
-
- <software name="odd1out">
- <description>Odd One Out (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="odd one out (4am crack).dsk" size="143360" crc="92caf802" sha1="30b1e88bb7a37491592bd501a0776a2ac3128f81" />
- </dataarea>
- </part>
- </software>
-
- <software name="odd1ot90">
- <description>Odd One Out (26-AUG-1990 Version) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-05-23"/>
- <!-- This version, dated 26-AUG-1990 based on file metadata. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="odd one out 1990 (4am crack).dsk" size="143360" crc="ac9dc6d2" sha1="3553590d53726fbad5792312f463207d87bc45ba" />
- </dataarea>
- </part>
- </software>
-
- <software name="pitstop2">
- <description>Pitstop II (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-08-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pitstop ii (4am crack).dsk" size="143360" crc="6821705b" sha1="cf5d291a800c54cecfb65a69e465266d3e2319eb" />
- </dataarea>
- </part>
- </software>
-
<software name="pitfall2">
<description>Pitfall II: Lost Caverns (cleanly cracked)</description>
<year>1984</year>
@@ -9860,136 +4919,6 @@ license:CC0-1.0
</part>
</software>
- <software name="porvpara">
- <description>Spanish Grammar Review: Por vs. Para (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2014-11-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="por vs para (4am crack).dsk" size="143360" crc="4eb13da5" sha1="50dfba4195e10e5c41868e3e952daab778390254" />
- </dataarea>
- </part>
- </software>
-
- <software name="quations">
- <description>Quations (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2014-11-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="quations (4am crack).dsk" size="143360" crc="db6035e3" sha1="f7d4eb95e219d66b719238e9f680769a42b04fa5" />
- </dataarea>
- </part>
- </software>
-
- <software name="rabrobmk">
- <description>Rabbits, Robots, and a Monkey 1 (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2014-06-03"/>
- <!-- It comes on five disks; the first three disks are single-sided,
- but the last two are double-sided. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 1.dsk" size="143360" crc="264a2f9a" sha1="68403191afdd1af837443a6e037ac9c48be3d810" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 2.dsk" size="143360" crc="ea11ed4d" sha1="7b1bc9ab192ce8446c5d39844be33851cb3ae7be" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 3.dsk" size="143360" crc="ab802f81" sha1="2e3ee038325c0451f112acf1adfd8bac591582ec" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 4 side a.dsk" size="143360" crc="ab2783b6" sha1="4084d3431e329671d2151b24df328379d64bc1a2" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 4 side b.dsk" size="143360" crc="8896e26c" sha1="c9f25da4d00556fbd49d48d06fffaea04740d71e" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 5 side a.dsk" size="143360" crc="f1934c1c" sha1="4a56d970d6f363a90d9b82603b3023ded28238d0" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 5 side b.dsk" size="143360" crc="8896e26c" sha1="c9f25da4d00556fbd49d48d06fffaea04740d71e" />
- </dataarea>
- </part>
- </software>
-
- <software name="racecarr">
- <description>Race Car 'Rithmetic (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Unicorn Software Company</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="race car 'rithmetic (4am crack).dsk" size="143360" crc="136fcd47" sha1="3f3a4a5d9465366a22a1e01fc5d0b771f57be7b1" />
- </dataarea>
- </part>
- </software>
-
- <software name="radwarr">
- <description>Rad Warrior (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-05-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rad warrior (4am crack).dsk" size="143360" crc="7291bacf" sha1="89e3ff2f25b33b09a8410fcbcd1b38671d16c4dd" />
- </dataarea>
- </part>
- </software>
-
- <software name="guacmp10">
- <description>Guadalcanal Campaign (version 1.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="guadalcanal campaign v1.0 (4am and san inc crack).dsk" size="143360" crc="a1912f25" sha1="302dfe3086242aed0e3a3244f88e85413e934996" />
- </dataarea>
- </part>
- </software>
-
- <software name="guacmp11">
- <description>Guadalcanal Campaign (version 1.1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="guadalcanal campaign v1.1 (4am and san inc crack).dsk" size="143360" crc="3ad69df8" sha1="474e1ff69c7c5cb48f192417beab90f62d210a23" />
- </dataarea>
- </part>
- </software>
-
<software name="guderian">
<description>Guderian (cleanly cracked)</description>
<year>1986</year>
@@ -10042,19 +4971,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hndbasic">
- <description>Hands on BASIC Programming (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Edu-Ware</publisher>
- <info name="release" value="2016-02-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="hands on basic programming (4am crack).dsk" size="143360" crc="73839657" sha1="8c4b61a006fe751b3304fe59c5df2b6a51c4ab9f" />
- </dataarea>
- </part>
- </software>
-
<software name="hndydndy">
<description>Handy Dandy (cleanly cracked)</description>
<year>1983</year>
@@ -10127,45 +5043,6 @@ license:CC0-1.0
</part>
</software>
- <software name="highrise">
- <description>High Rise (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Micro Learn</publisher>
- <info name="release" value="2016-07-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high rise (4am crack).dsk" size="143360" crc="9d3253da" sha1="5fb49d07f25a52c33281899409c7c19a93480d30" />
- </dataarea>
- </part>
- </software>
-
- <software name="hsmathc1">
- <description>High School Math Competency Series Part I (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2016-04-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high school math competency series part i (4am crack).dsk" size="143360" crc="18fe6edc" sha1="971c6e00871fd18dddba51d05eb84aa037a64442" />
- </dataarea>
- </part>
- </software>
-
- <software name="hsmathc2">
- <description>High School Math Competency Series Part II (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2016-04-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high school math competency series part ii (4am crack).dsk" size="143360" crc="6c2b5411" sha1="a0e1cef1c39b6c654101b377140fc67dd2b4da4b" />
- </dataarea>
- </part>
- </software>
-
<software name="highseas">
<description>High Seas (cleanly cracked)</description>
<year>1987</year>
@@ -10186,224 +5063,6 @@ license:CC0-1.0
</part>
</software>
- <software name="highstks">
- <description>High Stakes (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-10-05"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high stakes (4am crack).dsk" size="143360" crc="0bc2e5c0" sha1="f36fc527412d2aada288a8e508f3266ec593f19e" />
- </dataarea>
- </part>
- </software>
-
- <software name="highstksb" cloneof="highstks">
- <description>High Stakes (imperfect clean crack)</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-10-05"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high stakes (imperfect 4am crack).dsk" size="143360" crc="ed359815" sha1="5b82f93e39ee9286c58a3f0f22248e18f330fab6" />
- </dataarea>
- </part>
- </software>
-
- <software name="hwirelgc">
- <description>High Wire Logic (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high wire logic (4am crack).dsk" size="143360" crc="6280d758" sha1="81b69cbcf55fe718dd9085703aee7d8df50ab32d" />
- </dataarea>
- </part>
- </software>
-
- <software name="homerow">
- <description>Home Row (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-07-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="home row (4am crack).dsk" size="143360" crc="3218d79e" sha1="560872a5d26482fccc2f733c4618e773c33ce1f6" />
- </dataarea>
- </part>
- </software>
-
- <software name="hwrkr21">
- <description>Homeworker (version 2.1) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2016-10-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="homeworker 2.1 (4am crack) side a.dsk" size="143360" crc="90528b80" sha1="b41be732233cf3f68cd57e33b8db7a09cdb36a5f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="homeworker 2.1 (4am crack) side b.dsk" size="143360" crc="fffef64d" sha1="4180e3eb65d555d4a8740b36de401a9db530d740" />
- </dataarea>
- </part>
- </software>
-
- <software name="homonyms">
- <description>Homonyms (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-07-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="homonyms (4am crack).dsk" size="143360" crc="5a3b51de" sha1="d9492fe9dcbe7e4f521eb72bb5003c68d2342de3" />
- </dataarea>
- </part>
- </software>
-
- <software name="homnyms2">
- <description>Homonyms 2 (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-07-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="homonyms 2 (4am crack).dsk" size="143360" crc="c3dee060" sha1="b33b2f16aca642fc2a5ef6bbc8f24d0f5a467f73" />
- </dataarea>
- </part>
- </software>
-
- <software name="mhmnyms1">
- <description>Homonyms I (Milliken) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="homonyms i (4am crack).dsk" size="143360" crc="8a55c096" sha1="68f4be124db8cf02d5c020e8c3861997b8dde236" />
- </dataarea>
- </part>
- </software>
-
- <software name="mhmnyms2">
- <description>Homonyms II and Confusing Pairs (Milliken) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="homonyms ii and confusing pairs (4am crack).dsk" size="143360" crc="b8f652db" sha1="48b1ad2a26910bc0ee0873892e39199b214f6cc5" />
- </dataarea>
- </part>
- </software>
-
- <software name="horses">
- <description>Horses (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="horses (4am crack).dsk" size="143360" crc="c380bd7b" sha1="fdfdc966d8ef1c1e7117754842ca00fd85810277" />
- </dataarea>
- </part>
- </software>
-
- <software name="hw2rsrch">
- <description>How To Do Research (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="how to do research (4am crack).dsk" size="143360" crc="08ab26cd" sha1="d79ec74e57991caf048ab0b9fe9cc755c5ac9532" />
- </dataarea>
- </part>
- </software>
-
- <software name="h2weleph">
- <description>How to Weigh An Elephant (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="how to weigh an elephant (4am crack).dsk" size="143360" crc="38ec0d92" sha1="231f6674a4f17be54ad347389c34034aca1ea9fa" />
- </dataarea>
- </part>
- </software>
-
- <software name="carrybrw">
- <description>I Can Carry and Borrow (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-07-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="i can carry and borrow (4am crack).dsk" size="143360" crc="320a88db" sha1="a499ec09f86e047f59aa9dc8b802218fbf2a6c57" />
- </dataarea>
- </part>
- </software>
-
- <software name="icancnt">
- <description>I Can Count (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-07-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="i can count (4am crack).dsk" size="143360" crc="58f4f160" sha1="970b365f7d005f30b31608c61d9b4f9407d6fb7e" />
- </dataarea>
- </part>
- </software>
-
- <software name="idamiano">
- <description>I, Damiano (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Bantam Software</publisher>
- <info name="release" value="2017-12-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="i, damiano (4am crack) side a.dsk" size="143360" crc="b4bf6510" sha1="9f4bb2562214ab6db390dd1061bba277e2e0cbb3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="i, damiano (4am crack) side b.dsk" size="143360" crc="2cb6f901" sha1="4d83c7eff36deabdbf9958fccb166cb88bb81d88" />
- </dataarea>
- </part>
- </software>
-
<software name="icdemons">
<description>Ice Demons (cleanly cracked)</description>
<year>1982</year>
@@ -10489,26 +5148,6 @@ license:CC0-1.0
</part>
</software>
- <software name="impgalac">
- <description>Imperium Galactum (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Scenario and boot"/>
- <dataarea name="flop" size="143360">
- <rom name="imperium galactum (4am and san inc crack) side a - scenario (boot).dsk" size="143360" crc="da228929" sha1="119bce687849b6167f98ae6107cfa6950890a23f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Game"/>
- <dataarea name="flop" size="143360">
- <rom name="imperium galactum (4am and san inc crack) side b - game.dsk" size="143360" crc="91a7e59c" sha1="11d28301726fd4b97ef5dbb441808733ba8be2d1" />
- </dataarea>
- </part>
- </software>
-
<software name="impfract">
<description>Improper Fractions (cleanly cracked)</description>
<year>1990</year>
@@ -10522,54 +5161,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ijonesra">
- <description>Indiana Jones in Revenge of the Ancients (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-10-02"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="indiana jones in revenge of the ancients (4am crack).dsk" size="143360" crc="409f3eea" sha1="d4bc91d1eb50fcb142b9fa3759d3262bc0e58407" />
- </dataarea>
- </part>
- </software>
-
- <software name="ijonesrab" cloneof="ijonesra">
- <description>Indiana Jones in Revenge of the Ancients (imperfect clean crack)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-10-02"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="indiana jones in revenge of the ancients (imperfect 4am crack).dsk" size="143360" crc="a668433f" sha1="4132e144c615e3b42a2523dfd27dde6f32470f5f" />
- </dataarea>
- </part>
- </software>
-
- <software name="indians">
- <description>Indians (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-04-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="indians (4am crack).dsk" size="143360" crc="f86c6c4c" sha1="43a3b89b474d26029a4d1c2a7af35e793af58fe3" />
- </dataarea>
- </part>
- </software>
-
<software name="infdlr22">
<description>Infidel (Revision 22 / 830916) (cleanly cracked)</description>
<year>1983</year>
@@ -10596,19 +5187,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ioshapes">
- <description>Inside Outside Shapes (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Random House</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="inside outside shapes (4am crack).dsk" size="143360" crc="c137f54f" sha1="22d5e4fa467c6d0ee1e1513ca2fe5107b458c2b8" />
- </dataarea>
- </part>
- </software>
-
<software name="instzoo">
<description>Instant Zoo (cleanly cracked)</description>
<year>1981</year>
@@ -10622,19 +5200,6 @@ license:CC0-1.0
</part>
</software>
- <software name="intgrphs">
- <description>Interpreting Graphs (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="interpreting graphs (4am crack).dsk" size="143360" crc="1c584075" sha1="74f16b0497e5b6130a7bca98087f0d9e33a286d7" />
- </dataarea>
- </part>
- </software>
-
<software name="intcount">
<description>Introduction to Counting (cleanly cracked)</description>
<year>1983</year>
@@ -10674,19 +5239,6 @@ license:CC0-1.0
</part>
</software>
- <software name="islbeta">
- <description>Islands of Beta (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2019-01-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="islands of beta (4am crack).dsk" size="143360" crc="42f5e0dc" sha1="20e4d10b4b51aef9d2d2a8d6a4e6284cb5dd71b1" />
- </dataarea>
- </part>
- </software>
-
<software name="agedinoeuas">
<description>Journey to the Age of Dinosaurs - Europe and Asia (cleanly cracked)</description>
<year>1990</year>
@@ -10740,26 +5292,6 @@ license:CC0-1.0
</part>
</software>
- <software name="jumbjung">
- <description>Jumbled Jungle (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2017-11-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="jumbled jungle (4am crack) side a.dsk" size="143360" crc="e834e30e" sha1="21e93889979fd13f183f47b9287f6f667d6949bb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="jumbled jungle (4am crack) side b.dsk" size="143360" crc="a97a0662" sha1="73d61a3c53c795d739bd38e984af3f54f4964de9" />
- </dataarea>
- </part>
- </software>
-
<software name="jrescblu">
<description>Jungle Rescue - Blue Level (cleanly cracked)</description>
<year>1983</year>
@@ -10773,45 +5305,11 @@ license:CC0-1.0
</part>
</software>
- <software name="kamikaze">
- <description>Kamikaze (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-11-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="kamikaze (4am crack).dsk" size="143360" crc="85e61598" sha1="82c4fae0308674022aa5bc17632ca047ef3455be" />
- </dataarea>
- </part>
- </software>
-
- <software name="kampfg11">
- <description>Kampfgruppe (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Game"/>
- <dataarea name="flop" size="143360">
- <rom name="kampfgruppe v1.1 (4am and san inc crack) disk 1 - game.dsk" size="143360" crc="4b7139e3" sha1="1574a899f859d23c0b918176ff8617e65e9b212a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Scenarios"/>
- <dataarea name="flop" size="143360">
- <rom name="kampfgruppe v1.1 (4am and san inc crack) disk 2 - scenarios.dsk" size="143360" crc="1ad1274f" sha1="4b4a87670d3ca608f290a882cca6d383a4358c93" />
- </dataarea>
- </part>
- </software>
-
<software name="kchamp">
<description>Karate Champ (cleanly cracked)</description>
<year>1985</year>
<publisher>Data East</publisher>
<info name="release" value="2018-08-29"/>
- <!-- "Centauri Alliance" is a 1990 roleplaying game by Michael Cranford, Tom Wilcox, Diane Wilcox, Gene Hamm, and Nancy Morris, and distributed by Broderbund Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -10833,19 +5331,6 @@ license:CC0-1.0
</part>
</software>
- <software name="kw1stkb">
- <description>Keyworks - First Keyboarding Skills (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyworks - first keyboarding skills (4am crack).dsk" size="143360" crc="0e78549d" sha1="7df4bd87ec4f85586e67af22c3a899c28863dfab" />
- </dataarea>
- </part>
- </software>
-
<software name="kidniki">
<description>Kid Niki (cleanly cracked)</description>
<year>1987</year>
@@ -10879,161 +5364,6 @@ license:CC0-1.0
</part>
</software>
- <software name="kingcrib">
- <description>King Cribbage (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-10-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="king cribbage (4am crack).dsk" size="143360" crc="12580b86" sha1="56da09f4644f836dfd44423c1a8ff73752ceb70f" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest">
- <description>King's Quest (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="king's quest (4am and san inc crack) disk a.dsk" size="143360" crc="b7542a8a" sha1="57df97d42cb6ba3e08a725823de2ba0f00b799a0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="king's quest (4am and san inc crack) disk b.dsk" size="143360" crc="b39dc9ff" sha1="612d93007050cd47f1216b406a7fbb62f9ab75a0" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="king's quest (4am and san inc crack) disk c.dsk" size="143360" crc="2fd0b2b2" sha1="2c179d77b3216af2d30dc083369052054258b5a9" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest2">
- <description>King's Quest II (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest ii (4am and san inc crack) disk 1a.dsk" size="143360" crc="7e9b14e5" sha1="1d15d3268ea29e7f662f8cbdef8c1667f8069c5a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest ii (4am and san inc crack) disk 1b.dsk" size="143360" crc="ed113658" sha1="4f278d131e505d5a2c7cd8bbee3d5370ce9849c5" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest ii (4am and san inc crack) disk 2a.dsk" size="143360" crc="1db10d28" sha1="209f700c675e6b97f034af7a76347512570ed145" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest ii (4am and san inc crack) disk 2b.dsk" size="143360" crc="b5ae4321" sha1="dc8a868a0f4dedaa3f51b41846de7c95e2c37b85" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest ii (4am and san inc crack) disk 3a.dsk" size="143360" crc="e21a7fdd" sha1="685ccff734d450a09583212ced5e80d9b7cdf747" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest3">
- <description>King's Quest III (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 1a.dsk" size="143360" crc="8a977778" sha1="3546df14878f201bbbb3c3c31cc33890f1b49090" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 1b.dsk" size="143360" crc="dd88b2c3" sha1="e79817ac1d65f4a3b7bde274304d5c32a0c2cf4b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 2a.dsk" size="143360" crc="5d606a41" sha1="c47e8f7d2f04a5f4019b2e62f2d592e954f04658" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 2b.dsk" size="143360" crc="f97303f2" sha1="b564a1cb29fc777cf2c833ab6109bbfdaf6adec6" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 3a.dsk" size="143360" crc="3e858fed" sha1="c5f3044de1a01e4ccfd31c4d8580daa473c5bdc4" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 3b.dsk" size="143360" crc="f8a20906" sha1="6fc0185b70afad39d965d42c804ae99d153f9823" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 4a.dsk" size="143360" crc="6c1abfc6" sha1="6832eac5192de084f800f66f7063409d289c5264" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 4b.dsk" size="143360" crc="5dc8a8a0" sha1="0c149ac6010af02eb837e8343b21514910955a28" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 5a.dsk" size="143360" crc="8b303da7" sha1="a7532a9a7b482453cfac78cdcea1f69f1ee2e9da" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="king's quest iii (4am and san inc crack) disk 5b.dsk" size="143360" crc="73b6f6f6" sha1="f24f7c5d4fee54b15a9e2707ade60d6911ff4eda" />
- </dataarea>
- </part>
- </software>
-
- <software name="kngtdt11">
- <description>Knights of the Desert (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="knights of the desert v1.1 (4am and san inc crack).dsk" size="143360" crc="40edca9f" sha1="569a58f5e4acaf8db250eba44e23621912102ee0" />
- </dataarea>
- </part>
- </software>
-
<software name="knwapple">
<description>Know Your Apple (cleanly cracked)</description>
<year>1982</year>
@@ -11073,20 +5403,6 @@ license:CC0-1.0
</part>
</software>
- <software name="krift">
- <description>Koronis Rift (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-12-03"/>
- <!-- "Koronis Rift" is a 1985 strategy game developed by Lucasfilms LLC and distributed by Epyx. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="koronis rift (4am crack).dsk" size="143360" crc="8202cf58" sha1="b103d174b027563f7f63191b529dec689e842fea" />
- </dataarea>
- </part>
- </software>
-
<software name="krelsatp">
<description>Krell's College Board SAT Preparation Series (cleanly cracked)</description>
<year>1983</year>
@@ -11186,26 +5502,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lacrkdwn">
- <description>L.A. Crackdown (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2015-08-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="l.a. crackdown (4am crack) side a.dsk" size="143360" crc="d5ba8808" sha1="021e9b590dbab2354790ea27491abd8f1ddcba91" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="l.a. crackdown (4am crack) side b.dsk" size="143360" crc="bb699ead" sha1="34b9fc9d95c011dcf1be898818a2dea14c879ab8" />
- </dataarea>
- </part>
- </software>
-
<software name="latriv">
<description>La Triviata (cleanly crack) (cleanly cracked)</description>
<year>1984</year>
@@ -11270,45 +5566,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lodgamma">
- <description>Lantern of D'Gamma (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2019-01-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lantern of d'gamma (4am crack).dsk" size="143360" crc="21812e21" sha1="9f923f1934ca6c0433cf973a006ac34d10ce9da0" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsrbounc">
- <description>Laser Bounce (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-10-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="laser bounce (4am crack).dsk" size="143360" crc="380ddd9f" sha1="450eecfa3d87e8764827980ee83aa5c40f866c63" />
- </dataarea>
- </part>
- </software>
-
- <software name="lazyjack">
- <description>Lazy Jack (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lazy jack (4am crack).dsk" size="143360" crc="68004ae5" sha1="57520de5304d6717ed37705248c2d9516eda9730" />
- </dataarea>
- </part>
- </software>
-
<software name="lrnawrd2">
<description>Learn About Words In Reading 2 (cleanly cracked)</description>
<year>1983</year>
@@ -11389,45 +5646,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lrn2time">
- <description>Learning To Tell Time (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="learning to tell time (4am crack).dsk" size="143360" crc="261db74b" sha1="3bc845f6ecf36da0049d0586c30c268e867c5c7c" />
- </dataarea>
- </part>
- </software>
-
- <software name="lrnfuzzy">
- <description>Learning with Fuzzywomp (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="learning with fuzzywomp (4am and san inc crack).dsk" size="143360" crc="1d609cb6" sha1="0e7557cf80c50aea5cabd1585c320957b0782cbb" />
- </dataarea>
- </part>
- </software>
-
- <software name="lrnleepr">
- <description>Learning with Leeper (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2016-07-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="learning with leeper (4am crack).dsk" size="143360" crc="92a7da91" sha1="3935075e64f16d1ec312e17bbeca0e5f22c4cda7" />
- </dataarea>
- </part>
- </software>
-
<software name="lgdconf">
<description>Legendary Conflict (cleanly cracked)</description>
<year>1982</year>
@@ -11441,44 +5659,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lsl1">
- <description>Leisure Suit Larry in Land of the Lounge Lizards (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 1a.dsk" size="143360" crc="a63ba30a" sha1="e9844135c13626c15d3223e5b051f69550379dc7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 1b.dsk" size="143360" crc="96177184" sha1="4aec985852dde26deb21b95e59b99257ff6f7a6d" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 2a.dsk" size="143360" crc="2ab8d3c1" sha1="ab263733c3b32411bb3d1bcfbed32e87d28d830b" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 2b.dsk" size="143360" crc="51f81965" sha1="891141e418d70052089edb8808c663f33ac8353f" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 3a.dsk" size="143360" crc="c7889e5e" sha1="65ed92ceeec7cc2715833d503e2c098b0c981214" />
- </dataarea>
- </part>
- </software>
-
<software name="letseat">
<description>Let's Eat (cleanly cracked)</description>
<year>1987</year>
@@ -11511,58 +5691,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lgfishng">
- <description>Let's Go Fishing (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="let's go fishing (4am crack).dsk" size="143360" crc="c037df88" sha1="7ec81326407298c790718f67d22a994c8657594e" />
- </dataarea>
- </part>
- </software>
-
- <software name="lgtmapsk">
- <description>Let's Go There: Beginning Map and Geography Skills (cleanly cracked)</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-06-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="let's go there - beginning map and geography skills (4am crack).dsk" size="143360" crc="68923dda" sha1="bf19c52c3b13e0267a5879506a435a67ba4ddac9" />
- </dataarea>
- </part>
- </software>
-
- <software name="llagusa">
- <description>Let's Learn About Geography - USA (cleanly cracked)</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="let's learn about geography - usa (4am crack).dsk" size="143360" crc="ae291098" sha1="991b4cf7e389a8d0ba5c0f4b71eaa6f6e0ab672d" />
- </dataarea>
- </part>
- </software>
-
- <software name="llamoney">
- <description>Let's Learn About Money (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-10-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="let's learn about money (4am crack).dsk" size="143360" crc="d5cb1ced" sha1="1c27e9499351fe256583887cb837077640363b6a" />
- </dataarea>
- </part>
- </software>
-
<software name="lettrman">
<description>Letter Man (cleanly cracked)</description>
<year>1982</year>
@@ -11576,45 +5704,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lttrrecg">
- <description>Letter Recognition (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hartley Software</publisher>
- <info name="release" value="2015-07-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="letter recognition (4am crack).dsk" size="143360" crc="eee0d2db" sha1="c285d3d8df471f797de73d3f19ad9afce16a5a66" />
- </dataarea>
- </part>
- </software>
-
- <software name="ltrrec88">
- <description>Letter Recognition (version 01.27.88) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-04-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="letter recognition v01.27.88 (4am crack).dsk" size="143360" crc="d0143e5b" sha1="b8c573344bdb94d49a113e7e97cfc85419d33f5d" />
- </dataarea>
- </part>
- </software>
-
- <software name="ltrs4you">
- <description>Letters For You (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Polarware</publisher>
- <info name="release" value="2015-07-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="letters for you (4am crack).dsk" size="143360" crc="2f0c8b80" sha1="388c29e8fdf79d22b70e072eb6fb9f466bffc973" />
- </dataarea>
- </part>
- </software>
-
<software name="libmedsk">
<description>Library and Media Skills (cleanly cracked)</description>
<year>1983</year>
@@ -11628,32 +5717,6 @@ license:CC0-1.0
</part>
</software>
- <software name="libsklls">
- <description>Library Skills - Let's Learn about the Library (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="library skills - let's learn about the library (4am crack) disk 1.dsk" size="143360" crc="766cd0c7" sha1="3422f67af3e3f9b33b26cb04ee09a45643b74027" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="library skills - let's learn about the library (4am crack) disk 2.dsk" size="143360" crc="fea922d0" sha1="c3c334e6da42077930288c47e3e19264c447d39a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="library skills - let's learn about the library (4am crack) disk 3.dsk" size="143360" crc="5b6d089a" sha1="5cce6928ee90f6399de3ac1a3cc6b768a2ff94bc" />
- </dataarea>
- </part>
- </software>
-
<software name="lppuzzls">
<description>Little People's Puzzles (cleanly cracked)</description>
<year>1984</year>
@@ -11667,109 +5730,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ltlridls">
- <description>Little Riddles (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="little riddles (4am crack) disk 1.dsk" size="143360" crc="cabe7845" sha1="586ed7705f338ffe3ce50e0e1f937e671d8c01b6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="little riddles (4am crack) disk 2.dsk" size="143360" crc="1b4e00d2" sha1="e15a4c58e4e8bf78f168efaa318a234331d53675" />
- </dataarea>
- </part>
- </software>
-
- <software name="lcksmth50c">
- <description>Locksmith (version 5.0 Revision C) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Omega MicroWare</publisher>
- <info name="release" value="2016-08-01"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="locksmith 5.0 rev c (4am crack).dsk" size="143360" crc="4174acf1" sha1="6209a736c8652151601cd2b66c41b7e912688f0f" />
- </dataarea>
- </part>
- </software>
-
- <software name="lcksmth50cb" cloneof="lcksmth50c">
- <description>Locksmith (version 5.0 Revision C) (imperfect clean crack)</description>
- <year>1983</year>
- <publisher>Omega MicroWare</publisher>
- <info name="release" value="2016-08-01"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="locksmith 5.0 rev c (imperfect 4am crack).dsk" size="143360" crc="f1babc45" sha1="2d3df1fa974832f8a9f2a2ddc8ffd580085df914" />
- </dataarea>
- </part>
- </software>
-
- <software name="lcksmth50f">
- <description>Locksmith (version 5.0 Revision F) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Omega Microware</publisher>
- <info name="release" value="2018-06-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="locksmith 5.0 rev f (4am crack).dsk" size="143360" crc="1246095e" sha1="a41321e6174368d2f6b048c2746f2709639ca447" />
- </dataarea>
- </part>
- </software>
-
- <software name="lcksmth50fb" cloneof="lcksmth50f">
- <description>Locksmith (version 5.0 Revision F) (imperfect clean crack)</description>
- <year>1983</year>
- <publisher>Omega Microware</publisher>
- <info name="release" value="2018-06-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="locksmith 5.0 rev f (imperfect 4am crack).dsk" size="143360" crc="a28819ea" sha1="1de6c7672a3f48e6dda1cd74ecd540aaafe46873" />
- </dataarea>
- </part>
- </software>
-
- <software name="loderunr">
- <description>Lode Runner (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2018-10-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lode runner (4am crack).dsk" size="143360" crc="148a8095" sha1="2293b9b3f73e207d5d9e8d62a7c29774e8ac2913" />
- </dataarea>
- </part>
- </software>
-
<software name="logclvls">
<description>Logic Levels (cleanly cracked)</description>
<year>1984</year>
@@ -11783,32 +5743,6 @@ license:CC0-1.0
</part>
</software>
- <software name="logictls">
- <description>Logic Tools (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-01-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="logic tools (4am crack).dsk" size="143360" crc="ee462ed7" sha1="5831cb4ed9a1e0aca58c88c2a4ee796b5a9bd3fd" />
- </dataarea>
- </part>
- </software>
-
- <software name="mwlngdiv">
- <description>Long Division (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-04-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="long division (4am crack).dsk" size="143360" crc="f6ede713" sha1="ba70aec5a6820c7d6f24da695a647ddd5cb48f9e" />
- </dataarea>
- </part>
- </software>
-
<software name="lordyore">
<description>Lordlings of Yore (cleanly cracked)</description>
<year>1985</year>
@@ -11822,26 +5756,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lordconq">
- <description>Lords of Conquest (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="lords of conquest (4am and san inc crack) side a.dsk" size="143360" crc="19d1dd77" sha1="e342bf48d1730e8bb0b1f5400cb61857af50ec98" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="lords of conquest (4am and san inc crack) side b.dsk" size="143360" crc="e746d78e" sha1="1257315c299df977acc32dad3840bee7b55144f4" />
- </dataarea>
- </part>
- </software>
-
<software name="lucirelm">
<description>Lucifer's Realm (cleanly cracked)</description>
<year>1984</year>
@@ -11862,19 +5776,6 @@ license:CC0-1.0
</part>
</software>
- <software name="l7splgme">
- <description>Lucky 7 Spelling Games - Elementary (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lucky 7 spelling games - elementary (4am crack).dsk" size="143360" crc="bdf2f55c" sha1="27594836a052a8a216b5914b605bdc33605e59c4" />
- </dataarea>
- </part>
- </software>
-
<software name="mladjadv">
<description>Mad Libs Writer - Adjective-Adverb Writer (cleanly cracked)</description>
<year>1984</year>
@@ -11901,19 +5802,6 @@ license:CC0-1.0
</part>
</software>
- <software name="madvntre">
- <description>Mad Venture (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Micro Lab</publisher>
- <info name="release" value="2018-11-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mad venture (4am crack).dsk" size="143360" crc="b784eef9" sha1="fc5fdafa8092f3195da19c37329dc8e0f38d8a0a" />
- </dataarea>
- </part>
- </software>
-
<software name="magcstle">
<description>Magic Castle (cleanly cracked)</description>
<year>1985</year>
@@ -11940,19 +5828,6 @@ license:CC0-1.0
</part>
</software>
- <software name="makeface">
- <description>Make A Face (cleanly cracked)</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="make a face (4am crack).dsk" size="143360" crc="c0ce6ccc" sha1="f1e1d8eda0cc21e44db831fbf5ff02edbc721f8d" />
- </dataarea>
- </part>
- </software>
-
<software name="mmansion">
<description>Maniac Mansion (cleanly cracked)</description>
<year>1987</year>
@@ -11973,59 +5848,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mglatlng">
- <description>Maps and Globes - Latitude and Longitude (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-05-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="maps and globes - latitude and longitude (4am crack) disk 1.dsk" size="143360" crc="4b077524" sha1="c6a1de752ea8f0536987271ecdf74154b234f36b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="maps and globes - latitude and longitude (4am crack) disk 2.dsk" size="143360" crc="293ae15b" sha1="e58ca22835fa54b3e2f26870460e0d8d9beed63a" />
- </dataarea>
- </part>
- </software>
-
- <software name="marauder">
- <description>Marauder (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-01-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="marauder (4am crack).dsk" size="143360" crc="3e1d27ad" sha1="5f1f31a629d51dc94ac50172e74bb52bd9528d4d" />
- </dataarea>
- </part>
- </software>
-
- <software name="mmadness">
- <description>Marble Madness (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="marble madness (4am and san inc crack) side a.dsk" size="143360" crc="e2fd1c35" sha1="9dc2dd127209ffb81deb0e52d4681b9a9ff81338" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="marble madness (4am and san inc crack) side b.dsk" size="143360" crc="3b98e16d" sha1="ce1f565c64cad221ce5d84f6413a7fdf0b507d33" />
- </dataarea>
- </part>
- </software>
-
<software name="martksht">
<description>Marianas Turkey Shoot (cleanly cracked)</description>
<year>1990</year>
@@ -12111,124 +5933,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mathnme">
- <description>Math and Me (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2018-06-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="math and me (4am crack) side a.dsk" size="143360" crc="5ed2319e" sha1="5352c1eeef481d0ad5093ca593077f5c08f562bb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="math and me (4am crack) side b.dsk" size="143360" crc="8e2f238b" sha1="022eeefae915f9d5aa39b4f619d2483e4325d625" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthblsmy">
- <description>Math Blaster Mystery (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-01-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster mystery (4am crack) disk 1.dsk" size="143360" crc="05089188" sha1="2259769286301c56cb32be27a4511d9ebc43a618" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster mystery (4am crack) disk 2.dsk" size="143360" crc="b6145178" sha1="fe5e09c35b34dda837e0f4de2ee8d9f29d7780a0" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster mystery (4am crack) disk 3.dsk" size="143360" crc="e912ff49" sha1="1dc156e0f49d6f798c84841d19571847a39d6b6b" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster mystery (4am crack) disk 4.dsk" size="143360" crc="1531679c" sha1="53be5142a4446d5ce4a01663d041503556634e53" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthblm13">
- <description>Math Blaster Mystery (version 1.3) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-09-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster mystery 1.3 (4am crack) disk 1.dsk" size="143360" crc="561fc0b7" sha1="d54f5c95cf167920e1da26f66ffde7809165c8ae" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster mystery 1.3 (4am crack) disk 2.dsk" size="143360" crc="bda9fe2e" sha1="c95e66294ed81967c4d9898a4608ff060f796e61" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthblpls">
- <description>Math Blaster Plus (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster plus (4am crack) side a.dsk" size="143360" crc="e6d8210a" sha1="55f8c2c963360ef4198f392f15d25eccaea66360" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster plus (4am crack) side b.dsk" size="143360" crc="7974488f" sha1="81a2a9614e1a27ecd3ee0d343d84dc700b473bc9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthclsl5">
- <description>Math Class Level 5 (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math class level 5 (4am crack).dsk" size="143360" crc="09d86525" sha1="0e52df951a0812b17591a5252f7d2149aed97180" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthconc1">
- <description>Math Concepts I (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-08-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math concepts i (4am crack).dsk" size="143360" crc="0bb875c3" sha1="253deb2f69c2d93e24a1e228fed1af97eac5fbdd" />
- </dataarea>
- </part>
- </software>
-
<software name="mthevryd">
<description>Math For Everyday Living (cleanly cracked)</description>
<year>1982</year>
@@ -12249,19 +5953,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mthnutsh">
- <description>Math in a Nutshell (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2015-11-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math in a nutshell (4am crack).dsk" size="143360" crc="fa85b751" sha1="79a94f8d16e086b08c44ec3587b5db30b514aae2" />
- </dataarea>
- </part>
- </software>
-
<software name="mtib113">
<description>Math Item Banks 1-13 (cleanly cracked)</description>
<year>1983</year>
@@ -12275,451 +5966,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mthlvl1">
- <description>Math Level 1 - I Can Add And Subtract (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math level 1 - i can add and subtract (4am crack).dsk" size="143360" crc="37700561" sha1="212a3c25571020808e955a9c434441fd8f5e2480" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthlvl3">
- <description>Math Level 3 - I Can Multiply and Divide (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math level 3 - i can multiply and divide (4am crack).dsk" size="143360" crc="0009b0b1" sha1="f7f3bd20bf9bd036cf8692e34c205e5b1dcd4559" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthlvl4">
- <description>Math Level 4 - Advanced Addition and Subtraction (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math level 4 - advanced addition and subtraction (4am crack).dsk" size="143360" crc="b3f18736" sha1="81356155aee90a4e6293e20cd0e9463e7443c99e" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthlvl6">
- <description>Math Level 6 - Ratio, Proportion, and Percent (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math level 6 - ratio, proportion, and percent (4am crack).dsk" size="143360" crc="5d17ef07" sha1="cfe7cf99d0c09cd3347e14119895e64571e45a53" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqad">
- <description>Math Sequences - Addition (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - addition (4am crack).dsk" size="143360" crc="61c134a2" sha1="54051b3f143b85f9fe4de1dee3319bedacdb987c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqad84">
- <description>Math Sequences - Addition (1984 Version) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - addition 1984 (4am crack).dsk" size="143360" crc="f04d7515" sha1="2e7e198879b3e26f82a7c9f0bf12df689d3afa38" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqdc">
- <description>Math Sequences - Decimals (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - decimals (4am crack).dsk" size="143360" crc="779a55bc" sha1="6ff1314b2b18ba568988c69dc333c21ffd718402" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqdv">
- <description>Math Sequences - Division (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - division (4am crack).dsk" size="143360" crc="22e2f5c9" sha1="0004f9ab857ba431c93105c94cf49bfa0ed873a9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqeq">
- <description>Math Sequences - Equations (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - equations (4am crack).dsk" size="143360" crc="2bd62c97" sha1="d17fb69e5720a31bd90f7d513e063c7f2f433bbe" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqfr">
- <description>Math Sequences - Fractions (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - fractions (4am crack).dsk" size="143360" crc="9c78035a" sha1="5624140e2781658e83011d1a7f6d4eccf9183c42" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqin">
- <description>Math Sequences - Integers (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - integers (4am crack).dsk" size="143360" crc="6e34b980" sha1="194651f4499515e7c96cc40565f500a73d885d07" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqla">
- <description>Math Sequences - Laws of Arithmetic (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - laws of arithmetic (4am crack).dsk" size="143360" crc="d4dab30a" sha1="eed4913249993059fcc1f7048e6abbf736f52392" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthsequt">
- <description>Math Sequences - Management Utilities (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-06-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - management utilities (4am crack).dsk" size="143360" crc="631bccd3" sha1="370929174aadb4ff55a31c6a201bac1ff51d35a0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqmf">
- <description>Math Sequences - Measurement Formulas (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - measurement formulas (4am crack).dsk" size="143360" crc="9b64b157" sha1="eb98ca975c1fd5e064791aa1b7c9f3a16ea336f3" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqml">
- <description>Math Sequences - Multiplication (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - multiplication (4am crack).dsk" size="143360" crc="0ec1575e" sha1="edd7e983883bbb851e0b91a6ec4c8f467176c23c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqml80">
- <description>Math Sequences - Multiplication (1980 Version) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-10-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - multiplication 1980 (4am crack).dsk" size="143360" crc="7ec155e9" sha1="ee0b47cd098f2e0061ec4f8e4e1236cc4eb7d69f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqnr">
- <description>Math Sequences - Number Readiness (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - number readiness (4am crack).dsk" size="143360" crc="3b24099c" sha1="43455de33fd3faa10bd34cf28cc7b05ad3069f1a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqnr80">
- <description>Math Sequences - Number Readiness (1980 Version) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-10-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - number readiness 1980 (4am crack).dsk" size="143360" crc="464f1c9a" sha1="8a81077d3c2a809fdaaeb54f073fad87b9e1a158" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqpr">
- <description>Math Sequences - Percents (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - percents (4am crack).dsk" size="143360" crc="f6864e40" sha1="ac25cf5c44fb45b115d03b9551cd7720ef7d8482" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqt1">
- <description>Math Sequences - Pre- and Post Tests I (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - pre- and post tests i (4am crack).dsk" size="143360" crc="e9437f1a" sha1="4637b43316dfa45b7156a5a832e6ff0a8a367458" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqt2">
- <description>Math Sequences - Pre- and Post-Tests II (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - pre- and post-tests ii (4am crack).dsk" size="143360" crc="c27aa0be" sha1="003ceaa025c41a1ad9e05c6b065848a7bb8f2b31" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqsb">
- <description>Math Sequences - Subtraction (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - subtraction (4am crack).dsk" size="143360" crc="6479dd22" sha1="41cb61063079327540b7466243ad99591f4f1a58" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqw1">
- <description>Math Sequences - Worksheet Generator (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - worksheet generator (4am crack).dsk" size="143360" crc="7e4673c1" sha1="e03f74de49e7730889b66be9ee714820c38b02b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthseqw2">
- <description>Math Sequences - Worksheet Generator II (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math sequences - worksheet generator ii (4am crack).dsk" size="143360" crc="3612ce07" sha1="29e4414936b10e35c7a2d2dd56c2c48e0cc7f594" />
- </dataarea>
- </part>
- </software>
-
- <software name="mtshp86">
- <description>Math Shop (1986-10-27 Version) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-06-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="math shop 1986-10-27 (4am crack) side a.dsk" size="143360" crc="79855249" sha1="b00423772e1279407884d11a3071295feed873aa" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="math shop 1986-10-27 (4am crack) side b.dsk" size="143360" crc="8f5ad4e3" sha1="b0698a8765151af7380af5c1d2f730f68b88363c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthtutad">
- <description>Math Tutor - Addition (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-01-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - addition (4am crack) disk 1.dsk" size="143360" crc="54280396" sha1="38da29762f058f977ee1bf831944647cccdc7c80" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - addition (4am crack) disk 2.dsk" size="143360" crc="8590b515" sha1="05e0b3cda0590ec476cc98b8a727b250f18d7c04" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthtutdc">
- <description>Math Tutor - Decimals (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-12-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - decimals (4am crack) side a.dsk" size="143360" crc="482441d5" sha1="c657f7dc0cb78914ba145677f91458faf3947129" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - decimals (4am crack) side b.dsk" size="143360" crc="1778ba6f" sha1="e03a4bdff0b6d590bd21fbbc9d7d23230c1249f9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthtutdv">
- <description>Math Tutor - Division (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-01-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - division (4am crack) disk 1.dsk" size="143360" crc="2a60510d" sha1="e0327c658af10fd0114c09e3eb4b6ba2a7f3c12c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - division (4am crack) disk 2.dsk" size="143360" crc="17ddcfb2" sha1="f9291dac23d0c78c2e1f77fb6e6e579cf61d8140" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthtutf1">
- <description>Math Tutor - Fractions Part I (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-01-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - fractions part i (4am crack) disk 1.dsk" size="143360" crc="e9fff9a7" sha1="ee663a020faa7af8407c3e77cc7894c8c028f57a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="math tutor - fractions part i (4am crack) disk 2.dsk" size="143360" crc="c63787af" sha1="1c8ffe3229290b355dd2be70980d0411b491d3c8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthtutml">
- <description>Math Tutor - Multiplication (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math tutor - multiplication (4am crack) disk 1.dsk" size="143360" crc="cdeaaf7c" sha1="77ea1352f710b38f4880198019e8cee066d4a4e7" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthtutsb">
- <description>Math Tutor: Subtraction (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-03-08"/>
- <info name="usage" value="Disk 1 remains missing." />
- <!-- 4AM only had access to disk 2. Disk 1 is still missing. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math tutor - subtraction (4am crack) disk 1.dsk" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math tutor - subtraction (4am crack) disk 2.dsk" size="143360" crc="0561257a" sha1="420d9856dcc69993637c51a0685cb250313d71bd" />
- </dataarea>
- </part>
- </software>
-
<software name="matprbl1">
<description>Mathematics Problem Solving Software Level 1 (cleanly cracked)</description>
<year>1987</year>
@@ -12826,19 +6072,6 @@ license:CC0-1.0
</part>
</software>
- <software name="matwrdg3">
- <description>Mathematics Word Problems Grade 3 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mathematics word problems grade 3 (4am crack).dsk" size="143360" crc="71c69657" sha1="a12e698502f5c123a23a8946998dc01ad332c303" />
- </dataarea>
- </part>
- </software>
-
<software name="matinvalg">
<description>Maths Invaders - Special Products and Algebraic Factors (cleanly cracked)</description>
<year>1982</year>
@@ -12891,785 +6124,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mcopnp11">
- <description>MECC-A114 Writing an Opinion Paper (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a114 writing an opinion paper v1.1 (4am crack).dsk" size="143360" crc="2c4a3959" sha1="6836ede014567f28f9aecd817cfba9a6603cd127" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcpzps12">
- <description>MECC-A116 Puzzles and Posters (version 1.2) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-09-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a116 puzzles and posters v1.2 (4am crack).dsk" size="143360" crc="e8065d81" sha1="949eac6aeb407155bc3a2b25bf905fdd722afe39" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcstgd14">
- <description>MECC-A126 Study Guide (version 1.4) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-05-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a126 study guide v1.4 (4am crack).dsk" size="143360" crc="ce5dcb2c" sha1="a032305a26620bfc1b6037e31444c442bd4f2ec1" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrt11a">
- <description>MECC-A132 MECC Writer (version 1.1a) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-06-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a132 mecc writer v1.1a (4am crack).dsk" size="143360" crc="4bc56e61" sha1="97312d304c59e63df37ef3c1384ec080aaea428d" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrpp11">
- <description>MECC-A136 MECC Graphing Primer (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a136 mecc graphing primer v1.1 (4am crack).dsk" size="143360" crc="e84acabc" sha1="8447901e9b4adab28e6e5676446436649a1e19cf" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcinfm10">
- <description>MECC-A141 MECC Information Manager (version 1.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-09-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a141 mecc information manager v1.0 (4am crack) disk 1.dsk" size="143360" crc="bac7b4c0" sha1="800de9ffafc6d62ee7fd71fb97b3972f484cde13" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a141 mecc information manager v1.0 (4am crack) disk 2.dsk" size="143360" crc="3d8b5afe" sha1="472f73d12e14a7980299d53b72c59a55cc51da36" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcinfm11">
- <description>MECC-A141 MECC Information Manager (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-09-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a141 mecc information manager v1.1 (4am crack) side a.dsk" size="143360" crc="777df2d1" sha1="7bfbab5f7f8a5d0b7f31a36e4c1f7c8cff2aedce" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a141 mecc information manager v1.1 (4am crack) side b.dsk" size="143360" crc="92bd5dc4" sha1="feedc9785a4706d8b066b5af2dec3c52ffaceef1" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwdmn11">
- <description>MECC-A153 Word Munchers (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-02-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a153 word munchers v1.1 (4am crack).dsk" size="143360" crc="4619237f" sha1="18b5f4bb6147f4aa02c6c4b947de4efb1e438de3" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcdqcm11">
- <description>MECC-A172 MECC Dataquest Composer (version 1.1) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
- <!-- This was re-cracked on Feb 28th, 2021 to patch additional RWTS
- swappers that affected the self-booting data disks it creates. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a172 mecc dataquest composer v1.1 (4am crack).dsk" size="143360" crc="ee94e2fd" sha1="4e2a864d46648752230079f36f56ca7034da0823" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcdqwc10">
- <description>MECC-A197 MECC Dataquest - The World Community (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-06-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a197 mecc dataquest - the world community v1.0 (4am crack).dsk" size="143360" crc="2f642b64" sha1="3bd5252bd32b53e73d4727938e3483c4bf79ba36" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrcm11">
- <description>MECC-A197 MECC Dataquest - The World Community (version 1.1) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a197 mecc dataquest - the world community v1.1 (4am crack).dsk" size="143360" crc="92429ea2" sha1="4166c6368a86bf89912e1a46dd7bdfe0fe5bfea0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmyso11">
- <description>MECC-A211 Mystery Objects (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-09-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a211 mystery objects v1.1 (4am crack).dsk" size="143360" crc="16fd7f16" sha1="873b85f0b60ad566f6c27f6d73095a2af560e601" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcptrn11">
- <description>MECC-A227 Patterns (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-03-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a227 patterns v1.1 (4am crack).dsk" size="143360" crc="0838f11a" sha1="8f28c3be8026571166087944f18234bde6946a04" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsppr11">
- <description>MECC-A232 Spelling Press (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-05-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a232 spelling press v1.1 (4am crack).dsk" size="143360" crc="0814259c" sha1="749091bef3e40c55fda933ef431189db25c96857" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcspat10">
- <description>MECC-A234 Spelling Puzzles and Tests (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-09-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a234 spelling puzzles and tests v1.0 (4am crack).dsk" size="143360" crc="8ccf9c1e" sha1="2c248766e5833d4ae55a016cc5f8a4df96f80a78" />
- </dataarea>
- </part>
- </software>
-
- <software name="mctcho11">
- <description>MECC-A242 Teacher Option Organizer (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a242 teacher option organizer v1.1 (4am crack).dsk" size="143360" crc="210ceb4e" sha1="43ac6f0d1e8c680bb2b5aecddf2d0e8aa00c1b45" />
- </dataarea>
- </part>
- </software>
-
- <software name="mctcho13">
- <description>MECC-A242 Teacher Option Organizer (version 1.3) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-08-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a242 teacher option organizer v1.3 (4am crack).dsk" size="143360" crc="befcbe79" sha1="dfb4052dfeadc2fb511aa88bdcfd9036521cca27" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcdqla10">
- <description>MECC-A243 MECC Dataquest - Latin America (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-12-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a243 mecc dataquest - latin america v1.0 (4am crack).dsk" size="143360" crc="147c0206" sha1="b0c2f14f65ec0c6e29cb5eb25086b4dd48e0382b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcdqes10">
- <description>MECC-A253 MECC Dataquest - Europe and Soviet Union (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-03-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a253 mecc dataquest - europe and soviet union v1.0 (4am crack).dsk" size="143360" crc="1c43f036" sha1="fa5968516e6d1399adb5b41b95210d28d35065f3" />
- </dataarea>
- </part>
- </software>
-
- <software name="mctnv10">
- <description>MECC-A277 Time Navigator Around The World (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-12-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a277 time navigator around the world v1.0 (4am crack) side a.dsk" size="143360" crc="c6509fbb" sha1="bd1f61736c54ad5456e94628518673e7a800ff9e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a277 time navigator around the world v1.0 (4am crack) side b.dsk" size="143360" crc="ecdb18b6" sha1="6e3838031f0d0523a9600679fb01c5002074e13b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mchsmk10">
- <description>MECC-A313 History Makers (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-09-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a313 history makers v1.0 (4am crack).dsk" size="143360" crc="ffde0a65" sha1="5f3cd5deafc8437818938c806f77bc25e1f790f5" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcexch10">
- <description>MECC-A316 Exploring Chaos (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-02-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a316 exploring chaos v1.0 (4am crack).dsk" size="143360" crc="4ce4b300" sha1="3c643fea34d40347ab545026ca58155cd9e8df48" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcelm135">
- <description>MECC-A702 Elementary Vol. 1 (version 3.5) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-02-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a702 elementary vol. 1 v3.5 (4am crack).dsk" size="143360" crc="6970dbf5" sha1="55dd9caa3316d3c72255b2bb8f45efc3c3bdc58c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcelm232">
- <description>MECC-A703 Elementary Vol. 2 (version 3.2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-03-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a703 elementary vol. 2 v3.2 (4am crack).dsk" size="143360" crc="f0a317f2" sha1="567196ae736b8b2658297eac44da7fd24b281fee" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcelm345">
- <description>MECC-A704 Elementary Vol. 3 Science (version 4.5) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a704 elementary vol. 3 science v4.5 (4am crack).dsk" size="143360" crc="45c61eef" sha1="b244f1e5040b6266e285ecefdaba0bcbb2349b14" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcelm347">
- <description>MECC-A704 Elementary vol. 3 (version 4.7) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2018-07-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a704 elementary vol. 3 v4.7 (4am crack).dsk" size="143360" crc="9620d530" sha1="e7a40bee7965a62e0b10be5866a31667714b7a7a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcelm348">
- <description>MECC-A704 Elementary Vol. 3 (version 4.8) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-10-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a704 elementary vol. 3 v4.8 (4am crack).dsk" size="143360" crc="46b21887" sha1="f2d09a96a8374024d547a5aa2c63fd699e466d03" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsci122">
- <description>MECC-A708 Science Vol. 1 (version 2.2) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-09-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a708 science vol. 1 v2.2 (4am crack).dsk" size="143360" crc="4da4c14e" sha1="427a70a55c9beed6409bfeec5d2bb53d951f49f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmst122">
- <description>MECC-A712 Music Theory Vol. 1 (version 2.2) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a712 music theory vol. 1 v2.2 (4am crack).dsk" size="143360" crc="3dfaaf92" sha1="b80ced1e7d3dfb258fc93b46737b0b298430a6af" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcbs1u45">
- <description>MECC-A714 Business vol. 1 - Utilities (version 4.5) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-10-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a714 business vol. 1 - utilities v4.5 (4am crack).dsk" size="143360" crc="d86dd84d" sha1="2a65d7946f4fba09a41fca613062e1c20782627f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcbus315">
- <description>MECC-A721 Business vol. 3 (version 1.5) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a721 business vol. 3 v1.5 (4am crack).dsk" size="143360" crc="20462bd4" sha1="da6f2caddeebee10c1f2d9c2c86e045d14fc94db" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcelm613">
- <description>MECC-A725 Elementary Vol. 6 (version 1.3) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-02-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a725 elementary vol. 6 v1.3 (4am crack).dsk" size="143360" crc="48f81fe8" sha1="1d9b89a3bb70543d1e9fa092c1f00c6edec7fe60" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcspl130">
- <description>MECC-A726 Spelling Vol. 1 (version 3.0) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-02-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a726 spelling vol. 1 v3.0 (4am crack).dsk" size="143360" crc="c349f5fb" sha1="410b8807f44ff6ead25316d6ff2ad94d9930cc06" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmth312">
- <description>MECC-A738 Mathematics Vol. 3 (version 1.2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2018-02-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a738 mathematics vol. 3 v1.2 (4am crack).dsk" size="143360" crc="05cc380f" sha1="f79741ad323b6ac8774ffa78a12ad2bad12e97cd" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmth413">
- <description>MECC-A744 Mathematics vol. 4 (version 1.3) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2018-07-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a744 mathematics vol. 4 v1.3 (4am crack).dsk" size="143360" crc="29201f0d" sha1="4cb3d7bd57b79bb7af1b0d165d38f1d311a6c909" />
- </dataarea>
- </part>
- </software>
-
- <software name="mceng112">
- <description>MECC-A746 English Vol. 1 (version 1.2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2018-01-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a746 english vol. 1 v1.2 (4am crack).dsk" size="143360" crc="50799468" sha1="ae8391897bfff1d82e46c649fee81d52f194cadc" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcnut212">
- <description>MECC-A753 Nutrition vol. 2 (version 1.2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a753 nutrition vol. 2 v1.2 (4am crack).dsk" size="143360" crc="d7f7abe5" sha1="e37e720be519f2ee65ce07985bac3544273bc181" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfdft10">
- <description>MECC-A756 Food Facts (version 1.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-09-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a756 food facts v1.0 (4am crack).dsk" size="143360" crc="0b27e7ea" sha1="33f3cc36f64e5d71a1196f0680ac42462fc23c4b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfdft12">
- <description>MECC-A756 Food Facts (version 1.2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-04-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a756 food facts v1.2 (4am crack).dsk" size="143360" crc="f01a8013" sha1="3e0aafbe0300760f714bfa8b44e65517691b096a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mchim11">
- <description>MECC-A761 Health Immunization (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a761 health immunization v1.1 (4am crack).dsk" size="143360" crc="44707bce" sha1="3d8db5ff22779a6bdb424de9c3ad5a4f7178ccd1" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfrcm10">
- <description>MECC-A779 The Friendly Computer (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-03-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a779 the friendly computer v1.0 (4am crack).dsk" size="143360" crc="b9766c14" sha1="7c46c4d8001bf649bdb7a482669c3112a0e70730" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwacs10">
- <description>MECC-A785 Writing A Character Sketch (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-08-02"/>
- <!-- This was updated on Feb 23rd, 2021 to fix the hidden CTRL-A
- administrative menu crashing due to an incomplete crack. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a785 writing a character sketch v1.0 (4am crack).dsk" size="143360" crc="608ea78b" sha1="8b65a6841d5615ecf39806478d7a355f09484ab5" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgdle14">
- <description>MECC-A787 Guide de l'Enseignant (version 1.4) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2016-11-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a787 guide de l'enseignant v1.4 (4am crack).dsk" size="143360" crc="bee8947d" sha1="59ad6c2eb678b4e5d2b957ae60e58f5152ec0099" />
- </dataarea>
- </part>
- </software>
-
- <software name="mc3rmc11">
- <description>MECC-A811 The Three R's of Microcomputing (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a811 the three r's of microcomputing v1.1 (4am crack).dsk" size="143360" crc="34a20bd6" sha1="5a6716f6b182f5cf956afaa44a76893bdca5dd66" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcnmsy11">
- <description>MECC-A819 Number Systems (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a819 number systems v1.1 (4am crack).dsk" size="143360" crc="7d2e8139" sha1="a3411af801385f869b6680b2586c30a353fb910f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcprob10">
- <description>MECC-A821 Probability (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2018-02-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a821 probability v1.0 (4am crack).dsk" size="143360" crc="de1ff340" sha1="d1f08ed1e6c6c1274f4fad580ca95fae09638432" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcnutf12">
- <description>MECC-A822 Nutrition and Food Groups (version 1.2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2018-01-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a822 nutrition and food groups v1.2 (4am crack).dsk" size="143360" crc="c7dfa14c" sha1="c2cb7e2e7ae75a521572152329f3b473f79509f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcclsf11">
- <description>MECC-A824 Classification (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a824 classification v1.1 (4am crack).dsk" size="143360" crc="c1057864" sha1="73f8b7434ea969340e8f075a57da3f65fa8fe98b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsoli">
- <description>MECC-H111A Spare Moments Solitaire (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-11-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-h111a spare moments solitaire (4am crack).dsk" size="143360" crc="7a3bda7b" sha1="e0ab3ca75fb1721aa4178e77ac3f6bf75443a0c2" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwafrnd">
- <description>MECC-H111B Spare Moments with a Friend (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-11-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-h111b spare moments with a friend (4am crack).dsk" size="143360" crc="a10f239e" sha1="d91ec199ecc1dbc37c34636de67b238c7712b269" />
- </dataarea>
- </part>
- </software>
-
- <software name="mechbr12">
- <description>Mech Brigade (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Game and boot"/>
- <dataarea name="flop" size="143360">
- <rom name="mech brigade v1.2 (4am and san inc crack) disk 1 - game (boot).dsk" size="143360" crc="d980a62d" sha1="d3045577dc03d823c4c20e8195f3ec68cbcd9451" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Scenario"/>
- <dataarea name="flop" size="143360">
- <rom name="mech brigade v1.2 (4am and san inc crack) disk 2 - scenario.dsk" size="143360" crc="f115d3cf" sha1="9f4f9b759e236ba6ed6d8092ed6fb78d95301eea" />
- </dataarea>
- </part>
- </software>
-
- <software name="meetpres">
- <description>Meet The Presidents (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Softsmith</publisher>
- <info name="release" value="2015-05-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="meet the presidents (4am crack) disk 1.dsk" size="143360" crc="3b8c1637" sha1="34f163cc86f650e55057e3038473937e29dfbf28" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="meet the presidents (4am crack) disk 2.dsk" size="143360" crc="8d38a788" sha1="cb996e3dbec4d5c1ad7f139606e8d47557a26859" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="meet the presidents (4am crack) disk 3.dsk" size="143360" crc="34b07a92" sha1="ebc9288035856ef0b51aad93afac8df6b49f18c2" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="meet the presidents (4am crack) disk 4.dsk" size="143360" crc="3961fd70" sha1="cfce4d1391268eba05cb2adb56726b2035920cd4" />
- </dataarea>
- </part>
- </software>
-
- <software name="memblbl">
- <description>Memory Building Blocks (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-09-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="memory building blocks (4am crack).dsk" size="143360" crc="920d72aa" sha1="134b757c80271f2bdef3c15b3f62ff1bfbe65618" />
- </dataarea>
- </part>
- </software>
-
- <software name="membl89">
- <description>Memory Building Blocks (1989 Version) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-05-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="memory building blocks 1989 (4am crack).dsk" size="143360" crc="0d26696e" sha1="7ed271f29776dd32e1b9374520fdce3697aa33c4" />
- </dataarea>
- </part>
- </software>
-
- <software name="memcst83">
- <description>Memory Castle (1983 Version) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="memory castle 1983 (4am crack).dsk" size="143360" crc="9478ed1e" sha1="170aa3d36733aa9343a4590df1c23a63f44396f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mmatch86">
- <description>Memory Match (version 01.24.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-12-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="memory match 01.24.86 (4am crack).dsk" size="143360" crc="13ba215a" sha1="c4b99793ee9793763f7d6755331018385344d36f" />
- </dataarea>
- </part>
- </software>
-
<software name="meminder">
<description>Memory Minder (cleanly cracked)</description>
<year>1984</year>
@@ -13690,32 +6144,6 @@ license:CC0-1.0
</part>
</software>
- <software name="microadd">
- <description>Micro Addition (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2016-08-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro addition (4am crack).dsk" size="143360" crc="10e7aefc" sha1="c9f05bff90fac6c7abcf31a6acc0ee8965248468" />
- </dataarea>
- </part>
- </software>
-
- <software name="microdiv">
- <description>Micro Division (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2016-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro division (4am crack).dsk" size="143360" crc="e6d86580" sha1="dfdaabce438fb5b075ef6c3970ea995b61653f55" />
- </dataarea>
- </part>
- </software>
-
<software name="microhab">
<description>Micro Habitats (cleanly cracked)</description>
<year>1984</year>
@@ -13729,204 +6157,6 @@ license:CC0-1.0
</part>
</software>
- <software name="miclbasb">
- <description>Micro League Baseball (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Stoneware</publisher>
- <info name="release" value="2017-11-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro league baseball (4am crack).dsk" size="143360" crc="ee6237b4" sha1="e77be478ca53962269d875b9742dda50475272e9" />
- </dataarea>
- </part>
- </software>
-
- <software name="micromul">
- <description>Micro Multiplication (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2016-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro multiplication (4am crack).dsk" size="143360" crc="8f87468f" sha1="4728a423315f032f3562702d75a0a9718b1b9796" />
- </dataarea>
- </part>
- </software>
-
- <software name="microbe">
- <description>Microbe (supports Mockingboard) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2017-04-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="microbe (supports mockingboard)(4am crack).dsk" size="143360" crc="ab19e7b6" sha1="aa7842f68f60f3ac55c502ea423f6fc8958b37cd" />
- </dataarea>
- </part>
- </software>
-
- <software name="microbe3">
- <description>Microbe (Revision 3) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2017-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="microbe rev. 3 (4am crack).dsk" size="143360" crc="287270b1" sha1="3f9a1950131310c3cbaf5b45c7992ec4748e662f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds1pls">
- <description>Micro-LADS 1 Plurals and Noun-Verb Agreement (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 1 plurals and noun-verb agreement (4am crack).dsk" size="143360" crc="6dad9d98" sha1="9b5b16ea2e00a1e21edaffbeeaee5d6ebd169bb9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds2vf">
- <description>Micro-LADS 2 Verb Forms (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 2 verb forms (4am crack).dsk" size="143360" crc="3709e7bc" sha1="18b2b5e5cc9a93cb2fe3c88cfec1fdcd44e274b4" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds3prp">
- <description>Micro-LADS 3 Prepositions (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 3 prepositions (4am crack).dsk" size="143360" crc="9b6a204f" sha1="1f2f134486f43e598b563cf759fe6ed9b5d3c985" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds4prn">
- <description>Micro-LADS 4 Pronouns (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 4 pronouns (4am crack).dsk" size="143360" crc="fa9c708b" sha1="1a8cc921112a24404d39d188dce7abbbd527afbf" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds5ng">
- <description>Micro-LADS 5 Negatives (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 5 negatives (4am crack).dsk" size="143360" crc="244e65c5" sha1="ce6752867230430e35dbea0dfe91bc4420f9dc2c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds6de">
- <description>Micro-LADS 6 Deictic Expressions, Passive, and WH-questions (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 6 deictic expressions, passive, and wh-questions (4am crack).dsk" size="143360" crc="1fa593ca" sha1="190dde1093f0f759dc2f5d848a6358d351cbe43c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mlds7pr2">
- <description>Micro-LADS 7 Prepositions II (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2016-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="micro-lads 7 prepositions ii (4am crack).dsk" size="143360" crc="35a599f2" sha1="056372e56805dabad02d3e193d1f1b54d558d93a" />
- </dataarea>
- </part>
- </software>
-
- <software name="micrjrny">
- <description>Microscopic Journey (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-10-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="microscopic journey (4am crack).dsk" size="143360" crc="78479c3f" sha1="02ab3f200a412f472ad8a63d90583b08072039f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcorgtrl">
- <description>MECC-A157 Oregon Trail (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2019-05-29"/>
- <!-- This was redumped on Feb 21st, 2021 to fix data corruption
- that would cause the game to crash immediately on leaving town. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a157 the oregon trail v1.1 (4am crack) side a.dsk" size="143360" crc="f67db23d" sha1="3762550258fbc0656783fac49bd7a24c4a32b599" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a157 the oregon trail v1.1 (4am crack) side b.dsk" size="143360" crc="75f2eb62" sha1="69643b521e6fa7f2e41a90f0e49881e311a42c55" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcortr14">
- <description>MECC-A157 Oregon Trail (version 1.4) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2014-07-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a157 the oregon trail v1.4 (logo crack) side a.dsk" size="143360" crc="6332b2c7" sha1="52c7a6cc3939ab6ff3e0063f87eac4d4d466d85a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a157 the oregon trail v1.4 (logo crack) side b.dsk" size="143360" crc="37cad616" sha1="e26e2e67f9891a6835c0d93e07a12b7e2d9691c7" />
- </dataarea>
- </part>
- </software>
-
<software name="mcrtutr2">
<description>MicroTutor II - Prefixes, Suffixes, Capitalization (cleanly cracked)</description>
<year>1982</year>
@@ -14006,87 +6236,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mthdrlas">
- <description>Milt's Math Drills - Addition and Subtraction (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="milt's math drills - addition and subtraction (4am crack) disk 1.dsk" size="143360" crc="dfdb0de7" sha1="d2040762d9a905d96820420ba977342e02b4cf23" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="milt's math drills - addition and subtraction (4am crack) disk 2.dsk" size="143360" crc="fae91095" sha1="591837e71d06f02b250073746f5e3fb7b1b83910" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthdrlk1">
- <description>Milt's Math Drills - K-1 Concepts (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="milt's math drills - k-1 concepts (4am crack) disk 1.dsk" size="143360" crc="c859f063" sha1="87e0131572c51b2eebc3200c0d187e729f23e50c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="milt's math drills - k-1 concepts (4am crack) disk 2.dsk" size="143360" crc="178dbbd1" sha1="c02fa9d1b92ae5f5f1f21172eb57e62d1d5a0b2f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mndcstl2">
- <description>Mind Castle II (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MCE</publisher>
- <info name="release" value="2015-05-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mind castle ii (4am crack).dsk" size="143360" crc="1837ae58" sha1="1b1877fcad8a561c138d3ab6bf4efd1dce7648d0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mindmror">
- <description>Mind Mirror (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-09-23"/>
- <!-- Disks re-cracked on September 4th, 2021 to fix additional
- delayed protection that was missed when previously cracked. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="mind mirror (4am and san inc crack) disk 1 - program.dsk" size="143360" crc="b0e4f320" sha1="cb9d80fb4d5b3fb32269f4ecbd48f9f3dbf981e6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Life simulation A"/>
- <dataarea name="flop" size="143360">
- <rom name="mind mirror (4am and san inc crack) disk 2 - life simulation a.dsk" size="143360" crc="deb5215d" sha1="064d9d0f60ab7abece0eb48b79e116affd5d9a12" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Life simulation B"/>
- <dataarea name="flop" size="143360">
- <rom name="mind mirror (4am and san inc crack) disk 3 - life simulation b.dsk" size="143360" crc="57fdaa44" sha1="084e8b64eb4911cb2f53e6d22dfa1b266c050ffa" />
- </dataarea>
- </part>
- </software>
-
<software name="mndprbdm">
<description>Mind Prober demo (cleanly cracked)</description>
<year>1984</year>
@@ -14100,32 +6249,6 @@ license:CC0-1.0
</part>
</software>
- <software name="minitman">
- <description>Minit Man (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2016-07-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="minit man (4am crack).dsk" size="143360" crc="1bf28949" sha1="672bd74a7edeff788a2793a66e2039a4a5b31791" />
- </dataarea>
- </part>
- </software>
-
- <software name="misldefn">
- <description>Missile Defense (cleanly cracked)</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-12-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="missile defense (4am and san inc crack).dsk" size="143360" crc="4157f3d7" sha1="eea2e87c5f20051b2221264b72b60f49d013df48" />
- </dataarea>
- </part>
- </software>
-
<software name="msnalgbr">
<description>Mission Algebra (cleanly cracked)</description>
<year>1984</year>
@@ -14172,70 +6295,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mixdupmg">
- <description>Mixed-Up Mother Goose (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mixed-up mother goose (4am and san inc crack) disk 1a.dsk" size="143360" crc="21368bfa" sha1="347bbee5d8fe8e94b94d7c17aad88d17e2bf565e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mixed-up mother goose (4am and san inc crack) disk 1b.dsk" size="143360" crc="2ad65640" sha1="53ebba068c1274b34a20746434489e15b9f3b5da" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mixed-up mother goose (4am and san inc crack) disk 2a.dsk" size="143360" crc="0ad14456" sha1="164874dc4ffc9e5fdff01ad845a55f75df33a3c3" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mixed-up mother goose (4am and san inc crack) disk 2b.dsk" size="143360" crc="dfeeac3d" sha1="4c907dd051fa51e4516bcc9e633685697f392c24" />
- </dataarea>
- </part>
- </software>
-
- <software name="moebius">
- <description>Moebius (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2016-09-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A"/>
- <dataarea name="flop" size="143360">
- <rom name="moebius (4am crack) disk a.dsk" size="143360" crc="701ecbb9" sha1="988c10658e65e67f0a05a3ae46a9af26ce588be5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="moebius (4am crack) disk b.dsk" size="143360" crc="a78c375c" sha1="d7100156c7d82e63751943cc49a7f52ecccb876f" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="moebius (4am crack) disk c.dsk" size="143360" crc="06fca9ab" sha1="25afac1f8116413b5f036fc00372c37e9a85ce3f" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D"/>
- <dataarea name="flop" size="143360">
- <rom name="moebius (4am crack) disk d.dsk" size="143360" crc="bc0a216b" sha1="14ab40bc41c85133d416523d15da0b45df325776" />
- </dataarea>
- </part>
- </software>
-
<software name="mnymnchr">
<description>Money Munchers (cleanly cracked)</description>
<year>1982</year>
@@ -14262,38 +6321,6 @@ license:CC0-1.0
</part>
</software>
- <software name="monsmons">
- <description>Monstrous Monsters (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="monstrous monsters (4am crack) disk 1 - program.dsk" size="143360" crc="4394ac67" sha1="b5a0303d21cd3a1ac4b9858e7bcdef0415e7d0ec" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Frames and fonts"/>
- <dataarea name="flop" size="143360">
- <rom name="monstrous monsters (4am crack) disk 2 - frames and fonts.dsk" size="143360" crc="832b07a3" sha1="9248d1acd604b2c2768c3692136dfbdf2e8e129c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Posters"/>
- <dataarea name="flop" size="143360">
- <rom name="monstrous monsters (4am crack) disk 3 - posters.dsk" size="143360" crc="f7522e02" sha1="51065b679535be9c6c32c4606d22d94b8b29e8b8" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Clip art"/>
- <dataarea name="flop" size="143360">
- <rom name="monstrous monsters (4am crack) disk 4 - clip art.dsk" size="143360" crc="ac749d1c" sha1="cc29f81b6daa55b3dfa29693c727e0e5dd592e69" />
- </dataarea>
- </part>
- </software>
-
<software name="mtscrb20">
<description>Monty Plays Scrabble (version 2.0) (cleanly cracked)</description>
<year>1981</year>
@@ -14333,58 +6360,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mptwn81">
- <description>Moptown (1981 Version) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Apple Computer</publisher>
- <info name="release" value="2016-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="moptown (1981) (4am crack).dsk" size="143360" crc="a1d53302" sha1="3e3b3bdcdb4c1aac4613b40dd09bda3094e87676" />
- </dataarea>
- </part>
- </software>
-
- <software name="mptwnhtl">
- <description>Moptown Hotel (cleanly cracked)</description>
- <year>1981</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-01-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="moptown hotel (4am crack).dsk" size="143360" crc="354f51cc" sha1="343b4be8e781c49d279b3990728cae7b5607aea8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mptwnh13">
- <description>Moptown Hotel (version 1.3) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-07-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="moptown hotel 1.3 (4am crack).dsk" size="143360" crc="f7a61838" sha1="ad70f3d9908c3368ee52c67cc5d5c3018623ed66" />
- </dataarea>
- </part>
- </software>
-
- <software name="mtrcycls">
- <description>Motorcycles (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="motorcycles (4am crack).dsk" size="143360" crc="2c9acbc9" sha1="1a25968baf857cba811ce32f92558d80ae067747" />
- </dataarea>
- </part>
- </software>
-
<software name="mtnclmce">
<description>Mountain Climbing - Cause and Effect (cleanly cracked)</description>
<year>1982</year>
@@ -14398,26 +6373,6 @@ license:CC0-1.0
</part>
</software>
- <software name="moviemakr">
- <description>Movie Maker (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="movie maker (4am and san inc crack) side a.dsk" size="143360" crc="1caa17ed" sha1="94b6f4463601c944ed55677a0fd8745a3e038d21" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="movie maker (4am and san inc crack) side b.dsk" size="143360" crc="6e65dd04" sha1="60c518a452a20b6292a0e65a1e6bb97f610445eb" />
- </dataarea>
- </part>
- </software>
-
<software name="mpotatoh">
<description>Mr. and Mrs. Potato Head (cleanly cracked)</description>
<year>1985</year>
@@ -14451,80 +6406,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mrcool">
- <description>Mr. Cool (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-01-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mr. cool (4am crack).dsk" size="143360" crc="bdf33836" sha1="5b267d4a5c237801f38742f8fc79e9a708d3509a" />
- </dataarea>
- </part>
- </software>
-
- <software name="pxcartnk">
- <description>Mr. Pixel's Cartoon Kit (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-09-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mr. pixel's cartoon kit (4am crack).dsk" size="143360" crc="78ca3f2a" sha1="40ce67a0a50dadfca402e990121e337fd4f4e4fb" />
- </dataarea>
- </part>
- </software>
-
- <software name="pxcartnkb" cloneof="pxcartnk">
- <description>Mr. Pixel's Cartoon Kit (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-09-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mr. pixel's cartoon kit (imperfect 4am crack).dsk" size="143360" crc="2b8b52ac" sha1="381964a5653447508c2a7fb37189549460d09cff" />
- </dataarea>
- </part>
- </software>
-
- <software name="pxppaint">
- <description>Mr. Pixel's Programming Paint Set (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2015-12-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mr. pixel's programming paint set (4am crack).dsk" size="143360" crc="933d11c5" sha1="de75a5af2f68d2da27b2438ef138c65103f2cb92" />
- </dataarea>
- </part>
- </software>
-
- <software name="mrpengs">
- <description>Mr. Popper's Penguins (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-06-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mr. popper's penguins (4am crack).dsk" size="143360" crc="6db1639e" sha1="29c83851cedb3e49856f8c2d4e2dd49972cb99e9" />
- </dataarea>
- </part>
- </software>
-
<software name="mrrobot">
<description>Mr. Robot and His Robot Factory (cleanly cracked)</description>
<year>1984</year>
@@ -14538,81 +6419,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mrswiggl">
- <description>Mrs. Wigglesworth's Secret (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mrs. wigglesworth's secret (4am crack).dsk" size="143360" crc="ea5d5045" sha1="35a706c951cc7b584f5683e396c83c14610af702" />
- </dataarea>
- </part>
- </software>
-
- <software name="mudpies">
- <description>Mud Pies (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mud pies (4am crack).dsk" size="143360" crc="49e7967b" sha1="e563e186b0c4065f7eaffe6ed74151e34202b95b" />
- </dataarea>
- </part>
- </software>
-
- <software name="multchoi">
- <description>Multiple Choices (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-06-01"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="multiple choices (4am crack) side a.dsk" size="143360" crc="d7e0a365" sha1="bcd4500430fb849d62f018ac00b8954b24597e4b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="multiple choices (4am crack) side b.dsk" size="143360" crc="5c4b47c6" sha1="ab32e3c123718f5f799b87af30eac768fb35966b" />
- </dataarea>
- </part>
- </software>
-
- <software name="multchoib" cloneof="multchoi">
- <description>Multiple Choices (imperfect clean crack)</description>
- <year>1989</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-06-01"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="multiple choices (imperfect 4am crack) side a.dsk" size="143360" crc="3117deb0" sha1="9931ff0d391fc48c93292e096aa678a3db8a04f2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="multiple choices (imperfect 4am crack) side b.dsk" size="143360" crc="5c4b47c6" sha1="ab32e3c123718f5f799b87af30eac768fb35966b" />
- </dataarea>
- </part>
- </software>
-
<software name="plmulti">
<description>Multiplication (Prescription Learning) (cleanly cracked)</description>
<year>1980</year>
@@ -14806,91 +6612,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mumcurse">
- <description>Mummy's Curse (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Highland Computers</publisher>
- <info name="release" value="2018-09-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mummy's curse (4am crack).dsk" size="143360" crc="d2081297" sha1="89f91d4863d4738845743d8526bc41161e2401d8" />
- </dataarea>
- </part>
- </software>
-
- <software name="muptslat">
- <description>Muppet Slate (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="muppet slate (4am crack) disk 1 - boot.dsk" size="143360" crc="5febc568" sha1="73b1f66f186c56a16d8a6db4bf293f98301abd31" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Student disk"/>
- <dataarea name="flop" size="143360">
- <rom name="muppet slate (4am crack) disk 2 - student disk.dsk" size="143360" crc="772dc135" sha1="57119a23d6576adabcc3cb3700c316786ce54769" />
- </dataarea>
- </part>
- </software>
-
- <software name="muptwdbk">
- <description>Muppet Word Book (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-09-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="muppet word book (4am crack).dsk" size="143360" crc="45e3d2fd" sha1="0227d7aa3d446ed3fa2dfc0a6708f49420fd810a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mptstg">
- <description>Muppets On Stage (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="muppets on stage (4am crack).dsk" size="143360" crc="fec360f9" sha1="0225c1d55451dcb8228bf77d7fb1235dd78df994" />
- </dataarea>
- </part>
- </software>
-
- <software name="mptstr2">
- <description>Muppets On Stage (Revision 2) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-06-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="muppets on stage rev. 2 (4am crack).dsk" size="143360" crc="7122a06f" sha1="f36514dc8ab2ae07d04cad61806c99f0a02bb064" />
- </dataarea>
- </part>
- </software>
-
- <software name="muptvlle">
- <description>Muppetville (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-03-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="muppetville (4am crack).dsk" size="143360" crc="01fb27fd" sha1="ad027e48ced5ab0d30f144b5da119acd2ba8b3a5" />
- </dataarea>
- </part>
- </software>
-
<software name="murdmiss">
<description>Murder on the Mississippi (cleanly cracked)</description>
<year>1986</year>
@@ -14911,19 +6632,6 @@ license:CC0-1.0
</part>
</software>
- <software name="murdzind">
- <description>Murder on the Zinderneuf (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="murder on the zinderneuf (4am and san inc crack).dsk" size="143360" crc="d2c9dd85" sha1="a9b05ee5086b70e611f33dfba735cb6d37a1ea1b" />
- </dataarea>
- </part>
- </software>
-
<software name="musfund1">
<description>Music Fundamentals I (cleanly cracked)</description>
<year>1988</year>
@@ -14950,114 +6658,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mysdblftr">
- <description>Mystery Double Feature (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-11-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mystery double feature (4am crack) side a.dsk" size="143360" crc="18795e37" sha1="d998f1c63969f20ee18df6c9bd6c4e7b74440970" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mystery double feature (4am crack) side b.dsk" size="143360" crc="5ba5504b" sha1="8ad90c38e95a7cef99c919454e26764094a9a6b7" />
- </dataarea>
- </part>
- </software>
-
- <software name="myshouse">
- <description>Mystery House (cleanly cracked)</description>
- <year>1980</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-12-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mystery house (4am crack).dsk" size="143360" crc="4d76e0bc" sha1="d32eba44cbe43ed43bb73643903c777fbb9cbf59" />
- </dataarea>
- </part>
- </software>
-
- <software name="myswtsho">
- <description>Mystery of the Witch's Shoes (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mystery of the witch's shoes (4am crack).dsk" size="143360" crc="f0cf0f70" sha1="ef31b0b93dfe65d5bb462a5f595be162c8ae017f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mystsntc">
- <description>Mystery Sentences (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-24"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mystery sentences (4am crack) side a.dsk" size="143360" crc="655f2cec" sha1="5ee04058bcdbe6a84f3d82cdefaba1c7e64c0330" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mystery sentences (4am crack) side b.dsk" size="143360" crc="bec55691" sha1="f50dd87d8d4ae7b959ed233bb76e080794975a50" />
- </dataarea>
- </part>
- </software>
-
- <software name="mystsntcb" cloneof="mystsntc">
- <description>Mystery Sentences (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-24"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mystery sentences (imperfect 4am crack) side a.dsk" size="143360" crc="3553b9cd" sha1="5c48397d8ef6cc937804a3863f567ff2bf84676b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mystery sentences (imperfect 4am crack) side b.dsk" size="143360" crc="bec55691" sha1="f50dd87d8d4ae7b959ed233bb76e080794975a50" />
- </dataarea>
- </part>
- </software>
-
- <software name="nam">
- <description>NAM (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-11-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="nam (4am crack).dsk" size="143360" crc="7e5a63aa" sha1="1197bee7be8d4dcf8e7cdfd97fc5fce37d349a58" />
- </dataarea>
- </part>
- </software>
-
<software name="nemesis">
<description>Nemesis (cleanly cracked)</description>
<year>1984</year>
@@ -15139,19 +6739,6 @@ license:CC0-1.0
</part>
</software>
- <software name="nthatl86">
- <description>North Atlantic 86 (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="north atlantic 86 (4am and san inc crack).dsk" size="143360" crc="fb1e63c0" sha1="b33928ead103f906091b6b8ab989be0cbdbf2f79" />
- </dataarea>
- </part>
- </software>
-
<software name="notecrdm">
<description>NoteCard Maker (cleanly cracked)</description>
<year>1985</year>
@@ -15172,85 +6759,6 @@ license:CC0-1.0
</part>
</software>
- <software name="nounspro">
- <description>Nouns-Pronouns (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns (4am crack) disk 1.dsk" size="143360" crc="d361b774" sha1="5a0d0a6b1803e4a5f9123121d636207425ae4315" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns (4am crack) disk 2.dsk" size="143360" crc="8088b075" sha1="125eb21e50d5f785338c9e220be196135668d81b" />
- </dataarea>
- </part>
- </software>
-
- <software name="nounspro041384">
- <description>Nouns-Pronouns (version 04.13.84) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-04-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns v04.13.84 (4am crack).dsk" size="143360" crc="c467303e" sha1="e74271c2f9baeae91f902f83122d992b5deaed7c" />
- </dataarea>
- </part>
- </software>
-
- <software name="nounspro090487">
- <description>Nouns-Pronouns (version 09.04.87) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns v09.04.87 (4am crack) disk 1.dsk" size="143360" crc="1928fb9b" sha1="38f41d82e91f4e527597227b6edaefdbc6c710fa" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns v09.04.87 (4am crack) disk 2.dsk" size="143360" crc="0cfd3366" sha1="491bcf341c6c4e3308b75076ccc3da57fbeec603" />
- </dataarea>
- </part>
- </software>
-
- <software name="nysiptp">
- <description>Now You See It Now You Don't - Pick The Part (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-03-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="now you see it now you don't - pick the part (4am crack).dsk" size="143360" crc="ab3308c4" sha1="85a4e03e2f2f3966de65c5e8e0012ffeaeb3476b" />
- </dataarea>
- </part>
- </software>
-
- <software name="nysiwit">
- <description>Now You See It Now You Don't - Was It There - Was It Missing (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-03-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="now you see it now you don't - was it there - was it missing (4am crack).dsk" size="143360" crc="f9e41f25" sha1="0ff4bb5010090ea0e617c8d1856a6c055e17017b" />
- </dataarea>
- </part>
- </software>
-
<software name="nukrctns">
<description>Nuclear Reactions (cleanly cracked)</description>
<year>1986</year>
@@ -15290,71 +6798,6 @@ license:CC0-1.0
</part>
</software>
- <software name="numbpls">
- <description>Number Please (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2018-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="number please (4am crack).dsk" size="143360" crc="d602d78b" sha1="b92aba698a15ad8ba56fa04469d7b46bb108a104" />
- </dataarea>
- </part>
- </software>
-
- <software name="nmbquest">
- <description>Number Quest (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="number quest (4am crack).dsk" size="143360" crc="c1fe8bf4" sha1="c8b9160fd81a03e0fb5a9365be34fbf1f7ff9cdc" />
- </dataarea>
- </part>
- </software>
-
- <software name="nbrstmpr">
- <description>Number Stumper (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2016-11-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="number stumper (4am crack).dsk" size="143360" crc="427caa58" sha1="514569a27d9ff0e5f25710354baafb5858e2dde2" />
- </dataarea>
- </part>
- </software>
-
- <software name="nmbwrdl1">
- <description>Number Words Level 1 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2018-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="number words level 1 (4am crack).dsk" size="143360" crc="146550b5" sha1="ee2ff0cf91950c7f1233dfb356311c9bc4fd7056" />
- </dataarea>
- </part>
- </software>
-
- <software name="ogre">
- <description>OGRE (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2015-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ogre (4am crack).dsk" size="143360" crc="d332094e" sha1="7a473c2170f27b49332fbcd45402ebc3aef6281f" />
- </dataarea>
- </part>
- </software>
-
<software name="oilrig">
<description>Oil Rig (cleanly cracked)</description>
<year>1982</year>
@@ -15368,172 +6811,6 @@ license:CC0-1.0
</part>
</software>
- <software name="oilswell">
- <description>Oil's Well (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2016-07-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="oil's well (4am crack).dsk" size="143360" crc="f37459cf" sha1="f88030fc774e1e5af46b4beb8bcacbff13f0e9da" />
- </dataarea>
- </part>
- </software>
-
- <software name="omega">
- <description>Omega (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2018-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Systems"/>
- <dataarea name="flop" size="143360">
- <rom name="omega (4am crack) disk 1a - systems.dsk" size="143360" crc="321554d2" sha1="8f4cd7ee77cd7b92a771058c46dad6915a68a819" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Operations"/>
- <dataarea name="flop" size="143360">
- <rom name="omega (4am crack) disk 1b - operations.dsk" size="143360" crc="5517783f" sha1="3c183688f31a6dbc2c834a27573551ec099e940b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Resource"/>
- <dataarea name="flop" size="143360">
- <rom name="omega (4am crack) disk 2a - resource.dsk" size="143360" crc="e2ea201b" sha1="6375b27814ef29c9110696256a5dca5e839116dc" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Sample"/>
- <dataarea name="flop" size="143360">
- <rom name="omega (4am crack) disk 2b - sample.dsk" size="143360" crc="8ce67c8a" sha1="0639b93d34c28254718a9c95ca5f8c1f60f2703c" />
- </dataarea>
- </part>
- </software>
-
- <software name="ootopos">
- <description>Oo-Topos (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Polarware</publisher>
- <info name="release" value="2018-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="oo-topos (4am crack) side a.dsk" size="143360" crc="893e44ad" sha1="a6b5efc18704857d037796fdeabb5f4d05d7b40a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="oo-topos (4am crack) side b - boot.dsk" size="143360" crc="496489cf" sha1="4877a0e92410e9a8fdeb2607777de3ae989909d7" />
- </dataarea>
- </part>
- </software>
-
- <software name="opapoc">
- <description>Operation Apocalypse (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="operation apocalypse (4am and san inc crack).dsk" size="143360" crc="37d4dd84" sha1="e1bbd5762a0805ae3afb5d1be3889dbeba657d0f" />
- </dataarea>
- </part>
- </software>
-
- <software name="opfrog">
- <description>Operation Frog (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-03"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="operation frog (4am crack) side a.dsk" size="143360" crc="9caf030e" sha1="d6ffd510537e8fe4cb44808ce0ab8f589e79d8f2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="operation frog (4am crack) side b.dsk" size="143360" crc="949b1c73" sha1="98d1b3956cbdd875b5fe23e79416881641659880" />
- </dataarea>
- </part>
- </software>
-
- <software name="opfrogb" cloneof="opfrog">
- <description>Operation Frog (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-12-03"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="operation frog (imperfect 4am crack).dsk" size="143360" crc="cca3962f" sha1="dc2cc50dd30c6bff92273d85441d79d6a22d2824" />
- </dataarea>
- </part>
- </software>
-
- <software name="opatract">
- <description>Opposites Attract (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Polarware</publisher>
- <info name="release" value="2015-01-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="opposites attract (4am crack).dsk" size="143360" crc="62ac96f6" sha1="d3a54214136a9569938fc9d2cc5621157eb6c064" />
- </dataarea>
- </part>
- </software>
-
- <software name="oppo0987">
- <description>Opposites (version 09.15.87) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="opposites v09.15.87 (4am crack) disk 1.dsk" size="143360" crc="808398f2" sha1="c2cec4adc3380cef1cb6106791c92b37d006c46a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="opposites v09.15.87 (4am crack) disk 2.dsk" size="143360" crc="cbbeeecf" sha1="fe8cbba2b8b8e3da81d708a4e064b0d89abb0b31" />
- </dataarea>
- </part>
- </software>
-
- <software name="orderopr">
- <description>Order of Operations (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-12-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="order of operations (4am crack).dsk" size="143360" crc="e19893f6" sha1="fa2999ce2e39068ec446710ed4d8e893b87cc54f" />
- </dataarea>
- </part>
- </software>
-
<software name="ordrlaws">
<description>Ordering Letters and Words (cleanly cracked)</description>
<year>1984</year>
@@ -15619,19 +6896,6 @@ license:CC0-1.0
</part>
</software>
- <software name="panzgrna">
- <description>Panzer Grenadier (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-04-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="panzer grenadier (4am crack).dsk" size="143360" crc="3cae8a0e" sha1="20a8bc42eafc963194fe773beacff2bc2af00077" />
- </dataarea>
- </part>
- </software>
-
<software name="pmdlxmas">
<description>Paper Models - The Christmas Kit (cleanly cracked)</description>
<year>1986</year>
@@ -15658,97 +6922,6 @@ license:CC0-1.0
</part>
</software>
- <software name="prqpc686">
- <description>Parquetry and Pictures (version 06.24.86) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="parquetry and pictures v06.24.86 (4am crack).dsk" size="143360" crc="99080a67" sha1="1af7c6665d94a33a367290203bbbfec9b958f4eb" />
- </dataarea>
- </part>
- </software>
-
- <software name="psnounpr">
- <description>Parts of Speech - Fun with Nouns and Pronouns (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="parts of speech - fun with nouns and pronouns (4am crack).dsk" size="143360" crc="1e513964" sha1="91783209ad5e31c39262aadbbb229312d9a6f089" />
- </dataarea>
- </part>
- </software>
-
- <software name="psverbs">
- <description>Parts of Speech - Fun with Verbs (cleanly cracked)</description>
- <year>1991</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="parts of speech - fun with verbs (4am crack).dsk" size="143360" crc="602e9caf" sha1="cedb2e02ad75698cc0f00dccedc2f2f253fea524" />
- </dataarea>
- </part>
- </software>
-
- <software name="ptwrdstm">
- <description>Pathwords (Thunder Mountain) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2017-07-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pathwords (thunder mountain) (4am crack).dsk" size="143360" crc="2c0f710a" sha1="e21d8f8eb916566c2ff75f6ef976f20477ce6522" />
- </dataarea>
- </part>
- </software>
-
- <software name="pbunyan">
- <description>Paul Bunyan (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="paul bunyan (4am crack).dsk" size="143360" crc="7ac84911" sha1="90f04bc4cca68a82b68d3cf9827f023b0397b688" />
- </dataarea>
- </part>
- </software>
-
- <software name="pecsbill">
- <description>Pecos Bill (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pecos bill (4am crack).dsk" size="143360" crc="51a5821b" sha1="53a690403581b3938fe4b5f5daae507ca1bea860" />
- </dataarea>
- </part>
- </software>
-
- <software name="pegasus2">
- <description>Pegasus II (cleanly cracked)</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-12-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pegasus ii (4am and san inc crack).dsk" size="143360" crc="11376583" sha1="c819db857ccddbdd679c92c09ec6307cd1c3a72c" />
- </dataarea>
- </part>
- </software>
-
<software name="prmav216">
<description>Perimeter, Area, and Volume (version 2.1.6) (cleanly cracked)</description>
<year>1986</year>
@@ -15848,26 +7021,6 @@ license:CC0-1.0
</part>
</software>
- <software name="phmpegas">
- <description>PHM Pegasus (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-10-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="phm pegasus (4am and san inc crack) side a.dsk" size="143360" crc="e4a26600" sha1="4d2cac5b114634ba64ee9557c2be939f6b4ee0eb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="phm pegasus (4am and san inc crack) side b.dsk" size="143360" crc="3200590b" sha1="e1c9c849093dd559db58a86d77e72f392e28f452" />
- </dataarea>
- </part>
- </software>
-
<software name="pscisnd">
<description>Physical Science Series - Sound (cleanly cracked)</description>
<year>1989</year>
@@ -15907,45 +7060,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ppar1188">
- <description>Picture Parade (version 11.24.88) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="picture parade v11.24.88 (4am crack).dsk" size="143360" crc="b2473c8a" sha1="a9faec6a88ff1c86f492fc142e0bddde017b746b" />
- </dataarea>
- </part>
- </software>
-
- <software name="pieman">
- <description>Pie-Man (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2017-08-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pie-man (4am crack).dsk" size="143360" crc="dd8efb80" sha1="088cdc2636dc09d8da1d163b2c2f8e50bd1beb31" />
- </dataarea>
- </part>
- </software>
-
- <software name="pinbcset">
- <description>Pinball Construction Set (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pinball construction set (4am and san inc crack).dsk" size="143360" crc="71c8362a" sha1="9a809dd030da376f17857b4cd74fba4cad68f01c" />
- </dataarea>
- </part>
- </software>
-
<software name="pirtreas">
<description>Pirate's Treasure (cleanly cracked)</description>
<year>1984</year>
@@ -16005,19 +7119,6 @@ license:CC0-1.0
</part>
</software>
- <software name="plyblkt">
- <description>Play Ball, Kate (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-04-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="play ball, kate (4am crack).dsk" size="143360" crc="5bd1667d" sha1="4625639b8bcdda16865b3830df035f8fa7048dba" />
- </dataarea>
- </part>
- </software>
-
<software name="pollywog">
<description>Pollywog (cleanly cracked)</description>
<year>1982</year>
@@ -16031,19 +7132,6 @@ license:CC0-1.0
</part>
</software>
- <software name="poprspl">
- <description>Pop 'R Spell (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pop 'r spell (4am crack).dsk" size="143360" crc="e80dcff9" sha1="313d9292b25c753cce1ad161b591fe2d58fde908" />
- </dataarea>
- </part>
- </software>
-
<software name="portal">
<description>Portal (cleanly cracked)</description>
<year>1986</year>
@@ -16088,278 +7176,6 @@ license:CC0-1.0
</part>
</software>
- <software name="pwrdrill">
- <description>Power Drill (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="power drill (4am crack).dsk" size="143360" crc="7a3eacc2" sha1="a4c67eedaa6c86f04f15ba4d8fdcf568981fc355" />
- </dataarea>
- </part>
- </software>
-
- <software name="pracalgb">
- <description>Practical Algebra (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Queue</publisher>
- <info name="release" value="2015-12-21"/>
- <!-- This crack was updated on 2015-12-21 to fix compatibility with some
- less-accurate emulators. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Symbols and sets"/>
- <dataarea name="flop" size="143360">
- <rom name="practical algebra (4am crack) disk 1 - symbols and sets.dsk" size="143360" crc="8fe8622c" sha1="7be0b2527ec2a1d12defd74c825d1798a354a9b3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Real number system"/>
- <dataarea name="flop" size="143360">
- <rom name="practical algebra (4am crack) disk 2 - real number system.dsk" size="143360" crc="5bfd7c50" sha1="c402afc4d94235817b1b60fef9c2ca9d7372d120" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Equations I"/>
- <dataarea name="flop" size="143360">
- <rom name="practical algebra (4am crack) disk 3 - equations i.dsk" size="143360" crc="d7e6ded2" sha1="0de04a078031b534bf9042dde9fc8591f0b38d60" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Equations II"/>
- <dataarea name="flop" size="143360">
- <rom name="practical algebra (4am crack) disk 4 - equations ii.dsk" size="143360" crc="11195456" sha1="1287c2498ac667b55d3e90413e7fdcb9db48d0d1" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 - Algebra word problems"/>
- <dataarea name="flop" size="143360">
- <rom name="practical algebra (4am crack) disk 5 - algebra word problems.dsk" size="143360" crc="6935165f" sha1="95e0eeb3ae58b2b93a5fe87db6bb843bf08344b7" />
- </dataarea>
- </part>
- </software>
-
- <software name="prcgramr">
- <description>Practical Grammar (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Queue</publisher>
- <info name="release" value="2015-01-21"/>
- <!-- Disks 1-13 are believed to exist and are missing. -->
- <!-- This crack was updated on 2015-12-21 to fix compatibility with some
- less-accurate emulators. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 1" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 2" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 3" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 4" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 51"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 5" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 6" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 7" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 8" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 9"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 9" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 10"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 10" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk 11"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 11" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk 12"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 12" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop13" interface="floppy_5_25">
- <feature name="part_id" value="Disk 13"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 13" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop14" interface="floppy_5_25">
- <feature name="part_id" value="Disk 14 - The tenses of verbs"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 14 - the tenses of verbs.dsk" size="143360" crc="31525600" sha1="b4110a6c0916ee765c1d4f1f509ecca59bfb2644" />
- </dataarea>
- </part>
- <part name="flop15" interface="floppy_5_25">
- <feature name="part_id" value="Disk 15 - Verbs - voice and mood"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 15 - verbs - voice and mood.dsk" size="143360" crc="17c6ddc6" sha1="6d135fa59143f72fe4cbc36975394d8c80620433" />
- </dataarea>
- </part>
- <part name="flop16" interface="floppy_5_25">
- <feature name="part_id" value="Disk 16 - Agreement of subject and verb"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 16 - agreement of subject and verb.dsk" size="143360" crc="48f403be" sha1="6a83fbcbfe25fdad120c42534741fad47ea76c3f" />
- </dataarea>
- </part>
- <part name="flop17" interface="floppy_5_25">
- <feature name="part_id" value="Disk 17 - Prepositional phrases"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 17 - prepositional phrases.dsk" size="143360" crc="cc92a930" sha1="45cf447ddd650dd674cfa088844ce7b3a68c6182" />
- </dataarea>
- </part>
- <part name="flop18" interface="floppy_5_25">
- <feature name="part_id" value="Disk 18 - Compound sentences"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 18 - compound sentences.dsk" size="143360" crc="5467b165" sha1="be4dea4d869f35600e3cfdbd5ad853d2bc5b2896" />
- </dataarea>
- </part>
- <part name="flop19" interface="floppy_5_25">
- <feature name="part_id" value="Disk 19 - Complex sentences"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 19 - complex sentences.dsk" size="143360" crc="ed612d39" sha1="82a0c71fc2c028876087107d4ca03c87b6bc4d99" />
- </dataarea>
- </part>
- <part name="flop20" interface="floppy_5_25">
- <feature name="part_id" value="Disk 20 - Adverbial clauses"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 20 - adverbial clauses.dsk" size="143360" crc="a061543d" sha1="cfffd364f5e9c3843e5061bf5ac459f765a39a76" />
- </dataarea>
- </part>
- <part name="flop21" interface="floppy_5_25">
- <feature name="part_id" value="Disk 21 - Noun clauses"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 21 - noun clauses.dsk" size="143360" crc="0b1f9259" sha1="42a25ac245a69925b3410d27a6edc010faa41f46" />
- </dataarea>
- </part>
- <part name="flop22" interface="floppy_5_25">
- <feature name="part_id" value="Disk 22 - Participles"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 22 - participles.dsk" size="143360" crc="00130533" sha1="a529a8e3f57d4933743b11fe5dd07ec7155fc84f" />
- </dataarea>
- </part>
- <part name="flop23" interface="floppy_5_25">
- <feature name="part_id" value="Disk 23 - Gerunds"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 23 - gerunds.dsk" size="143360" crc="4efb4a86" sha1="fe7eed3e19031ee97f5c50ec815228e4033c65bd" />
- </dataarea>
- </part>
- <part name="flop24" interface="floppy_5_25">
- <feature name="part_id" value="Disk 24 - Infinitives"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 24 - infinitives.dsk" size="143360" crc="fced1581" sha1="94c395aa9ba4266c7dfde0a454aae5047fece4cf" />
- </dataarea>
- </part>
- <part name="flop25" interface="floppy_5_25">
- <feature name="part_id" value="Disk 25 - Problems in the use of infinitives"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 25 - problems in the use of infinitives.dsk" size="143360" crc="e24a69f8" sha1="d2dbe4d8a90e7b4b047e7b256b28a45440e079e0" />
- </dataarea>
- </part>
- <part name="flop26" interface="floppy_5_25">
- <feature name="part_id" value="Disk 26 - Punctuation review"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 26 - punctuation review.dsk" size="143360" crc="a85a3bb3" sha1="e8b1f14797b0fb8601a8be3ec3a6b2a1e23c1181" />
- </dataarea>
- </part>
- <part name="flop27" interface="floppy_5_25">
- <feature name="part_id" value="Disk 27 - Comprehensive grammar review II"/>
- <dataarea name="flop" size="143360">
- <rom name="practical grammar (4am crack) disk 27 - comprehensive grammar review ii.dsk" size="143360" crc="d1db2201" sha1="a625471062e454d792b93f7df5c6052b2afc7c12" />
- </dataarea>
- </part>
- </software>
-
- <software name="prelect">
- <description>President Elect (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="president elect (4am and san inc crack).dsk" size="143360" crc="0cf493c7" sha1="cb6107c8943e07186c8445cf3529a2e596d17c37" />
- </dataarea>
- </part>
- </software>
-
- <software name="prelec88">
- <description>President Elect (1988 Edition) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Strategic Simulations (SSI)</publisher>
- <info name="release" value="2018-03-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="president elect 1988 edition (4am crack).dsk" size="143360" crc="e05a85d1" sha1="2dec1842f87e2babd9490d1353bcc73f7f049188" />
- </dataarea>
- </part>
- </software>
-
- <software name="prnpasst">
- <description>Principal's Assistant (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Learning Well / Pelican</publisher>
- <info name="release" value="2015-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="principal's assistant (4am crack) side a.dsk" size="143360" crc="9a067400" sha1="ec8a0f44007b6ec66224e0e57224e898a2336d05" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="principal's assistant (4am crack) side b.dsk" size="143360" crc="6dc066fb" sha1="ede9b3556d23ba8fafdaf610b2dde00f60a9d6b5" />
- </dataarea>
- </part>
- </software>
-
<software name="prs2v100">
<description>Prisoner 2 (version 1.0) (cleanly cracked)</description>
<year>1982</year>
@@ -16435,32 +7251,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mkpnoun1">
- <description>Pronouns I (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pronouns i (4am crack).dsk" size="143360" crc="3cc45067" sha1="955fb2b826aeaef997788326906167fa8c57b6d2" />
- </dataarea>
- </part>
- </software>
-
- <software name="mkpnoun2">
- <description>Pronouns II (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pronouns ii (4am crack).dsk" size="143360" crc="97c171bc" sha1="588e5e0bff9c0268e39875d119daa71186284182" />
- </dataarea>
- </part>
- </software>
-
<software name="prmngsys">
<description>Property Management System demonstration disk (cleanly cracked)</description>
<year>1982</year>
@@ -16594,32 +7384,6 @@ license:CC0-1.0
</part>
</software>
- <software name="puzltnks">
- <description>Puzzle Tanks (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-01-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="puzzle tanks (4am crack).dsk" size="143360" crc="3593a3b6" sha1="f5a972a30fba6c8bec4580f5a9eedaeddeef0ea6" />
- </dataarea>
- </part>
- </software>
-
- <software name="qohearts">
- <description>Queen of Hearts (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-11-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="queen of hearts (4am and san inc crack).dsk" size="143360" crc="f43b97d1" sha1="734d5be5b71280d381f41b2c6d159305ac242665" />
- </dataarea>
- </part>
- </software>
-
<software name="qmth31pv6">
<description>Quest - Math 3-1 Place Value to 6 Digits (cleanly cracked)</description>
<year>1986</year>
@@ -16900,19 +7664,6 @@ license:CC0-1.0
</part>
</software>
- <software name="quinktm">
- <description>Quink (Thunder Mountain) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2017-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="quink (thunder mountain) (4am crack).dsk" size="143360" crc="ba0f7c90" sha1="8c828abc8ebdef6fa4a47a385ee40d4bc1c3d1e1" />
- </dataarea>
- </part>
- </software>
-
<software name="quotmrks">
<description>Quotation Marks (cleanly cracked)</description>
<year>1984</year>
@@ -16952,19 +7703,6 @@ license:CC0-1.0
</part>
</software>
- <software name="alibi">
- <description>Alibi (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2019-06-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="alibi (4am crack).dsk" size="143360" crc="0b3db1e0" sha1="8d6a7c582944ee1d54c5c4d875ed4d2e41299ec1" />
- </dataarea>
- </part>
- </software>
-
<software name="atwgtmi">
<description>Around The World: Getting The Main Idea (cleanly cracked)</description>
<year>1985</year>
@@ -16978,39 +7716,6 @@ license:CC0-1.0
</part>
</software>
- <software name="choplftr">
- <description>Choplifter (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-04-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="choplifter (4am and san inc crack).dsk" size="143360" crc="1c500f6c" sha1="a6231ba217b56f8516991dedcc9806f36a66a43b" />
- </dataarea>
- </part>
- </software>
-
- <software name="crcontrp">
- <description>Creative Contraptions (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Bantam Software</publisher>
- <info name="release" value="2019-05-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="creative contraptions (4am crack) side a.dsk" size="143360" crc="b27afb0e" sha1="a6eb1b1913fd250def0be381b3362090a6041c12" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="creative contraptions (4am crack) side b.dsk" size="143360" crc="301fe001" sha1="de54cfd682a67b5eb26a438ef1d6d00c3ccaea45" />
- </dataarea>
- </part>
- </software>
-
<software name="eggsit">
<description>Eggs-It (cleanly cracked)</description>
<year>1982</year>
@@ -17024,19 +7729,6 @@ license:CC0-1.0
</part>
</software>
- <software name="elemusic">
- <description>Elements of Music (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="elements of music (4am crack).dsk" size="143360" crc="63514a75" sha1="a2f19c4698e11be6ad89e600f255fcc942bac36f" />
- </dataarea>
- </part>
- </software>
-
<software name="highorbt">
<description>High Orbit (cleanly cracked)</description>
<year>1982</year>
@@ -17050,20 +7742,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hwirelr2">
- <description>High Wire Logic (Revision 2) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-07-13"/>
- <!-- 1985 original release, 1989 re-release -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="high wire logic rev. 2 (4am crack).dsk" size="143360" crc="3459e5d2" sha1="e8c420e89c805735997bc716fe2926bd13783c4c" />
- </dataarea>
- </part>
- </software>
-
<software name="horizonv">
<description>Horizon V (cleanly cracked)</description>
<year>1982</year>
@@ -17103,32 +7781,6 @@ license:CC0-1.0
</part>
</software>
- <software name="labyrnth">
- <description>Labyrinth (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="labyrinth (4am and san inc crack).dsk" size="143360" crc="35875fdd" sha1="826f7071d643e91dea9a746f9fbc7f3c9b12fc83" />
- </dataarea>
- </part>
- </software>
-
- <software name="lazrsilk">
- <description>Lazer Silk (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Gebelli Software</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lazer silk (4am and san inc crack).dsk" size="143360" crc="a545135c" sha1="739ea0f0a4aa2437aa144e2b9daf21de6b85dcd7" />
- </dataarea>
- </part>
- </software>
-
<software name="magcwrds">
<description>Magic Words (cleanly cracked)</description>
<year>1981</year>
@@ -17142,26 +7794,6 @@ license:CC0-1.0
</part>
</software>
- <software name="masqrde">
- <description>Masquerade (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2019-05-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="masquerade (4am crack) side a.dsk" size="143360" crc="1b8efa1a" sha1="dc664d1d62151b1e3de2bcebf27ce121527d331b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="masquerade (4am crack) side b.dsk" size="143360" crc="c2ee6855" sha1="333418548a0e59b6e1221a60485d4b8a5a42e890" />
- </dataarea>
- </part>
- </software>
-
<software name="mathstgy">
<description>Math Strategy (cleanly cracked)</description>
<year>1981</year>
@@ -17175,45 +7807,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mcodell">
- <description>MECC-A191 Odell Lake (version 1.1) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2019-04-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a191 odell lake v1.1 (4am crack).dsk" size="143360" crc="236bcb0e" sha1="3f592f85f07a185eeb3286cb24aaa9e60b426212" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcev8g10">
- <description>MECC A-732 Elementary Volume 8 Geometry (Points and Angles) (version 1.0) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2019-04-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a732 elementary volume 8 - geometry v1.0 (4am crack).dsk" size="143360" crc="e78c634b" sha1="9c78ed18bedee04490485ce681d3493b0fdae8e9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfdft11">
- <description>MECC-A756 Food Facts (version 1.1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2019-04-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a756 food facts v1.1 (4am crack).dsk" size="143360" crc="4fd23900" sha1="f686539915254b83748846f784d88ccc70b74d34" />
- </dataarea>
- </part>
- </software>
-
<software name="mtadvld">
<description>Money and Time Adventures of the Lollipop Dragon (cleanly cracked)</description>
<year>1984</year>
@@ -17273,26 +7866,6 @@ license:CC0-1.0
</part>
</software>
- <software name="protgolf">
- <description>Professional Tour Golf (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2019-06-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="professional tour golf (4am and san inc crack) side a - master disk.dsk" size="143360" crc="945c18e8" sha1="680d062a0313bd9abc1f42d2742690eb6c5b85e3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Player Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="professional tour golf (4am and san inc crack) side b - player disk.dsk" size="143360" crc="e412e247" sha1="486a79d6a1bde19cd1794971d8cffdf20812c3ad" />
- </dataarea>
- </part>
- </software>
-
<software name="rngsatrn">
<description>Rings of Saturn (cleanly cracked)</description>
<year>1981</year>
@@ -17319,132 +7892,6 @@ license:CC0-1.0
</part>
</software>
- <software name="seafox">
- <description>Seafox (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="seafox (4am and san inc crack).dsk" size="143360" crc="db585f74" sha1="c48194de7fed226cbb9bd76c7449b0ea36ebc1bf" />
- </dataarea>
- </part>
- </software>
-
- <software name="secfiler">
- <description>Secret Filer (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2019-05-11"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="secret filer (4am crack).dsk" size="143360" crc="d82a8e2b" sha1="07885bbc46935fd6206a210bc9130cedb9d634c5" />
- </dataarea>
- </part>
- </software>
-
- <software name="secfilerb" cloneof="secfiler">
- <description>Secret Filer (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2019-05-11"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="secret filer (imperfect 4am crack).dsk" size="143360" crc="88261b0a" sha1="675a300d0b433dcfb28fcd26905ad6951bc77160" />
- </dataarea>
- </part>
- </software>
-
- <software name="serpntne">
- <description>Serpentine (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="serpentine (4am and san inc crack).dsk" size="143360" crc="2cf40837" sha1="794df393b671126ec1db6fae45d186973d496484" />
- </dataarea>
- </part>
- </software>
-
- <software name="skyblazr">
- <description>Sky Blazer (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sky blazer (4am and san inc crack).dsk" size="143360" crc="88ed99bb" sha1="ebfc14ad7ebbd460c4052255446296291b457f33" />
- </dataarea>
- </part>
- </software>
-
- <software name="spdydvry">
- <description>Speedy Delivery (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2019-05-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="speedy delivery (4am crack).dsk" size="143360" crc="7c9b225b" sha1="23c3480ea1e6e96613d2b8a13e394afcdd9f2a53" />
- </dataarea>
- </part>
- </software>
-
- <software name="starblzr">
- <description>Star Blazer (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="star blazer (4am and san inc crack).dsk" size="143360" crc="782219e8" sha1="f23d3bbf0c57edbb814408aef4a5f03ef376f003" />
- </dataarea>
- </part>
- </software>
-
- <software name="starwarr">
- <description>Star Warrior (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2019-06-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="star warrior (4am crack).dsk" size="143360" crc="330619ad" sha1="7e472967dd91d345c5a999020c663ad4b2db6de1" />
- </dataarea>
- </part>
- </software>
-
- <software name="tchances">
- <description>Taking Chances (cleanly cracked)</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-07-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="taking chances (4am crack).dsk" size="143360" crc="5f40bcdd" sha1="7fc9826cf8caf679a0d176d142ec51315ace5eac" />
- </dataarea>
- </part>
- </software>
-
<software name="tenlrobt">
<description>Ten Little Robots (cleanly cracked)</description>
<year>1983</year>
@@ -17482,93 +7929,6 @@ license:CC0-1.0
</part>
</software>
- <software name="memmachn">
- <description>The Memory Machine (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-07-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the memory machine (4am crack).dsk" size="143360" crc="94e804b2" sha1="50fa0b471bd2e029c24ec5b6dc38814b6c4a0526" />
- </dataarea>
- </part>
- </software>
-
- <software name="rrworks">
- <description>The Railroad Works (Thunder Mountain) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Thunder Mountain</publisher>
- <info name="release" value="2019-06-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the railroad works (4am crack).dsk" size="143360" crc="a16bfdba" sha1="2d2ee6984ab3f82a50878086c66759c0f47124d3" />
- </dataarea>
- </part>
- </software>
-
- <software name="tuneit2">
- <description>Tune It ][ (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2019-04-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="Tune it ][ (4am crack).dsk" size="143360" crc="e512029f" sha1="e8acc071da75974b42a4d4ed9b956984a05c8546" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdamatn">
- <description>Word-a-Mation: Exploring Word Relationships (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-06-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word-a-mation (4am crack).dsk" size="143360" crc="6835466e" sha1="60b29407a91cabbb5ea9403c80b7e1eb7ef5d033" />
- </dataarea>
- </part>
- </software>
-
- <software name="wdak0685">
- <description>Word Attack (Revision 06-12-85) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2019-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack 061285 (4am crack) side a.dsk" size="143360" crc="c869e411" sha1="fb17b52b049f6184ce2a7c4c8f75d735a6979b9d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack 061285 (4am crack) side b.dsk" size="143360" crc="6d13680b" sha1="4915c3042288456ca271a2a0a6b27361a8ee58d5" />
- </dataarea>
- </part>
- </software>
-
- <software name="zgfx0583">
- <description>Zoom Grafix (Revision 25-MAY-83) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2019-05-05"/>
- <!-- This version is dated 25-MAY-83 according to comments within the
- program itself. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="zoom grafix 25-may-83 (4am crack).dsk" size="143360" crc="6692bf9f" sha1="043a588c7fb800b6e913da008ed0327db0046d04" />
- </dataarea>
- </part>
- </software>
-
<software name="apoaresp">
<description>A Puff of Air: The Respiratory System (cleanly cracked)</description>
<year>1983</year>
@@ -17582,52 +7942,6 @@ license:CC0-1.0
</part>
</software>
- <software name="weekchng">
- <description>A Week That Changed The World (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Educational Publishing Concepts</publisher>
- <info name="release" value="2019-02-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="a week that changed the world (4am crack) side a.dsk" size="143360" crc="d4ed4dfa" sha1="6e434634f0f8911af19edb00e0bb9bca01b3cde7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="a week that changed the world (4am crack) side b.dsk" size="143360" crc="5de32c03" sha1="9da24d2da6528248f40ffb7e625e6495f0b862e7" />
- </dataarea>
- </part>
- </software>
-
- <software name="batsblfr">
- <description>Bats in the Belfry (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2019-02-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bats in the belfry (4am crack).dsk" size="143360" crc="6109dac9" sha1="d19344e23610bf6b448fbbc4098a9dbd450ba713" />
- </dataarea>
- </part>
- </software>
-
- <software name="bzbghrvy">
- <description>Buzz Bang Harvey (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-03-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="buzz bang harvey (4am crack).dsk" size="143360" crc="f5e8445f" sha1="caa19292c9b09a76b2e9b9ec5393098639c526b7" />
- </dataarea>
- </part>
- </software>
-
<software name="dietanly">
<description>Diet Analysis Program (cleanly cracked)</description>
<year>1981</year>
@@ -17648,89 +7962,6 @@ license:CC0-1.0
</part>
</software>
- <software name="forbcstl">
- <description>Forbidden Castle (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2019-02-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop0" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="forbidden castle (4am crack).dsk" size="143360" crc="575ef02b" sha1="1a3ed09a2b975c0daa3df8999b83e5b793d29a62" />
- </dataarea>
- </part>
- </software>
-
- <software name="forbcstlb" cloneof="forbcstl">
- <description>Forbidden Castle (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2019-02-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="forbidden castle (imperfect 4am crack).dsk" size="143360" crc="b1a98dfe" sha1="d7ca81084186c907df1f128bfa91e17287b3d949" />
- </dataarea>
- </part>
- </software>
-
- <software name="fore">
- <description>Fore (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2019-02-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fore (4am crack).dsk" size="143360" crc="f56a69c1" sha1="0aaa1df40e4afab6ef5e51ed8a3e867ef0caab48" />
- </dataarea>
- </part>
- </software>
-
- <software name="fractv31">
- <description>Fractions (version 3.1 / 25-NOV-83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Edu-Ware Services</publisher>
- <info name="release" value="2019-04-08"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fractions v3.1 (4am crack).dsk" size="143360" crc="1abc2385" sha1="bcd9b30632c752bf3df26c55725921b355af2cd0" />
- </dataarea>
- </part>
- </software>
-
- <software name="fractv31b" cloneof="fractv31">
- <description>Fractions (version 3.1 / 25-NOV-83) (imperfect clean crack)</description>
- <year>1983</year>
- <publisher>Edu-Ware Services</publisher>
- <info name="release" value="2019-04-08"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fractions v3.1 (imperfect 4am crack).dsk" size="143360" crc="dab099ff" sha1="e4c0dcd81d93ebc4fe3906a53261bd91ecbe4881" />
- </dataarea>
- </part>
- </software>
-
<software name="gtcel2">
<description>Good Thinking - Cause and Effect Level Two (cleanly cracked)</description>
<year>1986</year>
@@ -17835,19 +8066,6 @@ license:CC0-1.0
</part>
</software>
- <software name="llacomp">
- <description>Let's Learn About Computers (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2019-03-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="let's learn about computers (4am crack).dsk" size="143360" crc="8fe40923" sha1="46fb987a4e42d28f37c2906d0222de588fe21119" />
- </dataarea>
- </part>
- </software>
-
<software name="madrat">
<description>Mad Rat (cleanly cracked)</description>
<year>1983</year>
@@ -17861,79 +8079,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mastrsat">
- <description>Mastering the SAT (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2019-02-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape)(4am crack) disk 1.dsk" size="143360" crc="1eeca285" sha1="1a11e97e6fca22159a347ae308c691ae35f2c467" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape)(4am crack) disk 2.dsk" size="143360" crc="550f5ca6" sha1="bd3e913321ac853b0d1eb3cf5c572a61be98decd" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape)(4am crack) disk 3.dsk" size="143360" crc="4c224d4c" sha1="c0e74fa3d55df5f0c67e1162409e90ffbd12a256" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape)(4am crack) disk 4.dsk" size="143360" crc="3298494c" sha1="940ffb33ce51f3f1560a7da6856750750253d6bb" />
- </dataarea>
- </part>
- </software>
-
- <software name="mastrsatb" cloneof="mastrsat">
- <description>Mastering the SAT (imperfect clean crack)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2019-02-23"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape) (imperfect 4am crack) disk 1.dsk" size="143360" crc="dee018ff" sha1="f7d057a08eed2935bf1ed6725163eabb9a8a1523" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape) (imperfect 4am crack) disk 2.dsk" size="143360" crc="9503e6dc" sha1="82482daa7c6a2cda3dc5f58cd4bc4cd0abf246af" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape) (imperfect 4am crack) disk 3.dsk" size="143360" crc="8c2ef736" sha1="67412d36f0397cd3e4db9ab7c456be562d0b3409" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="mastering the sat (mindscape) (imperfect 4am crack) disk 4.dsk" size="143360" crc="f294f336" sha1="fa27bb62a31f6198201bb8505ea488d9c91d6bb1" />
- </dataarea>
- </part>
- </software>
-
<software name="millrel2">
<description>Millionaire (Release 2) (cleanly cracked)</description>
<year>1987</year>
@@ -17996,46 +8141,6 @@ license:CC0-1.0
</part>
</software>
- <software name="moseslhp">
- <description>Moses Leads His People (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Educational Publishing Concepts</publisher>
- <info name="release" value="2019-02-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="moses leads his people (4am crack) side a.dsk" size="143360" crc="41a67e27" sha1="e8209f454c1be968d55f597425dbb3bdc1d460b7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="moses leads his people (4am crack) side b.dsk" size="143360" crc="360080a2" sha1="f657b886134ace87161399f228e82bd4b348da39" />
- </dataarea>
- </part>
- </software>
-
- <software name="paulmsj">
- <description>Paul's Missionary Journeys (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Educational Publishing Concepts</publisher>
- <info name="release" value="2019-02-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="paul's missionary journeys (4am crack) side a.dsk" size="143360" crc="752993ed" sha1="14ddbe52b978cd5d6a2e855ce38ce3093aa32b25" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="paul's missionary journeys (4am crack) side b.dsk" size="143360" crc="41c4584a" sha1="148d0ec4865cabc3cfa70b83658b2ded699b030c" />
- </dataarea>
- </part>
- </software>
-
<software name="photar">
<description>Photar (cleanly cracked)</description>
<year>1981</year>
@@ -18062,33 +8167,6 @@ license:CC0-1.0
</part>
</software>
- <software name="robtdawn">
- <description>Robots of Dawn (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2019-04-11"/>
- <!-- "Robots of Dawn" is a 1984 adventure game designed by Jon Leupp. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="robots of dawn (4am crack).dsk" size="143360" crc="e283c525" sha1="7eb8af7214c84c646654d19af9369c7dc1e4af5f" />
- </dataarea>
- </part>
- </software>
-
- <software name="rmplstkn">
- <description>Rumpelstiltskin (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2019-03-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rumpelstiltskin (4am crack).dsk" size="143360" crc="a8a38ab7" sha1="2a7f24d937761715ce9c517632b6c6c35141cc94" />
- </dataarea>
- </part>
- </software>
-
<software name="shiela">
<description>Sheila (cleanly cracked)</description>
<year>1982</year>
@@ -18122,19 +8200,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sorcsiva">
- <description>Sorcerer of Siva (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2019-02-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sorcerer of siva (4am crack).dsk" size="143360" crc="1deb1c25" sha1="11e323ade8316655b4e0712a7081af88ead3c219" />
- </dataarea>
- </part>
- </software>
-
<software name="suprsd10">
<description>Super Sunday (version 1.0) (cleanly cracked)</description>
<year>1986</year>
@@ -18208,19 +8273,6 @@ license:CC0-1.0
</part>
</software>
- <software name="digexcr">
- <description>The Digestive and Excretory Systems (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2019-03-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the digestive and excretory systems (4am crack).dsk" size="143360" crc="af1103fe" sha1="3f6c3451291a2178619352d4f6603b6e4d09ce8f" />
- </dataarea>
- </part>
- </software>
-
<software name="dispdinr">
<description>The Disappearing Dinner: The Digestive System (cleanly cracked)</description>
<year>1983</year>
@@ -18247,19 +8299,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tomsawyr">
- <description>Troll Reading Games: The Adventures of Tom Sawyer (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2019-03-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="troll reading games - the adventures of tom sawyer (4am crack).dsk" size="143360" crc="9cd36012" sha1="f6a67b18f28597de4d0c64e7e9d562041e25d6a6" />
- </dataarea>
- </part>
- </software>
-
<software name="tsushima">
<description>Tsushima (cleanly cracked)</description>
<year>1986</year>
@@ -18286,36 +8325,6 @@ license:CC0-1.0
</part>
</software>
- <software name="zgfx0182">
- <description>Zoom Grafix (version 26-JAN-82) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2019-04-08"/>
- <!-- This version is dated 26-JAN-82 according to comments within the
- program itself. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="zoom grafix 26-jan-82 (4am crack).dsk" size="143360" crc="789d302a" sha1="c3c457bc13a2eb4061b9843c54adbc6a3e50644f" />
- </dataarea>
- </part>
- </software>
-
- <software name="zgfx0482">
- <description>Zoom Grafix (version 29-APR-82) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2019-04-08"/>
- <!-- This version is dated 29-APR-82 according to comments within the
- program itself. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="zoom grafix 29-apr-82 (4am crack).dsk" size="143360" crc="dc92bdae" sha1="8cfa992832dcb9abe5b44ce4e2e51bb5bc4491d8" />
- </dataarea>
- </part>
- </software>
-
<software name="zork3r10">
<description>Zork III (Release 10 / 820818) (cleanly cracked)</description>
<year>1982</year>
@@ -18351,7 +8360,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Micromax</publisher>
<info name="release" value="2019-01-26"/>
- <!--"Viewmax-80 Pre-Boot" is a 1983 utility program for the Viewmax-80
+ <!-- "Viewmax-80 Pre-Boot" is a 1983 utility program for the Viewmax-80
peripheral card by Micromax. -->
<part name="flop1" interface="floppy_5_25">
@@ -18400,117 +8409,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wrabbt13">
- <description>Writer Rabbit (version 1.3) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2014-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="Writer Rabbit (4am crack) side A.dsk" size="143360" crc="79b78c0a" sha1="9ee29f8abf062e50de03d4ecec0143cb1db82452" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="Writer Rabbit (4am crack) side B.dsk" size="143360" crc="6f824696" sha1="ebc0d8f34edaff45e584c83be140cddf1cfb7854" />
- </dataarea>
- </part>
- </software>
-
- <software name="wordspnr">
- <description>Wordspinner (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2014-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordspinner (4am crack).dsk" size="143360" crc="5eddb086" sha1="96345c0e990ec526d1c56a1a20431a0f9d0a49d2" />
- </dataarea>
- </part>
- </software>
-
- <software name="targetsn">
- <description>Targets: A Number Game (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="targets - a number game (4am crack).dsk" size="143360" crc="a304971a" sha1="dc244cc833a153153628c35c59fb47b92795dd38" />
- </dataarea>
- </part>
- </software>
-
- <software name="teastobb">
- <description>Teasers by Tobbs (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="teasers by tobbs (4am crack).dsk" size="143360" crc="d354ddfd" sha1="6281aa8a61ccb1cf283e966131fd30c6563265f9" />
- </dataarea>
- </part>
- </software>
-
- <software name="tenclues">
- <description>Ten Clues (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ten clues (4am crack).dsk" size="143360" crc="7d7794a9" sha1="9c704dd378e23396b136026bd4c06843780285a0" />
- </dataarea>
- </part>
- </software>
-
- <software name="tradpost">
- <description>Trading Post (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="trading post (4am crack).dsk" size="143360" crc="12235b59" sha1="93d5b1d2a4c2e435255fb640465f0fbf54ff1dd5" />
- </dataarea>
- </part>
- </software>
-
- <software name="gaccrace">
- <description>The Great American Cross-Country Road Race (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Activision</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the great american cross-country road race (4am crack).dsk" size="143360" crc="0c3f2ef8" sha1="6da5d873e8f98c785073207c8ab789dc494daaac" />
- </dataarea>
- </part>
- </software>
-
- <software name="thefctry">
- <description>The Factory (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the factory (4am crack).dsk" size="143360" crc="09f62c9f" sha1="b30c9de41330f180ee0139b66ac42628ccd57e4a" />
- </dataarea>
- </part>
- </software>
-
<software name="strtphon">
<description>Starting with Phonics (cleanly cracked)</description>
<year>1983</year>
@@ -18524,59 +8422,6 @@ license:CC0-1.0
</part>
</software>
- <software name="timcatht">
- <description>Tim and the Cat and the Big Red Hat (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and the big red hat (4am crack).dsk" size="143360" crc="20727d18" sha1="dc65a4dd3aa7e6b56b038bd96dd8587ba454fe1b" />
- </dataarea>
- </part>
- </software>
-
- <software name="timcathn">
- <description>Tim and the Cat and Jen the Hen (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="Tim and the Cat and Jen the Hen (4am crack) disk 1.dsk" size="143360" crc="c31e5a43" sha1="160b933402a5e9aed76cef4dea968ef9ece66220" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="Tim and the Cat and Jen the Hen (4am crack) disk 2.dsk" size="143360" crc="9b550247" sha1="172d79434703e5b25ebacf005694f5cfed018a1f" />
- </dataarea>
- </part>
- </software>
-
- <software name="timcatfd">
- <description>Tim and the Cat and the Fish Dish (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="Tim and the Cat and the Fish Dish (4am crack) disk 1.dsk" size="143360" crc="f4ed692e" sha1="21980204c6d3173bf5cf29bcb5ddf394cee2576a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="Tim and the Cat and the Fish Dish (4am crack) disk 2.dsk" size="143360" crc="d4738ff4" sha1="f1b7e231d5080e3e1fb84048e5061bbf4b7284b2" />
- </dataarea>
- </part>
- </software>
-
<software name="rresume2">
<description>The Right Resume Writer II (cleanly cracked)</description>
<year>1986</year>
@@ -18629,19 +8474,6 @@ license:CC0-1.0
</part>
</software>
- <software name="vidvegas">
- <description>Video Vegas (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="video vegas (4am crack).dsk" size="143360" crc="c974bad2" sha1="c2c48f3f9f90d72be489021f5805c1d72c0f834c" />
- </dataarea>
- </part>
- </software>
-
<software name="ribbit">
<description>Ribbit (cleanly cracked)</description>
<year>1982</year>
@@ -18655,32 +8487,6 @@ license:CC0-1.0
</part>
</software>
- <software name="halleypr">
- <description>The Halley Project (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the halley project (4am crack).dsk" size="143360" crc="498f7d43" sha1="fcaa1784b084979c2cd970e0a1372e996110b342" />
- </dataarea>
- </part>
- </software>
-
- <software name="sciv3mtr">
- <description>Science Volume 3: Matter, Liquid, and Solid (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Decision Development</publisher>
- <info name="release" value="2014-08-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="science volume 3 - matter (4am crack).dsk" size="143360" crc="b5a9fd74" sha1="ce8bddfa4e9e1c9b3d7f291828bd8807cc5b34c2" />
- </dataarea>
- </part>
- </software>
-
<software name="waibtaf">
<description>Who Am I? Birds, Trees, and Flowers (cleanly cracked)</description>
<year>1986</year>
@@ -18836,76 +8642,6 @@ license:CC0-1.0
</part>
</software>
- <software name="undiatip">
- <description>Un Dia Tipico (cleanly cracked)</description>
- <year>1985</year>
- <publisher>D.C. Heath and Company</publisher>
- <info name="release" value="2014-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="un dia tipico (4am crack) disk 1.dsk" size="143360" crc="52b778b5" sha1="ed1a8e64cfd0eb99bc6af05e3b9c62bbf278758e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="un dia tipico (4am crack) disk 2.dsk" size="143360" crc="f68796d9" sha1="84edf33806a3cd9c77722f10738f3ae7407af216" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="un dia tipico (4am crack) disk 3.dsk" size="143360" crc="126fdfe1" sha1="8f7647a79fd360c9087211a3fedc2c5092f9031b" />
- </dataarea>
- </part>
- </software>
-
- <software name="artowar">
- <description>The Ancient Art of War (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2014-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the ancient art of war (4am crack) side a.dsk" size="143360" crc="060a106c" sha1="76dc6662fa70235d61916cefcc52c6d7a16bc8ba" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the ancient art of war (4am crack) side b.dsk" size="143360" crc="f7b680cb" sha1="5b611e6a4225d61f3a785a3b9f880cf1b3478d66" />
- </dataarea>
- </part>
- </software>
-
- <software name="sbwinnie">
- <description>Winnie the Pooh in the Hundred Acre Wood (Sunburst Communications release) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-08-21"/>
- <!-- "Winnie the Pooh in the Hundred Acre Wood" is a 1984 graphical
- adventure game by Walt Disney Company and distributed by Sierra On-Line,
- Inc. This version is distributed by Sunburst Communications
- (mentioned only on the physical disk label).
-
- It is dated February 10, 1985, according to a filename in the disk
- catalog. -->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="winnie the pooh in the hundred acre wood (sunburst release) (4am crack) side a.dsk" size="143360" crc="e9f77653" sha1="a2ddd716ed3c6789b0129d3e7e40a190d4cf71f3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="winnie the pooh in the hundred acre wood (sunburst release) (4am crack) side b.dsk" size="143360" crc="214b7bf8" sha1="81bc12dc86ef22bbdaa5009af87f33f7931f60ef" />
- </dataarea>
- </part>
- </software>
-
<software name="elcatlas">
<description>The Electronic Atlas (cleanly cracked)</description>
<year>1990</year>
@@ -18994,19 +8730,6 @@ license:CC0-1.0
</part>
</software>
- <software name="trolltle">
- <description>Troll's Tale (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2014-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="troll's tale (4am crack).dsk" size="143360" crc="18e35796" sha1="2ac2ccee64e017f834ab46a6091e1a677c3d8421" />
- </dataarea>
- </part>
- </software>
-
<software name="bodytran">
<description>The Body Transparent (cleanly cracked)</description>
<year>1985</year>
@@ -19020,19 +8743,6 @@ license:CC0-1.0
</part>
</software>
- <software name="inclab">
- <description>The Incredible Laboratory: Strategies in Problem Solving (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-09-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the incredible laboratory (4am crack).dsk" size="143360" crc="6ce45105" sha1="a76175418ff95a61afe2592ebb3d7c59291ff12e" />
- </dataarea>
- </part>
- </software>
-
<software name="mussymb">
<description>The Music Class - Symbols (cleanly cracked)</description>
<year>1985</year>
@@ -19081,165 +8791,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ridmagic">
- <description>Riddle Magic (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2014-09-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="riddle magic (4am crack) side a.dsk" size="143360" crc="a114c706" sha1="bbdcc2e436ee80df537257c0f2941706d9f61bb2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="riddle magic (4am crack) side b.dsk" size="143360" crc="291eabb6" sha1="b6a7707818472e96b3ab5885a0ec8272009aa11e" />
- </dataarea>
- </part>
- </software>
-
- <software name="spellit">
- <description>Spell It! (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2014-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="spell it (4am crack) side a.dsk" size="143360" crc="5e1e1c9a" sha1="331a8613e1bb815d28b6f83f312f35726c7c0b8d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="spell it (4am crack) side b.dsk" size="143360" crc="580a3e09" sha1="4d8ade83dd07e03cb0158e95109072b1a367d06e" />
- </dataarea>
- </part>
- </software>
-
- <software name="tangrams">
- <description>Tangrams Puzzler (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2014-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tangrams puzzler (4am crack).dsk" size="143360" crc="1e6b80a7" sha1="39c3d1cf3013c610aed92a128eeaee1016fe62bf" />
- </dataarea>
- </part>
- </software>
-
- <software name="svmath20">
- <description>Survival Math (version 2.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="survival math (4am crack).dsk" size="143360" crc="0965ef15" sha1="e66d1ab9f5b0f244f5cbdb0f0d03c3c850e29aff" />
- </dataarea>
- </part>
- </software>
-
- <software name="wordattk">
- <description>Word Attack (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2014-09-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack (4am crack) side a.dsk" size="143360" crc="b5509fb9" sha1="7f88f3a3c3bee8a7d95b7c3f57e9566d1332ab28" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack (4am crack) side b.dsk" size="143360" crc="eedddf91" sha1="e5061feeae091b99b4941872cdb650d204071f0b" />
- </dataarea>
- </part>
- </software>
-
- <software name="rfmlv2">
- <description>Reading for Meaning: Level 2 (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2014-10-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="reading for meaning 2 (4am crack) side a.dsk" size="143360" crc="b6bef60c" sha1="c78a2bb6b51e63de2d44abddf2d6651c79f3dd95" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="reading for meaning 2 (4am crack) side b.dsk" size="143360" crc="c3b1e08f" sha1="bed7ba6d2876ee1869e9b546138bb19ff91141ac" />
- </dataarea>
- </part>
- </software>
-
- <software name="sspsai">
- <description>Safari Search: Problem Solving and Inference (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2014-11-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="safari search (4am crack).dsk" size="143360" crc="aeab8d5e" sha1="f317cee59c075c623a584025a82a119bfda9ca23" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdatfr">
- <description>Word Attack Plus! French (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2014-11-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack plus french (4am crack) side a.dsk" size="143360" crc="531a35d0" sha1="1904b000c03c24d25071bd79f90b59ea82625947" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack plus french (4am crack) side b.dsk" size="143360" crc="3269f352" sha1="d158aebe2d266dff4417a8b285746b9503e759a3" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdatgr">
- <description>Word Attack German / Wortgefecht (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2014-11-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack german (4am crack) disk 1.dsk" size="143360" crc="87d844a3" sha1="9e465f4a629fb32c8c6942f88c1930f60c150ae3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack german (4am crack) disk 2.dsk" size="143360" crc="66f32eb6" sha1="55abe5420f21f3e525e51c669661ed416af35c21" />
- </dataarea>
- </part>
- </software>
-
<software name="tplogo12">
<description>Terrapin Logo (version 1.2) (cleanly cracked)</description>
<year>????</year>
@@ -19260,32 +8811,6 @@ license:CC0-1.0
</part>
</software>
- <software name="zgfxse">
- <description>Zoom Grafix Second Edition (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2014-12-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="zoom grafix second edition (4am crack).dsk" size="143360" crc="5db0f70f" sha1="d7496eba65e8321ce02223c9dae66a6f51d8601a" />
- </dataarea>
- </part>
- </software>
-
- <software name="vidttlsh">
- <description>Video Title Shop (cleanly cracked)</description>
- <year>1987</year>
- <publisher>DataSoft</publisher>
- <info name="release" value="2014-12-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="video title shop (4am crack).dsk" size="143360" crc="cb1c722d" sha1="c1f535df153838d6278b7f291170162067e5223c" />
- </dataarea>
- </part>
- </software>
-
<software name="tplogo20">
<description>Terrapin Logo (version 2.0) (cleanly cracked)</description>
<year>1984</year>
@@ -19319,6 +8844,19 @@ license:CC0-1.0
</part>
</software>
+ <software name="sciv3mtr">
+ <description>Science Volume 3: Matter, Liquid, and Solid (cleanly cracked)</description>
+ <year>1986</year>
+ <publisher>Decision Development</publisher>
+ <info name="release" value="2014-08-20"/>
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="science volume 3 - matter (4am crack).dsk" size="143360" crc="b5a9fd74" sha1="ce8bddfa4e9e1c9b3d7f291828bd8807cc5b34c2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sciv4spc">
<description>Science Volume 4: Space (cleanly cracked)</description>
<year>1987</year>
@@ -19384,19 +8922,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tgsquadr">
- <description>The Geometric Supposer: Quadrilaterals (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the geometric supposer - quadrilaterals (4am crack).dsk" size="143360" crc="950fcbe8" sha1="76f169f9e9ee6e3428886982fdd6ac26140e2dfe" />
- </dataarea>
- </part>
- </software>
-
<software name="tplogo13">
<description>Terrapin Logo (version 1.3) (cleanly cracked)</description>
<year>1982</year>
@@ -19410,58 +8935,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wrktgthr">
- <description>Working Together (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Queue</publisher>
- <info name="release" value="2015-01-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Communication on the job"/>
- <dataarea name="flop" size="143360">
- <rom name="working together (4am crack) disk 1 - communication on the job.dsk" size="143360" crc="e413acef" sha1="42658f71614c118032bc9db99dfa1c0e07a0130b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Job attitude"/>
- <dataarea name="flop" size="143360">
- <rom name="working together (4am crack) disk 2 - job attitude.dsk" size="143360" crc="9f3498ca" sha1="abf76b19a2360c14e5292b10762b1bf51bf04c80" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Working with others (review)"/>
- <dataarea name="flop" size="143360">
- <rom name="working together (4am crack) disk 3 - working with others (review).dsk" size="143360" crc="7d292cdb" sha1="0cc377d3d1e7c05299de10cdadd7209fd87ee158" />
- </dataarea>
- </part>
- </software>
-
- <software name="spelitps">
- <description>Spell It Plus (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-01-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="spell it plus (4am crack) disk 1 side a.dsk" size="143360" crc="2b44bec0" sha1="73b49fa3db80efc29dea8c1ddf7bd30d27e58932" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="spell it plus (4am crack) disk 1 side b.dsk" size="143360" crc="4da7d0eb" sha1="c51a58547fc50902220dbea12dd46355d66da636" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="spell it plus (4am crack) disk 2.dsk" size="143360" crc="c7b9ecfd" sha1="3439a82cddb3831219418d8354105f29acd81d3f" />
- </dataarea>
- </part>
- </software>
-
<software name="squeedrg">
<description>Squeegee Learns About Drugs (cleanly cracked)</description>
<year>1989</year>
@@ -19482,272 +8955,6 @@ license:CC0-1.0
</part>
</software>
- <software name="keywrks1">
- <description>Keyworks: First Keyboarding Skills (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyworks - first keyboarding skills (4am crack).dsk" size="143360" crc="08509e4c" sha1="f13dc752a490884afe7324fc52122bd8e85dc2aa" />
- </dataarea>
- </part>
- </software>
-
- <software name="posfwnap">
- <description>Parts of Speech: Fun with Nouns and Pronouns (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="parts of speech - fun with nouns and pronouns (4am crack).dsk" size="143360" crc="1879f3b5" sha1="7026ccf1f0e90e700fb8cee17fec809b00a8983a" />
- </dataarea>
- </part>
- </software>
-
- <software name="rasknics">
- <description>Read and Spell: In the Days of Knights and Castles (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="read and spell - in the days of knights and castles (4am crack) disk 1.dsk" size="143360" crc="8ef5e83a" sha1="5f3118bfae9d3e672f1df0f911e1e6d8dcab298b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="read and spell - in the days of knights and castles (4am crack) disk 2.dsk" size="143360" crc="dcd2163b" sha1="0a74ec12ff2e432c84e214784fb2a3d72afcafba" />
- </dataarea>
- </part>
- </software>
-
- <software name="seasons">
- <description>Seasons (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="seasons (4am crack).dsk" size="143360" crc="26d5877b" sha1="802498734cd1f4aae48766fd275deda9f59b678c" />
- </dataarea>
- </part>
- </software>
-
- <software name="undmapgl">
- <description>Understanding Maps and Globes (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="understanding maps and globes (4am crack) disk 1.dsk" size="143360" crc="9e1c5658" sha1="58bb8d0f90b644b8c86add54009da40a904b27d4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="understanding maps and globes (4am crack) disk 2.dsk" size="143360" crc="d1f5e742" sha1="86a9e50c4876a54a189e59ee607de22fb1045fe1" />
- </dataarea>
- </part>
- </software>
-
- <software name="wirpctcp">
- <description>Write It Right: Punctuation and Capitalization (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-02-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="write it right - punctuation and capitalization (4am crack).dsk" size="143360" crc="73c4dace" sha1="017a293dbe8820162bc420528208163c0430176a" />
- </dataarea>
- </part>
- </software>
-
- <software name="tpssatpr">
- <description>The Perfect Score: Computer Preparation for the SAT (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2015-02-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A Side 1 - Antonyms I"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk a side 1 - antonyms i.dsk" size="143360" crc="95f147b6" sha1="57347093230c48a9d8c475dc28b7d63c7e6dccba" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk A Side 2 - Antonyms II"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk a side 2 - antonyms ii.dsk" size="143360" crc="2b170e81" sha1="969273e692ea6c7cedd9cd470eb242326e168684" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk B Side 1 - Analogies I"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk b side 1 - analogies i.dsk" size="143360" crc="7ba4d552" sha1="d177a5075f26e9a22f0ad3831b62e3abc6509ee9" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk B Side 2 - Analogies II"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk b side 2 - analogies ii.dsk" size="143360" crc="c8ed95e8" sha1="5f4e8979df884eaeca5423140034927d9ccb3f16" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk C Side 1 - Sentence Completion I"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk c side 1 - sentence completion i.dsk" size="143360" crc="632cd17a" sha1="538da926747efdbbf585267c769c3da0793959e4" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk C Side 2 - Sentence Completion II"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk c side 2 - sentence completion ii.dsk" size="143360" crc="ee6f2d7d" sha1="3423bb5b8d74cc08ce43ae37888953a315126966" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk D Side 1 - Reading Comprehension I"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk d side 1 - reading comprehension i.dsk" size="143360" crc="ab4c5fbc" sha1="5db054253ebfa7c91a65d60c8216ac4557beac61" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk D Side 2 - Reading Comprehension II"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk d side 2 - reading comprehension ii.dsk" size="143360" crc="bce86c75" sha1="49d024774fbd04836d6db5fd937f5e8b04d78579" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk E Side 1 - Mathematics I"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk e side 1 - mathematics i.dsk" size="143360" crc="2bac61a1" sha1="5ad781bea1dd1b32a03eb3f9d0ac119f0d63ba39" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk E Side 2 - Mathematics II"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk e side 2 - mathematics ii.dsk" size="143360" crc="a1c87a8c" sha1="77e6a9f0d222c17adb557782c62d3cb257fed3d4" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk F Side 1 - Practice SAT"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk f side 1 - practice sat.dsk" size="143360" crc="97e33205" sha1="c2ec93b59e016bf92ef6bd2108e5fd06e2dbf552" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk F Side 2 - Timed test of standard written English"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect score (4am crack) disk f side 2 - timed test of standard written english.dsk" size="143360" crc="189509f4" sha1="476393b85703b29de492cba92057f69d4d49669b" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdatkps">
- <description>Word Attack Plus (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-02-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack plus (4am crack) side a.dsk" size="143360" crc="30d62fc0" sha1="c2a0cf462c4f43f6fc120ffb21fd93d69e3b9306" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack plus (4am crack) side b.dsk" size="143360" crc="00defbe5" sha1="fb7ba9df015d6616411cc5abb77cf2caca288568" />
- </dataarea>
- </part>
- </software>
-
- <software name="wdakpspn">
- <description>Word Attack Plus! Spanish (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-02-11"/>
- <info name="programmer" value="Jan Davidson, Julie Baumgartner, J.M. Albanese, and Kevin R. Burley" />
- <!--"Word Attack Plus! Spanish" is a 1988 educational game developed by Jan Davidson, Julie Baumgartner, J.M. Albanese, and Kevin R. Burley, and distributed by Davidson &amp; Associates. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack plus spanish (4am crack) side a.dsk" size="143360" crc="59bbd67c" sha1="fd29dc69f232a94c28fe69e43b78b9233f2a0af8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack plus spanish (4am crack) side b.dsk" size="143360" crc="f7e9e685" sha1="d7e5af821aeab8135017476398c25bbb9ef8f5db" />
- </dataarea>
- </part>
- </software>
-
- <software name="playroom">
- <description>The Playroom (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2015-02-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A"/>
- <dataarea name="flop" size="143360">
- <rom name="the playroom (4am crack) disk a.dsk" size="143360" crc="639f6530" sha1="ced55fc3cef7038cb593833b278404805011a862" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="the playroom (4am crack) disk b.dsk" size="143360" crc="ed4437e8" sha1="ff34c1719913d64c00ac4f8c59119385cc88171a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="the playroom (4am crack) disk c.dsk" size="143360" crc="a8b31e2b" sha1="ef7a762e1aedb4e15b6b47cb692723835eddcce4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D"/>
- <dataarea name="flop" size="143360">
- <rom name="the playroom (4am crack) disk d.dsk" size="143360" crc="37bce334" sha1="92490b5940d95ca075b1db074f0d1da57c953c0c" />
- </dataarea>
- </part>
- </software>
-
- <software name="succtype">
- <description>Success with Typing (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-03-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing (4am crack) side a.dsk" size="143360" crc="8ad64c2c" sha1="422b72421fe44c0dd07e56f97903321b8903ffda" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing (4am crack) side b.dsk" size="143360" crc="6dab5c54" sha1="fe02f36c0e0d808b2ed420c68060adf5820f81d0" />
- </dataarea>
- </part>
- </software>
-
<software name="spyhuntr">
<description>Spy Hunter (cleanly cracked)</description>
<year>1983</year>
@@ -19761,32 +8968,6 @@ license:CC0-1.0
</part>
</software>
- <software name="stargate">
- <description>Stargate (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atari</publisher>
- <info name="release" value="2015-03-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="stargate (4am crack).dsk" size="143360" crc="a417073a" sha1="e62e1e25551afc7e8f23fe6c0b9b4794ea44a305" />
- </dataarea>
- </part>
- </software>
-
- <software name="robotron">
- <description>Robotron 2084 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Atari</publisher>
- <info name="release" value="2015-03-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="robotron 2084 (4am crack).dsk" size="143360" crc="27169b1b" sha1="29b874d077815e4e5e7c69cfc88a23b15b417fc5" />
- </dataarea>
- </part>
- </software>
-
<software name="statestr">
<description>States and Traits (cleanly cracked)</description>
<year>1984</year>
@@ -19800,26 +8981,6 @@ license:CC0-1.0
</part>
</software>
- <software name="roylrule">
- <description>The Royal Rules (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-03-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="the royal rules (4am crack) disk 1.dsk" size="143360" crc="3935e3bb" sha1="f3d5a7339dab6fc80358ee7dc427bf8569c10891" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="the royal rules (4am crack) disk 2.dsk" size="143360" crc="5a6abeee" sha1="54044b31d436c7e628ae5424b3af391edde101af" />
- </dataarea>
- </part>
- </software>
-
<software name="victroad">
<description>Ikari Warriors 2: Victory Road (cleanly cracked)</description>
<year>1988</year>
@@ -19840,131 +9001,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wrtwkshp">
- <description>The Writing Workshop (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2015-04-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - The Writing Workshop - The Milliken Word Processor program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - the milliken word processor (4am crack).dsk" size="143360" crc="9a29b623" sha1="6e5c4d417758e916b5b9507bd6b28116bdf67914" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Brainstorming"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - brainstorming (4am crack).dsk" size="143360" crc="2102b96c" sha1="047d47956e08635fc032c9da1a66ebc72ea2d7af" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Branching"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - branching (4am crack).dsk" size="143360" crc="f3233777" sha1="e4e57bf7e12e1c835191cad9d62ef6d07ebe5d37" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - File cabinet diskette 1"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - file cabinet diskette 1 (4am crack).dsk" size="143360" crc="4da0bcec" sha1="df9cccce413bd3fe08820b3a9ef09d0b412fdd16" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 - File cabinet diskette 2"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - file cabinet diskette 2 (4am crack).dsk" size="143360" crc="3700754a" sha1="4b21258c377a7feb76292d0031a3346e3aeb3f4a" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 - Help files"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - help files (4am crack).dsk" size="143360" crc="f3ca5af0" sha1="e33c63021ce2cec4d3544e00aa5cb5c6c196ac3a" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7 - Mechanics checker I"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - mechanics checker i (4am crack).dsk" size="143360" crc="6eac1784" sha1="c77824c4f988ff58e9b0586175387ee98c1284f8" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8 - Mechanics checker II"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - mechanics checker ii (4am crack).dsk" size="143360" crc="a1d5508b" sha1="840002439b25de8bdb4d441dc920b0a3e6a47215" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 9 - Nutshelling"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - nutshelling (4am crack).dsk" size="143360" crc="df26fd60" sha1="5700056a4ca3af02c88b3845b0e2adfa11b7fe51" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 10 - Proofreader"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - proofreader (4am crack).dsk" size="143360" crc="e31ab3bc" sha1="e78c31f854aceb0561f38c6c4898c142694a4f9c" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk 11 - Spelling checker I"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - spelling checker i (4am crack).dsk" size="143360" crc="6fcf4320" sha1="4438c7228ef45a55dd26a453f9510472b4cd6c92" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk 12 - Spelling checker II word list"/>
- <dataarea name="flop" size="143360">
- <rom name="the writing workshop - spelling checker ii word list (4am crack).dsk" size="143360" crc="f5d8349c" sha1="6f637da5b1710a7c07ce7d586ff5f309b142d1f9" />
- </dataarea>
- </part>
- </software>
-
- <software name="themist">
- <description>The Mist (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2015-04-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the mist (4am crack).dsk" size="143360" crc="7cf52724" sha1="b56bc62bf60680deafdc1a33f0721b0bcffb8df1" />
- </dataarea>
- </part>
- </software>
-
- <software name="readroll">
- <description>Read 'N Roll (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-05-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="read n roll (4am crack) disk 1 side a.dsk" size="143360" crc="b1965ccf" sha1="8a69356c8aa6391e13e61e0799469e2070cf8cfc" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="read n roll (4am crack) disk 1 side b.dsk" size="143360" crc="a5bd3abf" sha1="b19aee06c977cc539611f65891fc84c495249526" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="read n roll (4am crack) disk 2 side a.dsk" size="143360" crc="8d93a04c" sha1="4421118d6ae7fd70544bc2b88ae9d7c6799202a4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="read n roll (4am crack) disk 2 side b.dsk" size="143360" crc="9311bab7" sha1="7654f674cd76957fbd2da49da315083b7d6770ee" />
- </dataarea>
- </part>
- </software>
-
<software name="tbraingm">
<description>The Brain Game (cleanly cracked)</description>
<year>1984</year>
@@ -20005,52 +9041,6 @@ license:CC0-1.0
</part>
</software>
- <software name="simonsays">
- <description>Simon Says... (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-05-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="simon says (4am crack).dsk" size="143360" crc="e9251371" sha1="d8cf1ed0809797625f1b479b7964965c4c53dbd0" />
- </dataarea>
- </part>
- </software>
-
- <software name="transtf">
- <description>Transportation Transformation (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2015-05-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="transportation transformation (4am crack) side a.dsk" size="143360" crc="24ad5d3b" sha1="1b0e956a5453452e691ac7a5093581e9833276f8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="transportation transformation (4am crack) side b.dsk" size="143360" crc="742754cd" sha1="d389e47634ebe6113def7908bbd2d35a108ff22d" />
- </dataarea>
- </part>
- </software>
-
- <software name="submxfrc">
- <description>Subtracting Mixed Fractions (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops Courseware</publisher>
- <info name="release" value="2015-06-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="subtracting mixed fractions (4am crack).dsk" size="143360" crc="92c2e0a5" sha1="4257e95087cd0a4876885688980e95fd1686a641" />
- </dataarea>
- </part>
- </software>
-
<software name="vowlcorl">
<description>Vowel Corral (cleanly cracked)</description>
<year>1983</year>
@@ -20104,63 +9094,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sprprnt">
- <description>SuperPrint (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-06-13"/>
- <!--"SuperPrint" is a 1987 graphics program developed by Pelican Software and distributed by Scholastic, Inc. It is preserved here for the first time.-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="superprint (4am crack) disk 1 side a - program.dsk" size="143360" crc="a57a8219" sha1="042596fc400879bc651fdfadba547979aa673d3b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Work area"/>
- <dataarea name="flop" size="143360">
- <rom name="superprint (4am crack) disk 1 side b - work area.dsk" size="143360" crc="3bfe12bb" sha1="eaff8b484825fe49978009a1b057bc281fb53687" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Clip art and fonts"/>
- <dataarea name="flop" size="143360">
- <rom name="superprint (4am crack) disk 2 side a - clip art and fonts.dsk" size="143360" crc="b88e7013" sha1="3ca61b56c8f4f53477587259f4b9ca7f6d87e273" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Backgrounds"/>
- <dataarea name="flop" size="143360">
- <rom name="superprint (4am crack) disk 2 side b - backgrounds.dsk" size="143360" crc="fb645c62" sha1="3231fdd06d35843a60daaaa044d812aa8de6a091" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A - Poster art"/>
- <dataarea name="flop" size="143360">
- <rom name="superprint (4am crack) disk 3 side a - poster art.dsk" size="143360" crc="c9358f37" sha1="c7956ca43c12acc04874191761fb37a5c70b60ee" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B - Banners"/>
- <dataarea name="flop" size="143360">
- <rom name="superprint (4am crack) disk 3 side b - banners.dsk" size="143360" crc="73f3a0a6" sha1="25d8918c8ea9adfdee10052e7f9a8bdc732bf281" />
- </dataarea>
- </part>
- </software>
-
- <software name="spelcarn">
- <description>Spelling Carnival (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Softsmith</publisher>
- <info name="release" value="2015-06-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="spelling carnival (softsmith) (4am crack).dsk" size="143360" crc="279a9231" sha1="89b8c913e77d6fe6dd65181b550c5d1c24ead036" />
- </dataarea>
- </part>
- </software>
-
<software name="pladdit">
<description>Addition (Prescription Learning) (cleanly cracked)</description>
<year>1984</year>
@@ -20273,19 +9206,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rrbit13">
- <description>Reader Rabbit (version 1.3) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reader rabbit 1.3 (4am crack).dsk" size="143360" crc="6a1d7564" sha1="75963345129602717b02f8554bd8e759d5d44d4b" />
- </dataarea>
- </part>
- </software>
-
<software name="aceclc20">
<description>AceCalc (version 2.0) (cleanly cracked)</description>
<year>1983</year>
@@ -20304,7 +9224,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Terrapin</publisher>
<info name="release" value="2015-07-15"/>
- <!--"Terrapin Logo" is a 1985 programming environment distributed by Terrapin, Inc. This is version 3.0, preserved here for the first time.-->
+ <!-- "Terrapin Logo" is a 1985 programming environment distributed by Terrapin, Inc. This is version 3.0, preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="143360">
@@ -20339,72 +9259,6 @@ license:CC0-1.0
</part>
</software>
- <software name="satreadc">
- <description>SAT Score Improvement System: Reading Comprehension (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2015-07-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - reading comprehension (4am crack).dsk" size="143360" crc="9769462e" sha1="8da44b87e307b1ee657ffaa20659b8e8a30436cb" />
- </dataarea>
- </part>
- </software>
-
- <software name="satvocab">
- <description>SAT Score Improvement System: Vocabulary (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2015-07-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - vocabulary (4am crack) side a.dsk" size="143360" crc="a15b2691" sha1="15fc150eed3026dd07ed3edf32dac12227b3e83b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - vocabulary (4am crack) side b.dsk" size="143360" crc="73f2e5b1" sha1="093e08fa9679f7ff0de8b4ac0e9bd43c659bee3d" />
- </dataarea>
- </part>
- </software>
-
- <software name="satgeom">
- <description>SAT Score Improvement System: Geometry (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2015-07-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - geometry (4am crack) side a.dsk" size="143360" crc="1546dc51" sha1="307be3502073a328af0fe443b38eb6f13625c97d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - geometry (4am crack) side b.dsk" size="143360" crc="cceba950" sha1="849cf06f184eb32940a81426537bc86a3a3916f3" />
- </dataarea>
- </part>
- </software>
-
- <software name="jrgchaos">
- <description>The Jar Game and Chaos (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2015-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the jar game and chaos (4am crack).dsk" size="143360" crc="5eb0eebc" sha1="4add93afb555bb62c363e36667a2c714b0a200d0" />
- </dataarea>
- </part>
- </software>
-
<software name="upndown">
<description>Up'N Down (cleanly cracked)</description>
<year>1984</year>
@@ -20418,68 +9272,6 @@ license:CC0-1.0
</part>
</software>
- <software name="perfcoll">
- <description>The Perfect College (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2015-08-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect college (4am crack) side a.dsk" size="143360" crc="662cc864" sha1="be29a1d1eba1f8f9cd07d76244d18694758ea4f4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the perfect college (4am crack) side b.dsk" size="143360" crc="99e3850b" sha1="0ce92cfe260c64dbbf1cc1e65016f57fda8626ed" />
- </dataarea>
- </part>
- </software>
-
- <software name="questr2">
- <description>The Quest (Revision 2, 1984) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2015-08-13"/>
- <!-- This is the 1984 re-release, with updated double hi-res graphics by
- Marsha and Steve Meuse. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the quest revision 2 (4am crack) side a.dsk" size="143360" crc="41088b27" sha1="bae0274ababd10baea488c27d53625cc353df20d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the quest revision 2 (4am crack) side b.dsk" size="143360" crc="41232904" sha1="67b674fcd9286131b986564ba981f7ab3ad724a1" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrabbt12">
- <description>Writer Rabbit (version 1.2) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-08-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="writer rabbit 1.2 (4am crack) side a.dsk" size="143360" crc="89feb276" sha1="a03366f12b32b1a1778326565765fa9ceac41bdb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="writer rabbit 1.2 (4am crack) side b.dsk" size="143360" crc="4f3b676b" sha1="576833e86e42d6667796015cb8ed0e68537bfb11" />
- </dataarea>
- </part>
- </software>
-
<software name="successn">
<description>Succession (cleanly cracked)</description>
<year>1982</year>
@@ -20493,21 +9285,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ssstarbl">
- <description>Starblaster (Softsmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Softsmith</publisher>
- <info name="release" value="2015-08-21"/>
- <!-- Originally distributed by Piccadilly Software, this version was
- redistributed by Softsmith. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="starblaster (softsmith) (4am crack).dsk" size="143360" crc="73039ce0" sha1="4d5c093a3469467610e23cd5c5a0652170a9c916" />
- </dataarea>
- </part>
- </software>
-
<software name="otteradv">
<description>The Otters' Adventure (cleanly cracked)</description>
<year>1985</year>
@@ -20521,52 +9298,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spelmach">
- <description>The Spelling Machine (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Seed Company</publisher>
- <info name="release" value="2015-08-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the spelling machine (4am crack).dsk" size="143360" crc="bac3ea1c" sha1="60771a47cbb3c356d38e3d2110a68c14c90efe0a" />
- </dataarea>
- </part>
- </software>
-
- <software name="hcwwww">
- <description>Who What When Where (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2015-08-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="who what when where (4am crack).dsk" size="143360" crc="88b28db0" sha1="09b609445dd1ed8a1f9179295c5356a55c54aa94" />
- </dataarea>
- </part>
- </software>
-
- <software name="sherabow">
- <description>Sherlock Holmes in Another Bow (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Bantam Software</publisher>
- <info name="release" value="2015-08-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="sherlock holmes in another bow (4am crack) side a.dsk" size="143360" crc="3cf815b5" sha1="d7c5bd138a2a1800446780cd2ea0f6a023b5b7a6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="sherlock holmes in another bow (4am crack) side b.dsk" size="143360" crc="4c5b5240" sha1="f4698d14f76060e7174c12fecdcf0f34c0640c97" />
- </dataarea>
- </part>
- </software>
-
<software name="aliens">
<description>Aliens (cleanly cracked)</description>
<year>1987</year>
@@ -20588,32 +9319,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sgrfactr">
- <description>Spanish Grammar Review: Future and Conditional Tenses of Regular and Irregular Verbs (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2015-08-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="spanish grammar review - future and conditional tenses of regular and irregular verbs (4am crack).dsk" size="143360" crc="1dc98e65" sha1="cf63aa9cab3fe3c51c4db9def5c13a2f5cc679f9" />
- </dataarea>
- </part>
- </software>
-
- <software name="sgrffcan">
- <description>Spanish Grammar Review: Familiar and Formal Commands in the Affirmative and Negative (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2015-08-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="spanish grammar review - familiar and formal commands in the affirmative and negative (4am crack).dsk" size="143360" crc="d4dcb5dc" sha1="40890c5e5edf505ab555ab7f7731c42be3b53cd2" />
- </dataarea>
- </part>
- </software>
-
<software name="tcoddwcn">
<description>The Chief of Detectives: Drawing Conclusions (cleanly cracked)</description>
<year>1985</year>
@@ -20627,30 +9332,10 @@ license:CC0-1.0
</part>
</software>
- <software name="wrabbt10">
- <description>Writer Rabbit (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-09-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="writer rabbit 1.0 (4am crack) side a.dsk" size="143360" crc="fd1e4a40" sha1="a088465caaf4947e04d52b9ac63cf71fbd5fcbe9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="writer rabbit 1.0 (4am crack) side b.dsk" size="143360" crc="6f492364" sha1="2a09033d2703e1a3f2aa20fa782361e3574b6a18" />
- </dataarea>
- </part>
- </software>
-
<software name="chgearth">
<description>The Changing Earth (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2015-09-08"/>
<part name="flop1" interface="floppy_5_25">
@@ -20736,39 +9421,6 @@ license:CC0-1.0
</part>
</software>
- <software name="satquanc">
- <description>SAT Score Improvement System: Quantitative Comparisons (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2015-09-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - quantitative comparisons (4am crack) side a.dsk" size="143360" crc="71885927" sha1="90a4b3002c5416803dc189868986dcf7995af0ce" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - quantitative comparisons (4am crack) side b.dsk" size="143360" crc="c32f2154" sha1="2796b3280aee07aec39c3072aabd4e7ebe459460" />
- </dataarea>
- </part>
- </software>
-
- <software name="mwcadfrc">
- <description>Adding Fractions (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops Courseware</publisher>
- <info name="release" value="2015-09-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="adding fractions (4am crack).dsk" size="143360" crc="7854117b" sha1="e14b13e47ff1dcf32585d454b3d0b0812eef1fb6" />
- </dataarea>
- </part>
- </software>
-
<software name="alc2quad">
<description>The Algebra Coach II: Introduction to Quadratic Equations (cleanly cracked)</description>
<year>1985</year>
@@ -20782,26 +9434,6 @@ license:CC0-1.0
</part>
</software>
- <software name="readnme">
- <description>Reading and Me (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-10-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="reading and me (4am crack) side a.dsk" size="143360" crc="a709e079" sha1="66d6ca72378cf0c36f49981f9a05d581784625da" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="reading and me (4am crack) side b.dsk" size="143360" crc="0df18cdf" sha1="cd299cbbeec30d1921764f9b8582bb83fbbf8571" />
- </dataarea>
- </part>
- </software>
-
<software name="snoopyrs">
<description>Snoopy to the Rescue (cleanly cracked)</description>
<year>1984</year>
@@ -20822,32 +9454,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rdfbcons">
- <description>Reading Fun: Beginning Consonant Sounds (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2015-10-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reading fun - beginning consonant sounds (4am crack).dsk" size="143360" crc="768b9f33" sha1="495b9b914a2c701be58aec1f05638055c54ae439" />
- </dataarea>
- </part>
- </software>
-
- <software name="starblst">
- <description>Starblaster (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Piccadilly Software</publisher>
- <info name="release" value="2015-10-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="starblaster (4am crack).dsk" size="143360" crc="e510290f" sha1="d62a2c9d96e2de33de004bde65f11ef7d382b041" />
- </dataarea>
- </part>
- </software>
-
<software name="observat">
<description>The Observatory (cleanly cracked)</description>
<year>1984</year>
@@ -20894,32 +9500,6 @@ license:CC0-1.0
</part>
</software>
- <software name="thquik12">
- <description>Think Quick (version 1.2) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2015-11-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="think quick 1.2 (4am crack) side a.dsk" size="143360" crc="a75e7419" sha1="22b7e4cf23394f94d85663b18da620acd5f5b96d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="think quick 1.2 (4am crack) side b.dsk" size="143360" crc="98237aa2" sha1="c7f022caf3aa8bce91397b0081a509e286291535" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Storage Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="think quick 1.2 (4am crack) storage disk.dsk" size="143360" crc="33f5a093" sha1="d51eaef571e24ca419f0a93ae740ccfbbf6c4a4f" />
- </dataarea>
- </part>
- </software>
-
<software name="eatnmach">
<description>The Eating Machine (version 08.15.83) (cleanly cracked)</description>
<year>1982</year>
@@ -20940,26 +9520,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spdrdr2">
- <description>Speed Reader II (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="speed reader ii (4am crack) disk 1.dsk" size="143360" crc="b78124a2" sha1="d9bce6adfa855e4e2fe2315bdffa245e68533d93" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="speed reader ii (4am crack) disk 2.dsk" size="143360" crc="2ffbc285" sha1="860442365457d7fd768d7e5ab1b3f012b4039747" />
- </dataarea>
- </part>
- </software>
-
<software name="suprbuny">
<description>Super Bunny (cleanly cracked)</description>
<year>1983</year>
@@ -20973,207 +9533,6 @@ license:CC0-1.0
</part>
</software>
- <software name="35wdattk">
- <description>Word Attack (800K 3.5") (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-10-27"/>
- <!-- This is distributed on a single 3.5-inch (800K) disk for the Apple IIgs,
- Apple //c+, or Apple //e (with compatible drive controller card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="word attack 800k (4am crack).2mg" size="819264" crc="25415acb" sha1="ca96f43b1d9a7134318c2baa43179a529f626a32" />
- </dataarea>
- </part>
- </software>
-
- <software name="35watksp">
- <description>Word Attack Plus Spanish (800K 3.5") (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-10-27"/>
- <!-- This is version 1.2, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="word attack plus spanish 800k (4am crack).2mg" size="819264" crc="4f92acb4" sha1="12421999bb00b54c8ae825dd9ee43e55de0c9a4e" />
- </dataarea>
- </part>
- </software>
-
- <software name="35algebl">
- <description>Alge-Blaster (800K 3.5") (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-10-30"/>
- <!-- This is distributed on a single 3.5-inch (800K) disk for the Apple IIgs,
- Apple //c+, or Apple //e (with compatible drive controller card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="alge-blaster (4am crack).2mg" size="819264" crc="ea796c21" sha1="395572a20a0049a76cc9a72dcb32d50c1b18abe5" />
- </dataarea>
- </part>
- </software>
-
- <software name="35mblmys">
- <description>Math Blaster Mystery (800K 3.5") (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-04"/>
- <!-- This is version 1.3, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="math blaster mystery 800k v1.3 (4am crack).2mg" size="819264" crc="1a069e56" sha1="993931fe5e6b238f41e4d19abd7433f81d407545" />
- </dataarea>
- </part>
- </software>
-
- <software name="35mbplus">
- <description>Math Blaster Plus (version 3.6) (800K 3.5") (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-04"/>
- <!-- This is version 3.6, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="math blaster plus 800k 3.6 (4am crack).2mg" size="819264" crc="9ef04948" sha1="e859a141ad701e068dd454884c49036c98dca8c6" />
- </dataarea>
- </part>
- </software>
-
- <software name="35readr1">
- <description>Read 'N Roll (800K 3.5") (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-04"/>
- <!-- This is version 1.1, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="read n roll 800k 1.1 (4am crack).2mg" size="819264" crc="735624d3" sha1="072718512aa329667b1a97940aad95d630b48f0c" />
- </dataarea>
- </part>
- </software>
-
- <software name="35spelpl">
- <description>Spell It Plus (800K 3.5") (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-04"/>
- <!-- This is distributed on a single 3.5-inch (800K) disk for the Apple IIgs,
- Apple //c+, or Apple //e (with compatible drive controller card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="spell it plus 800k (4am crack).2mg" size="819264" crc="46ffcce2" sha1="7f85b85de5390ae97eb4445da619a88639687e34" />
- </dataarea>
- </part>
- </software>
-
- <software name="35mathme">
- <description>Math and Me (800K 3.5") (version 1.6) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-04"/>
- <!-- This is version 1.6, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="math and me 800k 1.6 (4am crack).2mg" size="819264" crc="a0621587" sha1="1727888d24b6c8b745b055bf6ca191db49f0deb9" />
- </dataarea>
- </part>
- </software>
-
- <software name="35mbpl37">
- <description>Math Blaster Plus (800K 3.5") (version 3.7) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-04"/>
- <!-- This is version 3.7, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="math blaster plus 800k 3.7 (4am crack).2mg" size="819264" crc="4781fe32" sha1="8ac9709f69b9d517ebd0f18dc1810dfe27cde66f" />
- </dataarea>
- </part>
- </software>
-
- <software name="35watkf3">
- <description>Word Attack Plus French (800K 3.5") (version 1.3) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-16"/>
- <!-- This is version 1.3, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="word attack plus french 800k 1.3 (4am crack).2mg" size="819264" crc="f38ac823" sha1="d57b095d98447be91abd1533cacb1d38946efed3" />
- </dataarea>
- </part>
- </software>
-
- <software name="35grmrgm">
- <description>Grammar Gremlins (800K 3.5") (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-26"/>
- <!-- This is distributed on a single 3.5-inch (800K) disk for the Apple IIgs,
- Apple //c+, or Apple //e (with compatible drive controller card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="grammar gremlins 800k (4am crack).2mg" size="819264" crc="25af0038" sha1="46364f5894b81cb3dce4efa3397ddaef35a6d75f" />
- </dataarea>
- </part>
- </software>
-
- <software name="35algp10">
- <description>Alge-Blaster Plus (800K 3.5") (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-11-26"/>
- <!-- This is distributed on a single 3.5-inch (800K) disk for the Apple IIgs,
- Apple //c+, or Apple //e (with compatible drive controller card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="alge-blaster plus 800k (4am crack).2mg" size="819264" crc="5869f6ff" sha1="f43860cec0ff54f89045e0ed0c4411667930600e" />
- </dataarea>
- </part>
- </software>
-
- <software name="35spelit">
- <description>Spell It (800K 3.5") (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2015-12-08"/>
- <!-- This is distributed on a single 3.5-inch (800K) disk for the Apple IIgs,
- Apple //c+, or Apple //e (with compatible drive controller card) -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="spell it 800k (4am crack).2mg" size="819264" crc="5631759c" sha1="2916f443a2784caa8ca0289aabbe2a3d55378127" />
- </dataarea>
- </part>
- </software>
-
<software name="gcgmwrks">
<description>The Great Computer GameWorks (cleanly cracked)</description>
<year>1983</year>
@@ -21207,74 +9566,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sumrswan">
- <description>Micro Skillbuilder Set II: The Summer of the Swans (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-12-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the summer of the swans (4am crack).dsk" size="143360" crc="53ea24d5" sha1="4caf93044126706ccc35c1020c3b0d8d2c9c2870" />
- </dataarea>
- </part>
- </software>
-
- <software name="tfctry83">
- <description>The Factory (1983 Version) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2015-12-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the factory (1983) (4am crack).dsk" size="143360" crc="21b35348" sha1="f8387b147600f8f7700a3d964afc15bd578fd8dc" />
- </dataarea>
- </part>
- </software>
-
- <software name="srvytakr">
- <description>Survey Taker (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2015-12-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="survey taker (4am crack).dsk" size="143360" crc="39ebac7e" sha1="6e8fa4b5b9c91a9127d5eae0f1a5b1efd6dcb378" />
- </dataarea>
- </part>
- </software>
-
- <software name="flyncrpt">
- <description>The Flying Carpet (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Litag</publisher>
- <info name="release" value="2015-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the flying carpet (4am crack).dsk" size="143360" crc="9816fdac" sha1="788e9b3b0e09d811b38da1e26e614da13bd22a23" />
- </dataarea>
- </part>
- </software>
-
- <software name="tvocscih">
- <description>TEAM Vocabulary: Science and Health (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2016-01-05"/>
- <!-- This is version 1.0, distributed on a single 3.5-inch (800K) disk for
- the Apple IIgs, Apple //c+, or Apple //e (with compatible drive controller
- card). -->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="team vocabulary - science and health 800k (4am crack).2mg" size="819264" crc="6874ecc3" sha1="67b48476a3dc66854fa1b0a2ede529c69cec2f6d" />
- </dataarea>
- </part>
- </software>
-
<software name="wrdmabco">
<description>Word Mentor: ABC Order (cleanly cracked)</description>
<year>1985</year>
@@ -21392,45 +9683,6 @@ license:CC0-1.0
</part>
</software>
- <software name="kingrule">
- <description>The King's Rule (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the king's rule (4am crack).dsk" size="143360" crc="7d84770f" sha1="2b39d04e0d34fd24ce76a5f11167237031a080c6" />
- </dataarea>
- </part>
- </software>
-
- <software name="thepond">
- <description>The Pond (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the pond (4am crack).dsk" size="143360" crc="d0269833" sha1="528ef44ed3b174d0b02468e064d5a059d191af44" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdquest">
- <description>Word Quest (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-01-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word quest (4am crack).dsk" size="143360" crc="760ee31c" sha1="7dd42b1122c2d8551664f45af1edd330980b9b4a" />
- </dataarea>
- </part>
- </software>
-
<software name="statesgm">
<description>The States Game (cleanly cracked)</description>
<year>1983</year>
@@ -21457,19 +9709,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mnys1cnt">
- <description>The Money Series - Step 1 Counting (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the money series - step 1 counting (4am crack).dsk" size="143360" crc="822ac32f" sha1="8842d232e7addf3c8797712e36a268f28c64ad95" />
- </dataarea>
- </part>
- </software>
-
<software name="coinchngr">
<description>The Coin Changer (cleanly cracked)</description>
<year>1985</year>
@@ -21488,7 +9727,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Heartsoft</publisher>
<info name="release" value="2016-01-17"/>
- <!--"Tommy the Time Telling Turtle" is a 1985 educational program distributed by Heartsoft, Inc. It is preserved here for the first time.-->
+ <!-- "Tommy the Time Telling Turtle" is a 1985 educational program distributed by Heartsoft, Inc. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="tommy the time telling turtle (4am crack).dsk" size="143360" crc="ddb32109" sha1="c1e08d7a9f91708f0291508c553e318e3ad4921d" />
@@ -21496,39 +9735,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wwwww189">
- <description>Who What When Where Why (version 01.27.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-01-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="who what when where why 1989 (4am crack).dsk" size="143360" crc="b723ffc3" sha1="d56aa94919c7d6b665dac7488fc6f2231dc684c4" />
- </dataarea>
- </part>
- </software>
-
- <software name="talefant">
- <description>Tales of Fantasy (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-01-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of fantasy (4am crack) side a.dsk" size="143360" crc="dea088a1" sha1="97ad29b941c97f190af590b77c6500328c29c140" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of fantasy (4am crack) side b.dsk" size="143360" crc="252b3eb3" sha1="c040600a7bdd9af3abc3923172fec56e8c974c98" />
- </dataarea>
- </part>
- </software>
-
<software name="decades2">
<description>The Decades Game 2 (cleanly cracked)</description>
<year>1983</year>
@@ -21542,58 +9748,6 @@ license:CC0-1.0
</part>
</software>
- <software name="succread">
- <description>Success with Reading (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-01-27"/>
- <!-- Story disks level C-F were present, which suggests A and B exist.
- They were not present and are assumed missing. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Program Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) program disk.dsk" size="143360" crc="8e6f761a" sha1="17c7d65441645e74c0312c973fb9671724955f62" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Story disk level A"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) story disk a.dsk" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Story disk level B"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) story disk b.dsk" size="143360" status="nodump" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Story disk level C"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) story disk c.dsk" size="143360" crc="4605523f" sha1="5013c4de4948288866a8abcd4d80c8157733843b" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Story disk level D"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) story disk d.dsk" size="143360" crc="b0c5b861" sha1="92086206f8fc0ceb6ee37161a7f22fbb585f2ee5" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Story disk level E"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) story disk e.dsk" size="143360" crc="83ca09d1" sha1="0a4e80ff3be843928597e972d26af7e4225ae0ff" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Story disk level F"/>
- <dataarea name="flop" size="143360">
- <rom name="success with reading (4am crack) story disk f.dsk" size="143360" crc="f55bf4d6" sha1="5eb4107c97e1e6b63615d5b7e69432328aeb2142" />
- </dataarea>
- </part>
- </software>
-
<software name="decades3">
<description>The Decades Game 3 (cleanly cracked)</description>
<year>1983</year>
@@ -21607,117 +9761,6 @@ license:CC0-1.0
</part>
</software>
- <software name="addmagic">
- <description>Addition Magician (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2016-01-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="addition magician (4am crack).dsk" size="143360" crc="16cbdf67" sha1="17bb8a5e1409f67a654b33e243f8ff57fb1f094a" />
- </dataarea>
- </part>
- </software>
-
- <software name="cbookmkr">
- <description>The Comic Book Maker (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2016-02-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="the comic book maker (4am crack) disk 1 - program.dsk" size="143360" crc="159bf70e" sha1="ee7388606a22868263b49d394922d36f1ffc8fd1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Background"/>
- <dataarea name="flop" size="143360">
- <rom name="the comic book maker (4am crack) disk 2 - background.dsk" size="143360" crc="574192ca" sha1="6495275528fa58a66f1a6c944b5254cacb0fe6ac" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Clip art"/>
- <dataarea name="flop" size="143360">
- <rom name="the comic book maker (4am crack) disk 3 - clip art.dsk" size="143360" crc="a46ac975" sha1="aaeb29e74c85ac83113717cbb931f6fd61fa17a8" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Clip art"/>
- <dataarea name="flop" size="143360">
- <rom name="the comic book maker (4am crack) disk 4 - clip art.dsk" size="143360" crc="e4689708" sha1="c03f33d71459a134567af55037f810ac866a73db" />
- </dataarea>
- </part>
- </software>
-
- <software name="tcsmdiet">
- <description>The Complete Scarsdale Medical Diet (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Bantam Electronic Publishing</publisher>
- <info name="release" value="2016-02-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="the complete scarsdale medical diet (4am crack) disk 1.dsk" size="143360" crc="6d7621da" sha1="e463d0a11858d953ef18f927c7a8e2f436365961" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="the complete scarsdale medical diet (4am crack) disk 2.dsk" size="143360" crc="ca073c01" sha1="7660fc8da5ae4f14313d1519477284acf917fe9f" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Data disk"/>
- <dataarea name="flop" size="143360">
- <rom name="the complete scarsdale medical diet (4am crack) disk 3 - data disk.dsk" size="143360" crc="1722d51e" sha1="33eac66bbd108e243e3b6a2715d85f7a3a2bf1c6" />
- </dataarea>
- </part>
- </software>
-
- <software name="scuffy89">
- <description>Scuffy and Friends (version 07.05.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-02-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="scuffy and friends (4am crack) disk 1.dsk" size="143360" crc="8e3c68cf" sha1="c1365a95b587c367b0b34bdb4af57e26d9d2732b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="scuffy and friends (4am crack) disk 2.dsk" size="143360" crc="efe68056" sha1="acab7204a77f5397207f7e15dc963bd88871fba0" />
- </dataarea>
- </part>
- </software>
-
- <software name="readmng1">
- <description>Reading for Meaning Level 1 (version 03.11.86) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-02-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="reading for meaning level 1 (4am crack) disk 1.dsk" size="143360" crc="48d23eec" sha1="b66ed723bcd5eafd86a401471d1a4ff91c6ed749" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="reading for meaning level 1 (4am crack) disk 2.dsk" size="143360" crc="2ccd7134" sha1="318c8c4d2968d8c27d29d67ea0ed8b6cdcbe0431" />
- </dataarea>
- </part>
- </software>
-
<software name="wforecst">
<description>Weather Forecasting (cleanly cracked)</description>
<year>1985</year>
@@ -21731,45 +9774,6 @@ license:CC0-1.0
</part>
</software>
- <software name="acidbase">
- <description>Acid/Base Reactions (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-02-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="acid base reactions (4am crack).dsk" size="143360" crc="fa5db5c3" sha1="170cc86fae588b8e058e50d48e27191fd6168a96" />
- </dataarea>
- </part>
- </software>
-
- <software name="magicstr">
- <description>The Magic String (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-02-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the magic string (4am crack).dsk" size="143360" crc="5fec84ee" sha1="6702d75cccf3ecfeb490d7ee96a28c8ab1b92eb7" />
- </dataarea>
- </part>
- </software>
-
- <software name="spdrdr2b">
- <description>Speed Reader II (version 09.12.86) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2016-03-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="speed reader ii 091286 (4am crack).dsk" size="143360" crc="4ea75cbc" sha1="8a2915eac02e593d9d0fb88422929072237c81f4" />
- </dataarea>
- </part>
- </software>
-
<software name="splat841">
<description>Spelling Attack (version 84-01) (cleanly cracked)</description>
<year>1984</year>
@@ -21783,42 +9787,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hvrbs587">
- <description>Verbs (version 05.23.87) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-03-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="verbs (hartley courseware) (4am crack) disk 1.dsk" size="143360" crc="e31bea79" sha1="87f4ee6715e7ee16b7b7a6f5bc989dd47d1010c4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="verbs (hartley courseware) (4am crack) disk 2.dsk" size="143360" crc="2363d4c0" sha1="de733c47c4bbe92b6b252a689dcac06b19f190f9" />
- </dataarea>
- </part>
- </software>
-
- <software name="verbusg3">
- <description>Verb Usage 3 (version 08.17.87) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-03-06"/>
- <!-- Despite the title being 'disk 3', these appear to have been separate
- programs; 4AM released each as such.. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="verb usage (4am crack) disk 3.dsk" size="143360" crc="1e2bcc51" sha1="f4ef92c44698473f8ba7e1157cd8d42ff9c00a1d" />
- </dataarea>
- </part>
- </software>
-
<software name="spacmath">
<description>Space Math (cleanly cracked)</description>
<year>1983</year>
@@ -21884,41 +9852,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rboots40">
- <description>Rocky's Boots (version 4.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2016-04-01"/>
- <!-- Disks re-cracked in September 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rocky's boots 4.0 (4am crack).dsk" size="143360" crc="2fcb648a" sha1="e6dffa75930aba8c4d97a5929be444c3ef8beee6" />
- </dataarea>
- </part>
- </software>
-
- <software name="rboots40b" cloneof="rboots40">
- <description>Rocky's Boots (version 4.0) (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2016-04-01"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rocky's boots 4.0 (imperfect 4am crack).dsk" size="143360" crc="fdf32263" sha1="d1ee264209ad6b497a9c0415954c32f3df788f52" />
- </dataarea>
- </part>
- </software>
-
<software name="wrdroult">
<description>Word Roulette (cleanly cracked)</description>
<year>1984</year>
@@ -21932,26 +9865,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rmljackb">
- <description>Reading Magic Library: Jack in the Beanstalk (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Tom Snyder Productions</publisher>
- <info name="release" value="2016-04-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="reading magic library - jack in the beanstalk (4am crack) side a.dsk" size="143360" crc="1e416db8" sha1="e376def9d99dc80cb6a557dba81bf692b82e089a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="reading magic library - jack in the beanstalk (4am crack) side b.dsk" size="143360" crc="2ba00460" sha1="ef38a4058d01f65baebb06a24f58bf6abdbc356a" />
- </dataarea>
- </part>
- </software>
-
<software name="vocbsenr">
<description>The Vocabulary Game: Senior Level (cleanly cracked)</description>
<year>1984</year>
@@ -21965,26 +9878,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wdak83">
- <description>Word Attack (version 1983) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2016-04-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack 1983 (4am crack) disk 1 - program.dsk" size="143360" crc="9184fed7" sha1="b0099e8188d2fc5d820a93406ecb17b47d1dd7bf" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data"/>
- <dataarea name="flop" size="143360">
- <rom name="word attack 1983 (4am crack) disk 2 - data.dsk" size="143360" crc="cb7b46b8" sha1="081544b65438a456bc7d9d19ad1700f89b877a0d" />
- </dataarea>
- </part>
- </software>
-
<software name="qstscltr">
<description>The Quest for the Scarlet Letter (cleanly cracked)</description>
<year>1982</year>
@@ -22186,46 +10079,6 @@ license:CC0-1.0
</part>
</software>
- <software name="earlychr">
- <description>The Early Church (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Baker Book House</publisher>
- <info name="release" value="2016-07-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the early church (4am crack) side a.dsk" size="143360" crc="ff674e0a" sha1="34f3d0df13e45ef4f9b9725f3a6223118f5218f8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the early church (4am crack) side b.dsk" size="143360" crc="43d77d07" sha1="7f5c397fe3f1878acedc0dbd46d44061825d705e" />
- </dataarea>
- </part>
- </software>
-
- <software name="srchking">
- <description>Searching for a King (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Baker Book House</publisher>
- <info name="release" value="2016-07-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="searching for a king (4am crack) side a.dsk" size="143360" crc="1e408ef1" sha1="1a3ec7f6aefb5c4e1052fa4aeb0240d16183f493" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="searching for a king (4am crack) side b.dsk" size="143360" crc="7c95ce05" sha1="ee6564179ef110a37cc9737a4a72c5899f104348" />
- </dataarea>
- </part>
- </software>
-
<software name="wndrqst">
<description>WonderQuest (cleanly cracked)</description>
<year>1984</year>
@@ -22239,32 +10092,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hvrbs987">
- <description>Verbs (version 09.15.87) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-07-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verbs 09.15.87 (4am crack).dsk" size="143360" crc="65ac1f15" sha1="f91016d65519d920ba8efc66b6f9d695c320e4b3" />
- </dataarea>
- </part>
- </software>
-
- <software name="stoichio">
- <description>Stoichiometry (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2016-07-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="stoichiometry (4am crack).dsk" size="143360" crc="273ec5c2" sha1="55362a48f91258c9353beed4ef94b9485aedd9a3" />
- </dataarea>
- </part>
- </software>
-
<software name="sciislan">
<description>The Secrets of Science Island (cleanly cracked)</description>
<year>1984</year>
@@ -22285,45 +10112,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tgeostri">
- <description>The Geometric Supposer: Triangles (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-07-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the geometric supposer - triangles (4am crack).dsk" size="143360" crc="dacddc90" sha1="a9023995368a3b10f6c196999329400b066df535" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdsrch">
- <description>Word Search (version 09.20.84) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-07-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word search (4am crack).dsk" size="143360" crc="ad54fcc8" sha1="ddce53be386d1420f46904f2119769c5825d77e8" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssisalge">
- <description>SAT Score Improvement System: Algebra (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2016-07-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sat score improvement system - algebra (4am crack).dsk" size="143360" crc="0970f773" sha1="adbd341be774bab2abacf46154c7f3e93e0b58f9" />
- </dataarea>
- </part>
- </software>
-
<software name="tagtmwrs">
<description>Tag Team Wrestling (cleanly cracked)</description>
<year>1984</year>
@@ -22359,19 +10147,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sammyltf">
- <description>Sammy Lightfoot (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2016-07-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sammy lightfoot (4am crack).dsk" size="143360" crc="afbef357" sha1="b0ae2cc0e8279c7bf6f35f3ed88659a9f697f18a" />
- </dataarea>
- </part>
- </software>
-
<software name="tubeway">
<description>Tubeway (cleanly cracked)</description>
<year>1982</year>
@@ -22385,41 +10160,6 @@ license:CC0-1.0
</part>
</software>
- <software name="submissn">
- <description>Sub Mission (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2016-07-26"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sub mission (4am crack).dsk" size="143360" crc="cad5e0f2" sha1="f72716872680591d938c2a8509016841bcae6714" />
- </dataarea>
- </part>
- </software>
-
- <software name="submissnb" cloneof="submissn">
- <description>Sub Mission (imperfect clean crack)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2016-07-26"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sub mission (imperfect 4am crack).dsk" size="143360" crc="3200326f" sha1="4f5db3436135fb3c48cfe909000708b9e92b5a2e" />
- </dataarea>
- </part>
- </software>
-
<software name="thartunl">
<description>Tharolian Tunnels (cleanly cracked)</description>
<year>1982</year>
@@ -22433,67 +10173,6 @@ license:CC0-1.0
</part>
</software>
- <software name="teidolon">
- <description>The Eidolon (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-07-26"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the eidolon (4am crack).dsk" size="143360" crc="631b027b" sha1="9318b15135daf66cebb3f9ed726dcb76e912006f" />
- </dataarea>
- </part>
- </software>
-
- <software name="teidolonb" cloneof="teidolon">
- <description>The Eidolon (imperfect clean crack)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-07-26"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the eidolon (imperfect 4am crack).dsk" size="143360" crc="3de6ea12" sha1="fe83ee31fdc13d6ce13541eddd7edb2df8ef54ae" />
- </dataarea>
- </part>
- </software>
-
- <software name="roadrlyu">
- <description>Road Rally USA (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Bantam Software</publisher>
- <info name="release" value="2016-07-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="road rally usa (4am crack).dsk" size="143360" crc="b902bb9a" sha1="144eb8a8c38260e941dee211bd1ac0c2eb37d179" />
- </dataarea>
- </part>
- </software>
-
- <software name="tetrad">
- <description>Tetrad (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2016-07-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tetrad (4am crack).dsk" size="143360" crc="a4be8830" sha1="a63a62afe40f9ebc58c020e5512c44d52ca5c37b" />
- </dataarea>
- </part>
- </software>
-
<software name="techncop">
<description>Techno Cop (cleanly cracked)</description>
<year>1988</year>
@@ -22657,53 +10336,6 @@ license:CC0-1.0
</part>
</software>
- <software name="thatjob1">
- <description>That's My Job Level 1 (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-07-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="that's my job level 1 (4am crack) disk 1.dsk" size="143360" crc="7e14f0dc" sha1="f15263f33f51004811c55dde99ad19cd021f1657" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="that's my job level 1 (4am crack) disk 2.dsk" size="143360" crc="3ddf705b" sha1="65363301cb29f0c821dcb329808d6fbc452abd94" />
- </dataarea>
- </part>
- </software>
-
- <software name="rgzilfin">
- <description>Rings of Zilfin (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2016-08-01"/>
- <!-- "Rings of Zilfin" is a 1985 adventure game written by Ali Atabeck and distributed by Strategic Simulations, Inc. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="rings of zilfin (4am crack) disk 1.dsk" size="143360" crc="afd62ca7" sha1="78687b14aa9aae7627b268c9c8b4807a634c555b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="rings of zilfin (4am crack) disk 2.dsk" size="143360" crc="f518f2c6" sha1="fef8a883a28c203e8ab8242f25e1c45902e63c72" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="rings of zilfin (4am crack) disk 3.dsk" size="143360" crc="278af922" sha1="c0717ecbd7b4a6c0eb43efed38645644400982f7" />
- </dataarea>
- </part>
- </software>
-
<software name="spnvrbpr">
<description>Spanish Verb Pairs (cleanly cracked)</description>
<year>1984</year>
@@ -22717,19 +10349,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hmbskelm">
- <description>The Human Body and How It Works: The Skeletal and Muscular Systems (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-08-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the human body and how it works - the skeletal and muscular systems (4am crack).dsk" size="143360" crc="fa92e1e6" sha1="f93e15b581ceece9386fef03712317266d7c0afd" />
- </dataarea>
- </part>
- </software>
-
<software name="tomahawk">
<description>Tomahawk (cleanly cracked)</description>
<year>1987</year>
@@ -22743,59 +10362,6 @@ license:CC0-1.0
</part>
</software>
- <software name="xyphus">
- <description>Xyphus (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2016-08-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="xyphus (4am crack) side a.dsk" size="143360" crc="ee14153e" sha1="be08e5edb46f603e8ea9f334fb4a9af6407a86bf" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="xyphus (4am crack) side b.dsk" size="143360" crc="014a80b1" sha1="c26fee0543b9532dba814baf6ab12a5f9a36e50c" />
- </dataarea>
- </part>
- </software>
-
- <software name="tpuzzler">
- <description>The Puzzler (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-08-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the puzzler (4am crack).dsk" size="143360" crc="1d8bd7cf" sha1="f763438274dd1d93e6b6dcf94a18e66a3f5577cd" />
- </dataarea>
- </part>
- </software>
-
- <software name="tsuspens">
- <description>Tales of Suspense (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-08-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of suspense (4am crack) disk 1.dsk" size="143360" crc="02cd704c" sha1="cc0ed5bde82a18c764b9d7345be3665d6d81e2e3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of suspense (4am crack) disk 2.dsk" size="143360" crc="126a5ba2" sha1="1549345908e42a0b05596aa0eef821617e1fb78a" />
- </dataarea>
- </part>
- </software>
-
<software name="tdivermb">
<description>Treasure Dive: Reading for Meaning Level B (version 4.1.6) (cleanly cracked)</description>
<year>1992</year>
@@ -22816,32 +10382,6 @@ license:CC0-1.0
</part>
</software>
- <software name="semacalc">
- <description>The Semantic Calculator (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-08-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the semantic calculator (4am crack).dsk" size="143360" crc="cddb0387" sha1="00069c7aa855392540983eca66c1191f5853cf06" />
- </dataarea>
- </part>
- </software>
-
- <software name="tbalge11">
- <description>Tobbs Learns Algebra (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-08-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tobbs learns algebra (4am crack).dsk" size="143360" crc="b6c50790" sha1="20e129238d65cc6e80f2b2098befc45a53081fef" />
- </dataarea>
- </part>
- </software>
-
<software name="rdcomps2">
<description>Reading Comprehension Skills 2 (cleanly cracked)</description>
<year>1983</year>
@@ -22916,7 +10456,7 @@ license:CC0-1.0
<software name="rosiecrb">
<description>Rosie the Counting Rabbit (cleanly cracked)</description>
<year>1987</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2016-08-24"/>
<part name="flop1" interface="floppy_5_25">
@@ -22926,81 +10466,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tdyniggy">
- <description>Teddy and Iggy (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-08-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="teddy and iggy (4am crack).dsk" size="143360" crc="e059e702" sha1="bbce6c52a00fc22fdf45b0813149ac8d563a1e78" />
- </dataarea>
- </part>
- </software>
-
- <software name="advanalo">
- <description>Advanced Analogies (version 29.06.84) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-09-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="advanced analogies (4am crack) disk 2.dsk" size="143360" crc="827673ff" sha1="55ee9c6da33ebf0a18429f983cc2e2e329dc4f7b" />
- </dataarea>
- </part>
- </software>
-
- <software name="tprholid">
- <description>Troll Printmaker: Holiday Fun (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2016-09-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="troll printmaker - holiday fun (4am crack) disk 1 - program.dsk" size="143360" crc="0f06585e" sha1="2510ed086f2daa94cab2ff04f9da88d070b0ea7a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data"/>
- <dataarea name="flop" size="143360">
- <rom name="troll printmaker - holiday fun (4am crack) disk 2 - data.dsk" size="143360" crc="82a69300" sha1="664d4795702c6ef2ec624dda67d0686c42de5555" />
- </dataarea>
- </part>
- </software>
-
- <software name="schlread">
- <description>Scholastic Reading Comprehension (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2016-09-03"/>
- <!-- Passages Disk Level D strongly implies the existence of other disks
- we don't have. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="scholastic reading comprehension (4am crack) disk 1 - program.dsk" size="143360" crc="0707cd5b" sha1="2ed2cf156ec7e319527d39ae53ad43266eeb5573" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Utilities"/>
- <dataarea name="flop" size="143360">
- <rom name="scholastic reading comprehension (4am crack) disk 2 - utilities.dsk" size="143360" crc="974f81de" sha1="13d1db1f1c43628720bbaa0caa6cef8e81aacfc4" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Passage disk level D"/>
- <dataarea name="flop" size="143360">
- <rom name="scholastic reading comprehension (4am crack) passage disk level d.dsk" size="143360" crc="11a3c03d" sha1="2e1d872574d0697e4aad11effe28e5ed71dd8bb6" />
- </dataarea>
- </part>
- </software>
-
<software name="gradbk41">
<description>The Apple Grade Book (version 4.1) (cleanly cracked)</description>
<year>1984</year>
@@ -23052,7 +10517,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>ERIC Software Publishing</publisher>
<info name="release" value="2016-10-05"/>
- <!--"The Grabit Factory" is a 1983 educational game developed by The Boxes and distributed by ERIC Software Publishing. It is preserved here for the first time.-->
+ <!-- "The Grabit Factory" is a 1983 educational game developed by The Boxes and distributed by ERIC Software Publishing. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the grabit factory (4am crack).dsk" size="143360" crc="6794d03a" sha1="f4de9662ef68b51d46b298064bb01cbd21a2e716" />
@@ -23135,7 +10600,7 @@ license:CC0-1.0
<software name="saursore">
<description>What Makes A Dinosaur Sore (cleanly cracked)</description>
<year>1987</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2016-10-22"/>
<part name="flop1" interface="floppy_5_25">
@@ -23152,65 +10617,6 @@ license:CC0-1.0
</part>
</software>
- <software name="boartime">
- <description>The Boars Tell Time (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Random House</publisher>
- <info name="release" value="2016-10-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the boars tell time (4am crack).dsk" size="143360" crc="74b434a4" sha1="74b36f7ff385bd8d121fa4d7db54b1fa9599adb4" />
- </dataarea>
- </part>
- </software>
-
- <software name="wldr1288">
- <description>Word Ladders (version 12.29.88) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-10-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word ladders (4am crack).dsk" size="143360" crc="6ff46ee7" sha1="85d21a3979a2339294772b835fb4aceb42e688e9" />
- </dataarea>
- </part>
- </software>
-
- <software name="wschswfd">
- <description>Word Search and Super Wordfind (version 02.28.89) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2016-10-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="word search and super wordfind (4am crack) disk 1 - program.dsk" size="143360" crc="267b5925" sha1="8936b487a1560b0ed7be508ba2112a341601079a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data"/>
- <dataarea name="flop" size="143360">
- <rom name="word search and super wordfind (4am crack) disk 2 - data.dsk" size="143360" crc="64cd309f" sha1="35a3338314e5018ded79b5c80aa64e1479d3865b" />
- </dataarea>
- </part>
- </software>
-
- <software name="suprfact">
- <description>The Super Factory (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2016-10-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the super factory (4am crack).dsk" size="143360" crc="e9551c89" sha1="a26870e2ab5f5afb68306034c08a8046344446d1" />
- </dataarea>
- </part>
- </software>
-
<software name="snacatkf">
<description>Snack Attack and Friends (cleanly cracked)</description>
<year>1983</year>
@@ -23275,19 +10681,6 @@ license:CC0-1.0
</part>
</software>
- <software name="stellar7">
- <description>Stellar 7 (Penguin Software) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2016-11-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="stellar 7 (4am crack).dsk" size="143360" crc="69526fd9" sha1="2711ccba9b85775c5d0db5f382f1fd7336d33bab" />
- </dataarea>
- </part>
- </software>
-
<software name="visicomp">
<description>The Visible Computer (cleanly cracked)</description>
<year>1982</year>
@@ -23405,58 +10798,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spdreadr">
- <description>The Speed Reader (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Apple Computer</publisher>
- <info name="release" value="2016-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the speed reader (4am crack).dsk" size="143360" crc="48537f3a" sha1="ca499d90c72dd8cd69aa5b1e8da7cba9e525b027" />
- </dataarea>
- </part>
- </software>
-
- <software name="spectrum">
- <description>Spectrum (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-01-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="spectrum (4am crack).dsk" size="143360" crc="14bdf82e" sha1="e91205ebdb8124567f16b3697d7ebe50330599fb" />
- </dataarea>
- </part>
- </software>
-
- <software name="tipnflip">
- <description>Tip 'N Flip (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-01-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tip 'n flip (4am crack).dsk" size="143360" crc="b8a8d0f5" sha1="1884746ae8a10ac5f2a1f94562793b566cec118f" />
- </dataarea>
- </part>
- </software>
-
- <software name="righturn">
- <description>The Right Turn (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-01-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the right turn (4am crack).dsk" size="143360" crc="30030162" sha1="7e7af9b92e4f3d3d3ff7f5d5641e87e870b92592" />
- </dataarea>
- </part>
- </software>
-
<software name="grmrxmnr">
<description>The Grammar Examiner (cleanly cracked)</description>
<year>1984</year>
@@ -23470,19 +10811,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rndupdwn">
- <description>Round Up, Round Down (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2017-01-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="round up, round down (4am crack).dsk" size="143360" crc="64a265b0" sha1="0c7d2407531d96dd5aed0a248523f34a51cfa7ad" />
- </dataarea>
- </part>
- </software>
-
<software name="statest2">
<description>States and Traits (Revision 2) (cleanly cracked)</description>
<year>1984</year>
@@ -23516,51 +10844,6 @@ license:CC0-1.0
</part>
</software>
- <software name="newtgmes">
- <description>Sir Isaac Newton's Games (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-01-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sir isaac newton's games (4am crack).dsk" size="143360" crc="af0e4a96" sha1="7f7b9d249e583e366d195daea1406f5ae3455256" />
- </dataarea>
- </part>
- </software>
-
- <software name="vcrc0988">
- <description>VCR Companion (version 1988-09-28) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-01-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="vcr companion (4am crack) disk 1.dsk" size="143360" crc="48548da6" sha1="46826e1d92ec91bd7a93a4bf65a9fba7720a57dd" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="vcr companion (4am crack) disk 2.dsk" size="143360" crc="3114f22d" sha1="35d49b0cf75995ee90299688c75b7accfa14bcf2" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="vcr companion (4am crack) disk 3.dsk" size="143360" crc="7af68343" sha1="8ad3600901e8722e6518063c9d3566470dcb1eda" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="vcr companion (4am crack) disk 4.dsk" size="143360" crc="4c520b95" sha1="5edfa54a7f7ca8028624d6d26f271675dde1b7e8" />
- </dataarea>
- </part>
- </software>
-
<software name="mathdoc">
<description>The Math Doctor (cleanly cracked)</description>
<year>1984</year>
@@ -23574,19 +10857,6 @@ license:CC0-1.0
</part>
</software>
- <software name="scboxing">
- <description>Sierra Championship Boxing (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-01-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sierra championship boxing (4am crack).dsk" size="143360" crc="9c558d5c" sha1="ae60bbd58168ee1cba65c4d70e0c1b2c83efd5c9" />
- </dataarea>
- </part>
- </software>
-
<software name="suprhuey">
<description>Super Huey (cleanly cracked)</description>
<year>1985</year>
@@ -23600,52 +10870,6 @@ license:CC0-1.0
</part>
</software>
- <software name="4thr">
- <description>The Fourth R - Reasoning (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MCE</publisher>
- <info name="release" value="2017-02-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the fourth r - reasoning (4am crack).dsk" size="143360" crc="830f5707" sha1="66a9c23fee6e6714554747085055e5b5260b17a9" />
- </dataarea>
- </part>
- </software>
-
- <software name="swrdf386">
- <description>Super Wordfind (version 03.13.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-02-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="super wordfind v03.13.86 (4am crack).dsk" size="143360" crc="25e2b5f9" sha1="12f99f54097f495761b2d735a1efd16f32d2ce49" />
- </dataarea>
- </part>
- </software>
-
- <software name="type2lrn">
- <description>Type to Learn (version 08-OCT-85) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-02-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="type to learn (4am crack) disk 1.dsk" size="143360" crc="9cfd9659" sha1="6e280afbe69351574b3b5d1e44d33c9967082f71" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="type to learn (4am crack) disk 2.dsk" size="143360" crc="87026c54" sha1="17543e8f799b6c39cc0ac1c404910c9c02369215" />
- </dataarea>
- </part>
- </software>
-
<software name="vblibnk1">
<description>Verbal Item Banks 1-14 (version 3.1E) (cleanly cracked)</description>
<year>1983</year>
@@ -23659,116 +10883,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rtnherac">
- <description>Return of Heracles (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="return of heracles (4am and san inc crack).dsk" size="143360" crc="87654cb4" sha1="aa3e9ca5e70e5f5f81ece532b8878e60549b354e" />
- </dataarea>
- </part>
- </software>
-
- <software name="robotrsc">
- <description>Robot Rascals (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="robot rascals (4am and san inc crack).dsk" size="143360" crc="f703ec95" sha1="0b4e4c1277864ab8cbb2dcf9ec61870fc74b3fe5" />
- </dataarea>
- </part>
- </software>
-
- <software name="skyfox">
- <description>Skyfox (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="skyfox (4am and san inc crack).dsk" size="143360" crc="6845ccc7" sha1="4fe67ca0fafe71f7fb647a8c4f7a435d84576c17" />
- </dataarea>
- </part>
- </software>
-
- <software name="brdstale">
- <description>The Bard's Tale (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale (4am and san inc crack) disk 1 - boot.dsk" size="143360" crc="bacac75e" sha1="501388e788ff91c50c4f7d04cfec09b95472119b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Character"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale (4am and san inc crack) disk 2 - character (blank).dsk" size="143360" crc="707662d9" sha1="8f5c57ffb92c5456ad0dd24a707555b1feeb365c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Dungeon"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale (4am and san inc crack) disk 3 - dungeon.dsk" size="143360" crc="e84f952b" sha1="85fadb0443e364b94f8ca16ac6544b7d73da1192" />
- </dataarea>
- </part>
- </software>
-
- <software name="brdtale2">
- <description>The Bard's Tale II (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale ii (4am and san inc crack) side a - program.dsk" size="143360" crc="c55fb52b" sha1="f4060ee43b4650c3d572b322c6b91a1084407830" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Character"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale ii (4am and san inc crack) side b - character.dsk" size="143360" crc="99167f22" sha1="4649d2fd8ab08f8867e73742d1755659fc95e8b2" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C - Dungeon"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale ii (4am and san inc crack) side c - dungeon.dsk" size="143360" crc="cfe689d5" sha1="2955febccd1dcf14aa2b2d349982f3df0dd06938" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D - Dungeon"/>
- <dataarea name="flop" size="143360">
- <rom name="the bard's tale ii (4am and san inc crack) side d - dungeon.dsk" size="143360" crc="32aae10c" sha1="702a98e4c3dddc558184135e4340c5d37a107308" />
- </dataarea>
- </part>
- </software>
-
- <software name="rlmimpss">
- <description>Realm of Impossibility (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-03-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="realm of impossibility (4am and san inc crack).dsk" size="143360" crc="286d4b70" sha1="57b3df41f19e7dc30bb6f8359b99bce72839f7f9" />
- </dataarea>
- </part>
- </software>
-
<software name="spnclssw">
<description>Spanish Classroom Words (cleanly cracked)</description>
<year>1983</year>
@@ -23795,19 +10909,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rboots10">
- <description>Rocky's Boots (version 1.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2017-03-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rocky's boots v1.0 (4am crack).dsk" size="143360" crc="e28b2eb2" sha1="23fdc8a39a9555137d8a71f76c92d112ad3d2dd4" />
- </dataarea>
- </part>
- </software>
-
<software name="ttroll11">
<description>Tiny Troll (version 1.1) (cleanly cracked)</description>
<year>1979</year>
@@ -23925,93 +11026,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wrddetec">
- <description>Word Detective (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="word detective (4am crack) disk 1 - boot.dsk" size="143360" crc="7a14e8b5" sha1="63261019b1e07a17e399411e89d7ac81c9484307" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Dictionary"/>
- <dataarea name="flop" size="143360">
- <rom name="word detective (4am crack) disk 2 - dictionary.dsk" size="143360" crc="a5ffb0a1" sha1="315c87b63755af510bef02c40b5e7a116711925a" />
- </dataarea>
- </part>
- </software>
-
- <software name="subbbear">
- <description>Subtract with Balancing Bear (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="subtract with balancing bear (4am crack).dsk" size="143360" crc="c8666766" sha1="30667ba2ab81f5e219ad7bbc8d7f284f4857c4dd" />
- </dataarea>
- </part>
- </software>
-
- <software name="ttobbsin">
- <description>Teasers by Tobbs with Integers (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="teasers by tobbs with integers (4am crack).dsk" size="143360" crc="0ced537c" sha1="0ad12ba372980e039b0945aa61905a123f29d7be" />
- </dataarea>
- </part>
- </software>
-
- <software name="regroup">
- <description>Regrouping (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="regrouping (4am crack).dsk" size="143360" crc="cdb63d14" sha1="fbf68cb451d0d7e1a8c19d37dcba040186705195" />
- </dataarea>
- </part>
- </software>
-
- <software name="rturn0">
- <description>The Right Turn (Revision 0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-04-14"/>
- <!-- This is the earliest known version has been dubbed "revision 0" to
- distinguish it from other releases). -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the right turn rev. 0 (4am crack).dsk" size="143360" crc="c32f6361" sha1="89d38d27c937aec3cc145d02c824252ed0d3b3b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="shoprght">
- <description>Shop Right (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-04-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="shop right (4am crack).dsk" size="143360" crc="d1865b46" sha1="d2947d6312fc7508096ff6462a6ab55e83a846c0" />
- </dataarea>
- </part>
- </software>
-
<software name="zoogoer">
<description>Zoo Goer (cleanly cracked)</description>
<year>1987</year>
@@ -24072,146 +11086,6 @@ license:CC0-1.0
</part>
</software>
- <software name="milwrdpr">
- <description>The Milliken Word Processor (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the milliken word processor (4am crack).dsk" size="143360" crc="ae22419c" sha1="8860baa9ec434d3db5f070518e621e60f05e6e2a" />
- </dataarea>
- </part>
- </software>
-
- <software name="robody11">
- <description>Robot Odyssey (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2017-04-18"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey v1.1 (4am crack) side a.dsk" size="143360" crc="d96283f8" sha1="52214d4fcecb40ec7960085cccc1ccac564ad016" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey v1.1 (4am crack) side b.dsk" size="143360" crc="ee94e4e3" sha1="de4a3c2fca987603d3e52fe84b3395fe505def14" />
- </dataarea>
- </part>
- </software>
-
- <software name="robody11b" cloneof="robody11">
- <description>Robot Odyssey (version 1.1) (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2017-04-18"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey v1.1 (imperfect 4am crack) side a.dsk" size="143360" crc="8a1986e5" sha1="05d42470c949bf53f6ac7c1ecddeec83859d3649" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey v1.1 (imperfect 4am crack) side b.dsk" size="143360" crc="bdefe1fe" sha1="5f3d8c172bed74f5b95173fcc62cf8fc640cb3eb" />
- </dataarea>
- </part>
- </software>
-
- <software name="rrbit11">
- <description>Reader Rabbit (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reader rabbit 1.1 (4am crack).dsk" size="143360" crc="e25f8fa9" sha1="2497899e46ed5243707fb1e2e4c0ba1c00fb9aa0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mwbinmul">
- <description>Binomial Multiplication (Microcomputer Workshops) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="binomial multiplication (4am crack).dsk" size="143360" crc="fc85e10a" sha1="e88a22b7cd586fa3bad9cc3f3568f8c9a666aa8d" />
- </dataarea>
- </part>
- </software>
-
- <software name="simlineq">
- <description>Simultaneous Linear Equations (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="simultaneous linear equations (4am crack).dsk" size="143360" crc="1e206ad7" sha1="adc32225d4c32f052e929a990b8f161e8a25b7ea" />
- </dataarea>
- </part>
- </software>
-
- <software name="slquadeq">
- <description>Solving Quadratic Equations (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-04-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="solving quadratic equations (4am crack).dsk" size="143360" crc="5d58ab62" sha1="8223e4ecb167e11a4e51dceebd091778f7c68316" />
- </dataarea>
- </part>
- </software>
-
- <software name="ymmyymmy">
- <description>Yummy, Yummy (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-04-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="yummy, yummy (4am crack).dsk" size="143360" crc="4d54d2d0" sha1="9aa487d98e5e12e59f64155d879228c3e2741198" />
- </dataarea>
- </part>
- </software>
-
- <software name="goofghst">
- <description>The Goofy Ghost (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-04-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the goofy ghost (4am crack).dsk" size="143360" crc="013ddcab" sha1="241bbd553e0203cb3eb5237b841d339431b1773f" />
- </dataarea>
- </part>
- </software>
-
<software name="spvbce87">
<description>Spanish Verb Concepts and Exercises (1987 Version) (cleanly cracked)</description>
<year>1987</year>
@@ -24411,19 +11285,6 @@ license:CC0-1.0
</part>
</software>
- <software name="synspcgm">
- <description>Space Games: Appointment at Aldebaran and Procyon Warrior (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2017-04-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="space games - appointment at aldebaran and procyon warrior (4am crack).dsk" size="143360" crc="0e44e284" sha1="9771e6eee41bef375a88c96abaa44c1e76fd25f6" />
- </dataarea>
- </part>
- </software>
-
<software name="typistrt">
<description>Typing Strategy (cleanly cracked)</description>
<year>1982</year>
@@ -24450,19 +11311,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spnach1">
- <description>Spanish Achievement I (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2017-05-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="spanish achievement i (4am crack).dsk" size="143360" crc="6ab2d1d8" sha1="edbd06cb59a46d628ee725a2fddd98d7cc58bcf8" />
- </dataarea>
- </part>
- </software>
-
<software name="trpazoid">
<description>Trap-A-Zoid (cleanly cracked)</description>
<year>1983</year>
@@ -24476,255 +11324,12 @@ license:CC0-1.0
</part>
</software>
- <software name="grtnmbch">
- <description>The Great Number Chase (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the great number chase (4am crack).dsk" size="143360" crc="fee3b698" sha1="595701b7a0907388e5d4ed313b22c451c554e8df" />
- </dataarea>
- </part>
- </software>
-
- <software name="stystsci">
- <description>Story Starters: Science (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Queue</publisher>
- <info name="release" value="2017-05-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="story starters - science (4am crack) disk 1 - program.dsk" size="143360" crc="aac654c1" sha1="4a6c7f872db182521c790268997d94e8a9371c4a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Backgrounds"/>
- <dataarea name="flop" size="143360">
- <rom name="story starters - science (4am crack) disk 2 - backgrounds.dsk" size="143360" crc="dc7fb856" sha1="e96726679eac1d83d5e13f1955a5a42ae1dc1bc5" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Clip art and borders"/>
- <dataarea name="flop" size="143360">
- <rom name="story starters - science (4am crack) disk 3 - clip art and borders.dsk" size="143360" crc="2431d6bb" sha1="eb62a609507075b5f8387383d3f613c9b6f4f248" />
- </dataarea>
- </part>
- </software>
-
- <software name="tnkadthr">
- <description>Tank Attack and Death Run (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2017-05-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tank attack and death run (4am crack).dsk" size="143360" crc="f0dd901b" sha1="fabf685b8939c2597d3fad42c6015925f02161de" />
- </dataarea>
- </part>
- </software>
-
- <software name="taigy689">
- <description>Teddy and Iggy (30-JUN-1989 Version) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-05-22"/>
- <!-- This version is dated 30-JUN-1989 based on file metadata -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="teddy and iggy 1989 (4am crack).dsk" size="143360" crc="d56b39b4" sha1="606c548f1aaf221a507af2d5e1a1c27e7157fb6a" />
- </dataarea>
- </part>
- </software>
-
- <software name="regr689">
- <description>Regrouping (27-JUN-1989 Version) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-05-23"/>
- <!-- This version is dated 27-JUN-1989 based on file metadata -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="regrouping 1989 (4am crack).dsk" size="143360" crc="6c46efb9" sha1="3cce01e42790e356980f5e9cdb9961c78905d305" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathbp">
- <description>WordMath: Basic Problems (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - basic problems (4am crack).dsk" size="143360" crc="e154f2f4" sha1="ac97d01ba03a1e4e7eb559e07cb85478b451c95c" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathfr">
- <description>WordMath: Forward Order, Reverse Order (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - forward order, reverse order (4am crack).dsk" size="143360" crc="3afd9e0f" sha1="cdd6ffe186d4b27a27538f50c7a4022998eafe67" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathen">
- <description>WordMath: Extra Numbers (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - extra numbers (4am crack).dsk" size="143360" crc="feb0151a" sha1="e0b05bc4af79411178bd9dbd4a2d712f99199c52" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathhn">
- <description>WordMath: Hidden Numbers (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - hidden numbers (4am crack).dsk" size="143360" crc="e6810b3c" sha1="5e1202fb522930ed23f345bb46d475c0199a911c" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathkw">
- <description>WordMath: Key Words (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - key words (4am crack).dsk" size="143360" crc="ce3292bd" sha1="862f48adb9e668857dd22a0ed250ee744e807b4d" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathdic">
- <description>WordMath: Dictionary (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - dictionary (4am crack).dsk" size="143360" crc="684c6ea9" sha1="fe6f30e2359ddc63214a1576eafe41b2327a302c" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathmp">
- <description>WordMath: Mixed Practice (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - mixed practice (4am crack).dsk" size="143360" crc="eeaa349b" sha1="66ecdb703a53d8e4fdd3d9b60861243556a4b282" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathamp">
- <description>WordMath: Advanced Mixed Practice (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wordmath - advanced mixed practice (4am crack).dsk" size="143360" crc="24b4561f" sha1="9b210e3b0224d751b0f2f504718d2e8bca5a1ce4" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmathas">
- <description>WordMath: Addition and Subtraction (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-05-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="wordmath - addition and subtraction (4am crack) disk 1.dsk" size="143360" crc="f3a10039" sha1="e8cd0cbbda84cd17df5bb40f5c06dfdf10f8b413" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="wordmath - addition and subtraction (4am crack) disk 2.dsk" size="143360" crc="beee6a7d" sha1="ab76d08f9ddf4b7f47943cbfe8402e40e40463c0" />
- </dataarea>
- </part>
- </software>
-
- <software name="wagnwest">
- <description>Wagons West (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-05-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wagons west (4am crack).dsk" size="143360" crc="3449803a" sha1="dac9b5f9c2a6df2143a99d3cf141b506d262800a" />
- </dataarea>
- </part>
- </software>
-
- <software name="shotherd">
- <description>The Shot Heard Round The World (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-05-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the shot heard round the world (4am crack).dsk" size="143360" crc="60510cc8" sha1="1e1175a3859e75084bc13eff8a0017b38180600f" />
- </dataarea>
- </part>
- </software>
-
- <software name="grtstrce">
- <description>The Great States Race (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-06-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the great states race (4am crack).dsk" size="143360" crc="115bbef9" sha1="0346205f3deca1708d603e1a37f86237c805535a" />
- </dataarea>
- </part>
- </software>
-
<software name="slrrdmrc">
<description>Solar Reading: Mercury (cleanly cracked)</description>
<year>1984</year>
<publisher>Learning Multi-Systems</publisher>
<info name="release" value="2017-06-01"/>
- <!--"Solar Reading: Mercury" is a 1984 educational program by Karlyn Kamm and Gerard Chastain, and distributed by Learning Multi-Systems. It is preserved here for the first time.-->
+ <!-- "Solar Reading: Mercury" is a 1984 educational program by Karlyn Kamm and Gerard Chastain, and distributed by Learning Multi-Systems. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="solar reading - mercury (4am crack).dsk" size="143360" crc="d0b8c561" sha1="269f4ca4f3c7a34fe2f2d45373816545151aee25" />
@@ -24765,68 +11370,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tigrtale">
- <description>Tiger's Tales (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-06-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tiger's tales (4am crack).dsk" size="143360" crc="432dd3ae" sha1="cfeb7c0c9e60c9eb318f14c06f0b5312b2a1dfd0" />
- </dataarea>
- </part>
- </software>
-
- <software name="stytre14">
- <description>Story Tree (version 1.4) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-06-11"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="story tree v1.4 (4am crack) disk 1.dsk" size="143360" crc="5f226b9e" sha1="f6162c88b255df3cb62a8c9745b3030fb109e2cb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="story tree v1.4 (4am crack) disk 2.dsk" size="143360" crc="9dfb755e" sha1="ade03c019aeff9f49d56110b4a386fc88bf1c501" />
- </dataarea>
- </part>
- </software>
-
- <software name="stytre14b" cloneof="stytre14">
- <description>Story Tree (version 1.4) (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-06-11"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="story tree v1.4 (imperfect 4am crack) disk 1.dsk" size="143360" crc="0f2efebf" sha1="73582385b7b5e2644c3910ab13e266099f8db90a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="story tree v1.4 (imperfect 4am crack) disk 2.dsk" size="143360" crc="9dfb755e" sha1="ade03c019aeff9f49d56110b4a386fc88bf1c501" />
- </dataarea>
- </part>
- </software>
-
<software name="spelrule">
<description>Spelling Rules (cleanly cracked)</description>
<year>1980</year>
@@ -24840,26 +11383,6 @@ license:CC0-1.0
</part>
</software>
- <software name="prnshc12">
- <description>The Print Shop Companion (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-06-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the print shop companion v1.2 (4am crack) side a.dsk" size="143360" crc="b4b73991" sha1="cf87429a04c43f134447bec39818faf51e5ed442" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the print shop companion v1.2 (4am crack) side b.dsk" size="143360" crc="ae06cd64" sha1="2f66400b0ea80b7820c7a26397e16660b56b666f" />
- </dataarea>
- </part>
- </software>
-
<software name="slrrdjup">
<description>Solar Reading Flight 1: Jupiter (cleanly cracked)</description>
<year>1986</year>
@@ -24925,215 +11448,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tlktxtwr">
- <description>Talking Text Writer (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-06-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Read disk"/>
- <dataarea name="flop" size="143360">
- <rom name="talking text writer (4am crack) disk 1 - read disk.dsk" size="143360" crc="94485949" sha1="951ede69ce52471ce4e794b7cd219512b523468d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Write disk"/>
- <dataarea name="flop" size="143360">
- <rom name="talking text writer (4am crack) disk 2 - write disk.dsk" size="143360" crc="22fa928e" sha1="3ccd1ab6dfa71892561f36677faef0cd8f24a414" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - File disk maker"/>
- <dataarea name="flop" size="143360">
- <rom name="talking text writer (4am crack) disk 3 - file disk maker.dsk" size="143360" crc="2be691ab" sha1="a198258f292bced857326a0342a41babcb67e82d" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Sample files"/>
- <dataarea name="flop" size="143360">
- <rom name="talking text writer (4am crack) disk 4 - sample files.dsk" size="143360" crc="93439f1f" sha1="1259355409ca34031e956c7c4bcd97af205391d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="spellsys">
- <description>The Spelling System (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-06-25"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="the spelling system (4am crack) disk 1.dsk" size="143360" crc="48af390c" sha1="9c998daf41fa1521c215533f1a84f0eccef5b2f4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="the spelling system (4am crack) disk 2.dsk" size="143360" crc="ebe3032d" sha1="a1c95dd428ded01f7250d6a553300f94dfe5f664" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="the spelling system (4am crack) disk 3.dsk" size="143360" crc="64c6faa7" sha1="68a5af2542566893d1a445aa72a21377f5e92f79" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="the spelling system (4am crack) disk 4.dsk" size="143360" crc="09b21175" sha1="872911f7027e6b163681def235ecfceaf8e71377" />
- </dataarea>
- </part>
- </software>
-
- <software name="lastglad">
- <description>The Last Gladiator (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2017-06-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the last gladiator (4am and san inc crack).dsk" size="143360" crc="bcf73e9e" sha1="32e7ea80bf09cf30c1f4ebc4b4cad2c1e7908743" />
- </dataarea>
- </part>
- </software>
-
- <software name="safsrc87">
- <description>Safari Search (version 1987.08.24) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2017-06-29"/>
- <!-- This version, dated 1987-08-24 in source code comments, fixes several
- bugs in the KITTENS program. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="safari search v1987.08.24 (4am crack).dsk" size="143360" crc="0e120d75" sha1="b411bcbc6e535519781498fe1aa816d10b4ed6a6" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrdm12">
- <description>MECC-A771 Grade Manager (version 1.2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2017-06-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a771 grade manager v1.2 (4am crack).dsk" size="143360" crc="6deb61e4" sha1="aa7f3c278a75cbbf878b8568d31d4685777f0153" />
- </dataarea>
- </part>
- </software>
-
- <software name="reptiles">
- <description>Reptiles (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reptiles (4am crack).dsk" size="143360" crc="48851d5b" sha1="181c300ad56f9905ec0820fe31494608de0512bf" />
- </dataarea>
- </part>
- </software>
-
- <software name="1sttksgv">
- <description>The First Thanksgiving (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the first thanksgiving (4am crack).dsk" size="143360" crc="d8f2553f" sha1="7e3a44f71c13041bf921ef3fd5d691ec67c7c9de" />
- </dataarea>
- </part>
- </software>
-
- <software name="rdfuncon">
- <description>Reading Fun: Final Consonant Sounds (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reading fun - final consonant sounds (4am crack).dsk" size="143360" crc="c523f456" sha1="55030ca3c4d824d36c1054a54b86fade5071c67a" />
- </dataarea>
- </part>
- </software>
-
- <software name="rdfunvwl">
- <description>Reading Fun: Vowel Sounds (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
- <!--"Reading Fun: Vowel Sounds" is a 1990 educational game distributed by Troll Associates (design by Millicent Sabater, Lawrence Comella, Gregory Truex; programming and sound by Bernie Gallagher, Gregory Truex, Mark Barone; graphics by Millicent Sabater). It is preserved here for the first time.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reading fun - vowel sounds (4am crack).dsk" size="143360" crc="b3204a4a" sha1="065d1d5e9d09e2d894c413aded2422c62dad8f55" />
- </dataarea>
- </part>
- </software>
-
- <software name="thndlght">
- <description>Thunder and Lightning (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="thunder and lightning (4am crack).dsk" size="143360" crc="ea7ca755" sha1="2ed219d94d9704c65b8506739af2c85915ed334e" />
- </dataarea>
- </part>
- </software>
-
- <software name="whldolph">
- <description>Whales and Dolphins (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="whales and dolphins (4am crack).dsk" size="143360" crc="15d86bf5" sha1="6add4c8c38ef6bc994edf3c22feac026d77d21be" />
- </dataarea>
- </part>
- </software>
-
- <software name="tfsbiog">
- <description>Troll First Start: Biographies (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="troll first start - biographies (4am crack).dsk" size="143360" crc="f256e71c" sha1="9baecae28c2b6044923a8d6e79d7809311b3d5f0" />
- </dataarea>
- </part>
- </software>
-
- <software name="tfssci">
- <description>Troll First Start: Science (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2017-07-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="troll first start - science (4am crack).dsk" size="143360" crc="04cab9dc" sha1="455a6021ff0f97bbd8ed1bb3140ba3d5efd2669c" />
- </dataarea>
- </part>
- </software>
-
<software name="rdanly15">
<description>Readability Analysis (version 1.5) (cleanly cracked)</description>
<year>1984</year>
@@ -25160,68 +11474,6 @@ license:CC0-1.0
</part>
</software>
- <software name="winnie">
- <description>Winnie the Pooh in the Hundred Acre Wood (Sierra On-Line) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-07-18"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="winnie the pooh in the hundred acre wood (sierra variant) (4am and san inc crack) side a.dsk" size="143360" crc="066ad38b" sha1="6cda8ada8f18dd7d9eb79b88ffd59e7b67e9956a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="winnie the pooh in the hundred acre wood (sierra variant) (4am and san inc crack) side b.dsk" size="143360" crc="a1b8f04d" sha1="e90eb60f174d48e3f1ec110cb5de51f33ac82d54" />
- </dataarea>
- </part>
- </software>
-
- <software name="winnieb" cloneof="winnie">
- <description>Winnie the Pooh in the Hundred Acre Wood (Sierra On-Line) (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2017-07-18"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="winnie the pooh in the hundred acre wood (sierra variant) (imperfect 4am and san inc crack) side a.dsk" size="143360" crc="b6a4c33f" sha1="71d9a286ad178c8fb915fe1c8b35efa5dfe9c42a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="winnie the pooh in the hundred acre wood (sierra variant) (imperfect 4am and san inc crack) side b.dsk" size="143360" crc="a1b8f04d" sha1="e90eb60f174d48e3f1ec110cb5de51f33ac82d54" />
- </dataarea>
- </part>
- </software>
-
- <software name="scrnwr20">
- <description>Screen Writer (version 2.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-07-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="screen writer 2.0 (4am and san inc crack).dsk" size="143360" crc="b80702dd" sha1="a251001b859fd5851e6d1feabd2e7c44fb4a5b82" />
- </dataarea>
- </part>
- </software>
-
<software name="botandfw">
<description>The Botanist's Apprentice: Desert, Forest, and Wetland (cleanly cracked)</description>
<year>1989</year>
@@ -25381,107 +11633,6 @@ license:CC0-1.0
</part>
</software>
- <software name="swsfamrb">
- <description>Swiss Family Robinson (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2017-08-12"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="swiss family robinson (4am crack).dsk" size="143360" crc="1cd108f6" sha1="f072c4dcb9bcc05289927adc55da5cd79170185b" />
- </dataarea>
- </part>
- </software>
-
- <software name="swsfamrbb" cloneof="swsfamrb">
- <description>Swiss Family Robinson (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2017-08-12"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="swiss family robinson (imperfect 4am crack).dsk" size="143360" crc="75f5b079" sha1="652ec117b904ffbe4a5e7f2b53d58273caf67b59" />
- </dataarea>
- </part>
- </software>
-
- <software name="mpverbs1">
- <description>Verbs I (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verbs i (4am crack).dsk" size="143360" crc="17567a89" sha1="e94671bb5deb483a7a96fa6a8de1bce217191446" />
- </dataarea>
- </part>
- </software>
-
- <software name="mpverbs2">
- <description>Verbs II (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2017-08-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verbs ii (4am crack).dsk" size="143360" crc="1a62490b" sha1="f3c22dcf7e319f2b5a5f1966a4862fdce1058d38" />
- </dataarea>
- </part>
- </software>
-
- <software name="masksn21">
- <description>The Mask of the Sun (version 2.1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-08-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the mask of the sun v2.1 (4am crack) side a.dsk" size="143360" crc="1ad2e600" sha1="794859b6258f9e182b6299b8df4022b46605ab5d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the mask of the sun v2.1 (4am crack) side b.dsk" size="143360" crc="f56487fe" sha1="3fee1ffa7d7408513567e1e544c64c95a8803b66" />
- </dataarea>
- </part>
- </software>
-
- <software name="serpstar">
- <description>The Serpent's Star (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2017-08-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the serpent's star (4am crack) side a.dsk" size="143360" crc="66379214" sha1="2b7ee9ac2810abb2c445f3947ef9d09f69843dd8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the serpent's star (4am crack) side b.dsk" size="143360" crc="f9624722" sha1="722bd70b4d94343bc4e5c508e8c23c10269933f9" />
- </dataarea>
- </part>
- </software>
-
<software name="search14">
<description>Search (version 1.4) (cleanly cracked)</description>
<year>1983</year>
@@ -25495,26 +11646,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rwareuro">
- <description>Roadwar Europa (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2017-09-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="roadwar europa (4am crack) side a.dsk" size="143360" crc="d92c0728" sha1="54409fc98308d05d86b11db1b220bc2bca9297f6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="roadwar europa (4am crack) side b.dsk" size="143360" crc="ef82f537" sha1="b0d84fc300d114d2b1066137ba362d189e9b69cf" />
- </dataarea>
- </part>
- </software>
-
<software name="stymisms">
<description>The Story of Miss Mouse (cleanly cracked)</description>
<year>1985</year>
@@ -25548,46 +11679,6 @@ license:CC0-1.0
</part>
</software>
- <software name="shrdspng">
- <description>The Shard of Spring (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2017-09-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the shard of spring (4am crack) side a.dsk" size="143360" crc="2fb89106" sha1="f2651db23c99118fa8e115a00c9c5d6e6571e83a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the shard of spring (4am crack) side b.dsk" size="143360" crc="fb77ba19" sha1="fc7e98f4d8cafac4b46d0cbeffdcb288a332f6da" />
- </dataarea>
- </part>
- </software>
-
- <software name="ernldg12">
- <description>The Eternal Dagger (version 1.2) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2017-09-07"/>
- <!--"The Eternal Dagger" is a 1987 strategy game by Paul Murray and Victor Penman, and distributed by Strategic Simulations, Inc. This is version 1.2.-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the eternal dagger v1.2 (4am crack) side a.dsk" size="143360" crc="f28d4aba" sha1="4e5854098549f3d95bc244964a4fc4665bb2b734" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the eternal dagger v1.2 (4am crack) side b.dsk" size="143360" crc="146f615e" sha1="b401040c5d926b213fa96543d9105791b81a3649" />
- </dataarea>
- </part>
- </software>
-
<software name="rhmflst">
<description>Rhymo's Falling Star (cleanly cracked)</description>
<year>1985</year>
@@ -25634,75 +11725,10 @@ license:CC0-1.0
</part>
</software>
- <software name="tuemorqu">
- <description>Tuesday Morning Quarterback (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2017-09-11"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tuesday morning quarterback (4am crack).dsk" size="143360" crc="270140ae" sha1="e5bd9b573c58774df011122f7641b1e9b8f98d84" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdsconc">
- <description>Words and Concepts (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2017-09-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="words and concepts (4am crack).dsk" size="143360" crc="dc51fd5f" sha1="4af70827d432c9de67ac7a0538f734add6f9b1e6" />
- </dataarea>
- </part>
- </software>
-
- <software name="verbusg1">
- <description>Verb Usage 1 (version 08.17.87) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 1 v08.17.87 (4am crack).dsk" size="143360" crc="b6b28ec5" sha1="7a357a61bae5cd48d5daab02bd8f04df869d8d66" />
- </dataarea>
- </part>
- </software>
-
- <software name="verbusg2">
- <description>Verb Usage 2 (version 08.17.87) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 2 v08.17.87 (4am crack).dsk" size="143360" crc="d86d4ba2" sha1="11b5500e67739f44050e80a0b75d364856b20263" />
- </dataarea>
- </part>
- </software>
-
- <software name="verbusg4">
- <description>Verb Usage 4 (version 09.08.86) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 4 v09.08.86 (4am crack).dsk" size="143360" crc="f8903d28" sha1="c543d425a1a8fb04d453d2f786b8220d4367d444" />
- </dataarea>
- </part>
- </software>
-
<software name="smpllive">
<description>The Simplest Living Things (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2017-09-17"/>
<part name="flop1" interface="floppy_5_25">
@@ -25725,52 +11751,6 @@ license:CC0-1.0
</part>
</software>
- <software name="scuffy86">
- <description>Scuffy and Friends (version 03.19.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="scuffy and friends v03.19.86 (4am crack) disk 1.dsk" size="143360" crc="5ee0013f" sha1="1e6587f7c15d72037f3631885add18dc3fd36fbb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="scuffy and friends v03.19.86 (4am crack) disk 2.dsk" size="143360" crc="15ac14e4" sha1="5b0e82e8a26e8418db86be7d5d6c6d152f2589ed" />
- </dataarea>
- </part>
- </software>
-
- <software name="wfwn0386">
- <description>What's First? What's Next? (version 03.07.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="what's first what's next v03.07.86 (4am crack).dsk" size="143360" crc="bb05d99b" sha1="0cf0a5cc04547c969d0fdc6080d1889d7257f2e4" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssstruct">
- <description>Simple Sentence Structure (cleanly cracked)</description>
- <year>1994</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2017-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="simple sentence structure (4am crack).dsk" size="143360" crc="7924079f" sha1="e39cdcc62b8843be51317171d35db37999ec4c46" />
- </dataarea>
- </part>
- </software>
-
<software name="thtmstry">
<description>That's My Story (cleanly cracked)</description>
<year>1983</year>
@@ -25909,19 +11889,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wwwww286">
- <description>Who What Where When Why (version 02.05.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-10-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="who what where when why v02.05.86 (4am crack).dsk" size="143360" crc="fd74790d" sha1="2dd4aded3e6793ffb23e1f4406cf4c09cd846999" />
- </dataarea>
- </part>
- </software>
-
<software name="robotwar">
<description>RobotWar (cleanly cracked)</description>
<year>1981</year>
@@ -25940,10 +11907,10 @@ license:CC0-1.0
<year>1984</year>
<publisher>Terrapin</publisher>
<info name="release" value="2017-10-21"/>
- <!--(*) 4am crack no. 178 was labeled "Terrapin Logo 2.0". This disk is
+ <!-- (*) 4am crack no. 178 was labeled "Terrapin Logo 2.0". This disk is
"Terrapin Logo 2.00". The filenames are different, and the main program
has differences in multiple places. Also the copy protection on this
- version is significantly stronger, suggesting a later revision.. -->
+ version is significantly stronger, suggesting a later revision. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -25998,45 +11965,6 @@ license:CC0-1.0
</part>
</software>
- <software name="finlconf">
- <description>The Final Conflict (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-10-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the final conflict (4am crack).dsk" size="143360" crc="97363845" sha1="f6e7ab72fc88b39699a7588cae032c5c8e6fe458" />
- </dataarea>
- </part>
- </software>
-
- <software name="shtlintr">
- <description>Shuttle Intercept (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2017-10-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="shuttle intercept (4am crack).dsk" size="143360" crc="b90be8e9" sha1="0f6b36a57e76272194f292481dc14e546b6b2116" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrship11">
- <description>Warship (version 1.1) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2017-10-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="warship v1.1 (4am crack).dsk" size="143360" crc="7f3ba69e" sha1="1b93dcba16162e4d7e7efa619aa4c76fd1e12325" />
- </dataarea>
- </part>
- </software>
-
<software name="wodlwck">
<description>Voyages of Discovery: Lewis and Clark (cleanly cracked)</description>
<year>1986</year>
@@ -26291,19 +12219,6 @@ license:CC0-1.0
</part>
</software>
- <software name="usurp3">
- <description>The Usurper Book Three: The Mines of Qyntarr (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sir-Tech</publisher>
- <info name="release" value="2017-11-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the usurper book three - the mines of qyntarr (4am crack).dsk" size="143360" crc="c074f3fd" sha1="6b92b4d1ffaefc44a97121a793948901c9f2ed0b" />
- </dataarea>
- </part>
- </software>
-
<software name="hmact200">
<description>The Home Accountant (version 2.0) (cleanly cracked)</description>
<year>1981</year>
@@ -26330,46 +12245,6 @@ license:CC0-1.0
</part>
</software>
- <software name="advmthsh">
- <description>Advanced Math Shop (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2017-11-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="advanced math shop (4am crack) side a.dsk" size="143360" crc="8e1db4d5" sha1="0b2ae1f94a2a7676b1eee0447d4f779053a49a44" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="advanced math shop (4am crack) side b.dsk" size="143360" crc="d1eae526" sha1="2fcf3d82038296960081facd695a4a43f3d3c561" />
- </dataarea>
- </part>
- </software>
-
- <software name="kngfcts">
- <description>The Kingdom of Facts (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Adventure International</publisher>
- <info name="release" value="2017-12-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the kingdom of facts (4am crack) side a.dsk" size="143360" crc="f406b7d8" sha1="e5f09624fca74adb9478563cbd19d4763be8a3d1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the kingdom of facts (4am crack) side b.dsk" size="143360" crc="e670fc8c" sha1="0d599b1c2d80dfa5a65592a6f0f8314bee961e74" />
- </dataarea>
- </part>
- </software>
-
<software name="scpu10rs">
<description>The Science Professor Unit 10: Resources (cleanly cracked)</description>
<year>1986</year>
@@ -26383,121 +12258,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tmsoflre">
- <description>Times of Lore (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2017-12-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="times of lore (4am crack) side a.dsk" size="143360" crc="132870bc" sha1="fff29c96fa59013d29a91dc852e6bc0987d6c638" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="times of lore (4am crack) side b.dsk" size="143360" crc="328a1bf1" sha1="8a3e9a3447c851d725966e6a5eec74cd61ccea8d" />
- </dataarea>
- </part>
- </software>
-
- <software name="thrshold">
- <description>Threshold (cleanly cracked)</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2017-12-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="threshold (4am and san inc crack).dsk" size="143360" crc="29349e3a" sha1="5211b0bc9e7a20bad932b3f2b14e5e9b737f7c57" />
- </dataarea>
- </part>
- </software>
-
- <software name="ultima5">
- <description>Ultima V (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2017-12-05"/>
- <!--"Ultima V" is a 1988 roleplaying game by Lord British and distributed by Origin Systems.-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Program Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 1a - program.dsk" size="143360" crc="299da587" sha1="06606409c7d7425a3558829a0884b299bde3f0ba" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Dungeon Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 1b - dungeon.dsk" size="143360" crc="bb2823bb" sha1="0184fa1c0513052d522872c1cce2b5c12371d4ae" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Britannia Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 2a - britannia.dsk" size="143360" crc="aa4c6c87" sha1="a5e41dab3b38380fd4bfebd217934b3c64beb6f1" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Underworld Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 2b - underworld.dsk" size="143360" crc="cadb9cf5" sha1="39b0217ce1dd098ef502b843a9e57c5888a96b1c" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Towne Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 3a - towne.dsk" size="143360" crc="90f74781" sha1="5e1da7806377674f1918191a743072e7907ab753" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Dwelling Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 3b - dwelling.dsk" size="143360" crc="4966c93c" sha1="a35e7682a9b569e4d8b651fc10a3614ba5329862" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Castle Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 4a - castle.dsk" size="143360" crc="99fb8af2" sha1="e9c8d78973ff2d079d646a3e6b9e05a6fab59db2" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Keep Disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima v (4am crack) disk 4b - keep.dsk" size="143360" crc="9d0d1dac" sha1="ee06c9c4fea4aca0baa307d063ba2b2b86725295" />
- </dataarea>
- </part>
- </software>
-
- <software name="mnys2mc">
- <description>The Money Series: Step 2 More Counting (version 12.21.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-12-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the money series - step 2 more counting 12.21.89 (4am crack).dsk" size="143360" crc="15598093" sha1="0cf6e13bea01072057368c13224d445687f9a604" />
- </dataarea>
- </part>
- </software>
-
- <software name="wdply185">
- <description>Word Play (version 01.27.85) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2017-12-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word play 01.27.85 (4am crack).dsk" size="143360" crc="3b1ab4ce" sha1="a5227ff0e5729e087510bd6dc78057c5d83657bd" />
- </dataarea>
- </part>
- </software>
-
<software name="wdprblvb">
<description>Word Problems Level B (version 3.1.6) (cleanly cracked)</description>
<year>1986</year>
@@ -26557,188 +12317,6 @@ license:CC0-1.0
</part>
</software>
- <software name="voodoois">
- <description>Voodoo Island (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2017-12-19"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="voodoo island (4am crack).dsk" size="143360" crc="b3ed4f50" sha1="5a3e4cfb1cd8e820a2f6ae2a4c902fe56ac989a7" />
- </dataarea>
- </part>
- </software>
-
- <software name="voodooisb" cloneof="voodoois">
- <description>Voodoo Island (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2017-12-19"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="voodoo island (imperfect 4am crack).dsk" size="143360" crc="551a3285" sha1="64c242b8371add1dd2aed60bffdf80e59bb2fe2e" />
- </dataarea>
- </part>
- </software>
-
- <software name="darkcrys">
- <description>The Dark Crystal (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the dark crystal (4am and san inc crack) disk 1a.dsk" size="143360" crc="c7b5b770" sha1="8e4ea902267057fb6d268d2e7fdc9ad2afd94ad6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the dark crystal (4am and san inc crack) disk 1b.dsk" size="143360" crc="f2726e17" sha1="867f6af97bb848e98d5d1dfb396eca4330df0034" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the dark crystal (4am and san inc crack) disk 2a.dsk" size="143360" crc="3aed0b89" sha1="9db31bc4e22474d6a5da8899c51146d9d2d6a858" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the dark crystal (4am and san inc crack) disk 2b.dsk" size="143360" crc="a3ce1109" sha1="dbb2dbcca7e2892f00d920b346627424a587518f" />
- </dataarea>
- </part>
- </software>
-
- <software name="blkcauld">
- <description>The Black Cauldron (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the black cauldron (4am and san inc crack) disk 1a.dsk" size="143360" crc="233c8d02" sha1="50066a783c3be11a3ca4662f092b649cdfd7fe86" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the black cauldron (4am and san inc crack) disk 1b.dsk" size="143360" crc="e5ca8f24" sha1="dc08253015f34193d45658864d01c7be42a984d2" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the black cauldron (4am and san inc crack) disk 2a.dsk" size="143360" crc="ce0141d7" sha1="e4714561eba2c6dad4d0cac9c73e90947bbd4182" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the black cauldron (4am and san inc crack) disk 2b.dsk" size="143360" crc="60f44185" sha1="98d4800082d9c44a1909004e5fa6a7cedf7f34c6" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the black cauldron (4am and san inc crack) disk 3a.dsk" size="143360" crc="093ba3c4" sha1="632735ee231ed9d23604bd24ab9c00d62cb4d5bc" />
- </dataarea>
- </part>
- </software>
-
- <software name="spcquest">
- <description>Space Quest I (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 1a.dsk" size="143360" crc="27ed4182" sha1="44e08db3763a2c4ea82280440c9ef24ec30b6bd0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 1b.dsk" size="143360" crc="15110cd5" sha1="22cb2c91eb83a0bbdd983ac34324189d60dc7c2a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 2a.dsk" size="143360" crc="af36bcf5" sha1="c8c7ef1834800808b519be8fd2c38c8bc7a01ae3" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 2b.dsk" size="143360" crc="acd261ca" sha1="909b3214ed1770d22d58c74ce8a6ed8bf342c5ce" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 3a.dsk" size="143360" crc="6ada0a57" sha1="bc33913d2f832adca1c9c2f2d319c2c41594ce66" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 3b.dsk" size="143360" crc="1ada1276" sha1="ae07ab7f0fae764fc4ec602d90fb959c0cd322e1" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 4a.dsk" size="143360" crc="7d32c1fe" sha1="0e8a7a2da6e36ffa1425a85bd7ef49461f74a4cf" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest i (4am and san inc crack) disk 4b.dsk" size="143360" crc="2a5cc94f" sha1="d5146f79ddb4e9d9ecfebc213c443b91656ddf00" />
- </dataarea>
- </part>
- </software>
-
- <software name="spdrdr2c">
- <description>Speed Reader II (version 06.12.85) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Davidson &amp; Associates</publisher>
- <info name="release" value="2018-01-25"/>
- <!-- This version is dated 06.12.85 on the disk label. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="speed reader ii 06.12.85 (4am crack) side a.dsk" size="143360" crc="ac6ff3ec" sha1="db768c7899a5b05b6a48da32dd0da8ebc631621c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="speed reader ii 06.12.85 (4am crack) side b.dsk" size="143360" crc="e1cd7286" sha1="f7ffbb1cc99f288d1abb8e68491222c6d2c3ea3f" />
- </dataarea>
- </part>
- </software>
-
<software name="whlnmprc">
<description>Whole Number Practice (cleanly cracked)</description>
<year>1982</year>
@@ -26752,74 +12330,6 @@ license:CC0-1.0
</part>
</software>
- <software name="artist13">
- <description>The Artist (version 1.3) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the artist v1.3 (4am and san inc crack).dsk" size="143360" crc="bfe92a58" sha1="356118132dd9b3f18279b6f50eb2c7f0f79090b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="lstgldr2">
- <description>The Last Gladiator (Revision 2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2018-01-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the last gladiator rev. 2 (4am and san inc crack).dsk" size="143360" crc="87c161c0" sha1="e939a48bd843bb14ebd4ac2c8417908f754591df" />
- </dataarea>
- </part>
- </software>
-
- <software name="trans85">
- <description>Transylvania (1985 Version) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Polarware</publisher>
- <info name="release" value="2018-01-30"/>
- <!-- This is the 1985 re-release with updated graphics and gameplay.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="transylvania 1985 (4am crack) side a.dsk" size="143360" crc="2f86c356" sha1="18ec83ce3520e8fae2eb6e8d3312e9712baa5459" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="transylvania 1985 (4am crack) side b.dsk" size="143360" crc="d73ceb4d" sha1="374d001aa9180a915b1c5e06dac92b59ad094f7b" />
- </dataarea>
- </part>
- </software>
-
- <software name="crmns85">
- <description>The Crimson Crown (1985 Version) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Polarware</publisher>
- <info name="release" value="2018-01-30"/>
- <!-- This is the 1985 re-release with updated graphics and gameplay.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the crimson crown 1985 (4am crack) side a.dsk" size="143360" crc="aba5242a" sha1="fed7cdb0a85fa1e5e938e85a6bc13ad8359aa4d8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the crimson crown 1985 (4am crack) side b.dsk" size="143360" crc="82509d3a" sha1="874a960a64ac7a68bd4ba648383bedf844f65e61" />
- </dataarea>
- </part>
- </software>
-
<software name="rnd23dgt">
<description>Round Two-Digit and Three-Digit Numbers (cleanly cracked)</description>
<year>1990</year>
@@ -26859,62 +12369,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spcqst2a">
- <description>Space Quest II (version 2.0A) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2018-02-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 1a.dsk" size="143360" crc="c21d5311" sha1="aa493ebb3d800f6ae7e3bd937bd33cdf57bc1543" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 1b.dsk" size="143360" crc="3d09546f" sha1="37750ccfed6b653eccc2b1975d7082c441dc28e3" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 2a.dsk" size="143360" crc="92112613" sha1="e0ae9b884664c8a5447c63a2caf882b9c72562dc" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 2b.dsk" size="143360" crc="ea115f20" sha1="f86cc9cb9d58668eadf16eaf608c76974bcd3ef7" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 3a.dsk" size="143360" crc="ec1f2910" sha1="7c8e7a4f2ababe6fd2b2a6f1a730ac333019ff7d" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 3b.dsk" size="143360" crc="33359b92" sha1="4df5e7553430659f2c27f7239f05c51a724e05f7" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 4a.dsk" size="143360" crc="4a0e73ed" sha1="c80aa34c096835a656591ad52363292c639c07dc" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="space quest ii (4am and san inc crack) disk 4b.dsk" size="143360" crc="4a948a39" sha1="e7ba13f8a4b4f9788597e06f4edb24b8c41b1708" />
- </dataarea>
- </part>
- </software>
-
<software name="timemeas">
<description>Time Measurement: AM/PM (cleanly cracked)</description>
<year>1990</year>
@@ -26993,99 +12447,6 @@ license:CC0-1.0
</part>
</software>
- <software name="thndrbmb">
- <description>Thunder Bombs (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-02-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="thunder bombs (4am crack).dsk" size="143360" crc="96ca4434" sha1="fec4f16b5434b0a639b8d480e08981a1871ff42c" />
- </dataarea>
- </part>
- </software>
-
- <software name="tzone11">
- <description>Time Zone (version 1.1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2018-02-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk a.dsk" size="143360" crc="b613e4e5" sha1="e31aa249afedee4462ff52cc18b18a034b6d3bd8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk b.dsk" size="143360" crc="cd4a65ab" sha1="e6b4cc45c8947528e7c628ce666ffc1d47e25ef7" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk c.dsk" size="143360" crc="2c11b11f" sha1="b248a33e6adab6591fdf40469afe511dfc56add6" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk d.dsk" size="143360" crc="8544f893" sha1="8d7635cff5d6732445d822094b8cf454d03646af" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk E"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk e.dsk" size="143360" crc="c6a89f40" sha1="b2273fc9939edfcc71c1cfff8803ce2a7c26cf7c" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk F"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk f.dsk" size="143360" crc="e4399a48" sha1="c3b85016873e0fdc15a74d9df07cc9968d61f5eb" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk G"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk g.dsk" size="143360" crc="cef92006" sha1="23304e1f8cccbd376b2c54546d24b61df6c8d3b2" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk H"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk h.dsk" size="143360" crc="a7eab342" sha1="bc223f79e00d1f23975b6caf3299da18b91a2807" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk I"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk i.dsk" size="143360" crc="3309c2d8" sha1="ab5adb3720fcdf5150fa3b3e729f357c08a998da" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk J"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk j.dsk" size="143360" crc="dddb0bbc" sha1="e9aa856fe45df6be8792258431840b1f0428d48e" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk K"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk k.dsk" size="143360" crc="90d644b0" sha1="892e9962d254a4d734a4e4c1c0cc5ae862aa3f68" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk L"/>
- <dataarea name="flop" size="143360">
- <rom name="time zone (4am and san inc crack) disk l.dsk" size="143360" crc="bd01c290" sha1="6ead97afa9cba6701ed90db1f4d2328aa3789391" />
- </dataarea>
- </part>
- </software>
-
<software name="trioctgn">
<description>Triangles Through Octagons (cleanly cracked)</description>
<year>1990</year>
@@ -27141,7 +12502,7 @@ license:CC0-1.0
<software name="wdtoothb">
<description>Where Did My Toothbrush Go (cleanly cracked)</description>
<year>1988</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2018-02-15"/>
<part name="flop1" interface="floppy_5_25">
@@ -27158,163 +12519,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rnbkeyb">
- <description>Rainbow Keyboarding (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-02-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rainbow keyboarding (4am crack).dsk" size="143360" crc="546effd2" sha1="623fdadbb0685b6e2de8676dde841966d2a11771" />
- </dataarea>
- </part>
- </software>
-
- <software name="vocchlg">
- <description>Vocabulary Challenge (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2018-03-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="vocabulary challenge (4am crack).dsk" size="143360" crc="9c8804f2" sha1="93287316df323e35535af84a8e91c0b2a5a83a09" />
- </dataarea>
- </part>
- </software>
-
- <software name="succwrt">
- <description>Success with Writing (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-03-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="success with writing (4am crack) disk 1.dsk" size="143360" crc="adee2f43" sha1="56480fd19f47ebb7d32cc4b19f6fbc5d892a978a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="success with writing (4am crack) disk 2.dsk" size="143360" crc="8947b8e5" sha1="ef79c4974778dab6872cdcfb1a2625e32418b09b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="success with writing (4am crack) disk 3.dsk" size="143360" crc="b76c16db" sha1="a166d0530951980d7a53b9bf4da76408649c0947" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="success with writing (4am crack) disk 4.dsk" size="143360" crc="2f26ec45" sha1="511f14ea38101a160a148f3eec0ba97ce5b676a8" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5"/>
- <dataarea name="flop" size="143360">
- <rom name="success with writing (4am crack) disk 5.dsk" size="143360" crc="ba846c19" sha1="0f6eb0da6766912f401f3cd30f901a48ad409a71" />
- </dataarea>
- </part>
- </software>
-
- <software name="suctyp12">
- <description>Success with Typing (version 1.2) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-03-07"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (4am crack) disk 1.dsk" size="143360" crc="0071b309" sha1="20a8ae0ed67dfd9b886b8a01e50735d50e0f7d7e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (4am crack) disk 2.dsk" size="143360" crc="c544dbaa" sha1="cd3c42d857ce31edbb334c973430df83423fc060" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (4am crack) disk 3.dsk" size="143360" crc="ace237b3" sha1="48ba18c3d314d754337ae4a30ae2926c8bc643db" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (4am crack) disk 4.dsk" size="143360" crc="a1cfc2a2" sha1="51be8e51fc6c7106b91a3660463812a12fd36193" />
- </dataarea>
- </part>
- </software>
-
- <software name="suctyp12b" cloneof="suctyp12">
- <description>Success with Typing (version 1.2) (imperfect clean crack)</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-03-07"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (imperfect 4am crack) disk 1.dsk" size="143360" crc="21f580bb" sha1="fe7dd8937e3fb873313dc03f9390693ce34a5eb9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (imperfect 4am crack) disk 2.dsk" size="143360" crc="c544dbaa" sha1="cd3c42d857ce31edbb334c973430df83423fc060" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (imperfect 4am crack) disk 3.dsk" size="143360" crc="ace237b3" sha1="48ba18c3d314d754337ae4a30ae2926c8bc643db" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="success with typing v1.2 (imperfect 4am crack) disk 4.dsk" size="143360" crc="a1cfc2a2" sha1="51be8e51fc6c7106b91a3660463812a12fd36193" />
- </dataarea>
- </part>
- </software>
-
- <software name="sldshp10">
- <description>Slide Shop (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-03-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="slide shop v1.0 (4am crack) disk 1.dsk" size="143360" crc="8592eb8c" sha1="27595a2316058834c4cfc04b0bd72f28dc380169" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="slide shop v1.0 (4am crack) disk 2.dsk" size="143360" crc="996156b7" sha1="e196e39d826f80147e0c23a702cfb332f3bf32ec" />
- </dataarea>
- </part>
- </software>
-
<software name="typecbdm">
<description>Typing Is A Ball, Charlie Brown (Demo) (cleanly cracked)</description>
<year>1985</year>
@@ -27333,7 +12537,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Random House</publisher>
<info name="release" value="2018-03-12"/>
- <!--"Typing Is A Ball, Charlie Brown" is a 1985 educational game distributed by Random House. It is preserved here for the first time.-->
+ <!-- "Typing Is A Ball, Charlie Brown" is a 1985 educational game distributed by Random House. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -27348,136 +12552,6 @@ license:CC0-1.0
</part>
</software>
- <software name="talesmst">
- <description>Tales of Mystery (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-03-12"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of mystery (4am crack) side a.dsk" size="143360" crc="d224b681" sha1="cad83b5f79aa6f4b08e244bd37728d6eab8fe0c1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of mystery (4am crack) side b.dsk" size="143360" crc="150d40f5" sha1="f0d3bf7a77a4c5db3c98a6435d6d3881cbdbab87" />
- </dataarea>
- </part>
- </software>
-
- <software name="talesmstb" cloneof="talesmst">
- <description>Tales of Mystery (imperfect clean crack)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-03-12"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of mystery (imperfect 4am crack) side a.dsk" size="143360" crc="822823a0" sha1="12ebad8a6e40b4ce5cb4859b25db5b8db254f7ad" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of mystery (imperfect 4am crack) side b.dsk" size="143360" crc="150d40f5" sha1="f0d3bf7a77a4c5db3c98a6435d6d3881cbdbab87" />
- </dataarea>
- </part>
- </software>
-
- <software name="cbmkr12">
- <description>The Comic Book Maker (version 1.2) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2018-03-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the comic book maker v1.2 (4am crack) disk 1a.dsk" size="143360" crc="f6d8ec48" sha1="5dc8b6c059946e9a09a0b35b03c845b246ddb234" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the comic book maker v1.2 (4am crack) disk 1b.dsk" size="143360" crc="ad2a37bb" sha1="1a683fb74771cb7fa9975aa80fc169a0cc872d30" />
- </dataarea>
- </part>
- </software>
-
- <software name="wizoz">
- <description>The Wizard of Oz (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2018-03-13"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="the wizard of oz (4am crack) disk a - boot.dsk" size="143360" crc="a111593a" sha1="8214a6616fc571ed4e1130e0b37724bc83f5aa35" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="the wizard of oz (4am crack) disk b.dsk" size="143360" crc="f7f64f0b" sha1="94be36f818a7c76ecba6a485e1b40e2f0c7a2aff" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="the wizard of oz (4am crack) disk c.dsk" size="143360" crc="4e23048d" sha1="db11585b49ffd145c8b06b33b804cd64fb9efe05" />
- </dataarea>
- </part>
- </software>
-
- <software name="wizozb" cloneof="wizoz">
- <description>The Wizard of Oz (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2018-03-13"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="the wizard of oz (imperfect 4am crack) disk a - boot.dsk" size="143360" crc="f11dcc1b" sha1="49190cb5c69a41f4aaa1d135c303ce69c783cfee" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="the wizard of oz (imperfect 4am crack) disk b.dsk" size="143360" crc="f7f64f0b" sha1="94be36f818a7c76ecba6a485e1b40e2f0c7a2aff" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="the wizard of oz (imperfect 4am crack) disk c.dsk" size="143360" crc="4e23048d" sha1="db11585b49ffd145c8b06b33b804cd64fb9efe05" />
- </dataarea>
- </part>
- </software>
-
<software name="zork1r88">
<description>Zork I (Release 88 / 840726 / interpreter B) (cleanly cracked)</description>
<year>1984</year>
@@ -27504,19 +12578,6 @@ license:CC0-1.0
</part>
</software>
- <software name="queenphb">
- <description>The Queen of Phobos (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2018-03-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the queen of phobos (4am crack).dsk" size="143360" crc="3a6bafb0" sha1="b22f60f8061dbc8d786d627168172441f8b6a6f5" />
- </dataarea>
- </part>
- </software>
-
<software name="zork1r5">
<description>Zork I (Revision 5) (cleanly cracked)</description>
<year>1980</year>
@@ -27530,32 +12591,12 @@ license:CC0-1.0
</part>
</software>
- <software name="solveit">
- <description>Solve It (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2018-03-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="solve it (4am crack) disk 1.dsk" size="143360" crc="9b3ae078" sha1="3bbcfc852875eb63a8103c95bd8fe34be0483187" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="solve it (4am crack) disk 2.dsk" size="143360" crc="4592d1fc" sha1="f80934b2193f5e9275f8b6397ee7c9d666a36b5e" />
- </dataarea>
- </part>
- </software>
-
<software name="zork2r7">
<description>Zork II (Release 7 / UG3AU5) (cleanly cracked)</description>
<year>1981</year>
<publisher>Infocom</publisher>
<info name="release" value="2018-03-25"/>
- <!-- This is the first version, labeled release 7 / UG3AU5.-->
+ <!-- This is the first version, labeled release 7 / UG3AU5. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -27564,45 +12605,6 @@ license:CC0-1.0
</part>
</software>
- <software name="station5">
- <description>Station 5 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Micro-Fun Software</publisher>
- <info name="release" value="2018-04-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="station 5 (4am crack).dsk" size="143360" crc="bc3f5746" sha1="dae33e3858379b05666c9051d62d4aeba66c4b13" />
- </dataarea>
- </part>
- </software>
-
- <software name="theheist">
- <description>The Heist (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Micro-Fun Software</publisher>
- <info name="release" value="2018-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the heist (4am crack).dsk" size="143360" crc="4b3cc3a0" sha1="32a63adfacfc2676924f8b77566d2cdb64f88693" />
- </dataarea>
- </part>
- </software>
-
- <software name="shrtcrct">
- <description>Short Circuit (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Micro-Fun Software</publisher>
- <info name="release" value="2018-04-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="short circuit (4am crack).dsk" size="143360" crc="f9fd17f6" sha1="5330cfdc44de8aae2393291c98a5895ea5f7e7d5" />
- </dataarea>
- </part>
- </software>
-
<software name="babysitx">
<description>The Babysitting Experience (cleanly cracked)</description>
<year>1986</year>
@@ -27616,19 +12618,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wargle">
- <description>Wargle (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2018-04-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wargle (4am crack).dsk" size="143360" crc="7ddb00ca" sha1="183a142b5710998c90e797e00988fc7691c21ddc" />
- </dataarea>
- </part>
- </software>
-
<software name="spckadet">
<description>Space Kadet (cleanly cracked)</description>
<year>1982</year>
@@ -27642,22 +12631,6 @@ license:CC0-1.0
</part>
</software>
- <software name="nmgallry">
- <description>Nightmare Gallery (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2018-05-03"/>
- <!-- Left & Right arrows or Paddle0 for controls - Select with "K" for keyboard / "P" for paddle -->
- <!-- press SLASH "/" to fire with keyboard or use Button0 when using the paddle -->
- <!-- "C" for continuous fire, SPACE BAR for shields, CRTL-S toggles sound on/off, ESC for pause -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="nightmare gallery (4am crack).dsk" size="143360" crc="86421eea" sha1="cfa679c34cc728a3abc28ac2c64e636970d47409" />
- </dataarea>
- </part>
- </software>
-
<software name="alnmnchs">
<description>Alien Munchies (cleanly cracked)</description>
<year>1983</year>
@@ -27671,82 +12644,6 @@ license:CC0-1.0
</part>
</software>
- <software name="fact83r2">
- <description>The Factory (1983 Revision 2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2018-05-26"/>
- <!-- This undated revision fixes a small bug with a single variable in the
- FACTORY program file. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the factory 1983 rev. 2 (4am crack).dsk" size="143360" crc="0896a583" sha1="eee77dad727afdfb3988aad063ee801995b5bea1" />
- </dataarea>
- </part>
- </software>
-
- <software name="robodyv2">
- <description>Robot Odyssey I (version 2.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2018-05-27"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey i v2.0 (4am crack) disk a.dsk" size="143360" crc="0e720569" sha1="20e555fb142a45ea1398f6efda235300c51a185b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey i v2.0 (4am crack) disk b.dsk" size="143360" crc="8f85fec4" sha1="c80fe32f89539a6d617d9be92bc08bc63d1f9dac" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey i v2.0 (4am crack) disk c.dsk" size="143360" crc="11152a8d" sha1="7a23f63b20545eeb0865d436f91b8504f745844f" />
- </dataarea>
- </part>
- </software>
-
- <software name="robodyv2b" cloneof="robodyv2">
- <description>Robot Odyssey I (version 2.0) (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2018-05-27"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey i v2.0 (imperfect 4am crack) disk a.dsk" size="143360" crc="9b892eb3" sha1="dd45e3b31932ad7547d130a56f58708744653bca" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey i v2.0 (imperfect 4am crack) disk b.dsk" size="143360" crc="1a7ed51e" sha1="642f6ce855f8e0c3da653527eda2285b600907a5" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="robot odyssey i v2.0 (imperfect 4am crack) disk c.dsk" size="143360" crc="84ee0157" sha1="4265eac0e6eb6eac2abb93a845fc8d25b46a49e7" />
- </dataarea>
- </part>
- </software>
-
<software name="cavolymp">
<description>The Caves of Olympus (cleanly cracked)</description>
<year>1982</year>
@@ -27760,26 +12657,6 @@ license:CC0-1.0
</part>
</software>
- <software name="trcrsnct">
- <description>The Tracer Sanction (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Activision</publisher>
- <info name="release" value="2018-06-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the tracer sanction (4am and san inc crack) side a.dsk" size="143360" crc="eed7dede" sha1="ab6424a46c847b42ef781ddad1d00cd616079537" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the tracer sanction (4am and san inc crack) side b.dsk" size="143360" crc="cefcc169" sha1="2ed544112c396469ff96c4873cfc11ea02a70fd2" />
- </dataarea>
- </part>
- </software>
-
<software name="suspndr5">
<description>Suspended (Release 5 / 830222) (cleanly cracked)</description>
<year>1983</year>
@@ -27826,26 +12703,6 @@ license:CC0-1.0
</part>
</software>
- <software name="talehist">
- <description>Tales From History (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2018-07-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tales from history (4am crack) side a.dsk" size="143360" crc="a64e265b" sha1="9f69e9fa49c9726c9a0d3b5e0f62f04457e7919b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tales from history (4am crack) side b.dsk" size="143360" crc="f256aaa9" sha1="16d8f98878c4f62985c983ecd093049ab6d9423b" />
- </dataarea>
- </part>
- </software>
-
<software name="rndvou14">
<description>Rendezvous (version 1.4) (cleanly cracked)</description>
<year>1982</year>
@@ -27880,64 +12737,6 @@ license:CC0-1.0
</part>
</software>
- <software name="scrmbegg">
- <description>Scrambled Eggs (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2018-08-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="scrambled eggs (4am crack).dsk" size="143360" crc="b371a101" sha1="5fb00fdabe96223870f9e177bd4d6f1e9b890163" />
- </dataarea>
- </part>
- </software>
-
- <software name="spystrks">
- <description>The Spy Strikes Back (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-08-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the spy strikes back (4am crack).dsk" size="143360" crc="bf877558" sha1="826cae2efab3fb3f87d06e54235cea33f2a4611d" />
- </dataarea>
- </part>
- </software>
-
- <software name="wndwlkr">
- <description>Windwalker (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2018-08-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="windwalker (4am crack) disk 1.dsk" size="143360" crc="e3f73a2e" sha1="031efebe4ab1c44fdf6d7a184405191f71ed92e3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="windwalker (4am crack) disk 2.dsk" size="143360" crc="4b978d81" sha1="746b19e66396240fb8331317598a231d44c7c817" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="windwalker (4am crack) disk 3.dsk" size="143360" crc="04fa5a6b" sha1="c1f8e258529d02000a8f6aaa9634520ed0e03985" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="windwalker (4am crack) disk 4.dsk" size="143360" crc="52b4b787" sha1="03a56734ece920ca68a272cbecd186131e49e597" />
- </dataarea>
- </part>
- </software>
-
<software name="stepmreg">
<description>Stepwise Multiple Regression (cleanly cracked)</description>
<year>1980</year>
@@ -27990,79 +12789,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rdwar2k">
- <description>Roadwar 2000 (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="roadwar 2000 (4am crack) side a.dsk" size="143360" crc="ed978e93" sha1="980a0c17020dbf181d200362d1f6594e7895e745" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="roadwar 2000 (4am crack) side b.dsk" size="143360" crc="e422b02e" sha1="ca6927807ed6d42158493c30fba86d7d85dc2cd1" />
- </dataarea>
- </part>
- </software>
-
- <software name="rcchicka">
- <description>Rebel Charge at Chickamauga (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="rebel charge at chickamauga (4am crack) side a.dsk" size="143360" crc="4118631c" sha1="004d1d25a4c20a5edbbc201ae4f9b173b7157990" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="rebel charge at chickamauga (4am crack) side b.dsk" size="143360" crc="d1976271" sha1="36860382552e7c383d8c6e94bd150b7fd390d5c9" />
- </dataarea>
- </part>
- </software>
-
- <software name="wsthpac">
- <description>War in the South Pacific (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="war in the south pacific (4am crack) side a.dsk" size="143360" crc="28d20b8b" sha1="e954f5092b6567924e63e9a4dc3a3065ad40a672" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="war in the south pacific (4am crack) side b.dsk" size="143360" crc="e12ccbef" sha1="2818a948537af7a00c42ad8745965a06d1c7bb47" />
- </dataarea>
- </part>
- </software>
-
- <software name="ultima1">
- <description>Ultima I: The Beginning (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Origin Systems</publisher>
- <info name="release" value="2018-09-20"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ultima i - the beginning (4am crack).dsk" size="143360" crc="dfd24b04" sha1="5d2489d1ff07b2b29bca06f9bc6eb8b8ec153f6e" />
- </dataarea>
- </part>
- </software>
-
<software name="tac">
<description>T.A.C.: Tactical Armour Command (cleanly cracked)</description>
<year>1983</year>
@@ -28076,19 +12802,6 @@ license:CC0-1.0
</part>
</software>
- <software name="maincali">
- <description>The Great Maine to Calfornia Race (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hayden Book Company</publisher>
- <info name="release" value="2018-09-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the great maine to california race (4am crack).dsk" size="143360" crc="1b4f680a" sha1="5e5714fdefceaeaa5770e999f6b8eb752c63bd39" />
- </dataarea>
- </part>
- </software>
-
<software name="zork2r22">
<description>Zork II (Release 22 / 830331) (cleanly cracked)</description>
<year>1983</year>
@@ -28115,127 +12828,6 @@ license:CC0-1.0
</part>
</software>
- <software name="shilohgt">
- <description>Shiloh: Grant's Trial in the West (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="shiloh (4am crack) side a.dsk" size="143360" crc="46f1e68c" sha1="800467ca579dcddf0825af350a54691f358e79a6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="shiloh (4am crack) side b.dsk" size="143360" crc="453ef851" sha1="63fd8f6e16a3055501556fb4134ddb5f08e6df99" />
- </dataarea>
- </part>
- </software>
-
- <software name="advconst">
- <description>Adventure Construction Set (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2018-09-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="adventure construction set (4am and san inc crack) disk 1a.dsk" size="143360" crc="f68209e8" sha1="0e0aee9d92232f818c8124a4b080b99ec268f430" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="adventure construction set (4am and san inc crack) disk 1b.dsk" size="143360" crc="612c2b59" sha1="d2616d0038a39cf7d97441b0d612bfa5ae541a9a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="adventure construction set (4am and san inc crack) disk 2a.dsk" size="143360" crc="54030240" sha1="b5c9e3d650cc7fe5c1620ce8f339d2efffc6e73d" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="adventure construction set (4am and san inc crack) disk 2b.dsk" size="143360" crc="fc6d82b3" sha1="72d0ed56b5e9eb23c7f34ff75e662ffc7d4c5877" />
- </dataarea>
- </part>
- </software>
-
- <software name="trans82">
- <description>Transylvania (1982 Version) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-09-23"/>
- <!-- This version runs on a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="transylvania 1982 (4am crack).dsk" size="143360" crc="68d44ab2" sha1="541de6cb27d1a70502139b30cee71be4d9cff34e" />
- </dataarea>
- </part>
- </software>
-
- <software name="trans84">
- <description>Transylvania (1984 Version) (128K) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2018-09-23"/>
- <!--This 1984 re-release by Steven Meuse features double hi-res graphics by
- Marsha Meuse. This version requires a 128K Apple //e, //c, or IIgs.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="transylvania 1984 (4am crack).dsk" size="143360" crc="85ba86cd" sha1="ae05ef72d7e0cc94dda195da630b784a8d988589" />
- </dataarea>
- </part>
- </software>
-
- <software name="warshp10">
- <description>Warship (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="warship v1.0 (4am crack).dsk" size="143360" crc="0c47a247" sha1="633a0ac41505caad53e77d73a1e59c932cfbb843" />
- </dataarea>
- </part>
- </software>
-
- <software name="talisman">
- <description>Talisman: Challenging the Sands of Time (128K) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Polarware</publisher>
- <info name="release" value="2018-09-26"/>
- <!-- It requires a 128K Apple //e, //c, or IIgs.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot"/>
- <dataarea name="flop" size="143360">
- <rom name="talisman (4am crack) disk 1 - boot.dsk" size="143360" crc="775a823a" sha1="74896efb208edec2e42c9f1a62b74d06f0600110" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Empire"/>
- <dataarea name="flop" size="143360">
- <rom name="talisman (4am crack) disk 2 - empire.dsk" size="143360" crc="77660e58" sha1="3daf907bdab65e930d9a1ffd62dab3326e09841d" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Lands beyond"/>
- <dataarea name="flop" size="143360">
- <rom name="talisman (4am crack) disk 3 - lands beyond.dsk" size="143360" crc="214ff3b5" sha1="0ddcfbd830e431988e96c19382a247bb232931e1" />
- </dataarea>
- </part>
- </software>
-
<software name="typewrtr">
<description>The Typewriter (128K) (cleanly cracked)</description>
<year>1985</year>
@@ -28250,177 +12842,6 @@ license:CC0-1.0
</part>
</software>
- <software name="shrdspg1">
- <description>The Shard of Spring (version 1.1) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the shard of spring v1.1 (4am crack) side a.dsk" size="143360" crc="ef82007e" sha1="9b2032f145693e4ccbcf74953e52f61ef91d71fa" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the shard of spring v1.1 (4am crack) side b.dsk" size="143360" crc="6a2c7c76" sha1="bc77d3ea3e402e2c82757fa869ef1f9dfaa4f648" />
- </dataarea>
- </part>
- </software>
-
- <software name="railwest">
- <description>Rails West! (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rails west (4am and san inc crack).dsk" size="143360" crc="1b18e149" sha1="f9f40dfc1995d751f67c1f8671aef56ae2c927a3" />
- </dataarea>
- </part>
- </software>
-
- <software name="btlblg">
- <description>The Battle of the Bulge: Tigers in the Snow (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tigers in the snow (4am and san inc crack).dsk" size="143360" crc="0f1f8785" sha1="ee56de1e7bebc07d54d44669420b7ad5d072d7a8" />
- </dataarea>
- </part>
- </software>
-
- <software name="rngsseat">
- <description>Ringside Seat (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ringside seat (4am and san inc crack).dsk" size="143360" crc="623103c4" sha1="32dbc597bb6b4a6b85f20255b52a3efc60807736" />
- </dataarea>
- </part>
- </software>
-
- <software name="shatalli">
- <description>The Shattered Alliance (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the shattered alliance (4am and san inc crack).dsk" size="143360" crc="f50ce4ae" sha1="63aef0c4b6d60dc0deef6a9cf6234e6c545cc3ac" />
- </dataarea>
- </part>
- </software>
-
- <software name="warpfctr">
- <description>The Warp Factor (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-09-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the warp factor (4am and san inc crack).dsk" size="143360" crc="166d7cf6" sha1="9900c6421984afd5b6025506c7cef87345d2b4d2" />
- </dataarea>
- </part>
- </software>
-
- <software name="trsrisld">
- <description>Treasure Island (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2018-10-03"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (4am crack) side a.dsk" size="143360" crc="ae6fd6fd" sha1="8ea61af42b958161c3b50148683e1d8c27573d16" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (4am crack) side b.dsk" size="143360" crc="c3ca1416" sha1="000ffa7d1a40ce5d892a94690a5a398c15bceafc" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (4am crack) side c.dsk" size="143360" crc="0f671042" sha1="3297a11b79c7185a77e8eabd1e93e3d2dabe0a45" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (4am crack) side d.dsk" size="143360" crc="ba3b4b42" sha1="5ce7ab049c18615ee5165620aa23185523c5a1e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="trsrisldb" cloneof="trsrisld">
- <description>Treasure Island (imperfect clean crack)</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="release" value="2018-10-03"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (imperfect 4am crack) side a.dsk" size="143360" crc="fe6343dc" sha1="29c771367983e74bc72825a0dc805b831585f486" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (imperfect 4am crack) side b.dsk" size="143360" crc="c3ca1416" sha1="000ffa7d1a40ce5d892a94690a5a398c15bceafc" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (imperfect 4am crack) side c.dsk" size="143360" crc="0f671042" sha1="3297a11b79c7185a77e8eabd1e93e3d2dabe0a45" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D"/>
- <dataarea name="flop" size="143360">
- <rom name="treasure island (imperfect 4am crack) side d.dsk" size="143360" crc="ba3b4b42" sha1="5ce7ab049c18615ee5165620aa23185523c5a1e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="valgrump">
- <description>The Valentine's Day Grump (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2018-10-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the valentine's day grump (4am crack).dsk" size="143360" crc="7c759075" sha1="29410065b71e6f3264443f7e6b569487afe640f9" />
- </dataarea>
- </part>
- </software>
-
<software name="brckcapr">
<description>The Breckenridge Caper of 1798 (cleanly cracked)</description>
<year>1982</year>
@@ -28497,19 +12918,6 @@ license:CC0-1.0
</part>
</software>
- <software name="softprna">
- <description>Softporn Adventure (cleanly cracked)</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2018-10-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="softporn adventure (4am and san inc crack).dsk" size="143360" crc="0afa257d" sha1="385acc8ee9fb495e74b342d38b0fe085285cc3cc" />
- </dataarea>
- </part>
- </software>
-
<software name="swshbckl">
<description>Swashbuckler (cleanly cracked)</description>
<year>1982</year>
@@ -28523,32 +12931,6 @@ license:CC0-1.0
</part>
</software>
- <software name="torpfire">
- <description>Torpedo Fire (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-07"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="torpedo fire (4am and san inc crack).dsk" size="143360" crc="8a1c21e1" sha1="ea77512fab09e5d7a676bdf40e171dfaec4a17d9" />
- </dataarea>
- </part>
- </software>
-
- <software name="planguid">
- <description>The Planetary Guide (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2018-10-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the planetary guide (4am crack).dsk" size="143360" crc="9da21338" sha1="7f86e27049f6bc7d4eaa544816660431c862bb15" />
- </dataarea>
- </part>
- </software>
-
<software name="witnsr13">
<description>Witness (Release 13 / 830524) (cleanly cracked)</description>
<year>1983</year>
@@ -28562,19 +12944,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crscrowl">
- <description>The Curse of Crowley Manor (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Adventure International</publisher>
- <info name="release" value="2018-10-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the curse of crowley manor (4am crack).dsk" size="143360" crc="35dffa95" sha1="362bad035efea6e55cdddcb36d08767fb4ced8b5" />
- </dataarea>
- </part>
- </software>
-
<software name="elysflds">
<description>The Elysian Fields and Other Greek Myths (cleanly cracked)</description>
<year>1984</year>
@@ -28595,85 +12964,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rdwar2k2">
- <description>Roadwar 2000 (version 1.2) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="roadwar 2000 v1.2 (4am crack) side a.dsk" size="143360" crc="ab8817d7" sha1="12c55e34f815593784fcfcbaf2ebef735eb22506" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="roadwar 2000 v1.2 (4am crack) side b.dsk" size="143360" crc="69f2740a" sha1="f30584021385fd44c5b7a38c5a23d05f509f1440" />
- </dataarea>
- </part>
- </software>
-
- <software name="sthncmnd">
- <description>Southern Command (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="southern command (4am and san inc crack).dsk" size="143360" crc="e3265f8d" sha1="216fcf8fd4693c11bcdde1eb16e7423539fef0b7" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssshiloh">
- <description>The Battle of Shiloh (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the battle of shiloh (4am and san inc crack).dsk" size="143360" crc="2b8e5ba1" sha1="4d92dafe134bb703f242343dcfc7e8d1eb99b34e" />
- </dataarea>
- </part>
- </software>
-
- <software name="reforg88">
- <description>Reforger 88 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reforger 88 (4am and san inc crack).dsk" size="143360" crc="6c03e8ed" sha1="2cebfa405934799a71eece6c301612c4c9d8b407" />
- </dataarea>
- </part>
- </software>
-
- <software name="usaaf12">
- <description>U.S.A.A.F. (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2018-10-21"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Scenario (Boot)"/>
- <dataarea name="flop" size="143360">
- <rom name="u.s.a.a.f. v1.2 (4am and san inc crack) disk 1 - scenario (boot).dsk" size="143360" crc="3c071c39" sha1="cedc1f8b60d6671a1d6f5714f3b457deb56b686b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Game"/>
- <dataarea name="flop" size="143360">
- <rom name="u.s.a.a.f. v1.2 (4am and san inc crack) disk 2 - game.dsk" size="143360" crc="3a96f561" sha1="eca97c385f63d69915f97f03dc8d1c424faa0045" />
- </dataarea>
- </part>
- </software>
-
<software name="functgme">
<description>The Function Game (cleanly cracked)</description>
<year>1983</year>
@@ -28687,19 +12977,6 @@ license:CC0-1.0
</part>
</software>
- <software name="readadv1">
- <description>Reading Adventure 1 (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reading adventure 1 (4am crack).dsk" size="143360" crc="e8446113" sha1="5411b6da101eb13095efb00e98fd502852f4c9c9" />
- </dataarea>
- </part>
- </software>
-
<software name="zrkqst2">
<description>Zork Quest II: The Crystal of Doom (cleanly cracked)</description>
<year>1988</year>
@@ -28733,32 +13010,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tbtrrdsk">
- <description>Toward Better Reading Skills (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-01-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="toward better reading skills (4am crack).dsk" size="143360" crc="1df28795" sha1="3ef9ca205e8944111f4076e8261359d0e783e95e" />
- </dataarea>
- </part>
- </software>
-
- <software name="advalpha">
- <description>Adventure Alpha (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2019-01-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="adventure alpha (4am crack).dsk" size="143360" crc="d4b3830a" sha1="99523eb5184a87f825912bd56b4cd52a36a0e964" />
- </dataarea>
- </part>
- </software>
-
<software name="trkcoyr2">
<description>Trickster Coyote (Revision 2) (cleanly cracked)</description>
<year>1984</year>
@@ -28785,21 +13036,6 @@ license:CC0-1.0
</part>
</software>
- <software name="zgfx1083">
- <description>Zoom Grafix 05-OCT-83 (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Phoenix Software</publisher>
- <info name="release" value="2019-04-08"/>
- <!-- This version is dated 05-OCT-83 according to comments within the
- program itself. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="zoom grafix 05-oct-83 (4am crack).dsk" size="143360" crc="72cd3138" sha1="66a6fa3e0cee04fcc222ad61de3e8d22668b6ebd" />
- </dataarea>
- </part>
- </software>
-
<software name="brdeyemi">
<description>A Bird's Eye View of The Main Idea (cleanly cracked)</description>
<year>1986</year>
@@ -28842,7 +13078,7 @@ license:CC0-1.0
<software name="unrepasf">
<description>Un Repas Francais (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2019-07-21"/>
<part name="flop1" interface="floppy_5_25">
@@ -28879,38 +13115,12 @@ license:CC0-1.0
</part>
</software>
- <software name="vrbusg3b">
- <description>Verb Usage 3 (version 01.31.89) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2019-07-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 3 v01.31.89 (4am crack).dsk" size="143360" crc="d4b8667d" sha1="d2ac36fdf5a5b3146df206a5086d40adce656dd6" />
- </dataarea>
- </part>
- </software>
-
- <software name="rtsafx1">
- <description>Roots/Affixes 1 (version 09.14.87) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2019-07-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="roots-affixes 1 v09.14.87 (4am crack).dsk" size="143360" crc="07ef6108" sha1="e63386e64c11f3e99f88f95ec257369ba2d1e533" />
- </dataarea>
- </part>
- </software>
-
<software name="zandar">
<description>Zandar The Wizard (cleanly cracked)</description>
<year>1983</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2019-07-22"/>
- <!--"Zandar The Wizard" is a 1983 educational program designed by Janis Morariu, Ph.D. and Judie Brunsen; implemented by Educational SoftArt; and distributed by Society for Visual Education. It is preserved here for the first time.-->
+ <!-- "Zandar The Wizard" is a 1983 educational program designed by Janis Morariu, Ph.D. and Judie Brunsen; implemented by Educational SoftArt; and distributed by Society for Visual Education. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Level 1"/>
<dataarea name="flop" size="143360">
@@ -29030,72 +13240,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wlywrdwk">
- <description>Wally's Word Works: The Parts of Speech Game (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-07-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk"/>
- <dataarea name="flop" size="143360">
- <rom name="wally's word works (4am crack) disk 1 - teacher disk.dsk" size="143360" crc="eebd4e30" sha1="fabadee8ec857c2651fee5e20eebdb25f6cfca80" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Student disk"/>
- <dataarea name="flop" size="143360">
- <rom name="wally's word works (4am crack) disk 2 - student disk.dsk" size="143360" crc="b3b9115f" sha1="56de7705ae6447cf8cc976fbf70c9286e771aac8" />
- </dataarea>
- </part>
- </software>
-
- <software name="puncpon">
- <description>Punctuation Put-On (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-07-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk"/>
- <dataarea name="flop" size="143360">
- <rom name="punctuation put-on (4am crack) disk 1 - teacher disk.dsk" size="143360" crc="a786b53a" sha1="c04e5cdb23e03b3b20e7cf216b834fe1d0e8e212" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Student disk"/>
- <dataarea name="flop" size="143360">
- <rom name="punctuation put-on (4am crack) disk 2 - student disk.dsk" size="143360" crc="f9f1a8c3" sha1="09933bbead765a267571ff4a06b24cb95fb67232" />
- </dataarea>
- </part>
- </software>
-
- <software name="nkotb">
- <description>New Kid on the Block (version 02.09.89) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2019-07-28"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="new kid on the block (4am crack) disk 1.dsk" size="143360" crc="5f7feea4" sha1="32bd143f480259dd6796db73c59e10c5482e0f7c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="new kid on the block (4am crack) disk 2.dsk" size="143360" crc="2c0eaee1" sha1="7c7c4f082599ac471a19f49b3c363ab021f97363" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="new kid on the block (4am crack) disk 3.dsk" size="143360" crc="c7cf3f91" sha1="fb6931142c9f9259cb35340803275b9cb69396e6" />
- </dataarea>
- </part>
- </software>
-
<software name="hnkypnky">
<description>Hinky Pinky (cleanly cracked)</description>
<year>1985</year>
@@ -29116,38 +13260,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dinodypl">
- <description>Dinosaur Days Plus (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2019-08-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days plus (4am crack) disk 1a - program.dsk" size="143360" crc="9c1f7a33" sha1="1db7919a4bc7faad7f4eee2d23b6cd06b0c87bb0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Artwork"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days plus (4am crack) disk 1b - artwork.dsk" size="143360" crc="ce3f5c47" sha1="15328506f5ef39cc1abb39bcb0afa2593556d311" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Learning disk"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days plus (4am crack) disk 2a - learning disk.dsk" size="143360" crc="33d43d67" sha1="76c0592075087b824191e4d9c98923f8dbf526d1" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Learning disk"/>
- <dataarea name="flop" size="143360">
- <rom name="dinosaur days plus (4am crack) disk 2b - learning disk.dsk" size="143360" crc="153b4ea8" sha1="e6116d613bb0aed1491c6df9c0bdf34231ea42f2" />
- </dataarea>
- </part>
- </software>
-
<software name="workfrc2">
<description>Work Force II (version 2.10) (cleanly cracked)</description>
<year>1985</year>
@@ -29303,7 +13415,7 @@ license:CC0-1.0
<software name="addfacts">
<description>The Addition Facts (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2019-08-04"/>
<part name="flop1" interface="floppy_5_25">
@@ -29316,7 +13428,7 @@ license:CC0-1.0
<software name="mulfacts">
<description>The Multiplication Facts (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2019-08-04"/>
<part name="flop1" interface="floppy_5_25">
@@ -29326,51 +13438,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mslat101">
- <description>Muppet Slate (version 1.01) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-08-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk"/>
- <dataarea name="flop" size="143360">
- <rom name="muppet slate v1.01 (4am crack) disk 1 - teacher disk.dsk" size="143360" crc="3c2145cc" sha1="eebdb82b0fdd231e38a8528fed37e08bfa6c6946" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Master student disk"/>
- <dataarea name="flop" size="143360">
- <rom name="muppet slate v1.01 (4am crack) disk 2 - master student disk.dsk" size="143360" crc="b5647cd7" sha1="f2d5c724a8412e450344f43b10d977728cf52b19" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Seasons and special days"/>
- <dataarea name="flop" size="143360">
- <rom name="muppet slate v1.01 (4am crack) disk 3 - seasons and special days.dsk" size="143360" crc="0a353a3d" sha1="6029f36906448b6d1fe31ddfe0a2b206dc2530ec" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - More special days"/>
- <dataarea name="flop" size="143360">
- <rom name="muppet slate v1.01 (4am crack) disk 4 - more special days.dsk" size="143360" crc="486aea9b" sha1="7fae54f5e54b53d39b816a4d2988d057b1443309" />
- </dataarea>
- </part>
- </software>
-
- <software name="bignlitl">
- <description>BIG and little: Books, Posters, and Cards for Muppet Slate (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-08-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="big and little (4am crack).dsk" size="143360" crc="3d30f609" sha1="3414a3ba8e8ab189c64536b68316a3aaf217d07c" />
- </dataarea>
- </part>
- </software>
-
<software name="flficftl">
<description>Flights Into Fiction: Fairy Tales (cleanly cracked)</description>
<year>1986</year>
@@ -29394,7 +13461,7 @@ license:CC0-1.0
<software name="divfacts">
<description>The Division Facts (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2019-08-17"/>
<part name="flop1" interface="floppy_5_25">
@@ -29407,7 +13474,7 @@ license:CC0-1.0
<software name="subfacts">
<description>The Subtraction Facts (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2019-08-17"/>
<part name="flop1" interface="floppy_5_25">
@@ -29430,32 +13497,6 @@ license:CC0-1.0
</part>
</software>
- <software name="msnastrd">
- <description>Mission: Asteroid (cleanly cracked)</description>
- <year>1980</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2019-08-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mission asteroid (4am and san inc crack).dsk" size="143360" crc="a9c9e1ab" sha1="006865ece389e8daa676de7365eed76ece64726a" />
- </dataarea>
- </part>
- </software>
-
- <software name="charlweb">
- <description>A Newbery Adventure: Charlotte's Web (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2019-08-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="a newbery adventure - charlotte's web (4am crack).dsk" size="143360" crc="158943a0" sha1="afc5c41c8249ce3a2764115e5379e2b561914285" />
- </dataarea>
- </part>
- </software>
-
<software name="poetryex">
<description>Poetry Express (cleanly cracked)</description>
<year>1984</year>
@@ -29528,39 +13569,6 @@ license:CC0-1.0
</part>
</software>
- <software name="djlb1on1">
- <description>Julius Erving and Larry Bird Go One on One (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2019-08-29"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="one on one (4am and san inc crack).dsk" size="143360" crc="ab1717ad" sha1="0b9331f3a44b13ceefd8f201b01a41118d6ab4c0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cb123q">
- <description>Charlie Brown's 1, 2, 3's (1990 Queue re-release) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Queue</publisher>
- <info name="release" value="2019-09-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="charlie brown's 1, 2, 3's (1990 re-release)(4am crack) side a.dsk" size="143360" crc="62ff3f40" sha1="c7cd861c9000a6169cc8e14af661ba7cb02227a1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="charlie brown's 1, 2, 3's (1990 re-release)(4am crack) side b.dsk" size="143360" crc="4b8a2eb6" sha1="61fe7bb3f9e88c430a743c39ed6f378539eff31a" />
- </dataarea>
- </part>
- </software>
-
<software name="buckzoom">
<description>Buck Rogers - Planet of Zoom (cleanly cracked)</description>
<year>1984</year>
@@ -29688,19 +13696,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crchoru4">
- <description>Creature Chorus (version 4.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="release" value="2019-09-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="creature chorus v4.0 (4am crack).dsk" size="143360" crc="86db4bac" sha1="4f511f09dc1f94079fed1eba0902abfce26da333" />
- </dataarea>
- </part>
- </software>
-
<software name="istarflt1">
<description>Star Fleet 1: The War Begins (cleanly cracked)</description>
<year>1984</year>
@@ -29779,80 +13774,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wgbbenh">
- <description>The World's Greatest Baseball Game (Enhanced Version) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Quest</publisher>
- <info name="release" value="2019-09-29"/>
- <!-- "The World's Greatest Baseball Game (Enhanced Version)" is a 1986 sports game developed by Quest. It is preserved here for the first time. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Interactive and statistical game play"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 1 - interactive and statistical game play.dsk" size="143360" crc="c625a5e8" sha1="abb4f9c4f0f1ee32e5893a326e5485a169ad3e08" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Team trading functions"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 2 - team trading functions.dsk" size="143360" crc="bb4f4115" sha1="b879dc67e6785168f02f499c1b9a60b44d07761a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - 1984 teams roster"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 3 - 1984 teams roster.dsk" size="143360" crc="034912e1" sha1="6783ed0dd291cccaf4cf2a6383d272bb4d036dbf" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - 1985 teams roster"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 4 - 1985 teams roster.dsk" size="143360" crc="6bbc19a9" sha1="12e35693433e6e2b9505c716f28322b201d26ad5" />
- </dataarea>
- </part>
- </software>
-
- <software name="wgbbenhb" cloneof="wgbbenh">
- <description>The World's Greatest Baseball Game (Enhanced Version) (imperfect clean crack)</description>
- <year>1986</year>
- <publisher>Quest</publisher>
- <info name="release" value="2019-09-29"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Interactive and statistical game play"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version) (imperfect 4am crack) disk 1 - interactive and statistical game play.dsk" size="143360" crc="06291f92" sha1="61c8ccd17cd988284b12a825e7af6f0a5d89187b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Team trading functions"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version) (imperfect 4am crack) disk 2 - team trading functions.dsk" size="143360" crc="eb43d434" sha1="69026be09657404cd9d08e038ac9ef6627bd522d" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - 1984 teams roster"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version) (imperfect 4am crack) disk 3 - 1984 teams roster.dsk" size="143360" crc="034912e1" sha1="6783ed0dd291cccaf4cf2a6383d272bb4d036dbf" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - 1985 teams roster"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (enhanced version) (imperfect 4am crack) disk 4 - 1985 teams roster.dsk" size="143360" crc="6bbc19a9" sha1="12e35693433e6e2b9505c716f28322b201d26ad5" />
- </dataarea>
- </part>
- </software>
-
<software name="ewstat33">
<description>Statistics (version 3.3) (cleanly cracked)</description>
<year>1982</year>
@@ -29867,26 +13788,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mcfreedm">
- <description>MECC-A315 Freedom! (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2019-11-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a315 freedom v1.0 (4am crack) disk 1.dsk" size="143360" crc="486566f3" sha1="7ee0fa299041f7fc485d67dccae05c927412d8e2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a315 freedom v1.0 (4am crack) disk 2.dsk" size="143360" crc="01525b78" sha1="0b55f67ee57d6bb0a6b87aa029a41dfb7b457767" />
- </dataarea>
- </part>
- </software>
-
<software name="alabyrnt">
<description>Labyrinth: The Computer Game (Lucasfilm Games) (cleanly cracked)</description>
<year>1986</year>
@@ -29907,58 +13808,6 @@ license:CC0-1.0
</part>
</software>
- <software name="labycret">
- <description>Labyrinth of Crete (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Adventure International</publisher>
- <info name="release" value="2019-11-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="labyrinth of crete (4am crack).dsk" size="143360" crc="cd12d96c" sha1="dab01261a4c4335acd9add607f6b920cdb15cf35" />
- </dataarea>
- </part>
- </software>
-
- <software name="cosbalan">
- <description>The Cosmic Balance (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2019-11-15"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the cosmic balance (4am and san inc crack).dsk" size="143360" crc="af0b221b" sha1="49f46eb5580cbb01fdcfa4ae5bfd39ea459a1b04" />
- </dataarea>
- </part>
- </software>
-
- <software name="questron">
- <description>Questron (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2019-11-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Character Disk (Boot disk)"/>
- <dataarea name="flop" size="143360">
- <rom name="questron (4am crack) character disk (boot).dsk" size="143360" crc="a5883c8c" sha1="e0808ea101c1211bd8cb072d1452427dfcb0a37b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Game disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="questron (4am crack) game disk 1.dsk" size="143360" crc="a8655b0b" sha1="cec363e8a31984cf6edc5465244f0a2b15c3c878" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Game disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="questron (4am crack) game disk 2.dsk" size="143360" crc="b7229e6c" sha1="0bcb289ad32930e6e7313f1a73d1ab0c3f4450b9" />
- </dataarea>
- </part>
- </software>
-
<software name="advkrist">
<description>The Adventures of Kristen and Her Family (cleanly cracked)</description>
<year>1985</year>
@@ -29972,19 +13821,6 @@ license:CC0-1.0
</part>
</software>
- <software name="leadshtr">
- <description>Leadsheeter (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Passport Designs, Inc</publisher>
- <info name="release" value="2019-11-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="leadsheeter (4am and san inc crack).dsk" size="143360" crc="1f890162" sha1="d91cc98035f67461d92490f9a1d7912d00823bfc" />
- </dataarea>
- </part>
- </software>
-
<software name="emp3arma">
<description>Empire III: Armageddon (version 1.1) (cleanly cracked)</description>
<year>1984</year>
@@ -29998,152 +13834,6 @@ license:CC0-1.0
</part>
</software>
- <software name="pwritr12">
- <description>PolyWriter (version 1.2) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Passport Designs, Inc</publisher>
- <info name="release" value="2019-11-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="polywriter v1.2 (4am and san inc crack).dsk" size="143360" crc="10770914" sha1="c8ee9a53070adf453876392cbc8814c8bb087b8d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="pwritu12">
- <description>PolyWriter Utilities (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Passport Designs, Inc</publisher>
- <info name="release" value="2019-11-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="polywriter utilities v1.2 (4am and san inc crack).dsk" size="143360" crc="708766bd" sha1="8cf89cc33b6e70c45328edc08d1f17929350d941"/>
- </dataarea>
- </part>
- </software>
-
- <software name="midi8p12">
- <description>MIDI/8 Plus (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Passport Designs, Inc</publisher>
- <info name="release" value="2019-11-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="midi-8 plus (4am and san inc crack).dsk" size="143360" crc="39bf6550" sha1="7babdcdc5a3f778d0d3715565d466112dfa007c3"/>
- </dataarea>
- </part>
- </software>
-
- <software name="korg800m">
- <description>Korg 800 4-Track MIDI Sequencer (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Passport Designs, Inc</publisher>
- <info name="release" value="2019-11-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="korg-800 4 track midi sequencer (4am and san inc crack).dsk" size="143360" crc="64b0622c" sha1="0a51b1ee8f9dec7e0f5120f9f21abf1d1d53257c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="certmore">
- <description>Certificates and More! (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2019-11-21"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="certificates and more (4am crack) disk 1 - program.dsk" size="143360" crc="a7145f4d" sha1="f09861dc6722206e2d2d8eadde805595edd16a6d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Templates"/>
- <dataarea name="flop" size="143360">
- <rom name="certificates and more (4am crack) disk 2 - templates.dsk" size="143360" crc="a4f43948" sha1="72c15e0c21abf599dd1e9ba4de53503f1fc942b8" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Borders and fonts"/>
- <dataarea name="flop" size="143360">
- <rom name="certificates and more (4am crack) disk 3 - borders and fonts.dsk" size="143360" crc="c89753e1" sha1="e8545509b0f94025ab3ef9c93c93078fca619971" />
- </dataarea>
- </part>
- </software>
-
- <software name="certmoreb" cloneof="certmore">
- <description>Certificates and More! (imperfect clean crack)</description>
- <year>1988</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2019-11-21"/>
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines.
-
- This 'imperfect crack' version remains in here for
- documentation purposes. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="certificates and more (imperfect 4am crack) disk 1 - program.dsk" size="143360" crc="41e32298" sha1="895ceebcc95c97cec1ba9558c0ff17caaae2c3a1"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Templates"/>
- <dataarea name="flop" size="143360">
- <rom name="certificates and more (imperfect 4am crack) disk 2 - templates.dsk" size="143360" crc="a4f43948" sha1="72c15e0c21abf599dd1e9ba4de53503f1fc942b8"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Borders and fonts"/>
- <dataarea name="flop" size="143360">
- <rom name="certificates and more (imperfect 4am crack) disk 3 - borders and fonts.dsk" size="143360" crc="c89753e1" sha1="e8545509b0f94025ab3ef9c93c93078fca619971"/>
- </dataarea>
- </part>
- </software>
-
- <software name="crrworks">
- <description>The Railroad Works (CBS Version) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>CBS</publisher>
- <info name="release" value="2019-11-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the railroad works (clean crack).do" size="143360" crc="779b1050" sha1="9be6c43573692aa3042439fc27f34b622ea963f4" />
- </dataarea>
- </part>
- </software>
-
- <software name="boyjesus">
- <description>The Boy Jesus (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Educational Publishing Concepts</publisher>
- <info name="release" value="2019-11-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the boy jesus (4am crack) side a.dsk" size="143360" crc="88c20d44" sha1="17d9afc0952ea153a502768a1316fe33d5bc699c"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the boy jesus (4am crack) side b.dsk" size="143360" crc="7b549ae0" sha1="d75c8e9301b81b50ec101906016e72692ae83674"/>
- </dataarea>
- </part>
- </software>
-
<software name="mchess20">
<description>MicroChess (version 2.0) (cleanly cracked)</description>
<year>1978</year>
@@ -30196,42 +13886,6 @@ license:CC0-1.0
</part>
</software>
- <software name="toapshai">
- <description>Temple of Apshai (cleanly cracked)</description>
- <year>1979</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2019-12-16"/>
- <!-- 4am has this to say about this disk:
- There were several releases of this game. One only booted
- on 13-sector drives and had no title screen at all. Another
- booted on 13-sector drives but had a title screen.
-
- This release only boots on 16-sector drives and has a title
- screen and a hi-res character generator. There is at least one
- later version that has all the features of this one, plus allows
- you to choose between "Old English" and "Standard" hi-res
- fonts. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="temple of apshai (4am crack).dsk" size="143360" crc="dd57eac2" sha1="b0b20e251ab5ffdf6981ffeaf4991ae31256e0e8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="grglobge">
- <description>Green Globs and Graphing Equations (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-01-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="green globs and graphing equations (4am crack).dsk" size="143360" crc="949b5a00" sha1="5c4453baf8d2eb89ee8a403c042861e36a219765"/>
- </dataarea>
- </part>
- </software>
-
<software name="inrecall">
<description>Instant Recall (version 1.1) (cleanly cracked)</description>
<year>1983</year>
@@ -30296,19 +13950,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wizip201">
- <description>Wiziprint (version 2.01) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sir-Tech</publisher>
- <info name="release" value="2020-01-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="wiziprint (4am crack).dsk" size="143360" crc="354fab0c" sha1="00ab6c5edc0fd0985ecbf425bb2a5c850d0c7b87"/>
- </dataarea>
- </part>
- </software>
-
<software name="aeclfsci">
<description>Life Science (cleanly cracked)</description>
<year>1987</year>
@@ -30322,19 +13963,6 @@ license:CC0-1.0
</part>
</software>
- <software name="midi4r5">
- <description>MIDI/4 (Revision 5) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Passport Designs, Inc</publisher>
- <info name="release" value="2020-01-06"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="midi-4 (4am and san inc crack).dsk" size="143360" crc="14b0ad62" sha1="9e9eb73bd28412c2176c8b6d6b7fbe14b3a2f65e"/>
- </dataarea>
- </part>
- </software>
-
<software name="qmile40">
<description>The Quarter Mile (version 4.0) (800K 3.5") (cleanly cracked)</description>
<year>1992</year>
@@ -30342,7 +13970,7 @@ license:CC0-1.0
<info name="release" value="2020-01-09"/>
<!-- This is version 4.0, originally distributed on a 3.5-inch (800K)
disk for Apple IIgs, //c+, or //e users with a UniDisk 3.5-inch drive.
- -->
+ -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -30474,32 +14102,6 @@ license:CC0-1.0
</part>
</software>
- <software name="esctraam">
- <description>Other-Venture #3: The Escape from Traam (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Adventure International</publisher>
- <info name="release" value="2020-02-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the escape from traam (4am crack).dsk" size="143360" crc="2674abc0" sha1="ae85eb448d2ba306131adb3b5d98ac20cbb99a32"/>
- </dataarea>
- </part>
- </software>
-
- <software name="dragneye">
- <description>The Dragon's Eye (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2020-02-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the dragon's eye (4am crack).dsk" size="143360" crc="b4c1aaab" sha1="bcf992557c03a97d6198763191a84cecd944d928"/>
- </dataarea>
- </part>
- </software>
-
<software name="frakfaeb">
<description>Fraktured Faebles (cleanly cracked)</description>
<year>1985</year>
@@ -30520,52 +14122,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ulyss11">
- <description>Ulysses and the Golden Fleece (version 1.1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2020-02-03"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="ulysses and the golden fleece v1.1 (4am crack) side a.dsk" size="143360" crc="bd40780c" sha1="1d95b3b621e4a8bd118cfd810c0a5b6f6c83cd14"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="ulysses and the golden fleece v1.1 (4am crack) side b.dsk" size="143360" crc="3fc83c7f" sha1="78b50cc5acb57fec58900426b6bd2b0b87b3b2a6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="bldpersp">
- <description>Building Perspective (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-02-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="building perspective (4am crack).dsk" size="143360" crc="9d5b6147" sha1="d065efde9c4f4769485dd0f6b4df39d96a60f30f" />
- </dataarea>
- </part>
- </software>
-
- <software name="pickpart">
- <description>Pick The Part (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-02-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pick the part (4am crack).dsk" size="143360" crc="4ef73c91" sha1="b4900ba310892fc33eb8c6b4bff54f224edf2701" />
- </dataarea>
- </part>
- </software>
-
<software name="teltm320">
<description>Telling Time (version 3.2.0) (cleanly cracked)</description>
<year>1986</year>
@@ -30592,23 +14148,6 @@ license:CC0-1.0
</part>
</software>
- <software name="seavoyms">
- <description>The Sea Voyagers (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2020-03-22"/>
- <!--
- Keyboard overlay available at:
- https://archive.org/download/TheSeaVoyagers4amCrack/The%20Sea%20Voyagers%20%284am%20crack%29.txt
- -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the sea voyagers (4am crack).dsk" size="143360" crc="21466949" sha1="e277b1e1419432826046bc1feb39fa601da71b66"/>
- </dataarea>
- </part>
- </software>
-
<software name="latnhngm">
<description>The Latin Hangman (Revision 1004) (cleanly cracked)</description>
<year>1983</year>
@@ -30632,7 +14171,7 @@ license:CC0-1.0
<software name="awwolves">
<description>Animal Watch: Wolves (cleanly cracked)</description>
<year>1988</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2020-04-25"/>
<part name="flop1" interface="floppy_5_25">
@@ -30658,7 +14197,7 @@ license:CC0-1.0
<software name="awwhales">
<description>Animal Watch: Whales (cleanly cracked)</description>
<year>1988</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2020-04-25"/>
<part name="flop1" interface="floppy_5_25">
@@ -30684,7 +14223,7 @@ license:CC0-1.0
<software name="awtracks">
<description>Animal Watch: Tracks (cleanly cracked)</description>
<year>1988</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2020-04-25"/>
<part name="flop1" interface="floppy_5_25">
@@ -30707,140 +14246,10 @@ license:CC0-1.0
</part>
</software>
- <software name="hom1r2">
- <description>Homonyms I (Revision 2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="homonyms i rev. 2 (4am crack).dsk" size="143360" crc="9681d4b6" sha1="1deb93a2be7d78d848c4def9bb319b0ab2bffbda"/>
- </dataarea>
- </part>
- </software>
-
- <software name="hom2r2">
- <description>Homonyms II (Revision 2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="homonyms ii rev. 2 (4am crack).dsk" size="143360" crc="cd7c8e9e" sha1="3bfa0f7a7156845eb1b7392c7fa09756ae50ad4f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="pron1r2">
- <description>Pronouns I (Revision 2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pronouns i rev. 2 (4am crack).dsk" size="143360" crc="85d199a0" sha1="b4dd139c4f17825a13f5dd762b7bf1a242e59481"/>
- </dataarea>
- </part>
- </software>
-
- <software name="pron2r2">
- <description>Pronouns II (Revision 2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pronouns ii rev. 2 (4am crack).dsk" size="143360" crc="e73e4fcb" sha1="b675fac3a52944031b1fa51e884b9e52496ed35c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="verb1r2">
- <description>Verbs I (Revision 2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verbs i rev. 2 (4am crack).dsk" size="143360" crc="b0c2705f" sha1="a6b36da980cb96e8421bb1492d0d115bf528e38a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mpvrb2r2">
- <description>Verbs II (Revision 2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verbs ii rev. 2 (4am crack).dsk" size="143360" crc="6a23f644" sha1="ea1bfa8af5aefea3f67265a068aa090fdb146cb8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="deugddd">
- <description>Deutsche Grammatik: der-die-das (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2020-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="deutsche grammatik (4am crack).dsk" size="143360" crc="2d396899" sha1="7199dcb8e67c905ec49af7a4aa3940a37ff2fed0"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcemny10">
- <description>MECC-A816 Electronic Money (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2020-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a816 electronic money v1.0 (4am crack).dsk" size="143360" crc="f1dc965d" sha1="67d09045ced758930f96a522cb0661e457bf3f51"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcemny11">
- <description>MECC-A816 Electronic Money (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2020-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a816 electronic money v1.1 (4am crack).dsk" size="143360" crc="cfe8e02a" sha1="544b7f18d3ac44156fa543aeba47aa80c425b0cc"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mccls1v1">
- <description>MECC-A824 Classification (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2020-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a824 classification volume 1 v1.0 (4am crack).dsk" size="143360" crc="f809449c" sha1="4fbfbb69c1deab64257028e2494a2be1033fbb12"/>
- </dataarea>
- </part>
- </software>
-
<software name="dcktrex">
<description>Dinosaur Construction Kit: Tyrannosaurus Rex (cleanly cracked)</description>
<year>1987</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2020-05-27"/>
<part name="flop1" interface="floppy_5_25">
@@ -30857,84 +14266,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mpsntcmb">
- <description>Sentence Combining (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2020-05-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="sentence combining i (4am crack).dsk" size="143360" crc="cc058220" sha1="fde07885d295948016480de75409593bf64e417d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="jbrtlky">
- <description>Jabbertalky (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2020-05-27"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="jabbertalky (4am crack).dsk" size="143360" crc="d4ef2bf5" sha1="d39e52135171037b2f1451294cba795df955a457"/>
- </dataarea>
- </part>
- </software>
-
- <software name="grmwrdr1">
- <description>German Word Order (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2020-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="german word order (4am crack).dsk" size="143360" crc="acdab126" sha1="e2e9d4d71115899aa38c49292cd21c4c0f9dec6b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="grmwrdr2">
- <description>German Word Order (Revision 2) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2020-05-26"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="german word order rev. 2 (4am crack).dsk" size="143360" crc="87b4e49e" sha1="8a0bf71300112118088a93360aa84243eb4b9ca0"/>
- </dataarea>
- </part>
- </software>
-
- <software name="wizmath">
- <description>The Wizard of Id's WizMath (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2020-06-18"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the wizard of id's wizmath (4am crack).dsk" size="143360" crc="b90a08c7" sha1="f8d13d1ef59301856c847469b107dd9251fd90db"/>
- </dataarea>
- </part>
- </software>
-
- <software name="agalxsc">
- <description>Apple Galaxian (StarCraft) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>StarCraft</publisher>
- <info name="release" value="2020-06-23"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="apple galaxian (starcraft) (4am crack).dsk" size="143360" crc="f2015816" sha1="d7f2e879638238bf909eceb194a7f4a1c66c7754"/>
- </dataarea>
- </part>
- </software>
-
<software name="xpmapsgl">
<description>Exploring Maps and Globes (cleanly cracked)</description>
<year>1987</year>
@@ -30948,89 +14279,12 @@ license:CC0-1.0
</part>
</software>
- <software name="nwawit">
- <description>Newbery Winners: A Wrinkle in Time (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="newbery winners- a wrinkle in time (4am crack).dsk" size="143360" crc="d4637c5a" sha1="b12f12ea6de8898a8f7552527ba882b21c1e40ce"/>
- </dataarea>
- </part>
- </software>
-
- <software name="nwbtt">
- <description>Newbery Winners: Bridge to Terabithia (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="newbery winners- bridge to terabithia (4am crack).dsk" size="143360" crc="f86a002a" sha1="5340a51606f2a963f413b032ac8ee198382e97c7"/>
- </dataarea>
- </part>
- </software>
-
- <software name="nwsndr">
- <description>Newbery Winners: Sounder (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="newbery winners- sounder (4am crack).dsk" size="143360" crc="cb639f8e" sha1="64b3f80208f36df0cf24e2cc51f4419b3c2e26e1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="nwtwg">
- <description>Newbery Winners: The Westing Game (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-07-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="newbery winners- the westing game (4am crack).dsk" size="143360" crc="7479173c" sha1="88143a8b920f809a40854bff1f3207298cdaad4c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="geomap">
- <description>Geometry: Area and Perimeter (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2020-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="geometry- area and perimeter (4am crack).dsk" size="143360" crc="9eda9409" sha1="a9574f8535a86e7cc0b0cd57c51c4fddaca0e631"/>
- </dataarea>
- </part>
- </software>
-
- <software name="harvprim">
- <description>Harvey by Primes (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Queue</publisher>
- <info name="release" value="2020-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="harvey by primes (4am crack).dsk" size="143360" crc="53b86cdc" sha1="ff3465d702503a32d55a3e45106f9bdee99bfba0"/>
- </dataarea>
- </part>
- </software>
-
<software name="capalgr2">
<description>Computer Assisted Problem Solving for Intermediate Algebra (Revision 2) (cleanly cracked)</description>
<year>1984</year>
<publisher>Unknown</publisher>
- <info name="programmer" value="Chris W. Avery and Charles B. Barker"/>
+ <info name="programmer" value="Chris W. Avery" />
+ <info name="programmer" value="Charles B. Barker" />
<info name="release" value="2020-07-16"/>
<!-- Publisher is unknown. Authors are Chris W. Avery and Charles B.
Barker. -->
@@ -31049,57 +14303,6 @@ license:CC0-1.0
</part>
</software>
- <software name="georectr">
- <description>Geometry: Rectilinear Regions (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2020-07-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="geometry- rectilinear regions (4am crack).dsk" size="143360" crc="9a216e06" sha1="8bd6c17f48143de83be75c52b23fc90aa4c9a279"/>
- </dataarea>
- </part>
- </software>
-
- <software name="psialge">
- <description>Problem Solving in Algebra (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2020-07-16"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="problem solving in algebra (4am crack) disk 1.dsk" size="143360" crc="03cc98f1" sha1="5128aaffc6d85ed1597bf4efe9c520aef9cf25c4"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="problem solving in algebra (4am crack) disk 2.dsk" size="143360" crc="dd40b065" sha1="ab1ced8fcfeea82e6186375bc328c7a6166bfc54"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="problem solving in algebra (4am crack) disk 3.dsk" size="143360" crc="d642c5b6" sha1="275fd1d0045fd79ac63965207f7c12d4d825ca90"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="problem solving in algebra (4am crack) disk 4.dsk" size="143360" crc="bd7bf5e3" sha1="9580a8a274b919060dcec49aa56182b4ca8a396a"/>
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5"/>
- <dataarea name="flop" size="143360">
- <rom name="problem solving in algebra (4am crack) disk 5.dsk" size="143360" crc="16dba183" sha1="8f7da0dd662480d7a57dfb593aa83c82d1f0c98c"/>
- </dataarea>
- </part>
- </software>
-
<software name="intacont">
<description>Integers (A Contest) (cleanly cracked)</description>
<year>1983</year>
@@ -31113,32 +14316,6 @@ license:CC0-1.0
</part>
</software>
- <software name="seaiv2">
- <description>Solving Equations and Inequalities (version 2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-07-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="solving equations and inequalities v2 (4am crack).dsk" size="143360" crc="0fb9deac" sha1="3a240343ee2ad54fcfa62b8894b9928818539f0f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="estbe">
- <description>Estimation: Bull's Eye (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2020-07-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="estimation- bull's eye (4am crack).dsk" size="143360" crc="b76acaf6" sha1="befd753d3d74e341b503dd8776cb1cfd1dcc3c38"/>
- </dataarea>
- </part>
- </software>
-
<software name="tbmaths1">
<description>Testing Basic Math Skills 1 (cleanly cracked)</description>
<year>1983</year>
@@ -31165,19 +14342,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mlapdll">
- <description>M-ss-ng L-nks: Al Pie De La Letra (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-07-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="m-ss-ng l-nks- al pie de la letra (4am crack).dsk" size="143360" crc="890c379e" sha1="09e341e5f183e85c9c050d8dafef35513bbe1e30"/>
- </dataarea>
- </part>
- </software>
-
<software name="spncont">
<description>The Spanish Contest (cleanly cracked)</description>
<year>1983</year>
@@ -31211,39 +14375,6 @@ license:CC0-1.0
</part>
</software>
- <software name="qaverg">
- <description>Averages (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Queue</publisher>
- <info name="release" value="2020-07-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="averages (4am crack).dsk" size="143360" crc="1cac50dc" sha1="5bf1029c9880c24a69cc568a91761e2f43191255"/>
- </dataarea>
- </part>
- </software>
-
- <software name="np0886">
- <description>Nouns/Pronouns (08.31.86 Version) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2020-07-14"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns v08.31.86 (4am crack) disk 1.dsk" size="143360" crc="2daf72ad" sha1="eaf0972a9efe036414325b1f95eaf6c26860c6d4"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns v08.31.86 (4am crack) disk 2.dsk" size="143360" crc="89f49f07" sha1="48066e68e141c94c1b6fa6debfd94fe5c6d89de5"/>
- </dataarea>
- </part>
- </software>
-
<software name="addwn117">
<description>Addition: Whole Numbers Steps 1-17 (cleanly cracked)</description>
<year>1984</year>
@@ -31283,58 +14414,6 @@ license:CC0-1.0
</part>
</software>
- <software name="laguillo">
- <description>La Guillotine (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2020-07-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="la guillotine (4am crack).dsk" size="143360" crc="2b389d84" sha1="a11eb5ccaf44997776faf8404b412b87bf9856d8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="corrtoro">
- <description>La Corrida de Toros (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2020-07-24"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="la corrida de toros (4am crack).dsk" size="143360" crc="3a941200" sha1="c9d98bfcc2878a5fd991ab372627deb929e3d3ef"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mseleml">
- <description>Math Skills: Elementary Level (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2020-08-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math skills- elementary level (4am crack).dsk" size="143360" crc="8959752d" sha1="89d2e59a23636de848f0abca5fe0fe579ae38973"/>
- </dataarea>
- </part>
- </software>
-
- <software name="msjrhigh">
- <description>Math Skills: Junior High Level (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="release" value="2020-08-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math skills- junior high level (4am crack).dsk" size="143360" crc="dadb8d31" sha1="2fb6e5f2aa81885d5193946e44228c46f2964b22"/>
- </dataarea>
- </part>
- </software>
-
<software name="gifpalg">
<description>Graphing is Fun: Pie and Line Graphs (cleanly cracked)</description>
<year>1985</year>
@@ -31475,32 +14554,6 @@ license:CC0-1.0
</part>
</software>
- <software name="epyx3pck">
- <description>Epyx 3-Pack (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2020-08-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="epyx 3-pack (4am crack).dsk" size="143360" crc="a48d559a" sha1="02c425fb01810a847e0567f10b9d5081fce90e68"/>
- </dataarea>
- </part>
- </software>
-
- <software name="trlltlr2">
- <description>Troll's Tale (Revision 2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2020-08-08"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="troll's tale rev. 2 (4am and san inc crack).dsk" size="143360" crc="bef3e3cc" sha1="dc761551f75be849088da5fbdcc795a4e41c9f9c"/>
- </dataarea>
- </part>
- </software>
-
<software name="nytcrswd">
<description>Daily Computer Crosswords from The New York Times (cleanly cracked)</description>
<year>1984</year>
@@ -31514,45 +14567,6 @@ license:CC0-1.0
</part>
</software>
- <software name="uboatcmd">
- <description>U-Boat Command (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2020-08-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="u-boat command (4am crack).dsk" size="143360" crc="c134e816" sha1="cdf9e04801e96e9d5aa7dbd6a785a0e822ec262b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcrocfct">
- <description>MECC-A308 Rocket Factory (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2020-08-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a308 rocket factory v1.0 (4am crack).dsk" size="143360" crc="a791cb46" sha1="56009fa88b3f7839db8ba93c2bb4a9c09a5fc234"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sa2gramr">
- <description>Spanish Achievement II: Grammar (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2020-08-05"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="spanish achievement ii (4am crack).dsk" size="143360" crc="f3859731" sha1="dcc487aebc6bb7abe2edd81a4440207464b54576"/>
- </dataarea>
- </part>
- </software>
-
<software name="slvwrdp1">
<description>Solving Word Problems 1 (cleanly cracked)</description>
<year>1985</year>
@@ -31644,39 +14658,6 @@ license:CC0-1.0
</part>
</software>
- <software name="oppo0187">
- <description>Opposites v01.30.87 (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2020-08-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="opposites v01.30.87 (4am crack) side a.dsk" size="143360" crc="2428e261" sha1="6536827c63ac92e9a95cf35ef0e427a041f54025"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="opposites v01.30.87 (4am crack) side b.dsk" size="143360" crc="5b2f7f91" sha1="f086afa11259ac35379dbde3e3338f98b364402d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mceng115">
- <description>MECC-A746 English Volume 1: Parts of Speech (version 1.5) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2020-08-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a746 english volume 1 - parts of speech v1.5 (4am crack).dsk" size="143360" crc="7d7e319c" sha1="93e2f83c347c4e9a28075f13eb80c19ca3c6abbe"/>
- </dataarea>
- </part>
- </software>
-
<software name="shmthag3">
<description>Scoring Higher: Mathematics A, Grade Level 3 (cleanly cracked)</description>
<year>1987</year>
@@ -31721,19 +14702,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hvrbs2886">
- <description>Verbs 2 (version 08.31.86) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2020-08-13"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verbs 2 v08.31.86 (4am crack).dsk" size="143360" crc="1cadc659" sha1="f8812127ccb518ae406e7df338fadcfb2e591bcf"/>
- </dataarea>
- </part>
- </software>
-
<software name="kavekr2">
<description>Kaves of Karkhan (Revision 2) (cleanly cracked)</description>
<year>1981</year>
@@ -31904,58 +14872,6 @@ license:CC0-1.0
</part>
</software>
- <software name="frac310">
- <description>French Achievement III (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2020-08-12"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="french achievement iii- grammar (4am crack).dsk" size="143360" crc="b4a902c2" sha1="4749364b8debc5819beedaca26797b064c30f495"/>
- </dataarea>
- </part>
- </software>
-
- <software name="bopabet">
- <description>Bop-A-Bet (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2020-08-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bop-a-bet (4am and san inc crack).dsk" size="143360" crc="7ee2295f" sha1="84c269e55a873422715f7a7f12af6d7f462c2b0d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="pwstemp">
- <description>Playing with Science: Temperature (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-08-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="playing with science- temperature (4am crack).dsk" size="143360" crc="694d7f51" sha1="c098c1da499e8635bf0acf0274d5be06322a81ea"/>
- </dataarea>
- </part>
- </software>
-
- <software name="lraddsub">
- <description>Learning to Add and Subtract (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Panda Learning Systems</publisher>
- <info name="release" value="2020-08-30"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="learning to add and subtract (4am crack).dsk" size="143360" crc="9b336a84" sha1="3534dcacdf79690fd0f88286e79e956dab7038c2"/>
- </dataarea>
- </part>
- </software>
-
<software name="negotedg">
<description>The Negotiation Edge (cleanly cracked)</description>
<year>1984</year>
@@ -32030,19 +14946,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gesltnv1">
- <description>Latin Vocabulary I (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="release" value="2020-10-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="latin vocabulary i (4am crack).dsk" size="143360" crc="c959ceac" sha1="dfa58b32c952a05e636216eb95b869f3e6a5d4ae"/>
- </dataarea>
- </part>
- </software>
-
<software name="ootopss">
<description>Oo-Topos (Sentient Software release) (cleanly cracked)</description>
<year>1981</year>
@@ -32056,26 +14959,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sargon3">
- <description>Sargon III (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2020-10-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="sargon iii (hayden) (4am crack) side a - program.dsk" size="143360" crc="73ff040a" sha1="2400bc73ee4f7752f07bc871b5d67bddd84bb781"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Great games"/>
- <dataarea name="flop" size="143360">
- <rom name="sargon iii (hayden) (4am crack) side b - great games.dsk" size="143360" crc="a28d8935" sha1="2a4dca4e13608380d8c13f530dc435558a103cf8"/>
- </dataarea>
- </part>
- </software>
-
<software name="fathom40">
<description>Fathoms 40 (cleanly cracked)</description>
<year>1982</year>
@@ -32089,19 +14972,6 @@ license:CC0-1.0
</part>
</software>
- <software name="canclmbr">
- <description>Canyon Climber (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Datasoft</publisher>
- <info name="release" value="2020-10-17"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="canyon climber (4am crack).dsk" size="143360" crc="9fc4be6c" sha1="bae5f73448c16e70c7936e913ff7d581a1449f1c"/>
- </dataarea>
- </part>
- </software>
-
<software name="bezare">
<description>Bezare (cleanly cracked)</description>
<year>1982</year>
@@ -32135,7 +15005,7 @@ license:CC0-1.0
<!-- Please refer to the following website for more details on the
history of this particular disk:
https://web.archive.org/web/http://gue.cgwmuseum.org/galleries/index.php?pub=5&item=27&id=2&key=0
- -->
+ -->
<info name="release" value="2020-10-31"/>
<part name="flop1" interface="floppy_5_25">
@@ -32145,19 +15015,6 @@ license:CC0-1.0
</part>
</software>
- <software name="coscom">
- <description>Cosmic Combat (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Highlands Computer Services</publisher>
- <info name="release" value="2020-11-01"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cosmic combat (4am crack).dsk" size="143360" crc="aefa46a5" sha1="65fb92082ea477ee1f5288448fcd62dd45f8510e"/>
- </dataarea>
- </part>
- </software>
-
<software name="vortex">
<description>Vortex (cleanly cracked)</description>
<year>1982</year>
@@ -32171,26 +15028,6 @@ license:CC0-1.0
</part>
</software>
- <software name="camptril">
- <description>Campaign Trilogy (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="release" value="2020-11-02"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="campaign trilogy (4am crack) side a.dsk" size="143360" crc="2ac785e6" sha1="c377255bc975d5039739a79adcc87da3a23ff5ae"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="campaign trilogy (4am crack) side b.dsk" size="143360" crc="37137e35" sha1="3cbbfaa18e5ce4786d5ffaf53f58820156ce2276"/>
- </dataarea>
- </part>
- </software>
-
<software name="lionshar">
<description>The Lion's Share (cleanly cracked)</description>
<year>1983</year>
@@ -32211,19 +15048,6 @@ license:CC0-1.0
</part>
</software>
- <software name="stel7sec">
- <description>Stellar 7 (Software Entertainment Company release) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Software Entertainment Company</publisher>
-
- <info name="release" value="2020-11-02"/>
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="stellar 7 (software entertainment company) (4am crack).dsk" size="143360" crc="4068c80b" sha1="0e4ef0b16c1122bc03f8479f6b76112dbf12a721"/>
- </dataarea>
- </part>
- </software>
-
<software name="suprcube">
<description>SuperCube (cleanly cracked)</description>
<year>1980</year>
@@ -32354,87 +15178,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spcwrace">
- <description>Space Waste Race: Storybooks Of The Future (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2020-12-04"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="space waste race- storybooks of the future (4am crack).dsk" size="143360" crc="45acb2d7" sha1="989f333bb3196547749134460010fec5b2551f59"/>
- </dataarea>
- </part>
- </software>
-
- <software name="timcatfr">
- <description>Tim and the Cat and Grog the Frog (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2020-12-31"/>
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 1a.dsk" size="143360" crc="20f92b22" sha1="ff5acd10bfad1e0b3d9c96150c764deb27843226"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 1b.dsk" size="143360" crc="e7424f95" sha1="eea6681584be1f49535f290fabe25f7d7668a0ba"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 2a.dsk" size="143360" crc="f69ad29c" sha1="bf74e1986be0908e378b12daa0ec02adfbf62ad3"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 2b.dsk" size="143360" crc="9af4c87f" sha1="d5895fa59fa11e4bc6042bf79586aa89bc7354f8"/>
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 3a.dsk" size="143360" crc="bc3ed7ba" sha1="07c5366f8522ae268cb5af6ab7adfa7498868865"/>
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 3b.dsk" size="143360" crc="85724e52" sha1="1b04a1fa44a3a6f3404ffc760a787378f65fef03"/>
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 4a.dsk" size="143360" crc="9b976533" sha1="d19f3ae0bc405db88343ccd34f08149a9bafb035"/>
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 4b.dsk" size="143360" crc="9138fb30" sha1="d1a2b0832c1e5a8ec6b7ec1c96a6ed110b9c6084"/>
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 5a.dsk" size="143360" crc="e4cfdc60" sha1="349f56ba7e3ed65715c09ad4278c8580dbad07ba"/>
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tim and the cat and grog the frog (4am crack) disk 5b.dsk" size="143360" crc="7219dd6e" sha1="ad333036506d08b5d2962eed64d6eae3d9ee92d5"/>
- </dataarea>
- </part>
- </software>
-
<software name="pwradspc">
<description>PlayWriter: Adventures in Space (cleanly cracked)</description>
<year>1984</year>
@@ -32488,32 +15231,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mthc1684">
- <description>Math Concepts I (version 06.29.84) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-01-09"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math concepts i v06.29.84 (4am crack).dsk" size="143360" crc="e56e5833" sha1="1264bbe828fc54d4780165dcf99fce72f8ef3975"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mthc2684">
- <description>Math Concepts II (version 06.29.84) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-01-19"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math concepts ii v06.29.84 (4am crack).dsk" size="143360" crc="2e297154" sha1="05d540f5d7482294a446e66011dcf6de1cdcbad7"/>
- </dataarea>
- </part>
- </software>
-
<software name="repprcs">
<description>Reproduction Process (cleanly cracked)</description>
<year>1981</year>
@@ -32586,32 +15303,6 @@ license:CC0-1.0
</part>
</software>
- <software name="pipeline">
- <description>Pipeline (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="release" value="2021-02-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pipeline (4am crack).dsk" size="143360" crc="e50c7c1c" sha1="47d65b3724944926b9762430693ff6b6c8b937d8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="frogrmsp">
- <description>Frogger (Main Street Publishing re-release) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Main Street Publishing</publisher>
- <info name="release" value="2021-02-10"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="frogger (main street publishing) (4am crack).dsk" size="143360" crc="091a2a9b" sha1="9c3cc01b39f75fe2aca11f0500e8f732ef8e470f"/>
- </dataarea>
- </part>
- </software>
-
<software name="strshc11">
<description>Starship Commander (version 1.1) (cleanly cracked)</description>
<year>1981</year>
@@ -32625,2142 +15316,16 @@ license:CC0-1.0
</part>
</software>
- <software name="lfstfrog">
- <description>Life Story Frog (cleanly cracked)</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="life story frog (4am crack).dsk" size="143360" crc="e107f2f8" sha1="f15828fe236a02b0ce18346e2c7c041010f1fb4f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsmokng">
- <description>MECC-A103 Smoking: It's Up To You (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a103 smoking- it's up to you v1.0 (4am crack).dsk" size="143360" crc="4057a91b" sha1="cd6c091e4e776aca98178d1f2cdff712e60b1550"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpayrol">
- <description>MECC-A104 Payroll System: A Business Simulation (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a104 payroll system- a business simulation v1.2 (4am crack).dsk" size="143360" crc="d212f43f" sha1="93087105dfe4b4e9c62b2ccf88de205bc663c454"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwhsa10">
- <description>MECC-A106 Word Herd: Sound-Alikes (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a106 word herd- sound-alikes v1.0 (4am crack).dsk" size="143360" crc="5ef8fd83" sha1="fe4d68431bafb5e2c94086de575e0775d0c630cb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcdcks11">
- <description>MECC-A107 Ducks (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a107 ducks v1.1 (4am crack).dsk" size="143360" crc="e6a1db28" sha1="f03efeb3d7bf262c7fc6b59910c507293be973d5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsort11">
- <description>MECC-A110 Exploring Sorting Routines (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a110 exploring sorting routines v1.1 (4am crack).dsk" size="143360" crc="4f531c1c" sha1="9c4f8ddb2e345d822f0b7bc588cf8240f6817279"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpets10">
- <description>MECC-A111 Pets, Ltd. (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-22"/>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a111 pets, ltd. v1.0 (4am crack).dsk" size="143360" crc="6e15b0c4" sha1="78881bc772f48ac282ec732e8d1a20d1bd20d412"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mckeyb10">
- <description>MECC-A130 MECC Keyboarding Primer (version 1.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Keyboarding Primer" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Student program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a130 mecc keyboarding primer v1.0 (4am crack) side a - student program.dsk" size="143360" crc="7bbe8cfa" sha1="4649e91f9fa2f27a19a2feda256781458f4b62a9"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Teacher utilities disk"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a130 mecc keyboarding primer v1.0 (4am crack) side b - teacher utilities.dsk" size="143360" crc="3a65c5f6" sha1="e4abeb8d9164380b6192e00a303abdd9cde0ff49"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrtr11">
- <description>MECC-A132 MECC Writer (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Writer" is a 1985 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a132 mecc writer v1.1 (4am crack).dsk" size="143360" crc="28017f79" sha1="0180842ef43818de7164eb5f661f7aa5859b3c83"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrtr12">
- <description>MECC-A132 MECC Writer (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Writer" is a 1985 educational program developed and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a132 mecc writer v1.2 (4am crack).dsk" size="143360" crc="41eeb966" sha1="6b6cd31dbc640781691f6b1e1e886f9c6e54394c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrst12">
- <description>MECC-A133 MECC Writer (version 1.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Write Start" is a 1985 educational program developed and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a133 mecc write start v1.2 (4am crack).dsk" size="143360" crc="4c9f233d" sha1="a4773b48762922b92c92c9e90007b865d4296e93"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcspl10">
- <description>MECC-A134 MECC Speller (version 1.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Speller" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a134 mecc speller v1.0 (4am crack) side a - program.dsk" size="143360" crc="c8f08b29" sha1="5f6a776ed6ec12cc025b886c7f036807d841aea4"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Dictionary"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a134 mecc speller v1.0 (4am crack) side b - dictionary.dsk" size="143360" crc="fbdc252e" sha1="df2f44ba88fcf848e7a4ff98398d7707f97b39ac"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcedtr10">
- <description>MECC-A135 MECC Editor (version 1.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Editor" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a135 mecc editor v1.0 (4am crack).dsk" size="143360" crc="74c0c894" sha1="2a01af093ffff94e1c413ad86538704b61864ba2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrpr10">
- <description>MECC-A136 MECC Graphing Primer (version 1.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Graphing Primer" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a136 mecc graphing primer v1.0 (4am crack).dsk" size="143360" crc="cbd0f138" sha1="4ff15fee49110d574f44122007bf3ef100ef01f7"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwdwz10">
- <description>MECC-A112 Word Wizards (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Word Wizards" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a112 word wizards v.1.0 (4am crack).dsk" size="143360" crc="02e3f328" sha1="4d1904f2711439e76b838fbc4657743742936258"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwdwz12">
- <description>MECC-A112 Word Wizards (version 1.2) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Word Wizards" is a 1984 educational program developed and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a112 word wizards v1.2 (4am crack).dsk" size="143360" crc="f3ad8aa1" sha1="0e6ac325614ed5f8b42eeac49c68b9ee985cd5c6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwopn10">
- <description>MECC-A114 Writing an Opinion Paper (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Writing an Opinion Paper" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a114 writing an opinion paper v1.0 (4am crack).dsk" size="143360" crc="25b83423" sha1="5a2e3c54034e3ac807c8ee35d4ea05cb5420643e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwdwz13">
- <description>MECC-A112 Word Wizards (version 1.3) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Word Wizards" is a 1984 educational program developed and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a112 word wizards v1.3 (4am crack).dsk" size="143360" crc="43f0413f" sha1="5357ba86600e5c8058534fcfb3ce26c8dc9975ed"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcrow11">
- <description>MECC-A115 Right of Way (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Right of Way" is a 1984 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a115 right of way v1.1 (4am crack).dsk" size="143360" crc="e64255e7" sha1="e0a1ebfb396d9f9a5f99177509d9a6fcf46bc0a6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpzps11">
- <description>MECC-A116 Puzzles and Posters (version 1.1) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Puzzles and Posters" is a 1984 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a116 puzzles and posters v1.1 (4am crack).dsk" size="143360" crc="d9721f88" sha1="d4fea3b907a53896befb53787c02e728470e62f6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpzps13">
- <description>MECC-A116 Puzzles and Posters (version 1.3) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Puzzles and Posters" is a 1984 educational program developed and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a116 puzzles and posters v1.3 (4am crack).dsk" size="143360" crc="d479a5c6" sha1="a5e6034ce85ecb300dc953a8fb176eaf83733b58"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpzps16">
- <description>MECC-A116 Puzzles and Posters (version 1.6) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Puzzles and Posters" is a 1984 educational program developed and distributed by MECC. This is version 1.6.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a116 puzzles and posters v1.6 (4am crack).dsk" size="143360" crc="e6cf894b" sha1="603850fd85b0a828d373f3a46e4a0629fc5da5cf"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmspl10">
- <description>MECC-A119 Master Spell (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Master Spell" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a119 master spell v1.0 (4am crack).dsk" size="143360" crc="c243091d" sha1="e5dde217fcd983ac1a828d929bd0887a05ed5ae1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrph11">
- <description>MECC-A137 MECC Graph (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"MECC Graph" is a 1985 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a137 mecc graph v1.1 (4am crack).dsk" size="143360" crc="f173770c" sha1="faa4cda7a04e4054c11dd4f17a1f12028cc904a9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmspl13">
- <description>MECC-A119 Master Spell (version 1.3) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Master Spell" is a 1984 educational program developed and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a119 master spell v1.3 (4am crack).dsk" size="143360" crc="896a59e6" sha1="a861bd31f676ad312e7a8af7b1af6c96dcb80f1d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwhla10">
- <description>MECC-A120 Word Herd: Look-Alikes (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Word Herd: Look-Alikes" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a120 word herd- look-alikes v1.0 (4am crack).dsk" size="143360" crc="043afc42" sha1="d7164db876e6917b680fb235692241194162616c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcjmc10">
- <description>MECC-A121 Jeux Mathematiques Classiques (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Jeux Mathematiques Classiques" (Classic Math Games) is a 1984 French educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a121 jeux mathematiques classiques v1.0 (4am crack).dsk" size="143360" crc="b5dc1790" sha1="9d9cd5c59ab4118ae95d222dc59f5967d73a3eea"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcprnm10">
- <description>MECC-A123 Prime Numbers (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Prime Numbers" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a123 prime numbers v1.0 (4am crack).dsk" size="143360" crc="f0ceda44" sha1="b6a650ab7b8e2719df6b26dcde8f4d4af3827a09"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcestm10">
- <description>MECC-A124 Estimation (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-24"/>
- <!--"Estimation" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a124 estimation v1.0 (4am crack).dsk" size="143360" crc="c5bfc791" sha1="dbcb239e725ce2daf739a69cda5582a0a26c5b3f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcstdg15">
- <description>MECC-A126 Study Guide (version 1.5) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"Study Guide" is a 1984 educational program developed and distributed by MECC. This is version 1.5.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a126 study guide v1.5 (4am crack) disk 1 - program.dsk" size="143360" crc="ce0f7fd0" sha1="f225f519109453cbfba80e4bd605b6ff5d3acc15"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data master"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a126 study guide v1.5 (4am crack) disk 2 - data master.dsk" size="143360" crc="4bc0b40e" sha1="b0158d83f12cd5266e18e1ff367449a063c43141"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsalt10">
- <description>MECC-A127 Salt and You (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"Salt and You" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a127 salt and you v1.0 (4am crack).dsk" size="143360" crc="1194d56a" sha1="5323eed0ba08cf9cd002d83713c8e8c85764190d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcdscl10">
- <description>MECC-A128 Discovery Lab (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"Discovery Lab" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a128 discovery lab v1.0 (4am crack).dsk" size="143360" crc="f9478038" sha1="a72c97834e8e978de439702551c7767c5065234c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcdthd10">
- <description>MECC-A129 Data Handler (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-02-25"/>
- <!--"Data Handler" is a 1983 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a129 data handler v1.0 (4am crack).dsk" size="143360" crc="1b9af318" sha1="1dc867f65473b316722abd9d5fdefd61b0f07cbd"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsgnt10">
- <description>MECC-A343 Science Giants (version 1.0) (cleanly cracked)</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Ray Kush, John A. Persoon, and David L. Wood"/>
- <!--"Science Giants" is a 1994 educational program developed by Ray Kush, John A. Persoon, and David L. Wood, and distributed by MECC. This is version 1.0. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a343 science giants v1.0 (4am crack).dsk" size="143360" crc="5b7cffc2" sha1="ea3e14ffcf27b451957032a98873e2bb0f52c66f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgww10">
- <description>MECC-A351 Get Well, Woolly! (version 1.0) (cleanly cracked)</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Sheila Kelly, Pat Korn, Claudio Valenzeula, and Ju-Chang Wang"/>
- <!--"Get Well, Woolly!" is a 1994 educational program developed by Sheila Kelly, Pat Korn, Claudio Valenzeula, and Ju-Chang Wang, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a351 get well, woolly v1.0 (4am crack).dsk" size="143360" crc="f0caed04" sha1="7ddb645d13c7046d548700a188fb35687347e2b0"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmyob10">
- <description>MECC-A211 Mystery Objects (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Greg Holey, Liz Husebye, Charolyn Kapplinger, John Krenz, Nan Leekley, Sherry Luedloff, Kevin Neff, and Diane Portner"/>
- <!--"Mystery Objects" is a 1988 educational program developed by Greg Holey, Liz Husebye, Charolyn Kapplinger, John Krenz, Nan Leekley, Sherry Luedloff, Kevin Neff, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a211 mystery objects v1.0 (4am crack).dsk" size="143360" crc="0900c191" sha1="731317e36d2dfdd498eb2bbc90da9bf6baac5cfc"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmyma10">
- <description>MECC-A212 Mystery Matter (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Greg Holey, Nan Leekley, Sherry Luedloff, John Persoon, Jane Peterson, Diane Portner, and Jim Thompson"/>
- <!--"Mystery Matter" is a 1988 educational program developed by Greg Holey, Nan Leekley, Sherry Luedloff, John Persoon, Jane Peterson, Diane Portner, and Jim Thompson, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a212 mystery matter v1.0 (4am crack).dsk" size="143360" crc="e9572a92" sha1="3ece54f857fa1d48d962a73159e0816774d2f968"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmcv10">
- <description>MECC-A213 Miner's Cave (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Dean Brown, Bob Eggers, Matt Osber, Susan Christie Thomas, Peter Dublin, Gary Fujiwara, Mildred Feloney, and Herbert Fox"/>
- <!--"Miner's Cave" is a 1988 educational program developed by Dean Brown, Bob Eggers, Matt Osber, Susan Christie Thomas, Peter Dublin, Gary Fujiwara, Mildred Feloney, and Herbert Fox, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a213 miner's cave v1.0 (4am crack).dsk" size="143360" crc="e070b0e6" sha1="94765d4d7353fc2f7484ec3c4ee7cbbcc45fe529"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwcrl10">
- <description>MECC-A214 Wood Car Rally (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Gene Breault, Greg Holey, Kevin Neff, John Persoon, and Diane Portner"/>
- <!--"Wood Car Rally" is a 1988 educational program developed by Gene Breault, Greg Holey, Kevin Neff, John Persoon, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a214 wood car rally v1.0 (4am crack).dsk" size="143360" crc="1114aaac" sha1="c596513cbb09cf0624251220c5d8b294f1231913"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwcrl11">
- <description>MECC-A214 Wood Car Rally (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Gene Breault, Greg Holey, Kevin Neff, John Persoon, and Diane Portner"/>
- <!--"Wood Car Rally" is a 1988 educational program developed by Gene Breault, Greg Holey, Kevin Neff, John Persoon, and Diane Portner, and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a214 wood car rally v1.1 (4am crack).dsk" size="143360" crc="2ee9b683" sha1="e0a01525ec3eb20d6c3cb1403b916f6cbd637a35"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mclngr10">
- <description>MECC-A215 Lunar Greenhouse (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Beth Bell, Kevin Neff, John Persoon, and Diane Portner"/>
- <!--"Lunar Greenhouse" is a 1989 educational program developed by Beth Bell, Kevin Neff, John Persoon, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a215 lunar greenhouse v1.0 (4am crack).dsk" size="143360" crc="52740424" sha1="e64a3a9c10493dfb69591fbf36c0cc07a13f3192"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcweed10">
- <description>MECC-A217 Weeds to Trees (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="R. Philip Bouchard, Gene Breault, Greg Holey, Kevin Neff, and Brian Nesse"/>
- <!--"Weeds to Trees" is a 1989 educational program developed by R. Philip Bouchard, Gene Breault, Greg Holey, Kevin Neff, and Brian Nesse, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a217 weeds to trees v1.0 (4am crack).dsk" size="143360" crc="2a637486" sha1="c3c91d20a4eaabc78974ab78378df5fd1a1b84ed"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcinvb10">
- <description>MECC-A218 Invisible Bugs (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Gene Breault, Scott Jensen, Charolyn Kapplinger, John Persoon, and Jane Peterson"/>
- <!--"Invisible Bugs" is a 1989 educational program developed by Gene Breault, Scott Jensen, Charolyn Kapplinger, John Persoon, and Jane Peterson, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a218 invisible bugs v1.0 (4am crack).dsk" size="143360" crc="ff5f12ff" sha1="10a41babe1b099e9f14a6f6b1e53ad404e31c08f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mc5sf">
- <description>MECC-A219 Five-Star Forecast (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Kevin Neff, Diane Portner, Elizabeth Wendland, and John P. Wlazlo"/>
- <!--"Five-Star Forecast" is a 1990 educational program developed by Kevin Neff, Diane Portner, Elizabeth Wendland, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a219 five-star forecast v1.0 (4am crack).dsk" size="143360" crc="98167ff6" sha1="24fa99949a0c4d5e953c8aa8323eb9faad5ba914"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcfosh10">
- <description>MECC-A220 Fossil Hunter (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="R. Philip Bouchard, Gene Breault, and Diane Portner"/>
- <!--"Fossil Hunter" is a 1990 educational program developed by R. Philip Bouchard, Gene Breault, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a220 fossil hunter v1.0 (4am crack).dsk" size="143360" crc="0ebebf1e" sha1="d0b462e0a9ee741315c128448e3df5a5c400a077"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmmin10">
- <description>MECC-A221 Murphy's Minerals (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Beth Bell, Gene Breault, John Persoon, Larry Phenow, and Diane Portner"/>
- <!--"Murphy's Minerals" is a 1990 educational program developed by Beth Bell, Gene Breault, John Persoon, Larry Phenow, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a221 murphy's minerals v1.0 (4am crack).dsk" size="143360" crc="66dd7299" sha1="c223aa0f93c28e6c969b736ef1796ba949c753bd"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsuns10">
- <description>MECC-A222 Sun and Seasons (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-06"/>
- <info name="programmer" value="Beth Bell, Gene Breault, Kevin Neff, Liz Wendland"/>
- <!--"Sun and Seasons" is a 1990 educational program developed by Beth Bell, Gene Breault, Kevin Neff, Liz Wendland, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a222 sun and seasons v1.0 (4am crack).dsk" size="143360" crc="45c002ef" sha1="21c065a7cd048bf26a7355128e14c316d0b67289"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcinsv10">
- <description>MECC-A224 Instant Survey (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Mark Dostal, Cathy Grittner, Greg Holey, Pat Korn, Sherry Luedloff, Jean Sharp, Roger Shimada, Craig Solomonson, Jim Thompson, Debra Vonk, and Brian Walker"/>
- <!--"Instant Survey" is a 1989 educational program developed by Mark Dostal, Cathy Grittner, Greg Holey, Pat Korn, Sherry Luedloff, Jean Sharp, Roger Shimada, Craig Solomonson, Jim Thompson, Debra Vonk, and Brian Walker, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a224 instant survey v1.0 (4am crack) side a - program.dsk" size="143360" crc="ee40cabd" sha1="6fc93354199368f14931e2f9aa5ac6d8b4be9b49"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Sampler disk"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a224 instant survey v1.0 (4am crack) side b - sampler.dsk" size="143360" crc="28c36de8" sha1="e7f0102f95db0c911c0e717a17f973e39756e092"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctmnl10">
- <description>MECC-A225 Time Navigator Leaps Back (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Beth Bell, Vincent Erickson, John J. Krenz, Nan Leekley, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer"/>
- <!--"Time Navigator Leaps Back" is a 1990 educational program developed by Beth Bell, Vincent Erickson, John J. Krenz, Nan Leekley, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a225 time navigator leaps back v1.0 (4am crack) side a.dsk" size="143360" crc="242dc594" sha1="59ad4f92ff06798faa86ffcbe2cece6eee86aa12"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a225 time navigator leaps back v1.0 (4am crack) side b.dsk" size="143360" crc="1f30e5de" sha1="9665ba1b767079283fd312db1f4d2f13637ddb52"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpatt10">
- <description>MECC-A227 Patterns (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Miryam Acevedo-Bouchard, Rich Childers, Susan Gabrys, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Larry Phenow"/>
- <!--"Patterns" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Rich Childers, Susan Gabrys, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Larry Phenow, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a227 patterns v1.0 (4am crack).dsk" size="143360" crc="f0b922ab" sha1="7cfcc850aca0a29384ef1eacee24e8e5eaf7165a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcoutl10">
- <description>MECC-A228 MECC Outliner (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Miryam Acevedo-Bouchard, John J. Krenz, Mark Paquette, Larry Phenow, Roger Shimada, Steve Taffee, and Paul Wieser"/>
- <!--"MECC Outliner" is a 1988 educational program developed by Miryam Acevedo-Bouchard, John J. Krenz, Mark Paquette, Larry Phenow, Roger Shimada, Steve Taffee, and Paul Wieser, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a228 mecc outliner v1.0 (4am crack).dsk" size="143360" crc="0ec517a3" sha1="aea3878c39dc0f9350aa18aebc818b4d33a0ca57"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpatt12">
- <description>MECC-A227 Patterns (version 1.2) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Miryam Acevedo-Bouchard, Rich Childers, Susan Gabrys, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Larry Phenow"/>
- <!--"Patterns" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Rich Childers, Susan Gabrys, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Larry Phenow, and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a227 patterns v1.2 (4am crack).dsk" size="143360" crc="75df4a84" sha1="67219bd6257e132342915c34dc72221b882d659d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgasl10">
- <description>MECC-A229 Exploring Gas Laws (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Gene Breault, Hassan Kaganda, John J. Krenz, Patricia Korn, Kevin Neff, and Diane Portner"/>
- <!--"Exploring Gas Laws" is a 1989 educational program developed by Gene Breault, Hassan Kaganda, John J. Krenz, Patricia Korn, Kevin Neff, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a229 exploring gas laws v1.0 (4am crack).dsk" size="143360" crc="e5486fab" sha1="a8b421cfe14c1aabe1f3530ba43e24d3019aa7c4"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplw10">
- <description>MECC-A230 Spelling Workout (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Miryam Acevedo-Bouchard, Vince Erickson, Charlyn Kapplinger, Sherry Luedloff, Brian Nesse, Diane Portner, Roger Shimada, Caren Stelson, and Paul Wieser"/>
- <!--"Spelling Workout" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Vince Erickson, Charlyn Kapplinger, Sherry Luedloff, Brian Nesse, Diane Portner, Roger Shimada, Caren Stelson, and Paul Wieser, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230 spelling workout v1.0 (4am crack).dsk" size="143360" crc="a5294dd1" sha1="c4f73965a3170306e05cd78e39e349ba96ebf75a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplw11">
- <description>MECC-A230 Spelling Workout (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Miryam Acevedo-Bouchard, Vince Erickson, Charlyn Kapplinger, Sherry Luedloff, Brian Nesse, Diane Portner, Roger Shimada, Caren Stelson, and Paul Wieser"/>
- <!--"Spelling Workout" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Vince Erickson, Charlyn Kapplinger, Sherry Luedloff, Brian Nesse, Diane Portner, Roger Shimada, Caren Stelson, and Paul Wieser, and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230 spelling workout v1.1 (4am crack).dsk" size="143360" crc="ac924999" sha1="176cb9c863bbdb074a5a971ed35b29b93f9ec652"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsple10">
- <description>MECC-A230B Spelling List Editor (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker"/>
- <!--"Spelling List Editor" is a 1988 educational program developed by Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230b spelling list editor v1.0 (4am crack).dsk" size="143360" crc="8bb00961" sha1="67976bbe84eee43715297e1ce202b4a292376802"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcspl11">
- <description>MECC-A230B Spelling List Editor (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker"/>
- <!--"Spelling List Editor" is a 1988 educational program developed by Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker, and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230b spelling list editor v1.1 (4am crack).dsk" size="143360" crc="a6b3e91d" sha1="1b3afcfb967957358c4752c8a7bd5a22750d0000"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcspl12">
- <description>MECC-A230B Spelling List Editor (version 1.2) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker"/>
- <!--"Spelling List Editor" is a 1988 educational program developed by Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker, and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230b spelling list editor v1.2 (4am crack).dsk" size="143360" crc="1ea13b8d" sha1="c8cbc13bfc9ed8d1411d237b3f1740a42dd05d38"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcspl14">
- <description>MECC-A230B Spelling List Editor (version 1.4) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker"/>
- <!--"Spelling List Editor" is a 1988 educational program developed by Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker, and distributed by MECC. This is version 1.4.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230b spelling list editor v1.4 (4am crack).dsk" size="143360" crc="4acbc3d2" sha1="72be7248e61e5d6e0d0a1bc32ba393c7001647e4"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcspl13">
- <description>MECC-A230B Spelling List Editor (version 1.3) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker"/>
- <!--"Spelling List Editor" is a 1988 educational program developed by Susan Gabrys, Larry Phenow, Michael Stein, Caren Stelson, and Paul Wenker, and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a230b spelling list editor v1.3 (4am crack).dsk" size="143360" crc="04cf01b0" sha1="5153ae52883ad87d2f6b93c11f7ba1fcff1339a2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplv10">
- <description>MECC-A231 Spellevator (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker"/>
- <!--"Spellevator" is a 1988 educational program developed by Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a231 spellevator v1.0 (4am crack).dsk" size="143360" crc="b42fea28" sha1="e957898dca42fb5bde7239813c2ef6c9211c4666"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplv12">
- <description>MECC-A231 Spellevator (version 1.2) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker"/>
- <!--"Spellevator" is a 1988 educational program developed by Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker, and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a231 spellevator v1.2 (4am crack).dsk" size="143360" crc="5f313951" sha1="f77d9ed6b668547cbb0d34b127f4ed780942326a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplv13">
- <description>MECC-A231 Spellevator (version 1.3) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker"/>
- <!--"Spellevator" is a 1988 educational program developed by Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker, and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a231 spellevator v1.3 (4am crack).dsk" size="143360" crc="01aba934" sha1="8ff0e51180b3ed93fbff517c638c442b2bf6ed76"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplp10">
- <description>MECC-A232 Spelling Press (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Roger Shimada, Caren Stelson, and Brian Walker"/>
- <!--"Spelling Press" is a 1988 educational program developed by Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Roger Shimada, Caren Stelson, and Brian Walker, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a232 spelling press v1.0 (4am crack).dsk" size="143360" crc="95bdc5f3" sha1="8655d3f4e9889b0c0c7261b9cb22d5f847a0a772"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mclblm10">
- <description>MECC-A241 LabelMaker (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <!--"LabelMaker" is a 1988 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a241 labelmaker 1.0 (4am crack).dsk" size="143360" crc="38b81413" sha1="fed27a649393a872e31ec824dfebf5f8be9132f5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctoo12">
- <description>MECC-A242 Teach Option Organizer (version 1.2) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <info name="programmer" value="Kevin Neff, Larry Phenow, Diane Portner, Jim Thompson, Brian Walker, and Nelson Whyatt"/>
- <!--"Teacher Option Organizer" is a 1988 educational program developed by Kevin Neff, Larry Phenow, Diane Portner, Jim Thompson, Brian Walker, and Nelson Whyatt, and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a242 teacher option organizer v1.2 (4am crack).dsk" size="143360" crc="ff67fab9" sha1="26138a626fd6e35e64f16e48a263e46c94c44f80"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcdqmena">
- <description>MECC-A244 MECC Dataquest: The Middle East and North Africa (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-12"/>
- <!--"MECC Dataquest: The Middle East and North Africa" is a 1989 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a244 mecc dataquest- the middle east and north africa v1.0 (4am crack).dsk" size="143360" crc="5f17c471" sha1="58fa47eb5239c1836a076992509592bd9bcb11b8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcins10">
- <description>MECC-A245 Instant Survey (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Mark Dostal, Cathy Grittner, Greg Holey, Pat Korn, Sherry Luedloff, Jean Sharp, Roger Shimada, Craig Solomonson, Jim Thompson, Debra Vonk, and Brian Walker"/>
- <!--"Instant Survey" is a 1989 educational program developed by Mark Dostal, Cathy Grittner, Greg Holey, Pat Korn, Sherry Luedloff, Jean Sharp, Roger Shimada, Craig Solomonson, Jim Thompson, Debra Vonk, and Brian Walker, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a245 instant survey v1.0 (4am crack).dsk" size="143360" crc="ee40cabd" sha1="6fc93354199368f14931e2f9aa5ac6d8b4be9b49"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmswk10">
- <description>MECC-A246 Measure Works (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Elizabeth Bell, Vince Erickson, Susan Gabrys, Nan Leekley, Sherry Luedloff, and Diane Portner"/>
- <!--"Measure Works" is a 1989 educational program developed by Elizabeth Bell, Vince Erickson, Susan Gabrys, Nan Leekley, Sherry Luedloff, and Diane Portner, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a246 measure works v1.0 (4am crack).dsk" size="143360" crc="ceca4bb0" sha1="8a1d109b4ede5cf92395a4a930fac6106ec5deee"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctmnv10">
- <description>MECC-A247 Time Navigator (version 1.0) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Beth Bell, Vincent Erickson, Charolyn Kapplinger, John J. Krenz, Nan Leekley, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer"/>
- <!--"Time Navigator" is a 1989 educational program developed by Beth Bell, Vincent Erickson, Charolyn Kapplinger, John J. Krenz, Nan Leekley, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a247 time navigator v1.0 (4am crack) side a.dsk" size="143360" crc="02ac6cbb" sha1="0a7eb7a62cf639c2eab9e839b1a8623c2cc5a6c1"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a247 time navigator v1.0 (4am crack) side b.dsk" size="143360" crc="23ac1066" sha1="4ea6eaa0b8a46abab2084fc3aee9a3586cf5e08d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mdqnam10">
- <description>MECC-A250 MECC Dataquest: North American Mammals (version 1.0) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <!--"MECC Dataquest: North American Mammals" is a 1988 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a250 mecc dataquest- north american mammals v1.0 (4am crack).dsk" size="143360" crc="eb7e12f6" sha1="79d7609a113617d002a7d425fa52f7debca24d5f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mdqnam11">
- <description>MECC-A250 MECC Dataquest: North American Mammals (version 1.1) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <!--"MECC Dataquest: North American Mammals" is a 1988 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a250 mecc dataquest- north american mammals v1.1 (4am crack).dsk" size="143360" crc="d04dc175" sha1="870539d1bedc4b04d57269ff92c692447f92fc82"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mdqaao10">
- <description>MECC-A254 MECC Dataquest: Asia and Oceania (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <!--"MECC Dataquest: Asia and Oceania" is a 1990 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-254 mecc dataquest- asia and oceania v1.0 (4am crack).dsk" size="143360" crc="91e770b9" sha1="fd23956a1c67a2def4b3c0ceb44b8f3dd4a1bf41"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpicc10">
- <description>MECC-A255 Picture Chompers (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Sheila Dols, Scott Jensen, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, Liz Wendland, John Wlazlo, and Stephen Zehm"/>
- <!--"Picture Chompers" is a 1990 educational program developed by Sheila Dols, Scott Jensen, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, Liz Wendland, John Wlazlo, and Stephen Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a255 picture chompers v1.0 (4am crack).dsk" size="143360" crc="2155af5c" sha1="90bf18c1e924f2c6e0c833d6b999771797c1e26b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpswn10">
- <description>MECC-A257 Problem Solving with Nim (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Charolyn Kapplinger, Dick Sisco, Craig Solomonson, and Elizabeth Wendland"/>
- <!--"Problem Solving with Nim" is a 1991 educational program developed by Charolyn Kapplinger, Dick Sisco, Craig Solomonson, and Elizabeth Wendland, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a257 problem solving with nim v1.0 (4am crack).dsk" size="143360" crc="f6827911" sha1="49713c1b031d32e83c9434ae6a9daacd3535ebfb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcqes110">
- <description>MECC-A258 Estimation: Quick Solve I (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Beth Bell, Vincent Erickson, Shari Glenn, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Elizabeth Wendland"/>
- <!--"Estimation: Quick Solve I" is a 1990 educational program developed by Beth Bell, Vincent Erickson, Shari Glenn, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Elizabeth Wendland, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a258 estimation- quick solve i v1.0 (4am crack).dsk" size="143360" crc="29bc44a0" sha1="d782dedc1747830085865b7c15db87da632b31d6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mceqs210">
- <description>MECC-A259 Estimation: Quick Solve II (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-13"/>
- <info name="programmer" value="Beth Bell, Vincent Erickson, Shari Glenn, Charolyn Kapplinger, Sherry Luedloff, and Elizabeth Wendland"/>
- <!--"Estimation: Quick Solve II" is a 1990 educational program developed by Beth Bell, Vincent Erickson, Shari Glenn, Charolyn Kapplinger, Sherry Luedloff, and Elizabeth Wendland, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a259 estimation- quick solve ii v1.0 (4am crack).dsk" size="143360" crc="546fba86" sha1="1172a6de615a87776859e18cee53fddb1f4aca37"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcprlb10">
- <description>MECC-A262 Probability Lab (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Brian Nesse, Jane Peterson, and Craig Solomonson"/>
- <!--"Probability Lab" is a 1990 educational program developed by Brian Nesse, Jane Peterson, and Craig Solomonson, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a262 probability lab v1.0 (4am crack).dsk" size="143360" crc="b1e5ce58" sha1="55d16a85d170588fbcbd5ec46c41021bfd495ad8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcesas10">
- <description>MECC-A263 Exploring Sequences and Series (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Beth Daniels, Vince Erickson, Jane Peterson, Craig Solomonson, Elizabeth Wendland, and John P. Wlazlo"/>
- <!--"Exploring Sequences and Series" is a 1991 educational program developed by Beth Daniels, Vince Erickson, Jane Peterson, Craig Solomonson, Elizabeth Wendland, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a263 exploring sequences and series v1.0 (4am crack).dsk" size="143360" crc="b2db124a" sha1="6f3b4890649830ad3620145f5c36fd68a19c611c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgts10">
- <description>MECC-A271 Grammar Toy Shop (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Sheila Dols, Vincent Erickson, Charolyn Kapplinger, Patricia Korn, Sherry Luedloff, and Stephen Zehm"/>
- <!--"Grammar Toy Shop" is a 1990 educational program developed by Sheila Dols, Vincent Erickson, Charolyn Kapplinger, Patricia Korn, Sherry Luedloff, and Stephen Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a271 grammar toy shop v1.0 (4am crack).dsk" size="143360" crc="c8084946" sha1="0b09e1388aa0220e7297b0373b8628abe2a3fb1a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrmn10">
- <description>MECC-A272 Grammar Monsters (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Sheila Dols, Charolyn Kapplinger, John R. Ojanen, Elizabeth T. Wendland, and Stephen Zehm"/>
- <!--"Grammar Monsters" is a 1991 educational program developed by Sheila Dols, Charolyn Kapplinger, John R. Ojanen, Elizabeth T. Wendland, and Stephen Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a272 grammar monsters v1.0 (4am crack).dsk" size="143360" crc="bbc37ea6" sha1="efc9354e8331931d48a27477c9d32b3e0de8154b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrgz10">
- <description>MECC-A273 Grammar Gazette (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Beth Bell, Sheila Dols, Dee Dee Roedel, and Elizabeth T. Wendland"/>
- <!--"Grammar Gazette" is a 1991 educational program developed by Beth Bell, Sheila Dols, Dee Dee Roedel, and Elizabeth T. Wendland, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a273 grammar gazette v1.0 (4am crack).dsk" size="143360" crc="73f2d134" sha1="afa56b1a030692e5e71f4b79c5dc782f0be75436"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mclcel10">
- <description>MECC-A278 The Living Cell (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Gene Breault, Ed Gratz, Mark Hanson, and Kevin Neff"/>
- <!--"The Living Cell" is a 1991 educational program developed by Gene Breault, Ed Gratz, Mark Hanson, and Kevin Neff, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a278 the living cell v1.0 (4am crack).dsk" size="143360" crc="e761efd8" sha1="259374d9337a5b5c67d92e30829f4e955b6356a7"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mclcsh">
- <description>MECC-A279 Lewis and Clark Stayed Home (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="R. Philip Bouchard, Charolyn Kapplinger, Craig Solomonson, John A. Persoon, and Rich Bergeron"/>
- <!--"Lewis and Clark Stayed Home" is a 1991 educational program developed by R. Philip Bouchard, Charolyn Kapplinger, Craig Solomonson, John A. Persoon, and Rich Bergeron, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a279 lewis and clark stayed home v1.0 (4am crack) side a.dsk" size="143360" crc="65d01a05" sha1="f76b2745535f9c0b6d6f36e7b88282177dec8bd6"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a279 lewis and clark stayed home v1.0 (4am crack) side b.dsk" size="143360" crc="a1a27f3b" sha1="f82f925b5328ce1849dc55c1b6163b3cc3ae3a04"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcppp10">
- <description>MECC-A281 Paper Plane Pilot (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Beth Bell, Gene Breault, Mark Hanson, Diane Portner, Shari Zehm, and Steve Zehm"/>
- <!--"Paper Plane Pilot" is a 1991 educational program developed by Beth Bell, Gene Breault, Mark Hanson, Diane Portner, Shari Zehm, and Steve Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a281 paper plane pilot v1.0 (4am crack).dsk" size="143360" crc="3c1e21e3" sha1="2c700ab474e3f6443ebb31a871da50faf6b4e796"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwob10">
- <description>MECC-A283 Woolly Bounce (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Gene Breault, Scott Jensen, Charolyn Kapplinger, and Kim D. Smith"/>
- <!--"Woolly Bounce" is a 1991 educational program developed by Gene Breault, Scott Jensen, Charolyn Kapplinger, and Kim D. Smith, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a283 woolly bounce v1.0 (4am crack).dsk" size="143360" crc="a8677a88" sha1="452251f799e55d64dc96a3423c1ea7f4955b235e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcssf10">
- <description>MECC-A290 Space Station Freedom (version 1.0) (cleanly cracked)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Mark Hanson, Charolyn Kapplinger, Mike Palmquist, Jane Peterson, and John P. Wlazlo"/>
- <!--"Space Station Freedom" is a 1990 educational program developed by Mark Hanson, Charolyn Kapplinger, Mike Palmquist, Jane Peterson, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a290 space station freedom v1.0 (4am crack) side a.dsk" size="143360" crc="256e9c8a" sha1="e5111bcc2e277f183d1a50028f5835493537b690"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a290 space station freedom v1.0 (4am crack) side b.dsk" size="143360" crc="9684bba0" sha1="4567ef175018226b78a34447bcbe6647cfe914cc"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcvnt10">
- <description>MECC-A291 Vacation Nation Travel (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="John Ojanen, Mike Palmquist, Dee Dee Roedel, and John P. Wlazlo"/>
- <!--"Vacation Nation Travel" is a 1991 educational program developed by John Ojanen, Mike Palmquist, Dee Dee Roedel, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a291 vacation nation travel v1.0 (4am crack) side a.dsk" size="143360" crc="0f8d83db" sha1="dd5099105fd71f79c3ae5f198ae13f30d2bca308"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a291 vacation nation travel v1.0 (4am crack) side b.dsk" size="143360" crc="7b1e19ba" sha1="7c1a9d9cbb79c7a5f29205af7d5ea5fef76b76aa"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcltz10">
- <description>MECC-A292 Littletown Zoo (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Eileen M. Nannen, John Ojanen, Mike Palmquist, Dee Dee Roedel, and John P. Wlazlo"/>
- <!--"Littletown Zoo" is a 1991 educational program developed by Eileen M. Nannen, John Ojanen, Mike Palmquist, Dee Dee Roedel, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a292 littletown zoo v1.0 (4am crack) side a.dsk" size="143360" crc="693b6194" sha1="169739e6ba1c3e2dda17605e0005f55aefee6351"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a292 littletown zoo v1.0 (4am crack) side b.dsk" size="143360" crc="b005e0b9" sha1="a8a7c05d100851ecc7a96a558b1172278d07164b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcess10">
- <description>MECC-A295 Estimation Strategies (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Beth Bell, Charolyn Kapplinger, Jane Peterson, and Shari Zehm"/>
- <!--"Estimation Strategies" is a 1991 educational program developed by Beth Bell, Charolyn Kapplinger, Jane Peterson, and Shari Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a295 estimation strategies v1.0 (4am crack).dsk" size="143360" crc="723d14bd" sha1="bcd33de40735741a868c1492a62a036c30debd4c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcesa10">
- <description>MECC-A296 Estimation Activities (version 1.0) (cleanly cracked)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-14"/>
- <info name="programmer" value="Beth Bell, Beth Daniels, Mark Hanson, Scott Jensen, Dee Dee Roedel, and Shari Zehm"/>
- <!--"Estimation Activities" is a 1991 educational program developed by Beth Bell, Beth Daniels, Mark Hanson, Scott Jensen, Dee Dee Roedel, and Shari Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a296 estimation activities v1.0 (4am crack).dsk" size="143360" crc="c94c1301" sha1="c5cbe823728cb82d7315a970a96642d53e8ad81a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcfsch10">
- <description>MECC-A302 Fish School (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo"/>
- <!--"Fish School" is a 1992 educational program developed by Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a302 fish school v1.0 (4am crack).dsk" size="143360" crc="63bc727a" sha1="e17cd655bf2abed7b31512e3d342e24a55711676"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mccvm10">
- <description>MECC-A303 Moving Museum (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo"/>
- <!--"Moving Museum" is a 1992 educational program developed by Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a303 moving museum v1.0 (4am crack).dsk" size="143360" crc="77a80339" sha1="aa83d4ee8d5bed1c71bba786b9c3a33199b921a1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrgb10">
- <description>MECC-A306 Grammar Gobble (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Beth Bell, Sheila Dols, Scott Jensen, and David Wood"/>
- <!--"Grammar Gobble" is a 1992 educational program developed by Beth Bell, Sheila Dols, Scott Jensen, and David Wood, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a306 grammar gobble v1.0 (4am crack).dsk" size="143360" crc="8f798b94" sha1="1cc77a8b8d6475eb1d96869a734128c30f99c271"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrmd10">
- <description>MECC-A307 Grammar Madness (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Beth Daniels, Sheila Dols, Sheila Kelly, and Elizabeth T. Wendland"/>
- <!--"Grammar Madness" is a 1992 educational program developed by Beth Daniels, Sheila Dols, Sheila Kelly, and Elizabeth T. Wendland, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a307 grammar madness v1.0 (4am crack).dsk" size="143360" crc="1f03936f" sha1="cc2faf8287c097ac0e26b4e5f38b9b4a30939c06"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwlgd10">
- <description>MECC-A309 Woolly's Garden (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Beth Bell, Eileen Nannen, Jean Sharp, and Dave Wood"/>
- <!--"Woolly's Garden" is a 1992 educational program developed by Beth Bell, Eileen Nannen, Jean Sharp, and Dave Wood, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a309 woolly's garden v1.0 (4am crack).dsk" size="143360" crc="fdd3ecb4" sha1="213e4ef02f820a795620286bc63da0b77293a24b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwnpz10">
- <description>MECC-A310 Wonderland Puzzles (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Mark Hanson, Charolyn Kapplinger, Patricia Korn, and Dick Sisco"/>
- <!--"Wonderland Puzzles" is a 1992 educational program developed by Mark Hanson, Charolyn Kapplinger, Patricia Korn, and Dick Sisco, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a310 wonderland puzzles v1.0 (4am crack).dsk" size="143360" crc="588b05ee" sha1="42b629ac843a82a79afe7faa5d8aa33bee076468"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpcas10">
- <description>MECC-A311 Picture A Story (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Beth Bell, Sheila Kelly, and Jean Sharp"/>
- <!--"Picture A Story" is a 1992 educational program developed by Beth Bell, Sheila Kelly, and Jean Sharp, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a311 picture a story v1.0 (4am crack).dsk" size="143360" crc="fdcc0dd4" sha1="e048f609a089159b33bdc1b6540edccd80b4489f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctac10">
- <description>MECC-A317 Take A Chance! (version 1.0) (cleanly cracked)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Beth Bell, Dee Dee Daus, Ruth Kivisto, Kevin Neff, John Persoon, and Shari Zehm"/>
- <!--"Take A Chance!" is a 1992 educational program developed by Beth Bell, Dee Dee Daus, Ruth Kivisto, Kevin Neff, John Persoon, and Shari Zehm, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a317 take a chance v1.0 (4am crack).dsk" size="143360" crc="4d51c5d8" sha1="741adf2c268cf2ab87bf77b15585e6b3476223d6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcnunb10">
- <description>MECC-A330 Nutrition Nabber (version 1.0) (cleanly cracked)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Dee Dee Daus, Kevin Neff, Korey Schulz, Paul Wieser, and John Wlazlo"/>
- <!--"Nutrition Nabber" is a 1993 educational program developed by Dee Dee Daus, Kevin Neff, Korey Schulz, Paul Wieser, and John Wlazlo, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a330 nutrition nabber v1.0 (4am crack).dsk" size="143360" crc="fd26d45a" sha1="6044b45f46c4be4f43c2a2399f2b9ae4b8728030"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcptg10">
- <description>MECC-A333 Pizza to Go (version 1.0) (cleanly cracked)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Beth Daniels, Rod Haenke, Sheila Kelly, Kevin Neff, and Ju-Chang Wang"/>
- <!--"Pizza to Go" is a 1993 educational program developed by Beth Daniels, Rod Haenke, Sheila Kelly, Kevin Neff, and Ju-Chang Wang, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a333 pizza to go v1.0 (4am crack).dsk" size="143360" crc="da7bba25" sha1="24956ed3f00d8fd335ca802136b6257b896dd2ae"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcstr10">
- <description>MECC-A159 Sound Tracks (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-01"/>
- <!--"Sound Tracks" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a159 sound tracks v1.0 (4am crack).dsk" size="143360" crc="f391030d" sha1="aefe5b72ed9b2604aa065a65b0422ceb4fa22b4c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctmp10">
- <description>MECC-A160 The Market Place (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-01"/>
- <!--"The Market Place" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a160 the market place v1.0 (4am crack).dsk" size="143360" crc="646c3331" sha1="826658fc5039fd80b4d34998805928a7815d75d8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcjenj10">
- <description>MECC-A161 Jenny's Journeys (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Jenny's Journeys" is a 1984 educational program developed and distributed by MECC. Thisf is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a161 jenny's journeys v1.0 (4am crack).dsk" size="143360" crc="b20d19b5" sha1="651132dd6617f80886698c76754a9107dabffc65"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcptac10">
- <description>MECC-A162 Path Tactics (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Path Tactics" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a162 path tactics v1.0 (4am crack).dsk" size="143360" crc="04d7a9e5" sha1="6885f2fd5f4d25fd467afbc095335b0a79643709"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcdq50s">
- <description>MECC-A163 MECC Dataquest: The Fifty States (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"MECC Dataquest: The Fifty States" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a163 mecc dataquest- the fifty states v1.0 (4am crack).dsk" size="143360" crc="2627bb27" sha1="b7330dfb679e684b51ce4239081212dd2c47f216"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcqfl10">
- <description>MECC-A167 Quickflash (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Quickflash" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a167 quickflash v1.0 (4am crack).dsk" size="143360" crc="d8e44581" sha1="3d7d00f57b770a8bef98dcb2ca59af3f7b383071"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsmth10">
- <description>MECC-A169 Speedway Math (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Speedway Math" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a169 speedway math v1.0 (4am crack).dsk" size="143360" crc="cff8d1bc" sha1="4ef56187addf57e9cf0b52b3dc564772859501e8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcnmm10">
- <description>MECC-A170 Number Munchers (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Number Munchers" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a170 number munchers v1.0 (4am crack).dsk" size="143360" crc="10d98d5f" sha1="f2013bcb35421a65c92922c6a92827f66f9b41a5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcnmm13">
- <description>MECC-A170 Number Munchers (version 1.3) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Number Munchers" is a 1986 educational program developed and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a170 number munchers v1.3 (4am crack).dsk" size="143360" crc="11a34694" sha1="11b6be5fb5a6df08982007e76c53ee8bec35e20e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcstm10">
- <description>MECC-A171 Show Time (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Show Time" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a171 show time v1.0 (4am crack) side a.dsk" size="143360" crc="1c583497" sha1="174b119b8bc59b68e8f6fd7660f3e5f25d2dfef2"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a171 show time v1.0 (4am crack) side b.dsk" size="143360" crc="13965064" sha1="212c55f763a36b2b0c1d8bf370a19940c4c0a2e5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcstm11">
- <description>MECC-A171 Show Time (version 1.1) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Show Time" is a 1986 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a171 show time v1.1 (4am crack) side a.dsk" size="143360" crc="944e21ef" sha1="830af0e0504d0f5cd124e3b2a830b34a8032939c"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a171 show time v1.1 (4am crack) side b.dsk" size="143360" crc="0865208a" sha1="c018c0b3a21fc54ee20e4995e8fdac225ede87ec"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcdqc10">
- <description>MECC-A172 MECC Dataquest Composer (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"MECC Dataquest Composer" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a172 mecc dataquest composer v1.0 (4am crack).dsk" size="143360" crc="c11e1562" sha1="bf87e04bc6e07c2c5989b7c011b0fb5a72742191"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mpptic10">
- <description>MECC-A175 Phonics Prime Time: Initial Consonants (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Phonics Prime Time: Initial Consonants" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a175 phonics prime time- initial consonants v1.0 (4am crack).dsk" size="143360" crc="f7d81538" sha1="9ec7142ce5cc89ec8b21cb87ac5346cba81c7efb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mpptfc10">
- <description>MECC-A176 Phonics Prime Time: Final Consonants (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Phonics Prime Time: Final Consonants" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a176 phonics prime time- final consonants v1.0 (4am crack).dsk" size="143360" crc="caa2ac11" sha1="03ef069a1f56e3f77c52b7a91c01207192a0cf2a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mpptv110">
- <description>MECC-A177 Phonics Prime Time: Vowels I (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Phonics Prime Time: Vowels I" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a177 phonics prime time- vowels i v1.0 (4am crack).dsk" size="143360" crc="c6eba371" sha1="ce860d36fc2fcca9e3e6e8a2aef5f14f958a15b5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mpptv210">
- <description>MECC-A178 Phonics Prime Time: Vowels II (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Phonics Prime Time: Vowels II" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a178 phonics prime time- vowels ii v1.0 (4am crack).dsk" size="143360" crc="c629df4f" sha1="91f743d3e188de5a9b3575cf11f06fcceb9aeb58"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mpptbd10">
- <description>MECC-A179 Phonics Prime Time: Blends and Digraphs (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Phonics Prime Time: Blends and Digraphs" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a179 phonics prime time- blends and digraphs v1.0 (4am crack).dsk" size="143360" crc="66cb41e3" sha1="2581a00550bdb9bd856ddfe25de183538c0a80ee"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mwawca10">
- <description>MECC-A180 Words at Work: Contraction Action (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Words at Work: Contraction Action" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a180 words at work- contraction action v1.0 (4am crack).dsk" size="143360" crc="ba34b024" sha1="e89aefdf4a8f9e05f107026cc168364de1c68a60"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mwawpp10">
- <description>MECC-A181 Words at Work: Prefix Power (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Words at Work: Prefix Power" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a181 words at work- prefix power v1.0 (4am crack).dsk" size="143360" crc="83dfe3ba" sha1="5be548e4055e7db9ac5d927b2783f0e093d7500a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mwawss10">
- <description>MECC-A182 Words at Work: Suffix Sense (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Words at Work: Suffix Sense" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a182 words at work- suffix sense v1.0 (4am crack).dsk" size="143360" crc="92e3f1b4" sha1="f2aa869c3485b0ff83ebb96ebb92b12ad9d9d5d3"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mwawci10">
- <description>MECC-A183 Words at Work: Compound It (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Words at Work: Compound It" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a183 words at work- compound it v1.0 (4am crack).dsk" size="143360" crc="d04c4112" sha1="8c2053ed56f1d8d5a0da966755126f86688cdf4c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mtarm110">
- <description>MECC-A185 Those Amazing Reading Machines (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Those Amazing Reading Machines I" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a185 those amazing reading machines i v1.0 (4am crack).dsk" size="143360" crc="dcf4433b" sha1="cf1c219b1aa2bd83807c10e4a921369e4e1dc921"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctfs10">
- <description>MECC-A337 Treasures for Sale (version 1.0) (cleanly cracked)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-15"/>
- <info name="programmer" value="Lon Koenig, John A. Persoon, Jean Sharp, John Wlazlo, and David L. Wood"/>
- <!--"Treasures for Sale" is a 1993 educational program developed by Lon Koenig, John A. Persoon, Jean Sharp, John Wlazlo, and David L. Wood, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a337 treasures for sale v1.0 (4am crack).dsk" size="143360" crc="93303a05" sha1="b977e56e509cdb719324356eead3c3856c472e8b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mtarm210">
- <description>MECC-A186 Those Amazing Reading Machines II (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Those Amazing Reading Machines II" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a186 those amazing reading machines ii v1.0 (4am crack).dsk" size="143360" crc="db6a9744" sha1="6a554f00f4f25a4c35aafee73c8a5bb02b200733"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mtarm310">
- <description>MECC-A187 Those Amazing Reading Machines III (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Those Amazing Reading Machines III" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a187 those amazing reading machines iii v1.0 (4am crack).dsk" size="143360" crc="aaf9cc01" sha1="a6715a6d1958c3f10d3e079168b8eaea1b8da716"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mtarm410">
- <description>MECC-A188 Those Amazing Reading Machines IV (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-02"/>
- <!--"Those Amazing Reading Machines IV" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a188 those amazing reading machines iv v1.0 (4am crack).dsk" size="143360" crc="aead822c" sha1="7d0ee74ec2471fb56cd284c07a6d254528e6b015"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcodl10">
- <description>MECC-A191 Odell Lake (version 1.0) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Odell Lake" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a191 odell lake v1.0 (4am crack).dsk" size="143360" crc="60b1b4e8" sha1="137dc71b9e7547a1d763303948efde8540d3fe83"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcodl12">
- <description>MECC-A191 Odell Lake (version 1.2) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Odell Lake" is a 1986 educational program developed and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a191 odell lake v1.2 (4am crack).dsk" size="143360" crc="f3a5b62a" sha1="b2ce3a070cc2c7d2f95ee0cca16f5a13c41d8cbc"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mceqm10">
- <description>MECC-A193 Equation Math (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Equation Math" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a193 equation math v1.0 (4am crack).dsk" size="143360" crc="c1a96955" sha1="7cda6fe3b4d33bb02337f7201fefd69286098438"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mceqm11">
- <description>MECC-A193 Equation Math (version 1.1) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Equation Math" is a 1987 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a193 equation math v1.1 (4am crack).dsk" size="143360" crc="69ed6482" sha1="aba2803bba4451d1e53e61d836777f6c9550ac70"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmnwk10">
- <description>MECC-A195 Money Works (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Money Works" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a195 money works v1.0 (4am crack).dsk" size="143360" crc="0f93a058" sha1="f211e681c9cfcd81d262fd99d437f7d7f32afc9e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmnwk11">
- <description>MECC-A195 Money Works (version 1.1) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Money Works" is a 1987 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a195 money works v1.1 (4am crack).dsk" size="143360" crc="ffaba004" sha1="ea8875494a3cf1401ea16228491a4dedeead3058"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcfrmn10">
- <description>MECC-A196 Fraction Munchers (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Fraction Munchers" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a196 fraction munchers v1.0 (4am crack).dsk" size="143360" crc="9b6f2ac6" sha1="22b5a361b1c3b3622790c283359178ce42e0dab6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mctppd11">
- <description>MECC-A198 To Preserve, Protect and Defend (version 1.1) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"To Preserve, Protect and Defend" is a 1987 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a198 to preserve, protect and defend v1.1 (4am crack).dsk" size="143360" crc="7ffba023" sha1="29e318b73420c11020a84d46f021e7e18a45189b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mczoyp10">
- <description>MECC-A199 Zoyon Patrol (version 1.0) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-03"/>
- <!--"Zoyon Patrol" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a199 zoyon patrol v1.0 (4am crack) side a.dsk" size="143360" crc="c8ba3979" sha1="cf91a1c7ac485f435818ee4aef66fd7f9278f868"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="mecc-a199 zoyon patrol v1.0 (4am crack) side b.dsk" size="143360" crc="5a5c18b8" sha1="62428a2d91a99052002afcfa92d28cf7977ba58d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmusthry10">
- <description>MECC-A712 Music Theory: Music Fundamentals (version 1.0) (cleanly cracked)</description>
- <year>1979</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-25"/>
- <!--"Music Theory: Music Fundamentals" is a 1979 educational program developed by Linda Borry and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a712 apple music theory- music fundamentals v1.0 (4am crack).dsk" size="143360" crc="e0dbc805" sha1="d793b38c12b27e5ec5d360be54fd5c38b8c23f5c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev5lap15">
- <description>MECC-A719 Elementary Volume 5: Language Arts: Prefixes (version 1.5) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-25"/>
- <!--"Elementary Volume 5: Language Arts: Prefixes" is a 1980 educational program developed and distributed by MECC. This is version 1.5.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a719 elementary volume 5- language arts- prefixes v1.5 (4am crack).dsk" size="143360" crc="9f0e8279" sha1="4358a6da33df2c7623c4c3a63461a77ce618aec7"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev5lap17">
- <description>MECC-A719 Elementary Volume 5: Language Arts: Prefixes (version 1.7) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-25"/>
- <!--"Elementary Volume 5: Language Arts: Prefixes" is a 1980 educational program developed and distributed by MECC. This is version 1.7.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a719 elementary volume 5- language arts- prefixes v1.7 (4am crack).dsk" size="143360" crc="6a72201c" sha1="c28569f55b122bf54bec1d08146ce4ea0da8be74"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcbv3acc18">
- <description>MECC-A721 Business Volume 3: Accounting (version 1.8) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-25"/>
- <!--"Business Volume 3: Accounting" is a 1981 educational program developed by R. Philip Bouchard and distributed by MECC. This is version 1.8.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a721 business volume 3 - accounting v1.8 (4am crack).dsk" size="143360" crc="171e6e38" sha1="981b78b289bdc87717e72a6e04d49edff9f777b5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="kampfg10">
- <description>Kampfgruppe (version 1.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2021-04-07"/>
- <!--"Kampfgruppe" is a 1985 strategy game developed and distributed by Strategic Simulations, Inc. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Game disk"/>
- <dataarea name="flop" size="143360">
- <rom name="kampfgruppe v1.0 (4am and san inc crack) disk 1 - game disk.dsk" size="143360" crc="daa30896" sha1="031d68b8a2beee66421bf042064400fa94b22d2c"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Historical scenarios"/>
- <dataarea name="flop" size="143360">
- <rom name="kampfgruppe v1.0 (4am and san inc crack) disk 2 - historical scenarios.dsk" size="143360" crc="a516177e" sha1="5960e7169c9709546931597c969d8b8182e8a93c"/>
- </dataarea>
- </part>
- </software>
-
<software name="gato12">
<description>GATO (version 1.2) (cleanly cracked)</description>
<year>1985</year>
<publisher>Spectrum Holobyte</publisher>
<info name="release" value="2021-04-07"/>
- <info name="programmer" value="J.A. Yandrofski, Timothy Reese, Paul Artlton, and Ed Dawson"/>
- <!--"GATO" is a 1985 simulation game developed by J.A. Yandrofski, Timothy Reese, Paul Artlton, and Ed Dawson, and distributed by Spectrum Holobyte. This is version 1.2.-->
+ <info name="programmer" value="J.A. Yandrofski" />
+ <info name="programmer" value="Timothy Reese" />
+ <info name="programmer" value="Paul Artlton" />
+ <info name="programmer" value="Ed Dawson" />
+ <!-- "GATO" is a 1985 simulation game developed by J.A. Yandrofski, Timothy Reese, Paul Artlton, and Ed Dawson, and distributed by Spectrum Holobyte. This is version 1.2. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -34774,7 +15339,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Professional Software</publisher>
<info name="release" value="2021-04-07"/>
- <!--"Trivia Fever" is a 1984 game developed and distributed by Professional Software.-->
+ <!-- "Trivia Fever" is a 1984 game developed and distributed by Professional Software. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -34790,500 +15355,12 @@ license:CC0-1.0
</part>
</software>
- <software name="mcsv1pri20">
- <description>MECC-A726 Spelling Volume 1: Primary (version 2.0) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-25"/>
- <!--"Spelling Volume 1: Primary" is a 1980 educational program developed and distributed by MECC. This is version 2.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a726 spelling volume 1- primary v2.0 (4am crack).dsk" size="143360" crc="0b75f4e8" sha1="75b0ac33e13209b7db7c248184642ea4f629a340"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsv1pri31">
- <description>MECC-A726 Spelling Volume 1: Primary (version 3.1) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Spelling Volume 1: Primary" is a 1980 educational program developed and distributed by MECC. This is version 3.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a726 spelling volume 1 v3.1 (4am crack).dsk" size="143360" crc="e80a2c33" sha1="a1f8d956c2e78d72884139baf52acec9f9519ca9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsv2sec20">
- <description>MECC-A728 Spelling Volume 2: Secondary (version 2.0) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Spelling Volume 2: Secondary" is a 1980 educational program developed and distributed by MECC. This is version 2.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a728 spelling volume 2- secondary v2.0 (4am crack).dsk" size="143360" crc="28f1e707" sha1="f04478d198db9e692bab902648db91e8297b2cff"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcsv2sec31">
- <description>MECC-A728 Spelling Volume 2: Secondary (version 3.1) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Spelling Volume 2: Secondary" is a 1980 educational program developed and distributed by MECC. This is version 3.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a728 spelling volume 2- secondary v3.1 (4am crack).dsk" size="143360" crc="f9619661" sha1="0a3d3ec46484681198cf54c930849c21903f7f0b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev7prer10">
- <description>MECC-A731 Elementary Volume 7: Pre-Reading and Counting (version 1.0) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Elementary Volume 7: Pre-Reading and Counting" is a 1981 educational program developed by Mike Fish and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a731 elementary volume 7 - pre-reading and counting v1.0 (4am crack).dsk" size="143360" crc="21f5868b" sha1="dc4d2ea2026c754a382aa0fd8413cc5f547edc59"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev7prer11">
- <description>MECC-A731 Elementary Volume 7: Pre-Reading and Counting (version 1.1) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Elementary Volume 7: Pre-Reading and Counting" is a 1981 educational program developed by Mike Fish and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a731 elementary volume 7 - pre-reading and counting v1.1 (4am crack).dsk" size="143360" crc="a1e40a3a" sha1="78354f820ec816d182e3c3c31b6d4e22c448c4c9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev9geo10">
- <description>MECC-A733 Elementary Volume 9: Geometry (version 1.0) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Elementary Volume 9: Geometry" is a 1981 educational program developed and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a733 elementary volume 9- geometry v1.0 (4am crack).dsk" size="143360" crc="d14015b9" sha1="37f06440e57c48b2d3f14dc36275581e02fc0734"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev9geo21">
- <description>MECC-A733 Elementary Volume 9: Geometry (version 2.1) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Elementary Volume 9: Geometry" is a 1981 educational program developed and distributed by MECC. This is version 2.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a733 elementary volume 9- geometry v2.1 (4am crack).dsk" size="143360" crc="69999da9" sha1="4efa17eb567b62f8e80fb0ee4a4b06fcb72cec1e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev10geo11">
- <description>MECC-A734 Elementary Volume 10: Geometry (version 1.1) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Elementary Volume 10: Geometry" is a 1981 educational program developed and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a734 elementary volume 10- geometry v1.1 (4am crack).dsk" size="143360" crc="5331711d" sha1="0d0e228ed2b61bc744acf1f666c1c500e75db19e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev11lang11">
- <description>MECC-A735 Elementary Volume 11: Language Arts (version 1.1) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="Daniel M. Forde, James A. Henke, and David E. Laden"/>
- <!--"Elementary Volume 11: Language Arts" is a 1981 educational program developed by Daniel M. Forde, James A. Henke, and David E. Laden, and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a735 elementary volume 11- language arts v1.1 (4am crack).dsk" size="143360" crc="a51a4606" sha1="45da46901ccba1f4734f88ef8d4569c84d1027cd"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev12lang10">
- <description>MECC-A736 Elementary Volume 12: Language Arts (version 1.0) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="Daniel M. Forde, Scott Costello, R. Christiansen, David E. Laden, L. Dixson, S. Costello, J. Cook, L. Borry, and R. Alberti"/>
- <!--"Elementary Volume 12: Language Arts (SIMS)" is a 1980 educational program developed by Daniel M. Forde, Scott Costello, R. Christiansen, David E. Laden, L. Dixson, S. Costello, J. Cook, L. Borry, and R. Alberti, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a736 elementary volume 12- language arts (sims) v1.0 (4am crack).dsk" size="143360" crc="721e324a" sha1="f1f6294ce13866412608672021703e3a933410b8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev12lang20">
- <description>MECC-A736 Elementary Volume 12: Language Arts (version 2.0) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="Daniel M. Forde, Scott Costello, R. Christiansen, David E. Laden, L. Dixson, S. Costello, J. Cook, L. Borry, and R. Alberti"/>
- <!--"Elementary Volume 12: Language Arts (SIMS)" is a 1980 educational program developed by Daniel M. Forde, Scott Costello, R. Christiansen, David E. Laden, L. Dixson, S. Costello, J. Cook, L. Borry, and R. Alberti, and distributed by MECC. This is version 2.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a736 elementary volume 12- language arts (sims) v2.0 (4am crack).dsk" size="143360" crc="367ed575" sha1="5ed86c59a1b645296e07baca5c2db0b9748e67f6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmathv2m12">
- <description>MECC-A737 Mathematics Volume 2: Measurement (version 1.2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="Tom Boe and Russ Erickson"/>
- <!--"Mathematics Volume 2: Measurement" is a 1981 educational program developed by Tom Boe and Russ Erickson, and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a737 mathematics volume 2- measurement v1.2 (4am crack).dsk" size="143360" crc="1cb515c8" sha1="0d8b311aa1d01d5b5d1e44ac1966070a3682e995"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmathv3g13">
- <description>MECC-A738 Mathematics Volume 3: Geometry (version 1.3) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <!--"Mathematics Volume 3: Geometry" is a 1981 educational program developed and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a738 mathematics volume 3- geometry v1.3 (4am crack).dsk" size="143360" crc="b1fa1ef3" sha1="88b127b699a399e45c3d178f9de742c91b798642"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcmathv3gl13">
- <description>MECC-A738 Mathematics Volume 3: Geometry - (Limited Boot Backup) (version 1.3) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="usage" value="Originally a limited 50 boot backup, restriction has been removed"/>
- <!--"Mathematics Volume 3: Geometry" is a 1981 educational program developed and distributed by MECC. This disk was originally a "limited boot backup" that could only be booted 50 times before self-destructing. (Obviously this is no longer true.) It is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a738 mathematics volume 3- geometry- limited boot backup v1.3 (4am crack).dsk" size="143360" crc="093c9464" sha1="a0daf717408cf82036b0e44c4c5e8e91b7807e6f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcev13nut10">
- <description>MECC-A743 Elementary Volume 13: Nutrition (version 1.0) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="Shane Mccarron and Todd Bailey"/>
- <!--"Elementary Volume 13: Nutrition" is a 1981 educational program developed by Shane Mccarron and Todd Bailey, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a743 elementary volume 13- nutrition v1.0 (4am crack).dsk" size="143360" crc="eb2ccece" sha1="c25e5eeece426c4cb2c1397f7468d34c246a6a0b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcengv1pos13">
- <description>MECC-A746 English Volume 1: Parts of Speech (version 1.3) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="A. McCarthy and Darrel Ricke"/>
- <!--"English Volume 1: Parts of Speech" is a 1981 educational program developed by A. McCarthy and Darrel Ricke, and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a746 english volume 1- parts of speech v1.3 (4am crack).dsk" size="143360" crc="d3066591" sha1="455263c41014c238b4c8ff33b8731dda7a12998e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcengv1pos14">
- <description>MECC-A746 English Volume 1: Parts of Speech (version 1.4) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-27"/>
- <info name="programmer" value="A. McCarthy and Darrel Ricke"/>
- <!--"English Volume 1: Parts of Speech" is a 1981 educational program developed by A. McCarthy and Darrel Ricke, and distributed by MECC. This is version 1.4.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a746 english volume 1- parts of speech v1.4 (4am crack).dsk" size="143360" crc="1598ccc3" sha1="7b768321bdb8ba72c261372bdda6db107bddec95"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcschutlv2rd">
- <description>MECC-A749 School Utilities Volume 2: Readability (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"School Utilities Volume 2: Readability" is a 1982 educational program developed by A. McCarthy and distributed by MECC. This is version 1.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a749 school utilities volume 2 - readability v1.3 (4am crack).dsk" size="143360" crc="eb9fc421" sha1="393de81b294412618336f85d394fa20c69e94cad"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mchlthv2as10">
- <description>MECC-A751 Health Maintenance Volume 2: Assessment (version 1.0) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <info name="programmer" value="Shane McCarron and Craig W. Copley"/>
- <!--"Health Maintenance Volume 2: Assessment" is a 1982 educational program developed by Shane McCarron and Craig W. Copley, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a751 health maintenance volume 2 - assessment v1.0 (4am crack).dsk" size="143360" crc="5bc251cf" sha1="b35a6b6cc1171f3d0468f80507639ec0ffbe3d3a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcnutv1v12">
- <description>MECC-A752 Nutrition Volume 1 (version 1.2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Nutrition Volume 1" is a 1982 educational program developed by Shane McCarron and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a752 nutrition volume 1 v1.2 (4am crack).dsk" size="143360" crc="6da02706" sha1="3ff2d9b0a20fc5e083598f7159d9a1d70e5ad58c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcnutv2v15">
- <description>MECC-A753 Nutrition Volume 2 (version 1.5) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Nutrition Volume 2" is a 1982 educational program developed by Willis Jokela and distributed by MECC. This is version 1.5.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a753 nutrition volume 2 v1.5 (4am crack).dsk" size="143360" crc="5d6d3d9b" sha1="d1799b68a1a945f0105f0e56fb7056c97fe052c9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrademng10">
- <description>MECC-A771 Grade Manager (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Grade Manager" is a 1983 educational program developed by Shane McCarron and distributed by MECC. This is version 1.0. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a771 grade manager v1.0 (4am crack).dsk" size="143360" crc="1f0cceb8" sha1="94ed0423a501d08c79fcd2a6b5ace54011a3ebbb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrademng11">
- <description>MECC-A771 Grade Manager (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Grade Manager" is a 1983 educational program developed by Shane McCarron and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a771 grade manager v1.1 (4am crack).dsk" size="143360" crc="097881f2" sha1="2dfe3d73f9af3382c2c799f2883942e08706d80a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrademr21">
- <description>MECC-A771 Grade Manager Revised Edition (version 2.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Grade Manager Revised Edition" is a 1985 educational program developed by Shane McCarron and distributed by MECC. This is version 2.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a771 grade manager revised edition v2.1 (4am crack).dsk" size="143360" crc="216edff1" sha1="bc7366747266e64bb458f22586f9483db00a9030"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrademr22">
- <description>MECC-A771 Grade Manager Revised Edition (version 2.2) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Grade Manager Revised Edition" is a 1985 educational program developed by Shane McCarron and distributed by MECC. This is version 2.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a771 grade manager revised edition v2.2 (4am crack).dsk" size="143360" crc="dae6b6d6" sha1="c31e60aab48a8a9a48cc2832a320a03cb4c0b252"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrademr23">
- <description>MECC-A771 Grade Manager Revised Edition (version 2.3) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <!--"Grade Manager Revised Edition" is a 1985 educational program developed by Shane McCarron and distributed by MECC. This is version 2.3.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a771 grade manager revised edition v2.3 (4am crack).dsk" size="143360" crc="47e2cf7e" sha1="3ee1d263b2a77416b5324d1385bd242fa224d229"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrowgfr10">
- <description>MECC-A773 Growgins' Fractions (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <info name="programmer" value="H. Bill Way and Mike Boucher"/>
- <!--"Growgins' Fractions" is a 1983 educational program developed by H. Bill Way and Mike Boucher, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a773 growgins' fractions v1.0 (4am crack).dsk" size="143360" crc="71152c63" sha1="10d2b34c53346e714bbb7ebf5874d5ca8196cd8f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrowgfr11">
- <description>MECC-A773 Growgins' Fractions (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-28"/>
- <info name="programmer" value="H. Bill Way and Mike Boucher"/>
- <!--"Growgins' Fractions" is a 1983 educational program developed by H. Bill Way and Mike Boucher, and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a773 growgins' fractions v1.1 (4am crack).dsk" size="143360" crc="854d84b5" sha1="d70f6b66ea586afd0b7ea44b03dba3f29c7927a8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcezlogo20">
- <description>MECC-A775 EZ Logo (version 2.0) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"EZ Logo" is a 1985 educational program developed by Steve Splinter and distributed by MECC. This is version 2.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a775 ez logo v2.0 (4am crack).dsk" size="143360" crc="ed3d4b95" sha1="988033b7d18e536115c4bc4dddf689c8d2f436ad"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrtnar10">
- <description>MECC-A776 Writing a Narrative (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"Writing a Narrative" is a 1983 educational program developed by Rich M. Childers and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a776 writing a narrative v1.0 (4am crack).dsk" size="143360" crc="3e443154" sha1="3bf54021f807ab5694917d8a3cbbb594539ba340"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrtnar11">
- <description>MECC-A776 Writing a Narrative (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"Writing a Narrative" is a 1983 educational program developed by Rich M. Childers and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a776 writing a narrative v1.1 (4am crack).dsk" size="143360" crc="be1a9d16" sha1="8a78040212d39899fd91ac07f4e483d2dcbe862b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcblisss11">
- <description>MECC-A777 Blissymbolics: Blissymbol Concepts (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"Blissymbolics: Blissymbol Concepts" is a 1983 educational program developed by R. J. Granvin and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a777 blissymbolics - blissymbol concepts v1.1 (4am crack).dsk" size="143360" crc="38aaa53e" sha1="b35b75f88edd71d9a4733d8f2352888c22ce1d66"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcfrndcomp15">
- <description>MECC-A779 The Friendly Computer (version 1.5) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <info name="programmer" value="H. Bill Way and Craig Solmonson"/>
- <!--"The Friendly Computer" is a 1983 educational program developed by H. Bill Way and Craig Solmonson, and distributed by MECC. This is version 1.5.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a779 the friendly computer v1.5 (4am crack).dsk" size="143360" crc="8dab5713" sha1="a39c4ac0d9282766ddaa1331847ad6660d269bed"/>
- </dataarea>
- </part>
- </software>
-
<software name="playwmys">
<description>PlayWriter: Mystery (cleanly cracked)</description>
<year>1985</year>
<publisher>Woodbury Software</publisher>
<info name="release" value="2021-04-09"/>
- <!--"PlayWriter: Mystery" is a 1985 productivity program developed and distributed by Woodbury Software. It is preserved here for the first time.-->
+ <!-- "PlayWriter: Mystery" is a 1985 productivity program developed and distributed by Woodbury Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
@@ -35299,186 +15376,13 @@ license:CC0-1.0
</part>
</software>
- <software name="mcohdeer11">
- <description>MECC-A781 Oh, Deer! (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <info name="programmer" value="Cynthia L. Schroeder and R. Philip Bouchard"/>
- <!--"Oh, Deer!" is a 1983 educational program developed by Cynthia L. Schroeder and R. Philip Bouchard, and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a781 oh, deer v1.1 (4am crack).dsk" size="143360" crc="e771b33f" sha1="bd943da8c19277218c2351193f0630740ef05f96"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrtchrsk11">
- <description>MECC-A785 Writing a Character Sketch (version 1.1) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"Writing a Character Sketch" is a 1983 educational program developed by Rich M. Childers and distributed by MECC. This is version 1.1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a785 writing a character sketch v1.1 (4am crack).dsk" size="143360" crc="64a7744d" sha1="a34b509bf6211f74267473b65ba758f97f3b66b2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrtchrsk12">
- <description>MECC-A785 Writing a Character Sketch (version 1.2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"Writing a Character Sketch" is a 1983 educational program developed by Rich M. Childers and distributed by MECC. This is version 1.2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a785 writing a character sketch v1.2 (4am crack).dsk" size="143360" crc="b53c6aa9" sha1="1ed91a5f421b071b9728652c1840f1dbaacff42b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcexpproc10">
- <description>MECC-A810 Experiencing Procedures (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <info name="programmer" value="Wendell Ruotsi and Andy Hollenbeck"/>
- <!--"Experiencing Procedures" is a 1983 educational program developed by Wendell Ruotsi and Andy Hollenbeck, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a810 experiencing procedures v1.0 (4am crack).dsk" size="143360" crc="10ebecbd" sha1="b385b46aaef87848dbe68e129e0dac7c511610ab"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mc3rmiccmp10">
- <description>MECC-A811 The Three R's of Microcomputing (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <!--"The Three R's of Microcomputing" is a 1983 educational program developed by Kent Carlson and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a811 the three r's of microcomputing v1.0 (4am crack).dsk" size="143360" crc="8730e040" sha1="9cdbb5dbcd340779b9ce921e6e1b2681229c1853"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcprocwrds10">
- <description>MECC-A813 Processing Words (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <info name="programmer" value="Jeff Jorgensen, Dan Pelowski, and Wendell Ruotsi"/>
- <!--"Processing Words" is a 1983 educational program developed by Jeff Jorgensen, Dan Pelowski, and Wendell Ruotsi, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a813 processing words v1.0 (4am crack).dsk" size="143360" crc="68b391fe" sha1="848aee2a6c0c894fae7eb891f63839ab4e2ecf43"/>
- </dataarea>
- </part>
- </software>
-
- <software name="drgkeep84">
- <description>Dragon's Keep (version 1984-06-05) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="release" value="2021-04-09"/>
- <info name="programmer" value="Al Lowe, Mike Macchesney, Margaret Lowe, and Rae Lynn Macchesney"/>
- <!--"Dragon's Keep" is a 1983 adventure game developed by Al Lowe, Mike Macchesney, Margaret Lowe, and Rae Lynn Macchesney, and distributed by Sierra On-Line. This update is dated 1984-06-05 according to program comments. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dragon's keep 1984 (4am crack).dsk" size="143360" crc="e573e6c6" sha1="b32b8fc3bcdf3f8f09aca058648ed612f3d4eb76"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcnutri10">
- <description>MECC-A822 Nutrition (version 1.0) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="release" value="2021-03-29"/>
- <info name="programmer" value="Tim Heap and Seth A. Rosenblatt"/>
- <!--"Nutrition" is a 1983 educational program developed by Tim Heap and Seth A. Rosenblatt, and distributed by MECC. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a822 nutrition v1.0 (4am crack).dsk" size="143360" crc="a006e95a" sha1="bcd43af6365e4e96be0cebc8cf282c81f4b657f1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="pensate">
- <description>Pensate (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="release" value="2021-04-03"/>
- <!--"Pensate" is a 1983 board game developed and distributed by Penguin Software.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pensate (4am crack).dsk" size="143360" crc="c7681fa5" sha1="4353b479a2d43e852b22a995afb2f2d0e5db9522"/>
- </dataarea>
- </part>
- </software>
-
- <software name="risk14">
- <description>Risk (version 1.4) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Leisure Genius</publisher>
- <info name="release" value="2021-04-04"/>
- <!--"Risk" is a 1988 board game developed by Casablanca Software and distributed by Leisure Genius. This is version 1.4.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="risk v1.4 (4am crack).dsk" size="143360" crc="49d17549" sha1="05aef425e962d3ada8294e9eb7674446a51bb8cb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="clue15">
- <description>Clue (version 1.5) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Leisure Genius</publisher>
- <info name="release" value="2021-04-05"/>
- <!--"Clue" is a 1989 board game developed by Casablanca Software and distributed by Leisure Genius. This is version 1.5.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="clue master detective v1.5 (4am crack).dsk" size="143360" crc="e46f9fa8" sha1="e73ec6e7dec7e14d791d63dc53cd7a3a8797f7e1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="cmpscrbl">
- <description>The Computer Edition of Scrabble (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Leisure Genius</publisher>
- <info name="release" value="2021-04-05"/>
- <!--"The Computer Edition of Scrabble" is a 1987 board game distributed by Leisure Genius.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the computer edition of scrabble (4am crack).dsk" size="143360" crc="2a27b3fe" sha1="92dc008a31710c01eba33edb9d511ae18874ea64"/>
- </dataarea>
- </part>
- </software>
-
<software name="voyvalk">
<description>The Voyage of the Valkyrie (cleanly cracked)</description>
<year>1980</year>
<publisher>Advanced Operating Systems</publisher>
<info name="release" value="2021-04-05"/>
<info name="usage" value="Will only run on 2+ and unenhanced 2E models" />
- <!--"The Voyage of the Valkyrie" is a 1980 roleplaying game developed by Leo Christopherson and distributed by Advanced Operating Systems. Due to compatibility issues unrelated to copy protection, it only runs on an Apple ][+ or unenhanced Apple ][e.-->
+ <!-- "The Voyage of the Valkyrie" is a 1980 role-playing game developed by Leo Christopherson and distributed by Advanced Operating Systems. Due to compatibility issues unrelated to copy protection, it only runs on an Apple ][+ or unenhanced Apple ][e. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35487,41 +15391,12 @@ license:CC0-1.0
</part>
</software>
- <software name="cytrmast">
- <description>Cytron Masters (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2021-04-07"/>
- <info name="usage" value="Will only run on 2+ and unenhanced 2E models" />
- <!--"Cytron Masters" is a 1982 strategy game developed by Dan Bunten and distributed by Strategic Simulations, Inc. Due to compatibility issues unrelated to copy protection, it only runs on an Apple ][+ or unenhanced Apple ][e.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cytron masters (4am and san inc crack).dsk" size="143360" crc="60a49b83" sha1="fbd8a8d6672c0228e10fea064aa64958d55bc90b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sixgunsh">
- <description>Six-Gun Shootout (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2021-04-07"/>
- <!--"Six-Gun Shootout" is a 1985 strategy game developed and distributed by Strategic Simulations, Inc.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="six-gun shootout (4am and san inc crack).dsk" size="143360" crc="de053043" sha1="3424be7108be30d5738a04e1cb3580f646f9e86d"/>
- </dataarea>
- </part>
- </software>
-
<software name="compuzlr">
<description>Compuzzler (cleanly cracked)</description>
<year>1984</year>
<publisher>Uptown Software</publisher>
<info name="release" value="2021-04-09"/>
- <!--"Compuzzler" is a 1984 board game developed and distributed by Uptown Software. It is preserved here for the first time.-->
+ <!-- "Compuzzler" is a 1984 board game developed and distributed by Uptown Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35530,45 +15405,12 @@ license:CC0-1.0
</part>
</software>
- <software name="wzcrwn12">
- <description>Wizard's Crown (version 1.2) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="release" value="2021-04-10"/>
- <!--"Wizard's Crown" is a 1986 roleplaying game developed by Paul Murray and Keith Brors, and distributed by Strategic Simulations, Inc. This is version 1.2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Game disk front"/>
- <dataarea name="flop" size="143360">
- <rom name="wizard's crown v1.2 (4am crack) disk 1a - game disk front.dsk" size="143360" crc="3198d3fe" sha1="348fdaeb55c447c40e2e9bfefc364ac37210cd59"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Game disk back"/>
- <dataarea name="flop" size="143360">
- <rom name="wizard's crown v1.2 (4am crack) disk 1b - game disk back.dsk" size="143360" crc="cb8fee67" sha1="4be497844d0a8a4fcfb70d9629ceddab8c45ea3a"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Data disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="wizard's crown v1.2 (4am crack) disk 2a - data disk 1.dsk" size="143360" crc="fcc7fdac" sha1="7afa03981c62de9b0deaedd2a6788baae12a54f6"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Data disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="wizard's crown v1.2 (4am crack) disk 2b - data disk 2.dsk" size="143360" crc="8b82a2f5" sha1="6186061a89bbcace9fe4c5a7d55c4740ea15a550"/>
- </dataarea>
- </part>
- </software>
-
<software name="odystime">
<description>Odyssey in Time (cleanly cracked)</description>
<year>1981</year>
<publisher>Krell Software</publisher>
<info name="release" value="2021-04-10"/>
- <!--"Odyssey in Time" is a 1981 adventure game developed and distributed by Krell Software. It is preserved here for the first time.-->
+ <!-- "Odyssey in Time" is a 1981 adventure game developed and distributed by Krell Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35582,7 +15424,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Pryority Software</publisher>
<info name="release" value="2021-04-10"/>
- <!--"Forbidden Quest" is a 1983 adventure game developed and distributed by Pryority Software. It is preserved here for the first time.-->
+ <!-- "Forbidden Quest" is a 1983 adventure game developed and distributed by Pryority Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35596,7 +15438,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>Discovery Games</publisher>
<info name="release" value="2021-04-10"/>
- <!--"Flying Tigers" is a 1982 strategy game developed by Ross W. Maker, David A. Wesley, and Stephen Goss and distributed by Discovery Games. This is version 1.3. It is preserved here for the first time.-->
+ <!-- "Flying Tigers" is a 1982 strategy game developed by Ross W. Maker, David A. Wesley, and Stephen Goss and distributed by Discovery Games. This is version 1.3. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35611,7 +15453,7 @@ license:CC0-1.0
<publisher>Apple Computer</publisher>
<info name="release" value="2021-04-10"/>
<info name="usage" value="Will only run on 2, 2+, and unenhanced 2E models" />
- <!--"Apple How To: Lessons in Computing and Calculating" is a 1980 educational program developed by Bruce Tognazzini and distributed by Apple Computer. This is version 1.0. It is preserved here for the first time. Due to compatibility issues unrelated to copy protection, it only runs on an original Apple ][, ][+, or unenhanced //e.-->
+ <!-- "Apple How To: Lessons in Computing and Calculating" is a 1980 educational program developed by Bruce Tognazzini and distributed by Apple Computer. This is version 1.0. It is preserved here for the first time. Due to compatibility issues unrelated to copy protection, it only runs on an original Apple ][, ][+, or unenhanced //e. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35625,7 +15467,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>Mind Games</publisher>
<info name="release" value="2021-04-12"/>
- <!--"The Desecration" is a 1982 adventure game developed and distributed by Mind Games.-->
+ <!-- "The Desecration" is a 1982 adventure game developed and distributed by Mind Games. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35637,10 +15479,11 @@ license:CC0-1.0
<software name="jatblock">
<description>Just Around The Block (cleanly cracked)</description>
<year>1987</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2021-04-18"/>
- <info name="programmer" value="Rob Shaver and Peter Andrews"/>
- <!--"Just Around The Block" is a 1987 educational game developed by Rob Shaver and Peter Andrews, and distributed by D.C. Heath. It is preserved here for the first time.-->
+ <info name="programmer" value="Rob Shaver" />
+ <info name="programmer" value="Peter Andrews" />
+ <!-- "Just Around The Block" is a 1987 educational game developed by Rob Shaver and Peter Andrews, and distributed by D.C. Heath. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program disk"/>
@@ -35661,7 +15504,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Harvest Computer Systems</publisher>
<info name="release" value="2021-04-22"/>
- <!--"Depreciation Log" is a 1985 productivity program developed by Gary Randolph and distributed by Harvest Computer Systems. It is preserved here for the first time.-->
+ <!-- "Depreciation Log" is a 1985 productivity program developed by Gary Randolph and distributed by Harvest Computer Systems. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35676,7 +15519,7 @@ license:CC0-1.0
<publisher>Utopia Software Development</publisher>
<info name="release" value="2021-04-22"/>
<info name="usage" value="Requires an Apple Graphics Tablet or compatible hardware" />
- <!--"Utopia Graphics Tablet System" is a 1980 graphics program developed and distributed by Utopia Software Development. It requires an Apple Graphics Tablet or compatible hardware. It is preserved here for the first time.-->
+ <!-- "Utopia Graphics Tablet System" is a 1980 graphics program developed and distributed by Utopia Software Development. It requires an Apple Graphics Tablet or compatible hardware. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35685,27 +15528,12 @@ license:CC0-1.0
</part>
</software>
- <software name="tdyply89">
- <description>Teddy's Playground (1989 Re-release) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2021-04-26"/>
- <info name="programmer" value="Donna Stanger and Lon Koenig"/>
- <!--"Teddy's Playground" is a 1985 educational program developed by Donna Stanger and Lon Koenig, and distributed by Sunburst Communications. This is the 1989 re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="teddy's playground 1989 (4am crack).dsk" size="143360" crc="80deccb7" sha1="bfa611ba323010c24b7c84c0311baf0bb95d6218"/>
- </dataarea>
- </part>
- </software>
-
<software name="martgm12">
<description>Mastery Arithmetic Games (version 1.2) (cleanly cracked)</description>
<year>1986</year>
<publisher>Mastery Development</publisher>
<info name="release" value="2021-04-28"/>
- <!--"Mastery Arithmetic Games" is a 1986 educational program developed and distributed by Mastery Development. This is version 1.2. It is preserved here for the first time.-->
+ <!-- "Mastery Arithmetic Games" is a 1986 educational program developed and distributed by Mastery Development. This is version 1.2. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -35726,8 +15554,12 @@ license:CC0-1.0
<year>1985</year>
<publisher>American Guidance Service</publisher>
<info name="release" value="2021-04-28"/>
- <info name="programmer" value="B. Maxwell, B. Thompson, J. Chaffin, D. D. Smith, and J. O. Smith"/>
- <!--"SocMate Analogies Games" is a 1985 educational program developed by B. Maxwell, B. Thompson, J. Chaffin, D. D. Smith, and J. O. Smith, and distributed by American Guidance Service. It is preserved here for the first time.-->
+ <info name="programmer" value="B. Maxwell" />
+ <info name="programmer" value="B. Thompson" />
+ <info name="programmer" value="J. Chaffin" />
+ <info name="programmer" value="D. D. Smith" />
+ <info name="programmer" value="J. O. Smith" />
+ <!-- "SocMate Analogies Games" is a 1985 educational program developed by B. Maxwell, B. Thompson, J. Chaffin, D. D. Smith, and J. O. Smith, and distributed by American Guidance Service. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35741,7 +15573,7 @@ license:CC0-1.0
<year>1987</year>
<publisher>Box Office</publisher>
<info name="release" value="2021-05-09"/>
- <!--"Chess, Checkers, and Backgammon" is a 1987 compilation of board games developed and distributed by Box Office. It is preserved here for the first time.-->
+ <!-- "Chess, Checkers, and Backgammon" is a 1987 compilation of board games developed and distributed by Box Office. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35755,7 +15587,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>Sogiciel</publisher>
<info name="release" value="2021-05-17"/>
- <!--"Le Choc des Multinationales" is a 1982 French simulation game developed and distributed by Sogiciel.-->
+ <!-- "Le Choc des Multinationales" is a 1982 French simulation game developed and distributed by Sogiciel. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35764,47 +15596,12 @@ license:CC0-1.0
</part>
</software>
- <software name="lalmonop">
- <description>L. A. Land Monopoly (cleanly cracked)</description>
- <year>1980</year>
- <publisher>Continental Software</publisher>
- <info name="release" value="2021-05-17"/>
- <!--"L. A. Land Monopoly" is a 1980 board game developed by Jeff Stanton and distributed by Continental Software.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="l. a. land monopoly (4am and san inc crack).dsk" size="143360" crc="1343945f" sha1="12cc537abbe9da06fa6d9802d47096aa9523c0c6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="anltut87">
- <description>Analogies Tutorial (version 12.15.87) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-05-17"/>
- <!--"Analogies Tutorial" is a 1983 educational program developed and distributed by Hartley Courseware. This updated version, dated December 15, 1987, is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="analogies tutorial v12.15.87 (4am crack) side a.dsk" size="143360" crc="fa2036cd" sha1="f1927b777d150dbc1343e78023cf7148fb314547"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="analogies tutorial v12.15.87 (4am crack) side b.dsk" size="143360" crc="283b3b33" sha1="3cebf89919243d5f4ff4cd64f7f935e504f8ede3"/>
- </dataarea>
- </part>
- </software>
-
<software name="decpcdpp">
<description>Decimals and Percent: Decimals Practice Problems (cleanly cracked)</description>
<year>1981</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2021-05-18"/>
- <!--"Decimals and Percent: Decimals Practice Problems" is a 1981 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time.-->
+ <!-- "Decimals and Percent: Decimals Practice Problems" is a 1981 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35818,7 +15615,7 @@ license:CC0-1.0
<year>1980</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2021-05-18"/>
- <!--"Hand Holding BASIC" is a 1980 educational program developed by Neil Bennett and distributed by Apple Computer. It is preserved here for the first time.-->
+ <!-- "Hand Holding BASIC" is a 1980 educational program developed by Neil Bennett and distributed by Apple Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35832,7 +15629,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>American Educational Computer</publisher>
<info name="release" value="2021-05-18"/>
- <!--"Dragon Games" is a 1982 educational program developed and distributed by American Educational Computer. It is preserved here for the first time.-->
+ <!-- "Dragon Games" is a 1982 educational program developed and distributed by American Educational Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -35841,103 +15638,12 @@ license:CC0-1.0
</part>
</software>
- <software name="bmblgm13">
- <description>Bumble Games (version 1.3) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-06-03"/>
- <!--"Bumble Games" is a 1982 educational program developed by Leslie Grimm, illustrated by Corinne Grimm, and distributed by The Learning Company. This is version 1.3. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bumble games v1.3 (4am and san inc crack).dsk" size="143360" crc="6636a469" sha1="59badccd350a2c82d6a0140b628a042997b8c88e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rrbit10">
- <description>Reader Rabbit (version 1.0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-06-03"/>
- <!--"Reader Rabbit" is a 1984 educational program developed by Leslie Grimm, illustrated by Corinne and Cindy Grimm, and distributed by The Learning Company. This is version 1.0. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="reader rabbit v1.0 (4am and san inc crack).dsk" size="143360" crc="9033d75d" sha1="fd19516c3a995ed96026e0463030ce6028c07d47"/>
- </dataarea>
- </part>
- </software>
-
- <software name="bumblp11">
- <description>Bumble Plot (version 1.1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-06-06"/>
- <!--"Bumble Plot" is a 1982 educational game developed by Leslie Grimm, illustrated by Corinne Grimm, and distributed by The Learning Company. This is version 1.1. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bumble plot v1.1 (4am and san inc crack).dsk" size="143360" crc="1a360981" sha1="7675056caea06ca067bb576d835207e1885d68fa"/>
- </dataarea>
- </part>
- </software>
-
- <software name="gertrudep82">
- <description>Gertrude's Puzzles (1982 Version) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-06-06"/>
- <!--"Gertrude's Puzzles" is a 1982 educational game developed by Teri Perl, Leslie Grimm and Warren Robinett, and distributed by The Learning Company. This early version has no visible version number and is only distinguishable by its copy protection. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's puzzles 1982 (4am and san inc crack).dsk" size="143360" crc="4584488c" sha1="3bb9f19e91b62935cf95c559fd683e08033dc532"/>
- </dataarea>
- </part>
- </software>
-
- <software name="gertrudesec82">
- <description>Gertrude's Secrets 1982 (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-06-06"/>
- <!--"Gertrude's Secrets" is a 1982 educational game developed by Teri Perl, Leslie Grimm and Warren Robinett, and distributed by The Learning Company. This early version has no visible version number and is only distinguishable by its copy protection. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="gertrude's secrets 1982 (4am and san inc crack).dsk" size="143360" crc="0d53b68c" sha1="1ae15f7b76b4324f979c533b67aa63ab9169b631"/>
- </dataarea>
- </part>
- </software>
-
- <software name="taldiscv">
- <description>Tales of Discovery (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2021-06-06"/>
- <!--"Tales of Discovery" is a 1984 pair of adventure games developed by Dan Klassen, David G. Olmon, Amy McKinley, Deborah Kovacs, Loretta Jones, Maryellen Kohn, Jeffrey Siegel, Andrew Ragan, and Susan Edwards, and distributed by Scholastic. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of discovery (4am and san inc crack) side a.dsk" size="143360" crc="a3feb079" sha1="e670a5ea6584e98cad5a56563aecb0f5d8fbe3e3"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="tales of discovery (4am and san inc crack) side b.dsk" size="143360" crc="22a0b7c9" sha1="e840ad24ab23df0723ba2f409ec57b3bcf3cbae9"/>
- </dataarea>
- </part>
- </software>
-
<software name="pforth30">
<description>PAI Forth (version 3.0, 12-21-1985) (cleanly cracked)</description>
<year>1985</year>
<publisher>Prentice Associates Incorporated</publisher>
<info name="release" value="2021-06-10"/>
- <!--"PAI Forth" is a 1985 development program. This is version 3.0. It is preserved here for the first time.-->
+ <!-- "PAI Forth" is a 1985 development program. This is version 3.0. It is preserved here for the first time. -->
<!-- It is uncertain as of now whether this was used internally or released. More research is required. - FH -->
<part name="flop1" interface="floppy_5_25">
@@ -35947,351 +15653,12 @@ license:CC0-1.0
</part>
</software>
- <software name="rboots82">
- <description>Rocky's Boots (Unknown 1982 version) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-06-10"/>
- <!--"Rocky's Boots" is a 1982 educational game developed by Teri Perl, Leslie Grimm and Warren Robinett, and distributed by The Learning Company. This early version has no visible version number and is only distinguishable by its copy protection. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rocky's boots 1982 (4am and san inc crack).dsk" size="143360" crc="887947a7" sha1="4e3bdda73af0c1069a768a64f32754556c40d223"/>
- </dataarea>
- </part>
- </software>
-
- <software name="prsnr110s">
- <description>The Prisoner (version 1.10) (SoftSmith) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-10"/>
- <!--"The Prisoner" is a 1980 adventure game developed by Edu-Ware. This is version 1.10, re-released by SoftSmith. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the prisoner v1.10 (softsmith) (4am and san inc crack).dsk" size="143360" crc="cfb731df" sha1="16e9ff900df3bab5ab9c516325d2cd5729636698"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssastatk">
- <description>Astro Attack (SoftSmith) (cleanly cracked)</description>
- <year>????</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"Astro Attack" is an action game published by SoftSmith. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="astro attack (softsmith) (4am and san inc crack).dsk" size="143360" crc="1b3ca0e0" sha1="9b4ff6b17ef8494dfe8ed242ec08c90873e50ea4"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sssplmst">
- <description>Spell Master (version 1.3.1) (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"Spell Master" is a 1982 educational program developed by Edu-Ware Services. This is the SoftSmith re-release, based on version 1.3.1. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="spell master (softsmith) (4am and san inc crack) - disk 1 - program.dsk" size="143360" crc="dc8ab97e" sha1="5fc44198d1e93dd4a20df7fd28f562cc527ff0db"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data disk level 4"/>
- <dataarea name="flop" size="143360">
- <rom name="spell master (softsmith) (4am and san inc crack) - disk 2 - data disk level 4.dsk" size="143360" crc="73681f8a" sha1="e5ee724e7ed29e33ac7791294811cd2dd057cb57"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Data disk level 5"/>
- <dataarea name="flop" size="143360">
- <rom name="spell master (softsmith) (4am and san inc crack) - disk 3 - data disk level 5.dsk" size="143360" crc="9cb50d28" sha1="c9bfeb39d43164666a5830877db5e1dcb3c5970b"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Data disk level 6"/>
- <dataarea name="flop" size="143360">
- <rom name="spell master (softsmith) (4am and san inc crack) - disk 4 - data disk level 6.dsk" size="143360" crc="263ef5b1" sha1="16ff889149fe9787ecbe8ae6f999f0b3d6d76741"/>
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 - Data disk level 7"/>
- <dataarea name="flop" size="143360">
- <rom name="spell master (softsmith) (4am and san inc crack) - disk 5 - data disk level 7.dsk" size="143360" crc="c2ed9fd0" sha1="a13509e10dcb848aa7547df9f0c8fefe1dee6743"/>
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 - Data disk level 8"/>
- <dataarea name="flop" size="143360">
- <rom name="spell master (softsmith) (4am and san inc crack) - disk 6 - data disk level 8.dsk" size="143360" crc="6e8030a5" sha1="360995dcbe12632071c9e434e5cb258e22899993"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssdnrdsk">
- <description>Dinner on a Disk (SoftSmith) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"Dinner on a Disk" is a 1981 educational program developed by Henny Hall. This is the SoftSmith re-release.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dinner on a disk (softsmith) (4am and san inc crack).dsk" size="143360" crc="ec222a42" sha1="b1ea957c94a7b6b6b0c14e75b98f80f56e2d6b10"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssbarmte">
- <description>Micro Barmate (version 1.0) (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"Micro Barmate" is a 1982 educational program developed by Virtual Combinatorics. This is the SoftSmith re-release, based on version 1.0. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="micro barmate (softsmith) (4am and san inc crack) disk 1 - program disk.dsk" size="143360" crc="ae3ffc60" sha1="9a8d27eef761ddee2539afb00df31123fd76daf2"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Recipe disk"/>
- <dataarea name="flop" size="143360">
- <rom name="micro barmate (softsmith) (4am and san inc crack) disk 2 - recipe disk.dsk" size="143360" crc="fda44cc2" sha1="545380d53bad9a38197992c07b31a5697c3bf066"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssmthskl">
- <description>Math Skills (version 1.3) (SoftSmith) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"Math Skills" is a 1981 educational program developed by Edu-Ware Services. This is the SoftSmith re-release, based on version 1.3. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="math skills (softsmith) (4am and san inc crack).dsk" size="143360" crc="8374635f" sha1="1812b3e98eb8a975071cf0db6159c76ff3defe63"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sslogomn">
- <description>LogoMotion (version 1.2) (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"LogoMotion" is a 1982 programming environment developed by Terrapin, Inc. This is the SoftSmith re-release, based on version 1.2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="logomotion v1.2 (softsmith) (4am and san inc crack) disk 1 - program.dsk" size="143360" crc="ef0e3ee0" sha1="8793abcd56b6d5aa8077ed00f7018ef09ea5943a"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Utilities disk"/>
- <dataarea name="flop" size="143360">
- <rom name="logomotion v1.2 (softsmith) (4am and san inc crack) disk 2 - utilities.dsk" size="143360" crc="760ebcd7" sha1="11d517e95eb7ead1ad09f3fcd7a1ebc6b5c3d3b5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssccrlye">
- <description>Cross Country Rallye (Softsmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Cross Country Rallye" is a 1982 action game developed by Bob Carter. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cross country rallye (softsmith) (4am and san inc crack).dsk" size="143360" crc="eaefd387" sha1="129ce296dc6b6d4c57518d71f538a36f7a4837aa"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssbugbytr">
- <description>Bugbyter (version 1.11) (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Bugbyter" is a 1982 development program developed by Ted Cohn and Pete Rowe. This is the SoftSmith re-release of version 1.11. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bugbyter (softsmith) (4am and san inc crack).dsk" size="143360" crc="24dc0c8f" sha1="2e28ec886bc4b11ed2d252aa5eb6c1e0485b3d4d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssmdnmld">
- <description>Midnight Malady (SoftSmith) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Midnight Malady" is a 1981 adventure game developed by Steven Sacks. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="midnight malady (4am and san inc crack).dsk" size="143360" crc="343ab816" sha1="8dc6500ddea01ba83bd0294dad301c12459478e9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssmummyc">
- <description>Mummy's Curse (SoftSmith) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-28"/>
- <!--"Mummy's Curse" is a 1981 adventure game developed by Highlands Computers. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mummy's curse (softsmith) (4am and san inc crack).dsk" size="143360" crc="57d3132c" sha1="69fb5a48a9a592d11795ed596fe77db7f5b24c08"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sslzmaze">
- <description>Lazer Maze (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Lazer Maze" is a 1982 board game developed by James D. Spain. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lazer maze (softsmith) (4am and san inc crack).dsk" size="143360" crc="2e02590f" sha1="973de2770cbe37f8ac6449e3da2d364dbb40a0e6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sssuprmp">
- <description>Supermap (SoftSmith) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Supermap" is a 1983 educational game developed by Sonoma Softworks. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="supermap (softsmith) (4am and san inc crack).dsk" size="143360" crc="d1b8f173" sha1="a3ce2a132cfc51075d2d9a7aad587ff33f190514"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssguardn">
- <description>Guardian (SoftSmith) (cleanly cracked)</description>
- <year>????</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Guardian" is an action game published by SoftSmith. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="guardian (softsmith) (4am and san inc crack).dsk" size="143360" crc="4efd71e5" sha1="e81562c6b8866d5a5d3c0235b4c800d0d4754811"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssgameus">
- <description>Game of the U.S. (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Game of the U.S." is a 1982 educational game developed by Cecil Andrews. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="game of the u.s. (softsmith) (4am and san inc crack).dsk" size="143360" crc="5f7b8fd6" sha1="25d1e5d3d3debbf95ed820654f20690a8d48b35a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sslalmon">
- <description>L.A. Land Monopoly (SoftSmith) (cleanly cracked)</description>
- <year>1980</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"L.A. Land Monopoly" is a 1980 board game developed by Jeff Stanton. This is the SoftSmith re-release.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="l.a. land monopoly (softsmith) (4am and san inc crack).dsk" size="143360" crc="3647c18b" sha1="7bfbfea61609d8eaa0172293909cfb0766875f29"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sscsmcbt">
- <description>Cosmic Combat (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Cosmic Combat" is a 1982 action game developed by Highland Computer Services. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="cosmic combat (softsmith) (4am and san inc crack).dsk" size="143360" crc="977ec4f7" sha1="a20fa81d6d5948bbc72a6956414216257f065b79"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sscrtvnt">
- <description>Creature Venture (SoftSmith) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Creature Venture" is a 1981 adventure game developed by Highland Computer Services. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="creature venture (softsmith) (4am and san inc crack).dsk" size="143360" crc="7fd8e180" sha1="135dba416a0d32ed1ecd3f790c78843e268db11d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sslzsilk">
- <description>Lazer Silk (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-06-26"/>
- <!--"Lazer Silk" is a 1982 action game developed by Eric Knopp. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="lazer silk (softsmith) (4am and san inc crack).dsk" size="143360" crc="395f1f6f" sha1="2cb4a546dbe72238b7f973ddc068bdda26c3aa82"/>
- </dataarea>
- </part>
- </software>
-
- <software name="dskdrctr">
- <description>Disk Director (SoftSmith) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-07-03"/>
- <!--"Disk Director" is a 1983 set of disk utilities developed by Sensible Software. This is the SoftSmith re-release. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="disk director (softsmith) (4am and san inc crack).dsk" size="143360" crc="a8722aba" sha1="cad9258dd20090f3d463aaa0f2dfd5fdad6c180c"/>
- </dataarea>
- </part>
- </software>
-
<software name="pfootpps">
<description>Pro Football Pointspread Prediction System (cleanly cracked)</description>
<year>1982</year>
<publisher>Systems Design Lab</publisher>
<info name="release" value="2021-07-05"/>
- <!--"Pro Football Pointspread Prediction System" is a 1982 sports program developed by Ken Perry and distributed by Systems Design Lab. It is preserved here for the first time.-->
+ <!-- "Pro Football Pointspread Prediction System" is a 1982 sports program developed by Ken Perry and distributed by Systems Design Lab. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - System disk"/>
@@ -36307,159 +15674,12 @@ license:CC0-1.0
</part>
</software>
- <software name="bmblgm14">
- <description>Bumble Games (version 1.4) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Bumble Games" is a 1982 educational game developed by Leslie Grimm, illustrated by Corinne Grimm, and distributed by The Learning Company. This is version 1.4. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="bumble games v1.4 (4am and san inc crack).dsk" size="143360" crc="ea34ac74" sha1="253236c6da94ed7939afe551685d96d3747738ba"/>
- </dataarea>
- </part>
- </software>
-
- <software name="tapshai4">
- <description>Temple of Apshai rev. 4 (cleanly cracked)</description>
- <year>1979</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Temple of Apshai" is a 1979 roleplaying game designed by Jon Freeman and Jeff Johnson, ported to the Apple II by Michael Farren, and distributed by Automated Simulations. This is the fourth revision.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="temple of apshai rev. 4 (4am and san inc crack).dsk" size="143360" crc="b79ef05c" sha1="37055324e27e563a8e783d31b73f182265ed8aa6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="advdbl2">
- <description>Adventure Double Feature Volume II (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Adventure Double Feature Volume II" is a 1984 pair of adventure games developed by Dan Klassen, David G. Olmon, Pat Relf, Loretta Jones, Deborah Kovacs, Maryellen Kohn, Jeffrey Siegel, Andrew Ragan, Susan Edwards, and Amy McKinley, and distributed by Scholastic.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="adventure double feature volume ii (4am and san inc crack) side a.dsk" size="143360" crc="a23d19ed" sha1="30aa8f1fd09356aeb1e716efc24e83f61085aeb5"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="adventure double feature volume ii (4am and san inc crack) side b.dsk" size="143360" crc="1d155dc9" sha1="a1924e1b6440c222e312b512273788e961a4832b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="moptp81">
- <description>Moptown Parade (1981 Version) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>The Learning Company</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Moptown Parade" is a 1981 educational game developed by Leslie Grimm, illustrated by Corinne Grimm, and distributed by The Learning Company. This is the 1981 release.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="moptown parade 1981 (4am and san inc crack).dsk" size="143360" crc="aa354a32" sha1="8830f3f7b9b19c0d7e188878f7b7e6c7b89d45ab"/>
- </dataarea>
- </part>
- </software>
-
- <software name="crush681">
- <description>Crush, Crumble and Chomp! (1981-06-22 Version) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Crush, Crumble and Chomp!" is a 1981 simulation game designed by Jon Freeman and Jim Connelley, and distributed by Automated Simulations. This version is dated June 22, 1981.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="crush, crumble and chomp 1981-06-22 (4am and san inc crack).dsk" size="143360" crc="d39ad177" sha1="21b9d99e8bbbe459ba5b60ecbb7baad65bb84591"/>
- </dataarea>
- </part>
- </software>
-
- <software name="conput83">
- <description>Con-Putation (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Softsmith</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Con-Putation" is a 1980 educational game developed by T.H.E.S.I.S.. This is the 1983 Softsmith re-release.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="con-putation (4am and san inc crack).dsk" size="143360" crc="d6ae1de7" sha1="7cb2780b8d5a26d9909924896345d115b69f6f61"/>
- </dataarea>
- </part>
- </software>
-
- <software name="dnkondsk">
- <description>Drinks on a Disk (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Drinks on a Disk" is a 1982 educational program developed by Henny Hall and published by SoftSmith. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="drinks on a disk (softsmith) (4am and san inc crack).dsk" size="143360" crc="91cc7c59" sha1="afdaf2649db01f07782a88be64b7f81c9134a136"/>
- </dataarea>
- </part>
- </software>
-
- <software name="frndolvr">
- <description>Friends or Lovers (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Friends or Lovers" is a 1982 educational program developed by Alpine Software and published by SoftSmith. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="friends or lovers (softsmith) (4am and san inc crack).dsk" size="143360" crc="8fad094b" sha1="edde096830d1434c90710ae9011525336b1a399d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ltlsplr">
- <description>Little Speller (version 2.0) (SoftSmith) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Little Speller" is a 1981 educational program developed by John R. Conrad. This is the SoftSmith re-release, based on version 2.0. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="little speller (softsmith) (4am and san inc crack).dsk" size="143360" crc="5b3c1772" sha1="1f5b7b8c1a88b64876dfd5fb032879550bcb3beb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="fnlfrntr">
- <description>The Final Frontier (version 1.0) (SoftSmith) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>SoftSmith</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"The Final Frontier" is a 1982 simulation game developed by Wes Huntress. This is the SoftSmith re-release, based on version 1.0. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the final frontier (softsmith) (4am and san inc crack).dsk" size="143360" crc="641a9d1c" sha1="4daec6541b8e65880b2d822eb4c9e797111a6040"/>
- </dataarea>
- </part>
- </software>
-
<software name="frmledgp">
<description>Farm Ledger Pro (cleanly cracked)</description>
<year>1983</year>
<publisher>Harvest Computer Systems</publisher>
<info name="release" value="2021-07-05"/>
- <!--"Farm Ledger Pro" is a 1983 productivity program developed by Gary Randolph, Rich Conrad, Sandra Rybolt, and Kenneth Vint, and distributed by Harvest Computer Systems. It is preserved here for the first time.-->
+ <!-- "Farm Ledger Pro" is a 1983 productivity program developed by Gary Randolph, Rich Conrad, Sandra Rybolt, and Kenneth Vint, and distributed by Harvest Computer Systems. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36468,26 +15688,12 @@ license:CC0-1.0
</part>
</software>
- <software name="pyobingo">
- <description>Print Your Own BINGO Plus (version 01.23.88) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-07-05"/>
- <!--"Print Your Own BINGO Plus" is a 1988 productivity program developed by Phil Mansour and distributed by Hartley Courseware. This version is dated 01.23.88. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="print your own bingo plus (4am crack).dsk" size="143360" crc="09c2e5af" sha1="7cc963fe89ef2683ef3b62a469e153a944ef97f6"/>
- </dataarea>
- </part>
- </software>
-
<software name="cdaiaddc">
<description>Computer Drill and Instruction: Addition C (cleanly cracked)</description>
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-23"/>
- <!--"Computer Drill and Instruction: Addition C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Addition C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36501,7 +15707,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Decimals C-1" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Decimals C-1" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36515,7 +15721,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Division C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Division C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36529,7 +15735,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Fractions C-1" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Fractions C-1" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36543,7 +15749,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Multiplication C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Multiplication C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36557,7 +15763,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Subtraction C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Subtraction C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36571,7 +15777,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Whole Numbers C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Whole Numbers C" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36585,7 +15791,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Science Research Associates</publisher>
<info name="release" value="2021-07-24"/>
- <!--"Computer Drill and Instruction: Teacher Utilities" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time.-->
+ <!-- "Computer Drill and Instruction: Teacher Utilities" is a 1981 educational program developed and distributed by Science Research Associates. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36594,33 +15800,12 @@ license:CC0-1.0
</part>
</software>
- <software name="antut0485">
- <description>Analogies Tutorial (version 04.25.85) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-07-23"/>
- <!--"Analogies Tutorial" is a 1983 educational game with content by Paul Fleischer and distributed by Hartley Courseware. This version, dated, 04.25.85, is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="analogies tutorial v04.25.85 (4am crack) disk 1.dsk" size="143360" crc="3ef60479" sha1="3175d88b91b99ce066f03b53bd0014a15dc12683"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="analogies tutorial v04.25.85 (4am crack) disk 2.dsk" size="143360" crc="b8249576" sha1="3464e39776baca3892f6ceaa88ddf7fffe8386f2"/>
- </dataarea>
- </part>
- </software>
-
<software name="willybyte">
<description>Willy Byte in the Digital Dimension (cleanly cracked)</description>
<year>1984</year>
<publisher>Data Trek</publisher>
<info name="release" value="2021-08-05"/>
- <!--"Willy Byte in the Digital Dimension" is a 1984 action game developed by Murray Krehbiel, illustrated by Greg Hammond, and distributed by Data Trek.-->
+ <!-- "Willy Byte in the Digital Dimension" is a 1984 action game developed by Murray Krehbiel, illustrated by Greg Hammond, and distributed by Data Trek. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -36641,7 +15826,7 @@ license:CC0-1.0
<year>1980</year>
<publisher>Micro Power and Light</publisher>
<info name="release" value="2021-08-06"/>
- <!--"Memory Myth" is a 1980 educational game developed and distributed by Micro Power and Light. It is preserved here for the first time.-->
+ <!-- "Memory Myth" is a 1980 educational game developed and distributed by Micro Power and Light. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -36650,466 +15835,12 @@ license:CC0-1.0
</part>
</software>
- <software name="capitpr1183">
- <description>Capitalization Practice (version 11.04.83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-08-13"/>
- <!--"Capitalization Practice" is a 1983 educational game developed and distributed by Hartley Courseware. This version is dated 11.04.83. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization practice v11.04.83 (4am crack).dsk" size="143360" crc="53dff049" sha1="ccf88c87529ba7a5c9c08b70754990976e334f1d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="capittst1183">
- <description>Capitalization Test (version 11.04.83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-08-13"/>
- <!--"Capitalization Test" is a 1983 educational program developed and distributed by Hartley Courseware. This version is dated 11.04.83. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="capitalization test v11.04.83 (4am crack).dsk" size="143360" crc="d81bb317" sha1="289215e24b7e977e1afbfe3e69ea16219cfc4cd9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="factsh0983">
- <description>Fact Sheets (version 09.19.83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-08-13"/>
- <!--"Fact Sheets" is a 1983 educational program developed and distributed by Hartley Courseware. This version is dated 09.19.83. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="fact sheets v09.19.83 (4am crack).dsk" size="143360" crc="3aa00c12" sha1="6d4f2f25dd453b657481a0e4f0cab83f07876d32"/>
- </dataarea>
- </part>
- </software>
-
- <software name="nounspro0983">
- <description>Nouns/Pronouns (version 09.19.83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-08-13"/>
- <!--"Nouns/Pronouns" is a 1983 educational program developed and distributed by Hartley Courseware. This version is dated 09.19.83. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="nouns-pronouns v09.19.83 (4am crack).dsk" size="143360" crc="1d6a528c" sha1="e3e7bc2b8de4f4ef2378e216ce1049bab3213753"/>
- </dataarea>
- </part>
- </software>
-
- <software name="hcwwwww1183">
- <description>Who-What-Where-When-Why (version 11.04.83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-08-16"/>
- <!--"Who-What-Where-When-Why" is a 1983 educational program developed and distributed by Hartley Courseware. This version is dated 11.04.83. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="who-what-where-when-why v11.04.83 (4am crack).dsk" size="143360" crc="466fb5a4" sha1="d57fcbf70be14cf52c27a69b6fafa667acec534b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="hcwordf1183">
- <description>Word Families (version 11.04.83) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-08-16"/>
- <!--"Word Families" is a 1983 educational program developed and distributed by Hartley Courseware. This version is dated 11.04.83. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word families v11.04.83 (4am crack).dsk" size="143360" crc="3bb55b31" sha1="36af60c1bbafccc4caa031a00da0664bca946dd4"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ssbaseb">
- <description>Street Sports Baseball (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-12-15"/>
- <!-- "Street Sports Baseball" is a 1987 sports game. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233452">
- <rom name="street sports baseball (4am crack).dsk" size="143360" crc="cc8d635a" sha1="15deea6d5c1974102d1dfef92279939ed2a60cbe" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssfootb">
- <description>Street Sports Football (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2018-09-20"/>
- <!-- "Street Sports Football" is a 1988 sports game developed by Paul Nickels, Michael Polan, and Kevin Quinlan. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="233487">
- <rom name="street sports football (4am crack) side a.dsk" size="143360" crc="33db53eb" sha1="0afbee6c35e83a1a22c00d9108548491983671c7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="233487">
- <rom name="street sports football (4am crack) side b.dsk" size="143360" crc="f3f60b56" sha1="cd04f6f2898c86d8a186e9160b1f12a89a694c05" />
- </dataarea>
- </part>
- </software>
-
- <software name="subatsim">
- <description>Sub Battle Simulator (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-07-28"/>
- <!-- "Sub Battle Simulator" is a 1986 simulation game developed by Digital Illusions. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="233456">
- <rom name="sub battle simulator (4am crack) side a.dsk" size="143360" crc="48b4c5b5" sha1="2f60262420104e7f93c9ff562100ab92f318b456" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="233456">
- <rom name="sub battle simulator (4am crack) side b.dsk" size="143360" crc="e46c7a02" sha1="113b1e87e2685dfcb40c4824e39362e5ac6bcff4" />
- </dataarea>
- </part>
- </software>
-
- <software name="sumrgame">
- <description>Summer Games (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-07-26"/>
- <!-- "Summer Games" is a 1984 sports game developed by Chuck Sommerville, Kevin McClard, Scott Nelson, Erin Murphy, Stephen Mudry, Brian McGhie, Stephen Landrum, Jon Leupp, and Randy Glover. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="233577">
- <rom name="summer games (4am crack) side a.dsk" size="143360" crc="c9206d00" sha1="333ef64b3f4e298b2a8932b2136340cba3f28a4a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="233577">
- <rom name="summer games (4am crack) side b.dsk" size="143360" crc="6111ca55" sha1="1583cb362351d052c78e8b9426fde56f4e80a1c3" />
- </dataarea>
- </part>
- </software>
-
- <software name="sumrgms2">
- <description>Summer Games II (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-09-05"/>
- <!-- "Summer Games II" is a 1985 sports game developed by John Stouffer, Greg Broniak, Vera Petrusha, Dr. Keith Dreyer, Jeff Webb, Tim Grost, Ken Evans, Doug Matson, Matt Decker, Pat Findling, and Chris Oesterling. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="234963">
- <rom name="summer games ii (4am crack) disk 1.dsk" size="143360" crc="20cab818" sha1="25b9ddc09c56ee6e0d785111aaf458c6cc676750" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="234963">
- <rom name="summer games ii (4am crack) disk 2.dsk" size="143360" crc="e32eec49" sha1="24fa696c3e00b0aa865df2a15016ba8dfc742418" />
- </dataarea>
- </part>
- </software>
-
- <software name="apshaitr">
- <description>Temple of Apshai Trilogy (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2017-05-16"/>
- <!-- "Temple of Apshai Trilogy" is a 1985 roleplaying game designed by Stephen Landrum, with graphics by Michael Kosaka. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233494">
- <rom name="temple of apshai trilogy (4am crack).dsk" size="143360" crc="73031a38" sha1="34128800bca3ba312a119ee718740b2c58110df8" />
- </dataarea>
- </part>
- </software>
-
- <software name="aawarsea">
- <description>The Ancient Art of War at Sea (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Broderbund Software</publisher>
- <info name="release" value="2019-08-20"/>
- <!-- "The Ancient Art of War at Sea" is a 1988 simulation game developed by Dave Murry and Barry Murry and distributed by Broderbund Software. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="235525">
- <rom name="the ancient art of war at sea (4am crack) side a.dsk" size="143360" crc="79caaf56" sha1="cb9f704d2b9acb86d18360c2e7776e89b5226d24" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="235525">
- <rom name="the ancient art of war at sea (4am crack) side b.dsk" size="143360" crc="2e2ca6d4" sha1="699798ce9e02d484b3dce48d27b5604eaf1ef6c5" />
- </dataarea>
- </part>
- </software>
-
- <software name="tgwinter">
- <description>The Games: Winter Edition (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2018-09-27"/>
- <!-- "The Games: Winter Edition" is a 1988 sports game. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A-1"/>
- <dataarea name="flop" size="143360">
- <rom name="the games - winter edition (4am crack) disk a-1.dsk" size="143360" crc="aea18ce0" sha1="89df683d7ae5b32aaab37e33dd531d99a8990ac4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk A-2"/>
- <dataarea name="flop" size="143360">
- <rom name="the games - winter edition (4am crack) disk a-2.dsk" size="143360" crc="c69ef96a" sha1="0f24b1c1a74f3f9b35f3364bd863a1cc6bfde837" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk B-1"/>
- <dataarea name="flop" size="143360">
- <rom name="the games - winter edition (4am crack) disk b-1.dsk" size="143360" crc="5b43f514" sha1="948ac42769ce66d1a1d20b5e5785742a907e768c" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk B-2"/>
- <dataarea name="flop" size="143360">
- <rom name="the games - winter edition (4am crack) disk b-2.dsk" size="143360" crc="4b10934f" sha1="f0fb5bef9000bb1c123fcc51e8bf74b09d79e9ef" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk C"/>
- <dataarea name="flop" size="143360">
- <rom name="the games - winter edition (4am crack) disk c.dsk" size="143360" crc="0bea31db" sha1="53cea5e0303a555f47c8173752f6798fca8d0f4f" />
- </dataarea>
- </part>
- </software>
-
- <software name="wgfbg">
- <description>The World's Greatest Football Game (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2018-12-19"/>
- <!-- "The World's Greatest Football Game" is a 1985 sports game developed by Nexa Corp. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest football game (4am crack) side a.dsk" size="143360" crc="b651c2ad" sha1="3cd5414d9552560271015195f8f79084a539abaf" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest football game (4am crack) side b.dsk" size="143360" crc="28f24cf1" sha1="806945532dd7af1b037aefb56ea2f3a06fa312fc" />
- </dataarea>
- </part>
- </software>
-
- <software name="wkchamp">
- <description>World Karate Championship (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-10-10"/>
- <!-- "World Karate Championship" is a 1986 sports game developed by Rebecca Heineman, with artwork by Mike Patrick and Mike Packard. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="world karate championship (4am crack).dsk" size="143360" crc="96a0d5c0" sha1="96500fb86cc2e910093d2d587b881a0ea234f8ce" />
- </dataarea>
- </part>
- </software>
-
- <software name="movimons">
- <description>The Movie Monster Game (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-05-06"/>
- <!-- It requires a 64K Apple //e, //c, or IIgs. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="233451">
- <rom name="the movie monster game (4am crack) side a.dsk" size="143360" crc="07f0eb72" sha1="ca7cb434f5d4a704db855a8bfb69c9ab5b3392c1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="233451">
- <rom name="the movie monster game (4am crack) side b.dsk" size="143360" crc="59b86d77" sha1="1eec4e0a6d7f09dd9be64b8f3c827c58f91abc69" />
- </dataarea>
- </part>
- </software>
-
- <software name="ricochet">
- <description>Ricochet (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2017-12-19"/>
- <!-- "Ricochet" is a 1982 arcade game developed by MindToys, published by Automated Simulations. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="ricochet (4am crack).dsk" size="143360" crc="92311921" sha1="766ad480f576dcc8f56afb848d8be03a2f201ab0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spidrbot">
- <description>Spiderbot (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-05-23"/>
- <!-- "Spiderbot" is a 1988 arcade game by Paul O'Malley of Prism Software; programmed by Richard Unruh, Ken Moore, Douglas Dragin, and Howard Scheer; graphics by by Brad Smith, Richard Unruh, Denny Thorley, and Howard Scheer; Apple II version by FACS Entertainment software; and distributed by Epyx, Inc. as part of their "MAXX OUT!" series. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="spiderbot (4am crack).dsk" size="143360" crc="ad3e39d4" sha1="d085d7b1acc249d59ded2ea570eb8e4985bc9fe2" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssbasktbl">
- <description>Street Sports Basketball (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-05-26"/>
- <!-- "Street Sports Basketball" is a 1987 arcade game distributed by Epyx, Inc. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="street sports basketball (4am crack) side a.dsk" size="143360" crc="3e8bb908" sha1="d86e3a98d9a4b46a996030508ab7957d3d02aec1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="street sports basketball (4am crack) side b.dsk" size="143360" crc="538f3ecb" sha1="df7adabeaee90c03d4b5cbbabba9f71710515d6a" />
- </dataarea>
- </part>
- </software>
-
- <software name="sssoccer">
- <description>Street Sports Soccer (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-07-22"/>
- <!-- "Street Sports Soccer" is a 1988 arcade game programmed by Paul R. Nickels and distributed by Epyx. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="street sports soccer (4am crack).dsk" size="143360" crc="bf278771" sha1="11631b48cb0b18a9e5fcc7980d66c43bcf80a2be" />
- </dataarea>
- </part>
- </software>
-
- <software name="svs3aa">
- <description>Spy vs. Spy III: Arctic Antics (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2017-07-18"/>
- <!-- "Spy vs. Spy III: Arctic Antics" is a 1987 arcade game. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="spy vs. spy iii - arctic antics (4am crack).dsk" size="143360" crc="98208443" sha1="6646b7a5ac8c4f24a52931a605e943c7175b6d4e" />
- </dataarea>
- </part>
- </software>
-
- <software name="tsnbaseb">
- <description>The Sporting News: Baseball (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2014-05-27"/>
- <!-- "The Sporting News Baseball" is a 1988 arcade game distributed by Epyx, Inc. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="234775">
- <rom name="the sporting news baseball (4am crack) side a.dsk" size="143360" crc="5e61f761" sha1="541ffb79035cf67bd0faab1d83371c9ea7855509" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="234775">
- <rom name="the sporting news baseball (4am crack) side b.dsk" size="143360" crc="5422fe67" sha1="92a910d72c83459a764f0850df448054364dd71a" />
- </dataarea>
- </part>
- </software>
-
- <software name="wgbb">
- <description>The World's Greatest Baseball Game (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Quest</publisher>
- <info name="release" value="2019-09-29"/>
- <!-- "The World's Greatest Baseball Game" is a a 1984 sports simulation distributed by Epyx. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Interactive and statistical game play"/>
- <dataarea name="flop" size="143360">
- <rom name="the world's greatest baseball game (4am crack).dsk" size="143360" crc="321fa87d" sha1="fea4c0afb38f06eb9a35843ef7dc7aefc38a334a" />
- </dataarea>
- </part>
- </software>
-
<software name="mmbiofact">
<description>Match Maker Biology Facts (cleanly cracked)</description>
<year>1984</year>
<publisher>American Educational Computer</publisher>
<info name="release" value="2021-09-19"/>
- <!--"Match Maker Biology Facts" is a 1984 educational program developed and distributed by American Educational Computer.-->
+ <!-- "Match Maker Biology Facts" is a 1984 educational program developed and distributed by American Educational Computer. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37123,7 +15854,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Accolade</publisher>
<info name="release" value="2021-09-19"/>
- <!--"The Dam Busters" is a 1985 action game developed by Jeff Sember, Mike Benna, and Don Mattrick, and distributed by Accolade.-->
+ <!-- "The Dam Busters" is a 1985 action game developed by Jeff Sember, Mike Benna, and Don Mattrick, and distributed by Accolade. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37132,33 +15863,12 @@ license:CC0-1.0
</part>
</software>
- <software name="scruples">
- <description>A Question of Scruples (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Leisure Genius</publisher>
- <info name="release" value="2021-09-23"/>
- <!--"A Question of Scruples" is a 1988 board game developed by Sentient Software and distributed by Leisure Genius.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="a question of scruples (4am crack) - disk a (program disk).dsk" size="143360" crc="aaec2b02" sha1="a9cd29b0b2aecf4dd9775dfc4ccaaf03392bcd06"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B - Questions disk"/>
- <dataarea name="flop" size="143360">
- <rom name="a question of scruples (4am crack) - disk b (questions disk).dsk" size="143360" crc="33c1767c" sha1="544768e88fe46690b40f218dc7d43720015babdc"/>
- </dataarea>
- </part>
- </software>
-
<software name="basicsbasic">
<description>The Basics of BASIC (cleanly cracked)</description>
<year>1983</year>
<publisher>Focus Media</publisher>
<info name="release" value="2021-09-25"/>
- <!--"The Basics of BASIC" is a 1983 educational program developed by Scot Robinson and Neil R. Rader, and distributed by Focus Media. It is preserved here for the first time.-->
+ <!-- "The Basics of BASIC" is a 1983 educational program developed by Scot Robinson and Neil R. Rader, and distributed by Focus Media. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
@@ -37186,26 +15896,12 @@ license:CC0-1.0
</part>
</software>
- <software name="bldrdash2">
- <description>Boulder Dash II (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="release" value="2021-09-09"/>
- <!--"Boulder Dash II" is a 1986 action game developed by First Star Software and distributed by Electronic Arts.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="boulder dash ii (4am and san inc crack).dsk" size="143360" crc="3f7b11ba" sha1="e8f951750c14dc0fb2f7a8ae111308c88d688bee"/>
- </dataarea>
- </part>
- </software>
-
<software name="apescape">
<description>Ape Escape (cleanly cracked)</description>
<year>1984</year>
<publisher>Howard W. Sams</publisher>
<info name="release" value="2021-09-09"/>
- <!--"Ape Escape" is a 1984 action game developed by Kevin Bagley and distributed by Howard W. Sams.-->
+ <!-- "Ape Escape" is a 1984 action game developed by Kevin Bagley and distributed by Howard W. Sams. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37219,7 +15915,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Avant-Garde Creations</publisher>
<info name="release" value="2021-09-09"/>
- <!--"Trompers" is a 1983 action game developed by Erik Bollt and distributed by Avant-Garde Creations.-->
+ <!-- "Trompers" is a 1983 action game developed by Erik Bollt and distributed by Avant-Garde Creations. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37233,7 +15929,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Blue Chip Software</publisher>
<info name="release" value="2021-09-09"/>
- <!--"Squire: The Financial Planning Simulation" is a 1984 simulation game developed by Jim Zuber and distributed by Blue Chip Software. This is version 1.0.-->
+ <!-- "Squire: The Financial Planning Simulation" is a 1984 simulation game developed by Jim Zuber and distributed by Blue Chip Software. This is version 1.0. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -37254,7 +15950,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>Recreational Technology</publisher>
<info name="release" value="2021-09-09"/>
- <!--"Interlude II" is a 1986 program developed and distributed by Recreational Technology.-->
+ <!-- "Interlude II" is a 1986 program developed and distributed by Recreational Technology. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -37275,7 +15971,7 @@ license:CC0-1.0
<year>1988</year>
<publisher>Buena Vista Software</publisher>
<info name="release" value="2021-09-09"/>
- <!--"Who Framed Roger Rabbit" is a 1988 action game designed by Eric Daniels and Reichart Von Wolfshield, and distributed by Buena Vista Software.-->
+ <!-- "Who Framed Roger Rabbit" is a 1988 action game designed by Eric Daniels and Reichart Von Wolfshield, and distributed by Buena Vista Software. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A"/>
@@ -37303,40 +15999,12 @@ license:CC0-1.0
</part>
</software>
- <software name="logicbld">
- <description>Logic Builders (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="release" value="2021-09-09"/>
- <!--"Logic Builders" is a 1984 educational game developed by Methods &amp; Solutions and distributed by Scholastic.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="logic builders (4am and san inc crack).dsk" size="143360" crc="fe027324" sha1="f8657baadef5c3e4f10b50b2a751222169a2008a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="popnsplr2">
- <description>Pop 'R Spell (Rev 2) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Milliken Publishing</publisher>
- <info name="release" value="2021-09-09"/>
- <!--"Pop 'R Spell and Pop 'R Spell Challenge" is a 1983 educational game developed and distributed by Milliken Publishing. This is an undated revision that fixes an off-by-1 error.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pop 'r spell and pop 'r spell challenge rev. 2 (4am crack).dsk" size="143360" crc="bfd30521" sha1="842e89724fa646efb0eae1dd2ab67125800ebc7f"/>
- </dataarea>
- </part>
- </software>
-
<software name="serendip">
<description>Serendipity (cleanly cracked)</description>
<year>1983</year>
<publisher>K-12 MicroMedia</publisher>
<info name="release" value="2021-09-16"/>
- <!--"Serendipity" is a 1983 educational program developed by Dynacomp and distributed by K-12 MicroMedia. It is preserved here for the first time.-->
+ <!-- "Serendipity" is a 1983 educational program developed by Dynacomp and distributed by K-12 MicroMedia. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37345,54 +16013,12 @@ license:CC0-1.0
</part>
</software>
- <software name="inca">
- <description>Inca (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2021-09-17"/>
- <!--"Inca" is a 1985 adventure game developed by Joe Emerson and Ken Smith, and distributed by Hayden Software.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="inca (4am crack) side a.dsk" size="143360" crc="622c8e05" sha1="52f15fff82587642fecc73342139260cb12f025e"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="inca (4am crack) side b.dsk" size="143360" crc="32d9ef26" sha1="827d2c6c8e93731d1f8b52e5ae3d1ac8fa4754f7"/>
- </dataarea>
- </part>
- </software>
-
- <software name="hlygrail">
- <description>The Holy Grail (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hayden Software</publisher>
- <info name="release" value="2021-09-17"/>
- <!--"The Holy Grail" is a 1985 adventure game developed by Joe Emerson and Ken Smith, and distributed by Hayden Software.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="the holy grail (4am crack) side a.dsk" size="143360" crc="25da1ecc" sha1="40b0ee95721d8540fedc0142046aad10131f72c7"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="the holy grail (4am crack) side b.dsk" size="143360" crc="9f63ad15" sha1="77e377fe95af1dc4898e159a8e6ded37d440c275"/>
- </dataarea>
- </part>
- </software>
-
<software name="readctar">
<description>How to Read in the Content Areas (cleanly cracked)</description>
<year>????</year>
<publisher>American Educational Computer</publisher>
<info name="release" value="2021-09-19"/>
- <!--"How to Read in the Content Areas" is an educational program developed and distributed by American Educational Computer. It is preserved here for the first time.-->
+ <!-- "How to Read in the Content Areas" is an educational program developed and distributed by American Educational Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37406,7 +16032,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Courses By Computers</publisher>
<info name="release" value="2021-09-19"/>
- <!--"Mixed Number Concepts" is a 1985 educational program developed and distributed by Courses By Computers. It is preserved here for the first time.-->
+ <!-- "Mixed Number Concepts" is a 1985 educational program developed and distributed by Courses By Computers. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Lessons"/>
@@ -37427,7 +16053,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>Robert Scott Enterprises</publisher>
<info name="release" value="2021-09-19"/>
- <!--"Conjecture" is a 1986 educational game developed by Robert Scott and distributed by Robert Scott Enterprises.-->
+ <!-- "Conjecture" is a 1986 educational game developed by Robert Scott and distributed by Robert Scott Enterprises. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Program disk"/>
@@ -37443,57 +16069,12 @@ license:CC0-1.0
</part>
</software>
- <software name="wntgames">
- <description>Winter Games (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="release" value="2016-07-26"/>
- <!-- "Winter Games" is a 1985 sports game developed by Action Graphics. -->
- <!-- Disks re-cracked on August 28th, 2021 due to subtle
- timing difference between Disk II and IWM hardware that resulted
- in the previous version not working on some machines. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="winter games (4am crack) side a.dsk" size="143360" crc="ad1360c5" sha1="d7c3b67d3ed5336f68a232eaa84a2766eabc4c1e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="winter games (4am crack) side b.dsk" size="143360" crc="b8d713fd" sha1="e2c6b9b0dfdf2f23c59c03ec803b0ffb79135482" />
- </dataarea>
- </part>
- </software>
-
- <software name="chcougk0386">
- <description>Chariots, Cougars, and Kings (version 03.12.86) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-11-27"/>
- <!--"Chariots, Cougars, and Kings" is a 1985 educational program developed by Janet Goldman and distributed by Hartley Courseware. This version is dated 03.12.86. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="chariots, cougars, and kings v03.12.86 (4am crack) disk 1.dsk" size="143360" crc="231d0e3c" sha1="92274c01c9e2d91a948189a2dbffc82ac6404f3b"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="chariots, cougars, and kings v03.12.86 (4am crack) disk 2.dsk" size="143360" crc="9ada44e6" sha1="c49515ef61a84c089484f667909017724edf6330"/>
- </dataarea>
- </part>
- </software>
-
<software name="lgwrkout">
<description>Logic Workout (cleanly cracked)</description>
<year>1983</year>
<publisher>Avant Garde</publisher>
<info name="release" value="2021-11-27"/>
- <!--"Logic Workout" is a 1983 educational program developed by Verma Jooste and distributed by Avant Garde. It is preserved here for the first time.-->
+ <!-- "Logic Workout" is a 1983 educational program developed by Verma Jooste and distributed by Avant Garde. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37507,7 +16088,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2021-11-27"/>
- <!--"Apple Project Manager" is a 1981 productivity program developed by Construction Programming Services and distributed by Apple Computer. It is preserved here for the first time.-->
+ <!-- "Apple Project Manager" is a 1981 productivity program developed by Construction Programming Services and distributed by Apple Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37516,96 +16097,12 @@ license:CC0-1.0
</part>
</software>
- <software name="amazwrds">
- <description>A-mazing Words (cleanly cracked)</description>
- <year>1985</year>
- <publisher>World Book</publisher>
- <info name="release" value="2021-11-28"/>
- <!--"A-mazing Words" is a 1985 educational program developed by Synergistic Software and distributed by World Book. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="a-mazing words (4am crack).dsk" size="143360" crc="2e7829ee" sha1="557999bc8ccdbd21dddd825f59ab3947dd02c62f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mghtmath">
- <description>Mighty Math (cleanly cracked)</description>
- <year>1985</year>
- <publisher>World Book</publisher>
- <info name="release" value="2021-11-28"/>
- <!--"Mighty Math" is a 1985 educational program developed by Synergistic Software and distributed by World Book. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mighty math (4am crack).dsk" size="143360" crc="cde288ce" sha1="f1eadcf76376196ebfd65e5921c71293549a2bf3"/>
- </dataarea>
- </part>
- </software>
-
- <software name="takenrth">
- <description>Take Me North (cleanly cracked)</description>
- <year>1985</year>
- <publisher>World Book</publisher>
- <info name="release" value="2021-11-28"/>
- <!--"Take Me North" is a 1985 educational program developed by Synergistic Software and distributed by World Book. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="take me north (4am crack).dsk" size="143360" crc="956ec497" sha1="8b6e02aef35c165b742efc7b0a4d96573a9e4309"/>
- </dataarea>
- </part>
- </software>
-
- <software name="spacport">
- <description>Space Port (cleanly cracked)</description>
- <year>1984</year>
- <publisher>World Book</publisher>
- <info name="release" value="2021-11-28"/>
- <!--"Space Port" is a 1984 educational program developed by Interactive Image Technologies and distributed by World Book. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="space port (4am crack).dsk" size="143360" crc="6c3ecdef" sha1="a51d6534737b539448dd8ea36999e0e4305d53fa"/>
- </dataarea>
- </part>
- </software>
-
- <software name="wrdplayr">
- <description>Word-Player (cleanly cracked)</description>
- <year>1985</year>
- <publisher>World Book</publisher>
- <info name="release" value="2021-11-28"/>
- <!--"Word-Player" is a 1985 educational program developed by Synergistic Software and distributed by World Book. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="word-player (4am crack).dsk" size="143360" crc="4aa95a21" sha1="3f99eb15c8adc83895f9ec1e8c38d2624907e6b5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="divdecim">
- <description>Dividing Decimals (version 1.1) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="release" value="2021-11-26"/>
- <!--"Dividing Decimals" is a 1985 educational program developed by Don Ross, written by Kevin Vessio, translated by Andrew Krainin, and distributed by Microcomputer Workshops Courseware. This is version 1.1. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dividing decimals v1.1 (4am crack).dsk" size="143360" crc="0c8442b6" sha1="d3a9e45e956f4eade3c52baee721c92574782524"/>
- </dataarea>
- </part>
- </software>
-
<software name="perpanic">
<description>Percentage Panic (cleanly cracked)</description>
<year>1987</year>
<publisher>Unicorn Software</publisher>
<info name="release" value="2021-11-26"/>
- <!--"Percentage Panic" is a 1987 educational program developed by Andrew Bagdanov, created by June S. Stark, illustrated by Joseph Hewitt IV, and distributed by Unicorn Software. It is preserved here for the first time.-->
+ <!-- "Percentage Panic" is a 1987 educational program developed by Andrew Bagdanov, created by June S. Stark, illustrated by Joseph Hewitt IV, and distributed by Unicorn Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37614,39 +16111,12 @@ license:CC0-1.0
</part>
</software>
- <software name="moonmadn">
- <description>Moonlight and Madness Level II (version 04.19.88) (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2021-11-26"/>
- <!--"Moonlight and Madness Level II" is a 1988 educational program developed by Learning Lab Publishing and distributed by Hartley Courseware. This version is dated 04.19.88. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="moonlight and madness ii v04.19.88 (4am crack) disk 1.dsk" size="143360" crc="885b9d0c" sha1="011b113410e9a4560b9093ceae39e6fd88d99996"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="moonlight and madness ii v04.19.88 (4am crack) disk 2.dsk" size="143360" crc="63f7d986" sha1="2fb30f458f67ff9a10c7dd66566302bd6741cbf3"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="moonlight and madness ii v04.19.88 (4am crack) disk 3.dsk" size="143360" crc="96df05d5" sha1="df6ea407fef43236841ccaeceb428fcd7464e1ad"/>
- </dataarea>
- </part>
- </software>
-
<software name="galwars">
<description>Galactic Wars (cleanly cracked)</description>
<year>1980</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2021-12-10"/>
- <!--"Galactic Wars" is a 1980 strategy game developed by Thomas M. Malinowski and distributed by Apple Computer. It is preserved here for the first time.-->
+ <!-- "Galactic Wars" is a 1980 strategy game developed by Thomas M. Malinowski and distributed by Apple Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37660,7 +16130,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2021-12-15"/>
- <!--"Circuit Analysis" is a 1981 educational program developed by A. F. Petrie and distributed by Apple Computer. It is preserved here for the first time.-->
+ <!-- "Circuit Analysis" is a 1981 educational program developed by A. F. Petrie and distributed by Apple Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37674,7 +16144,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>Prentice-Hall</publisher>
<info name="release" value="2021-12-20"/>
- <!--"Earth Science: Interplanetary Travel" is a 1986 educational program developed by Edunetics and distributed by Prentice-Hall. It is preserved here for the first time.-->
+ <!-- "Earth Science: Interplanetary Travel" is a 1986 educational program developed by Edunetics and distributed by Prentice-Hall. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
@@ -37707,7 +16177,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Krell Software</publisher>
<info name="release" value="2021-12-22"/>
- <!--"Isaac Newton and F.I.G. Newton" is a 1981 educational program developed and distributed by Krell Software. It is preserved here for the first time.-->
+ <!-- "Isaac Newton and F.I.G. Newton" is a 1981 educational program developed and distributed by Krell Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37721,7 +16191,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>George Earl</publisher>
<info name="release" value="2021-12-22"/>
- <!--"The German Hangman" (a.k.a. "German Practice") is a 1982 educational program developed and distributed by George Earl. It is preserved here for the first time.-->
+ <!-- "The German Hangman" (a.k.a. "German Practice") is a 1982 educational program developed and distributed by George Earl. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37735,7 +16205,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>The Avalon Hill Game Company</publisher>
<info name="release" value="2021-12-22"/>
- <!--"Legionnaire" is a 1982 strategy game developed and distributed by The Avalon Hill Game Company. It is preserved here for the first time.-->
+ <!-- "Legionnaire" is a 1982 strategy game developed and distributed by The Avalon Hill Game Company. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37749,7 +16219,7 @@ license:CC0-1.0
<year>1980</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2021-12-27"/>
- <!--"Bridge Tutor with Precision and Scientific Bidding" is a 1980 educational program developed by Alex Hanuse and distributed by Apple Computer. It is preserved here for the first time.-->
+ <!-- "Bridge Tutor with Precision and Scientific Bidding" is a 1980 educational program developed by Alex Hanuse and distributed by Apple Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Volume 1 Disk"/>
@@ -37770,7 +16240,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>George Earl</publisher>
<info name="release" value="2021-12-28"/>
- <!--"The French Hangman" is a 1982 educational program developed and distributed by George Earl. It is preserved here for the first time.-->
+ <!-- "The French Hangman" is a 1982 educational program developed and distributed by George Earl. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37784,7 +16254,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>George Earl</publisher>
<info name="release" value="2021-12-28"/>
- <!--"The Russian Hangman" (a.k.a. "Russian Practice") is a 1982 educational program developed and distributed by George Earl. It is preserved here for the first time.-->
+ <!-- "The Russian Hangman" (a.k.a. "Russian Practice") is a 1982 educational program developed and distributed by George Earl. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37798,7 +16268,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Intelligent Statements</publisher>
<info name="release" value="2021-12-31"/>
- <!--"Ken Uston's Professional Blackjack" is a 1983 card game developed and distributed by Intelligent Statements. This is version 1.12. It is preserved here for the first time.-->
+ <!-- "Ken Uston's Professional Blackjack" is a 1983 card game developed and distributed by Intelligent Statements. This is version 1.12. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37807,82 +16277,12 @@ license:CC0-1.0
</part>
</software>
- <software name="dinolnch">
- <description>Dinosaur's Lunch (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-03"/>
- <!--"Dinosaur's Lunch" is a 1989 educational program developed by Brenna Bailey and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="dinosaur's lunch (4am crack).dsk" size="143360" crc="87f9d6c6" sha1="426ef821a5448d9ce8955195cf7c46efaa5736af"/>
- </dataarea>
- </part>
- </software>
-
- <software name="racekeys">
- <description>Race Car Keys (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-03"/>
- <!--"Race Car Keys" is a 1989 educational program developed by Brenna Bailey and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="race car keys (4am crack).dsk" size="143360" crc="ae68c7c6" sha1="69dca0d7e57edb59fadde9c6da482d045558c19f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="fhbchord">
- <description>Functional Harmony: Basic Chords (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-03"/>
- <!--"Functional Harmony: Basic Chords" is a 1987 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="functional harmony- basic chords (4am crack).dsk" size="143360" crc="3cf27e56" sha1="c74402014e1fb0d372e925df22eeb0c4f151b21e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="fhdia7th">
- <description>Functional Harmony: Diatonic Seventh Chords (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-03"/>
- <!--"Functional Harmony: Diatonic Seventh Chords" is a 1988 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="functional harmony- diatonic seventh chords (4am crack).dsk" size="143360" crc="d9e14b76" sha1="70cdb71b772f0124901a1efec89663b6ac54277c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="fhboachr">
- <description>Functional Harmony: Borrowed and Altered Chords (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-03"/>
- <!--"Functional Harmony: Borrowed and Altered Chords" is a 1988 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="functional harmony- borrowed and altered chords (4am crack).dsk" size="143360" crc="cd53e752" sha1="1bc8a7db008717854b9c1b2493939e533f63e03f"/>
- </dataarea>
- </part>
- </software>
-
<software name="brsltrsnd">
<description>Building Reading Skills: The Letter-Sound Farm (cleanly cracked)</description>
<year>1984</year>
<publisher>Borg-Warner Educational Systems</publisher>
<info name="release" value="2022-01-03"/>
- <!--"Building Reading Skills: The Letter-Sound Farm" is a 1984 educational program developed and distributed by Borg-Warner Educational Systems. It requires a Ufonic Voice System peripheral card. It is preserved here for the first time.-->
+ <!-- "Building Reading Skills: The Letter-Sound Farm" is a 1984 educational program developed and distributed by Borg-Warner Educational Systems. It requires a Ufonic Voice System peripheral card. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37891,27 +16291,12 @@ license:CC0-1.0
</part>
</software>
- <software name="followme">
- <description>Follow Me (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="usage" value="Requires MIDI keyboard" />
- <info name="release" value="2022-01-03"/>
- <!--"Follow Me" is a 1989 educational program developed by Brenna Bailey and distributed by Electronic Courseware Systems. It requires a MIDI keyboard. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="follow me (4am crack).dsk" size="143360" crc="2f7d52d5" sha1="174d8d956bf71a1820ad8fed563245354e48b507"/>
- </dataarea>
- </part>
- </software>
-
<software name="germhangmanr2">
<description>The German Hangman (Revision 2) (cleanly cracked)</description>
<year>1982</year>
<publisher>George Earl</publisher>
<info name="release" value="2022-01-03"/>
- <!--"The German Hangman" (a.k.a. "German Practice") is a 1982 educational program developed and distributed by George Earl. This undated revision contains spelling corrections. It is preserved here for the first time.-->
+ <!-- "The German Hangman" (a.k.a. "German Practice") is a 1982 educational program developed and distributed by George Earl. This undated revision contains spelling corrections. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37925,7 +16310,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>George Earl</publisher>
<info name="release" value="2022-01-03"/>
- <!--"The Russian Hangman" (a.k.a. "Russian Practice") is a 1982 educational program developed and distributed by George Earl. This undated revision fixes several spelling errors. It is preserved here for the first time.-->
+ <!-- "The Russian Hangman" (a.k.a. "Russian Practice") is a 1982 educational program developed and distributed by George Earl. This undated revision fixes several spelling errors. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37939,7 +16324,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>George Earl</publisher>
<info name="release" value="2022-01-03"/>
- <!--"The Spanish Hangman" is a 1983 educational program developed and distributed by George Earl. This undated revision fixes several spelling errors. It is preserved here for the first time.-->
+ <!-- "The Spanish Hangman" is a 1983 educational program developed and distributed by George Earl. This undated revision fixes several spelling errors. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -37960,7 +16345,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2022-01-09"/>
- <!--"Exploring Library Land" is a 1986 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time.-->
+ <!-- "Exploring Library Land" is a 1986 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37974,7 +16359,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2022-01-09"/>
- <!--"Library Treasure Hunt" is a 1986 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time.-->
+ <!-- "Library Treasure Hunt" is a 1986 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -37988,7 +16373,7 @@ license:CC0-1.0
<year>1989</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2022-01-09"/>
- <!--"Expedition U.S.A.!" is a 1989 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time.-->
+ <!-- "Expedition U.S.A.!" is a 1989 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Boot Disk"/>
@@ -38027,7 +16412,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2022-01-11"/>
- <!--"Ripley's Believe It Or Not: Beginning Library Research Skills" is a 1984 educational program developed and distribute by Society for Visual Education. It is preserved here for the first time. Enter TEACHER (password TEACHER) for the administration menu.-->
+ <!-- "Ripley's Believe It Or Not: Beginning Library Research Skills" is a 1984 educational program developed and distribute by Society for Visual Education. It is preserved here for the first time. Enter TEACHER (password TEACHER) for the administration menu. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -38043,73 +16428,12 @@ license:CC0-1.0
</part>
</software>
- <software name="notespelr">
- <description>Note Speller (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Note Speller" is a 1984 educational program developed by Lolita Walker Gilkes and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="note speller (4am crack).dsk" size="143360" crc="c8c3a19a" sha1="dbd40352ce2aa2a9b0cb977714504887dcb037c2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="permushist">
- <description>Perspectives in Music History (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Perspectives in Music History" is a 1988 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="perspectives in music history (4am crack).dsk" size="143360" crc="d51b35b2" sha1="0b48300464a387a5bcc9637305f062ee23b5168e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="quenbigc">
- <description>Quentin Visits The Big City (cleanly cracked)</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="release" value="2022-01-29"/>
- <!--"Quentin Visits The Big City" is a 1992 educational program developed by Pelican Software and distributed by Queue. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="quentin visits the big city (4am crack) disk 1a.dsk" size="143360" crc="5c11de98" sha1="4cb7c2016bf64c90a6b3cfd0040c5c76a23a70ff"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="quentin visits the big city (4am crack) disk 1b.dsk" size="143360" crc="61cc85b5" sha1="796b926827d11ea9efdacc2241d31899f897bd4d"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="quentin visits the big city (4am crack) disk 2a.dsk" size="143360" crc="8233b926" sha1="22bb1fa1f94d9823f04e393acde8be1881091259"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="quentin visits the big city (4am crack) disk 2b.dsk" size="143360" crc="dd52214a" sha1="63d6f6e34b41fb532f2f98d40c44be1c0d6c4495"/>
- </dataarea>
- </part>
- </software>
-
<software name="ripleyuos">
<description>Ripley's Using Other Sources (cleanly cracked)</description>
<year>1985</year>
<publisher>Society for Visual Education</publisher>
<info name="release" value="2022-02-03"/>
- <!--"Ripley's Using Other Sources" is a 1985 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time.-->
+ <!-- "Ripley's Using Other Sources" is a 1985 educational program developed and distributed by Society for Visual Education. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -38130,7 +16454,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>The Ellen Nelson Learning Library</publisher>
<info name="release" value="2022-02-03"/>
- <!--"Math #1: The Mechanics of Math Words" is a 1986 educational program developed and distributed by The Ellen Nelson Learning Library. It is preserved here for the first time.-->
+ <!-- "Math #1: The Mechanics of Math Words" is a 1986 educational program developed and distributed by The Ellen Nelson Learning Library. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38144,7 +16468,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Prentice-Hall</publisher>
<info name="release" value="2022-02-03"/>
- <!--"The Readability Machine" is a 1984 educational program developed by Brian Pasch and distributed by Prentice-Hall. This is version 2.0. It is preserved here for the first time.-->
+ <!-- "The Readability Machine" is a 1984 educational program developed by Brian Pasch and distributed by Prentice-Hall. This is version 2.0. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38153,68 +16477,12 @@ license:CC0-1.0
</part>
</software>
- <software name="clefnote">
- <description>Clef Notes (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-13"/>
- <!--"Clef Notes" is a 1983 educational program developed by David Peters and distribute by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="clef notes (4am crack).dsk" size="143360" crc="4588d8e5" sha1="5d2d8946cc787ac18ba5e39bfe47204caeb870ab"/>
- </dataarea>
- </part>
- </software>
-
- <software name="elvesshoemkr">
- <description>The Elves and The Shoemaker (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="release" value="2022-01-21"/>
- <!--"The Elves and The Shoemaker" is a 1987 educational program developed and distributed by Troll Associates. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the elves and the shoemaker (4am crack).dsk" size="143360" crc="15115aec" sha1="1558f7b68f7ce388d8545cc8e5120722f3c408e8"/>
- </dataarea>
- </part>
- </software>
-
- <software name="12btunes">
- <description>12-Bar Tunesmith (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-21"/>
- <!--"12-Bar Tunesmith" is a 1983 educational program developed by Fred Willman and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="12-bar tunesmith (4am crack).dsk" size="143360" crc="fc332203" sha1="859ca82f02ac1d0f61a77285f137adc12595a482"/>
- </dataarea>
- </part>
- </software>
-
- <software name="asbchrds">
- <description>Aural Skills: Basic Chords (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Aural Skills: Basic Chords" is a 1983 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="aural skills trainer- basic chords (4am crack).dsk" size="143360" crc="21f69bd0" sha1="d412b744c31f1bbb8febc0b8357c0f83bd5989e5"/>
- </dataarea>
- </part>
- </software>
-
<software name="fbcollprep">
<description>Funbunch College Prep (cleanly cracked)</description>
<year>1983</year>
<publisher>Unicorn Software</publisher>
<info name="release" value="2022-02-04"/>
- <!--"Funbunch College Prep" is a 1983 educational program developed by June S. Stark and Brett W. Sperry, and distributed by Unicorn Software. It is preserved here for the first time.-->
+ <!-- "Funbunch College Prep" is a 1983 educational program developed by June S. Stark and Brett W. Sperry, and distributed by Unicorn Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38223,452 +16491,12 @@ license:CC0-1.0
</part>
</software>
- <software name="asinterv">
- <description>Aural Skills: Intervals (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Aural Skills: Intervals" is a 1983 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="aural skills trainer- intervals (4am crack).dsk" size="143360" crc="94deba21" sha1="c7ca6b485c070f807ea7785aa080e10fbf30e42c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="as7thchd">
- <description>Aural Skills: Seventh Chords (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Aural Skills: Seventh Chords" is a 1983 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="aural skills trainer- seventh chords (4am crack).dsk" size="143360" crc="9b5d891b" sha1="018c073610c14fafdfa467f22dd443b917149e38"/>
- </dataarea>
- </part>
- </software>
-
- <software name="earchlng">
- <description>Ear Challenger: A Music Game (cleanly cracked)</description>
- <year>1982</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Ear Challenger: A Music Game" is a 1982 educational program developed by Chris Alix and Stephen L. Walker, and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ear challenger (4am crack).dsk" size="143360" crc="373bcf01" sha1="43ab2c9aa068891aa783fc76a05b0ed2f0450453"/>
- </dataarea>
- </part>
- </software>
-
- <software name="eartrskl">
- <description>Ear Training Skills (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Ear Training Skills" is a 1985 educational program developed by Penny Pursell and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ear training skills (4am crack).dsk" size="143360" crc="9f6b1e92" sha1="e2aaf6b3c48977619dfb5f6d54f2fd83002024fc"/>
- </dataarea>
- </part>
- </software>
-
- <software name="findtune">
- <description>Find That Tune (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Find That Tune" is a 1985 educational program developed by Penny Pursell and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="find that tune (4am crack).dsk" size="143360" crc="2cd7a442" sha1="edb20db5603062cb063a16709665cfb1b4e95887"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybtutr">
- <description>Keyboard Tutor (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Keyboard Tutor" is a 1987 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard tutor (4am crack).dsk" size="143360" crc="efad3427" sha1="5d1a92664913d1d8880168c12d6238136d9722a6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="listenms">
- <description>Listen! A Music Skills Program (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Listen! A Music Skills Program" is a 1985 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="listen a music skills program (4am crack).dsk" size="143360" crc="c39fe4c0" sha1="bb816d121e4ebd781fd4f66c041abf240646c95f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="musaptml">
- <description>Music Appreciation: The Musical Language (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Music Appreciation: The Musical Language" is a 1986 educational program developed by Joseph E. Koob and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="music appreciation- the musical language (4am crack) side a.dsk" size="143360" crc="3a76c487" sha1="618e9f985c6cfb0cbc930c57227dd5bc45bd537e"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="music appreciation- the musical language (4am crack) side b.dsk" size="143360" crc="ecec5c44" sha1="46708fcd36bf964e48986507f140d0e8dcdfe327"/>
- </dataarea>
- </part>
- </software>
-
- <software name="musapmush">
- <description>Music Appreciation: Music History (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Music Appreciation: Music History" is a 1986 educational program developed by Joseph E. Koob and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="music appreciation- music history (4am crack) side a.dsk" size="143360" crc="c253a847" sha1="13a908efe8e928872b74c05c092c5e4be6e9fb6b"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="music appreciation- music history (4am crack) side b.dsk" size="143360" crc="dd5e735b" sha1="29ded79a22705bbf53bffa4487af17377eb63072"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mhrcomp">
- <description>Music History Review: Composers (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-01-23"/>
- <!--"Music History Review: Composers" is a 1988 educational program developed by William R. Higgins and Ronald L. Miller, and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="music history review- composers (4am crack).dsk" size="143360" crc="1996a711" sha1="81b8b21f1d5010d294ae7ac9a2bce391a6ee46f7"/>
- </dataarea>
- </part>
- </software>
-
- <software name="patpitl1">
- <description>Patterns in Pitch: Level One (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-09"/>
- <!--"Patterns in Pitch: Level One" is a 1986 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="patterns in pitch- level one (4am crack).dsk" size="143360" crc="38999691" sha1="0d915d0196a7f702d944b3fcea29d5cf71e6db7d"/>
- </dataarea>
- </part>
- </software>
-
- <software name="patpitl2">
- <description>Patterns in Pitch: Level Two (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-09"/>
- <!--"Patterns in Pitch: Level Two" is a 1986 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="patterns in pitch- level two (4am crack).dsk" size="143360" crc="b1f90ab6" sha1="0c1147489a0aa3f096e79206b66230db806e3f5b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="patpitl3">
- <description>Patterns in Pitch: Level Three (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-09"/>
- <!--"Patterns in Pitch: Level Three" is a 1985 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="patterns in pitch- level three (4am crack).dsk" size="143360" crc="d73aea3a" sha1="18a5159a69861938939aaa134b2afdc895bfb24a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="patrhyl2">
- <description>Patterns in Rhythm: Level Two (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-09"/>
- <!--"Patterns in Rhythm: Level Two" is a 1986 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="patterns in rhythm- level two (4am crack).dsk" size="143360" crc="45680647" sha1="0c05a7a359411d25c8cbe8c16a08384d625e3243"/>
- </dataarea>
- </part>
- </software>
-
- <software name="spacconq">
- <description>Space Conquerors (version 1.5) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Softsmith</publisher>
- <info name="release" value="2022-03-13"/>
- <!--"Space Conquerors" is a 1981 simulation game developed by Edu-Ware Services and distributed by Softsmith. It is a rebranded version of Edu-Ware's "Empire I: World Builders." This is version 1.5. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="space conquerors (4am and san inc crack).dsk" size="143360" crc="12b9360b" sha1="6ec2865f6b99d49b953cfcbdb10bee2fb038c13a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="nd1elem">
- <description>Note Detective I: Elementary Level (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-13"/>
- <!--"Note Detective I: Elementary Level" is a 1989 educational program developed by Reid Alexander and JoEllen DeVilbiss, and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="note detective i- elementary level (4am crack).dsk" size="143360" crc="0bdf95cf" sha1="355a54d958f8f92d80865aeb8ad6f276837b1996"/>
- </dataarea>
- </part>
- </software>
-
- <software name="patrhyl3">
- <description>Patterns in Rhythm: Level Three (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-13"/>
- <!--"Patterns in Rhythm: Level Three" is a 1984 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="patterns in rhythm- level three (4am crack).dsk" size="143360" crc="dad7cec3" sha1="0de0f94c2754d2810b998e3ac6d82e4bc16fa2fa"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mtflscrd">
- <description>Music Theory Flash Cards (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-03-02"/>
- <!--"Music Theory Flash Cards" is a 1984 educational program developed by Vincent Oddo and distributed by Electronic Courseware Systems. This version is dated 10/2/84. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="music theory flash cards (4am crack) disk 1.dsk" size="143360" crc="956664c8" sha1="6d1120f6fcb8da7d871c9b2e17ed84222b1a1d7d"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="music theory flash cards (4am crack) disk 2.dsk" size="143360" crc="5b251d38" sha1="73915f53108d92eeb2f2c7573808299fc2c6ed6c"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="music theory flash cards (4am crack) disk 3.dsk" size="143360" crc="a5a757a0" sha1="7bb6b29759431f5ed3ada0cfc079ad50fc8d3919"/>
- </dataarea>
- </part>
- </software>
-
- <software name="dainterv">
- <description>Descending/Ascending Intervals (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Descending/Ascending Intervals" is a 1986 educational program developed by Penny Pursell and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="descending-ascending intervals (4am crack).dsk" size="143360" crc="bbef08f0" sha1="81ac265fa435ba0c233430153a5894adc8c74f97"/>
- </dataarea>
- </part>
- </software>
-
- <software name="fhsecdom">
- <description>Functional Harmony: Secondary Dominants (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Functional Harmony: Secondary Dominants" is a 1988 educational program developed by Vincent Oddo and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="functional harmony- secondary dominants (4am crack).dsk" size="143360" crc="e58f2315" sha1="2b9797450a1ec616aac1de2bf59ecadb37cff0e1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybndrl">
- <description>Keyboard Note Drill (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Keyboard Note Drill" is a 1985 educational program developed by John M. Eddins and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard note drill (4am crack).dsk" size="143360" crc="bf5837ed" sha1="b07e169398ae828f3e71bc98716851b8e28193fd"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mdicbegl">
- <description>Melodic Dictation: Beginning Level (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Melodic Dictation: Beginning Level" is a 1988 educational program developed by Penny Pursell and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="melodic dictation - beginning level (4am crack).dsk" size="143360" crc="d943a185" sha1="e31e6466f4ace7748d9ee2ca6675612019c8346b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mdicintl">
- <description>Melodic Dictation: Intermediate Level (cleanly cracked)</description>
- <year>1988</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Melodic Dictation: Intermediate Level" is a 1988 educational program developed by Penny Pursell and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="melodic dictation - intermediate level (4am crack).dsk" size="143360" crc="8c32f0b7" sha1="25ddf535414a286cb1b0f791d85c4f1e539e8126"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mcpquiz">
- <description>Music Composer Quiz (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Music Composer Quiz" is a 1985 educational program developed by Joseph A. Brownlee and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="music composer quiz (4am crack).dsk" size="143360" crc="debe0831" sha1="99c071c9dada9df9fc3e491ef90b9097a86d3d88"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mstermin">
- <description>Music Terminology (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Music Terminology" is a 1984 educational program developed by Vincent Oddo and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="music terminology (4am crack).dsk" size="143360" crc="55e03305" sha1="ba3f200155a076f6be4001d7f8d0644e5b58c2c5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="tapit">
- <description>Tap-It (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Tap-It" is a 1987 educational program developed by G. David Peters and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="tap-it (4am crack).dsk" size="143360" crc="193c5293" sha1="3e4afbef063161782d66533c73c609682b301061"/>
- </dataarea>
- </part>
- </software>
-
- <software name="zoopupth">
- <description>Zoo Puppet Theater (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Electronic Courseware</publisher>
- <info name="release" value="2022-03-28"/>
- <!--"Zoo Puppet Theater" is a 1989 educational program developed and distributed by Electronic Courseware. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="zoo puppet theater (4am crack).dsk" size="143360" crc="fa74042f" sha1="8eccccffd1ca8416b536934290bf5811e4880e47"/>
- </dataarea>
- </part>
- </software>
-
- <software name="measecon">
- <description>Measuring Economic Activity (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Focus Media</publisher>
- <info name="release" value="2022-04-01"/>
- <!--"Measuring Economic Activity" is a 1985 educational program developed by Mark D. Rothman, Ph.D., and distributed by Focus Media. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="measuring economic activity (4am crack).dsk" size="143360" crc="7d7b5cd8" sha1="b33a3bdfbb733d03af008bc48eff76cabfe543b2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mmmelody">
- <description>Media Magic: The Melody Studio (cleanly cracked)</description>
- <year>1990</year>
- <publisher>Pelican Software</publisher>
- <info name="release" value="2022-04-01"/>
- <!--"Media Magic: The Melody Studio" is a 1990 sound program developed and distributed by Pelican Software. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="media magic- the melody studio (4am crack) disk 1 - program.dsk" size="143360" crc="909e334b" sha1="76a278e2b2d7dce81796969bde3a0906db2ebbb6"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Songs disk"/>
- <dataarea name="flop" size="143360">
- <rom name="media magic- the melody studio (4am crack) disk 2 - songs.dsk" size="143360" crc="ae5f5c4c" sha1="ead8d10b5f65611b6029c81a6efcb6929903dcec"/>
- </dataarea>
- </part>
- </software>
-
<software name="timexplo">
<description>Time Explorers (cleanly cracked)</description>
<year>1991</year>
<publisher>Gamco Industries</publisher>
<info name="release" value="2022-04-01"/>
- <!--"Time Explorers" is a 1991 educational game developed by Terri Poteet and Byron Smith, and distributed by Gamco Industries. This is version 4.1.7. It is preserved here for the first time.-->
+ <!-- "Time Explorers" is a 1991 educational game developed by Terri Poteet and Byron Smith, and distributed by Gamco Industries. This is version 4.1.7. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
@@ -38689,7 +16517,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Langenscheidt Languageware</publisher>
<info name="release" value="2022-04-01"/>
- <!--"On Target: 3000 Words of German" is a 1984 educational game developed by John W. Hall and distributed by Langenscheidt Languageware. It is preserved here for the first time.-->
+ <!-- "On Target: 3000 Words of German" is a 1984 educational game developed by John W. Hall and distributed by Langenscheidt Languageware. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38698,110 +16526,12 @@ license:CC0-1.0
</part>
</software>
- <software name="keybfing">
- <description>Keyboard Fingerings (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Fingerings" is a 1985 educational program developed by G. David Peters and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard fingerings (4am crack).dsk" size="143360" crc="4698d95d" sha1="79fbb021fead12425f212f60ffcefef1e3d35d13"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybintv">
- <description>Keyboard Intervals (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Intervals" is a 1985 educational program developed by G. David Peters and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard intervals (4am crack).dsk" size="143360" crc="58528f13" sha1="3d8bf802ced06c1c21ee1f54f8dd8a2538d0fe63"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybjazzh">
- <description>Keyboard Jazz Harmonies (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Jazz Harmonies" is a 1985 educational program developed by Joseph A. Brownlee and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard jazz harmonies (4am crack).dsk" size="143360" crc="5ea5aa72" sha1="b2575b5fa2c9a0f7cde103fe928b0d752f4a2343"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybejazzh">
- <description>Keyboard Extended Jazz Harmonies (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Extended Jazz Harmonies" is a 1987 educational program developed by Joseph A. Brownlee and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard extended jazz harmonies (4am crack).dsk" size="143360" crc="07cefb6f" sha1="7bd20ae0b41957185dcdce40c96c97a7983a0e5b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybsread">
- <description>Keyboard Speed Reading (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Speed Reading" is a 1985 educational program developed by Ray E. Zubler and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard speed reading (4am crack).dsk" size="143360" crc="accbe520" sha1="d81dc34cbf3cae530b084928f00159a129792af9"/>
- </dataarea>
- </part>
- </software>
-
- <software name="musicstairs">
- <description>Musical Stairs (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Musical Stairs" is a 1985 educational program developed by Stephen L. Walker and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="musical stairs (4am crack).dsk" size="143360" crc="808705d0" sha1="5aea1cfdad848820ddbedf63584147de4b60ec9b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="notedet2int">
- <description>Note Detective II: Intermediate Level (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Note Detective II: Intermediate Level" is a 1989 educational program developed by Reid Alexander and JoEllen DeVilbiss, and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="note detective ii- intermediate level (4am crack).dsk" size="143360" crc="c8620d0d" sha1="ab05536d490cc7dfc9118403109e6d6558523581"/>
- </dataarea>
- </part>
- </software>
-
<software name="geosearch">
<description>Geography Search (cleanly cracked)</description>
<year>1982</year>
<publisher>McGraw-Hill</publisher>
<info name="release" value="2022-04-21"/>
- <!--"Geography Search" is a 1982 educational program developed by Thomas F.F. Snyder and distributed by McGraw-Hill. It is preserved here for the first time.-->
+ <!-- "Geography Search" is a 1982 educational program developed by Thomas F.F. Snyder and distributed by McGraw-Hill. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38815,7 +16545,7 @@ license:CC0-1.0
<year>1988</year>
<publisher>Educational Activities</publisher>
<info name="release" value="2022-04-21"/>
- <!--"Cubes, Prisms, and Cylinders" is a 1988 educational program developed by Jason A. Dylan and distributed by Educational Activities. It is preserved here for the first time.-->
+ <!-- "Cubes, Prisms, and Cylinders" is a 1988 educational program developed by Jason A. Dylan and distributed by Educational Activities. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38824,68 +16554,12 @@ license:CC0-1.0
</part>
</software>
- <software name="erlymussk">
- <description>Early Music Skills (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Early Music Skills" is a 1985 educational program developed by Lolita Walker Gilkes and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="early music skills (4am crack).dsk" size="143360" crc="f8dc4380" sha1="40cbaaaf0441c80794f2b92dba1a612d985deb47"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybarpeg">
- <description>Keyboard Arpeggios (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Arpeggios" is a 1985 educational program developed by Reid Alexander and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard arpeggios (4am crack).dsk" size="143360" crc="fa3e26a4" sha1="9e66acc9367a65ab219c4fb29651d31a38f917e1"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keyblues">
- <description>Keyboard Blues (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Blues" is a 1985 educational program developed by G. David Peters and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard blues (4am crack).dsk" size="143360" crc="c32ddf6a" sha1="bddd4ca4b792050bef3702b38e977375855ac27c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="keybchords">
- <description>Keyboard Chords (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-04-20"/>
- <!--"Keyboard Chords" is a 1985 educational program developed by G. David Peters and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="keyboard chords (4am crack).dsk" size="143360" crc="5d41b232" sha1="70856b9d56282d6b0218d32611638f15a4e0b1c7"/>
- </dataarea>
- </part>
- </software>
-
<software name="drugefct">
<description>Drugs: Their Effects on You (cleanly cracked)</description>
<year>1987</year>
<publisher>Marshware</publisher>
<info name="release" value="2022-04-23"/>
- <!--"Drugs: Their Effects on You" is a 1987 educational program developed by EduSystems, illustrated by Morse Software Illustrations, with consultants Donna L. Osness and James M. Schaefer, and distributed by Marshware. It is preserved here for the first time.-->
+ <!-- "Drugs: Their Effects on You" is a 1987 educational program developed by EduSystems, illustrated by Morse Software Illustrations, with consultants Donna L. Osness and James M. Schaefer, and distributed by Marshware. It is preserved here for the first time. -->
<!-- Be sure to read the story of actually obtaining and dumping this disk at
https://archive.org/details/PreservingDrugsTheirEffectsOnYou
It might leave you taped to your seat. -->
@@ -38902,7 +16576,7 @@ license:CC0-1.0
<year>1987</year>
<publisher>Heartsoft</publisher>
<info name="release" value="2022-04-26"/>
- <!--"The Bubble Gum Machine" is a 1987 educational program developed and distributed by Heartsoft. It is preserved here for the first time.-->
+ <!-- "The Bubble Gum Machine" is a 1987 educational program developed and distributed by Heartsoft. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -38911,110 +16585,12 @@ license:CC0-1.0
</part>
</software>
- <software name="verbusg10189">
- <description>Verb Usage 1 (version 01.31.89) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2022-04-26"/>
- <!--"Verb Usage 1" is a 1986 educational program developed and distributed by Hartley Courseware. This version is dated 01.31.89. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 1 v01.31.89 (4am crack).dsk" size="143360" crc="a097ef98" sha1="fa0ab229d3fe9703a0ccbbc0932e5ec46d38d7a4"/>
- </dataarea>
- </part>
- </software>
-
- <software name="antsyn10889">
- <description>Antonyms/Synonyms (version 08.02.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2022-04-29"/>
- <!--"Antonyms/Synonyms" is a 1989 educational program with content authoring by Carolyn Micklatcher and distributed by Hartley Courseware. This version is dated 08.02.89. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="antonyms-synonyms v08.02.89 (4am crack) disk 1.dsk" size="143360" crc="19a04510" sha1="cea7ce48b004271173b66f53456740ee18078643"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="antonyms-synonyms v08.02.89 (4am crack) disk 2.dsk" size="143360" crc="ea1cd3e8" sha1="304582fb5fbddfee75d1254eca2a37a81bec9880"/>
- </dataarea>
- </part>
- </software>
-
- <software name="homonyms0189">
- <description>Homonyms (version 01.19.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2022-04-29"/>
- <!--"Homonyms" is a 1989 educational program with content authoring by Jane Hartley and distributed by Hartley Courseware. This version is dated 01.19.89. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="homonyms v01.19.89 (4am crack) disk 1.dsk" size="143360" crc="5b3bd83f" sha1="fcd92a3374ac2e22a2433a612ae7521adf9295d4"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="homonyms v01.19.89 (4am crack) disk 2.dsk" size="143360" crc="05423e27" sha1="56bbd84231363aacf8c109e0a8f068c99436b5a6"/>
- </dataarea>
- </part>
- </software>
-
- <software name="verbusg20189">
- <description>Verb Usage 2 (version 01.31.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2022-04-29"/>
- <!--"Verb Usage 2" is a 1989 educational program developed and distributed by Hartley Courseware. This version is dated 01.31.89. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 2 v01.31.89 (4am crack).dsk" size="143360" crc="471e875a" sha1="798e29181d421eb7e8b735bbb0697224678e2c8c"/>
- </dataarea>
- </part>
- </software>
-
- <software name="botgardn">
- <description>Botanical Gardens (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2022-05-05"/>
- <!--"Botanical Gardens" is a 1986 educational program developed by Robert Kimball, David J. Donoghue, and Patrick Kehoe, and distributed by Sunburst Communications. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="botanical gardens (4am crack).dsk" size="143360" crc="45282d06" sha1="bebb4d99261cf2caa58144cc0561cca21e8c5455"/>
- </dataarea>
- </part>
- </software>
-
- <software name="verbusg40189">
- <description>Verb Usage 4 (version 01.31.89) (cleanly cracked)</description>
- <year>1989</year>
- <publisher>Hartley Courseware</publisher>
- <info name="release" value="2022-05-09"/>
- <!--"Verb Usage 4" is a 1989 educational program developed and distributed by Hartley Courseware. This version is dated 01.31.89. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="verb usage 4 v01.31.89 (4am crack).dsk" size="143360" crc="47ebdd05" sha1="4bfc911e1be292aa18ce61c2fe4be5659e2af9bc"/>
- </dataarea>
- </part>
- </software>
-
<software name="ezgraph2">
<description>Easy Graph II (cleanly cracked)</description>
<year>1987</year>
<publisher>Grolier Publishing</publisher>
<info name="release" value="2022-05-09"/>
- <!--"Easy Graph II" is a 1987 educational program developed by James Austin, Yen-ching Chu, Michael Lease, Kate McCormick, Joan Nordberg, Matt Osber, Jay Roberts, Elaine Lewis, Susan Christie Thomas, Bob Stickgold, and George Sullivan, and distributed by Grolier publishing. It is preserved here for the first time.-->
+ <!-- "Easy Graph II" is a 1987 educational program developed by James Austin, Yen-ching Chu, Michael Lease, Kate McCormick, Joan Nordberg, Matt Osber, Jay Roberts, Elaine Lewis, Susan Christie Thomas, Bob Stickgold, and George Sullivan, and distributed by Grolier publishing. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Tutorial disk"/>
@@ -39030,108 +16606,12 @@ license:CC0-1.0
</part>
</software>
- <software name="ultima2">
- <description>Ultima II (Revision 3) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2022-06-07"/>
- <!--"Ultima II" is a 1982 role-playing game developed by Kenneth W. Arnold, Richard Garriott, and Keith Zabalaoui; designed by Helen Walker, Owen Garriott, Howard Makler, and Mary Taylor Rollo; and distributed by On-Line Systems. This is revision 3, which adds a feature to make a copy of the player master disk before you create a character. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program master disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 3 (4am crack) - disk 1 - program master.dsk" size="143360" crc="29b8c634" sha1="a8408eec3a37f99a1c1e91603c3f9676032a3cce"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Player master disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 3 (4am crack) - disk 2 - player master.dsk" size="143360" crc="ed3b8497" sha1="d7f9ad3f50c4e26f5644c42df79324c61be9efdf"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Galactic disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 3 (4am crack) - disk 3 - galactic disk.dsk" size="143360" crc="ae5dcd69" sha1="5f20aab52719a98fa0eeab03bf427dd36f014284"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ultima2r2">
- <description>Ultima II (Revision 2) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2022-06-07"/>
- <!--"Ultima II" is a 1982 role-playing game developed by Kenneth W. Arnold, Richard Garriott, and Keith Zabalaoui; designed by Helen Walker, Owen Garriott, Howard Makler, and Mary Taylor Rollo; and distributed by On-Line Systems. This is revision 2.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program master disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 2 (4am crack) disk 1 - program master.dsk" size="143360" crc="3fa83c21" sha1="af3b5b1300cf972d501946edc205f261b0690adb"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Player master disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 2 (4am crack) disk 2 - player master.dsk" size="143360" crc="ed3b8497" sha1="d7f9ad3f50c4e26f5644c42df79324c61be9efdf"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Galactic disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 2 (4am crack) disk 3 - galactic disk.dsk" size="143360" crc="ae5dcd69" sha1="5f20aab52719a98fa0eeab03bf427dd36f014284"/>
- </dataarea>
- </part>
- </software>
-
- <software name="ultima2r1">
- <description>Ultima II (Revision 1) (cleanly cracked)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="release" value="2022-06-07"/>
- <!--"Ultima II" is a 1982 role-playing game developed by Kenneth W. Arnold, Richard Garriott, and Keith Zabalaoui; designed by Helen Walker, Owen Garriott, Howard Makler, and Mary Taylor Rollo; and distributed by On-Line Systems. This is revision 1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program master disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 1 (4am crack) disk 1 - program master.dsk" size="143360" crc="3d83a419" sha1="ad0f3e7515bb439c61d98e45b980ca786f44cc10"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Player master disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 1 (4am crack) disk 2 - player master.dsk" size="143360" crc="ed3b8497" sha1="d7f9ad3f50c4e26f5644c42df79324c61be9efdf"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Galactic disk"/>
- <dataarea name="flop" size="143360">
- <rom name="ultima ii rev. 1 (4am crack) disk 3 - galactic disk.dsk" size="143360" crc="ae5dcd69" sha1="5f20aab52719a98fa0eeab03bf427dd36f014284"/>
- </dataarea>
- </part>
- </software>
-
- <software name="suprearc">
- <description>Super Ear Challenger (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-06-09"/>
- <!--"Super Ear Challenger" is a 1985 educational program developed by Stephen Walker and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2 and will crash spectacularly without one. It is preserved here for the first time.-->
- <!-- It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2 and will crash spectacularly without one. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="super ear challenger- a music game (4am crack).dsk" size="143360" crc="461f0401" sha1="5002c1a3c9de2dc015fb46746f105dbec1c0a145"/>
- </dataarea>
- </part>
- </software>
-
<software name="pythdrgn">
<description>Pythagoras and The Dragon (cleanly cracked)</description>
<year>1983</year>
<publisher>Krell Software</publisher>
<info name="release" value="2022-06-10"/>
- <!--"Pythagoras and The Dragon" is a 1983 educational game developed and distributed by Krell Software.-->
+ <!-- "Pythagoras and The Dragon" is a 1983 educational game developed and distributed by Krell Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39145,7 +16625,7 @@ license:CC0-1.0
<year>1982</year>
<publisher>Level-10</publisher>
<info name="release" value="2022-06-10"/>
- <!--"Space Rescue" is a 1982 action game developed by Rod Nelsen and distributed by Level-10.-->
+ <!-- "Space Rescue" is a 1982 action game developed by Rod Nelsen and distributed by Level-10. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39154,26 +16634,12 @@ license:CC0-1.0
</part>
</software>
- <software name="lcksmth50g">
- <description>Locksmith (version 5.0 Revision G) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Alpha Logic Business Systems</publisher>
- <info name="release" value="2022-06-10"/>
- <!--"Locksmith" is a 1984 disk utility developed and distributed by Alpha Logic Business Systems. This is version 5.0G.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="locksmith v5.0g (4am crack).dsk" size="143360" crc="4be27a62" sha1="3e19e176a314c6c888e6c3d53fe361d4767d3285"/>
- </dataarea>
- </part>
- </software>
-
<software name="vt100emu">
<description>VT-100 Emulator (cleanly cracked)</description>
<year>1980</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2022-06-10"/>
- <!--"VT-100 Emulator" is a 1980 communications program developed and distributed by Apple Computer. It is preserved here for the first time.-->
+ <!-- "VT-100 Emulator" is a 1980 communications program developed and distributed by Apple Computer. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39187,7 +16653,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Apple Computer</publisher>
<info name="release" value="2022-06-10"/>
- <!--"Order Tracking System" is a 1981 productivity program developed by Loggins and distributed by Apple Computer. This is version 1.3a. It is preserved here for the first time.-->
+ <!-- "Order Tracking System" is a 1981 productivity program developed by Loggins and distributed by Apple Computer. This is version 1.3a. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Master disk"/>
@@ -39203,47 +16669,12 @@ license:CC0-1.0
</part>
</software>
- <software name="muptvller2">
- <description>Muppetville (Revision 2) (cleanly cracked)</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2022-06-10"/>
- <!--"Muppetville" is a 1986 educational program developed and distributed by Sunburst Communications. This is revision 2, with a filename fix and other unspecified changes. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="muppetville rev. 2 (4am crack).dsk" size="143360" crc="99891244" sha1="43449499e6b21b6d49d0002f9db9f9fca6443e57"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rebuswr">
- <description>Rebus Writer (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="release" value="2022-06-10"/>
- <!--"Rebus Writer" is a 1987 educational program developed by TJ and distributed by Mindscape. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="rebus writer (4am crack) side a - program.dsk" size="143360" crc="9fdb3d8f" sha1="a8c94406aa0eb42faa3fcf2cc44a2908dcb4682a"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Pictionary disk"/>
- <dataarea name="flop" size="143360">
- <rom name="rebus writer (4am crack) side b - pictionary.dsk" size="143360" crc="d42ae5a3" sha1="ed2f9d42a9e023de2156ee05aa1d4b3f534aef67"/>
- </dataarea>
- </part>
- </software>
-
<software name="gothmogl">
<description>Gothmog's Lair (cleanly cracked)</description>
<year>1984</year>
<publisher>Progressive Peripherals and Software</publisher>
<info name="release" value="2022-06-10"/>
- <!--"Gothmog's Lair" is a 1984 adventure game developed by Sean A. Moore and distributed by Progressive Peripherals and Software.-->
+ <!-- "Gothmog's Lair" is a 1984 adventure game developed by Sean A. Moore and distributed by Progressive Peripherals and Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39257,7 +16688,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Ginn and Company</publisher>
<info name="release" value="2022-06-14"/>
- <!--"Ginn Reading Program" is a 1984 educational program developed and distributed by Ginn and Company. It is preserved here for the first time.-->
+ <!-- "Ginn Reading Program" is a 1984 educational program developed and distributed by Ginn and Company. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
@@ -39279,66 +16710,12 @@ license:CC0-1.0
</part>
</software>
- <software name="mthb0884">
- <description>Math Blaster (version 08.05.84) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Davidson and Associates</publisher>
- <info name="release" value="2022-06-18"/>
- <!--"Math Blaster" is a 1983 educational program developed by Richard Eckert and Janice Davidson, Ph.D., and distributed by Davidson and Associates. This version is dated August 5, 1984 according to the printed disk label.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program disk"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster v080584 (4am crack) side a - program.dsk" size="143360" crc="1f40f3e7" sha1="59e80536bfe46e46bd458ac11aacc30d9da56886"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Data disk"/>
- <dataarea name="flop" size="143360">
- <rom name="math blaster v080584 (4am crack) side b - data.dsk" size="143360" crc="fe5f63a4" sha1="1eac6e9205030b23f43c0fcc2cb5055659126407"/>
- </dataarea>
- </part>
- </software>
-
- <software name="plyrdmus">
- <description>Playing and Reading Music (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Electronic Courseware Systems</publisher>
- <info name="release" value="2022-06-23"/>
- <!--"Playing and Reading Music" is a 1987 educational program developed by Vincent Oddo and Henry Levy, and distributed by Electronic Courseware Systems. It requires a MIDI keyboard connected to a Passport or Roland MIDI card in slot 2. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1"/>
- <dataarea name="flop" size="143360">
- <rom name="playing and reading music (4am crack) disk 1.dsk" size="143360" crc="eaeb5ac1" sha1="ba313892322d045160cfe623330c8fdaf6f591d7"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2"/>
- <dataarea name="flop" size="143360">
- <rom name="playing and reading music (4am crack) disk 2.dsk" size="143360" crc="673ffe87" sha1="ce7529d7e0f890d65a914b3a2a485ac7db095610"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3"/>
- <dataarea name="flop" size="143360">
- <rom name="playing and reading music (4am crack) disk 3.dsk" size="143360" crc="85172747" sha1="f0ac3b037273682f668486733108554e169e06d6"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4"/>
- <dataarea name="flop" size="143360">
- <rom name="playing and reading music (4am crack) disk 4.dsk" size="143360" crc="1ac3aab4" sha1="4864efcbdf539e896e2f8961e3c10fd3d37cf0af"/>
- </dataarea>
- </part>
- </software>
-
<software name="keylinr2">
<description>Key Lingo (Revision 2) (cleanly cracked)</description>
<year>1983</year>
<publisher>Prentice Associates</publisher>
<info name="release" value="2022-06-28"/>
- <!--"Key Lingo" is a 1983 educational program developed by Prentice Associates. This is revision 2, which was never commercially released. It is preserved here for the first time.-->
+ <!-- "Key Lingo" is a 1983 educational program developed by Prentice Associates. This is revision 2, which was never commercially released. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39352,7 +16729,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Spinifex Software</publisher>
<info name="release" value="2022-06-28"/>
- <!--"Number Explorer" is a 1985 educational program developed by Ian Greig, Ray Stace, and Michael Fazzolare, and distributed by Spinifex Software. It is preserved here for the first time.-->
+ <!-- "Number Explorer" is a 1985 educational program developed by Ian Greig, Ray Stace, and Michael Fazzolare, and distributed by Spinifex Software. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39364,9 +16741,9 @@ license:CC0-1.0
<software name="spnmstry">
<description>Spanish for Mastery (cleanly cracked)</description>
<year>1985</year>
- <publisher>D.C. Heath</publisher>
+ <publisher>D.C. Heath and Company</publisher>
<info name="release" value="2022-07-02"/>
- <!--"Spanish for Mastery" is a 1985 educational program developed by Jean-Paul Valette and Rebecca M. Valette, and distributed by D.C. Heath. It is preserved here for the first time.-->
+ <!-- "Spanish for Mastery" is a 1985 educational program developed by Jean-Paul Valette and Rebecca M. Valette, and distributed by D.C. Heath. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A - Program"/>
@@ -39411,7 +16788,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Prentice Associates</publisher>
<info name="release" value="2022-07-03"/>
- <!--"The Chambers of Vocab" is a 1983 educational program developed by Prentice Associates. This is revision 2, which was never commercially released. It is preserved here for the first time.-->
+ <!-- "The Chambers of Vocab" is a 1983 educational program developed by Prentice Associates. This is revision 2, which was never commercially released. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39420,82 +16797,12 @@ license:CC0-1.0
</part>
</software>
- <software name="pixitv01331">
- <description>Pixit (version 01331) (cleanly cracked)</description>
- <year>1983</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-07-03"/>
- <!--"Pixit" is a 1983 graphics program developed by Michael Darooge, Edward McCullough, and Kimberly Evans, and distributed by Baudville. This is version 01331.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="pixit v01331 (4am crack).dsk" size="143360" crc="92c24ed0" sha1="f75659cb387ecd096b7de38f17e88358b4de72d2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="blzpdls0">
- <description>Blazing Paddles (Revision 0) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-07-03"/>
- <!--"Blazing Paddles" is a 1984 graphics program developed by Michael Darooge, Edward McCullough, and David Walker, and distributed by Baudville. Unlike all other known versions, this version has no visible version number, suggesting the earliest release.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="blazing paddles rev. 0 (4am crack).dsk" size="143360" crc="180c3a29" sha1="94c9e3c97fff3d19dacfe1b82ad954a757cf1e1a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rainydg">
- <description>Rainy Day Games (version 13501) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-06-29"/>
- <!--"Rainy Day Games" is a 1985 set of card games developed and distributed by Baudville. This is version 13501.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="rainy day games (4am crack).dsk" size="143360" crc="50b78018" sha1="2d03e73d475f3ab54ec98b2e22dc7b04fa7a52d5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="skicrazd">
- <description>Ski Crazed (version 28701) (cleanly cracked)</description>
- <year>1987</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-06-29"/>
- <!--"Ski Crazed" is a 1987 sports game developed by Jason Rubin and Andy Gavin, and distributed by Baudville. This is version 28701.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="ski crazed v28701 (4am crack).dsk" size="143360" crc="abec2de2" sha1="8cf6c8abcb4203b6629580f5d6ff3ad4bf62a2fc"/>
- </dataarea>
- </part>
- </software>
-
- <software name="vidveg">
- <description>Video Vegas (version 12511) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-06-29"/>
- <!--"Video Vegas" is a 1985 sports game developed and distributed by Baudville. This is version 12511.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="video vegas v12511 (4am crack).dsk" size="143360" crc="d820d4e7" sha1="73f75859cd31983166f3a4afffb7aed1795fd7f1"/>
- </dataarea>
- </part>
- </software>
-
<software name="trkcoy84">
<description>Trickster Coyote (version 1984) (cleanly cracked)</description>
<year>1984</year>
<publisher>None</publisher>
<info name="release" value="2022-06-30"/>
- <!--"Trickster Coyote" is a 1984 educational program developed by Prentice Associates. This 1984 revision was never commercially released. It is preserved here for the first time.-->
+ <!-- "Trickster Coyote" is a 1984 educational program developed by Prentice Associates. This 1984 revision was never commercially released. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39504,48 +16811,13 @@ license:CC0-1.0
</part>
</software>
- <software name="blzpad04421">
- <description>Blazing Paddles (version 04421) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-06-30"/>
- <!--"Blazing Paddles" is a 1984 graphics program developed by Michael Darooge, Edward McCullough, and David Walker, and distributed by Baudville. This is version 04421.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="blazing paddles v04421 (4am crack).dsk" size="143360" crc="799282c4" sha1="5a0603178bf47f4f67c28206b910ea3af413b2d5"/>
- </dataarea>
- </part>
- </software>
-
- <software name="prin15531">
- <description>Prince (version 15531) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-07-03"/>
- <!--"Prince" is a 1985 graphics program developed by Joel Novak, Ken Steiner, Michael Darooge, Bob Svihovec, and Bryan Koeff, and distributed by Baudville. This is version 15531.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="prince v15531 (4am crack) side a.dsk" size="143360" crc="076b4c37" sha1="17642c6dde2665450c39a3b629faa5e1e097c2ea"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="prince v15531 (4am crack) side b.dsk" size="143360" crc="ef036e55" sha1="9d51c9cf230414c3d004dd72c79aa25d68139da3"/>
- </dataarea>
- </part>
- </software>
-
<software name="gervocab">
<description>German Vocabulary for Shopping Use (cleanly cracked)</description>
<year>1982</year>
<publisher>Control Data</publisher>
<info name="release" value="2022-06-30"/>
<info name="usage" value="Due to programming errors unrelated to the copy protection, this disk works best on an Apple ][+ or an unenhanced Apple //e. Later models will crash when you try to view a word list."/>
- <!--"German Vocabulary for Shopping Use" is a 1982 educational program developed and distributed by Control Data. Due to programming errors unrelated to the copy protection, this disk works best on an Apple ][+ or an unenhanced Apple //e. Later models will crash when you try to view a word list. It is preserved here for the first time.-->
+ <!-- "German Vocabulary for Shopping Use" is a 1982 educational program developed and distributed by Control Data. Due to programming errors unrelated to the copy protection, this disk works best on an Apple ][+ or an unenhanced Apple //e. Later models will crash when you try to view a word list. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39554,47 +16826,12 @@ license:CC0-1.0
</part>
</software>
- <software name="fact1984">
- <description>The Factory (version 1984) (cleanly cracked)</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="release" value="2022-06-30"/>
- <!--"The Factory" is a 1984 educational game developed by Marge Kosel and Mike Fish, and distributed by Sunburst Communications. This version is dated 1984 according to the logo screen displayed on boot. It is preserved here for the first time.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="the factory 1984 (4am crack).dsk" size="143360" crc="af3f1d49" sha1="d8c9020da2797de3abe3a8de0d1db73fc2b7ac7b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="prin15521">
- <description>Prince (version 15521) (cleanly cracked)</description>
- <year>1985</year>
- <publisher>Baudville</publisher>
- <info name="release" value="2022-06-30"/>
- <!--"Prince" is a 1985 graphics program developed by Joel Novak, Ken Steiner, Michael Darooge, Bob Svihovec, and Bryan Koeff, and distributed by Baudville. This is version 15521, displayed during boot.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="143360">
- <rom name="prince v15521 (4am crack) side a.dsk" size="143360" crc="e6553b4f" sha1="e299c1b148446d9519dcabe766bc19ff5ef92635"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="143360">
- <rom name="prince v15521 (4am crack) side b.dsk" size="143360" crc="ef036e55" sha1="9d51c9cf230414c3d004dd72c79aa25d68139da3"/>
- </dataarea>
- </part>
- </software>
-
<software name="magcal2084">
<description>Magicalc (version 2.0-1984) (cleanly cracked)</description>
<year>1984</year>
<publisher>Artsci</publisher>
<info name="release" value="2022-07-01"/>
- <!--"Magicalc" is a 1984 productivity program developed by William G. Graves and distributed by Artsci. This is version 2.0-1984. It is preserved here for the first time.-->
+ <!-- "Magicalc" is a 1984 productivity program developed by William G. Graves and distributed by Artsci. This is version 2.0-1984. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39608,7 +16845,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>AAJS Computer Products</publisher>
<info name="release" value="2022-07-02"/>
- <!--"Disk Optimizer II" is a 1985 disk utility program developed and distributed by AAJS Computer Products. This is version 1.1. It is preserved here for the first time.-->
+ <!-- "Disk Optimizer II" is a 1985 disk utility program developed and distributed by AAJS Computer Products. This is version 1.1. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39622,7 +16859,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Digital Masters</publisher>
<info name="release" value="2022-07-02"/>
- <!--"CHASM Checking Account Systems Manager" is a 1985 productivity program developed by Bryant Fraser and distributed by Digital Masters. It is preserved here for the first time.-->
+ <!-- "CHASM Checking Account Systems Manager" is a 1985 productivity program developed by Bryant Fraser and distributed by Digital Masters. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39636,7 +16873,7 @@ license:CC0-1.0
<year>1988</year>
<publisher>Educational Activities</publisher>
<info name="release" value="2022-07-10"/>
- <!--"Learning about Geography, Maps, and Globes" is a 1988 educational program developed by Activity Records and distributed by Educational Activities. It is preserved here for the first time.-->
+ <!-- "Learning about Geography, Maps, and Globes" is a 1988 educational program developed by Activity Records and distributed by Educational Activities. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Introduction"/>
@@ -39663,7 +16900,7 @@ license:CC0-1.0
<year>1986</year>
<publisher>Decision DevelopmentThe Ellen Nelson Learning Library</publisher>
<info name="release" value="2022-07-10"/>
- <!--"Science Volume 1: The Environment" is a 1986 educational program developed by Decision Development Co. and distributed by The Ellen Nelson Learning Library. This is version 1.0. It is preserved here for the first time.-->
+ <!-- "Science Volume 1: The Environment" is a 1986 educational program developed by Decision Development Co. and distributed by The Ellen Nelson Learning Library. This is version 1.0. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39677,7 +16914,7 @@ license:CC0-1.0
<year>1981</year>
<publisher>Nikrom Technical Products</publisher>
<info name="release" value="2022-07-10"/>
- <!--"Master Diagnostics II and II Plus" is a 1981 utility program developed and distributed by Nikrom Technical Products. It is preserved here for the first time.-->
+ <!-- "Master Diagnostics II and II Plus" is a 1981 utility program developed and distributed by Nikrom Technical Products. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -39691,7 +16928,7 @@ license:CC0-1.0
<year>1987</year>
<publisher>McGraw-Hill</publisher>
<info name="release" value="2022-07-17"/>
- <!--"Mathematics Courseware Problem Solving Level 5" is a 1987 educational game developed by Tom Snyder Productions and distributed by McGraw-Hill. This is version 1.0. It is preserved here for the first time.-->
+ <!-- "Mathematics Courseware Problem Solving Level 5" is a 1987 educational game developed by Tom Snyder Productions and distributed by McGraw-Hill. This is version 1.0. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Teacher disk"/>
@@ -39707,26 +16944,12 @@ license:CC0-1.0
</part>
</software>
- <software name="starwr2">
- <description>Star Warrior (Revision 2) (cleanly cracked)</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="release" value="2022-07-17"/>
- <!--"Star Warrior" is a 1981 roleplaying game developed and distributed by Automated Simulations.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="star warrior rev. 2 (4am and san inc crack).dsk" size="143360" crc="60cd093f" sha1="1e8c42513bc5280d42143b4d9dac6d402845d1bc"/>
- </dataarea>
- </part>
- </software>
-
<software name="lclpwtc">
<description>Living Chess Library: Paul Whitehead Teaches Chess (cleanly cracked)</description>
<year>1985</year>
<publisher>Enlightenment, Inc.</publisher>
<info name="release" value="2022-07-10"/>
- <!--"Living Chess Library: Paul Whitehead Teaches Chess" is a 1985 educational program developed by Paul Whitehead, Julio Kaplan, and Dan Goldman, and distributed by Enlightenment, Inc. It is preserved here for the first time.-->
+ <!-- "Living Chess Library: Paul Whitehead Teaches Chess" is a 1985 educational program developed by Paul Whitehead, Julio Kaplan, and Dan Goldman, and distributed by Enlightenment, Inc. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
@@ -39759,7 +16982,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Enlightenment, Inc.</publisher>
<info name="release" value="2022-07-10"/>
- <!--"Living Chess Library: King's Indian Defense" is a 1985 educational program developed by Edward A. Chang, Peter Biyiasas, Julio Kaplan, and Dan Goldman, and distributed by Enlightenment, Inc. It is preserved here for the first time.-->
+ <!-- "Living Chess Library: King's Indian Defense" is a 1985 educational program developed by Edward A. Chang, Peter Biyiasas, Julio Kaplan, and Dan Goldman, and distributed by Enlightenment, Inc. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
@@ -39798,7 +17021,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Enlightenment, Inc.</publisher>
<info name="release" value="2022-07-10"/>
- <!--"Living Chess Library: 50 Classic Games" is a 1985 educational program developed by Paul Whitehead and distributed by Enlightenment, Inc. It is preserved here for the first time.-->
+ <!-- "Living Chess Library: 50 Classic Games" is a 1985 educational program developed by Paul Whitehead and distributed by Enlightenment, Inc. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
@@ -39825,7 +17048,7 @@ license:CC0-1.0
<year>1985</year>
<publisher>Enlightenment, Inc.</publisher>
<info name="release" value="2022-09-19"/>
- <!--"Living Chess Library: Jeremy Silman's Complete Guide to Chess Openings" is a 1985 educational program developed by Jeremy Silman and distributed by Enlightenment, Inc. It is preserved here for the first time.-->
+ <!-- "Living Chess Library: Jeremy Silman's Complete Guide to Chess Openings" is a 1985 educational program developed by Jeremy Silman and distributed by Enlightenment, Inc. It is preserved here for the first time. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
@@ -39865,16 +17088,125 @@ license:CC0-1.0
</part>
</software>
+ <software name="123dmult">
+ <description>1-2-3 Digit Multiplication (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="1-2-3 digit multiplication (4am crack).dsk" size="143360" crc="78461261" sha1="c8b8e76295be278b0faa2a10c255b3c3f7b7468c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="123seqme">
+ <description>1-2-3 Sequence Me (4am crack)</description>
+ <year>1991</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="developer" value="Infotech Manitoba Educational Technology Program" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="1-2-3 sequence me (4am crack).dsk" size="143360" crc="7e2ec77e" sha1="01fa783c5bd63d04e4280308e3eae48ca546c330" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="101mword">
+ <description>101 Misused Words (And How To Use Them Correctly) (4am crack)</description>
+ <year>1986</year>
+ <publisher>The Learning Seed Company</publisher>
+ <info name="programmer" value="Robert Lawrence" />
+ <info name="programmer" value="Mark Whitehurst" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="101 misused words (4am crack).dsk" size="143360" crc="49662c0d" sha1="b71a873630ef10333695890ab66a7bd80a9ef06e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="12btunes">
+ <description>12-Bar Tunesmith (4am crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Fred Willman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="12-bar tunesmith (4am crack).dsk" size="143360" crc="fc332203" sha1="859ca82f02ac1d0f61a77285f137adc12595a482"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1991msamp">
+ <description>1991-92 MECC Sampler (T-632 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="T-632" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-t632 mecc sampler 1991-92 v1.0 (4am crack).dsk" size="143360" crc="7201eaa6" sha1="df3eec59fbc007dc41b33bb137305c973bd8dcee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="2400ad">
+ <description>2400 A.D. (4am crack)</description>
+ <year>1987</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-24 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="2400 a.d. (4am crack) side a.dsk" size="143360" crc="b213865f" sha1="6f32418850fa522019233743e19ceac5bd961c95" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="2400 a.d. (4am crack) side b.dsk" size="143360" crc="30248b30" sha1="6154a819e207104af57b262c950fa225a8b0d1a1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="achristadvr1" cloneof="achristadv">
<description>A Christmas Adventure (revision 1) (4am crack)</description>
<year>1984</year>
<publisher>Bitcards</publisher>
- <info name="programmer" value="Frank Winstan, Ron Sperber, and Larry Callahan" />
+ <info name="programmer" value="Frank Winstan" />
+ <info name="programmer" value="Ron Sperber" />
+ <info name="programmer" value="Larry Callahan" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-01-16-->
- <!--adventure game-->
+ <!-- Dump released: 2019-01-16 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -39893,12 +17225,14 @@ license:CC0-1.0
<description>A Christmas Adventure (version 2.0) (4am crack)</description>
<year>1984</year>
<publisher>Bitcards</publisher>
- <info name="programmer" value="Frank Winstan, Ron Sperber, and Larry Callahan" />
+ <info name="programmer" value="Frank Winstan" />
+ <info name="programmer" value="Ron Sperber" />
+ <info name="programmer" value="Larry Callahan" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--adventure game-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -39920,8 +17254,8 @@ license:CC0-1.0
<info name="programmer" value="Susan Banta" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-17-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -39936,6 +17270,358 @@ license:CC0-1.0
</part>
</software>
+ <software name="mysdblftr">
+ <description>A Mystery Double Feature (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Megan Stine" />
+ <info name="programmer" value="H. William Stine" />
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Ane C. Flynn" />
+ <info name="programmer" value="Lorene Lavera" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Ron Klug" />
+ <info name="programmer" value="Loretta Jones" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-11-09 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Haunted House"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mystery double feature (4am crack) side a.dsk" size="143360" crc="18795e37" sha1="d998f1c63969f20ee18df6c9bd6c4e7b74440970" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Mystery at Pinecrest Manor"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mystery double feature (4am crack) side b.dsk" size="143360" crc="5ba5504b" sha1="8ad90c38e95a7cef99c919454e26764094a9a6b7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nawrtime">
+ <description>A Newbery Adventure: A Wrinkle in Time (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="author" value="Madeleine L'Engle" />
+ <info name="programmer" value="Dean VanDeCarr" />
+ <info name="programmer" value="Janice Kanter" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="a newbery adventure - a wrinkle in time (4am crack).dsk" size="143360" crc="76275127" sha1="8134d7e6c74917c1ab16abe33005b55eb0d53e25" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nacharweb">
+ <description>A Newbery Adventure: Charlotte's Web (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="author" value="E. B. White" />
+ <info name="programmer" value="Neil Larimer" />
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="a newbery adventure - charlotte's web (4am crack).dsk" size="143360" crc="158943a0" sha1="afc5c41c8249ce3a2764115e5379e2b561914285" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrppengs">
+ <description>A Newbery Adventure: Mr. Popper's Penguins (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="author" value="Richard Atwater and Florence Atwater" />
+ <info name="programmer" value="Neil Larimer" />
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mr. popper's penguins (4am crack).dsk" size="143360" crc="6db1639e" sha1="29c83851cedb3e49856f8c2d4e2dd49972cb99e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scruples">
+ <description>A Question of Scruples (4am crack)</description>
+ <year>1988</year>
+ <publisher>Leisure Genius</publisher>
+ <info name="developer" value="Sentient Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-23 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="a question of scruples (4am crack) - disk a (program disk).dsk" size="143360" crc="aaec2b02" sha1="a9cd29b0b2aecf4dd9775dfc4ccaaf03392bcd06"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B - Questions"/>
+ <dataarea name="flop" size="143360">
+ <rom name="a question of scruples (4am crack) - disk b (questions disk).dsk" size="143360" crc="33c1767c" sha1="544768e88fe46690b40f218dc7d43720015babdc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="weekchng">
+ <description>A Week That Changed The World (4am crack)</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House"/>
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="a week that changed the world (4am crack) side a.dsk" size="143360" crc="d4ed4dfa" sha1="6e434634f0f8911af19edb00e0bb9bca01b3cde7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="a week that changed the world (4am crack) side b.dsk" size="143360" crc="5de32c03" sha1="9da24d2da6528248f40ffb7e625e6495f0b862e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amazwrds">
+ <description>A-mazing Words (4am crack)</description>
+ <year>1985</year>
+ <publisher>World Book</publisher>
+ <info name="developer" value="Synergistic Software"/>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="a-mazing words (4am crack).dsk" size="143360" crc="2e7829ee" sha1="557999bc8ccdbd21dddd825f59ab3947dd02c62f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aisdqsample">
+ <description>Accessing Information Series: Databases in the Classroom: Dataquest: Sampler (A-173 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-173" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a173 dataquest sampler v1.0 (4am crack).dsk" size="143360" crc="2dc20258" sha1="5e16478c96680d7f27c45c30d622ed9e01623024" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdqcom10" cloneof="aismdqcom">
+ <description>Accessing Information Series: MECC Dataquest Composer (A-172 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-172" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a172 mecc dataquest composer v1.0 (4am crack).dsk" size="143360" crc="c11e1562" sha1="bf87e04bc6e07c2c5989b7c011b0fb5a72742191"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdqcom">
+ <description>Accessing Information Series: MECC Dataquest Composer (A-172 version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-172" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10. Redumped 2021-02-28 to patch additional RWTS swappers that affected the self-booting data disks it creates. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a172 mecc dataquest composer v1.1 (4am crack).dsk" size="143360" crc="ee94e2fd" sha1="4e2a864d46648752230079f36f56ca7034da0823" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdq50s">
+ <description>Accessing Information Series: MECC Dataquest: The Fifty States (A-163 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-163" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a163 mecc dataquest- the fifty states v1.0 (4am crack).dsk" size="143360" crc="2627bb27" sha1="b7330dfb679e684b51ce4239081212dd2c47f216"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdqpres11" cloneof="aismdqpres">
+ <description>Accessing Information Series: MECC Dataquest: The Presidents (A-140 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-140" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a140 mecc dataquest- the presidents v1.1 (4am crack) side a.dsk" size="143360" crc="1f15f0e9" sha1="69e2cf42cab15b6f92546ab1fd5c99cce0e855b8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a140 mecc dataquest- the presidents v1.1 (4am crack) side b.dsk" size="143360" crc="a4eff65b" sha1="37f84923543feac99a5c40b2e5acd5945ba150bb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdqpres">
+ <description>Accessing Information Series: MECC Dataquest: The Presidents (A-140 version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-140" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a140 mecc dataquest - the presidents v1.2 (4am crack) side a.dsk" size="143360" crc="f6ca8cc6" sha1="b6922153cf050e185674ae132f5dccdac259fc2c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a140 mecc dataquest - the presidents v1.2 (4am crack) side b.dsk" size="143360" crc="4ee86200" sha1="46db8c27e9605440a156e3d9597220864cae7dc9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdqwc10" cloneof="aismdqwc">
+ <description>Accessing Information Series: MECC Dataquest: The World Community (A-197 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-197" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a197 mecc dataquest - the world community v1.0 (4am crack).dsk" size="143360" crc="2f642b64" sha1="3bd5252bd32b53e73d4727938e3483c4bf79ba36" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aismdqwc">
+ <description>Accessing Information Series: MECC Dataquest: The World Community (A-197 version 1.1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-197" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a197 mecc dataquest - the world community v1.1 (4am crack).dsk" size="143360" crc="92429ea2" sha1="4166c6368a86bf89912e1a46dd7bdfe0fe5bfea0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aisstufffet">
+ <description>Accessing Information Series: MECC Stuff and Fetch (A-138 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-138" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a138 mecc stuff and fetch v1.0 (4am crack).dsk" size="143360" crc="83e2003b" sha1="bedf925cd828d727e5630fa65d7fcc2b6297cc62" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aistrivmac">
+ <description>Accessing Information Series: MECC Trivia Machine (A-139 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-139" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a139 mecc trivia machine v1.1 (4am crack) side a.dsk" size="143360" crc="5f62978f" sha1="a26f296bc928148da7e43af9333bd07658ff8c79" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a139 mecc trivia machine v1.1 (4am crack) side b.dsk" size="143360" crc="ad2012b1" sha1="d6f7a97799329f85d080d08d62748bef95886cbd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="acedetr1" cloneof="acedet">
<description>Ace Detective (revision 1) (4am crack)</description>
<year>1987</year>
@@ -39944,8 +17630,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-04-24-->
- <!--educational game-->
+ <!-- Dump released: 2015-04-24 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -39968,8 +17654,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-14-->
- <!--educational game-->
+ <!-- Dump released: 2015-07-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -39992,8 +17678,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-11-->
- <!--educational game-->
+ <!-- Dump released: 2023-12-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -40015,8 +17701,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-09-18-->
- <!--educational game-->
+ <!-- Dump released: 2018-09-18 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -40038,8 +17724,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-17-->
- <!--educational game-->
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -40061,8 +17747,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-17-->
- <!--educational game-->
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -40077,6 +17763,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="acidbase">
+ <description>Acid / Base Reactions (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="J. Frazin and Partners" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="acid base reactions (4am crack).dsk" size="143360" crc="fa5db5c3" sha1="170cc86fae588b8e058e50d48e27191fd6168a96" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="actpreps">
<description>ACT Preparation Series (version 1984) (4am crack)</description>
<year>1984</year>
@@ -40085,8 +17787,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1984" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-25-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Math 1" />
<dataarea name="flop" size="143360">
@@ -40107,16 +17809,155 @@ license:CC0-1.0
</part>
</software>
+ <software name="addreada">
+ <description>ADD Reading Skills A (4am crack)</description>
+ <year>1985</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="add reading skills a (4am crack) disk 1.dsk" size="143360" crc="86276945" sha1="9c157d439b2e941b52f68efeeb32184c0f7dec2f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="add reading skills a (4am crack) disk 2.dsk" size="143360" crc="a74f2dce" sha1="5e4e01f13b96d23936d1f7be372e6c34484326c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="addreadb">
+ <description>ADD Reading Skills B (4am crack)</description>
+ <year>1985</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="add reading skills b (4am crack) disk 1.dsk" size="143360" crc="59fc1350" sha1="f1b4bcf2dab8da94a23ccb3a7d2996f7917b490c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="add reading skills b (4am crack) disk 2.dsk" size="143360" crc="60f49247" sha1="7ab72962f00965ed93aead7a79c42ca3959527c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="addfracdm">
+ <description>Adding Fractions (version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="adding fractions (4am crack).dsk" size="143360" crc="7854117b" sha1="e14b13e47ff1dcf32585d454b3d0b0812eef1fb6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="addmagic">
+ <description>Addition Magician (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="addition magician (4am crack).dsk" size="143360" crc="16cbdf67" sha1="17bb8a5e1409f67a654b33e243f8ff57fb1f094a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adjectiv062984" cloneof="adjectiv">
+ <description>Adjectives (version 06.29.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="06.29.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="adjectives 06.29.84 (4am crack).dsk" size="143360" crc="ae4afb02" sha1="d78d91b0d4d3d11d098721470ed504ca978561c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adjectiv">
+ <description>Adjectives (version 05.25.87) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="05.25.87" />
+ <!-- improved menus -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="adjectives (4am crack).dsk" size="143360" crc="a7bcb572" sha1="9fb33b14557dd5d0bd8ccd5a691a5e2f7b2f125b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advanalo">
+ <description>Advanced Analogies (version 29.06.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleisher" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="29.06.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-03 -->
+ <!-- educational program -->
+ <!-- missing disk 1. disk 2 is bootable. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="advanced analogies (4am crack) disk 1.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="advanced analogies (4am crack) disk 2.dsk" size="143360" crc="827673ff" sha1="55ee9c6da33ebf0a18429f983cc2e2e329dc4f7b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="advelec">
<description>Advanced Electricity (4am crack)</description>
<year>1984</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="developer" value="Educational Materials and Equipment" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="advanced electricity (4am crack).dsk" size="143360" crc="dd8cc60f" sha1="e290354b903160b8aa8425f9aa95ec744043eb9f"/>
@@ -40124,6 +17965,82 @@ license:CC0-1.0
</part>
</software>
+ <software name="advmthsh">
+ <description>Advanced Math Shop (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="advanced math shop (4am crack) side a.dsk" size="143360" crc="8e1db4d5" sha1="0b2ae1f94a2a7676b1eee0447d4f779053a49a44" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="advanced math shop (4am crack) side b.dsk" size="143360" crc="d1eae526" sha1="2fcf3d82038296960081facd695a4a43f3d3c561" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advalpha">
+ <description>Adventure Alpha (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-19 -->
+ <!-- educational adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="adventure alpha (4am crack).dsk" size="143360" crc="d4b3830a" sha1="99523eb5184a87f825912bd56b4cd52a36a0e964" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advconst">
+ <description>Adventure Construction Set (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Stuart Smith" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-22 -->
+ <!-- game development program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="adventure construction set (4am and san inc crack) disk 1a.dsk" size="143360" crc="f68209e8" sha1="0e0aee9d92232f818c8124a4b080b99ec268f430" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="adventure construction set (4am and san inc crack) disk 1b.dsk" size="143360" crc="612c2b59" sha1="d2616d0038a39cf7d97441b0d612bfa5ae541a9a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="adventure construction set (4am and san inc crack) disk 2a.dsk" size="143360" crc="54030240" sha1="b5c9e3d650cc7fe5c1620ce8f339d2efffc6e73d" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="adventure construction set (4am and san inc crack) disk 2b.dsk" size="143360" crc="fc6d82b3" sha1="72d0ed56b5e9eb23c7f34ff75e662ffc7d4c5877" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="advcreat">
<description>Adventure Creator (4am crack)</description>
<year>1984</year>
@@ -40131,8 +18048,8 @@ license:CC0-1.0
<info name="programmer" value="Dale Disharoon" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-01-06-->
- <!--game development-->
+ <!-- Dump released: 2020-01-06 -->
+ <!-- game development -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventure creator (4am crack).dsk" size="143360" crc="9113263a" sha1="dda864a6965a75f27b78bb0510bf21389b720b2a"/>
@@ -40143,12 +18060,12 @@ license:CC0-1.0
<software name="apstriplon">
<description>Adventures in Problem Solving: A Trip to London (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventures in problem solving- a trip to london (4am crack).dsk" size="143360" crc="7ab51fd5" sha1="75e78f972e5ed1ea0535340a8d4d0902f87bed1d" />
@@ -40159,12 +18076,12 @@ license:CC0-1.0
<software name="apsalicenl">
<description>Adventures in Problem Solving: Alice's Adventure in Numberland (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventures in problem solving- alice's adventure in numberland (4am crack).dsk" size="143360" crc="7a8f1c60" sha1="9ff19ce97e62afe00a2e7f5faf82f11d2628c742" />
@@ -40175,12 +18092,12 @@ license:CC0-1.0
<software name="apsmarat">
<description>Adventures in Problem Solving: Marathon (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventures in problem solving- marathon (4am crack).dsk" size="143360" crc="c67ffbd7" sha1="5ef9ed040cfa292b2b6e79e6fad2f4d36ceee3db" />
@@ -40191,12 +18108,12 @@ license:CC0-1.0
<software name="apstreasfi">
<description>Adventures in Problem Solving: The Treasure of Forest Isle (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventures in problem solving- the treasure of forest isle (4am crack).dsk" size="143360" crc="6f317333" sha1="a0b9fa11126a983f0d5a4f94175e8588b7509ef9" />
@@ -40208,11 +18125,11 @@ license:CC0-1.0
<description>Adventures in Space (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-22-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventures in space (4am crack).dsk" size="143360" crc="e0c1bf7b" sha1="34c02fa6158c91faa1525d72ecf3d64bf1aae44b"/>
@@ -40225,12 +18142,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-774" />
- <info name="programmer" value="H. Bill Way and Mike Boucher"/>
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Mike Boucher" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-08-02-->
- <!--educational program-->
+ <!-- Dump released: 2016-08-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a774 adventures with fractions v1.0 (4am crack).dsk" size="143360" crc="19082fe3" sha1="69fa9f09131a664de126ca44297a338eeb9ac2b5" />
@@ -40243,12 +18161,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-774" />
- <info name="programmer" value="H. Bill Way and Mike Boucher"/>
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Mike Boucher" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a774 adventures with fractions v1.1 (4am crack).dsk" size="143360" crc="2b79d5a9" sha1="60eeee6d535f82c26008f1c4a3ab4553411989d2"/>
@@ -40256,17 +18175,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="agentusa">
+ <description>Agent USA (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar Khudari" />
+ <info name="programmer" value="Chris Lutes" />
+ <info name="programmer" value="Peter Reynolds" />
+ <info name="programmer" value="Leonard Bertoni" />
+ <info name="usage" value="Runs on any Apple ][ model with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-11 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="agent usa (4am crack).dsk" size="143360" crc="13057c2c" sha1="6cecfadfadf2c7ffbcbdfaba3205d479d978a812" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="alfbbndtut">
<description>Alfred's Basic Band Computer Tutor (version 5/6/85) (4am crack)</description>
<year>1985</year>
<publisher>Alfred Publishing Company</publisher>
- <info name="programmer" value="Sandy Feldstein and John O'Reilly" />
- <info name="usage" value="Requires an 48K Apple ][+ or later." />
+ <info name="programmer" value="Sandy Feldstein" />
+ <info name="programmer" value="John O'Reilly" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 5/6/85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-06-16-->
- <!--Disk 2 is a "preview" disk that has a limited selection of lessons.-->
- <!--educational program-->
+ <!-- Dump released: 2015-06-16 -->
+ <!-- Disk 2 is a "preview" disk that has a limited selection of lessons. -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -40287,10 +18227,10 @@ license:CC0-1.0
<publisher>Alfred Publishing Company</publisher>
<info name="developer" value="Electronic Courseware Systems" />
<info name="programmer" value="Sandy Feldstein" />
- <info name="usage" value="Requires an 48K Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-21-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alfred's basic piano theory software (4am crack).dsk" size="143360" crc="1f485dcb" sha1="1459336aec81f2b8dbd690550c5092f402014c16" />
@@ -40303,10 +18243,10 @@ license:CC0-1.0
<year>1984</year>
<publisher>Alfred Publishing Company</publisher>
<info name="programmer" value="Sandy Feldstein" />
- <info name="usage" value="Requires an 48K Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -40327,15 +18267,120 @@ license:CC0-1.0
</part>
</software>
+ <software name="algblast072185" cloneof="algblast">
+ <description>Alge-Blaster! (version 072185) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson, Ph.D." />
+ <info name="programmer" value="Anders Beitnes" />
+ <info name="programmer" value="Wendy Barels" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="072185" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="alge-blaster (4am crack) side a.dsk" size="143360" crc="6281add0" sha1="ee14ba87d154b8892406b76b28df07153e94b012" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="alge-blaster (4am crack) side b.dsk" size="143360" crc="df699a73" sha1="35835eb83a959ef0ba8b63683b3f674f3955d0aa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="algblast">
+ <description>Alge-Blaster! (800K 3.5") (4am crack)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson, Ph.D." />
+ <info name="programmer" value="Anders Beitnes" />
+ <info name="programmer" value="Wendy Barels" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="alge-blaster (4am crack).2mg" size="819264" crc="ea796c21" sha1="395572a20a0049a76cc9a72dcb32d50c1b18abe5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="algblap10_525" cloneof="algblap">
+ <description>Alge-Blaster Plus! (version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="David Ely" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="alge-blaster plus (4am crack) program disk side 1.dsk" size="143360" crc="e8d890c7" sha1="e2dbdde612c1da4543d79a6a8bd793a9a3501320" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="alge-blaster plus (4am crack) program disk side 2.dsk" size="143360" crc="90c22d74" sha1="75d3c345e93dfe177ae4e2c5cd85bd770bead924" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Data" />
+ <dataarea name="flop" size="143360">
+ <rom name="alge-blaster plus (4am crack) data disk side 1.dsk" size="143360" crc="cbd1a613" sha1="fde73dbad3ede97e2e1758b2f20fcf42e5756c5d" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Data" />
+ <dataarea name="flop" size="143360">
+ <rom name="alge-blaster plus (4am crack) data disk side 2.dsk" size="143360" crc="8d94d796" sha1="8716509d1e68ad38f269d411b6c67838d4e9c4e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="algblap">
+ <description>Alge-Blaster Plus! (version 1.0) (800K 3.5") (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="David Ely" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="alge-blaster plus 800k (4am crack).2mg" size="819264" crc="5869f6ff" sha1="f43860cec0ff54f89045e0ed0c4411667930600e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="algactn">
- <description>Algebra Action (4am crack)</description>
+ <description>Algebra Action: Courseware for Algebra I (4am crack)</description>
<year>1986</year>
<publisher>Houghton Mifflin</publisher>
- <info name="developer" value=" Prentice Associates" />
+ <info name="developer" value="Prentice Associates" />
<info name="usage" value="Requires an 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -40366,12 +18411,13 @@ license:CC0-1.0
<description>Algebra Drill and Practice I (version 1.1, June 1985) (4am crack)</description>
<year>1985</year>
<publisher>CONDUIT Educational Software</publisher>
- <info name="programmer" value="Richard C. Detmer and Clinton W. Smullen III" />
+ <info name="programmer" value="Richard C. Detmer" />
+ <info name="programmer" value="Clinton W. Smullen III" />
<info name="usage" value="Requires a Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-12-05-->
- <!--educational program-->
+ <!-- Dump released: 2020-12-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -40390,12 +18436,13 @@ license:CC0-1.0
<description>Algebra Drill and Practice II (version 1.1, January 1985) (4am crack)</description>
<year>1985</year>
<publisher>CONDUIT Educational Software</publisher>
- <info name="programmer" value="Richard C. Detmer and Clinton W. Smullen III" />
+ <info name="programmer" value="Richard C. Detmer" />
+ <info name="programmer" value="Clinton W. Smullen III" />
<info name="usage" value="Requires a Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-12-05-->
- <!--educational program-->
+ <!-- Dump released: 2020-12-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -40414,11 +18461,12 @@ license:CC0-1.0
<description>Algebra Volume 1 (version 1.1.2, 15-SEP-81) (Edu-Ware) (4am crack)</description>
<year>1981</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1.2, 15-SEP-81" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-09-09-->
- <!--educational game-->
+ <!-- Dump released: 2021-09-09 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 1 v1.1.2 (4am crack).dsk" size="143360" crc="5388d103" sha1="c8c9e942096bc029a06b871e8c3d46661ca7575c"/>
@@ -40430,11 +18478,12 @@ license:CC0-1.0
<description>Algebra Volume 1 (version 1.3, 31-DEC-81) (Edu-Ware) (4am crack)</description>
<year>1981</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3, 31-DEC-81" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-17-->
- <!--educational game-->
+ <!-- Dump released: 2015-07-17 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 1 v1.3 (4am crack).dsk" size="143360" crc="faef1e45" sha1="e970fd06712c05c06b005a7b548591d21ee2c907" />
@@ -40443,15 +18492,16 @@ license:CC0-1.0
</software>
<software name="algv1v13s" cloneof="algv1">
- <description>Algebra Volume 1 (version 1.3, 31-DEC-81) (SoftSmith) (4am and san inc crack)</description>
+ <description>Algebra Volume 1 (version 1.3, 31-DEC-81) (Softsmith) (4am and san inc crack)</description>
<year>1981</year>
- <publisher>SoftSmith</publisher>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3, 31-DEC-81" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-26-->
- <!--educational game-->
+ <!-- Dump released: 2021-06-26 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra i v1.3 (softsmith) (4am and san inc crack).dsk" size="143360" crc="c750d7ec" sha1="e55fd8e1fd849dbf2b7ee118221956961975a617"/>
@@ -40463,12 +18513,13 @@ license:CC0-1.0
<description>Algebra Volume 1 (version 1.7, 14-SEP-84) (Peachtree) (4am crack)</description>
<year>1984</year>
<publisher>Peachtree Software</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.7, 14-SEP-84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-04-27-->
- <!--educational game-->
+ <!-- Dump released: 2015-04-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 1 (edu-ware) (4am crack).dsk" size="143360" crc="3c53e46c" sha1="e9266c93e1acd293010aeaf44159812ceee5db47" />
@@ -40480,11 +18531,12 @@ license:CC0-1.0
<description>Algebra Volume 2 (version 1.0, 01-APR-82) (Edu-Ware) (4am crack)</description>
<year>1982</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0, 01-APR-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-04-25-->
- <!--educational game-->
+ <!-- Dump released: 2014-04-25 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra 2 (4am crack).dsk" size="143360" crc="2b276045" sha1="ac9e9129dd3f6c507553913b53159192051ca67c" />
@@ -40496,11 +18548,12 @@ license:CC0-1.0
<description>Algebra Volume 2 (version 1.1, 10-MAY-83) (Edu-Ware) (4am crack)</description>
<year>1983</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1, 10-MAY-83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-07-->
- <!--educational game-->
+ <!-- Dump released: 2015-08-07 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 2 v1.1 (4am crack).dsk" size="143360" crc="e217f095" sha1="2a826b7c367b33ee5aa310f47452e5dd66bf3d15" />
@@ -40512,11 +18565,12 @@ license:CC0-1.0
<description>Algebra Volume 3 (version 1.0, 10-JUN-82) (Edu-Ware) (4am crack)</description>
<year>1982</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0, 10-JUN-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-07-22-->
- <!--educational game-->
+ <!-- Dump released: 2019-07-22 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 3 v1.0 (4am crack).dsk" size="143360" crc="77c7dabb" sha1="cc9a9096098ccf3ee6b490c329981ef5cde88e7b" />
@@ -40528,11 +18582,12 @@ license:CC0-1.0
<description>Algebra Volume 3 (version 1.2, 10-MAY-83) (Edu-Ware) (4am crack)</description>
<year>1983</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0, 10-JUN-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-07-->
- <!--educational game-->
+ <!-- Dump released: 2015-08-07 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 3 v1.2 (4am crack).dsk" size="143360" crc="6ba4aa97" sha1="297f0087730ab04d38c6dbde6405304d1c6ce26f" />
@@ -40544,13 +18599,14 @@ license:CC0-1.0
<description>Algebra Volume 3 (revision 0, 1984) (Edu-Ware) (4am crack)</description>
<year>1984</year>
<publisher>Edu-Ware Services</publisher>
- <!--Edu-Ware Services channged name to Britannica Software-->
+ <!-- Edu-Ware Services channged name to Britannica Software -->
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0, 1984" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-07 Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2021-04-07 Redumped: 2021-08-28 -->
+ <!-- Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 3 rev. 0 (4am crack).dsk" size="143360" crc="14d5ea47" sha1="0e31c95f052799c3322658b2c2b2fd79d6e7c56f" />
@@ -40562,14 +18618,15 @@ license:CC0-1.0
<description>Algebra Volume 3 (revision 4, 1984) (Britannica) (4am crack)</description>
<year>1984</year>
<publisher>Britannica Software</publisher>
- <!--Edu-Ware Services channged name to Britannica Software-->
+ <!-- Edu-Ware Services channged name to Britannica Software -->
+ <info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 4, 1984" />
- <!--Title screen still says Edu-Ware; they only changed the disk label and the printed material when they bought the company. And re-released everything with the latest copy protection.-->
+ <!-- Title screen still says Edu-Ware; they only changed the disk label and the printed material when they bought the company. And re-released everything with the latest copy protection. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-12-->
- <!--educational game-->
+ <!-- Dump released: 2023-09-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 3 rev. 4 (4am crack).dsk" size="143360" crc="fb3dfd1e" sha1="b44cf496013f5365deb42348583a44d401e8a9f5" />
@@ -40581,11 +18638,12 @@ license:CC0-1.0
<description>Algebra Volume 4 (version 1.0, 10-JAN-83) (Edu-Ware) (4am crack)</description>
<year>1983</year>
<publisher>Edu-Ware Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0, 10-JAN-83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-07-->
- <!--educational game-->
+ <!-- Dump released: 2015-08-07 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 4 v1.0 (4am crack).dsk" size="143360" crc="968d3e45" sha1="91346a212faab28d992a1d6570bb85a878219674" />
@@ -40597,13 +18655,14 @@ license:CC0-1.0
<description>Algebra Volume 4 (version 1.1, 01-MAY-84) (Peachtree) (4am crack)</description>
<year>1984</year>
<publisher>Peachtree Software</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1, 01-MAY-84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-07 Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2021-04-07 Redumped: 2021-08-28 -->
+ <!-- Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 4 v1.1 (4am crack).dsk" size="143360" crc="ae3d610f" sha1="2b7dc564f74d7ad3d503be4b0ff290e1433cc131" />
@@ -40615,12 +18674,13 @@ license:CC0-1.0
<description>Algebra Volume 5 (version 1.2, 01-MAY-84) (Peachtree) (4am crack)</description>
<year>1984</year>
<publisher>Peachtree Software</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.2, 01-MAY-84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-12-->
- <!--educational game-->
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 5 v1.2 (4am crack).dsk" size="143360" crc="28dbb4b0" sha1="088ce244d7fe5485ef2a732c560cbc685e1bbf88" />
@@ -40632,12 +18692,13 @@ license:CC0-1.0
<description>Algebra Volume 6 (version 1.0, 1984) (4am crack)</description>
<year>1983</year>
<publisher>EduWare Services</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0, 1984" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-02-01 Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2020-02-01 Redumped: 2021-08-28 -->
+ <!-- Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 6 v1.0 (4am crack).dsk" size="143360" crc="043a9975" sha1="8182546a02465d5e07d3de9bd9ce3af07af04cf2" />
@@ -40649,12 +18710,13 @@ license:CC0-1.0
<description>Algebra Volume 6 (version 1.2, 01-MAY-84) (Peachtree) (4am crack)</description>
<year>1984</year>
<publisher>Peachtree Software</publisher>
+ <info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.2, 01-MAY-84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-12-->
- <!--educational game-->
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra volume 6 v1.2 (4am crack).dsk" size="143360" crc="7793768a" sha1="d4192d4ac569b610d67b9467b0010a9d89e286b5" />
@@ -40663,14 +18725,15 @@ license:CC0-1.0
</software>
<software name="algwdpr">
- <description>Algebra Word Problems (4am crack)</description>
+ <description>Algebra Word Problems (version 1983) (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
<info name="developer" value="Intellectual Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="algebra word problems (4am crack).dsk" size="143360" crc="3b0734f3" sha1="3ee4bffd99a078f0e1de53acda375a01f0d5f045" />
@@ -40678,16 +18741,124 @@ license:CC0-1.0
</part>
</software>
+ <software name="algernon">
+ <description>Algernon: An Introduction to Programming Logic (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom Bretl" />
+ <info name="programmer" value="Larry Bank" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="algernon (4am crack).dsk" size="143360" crc="7f4cd588" sha1="7356d7d510690126ee36270a415dac857553387a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alibaba">
+ <description>Ali Baba and the Forty Thieves (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="original_publisher" value="Stuart Smith" />
+ <info name="programmer" value="Stuart Smith" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ali baba and the forty thieves (4am and san inc crack).dsk" size="143360" crc="85829ce0" sha1="ef4868fee81fc6d2b7c75ed100d5569c6c3c187d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alibi">
+ <description>Alibi (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Ian L. Trackman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="alibi (4am crack).dsk" size="143360" crc="0b3db1e0" sha1="8d6a7c582944ee1d54c5c4d875ed4d2e41299ec1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alcwndrlr1" cloneof="alcwndrl">
+ <description>Alice in Wonderland (revision 1) (Windham Classics) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="original_publisher" value="Spinnaker Software" />
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="programmer" value="Laurence Yep" />
+ <info name="programmer" value="William Groetzinger" />
+ <info name="programmer" value="Vince Mills" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Revision 1 crack of this game was an earlier version. That one was protected with the E7 bitstream, invented in 1983 and productized in 1984. Revision 2 has a newer protection scheme that wasn't invented until 1985. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="alice in wonderland (4am crack) side a.dsk" size="143360" crc="46d03565" sha1="bf3ea2cdf0c5fb63aff9686605c2cae84774c62f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="alice in wonderland (4am crack) side b.dsk" size="143360" crc="f03e007e" sha1="fd960bf392beaa9f081ff36a9f621cd1ce5e3c92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alcwndrl">
+ <description>Alice in Wonderland (revision 2) (Windham Classics) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="original_publisher" value="Spinnaker Software" />
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="programmer" value="Laurence Yep" />
+ <info name="programmer" value="William Groetzinger" />
+ <info name="programmer" value="Vince Mills" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Revision 1 crack of this game was an earlier version. That one was protected with the E7 bitstream, invented in 1983 and productized in 1984. Revision 2 has a newer protection scheme that wasn't invented until 1985. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="alice in wonderland rev. 2 (4am crack) side a.dsk" size="143360" crc="e9a946e8" sha1="1d23a33c504df204af50d32093010c41f15d8cdc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="alice in wonderland rev. 2 (4am crack) side b.dsk" size="143360" crc="f249da10" sha1="9ec87f245a6ad0a0414f0b5b1a9c66da94719db0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="alcfacflr1" cloneof="alcfacfl">
- <description>Aliencounter and Face Flash (revision 1) (4am crack)</description>
+ <description>Aliencounter &amp; Face Flash (revision 1) (4am crack)</description>
<year>1982</year>
- <publisher>Milliken Publishing</publisher>
+ <publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
- <info name="version" value="revision 2" />
+ <info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-02-->
- <!--educational program-->
+ <!-- Dump released: 2015-08-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="aliencounter and face flash (4am crack).dsk" size="143360" crc="5e2c6e65" sha1="91ef87ba36f6e584b813e3dc6a33805674eef169" />
@@ -40696,16 +18867,16 @@ license:CC0-1.0
</software>
<software name="alcfacfl">
- <description>Aliencounter and Face Flash (revision 2) (4am crack)</description>
+ <description>Aliencounter &amp; Face Flash (revision 2) (4am crack)</description>
<year>1982</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This updated revision has unspecified bug fixes.-->
+ <!-- This updated revision has unspecified bug fixes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-12-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="aliencounter and face flash rev. 2 (4am crack).dsk" size="143360" crc="bc169f30" sha1="91eceb78ee0283a22fcf74270a20a7083c7d9ac9" />
@@ -40713,6 +18884,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="algncroc">
+ <description>Alligators and Crocodiles (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="alligators and crocodiles (4am crack).dsk" size="143360" crc="9912e92c" sha1="5bd30ca5f6ddaca8df5567d6462c769c71080772" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="alcircusr0" cloneof="alcircus">
<description>Alphabet Circus (revision 0) (4am crack)</description>
<year>1984</year>
@@ -40720,10 +18907,10 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This revision has simpler protection, suggesting an earlier release.-->
+ <!-- This revision has simpler protection, suggesting an earlier release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet circus rev. 0 (4am crack).dsk" size="143360" crc="0be03a63" sha1="9f6e121a85f7f39b7c60ac53c5afafbda93de463"/>
@@ -40738,10 +18925,10 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This revision has more advanced protection, suggesting a later release.-->
+ <!-- This revision has more advanced protection, suggesting a later release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-05-26-->
- <!--educational program-->
+ <!-- Dump released: 2015-05-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet circus (4am crack).dsk" size="143360" crc="b3a6de8b" sha1="02e72f3c59196f74389ae2c50cdc1ea3b4fb2e9c" />
@@ -40753,11 +18940,12 @@ license:CC0-1.0
<description>Alphabet Fun: Big and Little Letters (4am crack)</description>
<year>1991</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Hudson Ansley and Millicent Sabater" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-19-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet fun- big and little letters (4am crack).dsk" size="143360" crc="07a4e2cb" sha1="a84981671825dba31caf3db7673d8226e7a6113d" />
@@ -40769,11 +18957,14 @@ license:CC0-1.0
<description>Alphabet Fun: Learning The Alphabet (4am crack)</description>
<year>1990</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Hudson Ansley, Millicent Sabater, Gregory Truex, and Millicent Sabater" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Millicent Sabater" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2019-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet fun - learning the alphabet (4am crack).dsk" size="143360" crc="e7e4eb65" sha1="7cb18cd049ce1a6a2eaa05a9fc646de8a2241f0b" />
@@ -40785,12 +18976,13 @@ license:CC0-1.0
<description>Alphabet Zoo (revision 1) (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Dale DeSharone (as Dale Disharoon) and Bill Groetzinger" />
+ <info name="programmer" value="Dale DeSharone (as Dale Disharoon)" />
+ <info name="programmer" value="Bill Groetzinger" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-05-->
- <!--educational game-->
+ <!-- Dump released: 2022-07-05 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet zoo (4am crack).dsk" size="143360" crc="ad1e15d2" sha1="80a8dd1717ef1f43f4302e767c946d35dc59daac" />
@@ -40802,12 +18994,13 @@ license:CC0-1.0
<description>Alphabet Zoo (revision 2) (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Dale DeSharone (as Dale Disharoon) and Bill Groetzinger" />
+ <info name="programmer" value="Dale DeSharone (as Dale Disharoon)" />
+ <info name="programmer" value="Bill Groetzinger" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-06-->
- <!--educational game-->
+ <!-- Dump released: 2023-12-06 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet zoo v1.0 rev 2 (4am crack).dsk" size="143360" crc="44a50f71" sha1="8f27f808eca87ebd2e8b3f0728d9dd4cedf72a9e" />
@@ -40819,12 +19012,13 @@ license:CC0-1.0
<description>Alphabet Zoo (revision 3) (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Dale DeSharone (as Dale Disharoon) and Bill Groetzinger" />
+ <info name="programmer" value="Dale DeSharone (as Dale Disharoon)" />
+ <info name="programmer" value="Bill Groetzinger" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-07-->
- <!--educational game-->
+ <!-- Dump released: 2023-12-07 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabet zoo v1.0 rev. 3 (4am crack).dsk" size="143360" crc="c459fb91" sha1="67152b4d78a574ab1d90106667c755c4ef09f2ed" />
@@ -40839,8 +19033,8 @@ license:CC0-1.0
<info name="developer" value="KARD Software" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-01-27-->
- <!--educational game-->
+ <!-- Dump released: 2016-01-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alphabetical order (4am crack).dsk" size="143360" crc="5fcc2314" sha1="767c342b711c9befa6fe67906179578864513773" />
@@ -40848,16 +19042,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="alphseq">
+ <description>Alphabetization Sequence (4am crack)</description>
+ <year>1980</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="alphabetization sequence (4am crack).dsk" size="143360" crc="fa88a171" sha1="fbb98ef8dd1cea5fa94b238ee4e7e5b5ca59f774" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="alptramrr0" cloneof="alptramr">
<description>Alpine Tram Ride (revision 0) (4am crack)</description>
<year>1985</year>
<publisher>Learning Technologies</publisher>
- <info name="developer" value="Learning Technologies" />
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
+ <!-- Does not show the Litag developer screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alpine tram ride rev. 0 (4am crack).dsk" size="143360" crc="ac357b0a" sha1="f13fa8a7fa2229a50dab045562eff0b4c65790c5" />
@@ -40868,15 +19078,15 @@ license:CC0-1.0
<software name="alptramr">
<description>Alpine Tram Ride (revision 1) (4am crack)</description>
<year>1985</year>
- <publisher>Litag Productions</publisher>
+ <publisher>Learning Technologies</publisher>
<info name="original_publisher" value="Learning Technologies" />
- <info name="developer" value="Learning Technologies" />
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--Has a different intro and developer information than revision 0.-->
+ <!-- Shows the Litag developer screen and the Learning Technologies screen is different. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2015-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alpine tram ride (4am crack).dsk" size="143360" crc="6f2f7d92" sha1="16b9751baedfe26e7bfc3a4462e3e459b4f47fe6" />
@@ -40889,12 +19099,16 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-336" />
- <info name="programmer" value="Diane Portner, Korey Schulz, Ju-Chang Wang, John P. Wlazlo, and Shari Zehm"/>
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="programmer" value="Shari Zehm" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a336 amazing arithmetricks v1.0 (4am crack).dsk" size="143360" crc="86a050a0" sha1="f409ec335fb0a6a42d3086ab3b49794dd0bc0a7c"/>
@@ -40902,45 +19116,61 @@ license:CC0-1.0
</part>
</software>
+ <software name="americ2c">
+ <description>America Coast to Coast (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="NeoSoft" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="america coast to coast (4am crack).dsk" size="143360" crc="005e3a68" sha1="17a70b6908fbbe38dedc5a54ce2490643b7c41fa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="amgovis">
<description>American Government (Intellectual Software) (4am crack)</description>
<year>1985</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Queue, Inc." />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-19-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
<rom name="american government (4am crack) disk 1.dsk" size="143360" crc="6724ed5f" sha1="a508a2e4b190c8f6c256c9704119fe419ef8e8b1" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="143360">
<rom name="american government (4am crack) disk 2.dsk" size="143360" crc="50e8e1bf" sha1="1f8245f8805e85c1cc1fcfe34b2c7d1516a305c4" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
<dataarea name="flop" size="143360">
<rom name="american government (4am crack) disk 3.dsk" size="143360" crc="c6467ed6" sha1="9e3ccee0e66bea63fb0a2a8100cdcb78f02860ab" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
<dataarea name="flop" size="143360">
<rom name="american government (4am crack) disk 4.dsk" size="143360" crc="fe480133" sha1="43188bde7bff9061fbb85265102bc31c7f05ed5d" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5"/>
<dataarea name="flop" size="143360">
<rom name="american government (4am crack) disk 5.dsk" size="143360" crc="4e75065c" sha1="d0110545a21f001cfa325822355234cae6cdf5c9" />
</dataarea>
</part>
- <part name="flop6" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="american government (4am crack) work disk.dsk" size="143360" crc="78986326" sha1="91653a36db2504f51f4d04482ef8de396191cdba" />
- </dataarea>
- </part>
</software>
<software name="amgovml">
@@ -40949,8 +19179,8 @@ license:CC0-1.0
<publisher>Micro Learningware</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-26-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="american government (4am crack).dsk" size="143360" crc="405ab0cf" sha1="07d3ca2fd17316f830a204382643b82a9708cacf" />
@@ -40958,15 +19188,188 @@ license:CC0-1.0
</part>
</software>
+ <software name="ahistac4">
+ <description>American History Achievement IV: World War II to the Present (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Jonathan Paul" />
+ <info name="programmer" value="Doug Higgins" />
+ <info name="programmer" value="Herb Panitz" />
+ <info name="programmer" value="Gary Santmyer" />
+ <info name="programmer" value="Carol McCavitt" />
+ <info name="programmer" value="Dan Skolnik" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="american history achievement iv - world war ii - present (4am crack).dsk" size="143360" crc="e53068bf" sha1="89b0e0a99726e4ec63d646a89a3edbb693883a38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amhisadv">
+ <description>American History Adventure (4am crack)</description>
+ <year>1984</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-21. Redumped: 2015-12-22 to fix compatibility issues. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="american history adventure (4am crack) disk 1.dsk" size="143360" crc="edc59ce1" sha1="70cfc2f59c69b2dbf96a30ce5cfde65019ba066f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="american history adventure (4am crack) disk 2.dsk" size="143360" crc="fb844c49" sha1="7536c32a6ab54997c696a367e2ed887ce1c15bb3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advdbl2">
+ <description>An Adventure Double Feature Volume II (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Loretta Jones" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="adventure double feature volume ii (4am and san inc crack) side a.dsk" size="143360" crc="a23d19ed" sha1="30aa8f1fd09356aeb1e716efc24e83f61085aeb5"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="adventure double feature volume ii (4am and san inc crack) side b.dsk" size="143360" crc="1d155dc9" sha1="a1924e1b6440c222e312b512273788e961a4832b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="analotut290684" cloneof="analotut">
+ <description>Analogies Tutorial (version 29.06.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleischer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="29.06.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial (4am crack) disk 1.dsk" size="143360" crc="f2d040aa" sha1="04091d08bb34a915f6da1e638fa3aedba5f4c635" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial (4am crack) disk 2.dsk" size="143360" crc="d437c9d8" sha1="08c3fa26acc6046eeab2aa4ccf2c8163e9fef257" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="analotut042585" cloneof="analotut">
+ <description>Analogies Tutorial (version 04.25.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleischer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.25.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial v04.25.85 (4am crack) disk 1.dsk" size="143360" crc="3ef60479" sha1="3175d88b91b99ce066f03b53bd0014a15dc12683"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial v04.25.85 (4am crack) disk 2.dsk" size="143360" crc="b8249576" sha1="3464e39776baca3892f6ceaa88ddf7fffe8386f2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="analotut121587" cloneof="analotut">
+ <description>Analogies Tutorial (version 12.15.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleischer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="12.15.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-05-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial v12.15.87 (4am crack) side a.dsk" size="143360" crc="fa2036cd" sha1="f1927b777d150dbc1343e78023cf7148fb314547"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial v12.15.87 (4am crack) side b.dsk" size="143360" crc="283b3b33" sha1="3cebf89919243d5f4ff4cd64f7f935e504f8ede3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="analotut">
+ <description>Analogies Tutorial (version 10.19.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleischer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.19.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial v10.19.89 (4am crack) disk 1.dsk" size="143360" crc="6a9e966a" sha1="805ed3aaa85cb091b2adf7455d074417438baa36" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="analogies tutorial v10.19.89 (4am crack) disk 2.dsk" size="143360" crc="f5cfd356" sha1="830c36ab2c68957ee02cd4301dbef9aee7dd75af" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="analresn">
<description>Analytical Reasoning (4am crack)</description>
<year>1983</year>
- <publisher>Queue</publisher>
- <info name="developer" value="Intellectual Software" />
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-13-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -40981,6 +19384,39 @@ license:CC0-1.0
</part>
</software>
+ <software name="animhomes">
+ <description>Animal Homes and Stories (4am crack)</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="animal homes and stories (4am crack).dsk" size="143360" crc="d2459e64" sha1="eabb18e5b30fcdbbc3d5125f2244c9d800c8c9d9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="anihotel">
+ <description>Animal Hotel (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="animal hotel (4am crack).dsk" size="143360" crc="1a3ebd0a" sha1="06e87b90198feefe446e66a86bb154758bd34c3a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="anphotof">
<description>Animal Photo Fun (4am crack)</description>
<year>1984</year>
@@ -40988,8 +19424,8 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="animal photo fun (4am crack).dsk" size="143360" crc="d2655497" sha1="b11ec4f5bee95eb1857771c8202b64d6dfb25daa" />
@@ -41004,8 +19440,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-27-->
- <!--"educational program-->
+ <!-- Dump released: 2023-01-27 -->
+ <!-- "educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="animal stories iv (4am crack).dsk" size="143360" crc="75c22c8e" sha1="1f7dada423dd98b92a786384a5731ea36c0d1ef2" />
@@ -41013,16 +19449,226 @@ license:CC0-1.0
</part>
</software>
+ <software name="anisurvecho">
+ <description>Animal Survival for Echo Voice System (version 06.29.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple //e or later with Echo Voice System." />
+ <info name="version" value="06.29.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="animal survival for echo voice system (4am crack).dsk" size="143360" crc="30a307c2" sha1="f54a31561dbb5d4b192c9a3eeebbbf76113bda61" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="anisurvufonic">
+ <description>Animal Survival for Ufonic Voice System (version 06.29.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple //e or later with Ufonic Voice System." />
+ <info name="version" value="06.29.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="animal survival for ufonic voice system (4am crack).dsk" size="143360" crc="d0c777e6" sha1="e88f5b99d3263ea53f40a084d557829e06d3f272" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="animate">
+ <description>Animate (4am crack)</description>
+ <year>1986</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Steven Ohmert" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-28. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. Redumped 2024-07-07 to add disk 3. -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Boot" />
+ <dataarea name="flop" size="143360">
+ <rom name="animate (4am crack) disk 1a - boot.dsk" size="143360" crc="4b89c917" sha1="46a77dfe78c3516362666699542433293aa03260" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="animate (4am crack) disk 1b - program.dsk" size="143360" crc="c16d5674" sha1="b4b4f800338b0c87fab7c8df5fba53decc396cfe" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Animation Library" />
+ <dataarea name="flop" size="143360">
+ <rom name="animate (4am crack) disk 2a - animation library.dsk" size="143360" crc="6491c465" sha1="403b8534858b9cb74564ea5832e5b72cd055b846" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Background Library" />
+ <dataarea name="flop" size="143360">
+ <rom name="animate (4am crack) disk 2b - background library.dsk" size="143360" crc="e32a2cd4" sha1="d469e03996f33e2bbe237993e1cb29652e4bd5a2" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Demonstration Show Disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="animate (4am crack) disk 3a - demonstration show disk.dsk" size="143360" crc="c3731133" sha1="a7bf97d984e891cf882d507d426a86dc74aca33a" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Programmer's Aids" />
+ <dataarea name="flop" size="143360">
+ <rom name="animate (4am crack) disk 3b - programmer's aids.dsk" size="143360" crc="b0db518d" sha1="3611a5021e399c194618e8905aafe96ebb41f883" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="antsyn052587" cloneof="antsyn">
+ <description>Antonyms/Synonyms (version 05.25.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="05.25.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="antonyms-synonyms 1 v05.25.87 (4am crack).dsk" size="143360" crc="da8ccd2d" sha1="fbcb6ed003652a74ef22603fbc1c5934b8722c59" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="antonyms-synonyms 2 v05.25.87 (4am crack).dsk" size="143360" crc="7f73b233" sha1="91ed0961daed6c02b47cdd4ea3c1c952366a9877" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="antsyn">
+ <description>Antonyms/Synonyms (version 08.02.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.02.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="antonyms-synonyms v08.02.89 (4am crack) disk 1.dsk" size="143360" crc="19a04510" sha1="cea7ce48b004271173b66f53456740ee18078643"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="antonyms-synonyms v08.02.89 (4am crack) disk 2.dsk" size="143360" crc="ea1cd3e8" sha1="304582fb5fbddfee75d1254eca2a37a81bec9880"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aplcdspd">
+ <description>Apple Cider Spider (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ivan Strand" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="apple cider spider (4am crack).dsk" size="143360" crc="55fe5386" sha1="b72cc7e52dfce29df0e6bd95dbdba79203edc850" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="agalxiansc">
+ <description>Apple Galaxian (StarCraft) (4am crack)</description>
+ <year>1980</year>
+ <publisher>StarCraft</publisher>
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-23 -->
+ <!-- The game was later re-released by Brøderbund Software. -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="apple galaxian (starcraft) (4am crack).dsk" size="143360" crc="f2015816" sha1="d7f2e879638238bf909eceb194a7f4a1c66c7754"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="apvatlan">
+ <description>Apventure to Atlantis (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="apventure to atlantis (4am crack).dsk" size="143360" crc="6234256c" sha1="96e6ad0e0507f9d1b903e8afe184f6b6aa572848" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aquatron">
+ <description>Aquatron (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Justin Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="aquatron (4am crack).dsk" size="143360" crc="104e87d8" sha1="0ed3e1ec30a2712356c7d504d38605d810f4e83c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arbootcamp">
+ <description>Arcade Boot Camp (4am crack)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="John Besnard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="arcade boot camp (4am crack).dsk" size="143360" crc="07d556c3" sha1="e0a12dc797f5f358b5222f3753efdfc655a134e1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="adbmastmat">
<description>Arcademic Drill Builder: Master Match (4am crack)</description>
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell, Jerry Chaffin, and Barbara Thompson"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-09-02-->
- <!--educational program-->
+ <!-- Dump released: 2016-09-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="master match (4am crack).dsk" size="143360" crc="55f51bd3" sha1="661a2aee76ee637be730cd700f3d8d79daa320fb" />
@@ -41035,11 +19681,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell, Jerry Chaffin, and Barbara Thompson"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-03-09-->
- <!--educational program-->
+ <!-- Dump released: 2016-03-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="meteor mission (4am crack).dsk" size="143360" crc="8b809537" sha1="902b418c41aff8e9f89c6b13a9851be6414192db" />
@@ -41052,11 +19700,12 @@ license:CC0-1.0
<year>1986</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-05-15-->
- <!--educational program-->
+ <!-- Dump released: 2014-05-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="decimal discovery (4am crack).dsk" size="143360" crc="a9dd258b" sha1="4c39599a738c4f2ec039003e044a87320ca8acd9" />
@@ -41069,13 +19718,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 0" />
- <!--This version is 13-sector and DOS 3.2, which suggests it came first.-->
+ <!-- This version is 13-sector and DOS 3.2, which suggests it came first. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-08-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alien addition 1982.0 (4am crack).dsk" size="143360" crc="ab9ad63c" sha1="3af54aab6b6001bcb5e40a6fbeee4540e44f938c" />
@@ -41088,13 +19738,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 1" />
- <!--This version is DOS 3.3.-->
+ <!-- This version is DOS 3.3. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-20-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alien addition (4am crack).dsk" size="143360" crc="1eb420f5" sha1="075668510c8d1423d75d585703ee8ff78fbcbeb2" />
@@ -41107,13 +19758,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 2" />
- <!--This version is DOS 3.3. It contains weaker copy protection, suggesting it may be earlier than revision 1.-->
+ <!-- This version is DOS 3.3. It contains weaker copy protection, suggesting it may be earlier than revision 1. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-11-07-->
- <!--educational program-->
+ <!-- Dump released: 2015-11-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alien addition revision 2 (4am crack).dsk" size="143360" crc="431ff422" sha1="3b31f7f70b0b36a291fb32cf146ceb300be676a9" />
@@ -41126,13 +19778,16 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell, Jerry Chaffin, Barbara Thompson, and Allen Colebank"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Barbara Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1985" />
- <!--This version has a 1985 copyright.-->
+ <!-- This version has a 1985 copyright. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-29-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alien addition 1985 (4am crack).dsk" size="143360" crc="6f49910e" sha1="1e5bceb1c965f06d11af6fb8f21bd2bbc9564665" />
@@ -41145,12 +19800,14 @@ license:CC0-1.0
<year>1984</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell, Jerry Chaffin, and Barbara Thompson"/>
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
- <!--DOS 3.3-->
+ <!-- DOS 3.3 -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-25-->
- <!--educational program-->
+ <!-- Dump released: 2016-04-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alligator alley (4am crack).dsk" size="143360" crc="496d0c16" sha1="a6468a065964c67c5248ac00b66ddcf77b2569f9" />
@@ -41163,13 +19820,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin and Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 0" />
- <!--This version is 13-sector and DOS 3.2, which suggests it came first.-->
+ <!-- This version is 13-sector and DOS 3.2, which suggests it came first. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-02-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alligator mix 1982.0 (4am crack).dsk" size="143360" crc="d1496a46" sha1="95839befccabb2f23be2afeca053287bb51f1f99" />
@@ -41182,12 +19840,13 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin and Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-01-->
- <!--educational program-->
+ <!-- Dump released: 2015-07-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alligator mix (4am crack).dsk" size="143360" crc="8dfa2aea" sha1="83f53f6cb20289a1c836a793873836c0a441b251" />
@@ -41200,12 +19859,15 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbara Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1985 revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-26-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alligator mix 1985 (4am crack).dsk" size="143360" crc="e6c484d4" sha1="583208338064143d656d4140f9f4f46db7750b77"/>
@@ -41218,13 +19880,16 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbara Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1985 revision 2" />
- <!--Undated revision of the 1985 version contains unspecified changes.-->
+ <!-- Undated revision of the 1985 version contains unspecified changes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-05-04-->
- <!--educational program-->
+ <!-- Dump released: 2023-05-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="alligator mix 1985 rev. 2 (4am crack).dsk" size="143360" crc="f3637396" sha1="50c39c03206123e9a56e3d94db773da1dbd657c0" />
@@ -41237,13 +19902,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin and Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 0" />
- <!--This version is 13-sector and DOS 3.2, which suggests it came first.-->
+ <!-- This version is 13-sector and DOS 3.2, which suggests it came first. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-03-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="demolition division 1982.0 (4am crack).dsk" size="143360" crc="d925e806" sha1="cbd358f9af3dc380a0fa264ec0bdf7086dda2acf" />
@@ -41256,13 +19922,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin and Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 1" />
- <!--This version is DOS 3.2 but is not 13-sector, suggesting that it came later.-->
+ <!-- This version is DOS 3.2 but is not 13-sector, suggesting that it came later. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-12-23-->
- <!--educational program-->
+ <!-- Dump released: 2017-12-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="demolition division 1982.1 (4am crack).dsk" size="143360" crc="91347cd0" sha1="3643566787e051f69b069939a6a4ecfd187a07d3" />
@@ -41275,13 +19942,16 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbara Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1985 revision 2" />
- <!--Undated revision of the 1985 version contains unspecified changes.-->
+ <!-- Undated revision of the 1985 version contains unspecified changes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="demolition division 1985 (4am crack).dsk" size="143360" crc="5b457763" sha1="5fe148d9c998ea49fbfe0db4c6f08200146a4533" />
@@ -41294,13 +19964,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 0" />
- <!--This version is 13-sector and DOS 3.2, which suggests it came first.-->
+ <!-- This version is 13-sector and DOS 3.2, which suggests it came first. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-07-->
- <!--educational program-->
+ <!-- Dump released: 2017-08-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dragon mix rev. 0 (4am crack).dsk" size="143360" crc="326bdbfe" sha1="9fd0676eb34c00b0031c47ed44d5824b18cb2711" />
@@ -41313,12 +19984,13 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-07-->
- <!--educational program-->
+ <!-- Dump released: 2017-08-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dragon mix 1982 (4am crack).dsk" size="143360" crc="213ddf9d" sha1="8b70b5c5a7d206d52b43cdc1e20f2074826a570a" />
@@ -41331,13 +20003,16 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbara Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1985" />
- <!--1985 updated version-->
+ <!-- 1985 updated version -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dragon mix 1985 (4am crack).dsk" size="143360" crc="eca7e839" sha1="f9a433de99dc5364b4bed9cdfd6652e5e6c95f8e" />
@@ -41350,13 +20025,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 1" />
- <!--DOS 3.2 and simpler copy protection, suggesting an earlier version.-->
+ <!-- DOS 3.2 and simpler copy protection, suggesting an earlier version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-06-->
- <!--educational program-->
+ <!-- Dump released: 2015-07-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="meteor multiplication (4am crack).dsk" size="143360" crc="62281009" sha1="c9493d7151f77d6feacdfd93da97feec83c3e403" />
@@ -41369,13 +20045,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 1" />
- <!--LOGO2 file was updated to contain more credits and has a more advanced copy protection, suggesting a later version.-->
+ <!-- LOGO2 file was updated to contain more credits and has a more advanced copy protection, suggesting a later version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-30-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="meteor multiplication rev. 2 (4am crack).dsk" size="143360" crc="0f314196" sha1="452ecbab360ba6fbd0b02edf4f3a61cad0408471" />
@@ -41388,13 +20065,14 @@ license:CC0-1.0
<year>1982</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Bill Maxwell and Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Jerry Chaffin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1982 revision 0" />
- <!--This version is 13-sector and DOS 3.2, which suggests it came first.-->
+ <!-- This version is 13-sector and DOS 3.2, which suggests it came first. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-08-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="minus mission 1982.0 (4am crack).dsk" size="143360" crc="01f94ba2" sha1="399e3bd3145f451fedac81be506112eaf848866e" />
@@ -41407,13 +20085,16 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbara Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1985" />
- <!--1985 updated version-->
+ <!-- 1985 updated version -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="minus mission 1985 (4am crack).dsk" size="143360" crc="d0864d11" sha1="591349bf20477ef07862d1ed99536bec1a339845" />
@@ -41426,11 +20107,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, and Barbara Thompson" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="verb viper (4am crack).dsk" size="143360" crc="a776f224" sha1="8c1577818cf2126659055bbf936a4f08a52063d9" />
@@ -41443,13 +20126,15 @@ license:CC0-1.0
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, and Barbara Thompson" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This version uses the 1982 version of Diversi-DOS, which suggests it came first.-->
+ <!-- This version uses the 1982 version of Diversi-DOS, which suggests it came first. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2017-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="word invasion rev. 0 (4am crack).dsk" size="143360" crc="661ffad7" sha1="82005a8c62afc3a1144cce991bc90e3b0358bcb2" />
@@ -41462,13 +20147,15 @@ license:CC0-1.0
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, and Barbara Thompson" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This version uses the 1983 version of Diversi-DOS, which suggests it came second.-->
+ <!-- This version uses the 1983 version of Diversi-DOS, which suggests it came second. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-27-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="word invasion (4am crack).dsk" size="143360" crc="49736f9c" sha1="0808ed0a15491a7f9c8e601149f579273ce83da4" />
@@ -41481,11 +20168,13 @@ license:CC0-1.0
<year>1984</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, and Barbara Thompson" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-13-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="word man (4am crack).dsk" size="143360" crc="5ece5ade" sha1="56f8b7f5dd99e6da033035fa936e34645804b61b" />
@@ -41498,11 +20187,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, and Barbara Thompson" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-04-->
- <!--educational program-->
+ <!-- Dump released: 2015-09-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="word master (4am crack).dsk" size="143360" crc="b07d9ebc" sha1="2872e22a1d930e232d45e2137e145b88604ca68c" />
@@ -41515,11 +20206,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, and Barbara Thompson" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbara Thompson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-17-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="word radar (4am crack).dsk" size="143360" crc="a6707e0b" sha1="cb24745f12ee4e7756012c8219295b4a45f169f0" />
@@ -41534,8 +20227,8 @@ license:CC0-1.0
<info name="programmer" value="Paul Wallach" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="architectural review and testmaker (4am crack).dsk" size="143360" crc="d8f090df" sha1="ed46dad8c9eb81f96b692ed5fe27c93a2423e652" />
@@ -41543,6 +20236,62 @@ license:CC0-1.0
</part>
</software>
+ <software name="archon">
+ <description>Archon: The Light and The Dark (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Anne Westfall" />
+ <info name="author" value="Jon Freeman" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires an 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="archon (4am and san inc crack).dsk" size="143360" crc="10d510bf" sha1="7b21537ae9b795a048f11fbc68ed3439a4f55ccf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="archon2">
+ <description>Archon II: Adept (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Anne Westfall" />
+ <info name="author" value="Jon Freeman" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="archon ii - adept (4am and san inc crack).dsk" size="143360" crc="7fc59edf" sha1="1eb8d39fe5887749b0a08bd1f9ab5f1f9b1ccde2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arctfox">
+ <description>Arcticfox (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Dynamix Software Development" />
+ <info name="programmer" value="Paul Bowman" />
+ <info name="programmer" value="Damon Slye" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="arcticfox (4am and san inc crack).dsk" size="143360" crc="d62e1aac" sha1="ed918010e0cf79373e3f4a7b8036a9fb3a6b7e13" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="armekicks">
<description>Arithmekicks (4am crack)</description>
<year>1984</year>
@@ -41550,8 +20299,8 @@ license:CC0-1.0
<info name="programmer" value="Doug Super" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="arithmekicks (4am crack).dsk" size="143360" crc="bdcb8e2a" sha1="dd035e602fb4482de1df18f9b2c2f8512218770e" />
@@ -41566,8 +20315,8 @@ license:CC0-1.0
<info name="programmer" value="Doug Super" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="arithmetickle (4am crack).dsk" size="143360" crc="d54a91bf" sha1="78a2b6f24fce60ef7a5b9a0728aac3aa90282823" />
@@ -41580,12 +20329,17 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-335" />
- <info name="programmer" value="Rich Bergeron, Greg S. Johnson, Sheila Kelly, Lon Koenig, John Persoon, and Elizabeth Wendland" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Greg S. Johnson" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Elizabeth Wendland" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -41604,10 +20358,10 @@ license:CC0-1.0
<description>Arkanoid (4am crack)</description>
<year>1988</year>
<publisher>Taito America</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Works with Apple ][ Mouse Card in slot 4: -sl4 mouse." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-03-->
- <!--action game-->
+ <!-- Dump released: 2015-03-03 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="arkanoid (4am crack).dsk" size="143360" crc="c10ff8bf" sha1="4ac7d069e9b189405c0b345ab71904b357aa8393" />
@@ -41615,16 +20369,46 @@ license:CC0-1.0
</part>
</software>
+ <software name="astratts">
+ <description>Astro Attack (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="astro attack (softsmith) (4am and san inc crack).dsk" size="143360" crc="1b3ca0e0" sha1="9b4ff6b17ef8494dfe8ed242ec08c90873e50ea4"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="agrizzly">
- <description>Audubon Wildlife Adventrues: Grizzly Bears (4am crack)</description>
+ <description>Audubon Wildlife Adventures: Grizzly Bears (4am crack)</description>
<year>1988</year>
<publisher>Advanced Ideas</publisher>
<info name="developer" value="The Dovetail Group" />
- <info name="programmer" value="Christopher Palmer, Dennis Sullivan, Deborah Kovacs, Pat Relf, Drew Ruscil, Gerri Brioso, Cynthia Vansant, Richard Frietas, Paul Frietas, Doreen Curtin, Andy Henriquez, Roger DiSilvestro, Richard Chevat, Sandy Damashek, Susan Greer, Jeffrey Siegel" />
+ <info name="programmer" value="Christopher Palmer" />
+ <info name="programmer" value="Dennis Sullivan" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Drew Ruscil" />
+ <info name="programmer" value="Gerri Brioso" />
+ <info name="programmer" value="Cynthia Vansant" />
+ <info name="programmer" value="Richard Frietas" />
+ <info name="programmer" value="Paul Frietas" />
+ <info name="programmer" value="Doreen Curtin" />
+ <info name="programmer" value="Andy Henriquez" />
+ <info name="programmer" value="Roger DiSilvestro" />
+ <info name="programmer" value="Richard Chevat" />
+ <info name="programmer" value="Sandy Damashek" />
+ <info name="programmer" value="Susan Greer" />
+ <info name="programmer" value="Jeffrey Siegel" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-01-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -41657,20 +20441,107 @@ license:CC0-1.0
</part>
</software>
- <software name="bckydbrd">
- <description>Backyard Birds (A-216 version 1.0) (4am crack)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-216" />
- <info name="programmer" value="Hassan Kaganda, John Persoon, Larry Phenow, Diane Portner, and James L. Thompson" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-06-->
- <!--educational program-->
+ <software name="asbchrds">
+ <description>Aural Skills Trainer: Basic Chords (4am crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="mecc-a216 backyard birds v1.0 (4am crack).dsk" size="143360" crc="c2aff632" sha1="620682c6be6567bd18e89bbfd0a28329c73cc592"/>
+ <rom name="aural skills trainer- basic chords (4am crack).dsk" size="143360" crc="21f69bd0" sha1="d412b744c31f1bbb8febc0b8357c0f83bd5989e5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="asinterv">
+ <description>Aural Skills Trainer: Intervals (4am crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="aural skills trainer- intervals (4am crack).dsk" size="143360" crc="94deba21" sha1="c7ca6b485c070f807ea7785aa080e10fbf30e42c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="as7thchd">
+ <description>Aural Skills Trainer: Seventh Chords (4am crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="aural skills trainer- seventh chords (4am crack).dsk" size="143360" crc="9b5d891b" sha1="018c073610c14fafdfa467f22dd443b917149e38"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="autoduel">
+ <description>Autoduel (4am crack)</description>
+ <year>1985</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="autoduel (4am crack) side a.dsk" size="143360" crc="350c4b8a" sha1="5db8161849c9a9a62c4ddc32f7f861e0dfab3677" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="autoduel (4am crack) side b.dsk" size="143360" crc="2b3bc3f2" sha1="71526cb681ee837408a187c7a38bc2e681657ebd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="averages">
+ <description>Averages (version 1988) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="averages (4am crack).dsk" size="143360" crc="1cac50dc" sha1="5bf1029c9880c24a69cc568a91761e2f43191255"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="axisassn">
+ <description>Axis Assassin (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="John Field" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="axis assassin (4am and san inc crack).dsk" size="143360" crc="cf88fcce" sha1="b68477e6dad6235e767cf06a55cc00de797e5ea6" />
</dataarea>
</part>
</software>
@@ -41682,8 +20553,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-05-->
- <!--educational game-->
+ <!-- Dump released: 2017-08-05 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="bake and taste (4am crack).dsk" size="143360" crc="3e9b5589" sha1="fe51bc796aebd055e89efc7a7da835ca848fa5d9" />
@@ -41698,8 +20569,8 @@ license:CC0-1.0
<info name="programmer" value="Morgan O'Brien" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-10-13-->
- <!--educational program-->
+ <!-- Dump released: 2019-10-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="balancing act (4am crack).dsk" size="143360" crc="a5dd929c" sha1="5e523ba9acc08d10f6bd000b982bfc5804013f1b" />
@@ -41707,6 +20578,178 @@ license:CC0-1.0
</part>
</software>
+ <software name="ballblaz">
+ <description>BallBlazer (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Lucasfilm Games and K-Byte" />
+ <info name="programmer" value="David Levine" />
+ <info name="programmer" value="Peter Langston" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-13 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ballblazer (4am crack).dsk" size="143360" crc="aa48b3a9" sha1="ecc85c358ccb8373e9872733ed00a40f9b2bcad2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bsstoryb11" cloneof="bsstoryb">
+ <description>Bank Street StoryBook (version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Pixelwerks" />
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-10. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- graphics progam -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="bank street storybook 1.1 (4am crack) side a.dsk" size="143360" crc="afecb034" sha1="e6262712e05ca562b79c1c6d99973837d8d259ac" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="bank street storybook 1.1 (4am crack) side b.dsk" size="143360" crc="edfd36dd" sha1="d9cd259e8652942ea3ab876805d01dbc565ad25c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bsstoryb">
+ <description>Bank Street StoryBook (version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Pixelwerks" />
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-31 -->
+ <!-- graphics progam -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="bank street storybook (4am crack) side a.dsk" size="143360" crc="152bc072" sha1="c2ae39f44ef1fabe6dc6c9fbfe65a6a20376d2e0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="bank street storybook (4am crack) side b.dsk" size="143360" crc="0b2b3b94" sha1="dfe929080798f5485fba63aeb361f4740cfcc340" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bballalph">
+ <description>Banner Books: All Along The Alphabet (4am crack)</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Angelo Scalise" />
+ <info name="programmer" value="Cindy Chapman" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - all along the alphabet (4am crack) disk 1 - program.dsk" size="143360" crc="884d1c6e" sha1="2b6cb2a7537bb33cb92a0c7579970cfa84ba5282" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - all along the alphabet (4am crack) disk 2 - backgrounds.dsk" size="143360" crc="4557a716" sha1="3dfd5ba20bbab469979d8b4db99be1ceb50855bb" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - all along the alphabet (4am crack) disk 3 - clip art.dsk" size="143360" crc="e70b438d" sha1="795fe37d96181f310c22bed4481bd0122a07b0b3" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Fonts and More Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - all along the alphabet (4am crack) disk 4 - fonts and more clip art.dsk" size="143360" crc="fe83f19c" sha1="c8c42746382ef4946d376323877aca30a7d95ef8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbyrscday">
+ <description>Banner Books: Your School Day (4am crack)</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Karl Prewo" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - your school day (4am crack) disk 1 - program.dsk" size="143360" crc="4ebf955a" sha1="5d12523d3f2bdd5e973459b4da0df2581b188a9a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - your school day (4am crack) disk 2 - backgrounds.dsk" size="143360" crc="12276401" sha1="eac0b8dc4e1a2de379e19628c161f42338be7a6f" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - your school day (4am crack) disk 3 - clip art.dsk" size="143360" crc="00d80ed0" sha1="4c09e1e49156645ce8999a7f8140f7be92d1062b" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Fonts and More Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="banner books - your school day (4am crack) disk 4 - fonts and more clip art.dsk" size="143360" crc="4c6e5790" sha1="d46ba374921645375c1c3382e2c73053f839a1eb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bannerch">
+ <description>Bannercatch (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Steven Fried" />
+ <info name="programmer" value="Chris Lutes" />
+ <info name="programmer" value="Peter Reynolds" />
+ <info name="programmer" value="Bucko Balaska" />
+ <info name="programmer" value="Andrew C. Frank" />
+ <info name="programmer" value="Ann Phelan" />
+ <info name="programmer" value="Stu Ross" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-09 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bannercatch (4am crack).dsk" size="143360" crc="7db317c1" sha1="a61a47943d0c7b38a08f459812aa2dd26d401cd6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="basicbio">
<description>Basic Biology (version 1.02) (4am crack)</description>
<year>1986</year>
@@ -41714,8 +20757,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.02" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-07-04-->
- <!--educational program-->
+ <!-- Dump released: 2017-07-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="basic biology v1.02 (4am crack).dsk" size="143360" crc="493c2b2c" sha1="37d04f4e1280b35c649057dbb38e795547d4c151" />
@@ -41731,8 +20774,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="3.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-01-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="basic drafting review and testmaker v3.0 (4am crack).dsk" size="143360" crc="8bf7f865" sha1="7958d852cd90d90179934aa523ac3db3097cba74" />
@@ -41740,16 +20783,117 @@ license:CC0-1.0
</part>
</software>
+ <software name="beatomth">
+ <description>Basic Electronics: Atomic Theory (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - atomic theory (4am crack).dsk" size="143360" crc="fb97d56c" sha1="e9fc04b84376b4c47e9eedfcb438e6e6fae7d953" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="beelecfun">
+ <description>Basic Electronics: Electronic Fundamentals (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - electronic fundamentals (4am crack).dsk" size="143360" crc="575773ae" sha1="07424601c6457cacb190f5ff4494b12b777d4310" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="beelecmath">
+ <description>Basic Electronics: Electronic Math (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - electronic math (4am crack) disk 1.dsk" size="143360" crc="8ad3d213" sha1="ba0305c4d5fda1149af699a616fa80bc01223b37" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - electronic math (4am crack) disk 2.dsk" size="143360" crc="938881b1" sha1="0ab63120fde49a7427147dd2c4424e1f53ab382c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - electronic math (4am crack) disk 3.dsk" size="143360" crc="448ef725" sha1="81c9c6f3de904c7b6e3edcdefd29c1e172938031" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="beelecpsc">
+ <description>Basic Electronics: Electronic Prefixes, Symbols, and Components (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - electronic prefixes, symbols, and components (4am crack).dsk" size="143360" crc="39e96e00" sha1="9bda85d68c124453ee864d9c6dbc966dcc42ee21" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="befundccir">
+ <description>Basic Electronics: Fundamentals of DC Circuitry (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - fundamentals of dc circuitry (4am crack) disk 1.dsk" size="143360" crc="8846e62a" sha1="8409e5e8cb85e2e79609c481e7b3942151f26da3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - fundamentals of dc circuitry (4am crack) disk 2.dsk" size="143360" crc="efd88e20" sha1="7613f57ef6d0b06d3c76522363e6482bb27955cb" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="143360">
+ <rom name="basic electronics - fundamentals of dc circuitry (4am crack) disk 3.dsk" size="143360" crc="8fd5f148" sha1="6a905e36719137702cf41746d4a213cb67dff357" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="basnumfp">
<description>Basic Number Facts: Practice (4am crack)</description>
<year>1982</year>
<publisher> Control Data Corporation</publisher>
- <info name="developer" value=" Control Data Corporation" />
+ <info name="developer" value="Control Data Corporation" />
<info name="usage" value="Requires an Apple ][+ or unenhanced //e." />
- <!--Due to coding errors unrelated to the copy protection, this program does not work on any Apple II with a 65c02 CPU.-->
+ <!-- Due to coding errors unrelated to the copy protection, this program does not work on any Apple ][ with a 65c02 CPU. -->
<sharedfeat name="compatibility" value="A2P,A2E" />
- <!--Dump released: 2022-12-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="basic number facts- practice (4am crack).dsk" size="143360" crc="9ef63ad3" sha1="b62c6842a4bd4859e698298b9707fa37abc86c4d" />
@@ -41757,16 +20901,199 @@ license:CC0-1.0
</part>
</software>
+ <software name="batsblfr">
+ <description>Bats in the Belfry (4am crack)</description>
+ <year>1983</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Samuel Moore" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bats in the belfry (4am crack).dsk" size="143360" crc="6109dac9" sha1="d19344e23610bf6b448fbbc4098a9dbd450ba713" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="battcmdr">
+ <description>Battalion Commander (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Hille" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="battalion commander (4am and san inc crack).dsk" size="143360" crc="9bb6a4d2" sha1="f2bb31c76fd954bd384557dd249c06e75f3de6b7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="btlchess">
+ <description>Battle Chess (trex crack)</description>
+ <year>1990</year>
+ <publisher>Interplay</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="battle chess side a (1990)(interplay)(trex crack).dsk" size="143360" crc="a81e4ae5" sha1="5b0e79fa0d4257a4855864c9324840cc1a41284e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="battle chess side b (1990)(interplay)(trex crack)[unk filesys].dsk" size="143360" crc="54359fd3" sha1="19b3ed795c9827f580df77f559ad02eca55455b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlgrp">
+ <description>Battle Group (version 1.0) (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle group (4am and san inc crack) side a.dsk" size="143360" crc="1650cf51" sha1="158a6d248004716fd962ae5e40dfa4f602dab533" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle group (4am and san inc crack) side b.dsk" size="143360" crc="f3505586" sha1="3b7818a1f76531421da36d2044c009452b4586a8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batfrnrm">
+ <description>Battle For Normandy (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Tactical Design Group" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="battle for normandy (4am and san inc crack).dsk" size="143360" crc="5be154db" sha1="f4ee84b0a54b64ad596814e87a6f502c1f494772" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlantm13" cloneof="batlantm">
+ <description>Battle of Antietam (version 1.3) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle of antietam v1.3 (4am and san inc crack) side a.dsk" size="143360" crc="525abf7c" sha1="032aaf821cc446af6bad709034d72cc9b4f3e64d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle of antietam v1.3 (4am and san inc crack) side b.dsk" size="143360" crc="f280a1ae" sha1="d75fa19f398906189b6e5e74eb38153c83e5e8af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlantm">
+ <description>Battle of Antietam (version 1.5) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle of antietam v1.5 (4am crack) side a.dsk" size="143360" crc="bf0565ab" sha1="088489190e4db38a637176d5e944af6e8b8a8d73" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle of antietam v1.5 (4am crack) side b.dsk" size="143360" crc="9d406c7e" sha1="7b0fd2712180837f2277944a3ca708e83fc1f302" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlcrsr">
+ <description>Battlecruiser (version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-27 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - World War I" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle cruiser (4am crack) side a.dsk" size="143360" crc="7ce792e8" sha1="f3b00a8f2be27228a16dafccfb26b0223a2d220c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - World War II" />
+ <dataarea name="flop" size="143360">
+ <rom name="battle cruiser (4am crack) side b.dsk" size="143360" crc="8fe6c98c" sha1="3bc19b5abf445cb2362e747a898987ba627377e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bzone">
+ <description>Battlezone (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-19 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="battlezone (4am crack).dsk" size="143360" crc="2678f9d7" sha1="7909815721d8a885e1052e6e4023059101ff27b8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bbugconcr1" cloneof="bbugconc">
- <description>Battling Bugs and Concentraction (revision 1) (4am crack)</description>
+ <description>Battling Bugs &amp; Concentraction (revision 1) (4am crack)</description>
<year>1982</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-01-->
- <!--educational program-->
+ <!-- Dump released: 2015-08-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="battling bugs and concentraction (4am crack).dsk" size="143360" crc="438c11ef" sha1="cf640b6a1ae5fcbfb31a97a62063cccbaa08df6b" />
@@ -41775,16 +21102,16 @@ license:CC0-1.0
</software>
<software name="bbugconc">
- <description>Battling Bugs and Concentraction (revision 2) (4am crack)</description>
+ <description>Battling Bugs &amp; Concentraction (revision 2) (4am crack)</description>
<year>1982</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This updated revision has unspecified bug fixes.-->
+ <!-- This updated revision has unspecified bug fixes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-12-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="battling bugs and concentraction rev. 2 (4am crack).dsk" size="143360" crc="f6d1dcd5" sha1="6af25c072a6e8fc5de431af519386981fbf8fc83" />
@@ -41792,15 +21119,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="bcqft">
+ <description>BC's Quest For Tires (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Justin Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bc's quest for tires (4am crack).dsk" size="143360" crc="02bcb008" sha1="9c84d81a2e493c5fb6a5b86949b42b901cd4ae50" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="beachlnd">
<description>Beach Landing (4am crack)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-05-->
- <!--action game-->
+ <!-- Dump released: 2021-07-05 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="beach landing (4am and san inc crack).dsk" size="143360" crc="5b2034a4" sha1="dbd3bbcb0a2f014b6fbafd27c64b1242d47ddafe"/>
@@ -41808,15 +21152,61 @@ license:CC0-1.0
</part>
</software>
+ <software name="bellhop">
+ <description>Bellhop (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="Garry Kitchen" />
+ <info name="programmer" value="John van Ryzin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bellhop (4am crack).dsk" size="143360" crc="b5a5c914" sha1="fac8017d1810673c8cda26f2e342d30695dba29f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="belwrt">
+ <description>Below the Root (4am crack)</description>
+ <year>1984</year>
+ <publisher>Windham Classics</publisher>
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="programmer" value="William Groetzinger" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="below the root (4am crack) side a.dsk" size="143360" crc="b546f694" sha1="e4a03625fd40389af5f787c39f574c1eed569547" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="below the root (4am crack) side b.dsk" size="143360" crc="3298fdc6" sha1="f6b2a638a96afb4c99e182ff6ee477763bb440fa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="berraids">
<description>Berserker Raids (4am crack)</description>
<year>1983</year>
<publisher>Berserker Works</publisher>
- <info name="programmer" value="Fred Saberhagen, Lloyd Johnson, Dennis Martinez, Mary Martinez, and Joan Saberhagen" />
+ <info name="programmer" value="Fred Saberhagen" />
+ <info name="programmer" value="Lloyd Johnson" />
+ <info name="programmer" value="Dennis Martinez" />
+ <info name="programmer" value="Mary Martinez" />
+ <info name="programmer" value="Joan Saberhagen" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-11-24-->
- <!--strategy game-->
+ <!-- Dump released: 2018-11-24 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="berserker raids (4am crack).dsk" size="143360" crc="1b889857" sha1="7173760124903dfeaf8924d98ee9a5ad31a8233e" />
@@ -41832,8 +21222,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-06-->
- <!--action game-->
+ <!-- Dump released: 2023-09-06 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="beyond pinball v1.1 (4am crack).dsk" size="143360" crc="574d2092" sha1="923d883cec75585bc9ff4ffc711b4b2536270380" />
@@ -41841,17 +21231,111 @@ license:CC0-1.0
</part>
</software>
+ <software name="bignlitl">
+ <description>BIG &amp; little: Books, Posters, and Cards for Muppet Slate (4am crack)</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-17 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="big and little (4am crack).dsk" size="143360" crc="3d30f609" sha1="3414a3ba8e8ab189c64536b68316a3aaf217d07c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmftanr">
+ <description>Big Book Maker: Favorite Fairy Tales &amp; Nursery Rhymes (4am crack)</description>
+ <year>1990</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Fred Kutz" />
+ <info name="programmer" value="Bill de Beaubien" />
+ <info name="programmer" value="Diane Riendeau" />
+ <info name="programmer" value="Herb Perez" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 1 - program.dsk" size="143360" crc="fcbe4f9c" sha1="c299ef910d0cbcd17f295a5574d9dc9f0a6b8e1c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds and Frames"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 2 - backgrounds and frames.dsk" size="143360" crc="df5fd2c9" sha1="a266331593a80884784cc2ca14940f0a91b19310" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 3 - clip art.dsk" size="143360" crc="46d33ee2" sha1="124ccdea4cd957c8172af7bbadb323a752b8bc53" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - More Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker - favorite fairy tales and nursery rhymes (4am crack) disk 4 - more clip art.dsk" size="143360" crc="7c95be06" sha1="7225e7c0552edceaca7465404992d301f619b25d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmttafh">
+ <description>Big Book Maker: Tall Tales &amp; American Folk Heroes (4am crack)</description>
+ <year>1991</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker (4am crack) disk 1 side a.dsk" size="143360" crc="3f18085e" sha1="b69bdab8c4840a0922ac65b765bc3d20a38cfbd1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Backgrounds and Frames"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker (4am crack) disk 1 side b.dsk" size="143360" crc="1142180f" sha1="cc8cd090bb644c31ec7229a0d79f135cc9e7f732" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Clip Art 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker (4am crack) disk 2 side a.dsk" size="143360" crc="b13c5630" sha1="8b6771472e2f977b5dc30d48ba8cbf8680b635a4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Clip Art 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="big book maker (4am crack) disk 2 side b.dsk" size="143360" crc="b75798e9" sha1="1c25c3a721a731cb9bedc01da8d3440eac2db099" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bikehiker0" cloneof="bikehike">
<description>Bike Hike (revision 0) (4am crack)</description>
<year>1985</year>
<publisher>Learning Technologies</publisher>
- <info name="developer" value="Learning Technologies" />
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--Has a different intro and developer information than revision 1.-->
+ <!-- Does not show the Litag developer screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="bike hike rev. 0 (4am crack).dsk" size="143360" crc="aad9dd18" sha1="bfbbbfb4c460731d13181392cc66e95ca2364602" />
@@ -41862,15 +21346,14 @@ license:CC0-1.0
<software name="bikehike">
<description>Bike Hike (revision 1) (4am crack)</description>
<year>1985</year>
- <publisher>Litag Productions</publisher>
- <info name="original_publisher" value="Learning Technologies" />
- <info name="developer" value="Learning Technologies" />
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--Has a different intro and developer information than revision 0.-->
+ <!-- Shows the Litag developer screen and the Learning Technologies screen is different. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-07-14-->
- <!--educational program-->
+ <!-- Dump released: 2016-07-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="bike hike (4am crack).dsk" size="143360" crc="da64ea5c" sha1="b55fd35cea6db8320449fbba69406dbe84cb0e33" />
@@ -41886,8 +21369,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="0.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-04-->
- <!--graphics program-->
+ <!-- Dump released: 2023-09-04 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="billboard (4am crack).dsk" size="143360" crc="0552560a" sha1="c1d64c2137723dd38d74e7ec5bc116e727684734" />
@@ -41895,6 +21378,82 @@ license:CC0-1.0
</part>
</software>
+ <software name="binomultmw" cloneof="binomult">
+ <description>Binomial Multiplication (Microcomputer Workshops Courseware) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Mathematics - Algebra Series. Grade Levels: 9 - 12 -->
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="binomial multiplication mwc (4am crack).dsk" size="143360" crc="fc85e10a" sha1="e88a22b7cd586fa3bad9cc3f3568f8c9a666aa8d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="binomult">
+ <description>Binomial Multiplication (Mindscape) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="original_publisher" value="Microcomputer Workshops Courseware" />
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Mathematics - Algebra Series. Grade Levels: 9 - 12 -->
+ <!-- Dump released: 2014-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="binomial multiplication (4am crack).dsk" size="143360" crc="362c9ff4" sha1="566aa3c2a2f25dfbaef9df91e0ac4b339e916a41" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bioach2rad">
+ <description>Biology Achievement II: Reproduction and Development (version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Doug Higgins" />
+ <info name="programmer" value="Mark Appel" />
+ <info name="programmer" value="Jonathan Paul" />
+ <info name="programmer" value="Harold Kipperman" />
+ <info name="programmer" value="Donald Thorn" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="biology achievement ii - reproduction and development (4am crack).dsk" size="143360" crc="974b5c03" sha1="fd85daa0a50aae9b8c32ff6e92410155ee083820" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="birds">
+ <description>Birds (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="birds (4am crack).dsk" size="143360" crc="91f81dc3" sha1="fd2f8aa567c50de22b758577d9adebd23fffcd37" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="blkbeltr1" cloneof="blkbelt">
<description>Black Belt (revision 1) (4am crack)</description>
<year>1984</year>
@@ -41903,8 +21462,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-29-->
- <!--sports game-->
+ <!-- Dump released: 2021-04-29 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="black belt (4am crack).dsk" size="143360" crc="6ba73711" sha1="f9f1bab379e6802c488e9c704870561018a162c4"/>
@@ -41919,10 +21478,10 @@ license:CC0-1.0
<info name="programmer" value="Kevin Ryan" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Compared to the first revision, this has updated copy protection, fixes to the Mockingboard sound drivers, a new play mode, and an in-game keyboard help screen.-->
+ <!-- Compared to the first revision, this has updated copy protection, fixes to the Mockingboard sound drivers, a new play mode, and an in-game keyboard help screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-04-->
- <!--sports game-->
+ <!-- Dump released: 2023-09-04 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="black belt rev. 2 (4am crack).dsk" size="143360" crc="a3bb954d" sha1="f8e798a3729ef40ca2e2b550082fd5f52b061764" />
@@ -41930,17 +21489,119 @@ license:CC0-1.0
</part>
</software>
- <software name="bgbluff">
+ <software name="blzpdlsr0" cloneof="blzpdls">
+ <description>Blazing Paddles (revision 0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 0" />
+ <!-- No version number is displayed during boot, which suggests it is the first version. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- Dump released: 2022-07-03 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="blazing paddles rev. 0 (4am crack).dsk" size="143360" crc="180c3a29" sha1="94c9e3c97fff3d19dacfe1b82ad954a757cf1e1a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blzpdls04421" cloneof="blzpdls">
+ <description>Blazing Paddles (version 04421) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="04421" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04421" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- Dump released: 2022-06-30 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="blazing paddles v04421 (4am crack).dsk" size="143360" crc="799282c4" sha1="5a0603178bf47f4f67c28206b910ea3af413b2d5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blzpdls">
+ <description>Blazing Paddles (version 04431) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="04431" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04431" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="blazing paddles (4am crack).dsk" size="143360" crc="db4aa57d" sha1="152cc04080e100822bf919879232d175c64e9610" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blissycon">
+ <description>Blissymbolics: Blissymbol Concepts (A-777 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-777" />
+ <info name="programmer" value="R. J. Granvin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a777 blissymbolics - blissymbol concepts v1.1 (4am crack).dsk" size="143360" crc="38aaa53e" sha1="b35b75f88edd71d9a4733d8f2352888c22ce1d66"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkfndrs">
+ <description>Blockers and Finders (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="blockers and finders (4am crack).dsk" size="143360" crc="fea7e692" sha1="7932d1beb2833254f04ca67f1122f9d8ac843107" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bgbluff_525">
<description>Bluegrass Bluff (A-256 version 1.0) (4am crack)</description>
<year>1991</year>
<publisher>MECC</publisher>
<info name="partno" value="A-256" />
- <info name="programmer" value="Rich Bergeron, Gene Breault, Charolyn Kapplinger, Kevin Neff, and Dick Sisco" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Dick Sisco" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-13-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a256 bluegrass bluff v1.0 (4am crack).dsk" size="143360" crc="2be155ea" sha1="f7b731c72d7eb45df95dfdcb1b86d2f4917d04ac"/>
@@ -41948,17 +21609,50 @@ license:CC0-1.0
</part>
</software>
+ <software name="bolo">
+ <description>Bolo (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="developer" value="Elvyn Software" />
+ <info name="programmer" value="Jim Lane" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-07 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bolo (4am crack).dsk" size="143360" crc="6494af2c" sha1="0a2c77c0fe3199e4b7eb27774c924ced182479e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bomballey">
+ <description>Bomb Alley (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bomb alley (4am and san inc crack).dsk" size="143360" crc="6c6fc199" sha1="6be0041ec12aa85709d6305f7a86e654d7055a53" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bookworm">
<description>Book Worm (A-407 version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
<info name="developer" value="TIES" />
- <info name="partno" value="A-406" />
+ <info name="partno" value="A-407" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-18-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a407 book worm v1.0 (4am crack).dsk" size="143360" crc="090bdbb0" sha1="0e982610d85bc82bed88153e6480ca9cb0bb86d0"/>
@@ -41966,16 +21660,33 @@ license:CC0-1.0
</part>
</software>
+ <software name="bopabet">
+ <description>Bop-A-Bet (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-30 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bop-a-bet (4am and san inc crack).dsk" size="143360" crc="7ee2295f" sha1="84c269e55a873422715f7a7f12af6d7f462c2b0d"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="bopgwdc">
<description>Boppie's Great Word Chase (4am crack)</description>
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Mirror Images Software" />
- <info name="programmer" value="John Phillips and Stephen A. Schlapp" />
+ <info name="programmer" value="John Phillips" />
+ <info name="programmer" value="Stephen A. Schlapp" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-12-03-->
- <!--educational program-->
+ <!-- Dump released: 2014-12-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="boppie's great word chase (4am crack).dsk" size="143360" crc="312d613d" sha1="7b0205491b48377aa985451f815f2b66af26b1a2" />
@@ -41983,16 +21694,123 @@ license:CC0-1.0
</part>
</software>
+ <software name="botgardn">
+ <description>Botanical Gardens (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Robert Kimball" />
+ <info name="programmer" value="David J. Donoghue" />
+ <info name="programmer" value="Patrick Kehoe" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="botanical gardens (4am crack).dsk" size="143360" crc="45282d06" sha1="bebb4d99261cf2caa58144cc0561cca21e8c5455"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bounce">
+ <description>Bounce! (4am crack)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="M. Fish" />
+ <info name="programmer" value="C. Brock" />
+ <info name="programmer" value="M. Kosel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bounce (4am crack).dsk" size="143360" crc="c112a513" sha1="a991ab2abbac0ee2490ce6b0f0b29d6e1b04d120" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bnckmg">
+ <description>Bouncing Kamungas! (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Tom Becklund" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-05-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bouncing kamungas (4am crack).dsk" size="143360" crc="7c949f6a" sha1="7afe51c5db44bfdfa190c8fa14ebfd1c18551ece" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouldash">
+ <description>Boulder Dash (Electronic Arts) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="boulder dash (4am and san inc crack).dsk" size="143360" crc="c19abe7f" sha1="cbd285cfb7cc19fd62e6b63f5b2f0e911efcefa7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bdconkit">
+ <description>Boulder Dash Construction Kit (4am crack)</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Pat Montelo" />
+ <info name="programmer" value="Fernando Herrera" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-16. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- game development utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="boulderdash construction kit (4am crack).dsk" size="143360" crc="45ef5172" sha1="c1524de4e9ce9033be2bca3ef2b0dc39c37d2bf7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouldash2">
+ <description>Boulder Dash II (Electronic Arts) (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 64K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-09 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="boulder dash ii (4am and san inc crack).dsk" size="143360" crc="3f7b11ba" sha1="e8f951750c14dc0fb2f7a8ae111308c88d688bee"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="bridge40">
<description>Bridge 4.0 (4am crack)</description>
- <!--"Bridge 6.0" has a separate version number, assuming that 4.0 is part of the title and not a version number.-->
+ <!-- "Bridge 6.0" has a separate version number, assuming that 4.0 is part of the title and not a version number. -->
<year>1983</year>
<publisher>Artworx</publisher>
- <info name="programmer" value=" Arthur Walsh" />
+ <info name="programmer" value="Arthur Walsh" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-10-28-->
- <!--card game-->
+ <!-- Dump released: 2014-10-28 -->
+ <!-- card game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="bridge 4.0 (4am crack).dsk" size="143360" crc="26bf2d79" sha1="b33b7bfda4c17b0a51d9e1c16aead1e85c812752" />
@@ -42003,13 +21821,13 @@ license:CC0-1.0
<software name="brdsider1" cloneof="brdside">
<description>Broadsides (revision 1) (4am crack)</description>
<year>1983</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Wayne Garris" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-07-->
- <!--strategy game-->
+ <!-- Dump released: 2023-12-07 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="broadsides rev. 1 (4am crack).dsk" size="143360" crc="4c506806" sha1="f0bad28885a3f16366736b44f4d0d9c70b18a9d3" />
@@ -42020,13 +21838,13 @@ license:CC0-1.0
<software name="brdsider2" cloneof="brdside">
<description>Broadsides (revision 2) (4am crack)</description>
<year>1983</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Wayne Garris" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-07-->
- <!--strategy game-->
+ <!-- Dump released: 2023-12-07 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="broadsides rev. 2 (4am crack).dsk" size="143360" crc="853cf7d8" sha1="e355ae53211f2527bd85a4912356dc4e2e4deed3" />
@@ -42037,13 +21855,13 @@ license:CC0-1.0
<software name="brdsider3" cloneof="brdside">
<description>Broadsides (revision 3) (4am crack)</description>
<year>1983</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Wayne Garris" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-07-->
- <!--strategy game-->
+ <!-- Dump released: 2023-12-07 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="broadsides rev. 3 (4am crack).dsk" size="143360" crc="5b1197fa" sha1="2e7ba760633d981bb5fa45d64b51a07aa6ce3f02" />
@@ -42054,13 +21872,13 @@ license:CC0-1.0
<software name="brdside">
<description>Broadsides (revision 4) (4am crack)</description>
<year>1983</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Wayne Garris" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-07-->
- <!--strategy game-->
+ <!-- Dump released: 2023-12-07 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="broadsides rev. 4 (4am crack).dsk" size="143360" crc="4e2f0d58" sha1="114c47ff49bf2dd174fb10db417c3d5bec662717" />
@@ -42076,8 +21894,8 @@ license:CC0-1.0
<info name="programmer" value="Chris Eisnaugle" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-23-->
- <!--action game-->
+ <!-- Dump released: 2017-08-23 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop1" size="143360">
@@ -42092,6 +21910,364 @@ license:CC0-1.0
</part>
</software>
+ <software name="bugbyters">
+ <description>Bugbyter (version 1.11) (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Ted Cohn" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- developer utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bugbyter (softsmith) (4am and san inc crack).dsk" size="143360" crc="24dc0c8f" sha1="2e28ec886bc4b11ed2d252aa5eb6c1e0485b3d4d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bldpersp">
+ <description>Building Perspective (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. Bretl" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="building perspective (4am crack).dsk" size="143360" crc="9d5b6147" sha1="d065efde9c4f4769485dd0f6b4df39d96a60f30f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bldtenst">
+ <description>Building Tens Strategy (version 04.16.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Steve Swart" />
+ <info name="programmer" value="William Swart" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.16.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="building tens strategy 1985-04-16 (4am crack) side a.dsk" size="143360" crc="bb8c8b94" sha1="aafe329044e47f39f3e3c4b989c677c2429d0040" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="building tens strategy 1985-04-16 (4am crack) side b.dsk" size="143360" crc="d0e381f3" sha1="49929e677b489cb37e37d55184dd8ad53a2e46a9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubmcitc">
+ <description>Bulletin Board Maker: City &amp; Country (4am crack)</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Kristine Larson" />
+ <info name="programmer" value="Cindy Chapman" />
+ <info name="programmer" value="Chris Lewis" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - city and country (4am crack) disk 1 - program.dsk" size="143360" crc="1a5e353b" sha1="fa690b186d9cab2eb032761a1c3bb7ab2297cdec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Posters"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - city and country (4am crack) disk 2 - posters.dsk" size="143360" crc="660831a7" sha1="972031daf29338ba13d0b9c833fb208875f5b1a1" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - city and country (4am crack) disk 3 - clip art.dsk" size="143360" crc="c1c3fe82" sha1="c7beeb4b02cacfea18259205881fe687aa568abe" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Frames and Fonts"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - city and country (4am crack) disk 4 - frames and fonts.dsk" size="143360" crc="2fdef73b" sha1="aa460059fabea91a0875e8cc53b64c70749347bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubmyourn">
+ <description>Bulletin Board Maker: Your Neighborhood (4am crack)</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ted Jalbert" />
+ <info name="programmer" value="Gerry Gigon" />
+ <info name="programmer" value="Angelo Scalise" />
+ <info name="programmer" value="Cindy Chapman" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - your neighborhood (4am crack) disk 1 - program.dsk" size="143360" crc="bca2832a" sha1="9d2394c1e4052eb4a818c28ed934ffe9e8679033" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Posters"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - your neighborhood (4am crack) disk 2 - posters.dsk" size="143360" crc="ae2302c0" sha1="9b734bc4060b0a0863197431aabc1cd250c28171" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - your neighborhood (4am crack) disk 3 - clip art.dsk" size="143360" crc="17ac02d0" sha1="c5dd685d8908a1ff11d7be4110014a792ce538d1" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Frames and Fonts"/>
+ <dataarea name="flop" size="143360">
+ <rom name="bulletin board maker - your neighborhood (4am crack) disk 4 - frames and fonts.dsk" size="143360" crc="785796b8" sha1="4913ced081bf2ed9bc3419e5b31162d56da9a9dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblgmes13" cloneof="bmblgmes">
+ <description>Bumble Games (version 1.3) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bumble games v1.3 (4am and san inc crack).dsk" size="143360" crc="6636a469" sha1="59badccd350a2c82d6a0140b628a042997b8c88e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblgmes14" cloneof="bmblgmes">
+ <description>Bumble Games (version 1.4) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bumble games v1.4 (4am and san inc crack).dsk" size="143360" crc="ea34ac74" sha1="253236c6da94ed7939afe551685d96d3747738ba"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblgmes">
+ <description>Bumble Games (version 1.5) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bumble games (4am crack).dsk" size="143360" crc="0a7eb17b" sha1="9e8fcc6b51003311510165e2ec80b4a9099cb8e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblplot10a" cloneof="bmblplot">
+ <description>Bumble Plot (Apple Computer) (version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Apple Computer</publisher>
+ <info name="original_publisher" value="The Learning Company" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <!-- Apple Computer "Special Delivery" label -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bumble plot (1982) (4am crack).dsk" size="143360" crc="007bf1e3" sha1="4150eb9ab436be6c44810e5815acd3087f927514" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblplot11" cloneof="bmblplot">
+ <description>Bumble Plot (The Learning Company) (version 1.1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bumble plot v1.1 (4am and san inc crack).dsk" size="143360" crc="1a360981" sha1="7675056caea06ca067bb576d835207e1885d68fa"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblplot">
+ <description>Bumble Plot (The Learning Company) (version 1.2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bumble plot 1.2 (4am crack).dsk" size="143360" crc="3e79f3ac" sha1="24ab23e8ecf5d893e740ea0e1ca704a91f5fedb9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="busedv1ut">
+ <description>Business Education Volume 1: Utilities (A-714 version 4.5) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-714" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="4.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a714 business vol. 1 - utilities v4.5 (4am crack).dsk" size="143360" crc="d86dd84d" sha1="2a65d7946f4fba09a41fca613062e1c20782627f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="busedv3ac15" cloneof="busedv3ac">
+ <description>Business Education Volume 3: Accounting (A-721 version 1.5) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-721" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.8" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a721 business vol. 3 v1.5 (4am crack).dsk" size="143360" crc="20462bd4" sha1="da6f2caddeebee10c1f2d9c2c86e045d14fc94db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="busedv3ac">
+ <description>Business Education Volume 3: Accounting (A-721 version 1.8) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-721" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.8" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a721 business volume 3 - accounting v1.8 (4am crack).dsk" size="143360" crc="171e6e38" sha1="981b78b289bdc87717e72a6e04d49edff9f777b5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="busutil">
+ <description>Business Utilities (A-143 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-143" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a143 business utilities v1.0 (4am crack).dsk" size="143360" crc="e79c02d7" sha1="846df3c7bfd5b23ce78822cdce566652b1c52574" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bzbghrvy">
+ <description>Buzz Bang Harvey (4am crack)</description>
+ <year>1984</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Scott Rackey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="buzz bang harvey (4am crack).dsk" size="143360" crc="f5e8445f" sha1="caa19292c9b09a76b2e9b9ec5393098639c526b7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cestlvie">
+ <description>C'est La Vie (4am crack)</description>
+ <year>1983</year>
+ <publisher>Adventure International</publisher>
+ <info name="developer" value="Eastman Computing" />
+ <info name="programmer" value="Gordon Eastman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-07 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="c'est la vie (4am crack).dsk" size="143360" crc="b16f4e64" sha1="c491578b32e6d845c80e5331a611ade99510b097" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cstdecim">
<description>CAAT Skill Tester: Decimals (4am crack)</description>
<year>1986</year>
@@ -42099,8 +22275,8 @@ license:CC0-1.0
<info name="programmer" value="Charles Wilbur" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42122,8 +22298,8 @@ license:CC0-1.0
<info name="programmer" value="Charles Wilbur" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42145,8 +22321,8 @@ license:CC0-1.0
<info name="programmer" value="Charles Wilbur" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42168,8 +22344,8 @@ license:CC0-1.0
<info name="programmer" value="Charles Wilbur" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42184,6 +22360,232 @@ license:CC0-1.0
</part>
</software>
+ <software name="calgames">
+ <description>California Games (4am crack)</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Carl Mey" />
+ <info name="programmer" value="Edwin Reich" />
+ <info name="programmer" value="Ed Chu" />
+ <info name="programmer" value="Brian Fleming" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20. Redumped 2021-08-29 to fix previously undetected data corruption in disk 2. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="california games (4am crack) side a.dsk" size="143360" crc="284f014d" sha1="97a5a792a936e13131ae37c3bdd32369d1eea8c0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="california games (4am crack) side b.dsk" size="143360" crc="9e2d3164" sha1="4e47f5e088936218c9d5d627b6a0deecd3cec652" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="calskils">
+ <description>Calendar Skills (version 08.31.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="08.31.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-12-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="calendar skills (4am crack).dsk" size="143360" crc="0a607950" sha1="15b8a8a76d0e00003a8ba222add1d80fc0f06d23" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="camptril">
+ <description>Campaign Trilogy (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="campaign trilogy (4am crack) side a.dsk" size="143360" crc="2ac785e6" sha1="c377255bc975d5039739a79adcc87da3a23ff5ae"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="campaign trilogy (4am crack) side b.dsk" size="143360" crc="37137e35" sha1="3cbbfaa18e5ce4786d5ffaf53f58820156ce2276"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="canbalbz">
+ <description>Cannonball Blitz (4am crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cannonball blitz (4am crack).dsk" size="143360" crc="dc1f57a6" sha1="cf21476eeae8ce0f725f5740dad778b561034989" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="canclmbr">
+ <description>Canyon Climber (4am crack)</description>
+ <year>1982</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Brian Mountford" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-17 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="canyon climber (4am crack).dsk" size="143360" crc="9fc4be6c" sha1="bae5f73448c16e70c7936e913ff7d581a1449f1c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="capitalea">
+ <description>Capitalization (Educational Activities) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Educational Activities</publisher>
+ <info name="developer" value="Activities Records" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-18 -->
+ <!-- educational program -->
+ <!-- different prgram than Capitalization from Gamco Industries or Hartley Courseware -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization (educational activities) (4am crack).dsk" size="143360" crc="4eebb8e5" sha1="605ed1f07cfa2596f50749a7e37ee0ae4a6334ce" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="capitalg">
+ <description>Capitalization (version 1.5) (Gamco Industries) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gamco Industries</publisher>
+ <info name="developer" value="Gamco Industries" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-03 -->
+ <!-- educational program -->
+ <!-- different prgram than Capitalization from Educational Activities or Hartley Courseware -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization v1.5 (4am crack).dsk" size="143360" crc="91700bd8" sha1="ebec31c7aeac632408897faf232cbc04668fcd50" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="capitalh82" cloneof="capitalh">
+ <description>Capitalization (version 1982) (Hartley Courseware) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1982" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-22 -->
+ <!-- educational program -->
+ <!-- different prgram than Capitalization from Gamco Industries or Gamco Industries -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Practice"/>
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization (4am crack) disk 1 - practice.dsk" size="143360" crc="b86aec47" sha1="cbaedc77ebdd217be1400490597f905c9f2a78bb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Test"/>
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization (4am crack) disk 2 - test.dsk" size="143360" crc="bef6c07d" sha1="16f77b48b02a4d1cddd1f3c0eba6b1d997a95ace" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="capitalh110483" cloneof="capitalh">
+ <description>Capitalization (version 11.04.83) (Hartley Courseware) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="11.04.83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
+ <!-- different prgram than Capitalization from Gamco Industries or Gamco Industries -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Practice"/>
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization v11.04.83 (4am crack) - practice.dsk" size="143360" crc="53dff049" sha1="ccf88c87529ba7a5c9c08b70754990976e334f1d"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Test"/>
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization v11.04.83 (4am crack) - test.dsk" size="143360" crc="d81bb317" sha1="289215e24b7e977e1afbfe3e69ea16219cfc4cd9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="capitalh">
+ <description>Capitalization (version 01.29.87) (Hartley Courseware) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.29.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-14 -->
+ <!-- educational program -->
+ <!-- different prgram than Capitalization from Gamco Industries or Gamco Industries -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Practice"/>
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization v01.29.87 (4am crack) disk 1 - practice.dsk" size="143360" crc="8ecf1ba6" sha1="8db53f4cf4b82a107d415f36b4d15968a26b74fa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Test"/>
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization v01.29.87 (4am crack) disk 2 - test.dsk" size="143360" crc="fd55ae25" sha1="803d5cc2f253090ee301b5fef7eefe00f0acfa18" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="capplus">
+ <description>Capitalization Plus (4am crack)</description>
+ <year>1983</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Doug Higgins" />
+ <info name="programmer" value="Cliff Paige" />
+ <info name="programmer" value="Peggy Higgins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="capitalization plus (4am crack).dsk" size="143360" crc="2e3668a9" sha1="4e486ed0b22360ec5e2f97a855a8138691627223" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="capbbls">
<description>Capitalization: Building Better Language Skills (4am crack)</description>
<year>1991</year>
@@ -42191,8 +22593,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="capitalization- building better language skills (4am crack).dsk" size="143360" crc="1206b7d9" sha1="a06fbade81df011c6fa8aa3fa047bfee32b640b6" />
@@ -42204,12 +22606,13 @@ license:CC0-1.0
<description>Car Builder (revision 1) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2015-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="car builder (4am crack).dsk" size="143360" crc="69b39cc5" sha1="65122e423120a59532fb0068df833f2ee11e5376" />
@@ -42221,13 +22624,14 @@ license:CC0-1.0
<description>Car Builder (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--4am is pretty sure that this version came later than revision 1 due to IIgs specific initialization code.-->
+ <!-- 4am is pretty sure that this version came later than revision 1 due to IIgs specific initialization code. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-03-08-->
- <!--educational program-->
+ <!-- Dump released: 2016-03-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="car builder revision 2 (4am crack).dsk" size="143360" crc="f89172bc" sha1="387e29408b3bb383ea06a9557e248958c91d58e0" />
@@ -42239,13 +22643,14 @@ license:CC0-1.0
<description>Car Builder (revision 3) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
- <!--This copy has significant differences on multiple tracks.-->
+ <!-- This copy has significant differences on multiple tracks. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-12-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="car builder revision 3 (4am and san inc crack).dsk" size="143360" crc="1731219a" sha1="4f5000ee116e10fe7f45c26a7e9701b81e4ace59" />
@@ -42257,12 +22662,13 @@ license:CC0-1.0
<description>Car Builder (revision 4) (4am and san inc crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="car builder rev. 4 (4am and san inc crack).dsk" size="143360" crc="eb1c0ff5" sha1="95c84e38917f458a38be1537567a231e525d5dc8" />
@@ -42278,8 +22684,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="09.15.83N" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-06-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Search" />
<dataarea name="flop" size="143360">
@@ -42294,6 +22700,71 @@ license:CC0-1.0
</part>
</software>
+ <software name="carrierf">
+ <description>Carrier Force (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="carrier force (4am and san inc crack).dsk" size="143360" crc="25cfeacf" sha1="7c1798d02b520b577d04e80654a939c07fa9b0e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cartels">
+ <description>Cartels &amp; Cutthroats (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Dan Bunten" />
+ <info name="programmer" value="Bill Bunten" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cartels and cutthroats (4am and san inc crack).dsk" size="143360" crc="c60bdd16" sha1="c0c2a3664bfdef8ed036d8ba8fde047fc6dfc5e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="casegtr">
+ <description>Case of the Great Train Robbery: Fact and Opinion (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="case of the great train robbery (4am crack).dsk" size="143360" crc="794cb785" sha1="ddfc5c5c859132efd6fd6436cec44d30e26165b5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="casechic">
+ <description>Case of the Missing Chick: Finding The Main Idea (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="case of the missing chick (4am crack).dsk" size="143360" crc="c6bfecda" sha1="f434cf814040b36130e54456bcafcdb9b5559c89" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cashvscrd">
<description>Cash Versus Credit Buying (4am crack)</description>
<year>1983</year>
@@ -42301,8 +22772,8 @@ license:CC0-1.0
<info name="developer" value="Microcomputer Educational Programs" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cash versus credit buying (4am crack).dsk" size="143360" crc="d98eead9" sha1="bbf63cee5ed02e74af6b80cc81a24cd357f39ce7" />
@@ -42315,11 +22786,11 @@ license:CC0-1.0
<year>1986</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-28-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-28 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cat 'n mouse (4am crack).dsk" size="143360" crc="576d3a3a" sha1="d12893ecd81d30616e9ab7f9d953c1792ab6c25b" />
@@ -42332,12 +22803,12 @@ license:CC0-1.0
<year>1986</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Despite a complete lack of visible version numbers, this disk has significant differences on multiple tracks-->
+ <!-- Despite a complete lack of visible version numbers, this disk has significant differences on multiple tracks -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-09-04-->
- <!--educational game-->
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cat n mouse rev. 2 (4am crack).dsk" size="143360" crc="afe8d97a" sha1="44ea0b537c344fce87d68deb94028353c653d0a3" />
@@ -42350,12 +22821,12 @@ license:CC0-1.0
<year>1986</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
- <!--Despite a complete lack of visible version numbers, this disk has significant differences on multiple tracks-->
+ <!-- Despite a complete lack of visible version numbers, this disk has significant differences on multiple tracks -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-15-->
- <!--educational game-->
+ <!-- Dump released: 2017-10-15 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cat n mouse rev. 3 (4am crack).dsk" size="143360" crc="adc7945c" sha1="913dd0e8738beaed4b2f837cf050c89c408143e9" />
@@ -42369,8 +22840,8 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-01-05-->
- <!--educational program-->
+ <!-- Dump released: 2019-01-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="catch a falling star - dolphin math games (4am crack).dsk" size="143360" crc="fbd5c6d5" sha1="8b29dc8600d8db8e452aaa56e5b62ec68fc9c86e" />
@@ -42378,6 +22849,28 @@ license:CC0-1.0
</part>
</software>
+ <software name="catdetg">
+ <description>Categorizing: Detective Games (4am crack)</description>
+ <year>1988</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Bernie Gallagher" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="categorizing - detective games (4am crack).dsk" size="143360" crc="61c8e48a" sha1="e8a1c84e3b004054b5aadc27d0b7074b33a95202" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="catlab">
<description>Catlab: Second Edition (version 2.0) (4am crack)</description>
<year>1986</year>
@@ -42386,8 +22879,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2015-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="catlab (4am crack).dsk" size="143360" crc="a217eedc" sha1="4458fd255e703c2d42889d5f9f14612cffaa0c85" />
@@ -42395,6 +22888,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="catskitt">
+ <description>Cats and Kittens (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cats and kittens (4am crack).dsk" size="143360" crc="9c58daac" sha1="3aee34a9d3d7bb64306162b509db4f93c5f81148" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="causeffh021585" cloneof="causeffh">
<description>Cause and Effect (version 02.15.85) (4am crack)</description>
<year>1985</year>
@@ -42403,8 +22912,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="02.15.85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cause and effect v02.15.85 (4am crack).dsk" size="143360" crc="6bad4950" sha1="afec246bab2ea13cf4f9ffe8dc3ff30bbcaf3a31" />
@@ -42420,8 +22929,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="12.14.87" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-17-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -42443,8 +22952,8 @@ license:CC0-1.0
<info name="developer" value="Troll Associates" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-02-01-->
- <!--educational program-->
+ <!-- Dump released: 2015-02-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cause and effect - what makes it happen (4am crack).dsk" size="143360" crc="a666635c" sha1="7e494a1cf04ddefce3e705526fb8998206e4b399" />
@@ -42452,20 +22961,194 @@ license:CC0-1.0
</part>
</software>
- <software name="cavbustr">
- <description>Cavity Busters (A-284 version 1.0) (4am crack)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-284" />
- <info name="programmer" value="R. Philip Bouchard, Gene Breault, Kevin Neff, Eileen Nannen, Larry Phenow, and Diane Portner" />
+ <software name="cntralnc">
+ <description>Centauri Alliance (4am crack)</description>
+ <year>1990</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-17. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="centauri alliance (4am crack) disk 1a - boot.dsk" size="143360" crc="d8e5afd5" sha1="2204460e183a8fa4471419db510d976e2853f3d5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Roster"/>
+ <dataarea name="flop" size="143360">
+ <rom name="centauri alliance (4am crack) disk 1b - roster.dsk" size="143360" crc="e258fb1e" sha1="daf12471584e5a6c3fc3e501e9334adb35c38ea7" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Scenario 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="centauri alliance (4am crack) disk 2a - scenery 1.dsk" size="143360" crc="4d026cd8" sha1="c9f610fd2a6d08a4ee5bf3fa46f260ed56984121" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Scenario 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="centauri alliance (4am crack) disk 2b - scenery 2.dsk" size="143360" crc="0d976331" sha1="b6830cb95028bce75ca509964eb701ff5b96f7c2" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Scenario 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="centauri alliance (4am crack) disk 3a - scenery 3.dsk" size="143360" crc="5ed890de" sha1="518301730baaef9fa2cbde4cecf73bd3c35b6353" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Scenario 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="centauri alliance (4am crack) disk 3b - scenery 4.dsk" size="143360" crc="f0926edf" sha1="8bf06e1dc19fcc9be58e0bf0b5c24819a688b64d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="centiped">
+ <description>Centipede (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="centipede (atari) (4am crack).dsk" size="143360" crc="6ed28f00" sha1="51e06dd3727148b5a2f809f2a46bd9e0281b3869" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="certmore">
+ <description>Certificates and More! (4am crack)</description>
+ <year>1988</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Pelican Software"/>
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Ken Grey" />
+ <!-- see #14146 below marked "artwork:" -->
+ <info name="programmer" value="Janet Coutu" />
+ <info name="programmer" value="Steve Parlotto" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="Herb Perez" />
+ <info name="programmer" value="Diane Riendeau" />
<info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-14-->
- <!--educational program-->
+ <!-- Dump released: 2019-11-21. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- graphics utility -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="143360">
- <rom name="mecc-a284 cavity busters v1.0 (4am crack).dsk" size="143360" crc="50bdfefc" sha1="581beb655316f30967d63eac2d7ea2f8de8b26da"/>
+ <rom name="certificates and more (4am crack) disk 1 - program.dsk" size="143360" crc="a7145f4d" sha1="f09861dc6722206e2d2d8eadde805595edd16a6d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Templates"/>
+ <dataarea name="flop" size="143360">
+ <rom name="certificates and more (4am crack) disk 2 - templates.dsk" size="143360" crc="a4f43948" sha1="72c15e0c21abf599dd1e9ba4de53503f1fc942b8" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Borders and fonts"/>
+ <dataarea name="flop" size="143360">
+ <rom name="certificates and more (4am crack) disk 3 - borders and fonts.dsk" size="143360" crc="c89753e1" sha1="e8545509b0f94025ab3ef9c93c93078fca619971" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chalmath">
+ <description>Challenge Math (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="C. McMahon" />
+ <info name="programmer" value="J. Sweedler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="challenge math (4am crack).dsk" size="143360" crc="13ca32af" sha1="77fd54dfe5bc0b3775c43d38540a3f3366d25c24" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chsntcom">
+ <description>Challenge Sentence Combining (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="IOTA" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="challenge sentence combining (4am crack).dsk" size="143360" crc="ac771b9f" sha1="6b03e7dc7889064d68f2a172952c9b4edcd3e845" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chmpgolf">
+ <description>Championship Golf (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Blair Hadfield" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-06-12 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="championship golf (4am crack).dsk" size="143360" crc="632254c5" sha1="c4613b775f652be87706f89362ebf61bcdd43239" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chldrnr">
+ <description>Championship Lode Runner (4am crack)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Doug Smith" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="championship lode runner (4am crack).dsk" size="143360" crc="c950c3b1" sha1="67035e6a4960ce764d216ab265b0f887ec053f67" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chwrest">
+ <description>Championship Wrestling (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Lonnie D. Ropp" />
+ <info name="programmer" value="Richard A. Ditton" />
+ <info name="programmer" value="David Thiel" />
+ <info name="programmer" value="Jeffrey P. Lee" />
+ <info name="programmer" value="Timothy Skelly" />
+ <info name="programmer" value="Elaine Hodgson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-04 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="championship wrestling (4am crack) side a.dsk" size="143360" crc="9b562e29" sha1="8b7ff536b52238ea0ee048d0ef98c72c159b1a54" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="championship wrestling (4am crack) side b.dsk" size="143360" crc="5e513adf" sha1="76946879b72976b6477a0ffa68c8a9a677c3550b" />
</dataarea>
</part>
</software>
@@ -42475,10 +23158,10 @@ license:CC0-1.0
<year>1981</year>
<publisher>Micro Learningware</publisher>
<info name="programmer" value="Todd Allen" />
- <info name="usage" value="Requires an 48K Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-05-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-05-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="change maker (4am crack).dsk" size="143360" crc="4018854d" sha1="b84af47d272e0c7bd19c071c60507b72b6adc2a4" />
@@ -42486,17 +23169,158 @@ license:CC0-1.0
</part>
</software>
+ <software name="chcougkng031286" cloneof="chcougkng">
+ <description>Chariots, Cougars, and Kings (version 03.12.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="03.12.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="chariots, cougars, and kings v03.12.86 (4am crack) disk 1.dsk" size="143360" crc="231d0e3c" sha1="92274c01c9e2d91a948189a2dbffc82ac6404f3b"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="chariots, cougars, and kings v03.12.86 (4am crack) disk 2.dsk" size="143360" crc="9ada44e6" sha1="c49515ef61a84c089484f667909017724edf6330"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chcougkng">
+ <description>Chariots, Cougars, and Kings (version 06.26.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="06.26.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="chariots, cougars, and kings (4am crack) disk 1.dsk" size="143360" crc="8fc9df9f" sha1="d966d3a65ff4eb861d9faa58fb491a33c4b94fe8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="chariots, cougars, and kings (4am crack) disk 2.dsk" size="143360" crc="57dcc568" sha1="fccb739ccc8dcddd00b60dcabad2745909f0f517" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chbr12385" cloneof="chbr123">
+ <description>Charlie Brown's 1,2,3's (Random House) (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Random House</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="charlie brown's 1-2-3s (4am crack) side a.dsk" size="143360" crc="22ff5067" sha1="5b09390b3c438284f9ea534ee755fe57899dabc4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="charlie brown's 1-2-3s (4am crack) side b.dsk" size="143360" crc="7ea28429" sha1="5d5f985d2fc3d899f1a6b6cf16448c387a677c41" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chbr123">
+ <description>Charlie Brown's 1,2,3's (Queue) (version 1990) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Queue</publisher>
+ <info name="original_publisher" value="Random House" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="charlie brown's 1, 2, 3's (1990 re-release)(4am crack) side a.dsk" size="143360" crc="62ff3f40" sha1="c7cd861c9000a6169cc8e14af661ba7cb02227a1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="charlie brown's 1, 2, 3's (1990 re-release)(4am crack) side b.dsk" size="143360" crc="4b8a2eb6" sha1="61fe7bb3f9e88c430a743c39ed6f378539eff31a" />
+ </dataarea>
+ </part>
+ </software>
+
+
+ <software name="chbrabc">
+ <description>Charlie Brown's ABC's (4am crack)</description>
+ <year>1984</year>
+ <publisher>Random House</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="charlie brown's abc's (4am crack) side a.dsk" size="143360" crc="d727b6f6" sha1="1af44fa21e611564ab3929aec753cc4e160d8b80" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="charlie brown's abc's (4am crack) side b.dsk" size="143360" crc="5bb8d11e" sha1="d394b12ad488c50e69c07367c7bd55b07d3aed6d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="caimathch">
+ <description>Chemistry Achievement I: Mathematics of Chemistry (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Doug Higgins" />
+ <info name="programmer" value="Jonathan Paul" />
+ <info name="programmer" value="Edmund Eisenberg" />
+ <info name="programmer" value="Dennis Sullivan" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="chemistry achievement i - mathematics of chemistry (4am crack).dsk" size="143360" crc="ba07c4b2" sha1="eb5bc54515e501710a6d5a3dd73591c5cbef882c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="chembaleq">
<description>Chemistry: Balancing Equations (A-280 version 1.0) (4am crack)</description>
<year>1990</year>
<publisher>MECC</publisher>
<info name="partno" value="A-280" />
- <info name="programmer" value="Beth Bell, Gene Breault, Scott Jensen, and Elizabeth Wendland" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Elizabeth Wendland" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-14-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a280 chemistry- balancing equations v1.0 (4am crack).dsk" size="143360" crc="9194215b" sha1="33ba5d83469b8520fc9a1876bf78c37a23580af5"/>
@@ -42504,17 +23328,21 @@ license:CC0-1.0
</part>
</software>
- <software name="chempertab">
+ <software name="chempertab_525">
<description>Chemistry: The Periodic Table (A-251 version 1.1) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-251" />
- <info name="programmer" value="Gene Breault, Charolyn Kapplinger, Kevin W. Neff, John Persoon, and James L. Thompson" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin W. Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a251 chemistry- the periodic table v1.1 (4am crack).dsk" size="143360" crc="4e519211" sha1="c0165ffb4ee3895f490e951d91c54e09be0dcaac"/>
@@ -42529,8 +23357,8 @@ license:CC0-1.0
<info name="programmer" value="Richard L. Coleman, Ph.D." />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="theories of child development (4am crack).dsk" size="143360" crc="1fe30ba8" sha1="3c90ea06c2e95e11ef1a514244f0211119364640" />
@@ -42545,8 +23373,8 @@ license:CC0-1.0
<info name="programmer" value="Richard L. Coleman, Ph.D." />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="infancy and toddlerhood (4am crack).dsk" size="143360" crc="7b4317bc" sha1="2aadfa0d6d687f6475ffe4987b3b7580fb45a96a" />
@@ -42558,12 +23386,14 @@ license:CC0-1.0
<description>Chivalry (revision 1) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-16-->
- <!--board game-->
+ <!-- Dump released: 2017-05-16 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="chivalry (4am and san inc crack).dsk" size="143360" crc="9b31ba8c" sha1="4e6a55b9a1bd45d40301f4d1873d48bcd1c56e5b" />
@@ -42575,12 +23405,14 @@ license:CC0-1.0
<description>Chivalry (revision 2) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-05-->
- <!--board game-->
+ <!-- Dump released: 2019-09-05 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="chivalry rev. 2 (4am and san inc crack).dsk" size="143360" crc="ba08b7bb" sha1="af10167662e98448dbeacd64ce2782d268162097" />
@@ -42588,16 +23420,48 @@ license:CC0-1.0
</part>
</software>
+ <software name="choplftr">
+ <description>Choplifter (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Dan Gorlin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- 2019-04-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="choplifter (4am and san inc crack).dsk" size="143360" crc="1c500f6c" sha1="a6231ba217b56f8516991dedcc9806f36a66a43b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cacoppos">
+ <description>City and Country Opposites (4am crack)</description>
+ <year>1986</year>
+ <publisher>Random House</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- 2017-09-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="city and country opposites (4am crack).dsk" size="143360" crc="2036f4f0" sha1="35fd975f31d90ec2a02facc66babb8de507e4579" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="clasobjs">
<description>Classification of Objects (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank Salamon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="classification of objects (4am crack).dsk" size="143360" crc="206ba626" sha1="06a5d59a9a627c4c868724976fb7027c13c7f10e" />
@@ -42605,16 +23469,53 @@ license:CC0-1.0
</part>
</software>
+ <software name="classif10" cloneof="classif">
+ <description>Classification Volume 1 (A-824 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-824" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a824 classification volume 1 v1.0 (4am crack).dsk" size="143360" crc="f809449c" sha1="4fbfbb69c1deab64257028e2494a2be1033fbb12"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="classif">
+ <description>Classification Volume 1 (A-824 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-824" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a824 classification v1.1 (4am crack).dsk" size="143360" crc="c1057864" sha1="73f8b7434ea969340e8f075a57da3f65fa8fe98b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="clasmate20" cloneof="clasmate">
<description>Classmate (version 2.0) (4am crack)</description>
<year>1985</year>
<publisher>Davidson &amp; Associates</publisher>
- <info name="programmer" value="Linda Broudy and Sid Broudy" />
+ <info name="programmer" value="Linda Broudy" />
+ <info name="programmer" value="Sid Broudy" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="classmate v2.0 (4am crack).dsk" size="143360" crc="e3d75425" sha1="535973b5d4881ef6ed310e5462021ce6338645cb" />
@@ -42626,12 +23527,13 @@ license:CC0-1.0
<description>Classmate (version 2.1) (4am crack)</description>
<year>1987</year>
<publisher>Davidson &amp; Associates</publisher>
- <info name="programmer" value="Linda Broudy and Sid Broudy" />
+ <info name="programmer" value="Linda Broudy" />
+ <info name="programmer" value="Sid Broudy" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-09-12-->
- <!--educational program-->
+ <!-- Dump released: 2014-09-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="classmate (4am crack).dsk" size="143360" crc="c52d247a" sha1="73b904b598e2a8282e3ab2eead0858c1fe5a86a5" />
@@ -42643,11 +23545,11 @@ license:CC0-1.0
<description>Clauses and Whole Sentences (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-02-04-->
- <!--educational program-->
+ <!-- Dump released: 2024-02-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="clauses and whole sentences (4am crack).dsk" size="143360" crc="cdef418b" sha1="211c3d2ab112afd320b32f597c2721e84bcbb7f9" />
@@ -42655,35 +23557,84 @@ license:CC0-1.0
</part>
</software>
- <software name="clnwtdet">
- <description>Cleanwater Detectives (A-282 version 1.0) (4am crack)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-282" />
- <info name="programmer" value="Vincent J. Erickson, John Ojanen, and Diane Portner" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-14-->
- <!--educational program-->
+ <software name="clefnote">
+ <description>Clef Notes Drill (4am crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-13-->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="mecc-a282 cleanwater detectives v1.0 (4am crack).dsk" size="143360" crc="dcec5ce5" sha1="50a27abc33aa7a82199fb986f57a84410ba34738"/>
+ <rom name="clef notes (4am crack).dsk" size="143360" crc="4588d8e5" sha1="5d2d8946cc787ac18ba5e39bfe47204caeb870ab"/>
</dataarea>
</part>
</software>
- <software name="clockwrks">
+ <software name="clocktt070683" cloneof="clocktt">
+ <description>Clock: Time Teaching (version 07.06.83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="07.06.83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="clock 07.06.83 (4am crack).dsk" size="143360" crc="db9c1a4a" sha1="ad3dbcef068a2d90c00a811696440a5e34f4bb96" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clocktt060484" cloneof="clocktt">
+ <description>Clock: Time Teaching (version 06.04.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="06.04.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="clock (4am crack).dsk" size="143360" crc="623754cc" sha1="29c9a23e6fcdd04933e5992e1f9aac0d9ba458b0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clocktt">
+ <description>Clock: Time Teaching (version 03.20.90) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="03.20.90" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="clock 03.20.90 (4am crack).dsk" size="143360" crc="e00e5ffb" sha1="abf0c1ba72ac2d7fb97c26ed56b4a38499f27cbf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clockwrks_525">
<description>Clock Works (A-168 version 1.0) (4am crack)</description>
<year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-168" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Craig Solomonson" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a168 clock works v1.0 (4am crack).dsk" size="143360" crc="b57ae582" sha1="e258e8d1ff008f58bc50f792a554098f0c5f2e2a"/>
@@ -42695,11 +23646,13 @@ license:CC0-1.0
<description>Clowning Around (revision 1) (4am crack)</description>
<year>1985</year>
<publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
+ <!-- Does not show the Litag developer screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-16-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="clowning around (4am crack).dsk" size="143360" crc="7af87e90" sha1="16198dce4749365f6c3ce4f93fd6290c668ffb1e" />
@@ -42711,12 +23664,13 @@ license:CC0-1.0
<description>Clowning Around (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This updated revision has updated copy protection and unspecified bug fixes.-->
+ <!-- This updated revision has updated copy protection and unspecified bug fixes. Title screen changed to Panda and shows the Litag developer screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-12-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="clowning around rev. 2 (4am crack).dsk" size="143360" crc="cc633dfa" sha1="c992598eb914e8c6e50ace6113423c4b39aa26d8" />
@@ -42724,15 +23678,151 @@ license:CC0-1.0
</part>
</software>
+ <software name="clozeplc">
+ <description>Cloze-Plus: Level C (4am crack)</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level c (4am crack) disk 1.dsk" size="143360" crc="bbc05b82" sha1="2528765e405d880575f80d75f29a313c638a32e9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level c (4am crack) disk 2.dsk" size="143360" crc="3212d424" sha1="1be9c3078ea25bb2b2b6f6685eed7dcf9203bf36" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level c (4am crack) disk 3.dsk" size="143360" crc="e0a96a5a" sha1="b8a903e5242dbfe052e024d19fc48779712831f4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level c (4am crack) disk 4.dsk" size="143360" crc="0965e196" sha1="8acd0ed0f6e0673e1454e7f42dbb78cf8230adb6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clozepld">
+ <description>Cloze-Plus: Level D (4am crack)</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level d (4am crack) disk 1.dsk" size="143360" crc="98c4164e" sha1="1006f03d8bbb53c9e33fdcece77528468fd7dca3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level d (4am crack) disk 2.dsk" size="143360" crc="b2794b32" sha1="65218239901d4029fa2ca33a46614ebb5234f607" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level d (4am crack) disk 3.dsk" size="143360" crc="3abfc44a" sha1="439c0e8917388d9a7cc3e3cd02abe7e48423080e" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level d (4am crack) disk 4.dsk" size="143360" crc="8416bb90" sha1="b3335e463071bc8e1194bdacc866b7d6e1c19868" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clozeple">
+ <description>Cloze-Plus: Level E (4am crack)</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level e (4am crack) disk 1.dsk" size="143360" crc="74f58bdf" sha1="86e4c2d6a6213388bbda3e0843efb3464a4671bb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level e (4am crack) disk 2.dsk" size="143360" crc="38bce5b3" sha1="437f7c8df4af1087f39351d3b891f4b2e041ff84" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level e (4am crack) disk 3.dsk" size="143360" crc="fb04ebf6" sha1="4f4a2dddd90703be5fc016a2d211c6b95ee0c009" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cloze-plus level e (4am crack) disk 4.dsk" size="143360" crc="dc2744b5" sha1="ed7629b3edc287553e453c63fc9941a61bdd4941" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clzreadc">
+ <description>Clozed Reading Comprehension (4am crack)</description>
+ <year>1985</year>
+ <publisher>Queue</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="clozed reading comprehension (4am crack).dsk" size="143360" crc="1a19fb92" sha1="7e7b46e3f747bd4c0686769bebc05395170e3f4f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cluemd">
+ <description>Clue: Master Detective (version 1.5) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Leisure Genius</publisher>
+ <info name="developer" value="Casablanca Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-05 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="clue master detective v1.5 (4am crack).dsk" size="143360" crc="e46f9fa8" sha1="e73ec6e7dec7e14d791d63dc53cd7a3a8797f7e1"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="codecyph">
<description>Codes and Cyphers (4am and san inc crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Susan Dubicki, and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-01-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-01-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="codes and cyphers (4am and san inc crack).dsk" size="143360" crc="ae8cf9e1" sha1="67ef4606dd8c0b1ec5db07119057c6884144739e"/>
@@ -42744,11 +23834,12 @@ license:CC0-1.0
<description>Collamore Castle: Strategies for Problem Solving Level 1 (4am crack)</description>
<year>1987</year>
<publisher>D.C. Heath and Company</publisher>
- <info name="programmer" value="Thor Bradsher and Martin Gregory" />
+ <info name="programmer" value="Thor Bradsher" />
+ <info name="programmer" value="Martin Gregory" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="collamore castle- strategies for problem solving level 1 (4am crack).dsk" size="143360" crc="5cc0d816" sha1="2a018dbf40c842bcb3c2bcfc7b3c774f3116359c" />
@@ -42756,17 +23847,130 @@ license:CC0-1.0
</part>
</software>
- <software name="commkeys10" cloneof="commkeys">
+ <software name="coloncqt10">
+ <description>Colonial Conquest (version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Strategic Simulations" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-23 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="colonial conquest (4am crack).dsk" size="143360" crc="5f56187d" sha1="52040bb086d1239624f58245304ebf395b40c039" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="colormes">
+ <description>Color Me: Computer Coloring Book (Softsmith) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Cherie Bauman" />
+ <info name="programmer" value="Verne Bauman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-29 -->
+ <!-- educational program -->
+ <!-- Different program from "ColorMe: The Computer Coloring Kit" by Mindscape. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="color me (softsmith)(4am crack).dsk" size="143360" crc="0e22f1fc" sha1="522d338af7fa956e2c1b62eab2fa88141d8e5e75" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="colorme">
+ <description>ColorMe: The Computer Coloring Kit (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <!-- Sprout Software brand (Fun learning software for ages 4 and up).-->
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Uses double hi-res graphics -->
+ <!-- Dump released: 2014-08-19. Redumped: 2025-01-21 with addtional picture disks. -->
+ <!-- graphics program -->
+ <!-- Different program from "Color Me: Computer Coloring Book" by Softsmith. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Program Disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack).dsk" size="143360" crc="1f9e832d" sha1="7517509d108641244d159fb475a94ee2cb48f96d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Picture Disk - The Hugga Bunch - Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack) picture disk - hugga bunch - side a.dsk" size="143360" crc="6afeb028" sha1="206788a5ad07b1d7e7d5dabe936d4bb1c1608a2b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Picture Disk - The Hugga Bunch - Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack) picture disk - hugga bunch - side b.dsk" size="143360" crc="227c37ce" sha1="18e1f544389770a6a74d97c585e2a7e6a8a5674c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Picture Disk - Rainbow Brite - Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack) picture disk - rainbow brite - side a.dsk" size="143360" crc="9f648044" sha1="b58f89847ac7e0e1dce70625ab465c11bee8fc42" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Picture Disk - Rainbow Brite - Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack) picture disk - rainbow brite - side b.dsk" size="143360" crc="d9cdb58e" sha1="55f5edf357c2f099247d16a8a9e7eb2aa2e5531c" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Picture Disk - Tink!Tonk! - Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack) picture disk - tink tonk - side a.dsk" size="143360" crc="1d7760a6" sha1="2c0d2e9d529d5898e00fcf304799f6e08bf281a3" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Picture Disk - Tink!Tonk! - Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="colorme (4am crack) picture disk - tink tonk - side b.dsk" size="143360" crc="595a8ba1" sha1="fcd8ffedd2f1adac50a332da7e7fada123af4027" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commasq">
+ <description>Commas (version 1990) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Victoria Learning Systems</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="commas (queue) (4am crack).dsk" size="143360" crc="660e3e38" sha1="a53cb117b0fb39f4b5906e657d66f706c1146520" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commkeys10" cloneof="commkeys_525">
<description>CommuniKeys (A-248 version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-248" />
- <info name="programmer" value="Beth Bell, Vincent Erickson, Charolyn Kapplinger, Sherry Luedloff, Michael Palmquist, John Persoon, and Paul Weiser" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Paul Weiser" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-03-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-03-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a248 communikeys v1.0 (4am crack).dsk" size="143360" crc="7b2b32ae" sha1="2b76a1d969ea26b1d0498c51c3f713f561d5d273" />
@@ -42774,17 +23978,23 @@ license:CC0-1.0
</part>
</software>
- <software name="commkeys">
+ <software name="commkeys_525">
<description>CommuniKeys (A-248 version 1.1) (4am crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-248" />
- <info name="programmer" value="Beth Bell, Vincent Erickson, Charolyn Kapplinger, Sherry Luedloff, Michael Palmquist, John Persoon, and Paul Weiser" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Paul Weiser" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-13-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a248 communikeys v1.1 (4am crack).dsk" size="143360" crc="ace29987" sha1="e535e4916339e5c80761542b9e69163add9c6a1b"/>
@@ -42799,8 +24009,8 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="comparison kitchen (4am crack).dsk" size="143360" crc="8a51be1f" sha1="de2b6c03cb28f18b1af74918691821660de87996" />
@@ -42812,12 +24022,12 @@ license:CC0-1.0
<description>Complex Circuits (4am crack)</description>
<year>1984</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="developer" value="Educational Materials and Equipment" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="complex circuits (4am crack).dsk" size="143360" crc="d39c85c2" sha1="9befb85556807a4734031b4854b4271d73beb79d"/>
@@ -42825,6 +24035,208 @@ license:CC0-1.0
</part>
</software>
+ <software name="compwcon">
+ <description>Compound Words &amp; Contractions (version 09.15.87) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.15.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="compound words and contractions 1987-09-15 (4am crack) disk 1.dsk" size="143360" crc="de990e77" sha1="46f29e3e5b7e50fc72bfa81c26b279f0db420302" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="compound words and contractions 1987-09-15 (4am crack) disk 2.dsk" size="143360" crc="e4c54cfe" sha1="ba156776b7ad50796f16cecbf0da24777ea00b1b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="143360">
+ <rom name="compound words and contractions 1987-09-15 (4am crack) disk 3.dsk" size="143360" crc="198a2b5d" sha1="b4a50e14aa4378e836b897bac16a1873b33435bb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismedit">
+ <description>Composing Information Series: MECC Editor (A-135 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-135" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a135 mecc editor v1.0 (4am crack).dsk" size="143360" crc="74c0c894" sha1="2a01af093ffff94e1c413ad86538704b61864ba2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismspell">
+ <description>Composing Information Series: MECC Speller (A-134 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-134" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a134 mecc speller v1.0 (4am crack) side a - program.dsk" size="143360" crc="c8f08b29" sha1="5f6a776ed6ec12cc025b886c7f036807d841aea4"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Dictionary"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a134 mecc speller v1.0 (4am crack) side b - dictionary.dsk" size="143360" crc="fbdc252e" sha1="df2f44ba88fcf848e7a4ff98398d7707f97b39ac"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismwrites">
+ <description>Composing Information Series: MECC Write Start (A-133 version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-133" />
+ <info name="programmer" value="Susan Russell" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a133 mecc write start v1.2 (4am crack).dsk" size="143360" crc="4c9f233d" sha1="a4773b48762922b92c92c9e90007b865d4296e93"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismwrite11" cloneof="cismwrite">
+ <description>Composing Information Series: MECC Writer (A-132 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-132" />
+ <info name="programmer" value="Craig Carlson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a132 mecc writer v1.1 (4am crack).dsk" size="143360" crc="28017f79" sha1="0180842ef43818de7164eb5f661f7aa5859b3c83"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismwrite11a" cloneof="cismwrite">
+ <description>Composing Information Series: MECC Writer (A-132 version 1.1a) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-132" />
+ <info name="programmer" value="Craig Carlson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1a" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a132 mecc writer v1.1a (4am crack).dsk" size="143360" crc="4bc56e61" sha1="97312d304c59e63df37ef3c1384ec080aaea428d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismwrite">
+ <description>Composing Information Series: MECC Writer (A-132 version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-132" />
+ <info name="programmer" value="Craig Carlson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a132 mecc writer v1.2 (4am crack).dsk" size="143360" crc="41eeb966" sha1="6b6cd31dbc640781691f6b1e1e886f9c6e54394c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="comppple2">
+ <description>Comprehension Power Program: Level E-2 (4am crack)</description>
+ <year>1981</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="Milliken Publishing Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="comprehension power program - level e-2 (4am crack).dsk" size="143360" crc="81bc41ca" sha1="bc38f07ff5ce59552ec65ac6ff767c472f7ff550" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpairct">
+ <description>Computer Air Combat (version 1.1) (4am and san inc crack)</description>
+ <year>1980</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charles Merrow" />
+ <info name="programmer" value="Jack T. Avery" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-23 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer air combat v1.1 (4am and san inc crack).dsk" size="143360" crc="c90ddc0a" sha1="61910011bd88739e2d3c16b9f0d1272202974caa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpambsh">
+ <description>Computer Ambush (version 1982) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Ed Willinger" />
+ <info name="programmer" value="Kendall Whitesell" />
+ <info name="programmer" value="Larry D. Strawser" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1982" />
+ <!-- This version is 1982 and states redeveloped by Kendall Whitesell and Larry D. Strawser. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-29 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer ambush (4am and san inc crack).dsk" size="143360" crc="8916ce80" sha1="4526f179ce891997e45bfc2d727a3a6559c8d297" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cablkbrdd">
<description>Computer Assisted Blackboard demo (4am crack)</description>
<year>1983</year>
@@ -42832,8 +24244,8 @@ license:CC0-1.0
<info name="programmer" value="Leonard J. Soltzberg" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-09-->
- <!--productivity program-->
+ <!-- Dump released: 2015-08-09 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="computer assisted blackboard demo (4am crack).dsk" size="143360" crc="692aba74" sha1="40481cdf7c328c4a19be02041eb28690ffbf56c8" />
@@ -42841,6 +24253,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="cmpbaseb">
+ <description>Computer Baseball (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charlie Merrow" />
+ <info name="programmer" value="Jack Avery" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-05 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer baseball (4am and san inc crack).dsk" size="143360" crc="1e13b893" sha1="6417e6a78c821c6d6c8ac344f5acd3ce5aaa4e7d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpbaseb83t">
+ <description>Computer Baseball 1983 Teams Disk (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charlie Merrow" />
+ <info name="programmer" value="Jack Avery" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <!-- This is an add-on to Computer Baseball. It is bootable but will ask for the game disk after selecting the team. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-06 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer baseball 1983 teams disk (4am and san inc crack).dsk" size="143360" crc="9d4d81fc" sha1="9343d764c844459f2e6c42a539505619c9d567e7"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="cblclamd">
<description>Computer Biology Lab: Clam Dissection (4am crack)</description>
<year>1984</year>
@@ -42849,8 +24296,8 @@ license:CC0-1.0
<info name="programmer" value="Larry Newby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42873,8 +24320,8 @@ license:CC0-1.0
<info name="programmer" value="Larry Newby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42897,8 +24344,8 @@ license:CC0-1.0
<info name="programmer" value="Larry Newby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="earthworm dissection (4am crack).dsk" size="143360" crc="2cd9be44" sha1="16de350d908b813866389d74c5f1cede60514396" />
@@ -42914,8 +24361,8 @@ license:CC0-1.0
<info name="programmer" value="Larry Newby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="frog dissection (4am crack).dsk" size="143360" crc="527e5500" sha1="3a1ecf92487b156078c1a97859560ffe8f6d819b" />
@@ -42931,8 +24378,8 @@ license:CC0-1.0
<info name="programmer" value="Larry C. Newby" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-14-->
- <!--educational program-->
+ <!-- Dump released: 2017-01-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -42955,8 +24402,8 @@ license:CC0-1.0
<info name="programmer" value="Larry Newby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -42971,6 +24418,25 @@ license:CC0-1.0
</part>
</software>
+ <software name="combism">
+ <description>Computer Bismarck (version 1.1) (4am and san inc crack)</description>
+ <year>1980</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Lyon" />
+ <info name="programmer" value="Joel Billings" />
+ <info name="programmer" value="David Cook" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-12 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer bismarck v1.1 (4am and san inc crack).dsk" size="143360" crc="958fcbb8" sha1="1e40ca6400f704a9a2ee99d47db85318a9bfa80d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cgmm1ps11" cloneof="cgmm1ps">
<description>Computer Generated Mathematics Materials Volume 1: Problem Solving (A-757 version 1.1) (4am crack)</description>
<year>1982</year>
@@ -42980,8 +24446,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a757 computer generated mathematics materials volume 1- problem solving v1.1 (4am crack).dsk" size="143360" crc="0e4f4b8b" sha1="4d93c6508d618fbb7f5ef2b86df25d28e2b34837"/>
@@ -42998,8 +24464,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-05-27-->
- <!--educational program-->
+ <!-- Dump released: 2020-05-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a757 computer generated mathematics materials volume 1- problem solving v1.3 (4am crack).dsk" size="143360" crc="004ffc88" sha1="f30b0487b985979bdcd9e5812679c9bff74a1bd6"/>
@@ -43016,8 +24482,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2017-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a758 computer generated mathematics materials problem solving vol. 2 v1.0 (4am crack).dsk" size="143360" crc="b06e7c6d" sha1="628687e69cac2a03a4f9813f3a4c0352015f94c5" />
@@ -43034,8 +24500,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a758 computer generated mathematics materials volume 2- problem solving v1.1 (4am crack).dsk" size="143360" crc="534261ba" sha1="e57663688efac0bbd80426186c09b367724ed6d9"/>
@@ -43048,12 +24514,15 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-240" />
- <info name="programmer" value="Diane Portner, Craig Solomonson, Michael Stein, and James Thompson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="James Thompson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-12-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a240 computer inspector v1.0 (4am crack).dsk" size="143360" crc="88c9ca53" sha1="6c80cc0a5b451e480abea6066e3536df77d9aa86"/>
@@ -43061,6 +24530,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="cmpqbse">
+ <description>Computer Quarterback Second Edition (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Dan Bunten" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-29 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="computer quarterback second edition (4am and san inc crack).dsk" size="143360" crc="bffa5b04" sha1="b1e64b47ea375e782333f0943255dbd18f6cac43" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="compgov">
<description>Computers in Government (A-122 version 1.0) (4am crack)</description>
<year>1984</year>
@@ -43070,8 +24555,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a122 computers in government v1.0 (4am crack).dsk" size="143360" crc="45fe4a2a" sha1="c4884f1ad1f0ca37bc02154769764222221e3d71" />
@@ -43079,17 +24564,97 @@ license:CC0-1.0
</part>
</software>
+ <software name="compteach">
+ <description>Computers in Teaching (T-612 version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="T-612" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Mike Stein" />
+ <info name="programmer" value="Shane Mccarron" />
+ <info name="programmer" value="Bob Jamison" />
+ <info name="programmer" value="Frederick J. Steinmann" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Volume 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-t612 computers in teaching v1.1 (4am crack) volume 1.dsk" size="143360" crc="1eba0425" sha1="88c9ba90e540cf711644f4fefa0dc1ebb9236dfd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Volume 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-t612 computers in teaching v1.1 (4am crack) volume 2.dsk" size="143360" crc="4125d030" sha1="1c04b247d22799ba97f020741309f8526c6fb3c0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="conputat">
+ <description>Con-Putation (Softsmith) (4am and san inc crack)</description>
+ <year>1983</year>
+ <!-- re-released in 1983 -->
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="T.H.E.S.I.S." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="con-putation (4am and san inc crack).dsk" size="143360" crc="d6ae1de7" sha1="7cb2780b8d5a26d9909924896345d115b69f6f61"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cwrdcnc1">
+ <description>Concentrate! On Words &amp; Concepts I (4am crack)</description>
+ <year>1988</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="developer" value="Laureate Learning Systems" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="concentrate on words and concepts (4am crack).dsk" size="143360" crc="a499b85e" sha1="cb4a4984606dcc206efdf3c6dd81fcad2a3ffc85" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cwrdcnc2">
+ <description>Concentrate! On Words &amp; Concepts II (4am crack)</description>
+ <year>1988</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="developer" value="Laureate Learning Systems" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="concentrate on words and concepts ii (4am crack).dsk" size="143360" crc="dc837455" sha1="cb6accb75b13992bb0c43201a71b8605d203af0b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="confviet">
- <description>Conflict in Vietnam (version 2) (4am and san inc crack)</description>
+ <description>Conflict in Vietnam (version 331.00) (4am and san inc crack)</description>
<year>1986</year>
<publisher>Microprose Software</publisher>
- <info name="programmer" value="Sid Meier, Ed Bever, and Jim Synoski" />
- <info name="usage" value="Requires a 128K Apple ][+ or later." />
- <info name="version" value="2" />
- <!--Option to use double hi-res graphics on 128K machines.-->
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
+ <info name="version" value="331.00" />
+ <!-- Option to use double hi-res graphics on 128K machines. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-30-->
- <!--simulation game-->
+ <!-- Dump released: 2017-08-30 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -43109,12 +24674,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-207" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a207 conquering decimals (addition, subtraction) v1.0 (4am crack).dsk" size="143360" crc="c81fa04b" sha1="119883d5dd30a89aa71f817df06c86d3e1b2b819"/>
@@ -43122,17 +24694,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscdecmd10" cloneof="cmscdecmd">
+ <software name="cmscdecmd10" cloneof="cmscdecmd_525">
<description>Conquering Math Series: Conquering Decimals (×, ÷) (A-208 version 1.0) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-208" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a208 conquering decimals (multiplication, division) v1.0 (4am crack).dsk" size="143360" crc="4bddcb36" sha1="0ca877895cf5be4d2e0f54061e6f633af81e25f2"/>
@@ -43140,17 +24719,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscdecmd">
+ <software name="cmscdecmd_525">
<description>Conquering Math Series: Conquering Decimals (×, ÷) (A-208 version 1.1) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-208" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a208 conquering decimals (multiplication, division) v1.1 (4am crack).dsk" size="143360" crc="65dbd733" sha1="0275cb5e2c7d30497307c14f1820eebf92b216ae"/>
@@ -43158,17 +24744,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscfrapm10" cloneof="cmscfrapm">
+ <software name="cmscfrapm10" cloneof="cmscfrapm_525">
<description>Conquering Math Series: Conquering Fractions (+, -) (A-204 version 1.0) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-204" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a204 conquering fractions (addition, subtraction) v1.0 (4am crack).dsk" size="143360" crc="01b0b920" sha1="e22ad28bc88a59ee72889a69ff9c0974c41776ce"/>
@@ -43176,17 +24769,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscfrapm">
+ <software name="cmscfrapm_525">
<description>Conquering Math Series: Conquering Fractions (+, -) (A-204 version 1.1) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-204" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a204 conquering fractions (addition, subtraction) v1.1 (4am crack).dsk" size="143360" crc="cd989a45" sha1="58fd8655ec116895d9bdc51f8274a3c4bf3b252b"/>
@@ -43194,17 +24794,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscframd10" cloneof="cmscframd">
+ <software name="cmscframd10" cloneof="cmscframd_525">
<description>Conquering Math Series: Conquering Fractions (×, ÷) (A-205 version 1.0) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-205" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a205 conquering fractions (multiplication, division) v1.0 (4am crack).dsk" size="143360" crc="51f938d5" sha1="ed7ea5be0549ffcab654a2d980dfac6a968528ef"/>
@@ -43212,17 +24819,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscframd">
+ <software name="cmscframd_525">
<description>Conquering Math Series: Conquering Fractions (×, ÷) (A-205 version 1.1) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-205" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a205 conquering fractions (multiplication, division) v1.1 (4am crack).dsk" size="143360" crc="2fd27dc3" sha1="790fe4defca56f99962b144f938749572486c93b"/>
@@ -43230,17 +24844,20 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscmwg">
+ <software name="cmscmwg_525">
<description>Conquering Math Series: Conquering Math Worksheet Generator (A-260 version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-260" />
- <info name="programmer" value="Sue Gabrys, Shari Glenn, Scott Jensen, and Kevin Neff" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Kevin Neff" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-14-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a260 conquering math worksheet generator v1.0 (4am crack).dsk" size="143360" crc="8b30dec5" sha1="6a1f14e80d868165d99c808181b58bef2f24cf49"/>
@@ -43248,17 +24865,25 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscperc10" cloneof="cmscperc">
+ <software name="cmscperc10_525" cloneof="cmscperc_525">
<description>Conquering Math Series: Conquering Percents (A-210 version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-210" />
- <info name="programmer" value="Sheila Dols, Susan Gabrys, Shari Glenn, Scott Jensen, Charolyn Kapplinger, Pat Korn, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a210 conquering percents v1.0 (4am crack).dsk" size="143360" crc="c9df4baf" sha1="32d6d2d1cade5f29cccdce3af1c735949a5c5eec"/>
@@ -43266,17 +24891,25 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscperc">
+ <software name="cmscperc_525">
<description>Conquering Math Series: Conquering Percents (A-210 version 1.1) (4am crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-210" />
- <info name="programmer" value="Sheila Dols, Susan Gabrys, Shari Glenn, Scott Jensen, Charolyn Kapplinger, Pat Korn, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a210 conquering percents v1.1 (4am crack).dsk" size="143360" crc="f56e85a3" sha1="82d04e3155661533722086dc874a558c3aa44577"/>
@@ -43289,12 +24922,19 @@ license:CC0-1.0
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-209" />
- <info name="programmer" value="Sheila Dols, Shari Glenn, Scott Jensen, Charolyn Kapplinger, Sherry Leudloff, Diane Lin, Jane Peterson, and Craig Solomonson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Leudloff" />
+ <info name="programmer" value="Diane Lin" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a209 conquering ratios and proportions v1.0 (4am crack).dsk" size="143360" crc="1cafe757" sha1="3c55eb8c8947113bc2fc60d58ec854f7010050d3"/>
@@ -43302,7 +24942,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscwholn10" cloneof="cmscwholn">
+ <software name="cmscwholn10" cloneof="cmscwholn_525">
<description>Conquering Math Series: Conquering Whole Numbers (A-201 version 1.0) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43311,8 +24951,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a201 conquering whole numbers v1.0 (4am crack).dsk" size="143360" crc="6c5389e1" sha1="6b2a1d95ebaab8b4415777c3e9413c63b6895251"/>
@@ -43320,7 +24960,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscwholn">
+ <software name="cmscwholn_525">
<description>Conquering Math Series: Conquering Whole Numbers (A-201 version 1.1) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43329,8 +24969,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a201 conquering whole numbers v1.1 (4am crack).dsk" size="143360" crc="80855ab5" sha1="d161a71e5d93120d49fc7ca11b56c03478fda6e4"/>
@@ -43338,17 +24978,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsdecconc">
+ <software name="cmsdecconc_525">
<description>Conquering Math Series: Decimal Concepts (A-206 version 1.0) (4am crack)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-206" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a206 decimal concepts v1.0 (4am crack).dsk" size="143360" crc="115a31be" sha1="98cf730c4f7ab5d1126ded4bd5d4924462490719"/>
@@ -43356,7 +25003,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrconci10" cloneof="cmsfrconci">
+ <software name="cmsfrconci10" cloneof="cmsfrconci_525">
<description>Conquering Math Series: Fraction Concepts, Inc. (A-202 version 1.0) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43365,8 +25012,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a202 fraction concepts, inc. v1.0 (4am crack).dsk" size="143360" crc="e3748d43" sha1="c75c33d534c8f473a4d386b80c7a72e9039bba9d"/>
@@ -43374,7 +25021,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrconci11" cloneof="cmsfrconci">
+ <software name="cmsfrconci11" cloneof="cmsfrconci_525">
<description>Conquering Math Series: Fraction Concepts, Inc. (A-202 version 1.1) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43383,8 +25030,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-10-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a202 fraction concepts, inc. v1.1 (4am crack).dsk" size="143360" crc="32324fec" sha1="61f3a6c8d55a56aaf4ba8186cad8ac56b749c4e6" />
@@ -43392,7 +25039,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrconci">
+ <software name="cmsfrconci_525">
<description>Conquering Math Series: Fraction Concepts, Inc. (A-202 version 1.2) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43401,8 +25048,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a202 fraction concepts inc. v1.2 (4am crack).dsk" size="143360" crc="76c2a51c" sha1="df7315d2f599144ff29961b7de304e459b29c536"/>
@@ -43410,7 +25057,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrpracun10" cloneof="cmsfrpracun">
+ <software name="cmsfrpracun10" cloneof="cmsfrpracun_525">
<description>Conquering Math Series: Fraction Practice Unlimited (A-203 version 1.0) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43419,8 +25066,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a203 fraction practice unlimited v1.0 (4am crack).dsk" size="143360" crc="7be3f9b2" sha1="e0eac67a6fde37dc74a9ecf53f8f8565966c9ba4"/>
@@ -43428,7 +25075,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrpracun11" cloneof="cmsfrpracun">
+ <software name="cmsfrpracun11" cloneof="cmsfrpracun_525">
<description>Conquering Math Series: Fraction Practice Unlimited (A-203 version 1.1) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43437,8 +25084,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-04-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a203 fraction practice unlimited v1.1 (4am crack).dsk" size="143360" crc="42f712da" sha1="3c16468095aa4448e0447a816ee194cf54eb04a0"/>
@@ -43446,7 +25093,7 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrpracun">
+ <software name="cmsfrpracun_525">
<description>Conquering Math Series: Fraction Practice Unlimited (A-203 version 1.2) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43455,8 +25102,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-10 Redumped: 2017-11-12-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-10 Redumped: 2017-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a203 fraction practice unlimited v1.2 (4am crack).dsk" size="143360" crc="3697eb86" sha1="ae2a277e0cc24f3c1aae0e08b294c018bc25f0e2" />
@@ -43468,12 +25115,17 @@ license:CC0-1.0
<description>Construct-A-Word II (4am crack)</description>
<year>1984</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
- <info name="programmer" value=" Isabell L. Beck, Steven F. Roth, Ray McKnight, Frank Yeager, Sherman Tyler, and Joseph Smith" />
+ <info name="programmer" value="Isabell L. Beck" />
+ <info name="programmer" value="Steven F. Roth" />
+ <info name="programmer" value="Ray McKnight" />
+ <info name="programmer" value="Frank Yeager" />
+ <info name="programmer" value="Sherman Tyler" />
+ <info name="programmer" value="Joseph Smith" />
<info name="usage" value="Requires an Apple ][+ or later with an Echo or compatible speech card." />
- <!--Fails on boot with a "DEVICE FAULT" message if you do not have a compatible add-on card.-->
+ <!-- Fails on boot with a "DEVICE FAULT" message if you do not have a compatible add-on card. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-01-08-->
- <!--educational program-->
+ <!-- Dump released: 2020-01-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Level 1"/>
<dataarea name="flop" size="143360">
@@ -43543,8 +25195,8 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="continents and countries (4am crack).dsk" size="143360" crc="7000ed18" sha1="f05e7582cabb7e76aafbd46c18515302502e78f9" />
@@ -43558,8 +25210,8 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-11-->
- <!--educational program-->
+ <!-- Dump released: 2017-01-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="contraction concentration (4am crack).dsk" size="143360" crc="5fc84962" sha1="15ca40db27c81ad61259cdcb236adf887ef8c9be" />
@@ -43567,7 +25219,7 @@ license:CC0-1.0
</part>
</software>
- <software name="coordmath10" cloneof="coordmath">
+ <software name="coordmath10" cloneof="coordmath_525">
<description>Coordinate Math (A-192 version 1.0) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43576,8 +25228,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-03-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a192 coordinate math v1.0 (4am crack).dsk" size="143360" crc="ab3c16b4" sha1="7850ae1577349eebed6e4df60983aa9ed405eb98"/>
@@ -43585,7 +25237,7 @@ license:CC0-1.0
</part>
</software>
- <software name="coordmath">
+ <software name="coordmath_525">
<description>Coordinate Math (A-192 version 1.1) (4am crack)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -43594,8 +25246,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-03-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a192 coordinate math v1.1 (4am crack).dsk" size="143360" crc="59a4788e" sha1="96d11c63f4cf339a745d9db2a34a431154d65656"/>
@@ -43611,15 +25263,48 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-12-->
- <!--disk utility program-->
- <part name="flop2" interface="floppy_5_25">
+ <!-- Dump released: 2023-12-12 -->
+ <!-- disk utility program -->
+ <part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="copy ii plus v1.0 (4am crack).dsk" size="143360" crc="789dac4d" sha1="2512841d53abec4aeba504360f9c82a47efe051c" />
</dataarea>
</part>
</software>
+ <software name="coscombath" cloneof="coscombat">
+ <description>Cosmic Combat (Highlands Computer Services) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Highlands Computer Services</publisher>
+ <info name="developer" value="Highlands Computer Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-01 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cosmic combat (4am crack).dsk" size="143360" crc="aefa46a5" sha1="65fb92082ea477ee1f5288448fcd62dd45f8510e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="coscombat">
+ <description>Cosmic Combat (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Highlands Computer Services" />
+ <info name="original_publisher" value="Highlands Computer Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cosmic combat (softsmith) (4am and san inc crack).dsk" size="143360" crc="977ec4f7" sha1="a20fa81d6d5948bbc72a6956414216257f065b79"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="cottales87" cloneof="cottales">
<description>Cotton Tales (version 1987) (4am crack)</description>
<year>1987</year>
@@ -43628,8 +25313,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cotton tales (4am crack).dsk" size="143360" crc="aa458c5c" sha1="7061eaaf95e5cb0d80916ad9c1393769ed5b2dc3" />
@@ -43639,14 +25324,14 @@ license:CC0-1.0
<software name="cottales">
<description>Cotton Tales (version 1990) (4am crack)</description>
- <year>1987</year>
+ <year>1990</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1990" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cotton tales 1990 (4am crack).dsk" size="143360" crc="acdcad52" sha1="87ca5417e38b5cfa075a7a87145e011c4fce7f2f" />
@@ -43661,8 +25346,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-10-->
- <!--educational game-->
+ <!-- Dump released: 2022-07-10 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -43677,6 +25362,25 @@ license:CC0-1.0
</part>
</software>
+ <software name="cntdsht">
+ <description>Countdown to Shutdown (trex crack)</description>
+ <year>1985</year>
+ <publisher>Activision</publisher>
+ <info name="developer" value="Creative Sparks" />
+ <info name="developer" value="Synergistic Software" />
+ <info name="programmer" value="T.L. Gale" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="countdown to shutdown (1985)(activision)(trex crack).dsk" size="143360" crc="cf4ac129" sha1="ee6843930f3c78c738f3ef4cf1e306ef5897d8af" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cntcoins">
<description>Counting Coins (4am crack)</description>
<year>1989</year>
@@ -43684,8 +25388,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-06-16-->
- <!--educational program-->
+ <!-- Dump released: 2018-06-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="counting coins (4am crack).dsk" size="143360" crc="28a6e2e5" sha1="b24c91eb063825bc292ccc9a6a3e1daccdec02c2" />
@@ -43693,18 +25397,18 @@ license:CC0-1.0
</part>
</software>
- <software name="cntparr0">
+ <software name="cntparad">
<description>Counting Parade (revision 0) (4am crack)</description>
<year>1985</year>
<publisher>Spinnaker Software</publisher>
- <info name="developer" value="Spinnaker Software" />
+ <info name="developer" value="Stepping Stone Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--There is one other known version of this game; it contains differences in several files.-->
- <!--The other version has one additional file named "V" which contains a version number and date. This disk has no "V" file, no version number, and no date, suggesting an earlier release.-->
+ <!-- There is one other known version of this game; it contains differences in several files. -->
+ <!-- The other version has one additional file named "V" which contains a version number and date. This disk has no "V" file, no version number, and no date, suggesting an earlier release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-07-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="counting parade rev. 0 (4am crack).dsk" size="143360" crc="3b128c8e" sha1="3a39a75dd59ec4f138b58d678aefdc16da7343bc"/>
@@ -43717,10 +25421,10 @@ license:CC0-1.0
<year>1987</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Ahead Designs" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-23-->
- <!--graphics program-->
+ <!-- Dump released: 2015-08-23 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -43735,6 +25439,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="crtlsns">
+ <description>Create Your Own Lessons (version 01.31.87) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="01.31.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="create lessons (4am crack).dsk" size="143360" crc="1f31e91d" sha1="fab6f6726e6e7ccae1bd6d97d98cddc0d602a2be" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="crtabase">
<description>Create-A-Base (A-406 version 1.0) (4am crack)</description>
<year>1985</year>
@@ -43744,8 +25464,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-18-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a406 create-a-base v1.0 (4am crack).dsk" size="143360" crc="82b7ac23" sha1="46fe0f00219fe50eacd5a256930c8016bc81e5bc"/>
@@ -43753,6 +25473,183 @@ license:CC0-1.0
</part>
</software>
+ <software name="crtsplt">
+ <description>Create-Spell It (4am crack)</description>
+ <year>1981</year>
+ <publisher>Hartley Software</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="create-spell it (4am crack).dsk" size="143360" crc="a267f38f" sha1="87bb35ac7d03222c1938726a5478a633c1e1bf53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="creation">
+ <description>Creation (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Pelican Software</publisher>
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swason" />
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-04-27 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="creation (4am crack) side a.dsk" size="143360" crc="24686294" sha1="f103a1bb993cfe484baccc0b2fd51d569c5429b8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="creation (4am crack) side b.dsk" size="143360" crc="52b81661" sha1="435881b4f3f75fc7317fbccf10690c653c9cade1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crcontrp">
+ <description>Creative Contraptions (4am crack)</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="developer" value="Looking Glass Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="creative contraptions (4am crack) side a.dsk" size="143360" crc="b27afb0e" sha1="a6eb1b1913fd250def0be381b3362090a6041c12" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="creative contraptions (4am crack) side b.dsk" size="143360" crc="301fe001" sha1="de54cfd682a67b5eb26a438ef1d6d00c3ccaea45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crtunl">
+ <description>Creativity, Unlimited (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Jay Carlson" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="creativity, unlimited (4am crack) disk 1.dsk" size="143360" crc="62885e4f" sha1="58d279591627785dd2a02b94acea32e9fccbcd56" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="creativity, unlimited (4am crack) disk 2.dsk" size="143360" crc="c7f8fa13" sha1="bcb27b7cd326571f8fa8060587cd4fbef128d8ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crchorus1" cloneof="crchorus">
+ <description>Creature Chorus (version 1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1" />
+ <!-- version is not listed on title page, so assume this is version 1. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="creature chorus (4am crack).dsk" size="143360" crc="d7c1dc71" sha1="4afb4a8addd19ddb05b6c082bd8b1762607449b1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crchorus">
+ <description>Creature Chorus (version 4.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="4.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="creature chorus v4.0 (4am crack).dsk" size="143360" crc="86db4bac" sha1="4f511f09dc1f94079fed1eba0902abfce26da333" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crmagic">
+ <description>Creature Magic (4am crack)</description>
+ <year>1994</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="developer" value="Laureate Learning Systems" />
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="creature magic (4am crack).dsk" size="143360" crc="aec69309" sha1="b93ffbd4db04d85689a1240fe6b5157aa27216ea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crventur">
+ <description>Creature Venture (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Highlands Computer Services" />
+ <info name="original_publisher" value="Highland Computer Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="creature venture (softsmith) (4am and san inc crack).dsk" size="143360" crc="7fd8e180" sha1="135dba416a0d32ed1ecd3f790c78843e268db11d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crofnigt">
+ <description>Creatures of the Night (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="creatures of the night (4am crack).dsk" size="143360" crc="433144be" sha1="b110fe624a8d91159b7464f941f3daeac96ecb4a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cribsol">
<description>Cribbage/Solitaire (4am crack)</description>
<year>1982</year>
@@ -43760,8 +25657,8 @@ license:CC0-1.0
<info name="programmer" value="Art Carpet" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-14-->
- <!--action game-->
+ <!-- Dump released: 2023-01-14 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cribbage-solitaire (4am crack).dsk" size="143360" crc="36c5a597" sha1="d9368998f793c8a50d6b7a83acd6f74cd803b3cf" />
@@ -43769,16 +25666,84 @@ license:CC0-1.0
</part>
</software>
+ <software name="crmstopr">
+ <description>Crime Stopper (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="author" value="Barry Marx" />
+ <info name="programmer" value="Dan Kitchen" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crime stopper (4am crack).dsk" size="143360" crc="045b7082" sha1="d0a76363471a6d4f721f8e6506c6b32af2f74e25" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crmwave">
+ <description>Crime Wave (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Scott Schram" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-15 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crime wave (4am crack).dsk" size="143360" crc="c0bc686d" sha1="0cdf8482c26ee748127cce617c6b903c523c1dd3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crismntn">
+ <description>Crisis Mountain (Synergistic Software) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="David H. Schroeder" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crisis mountain (1982)(synergistic software)(4am crack).dsk" size="143360" crc="f43e80de" sha1="1bbdbe1a89ea35dce064406b79cee8cb10da81a4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ccrallye">
+ <description>Cross Country Rallye (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Continental Software" />
+ <info name="programmer" value="Bob Carter" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cross country rallye (softsmith) (4am and san inc crack).dsk" size="143360" crc="eaefd387" sha1="129ce296dc6b6d4c57518d71f538a36f7a4837aa"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="crscalir1">
<description>Crosscountry California (revision 1, 1987) (4am crack)</description>
<year>1987</year>
<publisher>Didatech Software</publisher>
- <info name="programmer" value="Darcy Allen and Dave Vincent" />
+ <info name="programmer" value="Darcy Allen" />
+ <info name="programmer" value="Dave Vincent" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="revision 1, 1987" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-06-09-->
- <!--educational program-->
+ <!-- Dump released: 2015-06-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -43800,10 +25765,10 @@ license:CC0-1.0
<info name="programmer" value="Dave Vincent" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1, 1986" />
- <!--different disk contents than version 4.0-->
+ <!-- different disk contents than version 4.0 -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -43826,8 +25791,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="version 4.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -43850,8 +25815,8 @@ license:CC0-1.0
<info name="usage" value="RRequires a 48K Apple ][+ or later." />
<info name="version" value="4.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -43874,8 +25839,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -43890,6 +25855,39 @@ license:CC0-1.0
</part>
</software>
+ <software name="crosfire">
+ <description>Crossfire (4am crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Jay Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crossfire (4am crack).dsk" size="143360" crc="e29b77bf" sha1="4973418f446ddbc224650681acc802990557f2f6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crwnarth">
+ <description>Crown of Arthain (4am crack)</description>
+ <year>1980</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Dan Meller" />
+ <info name="programmer" value="Marylin Meller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crown of arthain (4am crack).dsk" size="143360" crc="7e0723ca" sha1="375ec42326da5ef055a2bd7c59ddbdf1f3cb2b10" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="crzwords">
<description>Crozzzwords (4am crack)</description>
<year>1987</year>
@@ -43897,8 +25895,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-20-->
- <!--educational game-->
+ <!-- Dump released: 2017-11-20 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crozzzwords (4am crack).dsk" size="143360" crc="591cf1b1" sha1="0356a306c84375cb2593ebac3acfb1967ad688be" />
@@ -43906,16 +25904,19 @@ license:CC0-1.0
</part>
</software>
- <software name="cruseuropv1" cloneof="cruseurop">
+ <software name="cruseuropv1" cloneof="cruseuropv2">
<description>Crusade in Europe (version 1) (4am and san inc crack)</description>
<year>1985</year>
<publisher>Microprose Software</publisher>
- <info name="programmer" value="Sid Meier, Ed Bever, and Jim Synoski" />
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1" />
+ <!-- No 128K double hi-res graphics option. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-06-->
- <!--simulation game-->
+ <!-- Dump released: 2017-08-06 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crusade in europe 64k (4am and san inc crack).dsk" size="143360" crc="6a9d1ff0" sha1="0de70a7f7eca1d25203ba2e32007b24eb76491e2" />
@@ -43923,17 +25924,19 @@ license:CC0-1.0
</part>
</software>
- <software name="cruseurop">
+ <software name="cruseuropv2">
<description>Crusade in Europe (version 2) (4am and san inc crack)</description>
<year>1985</year>
<publisher>Microprose Software</publisher>
- <info name="programmer" value="Sid Meier, Ed Bever, and Jim Synoski" />
- <info name="usage" value="Requires a 128K Apple ][+ or later." />
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
<info name="version" value="2" />
- <!--Option to use double hi-res graphics on 128K machines.-->
+ <!-- Option to use double hi-res graphics on 128K machines. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-10-->
- <!--simulation game-->
+ <!-- Dump released: 2017-08-10 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -43948,17 +25951,59 @@ license:CC0-1.0
</part>
</software>
- <software name="cryptqst">
+ <software name="ccchomp62281" cloneof="ccchomp">
+ <description>Crush, Crumble and Chomp!: The Movie Monster Game (version 1981-JUN-22) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Jim Connelley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1981-JUN-22" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-17 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crush crumble and chomp (4am crack).dsk" size="143360" crc="847d6fac" sha1="247d8154186c7a60e2df3f72972eb03023c7b4fe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ccchomp">
+ <description>Crush, Crumble and Chomp!: The Movie Monster Game (version 1981-DEC-08) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Jim Connelley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1981-DEC-08" />
+ <!-- found a later copywrite of 1981-DEC-08 inside CNCCMAIN -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="crush, crumble and chomp 1981-12-08 (4am and san inc crack).dsk" size="143360" crc="d39ad177" sha1="21b9d99e8bbbe459ba5b60ecbb7baad65bb84591"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cryptqst_525">
<description>CryptoQuest (A-340 version 1.0) (4am crack)</description>
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-340" />
- <info name="programmer" value="Mark Durkin, Rod Haenke, Ruth Kivisto, and Mike Tschimperle" />
+ <info name="programmer" value="Mark Durkin" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Mike Tschimperle" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a340 cryptoquest v1.0 (4am crack).dsk" size="143360" crc="e1e0ee4c" sha1="8a1208de5738887117d7fdbad10cd901a3ed2593"/>
@@ -43970,14 +26015,14 @@ license:CC0-1.0
<description>Crystal Caverns (revision 0) (4am crack)</description>
<year>1982</year>
<publisher>Hayden Book Company</publisher>
- <info name="developer" value="Imaginative Systems" />
+ <info name="developer" value="Imaginative Systems Software" />
<info name="programmer" value="Daniel Kitchen" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This early version was originally distributed on a 13-sector disk.-->
+ <!-- This early version was originally distributed on a 13-sector disk. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-07-->
- <!--adventure game-->
+ <!-- Dump released: 2023-09-07 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crystal caverns rev. 0 (4am crack).dsk" size="143360" crc="42aa1d8d" sha1="872c4f86be550bb5a9193e52c5136bcff9fccef5" />
@@ -43989,13 +26034,13 @@ license:CC0-1.0
<description>Crystal Caverns (revision 1) (4am crack)</description>
<year>1982</year>
<publisher>Hayden Book Company</publisher>
- <info name="developer" value="Imaginative Systems" />
+ <info name="developer" value="Imaginative Systems Software" />
<info name="programmer" value="Daniel Kitchen" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-06-->
- <!--adventure game-->
+ <!-- Dump released: 2018-10-06 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crystal caverns (4am crack).dsk" size="143360" crc="b54e2a57" sha1="a693d7cdf0e3fd6429c7deffcdb9bdeb02712f86" />
@@ -44010,8 +26055,8 @@ license:CC0-1.0
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-04-02-->
- <!--educational program-->
+ <!-- Dump released: 2014-04-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -44033,8 +26078,8 @@ license:CC0-1.0
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-01-14-->
- <!--educational program-->
+ <!-- Dump released: 2015-01-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -44050,14 +26095,14 @@ license:CC0-1.0
</software>
<software name="cglibrary">
- <description>Curious George Visits The Library (4am crack)</description>
+ <description>Curious George Visits the Library (4am crack)</description>
<year>1989</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-23-->
- <!--educational program-->
+ <!-- Dump released: 2015-09-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -44072,16 +26117,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="cutnpste">
+ <description>Cut &amp; Paste Word Processor (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-07 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cut and paste (4am and san inc crack) disk 1 - program.dsk" size="143360" crc="28bdee63" sha1="547dc7c1115e336b3efcbf245048a2e681dc28ed" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Sample documents"/>
+ <dataarea name="flop" size="143360">
+ <rom name="cut and paste (4am and san inc crack) disk 2 - sample documents.dsk" size="143360" crc="7c90015a" sha1="c6575f00d84eb9c1517f58ac845fa03e80203917" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cyborg1" cloneof="cyborg">
- <description>Cyborg (version 1) (4am crack)</description>
+ <description>Cyborg (version 1) (Sentient Software) (4am crack)</description>
<year>1982</year>
<publisher>Sentient Software</publisher>
<info name="programmer" value="Michael Berlyn" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--adventure game-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cyborg v1 (4am crack).dsk" size="143360" crc="f2f365b5" sha1="4e4231abce64583cc44eacb43c527d2df027d041" />
@@ -44090,15 +26157,15 @@ license:CC0-1.0
</software>
<software name="cyborg2" cloneof="cyborg">
- <description>Cyborg (version 2) (4am crack)</description>
+ <description>Cyborg (version 2) (Sentient Software) (4am crack)</description>
<year>1981</year>
<publisher>Sentient Software</publisher>
<info name="programmer" value="Michael Berlyn" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-03-->
- <!--adventure game-->
+ <!-- Dump released: 2020-03-03 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cyborg v2 (4am crack).dsk" size="143360" crc="8521d84b" sha1="7030a8ce8b0bc42504e6cea68e8345bf3f7265ac"/>
@@ -44107,17 +26174,17 @@ license:CC0-1.0
</software>
<software name="cyborg">
- <description>Cyborg (Softsmith) (4am crack)</description>
+ <description>Cyborg (version 1) (Softsmith) (4am crack)</description>
<year>1983</year>
<publisher>Softsmith</publisher>
<info name="developer" value="Sentient Software" />
<info name="original_publisher" value="Sentient Software"/>
<info name="programmer" value="Michael Berlyn" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
- <!--1983 re-release by Softsmith.-->
+ <!-- 1983 re-release by Softsmith. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-09-->
- <!--adventure game-->
+ <!-- Dump released: 2022-06-09 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cyborg (softsmith) (4am crack).dsk" size="143360" crc="56e9da76" sha1="97356be1d74d7ebf525b57e671537b2ea496c4d4"/>
@@ -44125,6 +26192,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="cytrmast">
+ <description>Cytron Masters (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Dan Bunten" />
+ <info name="usage" value="Requires a 48K Apple ][+ or unenhanced Apple //e." />
+ <sharedfeat name="compatibility" value="A2P,A2E" />
+ <!-- Due to compatibility issues unrelated to copy protection, it only runs on an Apple ][+ or unenhanced Apple //e. -->
+ <!-- Dump released: 2021-04-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cytron masters (4am and san inc crack).dsk" size="143360" crc="60a49b83" sha1="fbd8a8d6672c0228e10fea064aa64958d55bc90b"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dancdino">
<description>Dancing Dinos (4am crack)</description>
<year>1993</year>
@@ -44132,8 +26216,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dancing dinos (4am crack).dsk" size="143360" crc="473be96d" sha1="1460ff336e5e0198944e15ea0d094acb48ddaa1e" />
@@ -44141,6 +26225,24 @@ license:CC0-1.0
</part>
</software>
+ <software name="datahand">
+ <description>Data Handler (A-129 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-129" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a129 data handler v1.0 (4am crack).dsk" size="143360" crc="1b9af318" sha1="1dc867f65473b316722abd9d5fdefd61b0f07cbd"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dqcarmndalm">
<description>Dataquest: Carmen's North Dakota Almanac Database (version 1.0) (4am crack)</description>
<year>1989</year>
@@ -44149,11 +26251,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-11-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-11 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="carmen's north dakota almanac database (4am crack).dsk" size="143360" crc="20248891" sha1="579eb26ce965ed79ebd47ff6262c82a3ad93cf82"/>
@@ -44169,11 +26271,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-20-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-20 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="governors and first ladies of north dakota (4am crack).dsk" size="143360" crc="29c548b7" sha1="6d12533696ccf49e17c99921b2ec58c429dcb592"/>
@@ -44189,11 +26291,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="minerals of north dakota (4am crack).dsk" size="143360" crc="d62e156e" sha1="239bb06cb1e088d2d35d47260aa6f0736656ca8e"/>
@@ -44209,11 +26311,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-20-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-20 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota agriculture (4am crack).dsk" size="143360" crc="3d6e4023" sha1="880a5232ce130ee7199f4168c8657e0b04ed9884"/>
@@ -44229,11 +26331,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-21-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-21 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota cities with population under 500 (4am crack).dsk" size="143360" crc="1986d96c" sha1="6162436dac03758b35d6e7b61da619afd799f5cd"/>
@@ -44249,11 +26351,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-21-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-21 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota cities with population 500 and above (4am crack).dsk" size="143360" crc="186b2e5e" sha1="26ccb43cc26effa373063ab2ed7ec9f19e572a2a"/>
@@ -44269,11 +26371,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-21-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-21 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota counties (4am crack).dsk" size="143360" crc="e1b6370b" sha1="4e44496ffb32564dbe50a91da88d44f4975cbc23"/>
@@ -44289,11 +26391,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-21-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-21 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota explorers (4am crack).dsk" size="143360" crc="8fab16d9" sha1="9f1d0da2ae81925843d2b670c5c549d009d69525"/>
@@ -44309,11 +26411,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-21-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-21 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota indian tribes (4am crack).dsk" size="143360" crc="f4b7d0ca" sha1="86239cacfe478db1e71527ad351e09fc13e1327b"/>
@@ -44329,11 +26431,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota parks and historical sites (4am crack).dsk" size="143360" crc="1be8abde" sha1="fd4df9a60c3fd7bcc1425c56a321dad23cfce47d"/>
@@ -44349,11 +26451,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota plants (4am crack).dsk" size="143360" crc="8d2dd87b" sha1="de9512d06ed1312e5fb78cd223d65989b1a25c85"/>
@@ -44369,11 +26471,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota pride (4am crack).dsk" size="143360" crc="71d7071e" sha1="ac7d7d584af4280b8d8d354f1362a42974c71efa"/>
@@ -44389,11 +26491,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota symbols (4am crack).dsk" size="143360" crc="d330ff70" sha1="e9c92bdb500e2c27e30b7a77d4ebab0b958398f0"/>
@@ -44409,11 +26511,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota u.s. senators and representatives (4am crack).dsk" size="143360" crc="990ca91d" sha1="6cf57c50159fc7cf90981f68e69e6c469411816f"/>
@@ -44429,11 +26531,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="north dakota wildlife (4am crack).dsk" size="143360" crc="68ee645d" sha1="c961bd1abff360b5d9c677766c9f6746b313502b"/>
@@ -44449,11 +26551,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-22-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="notable people of north dakota (4am crack).dsk" size="143360" crc="b9067082" sha1="aded144536c675b7477f68b516d1c022387f338f"/>
@@ -44461,20 +26563,77 @@ license:CC0-1.0
</part>
</software>
- <software name="dqsample">
- <description>Dataquest: Sampler (A-173 version 1.0) (4as crack)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="developer" value="MECC" />
- <info name="partno" value="A-173" />
+ <software name="deathcrb">
+ <description>Death in the Caribbean (4am crack)</description>
+ <year>1983</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Philip Hess" />
+ <info name="programmer" value="Bos Hess" />
+ <info name="programmer" value="Barbara P. Lawrence" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="death in the caribbean (4am crack) side a.dsk" size="143360" crc="af85d089" sha1="35363c2cfe65816b75a7e3cdf399575947946822" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="death in the caribbean (4am crack) side b.dsk" size="143360" crc="3db3229e" sha1="a8696b41a0c5a1e332cd0d4274740635fc71519a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deathswd">
+ <description>Death Sword (4am crack)</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Designer Software" />
<info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-30-->
- <!--educational program-->
+ <!-- Dump released: 2014-05-23 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="mecc-a173 dataquest sampler v1.0 (4am crack).dsk" size="143360" crc="2dc20258" sha1="5e16478c96680d7f27c45c30d622ed9e01623024" />
+ <rom name="deathsword (4am crack).dsk" size="143360" crc="a728ed2b" sha1="6b8eb1a4658a38cb95f10f627d34e7d03c843550" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="decpwrdp">
+ <description>Decimal and Percent Word Problems (4am crack)</description>
+ <year>1984</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="alt_title" value="MicroTutor II: Mosaic" />
+ <!-- Title screen -->
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="percent word problems (4am crack).dsk" size="143360" crc="995add9f" sha1="3654265ae9f7d7335ceae0e99e429d4b0de61d90" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="defender">
+ <description>Defender (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="programmer" value="Bill Bogenreif" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-27 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="defender (atari) (4am crack).dsk" size="143360" crc="eb9aec1b" sha1="0c5298ab6459bb966c7147157206c660fd8b6a7e" />
</dataarea>
</part>
</software>
@@ -44487,8 +26646,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-18-->
- <!--graphics program-->
+ <!-- Dump released: 2014-08-18 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="delta drawing (4am crack).dsk" size="143360" crc="4af3c468" sha1="0f9b32bcade9aaac27c6a2f797e4b6e3b7f8f4c2" />
@@ -44504,8 +26663,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="3.33" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-11-25-->
- <!--graphics program-->
+ <!-- Dump released: 2015-11-25 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="delta drawing 3.33 (4am crack).dsk" size="143360" crc="38cf358d" sha1="968ceaa46903f90111c4dd1026e58a2da3df44b9" />
@@ -44520,10 +26679,10 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--Uses uppercase text.-->
+ <!-- Uses uppercase text. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="desktop zoo (4am crack).dsk" size="143360" crc="369c223c" sha1="a3373b95967dbdc59be845cf3f965f52148e1a89"/>
@@ -44537,11 +26696,11 @@ license:CC0-1.0
<publisher>Micrograms Publishing</publisher>
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires an Apple //e or later." />
- <!--Requires an Apple //e or later due to use of unconditional lowercase text.-->
+ <!-- Requires an Apple //e or later due to use of unconditional lowercase text. -->
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="desktop zoo rev. 2 (4am crack).dsk" size="143360" crc="6aa48adc" sha1="57930a6f5d55b3cb3fe70068196ddfd07341844c" />
@@ -44556,8 +26715,8 @@ license:CC0-1.0
<info name="programmer" value="Jeff Pierce" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-24-->
- <!--adventure game-->
+ <!-- Dump released: 2022-09-24 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -44572,16 +26731,50 @@ license:CC0-1.0
</part>
</software>
+ <software name="destryr">
+ <description>Destroyer (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-25 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="destroyer (4am crack).dsk" size="143360" crc="b1822286" sha1="09e405feb27cfc121b98abae0ca578a35bc37c04" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deugddd">
+ <description>Deutsche Grammatik: der-die-das (4am crack)</description>
+ <year>1983</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Frank Del Favero" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="deutsche grammatik (4am crack).dsk" size="143360" crc="2d396899" sha1="7199dcb8e67c905ec49af7a4aa3940a37ff2fed0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="deuakt1">
<description>Deutsch: Aktuell 1 (second edition) (4am crack)</description>
<year>1985</year>
<publisher>EMC Corporation</publisher>
- <info name="programmer" value="James F. Funston and David F. Myers" />
+ <info name="programmer" value="James F. Funston" />
+ <info name="programmer" value="David F. Myers" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="second edition" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-05-20-->
- <!--educational program-->
+ <!-- Dump released: 2020-05-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -44651,8 +26844,8 @@ license:CC0-1.0
<info name="developer" value="Intellectual Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -44673,15 +26866,170 @@ license:CC0-1.0
</part>
</software>
+ <software name="dtvocab">
+ <description>Diagnostic Tests: Vocabulary (version 01.17.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.17.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="diagnostic tests- vocabulary v01.17.89 (4am crack).dsk" size="143360" crc="4d6e6234" sha1="d4e449543466dae75ef53ba1fb5e3576ad9c051c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="discover">
+ <description>Discover: A Science Experiment (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Ed Herstein" />
+ <info name="programmer" value="Andry Christian" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="discover (4am crack).dsk" size="143360" crc="97748a98" sha1="bec47f45e9a31f0f2ac16bc1b40587264f948417" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="divebmbr">
+ <description>Dive Bomber (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Distinctive Software" />
+ <info name="programmer" value="Allan Johanson" />
+ <info name="programmer" value="Tris Orendorff" />
+ <info name="programmer" value="Phil Kelly" />
+ <info name="programmer" value="John Boechler" />
+ <info name="programmer" value="Michael Bate" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dive bomber (4am crack).dsk" size="143360" crc="fc854511" sha1="a99c822380d41ddfde8d35b290d47aa241528b44" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="divdecim">
+ <description>Dividing Decimals (version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="programmer" value="Andrew Krainin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dividing decimals v1.1 (4am crack).dsk" size="143360" crc="0c8442b6" sha1="d3a9e45e956f4eade3c52baee721c92574782524"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="divfract">
+ <description>Dividing Fractions (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dividing fractions (4am crack).dsk" size="143360" crc="b6676369" sha1="89d4c43db5a8f29d1c16ca931ae19853b31382e4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="digduga" cloneof="digdug">
+ <description>Dig Dug (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-07 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dig dug (4am crack).dsk" size="143360" crc="99539f27" sha1="83bf4ae29434cc2da72f8aba34bdff8bdcdfbe92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="digdugt" cloneof="digdug">
+ <description>Dig Dug (Thunder Mountain) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-05 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dig dug (thunder mountain) (4am crack).dsk" size="143360" crc="c3222178" sha1="959cfb565cff98eebea13de5c8ac6342d9ce04b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="digdug">
+ <description>Dig Dug (Datasoft) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Datasoft</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-15 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dig dug (datasoft) (4am crack).dsk" size="143360" crc="28dc7f9b" sha1="2c81ade8250936b7a4751958328c93bf8f3323c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dindisk">
+ <description>Dinner on a Disk (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Homemaker Software" />
+ <info name="programmer" value="Henny Hall" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dinner on a disk (softsmith) (4am and san inc crack).dsk" size="143360" crc="ec222a42" sha1="b1ea957c94a7b6b6b0c14e75b98f80f56e2d6b10"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dinodigds">
<description>Dino Dig: Dictionary Skills (4am crack)</description>
<year>1992</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi, Alison Bennett, Diane Ashachik, and Gregory Truex" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="programmer" value="Gregory Truex" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--educational program-->
- <!--Dump released: 2015-02-01 Redumped: 2015-12-22-->
+ <!-- educational program -->
+ <!-- Dump released: 2015-02-01 Redumped: 2015-12-22 -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dino dig (4am crack).dsk" size="143360" crc="1d35a3de" sha1="f15d71bc28803b6a1cd02b518b9d44f2ef8f88e8" />
@@ -44689,6 +27037,110 @@ license:CC0-1.0
</part>
</software>
+ <software name="dinoeggs">
+ <description>Dino Eggs (4am crack)</description>
+ <year>1983</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="David H. Schroeder" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-03-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dino eggs (4am crack).dsk" size="143360" crc="f5778567" sha1="a85a4a7997ba99c4fe1abae3b1e9480830ebedf9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinosplb">
+ <description>Dino Speller: Beginning Dictionary Skills (4am crack)</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dino spell (4am crack).dsk" size="143360" crc="e3c34a5b" sha1="8d79015abfb90f48fc8f3e64608c22251b30d3f2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinoday">
+ <description>Dinosaur Days (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-27 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days (4am crack) disk 1a.dsk" size="143360" crc="05ef2a8f" sha1="e74b858e4fdf571ff7e0b5a852ad45d8320f6b50" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days (4am crack) disk 1b.dsk" size="143360" crc="8884a001" sha1="7ba45d752f982d35bb7e0b352356d68fef0a58c5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days (4am crack) disk 2a.dsk" size="143360" crc="76806f96" sha1="9480680338c180066d45a029a1305f3489320b70" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days (4am crack) disk 2b.dsk" size="143360" crc="f852ff6b" sha1="5e7ff2df1615d736c7e94a4c3f5403112ec7d5a0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinodayp">
+ <description>Dinosaur Days Plus (4am crack)</description>
+ <year>1989</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-01 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days plus (4am crack) disk 1a - program.dsk" size="143360" crc="9c1f7a33" sha1="1db7919a4bc7faad7f4eee2d23b6cd06b0c87bb0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Artwork"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days plus (4am crack) disk 1b - artwork.dsk" size="143360" crc="ce3f5c47" sha1="15328506f5ef39cc1abb39bcb0afa2593556d311" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Learning disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days plus (4am crack) disk 2a - learning disk.dsk" size="143360" crc="33d43d67" sha1="76c0592075087b824191e4d9c98923f8dbf526d1" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Learning disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur days plus (4am crack) disk 2b - learning disk.dsk" size="143360" crc="153b4ea8" sha1="e6116d613bb0aed1491c6df9c0bdf34231ea42f2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dinosdig">
<description>Dinosaur Dig (4am crack)</description>
<year>1984</year>
@@ -44696,8 +27148,8 @@ license:CC0-1.0
<info name="developer" value="NeoSoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -44712,18 +27164,35 @@ license:CC0-1.0
</part>
</software>
+ <software name="dinolnch">
+ <description>Dinosaur's Lunch (4am crack)</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Brenna Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dinosaur's lunch (4am crack).dsk" size="143360" crc="87f9d6c6" sha1="426ef821a5448d9ce8955195cf7c46efaa5736af"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dinosarsr1" cloneof="dinosars">
<description>Dinosaurs (release 1) (4am crack)</description>
- <!--4am calls this version 1.0, but no version exists anywhere.-->
+ <!-- 4am calls this version 1.0, but no version exists anywhere. -->
<year>1984</year>
<publisher>Advanced Ideas</publisher>
<info name="programmer" value="Julie Harris" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="release 1" />
- <!--Compared to Dinosaurs release 2, this uses an earlier and less sophisticated copy protection, suggesting an earlier release.-->
+ <!-- Compared to Dinosaurs release 2, this uses an earlier and less sophisticated copy protection, suggesting an earlier release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-07-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dinosaurs v1.0 (4am crack).dsk" size="143360" crc="599ba342" sha1="6772573925ca6355e9afc35a740085049d06c65b" />
@@ -44738,10 +27207,10 @@ license:CC0-1.0
<info name="programmer" value="Julie Harris" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="release 2" />
- <!--Compared to Dinosaurs release 1, this uses more advanced copy protection, suggesting a later release.-->
+ <!-- Compared to Dinosaurs release 1, this uses more advanced copy protection, suggesting a later release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-05-27-->
- <!--educational program-->
+ <!-- Dump released: 2014-05-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dinosaurs (4am crack).dsk" size="143360" crc="d74a3bfb" sha1="2d0bf2d2f23a055d82dcaf704f5af425c81b43dc" />
@@ -44749,6 +27218,129 @@ license:CC0-1.0
</part>
</software>
+ <software name="disclab">
+ <description>Discovery Lab (A-128 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-128" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a128 discovery lab v1.0 (4am crack).dsk" size="143360" crc="f9478038" sha1="a72c97834e8e978de439702551c7767c5065234c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dskdrctr">
+ <description>Disk Director (Softsmith) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Sensible Software" />
+ <info name="original_publisher" value="Sensible Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-03 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="disk director (softsmith) (4am and san inc crack).dsk" size="143360" crc="a8722aba" sha1="cad9258dd20090f3d463aaa0f2dfd5fdad6c180c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dwrdbird">
+ <description>Diskovery Word Bird (4am crack)</description>
+ <year>1983</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Jill Golick-Engels" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="diskovery word bird (4am crack).dsk" size="143360" crc="ec6d61d0" sha1="b3e57d81f4a0bced5be67ad8930cbff6cddf511a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dismgraph11" cloneof="dismgraph">
+ <description>Displaying Information Series: MECC Graph (A-137 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-137" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a137 mecc graph v1.1 (4am crack).dsk" size="143360" crc="f173770c" sha1="faa4cda7a04e4054c11dd4f17a1f12028cc904a9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dismgraph">
+ <description>Displaying Information Series: MECC Graph (A-137 version 1.3) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-137" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a137 mecc graph v1.3 (4am crack).dsk" size="143360" crc="90687067" sha1="a71f3756d50d1639fc71303531e339b22e8faa41" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dismgraphp10" cloneof="dismgraphp">
+ <description>Displaying Information Series: MECC Graphing Primer (A-136 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-136" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a136 mecc graphing primer v1.0 (4am crack).dsk" size="143360" crc="cbd0f138" sha1="4ff15fee49110d574f44122007bf3ef100ef01f7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dismgraphp">
+ <description>Displaying Information Series: MECC Graphing Primer (A-136 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-136" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a136 mecc graphing primer v1.1 (4am crack).dsk" size="143360" crc="e84acabc" sha1="8447901e9b4adab28e6e5676446436649a1e19cf" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="divsklls">
<description>Division Skills (4am crack)</description>
<year>1982</year>
@@ -44756,9 +27348,9 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ only." />
<sharedfeat name="compatibility" value="A2P" />
- <!--Due to programming bugs unrelated to copy protection, this program fails to run on any Apple //e or later.-->
- <!--Dump released: 2021-05-09-->
- <!--educational program-->
+ <!-- Due to programming bugs unrelated to copy protection, this program fails to run on any Apple //e or later. -->
+ <!-- Dump released: 2021-05-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="division skills (4am crack).dsk" size="143360" crc="9e728c36" sha1="59a4e0758dcfd2d110de99e81594f9dda1b4da1e"/>
@@ -44766,17 +27358,23 @@ license:CC0-1.0
</part>
</software>
- <software name="dogsleda">
+ <software name="dogsleda_525">
<description>Dog Sled Ambassadors (A-339 version 1.0) (4am and san inc crack)</description>
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-339" />
- <info name="programmer" value="Beth Bell, Beth Daniels, Sheila Dols, Sheila Kelly, Kevin Neff, Korey Schulz, and John P. Wlazlo" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="John P. Wlazlo" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -44791,14 +27389,46 @@ license:CC0-1.0
</part>
</software>
+ <software name="dogspups">
+ <description>Dogs and Puppies (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dogs and puppies (4am crack).dsk" size="143360" crc="b83e6676" sha1="c829406c3c4ae34acef9b60d62a17b337cd5c822" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dkong">
+ <description>Donkey Kong (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="donkey kong (4am crack).dsk" size="143360" crc="a6e8f2ce" sha1="7e18fd14bcf2a6f380533c6c7552c10c793c768d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dqmeadjs">
<description>Don't Quote Me / Adjective Scramble (4am crack)</description>
<year>1986</year>
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-11-->
- <!--educational program-->
+ <!-- Dump released: 2017-01-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="don't quote me and adjective scramble (4am crack).dsk" size="143360" crc="49159d1c" sha1="50fd1d2c805ecc7d62290d8b0048845b5139ad11" />
@@ -44806,6 +27436,110 @@ license:CC0-1.0
</part>
</software>
+ <software name="ddplaygr">
+ <description>Donald Duck's Playground (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="donald duck's playground (4am and san inc crack) side a.dsk" size="143360" crc="39ebc5ab" sha1="ca1e3627e48ad941e7f582867594363c1d6c2e0b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="donald duck's playground (4am and san inc crack) side b.dsk" size="143360" crc="7dcb1d1f" sha1="ed07cbd18281aecbc7fdb787505da5605f6a84d4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dblntbl">
+ <description>Double 'N' Trouble (version 04.02.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jim Parshall" />
+ <info name="programmer" value="Garnet Chappell" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="04.02.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="double 'n' trouble (4am crack) disk 1.dsk" size="143360" crc="c2c787c4" sha1="ebb8f4a4b01d10e592f786107e8a200d4a10f2e2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="double 'n' trouble (4am crack) disk 2.dsk" size="143360" crc="163fc3bf" sha1="a743f98e2cb4ffddb9b74361d6a3c7a7bba40edb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drgkeep04071983" cloneof="drgkeep">
+ <description>Dragon's Keep (version 1983-04-07) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Mike Macchesney" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Rae Lynn Macchesney" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983-04-07" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dragon's keep (4am crack).dsk" size="143360" crc="20828805" sha1="4dc98e853585a4b58dd1eec12d07a202600ce78c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drgkeep06051984" cloneof="drgkeep">
+ <description>Dragon's Keep (version 1984-06-05) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Mike Macchesney" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Rae Lynn Macchesney" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1984-06-05" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dragon's keep 1984 (4am crack).dsk" size="143360" crc="e573e6c6" sha1="b32b8fc3bcdf3f8f09aca058648ed612f3d4eb76"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dridisk">
+ <description>Drinks on a Disk (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Homemaker Software" />
+ <info name="programmer" value="Henny Hall" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="drinks on a disk (softsmith) (4am and san inc crack).dsk" size="143360" crc="91cc7c59" sha1="afdaf2649db01f07782a88be64b7f81c9134a136"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="drgalrtr0" cloneof="drgalrt">
<description>Drug Alert (revision 0) (4am crack)</description>
<year>1986</year>
@@ -44813,10 +27547,10 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This version's handbook contains several typographical errors corrected in revision 1 suggesting an earlier version.-->
+ <!-- This version's handbook contains several typographical errors corrected in revision 1 suggesting an earlier version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-22-->
- <!--educational game-->
+ <!-- Dump released: 2017-11-22 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="drug alert rev. 0 (4am crack).dsk" size="143360" crc="5b55cf61" sha1="a77221b44fd6e8e2b71f46fc01233aba80661efb" />
@@ -44832,8 +27566,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-21-->
- <!--educational game-->
+ <!-- Dump released: 2015-08-21 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="drug alert (4am crack).dsk" size="143360" crc="d4761623" sha1="a5e9ce6a0e231fba917c91ed12f74036bd3b8048" />
@@ -44841,17 +27575,20 @@ license:CC0-1.0
</part>
</software>
- <software name="drlivstn">
+ <software name="drlivstn_525">
<description>Dr. Livingstone, I Presume? (A-314 version 1.0) (4am crack)</description>
<year>1992</year>
<publisher>MECC</publisher>
<info name="partno" value="A-314" />
- <info name="programmer" value="R. Philip Bouchard, David L. Wood, Shari Zehm, and John A. Persoon" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="programmer" value="John A. Persoon" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-10-24-->
- <!--educational program-->
+ <!-- Dump released: 2016-10-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -44866,16 +27603,67 @@ license:CC0-1.0
</part>
</software>
+ <software name="drptalkw">
+ <description>Dr. Peet's Talk-Writer (version 07.06.87) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="07.06.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dr. peet's talk-writer (4am crack).dsk" size="143360" crc="b85b3951" sha1="b6cd92d0479f14333c645b905b01d784154f1113" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drptabcd">
+ <description>Dr. Peet's Talk-Writer ABC Discovery (version 09.09.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="09.09.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="dr. peet's talk-writer abc discovery (4am crack).dsk" size="143360" crc="0bb2abd4" sha1="b52911975205ae95f742ace10a6a632a15485f88" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ducks">
+ <description>Ducks (A-107 version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-107" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a107 ducks v1.1 (4am crack).dsk" size="143360" crc="e6a1db28" sha1="f03efeb3d7bf262c7fc6b59910c507293be973d5"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dueldigt">
<description>Dueling Digits (4am and san inc crack)</description>
<year>1982</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Doug Carlston and Brian Crouch" />
+ <info name="author" value="Doug Carlston" />
+ <info name="programmer" value="Brian Crouch" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-25-->
- <!--educational game-->
- <!--This is a different program than Dueling Digits by MECC.-->
+ <!-- Dump released: 2019-04-25 -->
+ <!-- educational game -->
+ <!-- This is a different program than Dueling Digits by MECC. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dueling digits (4am and san inc crack).dsk" size="143360" crc="a5980e1b" sha1="977ef1026e53c0ec8864841e2f81e0716721232c" />
@@ -44883,15 +27671,117 @@ license:CC0-1.0
</part>
</software>
+ <software name="dmaster">
+ <description>Dungeon Master's Assistant Volume 1: Encounters (version 1.0) (trex crack)</description>
+ <year>1988</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="programmer" value="Victor Penman" />
+ <info name="programmer" value="James Ward" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-02 -->
+ <!-- role-playing tool -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="dungeon master's assistant side a (1988)(ssi)(trex crack)[rdos].dsk" size="143360" crc="14904b40" sha1="9a8953ed45bb36f340b13db1eb6d75a26e498815" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="dungeon master's assistant side b (1988)(ssi)(trex crack)[rdos].dsk" size="143360" crc="fafa454c" sha1="169ec625b5d72f6c624534e4c031915a0e36c82d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqsorsiva">
+ <description>Dunjonquest: Sorcerer of Siva (4am crack)</description>
+ <year>1981</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Gene Rice" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sorcerer of siva (4am crack).dsk" size="143360" crc="1deb1c25" sha1="11e323ade8316655b4e0712a7081af88ead3c219" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpapsr3" cloneof="dqtmpaps">
+ <description>Dunjonquest: The Temple of Apshai (Epyx) (revision 3) (4am crack)</description>
+ <year>1979</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 16-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <!-- This is revision 3, with updated copy protection and a hi-res character generator for on-screen text. Boots on a 16-sector drive. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-16 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="temple of apshai (4am crack).dsk" size="143360" crc="dd57eac2" sha1="b0b20e251ab5ffdf6981ffeaf4991ae31256e0e8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpaps">
+ <description>Dunjonquest: The Temple of Apshai (Epyx) (revision 4) (4am and san inc crack)</description>
+ <year>1979</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 16-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- This is revision 4, with updated copy protection and a hi-res character generator with two choices of font. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="temple of apshai rev. 4 (4am and san inc crack).dsk" size="143360" crc="b79ef05c" sha1="37055324e27e563a8e783d31b73f182265ed8aa6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpapst">
+ <description>Dunjonquest: Temple of Apshai Trilogy (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Double hi-res mode requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-16. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233494">
+ <rom name="temple of apshai trilogy (4am crack).dsk" size="143360" crc="73031a38" sha1="34128800bca3ba312a119ee718740b2c58110df8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dynoqst">
<description>Dyno-Quest (4am crack)</description>
<year>1984</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-27-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dyno-quest (4am crack).dsk" size="143360" crc="f13fc9af" sha1="9e65208e8d1f4c8d4dc920073c17467e6207e4dd" />
@@ -44899,6 +27789,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="earchlng">
+ <description>Ear Challenger: A Music Game (4am crack)</description>
+ <year>1982</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Chris Alix" />
+ <info name="programmer" value="Stephen L. Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ear challenger (4am crack).dsk" size="143360" crc="373bcf01" sha1="43ab2c9aa068891aa783fc76a05b0ed2f0450453"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="edobsclas">
<description>Early Discoveries: Observation and Classification (version 09.23.85) (4am crack)</description>
<year>1985</year>
@@ -44907,8 +27814,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="09.23.85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-17-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="early discoveries - observation and classification v09.23.85 (4am crack).dsk" size="143360" crc="5be703ae" sha1="77f473182ffe6df04b32276d733e6897b8b01257" />
@@ -44916,6 +27823,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="edparqpic">
+ <description>Early Discoveries: Parquetry and Pictures (version 06.24.86) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="06.24.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="parquetry and pictures v06.24.86 (4am crack).dsk" size="143360" crc="99080a67" sha1="1af7c6665d94a33a367290203bbbfec9b958f4eb" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="edsizlogic">
<description>Early Discoveries: Size and Logic (version 07.31.85) (4am crack)</description>
<year>1985</year>
@@ -44924,8 +27848,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="07.31.85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="size and logic- early discoveries (4am crack).dsk" size="143360" crc="3d6d0764" sha1="54f94fc6ea3d31c649e852f5eb8bd73618d8c2cf" />
@@ -44933,15 +27857,53 @@ license:CC0-1.0
</part>
</software>
+ <software name="erulneg">
+ <description>Early Emerging Rules: Negation (version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox, M.S." />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="early emerging rules - negation (4am crack).dsk" size="143360" crc="88235a8d" sha1="258bf21890c7bd813f23d25570c4f2623e16692a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="erulplur">
+ <description>Early Emerging Rules: Plurals (version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox, M.S." />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="early emerging rules - plurals (4am crack).dsk" size="143360" crc="1fe05fda" sha1="801e84cefecca5257bf797cbfae4db30a020c3d8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="egyc">
<description>Early Games for Young Children (4am crack)</description>
<year>1982</year>
- <publisher>Springboard Software</publisher>
+ <publisher>Edu-Ware</publisher>
+ <info name="original_publisher" value="Springboard Software" />
+ <info name="developer" value="Springboard Software" />
<info name="programmer" value="John Paulson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-21-->
- <!--educational game-->
+ <!-- Dump released: 2014-08-21 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="early games for young children (4am crack).dsk" size="143360" crc="16ede4a6" sha1="e634a2a6fae6b11efcd7f59fa296960d351ed8c0" />
@@ -44953,12 +27915,13 @@ license:CC0-1.0
<description>Early Games: Matchmaker (revision 1) (4am crack)</description>
<year>1983</year>
<publisher>Counterpoint Software</publisher>
- <info name="programmer" value="Jane Adolf and Charles Boody" />
+ <info name="programmer" value="Jane Adolf" />
+ <info name="programmer" value="Charles Boody" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-10-13-->
- <!--educational program-->
+ <!-- Dump released: 2015-10-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="early games - matchmaker (4am crack).dsk" size="143360" crc="e1665b0d" sha1="db392edb9f913a82283cb95a0655771db7b0ba45" />
@@ -44970,13 +27933,14 @@ license:CC0-1.0
<description>Early Games: Matchmaker (revision 2) (4am crack)</description>
<year>1983</year>
<publisher>Counterpoint Software</publisher>
- <info name="programmer" value="Jane Adolf and Charles Boody" />
+ <info name="programmer" value="Jane Adolf" />
+ <info name="programmer" value="Charles Boody" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This updated revision has updated copy protection and unspecified bug fixes.-->
+ <!-- This updated revision has updated copy protection and unspecified bug fixes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="early games- matchmaker rev. 2 (4am crack).dsk" size="143360" crc="d391ff6f" sha1="82429119fca7472da303c6533beefccda7b7155f" />
@@ -44991,8 +27955,8 @@ license:CC0-1.0
<info name="programmer" value="John Paulson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-05-14-->
- <!--educational program-->
+ <!-- Dump released: 2018-05-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="early games - music (4am crack).dsk" size="143360" crc="d9eff561" sha1="b40e30b1a553dcdfee543b4fe6485743cdfc6fe2" />
@@ -45007,8 +27971,8 @@ license:CC0-1.0
<info name="programmer" value="Robert Eyestone" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-06-02-->
- <!--educational program-->
+ <!-- Dump released: 2014-06-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="piece of cake (4am crack).dsk" size="143360" crc="497f44b7" sha1="4224d39053c3b70305f00610689dc551c3aa5291" />
@@ -45023,8 +27987,8 @@ license:CC0-1.0
<info name="programmer" value="Robert Eyestone" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-21-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="piece of cake math (4am crack).dsk" size="143360" crc="b73d1855" sha1="1219efb6057136d3cf22f9e27c24d1e16856192d" />
@@ -45032,6 +27996,122 @@ license:CC0-1.0
</part>
</software>
+ <software name="ehbible">
+ <description>Early Heroes of the Bible (4am crack)</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House"/>
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="early heroes of the bible (4am crack) side a.dsk" size="143360" crc="ee55836a" sha1="a6b2eabf4a3eca66c040e61893342381819161a2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="early heroes of the bible (4am crack) side b.dsk" size="143360" crc="65c85c93" sha1="f3acacc26c8c57ca0c68dab3615865c7f2e0222f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drgkeep">
+ <description>Early Learning Adventures: Dragon's Keep (version 1985-01-09) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="original_publisher" value="Sierra On-Line" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Mike Macchesney" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Rae Lynn Macchesney" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985-01-09" />
+ <!-- Branded re-release distributed by Encyclopedia Britannica Educational Corporation. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="early learning adventures- dragon's keep (4am crack).dsk" size="143360" crc="5684379a" sha1="759ebb6fe07b031d3d9acba183724aeab3e634ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="erlymussk">
+ <description>Early Music Skills (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Lolita Walker Gilkes" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="early music skills (4am crack).dsk" size="143360" crc="f8dc4380" sha1="40cbaaaf0441c80794f2b92dba1a612d985deb47"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="earskill">
+ <description>Early Skills (version 06.05.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="06.05.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Sample lessons"/>
+ <dataarea name="flop" size="143360">
+ <rom name="early skills v06.05.86 (4am crack) disk 1 - sample lessons.dsk" size="143360" crc="b8f3df77" sha1="e81b2bde2d13b585f0d5942f2a3b2ef04e4ba5ec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Create your own lessons"/>
+ <dataarea name="flop" size="143360">
+ <rom name="early skills v06.05.86 (4am crack) disk 2 - create your own lessons.dsk" size="143360" crc="f082a4a7" sha1="bec5e510100f18150c0f2a4e38be634e93690803" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eostatn">
+ <description>Earth Orbit Stations (4am and san inc crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Karl Buiter" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-08 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Game / Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="earth orbit stations (4am and san inc crack) disk 1 - boot.dsk" size="143360" crc="d203bbc7" sha1="f320fcf100db49de86787ed9f1025b65bd3ca7dc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Archive"/>
+ <dataarea name="flop" size="143360">
+ <rom name="earth orbit stations (4am and san inc crack) disk 2 - archive.dsk" size="143360" crc="870733af" sha1="6822dd8975a5944b65ea0df88fefea531ed223d0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Mission"/>
+ <dataarea name="flop" size="143360">
+ <rom name="earth orbit stations (4am and san inc crack) disk 3 - mission.dsk" size="143360" crc="68a4fb0e" sha1="e187f8e8b9597a9f49bc1de31912e64c78fef126" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="earthvol">
<description>Earthquakes and Volcanoes (4am crack)</description>
<year>1989</year>
@@ -45039,8 +28119,8 @@ license:CC0-1.0
<info name="developer" value="January Productions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Boot" />
<dataarea name="flop" size="143360">
@@ -45062,13 +28142,14 @@ license:CC0-1.0
</software>
<software name="easyabc">
- <description>Easy as ABC (4am crack)</description>
+ <description>Easy as ABC (Springboard Software) (4am crack)</description>
<year>1984</year>
<publisher>Springboard Software</publisher>
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="developer" value="Springboard Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-21-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="easy as abc (4am crack).dsk" size="143360" crc="2372548a" sha1="f7f6536532978613e27974816417d17d3e9c7d82" />
@@ -45081,10 +28162,10 @@ license:CC0-1.0
<year>1988</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-27-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="easy street (4am crack).dsk" size="143360" crc="1a675876" sha1="d6afddd7b1b481463339541d0b7c40c7029499d2" />
@@ -45092,24 +28173,6 @@ license:CC0-1.0
</part>
</software>
- <software name="eerievlib">
- <description>Eerieville Library (A-304 version 1.0) (4am crack)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-304" />
- <info name="programmer" value="Sheila Dols, Kevin Neff, Mike Palmquist, Mike Tschimperle, and John Wlazlo" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-15-->
- <!--educational program-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="mecc-a304 eerieville library v1.0 (4am crack).dsk" size="143360" crc="45403098" sha1="662deb01dbe8ca55c74fed44ab3b59746def1b15"/>
- </dataarea>
- </part>
- </software>
-
<software name="effstskil">
<description>Effective Study Skills (4am crack)</description>
<year>1983</year>
@@ -45117,8 +28180,8 @@ license:CC0-1.0
<info name="developer" value="Microcomputer Educational Programs" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="effective study skills (4am crack).dsk" size="143360" crc="866f1d1d" sha1="ba98e36a7a686ab9c4456daaf096c74874fba780" />
@@ -45130,13 +28193,13 @@ license:CC0-1.0
<description>Electric Circuits (revision 1) (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank Salamon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="electric circuits (4am crack).dsk" size="143360" crc="9742b2d4" sha1="3413e37db69bae3e3d52aa79a9f4ab84a4efd153" />
@@ -45148,14 +28211,14 @@ license:CC0-1.0
<description>Electric Circuits (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank Salamon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This undated revision has updated copy protection and a different logo screen.-->
+ <!-- This undated revision has updated copy protection and a different logo screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="electric circuits rev. 2 (4am crack).dsk" size="143360" crc="f7769a5b" sha1="bddc70b79cac90da526d55803912e61110d0c1ff" />
@@ -45168,12 +28231,15 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-334" />
- <info name="programmer" value="Beth Bell, Rush Kivisto, Patricia Korn, and Dave Wood" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Rush Kivisto" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Dave Wood" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a334 electrifying adventures v1.0 (4am crack).dsk" size="143360" crc="151f6186" sha1="c5f6e090f6d9137291c7e94e3161a5b24b3ecadf"/>
@@ -45181,18 +28247,57 @@ license:CC0-1.0
</part>
</software>
+ <software name="elmoney10" cloneof="elmoney">
+ <description>Electronic Money (A-816 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-816" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a816 electronic money v1.0 (4am crack).dsk" size="143360" crc="f1dc965d" sha1="67d09045ced758930f96a522cb0661e457bf3f51"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elmoney">
+ <description>Electronic Money (A-816 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-816" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a816 electronic money v1.1 (4am crack).dsk" size="143360" crc="cfe8e02a" sha1="544b7f18d3ac44156fa543aeba47aa80c425b0cc"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="elemgene">
<description>Elementary Genetics (A-402 version 1.1) (4am crack)</description>
<year>1986</year>
<publisher>MECC</publisher>
<info name="developer" value="TIES" />
<info name="partno" value="A-402" />
- <info name="programmer" value="Marcia Horn, Earl Keyser, Joyce Lindgren, and Jerome A. Farm" />
+ <info name="programmer" value="Marcia Horn" />
+ <info name="programmer" value="Earl Keyser" />
+ <info name="programmer" value="Joyce Lindgren" />
+ <info name="programmer" value="Jerome A. Farm" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-18-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a402 elementary genetics v1.1 (4am crack).dsk" size="143360" crc="9d161d79" sha1="f577c07acfa513ae488c18379fcb18f4a9b55365"/>
@@ -45200,14 +28305,469 @@ license:CC0-1.0
</part>
</software>
+ <software name="elv1math34" cloneof="elv1math">
+ <description>Elementary Volume 1: Mathematics (Games and Drills) (A-702 version 3.4) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-702" />
+ <info name="programmer" value="Tim Aaronson" />
+ <info name="programmer" value="D. Holznagel" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Mike Stein" />
+ <info name="programmer" value="David Dye" />
+ <info name="programmer" value="Bob Jamison" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a702 elementary volume 1- mathematics v3.4 (4am crack).dsk" size="143360" crc="d1d6c11c" sha1="fc45ee132c787b77627b9fedf15553fda8265a5b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv1math">
+ <description>Elementary Volume 1: Mathematics (Games and Drills) (A-702 version 3.5) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-702" />
+ <info name="programmer" value="Tim Aaronson" />
+ <info name="programmer" value="D. Holznagel" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Mike Stein" />
+ <info name="programmer" value="David Dye" />
+ <info name="programmer" value="Bob Jamison" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a702 elementary vol. 1 v3.5 (4am crack).dsk" size="143360" crc="6970dbf5" sha1="55dd9caa3316d3c72255b2bb8f45efc3c3bdc58c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv2larts31" cloneof="elv2larts">
+ <description>Elementary Volume 2: Language Arts (A-703 version 3.1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-703" />
+ <info name="programmer" value="Jack Hauber" />
+ <info name="programmer" value="Jim Altermatt" />
+ <info name="programmer" value="Linda Borry" />
+ <info name="programmer" value="Curt Torgerson" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a703 elementary volume 2- language arts v3.1 (4am crack).dsk" size="143360" crc="092fef7f" sha1="42fb1853c96bd66e4aed41e41db5adcc6a7f400a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv2larts">
+ <description>Elementary Volume 2: Language Arts (A-703 version 3.2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-703" />
+ <info name="programmer" value="Jack Hauber" />
+ <info name="programmer" value="Jim Altermatt" />
+ <info name="programmer" value="Linda Borry" />
+ <info name="programmer" value="Curt Torgerson" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a703 elementary vol. 2 v3.2 (4am crack).dsk" size="143360" crc="f0a317f2" sha1="567196ae736b8b2658297eac44da7fd24b281fee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv3ss47" cloneof="elv3ss">
+ <description>Elementary Volume 3: Social Studies (History, Ecomonics, and Geography) (A-704 version 4.7) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-704" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.7" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a704 elementary vol. 3 v4.7 (4am crack).dsk" size="143360" crc="9620d530" sha1="e7a40bee7965a62e0b10be5866a31667714b7a7a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv3ss">
+ <description>Elementary Volume 3: Social Studies (History, Ecomonics, and Geography) (A-704 version 4.8) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-704" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.8" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a704 elementary vol. 3 v4.8 (4am crack).dsk" size="143360" crc="46b21887" sha1="f2d09a96a8374024d547a5aa2c63fd699e466d03" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv4ms42" cloneof="elv4ms">
+ <description>Elementary Volume 4: Math / Science (Ecology, Astronomy, and Arithmetic) (A-705 version 4.2) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-705" />
+ <info name="programmer" value="C. Neuenschwander" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Hugh Collet" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a705 elementary volume 4- math, science v4.2 (4am crack).dsk" size="143360" crc="8caa86ea" sha1="727aaa1be6c057541152dfdc469e65d4283e9827" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv4ms">
+ <description>Elementary Volume 4: Math / Science (Ecology, Astronomy, and Arithmetic) (A-705 version 4.3) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-705" />
+ <info name="programmer" value="C. Neuenschwander" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Hugh Collet" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a705 elementary volume 4- math, science v4.3 (4am crack).dsk" size="143360" crc="bcf502c1" sha1="bb7e723fcea4860f0f507036fcdfd58638dcf2d0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv5larts15" cloneof="elv5larts">
+ <description>Elementary Volume 5: Language Arts (Prefixes) (A-719 version 1.5) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-719" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a719 elementary volume 5- language arts- prefixes v1.5 (4am crack).dsk" size="143360" crc="9f0e8279" sha1="4358a6da33df2c7623c4c3a63461a77ce618aec7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv5larts">
+ <description>Elementary Volume 5: Language Arts (Prefixes) (A-719 version 1.7) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-719" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.7" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a719 elementary volume 5- language arts- prefixes v1.7 (4am crack).dsk" size="143360" crc="6a72201c" sha1="c28569f55b122bf54bec1d08146ce4ea0da8be74"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv6ss">
+ <description>Elementary Volume 6: Social Studies (Simulations) (A-725 version 1.3) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-725" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a725 elementary vol. 6 v1.3 (4am crack).dsk" size="143360" crc="48f81fe8" sha1="1d9b89a3bb70543d1e9fa092c1f00c6edec7fe60" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv7prct10" cloneof="elv7prct">
+ <description>Elementary Volume 7: Pre-Reading / Counting (A-731 version 1.0) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-731" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a731 elementary volume 7 - pre-reading and counting v1.0 (4am crack).dsk" size="143360" crc="21f5868b" sha1="dc4d2ea2026c754a382aa0fd8413cc5f547edc59"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv7prct">
+ <description>Elementary Volume 7: Pre-Reading / Counting (A-731 version 1.1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-731" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a731 elementary volume 7 - pre-reading and counting v1.1 (4am crack).dsk" size="143360" crc="a1e40a3a" sha1="78354f820ec816d182e3c3c31b6d4e22c448c4c9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv8geo">
+ <description>Elementary Volume 8: Geometry (Points and Angles) (A-732 version 1.0) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-732" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a732 elementary volume 8 - geometry v1.0 (4am crack).dsk" size="143360" crc="e78c634b" sha1="9c78ed18bedee04490485ce681d3493b0fdae8e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv9geo10" cloneof="elv9geo">
+ <description>Elementary Volume 9: Geometry (Lines and Triangles) (A-733 version 1.0) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-733" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a733 elementary volume 9- geometry v1.0 (4am crack).dsk" size="143360" crc="d14015b9" sha1="37f06440e57c48b2d3f14dc36275581e02fc0734"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv9geo">
+ <description>Elementary Volume 9: Geometry (Lines and Triangles) (A-733 version 2.1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-733" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a733 elementary volume 9- geometry v2.1 (4am crack).dsk" size="143360" crc="69999da9" sha1="4efa17eb567b62f8e80fb0ee4a4b06fcb72cec1e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv10geo">
+ <description>Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter) (A-734 version 1.1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-734" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a734 elementary volume 10- geometry v1.1 (4am crack).dsk" size="143360" crc="5331711d" sha1="0d0e228ed2b61bc744acf1f666c1c500e75db19e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv11larts">
+ <description>Elementary Volume 11: Language Arts (Phonetics) (A-735 version 1.1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-735" />
+ <info name="programmer" value="Daniel M. Forde" />
+ <info name="programmer" value="James A. Henke" />
+ <info name="programmer" value="David E. Laden" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a735 elementary volume 11- language arts v1.1 (4am crack).dsk" size="143360" crc="a51a4606" sha1="45da46901ccba1f4734f88ef8d4569c84d1027cd"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv12larts10" cloneof="elv12larts">
+ <description>Elementary Volume 12: Language Arts (SIMS) (A-736 version 1.0) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-736" />
+ <info name="programmer" value="Daniel M. Forde" />
+ <info name="programmer" value="Scott Costello" />
+ <info name="programmer" value="R. Christiansen" />
+ <info name="programmer" value="David E. Laden" />
+ <info name="programmer" value="L. Dixson" />
+ <info name="programmer" value="S. Costello" />
+ <info name="programmer" value="J. Cook" />
+ <info name="programmer" value="L. Borry" />
+ <info name="programmer" value="R. Alberti" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a736 elementary volume 12- language arts (sims) v1.0 (4am crack).dsk" size="143360" crc="721e324a" sha1="f1f6294ce13866412608672021703e3a933410b8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv12larts">
+ <description>Elementary Volume 12: Language Arts (SIMS) (A-736 version 2.0) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-736" />
+ <info name="programmer" value="Daniel M. Forde" />
+ <info name="programmer" value="Scott Costello" />
+ <info name="programmer" value="R. Christiansen" />
+ <info name="programmer" value="David E. Laden" />
+ <info name="programmer" value="L. Dixson" />
+ <info name="programmer" value="S. Costello" />
+ <info name="programmer" value="J. Cook" />
+ <info name="programmer" value="L. Borry" />
+ <info name="programmer" value="R. Alberti" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a736 elementary volume 12- language arts (sims) v2.0 (4am crack).dsk" size="143360" crc="367ed575" sha1="5ed86c59a1b645296e07baca5c2db0b9748e67f6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv13nut">
+ <description>Elementary Volume 13: Nutrition (A-743 version 1.0) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-743" />
+ <info name="programmer" value="Shane Mccarron" />
+ <info name="programmer" value="Todd Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a743 elementary volume 13- nutrition v1.0 (4am crack).dsk" size="143360" crc="eb2ccece" sha1="c25e5eeece426c4cb2c1397f7468d34c246a6a0b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elemusic">
+ <description>Elements of Music (4am crack)</description>
+ <year>1981</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="John M. Eddins" />
+ <info name="programmer" value="Robert L. Weiss, Jr." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="elements of music (4am crack).dsk" size="143360" crc="63514a75" sha1="a2f19c4698e11be6ad89e600f255fcc942bac36f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elmusksd">
+ <description>Elements of Music: Key-Signatures Drill (4am crack)</description>
+ <year>1981</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="John M. Eddins" />
+ <info name="programmer" value="Robert L. Weiss, Jr." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="elements of music - key-signatures drill (4am crack).dsk" size="143360" crc="b2601218" sha1="97df9c952211c29b5af8c237d801df49faa8986d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="enctriv">
<description>Encyclopedia Trivia (4am crack)</description>
<year>1986</year>
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-11-->
- <!--educational program-->
+ <!-- Dump released: 2017-01-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="encyclopedia trivia (4am crack).dsk" size="143360" crc="eaab54e1" sha1="6118017db3594294a27cd7e8b4a73893af286662" />
@@ -45224,8 +28784,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-18-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a401 energy house v1.0 (4am crack).dsk" size="143360" crc="106fc6a2" sha1="e2de2216f405ff9d39a36834b897ed9d70581046"/>
@@ -45233,15 +28793,262 @@ license:CC0-1.0
</part>
</software>
- <software name="equat1">
- <description>Equations I (4am crack)</description>
+ <software name="engachv1">
+ <description>English Achievement I (version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="english achievement i (4am crack).dsk" size="143360" crc="d3818808" sha1="a1085cc381fd71c5aee432dbe3218bd440615bf1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engachv2">
+ <description>English Achievement II (4am crack)</description>
+ <year>1982</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="english achievement ii (4am crack).dsk" size="143360" crc="30bb37ad" sha1="dcb3a2ed75c909191da9a23590002bdfe1f437af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engachv3">
+ <description>English Achievement III (4am crack)</description>
+ <year>1982</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="english achievement iii (4am crack).dsk" size="143360" crc="0c828a5c" sha1="5a6eb7bf49d871b2281f508e687dd13eb3f317ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engachv4">
+ <description>English Achievement IV (4am crack)</description>
+ <year>1982</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-02. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="english achievement iv (4am crack).dsk" size="143360" crc="f7b34b87" sha1="10eb4f6db081b38e319037130e684af174f62e73" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engachv5">
+ <description>English Achievement V (4am crack)</description>
+ <year>1982</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="english achievement v (4am crack).dsk" size="143360" crc="78e09ab8" sha1="beffbfc431808e4607ced49e66715a8f048c7c18" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engchlng">
+ <description>English Challenge (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Seed Company</publisher>
+ <info name="programmer" value="Louise Schrank" />
+ <info name="programmer" value="Mark Whitehurst" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="english challenge (4am crack).dsk" size="143360" crc="e23b7121" sha1="ede48949b246423dc9e311f03ff40f778ec090e5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engv1pos12" cloneof="engv1pos">
+ <description>English Volume 1: Parts of Speech (A-746 version 1.2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-746" />
+ <info name="programmer" value="A. McCarthy" />
+ <info name="programmer" value="Darrel Ricke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a746 english vol. 1 v1.2 (4am crack).dsk" size="143360" crc="50799468" sha1="ae8391897bfff1d82e46c649fee81d52f194cadc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engv1pos13" cloneof="engv1pos">
+ <description>English Volume 1: Parts of Speech (A-746 version 1.3) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-746" />
+ <info name="programmer" value="A. McCarthy" />
+ <info name="programmer" value="Darrel Ricke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a746 english volume 1- parts of speech v1.3 (4am crack).dsk" size="143360" crc="d3066591" sha1="455263c41014c238b4c8ff33b8731dda7a12998e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engv1pos14" cloneof="engv1pos">
+ <description>English Volume 1: Parts of Speech (A-746 version 1.4) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-746" />
+ <info name="programmer" value="A. McCarthy" />
+ <info name="programmer" value="Darrel Ricke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a746 english volume 1- parts of speech v1.4 (4am crack).dsk" size="143360" crc="1598ccc3" sha1="7b768321bdb8ba72c261372bdda6db107bddec95"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engv1pos">
+ <description>English Volume 1: Parts of Speech (A-746 version 1.5) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-746" />
+ <info name="programmer" value="A. McCarthy" />
+ <info name="programmer" value="Darrel Ricke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a746 english volume 1 - parts of speech v1.5 (4am crack).dsk" size="143360" crc="7d7e319c" sha1="93e2f83c347c4e9a28075f13eb80c19ca3c6abbe"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="epidemic">
+ <description>Epidemic (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Steven Faber" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="epidemic (4am and san inc crack).dsk" size="143360" crc="5851d9eb" sha1="44ecac88bf299f6cd28475bb1641f62506d6f11f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="epyx3pck">
+ <description>Epyx 3-Pack (4am crack)</description>
+ <year>1980</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Jim Connelley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Contains "Dunjonquest: The Date Stones of Ryn", "Dunjonquest: Morloc's Tower", and "Starquest: Rescue at Rigel". -->
+ <!-- Dump released: 2020-08-08 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="epyx 3-pack (4am crack).dsk" size="143360" crc="a48d559a" sha1="02c425fb01810a847e0567f10b9d5081fce90e68"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eqmath10" cloneof="eqmath_525">
+ <description>Equation Math (A-193 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-193" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a193 equation math v1.0 (4am crack).dsk" size="143360" crc="c1a96955" sha1="7cda6fe3b4d33bb02337f7201fefd69286098438"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eqmath_525">
+ <description>Equation Math (A-193 version 1.1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-193" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a193 equation math v1.1 (4am crack).dsk" size="143360" crc="69ed6482" sha1="aba2803bba4451d1e53e61d836777f6c9550ac70"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="equat183">
+ <description>Equations I (version 1983) (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="equations i (4am crack).dsk" size="143360" crc="7718ac2a" sha1="d75afc6eb44a374728039ad7ca5ad87701ee3d29" />
@@ -45249,6 +29056,196 @@ license:CC0-1.0
</part>
</software>
+ <software name="escarctr">
+ <description>Escape from Arcturus (4am crack)</description>
+ <year>1981</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="escape from arcturus (4am crack).dsk" size="143360" crc="f5f2cf9d" sha1="39399ee63d2e12d91edd58d0c2f609ef8defe9ae" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="estimat">
+ <description>Estimation (A-124 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-124" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a124 estimation v1.0 (4am crack).dsk" size="143360" crc="c5bfc791" sha1="dbcb239e725ce2daf739a69cda5582a0a26c5b3f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestact_525">
+ <description>Estimation Collection: Estimation Activities (A-296 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-296" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a296 estimation activities v1.0 (4am crack).dsk" size="143360" crc="c94c1301" sha1="c5cbe823728cb82d7315a970a96642d53e8ad81a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eceststr_525">
+ <description>Estimation Collection: Estimation Strategies (A-295 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-295" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a295 estimation strategies v1.0 (4am crack).dsk" size="143360" crc="723d14bd" sha1="bcd33de40735741a868c1492a62a036c30debd4c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestqsi_525">
+ <description>Estimation Collection: Estimation: Quick Solve I (A-258 version 1.0) (version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-258" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a258 estimation- quick solve i v1.0 (4am crack).dsk" size="143360" crc="29bc44a0" sha1="d782dedc1747830085865b7c15db87da632b31d6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestqsii_525">
+ <description>Estimation Collection: Estimation: Quick Solve II (A-259 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-259" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a259 estimation- quick solve ii v1.0 (4am crack).dsk" size="143360" crc="546fba86" sha1="1172a6de615a87776859e18cee53fddb1f4aca37"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="estbullse">
+ <description>Estimation: Bull's Eye (4am crack)</description>
+ <year>1986</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="Encyclopaedia Britannica Educational Corporation" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="estimation- bull's eye (4am crack).dsk" size="143360" crc="b76acaf6" sha1="befd753d3d74e341b503dd8776cb1cfd1dcc3c38"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eisinfoman10" cloneof="eisinfoman">
+ <description>Evaluating Information Series: MECC Information Manager (A-141 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-141" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a141 mecc information manager v1.0 (4am crack) disk 1.dsk" size="143360" crc="bac7b4c0" sha1="800de9ffafc6d62ee7fd71fb97b3972f484cde13" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a141 mecc information manager v1.0 (4am crack) disk 2.dsk" size="143360" crc="3d8b5afe" sha1="472f73d12e14a7980299d53b72c59a55cc51da36" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eisinfoman">
+ <description>Evaluating Information Series: MECC Information Manager (A-141 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-141" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a141 mecc information manager v1.1 (4am crack) side a.dsk" size="143360" crc="777df2d1" sha1="7bfbab5f7f8a5d0b7f31a36e4c1f7c8cff2aedce" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a141 mecc information manager v1.1 (4am crack) side b.dsk" size="143360" crc="92bd5dc4" sha1="feedc9785a4706d8b066b5af2dec3c52ffaceef1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="exclread">
<description>Excel-A-Read (4am crack)</description>
<year>1985</year>
@@ -45256,8 +29253,8 @@ license:CC0-1.0
<info name="developer" value="American Educational Computer" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-05-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-05-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="excel-a-read (4am crack).dsk" size="143360" crc="e4fef281" sha1="66a38a96dbb72d4812e970b3f276308d8f403905" />
@@ -45265,6 +29262,216 @@ license:CC0-1.0
</part>
</software>
+ <software name="examazon">
+ <description>Expedition Amazon (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Willard Phillips" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-01 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="expedition amazon (4am crack) side a.dsk" size="143360" crc="b7bd4d32" sha1="3effbf439395e69d197e5f919a7cf8892bb35058" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="expedition amazon (4am crack) side b (boot).dsk" size="143360" crc="4cbb6e00" sha1="0974f4f34520234c741e67de535e664eb9b9396a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expproc">
+ <description>Experiencing Procedures (A-810 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-810" />
+ <info name="programmer" value="Wendell Ruotsi" />
+ <info name="programmer" value="Andy Hollenbeck" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a810 experiencing procedures v1.0 (4am crack).dsk" size="143360" crc="10ebecbd" sha1="b385b46aaef87848dbe68e129e0dac7c511610ab"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expchaos">
+ <description>Exploring Chaos (A-316 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-316" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a316 exploring chaos v1.0 (4am crack).dsk" size="143360" crc="4ce4b300" sha1="3c643fea34d40347ab545026ca58155cd9e8df48" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expgasl_525">
+ <description>Exploring Gas Laws (A-229 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-229" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Hassan Kaganda" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a229 exploring gas laws v1.0 (4am crack).dsk" size="143360" crc="e5486fab" sha1="a8b421cfe14c1aabe1f3530ba43e24d3019aa7c4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expseqs_525">
+ <description>Exploring Sequences and Series (A-263 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-263" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a263 exploring sequences and series v1.0 (4am crack).dsk" size="143360" crc="b2db124a" sha1="6f3b4890649830ad3620145f5c36fd68a19c611c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expsctmp">
+ <description>Exploring Science: Temperature (4am crack)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Leslie Eiser" />
+ <info name="programmer" value="Dominique Allard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="exploring science - temperature (4am crack).dsk" size="143360" crc="616c17ea" sha1="dc3fd5d610265b88c840c5859f42b15a09720ed3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expsortrt">
+ <description>Exploring Sorting Routines (A-110 version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-110" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a110 exploring sorting routines v1.1 (4am crack).dsk" size="143360" crc="4f531c1c" sha1="9c4f8ddb2e345d822f0b7bc588cf8240f6817279"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrseerl_525">
+ <description>Express Delivery Reading Series: Eerieville Library (A-304 version 1.0) (4am crack)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-304" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Mike Tschimperle" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a304 eerieville library v1.0 (4am crack).dsk" size="143360" crc="45403098" sha1="662deb01dbe8ca55c74fed44ab3b59746def1b15"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrsfishs_525">
+ <description>Express Delivery Reading Series: Fish School (A-302 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-302" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a302 fish school v1.0 (4am crack).dsk" size="143360" crc="63bc727a" sha1="e17cd655bf2abed7b31512e3d342e24a55711676"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrsmovm_525">
+ <description>Express Delivery Reading Series: Moving Museum (A-303 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-303" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a303 moving museum v1.0 (4am crack).dsk" size="143360" crc="77a80339" sha1="aa83d4ee8d5bed1c71bba786b9c3a33199b921a1"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="xtraxtramb" cloneof="xtraxtra">
<description>Extra! Extra! (Milton Bradley) (version 1984) (4am crack)</description>
<year>1984</year>
@@ -45273,8 +29480,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1984" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-18-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="extra extra (milton bradley) (4am crack).dsk" size="143360" crc="485894fc" sha1="a64120e9494098dedfb4c2da9ab899d3f4e5d280" />
@@ -45290,10 +29497,10 @@ license:CC0-1.0
<info name="original_publisher" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1985" />
- <!--Re-release by Media Materials a year later with an updated copy protection scheme.-->
+ <!-- Re-release by Media Materials a year later with an updated copy protection scheme. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-08-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="extra extra (4am crack).dsk" size="143360" crc="da3dc1c6" sha1="3d735a42e5f887bf1e7700e42f7e312b8a89a49b" />
@@ -45308,8 +29515,8 @@ license:CC0-1.0
<info name="programmer" value="Robert Berliner" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="e-z learner (4am crack).dsk" size="143360" crc="85ac63fb" sha1="51bcdbe9e11a397a47a8ddcc39ab5e00f3dcfbeb" />
@@ -45317,6 +29524,27 @@ license:CC0-1.0
</part>
</software>
+ <software name="ezlogo">
+ <description>EZ Logo (A-775 version 2.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-775" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Philip Bouchard" />
+ <info name="programmer" value="Judy Anderson" />
+ <info name="usage" value="Requires an 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a775 ez logo v2.0 (4am crack).dsk" size="143360" crc="ed3d4b95" sha1="988033b7d18e536115c4bc4dddf689c8d2f436ad"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="facemkr">
<description>Facemaker (4am crack)</description>
<year>1982</year>
@@ -45324,8 +29552,8 @@ license:CC0-1.0
<info name="developer" value="Spinnaker Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-09-->
- <!--educational game-->
+ <!-- Dump released: 2014-08-09 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="facemaker (4am crack).dsk" size="143360" crc="b59ab962" sha1="55d8e6906bcbc1ae5c98a5b9a9f4594d0c47ecd8" />
@@ -45337,11 +29565,13 @@ license:CC0-1.0
<description>Facemaker Gold Edition (4am crack)</description>
<year>1986</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="James Back, Bill Groetzinger, and Dale Disharoon" />
+ <info name="programmer" value="James Back" />
+ <info name="programmer" value="Bill Groetzinger" />
+ <info name="programmer" value="Dale Disharoon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-10-->
- <!--educational game-->
+ <!-- Dump released: 2017-06-10 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="facemaker gold edition (4am crack).dsk" size="143360" crc="e4113cc4" sha1="850385687621f487ac67364e12104b26d74741a4" />
@@ -45349,15 +29579,68 @@ license:CC0-1.0
</part>
</software>
+ <software name="factsh0983">
+ <description>Fact Sheets (version 09.19.83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Bruce A. Smith" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.19.83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fact sheets v09.19.83 (4am crack).dsk" size="143360" crc="3aa00c12" sha1="6d4f2f25dd453b657481a0e4f0cab83f07876d32"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factopin042785" cloneof="factopin">
+ <description>Fact or Opinion (version 04.27.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.27.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fact or opinion (4am crack).dsk" size="143360" crc="cc153b60" sha1="d7605540583b5705f754a41085f3795fb0205814" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factopin">
+ <description>Fact or Opinion (version 10.15.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.15.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fact or opinion v10.15.87 (4am crack).dsk" size="143360" crc="0b9470a8" sha1="792d82e30718663bedeb90b88edefe77e6f2b116" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ftgsports">
<description>Factactics Trivia Game: Sports (4am crack)</description>
<year>1984</year>
<publisher>Daystar Learning</publisher>
- <info name="programmer" value="Kevin Armstrong, Dorcas Evans, and Edwin Reich" />
+ <info name="programmer" value="Kevin Armstrong" />
+ <info name="programmer" value="Dorcas Evans" />
+ <info name="programmer" value="Edwin Reich" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-05-02-->
- <!--board game-->
+ <!-- Dump released: 2024-05-02 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="factactics trivia game- sports (4am crack).dsk" size="143360" crc="c498aaa1" sha1="117c8e35a9e3adcf27b3641af7aaf8c72ab9417c" />
@@ -45365,15 +29648,35 @@ license:CC0-1.0
</part>
</software>
+ <software name="fctalgex">
+ <description>Factoring Algebraic Expressions (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Microcomputer Workshops Courseware" />
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="factoring algebraic expressions (4am crack).dsk" size="143360" crc="3b6386ab" sha1="2b691e14b3b72a8b05e09045dc569847685e32d5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="fairelpb3">
<description>Faire le Point-Bac Physique Volume 3 (French) (4am crack)</description>
<year>1984</year>
<publisher>Ediciel</publisher>
- <info name="programmer" value="J. L. Izbicki and A. Pujos" />
+ <info name="programmer" value="J. L. Izbicki" />
+ <info name="programmer" value="A. Pujos" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-07-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -45389,14 +29692,15 @@ license:CC0-1.0
</software>
<software name="falconsps" cloneof="falcons">
- <description>Falcons (4am crack)</description>
+ <description>Falcons (Piccadilly Software) (4am crack)</description>
<year>1981</year>
<publisher>Piccadilly Software</publisher>
- <info name="programmer" value="Thomas Ball and Eric Varsanyi" />
+ <info name="programmer" value="Thomas Ball" />
+ <info name="programmer" value="Eric Varsanyi" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-04-28-->
- <!--action game-->
+ <!-- Dump released: 2015-04-28 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="falcons (4am crack).dsk" size="143360" crc="b2eb0e24" sha1="b94e95a0f657230684a81637ad3c9b2a3fdfbbfd" />
@@ -45409,11 +29713,12 @@ license:CC0-1.0
<year>1981</year>
<publisher>Softsmith</publisher>
<info name="original_publisher" value="Piccadilly Software" />
- <info name="programmer" value="Thomas Ball and Eric Varsanyi" />
+ <info name="programmer" value="Thomas Ball" />
+ <info name="programmer" value="Eric Varsanyi" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-02-04-->
- <!--action game-->
+ <!-- Dump released: 2024-02-04 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="falcons (softsmith) (4am and san inc crack).dsk" size="143360" crc="54ad4bde" sha1="6e56006b31f5ca1de398f3b4070c22a8f98cee9d" />
@@ -45428,8 +29733,8 @@ license:CC0-1.0
<info name="developer" value="Looking Glass" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -45452,8 +29757,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="03.11.83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-26-->
- <!--productivity program-->
+ <!-- Dump released: 2022-12-26 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -45484,11 +29789,12 @@ license:CC0-1.0
<description>Fat City (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthinngton" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthinngton" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-07-->
- <!--action game-->
+ <!-- Dump released: 2018-10-07 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fat city (4am and san inc crack).dsk" size="143360" crc="588f8d3d" sha1="3350427bc80671ad5ff852a957b2eab9f1b90aa8" />
@@ -45500,11 +29806,12 @@ license:CC0-1.0
<description>Fay: That Math Woman! (4am crack)</description>
<year>1983</year>
<publisher>Didatech Software</publisher>
- <info name="programmer" value="David Vincent and Paul Melhus" />
+ <info name="programmer" value="David Vincent" />
+ <info name="programmer" value="Paul Melhus" />
<info name="usage" value="Requires a 32K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-11-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fay- that math woman (4am crack).dsk" size="143360" crc="708f4de6" sha1="8c25121dbef45710183576b0145c7d23c7614004"/>
@@ -45519,8 +29826,8 @@ license:CC0-1.0
<info name="developer" value="KidSoft Computerware" />
<info name="usage" value="Requires a Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-07-01-->
- <!--educational program-->
+ <!-- Dump released: 2016-07-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -45535,6 +29842,188 @@ license:CC0-1.0
</part>
</software>
+ <software name="fldofire">
+ <description>Field of Fire (version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="LDW Software" />
+ <info name="programmer" value="Roger Damon" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="field of fire (4am crack) side a.dsk" size="143360" crc="d3e4c252" sha1="89860de4872254fb034f5f91a2c58f3f7fe76b8b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="field of fire (4am crack) side b.dsk" size="143360" crc="a75578a7" sha1="64db2524da2375767eec272656dc24ba3e50ba61" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="50miscru11" cloneof="50miscru">
+ <description>Fifty Mission Crush (version 1.1) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="alt_title" value="50 Mission Crush" />
+ <info name="programmer" value="John Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fifty mission crush v1.1 (4am and san inc crack).dsk" size="143360" crc="01e9f083" sha1="28a74d8f98bc262a550d9b591c6d8df18dfb13ee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="50miscru">
+ <description>Fifty Mission Crush (version 1.2) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="alt_title" value="50 Mission Crush" />
+ <info name="programmer" value="John Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fifty mission crush v1.2 (4am and san inc crack).dsk" size="143360" crc="56078d1b" sha1="2261d4a95ebdba5a9b46c6d108c20d89390d5822" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fcommand">
+ <description>Fighter Command (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charlie Merrow" />
+ <info name="programmer" value="Jack Avery" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fighter command (4am and san inc crack).dsk" size="143360" crc="c9f6b276" sha1="d83f4b6bfaa1c154845da9f01d8503557eaf5cdf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fincookb">
+ <description>Financial Cookbook (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Stan Trost" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-22 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="financial cookbook (4am and san inc crack).dsk" size="143360" crc="04c51906" sha1="40d77a2ec410a5dc163489a75ed9dd52b545d5eb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firdegle">
+ <description>First Degree Linear Equations (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Microcomputer Workshops Courseware" />
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Mark S. Appel" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="first degree linear equations (4am crack).dsk" size="143360" crc="bc9f6657" sha1="8ecb52e40aaa9b2888d7c3c10d6dc80ef265309b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fmawordp">
+ <description>First Math Adventures: Understanding Word Problems (4am crack)</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="first math adventures - understanding word problems (4am crack).dsk" size="143360" crc="9a95072c" sha1="6eac6298542b7bcb6864ffbe171777e13a44ba8b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firsverb">
+ <description>First Verbs (4am crack)</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="first verbs (4am crack).dsk" size="143360" crc="f66c56e9" sha1="be3b5694468bfbd8ce06b7134eb2310941e661a0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firsword">
+ <description>First Words (4am crack)</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="first words (4am crack).dsk" size="143360" crc="ce1b6cf2" sha1="d32231f12cb7434609d79fc079b6c4eafd88aa5d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fstartwr">
+ <description>First-Start Writing Program (4am crack)</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="first start writing program (4am crack).dsk" size="143360" crc="993e1183" sha1="813dbcb0ba217d9d83dbdfb171d602d19b744dfc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="fishscal40" cloneof="fishscal">
<description>Fish Scales (version 4.0) (4am crack)</description>
<year>1984</year>
@@ -45542,10 +30031,10 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="4.0" />
- <!--HELLO program contains the comment: VER 4.0 2/3/85-->
+ <!-- HELLO program contains the comment: VER 4.0 2/3/85 -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fish scales v4.0 (4am crack).dsk" size="143360" crc="7ad05208" sha1="200e4eea5a06b73b67f754fcf5b6c8a5f2262c43" />
@@ -45560,10 +30049,10 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.0" />
- <!--HELLO program contains the comment: VER 5.0 2/26/85-->
+ <!-- HELLO program contains the comment: VER 5.0 2/26/85 -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-11-06-->
- <!--educational program-->
+ <!-- Dump released: 2016-11-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fish scales (4am crack).dsk" size="143360" crc="9fcc44ce" sha1="03beb8bd8a25b2388b6cabf714785928cd142200" />
@@ -45571,6 +30060,25 @@ license:CC0-1.0
</part>
</software>
+ <software name="flshsphc">
+ <description>Flash Spell Helicopter (version 1984-10-22) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Microcomputer Workships Courseware</publisher>
+ <info name="programmer" value="Mark S. Appel" />
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Jon Paul" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1984-10-22" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="flash spell helicopter (4am crack).dsk" size="143360" crc="503ec206" sha1="89b39a4a31ddffcd4c2c0373906c2eef45e09f0a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="fthowprtln">
<description>Floppy Teaches: How to Print Letters and Numerals (4am crack)</description>
<year>1983</year>
@@ -45578,8 +30086,8 @@ license:CC0-1.0
<info name="programmer" value="Dan Jatnieks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="floppy teaches how to print letters and numerals (4am crack).dsk" size="143360" crc="dbe7ded5" sha1="4b538bc41da936c6a759bcc79e9fbcc6d04bc0e9" />
@@ -45594,8 +30102,8 @@ license:CC0-1.0
<info name="programmer" value="Dan Jatnieks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="floppy teaches letter and numeral recognition (4am crack).dsk" size="143360" crc="5872b9e0" sha1="c2373bea3fb7ca2a74d02b4d9595fea18adeb21d" />
@@ -45607,11 +30115,12 @@ license:CC0-1.0
<description>Floppy Teaches: What is Missing? (4am crack)</description>
<year>1983</year>
<publisher>Floppy Enterprises</publisher>
- <info name="programmer" value="Priscilla D. Huffman, Ph.D. and Janice M. Keil, Ph.D." />
+ <info name="programmer" value="Priscilla D. Huffman, Ph.D." />
+ <info name="programmer" value="Janice M. Keil, Ph.D." />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-21-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="floppy teaches what is missing (4am crack).dsk" size="143360" crc="29ccf4f4" sha1="0da59423322d3950d6b9d1c6da976d35ddfd4490" />
@@ -45619,6 +30128,55 @@ license:CC0-1.0
</part>
</software>
+ <software name="followme">
+ <description>Follow Me (4am crack)</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Brenna Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="follow me (4am crack).dsk" size="143360" crc="2f7d52d5" sha1="174d8d956bf71a1820ad8fed563245354e48b507"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fdotcdirt">
+ <description>Following Directions: One and Two-Level Commands - Directional Terms (4am crack)</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Eleanor Semel Ed.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="following directions - one and two level commands - directional terms (4am crack).dsk" size="143360" crc="ef378a48" sha1="e2024a50327590f016630b32228a10f74e2ea45e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fdotcspr">
+ <description>Following Directions: One and Two-Level Commands - Spatial Relations (4am crack)</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Eleanor Semel Ed.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="following directions - one and two level commands - spatial relations (4am crack).dsk" size="143360" crc="e273eb35" sha1="b5d6f16048003f0acf8624f74deea16013f444f6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="folwrdir">
<description>Following Written Directions (4am crack)</description>
<year>1983</year>
@@ -45626,8 +30184,8 @@ license:CC0-1.0
<info name="developer" value="Microcomputer Educational Programs" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="following written directions (4am crack).dsk" size="143360" crc="ae0156c2" sha1="7af515b53921fdc27174b4ae4b3b42aa65b7a29b" />
@@ -45635,17 +30193,146 @@ license:CC0-1.0
</part>
</software>
+ <software name="foodfact10" cloneof="foodfact">
+ <description>Food Facts (A-756 version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-756" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a756 food facts v1.0 (4am crack).dsk" size="143360" crc="0b27e7ea" sha1="33f3cc36f64e5d71a1196f0680ac42462fc23c4b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="foodfact11" cloneof="foodfact">
+ <description>Food Facts (A-756 version 1.1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-756" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a756 food facts v1.1 (4am crack).dsk" size="143360" crc="4fd23900" sha1="f686539915254b83748846f784d88ccc70b74d34" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="foodfact">
+ <description>Food Facts (A-756 version 1.2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-756" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a756 food facts v1.2 (4am crack).dsk" size="143360" crc="f01a8013" sha1="3e0aafbe0300760f714bfa8b44e65517691b096a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fornext">
+ <description>FOR Your NEXT Adventure: FOR-NEXT Loops (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John Stimson" />
+ <info name="programmer" value="Robert C. Rosen" />
+ <info name="programmer" value="Ardyth Stimson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-04-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="for your next adventure (4am crack).dsk" size="143360" crc="f93a7783" sha1="6179cde57a15ee564be7da68b410d89a4dd26dc8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="forbcstl">
+ <description>Forbidden Castle (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Mercer Mayer"/>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-23. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop0" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="forbidden castle (4am crack).dsk" size="143360" crc="575ef02b" sha1="1a3ed09a2b975c0daa3df8999b83e5b793d29a62" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="forcemtn">
+ <description>Force and Motion (4am crack)</description>
+ <year>1990</year>
+ <publisher>Queue, Inc.</publisher>
+ <info name="programmer" value="Robert Stickgold, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="force and motion (4am crack) disk 1.dsk" size="143360" crc="a338ba73" sha1="4ddb1788cd67f4f85ebbac4995f9817a1334f6cf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="force and motion (4am crack) disk 2.dsk" size="143360" crc="4a1e54f2" sha1="8a1863172a8e782425b14c3f09995e9dfb444024" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fore">
+ <description>Fore (Epyx) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-23 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fore (4am crack).dsk" size="143360" crc="f56a69c1" sha1="0aaa1df40e4afab6ef5e51ed8a3e867ef0caab48" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="fortress">
<description>Fortress (revision 2) (4am crack)</description>
<year>1983</year>
- <publisher>Strategic Simulations</publisher>
- <info name="programmer" value="Jim Templeman and Patty Denbrook" />
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jim Templeman" />
+ <info name="programmer" value="Patty Denbrook" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This has visible credits and additional comments in BASIC programs, suggesting a later revision.-->
+ <!-- This has visible credits and additional comments in BASIC programs, suggesting a later revision. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--strategy game-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fortress rev. 2 (4am crack).dsk" size="143360" crc="47e06eeb" sha1="f009998cd7ed5e8301041d4790ddf88eb6003f36" />
@@ -45653,6 +30340,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="4wordlft">
+ <description>FourWord &amp; WordLift (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="David E. Metzener" />
+ <info name="programmer" value="Martin Butherus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fourword and wordlift (4am crack).dsk" size="143360" crc="1cf9f2be" sha1="c261d104cadd5bf9420110eb96a3d869b08a7769" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="fracfctry">
<description>Fraction Factory (4am crack)</description>
<year>1983</year>
@@ -45660,8 +30364,8 @@ license:CC0-1.0
<info name="programmer" value="Robert Eyestone" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-14-->
- <!--educational game-->
+ <!-- Dump released: 2017-04-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fraction factory (4am crack).dsk" size="143360" crc="03239bac" sha1="6c393e2f8390bdd3dbbe376df43e6da36f3107b8" />
@@ -45677,8 +30381,8 @@ license:CC0-1.0
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-13-->
- <!--educational program-->
+ <!-- Dump released: 2018-03-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fraction fever rev. 0 (4am crack).dsk" size="143360" crc="2fb2e010" sha1="11e61534e8befe097001d59e03165a503494bde2" />
@@ -45694,8 +30398,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-06-->
- <!--educational program-->
+ <!-- Dump released: 2023-12-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fraction fever rev. 1 (4am crack).dsk" size="143360" crc="261ed925" sha1="b1177c85e04c018acba927cf3a47a019900acb23" />
@@ -45703,6 +30407,31 @@ license:CC0-1.0
</part>
</software>
+ <software name="fractmun_525">
+ <description>Fraction Munchers (A-196 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-196" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Paul Noennig" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a196 fraction munchers v1.0 (4am crack).dsk" size="143360" crc="9b6f2ac6" sha1="22b5a361b1c3b3622790c283359178ce42e0dab6"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="fracwprb">
<description>Fraction Word Problems (4am crack)</description>
<year>1983</year>
@@ -45710,8 +30439,8 @@ license:CC0-1.0
<info name="developer" value="Intellectual Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-13-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fraction word problems (4am crack).dsk" size="143360" crc="388b1049" sha1="dada3c8f63e043e52c06c97632d1fc900e18eb3e"/>
@@ -45719,17 +30448,34 @@ license:CC0-1.0
</part>
</software>
- <software name="fractionss" cloneof="fractions">
- <description>Fractions (version 3.0 04-10-82) (SoftSmith) (4am and san inc crack)</description>
+ <software name="fractions30" cloneof="fractions">
+ <description>Fractions (version 3.0 04-10-82) (Edu-Ware Services) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Edu-Ware Services</publisher>
+ <info name="programmer" value="John R. Conrad" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.0 04-10-82" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-09-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="fractions v3.0 (4am crack).dsk" size="143360" crc="bee35af7" sha1="8ebd56237fa018b65a3a6b68f98cf888f0582cc1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fractionss30" cloneof="fractions">
+ <description>Fractions (version 3.0 04-10-82) (Softsmith) (4am and san inc crack)</description>
<year>1982</year>
- <publisher>SoftSmith</publisher>
+ <publisher>Softsmith</publisher>
<info name="original_publisher" value="Edu-Ware Services" />
<info name="programmer" value="John R. Conrad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="3.0 04-10-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions v3.0 (softsmith) (4am and san inc crack).dsk" size="143360" crc="51735c4b" sha1="17caba0bc5916623bcc319615a5afca8f8e35255"/>
@@ -45738,33 +30484,33 @@ license:CC0-1.0
</software>
<software name="fractions">
- <description>Fractions (version 3.0 04-10-82) (4am crack)</description>
- <year>1982</year>
+ <description>Fractions (version 3.1 25-NOV-83) (Edu-Ware Services) (4am crack)</description>
+ <year>1983</year>
<publisher>Edu-Ware Services</publisher>
<info name="programmer" value="John R. Conrad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="3.0 04-10-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-13-->
- <!--educational program-->
+ <!-- Dump released: 2019-04-08. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="fractions v3.0 (4am crack).dsk" size="143360" crc="bee35af7" sha1="8ebd56237fa018b65a3a6b68f98cf888f0582cc1" />
+ <rom name="fractions v3.1 (4am crack).dsk" size="143360" crc="1abc2385" sha1="bcd9b30632c752bf3df26c55725921b355af2cd0" />
</dataarea>
</part>
</software>
<software name="frfeverf" cloneof="frfever">
<description>Fractions en Folie (French) (4am crack)</description>
- <!--French version of Fraction Fever-->
+ <!-- French version of Fraction Fever -->
<year>1984</year>
<publisher>Ediciel</publisher>
<info name="alt_title" value="Fraction Fever"/>
<info name="developer" value="Tom Snyder Productions" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions en folie (4am crack).dsk" size="143360" crc="a2fd8aa8" sha1="ea6c59ba4fdb4e4bb2dcd658df732bb9efd41de7"/>
@@ -45778,8 +30524,8 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-11-16-->
- <!--educational program-->
+ <!-- Dump released: 2019-11-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions- addition (4am crack).dsk" size="143360" crc="00d299f8" sha1="8cf165dafb3cd2ec19c70e921f92dcf30857d62f" />
@@ -45793,8 +30539,8 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-10-04-->
- <!--educational program-->
+ <!-- Dump released: 2019-10-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions- basic skills (4am crack).dsk" size="143360" crc="ee5ef674" sha1="8d0a1486283fbddcfd36d0aaca3f30a27043eb33" />
@@ -45808,8 +30554,8 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-10-13-->
- <!--educational program-->
+ <!-- Dump released: 2019-10-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions- subtraction (4am crack).dsk" size="143360" crc="dc619fdd" sha1="9053d4818485f0120b0ff9d701bfcf7b3b0f0962" />
@@ -45825,8 +30571,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-30-->
- <!--educational game-->
+ <!-- Dump released: 2022-07-30 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fraction-oids 1988 (4am crack).dsk" size="143360" crc="e51c6e0c" sha1="4495aba81633650d79e639b48c5ea74a14748bad"/>
@@ -45842,8 +30588,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1989" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-27-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fraction-oids (4am crack).dsk" size="143360" crc="52856df0" sha1="eddcc4deb9da6b81434dd28717a87d676246f035" />
@@ -45851,16 +30597,118 @@ license:CC0-1.0
</part>
</software>
+ <software name="fragcont">
+ <description>Frag! Fragments in Context (4am crack)</description>
+ <year>1987</year>
+ <publisher>The Learning Seed Company</publisher>
+ <info name="programmer" value="Robert Lawrence" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="frag- fragments in context (4am crack).dsk" size="143360" crc="cc833ffb" sha1="73d0e7e3a95d9ab0e316c0decc6637846916da45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frlitzoo_525">
+ <description>Frames: A Reading Comprehension Series: Littletown Zoo (A-292 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-292" />
+ <info name="programmer" value="Eileen M. Nannen" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a292 littletown zoo v1.0 (4am crack) side a.dsk" size="143360" crc="693b6194" sha1="169739e6ba1c3e2dda17605e0005f55aefee6351"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a292 littletown zoo v1.0 (4am crack) side b.dsk" size="143360" crc="b005e0b9" sha1="a8a7c05d100851ecc7a96a558b1172278d07164b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frspacesf_525">
+ <description>Frames: A Reading Comprehension Series: Space Station Freedom (A-290 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-290" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a290 space station freedom v1.0 (4am crack) side a.dsk" size="143360" crc="256e9c8a" sha1="e5111bcc2e277f183d1a50028f5835493537b690"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a290 space station freedom v1.0 (4am crack) side b.dsk" size="143360" crc="9684bba0" sha1="4567ef175018226b78a34447bcbe6647cfe914cc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frvacnat_525">
+ <description>Frames: A Reading Comprehension Series: Vacation Nation Travel (A-291 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-291" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a291 vacation nation travel v1.0 (4am crack) side a.dsk" size="143360" crc="0f8d83db" sha1="dd5099105fd71f79c3ae5f198ae13f30d2bca308"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a291 vacation nation travel v1.0 (4am crack) side b.dsk" size="143360" crc="7b1e19ba" sha1="7c1a9d9cbb79c7a5f29205af7d5ea5fef76b76aa"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="fredpzad">
<description>Freddy's Puzzling Adventures (revision D) (4am crack)</description>
<year>1984</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Ahead Designs" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision D" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="freddy's puzzling adventures (4am crack).dsk" size="143360" crc="396ad123" sha1="db3fc765f6b1e6b016efb6e9b1dab5341e63a1d7" />
@@ -45868,16 +30716,62 @@ license:CC0-1.0
</part>
</software>
+ <software name="freedom_525">
+ <description>Freedom! (A-315 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-315" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="revision 1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a315 freedom v1.0 (4am crack) disk 1.dsk" size="143360" crc="486566f3" sha1="7ee0fa299041f7fc485d67dccae05c927412d8e2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a315 freedom v1.0 (4am crack) disk 2.dsk" size="143360" crc="01525b78" sha1="0b55f67ee57d6bb0a6b87aa029a41dfb7b457767" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frac310">
+ <description>French Achievement III: Grammar (version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="programmer" value="John McIntyre" />
+ <info name="programmer" value="Eric Shank" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="french achievement iii- grammar (4am crack).dsk" size="143360" crc="b4a902c2" sha1="4749364b8debc5819beedaca26797b064c30f495"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="frclword">
<description>French Classroom Words (4am crack)</description>
<year>1982</year>
<publisher>Control Data Corporation</publisher>
<info name="developer" value="Control Data Corporation" />
<info name="usage" value="Requires an Apple ][+ or unenhanced //e." />
- <!--Due to programming errors unrelated to the copy protection, this disk works best on an Apple ][+ or an unenhanced Apple //e. Later models will crash when you try to view a word list.-->
+ <!-- Due to programming errors unrelated to the copy protection, this disk works best on an Apple ][+ or an unenhanced Apple //e. Later models will crash when you try to view a word list. -->
<sharedfeat name="compatibility" value="A2P,A2E" />
- <!--Dump released: 2022-07-07-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="french- classroom words (4am crack).dsk" size="143360" crc="50452a8b" sha1="22beb77efb782bc0d243404b72f35bd0086eed5b" />
@@ -45886,14 +30780,14 @@ license:CC0-1.0
</software>
<software name="frnzflfl">
- <description>Frenzy and Flip Flop (4am crack)</description>
+ <description>Frenzy &amp; Flip Flop (4am crack)</description>
<year>1981</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-18-->
- <!--educational program-->
+ <!-- Dump released: 2017-08-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="frenzy and flip flop (4am crack).dsk" size="143360" crc="e51784ef" sha1="9340c25d1201db70c6883a57d1ec5d19831ff9c2" />
@@ -45901,15 +30795,146 @@ license:CC0-1.0
</part>
</software>
+ <software name="frndolvr">
+ <description>Friends or Lovers (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Alpine Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="friends or lovers (softsmith) (4am and san inc crack).dsk" size="143360" crc="8fad094b" sha1="edde096830d1434c90710ae9011525336b1a399d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="froggerso" cloneof="frogger">
+ <description>Frogger (Sierra On-Line) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="original_publisher" value="On-Line Systems" />
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-01 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="frogger (4am crack).dsk" size="143360" crc="2f85b867" sha1="8e0c597e4f51657874dd72da47e7ec8686c17abc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frogger">
+ <description>Frogger (Main Street Publishing) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Main Street Publishing</publisher>
+ <!-- re-release by Main Street Publishing -->
+ <info name="original_publisher" value="On-Line Systems" />
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-10 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="frogger (main street publishing) (4am crack).dsk" size="143360" crc="091a2a9b" sha1="9c3cc01b39f75fe2aca11f0500e8f732ef8e470f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frogdog1">
+ <description>Frogs, Dogs, Kittens, and Kids 1 (version 10.18.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="10.18.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="frogs, dogs, kittens, and kids 1 (4am crack) disk 1.dsk" size="143360" crc="ab28d4d3" sha1="4d2644e78bb8ef4d6df9ae808861c9c5e5e91a5e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="frogs, dogs, kittens, and kids 1 (4am crack) disk 2.dsk" size="143360" crc="6e24da32" sha1="4076f55cb2563df30b2c4f75a9bece77e54cffd6" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="frogs, dogs, kittens, and kids 1 (4am crack) disk 3.dsk" size="143360" crc="c156dc96" sha1="9965dc051410c7c8b907550dd4b65bbdca07b331" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frogdog2">
+ <description>Frogs, Dogs, Kittens, and Kids 2 (version 10.18.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="10.18.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-23 -->
+ <!-- educational program -->
+ <!-- Disks are labelled as disks 4, 5, and 6, so maybe shipped with Frogs, Dogs, Kittens, and Kids 1 with same version number. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="frogs, dogs, kittens, and kids 2 (4am crack) disk 4.dsk" size="143360" crc="1cd38d23" sha1="b26e4fa8de88f316c734cc3b31b162f58b3df48a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5"/>
+ <dataarea name="flop" size="143360">
+ <rom name="frogs, dogs, kittens, and kids 2 (4am crack) disk 5.dsk" size="143360" crc="296df7a1" sha1="2986e6ff7a47a4c4403bf7070d1960c05f6288fe" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6"/>
+ <dataarea name="flop" size="143360">
+ <rom name="frogs, dogs, kittens, and kids 2 (4am crack) disk 6.dsk" size="143360" crc="76fdae35" sha1="25c0fe6cec9e80d1481f230901f0ea688568b09f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="abc2xyz">
+ <description>From ABC to XYZ (version 02.01.90) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="author" value="Garnet Chappell"/>
+ <info name="programmer" value="Tim Hartley" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="02.01.90" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="from abc to xyz (4am crack).dsk" size="143360" crc="591aca27" sha1="4b44f051064c41fb1ef8e5d2f16484040064496f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="fbegcont">
<description>From The Beginning... Contraception (4am crack)</description>
<year>1985</year>
<publisher>Orange Juice Software Systems</publisher>
- <info name="programmer" value="Rita Houser and Larry Olbrantz" />
+ <info name="programmer" value="Rita Houser" />
+ <info name="programmer" value="Larry Olbrantz" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -45931,10 +30956,10 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1984" />
- <!--version 1984 on title screen-->
+ <!-- version 1984 on title screen -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-01-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fun with directions rev. 2 (4am crack).dsk" size="143360" crc="5efd32bd" sha1="ea0b28a52c860dedc68d116c64a372076535eec9" />
@@ -45949,10 +30974,10 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1986" />
- <!--version 1986 on title screen-->
+ <!-- version 1986 on title screen -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-17-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fun with directions (4am crack).dsk" size="143360" crc="64361419" sha1="ae09410f8217b49d9a68618da63806a0f9bdac38" />
@@ -45960,14 +30985,161 @@ license:CC0-1.0
</part>
</software>
+ <software name="fhbchord">
+ <description>Functional Harmony: Basic Chords (4am crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="functional harmony- basic chords (4am crack).dsk" size="143360" crc="3cf27e56" sha1="c74402014e1fb0d372e925df22eeb0c4f151b21e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhboachr">
+ <description>Functional Harmony: Borrowed and Altered Chords (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="functional harmony- borrowed and altered chords (4am crack).dsk" size="143360" crc="cd53e752" sha1="1bc8a7db008717854b9c1b2493939e533f63e03f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhdia7th">
+ <description>Functional Harmony: Diatonic Seventh Chords (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="functional harmony- diatonic seventh chords (4am crack).dsk" size="143360" crc="d9e14b76" sha1="70cdb71b772f0124901a1efec89663b6ac54277c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhsecdom">
+ <description>Functional Harmony: Secondary Dominants (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="functional harmony- secondary dominants (4am crack).dsk" size="143360" crc="e58f2315" sha1="2b9797450a1ec616aac1de2bf59ecadb37cff0e1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gijoe">
+ <description>G.I. Joe (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Jeff Johannigman" />
+ <info name="programmer" value="Ray Carpenter" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="g.i. joe (4am crack) side a.dsk" size="143360" crc="61f508bf" sha1="ae0e0ca335b5152ace0a9e763f23f9790c30b22c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="g.i. joe (4am crack) side b.dsk" size="143360" crc="10af5953" sha1="76e0c59cb14d9d1ad4ae43cdf502c9d1704be89b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galacadv">
+ <description>Galactic Adventures (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Tom Reamy" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="galactic adventures (4am and san inc crack) disk 1.dsk" size="143360" crc="80965f35" sha1="63f76e541b1133dea7c0e786a80ab0203a37ef4b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="galactic adventures (4am and san inc crack) disk 2.dsk" size="143360" crc="a662f54f" sha1="f07350c1acd2d349b65ae98f0b03925c4d4405e1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galaxiana" cloneof="galaxian">
+ <description>Galaxian (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-08 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="galaxian (atari) (4am crack).dsk" size="143360" crc="b2087527" sha1="06da74bcbe71432bd541ba310a5bde1b72b84dda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galaxian">
+ <description>Galaxian (Thunder Mountain) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="original_publisher" value="Atari" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-12 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="galaxian (thunder mountain) (4am crack).dsk" size="143360" crc="6b23c74a" sha1="3ff5a0d74d193b194ea5b0ddf761034736e18ac6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gamefrm1">
<description>Game Frame One (4am crack)</description>
<year>1986</year>
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-11-16-->
- <!--educational program-->
+ <!-- Dump released: 2015-11-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Shafts and stairs (Bootable)"/>
<dataarea name="flop" size="143360">
@@ -46000,8 +31172,8 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-10-->
- <!--educational program-->
+ <!-- Dump released: 2017-01-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Bowling for scholars (Bootable)"/>
<dataarea name="flop" size="143360">
@@ -46028,6 +31200,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="gameotus">
+ <description>Game of the U.S. (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Cecil Andrews" />
+ <info name="programmer" value="Michael Andrews" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="game of the u.s. (softsmith) (4am and san inc crack).dsk" size="143360" crc="5f7b8fd6" sha1="25d1e5d3d3debbf95ed820654f20690a8d48b35a"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="garftriv">
<description>Garfield Trivia Game (4am crack)</description>
<year>1989</year>
@@ -46035,8 +31224,8 @@ license:CC0-1.0
<info name="developer" value="EIS" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-13-->
- <!--educational game-->
+ <!-- Dump released: 2019-04-13 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="garfield trivia game (4am crack).dsk" size="143360" crc="78031656" sha1="77d620ceffbdcfc894780531e894cb065792ecde" />
@@ -46044,6 +31233,49 @@ license:CC0-1.0
</part>
</software>
+ <software name="gelfadv">
+ <description>Gelfling Adventure (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Michael Macchesney" />
+ <info name="programmer" value="Rae Lynn Macchesney" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="gelfling adventure (4am and san inc crack) side a.dsk" size="143360" crc="f6f4d6c5" sha1="910fdbe541dfa4cad4b1fe4870f22d3a18386bc1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="gelfling adventure (4am and san inc crack) side b.dsk" size="143360" crc="cf0fa125" sha1="4b131e5beb2d1a06b52f743c00eca79eb3d753b3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gemstwar">
+ <description>Gemstone Warrior (version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Paradign Creators" />
+ <info name="programmer" value="Peter W. V. Lount" />
+ <info name="programmer" value="Trouba Gossen" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-03 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gemstone warrior (4am crack).dsk" size="143360" crc="ba9acfd0" sha1="4c47b66f16628bd3e4202923b8c5630f7ee4f29f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="genadvgc">
<description>Genesis: The Adventure Game Creator (4am crack)</description>
<year>1982</year>
@@ -46051,8 +31283,8 @@ license:CC0-1.0
<info name="programmer" value="Salem Pritchett" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-28-->
- <!--geame development utility-->
+ <!-- Dump released: 2023-10-28 -->
+ <!-- geame development utility -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -46074,8 +31306,8 @@ license:CC0-1.0
<info name="programmer" value="Leonard I. Malkin, Ph.D." />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="genetic engineering (4am crack).dsk" size="143360" crc="582d0405" sha1="c68d4b185323493b90432e5ebb33bcb4e726aae1" />
@@ -46090,9 +31322,9 @@ license:CC0-1.0
<info name="programmer" value="Stephen Brown" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-13-->
- <!--Use Filer and Test Generator/Question Writer to create tests on geography.-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-13 -->
+ <!-- Use Filer and Test Generator/Question Writer to create tests on geography. -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Question Writer (Bootable)"/>
<dataarea name="flop" size="143360">
@@ -46147,11 +31379,13 @@ license:CC0-1.0
<description>Geometry Pool and Billiards (4am crack)</description>
<year>1986</year>
<publisher>Intellectual Software</publisher>
- <info name="programmer" value="Alan R. Chap and David A. Sidewater" />
+ <info name="alt_title" value="GEO-Pool and GEO-Billiards" />
+ <info name="programmer" value="Alan R. Chap" />
+ <info name="programmer" value="David A. Sidewater" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-12-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="geometry pool and billiards (4am crack).dsk" size="143360" crc="795f6bd3" sha1="d4a86b14d7c6196f520ba60b599ba86c8d42810f"/>
@@ -46159,16 +31393,71 @@ license:CC0-1.0
</part>
</software>
+ <software name="gareaper">
+ <description>Geometry: Area and Perimeter (4am crack)</description>
+ <year>1986</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="geometry- area and perimeter (4am crack).dsk" size="143360" crc="9eda9409" sha1="a9574f8535a86e7cc0b0cd57c51c4fddaca0e631"/>
+ </dataarea>
+ </part>
+ </software>
+
+
+ <software name="grecreg">
+ <description>Geometry: Rectilinear Regions (4am crack)</description>
+ <year>1987</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="geometry- rectilinear regions (4am crack).dsk" size="143360" crc="9a216e06" sha1="8bd6c17f48143de83be75c52b23fc90aa4c9a279"/>
+ </dataarea>
+ </part>
+ </software>
+
+
+ <software name="geopol90">
+ <description>Geopolitique 1990 (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Bruce A. Ketchledge" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Geopol"/>
+ <dataarea name="flop" size="143360">
+ <rom name="geopolitique 1990 (4am and san inc crack) side a - geopol.dsk" size="143360" crc="6e43a875" sha1="8cee72288cca5ebfc573206e0b64489f5263d392" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Geowar"/>
+ <dataarea name="flop" size="143360">
+ <rom name="geopolitique 1990 (4am and san inc crack) side b - geowar.dsk" size="143360" crc="3c19f5c2" sha1="84331f1cfb7f54ce446e88031d85c1ccfc825dae" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gervocb">
<description>German Vocabulary Builder (4am crack)</description>
<year>1982</year>
<publisher> Control Data Corporation</publisher>
- <info name="developer" value=" Control Data Corporation" />
+ <info name="developer" value="Control Data Corporation" />
<info name="usage" value="Requires an Apple ][+ or unenhanced //e." />
- <!--Due to programming errors unrelated to copy protection, this program will crash on an enhanced Apple //e or later.-->
+ <!-- Due to programming errors unrelated to copy protection, this program will crash on an enhanced Apple //e or later. -->
<sharedfeat name="compatibility" value="A2P,A2E" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="german vocabulary builder (4am crack).dsk" size="143360" crc="99e41c10" sha1="31997ff1850e60a311323b4dd90b2de7c22d0d6e" />
@@ -46180,12 +31469,12 @@ license:CC0-1.0
<description>German Vocabulary Games (version 1.1) (4am crack)</description>
<year>1984</year>
<publisher>Intellectual Software</publisher>
- <info name="programmer" value="Frank Flint " />
+ <info name="programmer" value="Frank Flint" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-21-->
- <!--educational game-->
+ <!-- Dump released: 2016-02-21 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="143360">
@@ -46200,19 +31489,190 @@ license:CC0-1.0
</part>
</software>
+ <software name="germwdorr1" cloneof="germwdor">
+ <description>German Word Order (revision 1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Steve Mohler" />
+ <info name="programmer" value="Goetz Seifert" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="german word order (4am crack).dsk" size="143360" crc="acdab126" sha1="e2e9d4d71115899aa38c49292cd21c4c0f9dec6b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="germwdor">
+ <description>German Word Order (revision 2) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Steve Mohler" />
+ <info name="programmer" value="Goetz Seifert" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This revision has different copy protection and other unspecified changes. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="german word order rev. 2 (4am crack).dsk" size="143360" crc="87b4e49e" sha1="8a0bf71300112118088a93360aa84243eb4b9ca0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertpuzz10" cloneof="gertpuzz">
+ <description>Gertrude's Puzzles (version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's puzzles 1.0 (4am crack).dsk" size="143360" crc="d9511af5" sha1="6f99bb857b392f8dd58030b5464ef2ce19f96932" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertpuzz11" cloneof="gertpuzz">
+ <description>Gertrude's Puzzles (version 1.1) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's puzzles 1982 (4am and san inc crack).dsk" size="143360" crc="4584488c" sha1="3bb9f19e91b62935cf95c559fd683e08033dc532"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertpuzz">
+ <description>Gertrude's Puzzles (version 1.2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's puzzles 1.2 (4am crack).dsk" size="143360" crc="5f794fa0" sha1="3b65f8e778dc7dd61ae64d6780d298474a1955a3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec10" cloneof="gertsec">
+ <description>Gertrude's Secrets (version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's secrets 1.0 (4am crack).dsk" size="143360" crc="969de34c" sha1="53f470ec6d1e31844c2433d7546a5d3965a0dbaa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec11" cloneof="gertsec">
+ <description>Gertrude's Secrets (version 1.1) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's secrets 1982 (4am and san inc crack).dsk" size="143360" crc="0d53b68c" sha1="1ae15f7b76b4324f979c533b67aa63ab9169b631"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec12" cloneof="gertsec">
+ <description>Gertrude's Secrets (version 1.2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's secrets (4am crack).dsk" size="143360" crc="a8602d95" sha1="281f09574ca6be91f52182da51429487de6c770d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec">
+ <description>Gertrude's Secrets (version 1.3) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gertrude's secrets 1.3 (4am crack).dsk" size="143360" crc="98652042" sha1="881cac9cb46e7d38df878875b242fbb84e909a46" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kidwrtrg" cloneof="kidwrtr">
<description>Geschichten-schreiber Level I, II (German) (4am crack)</description>
- <!--German version of KidWriter - Translates to Stories Writer-->
+ <!-- German version of KidWriter - Translates to Stories Writer -->
<year>1985</year>
<publisher>Spinnaker Software</publisher>
<info name="alt_title" value="KidWriter" />
<info name="developer" value="Gessler Software" />
- <info name="programmer" value="Jim Pejsa and Jack Pejsa" />
- <info name="usage" value="Runs on any Apple ][+ or later" />
+ <info name="programmer" value="Jim Pejsa" />
+ <info name="programmer" value="Jack Pejsa" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="version 1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-08-03-->
- <!--educational program-->
+ <!-- Dump released: 2019-08-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kidwriter (german level i, ii) (4am crack).dsk" size="143360" crc="122e4098" sha1="94a07dd053f198b02cd2dbf6b62964a64d806516" />
@@ -46220,16 +31680,99 @@ license:CC0-1.0
</part>
</software>
+ <software name="gt2point">
+ <description>Get to the Point (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="get to the point (4am crack).dsk" size="143360" crc="8a844d12" sha1="56570db68370579bb94f46915ab415586756d41d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="getwellw">
+ <description>Get Well, Woolly! (A-351 version 1.0) (4am crack)</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="language" value="English" />
+ <info name="language" value="Spanish" />
+ <info name="partno" value="A-351" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Claudio Valenzeula" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a351 get well, woolly v1.0 (4am crack).dsk" size="143360" crc="f0caed04" sha1="7ddb645d13c7046d548700a188fb35687347e2b0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rdyreadadd">
+ <description>Getting Ready to Read and Add (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="developer" value="Softcole" />
+ <info name="programmer" value="Marjorie Cole" />
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="getting ready to read and add (4am crack).dsk" size="143360" crc="6150a8a8" sha1="b8a8d8e9f6eeeeb70e53c2c21b2409c269933549" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gtysburg10">
+ <description>Gettysburg: The Turning Point (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="gettysburg - the turning point (4am crack) side a.dsk" size="143360" crc="26a53290" sha1="309bd7e30750765700b2cab3fe442c48a1d1e190" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="gettysburg - the turning point (4am crack) side b.dsk" size="143360" crc="62372db7" sha1="f5e13ee7ffa10c241f55818371232bf29b05b5e4" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="glidepth">
<description>Glidepath (version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>HRM Software</publisher>
- <info name="programmer" value="D. Morrison and J. Hanson" />
+ <info name="programmer" value="D. Morrison" />
+ <info name="programmer" value="J. Hanson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="glidepath (4am crack).dsk" size="143360" crc="8392e743" sha1="3b8325d3122031a39bbe240cccc4a1cd03bb9d81" />
@@ -46237,6 +31780,39 @@ license:CC0-1.0
</part>
</software>
+ <software name="gneenotg">
+ <description>Gnee or Not Gnee (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Todd Rosedahl" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gnee or not gnee (4am crack).dsk" size="143360" crc="76379016" sha1="c2257c5fdacc6b4c44d52cd053aee225fd7a59fb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gohayden">
+ <description>Go (Hayden Book Company) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Stan Erwin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-27 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="go (4am crack).dsk" size="143360" crc="014b2a73" sha1="70a43566885d69bfe902a21103341a431da731a6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="go2headclmb" cloneof="go2headcl">
<description>Go To The Head Of The Class (4am crack)</description>
<year>1984</year>
@@ -46244,8 +31820,8 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-18-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="go to the head of the class (4am crack).dsk" size="143360" crc="f26cafd1" sha1="47a49f705f82651e85cbf24e82214740fe284e75" />
@@ -46261,8 +31837,8 @@ license:CC0-1.0
<info name="original_publisher" value="Milton Bradley" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="go to the head of the class (media materials release) (4am crack).dsk" size="143360" crc="e6d5b53c" sha1="6e6a1351d26e18509d7280c56531adbcb26bc066" />
@@ -46278,10 +31854,10 @@ license:CC0-1.0
<info name="original_publisher" value="Milton Bradley" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1989" />
- <!--Sold to Queue with updated copy protection. There are few, if any, changes to the gameplay.-->
+ <!-- Sold to Queue with updated copy protection. There are few, if any, changes to the gameplay. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-01-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="go to the head of the class 1989 (4am crack).dsk" size="143360" crc="06a8b9f0" sha1="2ea6fb3fd16e9e36bb4c3d4ac6430f19dc111c7b" />
@@ -46296,8 +31872,8 @@ license:CC0-1.0
<info name="programmer" value="Olaf Lubeck" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-05-->
- <!--action game-->
+ <!-- Dump released: 2022-07-05 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="gobbler (4am and san inc crack).dsk" size="143360" crc="b67aa550" sha1="1ba8d6730eff137acc36cefea71a48b52f3df001" />
@@ -46306,14 +31882,14 @@ license:CC0-1.0
</software>
<software name="golfccbar">
- <description>Golf Classic and Compubar (4am crack)</description>
+ <description>Golf Classic &amp; Compubar (4am crack)</description>
<year>1982</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="golf classic and compubar (4am crack).dsk" size="143360" crc="6ef52a19" sha1="00be3cd473d2d45a0b2a0a100e9ab19aca37a3a3" />
@@ -46321,6 +31897,202 @@ license:CC0-1.0
</part>
</software>
+ <software name="grademan10" cloneof="grademan">
+ <description>Grade Manager (A-771 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-771" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a771 grade manager v1.0 (4am crack).dsk" size="143360" crc="1f0cceb8" sha1="94ed0423a501d08c79fcd2a6b5ace54011a3ebbb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grademan11" cloneof="grademan">
+ <description>Grade Manager (A-771 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-771" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a771 grade manager v1.1 (4am crack).dsk" size="143360" crc="097881f2" sha1="2dfe3d73f9af3382c2c799f2883942e08706d80a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grademan">
+ <description>Grade Manager (A-771 version 1.2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-771" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a771 grade manager v1.2 (4am crack).dsk" size="143360" crc="6deb61e4" sha1="aa7f3c278a75cbbf878b8568d31d4685777f0153" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grademanr21" cloneof="grademanr">
+ <description>Grade Manager: Revised Edition (A-771 version 2.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-771" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a771 grade manager revised edition v2.1 (4am crack).dsk" size="143360" crc="216edff1" sha1="bc7366747266e64bb458f22586f9483db00a9030"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grademanr22" cloneof="grademanr">
+ <description>Grade Manager: Revised Edition (A-771 version 2.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-771" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a771 grade manager revised edition v2.2 (4am crack).dsk" size="143360" crc="dae6b6d6" sha1="c31e60aab48a8a9a48cc2832a320a03cb4c0b252"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grademanr">
+ <description>Grade Manager: Revised Edition (A-771 version 2.3) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-771" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a771 grade manager revised edition v2.3 (4am crack).dsk" size="143360" crc="47e2cf7e" sha1="3ee1d263b2a77416b5324d1385bd242fa224d229"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gramgrem86" cloneof="gramgrem">
+ <description>Grammar Gremlins (version 1986) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-04-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="grammar gremlins (4am crack) side a.dsk" size="143360" crc="6c8489fa" sha1="38428a2f090900660fa4ff581e770004b71ad801" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="grammar gremlins (4am crack) side b.dsk" size="143360" crc="b07ee7b3" sha1="0c4171e8a85bd5627a8c3a25da4c29cc68c2038b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gramgrem87" cloneof="gramgrem">
+ <description>Grammar Gremlins (version 1987) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-10 updated image from new source to fix xom minor data corruption on side A, track $1C. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="grammar gremlins 1987 (4am crack) side a.dsk" size="143360" crc="31adc94a" sha1="40527334a0d59281b6559f2464018fae8fc807ac" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="grammar gremlins 1987 (4am crack) side b.dsk" size="143360" crc="21e242be" sha1="1f922b9c30bea0d4a9e2bdbdb66d67da8bd361f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gramgrem">
+ <description>Grammar Gremlins (version 1987) (800K 3.5") (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="grammar gremlins 800k (4am crack).2mg" size="819264" crc="25af0038" sha1="46364f5894b81cb3dce4efa3397ddaef35a6d75f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grmrmch1">
+ <description>Grammar Mechanics Level 1 (4am crack)</description>
+ <year>1988</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="grammar mechanics level 1 (4am crack) side a.dsk" size="143360" crc="15d7ba0a" sha1="ac51b9f464f2d1bacb6fab26985895684dfebc04" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="grammar mechanics level 1 (4am crack) side b.dsk" size="143360" crc="0ff30165" sha1="31222d63f82d458976e7e7b3a4abaaef9ae53298" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="grbblsadjadv">
<description>Grammar: Building Better Language Skills: Adjectives and Adverbs (4am crack)</description>
<year>1991</year>
@@ -46328,8 +32100,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="grammar- building better language skills- adjectives and adverbs (4am crack).dsk" size="143360" crc="b0d3fdbc" sha1="30784d416f80f06e5d2bda1f2d8b5ffcac6b2db1" />
@@ -46344,8 +32116,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="grammar- building better language skills- nouns (4am crack).dsk" size="143360" crc="b9eff43a" sha1="8616d1337b068100bd958e079202cacf9b3e9806" />
@@ -46360,8 +32132,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="grammar- building better language skills- sentences (4am crack).dsk" size="143360" crc="30c92911" sha1="92639f11206a3b22b96b5ea39be4266d3968146b" />
@@ -46376,8 +32148,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="grammar- building better language skills- verbs (4am crack).dsk" size="143360" crc="8681942e" sha1="eb069aea48e455e933e4aac9fd6e5050381e1c8a" />
@@ -46389,11 +32161,13 @@ license:CC0-1.0
<description>Grandma's House (4am crack)</description>
<year>1984</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Nicholas Scarim, Arlene Boehm, Mike Riedel" />
+ <info name="programmer" value="Nicholas Scarim" />
+ <info name="programmer" value="Arlene Boehm" />
+ <info name="programmer" value="Mike Riedel" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-10-17-->
- <!--educational program-->
+ <!-- Dump released: 2020-10-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="grandma's house (4am crack).dsk" size="143360" crc="ce2d4423" sha1="94ca7fe043b24504e8e8806de97fa360d149b3e0"/>
@@ -46408,8 +32182,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-10-17-->
- <!--educational program-->
+ <!-- Dump released: 2016-10-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="granny applebee's cookie factory (4am crack).dsk" size="143360" crc="07234fbd" sha1="18b9bdc16e7c5adde81a1eccff10791a1c7ff9bf" />
@@ -46417,16 +32191,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="graphmkr">
+ <description>Graph Maker: Introduction to Graphs and Charts (4am crack)</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="graph maker (4am crack).dsk" size="143360" crc="9d72fa98" sha1="2b478a8b410d6e759cd30d2d113f801dd3cb1516" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="grphcalc">
<description>Graphics Calculator (version 1.6) (4am crack)</description>
<year>1988</year>
<publisher>CONDUIT Educational Software</publisher>
- <info name="programmer" value="Michael Konemann, Dennis Mick, Gerald Isaacs, and Richard O'Farrell" />
+ <info name="programmer" value="Michael Konemann" />
+ <info name="programmer" value="Dennis Mick" />
+ <info name="programmer" value="Gerald Isaacs" />
+ <info name="programmer" value="Richard O'Farrell" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<info name="version" value="1.6" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-05-09-->
- <!--educational program-->
+ <!-- Dump released: 2022-05-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program disk"/>
<dataarea name="flop" size="143360">
@@ -46447,6 +32243,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="grphconv">
+ <description>Graphics Converter (4am crack)</description>
+ <year>1990</year>
+ <publisher>Pelican Software</publisher>
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Herb Perez" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-04 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="graphics converter (4am crack) side a.dsk" size="143360" crc="d9da1eea" sha1="ce2f7cbc94914a6389fd2bed09f04fdfdb2765a4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="graphics converter (4am crack) side b.dsk" size="143360" crc="5a7fb582" sha1="fd0d6d62c5c8058282fb04088dc2da5b29df73dd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="graphing10" cloneof="graphing">
<description>Graphing (A-817 version 1.0) (4am crack)</description>
<year>1983</year>
@@ -46455,8 +32277,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--education program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a817 graphing v1.0 (4am crack).dsk" size="143360" crc="f048b6c7" sha1="b24a1ba19cb4a6190073753cb1e66e2960fa626c" />
@@ -46472,8 +32294,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-09-->
- <!--education program-->
+ <!-- Dump released: 2017-06-09 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a817 graphing v1.2 (4am crack).dsk" size="143360" crc="65dd0974" sha1="538f5affa1d2effd6820940b7806187b0e81eae0" />
@@ -46485,12 +32307,13 @@ license:CC0-1.0
<description>Graphing Equations (version 1.3) (4am crack)</description>
<year>1985</year>
<publisher>CONDUIT Educational Software</publisher>
- <info name="programmer" value="Sharon Dugdale and David Kibbey" />
+ <info name="programmer" value="Sharon Dugdale" />
+ <info name="programmer" value="David Kibbey" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="graphing equations v1.3 (4am crack).dsk" size="143360" crc="9b433c2d" sha1="285895744df3e991ebc26d87af55531a6a01d332" />
@@ -46498,15 +32321,35 @@ license:CC0-1.0
</part>
</software>
+ <software name="grphlnfc">
+ <description>Graphing Linear Functions (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="developer" value="Microcomputer Workshops Courseware" />
+ <info name="programmer" value="Don Ross" />
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-04-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="graphing linear functions (4am crack).dsk" size="143360" crc="c47060a2" sha1="9f634221a056f569829cf1f1e32423815864a000" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gtampres">
<description>Great America: Presidents (4am crack)</description>
<year>1984</year>
<publisher>Daystar Learning</publisher>
- <info name="programmer" value=" Kevin Armstrong and Janet Joers" />
+ <info name="programmer" value="Kevin Armstrong" />
+ <info name="programmer" value="Janet Joers" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-07-27-->
- <!--educational program-->
+ <!-- Dump released: 2016-07-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="great america - presidents (4am crack).dsk" size="143360" crc="47ba142a" sha1="fefe0808af55ae89262ac06fca83c2d94bd03904" />
@@ -46514,15 +32357,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="grglobge">
+ <description>Green Globs and Graphing Equations (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Sharon Dugdale" />
+ <info name="programmer" value="David Kibbey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="green globs and graphing equations (4am crack).dsk" size="143360" crc="949b5a00" sha1="5c4453baf8d2eb89ee8a403c042861e36a219765"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="greetcrd">
<description>Greeting Card Maker (4am crack)</description>
<year>1986</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Michael Feinberg, Hilary Mills, Steve Snyder, Karen Elliott,&#xA; Barbara McCosh, Louisa Leary,&#xA; Sheila Lucas, Phil Cassel, Paula Polley and Richard Pels" />
+ <info name="programmer" value="Michael Feinberg" />
+ <info name="programmer" value="Hilary Mills" />
+ <info name="programmer" value="Steve Snyder" />
+ <info name="programmer" value="Karen Elliott" />
+ <info name="programmer" value="Barbara McCosh" />
+ <info name="programmer" value="Louisa Leary" />
+ <info name="programmer" value="Sheila Lucas" />
+ <info name="programmer" value="Phil Cassel" />
+ <info name="programmer" value="Paula Polley" />
+ <info name="programmer" value="Richard Pels" />
<info name="usage" value="Requires an Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-04-26. Redumped: 2023-10-08-->
- <!--graphics program-->
+ <!-- Dump released: 2015-04-26. Redumped: 2023-10-08 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -46537,16 +32406,140 @@ license:CC0-1.0
</part>
</software>
+ <software name="gremlins">
+ <description>Gremlins (Atarisoft) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-07 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gremlins (4am crack).dsk" size="143360" crc="72059242" sha1="02f4609e5d795e2cfa1cf4ebb55f32f698169f1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="growginfr10" cloneof="growginfr">
+ <description>Growgins' Fractions (A-773 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-773" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Mike Boucher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a773 growgins' fractions v1.0 (4am crack).dsk" size="143360" crc="71152c63" sha1="10d2b34c53346e714bbb7ebf5874d5ca8196cd8f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="growginfr">
+ <description>Growgins' Fractions (A-773 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-773" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Mike Boucher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a773 growgins' fractions v1.1 (4am crack).dsk" size="143360" crc="854d84b5" sha1="d70f6b66ea586afd0b7ea44b03dba3f29c7927a8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guadcmp10" cloneof="guadcmp">
+ <description>Guadalcanal Campaign (version 1.0) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="guadalcanal campaign v1.0 (4am and san inc crack).dsk" size="143360" crc="a1912f25" sha1="302dfe3086242aed0e3a3244f88e85413e934996" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guadcmp">
+ <description>Guadalcanal Campaign (version 1.1) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="version 1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="guadalcanal campaign v1.1 (4am and san inc crack).dsk" size="143360" crc="3ad69df8" sha1="474e1ff69c7c5cb48f192417beab90f62d210a23" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guardian">
+ <description>Guardian (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Continental Software" />
+ <info name="programmer" value="Tom and Jerry" />
+ <info name="usage" value="Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="guardian (softsmith) (4am and san inc crack).dsk" size="143360" crc="4efd71e5" sha1="e81562c6b8866d5a5d3c0235b4c800d0d4754811"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guidedele">
+ <description>Guide de l'Enseignant (French) (A-787 version 1.4) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="language" value="French" />
+ <info name="partno" value="A-787" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a787 guide de l'enseignant v1.4 (4am crack).dsk" size="143360" crc="bee8947d" sha1="59ad6c2eb678b4e5d2b957ae60e58f5152ec0099" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="guitarwiz11601" cloneof="guitarwiz">
<description>Guitar Wizard (version 11601) (4am crack)</description>
<year>1986</year>
<publisher>Baudville</publisher>
<info name="developer" value="Baudville" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="partno" value="11601" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="11601" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-04-07-->
- <!--sound utility-->
+ <!-- Dump released: 2018-04-07 -->
+ <!-- sound utility -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="guitar wizard (4am crack).dsk" size="143360" crc="e1806397" sha1="383476f33f1d0f2f82f6927d2002229b8493baf3" />
@@ -46559,11 +32552,12 @@ license:CC0-1.0
<year>1986</year>
<publisher>Baudville</publisher>
<info name="developer" value="Baudville" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="partno" value="11611" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="11611" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-25-->
- <!--sound utility-->
+ <!-- Dump released: 2023-03-25 -->
+ <!-- sound utility -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="guitar wizard v11611 (4am crack).dsk" size="143360" crc="9f6a2668" sha1="b8c2f00f9e9d8c58285f8f153d0023b9be369328" />
@@ -46572,14 +32566,14 @@ license:CC0-1.0
</software>
<software name="gulparrg">
- <description>Gulp!! and Arrow Graphics (4am crack)</description>
+ <description>Gulp!! &amp; Arrow Graphics (4am crack)</description>
<year>1982</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="gulp and arrow graphics (4am crack).dsk" size="143360" crc="e3003b93" sha1="09b330b79955f2d327c4d879d34e79d85033ec92" />
@@ -46588,14 +32582,14 @@ license:CC0-1.0
</software>
<software name="gulpfrnz">
- <description>Gulp!! and Frenzy (4am crack)</description>
+ <description>Gulp!! &amp; Frenzy (4am crack)</description>
<year>1982</year>
<publisher>Milliken Publishing Company</publisher>
<info name="programmer" value="William H. Kraus" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-03-01-->
- <!--educational program-->
+ <!-- Dump released: 2016-03-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="gulp and frenzy (4am crack).dsk" size="143360" crc="1b121240" sha1="418d5d8625802c038a0702972939bb2b90b1a0e6" />
@@ -46603,16 +32597,33 @@ license:CC0-1.0
</part>
</software>
+ <software name="gumball">
+ <description>Gumball (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Veda Hlubinka-Cook credited as Robert Cook" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-06-08 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="gumball (4am and san inc crack).dsk" size="143360" crc="ca1dde79" sha1="76bf52bf011442f01414976d706514ef21999354" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="halftime">
<description>Half Time: Computerized Charting for Marching Bands (version 2.0) (4am crack)</description>
<year>1984</year>
<publisher>Wenger Corp.</publisher>
- <info name="programmer" value="Allen Goodwin, Ph.D. and J. Steven Moore, M.M." />
+ <info name="programmer" value="Allen Goodwin, Ph.D." />
+ <info name="programmer" value="J. Steven Moore, M.M." />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-06-->
- <!--productivity program-->
+ <!-- Dump released: 2022-07-06 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="half time v2.0 (4am crack).dsk" size="143360" crc="3248b480" sha1="5acdd0a83802350ce7d0f7e144e6310856fcc2a1" />
@@ -46620,15 +32631,49 @@ license:CC0-1.0
</part>
</software>
+ <software name="hndbasic">
+ <description>Hands on BASIC Programming (version 1.0 25-Feb-83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Edu-Ware Services</publisher>
+ <info name="programmer" value="Neil Bennett, Ph.D." />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <info name="version" value="version 1.0 25-Feb-83" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="hands on basic programming (4am crack).dsk" size="143360" crc="73839657" sha1="8c4b61a006fe751b3304fe59c5df2b6a51c4ab9f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hardhatmcc" cloneof="hardhatm">
+ <description>Hard Hat Mack (hardcore computist based crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Michael Abbot" />
+ <info name="programmer" value="Matthew Alexander" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="hard hat mack clean crack.dsk" size="143360" crc="eb4733c7" sha1="32e01bbc99ac6c71fbcd424b9259624699dee5bf" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hardhatm">
<description>Hard Hat Mack (4am and san inc crack)</description>
<year>1983</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Michael Abbot and Matthew Alexander" />
+ <info name="programmer" value="Michael Abbot" />
+ <info name="programmer" value="Matthew Alexander" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-08-18-->
- <!--action game-->
+ <!-- Dump released: 2023-08-18 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="hard hat mack (4am and san inc crack).dsk" size="143360" crc="17421a67" sha1="aef7483a80fb40632fe930b7fcecbe41d32e3ee5" />
@@ -46636,15 +32681,149 @@ license:CC0-1.0
</part>
</software>
+ <software name="harvprim">
+ <description>Harvey by Primes (4am crack)</description>
+ <year>1984</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Scott Rackey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="harvey by primes (4am crack).dsk" size="143360" crc="53b86cdc" sha1="ff3465d702503a32d55a3e45106f9bdee99bfba0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hlthimmrk">
+ <description>Health Immunization Record Keeping (A-761 version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-761" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-02 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a761 health immunization v1.1 (4am crack).dsk" size="143360" crc="44707bce" sha1="3d8db5ff22779a6bdb424de9c3ad5a4f7178ccd1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hmv2ass">
+ <description>Health Maintenance Volume 2: Assessment (A-751 version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-751" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="programmer" value="Craig W. Copley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a751 health maintenance volume 2 - assessment v1.0 (4am crack).dsk" size="143360" crc="5bc251cf" sha1="b35a6b6cc1171f3d0468f80507639ec0ffbe3d3a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpdesascin">
+ <description>Hear Today... Play Tomorrow: Descending/Ascending Intervals (4am crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="descending-ascending intervals (4am crack).dsk" size="143360" crc="bbef08f0" sha1="81ac265fa435ba0c233430153a5894adc8c74f97"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpeartrsk">
+ <description>Hear Today... Play Tomorrow: Ear Training Skills (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ear training skills (4am crack).dsk" size="143360" crc="9f6b1e92" sha1="e2aaf6b3c48977619dfb5f6d54f2fd83002024fc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpfdtune">
+ <description>Hear Today... Play Tomorrow: Find That Tune (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="find that tune (4am crack).dsk" size="143360" crc="2cd7a442" sha1="edb20db5603062cb063a16709665cfb1b4e95887"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpmdbegl">
+ <description>Hear Today... Play Tomorrow: Melodic Dictation Beginning Level (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="melodic dictation - beginning level (4am crack).dsk" size="143360" crc="d943a185" sha1="e31e6466f4ace7748d9ee2ca6675612019c8346b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpmdintl">
+ <description>Hear Today... Play Tomorrow: Melodic Dictation Intermediate Level (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="melodic dictation - intermediate level (4am crack).dsk" size="143360" crc="8c32f0b7" sha1="25ddf535414a286cb1b0f791d85c4f1e539e8126"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="heydidle">
<description>Hey Diddle Diddle! (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Dale Disharoon and Robin Bush" />
+ <info name="programmer" value="Dale Disharoon" />
+ <info name="programmer" value="Robin Bush" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-01-26-->
- <!--educational game-->
+ <!-- Dump released: 2015-01-26 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="hey diddle diddle (4am crack).dsk" size="143360" crc="b81de700" sha1="eb31e30106af24c5a5154aff1e7261124e0f19ab" />
@@ -46652,6 +32831,244 @@ license:CC0-1.0
</part>
</software>
+ <software name="hwirelgc85" cloneof="hwirelgc">
+ <description>High Wire Logic (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="high wire logic (4am crack).dsk" size="143360" crc="6280d758" sha1="81b69cbcf55fe718dd9085703aee7d8df50ab32d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hwirelgc">
+ <description>High Wire Logic (version 1990) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="high wire logic rev. 2 (4am crack).dsk" size="143360" crc="3459e5d2" sha1="e8c420e89c805735997bc716fe2926bd13783c4c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra0mast">
+ <description>Hi-Res Adventure #0: Mission: Asteroid (4am and san inc crack)</description>
+ <year>1980</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mission asteroid (4am and san inc crack).dsk" size="143360" crc="a9c9e1ab" sha1="006865ece389e8daa676de7365eed76ece64726a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra1mysh">
+ <description>Hi-Res Adventure #1: Mystery House (4am crack)</description>
+ <year>1980</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mystery house (4am crack).dsk" size="143360" crc="4d76e0bc" sha1="d32eba44cbe43ed43bb73643903c777fbb9cbf59" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra3cman">
+ <description>Hi-Res Adventure #3: Cranston Manor (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Harold DeWitz" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="cranston manor (4am and san inc crack).dsk" size="143360" crc="814e2e10" sha1="69c0f1d75d96eff41592fed5aeafbbb1c8efb625" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra4ulygf">
+ <description>Hi-Res Adventure #4: Ulysses and the Golden Fleece (version 1.1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Bob Davis" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ulysses and the golden fleece v1.1 (4am crack) side a.dsk" size="143360" crc="bd40780c" sha1="1d95b3b621e4a8bd118cfd810c0a5b6f6c83cd14"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ulysses and the golden fleece v1.1 (4am crack) side b.dsk" size="143360" crc="3fc83c7f" sha1="78b50cc5acb57fec58900426b6bd2b0b87b3b2a6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra5timez">
+ <description>Hi-Res Adventure #5: Time Zone (version 1.1) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Bob Davis" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Terry Pierce" />
+ <info name="programmer" value="Michelle Pritchard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-06 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk a.dsk" size="143360" crc="b613e4e5" sha1="e31aa249afedee4462ff52cc18b18a034b6d3bd8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk b.dsk" size="143360" crc="cd4a65ab" sha1="e6b4cc45c8947528e7c628ce666ffc1d47e25ef7" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk c.dsk" size="143360" crc="2c11b11f" sha1="b248a33e6adab6591fdf40469afe511dfc56add6" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk d.dsk" size="143360" crc="8544f893" sha1="8d7635cff5d6732445d822094b8cf454d03646af" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk E"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk e.dsk" size="143360" crc="c6a89f40" sha1="b2273fc9939edfcc71c1cfff8803ce2a7c26cf7c" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk F"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk f.dsk" size="143360" crc="e4399a48" sha1="c3b85016873e0fdc15a74d9df07cc9968d61f5eb" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk G"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk g.dsk" size="143360" crc="cef92006" sha1="23304e1f8cccbd376b2c54546d24b61df6c8d3b2" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk H"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk h.dsk" size="143360" crc="a7eab342" sha1="bc223f79e00d1f23975b6caf3299da18b91a2807" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk i.dsk" size="143360" crc="3309c2d8" sha1="ab5adb3720fcdf5150fa3b3e729f357c08a998da" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk J"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk j.dsk" size="143360" crc="dddb0bbc" sha1="e9aa856fe45df6be8792258431840b1f0428d48e" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk K"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk k.dsk" size="143360" crc="90d644b0" sha1="892e9962d254a4d734a4e4c1c0cc5ae862aa3f68" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk L"/>
+ <dataarea name="flop" size="143360">
+ <rom name="time zone (4am and san inc crack) disk l.dsk" size="143360" crc="bd01c290" sha1="6ead97afa9cba6701ed90db1f4d2328aa3789391" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra6darkc">
+ <description>Hi-Res Adventure #6: The Dark Crystal (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the dark crystal (4am and san inc crack) disk 1a.dsk" size="143360" crc="c7b5b770" sha1="8e4ea902267057fb6d268d2e7fdc9ad2afd94ad6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the dark crystal (4am and san inc crack) disk 1b.dsk" size="143360" crc="f2726e17" sha1="867f6af97bb848e98d5d1dfb396eca4330df0034" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the dark crystal (4am and san inc crack) disk 2a.dsk" size="143360" crc="3aed0b89" sha1="9db31bc4e22474d6a5da8899c51146d9d2d6a858" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the dark crystal (4am and san inc crack) disk 2b.dsk" size="143360" crc="a3ce1109" sha1="dbb2dbcca7e2892f00d920b346627424a587518f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hrcmgolf">
<description>Hi-Res Computer Golf (version 1) (4am crack)</description>
<year>1981</year>
@@ -46660,8 +33077,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-06-->
- <!--sports game-->
+ <!-- Dump released: 2015-07-06 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="hi-res computer golf (4am crack).dsk" size="143360" crc="42698120" sha1="5ac2b8f13d876409d1cdf0adfd4639a65a6a9758" />
@@ -46669,14 +33086,120 @@ license:CC0-1.0
</part>
</software>
+ <software name="highrise">
+ <description>High Rise (4am crack)</description>
+ <year>1983</year>
+ <publisher>Micro Learn</publisher>
+ <info name="programmer" value="Joe Calabrese" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="high rise (4am crack).dsk" size="143360" crc="9d3253da" sha1="5fb49d07f25a52c33281899409c7c19a93480d30" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hsmathc1">
+ <description>High School Math Competency Series Part I (version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <!-- disk label says 1984, but title screen says 1982 -->
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Celia Keenholtz" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="high school math competency series part i (4am crack).dsk" size="143360" crc="18fe6edc" sha1="971c6e00871fd18dddba51d05eb84aa037a64442" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hsmathc2">
+ <description>High School Math Competency Series Part II (version 1.0) (4am crack)</description>
+ <year>1982</year>
+ <!-- disk label says 1984, but title screen says 1982 -->
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Celia Keenholtz" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="high school math competency series part ii (4am crack).dsk" size="143360" crc="6c2b5411" sha1="a0e1cef1c39b6c654101b377140fc67dd2b4da4b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="highstks">
+ <description>High Stakes (4am crack)</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Dick Francis"/>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-05. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="high stakes (4am crack).dsk" size="143360" crc="0bc2e5c0" sha1="f36fc527412d2aada288a8e508f3266ec593f19e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="histmake_525">
+ <description>History Makers (A-313 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-313" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Ju-Chang wang" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a313 history makers v1.0 (4am crack).dsk" size="143360" crc="ffde0a65" sha1="5f3cd5deafc8437818938c806f77bc25e1f790f5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homerow">
+ <description>Home Row (version 10.12.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="David Eisenstat" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="10.12.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="home row (4am crack).dsk" size="143360" crc="3218d79e" sha1="560872a5d26482fccc2f733c4618e773c33ce1f6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hhlprwr">
<description>Homework Helper: Writing (4am crack)</description>
<year>1985</year>
<publisher>Spinnaker Software</publisher>
<info name="usage" value="Runs on any Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-05-22-->
- <!--educational program-->
+ <!-- Dump released: 2014-05-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -46715,6 +33238,262 @@ license:CC0-1.0
</part>
</software>
+ <software name="homewrtr">
+ <description>Homework Writer (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Gwen Solomon" />
+ <info name="programmer" value="Philip Miller" />
+ <info name="programmer" value="Betsy Gitelle" />
+ <info name="programmer" value="Dave Bowman" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-20 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homework writer (4am crack) side a.dsk" size="143360" crc="9f679792" sha1="b4a8db1ec71e52049f5f06f51cc4587b2022c4e3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homework writer (4am crack) side b.dsk" size="143360" crc="aeb2abe1" sha1="786f32a81eada81297f0c93c5525bdede2a7ffbe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hwrkr21">
+ <description>Homeworker (version 2.1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Mike Albanese" />
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Jennett" />
+ <info name="programmer" value="Dean Ellis" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homeworker 2.1 (4am crack) side a.dsk" size="143360" crc="90528b80" sha1="b41be732233cf3f68cd57e33b8db7a09cdb36a5f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homeworker 2.1 (4am crack) side b.dsk" size="143360" crc="fffef64d" sha1="4180e3eb65d555d4a8740b36de401a9db530d740" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homonyms82" cloneof="homonyms">
+ <description>Homonyms (version 1982) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1982" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms (4am crack).dsk" size="143360" crc="5a3b51de" sha1="d9492fe9dcbe7e4f521eb72bb5003c68d2342de3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homonyms090487" cloneof="homonyms">
+ <description>Homonyms (version 09.04.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.04.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-13 -->
+ <!-- educational program -->
+ <!-- missing disk 1 -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms v09.04.87 (4am crack) disk 1.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms v09.04.87 (4am crack) disk 2.dsk" size="143360" crc="c3dee060" sha1="b33b2f16aca642fc2a5ef6bbc8f24d0f5a467f73" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homonyms">
+ <description>Homonyms (version 01.19.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.19.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms v01.19.89 (4am crack) disk 1.dsk" size="143360" crc="5b3bd83f" sha1="fcd92a3374ac2e22a2433a612ae7521adf9295d4"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms v01.19.89 (4am crack) disk 2.dsk" size="143360" crc="05423e27" sha1="56bbd84231363aacf8c109e0a8f068c99436b5a6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhmnyms1r1" cloneof="mhmnyms1">
+ <description>Homonyms I (revision 1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms i (4am crack).dsk" size="143360" crc="8a55c096" sha1="68f4be124db8cf02d5c020e8c3861997b8dde236" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhmnyms1">
+ <description>Homonyms I (revision 2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Revised edition features bug fixes and updated copy protection. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms i rev. 2 (4am crack).dsk" size="143360" crc="9681d4b6" sha1="1deb93a2be7d78d848c4def9bb319b0ab2bffbda"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhmnyms2r1" cloneof="mhmnyms2">
+ <description>Homonyms II and Confusing Pairs (revision 1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms ii and confusing pairs (4am crack).dsk" size="143360" crc="b8f652db" sha1="48b1ad2a26910bc0ee0873892e39199b214f6cc5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhmnyms2">
+ <description>Homonyms II and Confusing Pairs (revision 2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Revised edition features bug fixes and updated copy protection. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="homonyms ii rev. 2 (4am crack).dsk" size="143360" crc="cd7c8e9e" sha1="3bfa0f7a7156845eb1b7392c7fa09756ae50ad4f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="horses">
+ <description>Horses (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="horses (4am crack).dsk" size="143360" crc="c380bd7b" sha1="fdfdc966d8ef1c1e7117754842ca00fd85810277" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="howwest">
+ <description>How The West Was One + Three x Four (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Pat Sine" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-18 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="how the west was one + three x four (4am crack).dsk" size="143360" crc="590f6a8b" sha1="2b7972b3700fb4f8aad2578647ec3bab81bc29a5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hw2rsrch">
+ <description>How To Do Research (4am crack)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="how to do research (4am crack).dsk" size="143360" crc="08ab26cd" sha1="d79ec74e57991caf048ab0b9fe9cc755c5ac9532" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="h2weleph">
+ <description>How to Weigh an Elephant (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="developer" value="Educational Technologies" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="how to weigh an elephant (4am crack).dsk" size="143360" crc="38ec0d92" sha1="231f6674a4f17be54ad347389c34034aca1ea9fa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hhlngvwl">
<description>Hugo Hound's Vowel Sounds: Long Vowels (4am crack)</description>
<year>1993</year>
@@ -46722,9 +33501,9 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-12-30-->
- <!--May be missing disk 2 - "Short Vowels" based on manual.-->
- <!--education program-->
+ <!-- Dump released: 2020-12-30 -->
+ <!-- May be missing disk 2 - "Short Vowels" based on manual. -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="hugo hound's vowel sounds - long vowels (4am crack).dsk" size="143360" crc="b1b4cad8" sha1="bb6ea89ff429fcbb74665b587e551966fdf12709"/>
@@ -46736,11 +33515,12 @@ license:CC0-1.0
<description>Human Body Exploration (4am crack)</description>
<year>1987</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Sam Howe and Linda Howe" />
+ <info name="programmer" value="Sam Howe" />
+ <info name="programmer" value="Linda Howe" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -46755,6 +33535,84 @@ license:CC0-1.0
</part>
</software>
+ <software name="idamiano">
+ <description>I, Damiano (4am crack)</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="programmer" value="Mark D. Klein" />
+ <info name="programmer" value="Peter A. Golden" />
+ <info name="programmer" value="Michael J. Becker" />
+ <info name="programmer" value="Steve DeFrisco" />
+ <info name="programmer" value="Wilfredo Aguilar" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="i, damiano (4am crack) side a.dsk" size="143360" crc="b4bf6510" sha1="9f4bb2562214ab6db390dd1061bba277e2e0cbb3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="i, damiano (4am crack) side b.dsk" size="143360" crc="2cb6f901" sha1="4d83c7eff36deabdbf9958fccb166cb88bb81d88" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impgalac">
+ <description>Imperium Galactum (version 1.0) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="programmer" value="Keith Brors" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Scenario and boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="imperium galactum (4am and san inc crack) side a - scenario (boot).dsk" size="143360" crc="da228929" sha1="119bce687849b6167f98ae6107cfa6950890a23f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Game"/>
+ <dataarea name="flop" size="143360">
+ <rom name="imperium galactum (4am and san inc crack) side b - game.dsk" size="143360" crc="91a7e59c" sha1="11d28301726fd4b97ef5dbb441808733ba8be2d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impmiss2">
+ <description>Impossible Mission II (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Douglas D. Dragin" />
+ <info name="programmer" value="Howard E. Scheer" />
+ <info name="programmer" value="Richard T. Unruh" />
+ <info name="programmer" value="Tom Zerucha" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-08 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="impossible mission ii (4am crack) side a.dsk" size="143360" crc="a219d468" sha1="98a1aa883ad0a46ee30f043d431138ec4382d205" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="impossible mission ii (4am crack) side b.dsk" size="143360" crc="7968cf85" sha1="b4853d27a3b3aee986f4c4ea5b8f908a9423c782" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="impymem">
<description>Improving Your Memory (4am crack)</description>
<year>1983</year>
@@ -46762,8 +33620,8 @@ license:CC0-1.0
<info name="developer" value="Microcomputer Educational Programs" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="improving your memory (4am crack).dsk" size="143360" crc="8a412745" sha1="e8b4b1896d06d4bdb6a94b20269672942d2d2692" />
@@ -46776,13 +33634,14 @@ license:CC0-1.0
<year>1983</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder and Omar H. Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar H. Khudari" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This game was re-released at least twice with productized protections. This is believed to be the first release.-->
+ <!-- This game was re-released at least twice with productized protections. This is believed to be the first release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-11-30-->
- <!--educational program-->
+ <!-- Dump released: 2019-11-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="in search of the most amazing thing r0 (4am crack).dsk" size="143360" crc="5045cc20" sha1="f2cbef99f1144124957e03b3db1f882997669c34"/>
@@ -46795,13 +33654,14 @@ license:CC0-1.0
<year>1983</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder and Omar H. Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar H. Khudari" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This game was re-released at least twice with productized protections.-->
+ <!-- This game was re-released at least twice with productized protections. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-22-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="in search of the most amazing thing (4am crack).dsk" size="143360" crc="88e5d95d" sha1="e7768dd7149670e124fc7bec68b2584fb6ab4266" />
@@ -46814,13 +33674,14 @@ license:CC0-1.0
<year>1984</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder and Omar H. Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar H. Khudari" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This game was re-released at least twice with productized protections.-->
+ <!-- This game was re-released at least twice with productized protections. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-16. Redumped: 2021-08-27-->
- <!--educational program-->
+ <!-- Dump released: 2018-03-16. Redumped: 2021-08-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="in search of the most amazing thing rev. 2 (4am crack).dsk" size="143360" crc="200e57c8" sha1="e3f1afab50451d1c1b6355079578380cd30112d8" />
@@ -46828,15 +33689,49 @@ license:CC0-1.0
</part>
</software>
+ <software name="ijrota">
+ <description>Indiana Jones in Revenge of the Ancients (4am crack)</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-02. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="indiana jones in revenge of the ancients (4am crack).dsk" size="143360" crc="409f3eea" sha1="d4bc91d1eb50fcb142b9fa3759d3262bc0e58407" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="indians">
+ <description>Indians (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="indians (4am crack).dsk" size="143360" crc="f86c6c4c" sha1="43a3b89b474d26029a4d1c2a7af35e793af58fe3" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="indinamer">
<description>Industrialism in America (4am crack)</description>
<year>1986</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Judith J. Waite, Ted Costa, and William J. Dalton Jr." />
+ <info name="programmer" value="Judith J. Waite" />
+ <info name="programmer" value="Ted Costa" />
+ <info name="programmer" value="William J. Dalton, Jr." />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-22-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -46864,8 +33759,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-19-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="inferential anne ii (4am crack).dsk" size="143360" crc="aaccfba4" sha1="47e7fe20de827e9292a8d2a5fe1912db93da2633" />
@@ -46873,15 +33768,171 @@ license:CC0-1.0
</part>
</software>
+ <software name="inca">
+ <description>Inca (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hayden Software</publisher>
+ <info name="author" value="Joe Emerson" />
+ <info name="programmer" value="Ken Smith" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-17 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="inca (4am crack) side a.dsk" size="143360" crc="622c8e05" sha1="52f15fff82587642fecc73342139260cb12f025e"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Story"/>
+ <dataarea name="flop" size="143360">
+ <rom name="inca (4am crack) side b.dsk" size="143360" crc="32d9ef26" sha1="827d2c6c8e93731d1f8b52e5ae3d1ac8fa4754f7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ioshapes">
+ <description>Inside Outside Shapes (4am crack)</description>
+ <year>1986</year>
+ <publisher>Random House</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="inside outside shapes (4am crack).dsk" size="143360" crc="c137f54f" sha1="22d5e4fa467c6d0ee1e1513ca2fe5107b458c2b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="instsur">
+ <description>Instant Survey (A-245 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-245" />
+ <info name="programmer" value="Mark Dostal" />
+ <info name="programmer" value="Cathy Grittner" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Debra Vonk" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="revision 1.0" />
+ <!-- Same program as Instant Survey A-224 but doesn't include the sampler disk -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a245 instant survey v1.0 (4am crack).dsk" size="143360" crc="ee40cabd" sha1="6fc93354199368f14931e2f9aa5ac6d8b4be9b49"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="instsurs_525">
+ <description>Instant Survey Sampler (A-224 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-224" />
+ <info name="programmer" value="Mark Dostal" />
+ <info name="programmer" value="Cathy Grittner" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Debra Vonk" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="revision 1.0" />
+ <!-- Same program as Instant Survey A-245 but includes the sampler disk -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a224 instant survey v1.0 (4am crack) side a - program.dsk" size="143360" crc="ee40cabd" sha1="6fc93354199368f14931e2f9aa5ac6d8b4be9b49"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Sampler"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a224 instant survey v1.0 (4am crack) side b - sampler.dsk" size="143360" crc="28c36de8" sha1="e7f0102f95db0c911c0e717a17f973e39756e092"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intequat1">
+ <description>Integers/Equations I (version 04.27.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.27.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="integers-equations i v04.27.85 (4am crack).dsk" size="143360" crc="1bd07752" sha1="b42296c0be38345bbcff2962c16d8af20893bcc6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intequat2">
+ <description>Integers/Equations II (version 04.27.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.27.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="integers-equations ii v04.27.85 (4am crack).dsk" size="143360" crc="fba1b7e0" sha1="b433ea7e2b895f16ff868ca197b3ebe5319a90c1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intgrphs">
+ <description>Interpreting Graphs (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Sharon Dugdale" />
+ <info name="programmer" value="David Kibbey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="interpreting graphs (4am crack).dsk" size="143360" crc="1c584075" sha1="74f16b0497e5b6130a7bca98087f0d9e33a286d7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mmitsabttm">
<description>It's About Time (McCarthy-McCormack) (4am crack)</description>
- <!--Different program than It's About Time from Micrograms Publishing.-->
+ <!-- Different program than It's About Time from Micrograms Publishing. -->
<year>1983</year>
<publisher>McCarthy-McCormack</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-06-02-->
- <!--educational program-->
+ <!-- Dump released: 2015-06-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="it's about time (4am crack).dsk" size="143360" crc="9be8d4c9" sha1="bcfc08ee08ba58c62d4673d4b422eef74fab0f28" />
@@ -46896,8 +33947,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-06-16-->
- <!--educational program-->
+ <!-- Dump released: 2018-06-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="it's about time (micrograms) (4am crack).dsk" size="143360" crc="f7ae8a72" sha1="530323a118e22e126e6b968ee72b20ae3d7622a9" />
@@ -46905,18 +33956,104 @@ license:CC0-1.0
</part>
</software>
- <software name="jbird">
- <description>J-Bird (4am crack)</description>
- <year>1983</year>
- <publisher>Orion Software</publisher>
- <info name="programmer" value="Daryl Rotta" />
+ <software name="jbrtlky">
+ <description>Jabbertalky: The Programmable Word Game (4am crack)</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="developer" value="Automated Simulations" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-27 -->
+ <!-- puzzle game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="jabbertalky (4am crack).dsk" size="143360" crc="d4ef2bf5" sha1="d39e52135171037b2f1451294cba795df955a457"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="viewkill">
+ <description>James Bond 007 in: A View to a Kill (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-21 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="james bond 007 in a view to a kill (4am crack).dsk" size="143360" crc="578c98cb" sha1="60fbf677d59b7a61d1f9d14deed1d0a50ccf9a92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="goldfngr">
+ <description>James Bond 007 in: Goldfinger (4am crack)</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-06. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="goldfinger (4am crack).dsk" size="143360" crc="987c2c2a" sha1="05fbd7813b573749c6de8421edb3d2a6aeb8cbdd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jawbrkr">
+ <description>Jawbreaker (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-09-->
- <!--action game-->
+ <!-- Dump released: 2017-12-04 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="j-bird (4am crack).dsk" size="143360" crc="2b911c4f" sha1="bdc62f9d9ac640e6f9567cd7d1bdbc3bfb7fd3ad" />
+ <rom name="jawbreaker (4am and san inc crack).dsk" size="143360" crc="f55436ad" sha1="22063ea09385db9f5c2f285dc09fecc327b6a30e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jennyjrn_525">
+ <description>Jenny's Journeys (A-161 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-161" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a161 jenny's journeys v1.0 (4am crack).dsk" size="143360" crc="b20d19b5" sha1="651132dd6617f80886698c76754a9107dabffc65"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jeuxmath">
+ <description>Jeux Mathématiques Classiques (French) (A-121 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="alt_title" value="Classic Math Games in French" />
+ <info name="developer" value="MECC" />
+ <info name="language" value="French" />
+ <info name="partno" value="A-121" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a121 jeux mathematiques classiques v1.0 (4am crack).dsk" size="143360" crc="b5dc1790" sha1="9d9cd5c59ab4118ae95d222dc59f5967d73a3eea"/>
</dataarea>
</part>
</software>
@@ -46928,8 +34065,8 @@ license:CC0-1.0
<info name="developer" value="Fasco" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-17-->
- <!--sports game-->
+ <!-- Dump released: 2023-09-17 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -46944,16 +34081,100 @@ license:CC0-1.0
</part>
</software>
+ <software name="juglrb82" cloneof="juglrb">
+ <description>Juggles' Rainbow (Apple) (version 1982) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Apple Computer</publisher>
+ <info name="programmer" value="A. Piestrup" />
+ <info name="programmer" value="B. Jasinski" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="P. Fiorentini" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="A. Chiang" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1982" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="juggles' rainbow (1982) (4am crack).dsk" size="143360" crc="e48d5319" sha1="9c0552c190290dde74b4414d96ce3ca0d7d16d39" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="juglrb">
+ <description>Juggles' Rainbow (version 1.4) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Apple Computer" />
+ <info name="programmer" value="A. Piestrup" />
+ <info name="programmer" value="B. Jasinski" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="P. Fiorentini" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="A. Chiang" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="juggles' rainbow (4am crack).dsk" size="143360" crc="7c06ce26" sha1="72ad78d84728be4aa1198208c095cd5ae37467d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="oneonone">
+ <description>Julius Erving and Larry Bird Go One on One (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Eric Hammond" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-29 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="one on one (4am and san inc crack).dsk" size="143360" crc="ab1717ad" sha1="0b9331f3a44b13ceefd8f201b01a41118d6ab4c0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jumbjung">
+ <description>Jumbled Jungle (4am crack)</description>
+ <year>1988</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-11-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="jumbled jungle (4am crack) side a.dsk" size="143360" crc="e834e30e" sha1="21e93889979fd13f183f47b9287f6f667d6949bb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="jumbled jungle (4am crack) side b.dsk" size="143360" crc="a97a0662" sha1="73d61a3c53c795d739bd38e984af3f54f4964de9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="jmblezzz87">
<description>Jumblezzz (version 1987) (4am crack)</description>
<year>1987</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-19-->
- <!--educational game-->
+ <!-- Dump released: 2017-11-19 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="jumblezzz (4am crack).dsk" size="143360" crc="f2b174de" sha1="d41085797cea3e9605953e7a1806b0cd45e00eb7" />
@@ -46961,15 +34182,152 @@ license:CC0-1.0
</part>
</software>
+ <software name="jmpmthfl">
+ <description>Jumping Math Flash (4am crack)</description>
+ <year>1988</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-04-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="jumping math flash (4am crack).dsk" size="143360" crc="0448adab" sha1="20f73a8ee2fa305d3d9403d3915c319fe60bdbdc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jumpman">
+ <description>Jumpman (4am crack)</description>
+ <year>1983</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Randy Glover" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-15 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Beginner levels"/>
+ <dataarea name="flop" size="143360">
+ <rom name="jumpman (4am crack) side a.dsk" size="143360" crc="4f291aa3" sha1="1c43eac018c0a04e70177cf413d7b20b4eaa3a89" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Advanced levels"/>
+ <dataarea name="flop" size="143360">
+ <rom name="jumpman (4am crack) side b.dsk" size="143360" crc="90312d4c" sha1="0ba7c41afbb31c93e4dc602da12cf577876dbc2c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="junghunt">
+ <description>Jungle Hunt (Atarisoft) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="jungle hunt (4am crack).dsk" size="143360" crc="81b074fd" sha1="939e07e5aa2a0cd3792fa50f52c868657e35bb6b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jbird">
+ <description>J-Bird (4am crack)</description>
+ <year>1983</year>
+ <publisher>Orion Software</publisher>
+ <info name="programmer" value="Daryl Rotta" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-10-09 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="j-bird (4am crack).dsk" size="143360" crc="2b911c4f" sha1="bdc62f9d9ac640e6f9567cd7d1bdbc3bfb7fd3ad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kamikaze">
+ <description>Kamikaze (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="John van Ryzin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-11-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="kamikaze (4am crack).dsk" size="143360" crc="85e61598" sha1="82c4fae0308674022aa5bc17632ca047ef3455be" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kampfgp10" cloneof="kampfgp">
+ <description>Kampfgruppe (version 1.0) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Game disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="kampfgruppe v1.0 (4am and san inc crack) disk 1 - game disk.dsk" size="143360" crc="daa30896" sha1="031d68b8a2beee66421bf042064400fa94b22d2c"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Historical scenarios"/>
+ <dataarea name="flop" size="143360">
+ <rom name="kampfgruppe v1.0 (4am and san inc crack) disk 2 - historical scenarios.dsk" size="143360" crc="a516177e" sha1="5960e7169c9709546931597c969d8b8182e8a93c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kampfgp">
+ <description>Kampfgruppe (version 1.1) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Game disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="kampfgruppe v1.1 (4am and san inc crack) disk 1 - game.dsk" size="143360" crc="4b7139e3" sha1="1574a899f859d23c0b918176ff8617e65e9b212a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Historical scenarios"/>
+ <dataarea name="flop" size="143360">
+ <rom name="kampfgruppe v1.1 (4am and san inc crack) disk 2 - scenarios.dsk" size="143360" crc="1ad1274f" sha1="4b4a87670d3ca608f290a882cca6d383a4358c93" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="keysign">
<description>Key Signatures (4am crack)</description>
<year>1986</year>
<publisher>Waterloo Software</publisher>
- <info name="programmer" value="Barbara Woods, Judith Bowman, and Edmund Woods" />
+ <info name="programmer" value="Barbara Woods" />
+ <info name="programmer" value="Judith Bowman" />
+ <info name="programmer" value="Edmund Woods" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="key signatures (4am crack).dsk" size="143360" crc="251f71b4" sha1="60d898479fbd854aba60ccdc1b2702c177e8ab16" />
@@ -46977,15 +34335,101 @@ license:CC0-1.0
</part>
</software>
+ <software name="keybarpeg">
+ <description>Keyboard Arpeggios (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Reid Alexander" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard arpeggios (4am crack).dsk" size="143360" crc="fa3e26a4" sha1="9e66acc9367a65ab219c4fb29651d31a38f917e1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keyblues">
+ <description>Keyboard Blues (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard blues (4am crack).dsk" size="143360" crc="c32ddf6a" sha1="bddd4ca4b792050bef3702b38e977375855ac27c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybchords">
+ <description>Keyboard Chords (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard chords (4am crack).dsk" size="143360" crc="5d41b232" sha1="70856b9d56282d6b0218d32611638f15a4e0b1c7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybejazzh">
+ <description>Keyboard Extended Jazz Harmonies (4am crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard extended jazz harmonies (4am crack).dsk" size="143360" crc="07cefb6f" sha1="7bd20ae0b41957185dcdce40c96c97a7983a0e5b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybfing">
+ <description>Keyboard Fingerings (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard fingerings (4am crack).dsk" size="143360" crc="4698d95d" sha1="79fbb021fead12425f212f60ffcefef1e3d35d13"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="kbdgolf">
- <description>Keyboard Golf (4am and san inc crack)</description>
+ <description>Keyboard Golf (Softsmith) (4am and san inc crack)</description>
<year>1981</year>
<publisher>Softsmith</publisher>
+ <info name="developer" value="Avant-Garde Creations" />
<info name="programmer" value="Stuart Aronoff" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-24-->
- <!--sports game-->
+ <!-- Dump released: 2021-07-24 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -47000,6 +34444,151 @@ license:CC0-1.0
</part>
</software>
+ <software name="keybintv">
+ <description>Keyboard Intervals (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard intervals (4am crack).dsk" size="143360" crc="58528f13" sha1="3d8bf802ced06c1c21ee1f54f8dd8a2538d0fe63"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybjazzh">
+ <description>Keyboard Jazz Harmonies (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard jazz harmonies (4am crack).dsk" size="143360" crc="5ea5aa72" sha1="b2575b5fa2c9a0f7cde103fe928b0d752f4a2343"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybndrl">
+ <description>Keyboard Note Drill (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard note drill (4am crack).dsk" size="143360" crc="bf5837ed" sha1="b07e169398ae828f3e71bc98716851b8e28193fd"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybsread">
+ <description>Keyboard Speed Reading (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Ray E. Zubler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard speed reading (4am crack).dsk" size="143360" crc="accbe520" sha1="d81dc34cbf3cae530b084928f00159a129792af9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybtutr">
+ <description>Keyboard Tutor (4am crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyboard tutor (4am crack).dsk" size="143360" crc="efad3427" sha1="5d1a92664913d1d8880168c12d6238136d9722a6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ksmkbdmast">
+ <description>Keyboarding Series: MECC Keyboarding Master: Games and Drills (Student Program) (A-131 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="TIES" />
+ <info name="partno" value="A-131" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a131 mecc keyboarding master v1.1 (4am crack).dsk" size="143360" crc="ac24dc09" sha1="0f3fe347c30c24de41cf77e59695a857edf51382"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ksmkbpri">
+ <description>Keyboarding Series: MECC Keyboarding Primer (Student Program / Teacher Utilities) (A-130 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="TIES" />
+ <info name="partno" value="A-130" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Student program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a130 mecc keyboarding primer v1.0 (4am crack) side a - student program.dsk" size="143360" crc="7bbe8cfa" sha1="4649e91f9fa2f27a19a2feda256781458f4b62a9"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Teacher utilities"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a130 mecc keyboarding primer v1.0 (4am crack) side b - teacher utilities.dsk" size="143360" crc="3a65c5f6" sha1="e4abeb8d9164380b6192e00a303abdd9cde0ff49"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keyworksf">
+ <description>Keyworks: First Keyboarding Skills (4am crack)</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-01. Updated 2015-12-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="keyworks - first keyboarding skills (4am crack).dsk" size="143360" crc="08509e4c" sha1="f13dc752a490884afe7324fc52122bd8e85dc2aa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kidleido">
<description>Kid-Leidoscope (4am crack)</description>
<year>1990</year>
@@ -47007,8 +34596,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-01-->
- <!--educational game-->
+ <!-- Dump released: 2017-09-01 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -47027,11 +34616,20 @@ license:CC0-1.0
<description>Kids at Work (4am crack)</description>
<year>1984</year>
<publisher>Scholastic</publisher>
- <info name="programmer" value="Dan Klassen, Al Borchers, Maryl Skinner, and Malcolm Kirton" />
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Maryl Skinner" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="programmer" value="Sandi Young" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kids at work (4am crack).dsk" size="143360" crc="57fb8fca" sha1="c73fe1af365afc5a459b656e7734d081ababcfa4" />
@@ -47045,8 +34643,8 @@ license:CC0-1.0
<publisher>Spinnaker Software</publisher>
<info name="usage" value="Runs on any Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-03-31-->
- <!--educational program-->
+ <!-- Dump released: 2014-03-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kids on keys (4am crack).dsk" size="143360" crc="41fc91fb" sha1="7615227a1d1b2dae5cb58ebaeaf32261237185e2" />
@@ -47058,13 +34656,14 @@ license:CC0-1.0
<description>KidWriter (revision 0) (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Jim Pejsa and Jack Pejsa" />
+ <info name="programmer" value="Jim Pejsa" />
+ <info name="programmer" value="Jack Pejsa" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This version has no print function, suggesting an earlier release.-->
+ <!-- This version has no print function, suggesting an earlier release. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kidwriter rev. 0 (4am crack).dsk" size="143360" crc="da97fb1c" sha1="3ae516b768b82d6e65e737fb9749f8733ad57e73"/>
@@ -47076,12 +34675,13 @@ license:CC0-1.0
<description>KidWriter (version 1.0) (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Jim Pejsa and Jack Pejsa" />
+ <info name="programmer" value="Jim Pejsa" />
+ <info name="programmer" value="Jack Pejsa" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="version 1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-04-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kidwriter 1.0 (4am crack).dsk" size="143360" crc="5ca27432" sha1="13568d1d25794ead8a5f89e9ac21700f0cb382e6" />
@@ -47096,8 +34696,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kinder critters- address and phone number (4am crack).dsk" size="143360" crc="6add0391" sha1="fb479acb6cb8fa94fe3c5638bd0b77e7f4eab7b3" />
@@ -47112,8 +34712,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kinder critters- letters and patterns (4am crack).dsk" size="143360" crc="fce0ed07" sha1="13f403cd3e6a3fb74e9603d9a96d1ab6caa80623" />
@@ -47128,10 +34728,10 @@ license:CC0-1.0
<info name="programmer" value="Doug Davis" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--Has different copy protection from revision 1. No known program differences.-->
+ <!-- Has different copy protection from revision 1. No known program differences. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-18-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kindercomp rev. 0 (4am crack).dsk" size="143360" crc="e02f5cf9" sha1="2e935851208b3d2318a23c38eb472926383bf647" />
@@ -47147,8 +34747,8 @@ license:CC0-1.0
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2014-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kindercomp (4am crack).dsk" size="143360" crc="32a9df32" sha1="99cb35aa9f452d8b7475b5ec3eefd0a3bb302e8f" />
@@ -47156,6 +34756,192 @@ license:CC0-1.0
</part>
</software>
+ <software name="kingcrib">
+ <description>King Cribbage (4am crack)</description>
+ <year>1981</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Randi J. Rost" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-25 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="king cribbage (4am crack).dsk" size="143360" crc="12580b86" sha1="56da09f4644f836dfd44423c1a8ff73752ceb70f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest">
+ <description>King's Quest: Quest for the Crown (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Arthur Abraham" />
+ <info name="programmer" value="Charles Tingley" />
+ <info name="programmer" value="Ken MacNeill" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Greg Rowland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest (4am and san inc crack) disk a.dsk" size="143360" crc="b7542a8a" sha1="57df97d42cb6ba3e08a725823de2ba0f00b799a0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest (4am and san inc crack) disk b.dsk" size="143360" crc="b39dc9ff" sha1="612d93007050cd47f1216b406a7fbb62f9ab75a0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest (4am and san inc crack) disk c.dsk" size="143360" crc="2fd0b2b2" sha1="2c179d77b3216af2d30dc083369052054258b5a9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest2">
+ <description>King's Quest II: Romancing the Throne (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-16 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest ii (4am and san inc crack) disk 1a.dsk" size="143360" crc="7e9b14e5" sha1="1d15d3268ea29e7f662f8cbdef8c1667f8069c5a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest ii (4am and san inc crack) disk 1b.dsk" size="143360" crc="ed113658" sha1="4f278d131e505d5a2c7cd8bbee3d5370ce9849c5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest ii (4am and san inc crack) disk 2a.dsk" size="143360" crc="1db10d28" sha1="209f700c675e6b97f034af7a76347512570ed145" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest ii (4am and san inc crack) disk 2b.dsk" size="143360" crc="b5ae4321" sha1="dc8a868a0f4dedaa3f51b41846de7c95e2c37b85" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest ii (4am and san inc crack) disk 3a.dsk" size="143360" crc="e21a7fdd" sha1="685ccff734d450a09583212ced5e80d9b7cdf747" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest3">
+ <description>King's Quest III: To Heir Is Human (4am and san inc crack)</description>
+ <year>1988</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Robert E. Heitman" />
+ <info name="programmer" value="Bob Kernaghan" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Dale Carlson" />
+ <info name="programmer" value="Nancy Grimsley" />
+ <info name="programmer" value="Ray Marek" />
+ <info name="programmer" value="Jennifer Cobb" />
+ <info name="programmer" value="Kimberly Wood" />
+ <info name="programmer" value="Annette Childs" />
+ <info name="programmer" value="Greg Steffen" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-16 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 1a.dsk" size="143360" crc="8a977778" sha1="3546df14878f201bbbb3c3c31cc33890f1b49090" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 1b.dsk" size="143360" crc="dd88b2c3" sha1="e79817ac1d65f4a3b7bde274304d5c32a0c2cf4b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 2a.dsk" size="143360" crc="5d606a41" sha1="c47e8f7d2f04a5f4019b2e62f2d592e954f04658" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 2b.dsk" size="143360" crc="f97303f2" sha1="b564a1cb29fc777cf2c833ab6109bbfdaf6adec6" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 3a.dsk" size="143360" crc="3e858fed" sha1="c5f3044de1a01e4ccfd31c4d8580daa473c5bdc4" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 3b.dsk" size="143360" crc="f8a20906" sha1="6fc0185b70afad39d965d42c804ae99d153f9823" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 4a.dsk" size="143360" crc="6c1abfc6" sha1="6832eac5192de084f800f66f7063409d289c5264" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 4b.dsk" size="143360" crc="5dc8a8a0" sha1="0c149ac6010af02eb837e8343b21514910955a28" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 5a.dsk" size="143360" crc="8b303da7" sha1="a7532a9a7b482453cfac78cdcea1f69f1ee2e9da" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="king's quest iii (4am and san inc crack) disk 5b.dsk" size="143360" crc="73b6f6f6" sha1="f24f7c5d4fee54b15a9e2707ade60d6911ff4eda" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kitchenp">
<description>Kitchen Planner (4am crack)</description>
<year>1982</year>
@@ -47163,8 +34949,8 @@ license:CC0-1.0
<info name="developer" value="Sav-Soft Products" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-15-->
- <!--productivity program-->
+ <!-- Dump released: 2023-01-15 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="kitchen planner (4am crack).dsk" size="143360" crc="f7150808" sha1="34ef6d8e0b548ee0a6ecda982297cfd4b4c25511" />
@@ -47180,8 +34966,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="01.11.85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-07-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -47204,8 +34990,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="03.12.86" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -47228,8 +35014,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="01.31.87" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-21-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -47252,8 +35038,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="06.26.89" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-16-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -47268,6 +35054,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="knightds">
+ <description>Knights of the Desert (version 1.1) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Tactical Design Group" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="knights of the desert v1.1 (4am and san inc crack).dsk" size="143360" crc="40edca9f" sha1="569a58f5e4acaf8db250eba44e23621912102ee0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kmbearthsc">
<description>Knowledge Master Basics: Earth Science (4am crack)</description>
<year>1986</year>
@@ -47275,8 +35078,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-7-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-7 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- earth science (4am crack).dsk" size="143360" crc="52a6dee9" sha1="df56930dcc3ed37ffe7fe056d973ee76f80607f7" />
@@ -47291,8 +35094,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-7-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-7 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- geography (4am crack).dsk" size="143360" crc="f7edcbe3" sha1="a3d980c0f2dc82f30651c500d4a43368bc36b217" />
@@ -47307,8 +35110,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-8-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-8 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- language arts 1 (4am crack).dsk" size="143360" crc="02a8e789" sha1="44a7f5741a6cc21b9e570cd7e33665265cfba4fc" />
@@ -47323,8 +35126,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-8-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-8 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- language arts 2 (4am crack).dsk" size="143360" crc="1d15560a" sha1="1cdf0485a3a2cca1a443c5444ff79b2424bfc054" />
@@ -47339,8 +35142,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-8-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-8 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- life science 1 (4am crack).dsk" size="143360" crc="f747301d" sha1="a514ee16b5141c8f1613e89bf13ef287e2e8118d" />
@@ -47355,8 +35158,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-8-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-8 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- life science 2 (4am crack).dsk" size="143360" crc="afd91a20" sha1="c41cacbe2e87edb2ddb6df7124523412c52aba96" />
@@ -47371,8 +35174,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-8-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-8 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- literature (4am crack).dsk" size="143360" crc="b94d98eb" sha1="4aec935ed5b41496e7c01b8bfc896e5d90c4c54c" />
@@ -47387,8 +35190,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-12-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- math 1 (4am crack).dsk" size="143360" crc="28fafe19" sha1="5bdc902acfdd09fb4648456782b47f8a5f3e2d68" />
@@ -47403,8 +35206,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-12-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- math 2 (4am crack).dsk" size="143360" crc="d808c1cb" sha1="9822d6886baf8a8b6f15d388ec30933793a64981" />
@@ -47419,8 +35222,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-12-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- physical science (4am crack).dsk" size="143360" crc="a643a987" sha1="61bd8303786f89d3a6f575eae92630644ce1984b" />
@@ -47435,8 +35238,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-12-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master basics- social studies 2 (4am crack).dsk" size="143360" crc="a5300384" sha1="07f14b810663fc7260b066f02c6b4f5bd16cff16" />
@@ -47451,8 +35254,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2017-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -47474,8 +35277,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-08-14-->
- <!--educational program-->
+ <!-- Dump released: 2016-08-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master - general math (4am crack).dsk" size="143360" crc="b632604a" sha1="4ad599ab36106fa41e24a497a5bd6e031df29c2f" />
@@ -47490,8 +35293,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-09-04-->
- <!--educational program-->
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master - geometry (4am crack).dsk" size="143360" crc="ed9c329a" sha1="72b2cc25a79f6fff40c248b82c411a0459a225db" />
@@ -47506,8 +35309,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-10-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master - utilities (4am crack).dsk" size="143360" crc="a546f4b2" sha1="ab8ad06786917bd1f644bc9f3e72887bf125fde1" />
@@ -47522,8 +35325,8 @@ license:CC0-1.0
<info name="developer" value="Academic Hallmarks" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-10-28-->
- <!--educational program-->
+ <!-- Dump released: 2014-10-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="knowledge master world history 1 (4am crack).dsk" size="143360" crc="d49e8c80" sha1="c81f09462cba0462b87b52559682c7a0dcb4194d" />
@@ -47531,14 +35334,207 @@ license:CC0-1.0
</part>
</software>
+ <software name="korg8004m">
+ <description>Korg 800 4-Track MIDI Sequencer (version 1.0) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2019-11-19 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="korg-800 4 track midi sequencer (4am and san inc crack).dsk" size="143360" crc="64b0622c" sha1="0a51b1ee8f9dec7e0f5120f9f21abf1d1d53257c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="krift">
+ <description>Koronis Rift (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Lucasfilm Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-03 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="koronis rift (4am crack).dsk" size="143360" crc="8202cf58" sha1="b103d174b027563f7f63191b529dec689e842fea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lacrkdwn">
+ <description>L.A. Crackdown (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Leonard Chan" />
+ <info name="programmer" value="Clifford Yap" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="l.a. crackdown (4am crack) side a.dsk" size="143360" crc="d5ba8808" sha1="021e9b590dbab2354790ea27491abd8f1ddcba91" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="l.a. crackdown (4am crack) side b.dsk" size="143360" crc="bb699ead" sha1="34b9fc9d95c011dcf1be898818a2dea14c879ab8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lalandmonc" cloneof="lalandmon">
+ <description>L.A. Land Monopoly (Continental Software) (4am and san inc crack)</description>
+ <year>1980</year>
+ <publisher>Continental Software</publisher>
+ <info name="programmer" value="Jeffrey Stanton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-05-17 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="l. a. land monopoly (4am and san inc crack).dsk" size="143360" crc="1343945f" sha1="12cc537abbe9da06fa6d9802d47096aa9523c0c6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lalandmon">
+ <description>L.A. Land Monopoly (Softsmith) (4am and san inc crack)</description>
+ <year>1980</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Continental Software" />
+ <info name="programmer" value="Jeffrey Stanton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="l.a. land monopoly (softsmith) (4am and san inc crack).dsk" size="143360" crc="3647c18b" sha1="7bfbfea61609d8eaa0172293909cfb0766875f29"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="corrtoro">
+ <description>La Corrida de Toros (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Donald Hammer" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="la corrida de toros (4am crack).dsk" size="143360" crc="3a941200" sha1="c9d98bfcc2878a5fd991ab372627deb929e3d3ef"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="laguillo">
+ <description>La Guillotine (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Donald Hammer" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="la guillotine (4am crack).dsk" size="143360" crc="2b389d84" sha1="a11eb5ccaf44997776faf8404b412b87bf9856d8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labelmkr_525">
+ <description>LabelMaker (A-241 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-241" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a241 labelmaker 1.0 (4am crack).dsk" size="143360" crc="38b81413" sha1="fed27a649393a872e31ec824dfebf5f8be9132f5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labletlst10" cloneof="labletlst">
+ <description>Labels, Letters, and Lists (A-144 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-144" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a144 labels, letters, and lists v1.0 (4am crack).dsk" size="143360" crc="615e36a4" sha1="e5f3444aff6c38cf7e627cbeff4324bd4f170d4a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labletlst">
+ <description>Labels, Letters, and Lists (A-144 version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-144" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a144 labels, letters, and lists v1.2 (4am crack).dsk" size="143360" crc="79eab755" sha1="4c25227b736bb1675fad5b184d659a969eb73347" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labyrnth">
+ <description>Labyrinth (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Scott Schram" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="labyrinth (4am and san inc crack).dsk" size="143360" crc="35875fdd" sha1="826f7071d643e91dea9a746f9fbc7f3c9b12fc83" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="langactl3">
<description>Language Activities Courseware Level 3 (4am crack)</description>
<year>1988</year>
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A Side 1" />
<dataarea name="flop" size="143360">
@@ -47589,34 +35585,58 @@ license:CC0-1.0
</part>
</software>
- <software name="langcrn1">
- <description>Language Carnival 1 (4am crack)</description>
+ <software name="langcrn">
+ <description>Language Carnival (4am crack)</description>
<year>1988</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Developmental Learning Materials" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-10-23-->
- <!--educational program-->
+ <!-- Dump released: 2016-10-23 (disk 1) / 2024-04-30 (disk 2). -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
<rom name="language carnival 1 (4am crack).dsk" size="143360" crc="51ea50de" sha1="cb3f6b0f45511052b2d8d6d509a7a4f5cccf71a6" />
</dataarea>
</part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="language carnival 2 (4am crack).dsk" size="143360" crc="51875615" sha1="ac164a9c49a76fc107bd8c0d526195dc6be2a127" />
+ </dataarea>
+ </part>
</software>
- <software name="langcrn2">
- <description>Language Carnival 2 (4am crack)</description>
- <year>1988</year>
- <publisher>Developmental Learning Materials (DLM)</publisher>
- <info name="developer" value="Developmental Learning Materials" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="lodgamma">
+ <description>Lantern of D'Gamma (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="Martin Butherus" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--educational program-->
+ <!-- Dump released: 2019-01-25 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="language carnival 2 (4am crack).dsk" size="143360" crc="51875615" sha1="ac164a9c49a76fc107bd8c0d526195dc6be2a127" />
+ <rom name="lantern of d'gamma (4am crack).dsk" size="143360" crc="21812e21" sha1="9f923f1934ca6c0433cf973a006ac34d10ce9da0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lsrbounc">
+ <description>Laser Bounce (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="Kevin Kalkut" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="laser bounce (4am crack).dsk" size="143360" crc="380ddd9f" sha1="450eecfa3d87e8764827980ee83aa5c40f866c63" />
</dataarea>
</part>
</software>
@@ -47625,11 +35645,11 @@ license:CC0-1.0
<description>Latin Tutor (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Queue, Inc." />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-03-->
- <!--educational program-->
+ <!-- Dump released: 2019-04-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="latin tutor (4am crack).dsk" size="143360" crc="cf994fb0" sha1="5f74319920788c3a8a2ae3d364881f7115b579e0" />
@@ -47637,15 +35657,236 @@ license:CC0-1.0
</part>
</software>
+ <software name="gesltnv1">
+ <description>Latin Vocabulary I (4am crack)</description>
+ <year>1985</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="W. Frank McArthur" />
+ <info name="programmer" value="Robert A. Quinn" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="latin vocabulary i (4am crack).dsk" size="143360" crc="c959ceac" sha1="dfa58b32c952a05e636216eb95b869f3e6a5d4ae"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazmaze">
+ <description>Lazer Maze (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Avant-Garde Creations" />
+ <info name="programmer" value="James D. Spain" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="lazer maze (softsmith) (4am and san inc crack).dsk" size="143360" crc="2e02590f" sha1="973de2770cbe37f8ac6449e3da2d364dbb40a0e6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazsilkg" cloneof="lazsilk">
+ <description>Lazer Silk (Gebelli Software) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Gebelli Software</publisher>
+ <info name="programmer" value="Eric Knoff" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="lazer silk (4am and san inc crack).dsk" size="143360" crc="a545135c" sha1="739ea0f0a4aa2437aa144e2b9daf21de6b85dcd7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazsilk">
+ <description>Lazer Silk (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Gebelli Software" />
+ <info name="programmer" value="Eric Knoff" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="lazer silk (softsmith) (4am and san inc crack).dsk" size="143360" crc="395f1f6f" sha1="2cb4a546dbe72238b7f973ddc068bdda26c3aa82"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazyjack">
+ <description>Lazy Jack (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="lazy jack (4am crack).dsk" size="143360" crc="68004ae5" sha1="57520de5304d6717ed37705248c2d9516eda9730" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lraddsub">
+ <description>Learning to Add &amp; Subtract (revision 2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Title screen changed to Panda and shows the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="learning to add and subtract (4am crack).dsk" size="143360" crc="9b336a84" sha1="3534dcacdf79690fd0f88286e79e956dab7038c2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lrn2time">
+ <description>Learning to Tell Time (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="learning to tell time (4am crack).dsk" size="143360" crc="261db74b" sha1="3bc845f6ecf36da0049d0586c30c268e867c5c7c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lrnfuzzy">
+ <description>Learning with Fuzzywomp (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Michael McKee" />
+ <info name="programmer" value="Martin Shen" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released:2018-09-18 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="learning with fuzzywomp (4am and san inc crack).dsk" size="143360" crc="1d609cb6" sha1="0e7557cf80c50aea5cabd1585c320957b0782cbb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lrnleepr">
+ <description>Learning with Leeper (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released:2016-07-27 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="learning with leeper (4am crack).dsk" size="143360" crc="92a7da91" sha1="3935075e64f16d1ec312e17bbeca0e5f22c4cda7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="leadshtr">
+ <description>Leadsheeter (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="author" value="Phil Farrand" />
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="John Borowicz" />
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-16 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="leadsheeter (4am and san inc crack).dsk" size="143360" crc="1f890162" sha1="d91cc98035f67461d92490f9a1d7912d00823bfc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lsl1">
+ <description>Leisure Suit Larry in The Land of the Lounge Lizards (4am and san inc crack)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Chuck Benton" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 1a.dsk" size="143360" crc="a63ba30a" sha1="e9844135c13626c15d3223e5b051f69550379dc7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 1b.dsk" size="143360" crc="96177184" sha1="4aec985852dde26deb21b95e59b99257ff6f7a6d" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 2a.dsk" size="143360" crc="2ab8d3c1" sha1="ab263733c3b32411bb3d1bcfbed32e87d28d830b" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 2b.dsk" size="143360" crc="51f81965" sha1="891141e418d70052089edb8808c663f33ac8353f" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="leisure suit larry in land of the lounge lizards (4am and san inc crack) disk 3a.dsk" size="143360" crc="c7889e5e" sha1="65ed92ceeec7cc2715833d503e2c098b0c981214" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="lessports">
<description>Les Sports (4am crack)</description>
<year>1984</year>
<publisher>DC Health and Company</publisher>
- <info name="programmer" value=" Arlene Krane, Philip Orenstein, Lewis Copulsky, and Robert Wickenden" />
- <info name="usage" value="Requires an 48K Apple ][+ or later." />
+ <info name="programmer" value="Arlene Krane" />
+ <info name="programmer" value="Philip Orenstein" />
+ <info name="programmer" value="Lewis Copulsky" />
+ <info name="programmer" value="Robert Wickenden" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-05-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-05-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -47666,8 +35907,8 @@ license:CC0-1.0
<publisher>Milton Bradley</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-14-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -47688,10 +35929,10 @@ license:CC0-1.0
<publisher>Milton Bradley</publisher>
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ only." />
- <!--Due to coding bugs unrelated to copy protection, this program will crash on anything but an Apple ][+-->
+ <!-- Due to coding bugs unrelated to copy protection, this program will crash on anything but an Apple ][+ -->
<sharedfeat name="compatibility" value="A2P" />
- <!--Dump released: 2022-02-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="let's explore word processing (4am crack).dsk" size="143360" crc="c00e42b3" sha1="ac9fb79ae9ad1fa143a2268e361b5c64960cb520"/>
@@ -47707,8 +35948,8 @@ license:CC0-1.0
<info name="original_publisher" value="Milton Bradley" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-04-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="let's explore word processing (media materials) (4am crack).dsk" size="143360" crc="3d69b0d6" sha1="d560e5556abe856c791ea47cdadf7ecaefe0b127" />
@@ -47716,15 +35957,166 @@ license:CC0-1.0
</part>
</software>
+ <software name="lgfishng">
+ <description>Let's Go Fishing (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="let's go fishing (4am crack).dsk" size="143360" crc="c037df88" sha1="7ec81326407298c790718f67d22a994c8657594e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lgtmapsk">
+ <description>Let's Go There: Beginning Map and Geography Skills (4am crack)</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="let's go there - beginning map and geography skills (4am crack).dsk" size="143360" crc="68923dda" sha1="bf19c52c3b13e0267a5879506a435a67ba4ddac9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="llacomp">
+ <description>Let's Learn About Computers (4am crack)</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="let's learn about computers (4am crack).dsk" size="143360" crc="8fe40923" sha1="46fb987a4e42d28f37c2906d0222de588fe21119" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="llagusa">
+ <description>Let's Learn About Geography - USA (4am crack)</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="programmer" value="Linda Murray" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="let's learn about geography - usa (4am crack).dsk" size="143360" crc="ae291098" sha1="991b4cf7e389a8d0ba5c0f4b71eaa6f6e0ab672d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="llamoney">
+ <description>Let's Learn About Money (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="let's learn about money (4am crack).dsk" size="143360" crc="d5cb1ced" sha1="1c27e9499351fe256583887cb837077640363b6a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lttrrecg81" cloneof="lttrrecg">
+ <description>Letter Recognition (version 1981) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Hartley Software</publisher>
+ <info name="developer" value="Hartley Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1981" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="letter recognition (4am crack).dsk" size="143360" crc="eee0d2db" sha1="c285d3d8df471f797de73d3f19ad9afce16a5a66" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lttrrecg">
+ <description>Letter Recognition (version 01.27.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="01.27.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="letter recognition v01.27.88 (4am crack).dsk" size="143360" crc="d0143e5b" sha1="b8c573344bdb94d49a113e7e97cfc85419d33f5d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lewclsh_525">
+ <description>Lewis and Clark Stayed Home (A-279 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-279" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a279 lewis and clark stayed home v1.0 (4am crack) side a.dsk" size="143360" crc="65d01a05" sha1="f76b2745535f9c0b6d6f36e7b88282177dec8bd6"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a279 lewis and clark stayed home v1.0 (4am crack) side b.dsk" size="143360" crc="a1a27f3b" sha1="f82f925b5328ce1849dc55c1b6163b3cc3ae3a04"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="labluelv">
<description>Library Adventure: Blue Level (4am crack)</description>
<year>1984</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Chris Newton and Dave Mark" />
+ <info name="programmer" value="Chris Newton" />
+ <info name="programmer" value="Dave Mark" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="library adventure - blue level (4am crack).dsk" size="143360" crc="482a6568" sha1="1de65475859758791058378004a15e9c419bef8a" />
@@ -47736,13 +36128,14 @@ license:CC0-1.0
<description>Library Magic (revision 0) (4am crack)</description>
<year>1987</year>
<publisher>McCarthy-McCormack</publisher>
- <info name="programmer" value="Jane McCarthy and Kay McCormark, PhD." />
+ <info name="programmer" value="Jane McCarthy" />
+ <info name="programmer" value="Kay McCormark, Ph.D." />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--This revision is earlier due to an updated phone number in revision 1.-->
+ <!-- This revision is earlier due to an updated phone number in revision 1. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -47761,13 +36154,14 @@ license:CC0-1.0
<description>Library Magic (revision 1) (4am crack)</description>
<year>1987</year>
<publisher>McCarthy-McCormack</publisher>
- <info name="programmer" value="Jane McCarthy and Kay McCormark, PhD." />
+ <info name="programmer" value="Jane McCarthy" />
+ <info name="programmer" value="Kay McCormark, Ph.D." />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This revision has an updated phone number.-->
+ <!-- This revision has an updated phone number. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-16-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -47782,6 +36176,199 @@ license:CC0-1.0
</part>
</software>
+ <software name="lsllalib">
+ <description>Library Skills: Let's Learn about the Library (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="library skills - let's learn about the library (4am crack) disk 1.dsk" size="143360" crc="766cd0c7" sha1="3422f67af3e3f9b33b26cb04ee09a45643b74027" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="library skills - let's learn about the library (4am crack) disk 2.dsk" size="143360" crc="fea922d0" sha1="c3c334e6da42077930288c47e3e19264c447d39a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="library skills - let's learn about the library (4am crack) disk 3.dsk" size="143360" crc="5b6d089a" sha1="5cce6928ee90f6399de3ac1a3cc6b768a2ff94bc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lfstfrog">
+ <description>Life Story Frog (4am crack)</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="life story frog (4am crack).dsk" size="143360" crc="e107f2f8" sha1="f15828fe236a02b0ce18346e2c7c041010f1fb4f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="listenms">
+ <description>Listen! A Music Skills Program (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="listen a music skills program (4am crack).dsk" size="143360" crc="c39fe4c0" sha1="bb816d121e4ebd781fd4f66c041abf240646c95f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ltlridls">
+ <description>Little Riddles (version 01.29.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="01.29.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="little riddles (4am crack) disk 1.dsk" size="143360" crc="cabe7845" sha1="586ed7705f338ffe3ce50e0e1f937e671d8c01b6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="little riddles (4am crack) disk 2.dsk" size="143360" crc="1b4e00d2" sha1="e15a4c58e4e8bf78f168efaa318a234331d53675" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ltlsplr">
+ <description>Little Speller (version 2.0) (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="John R. Conrad" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="little speller (softsmith) (4am and san inc crack).dsk" size="143360" crc="5b3c1772" sha1="1f5b7b8c1a88b64876dfd5fb032879550bcb3beb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth50c" cloneof="locksmth5">
+ <description>Locksmith (version 5.0 revision level C) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Omega Microware</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="5.0 revision level C" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-01. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="locksmith 5.0 rev c (4am crack).dsk" size="143360" crc="4174acf1" sha1="6209a736c8652151601cd2b66c41b7e912688f0f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth50f" cloneof="locksmth5">
+ <description>Locksmith (version 5.0 revision level F) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Omega Microware</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="5.0 revision level F" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-06-23. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="locksmith 5.0 rev f (4am crack).dsk" size="143360" crc="1246095e" sha1="a41321e6174368d2f6b048c2746f2709639ca447" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth5">
+ <description>Locksmith (version 5.0 revision level G) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Alpha Logic Business Systems</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="5.0 revision level G" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-10 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="locksmith v5.0g (4am crack).dsk" size="143360" crc="4be27a62" sha1="3e19e176a314c6c888e6c3d53fe361d4767d3285"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="loderunr">
+ <description>Lode Runner (4am crack)</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Doug Smith" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-20 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="lode runner (4am crack).dsk" size="143360" crc="148a8095" sha1="2293b9b3f73e207d5d9e8d62a7c29774e8ac2913" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="logicbld">
+ <description>Logic Builders (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="logic builders (4am and san inc crack).dsk" size="143360" crc="fe027324" sha1="f8657baadef5c3e4f10b50b2a751222169a2008a"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="loggates">
<description>Logic Gates (A-403 version 1.0) (4am crack)</description>
<year>1984</year>
@@ -47791,8 +36378,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-18-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a403 logic gates v1.0 (4am crack).dsk" size="143360" crc="f38dc84c" sha1="2595174e3f51db812c153ee5db5ab1d9aefbc94c"/>
@@ -47800,6 +36387,114 @@ license:CC0-1.0
</part>
</software>
+ <software name="logictls">
+ <description>Logic Tools (prototype) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Ann Piestrup" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-09 -->
+ <!-- unreleased prototype -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="logic tools (4am crack).dsk" size="143360" crc="ee462ed7" sha1="5831cb4ed9a1e0aca58c88c2a4ee796b5a9bd3fd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="logomot">
+ <description>LogoMotion (version 1.2) (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Terrapin" />
+ <info name="programmer" value="L. Klotz" />
+ <info name="programmer" value="P. Sobalvarro" />
+ <info name="programmer" value="S. Hain" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-28 -->
+ <!-- programming language -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="logomotion v1.2 (softsmith) (4am and san inc crack) disk 1 - program.dsk" size="143360" crc="ef0e3ee0" sha1="8793abcd56b6d5aa8077ed00f7018ef09ea5943a"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Utilities"/>
+ <dataarea name="flop" size="143360">
+ <rom name="logomotion v1.2 (softsmith) (4am and san inc crack) disk 2 - utilities.dsk" size="143360" crc="760ebcd7" sha1="11d517e95eb7ead1ad09f3fcd7a1ebc6b5c3d3b5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mwlngdiv">
+ <description>Long Division (4am crack)</description>
+ <year>1986</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="long division (4am crack).dsk" size="143360" crc="f6ede713" sha1="ba70aec5a6820c7d6f24da695a647ddd5cb48f9e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lordconq">
+ <description>Lords of Conquest (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Jack Kittredge" />
+ <info name="author" value="Peter Olotka" />
+ <info name="author" value="Bill Eberle" />
+ <info name="developer" value="Eon Productions" />
+ <info name="programmer" value="Ted Schmeckpeper" />
+ <info name="programmer" value="Trevor Western" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="lords of conquest (4am and san inc crack) side a.dsk" size="143360" crc="19d1dd77" sha1="e342bf48d1730e8bb0b1f5400cb61857af50ec98" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="lords of conquest (4am and san inc crack) side b.dsk" size="143360" crc="e746d78e" sha1="1257315c299df977acc32dad3840bee7b55144f4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="l7splgme">
+ <description>Lucky 7 Spelling Games: Elementary (4am crack)</description>
+ <year>1984</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="programmer" value="Frank Flint" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="lucky 7 spelling games - elementary (4am crack).dsk" size="143360" crc="bdf2f55c" sha1="27594836a052a8a216b5914b605bdc33605e59c4" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="luckmhat">
<description>Lucky's Magic Hat (4am crack)</description>
<year>1984</year>
@@ -47807,8 +36502,8 @@ license:CC0-1.0
<info name="programmer" value="Lee Ann Horton" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-18-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -47823,16 +36518,154 @@ license:CC0-1.0
</part>
</software>
+ <software name="mlapdll">
+ <description>M-ss-ng L-nks: Al Pie De La Letra Spanish Editor (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="m-ss-ng l-nks- al pie de la letra (4am crack).dsk" size="143360" crc="890c379e" sha1="09e341e5f183e85c9c050d8dafef35513bbe1e30"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlclason">
+ <description>M-ss-ng L-nks: Classics Old and New (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="m-ss-ng l-nks - classics old and new (4am crack).dsk" size="143360" crc="e77c27e8" sha1="f6daf25c36163b9531209e578666d93c54d553f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlengedit">
+ <description>M-ss-ng L-nks: English Editor (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="programmer" value="Richard Gersh" />
+ <info name="programmer" value="Jonathan Sweedler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="m-ss-ng l-nks (4am crack).dsk" size="143360" crc="e06faf5c" sha1="e79bbc293d71411f6be73687128b921856d8dd67" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlmicroenc">
+ <description>M-ss-ng L-nks: MicroEncyclopedia (version 1987 revised edition) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987 revised edition" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="m-ss-ng l-nks microencyclopedia (1987 revised edition) (4am crack).dsk" size="143360" crc="a457cc3e" sha1="703e7cedabe2394af56f8674f900e710e5951f94" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlyoungpl83" cloneof="mlyoungpl">
+ <description>M-ss-ng L-nks: Young People's Literature (version 1983) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="m-ss-ng l-nks young people's literature 1983 (4am crack).dsk" size="143360" crc="07750529" sha1="fc1b8aeee05765177043571e3562b67090f73411" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlyoungpl">
+ <description>M-ss-ng L-nks: Young People's Literature (version 1987 revised) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987 revised" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="m-ss-ng l-nks young people's literature (4am crack).dsk" size="143360" crc="dffcf526" sha1="a47e2ab5494c7928b06a5f0b85b6b8a9eaca1b3e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="madvntre">
+ <description>Mad Venture (4am crack)</description>
+ <year>1981</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Dale Johnson" />
+ <info name="programmer" value="Christine Johnson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mad venture (4am crack).dsk" size="143360" crc="b784eef9" sha1="fc5fdafa8092f3195da19c37329dc8e0f38d8a0a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mslt20v13" cloneof="mslt20">
<description>Magic Slate: 20-Column Apple ][+ Version (version 1.3) (4am crack)</description>
<year>1986</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-09-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-09 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20 v1.3 (4am crack).dsk" size="143360" crc="e370e505" sha1="fee4ddf7fab3417243d8cd9ca3d10862a1ab448e" />
@@ -47844,12 +36677,15 @@ license:CC0-1.0
<description>Magic Slate: 20-Column Apple ][+ Version (version 1.4) (4am crack)</description>
<year>1987</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-25-->
- <!--productivity program-->
+ <!-- Dump released: 2017-08-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20 v1.4 (4am crack).dsk" size="143360" crc="7079eca0" sha1="9436520fcf78ce6c0353535cbca537c6cc355f72" />
@@ -47861,13 +36697,16 @@ license:CC0-1.0
<description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.0) (4am crack)</description>
<year>1984</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-11-->
- <!--Hold CTRL+C during startup to switch between 20/40 columns.-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-11 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20-40 v1.0 (4am crack).dsk" size="143360" crc="2f4dc4e2" sha1="3162c9d18c82513f1701787328d1de8faa488045" />
@@ -47879,13 +36718,16 @@ license:CC0-1.0
<description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.02) (4am crack)</description>
<year>1984</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.02" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-11-->
- <!--Hold CTRL+C during startup to switch between 20/40 columns.-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-11 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20-40 v1.02 (4am crack).dsk" size="143360" crc="6bb3eaf4" sha1="2547b77691c0be14ca342ca33a7c7c694670d06f" />
@@ -47897,13 +36739,16 @@ license:CC0-1.0
<description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.1.2) (4am crack)</description>
<year>1984</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.1.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-10-->
- <!--Hold CTRL+C during startup to switch between 20/40 columns.-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-10 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20-40 v1.12 (4am crack).dsk" size="143360" crc="6a7a06c4" sha1="245383423d8f0f4dd53eda7bb4b37253e85ad699" />
@@ -47915,13 +36760,16 @@ license:CC0-1.0
<description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.2.2) (4am crack)</description>
<year>1984</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.2.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-14-->
- <!--Hold CTRL+C during startup to switch between 20/40 columns.-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-14 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20-40 v1.22 (4am crack).dsk" size="143360" crc="32f95875" sha1="6224d1c7bf1041f9b2fc38b05207062c723b95c5" />
@@ -47933,13 +36781,16 @@ license:CC0-1.0
<description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.2.3) (4am crack)</description>
<year>1984</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.2.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-17-->
- <!--Hold CTRL+C during startup to switch between 20/40 columns.-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-17 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 20-40 v1.23 (4am crack).dsk" size="143360" crc="ef5cb3a7" sha1="9e2ae5fb18f1ce695c2810a3dabd410f5c843994" />
@@ -47951,12 +36802,15 @@ license:CC0-1.0
<description>Magic Slate: 40-Column Apple ][+ Version (version 1.3) (4am crack)</description>
<year>1986</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-09-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-09 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 40 v1.3 (4am crack).dsk" size="143360" crc="38768169" sha1="b3e47eaf3903f70bf714a1551dc83199082c6326" />
@@ -47968,12 +36822,15 @@ license:CC0-1.0
<description>Magic Slate: 40-Column Apple ][+ Version (version 1.4) (4am crack)</description>
<year>1987</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger, Paul Elseth, Jim Kulzer, and Simon Lie" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-25-->
- <!--productivity program-->
+ <!-- Dump released: 2017-08-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 40 v1.4 (4am crack).dsk" size="143360" crc="3fb43587" sha1="2c9adec8de909bc76c093948e9024c6cf1b64789" />
@@ -47985,12 +36842,13 @@ license:CC0-1.0
<description>Magic Slate: 80-Column Apple //e Version (version 1.1.2) (4am crack)</description>
<year>1985</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth and Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
<info name="usage" value="Requires an 80-column Apple //e or later." />
<info name="version" value="1.1.2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-10-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-10 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 80 v1.12 (4am crack).dsk" size="143360" crc="14c67a02" sha1="65c46ed3db1a7c00f351704578b02d12dff3e033" />
@@ -48002,12 +36860,13 @@ license:CC0-1.0
<description>Magic Slate: 80-Column Apple //e Version (version 1.2.2) (4am crack)</description>
<year>1985</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth and Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
<info name="usage" value="Requires an 80-column Apple //e or later." />
<info name="version" value="1.2.2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-26-->
- <!--productivity program-->
+ <!-- Dump released: 2017-08-26 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 80 v1.22 (4am crack).dsk" size="143360" crc="646dbb70" sha1="5270e370f47a3eb7709d471ff7aae8ccee352e45" />
@@ -48019,12 +36878,13 @@ license:CC0-1.0
<description>Magic Slate: 80-Column Apple //e Version (version 1.2.3) (4am crack)</description>
<year>1985</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth and Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
<info name="usage" value="Requires an 80-column Apple //e or later." />
<info name="version" value="1.2.3" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-17-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-17 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 80 v1.23 (4am crack).dsk" size="143360" crc="47061cf3" sha1="e39645e568d9d83881a8744a2385dc0919a81192" />
@@ -48036,12 +36896,13 @@ license:CC0-1.0
<description>Magic Slate: 80-Column Apple //e Version (version 1.4) (4am crack)</description>
<year>1987</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth and Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
<info name="usage" value="Requires an 80-column Apple //e or later." />
<info name="version" value="1.4" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-09-->
- <!--productivity program-->
+ <!-- Dump released: 2017-02-09 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate 80 v1.4 (4am crack).dsk" size="143360" crc="7058b6fb" sha1="25e4907f748d3d4dedfafd973eb52698fb3a5ad4" />
@@ -48053,12 +36914,14 @@ license:CC0-1.0
<description>Magic Slate II: 20-Column Apple //e Version (version 1.0) (4am crack)</description>
<year>1988</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth, Donna Stanger, and Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-20-->
- <!--productivity program-->
+ <!-- Dump released: 2023-02-20 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate ii v1.0- 20-column version (4am crack).dsk" size="143360" crc="9b4304a2" sha1="1c6f8afb5e665346aac5e3cb68881da63eaa01d8" />
@@ -48070,12 +36933,14 @@ license:CC0-1.0
<description>Magic Slate II: 20-Column Apple //e Version (version 1.0a) (4am crack)</description>
<year>1988</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth, Donna Stanger, and Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0a" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--productivity program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate ii 20 v1.0a (4am crack).dsk" size="143360" crc="f19bc38e" sha1="45fd1a802788ecb6e76e633d01d2a5efa84a5440" />
@@ -48087,12 +36952,14 @@ license:CC0-1.0
<description>Magic Slate II: 40-Column Apple //e Version (version 1.0) (4am crack)</description>
<year>1988</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth, Donna Stanger, and Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-20-->
- <!--productivity program-->
+ <!-- Dump released: 2023-02-20 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate ii v1.0- 40-column version (4am crack).dsk" size="143360" crc="aada1eb1" sha1="ccd29ad4f659ab7fd6e7cc6eb9f06d5b43e8505d" />
@@ -48104,12 +36971,14 @@ license:CC0-1.0
<description>Magic Slate II: 40-Column Apple //e Version (version 1.0a) (4am crack)</description>
<year>1988</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth, Donna Stanger, and Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0a" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--productivity program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate ii 40 v1.0a (4am crack).dsk" size="143360" crc="8f3b2116" sha1="ccb948a548b1aa5175cfba08c1e9a5fa346d5e38" />
@@ -48121,12 +36990,14 @@ license:CC0-1.0
<description>Magic Slate II: 80-Column Apple //e Version (version 1.0a) (4am crack)</description>
<year>1988</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Paul Elseth, Donna Stanger, and Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0a" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--productivity program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic slate ii 80 v1.0a (4am crack).dsk" size="143360" crc="d20f04fe" sha1="34417fff1fd262dc4091d7d43bf1f1cb7584721c" />
@@ -48135,16 +37006,17 @@ license:CC0-1.0
</software>
<software name="mspells81" cloneof="mspells21">
- <description>Magic Spells (1981) (Apple) (4am crack)</description>
+ <description>Magic Spells (version 1981) (Apple) (4am crack)</description>
<year>1981</year>
<publisher>Apple Computer</publisher>
- <info name="developer" value="Advanced Learning Technology"/>
- <info name="programmer" value="Leslie Grimm and Corrine Grimm" />
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corrine Grimm" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1981" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2016-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic spells (1981) (4am crack).dsk" size="143360" crc="19692861" sha1="58765788f0fd841a5add6f7d3693cfccceb56f3d" />
@@ -48153,16 +37025,17 @@ license:CC0-1.0
</software>
<software name="mspells11" cloneof="mspells21">
- <description>Magic Spells (version 1.1) (4am and san inc crack)</description>
+ <description>Magic Spells (version 1.1) (The Learning Company) (4am and san inc crack)</description>
<year>1981</year>
<publisher>The Learning Company</publisher>
- <info name="original_publisher" value="Apple Computer" />
- <info name="programmer" value="Leslie Grimm and Corrine Grimm" />
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corrine Grimm" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic spells v1.1 (4am and san inc crack).dsk" size="143360" crc="61cdce64" sha1="85037001be7ef625b5a51c7fcdefb1e821e0bc17" />
@@ -48171,16 +37044,20 @@ license:CC0-1.0
</software>
<software name="mspells21">
- <description>Magic Spells (version 2.1) (4am crack)</description>
+ <description>Magic Spells (version 2.1) (The Learning Company) (4am crack)</description>
<year>1985</year>
<publisher>The Learning Company</publisher>
- <info name="original_publisher" value="Apple Computer" />
- <info name="programmer" value="K. Elliott, G. Genoar, S. Gordon, L. Grimm, and K. Klose" />
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="K. Elliott" />
+ <info name="programmer" value="G. Genoar" />
+ <info name="programmer" value="S. Gordon" />
+ <info name="programmer" value="L. Grimm" />
+ <info name="programmer" value="K. Klose" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-08-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="magic spells 2.1 (4am crack).dsk" size="143360" crc="6167bda5" sha1="7642bc892a333194abd0333e115e6c167cdbb6e8" />
@@ -48188,6 +37065,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="makeface">
+ <description>Make A Face: Fun with Basic Shapes (4am crack)</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="make a face (4am crack).dsk" size="143360" crc="c0ce6ccc" sha1="f1e1d8eda0cc21e44db831fbf5ff02edbc721f8d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mngscspd">
<description>Managing for Success: Personal Development (4am crack)</description>
<year>1983</year>
@@ -48195,8 +37088,8 @@ license:CC0-1.0
<info name="developer" value="Thoughtware, Inc." />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-07-06-->
- <!--educational program-->
+ <!-- Dump released: 2015-07-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -48224,8 +37117,8 @@ license:CC0-1.0
<info name="developer" value="Micro Power &amp; Light" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="map reading (4am crack).dsk" size="143360" crc="b50d8bcc" sha1="15a909dd69c93a2e8b5ec39ee30ac0364f16a7d8" />
@@ -48239,8 +37132,8 @@ license:CC0-1.0
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2016-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="map skills (4am crack).dsk" size="143360" crc="9eaa2488" sha1="40e8afa7c8a5c5f13fcb31663494d0f076134445" />
@@ -48248,6 +37141,69 @@ license:CC0-1.0
</part>
</software>
+ <software name="mglatlng">
+ <description>Maps and Globes: Latitude and Longitude (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="maps and globes - latitude and longitude (4am crack) disk 1.dsk" size="143360" crc="4b077524" sha1="c6a1de752ea8f0536987271ecdf74154b234f36b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="maps and globes - latitude and longitude (4am crack) disk 2.dsk" size="143360" crc="293ae15b" sha1="e58ca22835fa54b3e2f26870460e0d8d9beed63a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="marauder">
+ <description>Marauder (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Rorke Weigandt" />
+ <info name="programmer" value="Eric Hammond" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="marauder (4am crack).dsk" size="143360" crc="3e1d27ad" sha1="5f1f31a629d51dc94ac50172e74bb52bd9528d4d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="marblem">
+ <description>Marble Madness (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="marble madness (4am and san inc crack) side a.dsk" size="143360" crc="e2fd1c35" sha1="9dc2dd127209ffb81deb0e52d4681b9a9ff81338" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="marble madness (4am and san inc crack) side b.dsk" size="143360" crc="3b98e16d" sha1="ce1f565c64cad221ce5d84f6413a7fdf0b507d33" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="martyfrd">
<description>Marty's Family Reader (4am crack)</description>
<year>1992</year>
@@ -48255,8 +37211,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-08-12. Redumped: 2023-05-06-->
- <!--educational program-->
+ <!-- Dump released: 2016-08-12. Redumped: 2023-05-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -48314,8 +37270,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-08-12. Redumped: 2023-05-06-->
- <!--educational program-->
+ <!-- Dump released: 2016-08-12. Redumped: 2023-05-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -48372,8 +37328,8 @@ license:CC0-1.0
<publisher>Springboard Software</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-05-04-->
- <!--educational program-->
+ <!-- Dump released: 2015-05-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -48388,17 +37344,82 @@ license:CC0-1.0
</part>
</software>
+ <software name="masqrde">
+ <description>Masquerade (4am crack)</description>
+ <year>1983</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Dale Johnson" />
+ <info name="programmer" value="Rick Incrocci" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="masquerade (4am crack) side a.dsk" size="143360" crc="1b8efa1a" sha1="dc664d1d62151b1e3de2bcebf27ce121527d331b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="masquerade (4am crack) side b.dsk" size="143360" crc="c2ee6855" sha1="333418548a0e59b6e1221a60485d4b8a5a42e890" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mastspell10" cloneof="mastspell">
+ <description>Master Spell (A-119 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-119" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a119 master spell v1.0 (4am crack).dsk" size="143360" crc="c243091d" sha1="e5dde217fcd983ac1a828d929bd0887a05ed5ae1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mastspell">
+ <description>Master Spell (A-119 version 1.3) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-119" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a119 master spell v1.3 (4am crack).dsk" size="143360" crc="896a59e6" sha1="a861bd31f676ad312e7a8af7b1af6c96dcb80f1d"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="mmerlyad10" cloneof="mmerlyad">
<description>Mastering Math Series 1: Early Addition (A-788 version 1.0) (4am crack)</description>
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-788" />
- <info name="programmer" value="Frederick Steinmann and Peter Fuglstad" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Karen Jostad" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="programmer" value="Peter Fuglstad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-07-30-->
- <!--educational program-->
+ <!-- Dump released: 2018-07-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a788 early addition v1.0 (4am crack).dsk" size="143360" crc="83307ddb" sha1="4a04542c192bde3372b966fb0a65d4ba9d43a342" />
@@ -48411,12 +37432,17 @@ license:CC0-1.0
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-788" />
- <info name="programmer" value="Frederick Steinmann and Peter Fuglstad" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Karen Jostad" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="programmer" value="Peter Fuglstad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-29-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a788 early addition v1.1 (4am crack).dsk" size="143360" crc="4e5efd49" sha1="16927ca2c2f3e0cca3010d63a43ce87604acdc91"/>
@@ -48429,12 +37455,17 @@ license:CC0-1.0
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-788" />
- <info name="programmer" value="Frederick Steinmann and Peter Fuglstad" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Karen Jostad" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="programmer" value="Peter Fuglstad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-29-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a788 early addition v1.3 (4am crack).dsk" size="143360" crc="118ba4a0" sha1="da0b06ea52fe0e8f12f9e2805f005ca1afecd21a"/>
@@ -48446,13 +37477,18 @@ license:CC0-1.0
<description>Mastering Math Series 2: Circus Math (A-109 version 1.0) (4am crack)</description>
<year>1984</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-109" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Tim Heap" />
+ <info name="programmer" value="Peter Fuglestad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-22-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a109 circus math v1.0 (4am crack).dsk" size="143360" crc="188da76b" sha1="a1631ac7a3cb7059f44b80522f9929076aa62f69"/>
@@ -48469,8 +37505,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-24-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a125 addition logician v1.0 (4am crack).dsk" size="143360" crc="b75534aa" sha1="788263abea98ffaf2ec39c6a8ca17489fc9878c2"/>
@@ -48482,13 +37518,19 @@ license:CC0-1.0
<description>Mastering Math Series 4: Space Subtraction (A-145 version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-145" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Charles Haberman" />
+ <info name="programmer" value="Jay Miller" />
+ <info name="programmer" value="Jon Clauson" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-26-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a145 space subtraction v1.0 (4am crack).dsk" size="143360" crc="f9341d96" sha1="0c7a98093850dac51985f64106f1cde07dff50bc" />
@@ -48505,8 +37547,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-26-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a146 subtraction puzzles v1.0 (4am crack).dsk" size="143360" crc="d9b96854" sha1="ecd10d34c549a80cfcbe7f94032955a1e54d6fdd" />
@@ -48523,8 +37565,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-26-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a147 multiplication puzzles v1.0 (4am crack).dsk" size="143360" crc="2c80b604" sha1="5f54757dbf02a8911f87a2de6bf6b18b257fc7b1" />
@@ -48541,8 +37583,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-26-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a148 quotient quest v1.0 (4am crack).dsk" size="143360" crc="3162c857" sha1="31d3c943dc7e408197d7333f72212027cd5f54aa" />
@@ -48559,8 +37601,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-27-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a149 mastering math diagnostic system v1.1 (4am crack).dsk" size="143360" crc="e70e8a35" sha1="3465fb5c90364c1916365160c7632f669d36c27f" />
@@ -48577,8 +37619,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-10-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a149 mastering math diagnostic system v1.2 (4am crack).dsk" size="143360" crc="256ef797" sha1="126c3c384dd7f03e3a2afea300723287e72d8844" />
@@ -48595,8 +37637,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-27-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a150 mastering math management system v1.0 (4am crack).dsk" size="143360" crc="6573d4c3" sha1="532c6803086bfa6125cfda5b85dd34ba95eba2b9" />
@@ -48613,8 +37655,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-27-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a150 mastering math management system v1.1 (4am crack).dsk" size="143360" crc="b672af7f" sha1="9ecc0bd7607cf90ef65a827fe34e599522daf33a" />
@@ -48626,13 +37668,15 @@ license:CC0-1.0
<description>Mastering Math Series: Worksheet Generator (A-151 version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-151" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Paul Wenker" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-27-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a151 mastering math worksheet generator v1.0 (4am crack).dsk" size="143360" crc="412c7bb3" sha1="7af37e2237dfdd39aa48a0c4e6ccd93af1b5550a" />
@@ -48644,13 +37688,15 @@ license:CC0-1.0
<description>Mastering Math Series: Worksheet Generator (A-151 version 1.1) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-151" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Paul Wenker" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-27-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a151 mastering math worksheet generator v1.1 (4am crack).dsk" size="143360" crc="934e71a7" sha1="b0e933f4f47260e191c9137c3f735a3df1ba7c3a" />
@@ -48658,6 +37704,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="mastrsat">
+ <description>Mastering the SAT (4am crack)</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Jay Comras" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-23. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mastering the sat (mindscape)(4am crack) disk 1.dsk" size="143360" crc="1eeca285" sha1="1a11e97e6fca22159a347ae308c691ae35f2c467" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mastering the sat (mindscape)(4am crack) disk 2.dsk" size="143360" crc="550f5ca6" sha1="bd3e913321ac853b0d1eb3cf5c572a61be98decd" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mastering the sat (mindscape)(4am crack) disk 3.dsk" size="143360" crc="4c224d4c" sha1="c0e74fa3d55df5f0c67e1162409e90ffbd12a256" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mastering the sat (mindscape)(4am crack) disk 4.dsk" size="143360" crc="3298494c" sha1="940ffb33ce51f3f1560a7da6856750750253d6bb" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mstrtype17">
<description>MasterType (version 1.7) (4am crack)</description>
<year>1983</year>
@@ -48666,8 +37747,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.7" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-06-->
- <!--educational game-->
+ <!-- Dump released: 2023-09-06 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mastertype v1.7 (4am crack).dsk" size="143360" crc="882cefec" sha1="c7bd55ffcf4906c439d39221d761e6aadedd9919" />
@@ -48682,8 +37763,8 @@ license:CC0-1.0
<info name="programmer" value="Bruce Zweig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-06-05-->
- <!--educational game-->
+ <!-- Dump released: 2014-06-05 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mastertype (4am crack).dsk" size="143360" crc="56228da0" sha1="dd47918b4b9c8f1ab3a5a92b3df3ab418393ed0e" />
@@ -48695,14 +37776,15 @@ license:CC0-1.0
<description>MasterType and Training Ground (version 2.1) (4am crack)</description>
<year>1985</year>
<publisher>Scarborough Systems</publisher>
- <info name="programmer" value="Bruce Zweig and Don Park" />
+ <info name="programmer" value="Bruce Zweig" />
+ <info name="programmer" value="Don Park" />
<info name="usage" value="Requires an Apple ][+ or later for side A and a 128K Apple //e or later for side B." />
- <!--Uses double hi-res graphics for version on side B.-->
+ <!-- Uses double hi-res graphics for version on side B. -->
<info name="version" value="2.1" />
- <!--this version contains both MasterType and Training Ground, which were normally sold separately.-->
+ <!-- this version contains both MasterType and Training Ground, which were normally sold separately. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-12-20-->
- <!--educational game-->
+ <!-- Dump released: 2016-12-20 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -48724,8 +37806,8 @@ license:CC0-1.0
<info name="developer" value="ISA Software" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-01-25-->
- <!--educational program-->
+ <!-- Dump released: 2019-01-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mastertype's figures + formulas (4am crack).dsk" size="143360" crc="467475ad" sha1="36b14d32b08c3c001e4ac5ac4d6d61e496a96392" />
@@ -48733,15 +37815,56 @@ license:CC0-1.0
</part>
</software>
+ <software name="mathnme1987" cloneof="mathnme">
+ <description>Math and Me (version 1987) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1987" />
+ <!-- version number is not displayed, so probably 1.0 -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math and me (4am crack) side a.dsk" size="143360" crc="5ed2319e" sha1="5352c1eeef481d0ad5093ca593077f5c08f562bb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math and me (4am crack) side b.dsk" size="143360" crc="8e2f238b" sha1="022eeefae915f9d5aa39b4f619d2483e4325d625" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathnme">
+ <description>Math and Me (version 1.6) (800K 3.5") (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.6" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="math and me 800k 1.6 (4am crack).2mg" size="819264" crc="a0621587" sha1="1727888d24b6c8b745b055bf6ca191db49f0deb9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mtperfin">
<description>Math and Your Personal Finances (4am crack)</description>
<year>1983</year>
<publisher>Media Materials</publisher>
- <info name="programmer" value="Don Stauffer, B.S. and Patricia Shultheis, M.L.A." />
+ <info name="programmer" value="Don Stauffer, B.S." />
+ <info name="programmer" value="Patricia Shultheis, M.L.A." />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-08-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math and your personal finances (4am crack).dsk" size="143360" crc="bcebc4f2" sha1="b11b7afe567484369022898b5a07fe67e5923c2d" />
@@ -48749,6 +37872,300 @@ license:CC0-1.0
</part>
</software>
+ <software name="mathblste" cloneof="mathblst">
+ <description>Math Blaster! (4am crack)</description>
+ <year>1983</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-29 -->
+ <!-- educational program -->
+ <!-- The math blaster BASIC program is shorter in this version. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster (4am crack) side a.dsk" size="143360" crc="e555976d" sha1="b8b3f31bfc70264cde2e13c024f439ac933ead7b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster (4am crack) side b.dsk" size="143360" crc="6bd32fd2" sha1="afc00c60cd1c8d401c937fb4556fbb03fb76bfee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathblst">
+ <description>Math Blaster! (version 08.05.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.05.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster v080584 (4am crack) side a - program.dsk" size="143360" crc="1f40f3e7" sha1="59e80536bfe46e46bd458ac11aacc30d9da56886"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Data disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster v080584 (4am crack) side b - data.dsk" size="143360" crc="fe5f63a4" sha1="1eac6e9205030b23f43c0fcc2cb5055659126407"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltmy10" cloneof="mathbltmy">
+ <description>Math Blaster Mystery (version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="Larene Wade Spitler" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster mystery (4am crack) disk 1.dsk" size="143360" crc="05089188" sha1="2259769286301c56cb32be27a4511d9ebc43a618" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster mystery (4am crack) disk 2.dsk" size="143360" crc="b6145178" sha1="fe5e09c35b34dda837e0f4de2ee8d9f29d7780a0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster mystery (4am crack) disk 3.dsk" size="143360" crc="e912ff49" sha1="1dc156e0f49d6f798c84841d19571847a39d6b6b" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster mystery (4am crack) disk 4.dsk" size="143360" crc="1531679c" sha1="53be5142a4446d5ce4a01663d041503556634e53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltmy13_525" cloneof="mathbltmy">
+ <description>Math Blaster Mystery (version 1.3) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="Larene Wade Spitler" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster mystery 1.3 (4am crack) disk 1.dsk" size="143360" crc="561fc0b7" sha1="d54f5c95cf167920e1da26f66ffde7809165c8ae" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster mystery 1.3 (4am crack) disk 2.dsk" size="143360" crc="bda9fe2e" sha1="c95e66294ed81967c4d9898a4608ff060f796e61" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltmy">
+ <description>Math Blaster Mystery (version 1.3) (800K 3.5") (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="Larene Wade Spitler" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="math blaster mystery 800k v1.3 (4am crack).2mg" size="819264" crc="1a069e56" sha1="993931fe5e6b238f41e4d19abd7433f81d407545" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltpl15" cloneof="mathbltpl">
+ <description>Math Blaster Plus! (version 1.5) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster plus v1.5 (4am crack) side a - program.dsk" size="143360" crc="2d23670a" sha1="4a617ccf97d47733290c9afbf876274eea1cf91d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster plus v1.5 (4am crack) side b - data.dsk" size="143360" crc="825badfe" sha1="6a1d00924eb43dc59f39f577b770fe702b28458e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltpl16" cloneof="mathbltpl">
+ <description>Math Blaster Plus! (version 1.6) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.6" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster plus (4am crack) side a.dsk" size="143360" crc="e6d8210a" sha1="55f8c2c963360ef4198f392f15d25eccaea66360" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math blaster plus (4am crack) side b.dsk" size="143360" crc="7974488f" sha1="81a2a9614e1a27ecd3ee0d343d84dc700b473bc9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltpl36" cloneof="mathbltpl">
+ <description>Math Blaster Plus! (version 3.6) (800K 3.5") (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="3.6" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="math blaster plus 800k 3.6 (4am crack).2mg" size="819264" crc="9ef04948" sha1="e859a141ad701e068dd454884c49036c98dca8c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltpl">
+ <description>Math Blaster Plus! (version 3.7) (800K 3.5") (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="3.7" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="math blaster plus 800k 3.7 (4am crack).2mg" size="819264" crc="4781fe32" sha1="8ac9709f69b9d517ebd0f18dc1810dfe27cde66f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthconc1062984" cloneof="mthconc1">
+ <description>Math Concepts I (version 06.29.84) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="06.29.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-01-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math concepts i v06.29.84 (4am crack).dsk" size="143360" crc="e56e5833" sha1="1264bbe828fc54d4780165dcf99fce72f8ef3975"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthconc1">
+ <description>Math Concepts I (version 10.04.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.04.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math concepts i (4am crack).dsk" size="143360" crc="0bb875c3" sha1="253deb2f69c2d93e24a1e228fed1af97eac5fbdd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthconc2062984" cloneof="mthconc2">
+ <description>Math Concepts II (version 06.29.84) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="06.29.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-01-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math concepts ii v06.29.84 (4am crack).dsk" size="143360" crc="2e297154" sha1="05d540f5d7482294a446e66011dcf6de1cdcbad7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthconc2">
+ <description>Math Concepts II (version 10.04.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.04.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math concepts ii v10.04.85 (4am crack).dsk" size="143360" crc="3da182cb" sha1="e8cc5b78460658abeaef095af0206f4fff71082c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mfbdec">
<description>Math Football: Decimals (version 3.1.6) (4am crack)</description>
<year>1987</year>
@@ -48757,8 +38174,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="3.1.6" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -48777,12 +38194,14 @@ license:CC0-1.0
<description>Math Football: Whole Numbers (version 3.1.8) (4am crack)</description>
<year>1992</year>
<publisher>Gamco Industries</publisher>
- <info name="programmer" value="Diana L. Hestwood, Sharon Simonek, and Doug Pounds" />
+ <info name="programmer" value="Diana L. Hestwood" />
+ <info name="programmer" value="Sharon Simonek" />
+ <info name="programmer" value="Doug Pounds" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="3.1.8" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-09-04-->
- <!--educational game-->
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -48797,6 +38216,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="mthnutsh">
+ <description>Math in a Nutshell (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math in a nutshell (4am crack).dsk" size="143360" crc="fa85b751" sha1="79a94f8d16e086b08c44ec3587b5db30b514aae2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mthmagic">
<description>Math Magic (4am crack)</description>
<year>1986</year>
@@ -48804,8 +38239,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-27-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math magic (4am crack).dsk" size="143360" crc="85163eba" sha1="6b96b4d16e7973777873172c9381ee9fe5cde989" />
@@ -48813,18 +38248,34 @@ license:CC0-1.0
</part>
</software>
+ <software name="mathman">
+ <description>Math Man (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Applied Systems Knowledge" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-04-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math man (4am crack).dsk" size="143360" crc="08a69116" sha1="c90a4524d58bf13040ed7bf9cacc670f33893a36" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mthmrvls">
<description>Math Marvels (4am crack)</description>
<year>1984</year>
<publisher>Houghton Mifflin</publisher>
- <info name="programmer" value="Doug Supeq" />
+ <info name="programmer" value="Doug Super" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-10-16-->
- <!--educational game-->
+ <!-- Dump released: 2015-10-16. Redumped: 2025-12-18 to fix data corruption found on original. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="math marvels (4am crack).dsk" size="143360" crc="9bb48616" sha1="8f68bef75ed73a41148c075a7fdcb215b9cd4f01" />
+ <rom name="math marvels (4am crack).dsk" size="143360" crc="19b4d089" sha1="7fe40710c8ac435f674742d75549c4b0d6b21e1b" />
</dataarea>
</part>
</software>
@@ -48833,11 +38284,11 @@ license:CC0-1.0
<description>Math Masters (4am crack)</description>
<year>1984</year>
<publisher>Houghton Mifflin</publisher>
- <info name="programmer" value="Doug Supeq" />
+ <info name="programmer" value="Doug Super" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-12-->
- <!--educational game-->
+ <!-- Dump released: 2017-01-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math masters (4am crack).dsk" size="143360" crc="410978d0" sha1="b9d8db84b19138732e982a1713fb8e2e841bee25" />
@@ -48845,15 +38296,630 @@ license:CC0-1.0
</part>
</software>
+ <software name="mathrabt10" cloneof="mathrabt11">
+ <description>Math Rabbit (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Analee Nunan" />
+ <info name="programmer" value="Aaron Weiss" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-04-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math rabbit (4am crack).dsk" size="143360" crc="e3b25282" sha1="6e1f2b1e27be7a9438f46ef25fe04fd7bbf0c63d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathrabt11">
+ <description>Math Rabbit (version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Analee Nunan" />
+ <info name="programmer" value="Aaron Weiss" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math rabbit 1.1 (4am crack).dsk" size="143360" crc="53cd9a2f" sha1="98bac9b9218515116c97182b11337183db93a031" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msadd84" cloneof="msadd">
+ <description>Math Sequences: Addition (version 1984) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - addition 1984 (4am crack).dsk" size="143360" crc="f04d7515" sha1="2e7e198879b3e26f82a7c9f0bf12df689d3afa38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msadd">
+ <description>Math Sequences: Addition (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - addition (4am crack).dsk" size="143360" crc="61c134a2" sha1="54051b3f143b85f9fe4de1dee3319bedacdb987c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msdec">
+ <description>Math Sequences: Decimals (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - decimals (4am crack).dsk" size="143360" crc="779a55bc" sha1="6ff1314b2b18ba568988c69dc333c21ffd718402" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msdiv">
+ <description>Math Sequences: Division (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - division (4am crack).dsk" size="143360" crc="22e2f5c9" sha1="0004f9ab857ba431c93105c94cf49bfa0ed873a9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msequat">
+ <description>Math Sequences: Equations (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - equations (4am crack).dsk" size="143360" crc="2bd62c97" sha1="d17fb69e5720a31bd90f7d513e063c7f2f433bbe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msfract">
+ <description>Math Sequences: Fractions (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - fractions (4am crack).dsk" size="143360" crc="9c78035a" sha1="5624140e2781658e83011d1a7f6d4eccf9183c42" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msint">
+ <description>Math Sequences: Integers (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - integers (4am crack).dsk" size="143360" crc="6e34b980" sha1="194651f4499515e7c96cc40565f500a73d885d07" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mslawarit">
+ <description>Math Sequences: Laws of Arithmetic (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - laws of arithmetic (4am crack).dsk" size="143360" crc="d4dab30a" sha1="eed4913249993059fcc1f7048e6abbf736f52392" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msmanutil">
+ <description>Math Sequences: Management Utilities (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <!-- Bootable utility disk for Math Sequences series -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - management utilities (4am crack).dsk" size="143360" crc="631bccd3" sha1="370929174aadb4ff55a31c6a201bac1ff51d35a0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msmeasfm">
+ <description>Math Sequences: Measurement Formulas (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - measurement formulas (4am crack).dsk" size="143360" crc="9b64b157" sha1="eb98ca975c1fd5e064791aa1b7c9f3a16ea336f3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msmult80" cloneof="msmult">
+ <description>Math Sequences: Multiplication (version 1980) (4am crack)</description>
+ <year>1980</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - multiplication 1980 (4am crack).dsk" size="143360" crc="7ec155e9" sha1="ee0b47cd098f2e0061ec4f8e4e1236cc4eb7d69f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msmult">
+ <description>Math Sequences: Multiplication (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - multiplication (4am crack).dsk" size="143360" crc="0ec1575e" sha1="edd7e983883bbb851e0b91a6ec4c8f467176c23c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msnumread80" cloneof="msnumread" >
+ <description>Math Sequences: Number Readiness (version 1980) (4am crack)</description>
+ <year>1980</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1980" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - number readiness 1980 (4am crack).dsk" size="143360" crc="464f1c9a" sha1="8a81077d3c2a809fdaaeb54f073fad87b9e1a158" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msnumread">
+ <description>Math Sequences: Number Readiness (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - number readiness (4am crack).dsk" size="143360" crc="3b24099c" sha1="43455de33fd3faa10bd34cf28cc7b05ad3069f1a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msperc84" cloneof="msperc">
+ <description>Math Sequences: Percents (version 1984) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences- percents 1984 (4am crack).dsk" size="143360" crc="b5529abc" sha1="e0dff1c1d30e56799c4dec682925b5d3b8670489" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msperc">
+ <description>Math Sequences: Percents (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - percents (4am crack).dsk" size="143360" crc="f6864e40" sha1="ac25cf5c44fb45b115d03b9551cd7720ef7d8482" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msprept1">
+ <description>Math Sequences: Pre- and Post Tests I (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Number Readiness, Addition, Subtraction, Multiplication, Division, Laws of Arithmetic, Integers -->
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - pre- and post tests i (4am crack).dsk" size="143360" crc="e9437f1a" sha1="4637b43316dfa45b7156a5a832e6ff0a8a367458" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msprept2">
+ <description>Math Sequences: Pre- and Post-Tests II (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Fractions, Decimals, Percents, Equations, Measurement Formulas -->
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - pre- and post-tests ii (4am crack).dsk" size="143360" crc="c27aa0be" sha1="003ceaa025c41a1ad9e05c6b065848a7bb8f2b31" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mssub">
+ <description>Math Sequences: Subtraction (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - subtraction (4am crack).dsk" size="143360" crc="6479dd22" sha1="41cb61063079327540b7466243ad99591f4f1a58" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mswsgen1">
+ <description>Math Sequences: Worksheet Generator I (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - worksheet generator (4am crack).dsk" size="143360" crc="7e4673c1" sha1="e03f74de49e7730889b66be9ee714820c38b02b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mswsgen2">
+ <description>Math Sequences: Worksheet Generator II (4am crack)</description>
+ <year>1986</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math sequences - worksheet generator ii (4am crack).dsk" size="143360" crc="3612ce07" sha1="29e4414936b10e35c7a2d2dd56c2c48e0cc7f594" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathshop012886" cloneof="mathshop">
+ <description>Math Shop (version 1986-01-28) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alice Wyman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1986-10-27" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 1986-01-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math shop (4am crack) side a.dsk" size="143360" crc="016c176c" sha1="31d78135bd05185fbed2fb7c3e4a47ef104411ca" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math shop (4am crack) side b.dsk" size="143360" crc="5a058721" sha1="3a7429a177c00ddd7a8bc6fd7ee052025c281ef0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathshop">
+ <description>Math Shop (version 1986-10-27) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alice Wyman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1986-10-27" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-06-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math shop 1986-10-27 (4am crack) side a.dsk" size="143360" crc="79855249" sha1="b00423772e1279407884d11a3071295feed873aa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math shop 1986-10-27 (4am crack) side b.dsk" size="143360" crc="8f5ad4e3" sha1="b0698a8765151af7380af5c1d2f730f68b88363c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathskil">
+ <description>Math Skills (version 1.3 30-MAR-81) (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Edu-Ware Services" />
+ <info name="original_publisher" value="Edu-Ware Services" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.3 30-MAR-81" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math skills (softsmith) (4am and san inc crack).dsk" size="143360" crc="8374635f" sha1="1812b3e98eb8a975071cf0db6159c76ff3defe63"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mseleml">
+ <description>Math Skills: Elementary Level (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="SouthWest EdPsych Services" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math skills- elementary level (4am crack).dsk" size="143360" crc="8959752d" sha1="89d2e59a23636de848f0abca5fe0fe579ae38973"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msjrhigh">
+ <description>Math Skills: Junior High Level (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="SouthWest EdPsych Services" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math skills- junior high level (4am crack).dsk" size="143360" crc="dadb8d31" sha1="2fb6e5f2aa81885d5193946e44228c46f2964b22"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtaddit">
+ <description>Math Tutor: Addition (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Maloney" />
+ <info name="programmer" value="Michael Summers" />
+ <info name="programmer" value="Pat Stuart" />
+ <info name="release" value="1986-08-05"/>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - addition (4am crack) disk 1.dsk" size="143360" crc="54280396" sha1="38da29762f058f977ee1bf831944647cccdc7c80" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - addition (4am crack) disk 2.dsk" size="143360" crc="8590b515" sha1="05e0b3cda0590ec476cc98b8a727b250f18d7c04" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtdecim">
+ <description>Math Tutor: Decimals (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Maloney" />
+ <info name="programmer" value="Michael Summers" />
+ <info name="programmer" value="Pat Stuart" />
+ <info name="release" value="1987-06-18"/>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - decimals (4am crack) side a.dsk" size="143360" crc="482441d5" sha1="c657f7dc0cb78914ba145677f91458faf3947129" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - decimals (4am crack) side b.dsk" size="143360" crc="1778ba6f" sha1="e03a4bdff0b6d590bd21fbbc9d7d23230c1249f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtdivis">
+ <description>Math Tutor: Division (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Maloney" />
+ <info name="programmer" value="Michael Summers" />
+ <info name="programmer" value="Pat Stuart" />
+ <info name="release" value="1986-08-05"/>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - division (4am crack) disk 1.dsk" size="143360" crc="2a60510d" sha1="e0327c658af10fd0114c09e3eb4b6ba2a7f3c12c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - division (4am crack) disk 2.dsk" size="143360" crc="17ddcfb2" sha1="f9291dac23d0c78c2e1f77fb6e6e579cf61d8140" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtfract1">
+ <description>Math Tutor: Fractions Part I (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Maloney" />
+ <info name="programmer" value="Michael Summers" />
+ <info name="programmer" value="Pat Stuart" />
+ <info name="release" value="1986-11-06"/>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - fractions part i (4am crack) disk 1.dsk" size="143360" crc="e9fff9a7" sha1="ee663a020faa7af8407c3e77cc7894c8c028f57a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - fractions part i (4am crack) disk 2.dsk" size="143360" crc="c63787af" sha1="1c8ffe3229290b355dd2be70980d0411b491d3c8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtmultip">
+ <description>Math Tutor: Multiplication (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Maloney" />
+ <info name="programmer" value="Michael Summers" />
+ <info name="programmer" value="Pat Stuart" />
+ <info name="release" value="1986-08-05"/>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - multiplication (4am crack) disk 1.dsk" size="143360" crc="cdeaaf7c" sha1="77ea1352f710b38f4880198019e8cee066d4a4e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtsubtct">
+ <description>Math Tutor: Subtraction (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Maloney" />
+ <info name="programmer" value="Michael Summers" />
+ <info name="programmer" value="Pat Stuart" />
+ <info name="release" value="1986-08-05"/>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-08 -->
+ <!-- educational program -->
+ <!-- 4AM only had access to disk 2. Disk 1 is still missing. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - subtraction (4am crack) disk 1.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="math tutor - subtraction (4am crack) disk 2.dsk" size="143360" crc="0561257a" sha1="420d9856dcc69993637c51a0685cb250313d71bd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mathwrdp">
<description>Math Word Problems (4am and san inc crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and V.R. Swami" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="V.R. Swami" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-25-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math word problems (4am and san inc crack).dsk" size="143360" crc="30a7569e" sha1="23289c83590c2757a0ba5b416d4c015ca01a2de4" />
@@ -48868,8 +38934,8 @@ license:CC0-1.0
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math word problems- money (4am and san inc crack).dsk" size="143360" crc="e0021bb3" sha1="5f8d7c5e3d1fb3efac91153a074b023e3b80b5a8" />
@@ -48884,8 +38950,8 @@ license:CC0-1.0
<info name="developer" value="Scott, Foresman and Company" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-05-10-->
- <!--educational game-->
+ <!-- Dump released: 2014-05-10 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="frog jump ordering numbers (4am crack).dsk" size="143360" crc="f9e80ecd" sha1="95a27ed3e59baec6161d75d05dbfbdc5e87e8c17" />
@@ -48900,8 +38966,8 @@ license:CC0-1.0
<info name="developer" value="Scott, Foresman and Company" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-18-->
- <!--educational game-->
+ <!-- Dump released: 2022-12-18 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="picture parts- basic operations (4am crack).dsk" size="143360" crc="3384210c" sha1="9873e726aa6ffc7985b9c51f93cc012da7c59c93" />
@@ -48914,11 +38980,10 @@ license:CC0-1.0
<year>1985</year>
<publisher>Mindscape</publisher>
<info name="developer" value="Scott, Foresman and Company" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-01-25. Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2019-01-25. Redumped: 2021-08-28 Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pyramid puzzler (4am crack).dsk" size="143360" crc="c44f5af5" sha1="3d4134773d676e56fb6fd61467e5caa309cd20f0" />
@@ -48933,9 +38998,8 @@ license:CC0-1.0
<info name="developer" value="Roklan Corporation" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-28. Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2020-06-28. Redumped: 2021-08-28 Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="space journey (4am crack).dsk" size="143360" crc="23643a39" sha1="2864b8753fdb1258ca9200619fbd01c65e88eb25" />
@@ -48950,8 +39014,8 @@ license:CC0-1.0
<info name="developer" value="Scott, Foresman and Company" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-12-12-->
- <!--educational game-->
+ <!-- Dump released: 2014-12-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="star maze (scott, foresman and company) (4am crack).dsk" size="143360" crc="8fb35352" sha1="f293147309d5f7932c4bf1f30aa60400cbd1277d" />
@@ -48962,12 +39026,12 @@ license:CC0-1.0
<software name="matactl4">
<description>Mathematics Activities Courseware Level 4 (4am crack)</description>
<year>1983</year>
- <publisher>Houghton-Mifflin</publisher>
+ <publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-18-->
- <!--educational program-->
- <!--Main menu presents choices from 6-10, implying disk 1 is missing. The disk does autoboot, though, so it's usable. Is there a disk 3?-->
+ <!-- Dump released: 2015-09-18 -->
+ <!-- educational program -->
+ <!-- Main menu presents choices from 6-10, implying disk 1 is missing. The disk does autoboot, though, so it's usable. Is there a disk 3? -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 2 - Bootable"/>
<dataarea name="flop" size="143360">
@@ -48979,12 +39043,12 @@ license:CC0-1.0
<software name="matactl6">
<description>Mathematics Activities Courseware Level 6 (4am crack)</description>
<year>1983</year>
- <publisher>Houghton-Mifflin</publisher>
+ <publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-18-->
- <!--educational program-->
- <!--Main menu shows choices from 11-15, implying disk A and B are missing. The disk does autoboot, though, so it's usable.-->
+ <!-- Dump released: 2015-09-18 -->
+ <!-- educational program -->
+ <!-- Main menu shows choices from 11-15, implying disk A and B are missing. The disk does autoboot, though, so it's usable. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk C - Bootable"/>
<dataarea name="flop" size="143360">
@@ -49000,8 +39064,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-20-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="addition and subtraction 1 (4am crack).dsk" size="143360" crc="1294e866" sha1="0dd1b791aa4fb951167a3e0b99a05ac00e48a79c" />
@@ -49016,8 +39080,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-18-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="addition and subtraction 2 (4am crack).dsk" size="143360" crc="3c8972a6" sha1="6b7f3571cf5cb52cb0b89520021516932be21e20" />
@@ -49032,8 +39096,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="addition and subtraction 3- adventures in addition and subtraction (4am crack).dsk" size="143360" crc="6bda5159" sha1="95ef42728da0862e2ceaec326fa5824e708eb7f5" />
@@ -49048,8 +39112,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="147456">
<rom name="addition and subtraction 4- city sights (4am crack).dsk" size="147456" crc="89310959" sha1="631bf2d010f5fe0c7b597e74f25de1d9599efe7c" />
@@ -49064,8 +39128,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="decimals 2- decimal deli (4am crack).dsk" size="143360" crc="dbb2371a" sha1="3ea4ea5688ec6929e95f8c2232c8325a44a87f1b" />
@@ -49080,8 +39144,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="decimals 3- bicycling through decimals (4am crack).dsk" size="143360" crc="2b2da7c1" sha1="66777092a437a4ff5b23913099fa79aa830c2b80" />
@@ -49096,8 +39160,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="division 2 (4am crack).dsk" size="143360" crc="779cc9b8" sha1="cc0300e51665a0de036a146f44feb21f33021d7b" />
@@ -49112,8 +39176,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="division 3- the prairie (4am crack).dsk" size="143360" crc="5ba32327" sha1="253d0a31a162d723400d8b746f2700dc2ee575c6" />
@@ -49128,8 +39192,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions 1- fantastic fractions 1 (4am crack).dsk" size="143360" crc="71b3004f" sha1="6f2e7eeefabbe7fc7506117960cd594fbd9c76f0" />
@@ -49144,8 +39208,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions 2 (4am crack).dsk" size="143360" crc="75ea2800" sha1="480b568f86a462a538cd12658795afcde5046b17" />
@@ -49160,8 +39224,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions 3 (4am crack).dsk" size="143360" crc="9c6e7a0d" sha1="e38f970d944af864f5c1ed0e1b185ae071108e95" />
@@ -49176,8 +39240,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="fractions 5- the river (4am crack).dsk" size="143360" crc="3b79dea9" sha1="26ac6e52b98aa09bb2d66a335ba08c40e86df2b9" />
@@ -49192,8 +39256,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="multiplication 2 (4am crack).dsk" size="143360" crc="7b9a592d" sha1="bc607ec69d84bf1b6464383df96f96f6101c5836" />
@@ -49208,8 +39272,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="147456">
<rom name="multiplication 3- the mysteries of multiplication (4am crack).dsk" size="147456" crc="7e4d0887" sha1="320d2b27763f0ef7cf087ff21a909822a40d4380" />
@@ -49224,8 +39288,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-19-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="numeration 1 (4am crack).dsk" size="143360" crc="abe01a8e" sha1="602ec5934eef43c098d4373d4594cb2cfb18b531" />
@@ -49240,8 +39304,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="percent 1- get the percent (4am crack).dsk" size="143360" crc="a238c29c" sha1="60d0d741a5a9de4c6c47ddb5f96dff2c3859ce8e" />
@@ -49256,8 +39320,8 @@ license:CC0-1.0
<info name="programmer" value="Thomas Hartsig" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="percent 2 (4am crack).dsk" size="143360" crc="7e5171c2" sha1="960b323f5b8876a19859e31e062cf9243063a351" />
@@ -49271,8 +39335,8 @@ license:CC0-1.0
<publisher>CONDUIT Educational Software</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-26-->
- <!--educational demo-->
+ <!-- Dump released: 2020-07-26 -->
+ <!-- educational demo -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math demo disk #1- secondary mathematics (4am crack).dsk" size="143360" crc="3bd5e0b8" sha1="46141c42ee3c640c7f1d50cfd8f7b2e28f2017bf"/>
@@ -49284,11 +39348,12 @@ license:CC0-1.0
<description>Mathematics Demonstration Disk #2: Graphing Equations and Interpreting Graphs (4am crack)</description>
<year>1983</year>
<publisher>CONDUIT Educational Software</publisher>
- <info name="programmer" value="Sharon Dugdale and David Kibbey" />
+ <info name="programmer" value="Sharon Dugdale" />
+ <info name="programmer" value="David Kibbey" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-08-01-->
- <!--educational demo-->
+ <!-- Dump released: 2020-08-01 -->
+ <!-- educational demo -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math demo disk #2- graphing equations and interpreting graphs (4am crack).dsk" size="143360" crc="3670cfab" sha1="5a22a0033cafbc54e6927853b792339a83145a12"/>
@@ -49302,8 +39367,8 @@ license:CC0-1.0
<publisher>CONDUIT Educational Software</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-08-01-->
- <!--educational demo-->
+ <!-- Dump released: 2020-08-01 -->
+ <!-- educational demo -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="math demo disk #3- postsecondary mathematics (4am crack).dsk" size="143360" crc="0a2696bd" sha1="688e8283d2efea83874abe7c6d297b0871ae9b99"/>
@@ -49311,15 +39376,162 @@ license:CC0-1.0
</part>
</software>
+ <software name="mv1grle">
+ <description>Mathematics Volume 1: Graphing, Logic, and Equations (A-706 version 3.2) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-706" />
+ <info name="programmer" value="Greg Thornton" />
+ <info name="programmer" value="Joe Demuth" />
+ <info name="programmer" value="Darrell Ricke" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Peter Arcand" />
+ <info name="programmer" value="Todd Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a706 mathematics volume 1- graphing, logic, and equations v3.2 (4am crack).dsk" size="143360" crc="7e252c22" sha1="6ba3c08ced4504381caa4ff4b00634ac323b412f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv2meas">
+ <description>Mathematics Volume 2: Measurement (A-737 version 1.2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-737" />
+ <info name="programmer" value="Tom Boe" />
+ <info name="programmer" value="Russ Erickson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a737 mathematics volume 2- measurement v1.2 (4am crack).dsk" size="143360" crc="1cb515c8" sha1="0d8b311aa1d01d5b5d1e44ac1966070a3682e995"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv3geo12" cloneof="mv3geo">
+ <description>Mathematics Volume 3: Geometry (Formulas, Shapes, and Skills) (A-738 version 1.2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-738" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a738 mathematics vol. 3 v1.2 (4am crack).dsk" size="143360" crc="05cc380f" sha1="f79741ad323b6ac8774ffa78a12ad2bad12e97cd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv3geolb" cloneof="mv3geo">
+ <description>Mathematics Volume 3: Geometry (Formulas, Shapes, and Skills) (A-738 version 1.3) (limited boot backup) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-738" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <!-- The limited boot backup self-destruct after 50 boots feature has been removed. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a738 mathematics volume 3- geometry- limited boot backup v1.3 (4am crack).dsk" size="143360" crc="093c9464" sha1="a0daf717408cf82036b0e44c4c5e8e91b7807e6f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv3geo">
+ <description>Mathematics Volume 3: Geometry (Formulas, Shapes, and Skills) (A-738 version 1.3) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-738" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a738 mathematics volume 3- geometry v1.3 (4am crack).dsk" size="143360" crc="b1fa1ef3" sha1="88b127b699a399e45c3d178f9de742c91b798642"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv4adv">
+ <description>Mathematics Volume 4: Advanced Math (A-744 version 1.3) (4am crack)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-744" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a744 mathematics vol. 4 v1.3 (4am crack).dsk" size="143360" crc="29201f0d" sha1="4cb3d7bd57b79bb7af1b0d165d38f1d311a6c909" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathwdpg2">
+ <description>Mathematics Word Problems Grade 2 (4am crack)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-10-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math word problems grade 2 (4am crack).dsk" size="143360" crc="42aed3e4" sha1="dbedef74f9280c321141e383579e7dd834b44728" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathwdpg3">
+ <description>Mathematics Word Problems Grade 3 (4am crack)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mathematics word problems grade 3 (4am crack).dsk" size="143360" crc="71c69657" sha1="a12e698502f5c123a23a8946998dc01ad332c303" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mathwdpg7">
- <description>Mathematics Word Problems - Grade 7 (4am crack)</description>
+ <description>Mathematics Word Problems Grade 7 (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-17-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mathematics word problems grade 7 (4am crack).dsk" size="143360" crc="9f014985" sha1="d8e44dff35856b196dcd92dbd88bcdfe2daa0c07" />
@@ -49328,14 +39540,14 @@ license:CC0-1.0
</software>
<software name="mathwdpg8">
- <description>Mathematics Word Problems - Grade 8 (4am crack)</description>
+ <description>Mathematics Word Problems Grade 8 (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-17-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mathematics word problems grade 8 (4am crack).dsk" size="143360" crc="217a5c77" sha1="f3acf1c236f8dec83cdb876bf1d2fbda28dd7b73" />
@@ -49350,8 +39562,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mathosaurus- computation (4am crack).dsk" size="143360" crc="a51ff617" sha1="157e0a16ab7713c2e22f619d9814ba79bc36c702" />
@@ -49366,8 +39578,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mathosaurus- kindergarten (4am crack).dsk" size="143360" crc="67deee61" sha1="a91ca89ff42621e8c028116beb3fc0319002cb35" />
@@ -49375,50 +39587,150 @@ license:CC0-1.0
</part>
</software>
- <software name="mdqpres11" cloneof="mdqpres">
- <description>MECC Dataquest: The Presidents (A-140 version 1.1) (4am crack)</description>
- <year>1985</year>
+ <software name="measwork_525">
+ <description>Measure Works (A-246 version 1.0) (4am crack)</description>
+ <year>1989</year>
<publisher>MECC</publisher>
- <info name="partno" value="A-140" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <info name="version" value="1.1" />
+ <info name="partno" value="A-246" />
+ <info name="programmer" value="Elizabeth Bell" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a246 measure works v1.0 (4am crack).dsk" size="143360" crc="ceca4bb0" sha1="8a1d109b4ede5cf92395a4a930fac6106ec5deee"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="measecon">
+ <description>Measuring Economic Activity (4am crack)</description>
+ <year>1985</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Mark D. Rothman, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2022-04-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
- <rom name="mecc-a140 mecc dataquest- the presidents v1.1 (4am crack) side a.dsk" size="143360" crc="1f15f0e9" sha1="69e2cf42cab15b6f92546ab1fd5c99cce0e855b8" />
+ <rom name="measuring economic activity (4am crack).dsk" size="143360" crc="7d7b5cd8" sha1="b33a3bdfbb733d03af008bc48eff76cabfe543b2"/>
</dataarea>
</part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
+ </software>
+
+ <software name="mdqasiaoc">
+ <description>MECC Dataquest: Asia and Oceania (A-254 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-254" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="mecc-a140 mecc dataquest- the presidents v1.1 (4am crack) side b.dsk" size="143360" crc="a4eff65b" sha1="37f84923543feac99a5c40b2e5acd5945ba150bb" />
+ <rom name="mecc-254 mecc dataquest- asia and oceania v1.0 (4am crack).dsk" size="143360" crc="91e770b9" sha1="fd23956a1c67a2def4b3c0ceb44b8f3dd4a1bf41"/>
</dataarea>
</part>
</software>
- <software name="mdqpres">
- <description>MECC Dataquest: The Presidents (A-140 version 1.2) (4am crack)</description>
- <year>1985</year>
+ <software name="mdqeursu">
+ <description>MECC Dataquest: Europe and the Soviet Union (A-253 version 1.0) (4am crack)</description>
+ <year>1990</year>
<publisher>MECC</publisher>
- <info name="partno" value="A-140" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <info name="version" value="1.2" />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-10-->
- <!--educational program-->
+ <info name="partno" value="A-253" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
- <rom name="mecc-a140 mecc dataquest - the presidents v1.2 (4am crack) side a.dsk" size="143360" crc="f6ca8cc6" sha1="b6922153cf050e185674ae132f5dccdac259fc2c" />
+ <rom name="mecc-a253 mecc dataquest - europe and soviet union v1.0 (4am crack).dsk" size="143360" crc="1c43f036" sha1="fa5968516e6d1399adb5b41b95210d28d35065f3" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
+ </software>
+
+ <software name="mdqlatina">
+ <description>MECC Dataquest: Latin America (A-243 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-243" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="mecc-a140 mecc dataquest - the presidents v1.2 (4am crack) side b.dsk" size="143360" crc="4ee86200" sha1="46db8c27e9605440a156e3d9597220864cae7dc9" />
+ <rom name="mecc-a243 mecc dataquest - latin america v1.0 (4am crack).dsk" size="143360" crc="147c0206" sha1="b0c2f14f65ec0c6e29cb5eb25086b4dd48e0382b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqnamam10" cloneof="mdqnamam">
+ <description>MECC Dataquest: North American Mammals (A-250 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-250" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a250 mecc dataquest- north american mammals v1.0 (4am crack).dsk" size="143360" crc="eb7e12f6" sha1="79d7609a113617d002a7d425fa52f7debca24d5f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqnamam">
+ <description>MECC Dataquest: North American Mammals (A-250 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-250" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a250 mecc dataquest- north american mammals v1.1 (4am crack).dsk" size="143360" crc="d04dc175" sha1="870539d1bedc4b04d57269ff92c692447f92fc82"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqmidenaf">
+ <description>MECC Dataquest: The Middle East and North Africa (A-244 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-244" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a244 mecc dataquest- the middle east and north africa v1.0 (4am crack).dsk" size="143360" crc="5f17c471" sha1="58fa47eb5239c1836a076992509592bd9bcb11b8"/>
</dataarea>
</part>
</software>
@@ -49427,13 +39739,17 @@ license:CC0-1.0
<description>MECC Early Learning Series: Arithmetic Critters (A-166 version 1.0) (4am crack)</description>
<year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-166" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Robert J. Granvin" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Loren Sucher" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a166 arithmetic critters v1.0 (4am crack).dsk" size="143360" crc="d0385057" sha1="57132c71d767a4ac40fc504b9e6eaabc7880cb48"/>
@@ -49445,13 +39761,17 @@ license:CC0-1.0
<description>MECC Early Learning Series: Counting Critters (A-165 version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-165" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Robert J. Granvin" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Loren Sucher" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a165 counting critters v1.0 (4am crack).dsk" size="143360" crc="e9f68839" sha1="cc7b3b89807c6e1d5afe803b92d37ba8cb620f4b"/>
@@ -49459,17 +39779,68 @@ license:CC0-1.0
</part>
</software>
+ <software name="melflfun10" cloneof="melflfun">
+ <description>MECC Early Learning Series: First-Letter Fun (A-154 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-154" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Diane Spiegel" />
+ <info name="programmer" value="Tim Anderson" />
+ <info name="programmer" value="Jim Bullis" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a154 first-letter fun v1.0 (4am crack).dsk" size="143360" crc="8b05a941" sha1="d4ca9fd61a77c9f787c75a037e6b9d96e230f400" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melflfun">
+ <description>MECC Early Learning Series: First-Letter Fun (A-154 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-154" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Diane Spiegel" />
+ <info name="programmer" value="Tim Anderson" />
+ <info name="programmer" value="Jim Bullis" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a154 first-letter fun v1.1 (4am crack).dsk" size="143360" crc="3969f28b" sha1="1cb4650cf1f73a09ef5ebdd77a3fce885732757a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="melfunaz">
<description>MECC Early Learning Series: Fun from A to Z (A-164 version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-164" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a164 fun from a to z v1.0 (4am crack).dsk" size="143360" crc="2ea54e81" sha1="f109ed00e6296703ba41a7d04cd2633dbe8b72f7"/>
@@ -49477,20 +39848,1250 @@ license:CC0-1.0
</part>
</software>
- <software name="mkeybdmas">
- <description>MECC Keyboarding Master: Games and Drills (Student Program) (A-131 version 1.1) (4am crack)</description>
- <year>1985</year>
+ <software name="melpwwords10" cloneof="melpwwords">
+ <description>MECC Early Learning Series: Paint with Words (A-158 version 1.0) (4am crack)</description>
+ <year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="TIES" />
- <info name="partno" value="A-131" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="partno" value="A-158" />
+ <info name="programmer" value="John Krenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-25-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
- <rom name="mecc-a131 mecc keyboarding master v1.1 (4am crack).dsk" size="143360" crc="ac24dc09" sha1="0f3fe347c30c24de41cf77e59695a857edf51382"/>
+ <rom name="mecc-a158 paint with words v1.0 (4am crack) side a.dsk" size="143360" crc="567c767c" sha1="9cff2b75775a458c51068316961ff5df220f7e88" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a158 paint with words v1.0 (4am crack) side b.dsk" size="143360" crc="7ead1537" sha1="052fe2a9ae3e6a522c726ea726062b939bd216da" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpwwords">
+ <description>MECC Early Learning Series: Paint with Words (A-158 version 1.3) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-158" />
+ <info name="programmer" value="John Krenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a158 paint with words v1.3 (4am crack) side a.dsk" size="143360" crc="0d9156e6" sha1="4b229dbba782faf5cb81cc56d88b18df5bb74d5f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a158 paint with words v1.3 (4am crack) side b.dsk" size="143360" crc="3a65c5f6" sha1="e4abeb8d9164380b6192e00a303abdd9cde0ff49" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpatt10" cloneof="melpatt">
+ <description>MECC Early Learning Series: Patterns (A-227 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-227" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a227 patterns v1.0 (4am crack).dsk" size="143360" crc="f0b922ab" sha1="7cfcc850aca0a29384ef1eacee24e8e5eaf7165a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpatt11" cloneof="melpatt">
+ <description>MECC Early Learning Series: Patterns (A-227 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-227" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a227 patterns v1.1 (4am crack).dsk" size="143360" crc="0838f11a" sha1="8f28c3be8026571166087944f18234bde6946a04" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpatt">
+ <description>MECC Early Learning Series: Patterns (A-227 version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-227" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a227 patterns v1.2 (4am crack).dsk" size="143360" crc="75df4a84" sha1="67219bd6257e132342915c34dc72221b882d659d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpictc_525">
+ <description>MECC Early Learning Series: Picture Chompers (A-255 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-255" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Liz Wendland" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a255 picture chompers v1.0 (4am crack).dsk" size="143360" crc="2155af5c" sha1="90bf18c1e924f2c6e0c833d6b999771797c1e26b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmgaz_525">
+ <description>MECC Grammar Series: Grammar Gazette (A-273 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-273" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a273 grammar gazette v1.0 (4am crack).dsk" size="143360" crc="73f2d134" sha1="afa56b1a030692e5e71f4b79c5dc782f0be75436"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmgob_525">
+ <description>MECC Grammar Series: Grammar Gobble (A-306 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-306" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="David Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a306 grammar gobble v1.0 (4am crack).dsk" size="143360" crc="8f798b94" sha1="1cc77a8b8d6475eb1d96869a734128c30f99c271"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmmad_525">
+ <description>MECC Grammar Series: Grammar Madness (A-307 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-307" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a307 grammar madness v1.0 (4am crack).dsk" size="143360" crc="1f03936f" sha1="cc2faf8287c097ac0e26b4e5f38b9b4a30939c06"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmmon_525">
+ <description>MECC Grammar Series: Grammar Monsters (A-272 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-272" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John R. Ojanen" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a272 grammar monsters v1.0 (4am crack).dsk" size="143360" crc="bbc37ea6" sha1="efc9354e8331931d48a27477c9d32b3e0de8154b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmtoys_525">
+ <description>MECC Grammar Series: Grammar Toy Shop (A-271 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-271" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a271 grammar toy shop v1.0 (4am crack).dsk" size="143360" crc="c8084946" sha1="0b09e1388aa0220e7297b0373b8628abe2a3fb1a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moutline_525">
+ <description>MECC Outliner (A-228 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-228" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a228 mecc outliner v1.0 (4am crack).dsk" size="143360" crc="0ec517a3" sha1="aea3878c39dc0f9350aa18aebc818b4d33a0ca57"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptbd_525">
+ <description>MECC Reading Collection: Phonics Prime Time: Blends and Digraphs (A-179 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-179" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a179 phonics prime time- blends and digraphs v1.0 (4am crack).dsk" size="143360" crc="66cb41e3" sha1="2581a00550bdb9bd856ddfe25de183538c0a80ee"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptfc">
+ <description>MECC Reading Collection: Phonics Prime Time: Final Consonants (A-176 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-176" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Roger Seeling" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a176 phonics prime time- final consonants v1.0 (4am crack).dsk" size="143360" crc="caa2ac11" sha1="03ef069a1f56e3f77c52b7a91c01207192a0cf2a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptic">
+ <description>MECC Reading Collection: Phonics Prime Time: Initial Consonants (A-175 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-175" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Roger Seeling" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a175 phonics prime time- initial consonants v1.0 (4am crack).dsk" size="143360" crc="f7d81538" sha1="9ec7142ce5cc89ec8b21cb87ac5346cba81c7efb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptv1">
+ <description>MECC Reading Collection: Phonics Prime Time: Vowels I (A-177 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-177" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a177 phonics prime time- vowels i v1.0 (4am crack).dsk" size="143360" crc="c6eba371" sha1="ce860d36fc2fcca9e3e6e8a2aef5f14f958a15b5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptv2">
+ <description>MECC Reading Collection: Phonics Prime Time: Vowels II (A-178 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-178" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a178 phonics prime time- vowels ii v1.0 (4am crack).dsk" size="143360" crc="c629df4f" sha1="91f743d3e188de5a9b3575cf11f06fcceb9aeb58"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm1">
+ <description>MECC Reading Collection: Those Amazing Reading Machines I (A-185 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-185" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a185 those amazing reading machines i v1.0 (4am crack).dsk" size="143360" crc="dcf4433b" sha1="cf1c219b1aa2bd83807c10e4a921369e4e1dc921"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm2">
+ <description>MECC Reading Collection: Those Amazing Reading Machines II (A-186 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-186" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a186 those amazing reading machines ii v1.0 (4am crack).dsk" size="143360" crc="db6a9744" sha1="6a554f00f4f25a4c35aafee73c8a5bb02b200733"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm3">
+ <description>MECC Reading Collection: Those Amazing Reading Machines III (A-187 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-187" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a187 those amazing reading machines iii v1.0 (4am crack).dsk" size="143360" crc="aaf9cc01" sha1="a6715a6d1958c3f10d3e079168b8eaea1b8da716"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm4">
+ <description>MECC Reading Collection: Those Amazing Reading Machines IV (A-188 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-188" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a188 those amazing reading machines iv v1.0 (4am crack).dsk" size="143360" crc="aead822c" sha1="7d0ee74ec2471fb56cd284c07a6d254528e6b015"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwcit">
+ <description>MECC Reading Collection: Words at Work: Compound It! (A-183 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-183" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a183 words at work- compound it v1.0 (4am crack).dsk" size="143360" crc="d04c4112" sha1="8c2053ed56f1d8d5a0da966755126f86688cdf4c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwcact">
+ <description>MECC Reading Collection: Words at Work: Contraction Action (A-180 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-180" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a180 words at work- contraction action v1.0 (4am crack).dsk" size="143360" crc="ba34b024" sha1="e89aefdf4a8f9e05f107026cc168364de1c68a60"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwpp">
+ <description>MECC Reading Collection: Words at Work: Prefix Power (A-181 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-181" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a181 words at work- prefix power v1.0 (4am crack).dsk" size="143360" crc="83dfe3ba" sha1="5be548e4055e7db9ac5d927b2783f0e093d7500a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwss">
+ <description>MECC Reading Collection: Words at Work: Suffix Sense (A-182 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-182" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a182 words at work- suffix sense v1.0 (4am crack).dsk" size="143360" crc="92e3f1b4" sha1="f2aa869c3485b0ff83ebb96ebb92b12ad9d9d5d3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicbybird_525">
+ <description>MECC Science Inquiry Collection: Backyard Birds (A-216 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-216" />
+ <info name="programmer" value="Hassan Kaganda" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a216 backyard birds v1.0 (4am crack).dsk" size="143360" crc="c2aff632" sha1="620682c6be6567bd18e89bbfd0a28329c73cc592"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msiccavb_525">
+ <description>MECC Science Inquiry Collection: Cavity Busters (A-284 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-284" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Eileen Nannen" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a284 cavity busters v1.0 (4am crack).dsk" size="143360" crc="50bdfefc" sha1="581beb655316f30967d63eac2d7ea2f8de8b26da"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicclnd_525">
+ <description>MECC Science Inquiry Collection: Cleanwater Detectives (A-282 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-282" />
+ <info name="programmer" value="Vincent J. Erickson" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a282 cleanwater detectives v1.0 (4am crack).dsk" size="143360" crc="dcec5ce5" sha1="50a27abc33aa7a82199fb986f57a84410ba34738"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msic5stf_525">
+ <description>MECC Science Inquiry Collection: Five-Star Forecast (A-219 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-219" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a219 five-star forecast v1.0 (4am crack).dsk" size="143360" crc="98167ff6" sha1="24fa99949a0c4d5e953c8aa8323eb9faad5ba914"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicfosh_525">
+ <description>MECC Science Inquiry Collection: Fossil Hunter (A-220 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-220" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a220 fossil hunter v1.0 (4am crack).dsk" size="143360" crc="0ebebf1e" sha1="d0b462e0a9ee741315c128448e3df5a5c400a077"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicinvb10_525">
+ <description>MECC Science Inquiry Collection: Invisible Bugs (A-218 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-218" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a218 invisible bugs v1.0 (4am crack).dsk" size="143360" crc="ff5f12ff" sha1="10a41babe1b099e9f14a6f6b1e53ad404e31c08f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msiclung10">
+ <description>MECC Science Inquiry Collection: Lunar Greenhouse (A-215 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-215" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a215 lunar greenhouse v1.0 (4am crack).dsk" size="143360" crc="52740424" sha1="e64a3a9c10493dfb69591fbf36c0cc07a13f3192"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicminc_525">
+ <description>MECC Science Inquiry Collection: Miner's Cave (A-213 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-213" />
+ <info name="programmer" value="Dean Brown" />
+ <info name="programmer" value="Bob Eggers" />
+ <info name="programmer" value="Matt Osber" />
+ <info name="programmer" value="Susan Christie Thomas" />
+ <info name="programmer" value="Peter Dublin" />
+ <info name="programmer" value="Gary Fujiwara" />
+ <info name="programmer" value="Mildred Feloney" />
+ <info name="programmer" value="Herbert Fox" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a213 miner's cave v1.0 (4am crack).dsk" size="143360" crc="e070b0e6" sha1="94765d4d7353fc2f7484ec3c4ee7cbbcc45fe529"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmurm_525">
+ <description>MECC Science Inquiry Collection: Murphy's Minerals (A-221 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-221" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a221 murphy's minerals v1.0 (4am crack).dsk" size="143360" crc="66dd7299" sha1="c223aa0f93c28e6c969b736ef1796ba949c753bd"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmymat10">
+ <description>MECC Science Inquiry Collection: Mystery Matter (A-212 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-212" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a212 mystery matter v1.0 (4am crack).dsk" size="143360" crc="e9572a92" sha1="3ece54f857fa1d48d962a73159e0816774d2f968"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmyobj10" cloneof="msicmyobj">
+ <description>MECC Science Inquiry Collection: Mystery Objects (A-211 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Liz Husebye" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a211 mystery objects v1.0 (4am crack).dsk" size="143360" crc="0900c191" sha1="731317e36d2dfdd498eb2bbc90da9bf6baac5cfc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmyobj">
+ <description>MECC Science Inquiry Collection: Mystery Objects (A-211 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Liz Husebye" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a211 mystery objects v1.1 (4am crack).dsk" size="143360" crc="16fd7f16" sha1="873b85f0b60ad566f6c27f6d73095a2af560e601" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicppp_525">
+ <description>MECC Science Inquiry Collection: Paper Plane Pilot (A-281 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="programmer" value="Steve Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a281 paper plane pilot v1.0 (4am crack).dsk" size="143360" crc="3c1e21e3" sha1="2c700ab474e3f6443ebb31a871da50faf6b4e796"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicsuns_525">
+ <description>MECC Science Inquiry Collection: Sun and Seasons (A-222 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Liz Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a222 sun and seasons v1.0 (4am crack).dsk" size="143360" crc="45c002ef" sha1="21c065a7cd048bf26a7355128e14c316d0b67289"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicweedt_525">
+ <description>MECC Science Inquiry Collection: Weeds to Trees (A-217 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-217" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a217 weeds to trees v1.0 (4am crack).dsk" size="143360" crc="2a637486" sha1="c3c91d20a4eaabc78974ab78378df5fd1a1b84ed"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwcral10" cloneof="msicwcral">
+ <description>MECC Science Inquiry Collection: Wood Car Rally (A-214 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-214" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a214 wood car rally v1.0 (4am crack).dsk" size="143360" crc="1114aaac" sha1="c596513cbb09cf0624251220c5d8b294f1231913"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwcral">
+ <description>MECC Science Inquiry Collection: Wood Car Rally (A-214 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-214" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a214 wood car rally v1.1 (4am crack).dsk" size="143360" crc="2ee9b683" sha1="e0a01525ec3eb20d6c3cb1403b916f6cbd637a35"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwboun">
+ <description>MECC Science Inquiry Collection: Woolly Bounce (A-283 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-283" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kim D. Smith" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a283 woolly bounce v1.0 (4am crack).dsk" size="143360" crc="a8677a88" sha1="452251f799e55d64dc96a3423c1ea7f4955b235e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellpuz_525">
+ <description>MECC Spelling Series: Spelling Puzzles and Tests (A-234 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-234" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a234 spelling puzzles and tests v1.0 (4am crack).dsk" size="143360" crc="8ccf9c1e" sha1="2c248766e5833d4ae55a016cc5f8a4df96f80a78" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellev10" cloneof="msspellev_525">
+ <description>MECC Spelling Series: Spellevator (A-231 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-231" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Loren Sucher" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a231 spellevator v1.0 (4am crack).dsk" size="143360" crc="b42fea28" sha1="e957898dca42fb5bde7239813c2ef6c9211c4666"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellev12" cloneof="msspellev_525">
+ <description>MECC Spelling Series: Spellevator (A-231 version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-231" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Loren Sucher" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a231 spellevator v1.2 (4am crack).dsk" size="143360" crc="5f313951" sha1="f77d9ed6b668547cbb0d34b127f4ed780942326a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellev_525">
+ <description>MECC Spelling Series: Spellevator (A-231 version 1.3) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-231" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Loren Sucher" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a231 spellevator v1.3 (4am crack).dsk" size="143360" crc="01aba934" sha1="8ff0e51180b3ed93fbff517c638c442b2bf6ed76"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellle10" cloneof="msspellle">
+ <description>MECC Spelling Series: Spelling List Editor (A-230B version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230B" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230b spelling list editor v1.0 (4am crack).dsk" size="143360" crc="8bb00961" sha1="67976bbe84eee43715297e1ce202b4a292376802"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellle11" cloneof="msspellle">
+ <description>MECC Spelling Series: Spelling List Editor (A-230B version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230B" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230b spelling list editor v1.1 (4am crack).dsk" size="143360" crc="a6b3e91d" sha1="1b3afcfb967957358c4752c8a7bd5a22750d0000"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellle12" cloneof="msspellle">
+ <description>MECC Spelling Series: Spelling List Editor (A-230B version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230B" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230b spelling list editor v1.2 (4am crack).dsk" size="143360" crc="1ea13b8d" sha1="c8cbc13bfc9ed8d1411d237b3f1740a42dd05d38"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellle13" cloneof="msspellle">
+ <description>MECC Spelling Series: Spelling List Editor (A-230B version 1.3) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230B" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230b spelling list editor v1.3 (4am crack).dsk" size="143360" crc="04cf01b0" sha1="5153ae52883ad87d2f6b93c11f7ba1fcff1339a2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellle">
+ <description>MECC Spelling Series: Spelling List Editor (A-230B version 1.4) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230B" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230b spelling list editor v1.4 (4am crack).dsk" size="143360" crc="4acbc3d2" sha1="72be7248e61e5d6e0d0a1bc32ba393c7001647e4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellpr10" cloneof="msspellpr">
+ <description>MECC Spelling Series: Spelling Press (A-232 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-232" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a232 spelling press v1.0 (4am crack).dsk" size="143360" crc="95bdc5f3" sha1="8655d3f4e9889b0c0c7261b9cb22d5f847a0a772"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellpr">
+ <description>MECC Spelling Series: Spelling Press (A-232 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-232" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a232 spelling press v1.1 (4am crack).dsk" size="143360" crc="0814259c" sha1="749091bef3e40c55fda933ef431189db25c96857" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellw10" cloneof="msspellw_525">
+ <description>MECC Spelling Series: Spelling Workout (A-230 version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Charlyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230 spelling workout v1.0 (4am crack).dsk" size="143360" crc="a5294dd1" sha1="c4f73965a3170306e05cd78e39e349ba96ebf75a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellw_525">
+ <description>MECC Spelling Series: Spelling Workout (A-230 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Charlyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a230 spelling workout v1.1 (4am crack).dsk" size="143360" crc="ac924999" sha1="176cb9c863bbdb074a5a971ed35b29b93f9ec652"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mechbrig">
+ <description>Mech Brigade (version 1.2) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Game and boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mech brigade v1.2 (4am and san inc crack) disk 1 - game (boot).dsk" size="143360" crc="d980a62d" sha1="d3045577dc03d823c4c20e8195f3ec68cbcd9451" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Scenario"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mech brigade v1.2 (4am and san inc crack) disk 2 - scenario.dsk" size="143360" crc="f115d3cf" sha1="9f4f9b759e236ba6ed6d8092ed6fb78d95301eea" />
</dataarea>
</part>
</software>
@@ -49503,8 +41104,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="04.13.84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="medalist series- black americans v04.13.84 (4am crack).dsk" size="143360" crc="b8b36474" sha1="c34c8f135adab454aa5fb5368cfe28b3bb1d7a44" />
@@ -49520,8 +41121,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="11.23.84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="medalist series- presidents v11.23.84 (4am crack).dsk" size="143360" crc="65c98df8" sha1="48a23965a7d9a90c2d7f7543dd628e3150600abe" />
@@ -49537,8 +41138,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="09.27.85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-04-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-04-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="medalist series- presidents (4am crack).dsk" size="143360" crc="49991a47" sha1="57bbf36d45e0dc4d6cdd704a6a016ae520e909b1"/>
@@ -49554,8 +41155,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="08.09.83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-13-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="medalist series- states v08.09.83 (4am crack).dsk" size="143360" crc="41a38087" sha1="480b940e19b1a6dfda19475424ec9fdc9735d09a"/>
@@ -49571,8 +41172,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2017-05-31" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-31-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="medalist series - states (4am crack).dsk" size="143360" crc="83fd764c" sha1="2a00b865a4773712cdb399567b095d94ae54861a" />
@@ -49588,8 +41189,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="11.21.83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="medalist series- women in history v11.21.83 (4am crack).dsk" size="143360" crc="399688b6" sha1="600209c46184777953973cd7c0f54263fcfb3171" />
@@ -49597,16 +41198,149 @@ license:CC0-1.0
</part>
</software>
+ <software name="mmmelody">
+ <description>Media Magic: The Melody Studio (4am crack)</description>
+ <year>1990</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-01 -->
+ <!-- sound program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="media magic- the melody studio (4am crack) disk 1 - program.dsk" size="143360" crc="909e334b" sha1="76a278e2b2d7dce81796969bde3a0906db2ebbb6"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Songs disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="media magic- the melody studio (4am crack) disk 2 - songs.dsk" size="143360" crc="ae5f5c4c" sha1="ead8d10b5f65611b6029c81a6efcb6929903dcec"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="meetpres">
+ <description>Meet The Presidents (Softsmith) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Versa Computing" />
+ <info name="programmer" value="V. Bauman" />
+ <info name="programmer" value="S. Bernstein" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="meet the presidents (4am crack) disk 1.dsk" size="143360" crc="3b8c1637" sha1="34f163cc86f650e55057e3038473937e29dfbf28" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="meet the presidents (4am crack) disk 2.dsk" size="143360" crc="8d38a788" sha1="cb996e3dbec4d5c1ad7f139606e8d47557a26859" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="meet the presidents (4am crack) disk 3.dsk" size="143360" crc="34b07a92" sha1="ebc9288035856ef0b51aad93afac8df6b49f18c2" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="meet the presidents (4am crack) disk 4.dsk" size="143360" crc="3961fd70" sha1="cfce4d1391268eba05cb2adb56726b2035920cd4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memblbl86" cloneof="memblbl">
+ <description>Memory Building Blocks (version 1986) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Owen" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later and a Touch Window, add-on touchscreen." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="memory building blocks (4am crack).dsk" size="143360" crc="920d72aa" sha1="134b757c80271f2bdef3c15b3f62ff1bfbe65618" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memblbl">
+ <description>Memory Building Blocks (version 30-JUN-1989) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Owen" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later and a Touch Window, add-on touchscreen." />
+ <info name="version" value="30-JUN-1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="memory building blocks 1989 (4am crack).dsk" size="143360" crc="0d26696e" sha1="7ed271f29776dd32e1b9374520fdce3697aa33c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memcastl">
+ <description>Memory Castle (version 1983) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="memory castle 1983 (4am crack).dsk" size="143360" crc="9478ed1e" sha1="170aa3d36733aa9343a4590df1c23a63f44396f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mmatch86">
+ <description>Memory Match (version 01.24.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="01.24.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="memory match 01.24.86 (4am crack).dsk" size="143360" crc="13ba215a" sha1="c4b99793ee9793763f7d6755331018385344d36f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mettutr">
<description>Metric System Tutor (4am crack)</description>
<year>1980</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
- <info name="programmer" value="Wayne Williams and Paul Williams" />
+ <!-- E.M.E Corporation -->
+ <info name="programmer" value="Wayne Williams" />
+ <info name="programmer" value="Paul Williams" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-19-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="metric system tutor (4am crack).dsk" size="143360" crc="743534c6" sha1="47ea8c215580c0ba58d516e38e59d19417933134"/>
@@ -49614,6 +41348,219 @@ license:CC0-1.0
</part>
</software>
+ <software name="microbar">
+ <description>Micro Barmate (version 1.0) (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Virtual Combinatics" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="micro barmate (softsmith) (4am and san inc crack) disk 1 - program disk.dsk" size="143360" crc="ae3ffc60" sha1="9a8d27eef761ddee2539afb00df31123fd76daf2"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Recipe"/>
+ <dataarea name="flop" size="143360">
+ <rom name="micro barmate (softsmith) (4am and san inc crack) disk 2 - recipe disk.dsk" size="143360" crc="fda44cc2" sha1="545380d53bad9a38197992c07b31a5697c3bf066"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlbbs">
+ <description>Micro League Baseball (Stoneware) (4am crack)</description>
+ <year>1980</year>
+ <publisher>Stoneware</publisher>
+ <info name="programmer" value="Arthur Wells, Jr." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- This is a different game than Micro League Baseball by Micro League Sports Association. -->
+ <!-- Dump released: 2017-11-26 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro league baseball (4am crack).dsk" size="143360" crc="ee6237b4" sha1="e77be478ca53962269d875b9742dda50475272e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml1plnva">
+ <description>Micro-LADS 1: Plurals &amp; Noun-Verb Agreement (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 1 plurals and noun-verb agreement (4am crack).dsk" size="143360" crc="6dad9d98" sha1="9b5b16ea2e00a1e21edaffbeeaee5d6ebd169bb9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml2verbf">
+ <description>Micro-LADS 2: Verb Forms (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 2 verb forms (4am crack).dsk" size="143360" crc="3709e7bc" sha1="18b2b5e5cc9a93cb2fe3c88cfec1fdcd44e274b4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml3preps">
+ <description>Micro-LADS 3: Prepositions (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 3 prepositions (4am crack).dsk" size="143360" crc="9b6a204f" sha1="1f2f134486f43e598b563cf759fe6ed9b5d3c985" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml4pron">
+ <description>Micro-LADS 4: Pronouns (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 4 pronouns (4am crack).dsk" size="143360" crc="fa9c708b" sha1="1a8cc921112a24404d39d188dce7abbbd527afbf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml5nega">
+ <description>Micro-LADS 5: Negatives (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 5 negatives (4am crack).dsk" size="143360" crc="244e65c5" sha1="ce6752867230430e35dbea0dfe91bc4420f9dc2c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml6deiex">
+ <description>Micro-LADS 6: Deictic Expressions, Passive, &amp; WH-questions (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 6 deictic expressions, passive, and wh-questions (4am crack).dsk" size="143360" crc="1fa593ca" sha1="190dde1093f0f759dc2f5d848a6358d351cbe43c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml7prep2">
+ <description>Micro-LADS 7: Prepositions II (4am crack)</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro-lads 7 prepositions ii (4am crack).dsk" size="143360" crc="35a599f2" sha1="056372e56805dabad02d3e193d1f1b54d558d93a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microbem" cloneof="microbe">
+ <description>Microbe: The Anatomical Adventure (supports Mockingboard) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="alt_title" value="Eduventure #1: Microbe: The Anatomical Adventure" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="Alan H. Zalta, M.D." />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="microbe (supports mockingboard)(4am crack).dsk" size="143360" crc="ab19e7b6" sha1="aa7842f68f60f3ac55c502ea423f6fc8958b37cd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microbe">
+ <description>Microbe: The Anatomical Adventure (revision 3) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="alt_title" value="Eduventure #1: Microbe: The Anatomical Adventure" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="Alan H. Zalta, M.D." />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="revision 3" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="microbe rev. 3 (4am crack).dsk" size="143360" crc="287270b1" sha1="3f9a1950131310c3cbaf5b45c7992ec4748e662f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="micrjrny">
+ <description>Microscopic Journey (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Dan Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="microscopic journey (4am crack).dsk" size="143360" crc="78479c3f" sha1="02ab3f200a412f472ad8a63d90583b08072039f8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mtypingii">
<description>Microtyping II (4am crack)</description>
<year>1983</year>
@@ -49621,8 +41568,8 @@ license:CC0-1.0
<info name="programmer" value="Dr. C. William Engel" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="microtyping ii (4am crack).dsk" size="143360" crc="cb0a46d5" sha1="ecfa0423074b96e053802184ebea3d95950d74ef" />
@@ -49630,6 +41577,1130 @@ license:CC0-1.0
</part>
</software>
+ <software name="microz1">
+ <description>Microzine 1 (4am crack)</description>
+ <year>1983</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Ame C. Flynn" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Bob Neumann" />
+ <info name="programmer" value="Megan Stine" />
+ <info name="programmer" value="H. William Stine" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-20 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - twistaplot, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 1 (4am crack) side a.dsk" size="143360" crc="9e666b8a" sha1="ec96944073b36f5d7464230459dfe09a9b2eca65" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - ask me, poster, secret files, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 1 (4am crack) side b.dsk" size="143360" crc="cb976c03" sha1="1f5e59cf060c878952ed3c0b75eded361d349d9b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz2">
+ <description>Microzine 2 (4am crack)</description>
+ <year>1983</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Ame C. Flynn" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Bob Neumann" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-25 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - what's inside, northwoods adventure, melody maker, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 2 (4am crack) side a.dsk" size="143360" crc="72bb6ddd" sha1="9aee8893352c1d4120e9c1982376795c79d20f13" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - ride the wind, word ladder, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 2 (4am crack) side b.dsk" size="143360" crc="25257804" sha1="71586b80a5615afa6d343455d83bafd2693076bc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz3">
+ <description>Microzine 3 (4am crack)</description>
+ <year>1983</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="M. Brooks Jones" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-06 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - what's inside, mystery at pinecrest manor, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 3 (4am crack) side a.dsk" size="143360" crc="7c9bbc2b" sha1="c1236457b86e0cf323971af437f628e55edd14a7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - tag, bookstore, amazing robot" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 3 (4am crack) side b.dsk" size="143360" crc="b6b7481e" sha1="2c9873412400a825dfe1dc3176a2a70fc45be600" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz4">
+ <description>Microzine 4 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="M. Brooks Jones" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-27 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - what's inside, adventures in the microzine, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 4 (4am crack) side a.dsk" size="143360" crc="96b1dfcc" sha1="6a491c14cf99ccb3f8e2a824a4fe01ad94d2d778" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - log-it , traps, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 4 (4am crack) side b.dsk" size="143360" crc="fd39ac1c" sha1="24b5c754ab766be82b81e144c49841fad0c039af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz5">
+ <description>Microzine 5 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-18 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - what's inside, pirates of the soft seas" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 5 (4am crack) side a.dsk" size="143360" crc="d7c11cf2" sha1="6c5b6d8cff999cf4830a5a417ac3afca71e7084f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - story teller, amazing robot ii, fences, computer stuff, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 5 (4am crack) side b.dsk" size="143360" crc="518c5ae6" sha1="6c628a1cd850373c8dfdb924a41fb4e8353ac2c0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz6">
+ <description>Microzine 6 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-30 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - what's inside, fossils alive, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 6 (4am crack) side a.dsk" size="143360" crc="6be25dc8" sha1="c3dfc7b20c43c82a5d121eed4c7e350c4e009a87" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - olympic news, free store, sound off , what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 6 (4am crack) side b.dsk" size="143360" crc="e6b262e2" sha1="64a1f11e61afe1fc8cb8c84b1ae69fa9d085ee53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz7">
+ <description>Microzine 7 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Maryl Skinner" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-23. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - what's inside, brain drain, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 7 (4am crack) side a.dsk" size="143360" crc="591e67f8" sha1="0c49c240a23b5a85fd726ef48b69846c59ba4004" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - survey taker, city blocks, back page, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 7 (4am crack) side b.dsk" size="143360" crc="963acf79" sha1="cdaa13217113d64d45cad49e87807bb7d6755a34" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz8">
+ <description>Microzine 8 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Richard Rathe" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-29 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, zazoo come home, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 8 (4am crack) side a.dsk" size="143360" crc="cfe70144" sha1="19530e59961ff79c8c24b8be85b4517bcaacbc30" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - secret journal, drawing board, back page, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 8 (4am crack) side b.dsk" size="143360" crc="5a596733" sha1="2e2e6b3dae2e60703e91823900cdb0bafd1cf62a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz9">
+ <description>Microzine 9 (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Richard Rathe" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Malcom Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-23. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, the big nap, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 9 (4am crack) side a.dsk" size="143360" crc="3f254d1a" sha1="ce91eee0736aa177ebdf980b6be36de841f25de0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - budget maker, quizzler, back page, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 9 (4am crack) side b.dsk" size="143360" crc="b67df29c" sha1="7ffd5df5a86c6dafc580b5e63d8c27c66823177f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz11">
+ <description>Microzine 11 (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Malcom Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-23 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, the dark tower, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 11 (4am crack) side a.dsk" size="143360" crc="0abc0997" sha1="3bb156c59d8cd499751485c3499333d65da329b4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - secret coder, sticker factory, back page, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 11 (4am crack) side b.dsk" size="143360" crc="69dbf006" sha1="5b30ed2febb8d290b3570d6dce3983afd6522de6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz12">
+ <description>Microzine 12 (4am crack)</description>
+ <year>????</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Dick Smith" />
+ <info name="programmer" value="Neal Vaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-15 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, wagons west, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 12 (4am crack) side a.dsk" size="143360" crc="4e34eb06" sha1="3c5efbbd14b9fab9df9c9e1ef6d1ca045e70902c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - newspaper maker, t-shirt puzzles, micro-toon, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 12 (4am crack) side b.dsk" size="143360" crc="ba3ee938" sha1="68a23c114a1f47e1b925e3898d7ca7459a5561ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz13">
+ <description>Microzine 13 (4am crack)</description>
+ <year>????</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Anthony Hertzel" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Rich Webber" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-22 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, the frog and the fables, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 13 (4am crack) side a.dsk" size="143360" crc="101b052b" sha1="7d79c8b905b5759bb586cd87b96a71cf82b9c01d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - the secret of the sphinx, who's who in outer space, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 13 (4am crack) side b.dsk" size="143360" crc="eeeb2466" sha1="df92e9da8127c02d7bf856e05e3ede430266cfcd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz14">
+ <description>Microzine 14 (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Judi Bliss" />
+ <info name="programmer" value="Neil Montague" />
+ <info name="programmer" value="Ron Mignery" />
+ <info name="programmer" value="Alison Yamaguchi" />
+ <info name="programmer" value="Melissa Hagan" />
+ <info name="programmer" value="Karen Luti" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, the funhouse caper, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 14 (4am crack) side a.dsk" size="143360" crc="d85e30b8" sha1="be0ff9c0d7d46cb57a3106de4ef7ba8ee23d8eee" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - cartoon maker, inventors and inventions, puzzler, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 14 (4am crack) side b.dsk" size="143360" crc="194f42a3" sha1="57e4ef80ae4be866e153e6c7feaf579995fcb53c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz15">
+ <description>Microzine 15 (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-28 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, 2088- an oval office odyssey, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 15 (4am crack) side a.dsk" size="143360" crc="4d657f14" sha1="f596ce8e2baa51165ac48a6e2817b9e35ee29384" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - keyboarding, roundup, estimator, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 15 (4am crack) side b.dsk" size="143360" crc="480860b7" sha1="a96328311c52e7485c263665b32ad217cd7b9ce4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz16">
+ <description>Microzine 16 (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-28 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, tickets to america, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 16 (4am crack) side a.dsk" size="143360" crc="bc17e015" sha1="762ffd978514ff11375def0cef2dd3d98f5daf3d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - shifty shapes, solar pilot, atgtfp, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 16 (4am crack) side b.dsk" size="143360" crc="4d55c818" sha1="6ca337e6b6cdf9cd359add5af663920e7f758842" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz17">
+ <description>Microzine 17 (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-15 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, microagent of the body guard, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 17 (4am crack) side a.dsk" size="143360" crc="1ae5dafb" sha1="e6f094eac3eef6aeb087e216cd06cb9a19b48636" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - mission- mix-up, marvelous menagerie, basic training, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 17 (4am crack) side b.dsk" size="143360" crc="0b54abab" sha1="1bc21af7fbb0b487f2cefdcd8bc8aefe6d41dadb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz18">
+ <description>Microzine 18 (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Peter Berger" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="John Risken" />
+ <info name="programmer" value="Neal Vaughn" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-15 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, history mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 18 (4am crack) side a.dsk" size="143360" crc="5629d036" sha1="9d4056e9cc7e15837ee7130acf6a191feb6ebff5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - computer stuff, scholasticalc, letter writer, rose and calumny" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 18 (4am crack) side b.dsk" size="143360" crc="de57b45a" sha1="7bcec7ca4b8c850ca320633d22f1b79503252869" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz19">
+ <description>Microzine 19 (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Anthony Hertzel" />
+ <info name="programmer" value="David G. Oimon" />
+ <info name="programmer" value="Davideo" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letter from the editor, malice in wonderland" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 19 (4am crack) side a.dsk" size="143360" crc="017db69b" sha1="ffea42ceb5b2dce7e07ec1a2a00f31fb2bb1f7cb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - computer stuff, animation lab, calendar, estimator, what's next" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 19 (4am crack) side b.dsk" size="143360" crc="8851de17" sha1="6a163f247a6951303c40c48db43380979b636520" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz20">
+ <description>Microzine 20 (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-16 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letters, voyage to see what's on the bottom, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 20 (4am crack) side a.dsk" size="143360" crc="06366c44" sha1="4b89af730aeb13dd468986401d24f24ae4ed27a3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - interactions, heros and villains, monitor mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 20 (4am crack) side b.dsk" size="143360" crc="a7aae272" sha1="72cf4c2039500d8f790a7c7d692c1727c25fa299" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz21">
+ <description>Microzine 21 (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Elisabeth Gitelle" />
+ <info name="programmer" value="Mark I. Malamud" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - robot rescue, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 21 (4am crack) side a.dsk" size="143360" crc="f1dfb9a1" sha1="766968384da072fb8f4b8d2e7975d8cfa14b0325" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - fabulous kids, fill in the blanks, monitor mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 21 (4am crack) side b.dsk" size="143360" crc="ddf708c5" sha1="a73c3e3812edfa8192ff38ae3d689b12a45cb84f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz22">
+ <description>Microzine 22 (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-16 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - letters, the haunted channels, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 22 (4am crack) disk 1 side a.dsk" size="143360" crc="3d7ff291" sha1="5d2a09f8f00c74aa521711f8a4a65e8f988fba45" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - math mall, monitor mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 22 (4am crack) disk 1 side b.dsk" size="143360" crc="8bba3bf3" sha1="e218a1f1851bf15e6683519d773ec6bebd6e9549" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - newsprint" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 22 (4am crack) disk 2.dsk" size="143360" crc="6680bd05" sha1="83b165874ab626007a5438fe3336f607266538da" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz23">
+ <description>Microzine 23 (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Dan Kinch" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-30 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <!-- Missing disk 2 containing the "greetings" application. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letters, escape from antcatraz, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 23 (4am crack) side a.dsk" size="143360" crc="f889c02f" sha1="400706e9421826d0aa4db897b3ac3fcfa3c757d5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - math mall, monitor mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 23 (4am crack) side b.dsk" size="143360" crc="29f864ad" sha1="059d64998daa7579a2d17bf7a2205d58f9e912f4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - greetings" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine no. 23 (1987)(scholastic) - disk 2- greetings.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz24">
+ <description>Microzine 24 (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Jim Markowich" />
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Aaron Weaver" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - captains of the china trade, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 24 (4am crack) disk 1 side a.dsk" size="143360" crc="e7862317" sha1="869a6a75c17e8a36453bf2b744338fa26aa156c4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - dr. maxwell's molecule magic, monitor mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 24 (4am crack) disk 1 side b.dsk" size="143360" crc="c6fb87ab" sha1="29cc0fcb3056114f16f65cb9882798eac11ba870" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - banner maker" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 24 (4am crack) disk 2.dsk" size="143360" crc="75dd81e1" sha1="45d6d33704a13e0b71acbdac7eb8923a3f7f1172" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz25">
+ <description>Microzine 25 (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="JoAnn Comito" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-14 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <!-- Missing disk 2 containing the "blueprint maker" application. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - letters, cosmic heroes, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 25 (4am crack) side a.dsk" size="143360" crc="de74fe0a" sha1="51c8e5923503377a2e89fe15dc8a97fcc33b2c60" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - the learning machine, picture this" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 25 (4am crack) side b.dsk" size="143360" crc="45e94581" sha1="13f3c3179ab4f47905f0732956c70d36ec37b54a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - blueprint maker" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine no. 25 (1988)(scholastic) - disk 2- blueprint maker.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz26">
+ <description>Microzine 26 (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <!-- Missing disk 2 containing the "congratulations" application. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - the wizard of darkling wood, letters, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 26 (4am crack) side a.dsk" size="143360" crc="f38b0586" sha1="59c4e0bd0b942e2f35b1d4bab94f90bfb01e19a7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - the wizard of darkling wood, letters, computer stuff" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 26 (4am crack) side b.dsk" size="143360" crc="62ddd009" sha1="525a8a3b609bffb20e32cf555e94bdfa072057a9" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - congratulations" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine no. 26 (1988)(scholastic) - disk 2- congratulations.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz27">
+ <description>Microzine 27 (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - microzine guide, monitor mystery" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 27 (4am crack) disk 1 side a.dsk" size="143360" crc="dd23e9a6" sha1="c8a16a146d2ee2668bd4176f84ef6447fa59a277" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - rebus maker" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 27 (4am crack) disk 1 side b.dsk" size="143360" crc="78901b86" sha1="07ffc243b5e1efc24765652847cd2b3ca431259e" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - constellation odyssey" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 27 (4am crack) disk 2 side a.dsk" size="143360" crc="5e2e691b" sha1="9f250c761a6f7999b72da0235627347a90221d89" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - the learning machine" />
+ <dataarea name="flop" size="143360">
+ <rom name="microzine 27 (4am crack) disk 2 side b.dsk" size="143360" crc="0eef531f" sha1="edfedfe58247cad9da28dbfbf6f0fe07c9608a68" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi4">
+ <description>MIDI/4 (revision 5) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2020-01-06 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="midi-4 (4am and san inc crack).dsk" size="143360" crc="14b0ad62" sha1="9e9eb73bd28412c2176c8b6d6b7fbe14b3a2f65e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi4pe">
+ <description>MIDI/4 Plus Enhanced Edition (version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-11-30 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="midi-4 plus enhanced edition v1.1 (4am crack).dsk" size="143360" crc="4da1c9b4" sha1="2e245f46a551cd4e3dd47c20944c13e006f8b1f5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi8p">
+ <description>MIDI/8 Plus (version 1.2) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2024-12-07 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="midi-8 plus v1.2 (4am and san inc crack).dsk" size="143360" crc="c8caa285" sha1="e8ef2427f2ce2c9f928191b75486dd73f9fbbe44" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi8p401">
+ <description>MIDI/8 Plus for MPU-401 (version 1.2) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2019-11-18 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="midi-8 plus (4am and san inc crack).dsk" size="143360" crc="39bf6550" sha1="7babdcdc5a3f778d0d3715565d466112dfa007c3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midmalad">
+ <description>Midnight Malady (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Steven Sacks" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="midnight malady (4am and san inc crack).dsk" size="143360" crc="343ab816" sha1="8dc6500ddea01ba83bd0294dad301c12459478e9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mghtmath">
+ <description>Mighty Math (4am crack)</description>
+ <year>1985</year>
+ <publisher>World Book</publisher>
+ <info name="developer" value="Synergistic Software"/>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mighty math (4am crack).dsk" size="143360" crc="cde288ce" sha1="f1eadcf76376196ebfd65e5921c71293549a2bf3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mmdaddsub">
+ <description>Milt's Math Drills: Addition and Subtraction (version 10.03.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="10.03.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="milt's math drills - addition and subtraction (4am crack) disk 1.dsk" size="143360" crc="dfdb0de7" sha1="d2040762d9a905d96820420ba977342e02b4cf23" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="milt's math drills - addition and subtraction (4am crack) disk 2.dsk" size="143360" crc="fae91095" sha1="591837e71d06f02b250073746f5e3fb7b1b83910" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mmdk1conc">
+ <description>Milt's Math Drills: K/1 Concepts (version 10.03.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="10.03.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="milt's math drills - k-1 concepts (4am crack) disk 1.dsk" size="143360" crc="c859f063" sha1="87e0131572c51b2eebc3200c0d187e729f23e50c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="milt's math drills - k-1 concepts (4am crack) disk 2.dsk" size="143360" crc="178dbbd1" sha1="c02fa9d1b92ae5f5f1f21172eb57e62d1d5a0b2f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mndcstl2">
+ <description>Mind Castle II (4am crack)</description>
+ <year>1984</year>
+ <publisher>MCE</publisher>
+ <info name="developer" value="MCE" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-27 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mind castle ii (4am crack).dsk" size="143360" crc="1837ae58" sha1="1b1877fcad8a561c138d3ab6bf4efd1dce7648d0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mindmror">
+ <description>Mind Mirror (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Futique, Inc." />
+ <info name="author" value="Timothy Leary" />
+ <info name="programmer" value="Peter van den Beemt" />
+ <info name="programmer" value="Bob Dietz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-23. Redumped: 2021-09-04 to fix additional delayed protection. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mind mirror (4am and san inc crack) disk 1 - program.dsk" size="143360" crc="b0e4f320" sha1="cb9d80fb4d5b3fb32269f4ecbd48f9f3dbf981e6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Life simulation A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mind mirror (4am and san inc crack) disk 2 - life simulation a.dsk" size="143360" crc="deb5215d" sha1="064d9d0f60ab7abece0eb48b79e116affd5d9a12" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Life simulation B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mind mirror (4am and san inc crack) disk 3 - life simulation b.dsk" size="143360" crc="57fdaa44" sha1="084e8b64eb4911cb2f53e6d22dfa1b266c050ffa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mindpzl10" cloneof="mindpzl">
<description>Mind Puzzles (A-780 version 1.0) (4am crack)</description>
<year>1983</year>
@@ -49639,8 +42710,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-29-->
- <!--education program-->
+ <!-- Dump released: 2021-03-29 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a780 mind puzzles v1.0 (4am crack).dsk" size="143360" crc="91bc793b" sha1="c57cfc44bdf619912e66e3707ae148281fe9ecaa"/>
@@ -49656,10 +42727,10 @@ license:CC0-1.0
<info name="programmer" value="Shane P. McCarron" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0-1984.05.25" />
- <!--This version was released under vendor ID H-102, version 1.0, dated 1984-05-25 according to embedded program comments.-->
+ <!-- This version was released under vendor ID H-102, version 1.0, dated 1984-05-25 according to embedded program comments. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-h102 mind puzzles v1.0-1984.05.25 (4am crack).dsk" size="143360" crc="ce6d2939" sha1="ae0f70a4d6139c9bb07cd583057e61b632750998" />
@@ -49676,8 +42747,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-29-->
- <!--education program-->
+ <!-- Dump released: 2021-03-29 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a780 mind puzzles v1.3 (4am crack).dsk" size="143360" crc="339fd3c0" sha1="17ee44c6b6b63192681b7742e6b71fde06fe75a2"/>
@@ -49689,13 +42760,14 @@ license:CC0-1.0
<description>Miner 2049er (revision 1) (4am crack)</description>
<year>1982</year>
<publisher>Micro Fun</publisher>
- <info name="programmer" value="Mike Livesay and Bill Hogue" />
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Bill Hogue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This is protected with structural RWTS changes instead of a more sophisticated run-time protection check, suggesting an earlier version.-->
+ <!-- This is protected with structural RWTS changes instead of a more sophisticated run-time protection check, suggesting an earlier version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-14-->
- <!--action game-->
+ <!-- Dump released: 2023-01-14 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="miner 2049er (4am crack).dsk" size="143360" crc="ae5a9ea2" sha1="96a01004e0d04b99e0def9a8ecdffdaad9f7345d" />
@@ -49705,16 +42777,17 @@ license:CC0-1.0
<software name="minr2049h" cloneof="minr2049">
<description>Miner 2049er (revision 2 hi-score reset) (4am crack)</description>
- <!--Assume that this is from the revision 2 crack by 4am.-->
+ <!-- Assume that this is from the revision 2 crack by 4am. -->
<year>1982</year>
<publisher>Micro Fun</publisher>
- <info name="programmer" value="Mike Livesay and Bill Hogue" />
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Bill Hogue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2 hi-score reset" />
<!-- High scores stored on disc, reset to AAA 5000, AAA 4000, AAA 3000, AAA 2000 & AAA 1000 -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-04-06-->
- <!--action game-->
+ <!-- Dump released: 2018-04-06 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="miner 2049er (1982)(micro fun)(clean crack).dsk" size="143360" crc="c1024360" sha1="a5913a155a4902310de20c5037067655e11ab088" />
@@ -49726,13 +42799,14 @@ license:CC0-1.0
<description>Miner 2049er (revision 2) (4am crack)</description>
<year>1982</year>
<publisher>Micro Fun</publisher>
- <info name="programmer" value="Mike Livesay and Bill Hogue" />
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Bill Hogue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Undated re-release has updated copy protection. The original protection on track 1 was NOP'd out by the publisher.-->
+ <!-- Undated re-release has updated copy protection. The original protection on track 1 was NOP'd out by the publisher. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-04-06-->
- <!--action game-->
+ <!-- Dump released: 2018-04-06 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="miner 2049er rev. 2 (4am crack).dsk" size="143360" crc="ae9f3f03" sha1="06dde9ba2394ef6f6d12856afe6d106396ab5791" />
@@ -49744,11 +42818,12 @@ license:CC0-1.0
<description>Miner 2049er II (4am crack)</description>
<year>1984</year>
<publisher>Micro Fun</publisher>
- <info name="programmer" value="Mike Livesay and Bill Hogue" />
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Bill Hogue" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-04-06-->
- <!--action game-->
+ <!-- Dump released: 2018-04-06 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="miner 2049er ii (4am crack).dsk" size="143360" crc="c216e031" sha1="7062d5111dfadfb6b07d27a6ff7b97c01043b0c0" />
@@ -49756,16 +42831,124 @@ license:CC0-1.0
</part>
</software>
+ <software name="minitman">
+ <description>Minit Man (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Greg Malone" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="minit man (4am crack).dsk" size="143360" crc="1bf28949" sha1="672bd74a7edeff788a2793a66e2039a4a5b31791" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="misldefn">
+ <description>Missile Defense (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="D. W. Clark" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-19 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="missile defense (4am and san inc crack).dsk" size="143360" crc="4157f3d7" sha1="eea2e87c5f20051b2221264b72b60f49d013df48" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mixdupmg">
+ <description>Mixed-Up Mother Goose (version 1.0I) (4am and san inc crack)</description>
+ <year>1990</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="David Slayback" />
+ <info name="programmer" value="Doug Oldfield" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Araenda-Lambarda" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0I" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mixed-up mother goose (4am and san inc crack) disk 1a.dsk" size="143360" crc="21368bfa" sha1="347bbee5d8fe8e94b94d7c17aad88d17e2bf565e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mixed-up mother goose (4am and san inc crack) disk 1b.dsk" size="143360" crc="2ad65640" sha1="53ebba068c1274b34a20746434489e15b9f3b5da" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mixed-up mother goose (4am and san inc crack) disk 2a.dsk" size="143360" crc="0ad14456" sha1="164874dc4ffc9e5fdff01ad845a55f75df33a3c3" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mixed-up mother goose (4am and san inc crack) disk 2b.dsk" size="143360" crc="dfeeac3d" sha1="4c907dd051fa51e4516bcc9e633685697f392c24" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moebius">
+ <description>Moebius: The Orb of Celestial Harmony (4am crack)</description>
+ <year>1985</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Greg Malone" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-05 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moebius (4am crack) disk a.dsk" size="143360" crc="701ecbb9" sha1="988c10658e65e67f0a05a3ae46a9af26ce588be5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moebius (4am crack) disk b.dsk" size="143360" crc="a78c375c" sha1="d7100156c7d82e63751943cc49a7f52ecccb876f" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moebius (4am crack) disk c.dsk" size="143360" crc="06fca9ab" sha1="25afac1f8116413b5f036fc00372c37e9a85ce3f" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moebius (4am crack) disk d.dsk" size="143360" crc="bc0a216b" sha1="14ab40bc41c85133d416523d15da0b45df325776" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="modeling">
<description>Modeling (A-823 version 1.0) (4am crack)</description>
<year>1983</year>
<publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
<info name="partno" value="A-823" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-25-->
- <!--education program-->
+ <!-- Dump released: 2022-11-25 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a823 modeling v1.0 (4am crack).dsk" size="143360" crc="2b10e6a1" sha1="d0731ac34c6261932216dfc57fbdacd8e5c7de26" />
@@ -49773,16 +42956,40 @@ license:CC0-1.0
</part>
</software>
+ <software name="momawork">
+ <description>Momentum and Work (4am crack)</description>
+ <year>1990</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Robert Stickgold, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="momentum and work (4am crack) disk 1.dsk" size="143360" crc="a338ba73" sha1="4ddb1788cd67f4f85ebbac4995f9817a1334f6cf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="momentum and work (4am crack) disk 2.dsk" size="143360" crc="34f24097" sha1="187259f60e2d70aeaff10021dab42109caaa1db5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="money316" cloneof ="money">
<description>Money (version 3.1.6) (4am crack)</description>
<year>1987</year>
<publisher>Gamco Industries</publisher>
- <info name="programmer" value="Terri Poteet and Byron Smith" />
+ <info name="programmer" value="Terri Poteet" />
+ <info name="programmer" value="Byron Smith" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="3.1.6" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-03-->
- <!--educational program-->
+ <!-- Dump released: 2020-03-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="money v3.1.6 (4am crack).dsk" size="143360" crc="d27e714f" sha1="d8238aedd8f1312621d29c794eb62a53dd948bbd"/>
@@ -49794,12 +43001,13 @@ license:CC0-1.0
<description>Money (version 4.1.7) (4am crack)</description>
<year>1991</year>
<publisher>Gamco Industries</publisher>
- <info name="programmer" value="Terri Poteet and Byron Smith" />
+ <info name="programmer" value="Terri Poteet" />
+ <info name="programmer" value="Byron Smith" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="4.1.7" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -49814,6 +43022,42 @@ license:CC0-1.0
</part>
</software>
+ <software name="moneywrks10" cloneof="moneywrks_525">
+ <description>Money Works (A-195 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-195" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a195 money works v1.0 (4am crack).dsk" size="143360" crc="0f93a058" sha1="f211e681c9cfcd81d262fd99d437f7d7f32afc9e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moneywrks_525">
+ <description>Money Works (A-195 version 1.1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-195" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a195 money works v1.1 (4am crack).dsk" size="143360" crc="ffaba004" sha1="ea8875494a3cf1401ea16228491a4dedeead3058"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="mnymny091983" cloneof="mnymny">
<description>Money! Money! (version 09.19.83) (4am crack)</description>
<year>1983</year>
@@ -49822,8 +43066,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="09.19.83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-13-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="money money v09.19.83 (4am crack).dsk" size="143360" crc="a5e8bd1a" sha1="b8b86e8253bf986e4ad7e7ec92f5c404c07d6910"/>
@@ -49833,14 +43077,14 @@ license:CC0-1.0
<software name="mnymny091384" cloneof="mnymny">
<description>Money! Money! (version 09.13.84) (4am crack)</description>
- <year>1983</year>
+ <year>1984</year>
<publisher>Hartley Courseware</publisher>
<info name="developer" value="Hartley Courseware" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="09.13.84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-12-23-->
- <!--educational program-->
+ <!-- Dump released: 2017-12-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="money money 09.13.84 (4am crack).dsk" size="143360" crc="3a8816ac" sha1="ea82fb92114fc6ca1392aae5c79c5100ea36ba5b" />
@@ -49850,14 +43094,14 @@ license:CC0-1.0
<software name="mnymny020587" cloneof="mnymny">
<description>Money! Money! (version 02.05.87) (4am crack)</description>
- <year>1982</year>
+ <year>1987</year>
<publisher>Hartley Courseware</publisher>
<info name="developer" value="Hartley Courseware" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="02.05.87" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="money money v02.05.87 (4am crack).dsk" size="143360" crc="d1cffe5e" sha1="25edc0a93d5190e794a254bb06e5337bc3f1aae9" />
@@ -49867,14 +43111,14 @@ license:CC0-1.0
<software name="mnymny">
<description>Money! Money! (version 07.24.87) (4am crack)</description>
- <year>1982</year>
+ <year>1987</year>
<publisher>Hartley Courseware</publisher>
<info name="developer" value="Hartley Courseware" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="07.24.87" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-21-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="money money v07.24.87 (4am crack).dsk" size="143360" crc="b0afc6f3" sha1="adeccfbc8b92ba13da12bb06a5951a2d287e57a8" />
@@ -49885,16 +43129,18 @@ license:CC0-1.0
<software name="mnkybsnsr1" cloneof="mnkybsns">
<description>Monkey Business (revision 1) (4am crack)</description>
<year>1985</year>
- <publisher>Litag Productions</publisher>
- <info name="developer" value="Learning Technologies" />
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
+ <!-- Does not show the Litag developer screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="monkey business (4am crack).dsk" size="143360" crc="e8504441" sha1="96de16bfc87ade8c28b498632261a9b47f5447b4" />
+ <!-- Asked 4am to update to revision 1 to match Woz releases for Monkey Business. -->
+ <rom name="monkey business rev. 2 (4am crack).dsk" size="143360" crc="85e865a8" sha1="f6a770e91e05431c1eb9cfa25674ee5403210d41" />
</dataarea>
</part>
</software>
@@ -49903,17 +43149,16 @@ license:CC0-1.0
<description>Monkey Business (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Learning Technologies</publisher>
- <info name="original_publisher" value="Litag Productions" />
- <info name="developer" value="Learning Technologies" />
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This updated revision has unspecified bug fixes.-->
+ <!-- Shows the Litag developer screen and the Learning Technologies screen is different. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-13-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="monkey business rev. 2 (4am crack).dsk" size="143360" crc="85e865a8" sha1="f6a770e91e05431c1eb9cfa25674ee5403210d41" />
+ <rom name="monkey business (4am crack).dsk" size="143360" crc="e8504441" sha1="96de16bfc87ade8c28b498632261a9b47f5447b4" />
</dataarea>
</part>
</software>
@@ -49922,11 +43167,12 @@ license:CC0-1.0
<description>Monkey Math (4am crack)</description>
<year>1983</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Dennis Zander and Roger Harnish" />
+ <info name="programmer" value="Dennis Zander" />
+ <info name="programmer" value="Roger Harnish" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-06-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-06 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="monkey math (4am crack).dsk" size="143360" crc="7b11eaee" sha1="b87bb8197426734dac605f1b5026eb82896ae43f" />
@@ -49942,8 +43188,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--action game-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="monster smash v2.0 (4am crack).dsk" size="143360" crc="147ed9fd" sha1="be5517d3e7ab1b89725aa4eda6fef20390b8a2ad" />
@@ -49958,8 +43204,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-17-->
- <!--graphics program-->
+ <!-- Dump released: 2023-09-17 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Program" />
<dataarea name="flop" size="143360">
@@ -49981,8 +43227,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-04-->
- <!--graphics program-->
+ <!-- Dump released: 2015-09-04 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -49997,6 +43243,354 @@ license:CC0-1.0
</part>
</software>
+ <software name="monsmons">
+ <description>Monstrous Monsters (version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="monstrous monsters (4am crack) disk 1 - program.dsk" size="143360" crc="4394ac67" sha1="b5a0303d21cd3a1ac4b9858e7bcdef0415e7d0ec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Frames and fonts"/>
+ <dataarea name="flop" size="143360">
+ <rom name="monstrous monsters (4am crack) disk 2 - frames and fonts.dsk" size="143360" crc="832b07a3" sha1="9248d1acd604b2c2768c3692136dfbdf2e8e129c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Posters"/>
+ <dataarea name="flop" size="143360">
+ <rom name="monstrous monsters (4am crack) disk 3 - posters.dsk" size="143360" crc="f7522e02" sha1="51065b679535be9c6c32c4606d22d94b8b29e8b8" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Clip art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="monstrous monsters (4am crack) disk 4 - clip art.dsk" size="143360" crc="ac749d1c" sha1="cc29f81b6daa55b3dfa29693c727e0e5dd592e69" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moonmadl1">
+ <description>Moonlight &amp; Madness: Level I (version 03.22.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Learning Lab Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="03.22.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="moonlight &amp; madness i v03.22.88 (4am crack) disk 1.dsk" size="143360" crc="773e1baf" sha1="95eb844c2f9ad4eb36f3f6a5b72e2c1f28b4e0f1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="moonlight &amp; madness i v03.22.88 (4am crack) disk 2.dsk" size="143360" crc="76df3b2e" sha1="1b89f6e2e1a1c1f81e6448df9e0bf20466ed3d39" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moonmadl2">
+ <description>Moonlight &amp; Madness: Level II (version 04.19.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Learning Lab Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.19.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moonlight and madness ii v04.19.88 (4am crack) disk 1.dsk" size="143360" crc="885b9d0c" sha1="011b113410e9a4560b9093ceae39e6fd88d99996"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moonlight and madness ii v04.19.88 (4am crack) disk 2.dsk" size="143360" crc="63f7d986" sha1="2fb30f458f67ff9a10c7dd66566302bd6741cbf3"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moonlight and madness ii v04.19.88 (4am crack) disk 3.dsk" size="143360" crc="96df05d5" sha1="df6ea407fef43236841ccaeceb428fcd7464e1ad"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moptown">
+ <description>Moptown (version 1981) (Apple) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Apple Computer</publisher>
+ <info name="original_publisher" value="Advanced Learning Technology"/>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1981" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="moptown (1981) (4am crack).dsk" size="143360" crc="a1d53302" sha1="3e3b3bdcdb4c1aac4613b40dd09bda3094e87676" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnhtl12" cloneof="mptwnhtl">
+ <description>Moptown Hotel (version 1.2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="moptown hotel (4am crack).dsk" size="143360" crc="354f51cc" sha1="343b4be8e781c49d279b3990728cae7b5607aea8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnhtl">
+ <description>Moptown Hotel (version 1.3) (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="moptown hotel 1.3 (4am crack).dsk" size="143360" crc="f7a61838" sha1="ad70f3d9908c3368ee52c67cc5d5c3018623ed66" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnpar10" cloneof="mptwnpar">
+ <description>Moptown Parade (version 1.0) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="moptown parade 1981 (4am and san inc crack).dsk" size="143360" crc="aa354a32" sha1="8830f3f7b9b19c0d7e188878f7b7e6c7b89d45ab"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnpar">
+ <description>Moptown Parade (version 1.2) (4am crack)</description>
+ <year>1981</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="moptown parade (4am crack).dsk" size="143360" crc="ff062b97" sha1="2d7d7b01a621c0c9aab97df33a9f983cc7568bd0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moseslhp">
+ <description>Moses Leads His People (4am crack)</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moses leads his people (4am crack) side a.dsk" size="143360" crc="41a67e27" sha1="e8209f454c1be968d55f597425dbb3bdc1d460b7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="moses leads his people (4am crack) side b.dsk" size="143360" crc="360080a2" sha1="f657b886134ace87161399f228e82bd4b348da39" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtrcycls">
+ <description>Motorcycles (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="motorcycles (4am crack).dsk" size="143360" crc="2c9acbc9" sha1="1a25968baf857cba811ce32f92558d80ae067747" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moviemakr">
+ <description>Movie Maker (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interactive Picture Systems" />
+ <info name="author" value="Guy Nouri" />
+ <info name="author" value="Eric Podietz" />
+ <info name="programmer" value="Ken Appleman" />
+ <info name="programmer" value="Chuck Beury" />
+ <info name="programmer" value="Chris Rogers" />
+ <info name="programmer" value="Mark Scott" />
+ <info name="programmer" value="Jimmy Snyder" />
+ <info name="programmer" value="Jon Wolfe" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="movie maker (4am and san inc crack) side a.dsk" size="143360" crc="1caa17ed" sha1="94b6f4463601c944ed55677a0fd8745a3e038d21" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="movie maker (4am and san inc crack) side b.dsk" size="143360" crc="6e65dd04" sha1="60c518a452a20b6292a0e65a1e6bb97f610445eb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcool">
+ <description>Mr. Cool (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Peter Oliphant" />
+ <info name="programmer" value="John Redekopp" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mr. cool (4am crack).dsk" size="143360" crc="bdf33836" sha1="5b267d4a5c237801f38742f8fc79e9a708d3509a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pxcartnk">
+ <description>Mr. Pixel's Cartoon Kit (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Master Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-23. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mr. pixel's cartoon kit (4am crack).dsk" size="143360" crc="78ca3f2a" sha1="40ce67a0a50dadfca402e990121e337fd4f4e4fb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pxppaint">
+ <description>Mr. Pixel's Programming Paint Set (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Master Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-03 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mr. pixel's programming paint set (4am crack).dsk" size="143360" crc="933d11c5" sha1="de75a5af2f68d2da27b2438ef138c65103f2cb92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrswiggl">
+ <description>Mrs. Wigglesworth's Secret: Drawing Conclusions (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mrs. wigglesworth's secret (4am crack).dsk" size="143360" crc="ea5d5045" sha1="35a706c951cc7b584f5683e396c83c14610af702" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspac">
+ <description>Ms. Pac-Man (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ms. pac-man (atari)(4am crack).dsk" size="143360" crc="7b7196fc" sha1="49b21f8c3a838c12b2d785f4342432212698c0bb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mudpies">
+ <description>Mud Pies (4am crack)</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mud pies (4am crack).dsk" size="143360" crc="49e7967b" sha1="e563e186b0c4065f7eaffe6ed74151e34202b95b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mulperev">
<description>Multidimensional Personality Evaluation (4am crack)</description>
<year>1983</year>
@@ -50004,8 +43598,8 @@ license:CC0-1.0
<info name="developer" value="Psychological Psoftware" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-09-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-09-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="multidimensional personality evaluation (4am crack).dsk" size="143360" crc="4624d984" sha1="b3d1e7a73a1152848e1fd0b9f364495956dbe626"/>
@@ -50020,8 +43614,8 @@ license:CC0-1.0
<info name="programmer" value="Paul Coletta" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-06-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="multiploy (4am crack).dsk" size="143360" crc="02346714" sha1="fb5f5024dfa7432ae11656c718d2281913c88329" />
@@ -50034,12 +43628,12 @@ license:CC0-1.0
<year>1982</year>
<publisher>K-12 MultiPloy</publisher>
<info name="original_publisher" value="Reston Publishing"/>
- <!--Shows a "K-12 Micromedia" on the pre-title screen. Has different off-the-shelf copy protection. Not sure which came first, but assuming Reston Publishing due to pre-title screen.-->
+ <!-- Shows a "K-12 Micromedia" on the pre-title screen. Has different off-the-shelf copy protection. Not sure which came first, but assuming Reston Publishing due to pre-title screen. -->
<info name="programmer" value="Paul Coletta" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-05-05-->
- <!--educational program-->
+ <!-- Dump released: 2019-05-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="multiploy (k-12 micromedia) (4am crack).dsk" size="143360" crc="aa72217b" sha1="81150049566604bb32ff33b4253085719a66f16a" />
@@ -50047,16 +43641,63 @@ license:CC0-1.0
</part>
</software>
+ <software name="multchoi">
+ <description>Multiple Choices (4am crack)</description>
+ <year>1989</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-06-01. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="multiple choices (4am crack) side a.dsk" size="143360" crc="d7e0a365" sha1="bcd4500430fb849d62f018ac00b8954b24597e4b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="multiple choices (4am crack) side b.dsk" size="143360" crc="5c4b47c6" sha1="ab32e3c123718f5f799b87af30eac768fb35966b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="multmean">
+ <description>Multiple Meanings (version 08.24.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.24.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="multiple meanings v08.24.89 (4am crack) disk 1.dsk" size="143360" crc="ad9af283" sha1="aa6099a12b4e5cc74db4bb1401c6cecfb8ec5fc0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="multiple meanings v08.24.89 (4am crack) disk 2.dsk" size="143360" crc="d84a2600" sha1="47a323ecd6f7a20f6e0c50ecf3ea08826c039fc7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mulscribe">
<description>MultiScribe (version 3.01c) (4am crack)</description>
<year>1987</year>
- <publisher>StyleWare, Inc.</publisher>
- <info name="developer" value="StyleWare, Inc." />
+ <publisher>StyleWare</publisher>
+ <info name="developer" value="StyleWare" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="3.01c" />
<sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-05-->
- <!--productivity program-->
+ <!-- Dump released: 2022-07-05 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -50071,38 +43712,324 @@ license:CC0-1.0
</part>
</software>
- <software name="musiconsr1" cloneof="musicons">
- <description>Music Construction Set (revision 1) (4am and san inc crack)</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey" />
+ <software name="mumcurseh" cloneof="mumcurse">
+ <description>Mummy's Curse (Highland Computers) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Highland Computers</publisher>
+ <info name="developer" value="Highlands Computers" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-24 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mummy's curse (4am crack).dsk" size="143360" crc="d2081297" sha1="89f91d4863d4738845743d8526bc41161e2401d8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mumcurse">
+ <description>Mummy's Curse (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Highlands Computers" />
+ <info name="original_publisher" value="Highlands Computers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mummy's curse (softsmith) (4am and san inc crack).dsk" size="143360" crc="57d3132c" sha1="69fb5a48a9a592d11795ed596fe77db7f5b24c08"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppslat10" cloneof="muppslat">
+ <description>Muppet Slate: The Word and Picture Processor (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-24 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher and boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="muppet slate (4am crack) disk 1 - boot.dsk" size="143360" crc="5febc568" sha1="73b1f66f186c56a16d8a6db4bf293f98301abd31" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master student version 1.1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="muppet slate (4am crack) disk 2 - student disk.dsk" size="143360" crc="772dc135" sha1="57119a23d6576adabcc3cb3700c316786ce54769" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppslat">
+ <description>Muppet Slate: The Word and Picture Processor (version 1.01) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.01" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-17 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher and boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="muppet slate v1.01 (4am crack) disk 1 - teacher disk.dsk" size="143360" crc="3c2145cc" sha1="eebdb82b0fdd231e38a8528fed37e08bfa6c6946" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master student version 1.1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="muppet slate v1.01 (4am crack) disk 2 - master student disk.dsk" size="143360" crc="b5647cd7" sha1="f2d5c724a8412e450344f43b10d977728cf52b19" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Seasons and special days student version 1.1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="muppet slate v1.01 (4am crack) disk 3 - seasons and special days.dsk" size="143360" crc="0a353a3d" sha1="6029f36906448b6d1fe31ddfe0a2b206dc2530ec" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - More special days student version 1.1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="muppet slate v1.01 (4am crack) disk 4 - more special days.dsk" size="143360" crc="486aea9b" sha1="7fae54f5e54b53d39b816a4d2988d057b1443309" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muptwdbk">
+ <description>Muppet Word Book: An Introduction to Letters, Words, and Writing (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="programmer" value="Melissa Verber" />
+ <info name="programmer" value="Christopher Cerf" />
+ <info name="programmer" value="Bill Prady" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="muppet word book (4am crack).dsk" size="143360" crc="45e3d2fd" sha1="0227d7aa3d446ed3fa2dfc0a6708f49420fd810a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptstgr1" cloneof="mptstg">
+ <description>Muppets On Stage (revision 1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="programmer" value="Jon Sweedler" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-03-02. Redumped: 2019-12-09-->
- <!--This crack was updated on 2019-12-09 to fix corruption on track $20.-->
- <!--audio program-->
+ <!-- The Muppet Discovery Book was retitled Muppets on Stage in 1987, and published as a separate program. -->
+ <!-- Dump released: 2015-09-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="music construction set (4am and san inc crack).dsk" size="143360" crc="221034cd" sha1="ff22eb248c1a6d270ebb97f4660c97ff832cf0a2" />
+ <rom name="muppets on stage (4am crack).dsk" size="143360" crc="fec360f9" sha1="0225c1d55451dcb8228bf77d7fb1235dd78df994" />
</dataarea>
</part>
</software>
- <software name="musicons">
- <description>Music Construction Set (revision 2) (4am and san inc crack)</description>
+ <software name="mptstg">
+ <description>Muppets On Stage (revision 2) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="programmer" value="Jon Sweedler" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- minor bug fixes in the LETTERS and NUMBERS programs. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- The Muppet Discovery Book was retitled Muppets on Stage in 1987, and published as a separate program. -->
+ <!-- Dump released: 2017-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="muppets on stage rev. 2 (4am crack).dsk" size="143360" crc="7122a06f" sha1="f36514dc8ab2ae07d04cad61806c99f0a02bb064" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppetvlr1" cloneof="muppetvl">
+ <description>Muppetville (revision 1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Christopher Cerf" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Joni Jablonsky" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="muppetville (4am crack).dsk" size="143360" crc="01fb27fd" sha1="ad027e48ced5ab0d30f144b5da119acd2ba8b3a5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppetvl">
+ <description>Muppetville (revision 2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Christopher Cerf" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Joni Jablonsky" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
+ <info name="version" value="revision 2" />
+ <!-- Filename fix and other unspecified changes. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="muppetville rev. 2 (4am crack).dsk" size="143360" crc="99891244" sha1="43449499e6b21b6d49d0002f9db9f9fca6443e57"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="murdzind">
+ <description>Murder on the Zinderneuf (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Paul Reiche" />
+ <info name="author" value="Jon Freeman" />
+ <info name="programmer" value="Alan Pavlish" />
+ <info name="programmer" value="Robert Leyland" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="murder on the zinderneuf (4am and san inc crack).dsk" size="143360" crc="d2c9dd85" sha1="a9b05ee5086b70e611f33dfba735cb6d37a1ea1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="musicapp">
+ <description>Music Appreciation: A Study Guide (4am crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph E. Koob" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - The Musical Language" />
+ <dataarea name="flop" size="143360">
+ <rom name="music appreciation- the musical language (4am crack) side a.dsk" size="143360" crc="3a76c487" sha1="618e9f985c6cfb0cbc930c57227dd5bc45bd537e"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - The Musical Language" />
+ <dataarea name="flop" size="143360">
+ <rom name="music appreciation- the musical language (4am crack) side b.dsk" size="143360" crc="ecec5c44" sha1="46708fcd36bf964e48986507f140d0e8dcdfe327"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Music History" />
+ <dataarea name="flop" size="143360">
+ <rom name="music appreciation- music history (4am crack) side a.dsk" size="143360" crc="c253a847" sha1="13a908efe8e928872b74c05c092c5e4be6e9fb6b"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Music History" />
+ <dataarea name="flop" size="143360">
+ <rom name="music appreciation- music history (4am crack) side b.dsk" size="143360" crc="dd5e735b" sha1="29ded79a22705bbf53bffa4487af17377eb63072"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcpquiz">
+ <description>Music Composer Quiz (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="music composer quiz (4am crack).dsk" size="143360" crc="debe0831" sha1="99c071c9dada9df9fc3e491ef90b9097a86d3d88"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcsr3" cloneof="mcs">
+ <description>Music Construction Set (revision 3) (4am and san inc crack)</description>
<year>1984</year>
<publisher>Electronic Arts</publisher>
<info name="programmer" value="Will Harvey" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
- <info name="version" value="revision 2" />
- <!--This updated revision supports the mouse for input and Mockingboard C sound card for output.-->
+ <info name="version" value="revision 3" />
+ <!-- Adds support for the mouse for input, Mockingboard C for output, and printer selection by name -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-09-07 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="music construction set rev. 3 (4am and san inc crack).dsk" size="143360" crc="8b3a243e" sha1="d214439fc3402c2b24af263e2f2f430448afe55c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcs">
+ <description>Music Construction Set (revision 4) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 4" />
+ <!-- Adds support for Mockingboard D for output, and printer interface card selection by name -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-07-->
- <!--audio program-->
+ <!-- Dump released: 2017-03-02. Redumped: 2019-12-09 to fix corruption on track $20. -->
+ <!-- audio program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="music construction set rev. 2 (4am and san inc crack).dsk" size="143360" crc="8b3a243e" sha1="d214439fc3402c2b24af263e2f2f430448afe55c" />
+ <rom name="music construction set rev. 4 (4am and san inc crack).dsk" size="143360" crc="221034cd" sha1="ff22eb248c1a6d270ebb97f4660c97ff832cf0a2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhrcomp">
+ <description>Music History Review: Composers (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="William R. Higgins" />
+ <info name="programmer" value="Ronald L. Miller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="music history review- composers (4am crack).dsk" size="143360" crc="1996a711" sha1="81b8b21f1d5010d294ae7ac9a2bce391a6ee46f7"/>
</dataarea>
</part>
</software>
@@ -50114,8 +44041,8 @@ license:CC0-1.0
<info name="programmer" value="John Paulson" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="music maestro (4am crack).dsk" size="143360" crc="dbd35900" sha1="534e21bed165e5ba182fac875143895b07a183e9" />
@@ -50123,6 +44050,74 @@ license:CC0-1.0
</part>
</software>
+ <software name="musicth10" cloneof="musicth">
+ <description>Music Theory: Music Fundamentals Volume 1 (A-712 version 1.0) (4am crack)</description>
+ <year>1979</year>
+ <publisher>MECC</publisher>
+ <info name="alt_title" value="Apple Music Theory: Music Fundamentals" />
+ <info name="partno" value="A-712" />
+ <info name="programmer" value="Linda Borry" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a712 apple music theory- music fundamentals v1.0 (4am crack).dsk" size="143360" crc="e0dbc805" sha1="d793b38c12b27e5ec5d360be54fd5c38b8c23f5c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="musicth">
+ <description>Music Theory: Music Fundamentals Volume 1 (A-712 version 2.2) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="alt_title" value="Apple Music Theory: Music Fundamentals" />
+ <info name="partno" value="A-712" />
+ <info name="programmer" value="Linda Borry" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a712 music theory vol. 1 v2.2 (4am crack).dsk" size="143360" crc="3dfaaf92" sha1="b80ced1e7d3dfb258fc93b46737b0b298430a6af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtflscrd">
+ <description>Music Theory Flash Cards (version 10/2/84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10/2/84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="music theory flash cards (4am crack) disk 1.dsk" size="143360" crc="956664c8" sha1="6d1120f6fcb8da7d871c9b2e17ed84222b1a1d7d"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="music theory flash cards (4am crack) disk 2.dsk" size="143360" crc="5b251d38" sha1="73915f53108d92eeb2f2c7573808299fc2c6ed6c"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="music theory flash cards (4am crack) disk 3.dsk" size="143360" crc="a5a757a0" sha1="7bb6b29759431f5ed3ada0cfc079ad50fc8d3919"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="musictut">
<description>Music Tutor (Passport Designs) (4am crack)</description>
<year>1981</year>
@@ -50130,8 +44125,8 @@ license:CC0-1.0
<info name="developer" value="Passport Designs" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Intervals" />
<dataarea name="flop" size="143360">
@@ -50152,15 +44147,83 @@ license:CC0-1.0
</part>
</software>
+ <software name="mstairs">
+ <description>Musical Stairs (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Stephen L. Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- The 1984 version does not use MIDI, but the 1985 version requires it. -->
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="musical stairs (4am crack).dsk" size="143360" crc="808705d0" sha1="5aea1cfdad848820ddbedf63584147de4b60ec9b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstermin">
+ <description>Musical Terminology (4am crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="music terminology (4am crack).dsk" size="143360" crc="55e03305" sha1="ba3f200155a076f6be4001d7f8d0644e5b58c2c5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mmfelony">
+ <description>Mystery Master: Felony! (Thunder Mountain) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="developer" value="BrainBank" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-16. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="felony (thunder mountain release)(4am crack).dsk" size="143360" crc="af368f3c" sha1="e4859b633b8ecf100c11bb10e26ff6a28c9217de" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mmmurdoz">
+ <description>Mystery Master: Murder by the Dozen (Thunder Mountain) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="developer" value="BrainBank" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-07-21 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="murder by the dozen (4am crack).dsk" size="143360" crc="852886ae" sha1="60f8158cca62be57309174ad8729303b73958894" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mysmzcase1">
<description>Mystery Mazes Case 1: The Carnival Caper (4am crack)</description>
<year>1985</year>
<publisher>Educational Activities</publisher>
- <info name="programmer" value="Stuart Paltrowitz, M.S. and Donna Paltrowitz, M.S." />
+ <info name="programmer" value="Stuart Paltrowitz, M.S." />
+ <info name="programmer" value="Donna Paltrowitz, M.S." />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-07-17-->
- <!--educational game-->
+ <!-- Dump released: 2016-07-17 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mystery mazes case 1 - the carnival caper (4am crack).dsk" size="143360" crc="1e6d0859" sha1="7862298ea78a9547f2b83b032cee565394c25fb0" />
@@ -50172,11 +44235,12 @@ license:CC0-1.0
<description>Mystery Mazes Case 3: Castle Clues (4am crack)</description>
<year>1987</year>
<publisher>Educational Activities</publisher>
- <info name="programmer" value="Stuart Paltrowitz, M.S. and Donna Paltrowitz, M.S." />
+ <info name="programmer" value="Stuart Paltrowitz, M.S." />
+ <info name="programmer" value="Donna Paltrowitz, M.S." />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-14-->
- <!--educational game-->
+ <!-- Dump released: 2023-03-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mystery mazes case 3- castle clues (4am crack).dsk" size="143360" crc="ae1d20ca" sha1="13ec48f35950e489bbbae4eca81d37796fda0789" />
@@ -50184,15 +44248,418 @@ license:CC0-1.0
</part>
</software>
- <software name="nmbrbwlg">
+ <software name="myswtsho">
+ <description>Mystery of the Witch's Shoes (4am crack)</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mystery of the witch's shoes (4am crack).dsk" size="143360" crc="f0cf0f70" sha1="ef31b0b93dfe65d5bb462a5f595be162c8ae017f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mystsntc">
+ <description>Mystery Sentences (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Scholastic" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- educational program -->
+ <!-- Dump released: 2016-12-24. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mystery sentences (4am crack) side a.dsk" size="143360" crc="655f2cec" sha1="5ee04058bcdbe6a84f3d82cdefaba1c7e64c0330" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Sentence file"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mystery sentences (4am crack) side b.dsk" size="143360" crc="bec55691" sha1="f50dd87d8d4ae7b959ed233bb76e080794975a50" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nam">
+ <description>NAM (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Damon" />
+ <info name="programmer" value="Jeff Johnson" />
+ <info name="programmer" value="Marek Popiel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-23 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="nam (4am crack).dsk" size="143360" crc="7e5a63aa" sha1="1197bee7be8d4dcf8e7cdfd97fc5fce37d349a58" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nkotb">
+ <description>New Kid on the Block (version 02.09.89) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Mary Roessler" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="02.09.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="new kid on the block (4am crack) disk 1.dsk" size="143360" crc="5f7feea4" sha1="32bd143f480259dd6796db73c59e10c5482e0f7c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="new kid on the block (4am crack) disk 2.dsk" size="143360" crc="2c0eaee1" sha1="7c7c4f082599ac471a19f49b3c363ab021f97363" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="new kid on the block (4am crack) disk 3.dsk" size="143360" crc="c7cf3f91" sha1="fb6931142c9f9259cb35340803275b9cb69396e6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwawit">
+ <description>Newbery Winners: A Wrinkle in Time (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: A Wrinkle in Time" />
+ <info name="author" value="Madeleine L'Engle" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="newbery winners- a wrinkle in time (4am crack).dsk" size="143360" crc="d4637c5a" sha1="b12f12ea6de8898a8f7552527ba882b21c1e40ce"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwbtt">
+ <description>Newbery Winners: Bridge to Terabithia (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: Bridge to Terabithia" />
+ <info name="author" value="Katherine Paterson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="newbery winners- bridge to terabithia (4am crack).dsk" size="143360" crc="f86a002a" sha1="5340a51606f2a963f413b032ac8ee198382e97c7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwsndr">
+ <description>Newbery Winners: Sounder (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: Sounder" />
+ <info name="author" value="William H. Armstrong" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="newbery winners- sounder (4am crack).dsk" size="143360" crc="cb639f8e" sha1="64b3f80208f36df0cf24e2cc51f4419b3c2e26e1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwsumswan">
+ <description>Newbery Winners: The Summer of the Swans (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: The Summer of the Swans" />
+ <info name="author" value="Betsy Byars" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the summer of the swans (4am crack).dsk" size="143360" crc="53ea24d5" sha1="4caf93044126706ccc35c1020c3b0d8d2c9c2870" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwtwg">
+ <description>Newbery Winners: The Westing Game (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: The Westing Game" />
+ <info name="author" value="Ellen Raskin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="newbery winners- the westing game (4am crack).dsk" size="143360" crc="7479173c" sha1="88143a8b920f809a40854bff1f3207298cdaad4c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nightgal">
+ <description>Nightmare Gallery (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Ron Aldrich" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-05-03 -->
+ <!-- action game -->
+ <!-- Left & Right arrows or Paddle0 for controls - Select with "K" for keyboard / "P" for paddle -->
+ <!-- press SLASH "/" to fire with keyboard or use Button0 when using the paddle -->
+ <!-- "C" for continuous fire, SPACE BAR for shields, CRTL-S toggles sound on/off, ESC for pause -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="nightmare gallery (4am crack).dsk" size="143360" crc="86421eea" sha1="cfa679c34cc728a3abc28ac2c64e636970d47409" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nthatl86">
+ <description>North Atlantic 86 (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="north atlantic 86 (4am and san inc crack).dsk" size="143360" crc="fb1e63c0" sha1="b33928ead103f906091b6b8ab989be0cbdbf2f79" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nd1eleml">
+ <description>Note Detective I: Elementary Level (4am crack)</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Reid Alexander" />
+ <info name="programmer" value="JoEllen DeVilbiss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="note detective i- elementary level (4am crack).dsk" size="143360" crc="0bdf95cf" sha1="355a54d958f8f92d80865aeb8ad6f276837b1996"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nd2intl">
+ <description>Note Detective II: Intermediate Level (4am crack)</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Reid Alexander" />
+ <info name="programmer" value="JoEllen DeVilbiss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-04-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="note detective ii- intermediate level (4am crack).dsk" size="143360" crc="c8620d0d" sha1="ab05536d490cc7dfc9118403109e6d6558523581"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="notespelr">
+ <description>Note Speller (4am crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Lolita Walker Gilkes" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="note speller (4am crack).dsk" size="143360" crc="c8c3a19a" sha1="dbd40352ce2aa2a9b0cb977714504887dcb037c2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nounspro091983" cloneof="nounspro">
+ <description>Nouns/Pronouns (version 09.19.83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.19.83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns v09.19.83 (4am crack).dsk" size="143360" crc="1d6a528c" sha1="e3e7bc2b8de4f4ef2378e216ce1049bab3213753"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nounspro041384" cloneof="nounspro">
+ <description>Nouns-Pronouns (version 04.13.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.13.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns v04.13.84 (4am crack).dsk" size="143360" crc="c467303e" sha1="e74271c2f9baeae91f902f83122d992b5deaed7c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nounspro021486" cloneof="nounspro">
+ <description>Nouns-Pronouns (version 02.14.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="02.14.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns (4am crack) disk 1.dsk" size="143360" crc="d361b774" sha1="5a0d0a6b1803e4a5f9123121d636207425ae4315" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns (4am crack) disk 2.dsk" size="143360" crc="8088b075" sha1="125eb21e50d5f785338c9e220be196135668d81b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nounspro083186" cloneof="nounspro">
+ <description>Nouns/Pronouns (version 08.31.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.31.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns v08.31.86 (4am crack) disk 1.dsk" size="143360" crc="2daf72ad" sha1="eaf0972a9efe036414325b1f95eaf6c26860c6d4"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns v08.31.86 (4am crack) disk 2.dsk" size="143360" crc="89f49f07" sha1="48066e68e141c94c1b6fa6debfd94fe5c6d89de5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nounspro">
+ <description>Nouns-Pronouns (version 09.04.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.04.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns v09.04.87 (4am crack) disk 1.dsk" size="143360" crc="1928fb9b" sha1="38f41d82e91f4e527597227b6edaefdbc6c710fa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="nouns-pronouns v09.04.87 (4am crack) disk 2.dsk" size="143360" crc="0cfd3366" sha1="491bcf341c6c4e3308b75076ccc3da57fbeec603" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nysiptp">
+ <description>Now You See It, Now You Don't: Pick The Part (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Todd Rosedahl" />
+ <info name="programmer" value="Barbara Wood" />
+ <info name="programmer" value="Scott Sahs" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="now you see it now you don't - pick the part (4am crack).dsk" size="143360" crc="ab3308c4" sha1="85a4e03e2f2f3966de65c5e8e0012ffeaeb3476b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nysiwit">
+ <description>Now You See It, Now You Don't: Was it there? Was it missing? (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Todd Rosedahl" />
+ <info name="programmer" value="Barbara Wood" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="now you see it now you don't - was it there - was it missing (4am crack).dsk" size="143360" crc="f9e41f25" sha1="0ff4bb5010090ea0e617c8d1856a6c055e17017b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nbdecfra">
<description>Number Bowling: Decimals and Fractions (4am crack)</description>
<year>1985</year>
<publisher>Scott, Foresman and Company</publisher>
<info name="developer" value="Scott, Foresman and Company" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-13-->
- <!--educational game-->
+ <!-- Dump released: 2014-08-13 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="number bowling (4am crack).dsk" size="143360" crc="62cfab88" sha1="3700731fe0a85236bbb6733e2cf34b714c3f20ad" />
@@ -50205,10 +44672,10 @@ license:CC0-1.0
<year>1984</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Neosoft" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-28-->
- <!--educational program-->
+ <!-- Dump released: 2017-10-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="number farm (4am crack).dsk" size="143360" crc="7beb091c" sha1="ee2155533ff204a91ce2dd6db665eefbb3feeec0" />
@@ -50216,6 +44683,127 @@ license:CC0-1.0
</part>
</software>
+ <software name="nummun10" cloneof="nummun_525">
+ <description>Number Munchers (A-170 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-170" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a170 number munchers v1.0 (4am crack).dsk" size="143360" crc="10d98d5f" sha1="f2013bcb35421a65c92922c6a92827f66f9b41a5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nummun_525">
+ <description>Number Munchers (A-170 version 1.3) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-170" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a170 number munchers v1.3 (4am crack).dsk" size="143360" crc="11a34694" sha1="11b6be5fb5a6df08982007e76c53ee8bec35e20e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="numbpls">
+ <description>Number Please: Visual and Sequential Memory Practice (release 2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="release 2" />
+ <!-- Litag developer is added to Learning Technologies screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="number please (4am crack).dsk" size="143360" crc="d602d78b" sha1="b92aba698a15ad8ba56fa04469d7b46bb108a104" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nmbquest">
+ <description>Number Quest (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="number quest (4am crack).dsk" size="143360" crc="c1fe8bf4" sha1="c8b9160fd81a03e0fb5a9365be34fbf1f7ff9cdc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nbrstmpr">
+ <description>Number Stumper (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Dennis Sorensen" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="number stumper (4am crack).dsk" size="143360" crc="427caa58" sha1="514569a27d9ff0e5f25710354baafb5858e2dde2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="numsyst">
+ <description>Number Systems (A-819 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-819" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-01 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a819 number systems v1.1 (4am crack).dsk" size="143360" crc="7d2e8139" sha1="a3411af801385f869b6680b2586c30a353fb910f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nmbwrdl1">
+ <description>Number Words: Level 1 (version 04.13.84) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="04.13.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="number words level 1 (4am crack).dsk" size="143360" crc="146550b5" sha1="ee2ff0cf91950c7f1233dfb356311c9bc4fd7056" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="numbball">
<description>Numberball (4am crack)</description>
<year>1994</year>
@@ -50223,8 +44811,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-11-10-->
- <!--education program-->
+ <!-- Dump released: 2021-11-10 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="numberball (4am crack).dsk" size="143360" crc="bd983ba9" sha1="73da61404aa405fd65616a957ef75ffc12f6af04"/>
@@ -50232,6 +44820,268 @@ license:CC0-1.0
</part>
</software>
+ <software name="nutfoodg10" cloneof="nutfoodg">
+ <description>Nutrition and Food Groups (A-822 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="alt_title" value="Nutrition" />
+ <info name="partno" value="A-822" />
+ <info name="programmer" value="Tim Heap" />
+ <info name="programmer" value="Seth A. Rosenblatt" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a822 nutrition v1.0 (4am crack).dsk" size="143360" crc="a006e95a" sha1="bcd43af6365e4e96be0cebc8cf282c81f4b657f1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutfoodg">
+ <description>Nutrition and Food Groups (A-822 version 1.2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="alt_title" value="Nutrition" />
+ <info name="partno" value="A-822" />
+ <info name="programmer" value="Tim Heap" />
+ <info name="programmer" value="Seth A. Rosenblatt" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a822 nutrition and food groups v1.2 (4am crack).dsk" size="143360" crc="c7dfa14c" sha1="c2cb7e2e7ae75a521572152329f3b473f79509f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutnabber_525">
+ <description>Nutrition Nabber (A-330 version 1.0) (4am crack)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-330" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a330 nutrition nabber v1.0 (4am crack).dsk" size="143360" crc="fd26d45a" sha1="6044b45f46c4be4f43c2a2399f2b9ae4b8728030"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutritv1">
+ <description>Nutrition Volume 1 (A-752 version 1.2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-752" />
+ <info name="programmer" value="Shane McCarron" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a752 nutrition volume 1 v1.2 (4am crack).dsk" size="143360" crc="6da02706" sha1="3ff2d9b0a20fc5e083598f7159d9a1d70e5ad58c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutritv212" cloneof="nutritv2">
+ <description>Nutrition Volume 2 (A-753 version 1.2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-753" />
+ <info name="programmer" value="Willis Jokela" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a753 nutrition vol. 2 v1.2 (4am crack).dsk" size="143360" crc="d7f7abe5" sha1="e37e720be519f2ee65ce07985bac3544273bc181" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutritv2">
+ <description>Nutrition Volume 2 (A-753 version 1.5) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-753" />
+ <info name="programmer" value="Willis Jokela" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a753 nutrition volume 2 v1.5 (4am crack).dsk" size="143360" crc="5d6d3d9b" sha1="d1799b68a1a945f0105f0e56fb7056c97fe052c9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ogre">
+ <description>OGRE (4am crack)</description>
+ <year>1986</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Steve Meuse" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ogre (4am crack).dsk" size="143360" crc="d332094e" sha1="7a473c2170f27b49332fbcd45402ebc3aef6281f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odd1out86" cloneof="odd1out">
+ <description>Odd One Out (version 1986) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="odd one out (4am crack).dsk" size="143360" crc="92caf802" sha1="30b1e88bb7a37491592bd501a0776a2ac3128f81" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odd1out">
+ <description>Odd One Out (version 26-AUG-1990) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="26-AUG-1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="odd one out 1990 (4am crack).dsk" size="143360" crc="ac9dc6d2" sha1="3553590d53726fbad5792312f463207d87bc45ba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odelllk10" cloneof="odelllk_525">
+ <description>Odell Lake (A-191 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-191" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a191 odell lake v1.0 (4am crack).dsk" size="143360" crc="60b1b4e8" sha1="137dc71b9e7547a1d763303948efde8540d3fe83"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odelllk11" cloneof="odelllk_525">
+ <description>Odell Lake (A-191 version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-191" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a191 odell lake v1.1 (4am crack).dsk" size="143360" crc="236bcb0e" sha1="3f592f85f07a185eeb3286cb24aaa9e60b426212" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odelllk_525">
+ <description>Odell Lake (A-191 version 1.2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-191" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a191 odell lake v1.2 (4am crack).dsk" size="143360" crc="f3a5b62a" sha1="b2ce3a070cc2c7d2f95ee0cca16f5a13c41d8cbc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ohdeer">
+ <description>Oh, Deer! (A-781 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-781" />
+ <info name="programmer" value="Cynthia L. Schroeder" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a781 oh, deer v1.1 (4am crack).dsk" size="143360" crc="e771b33f" sha1="bd943da8c19277218c2351193f0630740ef05f96"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="oilswell">
+ <description>Oil's Well (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ivan Strand" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="oil's well (4am crack).dsk" size="143360" crc="f37459cf" sha1="f88030fc774e1e5af46b4beb8bcacbff13f0e9da" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="olvcword">
<description>Oliver's Crosswords (4am crack)</description>
<year>1990</year>
@@ -50239,8 +45089,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-22-->
- <!--education program-->
+ <!-- Dump released: 2017-06-22 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="143360">
@@ -50255,6 +45105,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="omega">
+ <description>Omega (4am crack)</description>
+ <year>1989</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Stuart B. Marks" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-21 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Systems"/>
+ <dataarea name="flop" size="143360">
+ <rom name="omega (4am crack) disk 1a - systems.dsk" size="143360" crc="321554d2" sha1="8f4cd7ee77cd7b92a771058c46dad6915a68a819" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Operations"/>
+ <dataarea name="flop" size="143360">
+ <rom name="omega (4am crack) disk 1b - operations.dsk" size="143360" crc="5517783f" sha1="3c183688f31a6dbc2c834a27573551ec099e940b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Resource"/>
+ <dataarea name="flop" size="143360">
+ <rom name="omega (4am crack) disk 2a - resource.dsk" size="143360" crc="e2ea201b" sha1="6375b27814ef29c9110696256a5dca5e839116dc" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Sample"/>
+ <dataarea name="flop" size="143360">
+ <rom name="omega (4am crack) disk 2b - sample.dsk" size="143360" crc="8ce67c8a" sha1="0639b93d34c28254718a9c95ca5f8c1f60f2703c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="onbalance">
<description>On Balance (4am crack)</description>
<year>1986</year>
@@ -50262,8 +45147,8 @@ license:CC0-1.0
<info name="programmer" value="David Eisler" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--productivity program-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="143360">
@@ -50278,6 +45163,165 @@ license:CC0-1.0
</part>
</software>
+ <software name="ootopos">
+ <description>Oo-Topos (4am crack)</description>
+ <year>1986</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Michael Berlyn" />
+ <info name="programmer" value="Muffy Berlyn" />
+ <info name="programmer" value="Raimund Redlich" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Double hi-res graphics are available on 128K Apple //e and later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="oo-topos (4am crack) side a.dsk" size="143360" crc="893e44ad" sha1="a6b5efc18704857d037796fdeabb5f4d05d7b40a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="oo-topos (4am crack) side b - boot.dsk" size="143360" crc="496489cf" sha1="4877a0e92410e9a8fdeb2607777de3ae989909d7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="opapoc">
+ <description>Operation Apocalypse (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="operation apocalypse (4am and san inc crack).dsk" size="143360" crc="37d4dd84" sha1="e1bbd5762a0805ae3afb5d1be3889dbeba657d0f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="operfrog">
+ <description>Operation Frog (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Interactive Picture Systems" />
+ <info name="programmer" value="John Mack" />
+ <info name="programmer" value="Susan Rubin" />
+ <info name="programmer" value="Sanford Kaye" />
+ <info name="programmer" value="Jon Wolfe" />
+ <info name="programmer" value="Jimmy Snyder" />
+ <info name="programmer" value="Bob Svihovec" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-03. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="operation frog (4am crack) side a.dsk" size="143360" crc="9caf030e" sha1="d6ffd510537e8fe4cb44808ce0ab8f589e79d8f2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="operation frog (4am crack) side b.dsk" size="143360" crc="949b1c73" sha1="98d1b3956cbdd875b5fe23e79416881641659880" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="opposite013087" cloneof="opposite">
+ <description>Opposites (version 01.30.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.30.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="opposites v01.30.87 (4am crack) side a.dsk" size="143360" crc="2428e261" sha1="6536827c63ac92e9a95cf35ef0e427a041f54025"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="opposites v01.30.87 (4am crack) side b.dsk" size="143360" crc="5b2f7f91" sha1="f086afa11259ac35379dbde3e3338f98b364402d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="opposite091587" cloneof="opposite">
+ <description>Opposites (version 09.15.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.15.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="opposites v09.15.87 (4am crack) disk 1.dsk" size="143360" crc="808398f2" sha1="c2cec4adc3380cef1cb6106791c92b37d006c46a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="opposites v09.15.87 (4am crack) disk 2.dsk" size="143360" crc="cbbeeecf" sha1="fe8cbba2b8b8e3da81d708a4e064b0d89abb0b31" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="opposite">
+ <description>Opposites (version 01.12.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.12.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="opposites v01.12.89 (4am crack) disk 1.dsk" size="143360" crc="5cf9b2e8" sha1="7b293b39adbffa59a0a2d6370d9c71277a23e11a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="opposites v01.12.89 (4am crack) disk 2.dsk" size="143360" crc="9fa31c03" sha1="ff45ab5ff6ec9da038e59aecbae86c5977dfc5ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="orderopr">
+ <description>Order of Operations (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="order of operations (4am crack).dsk" size="143360" crc="e19893f6" sha1="fa2999ce2e39068ec446710ed4d8e893b87cc54f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="osmoticpr">
<description>Osmotic Pressure (version 1.1, 04/1985) (4am crack)</description>
<year>1985</year>
@@ -50286,8 +45330,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-01-13-->
- <!--educational program-->
+ <!-- Dump released: 2021-01-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="osmotic pressure (4am crack).dsk" size="143360" crc="00c72625" sha1="ee7f66ef595e43486f4d8197774e081ae375bc8c"/>
@@ -50295,6 +45339,89 @@ license:CC0-1.0
</part>
</software>
+ <software name="ov2curcm">
+ <description>Other-Venture #2: The Curse of Crowley Manor (4am crack)</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the curse of crowley manor (4am crack).dsk" size="143360" crc="35dffa95" sha1="362bad035efea6e55cdddcb36d08767fb4ced8b5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ov3etraam">
+ <description>Other-Venture #3: The Escape from Traam (4am crack)</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the escape from traam (4am crack).dsk" size="143360" crc="2674abc0" sha1="ae85eb448d2ba306131adb3b5d98ac20cbb99a32"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ov4eqsf1906">
+ <description>Other-Venture #4: Earthquake - San Francisco 1906 (4am crack)</description>
+ <year>1982</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-10 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A (Boot)"/>
+ <dataarea name="flop" size="143360">
+ <rom name="earthquake san francisco 1906 (4am crack) side a.dsk" size="143360" crc="93119894" sha1="e46eebbd8797f966f1c94277f10df0402b58bc48" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="earthquake san francisco 1906 (4am crack) side b.dsk" size="143360" crc="eab2180c" sha1="f49986c6ab5d57b5a1fa81069a592c621dd30b57" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="phmpegas">
+ <description>P.H.M. Pegasus (4am and san inc crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Noah Falstein" />
+ <info name="programmer" value="Larry E. Holland" />
+ <info name="programmer" value="Edwin W. Reich, Jr." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-28 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="phm pegasus (4am and san inc crack) side a.dsk" size="143360" crc="e4a26600" sha1="4d2cac5b114634ba64ee9557c2be939f6b4ee0eb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="phm pegasus (4am and san inc crack) side b.dsk" size="143360" crc="3200590b" sha1="e1c9c849093dd559db58a86d77e72f392e28f452" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pacif231">
<description>Pacific 231 (French) (4am crack)</description>
<year>1984</year>
@@ -50302,8 +45429,8 @@ license:CC0-1.0
<info name="developer" value="Spinnaker Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Color"/>
<dataarea name="flop" size="143360">
@@ -50318,6 +45445,51 @@ license:CC0-1.0
</part>
</software>
+ <software name="pacmana" cloneof="pacman">
+ <description>Pac-Man (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pac-man (atari)(4am crack).dsk" size="143360" crc="988e08f1" sha1="5eb20be8a79227715177b65cd0ea4a34be273629" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pacmant" cloneof="pacman">
+ <description>Pac-Man (Thunder Mountain) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-12 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pac-man (thunder mountain)(4am crack).dsk" size="143360" crc="82379bed" sha1="9b3e1b9e78dcfb1f8f55925c9bf2f6161423004d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pacman">
+ <description>Pac-Man (Datasoft) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Datasoft</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-10 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pac-man (datasoft)(4am crack).dsk" size="143360" crc="9852a378" sha1="dd4cec96fd37aba85f5bd2a5b75d0656904765d1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="paintpow">
<description>Painter Power (4am crack)</description>
<year>1981</year>
@@ -50325,8 +45497,8 @@ license:CC0-1.0
<info name="programmer" value="Eric S. Podietz" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-28-->
- <!--graphics utility-->
+ <!-- Dump released: 2023-10-28 -->
+ <!-- graphics utility -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="painter power (4am crack).dsk" size="143360" crc="cfe35717" sha1="707f80b2d67aef1f8eb6af3bad019f67ca4c39fd" />
@@ -50334,6 +45506,40 @@ license:CC0-1.0
</part>
</software>
+ <software name="panzgrna10">
+ <description>Panzer Grenadier (version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="LDW Software" />
+ <info name="programmer" value="Roger Damon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-23 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="panzer grenadier (4am crack).dsk" size="143360" crc="3cae8a0e" sha1="20a8bc42eafc963194fe773beacff2bc2af00077" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="paperboy">
+ <description>Paperboy (4am crack)</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Tengen" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-15 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="paperboy (4am crack).dsk" size="143360" crc="e0914bc0" sha1="37da2f836f9182c53931a8f08827f72826f844ac" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="paraptsp">
<description>Parachute Parts of Speech (4am crack)</description>
<year>1984</year>
@@ -50341,8 +45547,8 @@ license:CC0-1.0
<info name="programmer" value="Marley W. Watkins" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-12-->
- <!--educational game-->
+ <!-- Dump released: 2022-10-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="parachute parts of speech (4am crack).dsk" size="143360" crc="227fa0b6" sha1="b38eeedbf84d56bbfe2d615aba22dff0db33b791" />
@@ -50350,6 +45556,160 @@ license:CC0-1.0
</part>
</software>
+ <software name="posfwnap">
+ <description>Parts of Speech: Fun with Nouns and Pronouns (4am crack)</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="parts of speech - fun with nouns and pronouns (4am crack).dsk" size="143360" crc="1879f3b5" sha1="7026ccf1f0e90e700fb8cee17fec809b00a8983a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="posfwvrb">
+ <description>Parts of Speech: Fun with Verbs (4am crack)</description>
+ <year>1991</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="parts of speech - fun with verbs (4am crack).dsk" size="143360" crc="602e9caf" sha1="cedb2e02ad75698cc0f00dccedc2f2f253fea524" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pathtact">
+ <description>Path Tactics (A-162 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-162" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a162 path tactics v1.0 (4am crack).dsk" size="143360" crc="04d7a9e5" sha1="6885f2fd5f4d25fd467afbc095335b0a79643709"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ptwrdstm">
+ <description>Pathwords (Thunder Mountain) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="developer" value="Eon Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pathwords (thunder mountain) (4am crack).dsk" size="143360" crc="2c0f710a" sha1="e21d8f8eb916566c2ff75f6ef976f20477ce6522" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patpitl1">
+ <description>Patterns in Pitch (Composition and Dictation): Level One (4am crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="patterns in pitch- level one (4am crack).dsk" size="143360" crc="38999691" sha1="0d915d0196a7f702d944b3fcea29d5cf71e6db7d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patpitl2">
+ <description>Patterns in Pitch (Composition and Dictation): Level Two (4am crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="patterns in pitch- level two (4am crack).dsk" size="143360" crc="b1f90ab6" sha1="0c1147489a0aa3f096e79206b66230db806e3f5b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patpitl3">
+ <description>Patterns in Pitch (Composition and Dictation): Level Three (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="patterns in pitch- level three (4am crack).dsk" size="143360" crc="d73aea3a" sha1="18a5159a69861938939aaa134b2afdc895bfb24a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patrhyl2">
+ <description>Patterns in Rhythm (Composition and Dictation): Level Two (4am crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="patterns in rhythm- level two (4am crack).dsk" size="143360" crc="45680647" sha1="0c05a7a359411d25c8cbe8c16a08384d625e3243"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patrhyl3">
+ <description>Patterns in Rhythm (Composition and Dictation): Level Three (4am crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="patterns in rhythm- level three (4am crack).dsk" size="143360" crc="dad7cec3" sha1="0de0f94c2754d2810b998e3ac6d82e4bc16fa2fa"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="patrnmkr">
<description>PatternMaker (4am crack)</description>
<year>1984</year>
@@ -50358,8 +45718,8 @@ license:CC0-1.0
<info name="programmer" value="Jerome E. Puzo" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-04-->
- <!--graphics program-->
+ <!-- Dump released: 2019-04-04 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="patternmaker (4am crack).dsk" size="143360" crc="5bfa941d" sha1="63a4d1e2d67eac8390628613e3d777cf87a4a40a" />
@@ -50367,6 +45727,65 @@ license:CC0-1.0
</part>
</software>
+ <software name="pbunyan">
+ <description>Paul Bunyan (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="paul bunyan (4am crack).dsk" size="143360" crc="7ac84911" sha1="90f04bc4cca68a82b68d3cf9827f023b0397b688" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="paulmsj">
+ <description>Paul's Missionary Journeys (4am crack)</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="paul's missionary journeys (4am crack) side a.dsk" size="143360" crc="752993ed" sha1="14ddbe52b978cd5d6a2e855ce38ce3093aa32b25" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="paul's missionary journeys (4am crack) side b.dsk" size="143360" crc="41c4584a" sha1="148d0ec4865cabc3cfa70b83658b2ded699b030c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="psbussim">
+ <description>Payroll System: A Business Simulation (A-104 version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-104" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a104 payroll system- a business simulation v1.2 (4am crack).dsk" size="143360" crc="d212f43f" sha1="93087105dfe4b4e9c62b2ccf88de205bc663c454"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="pmathmat">
<description>Peanuts Math Matcher (4am crack)</description>
<year>1985</year>
@@ -50374,8 +45793,8 @@ license:CC0-1.0
<info name="developer" value="Random House" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -50396,8 +45815,8 @@ license:CC0-1.0
<publisher>Random House</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-08. Redumped: 2023-10-08-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-08. Redumped: 2023-10-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -50418,8 +45837,8 @@ license:CC0-1.0
<publisher>Random House</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-08. Redumped: 2016-12-03-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-08. Redumped: 2016-12-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -50434,6 +45853,54 @@ license:CC0-1.0
</part>
</software>
+ <software name="pecosbill">
+ <description>Pecos Bill (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pecos bill (4am crack).dsk" size="143360" crc="51a5821b" sha1="53a690403581b3938fe4b5f5daae507ca1bea860" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pegasus2">
+ <description>Pegasus II (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pegasus ii (4am and san inc crack).dsk" size="143360" crc="11376583" sha1="c819db857ccddbdd679c92c09ec6307cd1c3a72c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pensate">
+ <description>Pensate (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="John Besnard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-03 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pensate (4am crack).dsk" size="143360" crc="c7681fa5" sha1="4353b479a2d43e852b22a995afb2f2d0e5db9522"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="pploldtest">
<description>People of the Old Testament (version 03.09.90) (4am crack)</description>
<year>1990</year>
@@ -50442,8 +45909,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="03.09.90" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="people of the old testament (4am crack).dsk" size="143360" crc="68df9410" sha1="8319a9c217c61cc73932dc1c95902d6add6fc022" />
@@ -50459,8 +45926,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="3.1.6" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-18-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -50475,25 +45942,6 @@ license:CC0-1.0
</part>
</software>
- <software name="perwordpr">
- <description>Percent Word Problems (4am crack)</description>
- <year>1984</year>
- <publisher>Intellectual Software</publisher>
- <info name="alt_title" value="MicroTutor II: Mosaic" />
- <!--Title screen-->
- <info name="developer" value="Intellectual Software" />
- <!--Was this really Scandura Training Systems?-->
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-17-->
- <!--educational program-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="percent word problems (4am crack).dsk" size="143360" crc="995add9f" sha1="3654265ae9f7d7335ceae0e99e429d4b0de61d90" />
- </dataarea>
- </part>
- </software>
-
<software name="percept31" cloneof="percept">
<description>Perception (version 3.1) (4am crack)</description>
<year>1981</year>
@@ -50502,8 +45950,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="3.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="perception v3.1 (4am crack).dsk" size="143360" crc="03a363e2" sha1="a57dec5d165e984958d08ed722d75b6a30592781" />
@@ -50512,17 +45960,17 @@ license:CC0-1.0
</software>
<software name="percept">
- <description>Perception (version 3.1) (SoftSmith) (4am and san inc crack)</description>
+ <description>Perception (version 3.1) (Softsmith) (4am and san inc crack)</description>
<year>1981</year>
- <publisher>SoftSmith</publisher>
+ <publisher>Softsmith</publisher>
<info name="developer" value="Edu-Ware Services" />
<info name="original_publisher" value="Edu-Ware Services"/>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="3.1" />
- <!--SoftSmith re-release based on version 3.1 by Edu-Ware Services.-->
+ <!-- Softsmith re-release based on version 3.1 by Edu-Ware Services. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="perception (softsmith) (4am and san inc crack).dsk" size="143360" crc="998cddae" sha1="e4dafe7365675af37675c1019114639d848afda7"/>
@@ -50534,12 +45982,13 @@ license:CC0-1.0
<description>Perplexing Puzzles (version 07.09.85) (4am crack)</description>
<year>1985</year>
<publisher>Hartley Courseware</publisher>
- <info name="programmer" value="Phil Mansour and Paul Fleisher" />
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Paul Fleisher" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="07.09.85" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-01-->
- <!--educational game-->
+ <!-- Dump released: 2022-10-01 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="perplexing puzzles (4am crack).dsk" size="143360" crc="4860446c" sha1="3052c8cf0e6416b64988ea351f20769f766abbb7" />
@@ -50547,6 +45996,21 @@ license:CC0-1.0
</part>
</software>
+ <software name="pcommnwin">
+ <description>Persona's Communicate and Win (4am crack)</description>
+ <year>????</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-07 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="communicate and win (4am crack).dsk" size="143360" crc="0e983c2d" sha1="a95ce215249c05d37727114f887285ecdf9b854e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="persprof2">
<description>Personality Profile 2 (4am crack)</description>
<year>1988</year>
@@ -50554,8 +46018,8 @@ license:CC0-1.0
<info name="developer" value="Psychological Psoftware" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-07-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="personality profile 2 (4am crack).dsk" size="143360" crc="c15a22ad" sha1="e06ac1e8dd3a0bbb7ce49fbb8aa05e075005dafd" />
@@ -50563,17 +46027,35 @@ license:CC0-1.0
</part>
</software>
- <software name="petshop">
+ <software name="permushist">
+ <description>Perspectives in Music History (4am crack)</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="perspectives in music history (4am crack).dsk" size="143360" crc="d51b35b2" sha1="0b48300464a387a5bcc9637305f062ee23b5168e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="petshop_525">
<description>Pet Shop (A-347 version 1.0) (4am crack)</description>
<year>1994</year>
<publisher>MECC</publisher>
<info name="partno" value="A-347" />
- <info name="programmer" value="Dave Denninger, John A. Persoon, and Jean Sharp" />
+ <info name="programmer" value="Dave Denninger" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="Jean Sharp" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a347 pet shop v1.0 (4am crack).dsk" size="143360" crc="90ce093e" sha1="662db9566d5869f2ed75a445f4fe895e02319b32" />
@@ -50581,16 +46063,35 @@ license:CC0-1.0
</part>
</software>
+ <software name="petsltd">
+ <description>Pets, Ltd. (A-111 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-111" />
+ <info name="programmer" value="Robert Granvin" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a111 pets, ltd. v1.0 (4am crack).dsk" size="143360" crc="6e15b0c4" sha1="78881bc772f48ac282ec732e8d1a20d1bd20d412"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="phanta">
<description>Phantasie (version 1.0) (4am and san inc crack)</description>
<year>1984</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Winston Douglas Wood" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-06. Redumped: 2024-03-04-->
- <!--strategy game-->
+ <!-- Dump released: 2018-10-06. Redumped: 2024-03-04 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Boot" />
<dataarea name="flop" size="143360">
@@ -50608,13 +46109,13 @@ license:CC0-1.0
<software name="phantaii">
<description>Phantasie II: Descent Into The Netherworld (version 2/5/86) (4am and san inc crack)</description>
<year>1986</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Winston Douglas Wood" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="2/5/86" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-06-->
- <!--strategy game-->
+ <!-- Dump released: 2018-10-06 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -50637,8 +46138,8 @@ license:CC0-1.0
<info name="programmer" value="Elizabeth Levin" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-08-04-->
- <!--productivity program-->
+ <!-- Dump released: 2019-08-04 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -50657,12 +46158,12 @@ license:CC0-1.0
<description>Physical or Chemical (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank Salamon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="physical or chemical (4am crack).dsk" size="143360" crc="13950d87" sha1="310e95db3e8bdd93fa726b26face1ff23c37e29a" />
@@ -50670,6 +46171,88 @@ license:CC0-1.0
</part>
</software>
+ <software name="pickpart">
+ <description>Pick The Part (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pick the part (4am crack).dsk" size="143360" crc="4ef73c91" sha1="b4900ba310892fc33eb8c6b4bff54f224edf2701" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="picklefos">
+ <description>Pickleface and Other Stories (version 04.07.90) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Mary Roessler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.07.90" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="pickleface and other stories v04.07.90 (4am crack) disk 1.dsk" size="143360" crc="9806df1f" sha1="3b3c61a43653736fbcb9939b9db3c8d3acf00b2f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="pickleface and other stories v04.07.90 (4am crack) disk 2.dsk" size="143360" crc="62ef76fc" sha1="84d8d868cd31565a27c298234ccdbf8ea3977d75" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="143360">
+ <rom name="pickleface and other stories v04.07.90 (4am crack) disk 3.dsk" size="143360" crc="d33eb0b6" sha1="de1d92a625d19626b5bb6b80e66921a9fb09153f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="picastory_525">
+ <description>Picture a Story (A-311 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-311" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a311 picture a story v1.0 (4am crack).dsk" size="143360" crc="fdcc0dd4" sha1="e048f609a089159b33bdc1b6540edccd80b4489f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pictpara">
+ <description>Picture Parade (version 11.24.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="11.24.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="picture parade v11.24.88 (4am crack).dsk" size="143360" crc="b2473c8a" sha1="a9faec6a88ff1c86f492fc142e0bddde017b746b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pictperf87" cloneof="pictperf">
<description>Picture Perfect (version 1987) (4am crack)</description>
<year>1987</year>
@@ -50678,8 +46261,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-04-->
- <!--graphics program-->
+ <!-- Dump released: 2023-09-04 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="picture perfect 1987 (4am crack).dsk" size="143360" crc="ffe31e7b" sha1="8f86706670d71c0180a1fd3540ba518f2fc4b239" />
@@ -50695,8 +46278,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1989" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-19-->
- <!--graphics program-->
+ <!-- Dump released: 2017-11-19 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="picture perfect (4am crack).dsk" size="143360" crc="fa891908" sha1="aa48e4e7cabee08f6cd9c74af7ace845237a7c98" />
@@ -50704,16 +46287,127 @@ license:CC0-1.0
</part>
</software>
+ <software name="pieman">
+ <description>Pie-Man (4am crack)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Eagle Berns" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-08 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pie-man (4am crack).dsk" size="143360" crc="dd8efb80" sha1="088cdc2636dc09d8da1d163b2c2f8e50bd1beb31" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pinbcset">
+ <description>Pinball Construction Set (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="BudgeCo" />
+ <info name="programmer" value="Bill Budge" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-01 -->
+ <!-- game development program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pinball construction set (4am and san inc crack).dsk" size="143360" crc="71c8362a" sha1="9a809dd030da376f17857b4cd74fba4cad68f01c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pipeline">
+ <description>Pipeline (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Learning Technologies" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pipeline (4am crack).dsk" size="143360" crc="e50c7c1c" sha1="47d65b3724944926b9762430693ff6b6c8b937d8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pitstop2">
+ <description>Pitstop II (4am crack)</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Ivan Manley" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="D. Stinnett" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-13 -->
+ <!-- racing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pitstop ii (4am crack).dsk" size="143360" crc="6821705b" sha1="cf5d291a800c54cecfb65a69e465266d3e2319eb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pixit">
+ <description>Pixit (version 01331) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="01331" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="Kimberly Evans" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01331" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-07-03 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pixit v01331 (4am crack).dsk" size="143360" crc="92c24ed0" sha1="f75659cb387ecd096b7de38f17e88358b4de72d2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pizza2go">
+ <description>Pizza to Go (A-333 version 1.0) (4am crack)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-333" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a333 pizza to go v1.0 (4am crack).dsk" size="143360" crc="da7bba25" sha1="24956ed3f00d8fd335ca802136b6257b896dd2ae"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="placeval">
<description>Place Value: Ones, Tens, and Hundreds (4am crack)</description>
<year>1986</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
- <info name="programmer" value="Hap Gaylord and George Ropes" />
+ <!-- E.M.E Corporation -->
+ <info name="programmer" value="Hap Gaylord" />
+ <info name="programmer" value="George Ropes" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="place value 1s 10s 100s (4am crack).dsk" size="143360" crc="a76c8758" sha1="02fcc6955e309fa17e7013e295fd61e82de06dbb" />
@@ -50728,8 +46422,8 @@ license:CC0-1.0
<info name="developer" value="Krell Sotware" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-25-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="plato's cave (4am crack).dsk" size="143360" crc="97a0aa21" sha1="aab2be7e3b2bc92175677f9c34903159e908a76b" />
@@ -50737,15 +46431,52 @@ license:CC0-1.0
</part>
</software>
+ <software name="plyblkt">
+ <description>Play Ball, Kate (4am crack)</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="play ball, kate (4am crack).dsk" size="143360" crc="5bd1667d" sha1="4625639b8bcdda16865b3830df035f8fa7048dba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pwstemp">
+ <description>Playing with Science: Temperature (4am crack)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Leslie Eiser" />
+ <info name="programmer" value="Dominique Allard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="playing with science- temperature (4am crack).dsk" size="143360" crc="694d7f51" sha1="c098c1da499e8635bf0acf0274d5be06322a81ea"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="plshlpmesp">
<description>Please Help Me: Spelling (4am crack)</description>
<year>1986</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Bob Wihnyk, Linda C. Unger, Ted Costa, Ingrid Braren, and Patricia Lynch" />
+ <info name="programmer" value="Bob Wihnyk" />
+ <info name="programmer" value="Linda C. Unger" />
+ <info name="programmer" value="Ted Costa" />
+ <info name="programmer" value="Ingrid Braren" />
+ <info name="programmer" value="Patricia Lynch" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-05-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-05-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A" />
<dataarea name="flop" size="143360">
@@ -50788,12 +46519,13 @@ license:CC0-1.0
<description>Polls and Politics Volume 1 (A-820 version 1.0) (4am crack)</description>
<year>1984</year>
<publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
<info name="partno" value="A-820" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-20-->
- <!--education program-->
+ <!-- Dump released: 2023-02-20 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a820 polls and politics v1.0 (4am crack).dsk" size="143360" crc="1835797f" sha1="ca580b411b23fbeb1614b63c43672093dd4cb002" />
@@ -50801,18 +46533,91 @@ license:CC0-1.0
</part>
</software>
+ <software name="polywr">
+ <description>PolyWriter (version 1.2) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="alt_title" value="Polywriter 401" />
+ <!-- After the titlescreen, it is branded for the MPU-401 -->
+ <info name="author" value="Phil Farrand" />
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="John Borowicz" />
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-18 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="polywriter v1.2 (4am and san inc crack).dsk" size="143360" crc="10770914" sha1="c8ee9a53070adf453876392cbc8814c8bb087b8d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="polywru">
+ <description>PolyWriter Utilities (version 1.2) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-18 -->
+ <!-- audio utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="polywriter utilities v1.2 (4am and san inc crack).dsk" size="143360" crc="708766bd" sha1="8cf89cc33b6e70c45328edc08d1f17929350d941"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poprsplr1" cloneof="poprspl">
+ <description>Pop 'R Spell &amp; Pop 'R Spell Challenge (revision 1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="Milliken Publishing Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pop 'r spell (4am crack).dsk" size="143360" crc="e80dcff9" sha1="313d9292b25c753cce1ad161b591fe2d58fde908" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poprspl">
+ <description>Pop 'R Spell &amp; Pop 'R Spell Challenge (revision 2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="Milliken Publishing Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Updated revision fixes an off-by-1 error. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pop 'r spell and pop 'r spell challenge rev. 2 (4am crack).dsk" size="143360" crc="bfd30521" sha1="842e89724fa646efb0eae1dd2ab67125800ebc7f"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="facemkrf" cloneof="facemkr">
<description>Portrait Robot (French) (4am crack)</description>
- <!--French version of Facemaker-->
+ <!-- French version of Facemaker -->
<year>1984</year>
<publisher>Ediciel</publisher>
- <!--Title screen says DesignWare-->
+ <!-- Title screen says DesignWare -->
<info name="alt_title" value="Facemaker"/>
<info name="developer" value="Spinnaker Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-03-->
- <!--educational game-->
+ <!-- Dump released: 2022-07-03 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="portrait robot (4am crack).dsk" size="143360" crc="c32f34d2" sha1="39bf2e1cf5a078f997a7817c0b6351954db12129"/>
@@ -50820,15 +46625,72 @@ license:CC0-1.0
</part>
</software>
+ <software name="pwrdrill">
+ <description>Power Drill (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="power drill (4am crack).dsk" size="143360" crc="7a3eacc2" sha1="a4c67eedaa6c86f04f15ba4d8fdcf568981fc355" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pracalgb">
+ <description>Practical Algebra (4am crack)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-21 to fix compatibility issues. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Symbols and sets"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical algebra (4am crack) disk 1 - symbols and sets.dsk" size="143360" crc="8fe8622c" sha1="7be0b2527ec2a1d12defd74c825d1798a354a9b3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Real number system"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical algebra (4am crack) disk 2 - real number system.dsk" size="143360" crc="5bfd7c50" sha1="c402afc4d94235817b1b60fef9c2ca9d7372d120" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Equations I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical algebra (4am crack) disk 3 - equations i.dsk" size="143360" crc="d7e6ded2" sha1="0de04a078031b534bf9042dde9fc8591f0b38d60" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Equations II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical algebra (4am crack) disk 4 - equations ii.dsk" size="143360" crc="11195456" sha1="1287c2498ac667b55d3e90413e7fdcb9db48d0d1" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 - Algebra word problems"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical algebra (4am crack) disk 5 - algebra word problems.dsk" size="143360" crc="6935165f" sha1="95e0eeb3ae58b2b93a5fe87db6bb843bf08344b7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="prccomp2">
- <description>Practical Composition II - Clear Logical Sentences (4am crack)</description>
+ <description>Practical Composition II: Clear, Logical Sentences (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Queue, Inc." />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-07-13-->
- <!--educational program-->
+ <!-- Dump released: 2018-07-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -50843,6 +46705,180 @@ license:CC0-1.0
</part>
</software>
+ <software name="prcgramr">
+ <description>Practical Grammar (4am crack)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-21 to fix compatibility issues. -->
+ <!-- educational program -->
+ <!-- Disks 1-13 are believed to exist and are missing. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 1" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 2" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 3" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 4" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 51"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 5" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 6" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 7" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 8" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 9"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 9" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 10"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 10" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 11"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 11" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 12"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 12" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop13" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 13"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 13" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop14" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 14 - The tenses of verbs"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 14 - the tenses of verbs.dsk" size="143360" crc="31525600" sha1="b4110a6c0916ee765c1d4f1f509ecca59bfb2644" />
+ </dataarea>
+ </part>
+ <part name="flop15" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 15 - Verbs - voice and mood"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 15 - verbs - voice and mood.dsk" size="143360" crc="17c6ddc6" sha1="6d135fa59143f72fe4cbc36975394d8c80620433" />
+ </dataarea>
+ </part>
+ <part name="flop16" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 16 - Agreement of subject and verb"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 16 - agreement of subject and verb.dsk" size="143360" crc="48f403be" sha1="6a83fbcbfe25fdad120c42534741fad47ea76c3f" />
+ </dataarea>
+ </part>
+ <part name="flop17" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 17 - Prepositional phrases"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 17 - prepositional phrases.dsk" size="143360" crc="cc92a930" sha1="45cf447ddd650dd674cfa088844ce7b3a68c6182" />
+ </dataarea>
+ </part>
+ <part name="flop18" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 18 - Compound sentences"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 18 - compound sentences.dsk" size="143360" crc="5467b165" sha1="be4dea4d869f35600e3cfdbd5ad853d2bc5b2896" />
+ </dataarea>
+ </part>
+ <part name="flop19" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 19 - Complex sentences"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 19 - complex sentences.dsk" size="143360" crc="ed612d39" sha1="82a0c71fc2c028876087107d4ca03c87b6bc4d99" />
+ </dataarea>
+ </part>
+ <part name="flop20" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 20 - Adverbial clauses"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 20 - adverbial clauses.dsk" size="143360" crc="a061543d" sha1="cfffd364f5e9c3843e5061bf5ac459f765a39a76" />
+ </dataarea>
+ </part>
+ <part name="flop21" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 21 - Noun clauses"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 21 - noun clauses.dsk" size="143360" crc="0b1f9259" sha1="42a25ac245a69925b3410d27a6edc010faa41f46" />
+ </dataarea>
+ </part>
+ <part name="flop22" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 22 - Participles"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 22 - participles.dsk" size="143360" crc="00130533" sha1="a529a8e3f57d4933743b11fe5dd07ec7155fc84f" />
+ </dataarea>
+ </part>
+ <part name="flop23" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 23 - Gerunds"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 23 - gerunds.dsk" size="143360" crc="4efb4a86" sha1="fe7eed3e19031ee97f5c50ec815228e4033c65bd" />
+ </dataarea>
+ </part>
+ <part name="flop24" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 24 - Infinitives"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 24 - infinitives.dsk" size="143360" crc="fced1581" sha1="94c395aa9ba4266c7dfde0a454aae5047fece4cf" />
+ </dataarea>
+ </part>
+ <part name="flop25" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 25 - Problems in the use of infinitives"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 25 - problems in the use of infinitives.dsk" size="143360" crc="e24a69f8" sha1="d2dbe4d8a90e7b4b047e7b256b28a45440e079e0" />
+ </dataarea>
+ </part>
+ <part name="flop26" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 26 - Punctuation review"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 26 - punctuation review.dsk" size="143360" crc="a85a3bb3" sha1="e8b1f14797b0fb8601a8be3ec3a6b2a1e23c1181" />
+ </dataarea>
+ </part>
+ <part name="flop27" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 27 - Comprehensive grammar review II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="practical grammar (4am crack) disk 27 - comprehensive grammar review ii.dsk" size="143360" crc="d1db2201" sha1="a625471062e454d792b93f7df5c6052b2afc7c12" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="presmath041384" cloneof="presmath">
<description>Prescriptive Math Drill (version 04.13.84) (4am crack)</description>
<year>1984</year>
@@ -50851,8 +46887,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="04.13.84" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="prescriptive math drill v04.13.84 (4am crack).dsk" size="143360" crc="f444bd7c" sha1="ef0b2a0ab6ed2cede608e566ce7c270115d4a312" />
@@ -50868,8 +46904,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="09.10.87" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-07-14-->
- <!--educational program-->
+ <!-- Dump released: 2016-07-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="prescriptive math drill (4am crack).dsk" size="143360" crc="0752ab7d" sha1="2b284c179252349bcaa13ee4cbc7afbe841aa32c" />
@@ -50877,6 +46913,39 @@ license:CC0-1.0
</part>
</software>
+ <software name="prelect">
+ <description>President Elect (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Nelson G. Hernandez, Sr." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="president elect (4am and san inc crack).dsk" size="143360" crc="0cf493c7" sha1="cb6107c8943e07186c8445cf3529a2e596d17c37" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prelec88">
+ <description>President Elect 1988 Edition (version 2.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Nelson G. Hernandez, Sr." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="president elect 1988 edition (4am crack).dsk" size="143360" crc="e05a85d1" sha1="2dec1842f87e2babd9490d1353bcc73f7f049188" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pmaddnum">
<description>Primary Math: Addition 4-Digit Numerals with Renaming (4am crack)</description>
<year>1985</year>
@@ -50884,8 +46953,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M3-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="addition - 4-digit numerals with renaming (4am crack).dsk" size="143360" crc="e42b15f0" sha1="579ad606cf25afceda00e81ed3c952912c68deca" />
@@ -50900,8 +46969,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M14-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="basic division facts (4am crack).dsk" size="143360" crc="aa2d86db" sha1="45379656d0913027d003df8619c5cbe0aeaf469e" />
@@ -50916,8 +46985,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M8-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="basic multiplication facts (4am crack).dsk" size="143360" crc="c3b5a1e0" sha1="3d5a1689aed83c6e4c5b413911ebc4bf1d9cd3a2" />
@@ -50932,8 +47001,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M15-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="division of 1, 2, 3 digits by 1 digit numerals no remainders (4am crack).dsk" size="143360" crc="2e747831" sha1="5c4ee8cd6485a6917e819b61cd882823028307d4" />
@@ -50948,8 +47017,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M13-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="multiplication of 2, 3, and 4 digits by 1 digit with renaming (4am crack).dsk" size="143360" crc="524ede9a" sha1="7c80c91f57fc4ff2daf1f938e17bc5b390bd1e18" />
@@ -50964,8 +47033,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M12-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="multiplication of 2-digits by 1-digit numerals no renaming (4am crack).dsk" size="143360" crc="efff05c4" sha1="9d9436568610f76eeced5db701e01e73505d1536" />
@@ -50980,8 +47049,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M1-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-17-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="numeration and missing elements (4am crack).dsk" size="143360" crc="05bd37ad" sha1="f54383749557b96ae238cc7e53b1d9597a79ce25" />
@@ -50993,11 +47062,13 @@ license:CC0-1.0
<description>Primary Math: Pattern Completion (4am crack)</description>
<year>1986</year>
<publisher>Prescription Learning</publisher>
- <info name="programmer" value="Thomas J. Teater, Triska Paul, and Jill Bennette" />
+ <info name="programmer" value="Thomas J. Teater" />
+ <info name="programmer" value="Triska Paul" />
+ <info name="programmer" value="Jill Bennette" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-14-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pattern completion (4am crack).dsk" size="143360" crc="533d4e7c" sha1="bfa62619682c3bdabee38752df7eb51bbf56a1db" />
@@ -51012,8 +47083,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M5-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rounding 2- and 3-digit numerals (4am crack).dsk" size="143360" crc="4eb614a8" sha1="46f3b16c9fc051e824ff8a830ef4b2af7b2b3617" />
@@ -51028,8 +47099,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M4-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="subtraction - 3-digit subtraction with regrouping (4am crack).dsk" size="143360" crc="d1ada39b" sha1="de278bd360fed70c273a4258a99fde7511ec26ec" />
@@ -51044,8 +47115,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M6-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="subtraction - 4-digit numerals with renaming (4am crack).dsk" size="143360" crc="9bcaeee4" sha1="eb88eca8a00d71926d4a606d1b0a17ce0c778556" />
@@ -51060,8 +47131,8 @@ license:CC0-1.0
<info name="partno" value="THC-3M7-A" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2018-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="subtraction with zero in the minuend (4am crack).dsk" size="143360" crc="e91a7a86" sha1="ed40ef3f33b0969f941dfe4f1f1359da514204e9" />
@@ -51075,8 +47146,8 @@ license:CC0-1.0
<publisher>Prescription Learning</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="primary reading- following written directions (4am crack).dsk" size="143360" crc="74182dd3" sha1="c86d215e7cabe4da8023842f7383b0c56970d55f" />
@@ -51084,47 +47155,139 @@ license:CC0-1.0
</part>
</software>
- <software name="priwordm">
- <description>Primary WordMath (4am crack)</description>
- <year>1986</year>
- <publisher>Milliken Publishing Company</publisher>
- <info name="programmer" value="J. Coffland and S. Baldwin" />
+ <software name="primduck">
+ <description>Prime Ducks (4am crack)</description>
+ <year>1984</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="programmer" value="Barbara Jasinki" />
+ <info name="programmer" value="Diane Downie" />
+ <info name="programmer" value="Mark Ravitz" />
+ <info name="programmer" value="Bryan Moss" />
+ <info name="programmer" value="Marge Boots" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-28 -->
+ <!-- educational program -->
+ <!-- This may be side B of Sum Ducks. -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
- <rom name="primary wordmath (4am crack) disk 1.dsk" size="143360" crc="2aba34b2" sha1="7fdf60692e4d76b542f0111f2520016a7ed12951" />
+ <rom name="prime ducks (4am crack).dsk" size="143360" crc="7eec8773" sha1="35e17dacfb9d87b68a290aa503464baebc01b285" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="primenum">
+ <description>Prime Numbers (A-123 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-123" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a123 prime numbers v1.0 (4am crack).dsk" size="143360" crc="f0ceda44" sha1="b6a650ab7b8e2719df6b26dcde8f4d4af3827a09"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prince15521" cloneof="prince">
+ <description>Prince (version 15521) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="15521" />
+ <info name="programmer" value="Joel Novak" />
+ <info name="programmer" value="Ken Steiner" />
+ <info name="programmer" value="Michael Darooge" />
+ <info name="programmer" value="Bob Svihovec" />
+ <info name="programmer" value="Bryan Koeff" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="15521" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-30 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="prince v15521 (4am crack) side a.dsk" size="143360" crc="e6553b4f" sha1="e299c1b148446d9519dcabe766bc19ff5ef92635"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
- <rom name="primary wordmath (4am crack) disk 2.dsk" size="143360" crc="9de1cf0e" sha1="fc60419a948da439d7c9b8a6516dfab38b9b8958" />
+ <rom name="prince v15521 (4am crack) side b.dsk" size="143360" crc="ef036e55" sha1="9d51c9cf230414c3d004dd72c79aa25d68139da3"/>
</dataarea>
</part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3" />
+ </software>
+
+ <software name="prince">
+ <description>Prince (version 15531) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="15531" />
+ <info name="programmer" value="Joel Novak" />
+ <info name="programmer" value="Ken Steiner" />
+ <info name="programmer" value="Michael Darooge" />
+ <info name="programmer" value="Bob Svihovec" />
+ <info name="programmer" value="Bryan Koeff" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="15531" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-07-03 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
- <rom name="primary wordmath (4am crack) disk 3.dsk" size="143360" crc="065e4c68" sha1="da675aded7b07140cebc53c885edf0d5503a6e32" />
+ <rom name="prince v15531 (4am crack) side a.dsk" size="143360" crc="076b4c37" sha1="17642c6dde2665450c39a3b629faa5e1e097c2ea"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="prince v15531 (4am crack) side b.dsk" size="143360" crc="ef036e55" sha1="9d51c9cf230414c3d004dd72c79aa25d68139da3"/>
</dataarea>
</part>
</software>
- <software name="primduck">
- <description>Prime Ducks (4am crack)</description>
- <year>1984</year>
- <publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Barbara Jasinki, Diane Downie, Mark Ravitz, Bryan Moss, and Marge Boots" />
+ <software name="prnpasst">
+ <description>Principal's Assistant: The Personal Printing Program (4am crack)</description>
+ <year>1987</year>
+ <publisher>Learning Well / Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-07 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="principal's assistant (4am crack) side a.dsk" size="143360" crc="9a067400" sha1="ec8a0f44007b6ec66224e0e57224e898a2336d05" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="principal's assistant (4am crack) side b.dsk" size="143360" crc="6dc066fb" sha1="ede9b3556d23ba8fafdaf610b2dde00f60a9d6b5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pyobingo">
+ <description>Print Your Own BINGO Plus (version 01.23.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Phil Mansour" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.23.88" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-05 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="prime ducks (4am crack).dsk" size="143360" crc="7eec8773" sha1="35e17dacfb9d87b68a290aa503464baebc01b285" />
+ <rom name="print your own bingo plus (4am crack).dsk" size="143360" crc="09c2e5af" sha1="7cc963fe89ef2683ef3b62a469e153a944ef97f6"/>
</dataarea>
</part>
</software>
@@ -51136,8 +47299,8 @@ license:CC0-1.0
<info name="programmer" value="Stuart Aronoff" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--sports game-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Master" />
<dataarea name="flop" size="143360">
@@ -51152,17 +47315,118 @@ license:CC0-1.0
</part>
</software>
+ <software name="probability">
+ <description>Probability (A-821 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-821" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-11 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a821 probability v1.0 (4am crack).dsk" size="143360" crc="de1ff340" sha1="d1f08ed1e6c6c1274f4fad580ca95fae09638432" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="problab_525">
+ <description>Probability Lab (A-262 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-262" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a262 probability lab v1.0 (4am crack).dsk" size="143360" crc="b1e5ce58" sha1="55d16a85d170588fbcbd5ec46c41021bfd495ad8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="psialge">
+ <description>Problem Solving in Algebra (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="EduSystems" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="problem solving in algebra (4am crack) disk 1.dsk" size="143360" crc="03cc98f1" sha1="5128aaffc6d85ed1597bf4efe9c520aef9cf25c4"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="problem solving in algebra (4am crack) disk 2.dsk" size="143360" crc="dd40b065" sha1="ab1ced8fcfeea82e6186375bc328c7a6166bfc54"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="problem solving in algebra (4am crack) disk 3.dsk" size="143360" crc="d642c5b6" sha1="275fd1d0045fd79ac63965207f7c12d4d825ca90"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="problem solving in algebra (4am crack) disk 4.dsk" size="143360" crc="bd7bf5e3" sha1="9580a8a274b919060dcec49aa56182b4ca8a396a"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5"/>
+ <dataarea name="flop" size="143360">
+ <rom name="problem solving in algebra (4am crack) disk 5.dsk" size="143360" crc="16dba183" sha1="8f7da0dd662480d7a57dfb593aa83c82d1f0c98c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="probsnim_525">
+ <description>Problem-Solving with Nim (A-257 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-257" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a257 problem solving with nim v1.0 (4am crack).dsk" size="143360" crc="f6827911" sha1="49713c1b031d32e83c9434ae6a9daacd3535ebfb"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="probslvs10" cloneof="probslvs">
<description>Problem-Solving Strategies (A-784 version 1.0) (4am crack)</description>
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-784" />
- <info name="programmer" value="Lois Edwards and Russ Erickson" />
+ <info name="programmer" value="Lois Edwards" />
+ <info name="programmer" value="Russ Erickson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-29-->
- <!--education program-->
+ <!-- Dump released: 2021-03-29 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a784 problem solving strategies v1.0 (4am crack).dsk" size="143360" crc="ae4c0ffb" sha1="cd51d2073660a4746a91e65d3800d2c7ef102cd6"/>
@@ -51175,13 +47439,14 @@ license:CC0-1.0
<year>1984</year>
<publisher>MECC</publisher>
<info name="partno" value="H-103" />
- <info name="programmer" value="Lois Edwards and Russ Erickson" />
+ <info name="programmer" value="Lois Edwards" />
+ <info name="programmer" value="Russ Erickson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0-1984.09.25" />
- <!--This version was released under vendor ID H-103, version 1.0, dated 1984-09-25 according to embedded program comments.-->
+ <!-- This version was released under vendor ID H-103, version 1.0, dated 1984-09-25 according to embedded program comments. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-h103 problem-solving strategies v1.0-1984.09.25 (4am crack).dsk" size="143360" crc="fe6be0a0" sha1="84cf12b55d7484df3a847e7c036aaddcd0f0a186" />
@@ -51194,12 +47459,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-784" />
- <info name="programmer" value="Lois Edwards and Russ Erickson" />
+ <info name="programmer" value="Lois Edwards" />
+ <info name="programmer" value="Russ Erickson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-29-->
- <!--education program-->
+ <!-- Dump released: 2021-03-29 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a784 problem-solving strategies v1.3 (4am crack).dsk" size="143360" crc="d5a3f0cc" sha1="a44c34859e439c01e3895e11d57d927a1ca1c687"/>
@@ -51207,17 +47473,37 @@ license:CC0-1.0
</part>
</software>
+ <software name="procword">
+ <description>Processing Words (A-813 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-813" />
+ <info name="programmer" value="Jeff Jorgensen" />
+ <info name="programmer" value="Dan Pelowski" />
+ <info name="programmer" value="Wendell Ruotsi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a813 processing words v1.0 (4am crack).dsk" size="143360" crc="68b391fe" sha1="848aee2a6c0c894fae7eb891f63839ab4e2ecf43"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="stdisdolf" >
<description>Profession Détective: Qui a volé Lily (French) (4am crack)</description>
- <!--French version of Snooper Troops 2: The case of: The Disappearing Dolphin-->
+ <!-- French version of Snooper Troops 2: The case of: The Disappearing Dolphin -->
<year>1984</year>
<publisher>Ediciel</publisher>
<info name="alt_title" value="Snooper Troops 2: The case of: The Disappearing Dolphin"/>
<info name="developer" value="Tom Snyder Productions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-30-->
- <!--adventure game-->
+ <!-- Dump released: 2022-06-30 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="profession detective- qui a vole lily (4am crack).dsk" size="143360" crc="c53b5f2c" sha1="2da07c366d09327c09eab7ea93fe7b1b31ce0fbd"/>
@@ -51225,16 +47511,39 @@ license:CC0-1.0
</part>
</software>
+ <software name="protgolf">
+ <description>Professional Tour Golf (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Henry L. Richbourg" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-12 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master Disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="professional tour golf (4am and san inc crack) side a - master disk.dsk" size="143360" crc="945c18e8" sha1="680d062a0313bd9abc1f42d2742690eb6c5b85e3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Player Disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="professional tour golf (4am and san inc crack) side b - player disk.dsk" size="143360" crc="e412e247" sha1="486a79d6a1bde19cd1794971d8cffdf20812c3ad" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="projcirc">
<description>Projectile and Circular Motion (4am crack)</description>
<year>1984</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="developer" value="Educational Materials and Equipment" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-05-->
- <!--educational program-->
+ <!-- Dump released: 2021-06-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="projectile and circular motion (4am crack).dsk" size="143360" crc="4074b3dd" sha1="95e35ca175c0f02221a9f2a9d413bbcc40e11c42"/>
@@ -51242,15 +47551,81 @@ license:CC0-1.0
</part>
</software>
+ <software name="mpronoun1r1" cloneof="mpronoun1">
+ <description>Pronouns I (revision 1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pronouns i (4am crack).dsk" size="143360" crc="3cc45067" sha1="955fb2b826aeaef997788326906167fa8c57b6d2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mpronoun1">
+ <description>Pronouns I (revision 2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This revision fixes bugs and has an updated copy protection. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pronouns i rev. 2 (4am crack).dsk" size="143360" crc="85d199a0" sha1="b4dd139c4f17825a13f5dd762b7bf1a242e59481"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mpronoun2r1" cloneof="mpronoun2">
+ <description>Pronouns II (revision 1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pronouns ii (4am crack).dsk" size="143360" crc="97c171bc" sha1="588e5e0bff9c0268e39875d119daa71186284182" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mpronoun2">
+ <description>Pronouns II (revision 2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This revision fixes bugs and has an updated copy protection. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="pronouns ii rev. 2 (4am crack).dsk" size="143360" crc="e73e4fcb" sha1="b675fac3a52944031b1fa51e884b9e52496ed35c"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="publshng">
<description>Publishing (4am crack)</description>
<year>1983</year>
- <publisher>Queue</publisher>
- <info name="developer" value="Intellectual Software" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-18-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="publishing (4am crack).dsk" size="143360" crc="0d7726d1" sha1="c3467b27b57be00a25ec201302736a86a0a2f288" />
@@ -51262,12 +47637,13 @@ license:CC0-1.0
<description>Punctuation Baseball Level A (version 4.1.5) (4am crack)</description>
<year>1991</year>
<publisher>Gamco Industries</publisher>
- <info name="programmer" value="Gail Williams and Byron Smith" />
+ <info name="programmer" value="Gail Williams" />
+ <info name="programmer" value="Byron Smith" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="4.1.5" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-1-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-1 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -51282,6 +47658,30 @@ license:CC0-1.0
</part>
</software>
+ <software name="puncpon">
+ <description>Punctuation Put-On: Punctuation Processor (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John D. Perron" />
+ <info name="programmer" value="Victoria Hanson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher"/>
+ <dataarea name="flop" size="143360">
+ <rom name="punctuation put-on (4am crack) disk 1 - teacher disk.dsk" size="143360" crc="a786b53a" sha1="c04e5cdb23e03b3b20e7cf216b834fe1d0e8e212" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Student"/>
+ <dataarea name="flop" size="143360">
+ <rom name="punctuation put-on (4am crack) disk 2 - student disk.dsk" size="143360" crc="f9f1a8c3" sha1="09933bbead765a267571ff4a06b24cb95fb67232" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="puncrule">
<description>Punctuation Rules (4am and san inc crack)</description>
<year>1987</year>
@@ -51289,8 +47689,8 @@ license:CC0-1.0
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="punctuation rules (4am and san inc crack).dsk" size="143360" crc="5c56aa3b" sha1="c53c10d1cd464664fa3d328493de56ab84b22d70" />
@@ -51305,8 +47705,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="punctuation- building better language skills (4am crack).dsk" size="143360" crc="0cbc57bf" sha1="e676a7e78f2448c0527c5c4a11ee65c482798897" />
@@ -51319,13 +47719,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>Milton Bradley</publisher>
<info name="alt_title" value="All About Commas" />
- <!--Name printed on disk label-->
+ <!-- Name printed on disk label -->
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ or Apple //e only." />
<sharedfeat name="compatibility" value="A2P, A2E" />
- <!--Due to programming bugs unrelated to copy protection, this program crashes on a 65c02.-->
- <!--Dump released: 2021-11-27-->
- <!--educational program-->
+ <!-- Due to programming bugs unrelated to copy protection, this program crashes on a 65c02. -->
+ <!-- Dump released: 2021-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="punctuation skills- commas (4am crack).dsk" size="143360" crc="80b23835" sha1="58aaef40d5eb61bc08cb574975b340ac118eb835"/>
@@ -51340,8 +47740,8 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="punctuation skills- end marks, semicolon, and colon (4am crack).dsk" size="143360" crc="da9672c2" sha1="1f6fa4a23adf79c6cac39f0af851c1d7f7e76991" />
@@ -51355,8 +47755,8 @@ license:CC0-1.0
<publisher>Springboard Software</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-08-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="puzzle master (4am crack).dsk" size="143360" crc="fc6696a2" sha1="2e8bcde5555028e666b68ba10f2d29d752fac173" />
@@ -51364,16 +47764,183 @@ license:CC0-1.0
</part>
</software>
+ <software name="puzzpost11" cloneof="puzzpost">
+ <description>Puzzles and Posters (A-116 version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-116" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a116 puzzles and posters v1.1 (4am crack).dsk" size="143360" crc="d9721f88" sha1="d4fea3b907a53896befb53787c02e728470e62f6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puzzpost12" cloneof="puzzpost">
+ <description>Puzzles and Posters (A-116 version 1.2) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-116" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a116 puzzles and posters v1.2 (4am crack).dsk" size="143360" crc="e8065d81" sha1="949eac6aeb407155bc3a2b25bf905fdd722afe39" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puzzpost13" cloneof="puzzpost">
+ <description>Puzzles and Posters (A-116 version 1.3) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-116" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a116 puzzles and posters v1.3 (4am crack).dsk" size="143360" crc="d479a5c6" sha1="a5e6034ce85ecb300dc953a8fb176eaf83733b58"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puzzpost">
+ <description>Puzzles and Posters (A-116 version 1.6) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-116" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.6" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a116 puzzles and posters v1.6 (4am crack).dsk" size="143360" crc="e6cf894b" sha1="603850fd85b0a828d373f3a46e4a0629fc5da5cf"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puzltnks">
+ <description>Puzzle Tanks: A Game of Numbers and Logic (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="puzzle tanks (4am crack).dsk" size="143360" crc="3593a3b6" sha1="f5a972a30fba6c8bec4580f5a9eedaeddeef0ea6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quations">
+ <description>Quations: The Crossmath Game (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="author" value="Andrew P. Mandell" />
+ <info name="developer" value="Edaptive Software" />
+ <info name="programmer" value="Bernie Dodge" />
+ <info name="programmer" value="Steven Buss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="quations (4am crack) side a.dsk" size="143360" crc="db6035e3" sha1="f7d4eb95e219d66b719238e9f680769a42b04fa5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="quations (4am crack) side b.dsk" size="143360" crc="3c15c7fe" sha1="e755a62e6ea9496fe4bff7a03d1f72870add4585" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qohearts">
+ <description>Queen of Hearts (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Lyon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="queen of hearts (4am and san inc crack).dsk" size="143360" crc="f43b97d1" sha1="734d5be5b71280d381f41b2c6d159305ac242665" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quenbigc">
+ <description>Quentin Visits The Big City (4am crack)</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="quentin visits the big city (4am crack) disk 1a.dsk" size="143360" crc="5c11de98" sha1="4cb7c2016bf64c90a6b3cfd0040c5c76a23a70ff"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="quentin visits the big city (4am crack) disk 1b.dsk" size="143360" crc="61cc85b5" sha1="796b926827d11ea9efdacc2241d31899f897bd4d"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="quentin visits the big city (4am crack) disk 2a.dsk" size="143360" crc="8233b926" sha1="22bb1fa1f94d9823f04e393acde8be1881091259"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="quentin visits the big city (4am crack) disk 2b.dsk" size="143360" crc="dd52214a" sha1="63d6f6e34b41fb532f2f98d40c44be1c0d6c4495"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="qpspmanb258" cloneof="qpspman">
<description>Questprobe featuring Spider-Man (version B-258) (4am crack)</description>
<year>1985</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Mak Jukic and Scott Adams" />
+ <info name="programmer" value="Mak Jukic" />
+ <info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="B-258" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-05-02-->
- <!--adventure game-->
+ <!-- Dump released: 2024-05-02 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -51392,12 +47959,13 @@ license:CC0-1.0
<description>Questprobe featuring Spider-Man (version F-261) (4am crack)</description>
<year>1985</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Mak Jukic and Scott Adams" />
+ <info name="programmer" value="Mak Jukic" />
+ <info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="F-261" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-05-02-->
- <!--adventure game-->
+ <!-- Dump released: 2024-05-02 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -51416,12 +47984,15 @@ license:CC0-1.0
<description>Questprobe featuring The Hulk (version 2.3/127) (4am crack)</description>
<year>1984</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Scott Adams, John Romita Sr., Mark Gruenwald, Kem McNair, Scott Smith, John Byrne, and Bob Budiansky" />
+ <info name="author" value="Bob Budiansky" />
+ <info name="author" value="John Lindley Byrne" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="programmer" value="Scott Smith" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.3/127" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-05-03-->
- <!--adventure game-->
+ <!-- Dump released: 2018-05-03 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -51436,6 +48007,74 @@ license:CC0-1.0
</part>
</software>
+ <software name="questron">
+ <description>Questron (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charles Dougherty" />
+ <info name="programmer" value="Gerald Wieczorek" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-16 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Character Disk (Boot disk)"/>
+ <dataarea name="flop" size="143360">
+ <rom name="questron (4am crack) character disk (boot).dsk" size="143360" crc="a5883c8c" sha1="e0808ea101c1211bd8cb072d1452427dfcb0a37b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Game disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="questron (4am crack) game disk 1.dsk" size="143360" crc="a8655b0b" sha1="cec363e8a31984cf6edc5465244f0a2b15c3c878" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Game disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="questron (4am crack) game disk 2.dsk" size="143360" crc="b7229e6c" sha1="0bcb289ad32930e6e7313f1a73d1ab0c3f4450b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quickfl">
+ <description>Quickflash! (A-167 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-167" />
+ <info name="programmer" value="Michael Hartman" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Pual Wenker" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a167 quickflash v1.0 (4am crack).dsk" size="143360" crc="d8e44581" sha1="3d7d00f57b770a8bef98dcb2ca59af3f7b383071"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quink">
+ <description>Quink (Thunder Mountain) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="developer" value="Ron Dubren and Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-02 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="quink (thunder mountain) (4am crack).dsk" size="143360" crc="ba0f7c90" sha1="8c828abc8ebdef6fa4a47a385ee40d4bc1c3d1e1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="quizcstl">
<description>Quiz Castle (4am crack)</description>
<year>1986</year>
@@ -51443,8 +48082,8 @@ license:CC0-1.0
<info name="programmer" value="Jeffrey Jones" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-01-->
- <!--educational program-->
+ <!-- Dump released: 2019-09-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -51465,10 +48104,10 @@ license:CC0-1.0
<publisher>Springboard Software</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 0" />
- <!--Contains spelling and grammatical errors that were corrected in a later version.-->
+ <!-- Contains spelling and grammatical errors that were corrected in a later version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--board game-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A" />
<dataarea name="flop" size="143360">
@@ -51502,8 +48141,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-02-->
- <!--board game-->
+ <!-- Dump released: 2021-04-02 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
<dataarea name="flop" size="143360">
@@ -51530,15 +48169,102 @@ license:CC0-1.0
</part>
</software>
+ <software name="rabrobmk">
+ <description>Rabbits, Robots, and a Monkey 1 (version 12.31.90) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="12.31.90" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-06-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 1.dsk" size="143360" crc="264a2f9a" sha1="68403191afdd1af837443a6e037ac9c48be3d810" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 2.dsk" size="143360" crc="ea11ed4d" sha1="7b1bc9ab192ce8446c5d39844be33851cb3ae7be" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 3.dsk" size="143360" crc="ab802f81" sha1="2e3ee038325c0451f112acf1adfd8bac591582ec" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 4 side a.dsk" size="143360" crc="ab2783b6" sha1="4084d3431e329671d2151b24df328379d64bc1a2" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 4 side b.dsk" size="143360" crc="8896e26c" sha1="c9f25da4d00556fbd49d48d06fffaea04740d71e" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 5 side a.dsk" size="143360" crc="f1934c1c" sha1="4a56d970d6f363a90d9b82603b3023ded28238d0" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rabbits, robots, and a monkey 1 (4am crack) disk 5 side b.dsk" size="143360" crc="8896e26c" sha1="c9f25da4d00556fbd49d48d06fffaea04740d71e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="racecarr">
+ <description>Race Car 'Rithmetic (4am crack)</description>
+ <year>1983</year>
+ <publisher>Unicorn Software Company</publisher>
+ <info name="programmer" value="June S. Stark" />
+ <info name="programmer" value="David Flatman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="race car 'rithmetic (4am crack).dsk" size="143360" crc="136fcd47" sha1="3f3a4a5d9465366a22a1e01fc5d0b771f57be7b1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="racekeys">
+ <description>Race Car Keys (4am crack)</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Brenna Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="race car keys (4am crack).dsk" size="143360" crc="ae68c7c6" sha1="69dca0d7e57edb59fadde9c6da482d045558c19f"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="raceclck">
<description>Race the Clock (4am crack)</description>
<year>1984</year>
<publisher>Mindplay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-11-->
- <!--educational game-->
+ <!-- Dump released: 2017-11-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="race the clock (4am crack).dsk" size="143360" crc="3f5911f1" sha1="4866942789c05e52f84f92a5857622d87dee5787" />
@@ -51546,14 +48272,81 @@ license:CC0-1.0
</part>
</software>
+ <software name="racter">
+ <description>Racter (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="INRAC Corp" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-12-07 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="racter (4am crack).dsk" size="143360" crc="4a8d1fdf" sha1="338edfaf156b86b09a1e46a20b359097f23bf9ad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="radwarr">
+ <description>Rad Warrior (4am crack)</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Stanley Schembri" />
+ <info name="programmer" value="Daniel Malone" />
+ <info name="programmer" value="Craig Seastrom" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rad warrior (4am crack).dsk" size="143360" crc="7291bacf" sha1="89e3ff2f25b33b09a8410fcbcd1b38671d16c4dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="railwest">
+ <description>Rails West! (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Martin C. Campion" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rails west (4am and san inc crack).dsk" size="143360" crc="1b18e149" sha1="f9f40dfc1995d751f67c1f8671aef56ae2c927a3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rnbkeyb">
+ <description>Rainbow Keyboarding (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Trisha Adkins Ainsa, Ph.D." />
+ <info name="programmer" value="Rick Thompson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rainbow keyboarding (4am crack).dsk" size="143360" crc="546effd2" sha1="623fdadbb0685b6e2de8676dde841966d2a11771" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rbowpaint">
<description>Rainbow Painter (4am crack)</description>
<year>1984</year>
<publisher>Springboard Software</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rainbow painter (4am crack).dsk" size="143360" crc="b888cdc1" sha1="243cb545ccdb3961bdd35d9cbd407f818792b2c5" />
@@ -51561,6 +48354,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="rainydg">
+ <description>Rainy Day Games (version 13501) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="David Walker" />
+ <info name="developer" value="Baudville" />
+ <info name="partno" value="13501" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="13501" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-29 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rainy day games (4am crack).dsk" size="143360" crc="50b78018" sha1="2d03e73d475f3ab54ec98b2e22dc7b04fa7a52d5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambop2">
+ <description>Rambo: First Blood Part II (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires an 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-21 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rambo first blood part ii (4am crack).dsk" size="143360" crc="81d373ce" sha1="811d257c3a20f6af54eb4e0c88d65fe90c1afed1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rastrhome">
<description>Rascal Takes A Ride Home (4am crack)</description>
<year>1993</year>
@@ -51568,8 +48396,8 @@ license:CC0-1.0
<info name="developer" value="Software Connections" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rascal takes a ride home (4am crack).dsk" size="143360" crc="be125025" sha1="c4d998041c7f0e0d1ad52439792ff7be5d2c28be" />
@@ -51584,8 +48412,8 @@ license:CC0-1.0
<info name="developer" value="Software Connections" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rascal takes a ride to school (4am crack).dsk" size="143360" crc="9cbdc4c2" sha1="d45289e9628caae349a29714ce293e812eb1ccf3" />
@@ -51600,9 +48428,9 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ only." />
<sharedfeat name="compatibility" value="A2P" />
- <!--Due to programming bugs unrelated to copy protection, this program fails to run on any Apple //e or later.-->
- <!--Dump released: 2021-04-28-->
- <!--educational program-->
+ <!-- Due to programming bugs unrelated to copy protection, this program fails to run on any Apple //e or later. -->
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="ratios and proportions (4am crack).dsk" size="143360" crc="e0222fb9" sha1="38d541db226104517918e14a6f512fc70bc63860"/>
@@ -51618,8 +48446,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="ray tracing v1.0 (4am crack).dsk" size="143360" crc="1bff99b4" sha1="ae8d2b7a8c87356edb2d7ea5811d166b263e33a4" />
@@ -51631,11 +48459,12 @@ license:CC0-1.0
<description>Read &amp; Rhyme (4am crack)</description>
<year>1986</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Andrew Bagdanov and June Stark" />
+ <info name="programmer" value="Andrew Bagdanov" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="read and rhyme (4am crack).dsk" size="143360" crc="5d744b0e" sha1="5f6e7c0a491a1fd6325f79455f226e767fd91dc3" />
@@ -51643,6 +48472,191 @@ license:CC0-1.0
</part>
</software>
+ <software name="readnroll10" cloneof="readnroll">
+ <description>Read 'N Roll (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="L. X. Savain" />
+ <info name="programmer" value="T. S. DeBry" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll (4am crack) disk 1 side a.dsk" size="143360" crc="b1965ccf" sha1="8a69356c8aa6391e13e61e0799469e2070cf8cfc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll (4am crack) disk 1 side b.dsk" size="143360" crc="a5bd3abf" sha1="b19aee06c977cc539611f65891fc84c495249526" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll (4am crack) disk 2 side a.dsk" size="143360" crc="8d93a04c" sha1="4421118d6ae7fd70544bc2b88ae9d7c6799202a4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll (4am crack) disk 2 side b.dsk" size="143360" crc="9311bab7" sha1="7654f674cd76957fbd2da49da315083b7d6770ee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readnroll11_525" cloneof="readnroll">
+ <description>Read 'N Roll (version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="L. X. Savain" />
+ <info name="programmer" value="T. S. DeBry" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll 1.1 (4am crack) disk 1 side a.dsk" size="143360" crc="febe11fe" sha1="4f41d21258772b3227c961a3488407f5724614d2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll 1.1 (4am crack) disk 1 side b.dsk" size="143360" crc="68179878" sha1="89c89244f86fcb4b6ff1c1bc7c095fcdb2977dd5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll 1.1 (4am crack) disk 2 side a.dsk" size="143360" crc="ba985d95" sha1="40f789b8cf380005ac702f68f103296531a08a10" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="read n roll 1.1 (4am crack) disk 2 side b.dsk" size="143360" crc="f2d2e19b" sha1="50c1a4e20c5ec9ae45d70b7643004464631e0a7c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readnroll">
+ <description>Read 'N Roll (version 1.1) (800K 3.5") (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="L. X. Savain" />
+ <info name="programmer" value="T. S. DeBry" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="read n roll 800k 1.1 (4am crack).2mg" size="819264" crc="735624d3" sha1="072718512aa329667b1a97940aad95d630b48f0c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="raskncst">
+ <description>Read and Spell: In the Days of Knights and Castles (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Ann Simpson" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="read and spell - in the days of knights and castles (4am crack) disk 1.dsk" size="143360" crc="8ef5e83a" sha1="5f3118bfae9d3e672f1df0f911e1e6d8dcab298b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="read and spell - in the days of knights and castles (4am crack) disk 2.dsk" size="143360" crc="dcd2163b" sha1="0a74ec12ff2e432c84e214784fb2a3d72afcafba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit10" cloneof="rrabbit">
+ <description>Reader Rabbit (version 1.0) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reader rabbit v1.0 (4am and san inc crack).dsk" size="143360" crc="9033d75d" sha1="fd19516c3a995ed96026e0463030ce6028c07d47"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit11" cloneof="rrabbit">
+ <description>Reader Rabbit (version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reader rabbit 1.1 (4am crack).dsk" size="143360" crc="e25f8fa9" sha1="2497899e46ed5243707fb1e2e4c0ba1c00fb9aa0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit">
+ <description>Reader Rabbit (version 1.3) (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reader rabbit 1.3 (4am crack).dsk" size="143360" crc="6a1d7564" sha1="75963345129602717b02f8554bd8e759d5d44d4b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rdtrchst">
<description>Reader's Treasure Chest: Level One (4am crack)</description>
<year>1987</year>
@@ -51650,8 +48664,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="reader's treasure chest- level 1 (4am crack).dsk" size="143360" crc="59a743a2" sha1="eeee78dcd2ca8ba94dda4dee207a1deac2ad4a7c" />
@@ -51659,15 +48673,78 @@ license:CC0-1.0
</part>
</software>
+ <software name="readadv1">
+ <description>Reading Adventure 1 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reading adventure 1 (4am crack).dsk" size="143360" crc="e8446113" sha1="5411b6da101eb13095efb00e98fd502852f4c9c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readandme">
+ <description>Reading and Me (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="developer" value="Davidson &amp; Associates" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading and me (4am crack) side a.dsk" size="143360" crc="a709e079" sha1="66d6ca72378cf0c36f49981f9a05d581784625da" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading and me (4am crack) side b.dsk" size="143360" crc="0df18cdf" sha1="cd299cbbeec30d1921764f9b8582bb83fbbf8571" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rdthink3">
+ <description>Reading and Thinking III (4am crack)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="reading and thinking iii (4am crack) disk 1.dsk" size="143360" crc="d6f40b43" sha1="3e46737ce37f0ae8b49029f7d2f4a341e4dc139f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="reading and thinking iii (4am crack) disk 2.dsk" size="143360" crc="2da50b25" sha1="d96e5f16566d118691fa161d33220bd1cf63fa96" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="orreadcm">
<description>Reading Comprehension (4am crack)</description>
- <!--This is different from Stickybear Reading Comprehension, both by Optimum Resource-->
+ <!-- This is different from Stickybear Reading Comprehension, both by Optimum Resource -->
<year>1986</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-24-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="reading comprehension (4am crack).dsk" size="143360" crc="2e25311a" sha1="adf67e8b96f4035aac2035b0b517221a5fad1307" />
@@ -51682,8 +48759,8 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-08-12-->
- <!--educational program-->
+ <!-- Dump released: 2020-08-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="reading comprehension - main idea and details (4am crack).dsk" size="143360" crc="3298ca6a" sha1="3aba5a667d02ad14decccecca12f6b6b8a1d21b9"/>
@@ -51695,11 +48772,12 @@ license:CC0-1.0
<description>Reading Comprehension: What's Different (4am crack)</description>
<year>1983</year>
<publisher>Program Design</publisher>
- <info name="programmer" value="Jenny Tesar and Frank W. Salamon" />
+ <info name="programmer" value="Jenny Tesar" />
+ <info name="programmer" value="Frank W. Salamon" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-01-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="reading comprehension - what's different (4am crack).dsk" size="143360" crc="d97839ca" sha1="02fbf72ac2891764ed427f21ea755d5bb4f390b4" />
@@ -51707,15 +48785,66 @@ license:CC0-1.0
</part>
</software>
+ <software name="readmngl1">
+ <description>Reading for Meaning: Level 1 (version 03.11.86) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Vera Gierman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="03.11.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading for meaning level 1 (4am crack) disk 1.dsk" size="143360" crc="48d23eec" sha1="b66ed723bcd5eafd86a401471d1a4ff91c6ed749" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading for meaning level 1 (4am crack) disk 2.dsk" size="143360" crc="2ccd7134" sha1="318c8c4d2968d8c27d29d67ea0ed8b6cdcbe0431" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readmngl2">
+ <description>Reading for Meaning: Level 2 (version 03.11.86) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Vera Gierman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="03.11.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-10-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading for meaning 2 (4am crack) side a.dsk" size="143360" crc="b6bef60c" sha1="c78a2bb6b51e63de2d44abddf2d6651c79f3dd95" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading for meaning 2 (4am crack) side b.dsk" size="143360" crc="c3b1e08f" sha1="bed7ba6d2876ee1869e9b546138bb19ff91141ac" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="runatamer">
<description>Reading for Understanding: Native Americans (4am crack)</description>
<year>1993</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Bonnie Seiler, Nancy Patrissi, Millicent Sabater and Thomas Whiting" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Thomas Whiting" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-08-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-08-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="native americans (4am crack).dsk" size="143360" crc="5e56633c" sha1="a5a0b44be0191509f31744b9ca3a1ba53736b863" />
@@ -51723,17 +48852,99 @@ license:CC0-1.0
</part>
</software>
+ <software name="rfbconsnd">
+ <description>Reading Fun: Beginning Consonant Sounds (4am crack)</description>
+ <year>1988</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reading fun - beginning consonant sounds (4am crack).dsk" size="143360" crc="768b9f33" sha1="495b9b914a2c701be58aec1f05638055c54ae439" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rffconsnd">
+ <description>Reading Fun: Final Consonant Sounds (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reading fun - final consonant sounds (4am crack).dsk" size="143360" crc="c523f456" sha1="55030ca3c4d824d36c1054a54b86fade5071c67a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rfvowsnd">
+ <description>Reading Fun: Vowel Sounds (4am crack)</description>
+ <year>1990</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Bernie Gallagher" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reading fun - vowel sounds (4am crack).dsk" size="143360" crc="b3204a4a" sha1="065d1d5e9d09e2d894c413aded2422c62dad8f55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rmljackb">
+ <description>Reading Magic Library: Jack and the Beanstalk (4am crack)</description>
+ <year>1988</year>
+ <publisher>Tom Snyder Productions</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2016-04-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading magic library - jack and the beanstalk (4am crack) side a.dsk" size="143360" crc="1e416db8" sha1="e376def9d99dc80cb6a557dba81bf692b82e089a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="reading magic library - jack and the beanstalk (4am crack) side b.dsk" size="143360" crc="2ba00460" sha1="ef38a4058d01f65baebb06a24f58bf6abdbc356a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rwdistvw">
<description>Reading Workshop: Distant Views (4am crack)</description>
<year>1987</year>
<publisher>Scott, Foresman and Company</publisher>
<info name="developer" value="Learning to Learn Software" />
- <info name="programmer" value="Reid J. Daitzman, Ph.D. and Andrew G. Singer" />
+ <info name="programmer" value="Reid J. Daitzman, Ph.D." />
+ <info name="programmer" value="Andrew G. Singer" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-04. Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-04. Redumped: 2021-08-28 -->
+ <!-- Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -51752,14 +48963,15 @@ license:CC0-1.0
<description>Reading Workshop: Grade 5 (Mindscape) (4am crack)</description>
<year>1986</year>
<publisher>Mindscape</publisher>
- <!--Scott, Foresman and Company-->
+ <!-- Scott, Foresman and Company -->
<info name="alt_title" value="Mindscape School Group's: Reading Workshop: Grade 5" />
<info name="developer" value="Learning to Learn Software" />
- <info name="programmer" value="Reid J. Daitzman, Ph.D. and Andrew G. Singer" />
+ <info name="programmer" value="Reid J. Daitzman, Ph.D." />
+ <info name="programmer" value="Andrew G. Singer" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A"/>
<dataarea name="flop" size="143360">
@@ -51808,14 +49020,15 @@ license:CC0-1.0
<description>Reading Workshop: Grade 6 (Mindscape) (4am crack)</description>
<year>1986</year>
<publisher>Mindscape</publisher>
- <!--Scott, Foresman and Company-->
+ <!-- Scott, Foresman and Company -->
<info name="alt_title" value="Mindscape School Group's: Reading Workshop: Grade 6" />
<info name="developer" value="Learning to Learn Software" />
- <info name="programmer" value="Reid J. Daitzman, Ph.D. and Andrew G. Singer" />
+ <info name="programmer" value="Reid J. Daitzman, Ph.D." />
+ <info name="programmer" value="Andrew G. Singer" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-14-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A" />
<dataarea name="flop" size="143360">
@@ -51865,12 +49078,13 @@ license:CC0-1.0
<year>1987</year>
<publisher>Scott, Foresman and Company</publisher>
<info name="developer" value="Learning to Learn Software" />
- <info name="programmer" value="Reid J. Daitzman, Ph.D. and Andrew G. Singer" />
+ <info name="programmer" value="Reid J. Daitzman, Ph.D." />
+ <info name="programmer" value="Andrew G. Singer" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-23. Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational program-->
+ <!-- Dump released: 2017-09-23. Redumped: 2021-08-28 -->
+ <!-- Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A-1"/>
<dataarea name="flop" size="143360">
@@ -51928,8 +49142,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="real math- level i (4am crack).dsk" size="143360" crc="88a37c6d" sha1="eb5f774021b239a381f97c93b492d2de8a1c0915" />
@@ -51944,8 +49158,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="real math- level ii (4am crack).dsk" size="143360" crc="5e49d348" sha1="619cf9c51d4a9a562d55342382c7050da86bfa7f" />
@@ -51960,8 +49174,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-28-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="real math- level iii (4am crack).dsk" size="143360" crc="3c9c75cf" sha1="f10e2c20d4d037bf0b7e4684ce3a543b62695f9d" />
@@ -51969,15 +49183,16 @@ license:CC0-1.0
</part>
</software>
- <software name="realnums">
- <description>Real Number System (4am crack)</description>
+ <software name="realnums83">
+ <description>Real Number System (version 1983) (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="real number system (4am crack).dsk" size="143360" crc="405c252d" sha1="307a70c24c5078c58c3d1aac5f9ecc9c86fdbfbc" />
@@ -51985,17 +49200,147 @@ license:CC0-1.0
</part>
</software>
+ <software name="rlmimpos">
+ <description>Realm of Impossibility (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="alt_title" value="Zombies" />
+ <info name="original_publisher" value="BRAM" />
+ <info name="author" value="Mike Edwards" />
+ <info name="programmer" value="Marek Popiel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-08 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="realm of impossibility (4am and san inc crack).dsk" size="143360" crc="286d4b70" sha1="57b3df41f19e7dc30bb6f8359b99bce72839f7f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rcchicka">
+ <description>Rebel Charge at Chickamauga (version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="programmer" value="Keith Brors" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-18 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rebel charge at chickamauga (4am crack) side a.dsk" size="143360" crc="4118631c" sha1="004d1d25a4c20a5edbbc201ae4f9b173b7157990" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rebel charge at chickamauga (4am crack) side b.dsk" size="143360" crc="d1976271" sha1="36860382552e7c383d8c6e94bd150b7fd390d5c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rebuswr">
+ <description>Rebus Writer (4am crack)</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="TJ" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rebus writer (4am crack) side a - program.dsk" size="143360" crc="9fdb3d8f" sha1="a8c94406aa0eb42faa3fcf2cc44a2908dcb4682a"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Pictionary disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rebus writer (4am crack) side b - pictionary.dsk" size="143360" crc="d42ae5a3" sha1="ed2f9d42a9e023de2156ee05aa1d4b3f534aef67"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="reforg88">
+ <description>Reforger 88 (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reforger 88 (4am and san inc crack).dsk" size="143360" crc="6c03e8ed" sha1="2cebfa405934799a71eece6c301612c4c9d8b407" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="regroup87" cloneof="regroup">
+ <description>Regrouping (version 1987) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Pearson" />
+ <info name="programmer" value="Andrew Lorenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="regrouping (4am crack).dsk" size="143360" crc="cdb63d14" sha1="fbf68cb451d0d7e1a8c19d37dcba040186705195" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="regroup">
+ <description>Regrouping (version 27-JUN-1989) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Pearson" />
+ <info name="programmer" value="Andrew Lorenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="27-JUN-1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="regrouping 1989 (4am crack).dsk" size="143360" crc="6c46efb9" sha1="3cce01e42790e356980f5e9cdb9961c78905d305" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rendrama">
<description>Rendezvous with Rama (4am crack)</description>
<year>1984</year>
<publisher>Telarium</publisher>
<info name="original_publisher" value="Trillium"/>
- <!--Originally distributed by Trillium, the company changed their name to Telarium after a legal dispute. This is the re-release under the Telarium brand.-->
- <info name="programmer" value="Lee Jacknow, Ronald Martinez, Robert Strong, Lebbeus Woods, Michael P. Meyer, Andre Garneau, David M. Harris, Isaac V. Kerlow, and Jeffrey Schneider" />
+ <!-- Originally distributed by Trillium, the company changed their name to Telarium after a legal dispute. This is the re-release under the Telarium brand. -->
+ <info name="programmer" value="Lee Jacknow" />
+ <info name="programmer" value="Ronald Martinez" />
+ <info name="programmer" value="Robert Strong" />
+ <info name="programmer" value="Lebbeus Woods" />
+ <info name="programmer" value="Michael P. Meyer" />
+ <info name="programmer" value="Andre Garneau" />
+ <info name="programmer" value="David M. Harris" />
+ <info name="programmer" value="Isaac V. Kerlow" />
+ <info name="programmer" value="Jeffrey Schneider" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-07-->
- <!--adventure game-->
+ <!-- Dump released: 2022-07-07 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -52026,11 +49371,19 @@ license:CC0-1.0
<description>Rendezvous with Rama (revision 2) (4am crack)</description>
<year>1984</year>
<publisher>Trillium</publisher>
- <info name="programmer" value="Lee Jacknow, Ronald Martinez, Robert Strong, Lebbeus Woods, Michael P. Meyer, Andre Garneau, David M. Harris, Isaac V. Kerlow, and Jeffrey Schneider" />
+ <info name="programmer" value="Lee Jacknow" />
+ <info name="programmer" value="Ronald Martinez" />
+ <info name="programmer" value="Robert Strong" />
+ <info name="programmer" value="Lebbeus Woods" />
+ <info name="programmer" value="Michael P. Meyer" />
+ <info name="programmer" value="Andre Garneau" />
+ <info name="programmer" value="David M. Harris" />
+ <info name="programmer" value="Isaac V. Kerlow" />
+ <info name="programmer" value="Jeffrey Schneider" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Dump released: 2018-01-04-->
- <!--adventure game-->
+ <!-- Dump released: 2018-01-04 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -52057,14 +49410,48 @@ license:CC0-1.0
</part>
</software>
+ <software name="reptiles">
+ <description>Reptiles (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="reptiles (4am crack).dsk" size="143360" crc="48851d5b" sha1="181c300ad56f9905ec0820fe31494608de0512bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rtnherac">
+ <description>Return of Heracles (Electronic Arts) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="original_publisher" value="Quality Software" />
+ <!-- Electronic Arts re-release -->
+ <info name="programmer" value="Stuart Smith" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="return of heracles (4am and san inc crack).dsk" size="143360" crc="87654cb4" sha1="aa3e9ca5e70e5f5f81ece532b8878e60549b354e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rtrchrlw">
<description>Return to Reading: Charlotte's Web (4am crack)</description>
<year>1986</year>
<publisher>Media Basics</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-12-->
- <!--educational program-->
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading - charlotte's web (4am crack).dsk" size="143360" crc="ab12356c" sha1="54db833d9a271eccd9ab8140a08293fe63d4ae43" />
@@ -52078,8 +49465,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-12-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading- johnny tremain (4am crack).dsk" size="143360" crc="030ce1fb" sha1="49aceb3171a577a1e41c66bf5f1d9d546bca7383"/>
@@ -52092,11 +49479,13 @@ license:CC0-1.0
<year>1983</year>
<publisher>Media Basics</publisher>
<info name="developer" value="Elliot &amp; Fitzpatrick" />
- <info name="programmer" value="Michael DiGennaro, Dr. Dan Kirby, and Dr. Phillip Volpe" />
+ <info name="programmer" value="Michael DiGennaro" />
+ <info name="programmer" value="Dr. Dan Kirby" />
+ <info name="programmer" value="Dr. Phillip Volpe" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-11-->
- <!--educational program-->
+ <!-- Dump released: 2016-04-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading - lord of the flies (4am crack).dsk" size="143360" crc="623b1e4f" sha1="75ccb27e3324cfad976cf2ee0a4ced35fb61869e" />
@@ -52110,8 +49499,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading- the black stallion (4am crack).dsk" size="143360" crc="707082c8" sha1="c07e42d5dea4c94a78d652acb542b548df6b51c9" />
@@ -52125,8 +49514,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-12-22-->
- <!--educational program-->
+ <!-- Dump released: 2021-12-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading- the call of the wild (4am crack).dsk" size="143360" crc="5044a6b5" sha1="58fda8da6d6e459ba5aba446fe412a498cfe4709"/>
@@ -52140,8 +49529,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-12-->
- <!--educational program-->
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading - the hobbit (4am crack).dsk" size="143360" crc="1d14053c" sha1="8b5eb3b0289e90e5b3c70fb8276bf95939671d53" />
@@ -52155,8 +49544,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-13-->
- <!--educational program-->
+ <!-- Dump released: 2016-04-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading - the lion, the witch, and the wardrobe (4am crack).dsk" size="143360" crc="ce093544" sha1="c73b3700ed61ece5b921b1f9f5ec36e824da3fbd" />
@@ -52170,8 +49559,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-12-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading- the red pony (4am crack).dsk" size="143360" crc="0f7f8479" sha1="ef2e06e2246f68d085e221519b632e296c38903b"/>
@@ -52185,8 +49574,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-19-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="to kill a mockingbird (4am crack).dsk" size="143360" crc="de3ba4a2" sha1="9673828663487fa22a69e5228c38731765113c65" />
@@ -52200,8 +49589,8 @@ license:CC0-1.0
<publisher>Media Basics</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-04-12-->
- <!--educational program-->
+ <!-- Dump released: 2016-04-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="return to reading - tom sawyer (4am crack).dsk" size="143360" crc="84520348" sha1="eb205d52af68477d0a796554dfa8d0088c485c22" />
@@ -52216,8 +49605,8 @@ license:CC0-1.0
<info name="programmer" value="Dr. Mark Cross" />
<info name="usage" value="Runs on any Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-07-21-->
- <!--educational program-->
+ <!-- Dump released: 2017-07-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rhymes and riddles (4am crack).dsk" size="143360" crc="2bf86112" sha1="a149609e6d024bf92f81b206f63b3a91e3eb1907" />
@@ -52231,10 +49620,10 @@ license:CC0-1.0
<publisher>Spinnaker Software</publisher>
<info name="programmer" value="Dr. Mark Cross" />
<info name="usage" value="Runs on any Apple ][+ or later." />
- <!--This version has a different copy protection. It's unclear how much the program itself has changed.-->
+ <!-- This version has a different copy protection. It's unclear how much the program itself has changed. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-05-27-->
- <!--educational program-->
+ <!-- Dump released: 2020-05-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rhymes and riddles rev. 2 (4am crack).dsk" size="143360" crc="bd22bb36" sha1="fd4ad4bd87ab03a212e1ae036d9aa665fce6ddf2"/>
@@ -52249,8 +49638,8 @@ license:CC0-1.0
<info name="programmer" value="Ian Polster" />
<info name="usage" value="Requires a 48K Apple ][ or later and Passport MIDI card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-12-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rhythm write (4am crack).dsk" size="143360" crc="7091a77b" sha1="1cd063eee56581c96e433eceddc2ac88303e1a20" />
@@ -52258,16 +49647,252 @@ license:CC0-1.0
</part>
</software>
+ <software name="ricochet">
+ <description>Ricochet (4am crack)</description>
+ <year>1982</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="developer" value="MindToys" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-19 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233482">
+ <rom name="ricochet (4am crack).dsk" size="143360" crc="92311921" sha1="766ad480f576dcc8f56afb848d8be03a2f201ab0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ridmagic">
+ <description>Riddle Magic (4am crack)</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="riddle magic (4am crack) side a.dsk" size="143360" crc="a114c706" sha1="bbdcc2e436ee80df537257c0f2941706d9f61bb2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="riddle magic (4am crack) side b.dsk" size="143360" crc="291eabb6" sha1="b6a7707818472e96b3ab5885a0ec8272009aa11e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rightway">
+ <description>Right of Way (A-115 version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-115" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a115 right of way v1.1 (4am crack).dsk" size="143360" crc="e64255e7" sha1="e0a1ebfb396d9f9a5f99177509d9a6fcf46bc0a6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rgzilfin">
+ <description>Rings of Zilfin (version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Ali Atabeck" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-01 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rings of zilfin (4am crack) disk 1.dsk" size="143360" crc="afd62ca7" sha1="78687b14aa9aae7627b268c9c8b4807a634c555b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rings of zilfin (4am crack) disk 2.dsk" size="143360" crc="f518f2c6" sha1="fef8a883a28c203e8ab8242f25e1c45902e63c72" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="rings of zilfin (4am crack) disk 3.dsk" size="143360" crc="278af922" sha1="c0717ecbd7b4a6c0eb43efed38645644400982f7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rngsseat">
+ <description>Ringside Seat (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Carl Saracini" />
+ <info name="programmer" value="Mark Watts" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ringside seat (4am and san inc crack).dsk" size="143360" crc="623103c4" sha1="32dbc597bb6b4a6b85f20255b52a3efc60807736" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="risk">
+ <description>Risk: The Game of World Conquest (version 1.4) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Leisure Genius</publisher>
+ <info name="developer" value="Casablanca Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-04 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="risk v1.4 (4am crack).dsk" size="143360" crc="49d17549" sha1="05aef425e962d3ada8294e9eb7674446a51bb8cb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadrlyu">
+ <description>Road Rally USA (4am crack)</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="developer" value="Looking Glass Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-27 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="road rally usa (4am crack).dsk" size="143360" crc="b902bb9a" sha1="144eb8a8c38260e941dee211bd1ac0c2eb37d179" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadwar2k10" cloneof="roadwar2k">
+ <description>Roadwar 2000 (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeff A. Johnson" />
+ <info name="programmer" value="Robert Calfee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-18 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar 2000 v1.0 (4am crack) side a.dsk" size="143360" crc="ed978e93" sha1="980a0c17020dbf181d200362d1f6594e7895e745" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar 2000 v1.0 (4am crack) side b.dsk" size="143360" crc="e422b02e" sha1="ca6927807ed6d42158493c30fba86d7d85dc2cd1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadwar2k11" cloneof="roadwar2k">
+ <description>Roadwar 2000 (version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeff A. Johnson" />
+ <info name="programmer" value="Robert Calfee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-15 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar 2000 v1.1 (4am crack) side a.dsk" size="143360" crc="95e5fc48" sha1="637554f6088f0628b7c21d3386f1971e2f5d90ec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar 2000 v1.1 (4am crack) side b.dsk" size="143360" crc="69f2740a" sha1="f30584021385fd44c5b7a38c5a23d05f509f1440" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadwar2k">
+ <description>Roadwar 2000 (version 1.2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeff A. Johnson" />
+ <info name="programmer" value="Robert Calfee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-13 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar 2000 v1.2 (4am crack) side a.dsk" size="143360" crc="ab8817d7" sha1="12c55e34f815593784fcfcbaf2ebef735eb22506" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar 2000 v1.2 (4am crack) side b.dsk" size="143360" crc="69f2740a" sha1="f30584021385fd44c5b7a38c5a23d05f509f1440" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rwareuro">
+ <description>Roadwar Europa (version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-02 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar europa (4am crack) side a.dsk" size="143360" crc="d92c0728" sha1="54409fc98308d05d86b11db1b220bc2bca9297f6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="roadwar europa (4am crack) side b.dsk" size="143360" crc="ef82f537" sha1="b0d84fc300d114d2b1066137ba362d189e9b69cf" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="robomathr1" cloneof="robomath">
<description>RoboMath (revision 1) (4am crack)</description>
<year>1985</year>
<publisher>MindPlay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-16-->
- <!--educational game-->
+ <!-- Dump released: 2015-08-16 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="robomath (4am crack).dsk" size="143360" crc="42c56bc3" sha1="c52cdd378d43185759ba12653b89c2d57c1a3dcf" />
@@ -52280,12 +49905,12 @@ license:CC0-1.0
<year>1985</year>
<publisher>MindPlay</publisher>
<info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This version has significant differences on multiple tracks than any other version.-->
+ <!-- This version has significant differences on multiple tracks than any other version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-15-->
- <!--educational game-->
+ <!-- Dump released: 2017-10-15 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="robomath rev. 2 (4am crack).dsk" size="143360" crc="89c41e46" sha1="77f59354538ff629739f18e637e39cffbb2fb7e2" />
@@ -52293,15 +49918,259 @@ license:CC0-1.0
</part>
</software>
+ <software name="robotody11" cloneof="robotody">
+ <description>Robot Odyssey I (version 1.1) (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Mike Wallace" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Robotropolis"/>
+ <dataarea name="flop" size="143360">
+ <rom name="robot odyssey v1.1 (4am crack) side a.dsk" size="143360" crc="d96283f8" sha1="52214d4fcecb40ec7960085cccc1ccac564ad016" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Innovation lab and tutorials"/>
+ <dataarea name="flop" size="143360">
+ <rom name="robot odyssey v1.1 (4am crack) side b.dsk" size="143360" crc="ee94e4e3" sha1="de4a3c2fca987603d3e52fe84b3395fe505def14" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotody">
+ <description>Robot Odyssey I (version 2.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Mike Wallace" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-05-27. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Robotropolis"/>
+ <dataarea name="flop" size="143360">
+ <rom name="robot odyssey i v2.0 (4am crack) disk a.dsk" size="143360" crc="0e720569" sha1="20e555fb142a45ea1398f6efda235300c51a185b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Robotropolis preview, chip designs, innovation lab, and chip library"/>
+ <dataarea name="flop" size="143360">
+ <rom name="robot odyssey i v2.0 (4am crack) disk b.dsk" size="143360" crc="8f85fec4" sha1="c80fe32f89539a6d617d9be92bc08bc63d1f9dac" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C - Robot anatomy, robot wiring, sensors, the toolkit, robot circuits, and robot teamwork"/>
+ <dataarea name="flop" size="143360">
+ <rom name="robot odyssey i v2.0 (4am crack) disk c.dsk" size="143360" crc="11152a8d" sha1="7a23f63b20545eeb0865d436f91b8504f745844f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotrsc">
+ <description>Robot Rascals (4am and san inc crack)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Dan Bunten" />
+ <info name="author" value="Mark McElroy" />
+ <info name="programmer" value="Mark Botner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="robot rascals (4am and san inc crack).dsk" size="143360" crc="f703ec95" sha1="0b4e4c1277864ab8cbb2dcf9ec61870fc74b3fe5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotron">
+ <description>Robotron: 2084 (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-06 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="robotron 2084 (4am crack).dsk" size="143360" crc="27169b1b" sha1="29b874d077815e4e5e7c69cfc88a23b15b417fc5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robtdawn">
+ <description>Robots of Dawn (4am crack)</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Jon Leupp" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-11 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="robots of dawn (4am crack).dsk" size="143360" crc="e283c525" sha1="7eb8af7214c84c646654d19af9369c7dc1e4af5f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rcktfcty_525">
+ <description>Rocket Factory (A-308 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-308" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a308 rocket factory v1.0 (4am crack).dsk" size="143360" crc="a791cb46" sha1="56009fa88b3f7839db8ba93c2bb4a9c09a5fc234"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rboots10e" cloneof="rboots">
+ <description>Rocky's Boots (version 1.0 earlier) (4am crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0 earlier" />
+ <!-- Has a loading screen, different title page, and loads much slower. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rocky's boots v1.0 (4am crack).dsk" size="143360" crc="e28b2eb2" sha1="23fdc8a39a9555137d8a71f76c92d112ad3d2dd4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rboots10l" cloneof="rboots">
+ <description>Rocky's Boots (version 1.0 later) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0 later" />
+ <!-- Has a different title page and loads much faster. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rocky's boots 1982 (4am and san inc crack).dsk" size="143360" crc="887947a7" sha1="4e3bdda73af0c1069a768a64f32754556c40d223"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rboots">
+ <description>Rocky's Boots (version 4.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="4.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-01. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rocky's boots 4.0 (4am crack).dsk" size="143360" crc="2fcb648a" sha1="e6dffa75930aba8c4d97a5929be444c3ef8beee6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rootsaff091487" cloneof="rootsaff">
+ <description>Roots/Affixes 1 (version 09.14.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.14.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-22 -->
+ <!-- educational program -->
+ <!-- may be missing disk 2 -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="roots-affixes 1 v09.14.87 (4am crack).dsk" size="143360" crc="07ef6108" sha1="e63386e64c11f3e99f88f95ec257369ba2d1e533" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rootsaff">
+ <description>Roots/Affixes (version 09.19.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.19.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="roots-affixes v09.19.89 (4am crack) disk 1.dsk" size="143360" crc="c66c287a" sha1="d1b4981e07fd322713774ce2d6f74572b32235e2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="roots-affixes v09.19.89 (4am crack) disk 2.dsk" size="143360" crc="3f35ed0c" sha1="39c78074301c09e8a09e5d9f148b129e4bd6143f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rndupdwn">
+ <description>Round Up, Round Down (4am crack)</description>
+ <year>1985</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="round up, round down (4am crack).dsk" size="143360" crc="64a265b0" sha1="0c7d2407531d96dd5aed0a248523f34a51cfa7ad" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rndestim">
- <description>Rounding and Estimation (4am crach)</description>
+ <description>Rounding and Estimation (4am crack)</description>
<year>1983</year>
<publisher>Queue</publisher>
<info name="developer" value="Intellectual Software" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-07-13-->
- <!--educational program-->
+ <!-- Dump released: 2020-07-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="rounding and estimation (4am crack).dsk" size="143360" crc="8e40827e" sha1="7f61b9a5e84d2799055469e945b91fc438d161af"/>
@@ -52313,11 +50182,12 @@ license:CC0-1.0
<description>Run For It (4am crack)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-13-->
- <!--action game-->
+ <!-- Dump released: 2018-10-13 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="run for it (4am and san inc crack).dsk" size="143360" crc="c80cbb82" sha1="55b6ae2ad779d3881c5e413822756a180d0185cc" />
@@ -52329,12 +50199,13 @@ license:CC0-1.0
<description>Run Your Own Train (revision 1) (4am crack)</description>
<year>1987</year>
<publisher>Abracadata</publisher>
- <info name="programmer" value="Don Fudge, Mary Carol Smith" />
+ <info name="programmer" value="Don Fudge" />
+ <info name="programmer" value="Mary Carol Smith" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-17-->
- <!--simulation program-->
+ <!-- Dump released: 2017-05-17 -->
+ <!-- simulation program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="143360">
@@ -52359,13 +50230,14 @@ license:CC0-1.0
<description>Run Your Own Train (revision 2) (4am crack)</description>
<year>1987</year>
<publisher>Abracadata</publisher>
- <info name="programmer" value="Don Fudge, Mary Carol Smith" />
+ <info name="programmer" value="Don Fudge" />
+ <info name="programmer" value="Mary Carol Smith" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--unspecified changes in files HELLO, MOUSE, X, RTC, RYOT, and RASM-->
+ <!-- unspecified changes in files HELLO, MOUSE, X, RTC, RYOT, and RASM -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-16-->
- <!--simulation program-->
+ <!-- Dump released: 2023-09-16 -->
+ <!-- simulation program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="143360">
@@ -52380,6 +50252,160 @@ license:CC0-1.0
</part>
</software>
+ <software name="rmplstsk">
+ <description>Rumpelstiltskin (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="rumpelstiltskin (4am crack).dsk" size="143360" crc="a8a38ab7" sha1="2a7f24d937761715ce9c517632b6c6c35141cc94" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssisalge">
+ <description>SAT Score Improvement System: Algebra (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="developer" value="Arrow Instructional Systems" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - algebra (4am crack).dsk" size="143360" crc="0970f773" sha1="adbd341be774bab2abacf46154c7f3e93e0b58f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssisgeom">
+ <description>SAT Score Improvement System: Geometry (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="developer" value="Arrow Instructional Systems" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - geometry (4am crack) side a.dsk" size="143360" crc="1546dc51" sha1="307be3502073a328af0fe443b38eb6f13625c97d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - geometry (4am crack) side b.dsk" size="143360" crc="cceba950" sha1="849cf06f184eb32940a81426537bc86a3a3916f3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssisqucom">
+ <description>SAT Score Improvement System: Quantitative Comparisons and Word Problems (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="developer" value="Arrow Instructional Systems" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - quantitative comparisons (4am crack) side a.dsk" size="143360" crc="71885927" sha1="90a4b3002c5416803dc189868986dcf7995af0ce" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - quantitative comparisons (4am crack) side b.dsk" size="143360" crc="c32f2154" sha1="2796b3280aee07aec39c3072aabd4e7ebe459460" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssisrdcom">
+ <description>SAT Score Improvement System: Reading Comprehension (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="developer" value="Arrow Instructional Systems" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - reading comprehension (4am crack).dsk" size="143360" crc="9769462e" sha1="8da44b87e307b1ee657ffaa20659b8e8a30436cb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssisvoc">
+ <description>SAT Score Improvement System: Vocabulary (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="developer" value="Arrow Instructional Systems" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - vocabulary (4am crack) side a.dsk" size="143360" crc="a15b2691" sha1="15fc150eed3026dd07ed3edf32dac12227b3e83b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sat score improvement system - vocabulary (4am crack) side b.dsk" size="143360" crc="73f2e5b1" sha1="093e08fa9679f7ff0de8b4ac0e9bd43c659bee3d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sspsai85" cloneof="sspsai">
+ <description>Safari Search: Problem Solving and Inference (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="safari search (4am crack).dsk" size="143360" crc="aeab8d5e" sha1="f317cee59c075c623a584025a82a119bfda9ca23" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sspsai">
+ <description>Safari Search (version 1987.08.24) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987.08.24" />
+ <!-- This version, dated 1987-08-24 in source code comments, fixes several bugs in the KITTENS program. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="safari search v1987.08.24 (4am crack).dsk" size="143360" crc="0e120d75" sha1="b411bcbc6e535519781498fe1aa816d10b4ed6a6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sailstpr">
<description>Sailing Through Story Problems (4am crack)</description>
<year>1987</year>
@@ -52387,8 +50413,8 @@ license:CC0-1.0
<info name="developer" value="Neosoft" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-16-->
- <!--educational program-->
+ <!-- Dump released: 2015-09-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -52403,6 +50429,311 @@ license:CC0-1.0
</part>
</software>
+ <software name="saltyou">
+ <description>Salt and You (A-127 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-127" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a127 salt and you v1.0 (4am crack).dsk" size="143360" crc="1194d56a" sha1="5323eed0ba08cf9cd002d83713c8e8c85764190d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sammyltf">
+ <description>Sammy Lightfoot (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Warren Schwader" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sammy lightfoot (4am crack).dsk" size="143360" crc="afbef357" sha1="b0ae2cc0e8279c7bf6f35f3ed88659a9f697f18a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sargon3">
+ <description>Sargon III (revision 2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hayden Software</publisher>
+ <info name="programmer" value="Dan Spracklen" />
+ <info name="programmer" value="Kathe Spracklen" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Title page does not list Hayden Book Company and includes Great Games disk. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-17 -->
+ <!-- chess game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sargon iii (hayden) (4am crack) side a - program.dsk" size="143360" crc="73ff040a" sha1="2400bc73ee4f7752f07bc871b5d67bddd84bb781"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Great Games and Chess Problems"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sargon iii (hayden) (4am crack) side b - great games.dsk" size="143360" crc="a28d8935" sha1="2a4dca4e13608380d8c13f530dc435558a103cf8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="schlread">
+ <description>Scholastic Reading Comprehension (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="release" value="2016-09-03"/>
+ <info name="programmer" value="Michael Sweet" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-17 -->
+ <!-- educational program -->
+ <!-- Passages Disk Level D strongly implies the existence of other disks we don't have. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scholastic reading comprehension (4am crack) disk 1 - program.dsk" size="143360" crc="0707cd5b" sha1="2ed2cf156ec7e319527d39ae53ad43266eeb5573" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Utilities"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scholastic reading comprehension (4am crack) disk 2 - utilities.dsk" size="143360" crc="974f81de" sha1="13d1db1f1c43628720bbaa0caa6cef8e81aacfc4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Passage disk level D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scholastic reading comprehension (4am crack) passage disk level d.dsk" size="143360" crc="11a3c03d" sha1="2e1d872574d0697e4aad11effe28e5ed71dd8bb6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suv2read">
+ <description>School Utilities Volume 2: Readability (A-749 version 1.3) (4am crack)</description>
+ <year>1982</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-749" />
+ <info name="programmer" value="A. McCarthy" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a749 school utilities volume 2 - readability v1.3 (4am crack).dsk" size="143360" crc="eb9fc421" sha1="393de81b294412618336f85d394fa20c69e94cad"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1plants">
+ <description>Science Explorers Volume 1 Grades 1-3: Plants (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- plants 800k.2mg" size="819264" crc="45c9c1a0" sha1="132bdf1f8a96d98bba44957ba504bfe1a6ca2a80" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1shadows">
+ <description>Science Explorers Volume 1 Grades 1-3: Shadows (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- shadows 800k.2mg" size="819264" crc="43b94dc6" sha1="b0bfb2fd17bb5d1c7c618948a00b55de12ca1839" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1skelet">
+ <description>Science Explorers Volume 1 Grades 1-3: Skeletons (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- skeletons 800k.2mg" size="819264" crc="52f32dd1" sha1="6215a7af5203a5ce1f988f18b03fda5dd2375ab1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1weather">
+ <description>Science Explorers Volume 1 Grades 1-3: Weather (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- weather 800k.2mg" size="819264" crc="06a200e0" sha1="e13dd7232820647176c7ef36f446898b0e306153" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2animad">
+ <description>Science Explorers Volume 2 Grades 4-6: Animal Adaptations (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- animal adaptations 800k.2mg" size="819264" crc="80a271fd" sha1="d62603c219ab5c98dbef9924c557e58165631f5f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2dns">
+ <description>Science Explorers Volume 2 Grades 4-6: Day, Night, and The Seasons (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- day, night, and the seasons 800k.2mg" size="819264" crc="bb002a0f" sha1="51db1e43e383837b5e1385b3c4ea46c21216f11f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2nutrit">
+ <description>Science Explorers Volume 2 Grades 4-6: Nutrition (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- nutrition 800k.2mg" size="819264" crc="63637869" sha1="589f4fd8fb8c32f8bb33b834347a46752e729052" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2simpmach">
+ <description>Science Explorers Volume 2 Grades 4-6: Simple Machines (800K 3.5") (4am crack)</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="science explorers- simple machines 800k.2mg" size="819264" crc="e5dbae89" sha1="78f6b9a1a6aec6e7fad30cff717feaec31ea3342" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scgiants_525">
+ <description>Science Giants (A-343 version 1.0) (4am crack)</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-343" />
+ <info name="programmer" value="Ray Kush" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a343 science giants v1.0 (4am crack).dsk" size="143360" crc="5b7cffc2" sha1="ea3e14ffcf27b451957032a98873e2bb0f52c66f"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="scisimul">
<description>Scientific Simulations (version 1.0) (4am crack)</description>
<year>1983</year>
@@ -52411,8 +50742,9 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-02 -->
+ <!-- educational program -->
+ <!-- Grades 1-3 -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="scientific simulations (4am crack).dsk" size="143360" crc="9eb99810" sha1="1a956ba612f866f139e4e0a035087fe12789c20a" />
@@ -52420,16 +50752,88 @@ license:CC0-1.0
</part>
</software>
+ <software name="sv1biophy">
+ <description>Science Volume 1: Biology / Physics (A-708 version 2.2) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-708" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-05 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a708 science vol. 1 v2.2 (4am crack).dsk" size="143360" crc="4da4c14e" sha1="427a70a55c9beed6409bfeec5d2bb53d951f49f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sv3earls">
+ <description>Science Volume 3: Earth / Life Science (A-707 version 4.5) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-707" />
+ <info name="programmer" value="Ken Brumbaugh" />
+ <info name="programmer" value="Rich Crist" />
+ <info name="programmer" value="Hugh Collet" />
+ <info name="programmer" value="Steve Woodward" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-21 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a707 science volume 3- earth, life science v4.5 (4am crack).dsk" size="143360" crc="45c61eef" sha1="b244f1e5040b6266e285ecefdaba0bcbb2349b14" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sminvread">
+ <description>Scoop Mahoney: Investigative Reader (4am crack)</description>
+ <year>1988</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Susan Mahoney &amp; Associates" />
+ <info name="programmer" value="Susan Mahoney" />
+ <info name="programmer" value="Rian Murphy" />
+ <info name="programmer" value="Paul Lempke" />
+ <info name="programmer" value="Bob Dronski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="scoop mahoney (4am crack) disk 1a - program.dsk" size="143360" crc="98deaf6f" sha1="87a324a0f93b7966739483eabffa35ac650cceac" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="scoop mahoney (4am crack) disk 1b - program.dsk" size="143360" crc="6ae00003" sha1="938ea6451ec5957915548a02449316b01083cc9e" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Assignments" />
+ <dataarea name="flop" size="143360">
+ <rom name="scoop mahoney (4am crack) disk 2 - assignments disk.dsk" size="143360" crc="2311ba6d" sha1="e4f7657ff3dfaef440ddc57314b1ef6ef8bba494" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="saga1alandv20" cloneof="saga1aland">
- <description>Scott Adams Graphic Adventure 1: Adventureland (version 2.0/416) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #1: Adventureland (version 2.0/416) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0/416" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-05-25-->
- <!--adventure game-->
+ <!-- Dump released: 2018-05-25 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52445,15 +50849,15 @@ license:CC0-1.0
</software>
<software name="saga1alandv21" cloneof="saga1aland">
- <description>Scott Adams Graphic Adventure 1: Adventureland (version 2.1/416) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #1: Adventureland (version 2.1/416) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/416" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-04-->
- <!--adventure game-->
+ <!-- Dump released: 2017-08-04 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52469,15 +50873,15 @@ license:CC0-1.0
</software>
<software name="saga1aland">
- <description>Scott Adams Graphic Adventure 1: Adventureland (version 2.2/416) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #1: Adventureland (version 2.2/416) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.2/416" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--adventure game-->
+ <!-- Dump released: 2024-04-30 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -52493,15 +50897,15 @@ license:CC0-1.0
</software>
<software name="saga2piradv">
- <description>Scott Adams Graphic Adventure 2: Pirate Adventure (version 2.1/408) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #2: Pirate Adventure (version 2.1/408) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/408" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-04-->
- <!--adventure game-->
+ <!-- Dump released: 2018-01-04 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52517,16 +50921,18 @@ license:CC0-1.0
</software>
<software name="saga3misimp">
- <description>Scott Adams Graphic Adventure 3: Mission Impossible (version 2.1/306) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #3: Mission Impossible (version 2.1/306) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
+ <info name="alt_title" value="Scott Adams graphic Adventure 3: Secret Mission" />
+ <!-- Was renamed Secret Mission in 1980 for a brief period and then back to its original title to avoid legal action related to the TV show of the same name. -->
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/306" />
<!-- This version appears to have the game title scrubbed from both the graphical title page and the text introduction, for reasons unknown. (To be clear, this is on the original copy protected disk.) -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-27-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-27 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52542,15 +50948,15 @@ license:CC0-1.0
</software>
<software name="saga4voocas">
- <description>Scott Adams Graphic Adventure 4: Voodoo Castle (version 2.1/119) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #4: Voodoo Castle (version 2.1/119) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Alexis Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/119" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-07-->
- <!--adventure game-->
+ <!-- Dump released: 2018-10-07 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52566,15 +50972,16 @@ license:CC0-1.0
</software>
<software name="saga5count">
- <description>Scott Adams Graphic Adventure 5: The Count (version 2.1/115) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #5: The Count (version 2.1/115) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Scott Adams, Kem McNair, and Norm Sailer" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="programmer" value="Norm Sailer" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/115" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-04-->
- <!--adventure game-->
+ <!-- Dump released: 2017-08-04 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52590,15 +50997,15 @@ license:CC0-1.0
</software>
<software name="saga6strody">
- <description>Scott Adams Graphic Adventure 6: Strange Odyssey (version 2.1/119) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #6: Strange Odyssey (version 2.1/119) (4am crack)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/119" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-04-->
- <!--adventure game-->
+ <!-- Dump released: 2017-08-04 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52614,15 +51021,15 @@ license:CC0-1.0
</software>
<software name="saga13sorcc">
- <description>Scott Adams Graphic Adventure 13: The Sorcerer of Claymorgue Castle (version 2.2/122) (4am crack)</description>
+ <description>Scott Adams Graphic Adventure #13: The Sorcerer of Claymorgue Castle (version 2.2/122) (4am crack)</description>
<year>1984</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="2.2/122" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-08-15-->
- <!--adventure game-->
+ <!-- Dump released: 2020-08-15 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -52644,8 +51051,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="scramble (4am crack).dsk" size="143360" crc="d4931983" sha1="7084a4fec4c4705cda0f8e3c5a8d255ce431912a" />
@@ -52653,6 +51060,184 @@ license:CC0-1.0
</part>
</software>
+ <software name="scrmbegg">
+ <description>Scrambled Eggs! (revision 2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Shows the Litag developer screen and the Learning Technologies screen is different. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="scrambled eggs (4am crack).dsk" size="143360" crc="b371a101" sha1="5fb00fdabe96223870f9e177bd4d6f1e9b890163" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scrnwrit">
+ <description>Screen Writer (version 2.0) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="David Kidwell" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-18 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="screen writer 2.0 (4am and san inc crack).dsk" size="143360" crc="b80702dd" sha1="a251001b859fd5851e6d1feabd2e7c44fb4a5b82" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scuffyfr031986" cloneof="scuffyfr">
+ <description>Scuffy and Friends (version 03.19.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="03.19.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scuffy and friends v03.19.86 (4am crack) disk 1.dsk" size="143360" crc="5ee0013f" sha1="1e6587f7c15d72037f3631885add18dc3fd36fbb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scuffy and friends v03.19.86 (4am crack) disk 2.dsk" size="143360" crc="15ac14e4" sha1="5b0e82e8a26e8418db86be7d5d6c6d152f2589ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scuffyfr">
+ <description>Scuffy and Friends (version 07.05.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="07.05.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scuffy and friends (4am crack) disk 1.dsk" size="143360" crc="8e3c68cf" sha1="c1365a95b587c367b0b34bdb4af57e26d9d2732b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="scuffy and friends (4am crack) disk 2.dsk" size="143360" crc="efe68056" sha1="acab7204a77f5397207f7e15dc963bd88871fba0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seafox">
+ <description>Seafox (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ed Hobbs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="seafox (4am and san inc crack).dsk" size="143360" crc="db585f74" sha1="c48194de7fed226cbb9bd76c7449b0ea36ebc1bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="srchking">
+ <description>Searching for a King (4am crack)</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="searching for a king (4am crack) side a.dsk" size="143360" crc="1e408ef1" sha1="1a3ec7f6aefb5c4e1052fa4aeb0240d16183f493" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="searching for a king (4am crack) side b.dsk" size="143360" crc="7c95ce05" sha1="ee6564179ef110a37cc9737a4a72c5899f104348" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seasons">
+ <description>Seasons (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="seasons (4am crack).dsk" size="143360" crc="26d5877b" sha1="802498734cd1f4aae48766fd275deda9f59b678c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="secfiler">
+ <description>Secret Filer (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Tim Cimbura" />
+ <info name="programmer" value="Dav Holle" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-11. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="secret filer (4am crack).dsk" size="143360" crc="d82a8e2b" sha1="07885bbc46935fd6206a210bc9130cedb9d634c5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mpsntcmb">
+ <description>Sentence Combining (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="IOTA" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sentence combining i (4am crack).dsk" size="143360" crc="cc058220" sha1="fde07885d295948016480de75409593bf64e417d"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sentdiag">
<description>Sentence Diagramming (4am crack)</description>
<year>1985</year>
@@ -52660,9 +51245,9 @@ license:CC0-1.0
<info name="programmer" value="Dr. E. J. Franco" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-23-->
- <!--educational program-->
- <!--Appears to be a re-release of Diagramming Grammatical Relationships with an additional title page and updated copy protection.-->
+ <!-- Dump released: 2016-02-23 -->
+ <!-- educational program -->
+ <!-- Appears to be a re-release of Diagramming Grammatical Relationships with an additional title page and updated copy protection. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -52687,7 +51272,7 @@ license:CC0-1.0
<rom name="sentence diagramming (4am crack) disk 4.dsk" size="143360" crc="e066b500" sha1="e24453611307982f8ac3a9baace9310f084dd9aa" />
</dataarea>
</part>
- <!--Disk #5 is missing.-->
+ <!-- Disk #5 is missing. -->
<part name="flop5" interface="floppy_5_25">
<feature name="part_id" value="Disk 5"/>
<dataarea name="flop" size="143360">
@@ -52700,12 +51285,13 @@ license:CC0-1.0
<description>Sentence Fun (version 1987) (4am crack)</description>
<year>1987</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-03-10-->
- <!--educational program-->
+ <!-- Dump released: 2016-03-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sentence fun (4am crack).dsk" size="143360" crc="e2ae6748" sha1="f228dd5f89cac106cc603900677ed2f3f6cbf025" />
@@ -52713,19 +51299,45 @@ license:CC0-1.0
</part>
</software>
- <software name="sscletfy">
- <description>Sesame Street Crayon: Letters For You (version 1987-10-31) (4am crack)</description>
- <year>1987</year>
- <publisher>Polarware</publisher>
- <info name="programmer" value="Brian A. Rice and Angela Greene" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1987-10-31" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-16-->
- <!--educational program-->
+ <software name="serpntne">
+ <description>Serpentine (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Snider" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="sesame street crayon- letters for you 1987-10-31 (4am crack).dsk" size="143360" crc="5dcd383a" sha1="646235e72878281a52ef7054aa75a0824c26eac7" />
+ <rom name="serpentine (4am and san inc crack).dsk" size="143360" crc="2cf40837" sha1="794df393b671126ec1db6fae45d186973d496484" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="7ctygold">
+ <description>Seven Cities of Gold (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Dan Bunten" />
+ <info name="programmer" value="Bill Bunten" />
+ <info name="programmer" value="Jim Rushing" />
+ <info name="programmer" value="Alan Watson" />
+ <info name="programmer" value="Mark Botner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="seven cities of gold (4am and san inc crack) side a.dsk" size="143360" crc="f9566cfe" sha1="ed194e27de65d7ec89e59834ceab579f92735900" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="seven cities of gold (4am and san inc crack) side b.dsk" size="143360" crc="5456b895" sha1="4fc6b15de84729ee06594b485e28b8da647f506b" />
</dataarea>
</part>
</software>
@@ -52738,8 +51350,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-08-->
- <!--strategy game-->
+ <!-- Dump released: 2023-12-08 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shadow hawk one rev. 1 (4am crack).dsk" size="143360" crc="adf101d3" sha1="83ca6c91a7cd589562dd63b082f65ad531cd2c0e" />
@@ -52755,8 +51367,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-11-->
- <!--strategy game-->
+ <!-- Dump released: 2023-12-11 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shadow hawk one rev. 2 (4am crack).dsk" size="143360" crc="c2da014b" sha1="2e5e33b67f235a076bebcecacb71777a1893980b" />
@@ -52768,12 +51380,12 @@ license:CC0-1.0
<description>Shadows and Light (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank Salamon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shadows and light (4am crack).dsk" size="143360" crc="b98b2c74" sha1="48b0cf528d775a756864b663313bc3f2cf99b4d4" />
@@ -52786,10 +51398,10 @@ license:CC0-1.0
<year>1984</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Neosoft" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-04-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shape and color rodeo (4am crack).dsk" size="143360" crc="6e71d007" sha1="c1bb52124cd02ba1e303138aeff77e123c3c6e54" />
@@ -52804,8 +51416,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-12-29-->
- <!--educational program-->
+ <!-- Dump released: 2017-12-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shapes and patterns (4am crack).dsk" size="143360" crc="89884218" sha1="213bbee8ddb774e1dad28836ec08bf849d7cc412" />
@@ -52813,15 +51425,42 @@ license:CC0-1.0
</part>
</software>
+ <software name="sherabow">
+ <description>Sherlock Holmes: Another Bow (4am crack)</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="programmer" value="Bradley G. Stewart" />
+ <info name="programmer" value="Peter A. Golden" />
+ <info name="programmer" value="Michael J. Becker" />
+ <info name="programmer" value="Alan Smith" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sherlock holmes in another bow (4am crack) side a.dsk" size="143360" crc="3cf815b5" sha1="d7c5bd138a2a1800446780cd2ea0f6a023b5b7a6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="sherlock holmes in another bow (4am crack) side b.dsk" size="143360" crc="4c5b5240" sha1="f4698d14f76060e7174c12fecdcf0f34c0640c97" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sherwood">
<description>Sherwood Forest (4am crack)</description>
<year>1982</year>
<publisher>Phoenix Software</publisher>
- <info name="programmer" value="Dale Johnson and Dav Holle" />
+ <info name="programmer" value="Dale Johnson" />
+ <info name="programmer" value="Dav Holle" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-10. Redumped: 2024-05-14 to fix disk volume number, since used with save and restore game routine.-->
- <!--adventure game-->
+ <!-- Dump released: 2022-07-10. Redumped: 2024-05-14 to fix disk volume number, since used with save and restore game routine. -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sherwood forest (4am crack).dsk" size="143360" crc="613419aa" sha1="0866acc79eec6d82eaa6fe9f210f00fe78e20c3e" />
@@ -52829,15 +51468,59 @@ license:CC0-1.0
</part>
</software>
+ <software name="shilohgt">
+ <description>Shiloh: Grant's Trial in the West (version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="programmer" value="Brian Hermundstad" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="shiloh (4am crack) side a.dsk" size="143360" crc="46f1e68c" sha1="800467ca579dcddf0825af350a54691f358e79a6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="shiloh (4am crack) side b.dsk" size="143360" crc="453ef851" sha1="63fd8f6e16a3055501556fb4134ddb5f08e6df99" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shopright">
+ <description>Shop Right (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="alt_title" value="$hop Right!" />
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="shop right (4am crack).dsk" size="143360" crc="d1865b46" sha1="d2947d6312fc7508096ff6462a6ab55e83a846c0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="shopylp">
<description>Shopping with the Yellow Pages (4am crack)</description>
<year>1984</year>
<publisher>Media Materials</publisher>
- <info name="programmer" value="Paul Edwards and Patrick E. Redington" />
+ <info name="programmer" value="Paul Edwards" />
+ <info name="programmer" value="Patrick E. Redington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-26-->
- <!--educational program-->
+ <!-- Dump released: 2017-01-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shopping with the yellow pages (4am crack).dsk" size="143360" crc="afade5c2" sha1="fd00cb52866b28e0e7da8f484b52857ad50c6db4" />
@@ -52845,6 +51528,83 @@ license:CC0-1.0
</part>
</software>
+ <software name="shrtcrct">
+ <description>Short Circuit (4am crack)</description>
+ <year>1984</year>
+ <publisher>Micro Fun</publisher>
+ <info name="original_publisher" value="Micro Lab" />
+ <info name="programmer" value="David H. Schroeder" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="short circuit (4am crack).dsk" size="143360" crc="f9fd17f6" sha1="5330cfdc44de8aae2393291c98a5895ea5f7e7d5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="showtime10" cloneof="showtime">
+ <description>Show Time (A-171 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-171" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a171 show time v1.0 (4am crack) side a.dsk" size="143360" crc="1c583497" sha1="174b119b8bc59b68e8f6fd7660f3e5f25d2dfef2"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a171 show time v1.0 (4am crack) side b.dsk" size="143360" crc="13965064" sha1="212c55f763a36b2b0c1d8bf370a19940c4c0a2e5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="showtime">
+ <description>Show Time (A-171 version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-171" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a171 show time v1.1 (4am crack) side a.dsk" size="143360" crc="944e21ef" sha1="830af0e0504d0f5cd124e3b2a830b34a8032939c"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a171 show time v1.1 (4am crack) side b.dsk" size="143360" crc="0865208a" sha1="c018c0b3a21fc54ee20e4995e8fdac225ede87ec"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="shutpict">
<description>Shutterbug's Pictures (4am crack)</description>
<year>1985</year>
@@ -52852,8 +51612,8 @@ license:CC0-1.0
<info name="developer" value="Learning Technologies" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="shutterbug's pictures (4am crack).dsk" size="143360" crc="ec7753fa" sha1="f592937967570c31171468b3d923cec693c42e98" />
@@ -52861,6 +51621,144 @@ license:CC0-1.0
</part>
</software>
+ <software name="shtlintr">
+ <description>Shuttle Intercept (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="John van Ryzin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="shuttle intercept (4am crack).dsk" size="143360" crc="b90be8e9" sha1="0f6b36a57e76272194f292481dc14e546b6b2116" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scboxing">
+ <description>Sierra Championship Boxing (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="developer" value="Sierra On-Line" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-27 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sierra championship boxing (4am crack).dsk" size="143360" crc="9c558d5c" sha1="ae60bbd58168ee1cba65c4d70e0c1b2c83efd5c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="simonsays">
+ <description>Simon Says... (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="simon says (4am crack).dsk" size="143360" crc="e9251371" sha1="d8cf1ed0809797625f1b479b7964965c4c53dbd0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssstruct">
+ <description>Simple Sentence Structure (4am crack)</description>
+ <year>1994</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox, M.S." />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="simple sentence structure (4am crack).dsk" size="143360" crc="7924079f" sha1="e39cdcc62b8843be51317171d35db37999ec4c46" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="simlineq">
+ <description>Simultaneous Linear Equations (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="simultaneous linear equations (4am crack).dsk" size="143360" crc="1e206ad7" sha1="adc32225d4c32f052e929a990b8f161e8a25b7ea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newtgmes">
+ <description>Sir Isaac Newton's Games (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sir isaac newton's games (4am crack).dsk" size="143360" crc="af0e4a96" sha1="7f7b9d249e583e366d195daea1406f5ae3455256" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sixgunsh">
+ <description>Six-Gun Shootout (version 1.0) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Strategic Simulations" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="six-gun shootout (4am and san inc crack).dsk" size="143360" crc="de053043" sha1="3424be7108be30d5738a04e1cb3580f646f9e86d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skicrzed">
+ <description>Ski Crazed (version 28701) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="JAM Software" />
+ <info name="partno" value="28701" />
+ <info name="programmer" value="Jason Rubin" />
+ <info name="programmer" value="Andy Gavin" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="28701" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-29 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ski crazed v28701 (4am crack).dsk" size="143360" crc="abec2de2" sha1="8cf6c8abcb4203b6629580f5d6ff3ad4bf62a2fc"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sbsocst6">
<description>Skill Builder: Social Studies - Grade 6 (4am crack)</description>
<year>1986</year>
@@ -52868,8 +51766,8 @@ license:CC0-1.0
<info name="developer" value="Heartsoft" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="skill builder- social studies grade 6 (4am crack).dsk" size="143360" crc="ebbf5206" sha1="1f300ad7eebd3040b566145c84bd16b58b89311f" />
@@ -52877,15 +51775,121 @@ license:CC0-1.0
</part>
</software>
- <software name="slidblokl" cloneof="slidblok">
- <description>Sliding Block (revision 1) (4am crack)</description>
+ <software name="skyblazr">
+ <description>Sky Blazer (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-01 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sky blazer (4am and san inc crack).dsk" size="143360" crc="88ed99bb" sha1="ebfc14ad7ebbd460c4052255446296291b457f33" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skylab10" cloneof="skylab_525">
+ <description>Sky Lab (A-155 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-155" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a155 sky lab v1.0 (4am crack).dsk" size="143360" crc="42b3052a" sha1="b4aed6b651bc82f1b5cc100b93cb190ccc3d3830" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skylab_525">
+ <description>Sky Lab (A-155 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-155" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a155 sky lab v1.1 (4am crack).dsk" size="143360" crc="eae70b11" sha1="bd88b75028a06042d879f6421d13e62050428d8c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skyfox">
+ <description>Skyfox (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Raymond Tobey" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-02 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="skyfox (4am and san inc crack).dsk" size="143360" crc="6845ccc7" sha1="4fe67ca0fafe71f7fb647a8c4f7a435d84576c17" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slidshop10">
+ <description>Slide Shop (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-08 -->
+ <!-- graphics program -->
+ <!-- Disks 3 and 4 were damaged beyond repair. They contain borders and clip art.-->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="slide shop v1.0 (4am crack) disk 1.dsk" size="143360" crc="8592eb8c" sha1="27595a2316058834c4cfc04b0bd72f28dc380169" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="slide shop v1.0 (4am crack) disk 2.dsk" size="143360" crc="996156b7" sha1="e196e39d826f80147e0c23a702cfb332f3bf32ec" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="slide shop v1.0 (4am crack) disk 3.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="slide shop v1.0 (4am crack) disk 4.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slidblokr1" cloneof="slidblok">
+ <description>Sliding Block (revision 1) (Learning Technologies) (4am crack)</description>
<year>1985</year>
- <publisher>Litag</publisher>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-29-->
- <!--educational program-->
+ <!-- Dump released: 2015-03-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sliding block (4am crack).dsk" size="143360" crc="607415b1" sha1="47b95c61535f677e61d147ce765cb661d9278d71" />
@@ -52894,17 +51898,17 @@ license:CC0-1.0
</software>
<software name="slidblok">
- <description>Sliding Block (revision 2) (Merit) (4am crack)</description>
+ <description>Sliding Block (revision 2) (Merit Software) (4am crack)</description>
<year>1985</year>
<publisher>Merit Software</publisher>
- <info name="developer" value="Learning Technologies" />
- <info name="original_publisher" value="Litag" />
+ <info name="developer" value="Litag" />
+ <info name="original_publisher" value="Learning Technologies" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Re-released by Merit Software with updated copy protection.-->
+ <!-- Re-released by Merit Software with updated copy protection. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-06-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sliding block rev. 2 (4am crack).dsk" size="143360" crc="7d0f3320" sha1="017b8b5a77120088fcc3bdf6dbfcab6c6ba98711" />
@@ -52912,17 +51916,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="smokupty">
+ <description>Smoking: It's Up To You (A-103 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-103" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a103 smoking- it's up to you v1.0 (4am crack).dsk" size="143360" crc="4057a91b" sha1="cd6c091e4e776aca98178d1f2cdff712e60b1550"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="stgranptr1" cloneof="stgranpt">
<description>Snooper Troops 1: The case of: The Granite Point Ghost (revision 1) (4am crack)</description>
<year>1982</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder, Karen Eagen, Karen Whittredge, Chris A. Lutes Jr., Kathy Lunt, Bruce Brown, and David Beyer" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Karen Eagen" />
+ <info name="programmer" value="Karen Whittredge" />
+ <info name="programmer" value="Chris A. Lutes, Jr." />
+ <info name="programmer" value="Kathy Lunt" />
+ <info name="programmer" value="Bruce Brown" />
+ <info name="programmer" value="David Beyer" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-13-->
- <!--adventure game-->
+ <!-- Dump released: 2018-03-13 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="snooper troops 1 - the case of the granite point ghost (4am crack).dsk" size="143360" crc="9840ff1a" sha1="5030db8c9a649775f1cb66446535c3be5ba7c10f" />
@@ -52935,13 +51963,19 @@ license:CC0-1.0
<year>1982</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder, Karen Eagen, Karen Whittredge, Chris A. Lutes Jr., Kathy Lunt, Bruce Brown, and David Beyer" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Karen Eagen" />
+ <info name="programmer" value="Karen Whittredge" />
+ <info name="programmer" value="Chris A. Lutes, Jr." />
+ <info name="programmer" value="Kathy Lunt" />
+ <info name="programmer" value="Bruce Brown" />
+ <info name="programmer" value="David Beyer" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Apple's DOS 3.3P copy protection-->
+ <!-- Apple's DOS 3.3P copy protection -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-05-28-->
- <!--adventure game-->
+ <!-- Dump released: 2020-05-28 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="snooper troops and the case of the granite point ghost rev. 2 (4am crack).dsk" size="143360" crc="0d66db3e" sha1="0b922e12625060e7f272192241ab44cc4800195f"/>
@@ -52958,8 +51992,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-25-->
- <!--adventure game-->
+ <!-- Dump released: 2015-03-25 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="snooper troops 2 (4am crack).dsk" size="143360" crc="77d3c16d" sha1="7b9a4b3e22fd32435ba6ef5cf33b882e5a3807dc" />
@@ -52975,10 +52009,10 @@ license:CC0-1.0
<info name="developer" value="Computer Learning Connection" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This re-release has updated copy protection and unspecified other changes.-->
+ <!-- This re-release has updated copy protection and unspecified other changes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-13-->
- <!--adventure game-->
+ <!-- Dump released: 2018-03-13 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="snooper troops 2 - the case of the disappearing dolphin rev. 2 (4am crack).dsk" size="143360" crc="2d08c0ff" sha1="7c7a603620ace354a7b23dc550065176c1f0fc58" />
@@ -52993,8 +52027,8 @@ license:CC0-1.0
<info name="programmer" value="Michael Roessler" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -53009,15 +52043,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="softprna">
+ <description>Softporn Adventure (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Chuck Benton" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-06 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="softporn adventure (4am and san inc crack).dsk" size="143360" crc="0afa257d" sha1="385acc8ee9fb495e74b342d38b0fe085285cc3cc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="soloflt">
<description>Solo Flight (4am crack)</description>
<year>1984</year>
<publisher>Microprose Software</publisher>
- <info name="programmer" value="Sid Meier and Andy Hollis" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Andy Hollis" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-09-30-->
- <!--simulation game-->
+ <!-- Dump released: 2021-09-30 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="solo flight (4am crack).dsk" size="143360" crc="ed040baf" sha1="5945d9d7d491ce5b13f207f73271f48bd1103b10"/>
@@ -53025,16 +52076,76 @@ license:CC0-1.0
</part>
</software>
+ <software name="solveit">
+ <description>Solve It! (4am crack)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Peggy Healy Stearns" />
+ <info name="programmer" value="C. Alan Riedesel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="solve it (4am crack) disk 1.dsk" size="143360" crc="9b3ae078" sha1="3bbcfc852875eb63a8103c95bd8fe34be0483187" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="solve it (4am crack) disk 2.dsk" size="143360" crc="4592d1fc" sha1="f80934b2193f5e9275f8b6397ee7c9d666a36b5e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="soleqineq">
+ <description>Solving Equations and Inequalities (version 2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Charles Lund" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="solving equations and inequalities v2 (4am crack).dsk" size="143360" crc="0fb9deac" sha1="3a240343ee2ad54fcfa62b8894b9928818539f0f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slquadeq">
+ <description>Solving Quadratic Equations (version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="solving quadratic equations (4am crack).dsk" size="143360" crc="5d58ab62" sha1="8223e4ecb167e11a4e51dceebd091778f7c68316" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sndvibs">
<description>Sound and Vibrations (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank Salamon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sound and vibrations (4am crack).dsk" size="143360" crc="a50cfb06" sha1="ffdcae9155eba7d9cc65f1e79a04c73c43a24211" />
@@ -53046,10 +52157,10 @@ license:CC0-1.0
<description>Sound Ideas: Consonants (4am crack)</description>
<year>1986</year>
<publisher>Houghton Mifflin</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-02-15-->
- <!--educational program-->
+ <!-- Dump released: 2018-02-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -53101,8 +52212,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -53141,10 +52252,10 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Revision is undated.-->
+ <!-- Revision is undated. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-08-->
- <!--educational program-->
+ <!-- Dump released: 2018-03-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -53184,8 +52295,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-07-12-->
- <!--educational program-->
+ <!-- Dump released: 2017-07-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -53230,10 +52341,10 @@ license:CC0-1.0
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 5220C" />
- <!--This is version 5220C according to files in the disk catalog on track 0x22.-->
+ <!-- This is version 5220C according to files in the disk catalog on track 0x22. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-07-->
- <!--educational program-->
+ <!-- Dump released: 2018-03-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -53272,15 +52383,87 @@ license:CC0-1.0
</part>
</software>
+ <software name="soundtrk">
+ <description>Sound Tracks (A-159 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-159" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a159 sound tracks v1.0 (4am crack).dsk" size="143360" crc="f391030d" sha1="aefe5b72ed9b2604aa065a65b0422ceb4fa22b4c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sthncmnd">
+ <description>Southern Command (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="southern command (4am and san inc crack).dsk" size="143360" crc="e3265f8d" sha1="216fcf8fd4693c11bcdde1eb16e7423539fef0b7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spacconq">
+ <description>Space Conquerors (version 1.5) (Softsmith) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="alt_title" value="Empire I: World Builders" />
+ <info name="developer" value="Edu-Ware Services" />
+ <info name="original_publisher" value="Edu-Ware Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-13 -->
+ <!-- simulation game -->
+ <!-- Rebranding of Edu-Ware's "Empire I: World Builders". -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="space conquerors (4am and san inc crack).dsk" size="143360" crc="12b9360b" sha1="6ec2865f6b99d49b953cfcbdb10bee2fb038c13a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="synspcgm">
+ <description>Space Games: Appointment at Aldebaran &amp; Procyon Warrior (4am crack)</description>
+ <year>1981</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-29 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="space games - appointment at aldebaran and procyon warrior (4am crack).dsk" size="143360" crc="0e44e284" sha1="9771e6eee41bef375a88c96abaa44c1e76fd25f6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sjplanst">
<description>Space Journey: Planets and Stars (4am crack)</description>
<year>1991</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi, Toby Schack, Mark Barone, and Gregory Truex" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Gregory Truex" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-08-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-08-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="space journey- planets and stars (4am crack).dsk" size="143360" crc="2a5efedf" sha1="a7b317634ed2ff992ecb6b27e31b2e720ef9189f" />
@@ -53288,6 +52471,204 @@ license:CC0-1.0
</part>
</software>
+ <software name="spacport">
+ <description>Space Port (4am crack)</description>
+ <year>1984</year>
+ <publisher>World Book</publisher>
+ <info name="developer" value="Interactive Image Technologies"/>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="space port (4am crack).dsk" size="143360" crc="6c3ecdef" sha1="a51d6534737b539448dd8ea36999e0e4305d53fa"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="squest">
+ <description>Space Quest: The Sarien Encounter (4am and san inc crack)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 1a.dsk" size="143360" crc="27ed4182" sha1="44e08db3763a2c4ea82280440c9ef24ec30b6bd0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 1b.dsk" size="143360" crc="15110cd5" sha1="22cb2c91eb83a0bbdd983ac34324189d60dc7c2a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 2a.dsk" size="143360" crc="af36bcf5" sha1="c8c7ef1834800808b519be8fd2c38c8bc7a01ae3" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 2b.dsk" size="143360" crc="acd261ca" sha1="909b3214ed1770d22d58c74ce8a6ed8bf342c5ce" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 3a.dsk" size="143360" crc="6ada0a57" sha1="bc33913d2f832adca1c9c2f2d319c2c41594ce66" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 3b.dsk" size="143360" crc="1ada1276" sha1="ae07ab7f0fae764fc4ec602d90fb959c0cd322e1" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 4a.dsk" size="143360" crc="7d32c1fe" sha1="0e8a7a2da6e36ffa1425a85bd7ef49461f74a4cf" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest i (4am and san inc crack) disk 4b.dsk" size="143360" crc="2a5cc94f" sha1="d5146f79ddb4e9d9ecfebc213c443b91656ddf00" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="squest2">
+ <description>Space Quest II: Vohaul's Revenge (version 2.0A) (4am and san inc crack)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.0A" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 1a.dsk" size="143360" crc="c21d5311" sha1="aa493ebb3d800f6ae7e3bd937bd33cdf57bc1543" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 1b.dsk" size="143360" crc="3d09546f" sha1="37750ccfed6b653eccc2b1975d7082c441dc28e3" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 2a.dsk" size="143360" crc="92112613" sha1="e0ae9b884664c8a5447c63a2caf882b9c72562dc" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 2b.dsk" size="143360" crc="ea115f20" sha1="f86cc9cb9d58668eadf16eaf608c76974bcd3ef7" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 3a.dsk" size="143360" crc="ec1f2910" sha1="7c8e7a4f2ababe6fd2b2a6f1a730ac333019ff7d" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 3b.dsk" size="143360" crc="33359b92" sha1="4df5e7553430659f2c27f7239f05c51a724e05f7" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 4a.dsk" size="143360" crc="4a0e73ed" sha1="c80aa34c096835a656591ad52363292c639c07dc" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="space quest ii (4am and san inc crack) disk 4b.dsk" size="143360" crc="4a948a39" sha1="e7ba13f8a4b4f9788597e06f4edb24b8c41b1708" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spcwrace">
+ <description>Space Waste Race: Storybooks Of The Future (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John D. Perron" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="space waste race- storybooks of the future (4am crack).dsk" size="143360" crc="45acb2d7" sha1="989f333bb3196547749134460010fec5b2551f59"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spnach1">
+ <description>Spanish Achievement I: Vocabulary (4am crack)</description>
+ <year>1982</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="programmer" value="Albert Barugel" />
+ <info name="programmer" value="Marla Barugel" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spanish achievement i (4am crack).dsk" size="143360" crc="6ab2d1d8" sha1="edbd06cb59a46d628ee725a2fddd98d7cc58bcf8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sa2gramr">
+ <description>Spanish Achievement II: Grammar (4am crack)</description>
+ <year>1983</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Douglas Higgins" />
+ <info name="programmer" value="Albert Barugel" />
+ <info name="programmer" value="Marla Barugel" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spanish achievement ii (4am crack).dsk" size="143360" crc="f3859731" sha1="dcc487aebc6bb7abe2edd81a4440207464b54576"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="spnfrnfr">
<description>Spanish Foreign Frenzy (4am crack)</description>
<year>1984</year>
@@ -53295,8 +52676,8 @@ license:CC0-1.0
<info name="programmer" value="E.A. Milkow" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-07-17-->
- <!--educational game-->
+ <!-- Dump released: 2016-07-17 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Program disk"/>
<dataarea name="flop" size="143360">
@@ -53311,18 +52692,363 @@ license:CC0-1.0
</part>
</software>
+ <software name="sgrffcan">
+ <description>Spanish Grammar Review: Familiar and Formal Commands in the Affirmative and Negative (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Dr. José Montero" />
+ <info name="programmer" value="Michele Gottlieb" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spanish grammar review - familiar and formal commands in the affirmative and negative (4am crack).dsk" size="143360" crc="d4dcb5dc" sha1="40890c5e5edf505ab555ab7f7731c42be3b53cd2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sgrfactr">
+ <description>Spanish Grammar Review: Future and Conditional Tenses of Regular and Irregular Verbs (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Dr. José Montero" />
+ <info name="programmer" value="Michele Gottlieb" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spanish grammar review - future and conditional tenses of regular and irregular verbs (4am crack).dsk" size="143360" crc="1dc98e65" sha1="cf63aa9cab3fe3c51c4db9def5c13a2f5cc679f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sgrporvp">
+ <description>Spanish Grammar Review: Por vs. Para (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Dr. José Montero" />
+ <info name="programmer" value="Michele Gottlieb" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="por vs para (4am crack).dsk" size="143360" crc="4eb13da5" sha1="50dfba4195e10e5c41868e3e952daab778390254" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sparechg">
<description>Spare Change (4am and san inc crack)</description>
<year>1983</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Dan Zeller and Mike Zeller" />
+ <info name="programmer" value="Dan Zeller" />
+ <info name="programmer" value="Mike Zeller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-08-23. Redumped: 2025-03-04 to fix a small bug initializing self-modifying code during boot. -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spare change (4am and san inc crack).dsk" size="143360" crc="8dac6f2b" sha1="5e19bf66056f9a1f3c92f181892a1f425061b910" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sparemom">
+ <description>Spare Moments: Solitare &amp; With a Friend (H-111) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="H-111" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-11-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Solitaire"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-h111a spare moments solitaire (4am crack).dsk" size="143360" crc="7a3bda7b" sha1="e0ab3ca75fb1721aa4178e77ac3f6bf75443a0c2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Moments with a Friend"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-h111b spare moments with a friend (4am crack).dsk" size="143360" crc="a10f239e" sha1="d91ec199ecc1dbc37c34636de67b238c7712b269" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="specprpt">
+ <description>Spectrum: Programs and Patterns (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Stephen R. Shalom" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spectrum (4am crack).dsk" size="143360" crc="14bdf82e" sha1="e91205ebdb8124567f16b3697d7ebe50330599fb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdrdr2080584" cloneof="spdrdr2">
+ <description>Speed Reader II (08.05.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.05.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="speed reader ii (4am crack) disk 1.dsk" size="143360" crc="b78124a2" sha1="d9bce6adfa855e4e2fe2315bdffa245e68533d93" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="speed reader ii (4am crack) disk 2.dsk" size="143360" crc="2ffbc285" sha1="860442365457d7fd768d7e5ab1b3f012b4039747" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdrdr2061285" cloneof="spdrdr2">
+ <description>Speed Reader II (version 06.12.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="06.12.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="speed reader ii 06.12.85 (4am crack) side a.dsk" size="143360" crc="ac6ff3ec" sha1="db768c7899a5b05b6a48da32dd0da8ebc631621c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="speed reader ii 06.12.85 (4am crack) side b.dsk" size="143360" crc="e1cd7286" sha1="f7ffbb1cc99f288d1abb8e68491222c6d2c3ea3f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdrdr2">
+ <description>Speed Reader II (version 09.12.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.12.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-04 -->
+ <!-- educational program -->
+ <!-- Data disk was badly damaged, but usable without. Can also use the data disk from a previous version. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="speed reader ii 091286 (4am crack) side a.dsk" size="143360" crc="4ea75cbc" sha1="8a2915eac02e593d9d0fb88422929072237c81f4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="speed reader ii 091286 (4am crack) side b.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swaymath_525">
+ <description>Speedway Math (A-169 version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-169" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a169 speedway math v1.0 (4am crack).dsk" size="143360" crc="cff8d1bc" sha1="4ef56187addf57e9cf0b52b3dc564772859501e8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdydvry">
+ <description>Speedy Delivery (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="speedy delivery (4am crack).dsk" size="143360" crc="7c9b225b" sha1="23c3480ea1e6e96613d2b8a13e394afcdd9f2a53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellitu" cloneof="spellit">
+ <description>Spell It! (4am crack)</description>
+ <year>1984</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell it (4am crack) side a.dsk" size="143360" crc="5e1e1c9a" sha1="331a8613e1bb815d28b6f83f312f35726c7c0b8d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell it (4am crack) side b.dsk" size="143360" crc="580a3e09" sha1="4d8ade83dd07e03cb0158e95109072b1a367d06e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellit">
+ <description>Spell It! (version 06.01.87) (800K 3.5") (4am crack)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="06.01.87" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="spell it 800k (4am crack).2mg" size="819264" crc="5631759c" sha1="2916f443a2784caa8ca0289aabbe2a3d55378127" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellitp_525" cloneof="spellitp">
+ <description>Spell It Plus! (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Faye Schwartz" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Kevin Burley" />
+ <info name="programmer" value="Carol Carpenter" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell it plus (4am crack) disk 1 side a.dsk" size="143360" crc="2b44bec0" sha1="73b49fa3db80efc29dea8c1ddf7bd30d27e58932" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell it plus (4am crack) disk 1 side b.dsk" size="143360" crc="4da7d0eb" sha1="c51a58547fc50902220dbea12dd46355d66da636" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell it plus (4am crack) disk 2.dsk" size="143360" crc="c7b9ecfd" sha1="3439a82cddb3831219418d8354105f29acd81d3f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellitp">
+ <description>Spell It Plus! (800K 3.5") (4am crack)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Faye Schwartz" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Kevin Burley" />
+ <info name="programmer" value="Carol Carpenter" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="spell it plus 800k (4am crack).2mg" size="819264" crc="46ffcce2" sha1="7f85b85de5390ae97eb4445da619a88639687e34" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sssplmst">
+ <description>Spell Master (version 1.3.1 01-AUG-82) (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Edu-Ware Services" />
+ <info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3.1 01-AUG-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-08-23-->
- <!--action game-->
+ <!-- Dump released: 2021-06-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell master (softsmith) (4am and san inc crack) - disk 1 - program.dsk" size="143360" crc="dc8ab97e" sha1="5fc44198d1e93dd4a20df7fd28f562cc527ff0db"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data level 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell master (softsmith) (4am and san inc crack) - disk 2 - data disk level 4.dsk" size="143360" crc="73681f8a" sha1="e5ee724e7ed29e33ac7791294811cd2dd057cb57"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Data level 5"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell master (softsmith) (4am and san inc crack) - disk 3 - data disk level 5.dsk" size="143360" crc="9cb50d28" sha1="c9bfeb39d43164666a5830877db5e1dcb3c5970b"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Data level 6"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell master (softsmith) (4am and san inc crack) - disk 4 - data disk level 6.dsk" size="143360" crc="263ef5b1" sha1="16ff889149fe9787ecbe8ae6f999f0b3d6d76741"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 - Data level 7"/>
+ <dataarea name="flop" size="143360">
+ <rom name="spell master (softsmith) (4am and san inc crack) - disk 5 - data disk level 7.dsk" size="143360" crc="c2ed9fd0" sha1="a13509e10dcb848aa7547df9f0c8fefe1dee6743"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 - Data level 8"/>
<dataarea name="flop" size="143360">
- <rom name="spare change (4am &amp; san inc crack).dsk" size="143360" crc="a4e7f502" sha1="f00f3a9811fb14e158a8c7c16bc6539cc39465ab" />
+ <rom name="spell master (softsmith) (4am and san inc crack) - disk 6 - data disk level 8.dsk" size="143360" crc="6e8030a5" sha1="360995dcbe12632071c9e434e5cb258e22899993"/>
</dataarea>
</part>
</software>
@@ -53334,11 +53060,11 @@ license:CC0-1.0
<info name="developer" value="DesignWare" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This matches the classic crack, suggesting a first release.-->
- <!--Contains the string: GAME DISK-SPELLAKAZAM-->
+ <!-- This matches the classic crack, suggesting a first release. -->
+ <!-- Contains the string: GAME DISK-SPELLAKAZAM -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-07-->
- <!--educational game-->
+ <!-- Dump released: 2023-09-07 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spellakazam rev. 1 (4am crack).dsk" size="143360" crc="ef969a01" sha1="2b3aec7180b9ee697351defe98d10a632a2d4598" />
@@ -53353,10 +53079,10 @@ license:CC0-1.0
<info name="developer" value="DesignWare and Silver Burdett" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Contains the string: GAME DISK-SPELLAKAZAM2-->
+ <!-- Contains the string: GAME DISK-SPELLAKAZAM2 -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-09-02-->
- <!--educational game-->
+ <!-- Dump released: 2014-09-02 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spellakazam revision 2 (4am crack).dsk" size="143360" crc="b34617bf" sha1="11c6231dd55588fa0c9453b1a589daa75bde5fdc" />
@@ -53372,8 +53098,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spelling and reading primer v2.0.1 (4am crack).dsk" size="143360" crc="29715e18" sha1="f9262db56fb7ccab029b296437be61bac8de8a89" />
@@ -53389,8 +53115,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spelling bee v1.0 (4am crack).dsk" size="143360" crc="d9406601" sha1="8098d913fa33d6c454657c1c36c672ee7032b4bc" />
@@ -53406,8 +53132,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spelling bee v1.1 (4am crack).dsk" size="143360" crc="5a007d17" sha1="1504be408af63ec90165840b2335a0476b34fda9" />
@@ -53423,8 +53149,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1.1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-07-01-->
- <!--educational program-->
+ <!-- Dump released: 2017-07-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spelling bee games (4am crack).dsk" size="143360" crc="210db254" sha1="d06fa84c2af038dc543f88ebb32f3350d7a77da9" />
@@ -53440,8 +53166,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-12-05-->
- <!--educational program-->
+ <!-- Dump released: 2014-12-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spelling bee and reading primer (4am crack).dsk" size="143360" crc="2bbf634b" sha1="56afb3014e4c2e5f8904904577c709bbfba3452d" />
@@ -53449,6 +53175,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="spelcarn">
+ <description>Spelling Carnival (4am crack)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Marley W. Watkins" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="spelling carnival (softsmith) (4am crack).dsk" size="143360" crc="279a9231" sha1="89b8c913e77d6fe6dd65181b550c5d1c24ead036" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="splmstry">
<description>Spelling Mastery (4am crack)</description>
<year>1988</year>
@@ -53456,8 +53198,8 @@ license:CC0-1.0
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-10-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -53479,8 +53221,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spelling rules (4am and san inc crack).dsk" size="143360" crc="bc49a13c" sha1="a38e4c49db25ea06abc881d299a26d8df6f6b78f" />
@@ -53488,6 +53230,96 @@ license:CC0-1.0
</part>
</software>
+ <software name="sv1prim20" cloneof="sv1prim">
+ <description>Spelling Volume 1: Primary (A-726 version 2.0) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-726" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a726 spelling volume 1- primary v2.0 (4am crack).dsk" size="143360" crc="0b75f4e8" sha1="75b0ac33e13209b7db7c248184642ea4f629a340"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sv1prim30" cloneof="sv1prim">
+ <description>Spelling Volume 1: Primary (A-726 version 3.0) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-726" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a726 spelling vol. 1 v3.0 (4am crack).dsk" size="143360" crc="c349f5fb" sha1="410b8807f44ff6ead25316d6ff2ad94d9930cc06" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sv1prim">
+ <description>Spelling Volume 1: Primary (A-726 version 3.1) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-726" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a726 spelling volume 1 v3.1 (4am crack).dsk" size="143360" crc="e80a2c33" sha1="a1f8d956c2e78d72884139baf52acec9f9519ca9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sv2sec20" cloneof="sv2sec">
+ <description>Spelling Volume 2: Secondary (A-728 version 2.0) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-728" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a728 spelling volume 2- secondary v2.0 (4am crack).dsk" size="143360" crc="28f1e707" sha1="f04478d198db9e692bab902648db91e8297b2cff"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sv2sec">
+ <description>Spelling Volume 2: Secondary (A-728 version 3.1) (4am crack)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-728" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a728 spelling volume 2- secondary v3.1 (4am crack).dsk" size="143360" crc="f9619661" sha1="0a3d3ec46484681198cf54c930849c21903f7f0b"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sphtspell">
<description>Spider Hunt Spelling (version 4.1.6) (4am crack)</description>
<year>1991</year>
@@ -53496,8 +53328,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="4.1.6" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -53512,18 +53344,42 @@ license:CC0-1.0
</part>
</software>
+ <software name="spidrbot">
+ <description>Spiderbot (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Richard Unruh" />
+ <info name="programmer" value="Ken Moore" />
+ <info name="programmer" value="Douglas Dragin" />
+ <info name="programmer" value="Howard Scheer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233482">
+ <rom name="spiderbot (4am crack).dsk" size="143360" crc="ad3e39d4" sha1="d085d7b1acc249d59ded2ea570eb8e4985bc9fe2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sportstat">
<description>Sports Stats (A-405 version 1.0) (4am crack)</description>
<year>1985</year>
<publisher>MECC</publisher>
<info name="developer" value="TIES" />
<info name="partno" value="A-405" />
- <info name="programmer" value="Jim Sydow, Ron Geiser, Reed Christiansen, Dave Laden, Curt Traaseth, and Jean Brown"/>
+ <info name="programmer" value="Jim Sydow" />
+ <info name="programmer" value="Ron Geiser" />
+ <info name="programmer" value="Reed Christiansen" />
+ <info name="programmer" value="Dave Laden" />
+ <info name="programmer" value="Curt Traaseth" />
+ <info name="programmer" value="Jean Brown" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-03-18 Redump: 2021-08-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-03-18 Redump: 2021-08-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="mecc-a405 sports stats v1.0 (4am crack).dsk" size="143360" crc="495088ec" sha1="ac453eac8f53037b94bd4c8c02fc4d9195bcd0c3" />
@@ -53531,17 +53387,34 @@ license:CC0-1.0
</part>
</software>
+ <software name="spyvspy3">
+ <description>Spy vs. Spy III: Arctic Antics (4am crack)</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="First Star Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-18 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233482">
+ <rom name="spy vs. spy iii - arctic antics (4am crack).dsk" size="143360" crc="98208443" sha1="6646b7a5ac8c4f24a52931a605e943c7175b6d4e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sqpairs">
<description>Square Pairs (version 1.0) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Scholastic</publisher>
- <info name="programmer" value="Glenn M. Kleiman and Steve Minsuk" />
+ <info name="programmer" value="Glenn M. Kleiman" />
+ <info name="programmer" value="Steve Minsuk" />
<info name="usage" value="Requires an Apple ][+ or unenhanced //e." />
- <!--Due to coding errors unrelated to the copy protection, this program fails to boot on any Apple II with a 65c02 CPU.-->
+ <!-- Due to coding errors unrelated to the copy protection, this program fails to boot on any Apple ][ with a 65c02 CPU. -->
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P, A2E" />
- <!--Dump released: 2022-12-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="square pairs (4am and san inc crack).dsk" size="143360" crc="a18bc448" sha1="393ad93ae119e187ea36b31faac935978fed02d7" />
@@ -53549,6 +53422,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="starblzrb">
+ <description>Star Blazer (Brøderbund) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="original_publisher" value="Star Craft" />
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="star blazer (4am and san inc crack).dsk" size="143360" crc="782219e8" sha1="f23d3bbf0c57edbb814408aef4a5f03ef376f003" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="strsrcd">
<description>Star Search (demo) (4am crack)</description>
<year>1981</year>
@@ -53556,8 +53446,8 @@ license:CC0-1.0
<info name="programmer" value="Mark Goles"/>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-29-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -53572,15 +53462,119 @@ license:CC0-1.0
</part>
</software>
+ <software name="startrad">
+ <description>Star Traders (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Ian Trackman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-19 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="star traders (4am crack).dsk" size="143360" crc="a741f1b8" sha1="ec41a84eb4c6d44f4a21b38c0e649a671d330a44" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starblstp" cloneof="starblst">
+ <description>Starblaster (Piccadilly Software) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Piccadilly Software</publisher>
+ <info name="programmer" value="Mark &quot;Gopher&quot; Kriegsman" />
+ <info name="programmer" value="Geoffrey Engelstein" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-12 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="starblaster (4am crack).dsk" size="143360" crc="e510290f" sha1="d62a2c9d96e2de33de004bde65f11ef7d382b041" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starblst">
+ <description>Starblaster (Softsmith) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Piccadilly Software" />
+ <info name="programmer" value="Mark &quot;Gopher&quot; Kriegsman" />
+ <info name="programmer" value="Geoffrey Engelstein" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="starblaster (softsmith) (4am crack).dsk" size="143360" crc="73039ce0" sha1="4d5c093a3469467610e23cd5c5a0652170a9c916" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stargate">
+ <description>Stargate (Atarisoft) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="alt_title" value="Defender II" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-06 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="stargate (4am crack).dsk" size="143360" crc="a417073a" sha1="e62e1e25551afc7e8f23fe6c0b9b4794ea44a305" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sqstarwarr1" cloneof="sqstarwar">
+ <description>Starquest: Star Warrior (revision 1) (4am crack)</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jim Connelley" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="star warrior (4am crack).dsk" size="143360" crc="330619ad" sha1="7e472967dd91d345c5a999020c663ad4b2db6de1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sqstarwar">
+ <description>Starquest: Star Warrior (revision 2) (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jim Connelley" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Has completely different copy protection, do not know if revision 1 or 2 came first, and do not know if there are any game changes. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-07-17 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="star warrior rev. 2 (4am and san inc crack).dsk" size="143360" crc="60cd093f" sha1="1e8c42513bc5280d42143b4d9dac6d402845d1bc"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sshonbear">
<description>Start Solving: Honeybear (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="start solving- honeybear (4am crack).dsk" size="143360" crc="7a25e436" sha1="2429f974cb6d2c989ae5cf2eb8f9c69032e8b381" />
@@ -53591,12 +53585,12 @@ license:CC0-1.0
<software name="sssamstst">
<description>Start Solving: Sam's Sticker Store (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="start solving- sam's sticker store (4am crack).dsk" size="143360" crc="3e0a1a08" sha1="38b7d4688b8fb6a5ea506068fc335c74b0ce4342" />
@@ -53607,12 +53601,12 @@ license:CC0-1.0
<software name="sstinatvs">
<description>Start Solving: Tina's TV Show (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="start solving- tina's tv show (4am crack).dsk" size="143360" crc="4ad1efd3" sha1="9ef957f3a90309b80fb5c54c1ae90066c65599c2" />
@@ -53620,14 +53614,65 @@ license:CC0-1.0
</part>
</software>
+ <software name="station5">
+ <description>Station 5 (4am crack)</description>
+ <year>1984</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Stephen Goss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="station 5 (4am crack).dsk" size="143360" crc="bc3f5746" sha1="dae33e3858379b05666c9051d62d4aeba66c4b13" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stellar7sec" cloneof="stellar7">
+ <description>Stellar 7 (Software Entertainment Company) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Software Entertainment Company</publisher>
+ <info name="programmer" value="Damon Slye" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="stellar 7 (software entertainment company) (4am crack).dsk" size="143360" crc="4068c80b" sha1="0e4ef0b16c1122bc03f8479f6b76112dbf12a721"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stellar7">
+ <description>Stellar 7 (Penguin Software) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="developer" value="Dyamix" />
+ <info name="original_publisher" value="Software Entertainment Company" />
+ <info name="programmer" value="Damon Slye" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Remake by Dynamix and distributed by Penguin Software. -->
+ <!-- Dump released: 2016-11-22 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="stellar 7 (4am crack).dsk" size="143360" crc="69526fd9" sha1="2711ccba9b85775c5d0db5f382f1fd7336d33bab" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="stickers">
<description>Stickers (4am crack)</description>
<year>1984</year>
<publisher>Springboard Software</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickers (4am crack).dsk" size="143360" crc="073666ae" sha1="d83a4dedc47c77fd808dbbc692c254dd221891ec" />
@@ -53639,12 +53684,14 @@ license:CC0-1.0
<description>Stickybear Basket Bounce (revision 1) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-07-19-->
- <!--educational program-->
+ <!-- Dump released: 2018-07-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear basket bounce (4am and san inc crack).dsk" size="143360" crc="dced90cc" sha1="3714438a1449a5aafe111651ef2bb7b168981c22" />
@@ -53656,13 +53703,15 @@ license:CC0-1.0
<description>Stickybear Basket Bounce (revision 2) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Significant differences on multiple tracks. No visible version number.-->
+ <!-- Significant differences on multiple tracks. No visible version number. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-05-19-->
- <!--educational program-->
+ <!-- Dump released: 2019-05-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear basket bounce rev. 2 (4am crack).dsk" size="143360" crc="606caebe" sha1="7140f9a354707b6b0a59a9c795e21f41b44644c7" />
@@ -53674,11 +53723,12 @@ license:CC0-1.0
<description>Stickybear Drawing (4am and san inc crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-05-->
- <!--graphics program-->
+ <!-- Dump released: 2021-07-05 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear drawing (4am and san inc crack).dsk" size="143360" crc="c084f302" sha1="75217f3a5a60d729cd114a9646b5cbabce07e400"/>
@@ -53690,13 +53740,14 @@ license:CC0-1.0
<description>Stickybear Math (revision 3) (4am and san inc crack)</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 3" />
- <!--This copy has significant differences on multiple tracks. Says 1982 on label.-->
+ <!-- This copy has significant differences on multiple tracks. Says 1982 on label. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-13-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear math rev. 3 (4am and san inc crack).dsk" size="143360" crc="806120b2" sha1="336b6a615c9d7a42174946ab3ecba834efacb1de" />
@@ -53708,13 +53759,14 @@ license:CC0-1.0
<description>Stickybear Math (revision 4) (4am crack)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 4" />
- <!--This copy has significant differences on multiple tracks. Says 1984 on label.-->
+ <!-- This copy has significant differences on multiple tracks. Says 1984 on label. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-06-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear math rev. 4 (4am crack).dsk" size="143360" crc="d2cff823" sha1="46f3f030eabd7367c025a4deeab0b94d450171f7" />
@@ -53726,12 +53778,13 @@ license:CC0-1.0
<description>Stickybear Math 2 (revision 1) (4am crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-22-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear math 2 (4am crack).dsk" size="143360" crc="a1e20f04" sha1="889bc1466291a0e36410a1304a2ef2579d205ba9" />
@@ -53743,13 +53796,14 @@ license:CC0-1.0
<description>Stickybear Math 2 (revision 2) (4am crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Significant differences on multiple tracks.-->
+ <!-- Significant differences on multiple tracks. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-23-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear math 2 revision 2 (4am crack).dsk" size="143360" crc="673888c0" sha1="342f07a97d7799f8a0b2b107c8174a4229a22e42" />
@@ -53761,11 +53815,12 @@ license:CC0-1.0
<description>Stickybear Music (4am and san inc crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-07-04-->
- <!--educational program-->
+ <!-- Dump released: 2017-07-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear music (4am and san inc crack).dsk" size="143360" crc="b49b83fb" sha1="9a27c9cb416c84757386b522e1e492b2ed46baee" />
@@ -53777,12 +53832,14 @@ license:CC0-1.0
<description>Stickybear Numbers (revision 1) (4am and san inc crack)</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-16-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear numbers (4am and san inc crack).dsk" size="143360" crc="d773c199" sha1="62c96a177c4379bbdcc2221076c2777c3038e53c" />
@@ -53794,13 +53851,15 @@ license:CC0-1.0
<description>Stickybear Numbers (revision 2) (4am and san inc crack)</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This revision has significant differences on multiple tracks.-->
+ <!-- This revision has significant differences on multiple tracks. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-13-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear numbers rev. 2 (4am and san inc crack).dsk" size="143360" crc="9b28f8f7" sha1="b66ea66ab30294116bca3a2114a913952760d680" />
@@ -53812,12 +53871,14 @@ license:CC0-1.0
<description>Stickybear Numbers (revision 3) (4am and san inc crack)</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-30-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear numbers rev. 3 (4am and san inc crack).dsk" size="143360" crc="581ed024" sha1="928957799cf58013466eebb1eed2ce7837bafeb0"/>
@@ -53829,13 +53890,15 @@ license:CC0-1.0
<description>Stickybear Numbers (version 18-JAN-89) (4am crack)</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="18-JAN-89" />
- <!--According to file metadata-->
+ <!-- According to file metadata -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-18-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear numbers v18-jan-1989 (4am crack).dsk" size="143360" crc="1931b5a8" sha1="616aadfbf2a1113bdfba58f71eb27657c204eae8" />
@@ -53847,12 +53910,14 @@ license:CC0-1.0
<description>Stickybear Opposites (revision 1) (4am and san inc crack)</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-16-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear opposites (4am and san inc crack).dsk" size="143360" crc="9c8b7ab8" sha1="327f4ab9c778338fd6f3aa00e6678be688c5fcf3" />
@@ -53864,13 +53929,15 @@ license:CC0-1.0
<description>Stickybear Opposites (revision 2) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This version has significant differences on multiple tracks and is dated 1983 on the label.-->
+ <!-- This version has significant differences on multiple tracks and is dated 1983 on the label. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-26-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear opposites rev. 2 (4am crack).dsk" size="143360" crc="c7f4d637" sha1="889e7cd1d234ca3ab6ade7db159625b709f57991" />
@@ -53882,13 +53949,15 @@ license:CC0-1.0
<description>Stickybear Opposites (revision 3) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 3" />
- <!--Unknown revision order, but this version is different than all the others.-->
+ <!-- Unknown revision order, but this version is different than all the others. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-05-08-->
- <!--educational program-->
+ <!-- Dump released: 2019-05-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear opposites rev. 3 (4am and san inc crack).dsk" size="143360" crc="c7f4d637" sha1="889e7cd1d234ca3ab6ade7db159625b709f57991" />
@@ -53900,12 +53969,14 @@ license:CC0-1.0
<description>Stickybear Opposites (800K 3.5") (4am crack)</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple IIgs, //c+, or //e with a compatible drive controller card." />
<info name="version" value="800K 3.5&quot;" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-04-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-04-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="stickybear opposites 800k (4am crack).2mg" size="819264" crc="b4213614" sha1="b52c1b0a25429b2a00227de7dc8ff03fcbc924c8" />
@@ -53917,13 +53988,15 @@ license:CC0-1.0
<description>Stickybear Opposites (version 13-JUL-1989) (4am crack)</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="13-JUL-1989" />
<!-- This version boots from ProDOS and is dated 13-JUL-1989 according to ProDOS file metadata -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-23-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear opposites v13-jul-1989 (4am crack).dsk" size="143360" crc="c5c25b2d" sha1="d8d380bc94bede8d4ce23c98bb17eaad62969954" />
@@ -53935,11 +54008,13 @@ license:CC0-1.0
<description>Stickybear Parts of Speech (4am crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Susan Dubicki, and Dave Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
+ <info name="programmer" value="Dave Cunningham" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-01-21-->
- <!--educational program-->
+ <!-- Dump released: 2016-01-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear parts of speech (4am crack).dsk" size="143360" crc="5c20add6" sha1="9ef644037e67b407cafecf0a9ccf550999fdd940" />
@@ -53951,14 +54026,15 @@ license:CC0-1.0
<description>Stickybear Printer (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="revision 2" />
- <!--Version is not indicated on title screen for this revision and is possibly an earlier release.-->
- <!--This revision has significant differences on multiple tracks. Disks are labeld 1985.-->
+ <!-- Version is not indicated on title screen for this revision and is possibly an earlier release. -->
+ <!-- This revision has significant differences on multiple tracks. Disks are labeld 1985. -->
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-06-->
- <!--graphics program-->
+ <!-- Dump released: 2017-11-06 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear printer rev. 2 (4am crack).dsk" size="143360" crc="692399fc" sha1="ceb1b6572b82e064a3ead8a3f61b41239d3bf4bd" />
@@ -53970,12 +54046,13 @@ license:CC0-1.0
<description>Stickybear Printer (version 1) (4am and san inc crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear printer v1 (4am and san inc crack).dsk" size="143360" crc="a7d1c54a" sha1="bf9e1c5a4c832783fd66138aedfac0a1df799b19" />
@@ -53990,8 +54067,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-23-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear reading (4am crack).dsk" size="143360" crc="9ee5a80c" sha1="ec78140ce280bd46f5e28741bb1b0a5ecb96bc19" />
@@ -54006,8 +54083,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear reading rev. 2 (4am and san inc crack).dsk" size="143360" crc="00ee2303" sha1="3515e212d81189726fc935c918c18ef8a9f4dea4" />
@@ -54021,8 +54098,8 @@ license:CC0-1.0
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-23-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear reading comprehension (4am crack).dsk" size="143360" crc="45c24480" sha1="8825840a0c6cdf7cae5b26315759cb6d12f00752" />
@@ -54034,13 +54111,14 @@ license:CC0-1.0
<description>Stickybear Shapes (version 1) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1" />
- <!--no mouse support-->
+ <!-- no mouse support -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-16-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear shapes (4am and san inc crack).dsk" size="143360" crc="68341b3c" sha1="1af87375a1b66e42d712d860bc76c9bda34813c7" />
@@ -54052,13 +54130,14 @@ license:CC0-1.0
<description>Stickybear Shapes (version 2) (4am and san inc crack)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="2" />
- <!--with mouse support-->
+ <!-- with mouse support -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-08-06-->
- <!--educational program-->
+ <!-- Dump released: 2017-08-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear shapes rev. 2 (4am and san inc crack).dsk" size="143360" crc="380d6c54" sha1="e7a79b4e470d99ff8654a744adfb567bc92ec3e1" />
@@ -54070,13 +54149,14 @@ license:CC0-1.0
<description>Stickybear Shapes (version 03-FEB-1989) (4am crack)</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="03-FEB-1989" />
<!-- This version boots from ProDOS and is dated 03-FEB-1989 according to ProDOS file metadata -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-22-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear shapes v03-feb-1989 (4am crack).dsk" size="143360" crc="6c7522b3" sha1="aa1b3a25c9abccbd403d69b97651f62e615650c7" />
@@ -54088,13 +54168,14 @@ license:CC0-1.0
<description>Stickybear Spellgrabber (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This revision has significant differences on almost every track.-->
+ <!-- This revision has significant differences on almost every track. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-23-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear spellgrabber (4am crack).dsk" size="143360" crc="9658add5" sha1="d6dd239984feef4ca271f39ba506af95debc9c1b" />
@@ -54106,13 +54187,14 @@ license:CC0-1.0
<description>Stickybear Spellgrabber (revision 3) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 3" />
- <!--This revision has significant differences on multiople tracks.-->
+ <!-- This revision has significant differences on multiople tracks. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-06-->
- <!--educational program-->
+ <!-- Dump released: 2017-11-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear spellgrabber rev. 3 (4am crack).dsk" size="143360" crc="6584a850" sha1="8298b0accb541bb529e6938108e81bd74c3adfa0" />
@@ -54124,12 +54206,13 @@ license:CC0-1.0
<description>Stickybear Town Builder (revision 1) (4am and san inc crack)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-02-15-->
- <!--educational program-->
+ <!-- Dump released: 2018-02-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear town builder (4am crack).dsk" size="143360" crc="13d89441" sha1="3a458e84d1273f5551d6239b5ecf03f13475d3e7" />
@@ -54141,12 +54224,13 @@ license:CC0-1.0
<description>Stickybear Town Builder (revision 2) (4am and san inc crack)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear town builder rev. 2 (4am and san inc crack).dsk" size="143360" crc="c973cfb4" sha1="fd49762b9b55134038dc543929316603ea023017" />
@@ -54158,12 +54242,13 @@ license:CC0-1.0
<description>Stickybear Typing (revision 1) (4am and san inc crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-16-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear typing (4am and san inc crack).dsk" size="143360" crc="aa51ec49" sha1="b352dd25f92dcbb0baf460ce02bbba525e3b73b6" />
@@ -54175,13 +54260,14 @@ license:CC0-1.0
<description>Stickybear Typing (revision 2) (4am crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This copy has significant differences on multiple tracks.-->
+ <!-- This copy has significant differences on multiple tracks. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-24-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear typing (4am crack).dsk" size="143360" crc="50f16339" sha1="d9bcb561acedb580bd510bac573390fbb4454f68" />
@@ -54193,12 +54279,13 @@ license:CC0-1.0
<description>Stickybear Typing (revision 3) (4am and san inc crack)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear typing rev. 3 (4am and san inc crack).dsk" size="143360" crc="954fd8f2" sha1="ef081a6776578eb938e56b82104d6a05923fdc57" />
@@ -54210,12 +54297,13 @@ license:CC0-1.0
<description>Stickybear Word Problems (release 1) (4am crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and V.R. Swami" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="V.R. Swami" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="release 1" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-23-->
- <!--educational program-->
+ <!-- Dump released: 2016-02-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear word problems (4am crack).dsk" size="143360" crc="47dadd98" sha1="fbb16ff6bc71f93edfd31d191d82416a19a95e47" />
@@ -54227,12 +54315,13 @@ license:CC0-1.0
<description>Stickybear Word Problems (revision 2) (4am and san inc crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and V.R. Swami" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="V.R. Swami" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-30-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear word problems rev. 2 (4am and san inc crack).dsk" size="143360" crc="4d473a6d" sha1="c4e1727629ebef9255c8b8e4a31672bd7c02b0ef" />
@@ -54240,17 +54329,35 @@ license:CC0-1.0
</part>
</software>
+ <software name="stoichio">
+ <description>Stoichiometry (4am crack)</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="J. Frazin and Partners" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="stoichiometry (4am crack).dsk" size="143360" crc="273ec5c2" sha1="55362a48f91258c9353beed4ef94b9485aedd9a3" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="stymkr64r1" cloneof="stymkr">
<description>Story Maker (revision 1, 64K) (4am crack)</description>
<year>1984</year>
<publisher>Scholastic</publisher>
- <info name="programmer" value="Mitchell Balsam, Cary Hammer, and Sandi Young" />
+ <info name="programmer" value="Mitchell Balsam" />
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Sandi Young" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-01-12. Redumped: 2021-08-28-->
- <!--Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--graphics program-->
+ <!-- Dump released: 2017-01-12. Redumped: 2021-08-28 -->
+ <!-- Disks re-cracked on August 28th, 2021 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="143360">
@@ -54258,7 +54365,7 @@ license:CC0-1.0
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Picture gallery disk"/>
+ <feature name="part_id" value="Disk 2 - Picture gallery"/>
<dataarea name="flop" size="143360">
<rom name="story maker (4am crack) picture gallery disk.dsk" size="143360" crc="7f171b17" sha1="7734b51b4971465ad936adcf5327840103c036d3" />
</dataarea>
@@ -54269,12 +54376,14 @@ license:CC0-1.0
<description>Story Maker (revision 2, 64K) (4am crack)</description>
<year>1984</year>
<publisher>Scholastic</publisher>
- <info name="programmer" value="Mitchell Balsam, Cary Hammer, and Sandi Young" />
+ <info name="programmer" value="Mitchell Balsam" />
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Sandi Young" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-16-->
- <!--graphics program-->
+ <!-- Dump released: 2023-09-16 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="143360">
@@ -54289,14 +54398,96 @@ license:CC0-1.0
</part>
</software>
+ <software name="ssscience">
+ <description>Story Starters: Science (4am crack)</description>
+ <year>1989</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="Kenneth Grey" />
+ <info name="programmer" value="Eileen Lumsden" />
+ <info name="usage" value="Requires a 128K //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="story starters - science (4am crack) disk 1 - program.dsk" size="143360" crc="aac654c1" sha1="4a6c7f872db182521c790268997d94e8a9371c4a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds"/>
+ <dataarea name="flop" size="143360">
+ <rom name="story starters - science (4am crack) disk 2 - backgrounds.dsk" size="143360" crc="dc7fb856" sha1="e96726679eac1d83d5e13f1955a5a42ae1dc1bc5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip art and borders"/>
+ <dataarea name="flop" size="143360">
+ <rom name="story starters - science (4am crack) disk 3 - clip art and borders.dsk" size="143360" crc="2431d6bb" sha1="eb62a609507075b5f8387383d3f613c9b6f4f248" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="strytree13" cloneof="strytree">
+ <description>Story Tree (version 1.3) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Master" />
+ <dataarea name="flop" size="143360">
+ <rom name="story tree v1.3 (4am and san inc crack) disk 1 - master disk.dsk" size="143360" crc="cbbf937f" sha1="81dc545b4c74680586c030f96cef20317009c70a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Story" />
+ <dataarea name="flop" size="143360">
+ <rom name="story tree v1.3 (4am and san inc crack) disk 2 - story disk.dsk" size="143360" crc="f1d39010" sha1="9e2d11c606a36f40a1e84bf7e0165197debe4def" />
+ </dataarea>
+ </part>
+ </software>
+
+
+ <software name="strytree">
+ <description>Story Tree (version 1.4) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-11. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Master"/>
+ <dataarea name="flop" size="143360">
+ <rom name="story tree v1.4 (4am crack) disk 1.dsk" size="143360" crc="5f226b9e" sha1="f6162c88b255df3cb62a8c9745b3030fb109e2cb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Story"/>
+ <dataarea name="flop" size="143360">
+ <rom name="story tree v1.4 (4am crack) disk 2.dsk" size="143360" crc="9dfb755e" sha1="ade03c019aeff9f49d56110b4a386fc88bf1c501" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="storywr">
<description>Story Writing (4am crack)</description>
<year>????</year>
<publisher>unknown</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-06-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="story writing (4am crack).dsk" size="143360" crc="c7c83201" sha1="3a058a747ab1990e2473f8dd823957c6419e88bf" />
@@ -54311,8 +54502,8 @@ license:CC0-1.0
<info name="developer" value="Microcomputer Educational Programs" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="strategies for test taking (4am crack).dsk" size="143360" crc="4ba46f0b" sha1="ae61bbf016d33f5bf19f4322ae9651f670ec7447" />
@@ -54327,8 +54518,8 @@ license:CC0-1.0
<info name="developer" value="Scott, Foresman and Company" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="strategies in problem solving - dinosaurs and squids (4am crack).dsk" size="143360" crc="ce3540e4" sha1="2dcd56124a905dca38e6cbd2bf3a8b9ad58b92c5" />
@@ -54340,11 +54531,13 @@ license:CC0-1.0
<description>Strategies in Problem Solving: Spinners and Slugs (4am crack)</description>
<year>1986</year>
<publisher>Scott, Foresman and Company</publisher>
- <info name="programmer" value="Mary Kantowski, Scott McFadden, and Kenneth Vos" />
+ <info name="programmer" value="Mary Kantowski" />
+ <info name="programmer" value="Scott McFadden" />
+ <info name="programmer" value="Kenneth Vos" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-01-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="strategies in problem solving - spinners and slugs (4am crack).dsk" size="143360" crc="46f0435b" sha1="1f95b62f7227a1a17b758a606fec7e8c333e6690" />
@@ -54352,16 +54545,95 @@ license:CC0-1.0
</part>
</software>
+ <software name="ssbaseb">
+ <description>Street Sports Baseball (4am crack)</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-15. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233452">
+ <rom name="street sports baseball (4am crack).dsk" size="143360" crc="cc8d635a" sha1="15deea6d5c1974102d1dfef92279939ed2a60cbe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssbasktbl">
+ <description>Street Sports Basketball (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-26 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="233482">
+ <rom name="street sports basketball (4am crack) side a.dsk" size="143360" crc="3e8bb908" sha1="d86e3a98d9a4b46a996030508ab7957d3d02aec1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="233482">
+ <rom name="street sports basketball (4am crack) side b.dsk" size="143360" crc="538f3ecb" sha1="df7adabeaee90c03d4b5cbbabba9f71710515d6a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssfootb">
+ <description>Street Sports Football (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Paul Nickels" />
+ <info name="programmer" value="Michael Polan" />
+ <info name="programmer" value="Kevin Quinlan" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-20. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="233487">
+ <rom name="street sports football (4am crack) side a.dsk" size="143360" crc="33db53eb" sha1="0afbee6c35e83a1a22c00d9108548491983671c7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="233487">
+ <rom name="street sports football (4am crack) side b.dsk" size="143360" crc="f3f60b56" sha1="cd04f6f2898c86d8a186e9160b1f12a89a694c05" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sssoccer">
+ <description>Street Sports Soccer (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Paul Nickels" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-07-22 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233482">
+ <rom name="street sports soccer (4am crack).dsk" size="143360" crc="bf278771" sha1="11631b48cb0b18a9e5fcc7980d66c43bcf80a2be" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="spoker">
<description>Strip Poker (4am crack)</description>
<year>1982</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Roger Harnish and Joanne Adams"/>
+ <info name="programmer" value="Roger Harnish" />
+ <info name="programmer" value="Joanne Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-08-->
- <!--Includes two add-on disks for additional opponents.-->
- <!--card game-->
+ <!-- Dump released: 2021-04-08 -->
+ <!-- Includes two add-on disks for additional opponents. -->
+ <!-- card game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Master disk"/>
<dataarea name="flop" size="143360">
@@ -54382,16 +54654,151 @@ license:CC0-1.0
</part>
</software>
+ <software name="students">
+ <description>Student Stories (A-152 version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-152" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a152 student stories v1.0 (4am crack).dsk" size="143360" crc="771d4d5f" sha1="0e36efe2e999662032465d9c17086a0f17ea234d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="studygui14" cloneof="studygui">
+ <description>Study Guide (A-126 version 1.4) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-126" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a126 study guide v1.4 (4am crack).dsk" size="143360" crc="ce5dcb2c" sha1="a032305a26620bfc1b6037e31444c442bd4f2ec1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="studygui">
+ <description>Study Guide (A-126 version 1.5) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-126" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a126 study guide v1.5 (4am crack) disk 1 - program.dsk" size="143360" crc="ce0f7fd0" sha1="f225f519109453cbfba80e4bd605b6ff5d3acc15"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data master"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a126 study guide v1.5 (4am crack) disk 2 - data master.dsk" size="143360" crc="4bc0b40e" sha1="b0158d83f12cd5266e18e1ff367449a063c43141"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="subbatl">
+ <description>Sub Battle Simulator (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Digital Illusions" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-28. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="233456">
+ <rom name="sub battle simulator (4am crack) side a.dsk" size="143360" crc="48b4c5b5" sha1="2f60262420104e7f93c9ff562100ab92f318b456" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="233456">
+ <rom name="sub battle simulator (4am crack) side b.dsk" size="143360" crc="e46c7a02" sha1="113b1e87e2685dfcb40c4824e39362e5ac6bcff4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="submissn">
+ <description>Sub Mission (4am crack)</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sub mission (4am crack).dsk" size="143360" crc="cad5e0f2" sha1="f72716872680591d938c2a8509016841bcae6714" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="subbbear">
+ <description>Subtract with Balancing Bear (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Gail Marshall" />
+ <info name="programmer" value="David Findley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="subtract with balancing bear (4am crack).dsk" size="143360" crc="c8666766" sha1="30667ba2ab81f5e219ad7bbc8d7f284f4857c4dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="submxfrc">
+ <description>Subtracting Mixed Fractions (version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="subtracting mixed fractions (4am crack).dsk" size="143360" crc="92c2e0a5" sha1="4257e95087cd0a4876885688980e95fd1686a641" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="swaadvleq">
<description>Success with Algebra: Advanced Linear Equations (4am crack)</description>
<year>1984</year>
<publisher>Mindscape</publisher>
- <info name="developer" value="Microcomputer Workshops" />
- <info name="programmer" value="Mark S. Appel and Don Ross" />
+ <info name="developer" value="Microcomputer Workshops Courseware" />
+ <info name="programmer" value="Mark S. Appel" />
+ <info name="programmer" value="Don Ross" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-30-->
- <!--educational program-->
+ <!-- Dump released: 2024-04-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="success with algebra- advanced linear equations (4am crack).dsk" size="143360" crc="91e85e00" sha1="5e9f599fc98dd3837411d56fb36082e842c93c6b" />
@@ -54403,12 +54810,12 @@ license:CC0-1.0
<description>Success with Math: Addition/Subtraction (4am crack)</description>
<year>1983</year>
<publisher>CBS Software</publisher>
- <info name="developer" value="Microcomputer Workshops" />
+ <info name="developer" value="Microcomputer Workshops Courseware" />
<info name="programmer" value="Don Ross" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-08-14-->
- <!--educational program-->
+ <!-- Dump released: 2016-08-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="success with math - addition and subtraction (4am crack).dsk" size="143360" crc="181ec604" sha1="4f77e077a42a8ea518ec95a2306a10a5399d8b15" />
@@ -54420,12 +54827,12 @@ license:CC0-1.0
<description>Success with Math: Multiplication/Division (4am crack)</description>
<year>1984</year>
<publisher>CBS Software</publisher>
- <info name="developer" value="Microcomputer Workshops" />
+ <info name="developer" value="Microcomputer Workshops Courseware" />
<info name="programmer" value="Don Ross" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-05-03-->
- <!--educational program-->
+ <!-- Dump released: 2024-05-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="success with math- multiplication and division (4am crack).dsk" size="143360" crc="f9dd7641" sha1="20b5be1f87e65145631f8fd0409ab697acc492b6" />
@@ -54437,12 +54844,12 @@ license:CC0-1.0
<description>Success with Math: Multiplying/Dividing Fractions (4am crack)</description>
<year>1984</year>
<publisher>Mindscape</publisher>
- <info name="developer" value="Microcomputer Workshops" />
+ <info name="developer" value="Microcomputer Workshops Courseware" />
<info name="programmer" value="Don Ross" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-09-19-->
- <!--educational program-->
+ <!-- Dump released: 2015-09-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="success with math - multiplying and dividing fractions (mindscape) (4am crack).dsk" size="143360" crc="12d209a2" sha1="6affb4e4b4b5a36692621b9dbc634d1a7a19aca8" />
@@ -54450,15 +54857,199 @@ license:CC0-1.0
</part>
</software>
+ <software name="succread">
+ <description>Success with Reading (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Mitch Balsam" />
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Priscilla Lynch" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-27 -->
+ <!-- educational program -->
+ <!-- Story disks level C-F were present, which suggests A and B exist. They were not present and are assumed missing. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) program disk.dsk" size="143360" crc="8e6f761a" sha1="17c7d65441645e74c0312c973fb9671724955f62" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Story disk level C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) story disk c.dsk" size="143360" crc="4605523f" sha1="5013c4de4948288866a8abcd4d80c8157733843b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Story disk level D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) story disk d.dsk" size="143360" crc="b0c5b861" sha1="92086206f8fc0ceb6ee37161a7f22fbb585f2ee5" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Story disk level E"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) story disk e.dsk" size="143360" crc="83ca09d1" sha1="0a4e80ff3be843928597e972d26af7e4225ae0ff" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Story disk level F"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) story disk f.dsk" size="143360" crc="f55bf4d6" sha1="5eb4107c97e1e6b63615d5b7e69432328aeb2142" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Story disk level A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) story disk a.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Story disk level B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with reading (4am crack) story disk b.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="succtype19860512" cloneof="succtype">
+ <description>Success with Typing (version 1.2 1986-05-12) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Mitchell Balsam" />
+ <info name="programmer" value="Mitchell Balsam" />
+ <info name="programmer" value="David K. Lew" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <info name="version" value="1.2 1986-05-12" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-04 -->
+ <!-- educational program -->
+ <!-- Side 3 and 4 are missing. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing (4am crack) side a.dsk" size="143360" crc="8ad64c2c" sha1="422b72421fe44c0dd07e56f97903321b8903ffda" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing (4am crack) side b.dsk" size="143360" crc="6dab5c54" sha1="fe02f36c0e0d808b2ed420c68060adf5820f81d0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing (4am crack) side c.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing (4am crack) side d.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="succtype">
+ <description>Success with Typing (version 1.2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Mitchell Balsam" />
+ <info name="programmer" value="Mitchell Balsam" />
+ <info name="programmer" value="David K. Lew" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-07. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing v1.2 (4am crack) disk 1.dsk" size="143360" crc="0071b309" sha1="20a8ae0ed67dfd9b886b8a01e50735d50e0f7d7e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing v1.2 (4am crack) disk 2.dsk" size="143360" crc="c544dbaa" sha1="cd3c42d857ce31edbb334c973430df83423fc060" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing v1.2 (4am crack) disk 3.dsk" size="143360" crc="ace237b3" sha1="48ba18c3d314d754337ae4a30ae2926c8bc643db" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with typing v1.2 (4am crack) disk 4.dsk" size="143360" crc="a1cfc2a2" sha1="51be8e51fc6c7106b91a3660463812a12fd36193" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="succwrt">
+ <description>Success with Writing: The PACE Writing Program (4am crack)</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Gwen Solomon" />
+ <info name="programmer" value="Philip Miller" />
+ <info name="programmer" value="Betsy Gitelle" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with writing (4am crack) disk 1.dsk" size="143360" crc="adee2f43" sha1="56480fd19f47ebb7d32cc4b19f6fbc5d892a978a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with writing (4am crack) disk 2.dsk" size="143360" crc="8947b8e5" sha1="ef79c4974778dab6872cdcfb1a2625e32418b09b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with writing (4am crack) disk 3.dsk" size="143360" crc="b76c16db" sha1="a166d0530951980d7a53b9bf4da76408649c0947" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with writing (4am crack) disk 4.dsk" size="143360" crc="2f26ec45" sha1="511f14ea38101a160a148f3eec0ba97ce5b676a8" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5"/>
+ <dataarea name="flop" size="143360">
+ <rom name="success with writing (4am crack) disk 5.dsk" size="143360" crc="ba846c19" sha1="0f6eb0da6766912f401f3cd30f901a48ad409a71" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sumducks">
<description>Sum Ducks (4am crack)</description>
<year>1984</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Barbara Jasinki, Diane Downie, Mark Ravitz, Bryan Moss, Marge Boots" />
- <info name="usage" value="Runs on any Apple IIc or later." />
+ <info name="programmer" value="Barbara Jasinki" />
+ <info name="programmer" value="Diane Downie" />
+ <info name="programmer" value="Mark Ravitz" />
+ <info name="programmer" value="Bryan Moss" />
+ <info name="programmer" value="Marge Boots" />
+ <info name="usage" value="Runs on any Apple //c or later." />
<sharedfeat name="compatibility" value="A2C,A2GS" />
- <!--Dump released: 2015-10-16-->
- <!--educational program-->
+ <!-- Dump released: 2015-10-16 -->
+ <!-- educational program -->
+ <!-- This was also shipped with side B, Prime Ducks. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sum ducks (4am crack).dsk" size="143360" crc="0838572d" sha1="bc04d30512bac66d6e1fdf80eaef7ae00ecc4ffd" />
@@ -54466,6 +55057,112 @@ license:CC0-1.0
</part>
</software>
+ <software name="sumrgame">
+ <description>Summer Games (4am crack)</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Scott Nelson" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="Erin Murphy" />
+ <info name="programmer" value="Jon Leupp" />
+ <info name="programmer" value="Stephen Mudry" />
+ <info name="programmer" value="Randy Glover" />
+ <info name="programmer" value="Brian McGhie" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Kevin McClard" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="233577">
+ <rom name="summer games (4am crack) side a.dsk" size="143360" crc="c9206d00" sha1="333ef64b3f4e298b2a8932b2136340cba3f28a4a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="233577">
+ <rom name="summer games (4am crack) side b.dsk" size="143360" crc="6111ca55" sha1="1583cb362351d052c78e8b9426fde56f4e80a1c3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sumrgame2">
+ <description>Summer Games II (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="John Leupp" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="programmer" value="Larry Clague" />
+ <info name="programmer" value="Scott Nelson" />
+ <!-- see #14146 below marked as "ported to the Apple ][ by" -->
+ <info name="programmer" value="John Stouffer" />
+ <info name="programmer" value="Jeff Webb" />
+ <info name="programmer" value="Doug Matson" />
+ <info name="programmer" value="Greg Broniak" />
+ <info name="programmer" value="Tim Grost" />
+ <info name="programmer" value="Matt Decker" />
+ <info name="programmer" value="Vera Petrusha" />
+ <info name="programmer" value="Ken Evans" />
+ <info name="programmer" value="Dr. Keith Dreyer" />
+ <info name="programmer" value="Chris Oesterling" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-05. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="234963">
+ <rom name="summer games ii (4am crack) disk 1.dsk" size="143360" crc="20cab818" sha1="25b9ddc09c56ee6e0d785111aaf458c6cc676750" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="234963">
+ <rom name="summer games ii (4am crack) disk 2.dsk" size="143360" crc="e32eec49" sha1="24fa696c3e00b0aa865df2a15016ba8dfc742418" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprearc">
+ <description>Super Ear Challenger (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="alt_title" value="Super Challenger" />
+ <info name="programmer" value="Stephen L. Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- The 1984 version does not use MIDI, but the 1985 version requires it. -->
+ <!-- Dump released: 2022-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="super ear challenger- a music game (4am crack).dsk" size="143360" crc="461f0401" sha1="5002c1a3c9de2dc015fb46746f105dbec1c0a145"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swrdf386">
+ <description>Super Wordfind (version 03.13.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Phil Mansour" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="03.13.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="super wordfind v03.13.86 (4am crack).dsk" size="143360" crc="25e2b5f9" sha1="12f99f54097f495761b2d735a1efd16f32d2ce49" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="st2wordp">
<description>Super-Text II Word Processor (4am crack)</description>
<year>1980</year>
@@ -54473,8 +55170,8 @@ license:CC0-1.0
<info name="programmer" value="E. Zaron" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-27-->
- <!--productivity program-->
+ <!-- Dump released: 2017-11-27 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="super-text ii (4am crack).dsk" size="143360" crc="9177353e" sha1="2262bbd074c2fe48e86bec1951286ee0a3120e45" />
@@ -54484,14 +55181,14 @@ license:CC0-1.0
<software name="st2formlm81" cloneof="st2formlm">
<description>Super-Text II Form Letter Module (4am crack)</description>
- <!--Requires Super-Text II-->
+ <!-- Requires Super-Text II -->
<year>1981</year>
<publisher>MUSE Software</publisher>
<info name="programmer" value="E. Zaron" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-27-->
- <!--productivity program-->
+ <!-- Dump released: 2017-11-27 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="super-text ii form letter module (4am crack).dsk" size="143360" crc="b9c1b20b" sha1="1c53cae6534230925e9ccb61440828d8855d0991" />
@@ -54501,14 +55198,14 @@ license:CC0-1.0
<software name="st2formlm">
<description>Super-Text II Form Letter Module (version 1984) (4am crack)</description>
- <!--Requires Super-Text II-->
+ <!-- Requires Super-Text II -->
<year>1984</year>
<publisher>MUSE Software</publisher>
<info name="programmer" value="E. Zaron" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-17-->
- <!--productivity program-->
+ <!-- Dump released: 2023-09-17 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="super-text ii form letter module 1984 (4am crack).dsk" size="143360" crc="931075dd" sha1="18076b7d34370a7cbe7cf24daea1c402b8fb37af" />
@@ -54516,18 +55213,143 @@ license:CC0-1.0
</part>
</software>
+ <software name="supermap">
+ <description>Supermap (Softsmith) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Sonoma Softworks" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <!-- Softsmith re-release -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="supermap (softsmith) (4am and san inc crack).dsk" size="143360" crc="d1b8f173" sha1="a3ce2a132cfc51075d2d9a7aad587ff33f190514"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprprnt10" cloneof="suprprnt">
+ <description>SuperPrint! (version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="David Shearer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-06-13 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="superprint (4am crack) disk 1 side a - program.dsk" size="143360" crc="a57a8219" sha1="042596fc400879bc651fdfadba547979aa673d3b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Work area"/>
+ <dataarea name="flop" size="143360">
+ <rom name="superprint (4am crack) disk 1 side b - work area.dsk" size="143360" crc="3bfe12bb" sha1="eaff8b484825fe49978009a1b057bc281fb53687" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Clip art and fonts"/>
+ <dataarea name="flop" size="143360">
+ <rom name="superprint (4am crack) disk 2 side a - clip art and fonts.dsk" size="143360" crc="b88e7013" sha1="3ca61b56c8f4f53477587259f4b9ca7f6d87e273" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Backgrounds"/>
+ <dataarea name="flop" size="143360">
+ <rom name="superprint (4am crack) disk 2 side b - backgrounds.dsk" size="143360" crc="fb645c62" sha1="3231fdd06d35843a60daaaa044d812aa8de6a091" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Poster art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="superprint (4am crack) disk 3 side a - poster art.dsk" size="143360" crc="c9358f37" sha1="c7956ca43c12acc04874191761fb37a5c70b60ee" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Banners"/>
+ <dataarea name="flop" size="143360">
+ <rom name="superprint (4am crack) disk 3 side b - banners.dsk" size="143360" crc="73f3a0a6" sha1="25d8918c8ea9adfdee10052e7f9a8bdc732bf281" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprprnt">
+ <description>SuperPrint! (version 1.2) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="David Shearer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="superprint v1.2 (4am crack) disk 1a.dsk" size="143360" crc="f41c3b2b" sha1="507f9c1fa28f232feccdb4b04e68d0437b5f820f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="superprint v1.2 (4am crack) disk 1b.dsk" size="143360" crc="3bfe12bb" sha1="eaff8b484825fe49978009a1b057bc281fb53687" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="superprint v1.2 (4am crack) disk 2a.dsk" size="143360" crc="56860736" sha1="377dc899063046a99cc9b5db6e6a1d38ce8ca0c5" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="superprint v1.2 (4am crack) disk 2b.dsk" size="143360" crc="89e0eccf" sha1="7adfdd4f4c381758c445082fab63286ae89e63ba" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="superprint v1.2 (4am crack) disk 3a.dsk" size="143360" crc="feedddc3" sha1="b85eb15e36aafb401f0d51be8e07c4f23777c45a" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="superprint v1.2 (4am crack) disk 3b.dsk" size="143360" crc="73f3a0a6" sha1="25d8918c8ea9adfdee10052e7f9a8bdc732bf281" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="amzthgf" cloneof="amzthg">
<description>Sur les traces du Deirdron (French) (4am crack)</description>
- <!--French version of "In Search of the Most Amazing Thing". Has additional content.-->
+ <!-- French version of "In Search of the Most Amazing Thing". Has additional content. -->
<year>1984</year>
<publisher>Ediciel</publisher>
<info name="alt_title" value="In Search of the Most Amazing Thing"/>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder and Omar H. Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar H. Khudari" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-07-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Program"/>
<dataarea name="flop" size="143360">
@@ -54542,16 +55364,71 @@ license:CC0-1.0
</part>
</software>
+ <software name="srvytakr">
+ <description>Survey Taker (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="survey taker (4am crack).dsk" size="143360" crc="39ebac7e" sha1="6e8fa4b5b9c91a9127d5eae0f1a5b1efd6dcb378" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="survmath">
+ <description>Survival Math (version 2.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Walter Koetke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="survival math (4am crack).dsk" size="143360" crc="0965ef15" sha1="e66d1ab9f5b0f244f5cbdb0f0d03c3c850e29aff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swfrobin">
+ <description>Swiss Family Robinson (4am crack)</description>
+ <year>1984</year>
+ <publisher>Windham Classics</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-12. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="swiss family robinson (4am crack).dsk" size="143360" crc="1cd108f6" sha1="f072c4dcb9bcc05289927adc55da5cd79170185b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="take106401" cloneof="take1">
<description>Take 1 (version 06401) (4am crack)</description>
<year>1984</year>
<publisher>Baudville</publisher>
- <info name="programmer" value="Maurizio Barbatano, Michael Darooge, Edward McCullough, and David Walker" />
+ <info name="author" value="Maurizio Barbatano" />
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="06401" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="06401" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-03-->
- <!--graphics program-->
+ <!-- Dump released: 2022-07-03 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="take 1 v06401 (4am crack).dsk" size="143360" crc="67154f3c" sha1="f8bff8aa05cab804565ba9fb60f8c6f3afb1676d"/>
@@ -54563,12 +55440,16 @@ license:CC0-1.0
<description>Take 1 (version 06431) (4am crack)</description>
<year>1984</year>
<publisher>Baudville</publisher>
- <info name="programmer" value="Maurizio Barbatano, Michael Darooge, Edward McCullough, and David Walker" />
+ <info name="author" value="Maurizio Barbatano" />
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="06431" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="06431" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-06-->
- <!--graphics program-->
+ <!-- Dump released: 2022-07-06 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="take 1 v06431 (4am crack).dsk" size="143360" crc="73f51412" sha1="cac16ea03b20159beb5de33b4ce63a35e13bc47e" />
@@ -54580,12 +55461,16 @@ license:CC0-1.0
<description>Take 1 (version 06451) (4am crack)</description>
<year>1984</year>
<publisher>Baudville</publisher>
- <info name="programmer" value="Maurizio Barbatano, Michael Darooge, Edward McCullough, and David Walker" />
+ <info name="author" value="Maurizio Barbatano" />
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="06451" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="06451" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-20-->
- <!--graphics program-->
+ <!-- Dump released: 2014-08-20 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="take 1 v06451 (4am crack).dsk" size="143360" crc="b6b0ce44" sha1="ff5894b8ef2fd0642e08a2ed7fa85f3efc9f045e" />
@@ -54593,15 +55478,98 @@ license:CC0-1.0
</part>
</software>
+ <software name="tkchance_525">
+ <description>Take a Chance! (A-317 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-317" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a317 take a chance v1.0 (4am crack).dsk" size="143360" crc="4d51c5d8" sha1="741adf2c268cf2ab87bf77b15585e6b3476223d6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="takenrth">
+ <description>Take Me North (4am crack)</description>
+ <year>1985</year>
+ <publisher>World Book</publisher>
+ <info name="developer" value="Synergistic Software"/>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="take me north (4am crack).dsk" size="143360" crc="956ec497" sha1="8b6e02aef35c165b742efc7b0a4d96573a9e4309"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tchances">
+ <description>Taking Chances (4am crack)</description>
+ <year>1991</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Gail Marshall" />
+ <info name="programmer" value="David Findley" />
+ <info name="programmer" value="Steve Bunton" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="taking chances (4am crack).dsk" size="143360" crc="5f40bcdd" sha1="7fc9826cf8caf679a0d176d142ec51315ace5eac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talehist">
+ <description>Tales from History (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Deborah Gore" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-19 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - The Shot Heard 'Round the World"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales from history (4am crack) side a.dsk" size="143360" crc="a64e265b" sha1="9f69e9fa49c9726c9a0d3b5e0f62f04457e7919b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Wagons West"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales from history (4am crack) side b.dsk" size="143360" crc="f256aaa9" sha1="16d8f98878c4f62985c983ecd093049ab6d9423b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tarabn">
<description>Tales From The Arabian Nights (4am crack)</description>
<year>1985</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Jack Alexander and June Stark" />
+ <info name="programmer" value="Jack Alexander" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-18-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -54616,6 +55584,316 @@ license:CC0-1.0
</part>
</software>
+ <software name="taledisc">
+ <description>Tales of Discovery (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Loretta Jones" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-06 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Pirates of the Soft Seas"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales of discovery (4am and san inc crack) side a.dsk" size="143360" crc="a3feb079" sha1="e670a5ea6584e98cad5a56563aecb0f5d8fbe3e3"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Fossils Alive!"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales of discovery (4am and san inc crack) side b.dsk" size="143360" crc="22a0b7c9" sha1="e840ad24ab23df0723ba2f409ec57b3bcf3cbae9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talefant">
+ <description>Tales of Fantasy (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Mark A. Malamud" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - The Dark Tower"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales of fantasy (4am crack) side a.dsk" size="143360" crc="dea088a1" sha1="97ad29b941c97f190af590b77c6500328c29c140" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - The Frog and the Fables"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales of fantasy (4am crack) side b.dsk" size="143360" crc="252b3eb3" sha1="c040600a7bdd9af3abc3923172fec56e8c974c98" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talemyst">
+ <description>Tales of Mystery (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Ame C. Flynn" />
+ <info name="programmer" value="Lorene Lovara" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-12. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Haunted House" />
+ <dataarea name="flop" size="143360">
+ <rom name="tales of mystery (4am crack) side a.dsk" size="143360" crc="d224b681" sha1="cad83b5f79aa6f4b08e244bd37728d6eab8fe0c1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Mystery at Pinecrest Manor" />
+ <dataarea name="flop" size="143360">
+ <rom name="tales of mystery (4am crack) side b.dsk" size="143360" crc="150d40f5" sha1="f0d3bf7a77a4c5db3c98a6435d6d3881cbdbab87" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tsuspens">
+ <description>Tales of Suspense (4am crack)</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Mark A. Malamud" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - History Mystery"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales of suspense (4am crack) disk 1.dsk" size="143360" crc="02cd704c" sha1="cc0ed5bde82a18c764b9d7345be3665d6d81e2e3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - The Big Nap"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tales of suspense (4am crack) disk 2.dsk" size="143360" crc="126a5ba2" sha1="1549345908e42a0b05596aa0eef821617e1fb78a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tlktxtwr">
+ <description>Talking Text Writer (4am crack)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Teresa J. Rosegrant" />
+ <info name="programmer" value="Russell A. Cooper" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Read disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talking text writer (4am crack) disk 1 - read disk.dsk" size="143360" crc="94485949" sha1="951ede69ce52471ce4e794b7cd219512b523468d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Write disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talking text writer (4am crack) disk 2 - write disk.dsk" size="143360" crc="22fa928e" sha1="3ccd1ab6dfa71892561f36677faef0cd8f24a414" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - File disk maker"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talking text writer (4am crack) disk 3 - file disk maker.dsk" size="143360" crc="2be691ab" sha1="a198258f292bced857326a0342a41babcb67e82d" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Sample files"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talking text writer (4am crack) disk 4 - sample files.dsk" size="143360" crc="93439f1f" sha1="1259355409ca34031e956c7c4bcd97af205391d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talisman">
+ <description>Talisman: Challenging the Sands of Time (4am crack)</description>
+ <year>1987</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Bruce X. Hoffman" />
+ <info name="programmer" value="Ray Redlich" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Jeffrey A. Jay" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talisman (4am crack) disk 1 - boot.dsk" size="143360" crc="775a823a" sha1="74896efb208edec2e42c9f1a62b74d06f0600110" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Empire"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talisman (4am crack) disk 2 - empire.dsk" size="143360" crc="77660e58" sha1="3daf907bdab65e930d9a1ffd62dab3326e09841d" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Lands beyond"/>
+ <dataarea name="flop" size="143360">
+ <rom name="talisman (4am crack) disk 3 - lands beyond.dsk" size="143360" crc="214ff3b5" sha1="0ddcfbd830e431988e96c19382a247bb232931e1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tangrams">
+ <description>Tangrams Puzzler (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="Ken Coates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tangrams puzzler (4am crack).dsk" size="143360" crc="1e6b80a7" sha1="39c3d1cf3013c610aed92a128eeaee1016fe62bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tnkadthr">
+ <description>Tank Attack &amp; Death Run (4am crack)</description>
+ <year>1980</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="developer" value="The SoftWizard" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-15 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tank attack and death run (4am crack).dsk" size="143360" crc="f0dd901b" sha1="fabf685b8939c2597d3fad42c6015925f02161de" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tapit">
+ <description>Tap-It (4am crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tap-it (4am crack).dsk" size="143360" crc="193c5293" sha1="3e4afbef063161782d66533c73c609682b301061"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgtang">
+ <description>Targets: A Number Game (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="T.C. O'Brien II" />
+ <info name="programmer" value="Andrew Lorenz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="targets - a number game (4am crack).dsk" size="143360" crc="a304971a" sha1="dc244cc833a153153628c35c59fb47b92795dd38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor11_525" cloneof="teachopor">
+ <description>Teacher Option Organizer (A-242 version 1.1) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a242 teacher option organizer v1.1 (4am crack).dsk" size="143360" crc="210ceb4e" sha1="43ac6f0d1e8c680bb2b5aecddf2d0e8aa00c1b45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor12_525" cloneof="teachopor">
+ <description>Teacher Option Organizer (A-242 version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a242 teacher option organizer v1.2 (4am crack).dsk" size="143360" crc="ff67fab9" sha1="26138a626fd6e35e64f16e48a263e46c94c44f80"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor">
+ <description>Teacher Option Organizer (A-242 version 1.3) (4am crack)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a242 teacher option organizer v1.3 (4am crack).dsk" size="143360" crc="befcbe79" sha1="dfb4052dfeadc2fb511aa88bdcfd9036521cca27" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="teachpet">
<description>Teacher's Pet (4am crack)</description>
<year>1980</year>
@@ -54623,8 +55901,8 @@ license:CC0-1.0
<info name="programmer" value="Arthur Walsh" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="teacher's pet (4am crack).dsk" size="143360" crc="0ad5aa13" sha1="369227da4d19f606223a4ef021ee24f6f5a7cc88" />
@@ -54632,15 +55910,106 @@ license:CC0-1.0
</part>
</software>
+ <software name="tvocscih">
+ <description>TEAM Vocabulary: Science and Health (version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="L. House" />
+ <info name="programmer" value="F. Schwartz" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="team vocabulary - science and health 800k (4am crack).2mg" size="819264" crc="6874ecc3" sha1="67b48476a3dc66854fa1b0a2ede529c69cec2f6d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tbtpapsol">
+ <description>Teasers by Tobbs: Puzzles and Problem Solving (version 1.3) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="teasers by tobbs (4am crack).dsk" size="143360" crc="d354ddfd" sha1="6281aa8a61ccb1cf283e966131fd30c6563265f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ttobbsin">
+ <description>Teasers by Tobbs with Integers (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="James Kim" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="teasers by tobbs with integers (4am crack).dsk" size="143360" crc="0ced537c" sha1="0ad12ba372980e039b0945aa61905a123f29d7be" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tdyniggy87" cloneof="tdyniggy">
+ <description>Teddy and Iggy (4am crack)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Dara P. Meas" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="teddy and iggy (4am crack).dsk" size="143360" crc="e059e702" sha1="bbce6c52a00fc22fdf45b0813149ac8d563a1e78" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tdyniggy">
+ <description>Teddy and Iggy (version 30-JUN-1989) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Dara P. Meas" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="30-JUN-1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="teddy and iggy 1989 (4am crack).dsk" size="143360" crc="d56b39b4" sha1="606c548f1aaf221a507af2d5e1a1c27e7157fb6a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tedbearl">
<description>Teddy Bear-rels of Fun (4am crack)</description>
<year>1987</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Ahead Designs" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-23-->
- <!--graphics program-->
+ <!-- Dump released: 2015-08-23 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -54659,11 +56028,16 @@ license:CC0-1.0
<description>Teddy Takes a Rain Walk (4am crack)</description>
<year>1989</year>
<publisher>Jostens Learning Corporation</publisher>
- <info name="programmer" value="Janis Stevenson, Henry F. Olds, Jr., Laura F. Koller, Betty Bardige, Jon Madian, and Karen Jostad" />
+ <info name="programmer" value="Janis Stevenson" />
+ <info name="programmer" value="Henry F. Olds, Jr." />
+ <info name="programmer" value="Laura F. Koller" />
+ <info name="programmer" value="Betty Bardige" />
+ <info name="programmer" value="Jon Madian" />
+ <info name="programmer" value="Karen Jostad" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -54678,6 +56052,40 @@ license:CC0-1.0
</part>
</software>
+ <software name="teddypg">
+ <description>Teddy's Playground (version 1989) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="teddy's playground 1989 (4am crack).dsk" size="143360" crc="80deccb7" sha1="bfa611ba323010c24b7c84c0311baf0bb95d6218"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tenclues">
+ <description>Ten Clues (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ten clues (4am crack).dsk" size="143360" crc="7d7794a9" sha1="9c704dd378e23396b136026bd4c06843780285a0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tstconstrev">
<description>Test Construction and Review (4am crack)</description>
<year>1982</year>
@@ -54685,8 +56093,8 @@ license:CC0-1.0
<info name="programmer" value="Andrew Bear" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="test construction and review (4am crack).dsk" size="143360" crc="38a02ff4" sha1="a18fdec962e5405f554d49a812741c7de06371a5" />
@@ -54694,6 +56102,175 @@ license:CC0-1.0
</part>
</software>
+ <software name="tetrad">
+ <description>Tetrad (4am crack)</description>
+ <year>1981</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Phillip Hess" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-28 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tetrad (4am crack).dsk" size="143360" crc="a4be8830" sha1="a63a62afe40f9ebc58c020e5512c44d52ca5c37b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thatjobl1">
+ <description>That's My Job: Level 1 (version 02.08.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Judy Priven" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="02.08.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="that's my job level 1 (4am crack) disk 1.dsk" size="143360" crc="7e14f0dc" sha1="f15263f33f51004811c55dde99ad19cd021f1657" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="that's my job level 1 (4am crack) disk 2.dsk" size="143360" crc="3ddf705b" sha1="65363301cb29f0c821dcb329808d6fbc452abd94" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="plyrdmus">
+ <description>The 21st Century Music Series: Playing and Reading Music (4am crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="programmer" value="Henry Levy" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2022-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="playing and reading music (4am crack) disk 1.dsk" size="143360" crc="eaeb5ac1" sha1="ba313892322d045160cfe623330c8fdaf6f591d7"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="playing and reading music (4am crack) disk 2.dsk" size="143360" crc="673ffe87" sha1="ce7529d7e0f890d65a914b3a2a485ac7db095610"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="playing and reading music (4am crack) disk 3.dsk" size="143360" crc="85172747" sha1="f0ac3b037273682f668486733108554e169e06d6"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Supplemental Songs"/>
+ <dataarea name="flop" size="143360">
+ <rom name="playing and reading music (4am crack) disk 4.dsk" size="143360" crc="1ac3aab4" sha1="4864efcbdf539e896e2f8961e3c10fd3d37cf0af"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="buckbanz">
+ <description>The Adventures of Buckaroo Banzai: Across The 8th Dimension! (version G 397) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Phillip Case" />
+ <info name="programmer" value="Mak Jukic" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="G 397" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2026-01-07 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="the adventures of buckaroo banzai across the 8th dimension (4am crack) side a.dsk" size="143360" crc="6867caba" sha1="e4724bf9c1802aece4cc3778ba798cd8f8205f32" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="the adventures of buckaroo banzai across the 8th dimension (4am crack) side b.dsk" size="143360" crc="b2af5b2f" sha1="a8a25e7d1de44850680c4662bf650b3152cb126d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amchal">
+ <description>The American Challenge: A Sailing Simulation (trex and 4am crack)</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-07-21 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="american challenge, the (1986)(mindscape)(trex crack).dsk" size="143360" crc="26af56f8" sha1="89d4c5c1a232a0c6ef1960d9da0e05e626890e55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="artowar">
+ <description>The Ancient Art of War (version 1989) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Murray" />
+ <info name="programmer" value="Barry Murray" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1989" />
+ <!-- 1989 re-release -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the ancient art of war (4am crack) side a.dsk" size="143360" crc="060a106c" sha1="76dc6662fa70235d61916cefcc52c6d7a16bc8ba" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the ancient art of war (4am crack) side b.dsk" size="143360" crc="f7b680cb" sha1="5b611e6a4225d61f3a785a3b9f880cf1b3478d66" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aawarsea">
+ <description>The Ancient Art of War at Sea (4am crack)</description>
+ <year>1988</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Murray" />
+ <info name="programmer" value="Barry Murray" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-28. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="235525">
+ <rom name="the ancient art of war at sea (4am crack) side a.dsk" size="143360" crc="79caaf56" sha1="cb9f704d2b9acb86d18360c2e7776e89b5226d24" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="235525">
+ <rom name="the ancient art of war at sea (4am crack) side b.dsk" size="143360" crc="2e2ca6d4" sha1="699798ce9e02d484b3dce48d27b5604eaf1ef6c5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="artcomm2">
<description>The Art of Communication 2 (4am crack)</description>
<year>1989</year>
@@ -54701,8 +56278,8 @@ license:CC0-1.0
<info name="developer" value="Psychological Psoftware" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-07-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the art of communication 2 (4am crack).dsk" size="143360" crc="cc7d9321" sha1="14550e883041064036093f7277f2543b3d52b289" />
@@ -54710,15 +56287,33 @@ license:CC0-1.0
</part>
</software>
+ <software name="artist13">
+ <description>The Artist (version 1.3) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Warren Schwader" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- 2018-01-26 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the artist v1.3 (4am and san inc crack).dsk" size="143360" crc="bfe92a58" sha1="356118132dd9b3f18279b6f50eb2c7f0f79090b8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="banksim">
<description>The Banking Simulation (4am crack)</description>
<year>1983</year>
<publisher>EMC Publishing</publisher>
- <info name="programmer" value="Kristen Wagner and Sanjeev Phukan" />
+ <info name="programmer" value="Kristen Wagner" />
+ <info name="programmer" value="Sanjeev Phukan" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-01-->
- <!--educational program-->
+ <!-- Dump released: 2023-01-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the banking simulation (4am crack).dsk" size="143360" crc="a037d512" sha1="e7825302e0658e0b67d428a052a000fde8bc353f" />
@@ -54726,16 +56321,55 @@ license:CC0-1.0
</part>
</software>
+ <software name="bswexp">
+ <description>The Bank Street Writer Expanded (version 2.2) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-17. Redumped: 2021-08-28 due to subtle timing differences and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bank street writer expanded v2.2 (4am crack).dsk" size="143360" crc="6f5c9ced" sha1="07486f52eb8355494e72ed2fc4fcdfe8b3b13ed0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswexptut">
+ <description>The Bank Street Writer Expanded Tutorial (version 2.2) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-17. Redumped: 2021-08-28 due to subtle timing differences and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="bank street writer expanded tutorial v2.2 (4am crack).dsk" size="143360" crc="23adadb3" sha1="9cbd40664e6ad1da4134bf891ddf0e1e5d29bca9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="banktut">
<description>The Banking Tutorial (version 5.2) (4am crack)</description>
<year>1983</year>
<publisher>EMC Publishing</publisher>
- <info name="programmer" value="Kristen Wagner and Sanjeev Phukan" />
+ <info name="programmer" value="Kristen Wagner" />
+ <info name="programmer" value="Sanjeev Phukan" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the banking tutorial v5.2 (4am crack).dsk" size="143360" crc="1fcb0f81" sha1="6a3461062fa57de1f4451f6d4b2e0e4ef0c1b026" />
@@ -54743,6 +56377,74 @@ license:CC0-1.0
</part>
</software>
+ <software name="brdstale">
+ <description>The Bard's Tale: Tales of the Unknown (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="alt_title" value="Tales of the Unknown: The Bard's Tale" />
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="programmer" value="Bill Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-04 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale (4am and san inc crack) disk 1 - boot.dsk" size="143360" crc="bacac75e" sha1="501388e788ff91c50c4f7d04cfec09b95472119b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Character"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale (4am and san inc crack) disk 2 - character (blank).dsk" size="143360" crc="707662d9" sha1="8f5c57ffb92c5456ad0dd24a707555b1feeb365c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Dungeon"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale (4am and san inc crack) disk 3 - dungeon.dsk" size="143360" crc="e84f952b" sha1="85fadb0443e364b94f8ca16ac6544b7d73da1192" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brdstale2">
+ <description>The Bard's Tale II: The Destiny Knight (4am and san inc crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-06 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale ii (4am and san inc crack) side a - program.dsk" size="143360" crc="c55fb52b" sha1="f4060ee43b4650c3d572b322c6b91a1084407830" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Character"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale ii (4am and san inc crack) side b - character.dsk" size="143360" crc="99167f22" sha1="4649d2fd8ab08f8867e73742d1755659fc95e8b2" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C - Dungeon"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale ii (4am and san inc crack) side c - dungeon.dsk" size="143360" crc="cfe689d5" sha1="2955febccd1dcf14aa2b2d349982f3df0dd06938" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D - Dungeon"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the bard's tale ii (4am and san inc crack) side d - dungeon.dsk" size="143360" crc="32aae10c" sha1="702a98e4c3dddc558184135e4340c5d37a107308" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bfcomp2">
<description>The Bare Facts on Composers Volume 2 (4am crack)</description>
<year>1984</year>
@@ -54750,8 +56452,8 @@ license:CC0-1.0
<info name="developer" value="Waterloo Software" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the bare facts on composers volume 2 (4am crack).dsk" size="143360" crc="cc53494d" sha1="14d54ada494a0e33be7437c5c12dcc15e7732edc" />
@@ -54766,8 +56468,8 @@ license:CC0-1.0
<info name="developer" value="Waterloo Software" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the bare facts on composers volume 3 (4am crack).dsk" size="143360" crc="a4438c6c" sha1="dc844517fa39023fa02abd08cef4a39da75b9654" />
@@ -54779,11 +56481,13 @@ license:CC0-1.0
<description>The Bare Facts on Intervals and Chords (4am crack)</description>
<year>1985</year>
<publisher>Waterloo Software</publisher>
- <info name="programmer" value="Barbara Woods, Judith Bowman, and Edmund Woods" />
+ <info name="programmer" value="Barbara Woods" />
+ <info name="programmer" value="Judith Bowman" />
+ <info name="programmer" value="Edmund Woods" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the bare facts on intervals and chords (4am crack).dsk" size="143360" crc="1f503e53" sha1="b72b8a297410d3168c0ef7b9a3b4450100b7f9b8" />
@@ -54795,11 +56499,13 @@ license:CC0-1.0
<description>The Bare Facts on Music History (4am crack)</description>
<year>1985</year>
<publisher>Waterloo Software</publisher>
- <info name="programmer" value="Barbara Woods, Judith Bowman, and Edmund Woods" />
+ <info name="programmer" value="Barbara Woods" />
+ <info name="programmer" value="Judith Bowman" />
+ <info name="programmer" value="Edmund Woods" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the bare facts on music history (4am crack).dsk" size="143360" crc="30cee4c0" sha1="e37a1fa4a25dd61373232645600d536cbee762e1" />
@@ -54811,11 +56517,13 @@ license:CC0-1.0
<description>The Bare Facts on Notes, Rhythm, and Terms (4am crack)</description>
<year>1985</year>
<publisher>Waterloo Software</publisher>
- <info name="programmer" value="Barbara Woods, Judith Bowman, and Edmund Woods" />
+ <info name="programmer" value="Barbara Woods" />
+ <info name="programmer" value="Judith Bowman" />
+ <info name="programmer" value="Edmund Woods" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-18-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -54830,6 +56538,261 @@ license:CC0-1.0
</part>
</software>
+ <software name="btlshil">
+ <description>The Battle of Shiloh (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Tactical Design Group" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the battle of shiloh (4am and san inc crack).dsk" size="143360" crc="2b8e5ba1" sha1="4d92dafe134bb703f242343dcfc7e8d1eb99b34e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="btlblg">
+ <description>The Battle of the Bulge: Tigers in the Snow (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Tactical Design Group" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tigers in the snow (4am and san inc crack).dsk" size="143360" crc="0f1f8785" sha1="ee56de1e7bebc07d54d44669420b7ad5d072d7a8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkcauld">
+ <description>The Black Cauldron (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the black cauldron (4am and san inc crack) disk 1a.dsk" size="143360" crc="233c8d02" sha1="50066a783c3be11a3ca4662f092b649cdfd7fe86" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the black cauldron (4am and san inc crack) disk 1b.dsk" size="143360" crc="e5ca8f24" sha1="dc08253015f34193d45658864d01c7be42a984d2" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the black cauldron (4am and san inc crack) disk 2a.dsk" size="143360" crc="ce0141d7" sha1="e4714561eba2c6dad4d0cac9c73e90947bbd4182" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the black cauldron (4am and san inc crack) disk 2b.dsk" size="143360" crc="60f44185" sha1="98d4800082d9c44a1909004e5fa6a7cedf7f34c6" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the black cauldron (4am and san inc crack) disk 3a.dsk" size="143360" crc="093ba3c4" sha1="632735ee231ed9d23604bd24ab9c00d62cb4d5bc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="boartime">
+ <description>The Boars Tell Time (4am crack)</description>
+ <year>1987</year>
+ <publisher>Random House</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the boars tell time (4am crack).dsk" size="143360" crc="74b434a4" sha1="74b36f7ff385bd8d121fa4d7db54b1fa9599adb4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="boyjesus">
+ <description>The Boy Jesus (4am crack)</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the boy jesus (4am crack) side a.dsk" size="143360" crc="88c20d44" sha1="17d9afc0952ea153a502768a1316fe33d5bc699c"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the boy jesus (4am crack) side b.dsk" size="143360" crc="7b549ae0" sha1="d75c8e9301b81b50ec101906016e72692ae83674"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cbookmkre" cloneof="cbookmkr">
+ <description>The Comic Book Maker (4am crack)</description>
+ <year>1989</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Has earlier dates on disk, suggesting an earlier release. -->
+ <!-- Dump released: 2016-02-02 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker (4am crack) disk 1 - program.dsk" size="143360" crc="159bf70e" sha1="ee7388606a22868263b49d394922d36f1ffc8fd1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Background"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker (4am crack) disk 2 - background.dsk" size="143360" crc="574192ca" sha1="6495275528fa58a66f1a6c944b5254cacb0fe6ac" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker (4am crack) disk 3 - clip art.dsk" size="143360" crc="a46ac975" sha1="aaeb29e74c85ac83113717cbb931f6fd61fa17a8" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Clip art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker (4am crack) disk 4 - clip art.dsk" size="143360" crc="e4689708" sha1="c03f33d71459a134567af55037f810ac866a73db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cbookmkr">
+ <description>The Comic Book Maker (version 1.2) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-13 -->
+ <!-- graphics program -->
+ <!-- missing clip art disk -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker v1.2 (4am crack) disk 1a.dsk" size="143360" crc="f6d8ec48" sha1="5dc8b6c059946e9a09a0b35b03c845b246ddb234" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Background"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker v1.2 (4am crack) disk 1b.dsk" size="143360" crc="ad2a37bb" sha1="1a683fb74771cb7fa9975aa80fc169a0cc872d30" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Clip art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker v1.2 (4am crack) disk 2a.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Clip art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the comic book maker v1.2 (4am crack) disk 2b.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+
+ <software name="tcsmdiet">
+ <description>The Complete Scarsdale Medical Diet (4am crack)</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="developers" value="Prentice Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-16 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the complete scarsdale medical diet (4am crack) disk 1.dsk" size="143360" crc="6d7621da" sha1="e463d0a11858d953ef18f927c7a8e2f436365961" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the complete scarsdale medical diet (4am crack) disk 2.dsk" size="143360" crc="ca073c01" sha1="7660fc8da5ae4f14313d1519477284acf917fe9f" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Data disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the complete scarsdale medical diet (4am crack) disk 3 - data disk.dsk" size="143360" crc="1722d51e" sha1="33eac66bbd108e243e3b6a2715d85f7a3a2bf1c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpscrbl">
+ <description>The Computer Edition of Scrabble (4am crack)</description>
+ <year>1987</year>
+ <publisher>Leisure Genius</publisher>
+ <info name="developer" value="Turcan Research Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-05 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the computer edition of scrabble (4am crack).dsk" size="143360" crc="2a27b3fe" sha1="92dc008a31710c01eba33edb9d511ae18874ea64"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cosbalan">
+ <description>The Cosmic Balance (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-15 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the cosmic balance (4am and san inc crack).dsk" size="143360" crc="af0b221b" sha1="49f46eb5580cbb01fdcfa4ae5bfd39ea459a1b04" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tcntbee11" cloneof="tcntbee">
<description>The Counting Bee (version 1.1, 26-FEB-82) (4am crack)</description>
<year>1981</year>
@@ -54838,8 +56801,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1, 26-FEB-82" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-07-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the counting bee v1.1 (4am crack).dsk" size="143360" crc="8bbf9cc6" sha1="d39f8b2647531089c86b824c05fae39de1060b72" />
@@ -54855,8 +56818,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.2, 14-MAY-83" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-08-->
- <!--educational program-->
+ <!-- Dump released: 2017-10-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the counting bee v1.2 (4am crack).dsk" size="143360" crc="e95d7931" sha1="8e816c2a20f76f4622874a39fb3fabdb3d646ac4" />
@@ -54864,6 +56827,57 @@ license:CC0-1.0
</part>
</software>
+ <software name="covetmir83">
+ <description>The Coveted Mirror (version 1983) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Eagle I. Berns" />
+ <info name="programmer" value="Holly Thomason" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="the coveted mirror (4am crack) side a.dsk" size="143360" crc="8df0cdb8" sha1="c17022314f84b4353860a77a234639148d747674" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot" />
+ <dataarea name="flop" size="143360">
+ <rom name="the coveted mirror (4am crack) side b (boot).dsk" size="143360" crc="129348b9" sha1="40dc102262baf72edb00be5a890bc51956e2e64f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crmcrown">
+ <description>The Crimson Crown (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Polarware</publisher>
+ <info name="original_publisher" value="Penguin Software" />
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <!-- Re-release by Polarware with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-30 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the crimson crown 1985 (4am crack) side a.dsk" size="143360" crc="aba5242a" sha1="fed7cdb0a85fa1e5e938e85a6bc13ad8359aa4d8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the crimson crown 1985 (4am crack) side b.dsk" size="143360" crc="82509d3a" sha1="874a960a64ac7a68bd4ba648383bedf844f65e61" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="thecube">
<description>The Cube (4am crack)</description>
<year>1981</year>
@@ -54871,8 +56885,8 @@ license:CC0-1.0
<info name="programmer" value="Patricia Shanahan" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-07-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the cube (4am crack).dsk" size="143360" crc="06539b8e" sha1="58f69ecc77c9418b12a83ff5436ed14da90f265b" />
@@ -54880,6 +56894,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="dragneye">
+ <description>The Dragon's Eye (4am crack)</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Robert Leyland" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the dragon's eye (4am crack).dsk" size="143360" crc="b4c1aaab" sha1="bcf992557c03a97d6198763191a84cecd944d928"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dreammac">
<description>The Dream Machine (4am crack)</description>
<year>1986</year>
@@ -54887,8 +56917,8 @@ license:CC0-1.0
<info name="developer" value="Psychological Psoftware" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-07-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -54903,15 +56933,57 @@ license:CC0-1.0
</part>
</software>
+ <software name="earlychr">
+ <description>The Early Church (4am crack)</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the early church (4am crack) side a.dsk" size="143360" crc="ff674e0a" sha1="34f3d0df13e45ef4f9b9725f3a6223118f5218f8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the early church (4am crack) side b.dsk" size="143360" crc="43d77d07" sha1="7f5c397fe3f1878acedc0dbd46d44061825d705e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teidolon">
+ <description>The Eidolon (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="LucasFilm Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the eidolon (4am crack).dsk" size="143360" crc="631b027b" sha1="9318b15135daf66cebb3f9ed726dcb76e912006f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="elcrabc">
<description>The Electric Crayon: ABCs (4am crack)</description>
<year>1986</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Brian A. Rice and Mark Russell Finche" />
- <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="programmer" value="Brian A. Rice" />
+ <info name="programmer" value="Mark Russell Finche" />
+ <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple ][ Mouse Card in slot 4: -sl4 mouse." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-02-26-->
- <!--educational painting program-->
+ <!-- Dump released: 2016-02-26 -->
+ <!-- educational painting program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the electric crayon - abcs (4am crack).dsk" size="143360" crc="e15c003a" sha1="50cd52ab2503fc95f4d523d5f5c4f07690dfbd85" />
@@ -54924,10 +56996,10 @@ license:CC0-1.0
<year>1986</year>
<publisher>Polarware</publisher>
<info name="programmer" value="Brian A. Rice" />
- <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple ][ Mouse Card in slot 4: -sl4 mouse." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-19-->
- <!--educational painting program-->
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational painting program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="electric crayon fun on the farm (4am crack).dsk" size="143360" crc="d2befa5f" sha1="3d5643e49d138caa45da80893a167464c7e62a7c" />
@@ -54939,11 +57011,12 @@ license:CC0-1.0
<description>The Electric Crayon: This Land Is Your Land (4am crack)</description>
<year>1986</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Brian A. Rice and Rick Incrocci" />
- <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="programmer" value="Brian A. Rice" />
+ <info name="programmer" value="Rick Incrocci" />
+ <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple ][ Mouse Card in slot 4: -sl4 mouse." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-08-->
- <!--educational painting program-->
+ <!-- Dump released: 2015-03-08 -->
+ <!-- educational painting program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the electric crayon - this land is your land (4am crack).dsk" size="143360" crc="4bc95afb" sha1="3e8745b89f9f0ef0d4f3b20c0ee455dd2b8e6674" />
@@ -54951,14 +57024,55 @@ license:CC0-1.0
</part>
</software>
+ <software name="elvesshm">
+ <description>The Elves and The Shoemaker (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-01-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the elves and the shoemaker (4am crack).dsk" size="143360" crc="15115aec" sha1="1558f7b68f7ce388d8545cc8e5120722f3c408e8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eterndag">
+ <description>The Eternal Dagger (version 1.2) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="programmer" value="Victor Penman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the eternal dagger v1.2 (4am crack) side a.dsk" size="143360" crc="f28d4aba" sha1="4e5854098549f3d95bc244964a4fc4665bb2b734" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the eternal dagger v1.2 (4am crack) side b.dsk" size="143360" crc="146f615e" sha1="b401040c5d926b213fa96543d9105791b81a3649" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ewdynread">
<description>The Evelyn Wood Dynamic Reader (4am crack)</description>
<year>1984</year>
<publisher>TimeWorks</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-29-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Data" />
<dataarea name="flop" size="143360">
@@ -54985,17 +57099,205 @@ license:CC0-1.0
</part>
</software>
+ <software name="factorysb83" cloneof="factory">
+ <description>The Factory (Sunburst Communications) (version 1983) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the factory (1983) (4am crack).dsk" size="143360" crc="21b35348" sha1="f8387b147600f8f7700a3d964afc15bd578fd8dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factorysb83r2" cloneof="factory">
+ <description>The Factory (Sunburst Communications) (version 1983 revision 2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983 revision 2" />
+ <!-- This undated revision fixes a small bug with a single variable in the FACTORY program file. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the factory 1983 rev. 2 (4am crack).dsk" size="143360" crc="0896a583" sha1="eee77dad727afdfb3988aad063ee801995b5bea1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factorysb84" cloneof="factory">
+ <description>The Factory (Sunburst Communications) (version 1984) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the factory 1984 (4am crack).dsk" size="143360" crc="af3f1d49" sha1="d8c9020da2797de3abe3a8de0d1db73fc2b7ac7b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factory">
+ <description>The Factory (Sunburst Communications) (version 1985) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the factory (4am crack).dsk" size="143360" crc="09f62c9f" sha1="b30c9de41330f180ee0139b66ac42628ccd57e4a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="finlconf">
+ <description>The Final Conflict (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Thomas G. Cleaver" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the final conflict (4am crack).dsk" size="143360" crc="97363845" sha1="f6e7ab72fc88b39699a7588cae032c5c8e6fe458" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fnlfrntr">
+ <description>The Final Frontier (version 1.0) (Softsmith) (4am and san inc crack)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Wes Huntress" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1.0" />
+ <!-- Softsmith re-release -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-05 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the final frontier (softsmith) (4am and san inc crack).dsk" size="143360" crc="641a9d1c" sha1="4daec6541b8e65880b2d822eb4c9e797111a6040"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1sttksgv">
+ <description>The First Thanksgiving (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the first thanksgiving (4am crack).dsk" size="143360" crc="d8f2553f" sha1="7e3a44f71c13041bf921ef3fd5d691ec67c7c9de" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flyncrpt">
+ <description>The Flying Carpet (4am crack)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the flying carpet (4am crack).dsk" size="143360" crc="9816fdac" sha1="788e9b3b0e09d811b38da1e26e614da13bd22a23" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="forthr">
+ <description>The Fourth R -- Reasoning (4am crack)</description>
+ <year>1984</year>
+ <publisher>MCE</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the fourth r - reasoning (4am crack).dsk" size="143360" crc="830f5707" sha1="66a9c23fee6e6714554747085055e5b5260b17a9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="friendcom10" cloneof="friendcom_525">
+ <description>The Friendly Computer (A-779 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-779" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-03-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a779 the friendly computer v1.0 (4am crack).dsk" size="143360" crc="b9766c14" sha1="7c46c4d8001bf649bdb7a482669c3112a0e70730" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="friendcom_525">
+ <description>The Friendly Computer (A-779 version 1.5) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-779" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a779 the friendly computer v1.5 (4am crack).dsk" size="143360" crc="8dab5713" sha1="a39c4ac0d9282766ddaa1331847ad6660d269bed"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="gameshows">
- <description>The Game Show (SoftSmith) (4am and san inc crack)</description>
+ <description>The Game Show (Softsmith) (4am and san inc crack)</description>
<year>1983</year>
- <publisher>SoftSmith</publisher>
+ <publisher>Softsmith</publisher>
<info name="developer" value="Computer-Advanced Ideas" />
<info name="original_publisher" value="Computer-Advanced Ideas"/>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
- <!--SoftSmith re-release-->
+ <!-- Softsmith re-release -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-26-->
- <!--educational program-->
+ <!-- Dump released: 2021-06-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the game show (softsmith) (4am and san inc crack).dsk" size="143360" crc="bbea58df" sha1="b52821a588af9ab9642389e9d7bcc36e5ab1295b"/>
@@ -55003,6 +57305,69 @@ license:CC0-1.0
</part>
</software>
+ <software name="tgwinter">
+ <description>The Games: Winter Edition (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Edward Chu" />
+ <info name="programmer" value="Kevin Furry" />
+ <info name="programmer" value="Eric Knopp" />
+ <info name="programmer" value="Carl Mey" />
+ <info name="programmer" value="Scott Nelson" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="programmer" value="Edwin W. Reich, Jr." />
+ <info name="programmer" value="Al Rubin" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Steve A. Baker" />
+ <info name="programmer" value="Brooke W. Boering" />
+ <info name="programmer" value="Walter Horat" />
+ <info name="programmer" value="James Watcher" />
+ <info name="programmer" value="Susan Greene" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Jenny Martin" />
+ <info name="programmer" value="Muffy McCosh" />
+ <info name="programmer" value="Matt Sarconi" />
+ <info name="programmer" value="Steve Snyder" />
+ <info name="programmer" value="Paul Vernon" />
+ <info name="programmer" value="Chris Ebert" />
+ <info name="programmer" value="Christopher Grigg" />
+ <info name="programmer" value="Bob Vieira" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-27. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the games - winter edition (4am crack) disk a-1.dsk" size="143360" crc="aea18ce0" sha1="89df683d7ae5b32aaab37e33dd531d99a8990ac4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the games - winter edition (4am crack) disk a-2.dsk" size="143360" crc="c69ef96a" sha1="0f24b1c1a74f3f9b35f3364bd863a1cc6bfde837" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the games - winter edition (4am crack) disk b-1.dsk" size="143360" crc="5b43f514" sha1="948ac42769ce66d1a1d20b5e5785742a907e768c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the games - winter edition (4am crack) disk b-2.dsk" size="143360" crc="4b10934f" sha1="f0fb5bef9000bb1c123fcc51e8bf74b09d79e9ef" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the games - winter edition (4am crack) disk c.dsk" size="143360" crc="0bea31db" sha1="53cea5e0303a555f47c8173752f6798fca8d0f4f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gemzeph">
<description>The Gem of Zephyrr (version 1.1.0) (4am crack)</description>
<year>1987</year>
@@ -55010,10 +57375,10 @@ license:CC0-1.0
<info name="programmer" value="Eric A. Seiden" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.1.0" />
- <!--This appears to be a review copy of a game sent to publishers. It is not immediately playable; it displays the title screen that flashes "EVALUATION COPY" then exits to a BASIC prompt.-->
+ <!-- This appears to be a review copy of a game sent to publishers. It is not immediately playable; it displays the title screen that flashes "EVALUATION COPY" then exits to a BASIC prompt. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-07-->
- <!--adventure game-->
+ <!-- Dump released: 2023-12-07 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the gem of zephyrr v1.1.0 (4am crack).dsk" size="143360" crc="a5601f33" sha1="257d078ae495c63d9fa6f1b9098e436516e4c55d" />
@@ -55029,8 +57394,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0S" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-14-->
- <!--productivity program-->
+ <!-- Dump released: 2023-03-14 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Master Program" />
<dataarea name="flop" size="143360">
@@ -55059,8 +57424,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0Y" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-06-->
- <!--productivity program-->
+ <!-- Dump released: 2023-09-06 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Master Program" />
<dataarea name="flop" size="143360">
@@ -55081,6 +57446,74 @@ license:CC0-1.0
</part>
</software>
+ <software name="tgsquad">
+ <description>The Geometric Supposer: Quadrilaterals (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Michal Yerushalmy" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the geometric supposer - quadrilaterals (4am crack).dsk" size="143360" crc="950fcbe8" sha1="76f169f9e9ee6e3428886982fdd6ac26140e2dfe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgstri">
+ <description>The Geometric Supposer: Triangles (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Michal Yerushalmy" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the geometric supposer - triangles (4am crack).dsk" size="143360" crc="dacddc90" sha1="a9023995368a3b10f6c196999329400b066df535" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="goofghst">
+ <description>The Goofy Ghost (4am crack)</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the goofy ghost (4am crack).dsk" size="143360" crc="013ddcab" sha1="241bbd553e0203cb3eb5237b841d339431b1773f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gaccrace">
+ <description>The Great American Cross-Country Road Race (4am crack)</description>
+ <year>1985</year>
+ <publisher>Activision</publisher>
+ <info name="author" value="Alex DeMeo" />
+ <info name="developer" value="Synergistic Software" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the great american cross-country road race (4am crack).dsk" size="143360" crc="0c3f2ef8" sha1="6da5d873e8f98c785073207c8ab789dc494daaac" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="grknowr">
<description>The Great Knowledge Race (4am crack)</description>
<year>1985</year>
@@ -55088,8 +57521,8 @@ license:CC0-1.0
<info name="developer" value="Soft Solutions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Master game disk" />
<dataarea name="flop" size="143360">
@@ -55110,15 +57543,65 @@ license:CC0-1.0
</part>
</software>
+ <software name="maincali">
+ <description>The Great Maine to California Race (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Natalie Jesdale M.S., ED." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-21 -->
+ <!-- educational program -->
+ <!-- Missing Side B? -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the great maine to california race (4am crack).dsk" size="143360" crc="1b4f680a" sha1="5e5714fdefceaeaa5770e999f6b8eb752c63bd39" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grtnmbch">
+ <description>The Great Number Chase (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="Eric Soldan" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the great number chase (4am crack).dsk" size="143360" crc="fee3b698" sha1="595701b7a0907388e5d4ed313b22c451c554e8df" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grtstrce">
+ <description>The Great States Race (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="Ronald Peacock" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the great states race (4am crack).dsk" size="143360" crc="115bbef9" sha1="0346205f3deca1708d603e1a37f86237c805535a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="grunfren">
<description>The Gruneberg Linkword Language Course: French (4am crack)</description>
<year>1985</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Michael M. Gruneberg and Gabriel Jacobs" />
+ <info name="programmer" value="Michael M. Gruneberg" />
+ <info name="programmer" value="Gabriel Jacobs" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-03-10-->
- <!--educational program-->
+ <!-- Dump released: 2016-03-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the gruneberg linkword language course - french (4am crack).dsk" size="143360" crc="0490f21d" sha1="27952880d49830cad92294a93437e00af619d9a5" />
@@ -55130,11 +57613,13 @@ license:CC0-1.0
<description>The Gruneberg Linkword Language Course: German (4am crack)</description>
<year>1985</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Michael M. Gruneberg, V. L. Gruneberg, and S. Jones" />
+ <info name="programmer" value="Michael M. Gruneberg" />
+ <info name="programmer" value="V. L. Gruneberg" />
+ <info name="programmer" value="S. Jones" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-12-11-->
- <!--educational program-->
+ <!-- Dump released: 2017-12-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the gruneberg linkword language course - german (4am crack).dsk" size="143360" crc="029a9b7e" sha1="da1b69356c7c5e3039eec12164970bac3f817196" />
@@ -55146,11 +57631,12 @@ license:CC0-1.0
<description>The Gruneberg Linkword Language Course: Spanish (4am crack)</description>
<year>1985</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Michael M. Gruneberg and Gabriel Jacobs" />
+ <info name="programmer" value="Michael M. Gruneberg" />
+ <info name="programmer" value="Gabriel Jacobs" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-03-10-->
- <!--educational program-->
+ <!-- Dump released: 2016-03-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the gruneberg linkword language course - spanish (4am crack).dsk" size="143360" crc="e9407ff6" sha1="ef94a17fb50180c4ae274aa2a7ffa77f0f79a866" />
@@ -55158,6 +57644,271 @@ license:CC0-1.0
</part>
</software>
+ <software name="halleypr">
+ <description>The Halley Project: A Mission In Our Solar System (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Omar Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="M. le Fuge" />
+ <info name="programmer" value="Ed McNierney" />
+ <info name="programmer" value="Peter Reynolds" />
+ <info name="programmer" value="Gabrielle Savage" />
+ <info name="programmer" value="Leonard Bertoni" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the halley project (4am crack).dsk" size="143360" crc="498f7d43" sha1="fcaa1784b084979c2cd970e0a1372e996110b342" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="theheist">
+ <description>The Heist (4am crack)</description>
+ <year>1983</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Mike Mooney" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the heist (4am crack).dsk" size="143360" crc="4b3cc3a0" sha1="32a63adfacfc2676924f8b77566d2cdb64f88693" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hlygrail">
+ <description>The Holy Grail (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hayden Software</publisher>
+ <info name="author" value="Joe Emerson" />
+ <info name="programmer" value="Ken Smith" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-17 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the holy grail (4am crack) side a.dsk" size="143360" crc="25da1ecc" sha1="40b0ee95721d8540fedc0142046aad10131f72c7"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the holy grail (4am crack) side b.dsk" size="143360" crc="9f63ad15" sha1="77e377fe95af1dc4898e159a8e6ded37d440c275"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thbdigex">
+ <description>The Human Body and How It Works: The Digestive and Excretory Systems (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the digestive and excretory systems (4am crack).dsk" size="143360" crc="af1103fe" sha1="3f6c3451291a2178619352d4f6603b6e4d09ce8f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thbsklms">
+ <description>The Human Body and How It Works: The Skeletal and Muscular Systems (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the human body and how it works - the skeletal and muscular systems (4am crack).dsk" size="143360" crc="fa92e1e6" sha1="f93e15b581ceece9386fef03712317266d7c0afd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="inclab">
+ <description>The Incredible Laboratory: Strategies in Problem Solving (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Jay Carlon" />
+ <info name="programmer" value="Melissa Verber" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the incredible laboratory (4am crack).dsk" size="143360" crc="6ce45105" sha1="a76175418ff95a61afe2592ebb3d7c59291ff12e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="islbeta">
+ <description>The Islands of Beta (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-25 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="islands of beta (4am crack).dsk" size="143360" crc="42f5e0dc" sha1="20e4d10b4b51aef9d2d2a8d6a4e6284cb5dd71b1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jarchaos">
+ <description>The Jar Game &amp; Chaos (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the jar game and chaos (4am crack).dsk" size="143360" crc="5eb0eebc" sha1="4add93afb555bb62c363e36667a2c714b0a200d0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kingrule">
+ <description>The King's Rule: Mathematics and Discovery (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Tom Raich" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the king's rule (4am crack).dsk" size="143360" crc="7d84770f" sha1="2b39d04e0d34fd24ce76a5f11167237031a080c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kingfact">
+ <description>The Kingdom of Facts (4am crack)</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Anders Beitnes" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the kingdom of facts (4am crack) side a.dsk" size="143360" crc="f406b7d8" sha1="e5f09624fca74adb9478563cbd19d4763be8a3d1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the kingdom of facts (4am crack) side b.dsk" size="143360" crc="e670fc8c" sha1="0d599b1c2d80dfa5a65592a6f0f8314bee961e74" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labycret">
+ <description>The Labyrinth of Crete (4am crack)</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Cliff Johnson" />
+ <info name="programmer" value="Allen Pinero" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="labyrinth of crete (4am crack).dsk" size="143360" crc="cd12d96c" sha1="dab01261a4c4335acd9add607f6b920cdb15cf35" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lastgladr1" cloneof="lastglad">
+ <description>The Last Gladiator (revision 1) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="John Field" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the last gladiator (4am and san inc crack).dsk" size="143360" crc="bcf73e9e" sha1="32e7ea80bf09cf30c1f4ebc4b4cad2c1e7908743" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lastglad">
+ <description>The Last Gladiator (revision 2) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="John Field" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="revision 2" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the last gladiator rev. 2 (4am and san inc crack).dsk" size="143360" crc="87c161c0" sha1="e939a48bd843bb14ebd4ac2c8417908f754591df" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="livncell_525">
+ <description>The Living Cell (A-278 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-278" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Ed Gratz" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a278 the living cell v1.0 (4am crack).dsk" size="143360" crc="e761efd8" sha1="259374d9337a5b5c67d92e30829f4e955b6356a7"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="magcashreg">
<description>The Magic Cash Register (4am crack)</description>
<year>1984</year>
@@ -55165,8 +57916,8 @@ license:CC0-1.0
<info name="programmer" value="Daniel Barstow" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-01-->
- <!--educational program-->
+ <!-- Dump released: 2022-10-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the magic cash register (4am crack).dsk" size="143360" crc="05b96147" sha1="8f1470f5f58aad1bccc328b579dca376ab778d39" />
@@ -55174,17 +57925,75 @@ license:CC0-1.0
</part>
</software>
+ <software name="magicstr">
+ <description>The Magic String (4am crack)</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the magic string (4am crack).dsk" size="143360" crc="5fec84ee" sha1="6702d75cccf3ecfeb490d7ee96a28c8ab1b92eb7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="markplc_525">
+ <description>The Market Place (A-160 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-160" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a160 the market place v1.0 (4am crack).dsk" size="143360" crc="646c3331" sha1="826658fc5039fd80b4d34998805928a7815d75d8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="masksun">
+ <description>The Mask of the Sun (version 2.1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Ultrasoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-21 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the mask of the sun v2.1 (4am crack) side a.dsk" size="143360" crc="1ad2e600" sha1="794859b6258f9e182b6299b8df4022b46605ab5d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the mask of the sun v2.1 (4am crack) side b.dsk" size="143360" crc="f56487fe" sha1="3fee1ffa7d7408513567e1e544c64c95a8803b66" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mathbstr1" cloneof="mathbstr">
<description>The Math Busters (version 1) (4am crack)</description>
<year>1984</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="version 1" />
<!-- This undated version was released with a different copy protection than later versions -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-27-->
- <!--educational game-->
+ <!-- Dump released: 2017-02-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the math busters v1 (4am crack).dsk" size="143360" crc="8edb2289" sha1="600d0db912fa2d42ff6546812194427a0c190f17" />
@@ -55197,12 +58006,12 @@ license:CC0-1.0
<year>1984</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="version 2" />
- <!--Updated protection and re-released. There are no other known changes between the two versions.-->
+ <!-- Updated protection and re-released. There are no other known changes between the two versions. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-26-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-26 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the math busters (4am crack).dsk" size="143360" crc="63cd6610" sha1="c4da6328b802973a862845da9eb6da801ec76b25" />
@@ -55210,16 +58019,108 @@ license:CC0-1.0
</part>
</software>
+ <software name="memmachn">
+ <description>The Memory Machine (4am crack)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Owen" />
+ <info name="programmer" value="Barb Wood" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the memory machine (4am crack).dsk" size="143360" crc="94e804b2" sha1="50fa0b471bd2e029c24ec5b6dc38814b6c4a0526" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="milwrdpr">
+ <description>The Milliken Word Processor (4am crack)</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="IOTA" />
+ <info name="programmer" value="John A. Oberschelp" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- A later version of this program is part of the "The Writing Workshop". This version is dated 1984 and has a simpler protection. -->
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the milliken word processor (4am crack).dsk" size="143360" crc="ae22419c" sha1="8860baa9ec434d3db5f070518e621e60f05e6e2a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="themist">
+ <description>The Mist (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Stephen King" />
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-04-24 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the mist (4am crack).dsk" size="143360" crc="7cf52724" sha1="b56bc62bf60680deafdc1a33f0721b0bcffb8df1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmss1cnt">
+ <description>The Money Series: Step 1 Counting! (version 05.01.88) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Phil Mansour" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="05.01.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the money series - step 1 counting (4am crack).dsk" size="143360" crc="822ac32f" sha1="8842d232e7addf3c8797712e36a268f28c64ad95" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmss2mcnt">
+ <description>The Money Series: Step 2 More Counting! (version 12.21.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="John Spanburg" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="12.21.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the money series - step 2 more counting 12.21.89 (4am crack).dsk" size="143360" crc="15598093" sha1="0cf6e13bea01072057368c13224d445687f9a604" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="montread">
<description>The Montana Reading Program: Learning Sight Words (4am crack)</description>
<year>1984</year>
<publisher>Program Design</publisher>
<info name="developer" value="Professional Software Services" />
- <info name="programmer" value="Dick Dramstad, Tom O'Sullivan, Kirk Wennerstrom, Dee Williams and Jerry Williams" />
+ <info name="programmer" value="Dick Dramstad" />
+ <info name="programmer" value="Tom O'Sullivan" />
+ <info name="programmer" value="Kirk Wennerstrom" />
+ <info name="programmer" value="Dee Williams" />
+ <info name="programmer" value="Jerry Williams" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-12-12-->
- <!--educational program-->
+ <!-- Dump released: 2015-12-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="montana reading program (4am crack).dsk" size="143360" crc="74b9af9a" sha1="6432fdf634b2022eadddb331ccbd95c060c82e6c" />
@@ -55227,6 +58128,29 @@ license:CC0-1.0
</part>
</software>
+ <software name="movimons">
+ <description>The Movie Monster Game (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Epyx" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="233451">
+ <rom name="the movie monster game (4am crack) side a.dsk" size="143360" crc="07f0eb72" sha1="ca7cb434f5d4a704db855a8bfb69c9ab5b3392c1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="233451">
+ <rom name="the movie monster game (4am crack) side b.dsk" size="143360" crc="59b86d77" sha1="1eec4e0a6d7f09dd9be64b8f3c827c58f91abc69" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tnsbsbasic">
<description>The New Step by Step: A Computer Course in BASIC (4am crack)</description>
<year>1981</year>
@@ -55234,8 +58158,8 @@ license:CC0-1.0
<info name="developer" value="Program Design" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -55254,11 +58178,19 @@ license:CC0-1.0
<description>The Newsroom (demo) (4am crack)</description>
<year>1984</year>
<publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="demo" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-25-->
- <!--productivity program-->
+ <!-- Dump released: 2017-10-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the newsroom self-running demo (4am crack).dsk" size="143360" crc="14b1d110" sha1="b4e23d018ca83d24e66ac1f63d55cad2df8b1ed7" />
@@ -55266,16 +58198,506 @@ license:CC0-1.0
</part>
</software>
+ <software name="orgtrail11" cloneof="orgtrail_525">
+ <description>The Oregon Trail (A-157 version 1.1 revision 325) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-157" />
+ <info name="programmer" value="John Krenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1 revision 325" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-29. Redumped: 2021-02-21 to fix data corruption that caused crash after leaving town. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a157 the oregon trail v1.1 (4am crack) side a.dsk" size="143360" crc="f67db23d" sha1="3762550258fbc0656783fac49bd7a24c4a32b599" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a157 the oregon trail v1.1 (4am crack) side b.dsk" size="143360" crc="75f2eb62" sha1="69643b521e6fa7f2e41a90f0e49881e311a42c55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="orgtrail_525">
+ <description>The Oregon Trail (A-157 version 1.4) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-157" />
+ <info name="programmer" value="John Krenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-07-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a157 the oregon trail v1.4 (logo crack) side a.dsk" size="143360" crc="6332b2c7" sha1="52c7a6cc3939ab6ff3e0063f87eac4d4d466d85a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a157 the oregon trail v1.4 (logo crack) side b.dsk" size="143360" crc="37cad616" sha1="e26e2e67f9891a6835c0d93e07a12b7e2d9691c7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="perfcoll">
+ <description>The Perfect College (4am crack)</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Soft Press Corp." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect college (4am crack) side a.dsk" size="143360" crc="662cc864" sha1="be29a1d1eba1f8f9cd07d76244d18694758ea4f4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect college (4am crack) side b.dsk" size="143360" crc="99e3850b" sha1="0ce92cfe260c64dbbf1cc1e65016f57fda8626ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tpssatpr">
+ <description>The Perfect Score: Computer Preparation for the SAT (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Burt Monk and Company" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 1 - Antonyms I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk a side 1 - antonyms i.dsk" size="143360" crc="95f147b6" sha1="57347093230c48a9d8c475dc28b7d63c7e6dccba" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 2 - Antonyms II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk a side 2 - antonyms ii.dsk" size="143360" crc="2b170e81" sha1="969273e692ea6c7cedd9cd470eb242326e168684" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 1 - Analogies I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk b side 1 - analogies i.dsk" size="143360" crc="7ba4d552" sha1="d177a5075f26e9a22f0ad3831b62e3abc6509ee9" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 2 - Analogies II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk b side 2 - analogies ii.dsk" size="143360" crc="c8ed95e8" sha1="5f4e8979df884eaeca5423140034927d9ccb3f16" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 1 - Sentence Completion I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk c side 1 - sentence completion i.dsk" size="143360" crc="632cd17a" sha1="538da926747efdbbf585267c769c3da0793959e4" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 2 - Sentence Completion II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk c side 2 - sentence completion ii.dsk" size="143360" crc="ee6f2d7d" sha1="3423bb5b8d74cc08ce43ae37888953a315126966" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D Side 1 - Reading Comprehension I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk d side 1 - reading comprehension i.dsk" size="143360" crc="ab4c5fbc" sha1="5db054253ebfa7c91a65d60c8216ac4557beac61" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D Side 2 - Reading Comprehension II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk d side 2 - reading comprehension ii.dsk" size="143360" crc="bce86c75" sha1="49d024774fbd04836d6db5fd937f5e8b04d78579" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk E Side 1 - Mathematics I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk e side 1 - mathematics i.dsk" size="143360" crc="2bac61a1" sha1="5ad781bea1dd1b32a03eb3f9d0ac119f0d63ba39" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk E Side 2 - Mathematics II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk e side 2 - mathematics ii.dsk" size="143360" crc="a1c87a8c" sha1="77e6a9f0d222c17adb557782c62d3cb257fed3d4" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk F Side 1 - Practice SAT"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk f side 1 - practice sat.dsk" size="143360" crc="97e33205" sha1="c2ec93b59e016bf92ef6bd2108e5fd06e2dbf552" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk F Side 2 - Timed test of standard written English"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the perfect score (4am crack) disk f side 2 - timed test of standard written english.dsk" size="143360" crc="189509f4" sha1="476393b85703b29de492cba92057f69d4d49669b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="planguid">
+ <description>The Planetary Guide (4am crack)</description>
+ <year>1981</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Kevin Bagley" />
+ <info name="programmer" value="David Kampschafer" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the planetary guide (4am crack).dsk" size="143360" crc="9da21338" sha1="7f86e27049f6bc7d4eaa544816660431c862bb15" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="playroom_525">
+ <description>The Playroom (version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Leslie Grimm" />
+ <info name="author" value="Dennis Caswell" />
+ <info name="author" value="Lynn Kirkpatrick" />
+ <info name="developer" value="Educators' Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-14 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the playroom (4am crack) disk a.dsk" size="143360" crc="639f6530" sha1="ced55fc3cef7038cb593833b278404805011a862" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the playroom (4am crack) disk b.dsk" size="143360" crc="ed4437e8" sha1="ff34c1719913d64c00ac4f8c59119385cc88171a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the playroom (4am crack) disk c.dsk" size="143360" crc="a8b31e2b" sha1="ef7a762e1aedb4e15b6b47cb692723835eddcce4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the playroom (4am crack) disk d.dsk" size="143360" crc="37bce334" sha1="92490b5940d95ca075b1db074f0d1da57c953c0c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thepond">
+ <description>The Pond (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the pond (4am crack).dsk" size="143360" crc="d0269833" sha1="528ef44ed3b174d0b02468e064d5a059d191af44" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="printshp84">
+ <description>The Print Shop (version 1984) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Balsam" />
+ <info name="programmer" value="Martin Kahn" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-25. Updated release: 2024-12-27 with Side B. -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="the print shop (4am crack) side a.dsk" size="143360" crc="7abaa8b5" sha1="b5ce85f08f1271e4d554c1612e00735b6f15e7e4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="the print shop (4am crack) side b.dsk" size="143360" crc="6ed4023d" sha1="8934a2fde8d1c2f9796d065ab6614c01ffa0c472" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prshcomp">
+ <description>The Print Shop Companion (version 1.2) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. This is the final version produced for the Apple ][." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-17 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the print shop companion v1.2 (4am crack) side a.dsk" size="143360" crc="b4b73991" sha1="cf87429a04c43f134447bec39818faf51e5ed442" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the print shop companion v1.2 (4am crack) side b.dsk" size="143360" crc="ae06cd64" sha1="2f66400b0ea80b7820c7a26397e16660b56b666f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prsnr110s">
+ <description>The Prisoner (version 1.10) (Softsmith) (4am and san inc crack)</description>
+ <year>1980</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Edu-Ware Services" />
+ <info name="original_publisher" value="Edu-Ware Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.10" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-10 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the prisoner v1.10 (softsmith) (4am and san inc crack).dsk" size="143360" crc="cfb731df" sha1="16e9ff900df3bab5ab9c516325d2cd5729636698"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tpuzzler">
+ <description>The Puzzler: A Program for Developing Reading Strategies (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Janet Gollan" />
+ <info name="programmer" value="Audrey Shillington" />
+ <info name="programmer" value="Douglas Denby" />
+ <info name="programmer" value="Douglas Inkpen" />
+ <info name="programmer" value="Arthur Willer" />
+ <info name="programmer" value="Dale Burnett" />
+ <info name="programmer" value="Larry Miller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the puzzler (4am crack).dsk" size="143360" crc="1d8bd7cf" sha1="f763438274dd1d93e6b6dcf94a18e66a3f5577cd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="queenphb">
+ <description>The Queen of Phobos (4am crack)</description>
+ <year>1982</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="William R. Crawford" />
+ <info name="programmer" value="Paul L. Berker" />
+ <info name="programmer" value="Dav Holle" />
+ <info name="programmer" value="Adrian Ferret" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the queen of phobos (4am crack).dsk" size="143360" crc="3a6bafb0" sha1="b22f60f8061dbc8d786d627168172441f8b6a6f5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thequest">
+ <description>The Quest (version 1984) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Joe Toler" />
+ <info name="programmer" value="Joel Ellis Rea" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="programmer" value="Steven Meuse" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later. Double hi-res graphics are available on 128K Apple //e and later." />
+ <info name="version" value="1984" />
+ <!-- Re-release with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the quest revision 2 (4am crack) side a.dsk" size="143360" crc="41088b27" sha1="bae0274ababd10baea488c27d53625cc353df20d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the quest revision 2 (4am crack) side b.dsk" size="143360" crc="41232904" sha1="67b674fcd9286131b986564ba981f7ab3ad724a1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrworkscbs" cloneof="rrworks">
+ <description>The Railroad Works (CBS Software) (clean crack)</description>
+ <year>1984</year>
+ <publisher>CBS Software</publisher>
+ <info name="developer" value="The Connelley Group" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-22 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the railroad works (clean crack).do" size="143360" crc="779b1050" sha1="9be6c43573692aa3042439fc27f34b622ea963f4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrworks">
+ <description>The Railroad Works (Thunder Mountain) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Thunder Mountain</publisher>
+ <info name="developer" value="The Connelley Group" />
+ <info name="original_publisher" value="CBS Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-02 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the railroad works (4am crack).dsk" size="143360" crc="a16bfdba" sha1="2d2ee6984ab3f82a50878086c66759c0f47124d3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rightturnr0" cloneof="rightturn">
+ <description>The Right Turn: Strategies in Problem Solving (revision 0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. Bretl" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 0" />
+ <!-- This version has no date/time stamps on any file, and the file lengths are smaller. Earliest known version dubbed revision 0. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the right turn rev. 0 (4am crack).dsk" size="143360" crc="c32f6361" sha1="89d38d27c937aec3cc145d02c824252ed0d3b3b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rightturn">
+ <description>The Right Turn: Strategies in Problem Solving (revision 1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. Bretl" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the right turn (4am crack).dsk" size="143360" crc="30030162" sha1="7e7af9b92e4f3d3d3ff7f5d5641e87e870b92592" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="royrulesr1" cloneof="royrules">
+ <description>The Royal Rules (revision 1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Raoul Watson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-03-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the royal rules (4am crack) disk 1.dsk" size="143360" crc="3935e3bb" sha1="f3d5a7339dab6fc80358ee7dc427bf8569c10891" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the royal rules (4am crack) disk 2.dsk" size="143360" crc="5a6abeee" sha1="54044b31d436c7e628ae5424b3af391edde101af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="royrules">
+ <description>The Royal Rules (revision 2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Raoul Watson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This version has additional security-related code in the STARTUP program, indicating a later revision. There is no visible versioning and no date/time metadata in the disk catalog. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="the royal rules rev. 2 (4am crack) disk 1.dsk" size="143360" crc="4bec0dd9" sha1="e30ddd05edeeb08e641c551efc6a1ae2adcd6491" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data" />
+ <dataarea name="flop" size="143360">
+ <rom name="the royal rules rev. 2 (4am crack) disk 2.dsk" size="143360" crc="5a6abeee" sha1="54044b31d436c7e628ae5424b3af391edde101af" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="schsp40">
<description>The School Speller: Magic Slate II: 40-Column Apple //e Version (version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Scott Clough, Paul Elseth, Donna Stanger, and Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--productivity program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Tools"/>
<dataarea name="flop" size="143360">
@@ -55294,12 +58716,15 @@ license:CC0-1.0
<description>The School Speller: Magic Slate II: 80-Column Apple //e Version (version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Scott Clough, Paul Elseth, Donna Stanger, and Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-25-->
- <!--productivity program-->
+ <!-- Dump released: 2018-01-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Tools"/>
<dataarea name="flop" size="143360">
@@ -55318,12 +58743,15 @@ license:CC0-1.0
<description>The School Speller Manager: Magic Slate II: 40/80-Column Apple //e Version (version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Scott Clough, Paul Elseth, Donna Stanger, and Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-01-26-->
- <!--productivity program-->
+ <!-- Dump released: 2018-01-26 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the school speller manager v1.0 for magic slate ii 40-80 (4am crack).dsk" size="143360" crc="63b07676" sha1="2b82fce459d4efb006fd64103b3a996e43527e8c" />
@@ -55338,8 +58766,8 @@ license:CC0-1.0
<info name="developer" value="Encyclopaedia Britannica Educational Corporation" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-22. Redumped: 2023-10-08-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-22. Redumped: 2023-10-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -55360,14 +58788,230 @@ license:CC0-1.0
</part>
</software>
+ <software name="seavoyms">
+ <description>The Sea Voyagers (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Neosoft" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-03-22 -->
+ <!-- educational program -->
+ <!-- Keyboard overlay available at: https://archive.org/download/TheSeaVoyagers4amCrack/The%20Sea%20Voyagers%20%284am%20crack%29.txt -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the sea voyagers (4am crack).dsk" size="143360" crc="21466949" sha1="e277b1e1419432826046bc1feb39fa601da71b66"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="semacalc">
+ <description>The Semantic Calculator (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the semantic calculator (4am crack).dsk" size="143360" crc="cddb0387" sha1="00069c7aa855392540983eca66c1191f5853cf06" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="serpstar">
+ <description>The Serpent's Star (Brøderbund Software) (version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Ultrasoft" />
+ <info name="original_publisher" value="Ultrasoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-24 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the serpent's star (4am crack) side a.dsk" size="143360" crc="66379214" sha1="2b7ee9ac2810abb2c445f3947ef9d09f69843dd8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the serpent's star (4am crack) side b.dsk" size="143360" crc="f9624722" sha1="722bd70b4d94343bc4e5c508e8c23c10269933f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sscletfy081287" cloneof="sscletfy">
+ <description>The Sesame Street Crayon: Letters For You (version 1987-08-12) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Brian A. Rice" />
+ <info name="programmer" value="Angela Greene" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1987-08-12" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-07-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="letters for you (4am crack).dsk" size="143360" crc="2f0c8b80" sha1="388c29e8fdf79d22b70e072eb6fb9f466bffc973" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sscletfy">
+ <description>The Sesame Street Crayon: Letters For You (version 1987-10-31) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Brian A. Rice" />
+ <info name="programmer" value="Angela Greene" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1987-10-31" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-09-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="sesame street crayon- letters for you 1987-10-31 (4am crack).dsk" size="143360" crc="5dcd383a" sha1="646235e72878281a52ef7054aa75a0824c26eac7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sscopatt">
+ <description>The Sesame Street Crayon: Opposites Attract (4am crack)</description>
+ <year>1986</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Brian A. Rice" />
+ <info name="programmer" value="Rick Wetzel" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="opposites attract (4am crack).dsk" size="143360" crc="62ac96f6" sha1="d3a54214136a9569938fc9d2cc5621157eb6c064" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrdspg10" cloneof="shrdspg">
+ <description>The Shard of Spring (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Craig Roth" />
+ <info name="programmer" value="David Stark" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the shard of spring (4am crack) side a.dsk" size="143360" crc="2fb89106" sha1="f2651db23c99118fa8e115a00c9c5d6e6571e83a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the shard of spring (4am crack) side b.dsk" size="143360" crc="fb77ba19" sha1="fc7e98f4d8cafac4b46d0cbeffdcb288a332f6da" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrdspg">
+ <description>The Shard of Spring (version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Craig Roth" />
+ <info name="programmer" value="David Stark" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-27 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the shard of spring v1.1 (4am crack) side a.dsk" size="143360" crc="ef82007e" sha1="9b2032f145693e4ccbcf74953e52f61ef91d71fa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the shard of spring v1.1 (4am crack) side b.dsk" size="143360" crc="6a2c7c76" sha1="bc77d3ea3e402e2c82757fa869ef1f9dfaa4f648" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shatalli">
+ <description>The Shattered Alliance (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Lyon" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the shattered alliance (4am and san inc crack).dsk" size="143360" crc="f50ce4ae" sha1="63aef0c4b6d60dc0deef6a9cf6234e6c545cc3ac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shotherd">
+ <description>The Shot Heard 'Round The World (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Deborah Gore" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-30 -->
+ <!-- adventure game -->
+ <!-- Originally part of Microzine issue 10, this is the standalone re-release. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the shot heard round the world (4am crack).dsk" size="143360" crc="60510cc8" sha1="1e1175a3859e75084bc13eff8a0017b38180600f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdreadr">
+ <description>The Speed Reader (4am crack)</description>
+ <year>1981</year>
+ <publisher>Apple Computer</publisher>
+ <!-- "Special Delivery" label -->
+ <info name="developer" value="Davidson &amp; Associates" />
+ <info name="original_publisher" value="Davidson &amp; Associates" />
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the speed reader (4am crack).dsk" size="143360" crc="48537f3a" sha1="ca499d90c72dd8cd69aa5b1e8da7cba9e525b027" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tspellbee">
<description>The Spelling Bee (4am crack)</description>
<year>1985</year>
<publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-21-->
- <!--educational game-->
+ <!-- Dump released: 2017-04-21 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the spelling bee (4am crack).dsk" size="143360" crc="f8890faf" sha1="d59f124f3e7ebf31fe39a1271eb0650d0388e7f4" />
@@ -55375,17 +59019,113 @@ license:CC0-1.0
</part>
</software>
+ <software name="spelmach">
+ <description>The Spelling Machine (4am crack)</description>
+ <year>1985</year>
+ <publisher>The Learning Seed Company</publisher>
+ <info name="programmer" value="Robert Lawrence" />
+ <info name="programmer" value="Mark Whitehurst" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the spelling machine (4am crack).dsk" size="143360" crc="bac3ea1c" sha1="60771a47cbb3c356d38e3d2110a68c14c90efe0a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellsys">
+ <description>The Spelling System (4am crack)</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="IOTA" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the spelling system (4am crack) disk 1.dsk" size="143360" crc="48af390c" sha1="9c998daf41fa1521c215533f1a84f0eccef5b2f4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the spelling system (4am crack) disk 2.dsk" size="143360" crc="ebe3032d" sha1="a1c95dd428ded01f7250d6a553300f94dfe5f664" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the spelling system (4am crack) disk 3.dsk" size="143360" crc="64c6faa7" sha1="68a5af2542566893d1a445aa72a21377f5e92f79" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the spelling system (4am crack) disk 4.dsk" size="143360" crc="09b21175" sha1="872911f7027e6b163681def235ecfceaf8e71377" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tsnbaseb">
+ <description>The Sporting News: Baseball (4am crack)</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Steve A. Baker" />
+ <info name="programmer" value="Jim Huether" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-05-27 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="234775">
+ <rom name="the sporting news baseball (4am crack) side a.dsk" size="143360" crc="5e61f761" sha1="541ffb79035cf67bd0faab1d83371c9ea7855509" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="234775">
+ <rom name="the sporting news baseball (4am crack) side b.dsk" size="143360" crc="5422fe67" sha1="92a910d72c83459a764f0850df448054364dd71a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spysback">
+ <description>The Spy Strikes Back (4am crack)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Robert Hardy" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the spy strikes back (4am crack).dsk" size="143360" crc="bf877558" sha1="826cae2efab3fb3f87d06e54235cea33f2a4611d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="spyseuro860930" cloneof="spyseuro">
<description>The Spy's Adventures in Europe (version 1986-09-30) (4am crack)</description>
<year>1986</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Mark Pelczarski, Jeffrey Ray, Brian Poff, and Elizabeth Redlich" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="Jeffrey Ray" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Elizabeth Redlich" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1986-09-30" />
- <!--According to disk metadata-->
+ <!-- According to disk metadata -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-13-->
- <!--educational game-->
+ <!-- Dump released: 2023-12-13 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -55404,13 +59144,16 @@ license:CC0-1.0
<description>The Spy's Adventures in Europe (version 1987-05-04) (4am crack)</description>
<year>1987</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Mark Pelczarski, Jeffrey Ray, Brian Poff, and Elizabeth Redlich" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="Jeffrey Ray" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Elizabeth Redlich" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1987-05-04" />
- <!--Latest date in the disk catalog-->
+ <!-- Latest date in the disk catalog -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-14-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
<dataarea name="flop" size="143360">
@@ -55432,10 +59175,10 @@ license:CC0-1.0
<info name="developer" value="Magic Tree" />
<info name="usage" value="Requires a 64K Apple ][+ or later. Requires a 128K Apple ][+ or later for hi-res graphics." />
<info name="version" value="1986-10-01" />
- <!--According to file metadata-->
+ <!-- According to file metadata -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-26-->
- <!--educational game-->
+ <!-- Dump released: 2024-03-26 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -55454,13 +59197,16 @@ license:CC0-1.0
<description>The Spy's Adventures in North America (version 1987-05-04) (4am crack)</description>
<year>1987</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Mark Pelczarski, Jeffrey Ray, Brian Poff, and Elizabeth Redlich" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="Jeffrey Ray" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Elizabeth Redlich" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1987-05-04" />
- <!--Latest date in the disk catalog-->
+ <!-- Latest date in the disk catalog -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-15-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-15 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
<dataarea name="flop" size="143360">
@@ -55479,13 +59225,16 @@ license:CC0-1.0
<description>The Spy's Adventures in North America (version 1987-10-31) (4am crack)</description>
<year>1987</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Mark Pelczarski, Jeffrey Ray, Brian Poff, and Elizabeth Redlich" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="Jeffrey Ray" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Elizabeth Redlich" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1987-10-31" />
- <!--Latest date in the disk catalog-->
+ <!-- Latest date in the disk catalog -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-12-12-->
- <!--educational game-->
+ <!-- Dump released: 2019-12-12 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -55504,13 +59253,16 @@ license:CC0-1.0
<description>The Spy's Adventures in South America (version 1987-08-12) (4am crack)</description>
<year>1987</year>
<publisher>Polarware</publisher>
- <info name="programmer" value="Mark Pelczarski, Jeffrey Ray, Brian Poff, and Elizabeth Redlich" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="Jeffrey Ray" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Elizabeth Redlich" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="1987-08-12" />
- <!--Latest date in the disk catalog-->
+ <!-- Latest date in the disk catalog -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-13-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-13 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1"/>
<dataarea name="flop" size="143360">
@@ -55529,12 +59281,15 @@ license:CC0-1.0
<description>The Stickybear ABC (4am and san inc crack)</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Steve Worthington, Janie Worthington, Spencer K. Howe, and Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Spencer K. Howe" />
+ <info name="programmer" value="Richard Hefter" />
<info name="usage" value="Requires an Apple ][+ or later." />
- <!-- This version has unspecified differences from all other known versions.. -->
+ <!-- This version has unspecified differences from all other known versions. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-15-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stickybear abc (4am and san inc crack).dsk" size="143360" crc="b5b78e9e" sha1="c8135b28f20b4b89ebeb1d2f5aed6576cc04a6f4" />
@@ -55550,8 +59305,8 @@ license:CC0-1.0
<info name="programmer" value="Don Busik" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-14-->
- <!--educational game-->
+ <!-- Dump released: 2023-03-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the story of creation (4am crack).dsk" size="143360" crc="bd7e04f4" sha1="e789aacb6dd177a2d8d95657590035479376837e" />
@@ -55567,8 +59322,8 @@ license:CC0-1.0
<info name="usage" value="Runs on any Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-20-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="story machine (4am crack).dsk" size="143360" crc="fdd3c7fd" sha1="ccd2f80dd9b57587dc37b4a7f822d72ce4abf12e" />
@@ -55585,8 +59340,8 @@ license:CC0-1.0
<info name="version" value="revision 2" />
<!-- This unmarked revision has unspecified changes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-12-->
- <!--educational program-->
+ <!-- Dump released: 2018-03-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the story machine rev. 2 (4am crack).dsk" size="143360" crc="fd857e01" sha1="063b0b8327e725e530a9d7613d95767d091bebd8" />
@@ -55594,6 +59349,24 @@ license:CC0-1.0
</part>
</software>
+ <software name="sfactory">
+ <description>The Super Factory (version 1986) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the super factory (4am crack).dsk" size="143360" crc="e9551c89" sha1="a26870e2ab5f5afb68306034c08a8046344446d1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ttkmultch">
<description>The Teacher's Tool Kit: Multiple Choice (4am crack)</description>
<year>1984</year>
@@ -55601,8 +59374,8 @@ license:CC0-1.0
<info name="developer" value="Hi-Tech of Santa Cruz" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the teacher's tool kit- multiple choice (4am crack).dsk" size="143360" crc="77411ed9" sha1="c130c87419153918edc85e8f1e9525838352e627" />
@@ -55618,8 +59391,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the teacher's tool kit- word match v2.0 (4am crack).dsk" size="143360" crc="35bebe81" sha1="3d5ba2dfcefc92a4fe447d059712a3594dcb0b26" />
@@ -55635,8 +59408,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the teacher's tool kit- word scramble v2.0 (4am crack).dsk" size="143360" crc="8fe1caef" sha1="ad888238407e118af60ab539835c0beb8832b041" />
@@ -55652,8 +59425,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the teacher's tool kit- word search v2.0 (4am crack).dsk" size="143360" crc="507954b9" sha1="e5530242b90f2d920db3dafd340c5e0414e8f9c7" />
@@ -55661,15 +59434,52 @@ license:CC0-1.0
</part>
</software>
+ <software name="3rmicroc10" cloneof="3rmicroc">
+ <description>The Three R's of Microcomputing &amp; The Glass Computer (A-811 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-811" />
+ <info name="programmer" value="Kent Carlson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a811 the three r's of microcomputing v1.0 (4am crack).dsk" size="143360" crc="8730e040" sha1="9cdbb5dbcd340779b9ce921e6e1b2681229c1853"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3rmicroc">
+ <description>The Three R's of Microcomputing &amp; The Glass Computer (A-811 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-811" />
+ <info name="programmer" value="Kent Carlson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a811 the three r's of microcomputing v1.1 (4am crack).dsk" size="143360" crc="34a20bd6" sha1="5a6716f6b182f5cf956afaa44a76893bdca5dd66" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ttsports">
<description>The Time Tunnel: Sports Edition (4am crack)</description>
<year>1985</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Frederick Burggraf and James Gray" />
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="James Gray" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-24-->
- <!--educational game-->
+ <!-- Dump released: 2022-09-24 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the time tunnel- sports edition (4am crack).dsk" size="143360" crc="ce008069" sha1="26dc7050ab20cd23f576f753aa86fa6b6bcfef9e" />
@@ -55678,14 +59488,15 @@ license:CC0-1.0
</software>
<software name="ttpresid">
- <description>The Time Tunnel: The Presidents (4am crack)</description>
+ <description>The Time Tunnel: The America Series: The Presidents (4am crack)</description>
<year>1985</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Frederick Burggraf and Jerry Camilleri" />
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="Jerry Camilleri" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-11-14-->
- <!--educational game-->
+ <!-- Dump released: 2014-11-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the time tunnel - the presidents (4am crack).dsk" size="143360" crc="385a870e" sha1="e24d9d79f7049f2465bdf3e955895a0a2b662476" />
@@ -55697,11 +59508,13 @@ license:CC0-1.0
<description>The Tournament Manager (4am crack)</description>
<year>1985</year>
<publisher>DC Heath and Company</publisher>
- <info name="programmer" value="Dennis, Dilley, and Rucker" />
+ <info name="programmer" value="Dennis" />
+ <info name="programmer" value="Dilley" />
+ <info name="programmer" value="Rucker" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-11-16-->
- <!--educational program-->
+ <!-- Dump released: 2019-11-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="the tournament manager (4am crack).dsk" size="143360" crc="7119be0e" sha1="27cfd2599299804af61a486c1db11d7bdc5f1352" />
@@ -55709,15 +59522,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="trcrsnct">
+ <description>The Tracer Sanction (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Activision</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-06-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the tracer sanction (4am and san inc crack) side a.dsk" size="143360" crc="eed7dede" sha1="ab6424a46c847b42ef781ddad1d00cd616079537" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the tracer sanction (4am and san inc crack) side b.dsk" size="143360" crc="cefcc169" sha1="2ed544112c396469ff96c4873cfc11ea02a70fd2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trivarcd">
<description>The Trivia Arcade (4am crack)</description>
<year>1984</year>
<publisher>Screenplay</publisher>
- <info name="programmer" value="Randall Don Masteller, Michael Haire, and Don Mullen" />
+ <info name="programmer" value="Randall Don Masteller" />
+ <info name="programmer" value="Michael Haire" />
+ <info name="programmer" value="Don Mullen" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--trivia game-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- trivia game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A" />
<dataarea name="flop" size="143360">
@@ -55744,16 +59583,34 @@ license:CC0-1.0
</part>
</software>
+ <software name="usurp3">
+ <description>The Usurper Book Three: The Mines of Qyntarr (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Scott Thoman" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-11-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the usurper book three - the mines of qyntarr (4am crack).dsk" size="143360" crc="c074f3fd" sha1="6b92b4d1ffaefc44a97121a793948901c9f2ed0b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="usconnaf84" cloneof="usconnaf">
<description>The U.S. Constitution: Nationalism and Federalism (version 1984) (4am crack)</description>
<year>1984</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Mark D. Rothman, Scot Robinson, and Andrew Kunkell" />
+ <info name="programmer" value="Mark D. Rothman" />
+ <info name="programmer" value="Scot Robinson" />
+ <info name="programmer" value="Andrew Kunkell" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1984" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -55778,12 +59635,14 @@ license:CC0-1.0
<description>The U.S. Constitution: Nationalism and Federalism (version 1987) (4am crack)</description>
<year>1987</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Mark D. Rothman, Scot Robinson, and Andrew Kunkell" />
+ <info name="programmer" value="Mark D. Rothman" />
+ <info name="programmer" value="Scot Robinson" />
+ <info name="programmer" value="Andrew Kunkell" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-05-06-->
- <!--educational program-->
+ <!-- Dump released: 2022-05-06 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Development of the Constitution"/>
<dataarea name="flop" size="143360">
@@ -55804,15 +59663,240 @@ license:CC0-1.0
</part>
</software>
+ <software name="warpfctr">
+ <description>The Warp Factor (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-29 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the warp factor (4am and san inc crack).dsk" size="143360" crc="166d7cf6" sha1="9900c6421984afd5b6025506c7cef87345d2b4d2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizmath">
+ <description>The Wizard of Id's WizMath (4am crack)</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Chuck Benton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-18 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the wizard of id's wizmath (4am crack).dsk" size="143360" crc="b90a08c7" sha1="f8d13d1ef59301856c847469b107dd9251fd90db"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardoz">
+ <description>The Wizard of Oz (4am crack)</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="programmer" value="Ruth Wick" />
+ <info name="programmer" value="Ralph Hebb" />
+ <info name="programmer" value="Dan Mydlack" />
+ <info name="programmer" value="Mitch Stein" />
+ <info name="programmer" value="Howard Boles" />
+ <info name="programmer" value="Seth Godin" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-13. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the wizard of oz (4am crack) disk a - boot.dsk" size="143360" crc="a111593a" sha1="8214a6616fc571ed4e1130e0b37724bc83f5aa35" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the wizard of oz (4am crack) disk b.dsk" size="143360" crc="f7f64f0b" sha1="94be36f818a7c76ecba6a485e1b40e2f0c7a2aff" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the wizard of oz (4am crack) disk c.dsk" size="143360" crc="4e23048d" sha1="db11585b49ffd145c8b06b33b804cd64fb9efe05" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wgbbg">
+ <description>The World's Greatest Baseball Game (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Quest" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-29 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Interactive and statistical game play"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest baseball game (4am crack).dsk" size="143360" crc="321fa87d" sha1="fea4c0afb38f06eb9a35843ef7dc7aefc38a334a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wgbbgenh">
+ <description>The World's Greatest Baseball Game (enhanced edition) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Quest</publisher>
+ <info name="developer" value="Quest" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-19. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Interactive and statistical game play"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 1 - interactive and statistical game play.dsk" size="143360" crc="c625a5e8" sha1="abb4f9c4f0f1ee32e5893a326e5485a169ad3e08" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Team trading functions"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 2 - team trading functions.dsk" size="143360" crc="bb4f4115" sha1="b879dc67e6785168f02f499c1b9a60b44d07761a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - 1984 teams roster"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 3 - 1984 teams roster.dsk" size="143360" crc="034912e1" sha1="6783ed0dd291cccaf4cf2a6383d272bb4d036dbf" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - 1985 teams roster"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest baseball game (enhanced version)(4am crack) disk 4 - 1985 teams roster.dsk" size="143360" crc="6bbc19a9" sha1="12e35693433e6e2b9505c716f28322b201d26ad5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wgfbg">
+ <description>The World's Greatest Football Game (4am crack)</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Nexa Corp" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-19 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest football game (4am crack) side a.dsk" size="143360" crc="b651c2ad" sha1="3cd5414d9552560271015195f8f79084a539abaf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the world's greatest football game (4am crack) side b.dsk" size="143360" crc="28f24cf1" sha1="806945532dd7af1b037aefb56ea2f3a06fa312fc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrtwkshp">
+ <description>The Writing Workshop (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="IOTA" />
+ <info name="programmer" value="John A. Oberschelp" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-04-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - The Writing Workshop - The Milliken Word Processor program disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - the milliken word processor (4am crack).dsk" size="143360" crc="9a29b623" sha1="6e5c4d417758e916b5b9507bd6b28116bdf67914" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Brainstorming"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - brainstorming (4am crack).dsk" size="143360" crc="2102b96c" sha1="047d47956e08635fc032c9da1a66ebc72ea2d7af" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Branching"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - branching (4am crack).dsk" size="143360" crc="f3233777" sha1="e4e57bf7e12e1c835191cad9d62ef6d07ebe5d37" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - File cabinet diskette 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - file cabinet diskette 1 (4am crack).dsk" size="143360" crc="4da0bcec" sha1="df9cccce413bd3fe08820b3a9ef09d0b412fdd16" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 - File cabinet diskette 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - file cabinet diskette 2 (4am crack).dsk" size="143360" crc="3700754a" sha1="4b21258c377a7feb76292d0031a3346e3aeb3f4a" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 - Help files"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - help files (4am crack).dsk" size="143360" crc="f3ca5af0" sha1="e33c63021ce2cec4d3544e00aa5cb5c6c196ac3a" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 - Mechanics checker I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - mechanics checker i (4am crack).dsk" size="143360" crc="6eac1784" sha1="c77824c4f988ff58e9b0586175387ee98c1284f8" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 - Mechanics checker II"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - mechanics checker ii (4am crack).dsk" size="143360" crc="a1d5508b" sha1="840002439b25de8bdb4d441dc920b0a3e6a47215" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 9 - Nutshelling"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - nutshelling (4am crack).dsk" size="143360" crc="df26fd60" sha1="5700056a4ca3af02c88b3845b0e2adfa11b7fe51" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 10 - Proofreader"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - proofreader (4am crack).dsk" size="143360" crc="e31ab3bc" sha1="e78c31f854aceb0561f38c6c4898c142694a4f9c" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 11 - Spelling checker I"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - spelling checker i (4am crack).dsk" size="143360" crc="6fcf4320" sha1="4438c7228ef45a55dd26a453f9510472b4cd6c92" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 12 - Spelling checker II word list"/>
+ <dataarea name="flop" size="143360">
+ <rom name="the writing workshop - spelling checker ii word list (4am crack).dsk" size="143360" crc="f5d8349c" sha1="6f637da5b1710a7c07ce7d586ff5f309b142d1f9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="theorems">
<description>Theorems and Proofs of Theorems (4am crack)</description>
<year>1983</year>
<publisher>Intellectual Software</publisher>
- <info name="developer" value="Intellectual Software" />
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-08-15-->
- <!--educational program-->
+ <!-- Dump released: 2019-08-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
@@ -55827,15 +59911,70 @@ license:CC0-1.0
</part>
</software>
+ <software name="tmsoflre">
+ <description>Times of Lore (4am crack)</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Paul C. Isaac" />
+ <info name="programmer" value="Chris Roberts" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-04 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="times of lore (4am crack) side a.dsk" size="143360" crc="132870bc" sha1="fff29c96fa59013d29a91dc852e6bc0987d6c638" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="times of lore (4am crack) side b.dsk" size="143360" crc="328a1bf1" sha1="8a3e9a3447c851d725966e6a5eec74cd61ccea8d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thquick12">
+ <description>Think Quick! (version 1.2) (4am crack)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="think quick 1.2 (4am crack) side a.dsk" size="143360" crc="a75e7419" sha1="22b7e4cf23394f94d85663b18da620acd5f5b96d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="think quick 1.2 (4am crack) side b.dsk" size="143360" crc="98237aa2" sha1="c7f022caf3aa8bce91397b0081a509e286291535" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Storage"/>
+ <dataarea name="flop" size="143360">
+ <rom name="think quick 1.2 (4am crack) storage disk.dsk" size="143360" crc="33f5a093" sha1="d51eaef571e24ca419f0a93ae740ccfbbf6c4a4f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="thkmathunps">
<description>Thinkers: Mathematics Unlimited Problem Solving (4am crack)</description>
<year>1986</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
- <info name="developer" value="Holt, Rinehart, and Winston" />
+ <publisher>Holt, Rinehart and Winston</publisher>
+ <info name="developer" value="Holt, Rinehart and Winston" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-31-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-31 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -55862,15 +60001,231 @@ license:CC0-1.0
</part>
</software>
+ <software name="thrshold">
+ <description>Threshold (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Warren Schwader" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="threshold (4am and san inc crack).dsk" size="143360" crc="29349e3a" sha1="5211b0bc9e7a20bad932b3f2b14e5e9b737f7c57" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thndlght">
+ <description>Thunder and Lightning (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="thunder and lightning (4am crack).dsk" size="143360" crc="ea7ca755" sha1="2ed219d94d9704c65b8506739af2c85915ed334e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thunbomb">
+ <description>Thunder Bombs (4am crack)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Tom Becklund" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-02-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="thunder bombs (4am crack).dsk" size="143360" crc="96ca4434" sha1="fec4f16b5434b0a639b8d480e08981a1871ff42c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tigrtale">
+ <description>Tiger's Tales: A Reading Adventure (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="programmer" value="Eric Grubbs" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tiger's tales (4am crack).dsk" size="143360" crc="432dd3ae" sha1="cfeb7c0c9e60c9eb318f14c06f0b5312b2a1dfd0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tcgrogfg">
+ <description>Tim and the Cat and Grog the Frog (version 06.10.92) (4am crack)</description>
+ <year>1992</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="programmer" value="Jason Kelley" />
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Steve Brower" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="06.10.92" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-31 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 1a.dsk" size="143360" crc="20f92b22" sha1="ff5acd10bfad1e0b3d9c96150c764deb27843226"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 1b.dsk" size="143360" crc="e7424f95" sha1="eea6681584be1f49535f290fabe25f7d7668a0ba"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 2a.dsk" size="143360" crc="f69ad29c" sha1="bf74e1986be0908e378b12daa0ec02adfbf62ad3"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 2b.dsk" size="143360" crc="9af4c87f" sha1="d5895fa59fa11e4bc6042bf79586aa89bc7354f8"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 3a.dsk" size="143360" crc="bc3ed7ba" sha1="07c5366f8522ae268cb5af6ab7adfa7498868865"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 3b.dsk" size="143360" crc="85724e52" sha1="1b04a1fa44a3a6f3404ffc760a787378f65fef03"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 4a.dsk" size="143360" crc="9b976533" sha1="d19f3ae0bc405db88343ccd34f08149a9bafb035"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 4b.dsk" size="143360" crc="9138fb30" sha1="d1a2b0832c1e5a8ec6b7ec1c96a6ed110b9c6084"/>
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 5a.dsk" size="143360" crc="e4cfdc60" sha1="349f56ba7e3ed65715c09ad4278c8580dbad07ba"/>
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and grog the frog (4am crack) disk 5b.dsk" size="143360" crc="7219dd6e" sha1="ad333036506d08b5d2962eed64d6eae3d9ee92d5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tcjenhen">
+ <description>Tim and the Cat and Jen the Hen (version 09.02.89) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="programmer" value="Jason Kelley" />
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Tom Lowery" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="09.02.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="Tim and the Cat and Jen the Hen (4am crack) disk 1.dsk" size="143360" crc="c31e5a43" sha1="160b933402a5e9aed76cef4dea968ef9ece66220" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="Tim and the Cat and Jen the Hen (4am crack) disk 2.dsk" size="143360" crc="9b550247" sha1="172d79434703e5b25ebacf005694f5cfed018a1f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tcbrhat">
+ <description>Tim and the Cat and the BIG Red Hat (version 09.02.89) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="programmer" value="Jason Kelley" />
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Tom Lowery" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="09.02.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tim and the cat and the big red hat (4am crack).dsk" size="143360" crc="20727d18" sha1="dc65a4dd3aa7e6b56b038bd96dd8587ba454fe1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tcfishd">
+ <description>Tim and the Cat and the Fish Dish (version 09.02.89) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="programmer" value="Jason Kelley" />
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Tom Lowery" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="09.02.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="Tim and the Cat and the Fish Dish (4am crack) disk 1.dsk" size="143360" crc="f4ed692e" sha1="21980204c6d3173bf5cf29bcb5ddf394cee2576a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="Tim and the Cat and the Fish Dish (4am crack) disk 2.dsk" size="143360" crc="d4738ff4" sha1="f1b7e231d5080e3e1fb84048e5061bbf4b7284b2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="timecaps">
<description>Time Capsule (4am crack)</description>
<year>1985</year>
<publisher>Learning Well</publisher>
- <info name="programmer" value="Max Heffler and Dave Mark" />
+ <info name="programmer" value="Max Heffler" />
+ <info name="programmer" value="Dave Mark" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-01-->
- <!--educational game-->
+ <!-- Dump released: 2022-10-01 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -55885,16 +60240,110 @@ license:CC0-1.0
</part>
</software>
+ <software name="timenav_525">
+ <description>Time Navigator (A-247 version 1.0) (4am crack)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-247" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a247 time navigator v1.0 (4am crack) side a.dsk" size="143360" crc="02ac6cbb" sha1="0a7eb7a62cf639c2eab9e839b1a8623c2cc5a6c1"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a247 time navigator v1.0 (4am crack) side b.dsk" size="143360" crc="23ac1066" sha1="4ea6eaa0b8a46abab2084fc3aee9a3586cf5e08d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenavaw_525">
+ <description>Time Navigator Around the World (A-277 version 1.0) (4am crack)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-277" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Ed Gratz" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-12-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a277 time navigator around the world v1.0 (4am crack) side a.dsk" size="143360" crc="c6509fbb" sha1="bd1f61736c54ad5456e94628518673e7a800ff9e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a277 time navigator around the world v1.0 (4am crack) side b.dsk" size="143360" crc="ecdb18b6" sha1="6e3838031f0d0523a9600679fb01c5002074e13b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenavlb_525">
+ <description>Time Navigator Leaps Back (A-225 version 1.0) (4am crack)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-225" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a225 time navigator leaps back v1.0 (4am crack) side a.dsk" size="143360" crc="242dc594" sha1="59ad4f92ff06798faa86ffcbe2cece6eee86aa12"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a225 time navigator leaps back v1.0 (4am crack) side b.dsk" size="143360" crc="1f30e5de" sha1="9665ba1b767079283fd312db1f4d2f13637ddb52"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="tttinkamaz">
- <description>Tink!Tonk!: Tinka's Mazes by Mercer Mayer (4am crack)</description>
+ <description>Tink!Tonk!: Tinka's Mazes (4am crack)</description>
<year>1985</year>
<publisher>Mindscape</publisher>
<info name="author" value="Mercer Mayer"/>
<info name="developer" value="Angelsoft" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-27-->
- <!--educational game-->
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -55910,15 +60359,15 @@ license:CC0-1.0
</software>
<software name="tttinkadv">
- <description>Tink!Tonk!: Tink's Adventure by Mercer Mayer (4am crack)</description>
+ <description>Tink!Tonk!: Tink's Adventure (4am crack)</description>
<year>1984</year>
<publisher>Mindscape</publisher>
<info name="author" value="Mercer Mayer"/>
- <info name="developer" value=" Angelsoft" />
+ <info name="developer" value="Angelsoft" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-11-->
- <!--educational game-->
+ <!-- Dump released: 2015-08-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="tink's adventure (4am crack).dsk" size="143360" crc="023dc074" sha1="79dd0db9ce35cfd404d8ac4247c0930ae7185e30" />
@@ -55927,15 +60376,15 @@ license:CC0-1.0
</software>
<software name="tttinksubf">
- <description>Tink!Tonk!: Tink's Subtraction Fair by Mercer Mayer (4am crack)</description>
+ <description>Tink!Tonk!: Tink's Subtraction Fair (4am crack)</description>
<year>1985</year>
<publisher>Mindscape</publisher>
<info name="author" value="Mercer Mayer"/>
- <info name="developer" value=" Angelsoft" />
+ <info name="developer" value="Angelsoft" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-05-30. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2018-05-30. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="tink tonk - tink's subtraction fair (4am crack).dsk" size="143360" crc="d5f01512" sha1="033cd431fc8dc26950c237fa992311d45503ab47" />
@@ -55944,15 +60393,15 @@ license:CC0-1.0
</software>
<software name="tttonkldbb">
- <description>Tink!Tonk!: Tonk in the Land of the Buddy-Bots by Mercer Mayer (4am crack)</description>
+ <description>Tink!Tonk!: Tonk in the Land of the Buddy-Bots (4am crack)</description>
<year>1984</year>
<publisher>Mindscape</publisher>
<info name="author" value="Mercer Mayer"/>
- <info name="developer" value=" Angelsoft" />
+ <info name="developer" value="Angelsoft" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-06-01. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2018-06-01. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="tink tonk - tonk in the land of the buddy-bots (4am crack).dsk" size="143360" crc="04ace393" sha1="55ce15aa2cbb36086a0f2748c8959b4cd82c817c" />
@@ -55961,15 +60410,15 @@ license:CC0-1.0
</software>
<software name="tttukgstwn">
- <description>Tink!Tonk!: Tuk Goes to Town by Mercer Mayer (4am crack)</description>
+ <description>Tink!Tonk!: Tuk Goes to Town (4am crack)</description>
<year>1984</year>
<publisher>Mindscape</publisher>
<info name="author" value="Mercer Mayer"/>
- <info name="developer" value=" Angelsoft" />
+ <info name="developer" value="Angelsoft" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-09-02. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2017-09-02. Redumped: 2021-08-28 due to subtle timing differece between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="tink tonk tuk goes to town (4am crack).dsk" size="143360" crc="21d4031d" sha1="4b1909095baacdb89a06c84bc5f50a8947b66043" />
@@ -55977,6 +60426,58 @@ license:CC0-1.0
</part>
</software>
+ <software name="tipnflip">
+ <description>Tip 'N Flip (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Simon Lie" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-01 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tip 'n flip (4am crack).dsk" size="143360" crc="b8a8d0f5" sha1="1884746ae8a10ac5f2a1f94562793b566cec118f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prsprodf_525">
+ <description>To Preserve, Protect and Defend (A-198 version 1.1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-198" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a198 to preserve, protect and defend v1.1 (4am crack).dsk" size="143360" crc="7ffba023" sha1="29e318b73420c11020a84d46f021e7e18a45189b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tobbslalg">
+ <description>Tobbs Learns Algebra: Puzzles and Problem Solving (version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tobbs learns algebra (4am crack).dsk" size="143360" crc="b6c50790" sha1="20e129238d65cc6e80f2b2098befc45a53081fef" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trcgd2">
<description>Top Readers' Club: Grade 2 (4am crack)</description>
<year>1989</year>
@@ -55984,8 +60485,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="top readers' club- grade 2 (4am crack).dsk" size="143360" crc="180d11b9" sha1="1e68677c209f6ace614a1efcad4775a212070bfa" />
@@ -56000,8 +60501,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="top readers' club- grade 3 (4am crack).dsk" size="143360" crc="db5ae01b" sha1="4d342c6f9697be2d95617b74903ee71117e1f242" />
@@ -56016,8 +60517,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="top readers' club- grade 4 (4am crack).dsk" size="143360" crc="6b9d57bd" sha1="727b659aef26e55bf2bc473a891964d367240645" />
@@ -56032,8 +60533,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-06-29-->
- <!--educational program-->
+ <!-- Dump released: 2024-06-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="top readers' club- grade 5 (4am crack).dsk" size="143360" crc="85c6d93c" sha1="34813d689eb0f9d41f92d0057d29fa504075154a" />
@@ -56041,15 +60542,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="torpfire">
+ <description>Torpedo Fire (4am and san inc crack)</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Lyonn" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="torpedo fire (4am and san inc crack).dsk" size="143360" crc="8a1c21e1" sha1="ea77512fab09e5d7a676bdf40e171dfaec4a17d9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="totlearn">
<description>Total Learning System (4am crack)</description>
<year>1983</year>
<publisher>H, Inc.</publisher>
- <info name="programmer" value="Scott J. Clough and W. Anthony Smith" />
+ <info name="programmer" value="Scott J. Clough" />
+ <info name="programmer" value="W. Anthony Smith" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -56064,14 +60582,47 @@ license:CC0-1.0
</part>
</software>
+ <software name="tbtrrdsk">
+ <description>Toward Better Reading Skills (4am crack)</description>
+ <year>1986</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="toward better reading skills (4am crack).dsk" size="143360" crc="1df28795" sha1="3ef9ca205e8944111f4076e8261359d0e783e95e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tradpost">
+ <description>Trading Post (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Janet Brawner" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="trading post (4am crack).dsk" size="143360" crc="12235b59" sha1="93d5b1d2a4c2e435255fb640465f0fbf54ff1dd5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trains">
<description>Trains (4am crack)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
- <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="developer" value="Spinnaker Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-03-08-->
- <!--educational game-->
+ <!-- Dump released: 2018-03-08 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="trains (4am crack).dsk" size="143360" crc="2c1b5629" sha1="45650352ac0446bfec95bd93f0899bc25b6a0f6e" />
@@ -56079,15 +60630,127 @@ license:CC0-1.0
</part>
</software>
+ <software name="trantran11" cloneof="trantran">
+ <description>Transportation Transformation (version 1.1) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="transportation transformation v1.1 (4am crack) disk 1 - program.dsk" size="143360" crc="a4085e64" sha1="c650106a8952714115debda3e16b0a1794f6cafc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Art" />
+ <dataarea name="flop" size="143360">
+ <rom name="transportation transformation v1.1 (4am crack) disk 2 - art.dsk" size="143360" crc="742754cd" sha1="d389e47634ebe6113def7908bbd2d35a108ff22d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trantran">
+ <description>Transportation Transformation (version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-05-27 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="transportation transformation (4am crack) side a.dsk" size="143360" crc="24ad5d3b" sha1="1b0e956a5453452e691ac7a5093581e9833276f8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Art"/>
+ <dataarea name="flop" size="143360">
+ <rom name="transportation transformation (4am crack) side b.dsk" size="143360" crc="742754cd" sha1="d389e47634ebe6113def7908bbd2d35a108ff22d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl82" cloneof="transyl">
+ <description>Transylvania (version 1982) (Penguin Software) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1982" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="transylvania 1982 (4am crack).dsk" size="143360" crc="68d44ab2" sha1="541de6cb27d1a70502139b30cee71be4d9cff34e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl84" cloneof="transyl">
+ <description>Transylvania (version 1984) (Penguin Software) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="programmer" value="Steven Meuse" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1984" />
+ <!-- Re-release with double hi-res graphics. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="transylvania 1984 (4am crack).dsk" size="143360" crc="85ba86cd" sha1="ae05ef72d7e0cc94dda195da630b784a8d988589" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl">
+ <description>Transylvania (version 1985) (Polarware) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Polarware</publisher>
+ <info name="original_publisher" value="Penguin Software" />
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <!-- Re-release by Polarware with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-01-30 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="transylvania 1985 (4am crack) side a.dsk" size="143360" crc="2f86c356" sha1="18ec83ce3520e8fae2eb6e8d3312e9712baa5459" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="transylvania 1985 (4am crack) side b.dsk" size="143360" crc="d73ceb4d" sha1="374d001aa9180a915b1c5e06dac92b59ad094f7b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="twztusa">
<description>Travels with Za-Zoom: The United States (4am crack)</description>
<year>1984</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Frederick Burggraf and Priscilla Minnich" />
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="Priscilla Minnich" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-11-14-->
- <!--educational program-->
+ <!-- Dump released: 2014-11-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="travels with za-zoom - the united states (4am crack).dsk" size="143360" crc="b4ab7528" sha1="486fbd46b0290bf5e4a1d5cec62f67c05b323221" />
@@ -56099,12 +60762,13 @@ license:CC0-1.0
<description>Travels with Za-Zoom: The World (revision 1) (4am crack)</description>
<year>1984</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Frederick Burggraf and Priscilla Minnich" />
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="Priscilla Minnich" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-11-14-->
- <!--educational program-->
+ <!-- Dump released: 2014-11-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="travels with za-zoom - the world (4am crack).dsk" size="143360" crc="99196e5a" sha1="399fca093f2b85a20ad2b344ba2b29671c717e92" />
@@ -56116,13 +60780,14 @@ license:CC0-1.0
<description>Travels with Za-Zoom: The World (revision 2) (4am crack)</description>
<year>1984</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Frederick Burggraf and Priscilla Minnich" />
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="Priscilla Minnich" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--This undated revision fixes several spelling and grammar mistakes.-->
+ <!-- This undated revision fixes several spelling and grammar mistakes. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="travels with za-zoom- the world rev. 2 (4am crack).dsk" size="143360" crc="da36cc5c" sha1="a1390091e342263a9b2f07863a3a139ddda40d5e" />
@@ -56130,15 +60795,307 @@ license:CC0-1.0
</part>
</software>
+ <software name="trisland">
+ <description>Treasure Island (4am crack)</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="developer" value="Byron Preiss Video Productions" />
+ <info name="programmer" value="Michael P. Meyer" />
+ <info name="programmer" value="John Pierard" />
+ <info name="programmer" value="Ann Weil" />
+ <info name="programmer" value="Andre Garneau" />
+ <info name="programmer" value="Lee Jacknow" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-03. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="treasure island (4am crack) side a.dsk" size="143360" crc="ae6fd6fd" sha1="8ea61af42b958161c3b50148683e1d8c27573d16" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="treasure island (4am crack) side b.dsk" size="143360" crc="c3ca1416" sha1="000ffa7d1a40ce5d892a94690a5a398c15bceafc" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C"/>
+ <dataarea name="flop" size="143360">
+ <rom name="treasure island (4am crack) side c.dsk" size="143360" crc="0f671042" sha1="3297a11b79c7185a77e8eabd1e93e3d2dabe0a45" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D"/>
+ <dataarea name="flop" size="143360">
+ <rom name="treasure island (4am crack) side d.dsk" size="143360" crc="ba3b4b42" sha1="5ce7ab049c18615ee5165620aa23185523c5a1e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tr4sale_525">
+ <description>Treasures for Sale (A-337 version 1.0) (4am crack)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-310" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a337 treasures for sale v1.0 (4am crack).dsk" size="143360" crc="93303a05" sha1="b977e56e509cdb719324356eead3c3856c472e8b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trigrtri">
+ <description>Trigonometry of the Right Triangle (version 1.0) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Donald Ross" />
+ <info name="programmer" value="Neil Sambol" />
+ <info name="programmer" value="Hugh M. McNally" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="trigonometry of the right triangle (4am crack).dsk" size="143360" crc="5df10ea8" sha1="b11261d6deaa21f6484b084f2307c3bb29539c85" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tfsbiog">
+ <description>Troll First-Start: Biographies (4am crack)</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="troll first start - biographies (4am crack).dsk" size="143360" crc="f256e71c" sha1="9baecae28c2b6044923a8d6e79d7809311b3d5f0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tfssci">
+ <description>Troll First-Start: Science (4am crack)</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="troll first start - science (4am crack).dsk" size="143360" crc="04cab9dc" sha1="455a6021ff0f97bbd8ed1bb3140ba3d5efd2669c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc1addsub">
+ <description>Troll Math Class Level 1: I Can Add And Subtract (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math level 1 - i can add and subtract (4am crack).dsk" size="143360" crc="37700561" sha1="212a3c25571020808e955a9c434441fd8f5e2480" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc2carbor">
+ <description>Troll Math Class Level 2: I Can Carry and Borrow (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="i can carry and borrow (4am crack).dsk" size="143360" crc="320a88db" sha1="a499ec09f86e047f59aa9dc8b802218fbf2a6c57" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc3muldiv">
+ <description>Troll Math Class Level 3: I Can Multiply and Divide (4am crack)</description>
+ <year>1988</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math level 3 - i can multiply and divide (4am crack).dsk" size="143360" crc="0009b0b1" sha1="f7f3bd20bf9bd036cf8692e34c205e5b1dcd4559" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc4aaas">
+ <description>Troll Math Class Level 4: Advanced Addition and Subtraction (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Bonnie Brook" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math level 4 - advanced addition and subtraction (4am crack).dsk" size="143360" crc="b3f18736" sha1="81356155aee90a4e6293e20cd0e9463e7443c99e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc5amad">
+ <description>Troll Math Class Level 5: Advanced Multiplication and Division (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Bonnie Brook" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math class level 5 (4am crack).dsk" size="143360" crc="09d86525" sha1="0e52df951a0812b17591a5252f7d2149aed97180" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc6rpp">
+ <description>Troll Math Class Level 6: Ratio, Proportion, and Percent (4am crack)</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Bernie Gallagher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="math level 6 - ratio, proportion, and percent (4am crack).dsk" size="143360" crc="5d17ef07" sha1="cfe7cf99d0c09cd3347e14119895e64571e45a53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmckicanc">
+ <description>Troll Math Class Level K: I Can Count (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="i can count (4am crack).dsk" size="143360" crc="58f4f160" sha1="970b365f7d005f30b31608c61d9b4f9407d6fb7e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tpmholfun">
+ <description>Troll Printmaker: Holiday Fun (4am crack)</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-09-03 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="troll printmaker - holiday fun (4am crack) disk 1 - program.dsk" size="143360" crc="0f06585e" sha1="2510ed086f2daa94cab2ff04f9da88d070b0ea7a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="troll printmaker - holiday fun (4am crack) disk 2 - data.dsk" size="143360" crc="82a69300" sha1="664d4795702c6ef2ec624dda67d0686c42de5555" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tomsawyr">
+ <description>Troll Reading Games: The Adventures of Tom Sawyer (4am crack)</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="troll reading games - the adventures of tom sawyer (4am crack).dsk" size="143360" crc="9cd36012" sha1="f6a67b18f28597de4d0c64e7e9d562041e25d6a6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trlspmth_525" cloneof="trlspmth">
<description>Troll Sports Math: Math Word Problems for Grades 4 to 6 (4am crack)</description>
<year>1991</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Millicent Sabater, Gregory Truex, Thomas Whiting, and Toby Shack" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Shack" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-19-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="troll sports math- math word problems for grades 4-6 (4am crack).dsk" size="143360" crc="ec0a84f0" sha1="dfca6cc1749541393e6f39f0aa7f9c6880c23c69" />
@@ -56150,11 +61107,14 @@ license:CC0-1.0
<description>Troll Sports Math: Math Word Problems for Grades 4 to 6 (800K 3.5") (4am and san inc crack)</description>
<year>1991</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Millicent Sabater, Gregory Truex, Thomas Whiting, and Toby Shack" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Shack" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-05-27-->
- <!--educational program-->
+ <!-- Dump released: 2019-05-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="troll sports math (4am and san inc crack).po" size="819200" crc="468174b2" sha1="0589b0531d1982e78c229bc0a294ae9513901ec9" />
@@ -56162,18 +61122,85 @@ license:CC0-1.0
</part>
</software>
+ <software name="troltaler1" cloneof="troltale">
+ <description>Troll's Tale (revision 1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="developer" value="Sierra On-Line" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-21 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="troll's tale (4am crack).dsk" size="143360" crc="18e35796" sha1="2ac2ccee64e017f834ab46a6091e1a677c3d8421" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="troltale">
+ <description>Troll's Tale (revision 2) (4am and san inc crack)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="developer" value="Sierra On-Line" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="troll's tale rev. 2 (4am and san inc crack).dsk" size="143360" crc="bef3e3cc" sha1="dc761551f75be849088da5fbdcc795a4e41c9f9c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tuemorqu">
+ <description>Tuesday Morning Quarterback (4am crack)</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Charles Anderson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-11 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="tuesday morning quarterback (4am crack).dsk" size="143360" crc="270140ae" sha1="e5bd9b573c58774df011122f7641b1e9b8f98d84" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tuneit2">
+ <description>Tune It ][ (4am crack)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Fred Willman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="Tune it ][ (4am crack).dsk" size="143360" crc="e512029f" sha1="e8acc071da75974b42a4d4ed9b956984a05c8546" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="typehype">
<description>Type Hype (revision 2) (4am crack)</description>
<year>1984</year>
<publisher>Comp-Unique</publisher>
<info name="programmer" value="Richard Dlugo" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
- <!--Side A uses lowercase letters and requres an Apple //e or later. Side B works on an Apple ][+.-->
+ <!-- Side A uses lowercase letters and requres an Apple //e or later. Side B works on an Apple ][+. -->
<info name="version" value="revision 2" />
- <!--Compared to other archived images, this one has additional lessons, suggesting a newer version.-->
+ <!-- Compared to other archived images, this one has additional lessons, suggesting a newer version. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -56193,12 +61220,13 @@ license:CC0-1.0
<year>1981</year>
<publisher>Barron Enterprises</publisher>
<info name="alt_title" value="TYPE RIGHT On Your Own Microcomputer: For the APPLE IIe"/>
- <!--Title screen-->
- <info name="programmer" value="Helen Barron and Marlinde Jurgensen" />
+ <!-- Title screen -->
+ <info name="programmer" value="Helen Barron" />
+ <info name="programmer" value="Marlinde Jurgensen" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-26-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -56213,6 +61241,441 @@ license:CC0-1.0
</part>
</software>
+ <software name="type2lrn">
+ <description>Type to Learn (version 08-OCT-85) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="developer" value="SoftCole" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <info name="version" value="08-OCT-85" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="type to learn (4am crack) disk 1.dsk" size="143360" crc="9cfd9659" sha1="6e280afbe69351574b3b5d1e44d33c9967082f71" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="type to learn (4am crack) disk 2.dsk" size="143360" crc="87026c54" sha1="17543e8f799b6c39cc0ac1c404910c9c02369215" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima1">
+ <description>Ultima I: The First Age of Darkness (Origin Systems) (4am crack)</description>
+ <!-- copyright is different from the Ultima Trilogy version -->
+ <year>1986</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="original_publisher" value="California Pacific Computer Company" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-20 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="ultima i - the beginning (4am crack).dsk" size="143360" crc="dfd24b04" sha1="5d2489d1ff07b2b29bca06f9bc6eb8b8ec153f6e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima2r1" cloneof="ultima2">
+ <description>Ultima II: Revenge of the Enchantress (On-Line Systems) (revision 1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Keith Zabalaoui" />
+ <info name="programmer" value="Helen Walker" />
+ <info name="programmer" value="Owen Garriott" />
+ <info name="programmer" value="Howard Makler" />
+ <info name="programmer" value="Mary Taylor Rollo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program master disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 1 (4am crack) disk 1 - program master.dsk" size="143360" crc="3d83a419" sha1="ad0f3e7515bb439c61d98e45b980ca786f44cc10"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player master disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 1 (4am crack) disk 2 - player master.dsk" size="143360" crc="ed3b8497" sha1="d7f9ad3f50c4e26f5644c42df79324c61be9efdf"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Galactic disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 1 (4am crack) disk 3 - galactic disk.dsk" size="143360" crc="ae5dcd69" sha1="5f20aab52719a98fa0eeab03bf427dd36f014284"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima2r2" cloneof="ultima2">
+ <description>Ultima II: Revenge of the Enchantress (On-Line Systems) (revision 2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Keith Zabalaoui" />
+ <info name="programmer" value="Helen Walker" />
+ <info name="programmer" value="Owen Garriott" />
+ <info name="programmer" value="Howard Makler" />
+ <info name="programmer" value="Mary Taylor Rollo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program master disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 2 (4am crack) disk 1 - program master.dsk" size="143360" crc="3fa83c21" sha1="af3b5b1300cf972d501946edc205f261b0690adb"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player master disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 2 (4am crack) disk 2 - player master.dsk" size="143360" crc="ed3b8497" sha1="d7f9ad3f50c4e26f5644c42df79324c61be9efdf"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Galactic disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 2 (4am crack) disk 3 - galactic disk.dsk" size="143360" crc="ae5dcd69" sha1="5f20aab52719a98fa0eeab03bf427dd36f014284"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima2r3" cloneof="ultima2">
+ <description>Ultima II: Revenge of the Enchantress (On-Line Systems) (revision 3) (4am crack)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Keith Zabalaoui" />
+ <info name="programmer" value="Helen Walker" />
+ <info name="programmer" value="Owen Garriott" />
+ <info name="programmer" value="Howard Makler" />
+ <info name="programmer" value="Mary Taylor Rollo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <!-- Adds a feature to make a copy of the player master disk before you create a character. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program master disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 3 (4am crack) - disk 1 - program master.dsk" size="143360" crc="29b8c634" sha1="a8408eec3a37f99a1c1e91603c3f9676032a3cce"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player master disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 3 (4am crack) - disk 2 - player master.dsk" size="143360" crc="ed3b8497" sha1="d7f9ad3f50c4e26f5644c42df79324c61be9efdf"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Galactic disk"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii rev. 3 (4am crack) - disk 3 - galactic disk.dsk" size="143360" crc="ae5dcd69" sha1="5f20aab52719a98fa0eeab03bf427dd36f014284"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima2">
+ <description>Ultima II: Revenge of the Enchantress (Origin Systems) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Origin Systems</publisher>
+ <info name="original_publisher" value="On-Line Systems" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Keith Zabalaoui" />
+ <info name="programmer" value="Helen Walker" />
+ <info name="programmer" value="Owen Garriott" />
+ <info name="programmer" value="Howard Makler" />
+ <info name="programmer" value="Mary Taylor Rollo" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-26 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program master disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii (4am crack) disk 1 - program.dsk" size="143360" crc="5e0e35cf" sha1="7c2036a84afafcf5b9a620802432314ed0dbe400" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player master disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii (4am crack) disk 2 - player master.dsk" size="143360" crc="0c598c85" sha1="63869be7c0bcc550a78832f8273f8b0be66eec65" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Scenario copy utility" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima ii (4am crack) disk 3 - scenario disk copy utility.dsk" size="143360" crc="f61b02bc" sha1="5fd1cbb71a7430b7945500a7d133bf5c6c868356" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima4">
+ <description>Ultima IV: Quest of the Avatar (4am crack)</description>
+ <year>1985</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="programmer" value="Patrica Hunter" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="programmer" value="Roe Adams" />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-19 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program Disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima iv (4am crack) side a - program.dsk" size="143360" crc="165b2b0d" sha1="de6785de3b3a1d443d8e4c1aee4e17f70ede5c08" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Towne Disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima iv (4am crack) side b - towne.dsk" size="143360" crc="2323f5ea" sha1="ed5088e7624c899989768ae530d96a2f296a3b0f" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C - Britannia Disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima iv (4am crack) side c - britannia.dsk" size="143360" crc="f4d69a6e" sha1="7f138590deb61388e612683bbc890f16d397421c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D - Underworld Disk" />
+ <dataarea name="flop" size="143360">
+ <rom name="ultima iv (4am crack) side d - underworld.dsk" size="143360" crc="4b0f3f9f" sha1="3818785c303165ac2bc1f4bb9657b58aa4c9069a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima5200288" cloneof="ultima5">
+ <description>Ultima V: Warriors of Destiny (version 20-FEB-88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Mark Hammer" />
+ <info name="programmer" value="Steve Meuse" />
+ <info name="programmer" value="John Miles" />
+ <info name="programmer" value="Toshi Morita" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="20-FEB-88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-05 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 1a - program.dsk" size="143360" crc="299da587" sha1="06606409c7d7425a3558829a0884b299bde3f0ba" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Dungeon"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 1b - dungeon.dsk" size="143360" crc="bb2823bb" sha1="0184fa1c0513052d522872c1cce2b5c12371d4ae" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Britannia"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 2a - britannia.dsk" size="143360" crc="aa4c6c87" sha1="a5e41dab3b38380fd4bfebd217934b3c64beb6f1" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Underworld"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 2b - underworld.dsk" size="143360" crc="cadb9cf5" sha1="39b0217ce1dd098ef502b843a9e57c5888a96b1c" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Towne"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 3a - towne.dsk" size="143360" crc="90f74781" sha1="5e1da7806377674f1918191a743072e7907ab753" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Dwelling"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 3b - dwelling.dsk" size="143360" crc="4966c93c" sha1="a35e7682a9b569e4d8b651fc10a3614ba5329862" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A - Castle"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 4a - castle.dsk" size="143360" crc="99fb8af2" sha1="e9c8d78973ff2d079d646a3e6b9e05a6fab59db2" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B - Keep"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v (4am crack) disk 4b - keep.dsk" size="143360" crc="9d0d1dac" sha1="ee06c9c4fea4aca0baa307d063ba2b2b86725295" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima5020388" cloneof="ultima5">
+ <description>Ultima V: Warriors of Destiny (version 02-MAR-88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Mark Hammer" />
+ <info name="programmer" value="Steve Meuse" />
+ <info name="programmer" value="John Miles" />
+ <info name="programmer" value="Toshi Morita" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="02-MAR-88" />
+ <!-- This version clarifies some wording in the transfer character utility, removed unused strings, and corrects a spelling mistake. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-15 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 1a - program.dsk" size="143360" crc="d145d91a" sha1="8daa4a1b5ff93b25c6635897402a02bcaacd0a73" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Dungeon"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 1b - dungeon.dsk" size="143360" crc="4c440f68" sha1="b49ce49dcb93b53e0c0c988e28bd92d294d48615" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Britannia"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 2a - britannia.dsk" size="143360" crc="6411c42a" sha1="e2eb617a34f81ca8764fd2f19907db5ea04384d9" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Underworld"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 2b - underworld.dsk" size="143360" crc="01cb45d6" sha1="e3a8e4d97a3421118167830f677bd412a2c1f906" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Towne"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 3a - towne.dsk" size="143360" crc="90f74781" sha1="5e1da7806377674f1918191a743072e7907ab753" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Dwelling"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 3b - dwelling.dsk" size="143360" crc="c8fab5af" sha1="033fa4d1199d66cee3fade5e9796a00d5c3f87d8" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A - Castle"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 4a - castle.dsk" size="143360" crc="99fb8af2" sha1="e9c8d78973ff2d079d646a3e6b9e05a6fab59db2" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B - Keep"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v02-mar-88 (4am crack) disk 4b - keep.dsk" size="143360" crc="9d0d1dac" sha1="ee06c9c4fea4aca0baa307d063ba2b2b86725295" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima5">
+ <description>Ultima V: Warriors of Destiny (version 12-APR-88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Mark Hammer" />
+ <info name="programmer" value="Steve Meuse" />
+ <info name="programmer" value="John Miles" />
+ <info name="programmer" value="Toshi Morita" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="12-APR-88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 1a - program.dsk" size="143360" crc="fdf8d239" sha1="ec66b47cd49eb91b79f07198a3b7b06fb1273e50" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1, Side B - Dungeon"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 1b - dungeon.dsk" size="143360" crc="6f36e773" sha1="6a7a915991352c5e317c345a79ed1ca4d498e0e3" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Britannia"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 2a - britannia.dsk" size="143360" crc="2384a0c9" sha1="13582caf301a7931ee0237f97c06615dbbb3afea" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Underworld"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 2b - underworld.dsk" size="143360" crc="3040d467" sha1="d01a114b703b2b2b9aab1aa83b1133ed1c30a980" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Towne"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 3a - towne.dsk" size="143360" crc="90f74781" sha1="5e1da7806377674f1918191a743072e7907ab753" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Dwelling"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 3b - dwelling.dsk" size="143360" crc="c8fab5af" sha1="033fa4d1199d66cee3fade5e9796a00d5c3f87d8" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A - Castle"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 4a - castle.dsk" size="143360" crc="99fb8af2" sha1="e9c8d78973ff2d079d646a3e6b9e05a6fab59db2" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B - Keep"/>
+ <dataarea name="flop" size="143360">
+ <rom name="ultima v v12-apr-88 (4am crack) disk 4b - keep.dsk" size="143360" crc="9d0d1dac" sha1="ee06c9c4fea4aca0baa307d063ba2b2b86725295" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="uccsbcon">
<description>Uncle Clyde's Consonant Slides: Beginning Consonants (4am crack)</description>
<year>1993</year>
@@ -56220,8 +61683,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="uncle clyde's consonant slides - beginning consonants (4am crack).dsk" size="143360" crc="239d4daa" sha1="7b530d4f20e8275e767c6a23e37de3cb85f2fe4c"/>
@@ -56236,8 +61699,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-05-09-->
- <!--educational program-->
+ <!-- Dump released: 2021-05-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="uncle clyde's consonant slides - consonant blends and digraphs (4am crack).dsk" size="143360" crc="dec1edfc" sha1="93088790186e6c08bd762196f80d1d5f57837da1"/>
@@ -56252,8 +61715,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-05-09-->
- <!--educational program-->
+ <!-- Dump released: 2021-05-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="uncle clyde's consonant slides - ending consonants (4am crack).dsk" size="143360" crc="67153156" sha1="211cd07bb41d1dc7b98c2e30dfceb5550676f78f"/>
@@ -56268,8 +61731,8 @@ license:CC0-1.0
<info name="programmer" value="Ralph H. Bosson" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-07-->
- <!--strategy game-->
+ <!-- Dump released: 2023-09-07 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Game master" />
<dataarea name="flop" size="143360">
@@ -56302,18 +61765,60 @@ license:CC0-1.0
</part>
</software>
+ <software name="undmapgl">
+ <description>Understanding Maps and Globes (4am crack)</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="understanding maps and globes (4am crack) disk 1.dsk" size="143360" crc="9e1c5658" sha1="58bb8d0f90b644b8c86add54009da40a904b27d4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="understanding maps and globes (4am crack) disk 2.dsk" size="143360" crc="d1f5e742" sha1="86a9e50c4876a54a189e59ee607de22fb1045fe1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="uboatcmd">
+ <description>U-Boat Command (4am crack)</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Charles Fleishman" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-09 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="u-boat command (4am crack).dsk" size="143360" crc="c134e816" sha1="cdf9e04801e96e9d5aa7dbd6a785a0e822ec262b"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="usaamapactr1" cloneof="usaamapact">
<description>U.S. Atlas Action: Map Activities (revison 1) (4am crack)</description>
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbra Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbra Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--Revision 1 and 2 are nearly identical except for deleted or temporary files.-->
+ <!-- Revision 1 and 2 are nearly identical except for deleted or temporary files. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-05-12-->
- <!--educational program-->
+ <!-- Dump released: 2015-05-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="u.s. atlas action (4am crack).dsk" size="143360" crc="2e9b23b8" sha1="fb3ccc3f1e45d594ab43f7bc84275b2ef17b865e" />
@@ -56326,14 +61831,17 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbra Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbra Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Revision 1 and 2 are nearly identical except for deleted or temporary files.-->
- <!--4am lists this dump as "U.S. Atlas Action - Geography Facts", which appears to be incorrect.-->
+ <!-- Revision 1 and 2 are nearly identical except for deleted or temporary files. -->
+ <!-- 4am lists this dump as "U.S. Atlas Action - Geography Facts", which appears to be incorrect. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-10-24-->
- <!--educational program-->
+ <!-- Dump released: 2017-10-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="u.s. atlas action - geography facts (4am crack).dsk" size="143360" crc="cc320ae1" sha1="5eff52cac10d743f3a41f703844926da54e2246a" />
@@ -56345,11 +61853,12 @@ license:CC0-1.0
<description>U.S. Constitution Tutor (4am crack)</description>
<year>1981</year>
<publisher>Micro Lab</publisher>
- <info name="programmer" value="Myrna Helfand and Dr. Scot Kamins" />
+ <info name="programmer" value="Myrna Helfand" />
+ <info name="programmer" value="Dr. Scot Kamins" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-17-->
- <!--educational program-->
+ <!-- Dump released: 2023-09-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -56368,11 +61877,13 @@ license:CC0-1.0
<description>U.S. History: The Growth of a Nation (4am crack)</description>
<year>1984</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value=" Paul Van Wie, Mark D. Rothman, Ph.D., and Philip Weingord" />
+ <info name="programmer" value="Paul Van Wie" />
+ <info name="programmer" value="Mark D. Rothman, Ph.D." />
+ <info name="programmer" value="Philip Weingord" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-22-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -56397,11 +61908,14 @@ license:CC0-1.0
<description>U.S. History: The Young Republic (4am crack)</description>
<year>1983</year>
<publisher>Focus Media</publisher>
- <info name="programmer" value="Paul Van Wie, Mark D. Rothman, Ph.D., Teddy Struhl, and Scot Robinson" />
+ <info name="programmer" value="Paul Van Wie" />
+ <info name="programmer" value="Mark D. Rothman, Ph.D." />
+ <info name="programmer" value="Teddy Struhl" />
+ <info name="programmer" value="Scot Robinson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-22-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -56416,15 +61930,86 @@ license:CC0-1.0
</part>
</software>
+ <software name="usaaf">
+ <description>U.S.A.A.F. (version 1.2) (4am and san inc crack)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Scenario (Boot)"/>
+ <dataarea name="flop" size="143360">
+ <rom name="u.s.a.a.f. v1.2 (4am and san inc crack) disk 1 - scenario (boot).dsk" size="143360" crc="3c071c39" sha1="cedc1f8b60d6671a1d6f5714f3b457deb56b686b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Game"/>
+ <dataarea name="flop" size="143360">
+ <rom name="u.s.a.a.f. v1.2 (4am and san inc crack) disk 2 - game.dsk" size="143360" crc="3a96f561" sha1="eca97c385f63d69915f97f03dc8d1c424faa0045" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="undiatip">
+ <description>Un Día Típico (4am crack)</description>
+ <year>1985</year>
+ <publisher>D.C. Heath and Company</publisher>
+ <info name="developer" value="Sky Logic" />
+ <info name="programmer" value="Arlene Krane" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-21. Redumped: 2024-10-06 to fix data corruption on disk 2. -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="un dia tipico (4am crack) disk 1.dsk" size="143360" crc="52b778b5" sha1="ed1a8e64cfd0eb99bc6af05e3b9c62bbf278758e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="un dia tipico (4am crack) disk 2.dsk" size="143360" crc="9145ec1a" sha1="f810cfaab9d1df4c34f79d9338f35b57b3356d2b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="143360">
+ <rom name="un dia tipico (4am crack) disk 3.dsk" size="143360" crc="126fdfe1" sha1="8f7647a79fd360c9087211a3fedc2c5092f9031b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="valdaygr">
+ <description>Valentine's Day Grump (4am crack)</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="the valentine's day grump (4am crack).dsk" size="143360" crc="7c759075" sha1="29410065b71e6f3264443f7e6b569487afe640f9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="vaultzur">
<description>Vaults of Zurich (4am crack)</description>
<year>1982</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Felix Herlihy, Greg Herlihy, and Roger Harnish" />
+ <info name="programmer" value="Felix Herlihy" />
+ <info name="programmer" value="Greg Herlihy" />
+ <info name="programmer" value="Roger Harnish" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-13-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-13 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="vaults of zurich (4am crack).dsk" size="143360" crc="f6e3db37" sha1="708e7a6b66d1925a69d6a15e11d1ab30a36df9c6" />
@@ -56432,15 +62017,384 @@ license:CC0-1.0
</part>
</software>
+ <software name="vcrcomp09281988">
+ <description>VCR Companion (version 1988-09-28) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Louis Ewens" />
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1988-09-28" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-01-17 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="vcr companion (4am crack) disk 1.dsk" size="143360" crc="48548da6" sha1="46826e1d92ec91bd7a93a4bf65a9fba7720a57dd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="vcr companion (4am crack) disk 2.dsk" size="143360" crc="3114f22d" sha1="35d49b0cf75995ee90299688c75b7accfa14bcf2" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="vcr companion (4am crack) disk 3.dsk" size="143360" crc="7af68343" sha1="8ad3600901e8722e6518063c9d3566470dcb1eda" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="vcr companion (4am crack) disk 4.dsk" size="143360" crc="4c520b95" sha1="5edfa54a7f7ca8028624d6d26f271675dde1b7e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg1081787" cloneof="verbusg1">
+ <description>Verb Usage 1 (version 08.17.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.17.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 1 v08.17.87 (4am crack).dsk" size="143360" crc="b6b28ec5" sha1="7a357a61bae5cd48d5daab02bd8f04df869d8d66" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg1">
+ <description>Verb Usage 1 (version 01.31.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 1 v01.31.89 (4am crack).dsk" size="143360" crc="a097ef98" sha1="fa0ab229d3fe9703a0ccbbc0932e5ec46d38d7a4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg2081787" cloneof="verbusg2">
+ <description>Verb Usage 2 (version 08.17.87) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.17.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 2 v08.17.87 (4am crack).dsk" size="143360" crc="d86d4ba2" sha1="11b5500e67739f44050e80a0b75d364856b20263" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg2">
+ <description>Verb Usage 2 (version 01.31.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 2 v01.31.89 (4am crack).dsk" size="143360" crc="471e875a" sha1="798e29181d421eb7e8b735bbb0697224678e2c8c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg3081787" cloneof="verbusg3">
+ <description>Verb Usage 3 (version 08.17.87) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.17.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 3 v08.17.87 (4am crack).dsk" size="143360" crc="1e2bcc51" sha1="f4ef92c44698473f8ba7e1157cd8d42ff9c00a1d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg3">
+ <description>Verb Usage 3 (version 01.31.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 3 v01.31.89 (4am crack).dsk" size="143360" crc="d4b8667d" sha1="d2ac36fdf5a5b3146df206a5086d40adce656dd6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg4090886" cloneof="verbusg4">
+ <description>Verb Usage 4 (version 09.08.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.08.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 4 v09.08.86 (4am crack).dsk" size="143360" crc="f8903d28" sha1="c543d425a1a8fb04d453d2f786b8220d4367d444" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg4">
+ <description>Verb Usage 4 (version 01.31.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verb usage 4 v01.31.89 (4am crack).dsk" size="143360" crc="47ebdd05" sha1="4bfc911e1be292aa18ce61c2fe4be5659e2af9bc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbsh083186" cloneof="verbsh">
+ <description>Verbs (version 08.31.86) (Hartley Courseware) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="08.31.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-13 -->
+ <!-- educational program -->
+ <!-- Missing disk 1 -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="verbs v08.31.86 (4am crack) disk 1.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="verbs v08.31.86 (4am crack) disk 2.dsk" size="143360" crc="1cadc659" sha1="f8812127ccb518ae406e7df338fadcfb2e591bcf"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbsh052387" cloneof="verbsh">
+ <description>Verbs (version 05.23.87) (Hartley Courseware) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="05.23.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-03-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="verbs (hartley courseware) (4am crack) disk 1.dsk" size="143360" crc="e31bea79" sha1="87f4ee6715e7ee16b7b7a6f5bc989dd47d1010c4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="verbs (hartley courseware) (4am crack) disk 2.dsk" size="143360" crc="2363d4c0" sha1="de733c47c4bbe92b6b252a689dcac06b19f190f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbsh">
+ <description>Verbs (version 09.15.87) (Hartley Courseware) (4am crack)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="09.15.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-13 -->
+ <!-- educational program -->
+ <!-- Missing disk 2 -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="verbs 09.15.87 (4am crack) disk 1.dsk" size="143360" crc="65ac1f15" sha1="f91016d65519d920ba8efc66b6f9d695c320e4b3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="verbs 09.15.87 (4am crack) disk 2.dsk" size="143360" status="nodump" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mverbs1r1" cloneof="mverbs1">
+ <description>Verbs I (Milliken) (revision 1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verbs i (4am crack).dsk" size="143360" crc="17567a89" sha1="e94671bb5deb483a7a96fa6a8de1bce217191446" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mverbs1">
+ <description>Verbs I (Milliken) (revision 2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This revision fixes bugs and has an updated copy protection. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verbs i rev. 2 (4am crack).dsk" size="143360" crc="b0c2705f" sha1="a6b36da980cb96e8421bb1492d0d115bf528e38a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mverbs2r2" cloneof="mverbs2">
+ <description>Verbs II (Milliken) (revision 1) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verbs ii (4am crack).dsk" size="143360" crc="1a62490b" sha1="f3c22dcf7e319f2b5a5f1966a4862fdce1058d38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mverbs2">
+ <description>Verbs II (Milliken) (revision 2) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="M.D. Roblyer, Ph.D." />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This revision fixes bugs and has an updated copy protection. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="verbs ii rev. 2 (4am crack).dsk" size="143360" crc="6a23f644" sha1="ea1bfa8af5aefea3f67265a068aa090fdb146cb8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidttlsh">
+ <description>Video Title Shop (4am crack)</description>
+ <year>1987</year>
+ <publisher>DataSoft</publisher>
+ <info name="programmer" value="John Butrovich" />
+ <info name="programmer" value="Richard Mirsky" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-12-15 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="video title shop (4am crack).dsk" size="143360" crc="cb1c722d" sha1="c1f535df153838d6278b7f291170162067e5223c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidvegas12501" cloneof="vidvegas">
+ <description>Video Vegas (version 12501) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="12501" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="12501" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="video vegas (4am crack).dsk" size="143360" crc="c974bad2" sha1="c2c48f3f9f90d72be489021f5805c1d72c0f834c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidvegas">
+ <description>Video Vegas (version 12511) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="12511" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="12511" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-06-29 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="video vegas v12511 (4am crack).dsk" size="143360" crc="d820d4e7" sha1="73f75859cd31983166f3a4afffb7aed1795fd7f1"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="vcabbldr">
<description>Vocabulary Builder I (4am crack)</description>
<year>1978</year>
<publisher>Program Design</publisher>
- <info name="programmer" value="Jenny Tesar and John Eric Victor" />
+ <info name="programmer" value="Jenny Tesar" />
+ <info name="programmer" value="John Eric Victor" />
<info name="usage" value="Requires an Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-08-17-->
- <!--educational program-->
+ <!-- Dump released: 2015-08-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="vocabulary builder i (4am crack).dsk" size="143360" crc="4e33ed5a" sha1="e5d861c82c79f14051240da569304cdf49e94949" />
@@ -56448,14 +62402,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="vocchlg">
+ <description>Vocabulary Challenge (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Learning Well" />
+ <info name="programmer" value="Carole Kidder" />
+ <info name="programmer" value="Joe Kidder" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="vocabulary challenge (4am crack).dsk" size="143360" crc="9c8804f2" sha1="93287316df323e35535af84a8e91c0b2a5a83a09" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="vocdevel">
<description>Vocabulary Development (4am crack)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-11-->
- <!--educational program-->
+ <!-- Dump released: 2017-02-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="vocabulary development (4am and san inc crack).dsk" size="143360" crc="eb6101b1" sha1="db40827fd6f3826e6837e865161cf0f455fab912" />
@@ -56470,8 +62442,8 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-05-17-->
- <!--educational program-->
+ <!-- Dump released: 2017-05-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="vocabulary skills - context clues (4am crack).dsk" size="143360" crc="80cf06c4" sha1="5bad272f6fb78fa71586d0b9f99bcdb5c6150170" />
@@ -56486,9 +62458,9 @@ license:CC0-1.0
<info name="developer" value="Milton Bradley" />
<info name="usage" value="Requires an Apple ][+ only." />
<sharedfeat name="compatibility" value="A2P" />
- <!--Due to programming bugs unrelated to copy protection, this program fails to run on any Apple //e or later.-->
- <!--Dump released: 2021-05-09-->
- <!--educational program-->
+ <!-- Due to programming bugs unrelated to copy protection, this program fails to run on any Apple //e or later. -->
+ <!-- Dump released: 2021-05-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="vocabulary skills (4am crack).dsk" size="143360" crc="ee2bf37f" sha1="b3ad2f51f97062628092af27cc661f35d46eff6f"/>
@@ -56500,11 +62472,12 @@ license:CC0-1.0
<description>Volcanoes (4am crack)</description>
<year>1981</year>
<publisher>Earthware Computer Services</publisher>
- <info name="programmer" value="G.G. Goles and D.J. Goles" />
+ <info name="programmer" value="G.G. Goles" />
+ <info name="programmer" value="D.J. Goles" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-04-01-->
- <!--educational program-->
+ <!-- Dump released: 2022-04-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56519,15 +62492,36 @@ license:CC0-1.0
</part>
</software>
+ <software name="voodoois">
+ <description>Voodoo Island (4am crack)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="M. J. Sayer"/>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-19. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="voodoo island (4am crack).dsk" size="143360" crc="b3ed4f50" sha1="5a3e4cfb1cd8e820a2f6ae2a4c902fe56ac989a7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="voygmimi">
<description>Voyage of the Mimi (4am crack)</description>
<year>1985</year>
<publisher>Holt, Rinehart and Winston</publisher>
- <info name="programmer" value="Cynthia Char, Bill Tally, Dennis Sullivan, Michael Martin, and Roberta Schwartz" />
+ <info name="programmer" value="Cynthia Char" />
+ <info name="programmer" value="Bill Tally" />
+ <info name="programmer" value="Dennis Sullivan" />
+ <info name="programmer" value="Michael Martin" />
+ <info name="programmer" value="Roberta Schwartz" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-02-22-->
- <!--educational game-->
+ <!-- Dump released: 2015-02-22 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A"/>
<dataarea name="flop" size="143360">
@@ -56548,6 +62542,48 @@ license:CC0-1.0
</part>
</software>
+ <software name="wagnwest">
+ <description>Wagons West (4am crack)</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-30 -->
+ <!-- adventure game -->
+ <!-- Originally part of Microzine issue 12, this is the standalone re-release. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wagons west (4am crack).dsk" size="143360" crc="3449803a" sha1="dac9b5f9c2a6df2143a99d3cf141b506d262800a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wlywrdwk">
+ <description>Wally's Word Works: The Parts of Speech Game (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John D. Perron" />
+ <info name="programmer" value="Martha Nicols" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wally's word works (4am crack) disk 1 - teacher disk.dsk" size="143360" crc="eebd4e30" sha1="fabadee8ec857c2651fee5e20eebdb25f6cfca80" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Student"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wally's word works (4am crack) disk 2 - student disk.dsk" size="143360" crc="b3b9115f" sha1="56de7705ae6447cf8cc976fbf70c9286e771aac8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wdcardps">
<description>Walt Disney Card &amp; Party Shop (4am crack)</description>
<year>1986</year>
@@ -56555,8 +62591,8 @@ license:CC0-1.0
<info name="developer" value="Looking Glass Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-14-->
- <!--graphics program-->
+ <!-- Dump released: 2023-03-14 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -56582,17 +62618,28 @@ license:CC0-1.0
<year>1986</year>
<publisher>Bantam Software</publisher>
<info name="developer" value="Looking Glass Software" />
- <info name="programmer" value="Mary Schenck Balcer, Randi Benton, Nancy Casolaro, Melissa Haldeman, Carol Snider, Jessie Ragsdale, Victor Raines, Collette Michaud, Waterman Design, and Floyd Norman" />
+ <info name="programmer" value="Mary Schenck Balcer" />
+ <info name="programmer" value="Randi Benton" />
+ <info name="programmer" value="Nancy Casolaro" />
+ <info name="programmer" value="Melissa Haldeman" />
+ <info name="programmer" value="Carol Snider" />
+ <info name="programmer" value="Jessie Ragsdale" />
+ <info name="programmer" value="Victor Raines" />
+ <info name="programmer" value="Collette Michaud" />
+ <info name="programmer" value="Waterman Design" />
+ <info name="programmer" value="Floyd Norman" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-12-28-->
- <!--graphics program-->
+ <!-- Dump released: 2017-12-28 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="comic strip maker (4am crack) side a.dsk" size="143360" crc="638ddd76" sha1="030b4728819246e3d73266735ef86de6fbe16ed3" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="comic strip maker (4am crack) side b.dsk" size="143360" crc="3803198b" sha1="71f3eec9352f5b84eca595f9e79eda0d3727d89b" />
</dataarea>
@@ -56606,8 +62653,8 @@ license:CC0-1.0
<info name="developer" value="Adventure International" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-28-->
- <!--strategy game-->
+ <!-- Dump released: 2024-04-28 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="war (adventure international) (4am crack).dsk" size="143360" crc="894f5d71" sha1="079af8ba8ab7abd8163c5eadd3903fb18b03137a" />
@@ -56615,6 +62662,45 @@ license:CC0-1.0
</part>
</software>
+ <software name="wsthpac">
+ <description>War in the South Pacific (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-18 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="war in the south pacific (4am crack) side a.dsk" size="143360" crc="28d20b8b" sha1="e954f5092b6567924e63e9a4dc3a3065ad40a672" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="war in the south pacific (4am crack) side b.dsk" size="143360" crc="e12ccbef" sha1="2818a948537af7a00c42ad8745965a06d1c7bb47" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wargle">
+ <description>Wargle! (4am crack)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Eastgate Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wargle (4am crack).dsk" size="143360" crc="7ddb00ca" sha1="183a142b5710998c90e797e00988fc7691c21ddc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dunzhin">
<description>Warrior of RAS Volume One: Dunzhin (4am crack)</description>
<year>1982</year>
@@ -56622,8 +62708,8 @@ license:CC0-1.0
<info name="programmer" value="Randall Don Masteller" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-06-13-->
- <!--adventure game-->
+ <!-- Dump released: 2014-06-13 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="dunzhin (4am crack).dsk" size="143360" crc="115d3dfe" sha1="1be7cc13038c90d2aa1c07c99b9aca9a4ef975e5" />
@@ -56638,8 +62724,8 @@ license:CC0-1.0
<info name="programmer" value="Randall Don Masteller" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-07-->
- <!--adventure game-->
+ <!-- Dump released: 2021-04-07 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="warriors of ras volume iv- ziggurat (4am crack).dsk" size="143360" crc="ee6d693b" sha1="b6a78df0aeb38ed8a4fd3c73628d95c2e967200c"/>
@@ -56647,16 +62733,50 @@ license:CC0-1.0
</part>
</software>
+ <software name="warship10" cloneof="warship">
+ <description>Warship (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-26 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="warship v1.0 (4am crack).dsk" size="143360" crc="0c47a247" sha1="633a0ac41505caad53e77d73a1e59c932cfbb843" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="warship">
+ <description>Warship (version 1.1) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-29 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="warship v1.1 (4am crack).dsk" size="143360" crc="7f3ba69e" sha1="1b93dcba16162e4d7e7efa619aa4c76fd1e12325" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="waterair">
<description>Water in the Air (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank R. Salamon" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2014-08-20-->
- <!--educational program-->
+ <!-- Dump released: 2014-08-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="water in the air (4am crack).dsk" size="143360" crc="346bfd1e" sha1="a5962b2da92ad97f0b602efd4398a80a42d18afa" />
@@ -56668,13 +62788,13 @@ license:CC0-1.0
<description>Water in the Air Quiz (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Frank R. Salamon" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Accessed through a menu option in Water in teh Air.-->
- <!--Dump released: 2015-03-16-->
- <!--educational program-->
+ <!-- Accessed through a menu option in Water in teh Air. -->
+ <!-- Dump released: 2015-03-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="Water in the Air Quiz (4am crack).dsk" size="143360" crc="3dbe9f6c" sha1="995e2c9bcfff96dc42489ba389166135a052905e" />
@@ -56686,12 +62806,12 @@ license:CC0-1.0
<description>Water Pollution (4am crack)</description>
<year>1985</year>
<publisher>Educational Materials and Equipment</publisher>
- <!--E.M.E Corporation-->
+ <!-- E.M.E Corporation -->
<info name="programmer" value="Michael Harmon" />
<info name="usage" value="Requires an 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="water pollution (4am crack).dsk" size="143360" crc="799f714e" sha1="97f940b66e79d1a8a4119391bfb993f67bfb900d" />
@@ -56706,8 +62826,8 @@ license:CC0-1.0
<info name="programmer" value="Willard Phillips" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-29-->
- <!--adventure game-->
+ <!-- Dump released: 2022-12-29 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -56728,15 +62848,48 @@ license:CC0-1.0
</part>
</software>
+ <software name="whldolph">
+ <description>Whales and Dolphins (4am crack)</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="whales and dolphins (4am crack).dsk" size="143360" crc="15d86bf5" sha1="6add4c8c38ef6bc994edf3c22feac026d77d21be" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wfstwnxt">
+ <description>What's First? What's Next? (version 03.07.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="03.07.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="what's first what's next v03.07.86 (4am crack).dsk" size="143360" crc="bb05d99b" sha1="0cf0a5cc04547c969d0fdc6080d1889d7257f2e4" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wtpacerept">
<description>What's the Problem: Ace Reporter (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="what's the problem- ace reporter (4am crack).dsk" size="143360" crc="cac5d00b" sha1="d0fafc902b8918ff6e99f688212ae59fa245a7ee" />
@@ -56747,12 +62900,12 @@ license:CC0-1.0
<software name="wtpchesche">
<description>What's the Problem: Chester and the Cheese (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="what's the problem- chester and the cheese (4am crack).dsk" size="143360" crc="cf9b27bb" sha1="308f9b10836f34614a1f52a367ce93d0b6ef07b3" />
@@ -56763,12 +62916,12 @@ license:CC0-1.0
<software name="wtpwhworld">
<description>What's the Problem: Where in the World? (4am crack)</description>
<year>1987</year>
- <publisher>Holt, Rinehart, and Winston</publisher>
+ <publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Cognetics" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-12-13-->
- <!--educational program-->
+ <!-- Dump released: 2022-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="what's the problem- where in the world (4am crack).dsk" size="143360" crc="863f4453" sha1="c0edf9d006b4cc49236993b78789c4472172b58c" />
@@ -56780,11 +62933,13 @@ license:CC0-1.0
<description>Where in Europe is Carmen Sandiego? (4am crack)</description>
<year>1988</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, Lauren Elliott, Leila Bronstein, Don Albrecht, Katherine Bird, Susan Meyers, and Louis Ewens" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2016-08-01. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2016-08-01. Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56803,15 +62958,17 @@ license:CC0-1.0
<description>Where in North Dakota is Carmen Sandiego? (version 1.0) (4am crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Ken Bull, Katherine Bird, Janese Freed, Leila Bronstein, Rick Incrocci, Michelle McBride, Roseann Mitchell, Arturo Sinclair, Diane Wilcox, and Louis Ewens" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-09. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-09. Redumped 2021-08-27 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56830,12 +62987,14 @@ license:CC0-1.0
<description>Where in Time is Carmen Sandiego? (version 1.0) (4am and trex crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Rod Nelsen, Leila Bronstein, Jenny Martin, Gail Rathbun, Mark Schlichtinng, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Rod Nelsen" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Redumped: 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56866,12 +63025,14 @@ license:CC0-1.0
<description>Where in Time is Carmen Sandiego? (version 1.1) (trex crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Rod Nelsen, Leila Bronstein, Jenny Martin, Gail Rathbun, Mark Schlichtinng, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Rod Nelsen" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: ?-->
- <!--educational game-->
+ <!-- Dump released: ? -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56902,12 +63063,14 @@ license:CC0-1.0
<description>Where in Time is Carmen Sandiego? (version 1.1) (800K 3.5") (trex crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Rod Nelsen, Leila Bronstein, Jenny Martin, Gail Rathbun, Mark Schlichtinng, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Rod Nelsen" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: ?-->
- <!--educational game-->
+ <!-- Dump released: ? -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="where in time is carmen sandiego v1.1 800k 3.5 disk (1989)(broderbund)(trex crack).2mg" size="819264" crc="36d3ff6d" sha1="21051ecf94f598da648355e75e46641351ed3230" />
@@ -56919,13 +63082,15 @@ license:CC0-1.0
<description>Where in the USA is Carmen Sandiego? (version 2.0, 26-APR-1989) (4am crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.0, 26-APR-1989" />
- <!--ProDOS Re-release on 3 sides.-->
+ <!-- ProDOS Re-release on 3 sides. -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-09-05. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2018-09-05. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56950,13 +63115,16 @@ license:CC0-1.0
<description>Where in the World is Carmen Sandiego? (version 2.0, 15-AUG-1989) (4am crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Dane Bigham, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Dane Bigham" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.0, 15-AUG-1989" />
- <!--ProDOS re-release-->
+ <!-- ProDOS re-release -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-09-05. Redump: 2021-08-28. Due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines.-->
- <!--educational game-->
+ <!-- Dump released: 2018-09-05. Redump: 2021-08-28. Due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -56971,14 +63139,85 @@ license:CC0-1.0
</part>
</software>
+
+ <software name="wwwwwh110483" cloneof="wwwwwh">
+ <description>Who-What-Where-When-Why (version 11.04.83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="alt_title" value="Who, What, When"/>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="11.04.83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="who-what-where-when-why v11.04.83 (4am crack).dsk" size="143360" crc="466fb5a4" sha1="d57fcbf70be14cf52c27a69b6fafa667acec534b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wwwwwh052284" cloneof="wwwwwh">
+ <description>Who-What-Where-When-Why (version 05.22.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="alt_title" value="Who? What? When? Where?"/>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="05.22.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="who what when where (4am crack).dsk" size="143360" crc="88b28db0" sha1="09b609445dd1ed8a1f9179295c5356a55c54aa94" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wwwwwh020586" cloneof="wwwwwh">
+ <description>Who-What-Where-When-Why (version 02.05.86) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="02.05.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-10-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="who what where when why v02.05.86 (4am crack).dsk" size="143360" crc="fd74790d" sha1="2dd4aded3e6793ffb23e1f4406cf4c09cd846999" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wwwwwh">
+ <description>Who-What-Where-When-Why (version 01.27.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.27.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="who what when where why 1989 (4am crack).dsk" size="143360" crc="b723ffc3" sha1="d56aa94919c7d6b665dac7488fc6f2231dc684c4" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hmwnmult">
<description>Whole Numbers: Multiplication (4am crack)</description>
<year>1987</year>
<publisher>Houghton Mifflin</publisher>
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-10-03-->
- <!--educational program-->
+ <!-- Dump released: 2019-10-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="whole numbers- multiplication (4am crack).dsk" size="143360" crc="edc88a92" sha1="4c24102023914a9ac9a9ddd1ffd00139cacb29e6" />
@@ -56993,8 +63232,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="143360">
@@ -57022,8 +63261,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="143360">
@@ -57051,8 +63290,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2017-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A"/>
<dataarea name="flop" size="143360">
@@ -57073,15 +63312,61 @@ license:CC0-1.0
</part>
</software>
+ <software name="wndwlkr">
+ <description>Windwalker (4am crack)</description>
+ <year>1989</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Greg Malone" />
+ <info name="programmer" value="Jeff Dee" />
+ <info name="programmer" value="Glen Johnson" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Jeff Hillhouse" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-14 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="windwalker (4am crack) disk 1.dsk" size="143360" crc="e3f73a2e" sha1="031efebe4ab1c44fdf6d7a184405191f71ed92e3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="windwalker (4am crack) disk 2.dsk" size="143360" crc="4b978d81" sha1="746b19e66396240fb8331317598a231d44c7c817" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="143360">
+ <rom name="windwalker (4am crack) disk 3.dsk" size="143360" crc="04fa5a6b" sha1="c1f8e258529d02000a8f6aaa9634520ed0e03985" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
+ <dataarea name="flop" size="143360">
+ <rom name="windwalker (4am crack) disk 4.dsk" size="143360" crc="52b4b787" sha1="03a56734ece920ca68a272cbecd186131e49e597" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wingsshad">
<description>Wings Out of Shadow (4am crack)</description>
<year>1983</year>
<publisher>Berserker Works</publisher>
- <info name="programmer" value="Scott V. Walker, Joan Saberhagen, Dennis L. Martinez, Mary Martinez, Michael L. Carpenter, Eddie Goldberger, and Bryan Bingham" />
+ <info name="programmer" value="Scott V. Walker" />
+ <info name="programmer" value="Joan Saberhagen" />
+ <info name="programmer" value="Dennis L. Martinez" />
+ <info name="programmer" value="Mary Martinez" />
+ <info name="programmer" value="Michael L. Carpenter" />
+ <info name="programmer" value="Eddie Goldberger" />
+ <info name="programmer" value="Bryan Bingham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-27-->
- <!--strategy game-->
+ <!-- Dump released: 2023-07-27 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="wings out of shadow (4am crack).dsk" size="143360" crc="487c43b4" sha1="ead33242e595a586667b354e968d1d0553a0c008" />
@@ -57089,16 +63374,88 @@ license:CC0-1.0
</part>
</software>
+ <software name="wpoohhaw84" cloneof="wpoohhaw">
+ <description>Winnie the Pooh in the Hundred Acre Wood (Sierra On-Line) (version 1984) (4am and san inc crack)</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-07-18. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="winnie the pooh in the hundred acre wood (sierra variant) (4am and san inc crack) side a.dsk" size="143360" crc="066ad38b" sha1="6cda8ada8f18dd7d9eb79b88ffd59e7b67e9956a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="winnie the pooh in the hundred acre wood (sierra variant) (4am and san inc crack) side b.dsk" size="143360" crc="a1b8f04d" sha1="e90eb60f174d48e3f1ec110cb5de51f33ac82d54" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wpoohhaw">
+ <description>Winnie the Pooh in the Hundred Acre Wood (version 1985-02-10) (Sunburst Communications) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="original_publisher" value="Sierra On-Line" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985-02-10" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Sunburst Communications is listed on the disk lable. -->
+ <!-- Dump released: 2014-08-21 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="winnie the pooh in the hundred acre wood (sunburst release) (4am crack) side a.dsk" size="143360" crc="e9f77653" sha1="a2ddd716ed3c6789b0129d3e7e40a190d4cf71f3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="winnie the pooh in the hundred acre wood (sunburst release) (4am crack) side b.dsk" size="143360" crc="214b7bf8" sha1="81bc12dc86ef22bbdaa5009af87f33f7931f60ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wntgames">
+ <description>Winter Games (4am crack)</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Action Graphics" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-26. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="winter games (4am crack) side a.dsk" size="143360" crc="ad1360c5" sha1="d7c3b67d3ed5336f68a232eaa84a2766eabc4c1e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="winter games (4am crack) side b.dsk" size="143360" crc="b8d713fd" sha1="e2c6b9b0dfdf2f23c59c03ec803b0ffb79135482" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wizwords10" cloneof="wizwords">
<description>Wizard of Words (version 1.0) (4am crack)</description>
<year>1983</year>
<publisher>Computer-Advanced Ideas</publisher>
- <info name="programmer" value="Anita Neely and Tim Aaronson" />
+ <info name="programmer" value="Anita Neely" />
+ <info name="programmer" value="Tim Aaronson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-08-->
- <!--educational program-->
+ <!-- Dump released: 2023-10-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Boot" />
<dataarea name="flop" size="143360">
@@ -57117,13 +63474,14 @@ license:CC0-1.0
<description>Wizard of Words (version 1.1) (4am crack)</description>
<year>1983</year>
<publisher>Advanced Ideas</publisher>
- <!--Changed name from Computer-Advanced Ideas to just Advanced Ideas-->
- <info name="programmer" value="Anita Neely and Tim Aaronson" />
+ <!-- Changed name from Computer-Advanced Ideas to just Advanced Ideas -->
+ <info name="programmer" value="Anita Neely" />
+ <info name="programmer" value="Tim Aaronson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-04-18-->
- <!--educational program-->
+ <!-- Dump released: 2017-04-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -57138,6 +63496,753 @@ license:CC0-1.0
</part>
</software>
+ <software name="wizcrown">
+ <description>Wizard's Crown (version 1.2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="programmer" value="Keith Brors" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-10 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Game disk front"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wizard's crown v1.2 (4am crack) disk 1a - game disk front.dsk" size="143360" crc="3198d3fe" sha1="348fdaeb55c447c40e2e9bfefc364ac37210cd59"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Game disk back"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wizard's crown v1.2 (4am crack) disk 1b - game disk back.dsk" size="143360" crc="cb8fee67" sha1="4be497844d0a8a4fcfb70d9629ceddab8c45ea3a"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Data disk 1"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wizard's crown v1.2 (4am crack) disk 2a - data disk 1.dsk" size="143360" crc="fcc7fdac" sha1="7afa03981c62de9b0deaedd2a6788baae12a54f6"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Data disk 2"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wizard's crown v1.2 (4am crack) disk 2b - data disk 2.dsk" size="143360" crc="8b82a2f5" sha1="6186061a89bbcace9fe4c5a7d55c4740ea15a550"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wiziprint">
+ <description>Wiziprint (version 2.01 20-AUG-83) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="2.01 20-AUG-83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-02 -->
+ <!-- game utility program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wiziprint (4am crack).dsk" size="143360" crc="354fab0c" sha1="00ab6c5edc0fd0985ecbf425bb2a5c850d0c7b87"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wonderp_525">
+ <description>Wonderland Puzzles (A-310 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-310" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a310 wonderland puzzles v1.0 (4am crack).dsk" size="143360" crc="588b05ee" sha1="42b629ac843a82a79afe7faa5d8aa33bee076468"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="woolgard_525">
+ <description>Woolly's Garden (A-309 version 1.0) (4am crack)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-309" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Eileen Nannen" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Dave Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a309 woolly's garden v1.0 (4am crack).dsk" size="143360" crc="fdd3ecb4" sha1="213e4ef02f820a795620286bc63da0b77293a24b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattk1983" cloneof="wordattk">
+ <description>Word Attack! (version 1983) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-04-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack 1983 (4am crack) disk 1 - program.dsk" size="143360" crc="9184fed7" sha1="b0099e8188d2fc5d820a93406ecb17b47d1dd7bf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack 1983 (4am crack) disk 2 - data.dsk" size="143360" crc="cb7b46b8" sha1="081544b65438a456bc7d9d19ad1700f89b877a0d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattku" cloneof="wordattk">
+ <description>Word Attack! (4am crack)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-09-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack (4am crack) side a.dsk" size="143360" crc="b5509fb9" sha1="7f88f3a3c3bee8a7d95b7c3f57e9566d1332ab28" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack (4am crack) side b.dsk" size="143360" crc="eedddf91" sha1="e5061feeae091b99b4941872cdb650d204071f0b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattk061285" cloneof="wordattk">
+ <description>Word Attack! (version 06.12.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="06.12.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack 061285 (4am crack) side a.dsk" size="143360" crc="c869e411" sha1="fb17b52b049f6184ce2a7c4c8f75d735a6979b9d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack 061285 (4am crack) side b.dsk" size="143360" crc="6d13680b" sha1="4915c3042288456ca271a2a0a6b27361a8ee58d5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattk">
+ <description>Word Attack! (version 06.01.87) (800K 3.5") (4am crack)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="06.01.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="word attack 800k (4am crack).2mg" size="819264" crc="25415acb" sha1="ca96f43b1d9a7134318c2baa43179a529f626a32" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkp10" cloneof="wordattkp">
+ <description>Word Attack Plus! (version 1.0) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus (4am crack) side a.dsk" size="143360" crc="30d62fc0" sha1="c2a0cf462c4f43f6fc120ffb21fd93d69e3b9306" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus (4am crack) side b.dsk" size="143360" crc="00defbe5" sha1="fb7ba9df015d6616411cc5abb77cf2caca288568" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkp">
+ <description>Word Attack Plus! (version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus v1.2 (4am crack) side a.dsk" size="143360" crc="f21d6a16" sha1="0c13e0223892058869421afebcfac70202da21ac" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus v1.2 (4am crack) side b.dsk" size="143360" crc="00defbe5" sha1="fb7ba9df015d6616411cc5abb77cf2caca288568" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkpf12" cloneof="wordattkpf">
+ <description>Word Attack Plus! French (version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus french (4am crack) side a.dsk" size="143360" crc="531a35d0" sha1="1904b000c03c24d25071bd79f90b59ea82625947" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus french (4am crack) side b.dsk" size="143360" crc="3269f352" sha1="d158aebe2d266dff4417a8b285746b9503e759a3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkpf">
+ <description>Word Attack Plus! French (800K 3.5") (version 1.3) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="word attack plus french 800k 1.3 (4am crack).2mg" size="819264" crc="f38ac823" sha1="d57b095d98447be91abd1533cacb1d38946efed3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkps12_525" cloneof="wordattkps">
+ <description>Word Attack Plus! Spanish (version 1.2) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus spanish (4am crack) side a.dsk" size="143360" crc="59bbd67c" sha1="fd29dc69f232a94c28fe69e43b78b9233f2a0af8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack plus spanish (4am crack) side b.dsk" size="143360" crc="f7e9e685" sha1="d7e5af821aeab8135017476398c25bbb9ef8f5db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkps">
+ <description>Word Attack Plus! Spanish (version 1.2) (800K 3.5") (4am crack)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-10-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="word attack plus spanish 800k (4am crack).2mg" size="819264" crc="4f92acb4" sha1="12421999bb00b54c8ae825dd9ee43e55de0c9a4e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordmun11" cloneof="wordmun_525">
+ <description>Word Munchers (A-153 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-153" />
+ <info name="programmer" value="Philip Bouchard" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-02-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a153 word munchers v1.1 (4am crack).dsk" size="143360" crc="4619237f" sha1="18b5f4bb6147f4aa02c6c4b947de4efb1e438de3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordmun13" cloneof="wordmun_525">
+ <description>Word Munchers (A-153 version 1.3) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-153" />
+ <info name="programmer" value="Philip Bouchard" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a153 word munchers v1.3 (4am crack).dsk" size="143360" crc="5d5b7bf6" sha1="083f9e22be9fd3db405ccc85218d9f84dd39f536" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordmun_525">
+ <description>Word Munchers (A-153 version 1.4) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-153" />
+ <info name="programmer" value="Philip Bouchard" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a153 word munchers v1.4 (4am crack).dsk" size="143360" crc="7425e4be" sha1="5bc2266a4dc0e18fe74781b6b9061958834f995a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmaddsub">
+ <description>WordMath: Addition and Subtraction (4am crack)</description>
+ <year>1986</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- This appears to be the same as WordMath: Primary Math, but missing the third disk with Drills 5, 6 -->
+ <!-- Dump released: 2017-05-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Lessons 1, 2 (Add, Sub)"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - addition and subtraction (4am crack) disk 1.dsk" size="143360" crc="f3a10039" sha1="e8cd0cbbda84cd17df5bb40f5c06dfdf10f8b413" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Lessons 3, 4 (Add, Sub)"/>
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - addition and subtraction (4am crack) disk 2.dsk" size="143360" crc="beee6a7d" sha1="ab76d08f9ddf4b7f47943cbfe8402e40e40463c0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmadvmixp">
+ <description>WordMath: Advanced Mixed Practice (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - advanced mixed practice (4am crack).dsk" size="143360" crc="24b4561f" sha1="9b210e3b0224d751b0f2f504718d2e8bca5a1ce4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmbasprob">
+ <description>WordMath: Basic Problems (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - basic problems (4am crack).dsk" size="143360" crc="e154f2f4" sha1="ac97d01ba03a1e4e7eb559e07cb85478b451c95c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmdiction">
+ <description>WordMath: Dictionary (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - dictionary (4am crack).dsk" size="143360" crc="684c6ea9" sha1="fe6f30e2359ddc63214a1576eafe41b2327a302c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmextnum">
+ <description>WordMath: Extra Numbers (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - extra numbers (4am crack).dsk" size="143360" crc="feb0151a" sha1="e0b05bc4af79411178bd9dbd4a2d712f99199c52" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmfordrord">
+ <description>WordMath: Forward Order-Reverse Order (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - forward order, reverse order (4am crack).dsk" size="143360" crc="3afd9e0f" sha1="cdd6ffe186d4b27a27538f50c7a4022998eafe67" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmhidnum">
+ <description>WordMath: Hidden Numbers (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - hidden numbers (4am crack).dsk" size="143360" crc="e6810b3c" sha1="5e1202fb522930ed23f345bb46d475c0199a911c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmkeywords">
+ <description>WordMath: Key Words (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - key words (4am crack).dsk" size="143360" crc="ce3292bd" sha1="862f48adb9e668857dd22a0ed250ee744e807b4d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmathmp">
+ <description>WordMath: Mixed Practice (4am crack)</description>
+ <year>1985</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="programmer" value="T. Froman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-05-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordmath - mixed practice (4am crack).dsk" size="143360" crc="eeaa349b" sha1="66ecdb703a53d8e4fdd3d9b60861243556a4b282" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmprimath">
+ <description>WordMath: Primary Math (4am crack)</description>
+ <year>1986</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="alt_title" value="Primary WordMath"/>
+ <info name="programmer" value="J. Coffland" />
+ <info name="programmer" value="S. Baldwin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- This appears to be WordMath: Addition and Subtraction, but with a the third disk with Lessons 5, 6 on multiplication / division. -->
+ <!-- Dump released: 2023-03-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Lessons 1, 2 (Add / Sub)" />
+ <dataarea name="flop" size="143360">
+ <rom name="primary wordmath (4am crack) disk 1.dsk" size="143360" crc="2aba34b2" sha1="7fdf60692e4d76b542f0111f2520016a7ed12951" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Lessons 3, 4 (Add / Sub)" />
+ <dataarea name="flop" size="143360">
+ <rom name="primary wordmath (4am crack) disk 2.dsk" size="143360" crc="9de1cf0e" sha1="fc60419a948da439d7c9b8a6516dfab38b9b8958" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Lessons 5, 6 (Mult / Div)" />
+ <dataarea name="flop" size="143360">
+ <rom name="primary wordmath (4am crack) disk 3.dsk" size="143360" crc="065e4c68" sha1="da675aded7b07140cebc53c885edf0d5503a6e32" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkg">
+ <description>Wortgefecht (4am crack)</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="alt_title" value="Word Attack! German"/>
+ <info name="programmer" value="Seth Meyers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later. The second disk must be writeable." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack german (4am crack) disk 1.dsk" size="143360" crc="87d844a3" sha1="9e465f4a629fb32c8c6942f88c1930f60c150ae3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word attack german (4am crack) disk 2.dsk" size="143360" crc="66f32eb6" sha1="55abe5420f21f3e525e51c669661ed416af35c21" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrddetec">
+ <description>Word Detective (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Kathleen Magnuson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word detective (4am crack) disk 1 - boot.dsk" size="143360" crc="7a14e8b5" sha1="63261019b1e07a17e399411e89d7ac81c9484307" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Dictionary"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word detective (4am crack) disk 2 - dictionary.dsk" size="143360" crc="a5ffb0a1" sha1="315c87b63755af510bef02c40b5e7a116711925a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordfam">
+ <description>Word Families (version 11.04.83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="11.04.83" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word families v11.04.83 (4am crack).dsk" size="143360" crc="3bb55b31" sha1="36af60c1bbafccc4caa031a00da0664bca946dd4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="whlookalk">
+ <description>Word Herd: Look-Alikes (A-120 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-120" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a120 word herd- look-alikes v1.0 (4am crack).dsk" size="143360" crc="043afc42" sha1="d7164db876e6917b680fb235692241194162616c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="whsndalk">
+ <description>Word Herd: Sound-Alikes (A-106 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-106" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a106 word herd- sound-alikes v1.0 (4am crack).dsk" size="143360" crc="5ef8fd83" sha1="fe4d68431bafb5e2c94086de575e0775d0c630cb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordladd">
+ <description>Word Ladders (version 12.29.88) (4am crack)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jim Parshall" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="12.29.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word ladders (4am crack).dsk" size="143360" crc="6ff46ee7" sha1="85d21a3979a2339294772b835fb4aceb42e688e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordplay">
+ <description>Word Play (version 01.27.85) (4am crack)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jim Halvorson" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="01.27.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-12-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word play 01.27.85 (4am crack).dsk" size="143360" crc="3b1ab4ce" sha1="a5227ff0e5729e087510bd6dc78057c5d83657bd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wordplc">
<description>Word Problems Level C (version 3.1.6) (4am crack)</description>
<year>1989</year>
@@ -57146,8 +64251,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="3.1.6" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-11-17-->
- <!--educational program-->
+ <!-- Dump released: 2022-11-17 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
@@ -57162,6 +64267,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="wqstbss">
+ <description>Word Quest: Binary Search Strategies (4am crack)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-01-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word quest (4am crack).dsk" size="143360" crc="760ee31c" sha1="7dd42b1122c2d8551664f45af1edd330980b9b4a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wrdscsptut">
<description>Word Scrambler and Spelling Tutor (4am crack)</description>
<year>1984</year>
@@ -57169,8 +64290,8 @@ license:CC0-1.0
<info name="programmer" value="Brad Evans" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-02-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-02-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="word scrambler and spelling tutor (4am crack).dsk" size="143360" crc="7a0a0eb1" sha1="193ebf4481806889a168f98f78e1e951c3ca6c51" />
@@ -57178,6 +64299,135 @@ license:CC0-1.0
</part>
</software>
+ <software name="wrdsrch">
+ <description>Word Search (version 09.20.84) (4am crack)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="09.20.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word search (4am crack).dsk" size="143360" crc="ad54fcc8" sha1="ddce53be386d1420f46904f2119769c5825d77e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wschswfd">
+ <description>Word Search and Super Wordfind (version 02.28.89) (4am crack)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Thomas Wachtel" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="02.28.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word search and super wordfind (4am crack) disk 1 - program.dsk" size="143360" crc="267b5925" sha1="8936b487a1560b0ed7be508ba2112a341601079a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data"/>
+ <dataarea name="flop" size="143360">
+ <rom name="word search and super wordfind (4am crack) disk 2 - data.dsk" size="143360" crc="64cd309f" sha1="35a3338314e5018ded79b5c80aa64e1479d3865b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrdspinr">
+ <description>Word Spinner (4am crack)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Dale Disharoon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wordspinner (4am crack).dsk" size="143360" crc="5eddb086" sha1="96345c0e990ec526d1c56a1a20431a0f9d0a49d2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wdwizard10" cloneof="wdwizard">
+ <description>Word Wizards (A-112 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-112" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a112 word wizards v.1.0 (4am crack).dsk" size="143360" crc="02e3f328" sha1="4d1904f2711439e76b838fbc4657743742936258"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wdwizard12" cloneof="wdwizard">
+ <description>Word Wizards (A-112 version 1.2) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-112" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a112 word wizards v1.2 (4am crack).dsk" size="143360" crc="f3ad8aa1" sha1="0e6ac325614ed5f8b42eeac49c68b9ee985cd5c6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wdwizard">
+ <description>Word Wizards (A-112 version 1.3) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-112" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a112 word wizards v1.3 (4am crack).dsk" size="143360" crc="43f0413f" sha1="5357ba86600e5c8058534fcfb3ce26c8dc9975ed"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrdsconc">
+ <description>Words &amp; Concepts (4am crack)</description>
+ <year>1987</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-09-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="words and concepts (4am crack).dsk" size="143360" crc="dc51fd5f" sha1="4af70827d432c9de67ac7a0538f734add6f9b1e6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wordwise">
<description>Wordwise (4am crack)</description>
<year>1985</year>
@@ -57185,8 +64435,8 @@ license:CC0-1.0
<info name="developer" value="Program Design" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-14-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="wordwise (4am crack).dsk" size="143360" crc="f2170bd9" sha1="b0ba42085688e7be09d805b9df5738d6c1eefa0b" />
@@ -57198,11 +64448,13 @@ license:CC0-1.0
<description>WordWorx (4am crack)</description>
<year>1983</year>
<publisher>Reston Publishing</publisher>
- <info name="programmer" value="Gordon Riggs, Jonathan Marshall, and Susie Christie Thomas" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="programmer" value="Jonathan Marshall" />
+ <info name="programmer" value="Susie Christie Thomas" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-01-14-->
- <!--educational game-->
+ <!-- Dump released: 2023-01-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
@@ -57224,8 +64476,8 @@ license:CC0-1.0
<info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-11-22-->
- <!--educational game-->
+ <!-- Dump released: 2017-11-22 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="wordzzzearch (4am crack).dsk" size="143360" crc="dcf6368b" sha1="1993650a19e5999b7f35d8fd7cccb07d9c8709a3" />
@@ -57233,16 +64485,82 @@ license:CC0-1.0
</part>
</software>
+ <software name="wordamat">
+ <description>Word-a-Mation: Exploring Word Relationships (4am crack)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Glenn M. Kleiman" />
+ <info name="programmer" value="Jillian Dorman" />
+ <info name="programmer" value="J.B. Shelton" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word-a-mation (4am crack).dsk" size="143360" crc="6835466e" sha1="60b29407a91cabbb5ea9403c80b7e1eb7ef5d033" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrdplayr">
+ <description>Word-Player (4am crack)</description>
+ <year>1985</year>
+ <publisher>World Book</publisher>
+ <info name="developer" value="Synergistic Software"/>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="word-player (4am crack).dsk" size="143360" crc="4aa95a21" sha1="3f99eb15c8adc83895f9ec1e8c38d2624907e6b5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrktgthr">
+ <description>Working Together (4am crack)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-01-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Communication on the job"/>
+ <dataarea name="flop" size="143360">
+ <rom name="working together (4am crack) disk 1 - communication on the job.dsk" size="143360" crc="e413acef" sha1="42658f71614c118032bc9db99dfa1c0e07a0130b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Job attitude"/>
+ <dataarea name="flop" size="143360">
+ <rom name="working together (4am crack) disk 2 - job attitude.dsk" size="143360" crc="9f3498ca" sha1="abf76b19a2360c14e5292b10762b1bf51bf04c80" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Working with others (review)"/>
+ <dataarea name="flop" size="143360">
+ <rom name="working together (4am crack) disk 3 - working with others (review).dsk" size="143360" crc="7d292cdb" sha1="0cc377d3d1e7c05299de10cdadd7209fd87ee158" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="waageof">
<description>World Atlas Action: Geography Facts (4am crack)</description>
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbra Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbra Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-02-09-->
- <!--educational program-->
+ <!-- Dump released: 2020-02-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="world atlas action - geography facts (4am crack).dsk" size="143360" crc="11dfdc5c" sha1="061e654a08f0503a52402dc6207936884903ae52" />
@@ -57255,11 +64573,14 @@ license:CC0-1.0
<year>1985</year>
<publisher>Developmental Learning Materials (DLM)</publisher>
<info name="developer" value="Educational Information Systems" />
- <info name="programmer" value="Jerry Chaffin, Bill Maxwell, Barbra Thompson, and Allen Colebank" />
+ <info name="programmer" value="Jerry Chaffin" />
+ <info name="programmer" value="Bill Maxwell" />
+ <info name="programmer" value="Barbra Thompson" />
+ <info name="programmer" value="Allen Colebank" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-05-12-->
- <!--educational program-->
+ <!-- Dump released: 2015-05-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="world atlas action (4am crack).dsk" size="143360" crc="5b439082" sha1="51367a42201135ffd6885b7cfcaae71cbea8fe4a" />
@@ -57270,12 +64591,12 @@ license:CC0-1.0
<software name="wldgeotr">
<description>World Geography Trivia (4am crack)</description>
<year>????</year>
- <!-- No date present anywhere in the metadata.. -->
+ <!-- No date present anywhere in the metadata. -->
<publisher>Micro Learningware</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-03-06-->
- <!--educational game-->
+ <!-- Dump released: 2015-03-06 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="world geography trivia (4am crack).dsk" size="143360" crc="b2876f4b" sha1="8797b44c6fb671d27ec23415fc1c829347b32ede" />
@@ -57283,14 +64604,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="wkchamp">
+ <description>World Karate Championship (4am crack)</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Mike Patrick" />
+ <info name="programmer" value="Mike Packard" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-10-10. Redumped 2021-08-28 due to subtle timing difference between Disk II and IWM hardware that resulted in the previous version not working on some machines. -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233482">
+ <rom name="world karate championship (4am crack).dsk" size="143360" crc="96a0d5c0" sha1="96500fb86cc2e910093d2d587b881a0ea234f8ce" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mlwldwr2">
<description>World War II (Micro Learningware) (4am crack)</description>
<year>1984</year>
<publisher>Micro Learningware</publisher>
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2017-02-26-->
- <!--educational game-->
+ <!-- Dump released: 2017-02-26 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="world war ii (4am crack).dsk" size="143360" crc="5a3cbb0a" sha1="b31ae35c96ffb329caa3af02fd228948a4a0b07d" />
@@ -57298,6 +64637,121 @@ license:CC0-1.0
</part>
</software>
+ <software name="wirpctcp">
+ <description>Write It Right!: Punctuation and Capitalization (4am crack)</description>
+ <year>1990</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Greg Truex" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-02-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="write it right - punctuation and capitalization (4am crack).dsk" size="143360" crc="73c4dace" sha1="017a293dbe8820162bc420528208163c0430176a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrabbt10" cloneof="wrabbt">
+ <description>Writer Rabbit (version 1.0) (4am crack)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="programmer" value="Gene Genoar" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="programmer" value="Shaun Gordon" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Murray Suid" />
+ <info name="programmer" value="Anna Suid" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <!-- Includes a one-time backup utility (press B at the level selection screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-09-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="writer rabbit 1.0 (4am crack) side a.dsk" size="143360" crc="fd1e4a40" sha1="a088465caaf4947e04d52b9ac63cf71fbd5fcbe9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="writer rabbit 1.0 (4am crack) side b.dsk" size="143360" crc="6f492364" sha1="2a09033d2703e1a3f2aa20fa782361e3574b6a18" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrabbt12" cloneof="wrabbt">
+ <description>Writer Rabbit (version 1.2) (4am crack)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="programmer" value="Gene Genoar" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="programmer" value="Shaun Gordon" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Murray Suid" />
+ <info name="programmer" value="Anna Suid" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <!-- Includes a one-time backup utility (press B at the level selection screen) which has been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2015-08-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="writer rabbit 1.2 (4am crack) side a.dsk" size="143360" crc="89feb276" sha1="a03366f12b32b1a1778326565765fa9ceac41bdb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="writer rabbit 1.2 (4am crack) side b.dsk" size="143360" crc="4f3b676b" sha1="576833e86e42d6667796015cb8ed0e68537bfb11" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrabbt">
+ <description>Writer Rabbit (version 1.3) (4am crack)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="programmer" value="Gene Genoar" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="programmer" value="Shaun Gordon" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Murray Suid" />
+ <info name="programmer" value="Anna Suid" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <!-- Includes a one-time backup utility (press B at the level selection screen) which has been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="Writer Rabbit (4am crack) side A.dsk" size="143360" crc="79b78c0a" sha1="9ee29f8abf062e50de03d4ecec0143cb1db82452" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="Writer Rabbit (4am crack) side B.dsk" size="143360" crc="6f824696" sha1="ebc0d8f34edaff45e584c83be140cddf1cfb7854" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="writhelp">
<description>Writer's Helper (version 1.5) (4am crack)</description>
<year>1985</year>
@@ -57306,8 +64760,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.5" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program disk"/>
<dataarea name="flop" size="143360">
@@ -57316,6 +64770,172 @@ license:CC0-1.0
</part>
</software>
+ <software name="writecsk10" cloneof="writecsk">
+ <description>Writing A Character Sketch (A-785 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-785" />
+ <info name="programmer" value="Rich M. Childers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-02. Redumped: 2021-02-23 to fix hidden CTRL+A administrative menu. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a785 writing a character sketch v1.0 (4am crack).dsk" size="143360" crc="608ea78b" sha1="8b65a6841d5615ecf39806478d7a355f09484ab5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="writecsk11" cloneof="writecsk">
+ <description>Writing A Character Sketch (A-785 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-785" />
+ <info name="programmer" value="Rich M. Childers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a785 writing a character sketch v1.1 (4am crack).dsk" size="143360" crc="64a7744d" sha1="a34b509bf6211f74267473b65ba758f97f3b66b2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="writecsk">
+ <description>Writing A Character Sketch (A-785 version 1.2) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-785" />
+ <info name="programmer" value="Rich M. Childers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a785 writing a character sketch v1.2 (4am crack).dsk" size="143360" crc="b53c6aa9" sha1="1ed91a5f421b071b9728652c1840f1dbaacff42b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="writenar10" cloneof="writenar">
+ <description>Writing a Narrative (A-776 version 1.0) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-776" />
+ <info name="programmer" value="Rich M. Childers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a776 writing a narrative v1.0 (4am crack).dsk" size="143360" crc="3e443154" sha1="3bf54021f807ab5694917d8a3cbbb594539ba340"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="writenar">
+ <description>Writing a Narrative (A-776 version 1.1) (4am crack)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-776" />
+ <info name="programmer" value="Rich M. Childers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a776 writing a narrative v1.1 (4am crack).dsk" size="143360" crc="be1a9d16" sha1="8a78040212d39899fd91ac07f4e483d2dcbe862b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wropinpap10" cloneof="wropinpap">
+ <description>Writing an Opinion Paper (A-114 version 1.0) (4am crack)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-114" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a114 writing an opinion paper v1.0 (4am crack).dsk" size="143360" crc="25b83423" sha1="5a2e3c54034e3ac807c8ee35d4ea05cb5420643e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wropinpap">
+ <description>Writing an Opinion Paper (A-114 version 1.1) (4am crack)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-114" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a114 writing an opinion paper v1.1 (4am crack).dsk" size="143360" crc="2c4a3959" sha1="6836ede014567f28f9aecd817cfba9a6603cd127" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="xevious">
+ <description>Xevious (4am crack)</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Dan Hewitt" />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-06-14 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="xevious (4am crack).dsk" size="143360" crc="c0965f9a" sha1="11b8f8761b4d5cfb333d95dfe7064a3115febab6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="xyphus">
+ <description>Xyphus (4am crack)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Skip Waller" />
+ <info name="programmer" value="Dave Albert" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-02 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program"/>
+ <dataarea name="flop" size="143360">
+ <rom name="xyphus (4am crack) side a.dsk" size="143360" crc="ee14153e" sha1="be08e5edb46f603e8ea9f334fb4a9af6407a86bf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario"/>
+ <dataarea name="flop" size="143360">
+ <rom name="xyphus (4am crack) side b.dsk" size="143360" crc="014a80b1" sha1="c26fee0543b9532dba814baf6ab12a5f9a36e50c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pnetwrth">
<description>Your Personal Net Worth (4am crack)</description>
<year>1984</year>
@@ -57323,8 +64943,8 @@ license:CC0-1.0
<info name="developer" value="ISA Software" />
<info name="usage" value="Requires an Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2015-06-15-->
- <!--productivity program-->
+ <!-- Dump released: 2015-06-15 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="your personal net worth (4am crack).dsk" size="143360" crc="c98be649" sha1="2c4555b80d2c2a07c4d2897d1b6b042cedffe314" />
@@ -57332,15 +64952,31 @@ license:CC0-1.0
</part>
</software>
+ <software name="ymmyymmy">
+ <description>Yummy, Yummy (4am crack)</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-04-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="yummy, yummy (4am crack).dsk" size="143360" crc="4d54d2d0" sha1="9aa487d98e5e12e59f64155d879228c3e2741198" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="zenithg" cloneof="zenith">
- <description>Zenith (4am and san inc crack)</description>
+ <description>Zenith (Gebelli Software) (4am and san inc crack)</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
<info name="programmer" value="Nasir Gebelli" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-26-->
- <!--action game-->
+ <!-- Dump released: 2023-07-26 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="zenith (4am and san inc crack).dsk" size="143360" crc="019345d9" sha1="43854a8d742c4fd479eada3b246fabcdfe4086a9" />
@@ -57349,15 +64985,15 @@ license:CC0-1.0
</software>
<software name="zenith">
- <description>Zenith (SoftSmith) (4am and san inc crack)</description>
+ <description>Zenith (Softsmith) (4am and san inc crack)</description>
<year>1983</year>
- <publisher>SoftSmith</publisher>
+ <publisher>Softsmith</publisher>
<info name="original_publisher" value="Gebelli Software" />
<info name="programmer" value="Nasir Gebelli" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-06-26-->
- <!--action game-->
+ <!-- Dump released: 2021-06-26 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="zenith (softsmith) (4am and san inc crack).dsk" size="143360" crc="5aca8e2b" sha1="1e3086c531f8ca29ff79d4551682e8f5799b485e"/>
@@ -57373,8 +65009,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-29-->
- <!--action game-->
+ <!-- Dump released: 2021-04-29 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="zoo master (4am crack).dsk" size="143360" crc="58e50374" sha1="a2420b04b5422c703b35fa6851f6cb18809d314c"/>
@@ -57389,10 +65025,10 @@ license:CC0-1.0
<info name="programmer" value="Kevin Ryan" />
<info name="usage" value="Requires an Apple ][+ or later." />
<info name="version" value="revision 2" />
- <!--Compared to the first revision, this has updated copy protection and fixes to the Mockingboard sound drivers.-->
+ <!-- Compared to the first revision, this has updated copy protection and fixes to the Mockingboard sound drivers. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-09-05-->
- <!--action game-->
+ <!-- Dump released: 2023-09-05 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="zoo master rev. 2 (4am crack).dsk" size="143360" crc="c8a682f4" sha1="79534d2e394a16cddf8e68d77cf66e128ac48f68" />
@@ -57400,6 +65036,188 @@ license:CC0-1.0
</part>
</software>
+ <software name="zoopupth">
+ <description>Zoo Puppet Theater (4am crack)</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="developer" value="Electronic Courseware Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="zoo puppet theater (4am crack).dsk" size="143360" crc="fa74042f" sha1="8eccccffd1ca8416b536934290bf5811e4880e47"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zoomgrafv0182" cloneof="zoomgraf">
+ <description>Zoom Grafix (version 26-JAN-82) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Dav Holle" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="26-JAN-82" />
+ <!-- This version is dated 26-JAN-82 according to comments within the program itself. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="zoom grafix 26-jan-82 (4am crack).dsk" size="143360" crc="789d302a" sha1="c3c457bc13a2eb4061b9843c54adbc6a3e50644f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zoomgraf0482" cloneof="zoomgraf">
+ <description>Zoom Grafix (version 29-APR-82) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Dav Holle" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="29-APR-82" />
+ <!-- This version is dated 29-APR-82 according to comments within the program itself. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="zoom grafix 29-apr-82 (4am crack).dsk" size="143360" crc="dc92bdae" sha1="8cfa992832dcb9abe5b44ce4e2e51bb5bc4491d8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zoomgraf0583" cloneof="zoomgraf">
+ <description>Zoom Grafix (version 25-MAY-83) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Dav Holle" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="25-MAY-83" />
+ <!-- This version is dated 25-MAY-83 according to comments within the program itself. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-05 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="zoom grafix 25-may-83 (4am crack).dsk" size="143360" crc="6692bf9f" sha1="043a588c7fb800b6e913da008ed0327db0046d04" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zoomgraf">
+ <description>Zoom Grafix (version 05-OCT-83) (4am crack)</description>
+ <year>1983</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Dav Holle" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="05-OCT-83" />
+ <!-- This version is dated 05-OCT-83 according to comments within the program itself. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="zoom grafix 05-oct-83 (4am crack).dsk" size="143360" crc="72cd3138" sha1="66a6fa3e0cee04fcc222ad61de3e8d22668b6ebd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zgfxse">
+ <description>Zoom Grafix Second Edition (version 05-MAY-83) (4am crack)</description>
+ <year>1982</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Dav Holle" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="05-MAY-83" />
+ <!-- This version is dated 05-MAY-83 according to comments within the program itself. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-12-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="zoom grafix second edition (4am crack).dsk" size="143360" crc="5db0f70f" sha1="d7496eba65e8321ce02223c9dae66a6f51d8601a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zoyonpat">
+ <description>Zoyon Patrol (A-199 version 1.0) (4am crack)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-199" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-03-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a199 zoyon patrol v1.0 (4am crack) side a.dsk" size="143360" crc="c8ba3979" sha1="cf91a1c7ac485f435818ee4aef66fd7f9278f868"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="143360">
+ <rom name="mecc-a199 zoyon patrol v1.0 (4am crack) side b.dsk" size="143360" crc="5a5c18b8" sha1="62428a2d91a99052002afcfa92d28cf7977ba58d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microadd">
+ <description>microAddition (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Anthony Cote" />
+ <info name="programmer" value="Andrew E. Taylor" />
+ <info name="programmer" value="Brian Root" />
+ <info name="programmer" value="Kerry Wentworth" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro addition (4am crack).dsk" size="143360" crc="10e7aefc" sha1="c9f05bff90fac6c7abcf31a6acc0ee8965248468" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microdiv">
+ <description>microDivision (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Hayden Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-07-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro division (4am crack).dsk" size="143360" crc="e6d86580" sha1="dfdaabce438fb5b075ef6c3970ea995b61653f55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="micromul">
+ <description>microMultiplication (4am crack)</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Hayden Software" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2016-08-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="micro multiplication (4am crack).dsk" size="143360" crc="8f87468f" sha1="4728a423315f032f3562702d75a0a9718b1b9796" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pfsa02" cloneof="pfs">
<description>pfs (version A.02, 1980-10-23) (4am crack)</description>
<year>1980</year>
@@ -57408,8 +65226,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="A.02, 1980-10-23" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-10-07-->
- <!--productivity program-->
+ <!-- Dump released: 2021-10-07 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs va.02 (4am crack).dsk" size="143360" crc="5ace09ae" sha1="26063377c1a5e317710b18954b8db1306d08e8e5"/>
@@ -57425,8 +65243,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="B.00, 1981-01-03" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-10-08-->
- <!--productivity program-->
+ <!-- Dump released: 2021-10-08 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs vb.00 (4am crack).dsk" size="143360" crc="8106efe8" sha1="5f33707a6014b6d68c147130bcceb8ffb97240a7"/>
@@ -57436,7 +65254,7 @@ license:CC0-1.0
<software name="pfsreportf841126" cloneof="pfsreport">
<description>pfs: etat (French, version 1984-11-26) (4am crack)</description>
- <!--French version of pfs: report-->
+ <!-- French version of pfs: report -->
<year>1984</year>
<publisher>Software Publishing Corporation</publisher>
<info name="alt_title" value="pfs: report"/>
@@ -57444,8 +65262,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1984-11-26" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-30-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-30 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs etat 1984-11-26 (4am crack).dsk" size="143360" crc="47aab309" sha1="60457eefaa21a29bc94b49e9f656aed2edd08ae6"/>
@@ -57455,7 +65273,7 @@ license:CC0-1.0
<software name="pfsfilef841126" cloneof="pfsfile">
<description>pfs: fichier (French, version 1984-11-26) (4am crack)</description>
- <!--French version of pfs: file-->
+ <!-- French version of pfs: file -->
<year>1984</year>
<publisher>Software Publishing Corporation</publisher>
<info name="alt_title" value="pfs: file"/>
@@ -57463,8 +65281,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1984-11-26" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-10-->
- <!--productivity program-->
+ <!-- Dump released: 2022-07-10 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs fichier 1984-11-26 (4am crack).dsk" size="143360" crc="7bd22192" sha1="5831295341c97ac7007d047bbad87eb73ec18da5"/>
@@ -57480,8 +65298,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later." />
<info name="version" value="A.00" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-11-11-->
- <!--productivity program-->
+ <!-- Dump released: 2021-11-11 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs file va.00 (4am crack).dsk" size="143360" crc="49980399" sha1="14451182f9d319d2c08a7f7fd68aec10654299b1"/>
@@ -57497,8 +65315,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="B.01" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-28-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-28 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs file vb.01 (4am crack).dsk" size="143360" crc="090d2c52" sha1="55fde1cfbea9eb7debf40e2bb8cc55f8bcc2a28c"/>
@@ -57514,8 +65332,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later." />
<info name="version" value="C.00" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-28-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-28 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs file vc.00 (4am crack).dsk" size="143360" crc="79c0d1f6" sha1="417fbfd3c8b11a4ee15775f4dbd89c40b69f308c"/>
@@ -57531,8 +65349,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1985-09-10" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-13-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-13 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs file v10-sep-85 (4am crack).dsk" size="143360" crc="b547d759" sha1="a45417766f62008011a6a403b42ed0bf71291276" />
@@ -57548,8 +65366,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later. Due to programming errors, this version works best on an unenhanced Apple //e." />
<info name="version" value="1983-01-12" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-28-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-28 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs graph 1983-01-12 (4am crack).dsk" size="143360" crc="56ee1260" sha1="29f14fd0564e271a10db7c73918735e9149d5d45"/>
@@ -57565,8 +65383,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later. Due to programming errors, this version works best on an unenhanced Apple //e." />
<info name="version" value="1984-01-31" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-28-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-28 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs graph 1984-01-31 (4am crack).dsk" size="143360" crc="d6629d33" sha1="d97550d6308f80cd629cd88c0d3a5f3ce902fd55"/>
@@ -57582,8 +65400,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later." />
<info name="version" value="1984-03-14" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-29-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-29 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs graph 1984-03-14 (4am crack).dsk" size="143360" crc="a64f0d4c" sha1="4a3e779d550c5c4cf73b91b022e57f7f4050a758"/>
@@ -57599,8 +65417,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later. Due to programming errors, this version works best without an 80-column card." />
<info name="version" value="B.00, 1981-01-03" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-29-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-29 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs report 1981-01-03 (vb.00) (4am crack).dsk" size="143360" crc="47f55268" sha1="a67c4ef6e2591bc0600b565c88f00552eecb5a51"/>
@@ -57616,8 +65434,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="B.02" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-03-->
- <!--productivity program-->
+ <!-- Dump released: 2022-02-03 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs report vb.02 (4am crack).dsk" size="143360" crc="90331e8c" sha1="900165dee2d26f5e727cc8609ce94bea5dc8eb71"/>
@@ -57633,8 +65451,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later. Due to programming errors, this version works best on an unenhanced Apple //e." />
<info name="version" value="1982-01-14" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-30-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-30 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs report 1982-01-14 (4am crack).dsk" size="143360" crc="4da01078" sha1="7f9e9dec317c332bce8f182afc95674dff36eb54"/>
@@ -57650,8 +65468,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later." />
<info name="version" value="1984-03-20" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-06-->
- <!--productivity program-->
+ <!-- Dump released: 2022-07-06 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs report 1984-03-20 (4am crack).dsk" size="143360" crc="151c8983" sha1="b43f08faed0048b685cac99ddc13cb122068a9e5" />
@@ -57667,8 +65485,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1985-09-10" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-10-->
- <!--productivity program-->
+ <!-- Dump released: 2022-07-10 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs report 1985-09-10 (4am crack).dsk" size="143360" crc="6b693ea6" sha1="c3c8d9aae12ad540925be3d5a1b7d7e4b7d9a944"/>
@@ -57684,8 +65502,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1984-09-27" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-29-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-29 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs write 1984-09-27 (4am crack).dsk" size="143360" crc="4007b909" sha1="e50ce5a9adc1f4e10c066db427d0d89b40917984"/>
@@ -57701,8 +65519,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1984-11-01" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-06-30-->
- <!--productivity program-->
+ <!-- Dump released: 2022-06-30 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pfs write 1984-11-01 (4am crack).dsk" size="143360" crc="cfab2c65" sha1="b165e9b7d5dd63433e2812c9bf2fe8044ef18a94"/>
@@ -57718,8 +65536,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1986-01-01" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-07-03-->
- <!--productivity program-->
+ <!-- Dump released: 2022-07-03 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="143360">
@@ -57748,8 +65566,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1986-04-28" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-09-19-->
- <!--productivity program-->
+ <!-- Dump released: 2021-09-19 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Program"/>
<dataarea name="flop" size="143360">
diff --git a/hash/apple2_flop_misc.xml b/hash/apple2_flop_misc.xml
index 00dc839179b..7fd5d2778cf 100644
--- a/hash/apple2_flop_misc.xml
+++ b/hash/apple2_flop_misc.xml
@@ -49,6 +49,25 @@ Generated by SLIST 0.2.1
</part>
</software>
+ <software name="a2diag31">
+ <description>Apple II Diagnostic Disk (version 3.1)(800K 3.5")</description>
+ <year>1991</year>
+ <publisher>Apple Computer</publisher>
+ <info name="usage" value="Requires an Apple IIgs, IIc+, //c, //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- This disk contains 4 versions of the diagnostic tools:
+ Apple IIgs Diagnostic, V3.1
+ Apple IIc Plus Diagnostic, V2.0
+ Apple IIc Diagnostic, V3.0
+ Apple IIe Diagnostic, V3.0
+ -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="apple ii diagnostic v3_1.po" size="819200" crc="50d3243d" sha1="23881d0096d428f2ea8568c854dc25f6b66ff051" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="apwrks12">
<description>AppleWorks (Version 1.2, USA)</description>
<year>1983</year>
@@ -166,6 +185,90 @@ Generated by SLIST 0.2.1
</part>
</software>
+ <software name="dos31">
+ <description>DOS 3.1 System Master</description>
+ <year>1978</year>
+ <publisher>Apple Computer, Inc.</publisher>
+ <info name="usage" value="Requires Integer BASIC and a 13-sector bootloader" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="116480">
+ <rom name="Apple DOS 3.1 Master.d13" size="116480" crc="48774555" sha1="c81fdbfad674afaa0af89d851d301fd5c2430552" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dos311" cloneof="dos31">
+ <description>DOS 3.1.1 System Master</description>
+ <year>1978</year>
+ <publisher>Apple Computer, Inc.</publisher>
+ <info name="usage" value="Requires Integer BASIC and a 13-sector bootloader" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="116480">
+ <rom name="Apple DOS 3.1.1 Master.d13" size="116480" crc="3b691817" sha1="fb24763efdd4b849933d4f0050cdd56c16ba5f24" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dos32">
+ <description>DOS 3.2 System Master (Standard Version)</description>
+ <year>1979</year>
+ <publisher>Apple Computer, Inc.</publisher>
+ <info name="usage" value="Requires Integer BASIC and a 13-sector bootloader" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="116480">
+ <rom name="Apple DOS 3.2 Standard.d13" size="116480" crc="91061e1a" sha1="015ff2a99a5c6cca4d270304c8f709a6435610ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dos321" cloneof="dos32">
+ <description>DOS 3.2.1 System Master (Standard Version)</description>
+ <year>1979</year>
+ <publisher>Apple Computer, Inc.</publisher>
+ <info name="usage" value="Requires Integer BASIC and a 13-sector bootloader" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="116480">
+ <rom name="Apple DOS 3.2.1 Standard.d13" size="116480" crc="e562e726" sha1="0c6ec7550f315543063467e1364f6cf1c9f59249" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dos32p">
+ <description>DOS 3.2 System Master (Plus Version)</description>
+ <year>1979</year>
+ <publisher>Apple Computer, Inc.</publisher>
+ <info name="usage" value="Requires Applesoft BASIC and a 13-sector bootloader" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="116480">
+ <rom name="Apple DOS 3.2 Plus.d13" size="116480" crc="9fb90a9f" sha1="8c27781e876e803defdfe70974bcbd24c8329694" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dos32ut">
+ <description>DOS 3.2 Utility Disk</description>
+ <year>1979</year>
+ <publisher>Apple Computer, Inc.</publisher>
+ <info name="usage" value="Requires Integer BASIC and a 13-sector bootloader" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="116480">
+ <rom name="Apple DOS 3.2 Utility.d13" size="116480" crc="6370f7dc" sha1="31473abf0fe6ffd2629450d132683f70661494eb" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dos3380a">
<description>DOS 3.3 System Master (1980, alternate)</description>
<year>1980</year>
@@ -464,16 +567,26 @@ Generated by SLIST 0.2.1
</software>
<software name="221baker">
- <description>221B Baker Street</description>
+ <description>221B Baker Street (version 1.0) (digital gang crack)</description>
<year>1986</year>
<publisher>Datasoft</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="programmer" value="Jeff Harth" />
+ <info name="programmer" value="Steven Duboff" />
+ <info name="programmer" value="John P. Sohl" />
+ <info name="programmer" value="Russ Wolvek" />
+ <info name="programmer" value="Todd Camasta" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program disk" />
<dataarea name="flop" size="143360">
<rom name="221b baker street (1986)(datasoft)(side a)[cr digital gang].do" size="143360" crc="9e44f2a5" sha1="2819e924a5507e9a0509cbc4b711813043f8dfe8" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Case disk" />
<dataarea name="flop" size="143360">
<rom name="221b baker street (1986)(datasoft)(side b)[cr digital gang].do" size="143360" crc="525a221a" sha1="56d5d0d3d91a768e8047d92d46f3ae7bf8567185" />
</dataarea>
@@ -557,11 +670,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="actsrcvb">
- <description>Accounts Receivable v2.5</description>
+ <software name="acctrecv">
+ <description>Accounts Receivable (version 2.5) (Continental Software)</description>
<year>1983</year>
<publisher>Continental Software</publisher>
-
+ <info name="developer" value="Continental Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="accounts receivable v2.5 (1983-12-09)(continental software).do" size="143360" crc="b9423826" sha1="f7411e04dfbd3acf066e74291af19b15857778b6" />
@@ -581,11 +698,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="adv1">
- <description>Adventure 1</description>
+ <software name="saga1aland">
+ <description>Scott Adams Graphic Adventure #1: Adventureland (version 1980)</description>
<year>1980</year>
- <publisher>&lt;unknown&gt;</publisher>
-
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Scott Adams" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <info name="version" value="1980" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventure - 1 (19xx)(-).do" size="143360" crc="9038b45b" sha1="e346b9b14f887ddfc2b1ce6e556c061b660c2edf" />
@@ -593,11 +714,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="adv4vdcs">
- <description>Adventure 4 - Voodoo Castle</description>
+ <software name="saga4voocas">
+ <description>Scott Adams Graphic Adventure #4: Voodoo Castle (version 1.0/119)</description>
<year>1980</year>
<publisher>Adventure International</publisher>
-
+ <info name="programmer" value="Alexis Adams" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1.0/119" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventure 4 - voodoo castle (1980)(adventure international).do" size="143360" crc="2a486454" sha1="10885c566d30a06c53786c223474a7875286eaaa" />
@@ -605,11 +730,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="advatlts">
- <description>Adventure to Atlantis</description>
+ <software name="apvatlan">
+ <description>Apventure to Atlantis</description>
<year>1982</year>
<publisher>Synergistic Software</publisher>
-
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="adventure to atlantis (1982)(synergistic software).do" size="143360" crc="5b1955df" sha1="e58230572df58529e749c176552022e91c18f34b" />
@@ -654,16 +782,23 @@ Generated by SLIST 0.2.1
</software>
<software name="ae">
- <description>A-E</description>
+ <description>A.E. (Black Bag crack)</description>
<year>1982</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="alt_title" value="AE" />
+ <info name="programmer" value="Jun Wada" />
+ <info name="programmer" value="Makoto Horai" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="a-e (1982)(broderbund)(side a)[cr black bag].do" size="143360" crc="25615cc0" sha1="4927ab923d6fe9bbd0ef8c8c8acef41755b1c335" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="a-e (1982)(broderbund)(side b)[cr black bag][unk filesys].do" size="143360" crc="8d90b09f" sha1="59e1efd82f0ef98eaa265b11a2bebe0c530a3eca" />
</dataarea>
@@ -876,7 +1011,7 @@ Generated by SLIST 0.2.1
* Support booting ProDOS on clones
* Additional patches for "Star Thief"
* Launch Anti-M program faster
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -894,7 +1029,7 @@ Generated by SLIST 0.2.1
<!--
* Support booting from drive 2
* Fix booting on MAME (See version 1.2 usage tag for details)
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
@@ -1184,16 +1319,22 @@ Generated by SLIST 0.2.1
</software>
<software name="arcmachn">
- <description>The Arcade Machine</description>
+ <description>The Arcade Machine (Krakowicz crack)</description>
<year>1982</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Chris Jochumson" />
+ <info name="programmer" value="Doug Carlston" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- game development environment -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="arcade machine, the (1982)(broderbund)(disk 1 of 2)[cr krakowicz].do" size="143360" crc="5ec1334d" sha1="236bddafa75b5bb969d271efa5dcf554b17e8309" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="arcade machine, the (1982)(broderbund)(disk 2 of 2)[cr krakowicz][unk filesys].do" size="143360" crc="2da46af7" sha1="8bc5bdec8bf61aeae78147945f4f6ec98ec98cec" />
</dataarea>
@@ -1327,30 +1468,44 @@ Generated by SLIST 0.2.1
<description>Autoduel</description>
<year>1985</year>
<publisher>Origin Systems</publisher>
-
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="autoduel (1985)(origins)(side a).do" size="143360" crc="97940fb3" sha1="0a94492f58f689143a35875e59938acfa1a4cb1f" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="autoduel (1985)(origins)(side b).do" size="143360" crc="373d3031" sha1="62dc18584e5a3250119be67208914f21f48c4f64" />
</dataarea>
</part>
</software>
- <software name="advbuckb">
- <description>Adventures of Buckaroo Banzai</description>
- <year>1985</year>
+ <software name="buckbanz">
+ <description>The Adventures of Buckaroo Banzai: Across The 8th Dimension! (version G 397) (The Armada crack)</description>
+ <year>1984</year>
<publisher>Adventure International</publisher>
-
+ <info name="programmer" value="Phillip Case" />
+ <info name="programmer" value="Mak Jukic" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="G 397" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="adventures of buckaroo banzai, the (19xx)(-)(side a)[cr].dsk" size="143360" crc="61e0f76c" sha1="9e625df4fdf3fcf6e1b854c47190617b111ff12f" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="adventures of buckaroo banzai, the (19xx)(-)(side b)[cr].dsk" size="143360" crc="86e0177f" sha1="b7272c6ce519d1e8a51f27048b2adf6dcd179aef" />
</dataarea>
@@ -1358,10 +1513,13 @@ Generated by SLIST 0.2.1
</software>
<software name="airheart">
- <description>Airheart</description>
+ <description>Airheart (The Evil Sock crack)</description>
<year>1986</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Dan Gorlin" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="airheart (1986)(broderbund)[cr evil sock].dsk" size="143360" crc="6223b013" sha1="9b6431b8a7b9aceb4ac441ec19f6ba9fcc2a02e6" />
@@ -1369,14 +1527,24 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="alert">
- <description>Alert</description>
+ <software name="halleypr">
+ <description>The Halley Project: A Mission In Our Solar System (disk jockey crack)</description>
+ <!-- crack screen mistakenly titles this "Alert" -->
<year>1985</year>
<publisher>Mindscape</publisher>
-
+ <info name="programmer" value="Omar Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="M. le Fuge" />
+ <info name="programmer" value="Ed McNierney" />
+ <info name="programmer" value="Peter Reynolds" />
+ <info name="programmer" value="Gabrielle Savage" />
+ <info name="programmer" value="Leonard Bertoni" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="alert (1985)(mindscape)[cr disk jockey].dsk" size="143360" crc="2c36e539" sha1="43f27944bbc738b85df0ae59c950a7b4b2b3b625" />
+ <rom name="the halley project (1985)(mindscape)[cr disk jockey].dsk" size="143360" crc="2c36e539" sha1="43f27944bbc738b85df0ae59c950a7b4b2b3b625" />
</dataarea>
</part>
</software>
@@ -1394,10 +1562,14 @@ Generated by SLIST 0.2.1
</software>
<software name="alibaba">
- <description>Ali Baba and the Forty Thieves</description>
+ <description>Ali Baba and the Forty Thieves (Dr. Death crack)</description>
<year>1982</year>
<publisher>Stuart Smith</publisher>
-
+ <!-- later published by Electronic Arts -->
+ <info name="programmer" value="Stuart Smith" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="ali baba and the forty thieves (1982)(smith, stuart)[cr dr. death].dsk" size="143360" crc="1217ae9a" sha1="a024a80fabaae447c36197d483efbba2b1150693" />
@@ -1426,49 +1598,70 @@ Generated by SLIST 0.2.1
<description>Amnesia</description>
<year>1986</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="author" value="Thomas M. Disch" />
+ <info name="developer" value="Cognetics" />
+ <info name="programmer" value="Kevin Bentley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="143360">
<rom name="amnesia (1986)(electronic arts)(disk 1 of 4).dsk" size="143360" crc="d38304c5" sha1="4746a9f36202de40b2fcc3b2b077a7901032318c" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
<dataarea name="flop" size="143360">
<rom name="amnesia (1986)(electronic arts)(disk 2 of 4).dsk" size="143360" crc="22131ea6" sha1="6c1955d5ab244053a443528e4afd9fd6d2bbc030" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
<dataarea name="flop" size="143360">
<rom name="amnesia (1986)(electronic arts)(disk 3 of 4).dsk" size="143360" crc="ce2d6688" sha1="59442d005eb8b35af3e9a624f13d4003a4d69004" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4" />
<dataarea name="flop" size="143360">
<rom name="amnesia (1986)(electronic arts)(disk 4 of 4).dsk" size="143360" crc="b86aad3a" sha1="9ceb153c5d79e5f3772f5ca8a6b04b9644a68bbf" />
</dataarea>
</part>
</software>
- <software name="archon2">
- <description>Archon II: Adept (cracked)</description>
- <year>1985</year>
+ <software name="archon">
+ <description>Archon: The Light and The Dark (Midwest Pirates Guild crack)</description>
+ <year>1984</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="author" value="Anne Westfall" />
+ <info name="author" value="Jon Freeman" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires an 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="archon ii - adept (1985)(electronic arts)[cr racketeers].dsk" size="143360" crc="fcf7b2e8" sha1="9b6e91644b23e08138dd125a11ce51aef0e1138d" />
+ <rom name="archon (1984)(electronic arts)[cr midwest pirates guild].dsk" size="143360" crc="34acae6e" sha1="731c8b7eed9992eaa104d6c3c049737943f04a49" />
</dataarea>
</part>
</software>
- <software name="archon">
- <description>Archon (cracked)</description>
- <year>1984</year>
+ <software name="archon2">
+ <description>Archon II: Adept (Racketeers crack)</description>
+ <year>1985</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="author" value="Anne Westfall" />
+ <info name="author" value="Jon Freeman" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
- <rom name="archon (1984)(electronic arts)[cr midwest pirates guild].dsk" size="143360" crc="34acae6e" sha1="731c8b7eed9992eaa104d6c3c049737943f04a49" />
+ <rom name="archon ii - adept (1985)(electronic arts)[cr racketeers].dsk" size="143360" crc="fcf7b2e8" sha1="9b6e91644b23e08138dd125a11ce51aef0e1138d" />
</dataarea>
</part>
</software>
@@ -1485,11 +1678,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="alienrn">
+ <software name="alnrain">
<description>Alien Rain</description>
<year>1981</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="232960">
<rom name="alien rain (1981)(broderbund)[dos].nib" size="232960" crc="11911c91" sha1="52c2b9b49ca6caa0e273522b1128b7a1611d9a8e" />
@@ -1497,11 +1693,18 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="altrcity">
- <description>Alternate Reality - The City</description>
+ <software name="arcity">
+ <description>Alternate Reality: The City (circle k crack)</description>
<year>1985</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Philip Price" />
+ <info name="programmer" value="Gary Gilbertson" />
+ <info name="programmer" value="Craig Skinner" />
+ <info name="programmer" value="Jim Ratcliff" />
+ <info name="programmer" value="Ken Jordan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="232960">
<rom name="alternate reality - the city (1985)(datasoft)(disk 1 of 3)[cr circle k].nib" size="232960" crc="776c280a" sha1="3a98a3b845e25477c3791660caef681f4e80ddc2" />
@@ -1520,10 +1723,17 @@ Generated by SLIST 0.2.1
</software>
<software name="altrdng">
- <description>Alternate Reality - The Dungeon</description>
+ <description>Alternate Reality: The Dungeon (version 2.1)</description>
<year>1987</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Dan Pinal" />
+ <info name="programmer" value="Ken Jordan" />
+ <info name="programmer" value="Jim Ratcliff" />
+ <info name="programmer" value="Rick Mirsky" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="232960">
<rom name="alternate reality - the dungeon (1987)(datasoft)(disk 1 of 3 side a).nib" size="232960" crc="1a47e41e" sha1="26a86c8f328ba2837fa261479ab4eea04a0f24df" />
@@ -1624,36 +1834,50 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="aawsea">
- <description>The Ancient Art Of War At Sea</description>
- <year>1988</year>
- <publisher>Broderbund</publisher>
-
+ <software name="artowar">
+ <description>The Ancient Art of War (version 1989) (Mechanic crack)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Murray" />
+ <info name="programmer" value="Barry Murray" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1989" />
+ <!-- 1989 re-release -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
- <rom name="ancient art of war at sea, the (1988)(broderbund)(side a).po" size="143360" crc="16031564" sha1="0392381786601b101cfe99dbfb33a6509124dc3a" />
+ <rom name="ancient art of war, the (1989)(broderbund)(side a)[cr club 96].po" size="143360" crc="325b8190" sha1="0c77caf172422753a20525918b9455d6c5bb0c94" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
- <rom name="ancient art of war at sea, the (1988)(broderbund)(side b).po" size="143360" crc="2e2ca6d4" sha1="699798ce9e02d484b3dce48d27b5604eaf1ef6c5" />
+ <rom name="ancient art of war, the (1989)(broderbund)(side b).po" size="143360" crc="f7b680cb" sha1="5b611e6a4225d61f3a785a3b9f880cf1b3478d66" />
</dataarea>
</part>
</software>
- <software name="aaw">
- <description>The Ancient Art Of War</description>
- <year>1989</year>
- <publisher>Broderbund</publisher>
-
+ <software name="aawarsea">
+ <description>The Ancient Art of War at Sea</description>
+ <year>1988</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Murray" />
+ <info name="programmer" value="Barry Murray" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
- <rom name="ancient art of war, the (1989)(broderbund)(side a)[cr club 96].po" size="143360" crc="325b8190" sha1="0c77caf172422753a20525918b9455d6c5bb0c94" />
+ <rom name="ancient art of war at sea, the (1988)(broderbund)(side a).po" size="143360" crc="16031564" sha1="0392381786601b101cfe99dbfb33a6509124dc3a" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
- <rom name="ancient art of war, the (1989)(broderbund)(side b).po" size="143360" crc="f7b680cb" sha1="5b611e6a4225d61f3a785a3b9f880cf1b3478d66" />
+ <rom name="ancient art of war at sea, the (1988)(broderbund)(side b).po" size="143360" crc="2e2ca6d4" sha1="699798ce9e02d484b3dce48d27b5604eaf1ef6c5" />
</dataarea>
</part>
</software>
@@ -1729,10 +1953,13 @@ Generated by SLIST 0.2.1
</software>
<software name="balpower">
- <description>Balance of Power (cracked)</description>
+ <description>Balance of Power (Coast To Coast crack)</description>
<year>1987</year>
<publisher>Mindscape</publisher>
-
+ <info name="programmer" value="Chris Crawford" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="balance of power (1987)(mindscape)[cr coast to coast].po" size="143360" crc="b6126d44" sha1="c1fea91b323ba3dc68808c5aaccb11e74d2ec9c5" />
@@ -1834,110 +2061,146 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="bardstl2">
- <description>Bard's Tale II - The Destiny Knight</description>
- <year>1986</year>
+ <software name="brdstalen6" cloneof="brdstale">
+ <description>The Bard's Tale: Tales of the Unknown (Number 6 crack)</description>
+ <year>1985</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="alt_title" value="Tales of the Unknown: The Bard's Tale" />
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="programmer" value="Bill Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 1 of 4).dsk" size="143360" crc="b6843a24" sha1="89ea71a9b3abe8318d3d63eada377474af327019" />
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 1 of 4)(boot)[cr numero 6].dsk" size="143360" crc="ddbd6a83" sha1="2ee23f0c2a0a5bab3b823316802d158bcb5870af" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Character"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 2 of 4)(character).dsk" size="143360" crc="d392ec46" sha1="b2b84c93d0d08c32ddaca8bbb5ef077fd91440fb" />
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 2 of 4)(character)[cr].dsk" size="143360" crc="c4dfab6f" sha1="7c843a0e79e6fe5c89493d466305163e6dbfa97a" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Dungeon 1"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 3 of 4)(dungeon 1).dsk" size="143360" crc="b4b02734" sha1="0a6db98da9bace113c133d0118975e48795c489e" />
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 3 of 4)(dungeon 1)[cr].dsk" size="143360" crc="e94d34e4" sha1="08e4e5178be609d7f2ba04c0940dd8e71783df33" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Dungeon 2"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 4 of 4)(dungeon 2).dsk" size="143360" crc="1a97f984" sha1="700a60007453199f8d80ca99f5c40baeb8ffaa7a" />
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 4 of 4)(dungeon 2)[cr].dsk" size="143360" crc="eae221ba" sha1="f6b6d6e6ceac0c4b5950a1401a763e178a1493bd" />
</dataarea>
</part>
</software>
- <software name="bardstl3">
- <description>Bard's Tale III - The Thief of Fate</description>
- <year>1988</year>
- <publisher>Interplay</publisher>
-
+ <software name="brdstale">
+ <description>The Bard's Tale: Tales of the Unknown (Club X crack)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="alt_title" value="Tales of the Unknown: The Bard's Tale" />
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="programmer" value="Bill Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop1" size="143358">
- <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 1 of 4).dsk" size="143358" crc="a8798140" sha1="dfc3fd97c3abc209ddf170538af97f4848a26d4f" />
+ <feature name="part_id" value="Disk 1 - Boot"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 1 of 4)(boot)[cr club x].dsk" size="143360" crc="ee0c10db" sha1="904233118d7744d3bf20ca3931481afc89f4185e" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <dataarea name="flop1" size="143358">
- <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 2 of 4)(character).dsk" size="143358" crc="7c748e7d" sha1="e7ca50fd58df7d136c5c42710f1901d1b0e01b93" />
+ <feature name="part_id" value="Disk 2 - Character"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 2 of 4)(character)[cr club x].dsk" size="143360" crc="f55ba619" sha1="210c3d1f6e5221077d03f6f8cd99732ba0a183c8" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
- <dataarea name="flop1" size="143195">
- <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 3 of 4)(dungeon 1).dsk" size="143195" crc="9af87667" sha1="cd65428c5365f89e457adae867a970fbad47243e" />
+ <feature name="part_id" value="Disk 3 - Dungeon 1"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 3 of 4)(dungeon 1)[cr club x].dsk" size="143360" crc="76f2d041" sha1="f319b69df12b0b00772956f76071300105a5d43a" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
- <dataarea name="flop1" size="143358">
- <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 3 of 4)(dungeon 2).dsk" size="143358" crc="d6f2595b" sha1="a25d0dbebbf9767785115829c6cc624a81eb11dc" />
+ <feature name="part_id" value="Disk 4 - Dungeon 2"/>
+ <dataarea name="flop1" size="143360">
+ <rom name="bard's tale, the (1985)(electronic arts)(disk 4 of 4)(dungeon 2)[cr].dsk" size="143360" crc="eae221ba" sha1="f6b6d6e6ceac0c4b5950a1401a763e178a1493bd" />
</dataarea>
</part>
</software>
- <software name="bardstla">
- <description>The Bard's Tale</description>
- <year>1985</year>
+ <software name="brdstale2">
+ <description>The Bard's Tale II: The Destiny Knight (Godfather crack)</description>
+ <year>1986</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 1 of 4)(boot)[cr numero 6].dsk" size="143360" crc="ddbd6a83" sha1="2ee23f0c2a0a5bab3b823316802d158bcb5870af" />
+ <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 1 of 4).dsk" size="143360" crc="b6843a24" sha1="89ea71a9b3abe8318d3d63eada377474af327019" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Character"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 2 of 4)(character)[cr].dsk" size="143360" crc="c4dfab6f" sha1="7c843a0e79e6fe5c89493d466305163e6dbfa97a" />
+ <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 2 of 4)(character).dsk" size="143360" crc="d392ec46" sha1="b2b84c93d0d08c32ddaca8bbb5ef077fd91440fb" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Dungeon 1"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 3 of 4)(dungeon 1)[cr].dsk" size="143360" crc="e94d34e4" sha1="08e4e5178be609d7f2ba04c0940dd8e71783df33" />
+ <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 3 of 4)(dungeon 1).dsk" size="143360" crc="b4b02734" sha1="0a6db98da9bace113c133d0118975e48795c489e" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Dungeon 2"/>
<dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 4 of 4)(dungeon 2)[cr].dsk" size="143360" crc="eae221ba" sha1="f6b6d6e6ceac0c4b5950a1401a763e178a1493bd" />
+ <rom name="bard's tale ii - the destiny knight, the (1986)(electronic arts)(disk 4 of 4)(dungeon 2).dsk" size="143360" crc="1a97f984" sha1="700a60007453199f8d80ca99f5c40baeb8ffaa7a" />
</dataarea>
</part>
</software>
- <software name="bardstl">
- <description>The Bard's Tale (cracked)</description>
- <year>1985</year>
+ <software name="brdstale3">
+ <description>The Bard's Tale III: The Thief of Fate</description>
+ <year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 1 of 4)(boot)[cr club x].dsk" size="143360" crc="ee0c10db" sha1="904233118d7744d3bf20ca3931481afc89f4185e" />
+ <feature name="part_id" value="Disk 1 - Program"/>
+ <dataarea name="flop1" size="143358">
+ <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 1 of 4).dsk" size="143358" crc="a8798140" sha1="dfc3fd97c3abc209ddf170538af97f4848a26d4f" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 2 of 4)(character)[cr club x].dsk" size="143360" crc="f55ba619" sha1="210c3d1f6e5221077d03f6f8cd99732ba0a183c8" />
+ <feature name="part_id" value="Disk 2 - Character"/>
+ <dataarea name="flop1" size="143358">
+ <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 2 of 4)(character).dsk" size="143358" crc="7c748e7d" sha1="e7ca50fd58df7d136c5c42710f1901d1b0e01b93" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
- <dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 3 of 4)(dungeon 1)[cr club x].dsk" size="143360" crc="76f2d041" sha1="f319b69df12b0b00772956f76071300105a5d43a" />
+ <feature name="part_id" value="Disk 3 - Dungeon 1"/>
+ <dataarea name="flop1" size="143195">
+ <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 3 of 4)(dungeon 1).dsk" size="143195" crc="9af87667" sha1="cd65428c5365f89e457adae867a970fbad47243e" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
- <dataarea name="flop1" size="143360">
- <rom name="bard's tale, the (1985)(electronic arts)(disk 4 of 4)(dungeon 2)[cr].dsk" size="143360" crc="eae221ba" sha1="f6b6d6e6ceac0c4b5950a1401a763e178a1493bd" />
+ <feature name="part_id" value="Disk 4 - Dungeon 2"/>
+ <dataarea name="flop1" size="143358">
+ <rom name="bard's tale iii - the thief of fate, the (1988)(interplay)(disk 3 of 4)(dungeon 2).dsk" size="143358" crc="d6f2595b" sha1="a25d0dbebbf9767785115829c6cc624a81eb11dc" />
</dataarea>
</part>
</software>
@@ -2215,17 +2478,17 @@ Generated by SLIST 0.2.1
<software name="bbcstlwf">
<description>Beyond Beyond Castle Wolfenstein</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
-
+ <year>1987</year>
+ <publisher>Ryan Russon Productions</publisher>
+ <!-- Comedic Demo -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
- <rom name="beyond beyond castle wolfenstein (19xx)(mindscape)(side a).do" size="143360" crc="96e6caf6" sha1="66edcb20ed52dc42888ff2132cd967f0cc4e13e6" />
+ <rom name="beyond beyond castle wolfenstein (19xx)(side a).do" size="143360" crc="96e6caf6" sha1="66edcb20ed52dc42888ff2132cd967f0cc4e13e6" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
- <rom name="beyond beyond castle wolfenstein (19xx)(mindscape)(side b).do" size="143360" crc="ae5ff11d" sha1="6c8db13d0d35bfa30ccaae29d3df666c2b36d880" />
+ <rom name="beyond beyond castle wolfenstein (19xx)(side b).do" size="143360" crc="ae5ff11d" sha1="6c8db13d0d35bfa30ccaae29d3df666c2b36d880" />
</dataarea>
</part>
</software>
@@ -2462,10 +2725,13 @@ Generated by SLIST 0.2.1
</software>
<software name="bismarck">
- <description>Bismarck (cracked)</description>
+ <description>Bismarck: The North Sea Chase (digital gang crack)</description>
<year>1987</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Tony Stoddart" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="bismarck (1987)(datasoft)[cr digital gang].dsk" size="143360" crc="8313ee35" sha1="b835c0f417796b36f64130ae0362974953e8278b" />
@@ -2485,11 +2751,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="bldkitcr">
- <description>Boulder Dash Construction Kit (cracked)</description>
+ <software name="bdconkit">
+ <description>Boulder Dash Construction Kit (Digital Gang crack)</description>
<year>1987</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Pat Montelo" />
+ <info name="programmer" value="Fernando Herrera" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- game development utility -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="boulder dash construction kit (1987)(epyx)[cr digital gang - usalliance].do" size="143360" crc="b80fd3ea" sha1="4727b679ff565c1e9056565e14a653830a3a271c" />
@@ -2526,11 +2796,17 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="bldrdash">
- <description>Boulder Dash</description>
+ <software name="bouldashml" cloneof="bouldash">
+ <description>Boulder Dash (Microlab)</description>
<year>1984</year>
<publisher>Microlab</publisher>
-
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="boulder dash (1984)(microlab).do" size="143360" crc="bf75d6da" sha1="18700ac799dce7245e29d47beb9f6a3e295b700b" />
@@ -2538,11 +2814,17 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="bldrdscr">
- <description>Boulder Dash (cracked)</description>
+ <software name="bouldash">
+ <description>Boulder Dash (Microlab) (Association of Broadcasting Crackers crack)</description>
<year>1984</year>
<publisher>Microlab</publisher>
-
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="boulder dash (1984)(microlab)[cr association of broadcasting crackers].dsk" size="143360" crc="b5220abf" sha1="34d1a539cfb9b3b1811928f3eaccdf86071a727b" />
@@ -2550,11 +2832,17 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="bldrdsh2">
- <description>Boulder Dash II</description>
+ <software name="bouldash2">
+ <description>Boulder Dash II (Micro Fun) (The Yegg-men crack)</description>
<year>19??</year>
<publisher>Micro Fun</publisher>
-
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 64K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="boulder dash ii (19xx)(micro fun).do" size="143360" crc="69525d68" sha1="a8f324474f28baaef71a9d51411bad749a34e214" />
@@ -2562,11 +2850,20 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="blkcldcr">
- <description>The Black Cauldron (cracked)</description>
+ <software name="blkcauld">
+ <description>The Black Cauldron (digital gang crack)</description>
<year>1985</year>
- <publisher>Sierra On-Line / Walt Disney</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="black cauldron, the (1985)(sierra - walt disney)(disk 1 of 3 side a)[cr digital gang][b].dsk" size="143360" crc="51bc5da0" sha1="0089e4cdd2ab5c1a4463d78d680bf615c1f87f67" />
@@ -2594,11 +2891,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="blkmgca">
+ <software name="blkmagica" cloneof="blkmagic">
<description>Black Magic (alt)</description>
<year>1987</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Peter Ward" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="black magic (1987)(datasoft)[a].dsk" size="143360" crc="e0fa1b65" sha1="52155e91a4da055f23bf2197332964410e5d4995" />
@@ -2606,11 +2906,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="blkmgccr">
- <description>Black Magic (cracked)</description>
+ <software name="blkmagicmr" cloneof="blkmagic">
+ <description>Black Magic (mindreader crack)</description>
<year>1987</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Peter Ward" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="black magic (1987)(datasoft)[cr mindreader].dsk" size="143360" crc="56ee8dfb" sha1="824a820a965717046a29cc4f7e04100ed262608e" />
@@ -2618,11 +2921,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="blkmgc">
+ <software name="blkmagic">
<description>Black Magic</description>
<year>1987</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Peter Ward" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="black magic (1987)(datasoft).dsk" size="143360" crc="b4f3d2ef" sha1="40bc76ee03c9fdfa5b7cba6ae10bd30eb12279bf" />
@@ -2690,11 +2996,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="bolocr">
- <description>Bolo (cracked)</description>
+ <software name="bolocr" cloneof="bolo">
+ <description>Bolo (Trystan II Crack)</description>
<year>1982</year>
<publisher>Synergistic Software</publisher>
-
+ <info name="developer" value="Elvyn Software" />
+ <info name="programmer" value="Jim Lane" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="bolo (1982)(synergistic software)[cr trystan ii][no boot].do" size="143360" crc="249e618d" sha1="22d0c9ad90fd6feb1267ad0de66ecd8227d38188" />
@@ -2706,7 +3016,11 @@ Generated by SLIST 0.2.1
<description>Bolo</description>
<year>1982</year>
<publisher>Synergistic Software</publisher>
-
+ <info name="developer" value="Elvyn Software" />
+ <info name="programmer" value="Jim Lane" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="bolo (1982)(synergistic software).do" size="143360" crc="f0b0f657" sha1="0e64f70f20c715a8364457c22b987fefffd3052d" />
@@ -2820,11 +3134,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="brclecra">
- <description>Bruce Lee (crack, alt)</description>
+ <software name="bruceleea" cloneof="brucelee">
+ <description>Bruce Lee (Black Bag crack, alt)</description>
<year>1984</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Rick Mirsky" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="bruce lee (1984)(datasoft)[cr black bag][a].dsk" size="143360" crc="8a5c4230" sha1="745c269e7d1592f30ab779cb07ce252787596a0b" />
@@ -2832,11 +3149,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="brclecr">
- <description>Bruce Lee (cracked)</description>
+ <software name="brucelee">
+ <description>Bruce Lee (Black Bag crack)</description>
<year>1984</year>
<publisher>Datasoft</publisher>
-
+ <info name="programmer" value="Rick Mirsky" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
<rom name="bruce lee (1984)(datasoft)[cr black bag].po" size="143360" crc="798a94f5" sha1="3fb8782f4fe96a5ad51395600ebd363918a7c784" />
@@ -2907,7 +3227,8 @@ Generated by SLIST 0.2.1
<software name="breakout">
<description>Breakout</description>
<year>19??</year>
- <publisher>Apple Computer, Inc.</publisher> <!-- programmed by Steve Wozniak -->
+ <publisher>Apple Computer, Inc.</publisher>
+ <!-- programmed by Steve Wozniak -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop1" size="143360">
@@ -3324,11 +3645,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="canbbltz">
+ <software name="canbalbz">
<description>Cannon Ball Blitz</description>
- <year>19??</year>
+ <year>1982</year>
<publisher>On-Line Systems</publisher>
-
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cannon ball blitz (19xx)(on-line systems).do" size="143360" crc="5f87b338" sha1="79485a1ceefef5d7678d9ff669c99dd8ae2d2990" />
@@ -3353,34 +3677,48 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="captgngt">
- <description>Captain Goodnight (cracked)</description>
+ <software name="captgngthr" cloneof="captgngt">
+ <description>Captain Goodnight and the Islands of Fear (Hot Rod crack)</description>
<year>1985</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Mike Wise" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="captain goodnight (1985)(broderbund)(side a)[cr black bag].dsk" size="143360" crc="63d78c79" sha1="4818cb94c7f5808d6f7e5942a481d35e3dc6b312" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="captain goodnight (1985)(broderbund)(side b)[cr black bag].dsk" size="143360" crc="0402ce3b" sha1="daa984cdae12ae536b07f7bcd0e484487d658d0a" />
</dataarea>
</part>
</software>
- <software name="captgnt">
- <description>Captain Goodnight</description>
+ <software name="captgngt">
+ <description>Captain Goodnight and the Islands of Fear (Gremlins crack)</description>
<year>1985</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Mike Wise" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="captain goodnight (1985)(broderbund)(side a).po" size="143360" crc="f42a0250" sha1="2ad7eb0608d7f69cff5a90aea44aa13e1c3dcae7" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="captain goodnight (1985)(broderbund)(side b)[unk filesys].po" size="143360" crc="01c28820" sha1="02b05b8489d3847ab27dc83746acc384117ba26e" />
</dataarea>
@@ -3516,7 +3854,7 @@ Generated by SLIST 0.2.1
</software>
<software name="cazureb">
- <description>Curse of the Azure Bonds</description>
+ <description>Advanced Dungeons &amp; Dragons - Curse of the Azure Bonds</description>
<year>1989</year>
<publisher>Strategic Simulations, Inc.</publisher>
@@ -3698,8 +4036,11 @@ Generated by SLIST 0.2.1
<software name="chmpgolf">
<description>Championship Golf</description>
<year>1982</year>
- <publisher>Hayden Software</publisher>
-
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Blair Hadfield" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="championship golf (1982)(hayden software).do" size="143360" crc="2e068919" sha1="0bf10a6eb2c15be12fa00517151d928fd2cd608e" />
@@ -3708,7 +4049,7 @@ Generated by SLIST 0.2.1
</software>
<software name="chmpkryn">
- <description>Champions of Krynn</description>
+ <description>Advanced Dungeons &amp; Dragons - Champions of Krynn</description>
<year>1990</year>
<publisher>Strategic Simulations, Inc.</publisher>
@@ -3752,8 +4093,11 @@ Generated by SLIST 0.2.1
<software name="choplftr">
<description>Choplifter</description>
<year>1982</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Dan Gorlin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="choplifter (1982)(broderbund).po" size="143360" crc="6591280e" sha1="4afc054408bbd082e64f7341e12cc968241de918" />
@@ -3773,17 +4117,22 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="chyeager">
+ <software name="cyeagaft">
<description>Chuck Yeager's Advanced Flight Trainer</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="chuck yeager's advanced flight trainer (1987)(electronic arts)(side a)[cr blade].do" size="143360" crc="0f5403db" sha1="794ea8f1443da711bdda766c328632e0ebba3f96" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="chuck yeager's advanced flight trainer (1987)(electronic arts)(side b)[cr blade].do" size="143360" crc="5f1f135b" sha1="2a47551b225845c0f2a184fd639fd233b36ce9ca" />
</dataarea>
@@ -3843,17 +4192,23 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="cluemstd">
- <description>Clue Master Detective</description>
+ <software name="cluemd">
+ <description>Clue Master Detective (version 1.5) (The Blade crack)</description>
<year>1989</year>
<publisher>Virgin Mastertronic International</publisher>
-
+ <info name="developer" value="Casablanca Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="clue master detective v1.5 (1989)(virgin mastertronic international)(side a)[cr blade][b].po" size="143360" crc="d4f327c6" sha1="371052c37a2c5efc783f08bd2d7139023bfe6ee9" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="clue master detective v1.5 (1989)(virgin mastertronic international)(side b)[cr blade][b].po" size="143360" crc="40c45b99" sha1="e5f16a570d51630e7254558ac69fb615404c59db" />
</dataarea>
@@ -3981,36 +4336,45 @@ Generated by SLIST 0.2.1
</software>
<software name="cntralnc">
- <description>The Centauri Alliance</description>
- <year>198?</year>
- <publisher>Broderbund</publisher>
-
+ <description>Centauri Alliance</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
<dataarea name="flop" size="143360">
<rom name="centauri alliance, the (198x)(broderbund)(disk 1 of 6).dsk" size="143360" crc="8ba4e046" sha1="6c58dafa626134a66f78bf55207223a5e604cfcf" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Roster" />
<dataarea name="flop" size="143360">
<rom name="centauri alliance, the (198x)(broderbund)(disk 2 of 6)(rooster).dsk" size="143360" crc="6c81be1d" sha1="37762e8179b4e4096d39285632e6b325fc55f2e8" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Scenario 1" />
<dataarea name="flop" size="143360">
<rom name="centauri alliance, the (198x)(broderbund)(disk 3 of 6)(scenario 1).dsk" size="143360" crc="4d026cd8" sha1="c9f610fd2a6d08a4ee5bf3fa46f260ed56984121" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Scenario 2" />
<dataarea name="flop" size="143360">
<rom name="centauri alliance, the (198x)(broderbund)(disk 4 of 6)(scenario 2).dsk" size="143360" crc="0d976331" sha1="b6830cb95028bce75ca509964eb701ff5b96f7c2" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Scenario 3" />
<dataarea name="flop" size="143360">
<rom name="centauri alliance, the (198x)(broderbund)(disk 5 of 6)(scenario 3).dsk" size="143360" crc="5ed890de" sha1="518301730baaef9fa2cbde4cecf73bd3c35b6353" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Scenario 4" />
<dataarea name="flop" size="143360">
<rom name="centauri alliance, the (198x)(broderbund)(disk 6 of 6)(scenario 4).dsk" size="143360" crc="e142d487" sha1="8c6a6c8f8f78ce2d271f5cb1e51070d393c3f725" />
</dataarea>
@@ -4142,34 +4506,46 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="crctcnda">
- <description>Cross Country Canada</description>
+ <software name="crscanad">
+ <description>Crosscountry Canada (1986)</description>
<year>1986</year>
<publisher>Didatech</publisher>
-
+ <info name="programmer" value="Dave Vincent" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="crosscountry canada (1986)(didatech)(side a).do" size="143360" crc="92c2e8eb" sha1="d820c11e28d59ae2db59d032e1af614b16f79949" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="crosscountry canada (1986)(didatech)(side b).do" size="143360" crc="f74bddb2" sha1="27682988d87ebc0e4c1cef716f8e989e054c6eda" />
</dataarea>
</part>
</software>
- <software name="crctusa">
- <description>Cross Country USA</description>
+ <software name="crsusa85">
+ <description>Crosscountry USA (1985)</description>
<year>1985</year>
- <publisher>Didatech</publisher>
-
+ <publisher>Didatech Software</publisher>
+ <info name="programmer" value="Dave Vincent" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="crosscountry usa (1985)(didatech)(side a).do" size="143360" crc="dd5a7458" sha1="26e16489660d40da34aae4f632a300eb79a0be83" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="crosscountry usa (1985)(didatech)(side b).do" size="143360" crc="40f2339f" sha1="7c2a94386edb92eb4d23a8d848a34dff28e31be9" />
</dataarea>
@@ -4222,11 +4598,16 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="crimstpr">
+ <software name="crmstopr">
<description>Crime Stopper</description>
<year>1982</year>
- <publisher>Imaginative Systems</publisher>
-
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="author" value="Barry Marx" />
+ <info name="programmer" value="Dan Kitchen" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crime stopper (1982)(imaginative systems).do" size="143360" crc="04e92190" sha1="7565ec0e395cfc6bd837dfa120109184c5710819" />
@@ -4292,11 +4673,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="crnstmnr">
- <description>Cranston Manor</description>
+ <software name="hra3cman">
+ <description>Hi-Res Adventure #3: Cranston Manor</description>
<year>1981</year>
<publisher>On-Line Systems</publisher>
-
+ <info name="programmer" value="Harold DeWitz" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cranston manor (1981)(on-line systems)[cr black bag].dsk" size="143360" crc="ea3a97eb" sha1="c2d7fde96d296840398a99274a0c29744e02fd8a" />
@@ -4320,7 +4705,10 @@ Generated by SLIST 0.2.1
<description>Crossfire</description>
<year>1981</year>
<publisher>On-Line Systems</publisher>
-
+ <info name="programmer" value="Jay Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crossfire (1981)(on-line systems).do" size="143360" crc="cbce4919" sha1="44dba8451a25f419f00f3faace720d1228c9f5da" />
@@ -4403,11 +4791,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="crtrvntr">
- <description>Creature Venture</description>
+ <software name="crventurh">
+ <description>Creature Venture (Highlands Computer Services)</description>
<year>1981</year>
<publisher>HIghland Computer Services</publisher>
-
+ <info name="developer" value="Highlands Computer Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="creature venture (1981)(highland computer services).do" size="143360" crc="80e3e2a2" sha1="3967cd7bb92ef863ece378fce8aa4b1774a0a1ed" />
@@ -4415,11 +4806,17 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="crush">
- <description>Crush - Crumble and Chomp!</description>
+ <software name="ccchomp">
+ <description>Crush, Crumble and Chomp!: The Movie Monster Game (version 1981-JUN-22) (The Pirate crack)</description>
<year>1981</year>
<publisher>Epyx</publisher>
-
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Jim Connelley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1981-JUN-22" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crush - crumble and chomp (1981)(epyx)[cr pirate].do" size="143360" crc="fb7ca851" sha1="25ee55b1d29e4dcc717e10d4a0ed011106dee9de" />
@@ -4427,11 +4824,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="cryptmda">
+ <software name="cryptmed">
<description>Crypt of Medea</description>
<year>1983</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Allan Lamb" />
+ <info name="programmer" value="Arthur Britto II" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="crypt of medea (1983)(sir tech).dsk" size="143360" crc="f51191fe" sha1="43e6e8b2b1a5335672e893e3613fe8dc88d053ec" />
@@ -4504,11 +4905,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="cursecmn">
- <description>The Curse of Crowley Manor</description>
- <year>1980</year>
+ <software name="ov2curcm">
+ <description>Other-Venture #2: The Curse of Crowley Manor (Those Sweet Loveable Guys crack)</description>
+ <year>1981</year>
<publisher>Adventure International</publisher>
-
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="curse of crowley manor, the (1980)(adventure international).do" size="143360" crc="a222263a" sha1="b3fea723946fa504b8a0609e4ac55925aee6e6d4" />
@@ -4517,10 +4922,13 @@ Generated by SLIST 0.2.1
</software>
<software name="cvrncsto">
- <description>Caverns of Callisto</description>
- <year>19??</year>
- <publisher>Chuckles</publisher>
-
+ <description>Caverns of Callisto (CCB crack)</description>
+ <year>1983</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="caverns of callisto (19xx)(chuckles).dsk" size="143360" crc="8a79f37a" sha1="330cc84d9e7cd1e0a7be73bc988f2976681ffff4" />
@@ -4558,10 +4966,14 @@ Generated by SLIST 0.2.1
</software>
<software name="cyborg">
- <description>Cyborg</description>
+ <description>Cyborg (version 2) (Sentient Software) (The Whip crack)</description>
<year>1981</year>
<publisher>Sentient Software</publisher>
-
+ <info name="programmer" value="Michael Berlyn" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="cyborg (1981)(sentient software).do" size="143360" crc="48ad4804" sha1="0cf0edb7ee032e46eb07258349c68ca85d0246cd" />
@@ -4593,7 +5005,7 @@ Generated by SLIST 0.2.1
</part>
</software>
-<!-- start 'canon' attempt 1 -->
+ <!-- start 'canon' attempt 1 -->
<software name="amfv">
<description>A Mind Forever Voyaging</description>
@@ -4627,8 +5039,11 @@ Generated by SLIST 0.2.1
<software name="aplpanic">
<description>Apple Panic</description>
<year>1981</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ben Serki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="applepanic.dsk" size="143360" crc="6a058da7" sha1="fe7d22bf2f2f0d1e327f5a66dd0748a89d94827c" />
@@ -4649,10 +5064,15 @@ Generated by SLIST 0.2.1
</software>
<software name="arctfox">
- <description>Arctic Fox</description>
+ <description>Arcticfox</description>
<year>1986</year>
- <publisher>Dynamix / Electronic Arts</publisher>
-
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Dynamix Software Development" />
+ <info name="programmer" value="Paul Bowman" />
+ <info name="programmer" value="Damon Slye" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="arcticfox.dsk" size="143360" crc="e5f79046" sha1="c863c4293b63afc49a20b8aaf91cf2068bfaad04" />
@@ -4744,8 +5164,11 @@ Generated by SLIST 0.2.1
<software name="bopnwrst">
<description>Bop'n Wrestle</description>
<year>1986</year>
- <publisher>Mindscape/Beam Software</publisher>
-
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Beam Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="bopnwrestle.dsk" size="143360" crc="7a94bafa" sha1="734c87856ffc9bf4402e6905e16feedddd99daa3" />
@@ -4795,14 +5218,21 @@ Generated by SLIST 0.2.1
<software name="carmneur">
<description>Where in Europe is Carmen Sandiego?</description>
<year>1988</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="where.europe.s1.dsk" size="143360" crc="ea20201a" sha1="51520eb0ad96a9c6c5c06e989e299006e006c0f6" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="where.europe.s2.dsk" size="143360" crc="c57fe76c" sha1="4ddd70cc7a90a823131747ffc95e95be629606de" />
</dataarea>
@@ -4810,10 +5240,15 @@ Generated by SLIST 0.2.1
</software>
<software name="carmnusa">
- <description>Where in the USA is Carmen Sandiego?</description>
+ <description>Where in the USA is Carmen Sandiego? (The Evil Sock &amp; Optimus Prime crack)</description>
<year>1986</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="carmenusa1.dsk" size="143360" crc="f758f0b8" sha1="2e456414965b09d743551b1b560fdbc53ac73aee" />
@@ -4826,17 +5261,25 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="carmnwld">
- <description>Where in the World is Carmen Sandiego?</description>
+ <software name="carmnwrld">
+ <description>Where in the World is Carmen Sandiego? (version 1985)</description>
<year>1985</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Dane Bigham" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="usage" value="Requires a 64K Apple ][ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="carmenworld1.dsk" size="143360" crc="014eaa0c" sha1="b769f84df0191636fd5157138c7331da00f0fbe9" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="carmenworld2.dsk" size="143360" crc="ae851d24" sha1="2ea4f63b2d50bbdcbc0bde143b8f1709d575131f" />
</dataarea>
@@ -4844,16 +5287,25 @@ Generated by SLIST 0.2.1
</software>
<software name="confviet">
- <description>Conflict in Vietnam</description>
+ <description>Conflict in Vietnam (version 331.00) (Kristo crack)</description>
<year>1986</year>
- <publisher>MIcroProse</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
+ <info name="version" value="331.00" />
+ <!-- Option to use double hi-res graphics on 128K machines. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="convieta.dsk" size="143360" crc="e7a84f2a" sha1="3d4878fa47c92bcda21a2be4db1dd4ee80413124" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="convietb.dsk" size="143360" crc="52511198" sha1="3e5d46e7bf6616c2cb4252ca737ffaefa4ee0862" />
</dataarea>
@@ -4899,8 +5351,11 @@ Generated by SLIST 0.2.1
<software name="drol">
<description>Drol</description>
<year>1983</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Aik Beng" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="drol.dsk" size="143360" crc="93f56a4b" sha1="8aa6f089a7b631b646c38456ada8ec54a8e17351" />
@@ -4968,11 +5423,16 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="f15se">
- <description>F-15 Strike Eagle</description>
+ <software name="f15streag">
+ <description>F-15 Strike Eagle (The Cloak crack)</description>
<year>1985</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <!-- Missing address on title screen, though this could be due to crack. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143363">
<rom name="f15_strike_eagle.dsk" size="143363" crc="f61f40e3" sha1="00a0e1143312fdcbfcdc158aa08b6bf33745a95b" />
@@ -5019,8 +5479,11 @@ Generated by SLIST 0.2.1
<software name="gauntlet">
<description>Gauntlet</description>
<year>1986</year>
- <publisher>Mindscape / Atari Games</publisher>
-
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Atari Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- arcade game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="gauntlet_1.dsk" size="143360" crc="218e795b" sha1="218a98e04e9985c3590b880b78b82a07345009e9" />
@@ -5071,16 +5534,23 @@ Generated by SLIST 0.2.1
</software>
<software name="gijoe">
- <description>G.I. Joe</description>
+ <description>G.I. Joe (Five Star crack)</description>
<year>1985</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Jeff Johannigman" />
+ <info name="programmer" value="Ray Carpenter" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="gi_joe1.dsk" size="143360" crc="927b30a7" sha1="ea6471fcc5547640b265bf822f2dc62bec9ee1ea" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="gi_joe2.dsk" size="143360" crc="10af5953" sha1="76e0c59cb14d9d1ad4ae43cdf502c9d1704be89b" />
</dataarea>
@@ -5140,11 +5610,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="impmisn">
- <description>Impossible Mission</description>
- <year>1986</year>
+ <software name="impmiss">
+ <description>Impossible Mission (The Beta Pirate crack)</description>
+ <year>1984</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="impossible_mission.dsk" size="143360" crc="e3122f1a" sha1="0bbede390543e66319075811025d962e8f84dbcc" />
@@ -5152,17 +5625,22 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="indy">
- <description>Indiana Jones and the Temple of Doom</description>
+ <software name="ijtmepdm">
+ <description>Indiana Jones and the Temple of Doom (club 96 crack)</description>
<year>1989</year>
- <publisher>Tengen / US Gold</publisher>
-
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Atari Games" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- arcade game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="indiana_jones1.dsk" size="143360" crc="d343e39b" sha1="3fd66da7f1fec491b72b3256ff40c23fa1f890c3" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="indiana_jones2.dsk" size="143360" crc="fabbb1bd" sha1="aa137f59f1cf8dbc45d3c64507ffeec829c8227d" />
</dataarea>
@@ -5181,11 +5659,14 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="jawbrekr">
+ <software name="jawbrkr">
<description>Jawbreaker</description>
<year>1981</year>
<publisher>On-Line Systems</publisher>
-
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="jawbreaker.dsk" size="143360" crc="d93fbae7" sha1="7c4c3d6c2a7f4d4cd2de061ed0f5bcd1b85b470c" />
@@ -5262,27 +5743,35 @@ Generated by SLIST 0.2.1
</software>
<software name="karateka">
- <description>Karateka</description>
+ <description>Karateka (Brutal Deluxe crack)</description>
<year>1984</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jordan Mechner" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Side B of the original floppy disk had another copy of the game, but all the graphics were upside down." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="karateka_s1 (brutal deluxe crack).dsk" size="143360" crc="b425b04c" sha1="035acf098adb1c7d0834aa677e2a954ed6df1d62" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Upside down" />
<dataarea name="flop" size="143360">
<rom name="karateka_s2 (brutal deluxe crack).dsk" size="143360" crc="36fa9fee" sha1="8b13ca33db4e6f8744089dc0cb5db1b5dbbfd6cd" />
</dataarea>
</part>
</software>
- <software name="leepers">
+ <software name="lunleep">
<description>Lunar Leepers</description>
<year>1982</year>
<publisher>Sierra On-Line</publisher>
-
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 48K Apple II or II+. Due to conflicts created by the copy protection, it will not run on later models." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="lunar_leepers.dsk" size="143360" crc="0d3920c0" sha1="d7029ac1be42d32b5137b10e70aabf699a60578d" />
@@ -5322,8 +5811,11 @@ Generated by SLIST 0.2.1
<software name="loderunr">
<description>Lode Runner</description>
<year>1983</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Doug Smith" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="loderunner.dsk" size="143360" crc="2d163d9e" sha1="44cec83273b44403f08bbde1cdde97b8c830c72c" />
@@ -5343,17 +5835,23 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="madden">
+ <software name="maddenfb">
<description>John Madden Football</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Robin Antonick" />
+ <info name="programmer" value="Trip Hawkins" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="john madden football - front.dsk" size="143360" crc="f7e0c14b" sha1="9f229acfd9e0f5c9b339dbae62d3c66fb8f1f11e" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="john madden football - back.dsk" size="143360" crc="4a14e59c" sha1="96af98504130d2cdc7987114af4c7def0117f396" />
</dataarea>
@@ -5372,11 +5870,16 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="midi8pl1">
- <description>MIDI/8 Plus</description>
+ <software name="midi8p10" cloneof="midi8p">
+ <description>MIDI/8 Plus (version 1.0)</description>
<year>1984</year>
<publisher>Passport Designs</publisher>
-
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- sound utility -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="midi8plus_v1_crack.dsk" size="143360" crc="4d2387d4" sha1="f1f64f19d67f5e862c80717f3fb6d9ac18bd7c7f" />
@@ -5384,11 +5887,16 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="midi8pl">
- <description>MIDI/8 Plus (v1.2)</description>
+ <software name="midi8p">
+ <description>MIDI/8 Plus (version 1.2)</description>
<year>1984</year>
<publisher>Passport Designs</publisher>
-
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- sound utility -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="midi8plus_v12_crack.dsk" size="143360" crc="8810764d" sha1="b88edc3b01c967fd0f83b43024b75b36a311e3fb" />
@@ -5468,7 +5976,9 @@ Generated by SLIST 0.2.1
<description>Moon Patrol</description>
<year>1983</year>
<publisher>Atari</publisher>
-
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- arcade game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="moonpatrol.dsk" size="143360" crc="0b91114b" sha1="edd50462f044fa416d19bdc43f61ab7b881de067" />
@@ -5477,10 +5987,16 @@ Generated by SLIST 0.2.1
</software>
<software name="mstrtrks">
- <description>Master Tracks (v1.8)</description>
+ <description>Master Tracks (version 1.8)</description>
<year>1985</year>
<publisher>Passport Designs</publisher>
-
+ <info name="programmer" value="John Melcher" />
+ <info name="programmer" value="Phil Stone" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.8" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- audio program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="passportdesigns_mastertracks_v1.8.dsk" size="143360" crc="f6e0d0ce" sha1="473c2e0fe0c9f76f56466f8162e24f71042c4296" />
@@ -5488,11 +6004,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="mysthous">
- <description>Mystery House</description>
+ <software name="hra1mysh">
+ <description>Hi-Res Adventure #1: Mystery House</description>
<year>1980</year>
<publisher>On-Line Systems</publisher>
-
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="hi-res adventure 1 - mystery house (1980)(on-line systems)(pd).do" size="143360" crc="4b0017cc" sha1="cb42a6981544210cb88477c7e502f305696fd0b3" />
@@ -5501,10 +6021,14 @@ Generated by SLIST 0.2.1
</software>
<software name="natocmdr">
- <description>NATO Commander</description>
+ <description>NATO Commander (Hot Rod crack)</description>
<year>1984</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="natocomm.dsk" size="143360" crc="b0cf0819" sha1="a5c25829e97bcb3a2b6cdf1e788304355f9486e5" />
@@ -5566,10 +6090,14 @@ Generated by SLIST 0.2.1
</software>
<software name="olympdec">
- <description>Olympic Decathalon</description>
+ <description>Olympic Decathlon</description>
<year>1981</year>
<publisher>Microsoft</publisher>
-
+ <info name="programmer" value="Timothy W. Smith" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <!-- A one-time backup utility (press '*' during the title animation) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="olympic.dsk" size="143360" crc="7881121e" sha1="f09a5bcd018893aa19e547752b9ed61a1c403d7f" />
@@ -5597,8 +6125,12 @@ Generated by SLIST 0.2.1
<software name="pinbcset">
<description>Pinball Construction Set</description>
<year>1983</year>
- <publisher>Electronic Arts / BudgeCo</publisher>
-
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="BudgeCo" />
+ <info name="programmer" value="Bill Budge" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- game development program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="pinballcset.dsk" size="143360" crc="e9a48021" sha1="3be3e6602348149efdf28c75c6527c3094f3a36a" />
@@ -5607,16 +6139,24 @@ Generated by SLIST 0.2.1
</software>
<software name="pirates">
- <description>Pirates!</description>
+ <description>Sid Meier's Pirates! (version 332.01)</description>
<year>1987</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Tony Dahbura" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="332.01" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="pirates1.dsk" size="143360" crc="bbf9fc21" sha1="3809b89686b67d1ce2409da27af290fb24a4aa14" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="pirates2.dsk" size="143360" crc="47afd03c" sha1="af199a2e2679ea1f72851f74f901b494069779cb" />
</dataarea>
@@ -5647,8 +6187,9 @@ Generated by SLIST 0.2.1
</part>
</software>
+ <!-- TODO: rename to poolrad as every other hash file -->
<software name="por">
- <description>Pool of Radiance</description>
+ <description>Advanced Dungeons &amp; Dragons: Pool of Radiance</description>
<year>1989</year>
<publisher>Strategic Simulations, Inc.</publisher>
@@ -5702,8 +6243,12 @@ Generated by SLIST 0.2.1
<software name="rescraid">
<description>Rescue Raiders</description>
<year>1984</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Arthur Britto II" />
+ <info name="programmer" value="Greg Hale" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143488">
<rom name="rescue_raiders.dsk" size="143488" crc="22ae00bd" sha1="5dc4ca0f5d330fda8e49572e78d3117a9c545ca1" />
@@ -5729,10 +6274,12 @@ Generated by SLIST 0.2.1
</software>
<software name="robotron">
- <description>Robotron: 2084</description>
+ <description>Robotron: 2084 (Atarisoft)</description>
<year>1983</year>
<publisher>Atari</publisher>
-
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- arcade game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="robotron.dsk" size="143360" crc="f5bdd4a4" sha1="713d8d302e613d344ab879d398391bc1d6a96bc9" />
@@ -5768,7 +6315,10 @@ Generated by SLIST 0.2.1
<description>Sammy Lightfoot</description>
<year>1983</year>
<publisher>Sierra On-Line</publisher>
-
+ <info name="programmer" value="Warren Schwader" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="sammy_lightfoot.dsk" size="143360" crc="3f1c275f" sha1="beb06befca445af4155c0bbf49aa754446e6ba73" />
@@ -5792,7 +6342,10 @@ Generated by SLIST 0.2.1
<description>Sea Dragon</description>
<year>1982</year>
<publisher>Adventure International</publisher>
-
+ <info name="programmer" value="John Anderson" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="seadragon.dsk" size="143360" crc="ec4ae9c0" sha1="e03aa8dcfa6ab44409ccb459b112c134a1b33cc9" />
@@ -5812,17 +6365,26 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="sevencts">
+ <software name="7ctygold">
<description>Seven Cities of Gold</description>
<year>1984</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Dan Bunten" />
+ <info name="programmer" value="Bill Bunten" />
+ <info name="programmer" value="Jim Rushing" />
+ <info name="programmer" value="Alan Watson" />
+ <info name="programmer" value="Mark Botner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
<rom name="sevencities1.dsk" size="143360" crc="8505c130" sha1="3e505f08e0a528d41a0f8d052da05574d514a13d" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="143360">
<rom name="sevencities2.dsk" size="143360" crc="5770b9e1" sha1="0ca92d8886d613720fc2fdfd40c98555d6d60fa9" />
</dataarea>
@@ -5861,11 +6423,16 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="silntsvc">
+ <software name="slntsvcer1">
<description>Silent Service</description>
<year>1985</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="silentservice.dsk" size="143360" crc="730cc866" sha1="fd9b9e2b2084307de560b282ceda087e712fcbb4" />
@@ -5912,8 +6479,12 @@ Generated by SLIST 0.2.1
<software name="soloflt">
<description>Solo Flight</description>
<year>1984</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Andy Hollis" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="soloflt.dsk" size="143360" crc="bd6691bc" sha1="6ca74fffa191784806d10cafa6fd8a16b22dbeea" />
@@ -5986,11 +6557,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="spyvsspy">
- <description>Spy Vs. Spy</description>
+ <software name="spyvsspy12">
+ <description>Spy Vs. Spy I &amp; II</description>
<year>1984</year>
<publisher>First Star Software</publisher>
-
+ <info name="developer" value="First Star Software" />
+ <info name="programmer" value="Michael Riedel" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="spyvsspy.dsk" size="143360" crc="41855b9b" sha1="994b300b4b08d9a5faa5fa02619eac86f5749401" />
@@ -5999,10 +6574,13 @@ Generated by SLIST 0.2.1
</software>
<software name="starblzr">
- <description>Star Blazer</description>
+ <description>Star Blazer (Star Craft) (Mr. Xerox crack)</description>
<year>1981</year>
<publisher>Star Craft</publisher>
-
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="star_blazer.do" size="143360" crc="b2a09a41" sha1="1084c4084325b0033c1b7c1cc22b7a426a470a29" />
@@ -6023,10 +6601,13 @@ Generated by SLIST 0.2.1
</software>
<software name="stargate">
- <description>Defender II: Stargate</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
-
+ <description>Stargate (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="alt_title" value="Defender II" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- arcade game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="stargate.dsk" size="143360" crc="041cefa0" sha1="984ec6ddbb80978fb1e6ece40e07c9270adafa47" />
@@ -6046,11 +6627,15 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="starwrrr">
- <description>Star Warrior</description>
+ <software name="sqstarwar">
+ <description>Starquest: Star Warrior</description>
<year>1981</year>
<publisher>Automated Simulations</publisher>
-
+ <info name="programmer" value="Jim Connelley" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="starwarrior.dsk" size="143360" crc="8e1be8d2" sha1="71f99bcf61ec0cc650b084e89f55770b80bf519f" />
@@ -6086,13 +6671,26 @@ Generated by SLIST 0.2.1
<description>Summer Games</description>
<year>1984</year>
<publisher>Epyx</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="programmer" value="Scott Nelson" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="Erin Murphy" />
+ <info name="programmer" value="Jon Leupp" />
+ <info name="programmer" value="Stephen Mudry" />
+ <info name="programmer" value="Randy Glover" />
+ <info name="programmer" value="Brian McGhie" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Kevin McClard" />
+ <info name="usage" value="Requires a 64K Apple II+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="summer1.dsk" size="143360" crc="d6f0d90b" sha1="7c62faabc932d73e8b4e815d969d22a0edfb21e7" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="summer2.dsk" size="143360" crc="7ec17e5e" sha1="3f5a20c5aa8397959ddcec3c5703ada478c7e979" />
</dataarea>
@@ -6167,8 +6765,12 @@ Generated by SLIST 0.2.1
<software name="talon">
<description>Talon</description>
<year>1983</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Eric Robinson" />
+ <info name="programmer" value="eric Parker" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="talon.dsk" size="143360" crc="af31ade9" sha1="58d83a70a32dc1059ceb3c75c287e393f86f59d1" />
@@ -6194,27 +6796,36 @@ Generated by SLIST 0.2.1
</software>
<software name="thexder">
- <description>Thexder</description>
+ <description>Thexder (The Blade crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
-
+ <info name="programmer" value="Daron Stinnett" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot"/>
<dataarea name="flop" size="143360">
<rom name="thexder - boot.dsk" size="143360" crc="ce56c692" sha1="4a8874ba084dc252e4e7f429e1df1ac51a631543" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Game"/>
<dataarea name="flop" size="143360">
<rom name="thexder - game.dsk" size="143360" crc="3e71a7a1" sha1="080c8280526931ed468a53955f56aaf5e2de9bdf" />
</dataarea>
</part>
</software>
- <software name="threshld">
+ <software name="thrshold">
<description>Threshold</description>
<year>1981</year>
<publisher>On-Line Systems</publisher>
-
+ <info name="programmer" value="Warren Schwader" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="threshold.dsk" size="143360" crc="1093aaed" sha1="e1e2ae3d750b17337b31b8e37a38f6ff56a81f3e" />
@@ -6225,34 +6836,43 @@ Generated by SLIST 0.2.1
<software name="toyshop">
<description>The Toy Shop</description>
<year>1986</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Louis Evans" />
+ <info name="usage" value="Requires an Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Master" />
<dataarea name="flop" size="143360">
<rom name="toy_shop_master_a.dsk" size="143360" crc="9eead8cd" sha1="a744606b2d4e49dc15f7555cb95edf0d6cb93745" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Master" />
<dataarea name="flop" size="143360">
<rom name="toy_shop_master_b.dsk" size="143360" crc="2e5f69f1" sha1="2bcbfc8b6c10327faa64a3ef4d57603a7d5f95ad" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Data 1" />
<dataarea name="flop" size="143360">
<rom name="toy_shop_data1_a.dsk" size="143360" crc="6692657e" sha1="540b3fd282eb4f49887626165860e4e68a37f0e5" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Data 1" />
<dataarea name="flop" size="143360">
<rom name="toy_shop_data1_b.dsk" size="143360" crc="1989215a" sha1="3b00992e46666d6a39d799fb8ba427e2b27413cc" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Data 2" />
<dataarea name="flop" size="143360">
<rom name="toy_shop_data2_a.dsk" size="143360" crc="3e19e432" sha1="b0656aa425dd2c99ac1b8baf932c5f2cdf560bf5" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Data 2" />
<dataarea name="flop" size="143360">
<rom name="toy_shop_data2_b.dsk" size="143360" crc="18ff41b4" sha1="b715dc919fb98716ee1d4fa323940148d8865605" />
</dataarea>
@@ -6277,10 +6897,12 @@ Generated by SLIST 0.2.1
</software>
<software name="trkfield">
- <description>Track and Field</description>
+ <description>Track and Field (Atarisoft)</description>
<year>1984</year>
<publisher>Atari</publisher>
-
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="143360">
<rom name="trackfield.dsk" size="143360" crc="0b35502d" sha1="3fccbe6f56ec7167f81a7db08d3f08ab08eaff93" />
@@ -6288,139 +6910,206 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="ultima1t">
- <description>Ultima I (Ultima Trilogy version)</description>
- <year>1986</year>
- <publisher>Origin Systems</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="utril1a.dsk" size="143360" crc="e0278782" sha1="cdd9a3403703bec345b4ad5301f26884ddb2d2f6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="143360">
- <rom name="utril1b.dsk" size="143360" crc="f61b02bc" sha1="5fd1cbb71a7430b7945500a7d133bf5c6c868356" />
- </dataarea>
- </part>
- </software>
-
- <software name="ultima1">
- <description>Ultima I</description>
+ <software name="ultima1cpc" cloneof="ultima1">
+ <description>Ultima I: The First Age of Darkness (California Pacific Computer Company)</description>
<year>1980</year>
- <publisher>California Pacific Computer</publisher>
-
+ <publisher>California Pacific Computer Company</publisher>
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot" />
<dataarea name="flop" size="143360">
<rom name="ultima_i_boot.dsk" size="143360" crc="ad7187d3" sha1="60e3ae410a9276e9ae61e34fd9f29f6d1fafc761" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player" />
<dataarea name="flop" size="143360">
<rom name="ultima_i_player.dsk" size="143360" crc="2f45f184" sha1="235ccb4c73a7438dd8a48212b583af6f4715445c" />
</dataarea>
</part>
</software>
- <software name="ultima2t">
- <description>Ultima II: Revenge of the Enchantress (Ultima Trilogy version)</description>
+ <software name="ultima1">
+ <description>Ultima I: The First Age of Darkness (Ultima Trilogy: Origin Systems)</description>
+ <!-- This is the Ultima Trilogy re-release version. -->
<year>1986</year>
<publisher>Origin Systems</publisher>
-
+ <info name="developer" value="Origin Systems" />
+ <info name="original_publisher" value="California Pacific Computer Company" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot" />
<dataarea name="flop" size="143360">
- <rom name="utril2a.dsk" size="143360" crc="5e0e35cf" sha1="7c2036a84afafcf5b9a620802432314ed0dbe400" />
+ <rom name="utril1a.dsk" size="143360" crc="e0278782" sha1="cdd9a3403703bec345b4ad5301f26884ddb2d2f6" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player" />
<dataarea name="flop" size="143360">
- <rom name="utril2b.dsk" size="143360" crc="0c598c85" sha1="63869be7c0bcc550a78832f8273f8b0be66eec65" />
+ <rom name="utril1b.dsk" size="143360" crc="f61b02bc" sha1="5fd1cbb71a7430b7945500a7d133bf5c6c868356" />
</dataarea>
</part>
</software>
- <software name="ultima2">
- <description>Ultima II: Revenge of the Enchantress</description>
+ <software name="ultima2on" cloneof="ultima2">
+ <description>Ultima II: Revenge of the Enchantress (On-Line Systems)</description>
<year>1982</year>
<publisher>On-Line Systems</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Keith Zabalaoui" />
+ <info name="programmer" value="Helen Walker" />
+ <info name="programmer" value="Owen Garriott" />
+ <info name="programmer" value="Howard Makler" />
+ <info name="programmer" value="Mary Taylor Rollo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program master disk" />
<dataarea name="flop" size="143360">
<rom name="u2prog.dsk" size="143360" crc="91f9f927" sha1="60de2103a229b1d6f07f1bb976d5506d037866d5" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player master disk" />
<dataarea name="flop" size="143360">
<rom name="u2master.dsk" size="143360" crc="684db5c6" sha1="adbb46eb002f5d30d6deac92946eb2a45eb67a1d" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player disk" />
<dataarea name="flop" size="143360">
<rom name="u2player.dsk" size="143360" crc="407903bc" sha1="2a1481b1cb2e10a307e591713db2517a1a9bca6a" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Galactic disk"/>
<dataarea name="flop" size="143360">
<rom name="u2galaxy.dsk" size="143360" crc="2b2bfc38" sha1="043ef92aa49ff42e6db2a88e7ed219485ae59623" />
</dataarea>
</part>
</software>
- <software name="ultima3t">
- <description>Exodus: Ultima III (Ultima Trilogy version)</description>
+ <software name="ultima2">
+ <description>Ultima II: Revenge of the Enchantress (Ultima Trilogy: Origin Systems)</description>
<year>1986</year>
<publisher>Origin Systems</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="original_publisher" value="On-Line Systems" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Keith Zabalaoui" />
+ <info name="programmer" value="Helen Walker" />
+ <info name="programmer" value="Owen Garriott" />
+ <info name="programmer" value="Howard Makler" />
+ <info name="programmer" value="Mary Taylor Rollo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program master disk" />
<dataarea name="flop" size="143360">
- <rom name="utril3a.dsk" size="143360" crc="2a943ff5" sha1="4863e0dd3ea627f1ccc786d996c81b7ce22ca786" />
+ <rom name="utril2a.dsk" size="143360" crc="5e0e35cf" sha1="7c2036a84afafcf5b9a620802432314ed0dbe400" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Player master disk" />
<dataarea name="flop" size="143360">
- <rom name="utril3b.dsk" size="143360" crc="07ef8e6a" sha1="55f272e8f828c9bf606a87afb3f91702b0c97b0f" />
+ <rom name="utril2b.dsk" size="143360" crc="0c598c85" sha1="63869be7c0bcc550a78832f8273f8b0be66eec65" />
</dataarea>
</part>
</software>
- <software name="ultima3">
- <description>Exodus: Ultima III</description>
+ <software name="ultima3o" cloneof="ultima3">
+ <description>Ultima III: Exodus</description>
<year>1983</year>
<publisher>Origin Systems</publisher>
-
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
<dataarea name="flop" size="143360">
<rom name="ultima31.dsk" size="143360" crc="bd4db87d" sha1="9040fe8caf415525eae5d71ae29bca581fb7ad94" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario" />
<dataarea name="flop" size="143360">
<rom name="ultima32.dsk" size="143360" crc="7c4f33ea" sha1="9f0efd1089716c0840d8e8befc7cbbe7ecec969d" />
</dataarea>
</part>
</software>
+ <software name="ultima3">
+ <description>Ultima III: Exodus (Ultima Trilogy)</description>
+ <year>1986</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="143360">
+ <rom name="utril3a.dsk" size="143360" crc="2a943ff5" sha1="4863e0dd3ea627f1ccc786d996c81b7ce22ca786" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario" />
+ <dataarea name="flop" size="143360">
+ <rom name="utril3b.dsk" size="143360" crc="07ef8e6a" sha1="55f272e8f828c9bf606a87afb3f91702b0c97b0f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ultima4">
<description>Ultima IV: Quest of the Avatar</description>
<year>1985</year>
<publisher>Origin Systems</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="programmer" value="Patrica Hunter" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="programmer" value="Roe Adams" />
+ <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program Disk" />
<dataarea name="flop" size="143360">
<rom name="u4.pgm.dsk" size="143360" crc="52db3254" sha1="d999b7fb7551318937a5c93642359d5beb8b2695" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Towne Disk" />
<dataarea name="flop" size="143360">
- <rom name="u4.brit.dsk" size="143360" crc="3066af7c" sha1="68e4beb58d508d6fb71af7a998e31ded9173cc71" />
+ <rom name="u4.twn.dsk" size="143360" crc="8c4eb387" sha1="732b9f1f9ade9c055d2d85326310d01f2e0b79d7" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C - Britannia Disk" />
<dataarea name="flop" size="143360">
- <rom name="u4.twn.dsk" size="143360" crc="8c4eb387" sha1="732b9f1f9ade9c055d2d85326310d01f2e0b79d7" />
+ <rom name="u4.brit.dsk" size="143360" crc="3066af7c" sha1="68e4beb58d508d6fb71af7a998e31ded9173cc71" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D - Underworld Disk" />
<dataarea name="flop" size="143360">
<rom name="u4.undr.dsk" size="143360" crc="4b0f3f9f" sha1="3818785c303165ac2bc1f4bb9657b58aa4c9069a" />
</dataarea>
@@ -6431,70 +7120,97 @@ Generated by SLIST 0.2.1
<description>Ultima V: Warriors of Destiny</description>
<year>1988</year>
<publisher>Origin Systems</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Mark Hammer" />
+ <info name="programmer" value="Steve Meuse" />
+ <info name="programmer" value="John Miles" />
+ <info name="programmer" value="Toshi Morita" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
<dataarea name="flop" size="143360">
<rom name="u5boot.do" size="143360" crc="774d1dfd" sha1="611b9b2b6c7d0c105e52c19165cb6a2968848d28" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Dungeon"/>
<dataarea name="flop" size="143360">
- <rom name="u5brit.do" size="143360" crc="4dbdd647" sha1="ad6b021d3d1807b1edc718e260f6ceb584c7dccf" />
+ <rom name="u5dung.do" size="143360" crc="fa789a63" sha1="9e9035cbaea933867d2b7386f49a0341e822051a" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Britannia"/>
<dataarea name="flop" size="143360">
- <rom name="u5castle.do" size="143360" crc="491d7320" sha1="4034b0c3acfae1da69f8eae4558c487d14e8527d" />
+ <rom name="u5brit.do" size="143360" crc="4dbdd647" sha1="ad6b021d3d1807b1edc718e260f6ceb584c7dccf" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Underworld"/>
<dataarea name="flop" size="143360">
- <rom name="u5dung.do" size="143360" crc="fa789a63" sha1="9e9035cbaea933867d2b7386f49a0341e822051a" />
+ <rom name="u5under.do" size="143360" crc="962944e7" sha1="6879f9c8a0b28df906ea2ad940a2a6b377ccee33" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Towne"/>
<dataarea name="flop" size="143360">
- <rom name="u5dwell.do" size="143360" crc="ca95b255" sha1="df820793e4f1d7278e6fdf4d82c915ad18bff5ce" />
+ <rom name="u5town.do" size="143360" crc="0dc588f3" sha1="da970608a87236275e5e4b1ba455cf25fa4bbac5" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Dwelling"/>
<dataarea name="flop" size="143360">
- <rom name="u5keep.do" size="143360" crc="342d8744" sha1="5e092de01b2ccf4b8682763854a46594226c8b16" />
+ <rom name="u5dwell.do" size="143360" crc="ca95b255" sha1="df820793e4f1d7278e6fdf4d82c915ad18bff5ce" />
</dataarea>
</part>
<part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A - Castle"/>
<dataarea name="flop" size="143360">
- <rom name="u5town.do" size="143360" crc="0dc588f3" sha1="da970608a87236275e5e4b1ba455cf25fa4bbac5" />
+ <rom name="u5castle.do" size="143360" crc="491d7320" sha1="4034b0c3acfae1da69f8eae4558c487d14e8527d" />
</dataarea>
</part>
<part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B - Keep"/>
<dataarea name="flop" size="143360">
- <rom name="u5under.do" size="143360" crc="962944e7" sha1="6879f9c8a0b28df906ea2ad940a2a6b377ccee33" />
+ <rom name="u5keep.do" size="143360" crc="342d8744" sha1="5e092de01b2ccf4b8682763854a46594226c8b16" />
</dataarea>
</part>
</software>
<software name="wastelnd">
- <description>Wasteland</description>
+ <description>Wasteland (The Blade crack)</description>
<year>1988</year>
- <publisher>Electronic Arts / Interplay</publisher>
-
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Alan Pavlish" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="143360">
<rom name="wasteland - disk 1.dsk" size="143360" crc="0bdcbc20" sha1="c9deae52f50cefa1a2ad12b378dd6cd6c5ff7965" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="143360">
<rom name="wasteland - disk 2.dsk" size="143360" crc="07ef903c" sha1="106d1e63d8811413656ff8368c650cee67670e84" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3"/>
<dataarea name="flop" size="143360">
<rom name="wasteland - disk 3.dsk" size="143360" crc="93b3e734" sha1="f0055f7f39553bf5172b5093ad4b6161f1a93168" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4"/>
<dataarea name="flop" size="143360">
<rom name="wasteland - disk 4.dsk" size="143360" crc="bc221c14" sha1="29dec8bbbfc00ea16d188ed4734145f77e755376" />
</dataarea>
@@ -6554,140 +7270,189 @@ Generated by SLIST 0.2.1
</part>
</software>
- <software name="wizrdry1">
- <description>Wizardry: Proving Grounds of the Mad Overlord</description>
+ <software name="wizardry1">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (version 2.1 22-JAN-82)</description>
<year>1981</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="2.1 22-jan-82" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master Scenario" />
+ <feature name="write_protected" value="true" />
<dataarea name="flop" size="143360">
- <rom name="wizardry_i_boot.dsk" size="143360" crc="a08f3c35" sha1="06f1ed7820857e88f5270f91c755ff53e2fed5e4" />
+ <rom name="wizardry_i_scenario.dsk" size="143360" crc="472ae136" sha1="44a03784493d42e34f7931e925a625d434b24e40" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot" />
+ <feature name="write_protected" value="true" />
<dataarea name="flop" size="143360">
- <rom name="wizardry_i_scenario.dsk" size="143360" crc="472ae136" sha1="44a03784493d42e34f7931e925a625d434b24e40" />
+ <rom name="wizardry_i_boot.dsk" size="143360" crc="a08f3c35" sha1="06f1ed7820857e88f5270f91c755ff53e2fed5e4" />
</dataarea>
</part>
</software>
- <software name="wizrdry2">
- <description>Wizardry II: The Knight of Diamonds</description>
+ <software name="wizardry2">
+ <description>Wizardry II: The Knight of Diamonds (version PV3S2V1 10-MAR-82)</description>
<year>1982</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="PV3S2V1 10-MAR-82" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot disk" />
+ <feature name="write_protected" value="true" />
<dataarea name="flop" size="143360">
<rom name="wizardry_ii_1.dsk" size="143360" crc="a57dde8a" sha1="b921b3233aa98ef315a1aafe00117f8324c2aab1" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master scenario disk" />
+ <feature name="write_protected" value="true" />
<dataarea name="flop" size="143360">
<rom name="wizardry_ii_2.dsk" size="143360" crc="d69c4042" sha1="bf57d3552c0c032517252b298f3f6d2492120291" />
</dataarea>
</part>
</software>
- <software name="wizrdry3">
- <description>Wizardry III: Legacy of Llylgamyn</description>
+ <software name="wizardry3">
+ <description>Wizardry III: Legacy of Llylgamyn (version 4 04-MAY-1983)</description>
<year>1983</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="4 04-MAY-1983" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master Scenario disk" />
<dataarea name="flop" size="143360">
<rom name="wizardry_iii_1.dsk" size="143360" crc="ec450452" sha1="ce30d1ae61929be762dc4c94d3ecea65c4bb459d" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot disk" />
<dataarea name="flop" size="143360">
<rom name="wizardry_iii_2.dsk" size="143360" crc="f67ecb05" sha1="a2e2a1f2b0887412bfad7af52675b38c0db7a8a9" />
</dataarea>
</part>
</software>
- <software name="wizrdry4">
+ <software name="wizardry4">
<description>Wizardry IV: The Return of Werdna</description>
<year>1987</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="programmer" value="Roe R. Adams III" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="wiz4_d1.dsk" size="143360" crc="044dd9c7" sha1="3fde308dd34866f726f9827c50644d904b165cb0" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="wiz4_d2.dsk" size="143360" crc="26bd1552" sha1="3c7d8be09b40204b3148a1b0c79f9e8e83b921af" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C" />
<dataarea name="flop" size="143360">
<rom name="wiz4_d3.dsk" size="143360" crc="f20bbcfb" sha1="ec6dd9d3f89ff2ff456bb3706178769d6a314ca3" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D" />
<dataarea name="flop" size="143360">
<rom name="wiz4_d4.dsk" size="143360" crc="16b53876" sha1="12bad13f1a617e1ed34ab29564de517d1f8856ad" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Side E" />
<dataarea name="flop" size="143360">
<rom name="wiz4_d5.dsk" size="143360" crc="54caef0f" sha1="a10d2765df5d09d6de364a77702bfca67f42d285" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Side F" />
<dataarea name="flop" size="143360">
<rom name="wiz4_d6.dsk" size="143360" crc="e08d6f21" sha1="f9aa968f97609038da0f26629e6bd0bb21ed3475" />
</dataarea>
</part>
</software>
- <software name="wizrdry5">
+ <software name="wizardry5">
<description>Wizardry V: Heart of the Maelstrom</description>
<year>1988</year>
- <publisher>Sir-Tech</publisher>
-
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="David W. Bradley" />
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_a.dsk" size="143360" crc="069eebd1" sha1="77ea46b5d90abe11212a81c2abeef9b04259ebaf" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_b.dsk" size="143360" crc="529d68d8" sha1="826f26673b411125b05ddf85daf1a54d718a0a17" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_c.dsk" size="143360" crc="32027a88" sha1="14a256ffd7b027a44757e20931916b834d58f9bc" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_d.dsk" size="143360" crc="478aee0a" sha1="31fdd0494141b3f7b1a9663c183a8d34b17089b7" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk E" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_e_fixed.dsk" size="143360" crc="8918b805" sha1="1bc125000cb61083a9a93c122cb6d6a4f1ee5b06" />
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk F" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_f.dsk" size="143360" crc="579bf173" sha1="5c552b36f7a3e5addf9b41ed77bfade32f3b1295" />
</dataarea>
</part>
<part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk G" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_g.dsk" size="143360" crc="e86c6e68" sha1="4bca12c20bbf916730569d9cb65ee87d055c2134" />
</dataarea>
</part>
<part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk H" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_h.dsk" size="143360" crc="6917b0a2" sha1="b2129c3118762371f1c3eae1bde9642beb805519" />
</dataarea>
</part>
<part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk I" />
<dataarea name="flop" size="143360">
<rom name="wizardry_5_i.dsk" size="143360" crc="c9356454" sha1="75eabc030cf19ca2a43ba06cd0a7fbe1c8bc7929" />
</dataarea>
@@ -6698,28 +7463,58 @@ Generated by SLIST 0.2.1
<description>The Games: Winter Edition</description>
<year>1988</year>
<publisher>Epyx</publisher>
-
- <part name="flop1" interface="floppy_5_25">
+ <info name="programmer" value="Edward Chu" />
+ <info name="programmer" value="Kevin Furry" />
+ <info name="programmer" value="Eric Knopp" />
+ <info name="programmer" value="Carl Mey" />
+ <info name="programmer" value="Scott Nelson" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="programmer" value="Edwin W. Reich, Jr." />
+ <info name="programmer" value="Al Rubin" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Steve A. Baker" />
+ <info name="programmer" value="Brooke W. Boering" />
+ <info name="programmer" value="Walter Horat" />
+ <info name="programmer" value="James Watcher" />
+ <info name="programmer" value="Susan Greene" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Jenny Martin" />
+ <info name="programmer" value="Muffy McCosh" />
+ <info name="programmer" value="Matt Sarconi" />
+ <info name="programmer" value="Steve Snyder" />
+ <info name="programmer" value="Paul Vernon" />
+ <info name="programmer" value="Chris Ebert" />
+ <info name="programmer" value="Christopher Grigg" />
+ <info name="programmer" value="Bob Vieira" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 1"/>
<dataarea name="flop" size="143360">
<rom name="winter.d1s1.dsk" size="143360" crc="2b1d75b7" sha1="c4e4d02c50250d22a409e203660735f39cb45252" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 2"/>
<dataarea name="flop" size="143360">
<rom name="winter.d1s2.dsk" size="143360" crc="f72ddc0c" sha1="a97fd2c8e1b9532929a55b4ebc1c2e9f1ecd9f1a" />
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 1"/>
<dataarea name="flop" size="143360">
<rom name="winter.d2s1.dsk" size="143360" crc="32b27bba" sha1="22750b9173c76a55280f15852d4211639c8bf27d" />
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 2"/>
<dataarea name="flop" size="143360">
<rom name="winter.d2s2.dsk" size="143360" crc="54a39aa5" sha1="07821581a60126640d811306e7511581e1cce37e" />
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 1"/>
<dataarea name="flop" size="143360">
<rom name="winter.d3s1.dsk" size="143360" crc="886e2e2f" sha1="9d64368e6e4a83ca781dff2677b21b155b7b6573" />
</dataarea>
@@ -6729,14 +7524,19 @@ Generated by SLIST 0.2.1
<software name="wof">
<description>Wings of Fury</description>
<year>1987</year>
- <publisher>Broderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Steve Waldo" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
<dataarea name="flop" size="143360">
<rom name="wings_of_fury1.dsk" size="143360" crc="566b4571" sha1="da6c9872432279e790f32a35b6068aeead4b846a" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
<dataarea name="flop" size="143360">
<rom name="wings_of_fury2.dsk" size="143360" crc="03ef6d37" sha1="b06739b20cc1d838957a53dc1723516fe56499b4" />
</dataarea>
@@ -6833,7 +7633,7 @@ Generated by SLIST 0.2.1
</software>
<software name="stkoba40">
- <description>Star Trek: The Kobayashi Alternative (Version 4.0)</description>
+ <description>Star Trek: The Kobayashi Alternative (version 4.0)</description>
<year>1985</year>
<publisher>Paramount Pictures</publisher>
<!-- This was mailed out to customers who complained about bugs in the
@@ -6865,9 +7665,12 @@ Generated by SLIST 0.2.1
<description>Olin in Emerald</description>
<year>1984</year>
<publisher>Adventure International</publisher>
- <info name="release" value="2019-09-06"/>
- <!-- Disk has no protection. -->
-
+ <info name="author" value="Gordon Morrell" />
+ <info name="programmer" value="George Taylor" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-06 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A"/>
<dataarea name="flop" size="143360">
@@ -6885,7 +7688,7 @@ Generated by SLIST 0.2.1
<software name="bestmuse">
<description>Best of Muse (16 Sector + LC Patch)</description>
<year>1988</year>
- <publisher>Mindscape</publisher>
+ <publisher>The Best of Muse Software</publisher>
<info name="release" value="2019-11-21"/>
<!-- The original doesn't work on 64K Apples because of the way it
checks which BASIC ROMs are installed. It will work with either
@@ -6917,7 +7720,7 @@ Generated by SLIST 0.2.1
<info name="release" value="2022-07-22"/>
<!-- It requires a 48K Apple II+ or later. -->
<!-- The original .WOZ image is unprotected and 4am thus also provided a .DSK version with no data loss. -->
- <!--"Lauren of the 25th Century" is a 1985 educational game developed by Lucy Werth Ewell and Elizabeth R. Stott, Ph.D. of Rhiannon Software, and distributed by Addison-Wesley. It requires a 48K Apple ][+ or later.-->
+ <!-- "Lauren of the 25th Century" is a 1985 educational game developed by Lucy Werth Ewell and Elizabeth R. Stott, Ph.D. of Rhiannon Software, and distributed by Addison-Wesley. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A"/>
@@ -6927,4 +7730,63 @@ Generated by SLIST 0.2.1
</part>
</software>
+ <software name="videnh2">
+ <description>Enhancer ][ Utility Diskette</description>
+ <year>1982</year>
+ <publisher>Videx</publisher>
+ <info name="usage" value="Requires Keyboard Enhancer ]["/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="videxenhancerii.do" size="143360" crc="8b141996" sha1="b8c3fcc44a21c58ab7c4b30bf868487f55a6c16a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="banimsc85">
+ <description>The Animated Software Catalog 1985 (Baudville) (version D1551)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="D1551" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2017-08-27 -->
+ <!-- demo -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Software demo" />
+ <dataarea name="flop" size="143360">
+ <rom name="baudville_animated_software_catalog_1985_side_a.dsk" size="143360" crc="36dae874" sha1="8b3ac55fe1ed0ffcb17d07e0d25514bf25376ab4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Shape &amp; animation libraries demo" />
+ <dataarea name="flop" size="143360">
+ <rom name="baudville_animated_software_catalog_1985_side_b.dsk" size="143360" crc="5a594922" sha1="04d5b32f518b17de3974058f17d32365726342d2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pillvill">
+ <description>Pillage Village (One Eye crack)</description>
+ <year>1982</year>
+ <publisher>R &amp; S Software Marketing Services</publisher>
+ <info name="programmer" value="Richard A. Bliss" />
+ <info name="programmer" value="Stuart B. Marks" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 1998-06-27 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="143360">
+ <rom name="pillagevillage1.dsk" size="143360" crc="09f957f4" sha1="307bacbc0d80af852784db2e48200dff6db3c646" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="143360">
+ <rom name="pillagevillage2.dsk" size="143360" crc="31954342" sha1="8db0500d8d371b4609cdcdfc166138936ed56780" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/apple2_flop_orig.xml b/hash/apple2_flop_orig.xml
index c674c0e7e3d..dbcb9ddf4ce 100644
--- a/hash/apple2_flop_orig.xml
+++ b/hash/apple2_flop_orig.xml
@@ -6,51 +6,6 @@ license:CC0-1.0
<softwarelist name="apple2_flop_orig" description="Apple II original disks">
- <software name="agentusa">
- <description>Agent USA</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Runs on any Apple II model with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="80443">
- <rom name="agent usa.woz" size="80443" crc="c998fa8f" sha1="964336e9f3f6e778232ed6174864e12b337ffa67" />
- </dataarea>
- </part>
- </software>
-
- <software name="airheart">
- <description>Airheart</description>
- <year>1986</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240141">
- <rom name="airheart.woz" size="240141" crc="2685473f" sha1="a20a23a55639154bc2f6bab4cf27895187413b6b" />
- </dataarea>
- </part>
- </software>
-
- <software name="aplpanic">
- <description>Apple Panic</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="94985">
- <rom name="apple panic.woz" size="94985" crc="ff3e6db7" sha1="f6c7468a1e2f4cecbf69cfd2869d19af6d8825e1" />
- </dataarea>
- </part>
- </software>
-
<software name="alambush">
<description>Alien Ambush</description>
<year>1981</year>
@@ -81,81 +36,6 @@ license:CC0-1.0
</part>
</software>
- <software name="aplcdspd">
- <description>Apple Cider Spider</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-01 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233532">
- <rom name="apple cider spider.woz" size="233532" crc="ce310438" sha1="e54afce309fb62eeca8cc0dea0efbf10777249dd" />
- </dataarea>
- </part>
- </software>
-
- <software name="agalxian">
- <description>Apple Galaxian</description>
- <year>1980</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="106991">
- <rom name="apple galaxian.woz" size="106991" crc="298683ba" sha1="47a7e2459803a80d60744c295fa44ac69c815a9c" />
- </dataarea>
- </part>
- </software>
-
- <software name="aquatron">
- <description>Aquatron</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-07-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="246792">
- <rom name="aquatron.woz" size="246792" crc="050a69ff" sha1="9bb84494a65b673d3444edd044206f9a1a148a4a" />
- </dataarea>
- </part>
- </software>
-
- <software name="archon">
- <description>Archon: The Light and The Dark</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires an 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="226901">
- <rom name="archon.woz" size="226901" crc="259acee7" sha1="96f118b0b49cba85fb79ee1d36c1bfe88f69d9fe" />
- </dataarea>
- </part>
- </software>
-
- <software name="archon2">
- <description>Archon II: Adept</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233486">
- <rom name="archon ii - adept.woz" size="233486" crc="65a07c33" sha1="d8d959347c7862eef02fe8311a9a453cd9c526fe" />
- </dataarea>
- </part>
- </software>
-
<software name="ardyardv">
<description>Ardy the Aardvark</description>
<year>1983</year>
@@ -186,21 +66,6 @@ license:CC0-1.0
</part>
</software>
- <software name="axisassn">
- <description>Axis Assassin</description>
- <year>1982</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="226823">
- <rom name="axis assassin.woz" size="226823" crc="332a66bc" sha1="c940a0f83dcb27039cfa7bd08e7fa11163cadbed" />
- </dataarea>
- </part>
- </software>
-
<software name="aztec">
<description>Aztec</description>
<year>1982</year>
@@ -238,21 +103,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ballblaz">
- <description>Ballblazer</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240138">
- <rom name="ballblazer.woz" size="240138" crc="ce1f6dbf" sha1="02b24b12a45cd437dd53be25f73c51da99e8be98" />
- </dataarea>
- </part>
- </software>
-
<software name="batman">
<description>Batman: The Caped Crusader</description>
<year>1985</year>
@@ -275,58 +125,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bcqft">
- <description>BC's Quest for Tires</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="253454">
- <rom name="bc's quest for tires.woz" size="253454" crc="ce25b417" sha1="2a85e860f86748b14a913c3cb7a94762fa1d5de4" />
- </dataarea>
- </part>
- </software>
-
- <software name="bellhop">
- <description>Bellhop</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-07-31 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240180">
- <rom name="bellhop.woz" size="240180" crc="14f96de9" sha1="8b864bdfeb11f029295bd1b7e7337cc857510bc7" />
- </dataarea>
- </part>
- </software>
-
- <software name="belwrt">
- <description>Below the Root</description>
- <year>1984</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-07-31 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233490">
- <rom name="below the root side a.woz" size="233490" crc="9129bb1c" sha1="a51a653e2886a00f636a7bc3a192745dcb06327b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233515">
- <rom name="below the root side b.woz" size="233515" crc="f3f181f8" sha1="2451c2c2f441c9b17ea82619e57e22e865c926d1" />
- </dataarea>
- </part>
- </software>
-
<software name="bilestod">
<description>The Bilestoad</description>
<year>1983</year>
@@ -342,21 +140,6 @@ license:CC0-1.0
</part>
</software>
- <software name="brucelee">
- <description>Bruce Lee</description>
- <year>1984</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="208112">
- <rom name="bruce lee.woz" size="208112" crc="fbdc4cd0" sha1="7729ee00d0ec840f1506252202236440e7dc7b41" />
- </dataarea>
- </part>
- </software>
-
<software name="boa">
<description>Boa</description>
<year>1983</year>
@@ -387,36 +170,6 @@ license:CC0-1.0
</part>
</software>
- <software name="canbalbz">
- <description>Cannonball Blitz</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233483">
- <rom name="cannonball blitz.woz" size="233483" crc="e2d1793b" sha1="fd216f318ee12ce05f4c47ba3f7555b8ebf83c2f" />
- </dataarea>
- </part>
- </software>
-
- <software name="cvrncsto">
- <description>Caverns of Callisto</description>
- <year>1983</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="220149">
- <rom name="caverns of callisto.woz" size="220149" crc="a2849124" sha1="6c91fb79711d99c7c5415f84de50b11282420d3c" />
- </dataarea>
- </part>
- </software>
-
<software name="ceilzero">
<description>Ceiling Zero</description>
<year>1981</year>
@@ -432,21 +185,6 @@ license:CC0-1.0
</part>
</software>
- <software name="centiped">
- <description>Centipede</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233448">
- <rom name="centipede.woz" size="233448" crc="df23de50" sha1="e38c229a930866842b5581b89ad15cc620333342" />
- </dataarea>
- </part>
- </software>
-
<software name="commando">
<description>Commando</description>
<year>1987</year>
@@ -559,41 +297,11 @@ license:CC0-1.0
</part>
</software>
- <software name="crismntn">
- <description>Crisis Mountain</description>
- <year>1982</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233483">
- <rom name="crisis mountain.woz" size="233483" crc="8ba3e03e" sha1="da43ab36ab26a7672df5132ca02fecbf0ae0f1c2" />
- </dataarea>
- </part>
- </software>
-
- <software name="crosfire">
- <description>Crossfire</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233477">
- <rom name="crossfire.woz" size="233477" crc="410930b0" sha1="db4ad9256846ac08e432c2dbb36671fb4b55a143" />
- </dataarea>
- </part>
- </software>
-
<software name="cubit">
<description>Cubit</description>
<year>1983</year>
<publisher>Micromax</publisher>
- <info name="usage" value="Requires a 48K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 48K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-08-22 -->
@@ -608,7 +316,7 @@ license:CC0-1.0
<description>Cyber Strike</description>
<year>1980</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Runs on any Apple II model with 48K." />
+ <info name="usage" value="Runs on any Apple ][ model with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-11-18 -->
@@ -623,7 +331,7 @@ license:CC0-1.0
<description>The Dam Busters</description>
<year>1985</year>
<publisher>Accolade</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-12-29 -->
@@ -634,111 +342,6 @@ license:CC0-1.0
</part>
</software>
- <software name="deathswd">
- <description>Death Sword</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233486">
- <rom name="death sword.woz" size="233486" crc="31c95650" sha1="b94418ae85f887f857dc683221e24ab8172eb191" />
- </dataarea>
- </part>
- </software>
-
- <software name="stargate">
- <description>Defender II: Stargate</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233447">
- <rom name="stargate.woz" size="233447" crc="379d894d" sha1="56d17415d622395bddbe7200adde32f4ad63b208" />
- </dataarea>
- </part>
- </software>
-
- <software name="destroyr">
- <description>Destroyer</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233484">
- <rom name="destroyer.woz" size="233484" crc="bb402221" sha1="40cba620460fde69dda879230128237ee68c830f" />
- </dataarea>
- </part>
- </software>
-
- <software name="dinoeggs">
- <description>Dino Eggs</description>
- <year>1983</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233477">
- <rom name="dino eggs.woz" size="233477" crc="70d8d65d" sha1="84cbacaa8d639087b9b510839f0b2fe5bb40abd4" />
- </dataarea>
- </part>
- </software>
-
- <software name="divebmbr">
- <description>Dive Bomber</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233475">
- <rom name="dive bomber.woz" size="233475" crc="f56ccceb" sha1="481f1cadcae87a599f116ce402a2113c22a654cc" />
- </dataarea>
- </part>
- </software>
-
- <software name="dkong">
- <description>Donkey Kong</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233450">
- <rom name="donkey kong.woz" size="233450" crc="77ea741f" sha1="8a3195bd8aa21f4890fae30c417295b6bf5662ea" />
- </dataarea>
- </part>
- </software>
-
- <software name="drol">
- <description>Drol</description>
- <year>1983</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-13 redumped 2019-09-13 to fix hang loading level 3. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234753">
- <rom name="drol.woz" size="234753" crc="90f71e85" sha1="0271bfb1d57f0757af8ab4b3a6f112a2a0c0e7da" />
- </dataarea>
- </part>
- </software>
-
<software name="dungbeet">
<description>Dung Beetles</description>
<year>1982</year>
@@ -754,21 +357,6 @@ license:CC0-1.0
</part>
</software>
- <software name="teidolon">
- <description>The Eidolon</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <!-- Dump released: 2018-12-05 -->
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233469">
- <rom name="the eidolon.woz" size="233469" crc="d63f1ca5" sha1="c072f163c24455949964b175b6e05354cc9d0f72" />
- </dataarea>
- </part>
- </software>
-
<software name="epoch">
<description>Epoch</description>
<year>1981</year>
@@ -784,26 +372,11 @@ license:CC0-1.0
</part>
</software>
- <software name="factory">
- <description>The Factory</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233543">
- <rom name="the factory.woz" size="233543" crc="f5d82f4e" sha1="d0ec1d511d5a0a217712a77a38c9feabad30ea34" />
- </dataarea>
- </part>
- </software>
-
<software name="fnight">
<description>Fight Night</description>
<year>1985</year>
<publisher>Accolade</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-09-04 -->
@@ -878,7 +451,7 @@ license:CC0-1.0
<description>Free Fall</description>
<year>1982</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Runs on any Apple II model with 48K." />
+ <info name="usage" value="Runs on any Apple ][ model with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-11-16 -->
@@ -889,22 +462,6 @@ license:CC0-1.0
</part>
</software>
- <software name="frogger">
- <description>Frogger</description>
- <year>1981</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-13 -->
- <!-- The first release refused to boot on anything but an original Apple II or II Plus (i.e. not //e or later). This is the updated release. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="260154">
- <rom name="frogger.woz" size="260154" crc="a6529172" sha1="583e0cccc428fec0ddfba2f781c1fa42804323f8" />
- </dataarea>
- </part>
- </software>
-
<software name="frogger2">
<description>Frogger II: Threedeep</description>
<year>1984</year>
@@ -935,62 +492,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gijoe">
- <description>G.I. Joe</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233527">
- <rom name="g. i. joe side a.woz" size="233527" crc="a7feb3c1" sha1="74ffc0d32ff1d294b91b7ffb24216b64a3eef6e8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233527">
- <rom name="g. i. joe side b.woz" size="233527" crc="7e547fa1" sha1="12f251af41708fa349c1d022c4007fac54dd610a" />
- </dataarea>
- </part>
- </software>
-
- <software name="tgsumed">
- <description>The Games - Summer Edition</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="233937">
- <rom name="the games - summer edition - disk 1, side a.woz" size="233937" crc="0dc7efa5" sha1="954e0259c9cd8f9318cc84a03038070fe5a1a8af" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="233937">
- <rom name="the games - summer edition - disk 1, side b.woz" size="233937" crc="a972a6ae" sha1="b6db0be1652fb79717cd6103051f3af685edf658" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="233937">
- <rom name="the games - summer edition - disk 2, side a.woz" size="233937" crc="8d53f85e" sha1="52c04578fb5bb2c2a65ce9f9fcc344fa46192e6a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="233937">
- <rom name="the games - summer edition - disk 2, side b.woz" size="233937" crc="ccc6e8bd" sha1="6bf9d6d245f7de1991ded76e5b0f4cbf212d192d" />
- </dataarea>
- </part>
- </software>
-
<software name="gato">
<description>GATO</description>
<year>1985</year>
@@ -1006,37 +507,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gendrift">
- <description>Genetic Drift</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2018-10-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="120320">
- <rom name="genetic drift.woz" size="120320" crc="4b3c4403" sha1="c03c14268f780dc10200913958c566c0d0745e4d" />
- </dataarea>
- </part>
- </software>
-
- <software name="gobbler">
- <description>Gobbler</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="programmer" value="Olaf Lubeck" />
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-25 -->
- <!--action game-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="253442">
- <rom name="gobbler.woz" size="253442" crc="f9a9a3ed" sha1="8cb6dfa9db96d1270ae0ace9a1dd9ac7438c7fbb" />
- </dataarea>
- </part>
- </software>
-
<software name="goonies">
<description>The Goonies</description>
<year>1985</year>
@@ -1052,51 +522,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gremlins">
- <description>Gremlins</description>
- <year>1984</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="113621">
- <rom name="gremlins.woz" size="113621" crc="c873f47a" sha1="5e71bf3e881e31a47162ef9bfafa9a1759cb5c2f" />
- </dataarea>
- </part>
- </software>
-
- <software name="gumball">
- <description>Gumball</description>
- <year>1983</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233497">
- <rom name="gumball.woz" size="233497" crc="f49249e5" sha1="a13b691bdba9ce006aabb46e799009d44a9591cc" />
- </dataarea>
- </part>
- </software>
-
- <software name="heist">
- <description>The Heist</description>
- <year>1983</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233483">
- <rom name="the heist.woz" size="233483" crc="c39a1905" sha1="a9895f8ab454bf3dfdf5ac979274681d3ea42056" />
- </dataarea>
- </part>
- </software>
-
<software name="hero">
<description>HERO - Helicopter Emergency Rescue Operation</description>
<year>1983</year>
@@ -1131,7 +556,7 @@ license:CC0-1.0
<description>Hardball</description>
<year>1985</year>
<publisher>Accolade</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-01-11 -->
@@ -1146,7 +571,7 @@ license:CC0-1.0
<description>Head On</description>
<year>1980</year>
<publisher>California Pacific Computers</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-08-09 -->
@@ -1157,21 +582,6 @@ license:CC0-1.0
</part>
</software>
- <software name="highrise">
- <description>High Rise</description>
- <year>1983</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="133632">
- <rom name="high rise.woz" size="133632" crc="20539152" sha1="5bfec6ed2ce708428dcf47baa693c1985d744a3d" />
- </dataarea>
- </part>
- </software>
-
<software name="ikari">
<description>Ikari Warriors</description>
<year>1983</year>
@@ -1216,28 +626,6 @@ license:CC0-1.0
</part>
</software>
- <software name="impmiss2">
- <description>Impossible Mission II</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233525">
- <rom name="impossible mission ii side a.woz" size="233525" crc="fb26d565" sha1="20303f1f17ce5975df6c5c32d98fb5afdfb18f36" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233525">
- <rom name="impossible mission ii side b.woz" size="233525" crc="0797da53" sha1="f9512f2f6cc7cc54081433bb97a21fceb159942f" />
- </dataarea>
- </part>
- </software>
-
<software name="igprix">
<description>International Gran Prix</description>
<year>1982</year>
@@ -1253,41 +641,11 @@ license:CC0-1.0
</part>
</software>
- <software name="jawbrekr">
- <description>Jawbreaker</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240117">
- <rom name="jawbreaker.woz" size="240117" crc="79cd1db7" sha1="3050b0a351516d63254010ea3ae8137d37f7dbed" />
- </dataarea>
- </part>
- </software>
-
- <software name="jawbrkr2">
- <description>Jawbreaker ][</description>
- <year>1982</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2018-09-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="459782">
- <rom name="jawbreaker ][.woz" size="459782" crc="564b9530" sha1="9e8ff4220a0203ace18fafe300b119558d6e3fdc" />
- </dataarea>
- </part>
- </software>
-
<software name="thejet">
<description>The Jet</description>
<year>1986</year>
<publisher>subLOGIC</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-10-24 -->
@@ -1298,51 +656,6 @@ license:CC0-1.0
</part>
</software>
- <software name="joust">
- <description>Joust</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233444">
- <rom name="joust.woz" size="233444" crc="4111f092" sha1="04e1493c87efd5a1e13141b46164bde876e90fd0" />
- </dataarea>
- </part>
- </software>
-
- <software name="1on1">
- <description>Julius Erving and Larry Bird Go One on One</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="226826">
- <rom name="one on one.woz" size="226826" crc="4b4be4d2" sha1="bf565dafb896dfc1ca7e1a4685656f1fe0241624" />
- </dataarea>
- </part>
- </software>
-
- <software name="junghunt">
- <description>Jungle Hunt</description>
- <year>1984</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233456">
- <rom name="jungle hunt.woz" size="233456" crc="4138c797" sha1="a920bb6b70a738c7d37fc292efa3c369211385c9" />
- </dataarea>
- </part>
- </software>
-
<software name="krtechm">
<description>Karate Champ</description>
<year>1985</year>
@@ -1358,33 +671,11 @@ license:CC0-1.0
</part>
</software>
- <software name="karateka">
- <description>Karateka</description>
- <year>1984</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later. Side B of the original floppy disk had another copy of the game, but all the graphics were upside down." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233451">
- <rom name="karateka.woz" size="233451" crc="579992fd" sha1="426b10497d927ad8704f252b1f948aa259d1f608" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B (Reverse)" />
- <dataarea name="flop" size="233451">
- <rom name="karateka side b.woz" size="233451" crc="6be5c7db" sha1="58c3cf8c66c48eac9d0602a3a5437b03577edbe9" />
- </dataarea>
- </part>
- </software>
-
<software name="kidniki">
<description>Kid Niki</description>
<year>1987</year>
<publisher>Data East</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-10-19 -->
@@ -1402,28 +693,6 @@ license:CC0-1.0
</part>
</software>
- <software name="kingfact">
- <description>The Kingdom of Facts</description>
- <year>1985</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233516">
- <rom name="the kingdom of facts side a.woz" size="233516" crc="01d35bbc" sha1="adb3d728b4be63c0dc0c25cbc58b81f33e2d5c12" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233516">
- <rom name="the kingdom of facts side b.woz" size="233516" crc="abfce1f6" sha1="bc2141748a97812b04fe29dbd768b81804bb8be0" />
- </dataarea>
- </part>
- </software>
-
<software name="kungfum">
<description>Kung Fu Master</description>
<year>1985</year>
@@ -1439,28 +708,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lacrkdwn">
- <description>L.A. Crackdown</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233484">
- <rom name="l. a. crackdown side a.woz" size="233484" crc="2470ff12" sha1="9e095637f0e4f3bf6f18318f68c3a8946a333394" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233484">
- <rom name="l. a. crackdown side b.woz" size="233484" crc="f90f1341" sha1="ab3bf18944f6482f574a054c916c84d2fbc4f49b" />
- </dataarea>
- </part>
- </software>
-
<software name="lnc">
<description>Lock 'n Chase</description>
<year>1982</year>
@@ -1476,21 +723,6 @@ license:CC0-1.0
</part>
</software>
- <software name="loderunr">
- <description>Lode Runner</description>
- <year>1983</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="353289">
- <rom name="lode runner.woz" size="353289" crc="62728de0" sha1="8bbad930b34415be05e854e1cad20326d2dc9390" />
- </dataarea>
- </part>
- </software>
-
<software name="losttomb">
<description>Lost Tomb</description>
<year>1984</year>
@@ -1506,48 +738,11 @@ license:CC0-1.0
</part>
</software>
- <software name="marauder">
- <description>Marauder</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233470">
- <rom name="marauder.woz" size="233470" crc="59a89e2c" sha1="cd279b38ee6a072aa2974a66804e1f75ff34111d" />
- </dataarea>
- </part>
- </software>
-
- <software name="marble">
- <description>Marble Madness</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="226821">
- <rom name="marble madness side a.woz" size="226821" crc="d4c96731" sha1="3e3fd0be2b4de291e0c137a3a2cfac0fdd56fdd0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233477">
- <rom name="marble madness side b.woz" size="233477" crc="29a0ea5d" sha1="b3c12458557e931b718f168013cffaec6f16a862" />
- </dataarea>
- </part>
- </software>
-
<software name="marscars">
<description>Mars Cars</description>
<year>1982</year>
<publisher>Datamost</publisher>
- <info name="usage" value="Requires a 48K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 48K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-01-01 -->
@@ -1577,7 +772,7 @@ license:CC0-1.0
<description>Megabots</description>
<year>1986</year>
<publisher>Neosoft</publisher>
- <info name="usage" value="Requires a 48K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 48K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-09-08 -->
@@ -1643,21 +838,6 @@ license:CC0-1.0
</part>
</software>
- <software name="minitman">
- <description>Minit Man</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233479">
- <rom name="minit man.woz" size="233479" crc="1a8738dc" sha1="f67c0c46423d3d1b7cab9cb4487749e4079e5a1b" />
- </dataarea>
- </part>
- </software>
-
<software name="mirv">
<description>MIRV</description>
<year>1982</year>
@@ -1692,7 +872,7 @@ license:CC0-1.0
<description>Montezuma's Revenge</description>
<year>1984</year>
<publisher>Parker Brothers</publisher>
- <info name="usage" value="Requires a 48K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 48K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-01-04 -->
@@ -1718,43 +898,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mpatrol">
- <description>Moon Patrol</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="346602">
- <rom name="moon patrol.woz" size="346602" crc="8b46d4fc" sha1="df0d7aee0cd9810cb254f4f28dad3b96792a26a3" />
- </dataarea>
- </part>
- </software>
-
- <software name="movimons">
- <description>The Movie Monster Game</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233451">
- <rom name="the movie monster game side a.woz" size="233451" crc="7318e456" sha1="0bf74c85da08fd5c4bebb587c38769eb8aefb953" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233451">
- <rom name="the movie monster game side b.woz" size="233451" crc="338a8ad1" sha1="b1a996b703cf00c509e15639c53019ce812341c8" />
- </dataarea>
- </part>
- </software>
-
<software name="mrdo">
<description>Mr. Do</description>
<year>1985</year>
@@ -1774,7 +917,7 @@ license:CC0-1.0
<description>Mr. Robot and his Robot Factory</description>
<year>1984</year>
<publisher>Datamost</publisher>
- <info name="usage" value="Runs on any Apple II with 64K." />
+ <info name="usage" value="Runs on any Apple ][ with 64K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-07-30 -->
@@ -1785,21 +928,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mspac">
- <description>Ms. Pac-Man</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-07-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="53744">
- <rom name="ms. pac-man.woz" size="53744" crc="4abe0f76" sha1="29d49e4ab496d095691cef66936f2fe7b95b2d4e" />
- </dataarea>
- </part>
- </software>
-
<software name="nightmsn">
<description>Night Mission Pinball</description>
<year>1982</year>
@@ -1830,11 +958,11 @@ license:CC0-1.0
</part>
</software>
- <software name="orbitron">
+ <software name="orbitron" supported="no">
<description>Orbitron</description>
<year>1981</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2018-10-29 -->
@@ -1875,36 +1003,6 @@ license:CC0-1.0
</part>
</software>
- <software name="paperboy">
- <description>Paperboy</description>
- <year>1988</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-07-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233449">
- <rom name="paperboy.woz" size="233449" crc="cf0fedf6" sha1="aa3f286df6d929c44175270b389ef043930cf77f" />
- </dataarea>
- </part>
- </software>
-
- <software name="pestpatr">
- <description>Pest Patrol</description>
- <year>1982</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2018-10-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="253404">
- <rom name="pest patrol.woz" size="253404" crc="75bf4512" sha1="18e92e52c25e1777daf774e2b7338443a25c07b3" />
- </dataarea>
- </part>
- </software>
-
<software name="phantom5">
<description>Phantoms Five</description>
<year>1980</year>
@@ -1965,21 +1063,6 @@ license:CC0-1.0
</part>
</software>
- <software name="pitstop2">
- <description>Pitstop II</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-18 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233488">
- <rom name="pitstop ii.woz" size="233488" crc="618d562d" sha1="646555ea1e06e14cc784330654e4db3c0a53d193" />
- </dataarea>
- </part>
- </software>
-
<software name="plnflr10">
<description>Planetfall (Release 10 / 880531)</description>
<year>1988</year>
@@ -2070,43 +1153,6 @@ license:CC0-1.0
</part>
</software>
- <software name="pop">
- <description>Prince of Persia</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233481">
- <rom name="prince of persia side a.woz" size="233481" crc="a3820127" sha1="bf7c7c03fcc93b989a8a7e566ec711888553a9de" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233481">
- <rom name="prince of persia side b.woz" size="233481" crc="6de94d52" sha1="931e264563390d1e76cef9a7db31492643f45b49" />
- </dataarea>
- </part>
- </software>
-
- <software name="radwarr">
- <description>Rad Warrior</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233497">
- <rom name="rad warrior.woz" size="233497" crc="d60e8944" sha1="6636e38a149e48d7a4ba20321cb0c92abdf0eb0d" />
- </dataarea>
- </part>
- </software>
-
<software name="rampage">
<description>Rampage</description>
<year>1988</year>
@@ -2122,27 +1168,12 @@ license:CC0-1.0
</part>
</software>
- <software name="reargard">
- <description>Rearguard</description>
- <year>1982</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233498">
- <rom name="rearguard.woz" size="233498" crc="59c443e3" sha1="b9088c2ecb8f7055514e93518cc87deb8b421853" />
- </dataarea>
- </part>
- </software>
-
<software name="rstrblst">
<description>Raster Blaster</description>
<year>1981</year>
<publisher>BudgeCo</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, //e or //c." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C" />
<!-- Dump released: 2018-10-26 -->
<part name="flop1" interface="floppy_5_25">
@@ -2152,21 +1183,6 @@ license:CC0-1.0
</part>
</software>
- <software name="redalert">
- <description>Red Alert</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility problems caused by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2018-11-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="153595">
- <rom name="red alert.woz" size="153595" crc="cbe193dd" sha1="9e5edaf01ad0ccccf837d5b4952af6ca0dd0a633" />
- </dataarea>
- </part>
- </software>
-
<software name="repton">
<description>Repton</description>
<year>1982</year>
@@ -2182,21 +1198,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rescraid">
- <description>Rescue Raiders</description>
- <year>1984</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Runs on any Apple II with 64K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233518">
- <rom name="rescue raiders.woz" size="233518" crc="f2f5bf46" sha1="4ab4e39d593e35c2b1eebc2b5bd1c51b024ef1fb" />
- </dataarea>
- </part>
- </software>
-
<software name="robocop">
<description>RoboCop</description>
<year>1988</year>
@@ -2234,21 +1235,6 @@ license:CC0-1.0
</part>
</software>
- <software name="robotron">
- <description>Robotron 2084</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233452">
- <rom name="robotron 2084.woz" size="233452" crc="f8931d6d" sha1="313e516da05c345e097a34418726604eb6145dd7" />
- </dataarea>
- </part>
- </software>
-
<software name="rabout">
<description>Roundabout</description>
<year>1983</year>
@@ -2268,7 +1254,9 @@ license:CC0-1.0
<description>Russki Duck</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility problems caused by the copy protection, it will not run on later models." />
+ <info name="author" value="Eric Knopp" />
+ <info name="author" value="Alan Merrell" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2019-01-24 -->
@@ -2279,81 +1267,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sabotage">
- <description>Sabotage</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240141">
- <rom name="sabotage.woz" size="240141" crc="091eb06f" sha1="72b24f54916e16ae73c495a5a382517bfffe1f6a" />
- </dataarea>
- </part>
- </software>
-
- <software name="sammyltf">
- <description>Sammy Lightfoot</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240148">
- <rom name="sammy lightfoot.woz" size="240148" crc="c551624a" sha1="e511b9fa31ed9deb0d18fea7001caac96b0e0832" />
- </dataarea>
- </part>
- </software>
-
- <software name="sargon3">
- <description>Sargon III</description>
- <year>1983</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Runs on any 48K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233540">
- <rom name="sargon iii.woz" size="233540" crc="4221ff2a" sha1="1148babdcf183c9bfe40d89cdb5befc5ed53cd6f" />
- </dataarea>
- </part>
- </software>
-
- <software name="seadragn">
- <description>Sea Dragon</description>
- <year>1982</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-01 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233487">
- <rom name="sea dragon.woz" size="233487" crc="a6cd0fc9" sha1="ab137feff2e486d2232b32582fc28929ba628d1a" />
- </dataarea>
- </part>
- </software>
-
- <software name="seafox">
- <description>Sea Fox</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility problems caused by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-02-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="339967">
- <rom name="seafox.woz" size="339967" crc="c8a2ff0b" sha1="df27bc2a43c82e2077f83298a0db80ce052ec23a" />
- </dataarea>
- </part>
- </software>
-
<software name="shdwkeep">
<description>Shadowkeep</description>
<year>1983</year>
@@ -2418,26 +1331,11 @@ license:CC0-1.0
</part>
</software>
- <software name="skyfox">
- <description>Skyfox</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233473">
- <rom name="skyfox.woz" size="233473" crc="be10a46c" sha1="acef2901b6166e7cef4a899bb113e9b052c7bcd7" />
- </dataarea>
- </part>
- </software>
-
<software name="snackatk">
<description>Snack Attack</description>
<year>1981</year>
<publisher>Datamost</publisher>
- <info name="usage" value="Runs on any Apple II." />
+ <info name="usage" value="Runs on any Apple ][." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-07-26 -->
@@ -2483,7 +1381,7 @@ license:CC0-1.0
<description>Space Eggs</description>
<year>1981</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+, or an unenhanced Apple //e. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+, or unenhanced Apple //e. Due to copy protection, it will not run on 65C02-based models." />
<sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2018-10-31 -->
@@ -2494,21 +1392,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spquarks">
- <description>Space Quarks</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility problems caused by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2018-10-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="133617">
- <rom name="space quarks.woz" size="133617" crc="57eaa341" sha1="ba1ff0245ecc9e5d9446224b52e05823d777ebf5" />
- </dataarea>
- </part>
- </software>
-
<software name="spraid20">
<description>Space Raiders version 2</description>
<year>1983</year>
@@ -2524,26 +1407,11 @@ license:CC0-1.0
</part>
</software>
- <software name="spidrbot">
- <description>Spiderbot</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233502">
- <rom name="spiderbot.woz" size="233502" crc="f7b64cd0" sha1="e72e20f91059801312da133dcc8aa99b354e6428" />
- </dataarea>
- </part>
- </software>
-
<software name="spindizy">
<description>Spindizzy</description>
<year>1986</year>
<publisher>Activision</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-09-10 -->
@@ -2569,51 +1437,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spysback">
- <description>The Spy Strikes Back</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="120385">
- <rom name="the spy strikes back.woz" size="120385" crc="9adf680e" sha1="4210fa5a9bbe40418baad823519b3f2b77e215cc" />
- </dataarea>
- </part>
- </software>
-
- <software name="spyvspy3">
- <description>Spy vs Spy III: Arctic Antics</description>
- <year>1983</year>
- <publisher>Bally Midway</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233468">
- <rom name="spy vs. spy iii.woz" size="233468" crc="c19123d1" sha1="2585f7cd612f5f549dacfa2ce9994ede66ab35c6" />
- </dataarea>
- </part>
- </software>
-
- <software name="spydemis">
- <description>Spy's Demise</description>
- <year>1982</year>
- <publisher>Penguin</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="120328">
- <rom name="spy's demise.woz" size="120328" crc="0586db9f" sha1="a7520b7c9d7caddb4db74d1931051212df6c996d" />
- </dataarea>
- </part>
- </software>
-
<software name="starcrsr">
<description>Star Cruiser</description>
<year>1980</year>
@@ -2633,7 +1456,7 @@ license:CC0-1.0
<description>Star Thief</description>
<year>1981</year>
<publisher>Cavalier Computer</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+." />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2018-11-12 -->
@@ -2644,117 +1467,6 @@ license:CC0-1.0
</part>
</software>
- <software name="stellar7">
- <description>Stellar 7 (Penguin Software)</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Runs on any Apple II model with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233471">
- <rom name="stellar 7.woz" size="233471" crc="c93bf1da" sha1="df24d579842e7c11c662a533cc43e6a1a03ddbaa" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssbaseb">
- <description>Street Sports Baseball</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233452">
- <rom name="street sports baseball.woz" size="233452" crc="91fb8f2d" sha1="475a27e9cef255d33e626123fd7445325fc641b6" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssbasket">
- <description>Street Sports Basketball</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233454">
- <rom name="street sports basketball side a.woz" size="233454" crc="545abde9" sha1="3e2c0b7c2d9ef988610e8c6e97a31884f221b5ad" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233454">
- <rom name="street sports basketball side b.woz" size="233454" crc="76728c7c" sha1="ed7157d4c8f6acf3925098c51afa647347c32453" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssfootb">
- <description>Street Sports Football</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233487">
- <rom name="street sports football side a.woz" size="233487" crc="2590c882" sha1="6968accc3ad7f9468b703da0d5ac8ffd2372f334" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233487">
- <rom name="street sports football side b.woz" size="233487" crc="86ef614b" sha1="7933f5410c3b26106ce59d307905a506105bf15f" />
- </dataarea>
- </part>
- </software>
-
- <software name="sssoccer">
- <description>Street Sports Soccer</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233473">
- <rom name="street sports soccer.woz" size="233473" crc="3bb31a45" sha1="e56adb5202d5bb24ab1bc86e86dd82b816a30379" />
- </dataarea>
- </part>
- </software>
-
- <software name="subatsim">
- <description>Sub Battle Simulator</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-11-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233456">
- <rom name="sub battle simulator side a.woz" size="233456" crc="965de0dd" sha1="365a37e90b7ff8fdd1a00100eadac87b129ec803" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233456">
- <rom name="sub battle simulator side b.woz" size="233456" crc="fdb27602" sha1="c3a26c99012c8c223d461058d5b1177b477219a3" />
- </dataarea>
- </part>
- </software>
-
<software name="suicide">
<description>Suicide</description>
<year>1981</year>
@@ -2770,28 +1482,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sumrgame">
- <description>Summer Games</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233577">
- <rom name="summer games side a.woz" size="233577" crc="6b4b20cb" sha1="2d57b25187d3eac6099dea3b1456b406a308f4a2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233577">
- <rom name="summer games side b.woz" size="233577" crc="95f1a4a3" sha1="e7a4c18a0e59b9ea512c56b727f08c417d654164" />
- </dataarea>
- </part>
- </software>
-
<software name="swshbckl">
<description>Swashbuckler</description>
<year>1981</year>
@@ -2807,26 +1497,11 @@ license:CC0-1.0
</part>
</software>
- <software name="swfrobin">
- <description>Swiss Family Robinson</description>
- <year>1984</year>
- <publisher>Windham Classics</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-09-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="253471">
- <rom name="swiss family robinson.woz" size="253471" crc="7615c53b" sha1="9c33e686c69522bfe434ac0510bdaed0846b4963" />
- </dataarea>
- </part>
- </software>
-
<software name="ttwrestl">
<description>Tag Team Wrestling</description>
<year>1986</year>
<publisher>Data East USA</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-10-22 -->
@@ -2837,21 +1512,6 @@ license:CC0-1.0
</part>
</software>
- <software name="apshaitr">
- <description>Temple of Apshai Trilogy</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs. Double hi-res mode requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233494">
- <rom name="temple of apshai trilogy.woz" size="233494" crc="3875d6bc" sha1="cb71555bc29035fa8603849ff0cbc2017aee4604" />
- </dataarea>
- </part>
- </software>
-
<software name="testdrv">
<description>Test Drive</description>
<year>1985</year>
@@ -2905,26 +1565,11 @@ license:CC0-1.0
</part>
</software>
- <software name="thunbomb">
- <description>Thunder Bombs</description>
- <year>1982</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="120334">
- <rom name="thunder bombs.woz" size="120334" crc="ef8f7a1a" sha1="9e902c5a4baa53cc1f7733d8c709d248d132b1d6" />
- </dataarea>
- </part>
- </software>
-
<software name="thunchop">
<description>Thunderchopper</description>
<year>1987</year>
<publisher>ActionSoft</publisher>
- <info name="usage" value="Runs on any Apple II with 64K." />
+ <info name="usage" value="Runs on any Apple ][ with 64K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-11-04 -->
@@ -2939,7 +1584,7 @@ license:CC0-1.0
<description>Tomahawk</description>
<year>1987</year>
<publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2018-08-23 -->
@@ -2954,7 +1599,8 @@ license:CC0-1.0
<description>Trick Shot</description>
<year>1981</year>
<publisher>IDSI</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. It will not run on later models." />
+ <info name="protection" value="Protect-O-Disk" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2018-08-23 -->
@@ -2972,20 +1618,6 @@ license:CC0-1.0
</part>
</software>
- <software name="trkfield">
- <description>Track and Field</description>
- <year>1984</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233452">
- <rom name="track and field.woz" size="233452" crc="462adf6e" sha1="220a604b368c61644265678ec820b71ace25f318" />
- </dataarea>
- </part>
- </software>
-
<software name="triviafv">
<description>Trivia Fever</description>
<year>1984</year>
@@ -3038,98 +1670,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ultima4">
- <description>Ultima IV: Quest of the Avatar</description>
- <year>1985</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program Disk" />
- <dataarea name="flop" size="240170">
- <rom name="ultima iv - side a - program.woz" size="240170" crc="9e1d5595" sha1="a2de1815ffe51b4bdaad8b6abe8ec935911ec394" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Towne Disk" />
- <dataarea name="flop" size="233516">
- <rom name="ultima iv - side b - towne.woz" size="233516" crc="8ba7e933" sha1="f100cec0ae9d04a25f687fc3c1d76b139266826e" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C - Britannia Disk" />
- <dataarea name="flop" size="233520">
- <rom name="ultima iv - side c - britannia.woz" size="233520" crc="ac61d6c4" sha1="846bfcebf3dafa9642d290ea8d1619e580573e1a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D - Underworld Disk" />
- <dataarea name="flop" size="233521">
- <rom name="ultima iv - side d - underworld.woz" size="233521" crc="7daab34f" sha1="d365cb92dd1c737a3c8773f432fe4c880019f324" />
- </dataarea>
- </part>
- </software>
-
- <software name="ultima5">
- <description>Ultima V: Warriors of Destiny</description>
- <year>1988</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-01-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Program Disk" />
- <dataarea name="flop" size="233616">
- <rom name="ultima v - program.woz" size="233616" crc="77708654" sha1="3623aadefb9b2635cd56635ddb21b6d3f4b6dc63" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Britannia Disk" />
- <dataarea name="flop" size="233622">
- <rom name="ultima v - britannia.woz" size="233622" crc="8141d042" sha1="ddb85c2ee8bbbb4a66f5e87821df82744b3e3b8f" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Towne Disk" />
- <dataarea name="flop" size="233618">
- <rom name="ultima v - towne.woz" size="233618" crc="578b66cf" sha1="d13d98470df0f58e9ef2b8ab68aae979831f8d3e" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Dwelling Disk" />
- <dataarea name="flop" size="233621">
- <rom name="ultima v - dwelling.woz" size="233621" crc="fa6127b1" sha1="40e4c9054cee15edacdd378e6734052bc3237ee5" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Castle Disk" />
- <dataarea name="flop" size="233619">
- <rom name="ultima v - castle.woz" size="233619" crc="48d5bad1" sha1="02c1f89411e86096f88e28eb3f6199553efccc90" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Keep Disk" />
- <dataarea name="flop" size="233617">
- <rom name="ultima v - keep.woz" size="233617" crc="51638f02" sha1="d1bb7658d0056a9a769ecb15e1c69b41780f9e67" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Dungeon Disk" />
- <dataarea name="flop" size="233620">
- <rom name="ultima v - dungeon.woz" size="233620" crc="7f981d04" sha1="d97fbd4d7eba2b65fc28e6d9bb19c9e1c4f18d58" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Underworld Disk" />
- <dataarea name="flop" size="233623">
- <rom name="ultima v - underworld.woz" size="233623" crc="60a5113b" sha1="0f6ee9ea94e917042a074934b41a318486099fff" />
- </dataarea>
- </part>
- </software>
-
<software name="upndown">
<description>Up 'N Down</description>
<year>1981</year>
@@ -3190,28 +1730,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wof">
- <description>Wings of Fury</description>
- <year>1987</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-10-01 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233481">
- <rom name="wings of fury side a.woz" size="233481" crc="61f6896e" sha1="44c5f01954d367915315e9e36aa8bb23b0038cac" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233304">
- <rom name="wings of fury side b.woz" size="233304" crc="e88181a9" sha1="0913de8ee03c5295d2015b481809090695c2c0ea" />
- </dataarea>
- </part>
- </software>
-
<software name="wishbr23">
<description>Wishbringer (Release 23 / 880706)</description>
<year>1988</year>
@@ -3235,73 +1753,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wkchamp">
- <description>World Karate Championship</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233482">
- <rom name="world karate championship.woz" size="233482" crc="e8030bd9" sha1="3d0569e44a9520a3e27eb50e67f67f4362e1edc8" />
- </dataarea>
- </part>
- </software>
-
- <software name="wgbbg">
- <description>The World's Greatest Baseball Game</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233488">
- <rom name="the world's greatest baseball game.woz" size="233488" crc="9d415a67" sha1="c7e8f557efd3221ae5a171a92d217b7fb2250b29" />
- </dataarea>
- </part>
- </software>
-
- <software name="wgfbg">
- <description>The World's Greatest Football Game</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-12-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="233507">
- <rom name="the world's greatest football game side a.woz" size="233507" crc="fdbacf7f" sha1="301bf537734de76711c51431658fccca2a64bdca" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="233507">
- <rom name="the world's greatest football game side b.woz" size="233507" crc="4c9a39de" sha1="d5b145e52cd9d7438a66a976bbc6cb7baef10c11" />
- </dataarea>
- </part>
- </software>
-
- <software name="xevious">
- <description>Xevious</description>
- <year>1984</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2018-08-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233465">
- <rom name="xevious.woz" size="233465" crc="97586f7c" sha1="06e17e91e2490952013d407c2234b27677c16090" />
- </dataarea>
- </part>
- </software>
-
<software name="zendar">
<description>Zendar</description>
<year>1982</year>
@@ -3321,7 +1772,7 @@ license:CC0-1.0
<description>Zorro</description>
<year>1985</year>
<publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-01-10 -->
@@ -3332,49 +1783,12 @@ license:CC0-1.0
</part>
</software>
- <software name="suprfact">
- <description>The Super Factory</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-18 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234807">
- <rom name="the super factory.woz" size="234807" crc="4a48c3b1" sha1="8c8cc653cbc6c3f98b074dfc989b18c8cba9dd20" />
- </dataarea>
- </part>
- </software>
-
- <software name="captgngt">
- <description>Captain Goodnight and the Islands of Fear</description>
- <year>1985</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="323917">
- <rom name="captain goodnight and the islands of fear side a.woz" size="323917" crc="470a2811" sha1="3642d9d5340fdea6542f4d09a7c926d2016373f5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234794">
- <rom name="captain goodnight and the islands of fear side b.woz" size="234794" crc="f59c6dc2" sha1="e3c1a9d134eb1b0c8997f6a17a8c42941929749f" />
- </dataarea>
- </part>
- </software>
-
<software name="eggsit">
<description>Eggs-It</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced Apple //e. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2019-02-21 -->
<part name="flop1" interface="floppy_5_25">
@@ -3384,51 +1798,6 @@ license:CC0-1.0
</part>
</software>
- <software name="choplftr">
- <description>Choplifter</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-02-22 Redumped on 2022-03-30 to fix corruption related to a bug in early Applesauce FDC firmware. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="360719">
- <rom name="choplifter.woz" size="360719" crc="9d4dc01c" sha1="1c4983656937762ae71646480396cf50541efc94" />
- </dataarea>
- </part>
- </software>
-
- <software name="leepers">
- <description>Lunar Leepers</description>
- <year>1982</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to conflicts created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="507649">
- <rom name="lunar leepers.woz" size="507649" crc="3cd5d255" sha1="0607fb62340c48abc0624fe369dace2e9d5fedfd" />
- </dataarea>
- </part>
- </software>
-
- <software name="goldmntn">
- <description>Golden Mountain</description>
- <year>1980</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="75006">
- <rom name="golden mountain.woz" size="75006" crc="235d837b" sha1="123830597000b8895d480b872e0fae4fbbd008f0" />
- </dataarea>
- </part>
- </software>
-
<software name="aklabeth">
<description>Akalabeth</description>
<year>1980</year>
@@ -3444,27 +1813,12 @@ license:CC0-1.0
</part>
</software>
- <software name="chldrnr">
- <description>Championship Lode Runner</description>
- <year>1984</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-02-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="288009">
- <rom name="championship lode runner.woz" size="288009" crc="c6a1f9ce" sha1="082862613ccad1efe8af0d9330a47d907eaf29bd" />
- </dataarea>
- </part>
- </software>
-
<software name="gamgblin">
<description>Gamma Goblins</description>
<year>1981</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced Apple //e. Due to copy protection, it will not run on 65C02-based models." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2019-02-27 -->
<part name="flop1" interface="floppy_5_25">
@@ -3474,21 +1828,6 @@ license:CC0-1.0
</part>
</software>
- <software name="srpntine">
- <description>Serpentine</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-02-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="354587">
- <rom name="serpentine.woz" size="354587" crc="f3bec3d9" sha1="593b149b7ad986e34b10b15e3e876c87377e245d" />
- </dataarea>
- </part>
- </software>
-
<software name="grdsspac">
<description>Gruds in Space</description>
<year>1983</year>
@@ -3511,88 +1850,6 @@ license:CC0-1.0
</part>
</software>
- <software name="muppetvl">
- <description>Muppetville</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple II+, //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234769">
- <rom name="muppetville.woz" size="234769" crc="d30623fb" sha1="ae45a94b06339df594d68ac5c571e9d0babed035" />
- </dataarea>
- </part>
- </software>
-
- <software name="dazldraw">
- <description>Dazzle Draw (version 1.1)</description>
- <year>1984</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="248075">
- <rom name="dazzle draw side a.woz" size="248075" crc="8e93587b" sha1="486e44c49d9b4ac6d4ba1fa6aa9824934fb14cce" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234766">
- <rom name="dazzle draw side b.woz" size="234766" crc="6648df34" sha1="d693245765c0440807fab4e3a4df6bc676146f9f" />
- </dataarea>
- </part>
- </software>
-
- <software name="ultima3">
- <description>Ultima III: Exodus</description>
- <year>1983</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-04 -->
- <!-- As with the original, the scenario disk (side B) is write protected. You will need to make a copy of the disk before you can create characters. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program" />
- <dataarea name="flop" size="121621">
- <rom name="ultima iii side a.woz" size="121621" crc="1bba6693" sha1="2ce436033547c06f42032a5e09a0831559244542" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario" />
- <dataarea name="flop" size="234779">
- <rom name="ultima iii side b.woz" size="234779" crc="b02c959f" sha1="dee83d101d7da833d862f55e3ffb642e2e9b4b7e" />
- </dataarea>
- </part>
- </software>
-
- <software name="ae">
- <description>A.E.</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="168206">
- <rom name="a.e. side a.woz" size="168206" crc="06E2E82A" sha1="DBD31E80D1077788BE5EEBC016C3201DDCB7C026" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234766">
- <rom name="a.e. side b.woz" size="234766" crc="D0A7DADF" sha1="5A0700AFE19E7C2163BC41E1CF59F81330CE632C" />
- </dataarea>
- </part>
- </software>
-
<software name="ernieqz">
<description>Ernie's Quiz</description>
<year>1981</year>
@@ -3657,8 +1914,8 @@ license:CC0-1.0
<description>Beer Run</description>
<year>1981</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced Apple //e. Due to copy protection, it will not run on 65C02-based models." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2019-03-10 -->
<part name="flop1" interface="floppy_5_25">
@@ -3672,8 +1929,8 @@ license:CC0-1.0
<description>Phaser Fire</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced Apple //e. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2019-03-11 -->
<part name="flop1" interface="floppy_5_25">
@@ -3687,8 +1944,8 @@ license:CC0-1.0
<description>Bug Attack</description>
<year>1981</year>
<publisher>Cavalier Computer</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced Apple //e. Due to copy protection, it will not run on 65C02-based models." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2019-03-12 -->
<part name="flop1" interface="floppy_5_25">
@@ -3717,8 +1974,8 @@ license:CC0-1.0
<description>High Orbit</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced Apple //e. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2019-03-14 -->
<part name="flop1" interface="floppy_5_25">
@@ -3743,21 +2000,6 @@ license:CC0-1.0
</part>
</software>
- <software name="labyrnth">
- <description>Labyrinth</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-03-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="349959">
- <rom name="labyrinth.woz" size="349959" crc="c2a2ba88" sha1="8604f70d0a7f039a729a3d81957e8b1860bacbaa" />
- </dataarea>
- </part>
- </software>
-
<software name="ribbit">
<description>Ribbit</description>
<year>1982</year>
@@ -3803,21 +2045,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lazrsilk">
- <description>Lazer Silk</description>
- <year>1982</year>
- <publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-03-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="354556">
- <rom name="lazer silk.woz" size="354556" crc="038984fb" sha1="a44ee87f2bef7c43edd4dbb8eea70f9fc930b051" />
- </dataarea>
- </part>
- </software>
-
<software name="mazecraz">
<description>Maze Craze Construction Set</description>
<year>1983</year>
@@ -3834,7 +2061,7 @@ license:CC0-1.0
</software>
<software name="esrngstn">
- <description>Escape From Rungistan</description>
+ <description>Escape from Rungistan</description>
<year>1982</year>
<publisher>Sirius Software</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
@@ -3863,36 +2090,6 @@ license:CC0-1.0
</part>
</software>
- <software name="starblzr">
- <description>Star Blazer</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-03-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="354545">
- <rom name="star blazer.woz" size="354545" crc="7895bdd6" sha1="848f6cdfa94f5942775e4cf133d589552fe22a86" />
- </dataarea>
- </part>
- </software>
-
- <software name="rboots40">
- <description>Rocky's Boots (version 4.0)</description>
- <year>1985</year>
- <publisher>The Learning Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234747">
- <rom name="rocky's boots v4.0.woz" size="234747" crc="638f1d4f" sha1="67dc599a7b8f0b84cdfdcd7c29f910dbea5f9f0c" />
- </dataarea>
- </part>
- </software>
-
<software name="flocklnd">
<description>The Flockland Island Crisis</description>
<year>1982</year>
@@ -3908,43 +2105,6 @@ license:CC0-1.0
</part>
</software>
- <software name="prntshpc">
- <description>The Print Shop Color</description>
- <year>1986</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234757">
- <rom name="the print shop color side a.woz" size="234757" crc="3ca8da35" sha1="300e6725237ab5e24b93570d834cb6c416e17056" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234757">
- <rom name="the print shop color side b.woz" size="234757" crc="22f1470b" sha1="a05e1a69a7bb9282b547ff91e45aa07fcb980467" />
- </dataarea>
- </part>
- </software>
-
- <software name="starwrrr">
- <description>Star Warrior</description>
- <year>1980</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-03-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234793">
- <rom name="star warrior.woz" size="234793" crc="2f8c4fa6" sha1="0cea6128cc971cc5606a80a7594fcc4749a177ed" />
- </dataarea>
- </part>
- </software>
-
<software name="warpdstr">
<description>Warp Destroyer</description>
<year>1982</year>
@@ -4013,43 +2173,6 @@ license:CC0-1.0
</software>
- <software name="fantvisn">
- <description>Fantavision</description>
- <year>1985</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program" />
- <dataarea name="flop" size="241390">
- <rom name="fantavision side a - program.woz" size="241390" crc="2f60d960" sha1="747244f6f014653f2485cf28f170c4ad04d26344" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Demos" />
- <dataarea name="flop" size="234732">
- <rom name="fantavision side b - demos.woz" size="234732" crc="f21e1a6b" sha1="f74a11d81992f8b2d755f8e7b43071c44d022753" />
- </dataarea>
- </part>
- </software>
-
- <software name="peeptom">
- <description>Peeping Tom</description>
- <year>1982</year>
- <publisher>Micro Lab</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234765">
- <rom name="peeping tom.woz" size="234765" crc="ff70f089" sha1="80c2f0393018236461b5dd8e6374beb136347b5b" />
- </dataarea>
- </part>
- </software>
-
<software name="bldofbkp">
<description>The Blade of Blackpoole</description>
<year>1982</year>
@@ -4072,45 +2195,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wizrdry3">
- <description>Wizardry III: Legacy of Llylgamyn (version 4, 20-Aug-1983 update)</description>
- <year>1983</year>
- <publisher>Sir-Tech Software</publisher>
- <info name="programmer" value="Andrew Greenberg and Robert Woodhead" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <info name="version" value="Version 4, 20-Aug-1983 update" />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-08. Redumped: 2023-09-12-->
- <!--roleplaying game-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master Scenario disk" />
- <dataarea name="flop" size="234882">
- <rom name="wizardry iii side a - master scenario disk.woz" size="234882" crc="57366656" sha1="9d59da2fca6c3c42c89ff2e8988d4d66dd1e0143" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Boot disk" />
- <dataarea name="flop" size="234871">
- <rom name="wizardry iii side b - boot.woz" size="234871" crc="4e0b9951" sha1="ed00134fb1006eeb3cd1299449759beae2218061" />
- </dataarea>
- </part>
- </software>
-
- <software name="arcalbm1">
- <description>Arcade Album #1</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233529">
- <rom name="arcade album #1.woz" size="233529" crc="0ef302a9" sha1="7ac2ef26b00afb7f3d5d91e59ad164892d514c0e" />
- </dataarea>
- </part>
- </software>
-
<software name="btime">
<description>BurgerTime</description>
<year>1982</year>
@@ -4126,42 +2210,13 @@ license:CC0-1.0
</part>
</software>
- <software name="robtdawn">
- <description>Robots of Dawn</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233475">
- <rom name="robots of dawn.woz" size="233475" crc="1857ecfd" sha1="571daffa89f2269679ed6ada76e76016da26b594" />
- </dataarea>
- </part>
- </software>
-
- <software name="digdug">
- <description>Dig Dug</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233446">
- <rom name="dig dug.woz" size="233446" crc="20b719e9" sha1="6db5b295394e19295c7e6c299cec40eec7a8a70b" />
- </dataarea>
- </part>
- </software>
-
<software name="zork1r5">
<description>Zork I: The Great Underground Empire (Revision 5)</description>
<year>1980</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K. This is release 5, the earliest version ever published for Apple II." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 48K. This is release 5, the earliest version ever published for Apple ][." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-04-11 -->
<part name="flop1" interface="floppy_5_25">
@@ -4171,27 +2226,13 @@ license:CC0-1.0
</part>
</software>
- <software name="msadvent">
- <description>Microsoft Adventure</description>
- <year>1980</year>
- <publisher>Microsoft</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 32K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234771">
- <rom name="microsoft adventure.woz" size="234771" crc="6e623593" sha1="d52f0a3b95a386875cb3691f5471e8c14440ccb8" />
- </dataarea>
- </part>
- </software>
-
<software name="mcinvadr">
<description>Micro Invaders</description>
<year>1979</year>
<publisher>Programma Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 32K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-04-13 -->
<part name="flop1" interface="floppy_5_25">
@@ -4205,8 +2246,9 @@ license:CC0-1.0
<description>Blister Ball and Mad Bomber</description>
<year>1981</year>
<publisher>Creative Computing Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise Runs on any Apple ][ with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-04-16 -->
<part name="flop1" interface="floppy_5_25">
@@ -4216,58 +2258,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mstypetr">
- <description>Typing Tutor</description>
- <year>1979</year>
- <publisher>Microsoft</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234810">
- <rom name="typing tutor.woz" size="234810" crc="58306c14" sha1="b056c2772643d89336a6ee9894b5dfbd411f53f1" />
- </dataarea>
- </part>
- </software>
-
- <software name="spwarior">
- <description>Space Warrior</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="61721">
- <rom name="space warrior.woz" size="61721" crc="e0b4e0ed" sha1="96cd4e7ba3e49c48d29987fec219f452eb33b413" />
- </dataarea>
- </part>
- </software>
-
- <software name="crmcrown">
- <description>The Crimson Crown</description>
- <year>1985</year>
- <publisher>Polarware</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234766">
- <rom name="the crimson crown side a.woz" size="234766" crc="3ba098cb" sha1="039acb376d74b1079469af9b49ec0220d03f5318" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234766">
- <rom name="the crimson crown side b.woz" size="234766" crc="d158deed" sha1="e02ca1c7af89f56efe1d6767c40963161dfbe926" />
- </dataarea>
- </part>
- </software>
-
<software name="zyhearts">
<description>Zykron Hearts</description>
<year>1986</year>
@@ -4298,31 +2288,11 @@ license:CC0-1.0
</part>
</software>
- <software name="prshcomp">
- <description>The Print Shop Companion (version 1.2)</description>
- <year>1985</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later. This is the final version produced for the Apple II." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-04-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234794">
- <rom name="the print shop companion v1.2 side a.woz" size="234794" crc="e8af250e" sha1="875f61ac89ec48ed450fb646e5eafd9a24233c4d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="234794">
- <rom name="the print shop companion v1.2 side b.woz" size="234794" crc="a06b52a9" sha1="1c6f461fbd4c78dd48480c334f0d5f1df2cf591e" />
- </dataarea>
- </part>
- </software>
-
<software name="naptune">
<description>Neptune</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2019-04-27 -->
@@ -4363,21 +2333,6 @@ license:CC0-1.0
</part>
</software>
- <software name="epyxfore">
- <description>Fore</description>
- <year>1982</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234728">
- <rom name="fore.woz" size="234728" crc="ef113e2e" sha1="f4ca8eb9aed7619034d3fce066d305b902ba840a" />
- </dataarea>
- </part>
- </software>
-
<software name="gorgon">
<description>Gorgon</description>
<year>1981</year>
@@ -4408,27 +2363,13 @@ license:CC0-1.0
</part>
</software>
- <software name="impmisn">
- <description>Impossible Mission</description>
- <year>1984</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="173820">
- <rom name="impossible mission.woz" size="173820" crc="09f41927" sha1="2863391b12c0878050203c8b3ef39e23c0c84e1d" />
- </dataarea>
- </part>
- </software>
-
<software name="juggler">
<description>Juggler</description>
<year>1982</year>
<publisher>IDSI</publisher>
- <info name="usage" value="Requires a 48K Apple II or Apple II+. Due to compatibility problems created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <info name="protection" value="Protect-O-Disk" />
+ <info name="usage" value="Requires a 48K Apple ][ or Apple ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2019-05-06 -->
<part name="flop1" interface="floppy_5_25">
@@ -4438,21 +2379,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sorcsiva">
- <description>Sorcerer of Siva</description>
- <year>1981</year>
- <publisher>epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234763">
- <rom name="sorcerer of siva.woz" size="234763" crc="e14e1c8b" sha1="34119f636f0044300abd50f963b45fa929a17277" />
- </dataarea>
- </part>
- </software>
-
<software name="tfelimin">
<description>Top Fuel Eliminator</description>
<year>1987</year>
@@ -4472,7 +2398,7 @@ license:CC0-1.0
<description>Zork II (Revision 7 / UG3AU5)</description>
<year>1981</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-05-10 -->
@@ -4587,58 +2513,6 @@ license:CC0-1.0
</part>
</software>
- <software name="arcmachn">
- <description>The Arcade Machine</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="327972">
- <rom name="the arcade machine side a.woz" size="327972" crc="2734531d" sha1="ba2a60fc646710f4d5d1cf46a6bd8f22a0828fab" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234642">
- <rom name="the arcade machine side b.woz" size="234642" crc="ffa3c0a0" sha1="8ebb8f3d339ee0767eee306db63b80eccdc11941" />
- </dataarea>
- </part>
- </software>
-
- <software name="bzone">
- <description>Battlezone</description>
- <year>1983</year>
- <publisher>Atarisoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233449">
- <rom name="battlezone.woz" size="233449" crc="c2842b0f" sha1="b466c5e38944ff0b74d46b43178611278f2fd785" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsmith41">
- <description>Locksmith 4.1</description>
- <year>1983</year>
- <publisher>Omega Microware</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="108291">
- <rom name="locksmith 4.1.woz" size="108291" crc="fa9116e7" sha1="6f6528a640bd4a5643b339e59a5ba99f8fba2d01" />
- </dataarea>
- </part>
- </software>
-
<software name="cutthr23">
<description>Cutthroats (Release 23 / 840809)</description>
<year>1984</year>
@@ -4663,11 +2537,13 @@ license:CC0-1.0
<!-- Dump released: 2019-05-22 -->
<part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
<dataarea name="flop" size="234744">
<rom name="trinity side a.woz" size="234744" crc="1b9bf646" sha1="dfcb84e4b61bf958fa838e7556c46e36c32e15d6" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="234744">
<rom name="trinity side b.woz" size="234744" crc="6b814a97" sha1="4e6ae3a33788e47bac09a7d8f6e160d879f8b263" />
</dataarea>
@@ -4689,37 +2565,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ultima1t">
- <description>Ultima I: The Beginning</description>
- <year>1986</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-23 -->
- <!-- This is the Ultima Trilogy re-release version. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234735">
- <rom name="ultima i - the beginning.woz" size="234735" crc="d06b8c18" sha1="9d909f6e098f23935854a9e63f7b2d7b8efc8dfc" />
- </dataarea>
- </part>
- </software>
-
- <software name="skicrzed">
- <description>Ski Crazed (version 28701)</description>
- <year>1987</year>
- <publisher>Baudville</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234775">
- <rom name="ski crazed.woz" size="234775" crc="92531d10" sha1="9fb8ad412976644fa03814229e1b84196ca8fcaf" />
- </dataarea>
- </part>
- </software>
-
<software name="thief">
<description>Thief</description>
<year>1981</year>
@@ -4750,51 +2595,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mrcool">
- <description>Mr. Cool</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234781">
- <rom name="mr. cool.woz" size="234781" crc="e40dca20" sha1="0dc5a1222ecd1cb56913c78b6a36d5f63b44910e" />
- </dataarea>
- </part>
- </software>
-
- <software name="rmplstsk">
- <description>Rumpelstiltskin</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-05-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234745">
- <rom name="rumpelstiltskin.woz" size="234745" crc="b28efd1c" sha1="4c0a5d5feaf441bcb95874009a73f5037bfaad20" />
- </dataarea>
- </part>
- </software>
-
- <software name="submissn">
- <description>Sub Mission</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234804">
- <rom name="sub mission.woz" size="234804" crc="a028902c" sha1="9805fe623de40e0d6d39a9aad4abcc2024bf4572" />
- </dataarea>
- </part>
- </software>
-
<software name="thtreuro">
<description>Theatre Europe</description>
<year>1986</year>
@@ -4810,36 +2610,6 @@ license:CC0-1.0
</part>
</software>
- <software name="station5">
- <description>Station 5</description>
- <year>1984</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234761">
- <rom name="station 5.woz" size="234761" crc="52124dfd" sha1="7baaa8a17d373182c28f3486423f770a35078cb9" />
- </dataarea>
- </part>
- </software>
-
- <software name="ogre">
- <description>OGRE</description>
- <year>1986</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234755">
- <rom name="ogre.woz" size="234755" crc="76123140" sha1="540dfe0e7ff7fe7a2c7bbb8d41b2cb85fbcaa6ea" />
- </dataarea>
- </part>
- </software>
-
<software name="chmpbase">
<description>Championship Baseball</description>
<year>1986</year>
@@ -4862,55 +2632,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wizardoz">
- <description>The Wizard of Oz</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A" />
- <dataarea name="flop" size="234866">
- <rom name="the wizard of oz disk a.woz" size="234866" crc="4522de5f" sha1="b2459cf8ea2791d82b5da58e7b0aa25caf140f94" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B" />
- <dataarea name="flop" size="234866">
- <rom name="the wizard of oz disk b.woz" size="234866" crc="e9de932e" sha1="fa02f177b45bde15ffc06101031fd01ca8710033" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C" />
- <dataarea name="flop" size="234866">
- <rom name="the wizard of oz disk c.woz" size="234866" crc="0ed1d4cb" sha1="78a9fb5edb2fd249e7804607cd7bd3ee248115af" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D" />
- <dataarea name="flop" size="234866">
- <rom name="the wizard of oz disk d.woz" size="234866" crc="1c0e7e78" sha1="25d7e25b66c475d0881138ba302be722683df6e6" />
- </dataarea>
- </part>
- </software>
-
- <software name="queenphb">
- <description>The Queen of Phobos</description>
- <year>1982</year>
- <publisher>Phoenix Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="181581">
- <rom name="the queen of phobos.woz" size="181581" crc="6c31a42a" sha1="7617ff8f126edaab1daf8954ea7d6cac07bb1e77" />
- </dataarea>
- </part>
- </software>
-
<software name="pentapus">
<description>Pentapus</description>
<year>1983</year>
@@ -4971,21 +2692,6 @@ license:CC0-1.0
</part>
</software>
- <software name="pensate">
- <description>Pensate</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="121589">
- <rom name="pensate.woz" size="121589" crc="89dea29f" sha1="eeb9037392b0f180e3d6e4a8dab30e07ab0e80da" />
- </dataarea>
- </part>
- </software>
-
<software name="pipedrm">
<description>Pipe Dream</description>
<year>1990</year>
@@ -5001,36 +2707,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lafpak">
- <description>Laf Pak</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234778">
- <rom name="laf pak.woz" size="234778" crc="7e5e2002" sha1="8fbd21ff8d8b7f6194c0bdfbfa074aa716435e77" />
- </dataarea>
- </part>
- </software>
-
- <software name="shrtcrct">
- <description>Short Circuit</description>
- <year>1984</year>
- <publisher>Micro Lab</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="467733">
- <rom name="short circuit.woz" size="467733" crc="d95cd68f" sha1="68b5bc28da9216515a0bfb13665fd05d50f70f32" />
- </dataarea>
- </part>
- </software>
-
<software name="mnmistr9">
<description>Moonmist (Release 9 / 861022)</description>
<year>1986</year>
@@ -5046,28 +2722,6 @@ license:CC0-1.0
</part>
</software>
- <software name="2400ad">
- <description>2400 A.D.</description>
- <year>1987</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-16 redumped 2021-07-03 to fix side 2, which should not have write protection. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program disk" />
- <dataarea name="flop" size="234834">
- <rom name="2400 a.d. - program disk.woz" size="234834" crc="54e443c6" sha1="7ff4c81a96d18d89609e3e1d2ed7e79c7cc10597" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Player disk" />
- <dataarea name="flop" size="234834">
- <rom name="2400 a.d. - player disk.woz" size="234834" crc="6c1893b0" sha1="d82a0833180147b967eee6cf954b8a7939ca5a02" />
- </dataarea>
- </part>
- </software>
-
<software name="mmansion">
<description>Maniac Mansion</description>
<year>1987</year>
@@ -5120,43 +2774,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tetrad">
- <description>Tetrad</description>
- <year>1981</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234762">
- <rom name="tetrad.woz" size="234762" crc="80ede3c9" sha1="ea1ae9b469e4bce84af5b69cf3ceb4ed60cc31b1" />
- </dataarea>
- </part>
- </software>
-
- <software name="tsnbaseb">
- <description>The Sporting News: Baseball</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-06-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234775">
- <rom name="the sporting news- baseball side a.woz" size="234775" crc="bebab519" sha1="0cea607146e2fbc06c572f375b27e11671b30d22" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234775">
- <rom name="the sporting news- baseball side b.woz" size="234775" crc="0310df9b" sha1="2c9509de6720835a3c209dd296fcde37b7e9182d" />
- </dataarea>
- </part>
- </software>
-
<software name="witnsr22">
<description>Witness (Release 22 / 840924)</description>
<year>1983</year>
@@ -5273,9 +2890,10 @@ license:CC0-1.0
<description>Quadrant 6112</description>
<year>1982</year>
<publisher>Sensible Software</publisher>
- <info name="usage" value="Requires an Apple II or II+ with 48K. Due to compatibility issues created by the copy protection, it will not run on later models. Even with a compatible ROM file, this game triggers bugs in several emulators, resulting in crashes or spontaneous reboots." />
+ <info name="usage" value="Requires an Apple ][ or ][+ with 48K. Due to copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2019-07-01 -->
+ <!-- This game triggers bugs in several emulators, resulting in crashes or spontaneous reboots. -->
<!-- Tested for several minutes in MAME on 2019-07-03 with no obvious crashes. Will leave tagged as working unless reports say otherwise. -->
<part name="flop1" interface="floppy_5_25">
@@ -5322,40 +2940,6 @@ license:CC0-1.0
</part>
</software>
- <software name="drkcryst">
- <description>The Dark Crystal</description>
- <year>1982</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="235514">
- <rom name="the dark crystal disk 1a.woz" size="235514" crc="0567c1fa" sha1="12546079b3bec0aafad004b9890972ddf16f1e22" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="235514">
- <rom name="the dark crystal disk 1b.woz" size="235514" crc="73b14838" sha1="29b99a7d2cf1af3ee4a2db6e9c2689e040f0c15d" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="235514">
- <rom name="the dark crystal disk 2a.woz" size="235514" crc="82072c10" sha1="772a2e802e7cb610161a7be95053d920677a2cba" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="235514">
- <rom name="the dark crystal disk 2b.woz" size="235514" crc="f423959a" sha1="7381235bbe1dccf36ff682257ae6f0e6d82fba25" />
- </dataarea>
- </part>
- </software>
-
<software name="infidr22">
<description>Infidel (Release 22 / 830916)</description>
<year>1983</year>
@@ -5416,136 +3000,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mshopjr">
- <description>Math Shop Jr.</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235555">
- <rom name="math shop jr. - disk 1, side a.woz" size="235555" crc="fba369c4" sha1="c840eaf0ba5153253604ed141a0c5c469c13ef46" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235555">
- <rom name="math shop jr. - disk 1, side b.woz" size="235555" crc="b0dfa607" sha1="695dceddc3cbe88cba85c7a420545fcab07784e7" />
- </dataarea>
- </part>
- </software>
-
- <software name="algeshop">
- <description>Algebra Shop</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235547">
- <rom name="algebra shop - disk 1, side a.woz" size="235547" crc="e1ec2c11" sha1="57582c651bda902821beb7c179da3a15d26b88aa" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="235547">
- <rom name="algebra shop - disk 1, side b.woz" size="235547" crc="58b54d48" sha1="c327fd58ffcb53faabc66f6f546ea2a6cd7a57ae" />
- </dataarea>
- </part>
- </software>
-
- <software name="advmshop">
- <description>Advanced Math Shop</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234793">
- <rom name="advanced math shop side a.woz" size="234793" crc="373b3e89" sha1="d893a98d8311e09c7aecaa83e1378718a8d8dd1b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234793">
- <rom name="advanced math shop side b.woz" size="234793" crc="d4fe68d1" sha1="9fefefe1459dbc87a620e5b520a182cec2a8cdec" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathshop">
- <description>Math Shop</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234767">
- <rom name="math shop side a.woz" size="234767" crc="a01fe9c2" sha1="288818f08c81c88ebb586833979359538962f339" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234767">
- <rom name="math shop side b.woz" size="234767" crc="16ad0c32" sha1="6f882fdea5fe7655cf26beccf82e8a6d886b7fa7" />
- </dataarea>
- </part>
- </software>
-
- <software name="operfrog">
- <description>Operation: FROG</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234819">
- <rom name="operation frog side a.woz" size="234819" crc="7784ff02" sha1="a7ddd17ac501d18e709f08337d5cf6ad2bdde97f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234819">
- <rom name="operation frog side b.woz" size="234819" crc="0f0157d4" sha1="4f7851333edaab64acd785ece0d01f3f863aa8bb" />
- </dataarea>
- </part>
- </software>
-
- <software name="mclcsh">
- <description>MECC-A279 Lewis and Clark Stayed Home (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235610">
- <rom name="lewis and clark stayed home side a.woz" size="235610" crc="0d491c52" sha1="778257f1cccc09c740c720b812b7f02769c87a34" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235610">
- <rom name="lewis and clark stayed home side b.woz" size="235610" crc="48db922e" sha1="159fa2ee942baba72588da95005d227ad62fe17d" />
- </dataarea>
- </part>
- </software>
-
<software name="drruth">
<description>Dr. Ruth's Computer Game of Good Sex</description>
<year>1986</year>
@@ -5568,245 +3022,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mcfreedm">
- <description>MECC-A315 Freedom! (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235530">
- <rom name="mecc-a315 freedom v1.0 side a.woz" size="235530" crc="cc037101" sha1="84efd7438e3cf9db9464471ead746f18a2b1413e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235530">
- <rom name="mecc-a315 freedom v1.0 side b.woz" size="235530" crc="30903ce8" sha1="afe40e67a58444bb0e91af2fb4bf375533ee491a" />
- </dataarea>
- </part>
- </software>
-
- <software name="alicwndr">
- <description>Alice in Wonderland</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234827">
- <rom name="alice in wonderland side a.woz" size="234827" crc="3823bdc3" sha1="722352b5ed1426975ac1518e8c3d378bb581f57f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234827">
- <rom name="alice in wonderland side b.woz" size="234827" crc="2d0642e8" sha1="55df9c5e6b1aa3e8233783bf3a5ee65605760919" />
- </dataarea>
- </part>
- </software>
-
- <software name="ardungn">
- <description>Alternate Reality: The Dungeon (version 2.1)</description>
- <year>1987</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234799">
- <rom name="alternate reality- the dungeon disk 1a.woz" size="234799" crc="04fcfcd2" sha1="a5eeef2f58587f933d0ee4bea455bc49d96e1895" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="235507">
- <rom name="alternate reality- the dungeon disk 1b.woz" size="235507" crc="6a8d91ba" sha1="d979a65ddb9d6f2fd3c4ce799e0700e7d82c9207" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="235507">
- <rom name="alternate reality- the dungeon disk 2.woz" size="235507" crc="b3bcca3a" sha1="0c11f3697794eaa24ad3c450f852445135e88c3b" />
- </dataarea>
- </part>
- </software>
-
- <software name="moptown">
- <description>Moptown</description>
- <year>1981</year>
- <publisher>Advanced Learning Technology</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235421">
- <rom name="moptown.woz" size="235421" crc="228f8de0" sha1="7c20f871e47b76ed12b647fc5adffcaa93f7036f" />
- </dataarea>
- </part>
- </software>
-
- <software name="spcqst2a">
- <description>Space Quest II: Vohaul's Revenge (version 2.0A, interpreter 0.089)</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234888">
- <rom name="space quest ii v2.0a disk 1a.woz" size="234888" crc="711e8349" sha1="86455e96a2695259399f59798bea24813e80db07" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 1b.woz" size="235596" crc="8374b722" sha1="3da1f035dc7eb1920969d1e10a3e47287163cf05" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 2a.woz" size="235596" crc="a29da317" sha1="ab590eb95460e713b09f5746994807cbacd8ef3a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 2b.woz" size="235596" crc="a98b53fc" sha1="a19a8dcf9ea45b127939733215a045cad8f3c2e2" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 3a.woz" size="235596" crc="4bbcd458" sha1="2469aeac61f548284111d0a5335c8982303948e4" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 3b.woz" size="235596" crc="09126b5b" sha1="97f71dc5cb6c2618aa7de7a03d67ba8246beb494" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 4a.woz" size="235596" crc="72c6e40f" sha1="57b232ae44f97a6b65fb7f401bdc2d9eb898bbca" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="235596">
- <rom name="space quest ii v2.0a disk 4b.woz" size="235596" crc="494cbd18" sha1="fd13223056eed412739c2400b1d19c6291ca05e6" />
- </dataarea>
- </part>
- </software>
-
- <software name="algpls1">
- <description>Alge-Blaster Plus! (version 1.0)</description>
- <year>1989</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-27 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program" />
- <dataarea name="flop" size="235558">
- <rom name="alge-blaster plus disk 1a - program.woz" size="235558" crc="8949439c" sha1="324a964cdc85587b58406e681b53ff6f4a34c6b5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Program" />
- <dataarea name="flop" size="235558">
- <rom name="alge-blaster plus disk 1b - program.woz" size="235558" crc="fe90af41" sha1="99c0687e3528fa68051819525d853f3364987112" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Data" />
- <dataarea name="flop" size="242211">
- <rom name="alge-blaster plus disk 2a - data.woz" size="242211" crc="9f5c5a16" sha1="90df326dae57a73c6e0026a266d4c9ea4b36d883" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Data" />
- <dataarea name="flop" size="235555">
- <rom name="alge-blaster plus disk 2b - data.woz" size="235555" crc="5ec77a0c" sha1="9e927f169102d39a1c882ca1c41755f0527ef08d" />
- </dataarea>
- </part>
- </software>
-
- <software name="iscnwtng">
- <description>Sir Isaac Newton's Games</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233765">
- <rom name="sir isaac newton's games.woz" size="233765" crc="0caba2c1" sha1="96222cfa1bdc14cc6c2c7fe3eecbde1d93cdba9f" />
- </dataarea>
- </part>
- </software>
-
- <software name="puzltnks">
- <description>Puzzle Tanks</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234788">
- <rom name="puzzle tanks.woz" size="234788" crc="75132200" sha1="d5436bc29ac35bf66f6f637e5efbd26f83f52c2b" />
- </dataarea>
- </part>
- </software>
-
- <software name="tipnflip">
- <description>Tip 'N Flip</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-07-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234782">
- <rom name="tip 'n flip.woz" size="234782" crc="d51ac3ae" sha1="b5e542b1d3855f16168979d529e703e6fabacf8f" />
- </dataarea>
- </part>
- </software>
-
- <software name="qsrtnhcl">
- <description>Return of Heracles</description>
- <year>1983</year>
- <publisher>Quality Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235508">
- <rom name="return of heracles.woz" size="235508" crc="50be7d16" sha1="24e16ab619a269e8cb47d0a3557aec1cf9c35d98" />
- </dataarea>
- </part>
- </software>
-
<software name="racemdnt">
<description>Race For Midnight</description>
<year>1981</year>
@@ -5822,21 +3037,6 @@ license:CC0-1.0
</part>
</software>
- <software name="blkmagic">
- <description>Black Magic</description>
- <year>1987</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="252868">
- <rom name="black magic.woz" size="252868" crc="9579ff50" sha1="50106741bfb8c7a78adb0b1c40b39d166509fcda" />
- </dataarea>
- </part>
- </software>
-
<software name="mablmans">
<description>Mabel's Mansion</description>
<year>1983</year>
@@ -5875,43 +3075,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tmsoflre">
- <description>Times of Lore</description>
- <year>1988</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="242144">
- <rom name="times of lore side a.woz" size="242144" crc="5e91044b" sha1="66d28dff232f1e89d94a216c7a3392576f68db25" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="242144">
- <rom name="times of lore side b.woz" size="242144" crc="37142802" sha1="59bbdacf4ead58dde5a04e0fa9ff4e8764aa86d7" />
- </dataarea>
- </part>
- </software>
-
- <software name="arctfox">
- <description>Arcticfox</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="228133">
- <rom name="arcticfox.woz" size="228133" crc="4e9db002" sha1="28e7f1d3546cdb9c78928eccbca41dfe0c4d10fd" />
- </dataarea>
- </part>
- </software>
-
<software name="injrengn">
<description>Injured Engine</description>
<year>1984</year>
@@ -5956,85 +3119,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bescape">
- <description>Escape (Bantam Publishing)</description>
- <year>1985</year>
- <publisher>Bantam Electronic Publishing</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="228079">
- <rom name="escape.woz" size="228079" crc="27a73b52" sha1="e2af6129e23aad6fb6ff9025b0694c4c9a97007f" />
- </dataarea>
- </part>
- </software>
-
- <software name="wizrdry5">
- <description>Wizardry V: Heart of the Maelstrom</description>
- <year>1988</year>
- <publisher>Sir-Tech Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - a.woz" size="234780" crc="5c670ca8" sha1="93c05e54ea21596165fb158cfcceaa595ccd38e1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - b.woz" size="234780" crc="1df4b66f" sha1="5ceb0e45e976111ad9d93a3feb1261ecd207465b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - c.woz" size="234780" crc="60381a85" sha1="68ac614ea0bc52a690d35c9c6a64d425fe775202" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - d.woz" size="234780" crc="2219894f" sha1="793a5074867136cfee53877113dcfda0c8590b6b" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk E" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - e.woz" size="234780" crc="0e3d0d38" sha1="4a8a35ea50bf55da877ada12823971c7bb6779c4" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk F" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - f.woz" size="234780" crc="f0b8294f" sha1="fbed529779a7f1dd70a416f83502dd4468c4d014" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk G" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - g.woz" size="234780" crc="90979c2d" sha1="a9a115d8f68eefadfe360bb006239fa1773633a8" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk H" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - h.woz" size="234780" crc="571539b6" sha1="5db3ef18a7a03c775b16577624af3c3ef0637b97" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk I" />
- <dataarea name="flop" size="234780">
- <rom name="wizardry v - heart of the maelstrom - i.woz" size="234780" crc="690af2ea" sha1="99fc3ba766182e331f8729672711a27b2bfe1509" />
- </dataarea>
- </part>
- </software>
-
<software name="cstlwolf">
<description>Castle Wolfenstein (1981 Version)</description>
<year>1981</year>
@@ -6081,315 +3165,6 @@ license:CC0-1.0
</part>
</software>
- <software name="batlches">
- <description>Battle Chess</description>
- <year>1990</year>
- <publisher>Interplay Productions</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234739">
- <rom name="battle chess side a.woz" size="234739" crc="2cca2ba1" sha1="091148e230f5a1a95b1195360dc852447d48951c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234739">
- <rom name="battle chess side b.woz" size="234739" crc="ca593d39" sha1="051edd15eb032897d32543fd400c564347ebacb4" />
- </dataarea>
- </part>
- </software>
-
- <software name="essex">
- <description>Essex</description>
- <year>1985</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235499">
- <rom name="essex side 1.woz" size="235499" crc="d4371622" sha1="3dd75760252ac1e87f71e9294694c6afb1f10e9a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235499">
- <rom name="essex side 2.woz" size="235499" crc="f5d88e20" sha1="8e8fe1e8499dbe11ad228b68080f9973f6379978" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="235499">
- <rom name="essex side 3.woz" size="235499" crc="8b57c044" sha1="031a2ce43a020c937447ddf1ee572d3b83dbeb36" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest">
- <description>King's Quest</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A" />
- <dataarea name="flop" size="234862">
- <rom name="king's quest - a.woz" size="234862" crc="c28ba31f" sha1="ed05892f119773d794393f94083eeb9a0f2513e7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B" />
- <dataarea name="flop" size="234862">
- <rom name="king's quest - b.woz" size="234862" crc="65c51608" sha1="6203dee86fc511ad5f90b6ada914b2b4faf368bb" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C" />
- <dataarea name="flop" size="234862">
- <rom name="king's quest - c.woz" size="234862" crc="e89d0f26" sha1="c44892bf0710b86fda0b30703170c0c16d21a2f0" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest2">
- <description>King's Quest II</description>
- <year>1985</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234882">
- <rom name="king's quest ii disk 1a.woz" size="234882" crc="86bd5fcb" sha1="e02bddc74822ccf98c0d083877d3028fa8fde80b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234882">
- <rom name="king's quest ii disk 1b.woz" size="234882" crc="40d6ecab" sha1="c014b50a459635178766d4359ac24aefd689f085" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234882">
- <rom name="king's quest ii disk 2a.woz" size="234882" crc="a9b6e810" sha1="2ae2fa2e41f91a24f2a8e2f489f991212e540c86" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234882">
- <rom name="king's quest ii disk 2b.woz" size="234882" crc="bbf45f0d" sha1="cb1e3ece4461d5bc60d0d455aa471fa51cd8d3ad" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="234882">
- <rom name="king's quest ii disk 3a.woz" size="234882" crc="6010d13f" sha1="b57c279b3f670eb029672fc4b0e9ed7926e7489f" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest3">
- <description>King's Quest III</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 1a.woz" size="235049" crc="111cb4d4" sha1="82bea99d24d98cd392ff396174b94f6229e90264" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 1b.woz" size="235049" crc="be67af31" sha1="57b75d33440252acaf4f8c3d3add3ee3be972eda" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 2a.woz" size="235049" crc="ac51874b" sha1="e97464f589f06a9fe2f4ca0e2ba4729d99cd0b43" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 2b.woz" size="235049" crc="118ad464" sha1="5bea08951c691dc3ad0676d92accc41da841e813" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 3a.woz" size="235049" crc="ee9e9fbc" sha1="928f42453b1fd1da8175430812c0b539d7437881" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 3b.woz" size="235049" crc="c4e364f5" sha1="6f5032e0e43594d9824c5052c206c7b4ace8f54d" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 4a.woz" size="235049" crc="6cb1b92d" sha1="caa862799b101c43bbd367972735573f2723bbf2" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="235757">
- <rom name="king's quest iii disk 4b.woz" size="235757" crc="91a1f537" sha1="bcf4f29b2d3bc491e6db8eaa16c7683c33b9e28e" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 5a.woz" size="235049" crc="69c4a50a" sha1="2a818840dc12538f5691e64bec3b881d2f7bcc99" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B" />
- <dataarea name="flop" size="235049">
- <rom name="king's quest iii disk 5b.woz" size="235049" crc="feb04de0" sha1="32b7fca371e61c4dd31f09bc4e43cc5bca4af1f2" />
- </dataarea>
- </part>
- </software>
-
- <software name="kquest4">
- <description>King's Quest IV</description>
- <year>1989</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 1a.woz" size="235026" crc="4637b7f9" sha1="6a4eb9ccebc0c73ab671d31ab78fde86457fe9fd" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 1b.woz" size="235026" crc="e4137905" sha1="c24b1fa30dc09ba8c75198f43afe7b2a33def2e7" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 2a.woz" size="235026" crc="cb65d66c" sha1="38458c64f2fb9ff6e714ef381b793c993521f642" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 2b.woz" size="235026" crc="d93c3201" sha1="6477eed1fcf6a5d96f72cc5b8761e1bc13164203" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 3a.woz" size="235026" crc="8ad0cf2b" sha1="a3a31bdc0cac2b78769a5d50842f623c27d7a78a" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 3b.woz" size="235026" crc="3989f6df" sha1="48222a113d3ddf2d6236d42946705d1d7f01a50c" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 4a.woz" size="235026" crc="c83c1a31" sha1="129c6a9a9a6b57afedb25015a04b72127c04182f" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 4b.woz" size="235026" crc="9ab9d5d3" sha1="2a571bea06c166ff78b9b932a6f04a763f97d3c4" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 5a.woz" size="235026" crc="4473124b" sha1="97faccf6c4c1dfcfcf9818c3e2d7c037de22efba" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 5b.woz" size="235026" crc="6d9fe4a3" sha1="23ff51e0e902afdcb4b0d5117516b354755a629a" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 6a.woz" size="235026" crc="55af5498" sha1="66664295dddd957d42fbcc336bea87e161e0c982" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 6b.woz" size="235026" crc="6a01dbbf" sha1="a8500e6269c8233d84530d2b103c5853d2d67bc7" />
- </dataarea>
- </part>
- <part name="flop13" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 7a.woz" size="235026" crc="79fa5822" sha1="65407cfe5fbbbb4b57a62236f6b37c8be3b8382a" />
- </dataarea>
- </part>
- <part name="flop14" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 7b.woz" size="235026" crc="34bbded5" sha1="8b00b42da3672676204b0fcc38db6da4effe68cb" />
- </dataarea>
- </part>
- <part name="flop15" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8 Side A" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 8a.woz" size="235026" crc="57e62367" sha1="c9d31e22986e8bf29c1463e8e396f95f7534ac65" />
- </dataarea>
- </part>
- <part name="flop16" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8 Side B" />
- <dataarea name="flop" size="235026">
- <rom name="king's quest iv disk 8b.woz" size="235026" crc="b86151c6" sha1="9180baa113f7f85c03f1a836934a69bf3dca451c" />
- </dataarea>
- </part>
- </software>
-
- <software name="msnastrd">
- <description>Mission: Asteroid</description>
- <year>1980</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235519">
- <rom name="mission asteroid.woz" size="235519" crc="2553d240" sha1="8476b22d74a18f40836d17276c9b7ebbf45567b9" />
- </dataarea>
- </part>
- </software>
-
<software name="chipwits">
<description>Chipwits</description>
<year>1985</year>
@@ -6405,28 +3180,6 @@ license:CC0-1.0
</part>
</software>
- <software name="aawarsea">
- <description>The Ancient Art of War at Sea</description>
- <year>1988</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235525">
- <rom name="the ancient art of war at sea side a.woz" size="235525" crc="d2181caa" sha1="ffb7ccf58782e8427df325715c34fe24d91a0370" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235525">
- <rom name="the ancient art of war at sea side b.woz" size="235525" crc="b75132a1" sha1="23ded0c791a7387535d2dd1aa296e76f4f2353dd" />
- </dataarea>
- </part>
- </software>
-
<software name="sokoban">
<description>Soko-Ban</description>
<year>1984</year>
@@ -6449,70 +3202,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crnsmanr">
- <description>Cranston Manor</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234780">
- <rom name="cranston manor.woz" size="234780" crc="2ec631b9" sha1="029ec6088d47359df246b1cc994966b1106883e8" />
- </dataarea>
- </part>
- </software>
-
- <software name="midmagic">
- <description>David's Midnight Magic</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-20 -->
- <!-- This re-release was part of the "Double-Pack Classics" collection that
- included Choplifter on the other side of the disk; both games were updated
- to fix model-specific compatibility issues caused by the copy protection of
- earlier releases. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241481">
- <rom name="david's midnight magic.woz" size="241481" crc="fa2f209f" sha1="a19f1c50796f2f842c87d25c27decb3b12983d20" />
- </dataarea>
- </part>
- </software>
-
- <software name="tuemorqu">
- <description>Tuesday Morning Quarterback</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234668">
- <rom name="tuesday morning quarterback.woz" size="234668" crc="a8e168d2" sha1="8b8a5d733b9fd3d763805ad4c689e02ea3a1919e" />
- </dataarea>
- </part>
- </software>
-
- <software name="hyprhdon">
- <description>Hyper Head On</description>
- <year>1980</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="109826">
- <rom name="hyper head on.woz" size="109826" crc="5c2dc661" sha1="9311e84c066de35bc695ba8bfb750ad7aaf3546f" />
- </dataarea>
- </part>
- </software>
-
<software name="chsm2100">
<description>The Fidelity Chessmaster 2100</description>
<year>1988</year>
@@ -6539,8 +3228,9 @@ license:CC0-1.0
<description>The Sands of Mars</description>
<year>1980</year>
<publisher>Crystal Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-08-25 -->
<part name="flop1" interface="floppy_5_25">
@@ -6557,80 +3247,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dogfight">
- <description>Dogfight</description>
- <year>1980</year>
- <publisher>Micro Lab</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="55197">
- <rom name="dogfight.woz" size="55197" crc="594a4c07" sha1="27e323f2e4703876ec3c9575e5d4bb29dc52abc6" />
- </dataarea>
- </part>
- </software>
-
- <software name="roachmtl">
- <description>Roach Hotel</description>
- <year>1981</year>
- <publisher>Micro Lab</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234627">
- <rom name="roach hotel.woz" size="234627" crc="bbf4609a" sha1="caaa8a1269a232e6fdcc64c8d9cdf41268839269" />
- </dataarea>
- </part>
- </software>
-
- <software name="infiltr">
- <description>Infiltrator</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234750">
- <rom name="infiltrator side a.woz" size="234750" crc="da564c27" sha1="2086d19c2a3548891f5023dd271124f5882d283b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234750">
- <rom name="infiltrator side b.woz" size="234750" crc="f5519b57" sha1="7aeee648cb7c2e6fdb85b011785da25c53900124" />
- </dataarea>
- </part>
- </software>
-
- <software name="infiltr2">
- <description>Infiltrator Part II: The Next Day</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234797">
- <rom name="infiltrator ii side a.woz" size="234797" crc="8dd56d05" sha1="06ce8a816cca9e82b310ebf1cfde4606a6bebb96" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234797">
- <rom name="infiltrator ii side b.woz" size="234797" crc="12289adc" sha1="2d4cb40975b7be1298c3e6cef4ae050fbd26a19f" />
- </dataarea>
- </part>
- </software>
-
<software name="rckyhrps">
<description>The Rocky Horror Show</description>
<year>1986</year>
@@ -6646,81 +3262,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ootopos">
- <description>Oo-Topos</description>
- <year>1986</year>
- <publisher>Polarware</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later. Double hi-res graphics are available on 128K Apple //e and later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-08-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234778">
- <rom name="oo-topos side a.woz" size="234778" crc="33b196ab" sha1="cf480173cc55613c35d201571e384733b635e402" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234778">
- <rom name="oo-topos side b.woz" size="234778" crc="b61cc239" sha1="4b2fe968e38dcf4eac71ae42893ee62aa1e753f1" />
- </dataarea>
- </part>
- </software>
-
- <software name="drgkeep">
- <description>Dragon's Keep</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234773">
- <rom name="dragon's keep.woz" size="234773" crc="a892ffa5" sha1="1e8ca3764c89be6d61dcc0dd5259d10878bb958a" />
- </dataarea>
- </part>
- </software>
-
- <software name="racter">
- <description>Racter</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235434">
- <rom name="racter - disk 1, side a.woz" size="235434" crc="941fb21b" sha1="e0547effa5dd71c1ac27bab5414ce6ce429032b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="phmpegas">
- <description>PHM Pegasus</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="228119">
- <rom name="phm pegasus side a.woz" size="228119" crc="acbbe3ee" sha1="41eefd1df1a6f9dfb2f50973bded138e8390dbeb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234775">
- <rom name="phm pegasus side b.woz" size="234775" crc="b7df1300" sha1="6ed6881d6679e60b15c3d4d51648c05e258bb231" />
- </dataarea>
- </part>
- </software>
-
<software name="crossbow">
<description>Crossbow</description>
<year>1988</year>
@@ -6743,36 +3284,6 @@ license:CC0-1.0
</part>
</software>
- <software name="snoggle">
- <description>Snoggle</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="68557">
- <rom name="snoggle.woz" size="68557" crc="e65cf748" sha1="239aa3d0aec224a759e12085c732b11fa86d9a63" />
- </dataarea>
- </part>
- </software>
-
- <software name="tredoubt">
- <description>Tawala's Last Redoubt</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235494">
- <rom name="tawala's last redoubt.woz" size="235494" crc="ade2db41" sha1="7c644a56c710fecd902f75d5a4e32dd3c7176825" />
- </dataarea>
- </part>
- </software>
-
<software name="successn">
<description>Succession</description>
<year>1982</year>
@@ -6832,263 +3343,6 @@ license:CC0-1.0
</part>
</software>
- <software name="olemerld">
- <description>Olin in Emerald</description>
- <year>1984</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235529">
- <rom name="olin in emerald side a.woz" size="235529" crc="4c7e5d67" sha1="54f67c52d62736eb7b9b46de1ce692de7349e1ed" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235529">
- <rom name="olin in emerald side b.woz" size="235529" crc="6a3673d7" sha1="3785eeff9cd0c43f5a31961c869994160e016420" />
- </dataarea>
- </part>
- </software>
-
- <software name="carrwar">
- <description>Carriers at War</description>
- <year>1984</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Master disk" />
- <dataarea name="flop" size="235556">
- <rom name="carriers at war disk 1a - master disk.woz" size="235556" crc="8cbe8c7e" sha1="0ac90558dbcac13f25be891421ea94dcc5df5dfb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Scenario disk" />
- <dataarea name="flop" size="235558">
- <rom name="carriers at war disk 1b - scenario disk.woz" size="235558" crc="7584231b" sha1="57698d71527b6dfea861d7cb9c6c8fcf003ee84e" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Backup scenario disk 1" />
- <dataarea name="flop" size="235567">
- <rom name="carriers at war disk 2a - backup scenario disk 1.woz" size="235567" crc="2bf0f8db" sha1="e773d5a53e270550f4a85e67ad48dcfafc4bd4d4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Backup scenario disk 2" />
- <dataarea name="flop" size="235567">
- <rom name="carriers at war disk 2b - backup scenario disk 2.woz" size="235567" crc="d2effe61" sha1="b23daea23ffc932504c43fe37c2adb7c3d0916e5" />
- </dataarea>
- </part>
- </software>
-
- <software name="eurablaz">
- <description>Europe Ablaze</description>
- <year>1985</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Master disk" />
- <dataarea name="flop" size="235594">
- <rom name="europe ablaze disk 1a - master disk.woz" size="235594" crc="44a5cfb8" sha1="f0abd95b4a037d109f790cf7a6e4d7a782009f83" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Scenario disk" />
- <dataarea name="flop" size="235596">
- <rom name="europe ablaze disk 1b - scenario disk.woz" size="235596" crc="044db361" sha1="a5097a867dcac055ff578af624cfd0da8530ad4a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Backup master disk" />
- <dataarea name="flop" size="242257">
- <rom name="europe ablaze disk 2a - backup master disk.woz" size="242257" crc="50116792" sha1="3db001af13709b2f161a9d33f50566e00c6eb585" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Backup scenario disk" />
- <dataarea name="flop" size="235619">
- <rom name="europe ablaze disk 2b - backup scenario disk.woz" size="235619" crc="0af563cc" sha1="d7ea4a13ccbd14f024c8e1ce4106986c07a7899e" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A - Save game disk A" />
- <dataarea name="flop" size="235599">
- <rom name="europe ablaze disk 3a - save game disk a.woz" size="235599" crc="ef7da412" sha1="f500d16e1836a8e40d3688db9421b7ff5d935591" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B - Save game disk B" />
- <dataarea name="flop" size="235599">
- <rom name="europe ablaze disk 3b - save game disk b.woz" size="235599" crc="f4262c8c" sha1="63135a79b8d1fa1287e5a155daa955de165c7325" />
- </dataarea>
- </part>
- </software>
-
- <software name="halmonte">
- <description>Halls of Montezuma</description>
- <year>1987</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235618">
- <rom name="halls of montezuma side a - master disk.woz" size="235618" crc="f865f618" sha1="938ce204ad17633eb0deb605dfb2706a35e7449a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235625">
- <rom name="halls of montezuma side b - scenario disk.woz" size="235625" crc="87f2a672" sha1="8599ce6465b1cd2c2415994701ae9b86e3116626" />
- </dataarea>
- </part>
- </software>
-
- <software name="panzbatl">
- <description>Panzer Battles</description>
- <year>1989</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235542">
- <rom name="panzer battles side a - master disk.woz" size="235542" crc="e81f710a" sha1="c901fb39218ec5468cc68e4c233c784040521764" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235544">
- <rom name="panzer battles side b - scenario disk.woz" size="235544" crc="278a2f66" sha1="417d01bb1848330a8937ddc7d2c2def5141bfbe5" />
- </dataarea>
- </part>
- </software>
-
- <software name="rchstr10">
- <description>Reach For The Stars (version 1.0)</description>
- <year>1983</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235510">
- <rom name="reach for the stars 1.0.woz" size="235510" crc="f6caa5eb" sha1="06143a70901ab2a95a2bf710aed64aeaa19c1556" />
- </dataarea>
- </part>
- </software>
-
- <software name="rchstr20">
- <description>Reach For The Stars (version 2.0)</description>
- <year>1985</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235491">
- <rom name="reach for the stars 2.0.woz" size="235491" crc="dcd74f46" sha1="5fd29a712756defba5248e551337e27f4f6c876d" />
- </dataarea>
- </part>
- </software>
-
- <software name="rchstr30">
- <description>Reach For The Stars (version 3.0)</description>
- <year>1988</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235534">
- <rom name="reach for the stars 3.0.woz" size="235534" crc="47b16069" sha1="338d0da131221de56a06a99ed3d1cb7398ab6152" />
- </dataarea>
- </part>
- </software>
-
- <software name="ssrussia">
- <description>Russia</description>
- <year>1987</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235565">
- <rom name="russia side a - master disk.woz" size="235565" crc="2d46ec6c" sha1="f86b1ea2442471c67af3ef01a8795c8b4a0b68c3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235567">
- <rom name="russia side b - scenario disk.woz" size="235567" crc="c2a0be04" sha1="406f8cb153a3bc0be2d3d5df896439b77928c18f" />
- </dataarea>
- </part>
- </software>
-
- <software name="dbotcwv1">
- <description>Decisive Battles of the American Civil War: Volume One</description>
- <year>1987</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235614">
- <rom name="decisive battles of the american civil war volume one side a - master disk.woz" size="235614" crc="a9fa93b5" sha1="0836338d695e7adbaee4ca8eaa8773c7e60280de" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235616">
- <rom name="decisive battles of the american civil war volume one side b - scenario disk.woz" size="235616" crc="c670da9f" sha1="b27e92a68f43861e0054b79e03805b4bbf3e2fc9" />
- </dataarea>
- </part>
- </software>
-
- <software name="batlfrnt">
- <description>Battlefront</description>
- <year>1986</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235566">
- <rom name="battlefront side a - master disk.woz" size="235566" crc="7cd8b98f" sha1="084932f545aef9937a78b29b133e42f9d00f5e3a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235568">
- <rom name="battlefront side b - scenario disk.woz" size="235568" crc="ac27d934" sha1="1a3126d7b7e8bbf37b68744adf374a80d30fe0a1" />
- </dataarea>
- </part>
- </software>
-
<software name="oilrig">
<description>Oil Rig</description>
<year>1981</year>
@@ -7104,164 +3358,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mlkdsdsk">
- <description>Muppet Learning Keys: The Muppet Discovery Disk</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235513">
- <rom name="muppet learning keys- the muppet discovery disk.woz" size="235513" crc="0032f3a8" sha1="0d9d9bb049071262d9246e766631c509a7266de0" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsl1">
- <description>Leisure Suit Larry in The Land of The Lounge Lizards</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234888">
- <rom name="leisure suit larry in the land of the lounge lizards disk 1a.woz" size="234888" crc="a1de126d" sha1="44232e6c20a9e68f72c2c7629ff83c2dc99f79d6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="235596">
- <rom name="leisure suit larry in the land of the lounge lizards disk 1b.woz" size="235596" crc="09f704cb" sha1="745360380088aa61fd056259e37feb1df9b9758c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="235596">
- <rom name="leisure suit larry in the land of the lounge lizards disk 2a.woz" size="235596" crc="effd0ae7" sha1="c38c74c059cf063887bb74a0af4ed8e6dc682b54" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="235596">
- <rom name="leisure suit larry in the land of the lounge lizards disk 2b.woz" size="235596" crc="02985a4a" sha1="3c564f9b14cf397796e3b9fd41490281b0e6200f" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="235596">
- <rom name="leisure suit larry in the land of the lounge lizards disk 3a.woz" size="235596" crc="1463b109" sha1="32f48c48e87fe716de1db5cfd1b52694a4fe2750" />
- </dataarea>
- </part>
- </software>
-
- <software name="idamiano">
- <description>I, Damiano</description>
- <year>1985</year>
- <publisher>Bantam Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235569">
- <rom name="i, damiano side a.woz" size="235569" crc="1f262c40" sha1="ea5a0fb44124bb89a0f7e6502a136dd24c5d30a0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235589">
- <rom name="i, damiano side b.woz" size="235589" crc="a8634aba" sha1="70870265ac476bece35fc5bb2415ab2b30523d54" />
- </dataarea>
- </part>
- </software>
-
- <software name="crmstopr">
- <description>Crime Stopper</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="242146">
- <rom name="crime stopper.woz" size="242146" crc="a3f353f8" sha1="9bafc69292e39aebf5fcf253ffcd34cb02ed669f" />
- </dataarea>
- </part>
- </software>
-
- <software name="dbotcwv2">
- <description>Decisive Battles of the American Civil War: Volume Two</description>
- <year>1988</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235578">
- <rom name="decisive battles of the american civil war volume two side a - master disk.woz" size="235578" crc="30c483b9" sha1="cbb8bda5723def98ca183646c695d532e1461d18" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235580">
- <rom name="decisive battles of the american civil war volume two side b - scenario disk.woz" size="235580" crc="6a2bf6ce" sha1="7eff676e25d0c96d5af5b556ff4994bd8947ac29" />
- </dataarea>
- </part>
- </software>
-
- <software name="dbotcwv3">
- <description>Decisive Battles of the American Civil War: Volume Three</description>
- <year>1988</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235625">
- <rom name="decisive battles of the american civil war volume three side a - master disk.woz" size="235625" crc="8f7aed91" sha1="ad584617e8deea0dac7a648411942345f9ece676" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235627">
- <rom name="decisive battles of the american civil war volume three side b - scenario disk.woz" size="235627" crc="1ce9edc5" sha1="3f8e1c8ca03eefa1c46b881fe0b566e7a2b96162" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcarthwr">
- <description>MacArthur's War</description>
- <year>1988</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-09-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master disk" />
- <dataarea name="flop" size="235581">
- <rom name="macarthur's war side a - master disk.woz" size="235581" crc="5ee7a50e" sha1="0e35c7de38ad3c1ddfdce482d6d69066daf9992f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Scenario disk" />
- <dataarea name="flop" size="235583">
- <rom name="macarthur's war side b - scenario disk.woz" size="235583" crc="fdf61a37" sha1="920b47a8875102e61fd9891cf887cfd4bbdb86f5" />
- </dataarea>
- </part>
- </software>
-
<software name="tapper">
<description>Tapper</description>
<year>1984</year>
@@ -7292,28 +3388,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wntgames">
- <description>Winter Games</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235443">
- <rom name="winter games side a.woz" size="235443" crc="f4efaabf" sha1="b48d6598ca98a213a39a6d65827e63020092481d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235443">
- <rom name="winter games side b.woz" size="235443" crc="c27d43fa" sha1="8e79d61971ad57c919e3b691c9a3d8999e4fbac7" />
- </dataarea>
- </part>
- </software>
-
<software name="aplstinv">
<description>Apple Stellar Invaders</description>
<year>1980</year>
@@ -7329,95 +3403,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ulysgflc">
- <description>Ulysses and the Golden Fleece</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="242146">
- <rom name="ulysses and the golden fleece side a.woz" size="242146" crc="21d6194d" sha1="86ef1ae8cbeb738c9167adefbbc87a85ed5f7615" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235510">
- <rom name="ulysses and the golden fleece side b.woz" size="235510" crc="7168c183" sha1="e5b2b512c68a98ee4d436acaeaab33aa4e5798b9" />
- </dataarea>
- </part>
- </software>
-
- <software name="simlineq">
- <description>Simultaneous Linear Equations</description>
- <year>1984</year>
- <publisher>Microcomputer Workshops</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="252755">
- <rom name="simultaneous linear equations.woz" size="252755" crc="de565e61" sha1="6f11ae0b7b74e130503cea4a347b662db6fdc9b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="covetmir">
- <description>The Coveted Mirror (1985 Polarware Re-release)</description>
- <year>1985</year>
- <publisher>Polarware</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later. The optional double hi-res graphics mode requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234878">
- <rom name="the coveted mirror 2.0 side a.woz" size="234878" crc="c8f37420" sha1="3409d2d539e5b24217e512e0f4d379a4a12ed4a5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B (Boot disk)" />
- <dataarea name="flop" size="234878">
- <rom name="the coveted mirror 2.0 side b (boot).woz" size="234878" crc="bb03d3d6" sha1="00570626b8b6ebf5ab04185744704f13a0af8b97" />
- </dataarea>
- </part>
- </software>
-
- <software name="alibi">
- <description>Alibi</description>
- <year>1981</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="248803">
- <rom name="alibi.woz" size="248803" crc="12ac7a0b" sha1="38e38af85103b666b8d610a18d18ccd344a4a302" />
- </dataarea>
- </part>
- </software>
-
- <software name="reversal">
- <description>Reversal</description>
- <year>1980</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 32K Apple II or later. May need a 48K Apple ][+ or later with emulation." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234813">
- <rom name="reversal.woz" size="234813" crc="ec850ca7" sha1="e6726b394b80467052b698c6c71941dd569082e5" />
- </dataarea>
- </part>
- </software>
-
<software name="hntpalac">
<description>The Haunted Palace</description>
<year>1982</year>
@@ -7440,65 +3425,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sherhlms">
- <description>Sherlock Holmes in Another Bow</description>
- <year>1985</year>
- <publisher>Bantam Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235540">
- <rom name="sherlock holmes in another bow side a.woz" size="235540" crc="1732e581" sha1="09700ab41f161d7ae85dce73d6caaed2dbf84cdb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235560">
- <rom name="sherlock holmes in another bow side b.woz" size="235560" crc="9a3f6312" sha1="ee2a62b36982f5a09c81d353f0aebf6ded2123dc" />
- </dataarea>
- </part>
- </software>
-
- <software name="dogfght2">
- <description>Dogfight II</description>
- <year>1981</year>
- <publisher>Micro Lab</publisher>
- <info name="usage" value="Requires a 48K Apple II or Apple II+. Due to compatibility issues created by the copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P" />
- <!-- Dump released: 2019-10-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="188158">
- <rom name="dogfight ii.woz" size="188158" crc="789c1c34" sha1="234fb379e91e741c7533d65e01f65547d942432d" />
- </dataarea>
- </part>
- </software>
-
- <software name="masksun">
- <description>The Mask of the Sun (version 2.1)</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234816">
- <rom name="the mask of the sun v2.1 side a.woz" size="234816" crc="6f53a1a8" sha1="be0a62cac5e1b658b531a3a72e081be38bb3f50f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234816">
- <rom name="the mask of the sun v2.1 side b.woz" size="234816" crc="74c541b4" sha1="2e8b846c425685718135391fdbb16ce53cacaa06" />
- </dataarea>
- </part>
- </software>
-
<software name="pulsar2">
<description>Pulsar ][</description>
<year>1981</year>
@@ -7514,43 +3440,6 @@ license:CC0-1.0
</part>
</software>
- <software name="gauntlet">
- <description>Gauntlet</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later. This was released with several different copy protections; this version was protected with the E7 bitstream. Game code and data is identical to other protected variants." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-19 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235440">
- <rom name="gauntlet side a.woz" size="235440" crc="adcde10f" sha1="ac3bf5d9d37e76d286188a35dbcbfbf4b4977640" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="235440">
- <rom name="gauntlet side b.woz" size="235440" crc="2a6a240f" sha1="6279fc79ce45a7df2d506a8c47223c506f725c2d" />
- </dataarea>
- </part>
- </software>
-
- <software name="gohayden">
- <description>Go (Hayden)</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234775">
- <rom name="go.woz" size="234775" crc="aa3a005d" sha1="d96d7d67c1a2f664735f412c25229b91306cd5bf" />
- </dataarea>
- </part>
- </software>
-
<software name="gbusters">
<description>Ghostbusters</description>
<year>1984</year>
@@ -7596,50 +3485,6 @@ license:CC0-1.0
</part>
</software>
- <software name="eqsf1906">
- <description>Earthquake: San Francisco 1906</description>
- <year>1982</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A (Boot)" />
- <dataarea name="flop" size="228182">
- <rom name="earthquake - san francisco 1906 side a (boot).woz" size="228182" crc="bef86d69" sha1="6a866918312becdf7a12a0dceecf4fe892015768" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234838">
- <rom name="earthquake - san francisco 1906 side b.woz" size="234838" crc="9b235ebd" sha1="979a55d9e0353f4e19bb9c051a4718e27b35afb4" />
- </dataarea>
- </part>
- </software>
-
- <software name="ijtmepdm">
- <description>Indiana Jones and the Temple of Doom</description>
- <year>1989</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234774">
- <rom name="indiana jones and the temple of doom side a.woz" size="234774" crc="b2fd5a62" sha1="825cfc98c220a58a5bcc4a9d48c584bd5c8ddb2a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234774">
- <rom name="indiana jones and the temple of doom side b.woz" size="234774" crc="887d8284" sha1="a8d3fd906e10e7deddf33d8ec0b5b95e3c504d84" />
- </dataarea>
- </part>
- </software>
-
<software name="ltlcmppl">
<description>Little Computer People</description>
<year>1985</year>
@@ -7677,21 +3522,6 @@ license:CC0-1.0
</part>
</software>
- <software name="vidvegas">
- <description>Video Vegas (version 12501)</description>
- <year>1985</year>
- <publisher>Baudville</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234702">
- <rom name="video vegas.woz" size="234702" crc="f47a8783" sha1="2b8e0f911b4a98f0b0f009e2508c4e0a348736bd" />
- </dataarea>
- </part>
- </software>
-
<software name="phmdrock">
<description>Physics of Model Rocketry</description>
<year>1987</year>
@@ -7714,26 +3544,11 @@ license:CC0-1.0
</part>
</software>
- <software name="howwest">
- <description>How The West Was One + Three x Four</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235513">
- <rom name="how the west was one + three x four.woz" size="235513" crc="d9222021" sha1="101db6d0c3f8ccd627522abc353e7e79a57204db" />
- </dataarea>
- </part>
- </software>
-
<software name="deadlr26">
<description>Deadline (Release 26 / 821108)</description>
<year>1982</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-10-30 -->
@@ -7805,27 +3620,13 @@ license:CC0-1.0
</part>
</software>
- <software name="rlmimpos">
- <description>Realm of Impossibility</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-10-31 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="228113">
- <rom name="realm of impossibility.woz" size="228113" crc="58ac103e" sha1="0373968235eae4a9a8e4381c635e2a01eefa7ed7" />
- </dataarea>
- </part>
- </software>
-
<software name="appiledu">
<description>Appilot Edu-Disk</description>
<year>1978</year>
<publisher>MUSE Software</publisher>
- <info name="usage" value="Requires an Apple II with Integer BASIC ROM and at least 32K. Due to reliance on Integer ROM, it will not run on later models." />
+ <info name="usage" value="Requires an Apple ][ with Integer BASIC ROM and at least 32K. Due to reliance on Integer ROM, it will not run on later models." />
<sharedfeat name="compatibility" value="A2" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-11-01 -->
<part name="flop1" interface="floppy_5_25">
@@ -7865,6 +3666,7 @@ license:CC0-1.0
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="242161">
<rom name="pharaoh's revenge side b (boot).woz" size="242161" crc="9bb62483" sha1="c45c93711ad545687dae142e7505c5bff1c001d8" />
</dataarea>
@@ -7875,8 +3677,9 @@ license:CC0-1.0
<description>MicroChess (version 2.0)</description>
<year>1978</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 16K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 16K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-11-09 -->
<part name="flop1" interface="floppy_5_25">
@@ -7890,8 +3693,9 @@ license:CC0-1.0
<description>Checker King</description>
<year>1979</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 16K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 16K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-11-09 -->
<part name="flop1" interface="floppy_5_25">
@@ -7905,8 +3709,9 @@ license:CC0-1.0
<description>Gammon Gambler</description>
<year>1979</year>
<publisher>Personal Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 24K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 24K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-11-09 -->
<part name="flop1" interface="floppy_5_25">
@@ -7916,27 +3721,13 @@ license:CC0-1.0
</part>
</software>
- <software name="blmurder">
- <description>Bloody Murder</description>
- <year>1979</year>
- <publisher>Stoneware</publisher>
- <info name="usage" value="Requires an original Apple II with 48K and Integer BASIC in ROM." />
- <sharedfeat name="compatibility" value="A2" />
- <!-- Dump released: 2019-11-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="bloody murder.woz" size="234791" crc="647975ac" sha1="f6e5ad2dc64dd040f10d861c2c7c7af9268130ff" />
- </dataarea>
- </part>
- </software>
-
<software name="bestmuse">
<description>The Best of MUSE</description>
<year>1980</year>
<publisher>MUSE Software</publisher>
- <info name="usage" value="Requires an original Apple II with 32K and Integer BASIC in ROM." />
+ <info name="usage" value="Requires an Apple ][ with 32K and Integer BASIC in ROM." />
<sharedfeat name="compatibility" value="A2" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-11-12 -->
<part name="flop1" interface="floppy_5_25">
@@ -7950,8 +3741,9 @@ license:CC0-1.0
<description>Beneath The Pyramids</description>
<year>1980</year>
<publisher>Crystalware</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2019-11-12 -->
<part name="flop1" interface="floppy_5_25">
@@ -7961,48 +3753,11 @@ license:CC0-1.0
</part>
</software>
- <software name="aiasterd">
- <description>Asteroid</description>
- <year>1980</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234776">
- <rom name="asteroid.woz" size="234776" crc="48edee28" sha1="d3f67ba5f93d134dce711229039aa771a112155c" />
- </dataarea>
- </part>
- </software>
-
- <software name="rdwr2k11">
- <description>Roadwar 2000 (version 1.1)</description>
- <year>1986</year>
- <publisher>Strategic Simulations, Inc</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="242138">
- <rom name="roadwar 2000 v1.1 side a.woz" size="242138" crc="b736b731" sha1="209f6e08fc2ea20f496668dab3e3f42b70dcc39b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="241455">
- <rom name="roadwar 2000 v1.1 side b.woz" size="241455" crc="c01131ed" sha1="917e8ace92e9422641a78ad088e1d7990c329c56" />
- </dataarea>
- </part>
- </software>
-
<software name="a2fs1">
<description>Flight Simulator I (A2-FS1)</description>
<year>1980</year>
<publisher>subLOGIC</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-11-16 -->
@@ -8013,28 +3768,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lordconq">
- <description>Lords of Conquest</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="228156">
- <rom name="lords of conquest side a.woz" size="228156" crc="e7e05231" sha1="a4a36db90cda59a64a7baac4c03d665926c351a0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234812">
- <rom name="lords of conquest side b.woz" size="234812" crc="de46bf70" sha1="1a53fa03180075727451c56326a4deb1d2c363bb" />
- </dataarea>
- </part>
- </software>
-
<software name="emp3arma">
<description>Empire III: Armageddon (version 1.1)</description>
<year>1983</year>
@@ -8154,70 +3887,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ijrota">
- <description>Indiana Jones in Revenge of the Ancients</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234798">
- <rom name="indiana jones in revenge of the ancients.woz" size="234798" crc="b58ce72d" sha1="ff13f521914dd209cacd3416c0bbbec19e79f713" />
- </dataarea>
- </part>
- </software>
-
- <software name="krift">
- <description>Koronis Rift</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234737">
- <rom name="koronis rift.woz" size="234737" crc="657888ad" sha1="97f86d1d2b7bc39c86f81cc6c3adf6528c19e81b" />
- </dataarea>
- </part>
- </software>
-
- <software name="tantales">
- <description>Tangled Tales</description>
- <year>1989</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Boot" />
- <dataarea name="flop" size="234868">
- <rom name="tangled tales disk 1a - boot.woz" size="234868" crc="079c0226" sha1="505a512df0a5f36115cd2eac0d092bd9a5d7518c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Adventure 3" />
- <dataarea name="flop" size="234868">
- <rom name="tangled tales disk 1b - adventure 3.woz" size="234868" crc="cd208f55" sha1="8b1fc202a9878fc0c7e5f356d78b270891a416c8" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Adventure 1" />
- <dataarea name="flop" size="234868">
- <rom name="tangled tales disk 2a - adventure 1.woz" size="234868" crc="1fbdee91" sha1="813f0033b3242387542caab350dc687c57764333" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Adventure 2" />
- <dataarea name="flop" size="234868">
- <rom name="tangled tales disk 2b - adventure 2.woz" size="234868" crc="c03b8ec4" sha1="ebaf93937fd0dae6a85ea410fc9547aa82867a6c" />
- </dataarea>
- </part>
- </software>
-
<software name="nordbert">
<description>Nord and Bert Couldn't Make Head or Tail of It (Release 19 / 870722)</description>
<year>1987</year>
@@ -8247,7 +3916,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2019-11-26 -->
- <!-- The password to read the handbook in-game is SESAME.-->
+ <!-- The password to read the handbook in-game is SESAME. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234793">
@@ -8256,70 +3925,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dinodayp">
- <description>Dinosaur Days Plus!</description>
- <year>1988</year>
- <publisher>Pelican Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program" />
- <dataarea name="flop" size="242157">
- <rom name="dinosaur days plus disk 1a - program.woz" size="242157" crc="f728b2e8" sha1="2b424a4b6d9b7dd55b3ea57ef25cda030185ca09" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Program" />
- <dataarea name="flop" size="242157">
- <rom name="dinosaur days plus disk 1b - program.woz" size="242157" crc="13f62316" sha1="5625f28455880a93f83f4a777605133f88a9dab2" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Graphics database" />
- <dataarea name="flop" size="242166">
- <rom name="dinosaur days plus disk 2a - graphics database.woz" size="242166" crc="31eb42c4" sha1="e154aec0d97913b9cede4b4e0a7c42b89db50f88" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Graphics database" />
- <dataarea name="flop" size="242166">
- <rom name="dinosaur days plus disk 2b - graphics database.woz" size="242166" crc="317fd228" sha1="cf19f2fb9a8bdd393465508eea23da8945e15319" />
- </dataarea>
- </part>
- </software>
-
- <software name="nysiwit">
- <description>Now You See It, Now You Don't - Was it there? Was it missing?</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-11-30 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241348">
- <rom name="now you see it, now you don't - was it there - was it missing.woz" size="241348" crc="a7e51505" sha1="9aacdba6d7067cb8062336a177d7721203715dc9" />
- </dataarea>
- </part>
- </software>
-
- <software name="eaglnest">
- <description>Into The Eagle's Nest</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241445">
- <rom name="into the eagle's nest.woz" size="241445" crc="65eb8066" sha1="0555eb4c26b06ad98f520ad205f15b13d033242d" />
- </dataarea>
- </part>
- </software>
-
<software name="ecosim2">
<description>Ecology Simulations II</description>
<year>1979</year>
@@ -8335,79 +3940,6 @@ license:CC0-1.0
</part>
</software>
- <software name="thrilogy">
- <description>Thrilogy</description>
- <year>1980</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires an original Apple II with 48K and Integer BASIC in ROM." />
- <sharedfeat name="compatibility" value="A2" />
- <!-- Dump released: 2019-12-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234787">
- <rom name="thrilogy.woz" size="234787" crc="ea5dabec" sha1="96eacd29aac4e1c4f7fb7cd36ad62e5f8b360909" />
- </dataarea>
- </part>
- </software>
-
- <software name="spcquest">
- <description>Space Quest: The Sarien Encounter</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 1a.woz" size="234865" crc="81c67f99" sha1="09b7a3f594deeab5aeea1ad35f6fca4b65d08eca" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 1b.woz" size="234865" crc="76b0499f" sha1="2924d85702b43ed05610961d2c6f0a96b9f59c2b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 2a.woz" size="234865" crc="3fcb9942" sha1="d4d9ba684109086c82d8ab2d6112337f523bb046" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 2b.woz" size="234865" crc="2ff225c1" sha1="437b75a0781da96e477093d61e98fed88edb8554" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 3a.woz" size="234865" crc="2c1f654c" sha1="4621fa85bb2c82d103d66225382a4d78bfd44a97" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 3b.woz" size="234865" crc="303bc684" sha1="13f7e97ac1b9de79ae0d5c2034cfb0689be40f09" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 4a.woz" size="234865" crc="ccfdac78" sha1="a414e236d18a223fa63594db1483c9dec988c850" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="234865">
- <rom name="space quest disk 4b.woz" size="234865" crc="f4ccb762" sha1="1455fed9e6b87a65ec0ffcbc48527bd94d4f99dd" />
- </dataarea>
- </part>
- </software>
-
<software name="portal">
<description>Portal</description>
<year>1986</year>
@@ -8454,34 +3986,6 @@ license:CC0-1.0
</part>
</software>
- <software name="eostatn">
- <description>Earth Orbit Stations</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Game disk" />
- <dataarea name="flop" size="228132">
- <rom name="earth orbit stations disk 1 game disk.woz" size="228132" crc="3b1205cd" sha1="5ef6c82a865c0745878c99961a28b97e8f276d00" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Archive disk" />
- <dataarea name="flop" size="234791">
- <rom name="earth orbit stations disk 2a archive disk.woz" size="234791" crc="c86b1340" sha1="3cdbac14d51c7a89353243ce57101f89b582a665" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Mission disk" />
- <dataarea name="flop" size="234791">
- <rom name="earth orbit stations disk 2b mission disk.woz" size="234791" crc="0d01aa81" sha1="81f03a9308daa27cc8e7a5d0651cdbe36ad4c16a" />
- </dataarea>
- </part>
- </software>
-
<software name="advent">
<description>Adventure</description>
<year>1980</year>
@@ -8564,27 +4068,13 @@ license:CC0-1.0
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
<dataarea name="flop" size="234814">
<rom name="the hunt for red october side b (boot).woz" size="234814" crc="d37c8b65" sha1="9d2c0caffb1999f987954a4337232ad68fee1135" />
</dataarea>
</part>
</software>
- <software name="galattk">
- <description>Galactic Attack</description>
- <year>1980</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234790">
- <rom name="galactic attack.woz" size="234790" crc="013efc71" sha1="68975194ff1b597ed4e2773649bb8880d050a1cd" />
- </dataarea>
- </part>
- </software>
-
<software name="journey">
<description>Journey (version 16)</description>
<year>1989</year>
@@ -8625,67 +4115,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sthcmnd">
- <description>Southern Command</description>
- <year>1981</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234863">
- <rom name="southern command.woz" size="234863" crc="e04bb52c" sha1="bc53a1a66fc347859c17238a28b3bd4a8b178739" />
- </dataarea>
- </part>
- </software>
-
- <software name="wizrdry4">
- <description>Wizardry IV: The Return of Werdna</description>
- <year>1987</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234833">
- <rom name="wizardry iv - the return of werdna side a.woz" size="234833" crc="0c6ac6a0" sha1="f465fb3b88eb38c197e24da1ae1962f6d0a58cd9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234833">
- <rom name="wizardry iv - the return of werdna side b.woz" size="234833" crc="179d1324" sha1="7bff6956d76129cc82d5e5ac6ba30d8806054bdf" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C" />
- <dataarea name="flop" size="234833">
- <rom name="wizardry iv - the return of werdna side c.woz" size="234833" crc="0493f3d5" sha1="22efb911669d42525a8e8ab35b2a34ca5ef2fdbd" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D" />
- <dataarea name="flop" size="234833">
- <rom name="wizardry iv - the return of werdna side d.woz" size="234833" crc="897eb0dc" sha1="21f4d0bd66d9d3a275678dbfc7cabb0cc023910f" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Side E" />
- <dataarea name="flop" size="234833">
- <rom name="wizardry iv - the return of werdna side e.woz" size="234833" crc="0fd25eba" sha1="eb07e89850635da688a5aa1d372eebbc19594c9e" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Side F" />
- <dataarea name="flop" size="234833">
- <rom name="wizardry iv - the return of werdna side f.woz" size="234833" crc="3a8a7986" sha1="a2684a58605af6ddbd6554bc99333ab3947dd4e9" />
- </dataarea>
- </part>
- </software>
-
<software name="arthurqe">
<description>Arthur: The Quest for Excalibur (version 17)</description>
<year>1989</year>
@@ -8726,90 +4155,6 @@ license:CC0-1.0
</part>
</software>
- <software name="brdstale">
- <description>The Bard's Tale</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Boot disk" />
- <dataarea name="flop" size="228117">
- <rom name="the bard's tale - boot disk.woz" size="228117" crc="ca391217" sha1="2965afea19b022330efdc4c4be3890f7558018d9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Character disk" />
- <dataarea name="flop" size="234773">
- <rom name="the bard's tale - character disk.woz" size="234773" crc="92e2f239" sha1="1f1967c425c64118addb3d8bae0e2821259d4b89" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Dungeon disk" />
- <dataarea name="flop" size="234773">
- <rom name="the bard's tale - dungeon disk.woz" size="234773" crc="b9099a69" sha1="45c9eb7161bc5c71fdbe2fc5c2ef99002cc81fed" />
- </dataarea>
- </part>
- </software>
-
- <software name="advconst">
- <description>Adventure Construction Set</description>
- <year>1985</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="228148">
- <rom name="adventure construction set disk 1a.woz" size="228148" crc="022a20bc" sha1="5594992d7ffeaeb01f74f9c37ba2456a86526a9c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234811">
- <rom name="adventure construction set disk 1b.woz" size="234811" crc="2adc0181" sha1="f2d67823dd388d908b54ed3a369aa75afaf438dc" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234801">
- <rom name="adventure construction set disk 2a.woz" size="234801" crc="fa373c36" sha1="9c415fbfa4ecb4dc99b17f58f0846c3c744d77f2" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234808">
- <rom name="adventure construction set disk 2b.woz" size="234808" crc="60c30a5e" sha1="fabefc06dd40ef79952a4f099b1cad70b386b02e" />
- </dataarea>
- </part>
- </software>
-
- <software name="artowar">
- <description>The Ancient Art of War</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-18 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234786">
- <rom name="the ancient art of war side a.woz" size="234786" crc="eeb41109" sha1="d3310c0abb88c1c51df4982eeb6c32f2844f2a77" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234786">
- <rom name="the ancient art of war side b.woz" size="234786" crc="86261140" sha1="6e5e4a0b030f83ecd0f0939b166a0b9ff57e8e0a" />
- </dataarea>
- </part>
- </software>
-
<software name="borg">
<description>Borg</description>
<year>1981</year>
@@ -8849,73 +4194,6 @@ license:CC0-1.0
</part>
</software>
- <software name="alpenctr">
- <description>The Alpine Encounter</description>
- <year>1993</year>
- <publisher>Random House</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234802">
- <rom name="the alpine encounter side a.woz" size="234802" crc="1c919d52" sha1="3b0b47c40b52f3d4d501564145bc6b56b02d7b02" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234802">
- <rom name="the alpine encounter side b.woz" size="234802" crc="21f25d7c" sha1="aecb717cd980a5a63a0252d194d303c9d2836f1f" />
- </dataarea>
- </part>
- </software>
-
- <software name="grglobge">
- <description>Green Globs and Graphing Equations</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234834">
- <rom name="green globs and graphing equations.woz" size="234834" crc="1ad7bc19" sha1="e27ca259bb83d91853d2f0e136f5de735e8b5d28" />
- </dataarea>
- </part>
- </software>
-
- <software name="sbgears">
- <description>Gears</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234800">
- <rom name="gears.woz" size="234800" crc="8cd3cfc1" sha1="184d0e74d8fe357706d5d6a995557f1d960b1810" />
- </dataarea>
- </part>
- </software>
-
- <software name="intrgrph">
- <description>Interpreting Graphs</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234815">
- <rom name="interpreting graphs.woz" size="234815" crc="8406f7d9" sha1="92846ac3a0d8516f86a50cb5fb23f19edb467e57" />
- </dataarea>
- </part>
- </software>
-
<software name="dwbatrup">
<description>Dave Winfield's Batter Up!</description>
<year>1985</year>
@@ -8938,51 +4216,6 @@ license:CC0-1.0
</part>
</software>
- <software name="dqhfwv1">
- <description>Dunjonquest: Hellfire Warrior (version 1)</description>
- <year>1980</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234830">
- <rom name="dunjonquest - hellfire warrior v1.woz" size="234830" crc="e50e2f5e" sha1="06aeeb9fda26ba4e7d0803413d8da5d4fe3917bb" />
- </dataarea>
- </part>
- </software>
-
- <software name="dqhfwv2">
- <description>Dunjonquest: Hellfire Warrior (version 2)</description>
- <year>1980</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234803">
- <rom name="dunjonquest - hellfire warrior v2.woz" size="234803" crc="97d67a1b" sha1="388d5069ef938229fe26d975f77993662622843d" />
- </dataarea>
- </part>
- </software>
-
- <software name="dqhfwv3">
- <description>Dunjonquest: Hellfire Warrior (version 3)</description>
- <year>1980</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234830">
- <rom name="dunjonquest - hellfire warrior v3.woz" size="234830" crc="f2d3d1f0" sha1="90593ca39505dbe34c40efd6e19d67675e1a447e" />
- </dataarea>
- </part>
- </software>
-
<software name="shogun">
<description>Shogun (version 09)</description>
<year>1988</year>
@@ -9057,84 +4290,6 @@ license:CC0-1.0
</part>
</software>
- <software name="alntyphn">
- <description>Alien Typhoon</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2019-12-21 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="101963">
- <rom name="alien typhoon.woz" size="101963" crc="5f8ca7f0" sha1="ace78dc02257b9e09fcf962bf2e5caa9cf5ae55c" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmpapsr1">
- <description>Dunjonquest: The Temple of Apshai (Revision 1)</description>
- <year>1979</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234834">
- <rom name="dunjonquest - the temple of apshai rev. 1.woz" size="234834" crc="558d8c4d" sha1="210ae265fc085655888c4dbad7f763a7c2e9c68d" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmpapsr2">
- <description>Dunjonquest: The Temple of Apshai (Revision 2)</description>
- <year>1979</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-06 -->
- <!-- This is revision 2, which fixes unspecified bugs and adds a graphical title screen. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234734">
- <rom name="dunjonquest - the temple of apshai rev. 2.woz" size="234734" crc="cde02b29" sha1="cb5e566436d64026dccd2f622d24aff1b529c71b" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmpapsr3">
- <description>Dunjonquest: The Temple of Apshai (Revision 3)</description>
- <year>1979</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 16-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-07 -->
- <!-- This is revision 3, with updated copy protection and a hi-res character generator for on-screen text. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234807">
- <rom name="dunjonquest - the temple of apshai rev. 3.woz" size="234807" crc="6d43c84e" sha1="4fdadd64a576d5fce2a0af5aaced36429fd35b19" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmpapsr4">
- <description>Dunjonquest: The Temple of Apshai (Revision 4)</description>
- <year>1979</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 16-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-07 -->
- <!-- This is revision 4, with updated copy protection and a hi-res character generator with two choices of font. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="248222">
- <rom name="dunjonquest - the temple of apshai rev. 4.woz" size="248222" crc="03743196" sha1="be872c142dfff107fed23e23fecb2ab1fb035ce0" />
- </dataarea>
- </part>
- </software>
-
<software name="streksos">
<description>Star Trek: Strategic Operations Simulator</description>
<year>1983</year>
@@ -9150,67 +4305,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wzdryr21">
- <description>Wizardry: Proving Grounds of the Mad Overlord (version 2.1)</description>
- <year>1981</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-11 -->
- <!-- Note: some emulators may have difficulty loading this disk because of its especially timing-sensitive copy protection.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot disk" />
- <dataarea name="flop" size="234829">
- <rom name="wizardry - proving grounds of the mad overlord v2.1 - boot disk.woz" size="234829" crc="29dfa2a6" sha1="6c0416fb7cb91bde8da05df77ecfc5f7b7c645f1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Scenario master disk" />
- <dataarea name="flop" size="234829">
- <rom name="wizardry - proving grounds of the mad overlord v2.1 - scenario master disk.woz" size="234829" crc="7951ca26" sha1="604a416c50ca6fccb39c11142f8be00d51ce627c" />
- </dataarea>
- </part>
- </software>
-
- <software name="wzrdry2">
- <description>Wizardry II: The Knight of Diamonds (version PV3S2V1/10-MAR-82)</description>
- <year>1982</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-11 -->
- <!-- This is version PV3S2V1 of 10-MAR-82.Some emulators may have difficulty loading this disk because of its especially timing-sensitive copy protection.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot disk" />
- <dataarea name="flop" size="234854">
- <rom name="wizardry ii - knight of diamonds - boot disk.woz" size="234854" crc="16a794a8" sha1="db098051302810edb8aa5c56c8a3dd7cc9ab0772" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Master scenario disk" />
- <dataarea name="flop" size="234865">
- <rom name="wizardry ii - knight of diamonds - master scenario disk.woz" size="234865" crc="ac3a27d9" sha1="59f7c602c6347c732ddd8222d667622bf8749a29" />
- </dataarea>
- </part>
- </software>
-
- <software name="wizipr21">
- <description>Wiziprint (version 2.1)</description>
- <year>1982</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234840">
- <rom name="wiziprint v2.01.woz" size="234840" crc="593dc847" sha1="d8628dbce3441820cbbd2ef4ac5a94421e514226" />
- </dataarea>
- </part>
- </software>
-
<software name="tramazon">
<description>Amazon</description>
<year>1984</year>
@@ -9260,58 +4354,6 @@ license:CC0-1.0
</part>
</software>
- <software name="xyphus">
- <description>Xyphus</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="121619">
- <rom name="xyphus - program disk.woz" size="121619" crc="9126e743" sha1="04d5ad0a6a547cc672769f0512d374072ad0d950" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Scenario disk" />
- <dataarea name="flop" size="221460">
- <rom name="xyphus - scenario disk.woz" size="221460" crc="081fa985" sha1="116c2cdd0240393c2920c665fc0a251e6d5b8bf5" />
- </dataarea>
- </part>
- </software>
-
- <software name="rambop2">
- <description>Rambo: First Blood Part II</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires an 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234786">
- <rom name="rambo - first blood part ii.woz" size="234786" crc="92ca8258" sha1="e8c90cd2690c0cdf3760184ccc9befdfde4d171c" />
- </dataarea>
- </part>
- </software>
-
- <software name="newworld">
- <description>New World</description>
- <year>1982</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234801">
- <rom name="new world.woz" size="234801" crc="2e45639d" sha1="2b64556b6c107d07f382b4fdbb4c61db7e3bcadc" />
- </dataarea>
- </part>
- </software>
-
<software name="qstscltr">
<description>Quest for the Scarlet Letter</description>
<year>1982</year>
@@ -9342,74 +4384,6 @@ license:CC0-1.0
</part>
</software>
- <software name="neuromnc">
- <description>Neuromancer</description>
- <year>1988</year>
- <publisher>Interplay Productions</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="241467">
- <rom name="neuromancer - side 1.woz" size="241467" crc="450dc5ec" sha1="540d98c2c7aceb2160d25b4136e84deec63e213c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="241467">
- <rom name="neuromancer - side 2.woz" size="241467" crc="4a7de9ee" sha1="5cdb323c885869dacd466122ebd6ce698fcb2471" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="241467">
- <rom name="neuromancer - side 3.woz" size="241467" crc="f041598b" sha1="51073328024c3568cda596656395f570044b7e31" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side 4" />
- <dataarea name="flop" size="241467">
- <rom name="neuromancer - side 4.woz" size="241467" crc="73642b5f" sha1="ac839fd7419df495bf263f05f70784d74d1c1f16" />
- </dataarea>
- </part>
- </software>
-
- <software name="dhuukrul">
- <description>The Dark Heart of Uukrul</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Archive Disk" />
- <dataarea name="flop" size="234821">
- <rom name="the dark heart of uukrul - archive disk.woz" size="234821" crc="e3defc5a" sha1="8ac090f8a5ead4aedea6f337d2dcf6322d463838" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Boot Disk" />
- <dataarea name="flop" size="234818">
- <rom name="the dark heart of uukrul - boot disk.woz" size="234818" crc="94ecd9db" sha1="2892c5b5d1000f08a525fdf2d90842b9fb588eae" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Scenario disk A" />
- <dataarea name="flop" size="234824">
- <rom name="the dark heart of uukrul - scenario disk a.woz" size="234824" crc="5cfa9773" sha1="69ec3686d9b562fc4bd318a10bf2ae464fc3cfd0" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Scenario disk B" />
- <dataarea name="flop" size="234824">
- <rom name="the dark heart of uukrul - scenario disk b.woz" size="234824" crc="766dc1ee" sha1="ae4084e5af24a8ecfded776371e470d150ade818" />
- </dataarea>
- </part>
- </software>
-
<software name="brck1798">
<description>The Breckenridge Caper of 1798</description>
<year>1982</year>
@@ -9425,151 +4399,11 @@ license:CC0-1.0
</part>
</software>
- <software name="amnesia">
- <description>Amnesia</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="228118">
- <rom name="amnesia disk 1a.woz" size="228118" crc="2bc5a39f" sha1="927c536daae91d82175efab5e707881673c4d73a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234774">
- <rom name="amnesia disk 1b.woz" size="234774" crc="b1a530f1" sha1="abf89dd7a83002b7b62cd77b9fd73582bc707333" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234774">
- <rom name="amnesia disk 2a.woz" size="234774" crc="28042b7f" sha1="5dbce53fc06e1e9dea2ea3ae9c6c4f1d8dc03a82" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234774">
- <rom name="amnesia disk 2b.woz" size="234774" crc="edc22834" sha1="7a2570b1a124fc1cea148f9cd899ccab25958b93" />
- </dataarea>
- </part>
- </software>
-
- <software name="goldrush">
- <description>Gold Rush! (version 1.0M)</description>
- <year>1989</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-20 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 1a.woz" size="234823" crc="353becc5" sha1="4017229d3201a124fd6e3279e5636a22f1db2ed4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 1b.woz" size="234823" crc="65579b17" sha1="719361e313bdbec9750d905cc9e6df1fcd0b4309" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 2a.woz" size="234823" crc="402a1809" sha1="e7bfc6707a0dc06a3a056e65ff97e98ba5c832f6" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 2b.woz" size="234823" crc="00c89187" sha1="851bd9fba6b918fa53db274f02325d8e3940609b" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 3a.woz" size="234823" crc="b1f9a9cf" sha1="a3c335e3dcdcaa46a0a98f709f64fbdef4cfaf0b" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 3b.woz" size="234823" crc="846d5ff7" sha1="11d4faa4492c0bb7fe6bc444b4ff7426aec449c3" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 4a.woz" size="234823" crc="aa7a4cd6" sha1="c6487a07ca5841aafcaa3674dfe3a7e695b66fc3" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 4b.woz" size="234823" crc="98a27bfc" sha1="bb7bb6bcf6fd0e25007ebd179c2cc9f8b321d4b7" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 5a.woz" size="234823" crc="52f1b57d" sha1="70a2741ef18489ccb8b9e219e9d7a2092a7ab02d" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 5b.woz" size="234823" crc="5c286071" sha1="fbfa17119806934af718514aa6622861c2d7b16c" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 6a.woz" size="234823" crc="3308207f" sha1="41aff7efcf1775f675ada82eccb89fe7fc19e981" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 6b.woz" size="234823" crc="51bd3df5" sha1="124f7cba9bef89e63674209ff44f30207f405ade" />
- </dataarea>
- </part>
- <part name="flop13" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 7a.woz" size="234823" crc="ba529141" sha1="eaadffc83064fc9f709f79fbb47a63569b96e8d1" />
- </dataarea>
- </part>
- <part name="flop14" interface="floppy_5_25">
- <feature name="part_id" value="Disk 7 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 7b.woz" size="234823" crc="a985bb4d" sha1="c10dbcc84e67fccd627a17a0e7a1f86a38463162" />
- </dataarea>
- </part>
- <part name="flop15" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8 Side A" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 8a.woz" size="234823" crc="0d6cd2e5" sha1="5fd0a83ea530e010a34353f3a663887aa16c3964" />
- </dataarea>
- </part>
- <part name="flop16" interface="floppy_5_25">
- <feature name="part_id" value="Disk 8 Side B" />
- <dataarea name="flop" size="234823">
- <rom name="gold rush disk 8b.woz" size="234823" crc="9894e285" sha1="63a441f0bee1b130b7883e2bbfc20882884c40ef" />
- </dataarea>
- </part>
- </software>
-
<software name="horizv">
<description>Horizon V</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
- <info name="usage" value="Requires an Apple II or Apple II+. Due to restrictive copy protection, it will not boot on later models." />
+ <info name="usage" value="Requires an Apple ][ or Apple ][+. Due to restrictive copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2020-01-22 -->
@@ -9580,21 +4414,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crwnarth">
- <description>Crown of Arthain</description>
- <year>1980</year>
- <publisher>Micro Lab</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234789">
- <rom name="crown of arthain.woz" size="234789" crc="454ac2fa" sha1="068c976a64a2b0563e5f98983a8d7b46976307c2" />
- </dataarea>
- </part>
- </software>
-
<software name="diamine">
<description>Diamond Mine</description>
<year>1983</year>
@@ -9646,136 +4465,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lgcyanct">
- <description>Legacy of the Ancients</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="242988">
- <rom name="legacy of the ancients side 1.woz" size="242988" crc="ec4191a1" sha1="94cb308a22c03c669417611d5441a1c437165626" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234796">
- <rom name="legacy of the ancients side 2.woz" size="234796" crc="fbec7b4c" sha1="a094c00d4a38959ee45dde1c22f7699ae142711d" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="241452">
- <rom name="legacy of the ancients side 3.woz" size="241452" crc="f433fe37" sha1="3b30805dd474f75923363c74d12e75e950c74382" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side 4" />
- <dataarea name="flop" size="241452">
- <rom name="legacy of the ancients side 4.woz" size="241452" crc="5f13fdfd" sha1="b38eb9353f999d780b5f56a53c4a6b7330715686" />
- </dataarea>
- </part>
- </software>
-
- <software name="mingchal">
- <description>Ming's Challenge</description>
- <year>1982</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233746">
- <rom name="ming's challenge.woz" size="233746" crc="155dd8de" sha1="14179cd6704f849c0446c7f0402e71cf70742e24" />
- </dataarea>
- </part>
- </software>
-
- <software name="dragneye">
- <description>The Dragon's Eye</description>
- <year>1981</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234775">
- <rom name="the dragon's eye.woz" size="234775" crc="0c51846e" sha1="69c5812255ee8c46724ff531ef3ad656199d0a77" />
- </dataarea>
- </part>
- </software>
-
- <software name="trcrsnct">
- <description>The Tracer Sanction</description>
- <year>1984</year>
- <publisher>Activision</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234785">
- <rom name="the tracer sanction side a.woz" size="234785" crc="17b27251" sha1="f2179fdbaf0a9da30ccd64a176d19d4576fc2fc0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234785">
- <rom name="the tracer sanction side b.woz" size="234785" crc="4f60a127" sha1="6b202a70c0c769c177d36fdd8c20c492014d1993" />
- </dataarea>
- </part>
- </software>
-
- <software name="sumrgms2">
- <description>Summer Games II</description>
- <year>1985</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234963">
- <rom name="summer games ii side a.woz" size="234963" crc="f42076b9" sha1="38aeed0677d67a34844b29b76d2cd4211df8c479" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234963">
- <rom name="summer games ii side b.woz" size="234963" crc="76abeacd" sha1="a49c9e066bc164f6d3af5e355b30fbfbb5b31ea6" />
- </dataarea>
- </part>
- </software>
-
- <software name="srpstr10">
- <description>The Serpent's Star (version 1.0)</description>
- <year>1983</year>
- <publisher>Ultrasoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later. Note: due to subtle emulation bugs and extremely finicky copy protection, this disk may reboot one or more times before loading." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-01-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234770">
- <rom name="the serpent's star side a.woz" size="234770" crc="197cce52" sha1="900bf3e4ab89b538620fe35445833618c3a2e1b9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234770">
- <rom name="the serpent's star side b.woz" size="234770" crc="ee240f18" sha1="4938d02b15b2d4b626dfd0a14514cf09a06a0afa" />
- </dataarea>
- </part>
- </software>
-
<software name="dallasq">
<description>The Dallas Quest</description>
<year>1984</year>
@@ -9798,185 +4487,6 @@ license:CC0-1.0
</part>
</software>
- <software name="specprpt">
- <description>Spectrum: Programs and Patterns</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234751">
- <rom name="spectrum- patterns and programs.woz" size="234751" crc="7b5a279a" sha1="f433ecbcbebd17f6d86925ce8c085d49ac4ab164" />
- </dataarea>
- </part>
- </software>
-
- <software name="mhntrny">
- <description>Manhunter: New York (version 1.0I)</description>
- <year>1988</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 1a.woz" size="234919" crc="96c8587e" sha1="2aec0648930b62687a932f80d69ab2605688842b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 1b.woz" size="234919" crc="9dbe9ae4" sha1="e8a645f7ff422b6be32f75256a5e40e83a092ab1" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 2a.woz" size="234919" crc="372c02d4" sha1="e82c31e350534d8138fd9e1cfe8b983c2c40b9c9" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 2b.woz" size="234919" crc="66b6fc66" sha1="7de67f998494cbeb7d68db6c7d92d3641f873320" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 3a.woz" size="234919" crc="bbbc6ba4" sha1="f6a58e97209d816af9791e588dbf32b4e50a7d42" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 3b.woz" size="234919" crc="9f6d1070" sha1="445b1bd2a597ea5da6dc8f4a85fa1ccc85eb9683" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 4a.woz" size="234919" crc="49602f21" sha1="a01d3a92bd66bb51bb2e7f7fd1a6f2660dc21958" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 4b.woz" size="234919" crc="c17ff13f" sha1="2c7b125772e7df2053b230638e17cb727f9778e9" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side A" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 5a.woz" size="234919" crc="351bd475" sha1="82c6f68a1637af5c8efc5e723caeb0dca0c152d5" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk 5 Side B" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 5b.woz" size="234919" crc="68b7fd76" sha1="3e1e5df1f15d6e103b5be42c54d1d75fac268609" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 Side A" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 6a.woz" size="234919" crc="dd91e136" sha1="65a5748fa9c914950e32a18d45ce29ef0694a099" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk 6 Side B" />
- <dataarea name="flop" size="234919">
- <rom name="manhunter new york disk 6b.woz" size="234919" crc="ca8be96b" sha1="cdf685059ae672824e84c8fe303301397d73b120" />
- </dataarea>
- </part>
- </software>
-
- <software name="tzoner11">
- <description>Time Zone (version 1.1)</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk a.woz" size="234882" crc="9dd9bcbb" sha1="18ad98f30f49af2fa9f9cae99ad77b4709f21ac4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk b.woz" size="234882" crc="b0e640d9" sha1="f568d25a10a624937b5c0a7f5a7d285e9706e214" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk c.woz" size="234882" crc="f1bc7998" sha1="875c3c74236477c2aefad415b2906490b6c5b134" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk d.woz" size="234882" crc="fe0c102d" sha1="f7cbca00e759c4395baabbcd3b142d487d4785c1" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk E" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk e.woz" size="234882" crc="30bc6bde" sha1="12f1badcaddf514ea2ad8adc91134f8a17996122" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk F" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk f.woz" size="234882" crc="93963177" sha1="fb4fabaa5ef5f2d2530682ac4a4ddec64b1b2824" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk G" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk g.woz" size="234882" crc="3ee201e6" sha1="97006b422e543c845e46c5e85a1f65758c2c146c" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk H" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk h.woz" size="234882" crc="efba5ced" sha1="6399284ba922097e794731a70babbd5d91b864bb" />
- </dataarea>
- </part>
- <part name="flop9" interface="floppy_5_25">
- <feature name="part_id" value="Disk I" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk i.woz" size="234882" crc="57ca6357" sha1="ca7f12495f0c014a6a8395fb36c82ee9f372c0dc" />
- </dataarea>
- </part>
- <part name="flop10" interface="floppy_5_25">
- <feature name="part_id" value="Disk J" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk j.woz" size="234882" crc="afb5b9d2" sha1="b5323943e5f04f7e773a26a593fdd5697b58ac29" />
- </dataarea>
- </part>
- <part name="flop11" interface="floppy_5_25">
- <feature name="part_id" value="Disk K" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk k.woz" size="234882" crc="ae166b20" sha1="2901bb34acd69e8c2bceddaa3141b6d7f09403e7" />
- </dataarea>
- </part>
- <part name="flop12" interface="floppy_5_25">
- <feature name="part_id" value="Disk L" />
- <dataarea name="flop" size="234882">
- <rom name="time zone v1.1 disk l.woz" size="234882" crc="e5521794" sha1="7eb9d72811f682c06cb087ad195900930197746d" />
- </dataarea>
- </part>
- </software>
-
<software name="gencgame">
<description>Generic Computer Games</description>
<year>1982</year>
@@ -9992,62 +4502,6 @@ license:CC0-1.0
</part>
</software>
- <software name="trisland">
- <description>Treasure Island</description>
- <year>1985</year>
- <publisher>Windham Classics</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234852">
- <rom name="treasure island side a.woz" size="234852" crc="8990c495" sha1="eed208fe2c6fb17a45ae2f522442969d12112d17" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234852">
- <rom name="treasure island side b.woz" size="234852" crc="84e20cf7" sha1="99aeadaf4b420a4d7b25934ba47c4b44845ef2aa" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C" />
- <dataarea name="flop" size="234852">
- <rom name="treasure island side c.woz" size="234852" crc="869e455f" sha1="cb83a938e54f1b262c2e49dfcb107566d8f5e60f" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D" />
- <dataarea name="flop" size="234852">
- <rom name="treasure island side d.woz" size="234852" crc="96f345f3" sha1="dd2b097d6a48510dc3c1a0f005c218ca40a5ae28" />
- </dataarea>
- </part>
- </software>
-
- <software name="trans1985">
- <description>Transylvania (1985 Version)</description>
- <year>1985</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="241472">
- <rom name="transylvania 1985 side a.woz" size="241472" crc="2c8f80ae" sha1="0fcb96cced72a4fbfb4aaf383313d5c135eb4665" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="241472">
- <rom name="transylvania 1985 side b.woz" size="241472" crc="d6c4136f" sha1="3a04c95791f31cc3d2cc6165ac5d194948cbd898" />
- </dataarea>
- </part>
- </software>
-
<software name="tmblbugs">
<description>Tumble Bugs</description>
<year>1982</year>
@@ -10249,50 +4703,6 @@ license:CC0-1.0
</part>
</software>
- <software name="221bbv11">
- <description>221B Baker Street (version 1.1)</description>
- <year>1986</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-18 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="234878">
- <rom name="221b baker st. disk 1 - program disk.woz" size="234878" crc="c7776abc" sha1="340a2728d675c5dccd3210b29e5dce1fc4388c65" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Case disk" />
- <dataarea name="flop" size="234875">
- <rom name="221b baker st. disk 2 - case disk.woz" size="234875" crc="6da11041" sha1="deae0f24fe1c50f034520840e7760dd859682bb4" />
- </dataarea>
- </part>
- </software>
-
- <software name="expamazn">
- <description>Expedition Amazon</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-18 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="235507">
- <rom name="expedition amazon side a.woz" size="235507" crc="b318d4dd" sha1="bff9901632fd32337cb0e400a9b79328f74c4414" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B (Boot)" />
- <dataarea name="flop" size="235507">
- <rom name="expedition amazon side b (boot).woz" size="235507" crc="25f68170" sha1="10601a71523d05c46918983176f96364643b1248" />
- </dataarea>
- </part>
- </software>
-
<software name="typetut3">
<description>Typing Tutor III with Letter Invaders</description>
<year>1984</year>
@@ -10386,21 +4796,6 @@ license:CC0-1.0
</part>
</software>
- <software name="crscrwmn">
- <description>The Curse of Crowley Manor</description>
- <year>1981</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-02-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234833">
- <rom name="the curse of crowley manor.woz" size="234833" crc="347d21ee" sha1="1c8eeebb2b48199e4772efda9d7bab0584fd041c" />
- </dataarea>
- </part>
- </software>
-
<software name="croschck">
<description>Crosscheck</description>
<year>1986</year>
@@ -10431,70 +4826,6 @@ license:CC0-1.0
</part>
</software>
- <software name="cntdsht">
- <description>Countdown to Shutdown</description>
- <year>1985</year>
- <publisher>Activision</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-03-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241431">
- <rom name="countdown to shutdown.woz" size="241431" crc="59f9a15f" sha1="0f95f179cb84b57e33a9a0a535b4d36b2d2e3189" />
- </dataarea>
- </part>
- </software>
-
- <software name="brdtale2">
- <description>The Bard's Tale II: The Destiny Knight</description>
- <year>1987</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-03-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Boot disk" />
- <dataarea name="flop" size="228149">
- <rom name="the bard's tale ii - boot disk.woz" size="228149" crc="d9b0aa1a" sha1="afe776009a359625f7626ba8534245d16717d592" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Character disk" />
- <dataarea name="flop" size="234805">
- <rom name="the bard's tale ii - character disk.woz" size="234805" crc="2b16a6c7" sha1="d48ee9b3deb4346b7bbb5899adcd3206f0fb48fc" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Dungeon 1 disk" />
- <dataarea name="flop" size="234805">
- <rom name="the bard's tale ii - dungeon 1 disk.woz" size="234805" crc="c5214293" sha1="49f1b0559be3a94cf1e7b0c1190c57c25e3d8fb4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Dungeon 2 disk" />
- <dataarea name="flop" size="234805">
- <rom name="the bard's tale ii - dungeon 2 disk.woz" size="234805" crc="d33c5544" sha1="078606ec01c59137b9a50bd18ebc4410a800302a" />
- </dataarea>
- </part>
- </software>
-
- <software name="wizplus">
- <description>Wizplus</description>
- <year>1982</year>
- <publisher>Datamost</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-03-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234768">
- <rom name="wizplus.woz" size="234768" crc="f60920a3" sha1="a640aec03dc8bddf434b43318ae80f54d5c1ab8c" />
- </dataarea>
- </part>
- </software>
-
<software name="jelwayqb">
<description>John Elway's Quarterback</description>
<year>1987</year>
@@ -10525,21 +4856,6 @@ license:CC0-1.0
</part>
</software>
- <software name="triad">
- <description>Triad (version 1.0)</description>
- <year>1983</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-03-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234768">
- <rom name="triad.woz" size="234768" crc="fdf9952f" sha1="2751abfb876aa5106de01d797cd137067424f7d9" />
- </dataarea>
- </part>
- </software>
-
<software name="rescfrac">
<description>Rescue on Fractalus</description>
<year>1985</year>
@@ -10607,28 +4923,6 @@ license:CC0-1.0
</part>
</software>
- <software name="maddenfb">
- <description>John Madden Football</description>
- <year>1988</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-03-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234810">
- <rom name="john madden football side a.woz" size="234810" crc="8731f6c6" sha1="9e06385a69fd0045d0b1539fd16bdd8f8c7ca777" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234810">
- <rom name="john madden football side b.woz" size="234810" crc="3cb6bc97" sha1="a866e7b854c3dfe4206317acf78a8f4b86a82783" />
- </dataarea>
- </part>
- </software>
-
<software name="cindslpr">
<description>Who Stole Cinderella's Slipper? (version 2.0)</description>
<year>1984</year>
@@ -10688,40 +4982,6 @@ license:CC0-1.0
</part>
</software>
- <software name="typhstl">
- <description>Typhoon of Steel (version 1.0)</description>
- <year>1988</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-04-01 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Asia disk" />
- <dataarea name="flop" size="234760">
- <rom name="typhoon of steel - asia.woz" size="234760" crc="64f4fae2" sha1="2162afa7fc92e029ea45de9547cb9ec2244d7a2a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Europe disk" />
- <dataarea name="flop" size="234762">
- <rom name="typhoon of steel - europe.woz" size="234762" crc="6c8b2f21" sha1="62212483a0845f019ce6526020614fdea2adec16" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Pacific disk" />
- <dataarea name="flop" size="234763">
- <rom name="typhoon of steel - pacific.woz" size="234763" crc="f4f9ccc8" sha1="40fe14d68b358802dc32459b95ac6cb81a4a6728" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Scenarios disk" />
- <dataarea name="flop" size="234765">
- <rom name="typhoon of steel - scenarios.woz" size="234765" crc="711b5ff8" sha1="6b505829f62dd39a3e558bdeaf655f796d41ec5b" />
- </dataarea>
- </part>
- </software>
-
<software name="alnmunch">
<description>Alien Munchies</description>
<year>1983</year>
@@ -10752,48 +5012,11 @@ license:CC0-1.0
</part>
</software>
- <software name="kmpfgp10">
- <description>Kampfgruppe (version 1.0)</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-04-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Game disk" />
- <dataarea name="flop" size="234782">
- <rom name="kampfgruppe side a - game disk.woz" size="234782" crc="cade1355" sha1="191f53083835e2fe77b50d293391fcf85130ed66" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Historical scenarios" />
- <dataarea name="flop" size="234793">
- <rom name="kampfgruppe side b - historical senarios.woz" size="234793" crc="43f3a85e" sha1="c045af7378e7dff9a3dac97e26e82543df3da566" />
- </dataarea>
- </part>
- </software>
-
- <software name="metinspc">
- <description>Meteoroids in Space</description>
- <year>1981</year>
- <publisher>Quality Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-04-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="48405">
- <rom name="meteoroids in space.woz" size="48405" crc="7beb3c05" sha1="61cdb1028a091a7bd85ac636f1f29087b57b4426" />
- </dataarea>
- </part>
- </software>
-
<software name="latnhngm">
<description>The Latin Hangman (Revision 1004)</description>
<year>1983</year>
<publisher>Unknown</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2020-04-11 -->
<!-- Game is copyright George Earl, but no apparent publisher -->
@@ -10812,22 +5035,6 @@ license:CC0-1.0
</part>
</software>
- <software name="816pnt31">
- <description>816/Paint (version 3.1)</description>
- <year>1987</year>
- <publisher>Baudville</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-04-11 -->
- <!-- This is the 5.25-inch disk part of version 3.1. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="228110">
- <rom name="816 paint v3.1.woz" size="228110" crc="5348048a" sha1="b8673692b4f3d4e8d2281dc58c48c2facd28a6f2" />
- </dataarea>
- </part>
- </software>
-
<software name="aliens">
<description>Aliens</description>
<year>1987</year>
@@ -10850,40 +5057,6 @@ license:CC0-1.0
</part>
</software>
- <software name="brdtale3">
- <description>The Bard's Tale III: The Thief of Fate</description>
- <year>1988</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-04-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Boot" />
- <dataarea name="flop" size="234820">
- <rom name="the bard's tale iii disk 1a - boot.woz" size="234820" crc="0d92adf1" sha1="afec810cc36929f05d774f581c7a4b94588500b1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Character" />
- <dataarea name="flop" size="234825">
- <rom name="the bard's tale iii disk 1b - character.woz" size="234825" crc="bc266220" sha1="b8db19d79fb182b95697262dece469067ffef65c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Dungeon A" />
- <dataarea name="flop" size="234825">
- <rom name="the bard's tale iii disk 2a - dungeon a.woz" size="234825" crc="2c962b97" sha1="200229e56978e57ac68183fffa4a1012c3ebfc95" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Dungeon B" />
- <dataarea name="flop" size="234825">
- <rom name="the bard's tale iii disk 2b - dungeon b.woz" size="234825" crc="ca6ef3c4" sha1="2c56ca1744e482864a49cf41b6355038d5a7c97e" />
- </dataarea>
- </part>
- </software>
-
<software name="tplogo11">
<description>Terrapin Logo Plus (version 1.1)</description>
<year>1988</year>
@@ -10912,6 +5085,7 @@ license:CC0-1.0
<publisher>MUSE Software</publisher>
<info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2020-04-11 redumped: 2020-04-17 to fix incorrectly set sector type (it was incorrectly set to 15-sector) -->
<part name="flop0" interface="floppy_5_25">
@@ -10921,28 +5095,6 @@ license:CC0-1.0
</part>
</software>
- <software name="microbe">
- <description>Microbe</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-04-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234852">
- <rom name="microbe side a.woz" size="234852" crc="0d944e75" sha1="5a8e5a95c764d181e0410cc411b6b14be57e87a9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234852">
- <rom name="microbe side b.woz" size="234852" crc="e23a8340" sha1="1d085179f9e2905179b4eb57fbd716430da18c2c" />
- </dataarea>
- </part>
- </software>
-
<software name="frakfaeb">
<description>Fraktured Faebles</description>
<year>1985</year>
@@ -10965,21 +5117,6 @@ license:CC0-1.0
</part>
</software>
- <software name="viewkill">
- <description>A View To A Kill</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234774">
- <rom name="a view to a kill.woz" size="234774" crc="e5baa6cc" sha1="23b5f4e4cc226a9bf6db8ca01d1019b7d66f65a2" />
- </dataarea>
- </part>
- </software>
-
<software name="ballyhr97">
<description>Ballyhoo (Release 97 / 851218)</description>
<year>1986</year>
@@ -10995,36 +5132,6 @@ license:CC0-1.0
</part>
</software>
- <software name="chmpgolf">
- <description>Championship Golf</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234798">
- <rom name="championship golf.woz" size="234798" crc="9d1a193f" sha1="e7b0eb6e3272044046a9373ea7acabe598cabd46" />
- </dataarea>
- </part>
- </software>
-
- <software name="dunjnqrn">
- <description>Dunjonquest: The Datestones of Ryn</description>
- <year>1980</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234844">
- <rom name="dunjonquest- the datestones of ryn.woz" size="234844" crc="05154f9f" sha1="0d749206c8d00f872a253387dd9e7e69f1e35ca6" />
- </dataarea>
- </part>
- </software>
-
<software name="graforth">
<description>GraFORTH</description>
<year>1981</year>
@@ -11040,111 +5147,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ml5nega">
- <description>Micro-LADS 5: Negatives</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235546">
- <rom name="micro-lads 5- negatives.woz" size="235546" crc="376818fe" sha1="2f905e6f18a2d3eca7d29141ce78a1f9046ab568" />
- </dataarea>
- </part>
- </software>
-
- <software name="ml6deiex">
- <description>Micro-LADS 6: Deictic Expressions, Passive, WH-questions</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235579">
- <rom name="micro-lads 6- deictic expressions, passive, wh-questions.woz" size="235579" crc="40052717" sha1="8e5417ba687db72a75baf6526019acfb9bf2f14b" />
- </dataarea>
- </part>
- </software>
-
- <software name="ml7prep2">
- <description>Micro-LADS 7: Prepositions II</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235552">
- <rom name="micro-lads 7- prepositions ii.woz" size="235552" crc="2b2093b8" sha1="0c3b5bb04dae1a7a9da4fdea03842f9ee311bae4" />
- </dataarea>
- </part>
- </software>
-
- <software name="lastglad">
- <description>The Last Gladiator</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="228120">
- <rom name="the last gladiator.woz" size="228120" crc="f9736689" sha1="eb37bdffc2c2bbafa728a2123be7856a00506f81" />
- </dataarea>
- </part>
- </software>
-
- <software name="incrdlab">
- <description>The Incredible Laboratory</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235496">
- <rom name="the incredible laboratory.woz" size="235496" crc="d12528f2" sha1="c84d9c1b164bb2bce2f57c44aa0c68adf07b5c8d" />
- </dataarea>
- </part>
- </software>
-
- <software name="odd1out">
- <description>Odd One Out</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235503">
- <rom name="odd one out.woz" size="235503" crc="5dced466" sha1="5dc7d46ab444124f0cbc21b0d3686a6cb11b400a" />
- </dataarea>
- </part>
- </software>
-
- <software name="algplogc">
- <description>Algernon: An Introduction to Programming Logic</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241430">
- <rom name="algernon.woz" size="241430" crc="64fe4b81" sha1="3dabbf3283441447dc5aa8c31a13d3a33aa6d507" />
- </dataarea>
- </part>
- </software>
-
<software name="persec11">
<description>The Personal Secretary (version 1.1)</description>
<year>1983</year>
@@ -11175,40 +5177,6 @@ license:CC0-1.0
</part>
</software>
- <software name="loblkslv">
- <description>The Legend of Blacksilver</description>
- <year>1989</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234839">
- <rom name="the legend of blacksilver - side 1.woz" size="234839" crc="e3cea8ba" sha1="b775a5569c381768538a788205b992e5d5799bd5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234839">
- <rom name="the legend of blacksilver - side 2.woz" size="234839" crc="4bd45825" sha1="b44caee849ca7747491ff2412aaee17e995469f1" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="241495">
- <rom name="the legend of blacksilver - side 3.woz" size="241495" crc="1561dbf4" sha1="64ed937cc62dca73415b9adb5b2078124b70fe8a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side 4" />
- <dataarea name="flop" size="234839">
- <rom name="the legend of blacksilver - side 4.woz" size="234839" crc="0c2a4503" sha1="f86c0f1294104e01969a0d3c26505dd2664af9be" />
- </dataarea>
- </part>
- </software>
-
<software name="magmyths">
<description>Magical Myths</description>
<year>1984</year>
@@ -11254,81 +5222,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ml1plnva">
- <description>Micro-LADS 1: Plurals and Noun/Verb Agreement</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235566">
- <rom name="micro-lads 1- plurals and noun-verb agreement.woz" size="235566" crc="5248d8a7" sha1="cb3c599b370c46b4f7ac11f23122a37c598595b0" />
- </dataarea>
- </part>
- </software>
-
- <software name="ml2verbf">
- <description>Micro-LADS 2: Verb Forms</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235547">
- <rom name="micro-lads 2- verb forms.woz" size="235547" crc="b934c2e5" sha1="e764770d7642a5301f2795f75fd1df987019976c" />
- </dataarea>
- </part>
- </software>
-
- <software name="ml3preps">
- <description>Micro-LADS 3: Prepositions</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235549">
- <rom name="micro-lads 3- prepositions.woz" size="235549" crc="99f1445b" sha1="3dcff367953157133b7c4ef46d5b49834f169209" />
- </dataarea>
- </part>
- </software>
-
- <software name="ml4pron">
- <description>Micro-LADS 4: Pronouns</description>
- <year>1989</year>
- <publisher>Laureate Learning Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235545">
- <rom name="micro-lads 4- pronouns.woz" size="235545" crc="5e1e3e45" sha1="d7ac4d69ac97e660ea7fa3dc535a52e8957e6e46" />
- </dataarea>
- </part>
- </software>
-
- <software name="bounce">
- <description>Bounce!</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234832">
- <rom name="bounce.woz" size="234832" crc="12697c53" sha1="3bb1c5f96b93bf33da1bb6abb1482e9b702fe107" />
- </dataarea>
- </part>
- </software>
-
<software name="brnsat2e">
<description>Barron's SAT: 2nd Edition</description>
<year>1989</year>
@@ -11457,21 +5350,6 @@ license:CC0-1.0
</part>
</software>
- <software name="anhotel">
- <description>Animal Hotel</description>
- <year>1985</year>
- <publisher>Learning Technologies</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234772">
- <rom name="animal hotel.woz" size="234772" crc="e23cae83" sha1="ab78fd657c3230b23a42badb3018e04ddb341e34" />
- </dataarea>
- </part>
- </software>
-
<software name="btwblue">
<description>Behind The Wheel: Blue Level</description>
<year>1985</year>
@@ -11509,271 +5387,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sbwinnie">
- <description>Winnie the Pooh in the Hundred Acre Wood (Sunburst Communications release)</description>
- <year>1985</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-03 -->
- <!-- "Winnie the Pooh in the Hundred Acre Wood" is a 1984 graphical
- adventure game by Walt Disney Company and distributed by Sierra On-Line,
- Inc. This version is distributed by Sunburst Communications
- (mentioned only on the physical disk label). -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="234802">
- <rom name="winnie the pooh in the hundred acre wood disk 1.woz" size="234802" crc="73997920" sha1="d6b8176c8753f05da2f72b1f1b96e8718d18ab88" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="234802">
- <rom name="winnie the pooh in the hundred acre wood disk 2.woz" size="234802" crc="06be776d" sha1="d1826e1eaac9625c9924b55e51f0fbb68af745bd" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrabbt13">
- <description>Writer Rabbit (version 1.3)</description>
- <year>1987</year>
- <publisher>The Learning Company</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234859">
- <rom name="writer rabbit v1.3 side a.woz" size="234859" crc="05a5d952" sha1="ff4029d09cb54e5e98b250f16b6c5bd05a45a4f3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="241515">
- <rom name="writer rabbit v1.3 side b.woz" size="241515" crc="6807af6f" sha1="ad144ed23f61e29c777824fc9656498328ca5a42" />
- </dataarea>
- </part>
- </software>
-
- <software name="pkrparat">
- <description>Poker Parat</description>
- <year>1983</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234841">
- <rom name="poker parat.woz" size="234841" crc="1cec4cce" sha1="04bcfe800163e8cbb1f3f90ed317677f43121836" />
- </dataarea>
- </part>
- </software>
-
- <software name="deugddd">
- <description>Deutsche Grammatik: der-die-das</description>
- <year>1986</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="241518">
- <rom name="deutsche grammatik - disk 1, side a.woz" size="241518" crc="010083f7" sha1="9163e24c431e8ac5b2df28901957bd9e21afff91" />
- </dataarea>
- </part>
- </software>
-
- <software name="stoichio">
- <description>Stoichiometry</description>
- <year>1983</year>
- <publisher>Encyclopaedia Britannica</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-24 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234831">
- <rom name="stoichiometry.woz" size="234831" crc="ebb12c17" sha1="97388f24e0da8a0d02d23f315bb2304f3783897f" />
- </dataarea>
- </part>
- </software>
-
- <software name="pthtacts">
- <description>Path Tactics (version 1.0)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-25 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234789">
- <rom name="path tactics.woz" size="234789" crc="3ded85b6" sha1="24d948f899c38416d1a5e26ca2a4244e6372e5aa" />
- </dataarea>
- </part>
- </software>
-
- <software name="pchmprs">
- <description>Picture Chompers (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-25 redumped: 2020-06-10 to correct metadata. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop1" size="234914">
- <rom name="picture chompers.woz" size="234914" crc="6970dced" sha1="b1a127b8f4111b91c597172b65e18ead518d3b0f" />
- </dataarea>
- </part>
- </software>
-
- <software name="hmakers">
- <description>History Makers (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234883">
- <rom name="history makers.woz" size="234883" crc="29272c2b" sha1="3ef56658f78389d3d5ea4b1c4625a5d778b0ed1b" />
- </dataarea>
- </part>
- </software>
-
- <software name="calgames">
- <description>California Games</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-05-28 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234817">
- <rom name="california games side a.woz" size="234817" crc="70072db5" sha1="0aab85ab13746a7fdd0b3ef3cf787c632f4d11e7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234817">
- <rom name="california games side b.woz" size="234817" crc="dcd0d791" sha1="f1d1ff129247ea0a440fa100a7f8a7ef565def7f" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrtgfct" supported="no">
- <description>Wortgefect</description>
- <year>1984</year>
- <publisher>Gessler Educational Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-02 -->
- <!-- Note: disk 2 must be writeable in order to proceed to gameplay. The
- .woz file is correctly marked writeable, but MAME does not currently
- support writing to softlist entries. -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program" />
- <dataarea name="flop" size="234829">
- <rom name="wortgefect disk 1 - program.woz" size="234829" crc="4b7add8c" sha1="a6aa840d6e202d2607ac92afb71cb82d8b19eb09" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data" />
- <dataarea name="flop" size="234826">
- <rom name="wortgefect disk 2 - data.woz" size="234826" crc="6442a4fd" sha1="5ceee6e5b0b6ab9cb3990529fe20cb32a6830cc2" />
- </dataarea>
- </part>
- </software>
-
- <software name="ptpvowel2">
- <description>Phonics Prime Time: Vowels II (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234781">
- <rom name="phonics prime time- vowels ii.woz" size="234781" crc="f1146223" sha1="13918c0f3ec2bfd519c031a4bf29fb824690a2c3" />
- </dataarea>
- </part>
- </software>
-
- <software name="nmunch13">
- <description>Number Munchers (version 1.3)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240936">
- <rom name="number munchers v1.3.woz" size="240936" crc="d778ad1a" sha1="8564c7eca2532b911ba12b4614f9fb6b6466d068" />
- </dataarea>
- </part>
- </software>
-
- <software name="prsprodf">
- <description>To Preserve, Protect and Defend (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234781">
- <rom name="to preserve, protect and defend.woz" size="234781" crc="03ddd885" sha1="d891cdbb4d7108bc6fa1a6cff3883bd7a3131768" />
- </dataarea>
- </part>
- </software>
-
- <software name="scitkp20">
- <description>Science Toolkit Plus (version 2.0)</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Master module" />
- <dataarea name="flop" size="241512">
- <rom name="science toolkit plus v2.0 disk 1 - master module.woz" size="241512" crc="421c7922" sha1="9c4dbbb09ffcf609a4efe34be3fb6f0753c177b9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Module 1: Speed and motion" />
- <dataarea name="flop" size="241523">
- <rom name="science toolkit plus v2.0 disk 2 - module 1- speed and motion.woz" size="241523" crc="1f24f501" sha1="69d51f5d5663a7a73eddadc81f110575adaeff7e" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 - Module 2: Earthquake lab" />
- <dataarea name="flop" size="241523">
- <rom name="science toolkit plus v2.0 disk 3 - module 2- earthquake lab.woz" size="241523" crc="01807b1e" sha1="d0cd79b8649110c16f8051fb552389463c94e18a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 - Module 3: Body lab" />
- <dataarea name="flop" size="241517">
- <rom name="science toolkit plus v2.0 disk 4 - module 3- body lab.woz" size="241517" crc="7ede15f2" sha1="79f286fb54c3b806718fa21025c0fa10c720e8f7" />
- </dataarea>
- </part>
- </software>
-
<software name="tycoon21">
<description>Tycoon (version 2.1)</description>
<year>1985</year>
@@ -11796,21 +5409,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bgtrck21">
- <description>Bag of Tricks (version 2.1)</description>
- <year>1987</year>
- <publisher>Quality Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241471">
- <rom name="bag of tricks v2.1.woz" size="241471" crc="fcac8d4e" sha1="e879a1875a6dc3263bd0d239e130c397458b841e" />
- </dataarea>
- </part>
- </software>
-
<software name="clchess4">
<description>Colossus Chess IV</description>
<year>1986</year>
@@ -11826,21 +5424,6 @@ license:CC0-1.0
</part>
</software>
- <software name="astinspc">
- <description>Asteroids in Space</description>
- <year>1980</year>
- <publisher>Quality Software</publisher>
- <info name="usage" value="Runs on any Apple II with 32K and a 13-sector drive." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241425">
- <rom name="asteroids in space.woz" size="241425" crc="b4e281cb" sha1="a0870556a5e29e79427c4528ff739472a75b6e99" />
- </dataarea>
- </part>
- </software>
-
<software name="gflcftbl">
<description>GFL Championship Football</description>
<year>1987</year>
@@ -11856,774 +5439,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wldgames">
- <description>World Games</description>
- <year>1987</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234791">
- <rom name="world games disk 1a.woz" size="234791" crc="c722ae5d" sha1="2b9fc2a7093fdcb874ac195ff0b688d4d56a1a47" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234791">
- <rom name="world games disk 1b.woz" size="234791" crc="625223f6" sha1="8a6acf1944d887375b67e9ee6fca3c0c754a45a4" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234791">
- <rom name="world games disk 2a.woz" size="234791" crc="653ddd83" sha1="dbd90c9ba7ef40909533355a9a6b2743fe6dfd00" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234791">
- <rom name="world games disk 2b.woz" size="234791" crc="139843bc" sha1="8ddc3265be97f3d6a375671ab1a7a9f5341ccb18" />
- </dataarea>
- </part>
- </software>
-
- <software name="7citygld">
- <description>The Seven Cities of Gold</description>
- <year>1984</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="228178">
- <rom name="the seven cities of gold side a.woz" size="228178" crc="7a779b11" sha1="cb7a07fc9fd5f1f4692bd2537c790d03f47e3aa8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234834">
- <rom name="the seven cities of gold side b.woz" size="234834" crc="53dac48f" sha1="df148ec17c6943da18b60b9856573d846ad5b838" />
- </dataarea>
- </part>
- </software>
-
- <software name="rcktfcty">
- <description>Rocket Factory (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241545">
- <rom name="rocket factory.woz" size="241545" crc="835e1ff2" sha1="7652b6202b7cd7454abfabc59306221cb47d6703" />
- </dataarea>
- </part>
- </software>
-
- <software name="expchaos">
- <description>Exploring Chaos (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234835">
- <rom name="exploring chaos.woz" size="234835" crc="69cad8cc" sha1="ed21e12ac59e0161db70e81d3dc01e34f968250a" />
- </dataarea>
- </part>
- </software>
-
- <software name="wndlpzls">
- <description>Wonderland Puzzles (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234836">
- <rom name="wonderland puzzles.woz" size="234836" crc="da667e28" sha1="a4e487b3500f1c1880efa815b83482ca9997ae32" />
- </dataarea>
- </part>
- </software>
-
- <software name="trs4sale">
- <description>Treasures for Sale (version 1.0)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234843">
- <rom name="treasures for sale.woz" size="234843" crc="48bf4cdd" sha1="30584192bdecb72c8b25885394bf8177e5ac7283" />
- </dataarea>
- </part>
- </software>
-
- <software name="tkchance">
- <description>Take a Chance! (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234846">
- <rom name="take a chance.woz" size="234846" crc="aa2143da" sha1="fdf4cf678b2b5ab8f6a0195929b33653f021eb77" />
- </dataarea>
- </part>
- </software>
-
- <software name="pizza2go">
- <description>Pizza To Go (version 1.0)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234858">
- <rom name="pizza to go.woz" size="234858" crc="bc76db40" sha1="4914f4b503b1bffd476f6a5185508f929b4edda0" />
- </dataarea>
- </part>
- </software>
-
- <software name="movmusem">
- <description>Moving Museum (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234837">
- <rom name="moving museum.woz" size="234837" crc="92664dca" sha1="2d97f3736666b71f64343cd4d1d1861c183bf979" />
- </dataarea>
- </part>
- </software>
-
- <software name="nutnabbr">
- <description>Nutrition Nabber (version 1.0)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234838">
- <rom name="nutrition nabber.woz" size="234838" crc="32b8ec50" sha1="6214906af74523d678531965d23cfe498ffa5adc" />
- </dataarea>
- </part>
- </software>
-
- <software name="fishschl">
- <description>Fish School (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-08 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234836">
- <rom name="fish school.woz" size="234836" crc="e1776ea6" sha1="8d9c721670a8c9434e91c48ac6a93b6480415c4b" />
- </dataarea>
- </part>
- </software>
-
- <software name="picastory">
- <description>Picture a Story (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234810">
- <rom name="picture a story.woz" size="234810" crc="772978dc" sha1="254e2e67b69b62d08f3db4c14583c3b5c4fac109" />
- </dataarea>
- </part>
- </software>
-
- <software name="grmrmadn">
- <description>Grammar Madness (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234836">
- <rom name="grammar madness.woz" size="234836" crc="5988fa14" sha1="3a7e1f648521ff82cf9208c30e95e2fc8cf90e45" />
- </dataarea>
- </part>
- </software>
-
- <software name="grmrgobl">
- <description>Grammar Gobble (version 1.0)</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234821">
- <rom name="grammar gobble.woz" size="234821" crc="8bdecc6e" sha1="a7d72975646978b2697fc4a048113fd75d78fcd3" />
- </dataarea>
- </part>
- </software>
-
- <software name="expseqsr">
- <description>Exploring Sequences and Series (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234872">
- <rom name="exploring sequences and series.woz" size="234872" crc="56aa52cd" sha1="53f75c0913cb8a3a30bf29af04c1f142a8e6322f" />
- </dataarea>
- </part>
- </software>
-
- <software name="sunseasn">
- <description>Sun and Seasons (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234822">
- <rom name="sun and seasons.woz" size="234822" crc="53c20ac7" sha1="e7431c1b752be65e5aa03ae3906dc70f4b5e9886" />
- </dataarea>
- </part>
- </software>
-
- <software name="livncell">
- <description>The Living Cell (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241501">
- <rom name="the living cell.woz" size="241501" crc="1566ea9b" sha1="fbefd9022ea256b8aa4f56f046b60f70db616d4b" />
- </dataarea>
- </part>
- </software>
-
- <software name="probsnim">
- <description>Problem Solving with Nim (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234851">
- <rom name="problem solving with nim.woz" size="234851" crc="795bb73f" sha1="3c4a180b71185ad765e2bafc191398ad19e9b755" />
- </dataarea>
- </part>
- </software>
-
- <software name="paprpilt">
- <description>Paper Plane Pilot (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-09 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234873">
- <rom name="paper plane pilot.woz" size="234873" crc="0773f7e8" sha1="7586aec28a4a64ab61e39ece12e3ed457327e741" />
- </dataarea>
- </part>
- </software>
-
- <software name="5sfrcast">
- <description>Five-Star Forecast (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241518">
- <rom name="five-star forecast.woz" size="241518" crc="ef0a9397" sha1="1578ed153cfb76364ef4fbb280bcb1159a7829b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="grmrtysh">
- <description>Grammar Toy Shop (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234868">
- <rom name="grammar toy shop.woz" size="234868" crc="4534fe62" sha1="9188f8776850a2d5faeb188453ae0e1616e47f92" />
- </dataarea>
- </part>
- </software>
-
- <software name="mrphminr">
- <description>Murphy's Minerals (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234840">
- <rom name="murphy's minerals.woz" size="234840" crc="ee7de57d" sha1="4eba941e3b4a558c336c3930ccb138de1c51dc28" />
- </dataarea>
- </part>
- </software>
-
- <software name="lunrgrnh">
- <description>Lunar Greenhouse (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234824">
- <rom name="lunar greenhouse.woz" size="234824" crc="418d7ad6" sha1="a78e4f6ebda70b5d41acc30543c6dc1204d3dfed" />
- </dataarea>
- </part>
- </software>
-
- <software name="foslhntr">
- <description>Fossil Hunter (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234819">
- <rom name="fossil hunter.woz" size="234819" crc="e3dee6e4" sha1="a7247caa992d400d9df2424bde33602a6e3a71dc" />
- </dataarea>
- </part>
- </software>
-
- <software name="weedtree">
- <description>Weeds to Trees (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234840">
- <rom name="weeds to trees.woz" size="234840" crc="22512a04" sha1="48e67347ef539f01eb6a4ef0c6596e5ca006e955" />
- </dataarea>
- </part>
- </software>
-
- <software name="minrcave">
- <description>Miner's Cave (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234907">
- <rom name="miner's cave.woz" size="234907" crc="8920ad2a" sha1="906bc19a5ac0d273fea0b45aa370276c332691e9" />
- </dataarea>
- </part>
- </software>
-
- <software name="estqs1">
- <description>Estimation: Quick Solve I (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234918">
- <rom name="estimation- quick solve i.woz" size="234918" crc="62eeefa8" sha1="d9e41383ac91a65db37c52d8b3b720e66b296e89" />
- </dataarea>
- </part>
- </software>
-
- <software name="eststrat">
- <description>Estimation Strategies (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234836">
- <rom name="estimation strategies.woz" size="234836" crc="47a12cc6" sha1="7db9cbef26d7bfcdb526018274fc53d55044e2ce" />
- </dataarea>
- </part>
- </software>
-
- <software name="estactiv">
- <description>Estimation Activities (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234855">
- <rom name="estimation activities.woz" size="234855" crc="4b1b30c1" sha1="ac9a0acf0dca9f005ab100711ee36ee3608f0bf4" />
- </dataarea>
- </part>
- </software>
-
- <software name="exgaslws">
- <description>Exploring Gas Laws (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234859">
- <rom name="exploring gas laws.woz" size="234859" crc="4cb03ce7" sha1="872b200be09e33b8c37204cc9bf1ec0bc25cead0" />
- </dataarea>
- </part>
- </software>
-
- <software name="invisbug">
- <description>Invisible Bugs (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241528">
- <rom name="invisible bugs.woz" size="241528" crc="8232ec2d" sha1="c5e07824a0d8e378d7210fc50b8c459c84e4581f" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmnavaw10">
- <description>Time Navigator Around The World (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234848">
- <rom name="time navigator around the world side a.woz" size="234848" crc="ca9519bc" sha1="85a17730fb15fa26072783c1b8bdd9d187fbd4d8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234848">
- <rom name="time navigator around the world side b.woz" size="234848" crc="010ef44b" sha1="a4fbf7359fc72ac61733ab1a6671af4fc6d4028c" />
- </dataarea>
- </part>
- </software>
-
- <software name="frcmnchr">
- <description>Fraction Munchers (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234767">
- <rom name="fraction munchers.woz" size="234767" crc="b9304e2e" sha1="31b7a5aa1c009f43734cb139680861372dc13bbf" />
- </dataarea>
- </part>
- </software>
-
- <software name="amzread1">
- <description>Those Amazing Reading Machines I (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-11 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234784">
- <rom name="those amazing reading machines i.woz" size="234784" crc="c1f668af" sha1="87186ef105f5f4f32938b3e3244339968c087212" />
- </dataarea>
- </part>
- </software>
-
- <software name="amzread2">
- <description>Those Amazing Reading Machines II (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234785">
- <rom name="those amazing reading machines ii.woz" size="234785" crc="93e7b4f3" sha1="fff19dc2da9ab2aaaae77e8490ee11143b00666d" />
- </dataarea>
- </part>
- </software>
-
- <software name="amzread3">
- <description>Those Amazing Reading Machines III (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234786">
- <rom name="those amazing reading machines iii.woz" size="234786" crc="9f803984" sha1="a36039d301953112003dea3a44c813ddd4a3a152" />
- </dataarea>
- </part>
- </software>
-
- <software name="measwrks">
- <description>Measure Works (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-12 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234858">
- <rom name="measure works.woz" size="234858" crc="030dacd4" sha1="a3bce72c165e9b01bea694cf6cfb17b6fdcc629a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mnyworks">
- <description>Money Works (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234750">
- <rom name="money works.woz" size="234750" crc="fd525e60" sha1="6082a8ea50e8b55e10a5f75a75d3f3dff84b1ef8" />
- </dataarea>
- </part>
- </software>
-
- <software name="wawcomp">
- <description>Words at Work: Compound It! (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234779">
- <rom name="words at work- compound it.woz" size="234779" crc="e076fe01" sha1="7c0c38a65f8eeccd7373033903fbb4f21290f2a5" />
- </dataarea>
- </part>
- </software>
-
- <software name="wawcontr">
- <description>Words at Work: Contraction Action (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234785">
- <rom name="words at work- contraction action.woz" size="234785" crc="6305aed4" sha1="18e58310b4c06bcd74f74c9e0e31cce52053e223" />
- </dataarea>
- </part>
- </software>
-
- <software name="wawprefp">
- <description>Words at Work: Prefix Power (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234779">
- <rom name="words at work- prefix power.woz" size="234779" crc="0bcad4b8" sha1="b9e5d2eaa67821122576080e495209f92cb46589" />
- </dataarea>
- </part>
- </software>
-
- <software name="wawsuffx">
- <description>Words at Work: Suffix Sense (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234779">
- <rom name="words at work- suffix sense.woz" size="234779" crc="f60376e0" sha1="c1a228d277ce5f8351d9d1bc168f0586cc33d158" />
- </dataarea>
- </part>
- </software>
-
- <software name="pptblend">
- <description>Phonics Prime Time: Blends and Digraphs (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="phonics prime time- blends and digraphs.woz" size="234791" crc="86e7a0c1" sha1="19333f3a00e6fac4ee1b6e91ab951ca7ccf21c6f" />
- </dataarea>
- </part>
- </software>
-
- <software name="ppticons">
- <description>Phonics Prime Time: Initial Consonants (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="240934">
- <rom name="phonics prime time- initial consonants.woz" size="240934" crc="6bc33509" sha1="e84f8158dc990db0b9063d4e91e38485179c810a" />
- </dataarea>
- </part>
- </software>
-
- <software name="pptfcons">
- <description>Phonics Prime Time: Final Consonants (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234788">
- <rom name="phonics prime time- final consonants.woz" size="234788" crc="7e29b4e0" sha1="0592eaf95d283ae3ee7bdde5358533a3bd72b669" />
- </dataarea>
- </part>
- </software>
-
- <software name="pptvow1">
- <description>Phonics Prime Time: Vowels I (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-06-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234780">
- <rom name="phonics prime time- vowels i.woz" size="234780" crc="89926d5d" sha1="11c90bce1a4d281872c0a5eebab8b99accbe212e" />
- </dataarea>
- </part>
- </software>
-
- <software name="mtarm410">
- <description>Those Amazing Reading Machines IV (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-07-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234810">
- <rom name="those amazing reading machines iv.woz" size="234810" crc="592ee96d" sha1="0c08795604e54300e1119b00d92b0311d24342d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="mspwm10">
- <description>Speedway Math (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-07-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234765">
- <rom name="speedway math.woz" size="234765" crc="a97daabb" sha1="8aeda33f513380483f9aa731468822b5327f3c55" />
- </dataarea>
- </part>
- </software>
-
- <software name="mqflsh10">
- <description>Quickflash! (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-07-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241419">
- <rom name="quickflash.woz" size="241419" crc="24590b00" sha1="6e563223fc4ecc13ecad4de95e84e6bd36128e2b" />
- </dataarea>
- </part>
- </software>
-
<software name="jaws">
<description>Jaws</description>
<year>1989</year>
@@ -12697,57 +5512,6 @@ license:CC0-1.0
</part>
</software>
- <software name="covmir83">
- <description>The Coveted Mirror (1983 Penguin Software release)</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-08-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234809">
- <rom name="the coveted mirror side a.woz" size="234809" crc="fa4eac65" sha1="a43525a878343733ab90eff7e96239759b6dd8b1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="234809">
- <rom name="the coveted mirror side b (boot).woz" size="234809" crc="8be720f9" sha1="79bee46d21b133bfcb3463f26e455bceb44f90e4" />
- </dataarea>
- </part>
- </software>
-
- <software name="wircppnc">
- <description>Write It Right! Capitalization and Punctuation</description>
- <year>1990</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-08-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234848">
- <rom name="write it right- punctuation and capitalization.woz" size="234848" crc="8d8a1f89" sha1="86ae9ecb8079e717f12a8f35a7d554ca4b5c9a1b" />
- </dataarea>
- </part>
- </software>
-
- <software name="valdaygr">
- <description>Valentine's Day Grump</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-08-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234751">
- <rom name="valentine's day grump.woz" size="234751" crc="cf60a469" sha1="3136cf10752f3b854e373161647106ecb670fd95" />
- </dataarea>
- </part>
- </software>
-
<software name="qstnba">
<description>NBA (version 1.0)</description>
<year>1988</year>
@@ -12763,98 +5527,6 @@ license:CC0-1.0
</part>
</software>
- <software name="panzstrk">
- <description>Panzer Strike! (version 1.0)</description>
- <year>1987</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-08-26 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - West" />
- <dataarea name="flop" size="234815">
- <rom name="panzer strike disk 1a - west.woz" size="234815" crc="b0e546b0" sha1="fde7cfaa28cbd480a70d4a37a9ff54b3cb2761dc" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - East" />
- <dataarea name="flop" size="234815">
- <rom name="panzer strike disk 1b - east.woz" size="234815" crc="e2731f0e" sha1="6413c2e15da56afab5d89c5bee62caddbbad4d74" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Africa" />
- <dataarea name="flop" size="234817">
- <rom name="panzer strike disk 2a - africa.woz" size="234817" crc="16f4c98f" sha1="4969af2b1bd8475121190badddb135ef3ac6a20e" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Scenarios" />
- <dataarea name="flop" size="234820">
- <rom name="panzer strike disk 2b - scenarios.woz" size="234820" crc="84882a5f" sha1="1ad24f21431dbb1da0bfcd4a8f0cc8ad3616cda2" />
- </dataarea>
- </part>
- </software>
-
- <software name="polquest">
- <description>Police Quest</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-08-22 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 1a.woz" size="234970" crc="af6389b9" sha1="098b10886ffa2cc01da6008f52297ec4a71a6af0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 1b.woz" size="234970" crc="e5d4d151" sha1="65a3383ec512de44b9830d442adc738d49f1fb33" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 2a.woz" size="234970" crc="050ae097" sha1="e0eb70b68dfc07af663d594458b481b78788953f" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 2b.woz" size="234970" crc="4c51dc70" sha1="1a29eee6b9441fe54cbb5b167378058a5748eaa4" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 3a.woz" size="234970" crc="955120d0" sha1="2929945e36ec04e573ff0e5dbeaa67354e5c4126" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 3b.woz" size="234970" crc="cef66bad" sha1="ab85b4f8ac965c680f53cf0f648c293f65ec900f" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side A" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 4a.woz" size="234970" crc="a1a74c19" sha1="fd9b2073fd115b230ef5511e11bdcd07c94192df" />
- </dataarea>
- </part>
- <part name="flop8" interface="floppy_5_25">
- <feature name="part_id" value="Disk 4 Side B" />
- <dataarea name="flop" size="234970">
- <rom name="police quest disk 4b.woz" size="234970" crc="9d1e12cf" sha1="a1ae7c97eabf5b352792f52eb1cb53f8a4d7c4fc" />
- </dataarea>
- </part>
- </software>
-
<software name="techncop">
<description>Techno Cop</description>
<year>1988</year>
@@ -12894,21 +5566,6 @@ license:CC0-1.0
</part>
</software>
- <software name="midmalad">
- <description>Midnight Malady</description>
- <year>1981</year>
- <publisher>Softsmith</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-08-23 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="248084">
- <rom name="midnight malady.woz" size="248084" crc="e5a4d95e" sha1="8b6370623049bf6d2312d2706fbb6e2da28c3b54" />
- </dataarea>
- </part>
- </software>
-
<software name="alfr32">
<description>Alf (version 3.2)</description>
<year>1987</year>
@@ -12946,74 +5603,13 @@ license:CC0-1.0
</part>
</software>
- <software name="cntralnc">
- <description>Centauri Alliance</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-10 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A - Program" />
- <dataarea name="flop" size="234852">
- <rom name="centauri alliance disk 1a - program.woz" size="234852" crc="fa11e457" sha1="45b56d9fc178334c47f0ea2947f8ec184a9d002b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B - Roster" />
- <dataarea name="flop" size="234851">
- <rom name="centauri alliance disk 1b - roster.woz" size="234851" crc="5ef9c3ea" sha1="3e6b47520a9acd70805a32b8dda47df7f12c9ec6" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A - Scenario 1" />
- <dataarea name="flop" size="234855">
- <rom name="centauri alliance disk 2a - scenario 1.woz" size="234855" crc="c06b5bdb" sha1="9b100db35d8288bc37ffd442b06166f7a460ff14" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B - Scenario 2" />
- <dataarea name="flop" size="234855">
- <rom name="centauri alliance disk 2b - scenario 2.woz" size="234855" crc="e1c88f5b" sha1="a15e0d8f55218b3ccb4419a893f43af11acb8a0a" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side A - Scenario 3" />
- <dataarea name="flop" size="234855">
- <rom name="centauri alliance disk 3a - scenario 3.woz" size="234855" crc="7b09e5bc" sha1="ae559226790a2be8368d165dd7940b761c77f35c" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3 Side B - Scenario 4" />
- <dataarea name="flop" size="234855">
- <rom name="centauri alliance disk 3b - scenario 4.woz" size="234855" crc="f3d9a9f9" sha1="1f9a1511f334e2a4db6e286e558f328e1e32a196" />
- </dataarea>
- </part>
- </software>
-
- <software name="agalxsc">
- <description>Apple Galaxian (StarCraft)</description>
- <year>1980</year>
- <publisher>StarCraft</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-10 -->
- <!-- The game was later re-released by Brøderbund Software. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="95008">
- <rom name="apple galaxian (starcraft).woz" size="95008" crc="146cab96" sha1="895197a33636e2a9f38a35bddc9ebc9b43963f08" />
- </dataarea>
- </part>
- </software>
-
<software name="applwrld">
<description>Apple World</description>
<year>1980</year>
<publisher>United Software of America</publisher>
- <info name="usage" value="Runs on any Apple II with 48K and requires a 13-sector drive." />
+ <info name="usage" value="Runs on any Apple ][ with 48K and requires a 13-sector drive." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2020-09-10 -->
<part name="flop1" interface="floppy_5_25">
@@ -13045,207 +5641,6 @@ license:CC0-1.0
</part>
</software>
- <software name="voodoois">
- <description>Voodoo Island</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234754">
- <rom name="voodoo island.woz" size="234754" crc="1587edf9" sha1="cda18cb196229f36546cfd305f1ea5923ea2e6eb" />
- </dataarea>
- </part>
- </software>
-
- <software name="forbcstl">
- <description>Forbidden Castle</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234757">
- <rom name="forbidden castle.woz" size="234757" crc="c6283c72" sha1="f6539f74138f9dc3bde42ec73cfb778db21e7a45" />
- </dataarea>
- </part>
- </software>
-
- <software name="amchal">
- <description>The American Challenge: A Sailing Simulation</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234809">
- <rom name="the american challenge.woz" size="234809" crc="f0bdf5e3" sha1="09c72b7a4b79a4fe59601dfc58db1db740aa8eb5" />
- </dataarea>
- </part>
- </software>
-
- <software name="themist">
- <description>The Mist</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234766">
- <rom name="the mist.woz" size="234766" crc="634e76c4" sha1="4df08a2efce9b077483dbe6e257fe68ee3ddf7a5" />
- </dataarea>
- </part>
- </software>
-
- <software name="bopnwrst">
- <description>Bop 'N Wrestle</description>
- <year>1986</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241412">
- <rom name="bop 'n wrestle.woz" size="241412" crc="f0d0bbd1" sha1="bb8c7aaf74f440d3c7df1c1b331bed24db526cdb" />
- </dataarea>
- </part>
- </software>
-
- <software name="bsstoryb12">
- <description>Bank Street Storybook (version 1.2)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234779">
- <rom name="bank street storybook v1.2 side a.woz" size="234779" crc="98e03cb9" sha1="b9d24394cd6c8a5f8f53a224234ff98cd69cf2d4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234779">
- <rom name="bank street storybook v1.2 side b.woz" size="234779" crc="29f0f0cb" sha1="60b15f34f20f2d2b235a845dd7cdb53ab03b33fe" />
- </dataarea>
- </part>
- </software>
-
- <software name="crswdm40">
- <description>Crossword Magic (version 4.0)</description>
- <year>1985</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Program disk" />
- <dataarea name="flop" size="121618">
- <rom name="crossword magic v4.0.woz" size="121618" crc="9ac4acfd" sha1="7e8c1ea7a614020e0515060eb20a2d4edca21498" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Language arts puzzle disk" />
- <dataarea name="flop" size="234806">
- <rom name="crossword magic v4.0 - language arts puzzle disk.woz" size="234806" crc="7df85022" sha1="b0b8096d67a82c09388b5e44ea62eca05752265f" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Math puzzle disk" />
- <dataarea name="flop" size="234797">
- <rom name="crossword magic v4.0 - math puzzle disk.woz" size="234797" crc="5aaea7e4" sha1="782c541d4ab8acd54c2daa530f8084052c3de378" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Reading puzzle disk" />
- <dataarea name="flop" size="234800">
- <rom name="crossword magic v4.0 - reading puzzle disk.woz" size="234800" crc="943f43dc" sha1="d9bd4a7d5550c0c5196ec1abca93f4f20eb3ab6c" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Science puzzle disk" />
- <dataarea name="flop" size="234800">
- <rom name="crossword magic v4.0 - science puzzle disk.woz" size="234800" crc="c07eedbe" sha1="9302c44ab35b0fd1691ae84bf4eecd642d0f53ae" />
- </dataarea>
- </part>
- <part name="flop6" interface="floppy_5_25">
- <feature name="part_id" value="Social studies puzzle disk" />
- <dataarea name="flop" size="234807">
- <rom name="crossword magic v4.0 - social studies puzzle disk.woz" size="234807" crc="fb9f623b" sha1="80e8478e1712ecca8f0446cceef5162231f8bda9" />
- </dataarea>
- </part>
- <part name="flop7" interface="floppy_5_25">
- <feature name="part_id" value="Spelling puzzle disk" />
- <dataarea name="flop" size="234801">
- <rom name="crossword magic v4.0 - spelling puzzle disk.woz" size="234801" crc="36141dac" sha1="d4047b3f775d75571a95b160b3862c65d6285428" />
- </dataarea>
- </part>
- </software>
-
- <software name="ridlmgic">
- <description>Riddle Magic</description>
- <year>1987</year>
- <publisher>Mindscape</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-17 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Program" />
- <dataarea name="flop" size="234787">
- <rom name="riddle magic side a - program.woz" size="234787" crc="f660550a" sha1="54a9832ece9ac48893390f4d7a29ad0cee4ba7ee" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Data" />
- <dataarea name="flop" size="234784">
- <rom name="riddle magic side b - data.woz" size="234784" crc="a5a18fa1" sha1="97c7ac712d34e1b46b45e0a04c92c85a23bddca2" />
- </dataarea>
- </part>
- </software>
-
- <software name="apvatlan">
- <description>Apventure to Atlantis</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234810">
- <rom name="apventure to atlantis.woz" size="234810" crc="7ffaa071" sha1="cc30eebf031e15bec1970965fc8f822e6c5bdcda" />
- </dataarea>
- </part>
- </software>
-
- <software name="mumcurse">
- <description>Mummy's Curse</description>
- <year>1981</year>
- <publisher>Highlands Computers</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241416">
- <rom name="mummy's curse.woz" size="241416" crc="d78b9448" sha1="6dfc6e19addeee99a5642e5920604e80a56140bf" />
- </dataarea>
- </part>
- </software>
-
<software name="misnthhd">
<description>Mission on Thunderhead</description>
<year>1986</year>
@@ -13261,28 +5656,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spcrogue">
- <description>Space Rogue</description>
- <year>1989</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-09-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Boot" />
- <dataarea name="flop" size="234806">
- <rom name="space rogue side a - boot.woz" size="234806" crc="63639cb1" sha1="584e5fe82b9ee3861200e4359d68430a0f85cc9a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Data" />
- <dataarea name="flop" size="234806">
- <rom name="space rogue side b - data.woz" size="234806" crc="e8f19087" sha1="c4718d7619fb453e64f47db171fa6ddd2855baf5" />
- </dataarea>
- </part>
- </software>
-
<software name="swmwre21">
<description>Swimware (version 2.1)</description>
<year>1988</year>
@@ -13335,21 +5708,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bopabet">
- <description>Bop-A-Bet</description>
- <year>1983</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-10-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234786">
- <rom name="bop-a-bet.woz" size="234786" crc="9ff0b003" sha1="974b47183ef19b4e451b81568dbd3479acfe6c6e" />
- </dataarea>
- </part>
- </software>
-
<software name="fltmdlr">
<description>Flight: The Aerodynamics of Model Rockets</description>
<year>1986</year>
@@ -13403,8 +5761,9 @@ license:CC0-1.0
<description>Bill Budge's Trilogy of Games</description>
<year>1979</year>
<publisher>California Pacific Computer</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2020-10-07 -->
<part name="flop1" interface="floppy_5_25">
@@ -13418,8 +5777,10 @@ license:CC0-1.0
<description>Time Lord</description>
<year>????</year>
<publisher>Ramware</publisher>
- <info name="usage" value="Requires an original Apple ][ with 48K and Integer BASIC in ROM." />
+ <info name="author" value="Michael Prescott" />
+ <info name="usage" value="Requires an Apple ][ with 48K and Integer BASIC in ROM." />
<sharedfeat name="compatibility" value="A2" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2020-10-07 -->
<!-- The program is undated and release year is unknown. -->
@@ -13445,38 +5806,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ttnlahs">
- <description>The Time Tunnel: American History Series</description>
- <year>1984</year>
- <publisher>Focus Media</publisher>
- <info name="programmer" value="Fred Burggraf and James Gray" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-10-08 -->
- <!--educational game-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241504">
- <rom name="the time tunnel- american history series.woz" size="241504" crc="f8108dc8" sha1="e65d7b54cc7397d988ea11533b77244778577854" />
- </dataarea>
- </part>
- </software>
-
- <software name="ttnlane">
- <description>The Time Tunnel: A Nation Emerges</description>
- <year>1984</year>
- <publisher>Focus Media</publisher>
- <info name="programmer" value="Fred Burggraf, Rebecca Benton, Linda Pratt, and Jerry Camilleri" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-10-09 -->
- <!--educational game-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234872">
- <rom name="the time tunnel- a nation emerges.woz" size="234872" crc="34abd88d" sha1="21163d163b379f9198aae8a6792a46a2004a553a" />
- </dataarea>
- </part>
- </software>
-
<software name="beaglbsc">
<description>Beagle BASIC</description>
<year>1983</year>
@@ -13620,7 +5949,7 @@ license:CC0-1.0
<publisher>Beagle Bros.</publisher>
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2020-10-11 -->
- <!-- The 48K DOS 3.3 version is on side A; the 64K ProDOS version is on side B.-->
+ <!-- The 48K DOS 3.3 version is on side A; the 64K ProDOS version is on side B. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - 48K DOS 3.3 version" />
@@ -13785,7 +6114,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2020-10-14 -->
- <!--This requires the Apple Mechanic program disk.-->
+ <!-- This requires the Apple Mechanic program disk. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234760">
@@ -13987,21 +6316,6 @@ license:CC0-1.0
</part>
</software>
- <software name="g1985v2">
- <description>Germany 1985 (version 2.0)</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-10-29 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234775">
- <rom name="germany 1985 v2.0.woz" size="234775" crc="85a4ff9d" sha1="daf67f5de2cce689f9692b3d92c5e80dc6668a12" />
- </dataarea>
- </part>
- </software>
-
<software name="lionshar">
<description>The Lion's Share</description>
<year>1983</year>
@@ -14092,111 +6406,6 @@ license:CC0-1.0
</part>
</software>
- <software name="esctraam">
- <description>The Escape from Traam</description>
- <year>1981</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234835">
- <rom name="the escape from traam.woz" size="234835" crc="32c62e16" sha1="5c3e7f84dd9a2edfa1f8e7489bee77bfa548947a" />
- </dataarea>
- </part>
- </software>
-
- <software name="ringqst">
- <description>Ring Quest</description>
- <year>1986</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234773">
- <rom name="ring quest side a.woz" size="234773" crc="c4cfcc97" sha1="c662ca402e3e48c0313340890b64ce7d5bb57179" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234773">
- <rom name="ring quest side b.woz" size="234773" crc="2c038626" sha1="0424eaf527833a0de9781b76ac663b9f1fdab69d" />
- </dataarea>
- </part>
- </software>
-
- <software name="srpst10b">
- <description>The Serpent's Star (version 1.0) (Brøderbund release)</description>
- <year>1983</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234815">
- <rom name="the serpent's star v1.0-broderbund side a.woz" size="234815" crc="9f64b113" sha1="b6e4a8adc936857c7e3731053d562f1a762c7deb" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234815">
- <rom name="the serpent's star v1.0-broderbund side b.woz" size="234815" crc="c725b491" sha1="ce3699f47968b69139874915476e94ce6c8ac55d" />
- </dataarea>
- </part>
- </software>
-
- <software name="thequest">
- <description>The Quest</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-06 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234796">
- <rom name="the quest side a.woz" size="234796" crc="cd012991" sha1="71f0041276cf8647d90b70268374662008199ebf" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234796">
- <rom name="the quest side b.woz" size="234796" crc="b0587d13" sha1="2ae465cd8af0cc6f9474de84fc57ee268a5f683f" />
- </dataarea>
- </part>
- </software>
-
- <software name="tquestv2">
- <description>The Quest (version 2.0)</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-06 -->
- <!-- This updated version displays double hi-res graphics on supporting machines.
- (Double hi-res graphics require a 128K Apple //e or later.) -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234823">
- <rom name="the quest v2.0 side a.woz" size="234823" crc="f3d27280" sha1="2bcdd7a22583403e66f2a4c0e1829b9b585f2d29" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234823">
- <rom name="the quest v2.0 side b.woz" size="234823" crc="802f008f" sha1="13d06f6d50cd83692b9aa287c58c36969728dc35" />
- </dataarea>
- </part>
- </software>
-
<software name="suprmrtn">
<description>Supermartian: The Adventure</description>
<year>1984</year>
@@ -14275,34 +6484,6 @@ license:CC0-1.0
</part>
</software>
- <software name="talsman">
- <description>Talisman: Challenging the Sands of Time</description>
- <year>1987</year>
- <publisher>Polarware</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1 - Boot" />
- <dataarea name="flop" size="234815">
- <rom name="talisman- challenging the sands of time side 1 - boot.woz" size="234815" crc="e47a66c5" sha1="e56c9dc88165b4cd58d44c2c9694d08dc9cd6e9e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2 - Empire" />
- <dataarea name="flop" size="234817">
- <rom name="talisman- challenging the sands of time side 2 - empire.woz" size="234817" crc="2c5ae431" sha1="4fd8539305078c031b693aff3b4fe1a98f26b98b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3 - Lands beyond" />
- <dataarea name="flop" size="234823">
- <rom name="talisman- challenging the sands of time side 3 - lands beyond.woz" size="234823" crc="c96710c0" sha1="02767ab4644eb85b596f86df38283ced772ec1fa" />
- </dataarea>
- </part>
- </software>
-
<software name="9piamber">
<description>Nine Princes in Amber</description>
<year>1985</year>
@@ -14371,28 +6552,6 @@ license:CC0-1.0
</part>
</software>
- <software name="deathcrb">
- <description>Death in the Caribbean</description>
- <year>1983</year>
- <publisher>Micro Fun</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-11-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234798">
- <rom name="death in the caribbean side a.woz" size="234798" crc="6ea59a9b" sha1="8d63ae9bc2cabeeae3e56a763f14cef91035115c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234798">
- <rom name="death in the caribbean side b.woz" size="234798" crc="af03363c" sha1="0fe806b9c68a9b2d47d626b32cadaab0f272a188" />
- </dataarea>
- </part>
- </software>
-
<software name="brwdtime">
<description>Borrowed Time</description>
<year>1985</year>
@@ -14505,616 +6664,6 @@ license:CC0-1.0
</part>
</software>
- <software name="batsbelf">
- <description>Bats in the Belfry</description>
- <year>1983</year>
- <publisher>Phoenix Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="121627">
- <rom name="bats in the belfry.woz" size="121627" crc="b42681ec" sha1="84d8e3a1cc653faee017a319decdd87d353d7c36" />
- </dataarea>
- </part>
- </software>
-
- <software name="alnrain">
- <description>Alien Rain</description>
- <year>1980</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-07 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="101653">
- <rom name="alien rain.woz" size="101653" crc="3a2ecd02" sha1="3e5bce778cae684dd3dca0c195150b0152340d84" />
- </dataarea>
- </part>
- </software>
-
- <software name="horses">
- <description>Horses</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234736">
- <rom name="horses.woz" size="234736" crc="40cc52e7" sha1="afc59d569bc30ca26aece790ab9a551cfef0a568" />
- </dataarea>
- </part>
- </software>
-
- <software name="mtrcycls">
- <description>Motorcycles</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234741">
- <rom name="motorcycles.woz" size="234741" crc="c3f8adb0" sha1="0b5494ae379ccf14cc19cef3944a3c8f6e74fb0b" />
- </dataarea>
- </part>
- </software>
-
- <software name="pbunyan">
- <description>Paul Bunyan</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234741">
- <rom name="paul bunyan.woz" size="234741" crc="631f1848" sha1="7be38cff6392cda6d5e32b52b61cd6ffc310ecda" />
- </dataarea>
- </part>
- </software>
-
- <software name="tseasons">
- <description>The Seasons</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234741">
- <rom name="the seasons.woz" size="234741" crc="7cf0ba08" sha1="492c2a744c5945affff28aa15a3ea6a1747725e4" />
- </dataarea>
- </part>
- </software>
-
- <software name="casechic">
- <description>Case of the Missing Chick: Finding The Main Idea</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-14 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234797">
- <rom name="case of the missing chick - main idea and supporting details.woz" size="234797" crc="c02fae11" sha1="cf32964f2852d299008965e9dadc337e9932df1b" />
- </dataarea>
- </part>
- </software>
-
- <software name="casegtr">
- <description>Case of the Great Train Robbery: Fact and Opinion</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234786">
- <rom name="case of the great train robbery - fact or opinion.woz" size="234786" crc="7c129532" sha1="52d5d4207c13c082ca85bf2af1e9922e82cbc0f7" />
- </dataarea>
- </part>
- </software>
-
- <software name="mrswiggl">
- <description>Mrs. Wigglesworth's Secret</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234785">
- <rom name="mrs. wigglesworth's secret - drawing conclusions.woz" size="234785" crc="692a79e3" sha1="778bab447ebcd74dd1886b8c2e7e1291c00ef66d" />
- </dataarea>
- </part>
- </software>
-
- <software name="lrn2time">
- <description>Learning to Tell Time</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-16 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234751">
- <rom name="learning to tell time.woz" size="234751" crc="ab2804c5" sha1="77a74d6c72a35bb43797b8fab783420412c643df" />
- </dataarea>
- </part>
- </software>
-
- <software name="algncroc">
- <description>Alligators and Crocodiles</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2020-12-13 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234780">
- <rom name="alligators and crocodiles.woz" size="234780" crc="ce4f1d6d" sha1="5d9bdbe3cf47723775b18e79a14fd2df6dce2659" />
- </dataarea>
- </part>
- </software>
-
- <software name="lslibrary">
- <description>Library Skills: Let's Learn About The Library</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-01-05 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="234775">
- <rom name="let's learn about the library disk 1.woz" size="234775" crc="1825591a" sha1="f5f1b26710f87c9aba3d3fdaba5cc348d9151fe9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="234775">
- <rom name="let's learn about the library disk 2.woz" size="234775" crc="56ff0e2f" sha1="2a87f73c0b3b8a393b86b58c03cc730dc86f6cc9" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3" />
- <dataarea name="flop" size="234775">
- <rom name="let's learn about the library disk 3.woz" size="234775" crc="a1a49df0" sha1="d5b2cf6ff3a64df41c09c1ec140dee3eb1d1df97" />
- </dataarea>
- </part>
- </software>
-
- <software name="rdfbcons">
- <description>Reading Fun: Beginning Consonant Sounds</description>
- <year>1988</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-02 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234777">
- <rom name="reading fun- beginning consonant sounds.woz" size="234777" crc="8826fdd0" sha1="e17c0230d1249a1cd6823bc10d423b8239ada3c4" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmc3md">
- <description>Troll Math Class Level 3: I Can Multiply and Divide</description>
- <year>1988</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234831">
- <rom name="troll math class level 3- i can multiply and divide.woz" size="234831" crc="d148b33d" sha1="bc56b8fa23f0ebedcb5760fadfe0bafef383525f" />
- </dataarea>
- </part>
- </software>
-
- <software name="raskncst">
- <description>Read and Spell: In the Days of Knights and Castles</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-03 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="234861">
- <rom name="read and spell- in the days of knights and castles disk 1.woz" size="234861" crc="be4bed3d" sha1="54ee6208b98b08ab1e5dfe53ba1c549c8ae69744" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="234861">
- <rom name="read and spell- in the days of knights and castles disk 2.woz" size="234861" crc="58995d23" sha1="706f8297adf8d64d8533e6814fd03a91944e9f26" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmc4aaas">
- <description>Troll Math Class Level 4: Advanced Addition and Subtraction</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234952">
- <rom name="troll math class level 4- advanced addition and subtraction.woz" size="234952" crc="044d7026" sha1="adbf4ddeefa25b179c3b278595c1652a3a2f6b41" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmc5amad">
- <description>Troll Math Class Level 5: Advanced Multiplication and Division</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234882">
- <rom name="troll math class level 5- advanced multiplication and division.woz" size="234882" crc="affa1976" sha1="1624838bed675a5afe3f5fe3743c4d434cd23cea" />
- </dataarea>
- </part>
- </software>
-
- <software name="thbdigex">
- <description>The Human Body and How It Works: The Digestive and Excretory Systems</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234884">
- <rom name="the human body and how it works- the digestive and excretory systems.woz" size="234884" crc="324c6b54" sha1="f7da08e97d5856e20e1064d54be8d56305883003" />
- </dataarea>
- </part>
- </software>
-
- <software name="thbsklms">
- <description>The Human Body and How It Works: The Skeletal and Muscular Systems</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234899">
- <rom name="the human body and how it works- the skeletal and muscular systems.woz" size="234899" crc="879443d6" sha1="ffeae22f1ace747d1670487b12cba5c841eb7c9b" />
- </dataarea>
- </part>
- </software>
-
- <software name="posfwvrb">
- <description>Parts of Speech: Fun with Verbs</description>
- <year>1991</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-02-04 -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234847">
- <rom name="parts of speech- fun with verbs.woz" size="234847" crc="14c86953" sha1="fd647f827339f65fe625c4a5c9604ece8fed8330" />
- </dataarea>
- </part>
- </software>
-
- <software name="umapglbs">
- <description>Understanding Maps and Globes</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-01-15 -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="234757">
- <rom name="understanding maps and globes disk 1.woz" size="234757" crc="98205b76" sha1="23a8b270179f5ff72282a4b083de89e427bf5575" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="234757">
- <rom name="understanding maps and globes disk 2.woz" size="234757" crc="f68503e1" sha1="c8d6c5ba3db7c385c00a4e24cf022dbdf3e5fff0" />
- </dataarea>
- </part>
- </software>
-
- <software name="sdwsnkrs">
- <description>Sidewalk Sneakers</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Bonnie Seiler and Michael Sweet" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-23 -->
- <!--"Sidewalk Sneakers" is a 1991 educational game developed by Bonnie Seiler and Michael Sweet, and distributed by Sunburst Communications. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234815">
- <rom name="sidewalk sneakers.woz" size="234815" crc="eca45646" sha1="29f5f8fd6e748f2a31b370bf5fdc24f68ac9c39f" />
- </dataarea>
- </part>
- </software>
-
- <software name="anmrescu">
- <description>Animal Rescue</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
- <info name="programmer" value="S. Hosler, Mark Wharton, and Philip Wharton" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-24 -->
- <!--"Animal Rescue" is a 1991 educational game developed by S. Hosler, Mark Wharton, and Philip Wharton, and distributed by Sunburst Communications. -->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234821">
- <rom name="animal rescue.woz" size="234821" crc="a9f9ad80" sha1="8ae4d857d2742d087be18ba941e5b13da3509005" />
- </dataarea>
- </part>
- </software>
-
- <software name="mckmgrdr">
- <description>Mickey's Magic Reader</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Neil Larimer and Mary Anne Hermann" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-24 -->
- <!--"Mickey's Magic Reader" is a 1989 educational game developed by Neil Larimer and Mary Anne Hermann, and distributed by Sunburst Communications.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234824">
- <rom name="mickey's magic reader.woz" size="234824" crc="e8373ccf" sha1="ff7126fe65a08b88f1b4c59db8bcb74e44558c94" />
- </dataarea>
- </part>
- </software>
-
- <software name="afctadv">
- <description>Animals Facts and Adventures</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi (design, graphics, animation, and script), Diane Ashachik (editing), and Gregory Truex (programming)" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Animal Facts and Adventures" is a 1992 educational program developed by Nancy Patrissi (design, graphics, animation, and script), Diane Ashachik (editing), and Gregory Truex (programming), and distributed by Troll Associates. This was distributed as a non-bootable disk; it requires a separate ProDOS boot disk or hard drive.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234891">
- <rom name="animal facts and adventures.woz" size="234891" crc="f27a7a8b" sha1="1440109b0e7ad34a16016cd698a03ad38c06dfbb" />
- </dataarea>
- </part>
- </software>
-
- <software name="dinosplb">
- <description>Dino Speller: Beginning Dictionary Skills</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi and Alison Bennett" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Dino Speller: Beginning Dictionary Skills" is a 1992 educational program developed by Nancy Patrissi and Alison Bennett, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234819">
- <rom name="dino speller.woz" size="234819" crc="91be9f89" sha1="4c34a08c73e0f30dd520053ab17b7e534497ccb7" />
- </dataarea>
- </part>
- </software>
-
- <software name="keyworksf">
- <description>Keyworks: First Keyboarding Skills</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Hudson Ansley and Millicent Sabater" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Keyworks: First Keyboarding Skills" is a 1992 educational program developed by Hudson Ansley and Millicent Sabater, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234814">
- <rom name="keyworks.woz" size="234814" crc="22a1847c" sha1="e45ef79a88f1f92b34641f48d66ce299bb5fa450" />
- </dataarea>
- </part>
- </software>
-
- <software name="posfwnap">
- <description>Parts of Speech: Fun with Nouns and Pronouns</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi, Gregory Truex, Thomas Whiting, and Diane Ashachik" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Parts of Speech: Fun with Nouns and Pronouns" is a 1992 educational program developed by Nancy Patrissi, Gregory Truex, Thomas Whiting, and Diane Ashachik, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234851">
- <rom name="parts of speech- fun with nouns and pronouns.woz" size="234851" crc="b004e1f5" sha1="2aafd05be7c8743d431db41ff4b1a684a53f8c96" />
- </dataarea>
- </part>
- </software>
-
- <software name="tomsawyr">
- <description>Troll Reading Games: The Adventures of Tom Sawyer</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Millicent Sabater, Thomas Whiting, Hudson Ansley, and Diane Ashachik" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Troll Reading Games: The Adventures of Tom Sawyer" is a 1992 educational program developed by Millicent Sabater, Thomas Whiting, Hudson Ansley, and Diane Ashachik, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234859">
- <rom name="troll reading games- the adventures of tom sawyer.woz" size="234859" crc="fcbae0cb" sha1="1e2370fbda9c6738ff82fb7acac45b3c257f39da" />
- </dataarea>
- </part>
- </software>
-
- <software name="graphmkr">
- <description>Graph Maker: Introduction to Graphs and Charts</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Millicent Sabater, Hudson Ansley, Bonnie Seiler, and Nancy Patrissi" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Graph Maker: Introduction to Graphs and Charts" is a 1993 educational program developed by Millicent Sabater, Hudson Ansley, Bonnie Seiler, and Nancy Patrissi, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234855">
- <rom name="graph maker- introduction to graphs and charts.woz" size="234855" crc="5903ea17" sha1="5c38eb87ebd336dab53ed7e0f7aa305d49508baa" />
- </dataarea>
- </part>
- </software>
-
- <software name="lgtmapsk">
- <description>Let's Go There: Beginning Map and Geography Skills</description>
- <year>1993</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi, Alison Bennett, and Bonnie Seiler" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Let's Go There: Beginning Maps and Geography Skills" is a 1993 educational program developed by Nancy Patrissi, Alison Bennett, and Bonnie Seiler, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234842">
- <rom name="let's go there- beginning map and geography skills.woz" size="234842" crc="4b4956f9" sha1="be9bb6e647067ab1ba880322c7641686022e8983" />
- </dataarea>
- </part>
- </software>
-
- <software name="llacomp">
- <description>Let's Learn About Computers</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Millicent Sabater, Thomas Whiting, Bonnie Seiler, and Nancy Patrissi" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Let's Learn About Computers" is a 1994 educational program developed by Millicent Sabater, Thomas Whiting, Bonnie Seiler, and Nancy Patrissi, and distributed by Troll Associates. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234829">
- <rom name="let's learn about computers.woz" size="234829" crc="53113bee" sha1="e5f069b6306ad52e7580e1d68e57aa7b4be57613" />
- </dataarea>
- </part>
- </software>
-
- <software name="tdyply89">
- <description>Teddy's Playground (1989 Rerelease)</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="programmer" value="Donna Stanger and Lon Koenig" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-04-28 -->
- <!--"Teddy's Playground" is a 1985 educational program developed by Donna Stanger and Lon Koenig, and distributed by Sunburst Communications. This is the 1989 re-release. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234815">
- <rom name="teddy's playground 1989.woz" size="234815" crc="3adfcaa3" sha1="852e2457948c44681c5e3b598166ce410e3f7b51" />
- </dataarea>
- </part>
- </software>
-
- <software name="pop35">
- <description>Prince of Persia (800K 3.5")</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-06-30 -->
- <!--"Prince of Persia" is a 1989 action game developed by Jordan Mechner and distributed by Brøderbund Software. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1297161">
- <rom name="prince of persia 800k.woz" size="1297161" crc="e166d56a" sha1="d9558d25a3d3d91542f32abba9e6b0e2f2c75b09" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwlybdy">
- <description>Woolly's Birthday (version 1.0) (800K 3.5")</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-06-30 -->
- <!--"Woolly's Birthday" is a 1994 educational game developed by Dee Dee Daus, Ruth Kivisto, Pat Korn, Claudio Valenzuela, and Ju Chang Wang, and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296222">
- <rom name="woolly's birthday 800k.woz" size="1296222" crc="a38217f8" sha1="18fdd8d2e5903d0959545de4c7103d35ec997ef8" />
- </dataarea>
- </part>
- </software>
-
- <software name="playroom35">
- <description>The Playroom (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-07-07 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"The Playroom" is a 1989 educational game developed by Leslie Grimm, Dennis Caswell, Lynn Kirkpatrick, D. Buttlaire, and D. Albrecht, and distributed by Brøderbund Software. This is version 1.0. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296725">
- <rom name="the playroom 800k.woz" size="1296725" crc="10097dce" sha1="3c7b60daa0ae07bee2289cea5f6b4d2ef0c4dcad" />
- </dataarea>
- </part>
- </software>
-
- <software name="suprprnt">
- <description>SuperPrint! (version 1.4) (800K 3.5")</description>
- <year>1987</year>
- <publisher>Pelican Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-07-07 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"SuperPrint!" is a 1987 graphics program developed by Joel Fried, Susan Swanson, Ken Grey, Lester Humphreys, Kim Looney, and David Shearer, and distributed by Pelican Software. This is version 1.4. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296709">
- <rom name="superprint 800k.woz" size="1296709" crc="aa173e19" sha1="50666697478bbfb7b80819fbc6b368c1111eb3ad" />
- </dataarea>
- </part>
- </software>
-
<software name="rampag35">
<description>Rampage (800K 3.5")</description>
<year>1988</year>
@@ -15122,7 +6671,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-07 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"Rampage" is a 1988 action game ported to the Apple II by Ken Hurley, J. David Koch, Kelly Flock, Steve Imes, and Alex Edelstein, and distributed by Activision. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card.-->
+ <!-- "Rampage" is a 1988 action game ported to the Apple ][ by Ken Hurley, J. David Koch, Kelly Flock, Steve Imes, and Alex Edelstein, and distributed by Activision. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1312568">
@@ -15138,7 +6687,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-08 -->
- <!--"Hegira: Tale of a Galactic Exile" is a 1983 adventure game developed and distributed by Ted Butler. It runs on any Apple II with 48K.-->
+ <!-- "Hegira: Tale of a Galactic Exile" is a 1983 adventure game developed and distributed by Ted Butler. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234844">
@@ -15147,22 +6696,6 @@ license:CC0-1.0
</part>
</software>
- <software name="alpls135">
- <description>Alge-Blaster Plus! (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-07-15 -->
- <!--"Alge-Blaster Plus!" is a 1989 educational program developed by Julie Baumgartner, Anne Hertz, David Ely, and Louis X. Savain, and distributed by Davidson and Associates. This is version 1.0, distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296215">
- <rom name="alge-blaster plus v1.0 800k.woz" size="1296215" crc="e3cdd077" sha1="c8654d483ac58e75789106da606ed7b7484511e7" />
- </dataarea>
- </part>
- </software>
-
<software name="mckcrswd">
<description>Mickey's Crossword Puzzle Maker (800K 3.5")</description>
<year>1990</year>
@@ -15170,7 +6703,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-15 -->
- <!--"Mickey's Crossword Puzzle Maker" is a 1990 educational game developed by David Mullich, Rick Ferreira, Ariella Lehrer, Stan Wojtysiak, Kathleen Parades, Stan Wojtysiak, John Miller, Pat Campbell, Tine Sloan, Annelise Falk, Michael Mroz, Beverly Ellman, and Fran Peskoff, and distributed by Walt Disney Computer Software. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
+ <!-- "Mickey's Crossword Puzzle Maker" is a 1990 educational game developed by David Mullich, Rick Ferreira, Ariella Lehrer, Stan Wojtysiak, Kathleen Parades, Stan Wojtysiak, John Miller, Pat Campbell, Tine Sloan, Annelise Falk, Michael Mroz, Beverly Ellman, and Fran Peskoff, and distributed by Walt Disney Computer Software. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1312716">
@@ -15186,7 +6719,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-20 -->
- <!--"Return of the Dinosaurs" is a 1988 educational game developed by Intentional Educations and distributed by American Educational Computer. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
+ <!-- "Return of the Dinosaurs" is a 1988 educational game developed by Intentional Educations and distributed by American Educational Computer. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1328970">
@@ -15195,22 +6728,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bswrtrpl">
- <description>Bank Street Writer Plus (800K 3.5")</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-07-25 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"Bank Street Writer Plus" is a 1989 productivity program developed by Gordon Riggs and distributed by Brøderbund Software. This version is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296168">
- <rom name="bank street writer plus 800k.woz" size="1296168" crc="731364bd" sha1="d7e9d1e9c777b8123c607cee5ec16435d24cec32" />
- </dataarea>
- </part>
- </software>
-
<software name="dsgnrail">
<description>Design Your Own Railroad (version 1.1C) (800K 3.5")</description>
<year>1990</year>
@@ -15218,7 +6735,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or an Apple //e or Apple ][+ with 48K and a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-25 -->
- <!--"Design Your Own Railroad" is a 1990 educational program developed by Don Fudge and distributed by Abracadata. This is version 1.1C. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or an Apple //e or Apple ][+ with 48K and a compatible drive controller card.-->
+ <!-- "Design Your Own Railroad" is a 1990 educational program developed by Don Fudge and distributed by Abracadata. This is version 1.1C. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or an Apple //e or Apple ][+ with 48K and a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296197">
@@ -15227,22 +6744,6 @@ license:CC0-1.0
</part>
</software>
- <software name="35grmrgm0587">
- <description>Grammar Gremlins (version 05.01.87) (800K 3.5")</description>
- <year>1987</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-07-25 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"Grammar Gremlins" is a 1987 educational program developed by Santa Barbara Softworks and distributed by Davidson and Associates. This version is dated 05.01.87. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296190">
- <rom name="grammar gremlins 800k.woz" size="1296190" crc="c7a3fa58" sha1="51c2184e0995f880ed7fa272224deb75959ae570" />
- </dataarea>
- </part>
- </software>
-
<software name="bglwrt3235">
<description>BeagleWrite (version 3.2) (800K 3.5")</description>
<year>1989</year>
@@ -15250,7 +6751,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-25 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"Beagle Write" is a 1989 productivity program developed by Kevin Harvey, Alex Perelberg, and Mark Munz, and distributed by Beagle Bros. This is version 3.2. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card.-->
+ <!-- "Beagle Write" is a 1989 productivity program developed by Kevin Harvey, Alex Perelberg, and Mark Munz, and distributed by Beagle Bros. This is version 3.2. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296189">
@@ -15266,7 +6767,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-25 redumped: 2021-12-14 to fix incorrect header information -->
- <!--"Design Your Own Home: Interior Design" is a 1986 productivity program developed by Don Fudge and distributed by Abracadata. This is version 2. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card.-->
+ <!-- "Design Your Own Home: Interior Design" is a 1986 productivity program developed by Don Fudge and distributed by Abracadata. This is version 2. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1328956">
@@ -15282,7 +6783,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-07-27 -->
- <!--"Willy Byte in the Digital Dimension" is a 1984 arcade game developed by Murray Krehbiel, with graphics by Greg Hammond, and distributed by Data Trek. It runs on any Apple II with 48K.-->
+ <!-- "Willy Byte in the Digital Dimension" is a 1984 arcade game developed by Murray Krehbiel, with graphics by Greg Hammond, and distributed by Data Trek. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15298,86 +6799,6 @@ license:CC0-1.0
</part>
</software>
- <software name="vcrc1135">
- <description>VCR Companion (version 1.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-10 -->
- <!--"VCR Companion" is a 1988 graphics program developed by Louis Ewens and Lauren Elliott, and distributed by Brøderbund Software. This is version 1.1. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296708">
- <rom name="vcr companion 800k.woz" size="1296708" crc="ec3956f8" sha1="8be36dcbaa81da0ecf10c1234abc9e803d6d2fa2" />
- </dataarea>
- </part>
- </software>
-
- <software name="algbl058735">
- <description>Alge-Blaster! (version 050187) (800K 3.5")</description>
- <year>1985</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-11 -->
- <!--"Alge-Blaster!" is a 1985 educational program developed by Jan Davidson, Ph.D., Anders Beitnes, Wendy Barels, Cathy Johnson, and distributed by Davidson and Associates. This version is dated 050187. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1328988">
- <rom name="alge-blaster 800k.woz" size="1328988" crc="62bffa5f" sha1="ccb4c3c43d3b7ad13cd3c7e5f2b59434af0b1e08" />
- </dataarea>
- </part>
- </software>
-
- <software name="wmprstmpr">
- <description>Whomper Stomper</description>
- <year>1984</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-11 -->
- <!--"Whomper Stomper" is a 1984 action game developed by Mike Wall and Marty Inchiosa, ported to the Apple II by Steve Waldo, and distributed by Adventure International. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234853">
- <rom name="whomper stomper.woz" size="234853" crc="99f67210" sha1="1ae2f9c644191954cbe586beb476b4bc19866d8b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwdmn1435">
- <description>Word Munchers (version 1.4) (800K 3.5")</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-16 -->
- <!--"Word Munchers" is a 1985 educational program developed and distributed by MECC. This is version 1.4. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345282">
- <rom name="word munchers 800k.woz" size="1345282" crc="fead6f7a" sha1="056730809f1e90b8159e8582eb2709a20bb46509" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwlybnc35">
- <description>Woolly Bounce (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-21 -->
- <!--"Woolly Bounce" is a 1991 educational program developed by Gene Breault, Scott Jensen, Charolyn Kapplinger, and Kim D. Smith, and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345371">
- <rom name="woolly bounce 800k.woz" size="1345371" crc="7d634eb2" sha1="364f06610a0f4353ed0b2af9a948c9bbef1c9706" />
- </dataarea>
- </part>
- </software>
-
<software name="hhgtgr56">
<description>The Hitchhiker's Guide to the Galaxy (Release 56 / 841221)</description>
<year>1984</year>
@@ -15385,7 +6806,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-23 -->
- <!--"The Hitchhiker's Guide to the Galaxy" is a 1984 adventure game developed by Douglas Adams and Steve Meretzky, and distributed by Infocom. This is release 56 / 841221. It runs on any Apple II with 48K.-->
+ <!-- "The Hitchhiker's Guide to the Galaxy" is a 1984 adventure game developed by Douglas Adams and Steve Meretzky, and distributed by Infocom. This is release 56 / 841221. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234852">
@@ -15401,7 +6822,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-23 -->
- <!--"The Hitchhiker's Guide to the Galaxy" is a 1984 adventure game developed by Douglas Adams and Steve Meretzky, and distributed by Infocom. This is release 58 / 851002. It runs on any Apple II with 48K.-->
+ <!-- "The Hitchhiker's Guide to the Galaxy" is a 1984 adventure game developed by Douglas Adams and Steve Meretzky, and distributed by Infocom. This is release 58 / 851002. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234835">
@@ -15417,7 +6838,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-23 -->
- <!--"The Hitchhiker's Guide to the Galaxy" is a 1984 adventure game developed by Douglas Adams and Steve Meretzky, and distributed by Infocom. This is release 31 / 871119. It requires a 128K Apple //e or later.-->
+ <!-- "The Hitchhiker's Guide to the Galaxy" is a 1984 adventure game developed by Douglas Adams and Steve Meretzky, and distributed by Infocom. This is release 31 / 871119. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15440,7 +6861,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-24 -->
- <!--"Beyond Zork" is a 1987 adventure game developed by Brian Moriarty and distributed by Infocom. This is release 49 / 870917. It requires a 128K Apple //e or later.-->
+ <!-- "Beyond Zork" is a 1987 adventure game developed by Brian Moriarty and distributed by Infocom. This is release 49 / 870917. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15463,7 +6884,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-24 -->
- <!--"Beyond Zork" is a 1987 adventure game developed by Brian Moriarty and distributed by Infocom. This is release 57 / 871221. It requires a 128K Apple //e or later.-->
+ <!-- "Beyond Zork" is a 1987 adventure game developed by Brian Moriarty and distributed by Infocom. This is release 57 / 871221. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15486,7 +6907,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-24 -->
- <!--"Border Zone" is a 1987 adventure game developed by Marc Blank and distributed by Infocom. This is release 9 / 871008. It requires a 128K Apple //e or later.-->
+ <!-- "Border Zone" is a 1987 adventure game developed by Marc Blank and distributed by Infocom. This is release 9 / 871008. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15509,7 +6930,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-24 -->
- <!--"Bureaucracy" is a 1987 adventure game developed by Michael Bywater and Douglas Adams, and distributed by Infocom. This is release 86 / 870212. It requires a 128K Apple //e or later.-->
+ <!-- "Bureaucracy" is a 1987 adventure game developed by Michael Bywater and Douglas Adams, and distributed by Infocom. This is release 86 / 870212. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15532,7 +6953,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-08-24 -->
- <!--"ProDOS" is a 1983 operating system developed by James R. Huston et. al. and distributed by Apple Computer. This pre-release version is labeled B.1A and dated December 9, 1982. It runs on any Apple II with 48K.-->
+ <!-- "ProDOS" is a 1983 operating system developed by James R. Huston et. al. and distributed by Apple Computer. This pre-release version is labeled B.1A and dated December 9, 1982. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234858">
@@ -15541,237 +6962,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mcpcmp35">
- <description>Picture Chompers (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-19 -->
- <!--"Picture Chompers" is a 1990 educational program developed by Sheila Dols, Scott Jensen, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, Liz Wendland, John Wlazlo, and Stephen Zehm, and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1344397">
- <rom name="picture chompers 800k.woz" size="1344397" crc="091ff1cf" sha1="678756bb9076214eed6ad491e614cf0a135629ac" />
- </dataarea>
- </part>
- </software>
-
- <software name="nmunch1335">
- <description>Number Munchers (version 1.3) (800K 3.5")</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-19 -->
- <!--"Number Munchers" is a 1986 educational program developed and distributed by MECC. This is version 1.3. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, Apple //e, or 64K Apple ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296147">
- <rom name="number munchers 800k.woz" size="1296147" crc="9cff06c6" sha1="3102ce194905e29afd6477dad9b7c5eb5efbb21d" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmyso1135">
- <description>Mystery Objects (version 1.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-19 -->
- <!--"Mystery Objects" is a 1988 educational program developed by Greg Holey, Luz Husebye, Charolyn Kapplinger, John Krenz, Sherry Leudloff, Kevin Neff, and Diane Portner, and distributed by MECC. This is version 1.1. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296217">
- <rom name="mystery objects 800k.woz" size="1296217" crc="189fff3d" sha1="6609c90ff3edb6775d0595e958e8230bb52a874a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcltzoo1035">
- <description>Littletown Zoo (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-19 -->
- <!--"Littletown Zoo" is a 1991 educational program developed by Eileen M. Nannen, John Ojanen, Mike Palmquist, Dee Dee Roedel, and John P. Wlazlo, and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345372">
- <rom name="littletown zoo 800k.woz" size="1345372" crc="b7939029" sha1="7630944d1c9822ce4d8e49c5c10e51162e7d666a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcinvb1135">
- <description>Invisible Bugs (version 1.1) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-21 -->
- <!--"Invisible Bugs" is a 1989 educational program developed by Gene Breault, Scott Jensen, Charolyn Kapplinger, John Persoon, and Jane Peterson, and distributed by MECC. This is version 1.1. It is distributed on a single 3.5-inch (800K) disk. It requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345371">
- <rom name="invisible bugs 800k.woz" size="1345371" crc="3b4cda38" sha1="d09e11869b38650d70273e9c675d3b7b01417ccc" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathrb13">
- <description>Math Rabbit (version 1.3) (800K 3.5")</description>
- <year>1986</year>
- <publisher>The Learning Company</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"Math Rabbit" is a 1986 educational game developed by Teri Perl, Analee Nunan, and Aaron Weiss, and distributed by The Learning Company. This is version 1.3. It requires a 128K Apple //e, //c+ or IIgs.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296204">
- <rom name="math rabbit 800k.woz" size="1296204" crc="92d6a324" sha1="eff164d131db23346afa189c667d215153f9c911" />
- </dataarea>
- </part>
- </software>
-
- <software name="thquik14">
- <description>Think Quick! (version 1.4) (800K 3.5")</description>
- <year>1987</year>
- <publisher>The Learning Company</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"Think Quick!" is a 1987 educational game developed by Leslie Grimm and Sid Weber, and distributed by The Learning Company. This is version 1.4. It requires a 128K Apple //e, //c+ or IIgs.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296193">
- <rom name="think quick 800k.woz" size="1296193" crc="dd552c51" sha1="fd81362e8608fbba19189db5b5976c640c3c1b70" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdatk8706">
- <description>Word Attack! (version 06.01.87) (800K 3.5")</description>
- <year>1985</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a 64K Apple ][+, //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"Word Attack!" is a 1985 educational game developed by Richard Eckert and Janice Davidson, Ph.D., and distributed by Davidson and Associates. This version is dated 06.01.87. It requires a 64K Apple ][+, //e, //c+ or IIgs.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296214">
- <rom name="word attack 800k.woz" size="1296214" crc="05d95b9d" sha1="ab2d4881afeb8197dcecf696db6acc061056d45f" />
- </dataarea>
- </part>
- </software>
-
- <software name="wdatkpl12">
- <description>Word Attack Plus! (version 1.2) (800K 3.5")</description>
- <year>1988</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"Word Attack Plus!" is a 1988 educational game developed by Jan Davidson, Julie Baumgartner, J.M. Albanese, and Kevin R. Burley, and distributed by Davidson and Associates. This is version 1.2, dated 04.01.88. It requires a 128K Apple //e, //c+ or IIgs.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1329012">
- <rom name="word attack plus 800k.woz" size="1329012" crc="d794d8ad" sha1="261977a948ad76d34dcbdae4ac3314300cc2fea4" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdatkpfr13">
- <description>Word Attack Plus! French (version 1.3) (800K 3.5")</description>
- <year>1988</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"Word Attack Plus! French" is a 1988 educational game developed by Jan Davidson, Julie Baumgartner, J.M. Albanese, and Kevin R. Burley, and distributed by Davidson and Associates. This is version 1.3, dated 09.01.88. It requires a 128K Apple //e, //c+ or IIgs.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1330036">
- <rom name="word attack plus french 800k.woz" size="1330036" crc="4fa72218" sha1="e4704d7382a7f4e2b850928c0597a48fbf06c51a" />
- </dataarea>
- </part>
- </software>
-
- <software name="wrdatkpsp12">
- <description>Word Attack Plus! Spanish (version 1.2, 09.01.88) (800K 3.5")</description>
- <year>1988</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"Word Attack Plus! Spanish" is a 1988 educational game developed by Jan Davidson, Julie Baumgartner, J.M. Albanese, and Kevin R. Burley, and distributed by Davidson and Associates. This is version 1.2, dated 09.01.88. It requires a 128K Apple //e, //c+ or IIgs.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1329013">
- <rom name="word attack plus spanish 800k.woz" size="1329013" crc="fc7872de" sha1="ee9e91738a9a2ac6790750490c8948c09e8ccb02" />
- </dataarea>
- </part>
- </software>
-
- <software name="suprprii">
- <description>SuperPrint II (800K 3.5")</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-29 -->
- <!--"SuperPrint II" is a 1989 graphics program developed by Joel Fried, Susan Swanson, Ken Grey, Lester Humphreys, Kim Looney, and David Shearer of Pelican Software, and distributed by Scholastic. This is version 1.0.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296289">
- <rom name="superprint ii 800k.woz" size="1296289" crc="6e4761ec" sha1="e5b0e2c187b0d46a0738f5c325951f3a0529892e" />
- </dataarea>
- </part>
- </software>
-
- <software name="trakattk">
- <description>Track Attack</description>
- <year>1982</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-08-26 -->
- <!--"Track Attack" is a 1982 action game developed by Chris Jochumson and distributed by Brøderbund Software. It runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="261303">
- <rom name="track attack.woz" size="261303" crc="e924de56" sha1="f3d636e0eabfbe196da71016e87424cc12ea0157" />
- </dataarea>
- </part>
- </software>
-
- <software name="printshp">
- <description>The Print Shop</description>
- <year>1984</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-09-15 -->
- <!--"The Print Shop" is a 1984 graphics program developed by David Balsam and Martin Kahn, and distributed by Brøderbund Software. It runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234809">
- <rom name="the print shop side a.woz" size="234809" crc="97344ce3" sha1="3bc4427ed991ecc742f252ca0d201783cef5c2c4" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234784">
- <rom name="the print shop side b.woz" size="234784" crc="e1d16e70" sha1="66f324eae1053f3a50c54b906aba8be5aadd31d7" />
- </dataarea>
- </part>
- </software>
-
<software name="kiludead">
<description>Killed Until Dead</description>
<year>1987</year>
@@ -15779,7 +6969,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-09-17 -->
- <!--"Killed Until Dead" is a 1987 adventure game developed by Michael Bate, Rick Banks, Allan Johanson, and John Boechler, and distributed by Accolade. It requires a 64K Apple ][+ or later. Due to coding bugs in the original game, it does not properly write-enable certain regions of RAM before writing to them, which leads to crashes in some emulators.-->
+ <!-- "Killed Until Dead" is a 1987 adventure game developed by Michael Bate, Rick Banks, Allan Johanson, and John Boechler, and distributed by Accolade. It requires a 64K Apple ][+ or later. Due to coding bugs in the original game, it does not properly write-enable certain regions of RAM before writing to them, which leads to crashes in some emulators. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -15795,99 +6985,15 @@ license:CC0-1.0
</part>
</software>
- <software name="rboots4035">
- <description>Rocky's Boots (version 4.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>The Learning Company</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, or //e or 64K ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-10-10 -->
- <!--"Rocky's Boots" is a 1988 educational game developed by Warren Robinett and Leslie Grimm, and distributed by The Learning Company. It requires a Apple IIgs, //c+, or //e or 64K ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296202">
- <rom name="rocky's boots v4.1 800k.woz" size="1296202" crc="9547ceae" sha1="9ed4042968ce40c1d5049befe27ecc74d81e4aea" />
- </dataarea>
- </part>
- </software>
-
- <software name="brdstale3">
- <description>The Bard's Tale III: Thief of Fate (800K 3.5")</description>
- <year>1988</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, or //e or 64K ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-10-12 -->
- <!--"The Bard's Tale III: Thief of Fate" is a 1988 roleplaying game developed by Rebecca Heineman and distributed by Electronic Arts. It requires a Apple IIgs, //c+, or //e or 64K ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296176">
- <rom name="the bard's tale iii 800k.woz" size="1296176" crc="d388b56d" sha1="7e45ae4673d40093f535606d13d032cadaa410ac" />
- </dataarea>
- </part>
- </software>
-
- <software name="newprntshop">
- <description>The New Print Shop (800K 3.5")</description>
- <year>1990</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-10-12 -->
- <!--"The New Print Shop" is a 1990 graphics program developed by Don Lloyd and distributed by Brøderbund Software. It requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296152">
- <rom name="the new print shop 800k.woz" size="1296152" crc="df2c9138" sha1="d5f690d14861672cbefb9ab9a1ad275a087979e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="wargle">
- <description>Wargle!</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-10-30 -->
- <!--"Wargle!" is a 1982 action game developed and distributed by Hayden Book Company. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234778">
- <rom name="wargle.woz" size="234778" crc="1206aa31" sha1="c2431e7f2cbda517edb71d4458fa0e85a36338fb" />
- </dataarea>
- </part>
- </software>
-
- <software name="scruples">
- <description>A Question of Scruples</description>
- <year>1987</year>
- <publisher>Leisure Genius</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-10-30 -->
- <!--"A Question of Scruples" is a 1987 board game developed by Sentient Software and distributed by Leisure Genius. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234838">
- <rom name="a question of scruples - disk a (program disk).woz" size="234838" crc="8d6b5e39" sha1="fc05cbe47accd7359e439e7bab276e73253ab458" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="234840">
- <rom name="a question of scruples - disk b (questions disk).woz" size="234840" crc="e06d7439" sha1="e79bb730be5b7c5455a34c5e1538fc10e24e37ef" />
- </dataarea>
- </part>
- </software>
-
<software name="stardanc">
<description>Star Dance</description>
<year>1981</year>
<publisher>United Software of America</publisher>
<info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2021-11-03 -->
- <!--"Star Dance" is a 1981 action game developed by Gustavo Fernandez and distributed by United Software of America. It requires a 13-sector drive but otherwise runs on any Apple ][ with 48K.-->
+ <!-- "Star Dance" is a 1981 action game developed by Gustavo Fernandez and distributed by United Software of America. It requires a 13-sector drive but otherwise runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="101683">
@@ -15900,10 +7006,10 @@ license:CC0-1.0
<description>Disk Organizer (version 2.6)</description>
<year>1982</year>
<publisher>Sensible Software</publisher>
- <info name="usage" value="Requires an Apple ][, ][+, or unenhanced //e with 48K." />
+ <info name="usage" value="Requires an Apple ][, ][+, or unenhanced //e with 48K. It will not run on 65C02-based models." />
<sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2021-11-03 -->
- <!--"Disk Organizer" is a 1982 disk utility developed and distributed by Sensible Software. This is version 2.6. It requires an Apple ][, ][+, or unenhanced //e with 48K.-->
+ <!-- "Disk Organizer" is a 1982 disk utility developed and distributed by Sensible Software. This is version 2.6. It requires an Apple ][, ][+, or unenhanced //e with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="114981">
@@ -15919,7 +7025,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-11-03 -->
- <!--"Super Disk Copy" is a 1981 disk utility developed and distributed by Sensible Software. This is version 3.8. It runs on any Apple ][ with 48K.-->
+ <!-- "Super Disk Copy" is a 1981 disk utility developed and distributed by Sensible Software. This is version 3.8. It runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55072">
@@ -15928,134 +7034,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bbatlm35">
- <description>Beauty and the Beast and The Little Mermaid (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Beauty and the Beast and The Little Mermaid" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296188">
- <rom name="beauty and the beast and the little mermaid 800k.woz" size="1296188" crc="4a2ad616" sha1="677828388d399ba055587c6db6a2c2915ff87873" />
- </dataarea>
- </part>
- </software>
-
- <software name="rhapp35">
- <description>Robin Hood and Peter Pan (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Robin Hood and Peter Pan" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296169">
- <rom name="robin hood and peter pan 800k.woz" size="1296169" crc="fa681449" sha1="4dfe12a419d305baee700410df442b5a02983fde" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmcac35">
- <description>Big Book Maker: Cute and Cuddly (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Cute and Cuddly" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296174">
- <rom name="big book maker- cute and cuddly 800k.woz" size="1296174" crc="c2a0e20e" sha1="e41e2142880348ae3520c147d2937f0badcbe1b3" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmfgy35">
- <description>Big Book Maker: Feeling Good About Yourself (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Feeling Good About Yourself" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296188">
- <rom name="big book maker- feeling good about yourself 800k.woz" size="1296188" crc="2f5b800f" sha1="0ed862a3896f34ec5b35cec08cb25eeaf9481588" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmlp35">
- <description>Big Book Maker: Let's Pretend (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Let's Pretend" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296174">
- <rom name="big book maker- let's pretend 800k.woz" size="1296174" crc="621eb931" sha1="356d287c3a079d2121c7739e0e6cfe4a1a7a5487" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmlns35">
- <description>Big Book Maker: Letters, Numbers, Shapes (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Letters, Numbers, Shapes" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296185">
- <rom name="big book maker- letters, numbers, shapes 800k.woz" size="1296185" crc="48ae97fa" sha1="58ef07f6485d0e05ee4f87477cabc797b520b60a" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmmal35">
- <description>Big Book Maker: Myths and Legends (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Myths and Legends" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296176">
- <rom name="big book maker- myths and legends 800k.woz" size="1296176" crc="1b4bf1af" sha1="348b412fdffae8d6dea20cffcf2b83c2347f2425" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmque35">
- <description>Big Book Maker: Quentin (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Quentin" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296168">
- <rom name="big book maker- quentin 800k.woz" size="1296168" crc="630bc219" sha1="ef27a456a84620bff2c4dee6fc3e70f4e3afe694" />
- </dataarea>
- </part>
- </software>
-
<software name="ouatpp35">
<description>Once Upon A Time... Puppet Playhouse (800K 3.5")</description>
<year>1991</year>
@@ -16063,7 +7041,7 @@ license:CC0-1.0
<info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-12-07 -->
- <!--"Once Upon A Time... Puppet Playhouse" is a 1991 educational program developed and distributed by Compu-Teach. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
+ <!-- "Once Upon A Time... Puppet Playhouse" is a 1991 educational program developed and distributed by Compu-Teach. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296154">
@@ -16072,272 +7050,6 @@ license:CC0-1.0
</part>
</software>
- <software name="spelit35">
- <description>Spell It! (version 06.01.87) (800K 3.5")</description>
- <year>1984</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Spell It!" is a 1984 educational program developed by Richard Eckert and Janice Davidson, Ph.D., and distributed by Davidson and Associates. This version is dated 06.01.87. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1328979">
- <rom name="spell it 800k.woz" size="1328979" crc="e4bbc951" sha1="f443cb280b267e0b176faa285fb6167b2e72deda" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathb35">
- <description>Math Blaster! (version 06.01.87) (800K 3.5")</description>
- <year>1983</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Math Blaster!" is a 1983 educational program developed by Richard Eckert and Janice Davidson, Ph.D., and distributed by Davidson and Associates. This version is dated 06.01.87. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1328983">
- <rom name="math blaster 800k.woz" size="1328983" crc="800e565e" sha1="a490cc0adfeb5206657436ab635edd5846e1e80c" />
- </dataarea>
- </part>
- </software>
-
- <software name="rdnrl1135">
- <description>Read 'N Roll (version 1.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Read 'N Roll" is a 1988 educational program developed by Jan Davidson, Julie Baumgartner, J. M. Albanese, L. X. Savain, and T. S. DeBry, and distributed by Davidson and Associates. This is version 1.1. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1329010">
- <rom name="read n roll v1.1 800k.woz" size="1329010" crc="e53d2298" sha1="f9ce50d2e01b5b8ca997b358756da5f0bac0d7f9" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmtaaft35">
- <description>Big Book Maker: Tall Tales and American Folk Heroes (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Big Book Maker: Tall Tales and American Folk Heroes" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296194">
- <rom name="big book maker- tall tales and american folk heroes 800k.woz" size="1296194" crc="165b8b53" sha1="87b099520000e5327b8750ec84167fe1a27ca315" />
- </dataarea>
- </part>
- </software>
-
- <software name="mathme1635">
- <description>Math and Me (version 1.6) (800K 3.5")</description>
- <year>1988</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Math and Me" is a 1988 educational program developed and distributed by Davidson and Associates. This is version 1.6. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296160">
- <rom name="math and me v1.6 800k.woz" size="1296160" crc="7b21f4c3" sha1="ffcadcec7f45021c1a694e704ddc167896cbcb7f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mbmst1335">
- <description>Math Blaster Mystery (version 1.3) (800K 3.5")</description>
- <year>1989</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Math Blaster Mystery" is a 1989 educational program developed by Julie Baumgartner, Anne Hertz, J. M. Albanese, and Larene Wade Spitler, and distributed by Davidson and Associates. This is version 1.3. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296755">
- <rom name="math blaster mystery v1.3 800k.woz" size="1296755" crc="f8e33137" sha1="065496edb5d9295aee6648dc61c1673170f0d44e" />
- </dataarea>
- </part>
- </software>
-
- <software name="mthblpls3735">
- <description>Math Blaster Plus! (version 3.7) (800K 3.5")</description>
- <year>1989</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Math Blaster Plus!" is a 1989 educational program developed by Jan Davidson, Cathy Johnson, and Louis X. Savain, and distributed by Davidson and Associates. This is version 3.7. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1328988">
- <rom name="math blaster plus v3.7 800k.woz" size="1328988" crc="fa6eebf3" sha1="985f733c100d6131b2dbe6b9bce00f0e0844280b" />
- </dataarea>
- </part>
- </software>
-
- <software name="spelitps35">
- <description>Spell It Plus! (800K 3.5")</description>
- <year>1989</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Spell It Plus!" is a 1989 educational program developed by Faye Schwartz, Cathy Johnson, Kevin Burley, and Carol Carpenter, and distributed by Davidson and Associates. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296218">
- <rom name="spell it plus 800k.woz" size="1296218" crc="12943fe4" sha1="fc672aaaaacb195229719107eaaaf36b6feb127d" />
- </dataarea>
- </part>
- </software>
-
- <software name="dinodypl35">
- <description>Dinosaur Days Plus! (800K 3.5")</description>
- <year>1988</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Dinosaur Days Plus!" is a 1988 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="1296187">
- <rom name="dinosaur days plus 800k - disk 1 - program disk.woz" size="1296187" crc="06b40e00" sha1="6d35443ca094501873dc1b327c9f2de93af22c8c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Learning disk" />
- <dataarea name="flop" size="1296188">
- <rom name="dinosaur days plus 800k - disk 2 - learning disk.woz" size="1296188" crc="c5319f5d" sha1="1584a8d69a4c4ffa603a8651c83c2fe9e8913dd3" />
- </dataarea>
- </part>
- </software>
-
- <software name="robwrp35">
- <description>Robot Writer Plus! (800K 3.5")</description>
- <year>1988</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Robot Writer Plus!" is a 1988 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296163">
- <rom name="robot writer plus 800k.woz" size="1296163" crc="679596fc" sha1="3edc0320e88612c4acc18bb58f5121189326e024" />
- </dataarea>
- </part>
- </software>
-
- <software name="trntrn35">
- <description>Transportation Transformation (800K 3.5")</description>
- <year>1991</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-08 -->
- <!--"Transportation Transformation" is a 1991 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296174">
- <rom name="transportation transformation 800k.woz" size="1296174" crc="94438087" sha1="3099da49bc32f225b7edc0922593fa4485c523dc" />
- </dataarea>
- </part>
- </software>
-
- <software name="animat35">
- <description>Animals with an Attitude (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Animals with an Attitude" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296169">
- <rom name="animals with an attitude 800k.woz" size="1296169" crc="4bed154c" sha1="10fccbcc82125350fda57bace75c1ddbe9ed47a8" />
- </dataarea>
- </part>
- </software>
-
- <software name="whneigh35">
- <description>The Whole Neighborhood (800K 3.5")</description>
- <year>1991</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"The Whole Neighborhood" is a 1991 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296167">
- <rom name="the whole neighborhood 800k.woz" size="1296167" crc="95299735" sha1="92047c0ac6dd89cf32c12f14cfd23bc28fec9e18" />
- </dataarea>
- </part>
- </software>
-
- <software name="aliwzo35">
- <description>Alice in Wonderland and The Wizard of Oz (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-09 -->
- <!--"Alice in Wonderland and The Wizard of Oz" is a 1992 graphics program developed by Pelican Software and distributed by Queue. It requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296185">
- <rom name="alice in wonderland and the wizard of oz 800k.woz" size="1296185" crc="89419cd5" sha1="ad0600952f5a2f40d2c1ba26f454119f3dd7e100" />
- </dataarea>
- </part>
- </software>
-
- <software name="mickspca">
- <description>Mickey's Space Adventure</description>
- <year>1984</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2021-12-28 -->
- <!--"Mickey's Space Adventure" is a 1984 adventure game developed by Roberta Williams, Peter Oliphant, Robert Eric Heitman, Mark Crowe, Doug MacNeill, Jennifer Nelsen, Terry Pierce, Al Lowe, and Annette Childs, and distributed by Sierra On-Line. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234942">
- <rom name="mickey's space adventure - disk 1, side a.woz" size="234942" crc="0b4f70db" sha1="9b4f799ad6ab2ffcff9edac36f2c19eddf20b689" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234942">
- <rom name="mickey's space adventure - disk 1, side b.woz" size="234942" crc="4213cb80" sha1="d5e2bd7b3dc7bd9a11b7e22f74da4da5848c4211" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234942">
- <rom name="mickey's space adventure - disk 2, side a.woz" size="234942" crc="c035ffcc" sha1="a46004c7bd16b2a9b012347496efe66f4c56af42" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234942">
- <rom name="mickey's space adventure - disk 2, side b.woz" size="234942" crc="5e4cae02" sha1="4624eda8ef93e71ca8237a5cb44cf874f1f7e55e" />
- </dataarea>
- </part>
- </software>
-
<software name="envlifed">
<description>The Environment Life Dynamic</description>
<year>1980</year>
@@ -16345,7 +7057,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2021-12-29 -->
- <!--"The Environment Life Dynamic" is a 1980 set of action games (Lightning Bug, Moon-Catcher, Jungle Safari, Turn 'Em Loose) developed and distributed by Avant-Garde Creations. It requires a 48K Apple ][+ or later.-->
+ <!-- "The Environment Life Dynamic" is a 1980 set of action games (Lightning Bug, Moon-Catcher, Jungle Safari, Turn 'Em Loose) developed and distributed by Avant-Garde Creations. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234809">
@@ -16361,7 +7073,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-01-03 -->
- <!--"Stellar Power" is a 1984 strategy game developed by David Strimple and distributed by STI Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "Stellar Power" is a 1984 strategy game developed by David Strimple and distributed by STI Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234829">
@@ -16382,7 +7094,7 @@ license:CC0-1.0
https://web.archive.org/web/20220121195058/https://twitter.com/KaySavetz/status/1482204397903904768
https://archive.org/details/atari-youth-advisory-board-tracey-cullinan
-->
- <!--"Glutton" is a 1983 action game developed by Tracey Cullinan and intended to be distributed by Superior Software. (It was never commercially released.) It runs on any Apple II with 48K.-->
+ <!-- "Glutton" is a 1983 action game developed by Tracey Cullinan and intended to be distributed by Superior Software. (It was never commercially released.) It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="248074">
@@ -16391,22 +7103,6 @@ license:CC0-1.0
</part>
</software>
- <software name="hazvolt">
- <description>The Hazards of Voltageville</description>
- <year>1994</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-04 -->
- <!--"The Hazards of Voltageville" is a 1994 educational game developed by Prentice Associates and distributed by Scholastic. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234796">
- <rom name="the hazards of voltageville.woz" size="234796" crc="b1855bf8" sha1="18c5b614c0d4cee46eee7958a41d05025e6f56f2" />
- </dataarea>
- </part>
- </software>
-
<software name="gonzwrdridr">
<description>The Great Gonzo in Word Rider</description>
<year>1985</year>
@@ -16414,7 +7110,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-04 -->
- <!--"The Great Gonzo in Word Rider" is a 1985 educational game developed by Joyce Hakansson Associates and Christopher Cerf Associates, and distributed by Simon and Schuster. It requires a 64K Apple ][+ or later.-->
+ <!-- "The Great Gonzo in Word Rider" is a 1985 educational game developed by Joyce Hakansson Associates and Christopher Cerf Associates, and distributed by Simon and Schuster. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234843">
@@ -16430,7 +7126,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"The Tarturian" is a 1981 strategy game developed by Butch Greathouse and Garry Rheinhardt, and distributed by Highlands Computer Services. It requires a 48K Apple ][+ or later.-->
+ <!-- "The Tarturian" is a 1981 strategy game developed by Butch Greathouse and Garry Rheinhardt, and distributed by Highlands Computer Services. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234829">
@@ -16446,7 +7142,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Survival Adventure" is a 1981 adventure game developed by Charles Kingston and distributed by United Software of America. It requires a 48K Apple ][+ or later.-->
+ <!-- "Survival Adventure" is a 1981 adventure game developed by Charles Kingston and distributed by United Software of America. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234817">
@@ -16462,7 +7158,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Stellar Defense" is a 1983 strategy game developed by Tom Burlew and distributed by Rainbow Computing. This is version 1.2. It requires a 48K Apple ][+ or later.-->
+ <!-- "Stellar Defense" is a 1983 strategy game developed by Tom Burlew and distributed by Rainbow Computing. This is version 1.2. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234810">
@@ -16471,22 +7167,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bapmnr11">
- <description>Beneath Apple Manor (version 1.1)</description>
- <year>1979</year>
- <publisher>The Software Factory</publisher>
- <info name="usage" value="Requires a 32K Apple ][ with Integer BASIC in ROM." />
- <sharedfeat name="compatibility" value="A2" />
- <!-- Dump released: 2022-02-18 -->
- <!--"Beneath Apple Manor" is a 1979 adventure game developed by Don Worth and distributed by The Software Factory. This is version 1.1. It requires a 32K Apple ][ with Integer BASIC in ROM.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234800">
- <rom name="beneath apple manor.woz" size="234800" crc="95533df3" sha1="5db4eb223f9daca74d1b06cfbe7593023818ac14" />
- </dataarea>
- </part>
- </software>
-
<software name="teleport">
<description>Teleport</description>
<year>1982</year>
@@ -16494,7 +7174,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Teleport" is a 1982 action game developed by Mike Abbot and distributed by Cavalier Computer Corporation. It runs on any Apple II with 48K.-->
+ <!-- "Teleport" is a 1982 action game developed by Mike Abbot and distributed by Cavalier Computer Corporation. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234797">
@@ -16510,7 +7190,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Secret Agent: Mission One" is a 1984 adventure game developed and distributed by Jor-And. It requires a 48K Apple ][+ or later.-->
+ <!-- "Secret Agent: Mission One" is a 1984 adventure game developed and distributed by Jor-And. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234778">
@@ -16526,7 +7206,7 @@ license:CC0-1.0
<info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-05 -->
- <!--"Science Corner: Weather Watch" is a 1989 educational program developed by Peter Andrews, Rob Shaver, Henry F. Olds, Jr., Laura Koller, Christine Borland, and Nancy Davis, and distributed by Society for Visual Education. It requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
+ <!-- "Science Corner: Weather Watch" is a 1989 educational program developed by Peter Andrews, Rob Shaver, Henry F. Olds, Jr., Laura Koller, Christine Borland, and Nancy Davis, and distributed by Society for Visual Education. It requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296252">
@@ -16542,7 +7222,7 @@ license:CC0-1.0
<info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-05 -->
- <!--"Science Corner: Space Probe" is a 1989 educational program developed by Peter Andrews, Rob Shaver, Henry F. Olds, Jr., Angela Faeth, Marianne Dunne, and Nancy Davis, and distributed by Society for Visual Education. It requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
+ <!-- "Science Corner: Space Probe" is a 1989 educational program developed by Peter Andrews, Rob Shaver, Henry F. Olds, Jr., Angela Faeth, Marianne Dunne, and Nancy Davis, and distributed by Society for Visual Education. It requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296247">
@@ -16558,7 +7238,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-08 -->
- <!--"Grapple" is a 1982 action game developed by Tony Lewis and distributed by Insoft. It runs on any Apple II with 48K.-->
+ <!-- "Grapple" is a 1982 action game developed by Tony Lewis and distributed by Insoft. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="354570">
@@ -16574,7 +7254,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-08 -->
- <!--"Sword of Sheol" is a 1982 action game developed by David Riggle and distributed by Winner's Circle. It runs on any Apple II with 48K. A 1987 textfile called "Eggs and Keys from Hot Rod" listed "Sword of Sheol" among a list of "vaporwares"; crediting it to Winner's Circle, creators of Sanitron. Hot Rod's document is likely based on the advertisement for Sword of Sheol that was included in the August 1983 issue of Creative Computing, where it appeared next to titles Ice Cave, Exterminator, and Sanitron.-->
+ <!-- "Sword of Sheol" is a 1982 action game developed by David Riggle and distributed by Winner's Circle. It Runs on any Apple ][ with 48K. A 1987 textfile called "Eggs and Keys from Hot Rod" listed "Sword of Sheol" among a list of "vaporwares"; crediting it to Winner's Circle, creators of Sanitron. Hot Rod's document is likely based on the advertisement for Sword of Sheol that was included in the August 1983 issue of Creative Computing, where it appeared next to titles Ice Cave, Exterminator, and Sanitron. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="467751">
@@ -16583,22 +7263,6 @@ license:CC0-1.0
</part>
</software>
- <software name="lcksmth31">
- <description>Locksmith 3.1</description>
- <year>1981</year>
- <publisher>Omega Software Products</publisher>
- <info name="usage" value="Requires an Apple ][, ][+, or unenhanced //e with at least 32K. Due to coding bugs unrelated to copy protection, it will not run on later models." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E" />
- <!-- Dump released: 2022-02-09 -->
- <!--"Locksmith" is a 1981 disk utility developed and distributed by Omega Software Products. This is version 3.1. It requires an Apple ][, ][+, or unenhanced //e with at least 32K. Due to coding bugs unrelated to copy protection, it will not run on later models.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="55061">
- <rom name="locksmith v3.1.woz" size="55061" crc="6b9321ca" sha1="48de65dd3d3ce9656dc75dce5b328974e2ab748b" />
- </dataarea>
- </part>
- </software>
-
<software name="compkara">
<description>Competition Karate</description>
<year>1984</year>
@@ -16606,7 +7270,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Competition Karate" is a 1984 sports game developed by Edward Badasov and distributed by Motivated Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "Competition Karate" is a 1984 sports game developed by Edward Badasov and distributed by Motivated Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234804">
@@ -16622,7 +7286,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-09 -->
- <!--"Star League Baseball" is a 1984 sports game developed and distributed by Gamestar, Inc. It requires a 64K Apple ][+ or later.-->
+ <!-- "Star League Baseball" is a 1984 sports game developed and distributed by Gamestar, Inc. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234748">
@@ -16638,7 +7302,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-09 -->
- <!--"The Pawn" is a 1986 adventure game developed by Magnetic Scrolls and distributed by Rainbird. It requires a 64K Apple ][+ or later.-->
+ <!-- "The Pawn" is a 1986 adventure game developed by Magnetic Scrolls and distributed by Rainbird. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234751">
@@ -16647,22 +7311,6 @@ license:CC0-1.0
</part>
</software>
- <software name="grafspee">
- <description>Pursuit of the Graf Spee</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-09 redumped: 2022-03-24 because the previous disk we obtained proved to be a fake. -->
- <!--"Pursuit of the Graf Spee" is a 1982 strategy game developed by Joel Billings and distributed by Strategic Simulations. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="254799">
- <rom name="pursuit of the graf spee.woz" size="254799" crc="18221871" sha1="f400d38bfe73a768d8db4fd9cf7ab4c37282f8ed" />
- </dataarea>
- </part>
- </software>
-
<software name="bezare">
<description>Bezare</description>
<year>1982</year>
@@ -16670,7 +7318,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-10 -->
- <!--"Bezare" is a 1982 action game developed by John Besnard and distributed by Southwestern Data Systems. It requires a 48K Apple ][+ or later.-->
+ <!-- "Bezare" is a 1982 action game developed by John Besnard and distributed by Southwestern Data Systems. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234774">
@@ -16686,7 +7334,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-10 -->
- <!--"International Gran Prix" is a 1981 action game developed by Richard Orban and distributed by Riverbank Software. (It was later re-released by MUSE with minor changes.) It runs on any Apple II with 48K.-->
+ <!-- "International Gran Prix" is a 1981 action game developed by Richard Orban and distributed by Riverbank Software. (It was later re-released by MUSE with minor changes.) It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="174371">
@@ -16702,7 +7350,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-10 -->
- <!--"The Guild of Thieves" is a 1987 adventure game developed by Magnetic Scrolls and distributed by Rainbird. It requires a 64K Apple ][+ or later.-->
+ <!-- "The Guild of Thieves" is a 1987 adventure game developed by Magnetic Scrolls and distributed by Rainbird. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234751">
@@ -16718,7 +7366,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Artesians" is a 1983 action game developed by Caliban Research and distributed by RenoSoft. It requires a 48K Apple ][+ or later.-->
+ <!-- "Artesians" is a 1983 action game developed by Caliban Research and distributed by RenoSoft. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234781">
@@ -16734,7 +7382,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Jinxter" is a 1987 adventure game developed by Magnetic Scrolls and distributed by Rainbird. This is version 1.0. It requires a 64K Apple ][+ or later.-->
+ <!-- "Jinxter" is a 1987 adventure game developed by Magnetic Scrolls and distributed by Rainbird. This is version 1.0. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
@@ -16757,7 +7405,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Neutrons" is a 1981 action game developed and distributed by Level-10. It requires a 48K Apple ][+ or later.-->
+ <!-- "Neutrons" is a 1981 action game developed and distributed by Level-10. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234759">
@@ -16766,45 +7414,6 @@ license:CC0-1.0
</part>
</software>
- <software name="tunlterr">
- <description>Tunnel Terror</description>
- <year>1982</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-11 -->
- <!--"Tunnel Terror" is a 1982 action game developed by Eric Popejoy and distributed by Adventure International. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234788">
- <rom name="tunnel terror.woz" size="234788" crc="fe9da050" sha1="c3744acdef24dc9b347df4774d9c3f35912fbdd7" />
- </dataarea>
- </part>
- </software>
-
- <software name="cryptmed">
- <description>Crypt of Medea</description>
- <year>1983</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-11 -->
- <!--"Crypt of Medea" is a 1983 adventure game developed by Allan Lamb and Arthur Britto II, and distributed by Sir-Tech Software. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234815">
- <rom name="crypt of medea side a.woz" size="234815" crc="aad35539" sha1="041043080b9c2332b2401a6444cb827bf38da4ad" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234815">
- <rom name="crypt of medea side b.woz" size="234815" crc="406de5eb" sha1="45f9f6695c6466c770d6b4a27d2e80b75d7b95f9" />
- </dataarea>
- </part>
- </software>
-
<software name="handdand">
<description>Handy Dandy</description>
<year>1983</year>
@@ -16812,7 +7421,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Handy Dandy" is a 1983 action game developed by Chris Eisnaugle and distributed by Gentry Software. It runs on any Apple II with 48K.-->
+ <!-- "Handy Dandy" is a 1983 action game developed by Chris Eisnaugle and distributed by Gentry Software. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234791">
@@ -16828,7 +7437,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Jump Jet" is a 1982 action game developed by Chuck Benton and distributed by Avant-Garde Creations. It runs on any Apple II with 48K.-->
+ <!-- "Jump Jet" is a 1982 action game developed by Chuck Benton and distributed by Avant-Garde Creations. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="242983">
@@ -16844,7 +7453,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Max-Command" is a 1982 strategy game developed and distributed by Rockroy. It requires a 48K Apple ][+ or later.-->
+ <!-- "Max-Command" is a 1982 strategy game developed and distributed by Rockroy. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234757">
@@ -16853,22 +7462,6 @@ license:CC0-1.0
</part>
</software>
- <software name="misldef">
- <description>Missile Defense</description>
- <year>1981</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-11 -->
- <!--"Missile Defense" is a 1981 action game developed by D. W. Clark and distributed by On-Line Systems. It runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="missile defense.woz" size="234791" crc="dc3abde9" sha1="a148b79074ceb7f4fa2849982ae4a681bf00b466" />
- </dataarea>
- </part>
- </software>
-
<software name="chsm2000">
<description>The Chessmaster 2000</description>
<year>1986</year>
@@ -16876,7 +7469,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"The Chessmaster 2000" is a 1986 board game developed and distributed by The Software Toolworks. It requires a 64K Apple ][+ or later.-->
+ <!-- "The Chessmaster 2000" is a 1986 board game developed and distributed by The Software Toolworks. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -16892,45 +7485,6 @@ license:CC0-1.0
</part>
</software>
- <software name="moscow41">
- <description>At the Gates of Moscow 1941</description>
- <year>1985</year>
- <publisher>Strategic Games Publications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-11 -->
- <!--"At the Gates of Moscow 1941" is a 1985 strategy game developed by Mark Korman and Todd Hochwitz, and distributed by Strategic Games Publications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234830">
- <rom name="at the gates of moscow 1941 side a.woz" size="234830" crc="bdd647a6" sha1="e4f9258915328e1ae0a80850b5aca76e87bdd615" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234830">
- <rom name="at the gates of moscow 1941 side b.woz" size="234830" crc="5a7eee20" sha1="16cef55f63abf27f3036889bacd75db6e3a6148d" />
- </dataarea>
- </part>
- </software>
-
- <software name="mouskatk">
- <description>Mouskattack</description>
- <year>1982</year>
- <publisher>On-Line Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-11 -->
- <!--"Mouskattack" is a 1982 action game developed by Ken Williams and Al Nystrom, and distributed by On-Line Systems. It runs on any apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234799">
- <rom name="mouskattack.woz" size="234799" crc="47fb8922" sha1="5e1cf3887d549c20e9c440e26ab27a0bfda00e73" />
- </dataarea>
- </part>
- </software>
-
<software name="raidrlring">
<description>Raiders of the Lost Ring</description>
<year>1981</year>
@@ -16938,7 +7492,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-18 -->
- <!--"Raiders of the Lost Ring" is a 1981 action game developed by Jim Nitchals and distributed by Cavalier Computer Corporation. It requires a 48K Apple ][+ or later.-->
+ <!-- "Raiders of the Lost Ring" is a 1981 action game developed by Jim Nitchals and distributed by Cavalier Computer Corporation. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234807">
@@ -16954,7 +7508,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Zodiac Castle" is a 1982 adventure game developed by Dennis N. Strong and distributed by Dynacomp. It requires a 48K Apple ][+ or later.-->
+ <!-- "Zodiac Castle" is a 1982 adventure game developed by Dennis N. Strong and distributed by Dynacomp. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="240932">
@@ -16963,22 +7517,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bapmnrse">
- <description>Beneath Apple Manor: The Special Edition</description>
- <year>1982</year>
- <publisher>Quality Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-11 -->
- <!--"Beneath Apple Manor: The Special Edition" is a 1982 adventure game developed by Don Worth and distributed by Quality Software. It runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234826">
- <rom name="beneath apple manor- the special edition.woz" size="234826" crc="69ad7676" sha1="15992953d222818d96a8a2e87854ebdf32fd62e2" />
- </dataarea>
- </part>
- </software>
-
<software name="batls331">
<description>Battlesight (version 3.3.1)</description>
<year>1982</year>
@@ -16986,7 +7524,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Battlesight" is a 1982 action game developed by Major C. Hanselmann, D. Lubar, V. Bauman, J. Anderson, and E. Wolcott, and distributed by Versa Computing. This is version 3.3.1. It requires a 48K Apple ][+ or later.-->
+ <!-- "Battlesight" is a 1982 action game developed by Major C. Hanselmann, D. Lubar, V. Bauman, J. Anderson, and E. Wolcott, and distributed by Versa Computing. This is version 3.3.1. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="228193">
@@ -17002,7 +7540,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-11 -->
- <!--"Pythagoras and the Dragon" is a 1983 educational game developed and distributed by Krell Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "Pythagoras and the Dragon" is a 1983 educational game developed and distributed by Krell Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234776">
@@ -17018,7 +7556,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-17 -->
- <!--"Robot Battle" is a 1982 action game developed by Adam Bellin and distributed by United Software of America. It requires a 64K Apple ][+ or later.-->
+ <!-- "Robot Battle" is a 1982 action game developed by Adam Bellin and distributed by United Software of America. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234797">
@@ -17034,7 +7572,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-17 -->
- <!--"Oldorf's Revenge" is a 1981 adventure game developed by Butch Greathouse and distributed by Highlands Computer Services. It requires a 48K Apple ][+ or later.-->
+ <!-- "Oldorf's Revenge" is a 1981 adventure game developed by Butch Greathouse and distributed by Highlands Computer Services. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234810">
@@ -17050,7 +7588,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-17 -->
- <!--"Gin Rummy" is a 1982 card game developed by Art Carpet and distributed by Datamost. It runs on any Apple II with 48K.-->
+ <!-- "Gin Rummy" is a 1982 card game developed by Art Carpet and distributed by Datamost. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234768">
@@ -17066,7 +7604,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-17 -->
- <!--"Star Ball" is a 1983 action game developed by Dale Koehler and distributed by Baen Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "Star Ball" is a 1983 action game developed by Dale Koehler and distributed by Baen Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234782">
@@ -17082,7 +7620,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-19 -->
- <!--"Death Race '82" is a 1982 action game developed by Don Fudge and distributed by Avant-Garde Creations. It requires a 48K Apple ][+ or later.-->
+ <!-- "Death Race '82" is a 1982 action game developed by Don Fudge and distributed by Avant-Garde Creations. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
@@ -17091,37 +7629,16 @@ license:CC0-1.0
</part>
</software>
- <software name="gemsthll12">
- <description>Gemstone Healer (version 1.2)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-19 -->
- <!--"Gemstone Healer" is a 1986 strategy game developed by Peter Lount, Trouba Gossen, and Kevin Pickell, and distributed by Strategic Simulations, Inc. This is version 1.2. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234826">
- <rom name="gemstone healer v1.2 side a.woz" size="234826" crc="e8812105" sha1="33ce745ec584cf5d3969519d188eeaa649f7428e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234826">
- <rom name="gemstone healer v1.2 side b.woz" size="234826" crc="80116114" sha1="59064735ffaae9b5f566556f1d4199d36285fb54" />
- </dataarea>
- </part>
- </software>
-
<software name="spcadv1">
<description>Space Adventure: Episode One</description>
<year>1981</year>
<publisher>Sierra Software</publisher>
- <info name="usage" value="Requires a 48K Apple II or II+." />
+ <info name="author" value="Alick Dziabczenko" />
+ <info name="protection" value="Protect-O-Disk" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it does not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
<!-- Dump released: 2022-02-19 -->
- <!--"Space Adventure: Episode One" is a 1981 action game developed by Alick Dziabczenko and distributed by Sierra Software. It requires a 48K Apple ][ or ][+. Due to aggressive copy protection, it does not run on later models.-->
+ <!-- "Space Adventure: Episode One" is a 1981 action game developed by Alick Dziabczenko and distributed by Sierra Software. It requires a 48K Apple ][ or ][+. Due to aggressive copy protection, it does not run on later models. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="221475">
@@ -17137,7 +7654,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-19 -->
- <!--"Super Taxman 2" is a 1981 action game developed by Brian Fitzgerald and distributed by H.A.L. Labs. It runs on any Apple II with 48K.-->
+ <!-- "Super Taxman 2" is a 1981 action game developed by Brian Fitzgerald and distributed by H.A.L. Labs. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="161558">
@@ -17153,7 +7670,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-20 -->
- <!--"Space Cadette" is a 1982 action game developed by Dan Illowsky and distributed by Funtastic. It runs on any Apple II with 48K.-->
+ <!-- "Space Cadette" is a 1982 action game developed by Dan Illowsky and distributed by Funtastic. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="95008">
@@ -17162,22 +7679,6 @@ license:CC0-1.0
</part>
</software>
- <software name="seanimad35">
- <description>Science Explorers: Animal Adaptations (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Animal Adaptations" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296175">
- <rom name="science explorers- animal adaptations 800k.woz" size="1296175" crc="8bed63ae" sha1="55fed06a3615dda508a27616161e7de1f22e0d3a" />
- </dataarea>
- </part>
- </software>
-
<software name="apescape">
<description>Ape Escape</description>
<year>1984</year>
@@ -17185,7 +7686,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-21 -->
- <!--"Ape Escape" is a 1984 action game developed by Kevin Bagley and distributed by Howard W. Sams and Co. It runs on any Apple II with 48K.-->
+ <!-- "Ape Escape" is a 1984 action game developed by Kevin Bagley and distributed by Howard W. Sams and Co. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234784">
@@ -17194,41 +7695,6 @@ license:CC0-1.0
</part>
</software>
- <software name="playroom">
- <description>The Playroom</description>
- <year>1989</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-21 -->
- <!--"The Playroom" is a 1989 educational game developed by Leslie Grimm, Dennis Caswell, Lynn Kirkpatrick, D. Buttlaire, and D. Albrecht, and distributed by Brøderbund Software. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A" />
- <dataarea name="flop" size="234857">
- <rom name="the playroom - disk a.woz" size="234857" crc="9f4b41b9" sha1="38c3c9bc694fd6be3a7e408d0869b64607f1cb1c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk B" />
- <dataarea name="flop" size="234857">
- <rom name="the playroom - disk b.woz" size="234857" crc="0d5ebd29" sha1="cec916b6e0ed1a95738e50b4deb69e4513d04027" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk C" />
- <dataarea name="flop" size="234857">
- <rom name="the playroom - disk c.woz" size="234857" crc="42995d92" sha1="0ac071c644327a9d9757db2aa2608ba1fc19a665" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk D" />
- <dataarea name="flop" size="234857">
- <rom name="the playroom - disk d.woz" size="234857" crc="b059bfd6" sha1="7d348beecab2090b6d15ef2e9e8bb0c2ac37f89e" />
- </dataarea>
- </part>
- </software>
-
<software name="eatmach">
<description>The Eating Machine</description>
<year>1983</year>
@@ -17236,7 +7702,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-21 -->
- <!--"The Eating Machine" is a 1983 educational program developed by Barbara S. Thorne and distributed by MUSE Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "The Eating Machine" is a 1983 educational program developed by Barbara S. Thorne and distributed by MUSE Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program disk" />
@@ -17252,22 +7718,6 @@ license:CC0-1.0
</part>
</software>
- <software name="wrdspinr">
- <description>Word Spinner (version 1.0)</description>
- <year>1984</year>
- <publisher>The Learning Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-21 -->
- <!--"Word Spinner" is a 1984 educational game developed by Dale Disharoon and distributed by The Learning Company. This is version 1.0. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="73025">
- <rom name="word spinner.woz" size="73025" crc="c6c1b178" sha1="6d2528a5908feae6b73511d29f5f967307445b1a" />
- </dataarea>
- </part>
- </software>
-
<software name="critmass">
<description>Critical Mass</description>
<year>1983</year>
@@ -17275,7 +7725,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-22 -->
- <!--"Critical Mass" is a 1983 adventure game developed by Bob Blauschild and distributed by Sirius Software. It runs on any Apple II with 48K. Note: side B is write-protected, and you must make a copy of it in order to play the game. Side B is not copy protected, so any disk copier will work. I have included a writeable .dsk version of side B in the download.-->
+ <!-- "Critical Mass" is a 1983 adventure game developed by Bob Blauschild and distributed by Sirius Software. It Runs on any Apple ][ with 48K. Note: side B is write-protected, and you must make a copy of it in order to play the game. Side B is not copy protected, so any disk copier will work. I have included a writeable .dsk version of side B in the download. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -17304,7 +7754,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-23 -->
- <!--"Gunslinger" is a 1986 adventure game developed by Allen Adham, illustrated by Evan Ballinger, and distributed by Datasoft. It runs on any Apple II with 48K.-->
+ <!-- "Gunslinger" is a 1986 adventure game developed by Allen Adham, illustrated by Evan Ballinger, and distributed by Datasoft. It Runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A" />
@@ -17332,114 +7782,6 @@ license:CC0-1.0
</part>
</software>
- <software name="blkcauld">
- <description>The Black Cauldron</description>
- <year>1985</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-23 -->
- <!--"The Black Cauldron" is a 1985 adventure game developed by Roberta Williams, Al Lowe, Sol Ackerman, Chris Iden, Scott Murphy, Jeff Stephenson, and Ken Williams, and distributed by Sierra On-Line. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234860">
- <rom name="the black cauldron disk 1a.woz" size="234860" crc="b3611b80" sha1="c477f162eff8e233c87279c9563bffdfa536b157" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234860">
- <rom name="the black cauldron disk 1b.woz" size="234860" crc="74cddf88" sha1="53bca0ebb15a9a74ffea6451cab001e7ccd80538" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234860">
- <rom name="the black cauldron disk 2a.woz" size="234860" crc="8801f2f6" sha1="993c1803bdcc5154042521d1e39879c630f2c53f" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234860">
- <rom name="the black cauldron disk 2b.woz" size="234860" crc="27fac508" sha1="35aa60561d89a6dfdc3000a440c507c6d70c3f84" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk 3" />
- <dataarea name="flop" size="234860">
- <rom name="the black cauldron disk 3.woz" size="234860" crc="d04b463b" sha1="cd1ee2ac9eec05f6fe133a505077769d621ae751" />
- </dataarea>
- </part>
- </software>
-
- <software name="mixdupmg">
- <description>Mixed-Up Mother Goose (version 1.0I)</description>
- <year>1991</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-23 -->
- <!--"Mixed-Up Mother Goose" is a 1991 adventure game designed by Roberta Williams, programmed by David Slayback, ported to Apple II by Doug Oldfield, with graphics by Jerry Moore, with music by Araenda-Lambarda, and distributed by Sierra On-Line. This is version 1.0I. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side A" />
- <dataarea name="flop" size="234889">
- <rom name="mixed-up mother goose disk 1a.woz" size="234889" crc="e5936135" sha1="ce0dace644e3c3615a2547c0a8e6ba7dc8728528" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side B" />
- <dataarea name="flop" size="234889">
- <rom name="mixed-up mother goose disk 1b.woz" size="234889" crc="8d6f807d" sha1="6612b325ea9321cee56a757f23842ad8430f8bd5" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side A" />
- <dataarea name="flop" size="234889">
- <rom name="mixed-up mother goose disk 2a.woz" size="234889" crc="4e3367e5" sha1="73c96fc31a387f0bbbaba27378ea4ca2b4dbc2e4" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side B" />
- <dataarea name="flop" size="234889">
- <rom name="mixed-up mother goose disk 2b.woz" size="234889" crc="1d0ddec9" sha1="455191cc4b028b0b845a9365d1004f65fb082ff4" />
- </dataarea>
- </part>
- </software>
-
- <software name="sednseas35">
- <description>Science Explorers: Day, Night, and The Seasons (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Day, Night, and The Seasons" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296184">
- <rom name="science explorers- day, night, and the seasons 800k.woz" size="1296184" crc="bc3c66cc" sha1="eb65b120f2ec273757ae4ed235a8e1d8bc4fa62b" />
- </dataarea>
- </part>
- </software>
-
- <software name="hmsimpet">
- <description>His Majesty's Ship "Impetuous"</description>
- <year>1980</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 13-sector floppy drive and a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-23 -->
- <!--"His Majesty's Ship "Impetuous"" is a 1980 adventure game written by Robert Lafore, ported to the Apple II by David Fox and Corey Kosak, and distributed by Adventure International. It requires a 13-sector floppy drive and a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234845">
- <rom name="his majesty's ship impetuous.woz" size="234845" crc="8046c6ea" sha1="9dc5c43860e88c74704e67858ee2a7d185ef27ea" />
- </dataarea>
- </part>
- </software>
-
<software name="micmogoo">
<description>Micro Mother Goose</description>
<year>1982</year>
@@ -17447,7 +7789,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-23 -->
- <!--"Micro Mother Goose" is a 1982 educational program developed and distributed by Software Productions. It requires a 48K Apple ][+ or later.-->
+ <!-- "Micro Mother Goose" is a 1982 educational program developed and distributed by Software Productions. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234786">
@@ -17460,10 +7802,12 @@ license:CC0-1.0
<description>Skybombers II</description>
<year>1980</year>
<publisher>Instant Software</publisher>
+ <info name="author" value="Al Floeter" />
<info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2022-02-24 -->
- <!--"Skybombers II" is a 1980 action game developed by Al Floeter and distributed by Instant Software. It requires a 13-sector drive and a 48K Apple ][+ or later.-->
+ <!-- "Skybombers II" is a 1980 action game developed by Al Floeter and distributed by Instant Software. It requires a 13-sector drive and a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234793">
@@ -17472,30 +7816,15 @@ license:CC0-1.0
</part>
</software>
- <software name="bshipcmd">
- <description>Battleship Commander</description>
- <year>1980</year>
- <publisher>Quality Software</publisher>
- <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple II with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-24 -->
- <!--"Battleship Commander" is a 1980 strategy game developed by Erik Kilk and Matthew Jew, and distributed by Quality Software. It requires a 13-sector drive but otherwise runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234809">
- <rom name="battleship commander.woz" size="234809" crc="e0dbe815" sha1="4e72e84cdf56f7d710dd56c21148019ce3ad46f1" />
- </dataarea>
- </part>
- </software>
-
<software name="3mileisl">
<description>Three Mile Island</description>
<year>1979</year>
<publisher>MUSE Software</publisher>
+ <info name="author" value="Richard Orban" />
<info name="usage" value="Requires a 48K Apple ][ with Integer BASIC in ROM." />
<sharedfeat name="compatibility" value="A2" />
<!-- Dump released: 2022-02-24 -->
- <!--"Three Mile Island" is a 1979 simulation game developed by Richard Orban and distributed by MUSE Software. It requires a 48K Apple ][ with Integer BASIC in ROM.-->
+ <!-- "Three Mile Island" is a 1979 simulation game developed by Richard Orban and distributed by MUSE Software. It requires a 48K Apple ][ with Integer BASIC in ROM. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234784">
@@ -17511,7 +7840,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-25 -->
- <!--"Conglomerates Collide" is a 1981 simulation game developed and distributed by Rockroy. It requires a 48K Apple ][+ or later.-->
+ <!-- "Conglomerates Collide" is a 1981 simulation game developed and distributed by Rockroy. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234775">
@@ -17527,7 +7856,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-25 -->
- <!--"Cyborg" is a 1981 adventure game developed by John Bell and distributed by Crystalware. It requires a 48K Apple ][+ or later.-->
+ <!-- "Cyborg" is a 1981 adventure game developed by John Bell and distributed by Crystalware. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A - Congoland disk" />
@@ -17567,1040 +7896,20 @@ license:CC0-1.0
</part>
</software>
- <software name="ccrallye">
- <description>Cross Country Rallye</description>
- <year>1982</year>
- <publisher>Continental Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Cross Country Rallye" is a 1982 action game developed by Bob Carter and distributed by Continental Software. It runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="121659">
- <rom name="cross country rallye.woz" size="121659" crc="22dcf4ba" sha1="915097d48fd38fc8af61f077aa3f70cf427f6a38" />
- </dataarea>
- </part>
- </software>
-
- <software name="crventur">
- <description>Creature Venture</description>
- <year>1981</year>
- <publisher>Highlands Computer Services</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Creature Venture" is a 1981 adventure game developed and distributed by Highlands Computer Services. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234800">
- <rom name="creature venture.woz" size="234800" crc="0636008c" sha1="17b7aaecb508e4e34d43a9bde626a9dc14643e70" />
- </dataarea>
- </part>
- </software>
-
- <software name="senutri35">
- <description>Science Explorers: Nutrition (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Nutrition" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296166">
- <rom name="science explorers- nutrition 800k.woz" size="1296166" crc="d1156b93" sha1="46a7cd52c75e27343a771a7a32d15aafe28fe17a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcexgaslaw35">
- <description>Exploring Gas Laws (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Exploring Gas Laws" is a 1989 educational program developed by Gene Breault, Hassan Kaganda, John J. Krenz, Patricia Korn, Kevin Neff, and Diane Portner, and distributed by MECC. This is version 1.0. It requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345387">
- <rom name="exploring gas laws 800k.woz" size="1345387" crc="b50389dd" sha1="bb39bf8b0314ef2da12460f9a7111ec62e8f1747" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwnderlpz35">
- <description>Wonderland Puzzles (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Wonderland Puzzles" is a 1989 educational program developed by Mark Hanson, Charolyn Kapplinger, Patricia Korn, and Dick Sisco, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296229">
- <rom name="wonderland puzzles 800k.woz" size="1296229" crc="8ea367e9" sha1="2f293d92dde388e82075aaa6062137cd381233a8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcscigiant35">
- <description>Science Giants (version 1.0) (800K 3.5")</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Science Giants" is a 1994 educational program developed by Ray Kush, John A. Persoon, and David L. Wood, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296207">
- <rom name="science giants 800k.woz" size="1296207" crc="253996a2" sha1="628ae886231fe1b93308b600da9f4297383586bf" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfreedm35">
- <description>Freedom! (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Freedom!" is a 1992 educational program developed by Rich Bergerson, Beth Daniels, Charolyn Kapplinger, John Ojanen, John Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296746">
- <rom name="freedom 800k.woz" size="1296746" crc="a30d1a86" sha1="1ddc5b2d74a92a74598d1ffbaee5ff4a10b8cd82" />
- </dataarea>
- </part>
- </software>
-
- <software name="routback35">
- <description>Rescue in the Outback (version 1.0) (800K 3.5")</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Rescue in the Outback" is a 1994 educational program developed by Beth Daniels, Patricia Korn, Rush Kivisto, Kevin Neff, Larry Phenow, Michael Tschimperle, Ju-Chang Wang, and John P. Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296288">
- <rom name="rescue in the outback 800k.woz" size="1296288" crc="8bebcdec" sha1="7dfae1f6717a7d3e3a2a9a4772ebe4167947ca07" />
- </dataarea>
- </part>
- </software>
-
- <software name="woollyg35">
- <description>Woolly's Garden (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Woolly's Garden" is a 1992 educational program developed by Beth Bell, Eileen Nannen, Jean Sharp, and Dave Wood, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296214">
- <rom name="woolly's garden 800k.woz" size="1296214" crc="0d9c3efc" sha1="0a9f82a523e78b31a578eb712c0580156090b222" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcexchaos35">
- <description>Exploring Chaos (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Exploring Chaos" is a 1992 educational program developed by Lon Koenig, Korey Schulz, Craig Solomonson, and Elizabeth Wendland, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296229">
- <rom name="exploring chaos 800k.woz" size="1296229" crc="cc12fb2c" sha1="bca23a6d1a35dd8e214cbeee3e885a3fc5bc995c" />
- </dataarea>
- </part>
- </software>
-
- <software name="sesmpm35">
- <description>Science Explorers: Simple Machines (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Simple Machines" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296172">
- <rom name="science explorers- simple machines 800k.woz" size="1296172" crc="0f9515a8" sha1="4bbbc2cfcb49e382a0b8532181da8e7cfbd9eb69" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmovmus35">
- <description>Moving Museum (version 1.0) (800K 3.5")</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Moving Museum" is a 1993 educational program developed by Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296231">
- <rom name="moving museum 800k.woz" size="1296231" crc="83d35fb7" sha1="9c88ce9e3a4b18c971d57e3a85ace2f826fa7044" />
- </dataarea>
- </part>
- </software>
-
- <software name="mctakech35">
- <description>Take a Chance! (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-25 -->
- <!--"Take a Chance!" is a 1992 educational program developed by Beth Bell, Dee Dee Daus, Ruth Kivisto, Kevin Neff, John Persoon, and Shari Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345391">
- <rom name="take a chance 800k.woz" size="1345391" crc="faad6e48" sha1="3ba61ce9b69a9a21c9c3df514b7126662816fd63" />
- </dataarea>
- </part>
- </software>
-
- <software name="mctrs4sale35">
- <description>Treasures for Sale (version 1.0) (800K 3.5")</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Treasures for Sale" is a 1993 educational program developed by Lon Koenig, John A. Persoon, Jean Sharp, John Wlazlo, David L. Wood, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296236">
- <rom name="treasures for sale 800k.woz" size="1296236" crc="46556fa9" sha1="98819dc7ce92272ea0b802be2f7d00682af29ad3" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcpicstory35">
- <description>Picture a Story (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Picture a Story" is a 1992 educational program developed by Beth Bell, Sheila Kelly, and Jean Sharp, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296203">
- <rom name="picture a story 800k.woz" size="1296203" crc="8b35fc3e" sha1="dc1bbe3d5c706317f8bb1e7d8ad86a45e0a9c884" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcnumjump35">
- <description>Number Jumpers (version 1.0) (800K 3.5")</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Number Jumpers" is a 1994 educational program developed by Rod Haenke, Lon Koenig, Korey Schulz, and Michael Tschimperle, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296223">
- <rom name="number jumpers 800k.woz" size="1296223" crc="3cc155ed" sha1="cac0800a6e51675aad91d676cc236771035fe6e5" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwindyc35">
- <description>Windy City (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Windy City" is a 1992 educational program developed by Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296228">
- <rom name="windy city 800k.woz" size="1296228" crc="93eda025" sha1="12b8ae7b9a8652f6d35f14d2c388fe5489d47823" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcwrdbuild35">
- <description>Word Builder (version 1.0) (800K 3.5")</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Word Builder" is a 1994 educational program developed by Rich Bergeron, Dee Dee Daus, and Scott Jensen, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296206">
- <rom name="word builder 800k.woz" size="1296206" crc="0da9b99f" sha1="2643adc1ba4dbfa867a518c1bbc29133fd717cc3" />
- </dataarea>
- </part>
- </software>
-
- <software name="mchistmakr35">
- <description>History Makers (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"History Makers" is a 1992 educational program developed by Rich Bergeron, Charolyn Kapplinger, Ray Kush, Mike Palmquist, Larry Phenow, Dick Sisco, Wayne Studer, and Ju-Chang Wang, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296277">
- <rom name="history makers 800k.woz" size="1296277" crc="7d02216a" sha1="83057b57e637c05410ba4aebbb9de651ad9bfe92" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfishsch35">
- <description>Fish School (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Fish School" is a 1992 educational program developed by Sue Gabrys, Sheila Kelly, Mike Palmquist, John Persoon, and John Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296229">
- <rom name="fish school 800k.woz" size="1296229" crc="06f283cb" sha1="f8e571b5c587ac560aa6081bd5c6e6fc040d82c9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgramgob35">
- <description>Grammar Gobble (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Grammar Gobble" is a 1992 educational program developed by Beth Bell, Sheila Dols, Scott Jensen, and David Wood, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296214">
- <rom name="grammar gobble 800k.woz" size="1296214" crc="addb6584" sha1="123ccf52672c13a4525a52da29f1af333deafee5" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrammad35">
- <description>Grammar Madness (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Grammar Madness" is a 1992 educational program developed by Beth Daniels, Sheila Dols, Sheila Kelly, and Elizabeth T. Wendland, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296229">
- <rom name="grammar madness 800k.woz" size="1296229" crc="9aeb501e" sha1="52ee1d264901cdcbf905954734346a42ac91ec55" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcnutnab35">
- <description>Nutrition Nabber (version 1.0) (800K 3.5")</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Nutrition Nabber" is a 1993 educational program developed by Dee Dee Daus, Kevin Neff, Korey Schulz, Paul Wieser, and John Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296231">
- <rom name="nutrition nabber 800k.woz" size="1296231" crc="574a38fa" sha1="f17a1f79e22a495b62b67a64dae6c0c0bd1587b7" />
- </dataarea>
- </part>
- </software>
-
- <software name="mconstage35">
- <description>On Stage (version 1.0) (800K 3.5")</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"On Stage" is a 1993 educational program developed by Beth Daniels, Dave Denninger, Ruth Kivisto, and Jean Sharp, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345366">
- <rom name="on stage 800k.woz" size="1345366" crc="625a2bde" sha1="58076651bf6ecd82a5c732cb3565894fc3c289b2" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsumstor35">
- <description>Sum Stories (version 1.0) (800K 3.5")</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Sum Stories" is a 1994 educational program developed by Dee Dee Daus, Ruth Kivisto, Korey Schulz, and Shari Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296215">
- <rom name="sum stories 800k.woz" size="1296215" crc="a0321385" sha1="c8498d6c964ccc754ace55ff9b7100cced0f493e" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbmrainf35">
- <description>Big Book Maker: The Rain Forest (800K 3.5")</description>
- <year>1993</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Big Book Maker: The Rain Forest" is a 1993 educational program developed by Pelican Software and distributed by Queue. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296179">
- <rom name="big book maker- the rain forest 800k.woz" size="1296179" crc="3e774638" sha1="8ab9a0d38d522b92235de0baf0379039cd38dbaa" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcrockfac35">
- <description>Rocket Factory (version 1.0) (800K 3.5")</description>
- <year>1992</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Rocket Factory" is a 1992 educational program developed by Miryam Acevedo-Bouchard, Patricia Korn, Kevin Neff, Korey Schulz, Ju-Chang Wang, and David L. Wood, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. Note: this image has been modified to remove identifying site license information.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296258">
- <rom name="rocket factory 800k.woz" size="1296258" crc="1183e7cc" sha1="eb9ba5f8c62649f650f790aa0bd4d2c4140c2c74" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcproblab35">
- <description>Probability Lab (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Probability Lab" is a 1990 educational program developed by Brian Nesse, Jane Peterson, and Craig Solomonson, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345346">
- <rom name="probability lab 800k.woz" size="1345346" crc="b7255478" sha1="fafaf15a09a1785ed0661218adbbd48c1ec7d3d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcssfree35">
- <description>Space Station Freedom (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-26 -->
- <!--"Space Station Freedom" is a 1990 educational program developed by Mark Hanson, Charolyn Kapplinger, Mike Palmquist, Jane Peterson, and John P. Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345403">
- <rom name="space station freedom 800k.woz" size="1345403" crc="dcaf7102" sha1="d1548f6e087c190c90e77faefb188a5ac7efce4a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcweedtree35">
- <description>Weeds to Trees (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Weeds to Trees" is a 1989 educational program developed by R. Philip Bouchard, Gene Breault, Greg Holey, Kevin Neff, and Brian Nesse, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345386">
- <rom name="weeds to trees 800k.woz" size="1345386" crc="25579af3" sha1="6fc68a8dc56ba98bdf69e7e461fb187dbb8b27f2" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsunseas35">
- <description>Sun and Seasons (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Sun and Seasons" is a 1990 educational program developed by Beth Bell, Gene Breault, Kevin Neff, and Liz Wendland, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345368">
- <rom name="sun and seasons 800k.woz" size="1345368" crc="5429b81f" sha1="6c126de6f3f1775a9170f78eed87bcf5d440560c" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcppp1035">
- <description>Paper Plane Pilot (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Paper Plane Pilot" is a 1991 educational program developed by Beth Bell, Gene Breault, Mark Hanson, Diane Portner, Shari Zehm, and Steve Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1344370">
- <rom name="paper plane pilot 800k.woz" size="1344370" crc="a422ed72" sha1="b8cda5fd41329ed56874ea28e2702a09ffad0c4d" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcpatt1235">
- <description>Patterns (version 1.2) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Patterns" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Rich Childers, Susan Gabrys, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Larry Phenow, and distributed by MECC. This is version 1.2. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345428">
- <rom name="patterns 800k.woz" size="1345428" crc="ea122ddf" sha1="6ef212569447246e7c69d116e507621844cdd7f0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mclcsh35">
- <description>Lewis and Clark Stayed Home (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Lewis and Clark Stayed Home" is a 1991 educational program developed by R. Philip Bouchard, Charolyn Kapplinger, Craig Solomonson, John A. Persoon, and Rich Bergeron, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345419">
- <rom name="lewis and clark stayed home 800k.woz" size="1345419" crc="a5f93fe9" sha1="029aaba23029d952d5b88aa3703c15adae3135b9" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrtoys35">
- <description>Grammar Toy Shop (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Grammar Toy Shop" is a 1990 educational program developed by Sheila Dols, Vincent Erickson, Charolyn Kapplinger, Patricia Korn, Sherry Luedloff, and Stephen Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1344902">
- <rom name="grammar toy shop 800k.woz" size="1344902" crc="b84c9b6c" sha1="580bccd171d9c1fb294b7d5ed30f42971f6001c1" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfosh1035">
- <description>Fossil Hunter (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Fossil Hunter" is a 1990 educational program developed by R. Philip Bouchard, Gene Breault, and Diane Portner, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345365">
- <rom name="fossil hunter 800k.woz" size="1345365" crc="073092dd" sha1="33f3dd361e2ffb11d942d8137e206cf10b2f410a" />
- </dataarea>
- </part>
- </software>
-
- <software name="bbm3prin35">
- <description>Big Book Maker: The Three Princesses (800K 3.5")</description>
- <year>1992</year>
- <publisher>Queue</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Big Book Maker: The Three Princesses" is a 1992 educational program developed by Pelican Software and distributed by Queue. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296184">
- <rom name="big book maker- the three princesses 800k.woz" size="1296184" crc="040676dd" sha1="d3a6bb6a79069df54d79de9ee472cfeb1df9ef90" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmurpmin35">
- <description>Murphy's Minerals (version 1.0) (800K 3.5")</description>
+ <software name="crtcube">
+ <description>Creature Cube</description>
<year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Murphy's Minerals" is a 1990 educational program developed by Beth Bell, Gene Breault, John Persoon, Larry Phenow, and Diane Portner, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345386">
- <rom name="murphy's minerals 800k.woz" size="1345386" crc="5752411a" sha1="617a843f287da864f419a266c5cb6440d822d070" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrammon35">
- <description>Grammar Monsters (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Grammar Monsters" is a 1991 educational program developed by Sheila Dols, Charolyn Kapplinger, John R. Ojanen, Elizabeth T. Wendland, and Stephen Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345404">
- <rom name="grammar monsters 800k.woz" size="1345404" crc="3b698dad" sha1="dda51c494309bdd9afd64a1ac3e87ef1c379ad1f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmysmtr35">
- <description>Mystery Matter (version 1.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-27 -->
- <!--"Mystery Matter" is a 1988 educational program developed by Greg Holey, Nan Leekley, Sherry Luedloff, John Persoon, Jane Peterson, Diane Portner, and Jim Thompson, and distributed by MECC. This is version 1.1. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345413">
- <rom name="mystery matter 800k.woz" size="1345413" crc="b2228c7a" sha1="46b9bdeb93383f7025476f18670e5dc60560acda" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcgrmgaz35">
- <description>Grammar Gazette (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Grammar Gazette" is a 1991 educational program developed by Beth Bell, Sheila Dols, Dee Dee Roedel, and Elizabeth T. Wendland, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345380">
- <rom name="grammar gazette 800k.woz" size="1345380" crc="38497f73" sha1="443db0fcdea30c0722efca9d0af540118c7800e8" />
- </dataarea>
- </part>
- </software>
-
- <software name="mc5sfore35">
- <description>Five Star Forecast (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Five-Star Forecast" is a 1990 educational program developed by Kevin Neff, Diane Portner, Elizabeth Wendland, and John P. Wlazlo, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345383">
- <rom name="five-star forecast 800k.woz" size="1345383" crc="cbe6bd01" sha1="d5465440ebfd32a4dbaff68970e6c07f4e1eaee4" />
- </dataarea>
- </part>
- </software>
-
- <software name="mclung1135">
- <description>Lunar Greenhouse (version 1.1) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- -=-=UNKNOWNCOMPATIBILITY=-=- -->
- <!-- Dump released: 2022-02-28 -->
- <!--"Lunar Greenhouse" is a 1989 educational program developed by Beth Bell, Kevin Neff, John Persoon, and Diane Portner, and distributed by MECC. This is version 1.1. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345370">
- <rom name="lunar greenhouse 800k.woz" size="1345370" crc="3048dafc" sha1="4faa14a6eb582ee8cc5c3c94f834fb81a62ee80b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcminerc35">
- <description>Miner's Cave (version 1.0) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Miner's Cave" is a 1988 educational program developed by Dean Brown, Bob Eggers, Matt Osber, Susan Christie Thomas, Peter Dublin, Gary Fujiwara, Mildred Feloney, and Herbert Fox, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345428">
- <rom name="miner's cave 800k.woz" size="1345428" crc="27c9761b" sha1="12fe0eaba09961508fb0efdb677effd4ee1408e4" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmeasw35">
- <description>Measure Works (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Measure Works" is a 1989 educational program developed by Elizabeth Bell, Vince Erickson, Susan Gabrys, Nan Leekley, Sherry Luedloff, and Diane Portner, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345404">
- <rom name="measure works 800k.woz" size="1345404" crc="68cc8280" sha1="5013cbe2b843498322578e4cc8e2f413875e07e2" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcmnwk1135">
- <description>Money Works (version 1.1) (800K 3.5")</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Money Works" is a 1987 educational program developed and distributed by MECC. This is version 1.1. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345307">
- <rom name="money works 800k.woz" size="1345307" crc="987b2d28" sha1="fa7f0d6c6fbf1ce041b9fabb3ea4d81db37e97dd" />
- </dataarea>
- </part>
- </software>
-
- <software name="stystsci35">
- <description>Story Starters: Science (800K 3.5")</description>
- <year>1990</year>
- <publisher>Pelican Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Story Starters: Science" is a 1990 educational program developed and distributed by Pelican Software. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296155">
- <rom name="story starters- science 800k.woz" size="1296155" crc="2d18a319" sha1="c53eb9c5f60e7175f2601eefe245d34dbb564e09" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcestst35">
- <description>Estimation Strategies (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Estimation Strategies" is a 1991 educational program developed by Beth Bell, Charolyn Kapplinger, Jane Peterson, and Shari Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345382">
- <rom name="estimation strategies 800k.woz" size="1345382" crc="ea9e7753" sha1="40d2863da9809d168e4b69a0a3748ed3a1a8667f" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcesta35">
- <description>Estimation Activities (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Estimation Activities" is a 1991 educational program developed by Beth Bell, Beth Daniels, Mark Hanson, Scott Jensen, Dee Dee Roedel, and Shari Zehm, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345401">
- <rom name="estimation activities 800k.woz" size="1345401" crc="df184f45" sha1="6ee726f99fea190d90a517b1bc190000537cf36e" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcestqs135">
- <description>Estimation: Quick Solve I (version 1.0) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Estimation: Quick Solve I" is a 1990 educational program developed by Beth Bell, Vincent Erickson, Shari Glenn, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Elizabeth Wendland, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345421">
- <rom name="estimation- quick solve i 800k.woz" size="1345421" crc="682407a0" sha1="793b8cc0164d458de09b10b8f58e05048a215e26" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfrmn1035">
- <description>Fraction Munchers (version 1.0) (800K 3.5")</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Fraction Munchers" is a 1987 educational program developed and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345313">
- <rom name="fraction munchers 800k.woz" size="1345313" crc="8bce93a6" sha1="bc25b9b3e88ad5483e8de6aaa1dd1d391148e18b" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcinsv1035">
- <description>Instant Survey (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Instant Survey" is a 1989 educational program developed by Mark Dostal, Cathy Grittner, Greg Holey, Pat Korn, Sherry Luedloff, Jean Sharp, Roger Shimada, Craig Solomonson, Jim Thompson, Debra Vonk, and Brian Walker, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="1345475">
- <rom name="instant survey 800k disk 1 - program.woz" size="1345475" crc="948fdfb9" sha1="9fa664939ccb62c1943c36233341367ced706c18" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Sampler disk" />
- <dataarea name="flop" size="1345475">
- <rom name="instant survey 800k disk 2 - sampler.woz" size="1345475" crc="e8e0b270" sha1="0d7800c2ec0ada431f14e26aa8d50ddba62cc697" />
- </dataarea>
- </part>
- </software>
-
- <software name="stystsst">
- <description>Story Starters: Social Studies (800K 3.5")</description>
- <year>1990</year>
- <publisher>Pelican Software</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Story Starters: Social Studies" is a 1990 educational program developed and distributed by Pelican Software. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296162">
- <rom name="story starters- social studies 800k.woz" size="1296162" crc="b1de0c6c" sha1="d8dc96b0948427dbdbe5cea04fcff197b0ac0795" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcspelv1335">
- <description>Spellevator (version 1.3) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Spellevator" is a 1988 educational program developed by Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Michael Stein, Caren Stelson, Loren Sucher, and Paul Wenker, and distributed by MECC. This is version 1.3. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345422">
- <rom name="spellevator 800k.woz" size="1345422" crc="7719568e" sha1="41bab7875e7c0b00f89e1302587f5c5ecf14bb5a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplpzat35">
- <description>Spelling Puzzles and Tests (800K 3.5")</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Spelling Puzzles and Tests" is a 1990 educational program developed by Sheila Dols, Vincent Erickson, and Susan Gabrys, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345380">
- <rom name="spelling puzzles and tests 800k.woz" size="1345380" crc="5014efeb" sha1="0ff5804b5e94c38a4c68554a770b15093ef5b7e5" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcsplstkit35">
- <description>Spelling Series Toolkit (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Spelling Series Toolkit" is a 1989 educational program developed by Craig Copley, Peggi Fritzler, John J. Krenz, Brian Nesse, Larry Phenow, Vince Erickson, Susan Gabrys, Sherry Luedloff, Mark Paquette, and Steve Taffee, and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345467">
- <rom name="spelling series toolkit 800k.woz" size="1345467" crc="facbd8c6" sha1="c775a3956e4fddec03b268e85c497b663144291a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcspelwk1135">
- <description>Spelling Workout (version 1.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Spelling Workout" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Vince Erickson, Charolyn Kapplinger, Sherry Luedloff, Brian Nesse, Diane Portner, Roger Shimada, Caren Stelson, and Paul Weiser, and distributed by MECC. This is version 1.1. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345463">
- <rom name="spelling workout 800k.woz" size="1345463" crc="eeec1f34" sha1="6af97a6e930293c2c8fd5ed6f05a4f9ea274c0bd" />
- </dataarea>
- </part>
- </software>
-
- <software name="mctopto1135">
- <description>Teacher Option Organizer (version 1.1) (800K 3.5")</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Teacher Option Organizer" is a 1988 educational program developed by Kevin Neff, Larry Phenow, Diane Portner, Jim Thompson, Brian Walker, and Nelson Whyatt, and distributed by MECC. This is version 1.1. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345408">
- <rom name="teacher option organizer 800k.woz" size="1345408" crc="d76c2abc" sha1="3c9bf5235256504b613a1e25bcc8fb72503a0747" />
- </dataarea>
- </part>
- </software>
-
- <software name="perpuz35">
- <description>Perplexing Puzzles (800K 3.5")</description>
- <year>1985</year>
- <publisher>Hartley Courseware</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card in slot 5." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Perplexing Puzzles" is a 1985 educational program developed by Phil Mansour and Paul Fleisher, and distributed by Hartley Courseware. This version is dated 07.09.85. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card in slot 5.-->
-
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="1345343">
- <rom name="perplexing puzzles 800k disk 1 - program.woz" size="1345343" crc="49cb4f0d" sha1="dd86a361eb3f8dc8c0f0c72bb940588b32dfc35f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Tutorial disk" />
- <dataarea name="flop" size="1345343">
- <rom name="perplexing puzzles 800k disk 2 - tutorial.woz" size="1345343" crc="a0be29c0" sha1="17edeba201fda0db25177007c157e4fe0f6e6e41" />
- </dataarea>
- </part>
- </software>
-
- <software name="seplants35">
- <description>Science Explorers: Plants (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Plants" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296168">
- <rom name="science explorers- plants 800k.woz" size="1296168" crc="77a7c3b8" sha1="85eaee8968a1b9ec58a462573e4b96e275af9490" />
- </dataarea>
- </part>
- </software>
-
- <software name="seshadows35">
- <description>Science Explorers: Shadows (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Shadows" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296169">
- <rom name="science explorers- shadows 800k.woz" size="1296169" crc="2b3fed2a" sha1="75ea2ff87859cf94f3f4f31da36547666a554b73" />
- </dataarea>
- </part>
- </software>
-
- <software name="seskel35">
- <description>Science Explorers: Skeletons (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Skeletons" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296171">
- <rom name="science explorers- skeletons 800k.woz" size="1296171" crc="1c09bd4c" sha1="b6e6f80e158b655832f1aec971939e7b207aabce" />
- </dataarea>
- </part>
- </software>
-
- <software name="seweather35">
- <description>Science Explorers: Weather (800K 3.5")</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-28 -->
- <!--"Science Explorers: Weather" is a 1990 educational program developed by Prentice Associates and distributed by Scholastic. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296195">
- <rom name="science explorers- weather 800k.woz" size="1296195" crc="36354bf8" sha1="bfd628011dba223dc08fe09d24bf5e8882dc4d31" />
- </dataarea>
- </part>
- </software>
-
- <software name="finlconf">
- <description>The Final Conflict</description>
- <year>1982</year>
- <publisher>Hayden Book Company</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <publisher>WINGS for learning</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="James Kim" />
+ <info name="programmer" value="David Findley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-21 -->
- <!--"The Final Conflict" is a 1982 strategy game developed by Thomas G. Cleaver and distributed by Hayden Book Company. It requires a 48K Apple ][+ or later.-->
-
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234810">
- <rom name="the final conflict.woz" size="234810" crc="149270e2" sha1="1e1ba74c733adfd57df96c6f395e9804f03dc69a" />
+ <dataarea name="flop" size="234850">
+ <rom name="creature cube.woz" size="234850" crc="dadd0c45" sha1="b37136abf81ddbe996d4e69c8cd0c473de995595" />
</dataarea>
</part>
</software>
@@ -18612,7 +7921,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-21 -->
- <!--"Intrigue!" is a 1986 adventure game developed by Kinemation and distributed by Spectrum Holobyte. It requires a 48K Apple ][+ or later.-->
+ <!-- "Intrigue!" is a 1986 adventure game developed by Kinemation and distributed by Spectrum Holobyte. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -18635,7 +7944,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-21 -->
- <!--"Deathmaze 5000" is a 1980 adventure game developed by Frank Corr Jr. and distributed by Med Systems Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "Deathmaze 5000" is a 1980 adventure game developed by Frank Corr Jr. and distributed by Med Systems Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234805">
@@ -18651,7 +7960,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-21 -->
- <!--"Space Pirates 3000" is a 1982 strategy game developed and distributed by C and C Software. It requires a 48K Apple ][+ or later.-->
+ <!-- "Space Pirates 3000" is a 1982 strategy game developed and distributed by C and C Software. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234777">
@@ -18667,7 +7976,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-02-21 -->
- <!--"Windmere Estate" is a 1982 adventure game developed by Dennis N. Strong and distributed by Dynacomp. It requires a 48K Apple ][+ or later.-->
+ <!-- "Windmere Estate" is a 1982 adventure game developed by Dennis N. Strong and distributed by Dynacomp. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234822">
@@ -18676,54 +7985,6 @@ license:CC0-1.0
</part>
</software>
- <software name="sgalwars">
- <description>Super Galaxy Wars</description>
- <year>1980</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-02-21 -->
- <!--"Super Galaxy Wars" is a 1980 action game developed by Starcraft and distributed by Brøderbund Software. It runs on any Apple II with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="68395">
- <rom name="super galaxy wars.woz" size="68395" crc="18494bf7" sha1="1ebddec2b4db6c1c0beeba18954ccbd7ad618dfe" />
- </dataarea>
- </part>
- </software>
-
- <software name="sstorytree">
- <description>Super Story Tree (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-11 -->
- <!--"Super Story Tree" is a 1989 productivity program developed by George Brackett and distributed by Scholastic. This is version 1.0. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1312530">
- <rom name="super story tree 800k.woz" size="1312530" crc="782dc19e" sha1="276c3db1789b4331d3c1ce73df0842dc6b9c19d4" />
- </dataarea>
- </part>
- </software>
-
- <software name="compconc">
- <description>Computer Concepts (800K 3.5")</description>
- <year>1990</year>
- <publisher>Ventura Educational Systems</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-12 -->
- <!--"Computer Concepts" is a 1990 educational program developed by Fred Ventura and distributed by Ventura Educational Systems. It requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296165">
- <rom name="computer concepts 800k.woz" size="1296165" crc="a4c5967b" sha1="94318e12fa5ac22ffdc283f51d06aa7c57d0d13b" />
- </dataarea>
- </part>
- </software>
-
<software name="plntgsim">
<description>The Plant Growth Simulator (800K 3.5")</description>
<year>1987</year>
@@ -18731,7 +7992,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 48K ][+ or //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-03-12 -->
- <!--"The Plant Growth Simulator: Elementary Version" is a 1987 educational program developed by Allan Woolway, David Strelitz, Dan Gelon, and Kenneth Moss, and distributed by Focus Media. It requires an Apple IIgs, //c+, or 48K ][+ or //e with a compatible drive controller card.-->
+ <!-- "The Plant Growth Simulator: Elementary Version" is a 1987 educational program developed by Allan Woolway, David Strelitz, Dan Gelon, and Kenneth Moss, and distributed by Focus Media. It requires an Apple IIgs, //c+, or 48K ][+ or //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
@@ -18747,59 +8008,15 @@ license:CC0-1.0
</part>
</software>
- <software name="factfall">
- <description>Facts and Fallacies (version 02.01.87) (800K 3.5")</description>
- <year>1984</year>
- <publisher>Hartley Courseware</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 48K //e or ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-17 -->
- <!--"Facts and Fallacies" is a 1984 educational game developed by Jim Parshall, Garnet Chappell, and Mike Micklatcher, and distributed by Hartley Courseware. This version is dated 02.01.87. It requires an Apple IIgs, //c+, or 48K //e or ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Master disk" />
- <dataarea name="flop" size="1296232">
- <rom name="facts and fallacies 800k - disk 1 - master disk.woz" size="1296232" crc="e6a57696" sha1="a7d1169128008d3b74586720f302bec783f1f410" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Fact sheets" />
- <dataarea name="flop" size="1296232">
- <rom name="facts and fallacies 800k - disk 2 - fact sheets.woz" size="1296232" crc="563400e0" sha1="7d8412c3c162eebb84542c78e60a9464a5fb49c7" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Disk 3 - Data disk" />
- <dataarea name="flop" size="1276774">
- <rom name="facts and fallacies 800k - disk 3 - data disk.woz" size="1276774" crc="2725075c" sha1="7f9e7983b37c8e301a43bad22900b221fad3fea5" />
- </dataarea>
- </part>
- </software>
-
- <software name="lafabric">
- <description>La Fábrica (800K 3.5")</description>
- <year>1991</year>
- <publisher>WINGS for Learning</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"La Fábrica" (The Factory) is a 1991 Spanish educational program developed by Marge Kosel and Mike Fish, and distributed by WINGS for Learning. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1329972">
- <rom name="la fabrica 800k.woz" size="1329972" crc="593ea2ef" sha1="920143b2cae9110368214a89db9c553c073d4f8c" />
- </dataarea>
- </part>
- </software>
-
<software name="galquest">
<description>Galactic Quest</description>
<year>1980</year>
<publisher>Crystal Software</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later with a 13-sector drive." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
<!-- Dump released: 2022-03-17 -->
- <!--"Galactic Quest" is a 1980 simulation game developed by John and Patty Bell, and distributed by Crystal Software. It requires a 48K Apple ][+ or later with a 13-sector drive.-->
+ <!-- "Galactic Quest" is a 1980 simulation game developed by John and Patty Bell, and distributed by Crystal Software. It requires a 48K Apple ][+ or later with a 13-sector drive. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234809">
@@ -18808,212 +8025,6 @@ license:CC0-1.0
</part>
</software>
- <software name="mcflfun1135">
- <description>First-Letter Fun (version 1.1) (800K 3.5")</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"First-Letter Fun" is a 1985 educational program developed and distributed by MECC. This is version 1.1. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345314">
- <rom name="first-letter fun 800k.woz" size="1345314" crc="d7cafd9b" sha1="1bc9a26fb0273a85689e2ba94afde41b6c0e2f3a" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcjennyj35">
- <description>Jenny's Journeys (version 1.0) (800K 3.5")</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"Jenny's Journeys" is a 1984 educational program developed and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345314">
- <rom name="jenny's journeys 800k.woz" size="1345314" crc="f077ef2a" sha1="f6c6279c28c45ec9137cb960ff5505df6d916914" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcodell1235">
- <description>Odell Lake (version 1.2) (800K 3.5")</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"Odell Lake" is a 1986 educational program developed and distributed by MECC. This is version 1.2. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345308">
- <rom name="odell lake 800k.woz" size="1345308" crc="f56958b8" sha1="707b02e2648493226cc4a53c239db3bc8cb4f540" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcspdwaym35">
- <description>Speedway Math (version 1.0) (800K 3.5")</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"Speedway Math" is a 1986 educational program developed and distributed by MECC. This is version 1.0. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345311">
- <rom name="speedway math 800k.woz" size="1345311" crc="bae80f2a" sha1="9702511ee81cc9a5465feec344baddeac4526c88" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcfrdc1535">
- <description>The Friendly Computer (version 1.5) (800K 3.5")</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 48K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"The Friendly Computer" is a 1983 educational program developed and distributed by MECC. This is version 1.5. It requires an Apple IIgs, //c+, or 48K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345319">
- <rom name="the friendly computer 800k.woz" size="1345319" crc="9ed0d5ca" sha1="6f5af20ccede36b8b0bad57e710022197d7f8da2" />
- </dataarea>
- </part>
- </software>
-
- <software name="mcorgtrl1435">
- <description>The Oregon Trail (version 1.4) (800K 3.5")</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-02 -->
- <!--"The Oregon Trail" is a 1985 educational program developed and distributed by MECC. This is version 1.4. It requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296162">
- <rom name="the oregon trail 800k.woz" size="1296162" crc="89ee473a" sha1="101e39fed19715a6b577bb90ca67ac7b0c6ace23" />
- </dataarea>
- </part>
- </software>
-
- <software name="bnksw320c35">
- <description>The Bank Street Writer III (20-Column Version) (800K 3.5")</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-09 -->
- <!--"The Bank Street Writer III" is a 1986 productivity program developed by Gordon Riggs and distributed by Scholastic. This is the 20 Column Version, with bundled Teacher Tools. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296683">
- <rom name="the bank street writer iii 800k.woz" size="1296683" crc="c49de32c" sha1="e6617380de897d8f74e0724e004cf5850e697860" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsmith50c">
- <description>Locksmith (version 5.0 Revision C)</description>
- <year>1983</year>
- <publisher>Omega Microware</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-26 -->
- <!--"Locksmith" is a 1983 disk utility developed and distributed by Omega Microware. This is version 5.0 revision C. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234792">
- <rom name="locksmith v5.0c.woz" size="234792" crc="a50a0a75" sha1="6505f88cdd389f21e3638d8bcfc1df3bf88b7812" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsmith50f">
- <description>Locksmith (version 5.0 Revision F)</description>
- <year>1983</year>
- <publisher>Omega Microware</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-26 -->
- <!--"Locksmith" is a 1983 disk utility developed and distributed by Omega Microware. This is version 5.0 revision F. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234792">
- <rom name="locksmith v5.0f.woz" size="234792" crc="961919c1" sha1="1e4769a0c14079ed163b27b8857b5674afb520e3" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsmith50g">
- <description>Locksmith (version 5.0 Revision G)</description>
- <year>1983</year>
- <publisher>Omega Microware</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-26 -->
- <!--"Locksmith" is a 1983 disk utility developed and distributed by Omega Microware. This is version 5.0 revision G. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234803">
- <rom name="locksmith v5.0g.woz" size="234803" crc="453629cd" sha1="9f8b59c4e5a21fdb5c41263f813a0e441c586217" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsmith60a">
- <description>Locksmith (version 6.0 Revision A)</description>
- <year>1986</year>
- <publisher>Alpha Logic Business Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-26 -->
- <!--"Locksmith" is a 1986 disk utility developed and distributed by Alpha Logic Business Systems. This is version 6.0 revision A. It runs on any Apple ][ with 48K. This archive also includes Locksmith 6.0 Parameter Disk 1.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="234798">
- <rom name="locksmith v6.0a parameter disk 1.woz" size="234798" crc="88e3563c" sha1="ad16d3e5d07feef9871f01c678d59a6bc658faac" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="234790">
- <rom name="locksmith v6.0a.woz" size="234790" crc="84b8d5ef" sha1="d782dab1994115295d00c6697f996269cf71e5fa" />
- </dataarea>
- </part>
- </software>
-
- <software name="lsmith60b">
- <description>Locksmith (version 6.0 Revision B)</description>
- <year>1986</year>
- <publisher>Alpha Logic Business Systems</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-27 -->
- <!--"Locksmith" is a 1986 disk utility developed and distributed by Alpha Logic Business Systems. This is version 6.0 revision B, created by booting version 6.0 revision A and executing the "patch to rev. B" file from Locksmith Parameter Disk 1D. It runs on any Apple ][ with 48K. This archive also includes Locksmith 6.0 Parameter Disk 1D.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Locksmith v6.0b" />
- <dataarea name="flop" size="234790">
- <rom name="locksmith v6.0b.woz" size="234790" crc="9106c526" sha1="efdaec6e6c9592ea98e65b098dd19099f5f61149" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Locksmith 6.0B parameter disk 1D" />
- <!-- This disk upgrades 6.0A to 6.0B -->
- <dataarea name="flop" size="234799">
- <rom name="locksmith v6.0b parameter disk 1d.woz" size="234799" crc="e31292d4" sha1="bab8cc7a5f34a2a44954648b17f85997cacd443a" />
- </dataarea>
- </part>
- </software>
-
<software name="sdiskc36">
<description>Super Disk Copy (version 3.6)</description>
<year>1981</year>
@@ -19021,7 +8032,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-03-27 -->
- <!--"Super Disk Copy" is a 1981 disk utility developed and distributed by Sensible Software. This is version 3.6. It runs on any Apple ][ with 48K.-->
+ <!-- "Super Disk Copy" is a 1981 disk utility developed and distributed by Sensible Software. This is version 3.6. It runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="55078">
@@ -19037,7 +8048,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-03-31 -->
- <!--"Kraking by The Disk Jockey" is a 1984 educational program developed by The Disk Jockey and distributed by Pirate's Harbor. It runs on any Apple ][ with 48K.-->
+ <!-- "Kraking by The Disk Jockey" is a 1984 educational program developed by The Disk Jockey and distributed by Pirate's Harbor. It runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -19053,22 +8064,6 @@ license:CC0-1.0
</part>
</software>
- <software name="handmath135">
- <description>Hands-On Math! Volume I (800K 3.5")</description>
- <year>1988</year>
- <publisher>Ventura Educational Systems</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-03-31 -->
- <!--"Hands-On Math! Volume I" is a 1988 educational program developed and distributed by Ventura Educational Systems. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296178">
- <rom name="hands-on math volume 1 800k.woz" size="1296178" crc="100c9d29" sha1="7d73389edc6dc343c6ade6b6f9774780e8b4cc31" />
- </dataarea>
- </part>
- </software>
-
<software name="scpearth">
<description>Science Corner: Planet Earth (800K 3.5")</description>
<year>1989</year>
@@ -19076,7 +8071,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-03-31 -->
- <!--"Science Corner: Planet Earth" is a 1989 educational program developed by Learningways, Inc. and distributed by Society for Visual Education. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card.-->
+ <!-- "Science Corner: Planet Earth" is a 1989 educational program developed by Learningways, Inc. and distributed by Society for Visual Education. It requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296201">
@@ -19085,22 +8080,6 @@ license:CC0-1.0
</part>
</software>
- <software name="bnckmg">
- <description>Bouncing Kamungas!</description>
- <year>1983</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-04-01 -->
- <!--"Bouncing Kamungas!" is a 1983 action game developed by Tom Becklund and distributed by Penguin Software. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="81700">
- <rom name="bouncing kamungas.woz" size="81700" crc="c4de657e" sha1="f2f6299d5efa68eeb087990daf3df560911e3950" />
- </dataarea>
- </part>
- </software>
-
<software name="pigpen">
<description>Pig Pen</description>
<year>1982</year>
@@ -19108,7 +8087,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-04-01 -->
- <!--"Pig Pen" is a 1982 action game developed by TMQ Software and distributed by Datamost. It requires a 48K Apple ][+ or later.-->
+ <!-- "Pig Pen" is a 1982 action game developed by TMQ Software and distributed by Datamost. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234773">
@@ -19117,22 +8096,6 @@ license:CC0-1.0
</part>
</software>
- <software name="ricochet">
- <description>Ricochet</description>
- <year>1982</year>
- <publisher>Automated Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-04-01 -->
- <!--"Ricochet" is a 1982 action game developed and distributed by Automated Simulations. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234805">
- <rom name="ricochet.woz" size="234805" crc="ce1c4d9d" sha1="775f043ba627970753250732c9da7964f5ab9e54" />
- </dataarea>
- </part>
- </software>
-
<software name="gseaskies">
<description>Grey Seas, Grey Skies</description>
<year>1983</year>
@@ -19140,7 +8103,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-04-01 -->
- <!--"Grey Seas, Grey Skies" is a 1983 simulation game developed by W. J. Nichols and distributed by Simulations Canada. It requires a 48K Apple ][+ or later.-->
+ <!-- "Grey Seas, Grey Skies" is a 1983 simulation game developed by W. J. Nichols and distributed by Simulations Canada. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234783">
@@ -19156,7 +8119,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-04-02 -->
- <!--"Columns //e" is a 1991 action game developed by Michael Foegelle and distributed by Creative Computing Services. This is version 2.01. It requires a 128K Apple //e or later.-->
+ <!-- "Columns //e" is a 1991 action game developed by Michael Foegelle and distributed by Creative Computing Services. This is version 2.01. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
@@ -19172,58 +8135,12 @@ license:CC0-1.0
</part>
</software>
- <software name="wzdry0981">
- <description>Wizardry: Proving Grounds of the Mad Overload (version 05-SEP-81)</description>
- <year>1981</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-04-02 redump: 2022-05-10 to fix critical data corruption in the saved characters roster that entirely prevented playing.-->
- <!--"Wizardry: Proving Grounds of the Mad Overload" is a 1981 roleplaying game developed by Andrew Greenberg and Robert Woodhead, and distributed by Sir-Tech. This version is dated 05-SEP-81, the earliest known version. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Scenario disk" />
- <dataarea name="flop" size="234881">
- <rom name="wizardry- proving grounds of the mad overlord v05-sep-81 side a - scenario.woz" size="234881" crc="0e955f2e" sha1="47dd791b826c1d952ca78fe209fafd5f6fc30ed8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Boot disk" />
- <dataarea name="flop" size="234846">
- <rom name="wizardry- proving grounds of the mad overlord v05-sep-81 side b - boot.woz" size="234846" crc="a7d80c8c" sha1="1f1ad5cb198a29e1934a744901ae71cccc82e300" />
- </dataarea>
- </part>
- </software>
-
- <software name="wzdry1281">
- <description>Wizardry: Proving Grounds of the Mad Overload (version 01-DEC-81)</description>
- <year>1981</year>
- <publisher>Sir-Tech</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-04-02 -->
- <!--"Wizardry: Proving Grounds of the Mad Overload" is a 1981 roleplaying game developed by Andrew Greenberg and Robert Woodhead, and distributed by Sir-Tech. This version is dated 01-DEC-81. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Master scenario disk" />
- <dataarea name="flop" size="234884">
- <rom name="wizardry- proving grounds of the mad overlord v01-dec-81 side a - master scenario.woz" size="234884" crc="caae12b7" sha1="78b15dbc13bcf61cf9f44a31d3478a565b010b0f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Boot disk" />
- <dataarea name="flop" size="234873">
- <rom name="wizardry- proving grounds of the mad overlord v01-dec-81 side b - boot.woz" size="234873" crc="0a1eb2ab" sha1="36d42cdb06b5b7452c05ddccf5d6aa8182bdd790" />
- </dataarea>
- </part>
- </software>
-
<software name="drugefct">
<description>Drugs: Their Effects on You</description>
<year>1987</year>
<publisher>Marshware</publisher>
<!-- Dump released: 2022-04-23 -->
- <!--"Drugs: Their Effects on You" is a 1987 educational program developed by EduSystems, illustrated by Morse Software Illustrations, with consultants Donna L. Osness and James M. Schaefer, and distributed by Marshware. It is preserved here for the first time.-->
+ <!-- "Drugs: Their Effects on You" is a 1987 educational program developed by EduSystems, illustrated by Morse Software Illustrations, with consultants Donna L. Osness and James M. Schaefer, and distributed by Marshware. It is preserved here for the first time. -->
<!-- Be sure to read the story of actually obtaining and dumping this disk at
https://archive.org/details/PreservingDrugsTheirEffectsOnYou
It might leave you taped to your seat. -->
@@ -19243,7 +8160,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-04-29 -->
- <!--"Starmines" is a 1981 action game developed by Steve A. Baker and distributed by Softape. It runs on any Apple ][ with 48K.-->
+ <!-- "Starmines" is a 1981 action game developed by Steve A. Baker and distributed by Softape. It runs on any Apple ][ with 48K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234772">
@@ -19259,7 +8176,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-04-29 -->
- <!--"Basic Woodshop Safety" is a 1983 educational program developed and distributed by Abraxas. It requires a 48K Apple ][+ or later.-->
+ <!-- "Basic Woodshop Safety" is a 1983 educational program developed and distributed by Abraxas. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="228121">
@@ -19275,7 +8192,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-05-11 -->
- <!--"SunDog: Frozen Legacy" is a 1984 simulation game developed and distributed by FTL Games. This is version 2.0. It requires a 64K Apple ][+ or later.-->
+ <!-- "SunDog: Frozen Legacy" is a 1984 simulation game developed and distributed by FTL Games. This is version 2.0. It requires a 64K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A - Play side" />
@@ -19291,29 +8208,6 @@ license:CC0-1.0
</part>
</software>
- <software name="jumpman">
- <description>Jumpman</description>
- <year>1983</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-11 -->
- <!--"Jumpman" is a 1983 action game developed and distributed by Epyx. It runs on any Apple ][ with 48K.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - Beginner levels" />
- <dataarea name="flop" size="234776">
- <rom name="jumpman - beginner levels.woz" size="234776" crc="5a113793" sha1="fbe71d6b9e2fc9c10015ed2ec01b94a0d70024a9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - Advanced levels" />
- <dataarea name="flop" size="234776">
- <rom name="jumpman - advanced levels.woz" size="234776" crc="51c438bc" sha1="b4cb7b54f461688bb513feae050036aa1b0ec7ca" />
- </dataarea>
- </part>
- </software>
-
<software name="emp2is10">
<description>Empire II: Interstellar Sharks (version 1.0)</description>
<year>1982</year>
@@ -19321,7 +8215,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-05-11 -->
- <!--"Empire II: Interstellar Sharks" is a 1982 simulation game developed by David Mullich, Ken Delgado, Mike St. Jean, Jim Wootton, Wendy Peterson, and Pam Pollack, and distributed by Edu-Ware Services. This is version 1.0. It requires a 48K Apple ][+ or later.-->
+ <!-- "Empire II: Interstellar Sharks" is a 1982 simulation game developed by David Mullich, Ken Delgado, Mike St. Jean, Jim Wootton, Wendy Peterson, and Pam Pollack, and distributed by Edu-Ware Services. This is version 1.0. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234881">
@@ -19330,618 +8224,14 @@ license:CC0-1.0
</part>
</software>
- <software name="surmth20">
- <description>Survival Math (version 2.0)</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"Survival Math" is a 1985 educational game designed by Walter Koetke and distributed by Sunburst Communications. This is version 2.0. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234814">
- <rom name="survival math.woz" size="234814" crc="6d646e06" sha1="1d1ec8b1f67e8835f36c44fe8bacb0cfa2d3a1df" />
- </dataarea>
- </part>
- </software>
-
- <software name="tbtpaps13">
- <description>Teasers by Tobbs: Puzzles and Problem Solving (version 1.3)</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"Teasers by Tobbs: Puzzles and Problem Solving" is a 1982 educational game authored by Tom O'Brien and distributed by Sunburst Communications. This is version 1.3. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234852">
- <rom name="teasers by tobbs- puzzles and problem solving.woz" size="234852" crc="ec73b80b" sha1="b8213f89a886d23f12b9d94190f82f4eae1b73ca" />
- </dataarea>
- </part>
- </software>
-
- <software name="tgsquad">
- <description>The Geometric Supposer: Quadrilaterals</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"The Geometric Supposer: Quadrilaterals" is a 1986 educational program by Judah L. Schwartz and Michal Yerushalmy, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234849">
- <rom name="the geometric supposer- quadrilaterals.woz" size="234849" crc="457b9a05" sha1="f9ef50533975b4474051a6a42141e93a1a5b0c26" />
- </dataarea>
- </part>
- </software>
-
- <software name="tgtang">
- <description>Targets: A Numbers Game</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"Targets: A Numbers Game" is a 1985 educational game designed by T.C. O'Brien II, programmed by Andrew Lorenz, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234836">
- <rom name="targets- a numbers game.woz" size="234836" crc="343980eb" sha1="7d45fbc51a115319dedb3c560e470ecfe3da1c02" />
- </dataarea>
- </part>
- </software>
-
- <software name="tgstri">
- <description>The Geometric Supposer: Triangles</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"The Geometric Supposer: Triangles" is a 1985 educational program by Judah L. Schwartz and Michal Yerushalmy, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234833">
- <rom name="the geometric supposer- triangles.woz" size="234833" crc="251da185" sha1="7095b073ea38d41aca74c9957b44bc8922fc0494" />
- </dataarea>
- </part>
- </software>
-
- <software name="tkrmad">
- <description>The King's Rule: Mathematics and Discovery</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"The King's Rule: Mathematics and Discovery" is a 1984 educational program designed by Tom O'Brien, programmed by Tom Raich and Mike Fish, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234846">
- <rom name="the king's rule- mathematics and discovery.woz" size="234846" crc="bfefe27a" sha1="cf0beacfe1cece58a390c0c9903025470e385ba1" />
- </dataarea>
- </part>
- </software>
-
- <software name="wqstbss">
- <description>Word Quest: Binary Search Strategies</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"Word Quest: Binary Search Strategies" is a 1985 educational game by Judah L. Schwartz and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234826">
- <rom name="word quest- binary search strategies.woz" size="234826" crc="a559b0c3" sha1="fcfa01b5a2ae6fec3f348f8059730b3834267e93" />
- </dataarea>
- </part>
- </software>
-
- <software name="tpuzlr">
- <description>The Puzzler: A Program for Developing Reading Strategies</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-14 -->
- <!--"The Puzzler: A Program for Developing Reading Strategies" is a 1984 educational program developed by Janet Gollan, Audrey Shillington, Douglas Denby, Douglas Inkpen, Arthur Willer, Dale Burnett, and Larry Miller, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234929">
- <rom name="the puzzler.woz" size="234929" crc="c46c6136" sha1="b97472d741f8d879e5ac6bebdf88bf078f12c385" />
- </dataarea>
- </part>
- </software>
-
- <software name="memcastl">
- <description>Memory Castle</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-20 -->
- <!--"Memory Castle" is a 1985 educational game designed by Donna Stanger, programmed by Lon Koenig, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234802">
- <rom name="memory castle.woz" size="234802" crc="4392bcc7" sha1="76e4a3aac956c7acc5ed9383bf7e80b86b32241e" />
- </dataarea>
- </part>
- </software>
-
- <software name="blkfndrs">
- <description>Blockers and Finders</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-20 -->
- <!--"Blockers and Finders" is a 1987 educational game designed by Tom O'Brien, programmed by Jim Thomas, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234807">
- <rom name="blockers and finders.woz" size="234807" crc="10a1d4fd" sha1="7242b9035e77e14ff47597682f32968b119e72cc" />
- </dataarea>
- </part>
- </software>
-
- <software name="fornext">
- <description>FOR Your NEXT Adventure: FOR-NEXT Loops</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-20 -->
- <!--"FOR Your NEXT Adventure: FOR-NEXT Loops" is a 1985 educational game designed by John Stimson, Robert C. Rosen, and Ardyth Stimson, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234855">
- <rom name="for your next adventure.woz" size="234855" crc="67cfa17d" sha1="342c28e36a8d735b09d6be7e6e9e407254ba7283" />
- </dataarea>
- </part>
- </software>
-
- <software name="wlywrdwk">
- <description>Wally's Word Works: The Parts of Speech Game</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-20 -->
- <!--"Wally's Word Works: The Parts of Speech Game" is a 1985 educational game designed by John D. Perron and Martha Nicols, programmed by Andrew Armstrong, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk" />
- <dataarea name="flop" size="234886">
- <rom name="wally's word works disk 1 - teacher disk.woz" size="234886" crc="2436eb0c" sha1="0bfb8694332b4a2bd38e4bd0bc0734c84ea8494f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Student disk" />
- <dataarea name="flop" size="234886">
- <rom name="wally's word works disk 2 - student disk.woz" size="234886" crc="bd913887" sha1="49d7fb5a1e1b1b1da778692f9009c1d37bf6ff92" />
- </dataarea>
- </part>
- </software>
-
- <software name="tlapuzps">
- <description>Tobbs Learns Algebra: Puzzles and Problem Solving</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-20 -->
- <!--"Tobbs Learns Algebra: Puzzles and Problem Solving" is a 1983 educational game by Tom O'Brien and distributed by Sunburst Communications. This is version 1.1. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234843">
- <rom name="tobbs learns algebra.woz" size="234843" crc="55811802" sha1="fcda0a78d518c42f6c18f17d4468f18351380e36" />
- </dataarea>
- </part>
- </software>
-
- <software name="botgardn">
- <description>Botanical Gardens</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-20 -->
- <!--"Botanical Gardens" is a 1986 educational game programmed by Robert Kimball, David J. Donoghue, and Patrick Kehoe, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234828">
- <rom name="botanical gardens.woz" size="234828" crc="1edefb2b" sha1="58f1b1e715d0ff9f7bb866dcb6af16832d8fa0c6" />
- </dataarea>
- </part>
- </software>
-
- <software name="mmath">
- <description>Muppet Math</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Muppet Math" is a 1991 educational program developed by Donna Stanger, Mary Anne Hermann, Chris Cerf, Barbara Wood Scott Clough, Eric Grubbs, Greg Johnson, Lon Koenig, and Tad Wood, and distributed by Sunburst Communications. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234884">
- <rom name="muppet math.woz" size="234884" crc="ca1d1e02" sha1="3d1e4870c7d8b0428f4c5249e8a5e0b670d77f62" />
- </dataarea>
- </part>
- </software>
-
- <software name="mslat10">
- <description>Muppet Slate v1.0</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Muppet Slate" is a 1988 productivity program designed by Donna Stanger, programmed by Tad Wood and Scott Clough, and distributed by Sunburst Communications. This is version 1.0. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk" />
- <dataarea name="flop" size="234848">
- <rom name="muppet slate v1.0 - disk 1 - teacher disk.woz" size="234848" crc="f014b4de" sha1="6a33813654a34c27face508ba10bf8fd03d8b44f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Master student disk" />
- <dataarea name="flop" size="234855">
- <rom name="muppet slate v1.0 - disk 2 - master student disk.woz" size="234855" crc="491b07bd" sha1="5cc20b04d5846139fbeed50189c77ef036745c75" />
- </dataarea>
- </part>
- </software>
-
- <software name="mslat101">
- <description>Muppet Slate (version 1.0.1)</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Muppet Slate" is a 1988 productivity program designed by Donna Stanger, programmed by Tad Wood and Scott Clough, and distributed by Sunburst Communications. This is version 1.0.1. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk" />
- <dataarea name="flop" size="234850">
- <rom name="muppet slate v1.0.1 - disk 1 - teacher disk.woz" size="234850" crc="649fc542" sha1="d6531dc70909efdfeb8243d296deb2868e0b359b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Master student disk" />
- <dataarea name="flop" size="234857">
- <rom name="muppet slate v1.0.1 - disk 2 - master student disk.woz" size="234857" crc="4c31631b" sha1="d953d4f3c8616d75bdfa6867ae5a8b9a9d481b5d" />
- </dataarea>
- </part>
- </software>
-
- <software name="nwawit">
- <description>Newbery Winners: A Wrinkle in Time</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Newbery Winners: A Wrinkle in Time" is a 1982 educational program developed and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234788">
- <rom name="newbery winners- a wrinkle in time.woz" size="234788" crc="2b02ea5d" sha1="d9a451f381ad47dfcd97a3a2f77689167af3b3d0" />
- </dataarea>
- </part>
- </software>
-
- <software name="nwsndr">
- <description>Newbery Winners: Sounder</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Newbery Winners: Sounder" is a 1982 educational program developed and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234778">
- <rom name="newbery winners- sounder.woz" size="234778" crc="61387c82" sha1="0f5a6b49fba711e1777e62564ff205b6cdb1c117" />
- </dataarea>
- </part>
- </software>
-
- <software name="nwbtt">
- <description>Newbery Winners: Bridge to Terabithia</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Newbery Winners: Bridge to Terabithia" is a 1982 educational program developed and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="newbery winners- bridge to terabithia.woz" size="234791" crc="de9bfb72" sha1="e41a7638650d3a839e0d1e02f093fcdd53d9b2d9" />
- </dataarea>
- </part>
- </software>
-
- <software name="humnpump">
- <description>The Human Pump</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"The Human Pump" is a 1986 educational program developed by Jim Kulzer, Donna Stanger, and Tad Martin Wood, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234819">
- <rom name="the human pump.woz" size="234819" crc="22ae15ca" sha1="a993c93c0cf0bc0a54825fb2a14c627b4b8c0795" />
- </dataarea>
- </part>
- </software>
-
- <software name="mptstg">
- <description>Muppets on Stage</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Muppets on Stage" is a 1987 educational game developed and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234770">
- <rom name="muppets on stage.woz" size="234770" crc="0273fc7c" sha1="f5ea49e8c616e756649e5dc9619abb5b15ba286a" />
- </dataarea>
- </part>
- </software>
-
- <software name="pickpart">
- <description>Pick the Part</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Pick the Part" is a 1983 educational game developed and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234767">
- <rom name="pick the part.woz" size="234767" crc="8be956f4" sha1="9971235515c6fd27990ba2411632d625121ce3b3" />
- </dataarea>
- </part>
- </software>
-
- <software name="memmachn">
- <description>The Memory Machine</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"The Memory Machine" is a 1989 educational game designed by Donna Stanger, programmed by David Owen, with graphic art by Barb Wood, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234817">
- <rom name="the memory machine.woz" size="234817" crc="605835b6" sha1="68420ba94b61c9013c36a748ab060ee6b25abae5" />
- </dataarea>
- </part>
- </software>
-
- <software name="pwstemp">
- <description>Playing with Science: Temperature</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Playing with Science: Temperature" is a 1988 educational game designed by Leslie Eiser and Dominique Allard, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234827">
- <rom name="playing with science- temperature.woz" size="234827" crc="c65b1457" sha1="e03a830b4aca0425f6e247aa1d90f754c15d29d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="puncpon">
- <description>Punctuation Put-On: Punctuation Processor</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Punctuation Put-On: Punctuation Processor" is a 1985 educational program by John D. Perron, programmed by Victoria Hanson, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Teacher disk" />
- <dataarea name="flop" size="234844">
- <rom name="punctuation put-on - disk 1 - teacher disk.woz" size="234844" crc="8eeb0c5a" sha1="4a7aec974400d16ee91f42593dc31f3e2e5b14b2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Student disk" />
- <dataarea name="flop" size="234844">
- <rom name="punctuation put-on - disk 2 - student disk.woz" size="234844" crc="70563734" sha1="66b1215f797aa75f9c8e96b35b01bc201b9d19f6" />
- </dataarea>
- </part>
- </software>
-
- <software name="sspsai">
- <description>Safari Search: Problem Solving and Inference</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Safari Search: Problem Solving and Inference" is a 1985 educational game designed by Thomas C. O'Brien, with graphics and programming by Jim Thomas, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234845">
- <rom name="safari search- problem solving and inference.woz" size="234845" crc="c5ecc2ca" sha1="5b66690ce52cea46d1c8b8e3d88fc0dd6ee86b90" />
- </dataarea>
- </part>
- </software>
-
- <software name="simonsays">
- <description>Simon Says</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Simon Says" is a 1989 educational game designed by Donna Stanger, programmed by Jim McDonagh, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234801">
- <rom name="simon says.woz" size="234801" crc="cf2a10ca" sha1="3790e710b5a9497b12f98d9908aaf0c3959b45de" />
- </dataarea>
- </part>
- </software>
-
- <software name="regroup89">
- <description>Regrouping</description>
- <year>1989</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Regrouping" is a 1989 educational game designed by Donna Stanger, programmed by David Pearson and Andrew Lorenz, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234816">
- <rom name="regrouping.woz" size="234816" crc="f8bcd559" sha1="c11f6802a33366488ec2d26238c4c40132b7ed5a" />
- </dataarea>
- </part>
- </software>
-
- <software name="spcwrace">
- <description>Space Waste Race: Storybooks of the Future</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Space Waste Race: Storybooks of the Future" is a 1984 educational program designed by John D. Perron, programmed by Andrew Armstrong, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234846">
- <rom name="space waste race- storybooks of the future.woz" size="234846" crc="c4956fa2" sha1="f4f35ce23a0639b98e73d62dc44f34b6dce01780" />
- </dataarea>
- </part>
- </software>
-
- <software name="seaiv2">
- <description>Solving Equations and Inequalities (version 2)</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Solving Equations and Inequalities" is a 1983 educational program developed by Charles Lund and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234823">
- <rom name="solving equations and inequalities.woz" size="234823" crc="a5b589a2" sha1="b2b318c75fa8321b0da93c3169e63a510b6fe506" />
- </dataarea>
- </part>
- </software>
-
- <software name="tenclues">
- <description>Ten Clues</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Ten Clues" is a 1986 educational game designed by Donna Stanger, programmed by Tad Wood, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234796">
- <rom name="ten clues.woz" size="234796" crc="8b32d377" sha1="a370910a23961dd66844ac3e7b1bb48f3bf9b3fd" />
- </dataarea>
- </part>
- </software>
-
- <software name="tchances">
- <description>Taking Chances</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Taking Chances" is a 1991 educational game designed by Gail Marshall, programmed by David Findley, with graphics by Steve Bunton, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234819">
- <rom name="taking chances.woz" size="234819" crc="7dec429e" sha1="8af69831c269caed6133bcf2fa6d3a6f533d87d7" />
- </dataarea>
- </part>
- </software>
-
- <software name="tradpost">
- <description>Trading Post</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"Trading Post" is a 1985 educational game developed by Janet Brawner and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234790">
- <rom name="trading post.woz" size="234790" crc="37adfc35" sha1="0e3f0fe0520741ae4ac6d3a41bed9de8659db8c7" />
- </dataarea>
- </part>
- </software>
-
- <software name="semacalc">
- <description>The Semantic Calculator</description>
- <year>1983</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"The Semantic Calculator" is a 1983 educational program developed and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234777">
- <rom name="the semantic calculator.woz" size="234777" crc="7ae38ce6" sha1="bc59969b3bf3cf4b256549baffb984b14407bce1" />
- </dataarea>
- </part>
- </software>
-
- <software name="thepond">
- <description>The Pond</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-25 -->
- <!--"The Pond" is a 1984 educational game developed by Marge Kosel and Mike Fish, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234794">
- <rom name="the pond.woz" size="234794" crc="2d73628e" sha1="6eb3f3172d7676424d9ec5b585890bb5a4a9f6b9" />
- </dataarea>
- </part>
- </software>
-
<software name="foosball">
<description>Computer Foosball</description>
<year>1981</year>
<publisher>Sirius Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later models." />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced //e. Due to copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P,A2E" />
<!-- Dump released: 2022-05-26 -->
- <!--"Computer Foosball" is a 1981 sports game developed by Keithen Hayenga and distributed by Sirius Software. It requires a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later models.-->
+ <!-- "Computer Foosball" is a 1981 sports game developed by Keithen Hayenga and distributed by Sirius Software. It requires a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later models. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234713">
@@ -19950,134 +8240,6 @@ license:CC0-1.0
</part>
</software>
- <software name="123seqme">
- <description>1-2-3 Sequence Me</description>
- <year>1991</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"1-2-3 Sequence Me" is a 1991 educational game developed by the Infotech Manitoba Educational Technology Program and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234830">
- <rom name="1-2-3 sequence me.woz" size="234830" crc="ff77d4fa" sha1="138190d4510bfa06f0d622e08183f731c216438f" />
- </dataarea>
- </part>
- </software>
-
- <software name="bignlitl">
- <description>BIG and little: Books, Posters, and Cards for Muppet Slate</description>
- <year>1990</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"BIG and little: Books, Posters and Cards for Muppet Slate" is a 1990 graphics program designed by Donna Stanger, programmed by Tad Wood, and distributed by Sunburst Communications. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234857">
- <rom name="big and little.woz" size="234857" crc="8f793182" sha1="d2081eed06d87a7587a44500286ebfe3d0631d91" />
- </dataarea>
- </part>
- </software>
-
- <software name="chalmath">
- <description>Challenge Math</description>
- <year>1982</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Challenge Math" is a 1982 educational program developed by C. McMahon and J. Sweedler, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234813">
- <rom name="challenge math.woz" size="234813" crc="18ec6871" sha1="15b4fe2e391ad74d6f143cdd03c4eb8c3b7a15ae" />
- </dataarea>
- </part>
- </software>
-
- <software name="discover">
- <description>Discover: A Science Experiment</description>
- <year>1985</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Discover: A Science Experiment" is a 1985 educational program by Ed Herstein and Andry Christian, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241485">
- <rom name="discover- a science experiment.woz" size="241485" crc="790df2ad" sha1="f69e58d9530884b1ef07e1deae48ff79b89acc56" />
- </dataarea>
- </part>
- </software>
-
- <software name="expsctmp">
- <description>Exploring Science: Temperature</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Exploring Science: Temperature" is a 1988 educational program developed by Leslie Eiser and Dominique Allard, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241480">
- <rom name="exploring science- temperature.woz" size="241480" crc="662e8445" sha1="315bc00ae0266f91d73f34a0c7aab6155a9d3878" />
- </dataarea>
- </part>
- </software>
-
- <software name="hwirelgc">
- <description>High Wire Logic</description>
- <year>1990</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"High Wire Logic" is a 1990 educational program designed by Donna Stanger, programmed by Scott Clough, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234806">
- <rom name="high wire logic.woz" size="234806" crc="eb1b630b" sha1="bfef94db777d96e970d3dce8bfd37daf14b5bcd9" />
- </dataarea>
- </part>
- </software>
-
- <software name="hop2it">
- <description>Hop To It!</description>
- <year>1990</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Hop To It!" is a 1990 educational program developed by Ed Annunziata and Stephen Birkelbach, and distributed by Sunburst Communications. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234838">
- <rom name="hop to it.woz" size="234838" crc="140ea2d3" sha1="e4b9e96856323dfee670c78e5b2a4b354496d2dd" />
- </dataarea>
- </part>
- </software>
-
- <software name="igdisatr">
- <description>Iggy's Gnees: Discrimination, Attributes and Rules</description>
- <year>1984</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-05-27 -->
- <!--"Iggy's Gnees: Discrimination, Attributes and Rules" is a 1984 educational program designed by Donna Stanger, programmed by Jim McDonagh, and distributed by Sunburst Communications. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234847">
- <rom name="iggy's gnees.woz" size="234847" crc="85027476" sha1="f67ef9e3430ca8287d95a9f0512dd3e4bb730d90" />
- </dataarea>
- </part>
- </software>
-
<software name="lauren25">
<description>Lauren of the 25th Century</description>
<year>1985</year>
@@ -20085,7 +8247,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-07-22 -->
- <!--"Lauren of the 25th Century" is a 1985 educational game developed by Lucy Werth Ewell and Elizabeth R. Stott, Ph.D. of Rhiannon Software, and distributed by Addison-Wesley. It requires a 48K Apple ][+ or later.-->
+ <!-- "Lauren of the 25th Century" is a 1985 educational game developed by Lucy Werth Ewell and Elizabeth R. Stott, Ph.D. of Rhiannon Software, and distributed by Addison-Wesley. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234835">
@@ -20094,836 +8256,6 @@ license:CC0-1.0
</part>
</software>
- <software name="microz1">
- <description>Microzine 1</description>
- <year>1983</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or unenhanced //e. Due to issues unrelated to the copy protection, it does not run on later machines." />
- <sharedfeat name="compatibility" value="A2P,A2E" />
- <!-- Dump released: 2022-08-02 -->
- <!--"Microzine No. 1" is a 1983 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), David G. Olmon (lead programmer), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Ame C. Flynn (graphic design), Michael Callery (graphic design), Lorene Lavora (illustration), Steve Sullivan (illustration), Deborah Kovacs (creative director), Stephen Gass (project manager), Jeffrey Siegel (editor), Bob Neumann (contributing editor), Megan Stine (contributing editor), H. William Stine (contributing editor). It requires a 48K Apple ][+ or unenhanced //e. Due to issues unrelated to the copy protection, it does not run on later machines.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235330">
- <rom name="microzine no. 1 (1983)(scholastic) - side 1- twistaplot, what's next.woz" size="235330" crc="dae1c1d3" sha1="cd2a57adf261788ad6ab07fc45fae9feca084072" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235351">
- <rom name="microzine no. 1 (1983)(scholastic) - side 2- ask me, poster, secret files, computer stuff.woz" size="235351" crc="e445cd5f" sha1="0f1b490deb174f1aec38e8ad4fc99956aa638a04" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz2">
- <description>Microzine 2</description>
- <year>1983</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-02 -->
- <!--"Microzine No. 2" is a 1983 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), David G. Olmon (lead programmer), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Dave Updegraff (programmer), Ame C. Flynn (graphic design), Michael Callery (graphic design), Lorene Lavora (illustration), Steve Sullivan (illustration), Deborah Kovacs (creative director), Stephen Gass (project manager), Jeffrey Siegel (editor), Bob Neumann (contributing editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235338">
- <rom name="microzine no. 2 (1983)(scholastic) - side 1- what's inside, northwoods adventure, melody maker, computer stuff.woz" size="235338" crc="ee720a80" sha1="e8317617b40f258d85be445f64ca5b77c706b87a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235312">
- <rom name="microzine no. 2 (1983)(scholastic) - side 2- ride the wind, word ladder, what's next.woz" size="235312" crc="05ba43ce" sha1="365b865a9dce82819bd1806095c6fb3c14cc16f4" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz3">
- <description>Microzine 3</description>
- <year>1983</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-02 -->
- <!--"Microzine No. 3" is a 1983 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), David G. Olmon (lead programmer), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Dave Updegraff (programmer), Will Kefauver (art director), Lauretta Jones (illustrator), M. Brooks Jones (illustrator), Lorene Lavora (illustrator), Deborah Kovacs (creative director), Stephen Gass (project manager), Jeffrey Siegel (editor), Amy McKinley (associate editor), Andy Ragan (associate editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="242008">
- <rom name="microzine no. 3 (1983)(scholastic) - side 1- what's inside, mystery at pinecrest manor, computer stuff.woz" size="242008" crc="3fef2d3b" sha1="a6540cd2dc5830b8ee49a5a930124d173081707d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="222012">
- <rom name="microzine no. 3 (1983)(scholastic) - side 2- tag, bookstore, amazing robot.woz" size="222012" crc="bdf8ae04" sha1="e891c8b88fc22c6d09634d0bef386e6895390e3f" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz4">
- <description>Microzine 4</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-03 -->
- <!--"Microzine No. 4" is a 1984 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), David G. Olmon (lead programmer), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Dave Updegraff (programmer), Will Kefauver (art director), Lauretta Jones (illustrator), M. Brooks Jones (illustrator), Lorene Lavora (illustrator), Deborah Kovacs (creative director), Stephen Gass (project manager), Jeffrey Siegel (editor), Amy McKinley (associate editor), Andy Ragan (associate editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="242009">
- <rom name="microzine no. 4 (1984)(scholastic) - side 1- what's inside, adventures in the microzine, computer stuff.woz" size="242009" crc="35661262" sha1="252d4bf67f3fdd2f2cd0cd7efec4a9dda06930b2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="241978">
- <rom name="microzine no. 4 (1984)(scholastic) - side 2- log-it , traps, what's next.woz" size="241978" crc="c1dbfd01" sha1="f6b7853ea838d4d278e51f23521dbe60d0c53055" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz5">
- <description>Microzine 5</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-03 -->
- <!--"Microzine No. 5" is a 1984 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), David G. Olmon (lead programmer), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Dave Updegraff (programmer), Sandi Young (art director and graphic designer), Will Kefauver (design consultant), Lauretta Jones (illustrator), Lorene Lavora (illustrator), Deborah Kovacs (creative director), Stephen Gass (project manager), Jeffrey Siegel (editor), Amy McKinley (associate editor), Andy Ragan (associate editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="242013">
- <rom name="microzine no. 5 (1984)(scholastic) - side 1- what's inside, pirates of the soft seas.woz" size="242013" crc="96d5b90c" sha1="874ec0ec9d678fa17b564124b5676bc7bb3366e7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="468345">
- <rom name="microzine no. 5 (1984)(scholastic) - side 2- story teller, amazing robot ii, fences, computer stuff, what's next.woz" size="468345" crc="72c3234c" sha1="9d6f0e63e23f04711f7d9b4a29d8360cdc7012b4" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz6">
- <description>Microzine 6</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-03 -->
- <!--"Microzine No. 6" is a 1984 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), David G. Olmon (lead programmer), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Dave Updegraff (programmer), Sandi Young (art director and graphic designer), Will Kefauver (design consultant and illustrator), Lauretta Jones (illustrator), Deborah Kovacs (creative director), Stephen Gass (project manager), Jeffrey Siegel (editor), Amy McKinley (associate editor), Andy Ragan (associate editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="242007">
- <rom name="microzine no. 6 (1984)(scholastic) - side 1- what's inside, fossils alive, computer stuff.woz" size="242007" crc="72a35e01" sha1="2f58292998be8aa652f2bbfbe9e4d9853628196f" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235355">
- <rom name="microzine no. 6 (1984)(scholastic) - side 2- olympic news, free store, sound off , what's next.woz" size="235355" crc="868b3b99" sha1="eb0cd6df242d8c9bf15fb8169ac9612d240996ff" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz7">
- <description>Microzine 7</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-03 -->
- <!--"Microzine No. 7" is a 1984 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Kevin Dybdal (programmer), Gary Johnson (programmer), Dave Olmon (programmer), Dave Updegraff (programmer), Neal Yaughn (programmer), Sandi Young (art director, graphic designer, illustrator), Steve Sullivan (illustrator), Maryl Skinner (illustrator), Deborah Kovacs (creative director), Maryellen Kohn (project manager), Jeffrey Siegel (senior editor), Amy McKinley (editor), Andy Ragan (contributing editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235380">
- <rom name="microzine no. 7 (1984)(scholastic) - side 1- what's inside, brain drain, computer stuff.woz" size="235380" crc="de2e773e" sha1="5bffba51323383412a502525790d99b29216cd05" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235387">
- <rom name="microzine no. 7 (1984)(scholastic) - side 2- survey taker, city blocks, back page, what's next.woz" size="235387" crc="af5af6f6" sha1="a348bde53b27a180fde07a057a896625a7144891" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz8">
- <description>Microzine 8</description>
- <year>1984</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 8" is a 1984 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Kevin Dybdal (programmer), Dave Olmon (programmer), Richard Rathe (programmer), Dave Updegraff (programmer), Neal Yaughn (programmer), Sandi Young (illustrator), Steve Sullivan (illustrator), David A. Bowman (illustrator and contributing editor), Deborah Kovacs (creative director), Maryellen Kohn (project manager), Jeffrey Siegel (senior editor), Amy McKinley (editor), Andy Ragan (contributing editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235414">
- <rom name="microzine no. 8 (1984)(scholastic) - side 1- letter from the editor, zazoo come home, computer stuff.woz" size="235414" crc="3f630756" sha1="566ddf1848c4795d38aba9a6bb83b5121da5cd85" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235412">
- <rom name="microzine no. 8 (1984)(scholastic) - side 2- secret journal, drawing board, back page, what's next.woz" size="235412" crc="18dfb87e" sha1="cb0280bb4cedd4908efcb5d7010918382dd93a3d" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz9">
- <description>Microzine 9</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 9" is a 1985 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Kevin Dybdal (programmer), Dave Olmon (programmer), Richard Rathe (programmer), Dave Updegraff (programmer), Neal Yaughn (programmer), Bayard Colyear (illustrator), Lauretta Jones (illustrator), Malcom Kirton (illustrator), Sandi Young (illustrator), Deborah Kovacs (creative director), Maryellen Kohn (project manager), Jeffrey Siegel (senior editor), Amy McKinley (editor), Andy Ragan (contributing editor), David A. Bowman (contributing editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235451">
- <rom name="microzine no. 9 (1985)(scholastic) - side 1- letter from the editor, the big nap, computer stuff.woz" size="235451" crc="1e257b42" sha1="4383290783a341d8bb20c2754c8378476e115098" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235446">
- <rom name="microzine no. 9 (1985)(scholastic) - side 2- budget maker, quizzler, back page, what's next.woz" size="235446" crc="365a0c86" sha1="ce7ddce720301566aea86d07c085cc4f34096b97" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz10">
- <description>Microzine 10</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 10" is a 1985 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Kevin Dybdal (programmer), Dave Olmon (programmer), Dave Updegraff (programmer), Neal Yaughn (programmer), Bayard Colyear (illustrator), Malcom Kirton (illustrator), Sandi Young (illustrator), Deborah Kovacs (creative director), Maryellen Kohn (project manager), Jeffrey Siegel (senior editor), Amy McKinley (editor), David A. Bowman (contributing editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235383">
- <rom name="microzine no. 10 (1985)(scholastic) - side 1- letter from the editor, the shot heard 'round the world, computer stuff.woz" size="235383" crc="64061df0" sha1="a9ed98926b7a3b66b657a8bcedfa6cbd942b5e53" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235354">
- <rom name="microzine no. 10 (1985)(scholastic) - side 2- sailing, billboard, back page, what's next.woz" size="235354" crc="2f51d985" sha1="2fee6c6bffb8d2bf5afe91b6d5968e890dd7e2f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz11">
- <description>Microzine 11</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 11" is a 1985 set of educational games and programs distributed by Scholastic. Credits: Dan Klassen (producer and editor), Tom Hansen (software designer), Karen Klassen (software designer), Don Wagner (software designer), Al Borchers (programmer), Gary Johnson (programmer), Kevin Dybdal (programmer), Dave Olmon (programmer), Dave Updegraff (programmer), Neal Yaughn (programmer), Bayard Colyear (illustrator), Malcom Kirton (illustrator), Sandi Young (illustrator), Deborah Kovacs (creative director), Jeffrey Siegel (senior editor), Amy McKinley (senior editor), David A. Bowman (contributing editor). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235340">
- <rom name="microzine no. 11 (1985)(scholastic) - side 1- letter from the editor, the dark tower, computer stuff.woz" size="235340" crc="2d5799b4" sha1="3b197714b107138ec681eb9803b4cff044610d6d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235339">
- <rom name="microzine no. 11 (1985)(scholastic) - side 2- secret coder, sticker factory, back page, what's next.woz" size="235339" crc="6090c01e" sha1="ba8083ac1ae9e77f2d92c58f8bf0554cc665a2dd" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz12">
- <description>Microzine 12</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 12" is a 1985 set of educational games and programs developed by Information Technology Design Associates and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234878">
- <rom name="microzine no. 12 (1985)(scholastic) - side 1- letter from the editor, wagons west, computer stuff.woz" size="234878" crc="abb0f2df" sha1="ffae6d7ea55499283d331488a30f7a85b22703b1" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234884">
- <rom name="microzine no. 12 (1985)(scholastic) - side 2- newspaper maker, t-shirt puzzles, micro-toon, what's next.woz" size="234884" crc="3fd01f78" sha1="95936de42e1718c45fa661ed233ec8d6101f4048" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz13">
- <description>Microzine 13</description>
- <year>1985</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 13" is a 1985 set of educational games and programs developed by Information Technology Design Associates and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234890">
- <rom name="microzine no. 13 (1985)(scholastic) - side 1- letter from the editor, the frog and the fables, computer stuff.woz" size="234890" crc="57749cde" sha1="1751dea829f35f04a6fa5eb37694120af724052e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234890">
- <rom name="microzine no. 13 (1985)(scholastic) - side 2- the secret of the sphinx, who's who in outer space, what's next.woz" size="234890" crc="b9d4b929" sha1="76828d26a8674c478968ff953834db87a73bd687" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz14">
- <description>Microzine 14</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 14" is a 1986 set of educational games and programs developed by Methods and Solutions, and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234864">
- <rom name="microzine no. 14 (1986)(scholastic) - side 1- letter from the editor, the funhouse caper, computer stuff.woz" size="234864" crc="94aa4f1a" sha1="bf35a3f0e612528392e89db53973da83942a2be6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="241521">
- <rom name="microzine no. 14 (1986)(scholastic) - side 2- cartoon maker, inventors and inventions, puzzler, what's next.woz" size="241521" crc="4c089cc2" sha1="1feefae30b7d4cd7ede9538bc68219ed2b0e8c6d" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz15">
- <description>Microzine 15</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 15" is a 1986 set of educational games and programs developed by Information Technology Design Associates and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234895">
- <rom name="microzine no. 15 (1986)(scholastic) - side 1- letter from the editor, 2088- an oval office odyssey, computer stuff.woz" size="234895" crc="20f0044c" sha1="07069bf1c0c90acc7b8ddd551f55c0b1d8c7ad71" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234871">
- <rom name="microzine no. 15 (1986)(scholastic) - side 2- keyboarding, roundup, estimator, what's next.woz" size="234871" crc="3c7b0194" sha1="717fd25f03d2366511ebf69026eb202c085ae948" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz16">
- <description>Microzine 16</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-04 -->
- <!--"Microzine No. 16" is a 1986 set of educational games and programs developed by Methods and Solutions, and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234864">
- <rom name="microzine no. 16 (1986)(scholastic) - side 1- letter from the editor, tickets to america, computer stuff.woz" size="234864" crc="a439c666" sha1="56e8178a44fc836349559846a80f7d00ab2eb0c9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234885">
- <rom name="microzine no. 16 (1986)(scholastic) - side 2- shifty shapes, solar pilot, atgtfp, what's next.woz" size="234885" crc="75001eec" sha1="e3048a82f5585e8b572b480dbde8534c5695b36a" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz17">
- <description>Microzine 17</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-06 -->
- <!--"Microzine No. 17" is a 1986 set of educational games and programs developed by Methods and Solutions, and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234874">
- <rom name="microzine no. 17 (1986)(scholastic) - side 1- letter from the editor, microagent of the body guard, computer stuff.woz" size="234874" crc="d3b3bd85" sha1="b3994d8fbf75bd3cd4303a9bcbcf53f00ef86b77" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234871">
- <rom name="microzine no. 17 (1986)(scholastic) - side 2- mission- mix-up, marvelous menagerie, basic training, what's next.woz" size="234871" crc="4a3b4d61" sha1="1db34fc55cc603385a19f67dd6699c03aecad1e8" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz18">
- <description>Microzine 18</description>
- <year>1986</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-06 -->
- <!--"Microzine No. 18" is a 1986 set of educational games and programs developed by Information Technology Design Associates and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234866">
- <rom name="microzine no. 18 (1986)(scholastic) - side 1- letter from the editor, history mystery.woz" size="234866" crc="01d248ff" sha1="682ff202097b0ce76d7b8b0454a6622c2eeddbe7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234837">
- <rom name="microzine no. 18 (1986)(scholastic) - side 2- computer stuff, scholasticalc, letter writer, rose and calumny.woz" size="234837" crc="bc2ce0ff" sha1="03e0c46f0ee91e62a672e4aa412e141d60e884ed" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz19">
- <description>Microzine 19</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-06 -->
- <!--"Microzine No. 19" is a 1987 set of educational games and programs developed by Information Technology Design Associates and distributed by Scholastic. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="234871">
- <rom name="microzine no. 19 (1987)(scholastic) - side 1- letter from the editor, malice in wonderland.woz" size="234871" crc="ca880ee9" sha1="5e853779a9c8a11ff8bcf99fd59576c453914881" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="234891">
- <rom name="microzine no. 19 (1987)(scholastic) - side 2- computer stuff, animation lab, calendar, estimator, what's next.woz" size="234891" crc="a98b369d" sha1="b1a1d5a08972ba7bd6657b41edc0dc508c8344d1" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz20">
- <description>Microzine 20</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-06 -->
- <!--"Microzine No. 20" is a 1987 set of educational games and programs distributed by Scholastic. Credits: Christopher McQuilkin (programming manager), Alissa Nordlicht (programmer), Linda Gottfried (art director), Sandi Young (contributing art director), Malcolm Kirton (assistant art director). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235030">
- <rom name="microzine no. 20 (1987)(scholastic) - side 1- letters, voyage to see what's on the bottom, computer stuff.woz" size="235030" crc="a279550e" sha1="66afc468057df6292afb5a9fe45a8baab02ee766" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235018">
- <rom name="microzine no. 20 (1987)(scholastic) - side 2- interactions, heros and villains, monitor mystery.woz" size="235018" crc="7f7002ce" sha1="7d2a5cba7d0142ee919fa04b3a6f407db73c5e8e" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz21">
- <description>Microzine 21</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-10 -->
- <!--"Microzine No. 21" is a 1987 set of educational games and programs distributed by Scholastic. Credits: Christopher McQuilkin (programming manager), Alissa Nordlicht (programmer), Amy E. McKinley (senior product editor), David A. Bowman (contributing editor), Elisabeth Gitelle (contributing editor), Mark I. Malamud (contributing editor), Linda Gottfried (art director), Malcolm Kirton (assistant art director). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235115">
- <rom name="microzine no. 21 (1987)(scholastic) - side 1- robot rescue, computer stuff.woz" size="235115" crc="3d2129c8" sha1="7dc06a2c396f2182364dd9ac46d3b251e863989e" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235137">
- <rom name="microzine no. 21 (1987)(scholastic) - side 2- fabulous kids, fill in the blanks, monitor mystery.woz" size="235137" crc="25f92a0e" sha1="6867de1fc18a1a16ee42dfe63b4247ca369af3a0" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz22">
- <description>Microzine 22</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-10 -->
- <!--"Microzine No. 22" is a 1987 set of educational games and programs distributed by Scholastic. Credits: Christopher McQuilkin (programming manager), Alissa Nordlicht (programmer), Amy E. McKinley (senior product editor), Lisa Mandel (associate editor), Rose Trivisonno (contributing editor), Linda Gottfried (art director), Malcolm Kirton (assistant art director). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235085">
- <rom name="microzine no. 22 (1987)(scholastic) - side 1- letters, the haunted channels, computer stuff.woz" size="235085" crc="d57e5404" sha1="f9c90043fc1d59810b3bae44709a50c10f9ed9f2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235066">
- <rom name="microzine no. 22 (1987)(scholastic) - side 2- math mall, monitor mystery.woz" size="235066" crc="6c3e8bb9" sha1="4c52d74450156a6a61332721ad9d34925e8f06e3" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="235041">
- <rom name="microzine no. 22 (1987)(scholastic) - side 3- newsprint.woz" size="235041" crc="80a2107a" sha1="7a5b192259e6faed08f0fb61c12264e6918806a7" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz23">
- <description>Microzine 23</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-11 -->
- <!--"Microzine No. 23" is a 1987 set of educational games and programs distributed by Scholastic. Credits: Christopher McQuilkin (programming manager), Alissa Nordlicht (programmer), Cary Hammer (contributing programmer), Mark Nichols (contributing programmer), Dan Kinch (contributing programmer), Amy E. McKinley (senior product editor), Lisa Mandel (associate editor), Rose Trivisonno (contributing editor), Linda Gottfried (art director), Malcolm Kirton (assistant art director). It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235199">
- <rom name="microzine no. 23 (1987)(scholastic) - side 1- letters, escape from antcatraz, computer stuff.woz" size="235199" crc="067889b0" sha1="73749910a2bee7576b5b477fa949f575caa29383" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="241835">
- <rom name="microzine no. 23 (1987)(scholastic) - side 2- math mall, monitor mystery.woz" size="241835" crc="ab6d85b0" sha1="9d4c08ce7a2123cd86a15f8d9f43aa56f31ab824" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="235163">
- <rom name="microzine no. 23 (1987)(scholastic) - side 3- greetings .woz" size="235163" crc="213d9cbe" sha1="7e7e2a793826acdce1f8c01a7119f909d1e3ba0a" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz24">
- <description>Microzine 24</description>
- <year>1987</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-12 -->
- <!--"Microzine No. 24" is a 1987 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Andrew Kaplan (programmer), Mark Nichols (programmer), Alissa Nordlicht (programmer), Stuart Blavatnik (programmer), Jim Markowich (programmer), Christopher McQuilkin (programmer), Aaron Weaver (contributing programmer), Amy E. McKinley (senior product editor), Lisa Mandel (associate editor), Rose Trivisonno (contributing editor), Linda Gottfried (art director), Edwin Torres (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235259">
- <rom name="microzine no. 24 (1987)(scholastic) - side 1- captains of the china trade, computer stuff.woz" size="235259" crc="017a1085" sha1="6d3f9671d0f87b4d270106903e373eefc1985045" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235261">
- <rom name="microzine no. 24 (1987)(scholastic) - side 2- dr. maxwell's molecule magic, monitor mystery.woz" size="235261" crc="b869df7c" sha1="688ef51095643663134b7717ad7ee5514e2571ce" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="235139">
- <rom name="microzine no. 24 (1987)(scholastic) - side 3- banner maker.woz" size="235139" crc="b4343854" sha1="476c670d04ed8ebc3276bab9113e89eef437c4b8" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz25">
- <description>Microzine 25</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-13 -->
- <!--"Microzine No. 25" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Mark Nichols (programmer), Alissa Nordlicht (programmer), Stuart Blavatnik (contributing programmer), JoAnn Comito (contributing programmer), Amy E. McKinley (senior product editor), Lisa Mandel (associate editor), Rose Trivisonno (contributing editor), Linda Gottfried (art director), Edwin Torres (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side 1" />
- <dataarea name="flop" size="235244">
- <rom name="microzine no. 25 (1988)(scholastic) - side 1- letters, cosmic heroes, computer stuff.woz" size="235244" crc="dfd13096" sha1="ee3684ed93820c953bd8775789502ba85a3f2ca6" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side 2" />
- <dataarea name="flop" size="235240">
- <rom name="microzine no. 25 (1988)(scholastic) - side 2- the learning machine, picture this.woz" size="235240" crc="f56a22c7" sha1="c4438ba971418f38dcc261ffd8bfdd3e2c619fbd" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side 3" />
- <dataarea name="flop" size="235205">
- <rom name="microzine no. 25 (1988)(scholastic) - side 3- blueprint maker.woz" size="235205" crc="5aae950f" sha1="ce23de1831e3b51413c4c9435b6b293379bc1aa1" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz26">
- <description>Microzine 26</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-13 -->
- <!--"Microzine No. 26" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Mark Nichols (programmer), Alissa Nordlicht (programmer), Stuart Blavatnik (contributing programmer), Amy E. McKinley (senior product editor), Lisa Mandel (associate editor), Rose Trivisonno (contributing editor), Linda Gottfried (art director), Tara Framer (assistant art director), Edwin Torres (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235256">
- <rom name="microzine no. 26 (1988)(scholastic) - disk 1, side 1- the wizard of darkling wood, letters, computer stuff.woz" size="235256" crc="da8fe27b" sha1="60cef73d719c2ef80bbbbf599e96e770f82fc136" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235256">
- <rom name="microzine no. 26 (1988)(scholastic) - disk 1, side 2- the wizard of darkling wood, letters, computer stuff.woz" size="235256" crc="19702123" sha1="0ab3523faf50a5c67521925074c4a4a6965a2cb9" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="235212">
- <rom name="microzine no. 26 (1988)(scholastic) - disk 2- congratulations .woz" size="235212" crc="baec01d6" sha1="b117b4e832df8a1620bb70fcff4b860e794d8eb3" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz27">
- <description>Microzine 27</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-13 -->
- <!--"Microzine No. 27" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Rose Trivisonno (contributing editor), Nancy Waks (contributing editor), Tara Framer (art director), Edwin Torres (art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235211">
- <rom name="microzine no. 27 (1988)(scholastic) - disk 1, side 1- microzine guide, monitor mystery.woz" size="235211" crc="5a19894c" sha1="ebbb65ed2dcc8de7d04aeac3d16a43b22431280a" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235190">
- <rom name="microzine no. 27 (1988)(scholastic) - disk 1, side 2- rebus maker.woz" size="235190" crc="7c9fc160" sha1="6f74da37246b8b7068c1d5de26c116c8d562526f" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235200">
- <rom name="microzine no. 27 (1988)(scholastic) - disk 2, side 1- constellation odyssey.woz" size="235200" crc="684aa097" sha1="4297b8c60c06ac99967d73b2cced5a8c7d482f26" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235199">
- <rom name="microzine no. 27 (1988)(scholastic) - disk 2, side 2- the learning machine.woz" size="235199" crc="4161e076" sha1="a2998dde8f9004acf7ea265500a4e481361e3171" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz28">
- <description>Microzine 28</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-13 -->
- <!--"Microzine No. 28" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lainee Cohen (contributing editor), Claire Curtin (contributing editor), Rose Trivisonno (contributing editor), Nancy Waks (contributing editor), Tara Framer (art director), Edwin Torres (art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235282">
- <rom name="microzine no. 28 (1988)(scholastic) - disk 1, side 1- microzine guide, african animals.woz" size="235282" crc="5d06c353" sha1="bb922b1fc2df04b6a1e39f4873a7cb0d131a0898" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="234754">
- <rom name="microzine no. 28 (1988)(scholastic) - disk 1, side 2- stationery maker.woz" size="234754" crc="a1f201d1" sha1="805ec37f4e821d47a80f5d69e7eadea27e04a05c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235268">
- <rom name="microzine no. 28 (1988)(scholastic) - disk 2, side 1- quest for the pole.woz" size="235268" crc="7c476e38" sha1="ddb963228a421beff88a07b3afbf76d782a68463" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235259">
- <rom name="microzine no. 28 (1988)(scholastic) - disk 2, side 2- sound lab.woz" size="235259" crc="3b452a94" sha1="8d36afd45a344931a1922692c62ac92846c8a8f1" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz29">
- <description>Microzine 29</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-13 -->
- <!--"Microzine No. 29" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Julia Watkins (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lainee Cohen (contributing editor), Rose Trivisonno (contributing editor), Nancy Waks (contributing editor), Tara Framer (art director), Jenny Grant (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235281">
- <rom name="microzine no. 29 (1988)(scholastic) - disk 1, side 1- microzine guide, desert dilemma.woz" size="235281" crc="a7a8ce67" sha1="c5f75d739fa8aeeda55719c9e4c1257a2f9620d7" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235263">
- <rom name="microzine no. 29 (1988)(scholastic) - disk 1, side 2- screen artist.woz" size="235263" crc="1aee21dc" sha1="e6e503e83e2c5b2015b79e55841d4e8c25baf670" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235270">
- <rom name="microzine no. 29 (1988)(scholastic) - disk 2, side 1- the myths of olympus.woz" size="235270" crc="7ed1e4de" sha1="de3cdafbb3d15f58586ac948a706493aa2273e06" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235265">
- <rom name="microzine no. 29 (1988)(scholastic) - disk 2, side 2- light on target.woz" size="235265" crc="a76fdf53" sha1="bc76c2adcdb50eaa38fa1532da231765dc55667b" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz30">
- <description>Microzine 30</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-08-13 -->
- <!--"Microzine No. 30" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Alan R. Schwartz (programmer), Julia Watkins (programmer), Donald Way (programmer), Chris McQuilkin (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lainee Cohen (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director), Jenny Grant (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235245">
- <rom name="microzine no. 30 (1989)(scholastic) - disk 1, side 1- microzine guide, double vision.woz" size="235245" crc="bc750c20" sha1="7ab182c6e33f51812af7b98200d7ad32e9a54cf9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235227">
- <rom name="microzine no. 30 (1989)(scholastic) - disk 1, side 2- poster maker.woz" size="235227" crc="c000d5e8" sha1="656e6daf79464fbab043edc026450346cce73da3" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235236">
- <rom name="microzine no. 30 (1989)(scholastic) - disk 2, side 1- toward the north star.woz" size="235236" crc="4c9c6557" sha1="9f0563e64be5e685825fb165803c2bece7ac10b0" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235227">
- <rom name="microzine no. 30 (1989)(scholastic) - disk 2, side 2- contraptions.woz" size="235227" crc="1395c9bb" sha1="067ac290dd6f1df39352407c314a4f5726a45fa3" />
- </dataarea>
- </part>
- </software>
-
- <software name="autoduel">
- <description>Autoduel</description>
- <year>1985</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-02 -->
- <!--"Autoduel" is a 1985 action game developed by Richard Garriott and Chuck Bueche, and distributed by Origin Systems. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234788">
- <rom name="autoduel side a.woz" size="234788" crc="30bab310" sha1="2ba24828af2fa5cba208df14d44560e0cc4dd054" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234788">
- <rom name="autoduel side b.woz" size="234788" crc="6c586f8d" sha1="985d1da266ee97daea7206b13f08fd39711b6fb5" />
- </dataarea>
- </part>
- </software>
-
- <software name="bismarck">
- <description>Bismarck: The North Sea Chase</description>
- <year>1987</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-02 -->
- <!--"Bismarck: The North Sea Chase" is a 1987 simulation game developed by Tony Stoddart, ported to the Apple II by Allen Adham, and distributed by Datasoft. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233553">
- <rom name="bismarck- the north sea chase.woz" size="233553" crc="c17a9e53" sha1="bf529052b161149aa810289bf4e3213ec2c0d40c" />
- </dataarea>
- </part>
- </software>
-
- <software name="chwrest">
- <description>Championship Wrestling</description>
- <year>1986</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-02 -->
- <!--"Championship Wrestling" is a 1986 sports game developed by Lonnie D. Ropp, Richard A. Ditton, David Thiel, Jeffrey P. Lee, Timothy Skelly, and Elaine Hodgson, and distributed by Epyx. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234850">
- <rom name="championship wrestling side a.woz" size="234850" crc="301235b9" sha1="633e5a7b9513e6191073b88dc5940c2e7648aa9d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234850">
- <rom name="championship wrestling side b.woz" size="234850" crc="ed2eea6d" sha1="791806b15e1f4a287623aad808b09bfc8c6dcaf9" />
- </dataarea>
- </part>
- </software>
-
<software name="gbabaskt">
<description>GBA Championship Basketball</description>
<year>1986</year>
@@ -20931,7 +8263,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-09-02 -->
- <!--"GBA Championship Basketball" is a 1986 sports game developed by Troy London, Scott Orr, John Cutter, Mark Madland, and Craig Seastrom, and distributed by Activision. It requires a 128K Apple //e or later.-->
+ <!-- "GBA Championship Basketball" is a 1986 sports game developed by Troy London, Scott Orr, John Cutter, Mark Madland, and Craig Seastrom, and distributed by Activision. It requires a 128K Apple //e or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234833">
@@ -20940,417 +8272,6 @@ license:CC0-1.0
</part>
</software>
- <software name="moebius">
- <description>Moebius</description>
- <year>1985</year>
- <publisher>Origin Systems</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-03 -->
- <!--"Moebius: The Orb of Celestial Harmony" is a 1985 action game developed by Greg Malone and distributed by Origin Systems. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234803">
- <rom name="moebius side a.woz" size="234803" crc="77d01e55" sha1="3a256eb00dfd7db3bc86b9a8a6f37d9ac6508e56" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234803">
- <rom name="moebius side b.woz" size="234803" crc="8718b501" sha1="adb068d1b804f5ddac323dc56d90cc8826d738f0" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Side C" />
- <dataarea name="flop" size="234803">
- <rom name="moebius side c.woz" size="234803" crc="1737fe44" sha1="87a67fb39fb342a1489be258ad46bc1f0509753e" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Side D" />
- <dataarea name="flop" size="234803">
- <rom name="moebius side d.woz" size="234803" crc="327673a2" sha1="6fb014fee91b704d783b49d1abb885cd263c9623" />
- </dataarea>
- </part>
- </software>
-
- <software name="tgwinter">
- <description>The Games: Winter Edition</description>
- <year>1988</year>
- <publisher>Epyx</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-03 -->
- <!--"The Games: Winter Edition" is a 1988 collection of sports games distributed by Epyx. Credits: Edward Chu, Kevin Furry, Eric Knopp, Carl Mey, Scott Nelson, Kevin Norman, Edwin W. Reich Jr., Al Rubin, Chuck Sommerville, Steve A. Baker, Brooke W. Boering, Walter Horat, James Watcher, Susan Greene, Sheryl Knowles, Jenny Martin, Muffy McCosh, Matt Sarconi, Steve Snyder, Paul Vernon, Chris Ebert, Christopher Grigg, Bob Vieira. It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk A - Front" />
- <dataarea name="flop" size="235091">
- <rom name="the games- winter edition disk a - front.woz" size="235091" crc="634f6457" sha1="a4b0ca06e469a1b19ad47876f94ce712c494b750" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk A - Back" />
- <dataarea name="flop" size="235090">
- <rom name="the games- winter edition disk a - back.woz" size="235090" crc="85dfb871" sha1="523d4ab42efccdcdf685e01fbe376aa49ff08d53" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk B - Front" />
- <dataarea name="flop" size="241747">
- <rom name="the games- winter edition disk b - front.woz" size="241747" crc="d3eaa693" sha1="fb9cfae013e8b39562218587218b0a4aa4380136" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk B - Back" />
- <dataarea name="flop" size="241746">
- <rom name="the games- winter edition disk b - back.woz" size="241746" crc="52be2bc8" sha1="2873557eb73c6873f43e9e4ac8e803e5f19a7294" />
- </dataarea>
- </part>
- <part name="flop5" interface="floppy_5_25">
- <feature name="part_id" value="Disk C" />
- <dataarea name="flop" size="240715">
- <rom name="the games- winter edition disk c.woz" size="240715" crc="2504841a" sha1="fccbd849196558aa7c2ab2d59264f9af31c5b19a" />
- </dataarea>
- </part>
- </software>
-
- <software name="sixgunsh">
- <description>Six-Gun Shootout</description>
- <year>1985</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-03 -->
- <!--"Six-Gun Shootout" is a 1985 strategy game distributed by Strategic Simulations, Inc. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241423">
- <rom name="six-gun shootout.woz" size="241423" crc="2c9a94e1" sha1="9a9a6bbdcf104b316dcaeb5fba3f4cec6e41f948" />
- </dataarea>
- </part>
- </software>
-
- <software name="roadgtbg">
- <description>The Road to Gettysburg</description>
- <year>1982</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-03 -->
- <!--"The Road to Gettysburg" is a 1982 strategy game developed by Paul Murray and distributed by Strategic Simulations, Inc. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="248095">
- <rom name="the road to gettysburg.woz" size="248095" crc="e401ad48" sha1="43d5c9005cc820a43b3faf8cc48ac98aca0744a9" />
- </dataarea>
- </part>
- </software>
-
- <software name="gtysburg">
- <description>Gettysburg: The Turning Point (version 1.2)</description>
- <year>1986</year>
- <publisher>Strategic Simulations</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-03 -->
- <!--"Gettysburg: The Turning Point" is a 1986 strategy game developed by David Landrey and Chuck Kroegel, and distributed by Strategic Simulations, Inc. This is version 1.2. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234818">
- <rom name="gettysburg- the turning point v1.2 side a.woz" size="234818" crc="cce30de8" sha1="83ef10b30dc2eea1f47f9c6e5d0da555a7d97bef" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234818">
- <rom name="gettysburg- the turning point v1.2 side b.woz" size="234818" crc="87dee9e8" sha1="bdc23502c510695d46cfecc730e28928fc02bea4" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz31">
- <description>Microzine 31</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 31" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Nordlicht (programmer), Alan R. Schwartz (programmer), Julia Watkins (programmer), Donald Way (programmer), John Ricco (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lainee Cohen (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director), Jenny Grant (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235151">
- <rom name="microzine no. 31 - disk 1, side 1.woz" size="235151" crc="403db5de" sha1="1f4f7f845a56888fba5fd6d343a23275cef0332b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235151">
- <rom name="microzine no. 31 - disk 1, side 2.woz" size="235151" crc="d4d80ab8" sha1="b77883c6fb338831c85a95ec18c0996d092a5f36" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235151">
- <rom name="microzine no. 31 - disk 2, side 1.woz" size="235151" crc="be7a88f6" sha1="fe608a379bddee47b01a0a1e9dd77090ba768c79" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235151">
- <rom name="microzine no. 31 - disk 2, side 2.woz" size="235151" crc="55933b58" sha1="660eacb0e6ff7a13dc2921e48c2b320fdbca8398" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz33">
- <description>Microzine 33</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 33" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Alan R. Schwartz (programmer), Julia Watkins (programmer), Donald Way (programmer), John Ricco (contributing programmer), Michael Sweet (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lainee Cohen (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director), Jenny Grant (assistant art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235256">
- <rom name="microzine no. 33 (1989)(scholastic) - disk 1, side 1- microzine guide, historical hysterics.woz" size="235256" crc="b29a9761" sha1="68b8c3b83d914f94473b3b9588c0d2cc84f31731" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235235">
- <rom name="microzine no. 33 (1989)(scholastic) - disk 1, side 2- planet, plan-it .woz" size="235235" crc="00511910" sha1="f6aeaaee83efa2737fdd8a484cda7845d13f09aa" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235227">
- <rom name="microzine no. 33 (1989)(scholastic) - disk 2, side 1- word war.woz" size="235227" crc="ebf72965" sha1="394e44cfaeb5b604a799d6ba297ab0d22ed613d7" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235234">
- <rom name="microzine no. 33 (1989)(scholastic) - disk 2, side 2- going to pieces.woz" size="235234" crc="a193b792" sha1="c60b88a6956915e2f9b1700d4343bb01d9f68bdb" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz34">
- <description>Microzine 34</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 34" is a 1990 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Michael Sweet (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lisa Feder-Feitel (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235181">
- <rom name="microzine no. 34 (1990)(scholastic) - disk 1, side 1- microzine guide, the case of the missing rose.woz" size="235181" crc="78c046e2" sha1="c39078e97c1c1226cf368733d2df5268e73869f3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235152">
- <rom name="microzine no. 34 (1990)(scholastic) - disk 1, side 2- secret sentences.woz" size="235152" crc="99c8db8a" sha1="40fdc70700d3cfe3870a51e78cb27a967de48fd4" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235172">
- <rom name="microzine no. 34 (1990)(scholastic) - disk 2, side 1- the mystery of the olympic imposters.woz" size="235172" crc="6d6c65ba" sha1="7763031e01b42163db8b1a54f92ab1aa1ce50fbc" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235165">
- <rom name="microzine no. 34 (1990)(scholastic) - disk 2, side 2- fyi- a database of inventions.woz" size="235165" crc="c8073f03" sha1="ac5e394298ad1cd466acb07647efb42c2dab708e" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz35">
- <description>Microzine 35</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 35" is a 1990 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Donald Way (programmer), Andrew Kaplan (contributing programmer), Michael Sweet (contributing programmer), Lisa Mandel (project editor), Marian Buck-Murray (associate editor), Rose Trivisonno (contributing editor), Maureen Stapleton (editorial assistant), Jessica Stonier (editorial assistant), Tara Framer (art director). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235199">
- <rom name="microzine no. 35 (1990)(scholastic) - disk 1, side 1- microzine guide, grid block.woz" size="235199" crc="3b44825f" sha1="5a80bc2e6bdda78fefb7b1782d1aaec351051b06" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235187">
- <rom name="microzine no. 35 (1990)(scholastic) - disk 1, side 2- what's missing.woz" size="235187" crc="66c489df" sha1="9aee8cbc689cd52567207f9bb3fed3e5845b8f68" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235183">
- <rom name="microzine no. 35 (1990)(scholastic) - disk 2, side 1- world agent.woz" size="235183" crc="21739734" sha1="613be3d876dc45ac394d2c849f7591aed865e895" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235187">
- <rom name="microzine no. 35 (1990)(scholastic) - disk 2, side 2- let's graph it .woz" size="235187" crc="3a44de21" sha1="b0d5c42f52e1bc8d872c48af7edcb2b930f55e10" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz36">
- <description>Microzine 36</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 36" is a 1990 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Lisa Mandel (project editor), Marian Buck-Murray (associate editor), Rose Trivisonno (contributing editor), Jessica Stonier (editorial assistant). It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235140">
- <rom name="microzine no. 36 (1990)(scholastic) - disk 1, side 1- microzine guide, the case of the crafty caper.woz" size="235140" crc="71939618" sha1="c6d53732b0af3c1acfb1934137da077ee0efec66" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235105">
- <rom name="microzine no. 36 (1990)(scholastic) - disk 1, side 2- trap doors.woz" size="235105" crc="2b1f6ee0" sha1="c56ea893cbd15d660b82cafdd2ddde790fb06c3a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235123">
- <rom name="microzine no. 36 (1990)(scholastic) - disk 2, side 1- dr. think and the idea factory.woz" size="235123" crc="953e1074" sha1="c48300bd1de2e511934f01d903e359778559a702" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235102">
- <rom name="microzine no. 36 (1990)(scholastic) - disk 2, side 2- it fits.woz" size="235102" crc="42cdaaa0" sha1="0feaf327d1150204962f9219a7b0eef15da8b4fc" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz37">
- <description>Microzine 37</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 37" is a 1990 set of educational games and programs distributed by Scholastic. Credits: Stuart Blavatnick (programmer), Cary Hammer (programmer), Alissa Ossip (programmer), Donald Way (contributing programmer), Lisa Mandel (project editor), Marian Buck-Murray (associate editor), Nadine Browning (contributing editor), Laura Jeffers (contributing editor). -->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235098">
- <rom name="microzine no. 37 (1990)(scholastic) - disk 1, side 1- microzine guide, the case of the cutting caper.woz" size="235098" crc="0c46ac81" sha1="534963be25a92e12c4b84f2c519dacf6649c4710" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235061">
- <rom name="microzine no. 37 (1990)(scholastic) - disk 1, side 2- math mall.woz" size="235061" crc="bb45e821" sha1="f0fcdeb2ad6fa3f7817560b2e5a113d1f2801aff" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235077">
- <rom name="microzine no. 37 (1990)(scholastic) - disk 2, side 1- the race for independence.woz" size="235077" crc="9dc80a4d" sha1="6fcacac03ec59d9b121a4f5804a94abdfd074b1a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235070">
- <rom name="microzine no. 37 (1990)(scholastic) - disk 2, side 2- nutrition explorer.woz" size="235070" crc="f73ca6b1" sha1="3ebef62d966866aaa2708205e72de4b6b0971a33" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz38">
- <description>Microzine 38</description>
- <year>1990</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 38" is a 1990 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (programmer), Alissa Ossip (programmer), Michael Repasy (programmer), Lisa Mandel (project editor), Marian Buck-Murray (associate editor), Nadine Browning (contributing editor), Laura Jeffers (contributing editor). It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235044">
- <rom name="microzine no. 38 (1990)(scholastic) - disk 1, side 1- microzine guide, eskimo escapade.woz" size="235044" crc="a4068dd1" sha1="61fed3b019abb4fcbef5ea94fb47f1d2aaa2dd96" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235021">
- <rom name="microzine no. 38 (1990)(scholastic) - disk 1, side 2- math mall.woz" size="235021" crc="90148490" sha1="c47457b786832f88f758eb08fa9a58f3ee58d8e8" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235048">
- <rom name="microzine no. 38 (1990)(scholastic) - disk 2, side 1- outer space adventures in government.woz" size="235048" crc="e894e2f2" sha1="e04dd9832fe8a88254aa53f57e4dc90e989d0ae6" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235037">
- <rom name="microzine no. 38 (1990)(scholastic) - disk 2, side 2- exploring simple machines.woz" size="235037" crc="e33bfb51" sha1="b260705f154b8b5312f38794481cc5c7b667b4df" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz39">
- <description>Microzine 39</description>
- <year>1991</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-01 -->
- <!--"Microzine No. 39" is a 1991 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (programmer), Michael Repasy (programmer), Lisa Mandel (project editor), Marian Buck-Murray (associate editor), Nadine Browning (contributing editor), Laura Jeffers (contributing editor). It requires a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235032">
- <rom name="microzine no. 39 (1991)(scholastic) - disk 1, side 1- microzine guide, the case of the baffled baker.woz" size="235032" crc="a3a68692" sha1="44ed270300dffc96a703deefac4686fc5efcdfaf" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="234995">
- <rom name="microzine no. 39 (1991)(scholastic) - disk 1, side 2- math mall.woz" size="234995" crc="d77633b9" sha1="0afa15aa93fa8aa372adf0494380ba0028f7fd6a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235021">
- <rom name="microzine no. 39 (1991)(scholastic) - disk 2, side 1- the stars of the harlem renaissance.woz" size="235021" crc="eff99db3" sha1="fe60a9f0ad034d006d91752ff9e5c4b21fac175d" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235012">
- <rom name="microzine no. 39 (1991)(scholastic) - disk 2, side 2- exploring the earth's tilt.woz" size="235012" crc="96031b86" sha1="9e582cac2eaf4a1d52d7fe5ae61d6b3a3628aa11" />
- </dataarea>
- </part>
- </software>
-
<software name="balnat35">
<description>The Balance of Nature (800K 3.5")</description>
<year>1984</year>
@@ -21358,7 +8279,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or //e or 48K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-09-12 -->
- <!--"The Balance in Nature" is a 1984 educational program developed by Barry Kasven, Gerard Camilleri, and Bill Kresse, and distributed by Focus Media. It requires an Apple IIgs, //c+, or //e or 48K ][+ with a compatible drive controller card.-->
+ <!-- "The Balance in Nature" is a 1984 educational program developed by Barry Kasven, Gerard Camilleri, and Bill Kresse, and distributed by Focus Media. It requires an Apple IIgs, //c+, or //e or 48K ][+ with a compatible drive controller card. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296201">
@@ -21367,102 +8288,6 @@ license:CC0-1.0
</part>
</software>
- <software name="inswld35">
- <description>The Insect World (800K 3.5")</description>
- <year>1986</year>
- <publisher>Ventura Educational Systems</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-12 -->
- <!--"The Insect World" is a 1986 educational program developed and distributed by Ventura Educational Systems. It requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296157">
- <rom name="the insect world 800k.woz" size="1296157" crc="44248718" sha1="3265719575498390f2d3de931de88594cbb5023a" />
- </dataarea>
- </part>
- </software>
-
- <software name="scboxing">
- <description>Sierra Championship Boxing</description>
- <year>1985</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-12 -->
- <!--"Sierra Championship Boxing" is a 1985 sportsgame developed and distributed by Sierra On-Line. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234766">
- <rom name="sierra championship boxing.woz" size="234766" crc="7c1b1a8f" sha1="ae938d5bda40565cf8ca3f7b8373543a36f726f3" />
- </dataarea>
- </part>
- </software>
-
- <software name="robotrsc">
- <description>Robot Rascals</description>
- <year>1986</year>
- <publisher>Electronic Arts</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-12 -->
- <!--"Robot Rascals" is a 1986 strategy game developed by Dan Bunten, Alan Watson, Dave Warhol, Mark McElroy, and Mark Botner, and distributed by Electronic Arts. It requires a 64K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="228261">
- <rom name="robot rascals.woz" size="228261" crc="c04c20ac" sha1="9070579b6fbf4ad9011a552c306879f66fe0c7ff" />
- </dataarea>
- </part>
- </software>
-
- <software name="thexd15">
- <description>Thexder (version 1.5)</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-24 -->
- <!--"Thexder" is a 1987 action game developed by Daron Stinnett and distributed by Sierra On-Line. This is version 1.5. It requires a 64K Apple ][+ or later. Double hi-res graphics require a 128K Apple //e or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234784">
- <rom name="thexder v1.5.woz" size="234784" crc="921ecd56" sha1="f571e7168f8554b6d114d3f14b6d1136a76cb205" />
- </dataarea>
- </part>
- </software>
-
- <software name="canclmbr">
- <description>Canyon Climber</description>
- <year>1982</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-24 -->
- <!--"Canyon Climber" is a 1982 action game developed by Brian Mountford and distributed by Datasoft. It requires a 48K Apple ][+ or later.-->
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="68374">
- <rom name="canyon climber.woz" size="68374" crc="757bf5fb" sha1="dd92b0e71a66226b2865a507645ebd10e7fea2d6" />
- </dataarea>
- </part>
- </software>
-
- <software name="thefct35">
- <description>The Factory (800K 3.5")</description>
- <year>1990</year>
- <publisher>WINGS for learning</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card " />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-10 -->
- <!--"The Factory: Strategies in Problem Solving" is an educational program developed by Marge Cappo and Mike Fish. This re-release on 3.5-inch disk is dated 1990 and is distributed by WINGS for learning. It requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1329991">
- <rom name="the factory 800k.woz" size="1329991" crc="617f952d" sha1="a131e093854b6adccd8737bc58c2272b5305e745" />
- </dataarea>
- </part>
- </software>
-
<software name="spcrescu">
<description>Space Rescue</description>
<year>1982</year>
@@ -21470,7 +8295,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-09-24 -->
- <!--"Space Rescue" is a 1982 action game developed by Rod Nelsen and distributed by Level-10. It requires a 48K Apple ][+ or later.-->
+ <!-- "Space Rescue" is a 1982 action game developed by Rod Nelsen and distributed by Level-10. It requires a 48K Apple ][+ or later. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234770">
@@ -21479,54 +8304,6 @@ license:CC0-1.0
</part>
</software>
- <software name="rdgeni35">
- <description>Reading General Interest: TEAM Series (800K 3.5")</description>
- <year>1990</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or a 128K //e with a compatible drive and controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-10 -->
- <!--"Reading General Interest: TEAM Series" is an educational program designed by Jan Davidson, Julie Baumgartner, and J. M. Albanese; written by L. X. Savain and T. S. DeBry; and distributed by Davidson and Associates. This is version 1.0. It requires an Apple IIgs, //c+, or a 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296274">
- <rom name="reading general interest 800k.woz" size="1296274" crc="85cea307" sha1="57d754d286af6a467a3fe824959c8cfcd79304d3" />
- </dataarea>
- </part>
- </software>
-
- <software name="vocsch35">
- <description>Vocabulary Science and Health: TEAM Series (800K 3.5")</description>
- <year>1982</year>
- <publisher>Davidson and Associates</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or a 128K //e with a compatible drive and controller card." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-10 -->
- <!--"Vocabulary Science and Health: TEAM Series" is an educational program designed by Jan Davidson, L. House, F. Schwartz, and J. M. Albanese; written by Kevin R. Burley; and distributed by Davidson and Associates. This is version 1.0. It requires an Apple IIgs, //c+, or a 128K //e with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296273">
- <rom name="vocabulary science and health 800k.woz" size="1296273" crc="26f62b7f" sha1="3aeaa6a076e7da6c0679ca11c37cf5c4fd4e8c2e" />
- </dataarea>
- </part>
- </software>
-
- <software name="famsci35">
- <description>Famous Scientists (800K 3.5")</description>
- <year>1987</year>
- <publisher>Hartley Courseware</publisher>
- <info name="usage" value="Requires an Apple IIgs, //c+, or //e or 48K ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-11 -->
- <!--"Famous Scientists" is a 1987 educational program developed and distributed by Hartley Courseware. It requires an Apple IIgs, //c+, or //e or 48K ][+ with a compatible drive controller card.-->
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296210">
- <rom name="famous scientists 800k.woz" size="1296210" crc="2fc0210b" sha1="99009fb8f64502960d81fd11f194c8c9330d08b2" />
- </dataarea>
- </part>
- </software>
-
<software name="destiny">
<description>Destiny</description>
<year>1985</year>
@@ -21535,7 +8312,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-09-24 -->
- <!--adventure game-->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234785">
@@ -21550,28 +8327,6 @@ license:CC0-1.0
</part>
</software>
- <software name="arcity">
- <description>Alternate Reality: The City</description>
- <year>1985</year>
- <publisher>Datasoft</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-09-24 -->
- <!--"Alternate Reality: The City" is a 1985 roleplaying game developed by Philip Price, Gary Gilbertson (music), Craig Skinner (artwork), Jim Ratcliff (Apple version), and Ken Jordan (Apple version), and distributed by Datasoft.-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234893">
- <rom name="alternate reality- the city side a.woz" size="234893" crc="a991c13c" sha1="05ad6656a2b82a60d8a6c9749b3c06ce14966627" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234893">
- <rom name="alternate reality- the city side b.woz" size="234893" crc="d91bf591" sha1="058f5be53707bc86a4ceb459af14861f070e0786" />
- </dataarea>
- </part>
- </software>
-
<software name="lunarexp">
<description>Lunar Explorer</description>
<year>1986</year>
@@ -21579,7 +8334,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-04 -->
- <!--"Lunar Explorer" is a 1986 simulation game developed by L. Roberts and distributed by Spectrum Holobyte.-->
+ <!-- "Lunar Explorer" is a 1986 simulation game developed by L. Roberts and distributed by Spectrum Holobyte. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234805">
<rom name="lunar explorer.woz" size="234805" crc="5d3f29cf" sha1="15aed60d4b2aa3951a878797729252fab9ec5c9b" />
@@ -21587,21 +8342,6 @@ license:CC0-1.0
</part>
</software>
- <software name="guardian">
- <description>Guardian</description>
- <year>1982</year>
- <publisher>Continental Software</publisher>
- <info name="usage" value="Runs on any Apple ][ with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-10-04 -->
- <!--"Guardian" is a 1982 action game developed by tom & jerry and distributed by Continental Software.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="121637">
- <rom name="guardian.woz" size="121637" crc="38f8a3f7" sha1="a942d01dbf2bcbf48ca937291fb373b78e873e43" />
- </dataarea>
- </part>
- </software>
-
<software name="todesktl12">
<description>TimeOut DeskTools (version 1.2) (800K 3.5")</description>
<year>1987</year>
@@ -21609,7 +8349,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut DeskTools" is a 1987 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut DeskTools" is a 1987 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296186">
<rom name="timeout desktools v1.2 800k.woz" size="1296186" crc="743a69d0" sha1="ab6d821c0f956fdf7d6f2b8acf1bee51c0680bc5" />
@@ -21624,7 +8364,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut DeskTools" is a 1987 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.3. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut DeskTools" is a 1987 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.3. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296159">
<rom name="timeout desktools v1.3 800k.woz" size="1296159" crc="c2e96f53" sha1="ff66449c64a05de3f507a5af2c3b68bc203cc822" />
@@ -21639,7 +8379,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut DeskTools" is a 1990 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 3.1. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut DeskTools" is a 1990 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 3.1. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296143">
<rom name="timeout desktools v3.1 800k.woz" size="1296143" crc="c1d76759" sha1="5521aefdb27f265d1877de1dca69e22975deb1f7" />
@@ -21654,7 +8394,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut DeskTools II" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut DeskTools II" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345314">
<rom name="timeout desktools ii v1.1 800k.woz" size="1345314" crc="927a2104" sha1="8ed90777d89b01b80d596b567b59bd0c47f0799b" />
@@ -21669,7 +8409,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut DeskTools II" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut DeskTools II" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296162">
<rom name="timeout desktools ii v1.2 800k.woz" size="1296162" crc="29b13eff" sha1="44bfd87bdb57d0c5f09a43f2c5fa11132730ee70" />
@@ -21684,7 +8424,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut FileMaster" is a 1987 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut FileMaster" is a 1987 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296163">
<rom name="timeout filemaster v1.0 800k.woz" size="1296163" crc="de662a27" sha1="0b2b067419187b4372d1dbfb97b2b8edafb04f30" />
@@ -21699,7 +8439,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut FileMaster" is a 1987 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.3. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut FileMaster" is a 1987 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.3. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1328934">
<rom name="timeout filemaster v1.3 800k.woz" size="1328934" crc="21f6d166" sha1="79e3d001cdf1a03bef71ada5c82183f1a18155ea" />
@@ -21714,7 +8454,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut Grammar" is a 1992 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut Grammar" is a 1992 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296159">
<rom name="timeout grammar v1.0 800k.woz" size="1296159" crc="d91952d5" sha1="3ceacdb8c21ef114bfea3e9af36a11b1d2171ae1" />
@@ -21729,7 +8469,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut Graph" is a 1987 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut Graph" is a 1987 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296158">
<rom name="timeout graph v1.0.woz" size="1296158" crc="b746fb4b" sha1="a0ae86c928e1be140632c5787fdae280a35b8b86" />
@@ -21744,7 +8484,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut Graph" is a 1987 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut Graph" is a 1987 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296161">
<rom name="timeout graph v1.2 800k.woz" size="1296161" crc="f886ccc6" sha1="2701bb7359c44e93e600d8ebb733e54dce261e34" />
@@ -21759,7 +8499,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut MacroEase" is a 1990 productivity program developed by Randy Brandt and Mark Munz, and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut MacroEase" is a 1990 productivity program developed by Randy Brandt and Mark Munz, and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296156">
<rom name="timeout macroease v1.0 800k.woz" size="1296156" crc="176bc7e7" sha1="85df5d69f8184f7d1f3ef2a90ae2fe88280ed01c" />
@@ -21774,7 +8514,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut PowerPack" is a 1988 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut PowerPack" is a 1988 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1328930">
<rom name="timeout powerpack v1.2 800k.woz" size="1328930" crc="efdd1ff0" sha1="2d4f124d02d4515c350b3c37b6e005930247419e" />
@@ -21789,7 +8529,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut QuickSpell" is a 1987 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.6. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut QuickSpell" is a 1987 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.6. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296160">
<rom name="timeout quickspell v1.6 800k.woz" size="1296160" crc="763d89c8" sha1="610830e8cf0012617060f192f61b8ffe4a8e000a" />
@@ -21804,7 +8544,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut QuickSpell" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 2.0. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut QuickSpell" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 2.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296163">
<rom name="timeout quickspell v2.0 800k.woz" size="1296163" crc="ae641935" sha1="221c3650240157275fdb93c3fcbf263a1d1c9982" />
@@ -21819,7 +8559,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut ReportWriter" is a 1989 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut ReportWriter" is a 1989 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1328959">
<rom name="timeout reportwriter v1.0 800k.woz" size="1328959" crc="a5d43d9e" sha1="2b9f818c8c94fdcc5e7e22d61f00ac9e1ab8066f" />
@@ -21834,7 +8574,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut ReportWriter" is a 1989 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 2.2. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut ReportWriter" is a 1989 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 2.2. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296148">
<rom name="timeout reportwriter v2.2 800k.woz" size="1296148" crc="8cb409ae" sha1="0693010585889920d3a5275b5fe25025f50af4f9" />
@@ -21849,7 +8589,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut ReportWriter" is a 1989 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 2.52. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut ReportWriter" is a 1989 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 2.52. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296165">
<rom name="timeout reportwriter v2.52 800k.woz" size="1296165" crc="3d8b1015" sha1="351b0e8e0276f7872042b74fdb39304627b551ee" />
@@ -21864,7 +8604,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SideSpread" is a 1987 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut SideSpread" is a 1987 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296164">
<rom name="timeout sidespread v1.2 800k.woz" size="1296164" crc="9526f4f4" sha1="9bd43d9cebdf7cd9dbb6762681aad7364e5f7976" />
@@ -21879,7 +8619,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SpreadTools" is a 1988 productivity program developed by Alan Bird, Randy Brandt, and Dan Verkade, and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut SpreadTools" is a 1988 productivity program developed by Alan Bird, Randy Brandt, and Dan Verkade, and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1331029">
<rom name="timeout spreadtools v1.0 800k.woz" size="1331029" crc="e2f6fff7" sha1="1c99ec06f4d8fb03c7c0ac8139ea98e7383af3e5" />
@@ -21894,7 +8634,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SpreadTools" is a 1988 productivity program developed by Alan Bird, Randy Brandt, and Dan Verkade, and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut SpreadTools" is a 1988 productivity program developed by Alan Bird, Randy Brandt, and Dan Verkade, and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296186">
<rom name="timeout spreadtools v1.1 800k.woz" size="1296186" crc="e5fb0d48" sha1="9e2349d3d3db06d660926206f9a7006c905dd62a" />
@@ -21909,7 +8649,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SuperFonts" is a 1987 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut SuperFonts" is a 1987 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296164">
<rom name="timeout superfonts v1.0 800k.woz" size="1296164" crc="2ccbe293" sha1="93407ba37f97ecd3edae9c048131b0e4846f4494" />
@@ -21924,7 +8664,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SuperFonts" is a 1987 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut SuperFonts" is a 1987 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296167">
<rom name="timeout superfonts v1.1 800k.woz" size="1296167" crc="d05f9904" sha1="97df8a8547dc61e526be5fe363f62b3235dfa264" />
@@ -21939,7 +8679,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SuperFonts" is a 1989 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 3.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
+ <!-- "TimeOut SuperFonts" is a 1989 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 3.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296191">
<rom name="timeout superfonts v3.0 800k.woz" size="1296191" crc="4ea63db3" sha1="57caf3066289d02717cff42e7c0a402eeac40088" />
@@ -21954,7 +8694,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SuperFonts" is a 1989 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 3.1. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut SuperFonts" is a 1989 productivity program developed by Mark Simonsen and distributed by Beagle Bros. This is version 3.1. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296164">
<rom name="timeout superfonts v3.1 800k.woz" size="1296164" crc="3a649103" sha1="ca0207358b3dd19f610fbc8444d2a36ad4e57b06" />
@@ -21969,7 +8709,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut SuperForms" is a 1990 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.04. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut SuperForms" is a 1990 productivity program developed by Dan Verkade and distributed by Beagle Bros. This is version 1.04. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296163">
<rom name="timeout superforms v1.04 800k.woz" size="1296163" crc="e8ce88c5" sha1="1bb558b5d6444f15b7ea42534e3d0306f62aabe9" />
@@ -21984,7 +8724,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut TeleComm" is a 1989 productivity program developed by Mark de Jong and Mark Munz, and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut TeleComm" is a 1989 productivity program developed by Mark de Jong and Mark Munz, and distributed by Beagle Bros. This is version 1.1. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296171">
<rom name="timeout telecomm v1.1 800k.woz" size="1296171" crc="b0d31cbf" sha1="b1f6dae42786b7e892dc8a5491069899d6501238" />
@@ -21999,7 +8739,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut TeleComm" is a 1989 productivity program developed by Mark de Jong and Mark Munz, and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut TeleComm" is a 1989 productivity program developed by Mark de Jong and Mark Munz, and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1360667">
<rom name="timeout telecomm v1.2 800k.woz" size="1360667" crc="12859e48" sha1="f06cf2918f57bce58cf5bdd369b5de23b40f2f72" />
@@ -22014,7 +8754,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut Thesaurus" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
+ <!-- "TimeOut Thesaurus" is a 1988 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 1.0. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296159">
<rom name="timeout thesaurus v1.0 800k.woz" size="1296159" crc="54a43136" sha1="597374f220a4b67c0ec9682d04d8138e75c7407d" />
@@ -22029,7 +8769,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut Thesaurus" is a 1989 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 2.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
+ <!-- "TimeOut Thesaurus" is a 1989 productivity program developed by Alan Bird and distributed by Beagle Bros. This is version 2.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296186">
<rom name="timeout thesaurus v2.0 800k.woz" size="1296186" crc="1de3281c" sha1="ccf605d222c5d820d93071aa58aaa94b9788171d" />
@@ -22044,7 +8784,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut UltraMacros" is a 1987 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut UltraMacros" is a 1987 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.2. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296164">
<rom name="timeout ultramacros v1.2 800k.woz" size="1296164" crc="f6040a4a" sha1="e35995f71db3092240fa18290d5564328a0ff94a" />
@@ -22059,7 +8799,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut UltraMacros" is a 1988 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.7. It is a third-party add-on to AppleWorks 2.0, sold separately.-->
+ <!-- "TimeOut UltraMacros" is a 1988 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 1.7. It is a third-party add-on to AppleWorks 2.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1328935">
<rom name="timeout ultramacros v1.7 800k.woz" size="1328935" crc="5928f788" sha1="a74e07e301f1930cddc13bd4365911ebfab65e85" />
@@ -22074,7 +8814,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut UltraMacros" is a 1989 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 3.0. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut UltraMacros" is a 1989 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 3.0. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296164">
<rom name="timeout ultramacros v3.0 800k.woz" size="1296164" crc="81f4eba0" sha1="df9f6449256c837c1906ddf927fdf3b6de39ee55" />
@@ -22089,7 +8829,7 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2022-10-15 -->
- <!--"TimeOut UltraMacros" is a 1989 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 3.1. It is a third-party add-on to AppleWorks 3.0, sold separately.-->
+ <!-- "TimeOut UltraMacros" is a 1989 productivity program developed by Randy Brandt and distributed by Beagle Bros. This is version 3.1. It is a third-party add-on to AppleWorks 3.0, sold separately. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296191">
<rom name="timeout ultramacros v3.1 800k.woz" size="1296191" crc="448b74ed" sha1="51aca2f0ad2a8ad3d3be420c4fd9f086c4ec9ff3" />
@@ -22097,108 +8837,6 @@ license:CC0-1.0
</part>
</software>
- <software name="microz32">
- <description>Microzine 32</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-11-20 -->
- <!--"Microzine No. 32" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Nordlicht (programmer), Alan R. Schwartz (programmer), Julia Watkins (programmer), Donald Way (programmer), Jo Ann Comito (contributing programmer), John Ricco (contributing programmer), Amy E. McKinley (editorial director), Lisa Mandel (project editor), Lainee Cohen (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director), Jenny Grant (assistant art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235265">
- <rom name="microzine no. 32 - disk 1, side 1- the case of the unidentified flying alien.woz" size="235265" crc="d503cd19" sha1="dcb090dc18178568510f34db7606083d7507c8e3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235239">
- <rom name="microzine no. 32 - disk 1, side 2- fyi- a database.woz" size="235239" crc="f9b90f31" sha1="64d484907667c2ea3aa0563733aeb97858cd889a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235244">
- <rom name="microzine no. 32 - disk 2, side 1- a night at fleener's.woz" size="235244" crc="f19b9939" sha1="1bc2c5d4546a5492ac6b8b0d7024a83ad2acba61" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235241">
- <rom name="microzine no. 32 - disk 2, side 2- eyes on the world.woz" size="235241" crc="3310c7ca" sha1="4e1a679a73358831b123e9d1a7b7cb3d8f7aa9ca" />
- </dataarea>
- </part>
- </software>
-
- <software name="microz40">
- <description>Microzine 40</description>
- <year>1991</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-11-20 -->
- <!--"Microzine No. 40" is a 1991 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (programmer), Michael Repasy (programmer), Lisa Mandel (project editor), Marian Buck-Murray (associate editor), Nadine Browning (contributing editor), Denise Chew (contributing editor), and Lisa Feder-Feitel (contributing editor).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235056">
- <rom name="microzine no. 40 - disk 1, side 1- the case of the destroyed dunker.woz" size="235056" crc="f56452fc" sha1="add431de3319839f4b1b29d4b285189658d3ee5c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235033">
- <rom name="microzine no. 40 - disk 1, side 2- math mall.woz" size="235033" crc="1fef74d3" sha1="c98ea37ae6133254067a63a20d0a8a8735025754" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235053">
- <rom name="microzine no. 40 - disk 2, side 1- the great pawnee buffalo hunt.woz" size="235053" crc="ca11186a" sha1="8aba25d5dc092e656dddc9393cbff6c22d5de000" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235052">
- <rom name="microzine no. 40 - disk 2, side 2- exploring animal adaptations.woz" size="235052" crc="1b1c968c" sha1="7e69774e1ce3386a591bd30ac280a1679348b9f8" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr1">
- <description>Microzine Jr. 1</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2022-11-20 -->
- <!--"Microzine Jr. No. 1" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Jo Ann Comito (contributing programmer), Amy E. McKinley (editorial director), Nancy Waks (project editor), Claire Curtin (contributing editor), Lisa Mandel (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director), Edwin Torres (art director), Joan Auclair (contributing artist).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235322">
- <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 1, side 1- microzine jr. guide, eye spy.woz" size="235322" crc="d9f8b54e" sha1="5c6ba8ce91a8e71529f5fe3566ddc6f2e66258a2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235304">
- <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 1, side 2- mask maker.woz" size="235304" crc="a19b7ac3" sha1="0f4862996458b8afac079c521935fb56e03a85cd" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235301">
- <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 2, side 1- safari.woz" size="235301" crc="aafb1278" sha1="e6c04e1c37802524a23e2719ee16da561ad39625" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235310">
- <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 2, side 2- talk to b.e.r.t..woz" size="235310" crc="2d428709" sha1="63c70e0de983175a507a6b8990da676c28ae89b9" />
- </dataarea>
- </part>
- </software>
-
<software name="gamewrld1">
<description>Games From Around The World #1: Wari</description>
<year>1988</year>
@@ -22206,7 +8844,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-21 -->
- <!--"Games From Around The World #1: Wari" is a 1988 board game developed by John Besnard. It is unpublished.-->
+ <!-- "Games From Around The World #1: Wari" is a 1988 board game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234785">
<rom name="games from around the world #1- wari.woz" size="234785" crc="8f643468" sha1="fdddf3144aac6c2e9ef47c8732dd3c644b06f1af" />
@@ -22221,7 +8859,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Games From Around The World #2: Kono" is a 1988 board game developed by John Besnard. It is unpublished.-->
+ <!-- "Games From Around The World #2: Kono" is a 1988 board game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234785">
<rom name="games from around the world #2- kono.woz" size="234785" crc="69ceabb7" sha1="4e442f83e60e27f34e71a996bd04148f91360112" />
@@ -22236,7 +8874,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Games From Around The World #3: Fox & Geese" is a 1988 board game developed by John Besnard. It is unpublished.-->
+ <!-- "Games From Around The World #3: Fox & Geese" is a 1988 board game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Program" />
<dataarea name="flop" size="234792">
@@ -22258,7 +8896,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Games From Around The World #4: Seega" is a 1988 board game developed by John Besnard. It is unpublished.-->
+ <!-- "Games From Around The World #4: Seega" is a 1988 board game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234786">
<rom name="games from around the world #4- seega.woz" size="234786" crc="67606ce4" sha1="9b7442a623c89e9e83d5c8c21c4ed1a7bac2cd5e" />
@@ -22273,7 +8911,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Games From Around The World #5: Nine Men's Morris" is a 1988 board game developed by John Besnard. It is unpublished.-->
+ <!-- "Games From Around The World #5: Nine Men's Morris" is a 1988 board game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234798">
<rom name="games from around the world #5- nine men's morris.woz" size="234798" crc="833bdf53" sha1="3bab78ddb2bf8e8e61d424457480f2d6f6d270b7" />
@@ -22288,7 +8926,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Games From Around The World #6: Mu Torere" is a 1988 board game developed by John Besnard. It is unpublished.-->
+ <!-- "Games From Around The World #6: Mu Torere" is a 1988 board game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="games from around the world #6- mu torere.woz" size="234790" crc="e8b1d9cf" sha1="0e038563ec2fbf3efb5efa1de4b89b6342ddc7c8" />
@@ -22303,7 +8941,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Weights and Treasure" is a 1988 action game developed by John Besnard. It is unpublished.-->
+ <!-- "Weights and Treasure" is a 1988 action game developed by John Besnard. It is unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234770">
<rom name="weights and treasure.woz" size="234770" crc="26225be7" sha1="fe55e34b83dbc83aa8ad025e7c49b43fe32b5283" />
@@ -22318,7 +8956,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"Brain Machine" is a 1986 board game developed by John Besnard. A later version was published by Softdisk, but this version was unpublished.-->
+ <!-- "Brain Machine" is a 1986 board game developed by John Besnard. A later version was published by Softdisk, but this version was unpublished. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234762">
<rom name="brain machine.woz" size="234762" crc="d9528ae5" sha1="0c09189eef698cf8bb8b4c64bbe79e4fce9a1f84" />
@@ -22333,7 +8971,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-02-25 -->
- <!--"First Encounter" is a 1987 educational game developed by John Besnard and presented by Softdisk.-->
+ <!-- "First Encounter" is a 1987 educational game developed by John Besnard and presented by Softdisk. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234789">
@@ -22355,7 +8993,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-03-09 -->
- <!--"Rock 'N Scroll" is a 1987 educational game developed by John Besnard.-->
+ <!-- "Rock 'N Scroll" is a 1987 educational game developed by John Besnard. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234769">
<rom name="rock 'n scroll.woz" size="234769" crc="ffb8d18c" sha1="2ff57f9a46ceaea3e223731cd05b1f6c4beb02ff" />
@@ -22370,7 +9008,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-03-09 -->
- <!--"Bez-MX" is a 1981 strategy game developed and distributed by John Besnard (as 'Bez').-->
+ <!-- "Bez-MX" is a 1981 strategy game developed and distributed by John Besnard (as 'Bez'). -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234772">
<rom name="bez-mx.woz" size="234772" crc="07ab1751" sha1="3eeb10d138fed50d3ffa5c52206c48c06db4a098" />
@@ -22385,7 +9023,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-03-11 -->
- <!--"Bezman" is a 1981 action game developed and distributed by John Besnard (as 'Bez').-->
+ <!-- "Bezman" is a 1981 action game developed and distributed by John Besnard (as 'Bez'). -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234770">
<rom name="bezman.woz" size="234770" crc="fcdc4e04" sha1="419f7f1f018024f50ddece9d0eaff3dc697d458c" />
@@ -22400,7 +9038,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-03-11 -->
- <!--"Bezoff" is a 1982 action game developed and distributed by John Besnard (as 'Bez').-->
+ <!-- "Bezoff" is a 1982 action game developed and distributed by John Besnard (as 'Bez'). -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234770">
<rom name="bezoff.woz" size="234770" crc="e82989c4" sha1="7e14be404ea8b69d9f929c9857532198377dc773" />
@@ -22415,7 +9053,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-03-11 -->
- <!--"Bezwars" is a 1981 action game developed and distributed by John Besnard (as 'Bez').-->
+ <!-- "Bezwars" is a 1981 action game developed and distributed by John Besnard (as 'Bez'). -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234771">
<rom name="bezwars.woz" size="234771" crc="793b8fe1" sha1="8e5a1ab00a7a00ed6da3aa3614574d8e4992fe90" />
@@ -22430,7 +9068,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-03-11 -->
- <!--"Double Trouble" is a 1983 action game developed and distributed by John Besnard (as 'Bez').-->
+ <!-- "Double Trouble" is a 1983 action game developed and distributed by John Besnard (as 'Bez'). -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234778">
<rom name="double trouble.woz" size="234778" crc="ee11212f" sha1="af6d200b0a078aab1cacfdd9558892bdc699c425" />
@@ -22438,417 +9076,6 @@ license:CC0-1.0
</part>
</software>
- <software name="nightgal">
- <description>Nightmare Gallery</description>
- <year>1982</year>
- <publisher>Synergistic Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-11 -->
- <!--"Nightmare Gallery" is a 1982 action game developed by Ron Aldrich and distributed by Synergistic Software.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241445">
- <rom name="nightmare gallery.woz" size="241445" crc="6f221859" sha1="bdd443ea28f8c869b13ef587223bc66d499ded61" />
- </dataarea>
- </part>
- </software>
-
- <software name="dragonshk">
- <description>Dragons of Hong Kong</description>
- <year>1981</year>
- <publisher>Adventure International</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-11 -->
- <!--"Dragons of Hong Kong" is a 1981 adventure game developed by Robert Lafore, ported to the Apple II by David Fox, and distributed by Adventure International.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234849">
- <rom name="dragons of hong kong.woz" size="234849" crc="926dd1ef" sha1="655b277f438b799cd1aca2cffdd3c766774e8413" />
- </dataarea>
- </part>
- </software>
-
- <software name="apuckman">
- <description>Apple Puck Man</description>
- <year>1981</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Runs on any Apple ][ with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-11 -->
- <!--"Apple Puck Man" is a 1981 action game developed by Jun Wada and distributed by Broderbund Software.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="95008">
- <rom name="apple puck man.woz" size="95008" crc="95512329" sha1="45ea4a66805fc7a2cfa07e8268d151ac4991095c" />
- </dataarea>
- </part>
- </software>
-
- <software name="pptblends10">
- <description>Phonics Prime Time: Blends and Digraphs (version 1.0) (800K 3.5")</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, Apple //e or 64K Apple ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-27 -->
- <!--"Phonics Prime Time: Blends and Digraphs" is a 1987 educational program developed and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk.-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1344305">
- <rom name="phonics prime time- blends and digraphs 800k.woz" size="1344305" crc="7725208a" sha1="4b75878f1aa07f1aac3bf7daea6754553e6055b4" />
- </dataarea>
- </part>
- </software>
-
- <software name="probnim10">
- <description>Problem-Solving with Nim (version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, Apple //e or 64K Apple ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-27 -->
- <!--"Problem Solving with Nim" is a 1991 educational program developed by Charolyn Kapplinger, Dick Sisco, Craig Solomonson, and Elizabeth Wendland, and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk.-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296223">
- <rom name="problem-solving with nim 800k.woz" size="1296223" crc="f7c23313" sha1="7636208003087cf447f90f6381936957990e49a7" />
- </dataarea>
- </part>
- </software>
-
- <software name="markplace10">
- <description>The Market Place (version 1.0) (800K 3.5")</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, Apple //e or 64K Apple ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-27 -->
- <!--"The Market Place" is a 1984 educational program developed and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk.-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296138">
- <rom name="the market place 800k.woz" size="1296138" crc="b9ac3c6c" sha1="bf65cf704707bce45a49992ae107551a9e2966d6" />
- </dataarea>
- </part>
- </software>
-
- <software name="tmnav810">
- <description>Time Navigator (version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires an Apple IIgs, Apple //c+, Apple //e or 64K Apple ][+ with a compatible drive controller card." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-03-27 -->
- <!--"Time Navigator" is a 1989 educational program developed by Beth Bell, Vincent Erickson, Charolyn Kapplinger, John J. Krenz, Nan Leekly, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer, and distributed by MECC. This is version 1.0. It is distributed on a single 3.5-inch (800K) disk.-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1344927">
- <rom name="time navigator 800k.woz" size="1344927" crc="41c44b9f" sha1="69f6015ee38abe03659cdc07d2447aff5a2a250b" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr2">
- <description>Microzine Jr. 2</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 2" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Julia Watkins (programmer), Donald Way (programmer), Stuart Blavatnik (contributing programmer), Jo Ann Comito (contributing programmer), Amy E. McKinley (editorial director), Nancy Waks (project editor), Lainee Cohen (contributing editor), Lisa Mandel (contributing editor), Rose Trivisonno (contributing editor), Tara Framer (art director), Edit Torres (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235331">
- <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 1, side 1- microzine jr. guide, the case of the garden plot.woz" size="235331" crc="9f98ad48" sha1="508e22bcf2908bebfc046ae0960d1aef873089e3" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235294">
- <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 1, side 2- graph maker.woz" size="235294" crc="02d0f4fc" sha1="9df933af0b5e2f21f33a580e2515490bf9314291" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235297">
- <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 2, side 1- crickety manor.woz" size="235297" crc="308f0b0f" sha1="8bd69b5afe34e451b9f08e321b0fc375f196dc03" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235296">
- <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 2, side 2- math ani-mall.woz" size="235296" crc="d3291a03" sha1="8a54f29ada5dff083827fd936d36efbc331b43d0" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr3">
- <description>Microzine Jr. 3</description>
- <year>1988</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 3" is a 1988 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), A. Caleb Gattegno (programmer), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Alan R. Swartz (programmer), Julia Watkins (programmer), Donald Way (programmer), Michael Sweet (contributing programmer), Amy E. McKinley (editorial director), Nancy Waks (project editor), Rose Trivisonno (contributing editor), Lainee Cohen (contributing editor), Lisa Mandel (contributing editor), Tara Framer (art director), Jenny Grant (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235312">
- <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, fuzzy to focused.woz" size="235312" crc="1eeace45" sha1="a41abeb9a4665cead7c633d221666d91c2e6cd82" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235286">
- <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 1, side 2- going dotty.woz" size="235286" crc="007719d4" sha1="4782ef94d3f550b49ec60bd8a8120094f0140ea5" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235296">
- <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 2, side 1- the great frankfurter.woz" size="235296" crc="1b0836f7" sha1="50584c334172872fb50f06d3accabaffeb185c68" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235291">
- <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 2, side 2- the balloonatics.woz" size="235291" crc="84a35cf0" sha1="873be378705c9ff7c9aa93cc846e1975f62fe124" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr4">
- <description>Microzine Jr. 4</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 4" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Andrew Kaplan (programmer), Alissa Nordlicht (programmer), Alan R. Swartz (programmer), Julia Watkins (programmer), Donald Way (programmer), Michael Sweet (contributing programmer), Amy E. McKinley (editorial director), Rose Trivisonno (contributing editor), Lainee Cohen (contributing editor), Lisa Mandel (contributing editor), Nancy Waks (contributing editor), Tara Framer (art director), Jenny Grant (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235283">
- <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the mixed-up kitchen.woz" size="235283" crc="94fcdff3" sha1="f3b86fc0842202ee8c2ed92bde6f3b604de42ba8" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235256">
- <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 1, side 2- jigsaw puzzler.woz" size="235256" crc="82a10334" sha1="4c2013ade13f23e5afdd9dfe81eabd9d932e3018" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235250">
- <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 2, side 1- zoostorm.woz" size="235250" crc="e1d0773e" sha1="5eaad84e4718e7dc24d98dd724e371aa5712d5e6" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235255">
- <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 2, side 2- math ani-mall.woz" size="235255" crc="74b1c393" sha1="3173319d9015b6e4c820cc381bef4611e0a4581a" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr5">
- <description>Microzine Jr. 5</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 5" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Nordlicht (programmer), Alan R. Swartz (programmer), Julia Watkins (programmer), Donald Way (programmer), Michael Sweet (contributing programmer), John Ricco (contributing programmer), Amy E. McKinley (editorial director), Rose Trivisonno (contributing editor), Lainee Cohen (contributing editor), Lisa Feder-Feitel (contributing editor), Lisa Mandel (contributing editor), Nancy Waks (contributing editor), Tara Framer (art director), Jenny Grant (art director). -->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235339">
- <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the case of the class trip.woz" size="235339" crc="ae488431" sha1="b929bac3f618d9bc61726162779da8096eb6eae0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235303">
- <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 1, side 2- board silly.woz" size="235303" crc="231bb030" sha1="61ef6d71d19bd89a49dbd04e38330f89612b490a" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235301">
- <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 2, side 1- your town.woz" size="235301" crc="3dc03ae3" sha1="3fd67f9f647d8083d1d3d7311b7c8f4b59c81ab7" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235307">
- <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 2, side 2- something fishy.woz" size="235307" crc="3fc2f491" sha1="a981be87ad53c5f41501fa14d562900625d68818" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr6">
- <description>Microzine Jr. 6</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 6" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Nordlicht (programmer), Alan R. Swartz (programmer), Julia Watkins (programmer), Donald Way (programmer), Jo Ann Comito (contributing programmer), John Ricco (contributing programmer), Amy E. McKinley (editorial director), Rose Trivisonno (contributing editor), Lainee Cohen (contributing editor), Lisa Feder-Feitel (contributing editor), Lisa Mandel (contributing editor), Tara Framer (art director), Jenny Grant (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235289">
- <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, on the go.woz" size="235289" crc="b189b6c7" sha1="c31f286f6308560e20c0d8073ec1611f66e67ee0" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235289">
- <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 1, side 2- information please- a database.woz" size="235289" crc="8905ae32" sha1="58d830a04bd3711bfc81413fb377226c2f12588b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235275">
- <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 2, side 1- bobo's fun house.woz" size="235275" crc="60ccbbe7" sha1="775abb0c1d7dbd3a239c00d2bcb41405beada848" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235292">
- <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 2, side 2- the case of the missing lunch box.woz" size="235292" crc="8354ea20" sha1="f6e5d5a2b0c4126ee58e86a13f9feffc0b5aba12" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr7">
- <description>Microzine Jr. 7</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 7" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Alan R. Swartz (programmer), Donald Way (programmer), Jo Ann Comito (contributing programmer), Andrew Kaplan (contributing programmer), Michael Sweet (contributing programmer), Amy E. McKinley (editorial director), Rose Trivisonno (contributing editor), Lainee Cohen (contributing editor), Lisa Feder-Feitel (contributing editor), Lisa Mandel (contributing editor), Tara Framer (art director), Jenny Grant (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235308">
- <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, around the block.woz" size="235308" crc="24bffedc" sha1="96f2de3f625f05566b3feb6014e9a6c375563021" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235285">
- <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 1, side 2- shape machines.woz" size="235285" crc="eeb45135" sha1="063a3976217c4e7b160fa0962960cb30938eff0b" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235280">
- <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 2, side 1- walkabout.woz" size="235280" crc="d9c229bc" sha1="91498cbacf81923fde580e81a4c1ee81bcdfc07a" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235282">
- <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 2, side 2- fill-in fun.woz" size="235282" crc="9c1612d2" sha1="08fbff5433655e0d427fb9636109160357aef00c" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr8">
- <description>Microzine Jr. 8</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 8" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Donald Way (programmer), Jo Ann Comito (contributing programmer), Stuart Blavatnik (contributing programmer), Amy E. McKinley (editorial director), Rose Trivisonno (contributing editor), Lisa Feder-Feitel (contributing editor), Lisa Mandel (contributing editor), Maureen Stapleton (contributing editor), Jessica Stonier (contributing editor), Tara Framer (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235259">
- <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the cookie caper.woz" size="235259" crc="bc2b25e7" sha1="754e1c9cfcdf2703bcb67630d0784ef338ddc6a5" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235237">
- <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 1, side 2- paint the floor.woz" size="235237" crc="fe57f10b" sha1="e84a85d8ba80bedcbc71b1ae486482aa68fb00e9" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235238">
- <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 2, side 1- let's celebrate.woz" size="235238" crc="924a2da5" sha1="10f483af4eed715ba523fe704acc1b88804748c5" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235238">
- <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 2, side 2- touch the target.woz" size="235238" crc="566dce34" sha1="461ef76e37c6978a3ed109de6fa31f6c49e33835" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr9">
- <description>Microzine Jr. 9</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 9" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Donald Way (programmer), Jo Ann Comito (contributing programmer), Stuart Blavatnik (contributing programmer), Rose Trivisonno (project editor), Lisa Feder-Feitel (contributing editor), Lisa Mandel (contributing editor), Maureen Stapleton (editorial assistant), Jessica Stonier (editorial assistant), Tara Framer (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235224">
- <rom name="microzine jr. no. 9 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the confusing classroom.woz" size="235224" crc="2341c2f0" sha1="9832f3231f25fd29ad9597828798d78f0e1aadf2" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235200">
- <rom name="microzine jr. no. 9 (1989)(scholastic) - disk 1, side 2- super sundae factory.woz" size="235200" crc="6c900e45" sha1="5cd0b97d032f0c2e46151d1c67d1aebde4952395" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235214">
- <rom name="microzine jr. no. 9 (1990)(scholastic) - disk 2, side 1- the search for the sunken treasure.woz" size="235214" crc="2f42c0fe" sha1="382c225958144c6a8227834f18014ee759b002da" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235216">
- <rom name="microzine jr. no. 9 (1990)(scholastic) - disk 2, side 2- information please- our fifty states.woz" size="235216" crc="bf8a022c" sha1="61ea01574069af1a4726e376f5e0d6e55a94744f" />
- </dataarea>
- </part>
- </software>
-
- <software name="microzjr10">
- <description>Microzine Jr. 10</description>
- <year>1989</year>
- <publisher>Scholastic</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-17 -->
- <!--"Microzine Jr. No. 10" is a 1989 set of educational games and programs distributed by Scholastic. Credits: Cary Hammer (director of programming), Alissa Ossip (programmer), Donald Way (programmer), Jo Ann Comito (contributing programmer), Stuart Blavatnik (contributing programmer), Rose Trivisonno (project editor), Lisa Feder-Feitel (contributing editor), Lisa Mandel (contributing editor), Jessica Stonier (editorial assistant), Tara Framer (art director).-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1" />
- <dataarea name="flop" size="235178">
- <rom name="microzine jr. no. 10 - disk 1, side 1- the case of the missing microzine jr..woz" size="235178" crc="959911ed" sha1="9d5415dc2622e11442c6c6edd15163211a07579d" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2" />
- <dataarea name="flop" size="235160">
- <rom name="microzine jr. no. 10 - disk 1, side 2- snorting the snorks.woz" size="235160" crc="df78d04f" sha1="2aeb83c9d4afcea915b1e51691006a5e9a62485c" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1" />
- <dataarea name="flop" size="235168">
- <rom name="microzine jr. no. 10 - disk 2, side 1- the whale-of-the-month club.woz" size="235168" crc="f3fe6a6f" sha1="b37b4c507b4c8924d0b0f1937004943a8c0e676b" />
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2" />
- <dataarea name="flop" size="235156">
- <rom name="microzine jr. no. 10 - disk 2, side 2- p.s. write back.woz" size="235156" crc="7a23b43c" sha1="456465d26252fea66a0bcca9c54bd379c84ec1d9" />
- </dataarea>
- </part>
- </software>
-
<software name="brainboul">
<description>Brainteaser Boulevard</description>
<year>1982</year>
@@ -22856,7 +9083,7 @@ license:CC0-1.0
<info name="usage" value="Runs on any Apple ][ with 48K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-05-27 -->
- <!--"Brainteaser Boulevard" is a 1982 action game developed by Chuck Bueche (Chuckles), and distributed by California Pacific Computer.-->
+ <!-- "Brainteaser Boulevard" is a 1982 action game developed by Chuck Bueche (Chuckles), and distributed by California Pacific Computer. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234829">
<rom name="brainteaser boulevard.woz" size="234829" crc="20e47c6f" sha1="c91f09c9e06c26aafee5860573f33659af0cfd31" />
@@ -22871,7 +9098,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-05-27 -->
- <!--"Snack Attack and Friends" is a 1982 set of action games developed by Dan Illowsky and distributed by Funtastic.-->
+ <!-- "Snack Attack and Friends" is a 1982 set of action games developed by Dan Illowsky and distributed by Funtastic. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="221478">
<rom name="snack attack and friends.woz" size="221478" crc="4ca1400c" sha1="f19634f3a9d27e7ab05b52107fda14c3fafd56d2" />
@@ -22879,36 +9106,6 @@ license:CC0-1.0
</part>
</software>
- <software name="arbootcamp">
- <description>Arcade Boot Camp</description>
- <year>1984</year>
- <publisher>Penguin Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-05-30 -->
- <!--"Arcade Boot Camp" is a 1984 action game developed by John Besnard and distributed by Penguin Software.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234781">
- <rom name="arcade boot camp.woz" size="234781" crc="0ea6a046" sha1="1ce84102514f89b313a77ab0a4c223003b464316" />
- </dataarea>
- </part>
- </software>
-
- <software name="tankcomm">
- <description>Tank Command</description>
- <year>1980</year>
- <publisher>Brøderbund Software</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-02 -->
- <!--"Tank Command" is a 1980 action game developed by Don Carlston and distributed by Broderbund Software.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234801">
- <rom name="tank command.woz" size="234801" crc="ba81bc2a" sha1="0972d2ce56bb08821de2a9fbebd3ab1fa1ab5b80" />
- </dataarea>
- </part>
- </software>
-
<software name="bandits">
<description>Bandits</description>
<year>1982</year>
@@ -22916,7 +9113,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-02 -->
- <!--"Bandits" is a 1982 action game developed by Tony Ngo and Benny Ngo, and distributed by Sirius Software.-->
+ <!-- "Bandits" is a 1982 action game developed by Tony Ngo and Benny Ngo, and distributed by Sirius Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="831945">
<rom name="bandits.woz" size="831945" crc="b8ecccd6" sha1="3332f86e3fda59e85b2e4f43fe6be6a6dd4f122c" />
@@ -22931,7 +9128,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-02 -->
- <!--"Cyclod" is a 1981 action game developed by Hunter Hancock and distributed by Sirius Software.-->
+ <!-- "Cyclod" is a 1981 action game developed by Hunter Hancock and distributed by Sirius Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="661950">
<rom name="cyclod.woz" size="661950" crc="3e6d5329" sha1="5bf87773451721051597291b3a89b6561832cef1" />
@@ -22946,7 +9143,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-02 -->
- <!--"Fly Wars" is a 1981 action game developed by Duane Later and distributed by Sirius Software.-->
+ <!-- "Fly Wars" is a 1981 action game developed by Duane Later and distributed by Sirius Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="696253">
<rom name="fly wars.woz" size="696253" crc="28556b28" sha1="b8b7ac861abfa678bfa74da546aacaf287eec5c2" />
@@ -22961,7 +9158,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-02 -->
- <!--"Jellyfish" is a 1981 action game developed by Mike Burek and distributed by Sirius Software.-->
+ <!-- "Jellyfish" is a 1981 action game developed by Mike Burek and distributed by Sirius Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="584136">
<rom name="jellyfish.woz" size="584136" crc="ac6392cb" sha1="d3b8d7b9a6c68071675302ba5269094984f3e7d3" />
@@ -22976,7 +9173,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-02 -->
- <!--"Lemmings" is a 1982 action game developed by Dan Thompson and distributed by Sirius Software.-->
+ <!-- "Lemmings" is a 1982 action game developed by Dan Thompson and distributed by Sirius Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="623049">
<rom name="lemmings.woz" size="623049" crc="a89d858a" sha1="2b735e87b522c0e6f35c78cc76c7c698be4eb77f" />
@@ -22991,7 +9188,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-02 -->
- <!--"Minotaur" is a 1981 action game developed by Larry Miller and distributed by Sirius Software. -->
+ <!-- "Minotaur" is a 1981 action game developed by Larry Miller and distributed by Sirius Software. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="736201">
<rom name="minotaur.woz" size="736201" crc="f19e95fe" sha1="4c27d4fe8c6aa5cd6636f57730104d17065767d6" />
@@ -23003,10 +9200,10 @@ license:CC0-1.0
<description>Zork I (Release 15 / UG3AU5)</description>
<year>1980</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1980 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1980 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234846">
<rom name="zork i r15-ug3au5.woz" size="234846" crc="c8444741" sha1="f76f5449f512a51fd2ec9ecb101788a7f32d87a2" />
@@ -23018,10 +9215,10 @@ license:CC0-1.0
<description>Zork I (Release 26 / 820803)</description>
<year>1982</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1982 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1982 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234839">
<rom name="zork i r26-820803.woz" size="234839" crc="adf2bc14" sha1="d0d29c22a9a2aa8a17b969659652974ecf0d1031" />
@@ -23033,10 +9230,10 @@ license:CC0-1.0
<description>Zork I (Release 75 / 830929)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r75-830929-->
+ <!-- "Zork I: The Great Underground Empire" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r75-830929 -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234838">
<rom name="zork i r75-830929.woz" size="234838" crc="c77030b9" sha1="a43acd05641c145b4f4cf999b88c0de5ea854c16" />
@@ -23048,10 +9245,10 @@ license:CC0-1.0
<description>Zork I (Release 75 / 830929-A)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r75-830929-A.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r75-830929-A. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234855">
<rom name="zork i r75-830929-a.woz" size="234855" crc="0411aa71" sha1="ad64c0bb73a0a0063df7a30113af007cb1d2cab6" />
@@ -23063,10 +9260,10 @@ license:CC0-1.0
<description>Zork I (Release 88 / 840726-B)</description>
<year>1984</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r88-840726-B.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r88-840726-B. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234855">
<rom name="zork i r88-840726-b.woz" size="234855" crc="867a247a" sha1="6f96a671428d8b7c1a30c1884c036f81f6e3325d" />
@@ -23081,7 +9278,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r88-840726-F.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r88-840726-F. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234819">
<rom name="zork i r88-840726-f.woz" size="234819" crc="477bac10" sha1="beda0a56ffbeff3293b9b3e467591bb5c45b6c7a" />
@@ -23096,7 +9293,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r88-840726-K.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r88-840726-K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234840">
<rom name="zork i r88-840726-k.woz" size="234840" crc="6fa89a9f" sha1="a3b5e4032194e6e80683feb947f6a4f310ec6187" />
@@ -23111,7 +9308,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork I: The Great Underground Empire" is a 1987 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r52-871125 interpreter 2 version E.-->
+ <!-- "Zork I: The Great Underground Empire" is a 1987 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r52-871125 interpreter 2 version E. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234851">
<rom name="zork i r52-871125-2e.woz" size="234851" crc="06f16814" sha1="87a3e004f25bcee5b549932ac288e6959e59fcad" />
@@ -23123,10 +9320,10 @@ license:CC0-1.0
<description>Zork II (Release 22 / 830331)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork II: The Wizard of Frobozz" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r22-830331.-->
+ <!-- "Zork II: The Wizard of Frobozz" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r22-830331. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234813">
<rom name="zork ii r22-830331.woz" size="234813" crc="67dfcafb" sha1="4c9e4d5dbc212fffd7a4b61880b37df286974839" />
@@ -23138,10 +9335,10 @@ license:CC0-1.0
<description>Zork II (Release 48 / 840904-B)</description>
<year>1984</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork II: The Wizard of Frobozz" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r48-840904-B.-->
+ <!-- "Zork II: The Wizard of Frobozz" is a 1984 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r48-840904-B. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234848">
<rom name="zork ii r48-840904-b.woz" size="234848" crc="664f1d1d" sha1="68006bccc1eaca7a5ff75a94f962ad01d5ccb167" />
@@ -23153,10 +9350,10 @@ license:CC0-1.0
<description>Zork III (Release 10 / 820818)</description>
<year>1982</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork III: The Dungeon Master" is a 1982 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r10-820818.-->
+ <!-- "Zork III: The Dungeon Master" is a 1982 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r10-820818. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234845">
<rom name="zork iii r10-820818.woz" size="234845" crc="7f6b43ed" sha1="1ef5d4205950ef0695974e3f9220baa116a0de72" />
@@ -23168,10 +9365,10 @@ license:CC0-1.0
<description>Zork III (Release 15 / 830331)</description>
<year>1982</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork III: The Dungeon Master" is a 1982 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r15-830331.-->
+ <!-- "Zork III: The Dungeon Master" is a 1982 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r15-830331. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234831">
<rom name="zork iii r15-830331.woz" size="234831" crc="00b4aa4c" sha1="520cd9c2bf07688eca4c23d34861e0466779deef" />
@@ -23183,10 +9380,10 @@ license:CC0-1.0
<description>Zork III (Release 16 / 830410-A)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork III: The Dungeon Master" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r16-830410-A.-->
+ <!-- "Zork III: The Dungeon Master" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r16-830410-A. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234846">
<rom name="zork iii r16-830410-a.woz" size="234846" crc="854aba55" sha1="73fc6758e271cd36b4a1d0894eb4f127ebd638f0" />
@@ -23198,10 +9395,10 @@ license:CC0-1.0
<description>Zork III (Release 17 / 840727-B)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork III: The Dungeon Master" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r17-840727-B.-->
+ <!-- "Zork III: The Dungeon Master" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r17-840727-B. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234832">
<rom name="zork iii r17-840727-b.woz" size="234832" crc="0718a940" sha1="938341ad3ff8a6f95f6f2dc733bd3f5581095972" />
@@ -23216,7 +9413,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Zork III: The Dungeon Master" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r17-840727-K.-->
+ <!-- "Zork III: The Dungeon Master" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r17-840727-K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234847">
<rom name="zork iii r17-840727-k.woz" size="234847" crc="203f7053" sha1="d18069d52f60fd64880ed202c42ca7b7c48a93fe" />
@@ -23228,10 +9425,10 @@ license:CC0-1.0
<description>Deadline (Release 18 / 820311)</description>
<year>1982</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Deadline" is a 1982 adventure game developed by Marc Blank and distributed by Infocom. This is r18-820311.-->
+ <!-- "Deadline" is a 1982 adventure game developed by Marc Blank and distributed by Infocom. This is r18-820311. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="deadline r18-820311.woz" size="234790" crc="8e6edaa5" sha1="8eb51fdf0c585168a206556a954dc27947a51e88" />
@@ -23243,10 +9440,10 @@ license:CC0-1.0
<description>Enchanter (Release 10 / 830810)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Enchanter" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r10-830810.-->
+ <!-- "Enchanter" is a 1983 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r10-830810. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234784">
<rom name="enchanter r10-830810.woz" size="234784" crc="60763f43" sha1="8f3e6a40483d585209a01bf20878cfcb04fa12a0" />
@@ -23261,7 +9458,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Enchanter" is a 1986 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r29-860820-K.-->
+ <!-- "Enchanter" is a 1986 adventure game developed by Dave Lebling and Marc Blank, and distributed by Infocom. This is r29-860820-K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234805">
<rom name="enchanter r29-860820-k.woz" size="234805" crc="d5934041" sha1="60908df09634f990d26753a588f3a0ff98ec0604" />
@@ -23276,7 +9473,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Leather Goddesses of Phobos" is a 1986 adventure game developed by Steve Meretzky and distributed by Infocom. This is r59-860730-K.-->
+ <!-- "Leather Goddesses of Phobos" is a 1986 adventure game developed by Steve Meretzky and distributed by Infocom. This is r59-860730-K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234811">
<rom name="leather goddesses of phobos r59-860730-k.woz" size="234811" crc="67cb82dd" sha1="349537f21244f930548b3f30eb6444762ae4b0b7" />
@@ -23291,7 +9488,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Leather Goddesses of Phobos" is a 1988 adventure game developed by Steve Meretzky and distributed by Infocom. This is r4-880405-2H. -->
+ <!-- "Leather Goddesses of Phobos" is a 1988 adventure game developed by Steve Meretzky and distributed by Infocom. This is r4-880405-2H. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234825">
@@ -23313,7 +9510,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Moonmist" is a 1986 adventure game developed by Stu Galley and Jim Lawrence, and distributed by Infocom. This is r4-860918-K.-->
+ <!-- "Moonmist" is a 1986 adventure game developed by Stu Galley and Jim Lawrence, and distributed by Infocom. This is r4-860918-K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="233537">
<rom name="moonmist r4-860918-k.woz" size="233537" crc="614da672" sha1="1f3917a2193443730d69151d10cfb871999805e2" />
@@ -23328,7 +9525,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Planetfall" is a 1983 adventure game developed by Steve Meretzky and distributed by Infocom. This is r20-830708.-->
+ <!-- "Planetfall" is a 1983 adventure game developed by Steve Meretzky and distributed by Infocom. This is r20-830708. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="240179">
<rom name="planetfall r20-830708.woz" size="240179" crc="3481d11c" sha1="49c2ca8258d753eacd04de33269db9ed7e14c481" />
@@ -23343,7 +9540,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Planetfall" is a 1983 adventure game developed by Steve Meretzky and distributed by Infocom. This is r26-831014.-->
+ <!-- "Planetfall" is a 1983 adventure game developed by Steve Meretzky and distributed by Infocom. This is r26-831014. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234792">
<rom name="planetfall r26-831014.woz" size="234792" crc="c80ce845" sha1="17a4fd05d2d9efe4e5ba1ba29c3978c7d5c2cddb" />
@@ -23358,7 +9555,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Planetfall" is a 1985 adventure game developed by Steve Meretzky and distributed by Infocom. This is r37-851003-H.-->
+ <!-- "Planetfall" is a 1985 adventure game developed by Steve Meretzky and distributed by Infocom. This is r37-851003-H. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234810">
<rom name="planetfall r37-851003-h.woz" size="234810" crc="27890f9e" sha1="bd41171032dcb86fb1dd35eba80c97c1c18f13a6" />
@@ -23373,7 +9570,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Seastalker" is a 1984 adventure game developed by Stu Galley and Jim Lawrence, and distributed by Infocom. This is r15-840501-B.-->
+ <!-- "Seastalker" is a 1984 adventure game developed by Stu Galley and Jim Lawrence, and distributed by Infocom. This is r15-840501-B. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234807">
<rom name="seastalker r15-840501-b.woz" size="234807" crc="b6e4aae5" sha1="237d16df6d47bccd00188f56662e2504ae1b0968" />
@@ -23388,7 +9585,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Seastalker" is a 1985 adventure game developed by Stu Galley and Jim Lawrence, and distributed by Infocom. This is r16-850515-M.-->
+ <!-- "Seastalker" is a 1985 adventure game developed by Stu Galley and Jim Lawrence, and distributed by Infocom. This is r16-850515-M. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234814">
<rom name="seastalker r16-850515-m.woz" size="234814" crc="3966f184" sha1="b0c74b86d1ada2907c47b5442a4922aef4a572dc" />
@@ -23403,7 +9600,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Sherlock: The Riddle of the Crown Jewels" is a 1987 adventure game developed by Bob Bates and distributed by Infocom. This is r21-871214-2F. -->
+ <!-- "Sherlock: The Riddle of the Crown Jewels" is a 1987 adventure game developed by Bob Bates and distributed by Infocom. This is r21-871214-2F. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234841">
@@ -23425,7 +9622,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Sorcerer" is a 1984 adventure game developed by Steve Meretzky and distributed by Infocom. This is r4-840131-A.-->
+ <!-- "Sorcerer" is a 1984 adventure game developed by Steve Meretzky and distributed by Infocom. This is r4-840131-A. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234775">
<rom name="sorcerer r4-840131-a.woz" size="234775" crc="2437c55b" sha1="b924321448bb6df32fbe149e83159fa9217ab3a1" />
@@ -23440,7 +9637,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Sorcerer" is a 1984 adventure game developed by Steve Meretzky and distributed by Infocom. This is r6-840508-F.-->
+ <!-- "Sorcerer" is a 1984 adventure game developed by Steve Meretzky and distributed by Infocom. This is r6-840508-F. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234800">
<rom name="sorcerer r6-840508-f.woz" size="234800" crc="e5b848e9" sha1="4d373f58e17b372b232f600f01ed788cdbe397ae" />
@@ -23455,7 +9652,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Sorcerer" is a 1986 adventure game developed by Steve Meretzky and distributed by Infocom. This is r18-860904-K.-->
+ <!-- "Sorcerer" is a 1986 adventure game developed by Steve Meretzky and distributed by Infocom. This is r18-860904-K. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234795">
<rom name="sorcerer r18-860904-k.woz" size="234795" crc="97ed89fa" sha1="7bb167bccec7359edabdabd3049b2b30e93211bc" />
@@ -23470,7 +9667,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Spellbreaker" is a 1985 adventure game developed by Dave Lebling and distributed by Infocom. This is r63-850916-H.-->
+ <!-- "Spellbreaker" is a 1985 adventure game developed by Dave Lebling and distributed by Infocom. This is r63-850916-H. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234795">
<rom name="spellbreaker r63-850916-h.woz" size="234795" crc="6e7cf1e7" sha1="48e1ac14c365a008e542e51fda8651f4fc63a7a8" />
@@ -23482,10 +9679,10 @@ license:CC0-1.0
<description>Starcross (Release 15 / 820901)</description>
<year>1982</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Starcross" is a 1982 adventure game developed by Dave Lebling and distributed by Infocom. This is r15-820901.-->
+ <!-- "Starcross" is a 1982 adventure game developed by Dave Lebling and distributed by Infocom. This is r15-820901. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234807">
<rom name="starcross r15-820901.woz" size="234807" crc="874f92f6" sha1="f8ca2992f459df55659c5080d5ae553c14f35c07" />
@@ -23497,10 +9694,10 @@ license:CC0-1.0
<description>Suspended (Release 5 / 830222)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Suspended" is a 1983 adventure game developed by Michael Berlyn and distributed by Infocom. This is r5-830222.-->
+ <!-- "Suspended" is a 1983 adventure game developed by Michael Berlyn and distributed by Infocom. This is r5-830222. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="suspended r5-830222.woz" size="234790" crc="9eda72af" sha1="542eafc61fc1df5d677bc8f85e322d8f6994d390" />
@@ -23512,10 +9709,10 @@ license:CC0-1.0
<description>Witness (Release 13 / 830524)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Witness" is a 1983 adventure game developed by Stu Galley and distributed by Infocom. This is r13-830524.-->
+ <!-- "Witness" is a 1983 adventure game developed by Stu Galley and distributed by Infocom. This is r13-830524. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234796">
<rom name="witness r13-830524.woz" size="234796" crc="cc8e3aa2" sha1="1a4eeb66c3655737d619544b02aed45d13475baa" />
@@ -23527,10 +9724,10 @@ license:CC0-1.0
<description>Witness (Release 18 / 830910)</description>
<year>1983</year>
<publisher>Infocom</publisher>
- <info name="usage" value="Runs on any Apple II with 32K." />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
<!-- Dump released: 2023-06-03 -->
- <!--"Witness" is a 1983 adventure game developed by Stu Galley and distributed by Infocom. This is r18-830910.-->
+ <!-- "Witness" is a 1983 adventure game developed by Stu Galley and distributed by Infocom. This is r18-830910. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234803">
<rom name="witness r18-830910.woz" size="234803" crc="0bc7bd08" sha1="d20c556ee72b27f3a9f9578245331b5e59e3387a" />
@@ -23538,1737 +9735,2231 @@ license:CC0-1.0
</part>
</software>
- <software name="getreadadd">
- <description>Getting Ready to Read and Add</description>
- <year>1988</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-04 -->
- <!--"Getting Ready to Read and Add" is a 1988 educational game developed by Softcole and distributed by Sunburst Communications.-->
+ <software name="lurkhorr203m">
+ <description>The Lurking Horror (Release 203 / 870506-M)</description>
+ <year>1987</year>
+ <publisher>Infocom</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-15 -->
+ <!-- "The Lurking Horror" is a 1987 adventure game developed by Dave Lebling and distributed by Infocom. This is r203-870506-M. -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234713">
- <rom name="getting ready to read and add.woz" size="234713" crc="18134755" sha1="190a7727e04b2ccb8fbf9e6884edecf9929185ae" />
+ <dataarea name="flop" size="234818">
+ <rom name="the lurking horror r203-870506-m.woz" size="234818" crc="b1215804" sha1="4d52b2ce4919ec5db7b5513997791442a325420c" />
</dataarea>
</part>
</software>
- <software name="memblocks">
- <description>Memory Building Blocks</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-04 -->
- <!--"Memory Building Blocks" is a 1986 educational game developed by Donna Stanger and David Owen, and distributed by Sunburst Communications.-->
+ <software name="dungdoom">
+ <description>Dungeon of Doom</description>
+ <year>1980</year>
+ <publisher>Argon Games</publisher>
+ <info name="developer" value="Argon Games" />
+ <info name="programmer" value="Stephen G. Walburn" />
+ <info name="programmer" value="Robert J. McCredie" />
+ <info name="usage" value="Requires a 13-sector drive, Integer BASIC, and runs on an Apple ][." />
+ <sharedfeat name="compatibility" value="A2" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2023-02-26 by DefaultGen -->
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234722">
- <rom name="memory building blocks.woz" size="234722" crc="74cca823" sha1="40acd60fa7c83ccd4ef2fda177f041265d51a850" />
+ <dataarea name="flop" size="234496">
+ <rom name="dungdoom.woz" size="234496" crc="4f5a7f61" sha1="4df3288877e8de350e8c7f54f41ef4507131b6a1" />
</dataarea>
</part>
</software>
- <software name="nowseeit">
- <description>Now You See It, Now You Don't: Pick The Part</description>
- <year>1987</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="spaceark">
+ <description>The Space Ark</description>
+ <year>1983</year>
+ <publisher>Datamost</publisher>
+ <info name="programmer" value="Bob Flanagan" />
+ <info name="programmer" value="Art Huff" />
+ <info name="usage" value="Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-07-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 program" />
+ <dataarea name="flop" size="241466">
+ <rom name="the space ark disk 1 - program.woz" size="241466" crc="f06d0291" sha1="b6120380d14d27173829e8bf6f373fd4546a5a39" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 scenario" />
+ <dataarea name="flop" size="241467">
+ <rom name="the space ark disk 2 - scenario.woz" size="241467" crc="e71ac6a4" sha1="378102a4c172d168c05b50f290e073d7504b52ad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cavecr">
+ <description>Cavern Creatures</description>
+ <year>1983</year>
+ <publisher>Datamost</publisher>
+ <info name="programmer" value="Paul Lowrance" />
+ <info name="programmer" value="Art Huff" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-15 -->
- <!--"Now You See It, Now You Don't: Pick The Part" is a 1987 educational game developed by Donna Stanger, Barbara Wood, and Scott Sahs, and distributed by Sunburst Communications.-->
+ <!-- Dump released: 2023-07-27 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234771">
- <rom name="now you see it, now you don't - pick the part.woz" size="234771" crc="9eec9318" sha1="b66ec0e2fadb99b1a8e3b7316fe7a15c926784db" />
+ <dataarea name="flop" size="234788">
+ <rom name="cavern creatures.woz" size="234788" crc="cfad20b4" sha1="29aca73d6cdd7403712e471027d8d680a51ffe01" />
</dataarea>
</part>
</software>
- <software name="muppetwb">
- <description>Muppet Word Book</description>
- <year>1986</year>
+ <software name="argos">
+ <description>Argos</description>
+ <year>1983</year>
+ <publisher>Datamost</publisher>
+ <info name="programmer" value="Ron Lowrance" />
+ <info name="usage" value="Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-07-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="argos.woz" size="234768" crc="f07fdc4c" sha1="221c3a3711e0ca4f20d56f45e78f1fe5ea0ea732" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cyclotron">
+ <description>Cyclotron</description>
+ <year>1982</year>
+ <publisher>Sensible Software</publisher>
+ <info name="programmer" value="Marv Long" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
+ <!-- Dump released: 2023-07-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="174870">
+ <rom name="cyclotron.woz" size="174870" crc="bae28b68" sha1="2cded44e7647dc325b1a7fc6d39d130a823db676" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="123seqme">
+ <description>1-2-3 Sequence Me</description>
+ <year>1991</year>
<publisher>Sunburst Communications</publisher>
+ <info name="developer" value="Infotech Manitoba Educational Technology Program" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-04 -->
- <!--"Muppet Word Book" is a 1986 educational game developed and distributed by Sunburst Communications.-->
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234681">
- <rom name="muppet word book.woz" size="234681" crc="df55fa2b" sha1="fd0f0a4456f848ca99688b6c030e19293670b81a" />
+ <dataarea name="flop" size="234830">
+ <rom name="1-2-3 sequence me.woz" size="234830" crc="ff77d4fa" sha1="138190d4510bfa06f0d622e08183f731c216438f" />
</dataarea>
</part>
</software>
- <software name="rightturn">
- <description>The Right Turn: Strategies in Problem Solving</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="12btunes">
+ <description>12-Bar Tunesmith</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Fred Willman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-04 -->
- <!--"The Right Turn: Strategies in Problem Solving" is a 1986 educational game developed by Thomas C. Bretl and Andrew Armstrong, and distributed by Sunburst Communications.-->
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234761">
- <rom name="the right turn.woz" size="234761" crc="4435697b" sha1="255326b9e6a7bce7909b69954c3d998770787a4d" />
+ <dataarea name="flop" size="234782">
+ <rom name="12-bar tunesmith.woz" size="234782" crc="32314e52" sha1="206eee593830e72a10f8a7a17c101856cc820fca" />
</dataarea>
</part>
</software>
- <software name="royrules">
- <description>The Royal Rules</description>
+ <software name="221baks">
+ <description>221B Baker Street (version 1.1)</description>
<year>1986</year>
- <publisher>Sunburst Communications</publisher>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Jeff Harth" />
+ <info name="programmer" value="Steven Duboff" />
+ <info name="programmer" value="John P. Sohl" />
+ <info name="programmer" value="Russ Wolvek" />
+ <info name="programmer" value="Todd Camasta" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-04 -->
- <!--"The Royal Rules" is a 1986 educational game developed by Tom O'Brien and Raoul Watson, and distributed by Sunburst Communications.-->
+ <!-- Dump released: 2020-02-18 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="234715">
- <rom name="the royal rules disk 1 - program.woz" size="234715" crc="8c70e053" sha1="7ef047f711e1890166d4f06817ed39c6d48dcd5a" />
+ <dataarea name="flop" size="234878">
+ <rom name="221b baker st. disk 1 - program disk.woz" size="234878" crc="c7776abc" sha1="340a2728d675c5dccd3210b29e5dce1fc4388c65" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data disk" />
- <dataarea name="flop" size="234715">
- <rom name="the royal rules disk 2 - data.woz" size="234715" crc="e5565228" sha1="03db61fe88d3c1bcc178f2c34cb6216cbd3e9db3" />
+ <feature name="part_id" value="Disk 2 - Case disk" />
+ <dataarea name="flop" size="234875">
+ <rom name="221b baker st. disk 2 - case disk.woz" size="234875" crc="6da11041" sha1="deae0f24fe1c50f034520840e7760dd859682bb4" />
</dataarea>
</part>
</software>
- <software name="wordamat">
- <description>Word-a-Mation: Exploring Word Relationships</description>
- <year>1986</year>
- <publisher>Sunburst Communications</publisher>
+ <software name="2400ad">
+ <description>2400 A.D.</description>
+ <year>1987</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-04 -->
- <!--"Word-a-Mation: Exploring Word Relationships" is a 1986 educational game developed by Glenn M. Kleiman, Jillian Dorman, and J.B. Shelton, and distributed by Sunburst Communications.-->
+ <!-- Dump released: 2019-06-16. Redumped 2021-07-03 to fix side 2, which should not have write protection. -->
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234771">
- <rom name="word-a-mation.woz" size="234771" crc="565d095c" sha1="97d7e2792aec1c47bfe2fe811420750b0f56c13b" />
+ <feature name="part_id" value="Side A - Program disk" />
+ <dataarea name="flop" size="234834">
+ <rom name="2400 a.d. - program disk.woz" size="234834" crc="54e443c6" sha1="7ff4c81a96d18d89609e3e1d2ed7e79c7cc10597" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Player disk" />
+ <dataarea name="flop" size="234834">
+ <rom name="2400 a.d. - player disk.woz" size="234834" crc="6c1893b0" sha1="d82a0833180147b967eee6cf954b8a7939ca5a02" />
</dataarea>
</part>
</software>
- <software name="trfirstbio">
- <description>Troll First-Start Biographies</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="4tracked">
+ <description>4-Track Editor for Soundchaser Computer Music System</description>
+ <year>1983</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and the Soundchaser Computer Music System." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll First-Start Biographies" is a 1994 educational program developed by Nancy Patrissi (design), Bonnie Seiler (educational consultant), and Alison Bennett (programming), and distributed by Troll Associates.-->
+ <!-- Dump released: 2025-03-17 -->
+ <!-- audio program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234887">
- <rom name="troll first start- biographies.woz" size="234887" crc="d70c5ea4" sha1="acc22d2cbbc71aa1604f9ced69db2299b1e7c6ed" />
+ <dataarea name="flop" size="234789">
+ <rom name="4-track editor for soundchaser.woz" size="234789" crc="535a3091" sha1="876160d44841cb676d2019b1336ed698b653c12a" />
</dataarea>
</part>
</software>
- <software name="firstwrprog">
- <description>First-Start Writing Program</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
+ <software name="816paint">
+ <description>816/Paint (version 3.1 #24721)</description>
+ <year>1987</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="24721" />
<info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="3.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"First-Start Writing Program" is a 1994 educational program developed by Millicent Sabater (design, graphic design, animation), Gregory Truex (design, programming, sound), Bonnie Seiler (educational consultant), and Nancy Patrissi (project manager), and distributed by Troll Associates.-->
+ <!-- Dump released: 2020-04-11 -->
+ <!-- This is the 5.25-inch disk part of version 3.1. -->
+ <!-- graphics utility -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234935">
- <rom name="first-start writing program.woz" size="234935" crc="49f4632c" sha1="2b9f5a1a449f1a3b1349c0311c246c627c6f83bd" />
+ <dataarea name="flop" size="228110">
+ <rom name="816 paint v3.1.woz" size="228110" crc="5348048a" sha1="b8673692b4f3d4e8d2281dc58c48c2facd28a6f2" />
</dataarea>
</part>
</software>
- <software name="trmathwp46">
- <description>Troll Sports Math: Math Word Problems for Grades 4-6</description>
- <year>1991</year>
- <publisher>Troll Associates</publisher>
+ <software name="scruples">
+ <description>A Question of Scruples</description>
+ <year>1988</year>
+ <publisher>Leisure Genius</publisher>
+ <info name="developer" value="Sentient Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll Sports Math: Math Word Problems for Grades 4-6" is a 1991 educational program developed by Millicent Sabater (design, script, animation, graphic design), Gregory Truex (design, script, program coordination), Thomas Whiting (design, programming), and Toby Shack (script), and distributed by Troll Associates.-->
+ <!-- Dump released: 2021-10-30 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234995">
- <rom name="troll sports math- math word problems for grades 4-6.woz" size="234995" crc="8382fd5e" sha1="7a446429f9cd27012ebf12b9b72b8d7f218fd57d" />
+ <feature name="part_id" value="Disk A - Program"/>
+ <dataarea name="flop" size="234838">
+ <rom name="a question of scruples - disk a (program disk).woz" size="234838" crc="8d6b5e39" sha1="fc05cbe47accd7359e439e7bab276e73253ab458" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B - Questions"/>
+ <dataarea name="flop" size="234840">
+ <rom name="a question of scruples - disk b (questions disk).woz" size="234840" crc="e06d7439" sha1="e79bb730be5b7c5455a34c5e1538fc10e24e37ef" />
</dataarea>
</part>
</software>
- <software name="trpmholfun">
- <description>Troll Printmaker: Holiday Fun</description>
- <year>1994</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll Printmaker: Holiday Fun" is a 1994 graphics program developed by Millicent Sabater (design, animation, graphic design), Hudson Ansley (design, programming, sound), Bonnie Seiler (educational consultant), and Nancy Patrissi (project manager), and distributed by Troll Associates.-->
+ <software name="weekchng">
+ <description>A Week That Changed The World</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House"/>
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-18 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="234952">
- <rom name="troll printmaker- holiday fun disk 1 - program.woz" size="234952" crc="cc6585d0" sha1="95b0dec2ec64a26810050014b10f06df2d89489b" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234815">
+ <rom name="a week that changed the world side a.woz" size="234815" crc="e33abc2d" sha1="1cae09d816d7d83e01e4499c76a10bad8a61a618" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data disk" />
- <dataarea name="flop" size="234980">
- <rom name="troll printmaker- holiday fun disk 2 - data.woz" size="234980" crc="519bbe93" sha1="f5d9c9179b31fff7436da523a4ae5ee21fc26265" />
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234848">
+ <rom name="a week that changed the world side b.woz" size="234848" crc="f7b8c847" sha1="cff76d47ced8cd0e92d7e271bbfc010432b18738" />
</dataarea>
</part>
</software>
- <software name="trmc1addsub">
- <description>Troll Math Class Level 1: I Can Add And Subtract</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll Math Class Level 1: I Can Add and Subtract" is a 1987 educational program developed and distributed by Troll Associates.-->
+ <software name="ae">
+ <description>A.E.</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="alt_title" value="AE" />
+ <info name="programmer" value="Jun Wada" />
+ <info name="programmer" value="Makoto Horai" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-05 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234793">
- <rom name="troll math class level 1- i can add and subtract.woz" size="234793" crc="1c6da64d" sha1="d1dfd279d72dad192f5af2c01b2e65b49156212e" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="168206">
+ <rom name="a.e. side a.woz" size="168206" crc="06E2E82A" sha1="DBD31E80D1077788BE5EEBC016C3201DDCB7C026" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234766">
+ <rom name="a.e. side b.woz" size="234766" crc="D0A7DADF" sha1="5A0700AFE19E7C2163BC41E1CF59F81330CE632C" />
</dataarea>
</part>
</software>
- <software name="trmc2carbor">
- <description>Troll Math Class Level 2: I Can Carry and Borrow</description>
+ <software name="ai">
+ <description>A.I.</description>
<year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll Math Class Level 2: I Can Carry and Borrow" is a 1987 educational program developed and distributed by Troll Associates.-->
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234793">
- <rom name="troll math class level 2- i can carry and borrow.woz" size="234793" crc="2fd31af8" sha1="6b62bb9c825f69cae594ab0cf0b50816354323fe" />
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="234784">
+ <rom name="a.i. side a - program.woz" size="234784" crc="f0dec78d" sha1="ffb4db405f11d7367f983ae4a3167a58c87f0318" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Brain Bank" />
+ <dataarea name="flop" size="234787">
+ <rom name="a.i. side b - brain bank.woz" size="234787" crc="04755405" sha1="4883d1b37c51d3b8dec3d3eeed4364ac1b9b5219" />
</dataarea>
</part>
</software>
- <software name="trmc6ratper">
- <description>Troll Math Class Level 6: Ratio, Proportion, and Percent</description>
- <year>1989</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll Math Class Level 6: Ratio, Proportion, and Percent" is a 1989 educational program developed by Nancy Patrissi (design, graphics), Millicent Sabater (design, graphics), Gregory Truex (design, programming, sound), Mark Barone (programming, sound), and Bernie Gallagher (programming, sound), and distributed by Troll Associates.-->
+ <software name="aisdqsample">
+ <description>Accessing Information Series: Databases in the Classroom: Dataquest: Sampler (A-173 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-173" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234996">
- <rom name="troll math class level 6- ratio, proportion, and percent.woz" size="234996" crc="fe732cf1" sha1="4d589415a44f4d49eb070afcbad77eb39a02f907" />
+ <dataarea name="flop" size="234791">
+ <rom name="dataquest- sampler v1.0.woz" size="234791" crc="4614b4ca" sha1="0990bc15bdec596603cb4d6f632f29547df9d795" />
</dataarea>
</part>
</software>
- <software name="trmckcount">
- <description>Troll Math Class Level K: I Can Count</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="aismdqpres11" cloneof="aismdqpres">
+ <description>Accessing Information Series: MECC Dataquest: The Presidents (A-140 version 1.1)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-140" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Troll Math Class Level K: I Can Count" is a 1987 educational program developed and distributed by Troll Associates.-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234782">
- <rom name="troll math class level k- i can count.woz" size="234782" crc="c82e7d04" sha1="6ea3cf8563393e743df0e07a122e78e89be499e7" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234805">
+ <rom name="mecc dataquest- the presidents v1.1 side a.woz" size="234805" crc="474553d5" sha1="9a6e9b4d2f1a2abc56f2344afb5eeed17194bc26" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234805">
+ <rom name="mecc dataquest- the presidents v1.1 side b.woz" size="234805" crc="0918cfff" sha1="0648dea58422b86c7a8472e8d8614177825c3a7f" />
</dataarea>
</part>
</software>
- <software name="catdetgames">
- <description>Categorizing: Detective Games</description>
- <year>1988</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="aismdqpres">
+ <description>Accessing Information Series: MECC Dataquest: The Presidents (A-140 version 1.2)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-140" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Categorizing: Detective Games" is a 1988 educational program developed by Peggy Brennan (design, graphics), Lawrence Comella (design), Bernie Gallagher (design, programming, sound), Nancy Patrissi (design, graphics), Gregory Truex (design, programming), Millicent Sabater (graphics), and Steven Martin (sound), and distributed by Troll Associates.-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="235033">
- <rom name="categorizing- detective games.woz" size="235033" crc="a0f9a0da" sha1="510c5bcebba1c16f5c64dffbf44f708c0e41eb53" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234805">
+ <rom name="mecc dataquest- the presidents v1.2 side a.woz" size="234805" crc="6e3d2c1b" sha1="46e45f560d98fcd300224659608c65c6b463dcaa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234805">
+ <rom name="mecc dataquest- the presidents v1.2 side b.woz" size="234805" crc="23bcdad9" sha1="9c4c5bafeb5f3401a278fca30b919b548d15a6e5" />
</dataarea>
</part>
</software>
- <software name="animhomes">
- <description>Animal Homes and Stories</description>
- <year>1992</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Animal Homes and Stories" is a 1992 educational program developed by Nancy Patrissi (design, script, graphics, animation) and Gregory Truex (programming, sound), and distributed by Troll Associates.-->
+ <software name="aismdqwc">
+ <description>Accessing Information Series: MECC Dataquest: The World Community (A-197 version 1.1)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-197" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234890">
- <rom name="animal homes and stories.woz" size="234890" crc="42d55f81" sha1="7eac250d7998ebd1492aa3933b1742cb6fd362e9" />
+ <dataarea name="flop" size="234807">
+ <rom name="mecc dataquest- the world community v1.1.woz" size="234807" crc="111b1a2f" sha1="ec49795df3aaabfab0eb0e3499704ba50d2e1015" />
</dataarea>
</part>
</software>
- <software name="lrnmoney">
- <description>Let's Learn About Money</description>
- <year>1986</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Let's Learn About Money" is a 1986 educational program developed and distributed by Troll Associates.-->
+ <software name="aisstufffet">
+ <description>Accessing Information Series: MECC Stuff and Fetch (A-138 version 1.0)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-138" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="let's learn about money.woz" size="234791" crc="434ccb3b" sha1="b3db5d2e2bb3c7c0e53ac1c2b94d893672e4a693" />
+ <dataarea name="flop" size="234793">
+ <rom name="mecc stuff and fetch v1.0.woz" size="234793" crc="825a8765" sha1="586d8d7f572c532de1b0a5815ec0d9a0460f5c6f" />
</dataarea>
</part>
</software>
- <software name="shopright">
- <description>Shop Right!</description>
- <year>1987</year>
- <publisher>Troll Associates</publisher>
+ <software name="acctrecv">
+ <description>Accounts Receivable (version 2.1) (Softsmith)</description>
+ <year>1980</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Continental Software" />
+ <info name="original_publisher" value="Continental Software" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Shop Right!" is a 1987 educational program developed and distributed by Troll Associates.-->
+ <!-- Dump released: 2024-11-17 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234748">
- <rom name="shop right.woz" size="234748" crc="07a0bdd7" sha1="143a23e2b6a140ea0751ba9c03cf34c11f604f4a" />
+ <dataarea name="flop" size="234774">
+ <rom name="accounts receivable (softsmith).woz" size="234774" crc="bd2ff494" sha1="f73020f8251eedee1906cec6d7feccbf6ddde889" />
</dataarea>
</part>
</software>
- <software name="magicstr">
- <description>The Magic String</description>
- <year>1985</year>
- <publisher>Troll Associates</publisher>
+ <software name="acedet_525" cloneof="acedet">
+ <description>Ace Detective (version 1987)</description>
+ <year>1987</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"The Magic String" is a 1985 educational program developed and distributed by Troll Associates.-->
+ <!-- Dump released: 2020-06-02 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234769">
- <rom name="the magic string.woz" size="234769" crc="3af82aa1" sha1="badc2580ea7c5f913a1df5f6a1d1d7d66e0bc612" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234765">
+ <rom name="ace detective side a.woz" size="234765" crc="f15e90d7" sha1="0db5bcae7a74a3b54653f6e5d606d61f753b5dcd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234765">
+ <rom name="ace detective side b.woz" size="234765" crc="f17ded31" sha1="8fd63bd6de73e99ab1a51daa3a23e7498ea61276" />
</dataarea>
</part>
</software>
- <software name="thundlight">
- <description>Thunder and Lightning</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Thunder and Lightning" is a 1984 educational program developed and distributed by Troll Associates.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234774">
- <rom name="thunder and lightning.woz" size="234774" crc="c0cd6639" sha1="98e8e940a691637629a4e73853b47a947855eacd" />
+ <software name="acedet">
+ <description>Ace Detective (version 1990) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MindPlay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a ROM3 Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-17 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1296178">
+ <rom name="ace detective 800k disk 1.woz" size="1296178" crc="a4b10736" sha1="e154e0bdd97daf924ca4dd7475a97003f8981810" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296145">
+ <rom name="ace detective 800k disk 2.woz" size="1296145" crc="fe981db8" sha1="34460241e5c1f2a6bd4befcd13ae32d5639c6e70" />
</dataarea>
</part>
</software>
- <software name="catskitt">
- <description>Cats and Kittens</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Cats and Kittens" is a 1984 educational program developed and distributed by Troll Associates. "Cats and Kittens" is a 1984 educational program developed and distributed by Troll Associates. -->
+ <software name="aceyduecls" cloneof="aceyduec">
+ <description>Acey-Deucey (L &amp; S Computerware)</description>
+ <year>1982</year>
+ <publisher>L &amp; S Computerware</publisher>
+ <info name="programmer" value="Larry Sherman" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-04-28 -->
+ <!-- card game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234753">
- <rom name="cats and kittens.woz" size="234753" crc="1cd14071" sha1="934e692bb045180a5e42f4f1bf7f78b6d729f0b6" />
+ <dataarea name="flop" size="61652">
+ <rom name="acey-deucey.woz" size="61652" crc="6a372c08" sha1="f3c467cfe38e27b94edb353e566ccf9a8a417119" />
</dataarea>
</part>
</software>
- <software name="pecosbill">
- <description>Pecos Bill</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Pecos Bill" is a 1984 educational program developed and distributed by Troll Associates.-->
+ <software name="aceyduec">
+ <description>Acey-Deucey (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="L &amp; S Computerware" />
+ <info name="programmer" value="Larry Sherman" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- card game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234747">
- <rom name="pecos bill.woz" size="234747" crc="4f1da17f" sha1="5d100b2566c060bd85038ec3b99e459695d30ff7" />
+ <dataarea name="flop" size="61697">
+ <rom name="acey deucey (softsmith).woz" size="61697" crc="a7a775a7" sha1="a4050ce3c2b49865dab1c2837a8e6882e704342d" />
</dataarea>
</part>
</software>
- <software name="creatnight">
- <description>Creatures of the Night</description>
+ <software name="addmagic">
+ <description>Addition Magician</description>
<year>1984</year>
- <publisher>Troll Associates</publisher>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Dale DeSharone" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Creatures of the Night" is a 1984 educational program developed and distributed by Troll Associates.-->
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234759">
- <rom name="creatures of the night.woz" size="234759" crc="6e56e0ed" sha1="dfda21843c82fddd9c37c874ac971e667e591d50" />
+ <dataarea name="flop" size="121624">
+ <rom name="addition magician.woz" size="121624" crc="a459c137" sha1="cb5d165813e8df58f389acf8d2104088584fceae" />
</dataarea>
</part>
</software>
- <software name="birds">
- <description>Birds</description>
- <year>1984</year>
- <publisher>Troll Associates</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-11 -->
- <!--"Birds" is a 1984 educational program developed and distributed by Troll Associates. -->
+ <software name="advbwalk">
+ <description>Advance to Boardwalk</description>
+ <year>1990</year>
+ <publisher>GameTek</publisher>
+ <info name="developer" value="GameTek" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234742">
- <rom name="birds.woz" size="234742" crc="e5d817bf" sha1="75928bbddc9ebedf98cd5724342b85c5ea27a6ac" />
+ <dataarea name="flop" size="234734">
+ <rom name="advance to boardwalk.woz" size="234734" crc="a7b89d2d" sha1="8cb709d0f8b0f3b6c7a1b6b3c074b944207dda19" />
</dataarea>
</part>
</software>
- <software name="lurkhorr203m">
- <description>The Lurking Horror (Release 203 / 870506-M)</description>
- <year>1987</year>
- <publisher>Infocom</publisher>
- <info name="usage" value="Requires a 48K Apple ][ or later." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-15 -->
- <!--"The Lurking Horror" is a 1987 adventure game developed by Dave Lebling and distributed by Infocom. This is r203-870506-M.-->
+ <software name="chkrynn10" cloneof="chkrynn">
+ <description>Advanced Dungeons &amp; Dragons: Champions of Krynn (version 1.0)</description>
+ <year>1990</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jim Jennings" />
+ <info name="programmer" value="Dave Shelley" />
+ <info name="programmer" value="Michael Mancuso" />
+ <info name="programmer" value="Ken Humphries" />
+ <info name="programmer" value="Susan Manley" />
+ <info name="programmer" value="Fred Butts" />
+ <info name="programmer" value="Mike Provenza" />
+ <info name="programmer" value="Mark Johnson" />
+ <info name="programmer" value="Cyrus Lum" />
+ <info name="programmer" value="Tom Wahl" />
+ <info name="programmer" value="Dave Warhol" />
+ <info name="usage" value="Requires a 128K enhanced Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-27 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234818">
- <rom name="the lurking horror r203-870506-m.woz" size="234818" crc="b1215804" sha1="4d52b2ce4919ec5db7b5513997791442a325420c" />
+ <feature name="part_id" value="Boot" />
+ <dataarea name="flop" size="234959">
+ <rom name="champions of krynn v1.0 - boot disk.woz" size="234959" crc="851f9390" sha1="937e3611d2b7bf32a3952b7bbf00d80776f545d4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234956">
+ <rom name="champions of krynn v1.0 - side a.woz" size="234956" crc="fa5224fa" sha1="d35caa08bf950e651d1e7b1cc16fd5edcb6e1584" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234956">
+ <rom name="champions of krynn v1.0 - side b.woz" size="234956" crc="30b9883d" sha1="8d6c86a45b7ba82b5ad21ff73ffaf92e82570b5e" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side C" />
+ <dataarea name="flop" size="234956">
+ <rom name="champions of krynn v1.0 - side c.woz" size="234956" crc="609be0c4" sha1="628b1d774a041d71fdfcdc2d42b5e5fa803aba29" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Side D" />
+ <dataarea name="flop" size="234956">
+ <rom name="champions of krynn v1.0 - side d.woz" size="234956" crc="31c3c9e6" sha1="2cd860e0dcd40ed78d849fab580005e698532a3f" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Side E" />
+ <dataarea name="flop" size="234956">
+ <rom name="champions of krynn v1.0 - side e.woz" size="234956" crc="232d4c48" sha1="f2eb615e87a59abbc9e13f29e80a62a923cdcb2d" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Side F" />
+ <dataarea name="flop" size="234956">
+ <rom name="champions of krynn v1.0 - side f.woz" size="234956" crc="b8c9e35f" sha1="5fa294c704541afa8018bd5df1fded18b7d40400" />
</dataarea>
</part>
</software>
- <software name="ev3socstud48">
- <description>Elementary Volume 3: Social Studies (version 4.8)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-15 -->
- <!--"Elementary Volume 3: Social Studies" is a 1980 educational program developed and distributed by MECC. This is version 4.8.-->
+ <software name="chkrynn">
+ <description>Advanced Dungeons &amp; Dragons: Champions of Krynn (version 1.1)</description>
+ <year>1990</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jim Jennings" />
+ <info name="programmer" value="Dave Shelley" />
+ <info name="programmer" value="Michael Mancuso" />
+ <info name="programmer" value="Ken Humphries" />
+ <info name="programmer" value="Susan Manley" />
+ <info name="programmer" value="Fred Butts" />
+ <info name="programmer" value="Mike Provenza" />
+ <info name="programmer" value="Mark Johnson" />
+ <info name="programmer" value="Cyrus Lum" />
+ <info name="programmer" value="Tom Wahl" />
+ <info name="programmer" value="Dave Warhol" />
+ <info name="usage" value="Requires a 128K enhanced Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-27 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234818">
- <rom name="elementary volume 3- social studies v4.8.woz" size="234818" crc="fbfe1826" sha1="1ffbe90485e958be71a0f1e0771471ef50ac084f" />
+ <feature name="part_id" value="Boot" />
+ <dataarea name="flop" size="234932">
+ <rom name="champions of krynn v1.1 - boot disk.woz" size="234932" crc="31dfafba" sha1="6d7adbe27c4a33ba2b865845280efe9aa2ea1402" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234929">
+ <rom name="champions of krynn v1.1 - side a.woz" size="234929" crc="2d84ec45" sha1="39c90b534e750fc21b057fa19a66db9e20aa8c95" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234929">
+ <rom name="champions of krynn v1.1 - side b.woz" size="234929" crc="01da00f5" sha1="9cd679f0c3ab9d9408595a790450c153ba074bc1" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side C" />
+ <dataarea name="flop" size="234929">
+ <rom name="champions of krynn v1.1 - side c.woz" size="234929" crc="7ec8c260" sha1="1f77e6cf41defdfc4c2319e4f9117561630ece33" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Side D" />
+ <dataarea name="flop" size="234929">
+ <rom name="champions of krynn v1.1 - side d.woz" size="234929" crc="e8130749" sha1="a9b620d8ec67b04f7a18645b07197df5bbfab2a3" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Side E" />
+ <dataarea name="flop" size="234929">
+ <rom name="champions of krynn v1.1 - side e.woz" size="234929" crc="069d1f35" sha1="45e97175032081e90f7f8f3ce10b6beb6fcd5ac6" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Side F" />
+ <dataarea name="flop" size="234929">
+ <rom name="champions of krynn v1.1 - side f.woz" size="234929" crc="bf6ef76b" sha1="4ba7506f2ddbbb8d5ffcd559f27e3606b666f303" />
</dataarea>
</part>
</software>
- <software name="ev5langart15">
- <description>Elementary Volume 5: Language Arts (Prefixes) (version 1.5)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="advmthsh">
+ <description>Advanced Math Shop</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-15 -->
- <!--"Elementary Volume 5: Language Arts (Prefixes)" is a 1980 educational program developed and distributed by MECC. This is version 1.5.-->
+ <!-- Dump released: 2019-07-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234828">
- <rom name="elementary volume 5- language arts (prefixes) v1.5.woz" size="234828" crc="3b73dd41" sha1="8392bd51e6e6054a8c27ed617573d6bd41ab524e" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234793">
+ <rom name="advanced math shop side a.woz" size="234793" crc="373b3e89" sha1="d893a98d8311e09c7aecaa83e1378718a8d8dd1b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234793">
+ <rom name="advanced math shop side b.woz" size="234793" crc="d4fe68d1" sha1="9fefefe1459dbc87a620e5b520a182cec2a8cdec" />
</dataarea>
</part>
</software>
- <software name="ev8geopts10">
- <description>Elementary Volume 8: Geometry (Points and Angles) (version 1.0)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="advconst">
+ <description>Adventure Construction Set</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Stuart Smith" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Elementary Volume 8: Geometry (Points and Angles)" is a 1981 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2019-12-17 -->
+ <!-- game development program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241472">
- <rom name="elementary volume 8- geometry (points and angles) v1.0.woz" size="241472" crc="83bfd0f6" sha1="9c84e924ce6db91f5656ad88a6a32960ae0436c1" />
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="228148">
+ <rom name="adventure construction set disk 1a.woz" size="228148" crc="022a20bc" sha1="5594992d7ffeaeb01f74f9c37ba2456a86526a9c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234811">
+ <rom name="adventure construction set disk 1b.woz" size="234811" crc="2adc0181" sha1="f2d67823dd388d908b54ed3a369aa75afaf438dc" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234801">
+ <rom name="adventure construction set disk 2a.woz" size="234801" crc="fa373c36" sha1="9c415fbfa4ecb4dc99b17f58f0846c3c744d77f2" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234808">
+ <rom name="adventure construction set disk 2b.woz" size="234808" crc="60c30a5e" sha1="fabefc06dd40ef79952a4f099b1cad70b386b02e" />
</dataarea>
</part>
</software>
- <software name="ev9geolin21">
- <description>Elementary Volume 9: Geometry (Lines and Triangles) (version 2.1)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
+ <software name="advcreat">
+ <description>Adventure Creator</description>
+ <year>1984</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="programmer" value="Dale DeSharon" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Elementary Volume 9: Geometry (Lines and Triangles)" is a 1981 educational program developed and distributed by MECC. This is version 2.1.-->
+ <!-- Dump released: 2024-11-21 -->
+ <!-- game development -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241490">
- <rom name="elementary volume 9- geometry (lines and triangles) v2.1.woz" size="241490" crc="13a9f0b4" sha1="0d052f5edf3b38c5357ae62dcc422a27c57442e2" />
+ <dataarea name="flop" size="234772">
+ <rom name="adventure creator.woz" size="234772" crc="545f9741" sha1="256abe09b11a16f773ff7bdb9869f0926753a5a4" />
</dataarea>
</part>
</software>
- <software name="ev10geoquad10">
- <description>Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter) (version 1.0)</description>
+ <software name="advtime">
+ <description>Adventure in Time</description>
<year>1981</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter)" is a 1981 educational program developed and distributed by MECC. This is version 1.0.-->
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Paul L. Berker" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-07 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241490">
- <rom name="elementary volume 10- geometry (quadrilaterals- area and perimeter) v1.0.woz" size="241490" crc="91f53af0" sha1="cc4f852f606158fead49a2b6a4ff11bd9b4f9079" />
+ <dataarea name="flop" size="234773">
+ <rom name="adventure in time.woz" size="234773" crc="8d6797b1" sha1="9f5f5f4e4e7435dc836b369a70e89ef07dc78d37" />
</dataarea>
</part>
</software>
- <software name="ev10geoquad11">
- <description>Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter) (version 1.1)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
+ <software name="advinspc">
+ <description>Adventures in Space</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter)" is a 1981 educational program developed and distributed by MECC. This is version 1.1.-->
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241506">
- <rom name="elementary volume 10- geometry (quadrilaterals- area and perimeter) v1.1.woz" size="241506" crc="668e0b82" sha1="9e94739fcb09e82092874c8b6f432a50a6a63ca4" />
+ <dataarea name="flop" size="234770">
+ <rom name="adventures in space.woz" size="234770" crc="7ef81a5a" sha1="6f3bbdb6d7b8045ddc03ac07763fec70ee7d8a1c" />
</dataarea>
</part>
</software>
- <software name="ev12langart10">
- <description>Elementary Volume 12: Language Arts (SIMS) (version 1.0)</description>
- <year>1980</year>
+ <software name="advfrac10">
+ <description>Adventures with Fractions (A-774 version 1.0)</description>
+ <year>1983</year>
<publisher>MECC</publisher>
+ <info name="partno" value="A-774" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Mike Boucher" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Elementary Volume 12: Language Arts (SIMS)" is a 1980 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234825">
- <rom name="elementary volume 12- language arts (sims) v1.0.woz" size="234825" crc="e235ef4f" sha1="f9ac0070cf835e36c3695d9c3fb91660870bf7b1" />
+ <dataarea name="flop" size="234800">
+ <rom name="adventures with fractions v1.0.woz" size="234800" crc="b9cee37c" sha1="f93862c552c9954d6c695518dfb4d56e84dd9c32" />
</dataarea>
</part>
</software>
- <software name="engposp15">
- <description>English Parts of Speech (version 1.5)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
+ <software name="adverbcl">
+ <description>Adverbial Clauses (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"English Parts of Speech" is a 1981 educational program developed and distributed by MECC. This is version 1.5.-->
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234831">
- <rom name="english parts of speech v1.5.woz" size="234831" crc="26c21abb" sha1="f0544ae50451e2a52ba2345acf102d65cf863429" />
+ <dataarea name="flop" size="234769">
+ <rom name="adverbial clauses 1988.woz" size="234769" crc="f1cf101b" sha1="7e77bdac9823b2236a1d2595abd895a457628271" />
</dataarea>
</part>
</software>
- <software name="estimation10">
- <description>Estimation (version 1.0)</description>
+ <software name="agentusa">
+ <description>Agent USA</description>
<year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Estimation" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar Khudari" />
+ <info name="programmer" value="Chris Lutes" />
+ <info name="programmer" value="Peter Reynolds" />
+ <info name="programmer" value="Leonard Bertoni" />
+ <info name="usage" value="Runs on any Apple ][ model with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-15 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234769">
- <rom name="estimation v1.0.woz" size="234769" crc="75497413" sha1="cb149527c1dfeb0fd29686bb233b186af84a3407" />
+ <dataarea name="flop" size="80443">
+ <rom name="agent usa.woz" size="80443" crc="c998fa8f" sha1="964336e9f3f6e778232ed6174864e12b337ffa67" />
</dataarea>
</part>
</software>
- <software name="expprocs10">
- <description>Experiencing Procedures (version 1.0)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
+ <software name="agsubverb">
+ <description>Agreement of Subject and Verb (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Experiencing Procedures" is a 1983 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234798">
- <rom name="experiencing procedures v1.0.woz" size="234798" crc="862bf554" sha1="56923d20ba66d317971e52869cd00fc8b9d4866b" />
+ <dataarea name="flop" size="234781">
+ <rom name="agreement of subject and verb 1988.woz" size="234781" crc="573b7647" sha1="52bee5773dcc526ad27c6804fd43ac55238c8c6c" />
</dataarea>
</part>
</software>
- <software name="expsorting10">
- <description>Exploring Sorting Routines (version 1.0)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Exploring Sorting Routines" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
+ <software name="airheart">
+ <description>Airheart</description>
+ <year>1986</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Dan Gorlin" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-12 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234801">
- <rom name="exploring sorting routines v1.0.woz" size="234801" crc="e58c43d5" sha1="f50914e8726d198db50c76c017c48d96495acb0b" />
+ <dataarea name="flop" size="240141">
+ <rom name="airheart.woz" size="240141" crc="2685473f" sha1="a20a23a55639154bc2f6bab4cf27895187413b6b" />
</dataarea>
</part>
</software>
- <software name="extappbas10">
- <description>Extensions to Applesoft BASIC (version 1.0)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Extensions to Applesoft BASIC" is a 1983 educational program developed and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234804">
- <rom name="extensions to applesoft basic v1.0.woz" size="234804" crc="84e3f14a" sha1="d0e25c453277758c80bc9e1b1491c4a797b0eed7" />
+ <software name="algblast">
+ <description>Alge-Blaster! (version 050187) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson, Ph.D." />
+ <info name="programmer" value="Anders Beitnes" />
+ <info name="programmer" value="Wendy Barels" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="050187" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1328988">
+ <rom name="alge-blaster 800k.woz" size="1328988" crc="62bffa5f" sha1="ccb4c3c43d3b7ad13cd3c7e5f2b59434af0b1e08" />
</dataarea>
</part>
</software>
- <software name="extappbas12">
- <description>Extensions to Applesoft BASIC (version 1.2)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Ext"Extensions to Applesoft BASIC" is a 1983 educational program developed and distributed by MECC. This is version 1.2.-->
+ <software name="algblap10_525" cloneof="algblap">
+ <description>Alge-Blaster Plus! (version 1.0)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="David Ely" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a 128K Apple //e or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234804">
- <rom name="extensions to applesoft basic v1.2.woz" size="234804" crc="27c633fd" sha1="4778dd901716c11c95a9302dfc013c769f74b49e" />
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="235558">
+ <rom name="alge-blaster plus disk 1a - program.woz" size="235558" crc="8949439c" sha1="324a964cdc85587b58406e681b53ff6f4a34c6b5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="235558">
+ <rom name="alge-blaster plus disk 1b - program.woz" size="235558" crc="fe90af41" sha1="99c0687e3528fa68051819525d853f3364987112" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Data" />
+ <dataarea name="flop" size="242211">
+ <rom name="alge-blaster plus disk 2a - data.woz" size="242211" crc="9f5c5a16" sha1="90df326dae57a73c6e0026a266d4c9ea4b36d883" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Data" />
+ <dataarea name="flop" size="235555">
+ <rom name="alge-blaster plus disk 2b - data.woz" size="235555" crc="5ec77a0c" sha1="9e927f169102d39a1c882ca1c41755f0527ef08d" />
</dataarea>
</part>
</software>
- <software name="genetics11">
- <description>Genetics (version 1.1)</description>
+ <software name="algblap">
+ <description>Alge-Blaster Plus! (version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="David Ely" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296215">
+ <rom name="alge-blaster plus v1.0 800k.woz" size="1296215" crc="e3cdd077" sha1="c8654d483ac58e75789106da606ed7b7484511e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="algactn">
+ <description>Algebra Action: Courseware for Algebra I</description>
<year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <publisher>Houghton Mifflin</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="usage" value="Requires an 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Genetics" is a 1986 educational program developed and distributed by MECC. This is version 1.1.-->
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234783">
- <rom name="genetics v1.1.woz" size="234783" crc="fc13bf99" sha1="cc360e71043c3d55d79d5deca34e103620c18883" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234774">
+ <rom name="algebra action disk 1.woz" size="234774" crc="f0da4eea" sha1="98db85d035a7bef178b23a68d9cd39d9a80a68b3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234774">
+ <rom name="algebra action disk 2.woz" size="234774" crc="c5c2e25c" sha1="fe8d78d5def4e210b98e94bf2afcdfdeb9731bad" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234774">
+ <rom name="algebra action disk 3.woz" size="234774" crc="d19c2431" sha1="356a3e51e5d7da252bde758cf1019bf0d59d2563" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4" />
+ <dataarea name="flop" size="234774">
+ <rom name="algebra action disk 4.woz" size="234774" crc="7d40acba" sha1="8c40cc0080977fc7f2b4a11ae4911aa6644b403d" />
</dataarea>
</part>
</software>
- <software name="growgfrac10">
- <description>Growgins' Fractions (version 1.0)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-16 -->
- <!--"Growgins' Fractions" is a 1983 educational program developed and distributed by MECC. This is version 1.0.-->
+ <software name="algplotp">
+ <description>Algebra Plotter Plus</description>
+ <year>1990</year>
+ <publisher>Houghton Mifflin</publisher>
+ <info name="programmer" value="David L. Myers" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234794">
- <rom name="growgins' fractions v1.0.woz" size="234794" crc="623ddf82" sha1="6f956b5df17b37c671bae774af18684326828df9" />
+ <dataarea name="flop" size="234773">
+ <rom name="algebra plotter plus.woz" size="234773" crc="d0042db1" sha1="a01f425a4fe0c17782f123c1476ad25455f9dcc5" />
</dataarea>
</part>
</software>
- <software name="mastspell13">
- <description>Master Spell (version 1.3)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="algeshop">
+ <description>Algebra Shop</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Master Spell" is a 1984 educational program developed and distributed by MECC. This is version 1.3.-->
+ <!-- Dump released: 2019-07-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234787">
- <rom name="master spell v1.3.woz" size="234787" crc="3161ab8d" sha1="008ae63ec96307253c6e4bf12dd3b1ae971c717d" />
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="235547">
+ <rom name="algebra shop - disk 1, side a.woz" size="235547" crc="e1ec2c11" sha1="57582c651bda902821beb7c179da3a15d26b88aa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="235547">
+ <rom name="algebra shop - disk 1, side b.woz" size="235547" crc="58b54d48" sha1="c327fd58ffcb53faabc66f6f546ea2a6cd7a57ae" />
</dataarea>
</part>
</software>
- <software name="mv1grapheq32">
- <description>Mathematics Volume 1: Graphing, Logic, and Equations (version 3.2)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
+ <software name="algv1v13s">
+ <description>Algebra Volume 1 (version 1.3, 31-DEC-81) (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Edu-Ware Services" />
+ <info name="original_publisher" value="Edu-Ware Services" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3, 31-DEC-81" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Mathematics Volume 1: Graphing, Logic, and Equations" is a 1980 educational program developed and distributed by MECC. This is version 3.2.-->
+ <!-- Dump released: 2021-06-26 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241491">
- <rom name="mathematics volume 1- graphing v3.2.woz" size="241491" crc="98e612b1" sha1="e2c912253031eecaef450a664bc671ab8d34c20c" />
+ <dataarea name="flop" size="241426">
+ <rom name="algebra volume i v1.3 (softsmith).woz" size="241426" crc="9b6d74af" sha1="60d0733e272296c0b301614d47031619b946c545" />
</dataarea>
</part>
</software>
- <software name="mv2meas12">
- <description>Mathematics Volume 2: Measurement (version 1.2)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
+ <software name="algwdpr83" cloneof="algwdpr">
+ <description>Algebra Word Problems (version 1983)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Mathematics Volume 2: Measurement" is a 1981 educational program developed and distributed by MECC. This is version 1.2.-->
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241472">
- <rom name="mathematics volume 2- measurement v1.2.woz" size="241472" crc="4d73165b" sha1="0f5643f30b0a795748ac44a0afb96d0ef630ba7c" />
+ <dataarea name="flop" size="234803">
+ <rom name="algebra word problems.woz" size="234803" crc="adf0cca7" sha1="235eddb8d8fe76dcc16a9a92178b97815ee941c0" />
</dataarea>
</part>
</software>
- <software name="mv3formsk13">
- <description>Mathematics Volume 3: Formulas, Shapes, and Skills (version 1.3)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
+ <software name="algwdpr">
+ <description>Algebra Word Problems (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Mathematics Volume 3: Formulas, Shapes, and Skills" is a 1981 educational program developed and distributed by MECC. This is version 1.3.-->
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241500">
- <rom name="mathematics volume 3- geometry v1.3.woz" size="241500" crc="bed9c7ff" sha1="412ccc65488143f4570a332b132459513e76d431" />
+ <dataarea name="flop" size="234772">
+ <rom name="algebra word problems 1988.woz" size="234772" crc="1ce80e6e" sha1="030d008a530d06812277479a49cdeb055dd7b36a" />
</dataarea>
</part>
</software>
- <software name="mv3formsk13l">
- <description>Mathematics Volume 3: Formulas, Shapes, and Skills (version 1.3) (limited boot backup)</description>
- <year>1981</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="algernon">
+ <description>Algernon: An Introduction to Programming Logic</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom Bretl" />
+ <info name="programmer" value="Larry Bank" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Mathematics Volume 3: Formulas, Shapes, and Skills" is a 1981 educational program developed and distributed by MECC. This is a "limited boot backup" of version 1.3 which could only be booted a fixed number of times before self-destructing by overwriting its own disk catalog track. -->
+ <!-- Dump released: 2020-05-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234865">
- <rom name="mathematics volume 3- geometry v1.3 (limited boot backup).woz" size="234865" crc="6dde6c03" sha1="e6e0f5b51bc4ce9c54f41bf02e66de5e5493abdf" />
+ <dataarea name="flop" size="241430">
+ <rom name="algernon.woz" size="241430" crc="64fe4b81" sha1="3dabbf3283441447dc5aa8c31a13d3a33aa6d507" />
</dataarea>
</part>
</software>
- <software name="meccappdem11">
- <description>MECC Apple Demonstration (version 1.1)</description>
- <year>1980</year>
- <publisher>MECC</publisher>
+ <software name="alibi">
+ <description>Alibi</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Ian L. Trackman" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"MECC Apple Demonstration" is a 1980 educational program developed and distributed by MECC. This is version 1.1.-->
+ <!-- Dump released: 2019-10-14 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234825">
- <rom name="mecc apple demonstration volume 1 v1.1.woz" size="234825" crc="4f00b238" sha1="b3599d50ce1714cc8bea9d6446e05a1dd55e9594" />
+ <dataarea name="flop" size="248803">
+ <rom name="alibi.woz" size="248803" crc="12ac7a0b" sha1="38e38af85103b666b8d610a18d18ccd344a4a302" />
</dataarea>
</part>
</software>
- <software name="mecchires10">
- <description>MECC Hi-Res Toolkit (version 1.0)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="alcwndrls" cloneof="alcwndrl">
+ <description>Alice in Wonderland (Spinnaker Software)</description>
+ <year>1985</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="programmer" value="Laurence Yep" />
+ <info name="programmer" value="William Groetzinger" />
+ <info name="programmer" value="Vince Mills" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. This program will frequently fail its own copy protection check requiring a reset. Enter PR#6 multiple times in MAME until it loads." />
+ <!-- Copy protection check fail is confirmed on real hardware. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"MECC Hi-Res Toolkit" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-11-17 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234705">
- <rom name="mecc hi-res toolkit v1.0.woz" size="234705" crc="ebac8dbd" sha1="1e7c18fdbc6b6762dfcd3a385c07e40716f6bc27" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234803">
+ <rom name="alice in wonderland (spinnaker) side a.woz" size="234803" crc="62201d25" sha1="fe0c8878dee6dc87b4f1c29b9a03614d035cc7e4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234803">
+ <rom name="alice in wonderland (spinnaker) side b.woz" size="234803" crc="00d4153c" sha1="a362c8ba6f833b5aee032e32b8cd429f2815935f" />
</dataarea>
</part>
</software>
- <software name="probability10">
- <description>Probability (version 1.0)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="alcwndrl">
+ <description>Alice in Wonderland (Windham Classics)</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="original_publisher" value="Spinnaker Software" />
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="programmer" value="Laurence Yep" />
+ <info name="programmer" value="William Groetzinger" />
+ <info name="programmer" value="Vince Mills" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Probability" is a 1983 educational program developed and distributed by MECC. This is version 1.0. -->
+ <!-- Dump released: 2019-07-23 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241442">
- <rom name="probability v1.0.woz" size="241442" crc="608a87a7" sha1="3399b6d8a8658313a74df9f5a05989998784561e" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234827">
+ <rom name="alice in wonderland side a.woz" size="234827" crc="3823bdc3" sha1="722352b5ed1426975ac1518e8c3d378bb581f57f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234827">
+ <rom name="alice in wonderland side b.woz" size="234827" crc="2d0642e8" sha1="55df9c5e6b1aa3e8233783bf3a5ee65605760919" />
</dataarea>
</part>
</software>
- <software name="spellv2sec20">
- <description>Spelling Volume 2: Secondary (version 2.0)</description>
+ <software name="awwizoz">
+ <description>Alice in Wonderland &amp; The Wizard of Oz (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296185">
+ <rom name="alice in wonderland and the wizard of oz 800k.woz" size="1296185" crc="89419cd5" sha1="ad0600952f5a2f40d2c1ba26f454119f3dd7e100" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alnrain">
+ <description>Alien Rain</description>
<year>1980</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"Spelling Volume 2: Secondary" is a 1980 educational program developed and distributed by MECC. This is version 2.0.-->
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-07 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234811">
- <rom name="spelling volume 2- secondary v2.0.woz" size="234811" crc="729e8cfc" sha1="d7b9596af90d4abc5cae111ca3b6e8dd5f99e4f3" />
+ <dataarea name="flop" size="101653">
+ <rom name="alien rain.woz" size="101653" crc="3a2ecd02" sha1="3e5bce778cae684dd3dca0c195150b0152340d84" />
</dataarea>
</part>
</software>
- <software name="3rmicro11">
- <description>The Three Rs of Microcomputing (version 1.1)</description>
- <year>1983</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!-- Dump released: 2023-06-20 -->
- <!--"The Three Rs of Microcomputing" is a 1983 educational program developed and distributed by MECC. This is version 1.1.-->
+ <software name="alntyphn">
+ <description>Alien Typhoon</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-21 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234805">
- <rom name="the three rs of microcomputing v1.1.woz" size="234805" crc="f0d6f661" sha1="cc919a1cd7bb44873c9655bd51f9dbbcf0947451" />
+ <dataarea name="flop" size="101963">
+ <rom name="alien typhoon.woz" size="101963" crc="5f8ca7f0" sha1="ace78dc02257b9e09fcf962bf2e5caa9cf5ae55c" />
</dataarea>
</part>
</software>
- <software name="jennyj10">
- <description>Jenny's Journeys (version 1.0)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="alcfacflr1" cloneof="alcfacfl">
+ <description>Aliencounter &amp; Face Flash (revision 1)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Jenny's Journeys" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="jenny's journeys v1.0.woz" size="234791" crc="ae68b965" sha1="9fa21d8a2f54cf35dd7aeb4ed3d40d0ffa043b9e" />
+ <dataarea name="flop" size="234848">
+ <rom name="aliencounter and face flash rev. 1.woz" size="234848" crc="1bfb666e" sha1="a6df199ff6617f67b5c24b913099a16f949cbd39" />
</dataarea>
</part>
</software>
- <software name="mgraph11">
- <description>MECC Graph (version 1.1)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="alcfacflr2" cloneof="alcfacfl">
+ <description>Aliencounter &amp; Face Flash (revision 2)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Graph" is a 1985 educational program developed and distributed by MECC. This is version 1.1.-->
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234785">
- <rom name="mecc graph v1.1.woz" size="234785" crc="0b0b5bd5" sha1="5e5dc9cb4caacd388969c0e60f910af353ccabad" />
+ <dataarea name="flop" size="234795">
+ <rom name="aliencounter and face flash rev. 2.woz" size="234795" crc="17b92195" sha1="a10de7fdcde7b0d6074f61c7a0f6f6c8732901d7" />
</dataarea>
</part>
</software>
- <software name="mgraphp10">
- <description>MECC Graphing Primer (version 1.0)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="alcfacfl">
+ <description>Aliencounter &amp; Face Flash (revision 3)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Graphing Primer" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234795">
- <rom name="mecc graphing primer v1.0.woz" size="234795" crc="a09867de" sha1="248293b746d709e1ee6377c036590d78082c351b" />
+ <rom name="aliencounter and face flash rev. 3.woz" size="234795" crc="33176cf1" sha1="2c285ae5daf98a96aed875248ba1a129f94c6558" />
</dataarea>
</part>
</software>
- <software name="odelllk10">
- <description>Odell Lake (version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="allaligs">
+ <description>All About Light and Sound</description>
+ <year>1987</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Odell Lake" is a 1986 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-11-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234785">
- <rom name="odell lake v1.0.woz" size="234785" crc="17d9c15b" sha1="37dca60c701ca34e3afd07d796bafbcbf25d2ffc" />
+ <dataarea name="flop" size="234817">
+ <rom name="all about light and sound.woz" size="234817" crc="f64c396f" sha1="e444eef241c860a42f48e14a1ac4ec4279c4933b" />
</dataarea>
</part>
</software>
- <software name="odelllk12">
- <description>Odell Lake (version 1.2)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="algncroc">
+ <description>Alligators and Crocodiles</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Odell Lake" is a 1986 educational program developed and distributed by MECC. This is version 1.2.-->
+ <!-- Dump released: 2020-12-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234800">
- <rom name="odell lake v1.2.woz" size="234800" crc="da755acd" sha1="39f21ca32089b8ea5258bcc297df6a72268d1de8" />
+ <dataarea name="flop" size="234780">
+ <rom name="alligators and crocodiles.woz" size="234780" crc="ce4f1d6d" sha1="5d9bdbe3cf47723775b18e79a14fd2df6dce2659" />
</dataarea>
</part>
</software>
- <software name="studygui15">
- <description>Study Guide (version 1.5)</description>
+ <software name="alphabld">
+ <description>Alpha Build</description>
<year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <publisher>Spinnaker Software</publisher>
+ <info name="developer" value="Childware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and Passport MIDI card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Study Guide" is a 1984 educational program developed and distributed by MECC. This is version 1.5.-->
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="241442">
- <rom name="study guide v1.5 disk 1 - program.woz" size="241442" crc="df0ee4ff" sha1="33bded9178a6364841753f6bc32651468bb2e393" />
+ <dataarea name="flop" size="188171">
+ <rom name="alpha build.woz" size="188171" crc="342ae933" sha1="725f752bdb9d9013f039ec576224273024a9763f" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Data master disk" />
- <dataarea name="flop" size="241442">
- <rom name="study guide v1.5 disk 2 - data master.woz" size="241442" crc="12ede32a" sha1="78f1f86b7c9d4c2d20047cb3017f05e5f76b35bf" />
+ </software>
+
+ <software name="afbiglit">
+ <description>Alphabet Fun: Big and Little Letters</description>
+ <year>1991</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234896">
+ <rom name="alphabet fun- big and little letters.woz" size="234896" crc="e7a39ff9" sha1="82eb1ed3c28bd0ee3c4607bea690bab54ed19743" />
</dataarea>
</part>
</software>
- <software name="markplac10">
- <description>The Market Place (version 1.0)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <software name="aflrnalp">
+ <description>Alphabet Fun: Learning The Alphabet</description>
+ <year>1990</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"The Market Place" is a 1984 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2021-02-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234806">
- <rom name="the market place v1.0.woz" size="234806" crc="08f7bb5f" sha1="f7c23246934ecf57fc1f941e6e413ddedf0fb508" />
+ <dataarea name="flop" size="241486">
+ <rom name="alphabet fun- learning the alphabet.woz" size="241486" crc="4ea03524" sha1="a9ac293a69862d1bbcab965216ff8f25ad1fe0c6" />
</dataarea>
</part>
</software>
- <software name="oregontr14">
- <description>The Oregon Trail (version 1.4)</description>
+ <software name="alptramrr0">
+ <description>Alpine Tram Ride (revision 0)</description>
<year>1985</year>
- <publisher>MECC</publisher>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 0" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="alpine tram ride.woz" size="234769" crc="b736bca3" sha1="34e94b333ba5aa778e78d9b6be5784cf20a0dc2a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcity">
+ <description>Alternate Reality: The City</description>
+ <year>1985</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Philip Price" />
+ <info name="programmer" value="Gary Gilbertson" />
+ <info name="programmer" value="Craig Skinner" />
+ <info name="programmer" value="Jim Ratcliff" />
+ <info name="programmer" value="Ken Jordan" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"The Oregon Trail" is a 1985 educational program developed and distributed by MECC. This is version 1.4.-->
+ <!-- Dump released: 2022-09-24 -->
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234806">
- <rom name="the oregon trail v1.4 side a.woz" size="234806" crc="8c97c45a" sha1="bba76a312ec2da8a59d8bbd71ea7f06dc04075c1" />
+ <dataarea name="flop" size="234893">
+ <rom name="alternate reality- the city side a.woz" size="234893" crc="a991c13c" sha1="05ad6656a2b82a60d8a6c9749b3c06ce14966627" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234806">
- <rom name="the oregon trail v1.4 side b.woz" size="234806" crc="2e324af6" sha1="70e1b9074e12e750e246c9c00241c31ae3eab7ad" />
+ <dataarea name="flop" size="234893">
+ <rom name="alternate reality- the city side b.woz" size="234893" crc="d91bf591" sha1="058f5be53707bc86a4ceb459af14861f070e0786" />
</dataarea>
</part>
</software>
- <software name="wpappl20">
- <description>Word Processing on the Apple (version 2.0)</description>
- <year>1984</year>
- <publisher>MECC</publisher>
+ <software name="ardungn">
+ <description>Alternate Reality: The Dungeon (version 2.1)</description>
+ <year>1987</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Dan Pinal" />
+ <info name="programmer" value="Ken Jordan" />
+ <info name="programmer" value="Jim Ratcliff" />
+ <info name="programmer" value="Rick Mirsky" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Word Processing on the Apple" is a 1984 educational program developed and distributed by MECC. This is version 2.0.-->
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-23 -->
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A - ProDOS disk" />
- <dataarea name="flop" size="234803">
- <rom name="word processing on the apple v2.0 side a - prodos.woz" size="234803" crc="d2f837b0" sha1="59abacf7555ab1cc6797313e01b1290b1114bc60" />
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234799">
+ <rom name="alternate reality- the dungeon disk 1a.woz" size="234799" crc="04fcfcd2" sha1="a5eeef2f58587f933d0ee4bea455bc49d96e1895" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B - DOS 3.3 disk" />
- <dataarea name="flop" size="234803">
- <rom name="word processing on the apple v2.0 side b - dos 3.3.woz" size="234803" crc="81bddcaa" sha1="987dc8e8041bc0e76d2fad40c99a15f251299f9a" />
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="235507">
+ <rom name="alternate reality- the dungeon disk 1b.woz" size="235507" crc="6a8d91ba" sha1="d979a65ddb9d6f2fd3c4ce799e0700e7d82c9207" />
</dataarea>
</part>
- </software>
-
- <software name="equatmath10">
- <description>Equation Math (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Equation Math" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234786">
- <rom name="equation math v1.0.woz" size="234786" crc="0c7e78eb" sha1="f5fbc707abd3d361d8f2b9b9f513003b80ecc843" />
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="235507">
+ <rom name="alternate reality- the dungeon disk 2.woz" size="235507" crc="b3bcca3a" sha1="0c11f3697794eaa24ad3c450f852445135e88c3b" />
</dataarea>
</part>
</software>
- <software name="estqcksolii10">
- <description>Estimation: Quick Solve II (version 1.0)</description>
- <year>1990</year>
+ <software name="amazarit_525" cloneof="amazarit">
+ <description>Amazing Arithmetricks (A-336 version 1.0)</description>
+ <year>1993</year>
<publisher>MECC</publisher>
+ <info name="partno" value="A-336" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="programmer" value="Shari Zehm" />
<info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Estimation: Quick Solve II" is a 1990 educational program developed by Beth Bell, Vincent Erickson, Shari Glenn, Charolyn Kapplinger, Sherry Luedloff, and Elizabeth Wendland, and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234903">
- <rom name="estimation- quick solve ii v1.0.woz" size="234903" crc="5378dd49" sha1="05ed9d2968c1ad7b237bd8b7caba3a457634e58a" />
+ <dataarea name="flop" size="234873">
+ <rom name="amazing arithmetricks.woz" size="234873" crc="1cc7086a" sha1="616e7ea3898b3a9dccc1cd37820f533fbf416bc5" />
</dataarea>
</part>
</software>
- <software name="ghostwr10">
- <description>Ghost Writer (version 1.0)</description>
- <year>1985</year>
+ <software name="amazarit">
+ <description>Amazing Arithmetricks (A-336 version 1.0) (800K 3.5")</description>
+ <year>1993</year>
<publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="partno" value="A-336" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Ghost Writer" is a 1985 educational program developed by Robert Bortnick, Ph.D., and Thomas R. Lundeen, and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234836">
- <rom name="ghost writer v1.0.woz" size="234836" crc="5b99ad15" sha1="a25ea6ff9d2081a508587c5e28497e0edbc8ba33" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296242">
+ <rom name="amazing arithmetricks 800k.woz" size="1296242" crc="62cf2ca1" sha1="20afc8993c762ff0bba90e6f7397bd91d91c3150" />
</dataarea>
</part>
</software>
- <software name="instsurv10">
- <description>Instant Survey (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Instant Survey" is a 1989 educational program developed by Mark Dostal, Cathy Grittner, Greg Holey, Sherry Luedloff, Jean Sharp, Roger Shimada, Craig Solomonson, Jim Thompson, Debra Vonk, and Brian Walker, and distributed by MECC. This is version 1.0.-->
+ <software name="amgovis">
+ <description>American Government (Intellectual Software)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 - Program disk" />
- <dataarea name="flop" size="234930">
- <rom name="instant survey v1.0 disk 1 - program.woz" size="234930" crc="e91954ea" sha1="34513b9a7dbc6e386a54c27c387969796e85c657" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234770">
+ <rom name="american government disk 1.woz" size="234770" crc="ced6026e" sha1="08a39c2e605c6c57f768b60cc9c88d1a1d1bbe3a" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 - Sampler disk" />
- <dataarea name="flop" size="234930">
- <rom name="instant survey v1.0 disk 2 - sampler.woz" size="234930" crc="0e0350d7" sha1="b0d2c559bbc70b1a40276c79984d926f5371c623" />
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234770">
+ <rom name="american government disk 2.woz" size="234770" crc="00335a8a" sha1="06decf8601501ef2b0f073aade88bb84a939509c" />
</dataarea>
</part>
- </software>
-
- <software name="lblmaker10">
- <description>LabelMaker (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"LabelMaker" is a 1988 educational program developed and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234783">
- <rom name="labelmaker v1.0.woz" size="234783" crc="28ee6f64" sha1="590ca5072665f17298e585e008c2a460fde2f5e8" />
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234770">
+ <rom name="american government disk 3.woz" size="234770" crc="a2e146ef" sha1="fbba0ffaf29575ee812d9e1bc28ebe934c1c94b3" />
</dataarea>
</part>
- </software>
-
- <software name="mdqeurosu10">
- <description>MECC Dataquest: Europe and the Soviet Union (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Dataquest: Europe and the Soviet Union" is a 1990 educational program developed and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234815">
- <rom name="mecc dataquest- europe and soviet union v1.0.woz" size="234815" crc="621b13b8" sha1="753b7c954fa6efc00635aabf8090916d0d7ebf7e" />
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4" />
+ <dataarea name="flop" size="234770">
+ <rom name="american government disk 4.woz" size="234770" crc="6abdfa64" sha1="715062425f7aa38fd02c4c78de2eb61282703b65" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5" />
+ <dataarea name="flop" size="234770">
+ <rom name="american government disk 5.woz" size="234770" crc="731be9b4" sha1="ea0c77bd079d1c714046ba1a35407bdbaa5927d4" />
</dataarea>
</part>
</software>
- <software name="mdqlatam10">
- <description>MECC Dataquest: Latin America (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Dataquest: Latin America" is a 1989 educational program developed and distributed by MECC. This is version 1.0.-->
+ <software name="amgovml">
+ <description>American Government (Micro Learningware)</description>
+ <year>1984</year>
+ <publisher>Micro Learningware</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234801">
- <rom name="mecc dataquest- latin america v1.0.woz" size="234801" crc="5a8fcffb" sha1="05d8f27ca3ef4a3ed4209896a7963df93a48518a" />
+ <dataarea name="flop" size="234776">
+ <rom name="american government.woz" size="234776" crc="1d781dab" sha1="0697e23dc8da788e9bab95f945c4b8e2cb34ad14" />
</dataarea>
</part>
</software>
- <software name="mdqmidenoraf10">
- <description>MECC Dataquest: Middle East and North Africa (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Dataquest: Middle East and North Africa" is a 1989 educational program developed and distributed by MECC. This is version 1.0.-->
+ <software name="amhisadv">
+ <description>American History Adventure</description>
+ <year>1984</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234816">
- <rom name="mecc dataquest- middle east and north africa v1.0.woz" size="234816" crc="70ec9f6a" sha1="ee827a254969f42fc3a498099477028e1bf4cdf9" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234777">
+ <rom name="american history adventure disk 1.woz" size="234777" crc="285db60a" sha1="79b890752ff615edbf1cc5da1954f0f6c7d850c6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234777">
+ <rom name="american history adventure disk 2.woz" size="234777" crc="15ac8e90" sha1="bb9846c830ef23347f9dcb22466e099486b9228b" />
</dataarea>
</part>
</software>
- <software name="mdqnamam11">
- <description>MECC Dataquest: North American Mammals (version 1.1)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Dataquest: North American Mammals" is a 1988 educational program developed and distributed by MECC. This is version 1.1.-->
+ <software name="amnesia">
+ <description>Amnesia</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Thomas M. Disch" />
+ <info name="developer" value="Cognetics" />
+ <info name="programmer" value="Kevin Bentley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-20 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234810">
- <rom name="mecc dataquest- north american mammals v1.1.woz" size="234810" crc="c137c398" sha1="4266b7f7d9e753bb29998343912788460c262d2b" />
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="228118">
+ <rom name="amnesia disk 1a.woz" size="228118" crc="2bc5a39f" sha1="927c536daae91d82175efab5e707881673c4d73a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234774">
+ <rom name="amnesia disk 1b.woz" size="234774" crc="b1a530f1" sha1="abf89dd7a83002b7b62cd77b9fd73582bc707333" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234774">
+ <rom name="amnesia disk 2a.woz" size="234774" crc="28042b7f" sha1="5dbce53fc06e1e9dea2ea3ae9c6c4f1d8dc03a82" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234774">
+ <rom name="amnesia disk 2b.woz" size="234774" crc="edc22834" sha1="7a2570b1a124fc1cea148f9cd899ccab25958b93" />
</dataarea>
</part>
</software>
- <software name="mdqwrdcom11">
- <description>MECC Dataquest: The World Community (version 1.1)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Dataquest: The World Community" is a 1987 educational program developed and distributed by MECC. This is version 1.1.-->
+ <software name="advdbl2">
+ <description>An Adventure Double Feature Volume II</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Loretta Jones" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234807">
- <rom name="mecc dataquest- the world community v1.1.woz" size="234807" crc="111b1a2f" sha1="ec49795df3aaabfab0eb0e3499704ba50d2e1015" />
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="221513">
+ <rom name="adventure double feature volume ii disk a.woz" size="221513" crc="71daaeee" sha1="33ac272a4e7e65c4ccac6e0ee6988bd69238785d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
+ <dataarea name="flop" size="154953">
+ <rom name="adventure double feature volume ii disk b.woz" size="154953" crc="fb6409f8" sha1="28ea797fed2bee60ee7c3dcf359ba83240551f16" />
</dataarea>
</part>
</software>
- <software name="meccedit10">
- <description>MECC Editor (version 1.0)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Editor" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
+ <software name="analotut">
+ <description>Analogies Tutorial (version 10.19.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleischer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.19.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234784">
- <rom name="mecc editor v1.0.woz" size="234784" crc="2f035c50" sha1="e0c188d295c96ed393d0e6d7c8036acb4dd0addf" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234809">
+ <rom name="analogies tutorial v10.19.89 disk 1.woz" size="234809" crc="11139671" sha1="bd9e0fc3978db225f0e0df2c805c75761264da7a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234776">
+ <rom name="analogies tutorial v10.19.89 disk 2.woz" size="234776" crc="264477c7" sha1="aabe330c6e28a2d62a785573cf6b9f2aede348db" />
</dataarea>
</part>
</software>
- <software name="meccoutl10">
- <description>MECC Outliner (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Outliner" is a 1988 educational program developed by Miryam Acevedo-Bouchard, John J. Krenz, Mark Paquette, Larry Phenow, Roger Shimada, Steve Taffee, and Paul Wieser, and distributed by MECC. This is version 1.0.-->
+ <software name="analresn">
+ <description>Analytical Reasoning</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234900">
- <rom name="mecc outliner v1.0.woz" size="234900" crc="7a63c166" sha1="a732682e502f6b9674952e6bff9d5634ceda384d" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234771">
+ <rom name="analytical reasoning disk 1.woz" size="234771" crc="bb32bbdd" sha1="a1303550c0a6bca6a3bb9d840c0c2b5a341a97e8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234804">
+ <rom name="analytical reasoning disk 2.woz" size="234804" crc="49011332" sha1="59d6e3fa5755ae6ef2568952227aef8817190aef" />
</dataarea>
</part>
</software>
- <software name="meccstfet10">
- <description>MECC Stuff and Fetch (version 1.0)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
+ <software name="anchorman">
+ <description>Anchorman</description>
+ <year>1988</year>
+ <publisher>Virginia Real Software</publisher>
+ <info name="programmer" value="Hal Kiefer" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Stuff and Fetch" is a 1985 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-02-02 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234793">
- <rom name="mecc stuff and fetch v1.0.woz" size="234793" crc="825a8765" sha1="586d8d7f572c532de1b0a5815ec0d9a0460f5c6f" />
+ <dataarea name="flop" size="234779">
+ <rom name="anchorman.woz" size="234779" crc="b63194b8" sha1="a90958e1fe57c97c563a99370be1d0944ecec834" />
</dataarea>
</part>
</software>
- <software name="meccwrst12">
- <description>MECC Write Start (version 1.2)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Write Start" is a 1985 educational program developed and distributed by MECC. This is version 1.2.-->
+ <software name="abkatie">
+ <description>Animal Bytes: Katie the Camel</description>
+ <year>1984</year>
+ <publisher>Ideals Publishing</publisher>
+ <info name="author" value="Alice Leedy Mason"/>
+ <info name="developer" value="Ideals Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234790">
- <rom name="mecc write start v1.2.woz" size="234790" crc="bb1db1f2" sha1="5adce7f4e3fe500e8e86264ab2f724175243fdd9" />
+ <dataarea name="flop" size="234744">
+ <rom name="animal bytes- katie the camel.woz" size="234744" crc="022a8870" sha1="9cb78c23aa681db303cce611a207ede21d27b5ef" />
</dataarea>
</part>
</software>
- <software name="meccwrit12">
- <description>MECC Writer (version 1.2)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"MECC Writer" is a 1985 educational program developed and distributed by MECC. This is version 1.2.-->
+ <software name="ablarry">
+ <description>Animal Bytes: Larry the Lion</description>
+ <year>1984</year>
+ <publisher>Ideals Publishing</publisher>
+ <info name="author" value="Barbara A. Iverson"/>
+ <info name="developer" value="Ideals Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234817">
- <rom name="mecc writer v1.2.woz" size="234817" crc="ea821ab1" sha1="36d12dd728c792bbc822409936e13d8350588636" />
+ <dataarea name="flop" size="234743">
+ <rom name="animal bytes- larry the lion.woz" size="234743" crc="75d44b96" sha1="39d7208b9ef56b96cf480cf9e40a897f32ef8eff" />
</dataarea>
</part>
</software>
- <software name="mystmatt10">
- <description>Mystery Matter (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Mystery Matter" is a 1988 educational program developed by Greg Holey, Nan Leekly, Sherry Luedloff, John Persoon, Jane Peterson, Diane Portner, and Jim Thompson, and distributed by MECC. This is version 1.0.-->
+ <software name="abmaggie">
+ <description>Animal Bytes: Maggie the Mink</description>
+ <year>1984</year>
+ <publisher>Ideals Publishing</publisher>
+ <info name="author" value="Howard Goldsmith"/>
+ <info name="developer" value="Ideals Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234889">
- <rom name="mystery matter v1.0.woz" size="234889" crc="84fb30ba" sha1="6f1008d961dfa34ce40949f23ec83b4f44c9483f" />
+ <dataarea name="flop" size="234744">
+ <rom name="animal bytes- maggie the mink.woz" size="234744" crc="d7581d33" sha1="e4d83f734bf4c34a062e7ebbe440a85c7fc9e7fb" />
</dataarea>
</part>
</software>
- <software name="mystobjs10">
- <description>Mystery Objects (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Mystery Objects" is a 1988 educational program developed by Greg Holey, Liz Husebye, Charolyn Kapplinger, John Krenz, Nan Leekly, Sherry Luedloff, Kevin Neff, and Diane Portner, and distributed by MECC. This is version 1.0.-->
+ <software name="aboscar">
+ <description>Animal Bytes: Oscar the Otter</description>
+ <year>1984</year>
+ <publisher>Ideals Publishing</publisher>
+ <info name="author" value="Alice Leedy Mason"/>
+ <info name="developer" value="Ideals Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234904">
- <rom name="mystery objects v1.0.woz" size="234904" crc="4da9ea38" sha1="2c788d6c2dcfcd5d50c3f64bef3c2f57a10e4484" />
+ <dataarea name="flop" size="241400">
+ <rom name="animal bytes- oscar the otter.woz" size="241400" crc="8b41b051" sha1="5c530133418b78a94e61ad1257de7cc3bb67d32a" />
</dataarea>
</part>
</software>
- <software name="patterns10">
- <description>Patterns (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Patterns" is a 1988 educational program developed by Miryam Acevedo-Bouchard, Rich Childers, Susan Gabrys, Charolyn Kapplinger, Sherry Luedloff, Jane Peterson, and Larry Phenow, and distributed by MECC. This is version 1.0.-->
+ <software name="absammy">
+ <description>Animal Bytes: Sammy the Sloth</description>
+ <year>1984</year>
+ <publisher>Ideals Publishing</publisher>
+ <info name="author" value="Alice Leedy Mason"/>
+ <info name="developer" value="Ideals Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234920">
- <rom name="patterns v1.0.woz" size="234920" crc="cf7d086b" sha1="19e0fda0d137589435383bd36a971dafb60c75ec" />
+ <dataarea name="flop" size="234744">
+ <rom name="animal bytes- sammy the sloth.woz" size="234744" crc="dfb5691c" sha1="9929a4e6ad6ab0eeac617947c9730043439cfef9" />
</dataarea>
</part>
</software>
- <software name="quiltbee10">
- <description>Quilting Bee (version 1.0)</description>
- <year>1994</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Quilting Bee" is a 1994 educational program developed by Beth Daniels, Dave Denninger, Sheila Dols, Craig Solomonson, and Claudio Valenzuela, and distributed by MECC. This is version 1.0. It has in-app controls to toggle the user interface language between English and Spanish.-->
+ <software name="absimon">
+ <description>Animal Bytes: Simon the Snake</description>
+ <year>1984</year>
+ <publisher>Ideals Publishing</publisher>
+ <info name="author" value="Susan E. Hilliard"/>
+ <info name="developer" value="Ideals Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234807">
- <rom name="quilting bee v1.0.woz" size="234807" crc="ca2f3e60" sha1="06487c7426193707f75bc8523850d99aef5962c6" />
+ <dataarea name="flop" size="241400">
+ <rom name="animal bytes- simon the snake.woz" size="241400" crc="afef8ab6" sha1="9e4b96378b438ec6ad4b7c2a3280b963e097396f" />
</dataarea>
</part>
</software>
- <software name="showtime11">
- <description>Show Time (version 1.1)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--"Show Time" is a 1986 educational program developed and distributed by MECC. This is version 1.1.-->
+ <software name="afctadv">
+ <description>Animal Facts and Adventures</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Requires separate ProDOS boot disk or hard drive." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234782">
- <rom name="show time v1.1 side a.woz" size="234782" crc="e4e19090" sha1="4b169386362763fbf86f1d396f2e7491f468cbbc" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234782">
- <rom name="show time v1.1 side b.woz" size="234782" crc="0e92e491" sha1="b43accc4cfec757422868d00c745298edb9e2ce8" />
+ <dataarea name="flop" size="234891">
+ <rom name="animal facts and adventures.woz" size="234891" crc="f27a7a8b" sha1="1440109b0e7ad34a16016cd698a03ad38c06dfbb" />
</dataarea>
</part>
</software>
- <software name="spcsfree10">
- <description>Space Station Freedom (version 1.0)</description>
- <year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Space Station Freedom" is a 1990 educational program developed by Mark Hanson, Charolyn Kapplinger, Mike Palmquist, Jane Peterson, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
+ <software name="animhomes">
+ <description>Animal Homes and Stories</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234880">
- <rom name="space station freedom v1.0 side a.woz" size="234880" crc="111e0a80" sha1="cbb7296917482de22f96625f2bfb47b5a681bfdc" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234880">
- <rom name="space station freedom v1.0 side b.woz" size="234880" crc="440e9416" sha1="53ae773b5920501b0e1dfaa68fd375e1155f43b2" />
+ <dataarea name="flop" size="234890">
+ <rom name="animal homes and stories.woz" size="234890" crc="42d55f81" sha1="7eac250d7998ebd1492aa3933b1742cb6fd362e9" />
</dataarea>
</part>
</software>
- <software name="spellpr11">
- <description>Spelling Press (version 1.1)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Spelling Press" is a 1988 educational program developed by Susan Gabrys, Charolyn Kapplinger, Larry Phenow, Roger Shimada, Caren Stelson, and Brian Walker, and distributed by MECC. This is version 1.1.-->
+ <software name="anihotel">
+ <description>Animal Hotel</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234884">
- <rom name="spelling press v1.1.woz" size="234884" crc="67c25967" sha1="d3a72e002121b64120cf9e9a684abd92f4e01aef" />
+ <dataarea name="flop" size="234772">
+ <rom name="animal hotel.woz" size="234772" crc="e23cae83" sha1="ab78fd657c3230b23a42badb3018e04ddb341e34" />
</dataarea>
</part>
</software>
- <software name="teachoo11">
- <description>Teacher Option Organizer (version 1.1)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Teacher Option Organizer" is a 1988 educational program developed by Kevin Neff, Larry Phenow, Diane Portner, Jim Thompson, Brian Walker, and Nelson Whyatt, and distributed by MECC. This is version 1.1.-->
+ <software name="anphotof">
+ <description>Animal Photo Fun</description>
+ <year>1984</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Neosoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234869">
- <rom name="teacher option organizer v1.1.woz" size="234869" crc="d178180a" sha1="e220ff8120f67613d169cf18b705b37e108a592c" />
+ <dataarea name="flop" size="234798">
+ <rom name="animal photo fun.woz" size="234798" crc="18f15f1f" sha1="f8e0890f16b59163fc09c6f204e9cb6ed5c0dc41" />
</dataarea>
</part>
</software>
- <software name="teachscin10">
- <description>Teaching Scientific Inquiry (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
+ <software name="anmrescu">
+ <description>Animal Rescue</description>
+ <year>1991</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="S. Hosler" />
+ <info name="programmer" value="Mark Wharton" />
+ <info name="programmer" value="Philip Wharton" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Teaching Scientific Inquiry" is a 1989 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2021-04-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234800">
- <rom name="teaching scientific inquiry v1.0.woz" size="234800" crc="0056061a" sha1="7b625dbec398211d39c34ff2b2a0495d5d891ba0" />
+ <dataarea name="flop" size="234821">
+ <rom name="animal rescue.woz" size="234821" crc="a9f9ad80" sha1="8ae4d857d2742d087be18ba941e5b13da3509005" />
</dataarea>
</part>
</software>
- <software name="tmnavlb10">
- <description>Time Navigator Leaps Back (version 1.0)</description>
+ <software name="anmstoriv">
+ <description>Animal Stories IV</description>
<year>1990</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
+ <publisher>Micrograms Publishing</publisher>
+ <info name="developer" value="Micrograms Publishing" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Time Navigator Leaps Back" is a 1990 educational program developed by Beth Bell, Vincent Erickson, John J. Krenz, Nan Leekley, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer, and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- "educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234914">
- <rom name="time navigator leaps back v1.0 side a.woz" size="234914" crc="1ff83681" sha1="13dca1caca38e75a5951baddfce05deaaea1498c" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234914">
- <rom name="time navigator leaps back v1.0 side b.woz" size="234914" crc="ea1cc92a" sha1="ac48ac737bcdef4adbc7b3978895502bbc373111" />
+ <dataarea name="flop" size="234756">
+ <rom name="animal stories iv.woz" size="234756" crc="4b3134d1" sha1="4147b9f8a20b1f40ab30c0f40681c71928370815" />
</dataarea>
</part>
</software>
- <software name="tmnav10">
- <description>Time Navigator (version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
+ <software name="animalatt_525" cloneof="animalatt">
+ <description>Animals with an Attitude</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Time Navigator" is a 1989 educational program developed by Beth Bell, Vincent Erickson, Charolyn Kapplinger, John J. Krenz, Nan Leekley, Brian Nesse, Mark Paquette, Diane Portner, and Wayne Studer, and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234923">
- <rom name="time navigator v1.0 side a.woz" size="234923" crc="93a87311" sha1="4ca9a74f4f46c6bef92259d0261eeb1f5897a9c9" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234923">
- <rom name="time navigator v1.0 side b.woz" size="234923" crc="89a881bf" sha1="fec13816b6ccdbd488ff0743d7524df73006645d" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234782">
+ <rom name="animals with an attitude - program.woz" size="234782" crc="946fd7bc" sha1="0f606cc2a2ace05ebc5bbde4dbda90e7adab15b0" />
</dataarea>
</part>
- </software>
-
- <software name="vacnattr10">
- <description>Vacation Nation Travel (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Vacation Nation Travel" is a 1991 educational program developed by John Ojanen, Mike Palmquist, Dee Dee Roedel, and John P. Wlazlo, and distributed by MECC. This is version 1.0.-->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234862">
- <rom name="vacation nation travel v1.0 side a.woz" size="234862" crc="7fd8b5e2" sha1="cb9d2830ef3f6d5137ba7fbb2d4b27d4ee07077e" />
+ <feature name="part_id" value="Disk 2 - Backgrounds and Samples" />
+ <dataarea name="flop" size="234798">
+ <rom name="animals with an attitude - backgrounds and samples.woz" size="234798" crc="8541990c" sha1="760c991a1967a54aba9ed8a7b8a6997f588f7b4e" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234862">
- <rom name="vacation nation travel v1.0 side b.woz" size="234862" crc="630aecc7" sha1="953ecdc580d7945c9222f0cbe8053a59fc821bb8" />
+ <feature name="part_id" value="Disk 3 - Clip Art 1" />
+ <dataarea name="flop" size="234785">
+ <rom name="animals with an attitude - clip art 1.woz" size="234785" crc="62f1ab28" sha1="6579fd6f7df29273be8a865a50270b9a5736add1" />
</dataarea>
</part>
- </software>
-
- <software name="woodcarr10">
- <description>Wood Car Rally (version 1.0)</description>
- <year>1988</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Wood Car Rally" is a 1988 educational program developed by Gene Breault, Greg Holey, Kevin Neff, John Persoon, and Diane Portner, and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234874">
- <rom name="wood car rally v1.0.woz" size="234874" crc="8b408e80" sha1="0d0ef3a10f38adbe8311b4d17ebf20a3976fa739" />
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Clip Art 2" />
+ <dataarea name="flop" size="234785">
+ <rom name="animals with an attitude - clip art 2.woz" size="234785" crc="817e7855" sha1="1d2707bcd356fa74cee10cfdca5374d90639ee62" />
</dataarea>
</part>
</software>
- <software name="woollybnc10">
- <description>Woolly Bounce (version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="usage" value="Requires a 128K Apple //e or later." />
+ <software name="animalatt">
+ <description>Animals with an Attitude (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Woolly Bounce" is a 1991 educational program developed by Gene Breault, Scott Jensen, Charolyn Kapplinger, and Kim D. Smith, and distributed by MECC. This is version 1.0.-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234839">
- <rom name="woolly bounce v1.0.woz" size="234839" crc="0e7e1e71" sha1="559c452f4bf4388900cf6db6539f045772489634" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296169">
+ <rom name="animals with an attitude 800k.woz" size="1296169" crc="4bed154c" sha1="10fccbcc82125350fda57bace75c1ddbe9ed47a8" />
</dataarea>
</part>
</software>
- <software name="zoyonpat10">
- <description>Zoyon Patrol (version 1.0)</description>
- <year>1987</year>
- <publisher>MECC</publisher>
+ <software name="animate">
+ <description>Animate</description>
+ <year>1986</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Steven Ohmert" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--"Zoyon Patrol" is a 1987 educational program developed and distributed by MECC. This is version 1.0.-->
+ <!-- Dump released: 2024-07-05 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234785">
- <rom name="zoyon patrol v1.0 side a.woz" size="234785" crc="bbc55637" sha1="a08f8bc01e4c29f842715e5f95d799338a4da29a" />
+ <feature name="part_id" value="Disk 1 Side A - Boot" />
+ <dataarea name="flop" size="234816">
+ <rom name="animate disk 1a - boot.woz" size="234816" crc="64bc3f61" sha1="8097819dc27357be8079f475f2f63917ca3f19c8" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234785">
- <rom name="zoyon patrol v1.0 side b.woz" size="234785" crc="3d07b6c2" sha1="dfbaa413a575e90d3724be8ba61074573bbad47a" />
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="234819">
+ <rom name="animate disk 1b - program.woz" size="234819" crc="884cb3ee" sha1="44409aaaecd66747aa2550613dec1efcd57b37c0" />
</dataarea>
</part>
- </software>
-
- <software name="dungdoom">
- <description>Dungeon of Doom</description>
- <year>1980</year>
- <publisher>Argon Games</publisher>
- <info name="developer" value="Argon Games" />
- <info name="programmer" value="Stephen G. Walburn and Robert J. McCredie" />
- <info name="usage" value="Requires a 13-sector drive, integer basic, and runs on an Apple II." />
- <sharedfeat name="compatibility" value="A2" />
- <!--Dump released: 2023-02-26 by DefaultGen-->
- <!--roleplaying game-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234496">
- <rom name="dungdoom.woz" size="234496" crc="4f5a7f61" sha1="4df3288877e8de350e8c7f54f41ef4507131b6a1" />
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Animation Library" />
+ <dataarea name="flop" size="234829">
+ <rom name="animate disk 2a - animation library.woz" size="234829" crc="dd72fdfb" sha1="1cf308ffc2c789a2c9662ab790167453fbf04dd4" />
</dataarea>
</part>
- </software>
-
- <software name="spaceark">
- <description>The Space Ark</description>
- <year>1983</year>
- <publisher>Datamost</publisher>
- <info name="programmer" value="Bob Flanagan and Art Huff" />
- <info name="usage" value="Runs on any Apple ][ with 48K." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-27-->
- <!--action game-->
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 program" />
- <dataarea name="flop" size="241466">
- <rom name="the space ark disk 1 - program.woz" size="241466" crc="f06d0291" sha1="b6120380d14d27173829e8bf6f373fd4546a5a39" />
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Background Library" />
+ <dataarea name="flop" size="234830">
+ <rom name="animate disk 2b - background library.woz" size="234830" crc="fac51096" sha1="306e0a59e9fbd3bd44a4c275b715fad698ff7d51" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 scenario" />
- <dataarea name="flop" size="241467">
- <rom name="the space ark disk 2 - scenario.woz" size="241467" crc="e71ac6a4" sha1="378102a4c172d168c05b50f290e073d7504b52ad" />
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Demonstration Show Disk" />
+ <dataarea name="flop" size="234835">
+ <rom name="animate disk 3a - demonstration show disk.woz" size="234835" crc="c6edef3d" sha1="c8f707ee43704a4468a3e9987404813efc4f2907" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Programmer's Aids" />
+ <dataarea name="flop" size="234829">
+ <rom name="animate disk 3b - programmer's aids.woz" size="234829" crc="9dcc9915" sha1="9188dff8c25e046188fd3bc602e21583eb54ce4a" />
</dataarea>
</part>
</software>
- <software name="cavecr">
- <description>Cavern Creatures</description>
+ <software name="aplcdspd">
+ <description>Apple Cider Spider</description>
<year>1983</year>
- <publisher>Datamost</publisher>
- <info name="programmer" value="Paul Lowrance and Art Huff" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-27-->
- <!--action game-->
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ivan Strand" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-01 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234788">
- <rom name="cavern creatures.woz" size="234788" crc="cfad20b4" sha1="29aca73d6cdd7403712e471027d8d680a51ffe01" />
+ <dataarea name="flop" size="233532">
+ <rom name="apple cider spider.woz" size="233532" crc="ce310438" sha1="e54afce309fb62eeca8cc0dea0efbf10777249dd" />
</dataarea>
</part>
</software>
- <software name="argos">
- <description>Argos</description>
- <year>1983</year>
- <publisher>Datamost</publisher>
- <info name="programmer" value="Ron Lowrance" />
- <info name="usage" value="Runs on any Apple ][ with 48K." />
+ <software name="agalxiansc" cloneof="agalxian">
+ <description>Apple Galaxian (StarCraft)</description>
+ <year>1980</year>
+ <publisher>StarCraft</publisher>
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-27-->
- <!--action game-->
+ <!-- Dump released: 2020-09-10 -->
+ <!-- The game was later re-released by Brøderbund Software. -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234768">
- <rom name="argos.woz" size="234768" crc="f07fdc4c" sha1="221c3a3711e0ca4f20d56f45e78f1fe5ea0ea732" />
+ <dataarea name="flop" size="95008">
+ <rom name="apple galaxian (starcraft).woz" size="95008" crc="146cab96" sha1="895197a33636e2a9f38a35bddc9ebc9b43963f08" />
</dataarea>
</part>
</software>
- <software name="cyclotron">
- <description>Cyclotron</description>
- <year>1982</year>
- <publisher>Sensible Software</publisher>
- <info name="programmer" value="Marv Long" />
- <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later systems." />
- <sharedfeat name="compatibility" value="A2,A2P,A2E" />
- <!--Dump released: 2023-07-27-->
- <!--action game-->
+ <software name="agalxian">
+ <description>Apple Galaxian (Brøderbund Software)</description>
+ <year>1980</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="original_publisher" value="StarCraft" />
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-10 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="174870">
- <rom name="cyclotron.woz" size="174870" crc="bae28b68" sha1="2cded44e7647dc325b1a7fc6d39d130a823db676" />
+ <dataarea name="flop" size="106991">
+ <rom name="apple galaxian.woz" size="106991" crc="298683ba" sha1="47a7e2459803a80d60744c295fa44ac69c815a9c" />
</dataarea>
</part>
</software>
- <software name="acedet_525" cloneof="acedet">
- <description>Ace Detective (version 1987)</description>
- <year>1987</year>
- <publisher>Mindplay</publisher>
- <info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <info name="version" value="1987" />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-02-->
- <!--educational game-->
+ <software name="aplpanic">
+ <description>Apple Panic</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ben Serki" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-17 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234765">
- <rom name="ace detective side a.woz" size="234765" crc="f15e90d7" sha1="0db5bcae7a74a3b54653f6e5d606d61f753b5dcd" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234765">
- <rom name="ace detective side b.woz" size="234765" crc="f17ded31" sha1="8fd63bd6de73e99ab1a51daa3a23e7498ea61276" />
+ <dataarea name="flop" size="94985">
+ <rom name="apple panic.woz" size="94985" crc="ff3e6db7" sha1="f6c7468a1e2f4cecbf69cfd2869d19af6d8825e1" />
</dataarea>
</part>
</software>
- <software name="acedet">
- <description>Ace Detective (version 1990) (800K 3.5")</description>
- <year>1990</year>
- <publisher>MindPlay</publisher>
- <info name="developer" value="Methods &amp; Solutions" />
- <info name="usage" value="Requires a ROM3 Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
- <info name="version" value="1990" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-17-->
- <!--educational game-->
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="1296178">
- <rom name="ace detective 800k disk 1.woz" size="1296178" crc="a4b10736" sha1="e154e0bdd97daf924ca4dd7475a97003f8981810" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="1296145">
- <rom name="ace detective 800k disk 2.woz" size="1296145" crc="fe981db8" sha1="34460241e5c1f2a6bd4befcd13ae32d5639c6e70" />
+ <software name="apuckman">
+ <description>Apple Puck Man</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jun Wada" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="95008">
+ <rom name="apple puck man.woz" size="95008" crc="95512329" sha1="45ea4a66805fc7a2cfa07e8268d151ac4991095c" />
</dataarea>
</part>
</software>
- <software name="aceyduec">
- <description>Acey-Deucey</description>
+ <software name="apvatlan">
+ <description>Apventure to Atlantis</description>
<year>1982</year>
- <publisher>L &amp; S Computerware</publisher>
- <info name="programmer" value="Larry Sherman" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-28-->
- <!--card game-->
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-14 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="61652">
- <rom name="acey-deucey.woz" size="61652" crc="6a372c08" sha1="f3c467cfe38e27b94edb353e566ccf9a8a417119" />
+ <dataarea name="flop" size="234810">
+ <rom name="apventure to atlantis.woz" size="234810" crc="7ffaa071" sha1="cc30eebf031e15bec1970965fc8f822e6c5bdcda" />
</dataarea>
</part>
</software>
- <software name="advbwalk">
- <description>Advance to Boardwalk</description>
- <year>1990</year>
- <publisher>GameTek</publisher>
- <info name="developer" value="GameTek" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <software name="aquatron">
+ <description>Aquatron</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Justin Gray" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-29 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234734">
- <rom name="advance to boardwalk.woz" size="234734" crc="a7b89d2d" sha1="8cb709d0f8b0f3b6c7a1b6b3c074b944207dda19" />
+ <dataarea name="flop" size="246792">
+ <rom name="aquatron.woz" size="246792" crc="050a69ff" sha1="9bb84494a65b673d3444edd044206f9a1a148a4a" />
</dataarea>
</part>
</software>
- <software name="advfrac10">
- <description>Adventures with Fractions (A-774 version 1.0)</description>
+ <software name="arcalbm1">
+ <description>Arcade Album #1</description>
<year>1983</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-774" />
- <info name="programmer" value="H. Bill Way and Mike Boucher"/>
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Tom Becklund" />
+ <info name="programmer" value="Alan Zeldin" />
+ <info name="programmer" value="Robert Hardy" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Compilation of Spy's Demise, The Spy Strikes Back, and Thunder Bombs, each previously pushed separately. -->
+ <!-- Dump released: 2019-04-08 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234800">
- <rom name="adventures with fractions v1.0.woz" size="234800" crc="b9cee37c" sha1="f93862c552c9954d6c695518dfb4d56e84dd9c32" />
+ <dataarea name="flop" size="233529">
+ <rom name="arcade album #1.woz" size="233529" crc="0ef302a9" sha1="7ac2ef26b00afb7f3d5d91e59ad164892d514c0e" />
</dataarea>
</part>
</software>
- <software name="afbiglit">
- <description>Alphabet Fun: Big and Little Letters</description>
- <year>1991</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Hudson Ansley and Millicent Sabater" />
+ <software name="arbootcamp">
+ <description>Arcade Boot Camp</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="John Besnard" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-05-30 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234896">
- <rom name="alphabet fun- big and little letters.woz" size="234896" crc="e7a39ff9" sha1="82eb1ed3c28bd0ee3c4607bea690bab54ed19743" />
+ <dataarea name="flop" size="234781">
+ <rom name="arcade boot camp.woz" size="234781" crc="0ea6a046" sha1="1ce84102514f89b313a77ab0a4c223003b464316" />
</dataarea>
</part>
</software>
- <software name="aflrnalp">
- <description>Alphabet Fun: Learning The Alphabet</description>
- <year>1990</year>
- <publisher>Troll Associates</publisher>
- <info name="programmer" value="Hudson Ansley, Millicent Sabater, Gregory Truex, and Millicent Sabater" />
- <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <software name="archon">
+ <description>Archon: The Light and The Dark</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Anne Westfall" />
+ <info name="author" value="Jon Freeman" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires an 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-04-->
- <!--educational program-->
+ <!-- Dump released: 2018-09-03 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241486">
- <rom name="alphabet fun- learning the alphabet.woz" size="241486" crc="4ea03524" sha1="a9ac293a69862d1bbcab965216ff8f25ad1fe0c6" />
+ <dataarea name="flop" size="226901">
+ <rom name="archon.woz" size="226901" crc="259acee7" sha1="96f118b0b49cba85fb79ee1d36c1bfe88f69d9fe" />
</dataarea>
</part>
</software>
- <software name="amazarit_525" cloneof="amazarit">
- <description>Amazing Arithmetricks (A-336 version 1.0)</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-336" />
- <info name="programmer" value="Diane Portner, Korey Schulz, Ju-Chang Wang, John P. Wlazlo, and Shari Zehm"/>
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-08-->
- <!--educational program-->
+ <software name="archon2">
+ <description>Archon II: Adept</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Anne Westfall" />
+ <info name="author" value="Jon Freeman" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-08 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234873">
- <rom name="amazing arithmetricks.woz" size="234873" crc="1cc7086a" sha1="616e7ea3898b3a9dccc1cd37820f533fbf416bc5" />
+ <dataarea name="flop" size="233486">
+ <rom name="archon ii - adept.woz" size="233486" crc="65a07c33" sha1="d8d959347c7862eef02fe8311a9a453cd9c526fe" />
</dataarea>
</part>
</software>
- <software name="amazarit">
- <description>Amazing Arithmetricks (A-336 version 1.0) (800K 3.5")</description>
- <year>1993</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-336" />
- <info name="programmer" value="Diane Portner, Korey Schulz, Ju-Chang Wang, John P. Wlazlo, and Shari Zehm"/>
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-26-->
- <!--educational program-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296242">
- <rom name="amazing arithmetricks 800k.woz" size="1296242" crc="62cf2ca1" sha1="20afc8993c762ff0bba90e6f7397bd91d91c3150" />
+ <software name="arctfox">
+ <description>Arcticfox</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Dynamix Software Development" />
+ <info name="programmer" value="Paul Bowman" />
+ <info name="programmer" value="Damon Slye" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-03 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228133">
+ <rom name="arcticfox.woz" size="228133" crc="4e9db002" sha1="28e7f1d3546cdb9c78928eccbca41dfe0c4d10fd" />
</dataarea>
</part>
</software>
- <software name="amgovml">
- <description>American Government (Micro Learningware)</description>
+ <software name="armekicks">
+ <description>Arithmekicks</description>
<year>1984</year>
- <publisher>Micro Learningware</publisher>
+ <publisher>Houghton Mifflin</publisher>
+ <info name="programmer" value="Doug Super" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-24-->
- <!--educational program-->
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234776">
- <rom name="american government.woz" size="234776" crc="1d781dab" sha1="0697e23dc8da788e9bab95f945c4b8e2cb34ad14" />
- </dataarea>
- </part>
- </software>
-
- <software name="anchorman">
- <description>Anchorman</description>
- <year>1988</year>
- <publisher>Virginia Real Software</publisher>
- <info name="programmer" value="Hal Kiefer" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-02-02-->
- <!--sports game-->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234779">
- <rom name="anchorman.woz" size="234779" crc="b63194b8" sha1="a90958e1fe57c97c563a99370be1d0944ecec834" />
+ <dataarea name="flop" size="234763">
+ <rom name="arithmekicks.woz" size="234763" crc="f90fd977" sha1="b34564d6eb1cd60d5717f902190ec3b76829dbd9" />
</dataarea>
</part>
</software>
- <software name="anmstoriv">
- <description>Animal Stories IV</description>
- <year>1990</year>
- <publisher>Micrograms Publishing</publisher>
- <info name="developer" value="Micrograms Publishing" />
- <info name="usage" value="Requires a 64K Apple //e or later." />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--"educational program-->
+ <software name="armetick">
+ <description>Arithmetickle</description>
+ <year>1984</year>
+ <publisher>Houghton Mifflin</publisher>
+ <info name="programmer" value="Doug Super" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234756">
- <rom name="animal stories iv.woz" size="234756" crc="4b3134d1" sha1="4147b9f8a20b1f40ab30c0f40681c71928370815" />
+ <dataarea name="flop" size="234764">
+ <rom name="arithmetickle.woz" size="234764" crc="b6a7bfca" sha1="ca7de286e86ce39f05372abc0a5d977cf394f4ab" />
</dataarea>
</part>
</software>
@@ -25278,12 +11969,17 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-335" />
- <info name="programmer" value="Rich Bergeron, Greg S. Johnson, Sheila Kelly, Lon Koenig, John Persoon, and Elizabeth Wendland" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Greg S. Johnson" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Elizabeth Wendland" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234880">
@@ -25303,12 +11999,17 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-335" />
- <info name="programmer" value="Rich Bergeron, Greg S. Johnson, Sheila Kelly, Lon Koenig, John Persoon, and Elizabeth Wendland" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Greg S. Johnson" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Elizabeth Wendland" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-25-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296251">
<rom name="arizona mix 800k.woz" size="1296251" crc="c4931edf" sha1="f823f858b00a3848bc9fcfad27b2178888c5ab96" />
@@ -25320,10 +12021,10 @@ license:CC0-1.0
<description>Arkanoid</description>
<year>1988</year>
<publisher>Taito America</publisher>
- <info name="usage" value="Requires a 64K Apple ][+ or later. Works with Apple II Mouse Card in slot 4: -sl4 mouse." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Works with Apple ][ Mouse Card in slot 4: -sl4 mouse." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-04-->
- <!--action game-->
+ <!-- Dump released: 2019-04-04 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="233449">
<rom name="arkanoid.woz" size="233449" crc="ed2ce549" sha1="421e17ac0441f3a513846eda613b234b4b1d756f" />
@@ -25331,16 +12032,101 @@ license:CC0-1.0
</part>
</software>
+ <software name="aiasterd">
+ <description>Asteroid</description>
+ <year>1980</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Marc Goodman" />
+ <info name="usage" value="Runs on any Apple ][ with 48K and a 13-sector drive." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2019-11-12 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234776">
+ <rom name="asteroid.woz" size="234776" crc="48edee28" sha1="d3f67ba5f93d134dce711229039aa771a112155c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="astinspc">
+ <description>Asteroids in Space</description>
+ <year>1980</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Bruce Wallace" />
+ <info name="usage" value="Runs on any Apple ][ with 32K and a 13-sector drive." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2020-06-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241425">
+ <rom name="asteroids in space.woz" size="241425" crc="b4e281cb" sha1="a0870556a5e29e79427c4528ff739472a75b6e99" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="astratts">
+ <description>Astro Attack (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="81642">
+ <rom name="astro attack (softsmith).woz" size="81642" crc="974c68ca" sha1="931dc25c59e0f276781c384ec741617fc98ea643" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moscow41">
+ <description>At the Gates of Moscow: 1941</description>
+ <year>1985</year>
+ <publisher>Strategic Games Publications (SPG)</publisher>
+ <info name="author" value="David Heath"/>
+ <info name="programmer" value="Mark Korman" />
+ <info name="programmer" value="Todd Hochwitz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-11 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234830">
+ <rom name="at the gates of moscow 1941 side a.woz" size="234830" crc="bdd647a6" sha1="e4f9258915328e1ae0a80850b5aca76e87bdd615" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234830">
+ <rom name="at the gates of moscow 1941 side b.woz" size="234830" crc="5a7eee20" sha1="16cef55f63abf27f3036889bacd75db6e3a6148d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="awawhale">
<description>Audubon Wildlife Adventures: Whales! (version 2.1)</description>
<year>1990</year>
<publisher>National Audubon Society</publisher>
- <info name="programmer" value="Christopher Palmer, Dennis Sullivan, Deborah Kovacs, Pat Relf, Drew Ruscil, Doreen Curtin, Jennifer Crouser, Candace Maher, Carol Felice, Roger DiSilvestro, Susan Greer, and Jeffrey Siegel" />
+ <info name="programmer" value="Christopher Palmer" />
+ <info name="programmer" value="Dennis Sullivan" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Drew Ruscil" />
+ <info name="programmer" value="Doreen Curtin" />
+ <info name="programmer" value="Jennifer Crouser" />
+ <info name="programmer" value="Candace Maher" />
+ <info name="programmer" value="Carol Felice" />
+ <info name="programmer" value="Roger DiSilvestro" />
+ <info name="programmer" value="Susan Greer" />
+ <info name="programmer" value="Jeffrey Siegel" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-12-08-->
- <!--educational program-->
+ <!-- Dump released: 2020-12-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1" />
<dataarea name="flop" size="235010">
@@ -25379,8 +12165,80 @@ license:CC0-1.0
</part>
</software>
+ <software name="asbchrds">
+ <description>Aural Skills Trainer: Basic Chords</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="aural skills trainer- basic chords.woz" size="234800" crc="5d6f0dcd" sha1="66bf6f10f624194b4e4a3b07d73df6634101a17d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="asinterv">
+ <description>Aural Skills Trainer: Intervals</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234797">
+ <rom name="aural skills trainer- intervals.woz" size="234797" crc="3f71557f" sha1="45aeee7c6e7b270d200b88f10ea347e457d7eddf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="as7thchd">
+ <description>Aural Skills Trainer: Seventh Chords</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234802">
+ <rom name="aural skills trainer- seventh chords.woz" size="234802" crc="53f109be" sha1="1a90167817e3345497e7d661427200cff7c42c6e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="autoduel">
+ <description>Autoduel</description>
+ <year>1985</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-02 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234788">
+ <rom name="autoduel side a.woz" size="234788" crc="30bab310" sha1="2ba24828af2fa5cba208df14d44560e0cc4dd054" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234788">
+ <rom name="autoduel side b.woz" size="234788" crc="6c586f8d" sha1="985d1da266ee97daea7206b13f08fd39711b6fb5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="autotech1">
- <description>Automotive Technician Mathematics Volume 1: Whole Numbers and Fractions (A-762 version 1.0)</description>
+ <description>Automotive Technician Mathematics Volume 1: Whole Numbers &amp; Fractions (A-762 version 1.0)</description>
<year>1983</year>
<publisher>MECC</publisher>
<info name="developer" value="MECC" />
@@ -25388,8 +12246,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234854">
<rom name="automotive technician mathematics volume i v1.0.woz" size="234854" crc="ffae07f2" sha1="e08a373d9023f78b6594bc1f0bc8ca2be9cd77e1" />
@@ -25398,7 +12256,7 @@ license:CC0-1.0
</software>
<software name="autotech2">
- <description>Automotive Technician Mathematics Volume 2: Decimals and Percents (A-763 version 1.0)</description>
+ <description>Automotive Technician Mathematics Volume 2: Decimals &amp; Percents (A-763 version 1.0)</description>
<year>1983</year>
<publisher>MECC</publisher>
<info name="developer" value="MECC" />
@@ -25406,8 +12264,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234848">
<rom name="automotive technician mathematics volume ii v1.0.woz" size="234848" crc="cc38eda5" sha1="ca470fdc25ac9ddea31287d7e5c890ebdc987d8a" />
@@ -25415,6 +12273,142 @@ license:CC0-1.0
</part>
</software>
+ <software name="averages">
+ <description>Averages (version 1988)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234759">
+ <rom name="averages 1988.woz" size="234759" crc="e519f327" sha1="1fc5f4f6a051df0b8d2bbf0662bcdd68e7a91349" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="awardmakp">
+ <description>Award Maker Plus (version 23611)</description>
+ <year>1987</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="partno" value="23611" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="23611" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-02-18 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 1 - Program" />
+ <dataarea name="flop" size="234784">
+ <rom name="award maker plus v23611 disk a, side 1- program.woz" size="234784" crc="3fe1bda9" sha1="069a0305fe0a574b5306cfa75a9a9785f54a5aa7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 2 - Award library" />
+ <dataarea name="flop" size="234790">
+ <rom name="award maker plus v23611 disk a, side 2- award library.woz" size="234790" crc="671b4fee" sha1="b54dafd57691dfae81f0efc361cdf3fdc93b11e5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 1 - Award library" />
+ <dataarea name="flop" size="234790">
+ <rom name="award maker plus v23611 disk b, side 1- award library.woz" size="234790" crc="67b7873e" sha1="ff8dc7c93661fc385faa1c8a840a9d1002c47dc2" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 2 - Award library" />
+ <dataarea name="flop" size="234790">
+ <rom name="award maker plus v23611 disk b, side 2- award library.woz" size="234790" crc="c9af9884" sha1="d69f538825e793f0258839a73a00b07963869334" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 1 - Sports award library" />
+ <dataarea name="flop" size="234797">
+ <rom name="award maker plus v23611 disk c, side 1- sports award library.woz" size="234797" crc="a5b9a990" sha1="0d85c18f0cd083dd2440e7bf2d8e989f0b392498" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 2 - Sports award library" />
+ <dataarea name="flop" size="234797">
+ <rom name="award maker plus v23611 disk c, side 2- sports award library.woz" size="234797" crc="f744f379" sha1="a789655a31ad361194f72072a71cae18c173326c" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D Side 1 - Sports award library" />
+ <dataarea name="flop" size="234797">
+ <rom name="award maker plus v23611 disk d, side 1- sports award library.woz" size="234797" crc="806d7358" sha1="085272bb25aed570698c519e4d425ed75c2c3854" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D Side 2 - Sports award library" />
+ <dataarea name="flop" size="234797">
+ <rom name="award maker plus v23611 disk d, side 2- sports award library.woz" size="234797" crc="e2fda40f" sha1="7b5cf779d45d9e19b796b182e9ae879b0d50a164" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk M Side 1 - Education award library" />
+ <dataarea name="flop" size="234800">
+ <rom name="award maker plus v23611 disk m, side 1- education award library.woz" size="234800" crc="a6e3c927" sha1="e9654049fdfd7e89d2bb6c3e729d057d1c93ca3c" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk M Side 2 - Education award library" />
+ <dataarea name="flop" size="234800">
+ <rom name="award maker plus v23611 disk m, side 2- education award library.woz" size="234800" crc="53a83f60" sha1="b725b5ab8dc02dc6b2be2ec5b0dacf50efeb397d" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk N Side 1 - Education award library" />
+ <dataarea name="flop" size="234800">
+ <rom name="award maker plus v23611 disk n, side 1- education award library.woz" size="234800" crc="db1bcad4" sha1="20ab4d663de3556343f7b5d89346d189b788ec94" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk N Side 2 - Education award library" />
+ <dataarea name="flop" size="234800">
+ <rom name="award maker plus v23611 disk n, side 2- education award library.woz" size="234800" crc="5418b0d1" sha1="2a52b86ba00a0db0d9ef4636847a4b512e9b96f5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="axisassn">
+ <description>Axis Assassin</description>
+ <year>1982</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="John Field" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-10 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="226823">
+ <rom name="axis assassin.woz" size="226823" crc="332a66bc" sha1="c940a0f83dcb27039cfa7bd08e7fa11163cadbed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="b24">
+ <description>B-24 (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Gray" />
+ <info name="programmer" value="Peter Schmitt" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-04 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234789">
+ <rom name="b-24 v1.0.woz" size="234789" crc="008eae81" sha1="3268c779e978260aff06acd875c3c243463bd797" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="backitup3v34" cloneof="backitup3">
<description>Back It Up III (version 3.4)</description>
<year>1983</year>
@@ -25423,9 +12417,9 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple ][, Apple ][+, Apple //e, and enhanced Apple //e with 48K." />
<info name="version" value="3.4" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE" />
- <!--Due to aggressive copy protection, it does not boot on later models (//c or IIgs).-->
- <!--Dump released: 2024-03-17-->
- <!--disk utility program-->
+ <!-- Due to aggressive copy protection, it does not boot on later models (//c or IIgs). -->
+ <!-- Dump released: 2024-03-17 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="301268">
<rom name="back it up iii v3.4.woz" size="301268" crc="859eceae" sha1="5f5250a50115f8e069d8c79d6f568d3e2d8ba5b1" />
@@ -25441,8 +12435,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="3.6" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-27-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-27 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="121660">
<rom name="back it up iii v3.6.woz" size="121660" crc="9161150d" sha1="07398e4da71fcba119534eb56ec3feba26958170" />
@@ -25450,38 +12444,535 @@ license:CC0-1.0
</part>
</software>
- <software name="bckydbrd_525" cloneof="bckydbrd">
- <description>Backyard Birds (A-216 version 1.0)</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-216" />
- <info name="programmer" value="Hassan Kaganda, John Persoon, Larry Phenow, Diane Portner, and James L. Thompson" />
+ <software name="bagtrks2v20" cloneof="bagtrks2">
+ <description>Bag of Tricks 2 (version 2.0)</description>
+ <year>1985</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Don Worth" />
+ <info name="programmer" value="Peter Lechner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-05 -->
+ <!-- disk utility program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234837">
+ <rom name="bag of tricks 2.0.woz" size="234837" crc="1f937c7a" sha1="e2e8e2320acd3c2857859a2d42bd9f013e6a479f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bagtrks2">
+ <description>Bag of Tricks 2 (version 2.1)</description>
+ <year>1987</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Don Worth" />
+ <info name="programmer" value="Peter Lechner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-06 -->
+ <!-- disk utility program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241471">
+ <rom name="bag of tricks v2.1.woz" size="241471" crc="fcac8d4e" sha1="e879a1875a6dc3263bd0d239e130c397458b841e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="balpower">
+ <description>Balance of Power</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Chris Crawford" />
<info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-10 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241455">
+ <rom name="balance of power.woz" size="241455" crc="16358903" sha1="38815538a20960d3b5561c9673b1127fc7f420f1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="balanact">
+ <description>Balancing Act</description>
+ <year>1985</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="programmer" value="Morgan O'Brien" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234773">
+ <rom name="balancing act.woz" size="234773" crc="83efa25f" sha1="e9b57093a64542baacfca9f48f244093909255b6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ballblaz">
+ <description>Ballblazer</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Lucasfilm Games and K-Byte" />
+ <info name="programmer" value="David Levine" />
+ <info name="programmer" value="Peter Langston" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240138">
+ <rom name="ballblazer.woz" size="240138" crc="ce1f6dbf" sha1="02b24b12a45cd437dd53be25f73c51da99e8be98" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="balt1985">
+ <description>Baltic 1985: Corridor to Berlin (version 1.0)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Phillip Bradley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-04 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234832">
+ <rom name="baltic 1985.woz" size="234832" crc="fc186a5b" sha1="4595042f17a46439398c3a345e0c53ebfacb956d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bsstoryb11" cloneof="bsstoryb">
+ <description>Bank Street StoryBook (version 1.1)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Pixelwerks" />
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- graphics progam -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="121660">
+ <rom name="bank street storybook v1.1 side a - program.woz" size="121660" crc="218743c5" sha1="c759d3e83694582d7db3ec77cf83d6d0b7200a96" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234786">
+ <rom name="bank street storybook v1.1 side b - samples files.woz" size="234786" crc="dafab078" sha1="8b1cfc0a91de28b2433c3e8eba0e8ad2e83cb5ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bsstoryb">
+ <description>Bank Street Storybook (version 1.2)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Pixelwerks" />
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-16 -->
+ <!-- graphics progam -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234779">
+ <rom name="bank street storybook v1.2 side a.woz" size="234779" crc="98e03cb9" sha1="b9d24394cd6c8a5f8f53a224234ff98cd69cf2d4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234779">
+ <rom name="bank street storybook v1.2 side b.woz" size="234779" crc="29f0f0cb" sha1="60b15f34f20f2d2b235a845dd7cdb53ab03b33fe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bballalph">
+ <description>Banner Books: All Along The Alphabet</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Angelo Scalise" />
+ <info name="programmer" value="Cindy Chapman" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-11-->
- <!--educational program-->
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234872">
- <rom name="backyard birds.woz" size="234872" crc="e4045b4e" sha1="8dcd3c0b1a7dfd93bc456284e316ba6c73f53873" />
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234794">
+ <rom name="banner books- all along the alphabet - program.woz" size="234794" crc="ca4d38c6" sha1="a520133e95332ae2426046d31f4ff25bcdeb0afe" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds" />
+ <dataarea name="flop" size="234798">
+ <rom name="banner books- all along the alphabet - backgrounds.woz" size="234798" crc="6417fd63" sha1="fb39628f5e30430fab5a9a449ea657339ac2ee3d" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Clip Art" />
+ <dataarea name="flop" size="234795">
+ <rom name="banner books- all along the alphabet - clip art.woz" size="234795" crc="60245c2f" sha1="7f37a24bdea967f196765438983799a19f22ba56" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Fonts and More Clip Art" />
+ <dataarea name="flop" size="234805">
+ <rom name="banner books- all along the alphabet - clip art and fonts.woz" size="234805" crc="86e09978" sha1="6eff678f1cc39897f6a357d4c5e46bce8defbc82" />
</dataarea>
</part>
</software>
- <software name="bckydbrd">
- <description>Backyard Birds (A-216 version 1.0) (800K 3.5")</description>
- <year>1989</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-216" />
- <info name="programmer" value="Hassan Kaganda, John Persoon, Larry Phenow, Diane Portner, and James L. Thompson" />
+ <software name="bbyrscday">
+ <description>Banner Books: Your School Day</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Karl Prewo" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234787">
+ <rom name="banner books- your school day - program.woz" size="234787" crc="42308ab1" sha1="f620e59b14fbceaedcc653c4a9064faf4646c5c6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds" />
+ <dataarea name="flop" size="234791">
+ <rom name="banner books- your school day - backgrounds.woz" size="234791" crc="9b406e8d" sha1="4b313ce23ed18f8932a706ae7a85c6b431cf0c8a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art" />
+ <dataarea name="flop" size="234788">
+ <rom name="banner books- your school day - clip art.woz" size="234788" crc="db2d538c" sha1="cb1905295c766148b75c0516b6813d937e903516" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Fonts and More Clip Art" />
+ <dataarea name="flop" size="234798">
+ <rom name="banner books- your school day - clip art and fonts.woz" size="234798" crc="ba21ea72" sha1="e6e3b0c079dc3b1ceec24059c6fa6e81b6489b15" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="banmania">
+ <description>BannerMania (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Martin Kahn" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-09 Redumped: 2021-12-14-->
- <!--educational program-->
+ <!-- Dump released: 2025-10-27 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345386">
- <rom name="backyard birds 800k.woz" size="1345386" crc="1929bb55" sha1="12a3cee293e0d96e7bf4d2928ef1dd14e60a8514" />
+ <dataarea name="flop" size="1296683">
+ <rom name="bannermania 800k.woz" size="1296683" crc="ab51c58c" sha1="2165a5e54b334f95a4fcc6d25f5a841f1f2ae476" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batsblfr">
+ <description>Bats in the Belfry</description>
+ <year>1983</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="Samuel Moore" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-07 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121627">
+ <rom name="bats in the belfry.woz" size="121627" crc="b42681ec" sha1="84d8e3a1cc653faee017a319decdd87d353d7c36" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="battcmdr">
+ <description>Battalion Commander (version 1.0)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Hille" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="229705">
+ <rom name="battalion commander.woz" size="229705" crc="946c3af0" sha1="0a6b79a9fabdd8e15365151cde8638a17e04e237" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="btlchess">
+ <description>Battle Chess</description>
+ <year>1990</year>
+ <publisher>Interplay Productions</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234739">
+ <rom name="battle chess side a.woz" size="234739" crc="2cca2ba1" sha1="091148e230f5a1a95b1195360dc852447d48951c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234739">
+ <rom name="battle chess side b.woz" size="234739" crc="ca593d39" sha1="051edd15eb032897d32543fd400c564347ebacb4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlantm13" cloneof="batlantm">
+ <description>Battle of Antietam (version 1.3)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-04 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="221526">
+ <rom name="battle of antietam v1.3 side a.woz" size="221526" crc="1f65175b" sha1="970b62bcdc86d4da591f7b33cff9c5c71dd1af4c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234838">
+ <rom name="battle of antietam v1.3 side b.woz" size="234838" crc="aeb2d1f0" sha1="7e8314d8f4660d69a0ad87c561078977a0bc498d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlantm">
+ <description>Battle of Antietam (version 1.5)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="241490">
+ <rom name="battle of antietam v1.5 side a.woz" size="241490" crc="4fe44cfb" sha1="cac38a73ce13f2b31abe7eb710d874a3816cd5d1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="240466">
+ <rom name="battle of antietam v1.5 side b.woz" size="240466" crc="c07dff1e" sha1="1b1e8a4934696a21c4ab4804cf064a0905eb32cf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlcrsr">
+ <description>Battlecruiser (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - World War I" />
+ <dataarea name="flop" size="234836">
+ <rom name="battlecruiser - world war i.woz" size="234836" crc="ccbba242" sha1="0f649587feece0280b4a2f3e070dff72ac20272f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - World War II" />
+ <dataarea name="flop" size="234837">
+ <rom name="battlecruiser - world war ii.woz" size="234837" crc="331e5100" sha1="e0b1a32c8edb5a5bc0b62be0f72e811d2fe241d5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlfrnt">
+ <description>Battlefront (version 1.0)</description>
+ <year>1986</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235566">
+ <rom name="battlefront side a - master disk.woz" size="235566" crc="7cd8b98f" sha1="084932f545aef9937a78b29b133e42f9d00f5e3a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235568">
+ <rom name="battlefront side b - scenario disk.woz" size="235568" crc="ac27d934" sha1="1a3126d7b7e8bbf37b68744adf374a80d30fe0a1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlnapo">
+ <description>Battles of Napoleon (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Game" />
+ <dataarea name="flop" size="241491">
+ <rom name="battles of napoleon - game disk, side a.woz" size="241491" crc="42ceaa38" sha1="185b0d81b0b154de1f5650599937bd8c6f829804" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Game" />
+ <dataarea name="flop" size="241490">
+ <rom name="battles of napoleon - game disk, side b.woz" size="241490" crc="f14e14d8" sha1="1db9f38e18756b394753f39c08f8786953881ab4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Scenario (Boot)" />
+ <dataarea name="flop" size="241495">
+ <rom name="battles of napoleon - scenario disk, side a (boot).woz" size="241495" crc="0f2650d9" sha1="27889513a40dcb475e9133b8e4408f35dcd294a0" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Scenario" />
+ <dataarea name="flop" size="241494">
+ <rom name="battles of napoleon - scenario disk, side b.woz" size="241494" crc="0bd0319c" sha1="3a95e975e6bed52214b944fcf7e5c545bba328f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bshipcmd">
+ <description>Battleship Commander</description>
+ <year>1980</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Erik Kilk" />
+ <info name="programmer" value="Matthew Jew" />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2022-02-24 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234809">
+ <rom name="battleship commander.woz" size="234809" crc="e0dbe815" sha1="4e72e84cdf56f7d710dd56c21148019ce3ad46f1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bzone">
+ <description>Battlezone (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-19 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233449">
+ <rom name="battlezone.woz" size="233449" crc="c2842b0f" sha1="b466c5e38944ff0b74d46b43178611278f2fd785" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbugconcr1" cloneof="bbugconc">
+ <description>Battling Bugs &amp; Concentraction (revision 1)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - 13-sector" />
+ <feature name="sl6_default" value="diskiing13" />
+ <dataarea name="flop" size="234818">
+ <rom name="battling bugs and concentraction rev. 1 side a - 13-sector version.woz" size="234818" crc="88be8e96" sha1="2ca074b96e9b9e30bd0397b60a818c5af2209489" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - 16-sector" />
+ <feature name="sl6_default" value="diskiing" />
+ <dataarea name="flop" size="234818">
+ <rom name="battling bugs and concentraction rev. 1 side b - 16-sector version.woz" size="234818" crc="b59a3765" sha1="1742871f52f71fb74cc0f7c4e3751478a2ae62a7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbugconc">
+ <description>Battling Bugs &amp; Concentraction (revision 2)</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="battling bugs and concentraction rev. 2.woz" size="234800" crc="5c8d74f9" sha1="73ed8e099405e1776ca026e6ed83101e50fed6c5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bcqft">
+ <description>BC's Quest for Tires</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Justin Gray" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="253454">
+ <rom name="bc's quest for tires.woz" size="253454" crc="ce25b417" sha1="2a85e860f86748b14a913c3cb7a94762fa1d5de4" />
</dataarea>
</part>
</software>
@@ -25490,11 +12981,12 @@ license:CC0-1.0
<description>Beach Landing</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-28-->
- <!--action game-->
+ <!-- Dump released: 2019-09-28 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="235485">
<rom name="beach landing.woz" size="235485" crc="8ad464a0" sha1="7605b34cf01ed8d96c4a3b0e9067ecd91cb8ba44" />
@@ -25506,11 +12998,13 @@ license:CC0-1.0
<description>Beach-Head</description>
<year>1985</year>
<publisher>Access Software</publisher>
- <info name="programmer" value="Brent Erickson, Bruce Carver, and Bryan Brandenburg" />
+ <info name="programmer" value="Brent Erickson" />
+ <info name="programmer" value="Bruce Carver" />
+ <info name="programmer" value="Bryan Brandenburg" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-08-03-->
- <!--action game-->
+ <!-- Dump released: 2019-08-03 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="235525">
<rom name="beach-head.woz" size="235525" crc="45f55dbd" sha1="c805e8bd5463b15e7e7326620b5abc186bd4714e" />
@@ -25525,8 +13019,8 @@ license:CC0-1.0
<info name="programmer" value="Peter Adams" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--action game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234760">
<rom name="beach-head ii.woz" size="234760" crc="b28bb733" sha1="58b13942ffd570223f755f867cf9ba76fc3c689d" />
@@ -25534,6 +13028,385 @@ license:CC0-1.0
</part>
</software>
+ <software name="bbstlmer">
+ <description>Beauty and the Beast &amp; The Little Mermaid (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296188">
+ <rom name="beauty and the beast and the little mermaid 800k.woz" size="1296188" crc="4a2ad616" sha1="677828388d399ba055587c6db6a2c2915ff87873" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bellhop">
+ <description>Bellhop</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="Garry Kitchen" />
+ <info name="programmer" value="John van Ryzin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-31 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240180">
+ <rom name="bellhop.woz" size="240180" crc="14f96de9" sha1="8b864bdfeb11f029295bd1b7e7337cc857510bc7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="belwrt">
+ <description>Below the Root</description>
+ <year>1984</year>
+ <publisher>Windham Classics</publisher>
+ <info name="programmer" value="Dale DeSharone" />
+ <info name="programmer" value="William Groetzinger" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233490">
+ <rom name="below the root side a.woz" size="233490" crc="9129bb1c" sha1="a51a653e2886a00f636a7bc3a192745dcb06327b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233515">
+ <rom name="below the root side b.woz" size="233515" crc="f3f181f8" sha1="2451c2c2f441c9b17ea82619e57e22e865c926d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bapmnr">
+ <description>Beneath Apple Manor (version 1.1 30-JUL-1979)</description>
+ <year>1979</year>
+ <publisher>The Software Factory</publisher>
+ <info name="programmer" value="Don Worth" />
+ <info name="usage" value="Requires a 32K Apple ][ with Integer BASIC in ROM." />
+ <info name="version" value="1.1 30-JUL-1979" />
+ <sharedfeat name="compatibility" value="A2" />
+ <!-- Dump released: 2022-02-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="beneath apple manor.woz" size="234800" crc="95533df3" sha1="5db4eb223f9daca74d1b06cfbe7593023818ac14" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bapmnrse">
+ <description>Beneath Apple Manor: The Special Edition</description>
+ <year>1982</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Don Worth" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-11 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234826">
+ <rom name="beneath apple manor- the special edition.woz" size="234826" crc="69ad7676" sha1="15992953d222818d96a8a2e87854ebdf32fd62e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bignlitl">
+ <description>BIG &amp; little: Books, Posters, and Cards for Muppet Slate</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234857">
+ <rom name="big and little.woz" size="234857" crc="8f793182" sha1="d2081eed06d87a7587a44500286ebfe3d0631d91" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmcutcud">
+ <description>Big Book Maker: Cute &amp; Cuddly (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296174">
+ <rom name="big book maker- cute and cuddly 800k.woz" size="1296174" crc="c2a0e20e" sha1="e41e2142880348ae3520c147d2937f0badcbe1b3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmftanr">
+ <description>Big Book Maker: Favorite Fairy Tales &amp; Nursery Rhymes</description>
+ <year>1990</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Fred Kutz" />
+ <info name="programmer" value="Bill de Beaubien" />
+ <info name="programmer" value="Diane Riendeau" />
+ <info name="programmer" value="Herb Perez" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234827">
+ <rom name="big book maker- favorite fairy tales &amp; nursery rhymes - program and typestyles.woz" size="234827" crc="38fb86c0" sha1="45c5324d3c47fbc0a23b6e4d8ad1ee38265e9d18" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds and Frames" />
+ <dataarea name="flop" size="234827">
+ <rom name="big book maker- favorite fairy tales &amp; nursery rhymes - backgrounds and frames.woz" size="234827" crc="e4bbecaf" sha1="c51a442990f98190c53b0c9ec6518a6ac068c934" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art" />
+ <dataarea name="flop" size="234815">
+ <rom name="big book maker- favorite fairy tales &amp; nursery rhymes - clip art 1.woz" size="234815" crc="9aa1d23a" sha1="4e25a4c03facb16af21a1dd5b1260b0540246c2c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - More Clip Art" />
+ <dataarea name="flop" size="234815">
+ <rom name="big book maker- favorite fairy tales &amp; nursery rhymes - clip art 2.woz" size="234815" crc="27795ccd" sha1="64c1598085e65c65e6e5af1b8e0234877b583d6d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmfgayou">
+ <description>Big Book Maker: Feeling Good About Yourself (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296188">
+ <rom name="big book maker- feeling good about yourself 800k.woz" size="1296188" crc="2f5b800f" sha1="0ed862a3896f34ec5b35cec08cb25eeaf9481588" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmletpret">
+ <description>Big Book Maker: Let's Pretend (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296174">
+ <rom name="big book maker- let's pretend 800k.woz" size="1296174" crc="621eb931" sha1="356d287c3a079d2121c7739e0e6cfe4a1a7a5487" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmletnumsh">
+ <description>Big Book Maker: Letters, Numbers, Shapes (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296185">
+ <rom name="big book maker- letters, numbers, shapes 800k.woz" size="1296185" crc="48ae97fa" sha1="58ef07f6485d0e05ee4f87477cabc797b520b60a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmmythleg">
+ <description>Big Book Maker: Myths &amp; Legends (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296176">
+ <rom name="big book maker- myths and legends 800k.woz" size="1296176" crc="1b4bf1af" sha1="348b412fdffae8d6dea20cffcf2b83c2347f2425" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmquentin">
+ <description>Big Book Maker: Quentin (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296168">
+ <rom name="big book maker- quentin 800k.woz" size="1296168" crc="630bc219" sha1="ef27a456a84620bff2c4dee6fc3e70f4e3afe694" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmttafh_525" cloneof="bbmttafh">
+ <description>Big Book Maker: Tall Tales &amp; American Folk Heroes</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234821">
+ <rom name="big book maker- tall tales &amp; american folk heroes - program &amp; typestyles.woz" size="234821" crc="efa77490" sha1="23b2ed7f5b1251fbfc99c574175b57acb6d804ab" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Backgrounds and Frames" />
+ <dataarea name="flop" size="234823">
+ <rom name="big book maker- tall tales &amp; american folk heroes - backgrounds and frames.woz" size="234823" crc="bc7ec368" sha1="dc9c89c66d172b945c4e6eacefd507b9ba8f5ad6" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art 1" />
+ <dataarea name="flop" size="234811">
+ <rom name="big book maker- tall tales &amp; american folk heroes - clip art 1.woz" size="234811" crc="5be89642" sha1="28fe9fd4a569f0da6463b7a4684b5852a37929d8" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Clip Art 2" />
+ <dataarea name="flop" size="234811">
+ <rom name="big book maker- tall tales &amp; american folk heroes - clip art 2.woz" size="234811" crc="3a7b313a" sha1="8e384d3f958cad856a4da47dd6205cdf97506179" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmttafh">
+ <description>Big Book Maker: Tall Tales &amp; American Folk Heroes (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296194">
+ <rom name="big book maker- tall tales and american folk heroes 800k.woz" size="1296194" crc="165b8b53" sha1="87b099520000e5327b8750ec84167fe1a27ca315" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbmrainfor">
+ <description>Big Book Maker: The Rain Forest (800K 3.5")</description>
+ <year>1993</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296179">
+ <rom name="big book maker- the rain forest 800k.woz" size="1296179" crc="3e774638" sha1="8ab9a0d38d522b92235de0baf0379039cd38dbaa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbm3princ">
+ <description>Big Book Maker: The Three Princesses (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296184">
+ <rom name="big book maker- the three princesses 800k.woz" size="1296184" crc="040676dd" sha1="d3a6bb6a79069df54d79de9ee472cfeb1df9ef90" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bikehiker0">
+ <description>Bike Hike (revision 0)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 0" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="bike hike.woz" size="234762" crc="fdb3b0af" sha1="a4e22451518f2d760f2a2d3b0fb97f099db5ae55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="birds">
+ <description>Birds</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234742">
+ <rom name="birds.woz" size="234742" crc="e5d817bf" sha1="75928bbddc9ebedf98cd5724342b85c5ea27a6ac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bismarck">
+ <description>Bismarck: The North Sea Chase</description>
+ <year>1987</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Tony Stoddart" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-02 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233553">
+ <rom name="bismarck- the north sea chase.woz" size="233553" crc="c17a9e53" sha1="bf529052b161149aa810289bf4e3213ec2c0d40c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="blkbeltr1">
<description>Black Belt (revision 1)</description>
<year>1984</year>
@@ -25542,8 +13415,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-21-->
- <!--sports game-->
+ <!-- Dump released: 2022-02-21 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234795">
<rom name="black belt.woz" size="234795" crc="39c67649" sha1="0541b0b2a510db628141e5181fb3f5f9e380d6f4" />
@@ -25551,17 +13424,133 @@ license:CC0-1.0
</part>
</software>
- <software name="bgbluff">
+ <software name="blkmagic">
+ <description>Black Magic</description>
+ <year>1987</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Peter Ward" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="252868">
+ <rom name="black magic.woz" size="252868" crc="9579ff50" sha1="50106741bfb8c7a78adb0b1c40b39d166509fcda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blzpdlsr0" cloneof="blzpdls">
+ <description>Blazing Paddles (revision 0)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 0" />
+ <!-- This is the first release, identifiable by the lack of any visible version number during boot. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- Dump released: 2025-01-26 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234744">
+ <rom name="blazing paddles.woz" size="234744" crc="fa140412" sha1="e2576e80c2f834eac07f9ba9bf75133132fe32ec" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blzpdls04421" cloneof="blzpdls">
+ <description>Blazing Paddles (version 04421)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="04421" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04421" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- Dump released: 2025-01-26 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234774">
+ <rom name="blazing paddles v04421.woz" size="234774" crc="58593d08" sha1="102de9f7a1ab31a6753fadb2993a82deae5fc1bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blzpdls">
+ <description>Blazing Paddles (version 04431)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="04431" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04431" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- Dump released: 2025-01-26 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234754">
+ <rom name="blazing paddles v04431.woz" size="234754" crc="70de3e58" sha1="a9e1f66cb00be73a2497ecd6142510ee96eda9ba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkfndrs">
+ <description>Blockers and Finders</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234807">
+ <rom name="blockers and finders.woz" size="234807" crc="10a1d4fd" sha1="7242b9035e77e14ff47597682f32968b119e72cc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blmurder">
+ <description>Bloody Murder</description>
+ <year>1979</year>
+ <publisher>Stoneware</publisher>
+ <info name="author" value="Arthur Wells, Jr." />
+ <info name="usage" value="Requires an Apple ][ with 48K and Integer BASIC in ROM." />
+ <sharedfeat name="compatibility" value="A2" />
+ <!-- Dump released: 2019-11-12 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="bloody murder.woz" size="234791" crc="647975ac" sha1="f6e5ad2dc64dd040f10d861c2c7c7af9268130ff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bgbluff_525" cloneof="bgbluff">
<description>Bluegrass Bluff (A-256 version 1.0)</description>
<year>1991</year>
<publisher>MECC</publisher>
<info name="partno" value="A-256" />
- <info name="programmer" value="Rich Bergeron, Gene Breault, Charolyn Kapplinger, Kevin Neff, and Dick Sisco" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Dick Sisco" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-11-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234869">
<rom name="bluegrass bluff.woz" size="234869" crc="ccef05ca" sha1="4cf9cbf571e3de33af0cb70101f099f3aa55aa4b" />
@@ -25569,6 +13558,281 @@ license:CC0-1.0
</part>
</software>
+ <software name="bgbluff">
+ <description>Bluegrass Bluff (A-256 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-256" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234869">
+ <rom name="bluegrass bluff.woz" size="234869" crc="ccef05ca" sha1="4cf9cbf571e3de33af0cb70101f099f3aa55aa4b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bolo">
+ <description>Bolo</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="developer" value="Elvyn Software" />
+ <info name="programmer" value="Jim Lane" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="bolo.woz" size="234763" crc="4cb41791" sha1="40cb2fda792b61eca0ead919277c7ae6eb3ba56c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bomballey">
+ <description>Bomb Alley (version 1.0)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="bomb alley.woz" size="234788" crc="f53fcc59" sha1="fcedc2cf1bf2b0532e80dbeb95905c23699be036" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bopnwrst">
+ <description>Bop'n Wrestle</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Beam Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-16 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241412">
+ <rom name="bop 'n wrestle.woz" size="241412" crc="f0d0bbd1" sha1="bb8c7aaf74f440d3c7df1c1b331bed24db526cdb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bopabet">
+ <description>Bop-A-Bet</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-05 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="bop-a-bet.woz" size="234786" crc="9ff0b003" sha1="974b47183ef19b4e451b81568dbd3479acfe6c6e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="botgardn">
+ <description>Botanical Gardens</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Robert Kimball" />
+ <info name="programmer" value="David J. Donoghue" />
+ <info name="programmer" value="Patrick Kehoe" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234828">
+ <rom name="botanical gardens.woz" size="234828" crc="1edefb2b" sha1="58f1b1e715d0ff9f7bb866dcb6af16832d8fa0c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bounce">
+ <description>Bounce!</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="M. Fish" />
+ <info name="programmer" value="C. Brock" />
+ <info name="programmer" value="M. Kosel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234832">
+ <rom name="bounce.woz" size="234832" crc="12697c53" sha1="3bb1c5f96b93bf33da1bb6abb1482e9b702fe107" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bnckmg">
+ <description>Bouncing Kamungas!</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Tom Becklund" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-01 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="81700">
+ <rom name="bouncing kamungas.woz" size="81700" crc="c4de657e" sha1="f2f6299d5efa68eeb087990daf3df560911e3950" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouldashmf" cloneof="bouldash">
+ <description>Boulder Dash (Micro Fun)</description>
+ <year>1984</year>
+ <publisher>Micro Fun</publisher>
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="boulder dash.woz" size="234761" crc="244f1615" sha1="49a4aab8bd689fd45a2d5c6733259c16d684a564" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouldasho" cloneof="bouldash">
+ <description>Boulder Dash (Ozisoft)</description>
+ <year>1984</year>
+ <publisher>Ozisoft</publisher>
+ <!-- Distributor in Australia -->
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 64K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234778">
+ <rom name="boulder dash (ozisoft).woz" size="234778" crc="f73b31ec" sha1="4a1dc5114a6b59788a389d7877f25557e9ba15ee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouldash">
+ <description>Boulder Dash (Super Boulder Dash Collection) (Electronic Arts)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 64K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228143">
+ <rom name="super boulderdash.woz" size="228143" crc="1e79cd80" sha1="b8bf9b84aa306239c61f06c7fcb76364a63b1f07" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bdconkit">
+ <description>Boulder Dash Construction Kit</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Pat Montelo" />
+ <info name="programmer" value="Fernando Herrera" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- game development utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234802">
+ <rom name="boulder dash construction kit.woz" size="234802" crc="986ddf46" sha1="efefeaab200686d9783fb7c8f0116e5fcf791e92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouldash2">
+ <description>Boulder Dash II (Super Boulder Dash Collection) (Electronic Arts)</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="original_publisher" value="First Star Software" />
+ <info name="author" value="Peter Liepa" />
+ <info name="author" value="Chris Grey" />
+ <info name="programmer" value="Pat Montelo" />
+ <info name="usage" value="Requires a 64K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228146">
+ <rom name="super boulderdash ii.woz" size="228146" crc="3d381683" sha1="d78c2f885742a1aae5d3d7e6ffff8af3481f28d9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brkarden">
+ <description>Breakthrough in the Ardennes (version 1.1)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="260956">
+ <rom name="breakthrough in the ardennes v1.1 side a.woz" size="260956" crc="01d0ac87" sha1="af8968c9c155ca7c3b2a1bbf105411e4231b6935" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="260956">
+ <rom name="breakthrough in the ardennes v1.1 side b.woz" size="260956" crc="aecd562e" sha1="a0b548253b546c95ab247027d7d3242aabba0841" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brucelee">
+ <description>Bruce Lee</description>
+ <year>1984</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Rick Mirsky" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-16 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="208112">
+ <rom name="bruce lee.woz" size="208112" crc="fbdc4cd0" sha1="7729ee00d0ec840f1506252202236440e7dc7b41" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bublbobl">
<description>Bubble Bobble</description>
<year>1988</year>
@@ -25577,8 +13841,8 @@ license:CC0-1.0
<info name="programmer" value="Chris Eisnaugle" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-19-->
- <!--action game-->
+ <!-- Dump released: 2024-04-19 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234789">
@@ -25593,6 +13857,250 @@ license:CC0-1.0
</part>
</software>
+ <software name="bugbyters">
+ <description>Bugbyter (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Ted Cohn" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- developer utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121606">
+ <rom name="bugbyter (softsmith).woz" size="121606" crc="87fa5500" sha1="38d27368550a279a589cf6ba5c33b3c7ad709e4e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubm">
+ <description>Bulletin Board Maker (version 1.0)</description>
+ <year>1992</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234775">
+ <rom name="bulletin board maker v1.0 - program.woz" size="234775" crc="1e2f3a96" sha1="055e47960492c032ab33c92affd4e9e1f0a713f6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Posters and Nutty Numbers" />
+ <dataarea name="flop" size="234793">
+ <rom name="bulletin board maker v1.0 - posters and nutty numbers.woz" size="234793" crc="86f54c4a" sha1="06cf606bc56dddb011a1c8f55231c882f2b4eef0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art" />
+ <dataarea name="flop" size="234776">
+ <rom name="bulletin board maker v1.0 - clip art.woz" size="234776" crc="0a2da583" sha1="771960991713e444b412d415b5790699a90d3284" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Fonts" />
+ <dataarea name="flop" size="234773">
+ <rom name="bulletin board maker v1.0 - fonts.woz" size="234773" crc="63536b43" sha1="c8dd65bae1275e073943b07e6265ad61e37c2c12" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubmcitc">
+ <description>Bulletin Board Maker: City &amp; Country</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Kristine Larson" />
+ <info name="programmer" value="Cindy Chapman" />
+ <info name="programmer" value="Chris Lewis" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234794">
+ <rom name="bulletin board maker- city and country - program.woz" size="234794" crc="8f947ad9" sha1="db6107dcbc62d5b693a359d6615b986ed155d588" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Posters" />
+ <dataarea name="flop" size="234794">
+ <rom name="bulletin board maker- city and country - posters.woz" size="234794" crc="548338cc" sha1="2ffa7c81ec78b41d57670e10d8c38a03dbd6d2c0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art" />
+ <dataarea name="flop" size="234795">
+ <rom name="bulletin board maker- city and country - clip art.woz" size="234795" crc="51025379" sha1="72b790435baff4de65f3bb680ed05a129665de92" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Frames and Fonts" />
+ <dataarea name="flop" size="234803">
+ <rom name="bulletin board maker- city and country - frames and fonts.woz" size="234803" crc="31cb2443" sha1="bc99f071d6246e44658601a27dedb1c7409d55a4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubmyourn">
+ <description>Bulletin Board Maker: Your Neighborhood</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ted Jalbert" />
+ <info name="programmer" value="Gerry Gigon" />
+ <info name="programmer" value="Angelo Scalise" />
+ <info name="programmer" value="Cindy Chapman" />
+ <info name="programmer" value="Ken Dube" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234797">
+ <rom name="bulletin board maker- your neighborhood - program.woz" size="234797" crc="161b6165" sha1="9ca6d7349f0402cd95366cb6b755b6e8369501c4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Posters" />
+ <dataarea name="flop" size="234797">
+ <rom name="bulletin board maker- your neighborhood - posters.woz" size="234797" crc="c817c61e" sha1="015efc5780362e0b3a790574b0485219e1889274" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Clip Art" />
+ <dataarea name="flop" size="234798">
+ <rom name="bulletin board maker- your neighborhood - clip art.woz" size="234798" crc="36a3fe16" sha1="c34122dbf4b55c00314cafd684ea020e1722003c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Frames and Fonts" />
+ <dataarea name="flop" size="234806">
+ <rom name="bulletin board maker- your neighborhood - frames and fonts.woz" size="234806" crc="1d680749" sha1="b9798267407fe1954364cd9fb929a71bc269843a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblgmes13" cloneof="bmblgmes14">
+ <description>Bumble Games (version 1.3)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="188203">
+ <rom name="bumble games v1.3.woz" size="188203" crc="f17536da" sha1="f1031c4176259c7c8e89c7dc22074ee48ec57dc1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblgmes14">
+ <description>Bumble Games (version 1.4)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="188203">
+ <rom name="bumble games v1.4.woz" size="188203" crc="9569d86e" sha1="247d7d1c904fdf39bcafc9badadf413120d5aed8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblplot10" cloneof="bmblplot">
+ <description>Bumble Plot (The Learning Company) (version 1.0)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="bumble plot v1.0.woz" size="234794" crc="7fcbba3f" sha1="07bfbdaedeb0319c61f36d47b2013b678c0563be" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblplot11" cloneof="bmblplot">
+ <description>Bumble Plot (The Learning Company) (version 1.1)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="214826">
+ <rom name="bumble plot v1.1.woz" size="214826" crc="4eaac25c" sha1="c3e41be7c1e0ff284a3b5a02ea66a26b54f54f90" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bmblplot">
+ <description>Bumble Plot (The Learning Company) (version 1.2)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="bumble plot v1.2.woz" size="234794" crc="abd9f5f4" sha1="bdf26d3c608a28b3a579dcf7ed08e9c9e1c80c7f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bzbghrvy">
+ <description>Buzz Bang Harvey</description>
+ <year>1984</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Scott Rackey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234758">
+ <rom name="buzz bang harvey.woz" size="234758" crc="28bdd244" sha1="069611e4ea118ef700972ae6480eb0a09bac1b0d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="calendar">
<description>Calendar</description>
<year>1988</year>
@@ -25600,8 +14108,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234766">
<rom name="calendar.woz" size="234766" crc="9d0c7d47" sha1="bc721113db6312ab669ded9254fddc37917a45cc" />
@@ -25609,6 +14117,50 @@ license:CC0-1.0
</part>
</software>
+ <software name="calgames">
+ <description>California Games</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Carl Mey" />
+ <info name="programmer" value="Edwin Reich" />
+ <info name="programmer" value="Ed Chu" />
+ <info name="programmer" value="Brian Fleming" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-28 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234817">
+ <rom name="california games side a.woz" size="234817" crc="70072db5" sha1="0aab85ab13746a7fdd0b3ef3cf787c632f4d11e7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234817">
+ <rom name="california games side b.woz" size="234817" crc="dcd0d791" sha1="f1d1ff129247ea0a440fa100a7f8a7ef565def7f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="callparr">
+ <description>Call The Parrot (version 12.01.1989)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="A. Tyler Cowell, Jr." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="12.01.1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="call the parrot v12.01.89.woz" size="234779" crc="95e04f3a" sha1="15a3a70f53dd329ea621d45287a608ca7497149f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="candyland">
<description>Candy Land</description>
<year>1988</year>
@@ -25616,8 +14168,8 @@ license:CC0-1.0
<info name="programmer" value="Michael Robert Hausman" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-17-->
- <!--board game-->
+ <!-- Dump released: 2024-04-17 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234773">
@@ -25632,6 +14184,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="canbalbz">
+ <description>Cannonball Blitz</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233483">
+ <rom name="cannonball blitz.woz" size="233483" crc="e2d1793b" sha1="fd216f318ee12ce05f4c47ba3f7555b8ebf83c2f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="canclmbr">
+ <description>Canyon Climber</description>
+ <year>1982</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Brian Mountford" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="68374">
+ <rom name="canyon climber.woz" size="68374" crc="757bf5fb" sha1="dd92b0e71a66226b2865a507645ebd10e7fea2d6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="capbbls">
<description>Capitalization: Building Better Language Skills</description>
<year>1991</year>
@@ -25639,8 +14223,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234756">
<rom name="capitalization.woz" size="234756" crc="aea53d17" sha1="9b773a8c049dd18baa74f4ae4c0beb0056004e42" />
@@ -25648,15 +14232,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="captgngt">
+ <description>Captain Goodnight and the Islands of Fear</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Mike Wise" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="323917">
+ <rom name="captain goodnight and the islands of fear side a.woz" size="323917" crc="470a2811" sha1="3642d9d5340fdea6542f4d09a7c926d2016373f5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234794">
+ <rom name="captain goodnight and the islands of fear side b.woz" size="234794" crc="f59c6dc2" sha1="e3c1a9d134eb1b0c8997f6a17a8c42941929749f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="carbuild">
<description>Car Builder (800K 3.5")</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1297213">
<rom name="car builder 800k.woz" size="1297213" crc="8d78c9a0" sha1="05a0f9e0e3d0d7be1c0a978e1314cc604b3d52cc" />
@@ -25669,13 +14279,23 @@ license:CC0-1.0
<year>1994</year>
<publisher>MECC</publisher>
<info name="partno" value="A-345" />
- <info name="programmer" value="Rich Bergeron, Beth Daniels, Dee Dee Daus, Debbie Effertz, Marty Euerle, Lon Koenig, Dan Megears, Sue Minor, Lawrence Peterson, Ju-Chang Wang, and LaDonna Williams" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Debbie Effertz" />
+ <info name="programmer" value="Marty Euerle" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Dan Megears" />
+ <info name="programmer" value="Sue Minor" />
+ <info name="programmer" value="Lawrence Peterson" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="LaDonna Williams" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-26-->
- <!--educational program-->
- <!--Modified to remove identifying site license information.-->
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296325">
<rom name="caravans to timbuktu 800k.woz" size="1296325" crc="07d2d2ab" sha1="7babe6d2b0d5434d099a32fb04cdb1bd95836a70" />
@@ -25690,8 +14310,8 @@ license:CC0-1.0
<info name="developer" value="ShareData" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234727">
@@ -25706,6 +14326,145 @@ license:CC0-1.0
</part>
</software>
+ <software name="carrierf">
+ <description>Carrier Force (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234818">
+ <rom name="carrier force.woz" size="234818" crc="e0f12291" sha1="8520e03b982a9834611f262d5b3709abf015bc82" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carrwar">
+ <description>Carriers at War</description>
+ <year>1984</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Master disk" />
+ <dataarea name="flop" size="235556">
+ <rom name="carriers at war disk 1a - master disk.woz" size="235556" crc="8cbe8c7e" sha1="0ac90558dbcac13f25be891421ea94dcc5df5dfb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Scenario disk" />
+ <dataarea name="flop" size="235558">
+ <rom name="carriers at war disk 1b - scenario disk.woz" size="235558" crc="7584231b" sha1="57698d71527b6dfea861d7cb9c6c8fcf003ee84e" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Backup scenario disk 1" />
+ <dataarea name="flop" size="235567">
+ <rom name="carriers at war disk 2a - backup scenario disk 1.woz" size="235567" crc="2bf0f8db" sha1="e773d5a53e270550f4a85e67ad48dcfafc4bd4d4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Backup scenario disk 2" />
+ <dataarea name="flop" size="235567">
+ <rom name="carriers at war disk 2b - backup scenario disk 2.woz" size="235567" crc="d2effe61" sha1="b23daea23ffc932504c43fe37c2adb7c3d0916e5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="casegtr">
+ <description>Case of the Great Train Robbery: Fact and Opinion</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="case of the great train robbery - fact or opinion.woz" size="234786" crc="7c129532" sha1="52d5d4207c13c082ca85bf2af1e9922e82cbc0f7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="casechic">
+ <description>Case of the Missing Chick: Finding The Main Idea</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234797">
+ <rom name="case of the missing chick - main idea and supporting details.woz" size="234797" crc="c02fae11" sha1="cf32964f2852d299008965e9dadc337e9932df1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="catmouse">
+ <description>Cat 'n Mouse</description>
+ <year>1986</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234764">
+ <rom name="cat 'n mouse.woz" size="234764" crc="f319ee15" sha1="b40b5b20cb597bece74a51a3ae2db910a9bb19c7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="catdetg">
+ <description>Categorizing: Detective Games</description>
+ <year>1988</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Bernie Gallagher" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235033">
+ <rom name="categorizing- detective games.woz" size="235033" crc="a0f9a0da" sha1="510c5bcebba1c16f5c64dffbf44f708c0e41eb53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="catskitt">
+ <description>Cats and Kittens</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234753">
+ <rom name="cats and kittens.woz" size="234753" crc="1cd14071" sha1="934e692bb045180a5e42f4f1bf7f78b6d729f0b6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cseffwmih">
<description>Cause and Effect: What Makes It Happen</description>
<year>1988</year>
@@ -25713,8 +14472,8 @@ license:CC0-1.0
<info name="developer" value="Troll Associates" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-02-02-->
- <!--educational program-->
+ <!-- Dump released: 2021-02-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234776">
<rom name="cause and effect- what makes it happen.woz" size="234776" crc="5b2d7be8" sha1="0348efd142a48068b27b0937dd623ab94145eeb4" />
@@ -25722,20 +14481,181 @@ license:CC0-1.0
</part>
</software>
- <software name="cavbustr">
- <description>Cavity Busters (A-284 version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-284" />
- <info name="programmer" value="R. Philip Bouchard, Gene Breault, Kevin Neff, Eileen Nannen, Larry Phenow, and Diane Portner" />
+ <software name="cvrncsto">
+ <description>Caverns of Callisto</description>
+ <year>1983</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="220149">
+ <rom name="caverns of callisto.woz" size="220149" crc="a2849124" sha1="6c91fb79711d99c7c5415f84de50b11282420d3c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cntralnc">
+ <description>Centauri Alliance</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-10 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="234852">
+ <rom name="centauri alliance disk 1a - program.woz" size="234852" crc="fa11e457" sha1="45b56d9fc178334c47f0ea2947f8ec184a9d002b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Roster" />
+ <dataarea name="flop" size="234851">
+ <rom name="centauri alliance disk 1b - roster.woz" size="234851" crc="5ef9c3ea" sha1="3e6b47520a9acd70805a32b8dda47df7f12c9ec6" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Scenario 1" />
+ <dataarea name="flop" size="234855">
+ <rom name="centauri alliance disk 2a - scenario 1.woz" size="234855" crc="c06b5bdb" sha1="9b100db35d8288bc37ffd442b06166f7a460ff14" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Scenario 2" />
+ <dataarea name="flop" size="234855">
+ <rom name="centauri alliance disk 2b - scenario 2.woz" size="234855" crc="e1c88f5b" sha1="a15e0d8f55218b3ccb4419a893f43af11acb8a0a" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Scenario 3" />
+ <dataarea name="flop" size="234855">
+ <rom name="centauri alliance disk 3a - scenario 3.woz" size="234855" crc="7b09e5bc" sha1="ae559226790a2be8368d165dd7940b761c77f35c" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Scenario 4" />
+ <dataarea name="flop" size="234855">
+ <rom name="centauri alliance disk 3b - scenario 4.woz" size="234855" crc="f3d9a9f9" sha1="1f9a1511f334e2a4db6e286e558f328e1e32a196" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="centiped">
+ <description>Centipede (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-14 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233448">
+ <rom name="centipede.woz" size="233448" crc="df23de50" sha1="e38c229a930866842b5581b89ad15cc620333342" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chalmath">
+ <description>Challenge Math</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="C. McMahon" />
+ <info name="programmer" value="J. Sweedler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="challenge math.woz" size="234813" crc="18ec6871" sha1="15b4fe2e391ad74d6f143cdd03c4eb8c3b7a15ae" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chmpgolf">
+ <description>Championship Golf</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Blair Hadfield" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="championship golf.woz" size="234798" crc="9d1a193f" sha1="e7b0eb6e3272044046a9373ea7acabe598cabd46" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chldrnr">
+ <description>Championship Lode Runner</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Doug Smith" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="288009">
+ <rom name="championship lode runner.woz" size="288009" crc="c6a1f9ce" sha1="082862613ccad1efe8af0d9330a47d907eaf29bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chwrest">
+ <description>Championship Wrestling</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Lonnie D. Ropp" />
+ <info name="programmer" value="Richard A. Ditton" />
+ <info name="programmer" value="David Thiel" />
+ <info name="programmer" value="Jeffrey P. Lee" />
+ <info name="programmer" value="Timothy Skelly" />
+ <info name="programmer" value="Elaine Hodgson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-09-->
- <!--educational program-->
+ <!-- Dump released: 2022-09-02 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="241539">
- <rom name="cavity busters.woz" size="241539" crc="6cd640b3" sha1="fb7432c0dd5a894c7daef8811acdb8ba74be0b42" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234850">
+ <rom name="championship wrestling side a.woz" size="234850" crc="301235b9" sha1="633e5a7b9513e6191073b88dc5940c2e7648aa9d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234850">
+ <rom name="championship wrestling side b.woz" size="234850" crc="ed2eea6d" sha1="791806b15e1f4a287623aad808b09bfc8c6dcaf9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chcougkng031286">
+ <description>Chariots, Cougars, and Kings (version 03.12.86)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="03.12.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234854">
+ <rom name="chariots, cougars, and kings v03.12.86 disk 1.woz" size="234854" crc="1326a9b8" sha1="0953d97a9f37d026fe50ed571cc0759970d1ce30" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234854">
+ <rom name="chariots, cougars, and kings v03.12.86 disk 2.woz" size="234854" crc="d46ce5ff" sha1="8b30b3eec4fbf922a63e52f454c17f5f7a6af4f0" />
</dataarea>
</part>
</software>
@@ -25749,8 +14669,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="48408">
<rom name="checkers v2.1.woz" size="48408" crc="3b3c7d82" sha1="cc6a3bd158b0ec2dad094955b13336b8883f0286" />
@@ -25766,8 +14686,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="7.0" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-01-14-->
- <!--board game-->
+ <!-- Dump released: 2020-01-14 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234821">
<rom name="chess v7.0 (odesta).woz" size="234821" crc="dea3482d" sha1="40d127ba91d83be331a266e4f7d9727baeb78711" />
@@ -25780,12 +14700,15 @@ license:CC0-1.0
<year>1990</year>
<publisher>MECC</publisher>
<info name="partno" value="A-280" />
- <info name="programmer" value="Beth Bell, Gene Breault, Scott Jensen, and Elizabeth Wendland" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Elizabeth Wendland" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234852">
<rom name="chemistry- balancing equations v1.0.woz" size="234852" crc="435e15cb" sha1="013df30277d6d734d6c5e25ef0c58569fb60fcef" />
@@ -25798,12 +14721,15 @@ license:CC0-1.0
<year>1990</year>
<publisher>MECC</publisher>
<info name="partno" value="A-280" />
- <info name="programmer" value="Beth Bell, Gene Breault, Scott Jensen, and Elizabeth Wendland" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Elizabeth Wendland" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-09-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296232">
<rom name="chemistry- balancing equations 800k.woz" size="1296232" crc="741bcaa4" sha1="93f7dc5c6b6b9737628bcbd540918aee4ec7e746" />
@@ -25811,17 +14737,21 @@ license:CC0-1.0
</part>
</software>
- <software name="chempertab10">
+ <software name="chempertab10_525" cloneof="chempertab">
<description>Chemistry: The Periodic Table (A-251 version 1.0)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-251" />
- <info name="programmer" value="Gene Breault, Charolyn Kapplinger, Kevin W. Neff, John Persoon, and James L. Thompson" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin W. Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234890">
<rom name="chemistry- the periodic table v1.0.woz" size="234890" crc="232c6255" sha1="e52f576c864fe325dcb705513b53ebafb628a430" />
@@ -25829,6 +14759,66 @@ license:CC0-1.0
</part>
</software>
+ <software name="chempertab10" cloneof="chempertab">
+ <description>Chemistry: The Periodic Table (A-251 version 1.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-251" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin W. Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296221">
+ <rom name="chemistry- the periodic table v1.0 800k.woz" size="1296221" crc="cdc0e9e3" sha1="36d9621e6453dc7031dd17361e82580c808866cc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chempertab">
+ <description>Chemistry: The Periodic Table (A-251 version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-251" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin W. Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345389">
+ <rom name="chemistry- the periodic table v1.1 800k.woz" size="1345389" crc="f8ed6ea4" sha1="79d6ef06f648bd6c4f0ad18f492013fd3804cdf4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="choplftr" supported="no">
+ <description>Choplifter</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Dan Gorlin" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to compatibility issues created by the copy protection, it will not run on later models." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2019-02-22 Redumped on 2022-03-30 to fix corruption related to a bug in early Applesauce FDC firmware. -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="360719">
+ <rom name="choplifter.woz" size="360719" crc="9d4dc01c" sha1="1c4983656937762ae71646480396cf50541efc94" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cyeagaft">
<description>Chuck Yeager's Advanced Flight Trainer</description>
<year>1987</year>
@@ -25836,8 +14826,8 @@ license:CC0-1.0
<info name="programmer" value="Gene Kusmiak" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-16-->
- <!--simulation game-->
+ <!-- Dump released: 2024-04-16 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234833">
@@ -25852,38 +14842,53 @@ license:CC0-1.0
</part>
</software>
- <software name="clnwtdet_525" cloneof="clnwtdet">
- <description>Cleanwater Detectives (A-282 version 1.0)</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-282" />
- <info name="programmer" value="Vincent J. Erickson, John Ojanen, and Diane Portner" />
- <info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-10-->
- <!--educational program-->
+ <software name="clasmate">
+ <description>Classmate (version 2.1)</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Linda Broudy" />
+ <info name="programmer" value="Sid Broudy" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234852">
- <rom name="cleanwater detectives.woz" size="234852" crc="9c78798e" sha1="28cd9843860f74cad155cca29a2a26e37fb0dd38" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234790">
+ <rom name="classmate v2.1-04.01.87.woz" size="234790" crc="263424cc" sha1="bfb56deb0c92b09f4bbeda54edb7210235a4b7e6" />
</dataarea>
</part>
</software>
- <software name="clnwtdet">
- <description>Cleanwater Detectives (A-282 version 1.0) (800K 3.5")</description>
- <year>1991</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-282" />
- <info name="programmer" value="Vincent J. Erickson, John Ojanen, and Diane Portner" />
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
- <info name="version" value="1.0" />
- <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-09-->
- <!--educational program-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345366">
- <rom name="cleanwater detectives 800k.woz" size="1345366" crc="051bbdd2" sha1="64306906c5ea53e08c80f86d56eb1840e15f0277" />
+ <software name="clauswhs">
+ <description>Clauses and Whole Sentences</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="clauses and whole sentences.woz" size="234762" crc="1cb29ebc" sha1="2a0da413145aebb7a687eab7b6fb7c4189cc07a0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clefnote">
+ <description>Clef Notes Drill</description>
+ <year>1983</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234782">
+ <rom name="clef notes drill.woz" size="234782" crc="f508398a" sha1="82ec8b2e3ac3e48954fa13a4e581f2d57893af3e" />
</dataarea>
</part>
</software>
@@ -25892,13 +14897,16 @@ license:CC0-1.0
<description>Clock Works (A-168 version 1.0)</description>
<year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-168" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Craig Solomonson" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234801">
<rom name="clock works v1.0.woz" size="234801" crc="64e041b5" sha1="309e2bdd0b16b203391c454fdd4fe545ba26a1cd" />
@@ -25910,13 +14918,16 @@ license:CC0-1.0
<description>Clock Works (A-168 version 1.0) (800K 3.5")</description>
<year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-168" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Craig Solomonson" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-09 Redumped: 2021-12-14-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-09 Redumped: 2021-12-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345302">
<rom name="clock works 800k.woz" size="1345302" crc="10213777" sha1="9d854320f839c567d42448d8925b648ece7b0e31" />
@@ -25924,17 +14935,92 @@ license:CC0-1.0
</part>
</software>
+ <software name="clownardr1">
+ <description>Clowning Around (revision 1)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234734">
+ <rom name="clowning around.woz" size="234734" crc="038a4a36" sha1="7952aa4ea192112c6a4730dab5b23d1a6c5abcc0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cluemd">
+ <description>Clue: Master Detective (version 1.5)</description>
+ <year>1989</year>
+ <publisher>Leisure Genius</publisher>
+ <info name="developer" value="Casablanca Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234770">
+ <rom name="clue master detective v1.5.woz" size="234770" crc="07dfefe9" sha1="5ed2472ba28c2008c27851a8ee75647aa2a999ee" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="coloncqt">
+ <description>Colonial Conquest (version 1.1)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Strategic Simulations" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241424">
+ <rom name="colonial conquest v1.1.woz" size="241424" crc="ca135219" sha1="8a1b3166c6eed95e8a22df95290a03af15c46208" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commasq">
+ <description>Commas (version 1990)</description>
+ <year>1990</year>
+ <publisher>Victoria Learning Systems</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="commas 1990.woz" size="234761" crc="280d7178" sha1="ad9825264046e653660a3308f163fd508e5848ab" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="commkeys10" cloneof="commkeys">
<description>CommuniKeys (A-248 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-248" />
- <info name="programmer" value="Beth Bell, Vincent Erickson, Charolyn Kapplinger, Sherry Luedloff, Michael Palmquist, John Persoon, and Paul Weiser" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Paul Weiser" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234900">
<rom name="communikeys v1.0.woz" size="234900" crc="ba6bf6fa" sha1="11b60fa9f5d4e142dc5cdb5f8d3275d154e2088f" />
@@ -25942,17 +15028,23 @@ license:CC0-1.0
</part>
</software>
- <software name="commkeys11_525" cloneof="commkeys">
+ <software name="commkeys_525" cloneof="commkeys">
<description>CommuniKeys (A-248 version 1.1)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-248" />
- <info name="programmer" value="Beth Bell, Vincent Erickson, Charolyn Kapplinger, Sherry Luedloff, Michael Palmquist, John Persoon, and Paul Weiser" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Paul Weiser" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-12-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-12 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234877">
<rom name="communikeys v1.1.woz" size="234877" crc="2f9a3ab2" sha1="0f3e5e1b3ee5ffd1ef8c0d48e2916af80aa8064d" />
@@ -25965,12 +15057,18 @@ license:CC0-1.0
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-248" />
- <info name="programmer" value="Beth Bell, Vincent Erickson, Charolyn Kapplinger, Sherry Luedloff, Michael Palmquist, John Persoon, and Paul Weiser" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Paul Weiser" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345423">
<rom name="communikeys 800k.woz" size="1345423" crc="16374785" sha1="207c41b559050d4f96f833077574cae8be669362" />
@@ -25978,6 +15076,200 @@ license:CC0-1.0
</part>
</software>
+ <software name="compkit">
+ <description>Comparison Kitchen</description>
+ <year>1984</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Neosoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234766">
+ <rom name="comparison kitchen.woz" size="234766" crc="78c64ed1" sha1="1311a4cb1c73982f4c2069802424df2d8d9942b7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compsent">
+ <description>Complex Sentences / Adjective Clauses (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="complex sentences 1988.woz" size="234769" crc="96fe5399" sha1="a3f3226864a3871c1c787b5827c843069f9de668" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismedit">
+ <description>Composing Information Series: MECC Editor (A-135 version 1.0)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-135" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="mecc editor v1.0.woz" size="234784" crc="2f035c50" sha1="e0c188d295c96ed393d0e6d7c8036acb4dd0addf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismwrites">
+ <description>Composing Information Series: MECC Write Start (A-133 version 1.2)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-133" />
+ <info name="programmer" value="Susan Russell" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234790">
+ <rom name="mecc write start v1.2.woz" size="234790" crc="bb1db1f2" sha1="5adce7f4e3fe500e8e86264ab2f724175243fdd9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cismwrite">
+ <description>Composing Information Series: MECC Writer (A-132 version 1.2)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-132" />
+ <info name="programmer" value="Craig Carlson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234817">
+ <rom name="mecc writer v1.2.woz" size="234817" crc="ea821ab1" sha1="36d12dd728c792bbc822409936e13d8350588636" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compgrr2">
+ <description>Comprehensive Grammar Review II (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234783">
+ <rom name="comprehensive grammar review ii 1988.woz" size="234783" crc="03ea059b" sha1="c8a7036e3c615f39ba64e0e5e9b812cc458ba891" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpairct10" cloneof="cmpairct">
+ <description>Computer Air Combat (version 1.0)</description>
+ <year>1980</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charles Merrow" />
+ <info name="programmer" value="Jack T. Avery" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later with a 13-sector drive and Applesoft in ROM." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2024-08-30 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234834">
+ <rom name="computer air combat v1.0.woz" size="234834" crc="6e9b137e" sha1="659fcecb8767fe25f590fdbc18c9dc4c0ac34279" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpairct">
+ <description>Computer Air Combat (version 1.1)</description>
+ <year>1980</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charles Merrow" />
+ <info name="programmer" value="Jack T. Avery" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-27 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="computer air combat v1.1.woz" size="234836" crc="26a00f65" sha1="96db3b6b3612b6d9be70ad7d79d0173d17c75be2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpambsh10r1" cloneof="cmpambsh10r2">
+ <description>Computer Ambush (version 1.0 revision 1)</description>
+ <year>1980</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Ed Willinger" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0 revision 1" />
+ <!-- There is a 1982 version redeveloped by Kendall Whitesell and Larry D. Strawser. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-27 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234822">
+ <rom name="computer ambush v1.0 rev. 1.woz" size="234822" crc="24f0fcde" sha1="867abf82bb6435d60d577d1dfb1460491bcd4b87" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmpambsh10r2">
+ <description>Computer Ambush (version 1.0 revision 2)</description>
+ <year>1980</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Ed Willinger" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0 revision 2" />
+ <!-- There is a 1982 version redeveloped by Kendall Whitesell and Larry D. Strawser. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234822">
+ <rom name="computer ambush v1.0 rev. 2.woz" size="234822" crc="b15b313e" sha1="044593fda9eef3fb596cd37707e338ec12e67f07" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compconc">
+ <description>Computer Concepts (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="programmer" value="Fred Ventura" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296165">
+ <rom name="computer concepts 800k.woz" size="1296165" crc="a4c5967b" sha1="94318e12fa5ac22ffdc283f51d06aa7c57d0d13b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cgmm1ps11" cloneof="cgmm1ps">
<description>Computer Generated Mathematics Materials Volume 1: Problem Solving (A-757 version 1.1)</description>
<year>1982</year>
@@ -25987,8 +15279,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234849">
<rom name="computer generated mathematics materials volume 1- problem solving v1.1.woz" size="234849" crc="7de3f3b1" sha1="b8ad3d3f653d91a2baff5c774c5fe5388a5b803e" />
@@ -26005,8 +15297,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234849">
<rom name="computer generated mathematics materials volume 1- problem solving v1.3.woz" size="234849" crc="1288fe4f" sha1="fecefc67af12a51480feed322473aba622dae0a0" />
@@ -26019,12 +15311,15 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-240" />
- <info name="programmer" value="Diane Portner, Craig Solomonson, Michael Stein, and James Thompson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="James Thompson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234859">
<rom name="computer inspector v1.0.woz" size="234859" crc="5755f31d" sha1="bb86a8916a6a713fd3a2d06f26dffe456a975a55" />
@@ -26041,8 +15336,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234798">
<rom name="computers in government v1.0.woz" size="234798" crc="3964a55e" sha1="740519fb6fc36eb3310f503f772058aa638040bd" />
@@ -26050,17 +15345,99 @@ license:CC0-1.0
</part>
</software>
+ <software name="conputat">
+ <description>Con-Putation (Softsmith)</description>
+ <year>1980</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="T.H.E.S.I.S." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="55046">
+ <rom name="con-putation (softsmith).woz" size="55046" crc="70582f73" sha1="cbf3e4dd859a03c37be4632d6fb77581d5e351ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cwrdcnc1">
+ <description>Concentrate! On Words &amp; Concepts I</description>
+ <year>1988</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="developer" value="Laureate Learning Systems" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234780">
+ <rom name="concentrate on words and concepts.woz" size="234780" crc="a2e8d782" sha1="7d1812da8bb010b276da8dd670e9b75db9513ccd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cwrdcnc2">
+ <description>Concentrate! On Words &amp; Concepts II</description>
+ <year>1988</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="developer" value="Laureate Learning Systems" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234783">
+ <rom name="concentrate on words and concepts ii.woz" size="234783" crc="fc371377" sha1="3032eccfb6bf1c174af2b1e77cc047e228ee93b6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="confviet">
+ <description>Conflict in Vietnam (version 331.00)</description>
+ <year>1986</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
+ <info name="version" value="331.00" />
+ <!-- Option to use double hi-res graphics on 128K machines. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234807">
+ <rom name="conflict in vietnam side a.woz" size="234807" crc="28f05d37" sha1="aede9905d72065819d37f2e1d7a0c769ad8d75b0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234807">
+ <rom name="conflict in vietnam side b.woz" size="234807" crc="770738bf" sha1="cd63d1ffb847a3bda259a9c1c32a83297b0dc48e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cmscdecpm10" cloneof="cmscdecpm">
<description>Conquering Math Series: Conquering Decimals (+, -) (A-207 version 1.0)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-207" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-19-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234870">
<rom name="conquering decimals (addition, subtraction).woz" size="234870" crc="6b6384cb" sha1="1076355dcd45bb725c861811221ad07ba4f3cd4d" />
@@ -26073,12 +15450,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-207" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345420">
<rom name="conquering decimals (addition, subtraction) 800k.woz" size="1345420" crc="6cb089b2" sha1="379d5e51449a193e30a20461b9d5d85928b29ed7" />
@@ -26091,12 +15475,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-208" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-19-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234803">
<rom name="conquering decimals (multiplication, division).woz" size="234803" crc="ff020002" sha1="b8cd573141127a215b7fcbf0341cec86804d3a3b" />
@@ -26109,12 +15500,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-208" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345420">
<rom name="conquering decimals (multiplication, division) 800k.woz" size="1345420" crc="2acc2070" sha1="0fab5a373b829bf6b6b40f96d7c27cb6226ee984" />
@@ -26127,12 +15525,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-204" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-19-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241048">
<rom name="conquering fractions (addition, subtraction).woz" size="241048" crc="282f2022" sha1="61ee416fbc5a965d9c7912bd514db601c1b1d198" />
@@ -26145,12 +15550,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-204" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345452">
<rom name="conquering fractions (addition, subtraction) 800k.woz" size="1345452" crc="96506a24" sha1="95a05d33c89f05c8360b2fd8dbb6699ede45233c" />
@@ -26163,12 +15575,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-205" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-19-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241036">
<rom name="conquering fractions (multiplication, division).woz" size="241036" crc="dddd9a92" sha1="81399db18fc7fb13c683c8f579bd605de82303f5" />
@@ -26181,12 +15600,19 @@ license:CC0-1.0
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-205" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345452">
<rom name="conquering fractions (multiplication, division) 800k.woz" size="1345452" crc="eefdb033" sha1="5d857b4d076db607ae2271fa6388536494119685" />
@@ -26194,17 +15620,20 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscmwg">
+ <software name="cmscmwg_525" cloneof="cmscmwg">
<description>Conquering Math Series: Conquering Math Worksheet Generator (A-260 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-260" />
- <info name="programmer" value="Sue Gabrys, Shari Glenn, Scott Jensen, and Kevin Neff" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Kevin Neff" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234865">
<rom name="conquering math worksheet generator v1.0.woz" size="234865" crc="94c8465b" sha1="85a29fdf171ffabd8c0c08d80851da17260a7554" />
@@ -26212,17 +15641,46 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscperc10">
+ <software name="cmscmwg">
+ <description>Conquering Math Series: Conquering Math Worksheet Generator (A-260 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-260" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345364">
+ <rom name="conquering math worksheet generator v1.0 800k.woz" size="1345364" crc="e39e7cf7" sha1="ed76a81c300c0275df397730961450df68622875" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmscperc10_525" cloneof="cmscperc">
<description>Conquering Math Series: Conquering Percents (A-210 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-210" />
- <info name="programmer" value="Sheila Dols, Susan Gabrys, Shari Glenn, Scott Jensen, Charolyn Kapplinger, Pat Korn, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234930">
<rom name="conquering percents v1.0.woz" size="234930" crc="74e99302" sha1="a45fe02e8ac0d8a0587202ddc21bd546fb25b46a" />
@@ -26230,17 +15688,76 @@ license:CC0-1.0
</part>
</software>
- <software name="cmscratpr">
+ <software name="cmscperc10" cloneof="cmscperc">
+ <description>Conquering Math Series: Conquering Percents (A-210 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-210" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345429">
+ <rom name="conquering percents v1.0 800k.woz" size="1345429" crc="9bc1adaa" sha1="509fe7fc4f23ee2f2e92315215cd29ffc262a45f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmscperc">
+ <description>Conquering Math Series: Conquering Percents (A-210 version 1.1) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-210" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345429">
+ <rom name="conquering percents v1.1 800k.woz" size="1345429" crc="cd0b6345" sha1="eeb2c294a4cfb7ee2d8cf0979723d49670db86a4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmscratpr_525" cloneof="cmscratpr">
<description>Conquering Math Series: Conquering Ratios and Proportions (A-209 version 1.1)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-209" />
- <info name="programmer" value="Sheila Dols, Shari Glenn, Scott Jensen, Charolyn Kapplinger, Sherry Leudloff, Diane Lin, Jane Peterson, and Craig Solomonson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Leudloff" />
+ <info name="programmer" value="Diane Lin" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234914">
<rom name="conquering ratios and proportions v1.1.woz" size="234914" crc="fb6f1075" sha1="c4740f1acc2acd6146aad597ef3a37e7f1459555" />
@@ -26248,6 +15765,31 @@ license:CC0-1.0
</part>
</software>
+ <software name="cmscratpr">
+ <description>Conquering Math Series: Conquering Ratios and Proportions (A-209 version 1.1) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-209" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Leudloff" />
+ <info name="programmer" value="Diane Lin" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345413">
+ <rom name="conquering ratios and proportions v1.1 800k.woz" size="1345413" crc="82c31cbd" sha1="4c70276009734fe4524bb5d7b5a4eb44481a8835" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cmscwholn">
<description>Conquering Math Series: Conquering Whole Numbers (A-201 version 1.1) (800K 3.5")</description>
<year>1987</year>
@@ -26257,8 +15799,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345322">
<rom name="conquering whole numbers 800k.woz" size="1345322" crc="a86a0c22" sha1="39d1b854624a062f03545888982bcb3f4954f5ca" />
@@ -26266,17 +15808,24 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsdecconc">
+ <software name="cmsdecconc_525" cloneof="cmsdecconc">
<description>Conquering Math Series: Decimal Concepts (A-206 version 1.0)</description>
<year>1988</year>
<publisher>MECC</publisher>
<info name="partno" value="A-206" />
- <info name="programmer" value="Sheila Dols, Vince Erickson, Susan M. Gabrys, Shari Glenn, Scott Jensen, Jane Peterson, Craig Solomonson, and James L. Thompson" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-19-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234698">
<rom name="decimal concepts.woz" size="234698" crc="06e3856c" sha1="56ec59ea0330161f889fa44c0310ddbf6ec9d0d4" />
@@ -26284,7 +15833,32 @@ license:CC0-1.0
</part>
</software>
- <software name="cmsfrconci12_525" cloneof="cmsfrconci">
+ <software name="cmsdecconc">
+ <description>Conquering Math Series: Decimal Concepts (A-206 version 1.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-206" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan M. Gabrys" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345413">
+ <rom name="decimal concepts v1.0 800k.woz" size="1345413" crc="aa94b2f8" sha1="d5483bdd5a7c519932a2f0043ad576a9e7012c86" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmsfrconci_525" cloneof="cmsfrconci">
<description>Conquering Math Series: Fraction Concepts, Inc. (A-202 version 1.2)</description>
<year>1987</year>
<publisher>MECC</publisher>
@@ -26293,8 +15867,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234796">
<rom name="fraction concepts, inc. v1.2.woz" size="234796" crc="4afaa0fa" sha1="1b47dbd1863b26d72afe0261b916357a24edcabe" />
@@ -26311,8 +15885,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1344295">
<rom name="fraction concepts, inc. 800k.woz" size="1344295" crc="e0d544af" sha1="2833bd6be6e3160ad2fad3e7775e654cd0886013" />
@@ -26329,8 +15903,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-23-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234800">
<rom name="fraction practice unlimited v1.0.woz" size="234800" crc="7ca86529" sha1="f715773fcf8ad4e84a30b0b4ee4776f05ad99979" />
@@ -26347,8 +15921,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-19-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234777">
<rom name="fraction practice unlimited v1.1.woz" size="234777" crc="f3d55989" sha1="9c429f40ec75e07fec9b95c0972e94261809f9a7" />
@@ -26365,8 +15939,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, //e or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345301">
<rom name="fraction practice unlimited v1.2 800k.woz" size="1345301" crc="cfd76748" sha1="855b04291203922a329b4298f1b7b32933f593c4" />
@@ -26374,6 +15948,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="coordgeo">
+ <description>Coordinate Geometry</description>
+ <year>1986</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234811">
+ <rom name="coordinate geometry.woz" size="234811" crc="39abe2ed" sha1="c5ed231f05334f336d50a9ba7ccf825a21b8b8ed" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="coordmath10" cloneof="coordmath">
<description>Coordinate Math (A-192 version 1.0)</description>
<year>1987</year>
@@ -26383,8 +15973,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234788">
<rom name="coordinate math v1.0.woz" size="234788" crc="63fbfbc8" sha1="cc7a29b9765f212f32b99117da00fa0bf99e880d" />
@@ -26401,8 +15991,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, //e or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345305">
<rom name="coordinate math v1.1 800k.woz" size="1345305" crc="cadd691a" sha1="47c72fe236d3b177e6ac8140f9dee43643256d4a" />
@@ -26418,8 +16008,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-10-03-->
- <!--disk utility program-->
+ <!-- Dump released: 2023-10-03 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - 13-sector" />
<dataarea name="flop" size="15165">
@@ -26440,11 +16030,11 @@ license:CC0-1.0
<publisher>Central Point Software</publisher>
<info name="programmer" value="Michael A. Brown" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
- <!--Attempting to run with less than 48K will appear to work, but copies will fail with an UNABLE TO WRITE error.-->
+ <!-- Attempting to run with less than 48K will appear to work, but copies will fail with an UNABLE TO WRITE error. -->
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-07-22-->
- <!--disk utility program-->
+ <!-- Dump released: 2019-07-22 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="15140">
<rom name="copy ii plus v2.0.woz" size="15140" crc="ae1aaf91" sha1="643ea0b293754108be3a7e58e403e4cf958baa18" />
@@ -26460,8 +16050,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-12-12-->
- <!--disk utility program-->
+ <!-- Dump released: 2023-12-12 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="15165">
<rom name="copy ii plus v2.2.woz" size="15165" crc="340b1801" sha1="c4742f940d13214e840351831ef978a29a29cf82" />
@@ -26477,8 +16067,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 24K Apple ][ or later." />
<info name="version" value="3.0" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-09-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-02-09 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="15154">
<rom name="copy ii plus v3.0.woz" size="15154" crc="518e3000" sha1="1b0aa2fd169044298f6a370a731ad084b7bbfb18" />
@@ -26494,8 +16084,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 16K Apple ][ or later." />
<info name="version" value="3.1" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-27-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-27 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="15186">
<rom name="copy ii plus v3.1.woz" size="15186" crc="45de29aa" sha1="0eef8313f859807c27983503fb2d119135aed54e" />
@@ -26511,8 +16101,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="3.3" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-12-->
- <!--disk utility program-->
+ <!-- Dump released: 2024-03-12 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="28483">
<rom name="copy ii plus v3.3.woz" size="28483" crc="1912cb81" sha1="3c6bda79887a8a917b483675aa60cc05389ce4d3" />
@@ -26527,8 +16117,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.1" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-27-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-27 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="108311">
<rom name="copy ii plus v4.1.woz" size="108311" crc="894ffe65" sha1="d01d410cc8342bcefade73645dce0b888921ba4f" />
@@ -26543,8 +16133,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.3" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="114951">
<rom name="copy ii plus v4.3.woz" size="114951" crc="fc5b42b6" sha1="88e06eb03015e34e93552567182dd9f784bfd632" />
@@ -26559,8 +16149,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.4B" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="121608">
<rom name="copy ii plus v4.4b.woz" size="121608" crc="ba994c7f" sha1="b83b96b2893382aef7c5639e863ead1bba8091f4" />
@@ -26575,8 +16165,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.4C" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="121624">
<rom name="copy ii plus v4.4c.woz" size="121624" crc="8a63d5d1" sha1="9dd8e366bd5bee3799b095b79c8af9d7b6d9d57a" />
@@ -26591,8 +16181,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.4D" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="114968">
<rom name="copy ii plus v4.4d.woz" size="114968" crc="53924539" sha1="bed659673605bd09ad66467effb542bc98d9c807" />
@@ -26607,8 +16197,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v5.0.woz" size="234763" crc="702fb21c" sha1="9c72acaf2de148865bc33ab6fac58381464a4ea2" />
@@ -26623,8 +16213,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="copy ii plus v5.1.woz" size="234790" crc="e248dfab" sha1="b04452eca59beaa55969cc0313a038f2064a6b8e" />
@@ -26639,8 +16229,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ][ plus v5.2.woz" size="234779" crc="a04ba6aa" sha1="c845787e1c00bb18f5c4f9beba9aa9f2f6794efd" />
@@ -26655,8 +16245,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v5.4.woz" size="234763" crc="283968f7" sha1="78caf5814418a737dfb46e83f1afe89bf39740f9" />
@@ -26671,8 +16261,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="5.5" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v5.5.woz" size="234779" crc="770ff4ff" sha1="be2f6599408505f6f7e815322798c066ed8d2122" />
@@ -26687,8 +16277,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.0 Beta 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-23-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-09-23 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234797">
<rom name="copy ii plus v6.0 beta 1.woz" size="234797" crc="3da249ae" sha1="19c4a0ee4d2612ce7980f3a59ebe0f9458bad928" />
@@ -26703,8 +16293,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.0 Beta 2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-24-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-09-24 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234797">
<rom name="copy ii plus v6.0 beta 2.woz" size="234797" crc="415212cd" sha1="20e93383ed5f0d2ce95844ababdff81006e51c66" />
@@ -26719,8 +16309,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v6.0.woz" size="234779" crc="76f417b4" sha1="8bd75c716dc26f77674d841c39cfe6cced36b022" />
@@ -26735,8 +16325,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="copy ii plus v6.1.woz" size="234790" crc="26f79c70" sha1="dec82ff19d6b7615eb3e1f523226cb450f6449b1" />
@@ -26751,8 +16341,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234796">
<rom name="copy ii plus v6.2.woz" size="234796" crc="ffba2be5" sha1="2814e502f16bc987f67781f2202e20bd34e2f039" />
@@ -26767,8 +16357,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-28-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-28 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v6.3.woz" size="234763" crc="0d380137" sha1="c9be624f21224a2a20809a390f9537f6d90b3fc4" />
@@ -26783,8 +16373,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v6.4.woz" size="234763" crc="ba0e1b61" sha1="3e74f6ecc3afb86f549895144032b208bf315e72" />
@@ -26799,8 +16389,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.5" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v6.5.woz" size="234763" crc="9e189810" sha1="6f844a71c8f6782129147b99d71f639298c5af59" />
@@ -26815,8 +16405,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="6.6" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v6.6.woz" size="234763" crc="e808a0c6" sha1="02610a44218fbf3c780e5f4c3ff4fe4ac89f6a1d" />
@@ -26831,8 +16421,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="7.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v7.1.woz" size="234763" crc="ab6a5a0c" sha1="51ffed1a93c541ce0a5b9faaf76ea6514f0df8b0" />
@@ -26847,8 +16437,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="7.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v7.2.woz" size="234779" crc="e2a09606" sha1="3b277b4bac185f046641c02f6a1b87a764634a58" />
@@ -26863,8 +16453,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="7.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v7.3.woz" size="234779" crc="3a96dd1b" sha1="c3cc0b335a1f07987361d482fef3a4d2f139c306" />
@@ -26879,8 +16469,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="7.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v7.4.woz" size="234779" crc="8d4d3560" sha1="461955279142f89320e3f7187bbda2b681a4d2ee" />
@@ -26895,8 +16485,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="8.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v8.1.woz" size="234763" crc="3808ee2d" sha1="eb22948c09f4f1add65bef80da7eb7e9de734bb7" />
@@ -26911,8 +16501,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, a 64K //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="8.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="656151">
<rom name="copy ii plus v8.1 800k.woz" size="656151" crc="a859df1a" sha1="09d5b5a68a0ce96619d0b1f2663b6a58e8351d41" />
@@ -26927,8 +16517,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="8.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234763">
<rom name="copy ii plus v8.2.woz" size="234763" crc="737590b8" sha1="d583faa91e718554306cfc24c4327b17283f3c59" />
@@ -26943,8 +16533,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, a 64K //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="8.2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="673573">
<rom name="copy ii plus v8.2 800k.woz" size="673573" crc="86df9fff" sha1="b5385097198544d93a58d27c7b13d1ef0667a6c5" />
@@ -26959,8 +16549,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="8.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v8.3.woz" size="234779" crc="b548da95" sha1="fe50cee6796abdf0f336904c9c4c0b4d72c39d65" />
@@ -26975,8 +16565,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, a 64K //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="8.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="648964">
<rom name="copy ii plus v8.3 800k.woz" size="648964" crc="e0d31412" sha1="c3e8ed7e0f7f9d53e883fa743e550f7559b945a9" />
@@ -26991,8 +16581,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="8.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="copy ii plus v8.4.woz" size="234779" crc="369b4b0c" sha1="8b86c15238757bf66c64e52c41fad89fa41106ac" />
@@ -27007,8 +16597,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, a 64K //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="8.4" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296132">
<rom name="copy ii plus v8.4 800k.woz" size="1296132" crc="ce99eb30" sha1="9b0490ce057c59f4eec77fee1a94bb4a955567ed" />
@@ -27023,8 +16613,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K enhanced Apple //e or later." />
<info name="version" value="9.0 Beta 1" />
<sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!--Dump released: 2022-10-12-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-10-12 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234790">
@@ -27046,8 +16636,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K enhanced Apple //e or later." />
<info name="version" value="9.0" />
<sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!--Dump released: 2022-3-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-3-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234768">
@@ -27069,8 +16659,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
<info name="version" value="9.0" />
<sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!--Dump released: 2022-3-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-3-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296127">
<rom name="copy ii plus v9.0 800k.woz" size="1296127" crc="c79fd34f" sha1="0a80305970ca0bf9343d802f57b57b8d13b279b0" />
@@ -27085,8 +16675,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K enhanced Apple //e or later." />
<info name="version" value="9.1" />
<sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!--Dump released: 2022-3-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-3-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234772">
@@ -27108,8 +16698,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
<info name="version" value="9.1" />
<sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
- <!--Dump released: 2022-3-29-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-3-29 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296127">
<rom name="copy ii plus v9.1 800k.woz" size="1296127" crc="c1be6735" sha1="82d0693f3674b75d7475e56a61bcce80a8546cc4" />
@@ -27117,6 +16707,57 @@ license:CC0-1.0
</part>
</software>
+ <software name="coscombat">
+ <description>Cosmic Combat (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Highlands Computer Services" />
+ <info name="original_publisher" value="Highlands Computer Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="81681">
+ <rom name="cosmic combat (softsmith).woz" size="81681" crc="fc0f9f1d" sha1="e3d71ce4831ee3535d33ce4a99864648011310f6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cottales87" cloneof="cottales">
+ <description>Cotton Tales (version 1987)</description>
+ <year>1987</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234764">
+ <rom name="cotton tales v1987.woz" size="234764" crc="41513f6f" sha1="39dbced9f32e3cdbc5414d72e21b74f344d5b7ae" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cottales90_525" cloneof="cottales">
+ <description>Cotton Tales (version 1990)</description>
+ <year>1990</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234777">
+ <rom name="cotton tales v1990.woz" size="234777" crc="738b5373" sha1="0f24a7698248a79a9c34a5dc969031a35b11b826" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cottales">
<description>Cotton Tales (version 1990) (800K 3.5")</description>
<year>1990</year>
@@ -27125,8 +16766,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, //e or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1990" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-01-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296150">
<rom name="cotton tales 800k.woz" size="1296150" crc="f354621b" sha1="a70a9a8daa556c59dd6c804838bf9f44d46b84e0" />
@@ -27134,6 +16775,25 @@ license:CC0-1.0
</part>
</software>
+ <software name="cntdsht">
+ <description>Countdown to Shutdown</description>
+ <year>1985</year>
+ <publisher>Activision</publisher>
+ <info name="developer" value="Creative Sparks" />
+ <info name="developer" value="Synergistic Software" />
+ <info name="programmer" value="T.L. Gale" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-03-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241431">
+ <rom name="countdown to shutdown.woz" size="241431" crc="59f9a15f" sha1="0f95f179cb84b57e33a9a0a535b4d36b2d2e3189" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cntcoins">
<description>Counting Coins</description>
<year>1987</year>
@@ -27141,8 +16801,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234772">
<rom name="counting coins.woz" size="234772" crc="e2ef9068" sha1="30b4e130e12e3786fc671b1c7e0729d1ca0b789a" />
@@ -27150,6 +16810,61 @@ license:CC0-1.0
</part>
</software>
+ <software name="cntparad">
+ <description>Counting Parade</description>
+ <year>1985</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="developer" value="Stepping Stone Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="214813">
+ <rom name="counting parade.woz" size="214813" crc="d2439231" sha1="e39b091a3a3e07a6f0b8fcc8e3d5463fbffe41eb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crgarf">
+ <description>Create with Garfield!</description>
+ <year>1986</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241444">
+ <rom name="create with garfield.woz" size="241444" crc="a783fbc0" sha1="d0be5f671ec61aa01142b68a6cecc98d5d1a2234" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crgarfde">
+ <description>Create with Garfield!: Deluxe Edition</description>
+ <year>1987</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234803">
+ <rom name="create with garfield deluxe edition disk 1.woz" size="234803" crc="7d22cdad" sha1="fd0eaad6385ac51d8d44c9c3c1031f8ba4588c18" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234803">
+ <rom name="create with garfield deluxe edition disk 2.woz" size="234803" crc="a72b214a" sha1="431087da36e4398d4ca0d05e1dc2f7d12915d6ff" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="crtabase">
<description>Create-A-Base (A-406 version 1.0)</description>
<year>1985</year>
@@ -27159,8 +16874,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234788">
<rom name="create-a-base v1.0.woz" size="234788" crc="a708a5f2" sha1="a511c4dcefa007ed923d62b5c8a9149745a0ed4a" />
@@ -27168,6 +16883,55 @@ license:CC0-1.0
</part>
</software>
+ <software name="crmagic">
+ <description>Creature Magic</description>
+ <year>1994</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234814">
+ <rom name="creature magic.woz" size="234814" crc="86aa2e73" sha1="8ab3af6a1fa038e748c872a154dbdba0fc834fce" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crventurh">
+ <description>Creature Venture (Highlands Computer Services)</description>
+ <year>1981</year>
+ <publisher>Highlands Computer Services</publisher>
+ <info name="developer" value="Highlands Computer Services" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="creature venture.woz" size="234800" crc="0636008c" sha1="17b7aaecb508e4e34d43a9bde626a9dc14643e70" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crofnigt">
+ <description>Creatures of the Night</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234759">
+ <rom name="creatures of the night.woz" size="234759" crc="6e56e0ed" sha1="dfda21843c82fddd9c37c874ac971e667e591d50" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cribsol">
<description>Cribbage/Solitaire</description>
<year>1982</year>
@@ -27175,8 +16939,8 @@ license:CC0-1.0
<info name="programmer" value="Art Carpet" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-27-->
- <!--action game-->
+ <!-- Dump released: 2023-07-27 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241431">
<rom name="cribbage-solitaire.woz" size="241431" crc="91f3b311" sha1="32d7713d8d451398b685b507a3cf66d22011588b" />
@@ -27184,16 +16948,100 @@ license:CC0-1.0
</part>
</software>
+ <software name="crmstopr">
+ <description>Crime Stopper</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="author" value="Barry Marx" />
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="Dan Kitchen" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="242146">
+ <rom name="crime stopper.woz" size="242146" crc="a3f353f8" sha1="9bafc69292e39aebf5fcf253ffcd34cb02ed669f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crmwave">
+ <description>Crime Wave</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Scott Schram" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121611">
+ <rom name="crime wave.woz" size="121611" crc="728dce48" sha1="9a8e0cbae22f382bb3ef5859d00dbeecdae13ac8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crismntn">
+ <description>Crisis Mountain (Micro Fun)</description>
+ <year>1982</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="David H. Schroeder" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233483">
+ <rom name="crisis mountain.woz" size="233483" crc="8ba3e03e" sha1="da43ab36ab26a7672df5132ca02fecbf0ae0f1c2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ccrallyec" cloneof="ccrallye">
+ <description>Cross Country Rallye (Continental Software)</description>
+ <year>1982</year>
+ <publisher>Continental Software</publisher>
+ <info name="programmer" value="Bob Carter" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121659">
+ <rom name="cross country rallye.woz" size="121659" crc="22dcf4ba" sha1="915097d48fd38fc8af61f077aa3f70cf427f6a38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ccrallye">
+ <description>Cross Country Rallye (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Continental Software" />
+ <info name="programmer" value="Bob Carter" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="114952">
+ <rom name="crosscountry rallye (softsmith).woz" size="114952" crc="eed840a1" sha1="a59bcfbe0dddb28d393d86e3f848c9e188efd93b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="crscali">
<description>Crosscountry California (revision 2, 1991)</description>
<year>1991</year>
<publisher>Didatech Software</publisher>
- <info name="programmer" value="Darcy Allen and Dave Vincent" />
+ <info name="programmer" value="Darcy Allen" />
+ <info name="programmer" value="Dave Vincent" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="revision 2. 1991" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-04-07-->
- <!--educational program-->
+ <!-- Dump released: 2020-04-07 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234807">
@@ -27216,8 +17064,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1, 1991" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-02-24-->
- <!--educational program-->
+ <!-- Dump released: 2020-02-24 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234810">
@@ -27232,17 +17080,185 @@ license:CC0-1.0
</part>
</software>
+ <software name="crosfire">
+ <description>Crossfire</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Jay Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-12 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233477">
+ <rom name="crossfire.woz" size="233477" crc="410930b0" sha1="db4ad9256846ac08e432c2dbb36671fb4b55a143" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cwmagic">
+ <description>Crossword Magic (version 4.0)</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Larry Sherman" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="4.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-17 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Program disk" />
+ <dataarea name="flop" size="121618">
+ <rom name="crossword magic v4.0.woz" size="121618" crc="9ac4acfd" sha1="7e8c1ea7a614020e0515060eb20a2d4edca21498" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Language arts puzzle disk" />
+ <dataarea name="flop" size="234806">
+ <rom name="crossword magic v4.0 - language arts puzzle disk.woz" size="234806" crc="7df85022" sha1="b0b8096d67a82c09388b5e44ea62eca05752265f" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Math puzzle disk" />
+ <dataarea name="flop" size="234797">
+ <rom name="crossword magic v4.0 - math puzzle disk.woz" size="234797" crc="5aaea7e4" sha1="782c541d4ab8acd54c2daa530f8084052c3de378" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Reading puzzle disk" />
+ <dataarea name="flop" size="234800">
+ <rom name="crossword magic v4.0 - reading puzzle disk.woz" size="234800" crc="943f43dc" sha1="d9bd4a7d5550c0c5196ec1abca93f4f20eb3ab6c" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Science puzzle disk" />
+ <dataarea name="flop" size="234800">
+ <rom name="crossword magic v4.0 - science puzzle disk.woz" size="234800" crc="c07eedbe" sha1="9302c44ab35b0fd1691ae84bf4eecd642d0f53ae" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Social studies puzzle disk" />
+ <dataarea name="flop" size="234807">
+ <rom name="crossword magic v4.0 - social studies puzzle disk.woz" size="234807" crc="fb9f623b" sha1="80e8478e1712ecca8f0446cceef5162231f8bda9" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Spelling puzzle disk" />
+ <dataarea name="flop" size="234801">
+ <rom name="crossword magic v4.0 - spelling puzzle disk.woz" size="234801" crc="36141dac" sha1="d4047b3f775d75571a95b160b3862c65d6285428" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crwnarth">
+ <description>Crown of Arthain</description>
+ <year>1980</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Dan Meller" />
+ <info name="programmer" value="Marylin Meller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234789">
+ <rom name="crown of arthain.woz" size="234789" crc="454ac2fa" sha1="068c976a64a2b0563e5f98983a8d7b46976307c2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cruseuropv2" cloneof="cruseurop">
+ <description>Crusade in Europe (version 2)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
+ <info name="version" value="2" />
+ <!-- Option to use double hi-res graphics on 128K machines. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234793">
+ <rom name="crusade in europe side a.woz" size="234793" crc="79a5ba7c" sha1="646775f14ba70542b2872d03a0ef1a3a14209ae4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234793">
+ <rom name="crusade in europe side b.woz" size="234793" crc="7d516541" sha1="6f2c8642c300c75f77163867110e56c8f1440388" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cruseurop">
+ <description>Crusade in Europe (version 321.03)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
+ <info name="version" value="321.03" />
+ <!-- Option to use double hi-res graphics on 128K machines. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234809">
+ <rom name="crusade in europe v321.03 side a.woz" size="234809" crc="dfab772e" sha1="69c80d16be198580fff750ecff2b3336b0ad8009" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234809">
+ <rom name="crusade in europe v321.03 side b.woz" size="234809" crc="b1e08aaa" sha1="28067a7a18472641c33f5cac47a270d6d336a317" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cryptmed">
+ <description>Crypt of Medea</description>
+ <year>1983</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Allan Lamb" />
+ <info name="programmer" value="Arthur Britto II" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-11 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234815">
+ <rom name="crypt of medea side a.woz" size="234815" crc="aad35539" sha1="041043080b9c2332b2401a6444cb827bf38da4ad" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234815">
+ <rom name="crypt of medea side b.woz" size="234815" crc="406de5eb" sha1="45f9f6695c6466c770d6b4a27d2e80b75d7b95f9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cryptqst_525" cloneof="cryptqst">
<description>CryptoQuest (A-340 version 1.0)</description>
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-340" />
- <info name="programmer" value="Mark Durkin, Rod Haenke, Ruth Kivisto, and Mike Tschimperle" />
+ <info name="programmer" value="Mark Durkin" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Mike Tschimperle" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-08-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234849">
<rom name="cryptoquest.woz" size="234849" crc="3cdc455e" sha1="a798f153f829687f7d1e48a3eb5278c1b6aa27d9" />
@@ -27255,13 +17271,16 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-340" />
- <info name="programmer" value="Mark Durkin, Rod Haenke, Ruth Kivisto, and Mike Tschimperle" />
+ <info name="programmer" value="Mark Durkin" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Mike Tschimperle" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
- <!--Modified to remove identifying site license information.-->
+ <!-- Modified to remove identifying site license information. -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-25-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296218">
<rom name="cryptoquest 800k.woz" size="1296218" crc="08cf7ada" sha1="310fc8b1db2e827fb5678e08de4271699fffd7fe" />
@@ -27273,12 +17292,12 @@ license:CC0-1.0
<description>Crystal Caverns</description>
<year>1982</year>
<publisher>Hayden Book Company</publisher>
- <info name="developer" value="Imaginative Systems" />
+ <info name="developer" value="Imaginative Systems Software" />
<info name="programmer" value="Daniel Kitchen" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-11-->
- <!--adventure game-->
+ <!-- Dump released: 2022-02-11 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234793">
<rom name="crystal caverns.woz" size="234793" crc="c0ea16f3" sha1="0101b207d85530d16c74b1a6eb52420cfcc0761a" />
@@ -27286,6 +17305,29 @@ license:CC0-1.0
</part>
</software>
+ <software name="cgshopng_525" cloneof="cgshopng">
+ <description>Curious George Goes Shopping</description>
+ <year>1989</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234797">
+ <rom name="curious george goes shopping side a.woz" size="234797" crc="d9f72942" sha1="66786a5b5b4f9a73b461a79a523019cc1f171989" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234797">
+ <rom name="curious george goes shopping side b.woz" size="234797" crc="b3f0ca5e" sha1="1f87ceb0dbfab17bddaef199975c69374c5c107f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cgshopng">
<description>Curious George Goes Shopping (800K 3.5")</description>
<year>1989</year>
@@ -27293,11 +17335,34 @@ license:CC0-1.0
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-01-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1345354">
- <rom name="curious george goes shopping 800k.woz" size="1345354" crc="2c14df52" sha1="f6c46ae1671adfabe2568fb4137501e72f6e2703" />
+ <dataarea name="flop" size="1345336">
+ <rom name="curious george goes shopping 800k.woz" size="1345336" crc="b2dd8577" sha1="211a3adea6c5a4da8c970a6a1188f8442f0d804b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cgoutspc_525" cloneof="cgoutspc">
+ <description>Curious George in Outer Space</description>
+ <year>1989</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234799">
+ <rom name="curious george in outer space side a.woz" size="234799" crc="cec8ceac" sha1="aade7f900e266dd99b497b1b6e97e3ee6af246a1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234799">
+ <rom name="curious george in outer space side b.woz" size="234799" crc="0e43fed3" sha1="7262f3dce04ac0806ee62fba23cbfaeb5c20727d" />
</dataarea>
</part>
</software>
@@ -27309,8 +17374,8 @@ license:CC0-1.0
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-01-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345355">
<rom name="curious george in outer space 800k.woz" size="1345355" crc="74deb6d4" sha1="d6df93f3de6df64a73ece451137a667b3596f40a" />
@@ -27318,6 +17383,29 @@ license:CC0-1.0
</part>
</software>
+ <software name="cglibrary_525" cloneof="cglibrary">
+ <description>Curious George Visits the Library</description>
+ <year>1989</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires an Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234803">
+ <rom name="curious george visits the library side a.woz" size="234803" crc="a2d09816" sha1="78424dc5da24a3da377d87eede10d21dc894b24b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234803">
+ <rom name="curious george visits the library side b.woz" size="234803" crc="57150915" sha1="1e7eb06ab7eb29b9b9424b7bdacf1e531768cd81" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cglibrary">
<description>Curious George Visits the Library (800K 3.5")</description>
<year>1989</year>
@@ -27325,8 +17413,8 @@ license:CC0-1.0
<info name="developer" value="Ahead Designs" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-01-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-01 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345359">
<rom name="curious george visits the library 800k.woz" size="1345359" crc="9c8279e3" sha1="0d94bc7834461c0c4771ebc239422f0b80db0794" />
@@ -27335,15 +17423,15 @@ license:CC0-1.0
</software>
<software name="cyborg2">
- <description>Cyborg (version 2)</description>
+ <description>Cyborg (version 2) (Sentient Software)</description>
<year>1981</year>
<publisher>Sentient Software</publisher>
<info name="programmer" value="Michael Berlyn" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-25-->
- <!--adventure game-->
+ <!-- Dump released: 2022-02-25 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234793">
<rom name="cyborg v2.woz" size="234793" crc="69539113" sha1="4668ba1edb2be92a423f66297e62ac4dee0c9e82" />
@@ -27359,11 +17447,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-11-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-11 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234788">
<rom name="carmen's north dakota almanac database.woz" size="234788" crc="757d3e67" sha1="618423e72b222f16e6624750d80e09aecf6f4656" />
@@ -27379,11 +17467,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-17-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-17 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234813">
<rom name="governors and first ladies of north dakota database.woz" size="234813" crc="9fddb019" sha1="2be825d65d27591e49654873de30086b496af70d" />
@@ -27399,11 +17487,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-18-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-18 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234786">
<rom name="minerals of north dakota.woz" size="234786" crc="16c550e4" sha1="1221551a2df3a59e5b81e328863ab0c672107605" />
@@ -27419,11 +17507,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-17-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-17 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234795">
<rom name="north dakota agriculture database.woz" size="234795" crc="7dfea486" sha1="b0504bc333ffc3b2ff70bea46b3607e62a7ef2cd" />
@@ -27439,11 +17527,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-18-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-18 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234807">
<rom name="north dakota cities with population under 500 database.woz" size="234807" crc="26fd3aae" sha1="6065680920edb68a51f5b8babb6e7dcc38630403" />
@@ -27459,11 +17547,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-18-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-18 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234811">
<rom name="north dakota cities with population 500 and above database.woz" size="234811" crc="c5ca75ae" sha1="81fc62349dd3afdecc1db519ebb700404f71058d" />
@@ -27479,11 +17567,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-18-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-18 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234783">
<rom name="north dakota counties database.woz" size="234783" crc="d6df23a4" sha1="ef48c731e1e245b3b2f12ca13cde757703924015" />
@@ -27499,11 +17587,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-18-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-18 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234784">
<rom name="north dakota explorers database.woz" size="234784" crc="84f60ca6" sha1="bf064dc7c8a3eda897d4794f361336431681d6fb" />
@@ -27519,11 +17607,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-18-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-18 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234788">
<rom name="north dakota indian tribes.woz" size="234788" crc="0c8540c3" sha1="2e0e93a04b9002f9732d3a92086e4958b57aac9a" />
@@ -27539,11 +17627,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234801">
<rom name="north dakota parks and historical sites.woz" size="234801" crc="e4648f2b" sha1="3c2cfef269ed387988705717f8b369bd502d2505" />
@@ -27559,11 +17647,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234781">
<rom name="north dakota plants.woz" size="234781" crc="6c978fc3" sha1="ad24084bf410dff2aaa584367dc26b83b2f0c88b" />
@@ -27579,11 +17667,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234780">
<rom name="north dakota pride.woz" size="234780" crc="436ed557" sha1="2067daae9ae657f2df24a556a2d7cef724598a30" />
@@ -27599,11 +17687,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234782">
<rom name="north dakota symbols.woz" size="234782" crc="4e904c78" sha1="e8f19de16437067e1aea7256a0983f79229873d4" />
@@ -27619,11 +17707,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234808">
<rom name="north dakota u.s. senators and representatives.woz" size="234808" crc="e7c06937" sha1="c81e2fb70ff021b203db05b43a974a8e8145fc57" />
@@ -27639,11 +17727,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234783">
<rom name="north dakota wildlife.woz" size="234783" crc="39e62a9b" sha1="bbffd66cdef57839e6c15e3fd72f0e6526c39e64" />
@@ -27659,11 +17747,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-19-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-19 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234792">
<rom name="notable people of north dakota.woz" size="234792" crc="73752e7c" sha1="b3b24917dc6c21636ac676ecf81d4616546e5aa9" />
@@ -27671,20 +17759,325 @@ license:CC0-1.0
</part>
</software>
- <software name="dqsample">
- <description>Dataquest: Sampler (A-173 version 1.0)</description>
- <year>1986</year>
- <publisher>MECC</publisher>
- <info name="developer" value="MECC" />
- <info name="partno" value="A-173" />
+ <software name="midmagic">
+ <description>David's Midnight Magic</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Snider" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-20 -->
+ <!-- action game -->
+ <!-- This re-release was part of the "Double-Pack Classics" collection that
+ included Choplifter on the other side of the disk; both games were updated
+ to fix model-specific compatibility issues caused by the copy protection of
+ earlier releases. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241481">
+ <rom name="david's midnight magic.woz" size="241481" crc="fa2f209f" sha1="a19f1c50796f2f842c87d25c27decb3b12983d20" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="daviddos">
+ <description>David-DOS</description>
+ <year>1982</year>
+ <publisher>David Data</publisher>
+ <info name="programmer" value="David Weston" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-06 -->
+ <!-- disk utility program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="david-dos.woz" size="234821" crc="da182438" sha1="1bff9a48a799eb9528bbda86540b909839eda0b4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dazldraw841115" cloneof="dazldraw">
+ <description>Dazzle Draw (version 1984-11-15)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Snider" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <info name="version" value="1984-11-15" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <!-- Dump released: 2025-07-21 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="254777">
+ <rom name="dazzle draw 1984-11-15 side a.woz" size="254777" crc="f45a336e" sha1="68609d5a627319905b37a027e0c6f845b24aa95f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234809">
+ <rom name="dazzle draw 1984-11-15 side b.woz" size="234809" crc="1c526526" sha1="bd4841a1f4dddb045b43918278036fbc8206e198" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dazldraw850916" cloneof="dazldraw">
+ <description>Dazzle Draw (version 1985-09-16)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Snider" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <info name="version" value="1985-09-16" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <!-- Dump released: 2025-03-20 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="248098">
+ <rom name="dazzle draw 1985-09-16 side a.woz" size="248098" crc="c4787edd" sha1="d61c12e44b19080e56b1d93907e5a6a580c9584d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234765">
+ <rom name="dazzle draw 1985-09-16 side b.woz" size="234765" crc="ddcc9c27" sha1="f1b875b3f428a84e7e206f7a44ed081f53ba9e55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dazldraw">
+ <description>Dazzle Draw (version 1.1 1987-08-06)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Snider" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <info name="version" value="1.1 1987-08-06" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl4_default" value="mouse" />
+ <!-- includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <!-- Dump released: 2019-03-03 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="248075">
+ <rom name="dazzle draw side a.woz" size="248075" crc="8e93587b" sha1="486e44c49d9b4ac6d4ba1fa6aa9824934fb14cce" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234766">
+ <rom name="dazzle draw side b.woz" size="234766" crc="6648df34" sha1="d693245765c0440807fab4e3a4df6bc676146f9f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deathcrb">
+ <description>Death in the Caribbean</description>
+ <year>1983</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Philip Hess" />
+ <info name="programmer" value="Bos Hess" />
+ <info name="programmer" value="Barbara P. Lawrence" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-07 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234798">
+ <rom name="death in the caribbean side a.woz" size="234798" crc="6ea59a9b" sha1="8d63ae9bc2cabeeae3e56a763f14cef91035115c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234798">
+ <rom name="death in the caribbean side b.woz" size="234798" crc="af03363c" sha1="0fe806b9c68a9b2d47d626b32cadaab0f272a188" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deathswd">
+ <description>Death Sword</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Designer Software" />
<info name="usage" value="Requires a 128K Apple //e or later." />
- <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2018-11-30 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234791">
- <rom name="dataquest- sampler v1.0.woz" size="234791" crc="4614b4ca" sha1="0990bc15bdec596603cb4d6f632f29547df9d795" />
+ <dataarea name="flop" size="233486">
+ <rom name="death sword.woz" size="233486" crc="31c95650" sha1="b94418ae85f887f857dc683221e24ab8172eb191" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deathlrd">
+ <description>Deathlord</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Al Escudero" />
+ <info name="programmer" value="David Wong" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Use the 2 'master' scenario disks to make playable scenario disks." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="234817">
+ <rom name="deathlord disk 1a - program.woz" size="234817" crc="9160ea13" sha1="ab704b7b0861cf3d870c460a1414f1420cea9e28" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Master scenario A" />
+ <dataarea name="flop" size="234835">
+ <rom name="deathlord disk 2a - master scenario a.woz" size="234835" crc="2fce1472" sha1="0b7e1c734cbc838ba7aa266d6736bc9d63e5c899" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Master scenario B" />
+ <dataarea name="flop" size="234835">
+ <rom name="deathlord disk 2b - master scenario b.woz" size="234835" crc="44bd83af" sha1="4865361bab51523d13bb50e23f519e90f039f2bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="decpwrdp" supported="no">
+ <description>Decimal and Percent Word Problems</description>
+ <year>1984</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="alt_title" value="MicroTutor II: Mosaic" />
+ <!-- Title screen -->
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="decimal and percent word problems.woz" size="234784" crc="729bf334" sha1="6f43988efc37fb009f0780f700c22ee7204bd444" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="decdesert">
+ <description>Decision in the Desert</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="author" value="Ed Bever" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. 128K for hi-res graphics." />
+ <!-- Option to use double hi-res graphics on 128K machines. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234779">
+ <rom name="decision in the desert side a.woz" size="234779" crc="0a4c846e" sha1="80ce0d555cfacf55c00a06de68b3ceec8b03e1fe" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234779">
+ <rom name="decision in the desert side b.woz" size="234779" crc="2ff002de" sha1="9c9ad019b9efc93d0556ec7194ff7201c8fc76ea" />
+ </dataarea>
+ </part>
+
+ </software>
+
+ <software name="dbotcwv1">
+ <description>Decisive Battles of the American Civil War: Volume One (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235614">
+ <rom name="decisive battles of the american civil war volume one side a - master disk.woz" size="235614" crc="a9fa93b5" sha1="0836338d695e7adbaee4ca8eaa8773c7e60280de" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235616">
+ <rom name="decisive battles of the american civil war volume one side b - scenario disk.woz" size="235616" crc="c670da9f" sha1="b27e92a68f43861e0054b79e03805b4bbf3e2fc9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dbotcwv2">
+ <description>Decisive Battles of the American Civil War: Volume Two (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Malcom Power" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-19 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235578">
+ <rom name="decisive battles of the american civil war volume two side a - master disk.woz" size="235578" crc="30c483b9" sha1="cbb8bda5723def98ca183646c695d532e1461d18" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235580">
+ <rom name="decisive battles of the american civil war volume two side b - scenario disk.woz" size="235580" crc="6a2bf6ce" sha1="7eff676e25d0c96d5af5b556ff4994bd8947ac29" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dbotcwv3">
+ <description>Decisive Battles of the American Civil War: Volume Three (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Malcom Power" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-20 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235625">
+ <rom name="decisive battles of the american civil war volume three side a - master disk.woz" size="235625" crc="8f7aed91" sha1="ad584617e8deea0dac7a648411942345f9ece676" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235627">
+ <rom name="decisive battles of the american civil war volume three side b - scenario disk.woz" size="235627" crc="1ce9edc5" sha1="3f8e1c8ca03eefa1c46b881fe0b566e7a2b96162" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="defender">
+ <description>Defender (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="programmer" value="Bill Bogenreif" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234742">
+ <rom name="defender.woz" size="234742" crc="f978c620" sha1="d596386d40ac997976e396b84b7857e6b6c82569" />
</dataarea>
</part>
</software>
@@ -27696,8 +18089,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234769">
<rom name="desktop zoo.woz" size="234769" crc="da8ff2f6" sha1="331e190e56226476fd8431e6b2ba150ce6dd1fbd" />
@@ -27705,15 +18098,116 @@ license:CC0-1.0
</part>
</software>
+ <software name="destryr">
+ <description>Destroyer</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233484">
+ <rom name="destroyer.woz" size="233484" crc="bb402221" sha1="40cba620460fde69dda879230128237ee68c830f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="deugddd">
+ <description>Deutsche Grammatik: der-die-das</description>
+ <year>1986</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Frank Del Favero" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="241518">
+ <rom name="deutsche grammatik - disk 1, side a.woz" size="241518" crc="010083f7" sha1="9163e24c431e8ac5b2df28901957bd9e21afff91" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dtvocab">
+ <description>Diagnostic Tests: Vocabulary (version 01.17.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.17.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="diagnostic tests- vocabulary v01.17.89.woz" size="234794" crc="6dd7212b" sha1="32b8f96f959ba06714602aa20abc1b0f56791b6b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="digduga" cloneof="digdug">
+ <description>Dig Dug (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-11 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233446">
+ <rom name="dig dug.woz" size="233446" crc="20b719e9" sha1="6db5b295394e19295c7e6c299cec40eec7a8a70b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="digdug">
+ <description>Dig Dug (Datasoft)</description>
+ <year>1984</year>
+ <publisher>Datasoft</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="68310">
+ <rom name="dig dug (datasoft).woz" size="68310" crc="62663ce4" sha1="8c7227efb288fc95870631c89b0ec59dcd022a22" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dindisk">
+ <description>Dinner on a Disk (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Homemaker Software" />
+ <info name="programmer" value="Henny Hall" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241416">
+ <rom name="dinner on a disk (softsmith).woz" size="241416" crc="878980fc" sha1="b47bdf22dded86c108dacc982ff70bf13177f20a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dinodigds">
<description>Dino Dig: Dictionary Skills</description>
<year>1992</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Nancy Patrissi, Alison Bennett, Diane Ashachik, and Gregory Truex" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="programmer" value="Gregory Truex" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-28-->
- <!--educational program-->
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234834">
<rom name="dino dig.woz" size="234834" crc="942e36e3" sha1="c7d0c175c4a1e515efa2377f5600a217694a4a2e" />
@@ -27721,17 +18215,222 @@ license:CC0-1.0
</part>
</software>
- <software name="dogsleda10_525" cloneof="dogsleda">
+ <software name="dinoeggs">
+ <description>Dino Eggs</description>
+ <year>1983</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="David H. Schroeder" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-07 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233477">
+ <rom name="dino eggs.woz" size="233477" crc="70d8d65d" sha1="84cbacaa8d639087b9b510839f0b2fe5bb40abd4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinosplb">
+ <description>Dino Speller: Beginning Dictionary Skills</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234819">
+ <rom name="dino speller.woz" size="234819" crc="91be9f89" sha1="4c34a08c73e0f30dd520053ab17b7e534497ccb7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinodayp_525" cloneof="dinodayp">
+ <description>Dinosaur Days Plus!</description>
+ <year>1988</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-30 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="242157">
+ <rom name="dinosaur days plus disk 1a - program.woz" size="242157" crc="f728b2e8" sha1="2b424a4b6d9b7dd55b3ea57ef25cda030185ca09" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="242157">
+ <rom name="dinosaur days plus disk 1b - program.woz" size="242157" crc="13f62316" sha1="5625f28455880a93f83f4a777605133f88a9dab2" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Graphics database" />
+ <dataarea name="flop" size="242166">
+ <rom name="dinosaur days plus disk 2a - graphics database.woz" size="242166" crc="31eb42c4" sha1="e154aec0d97913b9cede4b4e0a7c42b89db50f88" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Graphics database" />
+ <dataarea name="flop" size="242166">
+ <rom name="dinosaur days plus disk 2b - graphics database.woz" size="242166" crc="317fd228" sha1="cf19f2fb9a8bdd393465508eea23da8945e15319" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinodayp">
+ <description>Dinosaur Days Plus! (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program disk" />
+ <dataarea name="flop" size="1296187">
+ <rom name="dinosaur days plus 800k - disk 1 - program disk.woz" size="1296187" crc="06b40e00" sha1="6d35443ca094501873dc1b327c9f2de93af22c8c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Learning disk" />
+ <dataarea name="flop" size="1296188">
+ <rom name="dinosaur days plus 800k - disk 2 - learning disk.woz" size="1296188" crc="c5319f5d" sha1="1584a8d69a4c4ffa603a8651c83c2fe9e8913dd3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dinolnch">
+ <description>Dinosaur's Lunch</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Brenna Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234818">
+ <rom name="dinosaur's lunch.woz" size="234818" crc="dcba867e" sha1="31b96aa493a487103c0b6d2e73f490db60eb02e1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="discover">
+ <description>Discover: A Science Experiment</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Ed Herstein" />
+ <info name="programmer" value="Andry Christian" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241485">
+ <rom name="discover- a science experiment.woz" size="241485" crc="790df2ad" sha1="f69e58d9530884b1ef07e1deae48ff79b89acc56" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dskdrctr">
+ <description>Disk Director (Softsmith)</description>
+ <year>1983</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Sensible Software" />
+ <info name="original_publisher" value="Sensible Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234765">
+ <rom name="disk director (softsmith).woz" size="234765" crc="e540d3ef" sha1="156139c7eefa6a0cf315d4a4c18090f0b30def67" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dismgraph11">
+ <description>Displaying Information Series: MECC Graph (A-137 version 1.1)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-137" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="mecc graph v1.1.woz" size="234785" crc="0b0b5bd5" sha1="5e5dc9cb4caacd388969c0e60f910af353ccabad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dismgraphp10">
+ <description>Displaying Information Series: MECC Graphing Primer (A-136 version 1.0)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-136" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234795">
+ <rom name="mecc graphing primer v1.0.woz" size="234795" crc="a09867de" sha1="248293b746d709e1ee6377c036590d78082c351b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="divebmbr">
+ <description>Dive Bomber</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Distinctive Software" />
+ <info name="programmer" value="Allan Johanson" />
+ <info name="programmer" value="Tris Orendorff" />
+ <info name="programmer" value="Phil Kelly" />
+ <info name="programmer" value="John Boechler" />
+ <info name="programmer" value="Michael Bate" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-08 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233475">
+ <rom name="dive bomber.woz" size="233475" crc="f56ccceb" sha1="481f1cadcae87a599f116ce402a2113c22a654cc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dogsleda_525" cloneof="dogsleda">
<description>Dog Sled Ambassadors (A-339 version 1.0)</description>
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-339" />
- <info name="programmer" value="Beth Bell, Beth Daniels, Sheila Dols, Sheila Kelly, Kevin Neff, Korey Schulz, and John P. Wlazlo" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="John P. Wlazlo" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234890">
@@ -27751,12 +18450,18 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-339" />
- <info name="programmer" value="Beth Bell, Beth Daniels, Sheila Dols, Sheila Kelly, Kevin Neff, Korey Schulz, and John P. Wlazlo" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="John P. Wlazlo" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-25-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296261">
<rom name="dog sled ambassadors 800k.woz" size="1296261" crc="5dfaf7a2" sha1="9237be0ee4daf74d3278a00257d241fb4e2d3f85" />
@@ -27764,17 +18469,85 @@ license:CC0-1.0
</part>
</software>
- <software name="drlivstn10_525" cloneof="drlivstn">
+ <software name="dogfight">
+ <description>Dogfight</description>
+ <year>1980</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Bill Basham" />
+ <info name="usage" value="Runs on any Apple ][ with 32K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="55197">
+ <rom name="dogfight.woz" size="55197" crc="594a4c07" sha1="27e323f2e4703876ec3c9575e5d4bb29dc52abc6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dogfight2">
+ <description>Dogfight II</description>
+ <year>1981</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Bill Basham" />
+ <info name="protection" value="Protect-O-Disk" />
+ <info name="usage" value="Requires a 48K Apple ][ or Apple ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2019-10-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="188158">
+ <rom name="dogfight ii.woz" size="188158" crc="789c1c34" sha1="234fb379e91e741c7533d65e01f65547d942432d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dkong">
+ <description>Donkey Kong (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-08 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233450">
+ <rom name="donkey kong.woz" size="233450" crc="77ea741f" sha1="8a3195bd8aa21f4890fae30c417295b6bf5662ea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drknow">
+ <description>Dr. Know</description>
+ <year>1987</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="dr. know.woz" size="234815" crc="45336552" sha1="d4c4f6821e941898c4f952ba4e9e6de5e65dd506" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drlivstn_525" cloneof="drlivstn">
<description>Dr. Livingstone, I Presume? (A-314 version 1.0)</description>
<year>1992</year>
<publisher>MECC</publisher>
<info name="partno" value="A-314" />
- <info name="programmer" value="R. Philip Bouchard, David L. Wood, Shari Zehm, and John A. Persoon" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="programmer" value="John A. Persoon" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-09-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234848">
@@ -27794,13 +18567,16 @@ license:CC0-1.0
<year>1992</year>
<publisher>MECC</publisher>
<info name="partno" value="A-314" />
- <info name="programmer" value="R. Philip Bouchard, David L. Wood, Shari Zehm, and John A. Persoon" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="programmer" value="John A. Persoon" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
- <!--Image has been modified to remove identifying site license information.-->
+ <!-- Image has been modified to remove identifying site license information. -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-26-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296241">
<rom name="dr. livingstone, i presume 800k.woz" size="1296241" crc="37d8ad84" sha1="95b59f5fe39dc1fc3a5b3f52bed0e3587eaf953d" />
@@ -27808,17 +18584,121 @@ license:CC0-1.0
</part>
</software>
+ <software name="dragwars">
+ <description>Dragon Wars</description>
+ <year>1989</year>
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Rebecca Ann Heineman" />
+ <info name="programmer" value="Paul O'Connor" />
+ <info name="programmer" value="Brian Fargo" />
+ <info name="programmer" value="Todd J. Camasta" />
+ <info name="programmer" value="Kurt Heiden" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="234848">
+ <rom name="dragon wars - side 1.woz" size="234848" crc="77c1166c" sha1="539b54cd631562e6769b12a248bd89ec2f16d5ec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="234848">
+ <rom name="dragon wars - side 2.woz" size="234848" crc="f1fea733" sha1="e1e3f9e01a380d386157d245afc4cc33c64ba9c6" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="234848">
+ <rom name="dragon wars - side 3.woz" size="234848" crc="02fa671d" sha1="8c6a58e1e1954da968bd901169d836770926aa46" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4" />
+ <dataarea name="flop" size="234848">
+ <rom name="dragon wars - side 4.woz" size="234848" crc="3ad996a4" sha1="00b7391c64e28327d896757521c8d48592538914" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Side 5" />
+ <dataarea name="flop" size="234848">
+ <rom name="dragon wars - side 5.woz" size="234848" crc="ad325b5a" sha1="6c9cb53cac34f887c5a1c5d690c1052ca9ce7158" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Side 6" />
+ <dataarea name="flop" size="234848">
+ <rom name="dragon wars - side 6.woz" size="234848" crc="65c3c370" sha1="6488ea75afdf7d47874f0f269bcdc87daae8fb6a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drgkeep04071983">
+ <description>Dragon's Keep (version 1983-04-07)</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Mike Macchesney" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Rae Lynn Macchesney" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983-04-07" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234773">
+ <rom name="dragon's keep.woz" size="234773" crc="a892ffa5" sha1="1e8ca3764c89be6d61dcc0dd5259d10878bb958a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dragonshk">
+ <description>Dragons of Hong Kong</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Robert Lafore" />
+ <info name="programmer" value="David Fox" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-11 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234849">
+ <rom name="dragons of hong kong.woz" size="234849" crc="926dd1ef" sha1="655b277f438b799cd1aca2cffdd3c766774e8413" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drol">
+ <description>Drol</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Aik Beng" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-13 redumped 2019-09-13 to fix hang loading level 3. -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234753">
+ <rom name="drol.woz" size="234753" crc="90f71e85" sha1="0271bfb1d57f0757af8ab4b3a6f112a2a0c0e7da" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dueldigt">
<description>Dueling Digits</description>
<year>1982</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Doug Carlston and Brian Crouch" />
- <info name="usage" value="Requires a 48K Apple ][ or ][+." />
- <!--Due to compatibility problems created by the copy protection, it will not run on later models.-->
+ <info name="author" value="Doug Carlston" />
+ <info name="programmer" value="Brian Crouch" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P" />
- <!--Dump released: 2019-05-01-->
- <!--educational game-->
- <!--This is a different program than Dueling Digits by MECC.-->
+ <!-- Dump released: 2019-05-01 -->
+ <!-- educational game -->
+ <!-- This is a different program than Dueling Digits by MECC. -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="352021">
<rom name="dueling digits.woz" size="352021" crc="f1a7b5dc" sha1="cebd874ea25606d8ddbd566813beecfaa4973b67" />
@@ -27831,14 +18711,17 @@ license:CC0-1.0
<year>1993</year>
<publisher>MECC</publisher>
<info name="partno" value="A-338" />
- <info name="programmer" value="Dave Denninger, Rod Haenke, Ju-Chang Wang, and John P. Wlazlo" />
+ <info name="programmer" value="Dave Denninger" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="John P. Wlazlo" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
- <!--Image has been modified to remove identifying site license information.-->
+ <!-- Image has been modified to remove identifying site license information. -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-26-->
- <!--educational program-->
- <!--This is a different program than Dueling Digits by Brøderbund Software.-->
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <!-- This is a different program than Dueling Digits by Brøderbund Software. -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296223">
<rom name="dueling digits 800k.woz" size="1296223" crc="38478627" sha1="e93e01bee99ab7beb1fc5651968c30f7840d012c" />
@@ -27846,15 +18729,282 @@ license:CC0-1.0
</part>
</software>
+ <software name="dungcamp">
+ <description>Dungeon Campaign</description>
+ <year>1979</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="usage" value="Requires a 13-sector drive and a 32K Apple ][ or Apple ][+ with Integer BASIC in ROM." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234803">
+ <rom name="dungeon campaign.woz" size="234803" crc="976b96ac" sha1="16205bbad39fcb64b76150416f9658f107dac0b2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqhfwv1" cloneof="dqhfw">
+ <description>Dunjonquest: Hellfire Warrior (version 1)</description>
+ <year>1980</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2020-01-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234830">
+ <rom name="dunjonquest - hellfire warrior v1.woz" size="234830" crc="e50e2f5e" sha1="06aeeb9fda26ba4e7d0803413d8da5d4fe3917bb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqhfwv2" cloneof="dqhfw">
+ <description>Dunjonquest: Hellfire Warrior (version 2)</description>
+ <year>1980</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2020-01-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234803">
+ <rom name="dunjonquest - hellfire warrior v2.woz" size="234803" crc="97d67a1b" sha1="388d5069ef938229fe26d975f77993662622843d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqhfw">
+ <description>Dunjonquest: Hellfire Warrior (version 3)</description>
+ <year>1980</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234830">
+ <rom name="dunjonquest - hellfire warrior v3.woz" size="234830" crc="f2d3d1f0" sha1="90593ca39505dbe34c40efd6e19d67675e1a447e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqsorsiva">
+ <description>Dunjonquest: Sorcerer of Siva</description>
+ <year>1981</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Gene Rice" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="sorcerer of siva.woz" size="234763" crc="e14e1c8b" sha1="34119f636f0044300abd50f963b45fa929a17277" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqdsryn">
+ <description>Dunjonquest: The Datestones of Ryn</description>
+ <year>1980</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Jim Connelley" />
+ <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2020-05-08 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234844">
+ <rom name="dunjonquest- the datestones of ryn.woz" size="234844" crc="05154f9f" sha1="0d749206c8d00f872a253387dd9e7e69f1e35ca6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpapsr1" cloneof="dqtmpaps">
+ <description>Dunjonquest: The Temple of Apshai (Automated Simulations) (revision 1)</description>
+ <year>1979</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- This is revision 1, no title screen and boots on a 13-sector drive. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2020-01-06 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234834">
+ <rom name="dunjonquest - the temple of apshai rev. 1.woz" size="234834" crc="558d8c4d" sha1="210ae265fc085655888c4dbad7f763a7c2e9c68d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpapsr2" cloneof="dqtmpaps">
+ <description>Dunjonquest: The Temple of Apshai (Automated Simulations) (revision 2)</description>
+ <year>1979</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 13-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This is revision 2, which fixes unspecified bugs and adds a graphical title screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2020-01-06 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234734">
+ <rom name="dunjonquest - the temple of apshai rev. 2.woz" size="234734" crc="cde02b29" sha1="cb5e566436d64026dccd2f622d24aff1b529c71b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpapsr3" cloneof="dqtmpaps">
+ <description>Dunjonquest: The Temple of Apshai (Epyx) (revision 3)</description>
+ <year>1979</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 16-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <!-- This is revision 3, with updated copy protection and a hi-res character generator for on-screen text. Boots on a 16-sector drive. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234807">
+ <rom name="dunjonquest - the temple of apshai rev. 3.woz" size="234807" crc="6d43c84e" sha1="4fdadd64a576d5fce2a0af5aaced36429fd35b19" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpaps">
+ <description>Dunjonquest: The Temple of Apshai (Epyx) (revision 4)</description>
+ <year>1979</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="programmer" value="Michael Farren" />
+ <info name="usage" value="Requires a 16-sector drive and a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- This is revision 4, with updated copy protection and a hi-res character generator with two choices of font. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-07 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="248222">
+ <rom name="dunjonquest - the temple of apshai rev. 4.woz" size="248222" crc="03743196" sha1="be872c142dfff107fed23e23fecb2ab1fb035ce0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dqtmpapst">
+ <description>Dunjonquest: Temple of Apshai Trilogy</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Double hi-res mode requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-13 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233494">
+ <rom name="temple of apshai trilogy.woz" size="233494" crc="3875d6bc" sha1="cb71555bc29035fa8603849ff0cbc2017aee4604" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dynoqst">
+ <description>Dyno-Quest</description>
+ <year>1984</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="dyno-quest.woz" size="234762" crc="3463fc9f" sha1="4969ff1f02bb2e29981a24180812f00e9c424339" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eagles">
+ <description>Eagles (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Robert Raymond" />
+ <info name="programmer" value="Keith Brors" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234852">
+ <rom name="eagles.woz" size="234852" crc="ad19d3ca" sha1="b240acce07a48125d13f576a9361dbaa729ebaf4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="earchlng">
+ <description>Ear Challenger: A Music Game</description>
+ <year>1982</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Chris Alix" />
+ <info name="programmer" value="Stephen L. Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="ear challenger.woz" size="234796" crc="99c5ba62" sha1="cefcaed31d81e2a01a4084decf8a6ef68cebbf58" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="earlwvbb">
<description>Earl Weaver Baseball</description>
<year>1989</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Eddie Dombrower, Larry Rice, Mark Whittlesey, and John Heitmann" />
+ <info name="programmer" value="Eddie Dombrower" />
+ <info name="programmer" value="Larry Rice" />
+ <info name="programmer" value="Mark Whittlesey" />
+ <info name="programmer" value="John Heitmann" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--sports game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234829">
@@ -27875,15 +19025,158 @@ license:CC0-1.0
</part>
</software>
+ <software name="erulneg">
+ <description>Early Emerging Rules: Negation (version 1.0)</description>
+ <year>1990</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox, M.S." />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234845">
+ <rom name="early emerging rules- negation.woz" size="234845" crc="5b39deab" sha1="5217256bf6a5456cabb97b30e89f7cab94afc9e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="erulplur">
+ <description>Early Emerging Rules: Plurals (version 1.0)</description>
+ <year>1990</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox, M.S." />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234844">
+ <rom name="early emerging rules - plurals.woz" size="234844" crc="6b467cb8" sha1="1fb564de7a587ba9109658af749f6472b1bbc491" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ehbible">
+ <description>Early Heroes of the Bible</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House"/>
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234811">
+ <rom name="early heroes of the bible side a.woz" size="234811" crc="a0261c5c" sha1="7f14be83ce3ead8ab6d847b38d932657548e0ebf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234811">
+ <rom name="early heroes of the bible side b.woz" size="234811" crc="f4ac939a" sha1="c6aa85cea8ac3461cd48a988340e979aa7b813dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="erlymussk">
+ <description>Early Music Skills</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Lolita Walker Gilkes" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234827">
+ <rom name="early music skills.woz" size="234827" crc="32ce576f" sha1="87c5a2ce46d60f3115341d86a52a0bf2d5c6ee45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eostatn">
+ <description>Earth Orbit Stations</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Karl Buiter" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Game / Boot" />
+ <dataarea name="flop" size="228132">
+ <rom name="earth orbit stations disk 1 game disk.woz" size="228132" crc="3b1205cd" sha1="5ef6c82a865c0745878c99961a28b97e8f276d00" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Archive" />
+ <dataarea name="flop" size="234791">
+ <rom name="earth orbit stations disk 2a archive disk.woz" size="234791" crc="c86b1340" sha1="3cdbac14d51c7a89353243ce57101f89b582a665" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Mission" />
+ <dataarea name="flop" size="234791">
+ <rom name="earth orbit stations disk 2b mission disk.woz" size="234791" crc="0d01aa81" sha1="81f03a9308daa27cc8e7a5d0651cdbe36ad4c16a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="easyabc">
+ <description>Easy as ABC (Spinnaker Software)</description>
+ <year>1984</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="developer" value="Springboard Software" />
+ <info name="original_publisher" value="Springboard Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="easy as abc (spinnaker).woz" size="234798" crc="5d7d691a" sha1="e004af1ad17cc32c826713a162955778474cc49a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="easystr">
+ <description>Easy Street</description>
+ <year>1988</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234691">
+ <rom name="easy street.woz" size="234691" crc="03a594af" sha1="0d14c32f2b3f40d20aa92b71a801a692873dc5f0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="echelon">
<description>Echelon</description>
<year>1988</year>
<publisher>Access Software</publisher>
- <info name="programmer" value="Brent Erickson, Roger Carver, Bruce Carver, and Doug Vandegrift" />
+ <info name="programmer" value="Brent Erickson" />
+ <info name="programmer" value="Roger Carver" />
+ <info name="programmer" value="Bruce Carver" />
+ <info name="programmer" value="Doug Vandegrift" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-28-->
- <!--simulation game-->
+ <!-- Dump released: 2024-04-28 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234803">
@@ -27898,57 +19191,348 @@ license:CC0-1.0
</part>
</software>
- <software name="eerievlib_525" cloneof="eerievlib">
- <description>Eerieville Library (A-304 version 1.0)</description>
+ <software name="elecadvt">
+ <description>Electrifying Adventures (A-334 version 1.0)</description>
<year>1993</year>
<publisher>MECC</publisher>
- <info name="partno" value="A-304" />
- <info name="programmer" value="Sheila Dols, Kevin Neff, Mike Palmquist, Mike Tschimperle, and John Wlazlo" />
+ <info name="partno" value="A-334" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Rush Kivisto" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Dave Wood" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-08-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234846">
- <rom name="eerieville library.woz" size="234846" crc="a39fd0fd" sha1="b872f82ed763c17b9236236d5777c795707ec932" />
+ <dataarea name="flop" size="234855">
+ <rom name="electrifying adventures.woz" size="234855" crc="bbe4f440" sha1="0680fed43bdb9945b25809e9408664ba0ac4c1f3" />
</dataarea>
</part>
</software>
- <software name="eerievlib">
- <description>Eerieville Library (A-304 version 1.0) (800K 3.5")</description>
- <year>1992</year>
+ <software name="elemgene">
+ <description>Elementary Genetics (A-402 version 1.1)</description>
+ <year>1986</year>
<publisher>MECC</publisher>
- <info name="partno" value="A-304" />
- <info name="programmer" value="Sheila Dols, Kevin Neff, Mike Palmquist, Mike Tschimperle, and John Wlazlo" />
- <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="developer" value="TIES" />
+ <info name="partno" value="A-402" />
+ <info name="programmer" value="Marcia Horn" />
+ <info name="programmer" value="Earl Keyser" />
+ <info name="programmer" value="Joyce Lindgren" />
+ <info name="programmer" value="Jerome A. Farm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234783">
+ <rom name="genetics v1.1.woz" size="234783" crc="fc13bf99" sha1="cc360e71043c3d55d79d5deca34e103620c18883" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv3ss">
+ <description>Elementary Volume 3: Social Studies (History, Ecomonics, and Geography) (A-704 version 4.8)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-704" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.8" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234818">
+ <rom name="elementary volume 3- social studies v4.8.woz" size="234818" crc="fbfe1826" sha1="1ffbe90485e958be71a0f1e0771471ef50ac084f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv5larts15">
+ <description>Elementary Volume 5: Language Arts (Prefixes) (A-719 version 1.5)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-719" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234828">
+ <rom name="elementary volume 5- language arts (prefixes) v1.5.woz" size="234828" crc="3b73dd41" sha1="8392bd51e6e6054a8c27ed617573d6bd41ab524e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv8geo">
+ <description>Elementary Volume 8: Geometry (Points and Angles) (A-732 version 1.0)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-732" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241472">
+ <rom name="elementary volume 8- geometry (points and angles) v1.0.woz" size="241472" crc="83bfd0f6" sha1="9c84e924ce6db91f5656ad88a6a32960ae0436c1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv9geo">
+ <description>Elementary Volume 9: Geometry (Lines and Triangles) (A-733 version 2.1)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-733" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241490">
+ <rom name="elementary volume 9- geometry (lines and triangles) v2.1.woz" size="241490" crc="13a9f0b4" sha1="0d052f5edf3b38c5357ae62dcc422a27c57442e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv10geo10" cloneof="elv10geo">
+ <description>Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter) (A-734 version 1.0)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-734" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241490">
+ <rom name="elementary volume 10- geometry (quadrilaterals- area and perimeter) v1.0.woz" size="241490" crc="91f53af0" sha1="cc4f852f606158fead49a2b6a4ff11bd9b4f9079" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv10geo">
+ <description>Elementary Volume 10: Geometry (Quadrilaterals: Area and Perimeter) (A-734 version 1.1)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-734" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241506">
+ <rom name="elementary volume 10- geometry (quadrilaterals- area and perimeter) v1.1.woz" size="241506" crc="668e0b82" sha1="9e94739fcb09e82092874c8b6f432a50a6a63ca4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elv12larts10">
+ <description>Elementary Volume 12: Language Arts (SIMS) (A-736 version 1.0)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-736" />
+ <info name="programmer" value="Daniel M. Forde" />
+ <info name="programmer" value="Scott Costello" />
+ <info name="programmer" value="R. Christiansen" />
+ <info name="programmer" value="David E. Laden" />
+ <info name="programmer" value="L. Dixson" />
+ <info name="programmer" value="S. Costello" />
+ <info name="programmer" value="J. Cook" />
+ <info name="programmer" value="L. Borry" />
+ <info name="programmer" value="R. Alberti" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234825">
+ <rom name="elementary volume 12- language arts (sims) v1.0.woz" size="234825" crc="e235ef4f" sha1="f9ac0070cf835e36c3695d9c3fb91660870bf7b1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engmlab">
+ <description>English MicroLab: Assessment of English Skills (version A1)</description>
+ <year>1985</year>
+ <publisher>Houghton Mifflin</publisher>
+ <info name="programmer" value="Arthur H. Bell" />
+ <info name="programmer" value="Sharon R. Anderson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="A1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234787">
+ <rom name="english microlab.woz" size="234787" crc="51183bfa" sha1="cef91a30d7455d19c84cab7a2286f9b317c0c71d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="engv1pos">
+ <description>English Volume 1: Parts of Speech (A-746 version 1.5)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-746" />
+ <info name="programmer" value="A. McCarthy" />
+ <info name="programmer" value="Darrel Ricke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234831">
+ <rom name="english parts of speech v1.5.woz" size="234831" crc="26c21abb" sha1="f0544ae50451e2a52ba2345acf102d65cf863429" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eqmath10" cloneof="eqmath">
+ <description>Equation Math (A-193 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-193" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
- <!--Image has been modified to remove identifying site license information.-->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-26-->
- <!--educational program-->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1296239">
- <rom name="eerieville library 800k.woz" size="1296239" crc="1a2a0820" sha1="3052df43d75f156f83ef50b78bf209b1098f36e4" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="equation math v1.0.woz" size="234786" crc="0c7e78eb" sha1="f5fbc707abd3d361d8f2b9b9f513003b80ecc843" />
</dataarea>
</part>
</software>
- <software name="elecadvt">
- <description>Electrifying Adventures (A-334 version 1.0)</description>
- <year>1993</year>
+ <software name="eqmath">
+ <description>Equation Math (A-193 version 1.1) (800K 3.5")</description>
+ <year>1987</year>
<publisher>MECC</publisher>
- <info name="partno" value="A-334" />
- <info name="programmer" value="Beth Bell, Rush Kivisto, Patricia Korn, and Dave Wood" />
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-193" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345285">
+ <rom name="equation math v1.1 800k.woz" size="1345285" crc="60cd6d1d" sha1="42aeb0d59ea58e879c1fccb3fdf61ba335410019" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="equat183" cloneof="equat1">
+ <description>Equations I (version 1983)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="equations i.woz" size="234762" crc="c1587219" sha1="e05c93f2b1f69e4de8271f75efae76ab1945c5ab" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="equat1">
+ <description>Equations I (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="equations i 1988.woz" size="234762" crc="16420afc" sha1="fa229a93a7fbe52825910a9fe3e93ac371a2388e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="equat2">
+ <description>Equations II (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241419">
+ <rom name="equations ii 1988.woz" size="241419" crc="5c84c5d3" sha1="38bb569b36a905a31d762b3f90d320c6bcb4347d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bescape">
+ <description>Escape</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228079">
+ <rom name="escape.woz" size="228079" crc="27a73b52" sha1="e2af6129e23aad6fb6ff9025b0694c4c9a97007f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eslwrite">
+ <description>ESL Writer (version 1.0)</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Emerson &amp; Stern Associates" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-08-->
- <!--educational program-->
+ <!-- Dump released: 2024-12-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234855">
- <rom name="electrifying adventures.woz" size="234855" crc="bbe4f440" sha1="0680fed43bdb9945b25809e9408664ba0ac4c1f3" />
+ <feature name="part_id" value="Disk 1 Side A - Student" />
+ <dataarea name="flop" size="234781">
+ <rom name="esl writer disk 1a - student disk.woz" size="234781" crc="596d119a" sha1="593b86f8978e2d9cb33b9aa7f33ac1dc6428db11" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Student" />
+ <dataarea name="flop" size="234781">
+ <rom name="esl writer disk 1b - student disk.woz" size="234781" crc="c5f1b3ce" sha1="f2abbf0e2cecc91d808f82ca6a581487c264380b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Teacher" />
+ <dataarea name="flop" size="234781">
+ <rom name="esl writer disk 2 - teacher disk.woz" size="234781" crc="5ae3ffbf" sha1="873f95f0ea56ef14f4adf39de40a5b013c595e5c" />
</dataarea>
</part>
</software>
@@ -27961,8 +19545,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="3.0-1984-02-06" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-27-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-27 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="248150">
<rom name="essential data duplicator iii v3.0-1984-02-06.woz" size="248150" crc="0a30990a" sha1="16dd4115b4dbba341504ee066500b5e6901b7cf5" />
@@ -27978,8 +19562,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="3.0-1984-05-25" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-27-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-03-27 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="247145">
<rom name="essential data duplicator iii v3.0-1984-05-25.woz" size="247145" crc="7b1493eb" sha1="1de36a7c74a19786cf4516b4d1f16e4c7164837e" />
@@ -27995,8 +19579,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.4" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-11-04-->
- <!--disk utility program-->
+ <!-- Dump released: 2021-11-04 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="106863">
<rom name="essential data duplicator v4.4.woz" size="106863" crc="a50ae8ed" sha1="c3f6a000171af417c81af7d47c81dc7f1d2026f7" />
@@ -28012,8 +19596,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="4.1" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-17-->
- <!--disk utility program-->
+ <!-- Dump released: 2024-03-17 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="95026">
<rom name="essential data duplicator 4 plus v4.1.woz" size="95026" crc="1e3718ff" sha1="46e7db7d52a25133db8665a4a98bdbef1a56a759" />
@@ -28021,16 +19605,785 @@ license:CC0-1.0
</part>
</software>
+ <software name="essex">
+ <description>Essex</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Bill Darah" />
+ <info name="developer" value="Syapse Software" />
+ <info name="programmer" value="Bill Darah" />
+ <info name="programmer" value="William Mataga" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="235499">
+ <rom name="essex side 1.woz" size="235499" crc="d4371622" sha1="3dd75760252ac1e87f71e9294694c6afb1f10e9a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="235499">
+ <rom name="essex side 2.woz" size="235499" crc="f5d88e20" sha1="8e8fe1e8499dbe11ad228b68080f9973f6379978" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="235499">
+ <rom name="essex side 3.woz" size="235499" crc="8b57c044" sha1="031a2ce43a020c937447ddf1ee572d3b83dbeb36" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="estimat">
+ <description>Estimation (A-124 version 1.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-124" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="estimation v1.0.woz" size="234769" crc="75497413" sha1="cb149527c1dfeb0fd29686bb233b186af84a3407" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestact_525" cloneof="ecestact">
+ <description>Estimation Collection: Estimation Activities (A-296 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-296" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234855">
+ <rom name="estimation activities.woz" size="234855" crc="4b1b30c1" sha1="ac9a0acf0dca9f005ab100711ee36ee3608f0bf4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestact">
+ <description>Estimation Collection: Estimation Activities (A-296 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-296" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345401">
+ <rom name="estimation activities 800k.woz" size="1345401" crc="df184f45" sha1="6ee726f99fea190d90a517b1bc190000537cf36e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eceststr_525" cloneof="eceststr">
+ <description>Estimation Collection: Estimation Strategies (A-295 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-295" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="estimation strategies.woz" size="234836" crc="47a12cc6" sha1="7db9cbef26d7bfcdb526018274fc53d55044e2ce" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eceststr">
+ <description>Estimation Collection: Estimation Strategies (A-295 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-295" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345382">
+ <rom name="estimation strategies 800k.woz" size="1345382" crc="ea9e7753" sha1="40d2863da9809d168e4b69a0a3748ed3a1a8667f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestqsi_525" cloneof="ecestqsi">
+ <description>Estimation Collection: Estimation: Quick Solve I (A-258 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-258" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234918">
+ <rom name="estimation- quick solve i.woz" size="234918" crc="62eeefa8" sha1="d9e41383ac91a65db37c52d8b3b720e66b296e89" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestqsi">
+ <description>Estimation Collection: Estimation: Quick Solve I (A-258 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-258" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345421">
+ <rom name="estimation- quick solve i 800k.woz" size="1345421" crc="682407a0" sha1="793b8cc0164d458de09b10b8f58e05048a215e26" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestqsii_525" cloneof="ecestqsii">
+ <description>Estimation Collection: Estimation: Quick Solve II (A-259 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-259" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234903">
+ <rom name="estimation- quick solve ii v1.0.woz" size="234903" crc="5378dd49" sha1="05ed9d2968c1ad7b237bd8b7caba3a457634e58a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ecestqsii">
+ <description>Estimation Collection: Estimation: Quick Solve II (A-259 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-259" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Shari Glenn" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345402">
+ <rom name="estimation- quick solve ii v1.0 800k.woz" size="1345402" crc="d356bcfd" sha1="84c78d83e692dd44c9ca270a323b4df37d3b7c21" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eurablaz">
+ <description>Europe Ablaze (version 1.0)</description>
+ <year>1985</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Eric Baker" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Master disk" />
+ <dataarea name="flop" size="235594">
+ <rom name="europe ablaze disk 1a - master disk.woz" size="235594" crc="44a5cfb8" sha1="f0abd95b4a037d109f790cf7a6e4d7a782009f83" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Scenario disk" />
+ <dataarea name="flop" size="235596">
+ <rom name="europe ablaze disk 1b - scenario disk.woz" size="235596" crc="044db361" sha1="a5097a867dcac055ff578af624cfd0da8530ad4a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Backup master disk" />
+ <dataarea name="flop" size="242257">
+ <rom name="europe ablaze disk 2a - backup master disk.woz" size="242257" crc="50116792" sha1="3db001af13709b2f161a9d33f50566e00c6eb585" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Backup scenario disk" />
+ <dataarea name="flop" size="235619">
+ <rom name="europe ablaze disk 2b - backup scenario disk.woz" size="235619" crc="0af563cc" sha1="d7ea4a13ccbd14f024c8e1ce4106986c07a7899e" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Save game disk A" />
+ <dataarea name="flop" size="235599">
+ <rom name="europe ablaze disk 3a - save game disk a.woz" size="235599" crc="ef7da412" sha1="f500d16e1836a8e40d3688db9421b7ff5d935591" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Save game disk B" />
+ <dataarea name="flop" size="235599">
+ <rom name="europe ablaze disk 3b - save game disk b.woz" size="235599" crc="f4262c8c" sha1="63135a79b8d1fa1287e5a155daa955de165c7325" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expamazn">
+ <description>Expedition Amazon</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Willard Phillips" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235507">
+ <rom name="expedition amazon side a.woz" size="235507" crc="b318d4dd" sha1="bff9901632fd32337cb0e400a9b79328f74c4414" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B (Boot)" />
+ <dataarea name="flop" size="235507">
+ <rom name="expedition amazon side b (boot).woz" size="235507" crc="25f68170" sha1="10601a71523d05c46918983176f96364643b1248" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expproc">
+ <description>Experiencing Procedures (A-810 version 1.0)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-810" />
+ <info name="programmer" value="Wendell Ruotsi" />
+ <info name="programmer" value="Andy Hollenbeck" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="experiencing procedures v1.0.woz" size="234798" crc="862bf554" sha1="56923d20ba66d317971e52869cd00fc8b9d4866b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expchaos_525" cloneof="expchaos">
+ <description>Exploring Chaos (A-316 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-316" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234835">
+ <rom name="exploring chaos.woz" size="234835" crc="69cad8cc" sha1="ed21e12ac59e0161db70e81d3dc01e34f968250a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expchaos">
+ <description>Exploring Chaos (A-316 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-316" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Image has been modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296229">
+ <rom name="exploring chaos 800k.woz" size="1296229" crc="cc12fb2c" sha1="bca23a6d1a35dd8e214cbeee3e885a3fc5bc995c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expgasl_525" cloneof="expgasl">
+ <description>Exploring Gas Laws (A-229 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-229" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Hassan Kaganda" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234859">
+ <rom name="exploring gas laws.woz" size="234859" crc="4cb03ce7" sha1="872b200be09e33b8c37204cc9bf1ec0bc25cead0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expgasl">
+ <description>Exploring Gas Laws (A-229 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-229" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Hassan Kaganda" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345387">
+ <rom name="exploring gas laws 800k.woz" size="1345387" crc="b50389dd" sha1="bb39bf8b0314ef2da12460f9a7111ec62e8f1747" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expseqs_525" cloneof="expseqs">
+ <description>Exploring Sequences and Series (A-263 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-263" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234872">
+ <rom name="exploring sequences and series.woz" size="234872" crc="56aa52cd" sha1="53f75c0913cb8a3a30bf29af04c1f142a8e6322f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expseqs">
+ <description>Exploring Sequences and Series (A-263 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-263" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345407">
+ <rom name="exploring sequences and series v1.0 800k.woz" size="1345407" crc="b7c784e7" sha1="ac524a42d24e45b2d88e867bd2f1af916f00c8ba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expsctmp">
+ <description>Exploring Science: Temperature</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Leslie Eiser" />
+ <info name="programmer" value="Dominique Allard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241480">
+ <rom name="exploring science- temperature.woz" size="241480" crc="662e8445" sha1="315bc00ae0266f91d73f34a0c7aab6155a9d3878" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="expsortrt10">
+ <description>Exploring Sorting Routines (A-110 version 1.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-110" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="exploring sorting routines v1.0.woz" size="234801" crc="e58c43d5" sha1="f50914e8726d198db50c76c017c48d96495acb0b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrseerl_525" cloneof="edrseerl">
+ <description>Express Delivery Reading Series: Eerieville Library (A-304 version 1.0)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-304" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Mike Tschimperle" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234846">
+ <rom name="eerieville library.woz" size="234846" crc="a39fd0fd" sha1="b872f82ed763c17b9236236d5777c795707ec932" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrseerl">
+ <description>Express Delivery Reading Series: Eerieville Library (A-304 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-304" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Mike Tschimperle" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Image has been modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296239">
+ <rom name="eerieville library 800k.woz" size="1296239" crc="1a2a0820" sha1="3052df43d75f156f83ef50b78bf209b1098f36e4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrsfishs_525" cloneof="edrsfishs">
+ <description>Express Delivery Reading Series: Fish School (A-302 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-302" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="fish school.woz" size="234836" crc="e1776ea6" sha1="8d9c721670a8c9434e91c48ac6a93b6480415c4b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrsfishs">
+ <description>Express Delivery Reading Series: Fish School (A-302 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-302" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Image has been modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296229">
+ <rom name="fish school 800k.woz" size="1296229" crc="06f283cb" sha1="f8e571b5c587ac560aa6081bd5c6e6fc040d82c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrsmovm_525" cloneof="edrsmovm">
+ <description>Express Delivery Reading Series: Moving Museum (A-303 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-303" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234837">
+ <rom name="moving museum.woz" size="234837" crc="92664dca" sha1="2d97f3736666b71f64343cd4d1d1861c183bf979" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrsmovm">
+ <description>Express Delivery Reading Series: Moving Museum (A-303 version 1.0) (800K 3.5")</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-303" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Image has been modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296231">
+ <rom name="moving museum 800k.woz" size="1296231" crc="83d35fb7" sha1="9c88ce9e3a4b18c971d57e3a85ace2f826fa7044" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="edrswindc">
+ <description>Express Delivery Reading Series: Windy City (A-301 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-301" />
+ <info name="programmer" value="Sue Gabrys" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Image has been modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296228">
+ <rom name="windy city 800k.woz" size="1296228" crc="93eda025" sha1="12b8ae7b9a8652f6d35f14d2c388fe5489d47823" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="extappbas10" cloneof="extappbas">
+ <description>Extensions to Applesoft BASIC (A-786 version 1.0)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-786" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234804">
+ <rom name="extensions to applesoft basic v1.0.woz" size="234804" crc="84e3f14a" sha1="d0e25c453277758c80bc9e1b1491c4a797b0eed7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="extappbas">
+ <description>Extensions to Applesoft BASIC (A-786 version 1.2)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-786" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234804">
+ <rom name="extensions to applesoft basic v1.2.woz" size="234804" crc="27c633fd" sha1="4778dd901716c11c95a9302dfc013c769f74b49e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ezlogor">
+ <description>EZ Logo: Revised Edition (A-775 version 2.1) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-775" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Philip Bouchard" />
+ <info name="programmer" value="Judy Anderson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345295">
+ <rom name="ez logo revised edition v2.1 800k.woz" size="1345295" crc="a43cd883" sha1="ab689cf9660fe73e433c721f4d81a32a601737ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="f15streagr1" cloneof="f15streag">
+ <description>F-15 Strike Eagle (revision 1)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Address is 120 Lakefront Dr. Hunt Vally, MD 21030 (301) 677-1151 on title screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228140">
+ <rom name="f-15 strike eagle rev. 1.woz" size="228140" crc="6bd10cf9" sha1="22c0de0307c37394fd379dc733dea48da59f2bf7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="f15streagr2" cloneof="f15streag">
+ <description>F-15 Strike Eagle (revision 2)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Address is 10616 Beaver Dam Rd. Hunt Valley, MD 21030 (301) 677-1151 on title screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228124">
+ <rom name="f-15 strike eagle rev. 2.woz" size="228124" crc="c543277b" sha1="bba07bd0b523c47a7d317edebf23735bc5f71676" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="f15streagr3" cloneof="f15streag">
+ <description>F-15 Strike Eagle (revision 3)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <!-- Address is 120 Lakefront Dr. Hunt Vally, MD 21030 (301) 677-1151 on title screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="f-15 strike eagle rev. 3.woz" size="234796" crc="538a412d" sha1="7be13ce6f0501e38250346e078c504ca3f82f0ec" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="f15streag">
<description>F-15 Strike Eagle (version 1.4)</description>
<year>1985</year>
<publisher>Microprose Software</publisher>
- <info name="programmer" value="Sid Meier and Jim Synoski" />
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.4" />
+ <!-- Address is 120 Lakefront Dr. Hunt Vally, MD 21030 (301) 677-1151 on title screen. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--simulation game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="228179">
<rom name="f-15 strike eagle v1.4.woz" size="228179" crc="9dfd7e1d" sha1="784ff404399e282836ca53b6ce29e3467bd5a3fe" />
@@ -28038,15 +20391,81 @@ license:CC0-1.0
</part>
</software>
- <software name="falcons">
- <description>Falcons</description>
+ <software name="factopin">
+ <description>Fact or Opinion (version 10.15.87)</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.15.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="fact or opinion v10.15.87.woz" size="234781" crc="56bda795" sha1="0c48508050c9fc0bfea0b9f613621951b1c8fadf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factblast">
+ <description>Factor Blast</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Joe DeMuth" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="188192">
+ <rom name="factor blast.woz" size="188192" crc="3b6d8d88" sha1="fbe80cbffa03f7143a312fc26aaf6bd36322daa7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factfall">
+ <description>Facts and Fallacies (version 02.01.87) (800K 3.5")</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jim Parshall" />
+ <info name="programmer" value="Garnet Chappell" />
+ <info name="programmer" value="Mike Micklatcher" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 48K //e or ][+ with a compatible drive controller card." />
+ <info name="version" value="02.01.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Master disk" />
+ <dataarea name="flop" size="1296232">
+ <rom name="facts and fallacies 800k - disk 1 - master disk.woz" size="1296232" crc="e6a57696" sha1="a7d1169128008d3b74586720f302bec783f1f410" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Fact sheets" />
+ <dataarea name="flop" size="1296232">
+ <rom name="facts and fallacies 800k - disk 2 - fact sheets.woz" size="1296232" crc="563400e0" sha1="7d8412c3c162eebb84542c78e60a9464a5fb49c7" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Data disk" />
+ <dataarea name="flop" size="1276774">
+ <rom name="facts and fallacies 800k - disk 3 - data disk.woz" size="1276774" crc="2725075c" sha1="7f9e7983b37c8e301a43bad22900b221fad3fea5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="falconsps" cloneof="falcons">
+ <description>Falcons (Piccadilly Software)</description>
<year>1981</year>
<publisher>Piccadilly Software</publisher>
- <info name="programmer" value="Thomas Ball and Eric Varsanyi" />
+ <info name="programmer" value="Thomas Ball" />
+ <info name="programmer" value="Eric Varsanyi" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-09-19-->
- <!--action game-->
+ <!-- Dump released: 2018-09-19 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="146916">
<rom name="falcons.woz" size="146916" crc="cc93f644" sha1="7766debe7d678380aae96def6f14cedd6ff1683a" />
@@ -28054,15 +20473,91 @@ license:CC0-1.0
</part>
</software>
+ <software name="falcons">
+ <description>Falcons (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Piccadilly Software" />
+ <info name="programmer" value="Thomas Ball" />
+ <info name="programmer" value="Eric Varsanyi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="81657">
+ <rom name="falcons (softsmith).woz" size="81657" crc="b4d06549" sha1="3a8143705f745797ab2db18625452ebc64940695" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="famscien">
+ <description>Famous Scientists (version 01.30.87) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Paul Fleisher" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or //e or 48K ][+ with a compatible drive controller card." />
+ <info name="version" value="01.30.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296210">
+ <rom name="famous scientists 800k.woz" size="1296210" crc="2fc0210b" sha1="99009fb8f64502960d81fd11f194c8c9330d08b2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fantvisn">
+ <description>Fantavision</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Scott Anderson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <!-- Dump released: 2019-04-04. Redumped: 2025-01-25 with original source disk. Redumped 2025-03-01 To fix weakbits regions not being cleaned properly on protection track. -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="234787">
+ <rom name="fantavision side a - program.woz" size="234787" crc="7db53a92" sha1="d145531e59efa2e8f6d175529fae303461c41e86" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Demos" />
+ <dataarea name="flop" size="234785">
+ <rom name="fantavision side b - demos.woz" size="234785" crc="7cce0445" sha1="6b52e1aba539a5b071e206878907ff24c1e36293" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fatjack">
+ <description>Fat Jack</description>
+ <year>1985</year>
+ <publisher>The Learning Seed Company</publisher>
+ <info name="developer" value="SoftWorks and Graphics Alive" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234792">
+ <rom name="fat jack.woz" size="234792" crc="cabfd86a" sha1="bdddd5c82d42c1e809eccd7854b5fb96295c1ee2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="faywrd35">
<description>Fay: The Word Hunter (800K 3.5")</description>
<year>1991</year>
<publisher>Didatech Software</publisher>
- <info name="programmer" value="Dave Vincent and Allan Forsberg" />
+ <info name="programmer" value="Dave Vincent" />
+ <info name="programmer" value="Allan Forsberg" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-10-->
- <!--educational program-->
+ <!-- Dump released: 2022-09-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296174">
<rom name="fay- the word hunter 800k.woz" size="1296174" crc="27a0bb82" sha1="299e38511e1f809c28f377d755ebec1aaf747686" />
@@ -28070,15 +20565,765 @@ license:CC0-1.0
</part>
</software>
+ <software name="federat">
+ <description>Federation</description>
+ <year>1982</year>
+ <publisher>Avant-Garde Creations</publisher>
+ <info name="developer" value="Avant-Garde Creations" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-04 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241422">
+ <rom name="federation.woz" size="241422" crc="7548b07d" sha1="c345b0eb3f9b47a2a6eea29aa22e000c726579cd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="50miscru11" cloneof="50miscru">
+ <description>Fifty Mission Crush (version 1.1)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="alt_title" value="50 Mission Crush" />
+ <info name="programmer" value="John Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-04 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234803">
+ <rom name="50 mission crush v1.1.woz" size="234803" crc="8138c45e" sha1="387263b4c536c8e023afad5a9be7a69955a81fa0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="50miscru">
+ <description>Fifty Mission Crush (version 1.2)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="alt_title" value="50 Mission Crush" />
+ <info name="programmer" value="John Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-04 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234818">
+ <rom name="50 mission crush v1.2.woz" size="234818" crc="9c1161e5" sha1="0da45802be3fbd2f183374680b4537c01f4cde58" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fcommand">
+ <description>Fighter Command (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Charlie Merrow" />
+ <info name="programmer" value="Jack Avery" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-08-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234861">
+ <rom name="fighter command.woz" size="234861" crc="adb8468a" sha1="3c0d7b61f10de6a2f2c1cc137f98a917c6f23e2e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firsverb">
+ <description>First Verbs</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="first verbs.woz" size="234801" crc="e911ccba" sha1="9eedc88040ffe8cbe4e7f335d4b346d759983a38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firsword">
+ <description>First Words</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="first words.woz" size="234801" crc="03529300" sha1="eaca906ef08735febf277cd66687393ef40eb95b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firsword2">
+ <description>First Words II</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234804">
+ <rom name="first words ii.woz" size="234804" crc="f4a4ad5a" sha1="17fc0152098de7454a3ce5fc35229828ff081319" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firstwrprog">
+ <description>First-Start Writing Program</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234935">
+ <rom name="first-start writing program.woz" size="234935" crc="49f4632c" sha1="2b9f5a1a449f1a3b1349c0311c246c627c6f83bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fishscal40">
+ <description>Fish Scales (version 4.0)</description>
+ <year>1984</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Neosoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="4.0" />
+ <!-- HELLO program contains the comment: VER 4.0 2/3/85 -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234771">
+ <rom name="fish scales v4.0.woz" size="234771" crc="d570e377" sha1="77a4f59ac791b2f80707bd5135f35977f12f6003" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="followme">
+ <description>Follow Me</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Brenna Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234811">
+ <rom name="follow me.woz" size="234811" crc="7c82a348" sha1="0d71ffdaa82cc9624b684290a23ae0f15bdf0e41" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fdotcspr">
+ <description>Following Directions: One and Two-Level Commands - Spatial Relations</description>
+ <year>1986</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Eleanor Semel Ed.D." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234853">
+ <rom name="following directions - one and two level commands.woz" size="234853" crc="c56b8367" sha1="5a590292b6056cd1c1c308970aef77b0b214d5c2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fornext">
+ <description>FOR Your NEXT Adventure: FOR-NEXT Loops</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John Stimson" />
+ <info name="programmer" value="Robert C. Rosen" />
+ <info name="programmer" value="Ardyth Stimson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234855">
+ <rom name="for your next adventure.woz" size="234855" crc="67cfa17d" sha1="342c28e36a8d735b09d6be7e6e9e407254ba7283" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="forbcstl">
+ <description>Forbidden Castle</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Mercer Mayer"/>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234757">
+ <rom name="forbidden castle.woz" size="234757" crc="c6283c72" sha1="f6539f74138f9dc3bde42ec73cfb778db21e7a45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fore">
+ <description>Fore (Epyx)</description>
+ <year>1982</year>
+ <publisher>Epyx</publisher>
+ <info name="original_publisher" value="Automated Simulations" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-06 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234728">
+ <rom name="fore.woz" size="234728" crc="ef113e2e" sha1="f4ca8eb9aed7619034d3fce066d305b902ba840a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fortress">
+ <description>Fortress (revision 2)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jim Templeman" />
+ <info name="programmer" value="Patty Denbrook" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This has visible credits and additional comments in BASIC programs, suggesting a later revision. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234812">
+ <rom name="fortress.woz" size="234812" crc="b990ad13" sha1="57623ea61914c80bb5c1c8fdfed40fd68ce95589" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="4wordlft">
+ <description>FourWord &amp; WordLift</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="David E. Metzener" />
+ <info name="programmer" value="Martin Butherus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234831">
+ <rom name="fourword and wordlift.woz" size="234831" crc="bbdcae85" sha1="b8e921df86c65d961a0efc38135950e7c1f80e14" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fractmun_525" cloneof="fractmun">
+ <description>Fraction Munchers (A-196 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-196" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Paul Noennig" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234767">
+ <rom name="fraction munchers.woz" size="234767" crc="b9304e2e" sha1="31b7a5aa1c009f43734cb139680861372dc13bbf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fractmun">
+ <description>Fraction Munchers (A-196 version 1.0) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-196" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Paul Noennig" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345313">
+ <rom name="fraction munchers 800k.woz" size="1345313" crc="8bce93a6" sha1="bc25b9b3e88ad5483e8de6aaa1dd1d391148e18b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fracwprb">
+ <description>Fraction Word Problems</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234773">
+ <rom name="fraction word problems.woz" size="234773" crc="83918b50" sha1="8488deae946765d22195d2f3f81538494570a0fc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fractionss30">
+ <description>Fractions (version 3.0 04-10-82) (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Edu-Ware Services" />
+ <info name="programmer" value="John R. Conrad" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.0 04-10-82" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241419">
+ <rom name="fractions v3.0 (softsmith).woz" size="241419" crc="63ed063b" sha1="ca480bb68e83657d7127cf51fe8d8f93c17f0ab2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frctnoid">
+ <description>Fraction-oids (version 1989)</description>
+ <year>1989</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234765">
+ <rom name="fraction-oids.woz" size="234765" crc="8d7bd380" sha1="af65f15b22f8b54ff0740c9ae0320f0b10673839" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frlitzoo">
+ <description>Frames: A Reading Comprehension Series: Littletown Zoo (A-292 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-292" />
+ <info name="programmer" value="Eileen M. Nannen" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-19 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345372">
+ <rom name="littletown zoo 800k.woz" size="1345372" crc="b7939029" sha1="7630944d1c9822ce4d8e49c5c10e51162e7d666a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frspacesf_525" cloneof="frspacesf">
+ <description>Frames: A Reading Comprehension Series: Space Station Freedom (A-290 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-290" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234880">
+ <rom name="space station freedom v1.0 side a.woz" size="234880" crc="111e0a80" sha1="cbb7296917482de22f96625f2bfb47b5a681bfdc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234880">
+ <rom name="space station freedom v1.0 side b.woz" size="234880" crc="440e9416" sha1="53ae773b5920501b0e1dfaa68fd375e1155f43b2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frspacesf">
+ <description>Frames: A Reading Comprehension Series: Space Station Freedom (A-290 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-290" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345403">
+ <rom name="space station freedom 800k.woz" size="1345403" crc="dcaf7102" sha1="d1548f6e087c190c90e77faefb188a5ac7efce4a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frvacnat_525" cloneof="frvacnat">
+ <description>Frames: A Reading Comprehension Series: Vacation Nation Travel (A-291 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-291" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234862">
+ <rom name="vacation nation travel v1.0 side a.woz" size="234862" crc="7fd8b5e2" sha1="cb9d2830ef3f6d5137ba7fbb2d4b27d4ee07077e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234862">
+ <rom name="vacation nation travel v1.0 side b.woz" size="234862" crc="630aecc7" sha1="953ecdc580d7945c9222f0cbe8053a59fc821bb8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frvacnat">
+ <description>Frames: A Reading Comprehension Series: Vacation Nation Travel (A-291 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-291" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Mike Palmquist" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345361">
+ <rom name="vacation nation travel 800k.woz" size="1345361" crc="0e632b05" sha1="a5b3fd9c9722a04bdd5dea4e4ee778b602c93d0e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fredpzad">
+ <description>Freddy's Puzzling Adventures (revision D)</description>
+ <year>1984</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision D" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="freddy's puzzling adventures.woz" size="234798" crc="b3652802" sha1="b6b7efcc66ef623f9fa1be18536bf9c25430f804" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="freedom_525" cloneof="freedom">
+ <description>Freedom! (A-315 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-315" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="revision 1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235530">
+ <rom name="mecc-a315 freedom v1.0 side a.woz" size="235530" crc="cc037101" sha1="84efd7438e3cf9db9464471ead746f18a2b1413e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235530">
+ <rom name="mecc-a315 freedom v1.0 side b.woz" size="235530" crc="30903ce8" sha1="afe40e67a58444bb0e91af2fb4bf375533ee491a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="freedom">
+ <description>Freedom! (A-315 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-315" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="revision 1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296746">
+ <rom name="freedom 800k.woz" size="1296746" crc="a30d1a86" sha1="1ddc5b2d74a92a74598d1ffbaee5ff4a10b8cd82" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frnzflfl">
+ <description>Frenzy &amp; Flip Flop</description>
+ <year>1981</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - 13-sector" />
+ <feature name="sl6_default" value="diskiing13" />
+ <dataarea name="flop" size="234796">
+ <rom name="frenzy and flip flop side a - 13-sector version.woz" size="234796" crc="80ef3ae7" sha1="e4b2a6eead4918092d4e2904d5d78dac3b7f3e2b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - 16-sector" />
+ <feature name="sl6_default" value="diskiing" />
+ <dataarea name="flop" size="234796">
+ <rom name="frenzy and flip flop side b - 16-sector version.woz" size="234796" crc="4726a5d2" sha1="82dd884732104e61f369c5277426b1362a3f4745" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frndolvr">
+ <description>Friends or Lovers (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Alpine Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234766">
+ <rom name="friends or lovers (softsmith).woz" size="234766" crc="875ae2db" sha1="d3768629b746d7cb1e66a574f12af0e9a0670bc8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fjordnum">
+ <description>Frog Jump: Ordering Numbers</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Scott, Foresman and Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-12 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234772">
+ <rom name="frog jump- ordering numbers.woz" size="234772" crc="4d5eef72" sha1="6fa1a3278180e2742d2156870b1248b571bcaf3e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frogger">
+ <description>Frogger (Sierra On-Line)</description>
+ <year>1981</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="original_publisher" value="On-Line Systems" />
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-13 -->
+ <!-- The first release refused to boot on anything but an original Apple ][ or ][ Plus (i.e. not //e or later). This is the updated release. -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="260154">
+ <rom name="frogger.woz" size="260154" crc="a6529172" sha1="583e0cccc428fec0ddfba2f781c1fa42804323f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhbchord">
+ <description>Functional Harmony: Basic Chords</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="functional harmony- basic chords.woz" size="234798" crc="d0dbcb15" sha1="9d54e467e1f1515afcf3302abdadc530eb20cdc7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhboachr">
+ <description>Functional Harmony: Borrowed and Altered Chords</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="functional harmony- borrowed and altered chords.woz" size="234813" crc="529ced2d" sha1="1bed28684f7a637a635c7b06a5c75572cb5b3cff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhdia7th">
+ <description>Functional Harmony: Diatonic Seventh Chords</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234809">
+ <rom name="functional harmony- diatonic seventh chords.woz" size="234809" crc="eb7e28d7" sha1="1e4976e057dfa550524cfb9230e89ffd3b74b9db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fhsecdom">
+ <description>Functional Harmony: Secondary Dominants</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234805">
+ <rom name="functional harmony- secondary dominants.woz" size="234805" crc="a721abdf" sha1="e07a68c26985d0acf3fd023f4a2ff41a84502a25" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gijoe">
+ <description>G.I. Joe</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Jeff Johannigman" />
+ <info name="programmer" value="Ray Carpenter" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-13 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233527">
+ <rom name="g. i. joe side a.woz" size="233527" crc="a7feb3c1" sha1="74ffc0d32ff1d294b91b7ffb24216b64a3eef6e8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233527">
+ <rom name="g. i. joe side b.woz" size="233527" crc="7e547fa1" sha1="12f251af41708fa349c1d022c4007fac54dd610a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galattk">
+ <description>Galactic Attack</description>
+ <year>1980</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-14 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234790">
+ <rom name="galactic attack.woz" size="234790" crc="013efc71" sha1="68975194ff1b597ed4e2773649bb8880d050a1cd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="galglad">
<description>Galactic Gladiators</description>
<year>1983</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="programmer" value="Tom Reamy" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-08-13-->
- <!--strategy game-->
+ <!-- Dump released: 2023-08-13 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="248109">
<rom name="galactic gladiators.woz" size="248109" crc="7a02de18" sha1="fee58acf94349ec923764e5730d921c0b7457fe1" />
@@ -28086,6 +21331,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="galaxiana">
+ <description>Galaxian (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="54998">
+ <rom name="galaxian.woz" size="54998" crc="61606bd9" sha1="8bbed60f861e6fd1c2a83ed988a58a172bf06a70" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gameotus">
+ <description>Game of the U.S. (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Cecil Andrews" />
+ <info name="programmer" value="Michael Andrews" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="75035">
+ <rom name="game of the u.s. (softsmith).woz" size="75035" crc="d071723e" sha1="4c8105586adeb7e9a98e0d34f0efa49734f957fa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="garftrv">
<description>Garfield Trivia Game</description>
<year>1989</year>
@@ -28093,8 +21370,8 @@ license:CC0-1.0
<info name="developer" value="EIS" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-02-06-->
- <!--educational game-->
+ <!-- Dump released: 2020-02-06 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241463">
<rom name="garfield trivia game.woz" size="241463" crc="dfb2a731" sha1="7def8dbddb0149d4c74fc5c6a9c53f6db26d9232" />
@@ -28102,15 +21379,102 @@ license:CC0-1.0
</part>
</software>
+ <software name="gauntlet">
+ <description>Gauntlet</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Atari Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-19 -->
+ <!-- This was released with several different copy protections; this version was protected with the E7 bitstream. Game code and data is identical to other protected variants. -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235440">
+ <rom name="gauntlet side a.woz" size="235440" crc="adcde10f" sha1="ac3bf5d9d37e76d286188a35dbcbfbf4b4977640" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235440">
+ <rom name="gauntlet side b.woz" size="235440" crc="2a6a240f" sha1="6279fc79ce45a7df2d506a8c47223c506f725c2d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gears">
+ <description>Gears</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="David Donoghue" />
+ <info name="programmer" value="Bob Kimball" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="gears.woz" size="234800" crc="8cd3cfc1" sha1="184d0e74d8fe357706d5d6a995557f1d960b1810" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gemsthl">
+ <description>Gemstone Healer (version 1.2)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Peter Lount" />
+ <info name="programmer" value="Trouba Gossen" />
+ <info name="programmer" value="Kevin Pickell" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-19 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234826">
+ <rom name="gemstone healer v1.2 side a.woz" size="234826" crc="e8812105" sha1="33ce745ec584cf5d3969519d188eeaa649f7428e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234826">
+ <rom name="gemstone healer v1.2 side b.woz" size="234826" crc="80116114" sha1="59064735ffaae9b5f566556f1d4199d36285fb54" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gemstwar">
+ <description>Gemstone Warrior (version 1.1)</description>
+ <year>1984</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Paradign Creators" />
+ <info name="programmer" value="Peter W. V. Lount" />
+ <info name="programmer" value="Trouba Gossen" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234809">
+ <rom name="gemstone warrior v1.1.woz" size="234809" crc="c260c2a2" sha1="c3e3975a95a03c5bbfca6c562291f7fce5d91bab" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="genesis">
<description>Genesis</description>
<year>1983</year>
<publisher>Datasoft</publisher>
- <info name="programmer" value="Kevin Furry and Whitney Caughlan" />
+ <info name="programmer" value="Kevin Furry" />
+ <info name="programmer" value="Whitney Caughlan" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-09-16-->
- <!--action game-->
+ <!-- Dump released: 2021-09-16 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="88367">
<rom name="genesis.woz" size="88367" crc="21107442" sha1="f3061301b932789a3fbba20f9184fa41527694d6" />
@@ -28118,6 +21482,532 @@ license:CC0-1.0
</part>
</software>
+ <software name="gendrift" supported="no">
+ <description>Genetic Drift</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Scott Schram" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to compatibility issues caused by the copy protection, it will not run on any later models." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2018-10-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="120320">
+ <rom name="genetic drift.woz" size="120320" crc="4b3c4403" sha1="c03c14268f780dc10200913958c566c0d0745e4d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="geoart">
+ <description>GeoArt</description>
+ <year>1986</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234802">
+ <rom name="geoart.woz" size="234802" crc="5861eb64" sha1="601d291ef689dc946835b02000fbd210ab898d89" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="geomconc">
+ <description>Geometry Concepts (version 2.1)</description>
+ <year>1988</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="geometry concepts v2.1.woz" size="234821" crc="a42575b0" sha1="72990b5ccfb035f0bbcd53a942e74ab7438b7d92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="germ1985v1" cloneof="germ1985">
+ <description>Germany 1985 (version 1.0)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-11 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241449">
+ <rom name="germany 1985 v1.0.woz" size="241449" crc="2acc04cf" sha1="8d7d04585271fd95ea98143605d7a2c6f1b7d5c2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="germ1985">
+ <description>Germany 1985 (version 2.0)</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="version 2.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-29 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="germany 1985 v2.0.woz" size="234775" crc="85a4ff9d" sha1="daf67f5de2cce689f9692b3d92c5e80dc6668a12" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertpuzz10" cloneof="gertpuzz">
+ <description>Gertrude's Puzzles (version 1.0)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16. Dump updated: 2025-08-10 to fix version number. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234845">
+ <rom name="gertrude's puzzles.woz" size="234845" crc="88b08601" sha1="33cf536fad4646ede13d47e2e848058f57e3c630" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertpuzz11" cloneof="gertpuzz">
+ <description>Gertrude's Puzzles (version 1.1)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16. Dump updated: 2025-08-10 to fix version number. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="108349">
+ <rom name="gertrude's puzzles v1.1.woz" size="108349" crc="fe45ae34" sha1="1ae7b8d91b7b429abaf4941a13f6d2de22709f11" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertpuzz">
+ <description>Gertrude's Puzzles (version 1.2)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121661">
+ <rom name="gertrude's puzzles v1.2.woz" size="121661" crc="62ca4b3c" sha1="65a398df63f6a222e2f71d0e530e33b1d94b64b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec10" cloneof="gertsec">
+ <description>Gertrude's Secrets (version 1.0)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16. Dump updated: 2025-08-10 to fix version number. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234813">
+ <rom name="gertrude's secrets v1.0.woz" size="234813" crc="c9a3661a" sha1="e69c238e207e7401b3a3ac8aff5333a600286deb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec11" cloneof="gertsec">
+ <description>Gertrude's Secrets (version 1.1)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16. Dump updated: 2025-08-10 to fix version number. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="108349">
+ <rom name="gertrude's secrets v1.1.woz" size="108349" crc="b155f65b" sha1="7fd687b6c8b9c943eef1e8525d8b9f1250714cfe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec12" cloneof="gertsec">
+ <description>Gertrude's Secrets (version 1.2)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="128335">
+ <rom name="gertrude's secrets v1.2.woz" size="128335" crc="a0caac53" sha1="f6874999ee5b9bc2a7c45571b9811d66104b4e4f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gertsec">
+ <description>Gertrude's Secrets (version 1.3)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="gertrude's secrets v1.3.woz" size="234813" crc="574fa90b" sha1="91f3c418a280c33835846fed8c74b3793b16e75e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gerunds">
+ <description>Gerunds (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234759">
+ <rom name="gerunds 1988.woz" size="234759" crc="db1fc122" sha1="3e8bff43b493cbdb75c8a5f592df64bfebdd43af" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="getreadadd">
+ <description>Getting Ready to Read and Add</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="developer" value="Softcole" />
+ <info name="programmer" value="Marjorie Cole" />
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234713">
+ <rom name="getting ready to read and add.woz" size="234713" crc="18134755" sha1="190a7727e04b2ccb8fbf9e6884edecf9929185ae" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gtysburg">
+ <description>Gettysburg: The Turning Point (version 1.2)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="David Landrey" />
+ <info name="programmer" value="Chuck Kroegel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-03 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234818">
+ <rom name="gettysburg- the turning point v1.2 side a.woz" size="234818" crc="cce30de8" sha1="83ef10b30dc2eea1f47f9c6e5d0da555a7d97bef" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234818">
+ <rom name="gettysburg- the turning point v1.2 side b.woz" size="234818" crc="87dee9e8" sha1="bdc23502c510695d46cfecc730e28928fc02bea4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ghostwr">
+ <description>Ghost Writer (A-156 version 1.0)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-156" />
+ <info name="programmer" value="Robert Bortnick, Ph.D." />
+ <info name="programmer" value="Thomas R. Lundeen" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="ghost writer v1.0.woz" size="234836" crc="5b99ad15" sha1="a25ea6ff9d2081a508587c5e28497e0edbc8ba33" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gohayden">
+ <description>Go (Hayden Book Company)</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Stan Erwin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-20 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="go.woz" size="234775" crc="aa3a005d" sha1="d96d7d67c1a2f664735f412c25229b91306cd5bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gobbler">
+ <description>Gobbler</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="253442">
+ <rom name="gobbler.woz" size="253442" crc="f9a9a3ed" sha1="8cb6dfa9db96d1270ae0ace9a1dd9ac7438c7fbb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="goldrush">
+ <description>Gold Rush! (version 1.0M)</description>
+ <year>1989</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ken MacNeill" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Ken MacNeill" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Anita Scott" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0M" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 1a.woz" size="234823" crc="353becc5" sha1="4017229d3201a124fd6e3279e5636a22f1db2ed4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 1b.woz" size="234823" crc="65579b17" sha1="719361e313bdbec9750d905cc9e6df1fcd0b4309" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 2a.woz" size="234823" crc="402a1809" sha1="e7bfc6707a0dc06a3a056e65ff97e98ba5c832f6" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 2b.woz" size="234823" crc="00c89187" sha1="851bd9fba6b918fa53db274f02325d8e3940609b" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 3a.woz" size="234823" crc="b1f9a9cf" sha1="a3c335e3dcdcaa46a0a98f709f64fbdef4cfaf0b" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 3b.woz" size="234823" crc="846d5ff7" sha1="11d4faa4492c0bb7fe6bc444b4ff7426aec449c3" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 4a.woz" size="234823" crc="aa7a4cd6" sha1="c6487a07ca5841aafcaa3674dfe3a7e695b66fc3" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 4b.woz" size="234823" crc="98a27bfc" sha1="bb7bb6bcf6fd0e25007ebd179c2cc9f8b321d4b7" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 5a.woz" size="234823" crc="52f1b57d" sha1="70a2741ef18489ccb8b9e219e9d7a2092a7ab02d" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 5b.woz" size="234823" crc="5c286071" sha1="fbfa17119806934af718514aa6622861c2d7b16c" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 6a.woz" size="234823" crc="3308207f" sha1="41aff7efcf1775f675ada82eccb89fe7fc19e981" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 6b.woz" size="234823" crc="51bd3df5" sha1="124f7cba9bef89e63674209ff44f30207f405ade" />
+ </dataarea>
+ </part>
+ <part name="flop13" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 7a.woz" size="234823" crc="ba529141" sha1="eaadffc83064fc9f709f79fbb47a63569b96e8d1" />
+ </dataarea>
+ </part>
+ <part name="flop14" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 7b.woz" size="234823" crc="a985bb4d" sha1="c10dbcc84e67fccd627a17a0e7a1f86a38463162" />
+ </dataarea>
+ </part>
+ <part name="flop15" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 8a.woz" size="234823" crc="0d6cd2e5" sha1="5fd0a83ea530e010a34353f3a663887aa16c3964" />
+ </dataarea>
+ </part>
+ <part name="flop16" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush disk 8b.woz" size="234823" crc="9894e285" sha1="63a441f0bee1b130b7883e2bbfc20882884c40ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="goldmntn">
+ <description>Golden Mountain</description>
+ <year>1980</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="StarCraft" />
+ <info name="programmer" value="M. Tomita" />
+ <info name="programmer" value="Shigeya Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, //e or IIgs. It will not run on an Apple //c." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2GS" />
+ <!-- Dump released: 2019-02-24 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="75006">
+ <rom name="golden mountain.woz" size="75006" crc="235d837b" sha1="123830597000b8895d480b872e0fae4fbbd008f0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="golfccbar">
+ <description>Golf Classic &amp; Compubar</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - 13-sector" />
+ <feature name="sl6_default" value="diskiing13" />
+ <dataarea name="flop" size="234801">
+ <rom name="golf classic and compubar side a - 13-sector version.woz" size="234801" crc="f5da8ccd" sha1="2d2569e51ca3c2920dba755b5e5f5f0a1fb426a1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - 16-sector" />
+ <feature name="sl6_default" value="diskiing" />
+ <dataarea name="flop" size="234801">
+ <rom name="golf classic and compubar side b - 16-sector version.woz" size="234801" crc="292c2f72" sha1="b51bfd7194ffbdba1b768d46f36fdabe91086788" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gramgrem">
+ <description>Grammar Gremlins (version 05.01.87) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or an Apple //e or 64K Apple ][+ and a compatible drive controller card." />
+ <info name="version" value="05.01.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-25. Redumped: 2021-12-14 to fix incorrect header information -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296190">
+ <rom name="grammar gremlins 800k.woz" size="1296190" crc="c7a3fa58" sha1="51c2184e0995f880ed7fa272224deb75959ae570" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grmrmch1">
+ <description>Grammar Mechanics Level 1</description>
+ <year>1988</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234778">
+ <rom name="grammar mechanics level 1 side a.woz" size="234778" crc="6e402d55" sha1="6e47172b67b6162a0ca36641578ed504b89540bc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234778">
+ <rom name="grammar mechanics level 1 side b.woz" size="234778" crc="011ffed6" sha1="5dfe123f3ec905557d0469dfc91813a02f29fa6a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="grbblsadjadv">
<description>Grammar: Building Better Language Skills: Adjectives and Adverbs</description>
<year>1991</year>
@@ -28125,8 +22015,9 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- 4am released a duplicate on 1/14/2024 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234821">
<rom name="building better language skills- adjectives and adverbs.woz" size="234821" crc="80941ab0" sha1="ec0fc4c98bb98c750c7089a6834e545b18e8a2ec" />
@@ -28141,8 +22032,9 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- 4am released a duplicate on 1/14/2024 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234804">
<rom name="building better language skills- nouns.woz" size="234804" crc="9794170b" sha1="28c6dcfcc73b7ba06c8dad17ec0c0d42442e1862" />
@@ -28150,6 +22042,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="grbblssent">
+ <description>Grammar: Building Better Language Skills: Sentences</description>
+ <year>1991</year>
+ <publisher>Micrograms Publishing</publisher>
+ <info name="developer" value="Micrograms Publishing" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234737">
+ <rom name="grammar - sentences.woz" size="234737" crc="be8fc8f3" sha1="4659b993984fe07202c51fe415b1cd895ac50d0e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grbblsverb">
+ <description>Grammar: Building Better Language Skills: Verbs</description>
+ <year>1991</year>
+ <publisher>Micrograms Publishing</publisher>
+ <info name="developer" value="Micrograms Publishing" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234733">
+ <rom name="grammar - verbs.woz" size="234733" crc="4a6d49ea" sha1="f95b4e6b9e2ad7686b4a58b8a0c5bcb8a62467c7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="grancook">
<description>Granny Applebee's Cookie Factory</description>
<year>1993</year>
@@ -28157,8 +22081,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234788">
<rom name="granny applebee's cookie factory.woz" size="234788" crc="f1349cbb" sha1="57c0b3a9ce886f22c834310195d769c110678cac" />
@@ -28166,6 +22090,25 @@ license:CC0-1.0
</part>
</software>
+ <software name="graphmkr">
+ <description>Graph Maker: Introduction to Graphs and Charts</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234855">
+ <rom name="graph maker- introduction to graphs and charts.woz" size="234855" crc="5903ea17" sha1="5c38eb87ebd336dab53ed7e0f7aa305d49508baa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="graphing10">
<description>Graphing (A-817 version 1.0)</description>
<year>1983</year>
@@ -28174,8 +22117,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-16-->
- <!--education program-->
+ <!-- Dump released: 2023-06-16 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234783">
<rom name="graphing v1.0.woz" size="234783" crc="033da642" sha1="e341f55b4f33cf4e6c781814fd3dcabbfa94f3c7" />
@@ -28183,15 +22126,239 @@ license:CC0-1.0
</part>
</software>
+ <software name="grglobge">
+ <description>Green Globs and Graphing Equations</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Sharon Dugdale" />
+ <info name="programmer" value="David Kibbey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234834">
+ <rom name="green globs and graphing equations.woz" size="234834" crc="1ad7bc19" sha1="e27ca259bb83d91853d2f0e136f5de735e8b5d28" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gremlins">
+ <description>Gremlins (Atarisoft)</description>
+ <year>1984</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-10 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="113621">
+ <rom name="gremlins.woz" size="113621" crc="c873f47a" sha1="5e71bf3e881e31a47162ef9bfafa9a1759cb5c2f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="growginfr10">
+ <description>Growgins' Fractions (A-773 version 1.0)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-773" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Mike Boucher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-16 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="growgins' fractions v1.0.woz" size="234794" crc="623ddf82" sha1="6f956b5df17b37c671bae774af18684326828df9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guardianc" cloneof="guardian">
+ <description>Guardian (Continental Software)</description>
+ <year>1982</year>
+ <publisher>Continental Software</publisher>
+ <info name="programmer" value="Tom and Jerry" />
+ <info name="usage" value="Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-10-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121637">
+ <rom name="guardian.woz" size="121637" crc="38f8a3f7" sha1="a942d01dbf2bcbf48ca937291fb373b78e873e43" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guardian">
+ <description>Guardian (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Continental Software" />
+ <info name="programmer" value="Tom and Jerry" />
+ <info name="usage" value="Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14. Redumped: 2025-04-08 -->
+ <!-- action game -->
+ <!-- rom appears to be too small and probably needs a redump. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="55038">
+ <rom name="guardian (softsmith).woz" size="55038" crc="77e204fb" sha1="29e8735d031f61c6da64901284627ec636b1b35a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guitarwiz11601" cloneof="guitarwiz">
+ <description>Guitar Wizard (version 11601)</description>
+ <year>1986</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="partno" value="11601" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="11601" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-04-07 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234787">
+ <rom name="guitar wizard v11601.woz" size="234787" crc="96c08944" sha1="72fd16fac2ecee869385ab09cbbe85d79f3530e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guitarwiz">
+ <description>Guitar Wizard (version 11611)</description>
+ <year>1986</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="partno" value="11611" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="11611" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-25 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234787">
+ <rom name="guitar wizard v11611.woz" size="234787" crc="8f6cf10f" sha1="ddacac3c10065b218a18c3ec11a4d5ffa6260b22" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gulparrg">
+ <description>Gulp!! &amp; Arrow Graphics</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - 13-sector" />
+ <feature name="sl6_default" value="diskiing13" />
+ <dataarea name="flop" size="234783">
+ <rom name="gulp and arrow graphics side a - 13-sector version.woz" size="234783" crc="8a3e0f5e" sha1="8c5a3a04e72dbbd847777e093c1753d52bae0cde" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - 16-sector" />
+ <feature name="sl6_default" value="diskiing" />
+ <dataarea name="flop" size="234801">
+ <rom name="gulp and arrow graphics side b - 16-sector version.woz" size="234801" crc="22a18274" sha1="e5bdf7279cb7fc947be33b73ba0dcaa68cb23c89" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gulpfrnz">
+ <description>Gulp!! &amp; Frenzy</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234759">
+ <rom name="gulp and frenzy.woz" size="234759" crc="a40251ac" sha1="6fb6870c224d29c954c9d91f1eaec43204539a5c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gumball">
+ <description>Gumball</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Veda Hlubinka-Cook credited as Robert Cook" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233497">
+ <rom name="gumball.woz" size="233497" crc="f49249e5" sha1="a13b691bdba9ce006aabb46e799009d44a9591cc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hallsmzm">
+ <description>Halls of Montezuma (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="programmer" value="Andrew C. Taubman" />
+ <info name="programmer" value="Malcolm Power" />
+ <info name="programmer" value="Gregor Whiley" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235618">
+ <rom name="halls of montezuma side a - master disk.woz" size="235618" crc="f865f618" sha1="938ce204ad17633eb0deb605dfb2706a35e7449a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235625">
+ <rom name="halls of montezuma side b - scenario disk.woz" size="235625" crc="87f2a672" sha1="8599ce6465b1cd2c2415994701ae9b86e3116626" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="handmath1">
+ <description>Hands-On Math! Volume I (version 2.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-31 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296178">
+ <rom name="hands-on math volume 1 800k.woz" size="1296178" crc="100c9d29" sha1="7d73389edc6dc343c6ade6b6f9774780e8b4cc31" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hardhatm">
<description>Hard Hat Mack</description>
<year>1983</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Michael Abbot and Matthew Alexander" />
+ <info name="programmer" value="Michael Abbot" />
+ <info name="programmer" value="Matthew Alexander" />
<info name="usage" value="Requires an Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-07-25-->
- <!--action game-->
+ <!-- Dump released: 2018-07-25 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="226887">
<rom name="hard hat mack.woz" size="226887" crc="82a26a65" sha1="7fe8fa5f6c0a303221f6f6c4fd542feaec2c84e3" />
@@ -28199,15 +22366,331 @@ license:CC0-1.0
</part>
</software>
+ <software name="harvprim">
+ <description>Harvey by Primes</description>
+ <year>1984</year>
+ <publisher>Queue</publisher>
+ <info name="programmer" value="Scott Rackey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241414">
+ <rom name="harvey by primes.woz" size="241414" crc="cb7c9ea8" sha1="e1b62bd0dc4f255d190905b1816b7b191f49f07e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpdesascin">
+ <description>Hear Today... Play Tomorrow: Descending/Ascending Intervals</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234797">
+ <rom name="descending-ascending intervals.woz" size="234797" crc="2298adbb" sha1="dad9a4f43a4461e56c1bbaadf71732c22497dd01" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpeartrsk">
+ <description>Hear Today... Play Tomorrow: Ear Training Skills</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="ear training skills.woz" size="234786" crc="8dd0fb60" sha1="cb54739dcbfdcd435204054ecc72080ae8ca1afa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpfdtune">
+ <description>Hear Today... Play Tomorrow: Find That Tune</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="find that tune.woz" size="234781" crc="4fd9f6e5" sha1="902846d1c423454a8b2ed754b67d744773233f7d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpmdbegl">
+ <description>Hear Today... Play Tomorrow: Melodic Dictation Beginning Level</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="melodic dictation- beginning level.woz" size="234801" crc="88434aee" sha1="357b812ebf0ca093fe29c71416d4da643b689a00" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hpmdintl">
+ <description>Hear Today... Play Tomorrow: Melodic Dictation Intermediate Level</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Penny Pursell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234804">
+ <rom name="melodic dictation- intermediate level.woz" size="234804" crc="f8981245" sha1="16bf0b8ce4faba77294da49db11ff3cfba867ac6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="highrise">
+ <description>High Rise</description>
+ <year>1983</year>
+ <publisher>Micro Learn</publisher>
+ <info name="programmer" value="Joe Calabrese" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-29 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="133632">
+ <rom name="high rise.woz" size="133632" crc="20539152" sha1="5bfec6ed2ce708428dcf47baa693c1985d744a3d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hwirelgc">
+ <description>High Wire Logic (version 1990)</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234806">
+ <rom name="high wire logic.woz" size="234806" crc="eb1b630b" sha1="bfef94db777d96e970d3dce8bfd37daf14b5bcd9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra0mast">
+ <description>Hi-Res Adventure #0: Mission: Asteroid</description>
+ <year>1980</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235519">
+ <rom name="mission asteroid.woz" size="235519" crc="2553d240" sha1="8476b22d74a18f40836d17276c9b7ebbf45567b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra3cman">
+ <description>Hi-Res Adventure #3: Cranston Manor</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Harold DeWitz" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234780">
+ <rom name="cranston manor.woz" size="234780" crc="2ec631b9" sha1="029ec6088d47359df246b1cc994966b1106883e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra4ulygf10">
+ <description>Hi-Res Adventure #4: Ulysses and the Golden Fleece (version 1.0)</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Bob Davis" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="242146">
+ <rom name="ulysses and the golden fleece side a.woz" size="242146" crc="21d6194d" sha1="86ef1ae8cbeb738c9167adefbbc87a85ed5f7615" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235510">
+ <rom name="ulysses and the golden fleece side b.woz" size="235510" crc="7168c183" sha1="e5b2b512c68a98ee4d436acaeaab33aa4e5798b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra5timez">
+ <description>Hi-Res Adventure #5: Time Zone (version 1.1)</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Bob Davis" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Terry Pierce" />
+ <info name="programmer" value="Michelle Pritchard" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk a.woz" size="234882" crc="9dd9bcbb" sha1="18ad98f30f49af2fa9f9cae99ad77b4709f21ac4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk b.woz" size="234882" crc="b0e640d9" sha1="f568d25a10a624937b5c0a7f5a7d285e9706e214" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk c.woz" size="234882" crc="f1bc7998" sha1="875c3c74236477c2aefad415b2906490b6c5b134" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk d.woz" size="234882" crc="fe0c102d" sha1="f7cbca00e759c4395baabbcd3b142d487d4785c1" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk E" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk e.woz" size="234882" crc="30bc6bde" sha1="12f1badcaddf514ea2ad8adc91134f8a17996122" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk F" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk f.woz" size="234882" crc="93963177" sha1="fb4fabaa5ef5f2d2530682ac4a4ddec64b1b2824" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk G" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk g.woz" size="234882" crc="3ee201e6" sha1="97006b422e543c845e46c5e85a1f65758c2c146c" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk H" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk h.woz" size="234882" crc="efba5ced" sha1="6399284ba922097e794731a70babbd5d91b864bb" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk I" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk i.woz" size="234882" crc="57ca6357" sha1="ca7f12495f0c014a6a8395fb36c82ee9f372c0dc" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk J" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk j.woz" size="234882" crc="afb5b9d2" sha1="b5323943e5f04f7e773a26a593fdd5697b58ac29" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk K" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk k.woz" size="234882" crc="ae166b20" sha1="2901bb34acd69e8c2bceddaa3141b6d7f09403e7" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk L" />
+ <dataarea name="flop" size="234882">
+ <rom name="time zone v1.1 disk l.woz" size="234882" crc="e5521794" sha1="7eb9d72811f682c06cb087ad195900930197746d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hra6darkc">
+ <description>Hi-Res Adventure #6: The Dark Crystal</description>
+ <year>1982</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="235514">
+ <rom name="the dark crystal disk 1a.woz" size="235514" crc="0567c1fa" sha1="12546079b3bec0aafad004b9890972ddf16f1e22" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="235514">
+ <rom name="the dark crystal disk 1b.woz" size="235514" crc="73b14838" sha1="29b99a7d2cf1af3ee4a2db6e9c2689e040f0c15d" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="235514">
+ <rom name="the dark crystal disk 2a.woz" size="235514" crc="82072c10" sha1="772a2e802e7cb610161a7be95053d920677a2cba" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="235514">
+ <rom name="the dark crystal disk 2b.woz" size="235514" crc="f423959a" sha1="7381235bbe1dccf36ff682257ae6f0e6d82fba25" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hresfbal">
<description>Hi-Res Football</description>
<year>1980</year>
<publisher>On-Line Systems</publisher>
- <info name="programmer" value="Jay Sullivan and Ken Williams" />
+ <info name="programmer" value="Jay Sullivan" />
+ <info name="programmer" value="Ken Williams" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--sports game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="68405">
<rom name="hi-res football.woz" size="68405" crc="5eee5ba3" sha1="d46fb8bb288c177c09ed11bf6811532f8dcede44" />
@@ -28215,15 +22698,183 @@ license:CC0-1.0
</part>
</software>
+ <software name="hmsimpet">
+ <description>His Majesty's Ship "Impetuous"</description>
+ <year>1980</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Robert Lafore" />
+ <info name="developer" value="The Marin Computer Center" />
+ <info name="programmer" value="David Fox" />
+ <info name="programmer" value="Corey Kosak" />
+ <info name="usage" value="Requires a 13-sector floppy drive and a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2022-02-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234845">
+ <rom name="his majesty's ship impetuous.woz" size="234845" crc="8046c6ea" sha1="9dc5c43860e88c74704e67858ee2a7d185ef27ea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="histmake_525" cloneof="histmake">
+ <description>History Makers (A-313 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-313" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Ju-Chang wang" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234883">
+ <rom name="history makers.woz" size="234883" crc="29272c2b" sha1="3ef56658f78389d3d5ea4b1c4625a5d778b0ed1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="histmake">
+ <description>History Makers (A-313 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-313" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Ju-Chang wang" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296277">
+ <rom name="history makers 800k.woz" size="1296277" crc="7d02216a" sha1="83057b57e637c05410ba4aebbb9de651ad9bfe92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homonyms">
+ <description>Homonyms (version 01.19.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.19.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234798">
+ <rom name="homonyms v01.19.89 disk 1.woz" size="234798" crc="7c6bbed1" sha1="c6e47c3f94e5e12740ef086a1ea5de45331f3b55" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234798">
+ <rom name="homonyms v01.19.89 disk 2.woz" size="234798" crc="7be2e24c" sha1="8ace92fdfdd6f9a4ee6abe5b6098760159850f10" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hop2it">
+ <description>Hop To It!</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Ed Annunziata" />
+ <info name="programmer" value="Stephen Birkelbach" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234838">
+ <rom name="hop to it.woz" size="234838" crc="140ea2d3" sha1="e4b9e96856323dfee670c78e5b2a4b354496d2dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="horses">
+ <description>Horses</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234736">
+ <rom name="horses.woz" size="234736" crc="40cc52e7" sha1="afc59d569bc30ca26aece790ab9a551cfef0a568" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="howwest">
+ <description>How The West Was One + Three x Four</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Pat Sine" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-26 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235513">
+ <rom name="how the west was one + three x four.woz" size="235513" crc="d9222021" sha1="101db6d0c3f8ccd627522abc353e7e79a57204db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hw2rsrch">
+ <description>How To Do Research</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="how to do research.woz" size="234769" crc="eb2c8d21" sha1="8397aae2c4cf1b1c0d38dad72e4c66230e759a49" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="h2weleph">
+ <description>How to Weigh an Elephant</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="developer" value="Educational Technologies" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234743">
+ <rom name="how to weigh an elephant.woz" size="234743" crc="a33e83bc" sha1="5217dee239a9127a93662013b2611d96751d743a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hhlngvwl">
<description>Hugo Hound's Vowel Sounds: Long Vowels</description>
<year>1993</year>
<publisher>Micrograms Publishing</publisher>
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--May be missing disk 2 - "Short Vowels" based on manual.-->
- <!--education program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- May be missing disk 2 - "Short Vowels" based on manual. -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234802">
<rom name="hugo hound's vowel sounds- long vowels.woz" size="234802" crc="780ba877" sha1="3167aa6f35b598cf400a07d6d6722e284f2efcf8" />
@@ -28231,18 +22882,121 @@ license:CC0-1.0
</part>
</software>
+ <software name="hyprhdon">
+ <description>Hyper Head On</description>
+ <year>1980</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="StarCraft" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="109826">
+ <rom name="hyper head on.woz" size="109826" crc="5c2dc661" sha1="9311e84c066de35bc695ba8bfb750ad7aaf3546f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="idamiano">
+ <description>I, Damiano</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="programmer" value="Mark D. Klein" />
+ <info name="programmer" value="Peter A. Golden" />
+ <info name="programmer" value="Michael J. Becker" />
+ <info name="programmer" value="Steve DeFrisco" />
+ <info name="programmer" value="Wilfredo Aguilar" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235569">
+ <rom name="i, damiano side a.woz" size="235569" crc="1f262c40" sha1="ea5a0fb44124bb89a0f7e6502a136dd24c5d30a0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235589">
+ <rom name="i, damiano side b.woz" size="235589" crc="a8634aba" sha1="70870265ac476bece35fc5bb2415ab2b30523d54" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="igdisatr">
+ <description>Iggy's Gnees: Discrimination, Attributes &amp; Rules</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234847">
+ <rom name="iggy's gnees.woz" size="234847" crc="85027476" sha1="f67ef9e3430ca8287d95a9f0512dd3e4bb730d90" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impmiss">
+ <description>Impossible Mission</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="173820">
+ <rom name="impossible mission.woz" size="173820" crc="09f41927" sha1="2863391b12c0878050203c8b3ef39e23c0c84e1d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impmiss2">
+ <description>Impossible Mission II</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Douglas D. Dragin" />
+ <info name="programmer" value="Howard E. Scheer" />
+ <info name="programmer" value="Richard T. Unruh" />
+ <info name="programmer" value="Tom Zerucha" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233525">
+ <rom name="impossible mission ii side a.woz" size="233525" crc="fb26d565" sha1="20303f1f17ce5975df6c5c32d98fb5afdfb18f36" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233525">
+ <rom name="impossible mission ii side b.woz" size="233525" crc="0797da53" sha1="f9512f2f6cc7cc54081433bb97a21fceb159942f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="amzthgr1">
<description>In Search of The Most Amazing Thing (revsion 1)</description>
<year>1983</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder and Omar H. Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Omar H. Khudari" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
- <!--This game was released at least twice with productized protections.-->
+ <!-- This game was released at least twice with productized protections. -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-11-26-->
- <!--educational program-->
+ <!-- Dump released: 2019-11-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234804">
<rom name="in search of the most amazing thing.woz" size="234804" crc="ab9f24eb" sha1="db71277402a4457c039a67efb2d8f6891c04185c" />
@@ -28250,6 +23004,45 @@ license:CC0-1.0
</part>
</software>
+ <software name="ijtmepdm">
+ <description>Indiana Jones and the Temple of Doom</description>
+ <year>1989</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Atari Games" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-25 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234774">
+ <rom name="indiana jones and the temple of doom side a.woz" size="234774" crc="b2fd5a62" sha1="825cfc98c220a58a5bcc4a9d48c584bd5c8ddb2a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234774">
+ <rom name="indiana jones and the temple of doom side b.woz" size="234774" crc="887d8284" sha1="a8d3fd906e10e7deddf33d8ec0b5b95e3c504d84" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ijrota">
+ <description>Indiana Jones in Revenge of the Ancients</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-22 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="indiana jones in revenge of the ancients.woz" size="234798" crc="b58ce72d" sha1="ff13f521914dd209cacd3416c0bbbec19e79f713" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="infannel2">
<description>Inferential Anne: Level II</description>
<year>1987</year>
@@ -28257,8 +23050,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="inferential anne- level ii.woz" size="234790" crc="405375dc" sha1="f4745fdbc748d01ed457ef2737be962f456aeb8b" />
@@ -28266,15 +23059,153 @@ license:CC0-1.0
</part>
</software>
+ <software name="infiltr">
+ <description>Infiltrator</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Chris Gray" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-29 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234750">
+ <rom name="infiltrator side a.woz" size="234750" crc="da564c27" sha1="2086d19c2a3548891f5023dd271124f5882d283b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234750">
+ <rom name="infiltrator side b.woz" size="234750" crc="f5519b57" sha1="7aeee648cb7c2e6fdb85b011785da25c53900124" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="infiltr2">
+ <description>Infiltrator Part II: The Next Day</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Chris Gray" />
+ <info name="programmer" value="Nick Gray" />
+ <info name="programmer" value="Paul Butler" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-29 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234797">
+ <rom name="infiltrator ii side a.woz" size="234797" crc="8dd56d05" sha1="06ce8a816cca9e82b310ebf1cfde4606a6bebb96" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234797">
+ <rom name="infiltrator ii side b.woz" size="234797" crc="12289adc" sha1="2d4cb40975b7be1298c3e6cef4ae050fbd26a19f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="infinit">
+ <description>Infinitives (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241419">
+ <rom name="infinitives 1988.woz" size="241419" crc="cab787e3" sha1="1b564c1b4fbc1841bc61c31a0dee7a37a9698e43" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="instsurs_525" cloneof="instsurs">
+ <description>Instant Survey Sampler (A-224 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-224" />
+ <info name="programmer" value="Mark Dostal" />
+ <info name="programmer" value="Cathy Grittner" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Debra Vonk" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="revision 1.0" />
+ <!-- Same program as Instant Survey A-245 but includes the sampler disk -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234930">
+ <rom name="instant survey v1.0 disk 1 - program.woz" size="234930" crc="e91954ea" sha1="34513b9a7dbc6e386a54c27c387969796e85c657" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Sampler" />
+ <dataarea name="flop" size="234930">
+ <rom name="instant survey v1.0 disk 2 - sampler.woz" size="234930" crc="0e0350d7" sha1="b0d2c559bbc70b1a40276c79984d926f5371c623" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="instsurs">
+ <description>Instant Survey Sampler (A-224 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-224" />
+ <info name="programmer" value="Mark Dostal" />
+ <info name="programmer" value="Cathy Grittner" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Debra Vonk" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="revision 1.0" />
+ <!-- Same program as Instant Survey A-245 but includes the sampler disk -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="1345475">
+ <rom name="instant survey 800k disk 1 - program.woz" size="1345475" crc="948fdfb9" sha1="9fa664939ccb62c1943c36233341367ced706c18" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Sampler" />
+ <dataarea name="flop" size="1345475">
+ <rom name="instant survey 800k disk 2 - sampler.woz" size="1345475" crc="e8e0b270" sha1="0d7800c2ec0ada431f14e26aa8d50ddba62cc697" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="inthocky">
<description>International Hockey</description>
<year>1987</year>
<publisher>Artworx</publisher>
- <info name="programmer" value=" Ken Grant and Peter Ward" />
+ <info name="programmer" value="Ken Grant" />
+ <info name="programmer" value="Peter Ward" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-03-->
- <!--sports game-->
+ <!-- Dump released: 2019-09-03 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="228095">
<rom name="international hockey.woz" size="228095" crc="c9c4e6f4" sha1="539b9dcb39c8a3e762dff56fd93c54a826bc6675" />
@@ -28282,6 +23213,66 @@ license:CC0-1.0
</part>
</software>
+ <software name="intgrphs">
+ <description>Interpreting Graphs</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Sharon Dugdale" />
+ <info name="programmer" value="David Kibbey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="interpreting graphs.woz" size="234815" crc="8406f7d9" sha1="92846ac3a0d8516f86a50cb5fb23f19edb467e57" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="eaglnest">
+ <description>Into The Eagle's Nest</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Andrew Challis" />
+ <info name="programmer" value="Robin Chapman" />
+ <info name="programmer" value="Andrew Pines" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241445">
+ <rom name="into the eagle's nest.woz" size="241445" crc="65eb8066" sha1="0555eb4c26b06ad98f520ad205f15b13d033242d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="israelgy">
+ <description>Israel's Golden Years</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234840">
+ <rom name="israel's golden years side a.woz" size="234840" crc="b3a72fa5" sha1="44d161c3c074d661681c4373f86afecf404e94b5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234839">
+ <rom name="israel's golden years side b.woz" size="234839" crc="fbc40b04" sha1="39846b51f0bf46d53e7d3c79812310b7398f7625" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="itsabttm">
<description>It's About Time</description>
<year>1989</year>
@@ -28289,8 +23280,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234773">
<rom name="it's about time.woz" size="234773" crc="b5905f9d" sha1="536a2bd895f941b2ae54cdb06f80e7a13e13cc7c" />
@@ -28298,23 +23289,234 @@ license:CC0-1.0
</part>
</software>
- <software name="jbird">
- <description>J-Bird</description>
+ <software name="viewkill">
+ <description>James Bond 007 in: A View to a Kill</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234774">
+ <rom name="a view to a kill.woz" size="234774" crc="e5baa6cc" sha1="23b5f4e4cc226a9bf6db8ca01d1019b7d66f65a2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="goldfngr">
+ <description>James Bond 007 in: Goldfinger</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234762">
+ <rom name="goldfinger side a.woz" size="234762" crc="06a11df9" sha1="9e85d002e97229d2ce56d804686200cf1d7591dd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234762">
+ <rom name="goldfinger side b.woz" size="234762" crc="5bbdc079" sha1="bde1283a3dc2290d4f7d260710ebdcd793d5c662" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jawbrkr">
+ <description>Jawbreaker</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240117">
+ <rom name="jawbreaker.woz" size="240117" crc="79cd1db7" sha1="3050b0a351516d63254010ea3ae8137d37f7dbed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jawbrkr2">
+ <description>Jawbreaker ][</description>
+ <year>1982</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="alt_title" value="Jawbreaker" />
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="protection" value="Spiradisc System" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2018-09-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="459782">
+ <rom name="jawbreaker ][.woz" size="459782" crc="564b9530" sha1="9e8ff4220a0203ace18fafe300b119558d6e3fdc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jennyjrn_525" cloneof="jennyjrn">
+ <description>Jenny's Journeys (A-161 version 1.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-161" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="jenny's journeys v1.0.woz" size="234791" crc="ae68b965" sha1="9fa21d8a2f54cf35dd7aeb4ed3d40d0ffa043b9e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jennyjrn">
+ <description>Jenny's Journeys (A-161 version 1.0) (800K 3.5")</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-161" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345314">
+ <rom name="jenny's journeys 800k.woz" size="1345314" crc="f077ef2a" sha1="f6c6279c28c45ec9137cb960ff5505df6d916914" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="maddenfb">
+ <description>John Madden Football</description>
+ <year>1988</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Robin Antonick" />
+ <info name="programmer" value="Trip Hawkins" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-03-25 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234810">
+ <rom name="john madden football side a.woz" size="234810" crc="8731f6c6" sha1="9e06385a69fd0045d0b1539fd16bdd8f8c7ca777" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234810">
+ <rom name="john madden football side b.woz" size="234810" crc="3cb6bc97" sha1="a866e7b854c3dfe4206317acf78a8f4b86a82783" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="joust">
+ <description>Joust (Atarisoft)</description>
<year>1983</year>
- <publisher>Orion Software</publisher>
- <info name="programmer" value="Daryl Rotta" />
+ <publisher>Atari</publisher>
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-11-03-->
- <!--action game-->
+ <!-- Dump released: 2018-10-28 -->
+ <!-- arcade game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234788">
- <rom name="j-bird.woz" size="234788" crc="98debcd8" sha1="f22a533197f895a950cdb04965a20a09d073ca54" />
+ <dataarea name="flop" size="233444">
+ <rom name="joust.woz" size="233444" crc="4111f092" sha1="04e1493c87efd5a1e13141b46164bde876e90fd0" />
</dataarea>
</part>
</software>
- <software name="jumblz35">
+ <software name="juglrb10" cloneof="juglrb">
+ <description>Juggles' Rainbow (version 1.0)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Apple Computer" />
+ <info name="programmer" value="A. Piestrup" />
+ <info name="programmer" value="B. Jasinski" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="P. Fiorentini" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="A. Chiang" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234849">
+ <rom name="juggles' rainbow v1.0.woz" size="234849" crc="5a6ca731" sha1="62d23da196b95509dbf0639512db0d32393c3804" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="juglrb">
+ <description>Juggles' Rainbow (version 1.4)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Apple Computer" />
+ <info name="programmer" value="A. Piestrup" />
+ <info name="programmer" value="B. Jasinski" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="P. Fiorentini" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="A. Chiang" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234849">
+ <rom name="juggles' rainbow v1.4.woz" size="234849" crc="7e560ab2" sha1="f3612650f8db40902c1b654fbe627b12231b580b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="oneonone">
+ <description>Julius Erving and Larry Bird Go One on One</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Eric Hammond" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-24 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="226826">
+ <rom name="one on one.woz" size="226826" crc="4b4be4d2" sha1="bf565dafb896dfc1ca7e1a4685656f1fe0241624" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jmblezzz87" cloneof="jmblezzz">
+ <description>Jumblezzz (version 1987)</description>
+ <year>1987</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="jumblezzz.woz" size="234761" crc="2695cec7" sha1="080d38c1dfd955b1184238c70c2ec05af3af6dcc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jmblezzz">
<description>Jumblezzz (version 1990) (800K 3.5")</description>
<year>1990</year>
<publisher>Mindplay</publisher>
@@ -28322,8 +23524,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1990" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-11-->
- <!--educational game-->
+ <!-- Dump released: 2022-09-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296146">
<rom name="jumblezzz 800k.woz" size="1296146" crc="2a75cc48" sha1="97256ce15f81da727488dd33fd53c52709c2442b" />
@@ -28331,6 +23533,394 @@ license:CC0-1.0
</part>
</software>
+ <software name="jmpmthfl">
+ <description>Jumping Math Flash</description>
+ <year>1988</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="jumping math flash.woz" size="234768" crc="d3e77221" sha1="96a11b36e664ba9f26d3b585e3d0f1fa92788c3e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jumpman">
+ <description>Jumpman</description>
+ <year>1983</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Randy Glover" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Beginner levels" />
+ <dataarea name="flop" size="234776">
+ <rom name="jumpman - beginner levels.woz" size="234776" crc="5a113793" sha1="fbe71d6b9e2fc9c10015ed2ec01b94a0d70024a9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Advanced levels" />
+ <dataarea name="flop" size="234776">
+ <rom name="jumpman - advanced levels.woz" size="234776" crc="51c438bc" sha1="b4cb7b54f461688bb513feae050036aa1b0ec7ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="junghunt">
+ <description>Jungle Hunt (Atarisoft)</description>
+ <year>1984</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-12 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233456">
+ <rom name="jungle hunt.woz" size="233456" crc="4138c797" sha1="a920bb6b70a738c7d37fc292efa3c369211385c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jbird">
+ <description>J-Bird</description>
+ <year>1983</year>
+ <publisher>Orion Software</publisher>
+ <info name="programmer" value="Daryl Rotta" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-11-03 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="j-bird.woz" size="234788" crc="98debcd8" sha1="f22a533197f895a950cdb04965a20a09d073ca54" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kamikaze">
+ <description>Kamikaze</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="John van Ryzin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234774">
+ <rom name="kamikaze.woz" size="234774" crc="20670bef" sha1="15c487dd292df2a4c85f2566c521e3b08b717387" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kampfgp10">
+ <description>Kampfgruppe (version 1.0)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-04-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Game disk" />
+ <dataarea name="flop" size="234782">
+ <rom name="kampfgruppe side a - game disk.woz" size="234782" crc="cade1355" sha1="191f53083835e2fe77b50d293391fcf85130ed66" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Historical scenarios" />
+ <dataarea name="flop" size="234793">
+ <rom name="kampfgruppe side b - historical senarios.woz" size="234793" crc="43f3a85e" sha1="c045af7378e7dff9a3dac97e26e82543df3da566" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="karateka">
+ <description>Karateka</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jordan Mechner" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Side B of the original floppy disk had another copy of the game, but all the graphics were upside down." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-19 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233451">
+ <rom name="karateka.woz" size="233451" crc="579992fd" sha1="426b10497d927ad8704f252b1f948aa259d1f608" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Upside down" />
+ <dataarea name="flop" size="233451">
+ <rom name="karateka side b.woz" size="233451" crc="6be5c7db" sha1="58c3cf8c66c48eac9d0602a3a5437b03577edbe9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybarpeg">
+ <description>Keyboard Arpeggios</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Reid Alexander" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="keyboard arpeggios.woz" size="234821" crc="b7eaed79" sha1="e3474a933a4ee363a99e2baeb6ca7060cba6428e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keyblues">
+ <description>Keyboard Blues</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234818">
+ <rom name="keyboard blues.woz" size="234818" crc="793368c8" sha1="c591a0878bf747d9e283a4d9339f0a4dd91b70b4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybchords">
+ <description>Keyboard Chords</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234819">
+ <rom name="keyboard chords.woz" size="234819" crc="778557c8" sha1="df4747706e4ba89629c268bf78349e5aa1178e1a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybejazzh">
+ <description>Keyboard Extended Jazz Harmonies</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234839">
+ <rom name="keyboard extended jazz harmonies.woz" size="234839" crc="41fee586" sha1="2053e057e1386d3e31210651c8e922b04c2e0082" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybfing">
+ <description>Keyboard Fingerings</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234823">
+ <rom name="keyboard fingerings.woz" size="234823" crc="2392b237" sha1="fb0a5392d356c2cabc936be7399e4e9bd521d0a1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kbdgolf">
+ <description>Keyboard Golf (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Avant-Garde Creations" />
+ <info name="programmer" value="Stuart Aronoff" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="194820">
+ <rom name="keyboard golf (softsmith) side a.woz" size="194820" crc="6f6745f9" sha1="0ad2da4027f900039e80326d73b9eeb6804fe3c0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="154909">
+ <rom name="keyboard golf (softsmith) side b.woz" size="154909" crc="243b6450" sha1="72ef846015937a6a0b3cc73d9ed868d0859c2d88" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybintv">
+ <description>Keyboard Intervals</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234822">
+ <rom name="keyboard intervals.woz" size="234822" crc="6f204858" sha1="dc5ac3f63c3867d0f5e2fbb3631173f476be55de" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybjazzh">
+ <description>Keyboard Jazz Harmonies</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234830">
+ <rom name="keyboard jazz harmonies.woz" size="234830" crc="7b26cfb5" sha1="d4a0e94d329308b40b065df940908db6a6ca70c5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybndrl">
+ <description>Keyboard Note Drill</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="John M. Eddins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234822">
+ <rom name="keyboard note drill.woz" size="234822" crc="bd5cd212" sha1="2c8f7db2981f3d109d1b8ab8a44bc2f9b1e8e0c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybsread">
+ <description>Keyboard Speed Reading</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Ray E. Zubler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234824">
+ <rom name="keyboard speed reading.woz" size="234824" crc="fe9a8af4" sha1="69306735f8a54276a25cb67286aeab6d2e50bbda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keybtutr">
+ <description>Keyboard Tutor</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234780">
+ <rom name="keyboard tutor.woz" size="234780" crc="30bb3470" sha1="ddd150bf2c947eaa4919c4a8a7472f1eb39f2af1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ksmkbdmast10">
+ <description>Keyboarding Series: MECC Keyboarding Master: Games and Drills (Student Program) (A-131 version 1.0)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="TIES" />
+ <info name="partno" value="A-131" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="keyboarding master v1.0.woz" size="234775" crc="cb33bd28" sha1="3a1899634a7ba0820058bfb04fa764583a9058c2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keyworksf">
+ <description>Keyworks: First Keyboarding Skills</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234814">
+ <rom name="keyworks.woz" size="234814" crc="22a1847c" sha1="e45ef79a88f1f92b34641f48d66ce299bb5fa450" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kidswork">
+ <description>Kids at Work</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Maryl Skinner" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234901">
+ <rom name="kids at work.woz" size="234901" crc="cd0b0a75" sha1="4eb1859592bdb986343f82479631d513536312a0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kcaddphn">
<description>Kinder Critters: Address and Phone Number</description>
<year>1991</year>
@@ -28338,8 +23928,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234807">
<rom name="kinder critters- address and phone number.woz" size="234807" crc="9a1f8a9f" sha1="8a338ce20ff4328d2f5c4b82b0f511c749dbc57a" />
@@ -28354,8 +23944,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234803">
<rom name="kinder critters- letters and patterns.woz" size="234803" crc="cc43ebbe" sha1="495ff9e15d607f7db830a5c651a70153303740c2" />
@@ -28363,6 +23953,549 @@ license:CC0-1.0
</part>
</software>
+ <software name="kingcrib">
+ <description>King Cribbage</description>
+ <year>1981</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Randi J. Rost" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="king cribbage.woz" size="234763" crc="71025c9a" sha1="e2eb388bb2c06830ed46d0d24aae655b0473df64" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest">
+ <description>King's Quest: Quest for the Crown</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Arthur Abraham" />
+ <info name="programmer" value="Charles Tingley" />
+ <info name="programmer" value="Ken MacNeill" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Greg Rowland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="234862">
+ <rom name="king's quest - a.woz" size="234862" crc="c28ba31f" sha1="ed05892f119773d794393f94083eeb9a0f2513e7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
+ <dataarea name="flop" size="234862">
+ <rom name="king's quest - b.woz" size="234862" crc="65c51608" sha1="6203dee86fc511ad5f90b6ada914b2b4faf368bb" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C" />
+ <dataarea name="flop" size="234862">
+ <rom name="king's quest - c.woz" size="234862" crc="e89d0f26" sha1="c44892bf0710b86fda0b30703170c0c16d21a2f0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest2">
+ <description>King's Quest II: Romancing the Throne</description>
+ <year>1985</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234882">
+ <rom name="king's quest ii disk 1a.woz" size="234882" crc="86bd5fcb" sha1="e02bddc74822ccf98c0d083877d3028fa8fde80b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234882">
+ <rom name="king's quest ii disk 1b.woz" size="234882" crc="40d6ecab" sha1="c014b50a459635178766d4359ac24aefd689f085" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234882">
+ <rom name="king's quest ii disk 2a.woz" size="234882" crc="a9b6e810" sha1="2ae2fa2e41f91a24f2a8e2f489f991212e540c86" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234882">
+ <rom name="king's quest ii disk 2b.woz" size="234882" crc="bbf45f0d" sha1="cb1e3ece4461d5bc60d0d455aa471fa51cd8d3ad" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="234882">
+ <rom name="king's quest ii disk 3a.woz" size="234882" crc="6010d13f" sha1="b57c279b3f670eb029672fc4b0e9ed7926e7489f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest3">
+ <description>King's Quest III: To Heir Is Human</description>
+ <year>1988</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Robert E. Heitman" />
+ <info name="programmer" value="Bob Kernaghan" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Dale Carlson" />
+ <info name="programmer" value="Nancy Grimsley" />
+ <info name="programmer" value="Ray Marek" />
+ <info name="programmer" value="Jennifer Cobb" />
+ <info name="programmer" value="Kimberly Wood" />
+ <info name="programmer" value="Annette Childs" />
+ <info name="programmer" value="Greg Steffen" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 1a.woz" size="235049" crc="111cb4d4" sha1="82bea99d24d98cd392ff396174b94f6229e90264" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 1b.woz" size="235049" crc="be67af31" sha1="57b75d33440252acaf4f8c3d3add3ee3be972eda" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 2a.woz" size="235049" crc="ac51874b" sha1="e97464f589f06a9fe2f4ca0e2ba4729d99cd0b43" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 2b.woz" size="235049" crc="118ad464" sha1="5bea08951c691dc3ad0676d92accc41da841e813" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 3a.woz" size="235049" crc="ee9e9fbc" sha1="928f42453b1fd1da8175430812c0b539d7437881" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 3b.woz" size="235049" crc="c4e364f5" sha1="6f5032e0e43594d9824c5052c206c7b4ace8f54d" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 4a.woz" size="235049" crc="6cb1b92d" sha1="caa862799b101c43bbd367972735573f2723bbf2" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="235757">
+ <rom name="king's quest iii disk 4b.woz" size="235757" crc="91a1f537" sha1="bcf4f29b2d3bc491e6db8eaa16c7683c33b9e28e" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 5a.woz" size="235049" crc="69c4a50a" sha1="2a818840dc12538f5691e64bec3b881d2f7bcc99" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B" />
+ <dataarea name="flop" size="235049">
+ <rom name="king's quest iii disk 5b.woz" size="235049" crc="feb04de0" sha1="32b7fca371e61c4dd31f09bc4e43cc5bca4af1f2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest4">
+ <description>King's Quest IV: The Perils of Rosella</description>
+ <year>1989</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="William Goldstein" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Douglas Herring" />
+ <info name="programmer" value="Chris Hoyt" />
+ <info name="programmer" value="Teresa Baker" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Carolly Hauksdoffir" />
+ <info name="programmer" value="William Skirvin" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Paul Krasno" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 1a.woz" size="235026" crc="4637b7f9" sha1="6a4eb9ccebc0c73ab671d31ab78fde86457fe9fd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 1b.woz" size="235026" crc="e4137905" sha1="c24b1fa30dc09ba8c75198f43afe7b2a33def2e7" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 2a.woz" size="235026" crc="cb65d66c" sha1="38458c64f2fb9ff6e714ef381b793c993521f642" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 2b.woz" size="235026" crc="d93c3201" sha1="6477eed1fcf6a5d96f72cc5b8761e1bc13164203" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 3a.woz" size="235026" crc="8ad0cf2b" sha1="a3a31bdc0cac2b78769a5d50842f623c27d7a78a" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 3b.woz" size="235026" crc="3989f6df" sha1="48222a113d3ddf2d6236d42946705d1d7f01a50c" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 4a.woz" size="235026" crc="c83c1a31" sha1="129c6a9a9a6b57afedb25015a04b72127c04182f" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 4b.woz" size="235026" crc="9ab9d5d3" sha1="2a571bea06c166ff78b9b932a6f04a763f97d3c4" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 5a.woz" size="235026" crc="4473124b" sha1="97faccf6c4c1dfcfcf9818c3e2d7c037de22efba" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 5b.woz" size="235026" crc="6d9fe4a3" sha1="23ff51e0e902afdcb4b0d5117516b354755a629a" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 6a.woz" size="235026" crc="55af5498" sha1="66664295dddd957d42fbcc336bea87e161e0c982" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 6b.woz" size="235026" crc="6a01dbbf" sha1="a8500e6269c8233d84530d2b103c5853d2d67bc7" />
+ </dataarea>
+ </part>
+ <part name="flop13" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 7a.woz" size="235026" crc="79fa5822" sha1="65407cfe5fbbbb4b57a62236f6b37c8be3b8382a" />
+ </dataarea>
+ </part>
+ <part name="flop14" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 7b.woz" size="235026" crc="34bbded5" sha1="8b00b42da3672676204b0fcc38db6da4effe68cb" />
+ </dataarea>
+ </part>
+ <part name="flop15" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 Side A" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 8a.woz" size="235026" crc="57e62367" sha1="c9d31e22986e8bf29c1463e8e396f95f7534ac65" />
+ </dataarea>
+ </part>
+ <part name="flop16" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 Side B" />
+ <dataarea name="flop" size="235026">
+ <rom name="king's quest iv disk 8b.woz" size="235026" crc="b86151c6" sha1="9180baa113f7f85c03f1a836934a69bf3dca451c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kitkidfrog031286">
+ <description>Kittens, Kids, and a Frog: Building Comprehension I (version 03.12.86)</description>
+ <year>1986</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Janet Goldman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="03.12.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="241539">
+ <rom name="kittens, kids, and a frog v3.12.86 disk 1.woz" size="241539" crc="0248028f" sha1="0c39b6bf17b2b1f8b3ac931563c162b95861d8ac" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="241506">
+ <rom name="kittens, kids, and a frog v3.12.86 disk 2.woz" size="241506" crc="7ee7e5ef" sha1="d308475003cd91ea7fdca3f7ccf2fe129710a2e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="knightds" supported="no">
+ <description>Knights of the Desert (version 1.1)</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Tactical Design Group" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234837">
+ <rom name="knights of the desert v1.1.woz" size="234837" crc="8aee4636" sha1="59a573ebe5887c07ef0e943c18b776367a3253e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="korg8004m">
+ <description>Korg 800 4-Track MIDI Sequencer (version 1.0)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234793">
+ <rom name="korg-800 4-track midi sequencer v1.0.woz" size="234793" crc="1f5e1449" sha1="3a460e5115352aa1e09540f485313ce1b3cff586" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="krift">
+ <description>Koronis Rift</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Lucasfilm Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-25 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234737">
+ <rom name="koronis rift.woz" size="234737" crc="657888ad" sha1="97f86d1d2b7bc39c86f81cc6c3adf6528c19e81b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lacrkdwn">
+ <description>L.A. Crackdown</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Leonard Chan" />
+ <info name="programmer" value="Clifford Yap" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233484">
+ <rom name="l. a. crackdown side a.woz" size="233484" crc="2470ff12" sha1="9e095637f0e4f3bf6f18318f68c3a8946a333394" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233484">
+ <rom name="l. a. crackdown side b.woz" size="233484" crc="f90f1341" sha1="ab3bf18944f6482f574a054c916c84d2fbc4f49b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lalandmon">
+ <description>L.A. Land Monopoly (Softsmith)</description>
+ <year>1980</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Continental Software" />
+ <info name="programmer" value="Jeffrey Stanton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241417">
+ <rom name="l.a. land monopoly (softsmith).woz" size="241417" crc="bb6f1cfd" sha1="fbf66a301ce994144400d7e2e4ff4e52b9211db5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lafabric" cloneof="factory">
+ <description>La Fábrica (WINGS for learning) (Spanish) (version 1991) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>WINGS for learning</publisher>
+ <info name="alt_title" value="The Factory: Strategies in Problem Solving (Spanish)"/>
+ <info name="original_publisher" value="Sunburst Communications" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1991 (Spanish)" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1329972">
+ <rom name="la fabrica 800k.woz" size="1329972" crc="593ea2ef" sha1="920143b2cae9110368214a89db9c553c073d4f8c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brdstalef" cloneof="brdstale">
+ <description>La Geste du Barde : The Bard's Tale (French)</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="alt_title" value="Tales of the Unknown: The Bard's Tale" />
+ <info name="language" value="French" />
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="programmer" value="Bill Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Programme 1" />
+ <dataarea name="flop" size="234785">
+ <rom name="la geste du barde - disquette programme face 1.woz" size="234785" crc="1d4aeb81" sha1="61863a319bef0b55d3b6cbebe2bab82bf947a883" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Programme 2" />
+ <dataarea name="flop" size="241441">
+ <rom name="la geste du barde - disquette programme face 2.woz" size="241441" crc="f4bc5a18" sha1="745b94e46d3cd7151f6f1b8abf4ad9df78a4ef09" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Donjon" />
+ <dataarea name="flop" size="241438">
+ <rom name="la geste du barde - disquette donjon face 1.woz" size="241438" crc="3069c499" sha1="ebf746c2d2745694d24be0472c6b41a4a56ebde5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labelmkr_525" cloneof="labelmkr">
+ <description>LabelMaker (A-241 version 1.0)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-241" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234783">
+ <rom name="labelmaker v1.0.woz" size="234783" crc="28ee6f64" sha1="590ca5072665f17298e585e008c2a460fde2f5e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labelmkr">
+ <description>LabelMaker (A-241 version 1.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-241" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344258">
+ <rom name="labelmaker v1.0 800k.woz" size="1344258" crc="9587a864" sha1="5c9c113f3a4b9ee500089692694f46baf5dbfc9e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labyrnth">
+ <description>Labyrinth</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Scott Schram" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2019-03-17 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="349959">
+ <rom name="labyrinth.woz" size="349959" crc="c2a2ba88" sha1="8604f70d0a7f039a729a3d81957e8b1860bacbaa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lafpak">
+ <description>Laf Pak</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-12 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234778">
+ <rom name="laf pak.woz" size="234778" crc="7e5e2002" sha1="8fbd21ff8d8b7f6194c0bdfbfa074aa716435e77" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="lancastr">
<description>Lancaster</description>
<year>1983</year>
@@ -28370,8 +24503,8 @@ license:CC0-1.0
<info name="programmer" value="Will Harvey" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-02-19-->
- <!--action game-->
+ <!-- Dump released: 2019-02-19 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234768">
<rom name="lancaster.woz" size="234768" crc="f5245b69" sha1="660d9aff97a01563d5180c72d71a383454bb0e39" />
@@ -28379,6 +24512,606 @@ license:CC0-1.0
</part>
</software>
+ <software name="langcrn">
+ <description>Language Carnival</description>
+ <year>1988</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Developmental Learning Materials" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234789">
+ <rom name="language carnival disk 1.woz" size="234789" crc="acfc7951" sha1="e964f30d63a0bdbf87f530c838378c658d829e48" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234773">
+ <rom name="language carnival disk 2.woz" size="234773" crc="d5a28050" sha1="0dc0cdf08f81c857d9b880c6e902677f46a5fa64" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lsrbounc">
+ <description>Laser Bounce</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="Kevin Kalkut" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="laser bounce.woz" size="234781" crc="03f340f8" sha1="60ab961e6b57b059a1dc4f9f6c4e4b845b1aed75" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="latintut">
+ <description>Latin Tutor</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="latin tutor.woz" size="234762" crc="f41a41d1" sha1="39df56ea6d987758fb24d259a01b4def34f96de3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazmaze">
+ <description>Lazer Maze (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Avant-Garde Creations" />
+ <info name="programmer" value="James D. Spain" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="248068">
+ <rom name="lazer maze (softsmith).woz" size="248068" crc="4a8acf3d" sha1="adf8c499f6f76f0700b39d563fca557f0e9f321c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazsilkg" cloneof="lazsilk">
+ <description>Lazer Silk (Gebelli Software)</description>
+ <year>1982</year>
+ <publisher>Gebelli Software</publisher>
+ <info name="programmer" value="Eric Knopp" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2019-03-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="354556">
+ <rom name="lazer silk.woz" size="354556" crc="038984fb" sha1="a44ee87f2bef7c43edd4dbb8eea70f9fc930b051" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lazsilk">
+ <description>Lazer Silk (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Gebelli Software" />
+ <info name="programmer" value="Eric Knopp" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121599">
+ <rom name="lazer silk (softsmith).woz" size="121599" crc="adfeab84" sha1="802b6dc2fee04f3aabb6deb1664a4f27c58eef19" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="leadshtr">
+ <description>Leadsheeter</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="author" value="Phil Farrand" />
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="John Borowicz" />
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234724">
+ <rom name="leadsheeter.woz" size="234724" crc="24983d63" sha1="87bd1ece2870c485202f12c226371a3ddafea92c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lraddsub">
+ <description>Learning to Add &amp; Subtract (revision 1)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="learning to add &amp; subtract.woz" size="234761" crc="d194e149" sha1="df780b252e95ab2d28c04f9c0ff4c31135634628" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lrn2time">
+ <description>Learning to Tell Time</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234751">
+ <rom name="learning to tell time.woz" size="234751" crc="ab2804c5" sha1="77a74d6c72a35bb43797b8fab783420412c643df" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lgcyanct">
+ <description>Legacy of the Ancients</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Quest Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-24 -->
+ <!-- role-playing games -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="242988">
+ <rom name="legacy of the ancients side 1.woz" size="242988" crc="ec4191a1" sha1="94cb308a22c03c669417611d5441a1c437165626" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="234796">
+ <rom name="legacy of the ancients side 2.woz" size="234796" crc="fbec7b4c" sha1="a094c00d4a38959ee45dde1c22f7699ae142711d" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="241452">
+ <rom name="legacy of the ancients side 3.woz" size="241452" crc="f433fe37" sha1="3b30805dd474f75923363c74d12e75e950c74382" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4" />
+ <dataarea name="flop" size="241452">
+ <rom name="legacy of the ancients side 4.woz" size="241452" crc="5f13fdfd" sha1="b38eb9353f999d780b5f56a53c4a6b7330715686" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lsl1">
+ <description>Leisure Suit Larry in The Land of the Lounge Lizards</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Chuck Benton" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234888">
+ <rom name="leisure suit larry in the land of the lounge lizards disk 1a.woz" size="234888" crc="a1de126d" sha1="44232e6c20a9e68f72c2c7629ff83c2dc99f79d6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="235596">
+ <rom name="leisure suit larry in the land of the lounge lizards disk 1b.woz" size="235596" crc="09f704cb" sha1="745360380088aa61fd056259e37feb1df9b9758c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="235596">
+ <rom name="leisure suit larry in the land of the lounge lizards disk 2a.woz" size="235596" crc="effd0ae7" sha1="c38c74c059cf063887bb74a0af4ed8e6dc682b54" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="235596">
+ <rom name="leisure suit larry in the land of the lounge lizards disk 2b.woz" size="235596" crc="02985a4a" sha1="3c564f9b14cf397796e3b9fd41490281b0e6200f" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="235596">
+ <rom name="leisure suit larry in the land of the lounge lizards disk 3a.woz" size="235596" crc="1463b109" sha1="32f48c48e87fe716de1db5cfd1b52694a4fe2750" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lgfishng">
+ <description>Let's Go Fishing</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234735">
+ <rom name="let's go fishing.woz" size="234735" crc="ecbb9e6a" sha1="cf9e4a61d465767883b9a2ff8bce1faddd729eae" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lgtmapsk">
+ <description>Let's Go There: Beginning Map and Geography Skills</description>
+ <year>1993</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234842">
+ <rom name="let's go there- beginning map and geography skills.woz" size="234842" crc="4b4956f9" sha1="be9bb6e647067ab1ba880322c7641686022e8983" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="llacomp">
+ <description>Let's Learn About Computers</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234829">
+ <rom name="let's learn about computers.woz" size="234829" crc="53113bee" sha1="e5f069b6306ad52e7580e1d68e57aa7b4be57613" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="llamoney">
+ <description>Let's Learn About Money</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="let's learn about money.woz" size="234791" crc="434ccb3b" sha1="b3db5d2e2bb3c7c0e53ac1c2b94d893672e4a693" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lewclsh_525" cloneof="lewclsh">
+ <description>Lewis and Clark Stayed Home (A-279 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-279" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235610">
+ <rom name="lewis and clark stayed home side a.woz" size="235610" crc="0d491c52" sha1="778257f1cccc09c740c720b812b7f02769c87a34" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235610">
+ <rom name="lewis and clark stayed home side b.woz" size="235610" crc="48db922e" sha1="159fa2ee942baba72588da95005d227ad62fe17d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lewclsh">
+ <description>Lewis and Clark Stayed Home (A-279 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-279" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345419">
+ <rom name="lewis and clark stayed home 800k.woz" size="1345419" crc="a5f93fe9" sha1="029aaba23029d952d5b88aa3703c15adae3135b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lsllalib">
+ <description>Library Skills: Let's Learn About The Library</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-01-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234775">
+ <rom name="let's learn about the library disk 1.woz" size="234775" crc="1825591a" sha1="f5f1b26710f87c9aba3d3fdaba5cc348d9151fe9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234775">
+ <rom name="let's learn about the library disk 2.woz" size="234775" crc="56ff0e2f" sha1="2a87f73c0b3b8a393b86b58c03cc730dc86f6cc9" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234775">
+ <rom name="let's learn about the library disk 3.woz" size="234775" crc="a1a49df0" sha1="d5b2cf6ff3a64df41c09c1ec140dee3eb1d1df97" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="listenms">
+ <description>Listen! A Music Skills Program</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="listen a music skills program.woz" size="234796" crc="6f0a9e29" sha1="49ec768b7c13347568400e12f477d2116d85f24a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="litcount">
+ <description>Little Counter (version 1.1 26-FEB-82) (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="John R. Conrad" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1 26-FEB-82" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="168214">
+ <rom name="little counter v1.1 (softsmith).woz" size="168214" crc="2df657a7" sha1="2c634f0f14036479f3c38e6f666a735ed0223d6f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth3">
+ <description>Locksmith (version 3.1)</description>
+ <year>1981</year>
+ <publisher>Omega Software Products</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="usage" value="Requires an Apple ][, ][+, or unenhanced //e with at least 32K. Due to coding bugs unrelated to copy protection, it will not run on later models." />
+ <info name="version" value="3.1" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
+ <!-- Dump released: 2022-02-09 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="55061">
+ <rom name="locksmith v3.1.woz" size="55061" crc="6b9321ca" sha1="48de65dd3d3ce9656dc75dce5b328974e2ab748b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth4">
+ <description>Locksmith (version 4.1)</description>
+ <year>1983</year>
+ <publisher>Omega Microware</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="4.1" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-19 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="108291">
+ <rom name="locksmith 4.1.woz" size="108291" crc="fa9116e7" sha1="6f6528a640bd4a5643b339e59a5ba99f8fba2d01" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth50c" cloneof="locksmth5">
+ <description>Locksmith (version 5.0 revision level C)</description>
+ <year>1983</year>
+ <publisher>Omega Microware</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="5.0 revision level C" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-26 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234792">
+ <rom name="locksmith v5.0c.woz" size="234792" crc="a50a0a75" sha1="6505f88cdd389f21e3638d8bcfc1df3bf88b7812" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth50f" cloneof="locksmth5">
+ <description>Locksmith (version 5.0 revision level F)</description>
+ <year>1983</year>
+ <publisher>Omega Microware</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="5.0 revision level F" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-26 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234792">
+ <rom name="locksmith v5.0f.woz" size="234792" crc="961919c1" sha1="1e4769a0c14079ed163b27b8857b5674afb520e3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth5">
+ <description>Locksmith (version 5.0 revision level G)</description>
+ <year>1984</year>
+ <publisher>Alpha Logic Business Systems</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="5.0 revision level G" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-26 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234803">
+ <rom name="locksmith v5.0g.woz" size="234803" crc="453629cd" sha1="9f8b59c4e5a21fdb5c41263f813a0e441c586217" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth60a" cloneof="locksmth6">
+ <description>Locksmith (version 6.0 revision A)</description>
+ <year>1986</year>
+ <publisher>Alpha Logic Business Systems</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="6.0 revision A" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-26 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Locksmith revision A"/>
+ <dataarea name="flop" size="234790">
+ <rom name="locksmith v6.0a.woz" size="234790" crc="84b8d5ef" sha1="d782dab1994115295d00c6697f996269cf71e5fa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Parameter Disk 1" />
+ <dataarea name="flop" size="234798">
+ <rom name="locksmith v6.0a parameter disk 1.woz" size="234798" crc="88e3563c" sha1="ad16d3e5d07feef9871f01c678d59a6bc658faac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locksmth6">
+ <description>Locksmith (version 6.0 revision B)</description>
+ <year>1986</year>
+ <publisher>Alpha Logic Business Systems</publisher>
+ <info name="alt_title" value="NIBY"/>
+ <!-- NIBY was the unreleased version 1.0 of Locksmith -->
+ <info name="original_publisher" value="Omega Software Products" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="6.0 revision B" />
+ <!-- Created by booting version 6.0 revision A and executing the "patch to rev. B" file from Locksmith Parameter Disk 1D. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-27 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Locksmith revision B" />
+ <dataarea name="flop" size="234790">
+ <rom name="locksmith v6.0b.woz" size="234790" crc="9106c526" sha1="efdaec6e6c9592ea98e65b098dd19099f5f61149" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Parameter Disk 1D" />
+ <!-- This disk upgrades 6.0A to 6.0B -->
+ <dataarea name="flop" size="234799">
+ <rom name="locksmith v6.0b parameter disk 1d.woz" size="234799" crc="e31292d4" sha1="bab8cc7a5f34a2a44954648b17f85997cacd443a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="loderunr">
+ <description>Lode Runner</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Doug Smith" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="353289">
+ <rom name="lode runner.woz" size="353289" crc="62728de0" sha1="8bbad930b34415be05e854e1cad20326d2dc9390" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="logicbld">
+ <description>Logic Builders</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="logic builders.woz" size="234768" crc="22093886" sha1="597679f98dc4d14b475383951187c91e25da40f4" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="loggates">
<description>Logic Gates (A-403 version 1.0)</description>
<year>1984</year>
@@ -28388,8 +25121,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-16-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-16 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234786">
<rom name="logic gates v1.0.woz" size="234786" crc="41e6d237" sha1="421d401d53dc1155280c6133b5b0430f17b0d468" />
@@ -28397,17 +25130,296 @@ license:CC0-1.0
</part>
</software>
+ <software name="logictls">
+ <description>Logic Tools (prototype)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Ann Piestrup" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- unreleased prototype -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234825">
+ <rom name="logic tools (prototype).woz" size="234825" crc="c4dcf4e7" sha1="44f0459a08e358527489c01ab7d00e3d84978e8c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="logomot">
+ <description>LogoMotion (version 1.2) (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Terrapin" />
+ <info name="programmer" value="L. Klotz" />
+ <info name="programmer" value="P. Sobalvarro" />
+ <info name="programmer" value="S. Hain" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- programming language -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="128288">
+ <rom name="logomotion v1.2 (softsmith) disk 1 - program disk.woz" size="128288" crc="a30b9544" sha1="eb575c04e2e6a474726bf731d69b3db392f81fbd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Utilities" />
+ <dataarea name="flop" size="234784">
+ <rom name="logomotion v1.2 (softsmith) disk 2 - utilities disk.woz" size="234784" crc="4ed3ab32" sha1="1bf5d8f115ae2873314c0c18cab79761633973b3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lordconq">
+ <description>Lords of Conquest</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Jack Kittredge" />
+ <info name="author" value="Peter Olotka" />
+ <info name="author" value="Bill Eberle" />
+ <info name="developer" value="Eon Productions" />
+ <info name="programmer" value="Ted Schmeckpeper" />
+ <info name="programmer" value="Trevor Western" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-16 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="228156">
+ <rom name="lords of conquest side a.woz" size="228156" crc="e7e05231" sha1="a4a36db90cda59a64a7baac4c03d665926c351a0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234812">
+ <rom name="lords of conquest side b.woz" size="234812" crc="de46bf70" sha1="1a53fa03180075727451c56326a4deb1d2c363bb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lunleep">
+ <description>Lunar Leepers</description>
+ <year>1982</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Chuck Bueche (Chuckles)" />
+ <info name="protection" value="Spiradisc System" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="507649">
+ <rom name="lunar leepers.woz" size="507649" crc="3cd5d255" sha1="0607fb62340c48abc0624fe369dace2e9d5fedfd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlapdll">
+ <description>M-ss-ng L-nks: Al Pie De La Letra Spanish Editor</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234839">
+ <rom name="m-ss-ng l-nks- al pie de la letra spanish editor.woz" size="234839" crc="b21b3471" sha1="bc89052300297a86e8f407ac3aab374c24fce77f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlclason">
+ <description>M-ss-ng L-nks: Classics Old and New</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234841">
+ <rom name="m-ss-ng l-nks- classics old and new.woz" size="234841" crc="310af58b" sha1="80d9940f89c2bf127398fbfddb31378280ac7a79" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlengedit">
+ <description>M-ss-ng L-nks: English Editor</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="programmer" value="Richard Gersh" />
+ <info name="programmer" value="Jonathan Sweedler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234865">
+ <rom name="m-ss-ng l-nks- english editor.woz" size="234865" crc="aa5dfb3a" sha1="74a88af8760a1fb246671f25f05a0cc522321df3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlyoungpl83" cloneof="mlyoungpl">
+ <description>M-ss-ng L-nks: Young People's Literature (version 1983)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234844">
+ <rom name="m-ss-ng l-nks- young people's literature.woz" size="234844" crc="37512a0b" sha1="2af0275eb2089bb78856439613948aabff48c069" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlyoungpl">
+ <description>M-ss-ng L-nks: Young People's Literature (version 1987 revised)</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Carol Chomsky" />
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Harry Chomsky" />
+ <info name="programmer" value="Jon Kaplan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987 revised" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234852">
+ <rom name="m-ss-ng links- young people's literature revised edition.woz" size="234852" crc="61d1bfd6" sha1="b9526bf06d725593462f00d9ae9c50122904955a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcarthwr">
+ <description>MacArthur's War (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Dan Antolee" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235581">
+ <rom name="macarthur's war side a - master disk.woz" size="235581" crc="5ee7a50e" sha1="0e35c7de38ad3c1ddfdce482d6d69066daf9992f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235583">
+ <rom name="macarthur's war side b - scenario disk.woz" size="235583" crc="fdf61a37" sha1="920b47a8875102e61fd9891cf887cfd4bbdb86f5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mslt2040v102" cloneof="mslt2040v112">
+ <description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.02)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.02" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235333">
+ <rom name="magic slate 20-40 v1.02.woz" size="235333" crc="b81591d2" sha1="4ee00c77f1eed2998640f362b7d22ceb6399927f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mslt2040v112">
+ <description>Magic Slate: 20/40-Column Apple ][+ Version (version 1.1.2)</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Simon Lie" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- Hold CTRL+C during startup to switch between 20/40 columns. -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235333">
+ <rom name="magic slate 20-40 v1.12.woz" size="235333" crc="f119a292" sha1="857254f9c77a00e6294d1678a33a72e2a452e324" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspells10" cloneof="mspells">
+ <description>Magic Spells (version 1.0) (Advanced Learning Technology)</description>
+ <year>1981</year>
+ <publisher>Advanced Learning Technology</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corrine Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="magic spells v1.0.woz" size="234821" crc="7c156336" sha1="856f252c0f1a027abdab5a722ab99a36b89d26c2" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mspells81" cloneof="mspells">
- <description>Magic Spells (1981) (Apple)</description>
+ <description>Magic Spells (version 1981) (Apple)</description>
<year>1981</year>
<publisher>Apple Computer</publisher>
+ <info name="original_publisher" value="Advanced Learning Technology" />
<info name="developer" value="Advanced Learning Technology"/>
- <info name="programmer" value="Leslie Grimm and Corrine Grimm" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corrine Grimm" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1981" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-05-19-->
- <!--educational program-->
+ <!-- Dump released: 2019-05-19 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241457">
<rom name="magic spells.woz" size="241457" crc="81351a7b" sha1="9b7aa0a41629a182a90871c638268c50adebde34" />
@@ -28415,17 +25427,106 @@ license:CC0-1.0
</part>
</software>
+ <software name="mspells11" cloneof="mspells">
+ <description>Magic Spells (version 1.1) (The Learning Company)</description>
+ <year>1981</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241435">
+ <rom name="magic spells v1.1.woz" size="241435" crc="861d3308" sha1="9ad05dab75357a828ceadc6f01c459bc4a44f6e1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspells20d" cloneof="mspells">
+ <description>Magic Spells (version 2.0d) (The Learning Company)</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="G. Genoar" />
+ <info name="programmer" value="S. Gordon" />
+ <info name="programmer" value="K. Klose" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="K. Elliott" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.0d" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17. Redumped 2025-08-27 to fix prodos error. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241509">
+ <rom name="magic spells v2.0d.woz" size="241509" crc="1618d818" sha1="2874a6f5ebf035b0fd3c60d95cbde0ffded95c28" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspells21x" cloneof="mspells">
+ <description>Magic Spells (version 2.1x) (The Learning Company)</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="G. Genoar" />
+ <info name="programmer" value="S. Gordon" />
+ <info name="programmer" value="K. Klose" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="K. Elliott" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.1x" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241477">
+ <rom name="magic spells v2.1x.woz" size="241477" crc="6a791f84" sha1="2630f9b62cdd3a0b9ad4b0b3e53a63ef7cdc02c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspells22" cloneof="mspells">
+ <description>Magic Spells (version 2.2) (The Learning Company) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="G. Genoar" />
+ <info name="programmer" value="S. Gordon" />
+ <info name="programmer" value="K. Klose" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="K. Elliott" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296201">
+ <rom name="magic spells v2.2 800k.woz" size="1296201" crc="9d242890" sha1="f47a0f180ddf1f26dbc1d08124d580cf8b54bb59" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mspells">
- <description>Magic Spells (version 2.3) (800K 3.5")</description>
+ <description>Magic Spells (version 2.3) (The Learning Company) (800K 3.5")</description>
<year>1985</year>
<publisher>The Learning Company</publisher>
- <info name="original_publisher" value="Apple Computer" />
- <info name="programmer" value="K. Elliott, G. Genoar, S. Gordon, L. Grimm, and K. Klose" />
+ <info name="original_publisher" value="Advanced Learning Technology" />
+ <info name="programmer" value="K. Elliott" />
+ <info name="programmer" value="G. Genoar" />
+ <info name="programmer" value="S. Gordon" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="K. Klose" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
<info name="version" value="2.3" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-09-29-->
- <!--educational program-->
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296218">
<rom name="magic spells 800k.woz" size="1296218" crc="8fdcca18" sha1="88beae2101715a83a12dce18e0087e8d78f45533" />
@@ -28433,6 +25534,152 @@ license:CC0-1.0
</part>
</software>
+ <software name="manhuntr">
+ <description>Manhunter: New York (version 1.0I)</description>
+ <year>1988</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Dave Murry" />
+ <info name="programmer" value="Barry Murry" />
+ <info name="programmer" value="Dee Dee Murry" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Robert Eric Heitman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Doug Oldfield" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0I" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-07 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 1a.woz" size="234919" crc="96c8587e" sha1="2aec0648930b62687a932f80d69ab2605688842b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 1b.woz" size="234919" crc="9dbe9ae4" sha1="e8a645f7ff422b6be32f75256a5e40e83a092ab1" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 2a.woz" size="234919" crc="372c02d4" sha1="e82c31e350534d8138fd9e1cfe8b983c2c40b9c9" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 2b.woz" size="234919" crc="66b6fc66" sha1="7de67f998494cbeb7d68db6c7d92d3641f873320" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 3a.woz" size="234919" crc="bbbc6ba4" sha1="f6a58e97209d816af9791e588dbf32b4e50a7d42" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 3b.woz" size="234919" crc="9f6d1070" sha1="445b1bd2a597ea5da6dc8f4a85fa1ccc85eb9683" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 4a.woz" size="234919" crc="49602f21" sha1="a01d3a92bd66bb51bb2e7f7fd1a6f2660dc21958" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 4b.woz" size="234919" crc="c17ff13f" sha1="2c7b125772e7df2053b230638e17cb727f9778e9" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 5a.woz" size="234919" crc="351bd475" sha1="82c6f68a1637af5c8efc5e723caeb0dca0c152d5" />
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 5b.woz" size="234919" crc="68b7fd76" sha1="3e1e5df1f15d6e103b5be42c54d1d75fac268609" />
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side A" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 6a.woz" size="234919" crc="dd91e136" sha1="65a5748fa9c914950e32a18d45ce29ef0694a099" />
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side B" />
+ <dataarea name="flop" size="234919">
+ <rom name="manhunter new york disk 6b.woz" size="234919" crc="ca8be96b" sha1="cdf685059ae672824e84c8fe303301397d73b120" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="marauder">
+ <description>Marauder</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Rorke Weigandt" />
+ <info name="programmer" value="Eric Hammond" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233470">
+ <rom name="marauder.woz" size="233470" crc="59a89e2c" sha1="cd279b38ee6a072aa2974a66804e1f75ff34111d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="marblem">
+ <description>Marble Madness</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="226821">
+ <rom name="marble madness side a.woz" size="226821" crc="d4c96731" sha1="3e3fd0be2b4de291e0c137a3a2cfac0fdd56fdd0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233477">
+ <rom name="marble madness side b.woz" size="233477" crc="29a0ea5d" sha1="b3c12458557e931b718f168013cffaec6f16a862" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlinvanat">
+ <description>Marine Life: Invertebrate Anatomy</description>
+ <year>1986</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234792">
+ <rom name="marine life- invertebrate anatomy.woz" size="234792" crc="4578c31b" sha1="88abec1c13a8f326995070f93c0fdf1ed8b89d62" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="martyfrd">
<description>Marty's Family Reader</description>
<year>1992</year>
@@ -28440,8 +25687,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="234795">
@@ -28499,8 +25746,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="234797">
@@ -28551,17 +25798,78 @@ license:CC0-1.0
</part>
</software>
+ <software name="mastspell">
+ <description>Master Spell (A-119 version 1.3)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-119" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234787">
+ <rom name="master spell v1.3.woz" size="234787" crc="3161ab8d" sha1="008ae63ec96307253c6e4bf12dd3b1ae971c717d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstrtrks">
+ <description>Master Tracks (version 1.8)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="programmer" value="Phil Stone" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.8" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241454">
+ <rom name="master tracks v1.8.woz" size="241454" crc="e0c144e6" sha1="e2a9be5400126613760690d293ff643641fe7d44" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="masttrpro">
+ <description>Master Tracks Pro (version 1.2)</description>
+ <year>1987</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="programmer" value="Phil Stone" />
+ <info name="usage" value="Requires a 128K enhanced Apple //e or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234797">
+ <rom name="master tracks pro v1.2.woz" size="234797" crc="e43e90ad" sha1="25b9d623d318fb6d798e92b9127f4c8536295348" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mmerlyad">
<description>Mastering Math Series 1: Early Addition (A-788 version 1.3)</description>
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-788" />
- <info name="programmer" value="Frederick Steinmann and Peter Fuglstad" />
+ <info name="programmer" value="Kent Kehrberg" />
+ <info name="programmer" value="Karen Jostad" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="programmer" value="Peter Fuglstad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234789">
<rom name="early addition v1.3.woz" size="234789" crc="cf5f5e0e" sha1="a6eeb4620fb6770ed5a37f05a5d24c68df269635" />
@@ -28573,13 +25881,18 @@ license:CC0-1.0
<description>Mastering Math Series 2: Circus Math (A-109 version 1.0)</description>
<year>1984</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-109" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Tim Heap" />
+ <info name="programmer" value="Peter Fuglestad" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234801">
<rom name="circus math v1.0.woz" size="234801" crc="441d4b88" sha1="485b232fedc0c90f8c7c8e11ea68e9cc31d430d8" />
@@ -28592,12 +25905,17 @@ license:CC0-1.0
<year>1984</year>
<publisher>MECC</publisher>
<info name="partno" value="A-109" />
- <info name="developer" value="MECC" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Charles Erickson" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Tim Heap" />
+ <info name="programmer" value="Peter Fuglestad" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-10-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345309">
<rom name="circus math 800k.woz" size="1345309" crc="e676033e" sha1="f12e92bd54cbfb5bfb37181b8106031fb1a43feb" />
@@ -28614,8 +25932,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-15-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234776">
<rom name="addition logician v1.0.woz" size="234776" crc="8c18aea7" sha1="ec0c272033dbb3b6c0235b5fff7bcfa194c4bea1" />
@@ -28632,8 +25950,8 @@ license:CC0-1.0
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345307">
<rom name="addition logician 800k.woz" size="1345307" crc="bcdb5108" sha1="6c732b0b5067fd9305d76a37a98071e2c62fd40e" />
@@ -28645,13 +25963,19 @@ license:CC0-1.0
<description>Mastering Math Series 4: Space Subtraction (A-145 version 1.0)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-145" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Charles Haberman" />
+ <info name="programmer" value="Jay Miller" />
+ <info name="programmer" value="Jon Clauson" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234776">
<rom name="space subtraction v1.0.woz" size="234776" crc="7d14fcef" sha1="31a2ddfca98b5e36219ea40d194e747c26461227" />
@@ -28668,8 +25992,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234778">
<rom name="subtraction puzzles v1.0.woz" size="234778" crc="1d963eea" sha1="c7f6824c3b021851332b50b16f3d8baa44540642" />
@@ -28686,8 +26010,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234812">
<rom name="multiplication puzzles v1.0.woz" size="234812" crc="a3e348ab" sha1="21e2538ba892f887e414733e88709afafb0ea9b0" />
@@ -28704,8 +26028,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234773">
<rom name="quotient quest v1.0.woz" size="234773" crc="fbae3f5c" sha1="3f20307128fcfd1362ada613557920de54af6281" />
@@ -28713,17 +26037,37 @@ license:CC0-1.0
</part>
</software>
+ <software name="mmdiagsys">
+ <description>Mastering Math Series: Diagnostic System (A-149 version 1.2) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-149" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345304">
+ <rom name="mastering math diagnostic system v1.2 800k.woz" size="1345304" crc="a60b1d1e" sha1="5ee554e8a38d81a88f9b04c6d5905db657999935" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mmwrkshtgen">
<description>Mastering Math Series: Worksheet Generator (A-151 version 1.1) (800K 3.5")</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-151" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Paul Wenker" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-03-02-->
- <!--educational program-->
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345332">
<rom name="mastering math worksheet generator 800k.woz" size="1345332" crc="9cf3e194" sha1="12bd756088f5b5ea6b5a118ddd1d173ba9d000af" />
@@ -28736,13 +26080,14 @@ license:CC0-1.0
<year>1984</year>
<publisher>Scarborough Systems</publisher>
<info name="original_publisher" value="Lightning Software" />
- <info name="programmer" value="Bruce Zweig and Don Park" />
+ <info name="programmer" value="Bruce Zweig" />
+ <info name="programmer" value="Don Park" />
<info name="usage" value="Requires a 128K Apple //e or later." />
- <!--Uses double hi-res graphics.-->
+ <!-- Uses double hi-res graphics. -->
<info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-02-06-->
- <!--educational game-->
+ <!-- Dump released: 2020-02-06 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241632">
<rom name="mastertype v2.1.woz" size="241632" crc="2e3f25b3" sha1="944ee9e263ce5cceee795ede0dd5d8829d26cb15" />
@@ -28750,6 +26095,301 @@ license:CC0-1.0
</part>
</software>
+ <software name="matchup">
+ <description>Match Up!</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="programmer" value="Debora Cole-Kupperstein, M.S. Ed." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234790">
+ <rom name="match up.woz" size="234790" crc="1de98eb8" sha1="2b4dc063662364087b1904ecc6271cac90749911" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathnme">
+ <description>Math and Me (version 1.6) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.6" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296160">
+ <rom name="math and me v1.6 800k.woz" size="1296160" crc="7b21f4c3" sha1="ffcadcec7f45021c1a694e704ddc167896cbcb7f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathblst">
+ <description>Math Blaster! (version 06.01.87) (800K 3.5")</description>
+ <year>1983</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="06.01.87" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1328983">
+ <rom name="math blaster 800k.woz" size="1328983" crc="800e565e" sha1="a490cc0adfeb5206657436ab635edd5846e1e80c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltmy">
+ <description>Math Blaster Mystery (version 1.3) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="Anne Hertz" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="Larene Wade Spitler" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296755">
+ <rom name="math blaster mystery v1.3 800k.woz" size="1296755" crc="f8e33137" sha1="065496edb5d9295aee6648dc61c1673170f0d44e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbltpl">
+ <description>Math Blaster Plus! (version 3.7) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="3.7" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1328988">
+ <rom name="math blaster plus v3.7 800k.woz" size="1328988" crc="fa6eebf3" sha1="985f733c100d6131b2dbe6b9bce00f0e0844280b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthconc2">
+ <description>Math Concepts II (version 10.04.85)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.04.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234782">
+ <rom name="math concepts ii v10.04.85.woz" size="234782" crc="15df158c" sha1="364fcde520748be8fa08d802d90817c1b1c521c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthnutsh">
+ <description>Math in a Nutshell</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234753">
+ <rom name="math in a nutshell.woz" size="234753" crc="06ee96fc" sha1="eb3e8228b0da074d244da176942a5667d824fc2c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathman">
+ <description>Math Man</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Applied Systems Knowledge" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="math man.woz" size="234768" crc="cb865fc4" sha1="5f99c6a876b63c81aa17eabaf79d54ac87a66dc3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthmrvls">
+ <description>Math Marvels</description>
+ <year>1984</year>
+ <publisher>Houghton Mifflin</publisher>
+ <info name="programmer" value="Doug Super" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="math marvels.woz" size="234763" crc="c410b069" sha1="9b27f63eba00ad1cfa5022b89852ac8d144d9f36" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mthmstrs">
+ <description>Math Masters</description>
+ <year>1984</year>
+ <publisher>Houghton Mifflin</publisher>
+ <info name="programmer" value="Doug Super" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="math masters.woz" size="234763" crc="be91c141" sha1="7aa4694953243d4c56c4d08ab3803e80e64e735e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathrabt10" cloneof="mathrabt">
+ <description>Math Rabbit (version 1.0)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Analee Nunan" />
+ <info name="programmer" value="Aaron Weiss" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241458">
+ <rom name="math rabbit v1.0.woz" size="241458" crc="43db56a4" sha1="7b9bc6bce7a7fb07714d327969d826eda73cd1dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathrabt11" cloneof="mathrabt">
+ <description>Math Rabbit (version 1.1)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Analee Nunan" />
+ <info name="programmer" value="Aaron Weiss" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241458">
+ <rom name="math rabbit v1.1.woz" size="241458" crc="07d011df" sha1="9145d440655368eca17b59ab8d850ff24e6b3714" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathrabt">
+ <description>Math Rabbit (version 1.3) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Analee Nunan" />
+ <info name="programmer" value="Aaron Weiss" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296204">
+ <rom name="math rabbit 800k.woz" size="1296204" crc="92d6a324" sha1="eff164d131db23346afa189c667d215153f9c911" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathshop">
+ <description>Math Shop (version 1986-10-27)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alice Wyman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1986-10-27" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234767">
+ <rom name="math shop side a.woz" size="234767" crc="a01fe9c2" sha1="288818f08c81c88ebb586833979359538962f339" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234767">
+ <rom name="math shop side b.woz" size="234767" crc="16ad0c32" sha1="6f882fdea5fe7655cf26beccf82e8a6d886b7fa7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mshopjr">
+ <description>Math Shop Jr.</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235555">
+ <rom name="math shop jr. - disk 1, side a.woz" size="235555" crc="fba369c4" sha1="c840eaf0ba5153253604ed141a0c5c469c13ef46" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235555">
+ <rom name="math shop jr. - disk 1, side b.woz" size="235555" crc="b0dfa607" sha1="695dceddc3cbe88cba85c7a420545fcab07784e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msslwtm">
+ <description>Math Shop Spotlight: Weights &amp; Measures</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="programmer" value="Nadine Browning" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234814">
+ <rom name="math shop spotlight- weights and measures.woz" size="234814" crc="daaae88b" sha1="6fae30ec47da0354b840419f57fa9c9ac8cd244a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mathwp1">
<description>Math Word Problems Volume 1: Careers (800K 3.5")</description>
<year>1988</year>
@@ -28757,8 +26397,8 @@ license:CC0-1.0
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296152">
<rom name="math word problems volume 1- careers 800k.woz" size="1296152" crc="c9ac920d" sha1="9a72606a6343cde085283256e826f99674146e3f" />
@@ -28773,8 +26413,8 @@ license:CC0-1.0
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296150">
<rom name="math word problems volume 2- money 800k.woz" size="1296150" crc="29cbacb8" sha1="a0696ad59226a4666e122da2d79d56d4c8ee2b89" />
@@ -28789,8 +26429,8 @@ license:CC0-1.0
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296177">
<rom name="math word problems volume 3- sports 800k.woz" size="1296177" crc="72220750" sha1="2900d80eabf9f35c1f8cde4a39eec151d9960ce1" />
@@ -28805,8 +26445,8 @@ license:CC0-1.0
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296151">
<rom name="math word problems volume 4- travel 800k.woz" size="1296151" crc="ccc792a6" sha1="f317ad78b4bf42439ab301feaa6cd7bfc3f31e02" />
@@ -28819,12 +26459,12 @@ license:CC0-1.0
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="alt_title" value="Stickybear Math Word Problems: Our Nation's Capital Washington D.C." />
- <!--From title screen-->
+ <!-- From title screen -->
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296179">
<rom name="math word problems volume 6- our nation's capital washington dc 800k.woz" size="1296179" crc="1fde4272" sha1="702d7569430d96e8535303c300f245646961bc41" />
@@ -28832,6 +26472,165 @@ license:CC0-1.0
</part>
</software>
+ <software name="magpyrpuz">
+ <description>Mathematics Action Games: Pyramid Puzzler</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Scott, Foresman and Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234776">
+ <rom name="pyramid puzzler.woz" size="234776" crc="993090b9" sha1="0f509573fc7f1eaa0fedd8cd19a3aa03217fc898" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv1grle">
+ <description>Mathematics Volume 1: Graphing, Logic, and Equations (A-706 version 3.2)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-706" />
+ <info name="programmer" value="Greg Thornton" />
+ <info name="programmer" value="Joe Demuth" />
+ <info name="programmer" value="Darrell Ricke" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Peter Arcand" />
+ <info name="programmer" value="Todd Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="3.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241491">
+ <rom name="mathematics volume 1- graphing v3.2.woz" size="241491" crc="98e612b1" sha1="e2c912253031eecaef450a664bc671ab8d34c20c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv2meas">
+ <description>Mathematics Volume 2: Measurement (A-737 version 1.2)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-737" />
+ <info name="programmer" value="Tom Boe" />
+ <info name="programmer" value="Russ Erickson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241472">
+ <rom name="mathematics volume 2- measurement v1.2.woz" size="241472" crc="4d73165b" sha1="0f5643f30b0a795748ac44a0afb96d0ef630ba7c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv3geolb" cloneof="mv3geo">
+ <description>Mathematics Volume 3: Geometry (Formulas, Shapes, and Skills) (A-738 version 1.3) (limited boot backup)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-738" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <!-- Limited boot backup will self-destruct after 50 boots. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234865">
+ <rom name="mathematics volume 3- geometry v1.3 (limited boot backup).woz" size="234865" crc="6dde6c03" sha1="e6e0f5b51bc4ce9c54f41bf02e66de5e5493abdf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mv3geo">
+ <description>Mathematics Volume 3: Geometry (Formulas, Shapes, and Skills) (A-738 version 1.3)</description>
+ <year>1981</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-738" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241500">
+ <rom name="mathematics volume 3- geometry v1.3.woz" size="241500" crc="bed9c7ff" sha1="412ccc65488143f4570a332b132459513e76d431" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathwdpg2">
+ <description>Mathematics Word Problems Grade 2</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="mathematics word problems grade 2.woz" size="234784" crc="7b34963e" sha1="72aaf40389fb10da86f9242db56d5dd1a8876a1a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathwdpg3">
+ <description>Mathematics Word Problems Grade 3</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="mathematics word problems grade 3.woz" size="234784" crc="9b5288cc" sha1="f4ae579172e956b59cea78fa41aef1a737842529" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathwdpg7" supported="no">
+ <description>Mathematics Word Problems Grade 7</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234817">
+ <rom name="mathematics word problems grade 7.woz" size="234817" crc="011230a1" sha1="08d5ee78ab501a3808cbb41c6b9f174bb0ac1482" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathwdpg8">
+ <description>Mathematics Word Problems Grade 8</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="mathematics word problems grade 8.woz" size="234784" crc="654f7245" sha1="bc1e7dbbceb510c69a0f5d45364d919b57a52f30" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="msaurcomp">
<description>Mathosaurus: Computation</description>
<year>1989</year>
@@ -28839,8 +26638,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234790">
<rom name="mathosaurus- computation.woz" size="234790" crc="2e275172" sha1="262ba4c9e8ab922999f81c9e7d1afe107ea01b91" />
@@ -28848,50 +26647,193 @@ license:CC0-1.0
</part>
</software>
- <software name="mdqpres11" cloneof="mdqpres">
- <description>MECC Dataquest: The Presidents (A-140 version 1.1)</description>
- <year>1985</year>
- <publisher>MECC</publisher>
- <info name="partno" value="A-140" />
+ <software name="msaurkind">
+ <description>Mathosaurus: Kindergarten</description>
+ <year>1989</year>
+ <publisher>Micrograms Publishing</publisher>
+ <info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
- <info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234805">
- <rom name="mecc dataquest- the presidents v1.1 side a.woz" size="234805" crc="474553d5" sha1="9a6e9b4d2f1a2abc56f2344afb5eeed17194bc26" />
+ <dataarea name="flop" size="234744">
+ <rom name="mathosaurus- kindergarten.woz" size="234744" crc="4f92163e" sha1="a7312415ff147daec8915f65c5ef665d04da9868" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234805">
- <rom name="mecc dataquest- the presidents v1.1 side b.woz" size="234805" crc="0918cfff" sha1="0648dea58422b86c7a8472e8d8614177825c3a7f" />
+ </software>
+
+ <software name="measwork_525" cloneof="measwork">
+ <description>Measure Works (A-246 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-246" />
+ <info name="programmer" value="Elizabeth Bell" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234858">
+ <rom name="measure works.woz" size="234858" crc="030dacd4" sha1="a3bce72c165e9b01bea694cf6cfb17b6fdcc629a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="measwork">
+ <description>Measure Works (A-246 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-246" />
+ <info name="programmer" value="Elizabeth Bell" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345404">
+ <rom name="measure works 800k.woz" size="1345404" crc="68cc8280" sha1="5013cbe2b843498322578e4cc8e2f413875e07e2" />
</dataarea>
</part>
</software>
- <software name="mdqpres">
- <description>MECC Dataquest: The Presidents (A-140 version 1.2)</description>
+ <software name="measecon">
+ <description>Measuring Economic Activity</description>
<year>1985</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Mark D. Rothman, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241478">
+ <rom name="measuring economic activities.woz" size="241478" crc="540a5aec" sha1="0f6cc2caf1bce855b77a1534a13df50074ce098d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mappled1">
+ <description>MECC Apple Demonstration: Volume 1 (A-701 version 1.1)</description>
+ <year>1980</year>
<publisher>MECC</publisher>
- <info name="partno" value="A-140" />
- <info name="usage" value="Requires a 64K Apple ][+ or later." />
- <info name="version" value="1.2" />
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-701" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234805">
- <rom name="mecc dataquest- the presidents v1.2 side a.woz" size="234805" crc="6e3d2c1b" sha1="46e45f560d98fcd300224659608c65c6b463dcaa" />
+ <dataarea name="flop" size="234825">
+ <rom name="mecc apple demonstration volume 1 v1.1.woz" size="234825" crc="4f00b238" sha1="b3599d50ce1714cc8bea9d6446e05a1dd55e9594" />
</dataarea>
</part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B" />
- <dataarea name="flop" size="234805">
- <rom name="mecc dataquest- the presidents v1.2 side b.woz" size="234805" crc="23bcdad9" sha1="9c4c5bafeb5f3401a278fca30b919b548d15a6e5" />
+ </software>
+
+ <software name="mcopyslu">
+ <description>MECC Copy System / Label Utility (A-7013 version 3.0) (800K 3.5")</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-7013" />
+ <info name="programmer" value="Craig W. Copley" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="Michael V. Stein" />
+ <info name="programmer" value="Paul R. Wenker" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, a 128K //e or 64K ][+ with a compatible drive controller card." />
+ <info name="version" value="3.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296240">
+ <rom name="mecc copy system - label utility v3.0 800k.woz" size="1296240" crc="2c3ccafa" sha1="77a0e963d397bb6c18ce8fa28727a35770bd5a7a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqeursu">
+ <description>MECC Dataquest: Europe and the Soviet Union (A-253 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-253" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="mecc dataquest- europe and soviet union v1.0.woz" size="234815" crc="621b13b8" sha1="753b7c954fa6efc00635aabf8090916d0d7ebf7e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqlatina">
+ <description>MECC Dataquest: Latin America (A-243 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-243" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="mecc dataquest- latin america v1.0.woz" size="234801" crc="5a8fcffb" sha1="05d8f27ca3ef4a3ed4209896a7963df93a48518a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqnamam">
+ <description>MECC Dataquest: North American Mammals (A-250 version 1.1)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-250" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="mecc dataquest- north american mammals v1.1.woz" size="234810" crc="c137c398" sha1="4266b7f7d9e753bb29998343912788460c262d2b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdqmidenaf">
+ <description>MECC Dataquest: The Middle East and North Africa (A-244 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-244" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234816">
+ <rom name="mecc dataquest- middle east and north africa v1.0.woz" size="234816" crc="70ec9f6a" sha1="ee827a254969f42fc3a498099477028e1bf4cdf9" />
</dataarea>
</part>
</software>
@@ -28900,13 +26842,17 @@ license:CC0-1.0
<description>MECC Early Learning Series: Arithmetic Critters (A-166 version 1.0)</description>
<year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-166" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Robert J. Granvin" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Loren Sucher" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234809">
<rom name="arithmetic critters v1.0.woz" size="234809" crc="ad004a17" sha1="2dbf87feabeccfc6807069171a8b0e29e4196ef6" />
@@ -28918,13 +26864,17 @@ license:CC0-1.0
<description>MECC Early Learning Series: Arithmetic Critters (A-166 version 1.0) (800K 3.5")</description>
<year>1986</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-166" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Robert J. Granvin" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Loren Sucher" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-08-06 Redumped: 2021-12-14-->
- <!--educational program-->
+ <!-- Dump released: 2021-08-06 Redumped: 2021-12-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345310">
<rom name="arithmetic critters 800k.woz" size="1345310" crc="74b14b19" sha1="7b7eeb909cbdc1de88a346d2657429c82fda17c8" />
@@ -28936,13 +26886,17 @@ license:CC0-1.0
<description>MECC Early Learning Series: Counting Critters (A-165 version 1.0)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-165" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Robert J. Granvin" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Loren Sucher" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234776">
<rom name="counting critters v1.0.woz" size="234776" crc="83110c9b" sha1="8a9d33e555c289c261a5020fa3e2d747d2151651" />
@@ -28950,17 +26904,44 @@ license:CC0-1.0
</part>
</software>
+ <software name="melflfun">
+ <description>MECC Early Learning Series: First-Letter Fun (A-154 version 1.1) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-154" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Diane Spiegel" />
+ <info name="programmer" value="Tim Anderson" />
+ <info name="programmer" value="Jim Bullis" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345314">
+ <rom name="first-letter fun 800k.woz" size="1345314" crc="d7cafd9b" sha1="1bc9a26fb0273a85689e2ba94afde41b6c0e2f3a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="melfunaz_525" cloneof="melfunaz">
<description>MECC Early Learning Series: Fun from A to Z (A-164 version 1.0)</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-164" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234774">
<rom name="fun from a to z v1.0.woz" size="234774" crc="d57016f2" sha1="a67f38e5902073441677389a85411b15d13171e6" />
@@ -28972,13 +26953,16 @@ license:CC0-1.0
<description>MECC Early Learning Series: Fun from A to Z (A-164 version 1.0) (800K 3.5")</description>
<year>1985</year>
<publisher>MECC</publisher>
- <info name="developer" value="MECC" />
<info name="partno" value="A-164" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296153">
<rom name="fun from a to z 800k.woz" size="1296153" crc="cf7bac85" sha1="386aed582de7aad50607a367ef862b18f1d6cbb8" />
@@ -28986,20 +26970,4150 @@ license:CC0-1.0
</part>
</software>
- <software name="mkeybdmas10">
- <description>MECC Keyboarding Master: Games and Drills (Student Program) (A-131 version 1.0)</description>
- <year>1985</year>
+ <software name="melpatt10" cloneof="melpatt">
+ <description>MECC Early Learning Series: Patterns (A-227 version 1.0)</description>
+ <year>1988</year>
<publisher>MECC</publisher>
- <info name="developer" value="TIES" />
- <info name="partno" value="A-131" />
+ <info name="partno" value="A-227" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Larry Phenow" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-22-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="234775">
- <rom name="keyboarding master v1.0.woz" size="234775" crc="cb33bd28" sha1="3a1899634a7ba0820058bfb04fa764583a9058c2" />
+ <dataarea name="flop" size="234920">
+ <rom name="patterns v1.0.woz" size="234920" crc="cf7d086b" sha1="19e0fda0d137589435383bd36a971dafb60c75ec" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpatt">
+ <description>MECC Early Learning Series: Patterns (A-227 version 1.2) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-227" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Rich Childers" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345428">
+ <rom name="patterns 800k.woz" size="1345428" crc="ea122ddf" sha1="6ef212569447246e7c69d116e507621844cdd7f0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpictc_525" cloneof="melpictc">
+ <description>MECC Early Learning Series: Picture Chompers (A-255 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-255" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Liz Wendland" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-25 redumped: 2020-06-10 to correct metadata. -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop1" size="234914">
+ <rom name="picture chompers.woz" size="234914" crc="6970dced" sha1="b1a127b8f4111b91c597172b65e18ead518d3b0f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melpictc">
+ <description>MECC Early Learning Series: Picture Chompers (A-255 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-255" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Liz Wendland" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344397">
+ <rom name="picture chompers 800k.woz" size="1344397" crc="091ff1cf" sha1="678756bb9076214eed6ad491e614cf0a135629ac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmgaz">
+ <description>MECC Grammar Series: Grammar Gazette (A-273 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-273" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Dee Dee Roedel" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345380">
+ <rom name="grammar gazette 800k.woz" size="1345380" crc="38497f73" sha1="443db0fcdea30c0722efca9d0af540118c7800e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmgob_525" cloneof="mgsgrmgob">
+ <description>MECC Grammar Series: Grammar Gobble (A-306 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-306" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="David Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="grammar gobble.woz" size="234821" crc="8bdecc6e" sha1="a7d72975646978b2697fc4a048113fd75d78fcd3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmgob">
+ <description>MECC Grammar Series: Grammar Gobble (A-306 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-306" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="David Wood" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296214">
+ <rom name="grammar gobble 800k.woz" size="1296214" crc="addb6584" sha1="123ccf52672c13a4525a52da29f1af333deafee5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmmad_525" cloneof="mgsgrmmad">
+ <description>MECC Grammar Series: Grammar Madness (A-307 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-307" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="grammar madness.woz" size="234836" crc="5988fa14" sha1="3a7e1f648521ff82cf9208c30e95e2fc8cf90e45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmmad">
+ <description>MECC Grammar Series: Grammar Madness (A-307 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-307" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296229">
+ <rom name="grammar madness 800k.woz" size="1296229" crc="9aeb501e" sha1="52ee1d264901cdcbf905954734346a42ac91ec55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmmon">
+ <description>MECC Grammar Series: Grammar Monsters (A-272 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-272" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John R. Ojanen" />
+ <info name="programmer" value="Elizabeth T. Wendland" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345404">
+ <rom name="grammar monsters 800k.woz" size="1345404" crc="3b698dad" sha1="dda51c494309bdd9afd64a1ac3e87ef1c379ad1f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmtoys_525" cloneof="mgsgrmtoys">
+ <description>MECC Grammar Series: Grammar Toy Shop (A-271 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-271" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234868">
+ <rom name="grammar toy shop.woz" size="234868" crc="4534fe62" sha1="9188f8776850a2d5faeb188453ae0e1616e47f92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mgsgrmtoys">
+ <description>MECC Grammar Series: Grammar Toy Shop (A-271 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-271" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Stephen Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344902">
+ <rom name="grammar toy shop 800k.woz" size="1344902" crc="b84c9b6c" sha1="580bccd171d9c1fb294b7d5ed30f42971f6001c1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhirestk">
+ <description>MECC Hi-Res Toolkit (A-105 version 1.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-105" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234705">
+ <rom name="mecc hi-res toolkit v1.0.woz" size="234705" crc="ebac8dbd" sha1="1e7c18fdbc6b6762dfcd3a385c07e40716f6bc27" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moutline_525" cloneof="moutline">
+ <description>MECC Outliner (A-228 version 1.0)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-228" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234900">
+ <rom name="mecc outliner v1.0.woz" size="234900" crc="7a63c166" sha1="a732682e502f6b9674952e6bff9d5634ceda384d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moutline">
+ <description>MECC Outliner (A-228 version 1.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-228" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1343863">
+ <rom name="mecc outliner v1.0 800k.woz" size="1343863" crc="39b7dfb5" sha1="81f9e5b95b50ba49f7629d718921ca65983edf92" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptbd_525" cloneof="mrcpptbd">
+ <description>MECC Reading Collection: Phonics Prime Time: Blends and Digraphs (A-179 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-179" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="phonics prime time- blends and digraphs.woz" size="234791" crc="86e7a0c1" sha1="19333f3a00e6fac4ee1b6e91ab951ca7ccf21c6f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptbd">
+ <description>MECC Reading Collection: Phonics Prime Time: Blends and Digraphs (A-179 version 1.0) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-179" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344305">
+ <rom name="phonics prime time- blends and digraphs 800k.woz" size="1344305" crc="7725208a" sha1="4b75878f1aa07f1aac3bf7daea6754553e6055b4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptfc">
+ <description>MECC Reading Collection: Phonics Prime Time: Final Consonants (A-176 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-176" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Roger Seeling" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="phonics prime time- final consonants.woz" size="234788" crc="7e29b4e0" sha1="0592eaf95d283ae3ee7bdde5358533a3bd72b669" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptic">
+ <description>MECC Reading Collection: Phonics Prime Time: Initial Consonants (A-175 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-175" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Roger Seeling" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240934">
+ <rom name="phonics prime time- initial consonants.woz" size="240934" crc="6bc33509" sha1="e84f8158dc990db0b9063d4e91e38485179c810a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptv1">
+ <description>MECC Reading Collection: Phonics Prime Time: Vowels I (A-177 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-177" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234780">
+ <rom name="phonics prime time- vowels i.woz" size="234780" crc="89926d5d" sha1="11c90bce1a4d281872c0a5eebab8b99accbe212e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcpptv2">
+ <description>MECC Reading Collection: Phonics Prime Time: Vowels II (A-178 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-178" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="phonics prime time- vowels ii.woz" size="234781" crc="f1146223" sha1="13918c0f3ec2bfd519c031a4bf29fb824690a2c3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm1">
+ <description>MECC Reading Collection: Those Amazing Reading Machines I (A-185 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-185" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="those amazing reading machines i.woz" size="234784" crc="c1f668af" sha1="87186ef105f5f4f32938b3e3244339968c087212" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm2">
+ <description>MECC Reading Collection: Those Amazing Reading Machines II (A-186 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-186" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="those amazing reading machines ii.woz" size="234785" crc="93e7b4f3" sha1="fff19dc2da9ab2aaaae77e8490ee11143b00666d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm3">
+ <description>MECC Reading Collection: Those Amazing Reading Machines III (A-187 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-187" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="those amazing reading machines iii.woz" size="234786" crc="9f803984" sha1="a36039d301953112003dea3a44c813ddd4a3a152" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrctarm4">
+ <description>MECC Reading Collection: Those Amazing Reading Machines IV (A-188 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-188" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="those amazing reading machines iv.woz" size="234810" crc="592ee96d" sha1="0c08795604e54300e1119b00d92b0311d24342d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwcit">
+ <description>MECC Reading Collection: Words at Work: Compound It! (A-183 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-183" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="words at work- compound it.woz" size="234779" crc="e076fe01" sha1="7c0c38a65f8eeccd7373033903fbb4f21290f2a5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwcact">
+ <description>MECC Reading Collection: Words at Work: Contraction Action (A-180 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-180" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="words at work- contraction action.woz" size="234785" crc="6305aed4" sha1="18e58310b4c06bcd74f74c9e0e31cce52053e223" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwpp">
+ <description>MECC Reading Collection: Words at Work: Prefix Power (A-181 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-181" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="words at work- prefix power.woz" size="234779" crc="0bcad4b8" sha1="b9e5d2eaa67821122576080e495209f92cb46589" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcwwss">
+ <description>MECC Reading Collection: Words at Work: Suffix Sense (A-182 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-182" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="words at work- suffix sense.woz" size="234779" crc="f60376e0" sha1="c1a228d277ce5f8351d9d1bc168f0586cc33d158" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicbybird_525" cloneof="msicbybird">
+ <description>MECC Science Inquiry Collection: Backyard Birds (A-216 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-216" />
+ <info name="programmer" value="Hassan Kaganda" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234872">
+ <rom name="backyard birds.woz" size="234872" crc="e4045b4e" sha1="8dcd3c0b1a7dfd93bc456284e316ba6c73f53873" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicbybird">
+ <description>MECC Science Inquiry Collection: Backyard Birds (A-216 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-216" />
+ <info name="programmer" value="Hassan Kaganda" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-09 Redumped: 2021-12-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345386">
+ <rom name="backyard birds 800k.woz" size="1345386" crc="1929bb55" sha1="12a3cee293e0d96e7bf4d2928ef1dd14e60a8514" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msiccavb_525" cloneof="msiccavb">
+ <description>MECC Science Inquiry Collection: Cavity Busters (A-284 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-284" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Eileen Nannen" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241539">
+ <rom name="cavity busters.woz" size="241539" crc="6cd640b3" sha1="fb7432c0dd5a894c7daef8811acdb8ba74be0b42" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msiccavb">
+ <description>MECC Science Inquiry Collection: Cavity Busters (A-284 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-284" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Eileen Nannen" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-08-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345380">
+ <rom name="cavity busters v1.0 800k.woz" size="1345380" crc="df48eddf" sha1="57fea0f55a8aace36a7cc5630ba30cdaad569bdb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicclnd_525" cloneof="msicclnd">
+ <description>MECC Science Inquiry Collection: Cleanwater Detectives (A-282 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-282" />
+ <info name="programmer" value="Vincent J. Erickson" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234852">
+ <rom name="cleanwater detectives.woz" size="234852" crc="9c78798e" sha1="28cd9843860f74cad155cca29a2a26e37fb0dd38" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicclnd">
+ <description>MECC Science Inquiry Collection: Cleanwater Detectives (A-282 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-282" />
+ <info name="programmer" value="Vincent J. Erickson" />
+ <info name="programmer" value="John Ojanen" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345366">
+ <rom name="cleanwater detectives 800k.woz" size="1345366" crc="051bbdd2" sha1="64306906c5ea53e08c80f86d56eb1840e15f0277" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msic5stf_525" cloneof="msic5stf">
+ <description>MECC Science Inquiry Collection: Five-Star Forecast (A-219 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-219" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241518">
+ <rom name="five-star forecast.woz" size="241518" crc="ef0a9397" sha1="1578ed153cfb76364ef4fbb280bcb1159a7829b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msic5stf">
+ <description>MECC Science Inquiry Collection: Five-Star Forecast (A-219 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-219" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345383">
+ <rom name="five-star forecast 800k.woz" size="1345383" crc="cbe6bd01" sha1="d5465440ebfd32a4dbaff68970e6c07f4e1eaee4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicfosh_525" cloneof="msicfosh">
+ <description>MECC Science Inquiry Collection: Fossil Hunter (A-220 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-220" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234819">
+ <rom name="fossil hunter.woz" size="234819" crc="e3dee6e4" sha1="a7247caa992d400d9df2424bde33602a6e3a71dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicfosh">
+ <description>MECC Science Inquiry Collection: Fossil Hunter (A-220 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-220" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345365">
+ <rom name="fossil hunter 800k.woz" size="1345365" crc="073092dd" sha1="33f3dd361e2ffb11d942d8137e206cf10b2f410a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicinvb10_525" cloneof="msicinvb">
+ <description>MECC Science Inquiry Collection: Invisible Bugs (A-218 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-218" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241528">
+ <rom name="invisible bugs.woz" size="241528" crc="8232ec2d" sha1="c5e07824a0d8e378d7210fc50b8c459c84e4581f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicinvb10" cloneof="msicinvb">
+ <description>MECC Science Inquiry Collection: Invisible Bugs (A-218 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-218" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345369">
+ <rom name="invisible bugs v1.0 800k.woz" size="1345369" crc="6436c067" sha1="3f2a40ffcb33f94b60e5148d570aef5b91756af3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicinvb">
+ <description>MECC Science Inquiry Collection: Invisible Bugs (A-218 version 1.1) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-218" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345371">
+ <rom name="invisible bugs 800k.woz" size="1345371" crc="3b4cda38" sha1="d09e11869b38650d70273e9c675d3b7b01417ccc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msiclung10" cloneof="msiclung">
+ <description>MECC Science Inquiry Collection: Lunar Greenhouse (A-215 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-215" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234824">
+ <rom name="lunar greenhouse.woz" size="234824" crc="418d7ad6" sha1="a78e4f6ebda70b5d41acc30543c6dc1204d3dfed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msiclung">
+ <description>MECC Science Inquiry Collection: Lunar Greenhouse (A-215 version 1.1) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-215" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345370">
+ <rom name="lunar greenhouse 800k.woz" size="1345370" crc="3048dafc" sha1="4faa14a6eb582ee8cc5c3c94f834fb81a62ee80b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicminc_525" cloneof="msicminc">
+ <description>MECC Science Inquiry Collection: Miner's Cave (A-213 version 1.0)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-213" />
+ <info name="programmer" value="Dean Brown" />
+ <info name="programmer" value="Bob Eggers" />
+ <info name="programmer" value="Matt Osber" />
+ <info name="programmer" value="Susan Christie Thomas" />
+ <info name="programmer" value="Peter Dublin" />
+ <info name="programmer" value="Gary Fujiwara" />
+ <info name="programmer" value="Mildred Feloney" />
+ <info name="programmer" value="Herbert Fox" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234907">
+ <rom name="miner's cave.woz" size="234907" crc="8920ad2a" sha1="906bc19a5ac0d273fea0b45aa370276c332691e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicminc">
+ <description>MECC Science Inquiry Collection: Miner's Cave (A-213 version 1.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-213" />
+ <info name="programmer" value="Dean Brown" />
+ <info name="programmer" value="Bob Eggers" />
+ <info name="programmer" value="Matt Osber" />
+ <info name="programmer" value="Susan Christie Thomas" />
+ <info name="programmer" value="Peter Dublin" />
+ <info name="programmer" value="Gary Fujiwara" />
+ <info name="programmer" value="Mildred Feloney" />
+ <info name="programmer" value="Herbert Fox" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345428">
+ <rom name="miner's cave 800k.woz" size="1345428" crc="27c9761b" sha1="12fe0eaba09961508fb0efdb677effd4ee1408e4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmurm_525" cloneof="msicmurm">
+ <description>MECC Science Inquiry Collection: Murphy's Minerals (A-221 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-221" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234840">
+ <rom name="murphy's minerals.woz" size="234840" crc="ee7de57d" sha1="4eba941e3b4a558c336c3930ccb138de1c51dc28" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmurm">
+ <description>MECC Science Inquiry Collection: Murphy's Minerals (A-221 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-221" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345386">
+ <rom name="murphy's minerals 800k.woz" size="1345386" crc="5752411a" sha1="617a843f287da864f419a266c5cb6440d822d070" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmymat10" cloneof="msicmymat">
+ <description>MECC Science Inquiry Collection: Mystery Matter (A-212 version 1.0)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-212" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234889">
+ <rom name="mystery matter v1.0.woz" size="234889" crc="84fb30ba" sha1="6f1008d961dfa34ce40949f23ec83b4f44c9483f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmymat">
+ <description>MECC Science Inquiry Collection: Mystery Matter (A-212 version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-212" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345413">
+ <rom name="mystery matter 800k.woz" size="1345413" crc="b2228c7a" sha1="46b9bdeb93383f7025476f18670e5dc60560acda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmyobj10" cloneof="msicmyobj">
+ <description>MECC Science Inquiry Collection: Mystery Objects (A-211 version 1.0)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Liz Husebye" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234904">
+ <rom name="mystery objects v1.0.woz" size="234904" crc="4da9ea38" sha1="2c788d6c2dcfcd5d50c3f64bef3c2f57a10e4484" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicmyobj">
+ <description>MECC Science Inquiry Collection: Mystery Objects (A-211 version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Liz Husebye" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296217">
+ <rom name="mystery objects 800k.woz" size="1296217" crc="189fff3d" sha1="6609c90ff3edb6775d0595e958e8230bb52a874a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicppp_525" cloneof="msicppp">
+ <description>MECC Science Inquiry Collection: Paper Plane Pilot (A-281 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="programmer" value="Steve Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234873">
+ <rom name="paper plane pilot.woz" size="234873" crc="0773f7e8" sha1="7586aec28a4a64ab61e39ece12e3ed457327e741" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicppp">
+ <description>MECC Science Inquiry Collection: Paper Plane Pilot (A-281 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="programmer" value="Steve Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344370">
+ <rom name="paper plane pilot 800k.woz" size="1344370" crc="a422ed72" sha1="b8cda5fd41329ed56874ea28e2702a09ffad0c4d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicsuns_525" cloneof="msicsuns">
+ <description>MECC Science Inquiry Collection: Sun and Seasons (A-222 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Liz Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234822">
+ <rom name="sun and seasons.woz" size="234822" crc="53c20ac7" sha1="e7431c1b752be65e5aa03ae3906dc70f4b5e9886" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicsuns">
+ <description>MECC Science Inquiry Collection: Sun and Seasons (A-222 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-211" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Liz Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345368">
+ <rom name="sun and seasons 800k.woz" size="1345368" crc="5429b81f" sha1="6c126de6f3f1775a9170f78eed87bcf5d440560c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicweedt_525" cloneof="msicweedt">
+ <description>MECC Science Inquiry Collection: Weeds to Trees (A-217 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-217" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234840">
+ <rom name="weeds to trees.woz" size="234840" crc="22512a04" sha1="48e67347ef539f01eb6a4ef0c6596e5ca006e955" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicweedt">
+ <description>MECC Science Inquiry Collection: Weeds to Trees (A-217 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-217" />
+ <info name="programmer" value="R. Philip Bouchard" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345386">
+ <rom name="weeds to trees 800k.woz" size="1345386" crc="25579af3" sha1="6fc68a8dc56ba98bdf69e7e461fb187dbb8b27f2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwcral10" cloneof="msicwcral">
+ <description>MECC Science Inquiry Collection: Wood Car Rally (A-214 version 1.0)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-214" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234874">
+ <rom name="wood car rally v1.0.woz" size="234874" crc="8b408e80" sha1="0d0ef3a10f38adbe8311b4d17ebf20a3976fa739" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwcral">
+ <description>MECC Science Inquiry Collection: Wood Car Rally (A-214 version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-214" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Greg Holey" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345358">
+ <rom name="wood car rally v1.1 800k.woz" size="1345358" crc="e79f214d" sha1="a70873eea8be716c67c4eb07724005662567a65b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwboun_525" cloneof="msicwboun">
+ <description>MECC Science Inquiry Collection: Woolly Bounce (A-283 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-283" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kim D. Smith" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234839">
+ <rom name="woolly bounce v1.0.woz" size="234839" crc="0e7e1e71" sha1="559c452f4bf4388900cf6db6539f045772489634" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msicwboun">
+ <description>MECC Science Inquiry Collection: Woolly Bounce (A-283 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-283" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Kim D. Smith" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345371">
+ <rom name="woolly bounce 800k.woz" size="1345371" crc="7d634eb2" sha1="364f06610a0f4353ed0b2af9a948c9bbef1c9706" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellpuz">
+ <description>MECC Spelling Series: Spelling Puzzles and Tests (A-234 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-234" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345380">
+ <rom name="spelling puzzles and tests 800k.woz" size="1345380" crc="5014efeb" sha1="0ff5804b5e94c38a4c68554a770b15093ef5b7e5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellev">
+ <description>MECC Spelling Series: Spellevator (A-231 version 1.3) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-231" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Loren Sucher" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345422">
+ <rom name="spellevator 800k.woz" size="1345422" crc="7719568e" sha1="41bab7875e7c0b00f89e1302587f5c5ecf14bb5a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellpr">
+ <description>MECC Spelling Series: Spelling Press (A-232 version 1.1)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-232" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234884">
+ <rom name="spelling press v1.1.woz" size="234884" crc="67c25967" sha1="d3a72e002121b64120cf9e9a684abd92f4e01aef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspelltk">
+ <description>MECC Spelling Series: Spelling Series Toolkit (A-233 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-233" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Peggi Fritzler" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345467">
+ <rom name="spelling series toolkit 800k.woz" size="1345467" crc="facbd8c6" sha1="c775a3956e4fddec03b268e85c497b663144291a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msspellw">
+ <description>MECC Spelling Series: Spelling Workout (A-230 version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-230" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Vince Erickson" />
+ <info name="programmer" value="Charlyn Kapplinger" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Caren Stelson" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345463">
+ <rom name="spelling workout 800k.woz" size="1345463" crc="eeec1f34" sha1="6af97a6e930293c2c8fd5ed6f05a4f9ea274c0bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mechbrig">
+ <description>Mech Brigade (version 1.2)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Game and boot"/>
+ <dataarea name="flop" size="234793">
+ <rom name="mech brigade v1.2 side a - game disk.woz" size="234793" crc="dba7c41e" sha1="977679ac73527f83877bba3e81d0d2979f816c19" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario"/>
+ <dataarea name="flop" size="234797">
+ <rom name="mech brigade v1.2 side b - scenario disk.woz" size="234797" crc="88f79693" sha1="96b82b277c01b47bbf9b24b9476fbdffc4dcc8b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspresid">
+ <description>Medalist Series: Presidents (version 09.27.85)</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.27.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234827">
+ <rom name="medalist series - presidents v09.27.85.woz" size="234827" crc="369c40af" sha1="f26bd82747420160c23cce5d4a53fdcd0d874029" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="meetpres">
+ <description>Meet The Presidents (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Versa Computing" />
+ <info name="programmer" value="V. Bauman" />
+ <info name="programmer" value="S. Bernstein" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234768">
+ <rom name="meet the presidents (softsmith) disk 1.woz" size="234768" crc="e063cf8c" sha1="3ed00f146b363db7fc788738fadfb233fcd99fbf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234768">
+ <rom name="meet the presidents (softsmith) disk 2.woz" size="234768" crc="b3f02973" sha1="06cbdef1fcca83b030f8baf9fb22ce6d947522ac" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234768">
+ <rom name="meet the presidents (softsmith) disk 3.woz" size="234768" crc="cbb5c561" sha1="70c664bc7c870a0e9ed982371c457ae493ec3f35" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4" />
+ <dataarea name="flop" size="234768">
+ <rom name="meet the presidents (softsmith) disk 4.woz" size="234768" crc="83effce4" sha1="08e295985fe872a43d91c4ae32d6135f24584bda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memblbl86">
+ <description>Memory Building Blocks (version 1986)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Owen" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later and a Touch Window, add-on touchscreen." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234722">
+ <rom name="memory building blocks.woz" size="234722" crc="74cca823" sha1="40acd60fa7c83ccd4ef2fda177f041265d51a850" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memcastl">
+ <description>Memory Castle (version 1985)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234802">
+ <rom name="memory castle.woz" size="234802" crc="4392bcc7" sha1="76e4a3aac956c7acc5ed9383bf7e80b86b32241e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="metinspc">
+ <description>Meteoroids in Space</description>
+ <year>1981</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Bruce Wallace" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-04-08 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="48405">
+ <rom name="meteoroids in space.woz" size="48405" crc="7beb3c05" sha1="61cdb1028a091a7bd85ac636f1f29087b57b4426" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mckmgrdr">
+ <description>Mickey's Magic Reader</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Neil Larimer" />
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234824">
+ <rom name="mickey's magic reader.woz" size="234824" crc="e8373ccf" sha1="ff7126fe65a08b88f1b4c59db8bcb74e44558c94" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mickspca">
+ <description>Mickey's Space Adventure</description>
+ <year>1984</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Peter Oliphant" />
+ <info name="programmer" value="Robert Eric Heitman" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Jennifer Nelsen" />
+ <info name="programmer" value="Terry Pierce" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Annette Childs" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234942">
+ <rom name="mickey's space adventure - disk 1, side a.woz" size="234942" crc="0b4f70db" sha1="9b4f799ad6ab2ffcff9edac36f2c19eddf20b689" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234942">
+ <rom name="mickey's space adventure - disk 1, side b.woz" size="234942" crc="4213cb80" sha1="d5e2bd7b3dc7bd9a11b7e22f74da4da5848c4211" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234942">
+ <rom name="mickey's space adventure - disk 2, side a.woz" size="234942" crc="c035ffcc" sha1="a46004c7bd16b2a9b012347496efe66f4c56af42" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234942">
+ <rom name="mickey's space adventure - disk 2, side b.woz" size="234942" crc="5e4cae02" sha1="4624eda8ef93e71ca8237a5cb44cf874f1f7e55e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microbar">
+ <description>Micro Barmate (version 1.0) (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Virtual Combinatics" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="168241">
+ <rom name="micro barmate (softsmith) disk 1 - program disk.woz" size="168241" crc="a73a6c7f" sha1="372491190520d8965e1278bb1c701ed24109c793" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Recipe" />
+ <dataarea name="flop" size="234800">
+ <rom name="micro barmate (softsmith) disk 2 - recipe disk.woz" size="234800" crc="d8d18e90" sha1="7a1791e80a23558fa6490510163ec8029f42aa6b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlbbmlr1" cloneof="mlbbml">
+ <description>Micro League Baseball (Micro League Sports Association) (revision 1)</description>
+ <year>1984</year>
+ <publisher>Micro League Sports Association</publisher>
+ <info name="programmer" value="John I. Graybill" />
+ <info name="programmer" value="Mark &quot;Adam&quot; Baum" />
+ <info name="programmer" value="Stephen L. Cox" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="revision 1" />
+ <!-- This is a different game than Micro League Baseball by Stoneware. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-03 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241504">
+ <rom name="micro league baseball rev. 1.woz" size="241504" crc="b9c6dff2" sha1="4be5dd87e35abeb0f14037cbaad93de1041cb2f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlbbmlr2" cloneof="mlbbml">
+ <description>Micro League Baseball (Micro League Sports Association) (revision 2)</description>
+ <year>1984</year>
+ <publisher>Micro League Sports Association</publisher>
+ <info name="programmer" value="John I. Graybill" />
+ <info name="programmer" value="Mark &quot;Adam&quot; Baum" />
+ <info name="programmer" value="Stephen L. Cox" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="revision 2" />
+ <!-- This is a different game than Micro League Baseball by Stoneware. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-03 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241521">
+ <rom name="micro league baseball rev. 2.woz" size="241521" crc="0de67855" sha1="cc44f3c086d2090960a69539ac48f76eca2a9fe6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlbbml">
+ <description>Micro League Baseball (Micro League Sports Association) (revision 3)</description>
+ <year>1984</year>
+ <publisher>Micro League Sports Association</publisher>
+ <info name="programmer" value="John I. Graybill" />
+ <info name="programmer" value="Mark &quot;Adam&quot; Baum" />
+ <info name="programmer" value="Stephen L. Cox" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="revision 3" />
+ <!-- This is a different game than Micro League Baseball by Stoneware. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-03 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241521">
+ <rom name="micro league baseball rev. 3.woz" size="241521" crc="a27f0fae" sha1="0d87ed2649e34a5a1d0cacddd7c60c8277e92ccd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlbbbssc">
+ <description>Micro League Baseball: Box Score / Stats Compiler Disk</description>
+ <year>1986</year>
+ <publisher>Micro League Sports Association</publisher>
+ <info name="programmer" value="James A. Dorsman" />
+ <info name="programmer" value="Stephen L. Cox" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <!-- Add-on program for Micro League Baseball (sold separately). -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-11 -->
+ <!-- sports game add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241519">
+ <rom name="micro league baseball box score-stat compiler disk.woz" size="241519" crc="9e0569c6" sha1="8e1ccfb703fb9e67a5e19b29c78f3b90a8886643" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlbbgmo">
+ <description>Micro League Baseball: General Manager / Owner Disk</description>
+ <year>1985</year>
+ <publisher>Micro League Sports Association</publisher>
+ <info name="programmer" value="James A. Dorsman" />
+ <info name="programmer" value="Mark &quot;Adam&quot; Baum" />
+ <info name="programmer" value="Stephen L. Cox" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <!-- Add-on program for Micro League Baseball (sold separately). -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- sports game add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234899">
+ <rom name="micro league baseball general manager-owner disk.woz" size="234899" crc="0f58fce6" sha1="91e7b5b166eb138d705c4d39733d14177dc68b9b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml1plnva">
+ <description>Micro-LADS 1: Plurals &amp; Noun-Verb Agreement</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235566">
+ <rom name="micro-lads 1- plurals and noun-verb agreement.woz" size="235566" crc="5248d8a7" sha1="cb3c599b370c46b4f7ac11f23122a37c598595b0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml2verbf">
+ <description>Micro-LADS 2: Verb Forms</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235547">
+ <rom name="micro-lads 2- verb forms.woz" size="235547" crc="b934c2e5" sha1="e764770d7642a5301f2795f75fd1df987019976c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml3preps">
+ <description>Micro-LADS 3: Prepositions</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235549">
+ <rom name="micro-lads 3- prepositions.woz" size="235549" crc="99f1445b" sha1="3dcff367953157133b7c4ef46d5b49834f169209" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml4pron">
+ <description>Micro-LADS 4: Pronouns</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235545">
+ <rom name="micro-lads 4- pronouns.woz" size="235545" crc="5e1e3e45" sha1="d7ac4d69ac97e660ea7fa3dc535a52e8957e6e46" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml5nega">
+ <description>Micro-LADS 5: Negatives</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235546">
+ <rom name="micro-lads 5- negatives.woz" size="235546" crc="376818fe" sha1="2f905e6f18a2d3eca7d29141ce78a1f9046ab568" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml6deiex">
+ <description>Micro-LADS 6: Deictic Expressions, Passive, &amp; WH-questions</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235579">
+ <rom name="micro-lads 6- deictic expressions, passive, wh-questions.woz" size="235579" crc="40052717" sha1="8e5417ba687db72a75baf6526019acfb9bf2f14b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ml7prep2">
+ <description>Micro-LADS 7: Prepositions II</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235552">
+ <rom name="micro-lads 7- prepositions ii.woz" size="235552" crc="2b2093b8" sha1="0c3b5bb04dae1a7a9da4fdea03842f9ee311bae4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microbe">
+ <description>Microbe: The Anatomical Adventure</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="alt_title" value="Eduventure #1: Microbe: The Anatomical Adventure" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="Alan H. Zalta, M.D." />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-04-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234852">
+ <rom name="microbe side a.woz" size="234852" crc="0d944e75" sha1="5a8e5a95c764d181e0410cc411b6b14be57e87a9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234852">
+ <rom name="microbe side b.woz" size="234852" crc="e23a8340" sha1="1d085179f9e2905179b4eb57fbd716430da18c2c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="micrjrny">
+ <description>Microscopic Journey</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Dan Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234770">
+ <rom name="microscopic journey.woz" size="234770" crc="3ce5e65c" sha1="686498ffa16cb3b3e053e8141f681ae417f388ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="msadvent">
+ <description>Microsoft Adventure</description>
+ <year>1980</year>
+ <publisher>Microsoft</publisher>
+ <info name="developer" value="Softwin" />
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 32K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2019-04-12 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234771">
+ <rom name="microsoft adventure.woz" size="234771" crc="6e623593" sha1="d52f0a3b95a386875cb3691f5471e8c14440ccb8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mdecath">
+ <description>Microsoft Decathlon</description>
+ <year>1981</year>
+ <publisher>Microsoft</publisher>
+ <info name="programmer" value="Timothy W. Smith" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <!-- A one-time backup utility (press '*' during the title animation) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234767">
+ <rom name="microsoft decathlon.woz" size="234767" crc="08c632c1" sha1="acbdce8241c14b7b68b87489987c184d16ab9bfa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtypingii">
+ <description>Microtyping II</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Dr. C. William Engel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="microtyping ii.woz" size="234796" crc="e2718e76" sha1="0d29f8f75209352799e9d3bab25019ce63c8c8a1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz1">
+ <description>Microzine 1</description>
+ <year>1983</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Ame C. Flynn" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Bob Neumann" />
+ <info name="programmer" value="Megan Stine" />
+ <info name="programmer" value="H. William Stine" />
+ <info name="usage" value="Requires a 48K Apple ][+ or unenhanced //e. Due to issues unrelated to the copy protection, it does not run on later machines without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2P,A2E" />
+ <!-- Dump released: 2022-08-02 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - twistaplot, what's next" />
+ <dataarea name="flop" size="235330">
+ <rom name="microzine no. 1 (1983)(scholastic) - side 1- twistaplot, what's next.woz" size="235330" crc="dae1c1d3" sha1="cd2a57adf261788ad6ab07fc45fae9feca084072" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - ask me, poster, secret files, computer stuff" />
+ <dataarea name="flop" size="235351">
+ <rom name="microzine no. 1 (1983)(scholastic) - side 2- ask me, poster, secret files, computer stuff.woz" size="235351" crc="e445cd5f" sha1="0f1b490deb174f1aec38e8ad4fc99956aa638a04" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz2">
+ <description>Microzine 2</description>
+ <year>1983</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Ame C. Flynn" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Bob Neumann" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-02 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - what's inside, northwoods adventure, melody maker, computer stuff" />
+ <dataarea name="flop" size="235338">
+ <rom name="microzine no. 2 (1983)(scholastic) - side 1- what's inside, northwoods adventure, melody maker, computer stuff.woz" size="235338" crc="ee720a80" sha1="e8317617b40f258d85be445f64ca5b77c706b87a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - ride the wind, word ladder, what's next" />
+ <dataarea name="flop" size="235312">
+ <rom name="microzine no. 2 (1983)(scholastic) - side 2- ride the wind, word ladder, what's next.woz" size="235312" crc="05ba43ce" sha1="365b865a9dce82819bd1806095c6fb3c14cc16f4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz3">
+ <description>Microzine 3</description>
+ <year>1983</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="M. Brooks Jones" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-02 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - what's inside, mystery at pinecrest manor, computer stuff" />
+ <dataarea name="flop" size="242008">
+ <rom name="microzine no. 3 (1983)(scholastic) - side 1- what's inside, mystery at pinecrest manor, computer stuff.woz" size="242008" crc="3fef2d3b" sha1="a6540cd2dc5830b8ee49a5a930124d173081707d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - tag, bookstore, amazing robot" />
+ <dataarea name="flop" size="222012">
+ <rom name="microzine no. 3 (1983)(scholastic) - side 2- tag, bookstore, amazing robot.woz" size="222012" crc="bdf8ae04" sha1="e891c8b88fc22c6d09634d0bef386e6895390e3f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz4">
+ <description>Microzine 4</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="M. Brooks Jones" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - what's inside, adventures in the microzine, computer stuff" />
+ <dataarea name="flop" size="242009">
+ <rom name="microzine no. 4 (1984)(scholastic) - side 1- what's inside, adventures in the microzine, computer stuff.woz" size="242009" crc="35661262" sha1="252d4bf67f3fdd2f2cd0cd7efec4a9dda06930b2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - log-it , traps, what's next" />
+ <dataarea name="flop" size="241978">
+ <rom name="microzine no. 4 (1984)(scholastic) - side 2- log-it , traps, what's next.woz" size="241978" crc="c1dbfd01" sha1="f6b7853ea838d4d278e51f23521dbe60d0c53055" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz5">
+ <description>Microzine 5</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Lorene Lavora" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - what's inside, pirates of the soft seas" />
+ <dataarea name="flop" size="242013">
+ <rom name="microzine no. 5 (1984)(scholastic) - side 1- what's inside, pirates of the soft seas.woz" size="242013" crc="96d5b90c" sha1="874ec0ec9d678fa17b564124b5676bc7bb3366e7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - story teller, amazing robot ii, fences, computer stuff, what's next" />
+ <dataarea name="flop" size="468345">
+ <rom name="microzine no. 5 (1984)(scholastic) - side 2- story teller, amazing robot ii, fences, computer stuff, what's next.woz" size="468345" crc="72c3234c" sha1="9d6f0e63e23f04711f7d9b4a29d8360cdc7012b4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz6">
+ <description>Microzine 6</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Stephen Gass" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - what's inside, fossils alive, computer stuff" />
+ <dataarea name="flop" size="242007">
+ <rom name="microzine no. 6 (1984)(scholastic) - side 1- what's inside, fossils alive, computer stuff.woz" size="242007" crc="72a35e01" sha1="2f58292998be8aa652f2bbfbe9e4d9853628196f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - olympic news, free store, sound off , what's next" />
+ <dataarea name="flop" size="235355">
+ <rom name="microzine no. 6 (1984)(scholastic) - side 2- olympic news, free store, sound off , what's next.woz" size="235355" crc="868b3b99" sha1="eb0cd6df242d8c9bf15fb8169ac9612d240996ff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz7">
+ <description>Microzine 7</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Maryl Skinner" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-03 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - what's inside, brain drain, computer stuff" />
+ <dataarea name="flop" size="235380">
+ <rom name="microzine no. 7 (1984)(scholastic) - side 1- what's inside, brain drain, computer stuff.woz" size="235380" crc="de2e773e" sha1="5bffba51323383412a502525790d99b29216cd05" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - survey taker, city blocks, back page, what's next" />
+ <dataarea name="flop" size="235387">
+ <rom name="microzine no. 7 (1984)(scholastic) - side 2- survey taker, city blocks, back page, what's next.woz" size="235387" crc="af5af6f6" sha1="a348bde53b27a180fde07a057a896625a7144891" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz8">
+ <description>Microzine 8</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Richard Rathe" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, zazoo come home, computer stuff" />
+ <dataarea name="flop" size="235414">
+ <rom name="microzine no. 8 (1984)(scholastic) - side 1- letter from the editor, zazoo come home, computer stuff.woz" size="235414" crc="3f630756" sha1="566ddf1848c4795d38aba9a6bb83b5121da5cd85" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - secret journal, drawing board, back page, what's next" />
+ <dataarea name="flop" size="235412">
+ <rom name="microzine no. 8 (1984)(scholastic) - side 2- secret journal, drawing board, back page, what's next.woz" size="235412" crc="18dfb87e" sha1="cb0280bb4cedd4908efcb5d7010918382dd93a3d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz9">
+ <description>Microzine 9</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Richard Rathe" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Malcom Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Andy Ragan" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, the big nap, computer stuff" />
+ <dataarea name="flop" size="235451">
+ <rom name="microzine no. 9 (1985)(scholastic) - side 1- letter from the editor, the big nap, computer stuff.woz" size="235451" crc="1e257b42" sha1="4383290783a341d8bb20c2754c8378476e115098" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - budget maker, quizzler, back page, what's next" />
+ <dataarea name="flop" size="235446">
+ <rom name="microzine no. 9 (1985)(scholastic) - side 2- budget maker, quizzler, back page, what's next.woz" size="235446" crc="365a0c86" sha1="ce7ddce720301566aea86d07c085cc4f34096b97" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz10">
+ <description>Microzine 10</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Malcom Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, the shot heard 'round the world, computer stuff" />
+ <dataarea name="flop" size="235383">
+ <rom name="microzine no. 10 (1985)(scholastic) - side 1- letter from the editor, the shot heard 'round the world, computer stuff.woz" size="235383" crc="64061df0" sha1="a9ed98926b7a3b66b657a8bcedfa6cbd942b5e53" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - sailing, billboard, back page, what's next" />
+ <dataarea name="flop" size="235354">
+ <rom name="microzine no. 10 (1985)(scholastic) - side 2- sailing, billboard, back page, what's next.woz" size="235354" crc="2f51d985" sha1="2fee6c6bffb8d2bf5afe91b6d5968e890dd7e2f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz11">
+ <description>Microzine 11</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Karen Klassen" />
+ <info name="programmer" value="Don Wagner" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Dave Olmon" />
+ <info name="programmer" value="Dave Updegraff" />
+ <info name="programmer" value="Neal Yaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Malcom Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, the dark tower, computer stuff" />
+ <dataarea name="flop" size="235340">
+ <rom name="microzine no. 11 (1985)(scholastic) - side 1- letter from the editor, the dark tower, computer stuff.woz" size="235340" crc="2d5799b4" sha1="3b197714b107138ec681eb9803b4cff044610d6d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - secret coder, sticker factory, back page, what's next" />
+ <dataarea name="flop" size="235339">
+ <rom name="microzine no. 11 (1985)(scholastic) - side 2- secret coder, sticker factory, back page, what's next.woz" size="235339" crc="6090c01e" sha1="ba8083ac1ae9e77f2d92c58f8bf0554cc665a2dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz12">
+ <description>Microzine 12</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Dick Smith" />
+ <info name="programmer" value="Neal Vaughn" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, wagons west, computer stuff" />
+ <dataarea name="flop" size="234878">
+ <rom name="microzine no. 12 (1985)(scholastic) - side 1- letter from the editor, wagons west, computer stuff.woz" size="234878" crc="abb0f2df" sha1="ffae6d7ea55499283d331488a30f7a85b22703b1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - newspaper maker, t-shirt puzzles, micro-toon, what's next" />
+ <dataarea name="flop" size="234884">
+ <rom name="microzine no. 12 (1985)(scholastic) - side 2- newspaper maker, t-shirt puzzles, micro-toon, what's next.woz" size="234884" crc="3fd01f78" sha1="95936de42e1718c45fa661ed233ec8d6101f4048" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz13">
+ <description>Microzine 13</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Kevin Dybdal" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Anthony Hertzel" />
+ <info name="programmer" value="Gary Johnson" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Rich Webber" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Will Kefauver" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, the frog and the fables, computer stuff" />
+ <dataarea name="flop" size="234890">
+ <rom name="microzine no. 13 (1985)(scholastic) - side 1- letter from the editor, the frog and the fables, computer stuff.woz" size="234890" crc="57749cde" sha1="1751dea829f35f04a6fa5eb37694120af724052e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - the secret of the sphinx, who's who in outer space, what's next" />
+ <dataarea name="flop" size="234890">
+ <rom name="microzine no. 13 (1985)(scholastic) - side 2- the secret of the sphinx, who's who in outer space, what's next.woz" size="234890" crc="b9d4b929" sha1="76828d26a8674c478968ff953834db87a73bd687" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz14">
+ <description>Microzine 14</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Judi Bliss" />
+ <info name="programmer" value="Neil Montague" />
+ <info name="programmer" value="Ron Mignery" />
+ <info name="programmer" value="Alison Yamaguchi" />
+ <info name="programmer" value="Melissa Hagan" />
+ <info name="programmer" value="Karen Luti" />
+ <info name="programmer" value="Bayard Colyear" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, the funhouse caper, computer stuff" />
+ <dataarea name="flop" size="234864">
+ <rom name="microzine no. 14 (1986)(scholastic) - side 1- letter from the editor, the funhouse caper, computer stuff.woz" size="234864" crc="94aa4f1a" sha1="bf35a3f0e612528392e89db53973da83942a2be6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - cartoon maker, inventors and inventions, puzzler, what's next" />
+ <dataarea name="flop" size="241521">
+ <rom name="microzine no. 14 (1986)(scholastic) - side 2- cartoon maker, inventors and inventions, puzzler, what's next.woz" size="241521" crc="4c089cc2" sha1="1feefae30b7d4cd7ede9538bc68219ed2b0e8c6d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz15">
+ <description>Microzine 15</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, 2088- an oval office odyssey, computer stuff" />
+ <dataarea name="flop" size="234895">
+ <rom name="microzine no. 15 (1986)(scholastic) - side 1- letter from the editor, 2088- an oval office odyssey, computer stuff.woz" size="234895" crc="20f0044c" sha1="07069bf1c0c90acc7b8ddd551f55c0b1d8c7ad71" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - keyboarding, roundup, estimator, what's next" />
+ <dataarea name="flop" size="234871">
+ <rom name="microzine no. 15 (1986)(scholastic) - side 2- keyboarding, roundup, estimator, what's next.woz" size="234871" crc="3c7b0194" sha1="717fd25f03d2366511ebf69026eb202c085ae948" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz16">
+ <description>Microzine 16</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-04 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, tickets to america, computer stuff" />
+ <dataarea name="flop" size="234864">
+ <rom name="microzine no. 16 (1986)(scholastic) - side 1- letter from the editor, tickets to america, computer stuff.woz" size="234864" crc="a439c666" sha1="56e8178a44fc836349559846a80f7d00ab2eb0c9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - shifty shapes, solar pilot, atgtfp, what's next" />
+ <dataarea name="flop" size="234885">
+ <rom name="microzine no. 16 (1986)(scholastic) - side 2- shifty shapes, solar pilot, atgtfp, what's next.woz" size="234885" crc="75001eec" sha1="e3048a82f5585e8b572b480dbde8534c5695b36a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz17">
+ <description>Microzine 17</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-06 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, microagent of the body guard, computer stuff" />
+ <dataarea name="flop" size="234874">
+ <rom name="microzine no. 17 (1986)(scholastic) - side 1- letter from the editor, microagent of the body guard, computer stuff.woz" size="234874" crc="d3b3bd85" sha1="b3994d8fbf75bd3cd4303a9bcbcf53f00ef86b77" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - mission- mix-up, marvelous menagerie, basic training, what's next" />
+ <dataarea name="flop" size="234871">
+ <rom name="microzine no. 17 (1986)(scholastic) - side 2- mission- mix-up, marvelous menagerie, basic training, what's next.woz" size="234871" crc="4a3b4d61" sha1="1db34fc55cc603385a19f67dd6699c03aecad1e8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz18">
+ <description>Microzine 18</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Peter Berger" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="John Risken" />
+ <info name="programmer" value="Neal Vaughn" />
+ <info name="programmer" value="Lauretta Jones" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-06 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, history mystery" />
+ <dataarea name="flop" size="234866">
+ <rom name="microzine no. 18 (1986)(scholastic) - side 1- letter from the editor, history mystery.woz" size="234866" crc="01d248ff" sha1="682ff202097b0ce76d7b8b0454a6622c2eeddbe7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - computer stuff, scholasticalc, letter writer, rose and calumny" />
+ <dataarea name="flop" size="234837">
+ <rom name="microzine no. 18 (1986)(scholastic) - side 2- computer stuff, scholasticalc, letter writer, rose and calumny.woz" size="234837" crc="bc2ce0ff" sha1="03e0c46f0ee91e62a672e4aa412e141d60e884ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz19">
+ <description>Microzine 19</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="Anthony Hertzel" />
+ <info name="programmer" value="David G. Oimon" />
+ <info name="programmer" value="Davideo" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-06 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letter from the editor, malice in wonderland" />
+ <dataarea name="flop" size="234871">
+ <rom name="microzine no. 19 (1987)(scholastic) - side 1- letter from the editor, malice in wonderland.woz" size="234871" crc="ca880ee9" sha1="5e853779a9c8a11ff8bcf99fd59576c453914881" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - computer stuff, animation lab, calendar, estimator, what's next" />
+ <dataarea name="flop" size="234891">
+ <rom name="microzine no. 19 (1987)(scholastic) - side 2- computer stuff, animation lab, calendar, estimator, what's next.woz" size="234891" crc="a98b369d" sha1="b1a1d5a08972ba7bd6657b41edc0dc508c8344d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz20">
+ <description>Microzine 20</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Sandi Young" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-06 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letters, voyage to see what's on the bottom, computer stuff" />
+ <dataarea name="flop" size="235030">
+ <rom name="microzine no. 20 (1987)(scholastic) - side 1- letters, voyage to see what's on the bottom, computer stuff.woz" size="235030" crc="a279550e" sha1="66afc468057df6292afb5a9fe45a8baab02ee766" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - interactions, heros and villains, monitor mystery" />
+ <dataarea name="flop" size="235018">
+ <rom name="microzine no. 20 (1987)(scholastic) - side 2- interactions, heros and villains, monitor mystery.woz" size="235018" crc="7f7002ce" sha1="7d2a5cba7d0142ee919fa04b3a6f407db73c5e8e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz21">
+ <description>Microzine 21</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Elisabeth Gitelle" />
+ <info name="programmer" value="Mark I. Malamud" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-10 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - robot rescue, computer stuff" />
+ <dataarea name="flop" size="235115">
+ <rom name="microzine no. 21 (1987)(scholastic) - side 1- robot rescue, computer stuff.woz" size="235115" crc="3d2129c8" sha1="7dc06a2c396f2182364dd9ac46d3b251e863989e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - fabulous kids, fill in the blanks, monitor mystery" />
+ <dataarea name="flop" size="235137">
+ <rom name="microzine no. 21 (1987)(scholastic) - side 2- fabulous kids, fill in the blanks, monitor mystery.woz" size="235137" crc="25f92a0e" sha1="6867de1fc18a1a16ee42dfe63b4247ca369af3a0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz22">
+ <description>Microzine 22</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-10 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letters, the haunted channels, computer stuff" />
+ <dataarea name="flop" size="235085">
+ <rom name="microzine no. 22 (1987)(scholastic) - side 1- letters, the haunted channels, computer stuff.woz" size="235085" crc="d57e5404" sha1="f9c90043fc1d59810b3bae44709a50c10f9ed9f2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - math mall, monitor mystery" />
+ <dataarea name="flop" size="235066">
+ <rom name="microzine no. 22 (1987)(scholastic) - side 2- math mall, monitor mystery.woz" size="235066" crc="6c3e8bb9" sha1="4c52d74450156a6a61332721ad9d34925e8f06e3" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3 - newsprint" />
+ <dataarea name="flop" size="235041">
+ <rom name="microzine no. 22 (1987)(scholastic) - side 3- newsprint.woz" size="235041" crc="80a2107a" sha1="7a5b192259e6faed08f0fb61c12264e6918806a7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz23">
+ <description>Microzine 23</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Dan Kinch" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Malcolm Kirton" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-11 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letters, escape from antcatraz, computer stuff" />
+ <dataarea name="flop" size="235199">
+ <rom name="microzine no. 23 (1987)(scholastic) - side 1- letters, escape from antcatraz, computer stuff.woz" size="235199" crc="067889b0" sha1="73749910a2bee7576b5b477fa949f575caa29383" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - math mall, monitor mystery" />
+ <dataarea name="flop" size="241835">
+ <rom name="microzine no. 23 (1987)(scholastic) - side 2- math mall, monitor mystery.woz" size="241835" crc="ab6d85b0" sha1="9d4c08ce7a2123cd86a15f8d9f43aa56f31ab824" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3 - greetings" />
+ <dataarea name="flop" size="235163">
+ <rom name="microzine no. 23 (1987)(scholastic) - side 3- greetings.woz" size="235163" crc="213d9cbe" sha1="7e7e2a793826acdce1f8c01a7119f909d1e3ba0a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz24">
+ <description>Microzine 24</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Jim Markowich" />
+ <info name="programmer" value="Christopher McQuilkin" />
+ <info name="programmer" value="Aaron Weaver" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-12 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - captains of the china trade, computer stuff" />
+ <dataarea name="flop" size="235259">
+ <rom name="microzine no. 24 (1987)(scholastic) - side 1- captains of the china trade, computer stuff.woz" size="235259" crc="017a1085" sha1="6d3f9671d0f87b4d270106903e373eefc1985045" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - dr. maxwell's molecule magic, monitor mystery" />
+ <dataarea name="flop" size="235261">
+ <rom name="microzine no. 24 (1987)(scholastic) - side 2- dr. maxwell's molecule magic, monitor mystery.woz" size="235261" crc="b869df7c" sha1="688ef51095643663134b7717ad7ee5514e2571ce" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3 - banner maker" />
+ <dataarea name="flop" size="235139">
+ <rom name="microzine no. 24 (1987)(scholastic) - side 3- banner maker.woz" size="235139" crc="b4343854" sha1="476c670d04ed8ebc3276bab9113e89eef437c4b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz25">
+ <description>Microzine 25</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="JoAnn Comito" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-13 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - letters, cosmic heroes, computer stuff" />
+ <dataarea name="flop" size="235244">
+ <rom name="microzine no. 25 (1988)(scholastic) - side 1- letters, cosmic heroes, computer stuff.woz" size="235244" crc="dfd13096" sha1="ee3684ed93820c953bd8775789502ba85a3f2ca6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - the learning machine, picture this" />
+ <dataarea name="flop" size="235240">
+ <rom name="microzine no. 25 (1988)(scholastic) - side 2- the learning machine, picture this.woz" size="235240" crc="f56a22c7" sha1="c4438ba971418f38dcc261ffd8bfdd3e2c619fbd" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3 - blueprint maker" />
+ <dataarea name="flop" size="235205">
+ <rom name="microzine no. 25 (1988)(scholastic) - side 3- blueprint maker.woz" size="235205" crc="5aae950f" sha1="ce23de1831e3b51413c4c9435b6b293379bc1aa1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz26">
+ <description>Microzine 26</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Mark Nichols" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Linda Gottfried" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-13 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - the wizard of darkling wood, letters, computer stuff" />
+ <dataarea name="flop" size="235256">
+ <rom name="microzine no. 26 (1988)(scholastic) - disk 1, side 1- the wizard of darkling wood, letters, computer stuff.woz" size="235256" crc="da8fe27b" sha1="60cef73d719c2ef80bbbbf599e96e770f82fc136" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - the wizard of darkling wood, letters, computer stuff" />
+ <dataarea name="flop" size="235256">
+ <rom name="microzine no. 26 (1988)(scholastic) - disk 1, side 2- the wizard of darkling wood, letters, computer stuff.woz" size="235256" crc="19702123" sha1="0ab3523faf50a5c67521925074c4a4a6965a2cb9" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - congratulations" />
+ <dataarea name="flop" size="235212">
+ <rom name="microzine no. 26 (1988)(scholastic) - disk 2- congratulations.woz" size="235212" crc="baec01d6" sha1="b117b4e832df8a1620bb70fcff4b860e794d8eb3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz27">
+ <description>Microzine 27</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-13 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, monitor mystery" />
+ <dataarea name="flop" size="235211">
+ <rom name="microzine no. 27 (1988)(scholastic) - disk 1, side 1- microzine guide, monitor mystery.woz" size="235211" crc="5a19894c" sha1="ebbb65ed2dcc8de7d04aeac3d16a43b22431280a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - rebus maker" />
+ <dataarea name="flop" size="235190">
+ <rom name="microzine no. 27 (1988)(scholastic) - disk 1, side 2- rebus maker.woz" size="235190" crc="7c9fc160" sha1="6f74da37246b8b7068c1d5de26c116c8d562526f" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - constellation odyssey" />
+ <dataarea name="flop" size="235200">
+ <rom name="microzine no. 27 (1988)(scholastic) - disk 2, side 1- constellation odyssey.woz" size="235200" crc="684aa097" sha1="4297b8c60c06ac99967d73b2cced5a8c7d482f26" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - the learning machine" />
+ <dataarea name="flop" size="235199">
+ <rom name="microzine no. 27 (1988)(scholastic) - disk 2, side 2- the learning machine.woz" size="235199" crc="4161e076" sha1="a2998dde8f9004acf7ea265500a4e481361e3171" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz28">
+ <description>Microzine 28</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Claire Curtin" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-13 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, african animals" />
+ <dataarea name="flop" size="235282">
+ <rom name="microzine no. 28 (1988)(scholastic) - disk 1, side 1- microzine guide, african animals.woz" size="235282" crc="5d06c353" sha1="bb922b1fc2df04b6a1e39f4873a7cb0d131a0898" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - stationery maker" />
+ <dataarea name="flop" size="234754">
+ <rom name="microzine no. 28 (1988)(scholastic) - disk 1, side 2- stationery maker.woz" size="234754" crc="a1f201d1" sha1="805ec37f4e821d47a80f5d69e7eadea27e04a05c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - quest for the pole" />
+ <dataarea name="flop" size="235268">
+ <rom name="microzine no. 28 (1988)(scholastic) - disk 2, side 1- quest for the pole.woz" size="235268" crc="7c476e38" sha1="ddb963228a421beff88a07b3afbf76d782a68463" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - sound lab" />
+ <dataarea name="flop" size="235259">
+ <rom name="microzine no. 28 (1988)(scholastic) - disk 2, side 2- sound lab.woz" size="235259" crc="3b452a94" sha1="8d36afd45a344931a1922692c62ac92846c8a8f1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz29">
+ <description>Microzine 29</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-13 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, desert dilemma" />
+ <dataarea name="flop" size="235281">
+ <rom name="microzine no. 29 (1988)(scholastic) - disk 1, side 1- microzine guide, desert dilemma.woz" size="235281" crc="a7a8ce67" sha1="c5f75d739fa8aeeda55719c9e4c1257a2f9620d7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - screen artist" />
+ <dataarea name="flop" size="235263">
+ <rom name="microzine no. 29 (1988)(scholastic) - disk 1, side 2- screen artist.woz" size="235263" crc="1aee21dc" sha1="e6e503e83e2c5b2015b79e55841d4e8c25baf670" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the myths of olympus" />
+ <dataarea name="flop" size="235270">
+ <rom name="microzine no. 29 (1988)(scholastic) - disk 2, side 1- the myths of olympus.woz" size="235270" crc="7ed1e4de" sha1="de3cdafbb3d15f58586ac948a706493aa2273e06" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - light on target" />
+ <dataarea name="flop" size="235265">
+ <rom name="microzine no. 29 (1988)(scholastic) - disk 2, side 2- light on target.woz" size="235265" crc="a76fdf53" sha1="bc76c2adcdb50eaa38fa1532da231765dc55667b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz30">
+ <description>Microzine 30</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Schwartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Chris McQuilkin" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-08-13 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, double vision" />
+ <dataarea name="flop" size="235245">
+ <rom name="microzine no. 30 (1989)(scholastic) - disk 1, side 1- microzine guide, double vision.woz" size="235245" crc="bc750c20" sha1="7ab182c6e33f51812af7b98200d7ad32e9a54cf9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - poster maker" />
+ <dataarea name="flop" size="235227">
+ <rom name="microzine no. 30 (1989)(scholastic) - disk 1, side 2- poster maker.woz" size="235227" crc="c000d5e8" sha1="656e6daf79464fbab043edc026450346cce73da3" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - toward the north star" />
+ <dataarea name="flop" size="235236">
+ <rom name="microzine no. 30 (1989)(scholastic) - disk 2, side 1- toward the north star.woz" size="235236" crc="4c9c6557" sha1="9f0563e64be5e685825fb165803c2bece7ac10b0" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - contraptions" />
+ <dataarea name="flop" size="235227">
+ <rom name="microzine no. 30 (1989)(scholastic) - disk 2, side 2- contraptions.woz" size="235227" crc="1395c9bb" sha1="067ac290dd6f1df39352407c314a4f5726a45fa3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz31">
+ <description>Microzine 31</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Schwartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="John Ricco" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, computer stuff, monitor mystery" />
+ <dataarea name="flop" size="235151">
+ <rom name="microzine no. 31 - disk 1, side 1.woz" size="235151" crc="403db5de" sha1="1f4f7f845a56888fba5fd6d343a23275cef0332b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - presenting!" />
+ <dataarea name="flop" size="235151">
+ <rom name="microzine no. 31 - disk 1, side 2.woz" size="235151" crc="d4d80ab8" sha1="b77883c6fb338831c85a95ec18c0996d092a5f36" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - volcanic voyager" />
+ <dataarea name="flop" size="235151">
+ <rom name="microzine no. 31 - disk 2, side 1.woz" size="235151" crc="be7a88f6" sha1="fe608a379bddee47b01a0a1e9dd77090ba768c79" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - game plan" />
+ <dataarea name="flop" size="235151">
+ <rom name="microzine no. 31 - disk 2, side 2.woz" size="235151" crc="55933b58" sha1="660eacb0e6ff7a13dc2921e48c2b320fdbca8398" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz32">
+ <description>Microzine 32</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Schwartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="John Ricco" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-11-20 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - the case of the unidentified flying alien" />
+ <dataarea name="flop" size="235265">
+ <rom name="microzine no. 32 - disk 1, side 1- the case of the unidentified flying alien.woz" size="235265" crc="d503cd19" sha1="dcb090dc18178568510f34db7606083d7507c8e3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - fyi- a database" />
+ <dataarea name="flop" size="235239">
+ <rom name="microzine no. 32 - disk 1, side 2- fyi- a database.woz" size="235239" crc="f9b90f31" sha1="64d484907667c2ea3aa0563733aeb97858cd889a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - a night at fleener's" />
+ <dataarea name="flop" size="235244">
+ <rom name="microzine no. 32 - disk 2, side 1- a night at fleener's.woz" size="235244" crc="f19b9939" sha1="1bc2c5d4546a5492ac6b8b0d7024a83ad2acba61" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - eyes on the world" />
+ <dataarea name="flop" size="235241">
+ <rom name="microzine no. 32 - disk 2, side 2- eyes on the world.woz" size="235241" crc="3310c7ca" sha1="4e1a679a73358831b123e9d1a7b7cb3d8f7aa9ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz33">
+ <description>Microzine 33</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Alan R. Schwartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="John Ricco" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, historical hysterics" />
+ <dataarea name="flop" size="235256">
+ <rom name="microzine no. 33 (1989)(scholastic) - disk 1, side 1- microzine guide, historical hysterics.woz" size="235256" crc="b29a9761" sha1="68b8c3b83d914f94473b3b9588c0d2cc84f31731" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - planet, plan-it" />
+ <dataarea name="flop" size="235235">
+ <rom name="microzine no. 33 (1989)(scholastic) - disk 1, side 2- planet, plan-it.woz" size="235235" crc="00511910" sha1="f6aeaaee83efa2737fdd8a484cda7845d13f09aa" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - word war" />
+ <dataarea name="flop" size="235227">
+ <rom name="microzine no. 33 (1989)(scholastic) - disk 2, side 1- word war.woz" size="235227" crc="ebf72965" sha1="394e44cfaeb5b604a799d6ba297ab0d22ed613d7" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - going to pieces" />
+ <dataarea name="flop" size="235234">
+ <rom name="microzine no. 33 (1989)(scholastic) - disk 2, side 2- going to pieces.woz" size="235234" crc="a193b792" sha1="c60b88a6956915e2f9b1700d4343bb01d9f68bdb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz34">
+ <description>Microzine 34</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, the case of the missing rose" />
+ <dataarea name="flop" size="235181">
+ <rom name="microzine no. 34 (1990)(scholastic) - disk 1, side 1- microzine guide, the case of the missing rose.woz" size="235181" crc="78c046e2" sha1="c39078e97c1c1226cf368733d2df5268e73869f3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - secret sentences" />
+ <dataarea name="flop" size="235152">
+ <rom name="microzine no. 34 (1990)(scholastic) - disk 1, side 2- secret sentences.woz" size="235152" crc="99c8db8a" sha1="40fdc70700d3cfe3870a51e78cb27a967de48fd4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the mystery of the olympic imposters" />
+ <dataarea name="flop" size="235172">
+ <rom name="microzine no. 34 (1990)(scholastic) - disk 2, side 1- the mystery of the olympic imposters.woz" size="235172" crc="6d6c65ba" sha1="7763031e01b42163db8b1a54f92ab1aa1ce50fbc" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - fyi- a database of inventions" />
+ <dataarea name="flop" size="235165">
+ <rom name="microzine no. 34 (1990)(scholastic) - disk 2, side 2- fyi- a database of inventions.woz" size="235165" crc="c8073f03" sha1="ac5e394298ad1cd466acb07647efb42c2dab708e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz35">
+ <description>Microzine 35</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Marian Buck-Murray" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Maureen Stapleton" />
+ <info name="programmer" value="Jessica Stonier" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, grid block" />
+ <dataarea name="flop" size="235199">
+ <rom name="microzine no. 35 (1990)(scholastic) - disk 1, side 1- microzine guide, grid block.woz" size="235199" crc="3b44825f" sha1="5a80bc2e6bdda78fefb7b1782d1aaec351051b06" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - what's missing" />
+ <dataarea name="flop" size="235187">
+ <rom name="microzine no. 35 (1990)(scholastic) - disk 1, side 2- what's missing.woz" size="235187" crc="66c489df" sha1="9aee8cbc689cd52567207f9bb3fed3e5845b8f68" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - world agent" />
+ <dataarea name="flop" size="235183">
+ <rom name="microzine no. 35 (1990)(scholastic) - disk 2, side 1- world agent.woz" size="235183" crc="21739734" sha1="613be3d876dc45ac394d2c849f7591aed865e895" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - let's graph it" />
+ <dataarea name="flop" size="235187">
+ <rom name="microzine no. 35 (1990)(scholastic) - disk 2, side 2- let's graph it.woz" size="235187" crc="3a44de21" sha1="b0d5c42f52e1bc8d872c48af7edcb2b930f55e10" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz36">
+ <description>Microzine 36</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Marian Buck-Murray" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Jessica Stonier" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, the case of the crafty caper" />
+ <dataarea name="flop" size="235140">
+ <rom name="microzine no. 36 (1990)(scholastic) - disk 1, side 1- microzine guide, the case of the crafty caper.woz" size="235140" crc="71939618" sha1="c6d53732b0af3c1acfb1934137da077ee0efec66" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - trap doors" />
+ <dataarea name="flop" size="235105">
+ <rom name="microzine no. 36 (1990)(scholastic) - disk 1, side 2- trap doors.woz" size="235105" crc="2b1f6ee0" sha1="c56ea893cbd15d660b82cafdd2ddde790fb06c3a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - dr. think and the idea factory" />
+ <dataarea name="flop" size="235123">
+ <rom name="microzine no. 36 (1990)(scholastic) - disk 2, side 1- dr. think and the idea factory.woz" size="235123" crc="953e1074" sha1="c48300bd1de2e511934f01d903e359778559a702" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - it fits" />
+ <dataarea name="flop" size="235102">
+ <rom name="microzine no. 36 (1990)(scholastic) - disk 2, side 2- it fits.woz" size="235102" crc="42cdaaa0" sha1="0feaf327d1150204962f9219a7b0eef15da8b4fc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz37">
+ <description>Microzine 37</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Stuart Blavatnick" />
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Marian Buck-Murray" />
+ <info name="programmer" value="Nadine Browning" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, the case of the cutting caper" />
+ <dataarea name="flop" size="235098">
+ <rom name="microzine no. 37 (1990)(scholastic) - disk 1, side 1- microzine guide, the case of the cutting caper.woz" size="235098" crc="0c46ac81" sha1="534963be25a92e12c4b84f2c519dacf6649c4710" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - math mall" />
+ <dataarea name="flop" size="235061">
+ <rom name="microzine no. 37 (1990)(scholastic) - disk 1, side 2- math mall.woz" size="235061" crc="bb45e821" sha1="f0fcdeb2ad6fa3f7817560b2e5a113d1f2801aff" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the race for independence" />
+ <dataarea name="flop" size="235077">
+ <rom name="microzine no. 37 (1990)(scholastic) - disk 2, side 1- the race for independence.woz" size="235077" crc="9dc80a4d" sha1="6fcacac03ec59d9b121a4f5804a94abdfd074b1a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - nutrition explorer" />
+ <dataarea name="flop" size="235070">
+ <rom name="microzine no. 37 (1990)(scholastic) - disk 2, side 2- nutrition explorer.woz" size="235070" crc="f73ca6b1" sha1="3ebef62d966866aaa2708205e72de4b6b0971a33" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz38">
+ <description>Microzine 38</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Michael Repasy" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Marian Buck-Murray" />
+ <info name="programmer" value="Nadine Browning" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, eskimo escapade" />
+ <dataarea name="flop" size="235044">
+ <rom name="microzine no. 38 (1990)(scholastic) - disk 1, side 1- microzine guide, eskimo escapade.woz" size="235044" crc="a4068dd1" sha1="61fed3b019abb4fcbef5ea94fb47f1d2aaa2dd96" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - math mall" />
+ <dataarea name="flop" size="235021">
+ <rom name="microzine no. 38 (1990)(scholastic) - disk 1, side 2- math mall.woz" size="235021" crc="90148490" sha1="c47457b786832f88f758eb08fa9a58f3ee58d8e8" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - outer space adventures in government" />
+ <dataarea name="flop" size="235048">
+ <rom name="microzine no. 38 (1990)(scholastic) - disk 2, side 1- outer space adventures in government.woz" size="235048" crc="e894e2f2" sha1="e04dd9832fe8a88254aa53f57e4dc90e989d0ae6" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - exploring simple machines" />
+ <dataarea name="flop" size="235037">
+ <rom name="microzine no. 38 (1990)(scholastic) - disk 2, side 2- exploring simple machines.woz" size="235037" crc="e33bfb51" sha1="b260705f154b8b5312f38794481cc5c7b667b4df" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz39">
+ <description>Microzine 39</description>
+ <year>1991</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Michael Repasy" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Marian Buck-Murray" />
+ <info name="programmer" value="Nadine Browning" />
+ <info name="programmer" value="Laura Jeffers" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-01 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine guide, the case of the baffled baker" />
+ <dataarea name="flop" size="235032">
+ <rom name="microzine no. 39 (1991)(scholastic) - disk 1, side 1- microzine guide, the case of the baffled baker.woz" size="235032" crc="a3a68692" sha1="44ed270300dffc96a703deefac4686fc5efcdfaf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - math mall" />
+ <dataarea name="flop" size="234995">
+ <rom name="microzine no. 39 (1991)(scholastic) - disk 1, side 2- math mall.woz" size="234995" crc="d77633b9" sha1="0afa15aa93fa8aa372adf0494380ba0028f7fd6a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the stars of the harlem renaissance" />
+ <dataarea name="flop" size="235021">
+ <rom name="microzine no. 39 (1991)(scholastic) - disk 2, side 1- the stars of the harlem renaissance.woz" size="235021" crc="eff99db3" sha1="fe60a9f0ad034d006d91752ff9e5c4b21fac175d" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - exploring the earth's tilt" />
+ <dataarea name="flop" size="235012">
+ <rom name="microzine no. 39 (1991)(scholastic) - disk 2, side 2- exploring the earth's tilt.woz" size="235012" crc="96031b86" sha1="9e582cac2eaf4a1d52d7fe5ae61d6b3a3628aa11" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microz40">
+ <description>Microzine 40</description>
+ <year>1991</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Michael Repasy" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Marian Buck-Murray" />
+ <info name="programmer" value="Nadine Browning" />
+ <info name="programmer" value="Denise Chew" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-11-20 -->
+ <!-- educational disk-based magazine published by Scholastic between 1983 and 1992. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - the case of the destroyed dunker" />
+ <dataarea name="flop" size="235056">
+ <rom name="microzine no. 40 - disk 1, side 1- the case of the destroyed dunker.woz" size="235056" crc="f56452fc" sha1="add431de3319839f4b1b29d4b285189658d3ee5c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - math mall" />
+ <dataarea name="flop" size="235033">
+ <rom name="microzine no. 40 - disk 1, side 2- math mall.woz" size="235033" crc="1fef74d3" sha1="c98ea37ae6133254067a63a20d0a8a8735025754" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the great pawnee buffalo hunt" />
+ <dataarea name="flop" size="235053">
+ <rom name="microzine no. 40 - disk 2, side 1- the great pawnee buffalo hunt.woz" size="235053" crc="ca11186a" sha1="8aba25d5dc092e656dddc9393cbff6c22d5de000" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - exploring animal adaptations" />
+ <dataarea name="flop" size="235052">
+ <rom name="microzine no. 40 - disk 2, side 2- exploring animal adaptations.woz" size="235052" crc="1b1c968c" sha1="7e69774e1ce3386a591bd30ac280a1679348b9f8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr1">
+ <description>Microzine Jr. 1</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Claire Curtin" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edwin Torres" />
+ <info name="programmer" value="Joan Auclair" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-11-20 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, eye spy" />
+ <dataarea name="flop" size="235322">
+ <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 1, side 1- microzine jr. guide, eye spy.woz" size="235322" crc="d9f8b54e" sha1="5c6ba8ce91a8e71529f5fe3566ddc6f2e66258a2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - mask maker" />
+ <dataarea name="flop" size="235304">
+ <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 1, side 2- mask maker.woz" size="235304" crc="a19b7ac3" sha1="0f4862996458b8afac079c521935fb56e03a85cd" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - safari" />
+ <dataarea name="flop" size="235301">
+ <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 2, side 1- safari.woz" size="235301" crc="aafb1278" sha1="e6c04e1c37802524a23e2719ee16da561ad39625" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - talk to b.e.r.t." />
+ <dataarea name="flop" size="235310">
+ <rom name="microzine jr. no. 1 (1988)(scholastic) - disk 2, side 2- talk to b.e.r.t..woz" size="235310" crc="2d428709" sha1="63c70e0de983175a507a6b8990da676c28ae89b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr2">
+ <description>Microzine Jr. 2</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Edit Torres" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, the case of the garden plot" />
+ <dataarea name="flop" size="235331">
+ <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 1, side 1- microzine jr. guide, the case of the garden plot.woz" size="235331" crc="9f98ad48" sha1="508e22bcf2908bebfc046ae0960d1aef873089e3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - graph maker" />
+ <dataarea name="flop" size="235294">
+ <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 1, side 2- graph maker.woz" size="235294" crc="02d0f4fc" sha1="9df933af0b5e2f21f33a580e2515490bf9314291" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - crickety manor" />
+ <dataarea name="flop" size="235297">
+ <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 2, side 1- crickety manor.woz" size="235297" crc="308f0b0f" sha1="8bd69b5afe34e451b9f08e321b0fc375f196dc03" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - math ani-mall" />
+ <dataarea name="flop" size="235296">
+ <rom name="microzine jr. no. 2 (1988)(scholastic) - disk 2, side 2- math ani-mall.woz" size="235296" crc="d3291a03" sha1="8a54f29ada5dff083827fd936d36efbc331b43d0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr3">
+ <description>Microzine Jr. 3</description>
+ <year>1988</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="A. Caleb Gattegno" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Swartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, fuzzy to focused" />
+ <dataarea name="flop" size="235312">
+ <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, fuzzy to focused.woz" size="235312" crc="1eeace45" sha1="a41abeb9a4665cead7c633d221666d91c2e6cd82" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - going dotty" />
+ <dataarea name="flop" size="235286">
+ <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 1, side 2- going dotty.woz" size="235286" crc="007719d4" sha1="4782ef94d3f550b49ec60bd8a8120094f0140ea5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the great frankfurter" />
+ <dataarea name="flop" size="235296">
+ <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 2, side 1- the great frankfurter.woz" size="235296" crc="1b0836f7" sha1="50584c334172872fb50f06d3accabaffeb185c68" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - the balloonatics" />
+ <dataarea name="flop" size="235291">
+ <rom name="microzine jr. no. 3 (1989)(scholastic) - disk 2, side 2- the balloonatics.woz" size="235291" crc="84a35cf0" sha1="873be378705c9ff7c9aa93cc846e1975f62fe124" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr4">
+ <description>Microzine Jr. 4</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Swartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, the mixed-up kitchen" />
+ <dataarea name="flop" size="235283">
+ <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the mixed-up kitchen.woz" size="235283" crc="94fcdff3" sha1="f3b86fc0842202ee8c2ed92bde6f3b604de42ba8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - jigsaw puzzler" />
+ <dataarea name="flop" size="235256">
+ <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 1, side 2- jigsaw puzzler.woz" size="235256" crc="82a10334" sha1="4c2013ade13f23e5afdd9dfe81eabd9d932e3018" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - zoostorm" />
+ <dataarea name="flop" size="235250">
+ <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 2, side 1- zoostorm.woz" size="235250" crc="e1d0773e" sha1="5eaad84e4718e7dc24d98dd724e371aa5712d5e6" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - math ani-mall" />
+ <dataarea name="flop" size="235255">
+ <rom name="microzine jr. no. 4 (1989)(scholastic) - disk 2, side 2- math ani-mall.woz" size="235255" crc="74b1c393" sha1="3173319d9015b6e4c820cc381bef4611e0a4581a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr5">
+ <description>Microzine Jr. 5</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Swartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="John Ricco" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Nancy Waks" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- "Microzine Jr. No. 5" is a 1989 set of educational games and programs distributed by Scholastic. Credits: . -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, the case of the class trip" />
+ <dataarea name="flop" size="235339">
+ <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the case of the class trip.woz" size="235339" crc="ae488431" sha1="b929bac3f618d9bc61726162779da8096eb6eae0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - board silly" />
+ <dataarea name="flop" size="235303">
+ <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 1, side 2- board silly.woz" size="235303" crc="231bb030" sha1="61ef6d71d19bd89a49dbd04e38330f89612b490a" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - your town" />
+ <dataarea name="flop" size="235301">
+ <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 2, side 1- your town.woz" size="235301" crc="3dc03ae3" sha1="3fd67f9f647d8083d1d3d7311b7c8f4b59c81ab7" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - something fishy" />
+ <dataarea name="flop" size="235307">
+ <rom name="microzine jr. no. 5 (1989)(scholastic) - disk 2, side 2- something fishy.woz" size="235307" crc="3fc2f491" sha1="a981be87ad53c5f41501fa14d562900625d68818" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr6">
+ <description>Microzine Jr. 6</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Nordlicht" />
+ <info name="programmer" value="Alan R. Swartz" />
+ <info name="programmer" value="Julia Watkins" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="John Ricco" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, on the go" />
+ <dataarea name="flop" size="235289">
+ <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, on the go.woz" size="235289" crc="b189b6c7" sha1="c31f286f6308560e20c0d8073ec1611f66e67ee0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - information please- a database" />
+ <dataarea name="flop" size="235289">
+ <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 1, side 2- information please- a database.woz" size="235289" crc="8905ae32" sha1="58d830a04bd3711bfc81413fb377226c2f12588b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - bobo's fun house" />
+ <dataarea name="flop" size="235275">
+ <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 2, side 1- bobo's fun house.woz" size="235275" crc="60ccbbe7" sha1="775abb0c1d7dbd3a239c00d2bcb41405beada848" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - the case of the missing lunch box" />
+ <dataarea name="flop" size="235292">
+ <rom name="microzine jr. no. 6 (1989)(scholastic) - disk 2, side 2- the case of the missing lunch box.woz" size="235292" crc="8354ea20" sha1="f6e5d5a2b0c4126ee58e86a13f9feffc0b5aba12" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr7">
+ <description>Microzine Jr. 7</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Alan R. Swartz" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lainee Cohen" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="programmer" value="Jenny Grant" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, around the block" />
+ <dataarea name="flop" size="235308">
+ <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, around the block.woz" size="235308" crc="24bffedc" sha1="96f2de3f625f05566b3feb6014e9a6c375563021" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - shape machines" />
+ <dataarea name="flop" size="235285">
+ <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 1, side 2- shape machines.woz" size="235285" crc="eeb45135" sha1="063a3976217c4e7b160fa0962960cb30938eff0b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - walkabout" />
+ <dataarea name="flop" size="235280">
+ <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 2, side 1- walkabout.woz" size="235280" crc="d9c229bc" sha1="91498cbacf81923fde580e81a4c1ee81bcdfc07a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - fill-in fun" />
+ <dataarea name="flop" size="235282">
+ <rom name="microzine jr. no. 7 (1989)(scholastic) - disk 2, side 2- fill-in fun.woz" size="235282" crc="9c1612d2" sha1="08fbff5433655e0d427fb9636109160357aef00c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr8">
+ <description>Microzine Jr. 8</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Amy E. McKinley" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Maureen Stapleton" />
+ <info name="programmer" value="Jessica Stonier" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, the cookie caper" />
+ <dataarea name="flop" size="235259">
+ <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the cookie caper.woz" size="235259" crc="bc2b25e7" sha1="754e1c9cfcdf2703bcb67630d0784ef338ddc6a5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - paint the floor" />
+ <dataarea name="flop" size="235237">
+ <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 1, side 2- paint the floor.woz" size="235237" crc="fe57f10b" sha1="e84a85d8ba80bedcbc71b1ae486482aa68fb00e9" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - let's celebrate" />
+ <dataarea name="flop" size="235238">
+ <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 2, side 1- let's celebrate.woz" size="235238" crc="924a2da5" sha1="10f483af4eed715ba523fe704acc1b88804748c5" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - touch the target" />
+ <dataarea name="flop" size="235238">
+ <rom name="microzine jr. no. 8 (1989)(scholastic) - disk 2, side 2- touch the target.woz" size="235238" crc="566dce34" sha1="461ef76e37c6978a3ed109de6fa31f6c49e33835" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr9">
+ <description>Microzine Jr. 9</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Maureen Stapleton" />
+ <info name="programmer" value="Jessica Stonier" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - microzine jr. guide, the confusing classroom" />
+ <dataarea name="flop" size="235224">
+ <rom name="microzine jr. no. 9 (1989)(scholastic) - disk 1, side 1- microzine jr. guide, the confusing classroom.woz" size="235224" crc="2341c2f0" sha1="9832f3231f25fd29ad9597828798d78f0e1aadf2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - super sundae factory" />
+ <dataarea name="flop" size="235200">
+ <rom name="microzine jr. no. 9 (1989)(scholastic) - disk 1, side 2- super sundae factory.woz" size="235200" crc="6c900e45" sha1="5cd0b97d032f0c2e46151d1c67d1aebde4952395" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the search for the sunken treasure" />
+ <dataarea name="flop" size="235214">
+ <rom name="microzine jr. no. 9 (1990)(scholastic) - disk 2, side 1- the search for the sunken treasure.woz" size="235214" crc="2f42c0fe" sha1="382c225958144c6a8227834f18014ee759b002da" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - information please- our fifty states" />
+ <dataarea name="flop" size="235216">
+ <rom name="microzine jr. no. 9 (1990)(scholastic) - disk 2, side 2- information please- our fifty states.woz" size="235216" crc="bf8a022c" sha1="61ea01574069af1a4726e376f5e0d6e55a94744f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="microzjr10">
+ <description>Microzine Jr. 10</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Cary Hammer" />
+ <info name="programmer" value="Alissa Ossip" />
+ <info name="programmer" value="Donald Way" />
+ <info name="programmer" value="Jo Ann Comito" />
+ <info name="programmer" value="Stuart Blavatnik" />
+ <info name="programmer" value="Rose Trivisonno" />
+ <info name="programmer" value="Lisa Feder-Feitel" />
+ <info name="programmer" value="Lisa Mandel" />
+ <info name="programmer" value="Jessica Stonier" />
+ <info name="programmer" value="Tara Framer" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-05-17 -->
+ <!-- educational disk-based magazine published by Scholastic between 1988 and 1989. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - the case of the missing microzine jr." />
+ <dataarea name="flop" size="235178">
+ <rom name="microzine jr. no. 10 - disk 1, side 1- the case of the missing microzine jr..woz" size="235178" crc="959911ed" sha1="9d5415dc2622e11442c6c6edd15163211a07579d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - snorting the snorks" />
+ <dataarea name="flop" size="235160">
+ <rom name="microzine jr. no. 10 - disk 1, side 2- snorting the snorks.woz" size="235160" crc="df78d04f" sha1="2aeb83c9d4afcea915b1e51691006a5e9a62485c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - the whale-of-the-month club" />
+ <dataarea name="flop" size="235168">
+ <rom name="microzine jr. no. 10 - disk 2, side 1- the whale-of-the-month club.woz" size="235168" crc="f3fe6a6f" sha1="b37b4c507b4c8924d0b0f1937004943a8c0e676b" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - p.s. write back" />
+ <dataarea name="flop" size="235156">
+ <rom name="microzine jr. no. 10 - disk 2, side 2- p.s. write back.woz" size="235156" crc="7a23b43c" sha1="456465d26252fea66a0bcca9c54bd379c84ec1d9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi4">
+ <description>MIDI/4 (revision 5)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234771">
+ <rom name="midi-4 rev. 5.woz" size="234771" crc="8e887d19" sha1="cea449b6de13b965a58a2f8a7a79f23663fade3b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi8p">
+ <description>MIDI/8 Plus (version 1.2)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234789">
+ <rom name="midi-8 plus v1.2.woz" size="234789" crc="1dcb5816" sha1="6ef26bb5c5adc32ccb7bbf2b84637ca9d0e00012" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midi8p401">
+ <description>MIDI/8 Plus for MPU-401 (version 1.2)</description>
+ <year>1985</year>
+ <publisher>Passport Designs</publisher>
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-17 -->
+ <!-- sound utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="midi-8 plus for mpu-401 v1.2.woz" size="234785" crc="d1bc7097" sha1="5d5c5fe2bac36abae3bcbda2b9925012816a2675" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="midmalad">
+ <description>Midnight Malady (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="programmer" value="Steven Sacks" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="248084">
+ <rom name="midnight malady.woz" size="248084" crc="e5a4d95e" sha1="8b6370623049bf6d2312d2706fbb6e2da28c3b54" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mndcstl1">
+ <description>Mind Castle I</description>
+ <year>1984</year>
+ <publisher>MCE</publisher>
+ <info name="developer" value="MCE" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234732">
+ <rom name="mind castle i.woz" size="234732" crc="eada423e" sha1="4670af60cc736d12c2b650580b9b7a403cfee375" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mndcstl2">
+ <description>Mind Castle II</description>
+ <year>1984</year>
+ <publisher>MCE</publisher>
+ <info name="developer" value="MCE" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234733">
+ <rom name="mind castle ii.woz" size="234733" crc="932e2cce" sha1="5e6073a176c8c903647d3a20c77917745a4766f7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mindmror">
+ <description>Mind Mirror</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Futique, Inc." />
+ <info name="author" value="Timothy Leary" />
+ <info name="programmer" value="Peter van den Beemt" />
+ <info name="programmer" value="Bob Dietz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="228157">
+ <rom name="mind mirror - side 1 - program.woz" size="228157" crc="ff3ca6b9" sha1="a148b04f37305f6be616edfa382c0197fa2a9b88" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Life simulation A" />
+ <dataarea name="flop" size="234831">
+ <rom name="mind mirror - side 2 - life simulation disk a.woz" size="234831" crc="b58cd2eb" sha1="2cb391acf4b790b69f922bdb981054edd3ddbecd" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Life simulation B" />
+ <dataarea name="flop" size="234831">
+ <rom name="mind mirror - side 3 - life simulation disk b.woz" size="234831" crc="3ae0ef8b" sha1="f8b8789c05c3d95cd7dbb25cd972acbb46113238" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mindpurs">
+ <description>Mind Pursuit</description>
+ <year>1986</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Steven Duboff" />
+ <info name="programmer" value="Jeff Warth" />
+ <info name="programmer" value="Stephen Montero" />
+ <info name="programmer" value="John P. Sohl" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234803">
+ <rom name="mind pursuit side a.woz" size="234803" crc="26d05997" sha1="fa24a704a5a8eedd6e1c38fd9fd22f974c5f23ec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234834">
+ <rom name="mind pursuit side b.woz" size="234834" crc="ace7e204" sha1="1d969f08caf0c18cc69a1416166f82f973bf9faa" />
</dataarea>
</part>
</software>
@@ -29008,11 +31122,12 @@ license:CC0-1.0
<description>Miner 2049er</description>
<year>1982</year>
<publisher>Micro Fun</publisher>
- <info name="programmer" value="Mike Livesay and Bill Hogue" />
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Bill Hogue" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-08-19-->
- <!--action game-->
+ <!-- Dump released: 2018-08-19 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="233469">
<rom name="miner 2049er.woz" size="233469" crc="472481cb" sha1="56bf80d1cad8f54503134cf0a1acd207d8f0b01d" />
@@ -29024,11 +31139,12 @@ license:CC0-1.0
<description>Miner 2049er II</description>
<year>1984</year>
<publisher>Micro Fun</publisher>
- <info name="programmer" value="Mike Livesay and Bill Hogue" />
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Bill Hogue" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-01-24-->
- <!--action game-->
+ <!-- Dump released: 2020-01-24 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234769">
<rom name="miner 2049er ii.woz" size="234769" crc="6ba9469f" sha1="b20e14d8a1dc69438c195e7512d6389aa1b83e94" />
@@ -29036,16 +31152,140 @@ license:CC0-1.0
</part>
</software>
+ <software name="mingchal">
+ <description>Ming's Challenge</description>
+ <year>1982</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Mike Livesay" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233746">
+ <rom name="ming's challenge.woz" size="233746" crc="155dd8de" sha1="14179cd6704f849c0446c7f0402e71cf70742e24" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="minitman">
+ <description>Minit Man</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Greg Malone" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233479">
+ <rom name="minit man.woz" size="233479" crc="1a8738dc" sha1="f67c0c46423d3d1b7cab9cb4487749e4079e5a1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="misldefn">
+ <description>Missile Defense</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="D. W. Clark" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="missile defense.woz" size="234791" crc="dc3abde9" sha1="a148b79074ceb7f4fa2849982ae4a681bf00b466" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mixdupmg">
+ <description>Mixed-Up Mother Goose (version 1.0I)</description>
+ <year>1991</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="David Slayback" />
+ <info name="programmer" value="Doug Oldfield" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Araenda-Lambarda" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0I" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234889">
+ <rom name="mixed-up mother goose disk 1a.woz" size="234889" crc="e5936135" sha1="ce0dace644e3c3615a2547c0a8e6ba7dc8728528" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234889">
+ <rom name="mixed-up mother goose disk 1b.woz" size="234889" crc="8d6f807d" sha1="6612b325ea9321cee56a757f23842ad8430f8bd5" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234889">
+ <rom name="mixed-up mother goose disk 2a.woz" size="234889" crc="4e3367e5" sha1="73c96fc31a387f0bbbaba27378ea4ca2b4dbc2e4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234889">
+ <rom name="mixed-up mother goose disk 2b.woz" size="234889" crc="1d0ddec9" sha1="455191cc4b028b0b845a9365d1004f65fb082ff4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moebius">
+ <description>Moebius: The Orb of Celestial Harmony</description>
+ <year>1985</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Greg Malone" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234803">
+ <rom name="moebius side a.woz" size="234803" crc="77d01e55" sha1="3a256eb00dfd7db3bc86b9a8a6f37d9ac6508e56" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234803">
+ <rom name="moebius side b.woz" size="234803" crc="8718b501" sha1="adb068d1b804f5ddac323dc56d90cc8826d738f0" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C" />
+ <dataarea name="flop" size="234803">
+ <rom name="moebius side c.woz" size="234803" crc="1737fe44" sha1="87a67fb39fb342a1489be258ad46bc1f0509753e" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D" />
+ <dataarea name="flop" size="234803">
+ <rom name="moebius side d.woz" size="234803" crc="327673a2" sha1="6fb014fee91b704d783b49d1abb885cd263c9623" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="modeling">
<description>Modeling (A-823 version 1.0)</description>
<year>1983</year>
<publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
<info name="partno" value="A-823" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-20-->
- <!--education program-->
+ <!-- Dump released: 2023-06-20 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234783">
<rom name="modeling v1.0.woz" size="234783" crc="21861618" sha1="95c91939f2707247132eb349276257d3b0c0396a" />
@@ -29053,15 +31293,38 @@ license:CC0-1.0
</part>
</software>
- <software name="mdbiogen">
+ <software name="mbcellres">
+ <description>Modern Biology: Cellular Respiration</description>
+ <year>1989</year>
+ <publisher>Holt, Rinehart and Winston</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="241462">
+ <rom name="modern biology - cellular respiration side 1.woz" size="241462" crc="fb232e04" sha1="ad1ad73892935d1aad4f1d5149682fd417e0a647" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="241462">
+ <rom name="modern biology - cellular respiration side 2.woz" size="241462" crc="02fb7eab" sha1="b772314f763597b59b7559b3677825e96d8ed72a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mbgenet">
<description>Modern Biology: Genetics</description>
<year>1989</year>
<publisher>Holt, Rinehart and Winston</publisher>
<info name="developer" value="Prentice Associates" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-04-24-->
- <!--education program-->
+ <!-- Dump released: 2021-04-24 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1" />
<dataarea name="flop" size="234826">
@@ -29088,6 +31351,119 @@ license:CC0-1.0
</part>
</software>
+ <software name="mbphoto">
+ <description>Modern Biology: Photosynthesis</description>
+ <year>1989</year>
+ <publisher>Holt, Rinehart and Winston</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="234800">
+ <rom name="modern biology - photosynthesis side 1.woz" size="234800" crc="3382ce6e" sha1="3da3c33816824a21c132b711f7d3d73e3465abf9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="234800">
+ <rom name="modern biology - photosynthesis side 2.woz" size="234800" crc="8d3778e3" sha1="ed43536e24573fbe79853220a9cad736df003eaf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moneywrks10" cloneof="moneywrks">
+ <description>Money Works (A-195 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-195" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234750">
+ <rom name="money works.woz" size="234750" crc="fd525e60" sha1="6082a8ea50e8b55e10a5f75a75d3f3dff84b1ef8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moneywrks">
+ <description>Money Works (A-195 version 1.1) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-195" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- A duplicate version was released on 2025-10-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345307">
+ <rom name="money works 800k.woz" size="1345307" crc="987b2d28" sha1="fa7f0d6c6fbf1ce041b9fabb3ea4d81db37e97dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mnymny091384">
+ <description>Money! Money! (version 09.13.84)</description>
+ <year>1984</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.13.84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="money money v09.13.84.woz" size="234762" crc="8914b4ee" sha1="da5b3ae28fdeabe3bcb15f9fc0f53084224d3fa7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mnkybsnsr1" cloneof="mnkybsns">
+ <description>Monkey Business (revision 1)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234744">
+ <rom name="monkey business rev. 1.woz" size="234744" crc="90e34199" sha1="959fc2158bd2456e42d48da1512cdb3e34f1c0f7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mnkybsns">
+ <description>Monkey Business (revision 2)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Shows the Litag developer screen and the Learning Technologies screen is different. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234760">
+ <rom name="monkey business rev. 2.woz" size="234760" crc="aba219e9" sha1="c56bc40c0f4e7d740d6dd94b89b165961178fac9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mnstsmsh">
<description>Monster Smash (version 2.0)</description>
<year>1983</year>
@@ -29096,8 +31472,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-01-04-->
- <!--action game-->
+ <!-- Dump released: 2019-01-04 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="233476">
<rom name="monster smash.woz" size="233476" crc="a2a01373" sha1="a0aeea2f9b66a1ff725fa5e49a3c5398a3be1273" />
@@ -29105,6 +31481,986 @@ license:CC0-1.0
</part>
</software>
+ <software name="monsmons">
+ <description>Monstrous Monsters (version 1.0)</description>
+ <year>1990</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234773">
+ <rom name="monstrous monsters v1.0 - program.woz" size="234773" crc="a3537d03" sha1="c751842d781dd45ce69b6a31945d4eb89b4eabc4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Frames and fonts" />
+ <dataarea name="flop" size="234782">
+ <rom name="monstrous monsters v1.0 - frames and fonts.woz" size="234782" crc="94dfc7c1" sha1="060f226e5fddbef7ee22e514a514114ea43e5151" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Posters" />
+ <dataarea name="flop" size="234773">
+ <rom name="monstrous monsters v1.0 - posters.woz" size="234773" crc="03617481" sha1="cfd16f4b4662c0af0cd4b4e9063bd688b8b658a1" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Clip art" />
+ <dataarea name="flop" size="234774">
+ <rom name="monstrous monsters v1.0 - clip art.woz" size="234774" crc="e001631f" sha1="bd9b7bba2dc5d07a19eb40c1258ff2ebb7a78728" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mpatrol">
+ <description>Moon Patrol (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-26 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="346602">
+ <rom name="moon patrol.woz" size="346602" crc="8b46d4fc" sha1="df0d7aee0cd9810cb254f4f28dad3b96792a26a3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moonmadl1">
+ <description>Moonlight &amp; Madness: Level I (version 03.22.88)</description>
+ <year>1988</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Learning Lab Publishing" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="03.22.88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234821">
+ <rom name="moonlight &amp; madness i v03.22.88 disk 1.woz" size="234821" crc="6a1559a3" sha1="bd172fe59a5b0ef6af1729c3b1b781d02b67dce7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234788">
+ <rom name="moonlight &amp; madness i v03.22.88 disk 2.woz" size="234788" crc="51e47183" sha1="ed992ed490dc2ede9a68a987f1975d237db07139" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moptown">
+ <description>Moptown (version 1981)</description>
+ <year>1981</year>
+ <publisher>Advanced Learning Technology</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1981" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235421">
+ <rom name="moptown.woz" size="235421" crc="228f8de0" sha1="7c20f871e47b76ed12b647fc5adffcaa93f7036f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnhtl12" cloneof="mptwnhtl">
+ <description>Moptown Hotel (version 1.2)</description>
+ <year>1981</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="201547">
+ <rom name="moptown hotel v1.2.woz" size="201547" crc="c9ebdb2b" sha1="534aac11fc09b0c53ba3079287dde484f0953e0e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnhtl">
+ <description>Moptown Hotel (version 1.3)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="moptown hotel v1.3.woz" size="234796" crc="d056628b" sha1="ebd8ad6023e4e494ec4398d20e71850f08f2b396" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptwnpar10">
+ <description>Moptown Parade (version 1.0)</description>
+ <year>1981</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="181549">
+ <rom name="moptown parade v1.0.woz" size="181549" crc="f336b42c" sha1="08fd07f9b0312586ff4e9f5c68f692499c366e60" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtftdecfra">
+ <description>More Teasers from Tobbs: Decimals and Fractions</description>
+ <year>1990</year>
+ <publisher>WINGS for learning</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="James Kim" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234828">
+ <rom name="more teasers from tobbs- decimals and fractions.woz" size="234828" crc="9a499dba" sha1="b436c1345fd2a0cc79dc4ed12ba731881b7d9d0a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moseslhp">
+ <description>Moses Leads His People</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234808">
+ <rom name="moses leads his people side a.woz" size="234808" crc="37fe4e47" sha1="589c0e20de055605014f1d54edf3b92696fbbd81" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234808">
+ <rom name="moses leads his people side b.woz" size="234808" crc="77c338ad" sha1="25963f6c92f719dd6d67e39e4a2571aca8dfb93d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtrcycls">
+ <description>Motorcycles</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234741">
+ <rom name="motorcycles.woz" size="234741" crc="c3f8adb0" sha1="0b5494ae379ccf14cc19cef3944a3c8f6e74fb0b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mouskatk">
+ <description>Mouskattack</description>
+ <year>1982</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Al Nystrom" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234799">
+ <rom name="mouskattack.woz" size="234799" crc="47fb8922" sha1="5e1cf3887d549c20e9c440e26ab27a0bfda00e73" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrcool">
+ <description>Mr. Cool</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Peter Oliphant" />
+ <info name="programmer" value="John Redekopp" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="mr. cool.woz" size="234781" crc="e40dca20" sha1="0dc5a1222ecd1cb56913c78b6a36d5f63b44910e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pxcartnk">
+ <description>Mr. Pixel's Cartoon Kit</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Master Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="mr. pixel's cartoon kit.woz" size="234769" crc="c01779bc" sha1="590d28e0eba6f156409f0f252d39f9cb34efeaa8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pxppaint">
+ <description>Mr. Pixel's Programming Paint Set</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Master Software" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="mr. pixel's programming paint set.woz" size="234779" crc="00bee281" sha1="5e44c24f727277c74d23f3fe6fca49784a2e4a74" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mrswiggl">
+ <description>Mrs. Wigglesworth's Secret: Drawing Conclusions</description>
+ <year>1986</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="mrs. wigglesworth's secret - drawing conclusions.woz" size="234785" crc="692a79e3" sha1="778bab447ebcd74dd1886b8c2e7e1291c00ef66d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mspac">
+ <description>Ms. Pac-Man (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-30 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="53744">
+ <rom name="ms. pac-man.woz" size="53744" crc="4abe0f76" sha1="29d49e4ab496d095691cef66936f2fe7b95b2d4e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="multmean">
+ <description>Multiple Meanings (version 08.24.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Milt Collins" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="08.24.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234806">
+ <rom name="multiple meanings v08.24.89 disk 1.woz" size="234806" crc="471f0e4b" sha1="62eed3761b9b4d6abaed414e311431caa9866709" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234773">
+ <rom name="multiple meanings v08.24.89 disk 2.woz" size="234773" crc="46910087" sha1="fce3b1cfb43c45a68856a54fdfc37b66475cee2e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mumcurseh" cloneof="mumcurse">
+ <description>Mummy's Curse (Highland Computers)</description>
+ <year>1981</year>
+ <publisher>Highlands Computers</publisher>
+ <info name="developer" value="Highlands Computers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241416">
+ <rom name="mummy's curse.woz" size="241416" crc="d78b9448" sha1="6dfc6e19addeee99a5642e5920604e80a56140bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mumcurse">
+ <description>Mummy's Curse (Softsmith)</description>
+ <year>1981</year>
+ <publisher>Softsmith</publisher>
+ <info name="developer" value="Highlands Computers" />
+ <info name="original_publisher" value="Highlands Computers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="201484">
+ <rom name="mummy's curse (softsmith).woz" size="201484" crc="15889426" sha1="939f8d9e82bcfcc2205318b2828483d332902bbc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mlkdsdsk" cloneof="mptstg">
+ <description>Muppet Learning Keys: The Muppet Discovery Disk</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="programmer" value="Jon Sweedler" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Sold with the Muppet Learning Keys Kid's Computer Keyboard. -->
+ <!-- The Muppet Discovery Book was retitled Muppets on Stage in 1987, and published a separate program. -->
+ <!-- Dump released: 2019-09-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235513">
+ <rom name="muppet learning keys- the muppet discovery disk.woz" size="235513" crc="0032f3a8" sha1="0d9d9bb049071262d9246e766631c509a7266de0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppmath">
+ <description>Muppet Math</description>
+ <year>1991</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Mary Anne Hermann" />
+ <info name="programmer" value="Chris Cerf" />
+ <info name="programmer" value="Barbara Wood Scott Clough" />
+ <info name="programmer" value="Eric Grubbs" />
+ <info name="programmer" value="Greg Johnson" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234884">
+ <rom name="muppet math.woz" size="234884" crc="ca1d1e02" sha1="3d1e4870c7d8b0428f4c5249e8a5e0b670d77f62" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppslat10" cloneof="muppslat">
+ <description>Muppet Slate: The Word and Picture Processor (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher and boot" />
+ <dataarea name="flop" size="234848">
+ <rom name="muppet slate v1.0 - disk 1 - teacher disk.woz" size="234848" crc="f014b4de" sha1="6a33813654a34c27face508ba10bf8fd03d8b44f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master student version 1.0" />
+ <dataarea name="flop" size="234855">
+ <rom name="muppet slate v1.0 - disk 2 - master student disk.woz" size="234855" crc="491b07bd" sha1="5cc20b04d5846139fbeed50189c77ef036745c75" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppslat">
+ <description>Muppet Slate: The Word and Picture Processor (version 1.01)</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="programmer" value="Scott Clough" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.01" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher and boot" />
+ <dataarea name="flop" size="234850">
+ <rom name="muppet slate v1.0.1 - disk 1 - teacher disk.woz" size="234850" crc="649fc542" sha1="d6531dc70909efdfeb8243d296deb2868e0b359b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master student version 1.1" />
+ <dataarea name="flop" size="234857">
+ <rom name="muppet slate v1.0.1 - disk 2 - master student disk.woz" size="234857" crc="4c31631b" sha1="d953d4f3c8616d75bdfa6867ae5a8b9a9d481b5d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muptwdbk">
+ <description>Muppet Word Book: An Introduction to Letters, Words, and Writing</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="programmer" value="Melissa Verber" />
+ <info name="programmer" value="Christopher Cerf" />
+ <info name="programmer" value="Bill Prady" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234681">
+ <rom name="muppet word book.woz" size="234681" crc="df55fa2b" sha1="fd0f0a4456f848ca99688b6c030e19293670b81a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mptstg">
+ <description>Muppets on Stage</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="programmer" value="Jon Sweedler" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- The Muppet Discovery Book was retitled Muppets on Stage in 1987, and published as a separate program. -->
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234770">
+ <rom name="muppets on stage.woz" size="234770" crc="0273fc7c" sha1="f5ea49e8c616e756649e5dc9619abb5b15ba286a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muppetvl">
+ <description>Muppetville</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Christopher Cerf" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="programmer" value="Joni Jablonsky" />
+ <info name="programmer" value="Anders McCarthy" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="muppetville.woz" size="234769" crc="d30623fb" sha1="ae45a94b06339df594d68ac5c571e9d0babed035" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="murdzind">
+ <description>Murder on the Zinderneuf</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Paul Reiche" />
+ <info name="author" value="Jon Freeman" />
+ <info name="programmer" value="Alan Pavlish" />
+ <info name="programmer" value="Robert Leyland" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-21 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228159">
+ <rom name="murder on the zinderneuf.woz" size="228159" crc="19f5899b" sha1="4a1053abd44137d11ad1302114a44aad25870293" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="musicapp">
+ <description>Music Appreciation: A Study Guide</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph E. Koob" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - The Musical Language" />
+ <dataarea name="flop" size="234817">
+ <rom name="music appreciation disk 1a - the musical language.woz" size="234817" crc="282696fa" sha1="26885d0c1f8c46a50c787928ed36a56546c61a9c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - The Musical Language" />
+ <dataarea name="flop" size="234817">
+ <rom name="music appreciation disk 1b - the musical language.woz" size="234817" crc="496d992e" sha1="d4b044f0cb2f40dec9b6c1f8470c598f13f11e89" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Music History" />
+ <dataarea name="flop" size="234810">
+ <rom name="music appreciation disk 2a - music history.woz" size="234810" crc="65153167" sha1="ebc0b39e6e6a19296bd8c400e444d12f03641d1c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Music History" />
+ <dataarea name="flop" size="234810">
+ <rom name="music appreciation disk 2b - music history.woz" size="234810" crc="b7316d3d" sha1="a4bc6bccffa3c3c51549e4801ca255341af36689" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcpquiz">
+ <description>Music Composer Quiz</description>
+ <year>1985</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Joseph A. Brownlee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="music composer quiz.woz" size="234791" crc="9cc3203c" sha1="e5852330264742d1d39e211510f10a650316f7d7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="musiccon">
+ <description>Music Concepts</description>
+ <year>1984</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234739">
+ <rom name="music concepts disk 1.woz" size="234739" crc="7213486c" sha1="f3264743c18ff024bf4d50ede1860d97d495fadb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234739">
+ <rom name="music concepts disk 2.woz" size="234739" crc="e27fa058" sha1="cbf8fa907aa266b31dc603cd607b1df471034893" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcsr1" cloneof="mcs">
+ <description>Music Construction Set (revision 1)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- first release -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-18 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228126">
+ <rom name="music construction set rev. 1.woz" size="228126" crc="3fec83b1" sha1="8f184e71edec57d9278741c0023037a00fdff1e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcsr2" cloneof="mcs">
+ <description>Music Construction Set (revision 2)</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Adds support for the Mock II -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-18 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228129">
+ <rom name="music construction set rev. 2.woz" size="228129" crc="1e223c80" sha1="faf82c8cf8e7e2dd3b2889d2eefe831403603555" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcsr3" cloneof="mcs">
+ <description>Music Construction Set (revision 3)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <!-- Adds support for the mouse for input, Mockingboard C for output, and printer selection by name -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-18 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228126">
+ <rom name="music construction set rev. 3.woz" size="228126" crc="b91bd9c8" sha1="910a7f9fe94cefaa1670d69e5abc90bf0c355e2d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcs">
+ <description>Music Construction Set (revision 4)</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 4" />
+ <!-- Adds support for Mockingboard D for output, and printer interface card selection by name -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-18 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228841">
+ <rom name="music construction set rev. 4.woz" size="228841" crc="5ec255e4" sha1="063f68b15d108b97eb890dfbb7d0274b8483f50e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mhrcomp">
+ <description>Music History Review: Composers</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="William R. Higgins" />
+ <info name="programmer" value="Ronald L. Miller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234820">
+ <rom name="music history review- composers.woz" size="234820" crc="0cc4da8d" sha1="bbcd6652af65538d5d31073aff9c36f389f0e63e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mtflscrd">
+ <description>Music Theory Flash Cards (version 10/2/84)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10/2/84" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234782">
+ <rom name="music flashcards disk 1.woz" size="234782" crc="bc1e4905" sha1="4a720b336ac6fbc8ae594a3451261b83736d2753" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234782">
+ <rom name="music flashcards disk 2.woz" size="234782" crc="bcb3131a" sha1="e35274c0d07ce0eab79f1eb3af6fd15dd33be036" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234782">
+ <rom name="music flashcards disk 3.woz" size="234782" crc="f9685e25" sha1="58b5b3721a2dda980d5592412fa9aa8112a8005b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstairs84">
+ <description>Musical Stairs (version 1984)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Stephen L. Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- The 1984 version does not use MIDI, but the 1985 version requires it. -->
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="musical stairs.woz" size="234785" crc="91498e94" sha1="6db6abc8753fd9789cc0bc2be194edb6ad73c1c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstermin">
+ <description>Musical Terminology</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234783">
+ <rom name="music terminology.woz" size="234783" crc="5548f0a7" sha1="3749736d30c65659cbf01c339279ec332b7e7f7d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mystsntcr1" cloneof="mystsntc">
+ <description>Mystery Sentences (revision 1)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Scholastic" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234774">
+ <rom name="mystery sentences rev. 1 - program disk.woz" size="234774" crc="edd9ac10" sha1="9502fd7f690e2646334bfe0f5b588bd1d23bf958" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Sentence file" />
+ <dataarea name="flop" size="234780">
+ <rom name="mystery sentences rev. 1 - sentence file disk.woz" size="234780" crc="728797b3" sha1="60d494a11011b28d59a7f4447c08549683e1f4b4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mystsntc">
+ <description>Mystery Sentences (revision 2)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Scholastic" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234774">
+ <rom name="mystery sentences rev. 2 - program disk.woz" size="234774" crc="12d18bfc" sha1="188b6d5e412c6770813b5731c633813cb0415089" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Sentence file" />
+ <dataarea name="flop" size="234780">
+ <rom name="mystery sentences rev. 2 - sentence file disk.woz" size="234780" crc="25682b58" sha1="a7b5af641e40de6f82227f141094469364d834f2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nam">
+ <description>NAM (version 1.0)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Damon" />
+ <info name="programmer" value="Jeff Johnson" />
+ <info name="programmer" value="Marek Popiel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234835">
+ <rom name="nam.woz" size="234835" crc="22d2b2fa" sha1="f9fa9640513cfc4710ad2619aec4d3b5d2b85309" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="natocmdrr1" cloneof="natocmdr">
+ <description>NATO Commander (revision 1)</description>
+ <year>1984</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228126">
+ <rom name="nato commander.woz" size="228126" crc="13827e23" sha1="cb6672e49481bfb553c1be73bf16e91cc90f6b93" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="natocmdr11" cloneof="natocmdr">
+ <description>NATO Commander (version 1.1)</description>
+ <year>1984</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228161">
+ <rom name="nato commander v1.1.woz" size="228161" crc="1fdeb3da" sha1="b1e9bfd848d1773db654d45c466357a59a5d3b98" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="natocmdr">
+ <description>NATO Commander (version 1.2)</description>
+ <year>1984</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234774">
+ <rom name="nato commander v1.2.woz" size="234774" crc="7f8f0359" sha1="7c0d596863013e36b0e7b4bdaff2f106d0160b61" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="neuromnc">
+ <description>Neuromancer</description>
+ <year>1988</year>
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Troy A. Miles" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 1.woz" size="241467" crc="450dc5ec" sha1="540d98c2c7aceb2160d25b4136e84deec63e213c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 2.woz" size="241467" crc="4a7de9ee" sha1="5cdb323c885869dacd466122ebd6ce698fcb2471" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 3.woz" size="241467" crc="f041598b" sha1="51073328024c3568cda596656395f570044b7e31" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4" />
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 4.woz" size="241467" crc="73642b5f" sha1="ac839fd7419df495bf263f05f70784d74d1c1f16" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newworld">
+ <description>New World</description>
+ <year>1982</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="D. A. Decker, Jr." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-20 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="new world.woz" size="234801" crc="2e45639d" sha1="2b64556b6c107d07f382b4fdbb4c61db7e3bcadc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwawit">
+ <description>Newbery Winners: A Wrinkle in Time</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: A Wrinkle in Time" />
+ <info name="author" value="Madeleine L'Engle" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="newbery winners- a wrinkle in time.woz" size="234788" crc="2b02ea5d" sha1="d9a451f381ad47dfcd97a3a2f77689167af3b3d0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwbtt">
+ <description>Newbery Winners: Bridge to Terabithia</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: Bridge to Terabithia" />
+ <info name="author" value="Katherine Paterson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234791">
+ <rom name="newbery winners- bridge to terabithia.woz" size="234791" crc="de9bfb72" sha1="e41a7638650d3a839e0d1e02f093fcdd53d9b2d9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nwsndr">
+ <description>Newbery Winners: Sounder</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="alt_title" value="Micro Skillbuilder Set II: Sounder" />
+ <info name="author" value="William H. Armstrong" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234778">
+ <rom name="newbery winners- sounder.woz" size="234778" crc="61387c82" sha1="0f5a6b49fba711e1777e62564ff205b6cdb1c117" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="nibaw">
<description>Nibbles Away (version B2)</description>
<year>1981</year>
@@ -29113,8 +32469,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="B2" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-07-->
- <!--disk utility program-->
+ <!-- Dump released: 2024-03-07 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="129797">
<rom name="nibbles away vb2.woz" size="129797" crc="9d73e8fa" sha1="80391d17d7094e5c0a381cd8bf5da4c64d561f86" />
@@ -29127,12 +32483,11 @@ license:CC0-1.0
<year>1981</year>
<publisher>COMPUTER:applications</publisher>
<info name="developer" value="COMPUTER:applications" />
- <info name="usage" value="Requires an Apple ][ or Apple ][+ with 48K" />
+ <info name="usage" value="Requires an Apple ][ or Apple ][+ with 48K. Due to copy protection, it does not boot on later models without nonstandard firmware." />
<info name="version" value="A1" />
<sharedfeat name="compatibility" value="A2,A2P" />
- <!--Due to aggressive copy protection, it does not boot on later models.-->
- <!--Dump released: 2024-03-17-->
- <!--disk utility program-->
+ <!-- Dump released: 2024-03-17 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234779">
<rom name="nibbles away ii va1.woz" size="234779" crc="a247f034" sha1="c0f74dc31daa6d1ed4de765a4cf368e2ef242143" />
@@ -29148,8 +32503,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="C3" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-11-04-->
- <!--disk utility program-->
+ <!-- Dump released: 2021-11-04 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="146764">
<rom name="nibbles away ][.woz" size="146764" crc="db6d9e93" sha1="8729a7c7e69d74bb474a96e14a36a8b2fe0c085f" />
@@ -29165,8 +32520,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1.25B" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-09-->
- <!--disk utility program-->
+ <!-- Dump released: 2022-02-09 -->
+ <!-- disk utility program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="234776">
@@ -29181,6 +32536,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="nightgal">
+ <description>Nightmare Gallery</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Ron Aldrich" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241445">
+ <rom name="nightmare gallery.woz" size="241445" crc="6f221859" sha1="bdd443ea28f8c869b13ef587223bc66d499ded61" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nthatl86" supported="no">
+ <description>North Atlantic 86</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234789">
+ <rom name="north atlantic 86.woz" size="234789" crc="697e79b8" sha1="95ff32bf572d2fa5560790562668f2b6c7fe2894" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ndcity">
<description>North Dakota Cities Database (version 1.6)</description>
<year>1989</year>
@@ -29189,11 +32576,11 @@ license:CC0-1.0
<info name="usage" value="Requires a 64K Apple //e or later." />
<info name="version" value="1.6" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-17-->
- <!--educational program-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-17 -->
+ <!-- educational program -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234766">
@@ -29208,6 +32595,202 @@ license:CC0-1.0
</part>
</software>
+ <software name="nd1eleml">
+ <description>Note Detective I: Elementary Level</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Reid Alexander" />
+ <info name="programmer" value="JoEllen DeVilbiss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234863">
+ <rom name="note detective i- elementary level.woz" size="234863" crc="ab3d63f0" sha1="6cb4cc9610fd58565aab9ffedb48a7a42a7e43d7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nd2intl">
+ <description>Note Detective II: Intermediate Level</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Reid Alexander" />
+ <info name="programmer" value="JoEllen DeVilbiss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later, and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234866">
+ <rom name="note detective ii- intermediate level.woz" size="234866" crc="03655433" sha1="536802ba457063a1b0dd8fba38c4d6532b92317b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="notespelr">
+ <description>Note Speller</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Lolita Walker Gilkes" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="note speller.woz" size="234786" crc="e8aad1f1" sha1="b087775af59eb9bfb50eec571485f10bea6c2276" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nounclaus">
+ <description>Noun Clauses (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234764">
+ <rom name="noun clauses 1988.woz" size="234764" crc="74ea27b2" sha1="e45b9f629cf79ddb5375520ae33f71383f6ab058" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nysiptp">
+ <description>Now You See It, Now You Don't: Pick The Part</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Todd Rosedahl" />
+ <info name="programmer" value="Barbara Wood" />
+ <info name="programmer" value="Scott Sahs" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234771">
+ <rom name="now you see it, now you don't - pick the part.woz" size="234771" crc="9eec9318" sha1="b66ec0e2fadb99b1a8e3b7316fe7a15c926784db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nysiwit">
+ <description>Now You See It, Now You Don't: Was it there? Was it missing?</description>
+ <year>1987</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Todd Rosedahl" />
+ <info name="programmer" value="Barbara Wood" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241348">
+ <rom name="now you see it, now you don't - was it there - was it missing.woz" size="241348" crc="a7e51505" sha1="9aacdba6d7067cb8062336a177d7721203715dc9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nmbrfarm">
+ <description>Number Farm</description>
+ <year>1984</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Neosoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234793">
+ <rom name="number farm.woz" size="234793" crc="32b5f68b" sha1="b41ef0804a4f6f1191d343ba7d306a379862b999" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="numjump">
+ <description>Number Jumpers (A-341 version 1.0) (800K 3.5")</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-341" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Michael Tschimperle" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296223">
+ <rom name="number jumpers 800k.woz" size="1296223" crc="3cc155ed" sha1="cac0800a6e51675aad91d676cc236771035fe6e5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nummun_525" cloneof="nummun">
+ <description>Number Munchers (A-170 version 1.3)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-170" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240936">
+ <rom name="number munchers v1.3.woz" size="240936" crc="d778ad1a" sha1="8564c7eca2532b911ba12b4614f9fb6b6466d068" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nummun">
+ <description>Number Munchers (A-170 version 1.3) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-170" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296147">
+ <rom name="number munchers 800k.woz" size="1296147" crc="9cff06c6" sha1="3102ce194905e29afd6477dad9b7c5eb5efbb21d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nbrstmpr">
+ <description>Number Stumper</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Dennis Sorensen" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="174870">
+ <rom name="number stumper.woz" size="174870" crc="c73d0f7b" sha1="b0f37dec5a3770008fecb58437c215f3dd69744f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="numbball">
<description>Numberball</description>
<year>1994</year>
@@ -29215,8 +32798,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--education program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234766">
<rom name="numberball.woz" size="234766" crc="161a93e1" sha1="9fd7357972fbaaf16609e2b8fa8f987be08b53cd" />
@@ -29224,6 +32807,220 @@ license:CC0-1.0
</part>
</software>
+ <software name="nbdecfra">
+ <description>Number Bowling: Decimals and Fractions</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Scott, Foresman and Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234783">
+ <rom name="number bowling- decimals and fractions.woz" size="234783" crc="df964060" sha1="fe0673df3b1f5be88f2a362c908a5c22945c101d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="numbpls">
+ <description>Number Please: Visual and Sequential Memory Practice (release 1)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="release 1" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234795">
+ <rom name="number please.woz" size="234795" crc="1bffc00e" sha1="5078197737497752c68be81777d628c5c82686bc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutnabber_525" cloneof="nutnabber">
+ <description>Nutrition Nabber (A-330 version 1.0)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-330" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234838">
+ <rom name="nutrition nabber.woz" size="234838" crc="32b8ec50" sha1="6214906af74523d678531965d23cfe498ffa5adc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nutnabber">
+ <description>Nutrition Nabber (A-330 version 1.0) (800K 3.5")</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-330" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Paul Wieser" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296231">
+ <rom name="nutrition nabber 800k.woz" size="1296231" crc="574a38fa" sha1="f17a1f79e22a495b62b67a64dae6c0c0bd1587b7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odd1out86" cloneof="odd1out">
+ <description>Odd One Out (version 1986)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235503">
+ <rom name="odd one out.woz" size="235503" crc="5dced466" sha1="5dc7d46ab444124f0cbc21b0d3686a6cb11b400a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odd1out">
+ <description>Odd One Out (version 26-AUG-1990)</description>
+ <year>1990</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Paul Elseth" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="26-AUG-1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234808">
+ <rom name="odd one out 1990.woz" size="234808" crc="475a15c8" sha1="d08f7e0bf1c82ea25f46193cea30d7b4a6c79e60" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odelllk10" cloneof="odelllk">
+ <description>Odell Lake (A-191 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-191" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="odell lake v1.0.woz" size="234785" crc="17d9c15b" sha1="37dca60c701ca34e3afd07d796bafbcbf25d2ffc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odelllk_525" cloneof="odelllk">
+ <description>Odell Lake (A-191 version 1.2)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-191" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="odell lake v1.2.woz" size="234800" crc="da755acd" sha1="39f21ca32089b8ea5258bcc297df6a72268d1de8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="odelllk">
+ <description>Odell Lake (A-191 version 1.2) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-191" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="James L. Thompson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345308">
+ <rom name="odell lake 800k.woz" size="1345308" crc="f56958b8" sha1="707b02e2648493226cc4a53c239db3bc8cb4f540" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ogre">
+ <description>OGRE</description>
+ <year>1986</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Steve Meuse" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-04 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234755">
+ <rom name="ogre.woz" size="234755" crc="76123140" sha1="540dfe0e7ff7fe7a2c7bbb8d41b2cb85fbcaa6ea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="olemerld">
+ <description>Olin in Emerald</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Gordon Morrell" />
+ <info name="programmer" value="George Taylor" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-07 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235529">
+ <rom name="olin in emerald side a.woz" size="235529" crc="4c7e5d67" sha1="54f67c52d62736eb7b9b46de1ce692de7349e1ed" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235529">
+ <rom name="olin in emerald side b.woz" size="235529" crc="6a3673d7" sha1="3785eeff9cd0c43f5a31961c869994160e016420" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="olvcword">
<description>Oliver's Crosswords</description>
<year>1990</year>
@@ -29231,8 +33028,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--education program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234777">
@@ -29247,6 +33044,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="olympdec">
+ <description>Olympic Decathlon</description>
+ <year>1981</year>
+ <publisher>Microsoft</publisher>
+ <info name="programmer" value="Timothy W. Smith" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <!-- A one-time backup utility (press '*' during the title animation) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234792">
+ <rom name="olympic decathlon.woz" size="234792" crc="7e68d283" sha1="6adb8d2413ca45b7c1764768a5519a5b879992ba" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="onbalance">
<description>On Balance (800K 3.5")</description>
<year>1986</year>
@@ -29254,8 +33068,8 @@ license:CC0-1.0
<info name="programmer" value="David Eisler" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-28-->
- <!--productivity program-->
+ <!-- Dump released: 2022-02-28 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296169">
<rom name="on balance 800k.woz" size="1296169" crc="b71759ac" sha1="a9d5c9c565dffb97b1aa5cae0d55a3d4c3c20e7a" />
@@ -29263,17 +33077,740 @@ license:CC0-1.0
</part>
</software>
+ <software name="onstage">
+ <description>On Stage (A-312 version 1.0) (800K 3.5")</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-312" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Dave Denninger" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345366">
+ <rom name="on stage 800k.woz" size="1345366" crc="625a2bde" sha1="58076651bf6ecd82a5c732cb3565894fc3c289b2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ootopos">
+ <description>Oo-Topos</description>
+ <year>1986</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Michael Berlyn" />
+ <info name="programmer" value="Muffy Berlyn" />
+ <info name="programmer" value="Raimund Redlich" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Double hi-res graphics are available on 128K Apple //e and later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-30 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234778">
+ <rom name="oo-topos side a.woz" size="234778" crc="33b196ab" sha1="cf480173cc55613c35d201571e384733b635e402" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234778">
+ <rom name="oo-topos side b.woz" size="234778" crc="b61cc239" sha1="4b2fe968e38dcf4eac71ae42893ee62aa1e753f1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="opapoc">
+ <description>Operation Apocalypse</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234804">
+ <rom name="operation apocalypse.woz" size="234804" crc="c2fa51e4" sha1="7170b2053a582954b456e9f51e12e913e8aba703" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="operfrog">
+ <description>Operation: FROG</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Interactive Picture Systems" />
+ <info name="programmer" value="John Mack" />
+ <info name="programmer" value="Susan Rubin" />
+ <info name="programmer" value="Sanford Kaye" />
+ <info name="programmer" value="Jon Wolfe" />
+ <info name="programmer" value="Jimmy Snyder" />
+ <info name="programmer" value="Bob Svihovec" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-12 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234819">
+ <rom name="operation frog side a.woz" size="234819" crc="7784ff02" sha1="a7ddd17ac501d18e709f08337d5cf6ad2bdde97f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234819">
+ <rom name="operation frog side b.woz" size="234819" crc="0f0157d4" sha1="4f7851333edaab64acd785ece0d01f3f863aa8bb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="opposite">
+ <description>Opposites (version 01.12.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.12.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234798">
+ <rom name="opposites v01.12.89 disk 1.woz" size="234798" crc="a6cac952" sha1="e0388c23db2543e1bd8a5c3d4f6164b22488f1ef" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234765">
+ <rom name="opposites v01.12.89 disk 2.woz" size="234765" crc="c0ec957b" sha1="cfa8b8f5f61eba33e21e316bda2021d25a801829" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ov1clasadv">
+ <description>Other-Venture #1: Classic Adventure (version 1.0)</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Will Crowther" />
+ <info name="author" value="Don Woods" />
+ <info name="programmer" value="John Rausch" />
+ <info name="usage" value="Requires a 13-sector floppy drive and a 48K Apple ][ or Apple ][+ with Integer BASIC in ROM." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2025-11-09 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234799">
+ <rom name="classic adventure.woz" size="234799" crc="3bf56514" sha1="bb637023c0abe567240169cf00a407b49fc70f7b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ov2curcm">
+ <description>Other-Venture #2: The Curse of Crowley Manor</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-22 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234833">
+ <rom name="the curse of crowley manor.woz" size="234833" crc="347d21ee" sha1="1c8eeebb2b48199e4772efda9d7bab0584fd041c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ov3etraam">
+ <description>Other-Venture #3: The Escape from Traam</description>
+ <year>1981</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234835">
+ <rom name="the escape from traam.woz" size="234835" crc="32c62e16" sha1="5c3e7f84dd9a2edfa1f8e7489bee77bfa548947a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ov4eqsf1906">
+ <description>Other-Venture #4: Earthquake - San Francisco 1906</description>
+ <year>1982</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Jyym Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-25 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A (Boot)" />
+ <dataarea name="flop" size="228182">
+ <rom name="earthquake - san francisco 1906 side a (boot).woz" size="228182" crc="bef86d69" sha1="6a866918312becdf7a12a0dceecf4fe892015768" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234838">
+ <rom name="earthquake - san francisco 1906 side b.woz" size="234838" crc="9b235ebd" sha1="979a55d9e0353f4e19bb9c051a4718e27b35afb4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="phmpegas">
+ <description>P.H.M. Pegasus</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Noah Falstein" />
+ <info name="programmer" value="Larry E. Holland" />
+ <info name="programmer" value="Edwin W. Reich, Jr." />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-03 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="228119">
+ <rom name="phm pegasus side a.woz" size="228119" crc="acbbe3ee" sha1="41eefd1df1a6f9dfb2f50973bded138e8390dbeb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234775">
+ <rom name="phm pegasus side b.woz" size="234775" crc="b7df1300" sha1="6ed6881d6679e60b15c3d4d51648c05e258bb231" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pacmana" cloneof="pacman">
+ <description>Pac-Man (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234725">
+ <rom name="pac-man.woz" size="234725" crc="c6a8c25d" sha1="0892f09e1e37b0823674944126a6b42cb70cddc1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pacman">
+ <description>Pac-Man (Datasoft)</description>
+ <year>1984</year>
+ <publisher>Datasoft</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="88333">
+ <rom name="pac-man (datasoft).woz" size="88333" crc="61a636c4" sha1="ad7144d6c4476a57fecf8cc1b97cdf9346090e00" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="panzbatl">
+ <description>Panzer Battles (version 1.0)</description>
+ <year>1989</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Danny Stevens" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235542">
+ <rom name="panzer battles side a - master disk.woz" size="235542" crc="e81f710a" sha1="c901fb39218ec5468cc68e4c233c784040521764" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235544">
+ <rom name="panzer battles side b - scenario disk.woz" size="235544" crc="278a2f66" sha1="417d01bb1848330a8937ddc7d2c2def5141bfbe5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="panzgrna10" cloneof="panzgrna">
+ <description>Panzer Grenadier (version 1.0)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="LDW Software" />
+ <info name="programmer" value="Roger Damon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234823">
+ <rom name="panzer grenadier v1.0.woz" size="234823" crc="518bd5ac" sha1="ca992dcb6ec16a3e79f8ff7cd786115db10d06fe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="panzgrna">
+ <description>Panzer Grenadier (version 1.2)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="LDW Software" />
+ <info name="programmer" value="Roger Damon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="version 1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234812">
+ <rom name="panzer grenadier v1.2.woz" size="234812" crc="b8dc06ec" sha1="1910ccb553b9da7f95b4459516c6bd691825750f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="panzstrk">
+ <description>Panzer Strike! (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="version 1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-26 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - West" />
+ <dataarea name="flop" size="234815">
+ <rom name="panzer strike disk 1a - west.woz" size="234815" crc="b0e546b0" sha1="fde7cfaa28cbd480a70d4a37a9ff54b3cb2761dc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - East" />
+ <dataarea name="flop" size="234815">
+ <rom name="panzer strike disk 1b - east.woz" size="234815" crc="e2731f0e" sha1="6413c2e15da56afab5d89c5bee62caddbbad4d74" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Africa" />
+ <dataarea name="flop" size="234817">
+ <rom name="panzer strike disk 2a - africa.woz" size="234817" crc="16f4c98f" sha1="4969af2b1bd8475121190badddb135ef3ac6a20e" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Scenarios" />
+ <dataarea name="flop" size="234820">
+ <rom name="panzer strike disk 2b - scenarios.woz" size="234820" crc="84882a5f" sha1="1ad24f21431dbb1da0bfcd4a8f0cc8ad3616cda2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="papergr831" cloneof="papergr">
+ <description>Paper Graphics (version 1983 revision 1)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Robert Rennard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983 revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="paper graphics v1983.1.woz" size="234810" crc="9ef509a3" sha1="20185d831c255f44592d8966a33d22b674b88763" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="papergr832" cloneof="papergr">
+ <description>Paper Graphics (version 1983 revision 2)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Robert Rennard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983 revision 2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234817">
+ <rom name="paper graphics v1983.2.woz" size="234817" crc="ee1491bd" sha1="af6dc918441e0a897e2b73cd41e3ce4f5538a030" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="papergr">
+ <description>Paper Graphics (version 1986)</description>
+ <year>1986</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Robert Rennard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234723">
+ <rom name="paper graphics v1986.woz" size="234723" crc="cf06364f" sha1="2d03ae688be352da4ab59e494b1f46c0bd81e471" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="paperboy">
+ <description>Paperboy</description>
+ <year>1988</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Tengen" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-07-26 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233449">
+ <rom name="paperboy.woz" size="233449" crc="cf0fedf6" sha1="aa3f286df6d929c44175270b389ef043930cf77f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="particip">
+ <description>Participles (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="participles 1988.woz" size="234763" crc="bcae62a6" sha1="7474adab18b0be0f331a3ac3a8283ec14cb42602" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="posfwnap">
+ <description>Parts of Speech: Fun with Nouns and Pronouns</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234851">
+ <rom name="parts of speech- fun with nouns and pronouns.woz" size="234851" crc="b004e1f5" sha1="2aafd05be7c8743d431db41ff4b1a684a53f8c96" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="posfwvrb">
+ <description>Parts of Speech: Fun with Verbs</description>
+ <year>1991</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234847">
+ <rom name="parts of speech- fun with verbs.woz" size="234847" crc="14c86953" sha1="fd647f827339f65fe625c4a5c9604ece8fed8330" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pathtact">
+ <description>Path Tactics (A-162 version 1.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-162" />
+ <info name="programmer" value="Frederick Steinmann" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234789">
+ <rom name="path tactics.woz" size="234789" crc="3ded85b6" sha1="24d948f899c38416d1a5e26ca2a4244e6372e5aa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patpitl1">
+ <description>Patterns in Pitch (Composition and Dictation): Level One</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="patterns in pitch- level one.woz" size="234794" crc="55348f78" sha1="1f166327256ddcb836e90d17afbc5f7f905ef78d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patpitl2">
+ <description>Patterns in Pitch (Composition and Dictation): Level Two</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="patterns in pitch- level two.woz" size="234794" crc="efab6e8c" sha1="fea7a5e6dceaa35c542c670f51863cd1bfd341ff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patrhyl2">
+ <description>Patterns in Rhythm (Composition and Dictation): Level Two</description>
+ <year>1986</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234795">
+ <rom name="patterns in rhythm- level two.woz" size="234795" crc="981931af" sha1="e05c187d5e9daeb981568b5eb937827b22f2f600" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patrhyl3">
+ <description>Patterns in Rhythm (Composition and Dictation): Level Three</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234797">
+ <rom name="patterns in rhythm- level three.woz" size="234797" crc="56d7cf90" sha1="eaea9811720237203b489d874e216ea1fe0dac4d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pbunyan">
+ <description>Paul Bunyan</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234741">
+ <rom name="paul bunyan.woz" size="234741" crc="631f1848" sha1="7be38cff6392cda6d5e32b52b61cd6ffc310ecda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="paulmsj">
+ <description>Paul's Missionary Journeys</description>
+ <year>1986</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234844">
+ <rom name="paul's missionary journeys side a.woz" size="234844" crc="344202f1" sha1="d3bfde5d32882c99aa34eaf9b1239cd5c28cb342" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241468">
+ <rom name="paul's missionary journeys side b.woz" size="241468" crc="8c8339b0" sha1="7b0bfe4d5f3df89163e08af6424f43902ad15e6a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pecosbill">
+ <description>Pecos Bill</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234747">
+ <rom name="pecos bill.woz" size="234747" crc="4f1da17f" sha1="5d100b2566c060bd85038ec3b99e459695d30ff7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="peeptom">
+ <description>Peeping Tom</description>
+ <year>1982</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Mike Livesay" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234765">
+ <rom name="peeping tom.woz" size="234765" crc="ff70f089" sha1="80c2f0393018236461b5dd8e6374beb136347b5b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pensate">
+ <description>Pensate</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="John Besnard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-11 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121589">
+ <rom name="pensate.woz" size="121589" crc="89dea29f" sha1="eeb9037392b0f180e3d6e4a8dab30e07ab0e80da" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ppuzzle">
+ <description>Perplexing Puzzles (version 07.09.85) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Phil Mansour" />
+ <info name="programmer" value="Paul Fleisher" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card in slot 5." />
+ <info name="version" value="07.09.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="1345343">
+ <rom name="perplexing puzzles 800k disk 1 - program.woz" size="1345343" crc="49cb4f0d" sha1="dd86a361eb3f8dc8c0f0c72bb940588b32dfc35f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Tutorial" />
+ <dataarea name="flop" size="1345343">
+ <rom name="perplexing puzzles 800k disk 2 - tutorial.woz" size="1345343" crc="a0be29c0" sha1="17edeba201fda0db25177007c157e4fe0f6e6e41" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="permushist">
+ <description>Perspectives in Music History</description>
+ <year>1988</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234795">
+ <rom name="perspectives in music history.woz" size="234795" crc="3765b841" sha1="2ccaf533a2b9ec021e4ec8654ab1f91519e59b63" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pestpatr">
+ <description>Pest Patrol</description>
+ <year>1982</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="protection" value="Spiradisc System" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2018-10-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="253404">
+ <rom name="pest patrol.woz" size="253404" crc="75bf4512" sha1="18e92e52c25e1777daf774e2b7338443a25c07b3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="petshop_525" cloneof="petshop">
+ <description>Pet Shop (A-347 version 1.0)</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-347" />
+ <info name="programmer" value="Dave Denninger" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234772">
+ <rom name="pet shop v1.0.woz" size="234772" crc="a15311d4" sha1="b2ecfa207db2ae43a57f896b5a5eff9f89c289a9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="petshop">
<description>Pet Shop (A-347 version 1.0) (800K 3.5")</description>
<year>1994</year>
<publisher>MECC</publisher>
<info name="partno" value="A-347" />
- <info name="programmer" value="Dave Denninger, John A. Persoon, and Jean Sharp" />
+ <info name="programmer" value="Dave Denninger" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="Jean Sharp" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-25-->
- <!--educational program-->
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296204">
<rom name="pet shop 800k.woz" size="1296204" crc="70dece0e" sha1="d8ccb9fdc5936c2faf684888e514e92d15c32912" />
@@ -29281,16 +33818,418 @@ license:CC0-1.0
</part>
</software>
+ <software name="pickpart">
+ <description>Pick the Part</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234767">
+ <rom name="pick the part.woz" size="234767" crc="8be956f4" sha1="9971235515c6fd27990ba2411632d625121ce3b3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="picklefos">
+ <description>Pickleface and Other Stories (version 04.07.90)</description>
+ <year>1990</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Mary Roessler" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="04.07.90" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234818">
+ <rom name="pickleface and other stories v04.07.90 disk 1.woz" size="234818" crc="77a4add2" sha1="d1aa0146f7b156feceab37cd32f72e5306282090" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234785">
+ <rom name="pickleface and other stories v04.07.90 disk 2.woz" size="234785" crc="2181f3c5" sha1="2501ebc386c2d8860a42ddc6b6c6ca13bb717535" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234785">
+ <rom name="pickleface and other stories v04.07.90 disk 3.woz" size="234785" crc="915d591a" sha1="97a56c25fb3c4582217cc37cf65cc5d44326dac6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="picastory_525" cloneof="picastory">
+ <description>Picture a Story (A-311 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-311" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="picture a story.woz" size="234810" crc="772978dc" sha1="254e2e67b69b62d08f3db4c14583c3b5c4fac109" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="picastory">
+ <description>Picture a Story (A-311 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-311" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296203">
+ <rom name="picture a story 800k.woz" size="1296203" crc="8b35fc3e" sha1="dc1bbe3d5c706317f8bb1e7d8ad86a45e0a9c884" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pictperf">
+ <description>Picture Perfect (version 1989)</description>
+ <year>1989</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234777">
+ <rom name="picture perfect v1989.woz" size="234777" crc="86815b1e" sha1="505b89960ae901e3980765a0a61efd254fc5efaa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="piemanr1" cloneof="pieman">
+ <description>Pie-Man (revision 1)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Eagle Berns" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121628">
+ <rom name="pie-man.woz" size="121628" crc="df096b6e" sha1="2565acb05a4753c5311b8f78f92857a65690b62d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pieman">
+ <description>Pie-Man (revision 2)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Eagle Berns" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Uses a different copy protection and a different disk structure. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-20 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234780">
+ <rom name="pie man rev. 2.woz" size="234780" crc="796b37d7" sha1="2f1f85401ae6359f66b1855a3bb2137d46ad3609" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pipeline">
+ <description>Pipeline</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Learning Technologies" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="pipeline.woz" size="234761" crc="c8fcc893" sha1="4f6370a8d50d3156b64429b35bbc4ac70d7ffbcd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pitstop2">
+ <description>Pitstop II</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Ivan Manley" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="D. Stinnett" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-18 -->
+ <!-- racing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233488">
+ <rom name="pitstop ii.woz" size="233488" crc="618d562d" sha1="646555ea1e06e14cc784330654e4db3c0a53d193" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pixitr0" cloneof="pixit">
+ <description>Pixit (revision 0)</description>
+ <year>1983</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="Kimberly Evans" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 0" />
+ <!-- This is the first release, identifiable by the lack of any visible version number during boot. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234732">
+ <rom name="pixit.woz" size="234732" crc="ec6fe3df" sha1="412fda4fc10db6975faf642748da0771919b2682" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pixit">
+ <description>Pixit (version 01331)</description>
+ <year>1983</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="01331" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="Kimberly Evans" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01331" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="pixit v01331.woz" size="234762" crc="7269fc3b" sha1="a36056af261f954db84f1c34f9761076493d7a50" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pixitsl1">
+ <description>Pixit Shape Library #1: Shapes &amp; Fonts</description>
+ <year>1983</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234830">
+ <rom name="pixit shape library 1.woz" size="234830" crc="8564760b" sha1="d0020d3d7e753c770177fa311e0cb2eb4b194bf9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pixitsl2">
+ <description>Pixit Shape Library #2: Science</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="pixit shape library 2- science.woz" size="234779" crc="ddfc7672" sha1="6b9aabc3192efb0cd706903b421816a1cb4fdc07" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pixitsl3">
+ <description>Pixit Shape Library #3: Kid Stuff</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234808">
+ <rom name="pixit shape library 3- kid stuff.woz" size="234808" crc="dbfbffa4" sha1="46b391dfa180f74140d06172ce88a7f566c215ba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pizza2go">
+ <description>Pizza to Go (A-333 version 1.0)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-333" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Rod Haenke" />
+ <info name="programmer" value="Sheila Kelly" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234858">
+ <rom name="pizza to go.woz" size="234858" crc="bc76db40" sha1="4914f4b503b1bffd476f6a5185508f929b4edda0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pltanimc">
+ <description>Plant and Animal Cells</description>
+ <year>1986</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="plant and animal cells.woz" size="234781" crc="a91ab852" sha1="af837ae3c4c72140d78306522dde767af42a6cff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pwstemp">
+ <description>Playing with Science: Temperature</description>
+ <year>1988</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Leslie Eiser" />
+ <info name="programmer" value="Dominique Allard" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234827">
+ <rom name="playing with science- temperature.woz" size="234827" crc="c65b1457" sha1="e03a830b4aca0425f6e247aa1d90f754c15d29d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pkrparat">
+ <description>Poker Parat</description>
+ <year>1983</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="programmer" value="Betje Klier" />
+ <info name="programmer" value="Anne Thompson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234841">
+ <rom name="poker parat.woz" size="234841" crc="1cec4cce" sha1="04bcfe800163e8cbb1f3f90ed317677f43121836" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pquest">
+ <description>Police Quest: In Pursuit of the Death Angel</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Jim Walls" />
+ <info name="programmer" value="Greg Rowland" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-22 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 1a.woz" size="234970" crc="af6389b9" sha1="098b10886ffa2cc01da6008f52297ec4a71a6af0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 1b.woz" size="234970" crc="e5d4d151" sha1="65a3383ec512de44b9830d442adc738d49f1fb33" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 2a.woz" size="234970" crc="050ae097" sha1="e0eb70b68dfc07af663d594458b481b78788953f" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 2b.woz" size="234970" crc="4c51dc70" sha1="1a29eee6b9441fe54cbb5b167378058a5748eaa4" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 3a.woz" size="234970" crc="955120d0" sha1="2929945e36ec04e573ff0e5dbeaa67354e5c4126" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 3b.woz" size="234970" crc="cef66bad" sha1="ab85b4f8ac965c680f53cf0f648c293f65ec900f" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 4a.woz" size="234970" crc="a1a74c19" sha1="fd9b2073fd115b230ef5511e11bdcd07c94192df" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="234970">
+ <rom name="police quest disk 4b.woz" size="234970" crc="9d1e12cf" sha1="a1ae7c97eabf5b352792f52eb1cb53f8a4d7c4fc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pollspol">
<description>Polls and Politics Volume 1 (A-820 version 1.0)</description>
<year>1984</year>
<publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
<info name="partno" value="A-820" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-20-->
- <!--education program-->
+ <!-- Dump released: 2023-06-20 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234793">
<rom name="polls and politics v1.0.woz" size="234793" crc="a9c32849" sha1="e5c63d30087975a550b75610690e91c30580c7ec" />
@@ -29298,6 +34237,104 @@ license:CC0-1.0
</part>
</software>
+ <software name="polywr">
+ <description>PolyWriter (version 1.2)</description>
+ <year>1984</year>
+ <publisher>Passport Designs</publisher>
+ <info name="alt_title" value="Polywriter 401" />
+ <!-- After the titlescreen, it is branded for the MPU-401 -->
+ <info name="author" value="Phil Farrand" />
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="John Borowicz" />
+ <info name="programmer" value="John Melcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-02-22 -->
+ <!-- audio program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="polywriter v1.2.woz" size="234810" crc="d5b9b4d1" sha1="b3a7418084e652b4ed24d67c97b840496ea0bbb0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poprspl">
+ <description>Pop 'R Spell &amp; Pop 'R Spell Challenge</description>
+ <year>1983</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="developer" value="Milliken Publishing Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234770">
+ <rom name="pop 'r spell and pop 'r spell challenge.woz" size="234770" crc="2a3be6a6" sha1="1fd7fdc84eb67fd3ea47fb9cf788589ee2fa6940" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poster">
+ <description>Poster</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Information Technology Design Associates" />
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Tom Hansen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="194790">
+ <rom name="poster.woz" size="194790" crc="186abb54" sha1="98b761dabda64c330d109ab8116612571b2b18cb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prccomp2">
+ <description>Practical Composition II: Clear, Logical Sentences</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234809">
+ <rom name="practical composition ii disk 1.woz" size="234809" crc="4fc10f62" sha1="0a77c0f32b2b765716b58acc6a08ad459e4ca943" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234809">
+ <rom name="practical composition ii disk 2.woz" size="234809" crc="a2a63cb0" sha1="2cc50ba82894c537c196d20c11ec0a8563419268" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prepphra">
+ <description>Prepositional Phrases (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234773">
+ <rom name="prepositional phrases 1988.woz" size="234773" crc="75ae5f3d" sha1="295dfcc06cd5876853122b5bb9e981e5fb9119bd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pressylk">
<description>Press Your Luck</description>
<year>1988</year>
@@ -29305,8 +34342,8 @@ license:CC0-1.0
<info name="programmer" value="Michael Robert Hausman" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234796">
@@ -29321,17 +34358,211 @@ license:CC0-1.0
</part>
</software>
+ <software name="prince15521" cloneof="prince">
+ <description>Prince (version 15521)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="15521" />
+ <info name="programmer" value="Joel Novak" />
+ <info name="programmer" value="Ken Steiner" />
+ <info name="programmer" value="Michael Darooge" />
+ <info name="programmer" value="Bob Svihovec" />
+ <info name="programmer" value="Bryan Koeff" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="15521" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234781">
+ <rom name="prince v15521 side a.woz" size="234781" crc="33fbb6e9" sha1="b528fcaa2e93bfe6657de0aaa84cc8dbaa616d61" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234781">
+ <rom name="prince v15521 side b.woz" size="234781" crc="06c2141e" sha1="cdf3b23df58fc82eb8664090c51a0b7bdfa12af5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prince">
+ <description>Prince (version 15531)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="15531" />
+ <info name="programmer" value="Joel Novak" />
+ <info name="programmer" value="Ken Steiner" />
+ <info name="programmer" value="Michael Darooge" />
+ <info name="programmer" value="Bob Svihovec" />
+ <info name="programmer" value="Bryan Koeff" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="15531" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234781">
+ <rom name="prince v15531 side a.woz" size="234781" crc="60c4b451" sha1="10fd4738216049ecb377bc2546f3cd5c638fb4fd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234781">
+ <rom name="prince v15531 side b.woz" size="234781" crc="610940bf" sha1="641f2d1251433b6c5739e415184b22a60e4bbb1c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="popd" cloneof="pop">
+ <description>Prince of Persia (interactive demo)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jordan Mechner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-04 -->
+ <!-- action game demo -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234834">
+ <rom name="prince of persia- interactive demo disk.woz" size="234834" crc="7375b848" sha1="c9489252c3b10c5d77df9ea8d5a45e9800e6fb12" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pop_525" cloneof="pop">
+ <description>Prince of Persia</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jordan Mechner" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233481">
+ <rom name="prince of persia side a.woz" size="233481" crc="a3820127" sha1="bf7c7c03fcc93b989a8a7e566ec711888553a9de" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233481">
+ <rom name="prince of persia side b.woz" size="233481" crc="6de94d52" sha1="931e264563390d1e76cef9a7db31492643f45b49" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pop">
+ <description>Prince of Persia (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jordan Mechner" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-30 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1297161">
+ <rom name="prince of persia 800k.woz" size="1297161" crc="e166d56a" sha1="d9558d25a3d3d91542f32abba9e6b0e2f2c75b09" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="probability">
+ <description>Probability (A-821 version 1.0)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-821" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241442">
+ <rom name="probability v1.0.woz" size="241442" crc="608a87a7" sha1="3399b6d8a8658313a74df9f5a05989998784561e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="problab">
+ <description>Probability Lab (A-262 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-262" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Jane Peterson" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345346">
+ <rom name="probability lab 800k.woz" size="1345346" crc="b7255478" sha1="fafaf15a09a1785ed0661218adbbd48c1ec7d3d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="probsnim_525" cloneof="probsnim">
+ <description>Problem-Solving with Nim (A-257 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-257" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234851">
+ <rom name="problem solving with nim.woz" size="234851" crc="795bb73f" sha1="3c4a180b71185ad765e2bafc191398ad19e9b755" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="probsnim">
+ <description>Problem-Solving with Nim (A-257 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-257" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Elizabeth Wendland" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-27 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296223">
+ <rom name="problem-solving with nim 800k.woz" size="1296223" crc="f7c23313" sha1="7636208003087cf447f90f6381936957990e49a7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="probslvs10">
<description>Problem-Solving Strategies (A-784 version 1.0)</description>
<year>1983</year>
<publisher>MECC</publisher>
<info name="partno" value="A-784" />
- <info name="programmer" value="Lois Edwards and Russ Erickson" />
+ <info name="programmer" value="Lois Edwards" />
+ <info name="programmer" value="Russ Erickson" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-20-->
- <!--education program-->
+ <!-- Dump released: 2023-06-20 -->
+ <!-- education program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234801">
<rom name="problem-solving strategies v1.0.woz" size="234801" crc="8e33f814" sha1="6674eb2c9dd393195bd949937cd9e1ce7722971b" />
@@ -29339,6 +34570,39 @@ license:CC0-1.0
</part>
</software>
+ <software name="pruseinf">
+ <description>Problems in the Use of Infinitives (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241442">
+ <rom name="problems in the use of infinitives 1988.woz" size="241442" crc="a45542e4" sha1="f99189e961a3a12e996d2a3a983faef6f9380d9b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pronsubn">
+ <description>Pronouns: Substitutes for Nouns</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234782">
+ <rom name="pronouns- substitutes for nouns.woz" size="234782" crc="a13341e6" sha1="6e4f4c6f116ebaa1a23c8751295577e009fb057e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pnctbbls">
<description>Punctuation: Building Better Language Skills</description>
<year>1991</year>
@@ -29346,8 +34610,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-10-26-->
- <!--educational program-->
+ <!-- Dump released: 2019-10-26 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="235489">
<rom name="punctuation - building better language skills.woz" size="235489" crc="0c41a2e0" sha1="dca8d539917b8c6f17bd5e9632828fb31044be9b" />
@@ -29355,15 +34619,152 @@ license:CC0-1.0
</part>
</software>
+ <software name="puncpon">
+ <description>Punctuation Put-On: Punctuation Processor</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John D. Perron" />
+ <info name="programmer" value="Victoria Hanson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher" />
+ <dataarea name="flop" size="234844">
+ <rom name="punctuation put-on - disk 1 - teacher disk.woz" size="234844" crc="8eeb0c5a" sha1="4a7aec974400d16ee91f42593dc31f3e2e5b14b2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Student" />
+ <dataarea name="flop" size="234844">
+ <rom name="punctuation put-on - disk 2 - student disk.woz" size="234844" crc="70563734" sha1="66b1215f797aa75f9c8e96b35b01bc201b9d19f6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="punctrev">
+ <description>Punctuation Review (version 1988)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234770">
+ <rom name="punctuation review 1988.woz" size="234770" crc="9cd894a3" sha1="5561fe418d29ebc4b68bd9254bd27e64ad9f0a98" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grafspee">
+ <description>Pursuit of the Graf Spee</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Joel Billings" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-09 Redumped: 2022-03-24 because the previous disk proved to be a fake. -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="254799">
+ <rom name="pursuit of the graf spee.woz" size="254799" crc="18221871" sha1="f400d38bfe73a768d8db4fd9cf7ab4c37282f8ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puzltnks">
+ <description>Puzzle Tanks: A Game of Numbers and Logic</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="puzzle tanks.woz" size="234788" crc="75132200" sha1="d5436bc29ac35bf66f6f637e5efbd26f83f52c2b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qix">
+ <description>Qix</description>
+ <year>1989</year>
+ <publisher>Taito America</publisher>
+ <info name="developer" value="Alien Technology Group" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233475">
+ <rom name="qix.woz" size="233475" crc="50acf331" sha1="9cbbe0b29761aa9e19a7e965932e9bf694f97825" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quations">
+ <description>Quations: The Crossmath Game</description>
+ <year>1985</year>
+ <publisher>Scholastic</publisher>
+ <info name="author" value="Andrew P. Mandell" />
+ <info name="developer" value="Edaptive Software" />
+ <info name="programmer" value="Bernie Dodge" />
+ <info name="programmer" value="Steven Buss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234779">
+ <rom name="quations side a.woz" size="234779" crc="dcf7fc48" sha1="26bf49acf38c5cc1c11b3974dfce16c08894a43f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234779">
+ <rom name="quations side b.woz" size="234779" crc="1b96675e" sha1="27eda3b6c5e32c5135049f0a95e3a25129e57674" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qohearts">
+ <description>Queen of Hearts</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Lyon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="queen of hearts.woz" size="234785" crc="841ed2f5" sha1="2fe5dee1bc1e337a3a1aa260a995dbf542bd7920" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="qm1prihel">
<description>Questmaster I: The Prism of Heheutotol</description>
<year>1989</year>
<publisher>Miles Computing</publisher>
- <info name="programmer" value="Sean B. Barger, Allan J. Lamb, Sean B. Barger, Greg Hopkins, Dave Kuchta, and Rick Incrocci" />
+ <info name="programmer" value="Sean B. Barger" />
+ <info name="programmer" value="Allan J. Lamb" />
+ <info name="programmer" value="Sean B. Barger" />
+ <info name="programmer" value="Greg Hopkins" />
+ <info name="programmer" value="Dave Kuchta" />
+ <info name="programmer" value="Rick Incrocci" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-05-->
- <!--adventure game-->
+ <!-- Dump released: 2024-03-05 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side 1" />
<dataarea name="flop" size="234967">
@@ -29406,12 +34807,13 @@ license:CC0-1.0
<description>Questprobe featuring Spider-Man (version F-261)</description>
<year>1984</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Mak Jukic and Scott Adams" />
+ <info name="programmer" value="Mak Jukic" />
+ <info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="F-261" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-28-->
- <!--adventure game-->
+ <!-- Dump released: 2019-09-28 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234823">
@@ -29430,12 +34832,15 @@ license:CC0-1.0
<description>Questprobe featuring The Hulk (version 2.3/127)</description>
<year>1984</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Scott Adams, John Romita Sr., Mark Gruenwald, Kem McNair, Scott Smith, John Byrne, and Bob Budiansky" />
+ <info name="author" value="Bob Budiansky" />
+ <info name="author" value="John Lindley Byrne" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="programmer" value="Scott Smith" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.3/127" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-01-20-->
- <!--adventure game-->
+ <!-- Dump released: 2020-01-20 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234828">
@@ -29450,18 +34855,343 @@ license:CC0-1.0
</part>
</software>
- <software name="qix">
- <description>Qix</description>
+ <software name="quickfl">
+ <description>Quickflash! (A-167 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-167" />
+ <info name="programmer" value="Michael Hartman" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="programmer" value="Sherry Luedloff" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Pual Wenker" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241419">
+ <rom name="quickflash.woz" size="241419" crc="24590b00" sha1="6e563223fc4ecc13ecad4de95e84e6bd36128e2b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quiltbee">
+ <description>Quilting Bee (A-349 version 1.0)</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="language" value="English" />
+ <info name="language" value="Spanish" />
+ <info name="partno" value="A-349" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Dave Denninger" />
+ <info name="programmer" value="Sheila Dols" />
+ <info name="programmer" value="Craig Solomonson" />
+ <info name="programmer" value="Claudio Valenzuela" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234807">
+ <rom name="quilting bee v1.0.woz" size="234807" crc="ca2f3e60" sha1="06487c7426193707f75bc8523850d99aef5962c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qwertyaa">
+ <description>Qwerty's Alphabet Adventure</description>
+ <year>1984</year>
+ <publisher>Hayden Software</publisher>
+ <info name="developer" value="Hayden Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234756">
+ <rom name="qwerty's alphabet adventure.woz" size="234756" crc="baec9d33" sha1="07a519dc4306cf4349ef6510984ab78968e06d36" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="racekeys">
+ <description>Race Car Keys</description>
<year>1989</year>
- <publisher>Taito America</publisher>
- <info name="developer" value="Alien Technology Group" />
- <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Brenna Bailey" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="race car keys.woz" size="234815" crc="0fbe196d" sha1="39d908b926d57d47dfc92e7fab0f3a6a2bde7506" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="raceclck">
+ <description>Race the Clock</description>
+ <year>1984</year>
+ <publisher>Mindplay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234766">
+ <rom name="race the clock.woz" size="234766" crc="47dfdb00" sha1="fa847747df59c893c7d87a507e0796272c67548b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="racter">
+ <description>Racter</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="INRAC Corp" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-08-05-->
- <!--action game-->
+ <!-- Dump released: 2019-09-03 -->
+ <!-- simulation game -->
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="233475">
- <rom name="qix.woz" size="233475" crc="50acf331" sha1="9cbbe0b29761aa9e19a7e965932e9bf694f97825" />
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235434">
+ <rom name="racter - disk 1, side a.woz" size="235434" crc="941fb21b" sha1="e0547effa5dd71c1ac27bab5414ce6ce429032b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="radwarr">
+ <description>Rad Warrior</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Stanley Schembri" />
+ <info name="programmer" value="Daniel Malone" />
+ <info name="programmer" value="Craig Seastrom" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-27 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233497">
+ <rom name="rad warrior.woz" size="233497" crc="d60e8944" sha1="6636e38a149e48d7a4ba20321cb0c92abdf0eb0d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rainydg">
+ <description>Rainy Day Games (version 13501)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="David Walker" />
+ <info name="developer" value="Baudville" />
+ <info name="partno" value="13501" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="13501" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-28 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234778">
+ <rom name="rainy day games v13501.woz" size="234778" crc="dcfd972c" sha1="1c84b6131a5e89b400bfce7f8f114e6557367c8f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambop2">
+ <description>Rambo: First Blood Part II</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires an 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="rambo - first blood part ii.woz" size="234786" crc="92ca8258" sha1="e8c90cd2690c0cdf3760184ccc9befdfde4d171c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rchstar10" cloneof="rchstar">
+ <description>Reach For The Stars (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235510">
+ <rom name="reach for the stars 1.0.woz" size="235510" crc="f6caa5eb" sha1="06143a70901ab2a95a2bf710aed64aeaa19c1556" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rchstar20" cloneof="rchstar">
+ <description>Reach For The Stars (version 2.0)</description>
+ <year>1985</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235491">
+ <rom name="reach for the stars 2.0.woz" size="235491" crc="dcd74f46" sha1="5fd29a712756defba5248e551337e27f4f6c876d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rchstar">
+ <description>Reach For The Stars (version 3.0)</description>
+ <year>1988</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="3.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235534">
+ <rom name="reach for the stars 3.0.woz" size="235534" crc="47b16069" sha1="338d0da131221de56a06a99ed3d1cb7398ab6152" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readnroll">
+ <description>Read 'N Roll (version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="L. X. Savain" />
+ <info name="programmer" value="T. S. DeBry" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1329010">
+ <rom name="read n roll v1.1 800k.woz" size="1329010" crc="e53d2298" sha1="f9ce50d2e01b5b8ca997b358756da5f0bac0d7f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="raskncst">
+ <description>Read and Spell: In the Days of Knights and Castles</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Ann Simpson" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234861">
+ <rom name="read and spell- in the days of knights and castles disk 1.woz" size="234861" crc="be4bed3d" sha1="54ee6208b98b08ab1e5dfe53ba1c549c8ae69744" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234861">
+ <rom name="read and spell- in the days of knights and castles disk 2.woz" size="234861" crc="58995d23" sha1="706f8297adf8d64d8533e6814fd03a91944e9f26" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit10" cloneof="rrabbit">
+ <description>Reader Rabbit (version 1.0)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241464">
+ <rom name="reader rabbit v1.0.woz" size="241464" crc="befff98c" sha1="852b1927abebdd9de94a71261c879587ec39923c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit11" cloneof="rrabbit">
+ <description>Reader Rabbit (version 1.1)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234808">
+ <rom name="reader rabbit v1.1.woz" size="234808" crc="2b2f787c" sha1="904c57ed1b478fe2168b23fcdde8f0d4c493f971" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit13" cloneof="rrabbit">
+ <description>Reader Rabbit (version 1.3)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234808">
+ <rom name="reader rabbit v1.3.woz" size="234808" crc="1d4107ba" sha1="43d1a98885b6b8de655da4d4332a60fd3b1e5302" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rrabbit">
+ <description>Reader Rabbit (version 1.4)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Corinne Grimm" />
+ <info name="programmer" value="Cindy Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241464">
+ <rom name="reader rabbit v1.4.woz" size="241464" crc="046ffaac" sha1="2920e62337562300ae732419c0dfc190ff8dc44c" />
</dataarea>
</part>
</software>
@@ -29473,8 +35203,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234781">
<rom name="reader's treasure chest.woz" size="234781" crc="2c9fc291" sha1="33ef1b383500179830dd91f6bacb2f4433191904" />
@@ -29482,14 +35212,38 @@ license:CC0-1.0
</part>
</software>
+ <software name="readandme">
+ <description>Reading and Me (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="developer" value="Davidson &amp; Associates" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="241418">
+ <rom name="reading and me v1.0 side a.woz" size="241418" crc="ecd19579" sha1="cdd3944ad3c64ca68f477147ef40e567f45f1494" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241418">
+ <rom name="reading and me v1.0 side b.woz" size="241418" crc="251db0c1" sha1="982ad824561c4ffb491ecc26cc4cd5158e180911" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="readcomp2">
<description>Reading Comprehension Volume 2: Sports (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1361690">
<rom name="reading comprehension volume 2- sports 800k.woz" size="1361690" crc="fa6c2131" sha1="5301c079a1db66a2d1a9b701e20c73e549fe952b" />
@@ -29503,8 +35257,8 @@ license:CC0-1.0
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296157">
<rom name="reading comprehension volume 3- geography 800k.woz" size="1296157" crc="681af247" sha1="84715c27988d55752e538d40c9981cd6cdd90c22" />
@@ -29518,8 +35272,8 @@ license:CC0-1.0
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296169">
<rom name="reading comprehension volume 4- history in the making 800k.woz" size="1296169" crc="b7f96526" sha1="5df45eaa9e9008c6940e423bd1024f5b17de3fbe" />
@@ -29529,13 +35283,13 @@ license:CC0-1.0
<software name="readcomp5">
<description>Reading Comprehension Volume 5: Famous People (800K 3.5")</description>
- <!--Title screen says "The Stickybear Reading Comprehension Series-->
+ <!-- Title screen says "The Stickybear Reading Comprehension Series -->
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296161">
<rom name="reading comprehension volume 5- famous people 800k.woz" size="1296161" crc="79b6d083" sha1="54117899c3cae2de581552555aa81bf015ba5824" />
@@ -29545,13 +35299,13 @@ license:CC0-1.0
<software name="readcomp6">
<description>Reading Comprehension Volume 6: The Olympics (800K 3.5")</description>
- <!--Title screen says "The Stickybear Reading Comprehension Series-->
+ <!-- Title screen says "The Stickybear Reading Comprehension Series -->
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296160">
<rom name="reading comprehension volume 6- the olympics 800k.woz" size="1296160" crc="86633a58" sha1="b87709ea2f902c1f4d6d4ad5aa7e18b926fde91a" />
@@ -29561,13 +35315,13 @@ license:CC0-1.0
<software name="readcomp7">
<description>Reading Comprehension Volume 7: United States Presidents (800K 3.5")</description>
- <!--Title screen says "The Stickybear Reading Comprehension Series-->
+ <!-- Title screen says "The Stickybear Reading Comprehension Series -->
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-28-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-28 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296172">
<rom name="reading comprehension volume 7- united states presidents 800k.woz" size="1296172" crc="106d08b6" sha1="5f3cf3dceb70f1c863bbe146a956543dd959212d" />
@@ -29575,15 +35329,101 @@ license:CC0-1.0
</part>
</software>
+ <software name="readexp1">
+ <description>Reading Explorers Volume 1</description>
+ <year>1991</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Paul Kuhrman" />
+ <info name="programmer" value="Mark Malamud" />
+ <info name="programmer" value="Susan Hautala" />
+ <info name="programmer" value="Catherine Tower" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Contains adventures "A Night at Fleener's" and "Word War" -->
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234843">
+ <rom name="reading explorers volume 1 side a.woz" size="234843" crc="ba014ddb" sha1="42802b5a65a536800207fb3d81b5001d97d895cd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234843">
+ <rom name="reading explorers volume 1 side b.woz" size="234843" crc="002a51fa" sha1="5d0d7eb92327193e95c688308a62f13b23a5162b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readexp2">
+ <description>Reading Explorers Volume 2</description>
+ <year>1991</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Catherine Tower" />
+ <info name="programmer" value="Jack L. Roberts" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Contains adventures "World Agent" and "The Mystery of the Olympic Impostors" -->
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234834">
+ <rom name="reading explorers volume 2 side a.woz" size="234834" crc="23602812" sha1="cea46852a6e2b59b2311ee0b1211d2fb0c20a0e5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234834">
+ <rom name="reading explorers volume 2 side b.woz" size="234834" crc="b744ca46" sha1="1d4d7a30e3fe9ac5016cdef286f64f6e910747bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readexp3">
+ <description>Reading Explorers Volume 3</description>
+ <year>1991</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Betsy Gitelle" />
+ <info name="programmer" value="Paul Kuhrman" />
+ <info name="programmer" value="Lorraine Hopping" />
+ <info name="programmer" value="Catherine Tower" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Contains adventures "The Myths of Olympus" and "Quest for the Pole" -->
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234847">
+ <rom name="reading explorers volume 3 side a.woz" size="234847" crc="d2a214a3" sha1="aace4d47b61f6d0b5e9ad4a38103f2ba8e6d565c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234847">
+ <rom name="reading explorers volume 3 side b.woz" size="234847" crc="5c90e3b0" sha1="21c5a1c1aaecdb7734e140d2f15fe11025aad03a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="runatamer">
<description>Reading for Understanding: Native Americans</description>
<year>1993</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Bonnie Seiler, Nancy Patrissi, Millicent Sabater and Thomas Whiting" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Thomas Whiting" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234951">
<rom name="reading for understanding- native americans.woz" size="234951" crc="9db287b5" sha1="34a8c3cc4fd09630e700ef2ee8dfd5230c5a89f7" />
@@ -29591,6 +35431,68 @@ license:CC0-1.0
</part>
</software>
+ <software name="rfbconsnd">
+ <description>Reading Fun: Beginning Consonant Sounds</description>
+ <year>1988</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234777">
+ <rom name="reading fun- beginning consonant sounds.woz" size="234777" crc="8826fdd0" sha1="e17c0230d1249a1cd6823bc10d423b8239ada3c4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readgeni">
+ <description>Reading General Interest: TEAM Series (version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J. M. Albanese" />
+ <info name="programmer" value="L. X. Savain" />
+ <info name="programmer" value="T. S. DeBry" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296274">
+ <rom name="reading general interest 800k.woz" size="1296274" crc="85cea307" sha1="57d754d286af6a467a3fe824959c8cfcd79304d3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="readii">
+ <description>Reading II</description>
+ <year>1988</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="programmer" value="Jim Bach" />
+ <info name="programmer" value="Vince Mills" />
+ <info name="programmer" value="Luisa Navejas" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234771">
+ <rom name="reading ii side a.woz" size="234771" crc="a3c11a25" sha1="39e3d3782b29176505491eb563eac00403efae07" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234771">
+ <rom name="reading ii side b.woz" size="234771" crc="e0527cde" sha1="743910aedeb9faf94d10251a17edf51c3c5ede57" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rmlev1">
<description>Real Math: Level I</description>
<year>1988</year>
@@ -29598,8 +35500,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234781">
<rom name="real math- level i.woz" size="234781" crc="a0765a0d" sha1="f6006bd41c5fb98dde3caf8d3c981232526c7d0f" />
@@ -29614,8 +35516,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234782">
<rom name="real math- level ii.woz" size="234782" crc="75a0e505" sha1="1a0d2e9fbc2ad223f70fe9895ab7ff4ba3cdc296" />
@@ -29630,8 +35532,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234783">
<rom name="real math- level iii.woz" size="234783" crc="a6127c37" sha1="4542622a48b9f62c0c7f2157067c5cde39a05771" />
@@ -29639,15 +35541,127 @@ license:CC0-1.0
</part>
</software>
+ <software name="realnums83" cloneof="realnums">
+ <description>Real Number System (version 1983)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="real number system.woz" size="234769" crc="18d776e2" sha1="cf13c0b1d0c006bcc04e907432dfc974b8b3a864" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="realnums">
+ <description>Real Number System (version 1988)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="real number system 1988.woz" size="234769" crc="8e6f4a31" sha1="7d8497f706589947615c73887227866beda69c70" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rlmimpos">
+ <description>Realm of Impossibility</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="alt_title" value="Zombies" />
+ <info name="original_publisher" value="BRAM" />
+ <info name="author" value="Mike Edwards" />
+ <info name="programmer" value="Marek Popiel" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-31 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228113">
+ <rom name="realm of impossibility.woz" size="228113" crc="58ac103e" sha1="0373968235eae4a9a8e4381c635e2a01eefa7ed7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="reargard">
+ <description>Rearguard</description>
+ <year>1982</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="John Anderson" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233498">
+ <rom name="rearguard.woz" size="233498" crc="59c443e3" sha1="b9088c2ecb8f7055514e93518cc87deb8b421853" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="redalert">
+ <description>Red Alert</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Olaf Lubeck" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2018-11-19 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="153595">
+ <rom name="red alert.woz" size="153595" crc="cbe193dd" sha1="9e5edaf01ad0ccccf837d5b4952af6ca0dd0a633" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="regroup">
+ <description>Regrouping (version 27-JUN-1989)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Pearson" />
+ <info name="programmer" value="Andrew Lorenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="27-JUN-1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234816">
+ <rom name="regrouping.woz" size="234816" crc="f8bcd559" sha1="c11f6802a33366488ec2d26238c4c40132b7ed5a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rendramatr">
<description>Rendezvous with Rama</description>
<year>1984</year>
<publisher>Trillium</publisher>
- <info name="programmer" value="Lee Jacknow, Ronald Martinez, Robert Strong, Lebbeus Woods, Michael P. Meyer, Andre Garneau, David M. Harris, Isaac V. Kerlow, and Jeffrey Schneider" />
+ <info name="programmer" value="Lee Jacknow" />
+ <info name="programmer" value="Ronald Martinez" />
+ <info name="programmer" value="Robert Strong" />
+ <info name="programmer" value="Lebbeus Woods" />
+ <info name="programmer" value="Michael P. Meyer" />
+ <info name="programmer" value="Andre Garneau" />
+ <info name="programmer" value="David M. Harris" />
+ <info name="programmer" value="Isaac V. Kerlow" />
+ <info name="programmer" value="Jeffrey Schneider" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-02-01-->
- <!--adventure game-->
+ <!-- Dump released: 2019-02-01 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A" />
<dataarea name="flop" size="233443">
@@ -29681,8 +35695,8 @@ license:CC0-1.0
<info name="programmer" value="Kyle Freeman" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-05-25-->
- <!--action game-->
+ <!-- Dump released: 2019-05-25 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234755">
@@ -29697,15 +35711,586 @@ license:CC0-1.0
</part>
</software>
+ <software name="routback">
+ <description>Rescue in the Outback (A-342 version 1.0) (800K 3.5")</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-342" />
+ <info name="programmer" value="Beth Daniels" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Rush Kivisto" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Michael Tschimparle" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="John P. Wlazlo" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296288">
+ <rom name="rescue in the outback 800k.woz" size="1296288" crc="8bebcdec" sha1="7dfae1f6717a7d3e3a2a9a4772ebe4167947ca07" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rescraid">
+ <description>Rescue Raiders</description>
+ <year>1984</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Arthur Britto II" />
+ <info name="programmer" value="Greg Hale" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-16 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233518">
+ <rom name="rescue raiders.woz" size="233518" crc="f2f5bf46" sha1="4ab4e39d593e35c2b1eebc2b5bd1c51b024ef1fb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rtnheracq">
+ <description>Return of Heracles (Quality Software)</description>
+ <year>1983</year>
+ <publisher>Quality Software</publisher>
+ <info name="programmer" value="Stuart Smith" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235508">
+ <rom name="return of heracles.woz" size="235508" crc="50be7d16" sha1="24e16ab619a269e8cb47d0a3557aec1cf9c35d98" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="reversal">
+ <description>Reversal</description>
+ <year>1980</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Dan Spracklen" />
+ <info name="programmer" value="Kathe Spracklen" />
+ <info name="usage" value="Requires a 32K Apple ][ or later. May need a 48K Apple ][+ or later with emulation." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-14 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="reversal.woz" size="234813" crc="ec850ca7" sha1="e6726b394b80467052b698c6c71941dd569082e5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ricochet">
+ <description>Ricochet</description>
+ <year>1982</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="developer" value="MindToys" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-01 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234805">
+ <rom name="ricochet.woz" size="234805" crc="ce1c4d9d" sha1="775f043ba627970753250732c9da7964f5ab9e54" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ridmagic">
+ <description>Riddle Magic</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Santa Barbara Softworks" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="234787">
+ <rom name="riddle magic side a - program.woz" size="234787" crc="f660550a" sha1="54a9832ece9ac48893390f4d7a29ad0cee4ba7ee" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Data" />
+ <dataarea name="flop" size="234784">
+ <rom name="riddle magic side b - data.woz" size="234784" crc="a5a18fa1" sha1="97c7ac712d34e1b46b45e0a04c92c85a23bddca2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ringqst">
+ <description>Ring Quest</description>
+ <year>1986</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Joe Toler" />
+ <info name="programmer" value="Ron Goebel" />
+ <info name="programmer" value="Joel Rea" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234773">
+ <rom name="ring quest side a.woz" size="234773" crc="c4cfcc97" sha1="c662ca402e3e48c0313340890b64ce7d5bb57179" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234773">
+ <rom name="ring quest side b.woz" size="234773" crc="2c038626" sha1="0424eaf527833a0de9781b76ac663b9f1fdab69d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roachmtl">
+ <description>Roach Hotel</description>
+ <year>1981</year>
+ <publisher>Micro Lab</publisher>
+ <info name="programmer" value="Mike Livesay" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234627">
+ <rom name="roach hotel.woz" size="234627" crc="bbf4609a" sha1="caaa8a1269a232e6fdcc64c8d9cdf41268839269" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadwar2k10" cloneof="roadwar2k">
+ <description>Roadwar 2000 (version 1.0)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeff A. Johnson" />
+ <info name="programmer" value="Robert Calfee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234789">
+ <rom name="roadwar 2000 v1.0 side a.woz" size="234789" crc="d7390d38" sha1="8926df0645578b8d1ec9488f6845502d7248ec42" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234789">
+ <rom name="roadwar 2000 v1.0 side b.woz" size="234789" crc="d4bb4859" sha1="0d665576f3768cd900bc441cd3f3cc1b4b3a1099" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadwar2k11" cloneof="roadwar2k">
+ <description>Roadwar 2000 (version 1.1)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeff A. Johnson" />
+ <info name="programmer" value="Robert Calfee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-15 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="242138">
+ <rom name="roadwar 2000 v1.1 side a.woz" size="242138" crc="b736b731" sha1="209f6e08fc2ea20f496668dab3e3f42b70dcc39b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241455">
+ <rom name="roadwar 2000 v1.1 side b.woz" size="241455" crc="c01131ed" sha1="917e8ace92e9422641a78ad088e1d7990c329c56" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadwar2k">
+ <description>Roadwar 2000 (version 1.2)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeff A. Johnson" />
+ <info name="programmer" value="Robert Calfee" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234816">
+ <rom name="roadwar 2000 v1.2 side a.woz" size="234816" crc="6466136b" sha1="abee2dcd8a561834b8545e116ecdac45baf4b727" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234816">
+ <rom name="roadwar 2000 v1.2 side b.woz" size="234816" crc="d85d6d02" sha1="e581ee98cb7c2e1c4c3e37578e50c7aee278cfbf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rwareuro">
+ <description>Roadwar Europa (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Jeffrey A. Johnson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234782">
+ <rom name="roadwar 2000 europa v1.0 side a.woz" size="234782" crc="9752c996" sha1="79f177a6cccd4408994757284d1a2fd645a80911" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234782">
+ <rom name="roadwar 2000 europa v1.0 side b.woz" size="234782" crc="5b083b89" sha1="3dd175bad3a608294fc9260ee21c39dc5db5f72f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rhoodppan">
+ <description>Robin Hood &amp; Peter Pan (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296169">
+ <rom name="robin hood and peter pan 800k.woz" size="1296169" crc="fa681449" sha1="4dfe12a419d305baee700410df442b5a02983fde" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robomath">
+ <description>RoboMath</description>
+ <year>1985</year>
+ <publisher>MindPlay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234760">
+ <rom name="robomath.woz" size="234760" crc="785cce65" sha1="6bd7aef9fbd05b223b49b18fb14343ef76217467" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotody10" cloneof="robotody">
+ <description>Robot Odyssey I (version 1.0)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Mike Wallace" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Robotropolis" />
+ <dataarea name="flop" size="234820">
+ <rom name="robot odyssey i v1.0 side a - robotropolis.woz" size="234820" crc="49599d6c" sha1="23e8c2338469bd20a433e0ea53cde05bbc0c2446" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Innovation lab and tutorials" />
+ <dataarea name="flop" size="234836">
+ <rom name="robot odyssey i v1.0 side b - innovation lab and tutorials.woz" size="234836" crc="7a0021ac" sha1="9368bba0e1f4c200f5c999556973ec48a3157b21" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotody">
+ <description>Robot Odyssey I (version 2.0)</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Mike Wallace" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Robotropolis" />
+ <dataarea name="flop" size="234828">
+ <rom name="robot odyssey i v2.0 side a - robotropolis.woz" size="234828" crc="6142a825" sha1="bb202d7f1f9379901dd032c022fd94c58d9de05d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Robotropolis preview, chip designs, innovation lab, and chip library" />
+ <dataarea name="flop" size="234883">
+ <rom name="robot odyssey i v2.0 side b - robotropolis preview, chip designs, innovation lab and chip library.woz" size="234883" crc="951cfeb8" sha1="2fa9e87fff13782b357bda9ed6300c4bab35f5a7" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C - Robot anatomy, robot wiring, sensors, the toolkit, robot circuits, and robot teamwork" />
+ <dataarea name="flop" size="234900">
+ <rom name="robot odyssey i v2.0 side c - robot anatomy, robot wiring, sensors, the toolkit, robot circuits and robot teamwork.woz" size="234900" crc="3b251db2" sha1="4fc1356e4bbf2a375553f08f334c2c573f2ce10e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotrsc">
+ <description>Robot Rascals</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="author" value="Dan Bunten" />
+ <info name="author" value="Mark McElroy" />
+ <info name="programmer" value="Mark Botner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228261">
+ <rom name="robot rascals.woz" size="228261" crc="c04c20ac" sha1="9070579b6fbf4ad9011a552c306879f66fe0c7ff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotwp">
+ <description>Robot Writer Plus! (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296163">
+ <rom name="robot writer plus 800k.woz" size="1296163" crc="679596fc" sha1="3edc0320e88612c4acc18bb58f5121189326e024" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robotron">
+ <description>Robotron: 2084 (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-15 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233452">
+ <rom name="robotron 2084.woz" size="233452" crc="f8931d6d" sha1="313e516da05c345e097a34418726604eb6145dd7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robtdawn">
+ <description>Robots of Dawn</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Jon Leupp" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-11 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233475">
+ <rom name="robots of dawn.woz" size="233475" crc="1857ecfd" sha1="571daffa89f2269679ed6ada76e76016da26b594" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rcktfcty_525" cloneof="rcktfcty">
+ <description>Rocket Factory (A-308 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-308" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241545">
+ <rom name="rocket factory.woz" size="241545" crc="835e1ff2" sha1="7652b6202b7cd7454abfabc59306221cb47d6703" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rcktfcty">
+ <description>Rocket Factory (A-308 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-308" />
+ <info name="programmer" value="Miryam Acevedo-Bouchard" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Ju-Chang Wang" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296258">
+ <rom name="rocket factory 800k.woz" size="1296258" crc="1183e7cc" sha1="eb9ba5f8c62649f650f790aa0bd4d2c4140c2c74" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rboots10l" cloneof="rboots">
+ <description>Rocky's Boots (version 1.0 later)</description>
+ <year>1982</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0 later" />
+ <!-- Has a different title page and loads much faster. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="rocky's boots v1.0.woz" size="234798" crc="35d5ab1d" sha1="e2c8c8fd5630d46100789887a76664838afd9ee7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rboots40" cloneof="rboots">
+ <description>Rocky's Boots (version 4.0)</description>
+ <year>1985</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="4.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234747">
+ <rom name="rocky's boots v4.0.woz" size="234747" crc="638f1d4f" sha1="67dc599a7b8f0b84cdfdcd7c29f910dbea5f9f0c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rboots">
+ <description>Rocky's Boots (version 4.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Teri Perl" />
+ <info name="programmer" value="Warren Robinett" />
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, or //e or 64K ][+ with a compatible drive controller card." />
+ <info name="version" value="4.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-10-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296202">
+ <rom name="rocky's boots v4.1 800k.woz" size="1296202" crc="9547ceae" sha1="9ed4042968ce40c1d5049befe27ecc74d81e4aea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rootsaff">
+ <description>Roots/Affixes (version 09.19.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Carolyn Micklatcher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.19.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234809">
+ <rom name="roots-affixes v09.19.89 disk 1.woz" size="234809" crc="11de0bde" sha1="849e429045b646cbe038a3428ef159a272496aa8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234776">
+ <rom name="roots-affixes v09.19.89 disk 2.woz" size="234776" crc="5ec71f5b" sha1="71ab8dd53462baf9be79f4c01683d49cfcb08889" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rndestim">
+ <description>Rounding and Estimation</description>
+ <year>1983</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Intellectual Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234805">
+ <rom name="rounding and estimation.woz" size="234805" crc="91f14a71" sha1="fbfdf9cdb5fdc076b2fe68888799bc87e2684286" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rmplstsk">
+ <description>Rumpelstiltskin</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234745">
+ <rom name="rumpelstiltskin.woz" size="234745" crc="b28efd1c" sha1="4c0a5d5feaf441bcb95874009a73f5037bfaad20" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="runforit">
<description>Run For It</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-04-29-->
- <!--action game-->
+ <!-- Dump released: 2022-04-29 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234841">
<rom name="run for it.woz" size="234841" crc="5ac6ea0d" sha1="b7d99b23bd97a6ca0d54cd387ab60d361844af46" />
@@ -29713,16 +36298,534 @@ license:CC0-1.0
</part>
</software>
+ <software name="ssrussia">
+ <description>Russia (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-12 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master disk" />
+ <dataarea name="flop" size="235565">
+ <rom name="russia side a - master disk.woz" size="235565" crc="2d46ec6c" sha1="f86b1ea2442471c67af3ef01a8795c8b4a0b68c3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario disk" />
+ <dataarea name="flop" size="235567">
+ <rom name="russia side b - scenario disk.woz" size="235567" crc="c2a0be04" sha1="406f8cb153a3bc0be2d3d5df896439b77928c18f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sabotage">
+ <description>Sabotage</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Mark Allen" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-08 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240141">
+ <rom name="sabotage.woz" size="240141" crc="091eb06f" sha1="72b24f54916e16ae73c495a5a382517bfffe1f6a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sspsai">
+ <description>Safari Search: Problem Solving and Inference</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. O'Brien" />
+ <info name="programmer" value="Jim Thomas" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234845">
+ <rom name="safari search- problem solving and inference.woz" size="234845" crc="c5ecc2ca" sha1="5b66690ce52cea46d1c8b8e3d88fc0dd6ee86b90" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sammyltf">
+ <description>Sammy Lightfoot</description>
+ <year>1983</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Warren Schwader" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-07 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="240148">
+ <rom name="sammy lightfoot.woz" size="240148" crc="c551624a" sha1="e511b9fa31ed9deb0d18fea7001caac96b0e0832" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="saracen">
+ <description>Saracen</description>
+ <year>1987</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="Ilan Ginsburg" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="saracen.woz" size="234768" crc="487c650f" sha1="949307b3be9f8f533fe9fd89650f76a70ebebbca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sargon2">
+ <description>Sargon II</description>
+ <year>1979</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Dan Spracklen" />
+ <info name="programmer" value="Kathe Spracklen" />
+ <info name="usage" value="Requires a 24K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-11-12 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="174902">
+ <rom name="sargon ii.woz" size="174902" crc="9aa7f20d" sha1="cd53c564732fa5f99704ba8b349b44862bef6d60" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sargon3">
+ <description>Sargon III (revision 1)</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Dan Spracklen" />
+ <info name="programmer" value="Kathe Spracklen" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Title page has Hayden Book Company and does not include Great Games disk. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-17 -->
+ <!-- chess game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233540">
+ <rom name="sargon iii.woz" size="233540" crc="4221ff2a" sha1="1148babdcf183c9bfe40d89cdb5befc5ed53cd6f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1plants_525" cloneof="se1plants">
+ <description>Science Explorers Volume 1 Grades 1-3: Plants</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234777">
+ <rom name="science explorers- plants side a.woz" size="234777" crc="3151d8b1" sha1="e7840444b38c311b80a8c00f30b9251e1e579f08" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234777">
+ <rom name="science explorers- plants side b.woz" size="234777" crc="71b43f73" sha1="4264b7ffecdba5db36f2980c2a16e26cd8235db7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1plants">
+ <description>Science Explorers Volume 1 Grades 1-3: Plants (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296168">
+ <rom name="science explorers- plants 800k.woz" size="1296168" crc="77a7c3b8" sha1="85eaee8968a1b9ec58a462573e4b96e275af9490" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1shadows">
+ <description>Science Explorers Volume 1 Grades 1-3: Shadows (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296169">
+ <rom name="science explorers- shadows 800k.woz" size="1296169" crc="2b3fed2a" sha1="75ea2ff87859cf94f3f4f31da36547666a554b73" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1skelet_525" cloneof="se1skelet">
+ <description>Science Explorers Volume 1 Grades 1-3: Skeletons</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234764">
+ <rom name="science explorers- skeletons side a.woz" size="234764" crc="3aa59b8e" sha1="51696f63cc5ab0aa5dd2a0571aade880ca910bb3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234764">
+ <rom name="science explorers- skeletons side b.woz" size="234764" crc="2998f8e6" sha1="662768640740923a04c6f77f3214326d973d43c1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1skelet">
+ <description>Science Explorers Volume 1 Grades 1-3: Skeletons (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296171">
+ <rom name="science explorers- skeletons 800k.woz" size="1296171" crc="1c09bd4c" sha1="b6e6f80e158b655832f1aec971939e7b207aabce" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se1weather">
+ <description>Science Explorers Volume 1 Grades 1-3: Weather (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296195">
+ <rom name="science explorers- weather 800k.woz" size="1296195" crc="36354bf8" sha1="bfd628011dba223dc08fe09d24bf5e8882dc4d31" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2animad_525" cloneof="se2animad">
+ <description>Science Explorers Volume 2 Grades 4-6: Animal Adaptations</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side - A" />
+ <dataarea name="flop" size="234773">
+ <rom name="science explorers- animal adaptations side a.woz" size="234773" crc="781de2fe" sha1="a5b41db88a949b5da69559b0564aa6db609e7bc1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side - B" />
+ <dataarea name="flop" size="234773">
+ <rom name="science explorers- animal adaptations side b.woz" size="234773" crc="b7ee3dfa" sha1="3972c6dc629d1a6364e401157df4891ea5060833" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2animad">
+ <description>Science Explorers Volume 2 Grades 4-6: Animal Adaptations (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296175">
+ <rom name="science explorers- animal adaptations 800k.woz" size="1296175" crc="8bed63ae" sha1="55fed06a3615dda508a27616161e7de1f22e0d3a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2dns">
+ <description>Science Explorers Volume 2 Grades 4-6: Day, Night, and The Seasons (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296184">
+ <rom name="science explorers- day, night, and the seasons 800k.woz" size="1296184" crc="bc3c66cc" sha1="eb65b120f2ec273757ae4ed235a8e1d8bc4fa62b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2nutrit">
+ <description>Science Explorers Volume 2 Grades 4-6: Nutrition (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296166">
+ <rom name="science explorers- nutrition 800k.woz" size="1296166" crc="d1156b93" sha1="46a7cd52c75e27343a771a7a32d15aafe28fe17a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="se2simpmach">
+ <description>Science Explorers Volume 2 Grades 4-6: Simple Machines (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="programmer" value="Laurie Beckelman" />
+ <info name="programmer" value="Frederick A. Haer" />
+ <info name="programmer" value="Sarah Smith" />
+ <info name="programmer" value="Aleksandar Totic" />
+ <info name="programmer" value="Raul Bustamante" />
+ <info name="programmer" value="Betty Yuen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296172">
+ <rom name="science explorers- simple machines 800k.woz" size="1296172" crc="0f9515a8" sha1="4bbbc2cfcb49e382a0b8532181da8e7cfbd9eb69" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scgiants">
+ <description>Science Giants (A-343 version 1.0) (800K 3.5")</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-343" />
+ <info name="programmer" value="Ray Kush" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296207">
+ <rom name="science giants 800k.woz" size="1296207" crc="253996a2" sha1="628ae886231fe1b93308b600da9f4297383586bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scitk">
+ <description>Science Toolkit</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Scott Shumway" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-05 -->
+ <!-- education program -->
+ <!-- Includes master module and all three extension modules (originally sold separately: Speed & Motion, Earthquake Lab, and Body Lab. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Master Module" />
+ <dataarea name="flop" size="221556">
+ <rom name="science toolkit- master module.woz" size="221556" crc="f1b5c545" sha1="265796d74227bc41f1e1f38b43b35173dff9521d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Module 1: Speed &amp; Motion" />
+ <dataarea name="flop" size="234863">
+ <rom name="science toolkit module 1- speed and motion.woz" size="234863" crc="7e906be5" sha1="141579b27d2ca9528b3883b41a4a097828bad1b7" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Module 2: Earthquake Lab" />
+ <dataarea name="flop" size="234863">
+ <rom name="science toolkit module 2- earthquake lab.woz" size="234863" crc="b5fdff05" sha1="a726e4bd793afb2bb78d70b67a23f4d4111d50ae" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Module 3: Body Lab" />
+ <dataarea name="flop" size="234857">
+ <rom name="science toolkit module 3- body lab.woz" size="234857" crc="6aca00f8" sha1="aa1054faf877efa2c5719edef691bd6e235e3be4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scitkp">
+ <description>Science Toolkit Plus (version 2.0)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Scott Shumway" />
+ <info name="programmer" value="Michael Wise" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-05 -->
+ <!-- education program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Master module" />
+ <dataarea name="flop" size="241512">
+ <rom name="science toolkit plus v2.0 disk 1 - master module.woz" size="241512" crc="421c7922" sha1="9c4dbbb09ffcf609a4efe34be3fb6f0753c177b9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Module 1: Speed &amp; Motion" />
+ <dataarea name="flop" size="241523">
+ <rom name="science toolkit plus v2.0 disk 2 - module 1- speed and motion.woz" size="241523" crc="1f24f501" sha1="69d51f5d5663a7a73eddadc81f110575adaeff7e" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Module 2: Earthquake Lab" />
+ <dataarea name="flop" size="241523">
+ <rom name="science toolkit plus v2.0 disk 3 - module 2- earthquake lab.woz" size="241523" crc="01807b1e" sha1="d0cd79b8649110c16f8051fb552389463c94e18a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Module 3: Body Lab" />
+ <dataarea name="flop" size="241517">
+ <rom name="science toolkit plus v2.0 disk 4 - module 3- body lab.woz" size="241517" crc="7ede15f2" sha1="79f286fb54c3b806718fa21025c0fa10c720e8f7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sminvread">
+ <description>Scoop Mahoney: Investigative Reader</description>
+ <year>1988</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Susan Mahoney &amp; Associates" />
+ <info name="programmer" value="Susan Mahoney" />
+ <info name="programmer" value="Rian Murphy" />
+ <info name="programmer" value="Paul Lempke" />
+ <info name="programmer" value="Bob Dronski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="234907">
+ <rom name="scoop mahoney disk 1a - program.woz" size="234907" crc="66a8c39c" sha1="feb4153e8a7611b4e86d91634405999dd73237c0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="234874">
+ <rom name="scoop mahoney disk 1b - program.woz" size="234874" crc="0f23bcc5" sha1="ec7db9d7cee4d5eaf17807a6f5c9785f259c17bb" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Assignments" />
+ <dataarea name="flop" size="234904">
+ <rom name="scoop mahoney disk 2 - assignments.woz" size="234904" crc="e7ee8eac" sha1="23d40d35a34e55b6f1ee65549eb3ba5eea8b80d7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="saga1alandv20">
- <description>Scott Adams Graphic Adventure 1: Adventureland (version 2.0/416)</description>
+ <description>Scott Adams Graphic Adventure #1: Adventureland (version 2.0/416)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.0/416" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-23-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-23 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234839">
@@ -29738,15 +36841,15 @@ license:CC0-1.0
</software>
<software name="saga2piradv">
- <description>Scott Adams Graphic Adventure 2: Pirate Adventure (version 2.1/408)</description>
+ <description>Scott Adams Graphic Adventure #2: Pirate Adventure (version 2.1/408)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/408" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-23-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-23 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234855">
@@ -29762,16 +36865,18 @@ license:CC0-1.0
</software>
<software name="saga3misimp">
- <description>Scott Adams Graphic Adventure 3: Mission Impossible (version 2.1/306)</description>
+ <description>Scott Adams Graphic Adventure #3: Mission Impossible (version 2.1/306)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
+ <info name="alt_title" value="Scott Adams graphic Adventure 3: Secret Mission" />
+ <!-- Was renamed Secret Mission in 1980 for a brief period and then back to its original title to avoid legal action related to the TV show of the same name. -->
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/306" />
<!-- This version appears to have the game title scrubbed from both the graphical title page and the text introduction, for reasons unknown. (To be clear, this is on the original copy protected disk.) -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-23-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-23 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234836">
@@ -29787,15 +36892,15 @@ license:CC0-1.0
</software>
<software name="saga4voocas">
- <description>Scott Adams Graphic Adventure 4: Voodoo Castle (version 2.1/119)</description>
+ <description>Scott Adams Graphic Adventure #4: Voodoo Castle (version 2.1/119)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Alexis Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/119" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-24-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-24 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234840">
@@ -29811,15 +36916,16 @@ license:CC0-1.0
</software>
<software name="saga5count">
- <description>Scott Adams Graphic Adventure 5: The Count (version 2.1/115)</description>
+ <description>Scott Adams Graphic Adventure #5: The Count (version 2.1/115)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
- <info name="programmer" value="Scott Adams, Kem McNair, and Norm Sailer" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="programmer" value="Norm Sailer" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/115" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-25-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-25 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234889">
@@ -29835,15 +36941,15 @@ license:CC0-1.0
</software>
<software name="saga6strody">
- <description>Scott Adams Graphic Adventure 6: Strange Odyssey (version 2.1/119)</description>
+ <description>Scott Adams Graphic Adventure #6: Strange Odyssey (version 2.1/119)</description>
<year>1982</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="2.1/119" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-26-->
- <!--adventure game-->
+ <!-- Dump released: 2019-04-26 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234841">
@@ -29859,15 +36965,15 @@ license:CC0-1.0
</software>
<software name="saga13sorcc">
- <description>Scott Adams Graphic Adventure 13: The Sorcerer of Claymorgue Castle (version 2.2/122)</description>
+ <description>Scott Adams Graphic Adventure #13: The Sorcerer of Claymorgue Castle (version 2.2/122)</description>
<year>1984</year>
<publisher>Adventure International</publisher>
<info name="programmer" value="Scott Adams" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="2.2/122" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-08-15-->
- <!--adventure game-->
+ <!-- Dump released: 2020-08-15 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="241511">
@@ -29882,17 +36988,127 @@ license:CC0-1.0
</part>
</software>
+ <software name="scrmbeggr1" cloneof="scrmbegg">
+ <description>Scrambled Eggs! (revision 1)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Does not show the Litag developer screen. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234744">
+ <rom name="scrambled eggs rev. 1.woz" size="234744" crc="bffd2164" sha1="cc738781b1c7ed8533ff538a26e5744f40d6319c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scrmbegg">
+ <description>Scrambled Eggs! (revision 2)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Shows the Litag developer screen and the Learning Technologies screen is different. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234760">
+ <rom name="scrambled eggs rev. 2.woz" size="234760" crc="5a62ee05" sha1="7e7b97623adc4bffc6640ce12f26f433dfbed0ba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seadragn">
+ <description>Sea Dragon</description>
+ <year>1982</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="John Anderson" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-01 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233487">
+ <rom name="sea dragon.woz" size="233487" crc="a6cd0fc9" sha1="ab137feff2e486d2232b32582fc28929ba628d1a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seafox" supported="no">
+ <description>Seafox</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ed Hobbs" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to compatibility problems caused by the copy protection, it will not run on later models." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2019-02-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="339967">
+ <rom name="seafox.woz" size="339967" crc="c8a2ff0b" sha1="df27bc2a43c82e2077f83298a0db80ce052ec23a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="srchking">
+ <description>Searching for a King</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234838">
+ <rom name="searching for a king side a.woz" size="234838" crc="11c9e72f" sha1="8e2d25a1e32c7f3a27111da2355812d129d51e97" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234838">
+ <rom name="searching for a king side b.woz" size="234838" crc="bfdf9f0f" sha1="4951c4d669723bf2ee61977ff79824ab6c45701b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seasons">
+ <description>Seasons</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-12-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234741">
+ <rom name="the seasons.woz" size="234741" crc="7cf0ba08" sha1="492c2a744c5945affff28aa15a3ea6a1747725e4" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sentfun">
<description>Sentence Fun (version 1989) (800K 3.5")</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1989" />
- <!--1989 re-release-->
+ <!-- 1989 re-release -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296707">
<rom name="sentence fun 800k.woz" size="1296707" crc="78438b83" sha1="2184bd6fd27eda6ae43926ddf97e2a1539c69cb1" />
@@ -29900,14 +37116,57 @@ license:CC0-1.0
</part>
</software>
+ <software name="serpntne">
+ <description>Serpentine</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Snider" />
+ <info name="usage" value="Requires a 48K Apple ][, ][+, or unenhanced //e. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
+ <!-- Dump released: 2019-02-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="354587">
+ <rom name="serpentine.woz" size="354587" crc="f3bec3d9" sha1="593b149b7ad986e34b10b15e3e876c87377e245d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="7ctygold">
+ <description>Seven Cities of Gold</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Dan Bunten" />
+ <info name="programmer" value="Bill Bunten" />
+ <info name="programmer" value="Jim Rushing" />
+ <info name="programmer" value="Alan Watson" />
+ <info name="programmer" value="Mark Botner" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-07 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="228178">
+ <rom name="the seven cities of gold side a.woz" size="228178" crc="7a779b11" sha1="cb7a07fc9fd5f1f4692bd2537c790d03f47e3aa8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234834">
+ <rom name="the seven cities of gold side b.woz" size="234834" crc="53dac48f" sha1="df148ec17c6943da18b60b9856573d846ad5b838" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="shadhwk1">
<description>Shadow Hawk One</description>
<year>1981</year>
<publisher>Horizon Simulations</publisher>
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-17-->
- <!--strategy game-->
+ <!-- Dump released: 2022-02-17 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234773">
<rom name="shadow hawk one.woz" size="234773" crc="bcee3ca5" sha1="92795b9d977de453863d43fb0ab336b39ed15330" />
@@ -29915,6 +37174,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="shpclrrd">
+ <description>Shape and Color Rodeo</description>
+ <year>1984</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Neosoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="shape and color rodeo.woz" size="234785" crc="6064245e" sha1="5226af7da9310ad7bb09febcdde6e318dcc1f510" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="shpspatt">
<description>Shapes and Patterns</description>
<year>1988</year>
@@ -29922,8 +37197,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234774">
<rom name="shapes and patterns.woz" size="234774" crc="d716cc89" sha1="a055cff882adc289c45d60a89b81971898f0eb88" />
@@ -29931,15 +37206,42 @@ license:CC0-1.0
</part>
</software>
+ <software name="sherabow">
+ <description>Sherlock Holmes: Another Bow</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="programmer" value="Bradley G. Stewart" />
+ <info name="programmer" value="Peter A. Golden" />
+ <info name="programmer" value="Michael J. Becker" />
+ <info name="programmer" value="Alan Smith" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235540">
+ <rom name="sherlock holmes in another bow side a.woz" size="235540" crc="1732e581" sha1="09700ab41f161d7ae85dce73d6caaed2dbf84cdb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235560">
+ <rom name="sherlock holmes in another bow side b.woz" size="235560" crc="9a3f6312" sha1="ee2a62b36982f5a09c81d353f0aebf6ded2123dc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sherwood">
<description>Sherwood Forest</description>
<year>1982</year>
<publisher>Phoenix Software</publisher>
- <info name="programmer" value="Dale Johnson and Dav Holle" />
+ <info name="programmer" value="Dale Johnson" />
+ <info name="programmer" value="Dav Holle" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-06-15-->
- <!--adventure game-->
+ <!-- Dump released: 2019-06-15 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="208154">
<rom name="sherwood forest.woz" size="208154" crc="49b76125" sha1="c2771aea964e43a3519cc52f61d6a17b4c009b42" />
@@ -29947,15 +37249,295 @@ license:CC0-1.0
</part>
</software>
+ <software name="shopright">
+ <description>Shop Right!</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="alt_title" value="$hop Right!" />
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234748">
+ <rom name="shop right.woz" size="234748" crc="07a0bdd7" sha1="143a23e2b6a140ea0751ba9c03cf34c11f604f4a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrtcrct">
+ <description>Short Circuit</description>
+ <year>1984</year>
+ <publisher>Micro Fun</publisher>
+ <info name="original_publisher" value="Micro Lab" />
+ <info name="programmer" value="David H. Schroeder" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-15 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="467733">
+ <rom name="short circuit.woz" size="467733" crc="d95cd68f" sha1="68b5bc28da9216515a0bfb13665fd05d50f70f32" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shortcuts">
+ <description>Shortcuts</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Kelly Puckett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- development utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234797">
+ <rom name="shortcuts.woz" size="234797" crc="80fbf42c" sha1="fb47e355e373345d03139b44c1f1f68934cf0c56" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="showtime">
+ <description>Show Time (A-171 version 1.1)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-171" />
+ <info name="programmer" value="Shirley Keran" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234782">
+ <rom name="show time v1.1 side a.woz" size="234782" crc="e4e19090" sha1="4b169386362763fbf86f1d396f2e7491f468cbbc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234782">
+ <rom name="show time v1.1 side b.woz" size="234782" crc="0e92e491" sha1="b43accc4cfec757422868d00c745298edb9e2ce8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shutpict">
+ <description>Shutterbug's Pictures</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Learning Technologies" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234740">
+ <rom name="shutterbug's pictures.woz" size="234740" crc="f80e680e" sha1="9330cd7e74858ea01a638cdeb60c14f3f574a339" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shtlintr">
+ <description>Shuttle Intercept</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Imaginative Systems Software" />
+ <info name="programmer" value="John van Ryzin" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="shuttle intercept.woz" size="234775" crc="71b41ee1" sha1="f303b93c84e76397d5931521a7c143003a89369f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pirates" supported="no">
+ <description>Sid Meier's Pirates! (version 332.01)</description>
+ <year>1987</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Tony Dahbura" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="332.01" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Works in MAME 0.255, but broken in recent releases. -->
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234868">
+ <rom name="pirates v332.01 side a.woz" size="234868" crc="b47d66cf" sha1="a676105e92e3c4f185cffbfc7f463714e97ed288" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234868">
+ <rom name="pirates v332.01 side b.woz" size="234868" crc="da21c79f" sha1="2f4fa8c9fa951dbceafd3865c885449e99e695bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sdwsnkrs">
+ <description>Sidewalk Sneakers</description>
+ <year>1991</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Michael Sweet" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="sidewalk sneakers.woz" size="234815" crc="eca45646" sha1="29f5f8fd6e748f2a31b370bf5fdc24f68ac9c39f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scboxing">
+ <description>Sierra Championship Boxing</description>
+ <year>1985</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="developer" value="Sierra On-Line" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-12 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234766">
+ <rom name="sierra championship boxing.woz" size="234766" crc="7c1b1a8f" sha1="ae938d5bda40565cf8ca3f7b8373543a36f726f3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slntsvcer1" cloneof="slntsvce">
+ <description>Silent Service (revision 1)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="silent service.woz" size="234762" crc="52af003d" sha1="2d462220c0ed639e5a75a9da2a0b82f3bb78d40d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slntsvce32502" cloneof="slntsvce">
+ <description>Silent Service (version 325.02)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="325.02" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228121">
+ <rom name="silent service v325.02.woz" size="228121" crc="0e46dbfe" sha1="f51462065a5630b17306bd0aba772790991bf502" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slntsvce">
+ <description>Silent Service (version 325.04)</description>
+ <year>1985</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="325.04" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228154">
+ <rom name="silent service v325.04.woz" size="228154" crc="20e72b58" sha1="02950446474ebca292f05336ee27973098c4cb31" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="simonsays">
+ <description>Simon Says...</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Jim McDonagh" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="simon says.woz" size="234801" crc="cf2a10ca" sha1="3790e710b5a9497b12f98d9908aaf0c3959b45de" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="simlineq">
+ <description>Simultaneous Linear Equations</description>
+ <year>1984</year>
+ <publisher>Microcomputer Workshops Courseware</publisher>
+ <info name="programmer" value="Mark Berman" />
+ <info name="programmer" value="Kevin Vessio" />
+ <info name="programmer" value="Don Ross" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-07 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="252755">
+ <rom name="simultaneous linear equations.woz" size="252755" crc="de565e61" sha1="6f11ae0b7b74e130503cea4a347b662db6fdc9b8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newtgmes">
+ <description>Sir Isaac Newton's Games</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233765">
+ <rom name="sir isaac newton's games.woz" size="233765" crc="0caba2c1" sha1="96222cfa1bdc14cc6c2c7fe3eecbde1d93cdba9f" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sitcrit">
<description>Situation: Critical</description>
<year>1984</year>
<publisher>Prism Software</publisher>
- <info name="programmer" value="Alex Stern, Peter Rokitski, and Greg George" />
+ <info name="programmer" value="Alex Stern" />
+ <info name="programmer" value="Peter Rokitski" />
+ <info name="programmer" value="Greg George" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-19-->
- <!--action game-->
+ <!-- Dump released: 2024-04-19 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="181562">
<rom name="situation- critical.woz" size="181562" crc="22b69582" sha1="a5775c0a6a2cb88d72f1421163300839cd99039c" />
@@ -29963,17 +37545,176 @@ license:CC0-1.0
</part>
</software>
+ <software name="sixgunsh">
+ <description>Six-Gun Shootout (version 1.0)</description>
+ <year>1985</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="developer" value="Strategic Simulations" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-03 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241423">
+ <rom name="six-gun shootout.woz" size="241423" crc="2c9a94e1" sha1="9a9a6bbdcf104b316dcaeb5fba3f4cec6e41f948" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skicrzed">
+ <description>Ski Crazed (version 28701)</description>
+ <year>1987</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="JAM Software" />
+ <info name="partno" value="28701" />
+ <info name="programmer" value="Jason Rubin" />
+ <info name="programmer" value="Andy Gavin" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="28701" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-25 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="ski crazed.woz" size="234775" crc="92531d10" sha1="9fb8ad412976644fa03814229e1b84196ca8fcaf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skylab">
+ <description>Sky Lab (A-155 version 1.1) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-155" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345279">
+ <rom name="sky lab v1.1 800k.woz" size="1345279" crc="c3a1a560" sha1="d8f39ccad7129ae2e76f9c1b067c6b09883a60f0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="skyfox">
+ <description>Skyfox</description>
+ <year>1984</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Raymond Tobey" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-11 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233473">
+ <rom name="skyfox.woz" size="233473" crc="be10a46c" sha1="acef2901b6166e7cef4a899bb113e9b052c7bcd7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slidshop">
+ <description>Slide Shop (version 1.41)</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.41" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Master" />
+ <dataarea name="flop" size="234848">
+ <rom name="slide shop v1.41 disk 1a - master disk side a.woz" size="234848" crc="d3edd9e2" sha1="f181f30a62dfef64aac93cbda1a4f74ee2db9f7c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Master" />
+ <dataarea name="flop" size="234815">
+ <rom name="slide shop v1.41 disk 1b - master disk side b.woz" size="234815" crc="d33220c1" sha1="7a9913f02f1cb4bcd56af43220d16a0a1126cc55" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Graphic backgrounds" />
+ <dataarea name="flop" size="234823">
+ <rom name="slide shop v1.41 disk 2a - graphic backgrounds side a.woz" size="234823" crc="fc14016a" sha1="c887a471ee5c8dc1c3df8f9954ba74a5829ca5c2" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Graphic backgrounds" />
+ <dataarea name="flop" size="234823">
+ <rom name="slide shop v1.41 disk 2b - graphic backgrounds side b.woz" size="234823" crc="1445e840" sha1="98e83ddc8d5e10291bb92f03b35c089e953db480" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Fonts, borders, sounds, clip art" />
+ <dataarea name="flop" size="234829">
+ <rom name="slide shop v1.41 disk 3a - fonts, borders, sounds, clip art.woz" size="234829" crc="09a409c1" sha1="6379529dc5a02254e9f37cdab37cb543c234ef33" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - clip art" />
+ <dataarea name="flop" size="234805">
+ <rom name="slide shop v1.41 disk 3b - clip art.woz" size="234805" crc="4d7f84b3" sha1="4d35b7c16eb9ccf488910b8b9489d0cf0dcea804" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="slidblokr1">
+ <description>Sliding Block (revision 1) (Learning Technologies)</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234748">
+ <rom name="sliding block.woz" size="234748" crc="a942723b" sha1="f8f05f3f93ba3c347362f488abf230cd98613655" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="snoggle">
+ <description>Snoggle</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Jun Wada" />
+ <info name="programmer" value="Kenn Iba" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-05 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="68557">
+ <rom name="snoggle.woz" size="68557" crc="e65cf748" sha1="239aa3d0aec224a759e12085c732b11fa86d9a63" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="stgranpt">
<description>Snooper Troops 1: The case of: The Granite Point Ghost</description>
<year>1982</year>
<publisher>Spinnaker Software</publisher>
<info name="developer" value="Tom Snyder Productions" />
- <info name="programmer" value="Tom Snyder, Karen Eagen, Karen Whittredge, Chris A. Lutes Jr., Kathy Lunt, Bruce Brown, and David Beyer" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="Karen Eagen" />
+ <info name="programmer" value="Karen Whittredge" />
+ <info name="programmer" value="Chris A. Lutes, Jr." />
+ <info name="programmer" value="Kathy Lunt" />
+ <info name="programmer" value="Bruce Brown" />
+ <info name="programmer" value="David Beyer" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
- <!--The version was not listed-->
+ <!-- The version was not listed -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-05-28-->
- <!--adventure game-->
+ <!-- Dump released: 2020-05-28 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234901">
<rom name="snooper troops and the case of the granite point ghost.woz" size="234901" crc="44a4ba15" sha1="514640d732c708a0956015e3129ea3de3e1bdc4a" />
@@ -29981,15 +37722,270 @@ license:CC0-1.0
</part>
</software>
+ <software name="soloflt">
+ <description>Solo Flight</description>
+ <year>1984</year>
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Andy Hollis" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234749">
+ <rom name="solo flight.woz" size="234749" crc="18e64e7d" sha1="69a16a10d1669df6df36a3e3095a64148ad96841" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="soleqineq">
+ <description>Solving Equations and Inequalities (version 2)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Charles Lund" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234823">
+ <rom name="solving equations and inequalities.woz" size="234823" crc="a5b589a2" sha1="b2b318c75fa8321b0da93c3169e63a510b6fe506" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sthncmnd">
+ <description>Southern Command</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-14 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234863">
+ <rom name="southern command.woz" size="234863" crc="e04bb52c" sha1="bc53a1a66fc347859c17238a28b3bd4a8b178739" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spquarks">
+ <description>Space Quarks</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Chris Jochumson" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2018-10-30 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="133617">
+ <rom name="space quarks.woz" size="133617" crc="57eaa341" sha1="ba1ff0245ecc9e5d9446224b52e05823d777ebf5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="squest">
+ <description>Space Quest: The Sarien Encounter</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-03 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 1a.woz" size="234865" crc="81c67f99" sha1="09b7a3f594deeab5aeea1ad35f6fca4b65d08eca" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 1b.woz" size="234865" crc="76b0499f" sha1="2924d85702b43ed05610961d2c6f0a96b9f59c2b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 2a.woz" size="234865" crc="3fcb9942" sha1="d4d9ba684109086c82d8ab2d6112337f523bb046" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 2b.woz" size="234865" crc="2ff225c1" sha1="437b75a0781da96e477093d61e98fed88edb8554" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 3a.woz" size="234865" crc="2c1f654c" sha1="4621fa85bb2c82d103d66225382a4d78bfd44a97" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 3b.woz" size="234865" crc="303bc684" sha1="13f7e97ac1b9de79ae0d5c2034cfb0689be40f09" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 4a.woz" size="234865" crc="ccfdac78" sha1="a414e236d18a223fa63594db1483c9dec988c850" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="234865">
+ <rom name="space quest disk 4b.woz" size="234865" crc="f4ccb762" sha1="1455fed9e6b87a65ec0ffcbc48527bd94d4f99dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="squest2">
+ <description>Space Quest II: Vohaul's Revenge (version 2.0A, interpreter 0.089)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.0A" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-27 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234888">
+ <rom name="space quest ii v2.0a disk 1a.woz" size="234888" crc="711e8349" sha1="86455e96a2695259399f59798bea24813e80db07" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 1b.woz" size="235596" crc="8374b722" sha1="3da1f035dc7eb1920969d1e10a3e47287163cf05" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 2a.woz" size="235596" crc="a29da317" sha1="ab590eb95460e713b09f5746994807cbacd8ef3a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 2b.woz" size="235596" crc="a98b53fc" sha1="a19a8dcf9ea45b127939733215a045cad8f3c2e2" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 3a.woz" size="235596" crc="4bbcd458" sha1="2469aeac61f548284111d0a5335c8982303948e4" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 3b.woz" size="235596" crc="09126b5b" sha1="97f71dc5cb6c2618aa7de7a03d67ba8246beb494" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 4a.woz" size="235596" crc="72c6e40f" sha1="57b232ae44f97a6b65fb7f401bdc2d9eb898bbca" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B" />
+ <dataarea name="flop" size="235596">
+ <rom name="space quest ii v2.0a disk 4b.woz" size="235596" crc="494cbd18" sha1="fd13223056eed412739c2400b1d19c6291ca05e6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spcrogue">
+ <description>Space Rogue</description>
+ <year>1989</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Paul Neurath" />
+ <info name="programmer" value="Steven Muchow" />
+ <info name="programmer" value="Ned Lerner" />
+ <info name="programmer" value="John Miles" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Boot" />
+ <dataarea name="flop" size="234806">
+ <rom name="space rogue side a - boot.woz" size="234806" crc="63639cb1" sha1="584e5fe82b9ee3861200e4359d68430a0f85cc9a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Data" />
+ <dataarea name="flop" size="234806">
+ <rom name="space rogue side b - data.woz" size="234806" crc="e8f19087" sha1="c4718d7619fb453e64f47db171fa6ddd2855baf5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spwarior">
+ <description>Space Warrior</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Marc Goodman" />
+ <info name="usage" value="Requires a 32K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-20 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="61721">
+ <rom name="space warrior.woz" size="61721" crc="e0b4e0ed" sha1="96cd4e7ba3e49c48d29987fec219f452eb33b413" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spcwrace">
+ <description>Space Waste Race: Storybooks of the Future</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John D. Perron" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234846">
+ <rom name="space waste race- storybooks of the future.woz" size="234846" crc="c4956fa2" sha1="f4f35ce23a0639b98e73d62dc44f34b6dce01780" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sparechg">
<description>Spare Change</description>
<year>1983</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Dan Zeller and Mike Zeller" />
+ <info name="programmer" value="Dan Zeller" />
+ <info name="programmer" value="Mike Zeller" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-11-08-->
- <!--action game-->
+ <!-- Dump released: 2018-11-08 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="346703">
<rom name="spare change.woz" size="346703" crc="f70b9057" sha1="c58f7833eb4f8f29ae4bf7820efb4e29c6821531" />
@@ -29997,16 +37993,241 @@ license:CC0-1.0
</part>
</software>
+ <software name="specprpt">
+ <description>Spectrum: Programs and Patterns</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Stephen R. Shalom" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-06 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234751">
+ <rom name="spectrum- patterns and programs.woz" size="234751" crc="7b5a279a" sha1="f433ecbcbebd17f6d86925ce8c085d49ac4ab164" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdrdr2061285">
+ <description>Speed Reader II (version 06.12.85)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="06.12.85" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="241471">
+ <rom name="speed reader ii v061285 disk 1 - program disk.woz" size="241471" crc="fe8b6799" sha1="a7b58b21cb88b0d9d9b918f752633cff29ed3976" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data" />
+ <dataarea name="flop" size="234815">
+ <rom name="speed reader ii v061285 disk 2 - data disk.woz" size="234815" crc="286c1f6e" sha1="56fc5e3bf4c37ad6d5281e42af39094190cb7d2f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swaymath_525" cloneof="swaymath">
+ <description>Speedway Math (A-169 version 1.0)</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-169" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234765">
+ <rom name="speedway math.woz" size="234765" crc="a97daabb" sha1="8aeda33f513380483f9aa731468822b5327f3c55" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swaymath">
+ <description>Speedway Math (A-169 version 1.0) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-169" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345311">
+ <rom name="speedway math 800k.woz" size="1345311" crc="bae80f2a" sha1="9702511ee81cc9a5465feec344baddeac4526c88" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spdydvry">
+ <description>Speedy Delivery</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234750">
+ <rom name="speedy delivery.woz" size="234750" crc="d8c1700e" sha1="5be7b78e19497237d45e51623c8e2dfa08563980" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellitu" cloneof="spellit">
+ <description>Spell It!</description>
+ <year>1984</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="241432">
+ <rom name="spell it side a.woz" size="241432" crc="3c4583ff" sha1="a6107d3ed6d07189bbfcd875205694eb00a7a7bd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234776">
+ <rom name="spell it side b.woz" size="234776" crc="ca9718fd" sha1="3aa728730d386ace23fd791ca21bf828cddbfe7a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellit070385" cloneof="spellit">
+ <description>Spell It! (version 07.03.85)</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="07.03.85" />
+ <!-- according to disk label -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="241465">
+ <rom name="spell it v070385 side a.woz" size="241465" crc="0e50c5ea" sha1="4eebbce0345f94eee608046ce05bd6440e4bc13b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="241465">
+ <rom name="spell it v070385 side b.woz" size="241465" crc="7abbdcac" sha1="89c21d2a622ec0091f3a7db07c9c483e5bd54b9b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellit">
+ <description>Spell It! (version 06.01.87) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="06.01.87" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1328979">
+ <rom name="spell it 800k.woz" size="1328979" crc="e4bbc951" sha1="f443cb280b267e0b176faa285fb6167b2e72deda" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellitp090189" cloneof="spellitp">
+ <description>Spell It Plus! (version 09.01.89)</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Faye Schwartz" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Kevin Burley" />
+ <info name="programmer" value="Carol Carpenter" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="09.01.89" />
+ <!-- according to physical disk label -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="241530">
+ <rom name="spell it plus v090189 - program side 1.woz" size="241530" crc="9a8254fd" sha1="5c30ebe7bf41259983fc15b1d9d8270629920987" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="241530">
+ <rom name="spell it plus v090189 - program side 2.woz" size="241530" crc="1d0b5687" sha1="7ea15832714a5b9176f5d9c79083dca80693d609" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data" />
+ <dataarea name="flop" size="234902">
+ <rom name="spell it plus v090189 - data disk.woz" size="234902" crc="553915b4" sha1="d3e3ee4820b91c7ae18aa598308ff53537620c66" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Junior data" />
+ <dataarea name="flop" size="234876">
+ <rom name="spell it plus v090189 - junior data disk.woz" size="234876" crc="559892ec" sha1="1a38ed39294017441fdc9eb9d39bbcb7d6ce5734" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellitp">
+ <description>Spell It Plus! (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Faye Schwartz" />
+ <info name="programmer" value="Cathy Johnson" />
+ <info name="programmer" value="Kevin Burley" />
+ <info name="programmer" value="Carol Carpenter" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296218">
+ <rom name="spell it plus 800k.woz" size="1296218" crc="12943fe4" sha1="fc672aaaaacb195229719107eaaaf36b6feb127d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sprule">
<description>Spelling Rules (version 1989) (800K 3.5")</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1987" />
- <!--1989 re-release-->
+ <!-- 1989 re-release -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1297155">
<rom name="spelling rules 800k.woz" size="1297155" crc="824e437b" sha1="0cf88bf109922357ed217533d772ce3af30ffff2" />
@@ -30014,18 +38235,60 @@ license:CC0-1.0
</part>
</software>
+ <software name="sv2sec20">
+ <description>Spelling Volume 2: Secondary (A-728 version 2.0)</description>
+ <year>1980</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-728" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234811">
+ <rom name="spelling volume 2- secondary v2.0.woz" size="234811" crc="729e8cfc" sha1="d7b9596af90d4abc5cae111ca3b6e8dd5f99e4f3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spidrbot">
+ <description>Spiderbot</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Richard Unruh" />
+ <info name="programmer" value="Ken Moore" />
+ <info name="programmer" value="Douglas Dragin" />
+ <info name="programmer" value="Howard Scheer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233502">
+ <rom name="spiderbot.woz" size="233502" crc="f7b64cd0" sha1="e72e20f91059801312da133dcc8aa99b354e6428" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sportstat">
<description>Sports Stats (A-405 version 1.0)</description>
<year>1985</year>
<publisher>MECC</publisher>
<info name="developer" value="TIES" />
<info name="partno" value="A-405" />
- <info name="programmer" value="Jim Sydow, Ron Geiser, Reed Christiansen, Dave Laden, Curt Traaseth, and Jean Brown"/>
+ <info name="programmer" value="Jim Sydow" />
+ <info name="programmer" value="Ron Geiser" />
+ <info name="programmer" value="Reed Christiansen" />
+ <info name="programmer" value="Dave Laden" />
+ <info name="programmer" value="Curt Traaseth" />
+ <info name="programmer" value="Jean Brown" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-20-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234787">
<rom name="sports stats v1.0.woz" size="234787" crc="cb25650f" sha1="14f5c15660cb1964d8f0038a2b4e4ca649aa29a2" />
@@ -30033,15 +38296,201 @@ license:CC0-1.0
</part>
</software>
+ <software name="spyvspy3">
+ <description>Spy vs. Spy III: Arctic Antics</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="First Star Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-20 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233468">
+ <rom name="spy vs. spy iii.woz" size="233468" crc="c19123d1" sha1="2585f7cd612f5f549dacfa2ce9994ede66ab35c6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spydemis">
+ <description>Spy's Demise</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Alan Zeldin" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-20 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="120328">
+ <rom name="spy's demise.woz" size="120328" crc="0586db9f" sha1="a7520b7c9d7caddb4db74d1931051212df6c996d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starblzrb">
+ <description>Star Blazer (Brøderbund)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="original_publisher" value="Star Craft" />
+ <info name="programmer" value="Tony Suzuki" />
+ <info name="usage" value="Requires a 48K Apple ][ or ][+. Due to copy protection, it will not run on later models without nonstandard firmware." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <!-- Dump released: 2019-03-25 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="354545">
+ <rom name="star blazer.woz" size="354545" crc="7895bdd6" sha1="848f6cdfa94f5942775e4cf133d589552fe22a86" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starmaze">
+ <description>Star Maze</description>
+ <year>1982</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Gordon Eastman" />
+ <info name="usage" value="Requires a 48K Apple ][, Apple ][+, or unenhanced Apple //e. Does not run on later modes due to copy protection." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E" />
+ <!-- Dump released: 2024-12-06 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="307967">
+ <rom name="star maze.woz" size="307967" crc="60b604a8" sha1="113c6167977aff4a0c73664a97b28d3b30ce3b4f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="smdivis">
+ <description>Star Maze: Division</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Scott, Foresman and Company" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234764">
+ <rom name="star maze- division.woz" size="234764" crc="2bee6ce1" sha1="4b31010bf1f29f2105d6d4aacdd8775518e9657b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starblst">
+ <description>Starblaster (Softsmith)</description>
+ <year>1982</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Piccadilly Software" />
+ <info name="programmer" value="Mark &quot;Gopher&quot; Kriegsman" />
+ <info name="programmer" value="Geoffrey Engelstein" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="68376">
+ <rom name="starblaster (softsmith).woz" size="68376" crc="c1f288f5" sha1="503b8fe9d174cebd19d62cc7d5b6005c7145b614" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stargate">
+ <description>Stargate (Atarisoft)</description>
+ <year>1983</year>
+ <publisher>Atari</publisher>
+ <info name="alt_title" value="Defender II" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-13 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233447">
+ <rom name="stargate.woz" size="233447" crc="379d894d" sha1="56d17415d622395bddbe7200adde32f4ad63b208" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sqstarwar">
+ <description>Starquest: Star Warrior</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Jim Connelley" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="usage" value="Requires a 13-sector drive but otherwise Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2019-03-29 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234793">
+ <rom name="star warrior.woz" size="234793" crc="2f8c4fa6" sha1="0cea6128cc971cc5606a80a7594fcc4749a177ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="states">
+ <description>States (version 2.0)</description>
+ <year>1988</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234777">
+ <rom name="states v2.0.woz" size="234777" crc="92c9c11d" sha1="73976f8e48baa75e9b948d4674fdd42ad38ef42c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="station5">
+ <description>Station 5</description>
+ <year>1984</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Stephen Goss" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="station 5.woz" size="234761" crc="52124dfd" sha1="7baaa8a17d373182c28f3486423f770a35078cb9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stellar7">
+ <description>Stellar 7 (Penguin Software)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="developer" value="Dyamix" />
+ <info name="original_publisher" value="Software Entertainment Company" />
+ <info name="programmer" value="Damon Slye" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Remake by Dynamix and distributed by Penguin Software. -->
+ <!-- Dump released: 2018-11-17 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233471">
+ <rom name="stellar 7.woz" size="233471" crc="c93bf1da" sha1="df24d579842e7c11c662a533cc43e6a1a03ddbaa" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sbbasic">
<description>Stickybear BASIC</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][+ or later with Applesoft BASIC in ROM." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234830">
<rom name="stickybear basic.woz" size="234830" crc="82939431" sha1="8947686a0498db3e8b507431da97fe4de952768f" />
@@ -30051,15 +38500,17 @@ license:CC0-1.0
<software name="sbbnced" cloneof="sbbnce">
<description>Stickybear Basket Bounce (demo)</description>
- <!--Self-running demo-->
+ <!-- Self-running demo -->
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="demo" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234850">
<rom name="stickybear basketbounce demo.woz" size="234850" crc="277e56f5" sha1="77d238419e44aeedce3a1472be29b4f6d03760d2" />
@@ -30071,11 +38522,13 @@ license:CC0-1.0
<description>Stickybear Basket Bounce</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234861">
<rom name="stickybear basket bounce.woz" size="234861" crc="636c4e87" sha1="d087282efbc1fb4bef21743ceb7dc02a29bb78ab" />
@@ -30087,11 +38540,12 @@ license:CC0-1.0
<description>Stickybear Bop</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Jack Rice" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Jack Rice" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234816">
<rom name="stickybear bop.woz" size="234816" crc="78926254" sha1="f4e8b799ebb1e9cc32eee0237bef61791495d0ed" />
@@ -30103,11 +38557,12 @@ license:CC0-1.0
<description>Stickybear Drawing</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and David Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--graphics program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234824">
<rom name="stickybear drawing.woz" size="234824" crc="a537fe5f" sha1="124af416333cb7706909959e591a151b25d575be" />
@@ -30119,12 +38574,13 @@ license:CC0-1.0
<description>Stickybear Math (version 1984)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1984" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234803">
<rom name="stickybear math.woz" size="234803" crc="74126e08" sha1="b7539c900b4cdf79de4cfd1d64e03e35d2970ebc" />
@@ -30136,13 +38592,14 @@ license:CC0-1.0
<description>Stickybear Math (version 1988) (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1988" />
- <!--1988 re-release-->
+ <!-- 1988 re-release -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-13-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-13 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1302813">
<rom name="stickybear math 800k.woz" size="1302813" crc="93214eec" sha1="4dac3752e1575658fe0d10910a4a0f3ea8518af9" />
@@ -30154,12 +38611,13 @@ license:CC0-1.0
<description>Stickybear Math 2 (version 1986)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1986" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234805">
<rom name="stickybear math 2.woz" size="234805" crc="1651a9da" sha1="9f181479cc7a57ac54732a1d10a55d36c8ec01a0" />
@@ -30171,13 +38629,14 @@ license:CC0-1.0
<description>Stickybear Math 2 (version 1988) (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1988" />
- <!--1988 re-release-->
+ <!-- 1988 re-release -->
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-14-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-14 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1286445">
<rom name="stickybear math 2 800k.woz" size="1286445" crc="5c477869" sha1="fbf6e23ace6d2d039b299403ffd81b59ee74cd45" />
@@ -30189,11 +38648,12 @@ license:CC0-1.0
<description>Stickybear Music</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Program disk" />
<dataarea name="flop" size="234819">
@@ -30212,11 +38672,13 @@ license:CC0-1.0
<description>Stickybear Numbers</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington, and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234845">
<rom name="stickybear numbers.woz" size="234845" crc="28848249" sha1="a42a411fd900744f65646480e5584f641056b059" />
@@ -30228,12 +38690,14 @@ license:CC0-1.0
<description>Stickybear Opposites (1983 release)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1983" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--"educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- "educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234830">
<rom name="stickybear opposites.woz" size="234830" crc="5277091b" sha1="f5e7a9a10f5a5fb1980e28a8b52bbfe9bb886835" />
@@ -30243,15 +38707,17 @@ license:CC0-1.0
<software name="sboppod" cloneof="sboppo">
<description>Stickybear Opposites (demo)</description>
- <!--Self-running demo-->
+ <!-- Self-running demo -->
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="demo" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--"educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- "educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234846">
<rom name="stickybear opposites demo.woz" size="234846" crc="e8cce082" sha1="bce6f289199f3767e1ec294aa861f170276007ee" />
@@ -30263,12 +38729,14 @@ license:CC0-1.0
<description>Stickybear Opposites (version 1989) (800K 3.5")</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1989" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1300806">
<rom name="stickybear opposites 800k.woz" size="1300806" crc="884c1592" sha1="9ed4190274892efa75e7db4e11ba097913b7b43e" />
@@ -30280,11 +38748,13 @@ license:CC0-1.0
<description>Stickybear Parts of Speech</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Susan Dubicki, and Dave Cunningham" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
+ <info name="programmer" value="Dave Cunningham" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234830">
<rom name="stickybear parts of speech.woz" size="234830" crc="153eb443" sha1="e6f7663bf707764ebf5c3e8d1606d60243a98e0b" />
@@ -30296,12 +38766,13 @@ license:CC0-1.0
<description>Stickybear Printer (version 1)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--graphics program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234831">
<rom name="stickybear printer v1.woz" size="234831" crc="84a450f8" sha1="e7d35cf5ba39fe107cfafd09bf7bebdff3800a3c" />
@@ -30313,12 +38784,13 @@ license:CC0-1.0
<description>Stickybear Printer (version 2)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="2" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--graphics program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234813">
<rom name="stickybear printer v2.woz" size="234813" crc="06c886b3" sha1="8aff83e23257ac77c0d03bb1281db0ce55e7e43b" />
@@ -30332,8 +38804,8 @@ license:CC0-1.0
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234767">
<rom name="stickybear reading.woz" size="234767" crc="ec5545ca" sha1="60c572aa00c8dee9fc1e3ced76c0d7f459c8ed43" />
@@ -30347,8 +38819,8 @@ license:CC0-1.0
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234781">
<rom name="stickybear reading comprehension.woz" size="234781" crc="7541837e" sha1="cc79f0ff8bc14d2663be962bd2d14b2b7651267b" />
@@ -30360,13 +38832,14 @@ license:CC0-1.0
<description>Stickybear Shapes (version 1)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1" />
- <!--no mouse support-->
+ <!-- no mouse support -->
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234837">
<rom name="stickybear shapes v1.woz" size="234837" crc="f66af233" sha1="9e989e30c70c0ca75fc51b21ad0eeeaea3077ec8" />
@@ -30378,13 +38851,14 @@ license:CC0-1.0
<description>Stickybear Shapes (version 2)</description>
<year>1983</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="2" />
- <!--with mouse support-->
+ <!-- with mouse support -->
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234837">
<rom name="stickybear shapes v2.woz" size="234837" crc="45d3b88f" sha1="f48f8b50a15401723234ce410ec0e40e1fe6c955" />
@@ -30396,12 +38870,13 @@ license:CC0-1.0
<description>Stickybear Shapes (version 1989) (800K 3.5")</description>
<year>1989</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, Janie Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Janie Worthington" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1989" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296132">
<rom name="stickybear shapes 800k.woz" size="1296132" crc="20d3faac" sha1="59d9b510ddc55b9a91e44594d4b28be32cc3067e" />
@@ -30413,12 +38888,13 @@ license:CC0-1.0
<description>Stickybear Spellgrabber (version 1985)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1985" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234815">
<rom name="stickybear spellgrabber.woz" size="234815" crc="b941e64c" sha1="4ccddad6e6ebc70cf4614418f486a6d8da76203f" />
@@ -30430,12 +38906,13 @@ license:CC0-1.0
<description>Stickybear Spellgrabber (version 1988) (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Steve Worthington" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296138">
<rom name="stickybear spellgrabber 800k.woz" size="1296138" crc="65f668c4" sha1="87b89b0d11619d4d8f7e0578f56bc6b2cd3a5819" />
@@ -30447,12 +38924,13 @@ license:CC0-1.0
<description>Stickybear Town Builder (version 1984)</description>
<year>1984</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1984" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="228179">
<rom name="stickybear town builder.woz" size="228179" crc="e7e99d1b" sha1="6dc12387d2654e17be2a39e015905cc72586baeb" />
@@ -30464,12 +38942,13 @@ license:CC0-1.0
<description>Stickybear Town Builder (version 1988) (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Dave Lusby" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Dave Lusby" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1286448">
<rom name="stickybear town builder 800k.woz" size="1286448" crc="22df05ac" sha1="88e37f808dddcc70908767aee6a9ed3cd419ae82" />
@@ -30481,12 +38960,13 @@ license:CC0-1.0
<description>Stickybear Typing (version 1985)</description>
<year>1985</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="1985" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234805">
<rom name="stickybear typing.woz" size="234805" crc="e827a5b7" sha1="bc81b5ef10bf7c3ab9631d7194be4de33216ba46" />
@@ -30498,12 +38978,13 @@ license:CC0-1.0
<description>Stickybear Typing (version 1988) (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and Susan Dubicki" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="1988" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-15-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1297197">
<rom name="stickybear typing 800k.woz" size="1297197" crc="0a465825" sha1="a212e98ef52877c3bd45f239de64373b71f4579e" />
@@ -30515,12 +38996,13 @@ license:CC0-1.0
<description>Stickybear Word Problems (release 1)</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and V.R. Swami" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="V.R. Swami" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<info name="version" value="release 1" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234809">
<rom name="stickybear word problems.woz" size="234809" crc="167718ce" sha1="1dd4924e492483960c63985dbd33c367d4eb68e1" />
@@ -30532,12 +39014,13 @@ license:CC0-1.0
<description>Stickybear Word Problems (800K 3.5")</description>
<year>1986</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter and V.R. Swami" />
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="V.R. Swami" />
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<info name="version" value="800K" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1286447">
<rom name="stickybear word problems 800k.woz" size="1286447" crc="748bf613" sha1="6270753482549e68c1102ec1cd34cfc2c96f4fb1" />
@@ -30545,6 +39028,416 @@ license:CC0-1.0
</part>
</software>
+ <software name="stoichio">
+ <description>Stoichiometry</description>
+ <year>1983</year>
+ <publisher>Encyclopaedia Britannica Educational Corporation</publisher>
+ <info name="developer" value="J. Frazin and Partners" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234831">
+ <rom name="stoichiometry.woz" size="234831" crc="ebb12c17" sha1="97388f24e0da8a0d02d23f315bb2304f3783897f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="storysket">
+ <description>Story Sketcher (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MindPlay</publisher>
+ <info name="developer" value="Methods &amp; Solutions" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296140">
+ <rom name="story sketcher 800k.woz" size="1296140" crc="33c37884" sha1="83f15ee9a2fa0d3fb3597760776c1126afe2f548" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssscience">
+ <description>Story Starters: Science (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Pelican Software</publisher>
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="Kenneth Grey" />
+ <info name="programmer" value="Eileen Lumsden" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296155">
+ <rom name="story starters- science 800k.woz" size="1296155" crc="2d18a319" sha1="c53eb9c5f60e7175f2601eefe245d34dbb564e09" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sssocstud">
+ <description>Story Starters: Social Studies (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Pelican Software</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296162">
+ <rom name="story starters- social studies 800k.woz" size="1296162" crc="b1de0c6c" sha1="d8dc96b0948427dbdbe5cea04fcff197b0ac0795" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="strytree">
+ <description>Story Tree (version 1.4)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234795">
+ <rom name="story tree v1.4 disk 1 - program disk.woz" size="234795" crc="b4372e0c" sha1="11e29f022609674d1d246f2a65459eaecbb356ec" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Story" />
+ <dataarea name="flop" size="234793">
+ <rom name="story tree v1.4 disk 2 - story disk.woz" size="234793" crc="52b5da4b" sha1="d310db8f9d39dd181b4dd4ff6ac0a83bdd32d52f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssbaseb">
+ <description>Street Sports Baseball</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-26 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233452">
+ <rom name="street sports baseball.woz" size="233452" crc="91fb8f2d" sha1="475a27e9cef255d33e626123fd7445325fc641b6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssbasktbl">
+ <description>Street Sports Basketball</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-26 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233454">
+ <rom name="street sports basketball side a.woz" size="233454" crc="545abde9" sha1="3e2c0b7c2d9ef988610e8c6e97a31884f221b5ad" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233454">
+ <rom name="street sports basketball side b.woz" size="233454" crc="76728c7c" sha1="ed7157d4c8f6acf3925098c51afa647347c32453" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ssfootb">
+ <description>Street Sports Football</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Paul Nickels" />
+ <info name="programmer" value="Michael Polan" />
+ <info name="programmer" value="Kevin Quinlan" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-26 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233487">
+ <rom name="street sports football side a.woz" size="233487" crc="2590c882" sha1="6968accc3ad7f9468b703da0d5ac8ffd2372f334" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233487">
+ <rom name="street sports football side b.woz" size="233487" crc="86ef614b" sha1="7933f5410c3b26106ce59d307905a506105bf15f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sssoccer">
+ <description>Street Sports Soccer</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Paul Nickels" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-28 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233473">
+ <rom name="street sports soccer.woz" size="233473" crc="3bb31a45" sha1="e56adb5202d5bb24ab1bc86e86dd82b816a30379" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="strikefl">
+ <description>Strike Fleet</description>
+ <year>1987</year>
+ <publisher>Adventure International</publisher>
+ <info name="developer" value="Lucasfilm Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-21 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="234820">
+ <rom name="strike fleet side a - program.woz" size="234820" crc="cebc71c8" sha1="9b6e338163968b17f9e8c0c487de85c2c5aed9a8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenarios" />
+ <dataarea name="flop" size="234789">
+ <rom name="strike fleet side b - scenarios.woz" size="234789" crc="8a1cd928" sha1="ba4348d2b76b2895b0a1dd17e9aeb01a968bc6a6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="studygui">
+ <description>Study Guide (A-126 version 1.5)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-126" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="241442">
+ <rom name="study guide v1.5 disk 1 - program.woz" size="241442" crc="df0ee4ff" sha1="33bded9178a6364841753f6bc32651468bb2e393" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data master" />
+ <dataarea name="flop" size="241442">
+ <rom name="study guide v1.5 disk 2 - data master.woz" size="241442" crc="12ede32a" sha1="78f1f86b7c9d4c2d20047cb3017f05e5f76b35bf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="subbatl">
+ <description>Sub Battle Simulator</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Digital Illusions" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-11-28 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233456">
+ <rom name="sub battle simulator side a.woz" size="233456" crc="965de0dd" sha1="365a37e90b7ff8fdd1a00100eadac87b129ec803" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233456">
+ <rom name="sub battle simulator side b.woz" size="233456" crc="fdb27602" sha1="c3a26c99012c8c223d461058d5b1177b477219a3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="submissn">
+ <description>Sub Mission</description>
+ <year>1987</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-04 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234804">
+ <rom name="sub mission.woz" size="234804" crc="a028902c" sha1="9805fe623de40e0d6d39a9aad4abcc2024bf4572" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sumducks">
+ <description>Sum Ducks</description>
+ <year>1984</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="programmer" value="Barbara Jasinki" />
+ <info name="programmer" value="Diane Downie" />
+ <info name="programmer" value="Mark Ravitz" />
+ <info name="programmer" value="Bryan Moss" />
+ <info name="programmer" value="Marge Boots" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Sum ducks" />
+ <dataarea name="flop" size="234819">
+ <rom name="sum ducks side a - sum ducks.woz" size="234819" crc="9aafb00c" sha1="f446442fcb70bed23a038f2030316c1859eefeaa" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Prime ducks" />
+ <dataarea name="flop" size="234821">
+ <rom name="sum ducks side b - prime ducks.woz" size="234821" crc="d2bfc405" sha1="5e536e88675e4ec4e8d084e8268ea4acbb42c478" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sumstories">
+ <description>Sum Stories (A-344 version 1.0) (800K 3.5")</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-344" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Korey Schulz" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296215">
+ <rom name="sum stories 800k.woz" size="1296215" crc="a0321385" sha1="c8498d6c964ccc754ace55ff9b7100cced0f493e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sumrgame">
+ <description>Summer Games</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Scott Nelson" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="Erin Murphy" />
+ <info name="programmer" value="Jon Leupp" />
+ <info name="programmer" value="Stephen Mudry" />
+ <info name="programmer" value="Randy Glover" />
+ <info name="programmer" value="Brian McGhie" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Kevin McClard" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-17 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233577">
+ <rom name="summer games side a.woz" size="233577" crc="6b4b20cb" sha1="2d57b25187d3eac6099dea3b1456b406a308f4a2" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233577">
+ <rom name="summer games side b.woz" size="233577" crc="95f1a4a3" sha1="e7a4c18a0e59b9ea512c56b727f08c417d654164" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sumrgame2">
+ <description>Summer Games II</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="John Leupp" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="programmer" value="Larry Clague" />
+ <info name="programmer" value="Scott Nelson" />
+ <!-- see #14146 below marked as "ported to the Apple ][ by" -->
+ <info name="programmer" value="John Stouffer" />
+ <info name="programmer" value="Jeff Webb" />
+ <info name="programmer" value="Doug Matson" />
+ <info name="programmer" value="Greg Broniak" />
+ <info name="programmer" value="Tim Grost" />
+ <info name="programmer" value="Matt Decker" />
+ <info name="programmer" value="Vera Petrusha" />
+ <info name="programmer" value="Ken Evans" />
+ <info name="programmer" value="Dr. Keith Dreyer" />
+ <info name="programmer" value="Chris Oesterling" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-25 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234963">
+ <rom name="summer games ii side a.woz" size="234963" crc="f42076b9" sha1="38aeed0677d67a34844b29b76d2cd4211df8c479" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234963">
+ <rom name="summer games ii side b.woz" size="234963" crc="76abeacd" sha1="a49c9e066bc164f6d3af5e355b30fbfbb5b31ea6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprearc">
+ <description>Super Ear Challenger (version 1984)</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="alt_title" value="Super Challenger" />
+ <info name="programmer" value="Stephen L. Walker" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- The 1984 version does not use MIDI, but the 1985 version requires it. -->
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="super challenger.woz" size="234784" crc="6dc303b1" sha1="614a331f335e302d63bcc867154f740b272057cc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sgalwars">
+ <description>Super Galaxy Wars</description>
+ <year>1980</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="StarCraft" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-21 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="68395">
+ <rom name="super galaxy wars.woz" size="68395" crc="18494bf7" sha1="1ebddec2b4db6c1c0beeba18954ccbd7ad618dfe" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="spasswrd">
<description>Super Password</description>
<year>1988</year>
@@ -30552,8 +39445,8 @@ license:CC0-1.0
<info name="developer" value="Softie, Inc." />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234751">
@@ -30568,15 +39461,124 @@ license:CC0-1.0
</part>
</software>
+ <software name="ssgrchts">
+ <description>Super Science Graph and Charts: Health and Human Body</description>
+ <year>1990</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Andrew Kaplan" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234815">
+ <rom name="super science graphs and charts- health and the human body side a.woz" size="234815" crc="b04b703c" sha1="96b93a047809380f96b92c30d0712b4a22850607" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234784">
+ <rom name="super science graphs and charts- health and the human body side b.woz" size="234784" crc="4a8cf445" sha1="c55d5f730f057c922e26d16b5c8f21c2e4c49dc3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sstorytree">
+ <description>Super Story Tree (version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="George Brackett" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-11 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1312530">
+ <rom name="super story tree 800k.woz" size="1312530" crc="782dc19e" sha1="276c3db1789b4331d3c1ce73df0842dc6b9c19d4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sgraph">
+ <description>SuperGraph</description>
+ <year>1986</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234788">
+ <rom name="supergraph disk 1 - program disk.woz" size="234788" crc="53566b2f" sha1="03c87793b67cd5d1866a49ccb17767506b680a0e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data" />
+ <dataarea name="flop" size="234785">
+ <rom name="supergraph disk 2 - data disk.woz" size="234785" crc="40d53d2f" sha1="ffe8cdb395365aa393c51b68b846d7305abb6f34" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprprnt">
+ <description>SuperPrint! (version 1.4) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="David Shearer" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-07 redumped: 2021-12-14 to fix incorrect header information -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296709">
+ <rom name="superprint 800k.woz" size="1296709" crc="aa173e19" sha1="50666697478bbfb7b80819fbc6b368c1111eb3ad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprprii">
+ <description>SuperPrint! II: Next Generation (version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="programmer" value="Joel Fried" />
+ <info name="programmer" value="Susan Swanson" />
+ <info name="programmer" value="Ken Grey" />
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Kim Looney" />
+ <info name="programmer" value="David Shearer" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296289">
+ <rom name="superprint ii 800k.woz" size="1296289" crc="6e4761ec" sha1="e5b0e2c187b0d46a0738f5c325951f3a0529892e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ssicehock">
<description>Superstar Ice Hockey</description>
<year>1988</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Jim Karaganis and Jerry Karaganis" />
+ <info name="programmer" value="Jim Karaganis" />
+ <info name="programmer" value="Jerry Karaganis" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--sports game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- sports game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234812">
@@ -30591,6 +39593,857 @@ license:CC0-1.0
</part>
</software>
+ <software name="survmath">
+ <description>Survival Math (version 2.0)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Walter Koetke" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234814">
+ <rom name="survival math.woz" size="234814" crc="6d646e06" sha1="1d1ec8b1f67e8835f36c44fe8bacb0cfa2d3a1df" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swfrobin">
+ <description>Swiss Family Robinson</description>
+ <year>1984</year>
+ <publisher>Windham Classics</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-09-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="253471">
+ <rom name="swiss family robinson.woz" size="253471" crc="7615c53b" sha1="9c33e686c69522bfe434ac0510bdaed0846b4963" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="swdkadash">
+ <description>Sword of Kadash</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Chris Cole" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="121635">
+ <rom name="sword of kadash side a - program disk.woz" size="121635" crc="85778566" sha1="3b2264eb2cb0d5ba481a64f7573131d093702640" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Character" />
+ <dataarea name="flop" size="234821">
+ <rom name="sword of kadash side b - character disk.woz" size="234821" crc="50413b71" sha1="8e01d4eb0d693e0a42d5e6bf4c9e59c5d9273355" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="symbsets">
+ <description>Symbols and Sets (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234767">
+ <rom name="symbols and sets 1988.woz" size="234767" crc="20f37ec2" sha1="f86bfd73e547686e74e5cd92a98b6824414808cb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="take106431" cloneof="take1">
+ <description>Take 1 (version 06431)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Maurizio Barbatano" />
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="06431" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="06431" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-07-06 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="take 1 v06431.woz" size="234763" crc="cd217a33" sha1="b94f01a7e68ca9b2d2d826c4f4a061001d10b003" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="take1">
+ <description>Take 1 (version 06451)</description>
+ <year>1984</year>
+ <publisher>Baudville</publisher>
+ <info name="author" value="Maurizio Barbatano" />
+ <info name="author" value="Michael Darooge" />
+ <info name="partno" value="06451" />
+ <info name="programmer" value="Edward McCullough" />
+ <info name="programmer" value="David Walker" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="06451" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2014-08-20 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234763">
+ <rom name="take 1 v06451.woz" size="234763" crc="cd710df8" sha1="bb0b2cd4f9a58e90ba8cae3544c387c67c5a1a4c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="take1al1">
+ <description>Take 1 Animation Library #1: Actors &amp; Actions</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-30 -->
+ <!-- graphics program add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="take 1 animation library 1- actors and actions.woz" size="234821" crc="c24a52fd" sha1="85f8cf30813a128c11caada6773f9e3ec1551bba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="take1al2">
+ <description>Take 1 Animation Library #2: Heroes &amp; Villains</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-30 -->
+ <!-- graphics program add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234822">
+ <rom name="take 1 animation library 2- heroes and villains.woz" size="234822" crc="9be604e0" sha1="6fdaeef2fa77b90fc460b909394146a63fd190a4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="take1al3">
+ <description>Take 1 Animation Library #3: Business</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-30 -->
+ <!-- graphics program add-on -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234813">
+ <rom name="take 1 animation library 3- business side a.woz" size="234813" crc="87d1937c" sha1="6a1fec8dba637a42502cfca55433c35e1f6dd6c7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234813">
+ <rom name="take 1 animation library 3- business side b.woz" size="234813" crc="002969eb" sha1="936907888477c33c1230986bc8bb2ae3f0fa41b0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="take1ptkit">
+ <description>Take 1 Programmer's Toolkit (version 10601-0000)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="developer" value="Baudville" />
+ <info name="partno" value="10601" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="10601-0000" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-30 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234814">
+ <rom name="take 1 programmer's toolkit.woz" size="234814" crc="0dc8120b" sha1="beab1d5450b97574450d05d2096b15e704eef668" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tkchance_525" cloneof="tkchance">
+ <description>Take a Chance! (A-317 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-317" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234846">
+ <rom name="take a chance.woz" size="234846" crc="aa2143da" sha1="fdf4cf678b2b5ab8f6a0195929b33653f021eb77" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tkchance">
+ <description>Take a Chance! (A-317 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-317" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="John Persoon" />
+ <info name="programmer" value="Shari Zehm" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345391">
+ <rom name="take a chance 800k.woz" size="1345391" crc="faad6e48" sha1="3ba61ce9b69a9a21c9c3df514b7126662816fd63" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tchances">
+ <description>Taking Chances</description>
+ <year>1991</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Gail Marshall" />
+ <info name="programmer" value="David Findley" />
+ <info name="programmer" value="Steve Bunton" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234819">
+ <rom name="taking chances.woz" size="234819" crc="7dec429e" sha1="8af69831c269caed6133bcf2fa6d3a6f533d87d7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talehist">
+ <description>Tales from History</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Deborah Gore" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - The Shot Heard 'Round the World"/>
+ <dataarea name="flop" size="234791">
+ <rom name="tales from history side a.woz" size="234791" crc="1131e6a0" sha1="8f3e0fd6da5803b275d25e2351d9fb4858bde4dd" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Wagons West"/>
+ <dataarea name="flop" size="234791">
+ <rom name="tales from history side b.woz" size="234791" crc="46d9d1d3" sha1="01c431afcb82787efbc3f46726e139e94b9e2482" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="taledisc">
+ <description>Tales of Discovery</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Amy McKinley" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Loretta Jones" />
+ <info name="programmer" value="Maryellen Kohn" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="programmer" value="Andrew Ragan" />
+ <info name="programmer" value="Susan Edwards" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Pirates of the Soft Seas" />
+ <dataarea name="flop" size="228220">
+ <rom name="tales of discovery side a.woz" size="228220" crc="c4caa032" sha1="bb3e054425b6cd0a14c21515df948aa45b633107" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Fossils Alive!" />
+ <dataarea name="flop" size="234876">
+ <rom name="tales of discovery side b.woz" size="234876" crc="ed0f7ba9" sha1="50e214cd2619b279d7082c9ef13b8516698659b6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talefant">
+ <description>Tales of Fantasy</description>
+ <year>1987</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="David A. Bowman" />
+ <info name="programmer" value="Mark A. Malamud" />
+ <info name="programmer" value="Jeffrey Siegel" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - The Dark Tower" />
+ <dataarea name="flop" size="234813">
+ <rom name="tales of fantasy side a.woz" size="234813" crc="1a7ff872" sha1="5f4052e48199722ca63011745b0bd774f3df2366" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - The Frog and the Fables" />
+ <dataarea name="flop" size="234813">
+ <rom name="tales of fantasy side b.woz" size="234813" crc="7afcccc3" sha1="632e926741871c4334b1685f1a41b976fea462d1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talemyst">
+ <description>Tales of Mystery</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="programmer" value="David G. Olmon" />
+ <info name="programmer" value="Dan Klassen" />
+ <info name="programmer" value="Michael Callery" />
+ <info name="programmer" value="Ame C. Flynn" />
+ <info name="programmer" value="Lorene Lovara" />
+ <info name="programmer" value="Steve Sullivan" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Haunted House" />
+ <dataarea name="flop" size="234918">
+ <rom name="tales of mystery side a.woz" size="234918" crc="fc7ba292" sha1="fe2c3429231e8d330106137a56f29416c4c38b77" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Mystery at Pinecrest Manor" />
+ <dataarea name="flop" size="234918">
+ <rom name="tales of mystery side b.woz" size="234918" crc="ea27dfc9" sha1="f6d89eb81b6c59b6b5d79748526cfa76b962c27e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talisman">
+ <description>Talisman: Challenging the Sands of Time</description>
+ <year>1987</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Bruce X. Hoffman" />
+ <info name="programmer" value="Ray Redlich" />
+ <info name="programmer" value="Brian Poff" />
+ <info name="programmer" value="Jeffrey A. Jay" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-04 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1 - Boot" />
+ <dataarea name="flop" size="234815">
+ <rom name="talisman- challenging the sands of time side 1 - boot.woz" size="234815" crc="e47a66c5" sha1="e56c9dc88165b4cd58d44c2c9694d08dc9cd6e9e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - Empire" />
+ <dataarea name="flop" size="234817">
+ <rom name="talisman- challenging the sands of time side 2 - empire.woz" size="234817" crc="2c5ae431" sha1="4fd8539305078c031b693aff3b4fe1a98f26b98b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3 - Lands beyond" />
+ <dataarea name="flop" size="234823">
+ <rom name="talisman- challenging the sands of time side 3 - lands beyond.woz" size="234823" crc="c96710c0" sha1="02767ab4644eb85b596f86df38283ced772ec1fa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tantales">
+ <description>Tangled Tales</description>
+ <year>1989</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Gary Scott Smith" />
+ <info name="programmer" value="Glen Johnson" />
+ <info name="programmer" value="Daniel Bourbonnais" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-11-25 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Boot" />
+ <dataarea name="flop" size="234868">
+ <rom name="tangled tales disk 1a - boot.woz" size="234868" crc="079c0226" sha1="505a512df0a5f36115cd2eac0d092bd9a5d7518c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Adventure 3" />
+ <dataarea name="flop" size="234868">
+ <rom name="tangled tales disk 1b - adventure 3.woz" size="234868" crc="cd208f55" sha1="8b1fc202a9878fc0c7e5f356d78b270891a416c8" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Adventure 1" />
+ <dataarea name="flop" size="234868">
+ <rom name="tangled tales disk 2a - adventure 1.woz" size="234868" crc="1fbdee91" sha1="813f0033b3242387542caab350dc687c57764333" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Adventure 2" />
+ <dataarea name="flop" size="234868">
+ <rom name="tangled tales disk 2b - adventure 2.woz" size="234868" crc="c03b8ec4" sha1="ebaf93937fd0dae6a85ea410fc9547aa82867a6c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tnkadthr">
+ <description>Tank Attack &amp; Death Run</description>
+ <year>1980</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="developer" value="The SoftWizard" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234809">
+ <rom name="tank attack and death run.woz" size="234809" crc="a7505c94" sha1="b8257055b6a0be9851a65bc5b3f89a58ff912c60" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tankcomm">
+ <description>Tank Command</description>
+ <year>1980</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Don Carlston" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="tank command.woz" size="234801" crc="ba81bc2a" sha1="0972d2ce56bb08821de2a9fbebd3ab1fa1ab5b80" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tapit">
+ <description>Tap-It</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="G. David Peters" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="tap-it.woz" size="234775" crc="c85aec25" sha1="11f5b747edf2b9e7870bcae58daa8e73358b81c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgtang">
+ <description>Targets: A Numbers Game</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="T.C. O'Brien II" />
+ <info name="programmer" value="Andrew Lorenz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="targets- a numbers game.woz" size="234836" crc="343980eb" sha1="7d45fbc51a115319dedb3c560e470ecfe3da1c02" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tredoubt">
+ <description>Tawala's Last Redoubt</description>
+ <year>1981</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Doug Carlston" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-09-05 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235494">
+ <rom name="tawala's last redoubt.woz" size="235494" crc="ade2db41" sha1="7c644a56c710fecd902f75d5a4e32dd3c7176825" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor10" cloneof="teachopor12">
+ <description>Teacher Option Organizer (A-242 version 1.0) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345384">
+ <rom name="teacher option organizer v1.0 800k.woz" size="1345384" crc="4334a66d" sha1="24e4203c61d1993884e5aa2bd4ac89562bfcbe62" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor11_525" cloneof="teachopor12">
+ <description>Teacher Option Organizer (A-242 version 1.1)</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234869">
+ <rom name="teacher option organizer v1.1.woz" size="234869" crc="d178180a" sha1="e220ff8120f67613d169cf18b705b37e108a592c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor11" cloneof="teachopor12">
+ <description>Teacher Option Organizer (A-242 version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345408">
+ <rom name="teacher option organizer 800k.woz" size="1345408" crc="d76c2abc" sha1="3c9bf5235256504b613a1e25bcc8fb72503a0747" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachopor12">
+ <description>Teacher Option Organizer (A-242 version 1.2) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-242" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="programmer" value="Larry Phenow" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Jim Thompson" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345384">
+ <rom name="teacher option organizer v1.2 800k.woz" size="1345384" crc="e433b683" sha1="829d9afb11ef452bfec94a330d6343462af86598" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachsci_525" cloneof="teachsci">
+ <description>Teaching Scientific Inquiry with Computers (T-638 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="T-638" />
+ <info name="partno" value="T-638" />
+ <info name="usage" value="Requires a 128K Apple //e or later and AppleWorks office suite." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234800">
+ <rom name="teaching scientific inquiry v1.0.woz" size="234800" crc="0056061a" sha1="7b625dbec398211d39c34ff2b2a0495d5d891ba0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teachsci">
+ <description>Teaching Scientific Inquiry with Computers (T-638 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="T-638" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card and AppleWorks office suite." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345340">
+ <rom name="teaching scientific inquiry with computers v1.0 800k.woz" size="1345340" crc="72c850ce" sha1="f8b3dce2fcfa7cd69b70006f6397e9e7d270aa82" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tvocscih">
+ <description>TEAM Vocabulary: Science and Health (version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="L. House" />
+ <info name="programmer" value="F. Schwartz" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296273">
+ <rom name="vocabulary science and health 800k.woz" size="1296273" crc="26f62b7f" sha1="3aeaa6a076e7da6c0679ca11c37cf5c4fd4e8c2e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tbtpapsol">
+ <description>Teasers by Tobbs: Puzzles and Problem Solving (version 1.3)</description>
+ <year>1982</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234852">
+ <rom name="teasers by tobbs- puzzles and problem solving.woz" size="234852" crc="ec73b80b" sha1="b8213f89a886d23f12b9d94190f82f4eae1b73ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tbtwholnum">
+ <description>Teasers by Tobbs: Whole Numbers</description>
+ <year>1990</year>
+ <publisher>WINGS for learning</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="James Kim" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234812">
+ <rom name="teasers by tobbs- whole numbers.woz" size="234812" crc="06324eed" sha1="26b7aab3e0eddbd2bee5e79d032b1dc775ee35cf" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tdyniggy">
+ <description>Teddy and Iggy (version 30-JUN-1989)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Dara P. Meas" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="30-JUN-1989" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="teddy and iggy 1989.woz" size="234801" crc="70faf187" sha1="a397ad4585a9e8b39625bd6ca22d9702f638f986" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tedbearl">
+ <description>Teddy Bear-rels of Fun</description>
+ <year>1987</year>
+ <publisher>Developmental Learning Materials (DLM)</publisher>
+ <info name="developer" value="Ahead Designs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-16 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234804">
+ <rom name="teddy bearrels of fun disk 1.woz" size="234804" crc="1db43182" sha1="f24af8dfab4aef0100860d31b22582b04333be39" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234804">
+ <rom name="teddy bearrels of fun disk 2.woz" size="234804" crc="a7c043f3" sha1="0aff950e9955a5412a3a53ee6872eb6b4c382d85" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teddypg">
+ <description>Teddy's Playground (version 1989)</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="teddy's playground 1989.woz" size="234815" crc="3adfcaa3" sha1="852e2457948c44681c5e3b598166ce410e3f7b51" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tenclues">
+ <description>Ten Clues</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Wood" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="ten clues.woz" size="234796" crc="8b32d377" sha1="a370910a23961dd66844ac3e7b1bb48f3bf9b3fd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tetrad">
+ <description>Tetrad</description>
+ <year>1981</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Phillip Hess" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-24 -->
+ <!-- board game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234762">
+ <rom name="tetrad.woz" size="234762" crc="80ede3c9" sha1="ea1ae9b469e4bce84af5b69cf3ceb4ed60cc31b1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="plyrdmus">
+ <description>The 21st Century Music Series: Playing and Reading Music</description>
+ <year>1987</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Vincent Oddo" />
+ <info name="programmer" value="Henry Levy" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later and a compatible MIDI peripheral card in slot 2." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl2_default" value="midi" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234837">
+ <rom name="playing and reading music disk 1.woz" size="234837" crc="8d38d365" sha1="3a405635543e5ce974771cb83dac8a80cbe7fd77" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234837">
+ <rom name="playing and reading music disk 2.woz" size="234837" crc="459d4c9e" sha1="124d26228329784df05365bf9242bcd948ad69f4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234837">
+ <rom name="playing and reading music disk 3.woz" size="234837" crc="fa3d06e3" sha1="c47bd54cf86da12aabc0d8975a0b6442d08ce36a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Supplemental Songs" />
+ <dataarea name="flop" size="234837">
+ <rom name="playing and reading music disk 4 - song disk.woz" size="234837" crc="a6411b77" sha1="363318a73cb6a5a7dd3d9dcbf7cb600fdd8746ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="buckbanz">
+ <description>The Adventures of Buckaroo Banzai: Across The 8th Dimension! (version G 397)</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Phillip Case" />
+ <info name="programmer" value="Mak Jukic" />
+ <info name="programmer" value="Scott Adams" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="G 397" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- This dump came boxed and shrink-wrapped with manual and paperwork. Due to a mnaufacturing defect, the protection track (0x22) on Side B was blank. This track has been restored using the protection track from Questprobe featuring Spider-man. -->
+ <!-- Dump released: 2026-01-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234903">
+ <rom name="the adventures of buckaroo banzai across the 8th dimension side a.woz" size="234903" crc="f67180b0" sha1="a703c925988fd074f56aeed65d808c87984f2873" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234903">
+ <rom name="the adventures of buckaroo banzai across the 8th dimension side b.woz" size="234903" crc="9163a8b6" sha1="cd65fa03dc1278c20cf994247774883eee2cbcc9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="anfamfeud">
<description>The All New Family Feud</description>
<year>1989</year>
@@ -30598,8 +40451,8 @@ license:CC0-1.0
<info name="programmer" value="John Dunn" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234790">
@@ -30614,15 +40467,594 @@ license:CC0-1.0
</part>
</software>
+ <software name="alpenctr">
+ <description>The Alpine Encounter</description>
+ <year>1993</year>
+ <publisher>Random House</publisher>
+ <info name="programmer" value="Carol Anderson" />
+ <info name="programmer" value="Michael Feldman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234802">
+ <rom name="the alpine encounter side a.woz" size="234802" crc="1c919d52" sha1="3b0b47c40b52f3d4d501564145bc6b56b02d7b02" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234802">
+ <rom name="the alpine encounter side b.woz" size="234802" crc="21f25d7c" sha1="aecb717cd980a5a63a0252d194d303c9d2836f1f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amchal">
+ <description>The American Challenge: A Sailing Simulation</description>
+ <year>1986</year>
+ <publisher>Mindscape</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-15 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234809">
+ <rom name="the american challenge.woz" size="234809" crc="f0bdf5e3" sha1="09c72b7a4b79a4fe59601dfc58db1db740aa8eb5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="artowar">
+ <description>The Ancient Art of War (version 1989)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Murray" />
+ <info name="programmer" value="Barry Murray" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1989" />
+ <!-- 1989 re-release -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-18 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234786">
+ <rom name="the ancient art of war side a.woz" size="234786" crc="eeb41109" sha1="d3310c0abb88c1c51df4982eeb6c32f2844f2a77" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234786">
+ <rom name="the ancient art of war side b.woz" size="234786" crc="86261140" sha1="6e5e4a0b030f83ecd0f0939b166a0b9ff57e8e0a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aawarsea">
+ <description>The Ancient Art of War at Sea</description>
+ <year>1988</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Murray" />
+ <info name="programmer" value="Barry Murray" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-20 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235525">
+ <rom name="the ancient art of war at sea side a.woz" size="235525" crc="d2181caa" sha1="ffb7ccf58782e8427df325715c34fe24d91a0370" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235525">
+ <rom name="the ancient art of war at sea side b.woz" size="235525" crc="b75132a1" sha1="23ded0c791a7387535d2dd1aa296e76f4f2353dd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcmachn">
+ <description>The Arcade Machine</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Chris Jochumson" />
+ <info name="programmer" value="Doug Carlston" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-16 -->
+ <!-- game development environment -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="327972">
+ <rom name="the arcade machine side a.woz" size="327972" crc="2734531d" sha1="ba2a60fc646710f4d5d1cf46a6bd8f22a0828fab" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234642">
+ <rom name="the arcade machine side b.woz" size="234642" crc="ffa3c0a0" sha1="8ebb8f3d339ee0767eee306db63b80eccdc11941" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bsspell">
+ <description>The Bank Street Speller</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Sensible Software" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="128359">
+ <rom name="the bank street speller side a - program.woz" size="128359" crc="6fba23ae" sha1="f1d28ed040f5a25aed3c05f936a10975d9c8d2bc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Dictionary" />
+ <dataarea name="flop" size="234809">
+ <rom name="the bank street speller side b - dictionary.woz" size="234809" crc="7a00ae9a" sha1="b342c831e56d9414cba2f13dcf14777e3ebbfdad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bsw">
+ <description>The Bank Street Writer (version 1.3)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later with Applesoft in ROM." />
+ <info name="version" value="1.3" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234847">
+ <rom name="the bank street writer v1.3.woz" size="234847" crc="b5053ea1" sha1="ae135c5473a2bd0e6a6602db850c39520f52ae66" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswtut10" cloneof="bswtut">
+ <description>The Bank Street Writer Tutorial (version 1.0)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234835">
+ <rom name="the bank street writer tutorial v1.0.woz" size="234835" crc="b767b5e1" sha1="52739f6eda3e9b72b13568c8815979e1a5baa562" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswtut">
+ <description>The Bank Street Writer Tutorial (version 1.1 1982-12-13)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1 1982-12-13" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234817">
+ <rom name="the bank street writer tutorial v1.1.woz" size="234817" crc="923f1edd" sha1="a8a78b08d4c2e55891b0e4642b508b66fc221ea8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswenh">
+ <description>The Bank Street Writer Enhanced (version 2.6)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="2.6" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234845">
+ <rom name="the bank street writer enhanced v2.6.woz" size="234845" crc="983e9ba9" sha1="ac6111b22521a52d840cf829cc9cfa3b4a39191f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswenhtutiip">
+ <description>The Bank Street Writer Enhanced Tutorial for ][+</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 64K Apple ][+ and intentionally refuses to run on later models." />
+ <sharedfeat name="compatibility" value="A2P" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234809">
+ <rom name="the bank street writer enhanced tutorial for ii plus.woz" size="234809" crc="11ebea7b" sha1="0533cc035e8a66ca3c1ccd0008c09e611f824e8a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswenhtutiie">
+ <description>The Bank Street Writer Enhanced Tutorial for IIe</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234847">
+ <rom name="the bank street writer enhanced tutorial for iie.woz" size="234847" crc="8f14f5e4" sha1="e22901dd06496a43b45332515d701f798fd68e23" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswexp">
+ <description>The Bank Street Writer Expanded (version 2.2)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234828">
+ <rom name="the bank street writer expanded v2.2.woz" size="234828" crc="77c628b3" sha1="978b3d578e306643b4922705f017cd4eaac1e125" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswexptut">
+ <description>The Bank Street Writer Expanded Tutorial (version 2.2)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <info name="version" value="2.2" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234815">
+ <rom name="the bank street writer expanded tutorial.woz" size="234815" crc="dedd1081" sha1="666effe8ec65640b4fd91dd09ab810e3c2ed17ab" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiic21r1" cloneof="bswiic">
+ <description>The Bank Street Writer IIc (version 2.1 revision 1)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.1 revision 1" />
+ <!-- Another version 2.1 disk has been found with small code changes. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234833">
+ <rom name="the bank street writer iic v2.1 rev. 1.woz" size="234833" crc="6369ef79" sha1="201c740331c05151809a73464e62109aca7ae169" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiic21r2" cloneof="bswiic">
+ <description>The Bank Street Writer IIc (version 2.1 revision 2)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.1 revision 2" />
+ <!-- Another version 2.1 disk has been found with small code changes. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234857">
+ <rom name="bank street writer iic v2.1 rev. 2.woz" size="234857" crc="7697dcee" sha1="a05c382f50bc90a5d29c07ac2f62b9643f810337" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiic">
+ <description>The Bank Street Writer IIc (version 2.11)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="2.11" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234808">
+ <rom name="the bank street writer iic v2.11.woz" size="234808" crc="05dbb165" sha1="2807b3ddb091da5c4493f654fd10ffea2411d99f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiictut">
+ <description>The Bank Street Writer IIc Tutorial (version 1984-06-27)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gene Kusmiak" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1984-06-27" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-13 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234839">
+ <rom name="the bank street writer iic tutorial.woz" size="234839" crc="3eedfd15" sha1="cc7ec6d550112284c1307eb73781784bb5227e9b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiii11" cloneof="bswiii">
+ <description>The Bank Street Writer III (version 1.1)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program (40-80 columns)" />
+ <dataarea name="flop" size="241488">
+ <rom name="the bank street writer iii v1.1 40-80-column program.woz" size="241488" crc="065c22e9" sha1="cc90cc19252405e852431755cc36d94d23f562ff" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Program (20 columns)" />
+ <dataarea name="flop" size="241997">
+ <rom name="the bank street writer iii v1.1 20-column program.woz" size="241997" crc="d92c6733" sha1="b3f08d51b4dadea8cb1bd8d2bf2ff915507b2634" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Teacher Tools" />
+ <dataarea name="flop" size="241481">
+ <rom name="the bank street writer iii v1.1 teacher tools.woz" size="241481" crc="d9fa61b9" sha1="06775ce3d36d71745055ab421912bbe8ca6d68bd" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Dictionary" />
+ <dataarea name="flop" size="208225">
+ <rom name="the bank street writer iii v1.1 dictionary.woz" size="208225" crc="51233670" sha1="0cf80789042ba2715aa693ad353ec0d9b6bb0c4c" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 - Thesaurus" />
+ <dataarea name="flop" size="234848">
+ <rom name="the bank street writer iii v1.1 thesaurus.woz" size="234848" crc="a5bc7bef" sha1="2607a5ae5442a88518f4a9e6d6c78ace01d4c99c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bnksw320c35" cloneof="bswiii">
+ <description>The Bank Street Writer III (20-Column and Teacher Tools) (version 1.21) (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.21" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-09 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296683">
+ <rom name="the bank street writer iii 800k.woz" size="1296683" crc="c49de32c" sha1="e6617380de897d8f74e0724e004cf5850e697860" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiii">
+ <description>The Bank Street Writer III (version 1.4)</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program (40-80 columns)" />
+ <dataarea name="flop" size="234862">
+ <rom name="the bank street writer iii v1.4 - program (40-80 columns).woz" size="234862" crc="850bbab7" sha1="748f8bc7db9cc1feac19d42e49f9a6ae6eec774f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Program (20 columns)" />
+ <dataarea name="flop" size="234859">
+ <rom name="the bank street writer iii v1.41 - program (20 columns).woz" size="234859" crc="6645c5db" sha1="6659970bfc75ea1d7d7a1740f218bc0e73a3f917" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Teacher Tools" />
+ <dataarea name="flop" size="234852">
+ <rom name="the bank street writer iii v1.4 - teacher tools.woz" size="234852" crc="a0c7cd47" sha1="20e58fdbba3d001517ca03a6cceb0c1ffed7605c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiiitut11" cloneof="bswiiitut">
+ <description>The Bank Street Writer III Tutorial (version 1.1)</description>
+ <year>1986</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241466">
+ <rom name="the bank street writer iii v1.1 tutorial.woz" size="241466" crc="10290939" sha1="bd05197da074f452c0350bb432faa63452e713be" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswiiitut">
+ <description>The Bank Street Writer III Tutorial (version 1.4)</description>
+ <year>1989</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Brøderbund Software" />
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="the bank street writer iii v1.4 tutorial.woz" size="234794" crc="9859a6a1" sha1="f6832f12019b871da502f8fe874fed7bad0b119d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswplus11" cloneof="bswplus">
+ <description>The Bank Street Writer Plus (version 1.1)</description>
+ <year>1986</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234829">
+ <rom name="the bank street writer plus v1.1 disk 1 - program.woz" size="234829" crc="2954b510" sha1="d440d2904a1872bad6ca66f6febd58345090155f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Dictionary" />
+ <dataarea name="flop" size="234835">
+ <rom name="the bank street writer plus v1.1 disk 2a - dictionary.woz" size="234835" crc="5efefa9e" sha1="15f092bb6b7bae0b7c0a55b2d21b3aba15c646b8" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Thesaurus" />
+ <dataarea name="flop" size="234831">
+ <rom name="the bank street writer plus v1.1 disk 2b - thesaurus.woz" size="234831" crc="74a27253" sha1="007ec0ad37c06015e7d09abc9ae5971f3f62d116" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswplus14" cloneof="bswplus">
+ <description>The Bank Street Writer Plus (version 1.4)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234814">
+ <rom name="the bank street writer plus v1.4.woz" size="234814" crc="1cf8e83d" sha1="3578b3f333fed7de4b7a41df63ce7dcb23cf8817" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswplus">
+ <description>The Bank Street Writer Plus (version 1.4) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-25 Redumped: 2021-12-14 to fix incorrect header information. -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296168">
+ <rom name="bank street writer plus 800k.woz" size="1296168" crc="731364bd" sha1="d7e9d1e9c777b8123c607cee5ec16435d24cec32" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswplustut11" cloneof="bswplustut">
+ <description>The Bank Street Writer Plus Tutorial (version 1.1)</description>
+ <year>1986</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241476">
+ <rom name="the bank street writer plus v1.1 tutorial.woz" size="241476" crc="03afba56" sha1="ba8d052b7780b706dbda6609d459830a44ca2751" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bswplustut">
+ <description>The Bank Street Writer Plus Tutorial (version 1.4)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Gordon Riggs" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-14 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241479">
+ <rom name="the bank street writer plus v1.4 tutorial.woz" size="241479" crc="9f3b8954" sha1="8843c3fa7822678e0d0e948fea791eca1c56d58d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="banksim">
<description>The Banking Simulation</description>
<year>1986</year>
<publisher>EMC Publishing</publisher>
- <info name="programmer" value="Kristen Wagner and Sanjeev Phukan" />
+ <info name="programmer" value="Kristen Wagner" />
+ <info name="programmer" value="Sanjeev Phukan" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-11-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-11 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="241448">
<rom name="the banking simulation.woz" size="241448" crc="630ef150" sha1="224c2ff8aff7f8941f85f1b747d96b0dc988cdb6" />
@@ -30630,15 +41062,934 @@ license:CC0-1.0
</part>
</software>
+ <software name="brdstale">
+ <description>The Bard's Tale: Tales of the Unknown</description>
+ <year>1985</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="alt_title" value="Tales of the Unknown: The Bard's Tale" />
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="programmer" value="Bill Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-15 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot" />
+ <dataarea name="flop" size="228117">
+ <rom name="the bard's tale - boot disk.woz" size="228117" crc="ca391217" sha1="2965afea19b022330efdc4c4be3890f7558018d9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Character" />
+ <dataarea name="flop" size="234773">
+ <rom name="the bard's tale - character disk.woz" size="234773" crc="92e2f239" sha1="1f1967c425c64118addb3d8bae0e2821259d4b89" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Dungeon" />
+ <dataarea name="flop" size="234773">
+ <rom name="the bard's tale - dungeon disk.woz" size="234773" crc="b9099a69" sha1="45c9eb7161bc5c71fdbe2fc5c2ef99002cc81fed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brdstale2">
+ <description>The Bard's Tale II: The Destiny Knight</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Michael Cranford" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-03-02 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot" />
+ <dataarea name="flop" size="228149">
+ <rom name="the bard's tale ii - boot disk.woz" size="228149" crc="d9b0aa1a" sha1="afe776009a359625f7626ba8534245d16717d592" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Character" />
+ <dataarea name="flop" size="234805">
+ <rom name="the bard's tale ii - character disk.woz" size="234805" crc="2b16a6c7" sha1="d48ee9b3deb4346b7bbb5899adcd3206f0fb48fc" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Dungeon 1" />
+ <dataarea name="flop" size="234805">
+ <rom name="the bard's tale ii - dungeon 1 disk.woz" size="234805" crc="c5214293" sha1="49f1b0559be3a94cf1e7b0c1190c57c25e3d8fb4" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Dungeon 2" />
+ <dataarea name="flop" size="234805">
+ <rom name="the bard's tale ii - dungeon 2 disk.woz" size="234805" crc="d33c5544" sha1="078606ec01c59137b9a50bd18ebc4410a800302a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brdstale3_525" cloneof="brdstale3">
+ <description>The Bard's Tale III: The Thief of Fate</description>
+ <year>1988</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-04-11 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Boot" />
+ <dataarea name="flop" size="234820">
+ <rom name="the bard's tale iii disk 1a - boot.woz" size="234820" crc="0d92adf1" sha1="afec810cc36929f05d774f581c7a4b94588500b1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Character" />
+ <dataarea name="flop" size="234825">
+ <rom name="the bard's tale iii disk 1b - character.woz" size="234825" crc="bc266220" sha1="b8db19d79fb182b95697262dece469067ffef65c" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Dungeon A" />
+ <dataarea name="flop" size="234825">
+ <rom name="the bard's tale iii disk 2a - dungeon a.woz" size="234825" crc="2c962b97" sha1="200229e56978e57ac68183fffa4a1012c3ebfc95" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Dungeon B" />
+ <dataarea name="flop" size="234825">
+ <rom name="the bard's tale iii disk 2b - dungeon b.woz" size="234825" crc="ca6ef3c4" sha1="2c56ca1744e482864a49cf41b6355038d5a7c97e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brdstale3">
+ <description>The Bard's Tale III: Thief of Fate (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, or //e or 64K ][+ with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-10-12 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296176">
+ <rom name="the bard's tale iii 800k.woz" size="1296176" crc="d388b56d" sha1="7e45ae4673d40093f535606d13d032cadaa410ac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkcauld">
+ <description>The Black Cauldron</description>
+ <year>1985</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-23 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234860">
+ <rom name="the black cauldron disk 1a.woz" size="234860" crc="b3611b80" sha1="c477f162eff8e233c87279c9563bffdfa536b157" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234860">
+ <rom name="the black cauldron disk 1b.woz" size="234860" crc="74cddf88" sha1="53bca0ebb15a9a74ffea6451cab001e7ccd80538" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234860">
+ <rom name="the black cauldron disk 2a.woz" size="234860" crc="8801f2f6" sha1="993c1803bdcc5154042521d1e39879c630f2c53f" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234860">
+ <rom name="the black cauldron disk 2b.woz" size="234860" crc="27fac508" sha1="35aa60561d89a6dfdc3000a440c507c6d70c3f84" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="234860">
+ <rom name="the black cauldron disk 3.woz" size="234860" crc="d04b463b" sha1="cd1ee2ac9eec05f6fe133a505077769d621ae751" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="boyjesus">
+ <description>The Boy Jesus</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234831">
+ <rom name="the boy jesus side a.woz" size="234831" crc="eaff57c2" sha1="33b198cc5b8b47f6f1e6d8ee01c297c24177ba65" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234831">
+ <rom name="the boy jesus side b.woz" size="234831" crc="0a0e0657" sha1="0814bc10625d2ee80cd849207a448f87042758bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cavetime">
+ <description>The Cave of Time</description>
+ <year>1985</year>
+ <publisher>Bantam Software</publisher>
+ <info name="developer" value="Bantam Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="208122">
+ <rom name="the cave of time side a.woz" size="208122" crc="0f009cb2" sha1="284642900b62a7d61b9854a3409f1cc6c0ccd350" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234746">
+ <rom name="the cave of time side b.woz" size="234746" crc="bdbaa5c0" sha1="98d3c7bcfecad8e6053d77e7481faf3ab873579b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="childwpc">
+ <description>The Children's Writing &amp; Publishing Center (version 1.0)</description>
+ <year>1988</year>
+ <publisher>The Learning Company</publisher>
+ <info name="developer" value="Creative Pursuits" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- graphics program -->
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1 - Program" />
+ <dataarea name="flop" size="234844">
+ <rom name="the children's writing publishing center v1.0 - program disk side 1.woz" size="234844" crc="cf313965" sha1="fdf50663ea1a056ec43e0d06cb5cca3c8c957770" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2 - Program" />
+ <dataarea name="flop" size="234844">
+ <rom name="the children's writing publishing center v1.0 - program disk side 2.woz" size="234844" crc="8249555e" sha1="1e5b7b9880fb211d8dba2683b02dae130340a983" />
+ </dataarea>
+ </part>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1 - Picture" />
+ <dataarea name="flop" size="234844">
+ <rom name="the children's writing publishing center v1.0 - picture disk side 1.woz" size="234844" crc="6f392ffb" sha1="74238301fa159b0724bb6ab222d2d489a4b1891a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2 - Picture" />
+ <dataarea name="flop" size="234844">
+ <rom name="the children's writing publishing center v1.0 - picture disk side 2.woz" size="234844" crc="ba6d2473" sha1="14deea3dfaa2efcbda7f5e3652bb00cb1926b0bf" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Storage" />
+ <dataarea name="flop" size="234837">
+ <rom name="the children's writing publishing center v1.0 - storage disk.woz" size="234837" crc="a4218a59" sha1="d1343a9fa5efa56928d54143bf34f375091cef95" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side 1 - Template" />
+ <dataarea name="flop" size="234845">
+ <rom name="the children's writing publishing center v1.0 - template disk side 1.woz" size="234845" crc="0ec157db" sha1="af2ed9a1a079815b35e2d0635bdcac77aa8b93fc" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side 2 - Template" />
+ <dataarea name="flop" size="234845">
+ <rom name="the children's writing publishing center v1.0 - template disk side 2.woz" size="234845" crc="c650e4d3" sha1="17116143bfc11cc10fd90d1c68a8b48f27bd9c5e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tcomsent">
+ <description>The Compound Sentence (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234770">
+ <rom name="compound sentences 1988.woz" size="234770" crc="c253fdb0" sha1="a07a972f6e0fc75a614a5e2edf1f19654f99e4fa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="covetmir83" cloneof="covetmir">
+ <description>The Coveted Mirror (version 1983)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Eagle I. Berns" />
+ <info name="programmer" value="Holly Thomason" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234809">
+ <rom name="the coveted mirror side a.woz" size="234809" crc="fa4eac65" sha1="a43525a878343733ab90eff7e96239759b6dd8b1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot" />
+ <dataarea name="flop" size="234809">
+ <rom name="the coveted mirror side b (boot).woz" size="234809" crc="8be720f9" sha1="79bee46d21b133bfcb3463f26e455bceb44f90e4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="covetmir">
+ <description>The Coveted Mirror (version 1985)</description>
+ <year>1985</year>
+ <publisher>Polarware</publisher>
+ <info name="original_publisher" value="Penguin Software" />
+ <info name="programmer" value="Eagle I. Berns" />
+ <info name="programmer" value="Holly Thomason" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. Double hi-res graphics are available on 128K Apple //e and later." />
+ <info name="version" value="1985" />
+ <!-- Re-release by Polarware with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234878">
+ <rom name="the coveted mirror 2.0 side a.woz" size="234878" crc="c8f37420" sha1="3409d2d539e5b24217e512e0f4d379a4a12ed4a5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot" />
+ <dataarea name="flop" size="234878">
+ <rom name="the coveted mirror 2.0 side b (boot).woz" size="234878" crc="bb03d3d6" sha1="00570626b8b6ebf5ab04185744704f13a0af8b97" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crmcrown">
+ <description>The Crimson Crown (version 1985)</description>
+ <year>1985</year>
+ <publisher>Polarware</publisher>
+ <info name="original_publisher" value="Penguin Software" />
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <!-- Re-release by Polarware with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-20 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234766">
+ <rom name="the crimson crown side a.woz" size="234766" crc="3ba098cb" sha1="039acb376d74b1079469af9b49ec0220d03f5318" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234766">
+ <rom name="the crimson crown side b.woz" size="234766" crc="d158deed" sha1="e02ca1c7af89f56efe1d6767c40963161dfbe926" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dhuukrul">
+ <description>The Dark Heart of Uukrul</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Ian Boswell" />
+ <info name="programmer" value="Martin Buis" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-20 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Archive Disk" />
+ <dataarea name="flop" size="234821">
+ <rom name="the dark heart of uukrul - archive disk.woz" size="234821" crc="e3defc5a" sha1="8ac090f8a5ead4aedea6f337d2dcf6322d463838" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Boot Disk" />
+ <dataarea name="flop" size="234818">
+ <rom name="the dark heart of uukrul - boot disk.woz" size="234818" crc="94ecd9db" sha1="2892c5b5d1000f08a525fdf2d90842b9fb588eae" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Scenario disk A" />
+ <dataarea name="flop" size="234824">
+ <rom name="the dark heart of uukrul - scenario disk a.woz" size="234824" crc="5cfa9773" sha1="69ec3686d9b562fc4bd318a10bf2ae464fc3cfd0" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Scenario disk B" />
+ <dataarea name="flop" size="234824">
+ <rom name="the dark heart of uukrul - scenario disk b.woz" size="234824" crc="766dc1ee" sha1="ae4084e5af24a8ecfded776371e470d150ade818" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dragneye">
+ <description>The Dragon's Eye</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Robert Leyland" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-24 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="the dragon's eye.woz" size="234775" crc="0c51846e" sha1="69c5812255ee8c46724ff531ef3ad656199d0a77" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="earlychr">
+ <description>The Early Church</description>
+ <year>1984</year>
+ <publisher>Educational Publishing Concepts</publisher>
+ <info name="developer" value="Baker Book House" />
+ <info name="programmer" value="V. Gilbert Beers" />
+ <info name="programmer" value="Ronald Beers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234802">
+ <rom name="the early church side a.woz" size="234802" crc="92f64278" sha1="15afb0283d02c1835d79ca3a8deef16397f39117" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234802">
+ <rom name="the early church side b.woz" size="234802" crc="7159e04e" sha1="f985b18de65fd0f5be56792aea58c4d6584f816c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="teidolon">
+ <description>The Eidolon</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="LucasFilm Games" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233469">
+ <rom name="the eidolon.woz" size="233469" crc="d63f1ca5" sha1="c072f163c24455949964b175b6e05354cc9d0f72" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factorysb85" cloneof="factory">
+ <description>The Factory: Strategies in Problem Solving (Sunburst Communications) (version 1985)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233543">
+ <rom name="the factory.woz" size="233543" crc="f5d82f4e" sha1="d0ec1d511d5a0a217712a77a38c9feabad30ea34" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="factory">
+ <description>The Factory: Strategies in Problem Solving (WINGS for learning) (version 1990) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>WINGS for learning</publisher>
+ <info name="original_publisher" value="Sunburst Communications" />
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1990" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1329991">
+ <rom name="the factory 800k.woz" size="1329991" crc="617f952d" sha1="a131e093854b6adccd8737bc58c2272b5305e745" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="finlconf">
+ <description>The Final Conflict</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Thomas G. Cleaver" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-21 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="the final conflict.woz" size="234810" crc="149270e2" sha1="1e1ba74c733adfd57df96c6f395e9804f03dc69a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1sttksgv">
+ <description>The First Thanksgiving</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234752">
+ <rom name="the first thanksgiving.woz" size="234752" crc="eb34074e" sha1="361331112cef53bf487a5d366bcb80958808f18d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flyncrpt">
+ <description>The Flying Carpet</description>
+ <year>1985</year>
+ <publisher>Learning Technologies</publisher>
+ <info name="developer" value="Litag" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234680">
+ <rom name="the flying carpet.woz" size="234680" crc="f9b948f1" sha1="ac512f67e57f44abf4b3f0f95c8b1a02b60ac86a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="friendcom">
+ <description>The Friendly Computer (A-779 version 1.5) (800K 3.5")</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-779" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 48K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345319">
+ <rom name="the friendly computer 800k.woz" size="1345319" crc="9ed0d5ca" sha1="6f5af20ccede36b8b0bad57e710022197d7f8da2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgsummer">
+ <description>The Games: Summer Edition</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-05 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="233937">
+ <rom name="the games - summer edition - disk 1, side a.woz" size="233937" crc="0dc7efa5" sha1="954e0259c9cd8f9318cc84a03038070fe5a1a8af" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="233937">
+ <rom name="the games - summer edition - disk 1, side b.woz" size="233937" crc="a972a6ae" sha1="b6db0be1652fb79717cd6103051f3af685edf658" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="233937">
+ <rom name="the games - summer edition - disk 2, side a.woz" size="233937" crc="8d53f85e" sha1="52c04578fb5bb2c2a65ce9f9fcc344fa46192e6a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="233937">
+ <rom name="the games - summer edition - disk 2, side b.woz" size="233937" crc="ccc6e8bd" sha1="6bf9d6d245f7de1991ded76e5b0f4cbf212d192d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgwinter">
+ <description>The Games: Winter Edition</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Edward Chu" />
+ <info name="programmer" value="Kevin Furry" />
+ <info name="programmer" value="Eric Knopp" />
+ <info name="programmer" value="Carl Mey" />
+ <info name="programmer" value="Scott Nelson" />
+ <info name="programmer" value="Kevin Norman" />
+ <info name="programmer" value="Edwin W. Reich, Jr." />
+ <info name="programmer" value="Al Rubin" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="programmer" value="Steve A. Baker" />
+ <info name="programmer" value="Brooke W. Boering" />
+ <info name="programmer" value="Walter Horat" />
+ <info name="programmer" value="James Watcher" />
+ <info name="programmer" value="Susan Greene" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Jenny Martin" />
+ <info name="programmer" value="Muffy McCosh" />
+ <info name="programmer" value="Matt Sarconi" />
+ <info name="programmer" value="Steve Snyder" />
+ <info name="programmer" value="Paul Vernon" />
+ <info name="programmer" value="Chris Ebert" />
+ <info name="programmer" value="Christopher Grigg" />
+ <info name="programmer" value="Bob Vieira" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-03 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 1" />
+ <dataarea name="flop" size="235091">
+ <rom name="the games- winter edition disk a - front.woz" size="235091" crc="634f6457" sha1="a4b0ca06e469a1b19ad47876f94ce712c494b750" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A Side 2" />
+ <dataarea name="flop" size="235090">
+ <rom name="the games- winter edition disk a - back.woz" size="235090" crc="85dfb871" sha1="523d4ab42efccdcdf685e01fbe376aa49ff08d53" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 1" />
+ <dataarea name="flop" size="241747">
+ <rom name="the games- winter edition disk b - front.woz" size="241747" crc="d3eaa693" sha1="fb9cfae013e8b39562218587218b0a4aa4380136" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B Side 2" />
+ <dataarea name="flop" size="241746">
+ <rom name="the games- winter edition disk b - back.woz" size="241746" crc="52be2bc8" sha1="2873557eb73c6873f43e9e4ac8e803e5f19a7294" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C Side 1" />
+ <dataarea name="flop" size="240715">
+ <rom name="the games- winter edition disk c.woz" size="240715" crc="2504841a" sha1="fccbd849196558aa7c2ab2d59264f9af31c5b19a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgsquad">
+ <description>The Geometric Supposer: Quadrilaterals</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Michal Yerushalmy" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234849">
+ <rom name="the geometric supposer- quadrilaterals.woz" size="234849" crc="457b9a05" sha1="f9ef50533975b4474051a6a42141e93a1a5b0c26" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgstri">
+ <description>The Geometric Supposer: Triangles</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="programmer" value="Michal Yerushalmy" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234833">
+ <rom name="the geometric supposer- triangles.woz" size="234833" crc="251da185" sha1="7095b073ea38d41aca74c9957b44bc8922fc0494" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphmag10" cloneof="graphmag">
+ <description>The Graphics Magician (version 1.0)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="David Lubar" />
+ <info name="programmer" value="Chris Jochumson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234832">
+ <rom name="the graphics magician.woz" size="234832" crc="a8b4a146" sha1="eb1b7a0fb7c7ed65255e755383911ecbb754e6fb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphmag">
+ <description>The Graphics Magician (version 10.82)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="programmer" value="David Lubar" />
+ <info name="programmer" value="Chris Jochumson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="10.82" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-19 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234819">
+ <rom name="the graphics magician v1982-10.woz" size="234819" crc="47069bb8" sha1="deda6f8869f678fb82e592230e2c99cc1281f14c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphmagjr">
+ <description>The Graphics Magician Junior</description>
+ <year>1986</year>
+ <publisher>Polarware</publisher>
+ <info name="developer" value="Polarware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later. Double-hires functions require a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-22 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234732">
+ <rom name="the graphics magician junior.woz" size="234732" crc="d9f3fe83" sha1="5a29e09bee6c39c08a6291225f118c4370a811a2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="maincali">
+ <description>The Great Maine to California Race</description>
+ <year>1983</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="programmer" value="Natalie Jesdale M.S., ED." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234811">
+ <rom name="the great maine-to-california race side a.woz" size="234811" crc="b3d6d559" sha1="983bc7863534d2505ae444f7c21c86419f023561" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234811">
+ <rom name="the great maine-to-california race side b.woz" size="234811" crc="e688567b" sha1="a5818ab827b281d1154c596d4e63e42e216282a5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="halleypr">
+ <description>The Halley Project: A Mission In Our Solar System</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Omar Khudari" />
+ <info name="programmer" value="Tom Snyder" />
+ <info name="programmer" value="M. le Fuge" />
+ <info name="programmer" value="Ed McNierney" />
+ <info name="programmer" value="Peter Reynolds" />
+ <info name="programmer" value="Gabrielle Savage" />
+ <info name="programmer" value="Leonard Bertoni" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234873">
+ <rom name="the halley project.woz" size="234873" crc="fc5e6143" sha1="2fb576f76e8ee6b8f949565a4430a2879757d151" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hazvolt">
+ <description>The Hazards of Voltageville</description>
+ <year>1994</year>
+ <publisher>Scholastic</publisher>
+ <info name="developer" value="Prentice Associates" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="the hazards of voltageville.woz" size="234796" crc="b1855bf8" sha1="18c5b614c0d4cee46eee7958a41d05025e6f56f2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="theheist">
+ <description>The Heist</description>
+ <year>1983</year>
+ <publisher>Micro Fun</publisher>
+ <info name="programmer" value="Mike Livesay" />
+ <info name="programmer" value="Mike Mooney" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-28 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233483">
+ <rom name="the heist.woz" size="233483" crc="c39a1905" sha1="a9895f8ab454bf3dfdf5ac979274681d3ea42056" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thbdigex">
+ <description>The Human Body and How It Works: The Digestive and Excretory Systems</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234884">
+ <rom name="the human body and how it works- the digestive and excretory systems.woz" size="234884" crc="324c6b54" sha1="f7da08e97d5856e20e1064d54be8d56305883003" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thbsklms">
+ <description>The Human Body and How It Works: The Skeletal and Muscular Systems</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234899">
+ <rom name="the human body and how it works- the skeletal and muscular systems.woz" size="234899" crc="879443d6" sha1="ffeae22f1ace747d1670487b12cba5c841eb7c9b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="humnpump">
+ <description>The Human Pump</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Jim Kulzer" />
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Tad Martin Wood" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234819">
+ <rom name="the human pump.woz" size="234819" crc="22ae15ca" sha1="a993c93c0cf0bc0a54825fb2a14c627b4b8c0795" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="inclab">
+ <description>The Incredible Laboratory: Strategies in Problem Solving</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Jay Carlon" />
+ <info name="programmer" value="Melissa Verber" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235496">
+ <rom name="the incredible laboratory.woz" size="235496" crc="d12528f2" sha1="c84d9c1b164bb2bce2f57c44aa0c68adf07b5c8d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="insworld">
+ <description>The Insect World (800K 3.5")</description>
+ <year>1986</year>
+ <publisher>Ventura Educational Systems</publisher>
+ <info name="developer" value="Ventura Educational Systems" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-12 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296157">
+ <rom name="the insect world 800k.woz" size="1296157" crc="44248718" sha1="3265719575498390f2d3de931de88594cbb5023a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="theinsti">
<description>The Institute</description>
<year>1983</year>
<publisher>Screenplay</publisher>
- <info name="programmer" value="Jymm Pearson, Robin Pearson, Norm Sailer, and Richard Incrocci" />
+ <info name="programmer" value="Jymm Pearson" />
+ <info name="programmer" value="Robin Pearson" />
+ <info name="programmer" value="Norm Sailer" />
+ <info name="programmer" value="Richard Incrocci" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-02-->
- <!--adventure game-->
+ <!-- Dump released: 2022-02-02 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234818">
@@ -30653,15 +42004,1046 @@ license:CC0-1.0
</part>
</software>
+ <software name="jarchaos">
+ <description>The Jar Game &amp; Chaos</description>
+ <year>1982</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="William H. Kraus" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234780">
+ <rom name="the jar game and chaos.woz" size="234780" crc="c68f64ef" sha1="95e8e8421949dfb7c92583308e7ab43336a2d670" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kingrule">
+ <description>The King's Rule: Mathematics and Discovery</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Tom Raich" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234846">
+ <rom name="the king's rule- mathematics and discovery.woz" size="234846" crc="bfefe27a" sha1="cf0beacfe1cece58a390c0c9903025470e385ba1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kingfact">
+ <description>The Kingdom of Facts</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Anders Beitnes" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233516">
+ <rom name="the kingdom of facts side a.woz" size="233516" crc="01d35bbc" sha1="adb3d728b4be63c0dc0c25cbc58b81f33e2d5c12" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233516">
+ <rom name="the kingdom of facts side b.woz" size="233516" crc="abfce1f6" sha1="bc2141748a97812b04fe29dbd768b81804bb8be0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lastglad">
+ <description>The Last Gladiator</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="John Field" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228120">
+ <rom name="the last gladiator.woz" size="228120" crc="f9736689" sha1="eb37bdffc2c2bbafa728a2123be7856a00506f81" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="loblkslv">
+ <description>The Legend of Blacksilver</description>
+ <year>1989</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="John C. Dougherty" />
+ <info name="programmer" value="Charles W. Dougherty" />
+ <info name="programmer" value="Johnny Klonaris" />
+ <info name="programmer" value="Rick Tumanis" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-05-11 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="234839">
+ <rom name="the legend of blacksilver - side 1.woz" size="234839" crc="e3cea8ba" sha1="b775a5569c381768538a788205b992e5d5799bd5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="234839">
+ <rom name="the legend of blacksilver - side 2.woz" size="234839" crc="4bd45825" sha1="b44caee849ca7747491ff2412aaee17e995469f1" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="241495">
+ <rom name="the legend of blacksilver - side 3.woz" size="241495" crc="1561dbf4" sha1="64ed937cc62dca73415b9adb5b2078124b70fe8a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4" />
+ <dataarea name="flop" size="234839">
+ <rom name="the legend of blacksilver - side 4.woz" size="234839" crc="0c2a4503" sha1="f86c0f1294104e01969a0d3c26505dd2664af9be" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="livncell_525" cloneof="livncell">
+ <description>The Living Cell (A-278 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-278" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Ed Gratz" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241501">
+ <rom name="the living cell.woz" size="241501" crc="1566ea9b" sha1="fbefd9022ea256b8aa4f56f046b60f70db616d4b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="livncell">
+ <description>The Living Cell (A-278 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-278" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Ed Gratz" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Kevin Neff" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345342">
+ <rom name="the living cell v1.0 800k.woz" size="1345342" crc="a104a724" sha1="638d1a38673a22acb315f5ef5c9a09f433f66d6c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lushprof">
+ <description>The Lüscher Profile</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Dr. Max Lüscher" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="the luscher profile.woz" size="234788" crc="a9496aa0" sha1="46c0aa1068a61f82b7f86975e50e5d2dd3a7fc66" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="magicstr">
+ <description>The Magic String</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234769">
+ <rom name="the magic string.woz" size="234769" crc="3af82aa1" sha1="badc2580ea7c5f913a1df5f6a1d1d7d66e0bc612" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="markplc_525" cloneof="markplc">
+ <description>The Market Place (A-160 version 1.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-160" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234806">
+ <rom name="the market place v1.0.woz" size="234806" crc="08f7bb5f" sha1="f7c23246934ecf57fc1f941e6e413ddedf0fb508" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="markplc">
+ <description>The Market Place (A-160 version 1.0) (800K 3.5")</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-160" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, //e or 64K ][+ with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296138">
+ <rom name="the market place 800k.woz" size="1296138" crc="b9ac3c6c" sha1="bf65cf704707bce45a49992ae107551a9e2966d6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="masksun">
+ <description>The Mask of the Sun (version 2.1)</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Ultrasoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="2.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-14 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234816">
+ <rom name="the mask of the sun v2.1 side a.woz" size="234816" crc="6f53a1a8" sha1="be0a62cac5e1b658b531a3a72e081be38bb3f50f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234816">
+ <rom name="the mask of the sun v2.1 side b.woz" size="234816" crc="74c541b4" sha1="2e8b846c425685718135391fdbb16ce53cacaa06" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathbstr">
+ <description>The Math Busters</description>
+ <year>1984</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="the math busters.woz" size="234781" crc="9ee3f9a6" sha1="bd86b523b2bf40aeeb4aecc2ffd52a14d77fb51f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="memmachn">
+ <description>The Memory Machine</description>
+ <year>1989</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="David Owen" />
+ <info name="programmer" value="Barb Wood" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234817">
+ <rom name="the memory machine.woz" size="234817" crc="605835b6" sha1="68420ba94b61c9013c36a748ab060ee6b25abae5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="themist">
+ <description>The Mist</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Stephen King" />
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-16 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234766">
+ <rom name="the mist.woz" size="234766" crc="634e76c4" sha1="4df08a2efce9b077483dbe6e257fe68ee3ddf7a5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="movimons">
+ <description>The Movie Monster Game</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Epyx" />
+ <info name="usage" value="Requires a 64K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233451">
+ <rom name="the movie monster game side a.woz" size="233451" crc="7318e456" sha1="0bf74c85da08fd5c4bebb587c38769eb8aefb953" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233451">
+ <rom name="the movie monster game side b.woz" size="233451" crc="338a8ad1" sha1="b1a996b703cf00c509e15639c53019ce812341c8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nprntshop_525" cloneof="nprntshop">
+ <description>The New Print Shop</description>
+ <year>1990</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Don Lloyd" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-21 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="234859">
+ <rom name="the new print shop - program disk a.woz" size="234859" crc="edc0fcb6" sha1="bad65a9fa5225805994b4c3ee0cbcedfa208c727" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="234826">
+ <rom name="the new print shop - program disk b.woz" size="234826" crc="3c6c9b86" sha1="72f2e0850dee79919d52c0ab0b7a176c1b37b4df" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Data 1A" />
+ <dataarea name="flop" size="234824">
+ <rom name="the new print shop - data disk 1a.woz" size="234824" crc="fa7fc32c" sha1="595e123a70ce407fe6b33425ba61844c430bd570" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Data 1B" />
+ <dataarea name="flop" size="234824">
+ <rom name="the new print shop - data disk 1b.woz" size="234824" crc="65730a6b" sha1="1f29397d36e9e55c19d466ec51c93b40996ed6da" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Data 2A" />
+ <dataarea name="flop" size="234824">
+ <rom name="the new print shop - data disk 2a.woz" size="234824" crc="517dac64" sha1="5d51d6fc0ccf0345a97276a208992b1fdb8028e4" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Data 2B" />
+ <dataarea name="flop" size="234824">
+ <rom name="the new print shop - data disk 2b.woz" size="234824" crc="08de04aa" sha1="1010c2b2e40c30d8c64ff476eebb3c67dc2e71f7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nprntshop">
+ <description>The New Print Shop (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Don Lloyd" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-10-12 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296152">
+ <rom name="the new print shop 800k.woz" size="1296152" crc="df2c9138" sha1="d5f690d14861672cbefb9ab9a1ad275a087979e2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom850208" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1985-02-08)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-02-08" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234935">
+ <rom name="the newsroom v1985-02-08.woz" size="234935" crc="91084d74" sha1="a1c757a68be96c05fc969f6dcd939cd5843ae74d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom850211" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1985-02-11)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-02-11" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234924">
+ <rom name="the newsroom v1985-02-11.woz" size="234924" crc="19c46d63" sha1="f2378376a721be03ecce14c56eac04c815009b1f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom850515" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1985-05-15)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-05-15" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234924">
+ <rom name="the newsroom v1985-05-15.woz" size="234924" crc="62c684d2" sha1="23505ae600f3db577859e469029d189ede5b073a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom850520s" cloneof="newsroom" supported="no">
+ <description>The Newsroom (Scholastic Edition) (version 1985-05-20)</description>
+ <year>1984</year>
+ <publisher>Scholastic</publisher>
+ <info name="original_publisher" value="Springboard Software" />
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-05-20" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234965">
+ <rom name="the newsroom v1985-05-20 (scholastic).woz" size="234965" crc="a4be14c6" sha1="4e3197283ff6c6860e5ece4e12bc9e1933e1421a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom850520" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1985-05-20)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-05-20" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234951">
+ <rom name="the newsroom v1985-05-20.woz" size="234951" crc="e3d2c823" sha1="a1e617722e6fdb6e8606229cb56d979ba1e30994" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom851016" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1985-10-16)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-10-16" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234924">
+ <rom name="the newsroom v1985-10-16.woz" size="234924" crc="27500833" sha1="fcbe98088fce3748cd1afb2a63ac1fc2980b7f37" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom851220" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1985-12-20)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985-12-20" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234940">
+ <rom name="the newsroom v1985-12-20.woz" size="234940" crc="9343bc78" sha1="90abe268c023f3c39711412088c7029ce79bc567" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom860128" cloneof="newsroom" supported="no">
+ <description>The Newsroom (version 1986-01-28)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1986-01-28" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234908">
+ <rom name="the newsroom v1986-01-28.woz" size="234908" crc="6cf5b8e0" sha1="569416b279d209ebab3e46a0baa332b79b29092f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newsroom" supported="no">
+ <description>The Newsroom (version 1987-05-08)</description>
+ <year>1984</year>
+ <publisher>Springboard Software</publisher>
+ <info name="programmer" value="Sean Callahan" />
+ <info name="programmer" value="Jon Clauson" />
+ <info name="programmer" value="Robert Eyestone" />
+ <info name="programmer" value="Scott McSpadden" />
+ <info name="programmer" value="Robert Mueffelmann" />
+ <info name="programmer" value="Robert Cavey" />
+ <info name="programmer" value="Karen Christiansen" />
+ <info name="programmer" value="Jerry Cratsenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1987-05-08" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-25 -->
+ <!-- graphics program -->
+ <!-- Copy protection requires non-standard bit timing that is currently not supported in all emulators. -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241617">
+ <rom name="the newsroom v1987-05-08.woz" size="241617" crc="d9bbac1d" sha1="4a24b09e339e4af042030fe3ca76f8ed5f65377f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="orgtrail_525" cloneof="orgtrail">
+ <description>The Oregon Trail (A-157 version 1.4)</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-157" />
+ <info name="programmer" value="John Krenz" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234806">
+ <rom name="the oregon trail v1.4 side a.woz" size="234806" crc="8c97c45a" sha1="bba76a312ec2da8a59d8bbd71ea7f06dc04075c1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234806">
+ <rom name="the oregon trail v1.4 side b.woz" size="234806" crc="2e324af6" sha1="70e1b9074e12e750e246c9c00241c31ae3eab7ad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="orgtrail">
+ <description>The Oregon Trail (A-157 version 1.4) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-157" />
+ <info name="programmer" value="John Krenz" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 64K ][+ or //e with a compatible drive controller card." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-03-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296162">
+ <rom name="the oregon trail 800k.woz" size="1296162" crc="89ee473a" sha1="101e39fed19715a6b577bb90ca67ac7b0c6ace23" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="playroom_525" cloneof="playroom">
+ <description>The Playroom (version 1.0)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Leslie Grimm" />
+ <info name="author" value="Dennis Caswell" />
+ <info name="author" value="Lynn Kirkpatrick" />
+ <info name="developer" value="Educators' Software" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-21 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="234857">
+ <rom name="the playroom - disk a.woz" size="234857" crc="9f4b41b9" sha1="38c3c9bc694fd6be3a7e408d0869b64607f1cb1c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
+ <dataarea name="flop" size="234857">
+ <rom name="the playroom - disk b.woz" size="234857" crc="0d5ebd29" sha1="cec916b6e0ed1a95738e50b4deb69e4513d04027" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C" />
+ <dataarea name="flop" size="234857">
+ <rom name="the playroom - disk c.woz" size="234857" crc="42995d92" sha1="0ac071c644327a9d9757db2aa2608ba1fc19a665" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D" />
+ <dataarea name="flop" size="234857">
+ <rom name="the playroom - disk d.woz" size="234857" crc="b059bfd6" sha1="7d348beecab2090b6d15ef2e9e8bb0c2ac37f89e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="playroom">
+ <description>The Playroom (version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Leslie Grimm" />
+ <info name="author" value="Dennis Caswell" />
+ <info name="author" value="Lynn Kirkpatrick" />
+ <info name="developer" value="Educators' Software" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or a 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-07-07 redumped: 2021-12-14 to fix incorrect header information -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296725">
+ <rom name="the playroom 800k.woz" size="1296725" crc="10097dce" sha1="3c7b60daa0ae07bee2289cea5f6b4d2ef0c4dcad" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thepond">
+ <description>The Pond</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234794">
+ <rom name="the pond.woz" size="234794" crc="2d73628e" sha1="6eb3f3172d7676424d9ec5b585890bb5a4a9f6b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="printshp84" cloneof="printshp">
+ <description>The Print Shop (version 1984)</description>
+ <year>1984</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Balsam" />
+ <info name="programmer" value="Martin Kahn" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1984" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-15 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234809">
+ <rom name="the print shop side a.woz" size="234809" crc="97344ce3" sha1="3bc4427ed991ecc742f252ca0d201783cef5c2c4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234784">
+ <rom name="the print shop side b.woz" size="234784" crc="e1d16e70" sha1="66f324eae1053f3a50c54b906aba8be5aadd31d7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="printshp">
+ <description>The Print Shop (version 1986 Color)</description>
+ <year>1986</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="David Balsam" />
+ <info name="programmer" value="Martin Kahn" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="1986 Color" />
+ <!-- Adds support for color Imagewriter II printers. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-29 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234757">
+ <rom name="the print shop color side a.woz" size="234757" crc="3ca8da35" sha1="300e6725237ab5e24b93570d834cb6c416e17056" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234757">
+ <rom name="the print shop color side b.woz" size="234757" crc="22f1470b" sha1="a05e1a69a7bb9282b547ff91e45aa07fcb980467" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prshcompr1" cloneof="prshcomp">
+ <description>The Print Shop Companion (revision 1)</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 1" />
+ <!-- Includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234808">
+ <rom name="the print shop companion rev. 1 side a.woz" size="234808" crc="b4e3333f" sha1="0c3b479b9ef777d76a34960eb05c3a52f951b301" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241464">
+ <rom name="the print shop companion rev. 1 side b.woz" size="241464" crc="c4b6496e" sha1="30515dd6e1577249b8d7ef4e46252b28ed1ae013" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prshcompr2" cloneof="prshcomp">
+ <description>The Print Shop Companion (revision 2)</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 2" />
+ <!-- Includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234781">
+ <rom name="the print shop companion rev. 2 side a.woz" size="234781" crc="3ab4b7f8" sha1="a4880a1900ed9eca8d815487428ab3c13aeb9503" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234781">
+ <rom name="the print shop companion rev. 2 side b.woz" size="234781" crc="f6a92e14" sha1="c9441d087ebc88c4ec388fe2c62e5cce48df75ba" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prshcompr3" cloneof="prshcomp">
+ <description>The Print Shop Companion (revision 3)</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="revision 3" />
+ <!-- Includes a one-time backup utility (press Esc at the title screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-20 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234846">
+ <rom name="the print shop companion rev. 3 side a.woz" size="234846" crc="3af529c0" sha1="17d0a47e285b021d6c3b581f9a151b035af78390" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="242014">
+ <rom name="the print shop companion rev. 3 side b.woz" size="242014" crc="a40f852e" sha1="5a0c908d3a3a456fee7a1f7572496415535719c7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prshcomp">
+ <description>The Print Shop Companion (version 1.2)</description>
+ <year>1985</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later. This is the final version produced for the Apple ][." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-20 -->
+ <!-- graphics utility -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="234794">
+ <rom name="the print shop companion v1.2 side a.woz" size="234794" crc="e8af250e" sha1="875f61ac89ec48ed450fb646e5eafd9a24233c4d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="234794">
+ <rom name="the print shop companion v1.2 side b.woz" size="234794" crc="a06b52a9" sha1="1c6f461fbd4c78dd48480c334f0d5f1df2cf591e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tpuzzler">
+ <description>The Puzzler: A Program for Developing Reading Strategies</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Janet Gollan" />
+ <info name="programmer" value="Audrey Shillington" />
+ <info name="programmer" value="Douglas Denby" />
+ <info name="programmer" value="Douglas Inkpen" />
+ <info name="programmer" value="Arthur Willer" />
+ <info name="programmer" value="Dale Burnett" />
+ <info name="programmer" value="Larry Miller" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234929">
+ <rom name="the puzzler.woz" size="234929" crc="c46c6136" sha1="b97472d741f8d879e5ac6bebdf88bf078f12c385" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="queenphb">
+ <description>The Queen of Phobos</description>
+ <year>1982</year>
+ <publisher>Phoenix Software</publisher>
+ <info name="programmer" value="William R. Crawford" />
+ <info name="programmer" value="Paul L. Berker" />
+ <info name="programmer" value="Dav Holle" />
+ <info name="programmer" value="Adrian Ferret" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-07 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="181581">
+ <rom name="the queen of phobos.woz" size="181581" crc="6c31a42a" sha1="7617ff8f126edaab1daf8954ea7d6cac07bb1e77" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thequest83" cloneof="thequest">
+ <description>The Quest (version 1983)</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Joe Toler" />
+ <info name="programmer" value="Joel Ellis Rea" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1983" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-06 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234796">
+ <rom name="the quest side a.woz" size="234796" crc="cd012991" sha1="71f0041276cf8647d90b70268374662008199ebf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234796">
+ <rom name="the quest side b.woz" size="234796" crc="b0587d13" sha1="2ae465cd8af0cc6f9474de84fc57ee268a5f683f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thequest">
+ <description>The Quest (version 1984)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Joe Toler" />
+ <info name="programmer" value="Joel Ellis Rea" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="programmer" value="Steven Meuse" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later. Double hi-res graphics are available on 128K Apple //e and later." />
+ <info name="version" value="1984" />
+ <!-- Re-release with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-06 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234823">
+ <rom name="the quest v2.0 side a.woz" size="234823" crc="f3d27280" sha1="2bcdd7a22583403e66f2a4c0e1829b9b585f2d29" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234823">
+ <rom name="the quest v2.0 side b.woz" size="234823" crc="802f008f" sha1="13d06f6d50cd83692b9aa287c58c36969728dc35" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rightturn">
+ <description>The Right Turn: Strategies in Problem Solving</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Thomas C. Bretl" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234761">
+ <rom name="the right turn.woz" size="234761" crc="4435697b" sha1="255326b9e6a7bce7909b69954c3d998770787a4d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="roadgtbg">
+ <description>The Road to Gettysburg</description>
+ <year>1982</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Paul Murray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-03 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="248095">
+ <rom name="the road to gettysburg.woz" size="248095" crc="e401ad48" sha1="43d5c9005cc820a43b3faf8cc48ac98aca0744a9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="royrules">
+ <description>The Royal Rules</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="programmer" value="Raoul Watson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234715">
+ <rom name="the royal rules disk 1 - program.woz" size="234715" crc="8c70e053" sha1="7ef047f711e1890166d4f06817ed39c6d48dcd5a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data" />
+ <dataarea name="flop" size="234715">
+ <rom name="the royal rules disk 2 - data.woz" size="234715" crc="e5565228" sha1="03db61fe88d3c1bcc178f2c34cb6216cbd3e9db3" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="thescoop">
<description>The Scoop</description>
<year>1989</year>
<publisher>Spinnaker Software</publisher>
- <info name="programmer" value="Vince Mills and Bill Groetzinger" />
+ <info name="programmer" value="Vince Mills" />
+ <info name="programmer" value="Bill Groetzinger" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-11-05-->
- <!--adventure game-->
+ <!-- Dump released: 2020-11-05 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234760">
@@ -30676,6 +43058,71 @@ license:CC0-1.0
</part>
</software>
+ <software name="semacalc">
+ <description>The Semantic Calculator</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234777">
+ <rom name="the semantic calculator.woz" size="234777" crc="7ae38ce6" sha1="bc59969b3bf3cf4b256549baffb984b14407bce1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="serpstar10u" cloneof="serpstar">
+ <description>The Serpent's Star (Ultrasoft) (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Ultrasoft</publisher>
+ <info name="developer" value="Ultrasoft" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Note: due to subtle emulation bugs and extremely finicky copy protection, this disk may reboot one or more times before loading." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-26 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234770">
+ <rom name="the serpent's star side a.woz" size="234770" crc="197cce52" sha1="900bf3e4ab89b538620fe35445833618c3a2e1b9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234770">
+ <rom name="the serpent's star side b.woz" size="234770" crc="ee240f18" sha1="4938d02b15b2d4b626dfd0a14514cf09a06a0afa" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="serpstar">
+ <description>The Serpent's Star (Brøderbund Software) (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Ultrasoft" />
+ <info name="original_publisher" value="Ultrasoft" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-11-05 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234815">
+ <rom name="the serpent's star v1.0-broderbund side a.woz" size="234815" crc="9f64b113" sha1="b6e4a8adc936857c7e3731053d562f1a762c7deb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234815">
+ <rom name="the serpent's star v1.0-broderbund side b.woz" size="234815" crc="c725b491" sha1="ce3699f47968b69139874915476e94ce6c8ac55d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tsnapper">
<description>The Snapper</description>
<year>1982</year>
@@ -30683,8 +43130,8 @@ license:CC0-1.0
<info name="programmer" value="Dave Sanders" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-02-02-->
- <!--adventure game-->
+ <!-- Dump released: 2019-02-02 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="306708">
<rom name="the snapper.woz" size="306708" crc="57487610" sha1="a30ab58b66c7c067c8c473d915b45df4514cef6f" />
@@ -30692,14 +43139,56 @@ license:CC0-1.0
</part>
</software>
+ <software name="tsnbaseb">
+ <description>The Sporting News: Baseball</description>
+ <year>1988</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Steve A. Baker" />
+ <info name="programmer" value="Jim Huether" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-24 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234775">
+ <rom name="the sporting news- baseball side a.woz" size="234775" crc="bebab519" sha1="0cea607146e2fbc06c572f375b27e11671b30d22" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234775">
+ <rom name="the sporting news- baseball side b.woz" size="234775" crc="0310df9b" sha1="2c9509de6720835a3c209dd296fcde37b7e9182d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spysback">
+ <description>The Spy Strikes Back</description>
+ <year>1983</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Robert Hardy" />
+ <info name="programmer" value="Mark Pelczarski" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-19 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="120385">
+ <rom name="the spy strikes back.woz" size="120385" crc="9adf680e" sha1="4210fa5a9bbe40418baad823519b3f2b77e215cc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tspellbee">
<description>The Spelling Bee</description>
<year>1985</year>
<publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-12-14-->
- <!--educational game-->
+ <!-- Dump released: 2020-12-14 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234771">
<rom name="the spelling bee.woz" size="234771" crc="4ce1d2fc" sha1="c5b2eef97a5f5d5c857e25f00221f44270c6b07f" />
@@ -30707,15 +43196,42 @@ license:CC0-1.0
</part>
</software>
+ <software name="stdstone">
+ <description>The Standing Stones</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Peter Schmuckal" />
+ <info name="programmer" value="Don Sommers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-01-20 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="228114">
+ <rom name="the standing stones side a.woz" size="228114" crc="f15838d9" sha1="4dd29f40562291fcac58759a97d46987b847122b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234770">
+ <rom name="the standing stones side b.woz" size="234770" crc="a9d9f9c8" sha1="3366cd75320022bd8f35b4a9e53fbd086265aba5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="sbabc">
<description>The Stickybear ABC</description>
<year>1982</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Steve Worthington, Janie Worthington, Spencer K. Howe, and Richard Hefter" />
+ <info name="programmer" value="Steve Worthington" />
+ <info name="programmer" value="Janie Worthington" />
+ <info name="programmer" value="Spencer K. Howe" />
+ <info name="programmer" value="Richard Hefter" />
<info name="usage" value="Requires a 48K Apple ][ or later." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-10-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-10 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234862">
<rom name="the stickybear abc.woz" size="234862" crc="b384f0e4" sha1="a191367cdb60a2f96238dbd1bdba8a6325b33450" />
@@ -30723,16 +43239,750 @@ license:CC0-1.0
</part>
</software>
+ <software name="sfactory">
+ <description>The Super Factory (version 1986)</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Marge Kosel" />
+ <info name="programmer" value="Mike Fish" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1986" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-18 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234807">
+ <rom name="the super factory.woz" size="234807" crc="4a48c3b1" sha1="8c8cc653cbc6c3f98b074dfc989b18c8cba9dd20" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tenverbs">
+ <description>The Tenses of Verbs (version 1988)</description>
+ <year>1988</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234771">
+ <rom name="the tenses of verbs 1988.woz" size="234771" crc="9183820d" sha1="39e6e2cf949d051802070d9d46d1b144e82ecdc1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3rmicroc">
+ <description>The Three R's of Microcomputing &amp; The Glass Computer (A-811 version 1.1)</description>
+ <year>1983</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-811" />
+ <info name="programmer" value="Kent Carlson" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234805">
+ <rom name="the three rs of microcomputing v1.1.woz" size="234805" crc="f0d6f661" sha1="cc919a1cd7bb44873c9655bd51f9dbbcf0947451" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ttamerh">
+ <description>The Time Tunnel: American History Series</description>
+ <year>1984</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Fred Burggraf" />
+ <info name="programmer" value="James Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-08 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241504">
+ <rom name="the time tunnel- american history series.woz" size="241504" crc="f8108dc8" sha1="e65d7b54cc7397d988ea11533b77244778577854" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ttsports">
+ <description>The Time Tunnel: Sports Edition</description>
+ <year>1985</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="James Gray" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="the time tunnel- sports edition.woz" size="234813" crc="51bdced6" sha1="e7caf98a65034aa771aed62dfdae130e325496c9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ttnatem">
+ <description>The Time Tunnel: The America Series: A Nation Emerges</description>
+ <year>1984</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Fred Burggraf" />
+ <info name="programmer" value="Rebecca Benton" />
+ <info name="programmer" value="Linda Pratt" />
+ <info name="programmer" value="Jerry Camilleri" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-10-09 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234872">
+ <rom name="the time tunnel- a nation emerges.woz" size="234872" crc="34abd88d" sha1="21163d163b379f9198aae8a6792a46a2004a553a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ttearamer">
+ <description>The Time Tunnel: The America Series: Early America</description>
+ <year>1984</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Fred Burggraf" />
+ <info name="programmer" value="Rebecca Benton" />
+ <info name="programmer" value="Linda Pratt" />
+ <info name="programmer" value="Jerry Camilleri" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234812">
+ <rom name="the time tunnel- early america.woz" size="234812" crc="57e386f3" sha1="38c4aff736a59ee2603e7ef461555320d5dcba45" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ttpresid">
+ <description>The Time Tunnel: The America Series: The Presidents</description>
+ <year>1985</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Frederick Burggraf" />
+ <info name="programmer" value="Jerry Camilleri" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="the time tunnel- the presidents.woz" size="234813" crc="7aa7a710" sha1="cf4dcfc6b0456c78415bd535bfea9f6f20698b71" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trcrsnct">
+ <description>The Tracer Sanction</description>
+ <year>1984</year>
+ <publisher>Activision</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-24 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234785">
+ <rom name="the tracer sanction side a.woz" size="234785" crc="17b27251" sha1="f2179fdbaf0a9da30ccd64a176d19d4576fc2fc0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234785">
+ <rom name="the tracer sanction side b.woz" size="234785" crc="4f60a127" sha1="6b202a70c0c769c177d36fdd8c20c492014d1993" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="treehouse">
+ <description>The Treehouse (version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Leslie Grimm" />
+ <info name="author" value="Lynn Kirkpatrick" />
+ <info name="programmer" value="Rodney Nelsen" />
+ <info name="programmer" value="Janese Swanson" />
+ <info name="programmer" value="Peter Mitchell-Dayton" />
+ <info name="programmer" value="Caitlin Mitchell-Dayton" />
+ <info name="programmer" value="Jonelle Adkisson" />
+ <info name="programmer" value="John Crowell" />
+ <info name="usage" value="Requires am Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296742">
+ <rom name="the treehouse v1.0 800k.woz" size="1296742" crc="6a7a0283" sha1="e4507e0575e13164068c5c39db944cb4f20f9ef3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="usconnaf">
+ <description>The U.S. Constitution: Nationalism and Federalism (version 1987)</description>
+ <year>1987</year>
+ <publisher>Focus Media</publisher>
+ <info name="programmer" value="Mark D. Rothman" />
+ <info name="programmer" value="Scot Robinson" />
+ <info name="programmer" value="Andrew Kunkell" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1987" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-07-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Development of the Constitution"/>
+ <dataarea name="flop" size="234854">
+ <rom name="the u.s. constitution- nationalism and federalism disk 1 development of the constitution.woz" size="234854" crc="8f15ce5d" sha1="f39adac98097c310f7da8688610740b69b5fb529" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - The creation of the Constution"/>
+ <dataarea name="flop" size="234855">
+ <rom name="the u.s. constitution- nationalism and federalism disk 2 the creation of the constitution.woz" size="234855" crc="7bc35e5f" sha1="a338d1ea712c4794bb0495f3a639e13814026490" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Testing your knowledge of the Constitution"/>
+ <dataarea name="flop" size="234865">
+ <rom name="the u.s. constitution- nationalism and federalism disk 3 testing your knowledge of the constitution.woz" size="234865" crc="3d83f3f1" sha1="0cae4c2262cce80776124de86d4bf06442d3414b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="whneighbh">
+ <description>The Whole Neighborhood (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-09 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296167">
+ <rom name="the whole neighborhood 800k.woz" size="1296167" crc="95299735" sha1="92047c0ac6dd89cf32c12f14cfd23bc28fec9e18" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardoz">
+ <description>The Wizard of Oz</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="programmer" value="Ruth Wick" />
+ <info name="programmer" value="Ralph Hebb" />
+ <info name="programmer" value="Dan Mydlack" />
+ <info name="programmer" value="Mitch Stein" />
+ <info name="programmer" value="Howard Boles" />
+ <info name="programmer" value="Seth Godin" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-06-07 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="234866">
+ <rom name="the wizard of oz disk a.woz" size="234866" crc="4522de5f" sha1="b2459cf8ea2791d82b5da58e7b0aa25caf140f94" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
+ <dataarea name="flop" size="234866">
+ <rom name="the wizard of oz disk b.woz" size="234866" crc="e9de932e" sha1="fa02f177b45bde15ffc06101031fd01ca8710033" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C" />
+ <dataarea name="flop" size="234866">
+ <rom name="the wizard of oz disk c.woz" size="234866" crc="0ed1d4cb" sha1="78a9fb5edb2fd249e7804607cd7bd3ee248115af" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D" />
+ <dataarea name="flop" size="234866">
+ <rom name="the wizard of oz disk d.woz" size="234866" crc="1c0e7e78" sha1="25d7e25b66c475d0881138ba302be722683df6e6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wgbbg">
+ <description>The World's Greatest Baseball Game</description>
+ <year>1984</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Quest" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-19 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233488">
+ <rom name="the world's greatest baseball game.woz" size="233488" crc="9d415a67" sha1="c7e8f557efd3221ae5a171a92d217b7fb2250b29" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wgfbg">
+ <description>The World's Greatest Football Game</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Nexa Corp" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-19 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233507">
+ <rom name="the world's greatest football game side a.woz" size="233507" crc="fdbacf7f" sha1="301bf537734de76711c51431658fccca2a64bdca" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233507">
+ <rom name="the world's greatest football game side b.woz" size="233507" crc="4c9a39de" sha1="d5b145e52cd9d7438a66a976bbc6cb7baef10c11" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="theorems">
+ <description>Theorems and Proofs of Theorems</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234782">
+ <rom name="theorems and proofs of theorems disk 1.woz" size="234782" crc="1439e680" sha1="13d42fd93acc3dccdb1e9038f889f57b6874d97c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234782">
+ <rom name="theorems and proofs of theorems disk 2.woz" size="234782" crc="54db1fff" sha1="a144fbdb2b738e69d404e2a39958f56adf0a5794" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thexder">
+ <description>Thexder (version 1.5)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Daron Stinnett" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.5" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-09-24 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234784">
+ <rom name="thexder v1.5.woz" size="234784" crc="921ecd56" sha1="f571e7168f8554b6d114d3f14b6d1136a76cb205" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thquick11" cloneof="thquick">
+ <description>Think Quick! (version 1.1)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="234816">
+ <rom name="think quick v1.1 disk 1a - program.woz" size="234816" crc="95ad92b7" sha1="7d32e1618dc4f80c8284f6aa46fb90750d4863ba" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="234816">
+ <rom name="think quick v1.1 disk 1b - program.woz" size="234816" crc="f9fa8382" sha1="aaf520e128c8c5a49143b50c506c374fc9c95bfd" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Storage" />
+ <dataarea name="flop" size="234814">
+ <rom name="think quick v1.1 disk 2 - storage.woz" size="234814" crc="8dfcac1f" sha1="f9073c672a54b241459720be14bf430aaf0bf3b0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thquick12" cloneof="thquick">
+ <description>Think Quick! (version 1.2)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program" />
+ <dataarea name="flop" size="241472">
+ <rom name="think quick v1.2 disk 1a - program.woz" size="241472" crc="971703b6" sha1="75e6b02a724f34e35d7d8ced80980aa7484f72f1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Program" />
+ <dataarea name="flop" size="241472">
+ <rom name="think quick v1.2 disk 1b - program.woz" size="241472" crc="e89d721d" sha1="8e36ad03cf1dcfeed9f12c202855d1264640c512" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Storage" />
+ <dataarea name="flop" size="241470">
+ <rom name="think quick v1.2 disk 2 - storage.woz" size="241470" crc="4ebd7fb1" sha1="270295a20c56e48593c76caefe8983c1ba11615f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thquick">
+ <description>Think Quick! (version 1.4) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296193">
+ <rom name="think quick 800k.woz" size="1296193" crc="dd552c51" sha1="fd81362e8608fbba19189db5b5976c640c3c1b70" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thrshold">
+ <description>Threshold</description>
+ <year>1981</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Warren Schwader" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234785">
+ <rom name="threshold.woz" size="234785" crc="d3b570f7" sha1="f1716426682fcd8f937c5a04e4ca66387a4c99f9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thndlght">
+ <description>Thunder and Lightning</description>
+ <year>1984</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234774">
+ <rom name="thunder and lightning.woz" size="234774" crc="c0cd6639" sha1="98e8e940a691637629a4e73853b47a947855eacd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thunbomb">
+ <description>Thunder Bombs</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Tom Becklund" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-30 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="120334">
+ <rom name="thunder bombs.woz" size="120334" crc="ef8f7a1a" sha1="9e902c5a4baa53cc1f7733d8c709d248d132b1d6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thrilogy">
+ <description>Thrilogy</description>
+ <year>1980</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Warren Schwader" />
+ <info name="usage" value="Requires an Apple ][ with 48K and Integer BASIC in ROM." />
+ <sharedfeat name="compatibility" value="A2" />
+ <!-- Dump released: 2019-12-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234787">
+ <rom name="thrilogy.woz" size="234787" crc="ea5dabec" sha1="96eacd29aac4e1c4f7fb7cd36ad62e5f8b360909" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenav_525" cloneof="timenav">
+ <description>Time Navigator (A-247 version 1.0)</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-247" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234923">
+ <rom name="time navigator v1.0 side a.woz" size="234923" crc="93a87311" sha1="4ca9a74f4f46c6bef92259d0261eeb1f5897a9c9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234923">
+ <rom name="time navigator v1.0 side b.woz" size="234923" crc="89a881bf" sha1="fec13816b6ccdbd488ff0743d7524df73006645d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenav">
+ <description>Time Navigator (A-247 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-247" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, //e or 64K ][+ with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344927">
+ <rom name="time navigator 800k.woz" size="1344927" crc="41c44b9f" sha1="69f6015ee38abe03659cdc07d2447aff5a2a250b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenavaw_525" cloneof="timenavaw">
+ <description>Time Navigator Around the World (A-277 version 1.0)</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-277" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Ed Gratz" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234848">
+ <rom name="time navigator around the world side a.woz" size="234848" crc="ca9519bc" sha1="85a17730fb15fa26072783c1b8bdd9d187fbd4d8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234848">
+ <rom name="time navigator around the world side b.woz" size="234848" crc="010ef44b" sha1="a4fbf7359fc72ac61733ab1a6671af4fc6d4028c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenavaw">
+ <description>Time Navigator Around the World (A-277 version 1.0) (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-277" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Ed Gratz" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345370">
+ <rom name="time navigator around the world v1.0 800k.woz" size="1345370" crc="59ad25de" sha1="abd6097e4cfd670a2b2f847192b4af8f02b7d7d4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenavlb_525" cloneof="timenavlb">
+ <description>Time Navigator Leaps Back (A-225 version 1.0)</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-225" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234914">
+ <rom name="time navigator leaps back v1.0 side a.woz" size="234914" crc="1ff83681" sha1="13dca1caca38e75a5951baddfce05deaaea1498c" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234914">
+ <rom name="time navigator leaps back v1.0 side b.woz" size="234914" crc="ea1cc92a" sha1="ac48ac737bcdef4adbc7b3978895502bbc373111" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timenavlb">
+ <description>Time Navigator Leaps Back (A-225 version 1.0) (800K 3.5")</description>
+ <year>1990</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-225" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Vincent Erickson" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Nan Leekley" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Mark Paquette" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1344901">
+ <rom name="time navigator leaps back v1.0 800k.woz" size="1344901" crc="d2aa1766" sha1="57f189922af0f1504024b56bd7c56890908b24a6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmsoflre">
+ <description>Times of Lore</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Paul C. Isaac" />
+ <info name="programmer" value="Chris Roberts" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-02 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="242144">
+ <rom name="times of lore side a.woz" size="242144" crc="5e91044b" sha1="66d28dff232f1e89d94a216c7a3392576f68db25" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="242144">
+ <rom name="times of lore side b.woz" size="242144" crc="37142802" sha1="59bbdacf4ead58dde5a04e0fa9ff4e8764aa86d7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tttinkamaz">
+ <description>Tink!Tonk!: Tinka's Mazes</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Mercer Mayer"/>
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234740">
+ <rom name="tink tonk tinka's mazes side a.woz" size="234740" crc="74cb5b66" sha1="8e5486c9dbfe49db558a1c65b8e1650549f2c7b7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234740">
+ <rom name="tink tonk tinka's mazes side b.woz" size="234740" crc="8c3c4dda" sha1="9f5aea4f5cac473743f0074813a985e7381260dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tttinksubf">
+ <description>Tink!Tonk!: Tink's Subtraction Fair</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Mercer Mayer"/>
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234766">
+ <rom name="tink's subtraction fair.woz" size="234766" crc="0272e2c1" sha1="c15f5ee5ac8e1e764e0c91052f6397673f805a14" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="tttldbb">
- <description>Tink!Tonk!: Tonk in the Land of the Buddy-Bots by Mercer Mayer</description>
+ <description>Tink!Tonk!: Tonk in the Land of the Buddy-Bots</description>
<year>1984</year>
<publisher>Mindscape</publisher>
<info name="author" value="Mercer Mayer"/>
- <info name="developer" value=" Angelsoft" />
+ <info name="developer" value="Angelsoft" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-04-11-->
- <!--educational game-->
+ <!-- Dump released: 2020-04-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234814">
<rom name="tink tonk tonk in the land of buddy-bots.woz" size="234814" crc="0d3a8556" sha1="30b80f93ba4ad2684e09ec52db21c3734ba325e2" />
@@ -30740,6 +43990,93 @@ license:CC0-1.0
</part>
</software>
+ <software name="tttukgstwn">
+ <description>Tink!Tonk!: Tuk Goes to Town</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="Mercer Mayer"/>
+ <info name="developer" value="Angelsoft" />
+ <info name="usage" value="Requires an Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-23 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234759">
+ <rom name="tink tonk tuk goes to town.woz" size="234759" crc="0ac46fe1" sha1="433469e53811ea9f77e1fe86f4f0e6bc96811e73" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tipnflip">
+ <description>Tip 'N Flip</description>
+ <year>1984</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Donna Stanger" />
+ <info name="programmer" value="Simon Lie" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-07-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234782">
+ <rom name="tip 'n flip.woz" size="234782" crc="d51ac3ae" sha1="b5e542b1d3855f16168979d529e703e6fabacf8f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prsprodf10" cloneof="prsprodf">
+ <description>To Preserve, Protect and Defend (A-198 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-198" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234781">
+ <rom name="to preserve, protect and defend.woz" size="234781" crc="03ddd885" sha1="d891cdbb4d7108bc6fa1a6cff3883bd7a3131768" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prsprodf">
+ <description>To Preserve, Protect and Defend (A-198 version 1.1) (800K 3.5")</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-198" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K enhanced //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345303">
+ <rom name="to preserve, protect and defend v1.1 800k.woz" size="1345303" crc="341cfb56" sha1="8f049db032ed9bf1f6e96a65443635278499d222" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tobbslalg">
+ <description>Tobbs Learns Algebra: Puzzles and Problem Solving (version 1.1)</description>
+ <year>1983</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Tom O'Brien" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234843">
+ <rom name="tobbs learns algebra.woz" size="234843" crc="55811802" sha1="fcda0a78d518c42f6c18f17d4468f18351380e36" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trcgd2">
<description>Top Readers' Club: Grade 2</description>
<year>1989</year>
@@ -30747,8 +44084,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234789">
<rom name="top readers' club- grade 2.woz" size="234789" crc="ad824184" sha1="8feb5cdf2502b54205587db9fc2423d8a45037e0" />
@@ -30763,8 +44100,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234789">
<rom name="top readers' club- grade 3.woz" size="234789" crc="71252654" sha1="b4dc1b8aa2c563b15ef86ee19874c0431fc6fa42" />
@@ -30779,8 +44116,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234789">
<rom name="top readers' club- grade 4.woz" size="234789" crc="899c9c19" sha1="8cd7e25a9f72e36b49da80b9fefe6e435d0cb2aa" />
@@ -30795,8 +44132,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234789">
<rom name="top readers' club- grade 5.woz" size="234789" crc="f7220442" sha1="de62a19842c881a49f96b658a3094f169e811acb" />
@@ -30804,15 +44141,520 @@ license:CC0-1.0
</part>
</software>
+ <software name="torpfire">
+ <description>Torpedo Fire</description>
+ <year>1981</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="John Lyonn" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234792">
+ <rom name="torpedo fire.woz" size="234792" crc="9f23d37c" sha1="2cac615875b8d6b447e87ea86e67f26a579e5085" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trkfield">
+ <description>Track and Field (Atarisoft)</description>
+ <year>1984</year>
+ <publisher>Atari</publisher>
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-02-13 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233452">
+ <rom name="track and field.woz" size="233452" crc="462adf6e" sha1="220a604b368c61644265678ec820b71ace25f318" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trakattk">
+ <description>Track Attack</description>
+ <year>1982</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Chris Jochumson" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-26 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="261303">
+ <rom name="track attack.woz" size="261303" crc="e924de56" sha1="f3d636e0eabfbe196da71016e87424cc12ea0157" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tradpost">
+ <description>Trading Post</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Janet Brawner" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234790">
+ <rom name="trading post.woz" size="234790" crc="37adfc35" sha1="0e3f0fe0520741ae4ac6d3a41bed9de8659db8c7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trains">
+ <description>Trains</description>
+ <year>1983</year>
+ <publisher>Spinnaker Software</publisher>
+ <info name="developer" value="Spinnaker Software" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-21 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234722">
+ <rom name="trains.woz" size="234722" crc="03543c88" sha1="1dbb3ba1cfdda3c22d9279024f734596dfd5869d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tranbase">
+ <description>Tranquility Base</description>
+ <year>1979</year>
+ <publisher>Stoneware</publisher>
+ <info name="programmer" value="Bill Budge" />
+ <info name="usage" value="Requires a 32K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-11-15 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234817">
+ <rom name="tranquility base.woz" size="234817" crc="271dc5e8" sha1="044904322e394f5daf551acf80224758e57b4ff4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trantran">
+ <description>Transportation Transformation (800K 3.5")</description>
+ <year>1991</year>
+ <publisher>Queue</publisher>
+ <info name="developer" value="Pelican Software" />
+ <info name="usage" value="Requires a Apple IIgs, //c+, 128K //e, or 128K enhanced Apple //e with a compatible drive controller card." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-12-08 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296174">
+ <rom name="transportation transformation 800k.woz" size="1296174" crc="94438087" sha1="3099da49bc32f225b7edc0922593fa4485c523dc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl82" cloneof="transyl">
+ <description>Transylvania (version 1982) (Penguin Software)</description>
+ <year>1982</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1982" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234752">
+ <rom name="transylvania 1982.woz" size="234752" crc="0bb75760" sha1="c7d94d85d110224f75265614fcf7cb39c33517d3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl84" cloneof="transyl">
+ <description>Transylvania (version 1984) (Penguin Software)</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="programmer" value="Steven Meuse" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1984" />
+ <!-- Re-release with double hi-res graphics. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-18 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234795">
+ <rom name="transylvania 1984.woz" size="234795" crc="fe0cee1b" sha1="7a05712b302eac44a7bbff1d7ddd221f6fee55db" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl">
+ <description>Transylvania (version 1985) (Polarware)</description>
+ <year>1985</year>
+ <publisher>Polarware</publisher>
+ <info name="original_publisher" value="Penguin Software" />
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1985" />
+ <!-- Re-release by Polarware with updated graphics and gameplay. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-10 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="241472">
+ <rom name="transylvania 1985 side a.woz" size="241472" crc="2c8f80ae" sha1="0fcb96cced72a4fbfb4aaf383313d5c135eb4665" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241472">
+ <rom name="transylvania 1985 side b.woz" size="241472" crc="d6c4136f" sha1="3a04c95791f31cc3d2cc6165ac5d194948cbd898" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trapshoot">
+ <description>Trapshoot</description>
+ <year>1980</year>
+ <publisher>On-Line Systems</publisher>
+ <info name="programmer" value="Kieth Yilt" />
+ <info name="usage" value="Requires a 13-sector drive but otherwise Runs on any Apple ][ with 48K." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2024-06-16 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="228128">
+ <rom name="trapshoot.woz" size="228128" crc="2f88ae9a" sha1="7082d68d26baec57ca99b10d23674c0030863fb9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trisland">
+ <description>Treasure Island</description>
+ <year>1985</year>
+ <publisher>Windham Classics</publisher>
+ <info name="developer" value="Byron Preiss Video Productions" />
+ <info name="programmer" value="Michael P. Meyer" />
+ <info name="programmer" value="John Pierard" />
+ <info name="programmer" value="Ann Weil" />
+ <info name="programmer" value="Andre Garneau" />
+ <info name="programmer" value="Lee Jacknow" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-02-08 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234852">
+ <rom name="treasure island side a.woz" size="234852" crc="8990c495" sha1="eed208fe2c6fb17a45ae2f522442969d12112d17" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234852">
+ <rom name="treasure island side b.woz" size="234852" crc="84e20cf7" sha1="99aeadaf4b420a4d7b25934ba47c4b44845ef2aa" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C" />
+ <dataarea name="flop" size="234852">
+ <rom name="treasure island side c.woz" size="234852" crc="869e455f" sha1="cb83a938e54f1b262c2e49dfcb107566d8f5e60f" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D" />
+ <dataarea name="flop" size="234852">
+ <rom name="treasure island side d.woz" size="234852" crc="96f345f3" sha1="dd2b097d6a48510dc3c1a0f005c218ca40a5ae28" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tr4sale_525" cloneof="tr4sale">
+ <description>Treasures for Sale (A-337 version 1.0)</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-310" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234843">
+ <rom name="treasures for sale.woz" size="234843" crc="48bf4cdd" sha1="30584192bdecb72c8b25885394bf8177e5ac7283" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tr4sale">
+ <description>Treasures for Sale (A-337 version 1.0) (800K 3.5")</description>
+ <year>1993</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-310" />
+ <info name="programmer" value="Lon Koenig" />
+ <info name="programmer" value="John A. Persoon" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="John Wlazlo" />
+ <info name="programmer" value="David L. Wood" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296236">
+ <rom name="treasures for sale 800k.woz" size="1296236" crc="46556fa9" sha1="98819dc7ce92272ea0b802be2f7d00682af29ad3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="triad">
+ <description>Triad (version 1.0)</description>
+ <year>1983</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Ed Hobbs" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-03-02 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="triad.woz" size="234768" crc="fdf9952f" sha1="2751abfb876aa5106de01d797cd137067424f7d9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tfsbiog">
+ <description>Troll First-Start Biographies</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Alison Bennett" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234887">
+ <rom name="troll first start- biographies.woz" size="234887" crc="d70c5ea4" sha1="acc22d2cbbc71aa1604f9ced69db2299b1e7c6ed" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc1addsub">
+ <description>Troll Math Class Level 1: I Can Add And Subtract</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234793">
+ <rom name="troll math class level 1- i can add and subtract.woz" size="234793" crc="1c6da64d" sha1="d1dfd279d72dad192f5af2c01b2e65b49156212e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc2carbor">
+ <description>Troll Math Class Level 2: I Can Carry and Borrow</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234793">
+ <rom name="troll math class level 2- i can carry and borrow.woz" size="234793" crc="2fd31af8" sha1="6b62bb9c825f69cae594ab0cf0b50816354323fe" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc3muldiv">
+ <description>Troll Math Class Level 3: I Can Multiply and Divide</description>
+ <year>1988</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-03 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234831">
+ <rom name="troll math class level 3- i can multiply and divide.woz" size="234831" crc="d148b33d" sha1="bc56b8fa23f0ebedcb5760fadfe0bafef383525f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc4aaas">
+ <description>Troll Math Class Level 4: Advanced Addition and Subtraction</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Bonnie Brook" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234952">
+ <rom name="troll math class level 4- advanced addition and subtraction.woz" size="234952" crc="044d7026" sha1="adbf4ddeefa25b179c3b278595c1652a3a2f6b41" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc5amad">
+ <description>Troll Math Class Level 5: Advanced Multiplication and Division</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Peggy Brennan" />
+ <info name="programmer" value="Bonnie Brook" />
+ <info name="programmer" value="Lawrence Comella" />
+ <info name="programmer" value="Steven Martin" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-02-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234882">
+ <rom name="troll math class level 5- advanced multiplication and division.woz" size="234882" crc="affa1976" sha1="1624838bed675a5afe3f5fe3743c4d434cd23cea" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmc6rpp">
+ <description>Troll Math Class Level 6: Ratio, Proportion, and Percent</description>
+ <year>1989</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Mark Barone" />
+ <info name="programmer" value="Bernie Gallagher" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234996">
+ <rom name="troll math class level 6- ratio, proportion, and percent.woz" size="234996" crc="fe732cf1" sha1="4d589415a44f4d49eb070afcbad77eb39a02f907" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tmckicanc">
+ <description>Troll Math Class Level K: I Can Count</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234782">
+ <rom name="troll math class level k- i can count.woz" size="234782" crc="c82e7d04" sha1="6ea3cf8563393e743df0e07a122e78e89be499e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tpmholfun">
+ <description>Troll Printmaker: Holiday Fun</description>
+ <year>1994</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Bonnie Seiler" />
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program disk" />
+ <dataarea name="flop" size="234952">
+ <rom name="troll printmaker- holiday fun disk 1 - program.woz" size="234952" crc="cc6585d0" sha1="95b0dec2ec64a26810050014b10f06df2d89489b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data disk" />
+ <dataarea name="flop" size="234980">
+ <rom name="troll printmaker- holiday fun disk 2 - data.woz" size="234980" crc="519bbe93" sha1="f5d9c9179b31fff7436da523a4ae5ee21fc26265" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tomsawyr">
+ <description>Troll Reading Games: The Adventures of Tom Sawyer</description>
+ <year>1992</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Hudson Ansley" />
+ <info name="programmer" value="Diane Ashachik" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-04-28 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234859">
+ <rom name="troll reading games- the adventures of tom sawyer.woz" size="234859" crc="fcbae0cb" sha1="1e2370fbda9c6738ff82fb7acac45b3c257f39da" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trlspmth_525" cloneof="trlspmth">
+ <description>Troll Sports Math: Math Word Problems for Grades 4 to 6</description>
+ <year>1991</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Shack" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-11 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234995">
+ <rom name="troll sports math- math word problems for grades 4-6.woz" size="234995" crc="8382fd5e" sha1="7a446429f9cd27012ebf12b9b72b8d7f218fd57d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trlspmth">
<description>Troll Sports Math: Math Word Problems for Grades 4 to 6 (800K 3.5")</description>
<year>1991</year>
<publisher>Troll Associates</publisher>
- <info name="programmer" value="Millicent Sabater, Gregory Truex, Thomas Whiting, and Toby Shack" />
+ <info name="programmer" value="Millicent Sabater" />
+ <info name="programmer" value="Gregory Truex" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Toby Shack" />
<info name="usage" value="Requires an Apple IIgs, Apple //c+, or an Apple //e or Apple ][+ with an Apple UniDisk 3.5-inch drive (A2M2053) and a Liron or other compatible drive controller card. Other 3.5-inch drives, such as the AppleDisk 3.5 (A2M0106) or Apple SuperDrive (G7287), will not work due to incompatibilities created by the copy protection." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-01 redumped: 2021-12-14 to fix incorrect header information-->
- <!--educational program-->
+ <!-- Dump released: 2021-07-01 redumped: 2021-12-14 to fix incorrect header information -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296307">
<rom name="troll sports math 800k.woz" size="1296307" crc="66c531ac" sha1="4313b2cecab98701fac6c6724013fd2cc3908a06" />
@@ -30820,6 +44662,395 @@ license:CC0-1.0
</part>
</software>
+ <software name="tuemorqu">
+ <description>Tuesday Morning Quarterback</description>
+ <year>1981</year>
+ <publisher>Automated Simulations</publisher>
+ <info name="programmer" value="Charles Anderson" />
+ <info name="programmer" value="Jon Freeman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-22 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234668">
+ <rom name="tuesday morning quarterback.woz" size="234668" crc="a8e168d2" sha1="8b8a5d733b9fd3d763805ad4c689e02ea3a1919e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tuneit2">
+ <description>Tune It ][</description>
+ <year>1984</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="programmer" value="Fred Willman" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234776">
+ <rom name="tune it ii.woz" size="234776" crc="912537c6" sha1="968b78f0348ffa8930991e782be798e99b2770e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tunlterr">
+ <description>Tunnel Terror</description>
+ <year>1982</year>
+ <publisher>Adventure International</publisher>
+ <info name="programmer" value="Eric Popejoy" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234788">
+ <rom name="tunnel terror.woz" size="234788" crc="fe9da050" sha1="c3744acdef24dc9b347df4774d9c3f35912fbdd7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="typhstl">
+ <description>Typhoon of Steel (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-04-01 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Asia disk" />
+ <dataarea name="flop" size="234760">
+ <rom name="typhoon of steel - asia.woz" size="234760" crc="64f4fae2" sha1="2162afa7fc92e029ea45de9547cb9ec2244d7a2a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Europe disk" />
+ <dataarea name="flop" size="234762">
+ <rom name="typhoon of steel - europe.woz" size="234762" crc="6c8b2f21" sha1="62212483a0845f019ce6526020614fdea2adec16" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Pacific disk" />
+ <dataarea name="flop" size="234763">
+ <rom name="typhoon of steel - pacific.woz" size="234763" crc="f4f9ccc8" sha1="40fe14d68b358802dc32459b95ac6cb81a4a6728" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Scenarios disk" />
+ <dataarea name="flop" size="234765">
+ <rom name="typhoon of steel - scenarios.woz" size="234765" crc="711b5ff8" sha1="6b505829f62dd39a3e558bdeaf655f796d41ec5b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstypetr">
+ <description>Typing Tutor</description>
+ <year>1979</year>
+ <publisher>Microsoft</publisher>
+ <info name="usage" value="Requires a 13-sector drive but otherwise runs on any Apple ][ with 48K." />
+ <info name="developer" value="The Image Producers" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2019-04-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234810">
+ <rom name="typing tutor.woz" size="234810" crc="58306c14" sha1="b056c2772643d89336a6ee9894b5dfbd411f53f1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima1">
+ <description>Ultima I: The First Age of Darkness (Ultima Trilogy: Origin Systems)</description>
+ <!-- This is the Ultima Trilogy re-release version. -->
+ <year>1986</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="original_publisher" value="California Pacific Computer Company" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-05-23 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234735">
+ <rom name="ultima i - the beginning.woz" size="234735" crc="d06b8c18" sha1="9d909f6e098f23935854a9e63f7b2d7b8efc8dfc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima3">
+ <description>Ultima III: Exodus</description>
+ <year>1983</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-03-04 -->
+ <!-- role-playing game -->
+ <!-- As with the original, the scenario disk (side B) is write protected. You will need to make a copy of the disk before you can create characters. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="121621">
+ <rom name="ultima iii side a.woz" size="121621" crc="1bba6693" sha1="2ce436033547c06f42032a5e09a0831559244542" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario" />
+ <dataarea name="flop" size="234779">
+ <rom name="ultima iii side b.woz" size="234779" crc="b02c959f" sha1="dee83d101d7da833d862f55e3ffb642e2e9b4b7e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima4">
+ <description>Ultima IV: Quest of the Avatar</description>
+ <year>1985</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="programmer" value="Patrica Hunter" />
+ <info name="programmer" value="Marsha Meuse" />
+ <info name="programmer" value="Roe Adams" />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-17 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program Disk" />
+ <dataarea name="flop" size="240170">
+ <rom name="ultima iv - side a - program.woz" size="240170" crc="9e1d5595" sha1="a2de1815ffe51b4bdaad8b6abe8ec935911ec394" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Towne Disk" />
+ <dataarea name="flop" size="233516">
+ <rom name="ultima iv - side b - towne.woz" size="233516" crc="8ba7e933" sha1="f100cec0ae9d04a25f687fc3c1d76b139266826e" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C - Britannia Disk" />
+ <dataarea name="flop" size="233520">
+ <rom name="ultima iv - side c - britannia.woz" size="233520" crc="ac61d6c4" sha1="846bfcebf3dafa9642d290ea8d1619e580573e1a" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D - Underworld Disk" />
+ <dataarea name="flop" size="233521">
+ <rom name="ultima iv - side d - underworld.woz" size="233521" crc="7daab34f" sha1="d365cb92dd1c737a3c8773f432fe4c880019f324" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima5200288" cloneof="ultima5">
+ <description>Ultima V: Warriors of Destiny (version 20-FEB-88)</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Mark Hammer" />
+ <info name="programmer" value="Steve Meuse" />
+ <info name="programmer" value="John Miles" />
+ <info name="programmer" value="Toshi Morita" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="20-FEB-88" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-16 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="233616">
+ <rom name="ultima v - program.woz" size="233616" crc="77708654" sha1="3623aadefb9b2635cd56635ddb21b6d3f4b6dc63" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Dungeon"/>
+ <dataarea name="flop" size="233620">
+ <rom name="ultima v - dungeon.woz" size="233620" crc="7f981d04" sha1="d97fbd4d7eba2b65fc28e6d9bb19c9e1c4f18d58" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Britannia"/>
+ <dataarea name="flop" size="233622">
+ <rom name="ultima v - britannia.woz" size="233622" crc="8141d042" sha1="ddb85c2ee8bbbb4a66f5e87821df82744b3e3b8f" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Underworld"/>
+ <dataarea name="flop" size="233623">
+ <rom name="ultima v - underworld.woz" size="233623" crc="60a5113b" sha1="0f6ee9ea94e917042a074934b41a318486099fff" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Towne"/>
+ <dataarea name="flop" size="233618">
+ <rom name="ultima v - towne.woz" size="233618" crc="578b66cf" sha1="d13d98470df0f58e9ef2b8ab68aae979831f8d3e" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Dwelling"/>
+ <dataarea name="flop" size="233621">
+ <rom name="ultima v - dwelling.woz" size="233621" crc="fa6127b1" sha1="40e4c9054cee15edacdd378e6734052bc3237ee5" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A - Castle"/>
+ <dataarea name="flop" size="233619">
+ <rom name="ultima v - castle.woz" size="233619" crc="48d5bad1" sha1="02c1f89411e86096f88e28eb3f6199553efccc90" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B - Keep"/>
+ <dataarea name="flop" size="233617">
+ <rom name="ultima v - keep.woz" size="233617" crc="51638f02" sha1="d1bb7658d0056a9a769ecb15e1c69b41780f9e67" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ultima5">
+ <description>Ultima V: Warriors of Destiny (version 02-MAR-88)</description>
+ <year>1988</year>
+ <publisher>Origin Systems</publisher>
+ <info name="developer" value="Origin Systems" />
+ <info name="programmer" value="Richard Garriott" />
+ <info name="programmer" value="Kenneth W. Arnold" />
+ <info name="programmer" value="Mark Hammer" />
+ <info name="programmer" value="Steve Meuse" />
+ <info name="programmer" value="John Miles" />
+ <info name="programmer" value="Toshi Morita" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="02-MAR-88" />
+ <!-- This version clarifies some wording in the transfer character utility, removed unused strings, and corrects a spelling mistake. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-01-16 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A - Program"/>
+ <dataarea name="flop" size="234889">
+ <rom name="ultima v v02-mar-88 disk 1a - program.woz" size="234889" crc="56619f26" sha1="1a4475d8847c7965d4b3124a33383ae02c3e0971" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B - Dungeon"/>
+ <dataarea name="flop" size="234889">
+ <rom name="ultima v v02-mar-88 disk 1b - dungeon.woz" size="234889" crc="cccfdc78" sha1="f6504f75e90301d203386356c91a8c9100e55c69" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A - Britannia"/>
+ <dataarea name="flop" size="234891">
+ <rom name="ultima v v02-mar-88 disk 2a - britannia.woz" size="234891" crc="b64c939c" sha1="ac1a0ca3dd495d89cd63576380f058ece53ae1cb" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B - Underworld"/>
+ <dataarea name="flop" size="234892">
+ <rom name="ultima v v02-mar-88 disk 2b - underworld.woz" size="234892" crc="48a664a9" sha1="352b877bf69e777c88e2dc4cd02bf300e7aa0886" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A - Towne"/>
+ <dataarea name="flop" size="234887">
+ <rom name="ultima v v02-mar-88 disk 3a - towne.woz" size="234887" crc="8bc97d32" sha1="2707ed0cbfbce6882040b6c9e74c037da9d38f4c" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B - Dwelling"/>
+ <dataarea name="flop" size="234890">
+ <rom name="ultima v v02-mar-88 disk 3b - dwelling.woz" size="234890" crc="2df7b618" sha1="6fec9e6c56ad6f32ece7979c5dee218d48b4a315" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A - Castle"/>
+ <dataarea name="flop" size="234888">
+ <rom name="ultima v v02-mar-88 disk 4a - castle.woz" size="234888" crc="1cdd0c91" sha1="a4aaa432fa11f8b0c43a6077795f49b5c0cf5e42" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B - Keep"/>
+ <dataarea name="flop" size="234886">
+ <rom name="ultima v v02-mar-88 disk 4b - keep.woz" size="234886" crc="8e708ec7" sha1="bbd9bfdc69d9019a500957c630558534dc636ce1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="umegypt">
+ <description>Ultimore: Egypt</description>
+ <year>1985</year>
+ <publisher>Backstreet Software</publisher>
+ <info name="programmer" value="Joel Fenton" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Requires Ultima III (not included)" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- role-playing scenario -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234838">
+ <rom name="ultimore - egypt.woz" size="234838" crc="69304bab" sha1="c37a9ce245a4cbe5c7b18bc79495cf82a475354c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="umpirwrld">
+ <description>Ultimore: Pirate World</description>
+ <year>1985</year>
+ <publisher>Backstreet Software</publisher>
+ <info name="programmer" value="Joel Fenton" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Requires Ultima III (not included)" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- role-playing scenario -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234818">
+ <rom name="ultimore - pirate world.woz" size="234818" crc="989fc1c2" sha1="de58ff7884b2551023dfe6a06aa67b8752328cef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="umslavlor">
+ <description>Ultimore: Slavelords</description>
+ <year>1985</year>
+ <publisher>Backstreet Software</publisher>
+ <info name="programmer" value="Joel Fenton" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Requires Ultima III (not included)" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- role-playing scenario -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234843">
+ <rom name="ultimore - slavelords.woz" size="234843" crc="968cfe54" sha1="89f2aa7e7bbfb3de85d7d18b6397b5d6b62a3ee7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="umspacecr">
+ <description>Ultimore: Spaceship Crash</description>
+ <year>1985</year>
+ <publisher>Backstreet Software</publisher>
+ <info name="programmer" value="Joel Fenton" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Requires Ultima III (not included)" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-08 -->
+ <!-- role-playing scenario -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234848">
+ <rom name="ultimore - spaceship crash.woz" size="234848" crc="13a58bed" sha1="1693adcb6ffecb54c710b046139330468978658d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="uccsbcon">
<description>Uncle Clyde's Consonant Slides: Beginning Consonants</description>
<year>1993</year>
@@ -30827,8 +45058,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234816">
<rom name="uncle clyde's consonant slides- beginning consonants.woz" size="234816" crc="88348c39" sha1="52540c0a55312cee61423de49d25f26c79aed449" />
@@ -30843,8 +45074,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234815">
<rom name="uncle clyde's consonant slides- blends and digraphs.woz" size="234815" crc="4ac31653" sha1="7f965a68ed1350390196324319ca45c209c3bd9f" />
@@ -30859,8 +45090,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-06-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-06-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234813">
<rom name="uncle clyde's consonant slides- ending consonants.woz" size="234813" crc="bfe6adfe" sha1="bc12cd855cf9687cfd10031ede34ebb60f17f7f2" />
@@ -30868,15 +45099,72 @@ license:CC0-1.0
</part>
</software>
+ <software name="undmapgl">
+ <description>Understanding Maps and Globes</description>
+ <year>1987</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-01-15 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234757">
+ <rom name="understanding maps and globes disk 1.woz" size="234757" crc="98205b76" sha1="23a8b270179f5ff72282a4b083de89e427bf5575" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234757">
+ <rom name="understanding maps and globes disk 2.woz" size="234757" crc="f68503e1" sha1="c8d6c5ba3db7c385c00a4e24cf022dbdf3e5fff0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="uboatcmd">
+ <description>U-Boat Command</description>
+ <year>1982</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Charles Fleishman" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-07-23 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="u-boat command.woz" size="234798" crc="8fe838be" sha1="8bea0f67b8b576f31c20ecc81499cf03e022a040" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="valdaygr">
+ <description>Valentine's Day Grump</description>
+ <year>1985</year>
+ <publisher>Troll Associates</publisher>
+ <info name="developer" value="Troll Associates" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234751">
+ <rom name="valentine's day grump.woz" size="234751" crc="cf60a469" sha1="3136cf10752f3b854e373161647106ecb670fd95" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="vaultzur">
<description>Vaults of Zurich</description>
<year>1982</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Felix Herlihy, Greg Herlihy, and Roger Harnish" />
+ <info name="programmer" value="Felix Herlihy" />
+ <info name="programmer" value="Greg Herlihy" />
+ <info name="programmer" value="Roger Harnish" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-09-28-->
- <!--adventure game-->
+ <!-- Dump released: 2019-09-28 -->
+ <!-- adventure game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="235497">
<rom name="vaults of zurich.woz" size="235497" crc="1a42863c" sha1="fc1185de0dec030a34a1a2627af1d7bf5e968a58" />
@@ -30884,14 +45172,134 @@ license:CC0-1.0
</part>
</software>
+ <software name="vcrcomp">
+ <description>VCR Companion (version 1.1) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Louis Ewens" />
+ <info name="programmer" value="Lauren Elliott" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-10 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296708">
+ <rom name="vcr companion 800k.woz" size="1296708" crc="ec3956f8" sha1="8be36dcbaa81da0ecf10c1234abc9e803d6d2fa2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg1">
+ <description>Verb Usage 1 (version 01.31.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="verb usage 1 v01.31.89.woz" size="234779" crc="bbd2eb91" sha1="dada2781f0154f53106bc853a01b80db043714b3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg2">
+ <description>Verb Usage 2 (version 01.31.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="verb usage 2 v01.31.89.woz" size="234779" crc="bf71d9c0" sha1="2e5e68ba90596152bc743d9aeb2b99f2ef98ef37" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbusg4">
+ <description>Verb Usage 4 (version 01.31.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="developer" value="Hartley Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.31.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234779">
+ <rom name="verb usage 4 v01.31.89.woz" size="234779" crc="7d8d0ea2" sha1="e37a52d14471a9119ecf4e94d21036d8bd9b9f98" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="verbvomo">
+ <description>Verbs: Voice and Mood (version 1988)</description>
+ <year>1983</year>
+ <publisher>Intellectual Software</publisher>
+ <info name="developer" value="Queue" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1988" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234773">
+ <rom name="verbs- voice and mood 1988.woz" size="234773" crc="cf719403" sha1="1a3617e07f25d0bc3f7c2aad1ebe0e91395a40b9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidttlsh">
+ <description>Video Title Shop</description>
+ <year>1987</year>
+ <publisher>Datasoft</publisher>
+ <info name="programmer" value="John Butrovich" />
+ <info name="programmer" value="Richard Mirsky" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-27 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="video title shop.woz" size="234775" crc="cd30f1dc" sha1="5471b1bc795cbb29238d6833ee8c7f790a136451" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidvegas12501">
+ <description>Video Vegas (version 12501)</description>
+ <year>1985</year>
+ <publisher>Baudville</publisher>
+ <info name="partno" value="12501" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="12501" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-25 -->
+ <!-- card game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234702">
+ <rom name="video vegas.woz" size="234702" crc="f47a8783" sha1="2b8e0f911b4a98f0b0f009e2508c4e0a348736bd" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="vocdevel">
<description>Vocabulary Development (800K 3.5")</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K ][+ with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-03-27-->
- <!--educational program-->
+ <!-- Dump released: 2023-03-27 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1286410">
<rom name="vocabulary development 800k.woz" size="1286410" crc="69f96e22" sha1="d084c82d25513a014f858c09e162af26c954f785" />
@@ -30899,6 +45307,48 @@ license:CC0-1.0
</part>
</software>
+ <software name="voodoois">
+ <description>Voodoo Island</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="author" value="M. J. Sayer"/>
+ <info name="developer" value="Angelsoft"/>
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-09-15 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234754">
+ <rom name="voodoo island.woz" size="234754" crc="1587edf9" sha1="cda18cb196229f36546cfd305f1ea5923ea2e6eb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wlywrdwk">
+ <description>Wally's Word Works: The Parts of Speech Game</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="John D. Perron" />
+ <info name="programmer" value="Martha Nicols" />
+ <info name="programmer" value="Andrew Armstrong" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-20 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Teacher" />
+ <dataarea name="flop" size="234886">
+ <rom name="wally's word works disk 1 - teacher disk.woz" size="234886" crc="2436eb0c" sha1="0bfb8694332b4a2bd38e4bd0bc0734c84ea8494f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Student" />
+ <dataarea name="flop" size="234886">
+ <rom name="wally's word works disk 2 - student disk.woz" size="234886" crc="bd913887" sha1="49d7fb5a1e1b1b1da778692f9009c1d37bf6ff92" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="war">
<description>War</description>
<year>1982</year>
@@ -30906,8 +45356,8 @@ license:CC0-1.0
<info name="developer" value="Adventure International" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-28-->
- <!--strategy game-->
+ <!-- Dump released: 2024-04-28 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234765">
<rom name="war (adventure international).woz" size="234765" crc="79dbdd18" sha1="059f29a61f8d47a45a16b66c4634eed837860805" />
@@ -30915,15 +45365,152 @@ license:CC0-1.0
</part>
</software>
+ <software name="wrussia">
+ <description>War in Russia</description>
+ <year>1983</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Scenario (boot)" />
+ <dataarea name="flop" size="234809">
+ <rom name="war in russia - scenario disk (boot).woz" size="234809" crc="d3083428" sha1="ea63b7a993d076ba1269213a0b492a70a1f05a5e" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Game" />
+ <dataarea name="flop" size="234805">
+ <rom name="war in russia - game disk.woz" size="234805" crc="73695baf" sha1="04a700cd26c0027fc4399e30f6cd0f24921e3e1c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wargle">
+ <description>Wargle!</description>
+ <year>1982</year>
+ <publisher>Hayden Book Company</publisher>
+ <info name="developer" value="Eastgate Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-10-30 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234778">
+ <rom name="wargle.woz" size="234778" crc="1206aa31" sha1="c2431e7f2cbda517edb71d4458fa0e85a36338fb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="warship10">
+ <description>Warship (version 1.0)</description>
+ <year>1986</year>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
+ <info name="programmer" value="Gary Grigsby" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-22 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234775">
+ <rom name="warship v1.0.woz" size="234775" crc="537c3109" sha1="4e2d1e5d2dd15ee1c0f7f7e3f04a4137c5fbd784" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wheeldeal">
+ <description>Wheeler Dealers (DOS 3.3 conversion)</description>
+ <year>1978</year>
+ <publisher>Speakeasy Software</publisher>
+ <info name="programmer" value="Danielle Bunten Berry" />
+ <info name="usage" value="Requires a 48K Apple ][ or later. Shipped with special hardware controllers, but joystick or paddeles can be used by defining directional movement (not button press) to each player." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-05-09 -->
+ <!-- This is a digitization of the original cassette, and a non-original conversion to a bootable disk. -->
+ <!-- simulation game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="wheeler dealers dos 3.3 conversion.dsk" size="143360" crc="adc3c491" sha1="be1b6cfcb0d39c13d8a945b9746f392a996a5670" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carmapst_525" cloneof="carmapst">
+ <description>Where in America's Past is Carmen Sandiego?</description>
+ <year>1992</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Claire Curtin" />
+ <info name="author" value="Dave Ross" />
+ <info name="author" value="Leila Joslyn" />
+ <info name="author" value="Ann Kronen" />
+ <info name="author" value="Tom Rettig" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="234959">
+ <rom name="where in america's past is carmen sandiego - side 1.woz" size="234959" crc="b42a802f" sha1="3067abba80e728d4f2559eadfa60615ee58d44f5" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="234959">
+ <rom name="where in america's past is carmen sandiego - side 2.woz" size="234959" crc="f73c204f" sha1="f24c5ce31bac99e4f2882bea5647560792d0a97e" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="234959">
+ <rom name="where in america's past is carmen sandiego - side 3.woz" size="234959" crc="21caa378" sha1="c4e05b3bda8d60680d842cd74510849c9e641e10" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4" />
+ <dataarea name="flop" size="234959">
+ <rom name="where in america's past is carmen sandiego - side 4.woz" size="234959" crc="b6ccc56f" sha1="ddb178edcfb4261bc338d0170829c23d023cfc37" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carmapst">
+ <description>Where in America's Past is Carmen Sandiego? (version 1.00) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Claire Curtin" />
+ <info name="author" value="Dave Ross" />
+ <info name="author" value="Leila Joslyn" />
+ <info name="author" value="Ann Kronen" />
+ <info name="author" value="Tom Rettig" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.00" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-10-25 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296354">
+ <rom name="where in america's past is carmen sandiego v1.00 800k.woz" size="1296354" crc="d222d67b" sha1="3e9e889276807d1e751deeb18227d06b3de6a951" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="carmneur_525" cloneof="carmeur">
<description>Where in Europe is Carmen Sandiego?</description>
<year>1988</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, Lauren Elliott, Leila Bronstein, Don Albrecht, Katherine Bird, Susan Meyers, and Louis Ewens" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-04-28-->
- <!--educational game-->
+ <!-- Dump released: 2019-04-28 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="233533">
@@ -30942,11 +45529,13 @@ license:CC0-1.0
<description>Where in Europe is Carmen Sandiego? (800K 3.5")</description>
<year>1988</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, Lauren Elliott, Leila Bronstein, Don Albrecht, Katherine Bird, Susan Meyers, and Louis Ewens" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2021-07-06. Redumped: 2021-12-14 to fix incorrect header information-->
- <!--educational game-->
+ <!-- Dump released: 2021-07-06. Redumped: 2021-12-14 to fix incorrect header information -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296763">
<rom name="where in europe is carmen sandiego 800k.woz" size="1296763" crc="549ffd83" sha1="d6350738f600af581e5dc598aa8a90f8ee47bcf1" />
@@ -30958,16 +45547,18 @@ license:CC0-1.0
<description>Where in North Dakota is Carmen Sandiego? (version 0.98 beta)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Ken Bull, Katherine Bird, Janese Freed, Leila Bronstein, Rick Incrocci, Michelle McBride, Roseann Mitchell, Arturo Sinclair, Diane Wilcox, and Louis Ewens" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="0.98 beta" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-12-->
- <!--This is v0.98 beta, labeled as "for workshops and demonstrations only." It is not copy protected.-->
- <!--educational game-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-12 -->
+ <!-- This is v0.98 beta, labeled as "for workshops and demonstrations only." It is not copy protected. -->
+ <!-- educational game -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="235025">
@@ -30986,16 +45577,18 @@ license:CC0-1.0
<description>Where in North Dakota is Carmen Sandiego? (version 1.0 final beta)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Ken Bull, Katherine Bird, Janese Freed, Leila Bronstein, Rick Incrocci, Michelle McBride, Roseann Mitchell, Arturo Sinclair, Diane Wilcox, and Louis Ewens" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0 final beta" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-17-->
- <!--This is v0.98 beta, labeled as "for workshops and demonstrations only." It is not copy protected.-->
- <!--educational game-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-17 -->
+ <!-- This is v0.98 beta, labeled as "for workshops and demonstrations only." It is not copy protected. -->
+ <!-- educational game -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234980">
@@ -31014,15 +45607,17 @@ license:CC0-1.0
<description>Where in North Dakota is Carmen Sandiego? (version 1.0)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Ken Bull, Katherine Bird, Janese Freed, Leila Bronstein, Rick Incrocci, Michelle McBride, Roseann Mitchell, Arturo Sinclair, Diane Wilcox, and Louis Ewens" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-03-09-->
- <!--educational game-->
- <!--This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
+ <!-- Dump released: 2020-03-09 -->
+ <!-- educational game -->
+ <!-- This is part of the Where in North Dakota is Carmen Sandiego disk set. Please refer to the following website for more details on the history of this particular disk:
https://web.archive.org/web/https://gamehistory.org/where-in-north-dakota-is-carmen-sandiego/
- -->
+ -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234963">
@@ -31041,12 +45636,14 @@ license:CC0-1.0
<description>Where in Time is Carmen Sandiego? (verson 1.1)</description>
<year>1990</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Rod Nelsen, Leila Bronstein, Jenny Martin, Gail Rathbun, Mark Schlichtinng, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Rod Nelsen" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-02-05-->
- <!--educational game-->
+ <!-- Dump released: 2019-02-05 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 Side A" />
<dataarea name="flop" size="233672">
@@ -31077,12 +45674,14 @@ license:CC0-1.0
<description>Where in Time is Carmen Sandiego? (version 1.1) (800K 3.5")</description>
<year>1990</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Rod Nelsen, Leila Bronstein, Jenny Martin, Gail Rathbun, Mark Schlichtinng, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Rod Nelsen" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-11-->
- <!--educational game-->
+ <!-- Dump released: 2022-09-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296281">
<rom name="where in time is carmen sandiego 800k.woz" size="1296281" crc="8d38e3cd" sha1="9b96556dcb289a7c3b36762b64372f2c4a747951" />
@@ -31094,12 +45693,14 @@ license:CC0-1.0
<description>Where in the USA is Carmen Sandiego? (version 1.0 1986)</description>
<year>1986</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 64K Apple ][ or later." />
<info name="version" value="1.0 1986" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2018-10-01-->
- <!--educational game-->
+ <!-- Dump released: 2018-10-01 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="240205">
@@ -31118,12 +45719,14 @@ license:CC0-1.0
<description>Where in the USA is Carmen Sandiego? (version 1990) (800K 3.5")</description>
<year>1990</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
<info name="version" value="1990" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-09-11-->
- <!--educational game-->
+ <!-- Dump released: 2022-09-11 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296119">
<rom name="where in the usa is carmen sandiego 800k.woz" size="1296119" crc="c7075c63" sha1="bbc102ed01fb20393fecd3655d5bc0c523d57e50" />
@@ -31135,12 +45738,14 @@ license:CC0-1.0
<description>Where in the USA is Carmen Sandiego? (version 2.1)</description>
<year>1990</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-19-->
- <!--educational game-->
+ <!-- Dump released: 2024-04-19 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234876">
@@ -31165,12 +45770,14 @@ license:CC0-1.0
<description>Where in the World is Carmen Sandiego? (version 1985)</description>
<year>1985</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Dane Bigham, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Dane Bigham" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 64K Apple ][ or later." />
<info name="version" value="1985" />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-03-16-->
- <!--educational game-->
+ <!-- Dump released: 2019-03-16 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="332120">
@@ -31189,12 +45796,15 @@ license:CC0-1.0
<description>Where in the World is Carmen Sandiego? (version 2.1)</description>
<year>1990</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Ken Bull, Dane Bigham, Gene Portwood, and Lauren Elliott" />
+ <info name="programmer" value="Ken Bull" />
+ <info name="programmer" value="Dane Bigham" />
+ <info name="programmer" value="Gene Portwood" />
+ <info name="programmer" value="Lauren Elliott" />
<info name="usage" value="Requires a 128K Apple //e or later." />
<info name="version" value="2.1" />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-19-->
- <!--educational game-->
+ <!-- Dump released: 2024-04-19 -->
+ <!-- educational game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234890">
@@ -31209,6 +45819,41 @@ license:CC0-1.0
</part>
</software>
+ <software name="wwwwwh">
+ <description>Who-What-Where-When-Why (version 01.27.89)</description>
+ <year>1989</year>
+ <publisher>Hartley Courseware</publisher>
+ <info name="programmer" value="Jane Hartley" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="01.27.89" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-24 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234813">
+ <rom name="who what where when why v01.27.89.woz" size="234813" crc="12b23513" sha1="49e98f7010c77d358530e24df48091f408aa4d7c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wmprstmpr">
+ <description>Whomper Stomper</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="author" value="Mike Wall" />
+ <info name="author" value="Marty Inchiosa" />
+ <info name="programmer" value="Steve Waldo" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-11 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234853">
+ <rom name="whomper stomper.woz" size="234853" crc="99f67210" sha1="1ae2f9c644191954cbe586beb476b4bc19866d8b" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wwmathl4">
<description>Wild West Math Level 4</description>
<year>1990</year>
@@ -31216,8 +45861,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-04-23-->
- <!--educational program-->
+ <!-- Dump released: 2020-04-23 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk A" />
<dataarea name="flop" size="234794">
@@ -31245,8 +45890,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2020-06-04-->
- <!--educational program-->
+ <!-- Dump released: 2020-06-04 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="234771">
@@ -31267,6 +45912,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="wildcamp">
+ <description>Wilderness Campaign</description>
+ <year>1979</year>
+ <publisher>Synergistic Software</publisher>
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="usage" value="Requires an Apple ][ or Apple ][+ with at least 48K RAM, Integer BASIC in ROM, and a 13-sector floppy drive." />
+ <sharedfeat name="compatibility" value="A2,A2P" />
+ <sharedfeat name="sl6_default" value="diskiing13" />
+ <!-- Dump released: 2025-11-15 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234765">
+ <rom name="wilderness campaign.woz" size="234765" crc="eaf046af" sha1="4999ea3ee196b0e804d9a31818fcb45e6d6b94f8" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="winlosdr">
<description>Win, Lose or Draw</description>
<year>1988</year>
@@ -31274,8 +45936,8 @@ license:CC0-1.0
<info name="developer" value="Softie, Inc." />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-21-->
- <!--board game-->
+ <!-- Dump released: 2024-04-21 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234766">
@@ -31297,8 +45959,8 @@ license:CC0-1.0
<info name="developer" value="Softie, Inc." />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-21-->
- <!--board game-->
+ <!-- Dump released: 2024-04-21 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234789">
@@ -31320,8 +45982,8 @@ license:CC0-1.0
<info name="developer" value="Softie, Inc." />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-21-->
- <!--board game-->
+ <!-- Dump released: 2024-04-21 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234781">
@@ -31336,15 +45998,84 @@ license:CC0-1.0
</part>
</software>
+ <software name="wndwlkr">
+ <description>Windwalker</description>
+ <year>1989</year>
+ <publisher>Origin Systems</publisher>
+ <info name="programmer" value="Greg Malone" />
+ <info name="programmer" value="Jeff Dee" />
+ <info name="programmer" value="Glen Johnson" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Jeff Hillhouse" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1" />
+ <dataarea name="flop" size="234847">
+ <rom name="windwalker side 1.woz" size="234847" crc="4751ca81" sha1="c975d701a96bf7798b5c7f1869ed937257832409" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2" />
+ <dataarea name="flop" size="234847">
+ <rom name="windwalker side 2.woz" size="234847" crc="c0851999" sha1="5aa7b5754fad7a463a7064843ca473a9eabc3b56" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3" />
+ <dataarea name="flop" size="234816">
+ <rom name="windwalker side 3.woz" size="234816" crc="cf77e94f" sha1="531bb897178e42322b142f9108f9800621d0ac86" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4" />
+ <dataarea name="flop" size="234816">
+ <rom name="windwalker side 4.woz" size="234816" crc="c0d03025" sha1="dc187789418c3572f887eb7fa982e3e4014b14d9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wof">
+ <description>Wings of Fury</description>
+ <year>1987</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Steve Waldo" />
+ <info name="usage" value="Requires a 128K Apple //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-10-01 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="233481">
+ <rom name="wings of fury side a.woz" size="233481" crc="61f6896e" sha1="44c5f01954d367915315e9e36aa8bb23b0038cac" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="233304">
+ <rom name="wings of fury side b.woz" size="233304" crc="e88181a9" sha1="0913de8ee03c5295d2015b481809090695c2c0ea" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wingsshad">
<description>Wings Out of Shadow</description>
<year>1983</year>
<publisher>Berserker Works</publisher>
- <info name="programmer" value="Scott V. Walker, Joan Saberhagen, Dennis L. Martinez, Mary Martinez, Michael L. Carpenter, Eddie Goldberger, and Bryan Bingham" />
+ <info name="programmer" value="Scott V. Walker" />
+ <info name="programmer" value="Joan Saberhagen" />
+ <info name="programmer" value="Dennis L. Martinez" />
+ <info name="programmer" value="Mary Martinez" />
+ <info name="programmer" value="Michael L. Carpenter" />
+ <info name="programmer" value="Eddie Goldberger" />
+ <info name="programmer" value="Bryan Bingham" />
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2023-07-27-->
- <!--strategy game-->
+ <!-- Dump released: 2023-07-27 -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234892">
<rom name="wings out of shadow.woz" size="234892" crc="3dd30c72" sha1="22ac1989ce534d437c29e35f061b89b5a7f8266a" />
@@ -31352,6 +46083,54 @@ license:CC0-1.0
</part>
</software>
+ <software name="wpoohhaw">
+ <description>Winnie the Pooh in the Hundred Acre Wood (version 1985-02-10) (Sunburst Communications)</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="original_publisher" value="Sierra On-Line" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1985-02-10" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Sunburst Communications is listed on the disk lable. -->
+ <!-- Dump released: 2020-06-03 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="234802">
+ <rom name="winnie the pooh in the hundred acre wood disk 1.woz" size="234802" crc="73997920" sha1="d6b8176c8753f05da2f72b1f1b96e8718d18ab88" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="234802">
+ <rom name="winnie the pooh in the hundred acre wood disk 2.woz" size="234802" crc="06be776d" sha1="d1826e1eaac9625c9924b55e51f0fbb68af745bd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wntgames">
+ <description>Winter Games</description>
+ <year>1985</year>
+ <publisher>Epyx</publisher>
+ <info name="developer" value="Action Graphics" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-10-03 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="235443">
+ <rom name="winter games side a.woz" size="235443" crc="f4efaabf" sha1="b48d6598ca98a213a39a6d65827e63020092481d" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="235443">
+ <rom name="winter games side b.woz" size="235443" crc="c27d43fa" sha1="8e79d61971ad57c919e3b691c9a3d8999e4fbac7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wipeout">
<description>Wipeout</description>
<year>1988</year>
@@ -31359,8 +46138,8 @@ license:CC0-1.0
<info name="developer" value="Softie, Inc." />
<info name="usage" value="Requires a 128K Apple //e or later." />
<sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-04-20-->
- <!--board game-->
+ <!-- Dump released: 2024-04-20 -->
+ <!-- board game -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
<dataarea name="flop" size="234746">
@@ -31375,6 +46154,305 @@ license:CC0-1.0
</part>
</software>
+ <software name="wizardry1v0981" cloneof="wizardry1">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (version 05-SEP-81)</description>
+ <year>1981</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="05-SEP-81" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-02. Redumped: 2022-05-10 to fix critical data corruption in the saved characters roster that entirely prevented playing. -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Scenario disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234881">
+ <rom name="wizardry- proving grounds of the mad overlord v05-sep-81 side a - scenario.woz" size="234881" crc="0e955f2e" sha1="47dd791b826c1d952ca78fe209fafd5f6fc30ed8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234846">
+ <rom name="wizardry- proving grounds of the mad overlord v05-sep-81 side b - boot.woz" size="234846" crc="a7d80c8c" sha1="1f1ad5cb198a29e1934a744901ae71cccc82e300" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry1v1281" cloneof="wizardry1">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (version 01-DEC-81)</description>
+ <year>1981</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="01-DEC-81" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-02 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master scenario disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234884">
+ <rom name="wizardry- proving grounds of the mad overlord v01-dec-81 side a - master scenario.woz" size="234884" crc="caae12b7" sha1="78b15dbc13bcf61cf9f44a31d3478a565b010b0f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234873">
+ <rom name="wizardry- proving grounds of the mad overlord v01-dec-81 side b - boot.woz" size="234873" crc="0a1eb2ab" sha1="36d42cdb06b5b7452c05ddccf5d6aa8182bdd790" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry1v20" cloneof="wizardry1">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (version 2.0 01-JAN-82)</description>
+ <year>1981</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="2.0 01-JAN-82" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-06-04 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master scenario disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234937">
+ <rom name="wizardry- proving grounds of the mad overlord v2.0 01-jan-82 side a - scenario master disk.woz" size="234937" crc="8a92f261" sha1="b90ced6408a7e15cd177c0aaead773d6da417093" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234896">
+ <rom name="wizardry- proving grounds of the mad overlord v2.0 01-jan-82 side b - boot disk.woz" size="234896" crc="d9c55106" sha1="60bcd0d81ad3fe4a7f6cae4d94e71d5cb01cf3e7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry1v21" cloneof="wizardry1">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (version 2.1 22-JAN-82)</description>
+ <year>1981</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="2.1 22-jan-82" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-11 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234829">
+ <rom name="wizardry - proving grounds of the mad overlord v2.1 - boot disk.woz" size="234829" crc="29dfa2a6" sha1="6c0416fb7cb91bde8da05df77ecfc5f7b7c645f1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Scenario master disk" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="234829">
+ <rom name="wizardry - proving grounds of the mad overlord v2.1 - scenario master disk.woz" size="234829" crc="7951ca26" sha1="604a416c50ca6fccb39c11142f8be00d51ce627c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry1">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (version 6 06-JAN-84)</description>
+ <year>1981</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="6 06-JAN-84" />
+ <!-- This version does not have the read-only lock-up issues. -->
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-09-14 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master Scenario" />
+ <dataarea name="flop" size="234851">
+ <rom name="wizardry i - proving grounds of the mad overlord v6 06-jan-84 side a - master scenario.woz" size="234851" crc="35e9a266" sha1="be11042207a7c4a04f16ff72ff7a40f089caf5cb" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot" />
+ <dataarea name="flop" size="234840">
+ <rom name="wizardry i - proving grounds of the mad overlord v6 06-jan-84 side b - boot.woz" size="234840" crc="95814fa6" sha1="6d03f641d8a39e0f3a81af927cbb41a14ddcf54f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry2">
+ <description>Wizardry II: The Knight of Diamonds (version PV3S2V1/10-MAR-82)</description>
+ <year>1982</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="PV3S2V1/10-MAR-82" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-11 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot disk" />
+ <dataarea name="flop" size="234854">
+ <rom name="wizardry ii - knight of diamonds - boot disk.woz" size="234854" crc="16a794a8" sha1="db098051302810edb8aa5c56c8a3dd7cc9ab0772" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master scenario disk" />
+ <dataarea name="flop" size="234865">
+ <rom name="wizardry ii - knight of diamonds - master scenario disk.woz" size="234865" crc="ac3a27d9" sha1="59f7c602c6347c732ddd8222d667622bf8749a29" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry3">
+ <description>Wizardry III: Legacy of Llylgamyn (version 4, 20-Aug-1983 update)</description>
+ <year>1983</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="Version 4, 20-Aug-1983 update" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-04-08. Redumped: 2023-09-12. Redumped: 2024-05-19 with a cleaner scenario disk and no deleted characters. -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Master Scenario disk" />
+ <dataarea name="flop" size="234928">
+ <rom name="wizardry iii side a - master scenario disk.woz" size="234928" crc="30d77894" sha1="64d65a39b24a02d1f127db1666a6f3dcd99176f7" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Boot disk" />
+ <dataarea name="flop" size="234917">
+ <rom name="wizardry iii side b - boot.woz" size="234917" crc="83b4938b" sha1="0191645b5a833042e47c75ca7544225f3b3cdbab" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry4">
+ <description>Wizardry IV: The Return of Werdna</description>
+ <year>1987</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="programmer" value="Robert Woodhead" />
+ <info name="programmer" value="Roe R. Adams III" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-12-14 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234833">
+ <rom name="wizardry iv - the return of werdna side a.woz" size="234833" crc="0c6ac6a0" sha1="f465fb3b88eb38c197e24da1ae1962f6d0a58cd9" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234833">
+ <rom name="wizardry iv - the return of werdna side b.woz" size="234833" crc="179d1324" sha1="7bff6956d76129cc82d5e5ac6ba30d8806054bdf" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side C" />
+ <dataarea name="flop" size="234833">
+ <rom name="wizardry iv - the return of werdna side c.woz" size="234833" crc="0493f3d5" sha1="22efb911669d42525a8e8ab35b2a34ca5ef2fdbd" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side D" />
+ <dataarea name="flop" size="234833">
+ <rom name="wizardry iv - the return of werdna side d.woz" size="234833" crc="897eb0dc" sha1="21f4d0bd66d9d3a275678dbfc7cabb0cc023910f" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Side E" />
+ <dataarea name="flop" size="234833">
+ <rom name="wizardry iv - the return of werdna side e.woz" size="234833" crc="0fd25eba" sha1="eb07e89850635da688a5aa1d372eebbc19594c9e" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Side F" />
+ <dataarea name="flop" size="234833">
+ <rom name="wizardry iv - the return of werdna side f.woz" size="234833" crc="3a8a7986" sha1="a2684a58605af6ddbd6554bc99333ab3947dd4e9" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizardry5">
+ <description>Wizardry V: Heart of the Maelstrom</description>
+ <year>1988</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="David W. Bradley" />
+ <info name="programmer" value="Andrew Greenberg" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2019-08-03 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk A" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - a.woz" size="234780" crc="5c670ca8" sha1="93c05e54ea21596165fb158cfcceaa595ccd38e1" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk B" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - b.woz" size="234780" crc="1df4b66f" sha1="5ceb0e45e976111ad9d93a3feb1261ecd207465b" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk C" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - c.woz" size="234780" crc="60381a85" sha1="68ac614ea0bc52a690d35c9c6a64d425fe775202" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk D" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - d.woz" size="234780" crc="2219894f" sha1="793a5074867136cfee53877113dcfda0c8590b6b" />
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk E" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - e.woz" size="234780" crc="0e3d0d38" sha1="4a8a35ea50bf55da877ada12823971c7bb6779c4" />
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk F" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - f.woz" size="234780" crc="f0b8294f" sha1="fbed529779a7f1dd70a416f83502dd4468c4d014" />
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk G" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - g.woz" size="234780" crc="90979c2d" sha1="a9a115d8f68eefadfe360bb006239fa1773633a8" />
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk H" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - h.woz" size="234780" crc="571539b6" sha1="5db3ef18a7a03c775b16577624af3c3ef0637b97" />
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk I" />
+ <dataarea name="flop" size="234780">
+ <rom name="wizardry v - heart of the maelstrom - i.woz" size="234780" crc="690af2ea" sha1="99fc3ba766182e331f8729672711a27b2bfe1509" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="wizcovlad">
<description>Wizimore: Catacombs of Vlad</description>
<year>1987</year>
@@ -31382,8 +46460,8 @@ license:CC0-1.0
<info name="programmer" value="Joel Fenton" />
<info name="usage" value="Requires a 48K Apple ][ or later. Scenario disk for Wizardry 1: Proving Grounds of the Mad Overlord." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-21-->
- <!--roleplaying scenario-->
+ <!-- Dump released: 2024-03-21 -->
+ <!-- role-playing scenario -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234891">
<rom name="wizimore - catacombs of vlad.woz" size="234891" crc="5d4499d2" sha1="cdb4d341f51912df5c5fc7bf0d1428b2af9548dc" />
@@ -31398,8 +46476,8 @@ license:CC0-1.0
<info name="programmer" value="Joel Fenton" />
<info name="usage" value="Requires a 48K Apple ][ or later. Scenario disk for Wizardry 1: Proving Grounds of the Mad Overlord." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-21-->
- <!--roleplaying scenario-->
+ <!-- Dump released: 2024-03-21 -->
+ <!-- role-playing scenario -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234884">
<rom name="wizimore - nihonbashi.woz" size="234884" crc="9899bbcd" sha1="31da8032f80faad7bc057b1cc66faf8a638dcc03" />
@@ -31414,8 +46492,8 @@ license:CC0-1.0
<info name="programmer" value="Joel Fenton" />
<info name="usage" value="Requires a 48K Apple ][ or later. Scenario disk for Wizardry 1: Proving Grounds of the Mad Overlord." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-21-->
- <!--roleplaying scenario-->
+ <!-- Dump released: 2024-03-21 -->
+ <!-- role-playing scenario -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234889">
<rom name="wizimore - o'connor's mine.woz" size="234889" crc="decf27bd" sha1="6463c751f1378dfbb33c8e9a5bb5f42af739931a" />
@@ -31430,8 +46508,8 @@ license:CC0-1.0
<info name="programmer" value="Joel Fenton" />
<info name="usage" value="Requires a 48K Apple ][ or later. Scenario disk for Wizardry 1: Proving Grounds of the Mad Overlord." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-21-->
- <!--roleplaying scenario-->
+ <!-- Dump released: 2024-03-21 -->
+ <!-- role-playing scenario -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234892">
<rom name="wizimore - the emperor's seal.woz" size="234892" crc="fcee2feb" sha1="b4bc61c77949c2dc59830afbf7c3d6e31ffdd20e" />
@@ -31446,8 +46524,8 @@ license:CC0-1.0
<info name="programmer" value="Joel Fenton" />
<info name="usage" value="Requires a 48K Apple ][ or later. Scenario disk for Wizardry 1: Proving Grounds of the Mad Overlord." />
<sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2024-03-19-->
- <!--roleplaying scenario-->
+ <!-- Dump released: 2024-03-19 -->
+ <!-- role-playing scenario -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234907">
<rom name="wizimore - the scarlet brotherhood of hsi ho.woz" size="234907" crc="c52237ac" sha1="aec32fb58baebb34cb1e0578189781fe958ed9bf" />
@@ -31455,26 +46533,373 @@ license:CC0-1.0
</part>
</software>
- <software name="wcleaderb">
- <description>World Class Leader Board</description>
- <year>1987</year>
- <publisher>Access Software</publisher>
- <info name="programmer" value="Bruce Carver, Roger Carver, and Vance Cook" />
+ <software name="wiziprint">
+ <description>Wiziprint (version 2.01 20-AUG-83)</description>
+ <year>1982</year>
+ <publisher>Sir-Tech Software</publisher>
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Robert J. Woodhead" />
+ <info name="usage" value="Requires a 48K Apple ][ or later." />
+ <info name="version" value="2.01 20-AUG-83" />
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-13 -->
+ <!-- game utility program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234840">
+ <rom name="wiziprint v2.01.woz" size="234840" crc="593dc847" sha1="d8628dbce3441820cbbd2ef4ac5a94421e514226" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizplus">
+ <description>Wizplus</description>
+ <year>1982</year>
+ <publisher>Datamost</publisher>
+ <info name="programmer" value="Thomas A. Conner" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-04-01-->
- <!--sports game-->
- <!--This archive also includes "World Class Famous Course Disk Volume 1", originally sold separately.-->
+ <!-- Dump released: 2020-03-02 -->
+ <!-- game utility program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="wizplus.woz" size="234768" crc="f60920a3" sha1="a640aec03dc8bddf434b43318ae80f54d5c1ab8c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wonderp_525" cloneof="wonderp">
+ <description>Wonderland Puzzles (A-310 version 1.0)</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-310" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-08 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234836">
+ <rom name="wonderland puzzles.woz" size="234836" crc="da667e28" sha1="a4e487b3500f1c1880efa815b83482ca9997ae32" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wonderp">
+ <description>Wonderland Puzzles (A-310 version 1.0) (800K 3.5")</description>
+ <year>1989</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-310" />
+ <info name="programmer" value="Mark Hanson" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Dick Sisco" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296229">
+ <rom name="wonderland puzzles 800k.woz" size="1296229" crc="8ea367e9" sha1="2f293d92dde388e82075aaa6062137cd381233a8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="woolbday">
+ <description>Woolly's Birthday (A-350 version 1.0) (800K 3.5")</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="language" value="English" />
+ <info name="language" value="Spanish" />
+ <info name="partno" value="A-350" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Ruth Kivisto" />
+ <info name="programmer" value="Pat Korn" />
+ <info name="programmer" value="Claudio Valenzuela" />
+ <info name="programmer" value="Ju Chang Wang" />
+ <info name="usage" value="Requires an Apple IIgs, Apple //c+, or 128K Apple //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-06-30 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296222">
+ <rom name="woolly's birthday 800k.woz" size="1296222" crc="a38217f8" sha1="18fdd8d2e5903d0959545de4c7103d35ec997ef8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="woolgard">
+ <description>Woolly's Garden (A-309 version 1.0) (800K 3.5")</description>
+ <year>1992</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-309" />
+ <info name="programmer" value="Beth Bell" />
+ <info name="programmer" value="Eileen Nannen" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Dave Wood" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-25 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296214">
+ <rom name="woolly's garden 800k.woz" size="1296214" crc="0d9c3efc" sha1="0a9f82a523e78b31a578eb712c0580156090b222" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattk091286" cloneof="wordattk">
+ <description>Word Attack! (version 09.12.86)</description>
+ <year>1986</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="09.12.86" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-15 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Side A" />
- <dataarea name="flop" size="234815">
- <rom name="world class leader board side a.woz" size="234815" crc="ac7104f3" sha1="b913bbcab30a3dad52cb28556bdeb4d34e67a4b4" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="241468">
+ <rom name="word attack v091286 side a.woz" size="241468" crc="20938492" sha1="bd3f659c80e3380810b51baa461a4d492540328d" />
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="Side B" />
- <dataarea name="flop" size="241471">
- <rom name="world class leader board side b.woz" size="241471" crc="14e4bd7c" sha1="ee2fa7be8a79549f07f62925c1635b2ed6768ffd" />
+ <feature name="write_protected" value="true" />
+ <dataarea name="flop" size="241468">
+ <rom name="word attack v091286 side b.woz" size="241468" crc="8e9025e1" sha1="b33b36544236bb41f3e4c81b3f1ffca716da9542" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattk">
+ <description>Word Attack! (version 06.01.87) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Richard Eckert" />
+ <info name="programmer" value="Janice Davidson, Ph.D." />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="06.01.87" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296214">
+ <rom name="word attack 800k.woz" size="1296214" crc="05d95b9d" sha1="ab2d4881afeb8197dcecf696db6acc061056d45f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkp">
+ <description>Word Attack Plus! (version 1.2 04.01.88) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.2 04.01.88" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1329012">
+ <rom name="word attack plus 800k.woz" size="1329012" crc="d794d8ad" sha1="261977a948ad76d34dcbdae4ac3314300cc2fea4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkpf">
+ <description>Word Attack Plus! French (version 1.3 09.01.88) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.3 09.01.88" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1330036">
+ <rom name="word attack plus french 800k.woz" size="1330036" crc="4fa72218" sha1="e4704d7382a7f4e2b850928c0597a48fbf06c51a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkps">
+ <description>Word Attack Plus! Spanish (version 1.2, 09.01.88) (800K 3.5")</description>
+ <year>1988</year>
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Jan Davidson" />
+ <info name="programmer" value="Julie Baumgartner" />
+ <info name="programmer" value="J.M. Albanese" />
+ <info name="programmer" value="Kevin R. Burley" />
+ <info name="usage" value="Requires a 128K Apple //e, //c+ or IIgs with compatible drive controller card." />
+ <info name="version" value="1.3 09.01.88" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-09-29 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1329013">
+ <rom name="word attack plus spanish 800k.woz" size="1329013" crc="fc7872de" sha1="ee9e91738a9a2ac6790750490c8948c09e8ccb02" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordmspl">
+ <description>Word Machine &amp; Word Machine with Spelling List</description>
+ <year>1984</year>
+ <publisher>Milliken Publishing Company</publisher>
+ <info name="programmer" value="John W. Ratcliff" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-12-09 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234832">
+ <rom name="word machine and word machine with spelling list.woz" size="234832" crc="3cba5adb" sha1="7e3ed0734bb8323d094bda7d46a4cc495740c3cc" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordmun">
+ <description>Word Munchers (A-153 version 1.4) (800K 3.5")</description>
+ <year>1985</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-153" />
+ <info name="programmer" value="Philip Bouchard" />
+ <info name="programmer" value="Steve Taffee" />
+ <info name="programmer" value="Craig Copley" />
+ <info name="programmer" value="Roger Shimada" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="H. Bill Way" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, //e, or 64K Apple ][+ with a compatible drive controller card." />
+ <info name="version" value="1.4" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2021-08-16 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345282">
+ <rom name="word munchers 800k.woz" size="1345282" crc="fead6f7a" sha1="056730809f1e90b8159e8582eb2709a20bb46509" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wpappl20">
+ <description>Word Processing on the Apple (A-769 version 2.0)</description>
+ <year>1984</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-769" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later and Apple Writer // word processor." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-22 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Task disk (ProDOS)" />
+ <dataarea name="flop" size="234803">
+ <rom name="word processing on the apple v2.0 side a - prodos.woz" size="234803" crc="d2f837b0" sha1="59abacf7555ab1cc6797313e01b1290b1114bc60" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Task disk (DOS 3.3)" />
+ <dataarea name="flop" size="234803">
+ <rom name="word processing on the apple v2.0 side b - dos 3.3.woz" size="234803" crc="81bddcaa" sha1="987dc8e8041bc0e76d2fad40c99a15f251299f9a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordattkg">
+ <description>Wortgefecht</description>
+ <year>1984</year>
+ <publisher>Gessler Educational Software</publisher>
+ <info name="alt_title" value="Word Attack! German"/>
+ <info name="programmer" value="Seth Meyers" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later. The second disk must be writeable." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="234829">
+ <rom name="wortgefect disk 1 - program.woz" size="234829" crc="4b7add8c" sha1="a6aa840d6e202d2607ac92afb71cb82d8b19eb09" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Data" />
+ <dataarea name="flop" size="234826">
+ <rom name="wortgefect disk 2 - data.woz" size="234826" crc="6442a4fd" sha1="5ceee6e5b0b6ab9cb3990529fe20cb32a6830cc2" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordbuild">
+ <description>Word Builder (A-346 version 1.0) (800K 3.5")</description>
+ <year>1994</year>
+ <publisher>MECC</publisher>
+ <info name="partno" value="A-346" />
+ <info name="programmer" value="Rich Bergeron" />
+ <info name="programmer" value="Dee Dee Daus" />
+ <info name="programmer" value="Scott Jensen" />
+ <info name="usage" value="Requires an Apple IIgs, //c+, or 128K //e with a compatible drive controller card." />
+ <info name="version" value="1.0" />
+ <!-- Modified to remove identifying site license information. -->
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296206">
+ <rom name="word builder 800k.woz" size="1296206" crc="0da9b99f" sha1="2643adc1ba4dbfa867a518c1bbc29133fd717cc3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wqstbss">
+ <description>Word Quest: Binary Search Strategies</description>
+ <year>1985</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Judah L. Schwartz" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-05-14 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234826">
+ <rom name="word quest- binary search strategies.woz" size="234826" crc="a559b0c3" sha1="fcfa01b5a2ae6fec3f348f8059730b3834267e93" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrdspinr">
+ <description>Word Spinner (version 1.0)</description>
+ <year>1984</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Dale Disharoon" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-02-21 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="73025">
+ <rom name="word spinner.woz" size="73025" crc="c6c1b178" sha1="6d2528a5908feae6b73511d29f5f967307445b1a" />
</dataarea>
</part>
</software>
@@ -31486,8 +46911,8 @@ license:CC0-1.0
<info name="developer" value="Micrograms Publishing" />
<info name="usage" value="Requires a 64K Apple ][+ or later." />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2019-11-03-->
- <!--educational program-->
+ <!-- Dump released: 2019-11-03 -->
+ <!-- educational program -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disk 1 - Beginning" />
<dataarea name="flop" size="235499">
@@ -31502,15 +46927,304 @@ license:CC0-1.0
</part>
</software>
- <software name="zenithg">
- <description>Zenith</description>
+ <software name="wrdsconc">
+ <description>Words &amp; Concepts</description>
+ <year>1987</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox" />
+ <info name="programmer" value="Mary Sweig Wilson" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-10 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234806">
+ <rom name="words and concepts.woz" size="234806" crc="2e4cb631" sha1="d7f8f5f0ee3a33dae382f0e0d18472ff26e2543e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordamat">
+ <description>Word-a-Mation: Exploring Word Relationships</description>
+ <year>1986</year>
+ <publisher>Sunburst Communications</publisher>
+ <info name="programmer" value="Glenn M. Kleiman" />
+ <info name="programmer" value="Jillian Dorman" />
+ <info name="programmer" value="J.B. Shelton" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234771">
+ <rom name="word-a-mation.woz" size="234771" crc="565d095c" sha1="97d7e2792aec1c47bfe2fe811420750b0f56c13b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordfind">
+ <description>WordFinder</description>
+ <year>1985</year>
+ <publisher>Holt Courseware</publisher>
+ <info name="developer" value="Holt Courseware" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="241395">
+ <rom name="wordfinder.woz" size="241395" crc="ed53605a" sha1="64e43e096b399f423b430b6058f844dbee4777f6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wcleaderb">
+ <description>World Class Leader Board</description>
+ <year>1987</year>
+ <publisher>Access Software</publisher>
+ <info name="programmer" value="Bruce Carver" />
+ <info name="programmer" value="Roger Carver" />
+ <info name="programmer" value="Vance Cook" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2022-04-01 -->
+ <!-- sports game -->
+ <!-- This archive also includes "World Class Famous Course Disk Volume 1", originally sold separately. -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234815">
+ <rom name="world class leader board side a.woz" size="234815" crc="ac7104f3" sha1="b913bbcab30a3dad52cb28556bdeb4d34e67a4b4" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241471">
+ <rom name="world class leader board side b.woz" size="241471" crc="14e4bd7c" sha1="ee2fa7be8a79549f07f62925c1635b2ed6768ffd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wldgames">
+ <description>World Games</description>
+ <year>1987</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Jimmy Huey" />
+ <info name="programmer" value="Brian Massey" />
+ <info name="programmer" value="Steve Baker" />
+ <info name="programmer" value="Ken Rogoway" />
+ <info name="programmer" value="Lee Powell" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-07 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A" />
+ <dataarea name="flop" size="234791">
+ <rom name="world games disk 1a.woz" size="234791" crc="c722ae5d" sha1="2b9fc2a7093fdcb874ac195ff0b688d4d56a1a47" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B" />
+ <dataarea name="flop" size="234791">
+ <rom name="world games disk 1b.woz" size="234791" crc="625223f6" sha1="8a6acf1944d887375b67e9ee6fca3c0c754a45a4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A" />
+ <dataarea name="flop" size="234791">
+ <rom name="world games disk 2a.woz" size="234791" crc="653ddd83" sha1="dbd90c9ba7ef40909533355a9a6b2743fe6dfd00" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B" />
+ <dataarea name="flop" size="234791">
+ <rom name="world games disk 2b.woz" size="234791" crc="139843bc" sha1="8ddc3265be97f3d6a375671ab1a7a9f5341ccb18" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wkchamp">
+ <description>World Karate Championship</description>
+ <year>1986</year>
+ <publisher>Epyx</publisher>
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Mike Patrick" />
+ <info name="programmer" value="Mike Packard" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-12-04 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233482">
+ <rom name="world karate championship.woz" size="233482" crc="e8030bd9" sha1="3d0569e44a9520a3e27eb50e67f67f4362e1edc8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wirpctcp">
+ <description>Write It Right!: Punctuation and Capitalization</description>
+ <year>1990</year>
+ <publisher>Troll Associates</publisher>
+ <info name="programmer" value="Nancy Patrissi" />
+ <info name="programmer" value="Toby Schack" />
+ <info name="programmer" value="Thomas Whiting" />
+ <info name="programmer" value="Greg Truex" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-08-26 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234848">
+ <rom name="write it right- punctuation and capitalization.woz" size="234848" crc="8d8a1f89" sha1="86ae9ecb8079e717f12a8f35a7d554ca4b5c9a1b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrabbt10" cloneof="wrabbt">
+ <description>Writer Rabbit (version 1.0)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="programmer" value="Gene Genoar" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="programmer" value="Shaun Gordon" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Murray Suid" />
+ <info name="programmer" value="Anna Suid" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.0" />
+ <!-- Includes a one-time backup utility (press B at the level selection screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234864">
+ <rom name="writer rabbit v1.0 side a.woz" size="234864" crc="4ab97908" sha1="85725b6954711961581a20a9aa18870c08088d1a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234864">
+ <rom name="writer rabbit v1.0 side b.woz" size="234864" crc="5cc39910" sha1="7efc44e6b83e133876ec9a03f1e6f0139a96720d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrabbt12" cloneof="wrabbt">
+ <description>Writer Rabbit (version 1.2)</description>
+ <year>1986</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="programmer" value="Gene Genoar" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="programmer" value="Shaun Gordon" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Murray Suid" />
+ <info name="programmer" value="Anna Suid" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.2" />
+ <!-- Includes a one-time backup utility (press B at the level selection screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-17 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234864">
+ <rom name="writer rabbit v1.2 side a.woz" size="234864" crc="ee09b000" sha1="82ce60369e297f0e90a21d532dfe7e365a15234f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234864">
+ <rom name="writer rabbit v1.2 side b.woz" size="234864" crc="4c79dc67" sha1="d002934b06d62314db05750aeaf067a02a51ef50" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wrabbt">
+ <description>Writer Rabbit (version 1.3)</description>
+ <year>1987</year>
+ <publisher>The Learning Company</publisher>
+ <info name="programmer" value="Leslie Grimm" />
+ <info name="programmer" value="Dennis Caswell" />
+ <info name="programmer" value="Gene Genoar" />
+ <info name="programmer" value="Sid Weber" />
+ <info name="programmer" value="Shaun Gordon" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Murray Suid" />
+ <info name="programmer" value="Anna Suid" />
+ <info name="usage" value="Requires a 64K Apple ][+ or later." />
+ <info name="version" value="1.3" />
+ <!-- Includes a one-time backup utility (press B at the level selection screen) which has not been used. -->
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-06-04 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234859">
+ <rom name="writer rabbit v1.3 side a.woz" size="234859" crc="05a5d952" sha1="ff4029d09cb54e5e98b250f16b6c5bd05a45a4f3" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="241515">
+ <rom name="writer rabbit v1.3 side b.woz" size="241515" crc="6807af6f" sha1="ad144ed23f61e29c777824fc9656498328ca5a42" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="xevious">
+ <description>Xevious</description>
+ <year>1984</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Dan Hewitt" />
+ <info name="usage" value="Requires a 64K Apple ][+, //e, //c, or IIgs." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2018-08-25 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="233465">
+ <rom name="xevious.woz" size="233465" crc="97586f7c" sha1="06e17e91e2490952013d407c2234b27677c16090" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="xyphus">
+ <description>Xyphus</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="programmer" value="Skip Waller" />
+ <info name="programmer" value="Dave Albert" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2020-01-14 -->
+ <!-- role-playing game -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A - Program" />
+ <dataarea name="flop" size="121619">
+ <rom name="xyphus - program disk.woz" size="121619" crc="9126e743" sha1="04d5ad0a6a547cc672769f0512d374072ad0d950" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B - Scenario" />
+ <dataarea name="flop" size="221460">
+ <rom name="xyphus - scenario disk.woz" size="221460" crc="081fa985" sha1="116c2cdd0240393c2920c665fc0a251e6d5b8bf5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zenithg" cloneof="zenith">
+ <description>Zenith (Gebelli Software)</description>
<year>1982</year>
<publisher>Gebelli Software</publisher>
<info name="programmer" value="Nasir Gebelli" />
- <info name="usage" value="Runs on a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later systems." />
+ <info name="usage" value="Runs on a 48K Apple ][, ][+, or unenhanced //e. Due to aggressive copy protection, it will not run on later models without nonstandard firmware." />
<sharedfeat name="compatibility" value="A2,A2P,A2E" />
- <!--Dump released: 2023-07-26-->
- <!--action game-->
+ <!-- Dump released: 2023-07-26 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="361742">
<rom name="zenith.woz" size="361742" crc="b6f71e0d" sha1="cbac6dbfcc85d407282ee18e8fb02ecc870feba2" />
@@ -31518,6 +47232,23 @@ license:CC0-1.0
</part>
</software>
+ <software name="zenith">
+ <description>Zenith (Softsmith)</description>
+ <year>1983</year>
+ <publisher>Softsmith</publisher>
+ <info name="original_publisher" value="Gebelli Software" />
+ <info name="programmer" value="Nasir Gebelli" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2024-11-14 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="121598">
+ <rom name="zenith (softsmith).woz" size="121598" crc="eec70160" sha1="e7f867d2120c40bf27736568ce8bfbae4d73fd96" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="zoomastrr1">
<description>Zoo Master (revision 1)</description>
<year>1983</year>
@@ -31526,8 +47257,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 48K Apple ][+ or later." />
<info name="version" value="revision 1" />
<sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
- <!--Dump released: 2022-02-21-->
- <!--action game-->
+ <!-- Dump released: 2022-02-21 -->
+ <!-- action game -->
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="234801">
<rom name="zoo master.woz" size="234801" crc="66aab725" sha1="95a95110678e2a82fbddf4145610304286a3c51e" />
@@ -31535,4 +47266,45 @@ license:CC0-1.0
</part>
</software>
+ <software name="zoopupth">
+ <description>Zoo Puppet Theater</description>
+ <year>1989</year>
+ <publisher>Electronic Courseware Systems</publisher>
+ <info name="developer" value="Electronic Courseware Systems" />
+ <info name="usage" value="Requires a 48K Apple ][+ or later." />
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2025-03-19 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234796">
+ <rom name="zoo puppet theater.woz" size="234796" crc="1cabcf6d" sha1="93add02c308d4a61da513adb4e11ab4d434c6987" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zoyonpat">
+ <description>Zoyon Patrol (A-199 version 1.0)</description>
+ <year>1987</year>
+ <publisher>MECC</publisher>
+ <info name="developer" value="MECC" />
+ <info name="partno" value="A-199" />
+ <info name="usage" value="Requires a 128K Apple //e or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS" />
+ <!-- Dump released: 2023-06-23 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A" />
+ <dataarea name="flop" size="234785">
+ <rom name="zoyon patrol v1.0 side a.woz" size="234785" crc="bbc55637" sha1="a08f8bc01e4c29f842715e5f95d799338a4da29a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B" />
+ <dataarea name="flop" size="234785">
+ <rom name="zoyon patrol v1.0 side b.woz" size="234785" crc="3d07b6c2" sha1="dfbaa413a575e90d3724be8ba61074573bbad47a" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/apple2_rom.xml b/hash/apple2_rom.xml
new file mode 100644
index 00000000000..7c49010db2e
--- /dev/null
+++ b/hash/apple2_rom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+-->
+
+<softwarelist name="apple2_rom" description="Apple II ROM images">
+
+ <software name="aid1">
+ <description>Programmer's Aid #1</description>
+ <year>1978</year>
+ <publisher>Apple Computer</publisher>
+ <info name="partno" value="A2M0019" />
+ <!-- This collection of utilities for Integer BASIC programmers was the only software Apple released for the original Apple II's empty ROM sockets. It was included as standard on some later-produced Apple IIs and the Integer BASIC firmware card. -->
+ <part name="d0" interface="apple2_d0_rom">
+ <dataarea name="rom" size="2048">
+ <rom name="341-0016-00.d0" size="2048" crc="4234e88a" sha1="c9a81d704dc2f0c3416c20f9c4ab71fedda937ed"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="inspect">
+ <description>The Inspector</description>
+ <year>1981</year>
+ <publisher>Omega Software Products</publisher>
+ <part name="d8" interface="apple2_d8_rom">
+ <dataarea name="rom" size="2048">
+ <rom name="inspector.d8" size="2048" crc="20d59f4f" sha1="2d8fdec2d1a28d54ebc218b54a16f0cae33943d6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="watson">
+ <description>Watson</description>
+ <year>1982</year>
+ <publisher>Omega Microware</publisher>
+ <info name="usage" value="Requires The Inspector" />
+ <part name="d0" interface="apple2_d0_rom">
+ <dataarea name="rom" size="2048">
+ <rom name="watson.d0" size="2048" crc="c9ecbfc3" sha1="c15390d86bfcad9c03230b3900cdace396d80bf2"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/apple2gs_flop_clcracked.xml b/hash/apple2gs_flop_clcracked.xml
index e9e7a80a834..254bc89d9ef 100644
--- a/hash/apple2gs_flop_clcracked.xml
+++ b/hash/apple2gs_flop_clcracked.xml
@@ -10,7 +10,9 @@ license:CC0-1.0
<description>4th &amp; Inches (cleanly cracked)</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Tony Manso, Ed Bogas, Les Pardew" />
+ <info name="programmer" value="Tony Manso" />
+ <info name="programmer" value="Ed Bogas" />
+ <info name="programmer" value="Les Pardew" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
@@ -37,12 +39,14 @@ license:CC0-1.0
<description>Aesop's Fables (cleanly cracked)</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas, Joseph Hewitt IV, and June Stark" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="Joseph Hewitt IV" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Aesop's Fables" is a 1988 educational program developed by William Demas, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "Aesop's Fables" is a 1988 educational program developed by William Demas, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -63,12 +67,14 @@ license:CC0-1.0
<description>All About America (cleanly cracked)</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stanley Brewster, June Stark, and Joseph B. Hewitt IV" />
+ <info name="programmer" value="Stanley Brewster" />
+ <info name="programmer" value="June Stark" />
+ <info name="programmer" value="Joseph B. Hewitt IV" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 03." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K ROM3 Apple IIgs. (crashes on ROM01 Apple IIgs?) -->
- <!--"All About America" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "All About America" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -93,7 +99,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Ancient Land of Ys" is a 1989 fantasy role playing game developed by Kyodai and distributed by Brøderbund. -->
+ <!-- "Ancient Land of Ys" is a 1989 fantasy role playing game developed by Kyodai and distributed by Brøderbund. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -114,13 +120,14 @@ license:CC0-1.0
<description>Arkanoid (version 12-Jan-89) (cleanly cracked)</description>
<year>1988</year>
<publisher>Taito</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
- <info name="version" value="12-Jan-89" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
+ <info name="version" value="12-Jan-89 - ROM 03 compatible" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs -->
- <!--"Arkanoid" is a 1988 action game developed by Ryan Ridges and John Lund, and distributed by Taito America. -->
+ <!-- "Arkanoid" is a 1988 action game developed by Ryan Ridges and John Lund, and distributed by Taito America. -->
<!-- The copy protection routines are not compatible with the ROM03, however the cracked version runs on any 512K Apple IIgs -->
<!-- ark.s16 dated 12-Jan-89 -->
<!-- Protection: Excessive zero bits after D5 CC AA header. Then 4 bytes are read through 4 loops with matches recorded. Read matches must equal less then 12 out of 16 reads -->
@@ -136,13 +143,14 @@ license:CC0-1.0
<description>Arkanoid II: Revenge of Doh (version 29-Aug-89) (cleanly cracked)</description>
<year>1989</year>
<publisher>Taito</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
<info name="version" value="29-Aug-89" />
<info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs ROM01 or later. -->
- <!--"Arkanoid II" is a 1989 action game developed by Ryan Ridges and John Lund, and distributed by Taito America. -->
+ <!-- "Arkanoid II" is a 1989 action game developed by Ryan Ridges and John Lund, and distributed by Taito America. -->
<!-- ark.s16 dated 29-Aug-89 -->
<!-- Protection: Excessive zero bits after D5 CC AA header. Then 4 bytes are read through 4 loops with matches recorded. Read matches must equal less then 12 out of 16 reads -->
@@ -157,13 +165,14 @@ license:CC0-1.0
<description>Arkanoid II: Revenge of Doh (version 18-Jul-89) (cleanly cracked)</description>
<year>1989</year>
<publisher>Taito</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
<info name="version" value="18-Jul-89" />
<info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs ROM01 or later. -->
- <!--"Arkanoid II" is a 1989 action game developed by Ryan Ridges and John Lund, and distributed by Taito America. -->
+ <!-- "Arkanoid II" is a 1989 action game developed by Ryan Ridges and John Lund, and distributed by Taito America. -->
<!-- ark.s16 dated 18-Jul-89 -->
<!-- Protection: Excessive zero bits after D5 CC AA header. Then 4 bytes are read through 4 loops with matches recorded. Read matches must equal less then 12 out of 16 reads -->
@@ -175,17 +184,24 @@ license:CC0-1.0
</software>
<software name="btlchess">
- <description>Battle Chess (cleanly cracked)</description>
+ <description>Battle Chess (trex crack)</description>
<year>1989</year>
- <publisher>Interplay</publisher>
- <info name="programmer" value="Jim Sproul, Todd J. Camasta, Bruce Schlickbernd, Kurt Heiden, Bill (Weez) Dugan, Thomas R. Decker, Troy P. Worrell, Michael Quarles, Rebecca Heineman, and Alan Pavlish" />
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Jim Sproul" />
+ <info name="programmer" value="Todd J. Camasta" />
+ <info name="programmer" value="Bruce Schlickbernd" />
+ <info name="programmer" value="Kurt Heiden" />
+ <info name="programmer" value="Bill (Weez) Dugan" />
+ <info name="programmer" value="Thomas R. Decker" />
+ <info name="programmer" value="Troy P. Worrell" />
+ <info name="programmer" value="Michael Quarles" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Alan Pavlish" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Battle Chess" is a 1989 board game developed by Jim Sproul, Todd J. Camasta, Bruce Schlickbernd, Kurt Heiden, Bill (Weez) Dugan, Thomas R. Decker, Troy P. Worrell, Michael Quarles, Rebecca Heineman, and Alan Pavlish, and distributed by Interplay. -->
+ <!-- board game. The manual at https://archive.org/details/Battle_Chess_Manual contains the information you need for the copy protection questions -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="battle chess iigs (trex crack).2mg" size="819264" crc="f40de0f7" sha1="8cd2fc36064fe531172d532db948865bce36307a"/>
@@ -197,13 +213,17 @@ license:CC0-1.0
<description>Block Out (version 1.0) (cleanly cracked)</description>
<year>1989</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Alexander Ustaszewski, Marek Jackiewicz, Adam Skorupinski, Marcin Szostakowski, and Marcin Grzegorzewski" />
+ <info name="programmer" value="Alexander Ustaszewski" />
+ <info name="programmer" value="Marek Jackiewicz" />
+ <info name="programmer" value="Adam Skorupinski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Marcin Grzegorzewski" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Block Out" is a 1989 action game developed by Alexander Ustaszewski, Marek Jackiewicz, Adam Skorupinski, Marcin Szostakowski, and Marcin Grzegorzewski, and distributed by California Dreams. -->
+ <!-- "Block Out" is a 1989 action game developed by Alexander Ustaszewski, Marek Jackiewicz, Adam Skorupinski, Marcin Szostakowski, and Marcin Grzegorzewski, and distributed by California Dreams. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -221,7 +241,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Bubble Ghost" is a 1988 action game developed by Infogrames and distributed by Accolade. -->
+ <!-- "Bubble Ghost" is a 1988 action game developed by Infogrames and distributed by Accolade. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -240,7 +260,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Bubble Ghost" is a 1988 action game developed by Infogrames and distributed by Accolade. -->
+ <!-- "Bubble Ghost" is a 1988 action game developed by Infogrames and distributed by Accolade. -->
<!-- Hard coded path names were replaced with names to use current volume / directory -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
@@ -256,13 +276,17 @@ license:CC0-1.0
<year>1987</year>
<publisher>MECC</publisher>
<info name="partno" value="A-194" />
- <info name="programmer" value="Gene Breault, Charolyn Kapplinger, Diane Portner, Steven D. Splinter, and Paul R. Wenker" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="Paul R. Wenker" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2GS" />
- <!--Dump released: 2021-08-13-->
- <!--productivity program-->
- <!--Protection: Bad block check for block $8-->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- productivity program -->
+ <!-- Protection: Bad block check for block $8 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="calendar crafter v1.2 iigs(trex crack).2mg" size="819264" crc="65717231" sha1="2f2415385a699fc78a68a3a73ff8470a5fc8df6f"/>
@@ -271,17 +295,21 @@ license:CC0-1.0
</software>
<software name="calgames">
- <description>California Games (cleanly cracked)</description>
+ <description>California Games (trex crack)</description>
<year>1988</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Jimmy Huey, Dan Chang, Jenny Martin, Sheryl Knowles, Bill Bogenreif, Matt Householder, and Ron Fortier" />
+ <info name="programmer" value="Jimmy Huey" />
+ <info name="programmer" value="Dan Chang" />
+ <info name="programmer" value="Jenny Martin" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Bill Bogenreif" />
+ <info name="programmer" value="Matt Householder" />
+ <info name="programmer" value="Ron Fortier" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"California Games" is a 1988 sports game developed by Jimmy Huey, Dan Chang, Jenny Martin, Sheryl Knowles, Bill Bogenreif, Matt Householder, and Ron Fortier, and distributed by Epyx. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="california games iigs (trex crack).2mg" size="819264" crc="908b7825" sha1="d276969f7e11b493d10fb2d7b2943c3e668864aa"/>
@@ -290,17 +318,19 @@ license:CC0-1.0
</software>
<software name="captbld">
- <description>Captain Blood (cleanly cracked)</description>
+ <description>Captain Blood (trex crack)</description>
<year>1989</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Philippe Ulrich, Didier Bouchon, Jean-Michel Jarre, Alexis Martial, and Michael Rho" />
+ <info name="programmer" value="Philippe Ulrich" />
+ <info name="programmer" value="Didier Bouchon" />
+ <info name="programmer" value="Jean-Michel Jarre" />
+ <info name="programmer" value="Alexis Martial" />
+ <info name="programmer" value="Michael Rho" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Captain Blood" is a 1989 simulation game developed by Philippe Ulrich, Didier Bouchon, Jean-Michel Jarre, Alexis Martial, and Michael Rho, and distributed by Mindscape. -->
+ <!-- simulation game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="captain blood iigs (trex crack).2mg" size="819264" crc="7b2dede6" sha1="6ead26e7e2c4d3bb65b3d91e13df784503c9e643"/>
@@ -312,12 +342,13 @@ license:CC0-1.0
<description>Cavern Cobra (cleanly cracked)</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Greg Hale and Richard L. Seaborne" />
+ <info name="programmer" value="Greg Hale" />
+ <info name="programmer" value="Richard L. Seaborne" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Cavern Cobra" is a 1987 action game developed by Greg Hale and Richard L. Seaborne, and distributed by PBI Software. -->
+ <!-- "Cavern Cobra" is a 1987 action game developed by Greg Hale and Richard L. Seaborne, and distributed by PBI Software. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -331,13 +362,17 @@ license:CC0-1.0
<description>Club Backgammon (version 2.0) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Staszek Bartkowski, Jarek Olszewski, Dorota B&#x142;aszczak, Maciej Markuszewski, and Marcin Szostakowski" />
+ <info name="programmer" value="Staszek Bartkowski" />
+ <info name="programmer" value="Jarek Olszewski" />
+ <info name="programmer" value="Dorota B&#x142;aszczak" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Marcin Szostakowski" />
<info name="version" value="2.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Club Backgammon" is a 1988 board game developed by Staszek Bartkowski, Jarek Olszewski, Dorota Błaszczak, Maciej Markuszewski, and Marcin Szostakowski, and distributed by California Dreams. -->
+ <!-- "Club Backgammon" is a 1988 board game developed by Staszek Bartkowski, Jarek Olszewski, Dorota Błaszczak, Maciej Markuszewski, and Marcin Szostakowski, and distributed by California Dreams. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -351,13 +386,17 @@ license:CC0-1.0
<description>Club Backgammon (version 1.0) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Staszek Bartkowski, Jarek Olszewski, Dorota B&#x142;aszczak, Maciej Markuszewski, and Marcin Szostakowski" />
+ <info name="programmer" value="Staszek Bartkowski" />
+ <info name="programmer" value="Jarek Olszewski" />
+ <info name="programmer" value="Dorota B&#x142;aszczak" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Marcin Szostakowski" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Club Backgammon" is a 1988 board game developed by Staszek Bartkowski, Jarek Olszewski, Dorota Błaszczak, Maciej Markuszewski, and Marcin Szostakowski, and distributed by California Dreams. -->
+ <!-- "Club Backgammon" is a 1988 board game developed by Staszek Bartkowski, Jarek Olszewski, Dorota Błaszczak, Maciej Markuszewski, and Marcin Szostakowski, and distributed by California Dreams. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -371,13 +410,16 @@ license:CC0-1.0
<description>Cribbage King / Gin King (version 1.01) (cleanly cracked)</description>
<year>1989</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="Mark Manyen, Don Laabs, David M. Linnehan, and Elizabeth Scafati" />
+ <info name="programmer" value="Mark Manyen" />
+ <info name="programmer" value="Don Laabs" />
+ <info name="programmer" value="David M. Linnehan" />
+ <info name="programmer" value="Elizabeth Scafati" />
<info name="version" value="1.01" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1MB Apple IIgs. -->
- <!--"Cribbage King / Gin King" is a 1989 board game developed by Mark Manyen, Don Laabs, David M. Linnehan, and Elizabeth Scafati, and distributed by The Software Toolworks. -->
+ <!-- "Cribbage King / Gin King" is a 1989 board game developed by Mark Manyen, Don Laabs, David M. Linnehan, and Elizabeth Scafati, and distributed by The Software Toolworks. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -398,12 +440,27 @@ license:CC0-1.0
<description>Defender of the Crown (cleanly cracked)</description>
<year>1988</year>
<publisher>Cinemaware</publisher>
- <info name="programmer" value="Kellyn Beeck, James Sachs, Ivan Manley, Robert Jacob, Phyllis Jacob, Pat Cook, Jim Cuomo, Tom Warner, Jeff Hilbers, Steve Quinn, Richard La Barre, John Cutter, Rob Landeros, Doug Smith, Betsy Scafati, and Wayne Brockman" />
+ <info name="programmer" value="Kellyn Beeck" />
+ <info name="programmer" value="James Sachs" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="programmer" value="Robert Jacob" />
+ <info name="programmer" value="Phyllis Jacob" />
+ <info name="programmer" value="Pat Cook" />
+ <info name="programmer" value="Jim Cuomo" />
+ <info name="programmer" value="Tom Warner" />
+ <info name="programmer" value="Jeff Hilbers" />
+ <info name="programmer" value="Steve Quinn" />
+ <info name="programmer" value="Richard La Barre" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Rob Landeros" />
+ <info name="programmer" value="Doug Smith" />
+ <info name="programmer" value="Betsy Scafati" />
+ <info name="programmer" value="Wayne Brockman" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Defender of the Crown" is a 1988 adventure game developed by Kellyn Beeck, James Sachs, Ivan Manley, Robert Jacob, Phyllis Jacob, Pat Cook, Jim Cuomo, Tom Warner, Jeff Hilbers, Steve Quinn, Richard La Barre, John Cutter, Rob Landeros, Doug Smith, Betsy Scafati, and Wayne Brockman, and distributed by Cinemaware Corporation. -->
+ <!-- "Defender of the Crown" is a 1988 adventure game developed by Kellyn Beeck, James Sachs, Ivan Manley, Robert Jacob, Phyllis Jacob, Pat Cook, Jim Cuomo, Tom Warner, Jeff Hilbers, Steve Quinn, Richard La Barre, John Cutter, Rob Landeros, Doug Smith, Betsy Scafati, and Wayne Brockman, and distributed by Cinemaware Corporation. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -424,12 +481,24 @@ license:CC0-1.0
<description>Déjà Vu (cleanly cracked)</description>
<year>1988</year>
<publisher>ICOM Simulations</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Kurt Nelson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldermar Horwat, Mark Waterman, and Tod Zipnick" />
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="Craig Erickson" />
+ <info name="programmer" value="Kurt Nelson" />
+ <info name="programmer" value="Steven Hays" />
+ <info name="programmer" value="Terry Schulenburg" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldermar Horwat" />
+ <info name="programmer" value="Mark Waterman" />
+ <info name="programmer" value="Tod Zipnick" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs ROM01 or later. -->
- <!--"Deja Vu" is a 1988 adventure game developed by Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Kurt Nelson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldermar Horwat, Mark Waterman, and Tod Zipnick, and distributed by ICOM Simulations. -->
+ <!-- "Deja Vu" is a 1988 adventure game developed by Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Kurt Nelson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldermar Horwat, Mark Waterman, and Tod Zipnick, and distributed by ICOM Simulations. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -450,12 +519,26 @@ license:CC0-1.0
<description>Déjà Vu II: Lost in Las Vegas (cleanly cracked)</description>
<year>1989</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Michael Manning, Todd Squires, David Feldman, Paul Snively, Brian Baker, Karl Roelofs, Ed Dluzen, Darin Adler, Jay Zipnick, Waldemar Horwat, Julia Ulano, Tod Zipnick, and Mitch Adler" />
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Michael Manning" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="David Feldman" />
+ <info name="programmer" value="Paul Snively" />
+ <info name="programmer" value="Brian Baker" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Ed Dluzen" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldemar Horwat" />
+ <info name="programmer" value="Julia Ulano" />
+ <info name="programmer" value="Tod Zipnick" />
+ <info name="programmer" value="Mitch Adler" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Déjà Vu II: Lost in Las Vegas" is a 1989 adventure game developed by Fred Allen, David Marsh, Michael Manning, Todd Squires, David Feldman, Paul Snively, Brian Baker, Karl Roelofs, Ed Dluzen, Darin Adler, Jay Zipnick, Waldemar Horwat, Julia Ulano, Tod Zipnick, and Mitch Adler, and distributed by Mindscape. -->
+ <!-- "Déjà Vu II: Lost in Las Vegas" is a 1989 adventure game developed by Fred Allen, David Marsh, Michael Manning, Todd Squires, David Feldman, Paul Snively, Brian Baker, Karl Roelofs, Ed Dluzen, Darin Adler, Jay Zipnick, Waldemar Horwat, Julia Ulano, Tod Zipnick, and Mitch Adler, and distributed by Mindscape. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -477,12 +560,15 @@ license:CC0-1.0
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-252" />
- <info name="programmer" value="Diane Portner, Michael Stein, Brian Walker, and Paul Wenker" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Paul Wenker" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
- <!--Dump released: 2021-08-13-->
- <!--desktop publishing program-->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- desktop publishing program -->
<!-- Protection: Bad block check for block $8 -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - System disk"/>
@@ -503,12 +589,15 @@ license:CC0-1.0
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-223" />
- <info name="programmer" value="Susan Gabrys, John J. Krenz, Diane Portner, and Steve Splinter" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steve Splinter" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
- <!--Dump released: 2021-08-13-->
- <!--desktop publishing program-->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- desktop publishing program -->
<!-- Protection: Bad block check for block $8 -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - System disk"/>
@@ -525,17 +614,16 @@ license:CC0-1.0
</software>
<software name="destryr">
- <description>Destroyer (cleanly cracked)</description>
+ <description>Destroyer (trex crack)</description>
<year>1987</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Michael Kosaka and Chuck Sommerville" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Chuck Sommerville" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Destroyer" is a 1987 simulation game developed by Michael Kosaka and Chuck Sommerville, and distributed by Epyx. -->
<!-- Protection: Nibble count on tracks $20 & $21 - 10 separate occurrences (Yes 10!) -->
-
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="destroyer iigs (trex crack).2mg" size="819264" crc="a6943b6d" sha1="2160a034da86a894a0615490d55b8c585f0e1fcc"/>
@@ -544,7 +632,7 @@ license:CC0-1.0
</software>
<software name="dhilchl">
- <description>Downhill Challenge (cleanly cracked)</description>
+ <description>Downhill Challenge (trex crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
<info name="author" value="Christian Bertrand" />
@@ -552,10 +640,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Downhill Challenge" is a 1989 sports game designed by Christian Bertrand, ported to the Apple IIgs by Jean Claude Levy, and distributed by Brøderbund Software. -->
+ <!-- sports game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - System disk"/>
<dataarea name="flop" size="819264">
@@ -570,46 +656,63 @@ license:CC0-1.0
</part>
</software>
- <software name="fantavsn">
- <description>Fantavision (version 2.1) (cleanly cracked)</description>
+ <software name="drawplus10">
+ <description>Draw Plus (version 1.0) (cleanly cracked)</description>
+ <year>1987</year>
+ <publisher>Activision</publisher>
+ <info name="programmer" value="H. Lamiraux" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-01-25 -->
+ <!-- It requires a 512K Apple IIgs. -->
+ <!-- "Draw Plus" is full-color precision drawing program with text and graphics intergraion. -->
+ <!-- Protection: Bad block check for block $7, later versions dropped the copy protection -->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="draw plus v1.0 iigs (trex crack).2mg" size="819264" crc="efddd532" sha1="518ccb81ca6c20686e18c5a88b3d54708c62aba1" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fantvisn10" cloneof="fantvisn">
+ <description>Fantavision (version 1.0) (trex crack)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Scott Anderson and Ken Rosen" />
- <info name="version" value="2.1" />
+ <info name="programmer" value="Scott Anderson" />
+ <info name="programmer" value="Ken Rosen" />
+ <info name="version" value="1.0" />
<info name="usage" value="Requires a 256K Apple IIgs ROM 01 or earlier." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs ROM 01 or earlier. -->
- <!-- NOT Compatible with the Apple IIgs ROM03. -->
- <!--"Fantavision IIgs" is a 1987 graphics program developed by Scott Anderson and Ken Rosen, and distributed by Brøderbund Software. -->
- <!-- About screen shows "BrøderbundS NEW FANTAVISION GS" -->
+ <!-- About screen shows "Brøderbund presents FANTAVISION" -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="fantavision v2.1 iigs (trex crack).2mg" size="819264" crc="e0430e48" sha1="cb7762e193296cb3648687424b5911ea4c8d3902"/>
+ <rom name="fantavision v1.0 iigs (trex crack).2mg" size="819264" crc="0a94d284" sha1="09ee33786fef5f1d1eaadeb85ba275c9a451f003"/>
</dataarea>
</part>
</software>
- <software name="fantavsna" cloneof="fantavsn">
- <description>Fantavision (version 1.0) (cleanly cracked)</description>
+ <software name="fantvisn">
+ <description>Fantavision (version 2.1) (trex crack)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Scott Anderson and Ken Rosen" />
- <info name="version" value="1.0" />
+ <info name="programmer" value="Scott Anderson" />
+ <info name="programmer" value="Ken Rosen" />
+ <info name="version" value="2.1" />
<info name="usage" value="Requires a 256K Apple IIgs ROM 01 or earlier." />
+ <!-- NOT Compatible with the Apple IIgs ROM03. -->
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs ROM 01 or earlier. -->
- <!-- NOT Compatible with the Apple IIgs ROM03. -->
- <!--"Fantavision IIgs" is a 1987 graphics program developed by Scott Anderson and Ken Rosen, and distributed by Brøderbund Software. -->
- <!-- About screen shows "Brøderbund presents FANTAVISION" -->
+ <!-- About screen shows "BrøderbundS NEW FANTAVISION GS" -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="fantavision v1.0 iigs (trex crack).2mg" size="819264" crc="0a94d284" sha1="09ee33786fef5f1d1eaadeb85ba275c9a451f003"/>
+ <rom name="fantavision v2.1 iigs (trex crack).2mg" size="819264" crc="e0430e48" sha1="cb7762e193296cb3648687424b5911ea4c8d3902"/>
</dataarea>
</part>
</software>
@@ -618,12 +721,16 @@ license:CC0-1.0
<description>Fast Break (cleanly cracked)</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Steve Cartwright, Greg Hospelhorn, George Wong, Pam Levins, and Roseann Mitchell" />
+ <info name="programmer" value="Steve Cartwright" />
+ <info name="programmer" value="Greg Hospelhorn" />
+ <info name="programmer" value="George Wong" />
+ <info name="programmer" value="Pam Levins" />
+ <info name="programmer" value="Roseann Mitchell" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Fast Break" is a 1989 sports game developed by Steve Cartwright, Greg Hospelhorn, George Wong, Pam Levins, and Roseann Mitchell, and distributed by Accolade. -->
+ <!-- "Fast Break" is a 1989 sports game developed by Steve Cartwright, Greg Hospelhorn, George Wong, Pam Levins, and Roseann Mitchell, and distributed by Accolade. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -641,7 +748,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Final Assault" is a 1988 sports game developed by Infogrames and distributed by Epyx. -->
+ <!-- "Final Assault" is a 1988 sports game developed by Infogrames and distributed by Epyx. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -655,13 +762,12 @@ license:CC0-1.0
<description>Gauntlet (cleanly cracked)</description>
<year>1988</year>
<publisher>Mindscape</publisher>
+ <info name="developer" value="Atari Games" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Gauntlet" is a 1988 action game distributed by Mindscape. -->
<!-- Protection: Bad block check for block $7 -->
-
+ <!-- arcade game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="gauntlet iigs (trex crack).2mg" size="819264" crc="9350598a" sha1="e594829ae86956a4e86a5e7243e82bf7d3606c17"/>
@@ -673,12 +779,17 @@ license:CC0-1.0
<description>GBA Championship Basketball: Two-on-Two (cleanly cracked)</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Paul Terry, Jack Thornton, Scott Orr, John Cutter, Troy Lyndon, and Russell Lieblich" />
- <info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="programmer" value="Paul Terry" />
+ <info name="programmer" value="Jack Thornton" />
+ <info name="programmer" value="Scott Orr" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Troy Lyndon" />
+ <info name="programmer" value="Russell Lieblich" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2023-04-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"GBA Championship Basketball" is a 1987 sports game developed by Paul Terry, Jack Thornton, Scott Orr, John Cutter, Troy Lyndon, and Russell Lieblich, and distributed by Activision. -->
+ <!-- "GBA Championship Basketball" is a 1987 sports game developed by Paul Terry, Jack Thornton, Scott Orr, John Cutter, Troy Lyndon, and Russell Lieblich, and distributed by Activision. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -689,17 +800,16 @@ license:CC0-1.0
</software>
<software name="geometry">
- <description>Geometry (version 1.0) (cleanly cracked)</description>
+ <description>Geometry (version 1.0) (trex crack)</description>
<year>1988</year>
<publisher>Brøderbund</publisher>
- <info name="version" value="1.0" />
+ <info name="developer" value="Sensei Software" />
<info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 768K Apple IIgs. -->
- <!--"Geometry v1.0" is a educational program teaching the concepts of geometry by Sensei Software, and publised by Brøderbund Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - System disk"/>
<dataarea name="flop" size="819264">
@@ -724,12 +834,15 @@ license:CC0-1.0
<description>Gnarly Golf (cleanly cracked)</description>
<year>1989</year>
<publisher>Fanfare by Britannica</publisher>
- <info name="programmer" value="Jim Coliz Jr., Darren Bartlett, Andy Hildebrand, and Greg Thomas" />
+ <info name="programmer" value="Jim Coliz, Jr." />
+ <info name="programmer" value="Darren Bartlett" />
+ <info name="programmer" value="Andy Hildebrand" />
+ <info name="programmer" value="Greg Thomas" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Gnarly Golf" is a 1989 miniture golf / putt game by Jim Coliz Jr & Darren Bartlett of Visual Concepts, Ltd., and distributed by Britannica Software. -->
+ <!-- "Gnarly Golf" is a 1989 miniture golf / putt game by Jim Coliz Jr & Darren Bartlett of Visual Concepts, Ltd., and distributed by Britannica Software. -->
<!-- Protection: Read block $63F with data markers AD AA D5 and compare read data against self generated data -->
<part name="flop1" interface="floppy_3_5">
@@ -750,12 +863,18 @@ license:CC0-1.0
<description>Grand Prix Circuit (cleanly cracked)</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Don Mattrick, Brad Gour, Allan Johanson, Erik Kiss, Amory Wong, Rick Friesen, and Kris Hatlelid" />
+ <info name="programmer" value="Don Mattrick" />
+ <info name="programmer" value="Brad Gour" />
+ <info name="programmer" value="Allan Johanson" />
+ <info name="programmer" value="Erik Kiss" />
+ <info name="programmer" value="Amory Wong" />
+ <info name="programmer" value="Rick Friesen" />
+ <info name="programmer" value="Kris Hatlelid" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Grand Prix Circuit" is a 1989 racing simulation game developed by Don Mattrick, Brad Gour, Allan Johanson, Erik Kiss, Amory Wong, Rick Friesen, and Kris Hatlelid, and distributed by Accolade. -->
+ <!-- "Grand Prix Circuit" is a 1989 racing simulation game developed by Don Mattrick, Brad Gour, Allan Johanson, Erik Kiss, Amory Wong, Rick Friesen, and Kris Hatlelid, and distributed by Accolade. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -769,12 +888,13 @@ license:CC0-1.0
<description>Great Western Shootout (cleanly cracked)</description>
<year>1989</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Scott Patterson and Matt Crysdale" />
+ <info name="programmer" value="Scott Patterson" />
+ <info name="programmer" value="Matt Crysdale" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Great Western Shootout" is a 1989 action game developed by Scott Patterson and Matt Crysdale, and distributed by Britannica Software. -->
+ <!-- "Great Western Shootout" is a 1989 action game developed by Scott Patterson and Matt Crysdale, and distributed by Britannica Software. -->
<!-- Disk 2 was a copy / back-up of the original Game Disk -->
<!-- Protection: Read block $63F with data markers AD AA D5 and compare read data against self generated data -->
@@ -801,7 +921,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Hacker II: The Doomsday Papers" is a 1987 simulation game developed by Steve Cartwright and distributed by Activision. -->
+ <!-- "Hacker II: The Doomsday Papers" is a 1987 simulation game developed by Steve Cartwright and distributed by Activision. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -815,12 +935,15 @@ license:CC0-1.0
<description>Hardball! (cleanly cracked)</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Dan Thompson, Ed Bogas, John Boechler, and Mike Benna" />
+ <info name="programmer" value="Dan Thompson" />
+ <info name="programmer" value="Ed Bogas" />
+ <info name="programmer" value="John Boechler" />
+ <info name="programmer" value="Mike Benna" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Hardball!" is a 1987 sports game developed by Dan Thompson, Ed Bogas, John Boechler, and Mike Benna, and distributed by Accolade. -->
+ <!-- "Hardball!" is a 1987 sports game developed by Dan Thompson, Ed Bogas, John Boechler, and Mike Benna, and distributed by Accolade. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -831,16 +954,15 @@ license:CC0-1.0
</software>
<software name="hostage">
- <description>Hostage: Rescue Mission (cleanly cracked)</description>
+ <description>Hostage: Rescue Mission (trex crack)</description>
<year>1990</year>
<publisher>Mindscape</publisher>
+ <info name="developer" value="Infogrames" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Hostage: Rescue Mission" is a 1990 simulation game developed by Infogrames and distributed by Mindscape. -->
+ <!-- simulation game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="hostage - rescue mission iigs (trex crack).2mg" size="819264" crc="96b1c5b2" sha1="8c541ef7455a4cd5f9cb90093b158b618cdb131c"/>
@@ -849,17 +971,18 @@ license:CC0-1.0
</software>
<software name="impmiss2">
- <description>Impossible Mission II (cleanly cracked)</description>
+ <description>Impossible Mission II (trex crack)</description>
<year>1989</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Istvan Cseri, Gyula Horvath, Pal Komondi, and Sultan" />
+ <info name="programmer" value="Istvan Cseri" />
+ <info name="programmer" value="Gyula Horvath" />
+ <info name="programmer" value="Pal Komondi" />
+ <info name="programmer" value="Sultan" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Impossible Mission II" is a 1989 action game developed by Istvan Cseri, Gyula Horvath, Pal Komondi, and Sultan, and distributed by Epyx. -->
+ <!-- action game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="impossible mission ii iigs (trex crack).2mg" size="819264" crc="74ff8279" sha1="53daf3ca16a5f2bee0104e1d6688ce45ead599bc"/>
@@ -876,7 +999,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Jack Nicklaus' Greatest 18 Holes of Major Championship Golf" is a 1989 sports game developed by Tony Manso and distributed by Accolade. -->
+ <!-- "Jack Nicklaus' Greatest 18 Holes of Major Championship Golf" is a 1989 sports game developed by Tony Manso and distributed by Accolade. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<!-- This archive includes the four add-on disks that were available separately. -->
<!-- Jack Nicklaus Presents The Major Championship Courses Of 1989 (Includes: Oak Hill - U.S. Open, Royal Troon - British Open & Kemper Lakes - PGA courses) -->
@@ -927,13 +1050,14 @@ license:CC0-1.0
<description>Jigsaw (version 1.4 - 022988) (cleanly cracked)</description>
<year>1988</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Javier Rullan Ruano and Huibert Aalbers" />
+ <info name="programmer" value="Javier Rullan Ruano" />
+ <info name="programmer" value="Huibert Aalbers" />
<info name="version" value="1.4" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs ROM01 or later. -->
- <!--"Jigsaw" is a 1988 board game developed by Javier Rullan Ruano and Huibert Aalbers, and distributed by Britannica Software. -->
+ <!-- "Jigsaw" is a 1988 board game developed by Javier Rullan Ruano and Huibert Aalbers, and distributed by Britannica Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -950,19 +1074,17 @@ license:CC0-1.0
</part>
</software>
- <software name="kingqst">
- <description>King's Quest - Quest for the Crown (cleanly cracked)</description>
+ <software name="kquest">
+ <description>King's Quest - Quest for the Crown (trex crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
<info name="author" value="Roberta Williams, Al Lowe, Charles Tingley, Ken MacNeill, Chris Iden, Doug MacNeill, Greg Rowland, and Chris Iden" />
<info name="programmer" value="Carlos Escobar" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"King's Quest - Quest for the Crown" is a 1987 adventure game developed by Roberta Williams, Al Lowe, Bob Kernaghan, Robert E. Heitman, Jeff Stephenson, Chris Iden, Doug MacNeill, Margaret Lowe, Dale Carlson, Jennifer Cobb, Chad Bye, Jeremy T. Cromwell, Carlos Escobar, Annette Childs, Greg Steffen, and Ken Williams, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -977,18 +1099,25 @@ license:CC0-1.0
</part>
</software>
- <software name="kingqst2">
- <description>King's Quest II - Romancing The Throne (cleanly cracked)</description>
+ <software name="kquest2">
+ <description>King's Quest II - Romancing The Throne (trex crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Roberta Williams, Jeff Stephenson, Chris Iden, Robert Heitman, Ken Williams, Sol Ackerman, Scott Murphy, Doug MacNeill, Mark Crowe, and Al Lowe" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"King's Quest II - Romancing The Throne" is a 1987 adventure game developed by Roberta Williams, Al Lowe, Bob Kernaghan, Robert E. Heitman, Jeff Stephenson, Chris Iden, Doug MacNeill, Margaret Lowe, Dale Carlson, Jennifer Cobb, Chad Bye, Jeremy T. Cromwell, Carlos Escobar, Annette Childs, Greg Steffen, and Ken Williams, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -1003,18 +1132,31 @@ license:CC0-1.0
</part>
</software>
- <software name="kingqst3">
- <description>King's Quest III - To Hier is Human (cleanly cracked)</description>
+ <software name="kquest3">
+ <description>King's Quest III - To Hier is Human (trex crack)</description>
<year>1988</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Roberta Williams, Al Lowe, Bob Kernaghan, Robert E. Heitman, Jeff Stephenson, Chris Iden, Doug MacNeill, Margaret Lowe, Dale Carlson, Jennifer Cobb, Chad Bye, Jeremy T. Cromwell, Carlos Escobar, Annette Childs, Greg Steffen, and Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Bob Kernaghan" />
+ <info name="programmer" value="Robert E. Heitman" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Dale Carlson" />
+ <info name="programmer" value="Jennifer Cobb" />
+ <info name="programmer" value="Chad Bye" />
+ <info name="programmer" value="Jeremy T. Cromwell" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="programmer" value="Annette Childs" />
+ <info name="programmer" value="Greg Steffen" />
+ <info name="programmer" value="Ken Williams" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"King's Quest III - To Hier is Human" is a 1988 adventure game developed by Roberta Williams, Al Lowe, Bob Kernaghan, Robert E. Heitman, Jeff Stephenson, Chris Iden, Doug MacNeill, Margaret Lowe, Dale Carlson, Jennifer Cobb, Chad Bye, Jeremy T. Cromwell, Carlos Escobar, Annette Childs, Greg Steffen, and Ken Williams, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -1033,12 +1175,17 @@ license:CC0-1.0
<description>LaserForce (cleanly cracked)</description>
<year>1989</year>
<publisher>Fanfare</publisher>
- <info name="programmer" value="Javier Rullan, Huibert Aalbers, Thierry Méchain, Stéphane Renaudin, J-C. Doré, and Olivier Guichaoua" />
+ <info name="programmer" value="Javier Rullan" />
+ <info name="programmer" value="Huibert Aalbers" />
+ <info name="programmer" value="Thierry Méchain" />
+ <info name="programmer" value="Stéphane Renaudin" />
+ <info name="programmer" value="J-C. Doré" />
+ <info name="programmer" value="Olivier Guichaoua" />
<info name="usage" value="Requires a 1.25MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1.25MB Apple IIgs.-->
- <!--"LaserForce" is a 1989 action game developed by Javier Rullan, Huibert Aalbers, Thierry Méchain, Stéphane Renaudin, J-C. Doré, and Olivier Guichaoua, and distributed by Fanfare. -->
+ <!-- It requires a 1.25MB Apple IIgs. -->
+ <!-- "LaserForce" is a 1989 action game developed by Javier Rullan, Huibert Aalbers, Thierry Méchain, Stéphane Renaudin, J-C. Doré, and Olivier Guichaoua, and distributed by Fanfare. -->
<!-- Protection: Read block $63F with data markers AD AA D5 and compare read data against self generated data -->
<part name="flop1" interface="floppy_3_5">
@@ -1055,18 +1202,23 @@ license:CC0-1.0
</part>
</software>
- <software name="lslarry">
- <description>Leisure Suit Larry in the Land of the Lounge Lizards (cleanly cracked)</description>
+ <software name="lsl1">
+ <description>Leisure Suit Larry in The Land of the Lounge Lizards (trex crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Al Lowe, Chuck Benton, Mark Crowe, Jeff Stephenson, Chris Iden, Bob Heitman, Ken Williams, and Carlos Escobar" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Chuck Benton" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Carlos Escobar" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Leisure Suit Larry in the Land of the Lounge Lizards" is a 1987 adventure game developed by Al Lowe, Chuck Benton, Mark Crowe, Jeff Stephenson, Chris Iden, Bob Heitman, Ken Williams, and Carlos Escobar, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -1085,12 +1237,14 @@ license:CC0-1.0
<description>Magical Myths (cleanly cracked)</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stan Brewster, Joseph B. Hewitt IV, and June Stark" />
+ <info name="programmer" value="Stan Brewster" />
+ <info name="programmer" value="Joseph B. Hewitt IV" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Magical Myths" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "Magical Myths" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -1111,13 +1265,16 @@ license:CC0-1.0
<description>Mancala (version 1.0) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Jarek Olszewski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak" />
+ <info name="programmer" value="Jarek Olszewski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Macala" is a 1988 board game developed by Jarek Olszewski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak, and distributed by California Dreams. -->
+ <!-- "Macala" is a 1988 board game developed by Jarek Olszewski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak, and distributed by California Dreams. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -1128,7 +1285,7 @@ license:CC0-1.0
</software>
<software name="marble">
- <description>Marble Madness (cleanly cracked)</description>
+ <description>Marble Madness (trex crack)</description>
<year>1986</year>
<publisher>Electronic Arts</publisher>
<info name="programmer" value="Will Harvey" />
@@ -1136,10 +1293,8 @@ license:CC0-1.0
<info name="programmer" value="Will Harvey"/>
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Marble Madness" is a 1986 action game developed by Will Harvey and distributed by Electronic Arts. -->
+ <!-- action game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="marble madness iigs (trex crack).2mg" size="819264" crc="d400455e" sha1="68526119d1f3b31e01d9b9b52a364323f88b2b58"/>
@@ -1147,44 +1302,40 @@ license:CC0-1.0
</part>
</software>
- <software name="mathblst">
- <description>Math Blaster Plus! (version 1.1) (cleanly cracked)</description>
+ <software name="mathblsta" cloneof="mathblst">
+ <description>Math Blaster Plus! (version 1.0) (trex crack)</description>
<year>1989</year>
- <publisher>Davidson and Associates</publisher>
+ <publisher>Davidson &amp; Associates</publisher>
<info name="author" value="Jan Davidson and Cathy Johnson" />
<info name="programmer" value="C.K. Haun" />
- <info name="version" value="1.1" />
+ <info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs ROM1 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs ROM1 or later. -->
- <!--"Math Blaster Plus!" is a 1989 educational program designed by Jan Davidson and Cathy Johnson, written by C.K. Haun, and distributed by Davidson and Associates. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $308 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="math blaster plus v1.1 iigs (trex crack).2mg" size="819264" crc="96b3a909" sha1="5c7a1e8172f25ef328239971175b1f28a317fe2a" />
+ <rom name="math blaster plus v1.0 iigs (trex crack).2mg" size="819264" crc="37120366" sha1="b6a585415cbac0f69182da911bf7ec298df5fcbc" />
</dataarea>
</part>
</software>
- <software name="mathblsta" cloneof="mathblst">
- <description>Math Blaster Plus! (version 1.0) (cleanly cracked)</description>
+ <software name="mathblst">
+ <description>Math Blaster Plus! (version 1.1) (trex crack)</description>
<year>1989</year>
- <publisher>Davidson and Associates</publisher>
+ <publisher>Davidson &amp; Associates</publisher>
<info name="author" value="Jan Davidson and Cathy Johnson" />
<info name="programmer" value="C.K. Haun" />
<info name="version" value="1.1" />
<info name="usage" value="Requires a 512K Apple IIgs ROM1 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
<!-- It requires a 512K Apple IIgs ROM1 or later. -->
- <!--"Math Blaster Plus!" is a 1989 educational program designed by Jan Davidson and Cathy Johnson, written by C.K. Haun, and distributed by Davidson and Associates. -->
- <!-- Protection: Bad block check for block $308 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="math blaster plus v1.0 iigs (trex crack).2mg" size="819264" crc="37120366" sha1="b6a585415cbac0f69182da911bf7ec298df5fcbc" />
+ <rom name="math blaster plus v1.1 iigs (trex crack).2mg" size="819264" crc="96b3a909" sha1="5c7a1e8172f25ef328239971175b1f28a317fe2a" />
</dataarea>
</part>
</software>
@@ -1193,12 +1344,14 @@ license:CC0-1.0
<description>Math Wizard (cleanly cracked)</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas, June Stark, and Joseph B. Hewitt IV" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="June Stark" />
+ <info name="programmer" value="Joseph B. Hewitt IV" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Math Wizard" is a 1988 educational program developed by William Demas, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "Math Wizard" is a 1988 educational program developed by William Demas, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -1224,7 +1377,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Mavis Beacon Teaches Typing" is a 1987 educational program developed and distributed by The Software Toolworks. -->
+ <!-- "Mavis Beacon Teaches Typing" is a 1987 educational program developed and distributed by The Software Toolworks. -->
<!-- mavis.s16 dated 21-Dec-88 - Currently NOT archived: v1.5 (unknown program date) -->
<!-- Protection: Bad block check for block $63A -->
@@ -1251,7 +1404,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Mavis Beacon Teaches Typing" is a 1987 educational program developed and distributed by The Software Toolworks. -->
+ <!-- "Mavis Beacon Teaches Typing" is a 1987 educational program developed and distributed by The Software Toolworks. -->
<!-- mavis.s16 dated 16-Nov-87 -->
<!-- Protection: Bad block check for block $63A -->
@@ -1273,12 +1426,14 @@ license:CC0-1.0
<description>Mean 18 (cleanly cracked)</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Rex Bradford, George Karalias, and Mark Lesser" />
+ <info name="programmer" value="Rex Bradford" />
+ <info name="programmer" value="George Karalias" />
+ <info name="programmer" value="Mark Lesser" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Mean 18" is a 1987 sports game developed by Rex Bradford, George Karalias, and Mark Lesser, and distributed by Accolade. -->
+ <!-- "Mean 18" is a 1987 sports game developed by Rex Bradford, George Karalias, and Mark Lesser, and distributed by Accolade. -->
<!-- This archive includes the three add-on disks that were available separately (Famous Courses Volume II, III, and IV). -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
@@ -1309,46 +1464,76 @@ license:CC0-1.0
</software>
<software name="mercury">
- <description>Mercury (version 1.0) (cleanly cracked)</description>
+ <description>Mercury (A-249 version 1.0) (trex crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
- <info name="partno" value="A249" />
- <info name="programmer" value="John J. Krenz, Brian Nesse, Michael Palmquist, Steve Splinter, Michael Stein, and Paul Wenker" />
+ <info name="partno" value="A-249" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs ROM 01 or later. -->
- <!--"Mercury" is a 1989 desktop publishing program developed by John J. Krenz, Brian Nesse, Michael Palmquist, Steve Splinter, Michael Stein, and Paul Wenker, and distributed by MECC. -->
+ <!-- desktop publishing program -->
<!-- Protection: Bad block check for block $8 -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk"/>
+ <feature name="part_id" value="Disk 1 - System"/>
<dataarea name="flop" size="819264">
<rom name="mercury v1.0 iigs - disk 1 - system (trex crack).2mg" size="819264" crc="d28c1950" sha1="aeef36625bfdd12e5a7df000222725a2126cfc5d"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk"/>
+ <feature name="part_id" value="Disk 2 - Program"/>
<dataarea name="flop" size="819264">
<rom name="mercury v1.0 iigs - disk 2 - program (trex crack).2mg" size="819264" crc="2682521b" sha1="5fd3948bac00b1ca4e08c79ccb437483798f25a9"/>
</dataarea>
</part>
+
+ </software>
+ <software name="mulscribe">
+ <description>MultiScribe IIgs (version 3.01c) (cleanly cracked)</description>
+ <year>1987</year>
+ <publisher>StyleWare</publisher>
+ <info name="developer" value="StyleWare" />
+ <info name="version" value="3.01c" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-01-25 -->
+ <!-- It requires a 512K Apple IIgs. -->
+ <!-- "MultiScrible" is a word-processor featuring the ability to use different fonts, print styles, colors as well as allowing you to add boxes, circles and other designs. -->
+ <!-- First marketed as "Scholastic MutiScrible GS by StyleWare", then it became StyleWare MultiScribe GS and eventually Beagle Bros Software acquired the StyleWare library and rebranded it as BeagleWrite GS. -->
+ <!-- Protection: Nibble count on tracks $20 & $21 -->
+
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="819264">
+ <rom name="multiscribe gs v3.01c disk 1 - program (trex crack).2mg" size="819264" crc="d63e2246" sha1="8b5b7074f8967a79eb417cdb1a2648638473aa0f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Utilities" />
+ <dataarea name="flop" size="819264">
+ <rom name="multiscribe gs v3.01c disk 2 - utilities (trex crack).2mg" size="819264" crc="c4a8d1b1" sha1="0e31bb265b031397f8b386916e791e618d3a891e" />
+ </dataarea>
+ </part>
</software>
<software name="mcs">
- <description>Music Construction Set (version 1.0) (cleanly cracked)</description>
+ <description>Music Construction Set (version 1.0) (trex crack)</description>
<year>1986</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey, Jim Nitchals, and Doug Fulton" />
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Music Construction Set" is a 1986 audio program developed by Will Harvey, Jim Nitchals, and Doug Fulton, and distributed by Electronic Arts. -->
+ <!-- audio program -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="music construction set v1.0 iigs (trex crack).2mg" size="819264" crc="278ef676" sha1="22808e777a37118c7cfd0bc639aac756843ce8ce"/>
@@ -1357,17 +1542,15 @@ license:CC0-1.0
</software>
<software name="neuromnc">
- <description>Neuromancer (cleanly cracked)</description>
+ <description>Neuromancer (trex crack)</description>
<year>1989</year>
<publisher>Interplay Productions</publisher>
<info name="programmer" value="Rebecca Heineman" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Neuromancer" is a 1989 adventure game developed by Rebecca Heineman and distributed by Interplay Productions. -->
+ <!-- adventure game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="neuromancer iigs (trex crack).2mg" size="819264" crc="158c6c93" sha1="aee79701fdcbc9204f979087cd420c4b462c3b66"/>
@@ -1383,10 +1566,8 @@ license:CC0-1.0
<info name="usage" value="Requires a 256K Apple IIgs ROM 01." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs ROM 01 -->
- <!--"Paperboy" is a 1988 action game developed by Tengen and distributed by Mindscape. -->
<!-- Protection: Bad block check for block $7 -->
-
+ <!-- arcade game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="paperboy iigs (trex crack).2mg" size="819264" crc="a914d4a0" sha1="16990a565fdd157e58481113f30bb6725b38e958"/>
@@ -1403,7 +1584,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Pipe Dream" is a 1990 board game developed by Visual Concepts and distributed by Lucasfilm Games. -->
+ <!-- "Pipe Dream" is a 1990 board game developed by Visual Concepts and distributed by Lucasfilm Games. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -1417,12 +1598,13 @@ license:CC0-1.0
<description>Qix (version 1.4? 16-Jan-90) (cleanly cracked)</description>
<year>1990</year>
<publisher>Taito</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Qix" is a 1990 action game developed by Ryan Ridges and John Lund, and distributed by Taito. -->
+ <!-- "Qix" is a 1990 action game developed by Ryan Ridges and John Lund, and distributed by Taito. -->
<!-- Purportedly this is v1.4 - qix.s16 is dated 16-Jan-90 -->
<!-- Protection: Excessive zero bits after D5 CC AA header. Then 4 bytes are read through 4 loops with matches recorded. Read matches must equal less then 12 out of 16 reads -->
@@ -1442,7 +1624,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Read and Rhyme" is a 1988 educational program developed by William Demas and distributed by Unicorn Software. -->
+ <!-- "Read and Rhyme" is a 1988 educational program developed by William Demas and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -1463,12 +1645,13 @@ license:CC0-1.0
<description>Read-a-Rama (cleanly cracked)</description>
<year>1989</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stan Brewster and Joseph Hewitt" />
+ <info name="programmer" value="Stan Brewster" />
+ <info name="programmer" value="Joseph Hewitt" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1MB Apple IIgs. -->
- <!--"Read-A-Rama" is a 1989 educational program developed by Stan Brewster and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "Read-A-Rama" is a 1989 educational program developed by Stan Brewster and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -1491,39 +1674,37 @@ license:CC0-1.0
</part>
</software>
- <software name="rrabbit">
- <description>Reader Rabbit (version 2.3) (cleanly cracked)</description>
+ <software name="rrabbit20" cloneof="rrabbit">
+ <description>Reader Rabbit (version 2.0) (trex crack)</description>
<year>1987</year>
<publisher>The Learning Company</publisher>
- <info name="programmer" value="Pete Rowe and Aaron Weiss" />
- <info name="version" value="2.3" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Aaron Weiss" />
<info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2GS"/>
- <!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Reader Rabbit" is a 1987 educational program developed by Pete Rowe and Aaron Weiss, and distributed by The Learning Company. -->
+ <!-- Dump released: 2023-04-13 -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $7 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="reader rabbit v2.3 iigs (trex crack).2mg" size="819264" crc="b59cc9f2" sha1="3cb739ae7b6c2a967ea649f944cd3d41221f6ba4"/>
+ <rom name="reader rabbit v2.0 iigs (trex crack).2mg" size="819264" crc="0d7519e3" sha1="105012eccd7f066a0c3344b8f51b111fff7fc170"/>
</dataarea>
</part>
</software>
- <software name="rrabbita" cloneof="rrabbit">
- <description>Reader Rabbit (version 2.2) (cleanly cracked)</description>
+ <software name="rrabbit22" cloneof="rrabbit">
+ <description>Reader Rabbit (version 2.2) (trex crack)</description>
<year>1987</year>
<publisher>The Learning Company</publisher>
- <info name="programmer" value="Pete Rowe and Aaron Weiss" />
- <info name="version" value="2.2" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Aaron Weiss" />
<info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="version" value="2.2" />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Reader Rabbit" is a 1987 educational program developed by Pete Rowe and Aaron Weiss, and distributed by The Learning Company. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $7 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="reader rabbit v2.2 iigs (trex crack).2mg" size="819264" crc="518994ed" sha1="48290f00ea231e7df039b89c74bafcf00ee28854"/>
@@ -1531,39 +1712,37 @@ license:CC0-1.0
</part>
</software>
- <software name="rrabbitb" cloneof="rrabbit">
- <description>Reader Rabbit (Version 2.0) (cleanly cracked)</description>
+ <software name="rrabbit">
+ <description>Reader Rabbit (version 2.3) (trex crack)</description>
<year>1987</year>
<publisher>The Learning Company</publisher>
- <info name="programmer" value="Pete Rowe and Aaron Weiss" />
- <info name="version" value="2.0" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Aaron Weiss" />
<info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="version" value="2.3" />
<sharedfeat name="compatibility" value="A2GS"/>
- <!-- Dump released: 2023-04-13 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Reader Rabbit" is a 1987 educational program developed by Pete Rowe and Aaron Weiss, and distributed by The Learning Company. -->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $7 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="reader rabbit v2.0 iigs (trex crack).2mg" size="819264" crc="0d7519e3" sha1="105012eccd7f066a0c3344b8f51b111fff7fc170"/>
+ <rom name="reader rabbit v2.3 iigs (trex crack).2mg" size="819264" crc="b59cc9f2" sha1="3cb739ae7b6c2a967ea649f944cd3d41221f6ba4"/>
</dataarea>
</part>
</software>
- <software name="readingme">
- <description>Reading and Me (version 1.0) (cleanly cracked)</description>
+ <software name="readandme">
+ <description>Reading and Me (version 1.0) (trex crack)</description>
<year>1988</year>
- <publisher>Davidson and Associates</publisher>
- <info name="programmer" value="Louis X. Savain and C. K. Haun" />
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="programmer" value="C. K. Haun" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Reading and Me" is a 1988 educational program developed by Louis X. Savain and C. K. Haun, and distributed by Davidson & Associates. -->
<!-- Protection: Bad block check for block $308 -->
-
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - Program disk"/>
<dataarea name="flop" size="819264">
@@ -1582,13 +1761,15 @@ license:CC0-1.0
<description>Sea Strike (version 1.0) (cleanly cracked)</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Richard L. Seaborne, Jeff A. Lefferts, and Mei-Ying Dell'Aquila" />
+ <info name="programmer" value="Richard L. Seaborne" />
+ <info name="programmer" value="Jeff A. Lefferts" />
+ <info name="programmer" value="Mei-Ying Dell'Aquila" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Sea Strike" is a 1987 action game developed by Richard L. Seaborne, Jeff A. Lefferts, and Mei-Ying Dell'Aquila, and distributed by PBI Software. -->
+ <!-- "Sea Strike" is a 1987 action game developed by Richard L. Seaborne, Jeff A. Lefferts, and Mei-Ying Dell'Aquila, and distributed by PBI Software. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -1602,12 +1783,19 @@ license:CC0-1.0
<description>Serve and Volley (cleanly cracked)</description>
<year>1988</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Rick Banks, Paul Butler, Ken Shimizu, Danny Chin, Paul Battersby, Jeffrey J. Sigler, Grant Campbell, and Jay Stevens" />
+ <info name="programmer" value="Rick Banks" />
+ <info name="programmer" value="Paul Butler" />
+ <info name="programmer" value="Ken Shimizu" />
+ <info name="programmer" value="Danny Chin" />
+ <info name="programmer" value="Paul Battersby" />
+ <info name="programmer" value="Jeffrey J. Sigler" />
+ <info name="programmer" value="Grant Campbell" />
+ <info name="programmer" value="Jay Stevens" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Serve and Volley" is a 1988 sports game developed by Rick Banks, Paul Butler, Ken Shimizu, Danny Chin, Paul Battersby, Jeffrey J. Sigler, Grant Campbell, and Jay Stevens, and distributed by Accolade. -->
+ <!-- "Serve and Volley" is a 1988 sports game developed by Rick Banks, Paul Butler, Ken Shimizu, Danny Chin, Paul Battersby, Jeffrey J. Sigler, Grant Campbell, and Jay Stevens, and distributed by Accolade. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -1621,13 +1809,14 @@ license:CC0-1.0
<description>Shanghai (version 15-Sep-87) (cleanly cracked)</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Brodie Lockard and Ivan Manley" />
+ <info name="programmer" value="Brodie Lockard" />
+ <info name="programmer" value="Ivan Manley" />
<info name="version" value="15-Sep-87" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Shanghai" is a 1987 board game developed by Brodie Lockard and Ivan Manley, and distributed by Activision. -->
+ <!-- "Shanghai" is a 1987 board game developed by Brodie Lockard and Ivan Manley, and distributed by Activision. -->
<!-- start.s16 dated 15-Sep-87 -->
<!-- Protection: Bad block check for block $7 -->
@@ -1642,14 +1831,15 @@ license:CC0-1.0
<description>Shanghai (version 20-Jan-87) (cleanly cracked)</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Brodie Lockard and Ivan Manley" />
+ <info name="programmer" value="Brodie Lockard" />
+ <info name="programmer" value="Ivan Manley" />
<info name="version" value="20-Jan-87" />
<info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs ROM 01 or earlier. -->
<!-- NOT Compatible with the Apple IIgs ROM03. -->
- <!--"Shanghai" is a 1987 board game developed by Brodie Lockard and Ivan Manley, and distributed by Activision. -->
+ <!-- "Shanghai" is a 1987 board game developed by Brodie Lockard and Ivan Manley, and distributed by Activision. -->
<!-- start.s16 dated 20-Jan-87 -->
<!-- Protection: Bad block check for block $7 -->
@@ -1660,23 +1850,23 @@ license:CC0-1.0
</part>
</software>
- <software name="showoff">
- <description>ShowOff (version 1.1) (cleanly cracked)</description>
+ <software name="showoffa" cloneof="showoff">
+ <description>ShowOff (Version 1.0) (trex crack)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Serge Hervy and Jean-Claude Lévy" />
- <info name="version" value="1.1" />
- <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="developer" value="Denis Friedman Productions" />
+ <info name="programmer" value="Serge Hervy" />
+ <info name="programmer" value="Jean-Claude Lévy" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
<sharedfeat name="compatibility" value="A2GS"/>
- <!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"ShowOff" is a 1987 graphics program developed by Serge Hervy and Jean-Claude Lévy, and distributed by Brøderbund Software. -->
+ <!-- Dump released: 2023-04-13 -->
+ <!-- graphics program -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - Program disk"/>
<dataarea name="flop" size="819264">
- <rom name="showoff v1.1 iigs - disk 1 - program (trex crack).2mg" size="819264" crc="f0ab3f1c" sha1="33260ca055d031b237eca650c9bf054b341170b5"/>
+ <rom name="showoff v1.0 iigs - disk 1 - program (trex crack).2mg" size="819264" crc="b04c2763" sha1="f42601d9af1d1441ceac97299e12fd47cd8d5b0b"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
@@ -1693,24 +1883,23 @@ license:CC0-1.0
</part>
</software>
- <software name="showoffa" cloneof="showoff">
- <description>ShowOff (Version 1.0) (cleanly cracked)</description>
+ <software name="showoff">
+ <description>ShowOff (version 1.1) (trex crack)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Serge Hervy and Jean-Claude Lévy" />
- <info name="version" value="1.0" />
- <info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
+ <info name="developer" value="Denis Friedman Productions" />
+ <info name="programmer" value="Serge Hervy" />
+ <info name="programmer" value="Jean-Claude Lévy" />
+ <info name="version" value="1.1" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
- <!-- Dump released: 2023-04-13 -->
- <!-- It requires a 512K Apple IIgs ROM 01 or earlier. -->
- <!-- NOT Compatible with the Apple IIgs ROM03. -->
- <!--"ShowOff" is a 1987 graphics program developed by Serge Hervy and Jean-Claude Lévy, and distributed by Brøderbund Software. -->
+ <!-- Dump released: 2021-08-13 -->
+ <!-- graphics program -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - Program disk"/>
<dataarea name="flop" size="819264">
- <rom name="showoff v1.0 iigs - disk 1 - program (trex crack).2mg" size="819264" crc="b04c2763" sha1="f42601d9af1d1441ceac97299e12fd47cd8d5b0b"/>
+ <rom name="showoff v1.1 iigs - disk 1 - program (trex crack).2mg" size="819264" crc="f0ab3f1c" sha1="33260ca055d031b237eca650c9bf054b341170b5"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
@@ -1728,19 +1917,18 @@ license:CC0-1.0
</software>
<software name="pirates">
- <description>Sid Meier's Pirates! (cleanly cracked)</description>
+ <description>Sid Meier's Pirates! (trex crack)</description>
<year>1987</year>
<publisher>Microprose</publisher>
<info name="developer" value="Sid Meier" />
- <info name="programmer" value="Dan Chang &amp; Ed Magnin" />
+ <info name="programmer" value="Dan Chang " />
+ <info name="programmer" value="Ed Magnin" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2023-02-24 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Pirates!" is a 1987 simulation game developed by Sid Meier, programmed by Dan Chang & Ed Magnin, sound by Ken Lagace & Silas Warner, art by Micheal Haire, Murray Taylor & Max Remington and distributed by Microprose. -->
<!-- Protection: Modified ProDOS 8 and altered disk format -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="sid meier's pirates iigs (trex crack).2mg" size="819264" crc="5c53623d" sha1="551eb337651bee99d235a321ed921cf10efeee66" />
@@ -1749,18 +1937,18 @@ license:CC0-1.0
</software>
<software name="slntsvce">
- <description>Silent Service (version 925.01) (cleanly cracked)</description>
+ <description>Silent Service (version 925.01) (trex crack)</description>
<year>1987</year>
- <publisher>Microprose</publisher>
- <info name="programmer" value="Sid Meier, Ed Magnin, Jim Synoski, Michael Haire, Michele Mahan, Silas Warner, Al Roireau, Larry Martin, and Edward Bever" />
- <info name="version" value="925.01" />
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Jim Synoski" />
<info name="usage" value="Requires a 256K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
+ <info name="version" value="925.01" />
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 256K Apple IIgs. -->
- <!--"Silent Service" is a 1987 simulation game developed by Sid Meier, Ed Magnin, Jim Synoski, Michael Haire, Michele Mahan, Silas Warner, Al Roireau, Larry Martin, and Edward Bever, and distributed by Microprose. -->
+ <!-- simulation game -->
<!-- Protection: Bad block check for block $7 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="silent service v925.01 iigs (trex crack).2mg" size="819264" crc="1551b534" sha1="2f1c466c647bb448b081d69233f11d2c45092242"/>
@@ -1769,17 +1957,26 @@ license:CC0-1.0
</software>
<software name="silpheed">
- <description>Silpheed - Super Dogfighter (cleanly cracked)</description>
+ <description>Silpheed - Super Dogfighter (trex crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="John Rettig, Stuart Goldstein, Mark Seibert, Satoshi Uesaki, Nobuyuki Ogawa, Akira Eye, Fumihito Kasatani, Nobuyuki Aoshima, Hiromi Ohba, Takeshi Miyaji, Osamu Harada, and Youichi Miyaji" />
+ <info name="programmer" value="John Rettig" />
+ <info name="programmer" value="Stuart Goldstein" />
+ <info name="programmer" value="Mark Seibert" />
+ <info name="programmer" value="Satoshi Uesaki" />
+ <info name="programmer" value="Nobuyuki Ogawa" />
+ <info name="programmer" value="Akira Eye" />
+ <info name="programmer" value="Fumihito Kasatani" />
+ <info name="programmer" value="Nobuyuki Aoshima" />
+ <info name="programmer" value="Hiromi Ohba" />
+ <info name="programmer" value="Takeshi Miyaji" />
+ <info name="programmer" value="Osamu Harada" />
+ <info name="programmer" value="Youichi Miyaji" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Silpheed" is a 1987 action game developed by John Rettig, Stuart Goldstein, Mark Seibert, Satoshi Uesaki, Nobuyuki Ogawa, Akira Eye, Fumihito Kasatani, Nobuyuki Aoshima, Hiromi Ohba, Takeshi Miyaji, Osamu Harada, and Youichi Miyaji, and distributed by Sierra On-Line. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -1795,20 +1992,22 @@ license:CC0-1.0
</software>
<software name="skatedie">
- <description>Skate or Die (version 1.1 07-Oct-88) (cleanly cracked)</description>
+ <description>Skate or Die! IIgs (version 1.1 07-Oct-88) (trex crack)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer" />
- <info name="version" value="1.1 07-Oct-88 - ROM 03 compatible" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="David Bunch" />
+ <info name="programmer" value="Michelle Shelfer" />
<info name="usage" value="Requires a 512K Apple IIgs. Music requires 768K." />
+ <info name="version" value="1.1 07-Oct-88 - ROM 03 compatible" />
+ <!-- sod.sys16 dated 07-Oct-88 -->
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. Music requires 768K. -->
- <!--"Skate or Die" is a 1988 sports game developed by Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer, and distributed by Electronic Arts. -->
- <!-- sod.sys16 dated 07-Oct-88 -->
+ <!-- sports game -->
<!-- Patched to be compatible with ROM03 -->
+ <!-- sod.sys16 dated 07-Oct-88 -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="skate or die v1.1 iigs (trex crack).2mg" size="819264" crc="dde655cd" sha1="cf40c92a699cf9e7c79f1a25c3f22f32f5a28d46"/>
@@ -1817,38 +2016,44 @@ license:CC0-1.0
</software>
<software name="skatediea" cloneof="skatedie">
- <description>Skate or Die (version 1.0 12-Aug-88) (cleanly cracked)</description>
+ <description>Skate or Die! IIgs (version 1.0 12-Aug-88) (trex crack)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer" />
- <info name="version" value="1.0 12-Aug-88 - ROM 03 compatible" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="David Bunch" />
+ <info name="programmer" value="Michelle Shelfer" />
<info name="usage" value="Requires a 512K Apple IIgs. Music requires 768K." />
- <sharedfeat name="compatibility" value="A2GS"/>
- <!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. Music requires 768K. -->
- <!--"Skate or Die" is a 1988 sports game developed by Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer, and distributed by Electronic Arts. -->
+ <info name="version" value="1.0 12-Aug-88 - ROM 03 compatible" />
<!-- sod.sys16 dated 12-Aug-88 -->
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- Dump released: 2025-01-25, redump based on WOZ released on 2024-09-02 -->
+ <!-- sports game -->
<!-- Patched to be compatible with ROM03 -->
+ <!-- sod.sys16 dated 12-Aug-88 -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="skate or die v1.0 iigs (trex crack).2mg" size="819264" crc="466b7067" sha1="776c78d962d46b6b20ca464bbbed2e2f746f4099"/>
+ <rom name="skate or die v1.0 iigs (trex crack).2mg" size="819264" crc="f87d1ec3" sha1="9e28b572f9d53fd276066b3701de42d45ee9cc51"/>
</dataarea>
</part>
</software>
- <software name="spquest">
- <description>Space Quest - The Sarien Encounter (cleanly cracked)</description>
+ <software name="squest">
+ <description>Space Quest: The Sarien Encounter (trex crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="release" value="2021-08-13"/>
- <sharedfeat name="compatibility" value="A2GS"/>
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Space Quest: The Sarien Encounter" is a 1987 adventure game developed by Scott Murphy, Mark Crowe, Jeff Stephenson, Chris Iden, Sol Ackerman, and Ken Williams, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -1863,18 +2068,21 @@ license:CC0-1.0
</part>
</software>
- <software name="spquest2">
- <description>Space Quest II - Vohual's Revenge (cleanly cracked)</description>
+ <software name="squest2">
+ <description>Space Quest II: Vohaul's Revenge (trex crack)</description>
<year>1988</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Scott Murphy, Mark Crowe, Jeff Stephenson, Chris Iden, Sol Ackerman, and Ken Williams" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Space Quest II" is a 1988 adventure game developed by Mark Crowe, Scott Murphy, Jeff Stephenson, Chris Iden, Robert Heitman, and Carlos Escobar, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -1898,7 +2106,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1MB Apple IIgs. -->
- <!--"Spirit of Excalibur" is a 1991 adventure game developed by Synergistic Software and distributed by Virgin Mastertronic. -->
+ <!-- "Spirit of Excalibur" is a 1991 adventure game developed by Synergistic Software and distributed by Virgin Mastertronic. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -1922,27 +2130,30 @@ license:CC0-1.0
</software>
<software name="strybkwv">
- <description>Storybook Weaver (version 1.0) (cleanly cracked)</description>
+ <description>Storybook Weaver (A-275 version 1.0) (trex crack)</description>
<year>1990</year>
<publisher>MECC</publisher>
- <info name="partno" value="A275" />
- <info name="programmer" value="Charolyn Kapplinger, Patricia Korn, John J. Krenz, Brian S. Nesse, Jean Sharp, and Steve Zehm" />
+ <info name="partno" value="A-275" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian S. Nesse" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Steve Zehm" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs ROM 01 or later. -->
- <!--"Storybook Weaver" is a 1990 educational program developed by Charolyn Kapplinger, Patricia Korn, John J. Krenz, Brian S. Nesse, Jean Sharp, and Steve Zehm, and distributed by MECC. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $8 -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk"/>
+ <feature name="part_id" value="Disk 1 - System"/>
<dataarea name="flop" size="819264">
<rom name="storybook weaver v1.0 iigs - disk 1 - system (trex crack).2mg" size="819264" crc="c6acd3b2" sha1="814f84b31bab49e29f80797dced8bc8692055e4e"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk"/>
+ <feature name="part_id" value="Disk 2 - Program"/>
<dataarea name="flop" size="819264">
<rom name="storybook weaver v1.0 iigs - disk 2 - program (trex crack).2mg" size="819264" crc="5bafb45c" sha1="ddb7117bb3e096be90f638e538c0551409131bec"/>
</dataarea>
@@ -1950,27 +2161,28 @@ license:CC0-1.0
</software>
<software name="strywvwa">
- <description>Storybook Weaver - World of Adventure (version 1.0) (cleanly cracked)</description>
+ <description>Storybook Weaver: World of Adventure (A-276 version 1.0) (trex crack)</description>
<year>1991</year>
<publisher>MECC</publisher>
- <info name="partno" value="A276" />
- <info name="programmer" value="Patricia Korn, Brian S. Nesse, Dee Dee Roedel &amp; Jean Sharp" />
+ <info name="partno" value="A-276" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Brian S. Nesse" />
+ <info name="programmer" value="Dee Dee Roedel " />
+ <info name="programmer" value="Jean Sharp" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs ROM 01 or later. -->
- <!--"Storybook Weaver: World of Adventure" is a 1991 educational program developed by Patricia Korn, Brian S. Nesse, Dee Dee Roedel & Jean Sharp, and distributed by MECC. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $8 -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk"/>
+ <feature name="part_id" value="Disk 1 - System"/>
<dataarea name="flop" size="819264">
<rom name="storybook weaver - world of adventure v1.0 iigs - disk 1 - system (trex crack).2mg" size="819264" crc="589e942d" sha1="25ee4d9872302c2f235e3d775a0536a426e610d5"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk"/>
+ <feature name="part_id" value="Disk 2 - Program"/>
<dataarea name="flop" size="819264">
<rom name="storybook weaver - world of adventure v1.0 iigs - disk 2 - program (trex crack).2mg" size="819264" crc="03e3ce87" sha1="86aca233933b10f3f25cdae7692375e60c3f6650"/>
</dataarea>
@@ -1978,27 +2190,27 @@ license:CC0-1.0
</software>
<software name="strywvmb">
- <description>Storybook Weaver - World of Make-Believe (version 1.0) (cleanly cracked)</description>
+ <description>Storybook Weaver: World of Make-Believe (A-298 version 1.0) (trex crack)</description>
<year>1991</year>
<publisher>MECC</publisher>
- <info name="partno" value="A298" />
- <info name="programmer" value="Charolyn Kapplinger, Patricia Korn, and Jean Sharp" />
+ <info name="partno" value="A-298" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Jean Sharp" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs ROM 01 or later. -->
- <!--"Storybook Weaver: World of Make-Believe" is a 1991 educational program developed by Charolyn Kapplinger, Patricia Korn, and Jean Sharp, and distributed by MECC. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $8 -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk"/>
+ <feature name="part_id" value="Disk 1 - System"/>
<dataarea name="flop" size="819264">
<rom name="storybook weaver - world of make-believe v1.0 iigs - disk 1 - system (trex crack).2mg" size="819264" crc="54e1fb99" sha1="3fc4031f0bda54e2c73ffc3f2ac8a17c1f73fc71"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk"/>
+ <feature name="part_id" value="Disk 2 - Program"/>
<dataarea name="flop" size="819264">
<rom name="storybook weaver - world of make-believe v1.0 iigs - disk 2 - program (trex crack).2mg" size="819264" crc="0c778c48" sha1="91b4b8d9264985b63eda4b34d3140d4414a800fa"/>
</dataarea>
@@ -2006,17 +2218,15 @@ license:CC0-1.0
</software>
<software name="strsoccr">
- <description>Street Sports Soccer (cleanly cracked)</description>
+ <description>Street Sports Soccer (trex crack)</description>
<year>1988</year>
<publisher>Epyx</publisher>
<info name="developer" value="Designer Software" />
<info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs ROM 01 or earlier. -->
- <!--"Street Sports Soccer" is a 1988 sports game developed by Designer Software and distributed by Epyx. -->
+ <!-- sports game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="street sports soccer iigs (trex crack).2mg" size="819264" crc="28862df6" sha1="8154843041284a59017021d4783cbe2c4f22c929"/>
@@ -2024,18 +2234,21 @@ license:CC0-1.0
</part>
</software>
- <software name="sshockey">
- <description>Superstar Ice Hockey (cleanly cracked)</description>
+ <software name="ssicehock">
+ <description>Superstar Ice Hockey (trex crack)</description>
<year>1988</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Ed Ringler, Andrew Caldwell, Clayton Wishoff, Simon Ffinch, Ed Ringler Sr., and Chris Oke" />
+ <info name="programmer" value="Ed Ringler" />
+ <info name="programmer" value="Andrew Caldwell" />
+ <info name="programmer" value="Clayton Wishoff" />
+ <info name="programmer" value="Simon Ffinch" />
+ <info name="programmer" value="Ed Ringler Sr." />
+ <info name="programmer" value="Chris Oke" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Superstar Ice Hockey" is a 1988 sports game developed by Ed Ringler, Andrew Caldwell, Clayton Wishoff, Simon Ffinch, Ed Ringler Sr., and Chris Oke, and distributed by Mindscape. -->
+ <!-- sports game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="superstar ice hockey iigs (trex crack).2mg" size="819264" crc="6f405a10" sha1="41e963da1f389f94697c024190bbb89ac3c14421"/>
@@ -2047,12 +2260,13 @@ license:CC0-1.0
<description>Tales From The Arabian Nights (cleanly cracked)</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stanley Brewster and June Stark" />
+ <info name="programmer" value="Stanley Brewster" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Tales From The Arabian Nights" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "Tales From The Arabian Nights" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2073,12 +2287,14 @@ license:CC0-1.0
<description>Task Force (cleanly cracked)</description>
<year>1990</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Scott L. Patterson, Matthew Crysdale, and Gregory A. Thomas" />
+ <info name="programmer" value="Scott L. Patterson" />
+ <info name="programmer" value="Matthew Crysdale" />
+ <info name="programmer" value="Gregory A. Thomas" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1MB Apple IIgs. -->
- <!--"Task Force" is a 1990 action game developed by Scott L. Patterson, Matthew Crysdale, and Gregory A. Thomas, and distributed by Britannica Software. -->
+ <!-- "Task Force" is a 1990 action game developed by Scott L. Patterson, Matthew Crysdale, and Gregory A. Thomas, and distributed by Britannica Software. -->
<!-- Protection: Read block $63F with data markers AD AA D5 and compare read data against self generated data -->
<part name="flop1" interface="floppy_3_5">
@@ -2099,12 +2315,20 @@ license:CC0-1.0
<description>Tetris (cleanly cracked)</description>
<year>1988</year>
<publisher>Spectrum HoloByte</publisher>
- <info name="programmer" value="Roland Gustafsson, Sean B. Barger, Dan Geisler, Daniel L. Guerra, Jody Sather, Ed Bogas, Neil Cormia, Ty Roberts, and Gary Clayton" />
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="programmer" value="Sean B. Barger" />
+ <info name="programmer" value="Dan Geisler" />
+ <info name="programmer" value="Daniel L. Guerra" />
+ <info name="programmer" value="Jody Sather" />
+ <info name="programmer" value="Ed Bogas" />
+ <info name="programmer" value="Neil Cormia" />
+ <info name="programmer" value="Ty Roberts" />
+ <info name="programmer" value="Gary Clayton" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Tetris" is a 1988 action game developed by Roland Gustafsson, Sean B. Barger, Dan Geisler, Daniel L. Guerra, Jody Sather, Ed Bogas, Neil Cormia, Ty Roberts, and Gary Clayton, and distributed by Spectrum HoloByte. -->
+ <!-- "Tetris" is a 1988 action game developed by Roland Gustafsson, Sean B. Barger, Dan Geisler, Daniel L. Guerra, Jody Sather, Ed Bogas, Neil Cormia, Ty Roberts, and Gary Clayton, and distributed by Spectrum HoloByte. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -2118,12 +2342,20 @@ license:CC0-1.0
<description>The Adventures of Sinbad (cleanly cracked)</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Curt Toumanian, Steve Quinn, Jeff Hilbers, Rob Landeros, Russ Truelove, Bill Williams, Jim Simmons, Andrew Caldwell, Douglass Sharp" />
+ <info name="programmer" value="Curt Toumanian" />
+ <info name="programmer" value="Steve Quinn" />
+ <info name="programmer" value="Jeff Hilbers" />
+ <info name="programmer" value="Rob Landeros" />
+ <info name="programmer" value="Russ Truelove" />
+ <info name="programmer" value="Bill Williams" />
+ <info name="programmer" value="Jim Simmons" />
+ <info name="programmer" value="Andrew Caldwell" />
+ <info name="programmer" value="Douglass Sharp" />
<info name="usage" value="Requires a 768K Apple IIgs ROM1 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"The Adventures of Sinbad" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "The Adventures of Sinbad" is a 1988 educational program developed by Stanley Brewster, June Stark, and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2144,12 +2376,24 @@ license:CC0-1.0
<description>The Duel: Test Drive II (cleanly cracked)</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Allan Johnson, Erik Kiss, Amory Wong, Don Mattrick, Rick Friesen, Bruce Dawson, Randy Dillon, Brad Gour, Kris Hatlelid, Chris Taylor, John Boechler, Tony Lee, and Theresa Henry" />
+ <info name="programmer" value="Allan Johnson" />
+ <info name="programmer" value="Erik Kiss" />
+ <info name="programmer" value="Amory Wong" />
+ <info name="programmer" value="Don Mattrick" />
+ <info name="programmer" value="Rick Friesen" />
+ <info name="programmer" value="Bruce Dawson" />
+ <info name="programmer" value="Randy Dillon" />
+ <info name="programmer" value="Brad Gour" />
+ <info name="programmer" value="Kris Hatlelid" />
+ <info name="programmer" value="Chris Taylor" />
+ <info name="programmer" value="John Boechler" />
+ <info name="programmer" value="Tony Lee" />
+ <info name="programmer" value="Theresa Henry" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"The Duel: Test Drive II" is a 1989 racing simulation game developed by Allan Johnson, Erik Kiss, Amory Wong, Don Mattrick, Rick Friesen, Bruce Dawson, Randy Dillon, Brad Gour, Kris Hatlelid, Chris Taylor, John Boechler, Tony Lee, and Theresa Henry, and distributed by Accolade. -->
+ <!-- "The Duel: Test Drive II" is a 1989 racing simulation game developed by Allan Johnson, Erik Kiss, Amory Wong, Don Mattrick, Rick Friesen, Bruce Dawson, Randy Dillon, Brad Gour, Kris Hatlelid, Chris Taylor, John Boechler, Tony Lee, and Theresa Henry, and distributed by Accolade. -->
<!-- This archive includes the four add-on disks that were available separately (The Muscle Cars, The Supercars, California Challenge and European Challenge). -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
@@ -2189,13 +2433,14 @@ license:CC0-1.0
<description>The Fidelity Chessmaster 2100 (version 1.1 17-Nov-88) (cleanly cracked)</description>
<year>1988</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="Troy Heere and Mark Manyen" />
+ <info name="programmer" value="Troy Heere" />
+ <info name="programmer" value="Mark Manyen" />
<info name="version" value="1.1 17-Nov-88" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"The Fidelity Chessmaster 2100" is a 1988 board game developed by Troy Heere and Mark Manyen, and distributed by The Software Toolworks. -->
+ <!-- "The Fidelity Chessmaster 2100" is a 1988 board game developed by Troy Heere and Mark Manyen, and distributed by The Software Toolworks. -->
<!-- cm2100.s16 dated 17-Nov-88 -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
@@ -2217,13 +2462,14 @@ license:CC0-1.0
<description>The Fidelity Chessmaster 2100 (version 1.01 28-Sep-88) (cleanly cracked)</description>
<year>1988</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="Troy Heere and Mark Manyen" />
+ <info name="programmer" value="Troy Heere" />
+ <info name="programmer" value="Mark Manyen" />
<info name="version" value="1.01 28-Sep-88" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"The Fidelity Chessmaster 2100" is a 1988 board game developed by Troy Heere and Mark Manyen, and distributed by The Software Toolworks. -->
+ <!-- "The Fidelity Chessmaster 2100" is a 1988 board game developed by Troy Heere and Mark Manyen, and distributed by The Software Toolworks. -->
<!-- cm2100.s16 dated 28-Sep-88 -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
@@ -2245,12 +2491,14 @@ license:CC0-1.0
<description>The Graphics Studio (cleanly cracked)</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Greg Hospelhorn, Peter Wickman, Richard Antaki" />
+ <info name="programmer" value="Greg Hospelhorn" />
+ <info name="programmer" value="Peter Wickman" />
+ <info name="programmer" value="Richard Antaki" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"The Graphics Studio" is a 1987 graphics program developed by Greg Hospelhorn, Peter Wickman, Richard Antaki, and distributed by Accolade. -->
+ <!-- "The Graphics Studio" is a 1987 graphics program developed by Greg Hospelhorn, Peter Wickman, Richard Antaki, and distributed by Accolade. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2261,25 +2509,26 @@ license:CC0-1.0
</software>
<software name="immortal">
- <description>The Immortal (cleanly cracked)</description>
+ <description>The Immortal (trex crack)</description>
<year>1990</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey, Ian Gooding, Michael Marcanted, Brett G. Durrett, and Douglas Fulton" />
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Ian Gooding" />
+ <info name="programmer" value="Michael Marcanted" />
+ <info name="programmer" value="Brett G. Durrett" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs. -->
- <!--"The Immortal" is a 1990 roleplaying game developed by Will Harvey, Ian Gooding, Michael Marcanted, Brett G. Durrett, and Douglas Fulton, and distributed by Electronic Arts. -->
+ <!-- roleplaying game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Play disk"/>
+ <feature name="part_id" value="Disk 1 - Play"/>
<dataarea name="flop" size="819264">
<rom name="the immortal iigs - disk 1 - play (trex crack).2mg" size="819264" crc="d63f3611" sha1="5ddefe34356f43f4af3d8dff6c3c4dc4180fcdb0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Graphics disk"/>
+ <feature name="part_id" value="Disk 2 - Graphics"/>
<dataarea name="flop" size="819264">
<rom name="the immortal iigs - disk 2 - graphics (trex crack).2mg" size="819264" crc="c7a0e1a2" sha1="71d2811ed2c00f78de995e96f577874503d12a69"/>
</dataarea>
@@ -2295,7 +2544,7 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs ROM01 or later. -->
- <!--"The King of Chicago" is a 1988 adventure game developed by Doug Sharp and distributed by Cinemaware. -->
+ <!-- "The King of Chicago" is a 1988 adventure game developed by Doug Sharp and distributed by Cinemaware. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2316,12 +2565,18 @@ license:CC0-1.0
<description>The Last Ninja (cleanly cracked)</description>
<year>1988</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Jeff Silverman, John Kroeckel, J. David Koch, Erol Otus, Doug Barnett, Russell Lieblich, and Nicky Robinson" />
+ <info name="programmer" value="Jeff Silverman" />
+ <info name="programmer" value="John Kroeckel" />
+ <info name="programmer" value="J. David Koch" />
+ <info name="programmer" value="Erol Otus" />
+ <info name="programmer" value="Doug Barnett" />
+ <info name="programmer" value="Russell Lieblich" />
+ <info name="programmer" value="Nicky Robinson" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"The Last Ninja" is a 1988 action game developed by Jeff Silverman, John Kroeckel, J. David Koch, Erol Otus, Doug Barnett, Russell Lieblich, and Nicky Robinson, and distributed by Activision. -->
+ <!-- "The Last Ninja" is a 1988 action game developed by Jeff Silverman, John Kroeckel, J. David Koch, Erol Otus, Doug Barnett, Russell Lieblich, and Nicky Robinson, and distributed by Activision. -->
<!-- Protection: Bad block check for block $63F -->
<part name="flop1" interface="floppy_3_5">
@@ -2335,13 +2590,14 @@ license:CC0-1.0
<description>The Logic Master (version 1.5) (cleanly cracked)</description>
<year>1990</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas and June Stark" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="June Stark" />
<info name="version" value="1.5" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"The Logic Master" is a 1990 educational program developed by William Demas, and June Stark, and distributed by Unicorn Software. -->
+ <!-- "The Logic Master" is a 1990 educational program developed by William Demas, and June Stark, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2358,20 +2614,85 @@ license:CC0-1.0
</part>
</software>
+ <software name="ntsbalpha">
+ <description>The New Talking Stickybear Alphabet (cleanly cracked)</description>
+ <year>1988</year>
+ <publisher>Optimum Resource</publisher>
+ <info name="developer" value="Optimum Resource" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-01-25 -->
+ <!-- It requires a 512K Apple IIgs ROM01 or later. -->
+ <!-- "The New Talking Stickybear Alphabet" is an educational program designed to teach children the alphabet through the use of graphics and speech -->
+ <!-- Protection: Unformatted track $03, Side $01 (bad blocks $54 through $5F) check -->
+
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="819264">
+ <rom name="the new talking stickybear alphabet iigs disk 1 (trex crack).2mg" size="819264" crc="4f80d28b" sha1="c6b243cc8aa3c2b39658095c5a1b91bbdcd40629" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="819264">
+ <rom name="the new talking stickybear alphabet iigs disk 2 (trex crack).2mg" size="819264" crc="35817368" sha1="1426cf78a664e0ec41128fec150c084e9d1f3874" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ntsbopp">
+ <description>The New Talking Stickybear Opposites (cleanly cracked)</description>
+ <year>1988</year>
+ <publisher>Optimum Resource</publisher>
+ <info name="developer" value="Optimum Resource" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-01-25 -->
+ <!-- It requires a 512K Apple IIgs ROM01 or later. -->
+ <!-- "The New Talking Stickybear Opposites" is an educational program designed to teach children opposites through the use of graphics and speech -->
+ <!-- Protection: Unformatted track $03, Side $01 (bad blocks $54 through $5F) check -->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="the new talking stickybear opposites iigs (trex crack).2mg" size="819264" crc="a2ce5ec8" sha1="0954c66f8858d26ce70c1926236b4115f705f2c5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ntsbshapes">
+ <description>The New Talking Stickybear Shapes (cleanly cracked)</description>
+ <year>1988</year>
+ <publisher>Optimum Resource</publisher>
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
+ <info name="programmer" value="Susan Dubicki" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-01-25 -->
+ <!-- It requires a 512K Apple IIgs ROM01 or later. -->
+ <!-- "The New Talking Stickybear Shapes" is an educational program designed to teach children basic shapes through the use of graphics and speech -->
+ <!-- Protection: Unformatted track $03, Side $01 (bad blocks $54 through $5F) check -->
+
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="the new talking stickybear shapes iigs (trex crack).2mg" size="819264" crc="f52125b9" sha1="93967102bb9642aba3607291cf30d6e0a1a01c5e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="printshp">
- <description>The Print Shop (version 1.0) (cleanly cracked)</description>
+ <description>The Print Shop (version 1.0) (trex crack)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="David Balsam, Martin Kahn, Corey Kosak, Ann E. Kronen, Susan E. Schlangen, Richard Whittaker, Michelle McBride, Don Albrecht, and Leila Bronstein" />
+ <info name="author" value="David Balsam" />
+ <info name="author" value="Martin Kahn" />
+ <info name="programmer" value="Corey Kosak" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs ROM 01 or earlier. -->
- <!-- NOT Compatible with the Apple IIgs ROM03. -->
- <!--"The Print Shop IIgs" is a 1987 graphics program developed by David Balsam, Martin Kahn, Corey Kosak, Ann E. Kronen, Susan E. Schlangen, Richard Whittaker, Michelle McBride, Don Albrecht, and Leila Bronstein, and distributed by Brøderbund Software. -->
+ <!-- graphics program -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="the print shop v1.0 iigs (trex crack).2mg" size="819264" crc="0b761d41" sha1="69b56345568b39fd8aa59455b44a341a600c848e"/>
@@ -2383,12 +2704,20 @@ license:CC0-1.0
<description>The Third Courier (cleanly cracked)</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Carol Manley, Ivan Manley, Mike Branham, Robert Clardy, Chris Barker, Scott Wallin, Miik Nichols, Sheldon Safir, and Mark Wallace" />
+ <info name="programmer" value="Carol Manley" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="programmer" value="Mike Branham" />
+ <info name="programmer" value="Robert Clardy" />
+ <info name="programmer" value="Chris Barker" />
+ <info name="programmer" value="Scott Wallin" />
+ <info name="programmer" value="Miik Nichols" />
+ <info name="programmer" value="Sheldon Safir" />
+ <info name="programmer" value="Mark Wallace" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs ROM01 or later. -->
- <!--"The Third Courier" is a 1989 adventure game developed by Carol Manley, Ivan Manley, Mike Branham, Robert Clardy, Chris Barker, Scott Wallin, Miik Nichols, Sheldon Safir, and Mark Wallace, and distributed by Accolade. -->
+ <!-- "The Third Courier" is a 1989 adventure game developed by Carol Manley, Ivan Manley, Mike Branham, Robert Clardy, Chris Barker, Scott Wallin, Miik Nichols, Sheldon Safir, and Mark Wallace, and distributed by Accolade. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -2409,12 +2738,14 @@ license:CC0-1.0
<description>The Tower of Myraglen (version 1.0) (cleanly cracked)</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Richard L. Seaborne and Jeff A. Lamberts" />
+ <info name="programmer" value="Richard L. Seaborne" />
+ <info name="programmer" value="Jeff A. Lamberts" />
+ <info name="version" value="1.0" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"The Tower of Myraglen" is a 1987 roleplaying game developed by Richard L. Seaborne and Jeff A. Lamberts, and distributed by PBI Software. -->
+ <!-- "The Tower of Myraglen" is a 1987 roleplaying game developed by Richard L. Seaborne and Jeff A. Lamberts, and distributed by PBI Software. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -2435,12 +2766,18 @@ license:CC0-1.0
<description>The Three Stooges (cleanly cracked)</description>
<year>1987</year>
<publisher>Cinemaware</publisher>
- <info name="programmer" value="John Cutter, Robert Jacob, Phyllis Jacob, Ed Magnin, Russell Truelove, Jim Simmons, and Patrick Cook" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Robert Jacob" />
+ <info name="programmer" value="Phyllis Jacob" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Russell Truelove" />
+ <info name="programmer" value="Jim Simmons" />
+ <info name="programmer" value="Patrick Cook" />
<info name="usage" value="Requires an 1.25MB Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1.25MB Apple IIgs ROM01 or later. -->
- <!--"The Three Stooges" is a 1987 adventure game developed by John Cutter, Robert Jacob, Phyllis Jacob, Ed Magnin, Russell Truelove, Jim Simmons, and Patrick Cook and distributed by Cinemaware. -->
+ <!-- "The Three Stooges" is a 1987 adventure game developed by John Cutter, Robert Jacob, Phyllis Jacob, Ed Magnin, Russell Truelove, Jim Simmons, and Patrick Cook and distributed by Cinemaware. -->
<!-- Protection: Bad block check for block $10D -->
<part name="flop1" interface="floppy_3_5">
@@ -2461,12 +2798,14 @@ license:CC0-1.0
<description>The Wonders of the Animal Kingdom (cleanly cracked)</description>
<year>1989</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stan Brewster, Joseph Hewitt, and June Stark" />
+ <info name="programmer" value="Stan Brewster" />
+ <info name="programmer" value="Joseph Hewitt" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1MB Apple IIgs. -->
- <!--"The Wonders of the Animal Kingdom" is a 1989 educational program developed by Stan Brewster, Joseph B. Hewitt IV, and June Stark, and distributed by Unicorn Software. -->
+ <!-- "The Wonders of the Animal Kingdom" is a 1989 educational program developed by Stan Brewster, Joseph B. Hewitt IV, and June Stark, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2487,12 +2826,13 @@ license:CC0-1.0
<description>The Word Master (cleanly cracked)</description>
<year>1989</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas and Joseph Hewitt" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="Joseph Hewitt" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 1MB Apple IIgs. -->
- <!--"The Word Master" is a 1989 educational program developed by William Demas and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
+ <!-- "The Word Master" is a 1989 educational program developed by William Demas and Joseph B. Hewitt IV, and distributed by Unicorn Software. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
@@ -2502,19 +2842,49 @@ license:CC0-1.0
</part>
</software>
+ <software name="thexder10" cloneof="thexder">
+ <description>Thexder (version 1.0) (trex crack) (No OS, not self booting)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="H. Godai" />
+ <info name="programmer" value="S. Uesaka" />
+ <info name="programmer" value="Michael D. Branham" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="John P. Conley" />
+ <info name="programmer" value="Lloyd Ollmann, Jr." />
+ <info name="programmer" value="Michael Ormsby" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- Dump released: 2021-08-13 -->
+ <!-- Original release by Sierra On-Line - Did NOT come with OS and was NOT self bootable -->
+ <!-- The file "othexder" had been undeleted (and cracked) and is closer to v2.7 in how it's demo sounds fade -->
+ <!-- Protection: Bad block check for block $634 -->
+ <!-- action game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819264">
+ <rom name="thexder v1.0 iigs (trex crack).2mg" size="819264" crc="5a105720" sha1="31061b4561c967d824936c94ce882f2efcb017da"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="thexder">
- <description>Thexder (version 2.7) (cleanly cracked)</description>
+ <description>Thexder (version 2.7) (trex crack)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="H. Godai, S. Uesaka, Michael D. Branham, Robert C. Clardy, John P. Conley, Lloyd Ollmann Jr., and Michael Ormsby" />
+ <info name="programmer" value="H. Godai" />
+ <info name="programmer" value="S. Uesaka" />
+ <info name="programmer" value="Michael D. Branham" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="John P. Conley" />
+ <info name="programmer" value="Lloyd Ollmann, Jr." />
+ <info name="programmer" value="Michael Ormsby" />
<info name="version" value="2.7" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Thexder" is a 1987 action game developed by H. Godai, S. Uesaka, Michael D. Branham, Robert C. Clardy, John P. Conley, Lloyd Ollmann Jr., and Michael Ormsby, and distributed by Sierra On-Line. -->
<!-- Protection: Bad block check for block $634 -->
-
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="thexder v2.7 iigs (trex crack).2mg" size="819264" crc="7fa5ad73" sha1="acb227363d426c86ab5ac80c126fc430616cb535"/>
@@ -2522,41 +2892,40 @@ license:CC0-1.0
</part>
</software>
- <software name="thexdero" cloneof="thexder">
- <description>Thexder (version 1.0) (cleanly cracked) (No OS, not self booting)</description>
+ <software name="topdraw">
+ <description>TopDraw (version 1.01A (8/4/87)) (cleanly cracked)</description>
<year>1987</year>
- <publisher>Sierra</publisher>
- <info name="programmer" value="H. Godai, S. Uesaka, Michael D. Branham, Robert C. Clardy, John P. Conley, Lloyd Ollmann Jr., and Michael Ormsby" />
- <info name="version" value="1.0 - No OS, not self booting" />
+ <publisher>StyleWare</publisher>
+ <info name="programmer" value="Robert A. Hearn" />
+ <info name="programmer" value="Jeff G. Erickson" />
+ <info name="version" value="1.01A (8/4/87)" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
- <!-- Dump released: 2021-08-13 -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Thexder" is a 1987 action game developed by H. Godai, S. Uesaka, Michael D. Branham, Robert C. Clardy, John P. Conley, Lloyd Ollmann Jr., and Michael Ormsby, and distributed by Sierra On-Line. -->
- <!-- Original release by Sierra On-Line - Did NOT come with OS and was NOT self bootable -->
- <!-- The file "othexder" had been undeleted (and cracked) and is closer to v2.7 in how it's demo sounds fade -->
- <!-- Protection: Bad block check for block $634 -->
+ <!-- "TopDraw" is a professional object-oriented graphics drawing environment. Beagle Bros Software later acquired the StyleWare library and rebranded TopDraw as BeagleDraw. -->
+ <!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="thexder v1.0 iigs (trex crack).2mg" size="819264" crc="5a105720" sha1="31061b4561c967d824936c94ce882f2efcb017da"/>
+ <rom name="topdraw v1.01a iigs (trex crack).2mg" size="819264" crc="d7cf235e" sha1="b488b0cef54cb71f447a0d6b508f86220cb09d4d" />
</dataarea>
</part>
</software>
- <software name="topdraw">
- <description>Topdraw (version 1.00A) (cleanly cracked)</description>
+ <software name="topdraw100a" cloneof="topdraw">
+ <description>TopDraw (version 1.00A (7/12/87)) (cleanly cracked)</description>
<year>1987</year>
- <publisher>Styleware Software</publisher>
- <info name="version" value="1.00A" />
+ <publisher>StyleWare</publisher>
+ <info name="programmer" value="Robert A. Hearn" />
+ <info name="programmer" value="Jeff G. Erickson" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS"/>
+ <info name="version" value="1.00A (7/12/87)" />
+ <sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs. -->
- <!--"Topdraw" is a 1987 graphics program developed by Robert Hearn and Jeff Erickson, and distributed by Styleware Software. -->
- <!-- Topdraw later became Beagle Draw sold under the Beagle Brothers banner. Topdraw v1.01A known to exist but not currently archived -->
+ <!-- graphics program -->
+ <!-- TopDraw later became Beagle Draw sold under the Beagle Brothers banner. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="topdraw v1.00a iigs (trex crack).2mg" size="819264" crc="39e7967f" sha1="35746bbc2232251d96264989705a6e6286bafef5"/>
@@ -2568,13 +2937,16 @@ license:CC0-1.0
<description>TrianGo (version 1.0) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Staszek Bartkowski, Marcin Szostakowski, Maciej Markuszewski, Dorota Błaszczak" />
+ <info name="programmer" value="Staszek Bartkowski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"TrianGo" is a 1988 board game developed by Staszek Bartkowski, Marcin Szostakowski, Maciej Markuszewski, Dorota Błaszczak, and distributed by California Dreams. -->
+ <!-- "TrianGo" is a 1988 board game developed by Staszek Bartkowski, Marcin Szostakowski, Maciej Markuszewski, Dorota Błaszczak, and distributed by California Dreams. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -2588,12 +2960,24 @@ license:CC0-1.0
<description>Uninvited (cleanly cracked)</description>
<year>1988</year>
<publisher>ICOM Simulations</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldemar Horwat, Mark Waterman, Tod Zipnick, and Billy Wolf" />
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="Craig Erickson" />
+ <info name="programmer" value="Steven Hays" />
+ <info name="programmer" value="Terry Schulenburg" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldemar Horwat" />
+ <info name="programmer" value="Mark Waterman" />
+ <info name="programmer" value="Tod Zipnick" />
+ <info name="programmer" value="Billy Wolf" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs. -->
- <!--"Uninvited" is a 1988 adventure game developed by Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldemar Horwat, Mark Waterman, Tod Zipnick, and Billy Wolf, and distributed by ICOM Simulations. -->
+ <!-- "Uninvited" is a 1988 adventure game developed by Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldemar Horwat, Mark Waterman, Tod Zipnick, and Billy Wolf, and distributed by ICOM Simulations. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -2611,26 +2995,30 @@ license:CC0-1.0
</software>
<software name="usageogr">
- <description>USA GeoGraph (Version 1.0) (cleanly cracked)</description>
+ <description>USA GeoGraph (A-300 version 1.0) (trex crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
- <info name="programmer" value="Nelson Whyatt, Paul R. Wenker, Wayne Studer, Steven D. Splinter, John L. Krenz, and Charolyn Kapplinger" />
+ <info name="partno" value="A-300" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="programmer" value="Paul R. Wenker" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="John L. Krenz" />
+ <info name="programmer" value="Charolyn Kapplinger" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2023-04-13 -->
- <!-- It requires a 768K Apple IIgs. -->
- <!--"USA GeoGraph" is a 1989 educational program developed by Nelson Whyatt, Paul R. Wenker, Wayne Studer, Steven D. Splinter, John L. Krenz, and Charolyn Kapplinger, and distributed by MECC Software. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $8 -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk"/>
+ <feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="819264">
<rom name="usa geograph v1.0 iigs - disk 1 - program (trex crack).2mg" size="819264" crc="f968d252" sha1="ebda6798c67d277a15314b97d116f40e6b072ccd" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Information disk"/>
+ <feature name="part_id" value="Disk 2 - Information"/>
<dataarea name="flop" size="819264">
<rom name="usa geograph v1.0 iigs - disk 2 - Information (trex crack).2mg" size="819264" crc="c5bc2c2c" sha1="6ef5b7be7d2a813387cfb4fa381c76d40d94c6ca" />
</dataarea>
@@ -2641,13 +3029,16 @@ license:CC0-1.0
<description>Vegas Craps (version 1.0) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Krzysztof Koziarski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak" />
+ <info name="programmer" value="Krzysztof Koziarski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Vegas Gambler" is a 1988 simulation game developed by Krzysztof Koziarski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak, and distributed by California Dreams. -->
+ <!-- "Vegas Gambler" is a 1988 simulation game developed by Krzysztof Koziarski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak, and distributed by California Dreams. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -2661,13 +3052,17 @@ license:CC0-1.0
<description>Vegas Gambler (version 1.1 25-Jul-88) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak" />
+ <info name="programmer" value="Marek Jackiewicz" />
+ <info name="programmer" value="Andrzej Miciłkiewicz" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="version" value="1.1 25-Jul-88" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Vegas Gambler" is a 1988 simulation game developed by Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak, and distributed by California Dreams. -->
+ <!-- "Vegas Gambler" is a 1988 simulation game developed by Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak, and distributed by California Dreams. -->
<!-- gambler.sys16 dated 25-Jul-88 -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
@@ -2682,13 +3077,17 @@ license:CC0-1.0
<description>Vegas Gambler (version 1.0 07-Jun-88) (cleanly cracked)</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak" />
+ <info name="programmer" value="Marek Jackiewicz" />
+ <info name="programmer" value="Andrzej Miciłkiewicz" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="version" value="1.0 07-Jun-88" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Vegas Gambler" is a 1988 simulation game developed by Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak, and distributed by California Dreams. -->
+ <!-- "Vegas Gambler" is a 1988 simulation game developed by Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak, and distributed by California Dreams. -->
<!-- gambler.sys16 dated 07-Jun-88 -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
@@ -2703,12 +3102,27 @@ license:CC0-1.0
<description>War in Middle Earth (cleanly cracked)</description>
<year>1989</year>
<publisher>Melbourne House</publisher>
- <info name="programmer" value="Ron Harris, Robert Clardy, Alan B. Clark, Graeme Devine, Mike Branham, Lloyd Ollmann, Jr., John Conley, Jim McBride, Michael Park, David Schroeder, Michael Ormsby, Mike Christy, Ann Dickens Clardy, Marcus Streets, Mark Riley, and Mike Singleton" />
+ <info name="programmer" value="Ron Harris" />
+ <info name="programmer" value="Robert Clardy" />
+ <info name="programmer" value="Alan B. Clark" />
+ <info name="programmer" value="Graeme Devine" />
+ <info name="programmer" value="Mike Branham" />
+ <info name="programmer" value="Lloyd Ollmann, Jr." />
+ <info name="programmer" value="John Conley" />
+ <info name="programmer" value="Jim McBride" />
+ <info name="programmer" value="Michael Park" />
+ <info name="programmer" value="David Schroeder" />
+ <info name="programmer" value="Michael Ormsby" />
+ <info name="programmer" value="Mike Christy" />
+ <info name="programmer" value="Ann Dickens Clardy" />
+ <info name="programmer" value="Marcus Streets" />
+ <info name="programmer" value="Mark Riley" />
+ <info name="programmer" value="Mike Singleton" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 768K Apple IIgs ROM01 or later. -->
- <!--"War in Middle Earth" is a 1989 adventure game developed by Ron Harris, Robert Clardy, Alan B. Clark, Graeme Devine, Mike Branham, Lloyd Ollmann, Jr., John Conley, Jim McBride, Michael Park, David Schroeder, Michael Ormsby, Mike Christy, Ann Dickens Clardy, Marcus Streets, Mark Riley, and Mike Singleton, and distributed by Melbourne House. -->
+ <!-- "War in Middle Earth" is a 1989 adventure game developed by Ron Harris, Robert Clardy, Alan B. Clark, Graeme Devine, Mike Branham, Lloyd Ollmann, Jr., John Conley, Jim McBride, Michael Park, David Schroeder, Michael Ormsby, Mike Christy, Ann Dickens Clardy, Marcus Streets, Mark Riley, and Mike Singleton, and distributed by Melbourne House. -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
<part name="flop1" interface="floppy_3_5">
@@ -2725,18 +3139,19 @@ license:CC0-1.0
</part>
</software>
- <software name="carmnusa">
- <description>Where in the U.S.A. is Carmen Sandiego? (cleanly cracked)</description>
+ <software name="carmusa">
+ <description>Where in the U.S.A. is Carmen Sandiego? (trex crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliot, Peter Adams, Leila Bronstein, Julie Glavin, Michelle McBride, Dan Guerra, Les Pardue, Bevan Hulfenstein, Louis Evans, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliot" />
+ <info name="developer" value="Sculptured Software" />
+ <info name="programmer" value="Peter Adams" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 1MB Apple IIgs ROM 01 or later. -->
- <!--"Where in the U.S.A. is Carmen Sandiego?" is a 1989 educational game developed by Gene Portwood, Lauren Elliot, Peter Adams, Leila Bronstein, Julie Glavin, Michelle McBride, Dan Guerra, Les Pardue, Bevan Hulfenstein, Louis Evans, and Tom Rettig, and distributed by Brøderbund Software. -->
+ <!-- educational game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -2752,17 +3167,18 @@ license:CC0-1.0
</software>
<software name="carmnwld">
- <description>Where in the World is Carmen Sandiego? (cleanly cracked)</description>
+ <description>Where in the World is Carmen Sandiego? (version 1.0) (trex crack)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Loring Vogel, Leila Bronstein, Don Albrecht, and Michelle McBride" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Loring Vogel" />
<info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Where in the World is Carmen Sandiego?" is a 1989 educational game developed by Gene Portwood, Lauren Elliott, Loring Vogel, Leila Bronstein, Don Albrecht, and Michelle McBride, and distributed by Brøderbund Software. -->
+ <!-- educational game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
@@ -2778,17 +3194,15 @@ license:CC0-1.0
</software>
<software name="wingames">
- <description>Winter Games (cleanly cracked)</description>
+ <description>Winter Games (trex crack)</description>
<year>1987</year>
<publisher>Epyx</publisher>
<info name="developer" value="Westwood Studios" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Winter Games" is a 1987 sports game developed by Westwood Studios and distributed by Epyx. -->
+ <!-- sports game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="winter games iigs (trex crack).2mg" size="819264" crc="03f522af" sha1="467d2782f572c107f2b9fa7789761d789ce21763"/>
@@ -2797,17 +3211,15 @@ license:CC0-1.0
</software>
<software name="wldgames">
- <description>World Games (cleanly cracked)</description>
+ <description>World Games (trex crack)</description>
<year>1987</year>
<publisher>Epyx</publisher>
<info name="developer" value="Westwood Studios" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"World Games" is a 1987 sports game developed by Westwood and distributed by Epyx. -->
+ <!-- sports game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="world games iigs (trex crack).2mg" size="819264" crc="6b94c2b7" sha1="34bb9fbd79847d2cbf7c1ad9ba087faa986a16a0"/>
@@ -2816,26 +3228,31 @@ license:CC0-1.0
</software>
<software name="wldgeogr">
- <description>World GeoGraph (Version 1.3) (cleanly cracked)</description>
+ <description>World GeoGraph (USG-100 version 1.3) (trex crack)</description>
<year>1989</year>
<publisher>MECC</publisher>
- <info name="programmer" value="Charolyn Kapplinger, John L. Krenz, Diane Portner, Steven D. Splinter, Wayne Studer, Paul R. Wenker, and Nelson Whyatt" />
+ <info name="partno" value="USG-100" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John L. Krenz" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="programmer" value="Paul R. Wenker" />
+ <info name="programmer" value="Nelson Whyatt" />
<info name="version" value="1.3" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2023-04-13 -->
- <!-- It requires a 768K Apple IIgs. -->
- <!--"USA GeoGraph" is a 1989 educational program developed by Charolyn Kapplinger, John L. Krenz, Diane Portner, Steven D. Splinter, Wayne Studer, Paul R. Wenker, and Nelson Whyatt, and distributed by MECC Software. -->
+ <!-- educational program -->
<!-- Protection: Bad block check for block $8 -->
-
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk"/>
+ <feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="819264">
<rom name="world geograph v1.3 iigs - disk 1 - program (trex crack).2mg" size="819264" crc="a296d62a" sha1="15aa6627a08b3c4f3d1c9e7651218311f07e481e" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Information disk"/>
+ <feature name="part_id" value="Disk 2 - Information"/>
<dataarea name="flop" size="819264">
<rom name="world geograph v1.3 iigs - disk 2 - Information (trex crack).2mg" size="819264" crc="1ec2c293" sha1="6131f8ea4938f9f180e8a5f0a67d5f8f38d90e22" />
</dataarea>
@@ -2843,17 +3260,17 @@ license:CC0-1.0
</software>
<software name="wltrgolf">
- <description>World Tour Golf (cleanly cracked)</description>
+ <description>World Tour Golf (trex crack)</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
- <info name="author" value="Evan and Nicky Robinson and Paul Reiche III" />
+ <info name="author" value="Evan Robinson" />
+ <info name="author" value="Nicky Robinson" />
+ <info name="author" value="Paul Reiche III" />
<info name="programmer" value="John Selhorst" />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"World Tour Golf" is a 1987 sports game developed by Evan and Nicky Robinson and Paul Reiche III, ported to the Apple IIgs by John Selhorst, and distributed by Electronic Arts. -->
+ <!-- sports game -->
<!-- Protection: Key-Word, A manual is required to look up a letter / word or use of code wheel for a specific response -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="world tour golf iigs (trex crack).2mg" size="819264" crc="bf54fe36" sha1="3b1082b75860d10493c9015c5fd22ef3150c686b"/>
@@ -2865,12 +3282,15 @@ license:CC0-1.0
<description>Writer's Choice Elite (cleanly cracked)</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Richard Danais, Nancy Philippine, Bernard Gallet, and Luc Barthelet" />
+ <info name="programmer" value="Richard Danais" />
+ <info name="programmer" value="Nancy Philippine" />
+ <info name="programmer" value="Bernard Gallet" />
+ <info name="programmer" value="Luc Barthelet" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Writer's Choice Elite" is a 1987 productivity program developed by Richard Danais, Nancy Philippine, Bernard Gallet, and Luc Barthelet, and distributed by Activision. -->
+ <!-- "Writer's Choice Elite" is a 1987 productivity program developed by Richard Danais, Nancy Philippine, Bernard Gallet, and Luc Barthelet, and distributed by Activision. -->
<!-- Protection: Bad block check for block $7 -->
<part name="flop1" interface="floppy_3_5">
@@ -2884,13 +3304,14 @@ license:CC0-1.0
<description>Xenocide (version 25-Sep-89) (unprotected)</description>
<year>1989</year>
<publisher>Micro Revelations</publisher>
- <info name="programmer" value="Brian Greenstone and Dave Triplett" />
+ <info name="programmer" value="Brian Greenstone" />
+ <info name="programmer" value="Dave Triplett" />
<info name="version" value="25-Sep-89" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Xenocide" is a 1989 action game developed by Brian Greenstone and Dave Triplett, and distributed by Micro Revelations. -->
+ <!-- "Xenocide" is a 1989 action game developed by Brian Greenstone and Dave Triplett, and distributed by Micro Revelations. -->
<!-- xeno.sys16 dated 25-Sep-89 14:23, 63090 bytes long, 121 blocks -->
<!-- Unprotected version released by Micro Revelations. Currently NOT archived: xeno.sys16 dated 23-JUL-89 11:35, 64996 bytes long, 128 blocks -->
@@ -2905,13 +3326,14 @@ license:CC0-1.0
<description>Xenocide (version 11-Aug-89) (cleanly cracked)</description>
<year>1989</year>
<publisher>Micro Revelations</publisher>
- <info name="programmer" value="Brian Greenstone and Dave Triplett" />
+ <info name="programmer" value="Brian Greenstone" />
+ <info name="programmer" value="Dave Triplett" />
<info name="version" value="11-Aug-89" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
- <!--"Xenocide" is a 1989 action game developed by Brian Greenstone and Dave Triplett, and distributed by Micro Revelations. -->
+ <!-- "Xenocide" is a 1989 action game developed by Brian Greenstone and Dave Triplett, and distributed by Micro Revelations. -->
<!-- xeno.sys16 dated 11-Aug-89 09:34, 65085 bytes long, 129 blocks -->
<!-- Protection: Check for Macintosh "tag bytes" on block $4E1 -->
@@ -2923,17 +3345,18 @@ license:CC0-1.0
</software>
<software name="zanygolf">
- <description>Zany Golf (cleanly cracked)</description>
+ <description>Zany Golf (trex crack)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey, Jim Nitchals, Ian Gooding, and Doug Fulton" />
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="programmer" value="Ian Gooding" />
+ <info name="programmer" value="Doug Fulton" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
- <!-- It requires a 512K Apple IIgs. -->
- <!--"Zany Golf" is a 1988 sports game developed by Will Harvey, Jim Nitchals, Ian Gooding, and Doug Fulton, and distributed by Electronic Arts. -->
+ <!-- sports game -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="zany golf iigs (trex crack).2mg" size="819264" crc="5e917b13" sha1="37658ef75ca9a35277023e66fe0280058d8a237a"/>
diff --git a/hash/apple2gs_flop_misc.xml b/hash/apple2gs_flop_misc.xml
index 56a4b9671d0..128dda75696 100644
--- a/hash/apple2gs_flop_misc.xml
+++ b/hash/apple2gs_flop_misc.xml
@@ -49,10 +49,17 @@ Generated by SLIST 0.1
</software>
<software name="816paint">
- <description>8-16 Paint</description>
+ <description>816/Paint (version 3.1 #24721)</description>
<year>1988</year>
<publisher>Baudville</publisher>
-
+ <info name="partno" value="24721" />
+ <info name="programmer" value="Michael Darooge" />
+ <info name="programmer" value="Robert Barris" />
+ <info name="programmer" value="Gregory C. Miller" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="3.1 #24721" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="8-16 paint (1988)(baudville).2mg" size="819264" crc="3c076e6c" sha1="a5fd00fd538f63a4807d03462556937bae8324a3" />
@@ -336,18 +343,30 @@ Generated by SLIST 0.1
<description>Art &amp; Film Director</description>
<year>1989</year>
<publisher>Epyx</publisher>
-
- <part name="flop1" interface="floppy_3_5">
+ <info name="programmer" value="Novotrade" />
+ <info name="programmer" value="Caesar Studio" />
+ <info name="programmer" value="Amanda Dee" />
+ <info name="programmer" value="Jeff Dee" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Janet Kramer" />
+ <info name="programmer" value="Matthew Sarconi" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Art director" />
<dataarea name="flop" size="819264">
<rom name="art &amp; film director (1989)(epyx)(disk 1 of 3).2mg" size="819264" crc="eba0bf52" sha1="3e305cde7b130ed896963319adaa952c8550d33c" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Film director" />
<dataarea name="flop" size="819264">
<rom name="art &amp; film director (1989)(epyx)(disk 2 of 3).2mg" size="819264" crc="492707f4" sha1="fb3891bd8e51042315882764334142f6ae64fd1a" />
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Graphics disk" />
<dataarea name="flop" size="819264">
<rom name="art &amp; film director (1989)(epyx)(disk 3 of 3)(graphics).2mg" size="819264" crc="44b0aee6" sha1="69edd858958d96017e1fca38abeef79ef6ded7e5" />
</dataarea>
@@ -410,11 +429,24 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="bcauldrn">
+ <software name="blkcauld">
<description>The Black Cauldron</description>
<year>1987</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Elaine Boulay" />
+ <info name="programmer" value="Nancy Casolaro" />
+ <info name="programmer" value="Melissa Haldeman" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="black cauldron, the (1987)(sierra)(disk 1 of 2).2mg" size="819264" crc="ae555dd9" sha1="712ec2c53a6920a11c2b8066080dea5ef967c6d6" />
@@ -517,10 +549,15 @@ Generated by SLIST 0.1
</software>
<software name="bop90s">
- <description>Balance of Power - 1990s Edition</description>
+ <description>Balance of Power: The 1990 Edition</description>
<year>1989</year>
<publisher>Mindscape</publisher>
-
+ <info name="programmer" value="Chris Crawford" />
+ <info name="programmer" value="Ian Hadley" />
+ <info name="programmer" value="Caroline Hadley" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM01 or later." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- board game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819272">
<rom name="balance of power - the 1990 edition (1989)(mindscape).2mg" size="819272" crc="a8b4abf8" sha1="4ac84d9bec915c10c2765b229251a438fd74df9d" />
@@ -528,36 +565,47 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="brdtale2">
- <description>The Bard's Tale II - The Destiny Knight</description>
- <year>1988</year>
- <publisher>Electronic Arts / Interplay</publisher>
-
+ <software name="brdstale">
+ <description>The Bard's Tale: Tales of the Unknown (trex crack)</description>
+ <year>1987</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- roleplaying game -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819278">
- <rom name="bard's tale ii - the destiny knight, the (1988)(electronic arts)(disk 1 of 2).2mg" size="819278" crc="7d5159e9" sha1="4cc614a3af475a22a767a2e5a1f13244abc9e526" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="819264">
+ <rom name="bard's tale - tales of the unknown, the (1987)(electronic arts)(disk 1 of 2)(trex crack).2mg" size="819264" crc="9294901d" sha1="bd9ca1ca5a0dbb24c0890831336416403a871b44" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
<dataarea name="flop" size="819264">
- <rom name="bard's tale ii - the destiny knight, the (1988)(electronic arts)(disk 2 of 2)[character].2mg" size="819264" crc="fa91f5db" sha1="8d2d43290939d798bf7194067d6c01b4c834988e" />
+ <rom name="bard's tale - tales of the unknown, the (1987)(electronic arts)(disk 2 of 2)[character].2mg" size="819264" crc="1bda3dc5" sha1="e8e43a7e6f21415ea988b65a65f6833160485c69" />
</dataarea>
</part>
</software>
- <software name="brdtale">
- <description>The Bard's Tale - Tales of the Unknown (clean crack)</description>
- <year>1987</year>
- <publisher>Electronic Arts / Interplay</publisher>
-
+ <software name="brdtale2">
+ <description>The Bard's Tale II: The Destiny Knight</description>
+ <year>1988</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- roleplaying game -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819264">
- <rom name="bard's tale - tales of the unknown, the (1987)(electronic arts)(disk 1 of 2)(trex crack).2mg" size="819264" crc="9294901d" sha1="bd9ca1ca5a0dbb24c0890831336416403a871b44" />
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="819278">
+ <rom name="bard's tale ii - the destiny knight, the (1988)(electronic arts)(disk 1 of 2).2mg" size="819278" crc="7d5159e9" sha1="4cc614a3af475a22a767a2e5a1f13244abc9e526" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
<dataarea name="flop" size="819264">
- <rom name="bard's tale - tales of the unknown, the (1987)(electronic arts)(disk 2 of 2)[character].2mg" size="819264" crc="1bda3dc5" sha1="e8e43a7e6f21415ea988b65a65f6833160485c69" />
+ <rom name="bard's tale ii - the destiny knight, the (1988)(electronic arts)(disk 2 of 2)[character].2mg" size="819264" crc="fa91f5db" sha1="8d2d43290939d798bf7194067d6c01b4c834988e" />
</dataarea>
</part>
</software>
@@ -575,10 +623,23 @@ Generated by SLIST 0.1
</software>
<software name="btlchess">
- <description>Battle Chess (clean crack)</description>
+ <description>Battle Chess (trex crack)</description>
<year>1988</year>
- <publisher>Interplay</publisher>
-
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Jim Sproul" />
+ <info name="programmer" value="Todd J. Camasta" />
+ <info name="programmer" value="Bruce Schlickbernd" />
+ <info name="programmer" value="Kurt Heiden" />
+ <info name="programmer" value="Bill (Weez) Dugan" />
+ <info name="programmer" value="Thomas R. Decker" />
+ <info name="programmer" value="Troy P. Worrell" />
+ <info name="programmer" value="Michael Quarles" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Alan Pavlish" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2021-05-03 -->
+ <!-- board game. The manual at https://archive.org/details/Battle_Chess_Manual contains the information you need for the copy protection questions -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="battle chess (1988-89)(interplay)(trex crack).2mg" size="819264" crc="f3b3de94" sha1="bc28e66e75ef41af5194a65dfe217cfff9abfc2b" />
@@ -634,11 +695,20 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="calcraft">
- <description>Calendar Crafter</description>
+ <software name="calcraft" supported="no">
+ <description>Calendar Crafter (A-194 version 1.0)</description>
<year>1987</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-194" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="Paul R. Wenker" />
+ <info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- productivity program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="calendar crafter (1987)(mecc)(us).2mg" size="819264" crc="47fcfdad" sha1="3bc497384aa2a49a65d5435ed128f899ef35bd51" />
@@ -650,7 +720,16 @@ Generated by SLIST 0.1
<description>California Games [cracked]</description>
<year>1988</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Jimmy Huey" />
+ <info name="programmer" value="Dan Chang" />
+ <info name="programmer" value="Jenny Martin" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Bill Bogenreif" />
+ <info name="programmer" value="Matt Householder" />
+ <info name="programmer" value="Ron Fortier" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819279">
<rom name="california games (1988)(epyx)[cr].2mg" size="819279" crc="487a1e51" sha1="008330102aaf66defb40dd328bab204a2182232a" />
@@ -683,16 +762,24 @@ Generated by SLIST 0.1
</software>
<software name="carmnusa">
- <description>Where in the USA is Carmen Sandiego?</description>
+ <description>Where in the U.S.A. is Carmen Sandiego?</description>
<year>1990</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliot" />
+ <info name="developer" value="Sculptured Software" />
+ <info name="programmer" value="Peter Adams" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
<rom name="where in the usa is carmen sandiego (1990)(broderbund)(disk 1 of 2).2mg" size="819264" crc="685addc9" sha1="65d4a40b0a1c90257317a5d2568fe6df7394d338" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="819264">
<rom name="where in the usa is carmen sandiego (1990)(broderbund)(disk 2 of 2).2mg" size="819264" crc="d43580e7" sha1="c553863b84befad9cde0db2de1c31060d430d39f" />
</dataarea>
@@ -700,16 +787,24 @@ Generated by SLIST 0.1
</software>
<software name="carmnwld">
- <description>Where in the World is Carmen Sandiego?</description>
+ <description>Where in the World is Carmen Sandiego? (version 1.0)</description>
<year>1989</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Loring Vogel" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- educational game -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
<dataarea name="flop" size="819264">
<rom name="where in the world is carmen sandiego (1989)(broderbund)(disk 1 of 2)(system).2mg" size="819264" crc="b14edea8" sha1="55158dd0fc6a81c9689df6fec2a15c21fec32d98" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2"/>
<dataarea name="flop" size="819264">
<rom name="where in the world is carmen sandiego (1989)(broderbund)(disk 2 of 2).2mg" size="819264" crc="8ee2b37c" sha1="bed699aee8b580f1e2824d91f103a5f120080859" />
</dataarea>
@@ -941,18 +1036,26 @@ Generated by SLIST 0.1
<description>Cartooners</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Randy McLaughlin" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Mike Johnston" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="819264">
<rom name="cartooners (1988)(electronic arts)(disk 1 of 3).2mg" size="819264" crc="b75b84fc" sha1="6d750c6bd26e8dc663f37a597f864e9da038e20a" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Art" />
<dataarea name="flop" size="819264">
<rom name="cartooners (1988)(electronic arts)(disk 2 of 3).2mg" size="819264" crc="08fd64db" sha1="408eac8e2a4f22a97284a0635b23093456566093" />
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Space art" />
<dataarea name="flop" size="819264">
<rom name="cartooners (1988)(electronic arts)(disk 3 of 3)(space art).2mg" size="819264" crc="20c4a420" sha1="9955346b4bcc491acd03eb25a700aa91ac9897be" />
</dataarea>
@@ -1089,7 +1192,11 @@ Generated by SLIST 0.1
<description>Destroyer</description>
<year>1987</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Chuck Sommerville" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819273">
<rom name="destroyer (1987)(epyx).2mg" size="819273" crc="c9fa5491" sha1="c5769882f698d8a31fe3e1b7b533be1cb1cac475" />
@@ -1112,14 +1219,20 @@ Generated by SLIST 0.1
<software name="dhilchl">
<description>Downhill Challenge</description>
<year>1989</year>
- <publisher>Brøderbund</publisher>
-
- <part name="flop1" interface="floppy_3_5">
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Christian Bertrand" />
+ <info name="programmer" value="Jean Claude Levy" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - System disk" />
<dataarea name="flop" size="819279">
<rom name="downhill challenge (1989)(broderbund)(disk 1 of 2)[system].2mg" size="819279" crc="b3190d0f" sha1="82ae852aa8fa87ef9fc55911c4acd51aaf919703" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Game disk" />
<dataarea name="flop" size="819277">
<rom name="downhill challenge (1989)(broderbund)(disk 2 of 2).2mg" size="819277" crc="01f2ae04" sha1="3f0deb874ec71b3e803bb7ef9fa38b426ab2fb96" />
</dataarea>
@@ -1192,26 +1305,35 @@ Generated by SLIST 0.1
</software>
<software name="dpaint2">
- <description>Deluxe Paint II</description>
+ <description>DeluxePaint II (version 2.01)</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="author" value="Daniel Silva" />
+ <info name="programmer" value="Brent Iverson" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="2.01" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="819264">
<rom name="deluxe paint ii (1987)(electronic arts)(disk 1 of 4).2mg" size="819264" crc="06ed9d94" sha1="2a0335a17107e2bd183120b2337f40cb01019ab2" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Art 1" />
<dataarea name="flop" size="819264">
<rom name="deluxe paint ii (1987)(electronic arts)(disk 2 of 4)(art 1).2mg" size="819264" crc="9190e44f" sha1="7e8f98c7bb7d7cb883edf679bd4df53587c73f04" />
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Art 2" />
<dataarea name="flop" size="819264">
<rom name="deluxe paint ii (1987)(electronic arts)(disk 3 of 4)(art 2).2mg" size="819264" crc="2ee7ff27" sha1="985ecee956a9c11a099c09f907665c9f101f9e5d" />
</dataarea>
</part>
<part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 4 - Seasons and holiday" />
<dataarea name="flop" size="819264">
<rom name="deluxe paint ii (1987)(electronic arts)(disk 4 of 4)[seasons holiday].2mg" size="819264" crc="98c332c1" sha1="bfc28bc9ddd42d1d6f3d0edb79ae0c4e3a74bff6" />
</dataarea>
@@ -1219,10 +1341,14 @@ Generated by SLIST 0.1
</software>
<software name="drawplus">
- <description>Draw Plus</description>
+ <description>Draw Plus (version 1.1)</description>
<year>1987</year>
<publisher>Activision</publisher>
-
+ <info name="programmer" value="H. Lamiraux" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="draw plus (1987)(activision).2mg" size="819264" crc="6b25061d" sha1="2f9e44f6d9448a80e347f1f3daa0cfcaace42587" />
@@ -1260,10 +1386,15 @@ Generated by SLIST 0.1
</software>
<software name="dreamzne">
- <description>Dream Zone</description>
+ <description>Dream Zone (version 3.1 #29701)</description>
<year>1988</year>
<publisher>Baudville</publisher>
-
+ <info name="partno" value="29701" />
+ <info name="programmer" value="Andy Gavin" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="3.1 #29701" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="dream zone (1988)(baudville)(disk 1 of 2)[b].2mg" size="819264" crc="b9621c49" sha1="2056eac871c36d6e1b196523b6146308c8ad2616" status="baddump" />
@@ -1279,8 +1410,15 @@ Generated by SLIST 0.1
<software name="drgnwars">
<description>Dragon Wars</description>
<year>1990</year>
- <publisher>Interplay</publisher>
-
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Todd Camasta" />
+ <info name="programmer" value="Charles Deenan" />
+ <info name="programmer" value="Brian Fargo" />
+ <info name="programmer" value="Paul O'Connor" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="dragon wars (1990)(interplay).2mg" size="819271" crc="70108356" sha1="0bdfb4026437cd53ab57f10e2813492fd6659191" />
@@ -1313,10 +1451,18 @@ Generated by SLIST 0.1
</software>
<software name="dsgnprnt">
- <description>Designer Prints</description>
+ <description>Designer Prints (A-252 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-252" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- desktop publishing program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="designer prints (1989)(mecc)(us).2mg" size="819264" crc="42b3f642" sha1="6a9fd3b642267d347942c4385b3f01a1ba66ee88" />
@@ -1325,10 +1471,18 @@ Generated by SLIST 0.1
</software>
<software name="dsgnpuzl">
- <description>Designer Puzzles</description>
+ <description>Designer Puzzles (A-223 version 1.0)</description>
<year>1990</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-223" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- desktop publishing program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="designer puzzles (1990)(mecc)(us).2mg" size="819264" crc="c3820b33" sha1="051cecb8630a113195457dec41c59945f0c94abf" />
@@ -1433,7 +1587,10 @@ Generated by SLIST 0.1
<description>Deluxe Write</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="2.01" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="deluxe write (1988)(electronic arts).2mg" size="819264" crc="ea674fe4" sha1="b4acba782264300c20eb3b87d23f45569a6172ce" />
@@ -1543,11 +1700,17 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="fantavsn">
- <description>Fantavision</description>
+ <software name="fantvisn">
+ <description>Fantavision (version 2.1)</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Scott Anderson" />
+ <info name="programmer" value="Ken Rosen" />
+ <info name="version" value="2.1" />
+ <info name="usage" value="Requires a 256K Apple IIgs ROM 01 or earlier." />
+ <!-- NOT Compatible with the Apple IIgs ROM03. -->
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="fantavision (1987)(broderbund).2mg" size="819264" crc="b46666bb" sha1="cc76b1c548af2dd6f8b5dd553a3c60b3217412d3" />
@@ -1684,7 +1847,10 @@ Generated by SLIST 0.1
<description>Gauntlet</description>
<year>1988</year>
<publisher>Mindscape</publisher>
-
+ <info name="developer" value="Atari Games" />
+ <info name="usage" value="Requires a 256K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- arcade game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819272">
<rom name="gauntlet (1988)(mindscape).2mg" size="819272" crc="16588690" sha1="39aa3a14db72305174132fd34042eca991920647" />
@@ -1763,10 +1929,14 @@ Generated by SLIST 0.1
</software>
<software name="geometry">
- <description>Geometry</description>
+ <description>Geometry (version 1.0)</description>
<year>1988</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Sensei Software" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="geometry (1988)(broderbund)(disk 1 of 3).2mg" size="819264" crc="d0a2e6a0" sha1="d4d9b09bb9cbdef76a417131074c1186385d81fb" />
@@ -2221,10 +2391,13 @@ Generated by SLIST 0.1
</software>
<software name="hostage">
- <description>Hostage</description>
+ <description>Hostage: Rescue Mission</description>
<year>1990</year>
<publisher>Mindscape</publisher>
-
+ <info name="developer" value="Infogrames" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819270">
<rom name="hostage (1990)(mindscape).2mg" size="819270" crc="53446da4" sha1="c3392574bacb0b8c2b02332368cecee4ee727fd1" />
@@ -2422,13 +2595,21 @@ Generated by SLIST 0.1
<description>The Immortal</description>
<year>1990</year>
<publisher>Electronic Arts</publisher>
-
- <part name="flop1" interface="floppy_3_5">
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Ian Gooding" />
+ <info name="programmer" value="Michael Marcanted" />
+ <info name="programmer" value="Brett G. Durrett" />
+ <info name="usage" value="Requires a 1MB Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- roleplaying game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Play"/>
<dataarea name="flop" size="819268">
<rom name="immortal, the (1990)(electronic arts)(disk 1 of 2).2mg" size="819268" crc="48a2dcae" sha1="00434324af78e4c88f878093715c87ebaccabcb5" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Graphics"/>
<dataarea name="flop" size="819268">
<rom name="immortal, the (1990)(electronic arts)(disk 2 of 2).2mg" size="819268" crc="e2ceb345" sha1="0c1809b608e7049258e3c651718b097494443175" />
</dataarea>
@@ -2439,7 +2620,13 @@ Generated by SLIST 0.1
<description>Impossible Mission II</description>
<year>1989</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Istvan Cseri" />
+ <info name="programmer" value="Gyula Horvath" />
+ <info name="programmer" value="Pal Komondi" />
+ <info name="programmer" value="Sultan" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819267">
<rom name="impossible mission ii (1989)(epyx).2mg" size="819267" crc="9ca2a813" sha1="59a8a09318ccae7339675c7154040131cf2b58fa" />
@@ -2489,16 +2676,22 @@ Generated by SLIST 0.1
</software>
<software name="instsynt">
- <description>Instant Synthesizer</description>
+ <description>Instant Synthesizer (version 1.00)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Larry Reed" />
+ <info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.00" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- audio program -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="819264">
<rom name="instant synthesiser (1988)(electronic arts)(disk 1 of 2).2mg" size="819264" crc="d4b89e2a" sha1="d4eca03d2d3cb3f2ed113bde96ac256de0c8c1b5" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Data" />
<dataarea name="flop" size="819264">
<rom name="instant synthesiser (1988)(electronic arts)(disk 2 of 2).2mg" size="819264" crc="30c179b1" sha1="290ba27d473ce1c2af60463fdeced0105ef3c3cc" />
</dataarea>
@@ -2518,10 +2711,14 @@ Generated by SLIST 0.1
</software>
<software name="jamsessn">
- <description>Jam Session</description>
+ <description>Jam Session (version 1.0)</description>
<year>1989</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Neil Cormia" />
+ <info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- audio program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="jam session (1989)(broderbund)(disk 1 of 2).2mg" size="819264" crc="40694419" sha1="d788188d5a4b46dc55d9e36958520d041d43036d" />
@@ -2661,16 +2858,24 @@ Generated by SLIST 0.1
</software>
<software name="keef">
- <description>Keef the Thief [cracked]</description><!-- allows multiple goes at copy protection question -->
+ <description>Keef the Thief (version 1.0) (unknown crack)</description>
<year>1989</year>
- <publisher>Naughty Dog / Electronic Arts</publisher>
-
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Andy Gavin" />
+ <info name="programmer" value="Jason Rubin" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- roleplaying game -->
+ <!-- allows multiple goes at copy protection question -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program disk" />
<dataarea name="flop" size="819264">
<rom name="keef the thief (1989)(electronic arts)(disk 1 of 2)[cr].2mg" size="819264" crc="3a049949" sha1="75a5766f95adfb6d5a6651f3bd656c5e48ee9beb" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Art disk" />
<dataarea name="flop" size="819269">
<rom name="keef the thief (1989)(electronic arts)(disk 2 of 2)[cr].2mg" size="819269" crc="3148129e" sha1="a34748db4dfab0de33c386a0f7c48475586bd60f" />
</dataarea>
@@ -2747,11 +2952,15 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="kingqst">
- <description>King's Quest</description>
+ <software name="kquest">
+ <description>King's Quest: Quest for the Crown</description>
<year>1987</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="author" value="Roberta Williams, Al Lowe, Charles Tingley, Ken MacNeill, Chris Iden, Doug MacNeill, Greg Rowland, and Chris Iden" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819267">
<rom name="king's quest (1987)(sierra)(disk 1 of 2).2mg" size="819267" crc="e39848bd" sha1="88fce62b5ab4f8d5c61febc1c62695cc542de19b" />
@@ -2765,10 +2974,22 @@ Generated by SLIST 0.1
</software>
<software name="kingqst2">
- <description>King's Quest II - Romancing The Throne</description>
- <year>1988</year>
- <publisher>Sierra</publisher>
-
+ <description>King's Quest II: Romancing the Throne</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="king's quest ii - romancing the throne (1988)(sierra)(disk 1 of 2).2mg" size="819264" crc="dcb9a927" sha1="87b896dccd442173b595ffadd85059f05b4e5708" />
@@ -2781,11 +3002,29 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="kingqst3">
- <description>King's Quest III</description>
+ <software name="kquest3">
+ <description>King's Quest III: To Heir Is Human</description>
<year>1988</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Bob Kernaghan" />
+ <info name="programmer" value="Robert E. Heitman" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Dale Carlson" />
+ <info name="programmer" value="Jennifer Cobb" />
+ <info name="programmer" value="Chad Bye" />
+ <info name="programmer" value="Jeremy T. Cromwell" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="programmer" value="Annette Childs" />
+ <info name="programmer" value="Greg Steffen" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819269">
<rom name="king's quest iii (1988)(sierra)(disk 1 of 2).2mg" size="819269" crc="baac92f1" sha1="a6a6671fb3ed5e3377717dfb3b3022361e985985" />
@@ -2798,11 +3037,26 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="kingqst4">
- <description>King's Quest IV</description>
+ <software name="kquest4">
+ <description>King's Quest IV: The Perils of Rosella</description>
<year>1989</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="William Goldstein" />
+ <info name="programmer" value="Chris Hoyt" />
+ <info name="programmer" value="John Hamilton" />
+ <info name="programmer" value="Teresa Baker" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Carolly Hauksdottir" />
+ <info name="programmer" value="William Skirvin" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Paul Krasno" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="king's quest iv (1989)(sierra)(disk 1 of 3)[a].2mg" size="819271" crc="2927459f" sha1="b5bd4b6f7d3557928a5b243ca364f32701d4496c" />
@@ -2874,10 +3128,19 @@ Generated by SLIST 0.1
</software>
<software name="listplus">
- <description>List Plus</description>
+ <description>List Plus (version 1.0 (11-Dec-87))</description>
<year>1987</year>
<publisher>Activision</publisher>
-
+ <info name="programmer" value="Dominique Philippine" />
+ <info name="programmer" value="Nancy Philippine" />
+ <info name="programmer" value="Luc Barthelet" />
+ <info name="programmer" value="Henri Lamiraux" />
+ <info name="programmer" value="Loic Vandereyken" />
+ <info name="release" value="19871211" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0 (11-Dec-87)" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- productivity program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="list plus (1987)(activision).2mg" size="819264" crc="122ee70f" sha1="dc85ee00d49d234ead1fc4632b39c6bc9d30fcab" />
@@ -2958,11 +3221,21 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="lslarry">
- <description>Leisure Suit Larry in the Land of the Lounge Lizards</description>
+ <software name="lsl1">
+ <description>Leisure Suit Larry in The Land of the Lounge Lizards</description>
<year>1987</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Chuck Benton" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="leisure suit larry in the land of the lounge wizard (1987)(sierra)(disk 1 of 2).2mg" size="819264" crc="b9a7a38b" sha1="7cac82aa737dfee990bc642101d0673507748db1" />
@@ -3046,10 +3319,15 @@ Generated by SLIST 0.1
</software>
<software name="madmatch">
- <description>Mad Match</description>
+ <description>Mad Match (version 43901)</description>
<year>1989</year>
<publisher>Baudville</publisher>
-
+ <info name="partno" value="43901" />
+ <info name="programmer" value="Paul Gauthier" />
+ <info name="usage" value="Requires an Apple IIgs with ROM01 or greater." />
+ <info name="version" value="43901" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="mad match (1989)(baudville).2mg" size="819264" crc="49a8413e" sha1="1d306a585a23cc6a3a5a06d0a34b6dc2769f20dc" />
@@ -3126,10 +3404,22 @@ Generated by SLIST 0.1
</software>
<software name="manhuntr">
- <description>Manhunter: New York [cracked]</description><!-- skips copy-protection -->
+ <description>Manhunter: New York (cracked)</description>
+ <!-- skips copy-protection -->
<year>1988</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Dave Murry" />
+ <info name="programmer" value="Barry Murry" />
+ <info name="programmer" value="Dee Dee Murry" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="programmer" value="Dr. Gary" />
+ <info name="programmer" value="Julie Stonedahl" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="manhunter - new york (1988)(sierra)(disk 1 of 4)[cr].2mg" size="819271" crc="a44f7b5d" sha1="54f2890e063d8e22c61d6394f34991aeb5f950cf" />
@@ -3164,11 +3454,14 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="marble">
+ <software name="marblem">
<description>Marble Madness</description>
- <year>1988</year>
+ <year>1986</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Will Harvey" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="marble madness (1988)(electronic arts).2mg" size="819271" crc="c0342573" sha1="ffe2f953f06aef0f268ce787a42d4176cb2c37ea" />
@@ -3177,10 +3470,15 @@ Generated by SLIST 0.1
</software>
<software name="mathblst">
- <description>Math Blaster Plus!</description>
+ <description>Math Blaster Plus! (version 1.1)</description>
<year>1989</year>
- <publisher>Davidson and Associates</publisher>
-
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="author" value="Jan Davidson and Cathy Johnson" />
+ <info name="programmer" value="C.K. Haun" />
+ <info name="version" value="1.1" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM1 or later." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="math blaster plus iigs (1989)(davidson and associates).2mg" size="819264" crc="5596d376" sha1="d27bcb5183b4efaaec4e891b5fc4edbcd228ce94" />
@@ -3189,10 +3487,14 @@ Generated by SLIST 0.1
</software>
<software name="mathnme">
- <description>Math and Me</description>
+ <description>Math and Me (version 1.0)</description>
<year>1988</year>
- <publisher>Davidson and Associates</publisher>
-
+ <publisher>Davidson &amp; Associates</publisher>
+ <info name="programmer" value="C.K. Haun" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="math and me (1988)(davidson and associates).2mg" size="819264" crc="f254c619" sha1="1a4035f3c2c8f507808a9ebd1271fa4fb58d5262" />
@@ -3300,10 +3602,15 @@ Generated by SLIST 0.1
</software>
<software name="mcs">
- <description>Music Construction Set</description>
+ <description>Music Construction Set (version 1.0)</description>
<year>1996</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 256K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- audio program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="music construction set (1986)(electronic arts)(disk 1 of 2).2mg" size="819264" crc="62e171cc" sha1="8e71b1d48731dc525b173c3ce651d5ddf5ad6c3a" />
@@ -3370,7 +3677,7 @@ Generated by SLIST 0.1
<software name="medley">
<description>Medley v2.0</description>
<year>1989</year>
- <publisher>Milliken Publishing</publisher>
+ <publisher>Milliken Publishing Company</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -3405,10 +3712,20 @@ Generated by SLIST 0.1
</software>
<software name="mercury">
- <description>Mercury</description>
+ <description>Mercury (A-249 version 1.0)</description>
<year>1990</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-249" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- desktop publishing program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="mercury (1990)(mecc)(us).2mg" size="819264" crc="a89c82ae" sha1="e5417b49d9b844b21a0b756982ca52130e6d9fca" />
@@ -3467,11 +3784,17 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="mmmgoose">
+ <software name="mixdupmg">
<description>Mixed Up Mother Goose</description>
<year>1988</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="David Slayback" />
+ <info name="programmer" value="Amenda-Lombardo" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="mixed up - mother goose (1988)(sierra)(disk 1 of 2).2mg" size="819264" crc="1ce35432" sha1="184ceb875edffa69d440b5b1e151269a18da5d02" />
@@ -3557,7 +3880,7 @@ Generated by SLIST 0.1
<software name="mstrytel">
<description>Milliken Story Teller</description>
<year>1989</year>
- <publisher>Milliken Publishing</publisher>
+ <publisher>Milliken Publishing Company</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -3614,10 +3937,16 @@ Generated by SLIST 0.1
</software>
<software name="mtrksjr">
- <description>Master Tracks Junior</description>
+ <description>Master Tracks Jr. (version 1.03)</description>
<year>1988</year>
<publisher>Passport Designs</publisher>
-
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="Don Williams" />
+ <info name="programmer" value="Dave Howell" />
+ <info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.03" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- audio program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="master tracks junior (1988)(passport designs).2mg" size="819264" crc="2df7ee55" sha1="1c33cd48437e82c46b8d870e6fe922180589a12e" />
@@ -3626,10 +3955,16 @@ Generated by SLIST 0.1
</software>
<software name="mtrkspro">
- <description>Master Tracks Pro</description>
+ <description>Master Tracks Pro (version 1.04)</description>
<year>1989</year>
<publisher>Passport Designs</publisher>
-
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="Don Williams" />
+ <info name="programmer" value="Dave Howell" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.04" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- audio program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="master tracks pro (1989)(passport designs).2mg" size="819264" crc="0475cc3b" sha1="3e329ac8576b812f06dc84f571bea185f38a529b" />
@@ -3732,8 +4067,11 @@ Generated by SLIST 0.1
<software name="neuromnc">
<description>Neuromancer</description>
<year>1989</year>
- <publisher>Interplay</publisher>
-
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="neuromancer (1989)(interplay).2mg" size="819271" crc="6af45880" sha1="a9acda679f98357b903ca5e29ff29b8422935a8f" />
@@ -3943,7 +4281,10 @@ Generated by SLIST 0.1
<description>Paperboy</description>
<year>1988</year>
<publisher>Mindscape</publisher>
-
+ <info name="developer" value="Tengen" />
+ <info name="usage" value="Requires a 256K Apple IIgs ROM 01." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- arcade game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="paperboy (1988)(mindscape).2mg" size="819271" crc="798fba01" sha1="da62ae31fc17c04c8dae472e045b927a811f3edd" />
@@ -3964,10 +4305,19 @@ Generated by SLIST 0.1
</software>
<software name="photonx2">
- <description>Photonix II v2.3</description>
+ <description>Photonix II (version 2.30)</description>
<year>1990</year>
- <publisher>Free Tools Association / Toolbox</publisher>
-
+ <publisher>Free Tools Association</publisher>
+ <info name="programmer" value="Pierre Raynaud-Richard" />
+ <info name="programmer" value="Olivier Goguel" />
+ <info name="programmer" value="Denis Barritault" />
+ <info name="programmer" value="Dany Bar" />
+ <info name="programmer" value="Olivier Bailly-Maitre" />
+ <info name="programmer" value="Lionel Picamelot" />
+ <info name="usage" value="Requires an Apple IIgs with 1.25MB of RAM" />
+ <info name="version" value="2.30" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- disk utility -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="photonix ii v2.3 (1990)(toolbox)(en-fr).2mg" size="819264" crc="5a7fcac8" sha1="f3538a85425816dced7aaf5e76d1a0081a62e5de" />
@@ -4024,10 +4374,16 @@ Generated by SLIST 0.1
</software>
<software name="pirates">
- <description>Pirates!</description>
+ <description>Sid Meier's Pirates! (version 932P01)</description>
<year>1988</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Dan Chang" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="version" value="932P01" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="pirates (1988)(microprose).2mg" size="819271" crc="ac9bec98" sha1="bdf574fc2858a388ea70ee1288ed15fec353fb56" />
@@ -4130,10 +4486,24 @@ Generated by SLIST 0.1
</software>
<software name="pquest">
- <description>Police Quest</description>
+ <description>Police Quest: In Pursuit of the Death Angel</description>
<year>1987</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Jim Walls" />
+ <info name="programmer" value="Greg Rowland" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819267">
<rom name="police quest (1987)(sierra)(disk 1 of 2).2mg" size="819267" crc="b117cb97" sha1="30b124679775bd2b25296f4fd2da16ae3e2f45e2" />
@@ -4173,8 +4543,13 @@ Generated by SLIST 0.1
<software name="printshp">
<description>The Print Shop</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="David Balsam" />
+ <info name="author" value="Martin Kahn" />
+ <info name="programmer" value="Corey Kosak" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop (1987)(broderbund).2mg" size="819264" crc="67cb3690" sha1="2c3d1d746daac39ecb6826f909347deaa6333113" />
@@ -4197,8 +4572,11 @@ Generated by SLIST 0.1
<software name="prntshcm">
<description>The Print Shop Companion</description>
<year>1990</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics utility -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop companion, the (1990)(broderbund).2mg" size="819264" crc="0fd72d60" sha1="aca15651345963831057abacee9623c8c0087084" />
@@ -4255,10 +4633,9 @@ Generated by SLIST 0.1
</software>
<software name="psglbrdr">
- <description>Print Shop Graphics Library - Border</description>
+ <description>The Print Shop Graphics Library - Border</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop graphics library - border (1987)(broderbund).2mg" size="819264" crc="4a29bcdc" sha1="ac3349a28b95de223d8d0fa677dd898f415120c7" />
@@ -4267,10 +4644,9 @@ Generated by SLIST 0.1
</software>
<software name="psglprty">
- <description>Print Shop Graphics Library - Party Library</description>
+ <description>The Print Shop Graphics Library - Party Library</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop graphics library - party library (1987)(broderbund).2mg" size="819264" crc="c331f6eb" sha1="1f4d1ce0e7e7094512d574c3a10c533a37b38bbe" />
@@ -4279,10 +4655,9 @@ Generated by SLIST 0.1
</software>
<software name="psglsamp">
- <description>Print Shop Graphics Library - Sampler Edition</description>
+ <description>The Print Shop Graphics Library - Sampler Edition</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop graphics library - sampler edition (1987)(broderbund).2mg" size="819264" crc="4053f45a" sha1="8ee8d2cc0014af7563a11561d27e7a5dbfd6b628" />
@@ -4291,10 +4666,9 @@ Generated by SLIST 0.1
</software>
<software name="psglse">
- <description>Print Shop Graphics Library - Special Edition</description>
+ <description>The Print Shop Graphics Library - Special Edition</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop graphics library - special edition (1987)(broderbund).2mg" size="819264" crc="46cedf70" sha1="f756c62ee70d27b7fbbd9a3fb03743b687ec41d0" />
@@ -4303,10 +4677,9 @@ Generated by SLIST 0.1
</software>
<software name="psincidr">
- <description>Print Shop InCider Data</description>
+ <description>The Print Shop InCider Data</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop incider data (1987)(broderbund)(disk 1 of 2).2mg" size="819264" crc="f637905d" sha1="e8027d0c24e7175d1b71d30a5f518da77c91d9a8" />
@@ -4320,10 +4693,9 @@ Generated by SLIST 0.1
</software>
<software name="pslutil">
- <description>Print Shop Lovers Utility Set</description>
+ <description>The Print Shop Lovers Utility Set</description>
<year>1988</year>
<publisher>Big Red Computer Club</publisher>
-
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="print shop lovers utility set (198x)(big red computer club).2mg" size="819264" crc="de574d72" sha1="0eb54faf52e17917286adf9532beffa13dd0dc79" />
@@ -4544,11 +4916,16 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="readerrb">
- <description>Reader Rabbit</description>
+ <software name="rrabbit20">
+ <description>Reader Rabbit (version 2.0)</description>
<year>1987</year>
<publisher>The Learning Company</publisher>
-
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Aaron Weiss" />
+ <info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="version" value="2.0" />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="reader rabbit (1987)(the learning company).2mg" size="819264" crc="f7f762e7" sha1="9473d2f1024a5476c96a4b905da101460a13558f" />
@@ -4568,11 +4945,14 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="readmagc">
- <description>Reading Magic</description>
+ <software name="rmljackb">
+ <description>Reading Magic Library: Jack and the Beanstalk IIgs</description>
<year>1989</year>
<publisher>Tom Snyder Productions</publisher>
-
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="reading magic (1989)(tom snyder productions).2mg" size="819264" crc="32d6b363" sha1="ece457c71061e9f274d0bd61e5244cc800baf842" />
@@ -4801,10 +5181,11 @@ Generated by SLIST 0.1
</software>
<software name="shflpuck">
- <description>Shufflepuck Cafe (unreleased)</description>
+ <description>Shufflepuck Cafe (unreleased) (Jumping Jack's Flash crack)</description>
<year>1990</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="usage" value="Non-booting and requires an Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="shufflepuck cafe (1990)(broderbund)[non boot][unreleased].2mg" size="819271" crc="6d7446a7" sha1="1f05ef59465007ac735e98e559888859f4c69f0b" />
@@ -4857,21 +5238,30 @@ Generated by SLIST 0.1
</software>
<software name="showoff">
- <description>Show Off</description>
+ <description>ShowOff (version 1.0)</description>
<year>1987</year>
- <publisher>Brøderbund</publisher>
-
+ <publisher>Brøderbund Software</publisher>
+ <info name="developer" value="Denis Friedman Productions" />
+ <info name="programmer" value="Serge Hervy" />
+ <info name="programmer" value="Jean-Claude Lévy" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program disk"/>
<dataarea name="flop" size="819264">
<rom name="show off (1987)(broderbund)(disk 1 of 3).2mg" size="819264" crc="2807895f" sha1="37350ba078fc1642e11e77ca9be47fd5eb395622" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Slide show disk" />
<dataarea name="flop" size="819264">
<rom name="show off (1987)(broderbund)(disk 2 of 3)[data &amp; slideshow].2mg" size="819264" crc="aee340fc" sha1="7a3f99b63e14f9537abb284ef4594b86a77bcc24" />
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Graphics collection - world events" />
<dataarea name="flop" size="819264">
<rom name="show off (1987)(broderbund)(disk 3 of 3)[world events].2mg" size="819264" crc="6933846c" sha1="ac02ec4693e2f505a584f12237dd34b9cb0debf4" />
</dataarea>
@@ -4908,10 +5298,24 @@ Generated by SLIST 0.1
</software>
<software name="silpheed">
- <description>Silpheed</description>
+ <description>Silpheed - Super Dogfighter</description>
<year>1988</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="John Rettig" />
+ <info name="programmer" value="Stuart Goldstein" />
+ <info name="programmer" value="Mark Seibert" />
+ <info name="programmer" value="Satoshi Uesaki" />
+ <info name="programmer" value="Nobuyuki Ogawa" />
+ <info name="programmer" value="Akira Eye" />
+ <info name="programmer" value="Fumihito Kasatani" />
+ <info name="programmer" value="Nobuyuki Aoshima" />
+ <info name="programmer" value="Hiromi Ohba" />
+ <info name="programmer" value="Takeshi Miyaji" />
+ <info name="programmer" value="Osamu Harada" />
+ <info name="programmer" value="Youichi Miyaji" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819273">
<rom name="silpheed (1988)(sierra)(disk 1 of 2).2mg" size="819273" crc="83062f65" sha1="b69cfa73b805ea8024084aa247bbf8ee7389a191" />
@@ -4954,10 +5358,17 @@ Generated by SLIST 0.1
</software>
<software name="skatedie">
- <description>Skate Or Die!</description>
+ <description>Skate or Die! IIgs (version 1.1)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="David Bunch" />
+ <info name="programmer" value="Michelle Shelfer" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM 01. Music requires 768K." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819267">
<rom name="skate or die (1988)(electronic arts).2mg" size="819267" crc="9e49f71c" sha1="16569d2897a4e1037a11dfe2875dd33fe52a9c55" />
@@ -4966,10 +5377,16 @@ Generated by SLIST 0.1
</software>
<software name="slntsvce">
- <description>Silent Service</description>
+ <description>Silent Service (version 925.01)</description>
<year>1987</year>
- <publisher>Microprose</publisher>
-
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Jim Synoski" />
+ <info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="version" value="925.01" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819278">
<rom name="silent service (1987)(microprose).2mg" size="819278" crc="6e8ecbc0" sha1="4688e2ba2ec571497033d72ae79765f50ae08951" />
@@ -5149,36 +5566,52 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="spquest2">
- <description>Space Quest II - Vohaul's Revenge</description>
- <year>1988</year>
- <publisher>Sierra</publisher>
-
+ <software name="squest">
+ <description>Space Quest: The Sarien Encounter</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819269">
- <rom name="space quest ii - vohaul's revenge (1988)(sierra)(disk 1 of 2).2mg" size="819269" crc="052a2dd9" sha1="400d41516f3b0eb5cd8fdf83aa455e8c332fef47" />
+ <dataarea name="flop" size="819271">
+ <rom name="space quest i - the sarien encounter (1987)(sierra)(disk 1 of 2).2mg" size="819271" crc="973a16d6" sha1="ec7381c5c8b32f5900b6d2ac2e1cd01227b5e70b" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size="819269">
- <rom name="space quest ii - vohaul's revenge (1988)(sierra)(disk 2 of 2).2mg" size="819269" crc="28ff830b" sha1="0f46f1756e82a6e93c1c5e8609b93b72853d361c" />
+ <dataarea name="flop" size="819271">
+ <rom name="space quest i - the sarien encounter (1987)(sierra)(disk 2 of 2).2mg" size="819271" crc="d49d52b7" sha1="13cf4f9bc88761a69033be2b864e4b783b3ce41c" />
</dataarea>
</part>
</software>
- <software name="spquest">
- <description>Space Quest</description>
- <year>1987</year>
- <publisher>Sierra</publisher>
-
+ <software name="squest2">
+ <description>Space Quest II: Vohaul's Revenge</description>
+ <year>1988</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819271">
- <rom name="space quest i - the sarien encounter (1987)(sierra)(disk 1 of 2).2mg" size="819271" crc="973a16d6" sha1="ec7381c5c8b32f5900b6d2ac2e1cd01227b5e70b" />
+ <dataarea name="flop" size="819269">
+ <rom name="space quest ii - vohaul's revenge (1988)(sierra)(disk 1 of 2).2mg" size="819269" crc="052a2dd9" sha1="400d41516f3b0eb5cd8fdf83aa455e8c332fef47" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size="819271">
- <rom name="space quest i - the sarien encounter (1987)(sierra)(disk 2 of 2).2mg" size="819271" crc="d49d52b7" sha1="13cf4f9bc88761a69033be2b864e4b783b3ce41c" />
+ <dataarea name="flop" size="819269">
+ <rom name="space quest ii - vohaul's revenge (1988)(sierra)(disk 2 of 2).2mg" size="819269" crc="28ff830b" sha1="0f46f1756e82a6e93c1c5e8609b93b72853d361c" />
</dataarea>
</part>
</software>
@@ -5341,11 +5774,19 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="sshockey">
- <description>Superstar Ice Hockey (clean crack)</description>
+ <software name="ssicehock">
+ <description>Superstar Ice Hockey (trex crack)</description>
<year>1988</year>
<publisher>Mindscape</publisher>
-
+ <info name="programmer" value="Ed Ringler" />
+ <info name="programmer" value="Andrew Caldwell" />
+ <info name="programmer" value="Clayton Wishoff" />
+ <info name="programmer" value="Simon Ffinch" />
+ <info name="programmer" value="Ed Ringler Sr." />
+ <info name="programmer" value="Chris Oke" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="superstar ice hockey (1988)(mindscape)(trex crack).2mg" size="819264" crc="0b15cb9d" sha1="055a121ac1d588558e00a2442110e2c1afd0cc46" />
@@ -5536,10 +5977,20 @@ Generated by SLIST 0.1
</software>
<software name="strybkwv">
- <description>Storybook Weaver</description>
+ <description>Storybook Weaver (A-275 version 1.0)</description>
<year>1990</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-275" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian S. Nesse" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Steve Zehm" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="storybook weaver (1990)(mecc)(us).2mg" size="819264" crc="a2e718c7" sha1="453523dd0b84d79df61ac1322058c3f92f478315" />
@@ -5547,26 +5998,41 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="strywvmb">
- <description>Storybook Weaver World of Make Believe</description>
+ <software name="strywvwa">
+ <description>Storybook Weaver: World of Adventure (A-276 version 1.0)</description>
<year>1991</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-276" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Brian S. Nesse" />
+ <info name="programmer" value="Dee Dee Roedel " />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="storybook weaver world of make believe (1991)(mecc)(us).2mg" size="819264" crc="1846d0a5" sha1="62c06c0a34455c60ce0466d18ae86789a9b5c038" />
+ <rom name="storybook weaver world of adventure (1991)(mecc)(us).2mg" size="819264" crc="1ec8f7e1" sha1="dd5a0f8715523d8fd6227e3acce9b60ae527ffe3" />
</dataarea>
</part>
</software>
- <software name="strywvwa">
- <description>Storybook Weaver World of Adventure</description>
+ <software name="strywvmb">
+ <description>Storybook Weaver: World of Make-Believe (A-298 version 1.0)</description>
<year>1991</year>
<publisher>MECC</publisher>
-
+ <info name="partno" value="A-298" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
- <rom name="storybook weaver world of adventure (1991)(mecc)(us).2mg" size="819264" crc="1ec8f7e1" sha1="dd5a0f8715523d8fd6227e3acce9b60ae527ffe3" />
+ <rom name="storybook weaver world of make believe (1991)(mecc)(us).2mg" size="819264" crc="1846d0a5" sha1="62c06c0a34455c60ce0466d18ae86789a9b5c038" />
</dataarea>
</part>
</software>
@@ -5575,7 +6041,12 @@ Generated by SLIST 0.1
<description>Sub Battle Simulator</description>
<year>1987</year>
<publisher>Epyx</publisher>
-
+ <info name="programmer" value="Rob Brannon" />
+ <info name="programmer" value="Kelly Fergason" />
+ <info name="programmer" value="Steve Snyder" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- simulation game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819271">
<rom name="sub battle simulator (1987)(epyx).2mg" size="819271" crc="2e0c470f" sha1="51ebed0e01008dae475b7ed7ae5949fe6f5777dc" />
@@ -5681,6 +6152,7 @@ Generated by SLIST 0.1
<description>System Software v1.1</description>
<year>1986</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="ProDOS 16 v1.1" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -5693,6 +6165,7 @@ Generated by SLIST 0.1
<description>System Software v3.1</description>
<year>1987</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="ProDOS 16 v1.3" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -5703,8 +6176,9 @@ Generated by SLIST 0.1
<software name="sys32">
<description>System Software v3.2</description>
- <year>1987</year>
+ <year>1988</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="ProDOS 16 v1.6" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -5717,6 +6191,7 @@ Generated by SLIST 0.1
<description>System Software v4.0</description>
<year>1988</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="GS/OS v02.00" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -5732,8 +6207,9 @@ Generated by SLIST 0.1
<software name="sys502">
<description>System Software v5.0.2</description>
- <year>1989</year>
+ <year>1990</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="GS/OS v03.03" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -5751,6 +6227,7 @@ Generated by SLIST 0.1
<description>System Software v5.0.4</description>
<year>1990</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="GS/OS v03.03" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -5768,6 +6245,7 @@ Generated by SLIST 0.1
<description>System Software v6.0.1</description>
<year>1993</year>
<publisher>Apple Computer, Inc.</publisher>
+ <info name="alt_title" value="GS/OS v4.02" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
@@ -6356,11 +6834,21 @@ Generated by SLIST 0.1
</software>
<software name="thexder">
- <description>Thexder v2.7 (clean crack)</description>
- <!-- Self bootable and had Joystick control set as default -->
+ <description>Thexder v2.7 (trex crack)</description>
<year>1987</year>
- <publisher>Sierra</publisher>
-
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="H. Godai" />
+ <info name="programmer" value="S. Uesaka" />
+ <info name="programmer" value="Michael D. Branham" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="John P. Conley" />
+ <info name="programmer" value="Lloyd Ollmann, Jr." />
+ <info name="programmer" value="Michael Ormsby" />
+ <info name="version" value="2.7" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- Self bootable and had Joystick control set as default -->
+ <!-- action game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="thexder v2.7 (1987)(sierra on-line in)(trex crack).2mg" size="819264" crc="15862391" sha1="9588be8429081de1ce7b0df88c273b0fedfcdbf3" />
@@ -6445,11 +6933,17 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="topdraw">
- <description>Top Draw</description>
- <year>1989</year>
- <publisher>Styleware</publisher>
-
+ <software name="topdraw098b">
+ <description>TopDraw (version 0.98B (11/18/86))</description>
+ <year>1986</year>
+ <publisher>StyleWare</publisher>
+ <info name="programmer" value="Robert A. Hearn" />
+ <info name="programmer" value="Jeff G. Erickson" />
+ <info name="release" value="19861118" />
+ <info name="usage" value="Requires a 1MB Apple IIgs." />
+ <info name="version" value="0.98B (11/18/86)" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="topdraw (1989)(styleware).2mg" size="819264" crc="48a2bd03" sha1="31b7d2a3f7e09e225e7e685fd5100ee63180bcd2" />
@@ -6518,10 +7012,14 @@ Generated by SLIST 0.1
</software>
<software name="transyl3">
- <description>Transylvania III</description>
+ <description>Transylvania III IIgs</description>
<year>1990</year>
<publisher>Polarware</publisher>
-
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="programmer" value="Veronika Slintak" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819267">
<rom name="transylvania iii (1990)(polarware)(disk 1 of 2).2mg" size="819267" crc="b8b51ec7" sha1="ca869bed8b558e199ee907ab3badd9e23739755b" />
@@ -6534,23 +7032,6 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="transyl">
- <description>Transylvania</description>
- <year>1987</year>
- <publisher>Polarware</publisher>
-
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819288">
- <rom name="transylvania (19xx)(merit software - polarware)(disk 1 of 2).2mg" size="819288" crc="4195fa6e" sha1="17a8675f265ddbc9aab33f625d6c28d3a03d7491" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size="819288">
- <rom name="transylvania (19xx)(merit software - polarware)(disk 2 of 2).2mg" size="819288" crc="ac5608cb" sha1="3f3aecf922aa6a8738b476e8749ac7983e9f4f7b" />
- </dataarea>
- </part>
- </software>
-
<software name="ttcdemo">
<description>TTC Demo</description>
<year>1991</year>
@@ -6622,16 +7103,25 @@ Generated by SLIST 0.1
</software>
<software name="uglyduck">
- <description>The Ugly Duckling</description>
+ <description>The Ugly Duckling (version 1.1)</description>
<year>1989</year>
- <publisher>The Byte Works</publisher>
-
- <part name="flop1" interface="floppy_3_5">
+ <publisher>ByteWorks</publisher>
+ <info name="programmer" value="Mary Martinez" />
+ <info name="programmer" value="Mike Westerfield" />
+ <info name="programmer" value="Peggy K. Smith" />
+ <info name="programmer" value="Patty Westerfield" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819264">
<rom name="ugly duckling, the (1989)(byte works)(disk 1 of 2).2mg" size="819264" crc="3e66e476" sha1="67decac293696728844193bbd64c730ce9807462" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
<dataarea name="flop" size="819264">
<rom name="ugly duckling, the (1989)(byte works)(disk 2 of 2).2mg" size="819264" crc="f4f53fab" sha1="870cb6c6cd0d14bbbb41036a14fd11509bb215a6" />
</dataarea>
@@ -6689,16 +7179,28 @@ Generated by SLIST 0.1
</software>
<software name="usageogr">
- <description>USA Geography</description>
+ <description>USA GeoGraph (A-300 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
-
- <part name="flop1" interface="floppy_3_5">
+ <info name="partno" value="A-300" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="programmer" value="Paul R. Wenker" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="John L. Krenz" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="819264">
<rom name="usa geograph (1989)(mecc)(us)(disk 1 of 2).2mg" size="819264" crc="fbdeb34d" sha1="df437dae274659932396fc65a45f14ab2a47f2e1" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Information"/>
<dataarea name="flop" size="819264">
<rom name="usa geograph (1989)(mecc)(us)(disk 2 of 2).2mg" size="819264" crc="3087aac3" sha1="a4f1a11d9d1a0f8943ced5631f9ee9acd24200e6" />
</dataarea>
@@ -6873,7 +7375,10 @@ Generated by SLIST 0.1
<description>World Games</description>
<year>1987</year>
<publisher>Epyx</publisher>
-
+ <info name="developer" value="Westwood Studios" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819275">
<rom name="world games (1987)(epyx).2mg" size="819275" crc="a93ec647" sha1="bbfe74b980afcaa6a01e8596ce79536fa1f39b1b" />
@@ -6885,7 +7390,13 @@ Generated by SLIST 0.1
<description>World Tour Golf</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="author" value="Evan Robinson" />
+ <info name="author" value="Nicky Robinson" />
+ <info name="author" value="Paul Reiche III" />
+ <info name="programmer" value="John Selhorst" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="world tour golf (1987)(electronic arts).2mg" size="819264" crc="05988b6d" sha1="18e4e49860594ce3ed4646187134183a242d8aa7" />
@@ -6897,7 +7408,10 @@ Generated by SLIST 0.1
<description>Winter Games</description>
<year>1987</year>
<publisher>Epyx</publisher>
-
+ <info name="developer" value="Westwood Studios" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819276">
<rom name="winter games (1987)(epyx).2mg" size="819276" crc="e467f029" sha1="48a90ac5cd4bfebe1d16514adf9cb7554c204a7f" />
@@ -6939,17 +7453,30 @@ Generated by SLIST 0.1
</part>
</software>
- <software name="worldgeo">
- <description>World Geograph</description>
+ <software name="wldgeogr">
+ <description>World GeoGraph (USG-100 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
-
- <part name="flop1" interface="floppy_3_5">
+ <info name="partno" value="USG-100" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="John L. Krenz" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="Wayne Studer" />
+ <info name="programmer" value="Paul R. Wenker" />
+ <info name="programmer" value="Nelson Whyatt" />
+ <info name="version" value="1.0" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program"/>
<dataarea name="flop" size="819264">
<rom name="world geograph (1989)(mecc)(us)(disk 1 of 2).2mg" size="819264" crc="c56e1f36" sha1="1ab513db66e5226d4204a4571aaca11694ab3229" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Information"/>
<dataarea name="flop" size="819264">
<rom name="world geograph (1989)(mecc)(us)(disk 2 of 2).2mg" size="819264" crc="c154bcf6" sha1="fa7863aedabfd21f1f3e725570b9bf46f40bf893" />
</dataarea>
@@ -7008,7 +7535,13 @@ Generated by SLIST 0.1
<description>Zany Golf</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
-
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="programmer" value="Ian Gooding" />
+ <info name="programmer" value="Doug Fulton" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS"/>
+ <!-- sports game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819268">
<rom name="zany golf (1988)(electronic arts).2mg" size="819268" crc="6612959a" sha1="ed11abb896809c60f01ff51b7b131f02e5aa7747" />
diff --git a/hash/apple2gs_flop_orig.xml b/hash/apple2gs_flop_orig.xml
index 6e7c409001f..fdb2833ed8d 100644
--- a/hash/apple2gs_flop_orig.xml
+++ b/hash/apple2gs_flop_orig.xml
@@ -33,7 +33,10 @@ license:CC0-1.0
<description>Zany Golf</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey, Jim Nitchals, Ian Gooding, and Doug Fulton" />
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="programmer" value="Ian Gooding" />
+ <info name="programmer" value="Doug Fulton" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-02 -->
@@ -45,7 +48,7 @@ license:CC0-1.0
</part>
</software>
- <software name="marble">
+ <software name="marblem">
<description>Marble Madness</description>
<year>1986</year>
<publisher>Electronic Arts</publisher>
@@ -65,7 +68,8 @@ license:CC0-1.0
<description>Qix</description>
<year>1990</year>
<publisher>Taito America</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-02 and redumped: 2021-05-03 -->
@@ -81,7 +85,11 @@ license:CC0-1.0
<description>Tass Times in Tonetown</description>
<year>1986</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Rebecca Heineman, Todd Camasta, Russell Lieblich, Brian Fargo, and Steve Nielsen" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Todd Camasta" />
+ <info name="programmer" value="Russell Lieblich" />
+ <info name="programmer" value="Brian Fargo" />
+ <info name="programmer" value="Steve Nielsen" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-02 -->
@@ -113,10 +121,11 @@ license:CC0-1.0
<description>Gauntlet</description>
<year>1988</year>
<publisher>Mindscape</publisher>
+ <info name="developer" value="Atari Games" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-02 -->
- <!-- action game -->
+ <!-- arcade game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1317604">
<rom name="gauntlet iigs.woz" size="1317604" crc="fbeb429a" sha1="4df82855dd2924509681ea5a9a138aa7edce8b53" />
@@ -127,8 +136,17 @@ license:CC0-1.0
<software name="btlchess">
<description>Battle Chess</description>
<year>1989</year>
- <publisher>Interplay</publisher>
- <info name="programmer" value="Jim Sproul, Todd J. Camasta, Bruce Schlickbernd, Kurt Heiden, Bill (Weez) Dugan, Thomas R. Decker, Troy P. Worrell, Michael Quarles, Rebecca Heineman, and Alan Pavlish" />
+ <publisher>Interplay Productions</publisher>
+ <info name="programmer" value="Jim Sproul" />
+ <info name="programmer" value="Todd J. Camasta" />
+ <info name="programmer" value="Bruce Schlickbernd" />
+ <info name="programmer" value="Kurt Heiden" />
+ <info name="programmer" value="Bill (Weez) Dugan" />
+ <info name="programmer" value="Thomas R. Decker" />
+ <info name="programmer" value="Troy P. Worrell" />
+ <info name="programmer" value="Michael Quarles" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Alan Pavlish" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-03 -->
@@ -144,7 +162,13 @@ license:CC0-1.0
<description>Blackjack Academy</description>
<year>1987</year>
<publisher>MicroIllusions</publisher>
- <info name="programmer" value="Dennis Saunders, PhD., Al Cheser, Allen Doum, Bob Green, Kevin Hammel, Jim Lawton, and Sandy Wardak" />
+ <info name="programmer" value="Dennis Saunders, Ph.D." />
+ <info name="programmer" value="Al Cheser" />
+ <info name="programmer" value="Allen Doum" />
+ <info name="programmer" value="Bob Green" />
+ <info name="programmer" value="Kevin Hammel" />
+ <info name="programmer" value="Jim Lawton" />
+ <info name="programmer" value="Sandy Wardak" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-03 -->
@@ -160,7 +184,11 @@ license:CC0-1.0
<description>Block Out</description>
<year>1989</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Alexander Ustaszewski, Marek Jackiewicz, Adam Skorupinski, Marcin Szostakowski, and Marcin Grzegorzewski" />
+ <info name="programmer" value="Alexander Ustaszewski" />
+ <info name="programmer" value="Marek Jackiewicz" />
+ <info name="programmer" value="Adam Skorupinski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Marcin Grzegorzewski" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-03 -->
@@ -176,7 +204,8 @@ license:CC0-1.0
<description>Xenocide</description>
<year>1989</year>
<publisher>Micro Revelations</publisher>
- <info name="programmer" value="Brian Greenstone and Dave Triplett" />
+ <info name="programmer" value="Brian Greenstone" />
+ <info name="programmer" value="Dave Triplett" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-03 -->
@@ -192,7 +221,8 @@ license:CC0-1.0
<description>Alien Mind</description>
<year>1988</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Rob Karr and Matt Crysdale" />
+ <info name="programmer" value="Rob Karr" />
+ <info name="programmer" value="Matt Crysdale" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-04 -->
@@ -215,7 +245,12 @@ license:CC0-1.0
<description>Gold Rush!</description>
<year>1988</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Ken MacNeill, Doug MacNeill, Jeff Stephenson, Chris Iden, Robert Heitman, and Anita Scott" />
+ <info name="programmer" value="Ken MacNeill" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Anita Scott" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-04 -->
@@ -250,7 +285,19 @@ license:CC0-1.0
<description>Uninvited</description>
<year>1988</year>
<publisher>ICOM Simulations</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldemar Horwat, Mark Waterman, Tod Zipnick, and Billy Wolf" />
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="Craig Erickson" />
+ <info name="programmer" value="Steven Hays" />
+ <info name="programmer" value="Terry Schulenburg" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldemar Horwat" />
+ <info name="programmer" value="Mark Waterman" />
+ <info name="programmer" value="Tod Zipnick" />
+ <info name="programmer" value="Billy Wolf" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -273,7 +320,8 @@ license:CC0-1.0
<description>Cavern Cobra</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Greg Hale and Richard L. Seaborne" />
+ <info name="programmer" value="Greg Hale" />
+ <info name="programmer" value="Richard L. Seaborne" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -289,7 +337,10 @@ license:CC0-1.0
<description>Hardball!</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Dan Thompson, Ed Bogas, John Boechler, and Mike Benna" />
+ <info name="programmer" value="Dan Thompson" />
+ <info name="programmer" value="Ed Bogas" />
+ <info name="programmer" value="John Boechler" />
+ <info name="programmer" value="Mike Benna" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -305,7 +356,9 @@ license:CC0-1.0
<description>Task Force</description>
<year>1990</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Scott L. Patterson, Matthew Crysdale, and Gregory A. Thomas" />
+ <info name="programmer" value="Scott L. Patterson" />
+ <info name="programmer" value="Matthew Crysdale" />
+ <info name="programmer" value="Gregory A. Thomas" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -328,7 +381,17 @@ license:CC0-1.0
<description>Shadowgate</description>
<year>1988</year>
<publisher>ICOM Simulations</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldemar Horwat, Tod Zipnick, and David Feldman" />
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="Steven Hays" />
+ <info name="programmer" value="Terry Schulenburg" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldemar Horwat" />
+ <info name="programmer" value="Tod Zipnick" />
+ <info name="programmer" value="David Feldman" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -351,7 +414,14 @@ license:CC0-1.0
<description>Serve and Volley</description>
<year>1988</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Rick Banks, Paul Butler, Ken Shimizu, Danny Chin, Paul Battersby, Jeffrey J. Sigler, Grant Campbell, and Jay Stevens" />
+ <info name="programmer" value="Rick Banks" />
+ <info name="programmer" value="Paul Butler" />
+ <info name="programmer" value="Ken Shimizu" />
+ <info name="programmer" value="Danny Chin" />
+ <info name="programmer" value="Paul Battersby" />
+ <info name="programmer" value="Jeffrey J. Sigler" />
+ <info name="programmer" value="Grant Campbell" />
+ <info name="programmer" value="Jay Stevens" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -367,7 +437,13 @@ license:CC0-1.0
<description>California Games</description>
<year>1988</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Jimmy Huey, Dan Chang, Jenny Martin, Sheryl Knowles, Bill Bogenreif, Matt Householder, and Ron Fortier" />
+ <info name="programmer" value="Jimmy Huey" />
+ <info name="programmer" value="Dan Chang" />
+ <info name="programmer" value="Jenny Martin" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Bill Bogenreif" />
+ <info name="programmer" value="Matt Householder" />
+ <info name="programmer" value="Ron Fortier" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-07 -->
@@ -383,7 +459,9 @@ license:CC0-1.0
<description>Sea Strike</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Richard L. Seaborne, Jeff A. Lefferts, and Mei-Ying Dell'Aquila" />
+ <info name="programmer" value="Richard L. Seaborne" />
+ <info name="programmer" value="Jeff A. Lefferts" />
+ <info name="programmer" value="Mei-Ying Dell'Aquila" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-09 -->
@@ -399,7 +477,19 @@ license:CC0-1.0
<description>The Duel: Test Drive II</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Allan Johnson, Erik Kiss, Amory Wong, Don Mattrick, Rick Friesen, Bruce Dawson, Randy Dillon, Brad Gour, Kris Hatlelid, Chris Taylor, John Boechler, Tony Lee, and Theresa Henry" />
+ <info name="programmer" value="Allan Johnson" />
+ <info name="programmer" value="Erik Kiss" />
+ <info name="programmer" value="Amory Wong" />
+ <info name="programmer" value="Don Mattrick" />
+ <info name="programmer" value="Rick Friesen" />
+ <info name="programmer" value="Bruce Dawson" />
+ <info name="programmer" value="Randy Dillon" />
+ <info name="programmer" value="Brad Gour" />
+ <info name="programmer" value="Kris Hatlelid" />
+ <info name="programmer" value="Chris Taylor" />
+ <info name="programmer" value="John Boechler" />
+ <info name="programmer" value="Tony Lee" />
+ <info name="programmer" value="Theresa Henry" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-10 -->
@@ -431,11 +521,13 @@ license:CC0-1.0
</software>
<software name="keef">
- <description>Keef the Thief</description>
+ <description>Keef the Thief (version 1.0)</description>
<year>1989</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Andy Gavin and Jason Rubin" />
+ <info name="programmer" value="Andy Gavin" />
+ <info name="programmer" value="Jason Rubin" />
<info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-10 -->
<!-- roleplaying game -->
@@ -457,7 +549,13 @@ license:CC0-1.0
<description>Grand Prix Circuit</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Don Mattrick, Brad Gour, Allan Johanson, Erik Kiss, Amory Wong, Rick Friesen, and Kris Hatlelid" />
+ <info name="programmer" value="Don Mattrick" />
+ <info name="programmer" value="Brad Gour" />
+ <info name="programmer" value="Allan Johanson" />
+ <info name="programmer" value="Erik Kiss" />
+ <info name="programmer" value="Amory Wong" />
+ <info name="programmer" value="Rick Friesen" />
+ <info name="programmer" value="Kris Hatlelid" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-11 -->
@@ -473,7 +571,10 @@ license:CC0-1.0
<description>Crystal Quest</description>
<year>1989</year>
<publisher>Cassidy and Greene</publisher>
- <info name="programmer" value="Patrick Buckland, Rebecca Heineman, Mike 'Jed' Patrick, and Scott Everts" />
+ <info name="programmer" value="Patrick Buckland" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Mike 'Jed' Patrick" />
+ <info name="programmer" value="Scott Everts" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-11 -->
@@ -489,7 +590,10 @@ license:CC0-1.0
<description>Impossible Mission II</description>
<year>1989</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Istvan Cseri, Gyula Horvath, Pal Komondi, and Sultan" />
+ <info name="programmer" value="Istvan Cseri" />
+ <info name="programmer" value="Gyula Horvath" />
+ <info name="programmer" value="Pal Komondi" />
+ <info name="programmer" value="Sultan" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-11 -->
@@ -505,7 +609,13 @@ license:CC0-1.0
<description>The Last Ninja</description>
<year>1988</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Jeff Silverman, John Kroeckel, J. David Koch, Erol Otus, Doug Barnett, Russell Lieblich, and Nicky Robinson" />
+ <info name="programmer" value="Jeff Silverman" />
+ <info name="programmer" value="John Kroeckel" />
+ <info name="programmer" value="J. David Koch" />
+ <info name="programmer" value="Erol Otus" />
+ <info name="programmer" value="Doug Barnett" />
+ <info name="programmer" value="Russell Lieblich" />
+ <info name="programmer" value="Nicky Robinson" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-11 -->
@@ -521,7 +631,9 @@ license:CC0-1.0
<description>The Hunt for Red October</description>
<year>1989</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="John Brooks, Todd Daugherty, and Alex Villagran" />
+ <info name="programmer" value="John Brooks" />
+ <info name="programmer" value="Todd Daugherty" />
+ <info name="programmer" value="Alex Villagran" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-18 -->
@@ -573,11 +685,14 @@ license:CC0-1.0
</software>
<software name="slntsvce">
- <description>Silent Service</description>
+ <description>Silent Service (version 925.01)</description>
<year>1987</year>
- <publisher>Microprose</publisher>
- <info name="programmer" value="Sid Meier, Ed Magnin, Jim Synoski, Michael Haire, Michele Mahan, Silas Warner, Al Roireau, Larry Martin, and Edward Bever" />
+ <publisher>Microprose Software</publisher>
+ <info name="author" value="Sid Meier" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Jim Synoski" />
<info name="usage" value="Requires a 256K Apple IIgs." />
+ <info name="version" value="925.01" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-18 -->
<!-- simulation game -->
@@ -592,7 +707,9 @@ license:CC0-1.0
<description>GATE</description>
<year>1992</year>
<publisher>Seven Hills Software</publisher>
- <info name="programmer" value="Henrik Gudat, Jörg Kienzle, and Yann Le Tensorer" />
+ <info name="programmer" value="Henrik Gudat" />
+ <info name="programmer" value="Jörg Kienzle" />
+ <info name="programmer" value="Yann Le Tensorer" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-18 -->
@@ -615,7 +732,9 @@ license:CC0-1.0
<description>Balance of Power: The 1990 Edition</description>
<year>1989</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Chris Crawford, Ian Hadley, and Caroline Hadley" />
+ <info name="programmer" value="Chris Crawford" />
+ <info name="programmer" value="Ian Hadley" />
+ <info name="programmer" value="Caroline Hadley" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-29 -->
@@ -631,7 +750,8 @@ license:CC0-1.0
<description>Bridge 6.0 (version 2.49B)</description>
<year>1989</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="Robert Harnish and Arthur Walsh" />
+ <info name="programmer" value="Robert Harnish" />
+ <info name="programmer" value="Arthur Walsh" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="2.498" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -647,7 +767,7 @@ license:CC0-1.0
<software name="qustron2">
<description>Questron II (version 1.1)</description>
<year>1988</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="developer" value="Westwood Associates" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.1" />
@@ -664,8 +784,10 @@ license:CC0-1.0
<software name="rchstars">
<description>Reach for the Stars</description>
<year>1988</year>
- <publisher>Strategic Studies Group</publisher>
- <info name="programmer" value="Roger Keating, Ian Trout, and Allan Bell" />
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="programmer" value="Allan Bell" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-29 -->
@@ -677,10 +799,10 @@ license:CC0-1.0
</part>
</software>
- <software name="roadwr2k">
+ <software name="roadwar2k">
<description>Roadwar 2000</description>
<year>1987</year>
- <publisher>Strategic Simulations</publisher>
+ <publisher>Strategic Simulations Inc. (SSI)</publisher>
<info name="developer" value="Westwood Associates" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
@@ -693,11 +815,16 @@ license:CC0-1.0
</part>
</software>
- <software name="sshockey">
+ <software name="ssicehock">
<description>Superstar Ice Hockey</description>
<year>1988</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Ed Ringler, Andrew Caldwell, Clayton Wishoff, Simon Ffinch, Ed Ringler Sr., and Chris Oke" />
+ <info name="programmer" value="Ed Ringler" />
+ <info name="programmer" value="Andrew Caldwell" />
+ <info name="programmer" value="Clayton Wishoff" />
+ <info name="programmer" value="Simon Ffinch" />
+ <info name="programmer" value="Ed Ringler Sr." />
+ <info name="programmer" value="Chris Oke" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-29 -->
@@ -713,7 +840,8 @@ license:CC0-1.0
<description>Life and Death</description>
<year>1989</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="Mark Manyen and Jacob P. Smith" />
+ <info name="programmer" value="Mark Manyen" />
+ <info name="programmer" value="Jacob P. Smith" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-24 -->
@@ -736,7 +864,15 @@ license:CC0-1.0
<description>Tetris</description>
<year>1988</year>
<publisher>Spectrum HoloByte</publisher>
- <info name="programmer" value="Roland Gustafsson, Sean B. Barger, Dan Geisler, Daniel L. Guerra, Jody Sather, Ed Bogas, Neil Cormia, Ty Roberts, and Gary Clayton" />
+ <info name="programmer" value="Roland Gustafsson" />
+ <info name="programmer" value="Sean B. Barger" />
+ <info name="programmer" value="Dan Geisler" />
+ <info name="programmer" value="Daniel L. Guerra" />
+ <info name="programmer" value="Jody Sather" />
+ <info name="programmer" value="Ed Bogas" />
+ <info name="programmer" value="Neil Cormia" />
+ <info name="programmer" value="Ty Roberts" />
+ <info name="programmer" value="Gary Clayton" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-29 -->
@@ -752,7 +888,12 @@ license:CC0-1.0
<description>LaserForce</description>
<year>1989</year>
<publisher>Fanfare</publisher>
- <info name="programmer" value="Javier Rullan, Huibert Aalbers, Thierry Méchain, Stéphane Renaudin, J-C. Doré, and Olivier Guichaoua" />
+ <info name="programmer" value="Javier Rullan" />
+ <info name="programmer" value="Huibert Aalbers" />
+ <info name="programmer" value="Thierry Méchain" />
+ <info name="programmer" value="Stéphane Renaudin" />
+ <info name="programmer" value="J-C. Doré" />
+ <info name="programmer" value="Olivier Guichaoua" />
<info name="usage" value="Requires a 1.25MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-24 -->
@@ -775,7 +916,8 @@ license:CC0-1.0
<description>Arkanoid II: Revenge of Doh</description>
<year>1989</year>
<publisher>Taito America</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
<info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-26 -->
@@ -807,7 +949,19 @@ license:CC0-1.0
<description>Déjà Vu</description>
<year>1988</year>
<publisher>ICOM Simulations</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Karl Roelofs, Todd Squires, Craig Erickson, Kurt Nelson, Steven Hays, Terry Schulenburg, Darin Adler, Jay Zipnick, Waldermar Horwat, Mark Waterman, and Tod Zipnick" />
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="Craig Erickson" />
+ <info name="programmer" value="Kurt Nelson" />
+ <info name="programmer" value="Steven Hays" />
+ <info name="programmer" value="Terry Schulenburg" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldermar Horwat" />
+ <info name="programmer" value="Mark Waterman" />
+ <info name="programmer" value="Tod Zipnick" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-26 -->
@@ -826,6 +980,36 @@ license:CC0-1.0
</part>
</software>
+ <software name="dejavu2">
+ <description>Déjà Vu II: Lost in Las Vegas</description>
+ <year>1989</year>
+ <publisher>Mindscape</publisher>
+ <info name="programmer" value="Fred Allen" />
+ <info name="programmer" value="David Marsh" />
+ <info name="programmer" value="Michael Manning" />
+ <info name="programmer" value="Todd Squires" />
+ <info name="programmer" value="David Feldman" />
+ <info name="programmer" value="Paul Snively" />
+ <info name="programmer" value="Brian Baker" />
+ <info name="programmer" value="Karl Roelofs" />
+ <info name="programmer" value="Ed Dluzen" />
+ <info name="programmer" value="Darin Adler" />
+ <info name="programmer" value="Jay Zipnick" />
+ <info name="programmer" value="Waldemar Horwat" />
+ <info name="programmer" value="Julia Ulano" />
+ <info name="programmer" value="Tod Zipnick" />
+ <info name="programmer" value="Mitch Adler" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2021-06-01 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1361905">
+ <rom name="deja vu ii lost in last vegas iigs.woz" size="1361905" crc="55d9e932" sha1="9a82f93d0a200435f05d0b1a0a9d37d4c1978c20" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hacker2">
<description>Hacker II: The Doomsday Papers</description>
<year>1987</year>
@@ -846,7 +1030,8 @@ license:CC0-1.0
<description>Destroyer</description>
<year>1987</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Michael Kosaka and Chuck Sommerville" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Chuck Sommerville" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -862,7 +1047,12 @@ license:CC0-1.0
<description>GBA Championship Basketball</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Paul Terry, Jack Thornton, Scott Orr, John Cutter, Troy Lyndon, and Russell Lieblich" />
+ <info name="programmer" value="Paul Terry" />
+ <info name="programmer" value="Jack Thornton" />
+ <info name="programmer" value="Scott Orr" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Troy Lyndon" />
+ <info name="programmer" value="Russell Lieblich" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -878,7 +1068,8 @@ license:CC0-1.0
<description>Jigsaw</description>
<year>1988</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Javier Rullan Ruano and Huibert Aalbers" />
+ <info name="programmer" value="Javier Rullan Ruano" />
+ <info name="programmer" value="Huibert Aalbers" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -933,7 +1124,9 @@ license:CC0-1.0
<description>Photonix (version 1.46)</description>
<year>1989</year>
<publisher>Free Tools Association</publisher>
- <info name="developer" value="El Mathos, Pad, and ACS" />
+ <info name="developer" value="El Mathos" />
+ <info name="developer" value="Pad" />
+ <info name="developer" value="ACS" />
<info name="usage" value="Requires a 1.25M Apple IIgs ROM 00 or ROM 01." />
<info name="version" value="1.46" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -946,11 +1139,44 @@ license:CC0-1.0
</part>
</software>
+ <software name="photonix2">
+ <description>Photonix II (version 2.50)</description>
+ <year>1990</year>
+ <publisher>Free Tools Association</publisher>
+ <info name="programmer" value="Pierre Raynaud-Richard" />
+ <info name="programmer" value="Olivier Goguel" />
+ <info name="programmer" value="Denis Barritault" />
+ <info name="programmer" value="Dany Bar" />
+ <info name="programmer" value="Olivier Bailly-Maitre" />
+ <info name="programmer" value="Lionel Picamelot" />
+ <info name="usage" value="Requires an Apple IIgs with 1.25MB of RAM" />
+ <info name="version" value="2.50" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- disk utility -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296227">
+ <rom name="photonix ii iigs v2.50.woz" size="1296227" crc="d2ee6965" sha1="835b2395b5ab30e960a7fb4292bdedd827b24b21" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="silpheed">
- <description>Silpheed</description>
+ <description>Silpheed - Super Dogfighter</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="John Rettig, Stuart Goldstein, Mark Seibert, Satoshi Uesaki, Nobuyuki Ogawa, Akira Eye, Fumihito Kasatani, Nobuyuki Aoshima, Hiromi Ohba, Takeshi Miyaji, Osamu Harada, and Youichi Miyaji" />
+ <info name="programmer" value="John Rettig" />
+ <info name="programmer" value="Stuart Goldstein" />
+ <info name="programmer" value="Mark Seibert" />
+ <info name="programmer" value="Satoshi Uesaki" />
+ <info name="programmer" value="Nobuyuki Ogawa" />
+ <info name="programmer" value="Akira Eye" />
+ <info name="programmer" value="Fumihito Kasatani" />
+ <info name="programmer" value="Nobuyuki Aoshima" />
+ <info name="programmer" value="Hiromi Ohba" />
+ <info name="programmer" value="Takeshi Miyaji" />
+ <info name="programmer" value="Osamu Harada" />
+ <info name="programmer" value="Youichi Miyaji" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -969,11 +1195,16 @@ license:CC0-1.0
</part>
</software>
- <software name="spquest">
+ <software name="squest">
<description>Space Quest: The Sarien Encounter</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Scott Murphy, Mark Crowe, Jeff Stephenson, Chris Iden, Sol Ackerman, and Ken Williams" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -992,11 +1223,47 @@ license:CC0-1.0
</part>
</software>
+ <software name="squest2">
+ <description>Space Quest II: Vohaul's Revenge</description>
+ <year>1988</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2021-05-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1296282">
+ <rom name="space quest ii iigs - disk 1.woz" size="1296282" crc="34a62868" sha1="53340223e323e9b1e56e3c82b100cfd2869799bf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296282">
+ <rom name="space quest ii iigs - disk 2.woz" size="1296282" crc="f5cce30c" sha1="6684e98df5c3d88f44099abaeabe4b8396e0c7f3" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="thrdcrir">
<description>The Third Courier</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Carol Manley, Ivan Manley, Mike Branham, Robert Clardy, Chris Barker, Scott Wallin, Miik Nichols, Sheldon Safir, and Mark Wallace" />
+ <info name="programmer" value="Carol Manley" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="programmer" value="Mike Branham" />
+ <info name="programmer" value="Robert Clardy" />
+ <info name="programmer" value="Chris Barker" />
+ <info name="programmer" value="Scott Wallin" />
+ <info name="programmer" value="Miik Nichols" />
+ <info name="programmer" value="Sheldon Safir" />
+ <info name="programmer" value="Mark Wallace" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1019,7 +1286,22 @@ license:CC0-1.0
<description>War in Middle Earth</description>
<year>1989</year>
<publisher>Melbourne House</publisher>
- <info name="programmer" value="Ron Harris, Robert Clardy, Alan B. Clark, Graeme Devine, Mike Branham, Lloyd Ollmann, Jr., John Conley, Jim McBride, Michael Park, David Schroeder, Michael Ormsby, Mike Christy, Ann Dickens Clardy, Marcus Streets, Mark Riley, and Mike Singleton" />
+ <info name="programmer" value="Ron Harris" />
+ <info name="programmer" value="Robert Clardy" />
+ <info name="programmer" value="Alan B. Clark" />
+ <info name="programmer" value="Graeme Devine" />
+ <info name="programmer" value="Mike Branham" />
+ <info name="programmer" value="Lloyd Ollmann, Jr." />
+ <info name="programmer" value="John Conley" />
+ <info name="programmer" value="Jim McBride" />
+ <info name="programmer" value="Michael Park" />
+ <info name="programmer" value="David Schroeder" />
+ <info name="programmer" value="Michael Ormsby" />
+ <info name="programmer" value="Mike Christy" />
+ <info name="programmer" value="Ann Dickens Clardy" />
+ <info name="programmer" value="Marcus Streets" />
+ <info name="programmer" value="Mark Riley" />
+ <info name="programmer" value="Mike Singleton" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1038,12 +1320,15 @@ license:CC0-1.0
</part>
</software>
- <software name="carmwrld">
- <description>Where in the World is Carmen Sandiego?</description>
+ <software name="carmwrld10" cloneof="carmwrld">
+ <description>Where in the World is Carmen Sandiego? (version 1.0)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliott, Loring Vogel, Leila Bronstein, Don Albrecht, and Michelle McBride" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Loring Vogel" />
<info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
<!-- educational game -->
@@ -1061,15 +1346,56 @@ license:CC0-1.0
</part>
</software>
- <software name="windwlkr">
+ <software name="carmwrld">
+ <description>Where in the World is Carmen Sandiego? (version 1.1)</description>
+ <year>1989</year>
+ <publisher>Brøderbund Software</publisher>
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliott" />
+ <info name="programmer" value="Loring Vogel" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2021-05-27 -->
+ <!-- educational game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk Side " />
+ <dataarea name="flop" size="1296257">
+ <rom name="where in the world is carmen sandiego iigs v1.1 disk 1.woz" size="1296257" crc="0871454d" sha1="ab70c9d0c2d836fe477edb7d76a7763d36abc73b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk Side " />
+ <dataarea name="flop" size="1296257">
+ <rom name="where in the world is carmen sandiego iigs v1.1 disk 2.woz" size="1296257" crc="3893ecd0" sha1="c2680baaadb87317a610c20592db0c289fda289d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wndwlkr">
<description>Windwalker</description>
<year>1990</year>
<publisher>Origin Systems</publisher>
- <info name="programmer" value="Greg Malone, Dallas Snell, Jeff Hillhouse, Dave Eresian, Richard Filoramo, Lester Humphreys, Jason Linhart, Stephen Linhart, Kiri Naiman, Keith Winston, Jeff Dee, Glen Johnson, Denis Loubet, Keith Berdak, Bill Clarke, and Doug Hewitt" />
+ <info name="programmer" value="Greg Malone" />
+ <info name="programmer" value="Dallas Snell" />
+ <info name="programmer" value="Jeff Hillhouse" />
+ <info name="programmer" value="Dave Eresian" />
+ <info name="programmer" value="Richard Filoramo" />
+ <info name="programmer" value="Lester Humphreys" />
+ <info name="programmer" value="Jason Linhart" />
+ <info name="programmer" value="Stephen Linhart" />
+ <info name="programmer" value="Kiri Naiman" />
+ <info name="programmer" value="Keith Winston" />
+ <info name="programmer" value="Jeff Dee" />
+ <info name="programmer" value="Glen Johnson" />
+ <info name="programmer" value="Denis Loubet" />
+ <info name="programmer" value="Keith Berdak" />
+ <info name="programmer" value="Bill Clarke" />
+ <info name="programmer" value="Doug Hewitt" />
<info name="usage" value="Requires a 768K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
- <!-- roleplaying game -->
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1329100">
@@ -1120,7 +1446,8 @@ license:CC0-1.0
<description>Shanghai</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Brodie Lockard and Ivan Manley" />
+ <info name="programmer" value="Brodie Lockard" />
+ <info name="programmer" value="Ivan Manley" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1136,7 +1463,18 @@ license:CC0-1.0
<description>Police Quest: In Pursuit of the Death Angel</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Jim Walls, Greg Rowland, Al Lowe, Scott Murphy, Ken Williams, Mark Crowe, Jerry Moore, Margaret Lowe, Jeff Stephenson, Chris Iden, Bob Heitman, and Carlos Escobar" />
+ <info name="programmer" value="Jim Walls" />
+ <info name="programmer" value="Greg Rowland" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1159,11 +1497,15 @@ license:CC0-1.0
<description>Dragon Wars</description>
<year>1990</year>
<publisher>Interplay Productions</publisher>
- <info name="programmer" value="Rebecca Heineman, Todd Camasta, Charles Deenan, Brian Fargo, and Paul O'Connor" />
+ <info name="programmer" value="Rebecca Heineman" />
+ <info name="programmer" value="Todd Camasta" />
+ <info name="programmer" value="Charles Deenan" />
+ <info name="programmer" value="Brian Fargo" />
+ <info name="programmer" value="Paul O'Connor" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-30 -->
- <!-- roleplaying game -->
+ <!-- role-playing game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296196">
<rom name="dragon wars iigs.woz" size="1296196" crc="331a8128" sha1="551d0e2fd5a4a33c41a7ba3f9b381bd41a8a7e9d" />
@@ -1175,7 +1517,8 @@ license:CC0-1.0
<description>Monte Carlo</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Jeff Lefferts and Richard L. Seaborne" />
+ <info name="programmer" value="Jeff Lefferts" />
+ <info name="programmer" value="Richard L. Seaborne" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1191,7 +1534,9 @@ license:CC0-1.0
<description>Sub Battle Simulator</description>
<year>1987</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Rob Brannon, Kelly Fergason, and Steve Snyder" />
+ <info name="programmer" value="Rob Brannon" />
+ <info name="programmer" value="Kelly Fergason" />
+ <info name="programmer" value="Steve Snyder" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1207,7 +1552,9 @@ license:CC0-1.0
<description>John Elway's Quarterback</description>
<year>1989</year>
<publisher>Melbourne House</publisher>
- <info name="programmer" value="William Denham, Gotham Graphics, and Raymond Genovese" />
+ <info name="programmer" value="William Denham" />
+ <info name="programmer" value="Gotham Graphics" />
+ <info name="programmer" value="Raymond Genovese" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-27 -->
@@ -1219,34 +1566,83 @@ license:CC0-1.0
</part>
</software>
- <software name="spquest2">
- <description>Space Quest II: Vohaul's Revenge</description>
- <year>1988</year>
+ <software name="kquest">
+ <description>King's Quest: Quest for the Crown</description>
+ <year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Mark Crowe, Scott Murphy, Jeff Stephenson, Chris Iden, Robert Heitman, and Carlos Escobar" />
+ <info name="author" value="Roberta Williams, Al Lowe, Charles Tingley, Ken MacNeill, Chris Iden, Doug MacNeill, Greg Rowland, and Chris Iden" />
+ <info name="programmer" value="Carlos Escobar" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
- <!-- Dump released: 2021-05-28 -->
+ <!-- Dump released: 2021-10-09 -->
<!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1296282">
- <rom name="space quest ii iigs - disk 1.woz" size="1296282" crc="34a62868" sha1="53340223e323e9b1e56e3c82b100cfd2869799bf" />
+ <rom name="king's quest iigs - disk 1.woz" size="1296282" crc="813e5b11" sha1="8e61a96821460da26d8e9c567e358ec18d15c535" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="1296282">
- <rom name="space quest ii iigs - disk 2.woz" size="1296282" crc="f5cce30c" sha1="6684e98df5c3d88f44099abaeabe4b8396e0c7f3" />
+ <dataarea name="flop" size="1298330">
+ <rom name="king's quest iigs - disk 2.woz" size="1298330" crc="832a3043" sha1="7fe827331b55408b478ffb45330a09de73234ebb" />
</dataarea>
</part>
</software>
- <software name="kingqst3">
+ <software name="kquest2">
+ <description>King's Quest II: Romancing the Throne (version 2.0A)</description>
+ <year>1987</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="2.0A" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2021-09-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1312707">
+ <rom name="king's quest ii iigs - disk 1.woz" size="1312707" crc="df46df6b" sha1="bc29f617b36e77f064f13b371db1a0ed6e8cc1de" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1312707">
+ <rom name="king's quest ii iigs - disk 2.woz" size="1312707" crc="23294f32" sha1="e0e383b140d7eafd3b94faeb12074564a8d0a24b" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kquest3">
<description>King's Quest III: To Heir is Human</description>
<year>1988</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Roberta Williams, Al Lowe, Bob Kernaghan, Robert E. Heitman, Jeff Stephenson, Chris Iden, Doug MacNeill, Margaret Lowe, Dale Carlson, Jennifer Cobb, Chad Bye, Jeremy T. Cromwell, Carlos Escobar, Annette Childs, Greg Steffen, and Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Bob Kernaghan" />
+ <info name="programmer" value="Robert E. Heitman" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Doug MacNeill" />
+ <info name="programmer" value="Margaret Lowe" />
+ <info name="programmer" value="Dale Carlson" />
+ <info name="programmer" value="Jennifer Cobb" />
+ <info name="programmer" value="Chad Bye" />
+ <info name="programmer" value="Jeremy T. Cromwell" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="programmer" value="Annette Childs" />
+ <info name="programmer" value="Greg Steffen" />
+ <info name="programmer" value="Ken Williams" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-28 -->
@@ -1265,11 +1661,53 @@ license:CC0-1.0
</part>
</software>
+ <software name="kingqst4">
+ <description>King's Quest IV: The Perils of Rosella</description>
+ <year>1989</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="William Goldstein" />
+ <info name="programmer" value="Chris Hoyt" />
+ <info name="programmer" value="John Hamilton" />
+ <info name="programmer" value="Teresa Baker" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="Carolly Hauksdottir" />
+ <info name="programmer" value="William Skirvin" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Robert Heitman" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Paul Krasno" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2021-05-28 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1296374">
+ <rom name="king's quest iv iigs - disk 1.woz" size="1296374" crc="ff747ad4" sha1="6a216fc73cf146418bcc4cb2a0b159e1d96d367b" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296374">
+ <rom name="king's quest iv iigs - disk 2.woz" size="1296374" crc="f209e379" sha1="5b0a275432a495b86eb325a65558e340f15bcea4" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3" />
+ <dataarea name="flop" size="1296374">
+ <rom name="king's quest iv iigs - disk 3.woz" size="1296374" crc="65f8435a" sha1="e20ba8c160e6609efa9d3576bef83c798dd2c436" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gwshoot">
<description>Great Western Shootout</description>
<year>1989</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Scott Patterson and Matt Crysdale" />
+ <info name="programmer" value="Scott Patterson" />
+ <info name="programmer" value="Matt Crysdale" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-28 -->
@@ -1288,11 +1726,18 @@ license:CC0-1.0
</part>
</software>
- <software name="lslarry">
- <description>Leisure Suit Larry in the Land of the Lounge Lizards</description>
+ <software name="lsl1">
+ <description>Leisure Suit Larry in The Land of the Lounge Lizards</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Al Lowe, Chuck Benton, Mark Crowe, Jeff Stephenson, Chris Iden, Bob Heitman, Ken Williams, and Carlos Escobar" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Chuck Benton" />
+ <info name="programmer" value="Mark Crowe" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Carlos Escobar" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-28 -->
@@ -1311,11 +1756,21 @@ license:CC0-1.0
</part>
</software>
- <software name="bcauldrn">
+ <software name="blkcauld">
<description>The Black Cauldron</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Al Lowe, Roberta Williams, Elaine Boulay, Nancy Casolaro, Melissa Haldeman, Scott Murphy, Sol Ackerman, Ken Williams, Jeff Stephenson, Chris Iden, and Bob Heitman" />
+ <info name="programmer" value="Al Lowe" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Elaine Boulay" />
+ <info name="programmer" value="Nancy Casolaro" />
+ <info name="programmer" value="Melissa Haldeman" />
+ <info name="programmer" value="Scott Murphy" />
+ <info name="programmer" value="Sol Ackerman" />
+ <info name="programmer" value="Ken Williams" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-28 -->
@@ -1344,51 +1799,27 @@ license:CC0-1.0
<!-- Dump released: 2021-05-28 -->
<!-- adventure game -->
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Reel 1"/>
<dataarea name="flop" size="1296682">
<rom name="the king of chicago iigs - reel 1.woz" size="1296682" crc="41530912" sha1="85fb08f8da981e9cc87edf8446e722ab7eefae91" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Reel 2"/>
<dataarea name="flop" size="1296170">
<rom name="the king of chicago iigs - reel 2.woz" size="1296170" crc="a53c37c0" sha1="ff0519cf1b17e77587d82a41c12c836f44e21ab5" />
</dataarea>
</part>
</software>
- <software name="kingqst4">
- <description>King's Quest IV: The Perils of Rosella</description>
- <year>1989</year>
- <publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Ken Williams, Roberta Williams, William Goldstein, Chris Hoyt, John Hamilton, Teresa Baker, Jerry Moore, Carolly Hauksdottir, William Skirvin, Jeff Stephenson, Robert Heitman, Chris Iden, and Paul Krasno" />
- <info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS" />
- <!-- Dump released: 2021-05-28 -->
- <!-- adventure game -->
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="1296374">
- <rom name="king's quest iv iigs - disk 1.woz" size="1296374" crc="ff747ad4" sha1="6a216fc73cf146418bcc4cb2a0b159e1d96d367b" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="1296374">
- <rom name="king's quest iv iigs - disk 2.woz" size="1296374" crc="f209e379" sha1="5b0a275432a495b86eb325a65558e340f15bcea4" />
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_3_5">
- <feature name="part_id" value="Disk 3" />
- <dataarea name="flop" size="1296374">
- <rom name="king's quest iv iigs - disk 3.woz" size="1296374" crc="65f8435a" sha1="e20ba8c160e6609efa9d3576bef83c798dd2c436" />
- </dataarea>
- </part>
- </software>
-
<software name="starsg1">
<description>Star Saga: One - Beyond The Boundary (version 1.1)</description>
<year>1987</year>
<publisher>Masterplay Publishing Corporation</publisher>
- <info name="programmer" value="Richard Dutton, Walter Freitag, Andrew C. Greenberg, and Michael Massimilla" />
+ <info name="programmer" value="Richard Dutton" />
+ <info name="programmer" value="Walter Freitag" />
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Michael Massimilla" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -1401,27 +1832,12 @@ license:CC0-1.0
</part>
</software>
- <software name="dejavu2">
- <description>Déjà Vu II: Lost in Las Vegas</description>
- <year>1989</year>
- <publisher>Mindscape</publisher>
- <info name="programmer" value="Fred Allen, David Marsh, Michael Manning, Todd Squires, David Feldman, Paul Snively, Brian Baker, Karl Roelofs, Ed Dluzen, Darin Adler, Jay Zipnick, Waldemar Horwat, Julia Ulano, Tod Zipnick, and Mitch Adler" />
- <info name="usage" value="Requires a 768K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS" />
- <!-- Dump released: 2021-06-01 -->
- <!-- adventure game -->
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1361905">
- <rom name="deja vu ii lost in last vegas iigs.woz" size="1361905" crc="55d9e932" sha1="9a82f93d0a200435f05d0b1a0a9d37d4c1978c20" />
- </dataarea>
- </part>
- </software>
-
<software name="twrmyrgl">
<description>The Tower of Myraglen</description>
<year>1987</year>
<publisher>PBI Software</publisher>
- <info name="programmer" value="Richard L. Seaborne and Jeff A. Lamberts" />
+ <info name="programmer" value="Richard L. Seaborne" />
+ <info name="programmer" value="Jeff A. Lamberts" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-01 -->
@@ -1468,7 +1884,9 @@ license:CC0-1.0
<description>World Tour Golf</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
- <info name="author" value="Evan and Nicky Robinson and Paul Reiche III" />
+ <info name="author" value="Evan Robinson" />
+ <info name="author" value="Nicky Robinson" />
+ <info name="author" value="Paul Reiche III" />
<info name="programmer" value="John Selhorst" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
@@ -1485,7 +1903,11 @@ license:CC0-1.0
<description>Vegas Gambler</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Marek Jackiewicz, Andrzej Miciłkiewicz, Marcin Szostakowski, Maciej Markuszewski, and Dorota Błaszczak" />
+ <info name="programmer" value="Marek Jackiewicz" />
+ <info name="programmer" value="Andrzej Miciłkiewicz" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-01 -->
@@ -1501,7 +1923,8 @@ license:CC0-1.0
<description>The Fidelity Chessmaster 2100</description>
<year>1988</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="Troy Heere and Mark Manyen" />
+ <info name="programmer" value="Troy Heere" />
+ <info name="programmer" value="Mark Manyen" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-01 -->
@@ -1524,7 +1947,18 @@ license:CC0-1.0
<description>Space Ace</description>
<year>1990</year>
<publisher>ReadySoft</publisher>
- <info name="programmer" value="David Foster, Simon Douglas, Jorge Freitas, Hugh MacLeod, Murray Foster, Laurie Williams, Adam Wolk, Michael Griffith, Peter Bayes, David Dimatteo, Sue McComb, and Joanne Ashdown" />
+ <info name="programmer" value="David Foster" />
+ <info name="programmer" value="Simon Douglas" />
+ <info name="programmer" value="Jorge Freitas" />
+ <info name="programmer" value="Hugh MacLeod" />
+ <info name="programmer" value="Murray Foster" />
+ <info name="programmer" value="Laurie Williams" />
+ <info name="programmer" value="Adam Wolk" />
+ <info name="programmer" value="Michael Griffith" />
+ <info name="programmer" value="Peter Bayes" />
+ <info name="programmer" value="David Dimatteo" />
+ <info name="programmer" value="Sue McComb" />
+ <info name="programmer" value="Joanne Ashdown" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-01 -->
@@ -1589,7 +2023,8 @@ license:CC0-1.0
<description>Arkanoid</description>
<year>1988</year>
<publisher>Taito America</publisher>
- <info name="programmer" value="Ryan Ridges and John Lund" />
+ <info name="programmer" value="Ryan Ridges" />
+ <info name="programmer" value="John Lund" />
<info name="usage" value="Requires a 512K Apple IIgs ROM 01." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-01 -->
@@ -1644,7 +2079,11 @@ license:CC0-1.0
<description>Captain Blood</description>
<year>1989</year>
<publisher>Mindscape</publisher>
- <info name="programmer" value="Philippe Ulrich, Didier Bouchon, Jean-Michel Jarre, Alexis Martial, and Michael Rho" />
+ <info name="programmer" value="Philippe Ulrich" />
+ <info name="programmer" value="Didier Bouchon" />
+ <info name="programmer" value="Jean-Michel Jarre" />
+ <info name="programmer" value="Alexis Martial" />
+ <info name="programmer" value="Michael Rho" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-31 -->
@@ -1660,7 +2099,10 @@ license:CC0-1.0
<description>Where in the U.S.A. is Carmen Sandiego?</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Gene Portwood, Lauren Elliot, Peter Adams, Leila Bronstein, Julie Glavin, Michelle McBride, Dan Guerra, Les Pardue, Bevan Hulfenstein, Louis Evans, and Tom Rettig" />
+ <info name="author" value="Gene Portwood" />
+ <info name="author" value="Lauren Elliot" />
+ <info name="developer" value="Sculptured Software" />
+ <info name="programmer" value="Peter Adams" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-31 -->
@@ -1679,10 +2121,11 @@ license:CC0-1.0
</part>
</software>
- <software name="brdtale">
+ <software name="brdstale">
<description>The Bard's Tale: Tales of the Unknown</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
+ <info name="developer" value="Interplay Productions" />
<info name="programmer" value="Rebecca Heineman" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
@@ -1712,12 +2155,13 @@ license:CC0-1.0
</software>
<software name="dreamzne">
- <description>Dream Zone (version 3.2)</description>
+ <description>Dream Zone (version 3.2 #29711)</description>
<year>1987</year>
<publisher>Baudville</publisher>
- <info name="programmer" value="Andy Gavin, Jason Rubin, and Sarah Sidman" />
+ <info name="partno" value="29711" />
+ <info name="programmer" value="Andy Gavin" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <info name="version" value="3.2" />
+ <info name="version" value="3.2 #29711" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-31 -->
<!-- adventure game -->
@@ -1739,7 +2183,15 @@ license:CC0-1.0
<description>Manhunter: New York</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Dave Murry, Barry Murry, Dee Dee Murry, Jeff Stephenson, Chris Iden, Bob Heitman, Carlos Escobar, and Dr. Gary and Julie Stonedahl" />
+ <info name="programmer" value="Dave Murry" />
+ <info name="programmer" value="Barry Murry" />
+ <info name="programmer" value="Dee Dee Murry" />
+ <info name="programmer" value="Jeff Stephenson" />
+ <info name="programmer" value="Chris Iden" />
+ <info name="programmer" value="Bob Heitman" />
+ <info name="programmer" value="Carlos Escobar" />
+ <info name="programmer" value="Dr. Gary" />
+ <info name="programmer" value="Julie Stonedahl" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-05-31 -->
@@ -1774,11 +2226,13 @@ license:CC0-1.0
<description>Mean 18</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Rex Bradford, George Karalias, and Mark Lesser" />
+ <info name="programmer" value="Rex Bradford" />
+ <info name="programmer" value="George Karalias" />
+ <info name="programmer" value="Mark Lesser" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-03 -->
- <!-- sports game This archive includes the three add-on disks that were available separately (Famous Courses Volume II, III, and IV).-->
+ <!-- sports game This archive includes the three add-on disks that were available separately (Famous Courses Volume II, III, and IV). -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk ~ - Program disk" />
<dataarea name="flop" size="1329494">
@@ -1809,7 +2263,8 @@ license:CC0-1.0
<description>Hover Blade</description>
<year>1991</year>
<publisher>MCX</publisher>
- <info name="programmer" value="Shiraz Akmal and Eric Boden" />
+ <info name="programmer" value="Shiraz Akmal" />
+ <info name="programmer" value="Eric Boden" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value=",A2GS" />
<!-- Dump released: 2021-06-04 -->
@@ -1832,7 +2287,11 @@ license:CC0-1.0
<description>Fast Break</description>
<year>1989</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Steve Cartwright, Greg Hospelhorn, George Wong, Pam Levins, and Roseann Mitchell" />
+ <info name="programmer" value="Steve Cartwright" />
+ <info name="programmer" value="Greg Hospelhorn" />
+ <info name="programmer" value="George Wong" />
+ <info name="programmer" value="Pam Levins" />
+ <info name="programmer" value="Roseann Mitchell" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-04 -->
@@ -1845,14 +2304,19 @@ license:CC0-1.0
</software>
<software name="hallsmzm">
- <description>Halls of Montezuma</description>
+ <description>Halls of Montezuma (version 1.0 07-1990)</description>
<year>1990</year>
- <publisher>Strategic Simulations</publisher>
- <info name="programmer" value="Roger Keating, Ian Trout, Allan Bell, Sue Bell, and Steven Hart" />
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Roger Keating" />
+ <info name="programmer" value="Ian Trout" />
+ <info name="programmer" value="Allan Bell" />
+ <info name="programmer" value="Sue Bell" />
+ <info name="programmer" value="Steven Hart" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
+ <info name="version" value="1.0 07-1990" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-04 -->
- <!-- simulation game -->
+ <!-- strategy game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="1296238">
@@ -1871,7 +2335,12 @@ license:CC0-1.0
<description>Star Saga: Two - The Clathran Menace</description>
<year>1988</year>
<publisher>MasterPlay Publishing Corporation</publisher>
- <info name="programmer" value="Richard Dutton, Walter Freitag, Andrew C. Greenberg, Sheila M. Greenberg, Michael Massimilla, and Gerald M. Seixas" />
+ <info name="programmer" value="Richard Dutton" />
+ <info name="programmer" value="Walter Freitag" />
+ <info name="programmer" value="Andrew C. Greenberg" />
+ <info name="programmer" value="Sheila M. Greenberg" />
+ <info name="programmer" value="Michael Massimilla" />
+ <info name="programmer" value="Gerald M. Seixas" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-04 -->
@@ -1887,7 +2356,11 @@ license:CC0-1.0
<description>Club Backgammon</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Staszek Bartkowski, Jarek Olszewski, Dorota B&#x142;aszczak, Maciej Markuszewski, and Marcin Szostakowski" />
+ <info name="programmer" value="Staszek Bartkowski" />
+ <info name="programmer" value="Jarek Olszewski" />
+ <info name="programmer" value="Dorota B&#x142;aszczak" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Marcin Szostakowski" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-04 -->
@@ -1916,11 +2389,49 @@ license:CC0-1.0
</part>
</software>
+ <software name="crylmsn">
+ <description>2088: The Cryllan Mission</description>
+ <year>1989</year>
+ <publisher>Victory Software</publisher>
+ <info name="programmer" value="Vinay Pai" />
+ <info name="programmer" value="Vivek Pai" />
+ <info name="usage" value="Requires a ROM1 or ROM3 Apple IIgs with at least 1.25MB RAM." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- roleplaying game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - System" />
+ <dataarea name="flop" size="1328949">
+ <rom name="2088 the cryllan mission iigs - disk 1 - system.woz" size="1328949" crc="a3147ab2" sha1="4cd06e51f8fd43fcc32ec4ee50ddaff33f70136a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Program" />
+ <dataarea name="flop" size="1328950">
+ <rom name="2088 the cryllan mission iigs - disk 2 - program.woz" size="1328950" crc="727b7769" sha1="5a5966dd8f65ccf007217b558a11a9fe55f538ae" />
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3 - Indoors" />
+ <dataarea name="flop" size="1328950">
+ <rom name="2088 the cryllan mission iigs - disk 3 - indoors.woz" size="1328950" crc="755a1f3f" sha1="bb79136ef1052f2d2885dc45eb80a28524c1782c" />
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 4 - Outdoors" />
+ <dataarea name="flop" size="1328472">
+ <rom name="2088 the cryllan mission iigs - disk 4 - outdoors.woz" size="1328472" crc="839db47b" sha1="0fc1f12aa436248f3b8f6b4a57da2c1a6ae7ac8e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="crylmsn2">
<description>2088: The Cryllan Mission - The Second Scenario</description>
<year>1990</year>
<publisher>Victory Software</publisher>
- <info name="programmer" value="Vinay Pai, Vivek Pai, and Vijay Pai" />
+ <info name="programmer" value="Vinay Pai" />
+ <info name="programmer" value="Vivek Pai" />
+ <info name="programmer" value="Vijay Pai" />
<info name="usage" value="Requires a 1.25MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-04 -->
@@ -1949,7 +2460,22 @@ license:CC0-1.0
<description>Defender of the Crown</description>
<year>1988</year>
<publisher>Cinemaware</publisher>
- <info name="programmer" value="Kellyn Beeck, James Sachs, Ivan Manley, Robert Jacob, Phyllis Jacob, Pat Cook, Jim Cuomo, Tom Warner, Jeff Hilbers, Steve Quinn, Richard La Barre, John Cutter, Rob Landeros, Doug Smith, Betsy Scafati, and Wayne Brockman" />
+ <info name="programmer" value="Kellyn Beeck" />
+ <info name="programmer" value="James Sachs" />
+ <info name="programmer" value="Ivan Manley" />
+ <info name="programmer" value="Robert Jacob" />
+ <info name="programmer" value="Phyllis Jacob" />
+ <info name="programmer" value="Pat Cook" />
+ <info name="programmer" value="Jim Cuomo" />
+ <info name="programmer" value="Tom Warner" />
+ <info name="programmer" value="Jeff Hilbers" />
+ <info name="programmer" value="Steve Quinn" />
+ <info name="programmer" value="Richard La Barre" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Rob Landeros" />
+ <info name="programmer" value="Doug Smith" />
+ <info name="programmer" value="Betsy Scafati" />
+ <info name="programmer" value="Wayne Brockman" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-04 -->
@@ -1968,12 +2494,36 @@ license:CC0-1.0
</part>
</software>
+ <software name="skatedie10" cloneof="skatedie">
+ <description>Skate or Die! IIgs (version 1.0)</description>
+ <year>1988</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="David Bunch" />
+ <info name="programmer" value="Michelle Shelfer" />
+ <info name="usage" value="Requires a 512K Apple IIgs ROM 01" />
+ <info name="version" value="1.0" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- sports game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296712">
+ <rom name="skate or die iigs v1.0.woz" size="1296712" crc="4701fbdb" sha1="7d1022395ba33870a1093ae1c86d01406533a622" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="skatedie">
- <description>Skate or Die</description>
+ <description>Skate or Die! IIgs (version 1.1)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer" />
+ <info name="programmer" value="Michael Kosaka" />
+ <info name="programmer" value="Stephen Landrum" />
+ <info name="programmer" value="David Bunch" />
+ <info name="programmer" value="Michelle Shelfer" />
<info name="usage" value="Requires a 512K Apple IIgs ROM 01. Music requires 768K." />
+ <info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-01 -->
<!-- sports game -->
@@ -2027,7 +2577,13 @@ license:CC0-1.0
<description>Thexder (version 2.7)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="H. Godai, S. Uesaka, Michael D. Branham, Robert C. Clardy, John P. Conley, Lloyd Ollmann Jr., and Michael Ormsby" />
+ <info name="programmer" value="H. Godai" />
+ <info name="programmer" value="S. Uesaka" />
+ <info name="programmer" value="Michael D. Branham" />
+ <info name="programmer" value="Robert C. Clardy" />
+ <info name="programmer" value="John P. Conley" />
+ <info name="programmer" value="Lloyd Ollmann, Jr." />
+ <info name="programmer" value="Michael Ormsby" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="2.7" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2044,7 +2600,14 @@ license:CC0-1.0
<description>Tunnels of Armageddon (version 1.0)</description>
<year>1989</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Adam Skorupiński, Mirek Zabłocki, Krzysiek Koziarski, Zbych Dąbrowski, Dorota Błaszczak, Marcin Grzegorzewski, Dick Vohlers, Tomek Meuś" />
+ <info name="programmer" value="Adam Skorupiński" />
+ <info name="programmer" value="Mirek Zabłocki" />
+ <info name="programmer" value="Krzysiek Koziarski" />
+ <info name="programmer" value="Zbych Dąbrowski" />
+ <info name="programmer" value="Dorota Błaszczak" />
+ <info name="programmer" value="Marcin Grzegorzewski" />
+ <info name="programmer" value="Dick Vohlers" />
+ <info name="programmer" value="Tomek Meuś" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2061,7 +2624,10 @@ license:CC0-1.0
<description>Gin King / Cribbage King</description>
<year>1989</year>
<publisher>The Software Toolworks</publisher>
- <info name="programmer" value="Mark Manyen, Don Laabs, David M. Linnehan, and Elizabeth Scafati" />
+ <info name="programmer" value="Mark Manyen" />
+ <info name="programmer" value="Don Laabs" />
+ <info name="programmer" value="David M. Linnehan" />
+ <info name="programmer" value="Elizabeth Scafati" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-05 -->
@@ -2084,7 +2650,13 @@ license:CC0-1.0
<description>Revolution '76 (version June 27, 1989)</description>
<year>1989</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Edward Bever, Patricia Bever, Susan Barr, Sandra Lakin, David Craft, Andy Kanakares, and Ezra Sidran" />
+ <info name="programmer" value="Edward Bever" />
+ <info name="programmer" value="Patricia Bever" />
+ <info name="programmer" value="Susan Barr" />
+ <info name="programmer" value="Sandra Lakin" />
+ <info name="programmer" value="David Craft" />
+ <info name="programmer" value="Andy Kanakares" />
+ <info name="programmer" value="Ezra Sidran" />
<info name="usage" value="Requires a 1.25MB Apple IIgs ROM 01 or later." />
<info name="version" value="June 27, 1989" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2114,7 +2686,9 @@ license:CC0-1.0
<description>The Print Shop (version 1.0)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="David Balsam, Martin Kahn, Corey Kosak, Ann E. Kronen, Susan E. Schlangen, Richard Whittaker, Michelle McBride, Don Albrecht, and Leila Bronstein" />
+ <info name="author" value="David Balsam" />
+ <info name="author" value="Martin Kahn" />
+ <info name="programmer" value="Corey Kosak" />
<info name="usage" value="Requires a 512K Apple IIgs ROM 01 or earlier." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2127,15 +2701,15 @@ license:CC0-1.0
</part>
</software>
- <software name="prntshcm">
+ <software name="prshcomp">
<description>The Print Shop Companion</description>
<year>1990</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Roland Gustafsson, Leslie Wilson, Michelle Bushneff, Barbara Lawrence, and Leila Bronstein" />
+ <info name="programmer" value="Roland Gustafsson" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-07 -->
- <!-- graphics program -->
+ <!-- graphics utility -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296229">
<rom name="the print shop companion iigs.woz" size="1296229" crc="9a1893da" sha1="bb43dbf428eb45b147a9726b71ff2d38a5f48b87" />
@@ -2143,12 +2717,14 @@ license:CC0-1.0
</part>
</software>
- <software name="fantavsn">
- <description>Fantavision</description>
+ <software name="fantvisn">
+ <description>Fantavision (version 1.0)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Scott Anderson and Ken Rosen" />
+ <info name="programmer" value="Scott Anderson" />
+ <info name="programmer" value="Ken Rosen" />
<info name="usage" value="Requires a 256K Apple IIgs ROM 01 or earlier." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-07 and redumped: 2021-07-04 to correct the compatibility information. -->
<!-- graphics program -->
@@ -2163,19 +2739,21 @@ license:CC0-1.0
<description>Cartooners</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Randy McLaughlin, Al Borchers, Mike Johnston, Tony Hertzel, Thomas Hertzel, Paul Hertzel, Neal Vaughn, and Dan Klassen" />
+ <info name="programmer" value="Randy McLaughlin" />
+ <info name="programmer" value="Al Borchers" />
+ <info name="programmer" value="Mike Johnston" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-07 -->
<!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk" />
+ <feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="1296281">
<rom name="cartooners iigs - disk 1 - program.woz" size="1296281" crc="1ad490c0" sha1="8e64c731fc8f449c0c6c6b1ef39586bc8254b035" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Art disk" />
+ <feature name="part_id" value="Disk 2 - Art" />
<dataarea name="flop" size="1296277">
<rom name="cartooners iigs - disk 2 - art.woz" size="1296277" crc="9406f975" sha1="3a286df8f20643b488fa9277bd0364459ab0503f" />
</dataarea>
@@ -2183,10 +2761,16 @@ license:CC0-1.0
</software>
<software name="artfilm">
- <description>Art and Film Director</description>
+ <description>Art &amp; Film Director</description>
<year>1989</year>
<publisher>Epyx</publisher>
- <info name="programmer" value="Novotrade, Caesar Studio, Amanda Dee, Jeff Dee, Sheryl Knowles, Janet Kramer, and Matthew Sarconi" />
+ <info name="programmer" value="Novotrade" />
+ <info name="programmer" value="Caesar Studio" />
+ <info name="programmer" value="Amanda Dee" />
+ <info name="programmer" value="Jeff Dee" />
+ <info name="programmer" value="Sheryl Knowles" />
+ <info name="programmer" value="Janet Kramer" />
+ <info name="programmer" value="Matthew Sarconi" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-08 -->
@@ -2211,6 +2795,22 @@ license:CC0-1.0
</part>
</software>
+ <software name="drawplus10" cloneof="drawplus">
+ <description>Draw Plus (version 1.0)</description>
+ <year>1987</year>
+ <publisher>Activision</publisher>
+ <info name="programmer" value="H. Lamiraux" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-05 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296140">
+ <rom name="draw plus iigs v1.0.woz" size="1296140" crc="36d26290" sha1="5fd4954e0dc6e1ff69e58fe5e11129f7ea2dd7f9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="drawplus">
<description>Draw Plus (version 1.1)</description>
<year>1987</year>
@@ -2220,7 +2820,7 @@ license:CC0-1.0
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-08 -->
- <!--graphics program -->
+ <!-- graphics program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1296171">
<rom name="draw plus iigs.woz" size="1296171" crc="60ae386e" sha1="e31e826e10ead9211e4e9f28ce51398786efedec" />
@@ -2232,7 +2832,9 @@ license:CC0-1.0
<description>The Graphics Studio</description>
<year>1987</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Greg Hospelhorn, Peter Wickman, Richard Antaki" />
+ <info name="programmer" value="Greg Hospelhorn" />
+ <info name="programmer" value="Peter Wickman" />
+ <info name="programmer" value="Richard Antaki" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-08 -->
@@ -2248,19 +2850,22 @@ license:CC0-1.0
<description>The Immortal</description>
<year>1990</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey, Ian Gooding, Michael Marcanted, Brett G. Durrett, and Douglas Fulton" />
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Ian Gooding" />
+ <info name="programmer" value="Michael Marcanted" />
+ <info name="programmer" value="Brett G. Durrett" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-05 -->
<!-- roleplaying game -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Play disk" />
+ <feature name="part_id" value="Disk 1 - Play" />
<dataarea name="flop" size="1296229">
<rom name="the immortal iigs - disk 1 - play.woz" size="1296229" crc="b804341e" sha1="72322fd7d8e5d3904bd89796725fb106d3cca5a5" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Graphics disk" />
+ <feature name="part_id" value="Disk 2 - Graphics" />
<dataarea name="flop" size="1296226">
<rom name="the immortal iigs - disk 2 - graphics.woz" size="1296226" crc="bf428297" sha1="cdf5ea12029204a4a8dfed975d2c917406e3a7d5" />
</dataarea>
@@ -2271,7 +2876,10 @@ license:CC0-1.0
<description>TrianGo</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Staszek Bartkowski, Marcin Szostakowski, Maciej Markuszewski, Dorota Błaszczak" />
+ <info name="programmer" value="Staszek Bartkowski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-05 -->
@@ -2284,12 +2892,15 @@ license:CC0-1.0
</software>
<software name="816paint">
- <description>816/Paint (version 3.1)</description>
+ <description>816/Paint (version 3.1 #24721)</description>
<year>1987</year>
<publisher>Baudville</publisher>
- <info name="programmer" value="Michael Darooge, Robert Barris, and Gregory C. Miller" />
+ <info name="partno" value="24721" />
+ <info name="programmer" value="Michael Darooge" />
+ <info name="programmer" value="Robert Barris" />
+ <info name="programmer" value="Gregory C. Miller" />
<info name="usage" value="Requires a 512K Apple IIgs." />
- <info name="version" value="3.1" />
+ <info name="version" value="3.1 #24721" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-08 -->
<!-- graphics program -->
@@ -2304,7 +2915,8 @@ license:CC0-1.0
<description>BeagleDraw (version 1.3)</description>
<year>1987</year>
<publisher>Beagle Bros.</publisher>
- <info name="programmer" value="Robert Hearn and Jeff Erickson" />
+ <info name="programmer" value="Robert Hearn" />
+ <info name="programmer" value="Jeff Erickson" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<info name="version" value="1.3" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2321,7 +2933,10 @@ license:CC0-1.0
<description>DreamGrafix (version 1.06)</description>
<year>1992</year>
<publisher>DreamWorld Software</publisher>
- <info name="programmer" value="Jason Anderson, Steve Chiang, Shawn Martin, and Yong Su Kim" />
+ <info name="programmer" value="Jason Anderson" />
+ <info name="programmer" value="Steve Chiang" />
+ <info name="programmer" value="Shawn Martin" />
+ <info name="programmer" value="Yong Su Kim" />
<info name="usage" value="Requires a 1.25MB Apple IIgs." />
<info name="version" value="1.06" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2362,7 +2977,11 @@ license:CC0-1.0
<description>Paintworks Plus (version 1.2)</description>
<year>1986</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Henri Lamiraux, B. Gallet, L. Barthelet, R. Danais, and S. Cavril" />
+ <info name="programmer" value="Henri Lamiraux" />
+ <info name="programmer" value="B. Gallet" />
+ <info name="programmer" value="L. Barthelet" />
+ <info name="programmer" value="R. Danais" />
+ <info name="programmer" value="S. Cavril" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2379,7 +2998,10 @@ license:CC0-1.0
<description>Paintworks Gold (version 1.5)</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Luc Barthelet, Henri Lamiraux, Paul Zuzelo, and Sydney Williams" />
+ <info name="programmer" value="Luc Barthelet" />
+ <info name="programmer" value="Henri Lamiraux" />
+ <info name="programmer" value="Paul Zuzelo" />
+ <info name="programmer" value="Sydney Williams" />
<info name="usage" value="Requires a 1.25MB Apple IIgs." />
<info name="version" value="1.5" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2420,7 +3042,10 @@ license:CC0-1.0
<description>Graphics Supermarket (version 1.1)</description>
<year>1987</year>
<publisher>Abracadata</publisher>
- <info name="programmer" value="Rodger Smith, Joe Hebling, Mary Carol Smith, and Connie Holvey" />
+ <info name="programmer" value="Rodger Smith" />
+ <info name="programmer" value="Joe Hebling" />
+ <info name="programmer" value="Mary Carol Smith" />
+ <info name="programmer" value="Connie Holvey" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2437,7 +3062,8 @@ license:CC0-1.0
<description>GraphicWriter III (version 1.0)</description>
<year>1990</year>
<publisher>Seven Hills Software</publisher>
- <info name="programmer" value="Gary Crandall and Richard Bennett" />
+ <info name="programmer" value="Gary Crandall" />
+ <info name="programmer" value="Richard Bennett" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2467,7 +3093,8 @@ license:CC0-1.0
<description>DeluxePaint II (version 2.01)</description>
<year>1987</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Daniel Silva, Brent Iverson, David Grady, Greg Riker, Shelley Day, Jeff Johnnigman, Happy Keller, Nicholas Lavroff, Carolyn McFarlane, Richard Antaki, Paul Reiche III, Stu Roberson, Avril Harrison, Judy Campbell, and Frank Wing" />
+ <info name="author" value="Daniel Silva" />
+ <info name="programmer" value="Brent Iverson" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<info name="version" value="2.01" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2558,18 +3185,59 @@ license:CC0-1.0
</part>
</software>
- <software name="sbshapes">
- <description>Stickybear Shapes IIgs</description>
+ <software name="ntsbalpha">
+ <description>The New Talking Stickybear Alphabet</description>
+ <year>1988</year>
+ <publisher>Optimum Resource</publisher>
+ <info name="developer" value="Optimum Resource" />
+ <info name="usage" value="Requires a ROM1 or ROM3 Apple IIgs with 512K RAM." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1286474">
+ <rom name="the new talking stickybear alphabet iigs disk 1.woz" size="1286474" crc="d402a368" sha1="71dd47483c3dec822bec78e1314a826a3467b1c6" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296202">
+ <rom name="the new talking stickybear alphabet iigs disk 2.woz" size="1296202" crc="5f1a97f8" sha1="ed7b926e46c4f8e1a92cf74ae7683897653f5f81" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ntsbopp">
+ <description>The New Talking Stickybear Opposites</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
- <info name="programmer" value="Richard Hefter, David Cunningham, and Susan Dubicki" />
+ <info name="developer" value="Optimum Resource" />
+ <info name="usage" value="Requires a ROM1 or ROM3 Apple IIgs with 512K RAM." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-05 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296165">
+ <rom name="the new talking stickybear opposites iigs.woz" size="1296165" crc="1cd4c868" sha1="cfd9105a3e06d7062e4339ec8c052bd7c144ef2c" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ntsbshapes">
+ <description>The New Talking Stickybear Shapes</description>
+ <year>1988</year>
+ <publisher>Optimum Resource</publisher>
+ <info name="programmer" value="Richard Hefter" />
+ <info name="programmer" value="David Cunningham" />
+ <info name="programmer" value="Susan Dubicki" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
- <!-- Dump released: 2021-06-16 -->
+ <!-- Dump released: 2021-06-16. Updated 2024-12-27 to update software description. -->
<!-- educational program -->
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="1286466">
- <rom name="stickybear shapes iigs.woz" size="1286466" crc="1d44fbc7" sha1="8b1c33ed774c590557bc2eff7f5758819b33092c" />
+ <dataarea name="flop" size="1286482">
+ <rom name="the new talking stickybear shapes iigs.woz" size="1286482" crc="f4735894" sha1="d581afae032dd0ea847d25eedfc90d5adba65d45" />
</dataarea>
</part>
</software>
@@ -2578,7 +3246,8 @@ license:CC0-1.0
<description>Tarot</description>
<year>1990</year>
<publisher>Toolbox</publisher>
- <info name="programmer" value="François Uhrich and Jean-François Sauvage" />
+ <info name="programmer" value="François Uhrich" />
+ <info name="programmer" value="Jean-François Sauvage" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-16 -->
@@ -2594,7 +3263,11 @@ license:CC0-1.0
<description>Full Metal Planete (version 1.0)</description>
<year>1990</year>
<publisher>Infogrames</publisher>
- <info name="programmer" value="François Uhrich, Nicolas Bergeret, Louis van Proosdij Duport, Etienne Petitjean, and Pascal Wassong" />
+ <info name="programmer" value="François Uhrich" />
+ <info name="programmer" value="Nicolas Bergeret" />
+ <info name="programmer" value="Louis van Proosdij Duport" />
+ <info name="programmer" value="Etienne Petitjean" />
+ <info name="programmer" value="Pascal Wassong" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2611,7 +3284,10 @@ license:CC0-1.0
<description>Shanghai II: Dragon's Eye</description>
<year>1993</year>
<publisher>Big Red Computer Club</publisher>
- <info name="programmer" value="Brodie Lockard, Don Harlow, John Wrenholt, and Steve Luellman" />
+ <info name="programmer" value="Brodie Lockard" />
+ <info name="programmer" value="Don Harlow" />
+ <info name="programmer" value="John Wrenholt" />
+ <info name="programmer" value="Steve Luellman" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-16 -->
@@ -2630,11 +3306,29 @@ license:CC0-1.0
</part>
</software>
- <software name="musicons">
+ <software name="mcsdd">
+ <description>Music Construction Set Dealer Demo</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
+ <info name="usage" value="Requires a 256K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2025-10-31 -->
+ <!-- self-running demo -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296175">
+ <rom name="music construction set dealer demo disk iigs.woz" size="1296175" crc="e5702119" sha1="16d0d7ad1030a2e87f37a41c0acde506a7243c6f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcs">
<description>Music Construction Set (version 1.0)</description>
<year>1986</year>
<publisher>Electronic Arts</publisher>
- <info name="programmer" value="Will Harvey, Jim Nitchals, and Doug Fulton" />
+ <info name="programmer" value="Will Harvey" />
+ <info name="programmer" value="Jim Nitchals" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2648,23 +3342,23 @@ license:CC0-1.0
</software>
<software name="instsynt">
- <description>Instant Synthesizer (version 1.0)</description>
+ <description>Instant Synthesizer (version 1.00)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
<info name="programmer" value="Larry Reed" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
- <info name="version" value="1.0" />
+ <info name="version" value="1.00" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-14 -->
<!-- audio program -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - Program disk" />
+ <feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="1296230">
<rom name="instant synthesizer iigs - disk 1 - program.woz" size="1296230" crc="d4e982f6" sha1="25eecac855d0784ba5df1125cecde22977d1474c" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Data disk" />
+ <feature name="part_id" value="Disk 2 - Data" />
<dataarea name="flop" size="1296227">
<rom name="instant synthesizer iigs - disk 2 - data.woz" size="1296227" crc="b3f3db36" sha1="278993013a1eb963e06f78af6d5f58d48cd86fc1" />
</dataarea>
@@ -2675,7 +3369,9 @@ license:CC0-1.0
<description>Master Tracks Pro (version 1.04)</description>
<year>1989</year>
<publisher>Passport Designs</publisher>
- <info name="programmer" value="Dave Kusek, Don Williams, and Dave Howell" />
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="Don Williams" />
+ <info name="programmer" value="Dave Howell" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.04" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2692,7 +3388,18 @@ license:CC0-1.0
<description>The Music Studio (version 2.0)</description>
<year>1988</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Ric Forrester, Rick Parfitt, Peter Wickman, Paul Zuzelo, Sally Froud, Jeff Cable, Carl Bacani, Jim Inscore, Sydney Williams Lewis, Nancy Waisanen, Steve Young, and Laura E. Singer" />
+ <info name="programmer" value="Ric Forrester" />
+ <info name="programmer" value="Rick Parfitt" />
+ <info name="programmer" value="Peter Wickman" />
+ <info name="programmer" value="Paul Zuzelo" />
+ <info name="programmer" value="Sally Froud" />
+ <info name="programmer" value="Jeff Cable" />
+ <info name="programmer" value="Carl Bacani" />
+ <info name="programmer" value="Jim Inscore" />
+ <info name="programmer" value="Sydney Williams Lewis" />
+ <info name="programmer" value="Nancy Waisanen" />
+ <info name="programmer" value="Steve Young" />
+ <info name="programmer" value="Laura E. Singer" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2716,7 +3423,7 @@ license:CC0-1.0
<description>Jam Session (version 1.0)</description>
<year>1989</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Steve Capps, Neil Cormia, Ty Roberts, Ed Bogas, Edward Badasov, Latricia Turner, and Avril Harrison" />
+ <info name="programmer" value="Neil Cormia" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2764,7 +3471,9 @@ license:CC0-1.0
<description>Master Tracks Jr. (version 1.03)</description>
<year>1988</year>
<publisher>Passport Designs</publisher>
- <info name="programmer" value="Dave Kusek, Don Williams, and Dave Howell" />
+ <info name="programmer" value="Dave Kusek" />
+ <info name="programmer" value="Don Williams" />
+ <info name="programmer" value="Dave Howell" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.03" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2781,7 +3490,10 @@ license:CC0-1.0
<description>Salvation Supreme (version 2.0)</description>
<year>1993</year>
<publisher>Vitesse Software</publisher>
- <info name="programmer" value="Christopher Warner, Robert Morgan, Joe Jaworski, and Jonah Stich" />
+ <info name="programmer" value="Christopher Warner" />
+ <info name="programmer" value="Robert Morgan" />
+ <info name="programmer" value="Joe Jaworski" />
+ <info name="programmer" value="Jonah Stich" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="2.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2805,7 +3517,11 @@ license:CC0-1.0
<description>NoiseTracker (version 1.00)</description>
<year>1992</year>
<publisher>FTA</publisher>
- <info name="programmer" value="Olivier Goguel, Olivier Bailly-Maitre, Pascal Watel, Lionel Picanelot, and Michael Guitton" />
+ <info name="programmer" value="Olivier Goguel" />
+ <info name="programmer" value="Olivier Bailly-Maitre" />
+ <info name="programmer" value="Pascal Watel" />
+ <info name="programmer" value="Lionel Picanelot" />
+ <info name="programmer" value="Michael Guitton" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.00" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2822,7 +3538,12 @@ license:CC0-1.0
<description>HyperStudio (version 3.1c)</description>
<year>1989</year>
<publisher>Roger Wagner Publishing</publisher>
- <info name="programmer" value="Michael O'Keefe, Dave Klimas, Eric Mueller, Roy Bannon, Ken Kashmarek, and Garrick Toubassi" />
+ <info name="programmer" value="Michael O'Keefe" />
+ <info name="programmer" value="Dave Klimas" />
+ <info name="programmer" value="Eric Mueller" />
+ <info name="programmer" value="Roy Bannon" />
+ <info name="programmer" value="Ken Kashmarek" />
+ <info name="programmer" value="Garrick Toubassi" />
<info name="usage" value="Requires a 1.5MB Apple IIgs ROM 01 or later." />
<info name="version" value="3.1c" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2876,7 +3597,10 @@ license:CC0-1.0
<description>Writer's Choice Elite</description>
<year>1987</year>
<publisher>Activision</publisher>
- <info name="programmer" value="Richard Danais, Nancy Philippine, Bernard Gallet, and Luc Barthelet" />
+ <info name="programmer" value="Richard Danais" />
+ <info name="programmer" value="Nancy Philippine" />
+ <info name="programmer" value="Bernard Gallet" />
+ <info name="programmer" value="Luc Barthelet" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-15 -->
@@ -2892,7 +3616,15 @@ license:CC0-1.0
<description>WordPerfect (version 2.1e)</description>
<year>1987</year>
<publisher>WordPerfect Corporation</publisher>
- <info name="programmer" value="Dale T. Taylor, Daniel P. Burton, Barry Watts, Todd J. Wood, Scott B. Mitchell, Brent D. Hauvel, David Woodbury, Douglas L. Davies, and Kyle W. Erickson" />
+ <info name="programmer" value="Dale T. Taylor" />
+ <info name="programmer" value="Daniel P. Burton" />
+ <info name="programmer" value="Barry Watts" />
+ <info name="programmer" value="Todd J. Wood" />
+ <info name="programmer" value="Scott B. Mitchell" />
+ <info name="programmer" value="Brent D. Hauvel" />
+ <info name="programmer" value="David Woodbury" />
+ <info name="programmer" value="Douglas L. Davies" />
+ <info name="programmer" value="Kyle W. Erickson" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<info name="version" value="2.1e" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -2922,7 +3654,9 @@ license:CC0-1.0
<description>The Wonders of the Animal Kingdom</description>
<year>1989</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stan Brewster, Joseph Hewitt, and June Stark" />
+ <info name="programmer" value="Stan Brewster" />
+ <info name="programmer" value="Joseph Hewitt" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-15 -->
@@ -2945,7 +3679,8 @@ license:CC0-1.0
<description>The Word Master</description>
<year>1989</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas and Joseph Hewitt" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="Joseph Hewitt" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-15 -->
@@ -2984,7 +3719,9 @@ license:CC0-1.0
<description>Aesop's Fables</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas, Joseph Hewitt IV, and June Stark" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="Joseph Hewitt IV" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-15 -->
@@ -3007,7 +3744,22 @@ license:CC0-1.0
<description>Audubon Wildlife Adventures: Grizzly Bears</description>
<year>1988</year>
<publisher>Advanced Ideas</publisher>
- <info name="programmer" value="Deborah Kovacs, Pat Relf, Drew Ruscil, Dennis Sullivan, Doreen Curtin, Andy Henriquez, Christopher Palmer, Gerri Brioso, Cynthia Vansant, Richard Frietas, Paul Frietas, Roger DiSilvestro, Richard Chevat, Sandy Damashek, Susan Greer, and Jeffrey Siegel" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Drew Ruscil" />
+ <info name="programmer" value="Dennis Sullivan" />
+ <info name="programmer" value="Doreen Curtin" />
+ <info name="programmer" value="Andy Henriquez" />
+ <info name="programmer" value="Christopher Palmer" />
+ <info name="programmer" value="Gerri Brioso" />
+ <info name="programmer" value="Cynthia Vansant" />
+ <info name="programmer" value="Richard Frietas" />
+ <info name="programmer" value="Paul Frietas" />
+ <info name="programmer" value="Roger DiSilvestro" />
+ <info name="programmer" value="Richard Chevat" />
+ <info name="programmer" value="Sandy Damashek" />
+ <info name="programmer" value="Susan Greer" />
+ <info name="programmer" value="Jeffrey Siegel" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-15 -->
@@ -3030,7 +3782,19 @@ license:CC0-1.0
<description>Audubon Wildlife Adventures: Whales</description>
<year>1989</year>
<publisher>Advanced Ideas</publisher>
- <info name="programmer" value="Deborah Kovacs, Pat Relf, Drew Ruscil, Dennis Sullivan, Doreen Curtin, Donna Curtin, Jennifer Crouser, Candace Maher, Carol Felice, Roger DiSilvestro, Susan Greer, Lee Berman, and Christopher Palmer" />
+ <info name="programmer" value="Deborah Kovacs" />
+ <info name="programmer" value="Pat Relf" />
+ <info name="programmer" value="Drew Ruscil" />
+ <info name="programmer" value="Dennis Sullivan" />
+ <info name="programmer" value="Doreen Curtin" />
+ <info name="programmer" value="Donna Curtin" />
+ <info name="programmer" value="Jennifer Crouser" />
+ <info name="programmer" value="Candace Maher" />
+ <info name="programmer" value="Carol Felice" />
+ <info name="programmer" value="Roger DiSilvestro" />
+ <info name="programmer" value="Susan Greer" />
+ <info name="programmer" value="Lee Berman" />
+ <info name="programmer" value="Christopher Palmer" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-15 -->
@@ -3069,7 +3833,9 @@ license:CC0-1.0
<description>ShowOff (version 1.1)</description>
<year>1987</year>
<publisher>Brøderbund Software</publisher>
- <info name="programmer" value="Serge Hervy and Jean-Claude Lévy" />
+ <info name="developer" value="Denis Friedman Productions" />
+ <info name="programmer" value="Serge Hervy" />
+ <info name="programmer" value="Jean-Claude Lévy" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.1" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3100,12 +3866,16 @@ license:CC0-1.0
<year>1987</year>
<publisher>MECC</publisher>
<info name="partno" value="A-194" />
- <info name="programmer" value="Gene Breault, Charolyn Kapplinger, Diane Portner, Steven D. Splinter, and Paul R. Wenker" />
+ <info name="programmer" value="Gene Breault" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steven D. Splinter" />
+ <info name="programmer" value="Paul R. Wenker" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.2" />
<sharedfeat name="compatibility" value="A2GS" />
- <!--Dump released: 2021-06-25-->
- <!--productivity program-->
+ <!-- Dump released: 2021-06-25 -->
+ <!-- productivity program -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1345411">
<rom name="calendar crafter iigs.woz" size="1345411" crc="6308e6ba" sha1="b127dfaaa517b49636854de03540602d7c698e1b" />
@@ -3118,7 +3888,10 @@ license:CC0-1.0
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-252" />
- <info name="programmer" value="Diane Portner, Michael Stein, Brian Walker, and Paul Wenker" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Brian Walker" />
+ <info name="programmer" value="Paul Wenker" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3142,8 +3915,11 @@ license:CC0-1.0
<description>Designer Puzzles (A-223 version 1.0)</description>
<year>1990</year>
<publisher>MECC</publisher>
- <info name="partno" value="A223" />
- <info name="programmer" value="Susan Gabrys, John J. Krenz, Diane Portner, and Steve Splinter" />
+ <info name="partno" value="A-223" />
+ <info name="programmer" value="Susan Gabrys" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Diane Portner" />
+ <info name="programmer" value="Steve Splinter" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3164,24 +3940,29 @@ license:CC0-1.0
</software>
<software name="mercury">
- <description>Mercury (version 1.0)</description>
+ <description>Mercury (A-249 version 1.0)</description>
<year>1989</year>
<publisher>MECC</publisher>
- <info name="partno" value="A249" />
- <info name="programmer" value="John J. Krenz, Brian Nesse, Michael Palmquist, Steve Splinter, Michael Stein, and Paul Wenker" />
+ <info name="partno" value="A-249" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian Nesse" />
+ <info name="programmer" value="Michael Palmquist" />
+ <info name="programmer" value="Steve Splinter" />
+ <info name="programmer" value="Michael Stein" />
+ <info name="programmer" value="Paul Wenker" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-25 -->
<!-- desktop publishing program -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk" />
+ <feature name="part_id" value="Disk 1 - System" />
<dataarea name="flop" size="1345426">
<rom name="mercury iigs - disk 1 - system.woz" size="1345426" crc="43b4de3c" sha1="454548d46d73637756546557cb6dd49f38a22cb8" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk" />
+ <feature name="part_id" value="Disk 2 - Program" />
<dataarea name="flop" size="1345427">
<rom name="mercury iigs - disk 2 - program.woz" size="1345427" crc="f89fd07d" sha1="ef7cc05c80ca00c37d79a3604a2280b85c9b9e2a" />
</dataarea>
@@ -3189,24 +3970,29 @@ license:CC0-1.0
</software>
<software name="strybkwv">
- <description>Storybook Weaver</description>
+ <description>Storybook Weaver (A-275 version 1.0)</description>
<year>1990</year>
<publisher>MECC</publisher>
- <info name="partno" value="A275" />
- <info name="programmer" value="Charolyn Kapplinger, Patricia Korn, John J. Krenz, Brian S. Nesse, Jean Sharp, and Steve Zehm" />
+ <info name="partno" value="A-275" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="John J. Krenz" />
+ <info name="programmer" value="Brian S. Nesse" />
+ <info name="programmer" value="Jean Sharp" />
+ <info name="programmer" value="Steve Zehm" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-25 -->
<!-- educational program -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk" />
+ <feature name="part_id" value="Disk 1 - System" />
<dataarea name="flop" size="1296282">
<rom name="storybook weaver iigs - disk 1 - system.woz" size="1296282" crc="aff98402" sha1="d9eb47035807a144ea3d861c8f95ef609302329e" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk" />
+ <feature name="part_id" value="Disk 2 - Program" />
<dataarea name="flop" size="1345435">
<rom name="storybook weaver iigs - disk 2 - program.woz" size="1345435" crc="ddb0fb06" sha1="2dde4e9d2fe49fe8705bbb640a7e36542166c3ce" />
</dataarea>
@@ -3214,24 +4000,27 @@ license:CC0-1.0
</software>
<software name="strywvwa">
- <description>Storybook Weaver: World of Adventure (version 1.0)</description>
+ <description>Storybook Weaver: World of Adventure (A-276 version 1.0)</description>
<year>1991</year>
<publisher>MECC</publisher>
- <info name="partno" value="A276" />
- <info name="programmer" value="Patricia Korn, Brian S. Nesse, Dee Dee Roedel &amp; Jean Sharp" />
+ <info name="partno" value="A-276" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Brian S. Nesse" />
+ <info name="programmer" value="Dee Dee Roedel " />
+ <info name="programmer" value="Jean Sharp" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-25 -->
<!-- educational program -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk" />
+ <feature name="part_id" value="Disk 1 - System" />
<dataarea name="flop" size="1345425">
<rom name="storybook weaver - world of adventure iigs - disk 1 - system.woz" size="1345425" crc="34fe37e2" sha1="041e0a42c0577f5f0373b0be4c908d5d0ad1bed1" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk" />
+ <feature name="part_id" value="Disk 2 - Program" />
<dataarea name="flop" size="1299346">
<rom name="storybook weaver - world of adventure iigs - disk 2 - program.woz" size="1299346" crc="628cf0ea" sha1="1f0f71d46a71ce8b82ee24e1e1217199ff72d5f0" />
</dataarea>
@@ -3239,24 +4028,26 @@ license:CC0-1.0
</software>
<software name="strywvmb">
- <description>Storybook Weaver: World of Make-Believe (version 1.0)</description>
+ <description>Storybook Weaver: World of Make-Believe (A-298 version 1.0)</description>
<year>1991</year>
<publisher>MECC</publisher>
- <info name="partno" value="A298" />
- <info name="programmer" value="Charolyn Kapplinger, Patricia Korn, and Jean Sharp" />
+ <info name="partno" value="A-298" />
+ <info name="programmer" value="Charolyn Kapplinger" />
+ <info name="programmer" value="Patricia Korn" />
+ <info name="programmer" value="Jean Sharp" />
<info name="usage" value="Requires a 1MB Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-06-25 -->
<!-- educational program -->
<part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1 - System disk" />
+ <feature name="part_id" value="Disk 1 - System" />
<dataarea name="flop" size="1345417">
<rom name="storybook weaver - world of make-believe iigs - disk 1 - system.woz" size="1345417" crc="0f23663b" sha1="dc41a0641411ffee8d86c4e7342c15c11acfb8d2" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2 - Program disk" />
+ <feature name="part_id" value="Disk 2 - Program" />
<dataarea name="flop" size="1345418">
<rom name="storybook weaver - world of make-believe iigs - disk 2 - program.woz" size="1345418" crc="2321b1c5" sha1="5db8b0f9141a28f1e8039908549cd5bc7e8d8872" />
</dataarea>
@@ -3271,7 +4062,7 @@ license:CC0-1.0
<info name="usage" value="Requires a 256K Apple IIgs ROM 01." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-07-02 -->
- <!-- action game -->
+ <!-- arcade game -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1305356">
<rom name="paperboy iigs.woz" size="1305356" crc="8fdf4e3c" sha1="4409b0d1168e0a693f82bf1fc7366cfe65595443" />
@@ -3283,7 +4074,8 @@ license:CC0-1.0
<description>Columns GS</description>
<year>1991</year>
<publisher>Quality Computers</publisher>
- <info name="programmer" value="Kenrick Mock and James Brookes" />
+ <info name="programmer" value="Kenrick Mock" />
+ <info name="programmer" value="James Brookes" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-07-02 -->
@@ -3299,7 +4091,8 @@ license:CC0-1.0
<description>Snoopy's Reading Machine</description>
<year>1990</year>
<publisher>American School Publishers</publisher>
- <info name="programmer" value="Susan Mahoney and associates" />
+ <info name="programmer" value="Susan Mahoney" />
+ <info name="programmer" value="associates" />
<info name="usage" value="Requires a 1 MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-07-02 -->
@@ -3315,7 +4108,8 @@ license:CC0-1.0
<description>Charlie Brown's ABC's</description>
<year>1990</year>
<publisher>American School Publishers</publisher>
- <info name="programmer" value="Susan Mahoney and associates" />
+ <info name="programmer" value="Susan Mahoney" />
+ <info name="programmer" value="associates" />
<info name="usage" value="Requires a 1 MB Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-07-04 -->
@@ -3334,11 +4128,12 @@ license:CC0-1.0
</part>
</software>
- <software name="rrbit23">
+ <software name="rrabbit">
<description>Reader Rabbit (version 2.3)</description>
<year>1987</year>
<publisher>The Learning Company</publisher>
- <info name="programmer" value="Pete Rowe and Aaron Weiss" />
+ <info name="programmer" value="Pete Rowe" />
+ <info name="programmer" value="Aaron Weiss" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<info name="version" value="2.3" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3371,7 +4166,8 @@ license:CC0-1.0
<description>Tales From The Arabian Nights IIgs</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stanley Brewster and June Stark" />
+ <info name="programmer" value="Stanley Brewster" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-07-26 -->
@@ -3394,7 +4190,8 @@ license:CC0-1.0
<description>Read-A-Rama</description>
<year>1989</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stan Brewster and Joseph Hewitt" />
+ <info name="programmer" value="Stan Brewster" />
+ <info name="programmer" value="Joseph Hewitt" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-07-26 -->
@@ -3419,11 +4216,12 @@ license:CC0-1.0
</part>
</software>
- <software name="readnme">
+ <software name="readandme">
<description>Reading and Me (version 1.0)</description>
<year>1988</year>
<publisher>Davidson &amp; Associates</publisher>
- <info name="programmer" value="Louis X. Savain and C. K. Haun" />
+ <info name="programmer" value="Louis X. Savain" />
+ <info name="programmer" value="C. K. Haun" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3443,35 +4241,14 @@ license:CC0-1.0
</part>
</software>
- <software name="kquest2">
- <description>King's Quest II: Romancing the Throne (version 2.0A)</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Roberta Williams, Jeff Stephenson, Chris Iden, Robert Heitman, Ken Williams, Sol Ackerman, Scott Murphy, Doug MacNeill, Mark Crowe, and Al Lowe" />
- <info name="usage" value="Requires a 512K Apple IIgs." />
- <info name="version" value="2.0A" />
- <sharedfeat name="compatibility" value="A2GS" />
- <!-- Dump released: 2021-09-28 -->
- <!-- adventure game -->
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="1312707">
- <rom name="king's quest ii iigs - disk 1.woz" size="1312707" crc="df46df6b" sha1="bc29f617b36e77f064f13b371db1a0ed6e8cc1de" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="1312707">
- <rom name="king's quest ii iigs - disk 2.woz" size="1312707" crc="23294f32" sha1="e0e383b140d7eafd3b94faeb12074564a8d0a24b" />
- </dataarea>
- </part>
- </software>
-
<software name="sltroyal">
<description>Solitaire Royale (version 1.0)</description>
<year>1989</year>
<publisher>Spectrum Holobyte</publisher>
- <info name="programmer" value="Jake Hoelter, Jody Sather, Ilan (The Zipper) Zipkin, and Brad Fregger" />
+ <info name="programmer" value="Jake Hoelter" />
+ <info name="programmer" value="Jody Sather" />
+ <info name="programmer" value="Ilan (The Zipper) Zipkin" />
+ <info name="programmer" value="Brad Fregger" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3484,35 +4261,17 @@ license:CC0-1.0
</part>
</software>
- <software name="kingqst">
- <description>King's Quest: Quest for the Crown</description>
- <year>1987</year>
- <publisher>Sierra On-Line</publisher>
- <info name="author" value="Roberta Williams, Al Lowe, Charles Tingley, Ken MacNeill, Chris Iden, Doug MacNeill, Greg Rowland, and Chris Iden" />
- <info name="programmer" value="Carlos Escobar" />
- <info name="usage" value="Requires a 512K Apple IIgs." />
- <sharedfeat name="compatibility" value="A2GS" />
- <!-- Dump released: 2021-10-09 -->
- <!-- adventure game -->
- <part name="flop1" interface="floppy_3_5">
- <feature name="part_id" value="Disk 1" />
- <dataarea name="flop" size="1296282">
- <rom name="king's quest iigs - disk 1.woz" size="1296282" crc="813e5b11" sha1="8e61a96821460da26d8e9c567e358ec18d15c535" />
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_3_5">
- <feature name="part_id" value="Disk 2" />
- <dataarea name="flop" size="1298330">
- <rom name="king's quest iigs - disk 2.woz" size="1298330" crc="832a3043" sha1="7fe827331b55408b478ffb45330a09de73234ebb" />
- </dataarea>
- </part>
- </software>
-
<software name="3stooges">
<description>The Three Stooges</description>
<year>1987</year>
<publisher>Cinemaware</publisher>
- <info name="programmer" value="John Cutter, Robert Jacob, Phyllis Jacob, Ed Magnin, Russell Truelove, Jim Simmons, and Patrick Cook" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Robert Jacob" />
+ <info name="programmer" value="Phyllis Jacob" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Russell Truelove" />
+ <info name="programmer" value="Jim Simmons" />
+ <info name="programmer" value="Patrick Cook" />
<info name="usage" value="Requires an Apple IIgs ROM1 or later with 1.25 MB of RAM." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-02-15 -->
@@ -3535,7 +4294,8 @@ license:CC0-1.0
<description>The Logic Master (version 1.5)</description>
<year>1990</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas and June Stark" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<info name="version" value="1.5" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3555,11 +4315,14 @@ license:CC0-1.0
</part>
</software>
- <software name="mixdupmg20a">
+ <software name="mixdupmg">
<description>Mixed-Up Mother Goose (version 2.0A)</description>
<year>1987</year>
<publisher>Sierra On-Line</publisher>
- <info name="programmer" value="Roberta Williams, Jerry Moore, David Slayback, and Amenda-Lombardo" />
+ <info name="programmer" value="Roberta Williams" />
+ <info name="programmer" value="Jerry Moore" />
+ <info name="programmer" value="David Slayback" />
+ <info name="programmer" value="Amenda-Lombardo" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<info name="version" value="2.0A" />
<sharedfeat name="compatibility" value="A2GS" />
@@ -3583,7 +4346,10 @@ license:CC0-1.0
<description>Gnarly Golf</description>
<year>1989</year>
<publisher>Britannica Software</publisher>
- <info name="programmer" value="Jim Coliz Jr., Darren Bartlett, Andy Hildebrand, and Greg Thomas" />
+ <info name="programmer" value="Jim Coliz, Jr." />
+ <info name="programmer" value="Darren Bartlett" />
+ <info name="programmer" value="Andy Hildebrand" />
+ <info name="programmer" value="Greg Thomas" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-03-16 -->
@@ -3606,7 +4372,9 @@ license:CC0-1.0
<description>4th and Inches</description>
<year>1988</year>
<publisher>Accolade</publisher>
- <info name="programmer" value="Tony Manso, Ed Bogas, Les Pardew" />
+ <info name="programmer" value="Tony Manso" />
+ <info name="programmer" value="Ed Bogas" />
+ <info name="programmer" value="Les Pardew" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-03-06 -->
@@ -3630,13 +4398,14 @@ license:CC0-1.0
<description>Dragon's Lair</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="System Requirements: Apple IIgs ROM 01/3 with 1.5 MB RAM, one 3.5 disk drive, System 5.0.4. Recommended: Apple IIgs ROM 01/3 with 4 MB RAM, accelerator card, hard drive, System 6.0.1." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-3-30 -->
<!-- action game -->
- <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair disk #1 and double click the DragonsLair icon to begin the game. -->
- <!-- To install Dragon's Lair on a hard drive, create a DragonsLair folder on your hard drive and copy the content of the 7 disks into it. To run Dragon's Lair from your hard drive, double click on the DragonsLair directory icon on your hard drive then double click on the DragonsLair Icon. -->
+ <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair disk #1 and double click the DragonsLair icon to begin the game. -->
+ <!-- To install Dragon's Lair on a hard drive, create a DragonsLair folder on your hard drive and copy the content of the 7 disks into it. To run Dragon's Lair from your hard drive, double click on the DragonsLair directory icon on your hard drive then double click on the DragonsLair Icon. -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819200">
@@ -3685,13 +4454,14 @@ license:CC0-1.0
<description>Dragon's Lair: Escape from Singe's Castle</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="System Requirements: Apple IIgs ROM 01/3 with 1.5 MB RAM, one 3.5 disk drive, System 5.0.4. Recommended: Apple IIgs ROM 01/3 with 4 MB RAM, accelerator card, hard drive, System 6.0.1." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-4-30 -->
<!-- action game -->
- <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair disk #1 and double click the DragonsLair1 icon to begin the game. -->
- <!-- To install Dragon's Lair 1 on a hard drive, create a DragonsLair1 folder on your hard drive and copy the content of the 8 disks into it. To run Dragon's Lair 1 from your hard drive, double click on the DragonsLair1 directory icon on your hard drive then double click on the DragonsLair1 Icon. -->
+ <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair disk #1 and double click the DragonsLair1 icon to begin the game. -->
+ <!-- To install Dragon's Lair 1 on a hard drive, create a DragonsLair1 folder on your hard drive and copy the content of the 8 disks into it. To run Dragon's Lair 1 from your hard drive, double click on the DragonsLair1 directory icon on your hard drive then double click on the DragonsLair1 Icon. -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819200">
@@ -3746,13 +4516,14 @@ license:CC0-1.0
<description>Dragon's Lair II: Time Warp</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="System Requirements: Apple IIgs ROM 01/3 with 1.5 MB RAM, one 3.5 disk drive, System 5.0.4. Recommended: Apple IIgs ROM 01/3 with 4 MB RAM, accelerator card, hard drive, System 6.0.1." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-5-30 -->
<!-- action game -->
- <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair 2 disk #1 and double click the DragonsLair2 icon to begin the game. -->
- <!-- To install Dragon's Lair 2 on a hard drive, create a DragonsLair2 folder on your hard drive and copy the content of the 8 disks into it. To run Dragon's Lair 2 from your hard drive, double click on the DragonsLair2 directory icon on your hard drive then double click on the DragonsLair2 Icon. -->
+ <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair 2 disk #1 and double click the DragonsLair2 icon to begin the game. -->
+ <!-- To install Dragon's Lair 2 on a hard drive, create a DragonsLair2 folder on your hard drive and copy the content of the 8 disks into it. To run Dragon's Lair 2 from your hard drive, double click on the DragonsLair2 directory icon on your hard drive then double click on the DragonsLair2 Icon. -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819200">
@@ -3807,13 +4578,14 @@ license:CC0-1.0
<description>Dragon's Lair III: Curse of Mordread</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="System Requirements: Apple IIgs ROM 01/3 with 1.4 MB RAM, one 3.5 disk drive, System 5.0.4. Recommended: Apple IIgs ROM 01/3 with 4 MB RAM, accelerator card, hard drive, System 6.0.1." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-6-30 -->
<!-- action game -->
- <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair 3 disk #1 and double click the DragonsLair3 icon to begin the game. -->
- <!-- To install Dragon's Lair 3 on a hard drive, create a DragonsLair3 folder on your hard drive and copy the content of the 11 disks into it. To run Dragon's Lair 3 from your hard drive, double click on the DragonsLair3 directory icon on your hard drive then double click on the DragonsLair3 Icon -->
+ <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Dragon's Lair 3 disk #1 and double click the DragonsLair3 icon to begin the game. -->
+ <!-- To install Dragon's Lair 3 on a hard drive, create a DragonsLair3 folder on your hard drive and copy the content of the 11 disks into it. To run Dragon's Lair 3 from your hard drive, double click on the DragonsLair3 directory icon on your hard drive then double click on the DragonsLair3 Icon -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819200">
@@ -3887,7 +4659,11 @@ license:CC0-1.0
<year>1987</year>
<publisher>Datasoft</publisher>
<info name="author" value="D.K. Marshall" />
- <info name="programmer" value="John Brooks, Thomas J. Clement, Jerry Vincent, Bonita Long-Hemsath, and Robin Kar" />
+ <info name="programmer" value="John Brooks" />
+ <info name="programmer" value="Thomas J. Clement" />
+ <info name="programmer" value="Jerry Vincent" />
+ <info name="programmer" value="Bonita Long-Hemsath" />
+ <info name="programmer" value="Robin Kar" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-07-05 -->
@@ -3903,13 +4679,14 @@ license:CC0-1.0
<description>Space Ace (Brutal Deluxe)</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="System Requirements: Apple IIgs ROM 01/3 with 1 MB RAM, one 3.5 disk drive, System 5.0.4. Recommended: Apple IIgs ROM 01/3 with 4 MB RAM, accelerator card, hard drive, System 6.0.1." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-7-30 -->
<!-- action game -->
- <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Space Ace disk #1 and double click the SpaceAce icon to begin the game. -->
- <!-- To install Space Ace on a hard drive, create a SpaceAce folder on your hard drive and copy the content of the 7 disks into it. To run Space Ace from your hard drive, double click on the SpaceAce directory icon on your hard drive then double click on the SpaceAce Icon. -->
+ <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Space Ace disk #1 and double click the SpaceAce icon to begin the game. -->
+ <!-- To install Space Ace on a hard drive, create a SpaceAce folder on your hard drive and copy the content of the 7 disks into it. To run Space Ace from your hard drive, double click on the SpaceAce directory icon on your hard drive then double click on the SpaceAce Icon. -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819200">
@@ -3958,13 +4735,14 @@ license:CC0-1.0
<description>Space Ace II: Borf's Revenge</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="System Requirements: Apple IIgs ROM 01/3 with 1 MB RAM, one 3.5 disk drive, System 5.0.4. Recommended: Apple IIgs ROM 01/3 with 4 MB RAM, accelerator card, hard drive, System 6.0.1." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-8-30 -->
<!-- action game -->
- <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Space Ace 2 disk #1 and double click the SpaceAce2 icon to begin the game. -->
- <!-- To install Space Ace 2 on a hard drive, create a SpaceAce2 folder on your hard drive and copy the content of the 8 disks into it. To run Space Ace 2 from your hard drive, double click on the SpaceAce2 directory icon on your hard drive then double click on the SpaceAce2 Icon. -->
+ <!-- After booting your Apple IIgs with a system disk, or autobooting from a hard drive, insert Space Ace 2 disk #1 and double click the SpaceAce2 icon to begin the game. -->
+ <!-- To install Space Ace 2 on a hard drive, create a SpaceAce2 folder on your hard drive and copy the content of the 8 disks into it. To run Space Ace 2 from your hard drive, double click on the SpaceAce2 directory icon on your hard drive then double click on the SpaceAce2 Icon. -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819200">
@@ -4019,10 +4797,11 @@ license:CC0-1.0
<description>LemminGS</description>
<year>1996</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<info name="usage" value="GS/OS Compatible, Hard drive installable." />
<sharedfeat name="compatibility" value="A2GS" />
- <!--Dump released: 1996 -->
+ <!-- Dump released: 1996 -->
<!-- action game -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
@@ -4047,7 +4826,7 @@ license:CC0-1.0
<software name="mthbpl11">
<description>Math Blaster Plus! (version 1.1)</description>
<year>1989</year>
- <publisher>Davidson and Associates</publisher>
+ <publisher>Davidson &amp; Associates</publisher>
<info name="author" value="Jan Davidson and Cathy Johnson" />
<info name="programmer" value="C.K. Haun" />
<info name="usage" value="Requires a 512K Apple IIgs ROM1 or later." />
@@ -4098,7 +4877,8 @@ license:CC0-1.0
<description>Canal Meurtre</description>
<year>2022</year>
<publisher>Brutal Deluxe Software</publisher>
- <info name="programmer" value="Antoine Vignau and Olivier Zardini" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="programmer" value="Olivier Zardini" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-9-30 -->
<!-- adventure game -->
@@ -4113,7 +4893,15 @@ license:CC0-1.0
<description>Sinbad and the Throne of the Falcon</description>
<year>1990</year>
<publisher>Cinemaware</publisher>
- <info name="programmer" value="Curt Toumanian, Steve Quinn, Jeff Hilbers, Rob Landeros, Russ Truelove, Bill Williams, Jim Simmons, Andrew Caldwell, Douglass Sharp" />
+ <info name="programmer" value="Curt Toumanian" />
+ <info name="programmer" value="Steve Quinn" />
+ <info name="programmer" value="Jeff Hilbers" />
+ <info name="programmer" value="Rob Landeros" />
+ <info name="programmer" value="Russ Truelove" />
+ <info name="programmer" value="Bill Williams" />
+ <info name="programmer" value="Jim Simmons" />
+ <info name="programmer" value="Andrew Caldwell" />
+ <info name="programmer" value="Douglass Sharp" />
<info name="usage" value="Requires a 768K Apple IIgs ROM1 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-11-20 -->
@@ -4136,7 +4924,9 @@ license:CC0-1.0
<description>Magical Myths</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="Stan Brewster, Joseph B. Hewitt IV, and June Stark" />
+ <info name="programmer" value="Stan Brewster" />
+ <info name="programmer" value="Joseph B. Hewitt IV" />
+ <info name="programmer" value="June Stark" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2022-11-24 -->
@@ -4159,7 +4949,20 @@ license:CC0-1.0
<description>Rocket Ranger</description>
<year>1989</year>
<publisher>Cinemaware</publisher>
- <info name="programmer" value="Ed Magnin, Russell Truelove, Patrick Cook, Jim Simmons, Matt Kazanowski, Allen McPheeters, Robert Jacob, John Cutter, Kellyn Beck, Tom McWilliams, Peter Kaminski, Jeffrey Hilbers, Bob Lindstrom, and Phyllis Jacob" />
+ <info name="programmer" value="Ed Magnin" />
+ <info name="programmer" value="Russell Truelove" />
+ <info name="programmer" value="Patrick Cook" />
+ <info name="programmer" value="Jim Simmons" />
+ <info name="programmer" value="Matt Kazanowski" />
+ <info name="programmer" value="Allen McPheeters" />
+ <info name="programmer" value="Robert Jacob" />
+ <info name="programmer" value="John Cutter" />
+ <info name="programmer" value="Kellyn Beck" />
+ <info name="programmer" value="Tom McWilliams" />
+ <info name="programmer" value="Peter Kaminski" />
+ <info name="programmer" value="Jeffrey Hilbers" />
+ <info name="programmer" value="Bob Lindstrom" />
+ <info name="programmer" value="Phyllis Jacob" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2023-05-27 -->
@@ -4182,7 +4985,10 @@ license:CC0-1.0
<description>Mancala</description>
<year>1988</year>
<publisher>California Dreams</publisher>
- <info name="programmer" value="Jarek Olszewski, Maciej Markuszewski, Marcin Szostakowski, and Dorota Błaszczak" />
+ <info name="programmer" value="Jarek Olszewski" />
+ <info name="programmer" value="Maciej Markuszewski" />
+ <info name="programmer" value="Marcin Szostakowski" />
+ <info name="programmer" value="Dorota Błaszczak" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2023-05-27 -->
@@ -4198,7 +5004,9 @@ license:CC0-1.0
<description>Math Wizard</description>
<year>1988</year>
<publisher>Unicorn Software</publisher>
- <info name="programmer" value="William Demas, June Stark, and Joseph B. Hewitt IV" />
+ <info name="programmer" value="William Demas" />
+ <info name="programmer" value="June Stark" />
+ <info name="programmer" value="Joseph B. Hewitt IV" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2023-05-27 -->
@@ -4218,11 +5026,12 @@ license:CC0-1.0
</software>
<software name="geometry">
- <description>Geometry</description>
+ <description>Geometry (version 1.0)</description>
<year>1988</year>
<publisher>Brøderbund Software</publisher>
<info name="developer" value="Sensei Software" />
<info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="1.0" />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2023-05-27 -->
<!-- educational program -->
@@ -4250,7 +5059,8 @@ license:CC0-1.0
<description>Strip Poker II</description>
<year>1986</year>
<publisher>Artworx</publisher>
- <info name="programmer" value="R. Harnish and R. Couch" />
+ <info name="programmer" value="R. Harnish" />
+ <info name="programmer" value="R. Couch" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2023-05-27 -->
@@ -4262,4 +5072,337 @@ license:CC0-1.0
</part>
</software>
+ <software name="timepilot12" cloneof="timepilot">
+ <description>Time Pilot (version 1.2)</description>
+ <year>2024</year>
+ <publisher>Stefan Wessels</publisher>
+ <info name="programmer" value="Stefan Wessels" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <info name="version" value="1.2" />
+ <!-- First Apple IIgs version. No icon or audio. -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 07-09-2024 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot_v1.2.po" size="819200" crc="dfd6b004" sha1="7094438f4c089eb3474c495344e10a93ab3240ff" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timepilot13" cloneof="timepilot">
+ <description>Time Pilot (version 1.3)</description>
+ <year>2024</year>
+ <publisher>Stefan Wessels and Brutal Deluxe Software</publisher>
+ <info name="programmer" value="Stefan Wessels" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <info name="version" value="1.3" />
+ <!-- Version 1.3 Adds sound. Audio code supplied by Brutal Deluxe Software. -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 07-09-2024 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot_v1.3.po" size="819200" crc="6b974655" sha1="1ad93f9ea15e058137c80eac6e202242171363d4" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timepilot14" cloneof="timepilot">
+ <description>Time Pilot (version 1.4)</description>
+ <year>2024</year>
+ <publisher>Stefan Wessels and Brutal Deluxe Software</publisher>
+ <info name="programmer" value="Stefan Wessels" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <info name="version" value="1.4" />
+ <!-- Fixed audio corruption and clipping issues at the top of the screen. -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 07-09-2024 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot_v1.4.po" size="819200" crc="5481abc5" sha1="e9dd9c7e881730b8692d2edaa0c36cfbd08c6a52" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timepilot15" cloneof="timepilot">
+ <description>Time Pilot (version 1.5)</description>
+ <year>2024</year>
+ <publisher>Stefan Wessels and Brutal Deluxe Software</publisher>
+ <info name="programmer" value="Stefan Wessels" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <info name="version" value="1.5" />
+ <!-- Scores are now saved and loaded, press ESC to stop a game, external RAM sounds at 22kHz, enemy explosion bug fixed, loader with splash screen. -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 07-18-2024 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot1_v1.5.po" size="819200" crc="8dde5067" sha1="8ae4f9f143c153a58a569c05eb0ad0f451a47bcf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot2_v1.5.po" size="819200" crc="8a1ae6ff" sha1="05c55a40898fcd16a987f162146fe86b670d2229" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timepilot15a" cloneof="timepilot">
+ <description>Time Pilot (version 1.5.A)</description>
+ <year>2024</year>
+ <publisher>Stefan Wessels and Brutal Deluxe Software</publisher>
+ <info name="programmer" value="Stefan Wessels" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <info name="version" value="1.5.A" />
+ <!-- Fixed bad bug in game ending with high score and skip waiting for Game Over screen. -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 07-19-2024 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot1_v1.5.a.po" size="819200" crc="9abe07ea" sha1="76c19e628861aa917ab270a07531759f89b10bdf" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot2_v1.5.a.po" size="819200" crc="34334279" sha1="d4efa41c20fe8979aeb0651e8667fd24a8566ccd" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="timepilot">
+ <description>Time Pilot (version 1.6)</description>
+ <year>2024</year>
+ <publisher>Stefan Wessels and Brutal Deluxe Software</publisher>
+ <info name="programmer" value="Stefan Wessels" />
+ <info name="programmer" value="Antoine Vignau" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <info name="version" value="1.6" />
+ <!-- Code optimizations, splash screen has credits, and softer bomb sound. -->
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 08-15-2024 -->
+ <!-- arcade game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot_gs1_v1.6.po" size="819200" crc="b4c4e971" sha1="d9a8f0766eeb102e0a91cd6f664a4155c21c0116" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="819200">
+ <rom name="timepilot_gs2_v1.6.po" size="819200" crc="24c0c3c0" sha1="8c06eca43aef35dfa68094696ace3de05036f5e0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="panzbatl">
+ <description>Panzer Battles IIgs</description>
+ <year>1991</year>
+ <publisher>Strategic Studies Group (SSG)</publisher>
+ <info name="programmer" value="Allan Bell" />
+ <info name="programmer" value="Sue Bell" />
+ <info name="programmer" value="Steven Hart" />
+ <info name="usage" value="Requires a ROM1 or ROM3 Apple IIgs with at least 1.25MB RAM." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- strategy game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1296699">
+ <rom name="panzer battles iigs disk 1.woz" size="1296699" crc="fc09c2f4" sha1="29258ad5a4d5e1008304ba64442c373d03932dc8" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296220">
+ <rom name="panzer battles iigs disk 2.woz" size="1296220" crc="9b4ee5fd" sha1="58110b606d5e5ffadbdf79a4cb8f0f9e985d0665" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="transyl3">
+ <description>Transylvania III IIgs</description>
+ <year>1991</year>
+ <publisher>Polarware</publisher>
+ <info name="programmer" value="Antonio Antiochia" />
+ <info name="programmer" value="Veronika Slintak" />
+ <info name="usage" value="Requires an Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- adventure game -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1296158">
+ <rom name="transylvania iii iigs disk 1.woz" size="1296158" crc="21c32861" sha1="8500f9470e8e09c43d6f363b50977450a346315f" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296158">
+ <rom name="transylvania iii iigs disk 2.woz" size="1296158" crc="b0a74652" sha1="8b691c6264f30e06e35648ac2a8aa03852efeadb" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="firstcat">
+ <description>First Categories</description>
+ <year>1989</year>
+ <publisher>Laureate Learning Systems</publisher>
+ <info name="programmer" value="Bernard J. Fox, M.S." />
+ <info name="programmer" value="Mary Sweig Wilson, Ph.D." />
+ <info name="usage" value="Requires a ROM1 or ROM3 Apple IIgs with 512K RAM." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-11-13 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1345395">
+ <rom name="first categories iigs.woz" size="1345395" crc="59c1ebb0" sha1="51ca3997e840b236043f9c0d35f985a874b0d1f3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mulscribe">
+ <description>MultiScribe IIgs (version 3.01c)</description>
+ <year>1987</year>
+ <publisher>StyleWare</publisher>
+ <info name="developer" value="StyleWare" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="3,01c" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-05 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1 - Program" />
+ <dataarea name="flop" size="1502036">
+ <rom name="multiscribe gs v3.01c disk 1 - program.woz" size="1502036" crc="4906e980" sha1="6c12d15a74e0db0fd0f791074f80a00b3cd05c23" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2 - Utilities" />
+ <dataarea name="flop" size="1296143">
+ <rom name="multiscribe gs v3.01c disk 2 - utilities.woz" size="1296143" crc="683b0eb2" sha1="f16ad4e0822d59366a682090568cf9213ffb84f3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="topdraw">
+ <description>TopDraw (version 1.01A (8/4/87))</description>
+ <year>1987</year>
+ <publisher>StyleWare</publisher>
+ <info name="programmer" value="Robert A. Hearn" />
+ <info name="programmer" value="Jeff G. Erickson" />
+ <info name="release" value="19870804" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.01A (8/4/87)" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-05 -->
+ <!-- graphics program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296669">
+ <rom name="topdraw iigs v1.01a.woz" size="1296669" crc="4908357a" sha1="86f94d5a5849c17af21ab11003575005e0b1eb93" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="listplus">
+ <description>List Plus (version 1.0 (11-Dec-87))</description>
+ <year>1987</year>
+ <publisher>Activision</publisher>
+ <info name="programmer" value="Dominique Philippine" />
+ <info name="programmer" value="Nancy Philippine" />
+ <info name="programmer" value="Luc Barthelet" />
+ <info name="programmer" value="Henri Lamiraux" />
+ <info name="programmer" value="Loic Vandereyken" />
+ <info name="release" value="19871211" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <info name="version" value="1.0 (11-Dec-87)" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-03 -->
+ <!-- productivity program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296216">
+ <rom name="list plus iigs.woz" size="1296216" crc="74e1f2a3" sha1="ab151cdc94e35685bd834d6e2186d5665e5e3b8a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pmazemar">
+ <description>Peanuts Maze Marathon IIgs</description>
+ <year>1990</year>
+ <publisher>American School Publishers</publisher>
+ <info name="developer" value="Susan Mahoney &amp; Associates" />
+ <info name="original_publisher" value="Random House" />
+ <info name="usage" value="Requires a ROM1 or ROM3 Apple IIgs with at least 768K RAM." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1296163">
+ <rom name="peanuts maze marathon iigs disk 1.woz" size="1296163" crc="46e65960" sha1="a350a696545992d5969837c28b25326b3bdac11a" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1296163">
+ <rom name="peanuts maze marathon iigs disk 2.woz" size="1296163" crc="a1543361" sha1="2d6c1e37e63f6b7deafb98afd5455bee99f016c5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rmljackb">
+ <description>Reading Magic Library: Jack and the Beanstalk IIgs</description>
+ <year>1989</year>
+ <publisher>Tom Snyder Productions</publisher>
+ <info name="developer" value="Tom Snyder Productions" />
+ <info name="usage" value="Requires a 512K Apple IIgs." />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1296150">
+ <rom name="reading magic library- jack and the beanstalk iigs.woz" size="1296150" crc="99629b03" sha1="19d3bfccf7acb09638019321d69c7808bd6df49f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="uglyduck">
+ <description>The Ugly Duckling (version 1.1)</description>
+ <year>1989</year>
+ <publisher>ByteWorks</publisher>
+ <info name="programmer" value="Mary Martinez" />
+ <info name="programmer" value="Mike Westerfield" />
+ <info name="programmer" value="Peggy K. Smith" />
+ <info name="programmer" value="Patty Westerfield" />
+ <info name="usage" value="Requires a 768K Apple IIgs." />
+ <info name="version" value="1.1" />
+ <sharedfeat name="compatibility" value="A2GS" />
+ <!-- Dump released: 2024-09-02 -->
+ <!-- educational program -->
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1" />
+ <dataarea name="flop" size="1345369">
+ <rom name="the ugly duckling iigs disk 1.woz" size="1345369" crc="a4c31130" sha1="7bde59e642ad557c4b0f336e56d475b6d8f7ebdc" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2" />
+ <dataarea name="flop" size="1345369">
+ <rom name="the ugly duckling iigs disk 2.woz" size="1345369" crc="50a3a732" sha1="ede986bd8044d3863d1e51fa7db206eb43256ec3" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/apple3.xml b/hash/apple3.xml
index 9e7a9e3b3fc..425d3c9df2b 100644
--- a/hash/apple3.xml
+++ b/hash/apple3.xml
@@ -275,7 +275,7 @@ Generated by SLIST 0.2.1
</software>
<software name="sysutilo">
- <description>System Utiltiies (v1.1)</description>
+ <description>System Utilities (v1.1)</description>
<year>1982</year>
<publisher>Apple Computer, Inc.</publisher>
diff --git a/hash/aquarius_cass.xml b/hash/aquarius_cass.xml
index 0fb9a530347..07f8fce33f9 100644
--- a/hash/aquarius_cass.xml
+++ b/hash/aquarius_cass.xml
@@ -514,7 +514,7 @@ license:CC0-1.0
<description>Invaders</description>
<year>1984</year>
<publisher>Dick Smith Electronics</publisher>
- <info name="author" value="Dubois and McNamara"/>
+ <info name="author" value="Dubois &amp; McNamara"/>
<info name="serial" value="X-6110"/>
<part name="cass1" interface="aquarius_cass">
<feature name="part_id" value="INVADERS_BAS"/>
@@ -570,7 +570,7 @@ license:CC0-1.0
<description>Maths Armada</description>
<year>1984</year>
<publisher>Dick Smith Electronics</publisher>
- <info name="author" value="Dubois and McNamara"/>
+ <info name="author" value="Dubois &amp; McNamara"/>
<info name="serial" value="X-6200"/>
<part name="cass1" interface="aquarius_cass">
<feature name="part_id" value="MATHSARMADA_BAS"/>
@@ -752,7 +752,7 @@ license:CC0-1.0
<description>Read-It</description>
<year>1984</year>
<publisher>Dick Smith Electronics</publisher>
- <info name="author" value="Dubois and McNamara"/>
+ <info name="author" value="Dubois &amp; McNamara"/>
<info name="serial" value="X-6201"/>
<part name="cass1" interface="aquarius_cass">
<feature name="part_id" value="READ-IT_BAS"/>
@@ -785,7 +785,7 @@ license:CC0-1.0
<description>Space Ram</description>
<year>1984</year>
<publisher>Dick Smith Electronics</publisher>
- <info name="author" value="Dubois and McNamara"/>
+ <info name="author" value="Dubois &amp; McNamara"/>
<info name="serial" value="X-6109"/>
<part name="cass1" interface="aquarius_cass">
<feature name="part_id" value="SPACERAM_BAS"/>
@@ -817,7 +817,7 @@ license:CC0-1.0
<description>Spell-It</description>
<year>1984</year>
<publisher>Dick Smith Electronics</publisher>
- <info name="author" value="Dubois and McNamara"/>
+ <info name="author" value="Dubois &amp; McNamara"/>
<info name="serial" value="X-6202"/>
<part name="cass1" interface="aquarius_cass">
<feature name="part_id" value="SPELL-IT_BAS"/>
diff --git a/hash/arcadia.xml b/hash/arcadia.xml
index 26f1f52105b..63489387919 100644
--- a/hash/arcadia.xml
+++ b/hash/arcadia.xml
@@ -392,7 +392,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="3dsoccera" cloneof="3dsoccer">
- <description>3D Soccer (Alt)</description>
+ <description>3D Soccer (alt)</description>
<!-- Possibly the German version altered for the Schmid TVG-2000 -->
<year>1983</year>
<publisher>UA Ltd.</publisher>
@@ -771,7 +771,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
<software name="jumpbuga" cloneof="jumpbug">
<!-- Possibly the German version altered for the Schmid TVG-2000 -->
- <description>Jump Bug (Alt)</description>
+ <description>Jump Bug (alt)</description>
<year>1982</year>
<publisher>UA Ltd.</publisher>
<info name="alt_title" value="Happy Bug" />
@@ -850,7 +850,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="nibblema" cloneof="nibblem">
- <description>Nibblemen (Alt)</description>
+ <description>Nibblemen (alt)</description>
<year>1982</year>
<publisher>UA Ltd.</publisher>
<info name="alt_title" value="Devilman the Dot Muncher, Super Gobbler" />
@@ -963,7 +963,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="spacewar" cloneof="spaceatt">
- <description>Space War (Prototype)</description>
+ <description>Space War (prototype)</description>
<year>1982</year>
<publisher>UA Ltd.</publisher>
<part name="cart" interface="arcadia_cart">
@@ -975,7 +975,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="spaceatta" cloneof="spaceatt">
- <description>Space Attack (Alt)</description>
+ <description>Space Attack (alt)</description>
<year>1982</year>
<publisher>UA Ltd.</publisher>
<part name="cart" interface="arcadia_cart">
@@ -1076,7 +1076,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="superbuga" cloneof="superbug">
- <description>Super Bug (Alt)</description>
+ <description>Super Bug (alt)</description>
<year>198?</year>
<publisher>UA Ltd.</publisher>
<part name="cart" interface="arcadia_cart">
@@ -1152,7 +1152,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="vidlexeg" cloneof="vidlex">
- <description>Video-Lexikon: English to German (Fixed)</description>
+ <description>Video-Lexikon: English to German (fixed)</description>
<!-- This ROM has concatinated and re-ordered the original 3 ROM dump into one file. -->
<year>198?</year>
<publisher>UA Ltd.</publisher>
@@ -1165,7 +1165,7 @@ Rumoured or Unreleased files: - 3D Raceway, Centipede, Fun with Math, Galaga, Ho
</software>
<software name="vidlexge" cloneof="vidlex">
- <description>Video-Lexikon: German to English (Fixed)</description>
+ <description>Video-Lexikon: German to English (fixed)</description>
<!-- This ROM has concatinated and re-ordered the original 3 ROM dump into one file. -->
<year>198?</year>
<publisher>UA Ltd.</publisher>
diff --git a/hash/atom_rom.xml b/hash/atom_rom.xml
index 79763794bba..8ca6c84782d 100644
--- a/hash/atom_rom.xml
+++ b/hash/atom_rom.xml
@@ -272,7 +272,7 @@ license:CC0-1.0
</software>
<software name="pcharmea" cloneof="pcharme">
- <description>P-Charme (Alt)</description>
+ <description>P-Charme (alt)</description>
<year>1984</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="author" value="Frans van Hoesel" />
diff --git a/hash/attache.xml b/hash/attache.xml
index f5a8e92adca..54353ae0bc8 100644
--- a/hash/attache.xml
+++ b/hash/attache.xml
@@ -3,7 +3,7 @@
<!--
license:CC0-1.0
-->
-<softwarelist name="attache" description="Otrona Attache disk images">
+<softwarelist name="attache" description="Otrona Attaché disk images">
<software name="cpm">
<description>CP/M 2.2.5</description>
diff --git a/hash/bbc_cass.xml b/hash/bbc_cass.xml
index 845ea624ac9..422c0a6e040 100644
--- a/hash/bbc_cass.xml
+++ b/hash/bbc_cass.xml
@@ -275,7 +275,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="747e" cloneof="747">
- <description>747 (Early)</description>
+ <description>747 (early)</description>
<year>1983</year>
<publisher>Doctor Soft</publisher>
<sharedfeat name="compatibility" value="B,M"/>
@@ -6940,7 +6940,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="hopperg" cloneof="hopper">
- <description>Hopper (Ger)</description>
+ <description>Hopper (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="author" value="Neil Raine" />
@@ -8901,7 +8901,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="meteorsg" cloneof="meteors">
- <description>Meteors (Ger)</description>
+ <description>Meteors (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBG13" />
@@ -9067,9 +9067,9 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="mineshafa" cloneof="mineshaf">
- <description>Mineshaft (Alternative)</description>
+ <description>Mineshaft (Alternative Software)</description>
<year>1990</year>
- <publisher>Alternative</publisher>
+ <publisher>Alternative Software</publisher>
<sharedfeat name="compatibility" value="B,M"/>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11986">
@@ -9252,7 +9252,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="monsterg" cloneof="monsters">
- <description>Monsters (Ger)</description>
+ <description>Monsters (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBG03" />
@@ -10552,7 +10552,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="planetog" cloneof="plantoid">
- <description>Planetoid (Ger)</description>
+ <description>Planetoid (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBG15" />
@@ -11675,7 +11675,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="rocketrag" cloneof="rocketra">
- <description>Rocket Raid (Ger)</description>
+ <description>Rocket Raid (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBG05" />
@@ -12700,7 +12700,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="snapperg" cloneof="snapper">
- <description>Snapper (Ger)</description>
+ <description>Snapper (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBG04" />
@@ -14065,7 +14065,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="superinvg" cloneof="superinv">
- <description>Super Invaders (Ger)</description>
+ <description>Super Invaders (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="author" value="Geoffrey J Crammond" />
@@ -15909,7 +15909,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="welcomeg" cloneof="welcome">
- <description>Willkommen (Ger)</description>
+ <description>Willkommen (German)</description>
<year>1981</year>
<publisher>Acornsoft</publisher>
<sharedfeat name="compatibility" value="B,M"/>
@@ -16632,7 +16632,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="dskdiaryg" cloneof="dskdiary">
- <description>Desk Diary (Ger)</description>
+ <description>Desk Diary (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBB01" />
@@ -16991,7 +16991,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="busgamesg">
- <description>Managementspiele (Ger)</description>
+ <description>Managementspiele (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE03" />
@@ -17295,7 +17295,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="fs2_68">
- <description>Fun School 2 (For 6-8 year olds)</description>
+ <description>Fun School 2 - For 6-8 year olds</description>
<year>1989</year>
<publisher>Database Educational Software</publisher>
<sharedfeat name="compatibility" value="B,M,ELK"/>
@@ -17307,7 +17307,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="fs2_ov8">
- <description>Fun School 2 (For the Over-8s)</description>
+ <description>Fun School 2 - For the Over-8s</description>
<year>1989</year>
<publisher>Database Educational Software</publisher>
<sharedfeat name="compatibility" value="B,M,ELK"/>
@@ -17319,7 +17319,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="fs2_un6">
- <description>Fun School 2 (For Under 6s)</description>
+ <description>Fun School 2 - For the Under-6s</description>
<year>1989</year>
<publisher>Database Educational Software</publisher>
<sharedfeat name="compatibility" value="B,M,ELK"/>
@@ -17379,7 +17379,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="jars">
- <description>Kruege (Ger)</description>
+ <description>Kruege (German)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE15" />
@@ -17539,7 +17539,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="missignsg" cloneof="missigns">
- <description>Fehlende Zeichen (Ger)</description>
+ <description>Fehlende Zeichen (German)</description>
<year>1983</year>
<publisher>Acornsoft/ESM</publisher>
<info name="release" value="GBE09" />
@@ -17609,7 +17609,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="numberbag" cloneof="numberba">
- <description>Zahlenwaage (Ger)</description>
+ <description>Zahlenwaage (German)</description>
<year>1982</year>
<publisher>Acornsoft/ESM</publisher>
<info name="release" value="GBE08" />
@@ -17647,7 +17647,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="peekocg" cloneof="peekoc">
- <description>Peeko-Computer (Ger)</description>
+ <description>Peeko-Computer (German)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE02" />
@@ -17747,7 +17747,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="sentseqg" cloneof="sentseq">
- <description>Satzsalat (Ger)</description>
+ <description>Satzsalat (German)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE07" />
@@ -17900,7 +17900,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="treeknowg" cloneof="treeknow">
- <description>Baum der Weisheit (Ger)</description>
+ <description>Baum der Weisheit (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE04" />
@@ -17987,7 +17987,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="wordhuntg">
- <description>Wort-Schatzsuche (Ger)</description>
+ <description>Wort-Schatzsuche (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE05" />
@@ -18013,7 +18013,7 @@ This list was compiled from the archive at http://www.stairwaytohell.com/.
</software>
<software name="wordseqg" cloneof="wordseq">
- <description>Wortsalat (Ger)</description>
+ <description>Wortsalat (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE06" />
diff --git a/hash/bbc_flop_32016.xml b/hash/bbc_flop_32016.xml
index 306a40cf054..7a55d6c3d0f 100644
--- a/hash/bbc_flop_32016.xml
+++ b/hash/bbc_flop_32016.xml
@@ -67,44 +67,44 @@ Acorn BBC Micro - 32016 Co-Processor Discs
<info name="usage" value="Requires 32016 co-processor" />
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="PanOS Startup and Utilities"/>
- <dataarea name="flop" size="384768">
- <rom name="panos14-1.ssd" size="384768" crc="eed42267" sha1="55a8a650ad214e2c623f6c0a2639acc96cd264cf"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-1.dsd" size="409600" crc="6ea1d4de" sha1="c6f01528a6ddceb21dee07a900a41ccd35165dd9"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_5_25">
<feature name="part_id" value="PanOS System"/>
- <dataarea name="flop" size="205060">
- <rom name="panos14-2.ssd" size="205060" crc="5f0b7639" sha1="4bd9e7ee5db79f4c0f3608b7d2b9b5437aae356d"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-2.dsd" size="409600" crc="d12204e2" sha1="ed8ead9a55b92bda488837c0208470b5b5ac961e"/>
</dataarea>
</part>
<part name="flop3" interface="floppy_5_25">
<feature name="part_id" value="FORTRAN 77 (PanOS)"/>
- <dataarea name="flop" size="290304">
- <rom name="panos14-3.ssd" size="290304" crc="5b28d9e4" sha1="e8503acb278259483bcb82697c3a8006be09ce42"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-3.dsd" size="409600" crc="9c08a9e0" sha1="deaefdae0f028c0ae1808a710c6248ab66d07f75"/>
</dataarea>
</part>
<part name="flop4" interface="floppy_5_25">
<feature name="part_id" value="ISO PASCAL (PanOS)"/>
- <dataarea name="flop" size="378624">
- <rom name="panos14-4.ssd" size="378624" crc="62fc2639" sha1="f2ceeccb021f4c5030150244fb47897cc7e63f80"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-4.dsd" size="409600" crc="49490b9a" sha1="e02092c5bab1277d106102ad1c7711c69d14b937"/>
</dataarea>
</part>
<part name="flop5" interface="floppy_5_25">
<feature name="part_id" value="C (PanOS)"/>
- <dataarea name="flop" size="378624">
- <rom name="panos14-5.ssd" size="378624" crc="2f0940f6" sha1="873942b6033fd234db791b34d4df76a866f366b7"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-5.dsd" size="409600" crc="5210c48a" sha1="6b09a94cd15b728147d631a786e84be920e2e6a8"/>
</dataarea>
</part>
<part name="flop6" interface="floppy_5_25">
<feature name="part_id" value="Cambridge LISP (PanOS)"/>
- <dataarea name="flop" size="409088">
- <rom name="panos14-6.ssd" size="409088" crc="5337964d" sha1="bfecd5cada401d6dfeb410ebc17fb62333f19bbc"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-6.dsd" size="409600" crc="cdca5cb5" sha1="aba9e40f062da9a4e17f23d3671c7fdb0a998d6f"/>
</dataarea>
</part>
<part name="flop7" interface="floppy_5_25">
<feature name="part_id" value="Welcome Programs"/>
- <dataarea name="flop" size="402176">
- <rom name="panos14-7.ssd" size="402176" crc="2e5e4fe4" sha1="f69687efea606468a72ed1363f6eab0ce8203f6b"/>
+ <dataarea name="flop" size="409600">
+ <rom name="panos14-7.dsd" size="409600" crc="ab2437b1" sha1="4c227425804a79c23ed534680d3b3977ef2b8eeb"/>
</dataarea>
</part>
</software>
diff --git a/hash/bbc_flop_arm.xml b/hash/bbc_flop_arm.xml
index ca71565ac80..2a2e9e654f9 100644
--- a/hash/bbc_flop_arm.xml
+++ b/hash/bbc_flop_arm.xml
@@ -12,12 +12,15 @@ Acorn BBC Micro - ARM Co-Processor discs
<softwarelist name="bbc_flop_arm" description="Acorn ARM Co-Processor discs">
+ <!-- ARM Evaluation System -->
+
<software name="armevals">
<description>ARM Evaluation System Discs</description>
<year>1986</year>
<publisher>Acorn Computers</publisher>
<info name="format" value="ADFS" />
<info name="usage" value="Requires ARM co-processor" />
+ <sharedfeat name="compatibility" value="ARM"/>
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="Disc 1: TWIN and ASSEMBLER"/>
<dataarea name="flop" size="655360">
@@ -56,4 +59,229 @@ Acorn BBC Micro - ARM Co-Processor discs
</part>
</software>
+ <software name="armc">
+ <description>ARM C Compiler</description>
+ <year>1986</year>
+ <publisher>Acorn Computers</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires ARM co-processor"/>
+ <sharedfeat name="compatibility" value="ARM"/>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="ARM C Compiler"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_C_Compiler.adl" size="655360" crc="10b30ee9" sha1="1a94241f7fbdc69c0c8031fb8a36bbb2641b9e2e"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Kit for making ARM C language extension libraries"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_C_ExtLib.adl" size="655360" crc="ef185f8b" sha1="bfb699b07d6cc1125afe62936045e404787b6648"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bcpl">
+ <description>ARM BCPL</description>
+ <year>1986</year>
+ <publisher>Acorn Computers</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires ARM co-processor"/>
+ <sharedfeat name="compatibility" value="ARM"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_BCPL.adl" size="655360" crc="e4c76291" sha1="9a915ed7173770b80d6c272eb25badbce4341d76"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="modula2">
+ <description>ARM Modula-2</description>
+ <year>1986</year>
+ <publisher>Acorn Computers</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires ARM co-processor"/>
+ <sharedfeat name="compatibility" value="ARM"/>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 1: m2c, m2l v420"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_Disc1.adl" size="655360" crc="56adc44a" sha1="ac6becac0f0cfff3f7753f68f7beef2485017cfe"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 2: m2db, m2db-split v420 B-release"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_Disc2.adl" size="655360" crc="5309d78e" sha1="fd0bc837d75e288696f0db78bd17e1ccd0b0bd93"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 3: appm2db v420, appm2db v430"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_Disc3.adl" size="655360" crc="3b953872" sha1="b80530604d396fd3131da4eb3516e1879be65db5"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 4: m2db, m2db-split, appm2db v430"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_Disc4.adl" size="655360" crc="63b76822" sha1="38cdc89da30ac4824c7456fd91e45a1e9f96baa9"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 5: m2db, m2db-split v430 A-test"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_Disc5.adl" size="655360" crc="b3e7e3ca" sha1="711e21f5457a886299ef960d57538cdb2c0fffca"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 6: m2c v215, m2l v186A, rm v103"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_Disc6.adl" size="655360" crc="0de91f8e" sha1="46b9c64795e0605f742f2f17985f86640abdf441"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="32K versions of compactcf, libfile, m2dep, m2make, mergecf, objlib, parallel"/>
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Modula-2_32k.adl" size="655360" crc="b498659c" sha1="fb1dd24d2d5e20e6e5ad158e3416d18a1719d405"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ncroftc">
+ <description>ARM Norcroft C Compiler v0.15</description>
+ <year>1986</year>
+ <publisher>Acorn Computers</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires ARM co-processor"/>
+ <sharedfeat name="compatibility" value="ARM"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="655360">
+ <rom name="ARM_Norcroft_C_v0.15.adl" size="655360" crc="68c2e8c3" sha1="6234bd798ed127bce6afdd1d7caa572fd67859fb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- A500 2nd processor -->
+
+ <software name="arthurc" supported="no">
+ <description>Arthur C Compiler</description>
+ <year>1987</year>
+ <publisher>Acorn Computers</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires A500 2nd processor"/>
+ <sharedfeat name="compatibility" value="A500"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="655360">
+ <rom name="Arthur_C.adl" size="655360" crc="cf571a6b" sha1="77b321b2ca2a984a25db409af61f8e9133d6b650"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arthurr3" supported="no">
+ <description>Arthur Release 3</description>
+ <year>1987</year>
+ <publisher>Acorn Computers</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires A500 2nd processor"/>
+ <sharedfeat name="compatibility" value="A500"/>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="655360">
+ <rom name="Arthur_Rel3_Disc1.adl" size="655360" crc="a2a3f4ed" sha1="3459f8b0232dde367381d963d39a5f4f5de1ca80"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="655360">
+ <rom name="Arthur_Rel3_Disc2.adl" size="655360" crc="8ac315b2" sha1="584f48724c77fa237df66040a2efada80d79ac59"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="655360">
+ <rom name="Arthur_Rel3_Disc3.adl" size="655360" crc="c55af2ea" sha1="4cc946b9ddbcaa71175fd51d4caf2d7bb8d608ac"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Supplement 1"/>
+ <dataarea name="flop" size="655360">
+ <rom name="Arthur_Rel3_Supp1.adl" size="655360" crc="a1a8c2e0" sha1="621a763f38d5e52a8cb6a17e3ab6233f7438d11d"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Supplement 1a WIMP/Font"/>
+ <dataarea name="flop" size="655360">
+ <rom name="Arthur_Rel3_Supp1a.adl" size="655360" crc="2800de6f" sha1="cc74188e1fbb37d02ff11f71b0c84d5a6b00bf10"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- ARM7TDMI 2nd processor -->
+
+ <software name="beeb35">
+ <description>Beeb@35 Demo</description>
+ <year>2017</year>
+ <publisher>Greg Cook</publisher>
+ <info name="format" value="DFS"/>
+ <info name="usage" value="Requires ARM7TDMI co-processor"/>
+ <sharedfeat name="compatibility" value="ARM7"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="6656">
+ <rom name="Beeb35.ssd" size="6656" crc="9ba48456" sha1="be41cd9aa38b6c16b779bf6134c912e9bdcafc7b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elitetnk">
+ <description>Elite - The New Kind</description>
+ <year>2021</year>
+ <publisher>DudleySoft</publisher>
+ <info name="format" value="ADFS"/>
+ <info name="usage" value="Requires ARM7TDMI co-processor"/>
+ <sharedfeat name="compatibility" value="ARM7"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="655360">
+ <rom name="Elite-TNK.adl" size="655360" crc="8413fdbe" sha1="33a54aa8df0e349c18cea8298a9e7485afcc3a38"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rickd">
+ <description>Rick Dangerous (MODE1)</description>
+ <year>2021</year>
+ <publisher>DudleySoft</publisher>
+ <info name="usage" value="Requires ARM7TDMI co-processor"/>
+ <sharedfeat name="compatibility" value="ARM7"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="204800">
+ <rom name="Rick_Dangerous_Mode1.ssd" size="204800" crc="3a9d9500" sha1="474495477eba00ad7b65ebedb8cd9b0b88adce40"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rickd2" cloneof="rickd">
+ <description>Rick Dangerous (MODE2)</description>
+ <year>2021</year>
+ <publisher>DudleySoft</publisher>
+ <info name="usage" value="Requires ARM7TDMI co-processor"/>
+ <sharedfeat name="compatibility" value="ARM7"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="327680">
+ <rom name="Rick_Dangerous_Mode2.adf" size="327680" crc="dd422c3b" sha1="2692aa6f869d4574f32ffc33622f905e4cd64d19"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tge">
+ <description>The Great Escape</description>
+ <year>2021</year>
+ <publisher>DudleySoft</publisher>
+ <info name="format" value="DFS"/>
+ <info name="usage" value="Requires ARM7TDMI co-processor"/>
+ <sharedfeat name="compatibility" value="ARM7"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="204800">
+ <rom name="The_Great_Escape.ssd" size="204800" crc="8840c061" sha1="e1e1c62a6beb463021cb84f3faf170cae8fb3f44"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/bbc_rom.xml b/hash/bbc_rom.xml
index a2d8a925fd3..5f1d71659ca 100644
--- a/hash/bbc_rom.xml
+++ b/hash/bbc_rom.xml
@@ -42,6 +42,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="6502basic">
+ <description>6502 2nd Processor BASIC Selector</description>
+ <year>1986</year>
+ <publisher>Gordon Horsington</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="ram" />
+ <dataarea name="rom" size="16384">
+ <rom name="6502_2ndProcessorBASICSelector.rom" size="999" crc="aa16cca4" sha1="48cdc6079e685aadceca8347b7edc478a79eff2c"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="65c02asm">
<description>65C02 Assembler 1.60</description>
<year>1987</year>
@@ -320,6 +332,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="adi100a" cloneof="adi">
+ <description>Advanced Disc Investigator 1.00 S/N:43720</description>
+ <year>1986</year>
+ <publisher>Advanced Computer Products</publisher>
+ <part name="rom" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="AdvancedDiscInvestigator-1.00a.rom" size="16384" crc="df8b35a0" sha1="a2d1e5a998b49d925cd2dccb049fd022f10b69d6"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="adi110" cloneof="adi">
<description>Advanced Disc Investigator 1.10 S/N:43543</description>
<year>1986</year>
@@ -457,8 +480,19 @@ license:CC0-1.0
<year>1986</year>
<publisher>Advanced Computer Products</publisher>
<part name="rom" interface="bbc_rom">
- <dataarea name="rom" size="16383">
- <rom name="AdvancedDiscToolkit-1.73.rom" size="16383" crc="0b66d995" sha1="70080be496732a192ef59ae716fb14748645b7f7"/>
+ <dataarea name="rom" size="16384">
+ <rom name="AdvancedDiscToolkit-1.73.rom" size="16384" crc="d3203976" sha1="610cba2f0d2d0fe2d19fdcbe053329b584adb661"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adt173c" cloneof="adt">
+ <description>Advanced Disc Toolkit 1.73 (cracked)</description>
+ <year>1986</year>
+ <publisher>Advanced Computer Products</publisher>
+ <part name="rom" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="AdvancedDiscToolkit-1.73crack.rom" size="16384" crc="7f6e0112" sha1="bb32970eab05e7a833a4fa4f1fc3d86ef1a4c08e"/>
</dataarea>
</part>
</software>
@@ -732,11 +766,13 @@ license:CC0-1.0
<year>1986</year>
<publisher>System Software</publisher>
<part name="rom1" interface="bbc_rom">
+ <feature name="part_id" value="ADE/Linker" />
<dataarea name="rom" size="16384">
<rom name="ADEplus-1.0.rom" size="16384" crc="81daa16e" sha1="2aad47b02e6c68510f725256e71913ce95bb8e53"/>
</dataarea>
</part>
<part name="rom2" interface="bbc_rom">
+ <feature name="part_id" value="65C00 assembler" />
<dataarea name="rom" size="16384">
<rom name="ADE6500-1.0.rom" size="16384" crc="946f793d" sha1="d8653a9d5dedb6651514939941a82bd8927b03cc"/>
</dataarea>
@@ -748,16 +784,19 @@ license:CC0-1.0
<year>1986</year>
<publisher>System Software</publisher>
<part name="rom1" interface="bbc_rom">
+ <feature name="part_id" value="ADE/Linker" />
<dataarea name="rom" size="16384">
<rom name="ADEplus-0.93.rom" size="16384" crc="30e16ac1" sha1="eda8a21bdb7c588a531fda80dc376f3b3f6f07e8"/>
</dataarea>
</part>
<part name="rom2" interface="bbc_rom">
+ <feature name="part_id" value="65C00 assembler" />
<dataarea name="rom" size="16384">
<rom name="ADE6500-0.93.rom" size="16384" crc="4c3e6409" sha1="65e0e31e83211fb7721408b66d98222e5b2e4bf1"/>
</dataarea>
</part>
<part name="rom3" interface="bbc_rom">
+ <feature name="part_id" value="Debugger" />
<dataarea name="rom" size="16384">
<rom name="ADEBUG-0.93.rom" size="16384" crc="ae95a2ad" sha1="db6dd7445f5570ecdb037e0cf24d8946c2b29f50"/>
</dataarea>
@@ -1081,6 +1120,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="amdfsb4190" cloneof="amdfsb">
+ <description>Amcom DFS S/N:B4190</description>
+ <year>1983</year>
+ <publisher>PACE</publisher>
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Amcom-DFS-B4190.rom" size="8192" crc="66842d8b" sha1="fdbf82e3c84a95d71ed16a1a045b54a9e399d06a"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="amdfsb">
<description>Amcom DFS S/N:B4218</description>
<year>1983</year>
@@ -1129,6 +1180,30 @@ license:CC0-1.0
</part>
</software>
+ <software name="amenet636b" cloneof="amenetb">
+ <description>Amcom E-Net 6.36B</description>
+ <year>1986</year>
+ <publisher>Amcom</publisher>
+ <sharedfeat name="compatibility" value="B,B+"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Amcom-E-Net-6.36B.rom" size="8192" crc="2c30cb80" sha1="ca3b5360a50d3cc9bd35349b713bd050e0fd7832"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amenet609m" cloneof="amenetm">
+ <description>Amcom E-Net Client 6.09M</description>
+ <year>1986</year>
+ <publisher>Amcom</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Amcom-E-Net-Client-6.09M.rom" size="16384" crc="a681f9a1" sha1="c8ca958fbafbc8edba0f4d031c9b20493926a7f4"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="amenetb">
<description>Amcom E-Net Client 6.14B</description>
<year>1986</year>
@@ -1272,6 +1347,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="amwfs523" cloneof="amwfsb">
+ <description>Amcom WFS 5.23</description>
+ <year>198?</year>
+ <publisher>Amcom</publisher>
+ <sharedfeat name="compatibility" value="B,B+"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Amcom-WFS-5.23.rom" size="16384" crc="026d8889" sha1="5563c02e27a1a8aaff42deca0d36bea771cfb053"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="amwfs623b" cloneof="amwfsb">
<description>Amcom WFS 6.23B</description>
<year>1986</year>
@@ -1832,6 +1919,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="axr">
+ <description>Assembler Extension ROM 1.12</description>
+ <year>1985</year>
+ <publisher>Acorn User</publisher>
+ <info name="author" value="Steve Picton"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="AXR-1.12.rom" size="16384" crc="f49c02fd" sha1="c2853a06ae06c0cff6305858d2cccf9042154703"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="b2p" supported="no">
<description>B2P-6502</description>
<year>1986</year>
@@ -1845,7 +1944,7 @@ license:CC0-1.0
</part>
</software>
- <software name="barrybox" supported="no">
+ <software name="barrybox">
<description>Barry-Box</description>
<year>1986</year>
<publisher>BML Electronics</publisher>
@@ -1901,6 +2000,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="bcomp">
+ <description>Logik BComp 1.05</description>
+ <year>1984</year>
+ <publisher>CCP</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="LogikBComp-1.05.rom" size="16384" crc="a8639c2d" sha1="a521610453dbc133b2fe094e825be83526653301"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="bcpl">
<description>BCPL</description>
<year>1982</year>
@@ -1935,7 +2045,7 @@ license:CC0-1.0
</part>
</software>
- <software name="beebaid">
+ <software name="beebaid102" cloneof="beebaid">
<description>BeebAid 1.02</description>
<year>1985</year>
<publisher>JaySoft</publisher>
@@ -1946,7 +2056,7 @@ license:CC0-1.0
</part>
</software>
- <software name="beebaid105">
+ <software name="beebaid">
<description>BeebAid 1.05</description>
<year>1986</year>
<publisher>JaySoft</publisher>
@@ -2133,8 +2243,19 @@ license:CC0-1.0
</part>
</software>
+ <software name="beebscan130" cloneof="beebscan" supported="no">
+ <description>BeebScan 1.30</description>
+ <year>1988</year>
+ <publisher>Watford Electronics</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="BeebScan-1.30.rom" size="16384" crc="fcf39f57" sha1="23cb3d50b9b8595ba1eb02cb4a2049a6823765ff"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="beebscan" supported="no">
- <description>BeebScan</description>
+ <description>BeebScan 1.31</description>
<year>1989</year>
<publisher>Watford Electronics</publisher>
<part name="rom1" interface="bbc_rom">
@@ -2144,6 +2265,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="beebsupp">
+ <description>Beeb Support 1.00</description>
+ <year>1986</year>
+ <publisher>Supreme Software Support</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="BeebSupport-1.00.rom" size="16384" crc="de7ea000" sha1="5d08ab55f051f1501bcfc70578b376e4088bd938"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="beebtel200" cloneof="beebtel">
<description>Beebtel 2.00</description>
<year>1985</year>
@@ -2348,6 +2480,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="butil">
+ <description>B-Utility 1.24</description>
+ <year>1984</year>
+ <publisher>IFEL</publisher>
+ <info name="author" value="Steve Picton"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="B-Utility-1.24.rom" size="16384" crc="494c6c9d" sha1="2ed4f4217348838ad48186f236dcd85e35621fcf"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="caretakr100" cloneof="caretakr">
<description>Caretaker 1.00</description>
<year>1984</year>
@@ -2535,7 +2679,29 @@ license:CC0-1.0
</part>
</software>
+ <software name="cmslinka" cloneof="cmslink">
+ <description>CMS Link (alt)</description>
+ <year>1984</year>
+ <publisher>CMS Soft</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="CMSLink-1.0a.rom" size="8192" crc="b4c5d384" sha1="7b97fb1365e238b00f8d3bf56a8c5f655bf0e115"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="cmslink">
+ <description>CMS Link</description>
+ <year>1985</year>
+ <publisher>CMS Soft</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="CMSLink-1.0.rom" size="8192" crc="f3055016" sha1="619467dc58414089190cbde76a45129d9dfd188e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cmslinkmm">
<description>CMS Link BBC -> Micro Module</description>
<year>1986</year>
<publisher>CMS Soft</publisher>
@@ -2568,6 +2734,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="colourjet">
+ <description>Colourjet Driver 1.0</description>
+ <year>1988</year>
+ <publisher>Integrex</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Colourjet-1.0.rom" size="8192" crc="81438e7e" sha1="7b4be5eb8f5773412147620c978f04286e1d921e"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="comal">
<description>COMAL</description>
<year>1985</year>
@@ -2717,6 +2894,28 @@ license:CC0-1.0
</part>
</software>
+ <software name="commstar1094" cloneof="commstar">
+ <description>Commstar 1094</description>
+ <year>1983</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Commstar-1094.rom" size="8192" crc="13e2c689" sha1="6c272524f6f447d31fb52e5fe257996a71c154af"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commstar1096" cloneof="commstar">
+ <description>Commstar 1096</description>
+ <year>1983</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Commstar-1096.rom" size="8192" crc="18b3275e" sha1="3b4f3f711d7f3d6aacf266300877855d069f1a38"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="commstar3033" cloneof="commstar">
<description>Commstar 3033</description>
<year>1984</year>
@@ -2827,6 +3026,28 @@ license:CC0-1.0
</part>
</software>
+ <software name="commstar7585" cloneof="commstar">
+ <description>Commstar 7585</description>
+ <year>1984</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Commstar-7585.rom" size="8192" crc="e3e190fe" sha1="922dfd4a8d5291452dd52ee68574babb59f64fd9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commstar7587" cloneof="commstar">
+ <description>Commstar 7587</description>
+ <year>1984</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Commstar-7587.rom" size="8192" crc="e8b07129" sha1="bcdc70d5c6968665d347ddc5bc73e6b0e1291208"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="commstar8179" cloneof="commstar">
<description>Commstar 8179</description>
<year>1984</year>
@@ -2838,6 +3059,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="commstar8827" cloneof="commstar">
+ <description>Commstar 8827</description>
+ <year>1985</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Commstar-8827.rom" size="8192" crc="ae0b182b" sha1="a258ffae69f2bc630935ac7536f08c09512fe958"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="commstar9003" cloneof="commstar">
<description>Commstar 9003</description>
<year>1985</year>
@@ -2883,23 +3115,56 @@ license:CC0-1.0
</software>
<software name="commstar231" cloneof="commstar2">
- <description>Commstar II 2.31 S/N:2077</description>
+ <description>Commstar II 2.31 S/N:20777</description>
<year>1986</year>
<publisher>PACE</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
- <rom name="Commstar-2.31-2077.rom" size="16384" crc="b5f5f042" sha1="485e3a5d5270aee07a2a3d755f0831ef25348554"/>
+ <rom name="Commstar-2.31-20777.rom" size="16384" crc="b5f5f042" sha1="485e3a5d5270aee07a2a3d755f0831ef25348554"/>
</dataarea>
</part>
</software>
<software name="commstar231a" cloneof="commstar2">
- <description>Commstar II 2.31 S/N:2187</description>
+ <description>Commstar II 2.31 S/N:21687</description>
+ <year>1986</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Commstar-2.31-21687.rom" size="16384" crc="5ea2bb24" sha1="976d9813f64dadbec1841d45cbea677b9eed6456"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commstar231b" cloneof="commstar2">
+ <description>Commstar II 2.31 S/N:22816</description>
<year>1986</year>
<publisher>PACE</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
- <rom name="Commstar-2.31-2187.rom" size="16384" crc="5ea2bb24" sha1="976d9813f64dadbec1841d45cbea677b9eed6456"/>
+ <rom name="Commstar-2.31-22816.rom" size="16384" crc="fb57fc72" sha1="32fc5c7e4bb9cfa02e9817296ff0ade6ca65db08"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commstar2a" cloneof="commstar2">
+ <description>Commstar II 2.40 S/N:22816</description>
+ <year>1986</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Commstar-2.40-22816.rom" size="16384" crc="43f50f7d" sha1="2ba3e37c3981bb428fe1e4842ece15d7c00a7113"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="commstar2b" cloneof="commstar2">
+ <description>Commstar II 2.40 S/N:23977</description>
+ <year>1986</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Commstar-2.40-23977.rom" size="16384" crc="341614df" sha1="1dbddff1a1400fccccc9090230ff63fff9b492e4"/>
</dataarea>
</part>
</software>
@@ -2994,9 +3259,9 @@ license:CC0-1.0
</software>
<software name="control023" cloneof="control">
- <description>SJ Control ROM 0.23</description>
+ <description>The Control ROM 0.23</description>
<year>1983</year>
- <publisher>SJ Research</publisher>
+ <publisher>Control Universal</publisher>
<info name="author" value="Peter Miller"/>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="8192">
@@ -3220,6 +3485,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="datatrace">
+ <description>DataTrace 2.34</description>
+ <year>198?</year>
+ <publisher>Shootgrove</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="DataTrace-2.34.rom" size="16384" crc="e2cb17f1" sha1="736ff833460a122b22768839973122b879154b20"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="ddfs090" cloneof="ddfs310">
<description>Microware DDFS 0.90</description>
<year>1984</year>
@@ -3425,7 +3701,7 @@ license:CC0-1.0
<sharedfeat name="fdc_default" value="opus2793"/>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
- <rom name="Opus-DDOS-3.35r2.rom" size="16384" crc="e33167fb" sha1="42fbc9932db2087708da41cb1ffa94358683cf7a"/>
+ <rom name="Opus-DDOS-3.35r2.rom" size="16384" crc="262b860e" sha1="f8be50ff46bd5d3705ef4cb2217a99118b984c11"/>
</dataarea>
</part>
</software>
@@ -3639,13 +3915,25 @@ license:CC0-1.0
</part>
</software>
- <software name="detalker">
- <description>Detalker 1.00</description>
+ <software name="detalker100" cloneof="detalker">
+ <description>D.E.Talker 1.00</description>
<year>1984</year>
- <publisher>Revelstone</publisher>
+ <publisher>D.E.Systems</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="DETalker-1.00.rom" size="8192" crc="7b232141" sha1="8d2e9c856227870c6e02da278eed6ac653dbebf8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="detalker">
+ <description>D.E.Talker 2.30</description>
+ <year>1985</year>
+ <publisher>D.E.Systems</publisher>
<part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="detalker" />
<dataarea name="rom" size="8192">
- <rom name="Detalker-1.00.rom" size="8192" crc="7b232141" sha1="8d2e9c856227870c6e02da278eed6ac653dbebf8"/>
+ <rom name="DETalker-2.30.rom" size="8192" crc="d7d3a7f7" sha1="a746b4e66de12bc41cbada9c9cc749438f8479e0"/>
</dataarea>
</part>
</software>
@@ -4623,6 +4911,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="epromer232" cloneof="epromer2" supported="no">
+ <description>Epromer II 2.3.2</description>
+ <year>1985</year>
+ <publisher>Technomatic</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Epromer-2.32.rom" size="16384" crc="ff93fa80" sha1="a0dae30df497261358b07462a48054c7d9288fb5"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="epromer2" supported="no">
<description>Epromer II 2.5</description>
<year>1985</year>
@@ -4763,7 +5062,7 @@ license:CC0-1.0
</part>
</software>
- <software name="eurobeeb1" cloneof="eurobeeb" supported="no">
+ <software name="eurobeeb1" cloneof="eurobeeb4" supported="no">
<description>EURO-Beeb Terminal 1</description>
<year>1984</year>
<publisher>Control Universal</publisher>
@@ -4774,7 +5073,7 @@ license:CC0-1.0
</part>
</software>
- <software name="eurobeeb" supported="no">
+ <software name="eurobeeb4" supported="no">
<description>EURO-Beeb Terminal 4.13</description>
<year>1986</year>
<publisher>Control Universal</publisher>
@@ -4785,6 +5084,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="eurobeeb414" cloneof="eurobeeb4" supported="no">
+ <description>EURO-Beeb Terminal 4.14</description>
+ <year>1986</year>
+ <publisher>Control Universal</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="EURO-Beeb_Terminal-4.14.rom" size="8192" crc="52c5eb7b" sha1="347253da64f81fd643d2800a6e09fade86c40f18"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="everest">
<description>Everest</description>
<year>1986</year>
@@ -5245,7 +5555,7 @@ license:CC0-1.0
</part>
</software>
- <software name="genie101" cloneof="genie" supported="no">
+ <software name="genie101" cloneof="genie">
<description>PMS Genie 1.01</description>
<year>1987</year>
<publisher>Permanent Memory Systems</publisher>
@@ -5254,12 +5564,10 @@ license:CC0-1.0
<dataarea name="rom" size="32768">
<rom name="PMSGenie-1.01.rom" size="32768" crc="be152c01" sha1="34d8d21c71b1bf1f3648a4dda90fde5d8dc48cd2"/>
</dataarea>
- <dataarea name="nvram" size="32768" />
- <dataarea name="ram" size="32768" />
</part>
</software>
- <software name="genie" supported="no">
+ <software name="genie">
<description>PMS Genie 1.02</description>
<year>1987</year>
<publisher>Permanent Memory Systems</publisher>
@@ -5272,8 +5580,6 @@ license:CC0-1.0
<rom name="PMSGenie3-1.02.rom" size="8192" crc="9a37428c" sha1="a951c61c81acea3d7510a0e23b0c054fae86a95b" offset="0x4000" status="baddump"/>
<rom name="PMSGenie4-1.02.rom" size="8192" crc="25cdd418" sha1="07a5f4f5dde38679140815a6b5ee22eccd678cb1" offset="0x6000" status="baddump"/>
</dataarea>
- <dataarea name="nvram" size="32768" />
- <dataarea name="ram" size="32768" />
</part>
</software>
@@ -5529,6 +5835,28 @@ license:CC0-1.0
</part>
</software>
+ <software name="gsforth203" cloneof="gsforth">
+ <description>GS Forth 2.03</description>
+ <year>2016</year>
+ <publisher>Steven James</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="GSForth-2.03.rom" size="12573" crc="9ec3c460" sha1="1e5d3a0778d4158a7b5674b57b9bbe5d52b4685d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gsforth">
+ <description>GS Forth 2.08</description>
+ <year>2019</year>
+ <publisher>Steven James</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="GSForth-2.08.rom" size="12578" crc="ec07b16a" sha1="d4217ba3c6a0e1c58ba46bc6482f6df9fe3b3efd"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="gxr037" cloneof="gxrb">
<description>GXR 0.37 (B)</description>
<year>1985</year>
@@ -5881,6 +6209,54 @@ license:CC0-1.0
</part>
</software>
+ <software name="ibos121" cloneof="ibos">
+ <description>Integra-B OS 1.21</description>
+ <year>2019</year>
+ <publisher>Ken Lowe</publisher>
+ <info name="usage" value="Requires Integra-B" />
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="IBOS-1.21.rom" size="16384" crc="736e6d13" sha1="9c6fb32ac9ee78d5b527079a5abea5689e64b5e3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ibos122" cloneof="ibos">
+ <description>Integra-B OS 1.22</description>
+ <year>2021</year>
+ <publisher>Ken Lowe</publisher>
+ <info name="usage" value="Requires Integra-B" />
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="IBOS-1.22.rom" size="16384" crc="8e05fcb8" sha1="d38baab64627689d9f88d33892c7fb0af331514a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ibos123" cloneof="ibos">
+ <description>Integra-B OS 1.23</description>
+ <year>2022</year>
+ <publisher>Ken Lowe</publisher>
+ <info name="usage" value="Requires Integra-B" />
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="IBOS-1.23.rom" size="16384" crc="181ddc08" sha1="d89ade928c47b440d19b916e691565f17d92a689"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ibos124" cloneof="ibos">
+ <description>Integra-B OS 1.24</description>
+ <year>2022</year>
+ <publisher>Ken Lowe</publisher>
+ <info name="usage" value="Requires Integra-B" />
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="IBOS-1.24.rom" size="16384" crc="7e14b658" sha1="cc2cf9428fb9f1cb799bb27d8f88b2a5d9e18767"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="ibos125" cloneof="ibos">
<description>Integra-B OS 1.25</description>
<year>2022</year>
@@ -5916,6 +6292,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="ieee191" cloneof="ieee">
+ <description>IEEE 1.91</description>
+ <year>1983</year>
+ <publisher>Procyon Research</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="IEEE-1.91.rom" size="8192" crc="3eb94350" sha1="a488f5904b2d669170edf8ab4244324ef36a4f41"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="ieee192" cloneof="ieee">
<description>IEEE 1.92</description>
<year>1983</year>
@@ -5927,6 +6314,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="ieee196" cloneof="ieee">
+ <description>IEEE 1.96</description>
+ <year>1984</year>
+ <publisher>Procyon Research</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="IEEE-1.96.rom" size="8192" crc="f4e6a15e" sha1="5f01ac0b8940126025611bd4a99320e1fd1212f5"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="ieee">
<description>IEEE 1.98</description>
<year>1984</year>
@@ -6314,6 +6712,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="kcopy">
+ <description>KCopy 1.03</description>
+ <year>1985</year>
+ <publisher>Wynand Thompson</publisher>
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="KCopy-1.03.rom" size="8192" crc="bc1b8279" sha1="e7053c00ed1db80017d0f4032c6d3186d5736540"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="kenda102" cloneof="kenda">
<description>Kenda DMFS - PADS 1.02</description>
<year>1985</year>
@@ -6325,7 +6735,6 @@ license:CC0-1.0
<dataarea name="rom" size="8192">
<rom name="Kenda-1.02.rom" size="8192" crc="430b911c" sha1="594ae1d1aeaa20a1d5d1c64cd94d43926dda4029"/>
</dataarea>
- <dataarea name="ram" size="2048" />
</part>
</software>
@@ -6340,7 +6749,6 @@ license:CC0-1.0
<dataarea name="rom" size="8192">
<rom name="Kenda-1.04.rom" size="8192" crc="1c0013de" sha1="7845a69dd8d05cf905f8e11ad3abeebb4b0b187d"/>
</dataarea>
- <dataarea name="ram" size="2048" />
</part>
</software>
@@ -6399,6 +6807,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="keypad">
+ <description>Keypad</description>
+ <year>1984</year>
+ <publisher>Viglen</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Keypad-1.0.rom" size="8192" crc="ba1a8747" sha1="df90341a659638da19ecca125879d8644ccee2c4"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="kmon">
<description>Kmon</description>
<year>198?</year>
@@ -6410,6 +6829,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="lambda7" supported="no">
+ <description>Lambda 7 Spectrophotometer Simulation 1.23</description>
+ <year>1986</year>
+ <publisher>Oxford Polytechnic</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Lambda7-1.23.rom" size="16384" crc="9c80bdfd" sha1="83fc762f58c166b33c2e00671d172c3953c3b38e"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="lanman032" cloneof="lanman" supported="no">
<description>LAN Manager 0.32</description>
<year>2008</year>
@@ -6600,8 +7030,8 @@ license:CC0-1.0
</part>
</software>
- <software name="logol">
- <description>Logotron-LOGO</description>
+ <software name="logol100" cloneof="logol">
+ <description>Logotron-LOGO 1.00</description>
<year>1984</year>
<publisher>Logotron</publisher>
<part name="rom1" interface="bbc_rom">
@@ -6611,6 +7041,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="logol">
+ <description>Logotron-LOGO 1.01</description>
+ <year>1984</year>
+ <publisher>Logotron</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="LOGO-Logotron-1.01.rom" size="16384" crc="cab1886a" sha1="08b4b548e1a5cf841c128cddd7c0256fc82fc65e"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="logolc" cloneof="logol">
<description>Logotron-LOGO (Cymru)</description>
<year>1984</year>
@@ -6622,13 +7063,24 @@ license:CC0-1.0
</part>
</software>
- <software name="lucifer">
+ <software name="lucifer10" cloneof="lucifer">
<description>Lucifer Logic Analyser 1.0</description>
<year>1984</year>
<publisher>Ferroglen Research</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
- <rom name="LuciferLogicAnalyser-1.0.rom" size="16384" crc="1efbdf39" sha1="05d1f3f51a9669c5de48d550f1af2522faa30248"/>
+ <rom name="Lucifer-1.0.rom" size="16384" crc="1efbdf39" sha1="05d1f3f51a9669c5de48d550f1af2522faa30248"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lucifer">
+ <description>Lucifer Logic Analyser 2.0b</description>
+ <year>1984</year>
+ <publisher>Ferroglen Research</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Lucifer-2.0b.rom" size="16384" crc="32928894" sha1="4387c07b026d0aa5ea407b9377ebb84ce871ae40"/>
</dataarea>
</part>
</software>
@@ -6872,8 +7324,20 @@ license:CC0-1.0
</part>
</software>
- <software name="matrix">
- <description>Matrix</description>
+ <software name="masterom">
+ <description>The Master ROM 1.778</description>
+ <year>1988</year>
+ <publisher>John Robinson</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="ram" />
+ <dataarea name="rom" size="16384">
+ <rom name="TheMasterROM-1.778.rom" size="16384" crc="907c5322" sha1="450e0dc2847e0ddebba2fc24501e3561429218a1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="matrix101" cloneof="matrix">
+ <description>Matrix 1.01</description>
<year>1986</year>
<publisher>Vine Micros</publisher>
<part name="rom1" interface="bbc_rom">
@@ -6883,6 +7347,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="matrix">
+ <description>Matrix 1.06</description>
+ <year>1986</year>
+ <publisher>Vine Micros</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Matrix-1.06.rom" size="16384" crc="fe24af29" sha1="78fa4e2f3fc4743a01de2af1567be92dddd1bc74"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="maxim">
<description>Maxim 1.0</description>
<year>1986</year>
@@ -6905,6 +7380,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="mcl">
+ <description>MCL 1.6</description>
+ <year>1986</year>
+ <publisher>Unilab</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="MCL-1.6.rom" size="16384" crc="69463561" sha1="4a4fc7f875677948c44fa5c518d6117dd5cceb7b"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="mcp041cbl">
<description>MCP v0.41 (CBL)</description>
<year>1983</year>
@@ -7035,7 +7521,7 @@ license:CC0-1.0
</part>
</software>
- <software name="megarom">
+ <software name="megarom101" cloneof="megarom">
<description>Mega-ROM 1.01</description>
<year>1985</year>
<publisher>Chalice</publisher>
@@ -7046,6 +7532,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="megarom">
+ <description>Mega-ROM 1.03</description>
+ <year>1985</year>
+ <publisher>Chalice</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Mega-ROM-1.03.rom" size="16384" crc="ad8af0bb" sha1="ea9f6580e60b97fbed7c7cb384e7bcdb9b91ad25"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="palesar" cloneof="memex256">
<description>Palesar RAM Manager 1.04</description>
<year>1986</year>
@@ -7422,16 +7919,31 @@ license:CC0-1.0
</software>
<software name="moffice2">
- <description>Instant Mini Office II</description>
+ <description>Instant Mini Office II 2.01D</description>
<year>1986</year>
<publisher>Database Software</publisher>
<part name="rom1" interface="bbc_rom">
<feature name="slot" value="palmo2" />
<dataarea name="rom" size="131072">
- <rom name="MiniOfficeII-1.rom" size="32768" crc="5e0f6853" sha1="3deef1b1680c9a1449009b11899bf5ab360f89ef" offset="0x18000"/>
- <rom name="MiniOfficeII-2.rom" size="32768" crc="afb646cc" sha1="d7ead85e32930b0f35ad87d3a825f48896abc8e1" offset="0x10000"/>
- <rom name="MiniOfficeII-3.rom" size="32768" crc="e8a1cbd8" sha1="9e31542d2099c98605032c175c196f3ea073de5f" offset="0x08000"/>
- <rom name="MiniOfficeII-4.rom" size="32768" crc="d041fe31" sha1="cd0297096009c71ebb00709cfb32a6c56e7eea8b" offset="0x00000"/>
+ <rom name="MiniOfficeII-1-2.01d.rom" size="32768" crc="5e0f6853" sha1="3deef1b1680c9a1449009b11899bf5ab360f89ef" offset="0x18000"/>
+ <rom name="MiniOfficeII-2-2.01d.rom" size="32768" crc="afb646cc" sha1="d7ead85e32930b0f35ad87d3a825f48896abc8e1" offset="0x10000"/>
+ <rom name="MiniOfficeII-3-2.01d.rom" size="32768" crc="e8a1cbd8" sha1="9e31542d2099c98605032c175c196f3ea073de5f" offset="0x08000"/>
+ <rom name="MiniOfficeII-4-2.01d.rom" size="32768" crc="d041fe31" sha1="cd0297096009c71ebb00709cfb32a6c56e7eea8b" offset="0x00000"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="moffice2_201c" cloneof="moffice2">
+ <description>Instant Mini Office II 2.01C</description>
+ <year>1986</year>
+ <publisher>Database Software</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="palmo2" />
+ <dataarea name="rom" size="131072">
+ <rom name="MiniOfficeII-1-2.01c.rom" size="32768" crc="38bbad3e" sha1="1821ab47b2f7e02ed3af7e804030519bf3a42076" offset="0x18000"/>
+ <rom name="MiniOfficeII-2-2.01c.rom" size="32768" crc="9a2898c9" sha1="e8ae6cb24dd28d5c84eed25ca48e14def96878bc" offset="0x10000"/>
+ <rom name="MiniOfficeII-3-2.01c.rom" size="32768" crc="c439ac92" sha1="27e7a9273aa068d80f8da32c209c27a21e046a70" offset="0x08000"/>
+ <rom name="MiniOfficeII-4-2.01c.rom" size="32768" crc="1aef200a" sha1="9b4966354cfb9a6e928bd287db8d84bb62491434" offset="0x00000"/>
</dataarea>
</part>
</software>
@@ -7592,18 +8104,27 @@ license:CC0-1.0
<dataarea name="rom" size="8192">
<rom name="MRM-E00-DFS-1.20.rom" size="8192" crc="944958b6" sha1="0db7be4deb303af2400f9af20a9a7211dcbaeae5"/>
</dataarea>
- <!-- TODO: Verify amount of RAM -->
- <dataarea name="ram" size="4096" />
</part>
</software>
<software name="multbas">
- <description>Multi-Basic 1.00</description>
+ <description>Multi-Basic 1.0</description>
<year>1985</year>
<publisher>CMS Soft</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
- <rom name="MultiBasic-1.00.rom" size="16384" crc="fb2200df" sha1="4d034c56d33b09177263f394412975b551506602"/>
+ <rom name="MultiBasic-1.0.rom" size="16384" crc="fb2200df" sha1="4d034c56d33b09177263f394412975b551506602"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="multbas3">
+ <description>Multi-Basic 3.0</description>
+ <year>1986</year>
+ <publisher>CMS Soft</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="MultiBasic-3.0.rom" size="16384" crc="a0e2f90c" sha1="348df837560bf1eb11af2e39c7a4c116c2ffa107"/>
</dataarea>
</part>
</software>
@@ -7819,6 +8340,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="mxr">
+ <description>Maths Extension ROM 1.05</description>
+ <year>1984</year>
+ <publisher>Acorn User</publisher>
+ <info name="author" value="Steve Picton"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="MXR-1.05.rom" size="16384" crc="b3bb5ec7" sha1="10391981e8c6becf5b0e409f1c40a43a862c0b27"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="nfs334">
<description>Acorn NFS 3.34</description>
<year>1982</year>
@@ -8402,12 +8935,12 @@ license:CC0-1.0
</software>
<software name="prestel47" cloneof="prestel" supported="no">
- <description>Prestel 4.7n</description>
+ <description>Prestel 4.70n</description>
<year>1984</year>
<publisher>SofMac</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="8192">
- <rom name="Prestel-4.7n.rom" size="8192" crc="0a67a386" sha1="4e3f983e51e812a903dfce9bfbb41a040c4b9ff5"/>
+ <rom name="Prestel-4.70n.rom" size="8192" crc="0a67a386" sha1="4e3f983e51e812a903dfce9bfbb41a040c4b9ff5"/>
</dataarea>
</part>
</software>
@@ -8956,7 +9489,7 @@ license:CC0-1.0
</part>
</software>
- <software name="ramdisc">
+ <software name="ramdisc101" cloneof="ramdisc">
<description>RAMDisc 1.01</description>
<year>198?</year>
<publisher>Morley Electronics</publisher>
@@ -8967,6 +9500,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="ramdisc">
+ <description>RAMDisc 1.04</description>
+ <year>1987</year>
+ <publisher>Morley Electronics</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="RAMDisc-1.04.rom" size="16384" crc="39ddebdb" sha1="d992d095f1dfac0d27ba655afb2656ddc4635ac7"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="ramfs100">
<description>RetroClinic RamFS 1.00</description>
<year>2009</year>
@@ -9098,28 +9642,67 @@ license:CC0-1.0
</part>
</software>
- <software name="replay8271_100" cloneof="replay8271" supported="no">
- <description>Replay System 8271 1.00</description>
+ <software name="replay8271_100a" cloneof="replay8271" supported="no">
+ <description>Replay System 8271 1.00A</description>
+ <year>1985</year>
+ <publisher>Vine Micros</publisher>
+ <info name="usage" value="Requires Acorn 8271 FDC" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Replay-8271-1.00A.rom" size="8192" crc="4ec2084b" sha1="5f5a2574b596d90f67a900e810483155d46a8c68"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="replay8271_100b" cloneof="replay8271" supported="no">
+ <description>Replay System 8271 1.00B</description>
+ <year>1985</year>
+ <publisher>Vine Micros</publisher>
+ <info name="usage" value="Requires Acorn 8271 FDC" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Replay-8271-1.00B.rom" size="8192" crc="b3ed7e94" sha1="3b25407b410c25df1b8f169b5dce69252a423781"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="replay8271a" cloneof="replay8271" supported="no">
+ <description>Replay System 8271 1.10A</description>
+ <year>1985</year>
+ <publisher>Vine Micros</publisher>
+ <info name="usage" value="Requires Acorn 8271 FDC" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Replay-8271-1.10A.rom" size="8192" crc="4483ec6d" sha1="e6bfbcca5560f15d86d0cd1462e69ce155c618b3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="replay8271b" cloneof="replay8271" supported="no">
+ <description>Replay System 8271 1.10B</description>
<year>1985</year>
<publisher>Vine Micros</publisher>
<info name="usage" value="Requires Acorn 8271 FDC" />
<sharedfeat name="compatibility" value="B"/>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="8192">
- <rom name="Replay-8271-1.00.rom" size="8192" crc="b3ed7e94" sha1="3b25407b410c25df1b8f169b5dce69252a423781"/>
+ <rom name="Replay-8271-1.10B.rom" size="8192" crc="d89edb0d" sha1="eec5b1329bfb4ca6378c6ed41301103f9b456933"/>
</dataarea>
</part>
</software>
<software name="replay8271" supported="no">
- <description>Replay System 8271 1.10</description>
+ <description>Replay System 8271 1.10C</description>
<year>1985</year>
<publisher>Vine Micros</publisher>
<info name="usage" value="Requires Acorn 8271 FDC" />
<sharedfeat name="compatibility" value="B"/>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="8192">
- <rom name="Replay-8271-1.10.rom" size="8192" crc="4483ec6d" sha1="e6bfbcca5560f15d86d0cd1462e69ce155c618b3"/>
+ <rom name="Replay-8271-1.10C.rom" size="8192" crc="ba2f53af" sha1="60bf7ae521380d0a7f04ee06247dc8a32c7c1b54"/>
</dataarea>
</part>
</software>
@@ -9137,6 +9720,19 @@ license:CC0-1.0
</part>
</software>
+ <software name="replay1770_101a" cloneof="replay1770" supported="no">
+ <description>Replay System WD1770 1.01 (alt)</description>
+ <year>1985</year>
+ <publisher>Vine Micros</publisher>
+ <info name="usage" value="Requires Opus D-DOS(B) 1770 FDC" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Replay-1770-1.01a.rom" size="8192" crc="77bc410b" sha1="1b7b45b1c2e43cb91e84f9d2b30b11f5062e4a25"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="replay1770" supported="no">
<description>Replay System WD1770 1.11</description>
<year>1985</year>
@@ -9181,7 +9777,7 @@ license:CC0-1.0
<year>1988</year>
<publisher>Vine Micros</publisher>
<info name="usage" value="Requires any 1770 FDC" />
- <sharedfeat name="compatibility" value="B"/>
+ <sharedfeat name="compatibility" value="B,B+"/>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
<rom name="ReplayMk2-2.00.rom" size="16384" crc="f42d297c" sha1="5bab729b42906cd9612cb6531c6393b16211daac"/>
@@ -9735,6 +10331,19 @@ license:CC0-1.0
</part>
</software>
+ <software name="shadowfax" cloneof="weram">
+ <description>Micro Club 32K Shadow Ram 1.00</description>
+ <year>1986</year>
+ <publisher>Micro Club</publisher>
+ <info name="usage" value="Requires Micro Club 32K Shadow RAM (Watford 32K Shadow RAM)" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Shadowfax-1.00.rom" size="8192" crc="911e4988" sha1="e1985068a08a81525f009575ea3f1dac6ddcbfe6"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sideaid128">
<description>SideAid128 1.03</description>
<year>1988</year>
@@ -9914,6 +10523,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="soundfx">
+ <description>Sound Effects</description>
+ <year>1986</year>
+ <publisher>Gordon Horsington</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="ram" />
+ <dataarea name="rom" size="16384">
+ <rom name="SoundEffects.rom" size="5176" crc="13befd46" sha1="05d37f9d86cf48dac24039f4de5b660036a416ca"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="sparkdmp">
<description>Spark Dump</description>
<year>1985</year>
@@ -9970,6 +10591,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="speechsys">
+ <description>SPEECH-system 1.6</description>
+ <year>1986</year>
+ <publisher>PUPPYsoft</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="SPEECH-system-1.6.rom" size="9984" crc="8c988efe" sha1="516b839ea624188ccf232bab67cabef44a79c9f8"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="spellchk2">
<description>SpellCheck II</description>
<year>1984</year>
@@ -10876,6 +11508,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="smorset">
+ <description>Super Morse Tutor 1.03b</description>
+ <year>1991</year>
+ <publisher>BLT Software</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="SuperMorseTutor-1.03b.rom" size="16384" crc="cebbebf5" sha1="b6d39af3bbb577c13f52f30ba1a747aa35bcdda0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="suprutil">
<description>Super Utility</description>
<year>1985</year>
@@ -11313,7 +11957,7 @@ license:CC0-1.0
<publisher>Acorn</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
- <rom name="TFS-1.03.rom" size="16384" crc="db2cd3ab" sha1="b076c9c6aecc3dc0683d6810ca5329062eafe3f2"/>
+ <rom name="TFS-1.03.rom" size="16384" crc="a4340bf7" sha1="3a93d0e5530485904ae88bad0281458f8c8abfa2"/>
</dataarea>
</part>
</software>
@@ -11424,6 +12068,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="tncasa">
+ <description>TNC-ASA</description>
+ <year>1988</year>
+ <publisher>&gt;unknown&lt;</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="TNC-ASA-1.0.rom" size="16384" crc="bf95819b" sha1="07612c22401ff970ff92077bdae4b7b9ba6ed9d1"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="toolkita">
<description>Toolkit 1.01 (Algotek)</description>
<year>1983</year>
@@ -11546,7 +12201,7 @@ license:CC0-1.0
</software>
<software name="toolstar1262" cloneof="toolstar">
- <description>Toolstar 1.77 1262</description>
+ <description>Toolstar 1.77 1262 (T2000)</description>
<year>1983</year>
<publisher>PACE</publisher>
<part name="rom1" interface="bbc_rom">
@@ -11557,7 +12212,7 @@ license:CC0-1.0
</software>
<software name="toolstar1409" cloneof="toolstar">
- <description>Toolstar 1.77 1409</description>
+ <description>Toolstar 1.77 1409 (T1170)</description>
<year>1983</year>
<publisher>PACE</publisher>
<part name="rom1" interface="bbc_rom">
@@ -11568,7 +12223,7 @@ license:CC0-1.0
</software>
<software name="toolstar">
- <description>Toolstar 1.77 1511</description>
+ <description>Toolstar 1.77 1511 (T1266)</description>
<year>1983</year>
<publisher>PACE</publisher>
<part name="rom1" interface="bbc_rom">
@@ -11578,6 +12233,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="toolstara" cloneof="toolstar">
+ <description>Toolstar 1.77 1511 (T1417)</description>
+ <year>1983</year>
+ <publisher>PACE</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Toolstar-1.77-1511a.rom" size="8192" crc="8f71a269" sha1="02fdf6172e21003fb843cd7a89ab1aa09c56df6d"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="trace">
<description>Trace Disassembler 1.00</description>
<year>198?</year>
@@ -11666,6 +12332,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="ttx2000b">
+ <description>TTX2000B 1.12</description>
+ <year>1985</year>
+ <publisher>Volex</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="TTX2000B-1.12.rom" size="16384" crc="5ed73112" sha1="f13a0fc801f15c186d4de033a44cc29a570e6f36"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="tubeed">
<description>TUBE Editor</description>
<year>1985</year>
@@ -11961,16 +12638,6 @@ license:CC0-1.0
</part>
</software>
- <software name="userram">
- <description>UserRAM</description>
- <year>1985</year>
- <publisher>Acorn User</publisher>
- <part name="rom1" interface="bbc_rom">
- <feature name="slot" value="ram" />
- <dataarea name="ram" size="16384" />
- </part>
- </software>
-
<software name="userramd">
<description>UserRAM Demonstration ROM</description>
<year>1985</year>
@@ -12027,6 +12694,30 @@ license:CC0-1.0
</part>
</software>
+ <software name="utilrom20" cloneof="utilrom">
+ <description>The UtilRom 2.0</description>
+ <year>1992</year>
+ <publisher>B&amp;B Software</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="TheUtilRom-2.0.rom" size="16384" crc="8148e86c" sha1="fe47e58907fc128d5dced2e482d5609f76e82080"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="utilrom23" cloneof="utilrom">
+ <description>The UtilRom 2.3</description>
+ <year>1993</year>
+ <publisher>B&amp;B Software</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="TheUtilRom-2.3.rom" size="16384" crc="52d8e0cb" sha1="8325fbd419ce9e2751bc22a7d70bbc24461cf598"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="utools124" cloneof="utools">
<description>U-Tools 1.24</description>
<year>1984</year>
@@ -12189,6 +12880,20 @@ license:CC0-1.0
</part>
</software>
+ <software name="vdsdfs">
+ <description>Viglen DSDFS 1.00</description>
+ <year>1984</year>
+ <publisher>Viglen</publisher>
+ <info name="usage" value="Requires Watford Electronics DDB2 1770 FDC" />
+ <sharedfeat name="compatibility" value="B"/>
+ <sharedfeat name="fdc_default" value="weddb2"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Watford-DDFS-1.40.rom" size="16384" crc="159054a7" sha1="6671c61d016e58bd3a5b4b97aefa314ae9b11574"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="vdu">
<description>VDU 1.2</description>
<year>1986</year>
@@ -12638,6 +13343,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="vtclockm">
+ <description>VT Clock 1.0</description>
+ <year>1989</year>
+ <publisher>Moonlight Video</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="VTClock-1.0.rom" size="8192" crc="2a01eee6" sha1="75875b1a69c8341be2f60617b430128ac8284fb4"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="vtclock">
<description>VT Clock 1.16</description>
<year>1984</year>
@@ -12882,6 +13598,32 @@ license:CC0-1.0
</part>
</software>
+ <software name="weram106" cloneof="weram">
+ <description>Watford Electronics 32K RAM 1.06</description>
+ <year>1984</year>
+ <publisher>Watford Electronics</publisher>
+ <info name="usage" value="Requires Watford 32K Shadow RAM" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Watford_32K_RAM-1.06.rom" size="8192" crc="b9749390" sha1="210f6162d634fca8d75197d4f64d9b50abc01e1e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="weram200a" cloneof="weram">
+ <description>Watford Electronics 32K RAM 2.00 (alt)</description>
+ <year>1984</year>
+ <publisher>Watford Electronics</publisher>
+ <info name="usage" value="Requires Watford 32K Shadow RAM" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Watford_32K_RAM-2.00a.rom" size="8192" crc="87ce2646" sha1="15193a9e77b4bb48f4a776208da6c77814622054"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="weram200" cloneof="weram">
<description>Watford Electronics 32K RAM 2.00</description>
<year>1985</year>
@@ -12895,6 +13637,19 @@ license:CC0-1.0
</part>
</software>
+ <software name="weram220" cloneof="weram">
+ <description>Watford Electronics 32K RAM 2.20</description>
+ <year>1985</year>
+ <publisher>Watford Electronics</publisher>
+ <info name="usage" value="Requires Watford 32K Shadow RAM" />
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Watford_32K_RAM-2.20.rom" size="8192" crc="bc7124e0" sha1="7f8536576de449916cd77488e94775ed438c5c6c"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="weram">
<description>Watford Electronics 32K RAM 2.40</description>
<year>1985</year>
@@ -12908,6 +13663,28 @@ license:CC0-1.0
</part>
</software>
+ <software name="wespeech">
+ <description>Watford Electronics Speech Software</description>
+ <year>1983</year>
+ <publisher>Watford Electronics</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Watford_Speech-1.0.rom" size="8192" crc="ebe146e4" sha1="ec48849223e50b84d7f11d8ba42f2d7e2a76f8fa"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wespeecha" cloneof="wespeech">
+ <description>Watford Electronics Speech Software (alt)</description>
+ <year>1983</year>
+ <publisher>Watford Electronics</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Watford_Speech-1.0a.rom" size="8192" crc="6a7a74d9" sha1="b362d98589f17643add356be4bb91ca562d14f24"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="wildrom">
<description>WildROM 1.27</description>
<year>1990</year>
@@ -13029,7 +13806,7 @@ license:CC0-1.0
<publisher>Computer Concepts</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="8192">
- <rom name="Wordwise-1.17.rom" size="8192" crc="c9510583" sha1="098763e97595a12274f56de92beb8cdd722c64a5"/>
+ <rom name="Wordwise-1.17.rom" size="8192" crc="e453ea0e" sha1="a38037d70f2a8e460482a0c6ad3bce80865a0154"/>
</dataarea>
</part>
</software>
@@ -13045,6 +13822,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="wordwiseb20" cloneof="wordwise">
+ <description>Wordwise-B20 1.20</description>
+ <year>1984</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="WordwiseB20-1.20.rom" size="8192" crc="c028d741" sha1="c613a449eb5b186b912ade7f4e0cd9d47d6e4cf2"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="wordwise">
<description>Wordwise 1.20</description>
<year>1984</year>
@@ -13321,6 +14109,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="xobmps">
+ <description>XOB Multi Print Server 2.03</description>
+ <year>1988</year>
+ <publisher>XOB</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="XOB_Printer_Server-2.03.rom" size="8192" crc="fedf21a9" sha1="6f92f5eb9e5ee4e5e01a0606d868c3416f8ecaf7"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="xr65c02">
<description>Crossware 65C02XR</description>
<year>1985</year>
@@ -13422,6 +14221,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="gr_chuckie">
+ <description>GameROM: Chuckie Egg 1.10</description>
+ <year>201?</year>
+ <publisher>G-ROMS</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="G-ROM_ChuckieEgg-1.10.rom" size="16384" crc="7aeb2d90" sha1="5f52714ce0a995b3b6249fe0b9fe64a7664a09f6"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="gr_hopper">
<description>GameROM: Hopper 1.10</description>
<year>201?</year>
@@ -13433,6 +14243,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="gr_missile">
+ <description>GameROM: Missile Control 1.10</description>
+ <year>201?</year>
+ <publisher>G-ROMS</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="G-ROM_MissileControl-1.10.rom" size="16384" crc="20478ef3" sha1="116c08a469d10d2fbbeffe29f8bac7c392728774"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="gr_rocketra">
<description>GameROM: Rocket Raid 1.10</description>
<year>201?</year>
@@ -13444,6 +14265,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="gr_snapper110" cloneof="gr_snapper">
+ <description>GameROM: Snapper 1.10</description>
+ <year>2015</year>
+ <publisher>G-ROMS</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="G-ROM_Snapper-1.10.rom" size="16384" crc="ddbdc823" sha1="5aed55547ee97eeadb8a7c77eaf7726875df15df"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="gr_snapper">
<description>GameROM: Snapper 1.20</description>
<year>2015</year>
diff --git a/hash/bbc_vsm.xml b/hash/bbc_vsm.xml
new file mode 100644
index 00000000000..2e2ff82545a
--- /dev/null
+++ b/hash/bbc_vsm.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+-->
+
+<softwarelist name="bbc_vsm" description="Acorn BBC Micro Speech PHROMs">
+
+ <software name="cm62024">
+ <description>CM62064 (Kenneth Kendall)</description>
+ <year>1982</year>
+ <publisher>Acorn Computers</publisher>
+ <part name="rom" interface="bbc_vsm">
+ <feature name="bank" value="15" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="cm62024.bin" size="0x4000" crc="98e1bf9e" sha1="b369809275cb67dfd8a749265e91adb2d2558ae6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vm61002">
+ <description>VM61002 (Industrial)</description>
+ <year>1981</year>
+ <publisher>Texas Instruments</publisher>
+ <part name="rom" interface="bbc_vsm">
+ <feature name="bank" value="0" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="vm61002.bin" size="0x4000" crc="bf4b3b64" sha1="66876702d1d95eecc034d20f25047f893a27cde5" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vm61003">
+ <description>VM61003 (Weather)</description>
+ <year>1982</year>
+ <publisher>Texas Instruments</publisher>
+ <part name="rom" interface="bbc_vsm">
+ <feature name="bank" value="1" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="vm61003.bin" size="0x4000" crc="2a4e6f17" sha1="aa3bbb28fbdb848d609ec47ef8c250d4ff0d8e53" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vm61004">
+ <description>VM61004 (Military)</description>
+ <year>1982</year>
+ <publisher>Texas Instruments</publisher>
+ <part name="rom" interface="bbc_vsm">
+ <feature name="bank" value="2" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="vm61004.bin" size="0x4000" crc="45ec7dcd" sha1="24b88d0127a52eccc579d4ea90b39cb90da7fd39" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vm61005">
+ <description>VM61005 (Avionic)</description>
+ <year>1982</year>
+ <publisher>Texas Instruments</publisher>
+ <part name="rom" interface="bbc_vsm">
+ <feature name="bank" value="3" />
+ <dataarea name="rom" size="0x4000">
+ <rom name="vm61005.bin" size="0x4000" crc="09efc37f" sha1="5cf785153dcce406e9a8f5d166af50e288b33126" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vm71003a">
+ <description>VM71003A (Female Clock)</description>
+ <year>1981</year>
+ <publisher>Texas Instruments</publisher>
+ <part name="rom" interface="bbc_vsm">
+ <dataarea name="rom" size="0x1000">
+ <rom name="vm71003a.bin" size="0x1000" crc="d1d5a1dc" sha1="164dae26500d9ef01c591686f13078d51254c4e1" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/bbcbc.xml b/hash/bbcbc.xml
index 88e82338740..8c24cbfbbce 100644
--- a/hash/bbcbc.xml
+++ b/hash/bbcbc.xml
@@ -44,7 +44,7 @@ The BBC Bridge Companion only used a cartridge slot for software
</software>
<software name="bbuildera" cloneof="bbuilder">
- <description>Bridge Builder (Alt)</description>
+ <description>Bridge Builder (alt)</description>
<year>1985</year>
<publisher>Unicard</publisher>
<part name="cart" interface="bbcbc_cart">
@@ -81,7 +81,7 @@ The BBC Bridge Companion only used a cartridge slot for software
</software>
<software name="cplay2a" cloneof="cplay2">
- <description>Club Play 2 (Alt)</description>
+ <description>Club Play 2 (alt)</description>
<year>198?</year>
<publisher>Unicard</publisher>
<part name="cart" interface="bbcbc_cart">
diff --git a/hash/bmjr_cass.xml b/hash/bmjr_cass.xml
new file mode 100644
index 00000000000..503050556b4
--- /dev/null
+++ b/hash/bmjr_cass.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+-->
+<softwarelist name="bmjr_cass" description="Hitachi Basic Master Jr. cassettes">
+
+ <!-- TODO: compatible with Basic Master LV2 too -->
+ <software name="wilwesp" supported="yes">
+ <!-- Capitalized as WILWESP on Micom Basic printout, wILwESP in-game -->
+ <description>Wilwesp</description>
+ <year>1984</year>
+ <publisher>Micom BASIC</publisher>
+ <info name="usage" value="LOAD WILWSP then RUN" />
+ <info name="author" value="Orange Juice"/>
+ <part name="cass" interface="bmjr_cass">
+ <dataarea name="cass" size="23584812">
+ <rom name="wilwesp.wav" size="23584812" crc="d46d46e6" sha1="32494926110bdb015e85d18dff2ea7b2f6d58580"/>
+ </dataarea>
+ </part>
+ </software>
+</softwarelist>
diff --git a/hash/bml3_cass.xml b/hash/bml3_cass.xml
new file mode 100644
index 00000000000..9642b055556
--- /dev/null
+++ b/hash/bml3_cass.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+-->
+<softwarelist name="bml3_cass" description="Hitachi Basic Master Level 3 cassettes">
+
+ <software name="bmtetris" supported="yes">
+ <description>BM Tetris</description>
+ <year>1990</year>
+ <publisher>Sakn Soft</publisher>
+ <info name="usage" value="LOAD, press play on tape then RUN. Requires bml3mk5 (uses IG)." />
+ <part name="cass" interface="bml3_cass">
+ <dataarea name="cass" size="5106615">
+ <!-- NOTE: the original .wav won't mount on MAME, this .flac does -->
+ <rom name="tetris_all.flac" size="5106615" crc="696ce3a4" sha1="ba94ad716c7ecbf4434b67e1b79cd0e1012caecb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="igdemo" supported="yes">
+ <description>IG Demo</description>
+ <year>1983?</year>
+ <publisher>Hitachi?</publisher>
+ <notes><![CDATA[
+Mixed 600/1200 baud rate image (switch done during program bootstrap, unnecessary to NEWON 7)
+Advertises IG features of Mark 5
+]]></notes>
+ <info name="usage" value="LOAD, press play on tape then RUN. Requires bml3mk5 (uses IG)." />
+ <part name="cass" interface="bml3_cass">
+ <dataarea name="cass" size="4251463">
+ <rom name="igdemo.flac" size="4251463" crc="fb1798b3" sha1="12153998bb6d15c839c8cd185109680ff2f02871"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/bml3_flop.xml b/hash/bml3_flop.xml
index 79351487fbf..59c3e8f5405 100644
--- a/hash/bml3_flop.xml
+++ b/hash/bml3_flop.xml
@@ -3,7 +3,7 @@
<!--
license:CC0-1.0
-Compaibility flags:
+Compatibility flags:
3: needs MP1805 fdc
5: needs MP1802 fdc
@@ -40,20 +40,23 @@ Compaibility flags:
</part>
</software>
- <software name="ma5370" supported="no"><!-- mame crashes in the floppy subsystem -->
- <description>MA5370</description>
+ <software name="ma5370" supported="no">
+ <description>MA-5370 Disk BASIC (Version 1.1)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
+ <notes><![CDATA[
+"Device I/O Error" when FILES is issued.
+]]></notes>
<sharedfeat name="compatibility" value="3" />
<part name="disk" interface="floppy_3">
<dataarea name="flop" size="0x2d2b0">
- <rom name="ma5370.d88" size="0x2d2b0" crc="04bfeb8a" sha1="e273c53286144d2cbdc1a9616945bf2c2f5267d5" />
+ <rom name="ma5370.d88" size="0x2d2b0" crc="ebbd9f99" sha1="052d942af0d5ae97a838f4df96a4d6cf10cc7553" status="baddump" /><!-- all tracks hacked to single density -->
</dataarea>
</part>
</software>
<software name="dbu">
- <description>Disk Basic and Utilities</description>
+ <description>Disk BASIC and Utilities</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<sharedfeat name="compatibility" value="5" />
@@ -64,10 +67,14 @@ Compaibility flags:
</part>
</software>
- <software name="fcg6890">
- <description>FCG6890</description><!-- some kind of graphics package -->
+ <software name="fcg6890" supported="partial">
+ <!-- TODO: find actual title, "Font Character Generator 6890"? -->
+ <description>FCG6890</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
+ <notes><![CDATA[
+Assume optional light pen or mouse support
+]]></notes>
<sharedfeat name="compatibility" value="5" />
<part name="disk" interface="floppy_5_25">
<dataarea name="flop" size="0x54ab0">
@@ -107,7 +114,7 @@ Compaibility flags:
<sharedfeat name="compatibility" value="5" />
<part name="disk" interface="floppy_5_25">
<dataarea name="flop" size="0x54ab0">
- <rom name="tetris.d88" size="0x54ab0" crc="484cf520" sha1="adb4d687e8ace9e35b7bc9f9a20a9cc5c5cf6ae7" />
+ <rom name="subtreas.d88" size="0x54ab0" crc="484cf520" sha1="adb4d687e8ace9e35b7bc9f9a20a9cc5c5cf6ae7" />
</dataarea>
</part>
</software>
diff --git a/hash/c64_cart.xml b/hash/c64_cart.xml
index 6e59f462358..d8d940f9ae1 100644
--- a/hash/c64_cart.xml
+++ b/hash/c64_cart.xml
@@ -297,8 +297,7 @@ license:CC0-1.0
<description>Easy Calc Result (alt)</description>
<year>1985</year>
<publisher>Handic Software</publisher>
- <!--
- -->
+
<part name="cart" interface="c64_cart">
<feature name="slot" value="easycalcres" />
<feature name="game" value="0" />
@@ -429,6 +428,9 @@ license:CC0-1.0
<description>Chase H.Q. 2: Special Criminal Investigation</description>
<year>1990</year>
<publisher>Ocean</publisher>
+ <notes><![CDATA[
+Black screen, self modifies code in the 0x100-0x14f range
+]]></notes>
<part name="cart" interface="c64_cart">
<feature name="slot" value="ocean" />
@@ -500,8 +502,7 @@ license:CC0-1.0
<description>Btx Decoder Modul (Germany)</description>
<year>198?</year>
<publisher>Commodore</publisher>
- <!--
- -->
+
<part name="cart" interface="c64_cart">
<feature name="slot_unsupported" value="btx" />
<feature name="game" value="1" />
@@ -517,8 +518,7 @@ license:CC0-1.0
<description>Btx Decoder Modul II v3.1 (Germany)</description>
<year>198?</year>
<publisher>Commodore</publisher>
- <!--
- -->
+
<part name="cart" interface="c64_cart">
<feature name="slot_unsupported" value="btx" />
<feature name="game" value="1" />
@@ -534,8 +534,7 @@ license:CC0-1.0
<description>Btx Decoder Modul II v3.3 (Germany)</description>
<year>198?</year>
<publisher>Commodore</publisher>
- <!--
- -->
+
<part name="cart" interface="c64_cart">
<feature name="slot_unsupported" value="btx" />
<feature name="game" value="1" />
@@ -653,8 +652,9 @@ license:CC0-1.0
</part>
</software>
+ <!-- TODO: verify region of this and one below, KCS manuals are also in German and Italian -->
<software name="spdsaver" supported="no">
- <description>Speedsaver $C000 (Nld)</description>
+ <description>Speedsaver $C000 (Netherlands?)</description>
<year>1984</year>
<publisher>KCS Dordrecht</publisher>
<part name="cart" interface="c64_cart">
@@ -669,7 +669,7 @@ license:CC0-1.0
</software>
<software name="spdsavrc" supported="no">
- <description>Speedsaver Combi</description>
+ <description>Speedsaver Combi (Netherlands?)</description>
<year>1984</year>
<publisher>KCS Dordrecht</publisher>
<part name="cart" interface="c64_cart">
@@ -880,8 +880,7 @@ license:CC0-1.0
<description>BI-80</description>
<year>1984</year>
<publisher>Batteries Included</publisher>
- <!--
- -->
+
<part name="cart" interface="c64_cart">
<feature name="slot_unsupported" value="bi80" />
<feature name="game" value="1" />
@@ -1717,6 +1716,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Spinnaker Software</publisher>
<info name="serial" value="ABZ-C6" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -1812,6 +1812,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Activision</publisher>
<info name="serial" value="DC-001-04" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -1863,7 +1864,8 @@ license:CC0-1.0
</software>
<software name="blueprnt">
- <description>Blueprint</description> <!-- spelt 'Blueprint' on cart and 'Blueprint', 'Blue-Print' and 'Blue - - Print' on various game screens -->
+ <!-- spelt 'Blueprint' on cart and 'Blueprint', 'Blue-Print' and 'Blue - - Print' on various game screens -->
+ <description>Blueprint</description>
<year>1983</year>
<publisher>Commodore</publisher>
<info name="serial" value="C-64612" />
@@ -2109,10 +2111,14 @@ license:CC0-1.0
</part>
</software>
- <software name="decathln">
+ <software name="decathln" supported="no">
<description>The Activision Decathlon</description>
<year>1983</year>
<publisher>Activision</publisher>
+ <notes><![CDATA[
+Cannot select (s)ingle or (a)ll events, no key press recognized
+]]></notes>
+
<info name="serial" value="DC-004-04" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
@@ -2179,6 +2185,7 @@ license:CC0-1.0
<description>Donkey Kong</description>
<year>1983</year>
<publisher>Atarisoft</publisher>
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -2219,6 +2226,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Commodore</publisher>
<info name="serial" value="C-64???" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -2449,10 +2457,13 @@ license:CC0-1.0
</part>
</software>
- <software name="hero">
+ <software name="hero" supported="partial">
<description>H.E.R.O.: Helicopter Emergency Rescue Operation</description>
<year>1984</year>
<publisher>Activision</publisher>
+ <notes><![CDATA[
+White lines on bottom, off in applying [VIC] GFXMODE=0 to 4 switches
+]]></notes>
<info name="serial" value="DC-003-04" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
@@ -2505,10 +2516,14 @@ license:CC0-1.0
</part>
</software>
- <software name="isoccer">
+ <software name="isoccer" supported="no">
<description>International Soccer</description>
<year>1983</year>
<publisher>Commodore</publisher>
+ <notes><![CDATA[
+Starts a play by pressing any of the function keys, cfr. https://www.c64-wiki.com/wiki/International_Soccer#Controls
+Some erratic chars in playfield [VIC] GFXMODE=1, fixes on soft reset
+]]></notes>
<info name="serial" value="C-64635" />
<!--
ASSY 250423
@@ -2687,11 +2702,15 @@ license:CC0-1.0
</part>
</software>
- <software name="lazarian">
+ <software name="lazarian" supported="no">
<description>Lazarian</description>
<year>1983</year>
<publisher>Commodore</publisher>
+ <notes><![CDATA[
+Fails detecting [VIC] collsion detection at the end of stage 2 "the tunnel of fear"
+]]></notes>
<info name="serial" value="C-64613" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3149,6 +3168,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Activision</publisher>
<info name="serial" value="DC-104-04" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3198,11 +3218,12 @@ license:CC0-1.0
</part>
</software>
- <software name="pitfall2">
+ <software name="pitfall2" supported="yes">
<description>Pitfall II: The Lost Caverns</description>
<year>1984</year>
<publisher>Activision</publisher>
<info name="serial" value="DC-007-04" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3231,6 +3252,7 @@ license:CC0-1.0
<year>1984</year>
<publisher>Activision</publisher>
<info name="serial" value="DC-002-04" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="1" />
@@ -3240,10 +3262,15 @@ license:CC0-1.0
</part>
</software>
- <software name="pitstop" supported="partial">
+ <software name="pitstop" supported="no">
<description>Pitstop</description>
<year>1983</year>
<publisher>Epyx</publisher>
+ <notes><![CDATA[
+Blue strips on title screen in place of tyres, mixes [VIC] GFXMODE=2 and 3
+Broken gameplay gfx, [VIC] GFXMODE=3
+]]></notes>
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3253,10 +3280,11 @@ license:CC0-1.0
</part>
</software>
- <software name="pitstop1" cloneof="pitstop">
+ <software name="pitstop1" cloneof="pitstop" supported="no">
<description>Pitstop (alt)</description>
<year>1983</year>
<publisher>Epyx</publisher>
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3271,6 +3299,7 @@ license:CC0-1.0
<year>1983</year>
<publisher>Atarisoft</publisher>
<info name="serial" value="RX8536" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3284,6 +3313,7 @@ license:CC0-1.0
<description>Popeye</description>
<year>1983</year>
<publisher>Parker Brothers</publisher>
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3293,7 +3323,7 @@ license:CC0-1.0
</part>
</software>
- <software name="princess">
+ <software name="princess" supported="yes">
<description>Princess and the Frog</description>
<year>1983</year>
<publisher>Romox</publisher>
@@ -3516,10 +3546,15 @@ license:CC0-1.0
</part>
</software>
- <software name="riveraid">
+ <software name="riveraid" supported="no">
<description>River Raid</description>
<year>1984</year>
<publisher>Activision</publisher>
+ <notes><![CDATA[
+Glitchy [VIC] status bar GFXMODE switches on gameplay
+]]></notes>
+ <info name="usage" value="Requires joystick in port 1" />
+
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -3706,10 +3741,14 @@ license:CC0-1.0
</part>
</software>
- <software name="spaceric">
+ <software name="spaceric" supported="no">
<description>Space Ric-o-Shay</description>
<year>1983</year>
<publisher>Mr. Computer</publisher>
+ <notes><![CDATA[
+Erratic [VIC] collsion detection, will kill player(s) once gameplay starts
+Starts a 2 players game even if 1p is chosen?
+]]></notes>
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="1" />
@@ -4163,11 +4202,15 @@ license:CC0-1.0
</part>
</software>
- <software name="zonerngr">
+ <software name="zonerngr" supported="no">
<description>Zone Ranger</description>
<year>1984</year>
<publisher>Activision</publisher>
+ <notes><![CDATA[
+Erratic [VIC] collsion detection, warps and invincibility bonuses can kill player instead.
+]]></notes>
<info name="serial" value="DC-101-04" />
+ <info name="usage" value="Requires joystick in port 1" />
<part name="cart" interface="c64_cart">
<feature name="exrom" value="0" />
<feature name="game" value="0" />
@@ -4432,7 +4475,8 @@ license:CC0-1.0
<software name="narco">
<description>Narco Police</description>
- <year>19??</year>
+ <!-- Released in '90 or '91 -->
+ <year>199?</year>
<publisher>Dinamic Software</publisher>
<part name="cart" interface="c64_cart">
<feature name="slot" value="dinamic" />
@@ -7214,7 +7258,7 @@ license:CC0-1.0
</part>
</software>
- <software name="music64">
+ <software name="music64" supported="no">
<description>Wersiboard Music 64</description>
<year>1985</year>
<publisher>Wersi</publisher>
diff --git a/hash/c64_cass.xml b/hash/c64_cass.xml
index 06d6b42f6d1..15134740efc 100644
--- a/hash/c64_cass.xml
+++ b/hash/c64_cass.xml
@@ -4273,7 +4273,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
</software>
<software name="dragonso">
- <description>Dragons of Flame</description>
+ <description>Advanced Dungeons &amp; Dragons - Dragons of Flame</description>
<year>1990</year>
<publisher>U.S. Gold</publisher>
@@ -12131,7 +12131,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
</software>
<software name="rivrresca" cloneof="rivrresc">
- <description>River Rescue (Alternative)</description>
+ <description>River Rescue (Alternative Software)</description>
<year>1987</year>
<publisher>Alternative Software</publisher>
@@ -16159,7 +16159,7 @@ Some are based on the C64 Tape Archive at https://archive.org/download/c64tapes/
</software>
<software name="whodare2a" cloneof="whodare2">
- <description>Who Dares Wins II (Alternative)</description>
+ <description>Who Dares Wins II (Alternative Software)</description>
<year>1988</year>
<publisher>Alternative Software</publisher>
diff --git a/hash/c64_flop_orig.xml b/hash/c64_flop_orig.xml
index a49278e1264..18cbf26720c 100644
--- a/hash/c64_flop_orig.xml
+++ b/hash/c64_flop_orig.xml
@@ -19,10 +19,13 @@ license:CC0-1.0
</part>
</software>
- <software name="barbaria">
+ <software name="barbaria" supported="no">
<description>Barbarian: The Ultimate Warrior</description>
<year>1988</year>
<publisher>Melbourne House</publisher>
+ <notes><![CDATA[
+Fails to LOAD "$",8
+]]></notes>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="333744">
<rom name="barbarian[melbourne_house_1988].g64" size="333744" crc="db28e401" sha1="c8d6027dee3ddfab8adc5e352f201afb0c59d518"/>
@@ -34,6 +37,10 @@ license:CC0-1.0
<description>Basil: The Great Mouse Detective</description>
<year>1987</year>
<publisher>Gremlin Graphics</publisher>
+ <notes><![CDATA[
+LOAD "BASIL",8,1
+Black screen after load, hangs with CIA-2 $DD00 bit 7 stuck high (side effect of protection gone wrong?)
+]]></notes>
<info name="protection" value="cyan" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="333744">
@@ -42,10 +49,14 @@ license:CC0-1.0
</part>
</software>
- <software name="bionicco">
+ <software name="bionicco" supported="no">
<description>Bionic Commando</description>
<year>1988</year>
<publisher>Capcom</publisher>
+ <notes><![CDATA[
+LOAD "BIONIC",8,1
+Fails loading
+]]></notes>
<info name="video" value="PAL" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="333744">
@@ -58,6 +69,7 @@ license:CC0-1.0
<description>Boulder Dash</description>
<year>1984</year>
<publisher>First Star</publisher>
+ <info name="usage" value="Requires joystick in port 1" />
<info name="video" value="PAL" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="333744">
@@ -66,10 +78,15 @@ license:CC0-1.0
</part>
</software>
- <software name="bbsb">
+ <software name="bbsb" supported="no">
<description>Bounty Bob Strikes Back! (v1.2)</description>
<year>1985</year>
<publisher>Big Five</publisher>
+ <notes><![CDATA[
+LOAD "BBSB",8,1
+Fails to LOAD "$",8 first time around, requires LOAD "*",8 first
+Eventually goes "CHECKSUM ERROR! LOAD ABORTED!" on bootstrap
+]]></notes>
<info name="protection" value="halftrack" />
<sharedfeat name="compatibility" value="NTSC,PAL"/>
@@ -82,22 +99,13 @@ license:CC0-1.0
</part>
</software>
- <software name="buddy64">
- <description>Buddy System 64 v10</description>
- <year>1992</year>
- <publisher>Chris Miller</publisher>
- <info name="protection" value="none" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="buddy64.g64" size="333744" crc="986d5e3d" sha1="3aeedd8e4e9c7a9412144fa5f7930e3492b79d33" offset="0"/>
- </dataarea>
- </part>
- </software>
-
<software name="commando">
<description>Commando</description>
<year>1985</year>
<publisher>Elite</publisher>
+ <notes><![CDATA[
+LOAD "COMMANDO",8,1
+]]></notes>
<info name="video" value="PAL" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="333744">
@@ -110,6 +118,10 @@ license:CC0-1.0
<description>Defender of the Crown</description>
<year>1987</year>
<publisher>Cinemaware</publisher>
+ <notes><![CDATA[
+LOAD "*",8,1
+Gets stuck at a "V-MAX!" screen
+]]></notes>
<info name="protection" value="vmaxv2" />
<sharedfeat name="compatibility" value="NTSC,PAL"/>
@@ -128,10 +140,28 @@ license:CC0-1.0
</part>
</software>
- <software name="grnberet">
+ <software name="elktrgld">
+ <!-- Flippy disk, a800 version on side B -->
+ <description>Elektra Glide</description>
+ <year>1986</year>
+ <publisher>Mastertronic</publisher>
+ <info name="serial" value="64712" />
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="287512">
+ <rom name="elektraglide.g64" size="287512" crc="ccb7b7c1" sha1="699bc6111a0f3c26d61c63f7b23eeb7462649461"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grnberet" supported="no">
<description>Green Beret</description>
<year>1986</year>
<publisher>Ocean</publisher>
+ <notes><![CDATA[
+LOAD "0:*",8,1
+Never leaves BASIC
+]]></notes>
<info name="video" value="PAL" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="333744">
@@ -152,6 +182,279 @@ license:CC0-1.0
</part>
</software>
+ <software name="jacknpr" supported="no">
+ <description>Jack the Nipper</description>
+ <year>1986</year>
+ <publisher>Gremlin Graphics</publisher>
+ <notes><![CDATA[
+LOAD "*",8,1
+Punts to BASIC
+]]></notes>
+ <info name="video" value="PAL" />
+ <info name="protection" value="cyan" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="jack_the_nipper[gremlin_1986](cyan1)(pal).g64" size="333744" crc="14c6f53d" sha1="6427cc16ed360890034f84182a9db02b2e568f0a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="miamivic" supported="no">
+ <description>Miami Vice</description>
+ <year>1986</year>
+ <publisher>Ocean</publisher>
+ <notes><![CDATA[
+LOAD "*",8,1
+Punts to BASIC
+]]></notes>
+ <info name="video" value="PAL" />
+ <info name="protection" value="cyan" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="miami_vice[ocean_1986](cyan1)(pal).g64" size="333744" crc="b3556e0c" sha1="ed1d290baf83f0ad31424a4e11f4f2aef8515dbb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mule">
+ <description>M.U.L.E.</description>
+ <year>1983</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="protection" value="fat" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="mule[ea_1983].g64" size="333744" crc="9c5adfdd" sha1="8b894a5be8ef2e0cfded4e20cf0c7e6c9c68e369"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambo2" supported="no">
+ <description>Rambo: First Blood Part II</description>
+ <year>1985</year>
+ <publisher>Ocean</publisher>
+ <notes><![CDATA[
+LOAD "0:*",8,1
+Locks up during boot
+]]></notes>
+ <info name="video" value="PAL" />
+ <info name="protection" value="xrom" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="rambo[ocean_1985](pal).g64" size="333744" crc="e9e186dd" sha1="ce2c06cf341c629e75ae6e47887f2aab635f9340"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambo2n" cloneof="rambo2" supported="no">
+ <description>Rambo: First Blood Part II (NTSC)</description>
+ <year>1985</year>
+ <publisher>Thunder Mountain</publisher>
+ <notes><![CDATA[
+LOAD "0:*",8,1
+Hangs on loading transition between trademarks and title
+]]></notes>
+ <info name="video" value="NTSC" />
+ <info name="protection" value="signature" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="rambo_first_blood_part_ii[thunder_mtn_1985](ntsc).g64" size="333744" crc="f1e99142" sha1="8263d6eecd017468d505891b3546b80f7cc4989f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambo3" supported="no">
+ <description>Rambo III (PAL)</description>
+ <year>1988</year>
+ <publisher>Ocean</publisher>
+ <notes><![CDATA[
+LOAD "0:*",8,1
+Punts to BASIC
+]]></notes>
+ <info name="video" value="PAL" />
+ <info name="protection" value="ocean" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="333744">
+ <rom name="rambo_iii_s1[ocean_1988](pal).g64" size="333744" crc="6f2ea02d" sha1="69ff02b03e4e4b5957b12fba4ea0a4e06172727e"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="333744">
+ <rom name="rambo_iii_s2[ocean_1988](pal).g64" size="333744" crc="82f55d97" sha1="e55bfb001feb2f09c33ec57a1400c659bf1e2e7e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambo3n" cloneof="rambo3" supported="no">
+ <description>Rambo III (NTSC)</description>
+ <year>1989</year>
+ <publisher>Taito</publisher>
+ <info name="video" value="NTSC" />
+ <info name="protection" value="vmax3" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="rambo_iii[taito_1989](vmax3).g64" size="333744" crc="8e34cbc7" sha1="a83030d9a46a5a7a33b9cfedf6adf0b778f7262b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sthassle" supported="no">
+ <description>Street Hassle</description>
+ <year>1987</year>
+ <publisher>Melbourne House</publisher>
+ <notes><![CDATA[
+LOAD "*",8,1
+Part of player sprite draws transparent (collisions still works)
+]]></notes>
+ <info name="video" value="PAL" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="street_hassle[melbourne_house_1987](pal).g64" size="333744" crc="92c15c93" sha1="a1bc536294ae1d36ffde644798dc25cd1d514c93"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spoker" supported="no">
+ <description>Strip Poker</description>
+ <year>1984</year>
+ <publisher>Artworx</publisher>
+ <notes><![CDATA[
+None of the files on disk leaves BASIC
+]]></notes>
+ <info name="video" value="PAL" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="strip_poker[artworx_1984](pal).g64" size="333744" crc="4a66bc83" sha1="68d66ee9f357c3964303e94c625ff9587f5df7c2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="terramex" supported="no">
+ <description>Terramex</description>
+ <year>1988</year>
+ <publisher>Grand Slam</publisher>
+ <notes><![CDATA[
+LOAD "*",8,1
+Crashes at the end of loading sequence
+]]></notes>
+ <info name="video" value="PAL" />
+ <info name="protection" value="custom_dos" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="333744">
+ <rom name="terramex_s1[grandslam_1988].g64" size="333744" crc="cc38f968" sha1="985eb00dcda7cb2499120b1801ca18df5cf2827e"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="333744">
+ <rom name="terramex_s2[grandslam_1988].g64" size="333744" crc="78408a59" sha1="f23fdea7292a95b076cc0a23c81e2e214e42129a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toutrun" supported="no">
+ <description>Turbo Out Run</description>
+ <year>1989</year>
+ <publisher>U.S. Gold</publisher>
+ <notes><![CDATA[
+LOAD "*",8,1
+Punts to BASIC
+]]></notes>
+ <info name="video" value="PAL" />
+ <info name="protection" value="sload" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="333744">
+ <rom name="turbo_out_run_s1[us_gold_1989](pal).g64" size="333744" crc="3ab79f79" sha1="47ac893f0c53f10c455fb10b4221fc1c51b0f3c5"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="flop" size="333744">
+ <rom name="turbo_out_run_s2[us_gold_1989](pal).g64" size="333744" crc="fda9e331" sha1="56da1a1a2d88bf63fda41096fc9d839e0cc5877b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Compilations -->
+
+ <software name="gameset" supported="no">
+ <description>Game Set and Match</description>
+ <year>1987</year>
+ <publisher>Ocean</publisher>
+ <notes><![CDATA[
+LOAD "0:*",8,1
+Fails loading at least first two games
+Not extensively tested
+]]></notes>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 1"/>
+ <dataarea name="flop" size="333744">
+ <rom name="game_set_and_match_s1[ocean_1987].g64" size="333744" crc="ca84a09e" sha1="fdd4246db837d74ef136d2c72895c04915384146"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side 2"/>
+ <dataarea name="flop" size="333744">
+ <rom name="game_set_and_match_s2[ocean_1987].g64" size="333744" crc="85ba1688" sha1="b41e55eca81067d4499e0201454ccbaaec70b672"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 1"/>
+ <dataarea name="flop" size="333744">
+ <rom name="game_set_and_match_s3[ocean_1987].g64" size="333744" crc="c8053e01" sha1="7ae5d1225a8613ea70e8dd2c8d5a3008e3ea4c13"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side 2"/>
+ <dataarea name="flop" size="333744">
+ <rom name="game_set_and_match_s4[ocean_1987].g64" size="333744" crc="d775e8bb" sha1="6df6c56ff5202544a1075d7966e52b046da2dcaf"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Applications -->
+
+ <software name="basickaa">
+ <description>BASIC-kääntäjä (Finland)</description>
+ <year>1984</year>
+ <publisher>Amersoft</publisher>
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="basic-kaantaja[amersoft_1984].g64" size="333744" crc="68ffade3" sha1="951e63d05c0911abcc247ff8327b7239fc0c9e86"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="buddy64">
+ <description>Buddy System 64 (v10)</description>
+ <year>1992</year>
+ <publisher>Chris Miller</publisher>
+ <info name="protection" value="none" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="buddy64.g64" size="333744" crc="986d5e3d" sha1="3aeedd8e4e9c7a9412144fa5f7930e3492b79d33" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sprbas64">
+ <description>SuperBase 64 (Finland)</description>
+ <year>1983</year>
+ <publisher>Precision</publisher>
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="333744">
+ <rom name="superbase_64[precision_1983](finnish).g64" size="333744" crc="83eb8f50" sha1="2cff03d08f15f8d66fad9d20233fc4d87f71395c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- diskmags -->
+
<software name="input64_22">
<description>INPUT 64 10/86</description>
<year>1986</year>
@@ -486,241 +789,8 @@ license:CC0-1.0
</part>
</software>
- <software name="jacknpr" supported="no">
- <description>Jack the Nipper</description>
- <year>1986</year>
- <publisher>Gremlin Graphics</publisher>
- <info name="video" value="PAL" />
- <info name="protection" value="cyan" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="jack_the_nipper[gremlin_1986](cyan1)(pal).g64" size="333744" crc="14c6f53d" sha1="6427cc16ed360890034f84182a9db02b2e568f0a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="miamivic" supported="no">
- <description>Miami Vice</description>
- <year>1986</year>
- <publisher>Ocean</publisher>
- <info name="video" value="PAL" />
- <info name="protection" value="cyan" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="miami_vice[ocean_1986](cyan1)(pal).g64" size="333744" crc="b3556e0c" sha1="ed1d290baf83f0ad31424a4e11f4f2aef8515dbb"/>
- </dataarea>
- </part>
- </software>
-
- <software name="mule">
- <description>M.U.L.E.</description>
- <year>1983</year>
- <publisher>Electronic Arts</publisher>
- <info name="protection" value="fat" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="mule[ea_1983].g64" size="333744" crc="9c5adfdd" sha1="8b894a5be8ef2e0cfded4e20cf0c7e6c9c68e369"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rambo2" supported="no">
- <description>Rambo: First Blood Part II</description>
- <year>1985</year>
- <publisher>Ocean</publisher>
- <info name="video" value="PAL" />
- <info name="protection" value="xrom" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="rambo[ocean_1985](pal).g64" size="333744" crc="e9e186dd" sha1="ce2c06cf341c629e75ae6e47887f2aab635f9340"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rambo2n" cloneof="rambo2" supported="no">
- <description>Rambo: First Blood Part II (NTSC)</description>
- <year>1985</year>
- <publisher>Thunder Mountain</publisher>
- <info name="video" value="NTSC" />
- <info name="protection" value="signature" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="rambo_first_blood_part_ii[thunder_mtn_1985](ntsc).g64" size="333744" crc="f1e99142" sha1="8263d6eecd017468d505891b3546b80f7cc4989f"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rambo3" supported="no">
- <description>Rambo III</description>
- <year>1988</year>
- <publisher>Ocean</publisher>
- <info name="video" value="PAL" />
- <info name="protection" value="ocean" />
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="333744">
- <rom name="rambo_iii_s1[ocean_1988](pal).g64" size="333744" crc="6f2ea02d" sha1="69ff02b03e4e4b5957b12fba4ea0a4e06172727e"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="333744">
- <rom name="rambo_iii_s2[ocean_1988](pal).g64" size="333744" crc="82f55d97" sha1="e55bfb001feb2f09c33ec57a1400c659bf1e2e7e"/>
- </dataarea>
- </part>
- </software>
-
- <software name="rambo3n" cloneof="rambo3" supported="no">
- <description>Rambo III (NTSC)</description>
- <year>1989</year>
- <publisher>Taito</publisher>
- <info name="video" value="NTSC" />
- <info name="protection" value="vmax3" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="rambo_iii[taito_1989](vmax3).g64" size="333744" crc="8e34cbc7" sha1="a83030d9a46a5a7a33b9cfedf6adf0b778f7262b"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sthassle">
- <description>Street Hassle</description>
- <year>1987</year>
- <publisher>Melbourne House</publisher>
- <info name="video" value="PAL" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="street_hassle[melbourne_house_1987](pal).g64" size="333744" crc="92c15c93" sha1="a1bc536294ae1d36ffde644798dc25cd1d514c93"/>
- </dataarea>
- </part>
- </software>
-
- <software name="spoker">
- <description>Strip Poker</description>
- <year>1984</year>
- <publisher>Artworx</publisher>
- <info name="video" value="PAL" />
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="strip_poker[artworx_1984](pal).g64" size="333744" crc="4a66bc83" sha1="68d66ee9f357c3964303e94c625ff9587f5df7c2"/>
- </dataarea>
- </part>
- </software>
-
- <software name="terramex" supported="no">
- <description>Terramex</description>
- <year>1988</year>
- <publisher>Grand Slam</publisher>
- <info name="video" value="PAL" />
- <info name="protection" value="custom_dos" />
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="333744">
- <rom name="terramex_s1[grandslam_1988].g64" size="333744" crc="cc38f968" sha1="985eb00dcda7cb2499120b1801ca18df5cf2827e"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="333744">
- <rom name="terramex_s2[grandslam_1988].g64" size="333744" crc="78408a59" sha1="f23fdea7292a95b076cc0a23c81e2e214e42129a"/>
- </dataarea>
- </part>
- </software>
-
- <software name="toutrun" supported="no">
- <description>Turbo Out Run</description>
- <year>1989</year>
- <publisher>U.S. Gold</publisher>
- <info name="video" value="PAL" />
- <info name="protection" value="sload" />
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Side A"/>
- <dataarea name="flop" size="333744">
- <rom name="turbo_out_run_s1[us_gold_1989](pal).g64" size="333744" crc="3ab79f79" sha1="47ac893f0c53f10c455fb10b4221fc1c51b0f3c5"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Side B"/>
- <dataarea name="flop" size="333744">
- <rom name="turbo_out_run_s2[us_gold_1989](pal).g64" size="333744" crc="fda9e331" sha1="56da1a1a2d88bf63fda41096fc9d839e0cc5877b"/>
- </dataarea>
- </part>
- </software>
-
- <!-- Compilations -->
-
- <software name="gameset">
- <description>Game Set and Match</description>
- <year>1987</year>
- <publisher>Ocean</publisher>
- <part name="flop1" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 1"/>
- <dataarea name="flop" size="333744">
- <rom name="game_set_and_match_s1[ocean_1987].g64" size="333744" crc="ca84a09e" sha1="fdd4246db837d74ef136d2c72895c04915384146"/>
- </dataarea>
- </part>
- <part name="flop2" interface="floppy_5_25">
- <feature name="part_id" value="Disk 1 Side 2"/>
- <dataarea name="flop" size="333744">
- <rom name="game_set_and_match_s2[ocean_1987].g64" size="333744" crc="85ba1688" sha1="b41e55eca81067d4499e0201454ccbaaec70b672"/>
- </dataarea>
- </part>
- <part name="flop3" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 1"/>
- <dataarea name="flop" size="333744">
- <rom name="game_set_and_match_s3[ocean_1987].g64" size="333744" crc="c8053e01" sha1="7ae5d1225a8613ea70e8dd2c8d5a3008e3ea4c13"/>
- </dataarea>
- </part>
- <part name="flop4" interface="floppy_5_25">
- <feature name="part_id" value="Disk 2 Side 2"/>
- <dataarea name="flop" size="333744">
- <rom name="game_set_and_match_s4[ocean_1987].g64" size="333744" crc="d775e8bb" sha1="6df6c56ff5202544a1075d7966e52b046da2dcaf"/>
- </dataarea>
- </part>
- </software>
-
- <!-- Applications -->
-
- <software name="basickaa">
- <description>BASIC-kääntäjä (Finland)</description>
- <year>1984</year>
- <publisher>Amersoft</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="basic-kaantaja[amersoft_1984].g64" size="333744" crc="68ffade3" sha1="951e63d05c0911abcc247ff8327b7239fc0c9e86"/>
- </dataarea>
- </part>
- </software>
-
- <software name="sprbas64">
- <description>SuperBase 64 (Finland)</description>
- <year>1983</year>
- <publisher>Precision</publisher>
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="333744">
- <rom name="superbase_64[precision_1983](finnish).g64" size="333744" crc="83eb8f50" sha1="2cff03d08f15f8d66fad9d20233fc4d87f71395c"/>
- </dataarea>
- </part>
- </software>
-
<!-- Educational -->
- <software name="elktrgld">
- <!-- Flippy disk, a800 version on side B -->
- <description>Elektra Glide</description>
- <year>1986</year>
- <publisher>Mastertronic</publisher>
- <info name="serial" value="64712" />
-
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="287512">
- <rom name="elektraglide.g64" size="287512" crc="ccb7b7c1" sha1="699bc6111a0f3c26d61c63f7b23eeb7462649461"/>
- </dataarea>
- </part>
- </software>
-
<software name="koalapnt">
<!-- Flippy disk, a800 version on side B -->
<description>KoalaPainter (Light Pen)</description>
diff --git a/hash/casio_rompack.xml b/hash/casio_rompack.xml
index 1a778743f5e..55a7af5464f 100644
--- a/hash/casio_rompack.xml
+++ b/hash/casio_rompack.xml
@@ -11,481 +11,2248 @@ license:CC0-1.0
MT-18, MT-28, MT-85, MT-86, MT-88, MT-800, MT-820, MT-830, CT-800, CT-805, CT-810, CT-840,
SK-8, SK-8A, KS-03, KS-02 and the DH-280 and DH-800 digital horns.
- +=========+====+======================================================+===+
- |PACK |YEAR|TITLE DUMPED|
- +=========+====+======================================================+===+
- | JAPANESE ROM PACKS |
- +=========+====+======================================================+===+
- |RO-101 |19??|The Hit Parade | NO|
- |RO-102 |19??|Hit Songs | NO|
- |RO-103 |19??|New Music [1] | NO|
- |RO-104 |19??|Enka [1] | NO|
- |RO-105 |19??|New Music [5] | NO|
- |RO-106 |19??|Enka Vol.2 | NO|
- |RO-107 |19??|New Music [2] | NO|
- |RO-108 |19??|Enka [3] | NO|
- |RO-109 |19??|New Music [4] | NO|
- |RO-110 |19??|Easy Listening [3] | NO|
- |RO-111 |19??|Enka [4] | NO|
- |RO-113 |19??|Young Best Hits | NO|
- |RO-114 |19??|Enka [5] | NO|
- |RO-116 |19??|Young Hits [2] | NO|
- |RO-117 |19??|New Music [5] | NO|
- |RO-118 |19??|Screen Themes [3] | NO|
- |RO-119 |19??|Children's Songs [3] | NO|
- |RO-121N |19??|Enjoy Chord Guide | NO|
- |RO-122Y |19??|Young Best Hits [2] | NO|
- |RO-124Y |19??|Young Best Hits [6] | NO|
- |RO-125E |19??|Enka [9] | NO|
- |RO-126Y |19??|Young Best Hits [7] | NO|
- |RO-127E |19??|Enka [11] | NO|
- |RO-128P |19??|Oldies | NO|
- |RO-129E |19??|Enka [12] | NO|
- |RO-130Y |19??|Young Best Hits [10] | NO|
- |RO-131Y |19??|New Music Best [1] | NO|
- |RO-132Y |19??|New Music Best [2] | NO|
- |RO-133E |19??|Introduction to Karaoke Hits [1] | NO|
- |RO-151 |19??|Paul Mauriat | NO|
- |RO-152 |19??|Enka | NO|
- |RO-153 |19??|Diamond Pupils | NO|
- |RO-155 |19??|Anime | NO|
- |RO-156 |19??|Fun Keyboard Lessons | NO|
- |RO-157 |19??|Kayokyoku | NO|
- |RO-158 |19??|Songs for Children [1] | NO|
- |RO-159 |19??|Children's Songs | NO|
- |RO-162 |19??|Anime [2] | NO|
- |RO-163 |19??|Pops | NO|
- |RO-164 |19??|Play with Pack-chan | NO|
- |RO-165 |19??|Fun Keyboard Lessons | NO|
- |RO-166 |19??|Animation Themes [3] | NO|
- |RO-167K |19??|Children's Songs [6] | NO|
- |RO-168K |19??|Children's Songs [7] | NO|
- |RO-169A |19??|Animation Themes [4] | NO|
- |RO-170A |19??|Animation Themes [5] | NO|
- |RO-171l |19??|Event Songs | NO|
- |RO-172G |19??|Game Music | NO|
- |RO-173Y |19??|Young Hits [3] | NO|
- |RO-174Y |19??|Young Hits [4] | NO|
- |RO-175K |19??|Children's Songs [8] | NO|
- |RO-176Y |19??|Young Hits [5] | NO|
- |RO-177K |19??|Children's Songs [9] | NO|
- |RO-178A |19??|Animation Themes [6] | NO|
- |RO-179K |19??|Childrens' Songs [10] | NO|
- |RO-180X |19??|Christmas Songs [2] | NO|
- |RO-181S |19??|Standards [2] | NO|
- |RO-182B |19??|Beatles [2] | NO|
- |RO-183C |19??|Comic Songs | NO|
- |RO-184T |19??|Elementary School Music [1] | NO|
- |RO-185T |19??|Elementary School Music [2] | NO|
- |RO-186T |19??|Elementary School Music [3] | NO|
- |RO-188Y |19??|Young Hits [6] | NO|
- |RO-189A |19??|Animation Themes [7] | NO|
- |RO-190K |19??|Children's Songs [12] | NO|
- |RO-191Y |19??|Young Best Hits [8] | NO|
- |RO-192Y |19??|Young Best Hits [9] | NO|
- |RO-193Y |19??|Young Hits [7] | NO|
- |RO-195G |19??|Game Music [2] | NO|
- |RO-196G |19??|Children's Songs [13] | NO|
- |RO-581 |19??|Family Selection | NO|
- |RO-582 |19??|DH Tunes & Rhythms | NO|
- |RO-584 |19??|Intro Address Pack (?) | NO|
- |RO-601E |19??|Enka [6] | NO|
- |RO-602Y |19??|Young Best Hits [3] | NO|
- |RO-603P |19??|Pops [2] | NO|
- |RO-604E |19??|Enka [7] | NO|
- |RO-605Y |19??|Young Best Hits [4] | NO|
- |RO-606K |19??|Songs for Children [4] | NO|
- |RO-607K |19??|Children's Songs [5] | NO|
- |RO-608Y |19??|Young Best Hits [5] | NO|
- |RO-609K |19??|Children's Songs Best [1] | NO|
- |RO-610K |19??|Children's Songs Best [2] | NO|
- |RO-611K |19??|Children's Songs Best [3] | NO|
- |RO-612K |19??|Children's Songs Best [4] | NO|
- |RO-613A |19??|Animation Themes [8] | NO|
- |RO-614Y |19??|Young Best Hits [11] | NO|
- |RO-615A |19??|Animation Themes [9] | NO|
- |RO-616Y |19??|Young Best Hits [12] | NO|
- |RO-617Y |19??|Young Best Hits [13] | NO|
- |RO-618K |19??|Mother and Child TV Songs | NO|
- |RO-701 |19??|Sound Kids 'Excitement'(?) [1] | NO|
- |RO-702 |19??|Sound Kids 'Excitement'(?) [2] | NO|
- |RO-703 |19??|Sound Kids 'Excitement'(?) [3] | NO|
- |RO-704 |19??|Sound Kids 'Excitement'(?) [4] | NO|
- |RO-705 |19??|Sound Kids - Anime Songs [1] | NO|
- |RO-706 |19??|Sound Kids - Hit Songs [1] | NO|
- |RO-708 |19??|Sound Kids - Hit Songs [2] | NO|
- |RO-801F |1990|Fusion | NO|
- |RO-802E |1990|Enka [10] | NO|
- |RO-803S |1990|Standards | NO|
- |RO-804M |1990|Digital Horn Lessons | NO|
- +=========+====+======================================================+===+
- | WORLD ROM PACKS |
- +=========+====+======================================================+===+
- |RO-201 |1983|Fun with your Casio Keyboard | NO|
- |RO-202? |19??|Movie Themes | NO|
- |RO-203? |19??|Rock On | NO|
- |RO-204 |198?|Supergroups | NO|
- |RO-251 |1984|How to Play your Casio ROM Keyboard |YES|
- |RO-252 |1986|Film Classics | NO|
- |RO-253 |1986|Pop/Rock | NO|
- |RO-254 |1984|Movie Pops | NO|
- |RO-255 |1986|Rock On |YES|
- |RO-256 |1985|Top Pops | NO|
- |RO-257 |1985|Super Songs |YES|
- |RO-258 |1985|Latin Hits |YES|
- |RO-259 |1985|Pop Hits | NO|
- |RO-260 |1985|Music Collection |YES|
- |RO-261 |1985|Pop Selection |YES|
- |RO-262 |1986|Country Greats |YES|
- |RO-263 |1986|Hymns & Gospel | NO|
- |RO-264 |1986|Pop Country | NO|
- |RO-265 |1986|Pop Superstars |YES|
- |RO-266 |1988|Songs for Children | NO|
- |RO-268 |1986|Golden Hits | NO|
- |RO-269 |1986|Rhythm and Blues | NO|
- |RO-270 |1988|Christmas |YES|
- |RO-271 |1986|Beatles No.1 Hits | NO|
- |RO-272 |1987|Rock & Roll Classics |YES|
- |RO-273 |1987|Best of Motown | NO|
- |RO-274 |1987|Hot Pop & Rock |YES|
- |RO-275 |1987|Today's Superstars | NO|
- |RO-276 |1987|T.V. Tunes |YES|
- |RO-277 |1988|When You Wish Upon A Star and Other Disney Movie Songs| NO|
- |RO-278 |1987|Songs of Sesame Street | NO|
- |RO-279 |1988|Solid Gold Rock & Pop | NO|
- |RO-280 |1988|Star-Studded Rock | NO|
- |RO-281 |1988|Chartbusting Pop | NO|
- |RO-282 |198?|New Kids on the Block Greatest Hits | NO|
- |RO-301 |1983|Popular Hits | NO|
- |RO-302 |1983|Latin | NO|
- |RO-303 |1983|Easy Listening | NO|
- |RO-351 |1984|Best of Carpenters | NO|
- |RO-352 |1985|All Time Movie Hits | NO|
- |RO-353 |1985|Beatles | NO|
- |RO-354 |1985|Pop Themes | NO|
- |RO-355 |1984|Great Standards / Jazz Standards |YES|
- |RO-356 |1985|Disney Movie Magic | NO|
- |RO-357 |19??|Christmas Songs | NO|
- |RO-451 |198?|Chinese Folk Songs | NO|
- |RO-452 |198?|Most Popular Songs | NO|
- |RO-453 II|198?|Arabian Nights | NO|
- |RO-454 |1991|Popular Hindi Film Songs |YES|
- |RO-456 |198?|Beautiful Arabian Music | NO|
- |RO-457 |198?|Arabian Song Selections | NO|
- |RO-458 |198?|Dongge Golden Melodies 1 | NO|
- |RO-459 |198?|Dongge Golden Melodies 2 | NO|
- |RO-460 |198?|Popular Mandarin Songs | NO|
- |RO-461 |198?|Taiwanese Classic Songs | NO|
- |RO-462 |198?|Les Antilles: Misik An Nou (The Antilles: Our Music) | NO|
- |RO-551 |198?|World Songs |YES|
- |RO-552 |198?|Classic | NO|
- |RO-553 |1984|Have Fun with Hopsie! | NO|
- |RO-554 |198?|Family Songs |YES|
- |RO-555 |198?|Home Melodies | NO|
- |RO-556 |198?|DH Songs & Rhythms | NO|
- |RO-557 |198?|Family Collection | NO|
- |RO-558 |198?|Kids Selection | NO|
- |RO-559 |1990|New Kids on the Block Greatest Hits | NO|
- |RO-560 |1990|New Kids on the Block Greatest Hits | NO|
- +=========+====+======================================================+===+
+ ==============================================================================================
+ MISSING DUMPS
+ ==============================================================================================
+ JAPANESE ROM PACKS
+ ==============================================================================================
+ RO-104 19?? Enka Vol.1 Karaoke Hit-shū
+ RO-105 19?? New Music 2
+ RO-107 19?? New Music 3
+ RO-109 1984 New Music 4
+ RO-116 1985 Young Hits 2
+ RO-117 1985 New Music 5
+ RO-121N 1986 Casio Keyboard Nyuumon III, Enjoy Chord Guide
+ RO-122Y 1986 Young Best Hits 2
+ RO-124Y 1988 Young Best Hits 6
+ RO-126Y 1989 Young Best Hits 7
+ RO-127E 19?? Enka 11
+ RO-128P 19?? Oldies
+ RO-129E 19?? Enka 12
+ RO-130Y 19?? Young Best Hits 10
+ RO-131Y 19?? New Music Best 1
+ RO-132Y 1992 New Music Best 2
+ RO-133E 1992 Karaoke Hit Nyuumon 1
+ RO-156 19?? Casio Keyboard Nyuumon II, Tanoshii Keyboard Lesson
+ RO-157 19?? Kayokyoku
+ RO-159 19?? Kodomo no Uta 2
+ RO-163 1985 Pops
+ RO-164 1985 Casio Keyboard Nyuumon I, Pack-chan to Asobou
+ RO-165 1985 Casio Keyboard Nyuumon II, Tanoshii Keyboard Lesson
+ RO-167K 1988 Kodomo no Uta 6
+ RO-168K 1988 Kodomo no Uta 7
+ RO-173Y 19?? Young Hits 3
+ RO-174Y 19?? Young Hits 4
+ RO-175K 19?? Kodomo no Uta 8, Pikkapika Ongakukan
+ RO-176Y 19?? Young Hits 5
+ RO-177K 19?? Kodomo no Uta 9
+ RO-179K 19?? Kodomo no Uta 10
+ RO-187K 1989 Kodomo no Uta 11
+ RO-188Y 19?? Young Hits 6
+ RO-190K 19?? Kodomo no Uta 12, Pikkapika Ongakukan 2
+ RO-193Y 19?? Young Hits 7
+ RO-195G 19?? Game Music 2
+ RO-196K 1991 Kodomo no Uta 13, NHK Minna no Uta Yori
+ RO-583? 19?? Kids Selection (bundled with Casio Sound Kids 03 keyboard?)
+ RO-584 19?? Intro Ate Pack
+ RO-601E 19?? Enka 6
+ RO-602Y 19?? Young Best Hits 3
+ RO-604E 1986 Enka 7
+ RO-605Y 1986 Young Best Hits 4
+ RO-606K 1988 Kodomo no Uta 4
+ RO-607K 19?? Kodomo no Uta 5
+ RO-608Y 19?? Young Best Hits 5
+ RO-612K 19?? Kodomo no Uta Best 4
+ RO-614Y 1990 Young Best Hits 11
+ RO-616Y 1991 Young Best Hits 12
+ RO-618K 1993 Haha to Ko no TV Song
+ RO-681Y 1988 Sun Chain '88 Big Summer Campaign, Masatoshi Nakamura Original Hit Melody
+ RO-704 1990 Sound Kids, Douyou 4
+ RO-706 1990 Sound Kids, Hit Songs 1
+ RO-708 19?? Sound Kids, Hit Songs 2
+ RO-802E 1988 Enka 10
+ RO-804M 1989 Digital Horn Lessons
+ ==============================================================================================
+ WORLD ROM PACKS
+ ==============================================================================================
+ RO-279 1988 Solid Gold Rock & Pop
+ RO-456 198? Beautiful Arabian Music
+ RO-457 198? Arabian Song Selections
+ RO-458 198? Dongge Golden Melodies 1
+ RO-459 198? Dongge Golden Melodies 2
+ RO-460 198? Popular Mandarin Songs
+ RO-461 198? Taiwanese Classic Songs
+ RO-462 198? Les Antilles: Misik An Nou
+ RO-553 1984 Have Fun with Hopsie!
+ RO-557? 198? Family Collection
+ RO-558? 19?? Kids Selection (bundled with Casio Sound Kids 03 keyboard?)
-->
+
+<!-- JAPANESE ROM PACKS -->
+
+ <!--
+ 19 songs
+ 1. マイ・ウェイ
+ 2. サン・トワ・マミー
+ 3. イエスタデイ
+ 4. イエスタデイ・ワンス・モア
+ 5. モア
+ 6. ミスティ
+ 7. A列車でゆこう
+ 8. グリーンスリーブス
+ 9. G線上のアリア
+ 10. くちなしの花
+ 11. 銀座の恋の物語
+ 12. 別れても好きな人
+ 13. 鈴懸の径
+ 14. 赤いスイートピー
+ 15. もしもピアノが弾けたなら
+ 16. 恋人よ
+ 17. 君といつまでも
+ 18. 花
+ 19. 故郷
+ -->
+ <software name="ro101" supported="no">
+ <description>The Hit Parade (RO-101)</description>
+ <year>1983</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro101.bin" size="24576" crc="57e80c1c" sha1="f10c95e9d681ef1b2f190dc9a2af165d1afff536"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 18 songs
+ 1. 夜霧よ今夜もありがとう
+ 2. 星影のワルツ
+ 3. わたしの城下町
+ 4. ついて来るかい
+ 5. おまえに
+ 6. 雨の慕情
+ 7. ブランデーグラス
+ 8. 大阪しぐれ
+ 9. ふたりの夜明け
+ 10. 奥飛騨慕情
+ 11. 津軽海峡・冬景色
+ 12. 北国の春
+ 13. 夢追い酒
+ 14. おもいで酒
+ 15. それぞれの原宿
+ 16. みちのくひとり旅
+ 17. 契り
+ 18. 北酒場
+ -->
+ <software name="ro102" supported="no">
+ <description>Hit Kayou (RO-102)</description>
+ <year>1983</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ヒット歌謡"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro102.bin" size="24576" crc="030e4df4" sha1="886aa160c7e8230c5029a335c85952623b2ba291"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 16 songs
+ 1. 待つわ
+ 2. 私はピアノ
+ 3. 愛はかげろう
+ 4. 守ってあげたい
+ 5. 贈る言葉
+ 6. 悪女
+ 7. きみの朝
+ 8. 海岸通
+ 9. 秋止符
+ 10. 冬の稲妻
+ 11. 秋桜
+ 12. 天までとどけ
+ 13. 眠れぬ夜
+ 14. さよなら
+ 15. 季節の中で
+ 16. 人生の空から
+ -->
+ <software name="ro103" supported="no">
+ <description>New Music (RO-103)</description>
+ <year>1983</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ニューミュージック"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro103.bin" size="24576" crc="74ed4d2d" sha1="d6927cc4b7b43a783176bf95b13a8cb4c7523aaa"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 17 songs
+ 1. 恋吹雪
+ 2. ふたたびの
+ 3. 愛の終着駅
+ 4. あなたひとすじ
+ 5. 忘れてほしい
+ 6. 別れの夜明け
+ 7. 雨あがり
+ 8. 細の女
+ 9. コモエスタ赤坂
+ 10. 時間よお前は
+ 11. 純子
+ 12. 鴎という名の酒場
+ 13. 水割り
+ 14. そんな夕子にほれました
+ 15. 襟裳岬
+ 16. 浮草ぐらし
+ 17. 中の島ブルース
+ -->
+ <software name="ro106" supported="no">
+ <description>Enka Vol.2 Karaoke Hit-shū (RO-106)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="演歌 Vol.2 カラオケヒット集"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro106.bin" size="24576" crc="9e7eaf15" sha1="745c595e7b8230736ad0a5eda5cb9922771e4d78"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 18 songs
+ 1. 釜山港へ帰れ
+ 2. 秋冬
+ 3. 娘よ
+ 4. 矢切の渡し
+ 5. さざんかの宿
+ 6. 氷雨
+ 7. 盛り場おんな酒
+ 8. 細雪
+ 9. ブランデーグラス
+ 10. ついて来るかい
+ 11. 水割り
+ 12. 北国の春
+ 13. 奥飛騨慕情
+ 14. 兄弟船
+ 15. 恋の街札幌
+ 16. 大阪しぐれ
+ 17. 雨の慕情
+ 18. ふたりの春
+ -->
+ <software name="ro108" supported="no">
+ <description>Enka 3 (RO-108)</description>
+ <year>1984</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="演歌3"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro108.bin" size="24576" crc="f9385764" sha1="ba374c58b7f7de91cdaa855f1afd0c6b518ef7d3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 17 songs
+ 1. ゴッドファーザー/愛のテーマ
+ 2. ムーンリバー
+ 3. ある愛の詩
+ 4. エンターテイナー
+ 5. 追憶
+ 6. アモール
+ 7. ペサメムーチョ
+ 8. パーフィディア
+ 9. トップオブザワールド
+ 10. 想い出のグリーングラス
+ 11. ロミオとジュリエット
+ 12. シバの女王
+ 13. フィーリング
+ 14. やさしく歌って
+ 15. そよ風のメヌエット
+ 16. 愛のオルゴール
+ 17. 雨にぬれても
+ -->
+ <software name="ro110" supported="no">
+ <description>Easy Listening 3 (RO-110)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="イージーリスニング3"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro110.bin" size="24576" crc="b59fb818" sha1="659e686286d40f5d4d4e2fcb691de9342eb97ef2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 15 songs
+ 1. 浪花節だよ人生は
+ 2. 長良川艶歌
+ 3. つぐない
+ 4. もしかして-PARTⅡ
+ 5. 片恋酒
+ 6. 北の螢
+ 7. 津軽平野
+ 8. 伊豆の雨
+ 9. 夜霧よ今夜もありがとう
+ 10. 津軽海峡・冬景色
+ 11. 北酒場
+ 12. 北の宿から
+ 13. そんな女のひとりごと
+ 14. 居酒屋
+ 15. 中の島ブルース
+ -->
+ <software name="ro111" supported="no">
+ <description>Enka 4 (RO-111)</description>
+ <year>1985?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="演歌4"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro111.bin" size="24576" crc="eddff940" sha1="346f61ee130a4dccfcaa04ef39d733ded5fc6216"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 15 songs
+ 1. 北ウイング
+ 2. サザン・ウインド
+ 3. 十戒(1984)
+ 4. 探偵物語
+ 5. メイン・テーマ
+ 6. 一番野郎
+ 7. ケジメなさい
+ 8. 微風のメロディー
+ 9. コントロール
+ 10. 騎士道
+ 11. 顔に書いた恋愛小説
+ 12. 時をかける少女
+ 13. 愛情物語
+ 14. 港のはいから人魚
+ 15. 迷宮のアンドローラ
+ -->
+ <software name="ro113" supported="no">
+ <description>Young Best Hits (RO-113)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ヤングベストヒット"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro113.bin" size="24576" crc="1032f6df" sha1="f18cf07b8557d4db935aaa6b84daa2474042e8e0" status="baddump"/> <!-- Faulty byte at 0x14F1 (expected 10, got 21) -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 15 songs
+ 1. おまえとふたり
+ 2. くちなしの花
+ 3. ふたり酒
+ 4. おもいで酒
+ 5. コモエスタ赤坂
+ 6. 別れても好きな人
+ 7. みちのくひとり旅
+ 8. 浪花恋しぐれ
+ 9. 長崎は今日も雨だった
+ 10. わたし祈ってます
+ 11. 心のこり
+ 12. そんな夕子にほれました
+ 13. おんな港町
+ 14. 港町ブルース
+ 15. 冬のリヴィエラ
+ -->
+ <software name="ro114" supported="no">
+ <description>Enka 5 (RO-114)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="演歌5"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro114.bin" size="24576" crc="05b9d534" sha1="6bf45d5745c86fdb612876c7de6ed0b0a4b3ce06"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 15 songs
+ 1. 愛のロマンス
+ 2. 白い恋人たち
+ 3. 踊り明かそう
+ 4. ロッキーのテーマ
+ 5. 愛のファンタジー
+ 6. 魅惑のワルツ
+ 7. 夜霧のしのび逢い
+ 8. 慕 情
+ 9. エーデルワイス
+ 10. ドレミの歌
+ 11. 雨に唄えば
+ 12. 第三の男
+ 13. サンライズ・サンセット
+ 14. ラスト・コンサート
+ 15. 80日間世界一周
+ -->
+ <software name="ro118" supported="no">
+ <description>Screen Themes 3 (RO-118)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="スクリーン・テーマ3"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro118.bin" size="24576" crc="8853e424" sha1="fa53efca762de33b1a80f0f9a493bd06a2197328"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 20 songs
+ 1. アイアイ
+ 2. おはなしゆびさん
+ 3. ぞうさん
+ 4. てをつなごう
+ 5. ぶんぶんぶん
+ 6. おなかのへるうた
+ 7. メリーさんのひつじ
+ 8. おかあさん
+ 9. ロンドンばし
+ 10. やまのワルツ
+ 11. きゅっきゅっきゅう
+ 12. てをたたきましょう
+ 13. 十人のインディアン
+ 14. ドロップスのうた
+ 15. サッちゃん
+ 16. 七つの子
+ 17. アビニョンのはしで
+ 18. とんとんともだち
+ 19. はしれ ちょうとっきゅう
+ 20. こぎつね
+ -->
+ <software name="ro119" supported="no">
+ <description>Kodomo no Uta 3 (RO-119)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="こどものうた3"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro119.bin" size="24576" crc="5314ccba" sha1="84a66d231321ea1fb8a2f3dda92da185b474323f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 20 songs
+ 1. 憂き世川
+ 2. それは・・・黄昏
+ 3. 豊後水道
+ 4. 海峡
+ 5. 夕霧岬
+ 6. さよならの翼
+ 7. 恋人たちの神話
+ 8. 想いで迷子-2
+ 9. 浪花の夢
+ 10. 北斗船
+ 11. 祝い酒
+ 12. 夢情話
+ 13. 乱れ花
+ 14. すずめの涙
+ 15. 駅舎
+ 16. ロンリーウェイ・ロンリーナイト
+ 17. 王将一代小春しぐれ
+ 18. 夕陽
+ 19. かもめの歌
+ 20. 北空港
+ -->
+ <software name="ro125e" supported="no">
+ <description>Enka 9 (RO-125E)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="演歌9"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro125e.bin" size="24576" crc="56539d87" sha1="31710285ab98b649c70cd67fbee08a0dc0a9462b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. オリーブの首飾り / EL BIMBO
+ 2. 蒼いノクターン / NOCTURNE
+ 3. エーゲ海の真珠 / PENELOPE
+ 4. 涙のトッカータ / TOCCATA
+ -->
+ <software name="ro151" supported="no">
+ <description>Paul Mauriat (RO-151)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ポールモーリア"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro151.bin" size="6144" crc="9b39d536" sha1="5140d64c96715668e2c261263764a8e82723960a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. 瞳はダイアモンド
+ 2. ガラスの林檎
+ 3. 天国のキッス
+ 4. 秘密の楽園
+ -->
+ <software name="ro153" supported="no">
+ <description>Young Hits (RO-153)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ヤングヒット"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro153.bin" size="6144" crc="8e7e5b81" sha1="5d7d4fddaccbc7cbb162dacc1a9339c26dc968e8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. サザエさん
+ 2. ドラえもんのうた
+ 3. ワイワイワールド ~Dr.スランプ・アラレちゃん~
+ 4. CAT'S EYE
+ -->
+ <software name="ro155" supported="no">
+ <description>Animation (RO-155)</description>
+ <year>1984?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーション"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro155.bin" size="6144" crc="28691f18" sha1="5eb2d218ff7f6052d8c5a03255a876e0be55ef35"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 8 songs
+ 1. とんぼのめがね
+ 2. やぎさんゆうびん
+ 3. ことりのうた
+ 4. もりのくまさん
+ 5. ふしぎなポケット
+ 6. いちねんせいになったら
+ 7. いぬのおまわりさん
+ 8. とんでったバナナ
+ -->
+ <software name="ro158" supported="no">
+ <description>Kodomo no Uta 1 (RO-158)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="こどものうた1"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro158.bin" size="6144" crc="f2fa960a" sha1="7c8c9d144dea13f6b92002baa033d70747cf1d8f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. きてよパーマン
+ 2. 忍者ハットリくん
+ 3. 日本昔ばなし
+ 4. ラムのラブソング-うる星やつら-
+ -->
+ <software name="ro162" supported="no">
+ <description>Animation 2 (RO-162)</description>
+ <year>1984</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーション2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro162.bin" size="6144" crc="73459234" sha1="ae1392025b63aa6900629405dba4d693f94a841c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 5 songs
+ 1. 炎のキン肉マン~「キン肉マン」
+ 2. 大人になんかならないよ~「オバケのQ太郎」
+ 3. にんげんっていいな~「まんが日本昔ばなし」
+ 4. タッチ~「タッチ」
+ 5. 水の星より愛をこめて~「機動戦士Zガンダム」
+ -->
+ <software name="ro166" supported="no">
+ <description>Animation Themes 3 (RO-166)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーション・テーマ3"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro166.bin" size="6144" crc="ca682900" sha1="9071238f0667af27992a16e748e06fa82cbf89c1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 8 songs
+ 1. 『ドラゴンボール』より『摩訶不思議アドベンチャー』
+ 2. 『ドラゴンボール』より『ロマンティックあげるよ』
+ 3. 『ウルトラB』より『バビバビブー ウルトラB』
+ 4. 『エスパー魔美』より『テレポーテーション~恋の未確認~』
+ 5. 『ゲゲゲの鬼太郎』より『ゲゲゲの鬼太郎』
+ 6. 『アニメ三銃士』より『夢冒険』
+ 7. 『聖闘士星矢(セイントセイヤ)』より『ペガサス幻想(ファンタジー)』
+ 8. 『のらくろクン』より『Hold Me(ホールド ミー)』
+ -->
+ <software name="ro169a" supported="no">
+ <description>Animation Themes 4 (RO-169A)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーション テーマ4"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro169a.bin" size="6144" crc="63b59fd9" sha1="1a1d0c7a166a47b734d5ecde6644ad70386ec19f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 8 songs
+ 1. 『つるピカハゲ丸くん』より『つるピカハゲ丸倶楽部』
+ 2. 『ついでにとんちんかん』より『ほらね、春が来た』
+ 3. 『ドラえもん』より『青い空はポケットさ』
+ 4. 『ドラえもん』より『ぼくたち地球人』
+ 5. 『ビックリマン』より『ドリーミング・A・Go-Go』
+ 6. 『ミスター味っ子』より『ルネッサンス情熱』
+ 7. 『キテレツ大百科』より『キテレツ大百科』
+ 8. 『小公子セディ』より『ぼくらのセディ』
+ -->
+ <software name="ro170a" supported="no">
+ <description>Animation Themes 5 (RO-170A)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーション テーマ5"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro170a.bin" size="6144" crc="f0079562" sha1="21d2e25806eacea8dabc522ae0811c03ed0fc9db"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. ハッピー・バースディ・トゥ・ユー
+ 2. お正月
+ 3. ぼくのバレンタインデー
+ 4. うれしいひなまつり
+ 5. こいのぼり
+ 6. 婚礼の合唱
+ -->
+ <software name="ro171i" supported="no">
+ <description>Event Songs (RO-171I)</description>
+ <year>1988?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="イベント・ソング"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro171i.bin" size="6144" crc="dc3a3f42" sha1="7f3d1688cc23894a345cefe840e97e3eb94437b1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. ロトのテーマ
+ 2. 街
+ 3. 村
+ 4. 海を越えて
+ 5. 戦闘のテーマ
+ 6. そして伝説へ・・・
+ -->
+ <software name="ro172g" supported="no">
+ <description>Game Music: Dragon Quest III Yori (RO-172G)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ゲーム ミュージック 『ドラゴンクエストⅢ』より"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro172g.bin" size="6144" crc="8681f1b2" sha1="f907f2ab92cf18cf0343bc3411b54bb36b37d5bd"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. ボディー だけ レディー
+ 2. ドラゴンボール伝説
+ 3. ひみつのアッコちゃん
+ 4. ぶぁい Yai Yai
+ 5. おそ松くん音頭
+ 6. 仮面ライダーBLACK RX
+ 7. 勇気りんりん
+ -->
+ <software name="ro178a" supported="no">
+ <description>Animation Themes 6 (RO-178A)</description>
+ <year>1989</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーションテーマ6"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro178a.bin" size="6144" crc="e59b057d" sha1="31dbf4477038c08a72b787819d1c5ccfcf2994bb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. 赤鼻のトナカイ / RUDOLPH, THE RED-NOSED REINDEER
+ 2. ブルークリスマス / BLUE CHRISTMAS
+ 3. ウィンターワンダーランド / WINTER WONDERLAND
+ 4. シルバーベルズ/ SILVER BELLS
+ 5. ああベツレヘムよ
+ 6. 神の御子は
+ 7. グローリア(荒野の果てに)
+ -->
+ <software name="ro180x" supported="no">
+ <description>Christmas Songs 2 (RO-180X)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="クリスマスソング2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro180x.bin" size="6144" crc="b7ac5aa4" sha1="071bae3979628b22293d6261f3d1abab3cc7c5b9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. オール・オブ・ミー / ALL OF ME
+ 2. 時のたつまま / AS TIME GOES BY
+ 3. 枯葉 / AUTUMN LEAVES
+ 4. デイ・バイ・デイ / DAY BY DAY
+ 5. イッツ・オンリー・ア・ベイパー・ムーン / IT'S ONLY A PAPER MOON
+ 6. 酒とバラの日々 / DAYS OF WINE AND ROSES
+ 7. ユード・ビー・ソー・ナイス・トゥカム・ホーム・トゥ / YOU'D BE SO NICE TO COME HOME TO
+ -->
+ <software name="ro181s" supported="no">
+ <description>Standards 2 (RO-181S)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="スタンダード2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro181s.bin" size="6144" crc="e0ac7758" sha1="299f3d8397a8cc70950157d453270e67f086402a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. イエスタディ / YESTERDAY
+ 2. 抱きしめたい / I WANT TO HOLD YOUR HAND
+ 3. アンド・アイ・ラブ・ハー / AND I LOVE HER
+ 4. イエロー・サブマリン / YELLOW SUBMARINE
+ 5. レディー・マドンナ / LADY MADONNA
+ 6. ディ・トリッパー / DAY TRIPPER
+ 7. プリーズ・プリーズ・ミー / PLEASE PLEASE ME
+ -->
+ <software name="ro182b" supported="no">
+ <description>Beatles 2 (RO-182B)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ビートルズ2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro182b.bin" size="6144" crc="5f3ddb1e" sha1="b4daa6b0c2dc3a988e6a488932576c0a45019524"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. 仮面ノリダー~「レッツゴー!!ライダーキック」かえうた
+ 2. ウンジャラゲ
+ 3. ダダダダ ダイエット
+ 4. あっぱれ さんま大先生
+ 5. アミダばばあの唄
+ 6. 炎のエスカルゴ
+ 7. 小市民 2
+ -->
+ <software name="ro183c" supported="no">
+ <description>Comic Songs (RO-183C)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="コミックソング"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro183c.bin" size="6144" crc="c3f2e34b" sha1="aa2104d092ff2acb783496abcbdcdd6f67b423ed"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 15 songs
+ 1. こいのぼり
+ 2. いっぷ にっぷ じゃんぷ
+ 3. ひらいた ひらいた
+ 4. たなばたさま
+ 5. うみ
+ 6. おおきなくりのきのしたで
+ 7. きらきらぼし
+ 8. ことりの うた
+ 9. もりの くまさん
+ 10. だるまさん
+ 11. かくれんぼ
+ 12. 虫の こえ
+ 13. あわてんぼうの サンタクロース
+ 14. あかちゃん
+ 15. アンダルコのうた
+ -->
+ <software name="ro184t" supported="no">
+ <description>Shougakusei no Ongaku 1 (RO-184T)</description>
+ <year>1989?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="しょうがくせいのおんがく1"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro184t.bin" size="6144" crc="3cfae2b0" sha1="6f6c4022824c6e10092d52a2e9248617d31051aa"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 15 songs
+ 1. 春の小川
+ 2. 山の朝
+ 3. ふじ山
+ 4. うさぎ
+ 5. みんな音楽家
+ 6. はさみとぎ
+ 7. さようなら
+ 8. さくら さくら
+ 9. そよ風
+ 10. この山光る
+ 11. おどろう楽しいポーレチケ
+ 12. もみじ
+ 13. とんび
+ 14. 夜汽車
+ 15. 月夜
+ -->
+ <software name="ro185t" supported="no">
+ <description>Shougakusei no Ongaku 2 (RO-185T)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="小学生の音楽2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro185t.bin" size="6144" crc="a76ae229" sha1="bba5acd10763facbd6f15571e124a26f3a4124a5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 13 songs
+ 1. ゆかいに歩けば
+ 2. 子もり歌
+ 3. 荒城の月
+ 4. 星の世界
+ 5. 冬げしき
+ 6. スキーの歌
+ 7. 水車
+ 8. ほたるの光
+ 9. 大分地方の子もり歌
+ 10. かりがわたる
+ 11. ふるさと
+ 12. 星に向かい 光に向かい
+ 13. あおげばとうとし
+ -->
+ <software name="ro186t" supported="no">
+ <description>Shougakusei no Ongaku 3 (RO-186T)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="小学生の音楽3"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro186t.bin" size="6144" crc="78141aaf" sha1="af538244ca4770c5f56797d938c9d0ca9c14cb7d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. 高速戦隊ターボレンジャー 「高速戦隊ターボレンジャー」より
+ 2. セント・ジュエルを探せ 「新ビックリマン」より
+ 3. ぼくドラえもん 「どらえもん」より
+ 4. CHA-LA HEAD-CHA-LA(チャラ・ヘッチャラ) 「ドラゴンボールZ」より
+ 5. サザエさん一家 「サザエさん」より
+ 6. Dang Dang 気になる 「美味しんぼ」より
+ 7. キッチンから愛をこめて 「ハーイ あっこです」より
+ -->
+ <software name="ro189a" supported="no">
+ <description>Animation Themes 7 (RO-189A)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーションテーマ7"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro189a.bin" size="6144" crc="7441d24e" sha1="3cd0dde248f1bd10d7a6f5440435e7abb7f11ed5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. ごめんよ 涙
+ 2. あ・き・す・と・ぜ・ね・こ
+ 3. TIME ZONE
+ 4. ボクらの夢によろしく
+ 5. BE MY BABY
+ 6. Runner
+ -->
+ <software name="ro191y" supported="no">
+ <description>Young Best Hits 8 (RO-191Y)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ヤングベストヒット8"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro191y.bin" size="6144" crc="0b63336c" sha1="bb84b55d3fc6c2181d2c20aa14d91cae1e4134f2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 7 songs
+ 1. Diamonds ダイアモンド
+ 2. 愛が止まらない
+ 3. 涙をみせないで
+ 4. 嵐の素顔
+ 5. 夢の中へ
+ 6. NEVERLAND~YAWARA! メインテーマ~
+ 7. Return to Myself~しない、しない、ナツ。
+ -->
+ <software name="ro192y" supported="no">
+ <description>Young Best Hits 9 (RO-192Y)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ヤングベストヒット9"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro192y.bin" size="6144" crc="f5820444" sha1="502b761d12921d18053b612b3f4094f29d8c9b15"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. いぬのおまわりさん
+ 2. やぎさんゆうびん
+ 3. ドラえもんのうた
+ 4. ジングル・ベル
+ 5. とんぼのめがね
+ 6. マイ・ウエイ
+ -->
+ <software name="ro581" supported="no">
+ <description>Family Selection (RO-581)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ファミリー・セレクション"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro581.bin" size="6144" crc="49d954d6" sha1="0740e528fc74d953b1fea000284a63453b7acc6b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 20 songs
+ 1. 聖者の行進
+ 2. 大きな栗の木の下で
+ 3. とんぼのめがね
+ 4. 乾杯
+ 5. 北酒場
+ 6. ROCK
+ 7. DISCO
+ 8. 16 BEAT
+ 9. SWING 2 BEAT
+ 10. SWING 4 BEAT
+ 11. SAMBA
+ 12. BOSSA NOVA
+ 13. BEGUINE
+ 14. TANGO
+ 15. MARCH
+ 16. SLOW ROCK
+ 17. WALTZ
+ 18. ROCK WITH FILL IN
+ 19. C#4
+ 20. A4
+ -->
+ <software name="ro582" supported="no">
+ <description>DH Tunes &amp; Rhythms (RO-582)</description>
+ <year>1989</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro582.bin" size="6144" crc="8463932c" sha1="32388d973ad4c9560169c7f2f4306381aadbd2e6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. マニック・マンデー / MANIC MONDAY
+ 2. インビジブル・タッチ / INVISIBLE TOUCH
+ 3. ステイ・ウィズ・ミー / STAY WITH ME
+ 4. ディファレント・コーナー / A DIFFERENT CORNER
+ 5 .愛はかげろうのように / I'VE NEVER BEEN TO ME
+ 6 .インプレスト / IMPRESSED
+ -->
+ <software name="ro603p" supported="no">
+ <description>Pops 2 (RO-603P)</description>
+ <year>1985?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ポップス2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="8192">
+ <rom name="ro603p.bin" size="8192" crc="238d5fb6" sha1="03e9ed216df757c4bca3c6cc1e702f608f7539b7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 10 songs
+ 1. とんぼのめがね
+ 2. やぎさんゆうびん
+ 3. ことりのうた
+ 4. もりのくまさん
+ 5. ふしぎなポケット
+ 6. いちねんせいになったら
+ 7. いぬのおまわりさん
+ 8. とんでったバナナ
+ 9. かたつむり
+ 10. うみ
+ -->
+ <software name="ro609k" supported="no">
+ <description>Kodomo no Uta Best 1 (RO-609K)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="こどものうたベスト1"/>
+ <info name="alt_title" value="SOUND KIDS どうよう1 (RO-701)"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro609k.bin" size="6144" crc="6e147acd" sha1="26a1ba899def2a939b02f2b8a5136f48c024c1e2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 10 songs
+ 1. おもちゃのチャチャチャ
+ 2. アイスクリームのうた
+ 3. おおきなくりのきのしたで
+ 4. まつぼっくり
+ 5. たきび
+ 6. あめふりくまのこ
+ 7. もうすぐようちえん
+ 8. おばけなんてないさ
+ 9. はるがきた
+ 10. どんぐりころころ
+ -->
+ <software name="ro610k" supported="no">
+ <description>Kodomo no Uta Best 2 (RO-610K)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="こどものうたベスト2"/>
+ <info name="alt_title" value="SOUND KIDS どうよう2 (RO-702)"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="8192">
+ <rom name="ro610k.bin" size="8192" crc="fd87a1a6" sha1="539df0cc28c37c55428e5dc23c734987a60d73b6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 11 songs
+ 1. ハッピー・バースディ・トゥ・ユー
+ 2. にこにこぶん
+ 3. 大きな古時計
+ 4. ピクニック
+ 5. たなばたさま
+ 6. 夕焼け小焼け
+ 7. おもちゃのマーチ
+ 8. めだかの学校
+ 9. めだかのきょうだい
+ 10. 手のひらを太陽に
+ 11. クラリネットをこわしちゃった
+ -->
+ <software name="ro611k" supported="no">
+ <description>Kodomo no Uta Best 3 (RO-611K)</description>
+ <year>1990</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="こどものうたベスト3"/>
+ <info name="alt_title" value="SOUND KIDS どうよう3 (RO-703)"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro611k.bin" size="24576" crc="2e3e50d0" sha1="3505734a30ca3063fba65844045eae359f5803c6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 10 songs
+ 1. サザエさん
+ 2. ゆめいっぱい
+ 3. おどるポンポコリン
+ 4. 日本昔ばなし
+ 5. グローイング・アップ
+ 6. キミの風
+ 7. ドラえもんのうた
+ 8. 晴れた日に・・・
+ 9. 君をのせて
+ 10. となりのトトロ
+ -->
+ <software name="ro613a" supported="no">
+ <description>Animation Themes 8 (RO-613A)</description>
+ <year>1990</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーションテーマ8"/>
+ <info name="alt_title" value="SOUND KIDS アニメのうた1 (RO-705)"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro613a.bin" size="24576" crc="53db7051" sha1="168df4fad65df53fe13d575d98ffc2100366eaae"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 10 songs
+ 1. 魔法使いサリー
+ 2. 勇気りんりん
+ 3. はじめてのチュウ
+ 4. 走れ正直者
+ 5. にんげんっていいな
+ 6. 鳥人戦隊ジェットマン
+ 7. 両手を広げて
+ 8. お~い北海道
+ 9. 神様が降りてくる夜
+ 10. さよならだけどさよならじゃない
+ -->
+ <software name="ro615a" supported="no">
+ <description>Animation Themes 9 (RO-615A)</description>
+ <year>1991</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="アニメーションテーマ9"/>
+ <info name="alt_title" value="SOUND KIDS アニメのうた2 (RO-707)"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro615a.bin" size="24576" crc="2b7a02d0" sha1="0bb48396a9145111fd59ec6835a812157f01f7dd"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 10 songs
+ 1. ガラガラヘビがやってくる
+ 2. それが大事
+ 3. 君がいるだけで
+ 4. いつまでも変わらぬ愛を
+ 5. 冬がはじまるよ
+ 6. Choo Choo TRAIN
+ 7. 悲しみは雪のように
+ 8. LOVE SONG
+ 9. 心の鏡
+ 10. リラの咲くころバルセロナへ
+ -->
+ <software name="ro617y" supported="no">
+ <description>Young Best Hits 13 (RO-617Y)</description>
+ <year>1992</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ヤングベストヒット13"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro617y.bin" size="24576" crc="0d0075d4" sha1="48bced7867a10f701d790e5fbb5d4ff6aa22255b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. ALL ABOUT YOU
+ 2. SABANA HOTEL
+ 3. OMENS OF LOVE
+ 4. 遠 雷
+ 5. 宝 島
+ 6. TRUTH
+ -->
+ <software name="ro801f" supported="no">
+ <description>Fusion (RO-801F)</description>
+ <year>1988?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="フュージョン"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="8192">
+ <rom name="ro801f.bin" size="8192" crc="1ac35e2c" sha1="5cba4ed371f9b1edf0e4404dc5d6d932fbe25e4a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. 浪路はるかに / SAIL ALONG SILV'RY MOON
+ 2. 真珠の首飾り / A STRING OF PEARLS
+ 3. フライ・ミー・トゥ・ザ・ムーン / FLY ME TO THE MOON
+ 4. ブラジル / BRAZIL
+ 5. 黒いオルフェ / LA CHANSON D'ORPHEE
+ 6. キャラバン / CARAVAN
+ -->
+ <software name="ro803s" supported="no">
+ <description>Standards (RO-803S)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="スタンダード"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="8192">
+ <rom name="ro803s.bin" size="8192" crc="339b3346" sha1="bc082882621ef01147d775f0fdd3141efab589d2"/>
+ </dataarea>
+ </part>
+ </software>
+
+
+<!-- WORLD ROM PACKS -->
+
+ <!--
+ 15 songs
+ 1. You Are The Sunshine of My Life
+ 2. Misty
+ 3. Yesterday Once More
+ 4. When The Saints Go Marching In
+ 5. Star Wars
+ 6. Sir Duke
+ 7. Air On The G String
+ 8. Sunrise, Sunset
+ 9. Feelings
+ 10. Greensleeves
+ 11. Love Me With All Your Heart (Cuando Calienta El Sol)
+ 12. Ciribiribin
+ 13. More
+ 14. Brazil (Aquarela Do Brasil)
+ 15. Adios
+ -->
+ <software name="ro201" supported="no">
+ <description>Fun With Your Casio Keyboard (RO-201)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro201.bin" size="24576" crc="340f5585" sha1="ff534216f3d71aef9c93106fb2654d16da87805b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 17 songs
+ 1. Tijuana Taxi
+ 2. Still
+ 3. Proud Mary
+ 4. Colour My World
+ 5. California Girls
+ 6. If
+ 7. The Boy From New York
+ 8. All Out of Love
+ 9. Babe
+ 10. Hard To Say I'm Sorry
+ 11. This Time I'm In It For Love
+ 12. Only The Lonely
+ 13. Daydream Believer
+ 14. Goodbye Stranger
+ 15. Make Me Smile
+ 16. Eye In The Sky
+ 17. The Logical Song
+ -->
+ <software name="ro204" supported="no">
+ <description>Supergroups (RO-204)</description>
+ <year>1984</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro204.bin" size="24576" crc="1222b7bd" sha1="ab81dc075bedeecec7510db282872e175bb51dd9"/>
+ </dataarea>
+ </part>
+ </software>
+
<!--
11 songs
- 1 Beautiful Brown Eyes
- 2/3 Marianne Colour My World
- 4/5 Skaters Waltz
- 6 Du, Du, Liegst Mir Im Herzen
- 7 Chopsticks
- 8/9 When The Saints Go Marchin' In
- 10 My Wild Irish Rose
- 11 Michael, Row The Boat Ashore
+ 1. Beautiful Brown Eyes
+ 2/3. Marianne Colour My World
+ 4/5. Skaters Waltz
+ 6. Du, Du, Liegst Mir Im Herzen
+ 7. Chopsticks
+ 8/9. When The Saints Go Marchin' In
+ 10. My Wild Irish Rose
+ 11. Michael, Row The Boat Ashore
-->
<software name="ro251" supported="no">
- <description>How to Play your Casio ROM Keyboard (RO-251)</description>
+ <description>How To Play Your Casio ROM Keyboard (RO-251)</description>
+ <year>1984</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro251.bin" size="6144" crc="6bfd4921" sha1="6b57f18f2f170c01dc929f60b55a0535e041a09d"/> <!-- OKI M5268 -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Fame
+ 2. For Your Eyes Only
+ 3. Up Where We Belong
+ 4. Gonna Fly Now
+ -->
+ <software name="ro252" supported="no">
+ <description>Film Classics (RO-252)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro252.bin" size="6144" crc="eda164fb" sha1="1a55e2e1b8a9e526e63ca0ac1f85b0c0d7ad0b58"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Thriller
+ 2. Don't Be Cruel
+ 3. It's Still Rock And Roll to Me
+ 4. Karma Chameleon
+ -->
+ <software name="ro253" supported="no">
+ <description>Pop/Rock (RO-253)</description>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro253.bin" size="6144" crc="d69e957f" sha1="46fd2be8ae8e85f4197c2f7b341f7e5a79af5ab7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Arthur's Theme
+ 2. Eye Of The Tiger
+ 3. Can You Read My Mind
+ 4. The Summer Knows
+ -->
+ <software name="ro254" supported="no">
+ <description>Movie Pops (RO-254)</description>
<year>1984</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro251.bin" size="0x1800" crc="6bfd4921" sha1="6b57f18f2f170c01dc929f60b55a0535e041a09d"/> <!-- OKI M5268 -->
+ <dataarea name="rom" size="6144">
+ <rom name="ro254.bin" size="6144" crc="ed49e8ed" sha1="bc9973f598864bf6cdde575f7dd9c88d06744f2d"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Listen To The Music
- 2 Escape (The Piña Colada Song)
- 3 Ventura Highway
- 4 Slow Hand
+ 1. Listen To The Music
+ 2. Escape (The Piña Colada Song)
+ 3. Ventura Highway
+ 4. Slow Hand
-->
<software name="ro255" supported="no">
<description>Rock On (RO-255)</description>
- <year>1988</year>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro255.bin" size="6144" crc="d291058e" sha1="f4b55026eba270f7b39f6edb94e14281746ba936"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Love Story
+ 2. Scarborough Fair
+ 3. Have You Never Been Mellow
+ 4. Top of the World
+ -->
+ <software name="ro256" supported="no">
+ <description>Top Pops (RO-256)</description>
+ <year>1985</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro255.bin" size="0x1800" crc="d291058e" sha1="f4b55026eba270f7b39f6edb94e14281746ba936"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro256.bin" size="6144" crc="922f52f4" sha1="9c9af08287f974e5c16bb948c9c5350f9d23ce91"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Tijuana Taxi
- 2 Colour My World
- 3 The Boy From New York City
- 4 Hard To Say I'm Sorry
+ 1. Tijuana Taxi
+ 2. Colour My World
+ 3. The Boy From New York City
+ 4. Hard To Say I'm Sorry
-->
<software name="ro257" supported="no">
<description>Super Songs (RO-257)</description>
<year>1985</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro257.bin" size="0x1800" crc="223e407d" sha1="79f7088c694b8b04a284bcd652ec1f84def75b5c"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro257.bin" size="6144" crc="223e407d" sha1="79f7088c694b8b04a284bcd652ec1f84def75b5c"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 El Cumbanchero
- 2 Sway
- 3 Guantanamera
- 4 Tico-Tico
+ 1. El Cumbanchero
+ 2. Sway
+ 3. Guantanamera
+ 4. Tico-Tico
-->
<software name="ro258" supported="no">
<description>Latin Hits (RO-258)</description>
<year>1985</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro258.bin" size="0x1800" crc="4112184a" sha1="b0b2ab34ef781483487873e56dee1456b7182e40"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro258.bin" size="6144" crc="4112184a" sha1="b0b2ab34ef781483487873e56dee1456b7182e40"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 You Are The Sunghine Of My Life
- 2 Feelings
- 3 Brazil
- 4 Mona Lisa
+ 1. Listen to the Music
+ 2. Escape (The Pina Colada Song)
+ 3. Ventura Highway
+ 4. Slow Hand
+ -->
+ <software name="ro259" supported="no">
+ <description>Pop Hits (RO-259)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro259.bin" size="6144" crc="a73fd39c" sha1="6d90bbd903be8b753a843a7aeb6a9bb5e7843bfb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. You Are The Sunghine Of My Life
+ 2. Feelings
+ 3. Brazil
+ 4. Mona Lisa
-->
<software name="ro260" supported="no">
<description>Music Collection (RO-260)</description>
<year>1985</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro260.bin" size="0x1800" crc="e2301ec4" sha1="bb992e3d454970562cb8069eddc44a89d0107b33"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro260.bin" size="6144" crc="e2301ec4" sha1="bb992e3d454970562cb8069eddc44a89d0107b33"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 The Entertainer
- 2 Eye In The Sky
- 3 Goodbyte To Love
- 4 We Only Just Begun
+ 1. The Entertainer
+ 2. Eye In The Sky
+ 3. Goodbyte To Love
+ 4. We Only Just Begun
-->
<software name="ro261" supported="no">
<description>Pop Selection (RO-261)</description>
<year>1985</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro261.bin" size="0x1800" crc="32e63470" sha1="80895e00eb6987349a7bafabba3fca991625b1fa"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro261.bin" size="6144" crc="32e63470" sha1="80895e00eb6987349a7bafabba3fca991625b1fa"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Drivin' My Life Away
- 2 Don't It Make My Brown Eyes Blue
- 3 Nine To Five
- 4 On The Road Again
+ 1. Drivin' My Life Away
+ 2. Don't It Make My Brown Eyes Blue
+ 3. Nine To Five
+ 4. On The Road Again
-->
<software name="ro262" supported="no">
<description>Country Greats (RO-262)</description>
<year>1986</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro262.bin" size="0x1800" crc="3d2db7d8" sha1="4ba5ba833af70e4ea9abda83974ca97bdd6e0b56"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro262.bin" size="6144" crc="3d2db7d8" sha1="4ba5ba833af70e4ea9abda83974ca97bdd6e0b56"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Against All Odds (Take A Look At Me Now)
- 2 Born In The U.S.A.
- 3 Holiday
- 4 We Don't Need Another Hero (Thunderdome)
+ 1. Oh Happy Day
+ 2. He's Got the Whole World In His Hands
+ 3. Will the Circle Be Unbroken
+ 4. Amazing Grace
+ -->
+ <software name="ro263" supported="no">
+ <description>Hymns &amp; Gospel (RO-263)</description>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro263.bin" size="6144" crc="4f6d84a6" sha1="ff8522b209b7092abfcef8897d2bdb5b320131c3"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Could I Have This Dance
+ 2. (There's) No Gettin' Over Me
+ 3. Take Me Down
+ 4. To All the Girls I've Loved Before
+ -->
+ <software name="ro264" supported="no">
+ <description>Pop Country (RO-264)</description>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro264.bin" size="6144" crc="62a1c2a4" sha1="b54691dab857e42597cc0a5cde90bac517216e0f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Against All Odds (Take A Look At Me Now)
+ 2. Born In The U.S.A.
+ 3. Holiday
+ 4. We Don't Need Another Hero (Thunderdome)
-->
<software name="ro265" supported="no">
<description>Pop Superstars (RO-265)</description>
<year>1986</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro265.bin" size="0x1800" crc="a508af10" sha1="86422cab2e55633ab04dc12adc9ca3d4d6ade8c2"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro265.bin" size="6144" crc="a508af10" sha1="86422cab2e55633ab04dc12adc9ca3d4d6ade8c2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 8 songs
+ 1. Alphabet Song
+ 2. Farmer In The Dell
+ 3. I'm A Little Teapot
+ 4. I've Been Working On The Railroad
+ 5. Mary Had A Little Lamb
+ 6. Old Macdonald
+ 7. Ten Little Indians
+ 8. This Old Man
+ -->
+ <software name="ro266" supported="no">
+ <description>Songs For Children (RO-266)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro266.bin" size="6144" crc="ee1be905" sha1="b4824b38ea00b6e74cce4515415aa4fa6f521a33"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Mona Lisa
+ 2. Moon River
+ 3. A Time For Us (Theme From Romeo And Juliet)
+ 4. Speak Softly Love (Love Theme From 'The Godfather')
+ -->
+ <software name="ro268" supported="no">
+ <description>Golden Hits (RO-268)</description>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro268.bin" size="6144" crc="1ae42d4c" sha1="22e7e061dbd82ec4a3ebc9967fe7f842c5c1171f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Carribbean Queen (No More Love On The Run)
+ 2. Emergency
+ 3. How Will I Know
+ 4. Nightshift
+ -->
+ <software name="ro269" supported="no">
+ <description>Rhythm and Blues (RO-269)</description>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro269.bin" size="6144" crc="6f008485" sha1="975e32b2613c1345daddab22a99788aecde17e3e"/>
</dataarea>
</part>
</software>
<!--
6 songs
- 1 Jingle Bells
- 2 Silent Night
- 3 Joy To The World
- 4 Here Comes Santa Claus
- 5 Silver Bells
- 6 Santa Claus Is Comin' To Town
+ 1. Jingle Bells
+ 2. Silent Night
+ 3. Joy To The World
+ 4. Here Comes Santa Claus
+ 5. Silver Bells
+ 6. Santa Claus Is Comin' To Town
-->
<software name="ro270" supported="no">
<description>Christmas (RO-270)</description>
<year>1986</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro270.bin" size="0x1800" crc="654e8ba2" sha1="ffb682d1fe313567fbabad8b6e4e0497dca2dd14"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro270.bin" size="6144" crc="654e8ba2" sha1="ffb682d1fe313567fbabad8b6e4e0497dca2dd14"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Eight Days a Week
+ 2. Hey Jude
+ 3. Penny Lane
+ 4. Yesterday
+ -->
+ <software name="ro271" supported="no">
+ <description>Beatles No.1 Hits (RO-271)</description>
+ <year>1986</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro271.bin" size="6144" crc="bcbe60b8" sha1="cb686260a73410fc3d0af09af9ef136ac027e7a1"/>
</dataarea>
</part>
</software>
<!--
5 songs
- 1 Bad Moon Rising
- 2 Chantilly Lace
- 3 The Dock Of The Bay
- 4 I'm Walkin'
- 5 Respect
+ 1. Bad Moon Rising
+ 2. Chantilly Lace
+ 3. The Dock Of The Bay
+ 4. I'm Walkin'
+ 5. Respect
-->
<software name="ro272" supported="no">
<description>Rock &amp; Roll Classics (RO-272)</description>
<year>1986</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro272.bin" size="0x1800" crc="1ddca979" sha1="7264cdeeea56194d4b8c37cffb5a9a45ace7c006"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro272.bin" size="6144" crc="1ddca979" sha1="7264cdeeea56194d4b8c37cffb5a9a45ace7c006"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. I Hear A Symphony
+ 2. I Heard It Through The Grapevine
+ 3. My Girl
+ 4. My Guy
+ -->
+ <software name="ro273" supported="no">
+ <description>Best of Motown (RO-273)</description>
+ <year>1987</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro273.bin" size="6144" crc="7b2a8d1e" sha1="d51b96a57441ca77806be78e18c2511249cb8556"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Dancing In The Dark
- 2 King For A Day
- 3 These Dreams
- 4 Walk Of Life
+ 1. Dancing In The Dark
+ 2. King For A Day
+ 3. These Dreams
+ 4. Walk Of Life
-->
<software name="ro274" supported="no">
<description>Hot Pop &amp; Rock (RO-274)</description>
<year>1987</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro274.bin" size="0x1800" crc="b174be9a" sha1="a34f8c72616d6dbe82df56ec1dab174606eafa15"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro274.bin" size="6144" crc="b174be9a" sha1="a34f8c72616d6dbe82df56ec1dab174606eafa15"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Greatest Love of All
+ 2. Overjoyed
+ 3. Rhythm of the Night
+ 4. What's Love Got to Do With It?
+ -->
+ <software name="ro275" supported="no">
+ <description>Today's Superstars (RO-275)</description>
+ <year>1987</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro275.bin" size="6144" crc="b92d1abe" sha1="6970a1235dc59c9787882f340a3ac797d1d17ba2"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Theme From Hill Street Blues
- 2 Theme From Cheers
- 3 Theme From Dinasty
- 4 Theme From St.Elsewhere
+ 1. Theme From Hill Street Blues
+ 2. Theme From Cheers
+ 3. Theme From Dinasty
+ 4. Theme From St.Elsewhere
-->
<software name="ro276" supported="no">
<description>T.V. Tunes (RO-276)</description>
<year>1987</year>
<publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro276.bin" size="0x1800" crc="be4240b7" sha1="08761ccbd6a467af1b61c3e7eea0c50028682344"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro276.bin" size="6144" crc="be4240b7" sha1="08761ccbd6a467af1b61c3e7eea0c50028682344"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 5 songs
+ 1. When You Wish Upon A Star
+ 2. Some Day My Prince Will Come
+ 3. Heigh-Ho
+ 4. Who's Afraid of the Big Bad Wolf?
+ 5. Whistle While You Work
+ -->
+ <software name="ro277" supported="no">
+ <description>When You Wish Upon A Star and Other Disney Movie Songs (RO-277)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro277.bin" size="6144" crc="80ea5332" sha1="e8fcef75ca87401f08ac01977a51f85bc4e098c5"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 On The Sunny Side Of The Street
- 2 Georgia On My Mind
- 3 I Left My Heart In San Francisco
- 4 Memories Of You
+ 1. Green (Bein' Green)
+ 2. Rubber Duckie
+ 3. Sesame Street Theme
+ 4. Sing
+ -->
+ <software name="ro278" supported="no">
+ <description>Songs of Sesame Street (RO-278)</description>
+ <year>1987</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro278.bin" size="6144" crc="590bae4d" sha1="50bab49f1c7a20e8502517ae97ff746766df12e1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. The Final Countdown
+ 2. Here I Go Again
+ 3. Livin' On a Prayer
+ 4. You Belong to the City
+ -->
+ <software name="ro280" supported="no">
+ <description>Star-Studded Rock (RO-280) (bad dump?)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro280.bin" size="6144" crc="a2c2890c" sha1="20bea9ea5111b8c9b9208486a2475f24fcf74df2" status="baddump"/> <!-- Presumed bad dump, a fixed ROM exists -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Heaven is a Place On Earth
+ 2. Moonlighting
+ 3. Saving All My Love for You
+ 4. Who's That Girl
+ -->
+ <software name="ro281" supported="no">
+ <description>Chartbusting Pop (RO-281) (bad dump?)</description>
+ <year>1988</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6140">
+ <rom name="ro281.bin" size="6140" crc="f6d8a1c6" sha1="a38e49e9a9c57c4e69c048f690930dc8c1ef361c" status="baddump"/> <!-- Presumed bad dump, a fixed ROM exists -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Step By Step
+ 2. (You've Got It) The Right Stuff
+ 3. I'll Be Loving You (Forever)
+ 4. Cover Girl
+ -->
+ <software name="ro282" supported="no">
+ <description>New Kids On The Block Greatest Hits (RO-282)</description>
+ <year>1990</year>
+ <publisher>Casio / Hal Leonard Publishing Corporation</publisher>
+ <info name="alt_title" value="New Kids On The Block Greatest Hits (RO-559)"/>
+ <info name="alt_title" value="New Kids On The Block Greatest Hits (RO-560)"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro282.bin" size="6144" crc="5407ab43" sha1="064359112a3604e81b8e17358c176a8287a6f462"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 18 songs
+ 1. Speak Softly Love (Love Theme From "The Godfather")
+ 2. Moon River
+ 3. Love Story ("Where Do I Begin")
+ 4. Entertainer
+ 5. The Way We Were
+ 6. Song From Moulin Rouge
+ 7. We've Only Just Begun
+ 8. Scarborough Fair
+ 9. Born Free
+ 10. Snowbird
+ 11. Wonderland By Night
+ 12. Have You Never Been Mellow
+ 13. I Won't Last A Day Without You
+ 14. It's Going To Take Some Time
+ 15. Danke Schoen
+ 16. L-O-V-E
+ 17. Cabaret
+ 18. The Look of Love
+ -->
+ <software name="ro301" supported="no">
+ <description>Popular Hits (RO-301)</description>
+ <year>1983</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="Easy Listening"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro301.bin" size="24576" crc="9a187054" sha1="be55a463c6318880831e57802ebbe7596e96ccd2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 18 songs
+ 1. Amor
+ 2. Besame Mucho
+ 3. El Cumbanchero
+ 4. Frenesi
+ 5. Green Eyes
+ 6. Magic Is The Moonlight
+ 7. Mas Que Nada
+ 8. Perfidia
+ 9. Tico-Tico
+ 10. You Belong To My Heart
+ 11. The Breeze And I
+ 12. Coo Coo Roo Coo Coo Paloma
+ 13. Amapola
+ 14. Alla En El Rancho Grande
+ 15. Guantanamera
+ 16. Granada
+ 17. Maria Elena
+ 18. Sway
+ -->
+ <software name="ro302" supported="no">
+ <description>Latin (RO-302)</description>
+ <year>1983</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ラテン"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro302.bin" size="24576" crc="9d9a4770" sha1="097844d5ae398082bac95d501d1ecb735818a018"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 17 songs
+ 1. Top of the World
+ 2. Calcutta
+ 3. Fascination
+ 4. Green Green Grass of Home
+ 5. I Believe In Music
+ 6. Mona Lisa
+ 7. Song of the Pearl Fisher
+ 8. Spanish Eyes
+ 9. Strangers In The Night
+ 10. A Time For Us (Love Theme From "Romeo And Juliet")
+ 11. Goodbye To Love
+ 12. Bless The Beasts And The Children
+ 13. An Old Fashioned Love Song
+ 14. Ben
+ 15. Nadia's Theme
+ 16. The Diary
+ 17. Beyond The Reef
+ -->
+ <software name="ro303" supported="no">
+ <description>Easy Listening (RO-303)</description>
+ <year>1983</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="Easy Listening 2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="24576">
+ <rom name="ro303.bin" size="24576" crc="dced3d5a" sha1="6e1ac25dee8a1f6a676ffba5fe60d7c09aa525de"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Only Yesterday
+ 2. Rainy Days And Mondays
+ 3. Please Mr. Postman
+ 4. Hurting Each Other
+ -->
+ <software name="ro351" supported="no">
+ <description>Best of Carpenters (RO-351)</description>
+ <year>1984</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="カーペンターズ"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro351.bin" size="6144" crc="2561cfe7" sha1="d1e41b75141ef1965c8a7bfe5c711cc826311ff6"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Chitty Chitty Bang Bang
+ 2. Somewhere, My Love (Lara's Theme From 'Doctor Zhivado')
+ 3. Never On Sunday
+ 4. The Shadow of Your Smile (Love Theme From 'The Sandpiper')
+ -->
+ <software name="ro352" supported="no">
+ <description>All Time Movie Hits (RO-352)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="スクリーン・テーマ Vol.1"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro352.bin" size="6144" crc="07bc2a0b" sha1="c32164339b99cf7ea01c03a79660309a0e9f7a2e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. OB-LA-DI, OB-LA-DA
+ 2. Michelle
+ 3. P.S. I Love You
+ 4. Let It Be
+ -->
+ <software name="ro353" supported="no">
+ <description>Beatles (RO-353)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ビートルズ"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro353.bin" size="6144" crc="2ed433a2" sha1="4b5a3bcb821ca889dcf23b5dd7fe8109860f215b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Live For Life
+ 2. Aquarius
+ 3. From Russia With Love
+ 4. Baby Elephant Walk
+ -->
+ <software name="ro354" supported="no">
+ <description>Pop Themes (RO-354)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="スクリーン・テーマ Vol.2"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro354.bin" size="6144" crc="6dbbcae9" sha1="db77507350c0c117f6c0bc565a145b9c346948d9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. On The Sunny Side Of The Street
+ 2. Georgia On My Mind
+ 3. I Left My Heart In San Francisco
+ 4. Memories Of You
The earlier (1984) edition of this pack is labelled "Jazz Standards" while the later (1986) edition is "Great Standards."
- There are apparently no other differences between the editions.
-->
<software name="ro355" supported="no">
<description>Great Standards (RO-355)</description>
<year>1984</year>
- <publisher>Casio / Sight &amp; Sound International Inc. / HP Hal Leonard Publishing Corporation</publisher>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
<info name="alt_title" value="Jazz Standards"/>
+ <info name="alt_title" value="ジャズ"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro355.bin" size="6144" crc="dc0624c8" sha1="13b6aea39843792d4195ed64a047c0bf681f9873"/> <!-- Dumped from a cart labeled "Jazz Standards" -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. When You Wish Upon A Star
+ 2. Some Day My Prince Will Come
+ 3. Heigh-Ho
+ 4. La-La-Lu
+ 5. Bibbidi-Bobbidi-Boo
+ 6. Chim Chim Cheree
+ -->
+ <software name="ro356d" supported="no">
+ <description>Disney Movie Magic (RO-356D)</description>
+ <year>1985</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="ディズニー"/>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro355.bin" size="0x1800" crc="dc0624c8" sha1="13b6aea39843792d4195ed64a047c0bf681f9873"/> <!-- Dumped from a cart labeled "Jazz Standards" -->
+ <dataarea name="rom" size="6144">
+ <rom name="ro356d.bin" size="6144" crc="91c2a096" sha1="21cfe6efbba914e71ba2b7299e59bc5a1e52db69"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 6 songs
+ 1. Jingle Bells
+ 2. Silent Night
+ 3. Here Comes Santa Claus
+ 4. Joy To The World!
+ 5. I Saw Mommy Kissing Santa Claus
+ 6. Santa Claus Is Comin' To Town
+ -->
+ <software name="ro357x" supported="no">
+ <description>Christmas Songs (RO-357X)</description>
+ <year>19??</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="クリスマスソング"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro357x.bin" size="6144" crc="21e40fb6" sha1="60705ec52b601fd3261758207d275084c3dea8ad"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Touba
+ 2. Bahlam Bik
+ 3. Awal Marra
+ 4. Owlly Hagah
+ -->
+ <software name="ro453ii" supported="no">
+ <description>Arabian Nights (RO-453 II)</description>
+ <year>198?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro453ii.bin" size="6144" crc="29624827" sha1="fe0f9d382280d8e6500f289120ba2d288c853598"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Awaara Hoon (From Awaara Film)
- 2 Paoon Chu Lene De (From Taj Mahal Film)
- 3 Jo Wada Kiya Woh Nibana Padega (From Taj Mahal Film)
- 4 Aaja Sanam (From Chori Chori Film)
+ 1. Awaara Hoon (From Awaara Film)
+ 2. Paoon Chu Lene De (From Taj Mahal Film)
+ 3. Jo Wada Kiya Woh Nibana Padega (From Taj Mahal Film)
+ 4. Aaja Sanam (From Chori Chori Film)
-->
<software name="ro454" supported="no">
<description>Popular Hindi Film Songs (RO-454)</description>
<year>1991</year>
<publisher>Casio / IPRS</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro454.bin" size="0x1800" crc="68c946b3" sha1="b8380f12c80c4849988341ba3bd7afcdac89ddb8"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro454.bin" size="6144" crc="68c946b3" sha1="b8380f12c80c4849988341ba3bd7afcdac89ddb8"/>
</dataarea>
</part>
</software>
<!--
4 songs
- 1 Unterlanders Heimweh
- 2 Greensleeves
- 3 Die Lorelei
- 4 Old Folks at Home
+ 1. Unterlanders Heimweh
+ 2. Greensleeves
+ 3. Die Lorelei
+ 4. Old Folks at Home
-->
<software name="ro551" supported="no">
<description>World Songs (RO-551)</description>
<year>198?</year>
<publisher>Casio</publisher>
+ <info name="alt_title" value="World Songs (BRP-1)"/>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro551.bin" size="0x1800" crc="85d88a29" sha1="943c9c89f0fb79e55714c8d7e103b77449add1f1"/> <!-- OKI M5268 -->
+ <dataarea name="rom" size="6144">
+ <rom name="ro551.bin" size="6144" crc="85d88a29" sha1="943c9c89f0fb79e55714c8d7e103b77449add1f1"/> <!-- OKI M5268 -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 4 songs
+ 1. Chopin's Nocturne
+ 2. Schubert's Serenade
+ 3. Tchaikovsky's Piano Concerto No.1
+ 4. Scene From "Swan Lake"
+ -->
+ <software name="ro552" supported="no">
+ <description>Classic (RO-552)</description>
+ <year>198?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <info name="alt_title" value="クラシックス"/>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro552.bin" size="6144" crc="57a9b1d1" sha1="a8f07f0a1133aa8eb74cc0b6dae98b70e869f006"/>
</dataarea>
</part>
</software>
<!--
6 songs
- 1 When The Saints Go Marching In
- 2 Santa Lucia
- 3 Long, Long Ago
- 4 Ach Du Lieber Augustin
- 5 The Stagecoach
- 6 Air On The G String
+ 1. When The Saints Go Marching In
+ 2. Santa Lucia
+ 3. Long, Long Ago
+ 4. Ach Du Lieber Augustin
+ 5. The Stagecoach
+ 6. Air On The G String
-->
<software name="ro554" supported="no">
<description>Family Songs (RO-554)</description>
<year>198?</year>
<publisher>Casio</publisher>
<part name="cart" interface="casio_rompack">
- <dataarea name="rom" size="0x1800">
- <rom name="ro554.bin" size="0x1800" crc="b2a7e464" sha1="00585688adc4e0d8a21722e79f75c14ed5b24f5b"/>
+ <dataarea name="rom" size="6144">
+ <rom name="ro554.bin" size="6144" crc="b2a7e464" sha1="00585688adc4e0d8a21722e79f75c14ed5b24f5b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 5 songs
+ 1. When The Saints Go Marching In
+ 2. Air on the G String
+ 3. Jingle Bells
+ 4. Chopin's Nocturne
+ 5. March From "Nutcracker"
+ -->
+ <software name="ro555" supported="no">
+ <description>Home Melodies (RO-555)</description>
+ <year>198?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro555.bin" size="6144" crc="a1ba2eb3" sha1="d838098f46f6eb4fb50a6b47993d215ac29b5c63"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 20 songs
+ 1. When The Saints Go Marching In
+ 2. Chopin's Nocturne
+ 3. Air on the G String
+ 4. I Have Lost The Doh of My Clarinet
+ 5. Rock
+ 6. Disco
+ 7. 16 Beat
+ 8. Swing 2 Beat
+ 9. Swing 4 Beat
+ 10. Samba
+ 11. Bossa Nova
+ 12. Beguine
+ 13. Tango
+ 14. March
+ 15. Slow Rock
+ 16. Waltz
+ 17. Rock With Fill-in
+ 18. Disco With Fill-in
+ 19. 16 Beat With Fill-in
+ 20. Swing 2 Beat With FIll-in
+ -->
+ <software name="ro556" supported="no">
+ <description>DH Songs &amp; Rhythms (RO-556)</description>
+ <year>198?</year>
+ <publisher>Casio / Sight &amp; Sound International Inc.</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ro556.bin" size="6144" crc="c6eec5b8" sha1="d63067cf59e13c6c501d54c185278e7d63b56eda"/>
+ </dataarea>
+ </part>
+ </software>
+
+<!-- INTEGRATED ROM PACK DATA -->
+ <!--
+ 4 songs
+ 1. The Muppet Show Theme
+ 3. The Rainbow Connection
+ 5. Movin' Right Along
+ 7. The First Time It Happens
+ ROM Pack data chip integrated in the keyboard's board, in place of the slot for interchangeable ROM Packs.
+ Songs 2, 4 and 6 are empty files to make the ROM use only the white keys for music selection.
+ -->
+ <software name="ep20" supported="no">
+ <description>Jim Henson's Muppets (EP-20)</description>
+ <year>1987</year>
+ <publisher>Casio / Hal Leonard Publishing Corporation</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="6144">
+ <rom name="ep20.bin" size="6144" crc="c706e366" sha1="36c40705e659e5b17720d6ebb4c5f5491d3b8f0f"/> <!-- OKI MS268V-57 -->
+ </dataarea>
+ </part>
+ </software>
+
+ <!--
+ 1 song
+ 1. Dance of the Hours
+ ROM Pack data chip integrated in the keyboard's board.
+ -->
+ <software name="mt800" supported="no">
+ <description>MT-800 preset demonstration music</description>
+ <year>1987</year>
+ <publisher>Casio</publisher>
+ <part name="cart" interface="casio_rompack">
+ <dataarea name="rom" size="2048">
+ <rom name="mt800.bin" size="2048" crc="ac8ed156" sha1="264ddb4e02311243f84501e89dfd123aa7fc1414"/>
</dataarea>
</part>
</software>
diff --git a/hash/cassvisn_cart.xml b/hash/cassvisn_cart.xml
new file mode 100644
index 00000000000..8ef244877ca
--- /dev/null
+++ b/hash/cassvisn_cart.xml
@@ -0,0 +1,215 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+-->
+<!--
+The following games exist for this platform
+
+1 Yosaku
+2 Baseball
+3 Galaxian
+4 Big Sports 12
+5 Battle Vader
+6 PakPak Monster
+7 New Baseball
+8 Monster Mansion
+9 Astro Command
+10 Grand Champion*
+11 Monster Block
+12 Elevator Panic
+
+* = not dumped
+
+-->
+
+<!--
+Note on PRG size (from CPU documentation)
+
+Physically, 128 * 15 * 12 = 23,040 bits
+Logically, 127 * 15 * 12 = 22,860 bits (as final word of each page is inaccessible by the CPU)
+
+the ROM files below store 12 bit in a 16-bit word with 4 bits unused, so 128 * 15 * (12+4)
+-->
+
+<softwarelist name="cassvisn_cart" description="Epoch Cassette Vision cartridges">
+
+ <software name="yosaku" supported="no">
+ <description>Yosaku</description>
+ <year>1981</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="きこりの与作"/> <!-- Kikori no Yosaku -->
+ <info name="release" value="19810730"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c005prog.s01" size="0xf00" crc="f917d2f0" sha1="b26baf2fd9b961b5a0e0475dfac93c18bd54cc4d"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c005_pat.s01" size="0x4d0" crc="bf085553" sha1="321262b6dd67789e03db8f03160cb1819529f43c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="baseball" supported="no">
+ <description>Baseball</description>
+ <year>1981</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="ベースボール"/>
+ <info name="release" value="19810730"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d778c_prog.s01" size="0xf00" crc="34127969" sha1="56528b54720b844a6275d219fb78e51caf06f777"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d778c_pat.s01" size="0x4d0" crc="603fa141" sha1="e30f5ce85d8e2419025d52a7c733be2c127cc24f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- PCB is silkscreened 006, ROM here is 007 is there an undumped earlier version? -->
+ <software name="galaxian" supported="no">
+ <description>Galaxian</description>
+ <year>1981</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="ギャラクシアン"/>
+ <info name="release" value="19810810"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c007prog.s01" size="0xf00" crc="538c13d3" sha1="537287e63b311caa281d8c6456f9cbe2eaebb9e7"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c007_pat.s01" size="0x4d0" crc="d343eca4" sha1="e8f0312de0d7f0934a66192c1aaa2c802532b021"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bigspt12" supported="no">
+ <description>Big Sports 12</description>
+ <year>1982</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="ビッグスポーツ12"/>
+ <info name="release" value="19820615"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c004prog.s01" size="0xf00" crc="030fc0d2" sha1="b1efe8ff1bc51082502253e63721e656ee75edda"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c004_pat.s01" size="0x4d0" crc="7df5eb39" sha1="c59f6febf5f51eebc0cc8d288df6b5319510ecbf"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- PCB is skilscreened TV Vader & Yosaku, is there also a version of Yosaku using a D774C? -->
+ <software name="btlvader" supported="no">
+ <description>Battle Vader</description>
+ <year>1982</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="バトルべーダー"/>
+ <info name="release" value="19820303"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d774cprog.s01" size="0xf00" crc="2bbe734f" sha1="04f2b6003b41bad2d246bd2e912887fdc77520c4"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d774c_pat.s01" size="0x4d0" crc="5efbc1f4" sha1="1c5774113c554e26e8d0b7002d2f7b9d79107c82"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pakpak" supported="no">
+ <description>PakPak Monster</description>
+ <year>1982</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="パクパクモンスター"/>
+ <info name="release" value="19820713"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c008prog.s01" size="0xf00" crc="254127d5" sha1="1217542ba02d84eeb0fad7b271a188ed2737fa71"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c008_pat.s01" size="0x4d0" crc="e17f5d04" sha1="4393b21d3ef4e98ebf8d25ffb9b3f287fbbb23cb"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nbasebal" supported="no">
+ <description>New Baseball</description>
+ <year>1982</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="ニューベースボール"/>
+ <info name="release" value="19820615"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c002prog.s01" size="0xf00" crc="65dae0cb" sha1="468ec1869235e96da2374f7a165d1d9ca96f3044"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c002_pat.s01" size="0x4d0" crc="434209f8" sha1="e783cb265618c598ad614bf29c833f3e47ee6487"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="monstrmn" supported="no">
+ <description>Monster Mansion</description>
+ <year>1982</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="モンスターマンション"/>
+ <info name="release" value="19821007"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c009prog.s01" size="0xf00" crc="e453a00c" sha1="7f3c20653c8f6168d17cad40eac5926e6e9bb7b0"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c009_pat.s01" size="0x4d0" crc="75deffbd" sha1="4f4c25fa9f96a345f7128ff0b52de315117da549"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="astrocmd" supported="no">
+ <description>Astro Command</description>
+ <year>1982</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="アストロコマンド"/>
+ <info name="release" value="19820803"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c010prog.s01" size="0xf00" crc="2691f5ce" sha1="f5510e139c6bda266450d3feaffe073374608b08"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c010_pat.s01" size="0x4d0" crc="8b0c00bd" sha1="6fc01434fd92172eeaa7600742525ed69ecb90c2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="monstrbk" supported="no">
+ <description>Monster Block</description>
+ <year>1984</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="モンスターブロック"/>
+ <info name="release" value="19840316"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c013prog.s01" size="0xf00" crc="81903844" sha1="0fbccdb42c245ad62b14041256df0f33e83bc32a"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c013_pat.s01" size="0x4d0" crc="abf87caa" sha1="dd629bd43bea70ece9f9cd25b70eeef1caf72828"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elvpanic" supported="no">
+ <description>Elevator Panic</description>
+ <year>1984</year>
+ <publisher>Epoch</publisher>
+ <info name="alt_title" value="エレベーターパニック"/>
+ <info name="release" value="19840801"/>
+ <part name="cart" interface="cassvisn_cart">
+ <dataarea name="prg" width="16" endianness="big" size="0xf00">
+ <rom name="d777c015prog.s01" size="0xf00" crc="709002f2" sha1="d88213dfcac99e303a34a0ad0561bf9242279873"/>
+ </dataarea>
+ <dataarea name="pat" size="0x4d0">
+ <rom name="d777c015_pat.s01" size="0x4d0" crc="51654eb2" sha1="e5e602a7c5dd2725b67235d401203ddd398bee9b"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/cbm2_flop.xml b/hash/cbm2_flop.xml
index 29e7c6f3683..ab328ae80b2 100644
--- a/hash/cbm2_flop.xml
+++ b/hash/cbm2_flop.xml
@@ -670,7 +670,7 @@ license:CC0-1.0
</software>
<software name="cbug44a" cloneof="cbug44">
- <description>CBUG #44 (Alt)</description>
+ <description>CBUG #44 (alt)</description>
<year>1983</year>
<publisher>Chicago B128 Users Group</publisher>
@@ -706,7 +706,7 @@ license:CC0-1.0
</software>
<software name="cbug47a" cloneof="cbug47">
- <description>CBUG #47 (Alt)</description>
+ <description>CBUG #47 (alt)</description>
<year>1983</year>
<publisher>Chicago B128 Users Group</publisher>
@@ -730,7 +730,7 @@ license:CC0-1.0
</software>
<software name="cbug48a" cloneof="cbug48">
- <description>CBUG #48 (Alt)</description>
+ <description>CBUG #48 (alt)</description>
<year>1983</year>
<publisher>Chicago B128 Users Group</publisher>
@@ -899,7 +899,7 @@ license:CC0-1.0
</software>
<software name="cbug60a" cloneof="cbug60">
- <description>CBUG #60 (Alt)</description>
+ <description>CBUG #60 (alt)</description>
<year>1983</year>
<publisher>Chicago B128 Users Group</publisher>
diff --git a/hash/cbm8296_flop.xml b/hash/cbm8296_flop.xml
index 5ab5535f52c..f34c9606e13 100644
--- a/hash/cbm8296_flop.xml
+++ b/hash/cbm8296_flop.xml
@@ -17,20 +17,26 @@ license:CC0-1.0
</part>
</software>
- <software name="execdesk">
+ <software name="execudsk">
<description>ExecuDesk</description>
<year>1984</year>
<publisher>Commodore</publisher>
<part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="174848">
- <rom name="execudesk1.d64" size="174848" crc="1aa9a9aa" sha1="9445cc89d08215d173e84841d3b01ed327d8347c" status="baddump" />
+ <dataarea name="flop" size="533248">
+ <rom name="execudesk.d80" size="533248" crc="7c72a37a" sha1="e730be7d54f02b7eca13d555e25cfbfc7c144c59" />
</dataarea>
</part>
+ </software>
+
+ <software name="petpeeve" supported="no">
+ <description>PETpeeve</description>
+ <year>2025</year>
+ <publisher>Rabenauge &amp; Plush &amp; Crest</publisher>
- <part name="flop2" interface="floppy_5_25">
- <dataarea name="flop" size="174848">
- <rom name="execudesk2.d64" size="174848" crc="9553ea18" sha1="01ed09de6635522ca69e7d2784c81d3a06cee1c3" status="baddump" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="1066496">
+ <rom name="PETpeeve.d82" size="1066496" crc="00681a19" sha1="88421431acc9887acb79e091d7c38857f267e811" />
</dataarea>
</part>
</software>
diff --git a/hash/cd32.xml b/hash/cd32.xml
index 4e27a0023e6..624ac82859c 100644
--- a/hash/cd32.xml
+++ b/hash/cd32.xml
@@ -6,7 +6,7 @@ license:CC0-1.0
<softwarelist name="cd32" description="Commodore Amiga CD32 CD-ROMs">
<!--
- UNDUMPED:
+ UNDUMPED (possibly outdated, cfr. amigacd.xml):
1001 Girl
Acid Attack Compilation (Guardian, Roadkill, Super Skidmarks)
@@ -75,7 +75,6 @@ license:CC0-1.0
James Pond 3: Operation Starfi5h [Kixx]
John Barnes European Football
Jungle Strike
- Kang Fu (AmigaCD)
Karaoke: Julsånger I
Kingpin: Arcade Sports Bowling
Labyrinth Of Time, The
@@ -732,7 +731,8 @@ license:CC0-1.0
<description>Brutal Sports Series: Football</description>
<year>1994</year>
<publisher>Millennium</publisher>
- <info name="alt_title" value="Brutal Football" /> <!-- Cover title -->
+ <!-- Cover/CD title -->
+ <info name="alt_title" value="Brutal Football" />
<info name="disc_matrix" value="CDD3361 BRUTAL FOOTBALL : MASTERED BY NIMBUS" />
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
diff --git a/hash/cdi.xml b/hash/cdi.xml
index 918ce7eff9b..13a71ccfed3 100644
--- a/hash/cdi.xml
+++ b/hash/cdi.xml
@@ -3,7 +3,7 @@
<!--
license:CC0-1.0
-->
-<softwarelist name="cdi" description="Philips CD-i CD-ROMs">
+<softwarelist name="cdi" description="Philips CD-i images (Green Book)">
<!--
Most of these are converted from old TOSEC set (I think v2009-04-05).
@@ -20,7 +20,7 @@ license:CC0-1.0
<description>3rd Degree (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="3rd degree (1993)(philips)(us)" sha1="f3a2f33fac9b6258d1e82f46d261bb956527c02b"/>
</diskarea>
@@ -45,14 +45,14 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="The Game" />
<feature name="cd_matrix" value="8110033V113 50404169 02" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(eu)(disc 1 of 2)[the game][dvc][8110033v113 50404169 02]" sha1="df0e66f45e7731870d6ceda8f943d1341f6fbfdd"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Music" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(eu)(disc 2 of 2)[the music, die musik][cd-audio]" sha1="75c1184454b7f878e3a52fe47928bfb8e075e7b3"/>
@@ -78,14 +78,14 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="The Game" />
<feature name="cd_matrix" value="8111033V113 50404169 01" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(eu)(disc 1 of 2)[the game][dvc][8111033v113 50404169 01]" sha1="b0da1a5b88cae2a47d00c64520775ff9840a7ad9"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Music" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(eu)(disc 2 of 2)[the music, die musik][cd-audio]" sha1="75c1184454b7f878e3a52fe47928bfb8e075e7b3"/>
@@ -111,13 +111,13 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Das Spiel" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(de)(disc 1 of 2)[das spiel][dvc]" sha1="d73d783fc580e927653077afa4867d3316f77674"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Die Musik" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(eu)(disc 2 of 2)[the music, die musik][cd-audio]" sha1="75c1184454b7f878e3a52fe47928bfb8e075e7b3"/>
@@ -143,13 +143,13 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Le Jeu" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(fr)(disc 1 of 2)[le jeu][dvc]" sha1="5fee7d8eac3e6fa3c94e8e753622d115c27bc3d4"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Music (?)" />
<diskarea name="cdrom">
<disk name="7th guest, the (1994)(philips)(eu)(disc 2 of 2)[the music, die musik][cd-audio]" sha1="75c1184454b7f878e3a52fe47928bfb8e075e7b3"/>
@@ -166,7 +166,7 @@ license:CC0-1.0
<description>A Great Day at the Races (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a great day at the races (1993)(philips)(eu)" sha1="8d840c884c31a06266d2e64d90b015e025371598"/>
</diskarea>
@@ -182,7 +182,7 @@ license:CC0-1.0
<description>A Great Day at the Races (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a great day at the races (1993)(philips)(us)" sha1="76e836bca75e85ec957c0898483596841779f6af"/>
</diskarea>
@@ -199,7 +199,7 @@ license:CC0-1.0
<description>L'Affaire Morlov (Europe)[CD-i-PC]</description>
<year>1996</year>
<publisher>Titus</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="affaire morlov, l' (1996)(titus)(eu)(en-fr)[the morlov affair][cd-i-pc]" sha1="ebd7586ff238e366f789f8b5e2e30e17b045b4b0"/>
</diskarea>
@@ -215,7 +215,7 @@ license:CC0-1.0
<description>Alice in Wonderland (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice in wonderland (1992)(philips)(us)" sha1="1a3934a3b8d29ed0f910a3f988c4776fa0e15e14"/>
</diskarea>
@@ -231,7 +231,7 @@ license:CC0-1.0
<description>Alice in Wonderland (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice in wonderland (1993)(philips)(nl)" sha1="5c943192fd69c8c6c827fdf3b06f29b33581306b"/>
</diskarea>
@@ -247,7 +247,7 @@ license:CC0-1.0
<description>Alice au Pays des Merveilles (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice au pays des merveilles (1992)(philips)(fr)" sha1="1558b0ba6e20c4dcc18355968d183ad69e40d3b5"/>
</diskarea>
@@ -263,7 +263,7 @@ license:CC0-1.0
<description>Arcade Classics (Europe)</description>
<year>1996</year>
<publisher>Namco ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="arcade classics (1996)(namco - philips)(eu)[compilation]" sha1="caed8d155b7f0cd26685e62cced38af3c8cb81d9"/>
</diskarea>
@@ -279,7 +279,7 @@ license:CC0-1.0
<description>Archeon CD-i Quiz (Netherlands)</description>
<year>1994</year>
<publisher>Dutch Electronic Publishers</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="archeon cd-i quiz (1994)(dutch electronic publishers)(nl)(en-nl)" sha1="edccfcea1279b96bd6c13f238965492d1554811f"/>
</diskarea>
@@ -295,7 +295,7 @@ license:CC0-1.0
<description>Astérix - Caesar's Challenge v3.9 (Europe)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asterix - caesar's challenge v3.9 (1995)(pathe - philips)(eu)" sha1="9359dd22f853dbb46ce128d6e7cae0162fd15069"/>
</diskarea>
@@ -311,7 +311,7 @@ license:CC0-1.0
<description>Astérix - De Uitdaging Van Caesar v3.9 (Netherlands)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asterix - de uitdaging van caesar v3.9 (1995)(pathe - philips)(nl)" sha1="c2ac85e95a70f60c7b83f19ba0d527c58b2d69f3"/>
</diskarea>
@@ -327,7 +327,7 @@ license:CC0-1.0
<description>Asterix - Die Grosse Reise v3.9 (Germany)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asterix - die grosse reise v3.9 (1995)(pathe - philips)(de)" sha1="8d80ba0a3c93d08d0ab32271d2e79bad9be7647f"/>
</diskarea>
@@ -343,7 +343,7 @@ license:CC0-1.0
<description>Asterix - El Desafio de Cesar v3.9 (Spain)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asterix - el desafio de cesar v3.9 (1995)(pathe - philips)(es)" sha1="224027e2fdc178128218e908fbfc66b3eccf5656"/>
</diskarea>
@@ -359,7 +359,7 @@ license:CC0-1.0
<description>Astérix - La Sfida di Cesare v3.9 (Italy)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asterix - la sfida di cesare v3.9 (1995)(pathe - philips)(it)" sha1="38194fc3db7e185a154d772327105e97d50a1ca4"/>
</diskarea>
@@ -375,7 +375,7 @@ license:CC0-1.0
<description>Astérix - Le Défi de César v3.9 (France)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asterix - le defi de cesar v3.9 (1995)(pathe - philips)(fr)" sha1="706301de356a1b3a4ff8e15d7575a93cd82046c2"/>
</diskarea>
@@ -392,7 +392,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="atlantis - the last resort v1.11 (1996)(philips)(eu)[dvc]" sha1="6b5e74ec5a423b81404a310c2d5b9b52521ea650"/>
</diskarea>
@@ -408,7 +408,7 @@ license:CC0-1.0
<description>Axis and Allies (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="axis and allies (1994)(philips)(us)" sha1="11b9c11ce9d82407bbf3cff87ff8a82bb53a0986"/>
</diskarea>
@@ -424,7 +424,7 @@ license:CC0-1.0
<description>Backgammon (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="backgammon (1992)(philips)(eu-us)" sha1="d0efa963496556538d346c5f311874e3858782a1"/>
</diskarea>
@@ -440,7 +440,7 @@ license:CC0-1.0
<description>Battleship (Europe, USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="battleship (1991)(philips)(eu-us)" sha1="824cc8e354aa3a500b3db45fdd93197fb2db77dd"/>
</diskarea>
@@ -457,7 +457,7 @@ license:CC0-1.0
<year>1997</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="brain dead 13 v1.07 (1997)(philips)(eu)[dvc]" sha1="3e5c466567d8175fc79d466d4d4d86ff973d02b5"/>
</diskarea>
@@ -473,7 +473,7 @@ license:CC0-1.0
<description>BURN-CYCLE (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burn-cycle (1994)(philips)(eu)" sha1="08dfa95f70bdaf899fe392b2bf68de814cc0a545"/>
</diskarea>
@@ -489,7 +489,7 @@ license:CC0-1.0
<description>BURN-CYCLE (Spain)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burn-cycle (1994)(philips)(es)" sha1="5e41af403f713e25ce4cf48309bb27a5232efac7"/>
</diskarea>
@@ -505,7 +505,7 @@ license:CC0-1.0
<description>BURN-CYCLE (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burn-cycle (1995)(philips)(de)" sha1="2eef0a66f22b6792c6fa0ea777df6a6494ad1bff"/>
</diskarea>
@@ -521,7 +521,7 @@ license:CC0-1.0
<description>BURN-CYCLE (Italy)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burn-cycle (1995)(philips)(it)" sha1="7cf5f1d745d7bdbe65f5df385ef2c44955065772"/>
</diskarea>
@@ -537,7 +537,7 @@ license:CC0-1.0
<description>BURN-CYCLE (France, demo)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burn-cycle (demo) (1995)(philips)(fr)" sha1="60b3e7ddc4322eaf95cb53d8186a1420c9b5a4e6"/>
</diskarea>
@@ -554,7 +554,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="caesars world of boxing (1993)(philips)(eu)[dvc]" sha1="4696713492e3ee2f557c8b764a980a2890c798d6"/>
</diskarea>
@@ -570,7 +570,7 @@ license:CC0-1.0
<description>Caesars World of Boxing (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="18621209 01" />
<diskarea name="cdrom">
<disk name="caesars world of boxing (1993)(philips)(us)[18621209 01]" sha1="e39bc2ee3e35f15fdf4b31ed6700797569f86891"/>
@@ -587,7 +587,7 @@ license:CC0-1.0
<description>Caesars World of Boxing (USA, alt)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="18621217 03" />
<diskarea name="cdrom">
<disk name="caesars world of boxing (1993)(philips)(us)[18621217 03]" sha1="c4f6bf539e6ab64e91128e27025abcd4ba78cc0d"/>
@@ -604,7 +604,7 @@ license:CC0-1.0
<description>Caesars World of Gambling (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="caesars world of gambling (1992)(philips)(eu-us)" sha1="ff808f560337a039505dc55d7bc28b1e1d72c0b1"/>
</diskarea>
@@ -620,7 +620,7 @@ license:CC0-1.0
<description>CD Shoot (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd shoot (1992)(philips)(eu)(m8)" sha1="5cdb62cd737e82ed89b5918fa90632325faa76a1"/>
</diskarea>
@@ -636,7 +636,7 @@ license:CC0-1.0
<description>CD Shoot (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd shoot (1992)(philips)(us)" sha1="e8a8a675ac3dd17346fb19eb0b3a212ef08fbd2c"/>
</diskarea>
@@ -653,7 +653,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="centurion (1995)(philips)(nl)[dvc]" sha1="3cfb248ab6c6618042811619c822fe21bc366139"/>
</diskarea>
@@ -670,7 +670,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="chaos control v1.15 (1995)(philips)(eu)[dvc]" sha1="16664ee9dd8ba621ae9807a071e2bc6ebff19c5b"/>
</diskarea>
@@ -687,7 +687,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="chaos control v1.15 (1995)(philips)(fr)[dvc]" sha1="44cec31d7ac71f21b0346afda5ac9f7ea746c4a3"/>
</diskarea>
@@ -704,7 +704,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="chaos control v1.15 (1995)(philips)(de)[dvc]" sha1="ea0ecba741b3519d892f85b712984cfb916fc134"/>
</diskarea>
@@ -721,7 +721,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="chaos control v1.15 (1995)(philips)(us)[dvc]" sha1="fbcf47cb0d978ec106aa5adce88c78ece9c2f577"/>
</diskarea>
@@ -738,7 +738,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Creative Media</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="christmas country (1996)(creative media)(eu)[dvc]" sha1="de8b40fb30008bc6a70075e09b65d94944e40c2e"/>
</diskarea>
@@ -755,7 +755,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>DIMA ~ Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="christmas crisis (1995)(dima - philips)(eu)[dvc]" sha1="44534e3c1fdb990321a159ffbd411b56a5f4fb54"/>
</diskarea>
@@ -772,7 +772,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cluedo (1994)(philips)(eu)[dvc]" sha1="c32bb7df75e6091a0a9f59553ac295b93f625007"/>
</diskarea>
@@ -789,7 +789,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="clue (1994)(philips)(us)[dvc]" sha1="32efc76259ba41781d715fdeb686e2a67170f092"/>
</diskarea>
@@ -806,7 +806,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cluedo - the mysteries continue (1995)(philips)(eu)[dvc]" sha1="ac4946a1f01c01b50ef5b4af6489f6df2fae1fea"/>
</diskarea>
@@ -822,7 +822,7 @@ license:CC0-1.0
<description>Connect Four v1 (Europe, USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="connect four v1 (1991)(philips)(eu-us)" sha1="006431580ece4fd1df0013edd89d1751f39f381d"/>
</diskarea>
@@ -841,12 +841,12 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips ~ Virgin</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="creature shock (1996)(philips - virgin)(eu)(disc 1 of 2)[dvc]" sha1="a88796b0b63f1432d91bece8e78b2642f4b6cc06"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="creature shock (1996)(philips - virgin)(eu)(disc 2 of 2)[dvc]" sha1="4423f00c7f2da1389804ff51feb94fc2e6b95445"/>
</diskarea>
@@ -862,7 +862,7 @@ license:CC0-1.0
<description>Dark Castle (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dark castle (1992)(philips)(eu-us)" sha1="7022fcba78020fa3e6f07c64e6042e635ff3f292"/>
</diskarea>
@@ -878,7 +878,7 @@ license:CC0-1.0
<description>Defender of the Crown (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="defender of the crown (1992)(philips)(eu-us)" sha1="0e3f6f253c5baebf5f22999593d887537707140c"/>
</diskarea>
@@ -894,7 +894,7 @@ license:CC0-1.0
<description>Do you Remember the '60's (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="do you remember the '60's (1996)(philips)(eu)" sha1="4f152215931a49a3f389ab0c790e8870a5001795"/>
</diskarea>
@@ -910,7 +910,7 @@ license:CC0-1.0
<description>Domino - Het Oudste Spel, Het Nieuwste Medium (Netherlands)</description>
<year>1997</year>
<publisher>Haarlems Uitgeef Bedrijf</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="domino - het oudste spel, het nieuwste medium (1997)(haarlems uitgeef bedrijf)(nl)" sha1="e91e75c9c2f02fb5c72baf66d6f590234c4ebb48"/>
</diskarea>
@@ -927,7 +927,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon's lair (1994)(philips)(eu)[dvc]" sha1="cd09b56677c65b30d96a69d2fde333a4a8a32f91"/>
</diskarea>
@@ -944,7 +944,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon's lair (1994)(philips)(us)[dvc]" sha1="8ba6707ee5df7229e77b3089c6ac29f2da511252"/>
</diskarea>
@@ -960,7 +960,7 @@ license:CC0-1.0
<description>Dragon's Lair II - Time Warp (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon's lair ii - time warp (1994)(philips)(eu)" sha1="ba51e22cba51ecce7779eb8173d35bbb770cba5c"/>
</diskarea>
@@ -977,7 +977,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="13920805 02" />
<diskarea name="cdrom">
<disk name="dragon's lair ii - time warp (1994)(philips)(us)[dvc][13920805 02]" sha1="7b7201b6a84b451cc215a809658009f217580020"/>
@@ -995,7 +995,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="13920805 01" />
<diskarea name="cdrom">
<disk name="dragon's lair ii - time warp (1994)(philips)(us)[dvc][13920805 01]" sha1="ff2c4737ac06696d77be2f25e390da3979138728"/>
@@ -1013,7 +1013,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="drug wars (1996)(philips)(eu)[dvc]" sha1="63a6f519f399076be42e93a3b1c1635fbf615054"/>
</diskarea>
@@ -1029,7 +1029,7 @@ license:CC0-1.0
<description>Earth Command - The Future of Our World is in Your Hands v1.05 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="earth command - the future of our world is in your hands v1.05 (1994)(philips)(eu)" sha1="f3b54e47edd13bbe776ad211afd3e1cafbacba6d"/>
</diskarea>
@@ -1045,7 +1045,7 @@ license:CC0-1.0
<description>Earth Command - De Toekomst van de Wereld Ligt in Jouw Handen v1.05 (Netherlands)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="earth command - de toekomst van de wereld ligt in jouw handen v1.05 (1994)(philips)(nl)" sha1="a25c5c47f4139c48cb10e948d56eae9e2344af56"/>
</diskarea>
@@ -1061,7 +1061,7 @@ license:CC0-1.0
<description>Earth Command - Die Zukunft Unserer welt Liegt in Ihrer Hand v1.05 (Germany)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="earth command - die zukunft unserer welt liegt in ihrer hand v1.05 (1994)(philips)(de)" sha1="9a7acaaa892536b5a46a4f71f683e5906ceaf48b"/>
</diskarea>
@@ -1077,7 +1077,7 @@ license:CC0-1.0
<description>Earth Command - The Future of Our World is in Your Hands v1.05 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="earth command - the future of our world is in your hands v1.05 (1994)(philips)(us)" sha1="acd585143029b7659c7e63621a2aa23808a68680"/>
</diskarea>
@@ -1093,7 +1093,7 @@ license:CC0-1.0
<description>Earth Command v1.05 (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="earth command v1.05 (1994)(philips)(fr)" sha1="1e6d20cb747409d4441e90bf818e42c14f7cc610"/>
</diskarea>
@@ -1109,7 +1109,7 @@ license:CC0-1.0
<description>Effacer - Hangman of the 25th Century (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="effacer - hangman of the 25th century (1994)(philips)(us)" sha1="68e1fa1452ae6abf94c110521c0ea5b91ef87350"/>
</diskarea>
@@ -1125,7 +1125,7 @@ license:CC0-1.0
<description>Escape from CyberCity (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="escape from cybercity (1992)(philips)(eu-us)" sha1="8f579d288ce1155a03ff7291b3fe5476ff2ffcc1"/>
</diskarea>
@@ -1141,7 +1141,7 @@ license:CC0-1.0
<description>Family Games I (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="family games i (1995)(philips)(eu)[compilation]" sha1="1ea3af476337b176c2cac0da8a4992cbacc73cbd"/>
</diskarea>
@@ -1157,7 +1157,7 @@ license:CC0-1.0
<description>Family Games II - Junk Food Jive (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="family games ii - junk food jive (1995)(philips)(eu)[compilation]" sha1="358f27101eb81faead7e18b691c00f5d3a4fdca1"/>
</diskarea>
@@ -1173,7 +1173,7 @@ license:CC0-1.0
<description>Flashback (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="flashback (1995)(philips)(eu)(m7)" sha1="dd236aca6f78081a8b8d8d577e0dae770ea67f36"/>
</diskarea>
@@ -1189,7 +1189,7 @@ license:CC0-1.0
<description>Girl's Club - The Fantasy Dating Game (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="girl's club - the fantasy dating game (1993)(philips)(us)" sha1="77109348d8dba2303a58150a0c91241260fb1ab7"/>
</diskarea>
@@ -1205,7 +1205,7 @@ license:CC0-1.0
<description>Golden Oldies I (Europe)</description>
<year>1997</year>
<publisher>SPC Vision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="golden oldies i (1997)(spc vision)(eu)[compilation]" sha1="94e56295357b976e1d4d3dfd2a543e6c247d0068"/>
</diskarea>
@@ -1221,7 +1221,7 @@ license:CC0-1.0
<description>Golden Oldies II (Europe)</description>
<year>1997</year>
<publisher>SPC Vision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="golden oldies ii (1997)(spc vision)(eu)[compilation]" sha1="c4060ac07d70360cca42260034949f2534321233"/>
</diskarea>
@@ -1238,7 +1238,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>CANAL+ ~ Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="guignols de l'info, les - le jeu (1996)(canal+ - philips)(fr)[dvc]" sha1="f85f3fa97e65664bacba69489ab5ecf539dc0e6b"/>
</diskarea>
@@ -1254,7 +1254,7 @@ license:CC0-1.0
<description>Hieroglyph (Germany)</description>
<year>1994</year>
<publisher>ZYX-Music</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hieroglyph (1994)(zyx-music)(de)" sha1="e382bc2762022d4e0fecb4600990f4bb4eb3849d"/>
</diskarea>
@@ -1270,7 +1270,7 @@ license:CC0-1.0
<description>Hotel Mario (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hotel mario (1994)(philips)(eu)" sha1="b75164b0b9bdb4058a640fbc54e4b44dc4638092"/>
</diskarea>
@@ -1286,7 +1286,7 @@ license:CC0-1.0
<description>Hotel Mario (prototype v0.09, 19931123)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hotel mario (prototype v 0.09, 19931123)" sha1="3f0375fb2c74b9abc7c4eb8ef0b3f907b70307cb"/>
</diskarea>
@@ -1302,7 +1302,7 @@ license:CC0-1.0
<description>Hotel Mario (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hotel mario (1994)(philips)(us)" sha1="b98fb04b357c92e42797f1486160c670762b4329"/>
</diskarea>
@@ -1318,7 +1318,7 @@ license:CC0-1.0
<description>Inca (Europe)</description>
<year>1993</year>
<publisher>Coktel Vision ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100126 50341 698 01" />
<diskarea name="cdrom">
<disk name="inca (1993)(coktel vision - philips)(eu)(m4)[en-de-fr-nl][8100126 50341 698 01]" sha1="01af974debc2d397186213e95a4753fb6c0c4e55"/>
@@ -1335,7 +1335,7 @@ license:CC0-1.0
<description>Inca (Europe)[FPD Testing - Phase 1]</description>
<year>1993</year>
<publisher>Coktel Vision ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="inca (1993-04-21)(coktel vision - philips)(eu)(m4)[en-de-fr-nl][fpd testing - phase 1]" sha1="8ffda4b734484f9d2f23f493dbca0dafcb061779"/>
</diskarea>
@@ -1351,7 +1351,7 @@ license:CC0-1.0
<description>Inca (Europe, alt 1)</description>
<year>1994</year>
<publisher>Coktel Vision ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100126V206 50399445 01" />
<diskarea name="cdrom">
<disk name="inca (1994)(coktel vision - philips)(eu)(m4)[en-de-fr-nl][8100126v206 50399445 01]" sha1="38c7edc97b9d4af71f6da69436ab96de30ddb9e4"/>
@@ -1368,7 +1368,7 @@ license:CC0-1.0
<description>Inca (Europe, alt 2)</description>
<year>1994</year>
<publisher>Coktel Vision ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="inca (1994)(coktel vision - philips)(eu)(m4)[es-fr-it-pt]" sha1="0907428604f6238fd220a455aca516169cfe2af8"/>
</diskarea>
@@ -1384,7 +1384,7 @@ license:CC0-1.0
<description>International Tennis Open (Europe, USA)</description>
<year>1993</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open (1993)(pathe - philips)(eu-us)(en-fr)" sha1="fe3636263c9f2afa8d014ae0c9330539d555fc44"/>
</diskarea>
@@ -1400,7 +1400,7 @@ license:CC0-1.0
<description>International Tennis Open v2.01 (Spain)</description>
<year>1993</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open v2.01 (1993)(pathe - philips)(es)(en-es)" sha1="f139228220ef957a488274fef9be9dddb9b4f6df"/>
</diskarea>
@@ -1416,7 +1416,7 @@ license:CC0-1.0
<description>International Tennis Open v3.01 (Germany)</description>
<year>1993</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open v3.01 (1993)(pathe - philips)(de)(en-de)" sha1="74ccd4905af824b2a020c838576b102b60eb01a5"/>
</diskarea>
@@ -1432,7 +1432,7 @@ license:CC0-1.0
<description>International Tennis Open v3.01 (Germany)[2 players]</description>
<year>1994</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open v3.01 (1994)(pathe - philips)(de)(en-de)[2 players]" sha1="a173720b1afe2dc48e90024d8c58da0c8cd85b35"/>
</diskarea>
@@ -1448,7 +1448,7 @@ license:CC0-1.0
<description>International Tennis Open v1.01 (Italy)[2 players]</description>
<year>1994</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open v1.01 (1994)(pathe - philips)(it)(en-it)[2 players]" sha1="9e2a05621eb7c1d54cf00bcb55498284f211fdc9"/>
</diskarea>
@@ -1464,7 +1464,7 @@ license:CC0-1.0
<description>International Tennis Open v3.03 (Europe)[2 players]</description>
<year>1994</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open v3.03 (1994)(pathe - philips)(eu)(en-fr)[2 players]" sha1="ce7055658769e7a9913d5cd5d9725b2521d1a9e4"/>
</diskarea>
@@ -1480,7 +1480,7 @@ license:CC0-1.0
<description>International Tennis Open v3.03 (USA)[2 players]</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="international tennis open v3.03 (1994)(philips)(us)(en-fr)[2 players]" sha1="64410045149b3479114f937f428ea2d03098fdf8"/>
</diskarea>
@@ -1496,7 +1496,7 @@ license:CC0-1.0
<description>Jeopardy! (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jeopardy (1994)(philips)(us)" sha1="1e22a814391dd417ef968baed80cf33ad3552098"/>
</diskarea>
@@ -1512,7 +1512,7 @@ license:CC0-1.0
<description>Jigsaw - The Ultimate Electronic Challenge (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jigsaw - the ultimate electronic challenge (1992)(philips)(us)" sha1="9f376c9f204039ad87538757af979053ea7c079a"/>
</diskarea>
@@ -1528,7 +1528,7 @@ license:CC0-1.0
<description>The Joker's Wild! Jr. (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joker's wild jr., the (1994)(philips)(us)" sha1="e5e6fe4f7b766e82c4f381bd3d57402f6f098189"/>
</diskarea>
@@ -1544,7 +1544,7 @@ license:CC0-1.0
<description>The Joker's Wild! (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joker's wild, the (1994)(philips)(us)" sha1="a5609953241b49d64bfdfd671edfdffc93b4b3dd"/>
</diskarea>
@@ -1560,7 +1560,7 @@ license:CC0-1.0
<description>Kether v3.11 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.11 (1994)(philips)(eu)(en-fr)" sha1="e011e9d56d6967565a415091d8e7f84e037aca4b"/>
</diskarea>
@@ -1576,7 +1576,7 @@ license:CC0-1.0
<description>Kether v3.09 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.09 (1993)(philips)(eu)(en-fr)" sha1="8c2245c23cfea5822e48334b944b6202bce25e97"/>
</diskarea>
@@ -1592,7 +1592,7 @@ license:CC0-1.0
<description>Kether v3.09 (Europe, alt)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.09 (1993)(philips)(eu)(en-fr)[a]" sha1="8cc60481afa68cdde9f28014d1fab2aa8aced983"/>
</diskarea>
@@ -1608,7 +1608,7 @@ license:CC0-1.0
<description>Kether v3.12 (Netherlands)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.12 (1994)(philips)(nl)(en-nl)" sha1="d3ee75b46eed2fd3a892c924b2714d9efcbb9775"/>
</diskarea>
@@ -1624,7 +1624,7 @@ license:CC0-1.0
<description>Kether v3.08 (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.08 (1993)(philips)(de)(en-de)" sha1="1936f9c57bda4ca017f8ab63393a60b1337ea0f1"/>
</diskarea>
@@ -1640,7 +1640,7 @@ license:CC0-1.0
<description>Kether v3.11 (Germany)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.11 (1994)(philips)(de)(en-de)" sha1="f11f2b21f9c7f2b7cde5b753b008de3240077ea1"/>
</diskarea>
@@ -1656,7 +1656,7 @@ license:CC0-1.0
<description>Kether v3.11 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kether v3.11 (1994)(philips)(us)(en-fr)" sha1="e6ad5719acaa4d41f11189f0ba84d6207715d02b"/>
</diskarea>
@@ -1673,7 +1673,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kingdom - shadoan (1996)(philips)(eu)[dvc]" sha1="4610c66623cf3b62b6cd1c46684eda7038a013b8"/>
</diskarea>
@@ -1690,7 +1690,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kingdom - the far reaches (1995)(philips)(us)[dvc]" sha1="f1c1e78853e6c563b8f51bca202228de11fa41a8"/>
</diskarea>
@@ -1706,7 +1706,7 @@ license:CC0-1.0
<description>L'Ange et le Demon (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="l'ange et le demon (1993)(philips)(fr)" sha1="1a88a055e35b9162b093470269fe191f1b614fe2"/>
</diskarea>
@@ -1723,7 +1723,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="labyrinth of crete (1995)(philips)(eu)[dvc]" sha1="7a2c78c7881b996f0042f24241cfe062e37b58af"/>
</diskarea>
@@ -1739,7 +1739,7 @@ license:CC0-1.0
<description>Laser Lords (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="07420911 01" />
<diskarea name="cdrom">
<disk name="laser lords (1992)(philips)(us)[07420911 01]" sha1="1d0ccff1350d6a7959fed16522b86390bbac27ae"/>
@@ -1756,7 +1756,7 @@ license:CC0-1.0
<description>Laser Lords (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900742 50273 097 01" />
<diskarea name="cdrom">
<disk name="laser lords (1992)(philips)(us)[3106900742 50273 097 01]" sha1="1a6889ddbe78d48f0d8bcd7bce43bd75c37e7b3e"/>
@@ -1773,7 +1773,7 @@ license:CC0-1.0
<description>The Last Bounty Hunter (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="last bounty hunter, the (1996)(philips)(eu)" sha1="ad0a4977e9db343007042c4667e04363be6de1d8"/>
</diskarea>
@@ -1789,7 +1789,7 @@ license:CC0-1.0
<description>Lemmings (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lemmings (1994)(philips)(eu)" sha1="fb7db4b51cc65fbb657a7b8f8c834779afd283ee"/>
</diskarea>
@@ -1805,7 +1805,7 @@ license:CC0-1.0
<description>Lingo v1.07 (Netherlands)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lingo v1.07 (1995)(philips)(nl)" sha1="8816a09288ab49778767917e201df3320c7e9e5c"/>
</diskarea>
@@ -1821,7 +1821,7 @@ license:CC0-1.0
<description>Link - The Faces of Evil (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="link - the faces of evil (1993)(philips)(eu)" sha1="2e19096c168be12d84e66dceee2cc9ae5a2cd51b"/>
</diskarea>
@@ -1837,7 +1837,7 @@ license:CC0-1.0
<description>Link - The Faces of Evil (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="link - the faces of evil (1993)(philips)(fr)" sha1="376344e087e2e89f57d0b0b5bfa8010b758d672b"/>
</diskarea>
@@ -1853,7 +1853,7 @@ license:CC0-1.0
<description>Link - De Gezichten Van Het Kwaad (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="link - de gezichten van het kwaad (1993)(philips)(nl)" sha1="4aa04a66525719e4870185dab13acb165f8597b4"/>
</diskarea>
@@ -1869,7 +1869,7 @@ license:CC0-1.0
<description>Link - Die Fratzen des Boesen (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="link - die fratzen des boesen (1993)(philips)(de)" sha1="2d8cce7d5ee2e085a596d3001741f32a28e910ae"/>
</diskarea>
@@ -1886,7 +1886,7 @@ license:CC0-1.0
<description>Link - The Faces of Evil (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="link - the faces of evil (usa)" sha1="63c8ae61d7e98668cb8864b909c7f7377ff5fdb4"/>
</diskarea>
@@ -1903,7 +1903,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="litil divil (1994)(philips)(eu)[dvc]" sha1="082daaf429adcb61940151af0a8bf1a4531c5acc"/>
</diskarea>
@@ -1920,7 +1920,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="litil divil (1994)(philips)(us)[dvc]" sha1="cd8bbf35469e4cb5f112e258c9c45b34b71fed8e"/>
</diskarea>
@@ -1936,7 +1936,7 @@ license:CC0-1.0
<description>Lords of the Rising Sun (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lords of the rising sun (1992)(philips)(us)" sha1="ecd2a1427a80b7efe806b1a673bb1368475c6e2f"/>
</diskarea>
@@ -1953,7 +1953,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lost eden (1995)(philips)(eu)[dvc]" sha1="b167782f17f03ff44ad373484363ea906da81c9e"/>
</diskarea>
@@ -1970,7 +1970,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lost eden (1995)(philips)(de)[dvc]" sha1="643d74a82cf874e72ab809a319e0b9433e618e10"/>
</diskarea>
@@ -1987,7 +1987,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lost eden (1995)(philips)(nl)(m4)[dvc]" sha1="fa46e4f9bf2c0370dc0fbea2334475d43b1eac68"/>
</diskarea>
@@ -2004,7 +2004,7 @@ license:CC0-1.0
<year>1998</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lost ride, the (1998)(philips)(eu)[dvc]" sha1="0166e26a53973b21ec2d8a5e30d03e7b79981f4c"/>
</diskarea>
@@ -2021,7 +2021,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mad dog ii - the lost gold (1995)(philips)(eu)[dvc]" sha1="d2060a67812405c53e89e21da9bfa6b1da8b447a"/>
</diskarea>
@@ -2038,7 +2038,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mad dog 2 - le tresor perdu (1996)(philips)(fr)[dvc]" sha1="89e8c1ed9fa68dad4b62e44999406f4d8d4888a0"/>
</diskarea>
@@ -2055,7 +2055,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mad dog mccree (1994)(philips)(eu)[dvc]" sha1="557f757ca52e69e1c8d08b5bf24b3bf5ad6d3927"/>
</diskarea>
@@ -2072,7 +2072,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="05820818 N01" />
<diskarea name="cdrom">
<disk name="mad dog mccree (1994)(philips)(us)[dvc][05820818 n01]" sha1="db80f64fc5942e8eedb4206f7c5e7c3a8fe6878e"/>
@@ -2090,7 +2090,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="05820826 01" />
<diskarea name="cdrom">
<disk name="mad dog mccree (1994)(philips)(us)[dvc][05820826 01]" sha1="fb75e07a927b39effb31b4284591f1da7e22bda7"/>
@@ -2107,7 +2107,7 @@ license:CC0-1.0
<description>Magic Eraser (Germany)</description>
<year>1994</year>
<publisher>ZYX-Music</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="magic eraser (1994)(zyx-music)(de)" sha1="049e621bb0da6ad8d58a16fec79546a051281ad6"/>
</diskarea>
@@ -2124,7 +2124,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="making the grade v0.90 (1994)(philips)(eu)[pre-release][dvc]" sha1="1380f531193b2fdee166ec8b03dc92dfba483669"/>
</diskarea>
@@ -2142,13 +2142,13 @@ license:CC0-1.0
<description>Marco Polo (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="The Game" />
<diskarea name="cdrom">
<disk name="marco polo (1995)(philips)(eu)(disc 1 of 2)[the game]" sha1="028e7ac23ff6ee4ebf56a582534dc429b245b73c"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Documentation" />
<diskarea name="cdrom">
<disk name="marco polo (1995)(philips)(eu)(disc 2 of 2)[the documentation]" sha1="9751a19a2bc20724b0100fbf9bdd17815ed7cc14"/>
@@ -2167,13 +2167,13 @@ license:CC0-1.0
<description>Marco Polo (France)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Le Jeu" />
<diskarea name="cdrom">
<disk name="marco polo (1995)(philips)(fr)(disc 1 of 2)[le jeu]" sha1="f65946a08b410f6a42b9270d7f560d23183afdba"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="La Documentation" />
<diskarea name="cdrom">
<disk name="marco polo (1995)(philips)(fr)(disc 2 of 2)[la documentation]" sha1="a0b5aa9fbe39619685f5a8da77a1190adb9dfccb"/>
@@ -2191,7 +2191,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Pack-In Video</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="master labyrinth v1.06 (1995)(pack-in-video)(eu)[dvc]" sha1="90a923053ac6abc6e0d23cc286a83eabe93b8a55"/>
</diskarea>
@@ -2207,7 +2207,7 @@ license:CC0-1.0
<description>Mega Maze v1.06 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mega maze v1.06 (1994)(philips)(eu)" sha1="32fafc06c32de3d07a8498a75543d4ddd76cfe0c"/>
</diskarea>
@@ -2223,7 +2223,7 @@ license:CC0-1.0
<description>Mega Maze v1.06 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mega maze v1.06 (1994)(philips)(us)" sha1="af5c9cb7bea9f1817df6e5da39191cb5e2e994db"/>
</diskarea>
@@ -2239,7 +2239,7 @@ license:CC0-1.0
<description>Merlin's Apprentice v1.1 (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="merlin's apprentice v1.1 (1995)(philips)(eu)" sha1="a6c5639efef3779d0c88dbe060e97c70e6620f23"/>
</diskarea>
@@ -2255,7 +2255,7 @@ license:CC0-1.0
<description>Merlin's Apprentice v1.2 (USA)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="merlin's apprentice v1.2 (1995)(philips)(us)" sha1="1cbad0c40dc82925c1d298fddc6e3aa9ff872511"/>
</diskarea>
@@ -2271,7 +2271,7 @@ license:CC0-1.0
<description>Micro Machines (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="micro machines (1995)(philips)(eu)" sha1="4ee560e018327edec4bec0da2475412451dc0dfb"/>
</diskarea>
@@ -2287,7 +2287,7 @@ license:CC0-1.0
<description>Micro Machines (Europe, demo)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="micro machines (demo) (1995)(philips)(eu)" sha1="a3276183ca0e81021c83a7806e76e53040211f06"/>
</diskarea>
@@ -2304,7 +2304,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mutant rampage - bodyslam (1994)(philips)(eu)[dvc]" sha1="ed30c69600ff179cb6af9e45b34b09e1fc2799f9"/>
</diskarea>
@@ -2321,7 +2321,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mutant rampage - bodyslam (1994)(philips)(us)[dvc]" sha1="637f5ccd865a3002b69b958abb6de0224a7a233a"/>
</diskarea>
@@ -2337,7 +2337,7 @@ license:CC0-1.0
<description>Myst (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="myst (1996)(philips)(eu)" sha1="4d678435ae3866db42879ee119162e5a14d706f8"/>
</diskarea>
@@ -2353,7 +2353,7 @@ license:CC0-1.0
<description>Mystic Midway - Phantom Express (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mystic midway - phantom express (1993)(philips)(eu)" sha1="8a688d06c5def77c98046b02358b29575b830d2f"/>
</diskarea>
@@ -2369,7 +2369,7 @@ license:CC0-1.0
<description>Mystic Midway - Rest in Pieces (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mystic midway - rest in pieces (1992)(philips)(eu-us)" sha1="dfccc6fbd1f6c1113ae23d9c9ac3aac9437b91df"/>
</diskarea>
@@ -2385,7 +2385,7 @@ license:CC0-1.0
<description>Mystic Midway - Rest in Pieces (Japan)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mystic midway - rest in pieces (1992)(philips)(jp)" sha1="11ab543bbba6b810736548fea2e791fd894d9311"/>
</diskarea>
@@ -2401,7 +2401,7 @@ license:CC0-1.0
<description>NFL Football Trivia Challenge '94-'95 Edition (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nfl football trivia challenge '94-'95 edition (1994)(philips)(eu)" sha1="2b7cb525b99bddc159437645000f37873dd6a803"/>
</diskarea>
@@ -2417,7 +2417,7 @@ license:CC0-1.0
<description>NFL Football Trivia Challenge (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nfl football trivia challenge (1993)(philips)(us)" sha1="c63e33c3e04488d0875f57a401bee8513e0e4880"/>
</diskarea>
@@ -2434,7 +2434,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nfl hall of fame football (1994)(philips)(eu)[dvc]" sha1="27462d56968053f465f4781a4d7117fe2419e147"/>
</diskarea>
@@ -2450,7 +2450,7 @@ license:CC0-1.0
<description>Othello (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="othello (1993)(philips)(eu)" sha1="ac62c92433d57b5f18e0ab01542581405eac8035"/>
</diskarea>
@@ -2466,7 +2466,7 @@ license:CC0-1.0
<description>Pac-Panic (Europe)</description>
<year>1995</year>
<publisher>Namco ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pac-panic (1995)(namco - philips)(eu)" sha1="13656f7d2cf32c2ebd8ad3b8582929a8ed61d377"/>
</diskarea>
@@ -2482,7 +2482,7 @@ license:CC0-1.0
<description>The Palm Springs Open (Europe, USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="palm springs open, the (1991)(philips)(eu-us)" sha1="ccedb03825565220da7d5a58c12b0f43afdcb83b"/>
</diskarea>
@@ -2498,7 +2498,7 @@ license:CC0-1.0
<description>Die Palm Springs Open (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="palm springs open, die (1992)(philips)(de)" sha1="bead71e36309bf836914b72afb0fcc6eed77e74b"/>
</diskarea>
@@ -2514,7 +2514,7 @@ license:CC0-1.0
<description>L'Open de Palm Springs (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="l'open de palm springs (1992)(philips)(fr)" sha1="d961d08e5207c79d5f3ba036feaa800ae86419d5"/>
</diskarea>
@@ -2530,7 +2530,7 @@ license:CC0-1.0
<description>The Palm Springs Open (Italy)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="palm springs open, the (1992)(philips)(it)" sha1="c39c6ff4ed48a41c8499b38638ae37cdc96cdc65"/>
</diskarea>
@@ -2546,7 +2546,7 @@ license:CC0-1.0
<description>The Palm Springs Open (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="palm springs open, the (1991)(philips)(us)" sha1="af2b213ecf4f44011dee2cda99d21a6b34d3bacd"/>
</diskarea>
@@ -2562,7 +2562,7 @@ license:CC0-1.0
<description>Pinball (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900342 50238 037 03" />
<diskarea name="cdrom">
<disk name="pinball (1992)(philips)(us)[3106900342 50238 037 03]" sha1="9e77974b1cf5499044e994712dec837df6e64bee"/>
@@ -2579,7 +2579,7 @@ license:CC0-1.0
<description>Pinball (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900342 50238 037 04" />
<diskarea name="cdrom">
<disk name="pinball (1992)(philips)(us)[3106900342 50238 037 04]" sha1="66d801ad823f32ae1fd0058fd5162d5acca1bf23"/>
@@ -2596,7 +2596,7 @@ license:CC0-1.0
<description>Power Hitter (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="power hitter (1992)(philips)(eu)" sha1="f1966ff29aded36948d8464fa1281e713441bc01"/>
</diskarea>
@@ -2612,7 +2612,7 @@ license:CC0-1.0
<description>Power Hitter (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="08120804 01" />
<diskarea name="cdrom">
<disk name="power hitter (1993)(philips)(us)[08120804 01]" sha1="2598ee8feeff8f2bae372717c45f79311a332a0f"/>
@@ -2629,7 +2629,7 @@ license:CC0-1.0
<description>Power Hitter (USA, alt)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="08120908 01" />
<diskarea name="cdrom">
<disk name="power hitter (1993)(philips)(us)[08120908 01]" sha1="4c42959a6ab95a69771274e8d7f397546ca2e02a"/>
@@ -2647,7 +2647,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="rise of the robots (1995)(philips)(eu)[dvc]" sha1="e28e1077e225f0805b095786be3371c0fee8f26f"/>
</diskarea>
@@ -2663,7 +2663,7 @@ license:CC0-1.0
<description>Sargon Chess (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="690 030-2 50253 278 01" />
<diskarea name="cdrom">
<disk name="sargon chess (1992)(philips)(us)[690 030-2 50253 278 01]" sha1="de79986b70aa19c8427d55a153e8bb38399b0e42"/>
@@ -2680,7 +2680,7 @@ license:CC0-1.0
<description>Sargon Chess (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="03020320 01" />
<diskarea name="cdrom">
<disk name="sargon chess (1992)(philips)(us)[03020320 01]" sha1="d20e612d4ec05dd48add004bf77c64796e4b5df4"/>
@@ -2697,7 +2697,7 @@ license:CC0-1.0
<description>Scotland Yard - Interactive v1.03 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="scotland yard - interactive v1.03 (1994)(philips)(eu)" sha1="21758e2a18b5b2a89ca1cb858cfab1db63d1a0b9"/>
</diskarea>
@@ -2713,7 +2713,7 @@ license:CC0-1.0
<description>Scotland Yard - Interactif v1.04 (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="scotland yard - interactif v1.04 (1994)(philips)(fr)" sha1="82333813d0680e0798d60282ac88544f4ab29e5a"/>
</diskarea>
@@ -2729,7 +2729,7 @@ license:CC0-1.0
<description>Scotland Yard - Interactive v1.09 (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="scotland yard - interactive v1.09 (1993)(philips)(de)" sha1="1db8ec3acf52938d99fc2d6d19e41d8613d94c52"/>
</diskarea>
@@ -2745,7 +2745,7 @@ license:CC0-1.0
<description>Secret Mission v1.03 (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="secret mission v1.03 (1996)(philips)(eu)" sha1="24474810c1a3f7a348da3ffc964691cdfe1be682"/>
</diskarea>
@@ -2761,7 +2761,7 @@ license:CC0-1.0
<description>Secret Mission v1.03 (Germany)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="secret mission v1.03 (1996)(philips)(de)" sha1="fed217a7b4cd29d315d0a89913afcb4d07e98073"/>
</diskarea>
@@ -2777,7 +2777,7 @@ license:CC0-1.0
<description>Secret Mission v1.03 (Netherlands)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="secret mission v1.03 (1996)(philips)(nl)" sha1="a892fe6b2f6e3c699b9aff90c128df71487af56d"/>
</diskarea>
@@ -2793,13 +2793,30 @@ license:CC0-1.0
<description>Shaolin's Road (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shaolin's road (1995)(philips)(eu)(en-fr)" sha1="2513504bd908e51270e875142129d515d499fbc7"/>
</diskarea>
</part>
</software>
+ <software name="sharaku">
+ <!--
+ Origin: Redump
+ <rom name="Cyber Soldier Sharaku (Japan).bin" size="569595600" crc="95d087c9" md5="79788bb0e526740938cf9b4fcfefb02e"/>
+ <rom name="Cyber Soldier Sharaku (Japan).cue" size="93" crc="f5a72d70" md5="f18d676b8be03569c4c51e436dea4199"/>
+ -->
+ <description>Cyber Soldier Sharaku (Japan)</description>
+ <year>1993</year>
+ <publisher>Japan Interactive Media</publisher>
+ <info name="alt_title" value="サイバーソルジャー写楽" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="cyber soldier sharaku (japan)" sha1="dca45b2bdf527026adf367afc3d319d355bd8c00"/>
+ </diskarea>
+ </part>
+ </software>
+
<software name="spaceace" supported="no">
<!--
Origin: TOSEC
@@ -2810,7 +2827,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="space ace (1994)(philips)(eu)[dvc]" sha1="74fdcdaf3f9a14ea8c701b4ccabbc1268745d455"/>
</diskarea>
@@ -2827,7 +2844,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="space ace (1994)(philips)(us)[dvc]" sha1="25a5608592765d00be604d0139679f054ac345f0"/>
</diskarea>
@@ -2843,7 +2860,7 @@ license:CC0-1.0
<description>Sport Freaks (Netherlands)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sport freaks (1996)(philips)(nl)" sha1="50df8c858f932b5e46098b0c964bd250b7b5cde3"/>
</diskarea>
@@ -2859,7 +2876,7 @@ license:CC0-1.0
<description>Striker Pro (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="striker pro (1994)(philips)(eu)(m6)" sha1="f68f0e06af39754caed6fb8407b0cd6880f7478c"/>
</diskarea>
@@ -2875,7 +2892,7 @@ license:CC0-1.0
<description>Striker Pro (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="striker pro (1994)(philips)(us)(m6)" sha1="4afe100ce980638bf63add2eb0628aa6bc0516d9"/>
</diskarea>
@@ -2891,7 +2908,7 @@ license:CC0-1.0
<description>Strip Poker Live (Europe)</description>
<year>1995</year>
<publisher>Green Pig Production</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="strip poker live (1995)(green pig production)(eu)" sha1="760f6f80eaadc5961c18564b12e0e3e828d01f5c"/>
</diskarea>
@@ -2907,7 +2924,7 @@ license:CC0-1.0
<description>Strip-Poker Pro (France)</description>
<year>1994</year>
<publisher>Hot Stage</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="strip-poker pro (1994)(hot stage)(fr)(en-fr)" sha1="c6909c72f5215b1a6c40e5a1ebe5355984fca0f8"/>
</diskarea>
@@ -2923,7 +2940,7 @@ license:CC0-1.0
<description>Tangram - The Ultimate Chinese Game (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tangram - the ultimate chinese game (1992)(philips)(eu)(m8)" sha1="1defa196d6581b2dce29b45854d02989c43727c7"/>
</diskarea>
@@ -2939,7 +2956,7 @@ license:CC0-1.0
<description>Tetris (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tetris (1992)(philips)(eu-us)" sha1="69faa0c8fb700d4d913529eb991c03a15462f548"/>
</diskarea>
@@ -2956,7 +2973,7 @@ license:CC0-1.0
<year>1997</year>
<publisher>New Frontier</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tetsuo gaiden (1997)(new frontier)(eu)[dvc]" sha1="173be08de601a4e627879ac1c6135cd11cc93795"/>
</diskarea>
@@ -2972,7 +2989,7 @@ license:CC0-1.0
<description>TextTiles v1 (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="texttiles v1 (1992)(philips)(us)" sha1="a7a18810ef07379e1984f5e97b6324a919b4a9c3"/>
</diskarea>
@@ -2994,13 +3011,13 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="The Game" />
<diskarea name="cdrom">
<disk name="thunder in paradise (1995)(philips)(eu)(disc 1 of 2)[the game][dvc]" sha1="b5fce8515b52a77148d81306832354ff6067b05b"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Episode" />
<diskarea name="cdrom">
<disk name="thunder in paradise (1995)(philips)(eu)(disc 2 of 2)[the episode][dvc]" sha1="9b2023faacf07e8a4dbd164a3b3fbb0649100767"/>
@@ -3023,13 +3040,13 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="The Game" />
<diskarea name="cdrom">
<disk name="thunder in paradise (1995)(philips)(us)(disc 1 of 2)[the game][dvc]" sha1="011c70227c12187177d516c6c3e4b4dc45861b1c"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Episode" />
<diskarea name="cdrom">
<disk name="thunder in paradise (1995)(philips)(us)(disc 2 of 2)[the episode][dvc]" sha1="900544c26fd9c133efd61b30f5e5d4660bce7ee0"/>
@@ -3052,14 +3069,14 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Das Spiel" />
<diskarea name="cdrom">
<disk name="thunder in paradise (1996)(philips)(de)(disc 1 of 2)[das spiel][dvc]" sha1="9c6261cb9725144836d90271417ff1e9ad235097"/>
</diskarea>
</part>
<!-- Is this correct as disc 2? -->
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="The Episode (?)" />
<diskarea name="cdrom">
<disk name="thunder in paradise (1995)(philips)(eu)(disc 2 of 2)[the episode][dvc]" sha1="9b2023faacf07e8a4dbd164a3b3fbb0649100767"/>
@@ -3076,7 +3093,7 @@ license:CC0-1.0
<description>The Ultimate Noah's Ark (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ultimate noah's ark, the (1994)(philips)(eu)" sha1="7b0c3e484d2bdec39bebdfe9d3fa03abab4e7a6f"/>
</diskarea>
@@ -3092,7 +3109,7 @@ license:CC0-1.0
<description>The Ultimate Noah's Ark (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ultimate noah's ark, the (1994)(philips)(us)" sha1="5953502999d161117b63404758b35d6a4ade4a28"/>
</diskarea>
@@ -3109,7 +3126,7 @@ license:CC0-1.0
<year>1997</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ultra cd-i soccer (1997)(philips)(eu)[dvc]" sha1="c4aba1c2fe30c7aab7e1b8130644dd71c7a08505"/>
</diskarea>
@@ -3126,7 +3143,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Status</publisher>
<info name="usage" value="Access code 1234" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="vegas girls (1995)(status)(eu)[adult, access code 1234]" sha1="1fc9e96ccae03d82c40bc749553ebc52ab8bf5e7"/>
</diskarea>
@@ -3142,7 +3159,7 @@ license:CC0-1.0
<description>Video Grand Prix Speedway (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="video grand prix speedway (1993)(philips)(fr)" sha1="2571007ed6480ac61087abbdf0d35e466a39a7d1"/>
</diskarea>
@@ -3158,7 +3175,7 @@ license:CC0-1.0
<description>Video Speedway - The Ultimate Racing Experience (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="video speedway - the ultimate racing experience (1993)(philips)(eu)" sha1="e21f86210f18938f0c4b995d6ad68dba2429bda4"/>
</diskarea>
@@ -3174,7 +3191,7 @@ license:CC0-1.0
<description>Video Speedway - The Ultimate Racing Experience (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="video speedway - the ultimate racing experience (1993)(philips)(us)" sha1="91281fe15cc9b7cb129d4070f9dd699313e5e05a"/>
</diskarea>
@@ -3191,7 +3208,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="voetbal v1.04 (1994)(philips)(nl)[dvc]" sha1="b0b7d1b22c6c990573bebc36551ccdb362020330"/>
</diskarea>
@@ -3208,7 +3225,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<info name="usage" value="Access code 3333" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="voyeur ...don't get caught (1993)(philips)(eu)[adult, access code 3333]" sha1="659c4da10c7b9c50aa9fdbf8800346dbb3b7f5a1"/>
</diskarea>
@@ -3225,7 +3242,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<info name="usage" value="Access code 3333" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="11220909 01" />
<diskarea name="cdrom">
<disk name="voyeur ...don't get caught (1993)(philips)(us)[adult, access code 3333][11220909 01]" sha1="557e81e664fd11830fcfedb55f2b9326f24bba1c"/>
@@ -3243,7 +3260,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<info name="usage" value="Access code 3333" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="11220928 03" />
<diskarea name="cdrom">
<disk name="voyeur ...don't get caught (1993)(philips)(us)[adult, access code 3333][11220928 03]" sha1="a93dff003441435bb6062c6c38a71cb9ad0f22b1"/>
@@ -3261,7 +3278,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<info name="usage" value="Access code 3333" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="voyeur ...lass dich nicht erwischen (1995)(philips)(de)[adult, access code 3333]" sha1="5aadbe13fc19a892837bca715a5e38f572aeb762"/>
</diskarea>
@@ -3278,7 +3295,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<info name="usage" value="Access code 3333" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="voyeur ...soyez prudent (1995)(philips)(fr)[adult, access code 3333]" sha1="a551ef4bea7f33dee96c2c78e813be77fbdb7423"/>
</diskarea>
@@ -3294,7 +3311,7 @@ license:CC0-1.0
<description>The Wacky World of Minature Golf - With Eugene Levy (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="wacky world of minature golf, the - with eugene levy (1993)(philips)(eu)" sha1="4facb2fdcd1864f55ffee3bb3a466e0f0d746f35"/>
</diskarea>
@@ -3310,7 +3327,7 @@ license:CC0-1.0
<description>The Wacky World of Minature Golf - With Eugene Levy (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="wacky world of minature golf, the - with eugene levy (1993)(philips)(us)" sha1="adc9452735a9e474c7c79635516f76a237990787"/>
</diskarea>
@@ -3326,7 +3343,7 @@ license:CC0-1.0
<description>Whack a Bubble (Europe)</description>
<year>1997</year>
<publisher>New Frontier</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="whack a bubble (1997)(new frontier)(eu)" sha1="da4ebf54171e7e9b1df82df58fde8cd10ed0d029"/>
</diskarea>
@@ -3343,7 +3360,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="who shot johnny rock (1995)(philips)(eu)[dvc]" sha1="7c3f3543a42859c460190158f33c073215b1baed"/>
</diskarea>
@@ -3360,7 +3377,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="who shot johnny rock (1995)(philips)(us)[dvc]" sha1="feff9589de63e5be52487c11eb2a243acce6d3de"/>
</diskarea>
@@ -3376,7 +3393,7 @@ license:CC0-1.0
<description>Wimbledon Challenge - The Official Wimbledon Quiz Game (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="wimbledon challenge - the official wimbledon quiz game (1993)(philips)(eu)(m6)" sha1="c83581efbda6355e117275d8c22fd41f619632b1"/>
</diskarea>
@@ -3392,7 +3409,7 @@ license:CC0-1.0
<description>Wordplay (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="wordplay (1994)(philips)(eu)" sha1="4b921aa0e61d4064bb37ba03cf92fd227625993d"/>
</diskarea>
@@ -3409,7 +3426,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world cup golf (1995)(philips)(eu)[dvc]" sha1="a31cc013483cd2332a017974a5c3677434bf7948"/>
</diskarea>
@@ -3426,7 +3443,7 @@ license:CC0-1.0
<year>1997</year>
<publisher>NOB-Interactive</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zaak van sam, de - interactieve detective (1997)(nob-interactive)(nl)[dvc]" sha1="db70d0873504bcfaa23a28e246cd12c3d4ae74ec"/>
</diskarea>
@@ -3442,7 +3459,7 @@ license:CC0-1.0
<description>Zelda - The Wand of Gamelon (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zelda - the wand of gamelon (1993)(philips)(eu)" sha1="979dd6684edc27e0b82fa5abcf39ec5a1677848a"/>
</diskarea>
@@ -3458,7 +3475,7 @@ license:CC0-1.0
<description>Zelda - De toverstaf van Gamelon (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zelda - de toverstaf van gamelon (1993)(philips)(nl)" sha1="5d7963ef27d2f54060dd3f522453ebbefdb8b6ee"/>
</diskarea>
@@ -3474,7 +3491,7 @@ license:CC0-1.0
<description>Zelda - Der Zauberstab von Gamelon (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zelda - der zauberstab von gamelon (1993)(philips)(de)" sha1="d20b084411a82663637aa5af91e47adce5ce9b66"/>
</diskarea>
@@ -3490,7 +3507,7 @@ license:CC0-1.0
<description>Zelda - The Wand of Gamelon (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zelda - the wand of gamelon (1993)(philips)(fr)" sha1="f5a48a30622f0066e3357bfa626e1adb19d06ada"/>
</diskarea>
@@ -3506,7 +3523,7 @@ license:CC0-1.0
<description>Zelda - The Wand of Gamelon (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zelda - the wand of gamelon (1993)(philips)(us)" sha1="a79959ea788eeea3dd7aa08a36479006c2465e23"/>
</diskarea>
@@ -3522,7 +3539,7 @@ license:CC0-1.0
<description>Zelda's Adventure (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zelda's adventure (1995)(philips)(eu)" sha1="deeb022d3ec6cce5f41abbc9826b9edbf8b09a81"/>
</diskarea>
@@ -3538,7 +3555,7 @@ license:CC0-1.0
<description>Zenith (Europe)</description>
<year>1997</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zenith (1997)(philips)(eu)" sha1="af7b9dcfc7e89d442947e32b4d754f1899305316"/>
</diskarea>
@@ -3554,7 +3571,7 @@ license:CC0-1.0
<description>Zombie Dinos from Planet Zeltoid (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zombie dinos from planet zeltoid (1992)(philips)(eu)" sha1="bc008fc92ade1995c22612c40f983a6e16f9ecee"/>
</diskarea>
@@ -3570,7 +3587,7 @@ license:CC0-1.0
<description>Zombie Dinos de la Planete Zeltoide (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zombie dinos de la planete zeltoide (1993)(philips)(fr)" sha1="18c31c2e97df1c99c7db985d711620cced2b0486"/>
</diskarea>
@@ -3586,7 +3603,7 @@ license:CC0-1.0
<description>Zombie Dinos from Planet Zeltoid (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zombie dinos from planet zeltoid (1992)(philips)(us)" sha1="793dbadd21e2284885fe3cf9a0bef8d5da3c5a06"/>
</diskarea>
@@ -3602,7 +3619,7 @@ license:CC0-1.0
<description>Zombie Dinos van de Planeet Zeltoid (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zombie dinos van de planeet zeltoid (1993)(philips)(nl)" sha1="25b33d5b2acc6e0317c9f35bffa70fa37cd573d5"/>
</diskarea>
@@ -3618,7 +3635,7 @@ license:CC0-1.0
<description>Zombie Dinos vom Planeten Zeltoid (Germany)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zombie dinos vom planeten zeltoid (1994)(philips)(de)" sha1="a30a3a6b22f2b53861603c9b8cefb38cdd76f075"/>
</diskarea>
@@ -3638,7 +3655,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="1995 - all the news and views (1995)(philips)(eu)[dvc]" sha1="2e94dff65233e0a41135cffda383330d9e1e6717"/>
</diskarea>
@@ -3654,7 +3671,7 @@ license:CC0-1.0
<description>A Child is Born v1.0 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a child is born v1.0 (1993)(philips)(eu)" sha1="5d0e4e4b09e4b73fcbfc16987d7b10664ea112ca"/>
</diskarea>
@@ -3670,7 +3687,7 @@ license:CC0-1.0
<description>A Child is Born v1.0 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a child is born v1.0 (1994)(philips)(us)" sha1="cdc7a85440fe5245ef2a46d96704651a2148b6be"/>
</diskarea>
@@ -3687,7 +3704,7 @@ license:CC0-1.0
<description>A National Parks Tour (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a national parks tour (1992)(philips)(us)" sha1="ea43dd4b73fe88ac9e9d8480bb82efc095793c38"/>
</diskarea>
@@ -3704,7 +3721,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>ICDI ~ Sofidoc</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a night in nylon city (1995)(icdi - sofidoc)(eu)[dvc]" sha1="0b88f90913c5e2879308b96dd4c9e0f6d692b9ac"/>
</diskarea>
@@ -3720,7 +3737,7 @@ license:CC0-1.0
<description>A Visit To Sesame Street - Letters (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a visit to sesame street - letters (1992)(philips)(eu-us)" sha1="b0425346454d3c075e248fcbae87720fc2e2a11c"/>
</diskarea>
@@ -3736,7 +3753,7 @@ license:CC0-1.0
<description>A Visit To Sesame Street - Numbers (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900632 01" />
<diskarea name="cdrom">
<disk name="a visit to sesame street - numbers (1991)(philips)(us)[3106900632 01]" sha1="621f29a4aac2ae311768963e809c891de1f8c5f4"/>
@@ -3753,7 +3770,7 @@ license:CC0-1.0
<description>A Visit To Sesame Street - Numbers (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900192 50239 141 01" />
<diskarea name="cdrom">
<disk name="a visit to sesame street - numbers (1992)(philips)(us)[3106900192 50239 141 01]" sha1="4e5bb335795dd88b967741a276797d9be182f364"/>
@@ -3770,7 +3787,7 @@ license:CC0-1.0
<description>A Visit to the Valley of Puebla and the Amparo Museum (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a visit to the valley of puebla and the amparo museum (1992)(philips)(us)" sha1="7b6a4d937eaf07a89deb8cc79b3568f761c5084d"/>
</diskarea>
@@ -3787,7 +3804,7 @@ license:CC0-1.0
<year>2004</year>
<publisher>CNN</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="accent health - information for healthy living - january 2004 - general cdi 1-04 (2004)(cnn)(us)[dvc]" sha1="bb54f09df7ad7314709ca00f45e7999e3647542c"/>
</diskarea>
@@ -3804,7 +3821,7 @@ license:CC0-1.0
<year>2004</year>
<publisher>CNN</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="accent health - information for healthy living - november 2004 - 50 + silver cdi 1104 (2004)(cnn)(us)[dvc]" sha1="41e9c73f61a71906583d1d8712dd1eefed9564c8"/>
</diskarea>
@@ -3821,7 +3838,7 @@ license:CC0-1.0
<year>2004</year>
<publisher>CNN</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="accent health - information for healthy living - november 2004 - general cdi 11-04 (2004)(cnn)(us)[dvc]" sha1="c6fef69eab76cff4a4374c68aef784a855369d4c"/>
</diskarea>
@@ -3838,7 +3855,7 @@ license:CC0-1.0
<year>2004</year>
<publisher>CNN</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="accent health - information for healthy living - october 2004 - general cdi 10-04 (2004)(cnn)(us)[dvc]" sha1="7ec706927765a3ec59e4832ed9f62150273c491d"/>
</diskarea>
@@ -3854,7 +3871,7 @@ license:CC0-1.0
<description>ACT College Search (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="act college search (1992)(philips)(us)" sha1="d0c6ca88ef6dfbc28a4bc5ada257775bc659dab3"/>
</diskarea>
@@ -3870,7 +3887,7 @@ license:CC0-1.0
<description>ADI Accompagnement Scolaire - Français-Maths CE1 (France)</description>
<year>1994</year>
<publisher>Coktel Vision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="adi accompagnement scolaire - francais-maths ce1 (1994)(coktel vision)(fr)" sha1="1c91a04eda5d1b4d42b8d52952d1ffba649242ab"/>
</diskarea>
@@ -3886,7 +3903,7 @@ license:CC0-1.0
<description>ADI Accompagnement Scolaire - Français-Maths CE2 (France)</description>
<year>1994</year>
<publisher>Coktel Vision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="adi accompagnement scolaire - francais-maths ce2 (1994)(coktel vision)(fr)" sha1="f0a034ab38dbd2ba1a5626cc9b5ae0bb56fff03e"/>
</diskarea>
@@ -3902,7 +3919,7 @@ license:CC0-1.0
<description>ADI Accompagnement Scolaire - Français-Maths CM1 (France)</description>
<year>1994</year>
<publisher>Coktel Vision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="adi accompagnement scolaire - francais-maths cm1 (1994)(coktel vision)(fr)" sha1="0e38cf26956209177af98baca6fb99fc5030eea3"/>
</diskarea>
@@ -3918,7 +3935,7 @@ license:CC0-1.0
<description>ADI Accompagnement Scolaire - Français-Maths CM2 (France)</description>
<year>1994</year>
<publisher>Coktel Vision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="adi accompagnement scolaire - francais-maths cm2 (1994)(coktel vision)(fr)" sha1="16ac120555b92e932f058ab744ae803c5090acdd"/>
</diskarea>
@@ -3934,7 +3951,7 @@ license:CC0-1.0
<description>AIDS Awareness (USA)</description>
<year>1994</year>
<publisher>Multimedia Software</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aids awareness (1994)(multimedia software)(us)" sha1="059eb11bc8e510b8a6fd884bdf3a01dbad6df783"/>
</diskarea>
@@ -3951,7 +3968,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - a first look at birds (1995)(aims multimedia)(us)[dvc]" sha1="bc091226c561c3c183b0288f2f14c6b4290f59de"/>
</diskarea>
@@ -3968,7 +3985,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - a first look at mammals (1995)(aims multimedia)(us)[dvc]" sha1="69dfb67c2d763087f19a0fe7b9c821fc0da45ee7"/>
</diskarea>
@@ -3985,7 +4002,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - a first look at trees (1995)(aims multimedia)(us)[dvc]" sha1="c734fdb0d4b0a6a82e02c1e73559c6c640097d2e"/>
</diskarea>
@@ -4002,7 +4019,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - animal communities (1995)(aims multimedia)(us)[dvc]" sha1="644fa1f378bb3e08f830d8c1b42ca2c8e63fdaef"/>
</diskarea>
@@ -4019,7 +4036,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - animal life in a tidepool (1995)(aims multimedia)(us)[dvc]" sha1="e722c6f14b67346952c3c523baafd40c4e53f319"/>
</diskarea>
@@ -4036,7 +4053,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - beavers and how they live (1995)(aims multimedia)(us)[dvc]" sha1="1855caf6b052d445b23442d96e10ad3724e92fce"/>
</diskarea>
@@ -4053,7 +4070,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - bees and how they live (1995)(aims multimedia)(us)[dvc]" sha1="1a985abec574fbd1e32ed1400ab373a2c8a42d77"/>
</diskarea>
@@ -4070,7 +4087,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - ecosystems - nature in balance (1995)(aims multimedia)(us)[dvc]" sha1="42dcbac3e13690f53ed81cffa3a7e9376958b2a6"/>
</diskarea>
@@ -4087,7 +4104,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - evolution - change through natural selection (1995)(aims multimedia)(us)[dvc]" sha1="bbad18ec016ff778e8f656267e1e8235a76b19fd"/>
</diskarea>
@@ -4104,7 +4121,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - exploring our solar system (1995)(aims multimedia)(us)[dvc]" sha1="eb228b87c5df9111cfb2add8204be5e4d5d45eb6"/>
</diskarea>
@@ -4121,7 +4138,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - frogs and how they live (1995)(aims multimedia)(us)[dvc]" sha1="47ced36b7b87ea92ffe876a3f67058e8fea312c2"/>
</diskarea>
@@ -4138,7 +4155,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - how animals survive (1995)(aims multimedia)(us)[dvc]" sha1="9149d9000acd44c1cb4249df358bf67759711ec5"/>
</diskarea>
@@ -4155,7 +4172,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - how we classify animals (1995)(aims multimedia)(us)[dvc]" sha1="42c842bae74395a7b14c0af5378fa30a99322c4d"/>
</diskarea>
@@ -4172,7 +4189,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - insects reproduction and metamorphosis (1995)(aims multimedia)(us)[dvc]" sha1="00c89dcd48e32ababc82410831237676f39bf627"/>
</diskarea>
@@ -4189,7 +4206,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - learning about ecology (1995)(aims multimedia)(us)[dvc]" sha1="9e07b5480ea3a9bbdc22adcc552695320af8bdfe"/>
</diskarea>
@@ -4206,7 +4223,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - temperature, pressure and humidity (1995)(aims multimedia)(us)[dvc]" sha1="c07a7efd813a1d8970a67df51454ed240b48a9ed"/>
</diskarea>
@@ -4223,7 +4240,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - the civil war - four years of war and it's aftermath (1995)(aims multimedia)(us)[dvc]" sha1="a4bf7a0140230aff75a5707207fd86451db6ade3"/>
</diskarea>
@@ -4240,7 +4257,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - the civil war - the south secedes and war begins (1995)(aims multimedia)(us)[dvc]" sha1="c4f5b34fac8f3e3d7af67a7771fd200fcaca1ff3"/>
</diskarea>
@@ -4257,7 +4274,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aims - winds, fronts and storms (1995)(aims multimedia)(us)[dvc]" sha1="2234658e209a5b61cf1c016a414dab34d485488a"/>
</diskarea>
@@ -4273,7 +4290,7 @@ license:CC0-1.0
<description>All the Fun of the Fair - Engels voor kinderen (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="all the fun of the fair - engels voor kinderen (1993)(philips)(nl)" sha1="d1bf78195943f979aafc197ae0f34da8c9ca913c"/>
</diskarea>
@@ -4289,7 +4306,7 @@ license:CC0-1.0
<description>Alles over CD-i - Apr-Mei 1995 (Netherlands)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alles over cd-i - apr-mei 1995 (1995)(philips)(nl)" sha1="cdcfea57de52dd5ed5950b5aa7b9e3e23c59b813"/>
</diskarea>
@@ -4305,7 +4322,7 @@ license:CC0-1.0
<description>Alles over CD-i - Aug-Sep 1994 (Netherlands)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alles over cd-i - aug-sep 1994 (1994)(philips)(nl)" sha1="0b348fc5dbffa4a7a5961a7aa53e9fd1f4663525"/>
</diskarea>
@@ -4321,7 +4338,7 @@ license:CC0-1.0
<description>De Amsterdamse Effectenbeurs Interactief (Netherlands)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="amsterdamse effectenbeurs interactief, de (1996)(philips)(nl)" sha1="45232202bb8a0ed469bbdfea8d5b7e11c468d211"/>
</diskarea>
@@ -4338,7 +4355,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips ~ PolyGram</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="andrew lloyd webber - the premiere collection encore (1993)(philips - polygram)(pal)(eu)[dvc]" sha1="f7976b9a92eaee3226874f2235484923b84961b0"/>
</diskarea>
@@ -4355,7 +4372,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips ~ PolyGram</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="andrew lloyd webber - the premiere collection encore (1993)(philips - polygram)(us)[dvc]" sha1="fc344555911556395f925f867945cb69345607f5"/>
</diskarea>
@@ -4371,7 +4388,7 @@ license:CC0-1.0
<description>Anne Willan presents The Food of France (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="anne willan presents the food of france (1992)(philips)(eu)" sha1="61ea43bc6cd09774e5951272c7939321845789ac"/>
</diskarea>
@@ -4387,7 +4404,7 @@ license:CC0-1.0
<description>Anne Willan presents The Food of France (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="anne willan presents the food of france (1992)(philips)(us)" sha1="64e3487e29270f0aaf440bc5e55144055684c51e"/>
</diskarea>
@@ -4404,7 +4421,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="around atlanta - the olympic city (1996)(philips)(eu)[dvc]" sha1="d5101cb9124ca2d3e0cc65d84cbbf414eba95516"/>
</diskarea>
@@ -4420,7 +4437,7 @@ license:CC0-1.0
<description>Around Hollywood - auf den spuren der stars (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="around hollywood - auf den spuren der stars (1995)(philips)(de)" sha1="4789afdb511cc46cb4591c21eeae14f7b5ec87cc"/>
</diskarea>
@@ -4436,7 +4453,7 @@ license:CC0-1.0
<description>The Art of the Czars - St. Petersburg and the Treasures of the Hermitage (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="art of the czars, the - st. petersburg and the treasures of the hermitage (1992)(philips)(eu-us)" sha1="8d08fa6f9680e8458da6fb1445a955df172412d3"/>
</diskarea>
@@ -4452,7 +4469,7 @@ license:CC0-1.0
<description>Astronomie Flammarion - Etoiles et Galaxies (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="astronomie flammarion - etoiles et galaxies (1994)(philips)(fr)" sha1="390235543325e3cb089f347e15ea09017f4d8d11"/>
</diskarea>
@@ -4468,7 +4485,7 @@ license:CC0-1.0
<description>Audio-Video Products '92-'93 on CD-Interactive v2 (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="audio-video products '92-'93 on cd-interactive v2 (1992)(philips)(eu)" sha1="076c9248fc47e9484525ff6dd3d09781b3e5273d"/>
</diskarea>
@@ -4484,7 +4501,7 @@ license:CC0-1.0
<description>La Bande Annonce - Automne-Hiver 95-96 (France)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bande annonce, la - automne-hiver 95-96 (1996)(philips)(fr)" sha1="8d0322903842e53041de8141719959bf8df962d0"/>
</diskarea>
@@ -4500,7 +4517,7 @@ license:CC0-1.0
<description>El Barrio Mas Divertido de Richard Scarry (Spain)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="barrio mas divertido de richard scarry, el (1992)(philips)(es)" sha1="2d0311ef9beaee6588419648492bb8d3b30d498d"/>
</diskarea>
@@ -4516,7 +4533,7 @@ license:CC0-1.0
<description>Beauty and the Beast (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="beauty &amp; the beast (1992)(philips)(us)" sha1="315c962662045cb09635519d36eb56efa3784435"/>
</diskarea>
@@ -4532,7 +4549,7 @@ license:CC0-1.0
<description>Die Schöne und das Tier (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="schone und das tier, die (1993)(philips)(de)" sha1="581fb486d418c4373f5927ad631e709e8f042ef0"/>
</diskarea>
@@ -4548,7 +4565,7 @@ license:CC0-1.0
<description>The Berenstain Bears - On Their Own and You On Your Own (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="berenstain bears, the - on their own and you on your own (1993)(philips)(us)" sha1="abaa741c099d257c739ad92c88567394bf1b23d0"/>
</diskarea>
@@ -4564,7 +4581,7 @@ license:CC0-1.0
<description>The Berenstain Bears - Les Ours Berenstain Comme des Grands (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="berenstain bears, the - les ours berenstain comme des grands (1994)(philips)(fr)" sha1="752a34a6478774a6b9a9c09b3b2483e6b20b8bb2"/>
</diskarea>
@@ -4580,7 +4597,7 @@ license:CC0-1.0
<description>Die Berenstain-Baren - Selbst ist der bar - mach mit - ist gar nicht schwer! (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="berenstain-baren, die - selbst ist der bar - mach mit - ist gar nicht schwer (1993)(philips)(de)" sha1="4ee5a2c3f7ec9cb4307adba7c5f0caa49d62a43e"/>
</diskarea>
@@ -4596,7 +4613,7 @@ license:CC0-1.0
<description>Thuis Bij de Berenstain Beren - Thuis en bij jou (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bij de berenstain beren, thuis - thuis en bij jou (1993)(philips)(nl)" sha1="f8f9ea72b8ae06c5da5f2d764a25dd61e2e86033"/>
</diskarea>
@@ -4612,7 +4629,7 @@ license:CC0-1.0
<description>Bertelsmann Universal Lexikon (Germany)</description>
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bertelsmann universal lexikon (1995)(pathe - philips)(de)" sha1="acf71211f2fcd63b23bac39f9ed73da9d264c289"/>
</diskarea>
@@ -4629,7 +4646,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Pathe ~ Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bertelsmann universal lexikon (1995)(pathe - philips)(de)[dvc]" sha1="4ed55755bef1f1b0a79973ba3d7acbebc0155283"/>
</diskarea>
@@ -4645,7 +4662,7 @@ license:CC0-1.0
<description>Bertelsmann Universal Lexikon - Demo-Disk (Germany)</description>
<year>1994</year>
<publisher>Pathe ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bertelsmann universal lexikon - demo-disk (1994)(pathe - philips)(de)" sha1="6d4db8d2df347449515bcf63c9b96f049d29ec44"/>
</diskarea>
@@ -4662,7 +4679,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="best of baby songs, the - featuring the songs of hop palmer (1993)(philips)(us)[dvc]" sha1="1a87c5696113c65a87736e63b345e6c0dea9ba19"/>
</diskarea>
@@ -4678,7 +4695,7 @@ license:CC0-1.0
<description>The Best of Draw-50 with Lee Ames (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="best of draw-50 with lee ames, the (1993)(philips)(us)" sha1="1afb8ad4ef46a82f7f6d254dd2777336c47d49ed"/>
</diskarea>
@@ -4695,7 +4712,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="best of manfred deix vol. 1, the (1994)(philips)(at)[dvc]" sha1="837196b670873ef5e4c49a6b831616c871eb9e6a"/>
</diskarea>
@@ -4711,7 +4728,7 @@ license:CC0-1.0
<description>Breast Self-Examination - Auto-examen Del Seno (USA)</description>
<year>1994</year>
<publisher>Media Inc</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="breast self-examination - auto-examen del seno (1994)(media inc)(us)(en-es)" sha1="a77d7240249fb25d3c06335760bf283a164c6be7"/>
</diskarea>
@@ -4727,7 +4744,7 @@ license:CC0-1.0
<description>Brer Rabbit and the Wonderful Tar Baby (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="brer rabbit and the wonderful tar baby (1991)(philips)(us)" sha1="49de13fd9a8c5c995a402ad305c59ca7f0529f21"/>
</diskarea>
@@ -4743,7 +4760,7 @@ license:CC0-1.0
<description>Bryan Adams - Waking up the Neighbours (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bryan adams - waking up the neighbours (1992)(philips)(eu)" sha1="53b4b357dbca347d0212b3e9f5503788009ae1b1"/>
</diskarea>
@@ -4769,7 +4786,7 @@ license:CC0-1.0
<description>BURN-CYCLE - The Music (Europe)[CD-Audio]</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="810 0114, 813 0118, 815 0102, 816 0056" />
<diskarea name="cdrom">
<disk name="burn-cycle - the music (1994)(philips)(eu)[burn-cycle, 810 0114, 813 0118, 815 0102, 816 0056][cd-audio]" sha1="15a23f92b1a5f2d8faacb7b7c09d3c8da54d991c"/>
@@ -4786,7 +4803,7 @@ license:CC0-1.0
<description>El Camino de Santiago - La milenaria ruta de las estrellas (Spain)</description>
<year>1995</year>
<publisher>ANAYAtouring - Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="camino de santiago, el - la milenaria ruta de las estrellas (1995)(anayatouring - philips)(es)(en-es)" sha1="2e25c6c014ff4d91a05c2f65c86c9d1658be3ecd"/>
</diskarea>
@@ -4802,7 +4819,7 @@ license:CC0-1.0
<description>El Camino de Santiago - La milenaria ruta de las estrellas (Compilation Cultura) (Spain)</description>
<year>1995</year>
<publisher>ANAYAtouring - Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="camino de santiago, el - la milenaria ruta de las estrellas (1995)(anayatouring - philips)(es)(en-es)[compilation cultura]" sha1="40cb54d21cc2a600c8fa3ddd740b424a608628a3"/>
</diskarea>
@@ -4819,7 +4836,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cartoon carnival (1993)(philips)(eu-us)[dvc enhanced]" sha1="a6a6b29a56ed0e083a3c640c11554d5f3f3fd54f"/>
</diskarea>
@@ -4835,7 +4852,7 @@ license:CC0-1.0
<description>Cartoon Jukebox (USA, alt)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690001-2 50228 730 01" />
<diskarea name="cdrom">
<disk name="cartoon jukebox (1991)(philips)(us)[310690001-2 50228 730 01]" sha1="517e49b138e6f305f541108968fb9640454f32e2"/>
@@ -4852,7 +4869,7 @@ license:CC0-1.0
<description>Cartoon Jukebox (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900012 01!" />
<diskarea name="cdrom">
<disk name="cartoon jukebox (1991)(philips)(us)[3106900012 01]" sha1="581e145098f868360ddfa19b6cdf5fe8a542b484"/>
@@ -4869,7 +4886,7 @@ license:CC0-1.0
<description>Cartoon Jukebox (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cartoon jukebox (1992)(philips)(de)" sha1="cd3697cbf4f4df09bfcac9d134a1d516c3237749"/>
</diskarea>
@@ -4904,7 +4921,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i demonstratie disc - fall 1996 - spring 1997 (1996)(philips)(nl)[dvc]" sha1="bac7c5e6ee1aa67e357ef76c8bea33246b801d04"/>
</diskarea>
@@ -4920,7 +4937,7 @@ license:CC0-1.0
<description>CD-I Full Motion Video Update (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i full motion video update (1993)(philips)(us)" sha1="2aead546529f5d6f67269bb93b98eb9c0e7a4c0a"/>
</diskarea>
@@ -4936,7 +4953,7 @@ license:CC0-1.0
<description>CD-i im gewerblichen Einsatz... (Germany)</description>
<year>1997</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i im gewerblichen einsatz... (1997)(philips)(de)" sha1="92ced777a4d0c320e2d60ab42519208ec699aec6"/>
</diskarea>
@@ -4952,7 +4969,7 @@ license:CC0-1.0
<description>Die CD-i mit der Maus - Auf dem Bauernhof (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i mit der maus, die - auf dem bauernhof (1995)(philips)(de)" sha1="36d5dd021a41eb834bf01807630642eb1de90540"/>
</diskarea>
@@ -4968,7 +4985,7 @@ license:CC0-1.0
<description>CD-i Title Sampler - Fall '94 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i title sampler - fall '94 (1994)(philips)(us)" sha1="4fa34b9e463c6b8f760b1599949f1142cee3d089"/>
</diskarea>
@@ -4984,7 +5001,7 @@ license:CC0-1.0
<description>CD-i Title Sampler - Summer '94 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i title sampler - summer '94 (1994)(philips)(us)" sha1="d7aa3863468bdfe0f0d126a19a3c38359d864be0"/>
</diskarea>
@@ -5000,7 +5017,7 @@ license:CC0-1.0
<description>CD-i Title Sampler - Winter '94 (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i title sampler - winter '94 (1994)(philips)(us)" sha1="d0937d38fcdfd8e984ed7c582b59e60965b513ab"/>
</diskarea>
@@ -5016,7 +5033,7 @@ license:CC0-1.0
<description>CD-I World - Erste europaische Ausgabe - Demo Disc (Germany)</description>
<year>1994</year>
<publisher>Hinweise</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i world - erste europaische ausgabe - demo disc (1994)(hinweise)(de)" sha1="6da955c529035d703f55841f8a57f177a1d098ef"/>
</diskarea>
@@ -5033,7 +5050,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>CD-Online</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-online - issue 01 - internet on tv (1995)(cd-online)(eu)[dvc]" sha1="a90af7cbcd8aa103cd3952b1df3b101a4882cbfc"/>
</diskarea>
@@ -5050,7 +5067,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>CD-Online</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-online - issue 02 - the internet game issue (1996)(cd-online)(eu)[dvc]" sha1="7bc02b2ad89018fe915419cc4cfda4864541fa9f"/>
</diskarea>
@@ -5067,7 +5084,7 @@ license:CC0-1.0
<year>1997</year>
<publisher>CD-Online</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-online disc 97-10 (1997)(cd-online)(eu)(m3)[dvc]" sha1="196dfd10af187f06a8f0c413707e40927b8e6416"/>
</diskarea>
@@ -5083,7 +5100,7 @@ license:CC0-1.0
<description>CDI 450 - Tutorial Disc (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cdi 450 - tutorial disc (1994)(philips)(eu)(m6)" sha1="53495b6d630fb131bf3bea0256b9f115730d5814"/>
</diskarea>
@@ -5099,7 +5116,7 @@ license:CC0-1.0
<description>CDI 470 - Tutorial Disc (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cdi 470 - tutorial disc (1995)(philips)(eu)(m11)" sha1="8556c45cd05e601a0494ef1c94859410ae68c2e1"/>
</diskarea>
@@ -5115,7 +5132,7 @@ license:CC0-1.0
<description>Children's Musical Theatre (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="00821015 01" />
<diskarea name="cdrom">
<disk name="children's musical theatre (1992)(philips)(us)[00821015 01]" sha1="1f3ae0281fc2370a3c1c575dd8b790827134e98f"/>
@@ -5132,7 +5149,7 @@ license:CC0-1.0
<description>Children's Musical Theatre (USA, alt 1)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="0082914 01" />
<diskarea name="cdrom">
<disk name="children's musical theatre (1992)(philips)(us)[0082914 01]" sha1="124718460f65bb41fe8dcb76102b47fcac1963df"/>
@@ -5149,7 +5166,7 @@ license:CC0-1.0
<description>Children's Musical Theatre (USA, alt 2)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900082 50268 090 01" />
<diskarea name="cdrom">
<disk name="children's musical theatre (1992)(philips)(us)[3106900082 50268 090 01]" sha1="d3fc0b97d46e24eb2d1631f24b3ea0679575f118"/>
@@ -5166,7 +5183,7 @@ license:CC0-1.0
<description>Cistercian Architecture (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cistercian architecture (1994)(philips)(eu)(m3)" sha1="7191e0f12b7e72d757a54fc220b886801d5785ce"/>
</diskarea>
@@ -5182,7 +5199,7 @@ license:CC0-1.0
<description>Classical Jukebox (Europe, USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="classical jukebox (1991)(philips)(eu-us)" sha1="56ab1275e231c7aec015858b04e2380d1e98f7fb"/>
</diskarea>
@@ -5198,7 +5215,7 @@ license:CC0-1.0
<description>Comprendre le CD-I - Understanding CD-I (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="comprendre le cd-i - understanding cd-i (1995)(philips)(eu)(en-fr)" sha1="4c2e45779c40d8117982512cbcdbf5441bec8d8a"/>
</diskarea>
@@ -5215,7 +5232,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Compton's NewMedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="compton's interactive encyclopedia (1995)(compton's newmedia)(eu)[dvc enhanced]" sha1="87bb630e2460b4e6532305bb99728052173c733c"/>
</diskarea>
@@ -5231,7 +5248,7 @@ license:CC0-1.0
<description>Compton's Interactive Encyclopedia - CD-Interactive (Europe)</description>
<year>1992</year>
<publisher>Compton's NewMedia</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="compton's interactive encyclopedia - cd-interactive (1992)(compton's newmedia)(eu)" sha1="ce808c53d454980693c09cb48db8aa5f5c9a048f"/>
</diskarea>
@@ -5247,7 +5264,7 @@ license:CC0-1.0
<description>Compton's Interactive Encyclopedia - CD-Interactive (USA)</description>
<year>1992</year>
<publisher>Compton's NewMedia</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="compton's interactive encyclopedia - cd-interactive (1992)(compton's newmedia)(us)" sha1="a043a47d8cfb64c111ad18a029b084b2c037b077"/>
</diskarea>
@@ -5263,7 +5280,7 @@ license:CC0-1.0
<description>The Concise Oxford Dictionary &amp; Oxford Thesaurus (Europe)</description>
<year>1995</year>
<publisher>Oxford University Press ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="concise oxford dictionary &amp; oxford thesaurus, the (1995)(oxford university press - philips)(eu)" sha1="a45ed67970d459f4df7dfcf0b164721bc1ca7138"/>
</diskarea>
@@ -5279,7 +5296,7 @@ license:CC0-1.0
<description>Cool Oldies Jukebox (USA)</description>
<year>1991</year>
<publisher>Mercury ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cool oldies jukebox (1991)(mercury - philips)(us)" sha1="55a43b5c46b2aab24ab7a8b7888eaa99a2a16433"/>
</diskarea>
@@ -5340,7 +5357,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cosmopolitan interactive - tonetics (1995)(philips)(us)[dvc]" sha1="5668157f9b54788ec9ada74fc58f98f1f7cc5ae9"/>
</diskarea>
@@ -5356,7 +5373,7 @@ license:CC0-1.0
<description>The Crayon Factory (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="crayon factory, the (1995)(philips)(eu)" sha1="73c190ce5c1d50a0d990b3cce5e311a915b531c8"/>
</diskarea>
@@ -5372,7 +5389,7 @@ license:CC0-1.0
<description>The Crayon Factory (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="crayon factory, the (1994)(philips)(us)" sha1="14c752e3ca62b36065a62468fb2756116d73a089"/>
</diskarea>
@@ -5388,7 +5405,7 @@ license:CC0-1.0
<description>Create your own Caricature with Spitting Image (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8110001 50274 188 01" />
<diskarea name="cdrom">
<disk name="create your own caricature with spitting image (1992)(philips)(eu)[8110001 50274 188 01]" sha1="5733d619ef9d5d31ffdfc002d97aeee554ea5fd6"/>
@@ -5405,7 +5422,7 @@ license:CC0-1.0
<description>Create your own Caricature with Spitting Image (Europe, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8110001 50274 188 02" />
<diskarea name="cdrom">
<disk name="create your own caricature with spitting image (1992)(philips)(eu)[8110001 50274 188 02]" sha1="a0bcd9c06f0a414bcc741342849f36e6a8ec3bd8"/>
@@ -5422,7 +5439,7 @@ license:CC0-1.0
<description>Cruise Directory (UK)</description>
<year>1994</year>
<publisher>Barclays ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cruise directory (1994)(barclays - philips)(gb)" sha1="c02560a1e9d3e39679fc74d2a8ddeaadac2a0805"/>
</diskarea>
@@ -5439,7 +5456,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dansen (1996)(philips)(nl)[dvc]" sha1="19c3103c37e8d594791305d6c90d76953c86cf80"/>
</diskarea>
@@ -5455,7 +5472,7 @@ license:CC0-1.0
<description>Dave Grusin - The Gershwin Connection (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dave grusin - the gershwin connection (1993)(philips)(us)" sha1="2fba08da5de4e16ce50117fff11f3e997d471405"/>
</diskarea>
@@ -5472,7 +5489,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>World of Wonders</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="destination great britain - central and northern england (1994)(world of wonders)(us)[dvc]" sha1="7ebb035e7ebe6d2a2a980220197c0354350dfbdd"/>
</diskarea>
@@ -5489,7 +5506,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>World of Wonders</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="destination great britain - england's west country (1994)(world of wonders)(us)[dvc]" sha1="9b51de1883511a4c02c55cb4d197e8adf4444ae8"/>
</diskarea>
@@ -5506,7 +5523,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>World of Wonders</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="destination great britain - london &amp; southern england (1995)(world of wonders)(us)[dvc]" sha1="6e0799bec8f265ff1933c1a3dac157775636c9e6"/>
</diskarea>
@@ -5523,7 +5540,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>World of Wonders</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="destination great britain - wales (1994)(world of wonders)(us)[dvc]" sha1="cac883934d36bc57b177c0a21e9c2225e314a995"/>
</diskarea>
@@ -5539,7 +5556,7 @@ license:CC0-1.0
<description>Discover Sports Fishing - Northern Edition (USA)</description>
<year>1995</year>
<publisher>World of Wonders</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="discover sports fishing - northern edition (1995)(world of wonders)(us)" sha1="882cdb014f8aa68137c5c4e68bfbc53fd9bd1f3f"/>
</diskarea>
@@ -5555,7 +5572,7 @@ license:CC0-1.0
<description>Discovery - Your Place in the World (USA)</description>
<year>1997</year>
<publisher>Educational Management Group</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="discovery - your place in the world (1997)(educational management group)(us)" sha1="360a418cc23bdbe4033e071ec7d063d2baee8bcf"/>
</diskarea>
@@ -5572,7 +5589,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dit was 1994 - wereldnieuws overzicht (1995)(philips)(nl)[dvc]" sha1="4944e60cab3d709d1847a8a8abb76fbe113c0ab1"/>
</diskarea>
@@ -5589,7 +5606,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dit was 1995 - wereldnieuws overzicht (1996)(philips)(nl)[dvc]" sha1="06e3447cf64f8cd6d192e50c1e29d33da399f506"/>
</diskarea>
@@ -5605,7 +5622,7 @@ license:CC0-1.0
<description>Der Dom zu St. Stephan in Wien (Austria)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dom zu st. stephan in wien, der (1995)(philips)(at)" sha1="2611442307f7fc0de28a3bca0d06d8266ef91fb7"/>
</diskarea>
@@ -5621,7 +5638,7 @@ license:CC0-1.0
<description>The Downhome Blues (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="downhome blues, the (1994)(philips)(us)" sha1="893926bdf0bb85c6e475639658c35da3fb7af04a"/>
</diskarea>
@@ -5637,7 +5654,7 @@ license:CC0-1.0
<description>Dutch Masters of the Seventeenth Century (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dutch masters of the seventeenth century (1992)(philips)(eu)" sha1="956655aa6c665b035df63d040dc37d27b4217e16"/>
</diskarea>
@@ -5653,7 +5670,7 @@ license:CC0-1.0
<description>Dutch Masters of the Seventeenth Century (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dutch masters of the seventeenth century (1992)(philips)(us)" sha1="e0a44d5a93ad551352546fcc9617102108e38de0"/>
</diskarea>
@@ -5669,7 +5686,7 @@ license:CC0-1.0
<description>E-Z Play Today Keyboard - Now Anyone Can Learn To Play Keyboard! (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="e-z play today keyboard - now anyone can learn to play keyboard (1994)(philips)(eu)" sha1="bc72914f6446c2792335822901ff60a0509e1c69"/>
</diskarea>
@@ -5685,7 +5702,7 @@ license:CC0-1.0
<description>Earth - The Changing Environment (USA)</description>
<year>1995</year>
<publisher>World of Wonders</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="earth - the changing environment (1995)(world of wonders)(us)" sha1="cbbb058194ec2f1ef26b3a518a00037aea488b0b"/>
</diskarea>
@@ -5701,7 +5718,7 @@ license:CC0-1.0
<description>Ein Kind Entsteht (Germany)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ein kind entsteht (1994)(philips)(de)" sha1="70ff4418798ef4fa8c3c0a0b123761d63d051afb"/>
</diskarea>
@@ -5717,7 +5734,7 @@ license:CC0-1.0
<description>The Emperor's New Clothes (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emperor's new clothes, the (1992)(philips)(us)" sha1="e4887b8b51e4090e61d5aa06e6764b79848c9c1a"/>
</diskarea>
@@ -5734,7 +5751,7 @@ license:CC0-1.0
<description>Encyclopaedia Hachette (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="encyclopaedia hachette (1994)(philips)(eu)[aka dictionnaire hachette multimedia]" sha1="4a8c757d20a3ac5f87fc471a5d7b7342b4631552"/>
</diskarea>
@@ -5750,7 +5767,7 @@ license:CC0-1.0
<description>Enkhuizer Almanak 1997 - 402 Jaargang (Netherlands)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="enkhuizer almanak 1997 - 402 jaargang (1996)(philips)(nl)" sha1="7320a72a3bb5c93977e0b82e189f3bf51c6fa59a"/>
</diskarea>
@@ -5769,12 +5786,12 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips ~ PolyGram</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="eric clapton - the cream of eric clapton (1994)(philips - polygram)(pal)(eu)(disc 1 of 2)[dvc]" sha1="849a5c73142e65afe573dcab9ae743de0404356e"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="eric clapton - the cream of eric clapton (1994)(philips - polygram)(pal)(eu)(disc 2 of 2)[dvc]" sha1="de058a80c64ba02a719a585557f7f2a06abd52a2"/>
</diskarea>
@@ -5790,7 +5807,7 @@ license:CC0-1.0
<description>Essentials - The New Shape of Home Shopping by Freemans (UK)</description>
<year>1994</year>
<publisher>Barclays ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="essentials - the new shape of home shopping by freemans (1994)(barclays - philips)(gb)" sha1="2ec0669fbd84c2471b903b0217c92386a471d199"/>
</diskarea>
@@ -5806,7 +5823,7 @@ license:CC0-1.0
<description>European Party (Europe)</description>
<year>1994</year>
<publisher>Giunti Multimedia ~ Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="european party (1994)(giunti multimedia - philips)(eu)" sha1="cc52b63e817b25bb728e1e016f28f871dba7fad3"/>
</diskarea>
@@ -5822,7 +5839,7 @@ license:CC0-1.0
<description>Exploration - The World Around You (USA)</description>
<year>1997</year>
<publisher>Educational Management Group</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="exploration - the world around you (1997)(educational management group)(us)" sha1="cb15472604f0552d2465f88805b1c5a2637d38ef"/>
</diskarea>
@@ -5838,7 +5855,7 @@ license:CC0-1.0
<description>Explorations of Space (USA)</description>
<year>1994</year>
<publisher>Educational Management Group</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="explorations of space (1994)(educational management group)(us)" sha1="6ee42a247c54d1718f7e8184d9c7c4d40e9b32f1"/>
</diskarea>
@@ -5854,7 +5871,7 @@ license:CC0-1.0
<description>Face Kitchen (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="face kitchen (1992)(philips)(eu)" sha1="d444a9cc73fab286fde07c6e790ebc7c02a1f4f0"/>
</diskarea>
@@ -5870,7 +5887,7 @@ license:CC0-1.0
<description>La Famille Papyrus (France)</description>
<year>1994</year>
<publisher>Hachette Livre</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="famille papyrus, la (1994)(hachette livre)(fr)" sha1="6be8df043a6620af5632b50c814decb0ae8de6da"/>
</diskarea>
@@ -5888,7 +5905,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="filmmaand, de - highlights-previews-filmclips (1995-05)(philips)(nl)[a][dvc]" sha1="0f369bc334affc81c0c147ef68640d132d649605"/>
</diskarea>
@@ -5906,7 +5923,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="filmmaand, de - highlights-previews-filmclips (1995-05)(philips)(nl)[dvc]" sha1="ca59611ec63e896687afda22d120f79fc4409bbb"/>
</diskarea>
@@ -5928,7 +5945,7 @@ license:CC0-1.0
<description>Fish TV - Living Screens (Europe)</description>
<year>1997</year>
<publisher>Daedalus</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fish tv - living screens (1997)(daedalus)(eu)" sha1="38ca66e15c278039ea3e2b91c655d9679c24f5bf"/>
</diskarea>
@@ -5944,7 +5961,7 @@ license:CC0-1.0
<description>Flintstones &amp; Jetsons - Timewarp (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="flintstones &amp; jetsons - timewarp (1994)(philips)(eu)" sha1="e931b59a6d59b4b755181e8fb89e4cf7c3cac2d1"/>
</diskarea>
@@ -5960,7 +5977,7 @@ license:CC0-1.0
<description>Flintstones &amp; Jetsons - Timewarp (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="flintstones &amp; jetsons - timewarp (1994)(philips)(us)" sha1="bf2d1a3a9bfb77c659fdcfa000944915f4133d85"/>
</diskarea>
@@ -5977,7 +5994,7 @@ license:CC0-1.0
<description>The Flowers of Robert Mapplethorpe (USA)[Photo CD]</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="flowers of robert mapplethorpe, the (1992)(philips)(us)[photo cd]" sha1="e66a82313a0894eff7d93803febb645c7fd67f07"/>
</diskarea>
@@ -5994,7 +6011,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="football - l'histoire, les regles, les vedettes, le jeu de penalties v1.04 (1994)(philips)(fr)[dvc]" sha1="ea48f982568a3971c21164e3669a90ac90b4672c"/>
</diskarea>
@@ -6010,7 +6027,7 @@ license:CC0-1.0
<description>The French Impressionists (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="french impressionists, the (1992)(philips)(us)" sha1="27b86e716830ef97a5d238d26249df513a109258"/>
</diskarea>
@@ -6026,7 +6043,7 @@ license:CC0-1.0
<description>De Franse Impressionisten (Netherlands)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="franse impressionisten, de (1991)(philips)(nl)" sha1="dd429e0edb2b8941da9e1131bf118cbc46e67bee"/>
</diskarea>
@@ -6042,7 +6059,7 @@ license:CC0-1.0
<description>Les Impressionnistes Français (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="impressionnistes francais, les (1992)(philips)(fr)" sha1="084ae8bfdde803970c9f32ca81aeabebf3fcd18f"/>
</diskarea>
@@ -6058,7 +6075,7 @@ license:CC0-1.0
<description>The Full Swing (Europe)</description>
<year>1993</year>
<publisher>Xdra</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="full swing, the (1993)(xdra)(eu)" sha1="3f954d174a35127bc8dcf871091da3f58abb895b"/>
</diskarea>
@@ -6074,7 +6091,7 @@ license:CC0-1.0
<description>Gardening by Choice - Flowers &amp; Foliage (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gardening by choice - flowers &amp; foliage (1992)(philips)(us)" sha1="3acd1ff594260f592e1d93ebc56fb72e14ca0777"/>
</diskarea>
@@ -6090,7 +6107,7 @@ license:CC0-1.0
<description>Gateshead 1900 - A Guide to Tyneside 100 Years Ago (Europe)</description>
<year>1995</year>
<publisher>Xdra</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gateshead 1900 - a guide to tyneside 100 years ago (1995)(xdra)(eu)" sha1="d0e0c55af81a909cd85a30cb935e582017a69f93"/>
</diskarea>
@@ -6108,7 +6125,7 @@ license:CC0-1.0
<description>Getting Ahead - Making Time (Europe)</description>
<year>1994</year>
<publisher>Temple Millar Multimedia ~ Xdra</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="getting ahead - making time (1994)(temple millar multimedia - xdra)(eu)[cd-i-pc]" sha1="c41c5e1cf44cf57a73772101bdc87c721eff4da0"/>
</diskarea>
@@ -6124,7 +6141,7 @@ license:CC0-1.0
<description>Gnomes v2.10 (USA)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gnomes v2.10 (1995)(philips)(us)" sha1="990bdd1887f7e0da1a823dac40c9e018ff54da9f"/>
</diskarea>
@@ -6140,7 +6157,7 @@ license:CC0-1.0
<description>Golden Oldies Jukebox (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690006-2 50240 109 01" />
<diskarea name="cdrom">
<disk name="golden oldies jukebox (1991)(philips)(us)[310690006-2 50240 109 01]" sha1="53217cf52ab46a92618402bf72f168b157b8f225"/>
@@ -6157,7 +6174,7 @@ license:CC0-1.0
<description>Golden Oldies Jukebox (USA, alt)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="0062919 01" />
<diskarea name="cdrom">
<disk name="golden oldies jukebox (1991)(philips)(us)[0062919 01]" sha1="2f855b39631a1a24e836cc3006a847c6abc1be1c"/>
@@ -6182,27 +6199,27 @@ license:CC0-1.0
<description>Golf My Way (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="golf my way (1994)(philips)(us)(disc 1 of 5)[part i]" sha1="f739ba7649163dc19c82dc33dc35d08a0dde2a8e"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="golf my way (1994)(philips)(us)(disc 2 of 5)[part i]" sha1="7c80b06c694b1636562033d5fae47ee9f953a13e"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<diskarea name="cdrom">
<disk name="golf my way (1994)(philips)(us)(disc 3 of 5)[part ii]" sha1="6d30b53cb94260e07f561c889980136a189c5c5c"/>
</diskarea>
</part>
- <part name="cdrom4" interface="cdi_cdrom">
+ <part name="cdrom4" interface="cdrom">
<diskarea name="cdrom">
<disk name="golf my way (1994)(philips)(us)(disc 4 of 5)[part ii]" sha1="82eb0df662dd0219a1377b8e7e591667271990fd"/>
</diskarea>
</part>
- <part name="cdrom5" interface="cdi_cdrom">
+ <part name="cdrom5" interface="cdrom">
<diskarea name="cdrom">
<disk name="golf my way (1994)(philips)(us)(disc 5 of 5)[part ii]" sha1="7aa4ed0b5334dfdfbf17fa3f0d410a96c4b801b4"/>
</diskarea>
@@ -6218,7 +6235,7 @@ license:CC0-1.0
<description>Golf Tips - Customised Golf Instruction (Europe)</description>
<year>1993</year>
<publisher>Xdra</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="golf tips - customised golf instruction (1993)(xdra)(eu)(en-ja)" sha1="0e7554b498cf62d9f7db6316a4f59842a63c0437"/>
</diskarea>
@@ -6234,7 +6251,7 @@ license:CC0-1.0
<description>Goya Grabador - Luces y Sombras (Spain)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="goya grabador - luces y sombras (1995)(philips)(es)(m3)" sha1="dc3bb76ca3dcc23e3348496f43871aa3dca340dc"/>
</diskarea>
@@ -6251,7 +6268,7 @@ license:CC0-1.0
<description>Grand Prix Special (Europe)</description>
<year>1994</year>
<publisher>Xdra</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="grand prix special (1994)(xdra)(eu)" sha1="96a5c5f8714950371d7462b72b0a25fa258e20b7"/>
</diskarea>
@@ -6268,7 +6285,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Xdra</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="great american golf 2 (1994)(xdra)(eu)[dvc]" sha1="65d9503e563d6fdda870dfc729aeef51a15a213b"/>
</diskarea>
@@ -6284,7 +6301,7 @@ license:CC0-1.0
<description>Great British Golf - Middle Ages - 1940 (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="great british golf - middle ages - 1940 (1992)(philips)(eu)" sha1="90431e383fd213cbb19d8dd0978fc5e2e7aad922"/>
</diskarea>
@@ -6300,7 +6317,7 @@ license:CC0-1.0
<description>Harvest of the Sun - Vincent Van Gogh Revisited (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="028294 01" />
<diskarea name="cdrom">
<disk name="harvest of the sun - vincent van gogh revisited (1991)(philips)(us)[028294 01]" sha1="bc489d6490285ab62923ab3d2299b1ca9d70c9b2"/>
@@ -6317,7 +6334,7 @@ license:CC0-1.0
<description>Harvest of the Sun - Vincent Van Gogh Revisited (USA, alt 1)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690028-2 50239 148 01" />
<diskarea name="cdrom">
<disk name="harvest of the sun - vincent van gogh revisited (1992)(philips)(us)[310690028-2 50239 148 01]" sha1="72848a648e009730e59fe4b28521a5762ac0f343"/>
@@ -6334,7 +6351,7 @@ license:CC0-1.0
<description>Harvest of the Sun - Vincent Van Gogh Revisited (USA, alt 2)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690028-2 50239 148 02" />
<diskarea name="cdrom">
<disk name="harvest of the sun - vincent van gogh revisited (1992)(philips)(us)[310690028-2 50239 148 02]" sha1="2ab0ff3f672c2ee652eaa291a463af7d39af6311"/>
@@ -6351,7 +6368,7 @@ license:CC0-1.0
<description>Harvest of the Sun - Van Gogh - Une Moisson de soleils (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="harvest of the sun - van gogh - une moisson de soleils (1992)(philips)(fr)" sha1="385376d98cc637617ed24a8f172002b87b624b4e"/>
</diskarea>
@@ -6367,7 +6384,7 @@ license:CC0-1.0
<description>Oogst van de Zon - leven en kunst van Vincent van Gogh (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="oogst van de zon - leven en kunst van vincent van gogh (1992)(philips)(nl)" sha1="091370ec3ec14d3a6b54321dd750b1e038ff17e9"/>
</diskarea>
@@ -6383,7 +6400,7 @@ license:CC0-1.0
<description>Ernte der Sonne - Vincent Van Gogh (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ernte der sonne - vincent van gogh (1992)(philips)(de)" sha1="d1df5f6197cefb2bb87b22958565cfb9eac03121"/>
</diskarea>
@@ -6399,7 +6416,7 @@ license:CC0-1.0
<description>La Cosecha del Sol - Vincent Van Gogh Revivido (Spain)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cosecha del sol, la - vincent van gogh revivido (1992)(philips)(es)" sha1="f4cdfc01e465e1160082c4aa45a4115394334ccb"/>
</diskarea>
@@ -6415,7 +6432,7 @@ license:CC0-1.0
<description>Haunted House (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="haunted house (1996)(philips)(eu)" sha1="87ef237696a62eef8c99942979fb073047804fa3"/>
</diskarea>
@@ -6436,19 +6453,19 @@ license:CC0-1.0
<description>Help! Opleiding Bedrijfshulpverlener voor de Supermarkt (Netherlands)</description>
<year>1996</year>
<publisher>&lt;unknown&gt;</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Inleiding Ehbo2 Toets" />
<diskarea name="cdrom">
<disk name="help opleiding bedrijfshulpverlener voor de supermarkt (1996)(-)(nl)(disc 1 of 3)[inleiding ehbo2 toets]" sha1="2371b2fda7d55d30f92e040d1420dd21cd8a4fd5"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Ehbo1" />
<diskarea name="cdrom">
<disk name="help opleiding bedrijfshulpverlener voor de supermarkt (1996)(-)(nl)(disc 2 of 3)[ehbo1]" sha1="9de2182d95a4447e3060737a3044b7da6d9a5813"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Brand Ontruiming" />
<diskarea name="cdrom">
<disk name="help opleiding bedrijfshulpverlener voor de supermarkt (1996)(-)(nl)(disc 3 of 3)[brand ontruiming]" sha1="6db47cfd5fc307bbd64543b45e01b8c915e55aea"/>
@@ -6466,7 +6483,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="henri des - les betises (1993)(philips)(fr)[dvc]" sha1="ed2360164a223ff9d2dd16f39dc6e62e7d8cffcb"/>
</diskarea>
@@ -6482,7 +6499,7 @@ license:CC0-1.0
<description>Het staat in de Sterren (Netherlands)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="het staat in de sterren (1996)(philips)(nl)" sha1="d33de6dc581a0afecc0db0aeca830cc63d7329cb"/>
</diskarea>
@@ -6498,7 +6515,7 @@ license:CC0-1.0
<description>Hieperdepiep, ik lees! - 10 leesspelletjes (Netherlands)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hieperdepiep, ik lees - 10 leesspelletjes (1996)(philips)(nl)" sha1="2d35519683b0261477b0884139cb4b3431c1c2a1"/>
</diskarea>
@@ -6520,22 +6537,22 @@ license:CC0-1.0
<description>Historia Universal del ARTE - La aventura de la expresion humana (Spain)</description>
<year>1996</year>
<publisher>Salvat Multimedia</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="historia universal del arte - la aventura de la expresion humana (1996)(salvat multimedia)(es)(disc 1 of 4)" sha1="35c3146e32719b30b9c70532b90b9496e9be51ed"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="historia universal del arte - la aventura de la expresion humana (1996)(salvat multimedia)(es)(disc 2 of 4)" sha1="5d187329f51248a80629fb078d7d055eec130b36"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<diskarea name="cdrom">
<disk name="historia universal del arte - la aventura de la expresion humana (1996)(salvat multimedia)(es)(disc 3 of 4)" sha1="26259d357148a2e4c84d9d19a429b911f67d1ae6"/>
</diskarea>
</part>
- <part name="cdrom4" interface="cdi_cdrom">
+ <part name="cdrom4" interface="cdrom">
<diskarea name="cdrom">
<disk name="historia universal del arte - la aventura de la expresion humana (1996)(salvat multimedia)(es)(disc 4 of 4)" sha1="355d8eb8abaead11acdee21f77dc9b61c45bc4c5"/>
</diskarea>
@@ -6551,7 +6568,7 @@ license:CC0-1.0
<description>Hit Karaoke Volume 1 - Nostalgie (France)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hit karaoke volume 1 - nostalgie (1996)(philips)(fr)" sha1="9629406d925416ea380ba92a1c9320647b5f2840"/>
</diskarea>
@@ -6567,7 +6584,7 @@ license:CC0-1.0
<description>Hit Karaoke Volume 2 - Annees 80-90 (France)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hit karaoke volume 2 - annees 80-90 (1996)(philips)(fr)" sha1="b8803d454959832250a652256116a6aea8d8d73d"/>
</diskarea>
@@ -6583,7 +6600,7 @@ license:CC0-1.0
<description>Hit Karaoke Volume 3 - Gold's (France)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hit karaoke volume 3 - gold's (1996)(philips)(fr)" sha1="3898f9cb0859602af2ef9adc23269a250193531c"/>
</diskarea>
@@ -6599,7 +6616,7 @@ license:CC0-1.0
<description>Hit Karaoke Volume 5 - Top Club (France)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hit karaoke volume 5 - top club (1996)(philips)(fr)" sha1="38dfcc5fca6f1c37095229882dd4c52400e26d44"/>
</diskarea>
@@ -6615,7 +6632,7 @@ license:CC0-1.0
<description>Hollandse Meesters uit de Zeventiende Eeuw (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hollandse meesters uit de zeventiende eeuw (1992)(philips)(nl)" sha1="76c880c048e172a7ba82de7886288d9dd661d9ce"/>
</diskarea>
@@ -6632,7 +6649,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>AVRO</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hondenliefde (1995)(avro)(nl)[dvc]" sha1="930a630dda0f1fa7b74c62f8435717e1ef76fbb7"/>
</diskarea>
@@ -6648,7 +6665,7 @@ license:CC0-1.0
<description>How the Camel got its Hump (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="how the camel got it's hump (1992)(philips)(us)(en-es)" sha1="3f340c2c3a4bdf83484e92a5bc1e6c956d17455f"/>
</diskarea>
@@ -6664,7 +6681,7 @@ license:CC0-1.0
<description>How the Rhinoceros got his Skin (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900232 02!" />
<diskarea name="cdrom">
<disk name="how the rhinoceros got his skin (1992)(philips)(us)(en-es)[3106900232 02]" sha1="fbffc12e6246c8ae26239e7c1933223a038b3684"/>
@@ -6681,7 +6698,7 @@ license:CC0-1.0
<description>How the Rhinoceros got his Skin (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900232 50237 962 01" />
<diskarea name="cdrom">
<disk name="how the rhinoceros got his skin (1992)(philips)(us)(en-es)[3106900232 50237 962 01]" sha1="569fb461684ee8abd294e3feb4c8f6414784ce1b"/>
@@ -6698,7 +6715,7 @@ license:CC0-1.0
<description>Wie das Rhinozeros zu seiner Haut kam (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="wie das rhinozeros zu seiner haut kam (1993)(philips)(de)" sha1="8d8943d2dc8a6d20a23d826537af34abe40eea21"/>
</diskarea>
@@ -6715,7 +6732,7 @@ license:CC0-1.0
<description>How to Photograph Nature (USA)[CD-i-Photo CD]</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="how to photograph nature (1993)(philips)(us)[cd-i-photo cd]" sha1="5a0338596cec6feef16283ba7c3aa30066d48a77"/>
</diskarea>
@@ -6732,7 +6749,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ik, mik, letterland - een leesavontuur met maan roos vis (1996)(philips)(nl)[dvc]" sha1="1a13af6aba462ad0a1a7454ea3298c610133609e"/>
</diskarea>
@@ -6752,7 +6769,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>AIMS Multimedia</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="imagination in motion - a new era in 3d chill out video (1996)(aims multimedia)(eu)[dvc]" sha1="74ac6ec58a73259ec6051480257f9430e9ba20b6"/>
</diskarea>
@@ -6769,7 +6786,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Gulliver Ritchie Associates</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="interactive math - decimals v1.0 (1994)(gulliver ritchie associates)(us)[dvc]" sha1="7e7e37f1856909dd670dc9b78d3474e88cb641ce"/>
</diskarea>
@@ -6785,7 +6802,7 @@ license:CC0-1.0
<description>Interactive Math - Percentages v1.0 (USA)</description>
<year>1994</year>
<publisher>Gulliver Ritchie Associates</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="interactive math - percentages v1.0 (1994)(gulliver ritchie associates)(us)" sha1="9379830d0b530d0df09303054edad9dbee5ab7fc"/>
</diskarea>
@@ -6802,7 +6819,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8140154" />
<diskarea name="cdrom">
<disk name="internetten op je tv - demo disc (1996)(philips)(nl)[dvc][8140154]" sha1="1620b35d3b7f36d5066734694d7baf948cd776a8"/>
@@ -6820,7 +6837,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100330" />
<diskarea name="cdrom">
<disk name="internetten op je tv - demo disc (1996)(philips)(nl)[dvc][8100330]" sha1="908ea704879b1a50e8f5e9d5fb3cf6a72c5b84f4"/>
@@ -6837,7 +6854,7 @@ license:CC0-1.0
<description>J'invente mes histoires 2 - Rêves d'étoiles (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="j'invente mes histoires 2 - reves d'etoiles (1992)(philips)(fr)" sha1="dbfad812d2d5a11dc245f48b2d5bb1061aacd6fd"/>
</diskarea>
@@ -6853,7 +6870,7 @@ license:CC0-1.0
<description>Jazz Giants - From Big Band to Bossa Nova (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jazz giants - from big band to bossa nova (1992)(philips)(us)" sha1="5e624d7faef4b9897b123e2353365c345c711954"/>
</diskarea>
@@ -6869,7 +6886,7 @@ license:CC0-1.0
<description>Jazz - Les Geants de Big Band à la Bossa Nova (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jazz - les geants de big band a la bossa nova (1993)(philips)(fr)" sha1="6cb7633f0a19272ae36d6e5d45c56c4a048f6055"/>
</diskarea>
@@ -6888,13 +6905,13 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Journal Interactif" />
<diskarea name="cdrom">
<disk name="journal interactif '94 et le jeu des stars de l'info, le (1995)(philips)(fr)(disc 1 of 2)[journal interactif][dvc]" sha1="e8135f48058dcb4be1aa8c9287b391ad500e4f3d"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Jeu des Stars de l'Info" />
<diskarea name="cdrom">
<disk name="journal interactif '94 et le jeu des stars de l'info, le (1995)(philips)(fr)(disc 2 of 2)[jeu des stars de l'info][dvc]" sha1="00c64bda26559c4acb08c3abc108e3eeaa078deb"/>
@@ -6914,13 +6931,13 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Journal Interactif" />
<diskarea name="cdrom">
<disk name="journal interactif 1995 et le jeu des stars de l'info, le (1995)(philips)(fr)(disc 1 of 2)[journal interactif][dvc]" sha1="8063d3cbf65f1709e24befe8cd8d16537ace0c20"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Jeu des Stars de l'Info" />
<diskarea name="cdrom">
<disk name="journal interactif 1995 et le jeu des stars de l'info, le (1995)(philips)(fr)(disc 2 of 2)[jeu des stars de l'info][dvc]" sha1="64e65e371a29e245b4c7a2a2c9a0747d27441669"/>
@@ -6938,7 +6955,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joy of sex, the v3.01 (1994)(philips)(us)[dvc]" sha1="cace9eea975ebfcdbde04425979ef4ae1e418598"/>
</diskarea>
@@ -6955,7 +6972,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joy of sex, the v3.03 (1993)(philips)(eu)[dvc]" sha1="1c172310e21fbf1e256c9b3e92187d3c5d1c3a4d"/>
</diskarea>
@@ -6971,7 +6988,7 @@ license:CC0-1.0
<description>Karaoke Collection Nr. 5 (Italy)</description>
<year>1993</year>
<publisher>Giunti Multimedia</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="karaoke collection nr. 5 (1993)(giunti multimedia)(it)" sha1="246a54d5b6b0c35b81ff8d96d157afc3f86e2b80"/>
</diskarea>
@@ -6987,7 +7004,7 @@ license:CC0-1.0
<description>Karaoke Klassics 1 - Family Favorites (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="karaoke klassics 1 - family favorites (1993)(philips)(eu)(m6)" sha1="15085b72dfe7b1a71cc78b3f56d719825435077a"/>
</diskarea>
@@ -7003,7 +7020,7 @@ license:CC0-1.0
<description>Karaoke Klassics 2 - Greatest Love Duets Volume 1 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="karaoke klassics 2 - greatest love duets volume 1 (1993)(philips)(eu)(m6)" sha1="bb56d0f1791d74af07903268b45b8eb5aa78c328"/>
</diskarea>
@@ -7019,7 +7036,7 @@ license:CC0-1.0
<description>Karaoke Klassics 3 - Male Standards Volume 1 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="karaoke klassics 3 - male standards volume 1 (1993)(philips)(eu)(m6)" sha1="7c23e14f3a6ca87df4e786d429b3b48a2baf817d"/>
</diskarea>
@@ -7035,7 +7052,7 @@ license:CC0-1.0
<description>Karaoke Klassics 4 - Contemporary Pop Female Volume 1 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="karaoke klassics 4 - contemporary pop female volume 1 (1993)(philips)(eu)(m6)" sha1="b2efec4bc0e1fd1948858b309090264fcb17a007"/>
</diskarea>
@@ -7051,7 +7068,7 @@ license:CC0-1.0
<description>Karaoke Klassics 5 - Special Occasions (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="karaoke klassics 5 - special occasions (1994)(philips)(eu)(m6)" sha1="6745c38983604c1e7f80fd9114a4aac6f7598146"/>
</diskarea>
@@ -7068,7 +7085,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kathy smith - personal trainer (1995)(philips)(eu)[dvc]" sha1="0dd8458b59368281d3aadec2964791afd28b5f88"/>
</diskarea>
@@ -7085,7 +7102,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kathy smith - personal trainer (1995)(philips)(us)[dvc]" sha1="dc25c3d37c9611f875d28b5453b0c636b9fdffd3"/>
</diskarea>
@@ -7104,12 +7121,12 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips ~ PolyGram</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="keep the faith - an evening with bon jovi (1993)(philips - polygram)(pal)(eu)(disc 1 of 2)[dvc]" sha1="16dd9ae93d2d24456feda0a1419d56f60b0ac490"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="keep the faith - an evening with bon jovi (1993)(philips - polygram)(pal)(eu)(disc 2 of 2)[dvc]" sha1="9f033b463ae2f9ec806d1a36c72ba77a9cde7a9e"/>
</diskarea>
@@ -7139,7 +7156,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kinderdisc met het complete verhaal ijsbeer in de tropen, de (1995)(philips)(nl)[dvc]" sha1="7a2a31f547270710e01e3094d03625ba890c0172"/>
</diskarea>
@@ -7156,7 +7173,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kinderdisc met het complete verhaal ijsbeer in de tropen, de (1995)(philips)(nl)[a][dvc]" sha1="9e4471ca4013e45f07bfe041427c4cb986d2edb5"/>
</diskarea>
@@ -7172,7 +7189,7 @@ license:CC0-1.0
<description>Kiss v1.07 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kiss v1.07 (1994)(philips)(eu)" sha1="48ba268747d67519619d466fd527d40fad210a56"/>
</diskarea>
@@ -7188,7 +7205,7 @@ license:CC0-1.0
<description>Kulturberg Naturtal - Eine Tirolreise auf cd-i (Austria)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kulturberg naturtal - eine tirolreise auf cd-i (1994)(philips)(at)" sha1="e74d5a7da0f81326f3acc3147cbe89c325b0f65e"/>
</diskarea>
@@ -7204,7 +7221,7 @@ license:CC0-1.0
<description>Die Kunstschaetze der Russischen Zaren - St. Petersburg und die sammlungen der eremitage (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kunstschaetze der russischen zaren, die - st. petersburg und die sammlungen der eremitage (1993)(philips)(de)" sha1="1367dd9d00233f13537c9ff5a132a86dfec1bc96"/>
</diskarea>
@@ -7220,7 +7237,7 @@ license:CC0-1.0
<description>De Kunstschatten Van Rusluand - St. Petersburg en de Collectie van de Hermitage (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kunstschatten van rusluand, de - st. petersburg en de collectie van de hermitage (1993)(philips)(nl)" sha1="bb8e9d9606f1c272eddfcef54bdf3fc75efa4a07"/>
</diskarea>
@@ -7236,7 +7253,7 @@ license:CC0-1.0
<description>Kursbuch Gesundheit (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kursbuch gesundheit (1995)(philips)(de)" sha1="bf2e8dde7602559ece95f87a3e98330827356bb1"/>
</diskarea>
@@ -7256,17 +7273,17 @@ license:CC0-1.0
<description>Language Director - Deutsch Level 1 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - deutsch level 1 (1993)(philips)(eu)(disc 1 of 3)" sha1="8a6f1cc00196e39758324137d36c4156d692926c"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - deutsch level 1 (1993)(philips)(eu)(disc 2 of 3)" sha1="e7ee35b2d29222e4eec075255c1085056b411b00"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - deutsch level 1 (1993)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="19464492c78417d1201b55aaaba6ed83eff06708"/>
@@ -7287,17 +7304,17 @@ license:CC0-1.0
<description>Language Director - Deutsch Level 2 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - deutsch level 2 (1993)(philips)(eu)(disc 1 of 3)" sha1="0341e884d6e5cba7afa0133a1453bf5e3f20cca7"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - deutsch level 2 (1993)(philips)(eu)(disc 2 of 3)" sha1="63f01f991db4a946b1a14e41e4ddb394aae648cc"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - deutsch level 2 (1993)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="1d91d00c29b47a71fbc56bd55ce24875affcc8de"/>
@@ -7318,17 +7335,17 @@ license:CC0-1.0
<description>Language Director - Deutsch Level 3 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - deutsch level 3 (1994)(philips)(eu)(disc 1 of 3)" sha1="274ea7916d81978fcc57ba494523ef9955eb1a00"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - deutsch level 3 (1994)(philips)(eu)(disc 2 of 3)" sha1="22bc4808008f2f1ee0bd9ffa4a70582f585f0cff"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - deutsch level 3 (1994)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="9fd222a532b93e0efc7b17c0567f808ff0854e7e"/>
@@ -7349,17 +7366,17 @@ license:CC0-1.0
<description>Language Director - English Level 1 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - english level 1 (1993)(philips)(eu)(disc 1 of 3)" sha1="543d5b9508856ac1f832b0ec731859b7c207fda7"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - english level 1 (1993)(philips)(eu)(disc 2 of 3)" sha1="4bfd08cf7b5d993ce827eb7aa476078a8af62438"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - english level 1 (1993)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="2a7e30728368606b5112595e892fc0710ac9523d"/>
@@ -7380,17 +7397,17 @@ license:CC0-1.0
<description>Language Director - English Level 2 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - english level 2 (1993)(philips)(eu)(disc 1 of 3)" sha1="b395631ccfa630708f7a588a9ef188566e5b1326"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - english level 2 (1993)(philips)(eu)(disc 2 of 3)" sha1="36115946268c91d02b6cfd57916814323bec9654"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - english level 2 (1993)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="f49f517856c3518572f3dc4e04bc39d867a6d999"/>
@@ -7411,17 +7428,17 @@ license:CC0-1.0
<description>Language Director - Espanol Level 1 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - espanol level 1 (1994)(philips)(eu)(disc 1 of 3)" sha1="ab049d7ee29cf7bc03c9e5af311cfadd574a09b8"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - espanol level 1 (1994)(philips)(eu)(disc 2 of 3)" sha1="9cc2bb443ffee453508d3cca17597aab152f8cc2"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - espanol level 1 (1994)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="5d121adc6ab5ba127fd5019b76028e734127c101"/>
@@ -7442,17 +7459,17 @@ license:CC0-1.0
<description>Language Director - Français Level 1 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - francais level 1 (1993)(philips)(eu)(disc 1 of 3)" sha1="8f8aafb61a6ddd99f7178856c7a5507fa5d586c8"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - francais level 1 (1993)(philips)(eu)(disc 2 of 3)" sha1="b5b30cad51c03d9d8250f5e68228e9f32f5bcc0d"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - francais level 1 (1993)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="c41243f2a2232b2844d7e85168d9d33410f16df4"/>
@@ -7473,17 +7490,17 @@ license:CC0-1.0
<description>Language Director - Français Level 2 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - francais level 2 (1993)(philips)(eu)(disc 1 of 3)" sha1="f7f0e08069e6823cc8972aeda9accf1e934bf8af"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - francais level 2 (1993)(philips)(eu)(disc 2 of 3)" sha1="8e99a1ebec9d6bad1000e5b502ecfaa9d70dc974"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - francais level 2 (1993)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="e1f50f6beda8adc53f885f46496caf169ef2ed3e"/>
@@ -7504,17 +7521,17 @@ license:CC0-1.0
<description>Language Director - Français Level 3 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - francais level 3 (1994)(philips)(eu)(disc 1 of 3)" sha1="ec4ab55e7d08abf3e8f853f2d29fe81c16e304a8"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="language director - francais level 3 (1994)(philips)(eu)(disc 2 of 3)" sha1="dbd6dff89ff698f798501032a928f9afa682d04a"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Guided Tour" />
<diskarea name="cdrom">
<disk name="language director - francais level 3 (1994)(philips)(eu)(disc 3 of 3)[guided tour]" sha1="7e3a7b1b204c3b2134681c5f2530336ce0cb73e3"/>
@@ -7532,7 +7549,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="live without monty python (1994)(philips)(eu)[dvc]" sha1="490f2ef4c855c52244ca1b7a73f6d109cc30a10a"/>
</diskarea>
@@ -7549,7 +7566,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="live without monty python (1994)(philips)(us)[dvc]" sha1="886edbcd1aad683d75af581c90bb8256c248c5cf"/>
</diskarea>
@@ -7568,12 +7585,12 @@ license:CC0-1.0
<year>1994</year>
<publisher>Extraware ~ Interlance ~ Meteor Film</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="loving for a lifetime (1994)(extraware - interlance - meteor film)(eu)(disc 1 of 2)[dvc]" sha1="4da406ea80afa34deef0e1149733fb72458df96f"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="loving for a lifetime (1995)(extraware - interlance - meteor film)(eu)(disc 2 of 2)[dvc]" sha1="f808bfb658cbfde53782e1e168c5de957773522e"/>
</diskarea>
@@ -7591,12 +7608,12 @@ license:CC0-1.0
<description>Loving for a Lifetime - Sex, Lust und Leben (Germany)</description>
<year>1994</year>
<publisher>Extraware ~ Interlance ~ Meteor Film</publisher>
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="loving for a lifetime - sex, lust und leben (1994)(extraware - interlance - meteor film)(de)(disc 1 of 2)" sha1="26fa56e09c660144d4a6380fa1aee0fb03f0f527"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="loving for a lifetime - sex, lust und leben (1994)(extraware - interlance - meteor film)(de)(disc 2 of 2)" sha1="1adcff4d50659a341c66d26cf8fefa0a8f068214"/>
</diskarea>
@@ -7612,7 +7629,7 @@ license:CC0-1.0
<description>La Machine à Remonter le Temps (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="machine a remonter le temps, la (1994)(philips)(fr)" sha1="cb8d2453ee88d00670a1ba1758d97e1b6ecd961d"/>
</diskarea>
@@ -7628,7 +7645,7 @@ license:CC0-1.0
<description>I Maestri Olandesi del Seicento (Italy)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="maestri olandesi del seicento, i (1995)(philips)(it)" sha1="1159a86c2d39bd651142b7e62935400feade1edc"/>
</diskarea>
@@ -7644,7 +7661,7 @@ license:CC0-1.0
<description>Malschule 1 (Germany) ~ Escuela de Pintura I (Spain) ~ Schilderschool I (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="malschule 1 (1992)(philips)(de)[escuela de pintura i (es), schilderschool i (nl)]" sha1="7a30c1212e2856c633a4d010d550531fc1b5d79b"/>
</diskarea>
@@ -7660,7 +7677,7 @@ license:CC0-1.0
<description>Die Malstiftfabrik (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="malstiftfabrik, die (1995)(philips)(de)" sha1="49d7a754d7a3f69164e0a84a1446863d8c2c245f"/>
</diskarea>
@@ -7677,7 +7694,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>InterROM</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mathtrak k1 (1994)(interrom)(us)[dvc]" sha1="9834e2391902a26b21cbad632f5cf152e654991a"/>
</diskarea>
@@ -7694,7 +7711,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>InterROM</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mathtrak k2 (1994)(interrom)(us)[dvc]" sha1="d6ea2dbbb619ee611fa538be138d1951d018ae40"/>
</diskarea>
@@ -7710,7 +7727,7 @@ license:CC0-1.0
<description>Max Magic (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="max magic (1994)(philips)(eu)" sha1="f2d7cfa0928aee2cd44c85e0e6b2698ce7f4bcfe"/>
</diskarea>
@@ -7726,7 +7743,7 @@ license:CC0-1.0
<description>Max Magic (Europe, alt)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="max magic (1994)(philips)(eu)[a]" sha1="43c8bc59b9ca5b680041255e20085326cddcf166"/>
</diskarea>
@@ -7742,7 +7759,7 @@ license:CC0-1.0
<description>Max Magic (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="max magic (1994)(philips)(us)" sha1="9146fb159ea2840c48862ad61834f007a378f7a9"/>
</diskarea>
@@ -7758,7 +7775,7 @@ license:CC0-1.0
<description>The Memory Works - For Names and Faces (USA)</description>
<year>1997</year>
<publisher>Compact Disc Incorporated</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="memory works, the - for names and faces (1997)(compact disc incorporated)(us)" sha1="243015544f047fb28a940e298d27c9a17da6dc04"/>
</diskarea>
@@ -7774,7 +7791,7 @@ license:CC0-1.0
<description>Mercer Mayer's Little Monster at School (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mercer mayer's little monster at school (1994)(philips)(eu)" sha1="5b2252a9f808d39d2c24cdf4c53dab8e879a9bf1"/>
</diskarea>
@@ -7790,7 +7807,7 @@ license:CC0-1.0
<description>Mercer Mayer's Little Monster at School (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mercer mayer's little monster at school (1994)(philips)(us)" sha1="7bffecf537b99b4ffde2bad3d01c444ee8670de5"/>
</diskarea>
@@ -7806,7 +7823,7 @@ license:CC0-1.0
<description>La Methode de Langues Multimedia - Je parle l'Allemand (France)</description>
<year>1996</year>
<publisher>Infogrames</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="methode de langues multimedia, la - je parle l'allemand (1996)(infogrames)(fr)" sha1="a9cfae6e23be9f0e445ded885cbb15f99bbcb53b"/>
</diskarea>
@@ -7822,7 +7839,7 @@ license:CC0-1.0
<description>Mondriaan (Netherlands)[CD-i-PC]</description>
<year>1995</year>
<publisher>Zoutewelle Multimedia</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mondriaan (1995)(zoutewelle multimedia)(nl)(en-nl)[cd-i-pc]" sha1="4c3fd1b9230cd9152a98611561ac2ca4e9bb7047"/>
</diskarea>
@@ -7839,7 +7856,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="monty python's invasion from the planet skyron (1995)(philips)(eu)[dvc]" sha1="d0184e1aef31a45b79fe62215570aa475706d2a1"/>
</diskarea>
@@ -7856,7 +7873,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="monty python's more naughty bits (1994)(philips)(eu)(m4)[dvc]" sha1="2e0047ad3e2754167c4ce9058d6e936a821e1447"/>
</diskarea>
@@ -7873,7 +7890,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="monty python's more naughty bits (1995)(daedalus)(us)(m4)[dvc]" sha1="35cead179d6ba852f9f53d38db70af5614e27451"/>
</diskarea>
@@ -7889,7 +7906,7 @@ license:CC0-1.0
<description>Moses - The Exodus (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="moses - the exodus (1992)(philips)(us)" sha1="6fc19ea1daff8ed7da118199563b076df1551e26"/>
</diskarea>
@@ -7905,7 +7922,7 @@ license:CC0-1.0
<description>Mother Goose - Hidden Pictures (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="0152911 01" />
<diskarea name="cdrom">
<disk name="mother goose - hidden pictures (1991)(philips)(us)[0152911 01]" sha1="779d5e20f6d7105321addf45a368587bc0025518"/>
@@ -7922,7 +7939,7 @@ license:CC0-1.0
<description>Mother Goose - Hidden Pictures (USA, alt)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900152 50228 843 03" />
<diskarea name="cdrom">
<disk name="mother goose - hidden pictures (1991)(philips)(us)[3106900152 50228 843 03]" sha1="172e5b31c74f93cd210442323462705ca7a88c51"/>
@@ -7939,7 +7956,7 @@ license:CC0-1.0
<description>Mother Goose - Rhymes to Color (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900162 50228 839 01" />
<diskarea name="cdrom">
<disk name="mother goose - rhymes to color (1991)(philips)(us)[3106900162 50228 839 01]" sha1="646cc3fd29800a541123f521fd1de9c1df5deaa0"/>
@@ -7956,7 +7973,7 @@ license:CC0-1.0
<description>Mother Goose - Rhymes to Color (USA, alt)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="MGRTC392 03!" />
<diskarea name="cdrom">
<disk name="mother goose - rhymes to color (1991)(philips)(us)[mgrtc392 03]" sha1="283726728e161712428f3080f51ea0f03bd0412b"/>
@@ -7974,7 +7991,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="muzzy - learn french the fun way (1994)(philips)(eu)[dvc]" sha1="c3df6f64357e8e4798c1813e579115532f4fa623"/>
</diskarea>
@@ -7991,7 +8008,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="muzzy - learn french the fun way (1994)(philips)(us)[dvc]" sha1="d71584ecf08f0b9cbcc3319f37d3a0c27e8684a4"/>
</diskarea>
@@ -8007,7 +8024,7 @@ license:CC0-1.0
<description>Name That Tune (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="name that tune (1993)(philips)(us)" sha1="84183679d5a649303aa3103c1d60d41d82476d1b"/>
</diskarea>
@@ -8024,7 +8041,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nederlands elftal compleet - alles over de europese kampioenschappen (1996)(philips)(nl)[dvc]" sha1="702934457d67cc356044e4aa835a77217eb82d14"/>
</diskarea>
@@ -8041,7 +8058,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nederlands film festival '95 - 15 jaar gouden kalf (1995)(philips)(nl)[dvc]" sha1="1bbf2dcf1dc7fd4399bddbc643aa535f55c15f59"/>
</diskarea>
@@ -8057,7 +8074,7 @@ license:CC0-1.0
<description>NFL 100 Greatest Touchdowns (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nfl 100 greatest touchdowns (1996)(philips)(eu)" sha1="af374e8c3d721d3393a708d718237c179023011b"/>
</diskarea>
@@ -8073,7 +8090,7 @@ license:CC0-1.0
<description>NFL 100 Greatest Touchdowns (USA)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nfl 100 greatest touchdowns (1996)(philips)(us)" sha1="1e288c0e0de631a62d3a1e5e92eba9d0c1a046ec"/>
</diskarea>
@@ -8089,7 +8106,7 @@ license:CC0-1.0
<description>Die Niederlaendischen Meister - Des 17. Jahrhunderts (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="niederlaendischen meister, die - des 17. jahrhunderts (1993)(philips)(de)" sha1="9081b096ed1c075453c2de62766ed698a149e031"/>
</diskarea>
@@ -8105,7 +8122,7 @@ license:CC0-1.0
<description>Noah's Ark (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="noah's ark (1992)(philips)(us)" sha1="f898cb8c2a702bc1cf84828d7e34753d8d5bde37"/>
</diskarea>
@@ -8121,7 +8138,7 @@ license:CC0-1.0
<description>Number Factory (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="number factory (1995)(philips)(eu)" sha1="c99f2ce03c1781201a2ea6201369a5fcad7e244c"/>
</diskarea>
@@ -8137,7 +8154,7 @@ license:CC0-1.0
<description>Odyssey - The Journey to Your Future (USA)</description>
<year>1997</year>
<publisher>Educational Management Group</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="odyssey - the journey to your future (1997)(educational management group)(us)" sha1="a7cfe992a72ba06ebf2ccf7629762103a8ec9b62"/>
</diskarea>
@@ -8154,7 +8171,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ontdek het onbekende nederland - nederland-waterland v1.0 (1995)(philips)(nl)[dvc]" sha1="7f1f443710b1cd57928ea42229578e284794355a"/>
</diskarea>
@@ -8183,7 +8200,7 @@ license:CC0-1.0
<description>Opera Imaginaire (Europe)</description>
<year>1995</year>
<publisher>Pascavision</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="opera imaginaire (1995)(pascavision)(eu)" sha1="5526f7be339ded40867fa9748f91255b7a2f4fd0"/>
</diskarea>
@@ -8199,7 +8216,7 @@ license:CC0-1.0
<description>Origami (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="origami (1993)(philips)(eu)" sha1="4c3fa6d45ed4b069a0f743f0a0c20233b1033efc"/>
</diskarea>
@@ -8215,7 +8232,7 @@ license:CC0-1.0
<description>P.A.W.S. - Personal Automated Wagging System (Europe)</description>
<year>1998</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="p.a.w.s. - personal automated wagging system (1998)(philips)(eu)" sha1="bdc0f3eaa6011b6261589eb7d21a6a8fff74904b"/>
</diskarea>
@@ -8231,7 +8248,7 @@ license:CC0-1.0
<description>Paint School I v1.0 (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="paint school i v1.0 (1991)(philips)(us)" sha1="dbc598c61f90c72a9a44e54fa372706c468969c2"/>
</diskarea>
@@ -8247,7 +8264,7 @@ license:CC0-1.0
<description>Paint School II v1.0 (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="paint school ii v1.0 (1991)(philips)(us)" sha1="370b4c39396bcb70d0085ed56b8874d0602d7a66"/>
</diskarea>
@@ -8263,7 +8280,7 @@ license:CC0-1.0
<description>Pathways - Interactive Reading for 4-7 Year Old's (Europe)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pathways - interactive reading for 4-7 year old's (1996)(philips)(eu)" sha1="4a52ee2a805ca1da79e02ef52dfa75a648a9943d"/>
</diskarea>
@@ -8279,7 +8296,7 @@ license:CC0-1.0
<description>Pecos Bill (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pecos bill (1992)(philips)(us)" sha1="92a2a8616c1617ac6dbe43e7be7c793814f54f7f"/>
</diskarea>
@@ -8295,7 +8312,7 @@ license:CC0-1.0
<description>Pegasus (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pegasus (1992)(philips)(eu-us)" sha1="443709b95fdd1d06f9c18d504b14713d5b0e6d21"/>
</diskarea>
@@ -8312,7 +8329,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="philips demo cd (1995)(philips)(nl)[dvc]" sha1="59b7fe28e3ba0bbee2266a1088296310de54da26"/>
</diskarea>
@@ -8328,7 +8345,7 @@ license:CC0-1.0
<description>Philips Hondred - 1891 1991 (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="philips hondred - 1891 1991 (1992)(philips)(nl)(en-nl)" sha1="36c65700eb086f256e8b7af643abba03ca16cedc"/>
</diskarea>
@@ -8346,7 +8363,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="philips media interactieve encyclopedie (1995)(philips)(nl)[aka standaard interactieve encyclopedie][dvc]" sha1="28bb605dc2ebfaacd978b3939b3dd02c00830f87"/>
</diskarea>
@@ -8363,7 +8380,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="philips media interactieve encyclopedie - demonstratie - exemplaar (1995)(philips)(nl)[dvc]" sha1="ec911541e153d06f6f8b64b6c92cb3eed17e05d7"/>
</diskarea>
@@ -8380,7 +8397,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="philips media medische encyclopedie (1996)(philips)(nl)[dvc]" sha1="015e23599f7c83dcec262d49f269cecca5657c17"/>
</diskarea>
@@ -8396,7 +8413,7 @@ license:CC0-1.0
<description>Photo CD Demo Disc v3.0 (Europe)[1993-03]</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="photo cd demo disc v3.0 (1993)(philips)(eu)[1993-03]" sha1="bd46faaebe1725eb345de81dd912187b74b4dea8"/>
</diskarea>
@@ -8412,7 +8429,7 @@ license:CC0-1.0
<description>Photo CD Demo Disc v3.2 (Europe)[1995-11]</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="photo cd demo disc v3.2 (1995)(philips)(eu)[1995-11]" sha1="d32fb0741e06f247c6f2b7e49c66ea284a0d5caf"/>
</diskarea>
@@ -8429,7 +8446,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="playboy - i segreti del massaggio (1994)(philips)(it)[dvc]" sha1="afdf56042dac1a943c403902f7c4c0729da842b4"/>
</diskarea>
@@ -8446,7 +8463,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="playboy's complete massage (1993)(philips)(us)[dvc]" sha1="e4b64d8aba8244e43664330ef00b711ada3a1c2f"/>
</diskarea>
@@ -8462,7 +8479,7 @@ license:CC0-1.0
<description>The Pleasure of Sex - The Interactive Encyclopedia of Sex (USA)</description>
<year>1995</year>
<publisher>Telstar Electronic Studios</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pleasure of sex, the - the interactive encyclopedia of sex (1995)(telstar electronic studios)(us)" sha1="0ddcd431e70d844f80c6da4087d5e04f555ef1cf"/>
</diskarea>
@@ -8478,7 +8495,7 @@ license:CC0-1.0
<description>Portrait of a City - Venice (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="portrait of a city - venice (1992)(philips)(eu)" sha1="f0029915e27e12b2c0994ccf36246ece0093a74e"/>
</diskarea>
@@ -8494,7 +8511,7 @@ license:CC0-1.0
<description>Ritratto di Città - Venezia (Italy)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ritratto di citta - venezia (1993)(philips)(it)" sha1="ac1a4d19b36fef9bf7d613f8d9688feff4e0af54"/>
</diskarea>
@@ -8510,7 +8527,7 @@ license:CC0-1.0
<description>Private Lesson Series - Classical Guitar - A Beginner's Guide (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="private lesson series - classical guitar - a beginner's guide (1992)(philips)(eu-us)" sha1="4dcf9f92868f740febec03f9a6f1b158c6862b9f"/>
</diskarea>
@@ -8526,7 +8543,7 @@ license:CC0-1.0
<description>Private Lesson Series - Jazz Guitar (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="private lesson series - jazz guitar (1992)(philips)(us)" sha1="42c0f1adfe22924faa99ae509b1c57a07457709c"/>
</diskarea>
@@ -8542,7 +8559,7 @@ license:CC0-1.0
<description>Private Lesson Series - Rock Guitar - A Beginner's Guide (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="private lesson series - rock guitar - a beginner's guide (1992)(philips)(eu)" sha1="f3042444888b5b12bb8d881cba4b3c347b137dfd"/>
</diskarea>
@@ -8558,7 +8575,7 @@ license:CC0-1.0
<description>Private Lesson Series - Rock Guitar - A Beginner's Guide (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="private lesson series - rock guitar - a beginner's guide (1992)(philips)(us)" sha1="843ae6b50efc49b363d61e782059374a0cd1ca8c"/>
</diskarea>
@@ -8575,7 +8592,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Compact Disc Incorporated</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pyramid adventures - episode 1 - treasures of the lost pyramid (1995)(compact disc incorporated)(us)[dvc]" sha1="462c7461fe3366f97da87407d140d17107ab5f12"/>
</diskarea>
@@ -8628,12 +8645,12 @@ license:CC0-1.0
<year>1994</year>
<publisher>Queen Films</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="queen - greatest flix i &amp; ii (1994)(queen films)(eu)(disc 1 of 2)[dvc]" sha1="9b6408fcbffcdc55b9bb3023f2b5f8b94703d769"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="queen - greatest flix i &amp; ii (1994)(queen films)(eu)(disc 2 of 2)[dvc]" sha1="60f37293d1479bd4293e4e9b61f23884dc732ad3"/>
</diskarea>
@@ -8650,7 +8667,7 @@ license:CC0-1.0
<description>Quel est donc cet Oiseau - Nature on CDI (France) ~ What's that Bird (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="quel est donc cet oiseau - nature on cdi (1992)(philips)(fr)" sha1="f925f9b6ad061472e45015dd9b4f652b00935626"/>
</diskarea>
@@ -8666,7 +8683,7 @@ license:CC0-1.0
<description>Rand McNally's America - United States Atlas (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="01420320 03" />
<diskarea name="cdrom">
<disk name="rand mcnally's america - united states atlas (1991)(philips)(us)[01420320 03]" sha1="e6eeef531442470ab7d481f9bc7910e56607e08b"/>
@@ -8683,7 +8700,7 @@ license:CC0-1.0
<description>Rand McNally's America - United States Atlas (USA, alt)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900142 50239 896 01" />
<diskarea name="cdrom">
<disk name="rand mcnally's america - united states atlas (1991)(philips)(us)[3106900142 50239 896 01]" sha1="1a6232b12dfbabf722bf65ebad79ddb7033bf02d"/>
@@ -8700,7 +8717,7 @@ license:CC0-1.0
<description>Reihe Privatunterricht - Die Klassische Gitarre (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="reihe privatunterricht - die klassische gitarre (1992)(philips)(de)" sha1="126c70115df8c48de37aa103cb0a40ea2cafbfa3"/>
</diskarea>
@@ -8716,7 +8733,7 @@ license:CC0-1.0
<description>Reihe Privatunterricht - Rockgitarre (Germany)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="reihe privatunterricht - rockgitarre (1994)(philips)(de)" sha1="31d2bea1de9a82677dbd855953d0399798f44f42"/>
</diskarea>
@@ -8732,7 +8749,7 @@ license:CC0-1.0
<description>The Renaissance Gallery (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="0362911 01" />
<diskarea name="cdrom">
<disk name="renaissance gallery, the (1991)(philips)(us)[0362911 01]" sha1="6d4e4fb8065b7d2ca7449a130deacf2e9b59b644"/>
@@ -8749,7 +8766,7 @@ license:CC0-1.0
<description>The Renaissance Gallery (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690 0442 50260 353 01" />
<diskarea name="cdrom">
<disk name="renaissance gallery, the (1992)(philips)(us)[310690 0442 50260 353 01]" sha1="e5faa80fba864da1ce7c1513f6a489dcfd2e79b3"/>
@@ -8766,7 +8783,7 @@ license:CC0-1.0
<description>The Renaissance of Florence (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="0442397 01, 0442397 02" />
<diskarea name="cdrom">
<disk name="renaissance of florence, the (1991)(philips)(us)[0442397 01, 0442397 02]" sha1="44c3c3dac949a3750ef90c496ea6528effdfe015"/>
@@ -8783,7 +8800,7 @@ license:CC0-1.0
<description>The Renaissance of Florence (USA, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690036-2 50239 145 01" />
<diskarea name="cdrom">
<disk name="renaissance of florence, the (1992)(philips)(us)[310690036-2 50239 145 01]" sha1="dc3eb49b3107333da965046771eada67fe6dba15"/>
@@ -8800,7 +8817,7 @@ license:CC0-1.0
<description>El Renacimiento de Florencia (Spain)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="renacimiento de florencia, el (1992)(philips)(es)" sha1="b4e3927086cd461ad80b5fdf57fba5132f32e8e9"/>
</diskarea>
@@ -8816,7 +8833,7 @@ license:CC0-1.0
<description>El Renacimiento de Florencia (Compilation Cultura) (Spain)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="renacimiento de florencia, el (1992)(philips)(es)[compilation cultura]" sha1="451cc21d8b3968194677e66cfb17a2c6957ba036"/>
</diskarea>
@@ -8832,7 +8849,7 @@ license:CC0-1.0
<description>Le Renaissance à Florence (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="renaissance a florence, la (1992)(philips)(fr)" sha1="c7a20aae2456a97a0274bdc74cecc181f4dd5bae"/>
</diskarea>
@@ -8848,7 +8865,7 @@ license:CC0-1.0
<description>Die Renaissance in Florenz (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="renaissance in florenz, die (1992)(philips)(de)" sha1="766bd740a442ad7ac9d9d1e5658d2abddadecce3"/>
</diskarea>
@@ -8864,7 +8881,7 @@ license:CC0-1.0
<description>Il Rinascimento a Firenze (Italy)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="rinascimento a firenze, il (1992)(philips)(it)" sha1="72704aeb13fd9398b4f29012da2c617c7df892fb"/>
</diskarea>
@@ -8880,7 +8897,7 @@ license:CC0-1.0
<description>De Renaissance van Florence (Netherlands)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="renaissance van florence, de (1991)(philips)(nl)" sha1="2f6008ceac1df9a7a751b7f4b7cbe6ba5b826822"/>
</diskarea>
@@ -8896,7 +8913,7 @@ license:CC0-1.0
<description>Rhythm Maker (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="17220326 01" />
<diskarea name="cdrom">
<disk name="rhythm maker (1993)(philips)(us)[17220326 01]" sha1="5b35856739b2d85fa24fd5a0ced711b6087de886"/>
@@ -8913,7 +8930,7 @@ license:CC0-1.0
<description>Rhythm Maker (USA, alt)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="17220409 02" />
<diskarea name="cdrom">
<disk name="rhythm maker (1993)(philips)(us)[17220409 02]" sha1="321b63f29c7e8eb71adf6a37205eeda7a3180029"/>
@@ -8930,7 +8947,7 @@ license:CC0-1.0
<description>Richard Scarry's Allerbeste Buurt Disc! (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="richard scarry's allerbeste buurt disc (1992)(philips)(nl)" sha1="5c5ce51cac105286090897a16f26f818369f7506"/>
</diskarea>
@@ -8946,7 +8963,7 @@ license:CC0-1.0
<description>Richard Scarry's Allerdrukste Buurt Disc! (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="richard scarry's allerdrukste buurt disc (1992)(philips)(nl)" sha1="25a2b872c5de744f2dc932b6ec6cd8004bd7589a"/>
</diskarea>
@@ -8962,7 +8979,7 @@ license:CC0-1.0
<description>Richard Scarry's Allerwitzigste Geschichten aus Schaffenau (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="richard scarry's allerwitzigste geschichten aus schaffenau (1992)(philips)(de)" sha1="f9d3f9cd0c2551a4dd97185fd7977b3035d4c553"/>
</diskarea>
@@ -8978,7 +8995,7 @@ license:CC0-1.0
<description>Richard Scarry's Best Neighborhood Disc Ever! (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="richard scarry's best neighborhood disc ever (1992)(philips)(us)" sha1="f4af755915242aade356ee3673f23d211753f160"/>
</diskarea>
@@ -8994,7 +9011,7 @@ license:CC0-1.0
<description>Richard Scarry's Busiest Neighborhood Disc Ever! (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="0382911 01" />
<diskarea name="cdrom">
<disk name="richard scarry's busiest neighborhood disc ever (1991)(philips)(us)[0382911 01]" sha1="88df1839736343d84431a6d907a9e4f2d14808ee"/>
@@ -9011,7 +9028,7 @@ license:CC0-1.0
<description>Richard Scarry's Busiest Neighborhood Disc Ever! (USA, alt 1)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="03820201 01" />
<diskarea name="cdrom">
<disk name="richard scarry's busiest neighborhood disc ever (1992)(philips)(us)[03820201 01]" sha1="1ff04341f934316d26aa3f6e10f4e5dcfd2d3b72"/>
@@ -9028,7 +9045,7 @@ license:CC0-1.0
<description>Richard Scarry's Busiest Neighborhood Disc Ever! (USA, alt 2)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900382 50257 831 01" />
<diskarea name="cdrom">
<disk name="richard scarry's busiest neighborhood disc ever (1992)(philips)(us)[3106900382 50257 831 01]" sha1="2ee6cec5c95319d8b6da2bc79e4898db3f6e1665"/>
@@ -9045,7 +9062,7 @@ license:CC0-1.0
<description>Richard Scarry's Wunderbarste Geschichten aus Schaffenau (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="richard scarry's wunderbarste geschichten aus schaffenau (1992)(philips)(de)" sha1="0fb213da1e29e69ec9aaa2cb77a66287ef31f934"/>
</diskarea>
@@ -9061,7 +9078,7 @@ license:CC0-1.0
<description>The Riches of Coins (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="riches of coins, the (1992)(philips)(us)" sha1="ed2c819ebc7a03b08b67c6b658ce08948e8a262e"/>
</diskarea>
@@ -9080,12 +9097,12 @@ license:CC0-1.0
<year>19??</year>
<publisher>Philips ~ PolyGram</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="rio '88 - tina turner (1988)(philips - polygram)(pal)(eu)(disc 1 of 2)[dvc]" sha1="e054c54935db3c87213a47cae20ef123c1190334"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="rio '88 - tina turner (1988)(philips - polygram)(pal)(eu)(disc 2 of 2)[dvc]" sha1="358f0cbd295da6a69eb3f099bdeb76f057159f52"/>
</diskarea>
@@ -9101,7 +9118,7 @@ license:CC0-1.0
<description>Rock - Metoode de Guitare avec Paul Personne (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="rock - metoode de guitare avec paul personne (1994)(philips)(fr)" sha1="337925dad65a96a56628bd7c0b72652f0a2a5d83"/>
</diskarea>
@@ -9117,7 +9134,7 @@ license:CC0-1.0
<description>Routes to Reading (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="routes to reading (1995)(philips)(eu)" sha1="54f95e52f2480c250565bd796b08a4d4ec4efa19"/>
</diskarea>
@@ -9133,7 +9150,7 @@ license:CC0-1.0
<description>The Rules of Golf (Netherlands)</description>
<year>1991</year>
<publisher>Telecity CD-I</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="rules of golf, the (1991)(telecity cd-i)(nl)" sha1="0f83ba820e74755350bc908f540538751099569d"/>
</diskarea>
@@ -9149,7 +9166,7 @@ license:CC0-1.0
<description>Sailing (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sailing (1993)(philips)(us)" sha1="9dff9f9ede8b21420600d41f324f78354e098cc0"/>
</diskarea>
@@ -9165,7 +9182,7 @@ license:CC0-1.0
<description>Salvat Enciclopedia Interactiva (Spain)</description>
<year>1996</year>
<publisher>Salvat Multimedia</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="salvat enciclopedia interactiva (1996)(salvat multimedia)(es)" sha1="42e92fcd7357e76f50a33c34227fea41421f545b"/>
</diskarea>
@@ -9181,7 +9198,7 @@ license:CC0-1.0
<description>Sandy's Circus Adventure (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sandy's circus adventure (1991)(philips)(us)" sha1="8b6d1670a86d69cd212b9182e3f48265810c4534"/>
</diskarea>
@@ -9197,7 +9214,7 @@ license:CC0-1.0
<description>Les Aventures de Sandy au Cirque (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aventures de sandy au cirque, les (1993)(philips)(fr)" sha1="160d13ba15a042bedfdd6e3543aa1b1cd7697583"/>
</diskarea>
@@ -9213,7 +9230,7 @@ license:CC0-1.0
<description>Sandy's Circus Avontuur (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="814 0008 50260 053 01" />
<diskarea name="cdrom">
<disk name="sandy's circus avontuur (1992)(philips)(nl)[814 0008 50260 053 01]" sha1="0f4731199e992fb095a9ba1d94f60d0821c52591"/>
@@ -9230,7 +9247,7 @@ license:CC0-1.0
<description>Sandy's Circus Avontuur (Netherlands, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8140008 50260 053 02" />
<diskarea name="cdrom">
<disk name="sandy's circus avontuur (1992)(philips)(nl)[8140008 50260 053 02]" sha1="60f6b1a3a99a1539681f0e807fcbe9e027ffa391"/>
@@ -9247,7 +9264,7 @@ license:CC0-1.0
<description>Sandy's Zirkus Abenteuer (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sandy's zirkus abenteuer (1992)(philips)(de)" sha1="e36bbb28df860dbc8e19b35fbc1f85261ce9ba09"/>
</diskarea>
@@ -9264,7 +9281,7 @@ license:CC0-1.0
<description>Santa Claus' Mice (Europe)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="santa claus' mice (1992)(philips)(eu)(en-fr)[les souris du pere noel]" sha1="09b13d1ed5fc9e937e3ea6fc5dea34cc28e3a019"/>
</diskarea>
@@ -9280,7 +9297,7 @@ license:CC0-1.0
<description>Die Schonsten Hotels der Welt - von Burba Holiday (Germany)[Photo CD]</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="schonsten hotels der welt, die - von burba holiday (1992)(philips)(de)[photo cd]" sha1="f233fa4abf5b60a363f1e664a3f5688193e05a78"/>
</diskarea>
@@ -9297,7 +9314,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100236V103 50461390 01" />
<diskarea name="cdrom">
<disk name="sciamo con alberto tomba - let's go skiing with alberto tomba (1994)(philips)(eu)(en-it)[dvc][8100236v103 50461390 01]" sha1="118887eebba2ed2e14b910ae14e0403d86cdbe58"/>
@@ -9315,7 +9332,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="991953100049 1445-A" />
<diskarea name="cdrom">
<disk name="sciamo con alberto tomba - let's go skiing with alberto tomba (1994)(philips)(eu)(en-it)[dvc][991953100049 1445-a]" sha1="5c55eb5987e506dff0870364daa35cb37d4705ca"/>
@@ -9333,7 +9350,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shari lewis - lamb chop's play-along - action songs (1993)(philips)(us)[dvc]" sha1="8c49529d1f41ced2ca444d198b5da02a268409a1"/>
</diskarea>
@@ -9349,7 +9366,7 @@ license:CC0-1.0
<description>Shark Alert (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shark alert (1993)(philips)(us)" sha1="caf667c63488c01de9ad34d11e70b311f3185127"/>
</diskarea>
@@ -9365,7 +9382,7 @@ license:CC0-1.0
<description>Shipwreck v3.03 (Europe)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shipwreck v3.03 (1993)(philips)(eu)" sha1="8df5f291ae306159b204ae4eadc95c89e18fa50d"/>
</diskarea>
@@ -9381,7 +9398,7 @@ license:CC0-1.0
<description>Shorelines (USA)</description>
<year>1994</year>
<publisher>Educational Management Group</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shorelines (1994)(educational management group)(us)" sha1="e35055830308f1eae1495b854bfbe8bdac88d78c"/>
</diskarea>
@@ -9397,7 +9414,7 @@ license:CC0-1.0
<description>Site Seeing in Digitaal Eindhoven (Netherlands)</description>
<year>1997</year>
<publisher>TV-Tokyo</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="site seeing in digitaal eindhoven (1997)(tv-tokyo)(nl)" sha1="cadfbe098d427e921b25b6c29b9296b7be2379e5"/>
</diskarea>
@@ -9413,7 +9430,7 @@ license:CC0-1.0
<description>Solar System (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="solar system (1995)(philips)(eu)" sha1="1e86c1b1fc2fe3231e88ee3d2e4459d27ba1a4a4"/>
</diskarea>
@@ -9429,7 +9446,7 @@ license:CC0-1.0
<description>Soundtrap v3.04 (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="soundtrap v3.04 (1994)(philips)(eu)" sha1="bd9392d8dd4023945a35203a5634ca239047e713"/>
</diskarea>
@@ -9445,7 +9462,7 @@ license:CC0-1.0
<description>Space Safari (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="space safari (1995)(philips)(eu)" sha1="870a600a1b0fa9033af8482fa48507064ee4a9d0"/>
</diskarea>
@@ -9461,7 +9478,7 @@ license:CC0-1.0
<description>Stamps - Windows on the World (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stamps - windows on the world (1991)(philips)(us)" sha1="7692099bcb43c362dfab49bdbb70f403022208eb"/>
</diskarea>
@@ -9477,7 +9494,7 @@ license:CC0-1.0
<description>Stickybear Family Fun Games (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stickybear family fun games (1995)(philips)(eu)" sha1="212c687b933b8726e1602de563d88726dd28d8e8"/>
</diskarea>
@@ -9493,7 +9510,7 @@ license:CC0-1.0
<description>Stickybear Family Fun Games (USA)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stickybear family fun games (1995)(philips)(us)" sha1="bed6ec58e876dea844711166d2ff57ab006bb7fd"/>
</diskarea>
@@ -9509,7 +9526,7 @@ license:CC0-1.0
<description>Stickybear Math (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stickybear math (1994)(philips)(us)(en-es)" sha1="0d59278f3678c8f7f6ec99b063b463b34639d3a9"/>
</diskarea>
@@ -9525,7 +9542,7 @@ license:CC0-1.0
<description>Stickybear Preschool (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stickybear preschool (1994)(philips)(eu)(en-es)" sha1="23f2fec9ca5932a9366952f8169883e65fe40638"/>
</diskarea>
@@ -9541,7 +9558,7 @@ license:CC0-1.0
<description>Stickybear Reading (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stickybear reading (1993)(philips)(us)(en-es)" sha1="66aca0711c8163d85d967107df96e40efdc0848c"/>
</diskarea>
@@ -9557,7 +9574,7 @@ license:CC0-1.0
<description>Stickybear Leyendo (Spain)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="stickybear leyendo (1994)(philips)(es)(en-es)" sha1="67cad4a1dce46c88456a9dc6bf37d6fb72225e42"/>
</diskarea>
@@ -9574,7 +9591,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sting - ten summoner's tales (1994)(philips)(eu)[dvc]" sha1="d0efcc0dbb8524fdc77410ae7e1c56b0f29bb991"/>
</diskarea>
@@ -9590,7 +9607,7 @@ license:CC0-1.0
<description>Story Machine - Magic Tales v1.0 (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="story machine - magic tales v1.0 (1992)(philips)(us)" sha1="a8451ec16a6d261775d3f449b8a0faee6d40656d"/>
</diskarea>
@@ -9606,7 +9623,7 @@ license:CC0-1.0
<description>Story Machine - Marchenzauber v1.0 (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="story machine - marchenzauber v1.0 (1992)(philips)(de)" sha1="06adb1d9a78323df1b5f89bebee080c9aa9f160e"/>
</diskarea>
@@ -9622,7 +9639,7 @@ license:CC0-1.0
<description>Story Machine - Star Dreams v1.0 (USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="story machine - star dreams v1.0 (1992)(philips)(us)" sha1="a3e897bfb04e066f884a3ee4dab85ac512e6d5e2"/>
</diskarea>
@@ -9638,7 +9655,7 @@ license:CC0-1.0
<description>Story Maschine - Galaxis v1.0 (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="story maschine - galaxis v1.0 (1992)(philips)(de)" sha1="85ad640e408471eb9d40a17dbdf544a58d014d25"/>
</diskarea>
@@ -9654,7 +9671,7 @@ license:CC0-1.0
<description>SuperTEST (Italy)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="supertest (1995)(philips)(it)" sha1="e778e9beeb7f3fbf832edba62e72cf2366d9fb49"/>
</diskarea>
@@ -9670,7 +9687,7 @@ license:CC0-1.0
<description>Surf City (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="surf city (1994)(philips)(eu)" sha1="f3430371cfa423cacf28302f983071a3e1ddfc59"/>
</diskarea>
@@ -9686,7 +9703,7 @@ license:CC0-1.0
<description>Surf City (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="surf city (1994)(philips)(us)" sha1="ca448efc837f9bf0bb880940872015b9d97d9698"/>
</diskarea>
@@ -9702,7 +9719,7 @@ license:CC0-1.0
<description>Tell Me Why One (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tell me why one (1991)(philips)(us)" sha1="87c5a079180e36bb1ae25df581faaed5e1a8e756"/>
</diskarea>
@@ -9718,7 +9735,7 @@ license:CC0-1.0
<description>Tell Me Why Two (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tell me why two (1991)(philips)(us)" sha1="ca1c4d48c206d265d67f9c3c62a7e9db206984a3"/>
</diskarea>
@@ -9739,17 +9756,17 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="tennis our way (1994)(philips)(us)(disc 1 of 3)[dvc]" sha1="3ba4904a1c2dc02032fd5aea2560b25c3f67e08c"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="tennis our way (1994)(philips)(us)(disc 2 of 3)[dvc]" sha1="dff4032d33c2e7823e4a7152cc280d76195c3877"/>
</diskarea>
</part>
- <part name="cdrom3" interface="cdi_cdrom">
+ <part name="cdrom3" interface="cdrom">
<diskarea name="cdrom">
<disk name="tennis our way (1994)(philips)(us)(disc 3 of 3)[dvc]" sha1="eb36cdc653e5ccad9f5a00c7f6dcd23c1e5ed329"/>
</diskarea>
@@ -9766,7 +9783,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="thumbelina (1995)(philips)(eu)[dvc]" sha1="f7781c83976fac5e736eaf455053d584293f228d"/>
</diskarea>
@@ -9782,7 +9799,7 @@ license:CC0-1.0
<description>Tim &amp; Baer - Beim Film (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; baer - beim film (1995)(philips)(de)" sha1="0c5bb997411a33351cf675b96e9063c2ac97cf26"/>
</diskarea>
@@ -9798,7 +9815,7 @@ license:CC0-1.0
<description>Tim &amp; Baer auf dem Flughafen (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; baer auf dem flughafen (1995)(philips)(de)" sha1="27ad7513d0fe79e2baedca150fe1da5cd1091e52"/>
</diskarea>
@@ -9814,7 +9831,7 @@ license:CC0-1.0
<description>Tim &amp; Baer im Hafen (Germany)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; baer im hafen (1995)(philips)(de)" sha1="bcee4cef4264d089a3cad0b6e4cac329f046c4ca"/>
</diskarea>
@@ -9830,7 +9847,7 @@ license:CC0-1.0
<description>Tim &amp; Baer im Krankenhaus (Germany)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; baer im krankenhaus (1994)(philips)(de)" sha1="914dce83c1e7d13e0d33266739aa19c4206dfe14"/>
</diskarea>
@@ -9846,7 +9863,7 @@ license:CC0-1.0
<description>Tim &amp; Bear at the Airport (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; bear at the airport (1995)(philips)(eu)" sha1="6f14c675a6d9c1cc52bfdce285c546a9f1aac97d"/>
</diskarea>
@@ -9862,7 +9879,7 @@ license:CC0-1.0
<description>Tim &amp; Bear at the Movies (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; bear at the movies (1995)(philips)(eu)" sha1="ce3e8dfc2b3e247fd7071fea27813e87693cad68"/>
</diskarea>
@@ -9878,7 +9895,7 @@ license:CC0-1.0
<description>Tim &amp; Beer in de Haven (Netherlands)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; beer in de haven (1995)(philips)(nl)" sha1="fcd6e3455982383327d866641b4df6f759eee515"/>
</diskarea>
@@ -9894,7 +9911,7 @@ license:CC0-1.0
<description>Tim &amp; Beer in het Ziekenhuis (Netherlands)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim &amp; beer in het ziekenhuis (1994)(philips)(nl)" sha1="baa84f51ad490e6aa154611522336b1d9ff9a885"/>
</diskarea>
@@ -9910,7 +9927,7 @@ license:CC0-1.0
<description>Tim et Ted a l'Aeroport (France)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim et ted a l'aeroport (1995)(philips)(fr)" sha1="db7d064e0db2720ab3c89d649af6b8f71de75cd6"/>
</diskarea>
@@ -9926,7 +9943,7 @@ license:CC0-1.0
<description>Tim et Ted au Cinema (France)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tim et ted au cinema (1995)(philips)(fr)" sha1="7c0734a90e3f809fc7872e04e58990f5ef403721"/>
</diskarea>
@@ -9942,7 +9959,7 @@ license:CC0-1.0
<description>Time-Life - 35mm Photography (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="310690017-2 50240 104 01" />
<diskarea name="cdrom">
<disk name="time-life - 35mm photography (1991)(philips)(us)[310690017-2 50240 104 01]" sha1="37f6893beae2fcb0d11dd4e860f135c90bb05251"/>
@@ -9959,7 +9976,7 @@ license:CC0-1.0
<description>Time-Life - 35mm Photography (USA, alt)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="3106900642 01" />
<diskarea name="cdrom">
<disk name="time-life - 35mm photography (1991)(philips)(us)[3106900642 01]" sha1="39223320b3792b71f4aacea032da12a23d405ec6"/>
@@ -9976,7 +9993,7 @@ license:CC0-1.0
<description>Time-Life - Astrology (Europe, USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="time-life - astrology (1993)(philips)(eu-us)" sha1="370215359ab175680447701e25cbc55d90e071aa"/>
</diskarea>
@@ -9992,7 +10009,7 @@ license:CC0-1.0
<description>Time-Life - Kleinbeeld Fotografie (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="time-life - kleinbeeld fotografie (1992)(philips)(nl)" sha1="25b610d1010f957696f16b684a2febee50540827"/>
</diskarea>
@@ -10008,7 +10025,7 @@ license:CC0-1.0
<description>Time-Life - Kleinbildfotografie (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="time-life - kleinbildfotografie (1992)(philips)(de)" sha1="6349b2484dc2b4cd1b028942199a216114f793fc"/>
</diskarea>
@@ -10024,7 +10041,7 @@ license:CC0-1.0
<description>Time-Life - La Fotografia In 35 mm (Italy)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="time-life - la fotografia in 35 mm (1992)(philips)(it)" sha1="f346376c098a6414560f43bef8b2337a1d7388d1"/>
</diskarea>
@@ -10040,7 +10057,7 @@ license:CC0-1.0
<description>Time-Life - La Photographie - 24 x 36 mm (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="time-life - la photographie - 24 x 36 mm (1992)(philips)(fr)" sha1="87b7058905c4e9f54a7e6e72eaa9194a309472f9"/>
</diskarea>
@@ -10057,7 +10074,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="titanic - an interactive exploration (1994)(philips)(us)[dvc enhanced]" sha1="fbc111866cc40cd465b7a42f958f5199302b324c"/>
</diskarea>
@@ -10073,7 +10090,7 @@ license:CC0-1.0
<description>Tom der Maximagier (Germany)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tom der maximagier (1993)(philips)(de)" sha1="7bd4dd45f2f07f80e1b38870669a17791b718c0f"/>
</diskarea>
@@ -10089,7 +10106,7 @@ license:CC0-1.0
<description>Tom le Maximagier v1.0 (France)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8120021 50262 231 03" />
<diskarea name="cdrom">
<disk name="tom le maximagier v1.0 (1992)(philips)(fr)(m3)[8120021 50262 231 03]" sha1="868abb5aa095d6591277a5918e09ebaf045008ff"/>
@@ -10106,7 +10123,7 @@ license:CC0-1.0
<description>Tom le Maximagier v1.0 (France, alt)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8120021V203 50262231 05" />
<diskarea name="cdrom">
<disk name="tom le maximagier v1.0 (1992)(philips)(fr)(m3)[8120021v203 50262231 05]" sha1="645b94e590294e8b235a15fb2c3e3eca442b40ca"/>
@@ -10124,7 +10141,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="total euro 96 (1996)(philips)(eu)[dvc]" sha1="69315a50c9e20c4898a29b26b18cadaacc02c98c"/>
</diskarea>
@@ -10140,7 +10157,7 @@ license:CC0-1.0
<description>TR-I - No World Order (USA)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="26720805 01" />
<diskarea name="cdrom">
<disk name="tr-i - no world order (1993)(philips)(us)[26720805 01]" sha1="f9f8231e7ebb24c2c93c8bd2c909bade07e25caf"/>
@@ -10157,7 +10174,7 @@ license:CC0-1.0
<description>TR-I - No World Order (USA, alt)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="6902672 50378963 01" />
<diskarea name="cdrom">
<disk name="tr-i - no world order (1993)(philips)(us)[6902672 50378963 01]" sha1="d1649ecfd8058f20414631968ba077bbf4386cdf"/>
@@ -10174,7 +10191,7 @@ license:CC0-1.0
<description>Treasures of the Smithsonian (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="treasures of the smithsonian (1991)(philips)(us)" sha1="6f4a6e248e408620c57ac94c3afb1653960f9ef6"/>
</diskarea>
@@ -10190,7 +10207,7 @@ license:CC0-1.0
<description>Le Tresor de l'Ile aux Jeux (France)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tresor de l'ile aux jeux, le (1996)(philips)(fr)" sha1="eedefd8295fb406a613b1ac99883ab6535fc6d58"/>
</diskarea>
@@ -10207,7 +10224,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="uefa champions league (1995)(philips)(de)[season 1995-96][dvc]" sha1="fc44f5f660a5a18c4da0aaf068123a90aa0e1a38"/>
</diskarea>
@@ -10224,7 +10241,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="uefa champions league (1995)(philips)(nl)[season 1995-96][dvc]" sha1="715b50093d1530eed23cb50246fed6c3633ee80d"/>
</diskarea>
@@ -10240,7 +10257,7 @@ license:CC0-1.0
<description>The Uptown Blues (USA)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="uptown blues, the (1994)(philips)(us)" sha1="0e0de3a2bb460367bdd4f0433b4516a3ea9b374a"/>
</diskarea>
@@ -10257,7 +10274,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100101V104 50404061 01" />
<diskarea name="cdrom">
<disk name="usa '94 - world cup (1994)(philips)(eu)(m3)[de-fr-nl][dvc enhanced][8100101v104 50404061 01]" sha1="fc40fd4e77f88fc4297a08ca0f6decb567d50f7f"/>
@@ -10275,7 +10292,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100103V105 50404055 01" />
<diskarea name="cdrom">
<disk name="usa '94 - world cup (1994)(philips)(eu)(m3)[a][en-es-it][dvc enhanced][8100103v105 50404055 01]" sha1="a18e2308a98049c50deeb05ba42550a08b85e6b2"/>
@@ -10293,7 +10310,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="8100103V105 50404055 01" />
<diskarea name="cdrom">
<disk name="usa '94 - world cup (1994)(philips)(eu)(m3)[en-es-it][dvc enhanced][8100103v105 50404055 01]" sha1="ecf3c13399d8f5a9bb89094c48e8ce138841fbd7"/>
@@ -10310,13 +10327,44 @@ license:CC0-1.0
<description>L'Usine aux Crayons (France)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="usine aux crayons, l' (1995)(philips)(fr)" sha1="6f913eaccf796ede8a1f5f0acc0028cceb01f970"/>
</diskarea>
</part>
</software>
+ <software name="valdisc" supported="partial">
+ <!--
+ Origin: Redump
+ http://redump.org/disc/88153/
+ http://redump.org/disc/88154/
+ -->
+ <description>Validation Disc (Version 1.0)</description>
+ <!-- '89 for disc 1, '90 for disc 2 -->
+ <year>1990</year>
+ <publisher>Philips / Sony</publisher>
+ <notes><![CDATA[
+Disc 1 is Philips and Microwave (video tests), Disc 2 is Sony (sound tests)
+RGB and DYUV scroll tests draws GFX garbage
+https://github.com/mamedev/mame/issues/12852#issuecomment-2600790374
+Exit tests will just hang to cyan screen
+Other stuff in between
+]]></notes>
+ <!-- ring code VALDISC.CD 2899 559 01$, CD front print has sticker overlay -->
+ <part name="cdrom1" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="validation disc (europe) (disc 1)" sha1="22849106cf51975e36366cd6caeeba9bb8cee8aa"/>
+ </diskarea>
+ </part>
+ <!-- serial/ring code TDCD-90011 -->
+ <part name="cdrom2" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="validation disc (japan) (disc 2)" sha1="daeb82a2f563e8a8fda89c8ddc76f4a79644ad34"/>
+ </diskarea>
+ </part>
+ </software>
+
<software name="verhalmv">
<!--
Origin: TOSEC
@@ -10326,7 +10374,7 @@ license:CC0-1.0
<description>Verhalen Toverdoos - Magische Vertellingen v1.0 (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="verhalen toverdoos - magische vertellingen v1.0 (1992)(philips)(nl)" sha1="4692a5c59759e3f494d5371eacdaa4f148ab904b"/>
</diskarea>
@@ -10342,7 +10390,7 @@ license:CC0-1.0
<description>Verhalen Toverdoos - Sterrendromen v1.0 (Netherlands)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="verhalen toverdoos - sterrendromen v1.0 (1992)(philips)(nl)" sha1="f9ad334ca69af7bc8f41c4a66920678e3a982bae"/>
</diskarea>
@@ -10360,7 +10408,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips ~ PolyGram</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="video cd - music sampler (1995)(philips - polygram)(eu)[dvc]" sha1="307eac171685ec019ea1ad802dee7c18b5f3f68a"/>
</diskarea>
@@ -10376,7 +10424,7 @@ license:CC0-1.0
<description>De Vliegende Hollander (Netherlands)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="vliegende hollander, de (1994)(philips)(nl)" sha1="d07dfb095c7b1200ee2c610e6f155da1c09e1929"/>
</diskarea>
@@ -10392,7 +10440,7 @@ license:CC0-1.0
<description>Was ist das fur ein vogel (Germany)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="was ist das fur ein vogel (1992)(philips)(de)" sha1="a96d03ee811d8edf42d622da3eeca2184d3ebb4e"/>
</diskarea>
@@ -10408,7 +10456,7 @@ license:CC0-1.0
<description>WEB-i (USA)</description>
<year>1996</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="web-i (1996)(philips)(us)" sha1="889e7d8b3f11af9df9fba674334f859e525ccff3"/>
</diskarea>
@@ -10424,7 +10472,7 @@ license:CC0-1.0
<description>Why CD-I</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="why cd-i (1991)(philips)" sha1="a5c5eaef56b8173848ec491154d2104733e0ba80"/>
</diskarea>
@@ -10440,7 +10488,7 @@ license:CC0-1.0
<description>Windows on Chinese Civilization - The Forbidden City (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="windows on chinese civilization - the forbidden city (1995)(philips)(eu)" sha1="7bdc4378fc7f90d37b8748375ae251541c467f00"/>
</diskarea>
@@ -10456,7 +10504,7 @@ license:CC0-1.0
<description>Wines of France (Europe)</description>
<year>1995</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="wines of france (1995)(philips)(eu)" sha1="8da7d564465bd9afba0f2ff2abcfa674515e7ec7"/>
</diskarea>
@@ -10472,7 +10520,7 @@ license:CC0-1.0
<description>Les Vins de France (France)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="vins de france, les (1994)(philips)(fr)" sha1="21a142ee35a4b8781d20ec599c86b2b5f8a10f36"/>
</diskarea>
@@ -10488,7 +10536,7 @@ license:CC0-1.0
<description>The World Below - Literature Explorers (USA)</description>
<year>1993</year>
<publisher>Educational Management Group</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world below, the - literature explorers (1993)(educational management group)(us)" sha1="62c23c1a924676b3f3c31d9b2bb3c4ceff4b5cea"/>
</diskarea>
@@ -10504,7 +10552,7 @@ license:CC0-1.0
<description>The World of Impressionism (Europe, USA)</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world of impressionism, the (1992)(philips)(eu-us)" sha1="23810c8fe4205e068d5d2ba447a0a315371d96f2"/>
</diskarea>
@@ -10520,7 +10568,7 @@ license:CC0-1.0
<description>The World of Impressionism (USA)</description>
<year>1991</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world of impressionism, the (1991)(philips)(us)" sha1="5e862fece15122168233fe51751748dbac28c6da"/>
</diskarea>
@@ -10537,7 +10585,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Educational Management Group</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world tours - egypt (1996)(educational management group)(us)[dvc]" sha1="2c0e990971c45e8cf5a5a3eb50bb29a79bac7cae"/>
</diskarea>
@@ -10554,7 +10602,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Educational Management Group</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world tours - hong kong (1995)(educational management group)(us)[dvc]" sha1="e03388b2a1d94dc7b56e604abcce71137b90b3f3"/>
</diskarea>
@@ -10571,7 +10619,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Educational Management Group</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world tours - new zealand (1995)(educational management group)(us)[dvc]" sha1="ea0365baa41910a95dfbd148c66b2ae2f6e2e6ac"/>
</diskarea>
@@ -10588,7 +10636,7 @@ license:CC0-1.0
<year>1996</year>
<publisher>Educational Management Group</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world tours - pacific islands (1996)(educational management group)(us)[dvc]" sha1="4af1f529fc1b0d92f725be650e5738a096e94beb"/>
</diskarea>
@@ -10605,7 +10653,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Educational Management Group</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world tours - the amazon rainforest (1995)(educational management group)(us)[dvc]" sha1="8af37b1fe4da730865954c320d35bc6fa4851a4c"/>
</diskarea>
@@ -10622,7 +10670,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Educational Management Group</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="world tours - west africa (1994)(educational management group)(us)[dvc]" sha1="2f2bfcb1ca309bb7c65b33bf8787ea597b75f240"/>
</diskarea>
@@ -10639,7 +10687,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>Philips</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="xplora 1 - peter gabriel's secret world (1995)(philips)(eu)[dvc]" sha1="794a42059b172f0cfff4c670568b061386d71897"/>
</diskarea>
@@ -10655,7 +10703,7 @@ license:CC0-1.0
<description>Yearn 2 Learn - Peanuts (Europe)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="yearn 2 learn - peanuts (1994)(philips)(eu)(m4)" sha1="4c35d7b7c5f8f60e63fde6e4530f12d913f53d11"/>
</diskarea>
@@ -10671,7 +10719,7 @@ license:CC0-1.0
<description>You Can Do It All With Philips CD-i - A Title Sampler v1.0 (Europe)[Oct 1992]</description>
<year>1992</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="you can do it all with philips cd-i - a title sampler v1.0 (1992)(philips)(eu)(m4)[oct 1992]" sha1="6f6a655fe84b7574e7005155382b4e1b8c69939e"/>
</diskarea>
@@ -10687,7 +10735,7 @@ license:CC0-1.0
<description>Zoo ...eenvoudig! (Netherlands)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zoo ...eenvoudig (1993)(philips)(nl)" sha1="8b8b10c141de14e36d50aec71103a5a7fa23a88a"/>
</diskarea>
@@ -10708,7 +10756,7 @@ license:CC0-1.0
<description>Frog Feast (demo)</description>
<year>2000</year>
<publisher>Rastersoft</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="frog feast" sha1="67f7e06f8c7157963b980ddb1d5bf7fd5f22bbc5"/>
</diskarea>
@@ -10724,7 +10772,7 @@ license:CC0-1.0
<description>Super Mario's Wacky Worlds (prototype v0.11, 19930303)</description>
<year>1993</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="super mario wacky worlds (prototype)" sha1="a3178428ed39f7a461e693d9a1a927b4daaa677f"/>
</diskarea>
@@ -10740,7 +10788,7 @@ license:CC0-1.0
<description>Riddle of the Maze (prototype v2.01, 19940127)</description>
<year>1994</year>
<publisher>Philips</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="riddle of the maze (v2.01)(27-01-94)(testing - phase 2)" sha1="77b129103e5053618de4773ad938e204ac5afb18"/>
</diskarea>
@@ -10761,12 +10809,12 @@ license:CC0-1.0
<publisher>Philips</publisher>
<info name="usage" value="Access code 3333" />
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom1" interface="cdi_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="voyeur ii (v1.04)(11-06-96)(testing-beta)(access code 3333) (disc1)" sha1="9dfffd6736dbb85fa5317000af9f42f98aad4a20"/>
</diskarea>
</part>
- <part name="cdrom2" interface="cdi_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="voyeur ii (v1.04)(11-06-96)(testing-beta)(access code 3333) (disc2)" sha1="534bb7e695d98450edc206b79291200cb554cc6d"/>
</diskarea>
@@ -10782,7 +10830,7 @@ license:CC0-1.0
<description>The Apprentice [CDi Ready]</description>
<year>????</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="the apprentice (cdi-ready)" sha1="3a66337c20b9157e64228847ee3d153f80c25e4e"/>
</diskarea>
@@ -10793,7 +10841,7 @@ license:CC0-1.0
<description>Alien Gate (Europe)</description>
<year>1992</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alien gate (euro)" sha1="8ad4d0c5b875a04a7db3abbe236ba18eb2696a96"/>
</diskarea>
@@ -10804,7 +10852,7 @@ license:CC0-1.0
<description>Alien Gate (USA, set 1)</description>
<year>1992</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alien gate (us)(cdi-ready)" sha1="16009503b1fadb28b9fff293a7099b7cab062325"/>
</diskarea>
@@ -10815,7 +10863,7 @@ license:CC0-1.0
<description>Alien Gate (USA, set 2)</description>
<year>1992</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alien gate (us, set 1)(cdi-ready)" sha1="823a5b692a87b51a7c2f35ac0d63865494e253f7"/>
</diskarea>
@@ -10834,7 +10882,7 @@ license:CC0-1.0
<publisher>XDRA Ltd. ~ Asia CD Ltd.</publisher>
<info name="serial" value="819 0036"/>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="from the associated press - the best of photo journalism (1993)[dvc]" sha1="4059c3d61a00194f1e761d7a0d76ec871c9dad74"/>
</diskarea>
@@ -10855,7 +10903,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>XDRA Ltd.</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bill brandt - the picture post years 1938-1951 (1993)(xdra ltd.)[dvc]" sha1="58d3e9bc147bb3cf698586c9942027bb7a783e9e"/>
</diskarea>
@@ -10876,7 +10924,7 @@ license:CC0-1.0
<publisher>Scottish Interactive Technology Centre</publisher>
<info name="serial" value="819 0073"/>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cd-i in schools (1994)(scottish interactive technology centre)[dvc]" sha1="08ad14f7559a3be8a65091bdc1b015b7a7ab21fc"/>
</diskarea>
@@ -10896,7 +10944,7 @@ license:CC0-1.0
<year>1993</year>
<publisher>N.V. Organon</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="depression - the search for the nassa (1993)(n.v. organon)(nl)[dvc]" sha1="5ba1b7f5defaf1e8e1876e64042d3f610d2b1118"/>
</diskarea>
@@ -10907,7 +10955,7 @@ license:CC0-1.0
<description>Dimo's Quest [CDi Ready]</description>
<year>????</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dimo's quest (cdi-ready)" sha1="4264e939dc76c3f8386390c597be4dde765207d1"/>
</diskarea>
@@ -10927,7 +10975,7 @@ license:CC0-1.0
<year>1995</year>
<publisher>XDRA Ltd. ~ Temple Millar Multimedia</publisher>
<info name="serial" value="819 0025"/>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="getting ahead - making time (reprint)(1995)(temple millar multimedia - xdra)(eu)[cd-i-pc]" sha1="fcf77ca56c8b33a2032c7c3108eb542e586b3c78"/>
</diskarea>
@@ -10945,7 +10993,7 @@ license:CC0-1.0
<publisher>Japan Interactive Media</publisher>
<info name="serial" value="PCIM-00018" />
<info name="alt_title" value="CD-i ゴルゴ13" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="cd_matrix" value="PCIM-00018" />
<diskarea name="cdrom">
<disk name="golgo 13 (1992)(japan interactive media)(jp)" sha1="c8767a7864e139e50af9f121c7f944285b5763f0"/>
@@ -10969,7 +11017,7 @@ license:CC0-1.0
<year>1994</year>
<publisher>Harlon Publishing</publisher>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nijmegen 'n rijk aan mogelijkheden (1994)(harlon publishing)(nl)[dvc]" sha1="7387afeb526764ca2ad7f49cc2d181f769bbda12"/>
</diskarea>
@@ -10990,7 +11038,7 @@ license:CC0-1.0
<description>Paranasal Sinuses &amp; Anterior Skull Base</description>
<year>1993</year>
<publisher>Elsevier Science B.V.</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="paranasal sinuses &amp; anterior skull base (1993)(elsevier science b.v.)(cd-i disc)" sha1="79df7a6d6773bb42647b32c198869b6a4b9c3c52"/>
</diskarea>
@@ -11010,7 +11058,7 @@ license:CC0-1.0
<publisher>Icontact Multimedia Limited</publisher>
<info name="serial" value="IC 200"/>
<sharedfeat name="compatibility" value="DVC" />
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="peaches (1995)(icontact multimedia limited)[dvc]" sha1="df00e53db21f8f924569a9b842c9dd1f4bb608b3"/>
</diskarea>
@@ -11021,7 +11069,7 @@ license:CC0-1.0
<description>Plunderball</description>
<year>????</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="plunderball" sha1="0856e6e9afd4dda50e74b7856b821c467db2e0bb"/>
</diskarea>
@@ -11042,7 +11090,7 @@ license:CC0-1.0
<publisher>SKC Limited</publisher>
<info name="serial" value="ISC 3008"/>
<info name="alt_title" value="신나는 숫자나라 2"/>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sinnaneun susjanala 2 (1993)(skc limited)(kr)" sha1="398e6a0e5e02e50a67db325c9fdf893647cbb165"/>
</diskarea>
@@ -11063,7 +11111,7 @@ license:CC0-1.0
<publisher>SKC Limited</publisher>
<info name="serial" value="ISC 4002"/>
<info name="alt_title" value="우리함께 불러요 - 친구와 함께"/>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ulihamkke bulleoyo - chinguwa hamkke (1993)(skc limited)(kr)" sha1="c8eb407a10916be732e9fa10c198dce1a277e525"/>
</diskarea>
@@ -11084,7 +11132,7 @@ license:CC0-1.0
<publisher>SKC Limited</publisher>
<info name="serial" value="ISC 4001"/>
<info name="alt_title" value="우리함께 불러요 - 자연과 함께"/>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ulihamkke bulleoyo - jayeongwa hamkke (1993)(skc limited)(kr)" sha1="64e69cd4fc4c71d8cdddd65465da2646a3cb434a"/>
</diskarea>
@@ -11111,7 +11159,7 @@ license:CC0-1.0
<description>The Photo CD Book Companion CD-ROM</description>
<year>1994</year>
<publisher>Abacus</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pcd1904" sha1="19c7875a0329b2a75b3c0c05fa646536473e8c7d"/>
</diskarea>
@@ -11123,7 +11171,7 @@ license:CC0-1.0
<description>Go - Special Edition</description>
<year>????</year>
<publisher>The Vision Factory</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="go - special edition" sha1="abcb043a29b8c5f432b8c1097a76a8b45e9c946c" status="baddump"/>
</diskarea>
@@ -11134,7 +11182,7 @@ license:CC0-1.0
<description>Lucky Luke: The Video Game [CDi Ready]</description>
<year>1996</year>
<publisher>Philips Media GmbH</publisher>
- <part name="cdrom" interface="cdi_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lucky luke (cdi-ready)" sha1="88982afebcfcd9fb171855ffd575efc63450d341"/>
</diskarea>
diff --git a/hash/cdtv.xml b/hash/cdtv.xml
index 011f89b0a2a..c670c08b927 100644
--- a/hash/cdtv.xml
+++ b/hash/cdtv.xml
@@ -3,9 +3,6 @@
<!--
license:CC0-1.0
-We currently mark all of these as supported=no because none works on the intended HW (CDTV)
-
-
TODO:
- verify if all of these are really CDTV as minimum requirement;
- Substitute low grade anon dumps with redump.org, for proper serial identification;
@@ -15,6 +12,7 @@ TODO:
- Most Discis releases:
"To preview other Discis books, press the ?/Escape button once the button has opened"
Test this when CDTV works, it may list undumped Discis releases.
+
-->
<softwarelist name="cdtv" description="Commodore Amiga CDTV CD-ROMs">
<!--
@@ -132,6 +130,9 @@ TODO:
<year>1993</year>
<publisher>Almathera</publisher>
<notes><![CDATA[
+cdrom1: Disks 1-1199 of 17 Bit PD Library
+cdrom2: Disks 1201-2301 of 17 Bit PD Library
+Requires stable [FDC] write
cd32: black screen
]]></notes>
<info name="disc_matrix" value="SONOPRESS CD-ROM * G-9255 * C"/>
@@ -161,9 +162,12 @@ cd32: black screen
<year>1993</year>
<publisher>Almathera</publisher>
<notes><![CDATA[
+Disks 2303-2800 of 17 Bit PD Library, ASN01-141, AGN1-23, ARUG1-33, NZ1-29, Misc 17-Bit and LSD Catalogues
+Requires stable [FDC] write
cd32: black screen
]]></notes>
<info name="disc_matrix" value="SONOPRESS CD-ROM * H-6083 * A DS2"/>
+ <info name="usage" value="Non-17 Bit entries are uncompressed Drawers" />
<part name="cdrom" interface="cdrom">
<!-- <category>Applications</category> -->
<!-- http://redump.org/disc/20859/ -->
@@ -181,7 +185,7 @@ cd32: black screen
<year>1991</year>
<publisher>MultiMedia Corporation</publisher>
<notes><![CDATA[
-cd32: cursor is uncontrollable, [joytest] reset counter
+cdtv/cd32: cursor is uncontrollable, [joytest] reset counter
]]></notes>
<info name="sku" value="CDT-2502"/>
<info name="disc_matrix" value="MADE BY DISCOVERY SYSTEMS - AN AMERICAN COMPANY U2RY010UB"/>
@@ -197,14 +201,11 @@ cd32: cursor is uncontrollable, [joytest] reset counter
</part>
</software>
- <software name="lngranch" supported="no">
+ <software name="lngranch" supported="yes">
<!-- https://hol.abime.net/5792 -->
<description>A Long, Hard Day at the Ranch (UK, Spain)</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Audrey Nelson"/>
<info name="book_isbn" value="0-921974-45-0"/>
<info name="disc_matrix" value="CDRM-574000 4"/>
@@ -220,7 +221,7 @@ cd32: boot OK
<year>1991</year>
<publisher>Dominion Software &amp; Design</publisher>
<notes><![CDATA[
-cd32: cuts off GFX display to the far right
+[Denise] HAM strips on actual photos
]]></notes>
<!-- Read with the cdrdao options "-read-raw -read-subchan rw_raw" -->
@@ -236,7 +237,7 @@ cd32: cuts off GFX display to the far right
<year>1991</year>
<publisher>Dominion Software &amp; Design</publisher>
<notes><![CDATA[
-cd32: cuts off GFX display to the far right
+[Denise] HAM strips on actual photos
]]></notes>
<info name="disc_matrix" value="MADE BY DISCOVERY SYSTEMS - AN AMERICAN COMPANY U2RW010UB"/>
<part name="cdrom" interface="cdrom">
@@ -250,13 +251,12 @@ cd32: cuts off GFX display to the far right
</part>
</software>
- <!-- All Dogs Go To Heaven -->
<software name="dgheaven" supported="no">
<description>All Dogs Go to Heaven: Talking Electric Crayon</description>
<year>1991</year>
<publisher>Merit Software</publisher>
<notes><![CDATA[
-cd32: boot OK
+Not extensively tested
]]></notes>
<info name="sku" value="CDT-3532"/>
<part name="cdrom" interface="cdrom">
@@ -266,14 +266,11 @@ cd32: boot OK
</part>
</software>
- <software name="amerdict" supported="no">
+ <software name="amerdict" supported="yes">
<!-- v910214 in main menu -->
<description>American Heritage Illustrated Encyclopedic Dictionary (USA, 1991a Edition)</description>
<year>1991</year>
<publisher>Xïphias</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="serial" value="CDRM 446200"/>
<info name="disc_matrix" value="CDRM-446200 1"/>
<info name="sku" value="CDT-7501"/>
@@ -305,15 +302,12 @@ Has untested printer option
</software>
<!-- Apprenez L'Anglais Avec Asterix - Asterix and Son - Disque 1 -->
- <software name="asterix1" supported="no">
+ <software name="asterix1" supported="yes">
<!-- French release but still full English as title hints -->
<!-- https://hol.abime.net/4034 -->
<description>Apprenez l'Anglais Avec Astérix - Asterix and Son</description>
<year>1991</year>
<publisher>EuroTalk</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="apprenez l'anglais avec asterix - asterix and son - disque 1 (1991)(eurotalk)(fr)" sha1="71a9d4130ea8fb8d693befc8d3766df5befcced0" status="baddump" />
@@ -322,14 +316,11 @@ cd32: boot OK
</software>
<!-- Read with Asterix - Asterix and Son -->
- <software name="asterix1a" cloneof="asterix1" supported="no">
+ <software name="asterix1a" cloneof="asterix1" supported="yes">
<!-- Earlier revision, without "The interview" and "Recording" sub-menus -->
<description>Read with Asterix - Asterix and Son</description>
<year>1991</year>
<publisher>EuroTalk</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="read with asterix - asterix and son (1991)(eurotalk)" sha1="5357aadbd94ee9c7610f858bc8131b9b82e082fd" status="baddump" />
@@ -338,12 +329,12 @@ cd32: boot OK
</software>
<!-- Barney Bear Goes Camping -->
- <software name="barneycp" supported="no">
+ <software name="barneycp" supported="partial">
<description>Barney Bear Goes Camping</description>
<year>1990</year>
<publisher>Free Spirit Software</publisher>
<notes><![CDATA[
-cd32: selecting tree option (games) has no GFXs on game select section (fixes the second time around)
+cd32: selecting tree option (games) has no GFXs on game select section (fixes the second time around) (verify)
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -357,7 +348,7 @@ cd32: selecting tree option (games) has no GFXs on game select section (fixes th
<year>1990</year>
<publisher>Free Spirit Software</publisher>
<notes><![CDATA[
-cd32: hangs on title screen
+cd32: hangs on title screen (verify)
]]></notes>
<info name="sku" value="CDT-2501"/>
<info name="disc_matrix" value="MADE BY DISCOVERY SYSTEMS - AN AMERICAN COMPANY U28Y050UA"/>
@@ -470,12 +461,12 @@ cd32: hangs on title screen
</part>
</software>
- <!-- Battle Chess -->
<software name="btlchess" supported="no">
<description>Battle Chess</description>
<year>1994</year>
<publisher>Interplay</publisher>
<notes><![CDATA[
+cdtv: black screen
cd32: tutorial mode has no [CDDA] redbook audio (sample repeats)
cd32: game mode AI thinking is really slow after few moves
]]></notes>
@@ -487,15 +478,13 @@ cd32: game mode AI thinking is really slow after few moves
</part>
</software>
- <!-- Battlestorm -->
- <software name="btlstorm" supported="no">
+ <software name="btlstorm" supported="partial">
<description>Battlestorm</description>
<year>1991</year>
<publisher>Titus</publisher>
<notes><![CDATA[
-cd32: game hangs if gameplay intro isn't skipped
-cd32: wrong background colors
-cd32: GFX score never updates (stuck at 0)
+cdtv: boot OK
+cd32: game hangs if gameplay intro isn't skipped (verify)
]]></notes>
<info name="sku" value="CDT-3502"/>
<part name="cdrom" interface="cdrom">
@@ -505,7 +494,6 @@ cd32: GFX score never updates (stuck at 0)
</part>
</software>
- <!-- Black Viper -->
<software name="blkviper" supported="no">
<!-- TODO: Verify if this works on stock CDTV -->
<!-- Shouldn't and be just an CD32/AmigaCD release -->
@@ -513,6 +501,7 @@ cd32: GFX score never updates (stuck at 0)
<year>1996</year>
<publisher>Neo</publisher>
<notes><![CDATA[
+cdtv: unrecognized by BIOS
cd32: boot OK, has stripe glitch during FMV
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -522,16 +511,12 @@ cd32: boot OK, has stripe glitch during FMV
</part>
</software>
- <!-- Casino Games CDTV -->
- <software name="casigams" supported="no">
+ <software name="casigams" supported="yes">
<!-- https://hol.abime.net/2943 -->
<description>Casino Games</description>
<!-- In-game reports '91, HoL says '92 -->
<year>1992</year>
<publisher>Saen Software</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="casino games cdtv" sha1="1f02c705e57aff330fc393696e6fae96ed8e61d2" status="baddump" />
@@ -539,12 +524,12 @@ cd32: boot OK
</part>
</software>
- <!-- CD Remix - The D.J. in a box -->
<software name="cdremix" supported="no">
<description>CD Remix - The D.J. in a Box</description>
<year>1991</year>
<publisher>Microdeal</publisher>
<notes><![CDATA[
+Requires CDTV input device
cd32: black screen with mouse pointer after title screen (is it crashed?)
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -559,6 +544,7 @@ cd32: black screen with mouse pointer after title screen (is it crashed?)
<year>1991</year>
<publisher>Microdeal</publisher>
<notes><![CDATA[
+Requires CDTV input device
Requires disc swap with an audio CD for load sequence procedure (cfr. tutorial)
]]></notes>
@@ -570,12 +556,12 @@ Requires disc swap with an audio CD for load sequence procedure (cfr. tutorial)
</part>
</software>
- <!-- CD Remix Version II -->
<software name="cdremix2a" cloneof="cdremix2" supported="no">
<description>CD Remix Version II (alt)</description>
<year>1991</year>
<publisher>Microdeal</publisher>
<notes><![CDATA[
+Requires CDTV input device
Requires disc swap with an audio CD for load sequence procedure (cfr. tutorial)
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -591,7 +577,7 @@ Requires disc swap with an audio CD for load sequence procedure (cfr. tutorial)
<publisher>On-Line</publisher>
<notes><![CDATA[
cd32: black screen (PC=32114, PC=332a4 $35180)
-Requires a CDTV controller to play (digit options in main menu)
+Requires a CDTV input device to play (digit options in main menu)
Fills log with [DDFSTRT]=0xc underruns
]]></notes>
<info name="developer" value="KirkMoreno Multimedia"/>
@@ -610,7 +596,7 @@ Fills log with [DDFSTRT]=0xc underruns
<publisher>On-line</publisher>
<notes><![CDATA[
cd32: black screen
-Requires a CDTV controller to play (digit options in main menu)
+Requires a CDTV input device to play (digit options in main menu)
Fills log with [DDFSTRT]=0xc underruns
]]></notes>
<info name="developer" value="KirkMoreno Multimedia"/>
@@ -622,15 +608,11 @@ Fills log with [DDFSTRT]=0xc underruns
</part>
</software>
- <!-- Cinderella - The Original Fairy Tale -->
- <software name="cinderel" supported="no">
+ <software name="cinderel" supported="yes">
<!-- https://hol.abime.net/5793 -->
<description>Cinderella - The Original Fairy Tale (USA)</description>
<year>1992</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_isbn" value="0-921974-41-8"/>
<info name="serial" value="CDRM 735100"/>
<info name="sku" value="CDT-2523"/>
@@ -647,14 +629,10 @@ cd32: boot OK
</part>
</software>
- <!-- Classic Board Games -->
- <software name="clsbg" supported="no">
+ <software name="clsbg" supported="yes">
<description>Classic Board Games</description>
<year>1991</year>
<publisher>Merit Software</publisher>
- <notes><![CDATA[
-cd32: boot OK, status bar selection boxes draws an extra filled grey box to their right (cfr. "Language" in main menu) [Copper]?
-]]></notes>
<info name="barcode" value="7 22301 66115 4"/>
<info name="sku" value="CDT-3506"/>
<part name="cdrom" interface="cdrom">
@@ -668,13 +646,14 @@ cd32: boot OK, status bar selection boxes draws an extra filled grey box to thei
</part>
</software>
- <!-- Commodore Amiga CDTV, Amiga 600, Amiga 600HD Demo Disc -->
- <software name="cdtvd1" supported="no">
+ <software name="cdtvd1" supported="partial">
+ <!-- Point of Sale demo? -->
<description>Commodore Amiga CDTV, Amiga 600, Amiga 600HD Demo Disc 1</description>
<year>1992</year>
<publisher>Commodore</publisher>
<notes><![CDATA[
-cd32: Throws a pos software failure #80000004 at boot
+cdtv: boot OK
+cd32: Throws a pos software failure #80000004 at boot (verify)
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -684,11 +663,12 @@ cd32: Throws a pos software failure #80000004 at boot
</software>
<!-- same as cdtvdemo:cdrom2? -->
- <software name="cdtvd2" supported="no">
+ <software name="cdtvd2" supported="partial">
<description>Commodore Amiga CDTV, Amiga 600, Amiga 600HD Demo Disc 2</description>
<year>1992</year>
<publisher>Commodore</publisher>
<notes><![CDATA[
+cdtv: boot OK
cd32: Throws an AMOS software failure #8000000A at boot
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -698,8 +678,7 @@ cd32: Throws an AMOS software failure #8000000A at boot
</part>
</software>
- <!-- CoverGirlStripPoker -->
- <software name="covgrlsp" supported="no">
+ <software name="covgrlsp" supported="partial">
<!-- https://hol.abime.net/3106 (requires login) -->
<!-- https://www.mobygames.com/game/cover-girl-strip-poker -->
<description>Cover Girl Strip Poker</description>
@@ -814,14 +793,10 @@ cd32: boot OK
</part>
</software>
- <!-- Dinosaurs for Hire -->
- <software name="dinohire" supported="no">
+ <software name="dinohire" supported="yes">
<description>Dinosaurs for Hire</description>
<year>1991</year>
<publisher>Wright Works III</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dinosaurs for hire (1992)(wright works iii)" sha1="7cd03f4e0b33462ac5c9358be7dca46481e95a9b" status="baddump" />
@@ -829,15 +804,11 @@ cd32: boot OK
</part>
</software>
- <!-- Dr. Wellman - A Guide to Good Health for You &amp; Your Family -->
- <software name="drwellm" supported="no">
+ <software name="drwellm" supported="yes">
<description>Dr. Wellman - A Guide to Good Health for You and Your Family</description>
<year>1991</year>
<!-- "Digita Multimedia" -->
<publisher>CDTV Publishing</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="sku" value="CDT-7001"/>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -846,7 +817,6 @@ cd32: boot OK
</part>
</software>
- <!-- DuneCDTV (ONLY REAL CDTV) -->
<software name="dunep" supported="no">
<!-- No mention neither on HoL nor Lemon Amiga -->
<!-- Is it truly a prototype? -->
@@ -854,6 +824,7 @@ cd32: boot OK
<year>1992</year>
<publisher>Virgin Multimedia</publisher>
<notes><![CDATA[
+cdtv: boot OK, not extensively tested
cd32: doesn't boot
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -863,13 +834,14 @@ cd32: doesn't boot
</part>
</software>
- <!-- E.S.S. Mega -->
<software name="essmega" supported="no">
<description>E.S.S. Mega</description>
<year>1991</year>
<publisher>Coktel</publisher>
<notes><![CDATA[
+cdtv: crashes with "Play LBA: Not implemented" after selecting game or demo
cd32: crashes in-game when accessing "3d mod" option
+May use [joytest] reset counter (verify)
]]></notes>
<info name="developer" value="Tomahawk"/>
<part name="cdrom" interface="cdrom">
@@ -879,7 +851,6 @@ cd32: crashes in-game when accessing "3d mod" option
</part>
</software>
- <!-- FALCON -->
<software name="falcon" supported="no">
<!-- https://hol.abime.net/488 -->
<description>Falcon</description>
@@ -903,7 +874,8 @@ Needs CDTV input device
<year>1992</year>
<publisher>Centaur</publisher>
<notes><![CDATA[
-cd32: title screen cuts off selection text in the middle
+Title screen cuts off selection text in the middle
+Leds in stage select have [copper] issues when scrolling
cd32: gameplay audio outputs SFX even if user selects BGM
]]></notes>
<info name="disc_matrix" value="DISC MFG., INC. (A) W.O.# 40834-3 CD-ROM (1)"/>
@@ -919,13 +891,12 @@ cd32: gameplay audio outputs SFX even if user selects BGM
</part>
</software>
- <!-- Fractal Universe -->
<software name="fractuni" supported="no">
<description>Fractal Universe</description>
<year>1992</year>
<publisher>Almathera</publisher>
<notes><![CDATA[
-cd32: cursor is uncontrollable in main menu, [joytest] reset counter
+cursor is uncontrollable in main menu, [joytest] reset counter
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -934,13 +905,12 @@ cd32: cursor is uncontrollable in main menu, [joytest] reset counter
</part>
</software>
- <!-- Fun School 3 - for the under 5s -->
<software name="funsch30" supported="no">
<description>Fun School 3 for the Under 5s</description>
<year>1991</year>
<publisher>Database Educational Software</publisher>
<notes><![CDATA[
-cd32: cursor is uncontrollable in most games, [joytest] reset counter
+cursor is uncontrollable in most games, [joytest] reset counter
]]></notes>
<info name="sku" value="CDT-2505"/>
<part name="cdrom" interface="cdrom">
@@ -950,13 +920,12 @@ cd32: cursor is uncontrollable in most games, [joytest] reset counter
</part>
</software>
- <!-- Fun School 3 - for 5 to 7 year olds -->
<software name="funsch31" supported="no">
<description>Fun School 3 for 5 to 7 Year Olds</description>
<year>1991</year>
<publisher>Europress Software</publisher>
<notes><![CDATA[
-cd32: cursor is uncontrollable in most games, [joytest] reset counter
+cursor is uncontrollable in most games, [joytest] reset counter
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -965,13 +934,12 @@ cd32: cursor is uncontrollable in most games, [joytest] reset counter
</part>
</software>
- <!-- Fun School 3 - for the over 7s -->
<software name="funsch32" supported="no">
<description>Fun School 3 for the Over 7s</description>
<year>1991</year>
<publisher>Europress Software</publisher>
<notes><![CDATA[
-cd32: cursor is uncontrollable in most games, [joytest] reset counter
+cursor is uncontrollable in most games, [joytest] reset counter
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -980,12 +948,12 @@ cd32: cursor is uncontrollable in most games, [joytest] reset counter
</part>
</software>
- <!-- Galaga_Deluxe_CDTV -->
<software name="dxgalaga" supported="no">
<description>Deluxe Galaga (v2.4)</description>
<year>1995</year>
<publisher>Edgar Vigdal</publisher>
<notes><![CDATA[
+Missing starfield in gameplay
cd32: has serious GFX pitch corruption when booted, [Copper] or [Blitter]
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -995,7 +963,6 @@ cd32: has serious GFX pitch corruption when booted, [Copper] or [Blitter]
</part>
</software>
- <!-- Gamers' Delight -->
<software name="gamerdel" supported="no">
<description>Gamers' Delight (UK, Germany)</description>
<year>1994</year>
@@ -1010,13 +977,13 @@ cd32: not extensively tested
</part>
</software>
- <!-- Garden Fax - Fruits, Vegetables &amp; Herbs -->
- <software name="gardfaxf" supported="no">
+ <software name="gardfaxf" supported="partial">
<description>Garden Fax - Fruits, Vegetables, and Herbs (USA)</description>
<year>1991</year>
<publisher>CDTV Publishing</publisher>
<notes><![CDATA[
-cd32: boot OK
+May require CDTV input device
+[Denise] HAM strips on some photos
]]></notes>
<info name="developer" value="Inter Search Systems"/>
<info name="sku" value="CDT-1004"/>
@@ -1037,6 +1004,7 @@ cd32: boot OK
<year>1991</year>
<publisher>CDTV Publishing</publisher>
<notes><![CDATA[
+cdtv: unrecognized by BIOS
cd32: punts to cd32 player
]]></notes>
<info name="sku" value="CDT-1002"/>
@@ -1053,13 +1021,13 @@ cd32: punts to cd32 player
</part>
</software>
- <!-- Garden Fax - Indoor Plants -->
- <software name="gardfaxi" supported="no">
+ <software name="gardfaxi" supported="partial">
<description>Garden Fax - Indoor Plants (USA)</description>
<year>1991</year>
<publisher>CDTV Publishing</publisher>
<notes><![CDATA[
-cd32: boot OK
+May require CDTV input device
+[Denise] HAM strips on some photos
]]></notes>
<info name="developer" value="Inter Search Systems"/>
<info name="sku" value="CDT-1001"/>
@@ -1075,13 +1043,13 @@ cd32: boot OK
</part>
</software>
- <!-- Garden Fax - Trees, Shrubs, Roses &amp; Conifers -->
- <software name="gardfaxt" supported="no">
+ <software name="gardfaxt" supported="partial">
<description>Garden Fax - Trees, Shrubs, Roses, and Conifers (USA)</description>
<year>1991</year>
<publisher>CDTV Publishing</publisher>
<notes><![CDATA[
-cd32: boot OK
+May require CDTV input device
+[Denise] HAM strips on some photos
]]></notes>
<info name="developer" value="Inter Search Systems"/>
<info name="sku" value="CDT-1003"/>
@@ -1123,9 +1091,9 @@ cd32: GFX overlays are a bit offsetted to the right
<year>1992</year>
<publisher>Hex</publisher>
<notes><![CDATA[
-cd32: main menu animations looks goofily fast
-cd32: eternal rave [Paula] music looks off (verify)
-cd32: Top Banana boot OK, but gives one life only then punts to main menu (verify)
+main menu animations looks goofily fast (verify)
+Eternal rave [Paula] music looks off (verify)
+Top Banana boot OK, but gives one life only then punts to main menu (verify)
]]></notes>
<info name="alt_title" value="Global Chaos - Top Banana - Digital Love"/>
<part name="cdrom" interface="cdrom">
@@ -1135,13 +1103,13 @@ cd32: Top Banana boot OK, but gives one life only then punts to main menu (verif
</part>
</software>
- <!-- Guy Spy and the Crystals of Armageddon v1.0 -->
<software name="guyspy" supported="no">
<description>Guy Spy and the Crystals of Armageddon (v1.0)</description>
<year>1992</year>
<publisher>ReadySoft</publisher>
<notes><![CDATA[
-cd32: doesn't boot
+May require CDTV input device
+cd32: doesn't boot (verify)
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1150,15 +1118,11 @@ cd32: doesn't boot
</part>
</software>
- <!-- Heather Hits Her First Home Run -->
- <software name="heathr" supported="no">
- <!-- unlisted on HoL -->
+ <software name="heathr" supported="yes">
+ <!-- https://amiga.abime.net/games/view/heather-hits-her-first-home-run -->
<description>Heather Hits Her First Home Run</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="heather hits her first home run (1991)(discis)(en-es)" sha1="7c40e1b1b6c13f413da6b980bdcb36b6a39a587c" status="baddump" />
@@ -1166,13 +1130,14 @@ cd32: boot OK
</part>
</software>
- <!-- Heroic Age of Spaceflight - NASA... The 25th Year -->
<software name="nasa25" supported="no">
<!-- Uses "CDXL" -->
+ <!-- USA release? -->
<description>Heroic Age of Spaceflight - NASA... The 25th Year</description>
<year>1991</year>
<publisher>Troika Multimedia</publisher>
<notes><![CDATA[
+cdtv: crashes at the second CDXL playback (even same one)
cd32: FMVs has audio-video desyncs (shows periodic black frames, audio is too fast)
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -1182,12 +1147,12 @@ cd32: FMVs has audio-video desyncs (shows periodic black frames, audio is too fa
</part>
</software>
- <!-- Insight Dinosaurs v1.0 -->
<software name="insidino" supported="no">
<description>Insight: Dinosaurs (Europe, v1.0)</description>
<year>1994</year>
<publisher>Optonica</publisher>
<notes><![CDATA[
+cdtv: crashes when selecting any main menu item
cd32: GFX pitch corruption on initial copyright screen (fmode=3)
cd32: FMV video glitches out every other frame
cd32: Pointer is very unstable if mouse is used
@@ -1199,12 +1164,12 @@ cd32: Pointer is very unstable if mouse is used
</part>
</software>
- <!-- Insight Technology -->
<software name="insitech" supported="no">
<description>Insight: Technology</description>
<year>1993</year>
<publisher>Commodore</publisher>
<notes><![CDATA[
+[Denise] HAM heavy corruption on Commodore presents screen
cd32: uncontrollable on main menu [joytest]?
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -1214,12 +1179,12 @@ cd32: uncontrollable on main menu [joytest]?
</part>
</software>
- <!-- It Came from the Desert -->
<software name="itcame" supported="no">
<description>It Came from the Desert</description>
<year>1989</year>
<publisher>Cinemaware</publisher>
<notes><![CDATA[
+cdtv: boot OK, not extensively tested
cd32: punts to cd32 player
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -1229,13 +1194,12 @@ cd32: punts to cd32 player
</part>
</software>
- <!-- Karaoke Hits 1 -->
<software name="karaoke1" supported="no">
<description>Karaoke Hits 1</description>
<year>1992</year>
<publisher>Music Machine Marketing</publisher>
<notes><![CDATA[
-cd32: inputs doesn't work, should require digit presses on a CDTV input device
+Inputs doesn't work, should require digit presses on a CDTV input device
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1244,7 +1208,6 @@ cd32: inputs doesn't work, should require digit presses on a CDTV input device
</part>
</software>
- <!-- Language TV - English -->
<software name="langtv" supported="no">
<description>Language TV - English (France)</description>
<year>1991</year>
@@ -1271,7 +1234,7 @@ cd32: boot OK
<year>1994</year>
<publisher>Psygnosis</publisher>
<notes><![CDATA[
-cd32: lemmings boot OK, B button isn't recognized on Lemmings/Planetside demo initial prompt (requires CDTV input device?)
+lemmings boot OK, B button isn't recognized on Lemmings/Planetside demo initial prompt (requires CDTV input device?)
]]></notes>
<info name="disc_matrix" value="LEM CD 50163 021 02 /"/>
<info name="barcode" value="0 53203 00438 2"/>
@@ -1287,14 +1250,13 @@ cd32: lemmings boot OK, B button isn't recognized on Lemmings/Planetside demo in
</part>
</software>
- <!-- Log!cal -->
- <software name="logical" supported="no">
+ <software name="logical" supported="partial">
<description>Log!cal (Europe)</description>
<!-- title screen and build date says '91, multiple sources claims being '92 for CDTV -->
<year>1992</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
-cd32: crashes after title screen (68k goes to lalaland)
+cd32: crashes after title screen (68k goes to lalaland) (verify)
]]></notes>
<info name="disc_matrix" value="SONOPRESS * F-7419- * CD-ROM A 3"/>
<info name="barcode" value="4 005209 007641"/>
@@ -1309,13 +1271,12 @@ cd32: crashes after title screen (68k goes to lalaland)
</part>
</software>
- <!-- Monopoly -->
- <software name="monopoly" supported="no">
+ <software name="monopoly" supported="partial">
<description>Monopoly</description>
<year>1994</year>
<publisher>Supervision</publisher>
<notes><![CDATA[
-cd32: inputs doesn't work
+cd32: inputs doesn't work (verify)
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1324,15 +1285,11 @@ cd32: inputs doesn't work
</part>
</software>
- <!-- Moving Gives Me A Stomach Ache -->
- <software name="movstoma" supported="no">
+ <software name="movstoma" supported="yes">
<!-- https://hol.abime.net/5794 -->
<description>Moving Gives Me a Stomach Ache</description>
<year>1992</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Heather McKend"/>
<info name="book_isbn" value="0-921974-48-5"/>
<info name="disc_matrix" value="CDRM-734800 3"/>
@@ -1343,14 +1300,11 @@ cd32: boot OK
</part>
</software>
- <software name="mudpuddl" supported="no">
+ <software name="mudpuddl" supported="yes">
<!-- https://hol.abime.net/5001 -->
<description>Mud Puddle (USA, Multi 5)</description>
<year>1992</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Robert N. Munsch"/>
<info name="book_isbn" value="0-921974-39-6"/>
<info name="sku" value="CDT-2515"/>
@@ -1390,14 +1344,10 @@ cd32: outputs a very quiet [CDDA] redbook if you move on main menu with an analo
</part>
</software>
- <!-- My Paint - The Paint Program Just for Kids! -->
- <software name="mypaint" supported="no">
+ <software name="mypaint" supported="yes">
<description>My Paint CDTV - The Paint Program Just for Kids!</description>
<year>1990</year>
<publisher>Saddleback Graphics</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="sku" value="CDT-2516"/>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1406,14 +1356,10 @@ cd32: boot OK
</part>
</software>
- <!-- North Polar Expedition -->
- <software name="northpol" supported="no">
+ <software name="northpol" supported="yes">
<description>North Polar Expedition (v1.01)</description>
<year>1992</year>
<publisher>Virgin Multimedia</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="sku" value="CDT-2507"/>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1422,12 +1368,12 @@ cd32: boot OK
</part>
</software>
- <software name="pandora" supported="no">
+ <software name="pandora" supported="partial">
<description>Pandora's CD v1.0</description>
<year>1993</year>
<publisher>Optonica</publisher>
<notes><![CDATA[
-cd32: boot OK
+[Denise] HAM strips on some FMVs
]]></notes>
<!-- Read with the cdrdao options "-read-raw -read-subchan rw_raw" -->
@@ -1439,12 +1385,12 @@ cd32: boot OK
</software>
<!-- same as above? -->
- <software name="pandoras" cloneof="pandora" supported="no">
+ <software name="pandoras" cloneof="pandora" supported="partial">
<description>Pandora's CD v1.0 (alt)</description>
<year>1993</year>
<publisher>Optonica</publisher>
<notes><![CDATA[
-cd32: boot OK
+[Denise] HAM strips on some FMVs
]]></notes>
<info name="disc_matrix" value="SONOPRESS CD-ROM * G-9273 * A 2"/>
<info name="barcode" value="5 025465 130012"/>
@@ -1459,13 +1405,13 @@ cd32: boot OK
</part>
</software>
- <!-- Pinocchio -->
<software name="pinoc" supported="no">
<description>Pinocchio</description>
<year>1993</year>
<publisher>Giunti Multimedia</publisher>
<notes><![CDATA[
-cd32: glitchy Giunti FMV opening (uses HAM)
+Glitchy Giunti FMV opening (uses HAM)
+cdtv: black screen after Giunti FMV opening
cd32: "the game" doesn't display main sprite
cd32: "the movie" has scrolling glitches
]]></notes>
@@ -1476,12 +1422,12 @@ cd32: "the movie" has scrolling glitches
</part>
</software>
- <!-- Power Pinball -->
<software name="powerpin" supported="no">
<description>Power Pinball</description>
<year>1990</year>
<publisher>KarmaSoft</publisher>
<notes><![CDATA[
+cdtv: ball can get stuck easily (verify)
cd32: black screen (68k accesses unmapped addresses)
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -1491,13 +1437,12 @@ cd32: black screen (68k accesses unmapped addresses)
</part>
</software>
- <!-- Prehistorik -->
- <software name="prehisto" supported="no">
+ <software name="prehisto" supported="partial">
<description>Prehistorik</description>
<year>1991</year>
<publisher>Titus</publisher>
<notes><![CDATA[
-cd32: boot OK, [CDDA] redbook audio tracks doesn't repeat? (verify)
+cd32: boot OK, [CDDA] redbook audio tracks doesn't repeat
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1511,6 +1456,7 @@ cd32: boot OK, [CDDA] redbook audio tracks doesn't repeat? (verify)
<year>1992</year>
<publisher>On-line</publisher>
<notes><![CDATA[
+cdtv: hangs at "Once upon a time" initial screen with wrong [CDDA] playback
cd32: hangs on acknowledge ending credits (i.e. when you die and have to start over)
]]></notes>
<info name="developer" value="Delta 4 Interactive"/>
@@ -1528,6 +1474,7 @@ cd32: hangs on acknowledge ending credits (i.e. when you die and have to start o
<year>1992</year>
<publisher>On-line</publisher>
<notes><![CDATA[
+cdtv: hangs at "Once upon a time" initial screen with wrong [CDDA] playback
cd32: hangs on acknowledge ending credits (i.e. when you die and have to start over)
]]></notes>
<info name="developer" value="Delta 4 Interactive"/>
@@ -1547,7 +1494,7 @@ cd32: hangs on acknowledge ending credits (i.e. when you die and have to start o
</part>
</software>
- <software name="cdtvdemo" supported="no">
+ <software name="cdtvdemo" supported="yes">
<!-- Point of sale demo discs -->
<!-- Disc 1 is an early video for unreleased Planetside -->
<description>CDTV Demo Disc (Europe)</description>
@@ -1555,6 +1502,7 @@ cd32: hangs on acknowledge ending credits (i.e. when you die and have to start o
<!-- TODO: arguably may be published by both companies -->
<publisher>Commodore</publisher>
<notes><![CDATA[
+cdtv: disc 1 and 2 boots
cd32: disc 1 boot OK
cd32: disc 2 throws an AMOS software failure #8000000A at boot
]]></notes>
@@ -1581,13 +1529,10 @@ cd32: disc 2 throws an AMOS software failure #8000000A at boot
</part>
</software>
- <software name="raffles" supported="no">
+ <software name="raffles" supported="yes">
<description>Raffles (Sweden)</description>
<year>1991</year>
<publisher>Edge</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="disc_matrix" value="40908 THE EDGE 17172 W.O.# 40908-2 CD-ROM (1)"/>
<info name="barcode" value="7 33673 17172 1"/>
<!-- baddump: "MCN unverified" -->
@@ -1602,7 +1547,6 @@ cd32: boot OK
</part>
</software>
- <!-- RiseOfTheDragon(CDTV) -->
<software name="rotd" supported="no">
<!-- TODO: No info over the net, is this official? -->
<description>Rise of the Dragon</description>
@@ -1619,15 +1563,11 @@ cd32: boot OK
</part>
</software>
- <!-- Scary Poems for Rotten Kids -->
- <software name="scarpoem" supported="no">
+ <software name="scarpoem" supported="yes">
<!-- https://hol.abime.net/5796 -->
<description>Scary Poems for Rotten Kids</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Sean O Huigin"/>
<info name="book_isbn" value="0-921974-37-X"/>
<info name="sku" value="CDT-2514"/>
@@ -1638,7 +1578,6 @@ cd32: boot OK
</part>
</software>
- <!-- Sherlock Holmes on a Disc - Illustrated Sherlock Holmes -->
<software name="holmes" supported="no">
<!-- "The Illustrated Sherlock Holmes" on title screen, description is what is printed on boxart / spine -->
<description>Sherlock Holmes on a Disc</description>
@@ -1646,8 +1585,8 @@ cd32: boot OK
<publisher>Animated Pixels</publisher>
<notes><![CDATA[
Compiled over the same engine as illbible
-cd32: offset hand cursor on main menu
-cd32: cannot move on multimedia section (hangs?)
+Offset hand cursor on main menu (verify)
+Cannot move on multimedia section (hangs?)
]]></notes>
<info name="sku" value="CDT-7503"/>
<part name="cdrom" interface="cdrom">
@@ -1662,6 +1601,7 @@ cd32: cannot move on multimedia section (hangs?)
<year>1991</year>
<publisher>Software 2000</publisher>
<notes><![CDATA[
+Mouse pointer in Lettrix is unstable, requires CDTV input device?
cd32: Lettrix punts to CD32 disc screen
cd32: Shiftrix boot OK
]]></notes>
@@ -1678,12 +1618,12 @@ cd32: Shiftrix boot OK
</part>
</software>
- <!-- Shiftrix &amp; Lettrix -->
<software name="shiftrixa" cloneof="shiftrix" supported="no">
<description>Shiftrix &amp; Lettrix (alt)</description>
<year>1991</year>
<publisher>Software 2000</publisher>
<notes><![CDATA[
+Mouse pointer in Lettrix is unstable, requires CDTV input device?
cd32: Lettrix punts to CD32 disc screen
cd32: Shiftrix boot OK
]]></notes>
@@ -1702,6 +1642,7 @@ cd32: Shiftrix boot OK
<publisher>Infogrames</publisher>
<notes><![CDATA[
Saving requires either a ramcard or a disk, [FDC] format
+cdtv: bitplane glitch when scrolling vertically, [Copper]?
cd32: boot OK
]]></notes>
<info name="sku" value="CDT-3518"/>
@@ -1740,6 +1681,7 @@ cd32: boot OK
<year>1991</year>
<publisher>Edge</publisher>
<notes><![CDATA[
+cdtv: black screen (reaches a STOP #2000)
cd32: black screen
]]></notes>
<info name="sku" value="CDT-3533"/>
@@ -1758,12 +1700,12 @@ cd32: black screen
</part>
</software>
- <!-- Space Wars CDTV -->
<software name="spacewar" supported="no">
<description>Space Wars</description>
<year>1992</year>
<publisher>Odyssey</publisher>
<notes><![CDATA[
+cdtv: Requires CDTV input device
cd32: boot OK but too fast during gameplay
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -1773,12 +1715,12 @@ cd32: boot OK but too fast during gameplay
</part>
</software>
- <!-- Spirit of Excalibur -->
<software name="spirexa" supported="no">
<description>Spirit of Excalibur</description>
<year>1991</year>
<publisher>Virgin</publisher>
<notes><![CDATA[
+cdtv: black screen
cd32: black screen
]]></notes>
<info name="sku" value="CDT-3509"/>
@@ -1789,14 +1731,13 @@ cd32: black screen
</part>
</software>
- <!-- Super Games Pak -->
- <software name="suprgams" supported="no">
+ <software name="suprgams" supported="partial">
+ <!-- https://amiga.abime.net/games/view/super-games-pak -->
<description>Super Games Pak</description>
<year>1991</year>
<publisher>Odyssey</publisher>
<notes><![CDATA[
-Not extensively tested (brief Jail Break play)
-cd32: boot OK
+Deathbots: has slight player [sprite] corruption when moving left/right
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -1805,14 +1746,11 @@ cd32: boot OK
</part>
</software>
- <software name="teamyank" supported="no">
+ <software name="teamyank" supported="yes">
<!-- https://hol.abime.net/1325 -->
<description>Team Yankee (Europe)</description>
<year>1992</year>
<publisher>Empire</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="developer" value="Oxford Digital Enterprises"/>
<info name="disc_matrix" value="CDRM-729600 3"/>
<part name="cdrom" interface="cdrom">
@@ -1826,8 +1764,8 @@ cd32: boot OK
</part>
</software>
- <!-- Assassins -->
- <software name="assass1" supported="no">
+ <!-- TODO: move to AmigaCD? -->
+ <software name="assass1" supported="partial">
<description>The Assassins Ultimate CD Games Collection</description>
<year>19??</year>
<publisher>Weird Science</publisher>
@@ -1841,8 +1779,8 @@ Not extensively tested
</part>
</software>
- <!-- Assassins 2 -->
- <software name="assass2" supported="no">
+ <!-- TODO: move to AmigaCD? -->
+ <software name="assass2" supported="partial">
<description>The Assassins Ultimate Games Volume 2</description>
<year>19??</year>
<publisher>Weird Science</publisher>
@@ -1857,8 +1795,9 @@ cd32: draws title screen with a line of garbage at bottom
</part>
</software>
+ <!-- TODO: move to AmigaCD? -->
<!-- Assassins 3 - The Ultimate Games CD -->
- <software name="assass3" supported="no">
+ <software name="assass3" supported="partial">
<description>The Assassins CD 3</description>
<year>1997</year>
<publisher>Weird Science</publisher>
@@ -1891,14 +1830,12 @@ cd32: draws title screen with a line of garbage at bottom
</part>
</software>
- <!-- Case of the Cautious Condor, The -->
- <software name="cautcond" supported="no">
+ <software name="cautcond" supported="partial">
<description>The Case of the Cautious Condor</description>
<year>1990</year>
<publisher>Tiger Media</publisher>
<notes><![CDATA[
A few [CDDA] redbook speeches scratches at the end (dump?)
-cd32: boot OK
]]></notes>
<info name="sku" value="CDT-3507"/>
<part name="cdrom" interface="cdrom">
@@ -1908,7 +1845,6 @@ cd32: boot OK
</part>
</software>
- <!-- CDTV Interactive Point of Sale Compact Disc, The -->
<software name="cdtvsale" supported="no">
<description>The CDTV Interactive Point of Sale Compact Disc</description>
<year>1991</year>
@@ -1927,7 +1863,6 @@ cd32: Battlestorm demo crashes (sends 68k to lalaland)
</part>
</software>
- <!-- Connoisseur, The - Fine Art Collection -->
<software name="connoiss" supported="no">
<description>The Connoisseur - Fine Art Collection</description>
<year>1992</year>
@@ -1942,12 +1877,12 @@ cd32: boot OK, glitchy scroll up/down when artwork description is called when ch
</part>
</software>
- <!-- Curse of RA, The -->
<software name="cursera" supported="no">
<description>The Curse of Ra (Germany)</description>
<year>1992</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
+cdtv: main menu cursor moves too fast, wants CDTV input device?
cd32: has serious sprite position issues (offset on demo, draws garbage from time to time)
]]></notes>
<info name="developer" value="Cyberstyle"/>
@@ -1964,7 +1899,6 @@ cd32: has serious sprite position issues (offset on demo, draws garbage from tim
</part>
</software>
- <!-- Demo Collection for Amiga CDTV, The -->
<software name="democdtv" supported="no">
<!-- bootable version of Ten On Ten disc #4 -->
<description>The Demo Collection for Amiga CDTV (Europe, Black Disc)</description>
@@ -1986,14 +1920,13 @@ cd32: bottom GFX is corrupted on title screen
</part>
</software>
- <!-- Guinness CDTV Disc of Records, The - 1991 Edition -->
- <software name="guinness" supported="no">
+ <software name="guinness" supported="partial">
<!-- looks USA-centric (cfr. Soccer) but New Media was based in London according to title/credits -->
<description>The Guinness CDTV Disc of Records (1991 Edition)</description>
<year>1991</year>
<publisher>CDTV Publishing</publisher>
<notes><![CDATA[
-cd32: boot OK, has a bit of left side corruption on HAM tour videos
+Slight [Denis] left side corruption on HAM tour videos
]]></notes>
<info name="developer" value="New Media Productions"/>
<part name="cdrom" interface="cdrom">
@@ -2003,7 +1936,6 @@ cd32: boot OK, has a bit of left side corruption on HAM tour videos
</part>
</software>
- <!-- Hound of the Baskervilles, The -->
<software name="houndbas" supported="no">
<!-- A Sherlock Holmes Murder Mystery on front cover -->
<!-- Prefixed with The in title -->
@@ -2023,12 +1955,12 @@ cd32: boot OK
</part>
</software>
- <!-- Hutchinson Encyclopedia, The - PAL Version -->
- <software name="hutchins" supported="no">
+ <software name="hutchins" supported="partial">
<description>The Hutchinson Encyclopedia (Europe)</description>
<year>1991</year>
<publisher>Attica Cybernetics</publisher>
<notes><![CDATA[
+[Denise] HAM issues on some Pictures
cd32: boot OK, vertical scrolling glitches a bit in Pictures sub menu [Copper]
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -2042,13 +1974,12 @@ cd32: boot OK, vertical scrolling glitches a bit in Pictures sub menu [Copper]
</part>
</software>
- <!-- Illustrated Holy Bible, The -->
<software name="illbible" supported="no">
<description>The Illustrated Holy Bible</description>
<year>1991</year>
<publisher>Animated Pixels</publisher>
<notes><![CDATA[
-cd32: keeps beeping, uncontrollable (not compatible with cd32 input device?)
+Keeps beeping, uncontrollable, needs CDTV Input device?
cd32: jerky scrolling for user portion in multimedia section
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -2058,12 +1989,12 @@ cd32: jerky scrolling for user portion in multimedia section
</part>
</software>
- <!-- Illustrated Works of Shakespeare, The -->
<software name="illshake" supported="no">
<description>The Illustrated Works of Shakespeare</description>
<year>1990</year>
<publisher>Animated Pixels</publisher>
<notes><![CDATA[
+May require CDTV Input device
cd32: keeps beeping, uncontrollable (not compatible with cd32 input device?)
cd32: jerky scrolling for user portion in multimedia section
]]></notes>
@@ -2074,13 +2005,14 @@ cd32: jerky scrolling for user portion in multimedia section
</part>
</software>
- <!-- Labyrinth of Time, The -->
<software name="labytime" supported="no">
<description>The Labyrinth of Time</description>
<year>1994</year>
<publisher>Electronic Arts</publisher>
<notes><![CDATA[
Not extensively tested
+Cutoff DIW on bottom of load/save menu
+[Denise] HAM issues on some gameplay screens
cd32: GFX pitch corruption for intro screens, EA logo is offset to the left [ddfstrt]
]]></notes>
<part name="cdrom" interface="cdrom">
@@ -2090,14 +2022,10 @@ cd32: GFX pitch corruption for intro screens, EA logo is offset to the left [ddf
</part>
</software>
- <!-- New Basics Electronic Cookbook, The - 1991a Edition -->
- <software name="newbasic" supported="no">
+ <software name="newbasic" supported="yes">
<description>The New Basics Electronic Cookbook (USA, 1991a Edition)</description>
<year>1991</year>
<publisher>Xïphias</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="serial" value="CDRM-445900"/>
<info name="disc_matrix" value="CDRM-445900 2"/>
<info name="barcode" value="728795111120"/>
@@ -2113,14 +2041,10 @@ cd32: boot OK
</part>
</software>
- <!-- New Grolier Electronic Encyclopedia, The -->
- <software name="newgroli" supported="no">
- <description>The New Grolier Electronic Encyclopedia</description>
+ <software name="newgroli" supported="yes">
+ <description>The New Grolier Electronic Encyclopedia (5/6/91)</description>
<year>1991</year>
<publisher>CDTV Publishing</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="sku" value="CDT-7002"/>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -2129,15 +2053,11 @@ cd32: boot OK
</part>
</software>
- <!-- Night Before Christmas, The -->
- <software name="nbxmas" supported="no">
+ <software name="nbxmas" supported="yes">
<!-- unlisted on HoL -->
<description>The Night Before Christmas</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="night before christmas, the (1991)(discis)(en-es)" sha1="16fa7fdcb8dab59b8ab7b5acb17be786fc47443f" status="baddump" />
@@ -2145,15 +2065,11 @@ cd32: boot OK
</part>
</software>
- <!-- Paper Bag Princess, The -->
- <software name="paperbag" supported="no">
+ <software name="paperbag" supported="yes">
<!-- https://hol.abime.net/5795 -->
<description>The Paper Bag Princess</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Robert N. Munsch"/>
<info name="book_isbn" value="0-921974-33-7"/>
<info name="disc_matrix" value="CDRM-734700 3"/>
@@ -2165,15 +2081,11 @@ cd32: boot OK
</part>
</software>
- <!-- Tale of Benjamin Bunny, The -->
- <software name="talbenjb" supported="no">
- <!-- unlisted on HoL -->
+ <software name="talbenjb" supported="yes">
+ <!-- https://amiga.abime.net/games/view/the-tale-of-benjamin-bunny -->
<description>The Tale of Benjamin Bunny</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tale of benjamin bunny, the (1991)(discis)(en-es)" sha1="453aec25e283a30a9493d34db1a914f9c248e818" status="baddump" />
@@ -2181,15 +2093,11 @@ cd32: boot OK
</part>
</software>
- <!-- Tale of Peter Rabbit, The -->
- <software name="talpeter" supported="no">
+ <software name="talpeter" supported="yes">
<!-- https://hol.abime.net/5797 -->
<description>The Tale of Peter Rabbit</description>
<year>1992</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Beatrix Potter"/>
<info name="book_isbn" value="0-921974-31-0"/>
<info name="disc_matrix" value="CDRM-734900 1"/>
@@ -2221,7 +2129,6 @@ cd32: hangs when explaining the hourglass icon in tutorial
</part>
</software>
- <!-- Town With No Name -->
<software name="townonaa" cloneof="townona" supported="no">
<description>The Town with No Name (alt)</description>
<year>1992</year>
@@ -2240,15 +2147,11 @@ cd32: hangs when explaining the hourglass icon in tutorial
</part>
</software>
- <!-- Thomas' Snowsuit -->
- <software name="thomsnow" supported="no">
+ <software name="thomsnow" supported="yes">
<!-- https://hol.abime.net/5798 -->
<description>Thomas' Snowsuit</description>
<year>1991</year>
<publisher>Discis Knowledge Research</publisher>
- <notes><![CDATA[
-cd32: boot OK
-]]></notes>
<info name="book_author" value="Robert N. Munsch"/>
<info name="book_isbn" value="0-921974-35-3"/>
<info name="sku" value="CDT-2512"/>
@@ -2259,15 +2162,15 @@ cd32: boot OK
</part>
</software>
- <!-- Tie Break -->
- <software name="tiebreak" supported="no">
+ <software name="tiebreak" supported="partial">
<description>Tie Break</description>
<year>1991</year>
<publisher>Starbyte</publisher>
<notes><![CDATA[
-cd32: black screen
-Unsupported 4-players parallel interface
+cd32: black screen (verify)
]]></notes>
+ <info name="usage" value="Supports adaptator in Centronics port for p3 and p4" />
+
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tie break (1991)(starbyte)" sha1="e61de9dceb6be3af0dd81a13d5b9a8d1e58bb69f" status="baddump" />
@@ -2275,13 +2178,10 @@ Unsupported 4-players parallel interface
</part>
</software>
- <software name="ttohbusi" supported="no">
+ <software name="ttohbusi" supported="yes">
<description>Time Table of History - Business, Politics &amp; Media (USA, 1991a Edition)</description>
<year>1991</year>
<publisher>Xïphias</publisher>
- <notes><![CDATA[
-cd32: bottom GFX section for "World" icon screens have offset text (starts from right edge)
-]]></notes>
<info name="sku" value="CDT-7504"/>
<info name="disc_matrix" value="CDRM-446100 1"/>
<info name="barcode" value="7 28795 02112 2"/>
@@ -2296,14 +2196,10 @@ cd32: bottom GFX section for "World" icon screens have offset text (starts from
</part>
</software>
- <!-- Time Table of History - Science and Innovation - 1991a Edition -->
- <software name="ttohsci" supported="no">
+ <software name="ttohsci" supported="yes">
<description>Time Table of History - Science and Innovation (USA, 1991a Edition)</description>
<year>1991</year>
<publisher>Xïphias</publisher>
- <notes><![CDATA[
-cd32: bottom GFX section for "World" icon screens have offset text (starts from right edge)
-]]></notes>
<info name="sku" value="CDT-7505"/>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -2312,13 +2208,13 @@ cd32: bottom GFX section for "World" icon screens have offset text (starts from
</part>
</software>
- <software name="trivcdtv" supported="no">
+ <software name="trivcdtv" supported="partial">
<!-- v1.0a E02PAL printed on title screen -->
<description>Trivial Pursuit - The CDTV Edition (Europe, v1.0a)</description>
<year>1992</year>
<publisher>Domark</publisher>
<notes><![CDATA[
-cd32: boot OK
+Optional save options, [FDC] format
]]></notes>
<info name="developer" value="The Kremlin"/>
<info name="disc_matrix" value="TRIVIAL PURSUIT 1 50246 426 02 >"/>
@@ -2344,13 +2240,13 @@ cd32: boot OK
</part>
</software>
- <software name="turrican">
+ <software name="turrican" supported="partial">
<description>Turrican</description>
<year>1991</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
-Controls are a bit odd to figure out, but this appear to work (update: on cdtv?)
-cd32: black screen with unmapped accesses (reads DSKDAT R too)
+[Paula] some sound notes are a bit off (verify)
+cd32: black screen with unmapped accesses (verify)
]]></notes>
<!-- Read with the cdrdao options "-read-raw -read-subchan rw_raw" -->
@@ -2361,13 +2257,13 @@ cd32: black screen with unmapped accesses (reads DSKDAT R too)
</part>
</software>
- <!-- Turrican -->
- <software name="turricana" cloneof="turrican" supported="no">
+ <software name="turricana" cloneof="turrican" supported="partial">
<description>Turrican (Germany, alt)</description>
<year>1992</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
-cd32: black screen with unmapped accesses (reads DSKDAT R too)
+[Paula] some sound notes are a bit off (verify)
+cd32: black screen with unmapped accesses (verify)
]]></notes>
<info name="disc_matrix" value="SONOPRESS * F-7897 * CD-ROM A"/>
<info name="barcode" value="4 005209 007689"/>
@@ -2382,12 +2278,12 @@ cd32: black screen with unmapped accesses (reads DSKDAT R too)
</part>
</software>
- <software name="turricn2">
+ <software name="turricn2" supported="partial">
<description>Turrican II: The Final Fight</description>
<year>1991</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
-cd32: black screen with unmapped accesses (reads DSKDAT R too)
+cd32: black screen with unmapped accesses (verify)
]]></notes>
<!-- Read with the cdrdao options "-read-raw -read-subchan rw_raw" -->
@@ -2398,13 +2294,12 @@ cd32: black screen with unmapped accesses (reads DSKDAT R too)
</part>
</software>
- <!-- Turrican 2 CDTV -->
- <software name="turricn2a" cloneof="turricn2" supported="no">
+ <software name="turricn2a" cloneof="turricn2" supported="partial">
<description>Turrican II: The Final Fight (Germany, alt)</description>
<year>1991</year>
<publisher>Rainbow Arts</publisher>
<notes><![CDATA[
-cd32: black screen with unmapped accesses (reads DSKDAT R too)
+cd32: black screen with unmapped accesses (verify)
]]></notes>
<info name="disc_matrix" value="SONOPRESS * F-8339 * CD-ROM A"/>
<info name="barcode" value="4 005209 007696"/>
@@ -2419,14 +2314,13 @@ cd32: black screen with unmapped accesses (reads DSKDAT R too)
</part>
</software>
- <!-- Ultimate Basketball! -->
<software name="ultbball" supported="no">
<description>Ultimate Basketball</description>
<year>1991</year>
<publisher>Context Systems</publisher>
<notes><![CDATA[
+sprite layer is glitched in the middle during gameplay, and cuts off names on status bar [Copper]
cd32: Most GFXs are pitch corrupted
-cd32: sprite layer is glitched in the middle during gameplay, and cuts off names on status bar [Copper]
]]></notes>
<part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
@@ -2435,12 +2329,12 @@ cd32: sprite layer is glitched in the middle during gameplay, and cuts off names
</part>
</software>
- <software name="welcdtvm" supported="no">
+ <software name="welcdtvm" supported="partial">
<description>Welcome to CDTV Multimedia (USA, CDRM-499000)</description>
<year>1991</year>
<publisher>Commodore</publisher>
<notes><![CDATA[
-cd32: black screen with BGM playing
+cd32: black screen with BGM playing (verify)
]]></notes>
<info name="disc_matrix" value="CDRM-499000 1"/>
<part name="cdrom" interface="cdrom">
@@ -2454,12 +2348,12 @@ cd32: black screen with BGM playing
</part>
</software>
- <software name="welcdtvma" cloneof="welcdtvm" supported="no">
+ <software name="welcdtvma" cloneof="welcdtvm" supported="partial">
<description>Welcome to CDTV Multimedia (367808-01 33)</description>
<year>1991</year>
<publisher>Commodore</publisher>
<notes><![CDATA[
-cd32: black screen with BGM playing
+cd32: black screen with BGM playing (verify)
]]></notes>
<info name="disc_matrix" value="367808-01 33"/>
<part name="cdrom" interface="cdrom">
@@ -2573,14 +2467,12 @@ cd32: few [Blitter] OPs has an extra line of garbage (cfr. title screen vertical
</part>
</software>
- <!-- Women in Motion - Eadweard Muybridge -->
- <software name="womenmot" supported="no">
+ <software name="womenmot" supported="partial">
<description>Eadweard Muybridge's Women in Motion</description>
<year>1991</year>
<publisher>On-line</publisher>
<notes><![CDATA[
-cd32: boot OK
-Has untested printer option
+Has untested [Printer] option
]]></notes>
<info name="sku" value="CDT-1503"/>
<part name="cdrom" interface="cdrom">
@@ -2590,13 +2482,12 @@ Has untested printer option
</part>
</software>
- <!-- World Vista -->
- <software name="worldvis" supported="no">
+ <software name="worldvis" supported="partial">
<description>World Vista</description>
<year>1991</year>
<publisher>Applied Optical Media Corporation</publisher>
<notes><![CDATA[
-cd32: beeps when selecting any option in main menu, likely it requires a CDTV input device
+cd32: beeps when selecting any option in main menu, incompatible with CD32 pad? (verify)
]]></notes>
<info name="sku" value="CDT-7506"/>
<part name="cdrom" interface="cdrom">
@@ -2607,10 +2498,12 @@ cd32: beeps when selecting any option in main menu, likely it requires a CDTV in
</software>
<software name="wrdemon" supported="no">
+ <!-- https://amiga.abime.net/games/view/wrath-of-the-demon -->
<description>Wrath of the Demon (USA)</description>
<year>1990</year>
<publisher>ReadySoft</publisher>
<notes><![CDATA[
+cdtv: gameplay locks up at first level, spawning the horse without a ride
cd32: hangs at ReadySoft logo
]]></notes>
<info name="sku" value="CDT-3522"/>
@@ -2627,17 +2520,20 @@ cd32: hangs at ReadySoft logo
</part>
</software>
- <!-- Xenon2Megablast -->
<software name="xenon2" supported="no">
<!-- Also has "wnazennjn" language option, which is a pseudo-Polish joke -->
<description>Xenon 2 - Megablast (Europe)</description>
<year>1992</year>
<publisher>Image Works</publisher>
<notes><![CDATA[
+cdtv: black screen, boots on cdtvn
cd32: boot OK
]]></notes>
<info name="developer" value="The Assembly Line"/>
- <info name="language" value="English/French/German/Italian" />
+ <info name="language" value="English" />
+ <info name="language" value="French" />
+ <info name="language" value="German" />
+ <info name="language" value="Italian" />
<info name="sku" value="CDT-3523"/>
<info name="disc_matrix" value="EXNON 2 CDTV (V) : MASTERED BY NIMBUS"/>
<!-- Barcode Sticker: Xenon II CDTV CD1X-XEN7 5 020026 900998 -->
@@ -2665,129 +2561,4 @@ cd32: boot OK
</part>
</software>
- <!-- Collections -->
-
- <!-- Collection of ten discs -->
- <!-- TODO: More likely AmigaCD rather than CDTV? -->
- <software name="10on10" supported="no">
- <description>Ten on Ten Compilation (Europe)</description>
- <year>1995</year>
- <publisher>Almathera</publisher>
- <notes><![CDATA[
-Disc 1 has various unsupported collection of Amiga ParNet and SerNet tools
-cd32: disc 1 AmigaKicks\chess has GFX pitch corruption and uncontrollable pointer, [joytest] reset
-cd32: disc 10 black screen
-]]></notes>
- <info name="usage" value="In order to load any other disc in this collection: insert disc 1 then hold right mouse button at startup for being prompted to disc swap with any other CD in this collection, then soft reset machine"/>
- <part name="cdrom1" interface="cdrom">
- <!-- <category>Applications</category> -->
- <!-- http://redump.org/disc/18550/ -->
- <!-- <rom name="Almathera Comms &amp; Networking CD (Europe).cue" size="106" crc="803a023b" md5="3dd92c3d34ed3cda877dfa31ce492fa6" sha1="fea81c0d76b0f7c84798b9de72d9acc678226530"/> -->
- <!-- <rom name="Almathera Comms &amp; Networking CD (Europe).bin" size="248571120" crc="f9991efe" md5="cca00b0125a0f164b6bc73fb6339ee11" sha1="b4520eb166407bd00e54b9cbaf31212b3f54bc7a"/> -->
- <feature name="part_id" value="Almathera Comms &amp; Networking CD"/>
- <diskarea name="cdrom">
- <disk name="almathera comms &amp; networking cd (europe)" sha1="9996f33406c3c26b4e2be9d7f86d59156fdd48d0"/>
- </diskarea>
- </part>
-
- <part name="cdrom2" interface="cdrom">
- <!-- <category>Applications</category> -->
- <!-- http://redump.org/disc/18548/ -->
- <!-- <rom name="CDPD 1 (Europe).cue" size="81" crc="7e261a25" md5="961b2e9c6f18b5167fe713c0545ca9a2" sha1="f0e60c1c6f0b3a86494a7f46c676a36b363f9bcc"/> -->
- <!-- <rom name="CDPD 1 (Europe).bin" size="746776464" crc="30c57806" md5="43b45e0afd4a960359d0ed1ba9120ae7" sha1="4a743f0feba8e20040e3b1ff77c051e57f9222ff"/> -->
- <feature name="part_id" value="CDPD 1"/>
- <diskarea name="cdrom">
- <disk name="cdpd 1 (europe)" sha1="dcb79ff4d466778cc92d5ccd177f2c97ef7f1d02"/>
- </diskarea>
- </part>
-
- <part name="cdrom3" interface="cdrom">
- <!-- <category>Applications</category> -->
- <!-- http://redump.org/disc/18548/ -->
- <!-- <rom name="CDPD 2 (Europe).cue" size="81" crc="958c5298" md5="1f456742c84b59639360e5105b0a2205" sha1="9f8e7a02a6369833885d6bfdc75c9714378e1551"/> -->
- <!-- <rom name="CDPD 2 (Europe).bin" size="658442400" crc="a94c14cc" md5="73e3a9b78888aee9e9754793d797bfd1" sha1="57b63e986dd15ba49362e1ff02eabe4a754b412f"/> -->
- <feature name="part_id" value="CDPD 2"/>
- <diskarea name="cdrom">
- <disk name="cdpd 2 (europe)" sha1="9c3f2a0cb7933fd10694d80f75bb93fbab5c755e"/>
- </diskarea>
- </part>
-
- <part name="cdrom4" interface="cdrom">
- <!-- <category>Multimedia</category> -->
- <!-- http://redump.org/disc/18551/ -->
- <!-- <rom name="Demo 1 (Europe).cue" size="81" crc="0f256c23" md5="23d4594e745f3174e8b9b8ecfcac1f34" sha1="73317088554a3c8aa8b3ca5feaeb3ff63b062585"/> -->
- <!-- <rom name="Demo 1 (Europe).bin" size="708610560" crc="9ee5043f" md5="30d0e664799138e2c8d641b48d4192c0" sha1="42966b2d2f0ffd5540ec795861eb8b15f7076899"/> -->
- <feature name="part_id" value="Demo 1"/>
- <diskarea name="cdrom">
- <disk name="demo 1 (europe)" sha1="ef7c7c992fd7bc7fea080ec43357314999e6785b"/>
- </diskarea>
- </part>
-
- <part name="cdrom5" interface="cdrom">
- <!-- <category>Multimedia</category> -->
- <!-- http://redump.org/disc/18523/ -->
- <!-- <rom name="World Vista (Europe).cue" size="86" crc="74387a47" md5="2194ac62bf9b48f0608aac799428e47e" sha1="705c4eb8cdfadc98b66a924c0aadc15046b77875"/> -->
- <!-- <rom name="World Vista (Europe).bin" size="502789392" crc="b2113b15" md5="8ec646ed17c575139d644efcf1566fbd" sha1="5b71c5976c388dd7a6e870ca36840c7accd50701"/> -->
- <feature name="part_id" value="World Vista"/>
- <diskarea name="cdrom">
- <disk name="world vista (europe)" sha1="7b73c1ac1a25cc7b10b2a91b118dde3684128482"/>
- </diskarea>
- </part>
-
- <part name="cdrom6" interface="cdrom">
- <!-- <category>Educational</category> -->
- <!-- http://redump.org/disc/18522/ -->
- <!-- <rom name="Illustrated Works of Shakespeare (Europe).cue" size="107" crc="abb7e3a0" md5="0f3e783ca41909d10a74c9d45191f3d3" sha1="b2438bd35b8e60b2ebd2d3ef501e6b1d28eab6ef"/> -->
- <!-- <rom name="Illustrated Works of Shakespeare (Europe).bin" size="53214000" crc="29c9634c" md5="a6984256d64d0daad5423575a805b41e" sha1="bab8b78ce7c95da36b650394cfbc285af7726da0"/> -->
- <feature name="part_id" value="Illustrated Works of Shakespeare"/>
- <diskarea name="cdrom">
- <disk name="illustrated works of shakespeare (europe)" sha1="5e54c12eda0c560b48f96df7dfba53990a6cdeea"/>
- </diskarea>
- </part>
-
- <part name="cdrom7" interface="cdrom">
- <!-- <category>Multimedia</category> -->
- <!-- http://redump.org/disc/18521/ -->
- <!-- <rom name="Pandora's CD (Europe) (Alt).cue" size="93" crc="6685c80c" md5="8147396f05b2b7b17b55821d9678c982" sha1="620f0c1437e2ea13adf14baf3895fc55b5c988e5"/> -->
- <!-- <rom name="Pandora's CD (Europe) (Alt).bin" size="458738784" crc="ddb7e392" md5="e7740666bced9f7a96da85ad9b4d113f" sha1="adac7c881f641bfc4667fcf8e7469886906548ea"/> -->
- <feature name="part_id" value="Pandora's CD"/>
- <diskarea name="cdrom">
- <disk name="pandora's cd (europe) (alt)" sha1="488241b997f026533444b05e60357be3b5d78f41"/>
- </diskarea>
- </part>
-
- <part name="cdrom8" interface="cdrom">
- <!-- <category>Games</category> -->
- <!-- http://redump.org/disc/18520/ -->
- <!-- <rom name="Team Yankee (Europe) (Ten on Ten).cue" size="99" crc="606f0162" md5="8c173ad5d43a8447e924ce5075a7471c" sha1="62e5d539082c8d4796a8057577e6e59906193298"/> -->
- <!-- <rom name="Team Yankee (Europe) (Ten on Ten).bin" size="7079520" crc="de95d6f2" md5="efc8a6b9face11df7a53ba32c74bbb2a" sha1="713bd1aaefe59e15af61771abffde3c89b5b9d2c"/> -->
- <feature name="part_id" value="Team Yankee"/>
- <diskarea name="cdrom">
- <disk name="team yankee (europe) (ten on ten)" sha1="70e8946f4b161ca3011c523cb007180196762d8c"/>
- </diskarea>
- </part>
-
- <part name="cdrom9" interface="cdrom">
- <!-- <category>Multimedia</category> -->
- <!-- http://redump.org/disc/18519/ -->
- <!-- <rom name="Almathera Photo Library CD, The (Europe).cue" size="106" crc="68b31c99" md5="ea8423140d0209f04755a2505bef109f" sha1="1941996df3ce012770172fbc7f6552bd34b9503e"/> -->
- <!-- <rom name="Almathera Photo Library CD, The (Europe).bin" size="636801648" crc="75ecfbe4" md5="c1957cc3701c16379261420285f11677" sha1="dc1f8e27a0831476d694548fe1021c73974523c6"/> -->
- <feature name="part_id" value="The Almathera Photo Library CD"/>
- <diskarea name="cdrom">
- <disk name="almathera photo library cd, the (europe)" sha1="abcba2861161369b3394344792d491c85f6cb24d"/>
- </diskarea>
- </part>
-
- <part name="cdrom10" interface="cdrom">
- <!-- <category>Multimedia</category> -->
- <!-- http://redump.org/disc/18518/ -->
- <!-- <rom name="Almathera Clipart &amp; Fonts CD, The (Europe).cue" size="108" crc="78acde0b" md5="0440ed5c13780246105b0ea4b76ed7ca" sha1="d644a15e06b84a308dfee8e543d214d2ebadc0ea"/> -->
- <!-- <rom name="Almathera Clipart &amp; Fonts CD, The (Europe).bin" size="230662992" crc="89ab1b59" md5="efcc9acae92fe1cf7975c41c38ad30a1" sha1="039ab9c11793fd66ac74e34fbc44d138babfb666"/> -->
- <feature name="part_id" value="The Almathera Clipart &amp; Fonts CD"/>
- <diskarea name="cdrom">
- <disk name="almathera clipart &amp; fonts cd, the (europe)" sha1="dba531dac0190bd355b8a7cd4128355c3b077641"/>
- </diskarea>
- </part>
- </software>
-
</softwarelist>
diff --git a/hash/cgenie_cass.xml b/hash/cgenie_cass.xml
index 27b28d95b1a..005bc6ea4ea 100644
--- a/hash/cgenie_cass.xml
+++ b/hash/cgenie_cass.xml
@@ -2755,7 +2755,7 @@ is confirmed.
<!-- NF Error in 790 -->
<software name="numberupa" supported="no">
- <description>Numbers Up Shoot Out (Alt)</description>
+ <description>Numbers Up Shoot Out (alt)</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="author" value="Tony Hockney" />
diff --git a/hash/coco_cart.xml b/hash/coco_cart.xml
index 230c0e818dc..87ea6afb82f 100644
--- a/hash/coco_cart.xml
+++ b/hash/coco_cart.xml
@@ -388,7 +388,8 @@ Bearing off before all checkers are in last quadrant puts game in a non working
<description>Color LOGO</description>
<year>1983</year>
<publisher>Tandy</publisher>
- <info name="developer" value="Larry Kheriaty &amp; George Gerhold" />
+ <info name="developer" value="Larry Kheriaty" />
+ <info name="developer" value="George Gerhold" />
<info name="serial" value="26-2722" />
<part name="cart" interface="coco_cart">
<dataarea name="rom" size="8192">
@@ -403,7 +404,8 @@ Bearing off before all checkers are in last quadrant puts game in a non working
<year>1983</year>
<publisher>Tandy</publisher>
<!-- MicroPi and Socatra -->
- <info name="developer" value="Larry Kheriaty &amp; George Gerhold" />
+ <info name="developer" value="Larry Kheriaty" />
+ <info name="developer" value="George Gerhold" />
<info name="serial" value="26-8722" />
<info name="language" value="French" />
<part name="cart" interface="coco_cart">
@@ -1294,7 +1296,8 @@ Laggy keyboard presses (verify)
<description>Super LOGO</description>
<year>1984</year>
<publisher>Tandy</publisher>
- <info name="developer" value="Larry Kheriaty &amp; George Gerhold" />
+ <info name="developer" value="Larry Kheriaty" />
+ <info name="developer" value="George Gerhold" />
<info name="serial" value="26-2717" />
<part name="cart" interface="coco_cart">
<dataarea name="rom" size="16384">
diff --git a/hash/coco_flop.xml b/hash/coco_flop.xml
index a8956655472..292f63cf5d5 100644
--- a/hash/coco_flop.xml
+++ b/hash/coco_flop.xml
@@ -22,7 +22,7 @@ license:CC0-1.0
</software>
<!-- coco3 only requires 512Kb, run best with a 6309? - coco3h driver) -->
- <software name="dkong" supported ="partial">
+ <software name="dkong" supported="partial">
<description>Donkey Kong (Sock Master's Donkey Kong Emulator for CoCo 3) (512Kb)</description>
<year>2007</year>
<publisher>Sock Master</publisher>
@@ -37,7 +37,7 @@ license:CC0-1.0
</software>
<!-- coco3 only requires 512Kb, run best with a 6309? - coco3h driver) -->
- <software name="dkremix" supported ="partial">
+ <software name="dkremix" supported="partial">
<description>Donkey Kong Remix (Sock Master's Donkey Kong Remix Emulator for CoCo 3) (512Kb)</description>
<year>2015</year>
<publisher>Sock Master</publisher>
@@ -52,7 +52,7 @@ license:CC0-1.0
</software>
<!-- coco3 only requires 512Kb, run best with a 6309? - coco3h driver) -->
- <software name="pacman" supported ="partial">
+ <software name="pacman" supported="partial">
<description>Pacman (z80 to 6809 Transcoded - v1.01) (512kb)</description>
<year>2017</year>
<publisher>Glen Hewlett</publisher>
@@ -67,7 +67,7 @@ license:CC0-1.0
</software>
<!-- coco3 only requires 512Kb, run best with a 6309? - coco3h driver) -->
- <software name="joust" supported ="partial">
+ <software name="joust" supported="partial">
<description>Joust (6809 Transcoded - v1.10) (512kb)</description>
<year>2021</year>
<publisher>Glen Hewlett</publisher>
diff --git a/hash/coleco.xml b/hash/coleco.xml
index fcca8b47398..2fc3312c901 100644
--- a/hash/coleco.xml
+++ b/hash/coleco.xml
@@ -1244,7 +1244,7 @@ license:CC0-1.0
<!-- This was found in multiple carts with Coleco-style shell, both from USA, Euro and Canada -->
<software name="pitstop">
<!-- Pitstop (1983)(Epyx)[a].bin -->
- <description>Pitstop (Euro, USA, Canada)</description>
+ <description>Pitstop (Europe, USA, Canada)</description>
<year>1983</year>
<publisher>Epyx</publisher>
<info name="serial" value="600" />
@@ -2344,7 +2344,7 @@ license:CC0-1.0
<software name="victory">
<!-- Victory (1983)(Coleco).bin -->
<!-- 0x5000-0x5fff : Filled with 0xff -->
- <description>Victory (Euro)</description>
+ <description>Victory (Europe)</description>
<year>1983</year>
<publisher>CBS</publisher>
<info name="developer" value="Exidy" />
@@ -2567,7 +2567,7 @@ license:CC0-1.0
<!-- The dump with title "Super Action Soccer" is likely hacked -->
<software name="safootb">
<!-- Super Action Football (1984)(Coleco)[a].bin -->
- <description>Super Action Football (Euro)</description>
+ <description>Super Action Football (Europe)</description>
<year>1984</year>
<publisher>Coleco / CBS</publisher>
<info name="serial" value="2422" />
@@ -2631,6 +2631,17 @@ license:CC0-1.0
</part>
</software>
+ <software name="adamusic">
+ <description>Adam's Musicbox Demo</description>
+ <year>1987</year>
+ <publisher>Coleco</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="24576">
+ <rom name="adams-musicbox-demo.rom" size="24576" crc="164c8c26" sha1="9ef2974a04f5982bd034f39d1741666b6d117d24" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bbears">
<!-- Berenstain Bears, The (1984)(Coleco)(proto).bin -->
<description>The Berenstain Bears (prototype)</description>
@@ -2736,6 +2747,19 @@ license:CC0-1.0
</part>
</software>
+ <!-- Apparently for use in children's play areas of Canadian nuclear power plants -->
+ <software name="energyq">
+ <description>Energy Quiz (limited release)</description>
+ <year>1983</year>
+ <publisher>Sydney Development Corporation</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <!-- second half empty, overdump? -->
+ <rom name="energy-quiz.rom" size="32768" crc="afb90dcd" sha1="9bd47f0b288612e85224c9bda093b12f0b5bff36" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mindmstr">
<!-- Escape from the Mind Master (1983)(Epyx)(proto).bin -->
<description>Escape from the Mindmaster (prototype)</description>
diff --git a/hash/coleco_homebrew.xml b/hash/coleco_homebrew.xml
index 8429a4c0734..33b5c5d487d 100644
--- a/hash/coleco_homebrew.xml
+++ b/hash/coleco_homebrew.xml
@@ -69,6 +69,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="airbattl">
+ <description>Air Battle</description>
+ <year>2000</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <info name="version" value="v0.4" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="23808">
+ <rom name="Air Battle V0.4 by Daniel Bienvenu (July 10) (2000) (PD).rom" size="23808" crc="7c66aba6" sha1="b3f191439440e9682183e703f9018f29fd1355f0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="antiair">
<description>AntiAir</description>
<year>2024</year>
@@ -125,6 +137,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="bagman">
+ <description>Bagman</description>
+ <year>2015</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Jean-Michel Girad" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32767">
+ <rom name="bagman.rom" size="32767" crc="673bdb9d" sha1="359516da9459fb743a15f21febbb01c5230f0c6d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bankpanc">
<description>Bank Panic</description>
<year>2011</year>
@@ -147,6 +171,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="batthoth">
+ <description>Battle of Hoth</description>
+ <year>2013</year>
+ <publisher>Team Pixelboy</publisher>
+ <info name="author" value="Jean-Philippe Meola" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="battle-of-hoth.rom" size="32768" crc="b2ef6386" sha1="e6c80b2de7a5a0a05c1a3289c6ad9498bc62e52c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="battlot">
<description>Battlot</description>
<year>2022</year>
@@ -180,6 +216,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="bejeweld_01" cloneof="bejeweld">
+ <description>Bejeweled (v2001)</description>
+ <year>2001</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="16640">
+ <rom name="bejeweled.rom" size="16640" crc="1ba0688f" sha1="031dc3902f6880e3b6ca043c74de6ba1f306237c" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="blackonx">
<description>The Black Onyx</description>
<year>2013</year>
@@ -192,6 +239,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="bombjack">
+ <description>Bomb Jack</description>
+ <year>2015</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32174">
+ <rom name="bomb-jack.rom" size="32174" crc="a399d4cd" sha1="63dedc954851761c55eedbb05d51dc4b8bdb23c1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="boomboy">
<description>Booming Boy</description>
<year>2019</year>
@@ -204,6 +263,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="boothill">
+ <description>Boot Hill</description>
+ <year>2018</year>
+ <publisher>Leo Brophy</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="boot-hill.rom" size="32768" crc="59e22170" sha1="b7a78920fa37177dc5f9a1105961ded4bd58e832" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="bootskel">
<description>Bootskell</description>
<year>2022</year>
@@ -231,6 +301,7 @@ Unoffical software releases for the Coleco Colecovision
<description>Breakout</description>
<year>1999</year>
<publisher>Amy Marie Bienvenu</publisher>
+ <info name="language" value="French" />
<part name="cart" interface="coleco_cart">
<dataarea name="rom" size="13696">
<rom name="breakout-1999.rom" size="13696" crc="b05fb3ec" sha1="2b25dc2ea0e2791662209537590886598b7ec85c" />
@@ -251,6 +322,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="bunny">
+ <description>Bunny</description>
+ <year>20??</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="4096">
+ <rom name="bunny.rom" size="4096" crc="fd27e856" sha1="7cdb1b050f3ef25ab048ee1d64e99f1c5493fbea" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="burnrubb">
<description>Burn Rubber</description>
<year>2012</year>
@@ -262,6 +344,28 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="bustinv1">
+ <description>BUsTin-Out Volume 1</description>
+ <year>2000</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="BUsTin-Out Volume 1 by Daniel Bienvenu (2000) (PD).rom" size="32768" crc="97b601a2" sha1="d12f48fa0352c57deeb4aec9790f6af2ab50afca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bustinv2">
+ <description>BUsTin-Out Volume 2</description>
+ <year>2000</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32640">
+ <rom name="BUsTin-Out Volume 2 by Daniel Bienvenu (2000) (PD).rom" size="32640" crc="e12ccc1e" sha1="de429b3e17d1dd8f3c3172490de669b10a89a3e5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="canmini">
<description>Canadian Mini Games</description>
<year>2008</year>
@@ -331,6 +435,29 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="chackpop">
+ <description>Chack'n Pop</description>
+ <year>2011</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="chackn-pop.rom" size="32768" crc="c1366313" sha1="8448feff0a21037eb22dd968ab57d3312b153de0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chatdrag">
+ <description>Le Château du Dragon</description>
+ <year>2001</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <info name="language" value="French" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="9088">
+ <rom name="Chateau du Dragon by Daniel Bienvenu (2001) (PD).rom" size="9088" crc="43478adf" sha1="0029fe15165165e95db2a5702cb162c770170637" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="childotn">
<description>Children of the Night</description>
<year>2018</year>
@@ -367,6 +494,40 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="comicbak">
+ <description>Comic Bakery</description>
+ <year>2014</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="usage" value="supports Super Game Module for better sound" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="27925">
+ <rom name="comic-bakery.rom" size="27925" crc="8884bac2" sha1="41648df0159ffc63e812213abd11dbe8e598adf7" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="comretrn">
+ <description>Commando Returns (demo)</description>
+ <year>20??</year>
+ <publisher>Michel Louvet</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="18014">
+ <rom name="CommandoWIP.rom" size="18014" crc="e97a69e1" sha1="2ad1b4ff8d6f8c2cb086530807391c4b4d599619" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cosmoch">
+ <description>Cosmo Challenge</description>
+ <year>1997</year>
+ <publisher>Marcel de Kogel</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="21632">
+ <rom name="cosmo-challenge.rom" size="21632" crc="43933306" sha1="d9adaae3ff8dce384c00790999f2fd1f9b29213e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="cracky">
<description>Cracky</description>
<year>2023</year>
@@ -400,6 +561,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <!-- Press 0 for Cheat Menu -->
+ <software name="csoa">
+ <description>C-So! (with Cheat Menu)</description>
+ <year>2018</year>
+ <publisher>Team Pixelboy</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32676">
+ <rom name="c-so-cheats.rom" size="32676" crc="7809de10" sha1="f8a4207a0c9b6dd52d60bdb4587ad95e1965810d" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dacman">
<description>DacMan</description>
<year>2000</year>
@@ -423,6 +596,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="deathrac">
+ <description>Death Race</description>
+ <year>2004</year>
+ <publisher>Dav</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="3936">
+ <rom name="death-race.rom" size="3936" crc="ff4964b1" sha1="9f97a9594b39fdc32e530c18ba14f75852efc61e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="deepdung">
<description>Deep Dungeon Adventure</description>
<year>2017</year>
@@ -470,6 +654,28 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="digger">
+ <description>Digger</description>
+ <year>2015</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="24576">
+ <rom name="digger.rom" size="24576" crc="77088cab" sha1="01c9ba078dbbdb8958e9800d06740d063080f44a" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dblbrout">
+ <description>Double Breakout</description>
+ <year>2001</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="doublebreakout_23_03_2001.rom" size="32768" crc="1229e811" sha1="699915e4158b2c3d127e5924a14146a3c71d6a8e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="dlairs">
<description>Dragon's Lair</description>
<year>2012</year>
@@ -483,6 +689,30 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="dungeon">
+ <description>Dungeon and Trolls</description>
+ <year>2014</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="30187">
+ <rom name="dungeon-and-trolls.rom" size="30187" crc="a227fdaa" sha1="8f2ad6a7abe91ae98304c4cad1ea5295ad31d1ab" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elevator">
+ <description>Elevator Action</description>
+ <year>2019</year>
+ <publisher>Opcode Games</publisher>
+ <info name="usage" value="req. Super Game Module" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="elevator_action.rom" size="32768" crc="cf4bdc75" sha1="499a1731ea16092a4ef2651edc25f08a69d30fa5" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="flapbird">
<description>Flapee Byrd</description>
<year>2014</year>
@@ -505,13 +735,39 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <!-- Might be identical to the 2013 cartridge release -->
<software name="flora">
<description>Flora and the Ghost Mirror</description>
- <year>2012</year>
- <publisher>Amy Marie Bienvenu</publisher>
+ <year>2016</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Amy Marie Bienvenu" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="flora-and-the-ghost-mirror-2016.col" size="32768" crc="fd69012b" sha1="40e85b474db95076186ceaf89f1e259dd929b5ce" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="florarom">
+ <description>Flora and the Ghost Mirror (ROM File Edition)</description>
+ <year>2013</year>
+ <publisher>NewColeco</publisher>
+ <info name="author" value="Amy Marie Bienvenu" />
<part name="cart" interface="coleco_cart">
<dataarea name="rom" size="30638">
- <rom name="flora-and-the-ghost-mirror-2012.rom" size="30638" crc="2f7fdc2b" sha1="845f23b15763f92a4dfca95189bae691eb1c2d16" />
+ <rom name="flora-and-the-ghost-mirror-2013.rom" size="30638" crc="2f7fdc2b" sha1="845f23b15763f92a4dfca95189bae691eb1c2d16" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- A final version was never released -->
+ <software name="frantic">
+ <description>Frantic (demo)</description>
+ <year>2008</year>
+ <publisher>Scott Huggins</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32640">
+ <rom name="frantic.rom" size="32640" crc="f43b0b28" sha1="8a81e9b854e7f7fd5d4419cc9716d03ac2cfe023" />
</dataarea>
</part>
</software>
@@ -575,8 +831,19 @@ Unoffical software releases for the Coleco Colecovision
</software>
<software name="ghostbla">
- <description>Ghostblaster</description>
- <year>2006</year>
+ <description>Ghostblaster (rev. B)</description>
+ <year>2009</year>
+ <publisher>Amy Marie Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32563">
+ <rom name="gb_pal_20100311.rom" size="32563" crc="cf4ed5e0" sha1="7f2e577f2144e1a457d0f65500a2370566ee8b56" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ghostbla_a" cloneof="ghostbla">
+ <description>Ghostblaster (rev. A)</description>
+ <year>2009</year>
<publisher>Amy Marie Bienvenu</publisher>
<part name="cart" interface="coleco_cart">
<dataarea name="rom" size="32658">
@@ -644,6 +911,20 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <!-- There is also a newer 2023 version -->
+ <software name="gradius">
+ <description>Gradius</description>
+ <year>2016</year>
+ <publisher>Opcode Games</publisher>
+ <info name="usage" value="req. Super Game Module" />
+ <part name="cart" interface="coleco_cart">
+ <feature name="slot" value="sgc_1mbit" />
+ <dataarea name="rom" size="131072">
+ <rom name="gradius.rom" size="131072" crc="30d337e4" sha1="20a3204faf796fe8284eab0e47cb17738219c999" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gulkave">
<description>Gulkave</description>
<year>2010</year>
@@ -678,6 +959,29 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="haunted">
+ <description>Haunted Caves</description>
+ <year>2013</year>
+ <publisher>Nicam Shilova</publisher>
+ <info name="author" value="Nicolas Campion" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="10881">
+ <rom name="haunted-caves.rom" size="10881" crc="359f0ae5" sha1="4deb349f4205b8efffd4e7325b76aa00b7c4d32d" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="helifire">
+ <description>HeliFire</description>
+ <year>2013</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="15385">
+ <rom name="helifire.rom" size="15385" crc="9b891703" sha1="11f56bac3f01d4e1238639549a7035ccdda28f89" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="heroes">
<description>Heroes Arena</description>
<year>2017</year>
@@ -758,6 +1062,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="jumpdie">
+ <description>Jump or Die</description>
+ <year>2006</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="2688">
+ <rom name="jump-or-die.rom" size="2688" crc="f403fe04" sha1="aabca82c56bfb2c0587022ea87402fde75a42da9" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kaboom">
<description>Kaboom!</description>
<year>2017</year>
@@ -780,6 +1095,28 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="killbarn">
+ <description>Kill Barney in Tokyo</description>
+ <year>1997</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="9494">
+ <rom name="kill-barney-in-tokyo.rom" size="9494" crc="d905c94b" sha1="50a1be08f8cd5445ee32c1702a3d3607948867b6" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="killinst">
+ <description>Killer Instinct</description>
+ <year>1997</year>
+ <publisher>Daniel Bienvenu</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="9494">
+ <rom name="killer-instinct.rom" size="9494" crc="58f10c63" sha1="40324590797f32915021cfd0d6eb4112020939bf" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="kingball">
<description>King &amp; Balloon</description>
<year>2018</year>
@@ -886,6 +1223,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="labbaye">
+ <description>L'Abbaye des Morts</description>
+ <year>2019</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <feature name="slot" value="megacart" />
+ <dataarea name="rom" size="131072">
+ <rom name="l-abbaye-des-morts.rom" size="131072" crc="b11a6d23" sha1="ff22b90913f58885709c93981a3d0622b01172a1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="lift">
<description>Lift</description>
<year>2022</year>
@@ -897,6 +1246,42 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="lightgrd">
+ <description>Light Grid Racing</description>
+ <year>2015</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Todd Spangler" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="light-grid-racing.rom" size="32768" crc="1e37ec6a" sha1="5b1d0f3e36a2eec303808acccb24ba2969326467" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="locknch">
+ <description>Lock'n Chase</description>
+ <year>2012</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="31873">
+ <rom name="lock-n-chase.rom" size="31873" crc="6bc9a350" sha1="216413aa1175392155e6424904d780d2b077f4ef" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- There is also a newer, updated release by CollectorVision Games -->
+ <software name="loderun">
+ <description>Lode Runner</description>
+ <year>2002</year>
+ <publisher>Steve Begin</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="lode-runner.rom" size="32768" crc="a2128f74" sha1="ac27b0756f72931dc17f6b44cf7b4cfff6565634" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="magicalt">
<description>Magical Tree</description>
<year>2006</year>
@@ -977,6 +1362,19 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="mecha8">
+ <description>Mecha 8</description>
+ <year>2013</year>
+ <publisher>Team Pixelboy</publisher>
+ <info name="author" value="Óscar Toledo Gutiérrez" />
+ <part name="cart" interface="coleco_cart">
+ <feature name="slot" value="megacart" />
+ <dataarea name="rom" size="131072">
+ <rom name="mecha-8-2013.rom" size="131072" crc="53da40bc" sha1="91ba9d9b13298e8c65f0592e512020e84d99f2bc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mecha9">
<description>Mecha 9</description>
<year>2016</year>
@@ -989,6 +1387,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="mieyen">
+ <description>Mieyen</description>
+ <year>2025</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="8361">
+ <rom name="mieyen.rom" size="8361" crc="f47e5bf5" sha1="bf868509223450b5f49fe06a8cdc6ee9fc7ee534" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mikie">
<description>Mikie</description>
<year>2021</year>
@@ -1099,6 +1508,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="nibbli">
+ <description>Nibbli: Son of Nibbler</description>
+ <year>2014</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="22308">
+ <rom name="nibbli.rom" size="22308" crc="be4b3385" sha1="2afd54cd0e5f4f7ad13fb0e163de1ad5dfbcdcbe" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="ninjapr">
<description>Ninja Princess</description>
<year>2011</year>
@@ -1133,6 +1554,28 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="osotos">
+ <description>Osotos</description>
+ <year>2024</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="9398">
+ <rom name="osotos.rom" size="9398" crc="8c5b9d1f" sha1="7b6b2a2f75c30cd07b56d03d11f8022748abddc8" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ozmawars">
+ <description>Ozma Wars</description>
+ <year>2011</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="21625">
+ <rom name="ozma-wars.col" size="21625" crc="4aafdc07" sha1="2dd4d54ef119f081ffb68a518c7e80923c7258ab" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pacar">
<description>Pacar</description>
<year>2017</year>
@@ -1156,6 +1599,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="pang">
+ <description>Pang</description>
+ <year>2012</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32558">
+ <rom name="pang.rom" size="32558" crc="18aced43" sha1="35d2c6718562ff094e32b076e32ff97bfbb496b6" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="peekaboo">
<description>Peek-A-Boo</description>
<year>2010</year>
@@ -1178,6 +1633,25 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <!--
+ This is a "fixed" version. The common available dump with a crc32 of 0x6831ad48
+ appears to have a bit error - It sets an error flag when the memory test succeeds
+ instead of when it fails. Other emulators run the game because they force the SGM
+ to be always on in case of an SGC game. Location 0x3bd6 was changed from 0x28 to 0x20.
+ -->
+ <software name="pengadv">
+ <description>Penguin Adventure</description>
+ <year>2016</year>
+ <publisher>Opcode Games</publisher>
+ <info name="usage" value="req. Super Game Module" />
+ <part name="cart" interface="coleco_cart">
+ <feature name="slot" value="sgc_1mbit" />
+ <dataarea name="rom" size="131072">
+ <rom name="penguin-adventure-fixed.rom" size="131072" crc="efe6a1a5" sha1="122027d4ffdb4fd9a96f783210e8b43b7f8c91a3" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pillars">
<description>Pillars</description>
<year>2021</year>
@@ -1189,6 +1663,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="pippols">
+ <description>Pippols</description>
+ <year>2014</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="pippols.col" size="32768" crc="28d04775" sha1="a26399c4359e18abaa5b796368a3b18c2ec729c1" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pitfall2">
<description>Pitfall II Arcade</description>
<year>2010</year>
@@ -1256,6 +1741,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="puzzli">
+ <description>Puzzli</description>
+ <year>2011</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32061">
+ <rom name="puzzli.rom" size="32061" crc="58f53b6e" sha1="088125ea4dcda47374b93cacdcbc3d06f4524395" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="pyrbatt2">
<description>Pyramid Warp + Battle Ship Clapton II</description>
<year>2009</year>
@@ -1291,6 +1788,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="quizwiz">
+ <description>Quiz Wiz</description>
+ <year>20??</year>
+ <publisher>Michel Louvet</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="13288">
+ <rom name="quizwiz.rom" size="13288" crc="1beb45b5" sha1="89753ab9ba96b82a65e470b61c26510182df0f60" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="rallyx">
<description>Rally-X</description>
<year>2016</year>
@@ -1325,6 +1833,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="ripcord">
+ <description>Rip Cord</description>
+ <year>2017</year>
+ <publisher>CollectorVision Games</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="rip-cord.rom" size="32768" crc="60312b4e" sha1="07700ccb5b1f18e978695a0290ee1053f863a84e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="roadfigh">
<description>Road Fighter</description>
<year>2007</year>
@@ -1347,13 +1866,57 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="search1">
+ <description>Search for the Stolen Crown Jewels 1 (demo)</description>
+ <year>2006</year>
+ <publisher>Phillipp Klaus Krause</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="29013">
+ <rom name="SCJDemo.rom" size="29013" crc="e339d9cc" sha1="1e2e883604e3b8559bd36c88313567dabd8444ac" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="search2">
+ <description>Search for the Stolen Crown Jewels 2 (demo)</description>
+ <year>2007</year>
+ <publisher>Phillipp Klaus Krause</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="29256">
+ <rom name="SCJ2Demo.rom" size="29256" crc="eaf7d6dc" sha1="0d144f191629570213694fd63b54e651338c89e3" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="search3">
- <description>Search for the Stolen Crown Jewels 3 (Demo)</description>
- <year>2013</year>
- <publisher>Good Deal Games</publisher>
+ <description>Search for the Stolen Crown Jewels 3 (demo v2011)</description>
+ <year>2011</year>
+ <publisher>Phillipp Klaus Krause</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="31249">
+ <rom name="SCJ3Demo.rom" size="31249" crc="81a8def4" sha1="6a8ac08fac29d535aaffae31b776c1a85c8e8e19" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="search3_d08" cloneof="search3">
+ <description>Search for the Stolen Crown Jewels 3 (demo v2008)</description>
+ <year>2008</year>
+ <publisher>Phillipp Klaus Krause</publisher>
<part name="cart" interface="coleco_cart">
<dataarea name="rom" size="31303">
- <rom name="search-for-the-stolen-crown-jewels-3-2013.rom" size="31303" crc="23988ef9" sha1="19c574aa12ce727e7d620f0c9a38864cc1f13e9e" />
+ <rom name="search-for-the-stolen-crown-jewels-3-demo.rom" size="31303" crc="23988ef9" sha1="19c574aa12ce727e7d620f0c9a38864cc1f13e9e" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="search3_d08a" cloneof="search3">
+ <description>Search for the Stolen Crown Jewels 3 (demo v2008, alt)</description>
+ <year>2008</year>
+ <publisher>Phillipp Klaus Krause</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="31229">
+ <rom name="search-for-the-stolen-crown-jewels-3-demo-alt.rom" size="31229" crc="594b1235" sha1="7102fd7a776ec16c4dd93b6e4caf729e6db4156f" />
</dataarea>
</part>
</software>
@@ -1475,7 +2038,7 @@ Unoffical software releases for the Coleco Colecovision
</software>
<software name="spacesha" cloneof="spacesh">
- <description>Space Shuttle: A Journey Into Space (64k)</description>
+ <description>Space Shuttle: A Journey Into Space (64K)</description>
<year>2022</year>
<publisher>Team Pixelboy</publisher>
<info name="usage" value="req. Super Game Module" />
@@ -1487,6 +2050,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="spectar">
+ <description>Spectar</description>
+ <year>2006</year>
+ <publisher>AtariAge</publisher>
+ <info name="author" value="Scott Huggins" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="32768">
+ <rom name="spectar.rom" size="32768" crc="a3aaae47" sha1="ebb8fca04ec429413ba6185cd7344d0cf79dacdc" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="spelunk">
<description>Spelunker</description>
<year>2015</year>
@@ -1534,6 +2109,18 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="starcom">
+ <description>Starcom</description>
+ <year>2012</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Michel Louvet" />
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="28407">
+ <rom name="starcom.rom" size="28407" crc="02810be5" sha1="7f8c255f1996f645530dd84b40b71fc8f1e16545" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="starfire">
<description>Star Fire</description>
<year>2021</year>
@@ -1651,6 +2238,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="sudokuo">
+ <description>Sudoku (2008)</description>
+ <year>2008</year>
+ <publisher>Luc Miron</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="10496">
+ <rom name="sudoku-2008.rom" size="10496" crc="2aa3abb2" sha1="499c9746f0dacab59a3fb23f80169df34cfbb91a" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="superpac">
<description>Super Pac-Man</description>
<year>2016</year>
@@ -1675,6 +2273,30 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="svellas">
+ <description>Svellas</description>
+ <year>2025</year>
+ <publisher>Inufuto</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="9259">
+ <rom name="svellas.rom" size="9259" crc="3244546f" sha1="366dbc7552fd0a9e13b88a95b74141e81e0114ec" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tankmis">
+ <description>Tank Mission</description>
+ <year>2017</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Leo Gerald Brophy" />
+ <part name="cart" interface="coleco_cart">
+ <feature name="slot" value="megacart" />
+ <dataarea name="rom" size="262144">
+ <rom name="tank-mission.rom" size="262144" crc="d0f37969" sha1="86963e9064a87691e410dda6e08ecb96f677c188" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="thexder">
<description>Thexder</description>
<year>2012</year>
@@ -1688,6 +2310,17 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="tictac">
+ <description>Tic Tac Toe</description>
+ <year>1996</year>
+ <publisher>Norman Nithman</publisher>
+ <part name="cart" interface="coleco_cart">
+ <dataarea name="rom" size="3220">
+ <rom name="tic-tac-toe.col" size="3220" crc="969d77c8" sha1="3fe5477166f1809e50754bd3d153e10764c3ad4e" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="trackfld">
<description>Track &amp; Field</description>
<year>2010</year>
@@ -1771,6 +2404,19 @@ Unoffical software releases for the Coleco Colecovision
</part>
</software>
+ <software name="vanguard">
+ <description>Vanguard</description>
+ <year>2019</year>
+ <publisher>CollectorVision Games</publisher>
+ <info name="author" value="Chris Derrig" />
+ <part name="cart" interface="coleco_cart">
+ <feature name="slot" value="megacart" />
+ <dataarea name="rom" size="131072">
+ <rom name="vanguard.rom" size="131072" crc="a7a8d25e" sha1="1feea815f254b9c165397d92de4dc4f0ecbbf9c7" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="vexed">
<description>Vexed</description>
<year>2021</year>
diff --git a/hash/cpc_cass.xml b/hash/cpc_cass.xml
index abf68de247b..9bb7c26f465 100644
--- a/hash/cpc_cass.xml
+++ b/hash/cpc_cass.xml
@@ -449,6 +449,8 @@ Please stick to using the floppy versions for the time being...
<description>3D Boxing (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="James Software" />
+ <info name="serial" value="SOFT 06025" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="3D Boxkampf" />
<part name="cass1" interface="cpc_cass">
@@ -489,6 +491,8 @@ Please stick to using the floppy versions for the time being...
<description>3D Fight (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Juillet 1985" />
+ <info name="serial" value="070" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="48531">
@@ -501,6 +505,8 @@ Please stick to using the floppy versions for the time being...
<description>3D Grand Prix (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Exopal" />
+ <info name="serial" value="SOFT 961" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="59311">
@@ -573,6 +579,8 @@ Please stick to using the floppy versions for the time being...
<description>3D Stunt Rider (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="DJL Software" />
+ <info name="serial" value="SOFT 183" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Cascadeur 3D" />
<part name="cass1" interface="cpc_cass">
@@ -598,6 +606,8 @@ Please stick to using the floppy versions for the time being...
<description>3D-Invaders (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Quark Data" />
+ <info name="serial" value="SOFT 136" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Le 3eme Dimension, Invasores" />
<part name="cass1" interface="cpc_cass">
@@ -623,6 +633,8 @@ Please stick to using the floppy versions for the time being...
<description>3D-Sub (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="developer" value="Novasoft" />
+ <info name="notice" value="Copyright LORICIELS Novembre 1985" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41785">
@@ -647,6 +659,7 @@ Please stick to using the floppy versions for the time being...
<description>4 Game Pack No. 1 (UK)</description>
<year>1991</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 427" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="96487">
@@ -664,6 +677,7 @@ Please stick to using the floppy versions for the time being...
<description>4 Game Pack No. 2 (UK)</description>
<year>1992</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 428" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="86842">
@@ -681,6 +695,7 @@ Please stick to using the floppy versions for the time being...
<description>4 Game Pack No. 3 (UK)</description>
<year>1992</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 429" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="91204">
@@ -799,7 +814,8 @@ Please stick to using the floppy versions for the time being...
<software name="500ccgp" supported="no">
<description>500cc Grand Prix (UK)</description>
<year>1986</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds</publisher>
+ <info name="serial" value="UQK 710" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="84380">
@@ -809,9 +825,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="5axe" supported="no">
- <description>Le 5eme Axe (France)</description>
+ <description>Le 5ème Axe (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Novembre 1985" />
+ <info name="serial" value="102" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="22015">
@@ -915,6 +933,7 @@ Please stick to using the floppy versions for the time being...
<description>A 320 (France)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="Copyright LORICIELS SEPTEMBRE 1988" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<!-- According to CPC-Power faces 1a and 1b are identical -->
<part name="cass1" interface="cpc_cass">
@@ -1227,6 +1246,8 @@ Please stick to using the floppy versions for the time being...
<description>Admiral Graf Spee (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Temptation Software" />
+ <info name="serial" value="SOFT 146" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Almirante Graf Spee" />
<part name="cass1" interface="cpc_cass">
@@ -1240,6 +1261,7 @@ Please stick to using the floppy versions for the time being...
<description>Admiral Graf Spee (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="serial" value="AMC-118" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Almirante Graf Spee" />
<part name="cass1" interface="cpc_cass">
@@ -1250,9 +1272,9 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="ads" supported="no">
- <description>Advanced Destroyer Simulator (Spain)</description>
+ <description>A.D.S. - Advanced Destroyer Simulator (Spain)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Futura / Proein Soft Line</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="53253">
@@ -1471,6 +1493,8 @@ Please stick to using the floppy versions for the time being...
<description>L'Aigle d'Or (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Avril 1986" />
+ <info name="serial" value="126" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="52958">
@@ -1485,9 +1509,9 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="airtraff" supported="no">
- <description>Air Traffic Control (UK)</description>
+ <description>Heathrow International Air Traffic Control (UK)</description>
<year>1984</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="15571">
@@ -1532,6 +1556,8 @@ Please stick to using the floppy versions for the time being...
<description>Airwolf (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Elite Systems" />
+ <info name="serial" value="SOFT 06011" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="39316">
@@ -1544,6 +1570,8 @@ Please stick to using the floppy versions for the time being...
<description>Airwolf (UK, alt)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Elite Systems" />
+ <info name="serial" value="SOFT 06011" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="58537">
@@ -1636,9 +1664,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="higpool" supported="no">
- <description>Alex Higgins World Pool (UK)</description>
+ <description>Alex Higgins' World Pool (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 964" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="35838">
@@ -1648,9 +1678,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="higsnook" supported="no">
- <description>Alex Higgins World Snooker (UK)</description>
+ <description>Alex Higgins' World Snooker (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 978" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="35611">
@@ -1687,6 +1719,8 @@ Please stick to using the floppy versions for the time being...
<description>Alien (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Argus Press Software" />
+ <info name="serial" value="SOFT 956" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="53323">
@@ -1723,8 +1757,10 @@ Please stick to using the floppy versions for the time being...
<description>Alien Break-In (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Romik Software" />
+ <info name="serial" value="SOFT 137" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
- <info name="alt_title" value="Les Envahisseurs De L'Au Dela" />
+ <info name="alt_title" value="Les Envahisseurs de l'Au-Dela" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="18199">
<rom name="alien break-in (uk) (1985) [original] [tape].cdt" size="18199" crc="66b31cff" sha1="3ec0b3845a386db81708673e34b8c96a50039bd8"/>
@@ -1855,6 +1891,8 @@ Please stick to using the floppy versions for the time being...
<description>Alpine Games (UK)</description>
<year>1987</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="Barry Jones" />
+ <info name="serial" value="AT 406X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="63535">
@@ -2098,6 +2136,8 @@ Please stick to using the floppy versions for the time being...
<description>American Football (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Argus Press Software" />
+ <info name="serial" value="SOFT 901" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="37207">
@@ -2160,9 +2200,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="amlettre" cloneof="easiaw" supported="no">
- <description>Amlettres (France)</description>
+ <description>Amlettres - Traitement de Textes (France)</description>
<year>1984</year>
<publisher>Amsoft France</publisher>
+ <info name="developer" value="Juniper Computing" />
+ <info name="serial" value="SOFT 454" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="25073">
@@ -2201,9 +2243,10 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="amsbase" supported="no">
- <description>Amsbase (Spain)</description>
+ <description>Amsbase - Base de Datos (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="serial" value="S-501" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="17181">
@@ -2242,6 +2285,8 @@ Please stick to using the floppy versions for the time being...
<description>AmsGolf (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Computersmith" />
+ <info name="serial" value="SOFT 185" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="40046">
@@ -2345,6 +2390,7 @@ Please stick to using the floppy versions for the time being...
<description>Amstest</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="serial" value="SOFT 06017" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="7494">
@@ -2537,9 +2583,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="amstroid" supported="no">
- <description>Amstroid (France)</description>
+ <description>Amstroïd (France)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Pietro Pancino" />
+ <info name="serial" value="CP 005" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="59308">
@@ -2587,7 +2635,7 @@ Please stick to using the floppy versions for the time being...
<software name="anarchy" supported="no">
<description>Anarchy (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="40222">
@@ -2693,9 +2741,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="avm" supported="no">
- <description>Animal / Vegetable / Mineral (UK)</description>
+ <description>Animal, Vegetable, Mineral (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 104" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="21391">
@@ -2705,7 +2755,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="avmf" cloneof="avm" supported="no">
- <description>Animal / Vegetal / Mineral (France)</description>
+ <description>Animal, Vegetal, Mineral (France)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -2717,9 +2767,10 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="avms" cloneof="avm" supported="no">
- <description>Animal / Vegetable / Mineral (Spain)</description>
+ <description>Animal, Vegetable, Mineral (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="serial" value="AMC-300" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="21651">
@@ -2872,6 +2923,8 @@ Please stick to using the floppy versions for the time being...
<description>L'Apprenti Sorcier (France)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Richard Meyer" />
+ <info name="serial" value="SOFT 4202" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="83421">
@@ -3267,6 +3320,8 @@ Please stick to using the floppy versions for the time being...
<description>Asalto (Spain)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Shirekilo" />
+ <info name="serial" value="AMC-174" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="19795">
@@ -3368,6 +3423,8 @@ Please stick to using the floppy versions for the time being...
<description>Astro Attack (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Ian Beynon" />
+ <info name="serial" value="SOFT 175" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="21082">
@@ -3427,7 +3484,7 @@ Please stick to using the floppy versions for the time being...
<software name="athlete" supported="no">
<description>Athlete (France)</description>
<year>1986</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46805">
@@ -3464,6 +3521,8 @@ Please stick to using the floppy versions for the time being...
<description>Atom Smasher (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Romik Software" />
+ <info name="serial" value="SOFT 139" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="14283">
@@ -3476,6 +3535,8 @@ Please stick to using the floppy versions for the time being...
<description>Atom Smasher (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Romik Software" />
+ <info name="serial" value="SOFT 139" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="13914">
@@ -3488,6 +3549,7 @@ Please stick to using the floppy versions for the time being...
<description>Atomic Driver (France)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
+ <info name="author" value="Jean-Philippe Biscay" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="40846">
@@ -3606,6 +3668,9 @@ Please stick to using the floppy versions for the time being...
<description>Automec (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="author" value="André Gandon" />
+ <info name="notice" value="COPYRIGHT LORICIELS Décembre 1985" />
+ <info name="serial" value="109" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="50147">
@@ -3795,6 +3860,7 @@ Please stick to using the floppy versions for the time being...
<description>Bactron (UK)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="serial" value="UQK 708" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="61800">
@@ -3807,6 +3873,8 @@ Please stick to using the floppy versions for the time being...
<description>Bactron (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Septembre 1986" />
+ <info name="serial" value="144" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="60820">
@@ -4375,7 +4443,7 @@ Please stick to using the floppy versions for the time being...
<software name="btvalley" supported="no">
<description>Battle Valley (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="48541">
@@ -4703,6 +4771,8 @@ Please stick to using the floppy versions for the time being...
<description>Billar - Snooker (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 190" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="22987">
@@ -4715,6 +4785,8 @@ Please stick to using the floppy versions for the time being...
<description>Billy La Banlieue (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Juin 1986" />
+ <info name="serial" value="139" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="57535">
@@ -4726,7 +4798,8 @@ Please stick to using the floppy versions for the time being...
<software name="billys" cloneof="billy" supported="no">
<description>Billy La Banlieue (Spain)</description>
<year>1986</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Proein Soft Line</publisher>
+ <info name="notice" value="© Loriciels. Junio 1986" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Billy El Barriobajero (Box)" />
<part name="cass1" interface="cpc_cass">
@@ -4848,6 +4921,7 @@ Please stick to using the floppy versions for the time being...
<description>Birdie (UK)</description>
<year>1987</year>
<publisher>Ere Informatique</publisher>
+ <info name="author" value="Stephane Picq" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="82918">
@@ -4983,6 +5057,8 @@ Please stick to using the floppy versions for the time being...
<description>Blagger (UK, AMSoft)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Alligata Software" />
+ <info name="serial" value="SOFT 926" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42465">
@@ -5330,6 +5406,8 @@ Please stick to using the floppy versions for the time being...
<description>Boinggg! (UK)</description>
<year>1988</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="Barry Jones" />
+ <info name="serial" value="AT 412" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="63535">
@@ -5676,6 +5754,8 @@ Please stick to using the floppy versions for the time being...
<description>Braxx Bluff (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Micromega" />
+ <info name="serial" value="SOFT 955" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="32677">
@@ -5773,6 +5853,8 @@ Please stick to using the floppy versions for the time being...
<description>Bridge-It (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Epicsoft" />
+ <info name="serial" value="SOFT 913" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="30871">
@@ -6718,6 +6800,8 @@ Please stick to using the floppy versions for the time being...
<description>Catastrophes - Ile Infernale (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Andromeda Software" />
+ <info name="serial" value="SOFT 934" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="47514">
@@ -6802,6 +6886,7 @@ Please stick to using the floppy versions for the time being...
<description>Cavemania (UK)</description>
<year>1991</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 424" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="49903">
@@ -6838,6 +6923,9 @@ Please stick to using the floppy versions for the time being...
<description>Centre Court (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="alt_title" value="Tenis" />
+ <info name="developer" value="Epicsoft" />
+ <info name="serial" value="S-508" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="29066">
@@ -7335,7 +7423,7 @@ Please stick to using the floppy versions for the time being...
<software name="chicag90" supported="no">
<description>Chicago 90 (France)</description>
<year>1989</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="102535">
@@ -7360,6 +7448,8 @@ Please stick to using the floppy versions for the time being...
<description>Des Chiffres et des Lettres (France)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS juin 1987" />
+ <info name="serial" value="LA 42" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="37297">
@@ -7372,6 +7462,8 @@ Please stick to using the floppy versions for the time being...
<description>Les Chiffres Magiques (France)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 402" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="21391">
@@ -7441,7 +7533,7 @@ Please stick to using the floppy versions for the time being...
<software name="techted" supported="no">
<description>The Chip Factory Featuring 'Technician Ted' (UK)</description>
<year>1984</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Technician Ted (Box)" />
<part name="cass1" interface="cpc_cass">
@@ -7729,7 +7821,7 @@ Please stick to using the floppy versions for the time being...
<software name="cityslic" supported="no">
<description>City Slicker (UK)</description>
<year>1986</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="54963">
@@ -7742,6 +7834,8 @@ Please stick to using the floppy versions for the time being...
<description>Classic Adventure (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Abersoft" />
+ <info name="serial" value="SOFT 187" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="36688">
@@ -7868,6 +7962,8 @@ Please stick to using the floppy versions for the time being...
<description>Classic Racing (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Paul Neal" />
+ <info name="serial" value="SOFT 928" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="35363">
@@ -8059,6 +8155,9 @@ Please stick to using the floppy versions for the time being...
<description>Codename Mat (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Derek Brewster" />
+ <info name="developer" value="Micromega" />
+ <info name="serial" value="SOFT 1129" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="44833">
@@ -8980,9 +9079,9 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="coursolf" supported="no">
- <description>Cours de Solfege, Niveau 1 (France)</description>
+ <description>Cours de Solfège, Niveau 1 (France)</description>
<year>1984</year>
- <publisher>TMPI</publisher>
+ <publisher>Techni-Musique &amp; Parole Informatique (TMPI)</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="43898">
@@ -8992,9 +9091,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="courbous" cloneof="maprally" supported="no">
- <description>La Course a la Boussole (France)</description>
+ <description>La Course à la Boussole (France)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 448" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="60703">
@@ -9089,6 +9190,7 @@ Please stick to using the floppy versions for the time being...
<description>Crack-Up (UK)</description>
<year>1989</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 416" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="48409">
@@ -9173,6 +9275,8 @@ Please stick to using the floppy versions for the time being...
<description>Crazy Golf (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Mr. Micro" />
+ <info name="serial" value="SOFT 149" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="20923">
@@ -9196,7 +9300,7 @@ Please stick to using the floppy versions for the time being...
<software name="crazysht" supported="no">
<description>Crazy Shot (Spain)</description>
<year>1989</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Proein Soft Line</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="105646">
@@ -9291,6 +9395,8 @@ Please stick to using the floppy versions for the time being...
<description>Crossfire (UK)</description>
<year>1990</year>
<publisher>Atlantis Software</publisher>
+ <info name="developer" value="Pantheon Software" />
+ <info name="serial" value="AT 415" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="51709">
@@ -9385,6 +9491,8 @@ Please stick to using the floppy versions for the time being...
<description>Cubit (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Mr. Micro" />
+ <info name="serial" value="SOFT 166" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="10067">
@@ -9556,7 +9664,9 @@ Please stick to using the floppy versions for the time being...
<software name="cybernod" supported="no">
<description>Cybernoid (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="alt_title" value="Cybernoid: The Fighting Machine" />
+ <info name="author" value="Raffaele Cecco and Nick Jones" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="54884">
@@ -9568,7 +9678,9 @@ Please stick to using the floppy versions for the time being...
<software name="cybernd2" supported="no">
<description>Cybernoid II (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="alt_title" value="Cybernoid II: The Revenge" />
+ <info name="author" value="Raffaele Cecco" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="66207">
@@ -9617,6 +9729,8 @@ Please stick to using the floppy versions for the time being...
<description>Cyrus II Chess (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Intelligent Chess Software" />
+ <info name="serial" value="SOFT 06026" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42442">
@@ -10485,7 +10599,7 @@ Please stick to using the floppy versions for the time being...
<software name="delivern" supported="no">
<description>Deliverance (UK)</description>
<year>1990</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Deliverance - Stormlord II (Box)" />
<part name="cass1" interface="cpc_cass">
@@ -10498,7 +10612,7 @@ Please stick to using the floppy versions for the time being...
<software name="deliverns" cloneof="delivern" supported="no">
<description>Deliverance (Spain)</description>
<year>1990</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<info name="alt_title" value="Deliverance - Stormlord II (Box)" />
<part name="cass1" interface="cpc_cass">
@@ -10691,6 +10805,9 @@ Please stick to using the floppy versions for the time being...
<description>Detective (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Peter Green" />
+ <info name="developer" value="Argus Press Software" />
+ <info name="serial" value="SOFT 920" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="22998">
@@ -10763,6 +10880,8 @@ Please stick to using the floppy versions for the time being...
<description>DFM 464 (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Dialog Software" />
+ <info name="serial" value="SOFT 941" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="26905">
@@ -10789,9 +10908,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="diamanmd" supported="no">
- <description>Le Diamant de l'Ile Maudite (France)</description>
+ <description>Le Diamant de l'Île Maudite (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Octobre 1985" />
+ <info name="serial" value="083" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="55375">
@@ -10833,6 +10954,8 @@ Please stick to using the floppy versions for the time being...
<description>Dianne - Mission Rubidiums (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="developer" value="Novasoft" />
+ <info name="notice" value="Copyright LORICIELS Novembre 1985" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41313">
@@ -11360,6 +11483,8 @@ Please stick to using the floppy versions for the time being...
<description>Doors of Doom (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 06047" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46318">
@@ -11691,6 +11816,8 @@ Please stick to using the floppy versions for the time being...
<description>Dragon's Gold (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Roland Stokes" />
+ <info name="serial" value="SOFT 935" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="24793">
@@ -11712,7 +11839,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="drgflame" supported="no">
- <description>Dragons of Flame (UK)</description>
+ <description>Advanced Dungeons &amp; Dragons - Dragons of Flame (UK)</description>
<year>1989</year>
<publisher>U.S. Gold</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -11731,7 +11858,8 @@ Please stick to using the floppy versions for the time being...
<software name="dragntor" supported="no">
<description>The Dragontorc of Avalon (UK)</description>
<year>1985</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Steve Turner" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="54680">
@@ -11917,9 +12045,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="daa" supported="no">
- <description>Dungeons Amethysts Alchemists (UK)</description>
+ <description>Dungeons, Amethysts, Alchemists (UK)</description>
<year>1987</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="Richard Robinson" />
+ <info name="serial" value="AT 408" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="69562">
@@ -12156,6 +12286,9 @@ Please stick to using the floppy versions for the time being...
<description>Easi-Amsword (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="alt_title" value="Amsoft Easy Word Processor" />
+ <info name="developer" value="Juniper Computing" />
+ <info name="serial" value="SOFT 154" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="26603">
@@ -12168,6 +12301,9 @@ Please stick to using the floppy versions for the time being...
<description>Easi-Amsword (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="alt_title" value="Procesador de Texto" />
+ <info name="developer" value="Juniper Computing" />
+ <info name="serial" value="AMC-502" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="25873">
@@ -12177,9 +12313,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="easytopw" cloneof="easiaw" supported="no">
- <description>Easy Topword (Germany)</description>
+ <description>Easy-Topword - Textverarbeitung (Germany)</description>
<year>1984</year>
- <publisher>Schneider Computer Software</publisher>
+ <publisher>Schneider Computer Division</publisher>
+ <info name="developer" value="Juniper Computing" />
+ <info name="serial" value="SOFT 254" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="24841">
@@ -12273,7 +12411,7 @@ Please stick to using the floppy versions for the time being...
<software name="superski" supported="no">
<description>Eddie Edwards Super Ski (UK)</description>
<year>1988</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Microïds</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="140083">
@@ -12295,9 +12433,12 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="editmus" supported="no">
- <description>Edit-Music (France)</description>
+ <description>Music Edit (France)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="alt_title" value="Edit-Music" />
+ <info name="author" value="Stéphane Mayet" />
+ <info name="serial" value="CP 007" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="27679">
@@ -12426,6 +12567,8 @@ Please stick to using the floppy versions for the time being...
<description>Electro Freddy (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Softspot" />
+ <info name="serial" value="SOFT 144" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="19813">
@@ -12485,7 +12628,7 @@ Please stick to using the floppy versions for the time being...
<software name="eliminat" supported="no">
<description>Eliminator (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="90635">
@@ -12599,6 +12742,8 @@ Please stick to using the floppy versions for the time being...
<description>Empire (France, Loriciels)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Mai 1985" />
+ <info name="serial" value="068" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41738">
@@ -12898,6 +13043,8 @@ Please stick to using the floppy versions for the time being...
<description>Escape From Khoshima (UK)</description>
<year>1986</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="John Betteridge" />
+ <info name="serial" value="AT 404" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="69307">
@@ -13144,7 +13291,8 @@ Please stick to using the floppy versions for the time being...
<software name="evenstar" supported="no">
<description>Evening Star (UK)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Mike Male and Bob Hillyer" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="27739">
@@ -13186,7 +13334,7 @@ Please stick to using the floppy versions for the time being...
<software name="everywalmg" cloneof="everywal" supported="no">
<description>Everyone's A Wally - Meet The Gang (UK, Mikro-Gen)</description>
<year>1985</year>
- <publisher>Mikro-gen</publisher>
+ <publisher>Mikro-Gen</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="58269">
@@ -13234,7 +13382,8 @@ Please stick to using the floppy versions for the time being...
<software name="exolon" supported="no">
<description>Exolon (UK)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Raffaele Cecco" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="54110">
@@ -13246,7 +13395,7 @@ Please stick to using the floppy versions for the time being...
<software name="exolons" cloneof="exolon" supported="no">
<description>Exolon (Spain)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants / Erbe Software</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="47198">
@@ -13565,7 +13714,8 @@ Please stick to using the floppy versions for the time being...
<software name="fantdiam" supported="no">
<description>Fantasia Diamond (UK)</description>
<year>1985</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Kim Topley" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41173">
@@ -13623,6 +13773,8 @@ Please stick to using the floppy versions for the time being...
<description>The Fantastic Voyage (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Edmonds Software" />
+ <info name="serial" value="SOFT 984" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="45283">
@@ -13632,7 +13784,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="fantcity" supported="no">
- <description>Fantome City (France)</description>
+ <description>Fantôme City (France)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -13973,7 +14125,8 @@ Please stick to using the floppy versions for the time being...
<software name="firelord" supported="no">
<description>Firelord (UK)</description>
<year>1986</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Stephen Crow" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="66377">
@@ -14114,6 +14267,8 @@ Please stick to using the floppy versions for the time being...
<description>Flash (France)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Avril 1986" />
+ <info name="serial" value="LA 39" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="69088">
@@ -14608,6 +14763,8 @@ Please stick to using the floppy versions for the time being...
<description>Frank 'N' Stein (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="PSS Software" />
+ <info name="serial" value="SOFT 907" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46034">
@@ -14849,6 +15006,8 @@ Please stick to using the floppy versions for the time being...
<description>Fruit Machine (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Paul Aitman" />
+ <info name="serial" value="SOFT 919" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="17989">
@@ -14897,6 +15056,8 @@ Please stick to using the floppy versions for the time being...
<description>Fu-Kung In Las Vegas (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Romik" />
+ <info name="serial" value="SOFT 979" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="35563">
@@ -15076,6 +15237,7 @@ Please stick to using the floppy versions for the time being...
<description>Fusion II (France)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="Copyright LORICIELS SEPTEMBRE 1988" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="55179">
@@ -15182,6 +15344,8 @@ Please stick to using the floppy versions for the time being...
<description>The Galactic Plague (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Indescomp" />
+ <info name="serial" value="SOFT 196" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="17167">
@@ -15235,6 +15399,9 @@ Please stick to using the floppy versions for the time being...
<description>The Game of Dragons (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="alt_title" value="Dragons" />
+ <info name="author" value="O. Goodman" />
+ <info name="serial" value="SOFT 977" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="33013">
@@ -15466,6 +15633,9 @@ Please stick to using the floppy versions for the time being...
<description>Gatecrasher (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Dave Mendes &amp; Mick O'Neill" />
+ <info name="developer" value="Exopal Software" />
+ <info name="serial" value="SOFT 958" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="30116">
@@ -15686,6 +15856,9 @@ Please stick to using the floppy versions for the time being...
<description>Gems of Stradus (UK, Amsoft, BASIC 1.0)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Mike Shaw" />
+ <info name="developer" value="Kuma Computers" />
+ <info name="serial" value="SOFT 121" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="51677">
@@ -15875,9 +16048,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="gestf464" supported="no">
- <description>Gestion de Fichier CPC 464 (France)</description>
+ <description>Gestion de Fichier (France)</description>
<year>1984</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Pietro Pancino" />
+ <info name="serial" value="CP 004" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="16087">
@@ -16080,6 +16255,8 @@ Please stick to using the floppy versions for the time being...
<description>Glen Hoddle Soccer (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Shirekilo" />
+ <info name="serial" value="SOFT 06021" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="30403">
@@ -16293,7 +16470,8 @@ Please stick to using the floppy versions for the time being...
<software name="gp500cc" cloneof="500ccgp" supported="no">
<description>Grand Prix 500cc (France)</description>
<year>1986</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds</publisher>
+ <info name="notice" value="COPYRIGHT MICROÏDS Juillet 1986" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="69307">
@@ -16305,7 +16483,7 @@ Please stick to using the floppy versions for the time being...
<software name="gp500ccs" cloneof="500ccgp" supported="no">
<description>Grand Prix 500cc (Spain)</description>
<year>1986</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds / Proein Soft Line</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="90520">
@@ -16330,6 +16508,8 @@ Please stick to using the floppy versions for the time being...
<description>Grand Prix Driver (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Britannia Software" />
+ <info name="serial" value="SOFT 110" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="13726">
@@ -16484,6 +16664,8 @@ Please stick to using the floppy versions for the time being...
<description>Graphisto (France, BASIC 1.0)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Adriano Cimenti" />
+ <info name="serial" value="CP 001" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="34783">
@@ -16777,7 +16959,7 @@ Please stick to using the floppy versions for the time being...
<software name="guardns" supported="no">
<description>Guardians (UK)</description>
<year>1991</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="105452">
@@ -16894,6 +17076,8 @@ Please stick to using the floppy versions for the time being...
<description>Gunfighter (UK)</description>
<year>1990</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="Tony Love (CPC version)" />
+ <info name="serial" value="AT 419" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="52459">
@@ -17129,6 +17313,8 @@ Please stick to using the floppy versions for the time being...
<description>Happy Letters (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 105" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="24793">
@@ -17141,6 +17327,8 @@ Please stick to using the floppy versions for the time being...
<description>Happy Numbers (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 102" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="19022">
@@ -17153,6 +17341,8 @@ Please stick to using the floppy versions for the time being...
<description>Happy Writing (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 106" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="21134">
@@ -17200,7 +17390,7 @@ Please stick to using the floppy versions for the time being...
<software name="harrican" supported="no">
<description>Harricana - Raid International Motoneige (France)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="89170">
@@ -17213,6 +17403,8 @@ Please stick to using the floppy versions for the time being...
<description>Harrier Attack (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Durell Software" />
+ <info name="serial" value="SOFT 112" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="10879">
@@ -17273,6 +17465,8 @@ Please stick to using the floppy versions for the time being...
<description>Haunted Hedges (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Micromega" />
+ <info name="serial" value="SOFT 128" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="15975">
@@ -17501,6 +17695,8 @@ Please stick to using the floppy versions for the time being...
<description>Heliot (France)</description>
<year>1984</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Bernard Auré" />
+ <info name="serial" value="CP 009" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="13201">
@@ -17611,7 +17807,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="herolanc" supported="no">
- <description>Heroes of the Lance (UK)</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (UK)</description>
<year>1988</year>
<publisher>U.S. Gold</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -17813,7 +18009,7 @@ Please stick to using the floppy versions for the time being...
<software name="hitsport" supported="no">
<description>Hit Sports</description>
<year>1991</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="109756">
@@ -18060,11 +18256,13 @@ Please stick to using the floppy versions for the time being...
<publisher>Loriciels</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
+ <feature name="part_id" value="Side A: Rally II, 3D Fight" />
<dataarea name="cass" size="57952">
<rom name="les hits 1 de loriciels (f) (face a) (rally ii - 3d fight) [original] [tape] [compilation].cdt" size="57952" crc="843b271f" sha1="b3b5e3e73f8baf4d24950a9b16f0b10eec6d98db"/>
</dataarea>
</part>
<part name="cass2" interface="cpc_cass">
+ <feature name="part_id" value="Side B: Infernal Runner" />
<dataarea name="cass" size="37519">
<rom name="les hits 1 de loriciels (f) (face b) (infernal runner) [original] [tape] [compilation].cdt" size="37519" crc="88c6af8d" sha1="d6fbdbd36500e22236afdf0bbb8d0a8168e71037"/>
</dataarea>
@@ -18075,13 +18273,16 @@ Please stick to using the floppy versions for the time being...
<description>Les Hits 2 de Loriciels (France)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
+ <info name="serial" value="LA H2" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
+ <feature name="part_id" value="Side A: Foot, Le 5ème Axe" />
<dataarea name="cass" size="73434">
<rom name="les hits 2 de loriciels (f) (face a) (1987) (foot - le 5eme axe) [original] [tape] [compilation].cdt" size="73434" crc="3f6c21c6" sha1="10a6345f127ce5e97a5247452ead97aaf4058b5b"/>
</dataarea>
</part>
<part name="cass2" interface="cpc_cass">
+ <feature name="part_id" value="Side B: Tennis" />
<dataarea name="cass" size="47065">
<rom name="les hits 2 de loriciels (f) (face b) (1987) (tennis) [original] [tape] [compilation].cdt" size="47065" crc="66eda86a" sha1="3c73498932fdf5b362885838cbfb419703ef977f"/>
</dataarea>
@@ -18128,6 +18329,8 @@ Please stick to using the floppy versions for the time being...
<description>Hobgoblin (UK)</description>
<year>1991</year>
<publisher>Atlantis Software</publisher>
+ <info name="developer" value="Pantheon Software (conversion)" />
+ <info name="serial" value="AT 425" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="53773">
@@ -18446,6 +18649,8 @@ Please stick to using the floppy versions for the time being...
<description>Hunchback (UK, v1)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Ocean Software" />
+ <info name="serial" value="SOFT 132" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="20872">
@@ -18458,6 +18663,8 @@ Please stick to using the floppy versions for the time being...
<description>Hunchback (UK, v2)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Ocean Software" />
+ <info name="serial" value="SOFT 132" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="19299">
@@ -18562,6 +18769,8 @@ Please stick to using the floppy versions for the time being...
<description>Hunter Killer (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Protek Computing" />
+ <info name="serial" value="SOFT 135" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46696">
@@ -18855,7 +19064,8 @@ Please stick to using the floppy versions for the time being...
<software name="impossab" supported="no">
<description>Impossaball (UK)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="John Phillips" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="55393">
@@ -19044,6 +19254,8 @@ Please stick to using the floppy versions for the time being...
<description>Infernal Runner (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Aôut 1985" />
+ <info name="serial" value="077" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="53159">
@@ -19448,6 +19660,8 @@ Please stick to using the floppy versions for the time being...
<description>Isoleur (France)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Xavier Fagre &amp; Christophe Marchal" />
+ <info name="serial" value="CP 010" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="47904">
@@ -19731,6 +19945,8 @@ Please stick to using the floppy versions for the time being...
<description>Jammin (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Taskset" />
+ <info name="serial" value="SOFT 911" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="47453">
@@ -19807,6 +20023,8 @@ Please stick to using the floppy versions for the time being...
<description>Jet-Boot Jack (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="English Software" />
+ <info name="serial" value="SOFT 172" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46421">
@@ -20181,6 +20399,7 @@ Please stick to using the floppy versions for the time being...
<description>K.Y.A. (France)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Avril 1987" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="38269">
@@ -21027,6 +21246,8 @@ Please stick to using the floppy versions for the time being...
<description>Laserwarp (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Mikro-Gen" />
+ <info name="serial" value="SOFT 126" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="25099">
@@ -21164,6 +21385,8 @@ Please stick to using the floppy versions for the time being...
<description>League Challenge (UK)</description>
<year>1987</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="Nigel Edwards" />
+ <info name="serial" value="AT 407X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="27679">
@@ -22040,6 +22263,8 @@ Please stick to using the floppy versions for the time being...
<description>Macrocosmica (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="David Reading" />
+ <info name="serial" value="SOFT 06024" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="61634">
@@ -22381,6 +22606,8 @@ Please stick to using the floppy versions for the time being...
<description>Manic Miner (UK, Amsoft, BASIC 1.0)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Software Projects" />
+ <info name="serial" value="SOFT 173" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="27680">
@@ -22466,6 +22693,8 @@ Please stick to using the floppy versions for the time being...
<description>Map Rally (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 148" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="56007">
@@ -22513,7 +22742,7 @@ Please stick to using the floppy versions for the time being...
<software name="marauder" supported="no">
<description>Marauder (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="76426">
@@ -22574,6 +22803,8 @@ Please stick to using the floppy versions for the time being...
<description>Marius Tresor Foot (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Octobre 1985" />
+ <info name="serial" value="096" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="30529">
@@ -22658,6 +22889,8 @@ Please stick to using the floppy versions for the time being...
<description>MasterChess (UK, Amsoft)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Mikro-Gen" />
+ <info name="serial" value="SOFT 1125" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="33762">
@@ -22951,7 +23184,7 @@ Please stick to using the floppy versions for the time being...
<software name="mazemani" supported="no">
<description>Maze Mania (Spain)</description>
<year>1989</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants / Erbe Software</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="68826">
@@ -23248,7 +23481,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="menacart" supported="no">
- <description>Menace sur l'Arctique (France)</description>
+ <description>Les Aventures du Ka 6 - Menace sur l'Arctique (France)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -23460,7 +23693,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="meurgvit" supported="no">
- <description>Meurtre a Grande Vitesse (France)</description>
+ <description>Meurtre à Grande Vitesse (France)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -24065,6 +24298,7 @@ Please stick to using the floppy versions for the time being...
<description>Mobile Man (France)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
+ <info name="author" value="Jean-Philippe Biscay" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="65881">
@@ -24322,7 +24556,7 @@ Please stick to using the floppy versions for the time being...
<software name="moonblst" supported="no">
<description>Moon Blaster (UK)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="45397">
@@ -24340,6 +24574,7 @@ Please stick to using the floppy versions for the time being...
<description>Moontorc (UK)</description>
<year>1991</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 426" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="56869">
@@ -24608,6 +24843,8 @@ Please stick to using the floppy versions for the time being...
<description>Mr. Wong's Loopy Laundry (UK, v2)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Artic Computing" />
+ <info name="serial" value="SOFT 923" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="20572">
@@ -24620,6 +24857,8 @@ Please stick to using the floppy versions for the time being...
<description>Mr. Wong's Loopy Laundry (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Artic Computing" />
+ <info name="serial" value="SOFT 923" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="20584">
@@ -24855,6 +25094,8 @@ Please stick to using the floppy versions for the time being...
<description>Mutant Monty (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Artic Computing" />
+ <info name="serial" value="SOFT 922" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42721">
@@ -24922,9 +25163,12 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="kikekan" supported="no">
- <description>Le Mystere de Kikekankoi (France)</description>
+ <description>Le Mystère de Kikekankoi (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="author" value="L. Benès, D. Berchiatti, R. Nicolle" />
+ <info name="notice" value="COPYRIGHT LORICIELS Mars 1985" />
+ <info name="serial" value="051" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="7687">
@@ -25139,7 +25383,7 @@ Please stick to using the floppy versions for the time being...
<software name="nebulus" supported="no">
<description>Nebulus (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="66748">
@@ -25211,7 +25455,8 @@ Please stick to using the floppy versions for the time being...
<software name="netherwd" supported="no">
<description>Netherworld (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Jukka Tapanimaki" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="66699">
@@ -25812,6 +26057,8 @@ Please stick to using the floppy versions for the time being...
<description>Nuclear Defence (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="James Software" />
+ <info name="serial" value="SOFT 06031" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="39642">
@@ -25847,7 +26094,8 @@ Please stick to using the floppy versions for the time being...
<software name="numberpt" supported="no">
<description>Number Painter (UK)</description>
<year>1984</year>
- <publisher>ASK</publisher>
+ <publisher>Applied Systems Knowledge (ASK)</publisher>
+ <info name="author" value="Don Walton" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="21134">
@@ -25961,7 +26209,7 @@ Please stick to using the floppy versions for the time being...
<software name="oceancnq" supported="no">
<description>Ocean Conqueror (UK)</description>
<year>1988</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="62569">
@@ -26039,6 +26287,8 @@ Please stick to using the floppy versions for the time being...
<description>Oh Mummy (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 115" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="18763">
@@ -26051,6 +26301,8 @@ Please stick to using the floppy versions for the time being...
<description>Oh Mummy (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="AMC-138" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="18763">
@@ -26121,9 +26373,10 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="olympiad" supported="no">
- <description>Olympiad (UK)</description>
+ <description>Olympiad '86 (UK)</description>
<year>1986</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 403X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="65131">
@@ -26649,7 +26902,7 @@ Please stick to using the floppy versions for the time being...
<software name="panzakbf" cloneof="panzakb" supported="no">
<description>Panza Kick Boxing (France)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Futura</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="62096">
@@ -26666,7 +26919,7 @@ Please stick to using the floppy versions for the time being...
<software name="panzakb" supported="no">
<description>Panza Kick Boxing (Spain)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Futura / Proein Soft Line</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="77077">
@@ -26920,9 +27173,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="pearlhrb" supported="no">
- <description>Pearl Harbour (France, BASIC 1.0)</description>
+ <description>Pearl Harbor (France, BASIC 1.0)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="author" value="François Le Griguer" />
+ <info name="serial" value="CP 016" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="29607">
@@ -27057,6 +27312,7 @@ Please stick to using the floppy versions for the time being...
<description>Periscope Up (UK)</description>
<year>1989</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 417" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41437">
@@ -27213,11 +27469,13 @@ Please stick to using the floppy versions for the time being...
<publisher>Loriciels</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
+ <feature name="part_id" value="A: Jeu" />
<dataarea name="cass" size="72289">
<rom name="pharaon (f) (face a) (1987) [original] [tape].cdt" size="72289" crc="d741c6f2" sha1="01285288bba72d9b62cbcf8b1cb3b8fd419f6085"/>
</dataarea>
</part>
<part name="cass2" interface="cpc_cass">
+ <feature name="part_id" value="B: Dessins" />
<dataarea name="cass" size="251833">
<rom name="pharaon (f) (face b) (1987) [original] [tape].cdt" size="251833" crc="b1d4fc8a" sha1="895f0669981bb830aea174eecee3aef17ac9f492"/>
</dataarea>
@@ -27326,7 +27584,7 @@ Please stick to using the floppy versions for the time being...
<software name="pinmagic" supported="no">
<description>Pinball Magic (France)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="103453">
@@ -27463,6 +27721,8 @@ Please stick to using the floppy versions for the time being...
<description>Pitman Typing Tutor (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Pitman Publishing" />
+ <info name="serial" value="SOFT 924" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="38241">
@@ -27475,6 +27735,8 @@ Please stick to using the floppy versions for the time being...
<description>La Plaga Galactica (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="James Software" />
+ <info name="serial" value="AMC-125" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="17167">
@@ -27559,9 +27821,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="planbase" supported="no">
- <description>Planete Base (France)</description>
+ <description>Planète Base (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Juin 1985" />
+ <info name="serial" value="065" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="53577">
@@ -27835,6 +28099,8 @@ Please stick to using the floppy versions for the time being...
<description>Pouvoir (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Février 1986" />
+ <info name="serial" value="118" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="50705">
@@ -28138,6 +28404,8 @@ Please stick to using the floppy versions for the time being...
<description>The Prize (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Arcade Software" />
+ <info name="serial" value="SOFT 952" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="33787">
@@ -28150,6 +28418,7 @@ Please stick to using the floppy versions for the time being...
<description>Pro Golf (UK)</description>
<year>1987</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 410X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="65955">
@@ -28598,6 +28867,8 @@ Please stick to using the floppy versions for the time being...
<description>Punchy (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Mr. Micro" />
+ <info name="serial" value="SOFT 150" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="14286">
@@ -28651,6 +28922,8 @@ Please stick to using the floppy versions for the time being...
<description>Pyjamarama (UK, Amsoft)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Mikro-Gen" />
+ <info name="serial" value="SOFT 943" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="44061">
@@ -28728,6 +29001,8 @@ Please stick to using the floppy versions for the time being...
<description>Qabbalah (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 06062" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="43543">
@@ -28740,6 +29015,8 @@ Please stick to using the floppy versions for the time being...
<description>Quack A Jack (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Paul Shirley" />
+ <info name="serial" value="SOFT 181" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="31129">
@@ -28751,7 +29028,9 @@ Please stick to using the floppy versions for the time being...
<software name="quad" supported="no">
<description>Quad (Spain)</description>
<year>1987</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds</publisher>
+ <info name="notice" value="COPYRIGHT MICROÏDS Octobre 1987" />
+ <info name="serial" value="MA 07" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="70908">
@@ -28763,7 +29042,7 @@ Please stick to using the floppy versions for the time being...
<software name="quadrel" supported="no">
<description>Quadrel (France)</description>
<year>1991</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="111853">
@@ -28781,6 +29060,8 @@ Please stick to using the floppy versions for the time being...
<description>Quaterne (France)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Jérôme Bermond" />
+ <info name="serial" value="CP 006" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42946">
@@ -29099,6 +29380,8 @@ Please stick to using the floppy versions for the time being...
<description>Rally II (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Mars 1985" />
+ <info name="serial" value="053" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="54726">
@@ -29108,9 +29391,9 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="rally2" supported="no">
- <description>Rally II (UK)</description>
+ <description>Grand Prix Rally II (UK)</description>
<year>1985</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Amsoft</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="33120">
@@ -29218,7 +29501,7 @@ Please stick to using the floppy versions for the time being...
<software name="ranaramas" cloneof="ranarama" supported="no">
<description>Ranarama (Spain)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants / Erbe Software</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="33627">
@@ -29230,7 +29513,8 @@ Please stick to using the floppy versions for the time being...
<software name="ranarama" supported="no">
<description>Ranarama (UK)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Steve Turner" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="34716">
@@ -29578,6 +29862,8 @@ Please stick to using the floppy versions for the time being...
<description>Relief Action (France)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Mai 1987" />
+ <info name="serial" value="LA 40" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="90764">
@@ -29749,6 +30035,7 @@ Please stick to using the floppy versions for the time being...
<description>Revenge of the C5 (UK)</description>
<year>1986</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 402X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="37339">
@@ -29761,6 +30048,8 @@ Please stick to using the floppy versions for the time being...
<description>Reversi Champion (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Avril 1986" />
+ <info name="serial" value="128" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="26196">
@@ -30366,6 +30655,8 @@ Please stick to using the floppy versions for the time being...
<description>Roland Ahoy! (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Computersmith" />
+ <info name="serial" value="SOFT 192" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="24557">
@@ -30378,6 +30669,7 @@ Please stick to using the floppy versions for the time being...
<description>Roland en el Espacio (Spain)</description>
<year>1984</year>
<publisher>Indescomp</publisher>
+ <info name="serial" value="AMC-145" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="57507">
@@ -30390,6 +30682,8 @@ Please stick to using the floppy versions for the time being...
<description>Roland Goes Digging (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 169" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="26131">
@@ -30402,6 +30696,8 @@ Please stick to using the floppy versions for the time being...
<description>Roland Goes Square Bashing (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Durell Software" />
+ <info name="serial" value="SOFT 937" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="15117">
@@ -30413,7 +30709,9 @@ Please stick to using the floppy versions for the time being...
<software name="rolandcv" supported="no">
<description>Roland in the Caves (UK)</description>
<year>1984</year>
- <publisher>Indescomp</publisher>
+ <publisher>Amsoft</publisher>
+ <info name="developer" value="Indescomp" />
+ <info name="serial" value="SOFT 117" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="30355">
@@ -30426,6 +30724,8 @@ Please stick to using the floppy versions for the time being...
<description>Roland in Time (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Gem Software" />
+ <info name="serial" value="SOFT 170" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="38802">
@@ -30437,7 +30737,9 @@ Please stick to using the floppy versions for the time being...
<software name="rolandrp" supported="no">
<description>Roland on the Ropes (UK)</description>
<year>1984</year>
- <publisher>Zigurat</publisher>
+ <publisher>Amsoft</publisher>
+ <info name="developer" value="Indescomp" />
+ <info name="serial" value="SOFT 118" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="45351">
@@ -30450,6 +30752,8 @@ Please stick to using the floppy versions for the time being...
<description>Roland on the Run (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Epicsoft" />
+ <info name="serial" value="SOFT 199" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="24532">
@@ -30915,6 +31219,7 @@ Please stick to using the floppy versions for the time being...
<description>Salut l'Artiste (France)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="David Radisic" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41743">
@@ -30999,6 +31304,8 @@ Please stick to using the floppy versions for the time being...
<description>Sapiens (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Juin 1986" />
+ <info name="serial" value="149" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="39817">
@@ -31035,6 +31342,7 @@ Please stick to using the floppy versions for the time being...
<description>S.A.S. Assault Course. (UK)</description>
<year>1986</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 405X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="63535">
@@ -31117,6 +31425,8 @@ Please stick to using the floppy versions for the time being...
<description>Satellite Warrior (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="D.M. Lock" />
+ <info name="serial" value="SOFT 949" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41261">
@@ -31177,9 +31487,10 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="lehrbas1" cloneof="teachbs1" supported="no">
- <description>Schneider Basic-Lehrbuch Teil 1 (Germany)</description>
+ <description>Schneider BASIC-Lehrbuch Teil 1 (Germany)</description>
<year>1984</year>
- <publisher>Amsoft</publisher>
+ <publisher>Schneider Computer Division</publisher>
+ <info name="serial" value="SOFT 211" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="51049">
@@ -31204,9 +31515,10 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="lehrbas2" cloneof="teachbs2" supported="no">
- <description>Schneider Basic-Lehrbuch Teil 2 (Germany)</description>
+ <description>Schneider BASIC-Lehrbuch Teil 2 (Germany)</description>
<year>1985</year>
- <publisher>Amsoft</publisher>
+ <publisher>Schneider Computer Division</publisher>
+ <info name="serial" value="SOFT 256" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="99211">
@@ -31282,6 +31594,8 @@ Please stick to using the floppy versions for the time being...
<description>The Scout Steps Out (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="H R Software" />
+ <info name="serial" value="SOFT 988" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="47719">
@@ -31419,6 +31733,8 @@ Please stick to using the floppy versions for the time being...
<description>Le Secret du Tombeau (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Avril 1986" />
+ <info name="serial" value="LA 39" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="74656">
@@ -31430,7 +31746,8 @@ Please stick to using the floppy versions for the time being...
<software name="sectumba" cloneof="sectomb" supported="no">
<description>El Secreto de la Tumba (Spain)</description>
<year>1986</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Proein Soft Line</publisher>
+ <info name="notice" value="© Loriciels. Octubre 1986" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="74801">
@@ -31793,7 +32110,7 @@ Please stick to using the floppy versions for the time being...
<software name="shermnm4" supported="no">
<description>Sherman M4 (Spain)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="59827">
@@ -32279,6 +32596,7 @@ Please stick to using the floppy versions for the time being...
<description>Skatin' USA (UK)</description>
<year>1990</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 422" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="50419">
@@ -32343,7 +32661,7 @@ Please stick to using the floppy versions for the time being...
<software name="skweeks" cloneof="skweek" supported="no">
<description>Skweek (Spain)</description>
<year>1989</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Proein Soft Line</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="85536">
@@ -32488,6 +32806,7 @@ Please stick to using the floppy versions for the time being...
<description>Snoball in Hell! (UK)</description>
<year>1989</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 418X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="36433">
@@ -32925,7 +33244,8 @@ Please stick to using the floppy versions for the time being...
<software name="southbel" supported="no">
<description>Southern Belle (UK)</description>
<year>1985</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Mike Male and Bob Hillyer" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42317">
@@ -33025,6 +33345,8 @@ Please stick to using the floppy versions for the time being...
<description>Space Hawks (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Durell Software" />
+ <info name="serial" value="SOFT 177" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="10833">
@@ -33037,6 +33359,7 @@ Please stick to using the floppy versions for the time being...
<description>Space Racer (France)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Mai 1988" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="85825">
@@ -33108,7 +33431,8 @@ Please stick to using the floppy versions for the time being...
<software name="spacetrd" cloneof="macrocos" supported="no">
<description>Space Trader (UK)</description>
<year>1986</year>
- <publisher>Amsoft</publisher>
+ <publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 414X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="68839">
@@ -33335,6 +33659,7 @@ Please stick to using the floppy versions for the time being...
<description>Spindrone (UK)</description>
<year>1988</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 413" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="61539">
@@ -33494,6 +33819,8 @@ Please stick to using the floppy versions for the time being...
<description>Spooky Castle (UK)</description>
<year>1990</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="Roy York and Brian Ison" />
+ <info name="serial" value="AT 420X" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41389">
@@ -34163,6 +34490,8 @@ Please stick to using the floppy versions for the time being...
<description>Stock-Aid (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Gem Software" />
+ <info name="serial" value="AMC-505" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="27986">
@@ -34187,6 +34516,8 @@ Please stick to using the floppy versions for the time being...
<description>Stockmarket (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Argus Press Software" />
+ <info name="serial" value="SOFT 903" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="51081">
@@ -34270,7 +34601,8 @@ Please stick to using the floppy versions for the time being...
<software name="stormlor" supported="no">
<description>Stormlord (UK)</description>
<year>1989</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
+ <info name="author" value="Raffaele Cecco" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="80280">
@@ -34789,6 +35121,8 @@ Please stick to using the floppy versions for the time being...
<description>Subterranean Stryker (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Insight Software" />
+ <info name="serial" value="SOFT 06010" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="66219">
@@ -34813,6 +35147,8 @@ Please stick to using the floppy versions for the time being...
<description>Sultan's Maze (Spain)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="alt_title" value="El Laberinto del Sultán" />
+ <info name="serial" value="AMC-134" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="40609">
@@ -34825,6 +35161,8 @@ Please stick to using the floppy versions for the time being...
<description>Sultan's Maze (UK, BASIC 1.0)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="author" value="Gem Software" />
+ <info name="serial" value="SOFT 113" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="40331">
@@ -35035,6 +35373,8 @@ Please stick to using the floppy versions for the time being...
<description>Super Pipeline II (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Taskset" />
+ <info name="serial" value="SOFT 987" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46687">
@@ -35143,7 +35483,9 @@ Please stick to using the floppy versions for the time being...
<software name="superskif" cloneof="superski" supported="no">
<description>Super Ski (France)</description>
<year>1988</year>
- <publisher>Microids</publisher>
+ <publisher>Microïds</publisher>
+ <info name="notice" value="COPYRIGHT MICROÏDS Novembre 1987" />
+ <info name="serial" value="MA 07" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="140110">
@@ -35155,7 +35497,7 @@ Please stick to using the floppy versions for the time being...
<software name="sskweekf" cloneof="sskweek" supported="no">
<description>Super Skweek (France)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="72142">
@@ -35172,7 +35514,7 @@ Please stick to using the floppy versions for the time being...
<software name="sskweek" supported="no">
<description>Super Skweek (Spain)</description>
<year>1990</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciels / Proein Soft Line</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="72123">
@@ -35327,6 +35669,7 @@ Please stick to using the floppy versions for the time being...
<description>Superkid (UK)</description>
<year>1990</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 421x" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="48101">
@@ -35339,6 +35682,7 @@ Please stick to using the floppy versions for the time being...
<description>Superkid in Space (UK)</description>
<year>1991</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 423" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="50419">
@@ -35494,6 +35838,7 @@ Please stick to using the floppy versions for the time being...
<description>The Survivors (UK)</description>
<year>1988</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 411" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="39835">
@@ -35776,6 +36121,8 @@ Please stick to using the floppy versions for the time being...
<description>Tank Commander (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Magic Logic" />
+ <info name="serial" value="SOFT 06023" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="68017">
@@ -35836,6 +36183,7 @@ Please stick to using the floppy versions for the time being...
<description>Tapper (UK)</description>
<year>1986</year>
<publisher>Amsoft</publisher>
+ <info name="serial" value="SOFT 06007" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="58331">
@@ -35908,6 +36256,7 @@ Please stick to using the floppy versions for the time being...
<description>Tascopy 464 (Spain)</description>
<year>1984</year>
<publisher>Microbyte</publisher>
+ <info name="serial" value="MUA-01" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="17991">
@@ -35937,6 +36286,7 @@ Please stick to using the floppy versions for the time being...
<description>Tasprint 464 (Spain)</description>
<year>1984</year>
<publisher>Microbyte</publisher>
+ <info name="serial" value="MUA-01" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="39837">
@@ -35970,7 +36320,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="teachbs1" supported="no">
- <description>Teach Yourself Amstrad Basic Part 1 (UK)</description>
+ <description>Teach Yourself Amstrad BASIC Part 1 (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -35987,7 +36337,7 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="teachbs2" supported="no">
- <description>Teach Yourself Amstrad Basic Part 2 (UK)</description>
+ <description>Teach Yourself Amstrad BASIC Part 2 (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
@@ -36049,7 +36399,9 @@ Please stick to using the floppy versions for the time being...
</part>
</software>
- <software name="technocp" supported="no">
+ <!-- All data is in the one tape image. When the game asks to flip the tape to side 2, just keep the tape running.
+ You may want to take note where this occurs in case you need to restart and rewind the tape. -->
+ <software name="technocp" supported="yes">
<description>Techno Cop (UK)</description>
<year>1988</year>
<publisher>Gremlin Graphics Software</publisher>
@@ -36185,7 +36537,7 @@ Please stick to using the floppy versions for the time being...
<software name="temphero" supported="no">
<description>Le Temps des Heros (Europe?)</description>
<year>1991</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="45397">
@@ -36228,6 +36580,7 @@ Please stick to using the floppy versions for the time being...
<description>Ten-Pin Challenge (UK)</description>
<year>1987</year>
<publisher>Atlantis Software</publisher>
+ <info name="serial" value="AT 409" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="81463">
@@ -36240,6 +36593,9 @@ Please stick to using the floppy versions for the time being...
<description>Tennis 3D (France)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
+ <info name="author" value="Bernard Auré" />
+ <info name="notice" value="COPYRIGHT LORICIELS Décembre 1985" /><!-- title screen: Janvier 1986 -->
+ <info name="serial" value="112" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="47065">
@@ -36251,7 +36607,7 @@ Please stick to using the floppy versions for the time being...
<software name="tenniscp" supported="no">
<description>Tennis Cup (France)</description>
<year>1989</year>
- <publisher>Loriciels</publisher>
+ <publisher>Loriciel</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="73109">
@@ -36947,7 +37303,6 @@ Please stick to using the floppy versions for the time being...
<description>Thunderbirds (UK, audio tape)</description>
<year>1989</year>
<publisher>Grandslam</publisher>
- <info name="usage" value="" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="4857121">
<rom name="thunderbirds (uk) (1988) (audio tape) [original] [tape].mp3" size="4857121" crc="b91dadfd" sha1="4f1fdcc50fd8ab7db06caf850d2c939880af6e02"/>
@@ -36983,6 +37338,8 @@ Please stick to using the floppy versions for the time being...
<description>Tie Break (France)</description>
<year>1985</year>
<publisher>Sprites</publisher>
+ <info name="author" value="Bernard Auré" />
+ <info name="serial" value="CP 017" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46295">
@@ -37096,6 +37453,8 @@ Please stick to using the floppy versions for the time being...
<description>Timeman One (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 107" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="23761">
@@ -37108,6 +37467,8 @@ Please stick to using the floppy versions for the time being...
<description>Timeman Two (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 108" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="25626">
@@ -37413,6 +37774,8 @@ Please stick to using the floppy versions for the time being...
<description>Tombstowne (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Premier Software" />
+ <info name="serial" value="SOFT 06040" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="51169">
@@ -37449,6 +37812,8 @@ Please stick to using the floppy versions for the time being...
<description>Tony Truand (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Octobre 1985" />
+ <info name="serial" value="106" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="63007">
@@ -37582,6 +37947,8 @@ Please stick to using the floppy versions for the time being...
<description>Torann (France)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
+ <info name="developer" value="Novasoft" />
+ <info name="notice" value="COPYRIGHT LORICIELS Novembre 1985" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="41337">
@@ -37765,6 +38132,8 @@ Please stick to using the floppy versions for the time being...
<description>Traffic (UK)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Andromeda Software" />
+ <info name="serial" value="SOFT 929" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42744">
@@ -38874,7 +39243,7 @@ Please stick to using the floppy versions for the time being...
<software name="uridium" supported="no">
<description>Uridium (UK)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="45321">
@@ -38899,6 +39268,8 @@ Please stick to using the floppy versions for the time being...
<description>Vagan Attack (UK)</description>
<year>1985</year>
<publisher>Atlantis Software</publisher>
+ <info name="author" value="John Green" />
+ <info name="serial" value="AT 401" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="37393">
@@ -40177,6 +40548,8 @@ Please stick to using the floppy versions for the time being...
<description>Wordhang (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 101, SOFT 201" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="34256">
@@ -40411,6 +40784,8 @@ Please stick to using the floppy versions for the time being...
<description>World-Wise (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 103" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="46224">
@@ -40420,9 +40795,11 @@ Please stick to using the floppy versions for the time being...
</software>
<software name="worldwisf" cloneof="worldwis" supported="no">
- <description>World-Wise (France)</description>
+ <description>Le Géographe - France (France)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Bourne Educational Software" />
+ <info name="serial" value="SOFT 403" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="54059">
@@ -40599,6 +40976,8 @@ Please stick to using the floppy versions for the time being...
<description>Xanagrams (UK)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
+ <info name="developer" value="Dean Software (Postern)" />
+ <info name="serial" value="SOFT 133" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="44575">
@@ -40925,7 +41304,7 @@ Please stick to using the floppy versions for the time being...
<software name="zapp" supported="no">
<description>Zapp (UK)</description>
<year>1985</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="12427">
@@ -40973,7 +41352,8 @@ Please stick to using the floppy versions for the time being...
<software name="zedis2" supported="no">
<description>Zedis II (Spain)</description>
<year>1984</year>
- <publisher>Amsoft</publisher>
+ <publisher>Microbyte</publisher>
+ <info name="serial" value="MUA-08" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="11137">
@@ -41092,6 +41472,8 @@ Please stick to using the floppy versions for the time being...
<description>Zox 2099 (France)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
+ <info name="notice" value="COPYRIGHT LORICIELS Janvier 1987" />
+ <info name="serial" value="LA 37" />
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="42399">
@@ -41115,7 +41497,7 @@ Please stick to using the floppy versions for the time being...
<software name="zynaps" supported="no">
<description>Zynaps (UK)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="56143">
@@ -41127,7 +41509,7 @@ Please stick to using the floppy versions for the time being...
<software name="zynapss" cloneof="zynaps" supported="no">
<description>Zynaps (Spain)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants / Erbe Software</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="55018">
@@ -41139,7 +41521,7 @@ Please stick to using the floppy versions for the time being...
<software name="zynapsa" cloneof="zynaps" supported="no">
<description>Zynaps (UK, alt)</description>
<year>1987</year>
- <publisher>Hewson</publisher>
+ <publisher>Hewson Consultants</publisher>
<info name="usage" value="Load with |TAPE and then RUN&quot;&quot;" />
<part name="cass1" interface="cpc_cass">
<dataarea name="cass" size="56146">
diff --git a/hash/cpc_flop.xml b/hash/cpc_flop.xml
index c58d5b02d26..fec78ae414b 100644
--- a/hash/cpc_flop.xml
+++ b/hash/cpc_flop.xml
@@ -430,7 +430,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying 20000 Avant J.C. (F) (1987).zip... --> <!-- CPC Power -->
<software name="20kajc">
- <description>20000 Avant J.C. (Fra, Trained by Grees &amp; Chany)</description>
+ <description>20000 Avant J.C. (France, Trained by Grees &amp; Chany)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;20000" />
@@ -988,7 +988,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying A320 (1989)(Loriciels)(fr)(Disk 1 of 2)[cr NPS].dsk... --> <!-- Mostly GoodCPC -->
<software name="a320_c1" cloneof="a320">
- <description>A 320 (Fra, Cracked by Grees &amp; Chany)</description>
+ <description>A 320 (France, Cracked by Grees &amp; Chany)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;A320" />
@@ -1124,7 +1124,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying A la Pursuite de Carmen Sandiego dans le Monde (1990)(Broderbund Software)(fr)(Disk 1 of 2)[cr XOR].dsk... --> <!-- Mostly GoodCPC -->
<software name="carmnwld_c1" cloneof="carmnwld">
- <description>A la Pursuite de Carmen Sandiego dans le Monde (Fra, Cracked by XOR)</description>
+ <description>A la Pursuite de Carmen Sandiego dans le Monde (France, Cracked by XOR)</description>
<year>1990</year>
<publisher>Brøderbund France</publisher>
<info name="alt_title" value="Carmen Sandiego (Box)" />
@@ -1440,7 +1440,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Abracadabra Et Les Voleurs De Temps (F) (1988).zip... --> <!-- CPC Power -->
<software name="abravolta" cloneof="abravolt" supported="no">
- <description>Abracadabra et les Voleurs de Temps (Fra, Alt)</description>
+ <description>Abracadabra et les Voleurs de Temps (France, Alt)</description>
<year>1988</year>
<publisher>Carraz Editions</publisher>
<info name="usage" value="Launch with RUN&quot;VOLEURS" />
@@ -1497,7 +1497,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Academy (F) (1987) (v2) [Original].zip... --> <!-- CPC Power -->
<software name="academyf" cloneof="academy">
- <description>Academy (Fra, v2)</description>
+ <description>Academy (France, v2)</description>
<year>1987</year>
<publisher>CRL Group</publisher>
<info name="usage" value="Launch with RUN&quot;DISC" />
@@ -1887,7 +1887,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Possibly BAD DUMP (Old DSK format) -->
<!-- Identifying Adi Environnement Ce2 (F) (128K) (2 faces) (1991) (Version Basic 1.1).zip... --> <!-- CPC Power -->
<software name="adienve2" supported="no">
- <description>Adi Environnement Ce2 (Fra, Cracked by XOR)</description>
+ <description>Adi Environnement Ce2 (France, Cracked by XOR)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ADI" />
@@ -1927,7 +1927,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Possibly BAD DUMP (Old DSK format) -->
<!-- Identifying Adi Mathematiques Ce2 (F) (128K) (2 faces) (1991).zip... --> <!-- CPC Power -->
<software name="adimathce2" cloneof="adienve2" supported="no">
- <description>Adi Mathematiques Ce2 (Fra, Cracked by XOR)</description>
+ <description>Adi Mathematiques Ce2 (France, Cracked by XOR)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Requires Adi Environnement Ce2" />
@@ -1947,7 +1947,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Possibly BAD DUMP (Old DSK format) -->
<!-- Identifying Adi Environnement Cm1 (F) (128K) (2 faces) (1991) (Version Basic 1.1).zip... --> <!-- CPC Power -->
<software name="adienvm1" supported="no">
- <description>Adi Environnement Cm1 (Fra, Cracked by XOR)</description>
+ <description>Adi Environnement Cm1 (France, Cracked by XOR)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ADI" />
@@ -2169,7 +2169,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Advanced Destroyer Simulation (F) (1990).zip... --> <!-- CPC Power -->
<software name="ads_c1" cloneof="ads">
- <description>Advanced Destroyer Simulation (Fra, Cracked by XOR)</description>
+ <description>Advanced Destroyer Simulation (France, Cracked by XOR)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;ADS" />
@@ -2332,7 +2332,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- CPC Power -->
<software name="santafe_h1" cloneof="santafe">
- <description>L'Affaire Santa Fe (Fra, Hacked to launch in BASIC)</description>
+ <description>L'Affaire Santa Fe (France, Hacked to launch in BASIC)</description>
<year>1988</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;-SANTAFE" />
@@ -2363,7 +2363,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- CPC Power -->
<software name="afsydney_h1" cloneof="afsydney">
- <description>L'Affaire Sydney (Fra, Hacked to launch in BASIC)</description>
+ <description>L'Affaire Sydney (France, Hacked to launch in BASIC)</description>
<year>1986</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;SYDNEY" />
@@ -2941,7 +2941,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Only tape released? VERIFY! -->
<!-- Identifying Alien Legion (F) (1991) (Version Basic 1.1).zip... --> <!-- CPC Power -->
<software name="alienleg" supported="partial">
- <description>Alien Legion (Fra, Cracked by Velus)</description>
+ <description>Alien Legion (France, Cracked by Velus)</description>
<year>1991</year>
<publisher>Mega Soft</publisher>
<info name="compatibility" value="128K,BASIC1.1" />
@@ -3364,7 +3364,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Amelie Minuit (F) (1985).zip... --> <!-- CPC Power -->
<software name="amelminu1" cloneof="amelminu">
- <description>Amelie Minuit (Fra, Hacked to launch in BASIC)</description>
+ <description>Amelie Minuit (France, Hacked to launch in BASIC)</description>
<year>1985</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;AMELIE" />
@@ -3444,7 +3444,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Amnesia (F,UK) (128K) (1998) (PD).zip... --> <!-- CPC Power -->
<software name="amnesia" supported="no">
- <description>Amnesia (Fra, UK)</description>
+ <description>Amnesia (France, UK)</description>
<year>1998</year>
<publisher>Rudiger ~ DBT</publisher>
<info name="usage" value="Needs 128k. Launch with RUN&quot;AMNESIA" />
@@ -3903,7 +3903,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Anglais College 6e-5e (F) (2 faces) (1988).zip... --> <!-- CPC Power -->
<software name="angcol65a" cloneof="angcol65">
- <description>Anglais College 6ème / 5ème (Fra, Alt)</description>
+ <description>Anglais College 6ème / 5ème (France, Alt)</description>
<year>1988</year>
<publisher>Cedic Nathan</publisher>
<info name="usage" value="Launch with RUN&quot;DEPART" />
@@ -3939,7 +3939,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Anglais Primaire (F) (2 faces) (1989) [Original].zip... --> <!-- CPC Power -->
<software name="anglaisp1" cloneof="anglaisp">
- <description>Anglais Primaire (Fra, Alt Disk 2)</description>
+ <description>Anglais Primaire (France, Alt Disk 2)</description>
<year>1989</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;A&quot; and RUN&quot;B&quot;" />
@@ -3957,7 +3957,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- CPC Power -->
<software name="anglaisp2" cloneof="anglaisp">
- <description>Anglais Primaire (Fra, Alt)</description>
+ <description>Anglais Primaire (France, Alt)</description>
<year>1989</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;A&quot; and RUN&quot;B&quot;" />
@@ -4157,7 +4157,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying L'Anneau De Zengara (F) (2 faces) (1987).zip... --> <!-- CPC Power -->
<software name="zengara_h1" cloneof="zengara">
- <description>L'Anneau de Zengara (Fra, Hacked by McSpe)</description>
+ <description>L'Anneau de Zengara (France, Hacked by McSpe)</description>
<year>1987</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ZENGARA" />
@@ -4280,7 +4280,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Antalex - La Cite Perdue (F) (K7) (19xx) (PD).zip... --> <!-- CPC Power -->
<!-- disk with crc e5387160 same data with diff header -->
<software name="antalex">
- <description>Antalex - La Citè Perdue (Fra, Ripped from Cassette)</description>
+ <description>Antalex - La Citè Perdue (France, Ripped from Cassette)</description>
<year>19??</year>
<publisher>Lionel Paquin</publisher><!-- PD -->
<info name="usage" value="Launch with RUN&quot;ANTALEX" />
@@ -4380,7 +4380,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Apocalypse (F) (2 faces) (1988).zip... --> <!-- CPC Power -->
<software name="apocalyp">
- <description>Apocalypse (Fra, Cracked by Exocet)</description>
+ <description>Apocalypse (France, Cracked by Exocet)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;APOCALYP" />
@@ -4429,7 +4429,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Apprends-Moi A Lire 2 (F) (2 faces) (1986).zip... --> <!-- CPC Power -->
<software name="apprenl2_h1" cloneof="apprenl2">
- <description>Apprends-Moi à Lire 2 (Fra, Hacked by Tom et Jerry)</description>
+ <description>Apprends-Moi à Lire 2 (France, Hacked by Tom et Jerry)</description>
<year>1986</year>
<publisher>Cedic Nathan</publisher>
<info name="usage" value="Launch with RUN&quot;-DEPART" />
@@ -4513,7 +4513,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Aquad (F) (K7) (1985).zip... --> <!-- CPC Power -->
<software name="aquad" supported="no">
- <description>Aquad (Fra, Ripped from Cassette)</description>
+ <description>Aquad (France, Ripped from Cassette)</description>
<year>1985</year>
<publisher>Norsoft</publisher>
<info name="usage" value="Launch with RUN&quot;AQUAD" />
@@ -5161,7 +5161,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying L'Art De La Guerre (F) (128K) (2 faces) (1990).zip... --> <!-- CPC Power -->
<software name="artguere_h1" cloneof="artguere">
- <description>L'Art de la Guerre (Fra, Unprotected)</description>
+ <description>L'Art de la Guerre (France, Unprotected)</description>
<year>1990</year>
<publisher>Broderbund France</publisher>
<info name="usage" value="Launch with RUN&quot;ART" />
@@ -5440,7 +5440,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Asterix Et La Potion Magique (F) (1988).zip... --> <!-- CPC Power -->
<software name="asterpm_h1" cloneof="asterpm">
- <description>Asterix et la Potion Magique (Fra, Unprotected?)</description>
+ <description>Asterix et la Potion Magique (France, Unprotected?)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ASTERIX" />
@@ -5533,7 +5533,7 @@ is shared by a lot of sets... is it a generic boot disk?
</software>
<software name="astr2001">
- <description>Astro 2001 (Fra, v2.2)</description>
+ <description>Astro 2001 (France, v2.2)</description>
<year>1988</year>
<publisher>Semaphore</publisher>
<info name="usage" value="Launch with RUN&quot;INSTALL" />
@@ -5699,7 +5699,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Atland (F) (128K) (1991) (Prototype).zip... --> <!-- CPC Power -->
<!-- disk with crc c5359dcf has same data with diff header!-->
<software name="atland">
- <description>Atland (Fra, Prototype?)</description>
+ <description>Atland (France, Prototype?)</description>
<year>1991</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Launch with RUN&quot;ATLAND" />
@@ -5725,7 +5725,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Atlantis (F) (1985) [Original].zip... --> <!-- CPC Power -->
<software name="atlantif">
- <description>Atlantis (Fra, Cobra Soft)</description>
+ <description>Atlantis (France, Cobra Soft)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;DISC" />
@@ -6052,7 +6052,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Au Nom de L'Hermine (F) (2 faces) (1987).zip... --> <!-- CPC Power -->
<software name="hermine1" cloneof="hermine">
- <description>Au Nom de l'Hermine (Fra, Unprotected?)</description>
+ <description>Au Nom de l'Hermine (France, Unprotected?)</description>
<year>1987</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -6353,7 +6353,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- CPC Power -->
<software name="jburton_h1" cloneof="bigtroub">
- <description>Les Aventures de Jack Burton (Fra, Unprotected)</description>
+ <description>Les Aventures de Jack Burton (France, Unprotected)</description>
<year>1987</year>
<publisher>Electric Dreams</publisher>
<part name="flop1" interface="floppy_3">
@@ -6407,7 +6407,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Le Crepuscule Du Naja (F) (1987) (v2) [Original].zip... --> <!-- CPC Power -->
<software name="crepnajav2" cloneof="crepnaja">
- <description>Le Crepuscule du Naja (Fra, v2)</description>
+ <description>Le Crepuscule du Naja (France, v2)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;JEU" />
@@ -6600,7 +6600,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying L'Ange de Cristal (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="angecris1" cloneof="getdext2">
- <description>L'Ange de Cristal (Fra, Unprotected?)</description>
+ <description>L'Ange de Cristal (France, Unprotected?)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;ERE" />
@@ -7128,7 +7128,7 @@ is shared by a lot of sets... is it a generic boot disk?
<!-- Identifying Les Aventures De Moktar (F) (1992).zip... --> <!-- CPC Power -->
<software name="moktar_t1" cloneof="titus">
- <description>Les Aventures de Moktar (Fra, Trained by XOR)</description>
+ <description>Les Aventures de Moktar (France, Trained by XOR)</description>
<year>1992</year>
<publisher>Titus</publisher>
<info name="usage" value="Launch with RUN&quot;MOKTAR" />
@@ -7478,7 +7478,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying 3D Morpion (F) (1985) (Version 2) [Hebdogiciel].zip... --> <!-- CPC Power -->
<software name="3dmorpio">
- <description>3D Morpion (Fra, v.2)</description>
+ <description>3D Morpion (France, v.2)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;3DMORPIO" />
@@ -7597,7 +7597,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Actref (F) (1988) (Version Basic 1.1) [CPC Infos].zip... --> <!-- CPC Power -->
<software name="actref">
- <description>Actref (Fra, Bugfixed)</description>
+ <description>Actref (France, Bugfixed)</description>
<year>1988</year>
<publisher>CPC Infos</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -7637,7 +7637,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Agent Secret Z33 (F) (1990) [CPC].zip... --> <!-- CPC Power -->
<software name="agentz33">
- <description>Agent Secret Z33 (Fra, Bugfixed)</description>
+ <description>Agent Secret Z33 (France, Bugfixed)</description>
<year>1990</year>
<publisher>CPC</publisher>
<info name="usage" value="Launch with RUN&quot;AGENT" />
@@ -7689,7 +7689,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Alien (F) (1985) [Hebdogiciel].zip... --> <!-- CPC Power -->
<software name="alienf">
- <description>Alien (Fra, Hebdogiciel)</description>
+ <description>Alien (France, Hebdogiciel)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;ALIEN" />
@@ -7782,7 +7782,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Alphabet (F) (1984) [Amstrad Jeux D'Action].zip... --> <!-- CPC Power -->
<software name="alphabet">
- <description>Alphabet (Fra, Amstrad Jeux d'Action)</description>
+ <description>Alphabet (France, Amstrad Jeux d'Action)</description>
<year>1984</year>
<publisher>Amstrad Jeux d'Action</publisher>
<info name="usage" value="Launch with RUN&quot;ALPHABET" />
@@ -7795,7 +7795,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Alphabet (F) (1988) [AM-Mag].zip... --> <!-- CPC Power -->
<software name="alphabam">
- <description>Alphabet (Fra, AM-Mag)</description>
+ <description>Alphabet (France, AM-Mag)</description>
<year>1988</year>
<publisher>AM-Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -7962,7 +7962,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Anagrammes (F) (1985) [Super Jeux Amstrad - 50 programmes de jeux en Basic].zip... --> <!-- CPC Power -->
<software name="anagram1">
- <description>Anagrammes (Fra, Super Jeux Amstrad)</description>
+ <description>Anagrammes (France, Super Jeux Amstrad)</description>
<year>1985</year>
<publisher>Super Jeux Amstrad - 50 programmes de jeux en Basic</publisher>
<info name="usage" value="Launch with RUN&quot;ANA" />
@@ -7976,7 +7976,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Anagrammes (F) (1987) [Amstrad Magazine].zip... --> <!-- CPC Power -->
<!-- disk with crc 1e9a5692 same data with diff header -->
<software name="anagram2">
- <description>Anagrammes (Fra, Amstrad Magazine)</description>
+ <description>Anagrammes (France, Amstrad Magazine)</description>
<year>1987</year>
<publisher>Amstrad Magazine</publisher>
<info name="usage" value="Launch with RUN&quot;ANA" />
@@ -8002,7 +8002,7 @@ stick to CPC-Power disks, when available)
<!-- CPC Power -->
<software name="apocalmm">
- <description>Apocalypse (Fra, Micro Mag)</description>
+ <description>Apocalypse (France, Micro Mag)</description>
<year>1989</year>
<publisher>Micro Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -8264,7 +8264,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Awari (F) (1985) [CPC].zip... --> <!-- CPC Power -->
<software name="awari">
- <description>Awari (Fra, CPC)</description>
+ <description>Awari (France, CPC)</description>
<year>1985</year>
<publisher>CPC</publisher>
<info name="usage" value="Launch with RUN&quot;AWARI" />
@@ -8277,7 +8277,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Awari (F) (1985) [Super Jeux Amstrad - 50 programmes de jeux en Basic].zip... --> <!-- CPC Power -->
<software name="awaria">
- <description>Awari (Fra, Super Jeux Amstrad)</description>
+ <description>Awari (France, Super Jeux Amstrad)</description>
<year>1985</year>
<publisher>Super Jeux Amstrad - 50 programmes de jeux en Basic</publisher>
<info name="usage" value="Launch with RUN&quot;AWARI" />
@@ -8500,7 +8500,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying B.A.T. (F) - Face 3.dsk... --> <!-- CPC Base -->
<!-- Identifying B.A.T. (F) - Face 4.dsk... --> <!-- CPC Base -->
<software name="batfa" cloneof="bat" supported="no">
- <description>B.A.T. (Fra, Alt)</description>
+ <description>B.A.T. (France, Alt)</description>
<year>1991</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -8530,7 +8530,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying B.A.T. (1991)(Ubi Soft)(fr)(Disk 3 of 4).dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying B.A.T. (1991)(Ubi Soft)(fr)(Disk 4 of 4).dsk... --> <!-- Mostly GoodCPC -->
<software name="batfb" cloneof="bat" supported="no">
- <description>B.A.T. (Fra, Alt 2)</description>
+ <description>B.A.T. (France, Alt 2)</description>
<year>1991</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -8559,7 +8559,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying B.A.T. (F) (1991) (Disk 2 of 4) [a1].dsk... --> <!-- GoodCPC -->
<!-- Identifying B.A.T. (F) (1991) (Disk 3 of 4) [a1].dsk... --> <!-- GoodCPC -->
<software name="batfc" cloneof="bat" supported="no">
- <description>B.A.T. (Fra, Alt 3)</description>
+ <description>B.A.T. (France, Alt 3)</description>
<year>1991</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -8581,7 +8581,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying B.A.T. (F) (1991) (Disk 4 of 4) (CPM) [a2].dsk... --> <!-- GoodCPC -->
<software name="batfd" cloneof="bat" supported="no">
- <description>B.A.T. (Fra, Alt Disk 4?)</description>
+ <description>B.A.T. (France, Alt Disk 4?)</description>
<year>1991</year>
<publisher>Ubi Soft</publisher>
<part name="flop4" interface="floppy_3">
@@ -9040,7 +9040,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Back to the Golden Axe (1991)(Ubi Soft)(fr)(Disk 1 of 2)[cr Pynard][t +4 Pynard].dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Back to the Golden Axe (1991)(Ubi Soft)(fr)(Disk 2 of 2)[cr Pynard][t +4 Pynard].dsk... --> <!-- Mostly GoodCPC -->
<software name="backtoga_t1" cloneof="backtoga" supported="no">
- <description>Back to the Golden Axe (Fra, Trained by Pynard)</description>
+ <description>Back to the Golden Axe (France, Trained by Pynard)</description>
<year>1991</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -9058,7 +9058,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Back to the Golden Axe (1991)(Ubi Soft)(fr)(Disk 1 of 2)[cr Pynard][t +4 Pynard][a].dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Back to the Golden Axe (1991)(Ubi Soft)(fr)(Disk 2 of 2)[cr Pynard][t +4 Pynard][a].dsk... --> <!-- Mostly GoodCPC -->
<software name="backtoga_t1a" cloneof="backtoga" supported="no">
- <description>Back to the Golden Axe (Fra, Trained by Pynard, Alt)</description>
+ <description>Back to the Golden Axe (France, Trained by Pynard, Alt)</description>
<year>1991</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -9087,7 +9087,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bacterik Dream (1987)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="bacterika" cloneof="bacterik" supported="no">
- <description>Bacterik Dream (Fra, Alt)</description>
+ <description>Bacterik Dream (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -9111,7 +9111,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bactron (F) (1986).zip... --> <!-- CPC Power -->
<software name="bactrona" cloneof="bactron" supported="no">
- <description>Bactron (Fra, Alt)</description>
+ <description>Bactron (France, Alt)</description>
<year>1986</year>
<publisher>Loriciel</publisher>
<part name="flop1" interface="floppy_3">
@@ -9123,7 +9123,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bactron (1986)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="bactronb" cloneof="bactron" supported="no">
- <description>Bactron (Fra, Alt2)</description>
+ <description>Bactron (France, Alt2)</description>
<year>1986</year>
<publisher>Loriciel</publisher>
<part name="flop1" interface="floppy_3">
@@ -9135,7 +9135,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying ZZZ_UNK_bactron.dsk... -->
<software name="bactronc" cloneof="bactron" supported="no">
- <description>Bactron (Fra, Alt 3)</description>
+ <description>Bactron (France, Alt 3)</description>
<year>1986</year>
<publisher>Loriciel</publisher>
<part name="flop1" interface="floppy_3">
@@ -9211,7 +9211,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bad Max (19xx)(Transoft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="badmaxa" cloneof="badmax" supported="no">
- <description>Bad Max (Fra, Alt)</description>
+ <description>Bad Max (France, Alt)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<part name="flop1" interface="floppy_3">
@@ -9223,7 +9223,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bad Max (F) (1985) [a2].dsk... --> <!-- GoodCPC -->
<software name="badmaxb" cloneof="badmax" supported="no">
- <description>Bad Max (Fra, Alt 2)</description>
+ <description>Bad Max (France, Alt 2)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<part name="flop1" interface="floppy_3">
@@ -9235,7 +9235,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bad Max (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="badmaxc" cloneof="badmax" supported="no">
- <description>Bad Max (Fra, Alt 3)</description>
+ <description>Bad Max (France, Alt 3)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<part name="flop1" interface="floppy_3">
@@ -9313,7 +9313,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Balade a Cologne (F) (19xx) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<!-- Identifying Balade a Cologne (F) (19xx) (Disk 2 of 2).dsk... --> <!-- GoodCPC -->
<software name="balcologa" cloneof="balcolog" supported="no">
- <description>Balade a Cologne (Fra, Alt)</description>
+ <description>Balade a Cologne (France, Alt)</description>
<year>1989</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -9330,7 +9330,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Balade Au Pays De Big Ben (F) (1987) (CPM) [Original].zip... --> <!-- CPC Power -->
<software name="balbigbnf" cloneof="balbigbn" supported="no">
- <description>Balade au Pays de Big Ben (Fra, Single Disk)</description>
+ <description>Balade au Pays de Big Ben (France, Single Disk)</description>
<year>1987</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM and then BALADE" />
@@ -9401,7 +9401,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Balade Outre-Rhin (F,G) (2 Faces) (1986) [Original].zip... --> <!-- CPC Power -->
<software name="balorhin" supported="no">
- <description>Balade Outre Rhin (Fra, Ger)</description>
+ <description>Balade Outre Rhin (France, Ger)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -9418,7 +9418,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying ZZZ_UNK_BALA_RHI.dsk... -->
<software name="balorhina" cloneof="balorhin" supported="no">
- <description>Balade Outre Rhin (Fra, Ger, Alt)</description>
+ <description>Balade Outre Rhin (France, Ger, Alt)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -9435,7 +9435,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Balade Outre-Rhin (F,G).dsk... --> <!-- CPC Base -->
<software name="balorhinb" cloneof="balorhin" supported="no">
- <description>Balade Outre Rhin (Fra, Ger, Single Disk)</description>
+ <description>Balade Outre Rhin (France, Ger, Single Disk)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -10340,7 +10340,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bard's Tale (F), The - Disk 1A.dsk... --> <!-- CPC Base -->
<!-- Identifying Bard's Tale (F), The - Disk 1B.dsk... --> <!-- CPC Base -->
<software name="brdtalefa" cloneof="brdtale" supported="no">
- <description>The Bard's Tale (Fra, Alt)</description>
+ <description>The Bard's Tale (France, Alt)</description>
<year>1988</year>
<publisher>Electronic Arts</publisher>
<part name="flop1" interface="floppy_3">
@@ -10549,7 +10549,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying La Bataille Des Brevets (F) (1986).zip... --> <!-- CPC Power -->
<software name="batbrevta" cloneof="batbrevt" supported="no">
- <description>La Bataille des Brevets (Fra, Alt)</description>
+ <description>La Bataille des Brevets (France, Alt)</description>
<year>1986</year>
<publisher>MPS</publisher>
<part name="flop1" interface="floppy_3">
@@ -10969,7 +10969,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying La Bataille D'Angleterre (F) (1985).zip... --> <!-- CPC Power -->
<software name="battlebrfa" cloneof="battlebr" supported="no">
- <description>La Bataille d'Angleterre (Fra, Alt)</description>
+ <description>La Bataille d'Angleterre (France, Alt)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11017,7 +11017,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bataille d'Angleterre (F), La.dsk... --> <!-- CPC Base -->
<software name="battlebrfb" cloneof="battlebr" supported="no">
- <description>La Bataille d'Angleterre (Fra, Alt 2)</description>
+ <description>La Bataille d'Angleterre (France, Alt 2)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11029,7 +11029,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bataille D'Angleterre, La (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="battlebrfc" cloneof="battlebr" supported="no">
- <description>La Bataille d'Angleterre (Fra, Alt 3)</description>
+ <description>La Bataille d'Angleterre (France, Alt 3)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11089,7 +11089,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bataille Pour La RFA - Battlefield Germany (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="bfieldgrfa" cloneof="bfieldgr" supported="no">
- <description>Bataille Pour R.F.A. (Fra, Alt)</description>
+ <description>Bataille Pour R.F.A. (France, Alt)</description>
<year>1987</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11273,7 +11273,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Battle For Midway (F) (1985).zip... --> <!-- CPC Power -->
<software name="midwayfa" cloneof="midway" supported="no">
- <description>Bataille Pour Midway (Fra, Alt)</description>
+ <description>Bataille Pour Midway (France, Alt)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11297,7 +11297,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Battle for Midway (F) (1985) [a1].dsk... --> <!-- GoodCPC -->
<software name="midwayfb" cloneof="midway" supported="no">
- <description>Bataille Pour Midway (Fra, Alt 2)</description>
+ <description>Bataille Pour Midway (France, Alt 2)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11309,7 +11309,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Battle for Midway (F) (1985) [a2].dsk... --> <!-- GoodCPC -->
<software name="midwayfc" cloneof="midway" supported="no">
- <description>Bataille Pour Midway (Fra, Alt 3)</description>
+ <description>Bataille Pour Midway (France, Alt 3)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11321,7 +11321,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Battle for Midway (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="midwayfd" cloneof="midway" supported="no">
- <description>Bataille Pour Midway (Fra, Alt 4)</description>
+ <description>Bataille Pour Midway (France, Alt 4)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -11333,7 +11333,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bataille pour Midway (F).dsk... --> <!-- CPC Base -->
<software name="midwayfe" cloneof="midway" supported="no">
- <description>Bataille Pour Midway (Fra, Alt 5)</description>
+ <description>Bataille Pour Midway (France, Alt 5)</description>
<year>1985</year>
<publisher>P.S.S.</publisher>
<part name="flop1" interface="floppy_3">
@@ -12457,7 +12457,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Big Band (F) (4 faces) (1986).zip... --> <!-- CPC Power -->
<software name="bigbanda" cloneof="bigband" supported="no">
- <description>Big Band (Fra, Alt)</description>
+ <description>Big Band (France, Alt)</description>
<year>1986</year>
<publisher>SoftHawk</publisher>
<part name="flop1" interface="floppy_3">
@@ -12487,7 +12487,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Big Band (F) (1986) (Disk 3 of 4).dsk... --> <!-- GoodCPC -->
<!-- Identifying Big Band (F) (1986) (Disk 4 of 4).dsk... --> <!-- GoodCPC -->
<software name="bigbandb" cloneof="bigband" supported="no">
- <description>Big Band (Fra, Alt 2)</description>
+ <description>Big Band (France, Alt 2)</description>
<year>1986</year>
<publisher>SoftHawk</publisher>
<part name="flop1" interface="floppy_3">
@@ -12778,7 +12778,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy la Banlieue (F).dsk... --> <!-- CPC Base -->
<software name="billya" cloneof="billy" supported="no">
- <description>Billy La Banlieue (Fra, Alt)</description>
+ <description>Billy La Banlieue (France, Alt)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12790,7 +12790,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy_la_Banlieue_1 (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="billyb" cloneof="billy" supported="no">
- <description>Billy La Banlieue (Fra, Alt 2)</description>
+ <description>Billy La Banlieue (France, Alt 2)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12802,7 +12802,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy La Banlieue (F) (1986).zip... --> <!-- CPC Power -->
<software name="billy_t1" cloneof="billy" supported="no">
- <description>Billy La Banlieue (Fra, Trained)</description>
+ <description>Billy La Banlieue (France, Trained)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12814,7 +12814,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy la Banlieue (1986)(Loriciels)(fr)[t].dsk... --> <!-- Mostly GoodCPC -->
<software name="billy_t1a" cloneof="billy" supported="no">
- <description>Billy La Banlieue (Fra, Trained, Alt)</description>
+ <description>Billy La Banlieue (France, Trained, Alt)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12826,7 +12826,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy la Banlieue (F) (1986) [h2].dsk... --> <!-- GoodCPC -->
<software name="billy_h1" cloneof="billy" supported="no">
- <description>Billy La Banlieue (Fra, Hacked)</description>
+ <description>Billy La Banlieue (France, Hacked)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12863,7 +12863,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy La Banlieue 2 (F) (1987).zip... --> <!-- CPC Power -->
<software name="billy2a" cloneof="billy2" supported="no">
- <description>Billy 2 (Fra, Alt)</description>
+ <description>Billy 2 (France, Alt)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12875,7 +12875,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy 2 (1987)(Loriciels).dsk... --> <!-- Mostly GoodCPC -->
<software name="billy2b" cloneof="billy2" supported="no">
- <description>Billy 2 (Fra, Alt 2)</description>
+ <description>Billy 2 (France, Alt 2)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12887,7 +12887,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy la Banlieue 2 (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="billy2c" cloneof="billy2" supported="no">
- <description>Billy 2 (Fra, Alt 3)</description>
+ <description>Billy 2 (France, Alt 3)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -12899,7 +12899,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Billy_2 (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="billy2d" cloneof="billy2" supported="no">
- <description>Billy 2 (Fra, Alt 4)</description>
+ <description>Billy 2 (France, Alt 4)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -13162,7 +13162,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Birdie (F) (D7) (1987).zip... --> <!-- CPC Power -->
<software name="birdiefd" cloneof="birdie" supported="no">
- <description>Birdie (Fra, Diskette)</description>
+ <description>Birdie (France, Diskette)</description>
<year>1987</year>
<publisher>Ere Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -13174,7 +13174,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Birdie (F) (K7) (1987).zip... --> <!-- CPC Power -->
<software name="birdief_k7" cloneof="birdie" supported="no">
- <description>Birdie (Fra, Ripped from Cassette)</description>
+ <description>Birdie (France, Ripped from Cassette)</description>
<year>1987</year>
<publisher>Ere Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -13246,7 +13246,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Birdie (F) (1987) [a1].dsk... --> <!-- GoodCPC -->
<software name="birdiefa" cloneof="birdie" supported="no">
- <description>Birdie (Fra, Alt)</description>
+ <description>Birdie (France, Alt)</description>
<year>1987</year>
<publisher>Ere Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -14151,7 +14151,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying The Blue Crystal (F) (2 faces) (1985).zip... --> <!-- CPC Power -->
<software name="bluecrysa" cloneof="bluecrys" supported="no">
- <description>The Blue Crystal (Fra, Alt)</description>
+ <description>The Blue Crystal (France, Alt)</description>
<year>1985</year>
<publisher>Rainbow Arts</publisher>
<part name="flop1" interface="floppy_3">
@@ -14169,7 +14169,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blue Crystal, The (1985)(Rainbow Arts)(Disk 1 of 2)[cr NPS].dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Blue Crystal, The (1985)(Rainbow Arts)(Disk 2 of 2)[cr NPS].dsk... --> <!-- Mostly GoodCPC -->
<software name="bluecrys_c1" cloneof="bluecrys" supported="no">
- <description>The Blue Crystal (Fra, Cracked by NPS)</description>
+ <description>The Blue Crystal (France, Cracked by NPS)</description>
<year>1985</year>
<publisher>Rainbow Arts</publisher>
<part name="flop1" interface="floppy_3">
@@ -14222,7 +14222,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blue War (F) (1986).zip... --> <!-- CPC Power -->
<software name="bluewara" cloneof="bluewar" supported="no">
- <description>Blue War (Fra, Alt)</description>
+ <description>Blue War (France, Alt)</description>
<year>1986</year>
<publisher>First Game Blot</publisher>
<part name="flop1" interface="floppy_3">
@@ -14234,7 +14234,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blue-War (1987)(First Game Blot)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="bluewarb" cloneof="bluewar" supported="no">
- <description>Blue War (Fra, Alt 2)</description>
+ <description>Blue War (France, Alt 2)</description>
<year>1986</year>
<publisher>First Game Blot</publisher>
<part name="flop1" interface="floppy_3">
@@ -14246,7 +14246,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blue-War (1987)(First Game Blot).dsk... --> <!-- Mostly GoodCPC -->
<software name="bluewarc" cloneof="bluewar" supported="no">
- <description>Blue War (Fra, Alt 3)</description>
+ <description>Blue War (France, Alt 3)</description>
<year>1986</year>
<publisher>First Game Blot</publisher>
<part name="flop1" interface="floppy_3">
@@ -14276,7 +14276,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blueberry (1987)(Coktel Vision)(fr)(Disk 1 of 2)[cpm version].dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Blueberry (1987)(Coktel Vision)(fr)(Disk 2 of 2)[cpm version].dsk... --> <!-- Mostly GoodCPC -->
<software name="blueberra" cloneof="blueberr" supported="no">
- <description>Blueberry (Fra, Alt)</description>
+ <description>Blueberry (France, Alt)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -14294,7 +14294,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blue Berry (F) (1988) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Blue Berry (F) (1988) (Disk 2 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="blueberrb" cloneof="blueberr" supported="no">
- <description>Blueberry (Fra, Alt 2)</description>
+ <description>Blueberry (France, Alt 2)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -14312,7 +14312,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Blue Berry (F) (1988) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<!-- Identifying Blue Berry (F) (1988) (Disk 2 of 2).dsk... --> <!-- GoodCPC -->
<software name="blueberrc" cloneof="blueberr" supported="no">
- <description>Blueberry (Fra, Alt 3)</description>
+ <description>Blueberry (France, Alt 3)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -14557,7 +14557,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob Morane Chevalerie (F) (1987).zip... --> <!-- CPC Power -->
<software name="bobmchev_c1" cloneof="bobmchev" supported="no">
- <description>Bob Morane - Chevalerie I (Fra, Cracked by Best &amp; Chris)</description>
+ <description>Bob Morane - Chevalerie I (France, Cracked by Best &amp; Chris)</description>
<year>1987</year>
<publisher>Infogrames</publisher>
<part name="flop1" interface="floppy_3">
@@ -14569,7 +14569,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob_Morane_Chevalerie__FRENCH__BEST-CHRIS (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="bobmchev_c1a" cloneof="bobmchev" supported="no">
- <description>Bob Morane - Chevalerie I (Fra, Cracked by Best &amp; Chris, Alt)</description>
+ <description>Bob Morane - Chevalerie I (France, Cracked by Best &amp; Chris, Alt)</description>
<year>1987</year>
<publisher>Infogrames</publisher>
<part name="flop1" interface="floppy_3">
@@ -14581,7 +14581,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob Morane (1988)(Infogrames)[cr Best &amp; Chris].dsk... --> <!-- Mostly GoodCPC -->
<software name="bobmchev_c1b" cloneof="bobmchev" supported="no">
- <description>Bob Morane - Chevalerie I (Fra, Cracked by Best &amp; Chris, Alt 2)</description>
+ <description>Bob Morane - Chevalerie I (France, Cracked by Best &amp; Chris, Alt 2)</description>
<year>1987</year>
<publisher>Infogrames</publisher>
<part name="flop1" interface="floppy_3">
@@ -14593,7 +14593,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob Morane Jungle (F) (1987).zip... --> <!-- CPC Power -->
<software name="bobmjung" supported="no">
- <description>Bob Morane - Jungle 1 (Fra, Cracked by Best &amp; Chris)</description>
+ <description>Bob Morane - Jungle 1 (France, Cracked by Best &amp; Chris)</description>
<year>1987</year>
<publisher>Infogrames</publisher>
<part name="flop1" interface="floppy_3">
@@ -14605,7 +14605,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob Morane - Jungle 1 (1987)(Infogrames)[cr Best &amp; Chris].dsk... --> <!-- Mostly GoodCPC -->
<software name="bobmjung_c1a" cloneof="bobmjung" supported="no">
- <description>Bob Morane - Jungle 1 (Fra, Cracked by Best &amp; Chris, Alt)</description>
+ <description>Bob Morane - Jungle 1 (France, Cracked by Best &amp; Chris, Alt)</description>
<year>1987</year>
<publisher>Infogrames</publisher>
<part name="flop1" interface="floppy_3">
@@ -14617,7 +14617,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob_Morane_Jungle__BEST-CHRIS (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="bobmjung_c1b" cloneof="bobmjung" supported="no">
- <description>Bob Morane - Jungle 1 (Fra, Cracked by Best &amp; Chris, Alt 2)</description>
+ <description>Bob Morane - Jungle 1 (France, Cracked by Best &amp; Chris, Alt 2)</description>
<year>1987</year>
<publisher>Infogrames</publisher>
<part name="flop1" interface="floppy_3">
@@ -14837,7 +14837,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob Winner (F) (1986) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Bob Winner (F) (1986) (Disk 2 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="bobwinf1" cloneof="bobwin" supported="no">
- <description>Bob Winner (Fra, Alt)</description>
+ <description>Bob Winner (France, Alt)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -14855,7 +14855,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bob Winner (F) (1986) (Disk 1 of 2) [a2].dsk... --> <!-- GoodCPC -->
<!-- Identifying Bob Winner (F) (1986) (Disk 2 of 2) [a2].dsk... --> <!-- GoodCPC -->
<software name="bobwinf2" cloneof="bobwin" supported="no">
- <description>Bob Winner (Fra, Alt 2)</description>
+ <description>Bob Winner (France, Alt 2)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -16847,7 +16847,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bubble Ghost (F) (1988).zip... --> <!-- CPC Power -->
<software name="bublghsta" cloneof="bublghst" supported="no">
- <description>Bubble Ghost (Fra, Alt)</description>
+ <description>Bubble Ghost (France, Alt)</description>
<year>1988</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -16859,7 +16859,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bubble Ghost (1988)(ERE Informatique)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="bublghstb" cloneof="bublghst" supported="no">
- <description>Bubble Ghost (Fra, Alt 2)</description>
+ <description>Bubble Ghost (France, Alt 2)</description>
<year>1988</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -16871,7 +16871,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bubble Ghost (F) (1988) [a1].dsk... --> <!-- GoodCPC -->
<software name="bublghstc" cloneof="bublghst" supported="no">
- <description>Bubble Ghost (Fra, Alt 3)</description>
+ <description>Bubble Ghost (France, Alt 3)</description>
<year>1988</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -16883,7 +16883,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bubble Ghost (F) (1988).dsk... --> <!-- GoodCPC -->
<software name="bublghstd" cloneof="bublghst" supported="no">
- <description>Bubble Ghost (Fra, Alt 4)</description>
+ <description>Bubble Ghost (France, Alt 4)</description>
<year>1988</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -17242,7 +17242,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Buggy 2 (1986)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="buggy2a" cloneof="buggy2" supported="no">
- <description>Buggy II (Fra, Alt)</description>
+ <description>Buggy II (France, Alt)</description>
<year>1986</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -17254,7 +17254,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Buggy 2 (1986)(Chip)(fr)[a].dsk... --> <!-- Mostly GoodCPC -->
<software name="buggy2b" cloneof="buggy2" supported="no">
- <description>Buggy II (Fra, Alt 2)</description>
+ <description>Buggy II (France, Alt 2)</description>
<year>1986</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -17554,7 +17554,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bumpy (F) (1989).zip... --> <!-- CPC Power -->
<software name="bumpya" cloneof="bumpy" supported="no">
- <description>Bumpy (Fra, Alt)</description>
+ <description>Bumpy (France, Alt)</description>
<year>1989</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -17566,7 +17566,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bumpy (1989)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="bumpyb" cloneof="bumpy" supported="no">
- <description>Bumpy (Fra, Alt 2)</description>
+ <description>Bumpy (France, Alt 2)</description>
<year>1989</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -17578,7 +17578,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bumpy (F) (1989) [a1].dsk... --> <!-- GoodCPC -->
<software name="bumpyc" cloneof="bumpy" supported="no">
- <description>Bumpy (Fra, Alt 3)</description>
+ <description>Bumpy (France, Alt 3)</description>
<year>1989</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -17590,7 +17590,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bumpy (F) (1989) [Original] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="bumpyd" cloneof="bumpy" supported="no">
- <description>Bumpy (Fra, Alt 4)</description>
+ <description>Bumpy (France, Alt 4)</description>
<year>1989</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -17602,7 +17602,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bumpy (1989)(Loriciels)(fr)[t].dsk... --> <!-- Mostly GoodCPC -->
<software name="bumpy_t1" cloneof="bumpy" supported="no">
- <description>Bumpy (Fra, Trained)</description>
+ <description>Bumpy (France, Trained)</description>
<year>1989</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -17614,7 +17614,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bumpy_Chany (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="bumpy_c1" cloneof="bumpy" supported="no">
- <description>Bumpy (Fra, Cracked by Chany)</description>
+ <description>Bumpy (France, Cracked by Chany)</description>
<year>1989</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -17800,7 +17800,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Burglar (1991)(Lankhor)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Burglar (1991)(Lankhor)(fr)(Disk 2 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="burglara" cloneof="burglar" supported="no">
- <description>Burglar (Fra, Alt)</description>
+ <description>Burglar (France, Alt)</description>
<year>1991</year>
<publisher>Lankhor</publisher>
<part name="flop1" interface="floppy_3">
@@ -17818,7 +17818,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Burglar (F) (1991) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<!-- Identifying Burglar (F) (1991) (Disk 2 of 2).dsk... --> <!-- GoodCPC -->
<software name="burglarb" cloneof="burglar" supported="no">
- <description>Burglar (Fra, Alt 2)</description>
+ <description>Burglar (France, Alt 2)</description>
<year>1991</year>
<publisher>Lankhor</publisher>
<part name="flop1" interface="floppy_3">
@@ -17835,7 +17835,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Burglar (F) (1991) (Disk 2 of 2) [a2].dsk... --> <!-- GoodCPC -->
<software name="burglarc" cloneof="burglar" supported="no">
- <description>Burglar (Fra, Alt Disk 2)</description>
+ <description>Burglar (France, Alt Disk 2)</description>
<year>1991</year>
<publisher>Lankhor</publisher>
<part name="flop1" interface="floppy_3">
@@ -18307,7 +18307,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Camelemots (F) (1985).zip... --> <!-- CPC Power -->
<software name="camelmota" cloneof="camelmot" supported="no">
- <description>Camelemots (Fra, Alt)</description>
+ <description>Camelemots (France, Alt)</description>
<year>1985</year>
<publisher>Core</publisher>
<part name="flop1" interface="floppy_3">
@@ -18331,7 +18331,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Canadair (F) (1987).zip... --> <!-- CPC Power -->
<software name="canadaira" cloneof="canadair" supported="no">
- <description>Canadair (Fra, Alt)</description>
+ <description>Canadair (France, Alt)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -18343,7 +18343,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Canadair (1987)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="canadairb" cloneof="canadair" supported="no">
- <description>Canadair (Fra, Alt 2)</description>
+ <description>Canadair (France, Alt 2)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -18367,7 +18367,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cap Horn (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="caphorna" cloneof="caphorn" supported="no">
- <description>Cap Horn (Fra, Alt)</description>
+ <description>Cap Horn (France, Alt)</description>
<year>1985</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -18391,7 +18391,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cap Sur Dakar (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="capdakara" cloneof="capdakar" supported="no">
- <description>Cap Sur Dakar (Fra, Alt)</description>
+ <description>Cap Sur Dakar (France, Alt)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -18871,7 +18871,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Carte D'Europe (F) (1985).zip... --> <!-- CPC Power -->
<software name="carteuroa" cloneof="carteuro" supported="no">
- <description>Carte d'Europe (Fra, Alt)</description>
+ <description>Carte d'Europe (France, Alt)</description>
<year>1985</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -19339,7 +19339,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cauldron (F) (1985).zip... --> <!-- CPC Power -->
<software name="cauldronf_c1" cloneof="cauldron" supported="no">
- <description>Cauldron (Fra, Cracked by Merlin &amp; J.Bond)</description>
+ <description>Cauldron (France, Cracked by Merlin &amp; J.Bond)</description>
<year>1985</year>
<publisher>Palace</publisher>
<part name="flop1" interface="floppy_3">
@@ -19809,7 +19809,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Challenge Foot - Senior (F) (1992).zip... --> <!-- CPC Power -->
<software name="chalfoota" cloneof="chalfoot" supported="no">
- <description>Challenge Foot - Senior (Fra, Alt)</description>
+ <description>Challenge Foot - Senior (France, Alt)</description>
<year>1992</year>
<publisher>Generation 5</publisher>
<part name="flop1" interface="floppy_3">
@@ -20265,7 +20265,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Charly Diams (F) (1987).zip... --> <!-- CPC Power -->
<software name="chardiama" cloneof="chardiam" supported="no">
- <description>Charly Diams (Fra, Alt)</description>
+ <description>Charly Diams (France, Alt)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20277,7 +20277,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Charly Diams (1987)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="chardiamb" cloneof="chardiam" supported="no">
- <description>Charly Diams (Fra, Alt 2)</description>
+ <description>Charly Diams (France, Alt 2)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20289,7 +20289,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Charly Diams (UK) (1987).dsk... --> <!-- GoodCPC -->
<software name="chardiamc" cloneof="chardiam" supported="no">
- <description>Charly Diams (Fra, Alt 3)</description>
+ <description>Charly Diams (France, Alt 3)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20301,7 +20301,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Charly_Diams (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="chardiamd" cloneof="chardiam" supported="no">
- <description>Charly Diams (Fra, Alt 4)</description>
+ <description>Charly Diams (France, Alt 4)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20709,7 +20709,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Des Chiffres Et Des Lettres (F) (1987).zip... --> <!-- CPC Power -->
<software name="chiffleta" cloneof="chifflet" supported="no">
- <description>Des Chiffres et des Lettres (Fra, Alt)</description>
+ <description>Des Chiffres et des Lettres (France, Alt)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20721,7 +20721,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chiffres et des Lettres, Des (1987)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="chiffletb" cloneof="chifflet" supported="no">
- <description>Des Chiffres et des Lettres (Fra, Alt 2)</description>
+ <description>Des Chiffres et des Lettres (France, Alt 2)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20733,7 +20733,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chiffres et des Lettres (F) (19xx) [a2].dsk... --> <!-- GoodCPC -->
<software name="chiffletc" cloneof="chifflet" supported="no">
- <description>Des Chiffres et des Lettres (Fra, Alt 3)</description>
+ <description>Des Chiffres et des Lettres (France, Alt 3)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20745,7 +20745,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chiffres et des Lettres (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="chiffletd" cloneof="chifflet" supported="no">
- <description>Des Chiffres et des Lettres (Fra, Alt 4)</description>
+ <description>Des Chiffres et des Lettres (France, Alt 4)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -20769,7 +20769,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chiffres Magiques, Les (F) (1984) [a1].dsk... --> <!-- GoodCPC -->
<software name="chiffmaga" cloneof="chiffmag" supported="no">
- <description>Les Chiffres Magiques (Fra, Alt)</description>
+ <description>Les Chiffres Magiques (France, Alt)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
<part name="flop1" interface="floppy_3">
@@ -20781,7 +20781,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chiffres Magiques, Les (F) (1984).dsk... --> <!-- GoodCPC -->
<software name="chiffmagb" cloneof="chiffmag" supported="no">
- <description>Les Chiffres Magiques (Fra, Alt 2)</description>
+ <description>Les Chiffres Magiques (France, Alt 2)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21021,7 +21021,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chose De Grotembourg, La (F) (1987) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Chose De Grotembourg, La (F) (1987) (Disk 2 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="grotembga" cloneof="grotembg" supported="no">
- <description>La Chose de Grotembourg (Fra, Alt)</description>
+ <description>La Chose de Grotembourg (France, Alt)</description>
<year>1987</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21039,7 +21039,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chose De Grotembourg, La (F) (1987) (Disk 1 of 2) [f1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Chose De Grotembourg, La (F) (1987) (Disk 2 of 2) [f1].dsk... --> <!-- GoodCPC -->
<software name="grotembg_f1" cloneof="grotembg" supported="no">
- <description>La Chose de Grotembourg (Fra, Fixed?)</description>
+ <description>La Chose de Grotembourg (France, Fixed?)</description>
<year>1987</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21057,7 +21057,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chose De Grotembourg, La (F) (1987) (Disk 1 of 2) [h1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Chose De Grotembourg, La (F) (1987) (Disk 2 of 2) [h1].dsk... --> <!-- GoodCPC -->
<software name="grotembg_h1" cloneof="grotembg" supported="no">
- <description>La Chose de Grotembourg (Fra, Hacked)</description>
+ <description>La Chose de Grotembourg (France, Hacked)</description>
<year>1987</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21074,7 +21074,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Chose de Grotembourg (F), La - Disk 1B.dsk... --> <!-- CPC Base -->
<software name="grotembgb" cloneof="grotembg" supported="no">
- <description>La Chose de Grotembourg (Fra, Alt Disk 2)</description>
+ <description>La Chose de Grotembourg (France, Alt Disk 2)</description>
<year>1987</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21504,7 +21504,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cine Clap (F) (2 faces) (1986).zip... --> <!-- CPC Power -->
<software name="cineclapa" cloneof="cineclap" supported="no">
- <description>Cine Clap (Fra, Alt)</description>
+ <description>Cine Clap (France, Alt)</description>
<year>1986</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21521,7 +21521,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cine Clap (1986)(Ubi Soft)(fr)(Disk 1 of 2)[b].dsk... --> <!-- Mostly GoodCPC -->
<!--<software name="cineclap_b1" cloneof="cineclap" supported="no">
- <description>Cine Clap (Fra, Disk 1 Bad)</description>
+ <description>Cine Clap (France, Disk 1 Bad)</description>
<year>1986</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21533,7 +21533,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cine Clap (1986)(Ubi Soft)(fr)(Disk 2 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="cineclapb" cloneof="cineclap" supported="no">
- <description>Cine Clap (Fra, Alt Disk 2)</description>
+ <description>Cine Clap (France, Alt Disk 2)</description>
<year>1986</year>
<publisher>Ubi Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -21744,7 +21744,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying La Cite Perdue (F) (4 faces) (1986).zip... --> <!-- CPC Power -->
<software name="citeperda" cloneof="citeperd" supported="no">
- <description>La Cite Perdue (Fra, Alt)</description>
+ <description>La Cite Perdue (France, Alt)</description>
<year>1986</year>
<publisher>Excalibur</publisher>
<part name="flop1" interface="floppy_3">
@@ -21773,7 +21773,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cite Perdu, La (1987)(Excalibur)(fr)(Disk 2 of 4).dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Cite Perdu, La (1987)(Excalibur)(fr)(Disk 3 of 4).dsk... --> <!-- Mostly GoodCPC -->
<software name="citeperdb" cloneof="citeperd" supported="no">
- <description>La Cite Perdu (Fra, Alt Disks 1-3)</description>
+ <description>La Cite Perdu (France, Alt Disks 1-3)</description>
<year>1986</year>
<publisher>Excalibur</publisher>
<part name="flop1" interface="floppy_3">
@@ -21795,7 +21795,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cite Perdue, La (F) (1987) (Disk 3 of 4) [b1].dsk... --> <!-- GoodCPC -->
<!--<software name="citeperd_b1" cloneof="citeperd" supported="no">
- <description>La Cite Perdue (Fra, Disk 3 Bad)</description>
+ <description>La Cite Perdue (France, Disk 3 Bad)</description>
<year>1986</year>
<publisher>Excalibur</publisher>
<part name="flop1" interface="floppy_3">
@@ -21884,7 +21884,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Clash (F) (2 faces) (1987).zip... --> <!-- CPC Power -->
<software name="clasha" cloneof="clash" supported="no">
- <description>Clash (Fra, Alt)</description>
+ <description>Clash (France, Alt)</description>
<year>1987</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -21901,7 +21901,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Clash (1987)(ERE Informatique)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="clashb" cloneof="clash" supported="no">
- <description>Clash (Fra, Alt Disk 1)</description>
+ <description>Clash (France, Alt Disk 1)</description>
<year>1987</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -21914,7 +21914,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Clash (F) (1987) (Disk 1 of 2) [b1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Clash (F) (1987) (Disk 2 of 2) [b1].dsk... --> <!-- GoodCPC -->
<!--<software name="clash_bf19" supported="no">
- <description>Clash (Fra, Bad)</description>
+ <description>Clash (France, Bad)</description>
<year>1987</year>
<publisher>ERE Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -22267,7 +22267,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cobra (F) (1985) [Cobra Soft].zip... --> <!-- CPC Power -->
<software name="cobracs" supported="no">
- <description>Cobra (Fra, Cobra Soft)</description>
+ <description>Cobra (France, Cobra Soft)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -22279,7 +22279,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cobra (1985)(Cobra Soft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="cobracsa" cloneof="cobracs" supported="no">
- <description>Cobra (Fra, Cobra Soft, Alt)</description>
+ <description>Cobra (France, Cobra Soft, Alt)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -22291,7 +22291,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cobra (F) (1987) [Loriciels] [Original] (GAPS).zip... --> <!-- CPC Power -->
<software name="cobralor" supported="no">
- <description>Cobra (Fra, Loriciels)</description>
+ <description>Cobra (France, Loriciels)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -22303,7 +22303,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cobra (F) (1987) [Loriciels].zip... --> <!-- CPC Power -->
<software name="cobralora" cloneof="cobralor" supported="no">
- <description>Cobra (Fra, Loriciels, Alt)</description>
+ <description>Cobra (France, Loriciels, Alt)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -22315,7 +22315,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cobra Loriciel (1987)(Loriciels)(fr)[cr Alberto Lima A.].dsk... --> <!-- Mostly GoodCPC -->
<software name="cobralor_c1" cloneof="cobralor" supported="no">
- <description>Cobra (Fra, Loriciels, Cracked by Alberto Lima A.)</description>
+ <description>Cobra (France, Loriciels, Cracked by Alberto Lima A.)</description>
<year>1987</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -22820,7 +22820,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques Volume 1 (F) (1987) [COMPILATION].zip... -->
<software name="tituscl1a" cloneof="tituscl1" supported="no">
- <description>Titus Classiques Volume 1 (Fra, Alt)</description>
+ <description>Titus Classiques Volume 1 (France, Alt)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22832,7 +22832,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Classiques Titus Volume 1 (1987)(Titus)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="tituscl1b" cloneof="tituscl1" supported="no">
- <description>Titus Classiques Volume 1 (Fra, Alt 2)</description>
+ <description>Titus Classiques Volume 1 (France, Alt 2)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22844,7 +22844,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques I (F) (1987) [a1].dsk... --> <!-- GoodCPC -->
<software name="tituscl1c" cloneof="tituscl1" supported="no">
- <description>Titus Classiques Volume 1 (Fra, Alt 3)</description>
+ <description>Titus Classiques Volume 1 (France, Alt 3)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22856,7 +22856,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques I (F) (1987) [h1].dsk... --> <!-- GoodCPC -->
<software name="tituscl1_h1" cloneof="tituscl1" supported="no">
- <description>Titus Classiques Volume 1 (Fra, Hacked)</description>
+ <description>Titus Classiques Volume 1 (France, Hacked)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22868,7 +22868,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques Volume II (F) (1987) (v2) (CPM) [Original] [COMPILATION].zip... -->
<software name="tituscl2" supported="no">
- <description>Titus Classiques Volume II (Fra, v2)</description>
+ <description>Titus Classiques Volume II (France, v2)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22892,7 +22892,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques Volume II (F) (1987) [COMPILATION].zip... -->
<software name="tituscl2b" cloneof="tituscl2" supported="no">
- <description>Titus Classiques Volume II (Fra, Alt)</description>
+ <description>Titus Classiques Volume II (France, Alt)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22904,7 +22904,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Classiques Titus Volume 2 (1987)(Titus)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="tituscl2c" cloneof="tituscl2" supported="no">
- <description>Titus Classiques Volume II (Fra, Alt 2)</description>
+ <description>Titus Classiques Volume II (France, Alt 2)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22916,7 +22916,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques II (F) (1987) [a1].dsk... --> <!-- GoodCPC -->
<software name="tituscl2d" cloneof="tituscl2" supported="no">
- <description>Titus Classiques Volume II (Fra, Alt 3)</description>
+ <description>Titus Classiques Volume II (France, Alt 3)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -22928,7 +22928,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Titus Classiques II (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="tituscl2e" cloneof="tituscl2" supported="no">
- <description>Titus Classiques Volume II (Fra, Alt 4)</description>
+ <description>Titus Classiques Volume II (France, Alt 4)</description>
<year>1987</year>
<publisher>Titus</publisher>
<part name="flop1" interface="floppy_3">
@@ -28227,7 +28227,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Crazy Shot (F,UK) (2 faces) (1989) [Original] (GAPS).zip... --> <!-- CPC Power -->
<software name="crazysho" supported="no">
- <description>Crazy Shot (Fra, UK) (2 faces) [Original] (GAPS)</description>
+ <description>Crazy Shot (France, UK) (2 faces) [Original] (GAPS)</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -32703,7 +32703,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Dragons Of Flame (UK) (2 faces) (1989) [Original].zip... --> <!-- CPC Power -->
<software name="dragonso" supported="no">
- <description>Dragons of Flame (UK) (2 faces) [Original]</description>
+ <description>Advanced Dungeons &amp; Dragons - Dragons of Flame (UK) (2 faces) [Original]</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -41111,7 +41111,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Groops (F,E,G,S) (128K) (2007) (PD).zip... --> <!-- CPC Power -->
<software name="groopsfe" supported="no">
- <description>Groops (Fra,E, Ger, Spa) (128K) (2007) (PD)</description>
+ <description>Groops (France,E, Ger, Spa) (128K) (2007) (PD)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -41123,7 +41123,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Groops (F,E,G,S) (128K) (2007) (PD) [Original].zip... --> <!-- CPC Power -->
<software name="groopsfe01" cloneof="groopsfe" supported="no">
- <description>Groops (Fra,E, Ger, Spa) (128K) (2007) (PD) [Original]</description>
+ <description>Groops (France,E, Ger, Spa) (128K) (2007) (PD) [Original]</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -42755,7 +42755,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes Of The Lance (UK) (2 faces) (1988) (CPM) [Original].zip... --> <!-- CPC Power -->
<software name="heroesof01" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (UK) (2 faces) (CPM) [Original]</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (UK) (2 faces) (CPM) [Original]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -45348,7 +45348,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Ishido (F,UK) (128K) (2005) (PD).zip... --> <!-- CPC Power -->
<software name="ishidofu" supported="no">
- <description>Ishido (Fra, UK) (128K) (2005) (PD)</description>
+ <description>Ishido (France, UK) (128K) (2005) (PD)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -46927,7 +46927,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Justin (F,UK,S) (2005) (PD).zip... --> <!-- CPC Power -->
<software name="justinfu" supported="no">
- <description>Justin (Fra, UK, Spa) (2005) (PD)</description>
+ <description>Justin (France, UK, Spa) (2005) (PD)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -62708,7 +62708,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Pinball Magic (F,UK) (2 faces) (1990) [Original] (GAPS).zip... --> <!-- CPC Power -->
<software name="pinballm" supported="no">
- <description>Pinball Magic (Fra, UK) (2 faces) [Original] (GAPS)</description>
+ <description>Pinball Magic (France, UK) (2 faces) [Original] (GAPS)</description>
<year>1990</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -63475,7 +63475,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Pontoon (F,UK) (1986) [WACCI].zip... --> <!-- CPC Power -->
<software name="pontoonf" supported="no">
- <description>Pontoon (Fra, UK) [WACCI]</description>
+ <description>Pontoon (France, UK) [WACCI]</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -72694,7 +72694,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Soccer Boss (UK) (1990) [Alternative Software].zip... --> <!-- CPC Power -->
<software name="soccerbo" supported="no">
- <description>Soccer Boss (UK) [Alternative Software]</description>
+ <description>Soccer Boss (UK, Alternative Software)</description>
<year>1990</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -75074,7 +75074,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Sram (F,UK,G) (2 faces) (1986) [Original].zip... --> <!-- CPC Power -->
<software name="sramfukg" supported="no">
- <description>Sram (Fra, UK, Ger) (2 faces) [Original]</description>
+ <description>Sram (France, UK, Ger) (2 faces) [Original]</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -75091,7 +75091,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Sram (F,UK,G) (2 faces) (1986).zip... --> <!-- CPC Power -->
<software name="sramfukg01" cloneof="sramfukg" supported="no">
- <description>Sram (Fra, UK, Ger) (2 faces)</description>
+ <description>Sram (France, UK, Ger) (2 faces)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -77901,7 +77901,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Super Ski (F,UK) (1987) [Original] (GAPS).zip... --> <!-- CPC Power -->
<software name="superski01" cloneof="superski" supported="no">
- <description>Super Ski (Fra, UK) [Original] (GAPS)</description>
+ <description>Super Ski (France, UK) [Original] (GAPS)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -77913,7 +77913,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Super Ski (F,UK) (1988) (Spain retail version) [Erbe] [Original].zip... --> <!-- CPC Power -->
<software name="superski02" cloneof="superski" supported="no">
- <description>Super Ski (Fra, UK) (Spain retail version) [Erbe] [Original]</description>
+ <description>Super Ski (France, UK) (Spain retail version) [Erbe] [Original]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -77925,7 +77925,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Super Ski (F,UK) (1988) (Spain retail version) [Original].zip... --> <!-- CPC Power -->
<software name="superski03" cloneof="superski" supported="no">
- <description>Super Ski (Fra, UK) (Spain retail version) [Original]</description>
+ <description>Super Ski (France, UK) (Spain retail version) [Original]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -84296,7 +84296,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Tintin En La Luna (F,UK,G) (1989) (CPM) [Erbe] [Original].zip... --> <!-- CPC Power -->
<software name="tintinen" supported="no">
- <description>Tintin en la Luna (Fra, UK, Ger) (CPM) [Erbe] [Original]</description>
+ <description>Tintin en la Luna (France, UK, Ger) (CPM) [Erbe] [Original]</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -87197,7 +87197,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Union Jack 1 (F,UK) (19xx) [Original].zip... --> <!-- CPC Power -->
<software name="unionjac" supported="no">
- <description>Union Jack 1 (Fra, UK) [Original]</description>
+ <description>Union Jack 1 (France, UK) [Original]</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -88559,7 +88559,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Werner (F,NL) (1986).zip... --> <!-- CPC Power -->
<software name="wernerfn" supported="no">
- <description>Werner (Fra, Ned)</description>
+ <description>Werner (France, Ned)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -99578,7 +99578,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Multi Codeur 2.00 (F,UK) (1990) [CPC Infos] [UTILITAIRE].zip... --> <!-- CPC Power -->
<software name="multicod01" cloneof="multicod" supported="no">
- <description>Multi Codeur 2.00 (Fra, UK) [CPC Infos] [UTILITAIRE]</description>
+ <description>Multi Codeur 2.00 (France, UK) [CPC Infos] [UTILITAIRE]</description>
<year>1990</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -104322,7 +104322,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Venturefix (F,UK) (2 faces) (1984) [Les jeux d'aventures et comment les programmer sur CPC] [UTILITAIRE].zip... --> <!-- CPC Power -->
<software name="venturef" supported="no">
- <description>Venturefix (Fra, UK) (2 faces) [Les jeux d'aventures et comment les programmer sur CPC] [UTILITAIRE]</description>
+ <description>Venturefix (France, UK) (2 faces) [Les jeux d'aventures et comment les programmer sur CPC] [UTILITAIRE]</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -105123,7 +105123,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Defi au Tarot (F).dsk... --> <!-- CPC Base -->
<software name="defiauta01" cloneof="defiauta" supported="no">
- <description>Defi au Tarot (Fra, Alt)</description>
+ <description>Defi au Tarot (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -105195,7 +105195,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Deutsches Geheimnis (F,G) - Disk 1A.dsk... --> <!-- CPC Base -->
<software name="deutsche01" cloneof="deutsche" supported="no">
- <description>Deutsches Geheimnis (Fra, Ger) - Disk 1A</description>
+ <description>Deutsches Geheimnis (France, Ger) - Disk 1A</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -105207,7 +105207,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Deutsches Geheimnis (F,G) - Disk 1B.dsk... --> <!-- CPC Base -->
<software name="deutsche02" cloneof="deutsche" supported="no">
- <description>Deutsches Geheimnis (Fra, Ger) - Disk 1B</description>
+ <description>Deutsches Geheimnis (France, Ger) - Disk 1B</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -105507,7 +105507,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Eagle's Rider (F).dsk... --> <!-- CPC Base -->
<software name="eaglesri03" cloneof="eaglesri" supported="no">
- <description>Eagle's Rider (Fra, Alt)</description>
+ <description>Eagle's Rider (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -105519,7 +105519,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Eden Blues (F).dsk... --> <!-- CPC Base -->
<software name="edenblue02" cloneof="edenblue" supported="no">
- <description>Eden Blues (Fra, Alt)</description>
+ <description>Eden Blues (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -106278,7 +106278,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Grand Prix 500cc (F).dsk... --> <!-- CPC Base -->
<software name="grandpri0f" cloneof="grandpri" supported="no">
- <description>Grand Prix 500cc (Fra, Alt)</description>
+ <description>Grand Prix 500cc (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -106470,7 +106470,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (E) - Disk 1A.dsk... --> <!-- CPC Base -->
<software name="heroesof02" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (Euro) - Disk 1A</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (Euro) - Disk 1A</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -106482,7 +106482,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (E) - Disk 1B.dsk... --> <!-- CPC Base -->
<software name="heroesof03" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (Euro) - Disk 1B</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (Euro) - Disk 1B</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -107142,7 +107142,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Last Mission (F), The.dsk... --> <!-- CPC Base -->
<software name="lastmiss01" cloneof="lastmiss" supported="no">
- <description>The Last Mission (Fra, Alt)</description>
+ <description>The Last Mission (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -107478,7 +107478,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Manhattan 95 (F).dsk... --> <!-- CPC Base -->
<software name="manhatta04" cloneof="manhatta" supported="no">
- <description>Manhattan 95 (Fra, Alt)</description>
+ <description>Manhattan 95 (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -108564,7 +108564,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Panza Kick Boxing (F).dsk... --> <!-- CPC Base -->
<software name="panzakic04" cloneof="panzakic" supported="no">
- <description>Panza Kick Boxing (Fra, Alt)</description>
+ <description>Panza Kick Boxing (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -108672,7 +108672,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Pictionary (F).dsk... --> <!-- CPC Base -->
<software name="pictiona03" cloneof="pictiona" supported="no">
- <description>Pictionary (Fra, Alt)</description>
+ <description>Pictionary (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -108804,7 +108804,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Poseidon (F).dsk... --> <!-- CPC Base -->
<software name="poseidon02" cloneof="poseidon" supported="no">
- <description>Poseidon (Fra, Alt)</description>
+ <description>Poseidon (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -109236,7 +109236,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Sapiens (F).dsk... --> <!-- CPC Base -->
<software name="sapiensf02" cloneof="sapiensf" supported="no">
- <description>Sapiens (Fra, Alt)</description>
+ <description>Sapiens (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -109284,7 +109284,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Scalextric (F).dsk... --> <!-- CPC Base -->
<software name="scalextr03" cloneof="scalextr" supported="no">
- <description>Scalextric (Fra, Alt)</description>
+ <description>Scalextric (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -109980,7 +109980,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Super Ski (F).dsk... --> <!-- CPC Base -->
<software name="superski04" cloneof="superski" supported="no">
- <description>Super Ski (Fra, Alt)</description>
+ <description>Super Ski (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -109992,7 +109992,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Super Skweek (F).dsk... --> <!-- CPC Base -->
<software name="superskw03" cloneof="superskw" supported="no">
- <description>Super Skweek (Fra, Alt)</description>
+ <description>Super Skweek (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -118024,7 +118024,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Dragons of Flame (1990)(US Gold)[cr GPA][t GPA].dsk... --> <!-- Mostly GoodCPC -->
<software name="dragonso01" cloneof="dragonso" supported="no">
- <description>Dragons of Flame (US Gold)[cr GPA][t GPA]</description>
+ <description>Advanced Dungeons &amp; Dragons - Dragons of Flame (US Gold)[cr GPA][t GPA]</description>
<year>1990</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -124882,7 +124882,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (1988)(US Gold)(Disk 1 of 2)[cpm version].dsk... --> <!-- Mostly GoodCPC -->
<software name="heroesof05" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (US Gold)(Disk 1 of 2)[cpm version]</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (US Gold)(Disk 1 of 2)[cpm version]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -124894,7 +124894,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (1988)(US Gold)(Disk 2 of 2)[cpm version].dsk... --> <!-- Mostly GoodCPC -->
<software name="heroesof06" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (US Gold)(Disk 2 of 2)[cpm version]</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (US Gold)(Disk 2 of 2)[cpm version]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -156696,7 +156696,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Bagne de Nepharia, Le (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="bagneden01" cloneof="bagneden" supported="no">
- <description>Le Bagne de Nepharia (Fra, Alt)</description>
+ <description>Le Bagne de Nepharia (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -156757,7 +156757,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Balle De Match (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="balledem04" cloneof="balledem" supported="no">
- <description>Balle de Match (Fra, Alt)</description>
+ <description>Balle de Match (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -156889,7 +156889,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying BD Story 1 (F) (19xx) (PD).dsk... --> <!-- GoodCPC -->
<software name="bdstory101" cloneof="bdstory1" supported="no">
- <description>BD Story 1 (Fra, Alt) (PD)</description>
+ <description>BD Story 1 (France, Alt) (PD)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -156901,7 +156901,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying BD Story 2 (F) (19xx) (PD).dsk... --> <!-- GoodCPC -->
<software name="bdstory201" cloneof="bdstory2" supported="no">
- <description>BD Story 2 (Fra, Alt) (PD)</description>
+ <description>BD Story 2 (France, Alt) (PD)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -158761,7 +158761,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Conflit En L'an 2000 (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="conflite01" cloneof="conflite" supported="no">
- <description>Conflit en l'An 2000 (Fra, Alt)</description>
+ <description>Conflit en l'An 2000 (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -158893,7 +158893,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Contamination (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="contamin04" cloneof="contamin" supported="no">
- <description>Contamination (Fra, Alt)</description>
+ <description>Contamination (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -159013,7 +159013,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Core Squelette (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="coresque02" cloneof="coresque" supported="no">
- <description>Core Squelette (Fra, Alt)</description>
+ <description>Core Squelette (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -159097,7 +159097,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Cosa Nostra (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="cosanost04" cloneof="cosanost" supported="no">
- <description>Cosa Nostra (Fra, Alt)</description>
+ <description>Cosa Nostra (France, Alt)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -163609,7 +163609,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Fanzines (F) (19xx) (PD).dsk... --> <!-- GoodCPC -->
<software name="fanzines01" cloneof="fanzines" supported="no">
- <description>Fanzines (Fra, Alt) (PD)</description>
+ <description>Fanzines (France, Alt) (PD)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -164377,7 +164377,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Foot (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="footf198" supported="no">
- <description>Foot (Fra, Alt)</description>
+ <description>Foot (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -165985,7 +165985,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Gluck Zone Best - Demos Compilation 2 (F) (1991).dsk... --> <!-- GoodCPC -->
<software name="gluckzon02" cloneof="gluckzon" supported="no">
- <description>Gluck Zone Best - Demos Compilation 2 (Fra, Alt)</description>
+ <description>Gluck Zone Best - Demos Compilation 2 (France, Alt)</description>
<year>1991</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -166969,7 +166969,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Hanse (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="hansef1902" cloneof="hansef19" supported="no">
- <description>Hanse (Fra, Alt)</description>
+ <description>Hanse (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -167305,7 +167305,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heritage, L' (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="heritage02" cloneof="heritage" supported="no">
- <description>L'Heritage (Fra, Alt)</description>
+ <description>L'Heritage (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -167425,7 +167425,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (UK) (1988) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="heroesof07" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (UK) (Disk 1 of 2)</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (UK) (Disk 1 of 2)</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -167437,7 +167437,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (UK) (1988) (Disk 2 of 2).dsk... --> <!-- GoodCPC -->
<software name="heroesof08" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (UK) (Disk 2 of 2)</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (UK) (Disk 2 of 2)</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -168373,7 +168373,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Imperialis (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="imperial01" cloneof="imperial" supported="no">
- <description>Imperialis (Fra, Alt)</description>
+ <description>Imperialis (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -169592,7 +169592,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Jimmy Business (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="jimmybus01" cloneof="jimmybus" supported="no">
- <description>Jimmy Business (Fra, Alt)</description>
+ <description>Jimmy Business (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -171380,7 +171380,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Logiformes (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="logiform01" cloneof="logiform" supported="no">
- <description>Logiformes (Fra, Alt)</description>
+ <description>Logiformes (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -171392,7 +171392,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Logiphrases (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="logiphra01" cloneof="logiphra" supported="no">
- <description>Logiphrases (Fra, Alt)</description>
+ <description>Logiphrases (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -172040,7 +172040,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Malediction de Thaar, La (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="maledict05" cloneof="maledict" supported="no">
- <description>La Malediction de Thaar (Fra, Alt)</description>
+ <description>La Malediction de Thaar (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -172460,7 +172460,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Marche Commun (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="marcheco02" cloneof="marcheco" supported="no">
- <description>Marche Commun (Fra, Alt)</description>
+ <description>Marche Commun (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -172556,7 +172556,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Marmelade (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="marmelad03" cloneof="marmelad" supported="no">
- <description>Marmelade (Fra, Alt)</description>
+ <description>Marmelade (France, Alt)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -173396,7 +173396,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Metro 2018 (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="metro20105" cloneof="metro201" supported="no">
- <description>Metro 2018 (Fra, Alt)</description>
+ <description>Metro 2018 (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -173648,7 +173648,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Micro Sapiens (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="microsap01" cloneof="microsap" supported="no">
- <description>Micro Sapiens (Fra, Alt)</description>
+ <description>Micro Sapiens (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -173852,7 +173852,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Millionnaire, Le (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="millionn01" cloneof="millionn" supported="no">
- <description>Le Millionnaire (Fra, Alt)</description>
+ <description>Le Millionnaire (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -176300,7 +176300,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Ole (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="olef198501" cloneof="olef1985" supported="no">
- <description>Ole (Fra, Alt)</description>
+ <description>Ole (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -176528,7 +176528,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Operation Nemo (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="operatio1f" cloneof="operatio" supported="no">
- <description>Operation Nemo (Fra, Alt)</description>
+ <description>Operation Nemo (France, Alt)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -177356,7 +177356,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Overlord 2 (F) (1984).dsk... --> <!-- GoodCPC -->
<software name="overlord01" cloneof="overlord" supported="no">
- <description>Overlord 2 (Fra, Alt)</description>
+ <description>Overlord 2 (France, Alt)</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -177740,7 +177740,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Paragliding (F) (1992).dsk... --> <!-- GoodCPC -->
<software name="paraglid04" cloneof="paraglid" supported="no">
- <description>Paragliding (Fra, Alt)</description>
+ <description>Paragliding (France, Alt)</description>
<year>1992</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -178112,7 +178112,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Pearl Harbour (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="pearlhar01" cloneof="pearlhar" supported="no">
- <description>Pearl Harbour (Fra, Alt)</description>
+ <description>Pearl Harbour (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -178976,7 +178976,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Pouvoir (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="pouvoirf01" cloneof="pouvoirf" supported="no">
- <description>Pouvoir (Fra, Alt)</description>
+ <description>Pouvoir (France, Alt)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -179348,7 +179348,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Prince de Perse (F) (1990).dsk... --> <!-- GoodCPC -->
<software name="princede07" cloneof="princede" supported="no">
- <description>Prince de Perse (Fra, Alt)</description>
+ <description>Prince de Perse (France, Alt)</description>
<year>1990</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -182132,7 +182132,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying RX 220 (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="rx220f1902" cloneof="rx220f19" supported="no">
- <description>RX 220 (Fra, Alt)</description>
+ <description>RX 220 (France, Alt)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -182468,7 +182468,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying San Pablo (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="sanpablo01" cloneof="sanpablo" supported="no">
- <description>San Pablo (Fra, Alt)</description>
+ <description>San Pablo (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -182889,7 +182889,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Secret Du Tombeau, Le (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="secretdu01" cloneof="secretdu" supported="no">
- <description>Le Secret du Tombeau (Fra, Alt)</description>
+ <description>Le Secret du Tombeau (France, Alt)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -183381,7 +183381,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Shufflepuck Cafe (F) (1989).dsk... --> <!-- GoodCPC -->
<software name="shufflep04" cloneof="shufflep" supported="no">
- <description>Shufflepuck Cafe (Fra, Alt)</description>
+ <description>Shufflepuck Cafe (France, Alt)</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -183717,7 +183717,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Skate Ball (F) (1989).dsk... --> <!-- GoodCPC -->
<software name="skatebal04" cloneof="skatebal" supported="no">
- <description>Skate Ball (Fra, Alt)</description>
+ <description>Skate Ball (France, Alt)</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -184598,7 +184598,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Space Shuttle Simulateur (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="spaceshu07" cloneof="spaceshu" supported="no">
- <description>Space Shuttle Simulateur (Fra, Alt)</description>
+ <description>Space Shuttle Simulateur (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -185654,7 +185654,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Strategy (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="strategy01" cloneof="strategy" supported="no">
- <description>Strategy (Fra, Alt)</description>
+ <description>Strategy (France, Alt)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -185846,7 +185846,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Strip Takin (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="striptak02" cloneof="striptak" supported="no">
- <description>Strip Takin (Fra, Alt)</description>
+ <description>Strip Takin (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -186434,7 +186434,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Survivant, Le (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="survivan01" cloneof="survivan" supported="no">
- <description>Le Survivant (Fra, Alt)</description>
+ <description>Le Survivant (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -186998,7 +186998,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Tarot (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="tarotf1901" cloneof="tarotf19" supported="no">
- <description>Tarot (Fra, Alt)</description>
+ <description>Tarot (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -187538,7 +187538,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Theatre Europe (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="theatree04" cloneof="theatree" supported="no">
- <description>Theatre Europe (Fra, Alt)</description>
+ <description>Theatre Europe (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -188055,7 +188055,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Tony Truand (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="tonytrua04" cloneof="tonytrua" supported="no">
- <description>Tony Truand (Fra, Alt)</description>
+ <description>Tony Truand (France, Alt)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -189568,7 +189568,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Votez Pour Moi (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="votezpou01" cloneof="votezpou" supported="no">
- <description>Votez Pour Moi (Fra, Alt)</description>
+ <description>Votez Pour Moi (France, Alt)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -191200,7 +191200,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Zaxon (F) (1994) (PD).dsk... --> <!-- GoodCPC -->
<software name="zaxonf1902" cloneof="zaxonf19" supported="no">
- <description>Zaxon (Fra, Alt) (PD)</description>
+ <description>Zaxon (France, Alt) (PD)</description>
<year>1994</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -201440,7 +201440,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (1 de 2) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="heroesof09" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (1 de 2)</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (1 de 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -201452,7 +201452,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Heroes of the Lance (2 de 2) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="heroesof0a" cloneof="heroesof" supported="no">
- <description>Heroes of the Lance (2 de 2)</description>
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance (2 de 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -202596,7 +202596,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Jeux Mathematiques En Basic (F) (2006) (PD) [Original] [COMPILATION] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="jeuxmath01" cloneof="jeuxmath" supported="no">
- <description>Jeux Mathematiques en Basic (Fra, Alt) (PD) [Original] [COMPILATION]</description>
+ <description>Jeux Mathematiques en Basic (France, Alt) (PD) [Original] [COMPILATION]</description>
<year>2006</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -218039,7 +218039,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying War Space (F) (1988) [Amstrad Cent Pour Cent] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="warspace03" cloneof="warspace" supported="no">
- <description>War Space (Fra, Alt) [Amstrad Cent Pour Cent]</description>
+ <description>War Space (France, Alt) [Amstrad Cent Pour Cent]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -228092,7 +228092,7 @@ stick to CPC-Power disks, when available)
<!-- Identifying Afterburner (1988)(Activision)[h ACME].dsk... --> <!-- Mostly GoodCPC -->
<software name="afterbur0a" cloneof="m_aburn" supported="no">
- <description>Afterburner (Activision)[h ACME] &amp; Slug</description>
+ <description>After Burner (Activision)[h ACME] &amp; Slug</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -274621,7 +274621,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Arkadia 2 (F) (19xx) (PD) (Disk 1 of 4).dsk... --> <!-- GoodCPC -->
<software name="d_arkad2a" cloneof="d_arkad2">
- <description>Arkadia 2 (Fra, Alt)</description>
+ <description>Arkadia 2 (France, Alt)</description>
<year>1991</year>
<publisher>Triark Products</publisher>
<info name="usage" value="Launch with RUN&quot;ARKADIA" />
@@ -274691,7 +274691,7 @@ Shortnames are chosen to "preview" the content:
<!-- CPC Power -->
<software name="d_atlan5a" cloneof="d_atlan5">
- <description>Atlantis 5 (Fra, Alt)</description>
+ <description>Atlantis 5 (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Launch with RUN&quot;ATLANTIS" />
@@ -274710,7 +274710,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atlantis 5 (F) (19xx) (PD) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<!-- disks with crc 4f28a23a and 2377ce4b have same data with diff header!-->
<software name="d_atlan5b" cloneof="d_atlan5">
- <description>Atlantis 5 (Fra, Bad?)</description>
+ <description>Atlantis 5 (France, Bad?)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -274854,7 +274854,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1001 BC (F) (1986) [a1].dsk... --> <!-- GoodCPC -->
<software name="1001bcd" cloneof="1001bc">
- <description>1001 BC - A Mediterranean Odyssey (Fra, Cracked by Chany)</description>
+ <description>1001 BC - A Mediterranean Odyssey (France, Cracked by Chany)</description>
<year>1986</year>
<publisher>Ere Informatique</publisher>
<part name="flop1" interface="floppy_3">
@@ -274938,7 +274938,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1815 (F) (1985).zip... --> <!-- CPC Power -->
<software name="1815a" cloneof="1815">
- <description>1815 (Fra, Alt)</description>
+ <description>1815 (France, Alt)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -274950,7 +274950,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1815 (1985)(Cobra Soft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="1815b" cloneof="1815">
- <description>1815 (Fra, Alt 2)</description>
+ <description>1815 (France, Alt 2)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<part name="flop1" interface="floppy_3">
@@ -275150,7 +275150,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000 Avant J.C. (1987)(Chip)(fr)[cr NPS][t +2 NPS].dsk... --> <!-- Mostly GoodCPC -->
<software name="20kajc_t1" cloneof="20kajc">
- <description>20000 Avant J.C. (Fra, Trained by Grees &amp; Chany, Alt)</description>
+ <description>20000 Avant J.C. (France, Trained by Grees &amp; Chany, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -275162,7 +275162,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Les_Aventures_du_KA-20000_Avant_JC__FRENCH__CHANY-NPS (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="20kajc_t1a" cloneof="20kajc">
- <description>20000 Avant J.C. (Fra, Trained by Grees &amp; Chany, Alt 2)</description>
+ <description>20000 Avant J.C. (France, Trained by Grees &amp; Chany, Alt 2)</description>
<year>1987</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -275174,7 +275174,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Les_Aventures_du_KA-20000_Avant_JC__FRENCH__TWO-MAG (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="20kajc_t1b" cloneof="20kajc">
- <description>20000 Avant J.C. (Fra, Trained by Grees &amp; Chany, Alt 3)</description>
+ <description>20000 Avant J.C. (France, Trained by Grees &amp; Chany, Alt 3)</description>
<year>1987</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -275186,7 +275186,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000 Avant J.C. (1987)(Chip)(fr)[cr Two Mag][t Two Mag].dsk... --> <!-- Mostly GoodCPC -->
<software name="20kajc_t2" cloneof="20kajc">
- <description>20000 Avant J.C. (Fra, Trained by Two Mag)</description>
+ <description>20000 Avant J.C. (France, Trained by Two Mag)</description>
<year>1987</year>
<publisher>Chip</publisher>
<part name="flop1" interface="floppy_3">
@@ -275198,7 +275198,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000 Lieues Sous Les Mers (F) (128K) (2 faces) (1988) (CPM) [Original].zip... --> <!-- CPC Power (older version?) -->
<software name="20klieuea" cloneof="20klieue">
- <description>20000 Lieues Sous Les Mers (Fra, Alt)</description>
+ <description>20000 Lieues Sous Les Mers (France, Alt)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -275215,7 +275215,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000 Lieues Sous Les Mers (F) (128K) (2 faces) (1988).zip... --> <!-- CPC Power -->
<software name="20klieueb" cloneof="20klieue">
- <description>20000 Lieues Sous Les Mers (Fra, Hacked to launch in BASIC)</description>
+ <description>20000 Lieues Sous Les Mers (France, Hacked to launch in BASIC)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -275232,7 +275232,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000 Lieues Sous Les Mers (F) (1988) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="20klieuec" cloneof="20klieue">
- <description>20000 Lieues Sous Les Mers (Fra, Disk 1 Alt 2)</description>
+ <description>20000 Lieues Sous Les Mers (France, Disk 1 Alt 2)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -275244,7 +275244,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000 Lieues Sous Les Mers (F) (1988) (Disk 1 of 2) (CPM).dsk... --> <!-- GoodCPC -->
<software name="20klieue_c1" cloneof="20klieue">
- <description>20000 Lieues Sous Les Mers (Fra, Cracked by Pynard)</description>
+ <description>20000 Lieues Sous Les Mers (France, Cracked by Pynard)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<part name="flop1" interface="floppy_3">
@@ -275474,7 +275474,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Voicechess (1985)(CP Software)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="3dvchessf1" cloneof="3dvchess">
- <description>3D Voicechess (Fra, Alt)</description>
+ <description>3D Voicechess (France, Alt)</description>
<year>1985</year>
<publisher>CP Software</publisher>
<part name="flop1" interface="floppy_3">
@@ -275486,7 +275486,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Voice Chess (UK) (1985) [a2].dsk... --> <!-- GoodCPC -->
<software name="3dvchessf2" cloneof="3dvchess">
- <description>3D Voicechess (Fra, Alt 2)</description>
+ <description>3D Voicechess (France, Alt 2)</description>
<year>1985</year>
<publisher>CP Software</publisher>
<part name="flop1" interface="floppy_3">
@@ -275576,7 +275576,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D-Sub (1985)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="3dsuba" cloneof="3dsub">
- <description>3D-Sub (Fra, Alt)</description>
+ <description>3D-Sub (France, Alt)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;3DSUB" />
@@ -275590,7 +275590,7 @@ Shortnames are chosen to "preview" the content:
<!-- This does not display Loriciel splash screen -->
<!-- Identifying 3D Sub (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="3dsubb" cloneof="3dsub">
- <description>3D-Sub (Fra, Hacked?)</description>
+ <description>3D-Sub (France, Hacked?)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;3DSUB" />
@@ -275665,7 +275665,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Fight (F).dsk... --> <!-- CPC Base -->
<software name="3dfighta" cloneof="3dfight">
- <description>3D Fight (Fra, Alt)</description>
+ <description>3D Fight (France, Alt)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -275677,7 +275677,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Fight (F) (1985).zip... --> <!-- CPC Power (older version?) -->
<software name="3dfightb" cloneof="3dfight">
- <description>3D Fight (Fra, Hacked to launch in BASIC)</description>
+ <description>3D Fight (France, Hacked to launch in BASIC)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -275689,7 +275689,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Fight (F) (1985) [a1].dsk... --> <!-- GoodCPC -->
<software name="3dfightc" cloneof="3dfight">
- <description>3D Fight (Fra, Hacked to launch in BASIC, Alt)</description>
+ <description>3D Fight (France, Hacked to launch in BASIC, Alt)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -275701,7 +275701,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Fight (1985)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="3dfightd" cloneof="3dfight">
- <description>3D Fight (Fra, Hacked to launch in BASIC, Alt 2)</description>
+ <description>3D Fight (France, Hacked to launch in BASIC, Alt 2)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -275864,7 +275864,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D_Snakes__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dsnakea" cloneof="3dsnake">
- <description>3D Snakes (Fra, Alt)</description>
+ <description>3D Snakes (France, Alt)</description>
<year>19??</year>
<publisher>L.M.C</publisher><!-- PD -->
<part name="flop1" interface="floppy_3">
@@ -275876,7 +275876,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D_Snakes_II__FRENCH_(version_128K) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dsnake2a" cloneof="3dsnake2">
- <description>3D Snakes II (Fra, Alt)</description>
+ <description>3D Snakes II (France, Alt)</description>
<year>19??</year>
<publisher>L.M.C</publisher><!-- PD -->
<part name="flop1" interface="floppy_3">
@@ -276117,7 +276117,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 4 Saisons de l'Ecrit CE-CM (F), Les - Disk 1A.dsk... --> <!-- CPC Base -->
<software name="4secritb" cloneof="4secrit">
- <description>Les 4 Saisons de l'Écrit - Version CE-CM (Fra, Alt)</description>
+ <description>Les 4 Saisons de l'Écrit - Version CE-CM (France, Alt)</description>
<year>1989</year>
<publisher>Generation 5</publisher>
<part name="flop1" interface="floppy_3">
@@ -276183,7 +276183,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 5th Axis, The (1985)(Loriciels)(fr)[a].dsk... --> <!-- Mostly GoodCPC -->
<software name="5emeaxe1" cloneof="5thaxis">
- <description>Le 5eme Axe (Fra, Alt)</description>
+ <description>Le 5eme Axe (France, Alt)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -276195,7 +276195,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 5eme Axe, Le (F) (1985) [a1].dsk... --> <!-- GoodCPC -->
<software name="5emeaxe2" cloneof="5thaxis">
- <description>Le 5eme Axe (Fra, Alt 2)</description>
+ <description>Le 5eme Axe (France, Alt 2)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -276207,7 +276207,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 5eme Axe, Le (F) (1986) (PD).dsk... --> <!-- GoodCPC -->
<software name="5emeaxe3" cloneof="5thaxis">
- <description>Le 5eme Axe (Fra, Alt 3)</description>
+ <description>Le 5eme Axe (France, Alt 3)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -276221,7 +276221,7 @@ Shortnames are chosen to "preview" the content:
<!-- This misses the initial screens -->
<!-- Identifying Le 5eme Axe (F) (1985).zip... --> <!-- CPC Power -->
<software name="5emeaxe4" cloneof="5thaxis">
- <description>Le 5eme Axe (Fra, Cracked?)</description>
+ <description>Le 5eme Axe (France, Cracked?)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -276234,7 +276234,7 @@ Shortnames are chosen to "preview" the content:
<!-- This misses the initial screens -->
<!-- Identifying 5th Axis, The (1985)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="5emeaxe5" cloneof="5thaxis">
- <description>Le 5eme Axe (Fra, Cracked?, Alt)</description>
+ <description>Le 5eme Axe (France, Cracked?, Alt)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -276384,7 +276384,7 @@ Shortnames are chosen to "preview" the content:
<!-- This is probably extracted from tape and reversed on dsk -->
<!-- Identifying A320 (F) (1988) (Disk 1 of 2) [h1].dsk... --> <!-- GoodCPC -->
<software name="a320_c2" cloneof="a320">
- <description>A 320 (Fra, Hacked by CPA)</description>
+ <description>A 320 (France, Hacked by CPA)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
<part name="flop1" interface="floppy_3">
@@ -276401,7 +276401,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A La Conquete De L'Orthographe (Cm1 - Cm2) (F) (2 faces) (1991).zip... --> <!-- CPC Power -->
<software name="conorthm1" cloneof="conorthm">
- <description>A la Conquete de l'Orthographe (Cm1 - Cm2) (Fra, Unprotected?)</description>
+ <description>A la Conquete de l'Orthographe (Cm1 - Cm2) (France, Unprotected?)</description>
<year>1991</year>
<publisher>Generation 5</publisher>
<info name="usage" value="Launch with RUN&quot;ORTHO" />
@@ -276419,7 +276419,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A_La_Conquete_de_l_Orthographe__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="conorthm2" cloneof="conorthm">
- <description>A la Conquete de l'Orthographe (Cm1 - Cm2) (Fra, Unprotected?, Alt)</description>
+ <description>A la Conquete de l'Orthographe (Cm1 - Cm2) (France, Unprotected?, Alt)</description>
<year>1991</year>
<publisher>Generation 5</publisher>
<info name="usage" value="Launch with RUN&quot;ORTHO" />
@@ -276437,7 +276437,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_aladehoa.dsk... -->
<software name="dechommea" cloneof="dechomme">
- <description>A la Decouverte de l'Homme (Fra, Alt Disk 1)</description>
+ <description>A la Decouverte de l'Homme (France, Alt Disk 1)</description>
<year>19??</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -276450,7 +276450,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A_La_Decouverte_de_la_Terre__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="decterrea" cloneof="decterre">
- <description>À la Découverte de la Terre (Fra, Alt)</description>
+ <description>À la Découverte de la Terre (France, Alt)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -276468,7 +276468,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Carmen Sandiego (F) (1990) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="carmnwld2" cloneof="carmnwld">
- <description>A la Pursuite de Carmen Sandiego dans le Monde (Fra, Alt 2, Only Disk 1)</description>
+ <description>A la Pursuite de Carmen Sandiego dans le Monde (France, Alt 2, Only Disk 1)</description>
<year>1990</year>
<publisher>Brøderbund France</publisher>
<info name="alt_title" value="Carmen Sandiego (Box)" />
@@ -276496,7 +276496,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Carmen_Sandiago_ (cr xor)__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="carmnwld_c1a" cloneof="carmnwld">
- <description>A la Pursuite de Carmen Sandiego dans le Monde (Fra, Cracked by XOR, Alt)</description>
+ <description>A la Pursuite de Carmen Sandiego dans le Monde (France, Cracked by XOR, Alt)</description>
<year>1990</year>
<publisher>Brøderbund France</publisher>
<info name="alt_title" value="Carmen Sandiego (Box)" />
@@ -276515,7 +276515,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Carmen Sandiego (F) (1990) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="carmnwld_c2" cloneof="carmnwld">
- <description>A la Pursuite de Carmen Sandiego dans le Monde (Fra, Cracked)</description>
+ <description>A la Pursuite de Carmen Sandiego dans le Monde (France, Cracked)</description>
<year>1990</year>
<publisher>Brøderbund France</publisher>
<info name="alt_title" value="Carmen Sandiego (Box)" />
@@ -276534,7 +276534,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Recherche du Nautilus, A la (F) (19xx) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="nautilusa" cloneof="nautilus">
- <description>A la Recherche du Nautilus (Fra, Alt)</description>
+ <description>A la Recherche du Nautilus (France, Alt)</description>
<year>1992</year>
<publisher>Megafree?</publisher>
<part name="flop1" interface="floppy_3">
@@ -277049,7 +277049,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Abalone__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="abalone1" cloneof="abalone">
- <description>Abalone (Fra, Alt)</description>
+ <description>Abalone (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Launch with RUN&quot;ABALONE" />
@@ -277102,7 +277102,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Abracadabra et les Voleurs de Temps (1988)(Carraz Editions)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="abravoltb" cloneof="abravolt" supported="no">
- <description>Abracadabra et les Voleurs de Temps (Fra, Alt 2)</description>
+ <description>Abracadabra et les Voleurs de Temps (France, Alt 2)</description>
<year>1988</year>
<publisher>Carraz Editions</publisher>
<info name="usage" value="Launch with RUN&quot;VOLEURS" />
@@ -277115,7 +277115,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Absurdity (F) (19xx) (PD).dsk... --> <!-- GoodCPC -->
<software name="absurdita" cloneof="absurdit">
- <description>Absurdity (Fra, Alt)</description>
+ <description>Absurdity (France, Alt)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ABSURDIT" />
@@ -277128,7 +277128,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Absurdity__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="absurditb" cloneof="absurdit">
- <description>Absurdity (Fra, Alt 2)</description>
+ <description>Absurdity (France, Alt 2)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ABSURDIT" />
@@ -277204,7 +277204,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Academy (F) (1987).zip... --> <!-- CPC Power -->
<software name="academyf1" cloneof="academy">
- <description>Academy (Fra, Alt)</description>
+ <description>Academy (France, Alt)</description>
<year>1987</year>
<publisher>CRL Group</publisher>
<info name="usage" value="Launch with RUN&quot;ACADEMY" />
@@ -277217,7 +277217,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Academy - Tau Ceti II (1987)(CRL Group)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="academyf2" cloneof="academy">
- <description>Academy (Fra, Alt 2)</description>
+ <description>Academy (France, Alt 2)</description>
<year>1987</year>
<publisher>CRL Group</publisher>
<info name="usage" value="Launch with RUN&quot;ACADEMY" />
@@ -277604,7 +277604,7 @@ Shortnames are chosen to "preview" the content:
<!-- Possibly BAD DUMP (Old DSK format) -->
<!-- Identifying Adi Environnement 3eme (F) (128K) (2 faces) (1991) (Version Basic 1.1).zip... --> <!-- CPC Power -->
<software name="adienv3_c1" cloneof="adienv3" supported="no">
- <description>Adi Environnement 3eme (Fra, Cracked by XOR)</description>
+ <description>Adi Environnement 3eme (France, Cracked by XOR)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ADI" />
@@ -277623,7 +277623,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Environnement_3eme__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adienv3_c1a" cloneof="adienv3" supported="no">
- <description>Adi Environnement 3eme (Fra, Cracked by XOR, Alt)</description>
+ <description>Adi Environnement 3eme (France, Cracked by XOR, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ADI" />
@@ -277642,7 +277642,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI Anglais 3eme (E,F) - Environnement - Disk 1B.dsk... --> <!-- CPC Base -->
<software name="adiangl3a" cloneof="adienv3" supported="no">
- <description>Adi Anglais 3eme (Fra, Alt Disk 1B)</description>
+ <description>Adi Anglais 3eme (France, Alt Disk 1B)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Requires Adi Environnement 3eme" />
@@ -277656,7 +277656,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Mathematiques_3eme__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adimath3a" cloneof="adienv3" supported="no">
- <description>Adi Mathematiques 3eme (Fra, Alt)</description>
+ <description>Adi Mathematiques 3eme (France, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Requires Adi Environnement 3eme" />
@@ -277675,7 +277675,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Environnement_CE2__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adienve2_c1" cloneof="adienve2" supported="no">
- <description>Adi Environnement Ce2 (Fra, Cracked by XOR, Alt)</description>
+ <description>Adi Environnement Ce2 (France, Cracked by XOR, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ADI" />
@@ -277694,7 +277694,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Francais_CE2__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adifrane2a" cloneof="adienve2" supported="no">
- <description>Adi Francais Ce2 (Fra, Alt)</description>
+ <description>Adi Francais Ce2 (France, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Requires Adi Environnement Ce2" />
@@ -277713,7 +277713,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Environnement_CM1__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adienvm1_c1" cloneof="adienvm1" supported="no">
- <description>Adi Environnement Cm1 (Fra, Cracked by XOR, Alt)</description>
+ <description>Adi Environnement Cm1 (France, Cracked by XOR, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ADI" />
@@ -277732,7 +277732,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Francais_CM1__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adifranm1a" cloneof="adienvm1" supported="no">
- <description>Adi Francais Cm1 (Fra, Alt)</description>
+ <description>Adi Francais Cm1 (France, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Requires Adi Environnement Cm1" />
@@ -277751,7 +277751,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ADI_Mathematiques_CE2__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="adimathce2a" cloneof="adienve2" supported="no">
- <description>Adi Mathematiques Ce2 (Fra, Cracked by XOR, Alt)</description>
+ <description>Adi Mathematiques Ce2 (France, Cracked by XOR, Alt)</description>
<year>1991</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Requires Adi Environnement Ce2" />
@@ -278014,7 +278014,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Advanced Destroyer Simulation (F) (1990) [Original] (GAPS).zip... --> <!-- CPC Power -->
<software name="adsa" cloneof="ads" supported="no">
- <description>Advanced Destroyer Simulation (Fra, Alt)</description>
+ <description>Advanced Destroyer Simulation (France, Alt)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;ADS" />
@@ -278027,7 +278027,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A.D.S. - Advanced Destroyer Simulator (F).dsk... --> <!-- CPC Base -->
<software name="adsb" cloneof="ads" supported="no">
- <description>Advanced Destroyer Simulation (Fra, Alt 2)</description>
+ <description>Advanced Destroyer Simulation (France, Alt 2)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;ADS" />
@@ -278040,7 +278040,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Advanced Destroyer Simulation (F) (1990).zip... --> <!-- CPC Power -->
<software name="ads_c1a" cloneof="ads">
- <description>Advanced Destroyer Simulation (Fra, Cracked by XOR, Alt)</description>
+ <description>Advanced Destroyer Simulation (France, Cracked by XOR, Alt)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;ADS" />
@@ -278053,7 +278053,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Advanced Destroyer Simulator (1990)(Futura)(fr)[cr XOR][a].dsk... --> <!-- Mostly GoodCPC -->
<software name="ads_c1b" cloneof="ads">
- <description>Advanced Destroyer Simulation (Fra, Cracked by XOR, Alt 2)</description>
+ <description>Advanced Destroyer Simulation (France, Cracked by XOR, Alt 2)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;ADS" />
@@ -278066,7 +278066,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Advanced Destroyer Simulation (F) (1990) [a1].dsk... --> <!-- GoodCPC -->
<software name="ads_c1c" cloneof="ads">
- <description>Advanced Destroyer Simulation (Fra, Cracked by XOR, Alt 3)</description>
+ <description>Advanced Destroyer Simulation (France, Cracked by XOR, Alt 3)</description>
<year>1990</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;ADS" />
@@ -278144,7 +278144,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Une Affaire en Or (1985)(Free Game Blot)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="affairor1" cloneof="affairor">
- <description>Une Affaire en Or (Fra, Alt)</description>
+ <description>Une Affaire en Or (France, Alt)</description>
<year>1985</year>
<publisher>Free Game Blot</publisher>
<part name="flop1" interface="floppy_3">
@@ -278156,7 +278156,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Ravenhood, L' (1993)(Bruno Fonters)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="affraven1" cloneof="affraven">
- <description>L'Affaire Ravenhood (Fra, Alt)</description>
+ <description>L'Affaire Ravenhood (France, Alt)</description>
<year>1993</year>
<publisher>&lt;unknown&gt;</publisher> <!-- PD -->
<info name="usage" value="Launch with RUN&quot;RAVENHOO" />
@@ -278174,7 +278174,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Santa Fe, L' (F) (1988) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="santafe1" cloneof="santafe" supported="no">
- <description>L'Affaire Santa Fe (Fra, Alt)</description>
+ <description>L'Affaire Santa Fe (France, Alt)</description>
<year>1988</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -278192,7 +278192,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Affaire Santa Fe (F) (2 faces) (1988).zip... --> <!-- CPC Power -->
<software name="santafe_h2" cloneof="santafe">
- <description>L'Affaire Santa Fe (Fra, Hacked to launch in BASIC, Alt)</description>
+ <description>L'Affaire Santa Fe (France, Hacked to launch in BASIC, Alt)</description>
<year>1988</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;-SANTAFE" />
@@ -278210,7 +278210,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Santa Vera Fe, L' (1988)(Infogrames)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="santafe_h3" cloneof="santafe">
- <description>L'Affaire Santa Fe (Fra, Hacked to launch in BASIC, Alt 2)</description>
+ <description>L'Affaire Santa Fe (France, Hacked to launch in BASIC, Alt 2)</description>
<year>1988</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;SANTAFE" />
@@ -278228,7 +278228,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Santa Fe, L' (F) (1988) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="santafe_h4" cloneof="santafe">
- <description>L'Affaire Santa Fe (Fra, Hacked to launch in BASIC, Alt 3)</description>
+ <description>L'Affaire Santa Fe (France, Hacked to launch in BASIC, Alt 3)</description>
<year>1988</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;-SANTAFE" />
@@ -278246,7 +278246,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L_Affaire_Santa_Fe__FRENCH__MCSPE__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="santafe_h5" cloneof="santafe">
- <description>L'Affaire Santa Fe (Fra, Cracked by Mc Spe?)</description>
+ <description>L'Affaire Santa Fe (France, Cracked by Mc Spe?)</description>
<year>1988</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;-SANTAFE" />
@@ -278264,7 +278264,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Affaire Sydney (F) (1986).zip... --> <!-- CPC Power -->
<software name="afsydney_h2" cloneof="afsydney">
- <description>L'Affaire Sydney (Fra, Hacked to launch in BASIC, Alt)</description>
+ <description>L'Affaire Sydney (France, Hacked to launch in BASIC, Alt)</description>
<year>1986</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;SYDNEY" />
@@ -278277,7 +278277,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Sydney (1986)(Infogrames)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="afsydney_h3" cloneof="afsydney">
- <description>L'Affaire Sydney (Fra, Hacked to launch in BASIC, Alt 2)</description>
+ <description>L'Affaire Sydney (France, Hacked to launch in BASIC, Alt 2)</description>
<year>1986</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;SYDNEY" />
@@ -278290,7 +278290,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Sydney, L' (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="afsydney_h4" cloneof="afsydney">
- <description>L'Affaire Sydney (Fra, Hacked to launch in BASIC, Alt 3)</description>
+ <description>L'Affaire Sydney (France, Hacked to launch in BASIC, Alt 3)</description>
<year>1986</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;SYDNEY" />
@@ -278330,7 +278330,7 @@ Shortnames are chosen to "preview" the content:
<!-- Possibly BAD DUMP (Old DSK format) -->
<!-- Identifying L'affaire Vera Cruz (F) (1985).zip... --> <!-- CPC Power -->
<software name="veracruzf1" cloneof="veracruz">
- <description>L'Affaire Vera Cruz (Fra, Alt)</description>
+ <description>L'Affaire Vera Cruz (France, Alt)</description>
<year>1985</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;VERACRUZ" />
@@ -278343,7 +278343,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Vera Cruz, L' (F) (1985) [a1].dsk... --> <!-- GoodCPC -->
<software name="veracruzf2" cloneof="veracruz">
- <description>L'Affaire Vera Cruz (Fra, Alt 2)</description>
+ <description>L'Affaire Vera Cruz (France, Alt 2)</description>
<year>1985</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;VERACRUZ" />
@@ -278356,7 +278356,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Affaire Vera Cruz, L' (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="veracruzf3" cloneof="veracruz">
- <description>L'Affaire Vera Cruz (Fra, Alt 3)</description>
+ <description>L'Affaire Vera Cruz (France, Alt 3)</description>
<year>1985</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;VERACRUZ" />
@@ -278369,7 +278369,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Affaire Vera Cruz (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="veracruzf4" cloneof="veracruz">
- <description>L'Affaire Vera Cruz (Fra, Alt 4)</description>
+ <description>L'Affaire Vera Cruz (France, Alt 4)</description>
<year>1985</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -278382,7 +278382,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Vera Cruz Affair, The (1985)(Infogrames)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="veracruzf5" cloneof="veracruz">
- <description>L'Affaire Vera Cruz (Fra, Alt 5)</description>
+ <description>L'Affaire Vera Cruz (France, Alt 5)</description>
<year>1985</year>
<publisher>Infogrames</publisher>
<info name="usage" value="Launch with RUN&quot;VERACRUZ" />
@@ -278486,7 +278486,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Afterburner (1988)(Activision).dsk... --> <!-- Mostly GoodCPC -->
<software name="aburners1" cloneof="aburner">
- <description>Afterburner (Spa?, Alt)</description>
+ <description>After Burner (Spa?, Alt)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278498,7 +278498,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying After Burner #1 (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aburners2" cloneof="aburner">
- <description>Afterburner (Spa?, Alt 2)</description>
+ <description>After Burner (Spa?, Alt 2)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278510,7 +278510,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying After Burner #2 (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aburners3" cloneof="aburner">
- <description>Afterburner (Spa?, Alt 3)</description>
+ <description>After Burner (Spa?, Alt 3)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278522,7 +278522,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying After Burner #3 (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aburners4" cloneof="aburner">
- <description>Afterburner (Spa?, Alt 4)</description>
+ <description>After Burner (Spa?, Alt 4)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278558,7 +278558,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Afterburner (1988)(Activision)[cr CACH][t Celtic Gang].dsk... --> <!-- Mostly GoodCPC -->
<software name="aburner_t4" cloneof="aburner">
- <description>Afterburner (UK, Trained by CACH &amp; Le Celtic Gang)</description>
+ <description>After Burner (UK, Trained by CACH &amp; Le Celtic Gang)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278570,7 +278570,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Afterburner (1988)(Activision)[cr Enrique Soft].dsk... --> <!-- Mostly GoodCPC -->
<software name="aburner_c1" cloneof="aburner">
- <description>Afterburner (UK, Cracked by Enrique Soft)</description>
+ <description>After Burner (UK, Cracked by Enrique Soft)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278582,7 +278582,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying After Burner #1 [a] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aburner_c1a" cloneof="aburner">
- <description>Afterburner (UK, Cracked by Enrique Soft, Alt)</description>
+ <description>After Burner (UK, Cracked by Enrique Soft, Alt)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -278594,7 +278594,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying After Burner #2 [a] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aburner_c2" cloneof="aburner">
- <description>Afterburner (UK, Cracked by Toto &amp; Rick)</description>
+ <description>After Burner (UK, Cracked by Toto &amp; Rick)</description>
<year>1988</year>
<publisher>Activision</publisher>
<part name="flop1" interface="floppy_3">
@@ -279023,7 +279023,7 @@ Shortnames are chosen to "preview" the content:
<!-- Possibly BAD DUMP (Old DSK format) -->
<!-- Identifying L'Aigle D'Or (F) (1986).zip... --> <!-- CPC Power -->
<software name="aigledor1" cloneof="aigledor">
- <description>L'Aigle d'Or (Fra, Alt)</description>
+ <description>L'Aigle d'Or (France, Alt)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLE" />
@@ -279036,7 +279036,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aigle d'Or (F), L'.dsk... --> <!-- CPC Base -->
<software name="aigledor2" cloneof="aigledor">
- <description>L'Aigle d'Or (Fra, Alt 2)</description>
+ <description>L'Aigle d'Or (France, Alt 2)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLE" />
@@ -279049,7 +279049,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aigle d'Or, L' (1986)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="aigledor3" cloneof="aigledor">
- <description>L'Aigle d'Or (Fra, Alt 3)</description>
+ <description>L'Aigle d'Or (France, Alt 3)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLE" />
@@ -279062,7 +279062,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aigle d'Or, L' (1986)(Loriciels)(fr)[cr Nul Part System].dsk... --> <!-- Mostly GoodCPC -->
<software name="aigledor_c1" cloneof="aigledor">
- <description>L'Aigle d'Or (Fra, Cracked by Chany)</description>
+ <description>L'Aigle d'Or (France, Cracked by Chany)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLE1" />
@@ -279075,7 +279075,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L_Aigle_D_Or__FRENCH__CHANY-NPS (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aigledor_c1a" cloneof="aigledor">
- <description>L'Aigle d'Or (Fra, Cracked by Chany, Alt)</description>
+ <description>L'Aigle d'Or (France, Cracked by Chany, Alt)</description>
<year>1986</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLE1" />
@@ -279088,7 +279088,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aigle d'Or, L' - Le Retour (1992)(Loriciels)(fr)(Disk 1 of 2)[cr Genesis].dsk... --> <!-- Mostly GoodCPC -->
<software name="aigledo2_c1" cloneof="aigledo2">
- <description>L'Aigle d'Or - Le Retour (Fra, Cracked by Two Mag)</description>
+ <description>L'Aigle d'Or - Le Retour (France, Cracked by Two Mag)</description>
<year>1991</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLEDOR" />
@@ -279106,7 +279106,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aigle D'Or - Le Retour, L' (F) (1992) (Disk 1 of 2) [h1].dsk... --> <!-- GoodCPC -->
<software name="aigledo2_c1a" cloneof="aigledo2">
- <description>L'Aigle d'Or - Le Retour (Fra, Cracked by Two Mag, Alt, Only Disk 1)</description>
+ <description>L'Aigle d'Or - Le Retour (France, Cracked by Two Mag, Alt, Only Disk 1)</description>
<year>1991</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLEDOR" />
@@ -279119,7 +279119,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aigle D'Or - Le Retour, L' (F) (1992) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="aigledo2_c1b" cloneof="aigledo2">
- <description>L'Aigle d'Or - Le Retour (Fra, Cracked by Two Mag, Alt 2, Only Disk 1)</description>
+ <description>L'Aigle d'Or - Le Retour (France, Cracked by Two Mag, Alt 2, Only Disk 1)</description>
<year>1991</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AIGLEDOR" />
@@ -279474,7 +279474,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Algebre__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="algebre_c2" cloneof="algebre">
- <description>Algebre (Fra, Cracked, Alt)</description>
+ <description>Algebre (France, Cracked, Alt)</description>
<year>1986</year>
<publisher>Vifi International</publisher>
<info name="usage" value="Launch with RUN&quot;ALGEBRE" />
@@ -279501,7 +279501,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Ali-Baba (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alibaba1" cloneof="alibaba">
- <description>Ali-Baba (Fra, Alt)</description>
+ <description>Ali-Baba (France, Alt)</description>
<year>19??</year>
<publisher>3 Pouces Software</publisher>
<info name="compatibility" value="128K,BASIC1.1" />
@@ -279731,7 +279731,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alien_Legion__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alienleg1" cloneof="alienleg" supported="partial">
- <description>Alien Legion (Fra, Alt)</description>
+ <description>Alien Legion (France, Alt)</description>
<year>1991</year>
<publisher>Mega Soft</publisher>
<info name="compatibility" value="128K,BASIC1.1" />
@@ -279969,7 +279969,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alive (F) - Disk 1A.dsk... --> <!-- CPC Base -->
<software name="alive1" cloneof="alive">
- <description>Alive (Fra, Alt)</description>
+ <description>Alive (France, Alt)</description>
<year>1991</year>
<publisher>Lankhor</publisher>
<info name="usage" value="Launch with RUN&quot;ALIVE" />
@@ -279987,7 +279987,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alive (1991)(Lankhor)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="alive2" cloneof="alive">
- <description>Alive (Fra, Alt 2)</description>
+ <description>Alive (France, Alt 2)</description>
<year>1991</year>
<publisher>Lankhor</publisher>
<info name="usage" value="Launch with RUN&quot;ALIVE" />
@@ -280005,7 +280005,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alive (1991)(Lankhor)(fr)(Disk 1 of 2)[cr Pynard].dsk... --> <!-- Mostly GoodCPC -->
<software name="alive_c1" cloneof="alive">
- <description>Alive (Fra, Cracked by Pynard?, Disk 1 only)</description>
+ <description>Alive (France, Cracked by Pynard?, Disk 1 only)</description>
<year>1991</year>
<publisher>Lankhor</publisher>
<info name="usage" value="Launch with RUN&quot;ALIVE" />
@@ -280031,7 +280031,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alphajet (19xx)(Felix Mortalena)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="alphaj1" cloneof="alphaj">
- <description>Alphajet (Fra, Alt)</description>
+ <description>Alphajet (France, Alt)</description>
<year>19??</year>
<publisher>Felix Mortalena</publisher> <!-- PD -->
<part name="flop1" interface="floppy_3">
@@ -280043,7 +280043,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alphakhor (1989)(Loriciels)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="alphakh_c1" cloneof="alphakh">
- <description>Alphakhor (Fra, Cracked by Grees &amp; Chany)</description>
+ <description>Alphakhor (France, Cracked by Grees &amp; Chany)</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -280350,7 +280350,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amelie Minuit (F) (1985).zip... --> <!-- CPC Power -->
<software name="amelminu2" cloneof="amelminu">
- <description>Amelie Minuit (Fra, Hacked to launch in BASIC, Alt)</description>
+ <description>Amelie Minuit (France, Hacked to launch in BASIC, Alt)</description>
<year>1985</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;AMELIE" />
@@ -280363,7 +280363,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amelie Minuit (1985)(ERE Informatique)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="amelminu3" cloneof="amelminu">
- <description>Amelie Minuit (Fra, Hacked to launch in BASIC, Alt 2)</description>
+ <description>Amelie Minuit (France, Hacked to launch in BASIC, Alt 2)</description>
<year>1985</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;AMELIE" />
@@ -280377,7 +280377,7 @@ Shortnames are chosen to "preview" the content:
<!-- Title screen missing? -->
<!-- Identifying Amelie Minuit (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="amelminu4" cloneof="amelminu">
- <description>Amelie Minuit (Fra, Hacked to launch in BASIC, Alt 3)</description>
+ <description>Amelie Minuit (France, Hacked to launch in BASIC, Alt 3)</description>
<year>1985</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;AMELIE" />
@@ -280497,7 +280497,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amnesia (1998)(DBT)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="amnesia1" cloneof="amnesia" supported="no">
- <description>Amnesia (Fra, UK, Alt)</description>
+ <description>Amnesia (France, UK, Alt)</description>
<year>1998</year>
<publisher>Rudiger ~ DBT</publisher>
<info name="usage" value="Launch with RUN&quot;AMNESIA" />
@@ -280510,7 +280510,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amnesia (UK,F) (1998) (PD) [a1].dsk... --> <!-- GoodCPC -->
<software name="amnesia2" cloneof="amnesia">
- <description>Amnesia (Fra, UK, Alt 2)</description>
+ <description>Amnesia (France, UK, Alt 2)</description>
<year>1998</year>
<publisher>Rudiger ~ DBT</publisher>
<info name="usage" value="Launch with RUN&quot;AMNESIA" />
@@ -280523,7 +280523,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amnesia (UK,F) (1998) (PD) [a2].dsk... --> <!-- GoodCPC -->
<software name="amnesia3" cloneof="amnesia">
- <description>Amnesia (Fra, UK, Alt 3)</description>
+ <description>Amnesia (France, UK, Alt 3)</description>
<year>1998</year>
<publisher>Rudiger ~ DBT</publisher>
<info name="usage" value="Launch with RUN&quot;AMNESIA" />
@@ -280536,7 +280536,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amnesia (UK,F) (1998) (PD).dsk... --> <!-- GoodCPC -->
<software name="amnesia4" cloneof="amnesia" supported="no">
- <description>Amnesia (Fra, UK, Bad?)</description>
+ <description>Amnesia (France, UK, Bad?)</description>
<year>1998</year>
<publisher>Rudiger ~ DBT</publisher>
<part name="flop1" interface="floppy_3">
@@ -280548,7 +280548,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amnesia (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="amnesiap" cloneof="amnesia" supported="no">
- <description>Amnesia (Fra, UK, Preview)</description>
+ <description>Amnesia (France, UK, Preview)</description>
<year>1998</year>
<publisher>Rudiger ~ DBT</publisher>
<info name="usage" value="Launch with RUN&quot;-AMNESIA" />
@@ -280664,7 +280664,7 @@ Shortnames are chosen to "preview" the content:
<!-- CPC Power -->
<software name="amdames1" cloneof="amdames">
- <description>Amstra-Dames (Fra, Alt)</description>
+ <description>Amstra-Dames (France, Alt)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;AMSDAMES" />
@@ -280677,7 +280677,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amstra-Dames (F) (1985).zip... --> <!-- CPC Power -->
<software name="amdames2" cloneof="amdames">
- <description>Amstra-Dames (Fra, Alt 2)</description>
+ <description>Amstra-Dames (France, Alt 2)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;AMSDAMES" />
@@ -280690,7 +280690,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amstra-Dames (1985)(Cobra Soft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="amdames3" cloneof="amdames">
- <description>Amstra-Dames (Fra, Alt 3)</description>
+ <description>Amstra-Dames (France, Alt 3)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;AMSDAMES" />
@@ -280768,7 +280768,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_ANATOMIE.dsk... -->
<software name="anatomie1" cloneof="anatomie">
- <description>Anatomie (Fra, Alt)</description>
+ <description>Anatomie (France, Alt)</description>
<year>1986</year>
<publisher>Core</publisher>
<info name="usage" value="Launch with RUN&quot;ANATOMIE" />
@@ -280860,7 +280860,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Andy Capp (F) (1987).zip... --> <!-- CPC Power -->
<software name="andycappf1" cloneof="andycapp">
- <description>Andy Capp (Fra, Alt)</description>
+ <description>Andy Capp (France, Alt)</description>
<year>1987</year>
<publisher>Mirrorsoft</publisher>
<info name="usage" value="Launch with RUN&quot;ANDY" />
@@ -280873,7 +280873,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Andy Capp (1987)(Mirrorsoft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="andycappf2" cloneof="andycapp">
- <description>Andy Capp (Fra, Alt 2)</description>
+ <description>Andy Capp (France, Alt 2)</description>
<year>1987</year>
<publisher>Mirrorsoft</publisher>
<info name="usage" value="Launch with RUN&quot;ANDY" />
@@ -280886,7 +280886,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_andycapf.dsk... -->
<software name="andycappf3" cloneof="andycapp">
- <description>Andy Capp (Fra, Alt 3)</description>
+ <description>Andy Capp (France, Alt 3)</description>
<year>1987</year>
<publisher>Mirrorsoft</publisher>
<info name="usage" value="Launch with RUN&quot;ANDY" />
@@ -280977,7 +280977,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_ANGLAIS.dsk... -->
<software name="anglais1" cloneof="anglais">
- <description>Anglais (Fra, Alt)</description>
+ <description>Anglais (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Launch with RUN&quot;ANGLAIS" />
@@ -280990,7 +280990,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anglais - 6 5 (F) (2 faces) (1992) (Version Basic 1.1).zip... --> <!-- CPC Power -->
<software name="anglai65a" cloneof="anglai65">
- <description>Anglais - 6ème &amp; 5ème (Fra, Alt)</description>
+ <description>Anglais - 6ème &amp; 5ème (France, Alt)</description>
<year>1992</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;A&quot; and RUN&quot;B&quot;" />
@@ -281009,7 +281009,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anglais Conjugaison (1992)(Micro C)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<!-- disks with crc 52229a99 and bf965b1b have same data with diff header!-->
<software name="anglai65b" cloneof="anglai65">
- <description>Anglais - 6ème &amp; 5ème (Fra, Alt 2)</description>
+ <description>Anglais - 6ème &amp; 5ème (France, Alt 2)</description>
<year>1992</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;A&quot; and RUN&quot;B&quot;" />
@@ -281027,7 +281027,7 @@ Shortnames are chosen to "preview" the content:
</software>
<software name="angcol43a" cloneof="anglai43">
- <description>Anglais College 4ème / 3ème (Fra, Alt)</description>
+ <description>Anglais College 4ème / 3ème (France, Alt)</description>
<year>1988</year>
<publisher>Cedic Nathan</publisher>
<info name="usage" value="Launch with RUN&quot;DEPART" />
@@ -281052,7 +281052,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anglais Primaire (F) (2 faces) (1989).zip... --> <!-- CPC Power -->
<software name="anglaisp3" cloneof="anglaisp">
- <description>Anglais Primaire (Fra, Alt 2)</description>
+ <description>Anglais Primaire (France, Alt 2)</description>
<year>1989</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;A&quot; and RUN&quot;B&quot;" />
@@ -281070,7 +281070,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anglais Primaire (1989)(Micro C)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="anglaisp4" cloneof="anglaisp">
- <description>Anglais Primaire (Fra, Alt 3)</description>
+ <description>Anglais Primaire (France, Alt 3)</description>
<year>1989</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;ANGLAIS" />
@@ -281089,7 +281089,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anglais Primaire (F) (1989) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="anglaisp5" cloneof="anglaisp">
- <description>Anglais Primaire (Fra, Alt 4)</description>
+ <description>Anglais Primaire (France, Alt 4)</description>
<year>1989</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;-A" />
@@ -281108,7 +281108,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anglais-Primaire (Face A) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="anglaisp6" cloneof="anglaisp">
- <description>Anglais Primaire (Fra, Alt 5)</description>
+ <description>Anglais Primaire (France, Alt 5)</description>
<year>1989</year>
<publisher>Micro C</publisher>
<info name="usage" value="Launch with RUN&quot;A" />
@@ -281204,7 +281204,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Animal Vegetable Mineral (1984)(Amsoft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="avmf1" cloneof="avm">
- <description>Animal / Vègètal / Minèral (Fra, Alt)</description>
+ <description>Animal / Vègètal / Minèral (France, Alt)</description>
<year>1984</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Launch with RUN&quot;ANIVEGMI" />
@@ -281230,7 +281230,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Animalier (F) (2 faces) (1986).zip... --> <!-- CPC Power -->
<software name="animalie1" cloneof="animalie">
- <description>Animalier (Fra, Alt)</description>
+ <description>Animalier (France, Alt)</description>
<year>1986</year>
<publisher>Ere Informatique</publisher>
<info name="alt_title" value="L'Animalier (Box)" />
@@ -281249,7 +281249,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Animalier 1. (19xx)(-)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="animalie2" cloneof="animalie">
- <description>Animalier (Fra, Alt 2)</description>
+ <description>Animalier (France, Alt 2)</description>
<year>1986</year>
<publisher>Ere Informatique</publisher>
<info name="alt_title" value="L'Animalier (Box)" />
@@ -281269,7 +281269,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Animalier (F) (19xx) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="animalie3" cloneof="animalie">
- <description>Animalier (Fra, Alt 3)</description>
+ <description>Animalier (France, Alt 3)</description>
<year>1986</year>
<publisher>Ere Informatique</publisher>
<info name="alt_title" value="L'Animalier (Box)" />
@@ -281352,7 +281352,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying annalrof (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="annromef1" cloneof="annrome">
- <description>Annals of Rome (Fra, Alt)</description>
+ <description>Annals of Rome (France, Alt)</description>
<year>1986</year>
<publisher>Pss</publisher>
<info name="usage" value="Launch with RUN&quot;ANNALS" />
@@ -281365,7 +281365,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Annals of Rome (F) (1986).dsk... --> <!-- GoodCPC -->
<software name="annromef2" cloneof="annrome">
- <description>Annals of Rome (Fra, Hacked?)</description>
+ <description>Annals of Rome (France, Hacked?)</description>
<year>1986</year>
<publisher>Pss</publisher>
<info name="usage" value="Launch with RUN&quot;R+" />
@@ -281379,7 +281379,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anneau de Zengara (1987)(Ubi Soft)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<!-- Identifying Anneau de Zengara (1987)(Ubi Soft)(fr)(Disk 2 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="zengara_h2" cloneof="zengara">
- <description>L'Anneau de Zengara (Fra, Hacked?)</description>
+ <description>L'Anneau de Zengara (France, Hacked?)</description>
<year>1987</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ZENGARA" />
@@ -281399,7 +281399,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anneau de Zengara, L' (F) (1987) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<!-- Identifying Anneau de Zengara, L' (F) (1987) (Disk 2 of 2).dsk... --> <!-- GoodCPC -->
<software name="zengara_h3" cloneof="zengara">
- <description>L'Anneau de Zengara (Fra, Hacked? Alt)</description>
+ <description>L'Anneau de Zengara (France, Hacked? Alt)</description>
<year>1987</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ZENGARA" />
@@ -281419,7 +281419,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Anniversaire De Bobby (F) (1988).zip... --> <!-- CPC Power -->
<!-- disk with crc ae986a3d same data with diff header -->
<software name="annivbob1" cloneof="annivbob">
- <description>L'Anniversaire de Bobby (Fra, Alt?)</description>
+ <description>L'Anniversaire de Bobby (France, Alt?)</description>
<year>1988</year>
<publisher>Carraz Editions</publisher>
<info name="usage" value="Launch with RUN&quot;BOBBY" />
@@ -281432,7 +281432,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Anniversaire de Bobby, L' (19xx)(Carraz Editions)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="annivbob2" cloneof="annivbob">
- <description>L'Anniversaire de Bobby (Fra, Alt 2?)</description>
+ <description>L'Anniversaire de Bobby (France, Alt 2?)</description>
<year>1988</year>
<publisher>Carraz Editions</publisher>
<info name="usage" value="Launch with RUN&quot;BOBBY" />
@@ -281458,7 +281458,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_antalex.dsk... -->
<software name="antalexa" cloneof="antalex">
- <description>Antalex - La Citè Perdue (Fra, Ripped from Cassette, Alt)</description>
+ <description>Antalex - La Citè Perdue (France, Ripped from Cassette, Alt)</description>
<year>19??</year>
<publisher>Lionel Paquin</publisher><!-- PD -->
<info name="usage" value="Launch with RUN&quot;ANTALEX" />
@@ -281484,7 +281484,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Antre De Gork (F) (2 faces) (1986).zip... --> <!-- CPC Power -->
<software name="gork1" cloneof="gork" supported="no">
- <description>L'Antre de Gork (Fra, Alt)</description>
+ <description>L'Antre de Gork (France, Alt)</description>
<year>1986</year>
<publisher>Excalibur</publisher>
<info name="usage" value="Launch with RUN&quot;GORK" />
@@ -281502,7 +281502,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Antre de Gork, L' (1987)(Excalibur)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="gork2" cloneof="gork" supported="no">
- <description>L'Antre de Gork (Fra, Alt Diks 1)</description>
+ <description>L'Antre de Gork (France, Alt Diks 1)</description>
<year>1986</year>
<publisher>Excalibur</publisher>
<info name="usage" value="Launch with RUN&quot;GORK" />
@@ -281626,7 +281626,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Apocalypse (1 de 2) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<!-- Identifying Apocalypse (2 de 2) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="apocalypa" cloneof="apocalyp">
- <description>Apocalypse (Fra, Cracked by Exocet, Alt)</description>
+ <description>Apocalypse (France, Cracked by Exocet, Alt)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;APOCALYP" />
@@ -281645,7 +281645,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Apocalypse (F) (1988) (Disk 1 of x) [h1].dsk... --> <!-- GoodCPC -->
<software name="apocalypb" cloneof="apocalyp">
- <description>Apocalypse (Fra, Cracked by Exocet, Alt Disk 1)</description>
+ <description>Apocalypse (France, Cracked by Exocet, Alt Disk 1)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;APOCALYP" />
@@ -281658,7 +281658,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Apprends Moi A Lire (F) (Face A) (19xx) [Original] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="apprenl2a" cloneof="apprenl2" supported="no">
- <description>Apprends-Moi à Lire 2 (Fra, Alt Disk 1?)</description>
+ <description>Apprends-Moi à Lire 2 (France, Alt Disk 1?)</description>
<year>1986</year>
<publisher>Cedic Nathan</publisher>
<info name="usage" value="Launch with RUN&quot;DEPART" />
@@ -281671,7 +281671,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_AP_A_LIR.dsk... -->
<software name="apprenl2b" cloneof="apprenl2" supported="no">
- <description>Apprends-Moi à Lire 2 (Fra, Alt 2)</description>
+ <description>Apprends-Moi à Lire 2 (France, Alt 2)</description>
<year>1986</year>
<publisher>Cedic Nathan</publisher>
<info name="usage" value="Launch with RUN&quot;DEPART" />
@@ -281689,7 +281689,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Apprenti Sorcier (F) (1985).zip... --> <!-- CPC Power -->
<software name="appsorcr1" cloneof="appsorcr">
- <description>L'Apprenti Sorcier (Fra, Alt)</description>
+ <description>L'Apprenti Sorcier (France, Alt)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Launch with RUN&quot;SORCIER" />
@@ -281702,7 +281702,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Apprenti Sorcier, L' (1985)(Amsoft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="appsorcr2" cloneof="appsorcr">
- <description>L'Apprenti Sorcier (Fra, Alt 2)</description>
+ <description>L'Apprenti Sorcier (France, Alt 2)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Launch with RUN&quot;SORCIER" />
@@ -281729,7 +281729,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aquanaute (F) (1988).zip... --> <!-- CPC Power -->
<software name="aquanauta" cloneof="aquanaut" supported="no">
- <description>Aquanaute (Fra, Alt)</description>
+ <description>Aquanaute (France, Alt)</description>
<year>1988</year>
<publisher>Fil</publisher>
<info name="usage" value="Launch with RUN&quot;AQUANAUT" />
@@ -281742,7 +281742,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aquanaute (1988)(FIL)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="aquanautb" cloneof="aquanaut" supported="no">
- <description>Aquanaute (Fra, Alt 2)</description>
+ <description>Aquanaute (France, Alt 2)</description>
<year>1988</year>
<publisher>Fil</publisher>
<info name="usage" value="Launch with RUN&quot;AQUANAUT" />
@@ -282420,7 +282420,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Arkanoid 3 (F) (1994) (PD).dsk... --> <!-- GoodCPC -->
<software name="arknoid3a" cloneof="arknoid3">
- <description>Arkanoid 3 (Fra, Alt)</description>
+ <description>Arkanoid 3 (France, Alt)</description>
<year>1993</year>
<publisher>Hydris</publisher><!-- PD -->
<info name="usage" value="Launch with RUN&quot;D2" />
@@ -282433,7 +282433,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Arkanoid III - The Last Chance (1993)(Hydris).dsk... --> <!-- Mostly GoodCPC -->
<software name="arknoid3b" cloneof="arknoid3">
- <description>Arkanoid 3 (Fra, Alt 2)</description>
+ <description>Arkanoid 3 (France, Alt 2)</description>
<year>1993</year>
<publisher>Hydris</publisher><!-- PD -->
<info name="usage" value="Launch with RUN&quot;ARKANOI3" />
@@ -282905,7 +282905,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Art de la Guerre, L' (F) (1990) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<!-- Identifying Art de la Guerre, L' (F) (1990) (Disk 2 of 2).dsk... --> <!-- GoodCPC -->
<software name="artguere_h2" cloneof="artguere">
- <description>L'Art de la Guerre (Fra, Unprotected, Alt)</description>
+ <description>L'Art de la Guerre (France, Unprotected, Alt)</description>
<year>1990</year>
<publisher>Broderbund France</publisher>
<info name="usage" value="Launch with RUN&quot;ART" />
@@ -282925,7 +282925,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Art de la Guerre, L' (F) (1990) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<!-- Identifying Art de la Guerre, L' (F) (1990) (Disk 2 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="artguere_h3" cloneof="artguere">
- <description>L'Art de la Guerre (Fra, Unprotected, Alt 2)</description>
+ <description>L'Art de la Guerre (France, Unprotected, Alt 2)</description>
<year>1990</year>
<publisher>Broderbund France</publisher>
<info name="usage" value="Launch with RUN&quot;ART" />
@@ -282944,7 +282944,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Arthur (F) (19xx) (PD).zip... --> <!-- CPC Power -->
<software name="arthur_t1" cloneof="arthur">
- <description>Arthur. (Fra, Trained)</description>
+ <description>Arthur. (France, Trained)</description>
<year>19??</year>
<publisher>Christian Rolland</publisher><!-- PD -->
<info name="usage" value="Launch with RUN&quot;ARTHUR" />
@@ -283035,7 +283035,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphalt (F) (2 faces) (1986) [Original].zip... --> <!-- CPC Power -->
<software name="asphalt1" cloneof="asphalt">
- <description>Asphalt (Fra, Alt)</description>
+ <description>Asphalt (France, Alt)</description>
<year>1986</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;UBI" />
@@ -283053,7 +283053,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphalt (F) (1986) [a2].dsk... --> <!-- GoodCPC -->
<software name="asphalt2" cloneof="asphalt">
- <description>Asphalt (Fra, Alt 2)</description>
+ <description>Asphalt (France, Alt 2)</description>
<year>1986</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ASPHALT" />
@@ -283066,7 +283066,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphalt (F) (1986) [a1].dsk... --> <!-- GoodCPC -->
<software name="asphalt3" cloneof="asphalt">
- <description>Asphalt (Fra, Alt 3)</description>
+ <description>Asphalt (France, Alt 3)</description>
<year>1986</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ASPHALT" />
@@ -283079,7 +283079,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphalt (F) (1986).zip... --> <!-- CPC Power -->
<software name="asphalt_t1" cloneof="asphalt">
- <description>Asphalt (Fra, Trained by XOR)</description>
+ <description>Asphalt (France, Trained by XOR)</description>
<year>1986</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ASPHALT" />
@@ -283092,7 +283092,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphalt (1987)(Ubi Soft)(fr)[cr XOR][t +2 XOR].dsk... --> <!-- Mostly GoodCPC -->
<software name="asphalt_t1a" cloneof="asphalt">
- <description>Asphalt (Fra, Trained by XOR, Alt)</description>
+ <description>Asphalt (France, Trained by XOR, Alt)</description>
<year>1986</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ASPHALT" />
@@ -283105,7 +283105,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphalt (1987)(Ubi Soft)(fr)[cr The Crack'ers Beuh L'1].dsk... --> <!-- Mostly GoodCPC -->
<software name="asphalt_t2" cloneof="asphalt">
- <description>Asphalt (Fra, Cracked by The Crack'ers Beuh l'1)</description>
+ <description>Asphalt (France, Cracked by The Crack'ers Beuh l'1)</description>
<year>1986</year>
<publisher>UBI Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ASPHALT" />
@@ -283118,7 +283118,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asphyxie (1985)(Ludo's Software Distribution)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="asphyxie1" cloneof="asphyxie">
- <description>Asphyxie (Fra, Alt)</description>
+ <description>Asphyxie (France, Alt)</description>
<year>1985</year>
<publisher>Ludo's Software Distribution</publisher>
<info name="usage" value="Launch with RUN&quot;ASPH" />
@@ -283199,7 +283199,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Assimil__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="assimila" cloneof="assimil">
- <description>Assimil - Le Nouvel Anglais (Fra, Alt)</description>
+ <description>Assimil - Le Nouvel Anglais (France, Alt)</description>
<year>1986</year>
<publisher>Ere Informatique</publisher>
<info name="alt_title" value="Assimil - Le Nouvel Anglais Sans Peine" />
@@ -283227,7 +283227,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Assimil (F) (19xx) (Disk 1 of 4).dsk... --> <!-- GoodCPC -->
<software name="assimil_b" cloneof="assimil">
- <description>Assimil - Le Nouvel Anglais (Fra, Bad?)</description>
+ <description>Assimil - Le Nouvel Anglais (France, Bad?)</description>
<year>1986</year>
<publisher>Ere Informatique</publisher>
<info name="alt_title" value="Assimil - Le Nouvel Anglais Sans Peine" />
@@ -283294,7 +283294,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asterix Chez Rahazade (1988)(Coktel Vision)(fr)(Disk 1 of 2)[cpm version].dsk... --> <!-- Mostly GoodCPC -->
<software name="astermcf1" cloneof="astermcf">
- <description>Asterix Chez Rahazade (Fra, Alt)</description>
+ <description>Asterix Chez Rahazade (France, Alt)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -283313,7 +283313,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asterix chez Rahazade (F) - Disk 1A.dsk... --> <!-- CPC Base -->
<software name="astermcf2" cloneof="astermcf" supported="no">
- <description>Asterix Chez Rahazade (Fra, Alt 2)</description>
+ <description>Asterix Chez Rahazade (France, Alt 2)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -283332,7 +283332,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Astairix en la India (Francais) (1 de 2) (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="astermcf3" cloneof="astermcf">
- <description>Asterix Chez Rahazade (Fra, Alt 3)</description>
+ <description>Asterix Chez Rahazade (France, Alt 3)</description>
<year>1988</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -283364,7 +283364,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asterix et la Potion Magique (1988)(Coktel Vision)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="asterpm_h2" cloneof="asterpm">
- <description>Asterix et la Potion Magique (Fra, Unprotected?, Alt)</description>
+ <description>Asterix et la Potion Magique (France, Unprotected?, Alt)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ASTERIX" />
@@ -283377,7 +283377,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Asterix et la Potion Magique (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="asterpm_h3" cloneof="asterpm">
- <description>Asterix et la Potion Magique (Fra, Hacked by The Master)</description>
+ <description>Asterix et la Potion Magique (France, Hacked by The Master)</description>
<year>1986</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with RUN&quot;ASTERIX" />
@@ -283416,7 +283416,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Astro - 1.0 (F) (1985).zip... --> <!-- CPC Power -->
<software name="astro10a" cloneof="astro10">
- <description>Astro - 1.0 (Fra, Alt)</description>
+ <description>Astro - 1.0 (France, Alt)</description>
<year>1985</year>
<publisher>Core</publisher>
<info name="usage" value="Launch with RUN&quot;ASTRO" />
@@ -283430,7 +283430,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_astr2001.dsk... -->
<!-- disk with crc 608a278e has same data with diff header!-->
<software name="astr2001a" cloneof="astr2001">
- <description>Astro 2001 (Fra, Alt)</description>
+ <description>Astro 2001 (France, Alt)</description>
<year>1988</year>
<publisher>Semaphore</publisher>
<info name="usage" value="Launch with RUN&quot;INSTALL" />
@@ -283548,7 +283548,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atahualpa (F) (1985) [a2].dsk... --> <!-- GoodCPC -->
<software name="atahualp1" cloneof="atahualp" supported="no">
- <description>Atahualpa (Fra, Alt)</description>
+ <description>Atahualpa (France, Alt)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<info name="usage" value="Launch with RUN&quot;HUALPA" />
@@ -283561,7 +283561,7 @@ Shortnames are chosen to "preview" the content:
<!-- CPC Power -->
<software name="atahualp_c1" cloneof="atahualp">
- <description>Atahualpa (Fra, Cracked by Apocalypse)</description>
+ <description>Atahualpa (France, Cracked by Apocalypse)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<info name="usage" value="Launch with RUN&quot;ATA" />
@@ -283574,7 +283574,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atahualpa (F) (1985).zip... --> <!-- CPC Power -->
<software name="atahualp_c1a" cloneof="atahualp">
- <description>Atahualpa (Fra, Cracked by Apocalypse, Alt)</description>
+ <description>Atahualpa (France, Cracked by Apocalypse, Alt)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<info name="usage" value="Launch with RUN&quot;ATA" />
@@ -283587,7 +283587,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atahualpa (1985)(Transoft)(fr)[cr Apocalypse].dsk... --> <!-- Mostly GoodCPC -->
<software name="atahualp_c1b" cloneof="atahualp">
- <description>Atahualpa (Fra, Cracked by Apocalypse, Alt 2)</description>
+ <description>Atahualpa (France, Cracked by Apocalypse, Alt 2)</description>
<year>1985</year>
<publisher>Transoft</publisher>
<info name="usage" value="Launch with RUN&quot;ATA" />
@@ -283665,7 +283665,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atland_PREVIEW (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="atland1" cloneof="atland">
- <description>Atland (Fra, Prototype?, Alt)</description>
+ <description>Atland (France, Prototype?, Alt)</description>
<year>1991</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Launch with RUN&quot;-ATLAND" />
@@ -283678,7 +283678,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atlantis (F) (1985) [Cobra Soft].zip... --> <!-- CPC Power -->
<software name="atlantif1" cloneof="atlantif">
- <description>Atlantis (Fra, Cobra Soft, Alt)</description>
+ <description>Atlantis (France, Cobra Soft, Alt)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ATLANTIS" />
@@ -283691,7 +283691,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atlantis (1988)(S. Querne - N. Rennert)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="atlantif2" cloneof="atlantif">
- <description>Atlantis (Fra, Cobra Soft, Alt 2)</description>
+ <description>Atlantis (France, Cobra Soft, Alt 2)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;-ATLANT" />
@@ -283704,7 +283704,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atlantis (F) - Disk 1B.dsk... --> <!-- CPC Base -->
<software name="atlantif3" cloneof="atlantif">
- <description>Atlantis (Fra, Cobra Soft, Alt 3)</description>
+ <description>Atlantis (France, Cobra Soft, Alt 3)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;DISK" />
@@ -283717,7 +283717,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atlantis Aventure (F) (1988) [a1].dsk... --> <!-- GoodCPC -->
<software name="atlantif4" cloneof="atlantif">
- <description>Atlantis (Fra, Cobra Soft, Alt 4)</description>
+ <description>Atlantis (France, Cobra Soft, Alt 4)</description>
<year>1985</year>
<publisher>Cobra Soft</publisher>
<info name="usage" value="Launch with RUN&quot;ATLANTIS" />
@@ -283756,7 +283756,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_ATLAS.dsk... -->
<software name="atlasgeo1" cloneof="atlasgeo">
- <description>Atlas Geographique (Fra, Alt)</description>
+ <description>Atlas Geographique (France, Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher><!-- PD -->
<info name="usage" value="Launch with RUN&quot;ATLAS" />
@@ -283887,7 +283887,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomic Driver (F) (1988).zip... --> <!-- CPC Power -->
<software name="atomdriv1" cloneof="atomdriv">
- <description>Atomic Driver (Fra, Alt)</description>
+ <description>Atomic Driver (France, Alt)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;-ATOM" />
@@ -283900,7 +283900,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomic Driver (1988)(Loriciels).dsk... --> <!-- Mostly GoodCPC -->
<software name="atomdriv2" cloneof="atomdriv">
- <description>Atomic Driver (Fra, Alt 2)</description>
+ <description>Atomic Driver (France, Alt 2)</description>
<year>1988</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;-ATOM" />
@@ -283913,7 +283913,7 @@ Shortnames are chosen to "preview" the content:
<!-- CPC Power -->
<software name="atomfict1" cloneof="atomfict">
- <description>Atomic Fiction (Fra, Alt)</description>
+ <description>Atomic Fiction (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;ATOFIC" />
@@ -283926,7 +283926,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomic Fiction (F) (1987).zip... --> <!-- CPC Power -->
<software name="atomfict2" cloneof="atomfict">
- <description>Atomic Fiction (Fra, Alt 2)</description>
+ <description>Atomic Fiction (France, Alt 2)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;ATOFIC" />
@@ -283939,7 +283939,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomic Fiction (1987)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="atomfict3" cloneof="atomfict">
- <description>Atomic Fiction (Fra, Alt 3)</description>
+ <description>Atomic Fiction (France, Alt 3)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;ATOFIC" />
@@ -283952,7 +283952,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomic Fiction (1987)(Chip)(fr)[a2].dsk... --> <!-- Mostly GoodCPC -->
<software name="atomfict4" cloneof="atomfict">
- <description>Atomic Fiction (Fra, Alt 4)</description>
+ <description>Atomic Fiction (France, Alt 4)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;ATOM-FIC" />
@@ -283965,7 +283965,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomic Fiction (1987)(Chip)(fr)[a].dsk... --> <!-- Mostly GoodCPC -->
<software name="atomfict5" cloneof="atomfict">
- <description>Atomic Fiction (Fra, Alt 5)</description>
+ <description>Atomic Fiction (France, Alt 5)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;AF" />
@@ -283978,7 +283978,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomik (F) (1988).zip... --> <!-- CPC Power -->
<software name="atomik1" cloneof="atomik">
- <description>Atomik (Fra, Alt)</description>
+ <description>Atomik (France, Alt)</description>
<year>1988</year>
<publisher>Fil</publisher>
<info name="usage" value="Launch with RUN&quot;ATOMIK" />
@@ -283991,7 +283991,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Atomik (1988)(Loriciels)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="atomik2" cloneof="atomik">
- <description>Atomik (Fra, Alt 2)</description>
+ <description>Atomik (France, Alt 2)</description>
<year>1988</year>
<publisher>Fil</publisher>
<info name="usage" value="Launch with RUN&quot;ATOMIK" />
@@ -284004,7 +284004,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_atomik.dsk... -->
<software name="atomik3" cloneof="atomik">
- <description>Atomik (Fra, Alt 3)</description>
+ <description>Atomik (France, Alt 3)</description>
<year>1988</year>
<publisher>Fil</publisher>
<info name="usage" value="Launch with RUN&quot;ATOMIK" />
@@ -284108,7 +284108,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Attentat (1986)(Rainbow Productions)(fr)(Disk 1 of 2).dsk... --> <!-- Mostly GoodCPC -->
<software name="attentat1" cloneof="attentat" supported="no">
- <description>Attentat (Fra, Alt)</description>
+ <description>Attentat (France, Alt)</description>
<year>1986</year>
<publisher>Rainbow Production</publisher>
<info name="usage" value="Launch with RUN&quot;ATTENTAT" />
@@ -284126,7 +284126,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Attentat (F) (1986) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="attentat2" cloneof="attentat" supported="no">
- <description>Attentat (Fra, Alt 2)</description>
+ <description>Attentat (France, Alt 2)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -284143,7 +284143,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Attentat (F) (1986) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="attentat_t1" cloneof="attentat">
- <description>Attentat (Fra, Trained by Grees &amp; Chany)</description>
+ <description>Attentat (France, Trained by Grees &amp; Chany)</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3">
@@ -284181,7 +284181,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Au Nom de L'Hermine (F) (1987) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="hermine2" cloneof="hermine">
- <description>Au Nom de l'Hermine (Fra, Unprotected?, Alt)</description>
+ <description>Au Nom de l'Hermine (France, Unprotected?, Alt)</description>
<year>1987</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -284199,7 +284199,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Au Nom de L'Hermine (F) (1987) (Disk 1 of 2) [a1].dsk... --> <!-- GoodCPC -->
<software name="hermine3" cloneof="hermine">
- <description>Au Nom de l'Hermine (Fra, Unprotected?, Alt 2)</description>
+ <description>Au Nom de l'Hermine (France, Unprotected?, Alt 2)</description>
<year>1987</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -284217,7 +284217,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Au_Nom_de_l_Hermine__FRENCH__Side_A (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="hermine4" cloneof="hermine">
- <description>Au Nom de l'Hermine (Fra, Unprotected?, Alt 3)</description>
+ <description>Au Nom de l'Hermine (France, Unprotected?, Alt 3)</description>
<year>1987</year>
<publisher>Coktel Vision</publisher>
<info name="usage" value="Launch with |CPM" />
@@ -284340,7 +284340,7 @@ Shortnames are chosen to "preview" the content:
<!-- CPC Power -->
<software name="aremonty1" cloneof="awmonty">
- <description>Au Revoir Monty (Fra, Alt)</description>
+ <description>Au Revoir Monty (France, Alt)</description>
<year>1987</year>
<publisher>Gremlin Graphics Software</publisher>
<info name="usage" value="Launch with RUN&quot;MONTY" />
@@ -284353,7 +284353,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Au revoir Monty (UK) (1987).zip... --> <!-- CPC Power -->
<software name="aremonty2" cloneof="awmonty">
- <description>Au Revoir Monty (Fra, Alt 2)</description>
+ <description>Au Revoir Monty (France, Alt 2)</description>
<year>1987</year>
<publisher>Gremlin Graphics Software</publisher>
<info name="usage" value="Launch with RUN&quot;MONTY" />
@@ -284366,7 +284366,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Au Revoir Monty (1987)(Gremlin Graphics Software)[cr Two Mag].dsk... --> <!-- Mostly GoodCPC -->
<software name="aremonty_c1" cloneof="awmonty">
- <description>Au Revoir Monty (Fra, Cracked by Two Mag)</description>
+ <description>Au Revoir Monty (France, Cracked by Two Mag)</description>
<year>1987</year>
<publisher>Gremlin Graphics Software</publisher>
<info name="usage" value="Launch with RUN&quot;MONTY1" />
@@ -284379,7 +284379,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Au Revoir Monty (1987)(Gremlin Graphics Software)[cr Two Mag][t].dsk... --> <!-- Mostly GoodCPC -->
<software name="aremonty_t1" cloneof="awmonty">
- <description>Au Revoir Monty (Fra, Trained by Two Mag)</description>
+ <description>Au Revoir Monty (France, Trained by Two Mag)</description>
<year>1987</year>
<publisher>Gremlin Graphics Software</publisher>
<info name="usage" value="Launch with RUN&quot;MONTY1" />
@@ -284539,7 +284539,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Automec (F) (1985).zip... --> <!-- CPC Power -->
<software name="automec1" cloneof="automec">
- <description>Automec (Fra, Alt)</description>
+ <description>Automec (France, Alt)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AUTOMEC" />
@@ -284552,7 +284552,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Automec (F) (1985).dsk... --> <!-- GoodCPC -->
<software name="automec2" cloneof="automec">
- <description>Automec (Fra, Alt 2)</description>
+ <description>Automec (France, Alt 2)</description>
<year>1985</year>
<publisher>Loriciels</publisher>
<info name="usage" value="Launch with RUN&quot;AUTOMEC" />
@@ -284565,7 +284565,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Autre Aventure, L' (1987)(Genisoft)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="autraven1" cloneof="autraven">
- <description>L'Autre Aventure (Fra, Alt)</description>
+ <description>L'Autre Aventure (France, Alt)</description>
<year>1987</year>
<publisher>Genisoft</publisher>
<info name="usage" value="Launch with RUN&quot;LAUTRE" />
@@ -284804,7 +284804,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures au Chateau (1985)(Micro Application)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="avenchat1" cloneof="avenchat">
- <description>Aventures au Chateau (Fra, Alt)</description>
+ <description>Aventures au Chateau (France, Alt)</description>
<year>1985</year>
<publisher>Micro Application</publisher>
<info name="usage" value="Launch with RUN&quot;CHATEAU" />
@@ -284817,7 +284817,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Les Aventures De Pepito Au Mexique (F) (2 faces) (1991).zip... --> <!-- CPC Power -->
<software name="pepito_t1" cloneof="pepito">
- <description>Les Aventures de Pepito au Mexique (Fra, Trained by XOR)</description>
+ <description>Les Aventures de Pepito au Mexique (France, Trained by XOR)</description>
<year>1991</year>
<publisher>Microids</publisher>
<info name="usage" value="Launch with RUN&quot;PEPITO" />
@@ -284835,7 +284835,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Pepito au Mexique, Les (1991)(Belin)(fr)(Disk 1 of 2)[cr XOR][t XOR].dsk... --> <!-- Mostly GoodCPC -->
<software name="pepito_t1a" cloneof="pepito">
- <description>Les Aventures de Pepito au Mexique (Fra, Trained by XOR, Alt Disk 1)</description>
+ <description>Les Aventures de Pepito au Mexique (France, Trained by XOR, Alt Disk 1)</description>
<year>1991</year>
<publisher>Microids</publisher>
<info name="usage" value="Launch with RUN&quot;PEPITO" />
@@ -284848,7 +284848,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Pepito au Mexique, Les (F) (1991) (Disk 1 of 2).dsk... --> <!-- GoodCPC -->
<software name="pepito_t2" cloneof="pepito">
- <description>Les Aventures de Pepito au Mexique (Fra, Trained by Grees &amp; Chany)</description>
+ <description>Les Aventures de Pepito au Mexique (France, Trained by Grees &amp; Chany)</description>
<year>1991</year>
<publisher>Microids</publisher>
<info name="usage" value="Launch with RUN&quot;PEPITO" />
@@ -284866,7 +284866,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Pepito au Mexique, Les (1991)(Belin)(fr)(Disk 1 of 2)[cr NPS].dsk... --> <!-- Mostly GoodCPC -->
<software name="pepito_t2a" cloneof="pepito">
- <description>Les Aventures de Pepito au Mexique (Fra, Trained by Grees &amp; Chany, Alt)</description>
+ <description>Les Aventures de Pepito au Mexique (France, Trained by Grees &amp; Chany, Alt)</description>
<year>1991</year>
<publisher>Microids</publisher>
<info name="usage" value="Launch with RUN&quot;PEPITO" />
@@ -285005,7 +285005,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Les Aventures De Jack Burton (F) (1987).zip... --> <!-- CPC Power -->
<software name="jburton_h2" cloneof="bigtroub">
- <description>Les Aventures de Jack Burton (Fra, Unprotected, Alt)</description>
+ <description>Les Aventures de Jack Burton (France, Unprotected, Alt)</description>
<year>1987</year>
<publisher>Electric Dreams</publisher>
<info name="usage" value="Launch with RUN&quot;JACK" />
@@ -285018,7 +285018,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Jack Burton, Les (1987)(Electric Dreams Software)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="jburton_h3" cloneof="bigtroub">
- <description>Les Aventures de Jack Burton (Fra, Unprotected, Alt 2)</description>
+ <description>Les Aventures de Jack Burton (France, Unprotected, Alt 2)</description>
<year>1987</year>
<publisher>Electric Dreams</publisher>
<info name="usage" value="Launch with RUN&quot;JACKBURT" />
@@ -285031,7 +285031,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Jack Burton, Les (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="jburton_h4" cloneof="bigtroub">
- <description>Les Aventures de Jack Burton (Fra, Unprotected, Alt 3)</description>
+ <description>Les Aventures de Jack Burton (France, Unprotected, Alt 3)</description>
<year>1987</year>
<publisher>Electric Dreams</publisher>
<info name="usage" value="Launch with RUN&quot;JACK" />
@@ -285044,7 +285044,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Jack Burton, Les (F) (1987) [h1].dsk... --> <!-- GoodCPC -->
<software name="jburton_c1" cloneof="bigtroub">
- <description>Les Aventures de Jack Burton (Fra, Cracked by Two Mag)</description>
+ <description>Les Aventures de Jack Burton (France, Cracked by Two Mag)</description>
<year>1987</year>
<publisher>Electric Dreams</publisher>
<info name="usage" value="Launch with RUN&quot;JACKBURT" />
@@ -285197,7 +285197,7 @@ Shortnames are chosen to "preview" the content:
<!-- CPC Power -->
<software name="crepnajaa" cloneof="crepnaja">
- <description>Le Crepuscule du Naja (Fra, Alt)</description>
+ <description>Le Crepuscule du Naja (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;NAJA" />
@@ -285210,7 +285210,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Le Crepuscule Du Naja (F) (1987).zip... --> <!-- CPC Power -->
<software name="crepnajab" cloneof="crepnaja">
- <description>Le Crepuscule du Naja (Fra, Alt 2)</description>
+ <description>Le Crepuscule du Naja (France, Alt 2)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;NAJA" />
@@ -285223,7 +285223,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Crepuscule du Naja, Le (1987)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="crepnajac" cloneof="crepnaja">
- <description>Le Crepuscule du Naja (Fra, Alt 3)</description>
+ <description>Le Crepuscule du Naja (France, Alt 3)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;NAJA" />
@@ -285236,7 +285236,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Crepuscule Du Naja, Le (F) (1987) [a1].dsk... --> <!-- GoodCPC -->
<software name="crepnajad" cloneof="crepnaja">
- <description>Le Crepuscule du Naja (Fra, Alt 4)</description>
+ <description>Le Crepuscule du Naja (France, Alt 4)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;NAJA" />
@@ -285312,7 +285312,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Cyrus II Chess (F).dsk... --> <!-- CPC Base -->
<software name="cyrus2chf1" cloneof="cyrus2ch">
- <description>Cyrus II Chess (Fra, Alt)</description>
+ <description>Cyrus II Chess (France, Alt)</description>
<year>1985</year>
<publisher>Amsoft</publisher>
<info name="usage" value="Launch with RUN&quot;DISC" />
@@ -285657,7 +285657,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L_Ange_De_Cristal__FRENCH__MCSPE (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="angecris_h1" cloneof="getdext2">
- <description>L'Ange de Cristal (Fra, Hacked by McSpe)</description>
+ <description>L'Ange de Cristal (France, Hacked by McSpe)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;ANGE" />
@@ -285670,7 +285670,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Crafton &amp; Xunk - L'Ange de Cristal (1988)(ERE Informatique)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="angecris_h2" cloneof="getdext2">
- <description>L'Ange de Cristal (Fra, Trained by Two Mag)</description>
+ <description>L'Ange de Cristal (France, Trained by Two Mag)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;ANGECRYS" />
@@ -285683,7 +285683,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Crafton et Xunk - L'ange de Cristal (F) (1988).dsk... --> <!-- GoodCPC -->
<software name="angecris_h2a" cloneof="getdext2">
- <description>L'Ange de Cristal (Fra, Trained by Two Mag, Alt)</description>
+ <description>L'Ange de Cristal (France, Trained by Two Mag, Alt)</description>
<year>1988</year>
<publisher>Ere Informatique</publisher>
<info name="usage" value="Launch with RUN&quot;ANGECRYS" />
@@ -286035,7 +286035,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Le Malefice Des Atlantes (F) (1987).zip... --> <!-- CPC Power -->
<!-- disks with crc 660d4f2c and d58f780d have same data with diff header -->
<software name="atlantes1" cloneof="atlantes">
- <description>Le Malefice des Atlantes (Fra, Alt)</description>
+ <description>Le Malefice des Atlantes (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;ATLANTE" />
@@ -286048,7 +286048,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Malefice des Atlantes, Le (1987)(Chip)(fr)[cr Two Mag][t Two Mag].dsk... --> <!-- Mostly GoodCPC -->
<software name="atlantes_t1" cloneof="atlantes">
- <description>Le Malefice des Atlantes (Fra, Trained by Two Mag)</description>
+ <description>Le Malefice des Atlantes (France, Trained by Two Mag)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;ATLANTE" />
@@ -286135,7 +286135,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Menace Sur L'Arctique (F) (1987).zip... --> <!-- CPC Power -->
<software name="menartic1" cloneof="menartic">
- <description>Menace sur l'Arctique (Fra, Alt)</description>
+ <description>Menace sur l'Arctique (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;MENACE" />
@@ -286148,7 +286148,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Menace sur l'Arctique (1987)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="menartic2" cloneof="menartic">
- <description>Menace sur l'Arctique (Fra, Alt 2)</description>
+ <description>Menace sur l'Arctique (France, Alt 2)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;MENACE" />
@@ -286161,7 +286161,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Menace Sur L'Arctique (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="menartic3" cloneof="menartic">
- <description>Menace sur l'Arctique (Fra, Alt 3)</description>
+ <description>Menace sur l'Arctique (France, Alt 3)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;MENACE" />
@@ -286174,7 +286174,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Les_Aventures_du_KA-Menace_sur_l_Arctique__FRENCH__MCSPE (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="menartic_h1" cloneof="menartic">
- <description>Menace sur l'Arctique (Fra, Hacked by McSpe)</description>
+ <description>Menace sur l'Arctique (France, Hacked by McSpe)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;MENACE" />
@@ -286252,7 +286252,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L'Armure Sacree D'Antiriad (F) (1986).zip... --> <!-- CPC Power -->
<software name="antiriadfa" cloneof="antiriad">
- <description>L'Armure Sacree d'Antiriad (Fra, Alt)</description>
+ <description>L'Armure Sacree d'Antiriad (France, Alt)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<info name="usage" value="Launch with RUN&quot;ANTIRIAD" />
@@ -286265,7 +286265,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Antiriad (F) (1987) [a2].dsk... --> <!-- GoodCPC -->
<software name="antiriadfb" cloneof="antiriad">
- <description>L'Armure Sacree d'Antiriad (Fra, Alt 2)</description>
+ <description>L'Armure Sacree d'Antiriad (France, Alt 2)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<info name="usage" value="Launch with RUN&quot;ANT" />
@@ -286278,7 +286278,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Antiriad (F) (1987).dsk... --> <!-- GoodCPC -->
<software name="antiriadfc" cloneof="antiriad">
- <description>L'Armure Sacree d'Antiriad (Fra, Alt 3)</description>
+ <description>L'Armure Sacree d'Antiriad (France, Alt 3)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<info name="usage" value="Launch with RUN&quot;ANTIRIAD" />
@@ -286291,7 +286291,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Sacred Armour of Antiriad, The (1986)(Palace Software)(fr)[t].dsk... --> <!-- Mostly GoodCPC -->
<software name="antiriadf_t1" cloneof="antiriad">
- <description>L'Armure Sacree d'Antiriad (Fra, Trained)</description>
+ <description>L'Armure Sacree d'Antiriad (France, Trained)</description>
<year>1986</year>
<publisher>Palace Software</publisher>
<info name="usage" value="Launch with RUN&quot;ANTIRIAD" />
@@ -286356,7 +286356,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Le Septieme Continent (F) (128K) (19xx).zip... --> <!-- CPC Power -->
<software name="7contin_c1" cloneof="7contin">
- <description>Le Septieme Continent (Fra, Cracked by Grees &amp; Chany)</description>
+ <description>Le Septieme Continent (France, Cracked by Grees &amp; Chany)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher> <!-- PD -->
<info name="compatibility" value="128K,BASIC1.1" />
@@ -286369,7 +286369,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 7eme Continent, Le (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="7contin_c1a" cloneof="7contin">
- <description>Le Septieme Continent (Fra, Cracked by Grees &amp; Chany, Alt)</description>
+ <description>Le Septieme Continent (France, Cracked by Grees &amp; Chany, Alt)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher> <!-- PD -->
<info name="compatibility" value="128K,BASIC1.1" />
@@ -286382,7 +286382,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Septieme Continent, Le (19xx)(L. Dplanque)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="7contin_c2" cloneof="7contin">
- <description>Le Septieme Continent (Fra, Hacked?)</description>
+ <description>Le Septieme Continent (France, Hacked?)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher> <!-- PD -->
<info name="compatibility" value="128K,BASIC1.1" />
@@ -286486,7 +286486,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Le Talisman D'Osiris (F) (1987).zip... --> <!-- CPC Power -->
<software name="osiris1" cloneof="osiris">
- <description>Le Talisman d'Osiris (Fra, Alt)</description>
+ <description>Le Talisman d'Osiris (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;OSIRIS" />
@@ -286499,7 +286499,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Talisman d'Osiris, Le (1987)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="osiris2" cloneof="osiris">
- <description>Le Talisman d'Osiris (Fra, Alt 2)</description>
+ <description>Le Talisman d'Osiris (France, Alt 2)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;OSIRIS" />
@@ -286512,7 +286512,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Talisman d'Osiris, Le (1987)(Chip)(fr)[a].dsk... --> <!-- Mostly GoodCPC -->
<software name="osiris3" cloneof="osiris">
- <description>Le Talisman d'Osiris (Fra, Alt 3)</description>
+ <description>Le Talisman d'Osiris (France, Alt 3)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;OSIRIS" />
@@ -286525,7 +286525,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Les_Aventures_du_Ka-Le_Talisman_d_Osiris__FRENCH__JUPITERS (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="osiris_t1" cloneof="osiris">
- <description>Le Talisman d'Osiris (Fra, Trained by Jupiter &amp; Saturn)</description>
+ <description>Le Talisman d'Osiris (France, Trained by Jupiter &amp; Saturn)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;OSIRIS" />
@@ -286648,7 +286648,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Moktar, Les (1992)(Titus)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="moktar1" cloneof="titus" supported="no">
- <description>Les Aventures de Moktar (Fra, Alt)</description>
+ <description>Les Aventures de Moktar (France, Alt)</description>
<year>1992</year>
<publisher>Titus</publisher>
<info name="usage" value="Launch with RUN&quot;MOKTAR" />
@@ -286661,7 +286661,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Adventures de Moktar, Les (1992)(Titus).dsk... --> <!-- Mostly GoodCPC -->
<software name="moktar2" cloneof="titus" supported="no">
- <description>Les Aventures de Moktar (Fra, Alt 2)</description>
+ <description>Les Aventures de Moktar (France, Alt 2)</description>
<year>1992</year>
<publisher>Titus</publisher>
<info name="usage" value="Launch with RUN&quot;MOKTAR" />
@@ -286674,7 +286674,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Moktar, Les (1992)(Titus)(fr)[cr XOR][t +2 XOR].dsk... --> <!-- Mostly GoodCPC -->
<software name="moktar_t1a" cloneof="titus">
- <description>Les Aventures de Moktar (Fra, Trained by XOR, Alt)</description>
+ <description>Les Aventures de Moktar (France, Trained by XOR, Alt)</description>
<year>1992</year>
<publisher>Titus</publisher>
<info name="usage" value="Launch with RUN&quot;MOKTAR" />
@@ -286687,7 +286687,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aventures de Moktar, Les (F) (1992) [t1].dsk... --> <!-- GoodCPC -->
<software name="moktar_t2" cloneof="titus">
- <description>Les Aventures de Moktar (Fra, Trained by Two Mag)</description>
+ <description>Les Aventures de Moktar (France, Trained by Two Mag)</description>
<year>1992</year>
<publisher>Titus</publisher>
<info name="usage" value="Launch with RUN&quot;MOKTAR" />
@@ -286700,7 +286700,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Adventures du ka Traitement Bzzz, Les (19xx)(Chip)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="bzzz1" cloneof="bzzz">
- <description>Traitement Bzzz (Fra, Alt)</description>
+ <description>Traitement Bzzz (France, Alt)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;-BZZZ" />
@@ -286713,7 +286713,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Traitement Bzzz (F) (1987).zip... --> <!-- CPC Power -->
<software name="bzzz_t1" cloneof="bzzz">
- <description>Traitement Bzzz (Fra, Trained by Velus)</description>
+ <description>Traitement Bzzz (France, Trained by Velus)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;BZZZ" />
@@ -286727,7 +286727,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Traitement Bzzz (1987)(Chip)(fr)[cr NPS][t +2 NPS].dsk... --> <!-- Mostly GoodCPC -->
<!-- disk with crc 4d3b30f0 same data with diff header -->
<software name="bzzz_t2" cloneof="bzzz">
- <description>Traitement Bzzz (Fra, Trained by Grees &amp; Chany)</description>
+ <description>Traitement Bzzz (France, Trained by Grees &amp; Chany)</description>
<year>1987</year>
<publisher>Chip</publisher>
<info name="usage" value="Launch with RUN&quot;BZZZ" />
@@ -286746,7 +286746,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 002_Agent_Double (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="002agenta" cloneof="002agent">
- <description>002 Agent Double (Fra, Alt)</description>
+ <description>002 Agent Double (France, Alt)</description>
<year>1990</year>
<publisher>Amstar &amp; CPC</publisher>
<part name="flop1" interface="floppy_3">
@@ -286758,7 +286758,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Agent 1 (1985)(KKS)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="002agentb" cloneof="002agent">
- <description>002 Agent Double (Fra, Alt 2?)</description>
+ <description>002 Agent Double (France, Alt 2?)</description>
<year>1990</year>
<publisher>Amstar &amp; CPC</publisher>
<part name="flop1" interface="floppy_3">
@@ -286770,7 +286770,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 13 Colors (F) (1992) [CPC Infos].zip... --> <!-- CPC Power -->
<software name="13colorsa" cloneof="13colors">
- <description>13 Colors (Fra, Alt)</description>
+ <description>13 Colors (France, Alt)</description>
<year>1992</year>
<publisher>CPC Infos</publisher>
<part name="flop1" interface="floppy_3">
@@ -286782,7 +286782,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 13_Colors__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="13colorsb" cloneof="13colors">
- <description>13 Colors (Fra, Alt 2)</description>
+ <description>13 Colors (France, Alt 2)</description>
<year>1992</year>
<publisher>CPC Infos</publisher>
<part name="flop1" interface="floppy_3">
@@ -286794,7 +286794,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1914 (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="1914a" cloneof="1914">
- <description>1914 (Fra, Alt)</description>
+ <description>1914 (France, Alt)</description>
<year>1987</year>
<publisher>Amstar</publisher>
<part name="flop1" interface="floppy_3">
@@ -286806,7 +286806,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1914__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="1914b" cloneof="1914">
- <description>1914 (Fra, Alt 2)</description>
+ <description>1914 (France, Alt 2)</description>
<year>1987</year>
<publisher>Amstar</publisher>
<part name="flop1" interface="floppy_3">
@@ -286818,7 +286818,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1914 (1987)(FC1Fro)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="1914_h1" cloneof="1914">
- <description>1914 (Fra, Hacked by FC1Fro?)</description>
+ <description>1914 (France, Hacked by FC1Fro?)</description>
<year>1987</year>
<publisher>Amstar</publisher>
<part name="flop1" interface="floppy_3">
@@ -286830,7 +286830,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 1914 (F) (19xx) [a1].dsk... --> <!-- GoodCPC -->
<software name="1914_h1a" cloneof="1914">
- <description>1914 (Fra, Hacked by FC1Fro?, Alt)</description>
+ <description>1914 (France, Hacked by FC1Fro?, Alt)</description>
<year>1987</year>
<publisher>Amstar</publisher>
<part name="flop1" interface="floppy_3">
@@ -286842,7 +286842,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 20000_Pieux_Sous_Les_Mers__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="20kpieuxa" cloneof="20kpieux">
- <description>20000 Pieux Sous Les Mers (Fra, Alt)</description>
+ <description>20000 Pieux Sous Les Mers (France, Alt)</description>
<year>1989</year>
<publisher>Micro Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -286854,7 +286854,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D_Chateau__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dchatea1" cloneof="3dchatea">
- <description>3D Chateau (Fra, Alt)</description>
+ <description>3D Chateau (France, Alt)</description>
<year>1986</year>
<publisher>Amstrad Magazine</publisher>
<part name="flop1" interface="floppy_3">
@@ -286866,7 +286866,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Madness (F).dsk... --> <!-- CPC Base -->
<software name="3dmadnesa" cloneof="3dmadnes">
- <description>3D Madness (Fra, Alt)</description>
+ <description>3D Madness (France, Alt)</description>
<year>1988</year>
<publisher>AM-Mag</publisher>
<info name="usage" value="Launch with RUN&quot;MADPRES" />
@@ -286879,7 +286879,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D_Madness (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dmadnesb" cloneof="3dmadnes">
- <description>3D Madness (Fra, Alt 2)</description>
+ <description>3D Madness (France, Alt 2)</description>
<year>1988</year>
<publisher>AM-Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -286905,7 +286905,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D-Mersi__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dmersif1" cloneof="3dmersi">
- <description>3D Mersi (Fra, Alt)</description>
+ <description>3D Mersi (France, Alt)</description>
<year>1991</year>
<publisher>CPC Amstrad International</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -286918,7 +286918,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Morpion (F) (1985) (Version 2) [Hebdogiciel].zip... --> <!-- CPC Power -->
<software name="3dmorpio1" cloneof="3dmorpio">
- <description>3D Morpion (Fra, v.2, Alt)</description>
+ <description>3D Morpion (France, v.2, Alt)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;3DMORPIO" />
@@ -286931,7 +286931,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3dmorpio (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dmorpio2" cloneof="3dmorpio">
- <description>3D Morpion (Fra, v.2, Alt 2)</description>
+ <description>3D Morpion (France, v.2, Alt 2)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;3DMORPIO" />
@@ -286944,7 +286944,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Morpion (1985)(R. Lanne)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="3dmorpio3" cloneof="3dmorpio">
- <description>3D Morpion (Fra, v.2, Alt 3)</description>
+ <description>3D Morpion (France, v.2, Alt 3)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<part name="flop1" interface="floppy_3">
@@ -286956,7 +286956,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D_Morpion (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3dmorpio4" cloneof="3dmorpio">
- <description>3D Morpion (Fra, v.2, Alt 4)</description>
+ <description>3D Morpion (France, v.2, Alt 4)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<part name="flop1" interface="floppy_3">
@@ -286968,7 +286968,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3D Morpion (F) (1985) [Hebdogiciel].zip... --> <!-- CPC Power -->
<software name="3dmorpioo1" cloneof="3dmorpio">
- <description>3D Morpion (Fra, Alt)</description>
+ <description>3D Morpion (France, Alt)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;MORPION" />
@@ -286981,7 +286981,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ABC__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="abc1" cloneof="abc">
- <description>ABC (Fra, Alt)</description>
+ <description>ABC (France, Alt)</description>
<year>1986</year>
<publisher>CPC</publisher>
<info name="usage" value="Launch with RUN&quot;ABC" />
@@ -286994,7 +286994,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Actref (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="actref1" cloneof="actref">
- <description>Actref (Fra, Alt)</description>
+ <description>Actref (France, Alt)</description>
<year>1988</year>
<publisher>CPC Infos</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -287008,7 +287008,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Actref__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="actref2" cloneof="actref">
- <description>Actref (Fra, Alt 2)</description>
+ <description>Actref (France, Alt 2)</description>
<year>1988</year>
<publisher>CPC Infos</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -287022,7 +287022,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Actref (1988)(WEBER Gilles)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="actref3" cloneof="actref">
- <description>Actref (Fra, Alt 3)</description>
+ <description>Actref (France, Alt 3)</description>
<year>1988</year>
<publisher>CPC Infos</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -287036,7 +287036,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Africa__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="africaa" cloneof="africa">
- <description>Africa (Fra, Alt)</description>
+ <description>Africa (France, Alt)</description>
<year>1986</year>
<publisher>Les Cahiers d'Amstrad Magazine</publisher>
<info name="usage" value="Launch with RUN&quot;AFRICA" />
@@ -287049,7 +287049,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying age_de_pierre (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="agepier1" cloneof="bcrash">
- <description>L'Age de Pierre (Fra, Alt)</description>
+ <description>L'Age de Pierre (France, Alt)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;AGE" />
@@ -287062,7 +287062,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying L_Age_de_Pierre (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="agepier2" cloneof="bcrash">
- <description>L'Age de Pierre (Fra, Alt 2)</description>
+ <description>L'Age de Pierre (France, Alt 2)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;AGE" />
@@ -287075,7 +287075,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Agent Secret Z33 (F) (1990) (v2) [CPC].zip... --> <!-- CPC Power -->
<software name="agentz33_t1" cloneof="agentz33">
- <description>Agent Secret Z33 (Fra, Bugfixed, Trained by VELUS)</description>
+ <description>Agent Secret Z33 (France, Bugfixed, Trained by VELUS)</description>
<year>1990</year>
<publisher>CPC</publisher>
<info name="usage" value="Launch with RUN&quot;AGENTZ33" />
@@ -287101,7 +287101,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alca (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alca1" cloneof="alca">
- <description>Alca (Fra, Alt)</description>
+ <description>Alca (France, Alt)</description>
<year>1987</year>
<publisher>CPC</publisher>
<info name="usage" value="Launch with RUN&quot;ALCA" />
@@ -287114,7 +287114,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alca__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alca2" cloneof="alca">
- <description>Alca (Fra, Alt 2)</description>
+ <description>Alca (France, Alt 2)</description>
<year>1987</year>
<publisher>CPC</publisher>
<part name="flop1" interface="floppy_3">
@@ -287126,7 +287126,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alien__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alienf1" cloneof="alienf">
- <description>Alien (Fra, Hebdogiciel, Alt)</description>
+ <description>Alien (France, Hebdogiciel, Alt)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;ALIEN" />
@@ -287139,7 +287139,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aligator (F).dsk... --> <!-- CPC Base -->
<software name="aligator1" cloneof="aligator">
- <description>Aligator (Fra, Alt)</description>
+ <description>Aligator (France, Alt)</description>
<year>1988</year>
<publisher>AM-Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -287151,7 +287151,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Aligator__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="aligator2" cloneof="aligator">
- <description>Aligator (Fra, Alt 2)</description>
+ <description>Aligator (France, Alt 2)</description>
<year>1988</year>
<publisher>AM-Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -287163,7 +287163,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ZZZ_UNK_ALIGATOR.dsk... -->
<software name="aligator3" cloneof="aligator">
- <description>Aligator (Fra, Alt 3)</description>
+ <description>Aligator (France, Alt 3)</description>
<year>1988</year>
<publisher>AM-Mag</publisher>
<part name="flop1" interface="floppy_3">
@@ -287175,7 +287175,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alinka (1991)(Eric Boucher)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="alinka1" cloneof="alinka">
- <description>Alinka (Fra, Alt)</description>
+ <description>Alinka (France, Alt)</description>
<year>1991</year>
<publisher>Amstrad Cent Pour Cent</publisher>
<info name="usage" value="Launch with RUN&quot;ALINKA" />
@@ -287188,7 +287188,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying alinka (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alinka2" cloneof="alinka">
- <description>Alinka (Fra, Alt 2)</description>
+ <description>Alinka (France, Alt 2)</description>
<year>1991</year>
<publisher>Amstrad Cent Pour Cent</publisher>
<info name="usage" value="Launch with RUN&quot;ALINKA" />
@@ -287201,7 +287201,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alpha_Bug (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alphabug1" cloneof="alphabug">
- <description>Alpha Bug (Fra, Alt)</description>
+ <description>Alpha Bug (France, Alt)</description>
<year>1986</year>
<publisher>Hebdogiciel</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -287215,7 +287215,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alpha-Strip__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alphastr1" cloneof="alphastr">
- <description>Alpha-Strip (Fra, Alt)</description>
+ <description>Alpha-Strip (France, Alt)</description>
<year>1988</year>
<publisher>CPC</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -287229,7 +287229,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Alphabet__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="alphabet1" cloneof="alphabet">
- <description>Alphabet (Fra, Alt)</description>
+ <description>Alphabet (France, Alt)</description>
<year>1984</year>
<publisher>Amstrad Jeux D'Action</publisher>
<part name="flop1" interface="floppy_3">
@@ -287305,7 +287305,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Angoisse [RUN''DISC''] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="angoisse1" cloneof="angoisse">
- <description>Angoisse (Fra, Hacked by N. Gabillion?)</description>
+ <description>Angoisse (France, Hacked by N. Gabillion?)</description>
<year>1986</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;ANGOISSE" />
@@ -287318,7 +287318,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Angoisse (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="angoisse1a" cloneof="angoisse">
- <description>Angoisse (Fra, Hacked by N. Gabillion?, Alt)</description>
+ <description>Angoisse (France, Hacked by N. Gabillion?, Alt)</description>
<year>1986</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;ANGOISSE" />
@@ -287331,7 +287331,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Angoisse (F) (1986) [Hebdogiciel].zip... --> <!-- CPC Power -->
<software name="angoisse2" cloneof="angoisse">
- <description>Angoisse (Fra, Cracked by Velus)</description>
+ <description>Angoisse (France, Cracked by Velus)</description>
<year>1986</year>
<publisher>Hebdogiciel</publisher>
<info name="usage" value="Launch with RUN&quot;ANGOISSE" />
@@ -287344,7 +287344,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A_Fond_La_Caisse__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="afondlac1" cloneof="afondlac">
- <description>A Fond la Caisse (Fra, Alt)</description>
+ <description>A Fond la Caisse (France, Alt)</description>
<year>1989</year>
<publisher>Amstar &amp; CPC</publisher>
<part name="flop1" interface="floppy_3">
@@ -287356,7 +287356,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A_La_Recherche_Du_Roi_Richard__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="roirichr1" cloneof="roirichr">
- <description>A la Recherche du Roi Richard (Fra, Alt)</description>
+ <description>A la Recherche du Roi Richard (France, Alt)</description>
<year>1990</year>
<publisher>Tilt</publisher>
<info name="compatibility" value="BASIC1.1" />
@@ -287369,7 +287369,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying A-P-I-D__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="apid1" cloneof="apid">
- <description>A-P-I-D (Fra, Alt)</description>
+ <description>A-P-I-D (France, Alt)</description>
<year>1986</year>
<publisher>Amstrad Magazine</publisher>
<info name="usage" value="Launch with RUN&quot;A-P-I-D" />
@@ -287382,7 +287382,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ATC (F) (1990) [Amstrad Cent Pour Cent].zip... --> <!-- CPC Power -->
<software name="atc1" cloneof="atc">
- <description>ATC (Fra, Alt)</description>
+ <description>ATC (France, Alt)</description>
<year>1990</year>
<publisher>Amstrad Cent Pour Cent</publisher>
<info name="usage" value="Launch with RUN&quot;ATC" />
@@ -287395,7 +287395,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ATC (1989)(Roux-Serret)(fr).dsk... --> <!-- Mostly GoodCPC -->
<software name="atc2" cloneof="atc">
- <description>ATC (Fra, Alt 2)</description>
+ <description>ATC (France, Alt 2)</description>
<year>1990</year>
<publisher>Amstrad Cent Pour Cent</publisher>
<info name="usage" value="Launch with RUN&quot;ATC" />
@@ -287408,7 +287408,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying ATC (F) (1989) (PD).dsk... --> <!-- GoodCPC -->
<software name="atc3" cloneof="atc">
- <description>ATC (Fra, Alt 3)</description>
+ <description>ATC (France, Alt 3)</description>
<year>1990</year>
<publisher>Amstrad Cent Pour Cent</publisher>
<info name="usage" value="Launch with RUN&quot;ATC" />
@@ -287421,7 +287421,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Awari (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="awari1" cloneof="awari">
- <description>Awari (Fra, CPC, Alt)</description>
+ <description>Awari (France, CPC, Alt)</description>
<year>1985</year>
<publisher>CPC</publisher>
<info name="usage" value="Launch with RUN&quot;AWARI" />
@@ -287488,7 +287488,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Boulder Crash (19xx)(-).dsk... --> <!-- Mostly GoodCPC -->
<software name="bcrash1" cloneof="bcrash">
- <description>Boulder Crash (Fra, Alt)</description>
+ <description>Boulder Crash (France, Alt)</description>
<year>1987</year>
<publisher>Amstar</publisher>
<info name="usage" value="Launch with RUN&quot;BOULDER" />
@@ -287501,7 +287501,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Boulder_Crash (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="bcrash2" cloneof="bcrash">
- <description>Boulder Crash (Fra, Alt 2)</description>
+ <description>Boulder Crash (France, Alt 2)</description>
<year>1987</year>
<publisher>Amstar</publisher>
<info name="usage" value="Launch with RUN&quot;BOULDER" />
@@ -287514,7 +287514,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Amsbric__FRENCH (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="cassbriq1" cloneof="cassbriq">
- <description>Casse-Briques (Fra, Alt)</description>
+ <description>Casse-Briques (France, Alt)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="alt_title" value="Amsbric" />
@@ -287528,7 +287528,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying AmsBrique [RUN''DISC''] (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="cassbriq2" cloneof="cassbriq">
- <description>Casse-Briques (Fra, Alt 2)</description>
+ <description>Casse-Briques (France, Alt 2)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="alt_title" value="Amsbric" />
@@ -287542,7 +287542,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Ams_Brique (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="cassbriq3" cloneof="cassbriq">
- <description>Casse-Briques (Fra, Alt 3)</description>
+ <description>Casse-Briques (France, Alt 3)</description>
<year>1985</year>
<publisher>Hebdogiciel</publisher>
<info name="alt_title" value="Amsbric" />
@@ -287556,7 +287556,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying 3_Oeufs (nongoodcpc).dsk... --> <!-- NonGoodCPC -->
<software name="3oeufsa" cloneof="3oeufs">
- <description>Trois Oeufs (Fra, Alt)</description>
+ <description>Trois Oeufs (France, Alt)</description>
<year>1991</year>
<publisher>CPC Infos</publisher>
<part name="flop1" interface="floppy_3">
@@ -287568,7 +287568,7 @@ Shortnames are chosen to "preview" the content:
<!-- Identifying Trois OEUFS (F) (19xx).dsk... --> <!-- GoodCPC -->
<software name="3oeufsb" cloneof="3oeufs">
- <description>Trois Oeufs (Fra, Alt 2)</description>
+ <description>Trois Oeufs (France, Alt 2)</description>
<year>1991</year>
<publisher>CPC Infos</publisher>
<part name="flop1" interface="floppy_3">
@@ -287594,6 +287594,4 @@ Shortnames are chosen to "preview" the content:
</part>
</software>
-
-
</softwarelist>
diff --git a/hash/crvision.xml b/hash/crvision.xml
index 2ee50c1bfbc..0f5e2dac25a 100644
--- a/hash/crvision.xml
+++ b/hash/crvision.xml
@@ -10,7 +10,7 @@ A couple of comments about the 6k/8k images:
1x8k eprom, 2x4k eproms or 1x2k + 1x4k eproms. In the 1x8k case, the console
actually accesses only the first 2k and the final 4k.
Carts were found where the remaining part is empty, and carts were found where the
-lower 2k are repeated (see the Alt dumps below), but the dumps are basically the
+lower 2k are repeated (see the alt dumps below), but the dumps are basically the
same and a Creativision would not see the difference between them.
Notes from Luca:
@@ -20,11 +20,11 @@ manufacturers producing the carts). same argument applies to the EPROM specific
(by Toshiba, Hitachi or General Instruments) and production date. As a result these
info are mostly confusing when not misleading and it's probably safer not to list them
based on a specific model
-2. Concerning the usage of "Alt ROM config" in some games below: there exist at least
+2. Concerning the usage of "alt ROM config" in some games below: there exist at least
4 different PCB types for Creativision carts and *each* of them can have 1, 2 or 3 ROM
chips. The choice of PCB for each game and the presence of ROMs split into different sizes
follows no pattern and was probably based only on the chip availability at manufacturing
-time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
+time! Hence, this is not a situation of usage of "alt PCB" for these carts.
Dick Smith catalog numbers, taken from advertisements:
@@ -96,7 +96,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="astropina" cloneof="astropin">
- <description>Astro Pinball (Alt ROM config)</description>
+ <description>Astro Pinball (alt ROM config)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8014" />
@@ -114,7 +114,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
This image came from FunnyMu < 0.43, and it might be
a bad dump (astropin has been confirmed good) -->
<software name="astropinb" cloneof="astropin">
- <description>Astro Pinball (Bad?)</description>
+ <description>Astro Pinball (bad?)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8014" />
@@ -142,7 +142,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="autochasa" cloneof="autochas">
- <description>Auto Chase (Alt ROM config)</description>
+ <description>Auto Chase (alt ROM config)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8006" />
@@ -158,7 +158,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
<!-- Reminder: Basic got found both in PCB with 2 chips (4k+8k) and in PCB with 3 chips (4k+4k+4k)... split accordingly! -->
<software name="basico2">
- <description>Creativision Basic (1982, Release 2)</description>
+ <description>Creativision Basic (1982, release 2)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
@@ -174,7 +174,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="basico3">
- <description>Creativision Basic (1982, Release 1)</description>
+ <description>Creativision Basic (1982, release 1)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
@@ -190,7 +190,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="basico1">
- <description>Creativision Basic (1983, Release 1)</description>
+ <description>Creativision Basic (1983, release 1)</description>
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
@@ -205,7 +205,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="basic">
- <description>Basic V.1 (1983, Release 2)</description>
+ <description>Basic V.1 (1983, release 2)</description>
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
@@ -265,7 +265,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="deepsea">
- <description>Deep Sea Adventure (6k Cart)</description>
+ <description>Deep Sea Adventure (6K cartridge)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8013" />
@@ -280,7 +280,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="deepseaa" cloneof="deepsea">
- <description>Deep Sea Adventure (8k Cart)</description>
+ <description>Deep Sea Adventure (8K cartridge)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8013" />
@@ -294,7 +294,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="locomot">
- <description>Locomotive (10k cart)</description>
+ <description>Locomotive (10K cartridge)</description>
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8020" />
@@ -309,7 +309,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="locomota" cloneof="locomot">
- <description>Locomotive (12k cart)</description>
+ <description>Locomotive (12K cartridge)</description>
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8020" />
@@ -338,7 +338,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="mousepuza" cloneof="mousepuz">
- <description>Mouse Puzzle (Alt ROM config)</description>
+ <description>Mouse Puzzle (alt ROM config)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8015" />
@@ -368,7 +368,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="planetd">
- <description>Planet Defender (6k Cart)</description>
+ <description>Planet Defender (6K cartridge)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8005" />
@@ -383,7 +383,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="planetd1" cloneof="planetd">
- <description>Planet Defender (8k Cart)</description>
+ <description>Planet Defender (8K cartridge)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8005" />
@@ -397,7 +397,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="planetd2" cloneof="planetd">
- <description>Planet Defender (8k Cart, Bad?)</description>
+ <description>Planet Defender (8K cartridge, bad?)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="usage" value="Press F10 then R" />
@@ -424,7 +424,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="policeja" cloneof="policej">
- <description>Police Jump (Alt ROM config)</description>
+ <description>Police Jump (alt ROM config)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8009" />
@@ -439,7 +439,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="policeje" cloneof="policej">
- <description>Police Jump (Earlier)</description>
+ <description>Police Jump (earlier)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8009" />
@@ -497,7 +497,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tankatk">
- <description>Tank Attack (6k Cart)</description>
+ <description>Tank Attack (6K cartridge)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8002" />
@@ -512,7 +512,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tankatka" cloneof="tankatk">
- <description>Tank Attack (8k Cart)</description>
+ <description>Tank Attack (8K cartridge)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8002" />
@@ -526,7 +526,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tennis">
- <description>Tennis (Wimbledon, 6k Cart)</description>
+ <description>Tennis (Wimbledon, 6K cartridge)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
@@ -542,7 +542,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
<!-- Reminder: Tennis 8k got found both in PCB with 2 chips (4k+4k) and in PCB with 1 chip (8k)... split accordingly! -->
<software name="tennisa" cloneof="tennis">
- <description>Tennis (Wimbledon, 8k Cart)</description>
+ <description>Tennis (Wimbledon, 8K cartridge)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
@@ -556,7 +556,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tennisb" cloneof="tennis">
- <description>Tennis (Wimbledon, 8k Cart, Alt ROM config)</description>
+ <description>Tennis (Wimbledon, 8K cartridge, alt ROM config)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
@@ -571,7 +571,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tenniscs" cloneof="tennis">
- <description>Tennis (Coca Cola / Sprite, 8k cart)</description>
+ <description>Tennis (Coca Cola / Sprite, 8K cartridge)</description>
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
@@ -585,7 +585,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tennisd1" cloneof="tennis">
- <description>Tennis (Dick Smith, earlier, 6k Cart)</description>
+ <description>Tennis (Dick Smith, earlier, 6K cartridge)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="Y-1620" />
@@ -600,7 +600,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="tennisd2" cloneof="tennis">
- <description>Tennis (Dick Smith, later, 6k Cart)</description>
+ <description>Tennis (Dick Smith, later, 6K cartridge)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="Y-1620" />
@@ -616,7 +616,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
<!-- Reminder: Tennis 8k got found both in PCB with 2 chips (4k+4k) and in PCB with 1 chip (8k)... split accordingly! -->
<software name="tennisd2a" cloneof="tennis">
- <description>Tennis (Dick Smith, 8k Cart)</description>
+ <description>Tennis (Dick Smith, 8K cartridge)</description>
<year>1982</year>
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="Y-1620" />
@@ -646,7 +646,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
<!-- These contain the same data as chopper, but in a different order (which is not handled properly by emulators). I'm listing these here to document checksums.
<software name="chopper2" cloneof="chopper">
- <description>Chopper Rescue (Alt 2)</description>
+ <description>Chopper Rescue (alt 2)</description>
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<part name="cart" interface="crvision_cart">
@@ -658,7 +658,7 @@ NOTE that all our versions of astropin have a corruption of the right flipper th
</software>
<software name="chopper1" cloneof="chopper">
- <description>Chopper Rescue (Alt)</description>
+ <description>Chopper Rescue (alt)</description>
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<part name="cart" interface="crvision_cart">
diff --git a/hash/database.xml b/hash/database.xml
index c48628672a9..423688d260d 100644
--- a/hash/database.xml
+++ b/hash/database.xml
@@ -254,7 +254,7 @@ license:CC0-1.0
</part>
</software>
- <software name="leapfrog" supported ="no"> <!-- major video timing glitches -->
+ <software name="leapfrog" supported="no"> <!-- major video timing glitches -->
<description>Leapfrog</description>
<year>1982</year>
<publisher>Voltmace</publisher>
diff --git a/hash/dc.xml b/hash/dc.xml
index 204d31ffaa1..12e5f3eb73a 100644
--- a/hash/dc.xml
+++ b/hash/dc.xml
@@ -260,7 +260,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast SDK for Sega Library Ver. 1.20J (Japan)</description>
<year>199?</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast sdk for sega library ver. 1.20j (jpn)" status="nodump"/>
</diskarea>
@@ -273,7 +273,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast SDK for Sega Library Ver. 1.30J (Japan)</description>
<year>1999</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast sdk for sega library ver. 1.30j (jpn)" status="nodump"/>
</diskarea>
@@ -286,7 +286,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast SDK (Sega Library) Ver. 1.42J for Dev. Box (Japan)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast sdk (sega library) ver. 1.42j for dev. box (jpn)" status="nodump"/>
</diskarea>
@@ -299,19 +299,19 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast SDK (Sega Library) Ver. 1.55J for Dev. Box (Japan)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<feature name="part_id" value="Disc 1"/>
<diskarea name="cdrom">
<disk name="dreamcast sdk (sega library) ver. 1.55j for dev. box (jpn) (disc 1)" status="nodump"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<feature name="part_id" value="Disc 2"/>
<diskarea name="cdrom">
<disk name="dreamcast sdk (sega library) ver. 1.55j for dev. box (jpn) (disc 2)" status="nodump"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<feature name="part_id" value="Disc 3"/>
<diskarea name="cdrom">
<disk name="dreamcast sdk (sega library) ver. 1.55j for dev. box (jpn) (disc 3)" status="nodump"/>
@@ -325,7 +325,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast SDK (Sega Library) Ver. 2.00J for Dev. Box (Japan)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast sdk (sega library) ver. 2.00j for dev. box (jpn)" status="nodump"/>
</diskarea>
@@ -338,7 +338,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast Software Development Kit: Release 8.1 (USA, Europe)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast software development kit release 8.1 (usa, euro)" status="nodump"/>
</diskarea>
@@ -351,13 +351,13 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast Software Development Kit: Release 9 Europe (USA, Europe)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<feature name="part_id" value="Vol. 1"/>
<diskarea name="cdrom">
<disk name="dreamcast software development kit release 9 europe (usa, euro) (vol. 1)" status="nodump"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<feature name="part_id" value="Vol. 2"/>
<diskarea name="cdrom">
<disk name="dreamcast software development kit release 9 europe (usa, euro) (vol. 2)" status="nodump"/>
@@ -371,7 +371,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast Software Development Kit: Release 10.1 (USA, Europe)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast software development kit release 10.1 (usa, euro)" status="nodump"/>
</diskarea>
@@ -384,7 +384,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<description>Dreamcast Software Development Kit: Release 11a (USA, Europe)</description>
<year>????</year>
<publisher>Sega</publisher>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast software development kit release 11a (usa, euro)" status="nodump"/>
</diskarea>
@@ -398,7 +398,7 @@ P830-****-** : Appears to be a Sega part number for promo discs.
<year>2000</year>
<publisher>Sega</publisher>
<info name="release" value="20000414"/>
- <part interface="dc_cdrom" name="cdrom">
+ <part interface="cdrom" name="cdrom">
<diskarea name="cdrom">
<disk name="dreamcast modem sdk ver. 1.00 (world)" status="nodump"/>
</diskarea>
@@ -1156,7 +1156,7 @@ Punts to BIOS at start of loading [GDROM READY], locks up (fixed)
<disk name="after... wasureenu kizuna (jpn)" sha1="4ca05216dd45b9a5218186e7c2c0b5cd0be76d13"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Kaze no Form"/> <!-- 風のフォルム -->
<diskarea name="cdrom">
<disk name="after... wasureenu kizuna - shokai genteiban (jpn) (kaze no form)" sha1="9cb6682fca57e78679c215baeae00d8205465fb4"/>
@@ -1297,7 +1297,7 @@ Punts to BIOS at start of loading [GDROM READY] (fixed)
</part>
</software>
- <!-- Redump shows us that this Alt simply is a disc with a different write offset than "airforcd". -->
+ <!-- Redump shows us that this alt simply is a disc with a different write offset than "airforcd". -->
<software name="airforcd1" cloneof="airforcd" supported="no">
<!--
<rom name="Airforce Delta v1.000 (1999)(Konami)(NTSC)(US)[!][2S T-9501NAF].gdi" size="946" md5="5807915c07432be55a653540267d302e" sha1="7672f6cd3fac974ef8a2acca42327257780eb0a8"/>
@@ -2207,7 +2207,7 @@ Optional [BBA] support
<!--
<software name="aggonsent1" cloneof="aggonsenbb" supported="no">
- <description>Atsumare! Guru Guru Onsen - Taikenban (Japan, Alt)</description>
+ <description>Atsumare! Guru Guru Onsen - Taikenban (Japan, alt)</description>
<year>1999</year>
<publisher>Sega</publisher>
<info name="serial" value="610-7187"/>
@@ -3151,7 +3151,7 @@ Black screen [GDROM READY] (fixed)
<disk name="blue-sky-blue[s] sora o mau tsubasa (jpn)" sha1="1b6db61f78b11afc250aac17f5ad4cfa651c9e19"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Premium Fan Disc"/> <!-- プレミアムファンデイスク -->
<diskarea name="cdrom">
<disk name="blue-sky-blue[s] sora o mau tsubasa - shokai genteiban (jpn) (premium fan disc)" sha1="9fc87706b7fc652cba2a6c58e709c7cacc3da03f"/>
@@ -4163,7 +4163,7 @@ Punts to BIOS at start of loading [GDROM READY] (fixed)
<disk name="card of destiny hikari to yami no tougousha - genteiban (jpn)" sha1="79a8dccf13f16beaa3b6293672c08d90d0c5f64e"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Special Talk CD"/>
<diskarea name="cdrom">
<disk name="card of destiny hikari to yami no tougousha - genteiban (jpn) (special talk cd)" sha1="c8dba781762c063d543370a2797c5c4a3a933742"/>
@@ -6084,7 +6084,7 @@ Hangs at "Produced by Sega", [GDROM READY] keeps reading LBA=$afbe with REQ_ERRO
Black screen [GDROM READY] (fixed)
No [PVR] renders/black screen on FMV and title screen (sound plays, setup [fb_r_ctrl] [fb_w_ctrl] [fb_w_linestride] to 0)
]]></notes>
- <info name="serial" value="T-46502M, T-46552M (Alt. Audio CD)"/>
+ <info name="serial" value="T-46502M, T-46552M (alt. Audio CD)"/>
<info name="release" value="20011025"/>
<info name="alt_title" value="ディヴァイン ラヴ 初回限定版"/>
<info name="ring_code" value="T-46501M-0772 1MM1 C 19 (Game), T-46502M 1MM1 C 19 (Audio CD)"/>
@@ -6094,7 +6094,7 @@ No [PVR] renders/black screen on FMV and title screen (sound plays, setup [fb_r_
<disk name="d+vine [luv] - shokai genteiban (jpn)" sha1="a55d24f09e8d191a8671fd1fcb63fc2e5c1ceb9c"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Opening Themesong CD"/>
<diskarea name="cdrom">
<disk name="d+vine [luv] - shokai genteiban (jpn) (opening themesong cd)" sha1="5b86e1e4a3f786c0d4e2b479ba819d05a72373db"/>
@@ -7583,7 +7583,7 @@ Built on Windows CE, requires [MMU] support
<disk name="di gi charat fantasy (jpn)" sha1="20c245d693f0d4701be99d71ea164d0cf0468539"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Soundtrack Arrangement CD"/>
<diskarea name="cdrom">
<disk name="di gi charat fantasy - shokai genteiban (jpn) (soundtrack arrangement cd)" sha1="566cd0a7b3817f346a01bd6a6da6e2df62c59339"/>
@@ -10786,7 +10786,7 @@ Software for [modem], throws an error requiring a Dream Passport
<!-- Bundled together with Dreamcast consoles. -->
<!--
<software name="dreamkey2a" cloneof="dreamkey3" supported="no">
- <description>DreamKey Version 2.0 (Fra, Ger, Spa, UK)</description>
+ <description>DreamKey Version 2.0 (France, Germany, Spain, UK)</description>
<year>2000</year>
<publisher>Sega</publisher>
<info name="serial" value="832-0053-50"/>
@@ -11179,7 +11179,7 @@ Software for [modem], throws an error requiring a Dream Passport
<!--
<software name="dyndeka2t1" cloneof="dynamcop" supported="no">
- <description>Dynamite Deka 2 - Taikenban (Japan, Alt)</description>
+ <description>Dynamite Deka 2 - Taikenban (Japan, alt)</description>
<year>1999</year>
<publisher>Sega</publisher>
<info name="serial" value="610-7150"/>
@@ -12215,7 +12215,7 @@ Punts to BIOS at start of loading [GDROM READY] (fixed)
<!-- It is unknown what (if any) difference this has to the T-46605D-80 release. -->
<!--
<software name="eviltwin1" cloneof="eviltwin" supported="no">
- <description>Evil Twin: Cyprien's Chronicles (Euro, Alt)</description>
+ <description>Evil Twin: Cyprien's Chronicles (Euro, alt)</description>
<year>2002</year>
<publisher>Bigben Interactive</publisher>
<info name="serial" value="T-46605D-71"/>
@@ -13281,7 +13281,7 @@ Hangs on SNK logo
<!--
<software name="fforce2fd" cloneof="fforce2" supported="no">
- <description>Fighting Force 2 (Fra, Ned)</description>
+ <description>Fighting Force 2 (France, Netherlands)</description>
<year>1999</year>
<publisher>Eidos Interactive</publisher>
<info name="serial" value="T-36802D-59"/>
@@ -15408,7 +15408,7 @@ Punts to BIOS at start of loading [GDROM READY] (fixed)
<disk name="grandia ii (usa)" sha1="5a1a449de242d31bf47931096ebe7ce5412d0215"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Music Selections"/>
<diskarea name="cdrom">
<disk name="grandia ii (usa) (music selections)" sha1="36b8d4c10044de33e05343cb1a68c4b28c13ee33"/>
@@ -15493,7 +15493,7 @@ Punts to BIOS at start of loading [GDROM READY] (fixed)
<disk name="grandia ii (jpn)" sha1="6e927eb2fcd840edc12d77b7916139122c54fd13"/>
</diskarea>
</part>
- <part interface="dc_cdrom" name="cdrom2">
+ <part interface="cdrom" name="cdrom2">
<feature name="part_id" value="Melodia"/>
<diskarea name="cdrom">
<disk name="grandia ii (jpn) (melodia)" sha1="8f59f6369f6efcc175f16044e9145bd2867c3ac1"/>
@@ -20689,7 +20689,7 @@ Built on Windows CE, requires [MMU] support
<!--
<software name="webtvssl1" cloneof="webtv" supported="no">
- <description>Microsoft WebTV Setsuzoku Kit - 128bit SSL Taiouban (Japan, Alt)</description>
+ <description>Microsoft WebTV Setsuzoku Kit - 128bit SSL Taiouban (Japan, alt)</description>
<year>1999</year>
<publisher>WebTV Networks</publisher>
<info name="serial" value="610-7391"/>
diff --git a/hash/dmv.xml b/hash/dmv.xml
index 87a9c3d6fd7..d1e4f017110 100644
--- a/hash/dmv.xml
+++ b/hash/dmv.xml
@@ -17,7 +17,7 @@ license:CC0-1.0
</software>
<software name="cpm80a" cloneof="cpm80"> <!-- CP/M-80 -->
- <description>CP/M 2.2 (Alt 1)</description>
+ <description>CP/M 2.2 (alt 1)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -28,7 +28,7 @@ license:CC0-1.0
</software>
<software name="cpm80b" cloneof="cpm80"> <!-- CP/M-80 -->
- <description>CP/M 2.2 (Alt 2)</description>
+ <description>CP/M 2.2 (alt 2)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -39,7 +39,7 @@ license:CC0-1.0
</software>
<software name="cpm80c" cloneof="cpm80"> <!-- CP/M-80 -->
- <description>CP/M 2.2 (Alt 3)</description>
+ <description>CP/M 2.2 (alt 3)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -50,7 +50,7 @@ license:CC0-1.0
</software>
<software name="cpm80d" cloneof="cpm80"> <!-- CP/M-80 -->
- <description>CP/M 2.2 (Alt 4)</description>
+ <description>CP/M 2.2 (alt 4)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -61,7 +61,7 @@ license:CC0-1.0
</software>
<software name="cpm80e" cloneof="cpm80"> <!-- CP/M-80 -->
- <description>CP/M 2.2 (Alt 5)</description>
+ <description>CP/M 2.2 (alt 5)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -83,7 +83,7 @@ license:CC0-1.0
</software>
<software name="cpm80sua" cloneof="cpm80su"> <!-- CP/M-80 -->
- <description>CP/M 2.2 Supplement (Alt 1)</description>
+ <description>CP/M 2.2 Supplement (alt 1)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -94,7 +94,7 @@ license:CC0-1.0
</software>
<software name="cpm80sub" cloneof="cpm80su"> <!-- CP/M-80 -->
- <description>CP/M 2.2 Supplement (Alt 2)</description>
+ <description>CP/M 2.2 Supplement (alt 2)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -105,7 +105,7 @@ license:CC0-1.0
</software>
<software name="cpm80suc" cloneof="cpm80su" supported="no"> <!-- CP/M-80 -->
- <description>CP/M 2.2 Supplement (Alt 3)</description>
+ <description>CP/M 2.2 Supplement (alt 3)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -127,7 +127,7 @@ license:CC0-1.0
</software>
<software name="cpm86a" cloneof="cpm86"> <!-- CP/M-86 -->
- <description>CP/M-86 1.1 (Alt 1)</description>
+ <description>CP/M-86 1.1 (alt 1)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -138,7 +138,7 @@ license:CC0-1.0
</software>
<software name="cpm86b" cloneof="cpm86"> <!-- CP/M-86 -->
- <description>CP/M-86 1.1 (Alt 2)</description>
+ <description>CP/M-86 1.1 (alt 2)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -149,7 +149,7 @@ license:CC0-1.0
</software>
<software name="cpm86c" cloneof="cpm86"> <!-- CP/M-86 -->
- <description>CP/M-86 1.1 (Alt 3)</description>
+ <description>CP/M-86 1.1 (alt 3)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -160,7 +160,7 @@ license:CC0-1.0
</software>
<software name="cpm86d" cloneof="cpm86"> <!-- CP/M-86 -->
- <description>CP/M-86 1.1 (Alt 4)</description>
+ <description>CP/M-86 1.1 (alt 4)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -171,7 +171,7 @@ license:CC0-1.0
</software>
<software name="cpm86e" cloneof="cpm86"> <!-- CP/M-86 -->
- <description>CP/M-86 1.1 (Alt 5)</description>
+ <description>CP/M-86 1.1 (alt 5)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -182,7 +182,7 @@ license:CC0-1.0
</software>
<software name="cpm86f" cloneof="cpm86"> <!-- CP/M-86 -->
- <description>CP/M-86 1.1 (Alt 6)</description>
+ <description>CP/M-86 1.1 (alt 6)</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
<part name="flop" interface="floppy_5_25">
@@ -205,7 +205,7 @@ license:CC0-1.0
</software>
<software name="cpm68ka" cloneof="cpm68k"> <!-- CP/M-68k -->
- <description>CP/M-68k (Alt)</description>
+ <description>CP/M-68k (alt)</description>
<year>198?</year>
<publisher>NCR Corporation</publisher>
<info name="usage" value="Requires K234" />
@@ -243,7 +243,7 @@ license:CC0-1.0
</software>
<software name="psysa" cloneof="psys"> <!-- p-System -->
- <description>UCSD p-System IV.13 (Alt)</description>
+ <description>UCSD p-System IV.13 (alt)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires K200, K202 or K208" />
@@ -337,7 +337,7 @@ license:CC0-1.0
<description>OPEN ACCESS</description>
<year>1984</year>
<publisher>Software Products International</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="298418">
<rom name="5_oa1.td0" size="298418" crc="e7a75f55" sha1="7800962bb767c90893b5808dc9c0b81e6b3d1740"/>
@@ -409,7 +409,7 @@ license:CC0-1.0
<description>BASIC-86 v5.28 (DOS)</description>
<year>1983</year>
<publisher>Microsoft</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_basic86_compiler.ima" size="368640" crc="fdabeada" sha1="15eee3e4453a78382fd84ef49ffde871f113eb85"/>
@@ -454,7 +454,7 @@ license:CC0-1.0
<description>DMV IEEE-448 Inteface Diagnostic</description>
<year>198?</year>
<publisher>NCR Corporation</publisher>
- <info name="usage" value="Requires CP/M-80" />
+ <info name="required_os" value="CP/M-80" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="181066">
<rom name="diagi488.td0" size="181066" crc="cac53b40" sha1="6ee0dcab9b044f4aefa661294b47f86ca4860cb8"/>
@@ -515,7 +515,7 @@ license:CC0-1.0
<description>NCR PC2PC Network Requester v1.01.00</description>
<year>1985</year>
<publisher>NCR Corporation</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_pc2pc_requester_1.01_sn000541.ima" size="368640" crc="2315c8e7" sha1="a7f7565a096a24d3ea11d17fd96659a9ca549554"/>
@@ -524,10 +524,10 @@ license:CC0-1.0
</software>
<software name="pc2pca" cloneof="pc2pc"> <!-- MS-DOS -->
- <description>NCR PC2PC Network Requester v1.01.00 (Alt)</description>
+ <description>NCR PC2PC Network Requester v1.01.00 (alt)</description>
<year>1985</year>
<publisher>NCR Corporation</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_pc2pc_requester_1.01_sn000542.ima" size="368640" crc="67f02514" sha1="08c241be76b724e5d8ff834015e8dbe77d01ed75"/>
@@ -539,7 +539,7 @@ license:CC0-1.0
<description>StarBurst v1.01</description>
<year>198?</year>
<publisher>MicroPro International</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_starburst.ima" size="368640" crc="479117aa" sha1="9bdb9d80d3103808f278e145d7a414155d1a642b"/>
@@ -551,7 +551,7 @@ license:CC0-1.0
<description>NCR 7900 Terminal Emulators (DOS)</description>
<year>1984</year>
<publisher>NCR Corporation</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_7900_terminal_emulator.ima" size="368640" crc="0c862436" sha1="e32074e3ee7fbab84caf878daa70aa46743da72c"/>
@@ -574,7 +574,7 @@ license:CC0-1.0
<description>C Compiler V1.2.3</description>
<year>1983</year>
<publisher>SuperSoft</publisher>
- <info name="usage" value="Requires CP/M-80" />
+ <info name="required_os" value="CP/M-80" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="243115">
<rom name="dmv_c_compiler_disk1.cqi" size="243115" crc="14744291" sha1="d82776ad7873ad81b894db0b97fa8cabad0d88f0"/>
@@ -617,7 +617,7 @@ license:CC0-1.0
<description>RM/COBOL Compiler v1.5E</description>
<year>1983</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_rm-cobol_1.5_sn00276.ima" size="368640" crc="52e82acb" sha1="45c41cb80938bf51d5577e35ee847478e8574938"/>
@@ -629,7 +629,7 @@ license:CC0-1.0
<description>Supersort v1.62</description>
<year>1983</year>
<publisher>MicroPro International</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_supersort_1.62_msbbkcmr.ima" size="368640" crc="0f349862" sha1="eb1146e8fa107942e0d08261c625763534f5d7ed"/>
@@ -641,7 +641,7 @@ license:CC0-1.0
<description>T.I.M. III v3.31</description>
<year>1983</year>
<publisher>Innovative Software, Inc.</publisher>
- <info name="usage" value="Requires CP/M-80" />
+ <info name="required_os" value="CP/M-80" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="191356">
<rom name="dmv_tim_iii_disk1.cqi" size="191356" crc="ac4d79ef" sha1="b462eeb984d74a582af829230d583d12eb2abf5f"/>
@@ -663,7 +663,7 @@ license:CC0-1.0
<description>Microsoft FORTRAN 77 v3.13</description>
<year>1983</year>
<publisher>Microsoft</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_ms-fortran_disk1.ima" size="368640" crc="59695cc3" sha1="b587bf8786a198b69e6a3b71045686a9e21b8b35"/>
@@ -700,7 +700,7 @@ license:CC0-1.0
<description>SuperCalc V1.12</description>
<year>1983</year>
<publisher>SORCIM CORP.</publisher>
- <info name="usage" value="Requires CP/M-80" />
+ <info name="required_os" value="CP/M-80" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="82682">
<rom name="dmv_supercalc.cqi" size="82682" crc="c7f937a3" sha1="aa8ebbf6a9df3e4a080b477f7ee9dd429e367a87"/>
@@ -723,7 +723,7 @@ license:CC0-1.0
<description>WordStar V3.0</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires CP/M-80" />
+ <info name="required_os" value="CP/M-80" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="133164">
<rom name="dmv_wordstar.cqi" size="133164" crc="b10b60f8" sha1="d69b2a319a45b3c0d7448dcc9a533ae48935b20f"/>
@@ -735,7 +735,7 @@ license:CC0-1.0
<description>WordStar V3.30</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_wordstar.ima" size="368640" crc="db5b21de" sha1="a48be861068c0dbcf9ddfbd87fccdb0b131af340"/>
@@ -744,10 +744,10 @@ license:CC0-1.0
</software>
<software name="ws330a" cloneof="ws330"> <!-- MS-DOS -->
- <description>WordStar V3.30 (Alt)</description>
+ <description>WordStar V3.30 (alt)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_wordstar_another.ima" size="368640" crc="ff36914f" sha1="a23b8a92e2a70defc5661ff8b0aa180b79b453ce"/>
@@ -756,10 +756,10 @@ license:CC0-1.0
</software>
<software name="ws330b" cloneof="ws330"> <!-- MS-DOS -->
- <description>WordStar V3.30 (Alt 2)</description>
+ <description>WordStar V3.30 (alt 2)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_wordstar_install.ima" size="368640" crc="580593bd" sha1="5a0e73b774bb711cbf6a0346bb094d0c9e72c76c"/>
@@ -782,7 +782,7 @@ license:CC0-1.0
<description>WordStar V3.40</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="301730">
<rom name="5ws340.td0" size="301730" crc="995d40bd" sha1="86dc7659e3e63c7cdd8d687c77ce2d788cb8d6c4"/>
@@ -806,7 +806,7 @@ license:CC0-1.0
<description>Mailmerge</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires CP/M-86" />
+ <info name="required_os" value="CP/M-86" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="7495">
<rom name="dmv_mailmerge.cqi" size="7495" crc="0bd0d452" sha1="98927cd6bce5ab71fcdcc2abb97a602ab4612247"/>
@@ -819,7 +819,7 @@ license:CC0-1.0
<description>SpellStar</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires CP/M-86" />
+ <info name="required_os" value="CP/M-86" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="123130">
<rom name="dmv_spellstar.cqi" size="123130" crc="57dab5b1" sha1="75ee6b7457c1165287c39eb0075993dc1ed441ac"/>
@@ -858,7 +858,7 @@ license:CC0-1.0
<description>MS-Pascal Compiler</description>
<year>198?</year>
<publisher>Microsoft</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_ms-pascal_disk1.ima" size="368640" crc="db53e64b" sha1="6d335b5a5bfdf548843c5198452e1037cb8b7d0d"/>
@@ -890,7 +890,7 @@ license:CC0-1.0
<description>Microsoft BASIC Compiler v5.50</description>
<year>1983</year>
<publisher>Microsoft</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_gw-basic_compiler.ima" size="368640" crc="dfd68a97" sha1="36d21dd4038b76514e6e172d82b8410d6364cc78"/>
@@ -932,7 +932,7 @@ license:CC0-1.0
</software>
<software name="drgrapha" cloneof="drgraph"> <!-- CP/M-80 -->
- <description>DR Graph (Alt)</description>
+ <description>DR Graph (alt)</description>
<year>1983</year>
<publisher>Digital Research</publisher>
<part name="flop" interface="floppy_5_25">
@@ -958,7 +958,7 @@ license:CC0-1.0
<description>DR Draw (Monochrome)</description>
<year>1983</year>
<publisher>Digital Research</publisher>
- <info name="usage" value="Requires CP/M-86" />
+ <info name="required_os" value="CP/M-86" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="189140">
<rom name="86drmo-m.td0" size="189140" crc="61543ccf" sha1="b8e33a0076bd1568a40d403bb6b391e6c45f9569"/>
@@ -1036,7 +1036,7 @@ license:CC0-1.0
<description>dBASE II v2.40</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_dbase_ii.ima" size="368640" crc="1ecc1219" sha1="e80f1e2688dcab71d9f64a7672ad2ae1a9c9ec81"/>
@@ -1059,7 +1059,7 @@ license:CC0-1.0
<description>DataStar v1.42</description>
<year>1983</year>
<publisher>MicroPro International</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_datastar_install.ima" size="368640" crc="eeb57cc3" sha1="03a456e7e5e395a9cc23dc37f1ad749f288fcb91"/>
@@ -1071,7 +1071,7 @@ license:CC0-1.0
<description>ReportStar v1.03</description>
<year>1983</year>
<publisher>MicroPro International</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_reportstar_install.ima" size="368640" crc="52466f8e" sha1="f96cd87ec0b91d129c754ef9f1d83c3d8e1d9f6a"/>
@@ -1083,7 +1083,7 @@ license:CC0-1.0
<description>DataStar v1.42 + ReportStar v1.03</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="368640">
<rom name="dmv_datastar_reportstar.ima" size="368640" crc="c93f5a97" sha1="cce9cec9e8a874f1009aded5bc4b90cb0507a285"/>
@@ -1106,7 +1106,7 @@ license:CC0-1.0
<description>EXCHANGE DOS</description>
<year>1983</year>
<publisher>NCR Corporation</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="64327">
<rom name="dmv_cpm_ms-dos_xfer_ms-dos.td0" size="64327" crc="843487fc" sha1="7c8484c732188b12d42c0b208762688b86cfea80"/>
@@ -1132,7 +1132,7 @@ license:CC0-1.0
</software>
<software name="acada" cloneof="acad"> <!-- MS-DOS -->
- <description>AutoCAD (Alt 1)</description>
+ <description>AutoCAD (alt 1)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires K208" />
@@ -1159,7 +1159,7 @@ license:CC0-1.0
</software>
<software name="acadb" cloneof="acad"> <!-- MS-DOS -->
- <description>AutoCAD (Alt 2)</description>
+ <description>AutoCAD (alt 2)</description>
<year>1987</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires K208" />
@@ -1220,7 +1220,7 @@ license:CC0-1.0
</software>
<software name="cpmutila"> <!-- CP/M-80 -->
- <description>CP/M Utilities (Alt)</description>
+ <description>CP/M Utilities (alt)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop" interface="floppy_5_25">
@@ -1242,7 +1242,7 @@ license:CC0-1.0
</software>
<software name="cpmgamesa" cloneof="cpmgames"> <!-- CP/M-80 -->
- <description>CP/M 2.2 Games (Alt)</description>
+ <description>CP/M 2.2 Games (alt)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop" interface="floppy_5_25">
@@ -1298,7 +1298,7 @@ license:CC0-1.0
</software>
<software name="dos211hda" cloneof="dos211hd"> <!-- MS-DOS -->
- <description>MS-DOS v2.11 HD (Alt)</description>
+ <description>MS-DOS v2.11 HD (alt)</description>
<year>198?</year>
<publisher>Microsoft</publisher>
<info name="usage" value="Requires K012 or C3282" />
@@ -1310,7 +1310,7 @@ license:CC0-1.0
</software>
<software name="dos211hdb" cloneof="dos211hd"> <!-- MS-DOS -->
- <description>MS-DOS v2.11 HD (Alt 2)</description>
+ <description>MS-DOS v2.11 HD (alt 2)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires K012 or C3282" />
@@ -1322,7 +1322,7 @@ license:CC0-1.0
</software>
<software name="dos211hdc" cloneof="dos211hd"> <!-- MS-DOS -->
- <description>MS-DOS v2.11 HD (Alt 3)</description>
+ <description>MS-DOS v2.11 HD (alt 3)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires K012 or C3282" />
@@ -1337,7 +1337,7 @@ license:CC0-1.0
<description>DOS Tools</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="310424">
<rom name="5toolup.td0" size="310424" crc="0d6dd24b" sha1="9af548e2a8f7796051142d571a1ffdfa0b5876fd"/>
@@ -1349,7 +1349,7 @@ license:CC0-1.0
<description>DOS Utilities</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="120724">
<rom name="5dos.td0" size="120724" crc="1b9be00b" sha1="7e836ae19df1c60fdea3c7415e85c83682a4625d"/>
@@ -1361,7 +1361,7 @@ license:CC0-1.0
<description>Norton Utilities v3.00</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="330832">
<rom name="5numasm.td0" size="330832" crc="816b44d6" sha1="4aca217035365e10ff3a571a9fff2714fed24459"/>
@@ -1370,10 +1370,10 @@ license:CC0-1.0
</software>
<software name="nortonuta" cloneof="nortonut"> <!-- MS-DOS -->
- <description>Norton Utilities v3.00 (Alt)</description>
+ <description>Norton Utilities v3.00 (alt)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="360330">
<rom name="5clock.td0" size="360330" crc="754edfaf" sha1="1019de5737c16ea41bd13288f98529750d3fcc0e"/>
@@ -1385,7 +1385,7 @@ license:CC0-1.0
<description>OPEN ACCESS (3 LZH archives)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="366876">
<rom name="5oa.td0" size="366876" crc="9f19d87e" sha1="6fffb96196f027f123f8858cf3093e2efa2c8850"/>
@@ -1397,7 +1397,7 @@ license:CC0-1.0
<description>Print Master (2 LZH archives)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="292654">
<rom name="5pm.td0" size="292654" crc="c088727d" sha1="f18d7a53eaaef55b0ccffa795c41677db7681f8b"/>
@@ -1420,7 +1420,7 @@ license:CC0-1.0
<description>Bradford (LZH archive)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
- <info name="usage" value="Requires MS-DOS" />
+ <info name="required_os" value="MS-DOS" />
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="215116">
<rom name="5noidea.td0" size="215116" crc="9ad1dd63" sha1="d1144b5ddc5f1256ca03428c61abeb035e752a39"/>
diff --git a/hash/dragon_cass.xml b/hash/dragon_cass.xml
index 492c7744cc7..8cf4eb15d24 100644
--- a/hash/dragon_cass.xml
+++ b/hash/dragon_cass.xml
@@ -141,7 +141,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="6809expc" cloneof="6809exp">
- <description>6809 Express [cracked]</description>
+ <description>6809 Express (cracked)</description>
<year>1985</year>
<publisher>Quickbeam</publisher>
<part name="cass1" interface="dragon_cass">
@@ -174,7 +174,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="acontar">
- <description>A Contar (Spa)</description>
+ <description>A Contar (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -513,7 +513,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="astrologys" cloneof="astrology">
- <description>Astrology (Spa)</description>
+ <description>Astrology (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="M30892" />
@@ -719,7 +719,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="banditoa" cloneof="bandito">
- <description>Bandito (Alt)</description>
+ <description>Bandito (alt)</description>
<year>1984</year>
<publisher>Pocket Money Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1015,7 +1015,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="bonkaa" cloneof="bonka">
- <description>Bonka (Alt)</description>
+ <description>Bonka (alt)</description>
<year>1983</year>
<publisher>J.Morrison Micros</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1070,7 +1070,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="brockgdma" cloneof="brockgdm">
- <description>Brocks Kingdom (Alt)</description>
+ <description>Brocks Kingdom (alt)</description>
<year>1984</year>
<publisher>Blaby Computer Games</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1148,7 +1148,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="bumperss" cloneof="bumpers">
- <description>Bumpers (Spa)</description>
+ <description>Bumpers (Spain)</description>
<year>1984</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1203,7 +1203,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="buzzbaitc" cloneof="buzzbait">
- <description>Buzzard Bait [cracked]</description>
+ <description>Buzzard Bait (cracked)</description>
<year>1984</year>
<publisher>Tom Mix Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1581,7 +1581,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="chuckiegga" cloneof="chuckiegg">
- <description>Chuckie Egg (Alt)</description>
+ <description>Chuckie Egg (alt)</description>
<year>1985</year>
<publisher>A&amp;F</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1626,7 +1626,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="circusadvs" cloneof="circusadv">
- <description>Circus Adventure (Spa)</description>
+ <description>Circus Adventure (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1807,7 +1807,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="contabili">
- <description>Contabilidad Personal (Spa)</description>
+ <description>Contabilidad Personal (Spain)</description>
<year>198?</year>
<publisher>IDS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -1917,7 +1917,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="cosmcruisa" cloneof="cosmcruis">
- <description>Cosmic Cruiser (Alt)</description>
+ <description>Cosmic Cruiser (alt)</description>
<year>1984</year>
<publisher>Imagine</publisher>
<part name="cass1" interface="dragon_cass">
@@ -2155,7 +2155,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="cuthcoolra" cloneof="cuthcoolr">
- <description>Cuthbert in the Cooler (Alt)</description>
+ <description>Cuthbert in the Cooler (alt)</description>
<year>1985</year>
<publisher>Microdeal</publisher>
<part name="cass1" interface="dragon_cass">
@@ -2400,7 +2400,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="deathholef" cloneof="deathhole">
- <description>Death's Head Hole [fixed]</description>
+ <description>Death's Head Hole (fixed)</description>
<year>1983</year>
<publisher>Peaksoft</publisher>
<part name="cass1" interface="dragon_cass">
@@ -2598,7 +2598,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="diggem">
- <description>Diggem-Manybody (Spa)</description>
+ <description>Diggem-Manybody (Spain)</description>
<year>198?</year>
<publisher>IDS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -2645,7 +2645,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="dominoesa" cloneof="dominoes">
- <description>Dominoes (Alt)</description>
+ <description>Dominoes (alt)</description>
<year>1983</year>
<publisher>Oasis Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -2984,7 +2984,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsel1s" cloneof="drgnsel1">
- <description>Dragon Selection 1 (Spa)</description>
+ <description>Dragon Selection 1 (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -3007,7 +3007,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsel2s" cloneof="drgnsel2">
- <description>Dragon Selection 2 (Spa)</description>
+ <description>Dragon Selection 2 (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="N30501" />
@@ -3030,7 +3030,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsel4s" cloneof="drgnsel4">
- <description>Dragon Selection 4 (Spa)</description>
+ <description>Dragon Selection 4 (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -3625,7 +3625,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="fabrica">
- <description>Fabrica de Chicles (Spa)</description>
+ <description>Fabrica de Chicles (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -3736,7 +3736,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="fincdowns" cloneof="fincdown">
- <description>Final Countdown (Spa)</description>
+ <description>Final Countdown (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="A0523" />
@@ -3781,7 +3781,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="fireforcc" cloneof="fireforc">
- <description>Fire Force [cracked]</description>
+ <description>Fire Force (cracked)</description>
<year>1986</year>
<publisher>Quickbeam</publisher>
<part name="cass1" interface="dragon_cass">
@@ -3826,7 +3826,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="flags" cloneof="flag">
- <description>Flag (Spa)</description>
+ <description>Flag (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -3892,7 +3892,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="flights" cloneof="flight">
- <description>Flight (Spa)</description>
+ <description>Flight (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -4213,7 +4213,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="galxattxs" cloneof="galxattx">
- <description>Galax Attax (Spa)</description>
+ <description>Galax Attax (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -4472,7 +4472,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="goldbatna" cloneof="goldbatn">
- <description>The Golden Baton (Alt)</description>
+ <description>The Golden Baton (alt)</description>
<year>1984</year>
<publisher>Channel 8 Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -5297,7 +5297,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="jswc" cloneof="jsw">
- <description>Jet Set Willy [cracked]</description>
+ <description>Jet Set Willy (cracked)</description>
<year>1985</year>
<publisher>Software Projects</publisher>
<part name="cass1" interface="dragon_cass">
@@ -5657,7 +5657,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="leccion11">
- <description>Leccion 11 Diagramas de Flujo U Organigramas (Spa)</description>
+ <description>Leccion 11 Diagramas de Flujo U Organigramas (Spain)</description>
<year>198?</year>
<publisher>Software AMM</publisher>
<part name="cass1" interface="dragon_cass">
@@ -5959,7 +5959,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="mminera">
- <description>Manic Miner (Alt2)</description>
+ <description>Manic Miner (alt 2)</description>
<year>1984</year>
<publisher>Software Projects</publisher>
<part name="cass1" interface="dragon_cass">
@@ -5970,7 +5970,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="mminera2">
- <description>Manic Miner (Alt)</description>
+ <description>Manic Miner (alt)</description>
<year>1984</year>
<publisher>Software Projects</publisher>
<part name="cass1" interface="dragon_cass">
@@ -5981,7 +5981,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="mminerc" cloneof="mminer">
- <description>Manic Miner [cracked]</description>
+ <description>Manic Miner (cracked)</description>
<year>1984</year>
<publisher>Software Projects</publisher>
<part name="cass1" interface="dragon_cass">
@@ -6026,7 +6026,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="mansiondms" cloneof="mansiondm">
- <description>Mansion of Doom (Spa)</description>
+ <description>Mansion of Doom (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="A0524" />
@@ -6776,7 +6776,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="numpuzzls" cloneof="numpuzzl">
- <description>Number Puzzler (Spa)</description>
+ <description>Number Puzzler (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -7107,7 +7107,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="pettidiarya" cloneof="pettidiary">
- <description>Pettigrews Diary (Alt)</description>
+ <description>Pettigrews Diary (alt)</description>
<year>1983</year>
<publisher>Shards Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -7210,7 +7210,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="pimaniaa2" cloneof="pimania">
- <description>Pimania (Alt2)</description>
+ <description>Pimania (alt 2)</description>
<year>1982</year>
<publisher>Automata</publisher>
<part name="cass1" interface="dragon_cass">
@@ -7221,7 +7221,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="pimaniaa" cloneof="pimania">
- <description>Pimania (Alt1)</description>
+ <description>Pimania (alt)</description>
<year>1982</year>
<publisher>Automata</publisher>
<part name="cass1" interface="dragon_cass">
@@ -7402,7 +7402,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="procestxt">
- <description>Procesador de Textos (Spa)</description>
+ <description>Procesador de Textos (Spain)</description>
<year>198?</year>
<publisher>Investronica</publisher>
<part name="cass1" interface="dragon_cass">
@@ -8064,7 +8064,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="seaquests" cloneof="seaquest">
- <description>Sea Quest (Spa)</description>
+ <description>Sea Quest (Spain)</description>
<year>1984</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="M30944" />
@@ -8184,7 +8184,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="shapera" cloneof="shaper">
- <description>Shaper (Alt)</description>
+ <description>Shaper (alt)</description>
<year>1984</year>
<publisher>Shards Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -8218,7 +8218,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="shenanigs" cloneof="shenanig">
- <description>Shenanigans (Spa)</description>
+ <description>Shenanigans (Spain)</description>
<year>1984</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="M30943" />
@@ -8286,7 +8286,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="shuttlzaps" cloneof="shuttlzap">
- <description>Shuttle Zap (Spa)</description>
+ <description>Shuttle Zap (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<part name="cass1" interface="dragon_cass">
@@ -8884,7 +8884,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="sbascomp11a" cloneof="sbascomp11">
- <description>Sprint Basic Compiler v1.1 (Alt)</description>
+ <description>Sprint Basic Compiler v1.1 (alt)</description>
<year>1984</year>
<publisher>Oasis Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -9312,7 +9312,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="superkidc" cloneof="superkid">
- <description>Superkid [cracked]</description>
+ <description>Superkid (cracked)</description>
<year>198?</year>
<publisher>Quickbeam</publisher>
<part name="cass1" interface="dragon_cass">
@@ -9441,7 +9441,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="teatimef" cloneof="teatime">
- <description>Tea Time [fixed]</description>
+ <description>Tea Time (fixed)</description>
<year>1984</year>
<publisher>Pocket Money Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -9989,7 +9989,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="timebandta" cloneof="timebandt">
- <description>Time Bandit (Alt)</description>
+ <description>Time Bandit (alt)</description>
<year>1984</year>
<publisher>Microdeal</publisher>
<part name="cass1" interface="dragon_cass">
@@ -10274,7 +10274,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="tubearmyc" cloneof="tubearmy">
- <description>Tube Way Army [cracked]</description>
+ <description>Tube Way Army (cracked)</description>
<year>1984</year>
<publisher>Crystal Computing</publisher>
<part name="cass1" interface="dragon_cass">
@@ -10606,7 +10606,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="vikings" cloneof="viking">
- <description>Viking (Spa)</description>
+ <description>Viking (Spain)</description>
<year>198?</year>
<publisher>Eurohard S.A.</publisher>
<info name="serial" value="M30879" />
@@ -10928,7 +10928,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="zakssona" cloneof="zaksson">
- <description>Zak's Son (Alt)</description>
+ <description>Zak's Son (alt)</description>
<year>1984</year>
<publisher>Cable Software</publisher>
<part name="cass1" interface="dragon_cass">
@@ -10970,7 +10970,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
<!-- Magazines -->
<software name="drgnsoft1">
- <description>Dragon Software No.1 (Spa)</description>
+ <description>Dragon Software No.1 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11036,7 +11036,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft2">
- <description>Dragon Software No.2 (Spa)</description>
+ <description>Dragon Software No.2 (Spain)</description>
<year>1985</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11102,7 +11102,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft3">
- <description>Dragon Software No.3 (Spa)</description>
+ <description>Dragon Software No.3 (Spain)</description>
<year>1985</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11174,7 +11174,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft4">
- <description>Dragon Software No.4 (Spa)</description>
+ <description>Dragon Software No.4 (Spain)</description>
<year>1985</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11240,7 +11240,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft5">
- <description>Dragon Software No.5 (Spa)</description>
+ <description>Dragon Software No.5 (Spain)</description>
<year>1985</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11312,7 +11312,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft6">
- <description>Dragon Software No.6 (Spa)</description>
+ <description>Dragon Software No.6 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11378,7 +11378,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft7">
- <description>Dragon Software No.7 (Spa)</description>
+ <description>Dragon Software No.7 (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11444,7 +11444,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft8">
- <description>Dragon Software No.8 (Spa)</description>
+ <description>Dragon Software No.8 (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11510,7 +11510,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft9">
- <description>Dragon Software No.9 (Spa)</description>
+ <description>Dragon Software No.9 (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11564,7 +11564,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft10">
- <description>Dragon Software No.10 (Spa)</description>
+ <description>Dragon Software No.10 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11630,7 +11630,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft11">
- <description>Dragon Software No.11 (Spa)</description>
+ <description>Dragon Software No.11 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11678,7 +11678,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft12">
- <description>Dragon Software No.12 (Spa)</description>
+ <description>Dragon Software No.12 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11726,7 +11726,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft13">
- <description>Dragon Software No.13 (Spa)</description>
+ <description>Dragon Software No.13 (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11780,7 +11780,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft15">
- <description>Dragon Software No.15: Meteorit Patrol (Spa)</description>
+ <description>Dragon Software No.15: Meteorit Patrol (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11792,7 +11792,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft16">
- <description>Dragon Software No.16: Mania Persecutoria (Spa)</description>
+ <description>Dragon Software No.16: Mania Persecutoria (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11828,7 +11828,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft17">
- <description>Dragon Software No.17 (Spa)</description>
+ <description>Dragon Software No.17 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11840,7 +11840,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft18">
- <description>Dragon Software No.18 (Spa)</description>
+ <description>Dragon Software No.18 (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11852,7 +11852,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft19">
- <description>Dragon Software No.19: Laberinto (Spa)</description>
+ <description>Dragon Software No.19: Laberinto (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11870,7 +11870,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft20">
- <description>Dragon Software No.20 (Spa)</description>
+ <description>Dragon Software No.20 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11882,7 +11882,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft21">
- <description>Dragon Software No.21: S.O.S. (Spa)</description>
+ <description>Dragon Software No.21: S.O.S. (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11906,7 +11906,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft22">
- <description>Dragon Software No.22: Super D (Spa)</description>
+ <description>Dragon Software No.22: Super D (Spain)</description>
<year>1986</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11936,7 +11936,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft23">
- <description>Dragon Software No.23: Defender (Spa)</description>
+ <description>Dragon Software No.23: Defender (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11947,7 +11947,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="drgnsoft24">
- <description>Dragon Software No.24 (Spa)</description>
+ <description>Dragon Software No.24 (Spain)</description>
<year>198?</year>
<publisher>GTS</publisher>
<part name="cass1" interface="dragon_cass">
@@ -11995,7 +11995,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="viddrgn1">
- <description>Video Dragon Issue 1 (Spa)</description>
+ <description>Video Dragon Issue 1 (Spain)</description>
<year>1985</year>
<publisher>Software Editores</publisher>
<part name="cass1" interface="dragon_cass">
@@ -12085,7 +12085,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="viddrgn2">
- <description>Video Dragon Issue 2 (Spa)</description>
+ <description>Video Dragon Issue 2 (Spain)</description>
<year>1985</year>
<publisher>Software Editores</publisher>
<part name="cass1" interface="dragon_cass">
@@ -12193,7 +12193,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="viddrgn3">
- <description>Video Dragon Issue 3 (Spa)</description>
+ <description>Video Dragon Issue 3 (Spain)</description>
<year>1985</year>
<publisher>Software Editores</publisher>
<part name="cass1" interface="dragon_cass">
@@ -12211,7 +12211,7 @@ This list was compiled from the archive at http://archive.worldofdragon.org/arch
</software>
<software name="viddrgn6">
- <description>Video Dragon Issue 6 (Spa)</description>
+ <description>Video Dragon Issue 6 (Spain)</description>
<year>1986</year>
<publisher>Software Editores</publisher>
<part name="cass1" interface="dragon_cass">
diff --git a/hash/dragon_flex.xml b/hash/dragon_flex.xml
index 467466faa1f..0750d26de75 100644
--- a/hash/dragon_flex.xml
+++ b/hash/dragon_flex.xml
@@ -27,7 +27,7 @@ Dragon 64 FLEX floppy disks
</software>
<software name="dbasica" cloneof="dbasic">
- <description>DBASIC (Alt)</description>
+ <description>DBASIC (alt)</description>
<year>1984</year>
<publisher>Compusense</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -302,7 +302,7 @@ Dragon 64 FLEX floppy disks
</software>
<software name="utilsa" cloneof="utils">
- <description>Utilities (Alt)</description>
+ <description>Utilities (alt)</description>
<year>198?</year>
<publisher>Compusense</publisher>
<part name="flop1" interface="floppy_5_25">
diff --git a/hash/dragon_flop.xml b/hash/dragon_flop.xml
index c572e20f6ad..ba7626f6da6 100644
--- a/hash/dragon_flop.xml
+++ b/hash/dragon_flop.xml
@@ -878,7 +878,7 @@ Dragon 32/64 DOS floppy disks
</software>
<software name="magbasea" cloneof="magbase">
- <description>Magbase (Alt)</description>
+ <description>Magbase (alt)</description>
<year>198?</year>
<publisher>Pulser Software</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -907,7 +907,7 @@ Dragon 32/64 DOS floppy disks
</software>
<software name="magbasedua" cloneof="magbasedu">
- <description>Magbase (Dragon User) (Alt)</description>
+ <description>Magbase (Dragon User, alt)</description>
<year>1986</year>
<publisher>Pulser Software</publisher>
<part name="flop1" interface="floppy_5_25">
diff --git a/hash/duelmast_cart.xml b/hash/duelmast_cart.xml
new file mode 100644
index 00000000000..15d02bd9452
--- /dev/null
+++ b/hash/duelmast_cart.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<!--
+license:CC0-1.0
+-->
+<softwarelist name="duelmast_cart" description="Takara Duel Masters: Duel Station cartridges">
+ <!-- cartridges contain the ROM only, the XaviX CPU and BIOS are in the base unit
+
+ ***********************************************************************************
+
+ -->
+
+ <!-- only the single known cart exists for this system -->
+
+ <software name="ver1" supported="no">
+ <description>Duel Masters: Duel Station Senyō Cartridge Ver.1</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <info name="alt_title" value="デュエルマスターズ デュエルステーション専用カートリッジ Ver.1" />
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x800000">
+ <rom name="duelmasters_cart_ver1.u1" offset="0x000000" size="0x400000" crc="7ba0d51f" sha1="6227866c732ff0b5c9f5026ebabdf220a6c53cc1"/>
+ <rom name="duelmasters_cart_ver1.u3" offset="0x400000" size="0x400000" crc="1881fc17" sha1="daf201efac1073e790d94438dc49ac5b65df8d67"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/ekara_cart.xml b/hash/ekara_cart.xml
index 86f9698d508..52588608813 100644
--- a/hash/ekara_cart.xml
+++ b/hash/ekara_cart.xml
@@ -9,6 +9,55 @@ license:CC0-1.0
<!-- cartridges contain the ROM only, the XaviX CPU and BIOS are in the base unit -->
+ <!-- e-kara cartridge pins
+
+ 1 GND
+ 2 N/C
+ 3 jumper to 22
+ 4 VCC
+ 5 A15
+ 6 A14
+ 7 A13
+ 8 A12
+ 9 A11
+ 10 A10
+ 11 A9
+ 12 A8
+ 13 A7
+ 14 A6
+ 15 A5
+ 16 A4
+ 17 A3
+ 18 A2
+ 19 A1
+ 20 A0
+ 21 VCC
+ 22 jumper to 3
+ 23 /CE
+ 24 D7
+ 25 D6
+ 26 D5
+ 27 D4
+ 28 D3
+ 29 D2
+ 30 D1
+ 31 D0
+ 32 GND
+ 33 WE =>SET TO VCC on USER-CARTRIDE!
+ 34 /OE
+ 35 VCC
+ 36 N/C (A23?)
+ 37 N/C (A22?)
+ 38 N/C (A21?)
+ 39 N/C (A20?)
+ 40 A19 (N/C on starter cart)
+ 41 A18
+ 42 A17
+ 43 A16
+ 44 GND
+
+ -->
+
<!--
Japanese e-kara carts appear to have a number of different genres split across various
@@ -42,34 +91,22 @@ license:CC0-1.0
SAI = Saiten Cartridge (supports scoring)
TPJ = TV Pop Junior
- Some Japanese carts have a number starting with S (S-x on case, SCxxxx-xxx part numbers) (see ekara_japan_s.xml) (for e-kara - custom presentation)
- M (M-x on case, MCxxxx-xxx part numbers) (see ekara_japan_m.xml) (for e-kara - custom presentation)
- EN (EN-X on case, no part numbers) (see ekara_japan_en.xml) (for e-kara - custom presentation)
- BH (BG-XX on case, BH-xxxx on PCB) (see ekara_japan_bh.xml) (for e-kara - custom presentation)
- GK (GK-X on case) (see ekara_japan_gk.xml) (for e-kara / e-pitch - custom presentation)
- G (G-x on case, GCxxxx-xxx part numbers) (see ekara_japan_g.xml) (for e-kara, Popira / 2)
- P (P-x on case, PCxxxx-xxx part numbers) (see ekara_japan_p.xml) (for e-kara, Popira / 2, DDR Family Mat)
- D (D-x on case, DCxxxx-xxx part numbers) (see ekara_japan_d.xml) (for e-kara, Popira / 2, Taiko de Popira)
- SP (SP-x on case, no part numbers) (see ekara_japan_sp.xml) (for e-kara, Popira / 2, Taiko de Popira, Jumping Popira)
- A (A-x on case, Pichi Pichi Pitch series)(see ekara_japan_a.xml) (for e-kara / e-pitch)
- AC (KR-xx on cart, maybe part of A series)
- JP (JP-x on case) (see ekara_japan_jp.xml) (for Jumping Popira Only)
-
- these exist but haven't got any
- Some Japanese carts have a number starting with
- KE (for Kids Lyric book device Only?)
- KD (for e-kara?)
- PR (seen a PR-02 AYY) (what is it?)
-
- (there are others, need to document them)
-
+ Some Japanese carts have a number starting with S (S-x on case, SCxxxx-xxx part numbers) (for e-kara - custom presentation)
+ M (M-x on case, MCxxxx-xxx part numbers) (for e-kara - custom presentation)
+ EN (EN-X on case, no part numbers) (for e-kara - custom presentation)
+ BH (BG-XX on case, BH-xxxx on PCB) (for e-kara - custom presentation)
+ GK (GK-X on case) (for e-kara / e-pitch - custom presentation)
+ G (G-x on case, GCxxxx-xxx part numbers) (for e-kara, Popira / 2)
+ P (P-x on case, PCxxxx-xxx part numbers) (for e-kara, Popira / 2, DDR Family Mat)
+ D (D-x on case, DCxxxx-xxx part numbers) (for e-kara, Popira / 2, Taiko de Popira)
+ SP (SP-x on case, no part numbers) (for e-kara, Popira / 2, Taiko de Popira, Jumping Popira)
+ A (A-x on case, Pichi Pichi Pitch series)(for e-kara / e-pitch)
+ JP (JP-x on case) (for Jumping Popira Only)
There are also e-kara Web cartridges that were meant to be programmed using a special unit connected to a PC using the defunct e-kara web service (see ekara_japan_web.xml)
Genres can cross multiple cart types, eg. TV Pop 1,3,4,5,6 are in the 'G' series, while TV Pop 2 is in the 'P' series, and TV Pop 9 is in the 'D' series (where are 7,8?)
- for non-Japanese carts see ekara_us.xml and ekara_pal.xml, the PAL ones are noteworthy for using a different timing system
-
***********************************************************************************
Japanese cart listing (by 'just number' code) (number on cartridge / box, EC in cart identifier code)
@@ -230,7 +267,7 @@ license:CC0-1.0
*D-4 DC0004-TPJ TV Pop Junior Volume 8
*D-5 DC0005-TPJ TV Pop Junior Volume 9
*D-6 DC0006-BHT Best Hit Volume 10
- D-7 DC0007-KID Kids' Song Volume 4 (volumes 1, 2 and 3 are in the main EC series)
+ *D-7 DC0007-KID Kids' Song Volume 4 (volumes 1, 2 and 3 are in the main EC series)
*D-8 DC0008-BAT Best Artist Volume 7
*D-9 DC0009-TPJ TV Pop Junior (no volume number on cover)
@@ -307,7 +344,7 @@ license:CC0-1.0
*KD-1 Kids' Song 20 - Volume 1
*KD-2 Kids' Song 20 - Volume 2
*KD-3 Kids' Song 20 - Volume 3
- KD-4 Kids' Song 20 - Volume 4
+ *KD-4 Kids' Song 20 - Volume 4
***********************************************************************************
@@ -330,7 +367,7 @@ license:CC0-1.0
M-14 *MC0014-ATM Artist Mini Volume 8 (BoA)
M-15 *MC0015-TPM TV Pop Mini Volume 1
M-16 *MC0016-ATM Artist Mini Volume 9 (Yamaguchi Momoe)
- M-17 MC0017-KSM Kids' Song Mini Volume 6
+ M-17 *MC0017-KSM Kids' Song Mini Volume 6
***********************************************************************************
@@ -437,6 +474,31 @@ license:CC0-1.0
*JP-01 'Jumping Popira' JP-1
*JP-02 'Jumping Popira' JP-2
+ ***********************************************************************************
+
+ The Korean release of e-kara was called i-singer, and was distributed by Sonokong
+
+ At least 15 cartridges exist for it
+
+ It is unknown if the internal ROM is the same as the non-Japanese e-kara units, or if it
+ would have a Korean 'please insert a cartridge' message. It is also unconfirmed if these
+ cartridges function on non-Korean units.
+
+ Vol.1 HOT/SES
+ Vol.2 Yoo Seung-joon/Park Ji-yoon
+ Vol.3 Compositional Hair/Humming
+ Vol.4 Shin Seung Hoon & Lee Seung Hwan
+ Vol.5 Trot Collection I
+ Vol.6 Omnibus I
+ Vol.7 Omnibus II
+ Vol.8 Omnibus III
+ Vol.9 Omnibus IV
+ Vol.10 Omnibus V
+ Vol.11 Omnibus Primary Song Pack V
+ Vol.12 Omnibus VI 6
+ Vol.13 Trot Collection II
+ Vol.14 ?
+ Vol.15 Park Jinyoung & Cool & J & Baek Jiyoung
************************************************************************************************************************************************************
Everything below is not standard e-kara / XaviX based hardware, listed for reference
@@ -1834,6 +1896,21 @@ license:CC0-1.0
</part>
</software>
+ <software name="dc0007">
+ <description>Kids' Song Volume 4 (Yuuki Rinrin, Osakana Tengoku, etc.) (Japan) (DC0007-KID)</description>
+ <year>2004</year>
+ <publisher>Takara</publisher>
+ <info name="alt_title" value="キッズソング (勇気りんりん/おさかな天国/他)"/> <!-- from cartridge label - no Dream Cartridge branding, volume number not shown -->
+ <info name="alt_title" value="キッズソングvol.4"/> <!-- shown on-screen when run on Popira -->
+ <sharedfeat name="compatibility" value="EKARA,POPIRA,TAIKO"/>
+ <part name="cart" interface="ekara_cart">
+ <feature name="slot" value="rom_24lc02"/>
+ <dataarea name="rom" size="0x100000">
+ <rom name="dc0007-kid.u1" size="0x100000" crc="c8908d43" sha1="a42010f805c3839b974fa8a6e2a412d68c903324"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="dc0008">
<description>Dream Cartridge: Best Artist Vol.7 (Japan) (DC0008-BAT)</description>
<year>2004</year>
@@ -2281,6 +2358,19 @@ license:CC0-1.0
</part>
</software>
+ <software name="kd4">
+ <description>Kids' Song 20 (Japan) (KD-4)</description>
+ <year>2004</year>
+ <publisher>Takara</publisher>
+ <info name="alt_title" value="キッズソング20" />
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="kd0004.bin" size="0x100000" crc="c9719803" sha1="5aa6ec9742d8e560a86319e40d5f731b8ef60dd3"/>
+ </dataarea>
+ </part>
+ </software>
+
<!-- ********************************************************************************************************************************************************************** -->
@@ -2493,6 +2583,18 @@ license:CC0-1.0
</part>
</software>
+ <software name="mc0017">
+ <description>Kids' Song Mini Volume 6 (Japan) (MC0017-KSM)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <info name="alt_title" value="キッズソングミニ mini vol.6"/>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x080000">
+ <rom name="mc0017-ksm.u1" size="0x080000" crc="8ef6e48d" sha1="093f820295c35c08e29efe6f3f5e9f00a3813a27"/>
+ </dataarea>
+ </part>
+ </software>
<!-- ********************************************************************************************************************************************************************** -->
@@ -3037,7 +3139,87 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="EKARA"/>
<part name="cart" interface="ekara_cart">
<dataarea name="rom" size="0x200000">
- <rom name="web.u1" size="0x200000" crc="69bb06bf" sha1="dafa4fde7b59cb547e1f3af0b29606b33cb76fd0"/>
+ <rom name="ekaraweb_28m_blank.u1" size="0x200000" crc="69bb06bf" sha1="dafa4fde7b59cb547e1f3af0b29606b33cb76fd0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 夢のチカラ 上戸彩 Yume no Chikara Ueto Aya
+ 何度でも DREAMS COME TRUE Nando Demo DREAMS COME TRUE
+ 桜色舞うころ 中島美嘉 Sakurairo Maukoro Nakashima Mika
+ 自分のために TOKIO Jibun no Tameni Tokio
+ 夏を待つセイル(帆)のように ZARD Natsu o Matsu Sail no Yō ni ZARD
+ SMILY 大塚愛 Smily Ōtsuka Ai
+ NO MORE CRY D-51 No More Cry D-51
+ Feel your breeze V6 Feel your breeze V6
+ KISS or KISS 北出菜奈 Kiss or Kiss Kitade Nana
+ MERMAID 上戸彩 Mermaid Ueto Aya
+ 未来の地図 Mi Mirai no Chizu Mi
+ 絆 亀梨和也 Kizuna Kamenashi Kazuya
+ 青春アミーゴ 修二と彰 Seishun Amigo Shūji to Akira
+ プラネタリウム 大塚愛 Planetarium Ōtsuka Ai
+ ENDLESS STORY REIRA starring Yuna Ito Endless Story Reira starring Yuna Ito
+ GLAMOROUS SKY NANA starring MIKA NAKASHIMA Glamorous Sky Nana starring Mika Nakashima
+ Sweet Mom 柴咲コウ Sweet Mom Shibasaki Kō
+ WISH 嵐 WISH ARASHI
+ Growing of my heart 倉木麻衣 Growing of my heart Kuraki Mai
+ Triangle SMAP Triangle SMAP
+ 抱きしめる BoA Dakishimeru BoA
+ Faith 伊藤由奈 Faith Itō Yuna
+ 影 柴咲コウ Kage Shibasaki Kō
+ ベスト オブ ヒーロー 倉木麻衣 Best of Hero Kuraki Mai
+ Someday 倖田來未 Someday Kōda Kumi
+ FIND THE WAY 中島美嘉 Find the Way Nakashima Mika -->
+ <software name="ekaraweb28a" cloneof="ekaraweb28">
+ <description>e-kara Web cartridge 28M (used, with 26 songs) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x200000">
+ <rom name="ekaraweb_28m_26.u1" size="0x200000" crc="3c03be04" sha1="c3a68376d798f911a38634f19abe4ca870ae8b5c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ アイアイ 童謡 Aye-aye Dōyō
+ いちねんせいになったら 童謡 Ichinensei ni Nattara Dōyō
+ 大きな栗の木の下で 童謡 Ōkina Kuri no Ki no Shita de Dōyō
+ 大きな古時計 童謡 Ōkina Furudokei Dōyō
+ おべんとうばこのうた 童謡 O-Bentō Bako no uta Dōyō
+ 幸せなら手をたたこう 童謡 Shiawasenara Te o Taktakō Dōyō
+ スキップ ステップ アイランド しましまとらのしまじろう Skip Step Island Shima Shima Tora no Shimajirō
+ ふしぎなポケット 童謡 Fushigina Pocket Dōyō
+ もりのくまさん 童謡 Mori no Kuma-san Dōyō
+ いぬのおまわりさん 童謡 Inu no Omawari-san Dōyō
+ 涙そうそう 夏川りみ Nada Sōsō Natsukawa Rimi
+ さくらんぼ〈きらりんVer.〉 大塚愛 Sakuranbo <Kirarin Ver.> Ōtsuka Ai
+ CHA-LA HEAD-CHA-LA 影山ヒロノブ Cha-La Head-Cha-La Kageyama Hironobu
+ スーパーマン 大塚愛 Super Man Ōtsuka Ai
+ Strawberry Jam 大塚愛 Strawberry Jam Ōtsuka Ai
+ 青春アミーゴ 修二と彰 Seishun Amigo Shūji to Akira
+ かたつむり 童謡 Katatsumuri Dōyō
+ にんげんっていいな 中嶋義実、ヤング・フレッシュ Ningentte Īna Nakajima Yoshimi, Young Fresh
+ ハグしちゃお 夏川りみ Hug-shichao Natsukawa Rimi
+ Dragostea Din Tei 【ドラゴステア・ディン・テイ〜恋のマイアヒ〜】 O-ZONE Dragostea Din Tei (Koi no Maiahi) O-Zone
+ まかせて★スプラッシュ☆スター★ うちやえゆか with Splash Stars Makasete ★Splash☆Star★ Uchiyae Yuka with Splash Stars
+ フレンジャー 大塚愛 Frienger Ōtsuka Ai
+ オトメロディー 高橋美佳子 Otomelody Takahashi Mikako
+ 勇気りんりん ドリーミング Yūkirinrin Dreaming
+ アンパンマンたいそう ドリーミング Anpanman Taisō Dreaming
+ アンパンマンのマーチ ドリーミング Anpanman no March Dreaming
+ キューティーハニー 倖田來未 Cutie Honey Kōda Kumi
+ 勇気100%(2002) Ya-Ya-yah Yūki 100% (2002) Ya-Ya-yah -->
+ <software name="ekaraweb28b" cloneof="ekaraweb28">
+ <description>e-kara Web cartridge 28M (used, with 28 songs) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x200000">
+ <rom name="ekara_user_red.bin" size="0x200000" crc="2acf2b95" sha1="100106cf9da486fcc5dae328721feb2ffba74b3b"/>
</dataarea>
</part>
</software>
@@ -3049,56 +3231,407 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="EKARA"/>
<part name="cart" interface="ekara_cart">
<dataarea name="rom" size="0x100000">
- <rom name="ekaraweb2.bin" size="0x100000" crc="9149a3a8" sha1="01277650706c1b168c5125b0ddcceacbd207be25"/>
+ <rom name="ekaraweb_12m_blank.u1" size="0x100000" crc="9149a3a8" sha1="01277650706c1b168c5125b0ddcceacbd207be25"/>
</dataarea>
</part>
</software>
<!-- this one has some songs programmed into it:
- 河内おとこ節 中村美律子 Kawachi Otokobushi Nakamura Mitsuko
- 珍島(チンド)物語 天童よしみ Chindo Monogatari Tendō Yoshimi
- こころ酒 藤あや子 Kokoro Sake Fuji Ayako
- 夜桜お七 坂本冬美 Yozakura O-shichi Sakamoto Fuyumi
- 愛燦燦(あいさんさん) 美空ひばり Ai Sansan Misora Hibari
- 川の流れのように 美空ひばり Kawa no Nagare no Yō ni Misora Hibari
- 真赤な太陽 美空ひばり Makkana TaiYō Misora Hibari -->
- <software name="ekaraweb12a">
+ 河内おとこ節 中村美律子 Kawachi Otokobushi Nakamura Mitsuko
+ 珍島(チンド)物語 天童よしみ Chindo Monogatari Tendō Yoshimi
+ こころ酒 藤あや子 Kokoro Sake Fuji Ayako
+ 夜桜お七 坂本冬美 Yozakura O-shichi Sakamoto Fuyumi
+ 愛燦燦(あいさんさん) 美空ひばり Ai Sansan Misora Hibari
+ 川の流れのように 美空ひばり Kawa no Nagare no Yō ni Misora Hibari
+ 真赤な太陽 美空ひばり Makkana TaiYō Misora Hibari -->
+ <software name="ekaraweb12a" cloneof="ekaraweb12">
<description>e-kara Web cartridge 12M (used, with 7 songs) (Japan)</description>
<year>2003</year>
<publisher>Takara</publisher>
<sharedfeat name="compatibility" value="EKARA"/>
<part name="cart" interface="ekara_cart">
<dataarea name="rom" size="0x100000">
- <rom name="ekaraweb3.bin" size="0x100000" crc="a6a095b9" sha1="709d7edb5799b97127502408bec698663b902462"/>
+ <rom name="ekaraweb_12m_7.u1" size="0x100000" crc="a6a095b9" sha1="709d7edb5799b97127502408bec698663b902462"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ さくらんぼ 大塚愛 Sakuranbo Ōtsuka Ai
+ 花 ORANGE RANGE Hana Orange Range
+ ロコローション ORANGE RANGE Locolotion Orange Range
+ solitude~真実のサヨナラ~ KinKi Kids Solitude - Shinjitsu no Sayonara KinKi Kids
+ 薄荷キャンディー KinKi Kids Hakka Candy KinKi Kids
+ ボクの背中には羽根がある KinKi Kids Boku no Senaka ni wa Hane ga Aru KinKi Kids
+ 愛の温度℃ ぴちぴちピッチ Ai no Ondo °C Pichi Pichi Pitch
+ 世界で一番早く朝が来る場所 ぴちぴちピッチ Sekai de Ichiban Hayaku Asa ga Kuru Basho Pichi Pichi Pitch
+ YUME日和 島谷ひとみ Yume Biyori Shimatani Hitomi
+ LOVE LOVE LOVE DREAMS COME TRUE Love Love Love Dreams Come True
+ キラリ☆セーラードリーム 小枝(さえ) Kirari ☆ Sailor Dream Koeda (Sae)
+ 夏祭り Whiteberry Natsu Matsuri Whiteberry -->
+ <software name="ekaraweb12b" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 1) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set1.u1" size="0x100000" crc="23df7749" sha1="cfd3f9f0b9f4713d560700c4e463d0e9d94c9447"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 月光町のうた おじゃる丸・キス Gekkō Machi no Uta Ojarumaru/Kiss
+ 詠人(うたびと) 北島三郎 Utabito Kitajima Saburō
+ アララの呪文 ちびまる子ちゃんwith爆チュー問題 Arara no Jumon Chibi Maruko-chan with Bakuchū Mondai
+ サザエさん 宇野ゆう子 Sazae-san Uno Yūko
+ 島人ぬ宝 BEGIN Shimanchunu Takara BEGIN -->
+ <software name="ekaraweb12c" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 5 songs) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_5.u1" size="0x100000" crc="bc4635cd" sha1="5343b254218f85a2f9e5ae9e4646b456d82c7d27"/>
</dataarea>
</part>
</software>
<!-- this one has some songs programmed into it:
- さくらんぼ 大塚愛 Sakuranbo Ōtsuka Ai
- 花 ORANGE RANGE Hana Orange Range
- ロコローション ORANGE RANGE Locolotion Orange Range
- solitude~真実のサヨナラ~ KinKi Kids Solitude - Shinjitsu no Sayonara KinKi Kids
- 薄荷キャンディー KinKi Kids Hakka Candy KinKi Kids
- ボクの背中には羽根がある KinKi Kids Boku no Senaka ni wa Hane ga Aru KinKi Kids
- 愛の温度℃ ぴちぴちピッチ Ai no Ondo °C Pichi Pichi Pitch
- 世界で一番早く朝が来る場所 ぴちぴちピッチ Sekai de Ichiban Hayaku Asa ga Kuru Basho Pichi Pichi Pitch
- YUME日和 島谷ひとみ Yume Biyori Shimatani Hitomi
- LOVE LOVE LOVE DREAMS COME TRUE Love Love Love Dreams Come True
- キラリ☆セーラードリーム 小枝(さえ) Kirari ☆ Sailor Dream Koeda (Sae)
- 夏祭り Whiteberry Natsu Matsuri Whiteberry -->
- <software name="ekaraweb12b">
- <description>e-kara Web cartridge 12M (used, with 12 songs) (Japan)</description>
+ SMILY〈なかよしVer.〉 大塚愛 Smily <Nakayoshi Ver.> Ōtsuka Ai
+ SMILY 大塚愛 Smily Ōtsuka Ai
+ 以心電信 ORANGE RANGE Ishin Denshin Orange Range
+ お願い!セニョリータ ORANGE RANGE Onegai! Señorita Orange Range
+ ロコローション ORANGE RANGE Locolotion Orange Range
+ 花 ORANGE RANGE Hana Orange Range
+ ビーだま 大塚愛 Bīdama Ōtsuka Ai
+ 大好きだよ。 大塚愛 Daisuki dayo. Ōtsuka Ai
+ 君は天然色 大滝詠一 Kimi wa Tennenshoku Ōtaki Eiichi
+ メリー・ジェーン つのだ☆ひろ Mary Jane Tsunoda☆Hiro
+ 壊れかけのRadio 德永英明 Kowarekake no Radio Tokunaga Hideaki
+ そっとおやすみ 布施明 Sotto O-yasumi Fuse Akira -->
+ <software name="ekaraweb12d" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 2) (Japan)</description>
<year>2003</year>
<publisher>Takara</publisher>
<sharedfeat name="compatibility" value="EKARA"/>
<part name="cart" interface="ekara_cart">
<dataarea name="rom" size="0x100000">
- <rom name="ekaraweb4.bin" size="0x100000" crc="23df7749" sha1="cfd3f9f0b9f4713d560700c4e463d0e9d94c9447"/>
+ <rom name="ekaraweb_12m_12_set2.u1" size="0x100000" crc="23507ed2" sha1="254c24c23b51cae181579ac062cf01f76edebb73"/>
</dataarea>
</part>
</software>
+ <!-- this one has some songs programmed into it:
+ 真赤な太陽 美空ひばり Makkana Taiyō Misora Hibari
+ みだれ髪 美空ひばり Midare Gami Misora Hibari
+ チャンピオーネ ORANGE RANGE Champione ORANGE RANGE
+ 旅人 ケツメイシ Tabiudo Ketsumeishi
+ 純恋歌 湘南乃風 Junrenka Shōnan no Kaze
+ 花 喜納昌吉 Hana Kina Shōkichi
+ I Was Born To Love You[アイ・ワズ・ボーン・トゥ・ラヴ・ユー] QUEEN I Was Born To Love You Queen
+ 花 ORANGE RANGE Hana Orange Range
+ Together EXILE Together EXILE
+ 君といつまでも 加山雄三 Kimi to Itsma demo Kayama Yūzō
+ しあわせになろうよ 長渕剛 Shiawase ni Narō yo Nagabuchi Tsuyoshi
+ Believe AI Believe AI -->
+ <software name="ekaraweb12e" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 3) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set3.u1" size="0x100000" crc="1aa61941" sha1="002353dfd8ac61c4ea3e82d3fdd95d98a0fbf29e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 恋のつぼみ 倖田來未 Koi no Tsubomi Kōda Kumi
+ Someday 倖田來未 Someday Kōda Kumi
+ Jupiter 倖田來未 Jupiter Kōda Kumi
+ 明日 倖田來未 Ashita Kōda Kumi
+ 純愛ラプソディ 竹内まりや Junai Rhapsody Takeuchi Mariya
+ 元気を出して 竹内まりや Genki o Dashite Takeuchi Mariya
+ 家(うち)に帰ろう~マイ・スイート・ホーム~ 竹内まりや Uchi ni Kaerō – My Sweet Home Takeuchi Mariya
+ 時代 中島みゆき Jidai Nakashima Miyuki
+ 地上の星 中島みゆき Chijō no Hoshi Nakashima Miyuki
+ for you... 前野智昭 for you... Maeno Tomoaki
+ 恋の奴隷 奥村チヨ Koi no Dorei Okumura Chiyo
+ サン・トワ・マミー 後藤真希 Sans toi ma mie Gotō Maki -->
+ <software name="ekaraweb12f" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 4) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set4.u1" size="0x100000" crc="4df715fe" sha1="8aa22b8f1823c186124c4e083efc94d3b1adb5f9"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ Time after time~花舞う街で~ 倉木麻衣 Time after time – Hana Mau Machi de Kuraki Mai
+ Stay by my side 倉木麻衣 Stay by my side Kuraki Mai
+ 冷たい海 倉木麻衣 Tsumetai Umi Kuraki Mai
+ Reach for the sky 倉木麻衣 Reach for the sky Kuraki Mai
+ さくらんぼ 大塚愛 Sakuranbo Ōtsuka Ai
+ Dream×Dream 愛内里菜 Dream×Dream Aiuchi Rina
+ I can’t stop my love for you♥ 愛内里菜 I can’t stop my love for you♥ Aiuchi Rina
+ MESSAGE 上戸彩 Message Ueto Aya
+ 愛のために。 上戸彩 Ai no Tame ni. Ueto Aya
+ 無色 上原あずみ Mushoku Uehara Azumi
+ 謎 小松未歩 Nazo Komatsu Miho
+ かたちあるもの 柴咲コウ Katachi Arumono Shibasaki Kō -->
+ <software name="ekaraweb12g" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 5) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set5.u1" size="0x100000" crc="2d05d13d" sha1="252a74157e403e61107945d05e72d0c0d7b8f1c1"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 悪女 中島みゆき Akujo Nakashima Miyuki
+ あの鐘を鳴らすのはあなた 和田アキ子 Ano Kane o Narasu no wa Anata Wada Akiko
+ あの日にかえりたい 松任谷由実(荒井由実) Ano Nichi ni Kaeritai Matsutōya Yumi (Arai Yumi)
+ 勝手にしやがれ 沢田研二 Katte ni Shiyagare Sawada Kenji
+ 季節の中で 松山千 Kisetsu no Naka de Matsuyama Chiharu
+ シングル・アゲイン 竹内まりや Single Again Takeuchi Mariya
+ Story AI Story AI
+ 未来の地図 Mi Mirai no Chizu Mi
+ 明日へ架ける橋 倉木麻衣 Ashita e Kakeru Hashi Kuraki Mai
+ feel my soul YUI feel my soul YUI
+ P.S ♥ MY SUNSHINE 倉木麻衣 P.S ♥ My Sunshine Kuraki Mai
+ 金色のライオン 長渕剛 Kiniro no Lion Nagabuchi Tsuyoshi -->
+ <software name="ekaraweb12h" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 6) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set6.u1" size="0x100000" crc="cc7d21bc" sha1="14da4da1af6c9c36fac03d80a596b033347aae30"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 「いちご白書」をもう一度 バンバン “Ichigo Hakusho” o Mōichido Bang Bang
+ 卒業写真 松任谷由実(荒井由実) Sotsugyō Shashin Matsutōya Yumi (Arai Yumi)
+ 神田川 南こうせつとかぐや姫 Kandagawa Minami Kōsetsu to Kaguyahime
+ どうにもとまらない~ノンストップ 山本リンダ Dōnimo Tomaranai – Nonstop Yamamoto Linda
+ HERO~ヒーローになる時、それは今~ 甲斐バンド Hero (Hero ni naru toki, sore wa ima) Kai Band
+ ルビーの指環 寺尾聰 Ruby no Yubiwa Terao Akira
+ みちづれ 渡哲也 Michizure Watari Tetsuya
+ ダンシング・オールナイト もんた&ブラザーズ Dancing All Night Monta & Brothers
+ 結婚しようよ 吉田拓郎 Kekkon Shiyō yo Yoshida Takurō
+ 心の旅 チューリップ Kokoro no Tabi TULIP
+ ふたり酒 川中美幸 Futari Sake Kawanaka Miyuki
+ かもめはかもめ 研ナオコ Kamome wa Kamome Ken Naoko -->
+ <software name="ekaraweb12i" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 7) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set7.u1" size="0x100000" crc="6230d3d2" sha1="8b9ca56d64b37cf96cc97f953d2ad2525c4ee98e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ いつかのメリークリスマス B'z Itsuka no Merry Christmas B'z
+ 愛しい人よ Good Night... B'z Itoshī Hito yo Good Night... B'z
+ 夕暮れ THE BLUE HEARTS Yūgure The Blue Hearts
+ ラブレター THE BLUE HEARTS Love Letter The Blue Hearts
+ 終わらない歌 THE BLUE HEARTS Owaranai Uta The Blue Hearts
+ 情熱の薔薇 THE BLUE HEARTS Jōnetsu no Bara The Blue Hearts
+ My Gift to You CHEMISTRY meets S.O.S My Gift to You Chemistry meets S.O.S
+ 涙 ケツメイシ Namida Ketsumeishi
+ さくら ケツメイシ Sakura Ketsumeishi
+ squall 福山雅治 squall Fukuyama Masaharu
+ 恋 松山千春 Koi Matsuyama Chiharu
+ 離したくはない T-BOLAN Hanashitaku wa Nai T-Bolan -->
+ <software name="ekaraweb12j" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 8) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set8.u1" size="0x100000" crc="fd6f4039" sha1="d8b5e4dab616aaa2ae63ab14a919ca4b0e395614"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 白い恋人達 桑田佳祐 Shiroi Koibitotachi Kuwata Keisuke
+ ずっと2人で… GLAY Zutto Futari de... GLAY
+ 夏色 ゆず Natsuiro Yuzu
+ One more time,One more chance 山崎まさよし One more time, One more chance Yamazaki Masayoshi
+ 抱きしめたい Mr.Children Dakishimetai Mr.Children
+ 大阪で生まれた女 BORO Ōsaka de Umareta Onna BORO
+ Automatic 宇多田ヒカル Automatic Utada Hikaru
+ Don’t wanna cry 安室奈美恵 Don’t wanna cry Amuro Namie
+ 花の首飾り ザ・タイガース Hana no Kubikazari The Tigers
+ 恋人よ 五輪真弓 Koibito yo Itsuwa Mayumi
+ 時間よ止まれ 矢沢永吉 Jikan yo Tomare Yazawa Eikichi
+ 異邦人 TAK MATSUMOTO featuring ZARD Ihōjin Tak Matsumoto featuring ZARD
+ -->
+ <software name="ekaraweb12k" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 9) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_12m_12_set9.u1" size="0x100000" crc="52535bbf" sha1="598734744c661226e4be79ec44d75ad556c05262"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ おもちゃのチャチャチャ 童謡 Omacha no Cha Cha Cha Dōyō
+ キラキラぼし 童謡 Kirakira Boshi Dōyō
+ ドラえもんのうた 大杉久美子 Doraemon no Uta Ōsuki Kumiko
+ DANZEN!ふたりはプリキュアVer.MaxHeart 五條真由美 DANZEN! Futari wa PreCure Ver.MaxHeart Gojō Mayumi
+ マツケンサンバⅡ 松平健 Matsuken Samba II Matsudairi Ken
+ ハム太郎とっとこうた ハムちゃんず Hamtaro Tottokōta Hamuchans
+ サザエさん 宇野ゆう子 Sazae-san Uno Yūko
+ 世界に一つだけの花 SMAP Sekai ni Hitotsu Dake no Hana SMAP
+ アイ〜ン!ダンスの唄 バカ殿様とミニモニ姫。 Ai~n! Dance no Uta Bakatonosama to mini-moni-hime
+ きよしのズンドコ節 氷川きよし Kiyoshi no Zundoko-Bushi Hikawa Kiyoshi
+ おさかな天国 柴矢裕美 O-Sakana no Tengoku Shibaya Hiromi
+ さんぽ 井上あずみ Sanpo Inoue Azumi -->
+ <software name="ekaraweb12l" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 12 songs, set 10) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekara_user_blue.bin" size="0x100000" crc="2d36538d" sha1="455a16aea46e710a1a1f58b31341a5fc647426fe"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ Venus タッキー&翼 Venus Tackey & Tsubasa
+ SMILY 大塚愛 SMILY Ōtsuka Ai
+ 恋☆カナ 月島きらりstarring久住小春(モーニング娘。) Koi☆Kana Tsukishima Kirari starring Kusumi Koharu (Morning Musume)
+ 宙船(そらふね) ΤΟΚΙΟ Sorafune Tokio
+ 粉雪 レミオロメン Konayuki Remioromen
+ YUME日和 島谷ひとみ Yume Biyori Shimatani Hitomi
+ ありがとう SMAP Arigatō SMAP
+ おどるポンポコリン B.B.クィーンズ Odoru Pompokolin B.B.QUEENS
+ 夢をあきらめないで 岡村孝子 Yume o Akiramenaide Okamura Takako
+ 永遠にともに コブクロ Towa ni Tomo ni KOBUKURO
+ 羞恥心 羞恥心 Shūchishin Shūchishin -->
+ <software name="ekaraweb12m" cloneof="ekaraweb12">
+ <description>e-kara Web cartridge 12M (used, with 11 songs) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekara_user_orange.bin" size="0x100000" crc="5614327d" sha1="5c415fe2529f0ee084914fe0ddb35d2ef161c939"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 世界に一つだけの花 SMAP Sekai ni Hitotsu Dake no Hana SMAP
+ さくらんぼ 大塚愛 Sakuranbo Ōtsuka Ai
+ あ~よかった 花*花 Ah Yokatta hana*hana
+ ハッスル かいけつゾロリ(山寺宏一) Hustle Kaiketsu Zorori (Yamadera Kōichi)
+ アララの呪文 ちびまる子ちゃん with 爆チュー問題 Arara no Jumon Chibi Maruko-chan with Bakuchū Mondai
+ ミニハムずの愛の唄 ミニハムず Minihams no Ai no Uta Minihams
+ ミニモニ。ジャンケンぴょん! ミニモニ。 mini-moni Jankenpyon! mini-moni
+ 大きな古時計 童謡 Ōkina Furudokei Dōyō -->
+ <software name="ekaraweb8">
+ <description>e-kara Web cartridge 8M (used, with 8 songs, set 1) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_8m_8_set1.u1" size="0x100000" crc="28a5a5c7" sha1="408ef97a8a42e286cb18b9df61ac575a24b1462d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ I Was Born To Love You[アイ・ワズ・ボーン・トゥ・ラヴ・ユー] QUEEN I Was Born To Love You Queen
+ Alone Again(Naturally)[アローン・アゲイン] Gilbert O’Sullivan Alone Again (Naturally) Gilbert O’Sullivan
+ I Don’t Want To Miss A Thing[ミス・ア・シング] Aerosmith I Don’t Want to Miss a Thing Aerosmith
+ Yesterday Once More[イエスタデイ・ワンス・モア] CARPENTERS Yesterday Once More Carpenters
+ Tears In Heaven[ティアーズ・イン・ヘヴン] Eric Clapton Tears in Heaven Eric Clapton
+ Top Of The World[トップ・オブ・ザ・ワールド] Carpenters Top of the World Carpenters
+ Last Christmas[ラスト・クリスマス] Wham! Last Christmas Wham!
+ Honesty[オネスティ] Billy Joel Honesty Billy Joel -->
+ <software name="ekaraweb8a" cloneof="ekaraweb8">
+ <description>e-kara Web cartridge 8M (used, with 8 songs, set 2) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_8m_8_set2.u1" size="0x100000" crc="abc09a19" sha1="8b65e4b00a8757a0df3965548fd52e6b12b92756"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ 3年目の浮気 ヒロシ&キーボー 3-nen-me no Uwaki Hiroshi & Keybow
+ CHA-LA HEAD-CHA-LA 影山ヒロノブ Cha-La Head-Cha-La Kageyama Hironobu
+ DANCE!おジャ魔女 MAHO堂 Dance! Ojamajo Maho-Dō
+ ポルカ・オ・ドルカ ニャース(犬山犬子)&ノルソル合唱団 Polka O Dolka Meowth (Inuyama Inuko) & Nolsol Gasshō-dan
+ サザエさん 宇野ゆう子 Sazae-san Uno Yūko
+ さくら(独唱) 森山直太朗 Sakura (dokushō) Moriyama Naotarō
+ アタックNo.1 2005 福田沙紀 Attack No.1 2005 Fukuda Saki
+ 虹 福山雅治 Niji Fukuyama Masaharu -->
+ <software name="ekaraweb8b" cloneof="ekaraweb8">
+ <description>e-kara Web cartridge 8M (used, with 8 songs, set 3) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_8m_8_set3.u1" size="0x100000" crc="a97521cb" sha1="d5b826e7313697491cbcfab243439899a46f17c4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- this one has some songs programmed into it:
+ SWEET MEMORIES 松田聖子 Sweet Memories Matsuda Seiko
+ 出逢った頃のように Every Little Thing Deatta Koro no Yō ni Every Little Thing
+ Shine We Are! BoA Shine We Are! BoA
+ 長い間 Kiroro Nagai Aida Kiroro
+ 雪の華 中島美嘉 Yuki no Hana Nakashima Mika
+ 世界に一つだけの花 SMAP Sekai ni Hitotsu Dake no Hana SMAP
+ ハム太郎とっとこうた ハムちゃんず Hamtaro Tottokōta Hamuchans
+ 乙女 パスタに感動 タンポポ Otome Pasta ni Kando Tanpopo -->
+ <software name="ekaraweb8c" cloneof="ekaraweb8">
+ <description>e-kara Web cartridge 8M (used, with 8 songs, set 4) (Japan)</description>
+ <year>2003</year>
+ <publisher>Takara</publisher>
+ <sharedfeat name="compatibility" value="EKARA"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="ekaraweb_8m_8_set4.u1" size="0x100000" crc="4e7c04d8" sha1="f81c134849cd846ede0106bf355c71408a2771a1"/>
+ </dataarea>
+ </part>
+ </software>
<!-- ********************************************************************************************************************************************************************** -->
@@ -3614,4 +4147,52 @@ license:CC0-1.0
</part>
</software>
+ <software name="kr_vol2">
+ <description>i-Singer Volume 2 (Korea)</description>
+ <year>2002</year>
+ <publisher>Takara / Sonokong</publisher>
+ <sharedfeat name="compatibility" value="ISINGER"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="kr-ec002.u1" size="0x100000" crc="0c060c0f" sha1="82e0757a380617008b7313cf6b380e16804f7862"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kr_vol3">
+ <description>i-Singer Volume 3 (Korea)</description>
+ <year>2002</year>
+ <publisher>Takara / Sonokong</publisher>
+ <sharedfeat name="compatibility" value="ISINGER"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="kr-ec003.u1" size="0x100000" crc="928b97a6" sha1="5900cda733298b258b114c5452e1c02b0d90cee4"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kr_vol11">
+ <description>i-Singer Volume 11 (Korea)</description>
+ <year>2002</year>
+ <publisher>Takara / Sonokong</publisher>
+ <sharedfeat name="compatibility" value="ISINGER"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="kr-ec011.u1" size="0x100000" crc="effe2356" sha1="57417803b25273439fb5537a7d5aca340988eea8"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kr_vol14">
+ <description>i-Singer Volume 14 (Korea)</description>
+ <year>2002</year>
+ <publisher>Takara / Sonokong</publisher>
+ <sharedfeat name="compatibility" value="ISINGER"/>
+ <part name="cart" interface="ekara_cart">
+ <dataarea name="rom" size="0x100000">
+ <rom name="kr-s001.u1" size="0x100000" crc="8a43e1b6" sha1="69eae20a395aee941a5da3a02e6c2dc6feee2391"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/electron_cass.xml b/hash/electron_cass.xml
index 61c70c851a0..1873b2d9691 100644
--- a/hash/electron_cass.xml
+++ b/hash/electron_cass.xml
@@ -376,7 +376,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="arcadiang" cloneof="arcadian">
- <description>Arcadians (Ger)</description>
+ <description>Arcadians (German)</description>
<year>1984</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLG14" />
@@ -586,7 +586,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="treeknowg" cloneof="treeknow">
- <description>Baum der Weisheit (Ger)</description>
+ <description>Baum der Weisheit (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLE04" />
@@ -1820,7 +1820,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="introcasg" cloneof="introcas">
- <description>Einfuhrungs Kassette (Ger)</description>
+ <description>Einfuhrungs Kassette (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
@@ -3141,7 +3141,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="forthg">
- <description>FORTH (Ger)</description>
+ <description>FORTH (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLL01" />
@@ -3176,9 +3176,9 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="fraka" cloneof="frak">
- <description>Frak! (Alternative)</description>
+ <description>Frak! (Alternative Software)</description>
<year>198?</year>
- <publisher>Alternative</publisher>
+ <publisher>Alternative Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="24221">
<rom name="frakv11_e.uef" size="24221" crc="f1330371" sha1="7d8c89dcd98bc0a74ea72b479ee1da0ea4de5595"/>
@@ -3233,7 +3233,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="freefallg" cloneof="freefall">
- <description>Freier Fall (Ger)</description>
+ <description>Freier Fall (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLG22" />
@@ -3521,9 +3521,9 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="ggoochcra" cloneof="ggoochcr">
- <description>Graham Gooch's Test Cricket (Alternative)</description>
+ <description>Graham Gooch's Test Cricket (Alternative Software)</description>
<year>198?</year>
- <publisher>Alternative</publisher>
+ <publisher>Alternative Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="18383">
<rom name="grahamgoochmatchcricket-arr_e.uef" size="18383" crc="11762a0b" sha1="24feb73957b628c2617e792e7eca19cc45706a19"/>
@@ -3642,7 +3642,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="haushalt">
- <description>Haushaltbudget (Ger)</description>
+ <description>Haushaltbudget (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLB05" />
@@ -4242,7 +4242,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="cgraphsg">
- <description>Kreative Graphiken (Ger)</description>
+ <description>Kreative Graphiken (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLX01" />
@@ -4295,7 +4295,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="lispg" cloneof="lisp">
- <description>LISP (Ger)</description>
+ <description>LISP (German)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLL02" />
@@ -4581,7 +4581,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="meteorsg" cloneof="meteors">
- <description>Meteors (Ger)</description>
+ <description>Meteors (German)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLG13" />
@@ -5064,7 +5064,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="peekocg" cloneof="peekoc">
- <description>Peeko-Computer (Ger)</description>
+ <description>Peeko-Computer (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GBE02" />
@@ -5277,7 +5277,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="plantoidg" cloneof="plantoid">
- <description>Planetoid (Ger)</description>
+ <description>Planetoid (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLG15" />
@@ -6295,7 +6295,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="spascal">
- <description>S-Pascal (Ger)</description>
+ <description>S-Pascal (German)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLL08" />
@@ -6520,7 +6520,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="sshipcomg" cloneof="sshipcom">
- <description>Starship Command (Ger)</description>
+ <description>Starship Command (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLG22" />
@@ -6985,7 +6985,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="dskdiaryg" cloneof="dskdiary">
- <description>Terminkalendar (Ger)</description>
+ <description>Terminkalendar (German)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLB01" />
@@ -7868,9 +7868,9 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="zalagaa" cloneof="zalaga">
- <description>Zalaga (Alternative)</description>
+ <description>Zalaga (Alternative Software)</description>
<year>198?</year>
- <publisher>Alternative</publisher>
+ <publisher>Alternative Software</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="20293">
<rom name="zalaga-alrr_e.uef" size="20293" crc="99ae102c" sha1="b933fcda2f10e846235bc21aabc7e030599e4a9f"/>
@@ -7890,7 +7890,7 @@ Model B-compatible cassette images are now listed exclusively in bbc_cass.xml, r
</software>
<software name="zeichenb">
- <description>Zeichenbrett (Ger)</description>
+ <description>Zeichenbrett (German)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<info name="release" value="GLX03" />
diff --git a/hash/ep64_cart.xml b/hash/ep64_cart.xml
index c78863786cf..706b0a4cfa0 100644
--- a/hash/ep64_cart.xml
+++ b/hash/ep64_cart.xml
@@ -43,7 +43,7 @@ license:CC0-1.0
</software>
<software name="basic21" cloneof="basic">
- <description>BASIC (v2.1, Alt)</description>
+ <description>BASIC (v2.1, alt)</description>
<year>198?</year>
<publisher>Intelligent Software</publisher>
diff --git a/hash/ep64_flop.xml b/hash/ep64_flop.xml
index 04831f4986b..dd13d335bfa 100644
--- a/hash/ep64_flop.xml
+++ b/hash/ep64_flop.xml
@@ -48,7 +48,7 @@ license:CC0-1.0
</software>
<software name="gamesbaa" cloneof="gamesba">
- <description>Games Compilation Disk: BASIC (Alt)</description>
+ <description>Games Compilation Disk: BASIC (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -72,7 +72,7 @@ license:CC0-1.0
</software>
<software name="games01a" cloneof="games01">
- <description>Games Compilation Disk 01 (Alt)</description>
+ <description>Games Compilation Disk 01 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -96,7 +96,7 @@ license:CC0-1.0
</software>
<software name="games02a" cloneof="games02">
- <description>Games Compilation Disk 02 (Alt)</description>
+ <description>Games Compilation Disk 02 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -120,7 +120,7 @@ license:CC0-1.0
</software>
<software name="games03a" cloneof="games03">
- <description>Games Compilation Disk 03 (Alt)</description>
+ <description>Games Compilation Disk 03 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -144,7 +144,7 @@ license:CC0-1.0
</software>
<software name="games04a" cloneof="games04">
- <description>Games Compilation Disk 04 (Alt)</description>
+ <description>Games Compilation Disk 04 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -168,7 +168,7 @@ license:CC0-1.0
</software>
<software name="games05a" cloneof="games05">
- <description>Games Compilation Disk 05 (Alt)</description>
+ <description>Games Compilation Disk 05 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -192,7 +192,7 @@ license:CC0-1.0
</software>
<software name="games06a" cloneof="games06">
- <description>Games Compilation Disk 06 (Alt)</description>
+ <description>Games Compilation Disk 06 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -216,7 +216,7 @@ license:CC0-1.0
</software>
<software name="games07a" cloneof="games07">
- <description>Games Compilation Disk 07 (Alt)</description>
+ <description>Games Compilation Disk 07 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -240,7 +240,7 @@ license:CC0-1.0
</software>
<software name="games08a" cloneof="games08">
- <description>Games Compilation Disk 08 (Alt)</description>
+ <description>Games Compilation Disk 08 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -264,7 +264,7 @@ license:CC0-1.0
</software>
<software name="games09a" cloneof="games09">
- <description>Games Compilation Disk 09 (Alt)</description>
+ <description>Games Compilation Disk 09 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -288,7 +288,7 @@ license:CC0-1.0
</software>
<software name="games10a" cloneof="games10">
- <description>Games Compilation Disk 10 (Alt)</description>
+ <description>Games Compilation Disk 10 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -312,7 +312,7 @@ license:CC0-1.0
</software>
<software name="games11a" cloneof="games11">
- <description>Games Compilation Disk 11 (Alt)</description>
+ <description>Games Compilation Disk 11 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -336,7 +336,7 @@ license:CC0-1.0
</software>
<software name="games12a" cloneof="games12">
- <description>Games Compilation Disk 12 (Alt)</description>
+ <description>Games Compilation Disk 12 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -360,7 +360,7 @@ license:CC0-1.0
</software>
<software name="games13a" cloneof="games13">
- <description>Games Compilation Disk 13 (Alt)</description>
+ <description>Games Compilation Disk 13 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -384,7 +384,7 @@ license:CC0-1.0
</software>
<software name="games14a" cloneof="games14">
- <description>Games Compilation Disk 14 (Alt)</description>
+ <description>Games Compilation Disk 14 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -408,7 +408,7 @@ license:CC0-1.0
</software>
<software name="games15a" cloneof="games15">
- <description>Games Compilation Disk 15 (Alt)</description>
+ <description>Games Compilation Disk 15 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -432,7 +432,7 @@ license:CC0-1.0
</software>
<software name="games16a" cloneof="games16">
- <description>Games Compilation Disk 16 (Alt)</description>
+ <description>Games Compilation Disk 16 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -456,7 +456,7 @@ license:CC0-1.0
</software>
<software name="games17a" cloneof="games17">
- <description>Games Compilation Disk 17 (Alt)</description>
+ <description>Games Compilation Disk 17 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -480,7 +480,7 @@ license:CC0-1.0
</software>
<software name="games18a" cloneof="games18">
- <description>Games Compilation Disk 18 (Alt)</description>
+ <description>Games Compilation Disk 18 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -504,7 +504,7 @@ license:CC0-1.0
</software>
<software name="games19a" cloneof="games19">
- <description>Games Compilation Disk 19 (Alt)</description>
+ <description>Games Compilation Disk 19 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -528,7 +528,7 @@ license:CC0-1.0
</software>
<software name="games20a" cloneof="games20">
- <description>Games Compilation Disk 20 (Alt)</description>
+ <description>Games Compilation Disk 20 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -552,7 +552,7 @@ license:CC0-1.0
</software>
<software name="games21a" cloneof="games21">
- <description>Games Compilation Disk 21 (Alt)</description>
+ <description>Games Compilation Disk 21 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -576,7 +576,7 @@ license:CC0-1.0
</software>
<software name="games22a" cloneof="games22">
- <description>Games Compilation Disk 22 (Alt)</description>
+ <description>Games Compilation Disk 22 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -600,7 +600,7 @@ license:CC0-1.0
</software>
<software name="games23a" cloneof="games23">
- <description>Games Compilation Disk 23 (Alt)</description>
+ <description>Games Compilation Disk 23 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -624,7 +624,7 @@ license:CC0-1.0
</software>
<software name="games24a" cloneof="games24">
- <description>Games Compilation Disk 24 (Alt)</description>
+ <description>Games Compilation Disk 24 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -648,7 +648,7 @@ license:CC0-1.0
</software>
<software name="games25a" cloneof="games25">
- <description>Games Compilation Disk 25 (Alt)</description>
+ <description>Games Compilation Disk 25 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -672,7 +672,7 @@ license:CC0-1.0
</software>
<software name="games26a" cloneof="games26">
- <description>Games Compilation Disk 26 (Alt)</description>
+ <description>Games Compilation Disk 26 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -696,7 +696,7 @@ license:CC0-1.0
</software>
<software name="games27a" cloneof="games27">
- <description>Games Compilation Disk 27 (Alt)</description>
+ <description>Games Compilation Disk 27 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -720,7 +720,7 @@ license:CC0-1.0
</software>
<software name="games28a" cloneof="games28">
- <description>Games Compilation Disk 28 (Alt)</description>
+ <description>Games Compilation Disk 28 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -744,7 +744,7 @@ license:CC0-1.0
</software>
<software name="games29a" cloneof="games29">
- <description>Games Compilation Disk 29 (Alt)</description>
+ <description>Games Compilation Disk 29 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -768,7 +768,7 @@ license:CC0-1.0
</software>
<software name="games30a" cloneof="games30">
- <description>Games Compilation Disk 30 (Alt)</description>
+ <description>Games Compilation Disk 30 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -792,7 +792,7 @@ license:CC0-1.0
</software>
<software name="games31a" cloneof="games31">
- <description>Games Compilation Disk 31 (Alt)</description>
+ <description>Games Compilation Disk 31 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -816,7 +816,7 @@ license:CC0-1.0
</software>
<software name="games32a" cloneof="games32">
- <description>Games Compilation Disk 32 (Alt)</description>
+ <description>Games Compilation Disk 32 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -840,7 +840,7 @@ license:CC0-1.0
</software>
<software name="games33a" cloneof="games33">
- <description>Games Compilation Disk 33 (Alt)</description>
+ <description>Games Compilation Disk 33 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -864,7 +864,7 @@ license:CC0-1.0
</software>
<software name="games34a" cloneof="games34">
- <description>Games Compilation Disk 34 (Alt)</description>
+ <description>Games Compilation Disk 34 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -888,7 +888,7 @@ license:CC0-1.0
</software>
<software name="games35a" cloneof="games35">
- <description>Games Compilation Disk 35 (Alt)</description>
+ <description>Games Compilation Disk 35 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -912,7 +912,7 @@ license:CC0-1.0
</software>
<software name="games36a" cloneof="games36">
- <description>Games Compilation Disk 36 (Alt)</description>
+ <description>Games Compilation Disk 36 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -936,7 +936,7 @@ license:CC0-1.0
</software>
<software name="games37a" cloneof="games37">
- <description>Games Compilation Disk 37 (Alt)</description>
+ <description>Games Compilation Disk 37 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -960,7 +960,7 @@ license:CC0-1.0
</software>
<software name="games38a" cloneof="games38">
- <description>Games Compilation Disk 38 (Alt)</description>
+ <description>Games Compilation Disk 38 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -984,7 +984,7 @@ license:CC0-1.0
</software>
<software name="games39a" cloneof="games39">
- <description>Games Compilation Disk 39 (Alt)</description>
+ <description>Games Compilation Disk 39 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1008,7 +1008,7 @@ license:CC0-1.0
</software>
<software name="games40a" cloneof="games40">
- <description>Games Compilation Disk 40 (Alt)</description>
+ <description>Games Compilation Disk 40 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1032,7 +1032,7 @@ license:CC0-1.0
</software>
<software name="games41a" cloneof="games41">
- <description>Games Compilation Disk 41 (Alt)</description>
+ <description>Games Compilation Disk 41 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1056,7 +1056,7 @@ license:CC0-1.0
</software>
<software name="games42a" cloneof="games42">
- <description>Games Compilation Disk 42 (Alt)</description>
+ <description>Games Compilation Disk 42 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1080,7 +1080,7 @@ license:CC0-1.0
</software>
<software name="games43a" cloneof="games43">
- <description>Games Compilation Disk 43 (Alt)</description>
+ <description>Games Compilation Disk 43 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1104,7 +1104,7 @@ license:CC0-1.0
</software>
<software name="games44a" cloneof="games44">
- <description>Games Compilation Disk 44 (Alt)</description>
+ <description>Games Compilation Disk 44 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1128,7 +1128,7 @@ license:CC0-1.0
</software>
<software name="games45a" cloneof="games45">
- <description>Games Compilation Disk 45 (Alt)</description>
+ <description>Games Compilation Disk 45 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1152,7 +1152,7 @@ license:CC0-1.0
</software>
<software name="games46a" cloneof="games46">
- <description>Games Compilation Disk 46 (Alt)</description>
+ <description>Games Compilation Disk 46 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1176,7 +1176,7 @@ license:CC0-1.0
</software>
<software name="games47a" cloneof="games47">
- <description>Games Compilation Disk 47 (Alt)</description>
+ <description>Games Compilation Disk 47 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1200,7 +1200,7 @@ license:CC0-1.0
</software>
<software name="games48a" cloneof="games48">
- <description>Games Compilation Disk 48 (Alt)</description>
+ <description>Games Compilation Disk 48 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1224,7 +1224,7 @@ license:CC0-1.0
</software>
<software name="games49a" cloneof="games49">
- <description>Games Compilation Disk 49 (Alt)</description>
+ <description>Games Compilation Disk 49 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1248,7 +1248,7 @@ license:CC0-1.0
</software>
<software name="games50a" cloneof="games50">
- <description>Games Compilation Disk 50 (Alt)</description>
+ <description>Games Compilation Disk 50 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1272,7 +1272,7 @@ license:CC0-1.0
</software>
<software name="games51a" cloneof="games51">
- <description>Games Compilation Disk 51 (Alt)</description>
+ <description>Games Compilation Disk 51 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1296,7 +1296,7 @@ license:CC0-1.0
</software>
<software name="games52a" cloneof="games52">
- <description>Games Compilation Disk 52 (Alt)</description>
+ <description>Games Compilation Disk 52 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1320,7 +1320,7 @@ license:CC0-1.0
</software>
<software name="games53a" cloneof="games53">
- <description>Games Compilation Disk 53 (Alt)</description>
+ <description>Games Compilation Disk 53 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1344,7 +1344,7 @@ license:CC0-1.0
</software>
<software name="games54a" cloneof="games54">
- <description>Games Compilation Disk 54 (Alt)</description>
+ <description>Games Compilation Disk 54 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1368,7 +1368,7 @@ license:CC0-1.0
</software>
<software name="games55a" cloneof="games55">
- <description>Games Compilation Disk 55 (Alt)</description>
+ <description>Games Compilation Disk 55 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1392,7 +1392,7 @@ license:CC0-1.0
</software>
<software name="games56a" cloneof="games56">
- <description>Games Compilation Disk 56 (Alt)</description>
+ <description>Games Compilation Disk 56 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1416,7 +1416,7 @@ license:CC0-1.0
</software>
<software name="games57a" cloneof="games57">
- <description>Games Compilation Disk 57 (Alt)</description>
+ <description>Games Compilation Disk 57 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1440,7 +1440,7 @@ license:CC0-1.0
</software>
<software name="games58a" cloneof="games58">
- <description>Games Compilation Disk 58 (Alt)</description>
+ <description>Games Compilation Disk 58 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1464,7 +1464,7 @@ license:CC0-1.0
</software>
<software name="games59a" cloneof="games59">
- <description>Games Compilation Disk 59 (Alt)</description>
+ <description>Games Compilation Disk 59 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1488,7 +1488,7 @@ license:CC0-1.0
</software>
<software name="games60a" cloneof="games60">
- <description>Games Compilation Disk 60 (Alt)</description>
+ <description>Games Compilation Disk 60 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1512,7 +1512,7 @@ license:CC0-1.0
</software>
<software name="games61a" cloneof="games61">
- <description>Games Compilation Disk 61 (Alt)</description>
+ <description>Games Compilation Disk 61 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1536,7 +1536,7 @@ license:CC0-1.0
</software>
<software name="games62a" cloneof="games62">
- <description>Games Compilation Disk 62 (Alt)</description>
+ <description>Games Compilation Disk 62 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1560,7 +1560,7 @@ license:CC0-1.0
</software>
<software name="games63a" cloneof="games63">
- <description>Games Compilation Disk 63 (Alt)</description>
+ <description>Games Compilation Disk 63 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1584,7 +1584,7 @@ license:CC0-1.0
</software>
<software name="games64a" cloneof="games64">
- <description>Games Compilation Disk 64 (Alt)</description>
+ <description>Games Compilation Disk 64 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1608,7 +1608,7 @@ license:CC0-1.0
</software>
<software name="games65a" cloneof="games65">
- <description>Games Compilation Disk 65 (Alt)</description>
+ <description>Games Compilation Disk 65 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1632,7 +1632,7 @@ license:CC0-1.0
</software>
<software name="games66a" cloneof="games66">
- <description>Games Compilation Disk 66 (Alt)</description>
+ <description>Games Compilation Disk 66 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1656,7 +1656,7 @@ license:CC0-1.0
</software>
<software name="games67a" cloneof="games67">
- <description>Games Compilation Disk 67 (Alt)</description>
+ <description>Games Compilation Disk 67 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1680,7 +1680,7 @@ license:CC0-1.0
</software>
<software name="games68a" cloneof="games68">
- <description>Games Compilation Disk 68 (Alt)</description>
+ <description>Games Compilation Disk 68 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1704,7 +1704,7 @@ license:CC0-1.0
</software>
<software name="games69a" cloneof="games69">
- <description>Games Compilation Disk 69 (Alt)</description>
+ <description>Games Compilation Disk 69 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1728,7 +1728,7 @@ license:CC0-1.0
</software>
<software name="games70a" cloneof="games70">
- <description>Games Compilation Disk 70 (Alt)</description>
+ <description>Games Compilation Disk 70 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1752,7 +1752,7 @@ license:CC0-1.0
</software>
<software name="games71a" cloneof="games71">
- <description>Games Compilation Disk 71 (Alt)</description>
+ <description>Games Compilation Disk 71 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1776,7 +1776,7 @@ license:CC0-1.0
</software>
<software name="games72a" cloneof="games72">
- <description>Games Compilation Disk 72 (Alt)</description>
+ <description>Games Compilation Disk 72 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1800,7 +1800,7 @@ license:CC0-1.0
</software>
<software name="games73a" cloneof="games73">
- <description>Games Compilation Disk 73 (Alt)</description>
+ <description>Games Compilation Disk 73 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1824,7 +1824,7 @@ license:CC0-1.0
</software>
<software name="games74a" cloneof="games74">
- <description>Games Compilation Disk 74 (Alt)</description>
+ <description>Games Compilation Disk 74 (alt)</description>
<year>198?</year>
<publisher>EP Forever Forum</publisher>
@@ -1944,7 +1944,7 @@ license:CC0-1.0
</software>
<software name="isdosa" cloneof="isdos">
- <description>IS-DOS (Alt)</description>
+ <description>IS-DOS (alt)</description>
<year>198?</year>
<publisher>Intelligent Software</publisher>
diff --git a/hash/evio.xml b/hash/evio.xml
index 61c644b1222..5e82d65533d 100644
--- a/hash/evio.xml
+++ b/hash/evio.xml
@@ -32,7 +32,62 @@ license:CC0-1.0
*eM17 - Minna no evio (orange)
*eM18 - Evio Challenge! (red/pink)
- (more?)
+
+
+ Cartridge Pinout
+
+ A01|NC
+ A02|GND
+ A03|GND
+ A04|A16
+ A05|A17
+ A06|A18
+ A07|A19
+ A08|A20
+ A09|A21
+ A10|A22
+ A11|A23
+ A12|GND
+ A13|TO A18
+ A14|/CE
+ A15|NC (SEEPROM 6)
+ A16|NC (SEEPROM 5)
+ A17|NC
+ A18|TO A13 (internal ROM /CE)
+ A19|/OE
+ A20|NC (/WE)
+ A21|VCC (/RP)
+ A22|D00
+ A23|D01
+ A24|D02
+ A25|D03
+ A26|VCC
+ B01|NC
+ B02|VCC
+ B03|VCC
+ B04|A15
+ B05|A14
+ B06|A13
+ B07|A12
+ B08|A11
+ B09|A10
+ B10|A09
+ B11|A08
+ B12|A07
+ B13|A06
+ B14|A05
+ B15|A04
+ B16|A03
+ B17|A02
+ B18|A01
+ B19|A00
+ B20|VCC
+ B21|GND
+ B22|D07
+ B23|D06
+ B24|D05
+ B25|D04
+ B26|GND
-->
diff --git a/hash/famicom_flop.xml b/hash/famicom_flop.xml
index c73f929d085..b8915e03e87 100644
--- a/hash/famicom_flop.xml
+++ b/hash/famicom_flop.xml
@@ -510,6 +510,38 @@ Re-releases (probably the same as the original release, but listed while waiting
</part>
</software>
+ <software name="dgolf">
+ <description>NESert Golfing (v1.5)</description>
+ <year>2022</year>
+ <publisher>rainwarrior</publisher>
+ <info name="release" value="20221014" /> <!-- From NESertGolfing Git tag -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="65500">
+ <rom name="dgolf.fds" size="65500" crc="e9e99977" sha1="d84cc8a87a9f078318385632fe91f8b0d36add19" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- Rebuilt from Git using cc65 commit 80a43d732dc9551ad84343ea9644d8fab7ec0bd9. A
+ byte-identical copy of 1.5 was reproduced with this toolchain, giving high confidence that
+ the 1.4 rebuild is the same as what was released. Without an existent online copy, however,
+ this cannot be verified.
+ -->
+ <software name="dgolf14" cloneof="dgolf">
+ <description>NESert Golfing (v1.4)</description>
+ <year>2021</year>
+ <publisher>rainwarrior</publisher>
+ <notes><![CDATA[
+ An original download should be located to verify and/or update the hash.
+ ]]></notes>
+ <info name="release" value="20210605" /> <!-- From NESertGolfing Git tag -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="65500">
+ <rom name="dgolf 1.4.fds" size="65500" crc="912cd8f8" sha1="2bcf3d9836e390d28371823f4cbcbca09cdb7677" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Save Disk Error -->
<software name="dirtpair" supported="no">
<description>Dirty Pair - Project Eden</description>
diff --git a/hash/fidel_scc.xml b/hash/fidel_scc.xml
index 6d57596cd27..c6d19153957 100644
--- a/hash/fidel_scc.xml
+++ b/hash/fidel_scc.xml
@@ -9,9 +9,10 @@ license:CC0-1.0
<softwarelist name="fidel_scc" description="Fidelity SCC modules">
<software name="cb9">
- <description>Challenger Book Openings 1</description>
+ <description>Book Openings 1</description>
<year>1982</year>
<publisher>Fidelity Electronics</publisher>
+ <info name="serial" value="CB9"/>
<part name="cart" interface="fidel_scc">
<dataarea name="rom" size="0x2000">
<rom name="cb9.bin" offset="0x0000" size="0x2000" crc="421147e8" sha1="ccf62f6f218e8992baf30973fe41b35e14a1cc1a" /> <!-- 101-1050a01? -->
@@ -20,9 +21,10 @@ license:CC0-1.0
</software>
<software name="cb16">
- <description>Challenger Book Openings 2 (set 1)</description>
+ <description>Book Openings 2 (set 1)</description>
<year>1982</year>
<publisher>Fidelity Electronics</publisher>
+ <info name="serial" value="CB16"/>
<part name="cart" interface="fidel_scc">
<dataarea name="rom" size="0x4000">
<rom name="cb16_b.bin" offset="0x0000" size="0x2000" crc="591b3e4a" sha1="f75ae850f2f70808b5423f847ff12ee890752bf8" />
@@ -32,9 +34,10 @@ license:CC0-1.0
</software>
<software name="cb16a" cloneof="cb16"> <!-- dumped from a PC16, only 1 byte difference -->
- <description>Challenger Book Openings 2 (set 2)</description>
+ <description>Book Openings 2 (set 2)</description>
<year>1982</year>
<publisher>Fidelity Electronics</publisher>
+ <info name="serial" value="CB16"/>
<part name="cart" interface="fidel_scc">
<dataarea name="rom" size="0x4000">
<rom name="101-1042a01" offset="0x0000" size="0x2000" crc="591b3e4a" sha1="f75ae850f2f70808b5423f847ff12ee890752bf8" /> <!-- MK36A33N-5 -->
@@ -43,4 +46,60 @@ license:CC0-1.0
</part>
</software>
+ <software name="encyclop"> <!-- dumped from an unofficial Peter Reckwitz cartridge with Chess Encyclopedia and Sicilian Variation -->
+ <description>Chess Encyclopedia</description>
+ <year>1984</year>
+ <publisher>Fidelity Electronics</publisher>
+ <info name="serial" value="EO*"/> <!-- EOA-EOE -->
+ <info name="usage" value="Requires 7seg display for full support." />
+ <part name="cart1" interface="fidel_scc">
+ <feature name="part_id" value="Volume A"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="a2.bin" offset="0x0000" size="0x2000" crc="680bdcb7" sha1="3987f5538687a630464ffba661d425f2a670bae1" />
+ <rom name="a1.bin" offset="0x2000" size="0x2000" crc="5324511a" sha1="864919e0b0d315154a5024b31fbec0b41ea8ef00" />
+ </dataarea>
+ </part>
+ <part name="cart2" interface="fidel_scc">
+ <feature name="part_id" value="Volume B"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="b2.bin" offset="0x0000" size="0x2000" crc="572bbafc" sha1="67e326b46607fa8736190bc8fe173e4d182b660b" />
+ <rom name="b1.bin" offset="0x2000" size="0x2000" crc="fecc41e4" sha1="287f4a77a21396df88e0998fb73f92b6b671c781" />
+ </dataarea>
+ </part>
+ <part name="cart3" interface="fidel_scc">
+ <feature name="part_id" value="Volume C"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="c2.bin" offset="0x0000" size="0x2000" crc="caab05bd" sha1="77b3ea2ecda9a8599c67dddc9bab46f1aa0333c6" />
+ <rom name="c1.bin" offset="0x2000" size="0x2000" crc="ed8c39fa" sha1="6a623ad8cb82b2542965247b8606abfc69cf1b83" />
+ </dataarea>
+ </part>
+ <part name="cart4" interface="fidel_scc">
+ <feature name="part_id" value="Volume D"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="d2.bin" offset="0x0000" size="0x2000" crc="44b85f2e" sha1="c00c13fb9e3f677f3410af1abc2e4c8f5f262735" />
+ <rom name="d1.bin" offset="0x2000" size="0x2000" crc="75ce4a05" sha1="4b6a48822a8b4df675c971a8d243e5fbba3d02a2" />
+ </dataarea>
+ </part>
+ <part name="cart5" interface="fidel_scc">
+ <feature name="part_id" value="Volume E"/>
+ <dataarea name="rom" size="0x4000">
+ <rom name="e2.bin" offset="0x0000" size="0x2000" crc="706c4c1f" sha1="bdb67ff7b3b0a6669d558fe12c8bab73ac78b51a" />
+ <rom name="e1.bin" offset="0x2000" size="0x2000" crc="8e9ec38f" sha1="f6ed89466502f107bc57698858d617cad527eb7f" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sicilian"> <!-- dumped from an unofficial Peter Reckwitz cartridge with Chess Encyclopedia and Sicilian Variation -->
+ <description>Sicilian Variation (prototype)</description>
+ <year>1983</year>
+ <publisher>Fidelity Electronics</publisher>
+ <info name="serial" value="DVC"/>
+ <part name="cart" interface="fidel_scc">
+ <dataarea name="rom" size="0x4000">
+ <rom name="f2.bin" offset="0x0000" size="0x2000" crc="b7a2ab54" sha1="67d22f64b89f8f741eb2135bc537bc959d20dc7f" />
+ <rom name="f1.bin" offset="0x2000" size="0x2000" crc="0b906a0e" sha1="686990ff434f050d6cada6c278ab8c2dd24555a3" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/fm77av.xml b/hash/fm77av.xml
index 94b3feabcfc..0336cac277c 100644
--- a/hash/fm77av.xml
+++ b/hash/fm77av.xml
@@ -60,7 +60,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="9gyokudna" cloneof="9gyokudn">
- <description>Ku Gyoku Den (Alt Disk 1)</description>
+ <description>Ku Gyoku Den (alt Disk 1)</description>
<year>1986</year>
<publisher>テクノソフト (TecnoSoft)</publisher>
<info name="serial" value="FUTJ-19002"/>
@@ -230,7 +230,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="dbustera" cloneof="dbuster">
- <description>Dragon Buster (Alt)</description>
+ <description>Dragon Buster (alt)</description>
<year>1987</year>
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
<info name="serial" value="DP-3301212"/>
@@ -255,18 +255,6 @@ Titles, serial #s, publishers and release dates taken from:
</part>
</software>
- <!-- doesn't boot, loads first sector, and jumps into the text at the beginning of it -->
- <software name="dsenraku" supported="no">
- <description>Dsenryaku</description>
- <year>19??</year>
- <publisher>&lt;Unknown&gt;</publisher>
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="348848">
- <rom name="dsenryaku.d77" size="348848" crc="35f02f75" sha1="f590c7f2d3d1b602274bef5e1992babf4acfebc3"/>
- </dataarea>
- </part>
- </software>
-
<software name="fireball">
<description>Fireball</description>
<year>1987</year>
@@ -397,7 +385,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="laydocka" cloneof="laydock">
- <description>Laydock (Alt)</description>
+ <description>Laydock (alt)</description>
<year>1986</year>
<publisher>T&amp;E Soft</publisher>
<info name="serial" value="TEM-66"/>
@@ -416,7 +404,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="laydockb" cloneof="laydock">
- <description>Laydock (Alt 2)</description>
+ <description>Laydock (alt 2)</description>
<year>1986</year>
<publisher>T&amp;E Soft</publisher>
<info name="serial" value="TEM-66"/>
@@ -532,7 +520,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="mightmaga" cloneof="mightmag">
- <description>Might and Magic (Alt Disk 1)</description>
+ <description>Might and Magic (alt Disk 1)</description>
<year>1987</year>
<publisher>スタークラフト (Starcraft)</publisher>
<info name="release" value="198712xx"/>
@@ -560,7 +548,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="mightmagb" cloneof="mightmag">
- <description>Might and Magic (Alt 2)</description>
+ <description>Might and Magic (alt 2)</description>
<year>1987</year>
<publisher>スタークラフト (Starcraft)</publisher>
<info name="release" value="198712xx"/>
@@ -698,7 +686,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="psyoblada" cloneof="psyoblad">
- <description>Psy-O-Blade (Alt)</description>
+ <description>Psy-O-Blade (alt)</description>
<year>1988</year>
<publisher>T&amp;E Soft</publisher>
<info name="release" value="198812xx"/>
@@ -771,7 +759,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="selesa" cloneof="seles">
- <description>Seles (Alt Disk 2)</description>
+ <description>Seles (alt Disk 2)</description>
<year>1990</year>
<publisher>アスキー (ASCII)</publisher>
<info name="alt_title" value="セレス"/>
@@ -829,7 +817,7 @@ Titles, serial #s, publishers and release dates taken from:
<!-- Disk 1 only differs in the d77 header -->
<software name="silpheeda" cloneof="silpheed">
- <description>Silpheed (Alt Disk 2)</description>
+ <description>Silpheed (alt Disk 2)</description>
<year>1988</year>
<publisher>ゲームアーツ (Game Arts)</publisher>
<info name="serial" value="GA8CF3"/>
@@ -887,7 +875,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="tetrisa" cloneof="tetris">
- <description>Tetris (Alt)</description>
+ <description>Tetris (alt)</description>
<year>1988</year>
<publisher>B·P·S (Bullet-Proof Software)</publisher>
<info name="release" value="198811xx"/>
@@ -1145,7 +1133,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="avdemoa" cloneof="avdemo" supported="no">
- <description>FM-77AV Demo (Alt?)</description>
+ <description>FM-77AV Demo (alt?)</description>
<year>19??</year>
<publisher>富士通 (Fujitsu)</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -1300,7 +1288,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="hfe8a" cloneof="hfe">
- <description>The File Master FM - Hot File Express (19870210, Alt?)</description>
+ <description>The File Master FM - Hot File Express (19870210, alt?)</description>
<year>1987</year>
<publisher>Kyoto Media</publisher>
<part name="flop1" interface="floppy_5_25">
diff --git a/hash/fm7_cass.xml b/hash/fm7_cass.xml
index e734d2a3efa..a9c3a604c25 100644
--- a/hash/fm7_cass.xml
+++ b/hash/fm7_cass.xml
@@ -322,7 +322,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="chackna" cloneof="chackn">
- <description>Chack'n Pop (Alt)</description>
+ <description>Chack'n Pop (alt)</description>
<year>1984</year>
<publisher>ニデコム (Nidecom)</publisher>
<info name="serial" value="NH-S49"/>
@@ -758,7 +758,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="gbanka" cloneof="gbank">
- <description>Gutchan Bank (Alt)</description>
+ <description>Gutchan Bank (alt)</description>
<year>1985</year>
<publisher>日本ソフトバンク (Nihon SoftBank)</publisher>
<info name="release" value="198506xx"/>
@@ -894,7 +894,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="hydlidea" cloneof="hydlide">
- <description>Hydlide (Alt)</description>
+ <description>Hydlide (alt)</description>
<year>1985</year>
<publisher>T&amp;E Soft</publisher>
<info name="serial" value="TET-53"/>
@@ -933,7 +933,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="hydlide2a" cloneof="hydlide2">
- <description>Hydlide II - Shine of Darkness (Alt)</description>
+ <description>Hydlide II - Shine of Darkness (alt)</description>
<year>1986</year>
<publisher>T&amp;E Soft</publisher>
<info name="serial" value="TET-65"/>
@@ -1383,7 +1383,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="ninjakuna" cloneof="ninjakun">
- <description>Ninja-kun (Alt)</description>
+ <description>Ninja-kun (alt)</description>
<year>1986</year>
<publisher>日本デクスタ (Nihon Dexter)</publisher>
<info name="alt_title" value="忍者くん"/>
@@ -1586,7 +1586,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="punchbala" cloneof="punchbal">
- <description>Punch Ball Mario Bros. (Alt)</description>
+ <description>Punch Ball Mario Bros. (alt)</description>
<year>1984</year>
<publisher>ハドソン (Hudson Soft)</publisher>
<info name="release" value="198410xx"/>
@@ -1654,7 +1654,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="rallyxa" cloneof="rallyx">
- <description>Rally-X (Alt)</description>
+ <description>Rally-X (alt)</description>
<year>1984</year>
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
<info name="serial" value="DP-3301162"/>
@@ -1709,7 +1709,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="tomathim">
- <description>Salad no Kuni no Tomato Hime</description>
+ <description>Salad no Kuni no Tomato-hime</description>
<year>1984</year>
<publisher>ハドソン (Hudson Soft)</publisher>
<info name="alt_title" value="サラダの国のトマト姫"/>
@@ -2024,7 +2024,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="tforcea" cloneof="tforce">
- <description>Thunder Force (Alt)</description>
+ <description>Thunder Force (alt)</description>
<year>1984</year>
<publisher>テクノソフト (Tecno Soft)</publisher>
<info name="serial" value="TF7-010"/>
diff --git a/hash/fm7_disk.xml b/hash/fm7_disk.xml
index a74124e0e26..dc1977a5589 100644
--- a/hash/fm7_disk.xml
+++ b/hash/fm7_disk.xml
@@ -242,6 +242,22 @@ Titles, serial #s, publishers and release dates taken from:
</part>
</software>
+ <!-- was originally in fm77av.xml, game is supported by base FM-7 anyway -->
+ <!-- https://fm-7.com/museum/products/rb7irg02/ -->
+ <!-- assume either mistake or actually one of the two is 3.5" version -->
+ <software name="dsenraku" cloneof="daisenr">
+ <description>Daisenryaku FM (alt)</description>
+ <year>1987</year>
+ <publisher>システムソフト (System Soft)</publisher>
+ <info name="release" value="198708xx"/>
+ <info name="alt_title" value="大戦略FM"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="348848">
+ <rom name="dsenryaku.d77" size="348848" crc="35f02f75" sha1="f590c7f2d3d1b602274bef5e1992babf4acfebc3"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="darkcrys">
<description>Dark Crystal</description>
<year>1984</year>
@@ -337,7 +353,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="flolitaa" cloneof="flolita">
- <description>Final Lolita (Alt)</description>
+ <description>Final Lolita (alt)</description>
<year>1985</year>
<publisher>パソコンショップ高知 (PSK)</publisher>
<info name="release" value="198511xx"/>
@@ -550,7 +566,7 @@ Titles, serial #s, publishers and release dates taken from:
<!-- Disk 2 only differs in the d77 header -->
<software name="hydlide2a" cloneof="hydlide2">
- <description>Hydlide II - Shine of Darkness (Alt Disk 1)</description>
+ <description>Hydlide II - Shine of Darkness (alt Disk 1)</description>
<year>1986</year>
<publisher>T&amp;E Soft</publisher>
<info name="serial" value="TED-65, TEM-65"/>
@@ -976,7 +992,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="revivera" cloneof="reviver">
- <description>Reviver (Alt Master Disk)</description>
+ <description>Reviver (alt Master Disk)</description>
<year>1987</year>
<publisher>アルシスソフト (Arsys Soft)</publisher>
<info name="alt_title" value="リバイバー"/>
@@ -1134,7 +1150,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="thexdera" cloneof="thexder">
- <description>Thexder (Protected)</description>
+ <description>Thexder (protected)</description>
<year>1985</year>
<publisher>ゲームアーツ (Game Arts)</publisher>
<info name="release" value="198510xx"/>
@@ -1186,7 +1202,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="transylva" cloneof="transylv" supported="no">
- <description>Transylvania (Alt?)</description>
+ <description>Transylvania (alt?)</description>
<year>1983</year>
<publisher>スタークラフト (Starcraft)</publisher>
<info name="alt_title" value="トランシルバニア"/>
@@ -1327,7 +1343,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="wibarma" cloneof="wibarm">
- <description>Wibarm (Alt Data Disk)</description>
+ <description>Wibarm (alt Data Disk)</description>
<year>1986</year>
<publisher>アルシスソフト (Arsys Soft)</publisher>
<info name="release" value="198610xx"/>
@@ -1506,7 +1522,7 @@ Titles, serial #s, publishers and release dates taken from:
<!-- The user disk from this set has been reported to make the set above working! Investigate! -->
<software name="xanadu2a" cloneof="xanadu2">
- <description>Xanadu Scenario II - The Resurrection of Dragon (Alt)</description>
+ <description>Xanadu Scenario II - The Resurrection of Dragon (alt)</description>
<year>1986</year>
<publisher>日本ファルコム (Nihon Falcom)</publisher>
<info name="release" value="198611xx"/>
@@ -1594,7 +1610,7 @@ Titles, serial #s, publishers and release dates taken from:
</software>
<software name="ysa" cloneof="ys">
- <description>Ys - Ancient Ys Vanished Omen (Alt Data Disk)</description>
+ <description>Ys - Ancient Ys Vanished Omen (alt Data Disk)</description>
<year>1987</year>
<publisher>日本ファルコム (Nihon Falcom)</publisher>
<info name="serial" value="FUNW13029"/>
@@ -2090,7 +2106,7 @@ systems, for the moment they stay here!
</software>
<software name="pack02">
- <description>Game Pack (Alt)</description>
+ <description>Game Pack (alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2102,7 +2118,7 @@ systems, for the moment they stay here!
</software>
<software name="pack03">
- <description>Game Pack (Alt 2)</description>
+ <description>Game Pack (alt 2)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2114,7 +2130,7 @@ systems, for the moment they stay here!
</software>
<software name="pack04">
- <description>Game Pack (Alt 3)</description>
+ <description>Game Pack (alt 3)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2162,7 +2178,7 @@ Others are no-warranty...
</software>
<software name="game03ga" cloneof="game03g">
- <description>Game 03G (Alt?)</description>
+ <description>Game 03G (alt?)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -2212,7 +2228,7 @@ Others are not start...
</software>
<software name="game011a" cloneof="game011">
- <description>Game 011 (Alt)</description>
+ <description>Game 011 (alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -2241,7 +2257,7 @@ Disk #012 for FM-7/77/AV
</software>
<software name="game012a" cloneof="game012">
- <description>Game 012 (Alt)</description>
+ <description>Game 012 (alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_5_25">
@@ -2270,7 +2286,7 @@ Game #013 for FM-7/77/AV.
</software>
<software name="game013a" cloneof="game013">
- <description>Game 013 (Alt)</description>
+ <description>Game 013 (alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_5_25">
diff --git a/hash/fmtowns_cd.xml b/hash/fmtowns_cd.xml
index 3a8321e8524..8f9ff162525 100644
--- a/hash/fmtowns_cd.xml
+++ b/hash/fmtowns_cd.xml
@@ -21,14 +21,12 @@ A Night in Tunisia Raison
Ablemax Eigo Able Serve 1995/6 SET(CD+FD)
Ablemax Kokugo Able Serve 1995/6 SET(CD+FD)
Ablemax Suugaku Able Serve 1995/6 SET(CD+FD)
-AD&D Heroes of the Lance Pony Canyon 1990/6 CD
Aesop World Dai-2-shuu (Denshi Ehon) Fujitsu 1993/12 CD
Aishuu to Netsujou no Chouwa Fujitsu 1995/4 CD
Alice in Wonderland DynEd Japan 1993/3 SET(CD+FD)
Amour Ver. 1.0 Kozu System 1989/11 SET(CD+FD)
AniVox Eiken 3-4-kyuu Hatsuon-Accent Ban Unity 1992/6 SET(CD+FD)
Anne no Tea Party Dennou Shoukai 1993/6 CD
-Arquelphos D.O. 1993/7 CD
Aska Base Algo 1989/5 SET(CD+FD)
Aska Word Algo 1991/1 SET(CD+FD)
* Band-kun Koei 1991/1 SET(CD+FD)
@@ -56,10 +54,8 @@ Chikyuu no Himitsu (Kankyou Kyouiku Kyouzai) Fujitsu
Chiri Jigsaw World 2 Fujitsu Ooita Software Laboratory 1994/12 SET(CD+FD)
Chotto Shita Ohanashi Fujitsu 1995/11 CD
Chuugokugo de Ajiwau: Kanshi no Sekai CSK Research Institute (CRI) 1991/4 CD
-City Lights Raison 1992/8 CD
-ClearMind: Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu CSK Research Institute (CRI) 1989/8 CD
* Crayonnage CSK Research Institute (CRI) 1991/8 SET(CD+FD)
-CRI StacCard CSK Research Institute (CRI) 1991/5 SET(CD+FD)
+* CRI StacCard CSK Research Institute (CRI) 1991/5 SET(CD+FD)
Cutie Queen Crystal Eizou 1995/2 CD
CyberSculpt (HMC-140) Fujitsu 1991/11 CD
Cyclone Express Alpha Towns Ans 1990/5 CD
@@ -72,7 +68,7 @@ Demonstration CD-ROM '90 Natsu-gou Fujitsu
Demonstration CD-ROM '91 Fuyu-gou Fujitsu 1991/11 CD×01
Demonstration CD-ROM '91 Haru-gou Fujitsu 1991/2 SET(CD+FD)
Demonstration CD-ROM '92 Fuyu-gou Fujitsu 1992/11 SET(CD+FD)
-Demonstration CD-ROM '92 Haru-gou Fujitsu 1992/2 SET(CD+FD)
+* Demonstration CD-ROM '92 Haru-gou Fujitsu 1992/2 SET(CD+FD)
Demonstration CD-ROM '93 Natsu-gou Fujitsu 1993/2 CD
Demonstration CD-ROM '94 Fuyu-gou Fujitsu 1994/11 CD
Demonstration CD-ROM '95 Fuyu-gou Fujitsu 1995/11 CD
@@ -84,7 +80,6 @@ Den V2 Fujitsu
Den V3.0 Fujitsu 1994/8 SET(CD+FD)
* Diamond Players Wolf Team 1993/6 SET(CD+FD)
Dick Amorphous 1996/1 CD
-Digital Pinup Girls Vol. 2 Transpegasus Limited 1993/6 CD
Do-Re-Mi Canvas Tokyo Shoseki 1994/12 CD
Dragon Souseiki Basho House 1993/12 CD
Dynamic Business English 1 DynEd Japan 1994/11 SET(CD+FD)
@@ -125,13 +120,11 @@ Eigo de Eigo ni Tsuyoku Naru 8 Infortech
Eigo de Eigo ni Tsuyoku Naru 9 Infortech 1990/4 CD
Eikan wa Kimi ni 3: Koukou Yakyuu Zenkoku Taikai Artdink 1993/8 SET(CD+FD)
Ei-wa-doku-ro Denki Jutsugo Daijiten Ohmsha 1990/4 CD
-Euphony 2 / SCORE V1.1 Fujitsu 1993/4 CD
Eye of the Beholder 3 Ving 1994/11 CD
Fancy Illust: Hattori Yuki no Wakuwaku Cut-shuu CSK Research Institute (CRI) 1990/3 CD
F-BASIC Compiler V1.1 Fujitsu 1990/12 CD
FIRSTHAND ACCESS(Disc1) DynEd Japan 1994/11 SET(CD+FD)
FIRSTHAND ACCESS(Disc2) DynEd Japan 1994/11 SET(CD+FD)
-FM Towns Appli Jikkou Set Fujitsu 1993/6 CD
FM Towns de Manabu School-Ace Alpha Fujitsu 1993/4 CD
FM Towns Free Ware Collection (EYE COM-ban) Fujitsu 1989/11 CD
FM Towns Paso-Rika Ver. 3 Maris 1993/11 CD
@@ -210,7 +203,6 @@ Interactive Business English 3 DynEd Japan
Interactive Business English 4 DynEd Japan 1992/7 SET(CD+FD)
Interactive Business English 5 DynEd Japan 1992/7 SET(CD+FD)
Interactive Business English 6 DynEd Japan 1992/7 SET(CD+FD)
-Iwanami Bungakukan: Natsume Souseki Iwanami Shoten 1994/2 CD
Iwanami Denshi Nihon Sougou Nendo CD-ROM Fujitsu 1993/10 CD
JAF Drive Guide JAF Shuppansha 1990/8 SET(CD+FD)
JAF Drive Guide - Best Ski 150 (Resort-hen) JAF Shuppansha 1990/12 SET(CD+FD)
@@ -228,7 +220,6 @@ Kanji Land 6-nen Fujitsu Ooita Soft
Kanjigen CD-ROM Fujitsu 1994/1 CD
Karyuugai Raison 1991/1 CD
Katsuyaku Suru Computer (CD Town) Fujitsu Ooita Software Laboratory 1992/12 CD
-Kazadama Vol. 1: Maeda Shinzo no Sekai Ki - Japan Fujitsu 1993/9 CD
Kazu ya Kimi Tashizan / Hikizan Hen Media Art 1995/1 CD
Kenkyuusha Readers Eiwa CD-ROM Fujitsu 1993/2 CD
* Kid Pix Companion Fujitsu Parex 1995/3 CD
@@ -244,7 +235,6 @@ Let's go 2-2 DynEd Japan
Little Big Adventure Electronic Arts Victor 1995/12 CD
LiveAnimation V2.1 Fujitsu 1994/5 CD
LiveMorph V1.1 Fujitsu 1994/2 CD
-LiveMovie V1.1 Fujitsu 1992/12 CD
LiveMovie V2.1 Fujitsu 1994/3 CD
M Talk Fujitsu Office Kiki 1993/6 CD
Manami no Dokomade Iku no? Wendy Magazine 1995/5 CD
@@ -256,7 +246,6 @@ Mohan Roppou CD-ROM-ban Sanshusha
Mohan Roppou Heisei 5-nendo-ban Fujitsu 1993/8 CD
Mohan Roppou Heisei 6-nendo-ban Fujitsu 1994/9 CD
Mokkoriman RPG Illusion 1994/6 CD
-Moko Fujitsu Social Science Laboratory 1995/3 CD×03
Monoshiri Jiyuugaku Bannin Isshu-hen Shinkou Human Create 1994/10 CD
Moon Crystal Orange House 1992/6 ?
Multimedia Nihon no Rekishi Dai-1-Shou: Kariya-ryou no Kurashi Tokyo Shoseki ? CD
@@ -266,7 +255,6 @@ Museum Etude Towns Victor Entertainme
Museum of Museums Fujitsu 1994/3 CD
Mushi no Mahou Tsukai Fujitsu Social Science Laboratory 1995/11 CD
Music Drill Ongaku Q&A Kawai 1992/2 CD
-Music Pro V1.3 (MIDI) Musical Plan 1995/2 CD
Music Pro V2 (MIDI) Musical Plan 1996/3 CD
Music Pro V2 (Naizou) Musical Plan 1996/3 CD
MusicPress Vol. 1: Cinema Scene Fujitsu 1993/11 CD
@@ -286,7 +274,6 @@ Nazoraa 6-nen Infortech
New Century Eiwa Fujitsu 1990/5 CD
New Century Eiwa / Shin Crown Waei Jiten Fujitsu 1993/11 CD
New Horizon CD Learning System 2 2-nen Tokyo Shoseki 1993/5 CD
-New Horizon CD Learning System 2 3-nen Tokyo Shoseki 1993/5 CD
New Horizon CD Running System 1-nen Tokyo Shoseki 1990/7 SET(CD+FD)
New Horizon CD Running System 2-nen Tokyo Shoseki 1990/7 SET(CD+FD)
New Horizon CD Running System 2-nen Tokyo Shoseki 1991/1 SET(CD+FD)
@@ -401,7 +388,6 @@ Towns Spirit Uchida Youkou
Towns Spirit Uchida Youkou 1993/4 CD
TownsFullcolor V1.1 Fujitsu 1993/3 CD
TownsGraph V1.1 Fujitsu 1993/4 CD
-TownsGraph V2.1 Fujitsu 1994/10 CD
TownsPAINT 2 V2.1 Fujitsu 1994/11 CD
Towns-Telop 2 Type A Lambda System 1995/10 SET(CD+FD)
Towns-Telop 2 Type B Lambda System 1995/10 SET(CD+FD)
@@ -467,13 +453,13 @@ User/save disks that can be created from the game itself are not included.
<description>Debian GNU/Linux 1.3.1 with Debian-JP Packages</description>
<year>1997</year>
<publisher>Laser 5</publisher>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Disk 1 (Binary)" />
<diskarea name="cdrom">
<disk name="debian-gnu-linux-1.3.1-jp-fmtowns.binary.laser5" sha1="ed1e6d37d361c03b705006b7cd6a7a0f893ab8b6" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Disk 2 (Source)" />
<diskarea name="cdrom">
<disk name="debian-gnu-linux-1.3.1-jp-fmtowns.source.laser5" sha1="741ae656cacc8e25282e312c1154110e5a561dfd" />
@@ -492,25 +478,25 @@ User/save disks that can be created from the game itself are not included.
<description>Debian GNU/Linux 2.0r2 with Hamm-JP</description>
<year>1998</year>
<publisher>Laser 5</publisher>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Install CD" />
<diskarea name="cdrom">
<disk name="debian-gnu-linux-2.0r2-with-hamm-jp-i38-3cdset-install-cd.laser5" sha1="323f5d1e1b91ff719c1427d4d338c2923405def5" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Binary CD" />
<diskarea name="cdrom">
<disk name="debian-gnu-linux-2.0r2-with-hamm-jp-i38-3cdset-binary-cd.laser5" sha1="34655b4d137f96d1d92fb61ca8a26dfb82526b94" />
</diskarea>
</part>
- <part name="cdrom3" interface="fmt_cdrom">
+ <part name="cdrom3" interface="cdrom">
<feature name="part_id" value="Source CD" />
<diskarea name="cdrom">
<disk name="debian-gnu-linux-2.0r2-with-hamm-jp-i38-3cdset-source.laser5" sha1="df9fd892d3edfa0eed25e535ac0396ad4b7f9000" />
</diskarea>
</part>
- <part name="cdrom4" interface="fmt_cdrom">
+ <part name="cdrom4" interface="cdrom">
<feature name="part_id" value="LaserDoc Ver. 1.0 - Linux Document CD" />
<diskarea name="cdrom">
<disk name="debian-gnu-linux-2.0r2-with-hamm-jp-laserdoc-1.0.laser5" sha1="c666d3be1ebb283d5646f4e14659679264390aa8" />
@@ -529,7 +515,7 @@ User/save disks that can be created from the game itself are not included.
<year>1993</year>
<publisher>Laser 5</publisher>
<info name="alt_title" value="日本語Linux+JE" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nihongo linux + je (japan)" sha1="717abc5ab103c1d08766faa8d5d519de9b8b6a11" />
</diskarea>
@@ -547,7 +533,7 @@ User/save disks that can be created from the game itself are not included.
<year>1994</year>
<publisher>Laser 5</publisher>
<info name="alt_title" value="日本語Linux+JE3" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nihongo linux + je 3 (japan)" sha1="e6030e2323196c21c4ccd3d686030f6a6311ced9" />
</diskarea>
@@ -576,17 +562,17 @@ User/save disks that can be created from the game itself are not included.
<description>Linux + JE4 1995/12</description>
<year>1995</year>
<publisher>Laser 5</publisher>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="[os] linux + je4 1995-12 (disc 1)" sha1="37d5984ed5ec2f4a3cae87ed616f619439b1972b" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="[os] linux + je4 1995-12 (disc 2)" sha1="70e4390837341719b09138559c44201470e1c2f3" />
</diskarea>
</part>
- <part name="cdrom3" interface="fmt_cdrom">
+ <part name="cdrom3" interface="cdrom">
<diskarea name="cdrom">
<disk name="[os] linux + je4 1995-12 (disc 3)" sha1="e002b3e5f25311132cbd5d5459e593a79593be50" />
</diskarea>
@@ -605,7 +591,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="Master CD (インストールモデル用)" />
<info name="usage" value="Run DO.BAT from the command line" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="master cd - install model-you (japan)" sha1="d079314ee10e0e21933b839d8387d51d8b54c602" />
</diskarea>
@@ -624,7 +610,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="Master CD (Freshシリーズ用)" />
<info name="usage" value="Run DO.BAT from the command line" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="master cd - fresh series-you (japan)" sha1="4a3a0ad499a8bc2f77b7af44a8ef78f51b5a52d9" />
</diskarea>
@@ -643,7 +629,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="Master CD (Freshシリーズ用) (一太郎モデル)" />
<info name="usage" value="Run DO.BAT from the command line" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="master cd - fresh series-you (ichitarou model) (japan)" sha1="375fa0d9ef44f859c1ada8f1e548653a9714ce77" />
</diskarea>
@@ -666,7 +652,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="Master CD (FMV‐TOWNSシリーズ)" />
<info name="usage" value="Run DO.BAT from the command line" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="master cd - fmv-towns series (japan)" sha1="1de7baaa564848a2209db4bb3d45c6adaac89d08" />
</diskarea>
@@ -699,7 +685,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v1.1l10 (japan)" sha1="98807c8ff948ed200cbd3199a32ae1edfdfae542" />
</diskarea>
@@ -732,7 +718,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v1.1 l10 (japan) (rev a)" sha1="9fa8e5611885f38d124dc4e6b6f4a7aa1e444252" />
</diskarea>
@@ -769,7 +755,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v1.1 l20 (japan)" sha1="238a96a9a120ce5b2cc1acdce453d9c251def7a7" />
</diskarea>
@@ -794,7 +780,7 @@ User/save disks that can be created from the game itself are not included.
<year>1990</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v1.1l30 (japan)" sha1="79e193ca5c92cde61382c97f46b8cf843492e758" />
</diskarea>
@@ -822,7 +808,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1l10 (japan) (rev a)" sha1="820a7d26a6a48ea51d5556e140e27aee243b47fa" />
</diskarea>
@@ -848,7 +834,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1 l20 (japan)" sha1="b964ad9cd32fe10e1b6d1f29405a50b67bc1d30f" />
</diskarea>
@@ -874,7 +860,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1 l30 (japan) (rev a)" sha1="56a143c763913caade8ef98029cfa37e3718bbce" />
</diskarea>
@@ -900,7 +886,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1 l31 (japan)" sha1="e3ab3d1e78e2e38c8506b3c8552b0c820689d71e" />
</diskarea>
@@ -926,7 +912,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1 l40 (japan)" sha1="575aef3c7df9cceb4788554224783e4c1ce07114" />
</diskarea>
@@ -952,7 +938,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1 l50 (japan) (rev a)" sha1="e18596ac1afb4a6a2fa834a4bcec2a293a45c219" />
</diskarea>
@@ -978,7 +964,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276A011"/>
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns system software v2.1l51 (japan)" sha1="85d8dcc3bc79858f1beaf2c1b35073060dc6d07d" />
</diskarea>
@@ -1011,7 +997,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="windows_3.0_mme_1.0l20.hdm" size="1261568" crc="e8a3ab4b" sha1="dde6910aff5e45d031541071f29a635b3d558d47" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nihongo microsoft windows v3.0 with multimedia extensions v1.0 l10 (japan)" sha1="8426d9e6d652f830b378b06d0ea880607cc093b1" />
</diskarea>
@@ -1042,7 +1028,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="microsoft windows version 3.1 l12 operating system (japan) (setup disk).hdm" size="1261568" crc="6703b021" sha1="55161fea07a7d4da4a744707a11c8a5942bc53c5" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="part_id" value="Setup CD-ROM" />
<diskarea name="cdrom">
<disk name="microsoft windows version 3.1 l12 operating system (japan) (setup cd-rom)" sha1="6fc77133989a78df696cded58f0a96b5990a85c4" />
@@ -1074,7 +1060,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="microsoft windows version 3.1 l11 operating system (japan) (setup disk).hdm" size="1261568" crc="3f97a96e" sha1="3e01bef486f7f0bc34c61c05cf9bc029acfb05fd" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="part_id" value="Setup CD-ROM" />
<diskarea name="cdrom">
<disk name="microsoft windows version 3.1 l11 operating system (japan) (setup cd-rom)" sha1="b1369d6dd3f06121ba5f10585b11f84fef7fc348" />
@@ -1113,7 +1099,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="microsoft windows version 3.1 l10 operating system (japan) (setup disk - model mx-ma).hdm" size="1261568" crc="e5847c37" sha1="522aaa5a467af715226850a602c063aab94a43c7" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="part_id" value="Setup CD-ROM" />
<diskarea name="cdrom">
<disk name="microsoft windows version 3.1 l10 operating system (japan) (setup cd-rom)" sha1="afee30cf72f7995c8dd08620728d726d325a4184" />
@@ -1132,13 +1118,13 @@ User/save disks that can be created from the game itself are not included.
<description>Microsoft Windows 95 Upgrade Package</description>
<year>1996</year>
<publisher>富士通 (Fujitsu)</publisher>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Microsoft Windows 95 Upgrade FM Towns-you" />
<diskarea name="cdrom">
<disk name="microsoft windows 95 upgrade fm towns-you (japan)" sha1="7cceb171ed8cdb765aff6046d0c32a7f9aad3021" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Drivers Disc" />
<diskarea name="cdrom">
<disk name="microsoft windows 95 operating system nihongo-ban fm towns-you v1.1 L10 (japan) (drivers disc)" sha1="dd7f681a439c611050bb195ddaf90b8974c4323f" />
@@ -1164,7 +1150,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="TOWNS百人一首" />
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyakunin isshu (japan)" sha1="1a67022fd6cce20e6639c189d5f8642c948e28d5" />
</diskarea>
@@ -1184,7 +1170,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ツー・ショット Diary" />
<info name="release" value="199410xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="two shot diary (japan)" sha1="c8fe6e8f1f6799e31ae7f5f93fb1d62098605b8b" />
</diskarea>
@@ -1204,7 +1190,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="3×3EYES 三只眼變成" />
<info name="release" value="199310xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="3x3 eyes - sanjiyan henjou (japan)" sha1="3140e4b7c4a2c5666ed8d7c0e3ae919ed565e5c1" />
</diskarea>
@@ -1232,7 +1218,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="4D ボクシング" />
<info name="release" value="199212xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4d boxing (japan)" sha1="b2705fc93b991ac2b7b45b697f15157085f37b4d" />
</diskarea>
@@ -1263,7 +1249,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="4D ドライビング" />
<info name="release" value="199303xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4d driving (japan)" sha1="68794807a59b1095c2b10bf2e6a4da3eb6371f8f" />
</diskarea>
@@ -1294,7 +1280,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="4D ドライビング" />
<info name="release" value="199307xx" />
<info name="usage" value="Only works on the 386SX-based models (Marty/UX)"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4d driving (japan) (fm towns marty rerelease)" sha1="fa4dc65e57a643b3b717454515318a3552a88f39" />
</diskarea>
@@ -1341,7 +1327,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="4D テニス" />
<info name="release" value="199307xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4d tennis (japan)" sha1="1ddcaee84631b1f5ace7dd60d8b4c7415ed4d789" />
</diskarea>
@@ -1383,7 +1369,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>データウエスト (Data West)</publisher>
<info name="serial" value="HMA-204"/>
<info name="release" value="198907xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit 1-2 towns, the - linkage (japan)" sha1="965e94449924da6ca3b4e7b98fdefd75cec68d62" />
</diskarea>
@@ -1412,7 +1398,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>データウエスト (Data West)</publisher>
<info name="serial" value="HMA-216"/>
<info name="release" value="198911xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit act. 3, the - dual targets (japan)" sha1="dec3e78fbaa90820ef7ec7adfbbcb96803bf6b85" />
</diskarea>
@@ -1442,7 +1428,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-247"/>
<info name="release" value="198912xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit act. 4, the - zero (japan)" sha1="54d2e79b1519e3c4ffb0e00041ac3f0d7905a7f4" />
</diskarea>
@@ -1472,7 +1458,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-109"/>
<info name="release" value="199004xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit act. 5, the - d-again (japan)" sha1="f6c642be482b76d04936b7fd6d76aeb14e1055a8" />
</diskarea>
@@ -1502,7 +1488,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-902"/>
<info name="release" value="199004xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit five - d-again, the (japan) (demo)" sha1="6a0a34856478da5d563fba5cd9ff22bfa9d2fabe" />
</diskarea>
@@ -1528,7 +1514,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-215"/>
<info name="release" value="199012xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit series, the - merrygoround (japan)" sha1="68d99ab70038c78b95d7d229a185ab5eea0d4073" />
</diskarea>
@@ -1559,7 +1545,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="the 4th unit 7 - wyatt (boot disk).hdm" size="1261568" crc="a516f2c4" sha1="f5ae3995c8a8358b88bb716bb9c88ee8d4083d1d" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit series, the - wyatt (japan)" sha1="a3f06ad5e23147bff643ac404897eb4f224d6301" />
</diskarea>
@@ -1581,7 +1567,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="wyatt_demo.hdm" size="1261568" crc="2e4a5209" sha1="3179cd145554e0b61a3fabc16ff57b1d4bd8f619" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="4th unit series, the - wyatt (japan) (demo)" sha1="11f520ed69649e58f78124e7af8f9b5dc5243d81" />
</diskarea>
@@ -1628,7 +1614,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-229"/>
<info name="alt_title" value="38万キロの虚空" />
<info name="release" value="198912xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="day in the life of 2049, a - file 1 - 38-man kilo no kokuu (japan)" sha1="13cef87d7fbbf6d281517098337acde661baaade" />
</diskarea>
@@ -1648,7 +1634,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="MTC-1106"/>
<info name="alt_title" value="’94年 ナイス・ギャル 夏の総決算" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="'94-nen nice gal - natsu no soukessan (japan)" sha1="a9a4fa081d8dee0a5f23fb3ce78aba9d82de0f8b" />
</diskarea>
@@ -1745,7 +1731,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アンの夢の国" />
<info name="release" value="199303xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="anne no yume no kuni - anne's country of dreams (japan)" sha1="d295fe1425267a29bb8a916e70db73924bc4449a" />
</diskarea>
@@ -1765,7 +1751,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="それいけ!アンパンマン たのしいえいごあそび" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="soreike anpanman - tanoshii eigo asobi (japan)" sha1="fb25a30068aa8d1f27e30da508ad42a56b3726fa" />
</diskarea>
@@ -1786,7 +1772,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="A列車で行こうIII" />
<info name="release" value="199104xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a.iii. - a ressha de ikou iii (japan)" sha1="c5aaad3efb280ff432a251eeeee1dc4a0f0fd79b" />
</diskarea>
@@ -1828,7 +1814,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="a-iv-systemdisk_new.hdm" size="1261568" crc="09173db4" sha1="9b007c8cbdb46596bef5235daf3be94f22da3967" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aiv - a ressha de ikou 4 (japan)" sha1="b319db87f0a0e7bb3b3238ec211c03dad0a75bfd" />
</diskarea>
@@ -1870,7 +1856,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="a-iv-systemdisk_old.hdm" size="1261568" crc="01b1da33" sha1="6aa1850972b6c8bf7ef82a9bbcba022b777a6df8" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aiv - a ressha de ikou 4 (japan)" sha1="b319db87f0a0e7bb3b3238ec211c03dad0a75bfd" />
</diskarea>
@@ -1910,7 +1896,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ABEL 真・黙示録大戦" />
<info name="release" value="199511xx" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="abel - shin mokushiroku taisen (japan)" sha1="d4a49a59b582c870bb3ab843ffc3685c29efef86" />
</diskarea>
@@ -1940,7 +1926,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アドバンテージテニス" />
<info name="release" value="199210xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="advantage tennis (japan)" sha1="840eb0ea7f40b2bad8647ef0322979de882258ab" />
</diskarea>
@@ -1965,7 +1951,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="えほんらいた 電子絵本 イソップワールド 第1集" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ehon writer - denshi ehon - aesop world dai-1-shuu (japan)" sha1="40014ec89fdaf53a40073e052da35dc97dc66c8d" />
</diskarea>
@@ -2000,7 +1986,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エターナム" />
<info name="release" value="199303xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aeternam (japan)" sha1="74bc95aa64a8f232547a65df274c5c580434cef3" />
</diskarea>
@@ -2026,7 +2012,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-101 / T-2007-906"/>
<info name="alt_title" value="アフターバーナー" />
<info name="release" value="198911xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="after burner (japan) (rev 1)" sha1="c4b0f4bd4a0135933d6f15c2091c59be98b2c91d" />
</diskarea>
@@ -2052,7 +2038,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-101"/>
<info name="alt_title" value="アフターバーナー" />
<info name="release" value="198911xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="after burner (japan) (rev 1) (alt)" sha1="a87bca5b66111988de5fd351270f092883516528" />
</diskarea>
@@ -2078,7 +2064,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-101"/>
<info name="alt_title" value="アフターバーナー" />
<info name="release" value="198903xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="after burner (japan)" sha1="a7889124b3e67f6ef8b129b2ecb5914da14e9ed7" />
</diskarea>
@@ -2109,7 +2095,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アフターバーナーIII" />
<info name="release" value="199206xx" />
<info name="usage" value="Requires 2 MB RAM. Supports XE-1AP analog pad in analog MD mode on second controller port. Use a Towns Pad on first port to navigate menus." />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="after burner iii (japan)" sha1="fe11d382c3efef8ed4a698f6a9832fb6bcd09167" />
</diskarea>
@@ -2133,7 +2119,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-228 / F-5507"/>
<info name="alt_title" value="エアーコンバット2スペシャル" />
<info name="release" value="199303xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="air combat ii - special (japan)" sha1="cff6f3ff65b0210d0ed5d53a335d638a28916708" />
</diskarea>
@@ -2161,7 +2147,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="air management - oozora ni kakeru (japan) (user disk).hdm" size="1261568" crc="1095e60c" sha1="a4f27fedb0d4c5b1aeaf39bbf2fbbd104c40760b" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="air management - oozora ni kakeru (japan)" sha1="9a0649bb7eaf24a579bf8eff5e56faacfbc5bb53" />
</diskarea>
@@ -2194,7 +2180,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="fujitsu air warrior v2 - version 2.1 level 10 (japan) (4mb kidou disk).hdm" size="1261568" crc="f3da6f23" sha1="c9ba702fc6d0a90fe53d4e712078627c2f30ea2d" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu air warrior v2 - version 2.1 level 10 (japan)" sha1="7754550da30b6b025efb722d8e1fdf12f3f4354c" />
</diskarea>
@@ -2226,7 +2212,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="fujitsu_air_warrior_v1.2l11_marty.hdm" size="1261568" crc="68c7efca" sha1="93c9db6bb8d0dbce9c7a15e86ba0f9fcf46c6c69" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu air warrior v1.2l11 (japan) (en,ja)" sha1="d3c67fc7fce2e6a8bb9c3605923bdef4e7293e56" />
</diskarea>
@@ -2251,7 +2237,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="fujitsu_air_warrior_v1.2l10.hdm" size="1261568" crc="f38664a6" sha1="3f3abd3cb145bca79414d32c08a98ae7250d4b6f" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu air warrior v1.2 (japan)" sha1="cf653365d5ed02479885775d5e470f42d3cdc285" />
</diskarea>
@@ -2276,7 +2262,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="fujitsu_air_warrior_v1.1_1992-04-09.hdm" size="1261568" crc="1b2ef9de" sha1="9abf50374c6c8ce3d6c577e65c042845c93719f9" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu air warrior v1.1 (japan)" sha1="3dc6a3ed33a1e2a061a3390853f16883ffc87835" />
</diskarea>
@@ -2301,7 +2287,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="fujitsu_air_warrior_v1.1_1992-03-16.hdm" size="1261568" crc="3387f260" sha1="ebeacf861162b24c9ea5530d06fc7fa2e4259aaf" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu air warrior v1.1 (japan)" sha1="3dc6a3ed33a1e2a061a3390853f16883ffc87835" />
</diskarea>
@@ -2322,7 +2308,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アリスの館CD" />
<info name="release" value="199107xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice no yakata cd (japan)" sha1="18693882b09f0eacbe48dff370524d0a3600bd0c" />
</diskarea>
@@ -2350,7 +2336,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="alice_no_yakata_2.hdm" size="1261568" crc="a05edc06" sha1="90da65a58d50fd00891f4166765c90ff973965d6" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice no yakata cd ii (japan)" sha1="d4224974ab42d6ac9b1dc999e77dd4513005aaae" />
</diskarea>
@@ -2370,7 +2356,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="ALS-0012"/>
<info name="alt_title" value="アリスの館3" />
<info name="release" value="199506xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice no yakata 3 (japan) (alt)" sha1="0e3abd7cec6ad5f53287429483caaccc07ad499c" />
</diskarea>
@@ -2390,7 +2376,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="ALS-0012"/>
<info name="alt_title" value="アリスの館3" />
<info name="release" value="199506xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alice no yakata 3 (japan)" sha1="a48140c8f109040bac0c446eb0095a900a911aec" />
</diskarea>
@@ -2420,7 +2406,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アローン・イン・ザ・ダーク" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alone in the dark (japan)" sha1="82552555c44cb7972a73e8261bc989447b231bce" />
</diskarea>
@@ -2523,7 +2509,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アローン・イン・ザ・ダーク2" />
<info name="release" value="199412xx" />
<info name="usage" value="Requires HDD installation and 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alone in the dark 2 (japan)" sha1="fb5efdcb2a27864b72a2ba61174d9f11b23207f2" />
</diskarea>
@@ -2585,7 +2571,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="akiko_gold_disk_a.hdm" size="1261568" crc="fd3d3924" sha1="f52b8c76fcf77c9f2d14938e65e99d2fea25db1f" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="akiko gold (japan)" sha1="f31bff32459dfd56aa29546a4af94e6e116481ac" />
</diskarea>
@@ -2613,7 +2599,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="亜紀子 プレミアム・バージョン" />
<info name="release" value="199303xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper girl - akiko - premium version (japan)" sha1="fa1b72c5b4a0ca23a32dd9f6004ea163d4578968" />
</diskarea>
@@ -2650,7 +2636,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アルシャーク" />
<info name="release" value="199305xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="alshark (japan)" sha1="99c36574a3826e2cbdece7271012314b425e090b" />
</diskarea>
@@ -2676,7 +2662,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="amaranth_iii.hdm" size="1261568" crc="05955c2f" sha1="dd81ce76b439af9b93f7c524dce4dab12c31e728" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="amaranth iii (japan)" sha1="70f1d4340f71b53e0aeedb263e60b98f59538407" />
</diskarea>
@@ -2702,7 +2688,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="ambivalenz-systemdisk.hdm" size="1261568" crc="7f3d6d6e" sha1="61c23afc9dc3b3ceaf2c28d6ab571d9bc83720fa" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ambivalenz - niritsu haihan (japan)" sha1="a3be28da629104bb09c9ea657b578d6a0d7ab6f6" />
</diskarea>
@@ -2722,7 +2708,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アメリカ横断ウルトラクイズ" />
<info name="release" value="199411xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="america oudan ultra quiz (japan)" sha1="b37c6ea23eee1686a20d8f86edaa8edbd674efd3" />
</diskarea>
@@ -2758,7 +2744,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="angel (save disk).hdm" size="1261568" crc="8ea3389b" sha1="60792d763d3cac54d19b04673b1f1811cf19b9a8" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="angel (japan)" sha1="03d8c60de05e3f8ed74f16c648dbb2da6d5fd6fe" />
</diskarea>
@@ -2779,7 +2765,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エンジェル・ハイロウ" />
<info name="release" value="199610xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="angel haloe (japan)" sha1="b65c8f9445378d0a1f74916464673278530f567b" />
</diskarea>
@@ -2796,7 +2782,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>&lt;doujin&gt;</publisher>
<info name="alt_title" value="AnotherTOWNS あなた~ フリーソフトウェアコレクション" />
<info name="usage" value="Requires 20 MB RAM" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="anotowns" sha1="f6b1a56808d9abd79b50a830b409c1b87659ab01" />
</diskarea>
@@ -2836,7 +2822,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-916 / OFMT-001"/>
<info name="alt_title" value="天晴CD Vol.1 飛龍の巻" />
<info name="release" value="199411xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="appare cd vol. 1 - hiryuu no maki (japan)" sha1="21551c98c9b484a0d1b5bb5aa6437a4d2e33a353" />
</diskarea>
@@ -2859,13 +2845,33 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="OFMT-002"/>
<info name="alt_title" value="天晴CD Vol.2 鳳凰の巻" />
<info name="release" value="199408xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="appare cd vol. 2 - houou no maki (japan)" sha1="ff8b7564345738c32a730254abb5912f3f5d11ad" />
</diskarea>
</part>
</software>
+ <software name="applijs">
+ <!--
+ Origin: redump.org
+ <rom name="FM Towns Appli Jikkou Set (TownsGEAR, F-BASIC386) V2.1 L20 (Japan).bin" size="62269200" crc="8d197f34" sha1="65b3fbb01677e9dbd839cf1091818d725cdd8d58"/>
+ <rom name="FM Towns Appli Jikkou Set (TownsGEAR, F-BASIC386) V2.1 L20 (Japan).cue" size="132" crc="4a98ceed" sha1="c673681ed88559b4c3cb537b3abc2bbf8b64c16d"/>
+ -->
+ <description>FM Towns Appli Jikkou Set (TownsGEAR, F-BASIC386) V2.1 L20</description>
+ <year>1993</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="B276E020"/>
+ <info name="alt_title" value="FM TOWNS アプリ実行セット(TownsGEAR,F‐BASIC386)V2.1L20" />
+ <info name="release" value="199306xx" />
+ <info name="usage" value="This disc is mainly intended to be used with the Marty console, to run software that requires TownsGEAR or F-BASIC without a mouse or keyboard"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="fm towns appli jikkou set (townsgear, f-basic386) v2.1 l20 (japan)" sha1="e4d85937887ad605b1d4614db14308fc73deb6c3" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="genchohi">
<!--
Origin: redump.org (CD) / Neo Kobe Collection (floppy)
@@ -2896,7 +2902,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="aoki ookami to shiroki mejika - genchou hishi (system disk).hdm" size="1261568" crc="fd062028" sha1="8153620634e8ae88ca07394c74bafc5f44729e68" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aoki ookami to shiroki mejika - genchou hishi (japan)" sha1="e683318c867c41c26d1fd7ea498ab9668045fd01" />
</diskarea>
@@ -2932,13 +2938,42 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ア・ラ・ベ・ス・ク ~少女たちの織りなす愛の物語~" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="arabesque - shoujo-tachi no orinasu ai no monogatari (japan)" sha1="c9474eff1c7e6d5078bb2b8ce6df8b176075bd3d" />
</diskarea>
</part>
</software>
+ <software name="arquelph">
+ <!--
+ Origin: redump.org
+ <rom name="Arquelphos (Japan) (Track 01).bin" size="12348000" crc="fe143313" sha1="0b09b5db49992c565026c0dae1cba19f5f96d150"/>
+ <rom name="Arquelphos (Japan) (Track 02).bin" size="45894576" crc="cf20a8d6" sha1="a0e17db8730b19f89cbe4f1f8860a9593af8feac"/>
+ <rom name="Arquelphos (Japan) (Track 03).bin" size="32556384" crc="266a58da" sha1="0bbe7eaff8abaac75d24b8fa6675c502dc394a04"/>
+ <rom name="Arquelphos (Japan) (Track 04).bin" size="24608976" crc="744672c4" sha1="bc2a624059a87a58d16cf436a93d597c28b6117f"/>
+ <rom name="Arquelphos (Japan) (Track 05).bin" size="26735184" crc="df6d6714" sha1="76d79cc7d5aaf7a99d200062260faf397c09bf57"/>
+ <rom name="Arquelphos (Japan) (Track 06).bin" size="21974736" crc="3886c34e" sha1="c6384f82afdce01a7bd0dcf354a0200026a208b5"/>
+ <rom name="Arquelphos (Japan) (Track 07).bin" size="21215040" crc="dc87ca7b" sha1="baf1d3d1851325c2fe8d7e8e1ae5850b52a45888"/>
+ <rom name="Arquelphos (Japan) (Track 08).bin" size="22567440" crc="6da1139c" sha1="d25c31cee364da6b000bf400b07460a24d8f8ccf"/>
+ <rom name="Arquelphos (Japan) (Track 09).bin" size="32297664" crc="1bf24c53" sha1="dfce3ef9de614e97a9c1f6bcecc3d6fc04f0e1b6"/>
+ <rom name="Arquelphos (Japan) (Track 10).bin" size="47529216" crc="18fdffbd" sha1="ccc34997e974f9feba179d921ce751f33de4f095"/>
+ <rom name="Arquelphos (Japan).cue" size="1135" crc="84eb3c33" sha1="12864c760e9661f12f2b9dc5fe456a78d5917984"/>
+ -->
+ <description>Arquelphos</description>
+ <year>1993</year>
+ <publisher>ディー・オー (D.O.)</publisher>
+ <info name="serial" value="HME-181 / MTC-1056"/>
+ <info name="alt_title" value="アルキルフォス" />
+ <info name="release" value="199307xx" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="arquelphos (japan)" sha1="be53947d056fadeb50c32922fb4cc45aa6a7753f" />
+ </diskarea>
+ </part>
+ </software>
+
<!--
This software was found as a loose disc included with a Marty console. It seems to be a catalog for an art rental service, but
otherwise it's a complete mystery. More information would be welcome.
@@ -2955,7 +2990,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-509"/>
<info name="alt_title" value="ARS アート・レンタリース 絵画複合検索システム" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ars art rentalease - kaiga fukugou kensaku system (japan)" sha1="b89d64c298761f861c9d5820038cf03471762c5c" />
</diskarea>
@@ -2974,7 +3009,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>Algo Software</publisher>
<info name="serial" value="HMA-248A"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="aska towns" sha1="027d5a8920980d5eccff93df192148b9acf51309" />
</diskarea>
@@ -3016,7 +3051,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="asuka 120 burning fest. excellent (boot disk).hdm" size="1261568" crc="12c7d6e2" sha1="0eb696be9666300d76863ae08882485eb69725d4" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="asuka 120 excellent - burning fest. excellent (japan)" sha1="8f355528fc46706bc856848665186115c2275fad" />
</diskarea>
@@ -3041,7 +3076,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ジ・アトラス" />
<info name="release" value="199110xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="atlas, the (japan)" sha1="576d2ac0f7af32ef5b8bffb5d7e1b1378263c9fc" />
</diskarea>
@@ -3097,7 +3132,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="atlas ii, the (japan) (system disk).hdm" size="1261568" crc="b1f326e8" sha1="681163e4d8c702c86d743f13697388cdbf2f5eca" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="atlas ii, the (japan)" sha1="81da4d2a619b9095f26b845ecd8ba7c723ec9339" />
</diskarea>
@@ -3124,7 +3159,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="Marty Demonstration CD '93 Fuyu" />
<info name="alt_title" value="オート・デモ’93冬" />
<info name="usage" value="Only works on the 386SX-based models (Marty/UX)"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="auto demo '93 fuyu (japan)" sha1="bf104b24fb6a602a25c6e543aa2daf93bce84be7" />
</diskarea>
@@ -3147,7 +3182,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-186 / A2760200 / TSC190"/>
<info name="release" value="199203xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="awesome (japan)" sha1="db185b5d510fe79ff750fec5438f63bc47064c88" />
</diskarea>
@@ -3168,7 +3203,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="はっちゃけあやよさん 1-2-3" />
<info name="release" value="199307xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a 1-2-3 (japan)" sha1="ea82773db2feb355667a754723899370a17df581" />
</diskarea>
@@ -3200,7 +3235,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="はっちゃけあやよさんⅣ ~セクシー・オリンピック~" />
<info name="release" value="199302xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="a4 - ayayo's live affection (japan)" sha1="c240db52b26be5688dea2a3bf58a12f76e59d0f5" />
</diskarea>
@@ -3224,7 +3259,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="ayumi-chan monogatari.hdm" size="1261568" crc="9bf209ba" sha1="cc2be00834492b0ccf5b25a1b0a5ceb810a2e330" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ayumi-chan monogatari (japan)" sha1="d2fe72822ec0e7fbf5d4b0b8ce30b8ad79fed459" />
</diskarea>
@@ -3246,7 +3281,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="あゆみちゃん物語 実写版" />
<info name="release" value="199501xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ayumi-chan monogatari - jisshaban (japan)" sha1="3653a0e14ecd9013bd2b8564069af095014a4512" />
</diskarea>
@@ -3277,7 +3312,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="アジャ" />
<info name="release" value="199302xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="azure (japan)" sha1="345f2e09eedc5bad3ec72e2df7eab21fc49d12c6" />
</diskarea>
@@ -3300,7 +3335,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMS-00306"/>
<info name="release" value="199601xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bacta 1&amp;2 + voice (japan)" sha1="985816039d5494a48a758d625974e5947d890a3d" />
</diskarea>
@@ -3358,7 +3393,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ソフメディア (SofMedia)</publisher>
<info name="serial" value="HMA-252"/>
<info name="release" value="198912xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="remember beatles no. 2 - michelle (japan) (en,ja)" sha1="63dfdc5407cbe5c6ff126d8cc1f08259a83365f1" />
</diskarea>
@@ -3421,7 +3456,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ソフメディア (SofMedia)</publisher>
<info name="serial" value="HMB-169"/>
<info name="release" value="199007xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="remember beatles no. 4 - let it be (japan) (en,ja)" sha1="5319e7628ca012ac5d4ccf6bda736b128faf0fdb" />
</diskarea>
@@ -3479,7 +3514,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ソフメディア (SofMedia)</publisher>
<info name="serial" value="HMB-171"/>
<info name="release" value="199008xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="remember beatles no. 5 - the long and winding road (japan) (en,ja)" sha1="be48fcdfde7a4548812c3638ea0c4a05aaaa09ac" />
</diskarea>
@@ -3538,7 +3573,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ソフメディア (SofMedia)</publisher>
<info name="serial" value="HMB-172"/>
<info name="release" value="199008xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="remember beatles no. 6 - imagine (japan) (en,ja)" sha1="4218209e657230a6da5d87054bf004a1e277844b" />
</diskarea>
@@ -3582,7 +3617,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="ballade for maria (disk a).hdm" size="1261568" crc="200678ab" sha1="c658fd357318eb5f1522c88ea333f70bda75a72a" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ballade for maria - maria ni sasageru ballade (japan)" sha1="30aaffec9c420d87dc0b0ffce34c703861ad07c1" />
</diskarea>
@@ -3622,7 +3657,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="band-kun.hdm" size="1261568" crc="840bd27f" sha1="6bb01bcd936060ebe58961b2b5d69f0b7aa5d33e" status="baddump" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="band-kun (japan)" sha1="817f4380745df385f62639958f3fdf1f3b7fd900" />
</diskarea>
@@ -3663,7 +3698,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="バトル・チェス" />
<info name="release" value="199109xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="battle chess (japan) (en,ja)" sha1="0697976fd0d3c5a8a1282d3bf3a319d50d525036" />
</diskarea>
@@ -3683,7 +3718,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="バトル" />
<info name="release" value="199210xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="battle (japan)" sha1="b3915a64ef4778d6ab8bcb66c78428def8f2de06" />
</diskarea>
@@ -3704,7 +3739,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ビースト3" />
<info name="release" value="199403xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="beast iii (japan)" sha1="32175214006229694f61831fcedac33d1d6ae6da" />
</diskarea>
@@ -3725,7 +3760,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ベルズ・アベニュー Vol.1" />
<info name="release" value="199308xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bell's avenue vol. 1 (japan)" sha1="91c10388bf8432d969b59dced8dbc8d61b1fb77a" />
</diskarea>
@@ -3746,7 +3781,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ベルズ・アベニュー Vol.2" />
<info name="release" value="199401xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bell's avenue vol. 2 (japan)" sha1="f7dbb84b48c5037e491b883f359de6b9438a72ee" />
</diskarea>
@@ -3769,7 +3804,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ベルズ・アベニュー Vol.3" />
<info name="release" value="199504xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bell's avenue vol. 3 (japan)" sha1="be691be310294eeaf9fd26d4ef9fc9341406842e" />
</diskarea>
@@ -3806,12 +3841,12 @@ User/save disks that can be created from the game itself are not included.
<rom name="bible master (system disk).hdm" size="1261568" crc="6c6415bc" sha1="8338b813203ba455285334a127f938f2f56de672" />
</dataarea>
</part>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="bible master - crash of the blleotrutz (japan)" sha1="014f0c293bc0c1ae62c42af8cbf6ed53c4ec3a9e" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Glodia Premium CD Single Vol. 2 - Bible Master - Crash of the BlleotRutz" />
<diskarea name="cdrom">
<disk name="glodia premium cd single vol. 2 - bible master - crash of the blleotrutz (japan)" sha1="80638f7a8d26fcdfc301d4e062a2c38d01fcc439" />
@@ -3840,7 +3875,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="biblemaster2-systemdisk.hdm" size="1261568" crc="f7cbb663" sha1="2e6789e1964500bf729cd78c8095c9c2386fd133" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bible master 2 - the chaos of aglia (japan)" sha1="2b213a5aa9573ea74465c67ea7e617151c43e1a4" />
</diskarea>
@@ -3879,7 +3914,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ビッグオナー" />
<info name="release" value="199209xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="big honour (japan)" sha1="e810dcd4ee51a464abcf5274ff708bd0b9e53f2e" />
</diskarea>
@@ -3900,7 +3935,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="バードランドの子守唄" />
<info name="release" value="199412xx" />
<info name="usage" value="Requires 4 MB RAM and TownsOS 2.1 L40 or later"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="toshiyuki yoshino - lullaby of birdland (japan)" sha1="f6f1b7a69289c427872067910f485d14c7972baa" />
</diskarea>
@@ -3984,7 +4019,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ブランディア" />
<info name="release" value="199409xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="blandia (japan)" sha1="dc189eaa29a134e350dc0dd14f309ae15a756229" />
</diskarea>
@@ -4004,7 +4039,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-124"/>
<info name="release" value="199204xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="blue - will to power (japan)" sha1="bb452ebe112775b005b4999a721f6d3b3fe6fcdf" />
</diskarea>
@@ -4037,7 +4072,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ボンバーマンぱにっくボンバー" />
<info name="release" value="199504xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bomberman - panic bomber (japan)" sha1="019a1d0b207d6f3492fcbe230638740857a00c12" />
</diskarea>
@@ -4090,7 +4125,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ベストプレーベースボール" />
<info name="release" value="199204xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="best play baseball, the (japan)" sha1="3edac55a3610917496413e93315180ff4a71e8de" />
</diskarea>
@@ -4110,7 +4145,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ブランマーカー" />
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="branmarker (japan)" sha1="064cb20e663b2c8f76e7c8597470035c5cbe30cd" />
</diskarea>
@@ -4135,13 +4170,13 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ブランマーカー2" />
<info name="release" value="199510xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Game Disc" />
<diskarea name="cdrom">
<disk name="branmarker 2 (japan) (game disc)" sha1="242b3fd57b45e08f29fba516257821ad7f132152" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Extra Disc" />
<diskarea name="cdrom">
<disk name="branmarker 2 (japan) (extra disc)" sha1="755865e904bf3ee527c629a45cea052f7bb10f5b" />
@@ -4167,7 +4202,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="バブルボブル" />
<info name="release" value="199010xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="bubble bobble (japan)" sha1="fa749f0cc3d0fa9e4946b5dce2a6b62a5bebeba6" />
</diskarea>
@@ -4212,7 +4247,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-122"/>
<info name="alt_title" value="ブライ -上巻-" />
<info name="release" value="199004xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burai (japan)" sha1="fda0121d5e1b6162217e0482af97a70389e98025" />
</diskarea>
@@ -4245,7 +4280,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ブライ -完結編-" />
<info name="release" value="199105xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="burai - kanketsu-hen (japan)" sha1="d41e001618a596877865e03a401ae53577dfa89b" />
</diskarea>
@@ -4265,7 +4300,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-167"/>
<info name="release" value="199211xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cal - towns (japan)" sha1="26747efe7dc470bd04af3872c257a670991498e7" />
</diskarea>
@@ -4286,7 +4321,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-243"/>
<info name="release" value="199307xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cal iii - kanketsu-hen (japan)" sha1="7adce4023f809277ce4309b8f285159b921589ba" />
</diskarea>
@@ -4306,7 +4341,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="MTC-1063"/>
<info name="alt_title" value="タイニィステップ CAL外伝" />
<info name="release" value="199307xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cal gaiden - tiny step - tiny steps behind the cal (japan)" sha1="166c9dbf4d56ae2d93b04421a002f10933f46223" />
</diskarea>
@@ -4332,7 +4367,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="california_x_party.hdm" size="1261568" crc="babe0a6f" sha1="1b2e158c7a38ba3f3c5fb10f7dbf81019eea9f0a" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="california x party - joshi daisei himitsu club (japan)" sha1="3f89afce9fe7dda66394de3d1a8325f06c91bada" />
</diskarea>
@@ -4367,7 +4402,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="きゃんきゃんバニー・プルミエール" />
<info name="release" value="199209xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="can can bunny premiere (japan)" sha1="7dc902c238777e4102d0b9ed2d1ae59f3caac422" />
</diskarea>
@@ -4399,7 +4434,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="きゃんきゃんバニー・エクストラ" />
<info name="release" value="199309xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="can can bunny extra (japan)" sha1="02dbc82e697a0f555a89c8bae6f623f841b73f95" />
</diskarea>
@@ -4438,7 +4473,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="キャッスルズ" />
<info name="release" value="199210xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="castles (japan) (en,ja)" sha1="8652d9b80eb97df62ba9bf8c4d8e592603087064" />
</diskarea>
@@ -4472,7 +4507,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="キャッスルズⅡ ~ブルターニュ統一戦記~" />
<info name="release" value="199310xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="castles ii - bretagne touitsu senki ~ castles ii - siege &amp; conquest (japan) (en,ja)" sha1="0875d593cda259e6f63a97d065e50bcc35af74ab" />
</diskarea>
@@ -4501,7 +4536,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="キャッツ・パート1" />
<info name="release" value="199304xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cat's part-1 (japan)" sha1="8985f14c6c8647ee8457e01c02f6b5d9672b0061" />
</diskarea>
@@ -4535,7 +4570,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="センチュリオン" />
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="centurion - defender of rome (japan)" sha1="b40734a0252bebfed3921d6b4e1069c273ce71ae" />
</diskarea>
@@ -4555,7 +4590,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="CGシンジケート Vol.1 リサ・ノースポイント" />
<info name="release" value="199112xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cg syndicate vol. 1 - lisa northpoint (japan)" sha1="eaf4be8306fa7f14699bc4a678366d687ab85da6" />
</diskarea>
@@ -4593,7 +4628,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="TAITO チェイスHQ" />
<info name="release" value="199108xx" />
<info name="usage" value="Requires 2 MB RAM. Supports analog joystick on second controller port (Personal Computer mode). Use a Towns Pad on first port to navigate menus." />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="taito chase h.q. (japan)" sha1="8ec3b12763866865ace239e717297b2defcaba43" />
</diskarea>
@@ -4632,7 +4667,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="TAITO チェイスHQ" />
<info name="release" value="1991xxxx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="taito chase h.q. (japan) (demo)" sha1="531f1102be4e13ac9e8a90a040bb706ae9a2d12f" />
</diskarea>
@@ -4679,7 +4714,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="chiemi-and-naomi.hdm" size="1261568" crc="7b3706d4" sha1="a63be0d0426e54291586f8d246c4fab58630026d" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="chiemi &amp; naomi (japan)" sha1="dcdb4cccbce006739a1d48959fc7514441b2240c" />
</diskarea>
@@ -4700,7 +4735,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="見る観る探す昆虫シリーズ① 「小さな演奏家」" />
<info name="release" value="199309xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mirumiru sagasu konchuu series vol. 1 - chiisana ensouka (japan)" sha1="287b3b22a38203e51c345e95cebfd6127d9cd424" />
</diskarea>
@@ -4727,7 +4762,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="【テクノストレス予防法シリーズ】 鎮静" />
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="technostress yobou-hou series - chinsei (japan)" sha1="4a56ee0db62782316a0c074ece19c03caab05bb2" />
</diskarea>
@@ -4755,13 +4790,43 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="注文の多い料理店" />
<info name="release" value="199108xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="chuumon no ooi ryouriten (japan)" sha1="2767d3c209e4b5122d0ebcde2e86c8c084acd31f" />
</diskarea>
</part>
</software>
+ <!-- Shows a FMTボードが装着されていません (FMT board is not installed) error on startup, possibly referring to a MIDI board? -->
+ <software name="citylights" supported="no">
+ <!--
+ Origin: redump.org
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 01).bin" size="10231200" crc="e5cefd64" sha1="7ae3a9f94f2e23adede0c9173fadce6a95fd9321"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 02).bin" size="50575056" crc="a1c398fa" sha1="3de64a4ded1eeca9d55a16b59706d7f72988fa0e"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 03).bin" size="29094240" crc="85c75ee4" sha1="9fde37a50da20ef1a962a24a97b7339ae1cd64ef"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 04).bin" size="33222000" crc="824a6279" sha1="0798d9996e27e3f5b25be65aa9043a4b871539a8"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 05).bin" size="37761360" crc="6d2c59fa" sha1="ec48bf15336c774d49178efd9c4823b65ba693b5"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 06).bin" size="43394400" crc="da32a788" sha1="b16f55cfffdf9321c11378a492b72caa6d5e77c3"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 07).bin" size="32046000" crc="51b2e580" sha1="a24c31f5015ebb018a24f4fb7983f69fe8c7147c"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 08).bin" size="53926656" crc="5f8461e3" sha1="3c589f5f5ac99f4f490c30dcab7cc82e7b01d20c"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 09).bin" size="21744240" crc="e946d38f" sha1="a3e8d7ba061dda067f603145f54a516ce6c80274"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 10).bin" size="35785680" crc="4aeb528e" sha1="aa2856aa8dc2aa02b1b4e8607873185b9678e287"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 11).bin" size="36296064" crc="414b8972" sha1="98764d714d551d32a23832333e7488a2f8dbd36b"/>
+ <rom name="Tele Harmonium - City Lights (Japan) (Track 12).bin" size="39254880" crc="7b32c440" sha1="30ad958e87336546289b2ca054288a383490679d"/>
+ <rom name="Tele Harmonium - City Lights (Japan).cue" size="1577" crc="45e8c018" sha1="e3e824ad6658caa25cf6ccc7027dc281324c5ea5"/>
+ -->
+ <description>Tele Harmonium - City Lights</description>
+ <year>1992</year>
+ <publisher>レイゾン (Raison)</publisher>
+ <info name="serial" value="HMD-145 / THC-FMT"/>
+ <info name="release" value="199208xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="tele harmonium - city lights (japan)" sha1="ae8b4e8679febe5a9e99de5dcf7d502900dcb346" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="classrod">
<!--
Origin: redump.org
@@ -4776,13 +4841,43 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="クラシック・ロード" />
<info name="release" value="199402xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="classic road (japan)" sha1="145861579700401c4229ccbeb64819d93031ae2e" />
</diskarea>
</part>
</software>
+ <software name="clearmind">
+ <!--
+ Origin: redump.org
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 01).bin" size="15530256" crc="95fc42e3" sha1="df7e4fdc8124c87b2bf3fad408e3e463829aa0a0"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 02).bin" size="63802704" crc="120ac0dc" sha1="084aab544fd11079525c9797c6ca3fefc72d4282"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 03).bin" size="124757136" crc="c526fee8" sha1="7e017d52860e105e1d3f337938963d02c43e8031"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 04).bin" size="79925664" crc="50b0becb" sha1="4a5a03714af34397aed577c40eea1f9cb349b529"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 05).bin" size="95467680" crc="106c92dc" sha1="16d95c66cd0c9b0a155b16bef881799f0d9d2e29"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 06).bin" size="84754320" crc="34919d72" sha1="77183b71c8841e0c1a17a2647322df6da48038ae"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 07).bin" size="70901040" crc="413535a2" sha1="81788d6ced7082085d685a00596323fa47dbb8d7"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 08).bin" size="15676080" crc="b2f4ac46" sha1="5c3bea1a80d9cd797496e52dca1b1c2e78234b68"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 09).bin" size="25949616" crc="07dd2ec6" sha1="fe112f38bc388af93b81f7fc0dde3abfe41029d5"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 10).bin" size="28628544" crc="a376ac12" sha1="6500d89c5234f6eb8400e3d8410218d971dfa323"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 11).bin" size="24002160" crc="f0c191c4" sha1="b9706003e41b0b4e97b2459ad2c4054bd156cb74"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan) (Track 12).bin" size="4233600" crc="4580866a" sha1="aaefaba5020efb03452df764e2897d0f278e3151"/>
+ <rom name="ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu (Japan).cue" size="1878" crc="294845e6" sha1="6b36d017096b731d49fe0f3dbb85a85ce536070f"/>
+ -->
+ <description>ClearMind - Shimoguchi Yuuzan no Shuuchuuryoku Kaihatsu</description>
+ <year>1989</year>
+ <publisher>CRI</publisher>
+ <info name="serial" value="HMA-210"/>
+ <info name="alt_title" value="ClearMind 下口雄山の集中力開発" />
+ <info name="release" value="198908xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="clearmind - shimoguchi yuuzan no shuuchuuryoku kaihatsu (japan)" sha1="15fa0b540c0b4d55375c18e27b92e638b0eafc55" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="collecd">
<!--
Origin: redump.org
@@ -4806,7 +4901,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="コレクターD" />
<info name="release" value="199308xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="collector d (japan)" sha1="2f850a661a875aae8910c29168f9373af9d9dec8" />
</diskarea>
@@ -4843,7 +4938,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="コレクターD 番外編 極楽台西地区セールス大作戦" />
<info name="release" value="199309xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="collector d - bangai-hen - gokurakudai nishichiku sales daisakusen (japan)" sha1="2b92d4a0685d1f83893a1c5c7304121079738e84" />
</diskarea>
@@ -4862,7 +4957,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-235-Y"/>
<info name="release" value="198912xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="case of the cautious condor, the (japan)" sha1="0f05cc7eaf07262e3b6a523ac361ff52ae46bf73" />
</diskarea>
@@ -4881,7 +4976,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>グラムス (Glams)</publisher>
<info name="serial" value="GLA-01488"/>
<info name="usage" value="Requires TownsOS V2.1, 8 MB RAM and a 486 CPU"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="config" sha1="8a52d69abe04fa84ece7038e0167ffdbf136e056" />
</diskarea>
@@ -4901,7 +4996,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-203"/>
<info name="alt_title" value="クレヨナージュ" />
<info name="release" value="199108xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="crayonnage (japan)" sha1="3a689ef44a3b308e80d963a52a40b36c01b3f63d" />
</diskarea>
@@ -4919,7 +5014,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>CRI</publisher>
<info name="serial" value="HMA-205"/>
<info name="release" value="198907xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="criss ver. 1.00 (japan)" sha1="d75a23a60a9d8bf787da675a78475f5141c5d752" />
</diskarea>
@@ -4963,7 +5058,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="crystal_rinal.hdm" size="1261568" crc="c1ce9e3e" sha1="33a14ab80dcbb22d1c55ce7886aff91f089b92d2" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="crystal rinal - ouma no meikyuu (japan)" sha1="4e5d63dff3da55ca2137c1388b332c56a648bad4" />
</diskarea>
@@ -4980,7 +5075,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>キャスト (Cast)</publisher>
<info name="release" value="198905xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="c-trace (japan)" sha1="ddb50d8e4dcc4ac0a77bc2dab59604c3e178b52d" />
</diskarea>
@@ -4999,7 +5094,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="FMB-4006 / B276E240"/>
<info name="usage" value="Requires 4 MB RAM" />
<info name="release" value="199405xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cubic sketch v1.1l10 (japan)" sha1="8add69fd06c252822725abe9da869be9e6a184bb" />
</diskarea>
@@ -5046,7 +5141,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="カース" />
<info name="release" value="199502xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="curse (japan)" sha1="83e15d0ca514f344f4f059f289977b758f87e0a2" />
</diskarea>
@@ -5080,7 +5175,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="custommate.hdm" size="1261568" crc="769d513d" sha1="b09a09b655cf7d68be18f0f46dc990eac2fc79d8" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="custom mate + denwa no bell ga... (japan)" sha1="421ff8ba3a4e1579f672725959304fee9657c56d" />
</diskarea>
@@ -5122,7 +5217,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="custommate2.hdm" size="1261568" crc="7ea7f95a" sha1="23be34e523e56b51934b0428f4afeeda1243cdca" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="custom mate 2 + itsuka dokoka de (japan)" sha1="99441d82ee2cd9f5f8e45e2a6fc7168646f98413" />
</diskarea>
@@ -5145,7 +5240,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-108 / YB-002"/>
<info name="release" value="199402xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cover girls vol. 1 - sexy photos with sophisticated sound (japan)" sha1="514cd826e1370c3168e7ea0fabdea602f8deadc3" />
</diskarea>
@@ -5182,7 +5277,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="cybercity (boot disk).hdm" size="1261568" crc="384203a7" sha1="8e332eae5055a911c87dd2038f550ec614c30111" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cybercity - the golden age of cybernetics (japan)" sha1="9fb7583104a9d2d08d8a901ca339074e30b969ad" />
</diskarea>
@@ -5203,7 +5298,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="サイベリア" />
<info name="release" value="199505xx" />
<info name="usage" value="Requires HDD installation and 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cyberia (japan)" sha1="27ae2fa1cec90c103e05e2ea7101cd828f630f1e" />
</diskarea>
@@ -5230,7 +5325,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="cyber motion v1.0.hdm" size="1261568" crc="1094490c" sha1="3016dc7894768814d7544a89899af2a56123f250" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cyber motion (japan)" sha1="191d7c0f377272c69ae9d6bc817992a2d5b57ba2" />
</diskarea>
@@ -5250,7 +5345,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="サイバー・スカルプト" />
<info name="release" value="199111xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="cyber sculpt (japan) (rev a)" sha1="04983debbc720a3b897cc53c7f70e16a3f932329" />
</diskarea>
@@ -5270,7 +5365,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="コンピュータ図鑑 植物篇" />
<info name="release" value="199112xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="computer zukan - shokubutsu-hen (japan)" sha1="522ceba7066e8f71225c67aff19e073f760c22f2" />
</diskarea>
@@ -5295,7 +5390,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="ALS-0014"/>
<info name="alt_title" value="DPS全部" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="d.p.s. zenbu (japan)" sha1="de2e12b3299d593641e6df9a722e1f3aa5f19c08" />
</diskarea>
@@ -5331,7 +5426,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="daikoukai jidai (save disk).hdm" size="1261568" crc="a70bd7c7" sha1="887b11e25a7f07644245b3764b62bab6e14839bd" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="daikoukai jidai (japan)" sha1="35d466294cd68fe84e818b114991f1b65dd8204e" />
</diskarea>
@@ -5369,7 +5464,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="daikoukai jidai 2 (save disk).hdm" size="1261568" crc="53f2a3fb" sha1="5523e3ecd3748461a208b4b9e4778bf3e98e831f" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="daikoukai jidai ii (japan)" sha1="f2baa273aae7787b3e82bca01f42db040c35bd98" />
</diskarea>
@@ -5398,7 +5493,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="daisenryaku iii '90 (game disk).hdm" size="1261568" crc="d6fae63a" sha1="b55b1e005c22bf68ef523e81695146e6b7180376" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="daisenryaku iii '90 (ninety) (japan)" sha1="81e66a4dbe35f792337004eb4551ac369dc08252" />
</diskarea>
@@ -5436,7 +5531,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="dalk (boot disk).hdm" size="1261568" crc="64570ac2" sha1="c3b288ed90f57c218b3cfd9f7d962fd61063e88a" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dalk (japan)" sha1="45fdae45a2f6fb5340167a46a9f8e0f8c0ebd66a" />
</diskarea>
@@ -5473,7 +5568,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="dalk.hdm" size="1261568" crc="61bfa42c" sha1="6fa5c82bb8caa68ba8b39a2da825d049f237eb5d" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dalk (japan)" sha1="45fdae45a2f6fb5340167a46a9f8e0f8c0ebd66a" />
</diskarea>
@@ -5492,7 +5587,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="2TD-3027"/>
<info name="release" value="199606xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dangel (japan)" sha1="ff4ddc6fbc13d3c4b28d2a0cc738c7b674ca3d5c" />
</diskarea>
@@ -5531,7 +5626,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="tamashii_no_mon.hdm" size="1261568" crc="a80ca050" sha1="9c99bac43cc237f7b8845676104b08fdf2fcd7d3" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="tamashii no mon - dante shinkyoku yori (japan)" sha1="b5bd130adc1bde19a8da86c0b87c75c0f79b4226" />
</diskarea>
@@ -5550,7 +5645,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>データウエスト (Data West)</publisher>
<info name="serial" value="DWWI4920"/>
<info name="usage" value="Requires 3 MB RAM. Make a bootable TownsOS 2.1 floppy disk, copy the files from the TOWNS directory in the CD to it, and boot from it."/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="daps for windows (japan)" sha1="de6878a554d64357905824da3e9131523ecb4355" />
</diskarea>
@@ -5583,7 +5678,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デ・ファーナ" />
<info name="release" value="199511xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="de.fana (japan)" sha1="58b7981c2acb1e9fe0e3664ccc11119d18306472" />
</diskarea>
@@ -5604,7 +5699,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デビューします・・・ 中川裕子" />
<info name="release" value="199406xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="debut shimasu... vol. 1 - nakagawa yuuko (japan)" sha1="88ac13e766313d6cce34e50b9c62ca9cccb6aa00" />
</diskarea>
@@ -5625,7 +5720,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デビューします・・・2 野上アキ" />
<info name="release" value="199407xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="debut2" sha1="8490214513d8533565d50fb9b5e0aaf0cf344d21" />
</diskarea>
@@ -5643,7 +5738,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>風雅システム (Fuga System)</publisher>
<info name="alt_title" value="新世紀興亡史 デッド・フォース" />
<info name="release" value="199506xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="shinseiki kouboushi - dead force (japan)" sha1="163b64c730ffb2c1c7d7d48b042e76cec1a4591a" />
</diskarea>
@@ -5671,7 +5766,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デッド・オブ・ザ・ブレイン 死霊の叫び" />
<info name="release" value="199302xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nightmare collection - dead of the brain - shiryou no sakebi (japan)" sha1="b1f04b77c641b343b74e82ceb9982aa5ed3726e5" />
</diskarea>
@@ -5702,7 +5797,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デスブレイド" />
<info name="release" value="199211xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="death brade (japan)" sha1="d5a64749f2908093d5d5a84d774f08a995f3280a" />
</diskarea>
@@ -5722,7 +5817,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ディープ" />
<info name="release" value="199503xx" />
<info name="usage" value="Requires 2 MB RAM and TownsOS V2.1L20 or later"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="deep (japan)" sha1="2f383f801807e8c7fdb95f8a4c7751392223dc4f" />
</diskarea>
@@ -5740,7 +5835,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>エルフ (Elf)</publisher>
<info name="serial" value="HMD-157 / AOBA-8"/>
<info name="release" value="199208xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="de-ja ii (japan)" sha1="c87f65dc83d2201db10332bb46035fc41dc5bd3e" />
</diskarea>
@@ -5772,13 +5867,118 @@ User/save disks that can be created from the game itself are not included.
<rom name="fm towns demonstration cd-rom '90. fuyu - the galaxy of fm towns (japan) (floppy 0).hdm" size="1261568" crc="256383c4" sha1="1f65a0b58e04ad1c4eb7c5be4bf456defd734c0b" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns demonstration cd-rom '90. fuyu - the galaxy of fm towns (japan)" sha1="439713d53fa02b815dfd4e15f0fbab8d1245d8a2" />
</diskarea>
</part>
</software>
+ <!-- Missing a floppy disk -->
+ <software name="demo92sp" supported="no">
+ <!--
+ Origin: redump.org
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 01).bin" size="147823200" crc="6d9f42dc" sha1="7fcf8479d362bbe3221d09b82d6646e6dea9492e"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 02).bin" size="1234800" crc="d42c677c" sha1="37276f79e8923d659b24ed3ab916b9191e89f5c6"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 03).bin" size="23108400" crc="234ba86f" sha1="21975a1a6f16693c88e8f7b4a41ede4fd36da10e"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 04).bin" size="13182960" crc="7fe71397" sha1="9def873aeb675c9c87b4a8ecf66834819d6feca6"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 05).bin" size="23155440" crc="68368d61" sha1="6eb00b8d6ec6dbee68404ae3bcffe5b5506d6beb"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 06).bin" size="24432576" crc="6a4208f8" sha1="2b182a0d143603b8eb6fb236ac8d2ee658f9a126"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 07).bin" size="20979840" crc="35b4cca6" sha1="3cb87e79b32bda584d08ce47d0afa5078f31a295"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 08).bin" size="23148384" crc="891f404c" sha1="29d3dd7158b26958525da4c78d9313c54816b448"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 09).bin" size="12030480" crc="ff9170de" sha1="440271d337bd9a90987c26f8580f13e670896440"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 10).bin" size="9019920" crc="ced4a6af" sha1="297048fba6708f637df08aa03d41c6572d03b93c"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 11).bin" size="3335136" crc="e0f9ff61" sha1="619d096710ba60b6b06b84486af175b9d86f3e67"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 12).bin" size="23607024" crc="33b0207d" sha1="9caac49c5450943daf360da0807f32c897ce406b"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 13).bin" size="11148480" crc="009966af" sha1="6b6f367bfa76ba3d1cfba99152e0a85b9283e57f"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 14).bin" size="10391136" crc="86bf7b9e" sha1="9d4a8d6f680e95506e3daef9a436a47a15ec6082"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 15).bin" size="8848224" crc="dbaf39ef" sha1="68dc955db5e13bea825d16c9eae0043a3878e956"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 16).bin" size="69007680" crc="38b99939" sha1="686094cea98eb9bb2804918f6935aa3b02b719ca"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 17).bin" size="23073120" crc="938d172c" sha1="7bd4f3025588ca397e37cac6bd782da9ffc7c7b2"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 18).bin" size="4664016" crc="f87f4f2b" sha1="0f463374d442e080bf6bbc49faea218ce6a593be"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 19).bin" size="5092080" crc="f4209239" sha1="0c0d6a0572e7610d5ca56fbc0e5aac34eefd6025"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 20).bin" size="6373920" crc="1772755e" sha1="399a209f425abd25c02394acfac7807a5b378eb4"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 21).bin" size="60869760" crc="a4c93e10" sha1="e1eb6e9f25e1dad5c8c1467e6cf9e18c7a70b4fc"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 22).bin" size="7773360" crc="9ba85492" sha1="ea3efc45d950e57bf630fc9bdfa3ecd2f183220c"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 23).bin" size="9161040" crc="f37a0446" sha1="a178023df85b588e06aaf1baab9599242e4876fb"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 24).bin" size="7761600" crc="93fd4295" sha1="9e424917e84723ed125cff81ffff68ea0007ee99"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 25).bin" size="9513840" crc="49a65667" sha1="ad9f061fdc80d0371b1ec17859ab39dc72d47190"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 26).bin" size="7067760" crc="3b551fef" sha1="5ba2a5f8301f3fb6a27234618960187661bbd98c"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 27).bin" size="7495824" crc="1bec69f2" sha1="37254304a2d0048f98e86268bc33a0d8d5f1b1c7"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 28).bin" size="2058000" crc="6dd055d4" sha1="0e1942d2d55979bc77d2559e9088681ec159e131"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 29).bin" size="15146880" crc="f237d516" sha1="b8f91312c6d8626466a238a33dd16496aa02cdb5"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 30).bin" size="4833360" crc="25b8725f" sha1="d213a00384e8e0d8acd21c389d6ef571606f869e"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 31).bin" size="5569536" crc="c615e1b8" sha1="e7edbfb1ba610294d7dd598cd2fbe69215ede264"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 32).bin" size="3810240" crc="1e4ebd0b" sha1="6b875d2048b6018ff8a57b7ef36598b71e29e183"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 33).bin" size="35797440" crc="9660e2e5" sha1="cd91c7b583d74f6b4ed35ccbe0902339434d53cd"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 34).bin" size="11395440" crc="f7731c65" sha1="dad1ef298e62d8481cacd0578b1e50ef9c3ef128"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 35).bin" size="5249664" crc="4a81f106" sha1="3fd546467ce763aff0ad29492c9d9002652463ca"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 36).bin" size="3582096" crc="e6c77aea" sha1="221a8b0e47179ac66ef25bb1b763ecefa56a5bcf"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 37).bin" size="6049344" crc="aaa71f3c" sha1="4be53e7a7452d8197ede94019f1c011b7d4799ea"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 38).bin" size="3535056" crc="5aca1d83" sha1="e9d80e7404eaf529fb12915044a16cd33d7e4f6f"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 39).bin" size="4344144" crc="4b652073" sha1="a88c8bd694675383917eace55af5f6f9568c17b4"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 40).bin" size="3669120" crc="044b6d29" sha1="a6cf5bb89ca725c568efa0510d88cbf011388e63"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 41).bin" size="11520096" crc="9789384d" sha1="d6707c8c86dd01b55986b1f47018505567faf7ef"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 42).bin" size="11877600" crc="5f05f036" sha1="86d4954e07d14f42ab71640b7ec55e2b378af1af"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 43).bin" size="15511440" crc="2be847e0" sha1="7538e590a3cc72117418014a80329f50a4a5ce15"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan) (Track 44).bin" size="11901120" crc="002cb91e" sha1="fcd8bffd431555c9785c94a31a9e36f77f91d200"/>
+ <rom name="FM Towns Demonstration CD-ROM 1992-nen Haru-gou (Japan).cue" size="6582" crc="05b2385a" sha1="e900857c6c10ee0cbec3ad4dc72ab649aa27859d"/>
+ -->
+ <description>FM Towns Demonstration CD-ROM 1992-nen Haru-gou</description>
+ <year>1992</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="HMC-933"/>
+ <info name="alt_title" value="FM TOWNS デモンストレーションCDーROM 1992年 春号" />
+ <info name="release" value="199202xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="fm towns demonstration cd-rom 1992-nen haru-gou (japan)" sha1="7b55eb6d851b8f57c1bef642e8d4a8ff342cbfe5" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="demo93sp">
+ <!--
+ Origin: redump.org
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 01).bin" size="348919200" crc="d961bb3f" sha1="64c5c208605af590e814fd2d96c3dec43cedec1b"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 02).bin" size="28231056" crc="1077c717" sha1="ac33fb0411b1a5be2bcefab13b1d76acdb9c47ef"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 03).bin" size="3050544" crc="94b43946" sha1="8788e4a904a6d0bb36e5dd42f5d4ef78d10b95e2"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 04).bin" size="75588576" crc="64b58001" sha1="847378de155cf0a3b686c1b837b33ac116995242"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 05).bin" size="7566384" crc="1c39db5f" sha1="1fc30168a1b36b5ee73e54cd13d82f44283f673d"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 06).bin" size="27396096" crc="41b41a65" sha1="d686c41bb42093cc1b298430b0ad3e2173658467"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 07).bin" size="6390384" crc="c1bcec04" sha1="72f05e911a3fe29189ba3ae8d4dc2eebc77d4128"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 08).bin" size="2488416" crc="15e93c62" sha1="0f349e9eb6dedcee340873b5e147ab9cd7a0ca23"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 09).bin" size="23148384" crc="c409a561" sha1="d1afb2c2aa73d106bb785509c096cb2cd49238bd"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 10).bin" size="16440480" crc="88334550" sha1="b0eeb20af59fdb4e1a57ed0ab6b65f3dc5a35d3a"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 11).bin" size="11783520" crc="d236d0e7" sha1="4a0cdae61f53388a28820198a0f8bf383923a175"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 12).bin" size="31810800" crc="831ec9bb" sha1="d4c08b39ea06c1bb5258b52636e52b7b92de3886"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 13).bin" size="21814800" crc="d0687e9f" sha1="dc11bbcb8bbbe8725723b367876df6f965032619"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 14).bin" size="11865840" crc="c9fcde6f" sha1="79638d8e01ea012f3265c8e69eb93c73b9114123"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 15).bin" size="6503280" crc="9112a45b" sha1="97792c4fc68486bec62d00ee1b06088ae183e6f2"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 16).bin" size="6326880" crc="2bc9007a" sha1="5d560a4c9255bfe9b530c676de3c0dc97c4d5b7b"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 17).bin" size="4010160" crc="351e9932" sha1="b449dd309b6f4f04191f3d942f5e362be187f460"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 18).bin" size="8368416" crc="574ddd0c" sha1="87dfe37fca327f250665e901985539641b8d8316"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 19).bin" size="3974880" crc="f3eca615" sha1="68c7e54ed6da45e60ab52b6de22e815150ce9d07"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 20).bin" size="2744784" crc="ec0e88c1" sha1="d8cfb40946ba7a1d575cf4cb4e804a76631870cf"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 21).bin" size="1147776" crc="d07b00ea" sha1="224ca8f81c6027bc5a23fe141fe7a08e2e52db5c"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 22).bin" size="1498224" crc="5d4b7bff" sha1="88b7d8ede83fd03037993b1de382d2bd5915c869"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 23).bin" size="1147776" crc="39a5721c" sha1="e7b1dfb99b192b6442c923cd6c550b1ea4d05ec1"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan) (Track 24).bin" size="1851024" crc="81f91b85" sha1="b5ab06ae0b2c93558e6b1fb03209748ee01a7063"/>
+ <rom name="FM Towns Demonstration CD-ROM 1993-nen Haru-gou (Japan).cue" size="3582" crc="d06e0811" sha1="0adbd04a77422e2ef7df7a7ba380eff1dd7fbc14"/>
+ -->
+ <description>FM Towns Demonstration CD-ROM 1993-nen Haru-gou</description>
+ <year>1993</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="HME-902"/>
+ <info name="alt_title" value="FM TOWNS デモンストレーションCDーROM 1993年 春号" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="fm towns demonstration cd-rom 1993-nen haru-gou (japan)" sha1="4ab8fba1fc70889d976df2ea4a65621eff2250e8" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="demo93w">
<!--
Origin: redump.org
@@ -5792,7 +5992,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="FMTownsⅡ デモンストレーション CD‐ROM ’93 Winter" />
<info name="release" value="199311xx" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns ii demonstration cd-rom '93 winter (japan) (rev a)" sha1="3b1104e1fed3dd767c571b099f0044024eb68f37" />
</diskarea>
@@ -5812,7 +6012,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="FMTownsⅡ デモンストレーション CD‐ROM ’94 Spring" />
<info name="release" value="199402xx" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns ii demonstration cd-rom '94 spring (japan)" sha1="8a325cfa802efd711583a7a0f0cd884db3a7f07b" />
</diskarea>
@@ -5832,7 +6032,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="FMTownsⅡ デモンストレーション CD‐ROM ’94 Summer" />
<info name="release" value="199407xx" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns ii demonstration cd-rom '94 summer (japan)" sha1="fbb4df2bd6aaa23e37b581e20d486c0ca61d6328" />
</diskarea>
@@ -5862,7 +6062,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デーモン・シティ" />
<info name="release" value="199403xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="demon city (japan)" sha1="26150bbf7e01730559884a1cb563d279df63bbb0" />
</diskarea>
@@ -5885,7 +6085,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="電撃ナース" />
<info name="release" value="199212xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dengeki nurse (japan)" sha1="b447a0457a28ef2948ce1385bb6c20c7285b3458" />
</diskarea>
@@ -5932,7 +6132,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="dengeki_nurse_2_disk_a.hdm" size="1261568" crc="66dce100" sha1="368eb88d1da7120f19036ff4e95e533dd0b0dde4" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dengeki nurse 2 - more sexy (japan)" sha1="85cc56278d4bf5be331642e982c963e6b21145c5" />
</diskarea>
@@ -6004,7 +6204,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-161"/>
<info name="alt_title" value="それゆけ!ダイビング" />
<info name="release" value="199007xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="sim sports diving - soreyuke diving (japan)" sha1="3a8d284417d000ac507735124fd14674f1de7093" />
</diskarea>
@@ -6025,7 +6225,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="夢現 -Dreamy-" />
<info name="release" value="199205xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="yumeutsutsu - dreamy (japan)" sha1="cd2a18850570ec92b2ae79556db19d2ff4adb73e" />
</diskarea>
@@ -6074,7 +6274,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ダービースタリオン" />
<info name="release" value="199402xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="derby stallion (japan)" sha1="e8f00f5d75abe71b3795cb2a68592e158056f5ed" />
</diskarea>
@@ -6100,7 +6300,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="デザイア 背徳の螺旋" />
<info name="release" value="199411xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="desire - haitoku no rasen (japan)" sha1="002657064a465e7c850dee6df76f5826ef606964" />
</diskarea>
@@ -6127,7 +6327,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="diamond_players.hdm" size="1261568" crc="e36732a6" sha1="08ef60cb6eb109d8f60ff2e9c7330dca50210345" status="baddump" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="diamond players (japan)" sha1="f58651f6ecfb85504e1ed83fd7469d4c96348056" />
</diskarea>
@@ -6165,7 +6365,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="大逆鱗" />
<info name="release" value="199511xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="die gekirin" sha1="2c8e76eebd8b8578cbe7fc3b7b69298de39a9bfd" />
</diskarea>
@@ -6183,13 +6383,32 @@ User/save disks that can be created from the game itself are not included.
<publisher>トランスペガサス (Transpegasus)</publisher>
<info name="serial" value="HME-107"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="digital pinup girls vol. 1 - sexy shooting (japan)" sha1="c62c0db301de2e0ffc4456e8319b1e691681e65c" />
</diskarea>
</part>
</software>
+ <software name="digipin2">
+ <!--
+ Origin: redump.org
+ <rom name="Digital Pinup Girls Vol. 2 - Lovely Shooting (Japan).bin" size="344885520" crc="63a5c540" sha1="26c9d7fab3b1e55e0f95cedd5e0d75372fc7725c"/>
+ <rom name="Digital Pinup Girls Vol. 2 - Lovely Shooting (Japan).cue" size="118" crc="78b20729" sha1="abe717b49f669f405d16ef28f03c186bacf202aa"/>
+ -->
+ <description>Digital Pinup Girls Vol. 2 - Lovely Shooting</description>
+ <year>1993</year>
+ <publisher>トランスペガサス (Transpegasus)</publisher>
+ <info name="serial" value="HME-137"/>
+ <info name="release" value="199306xx" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="digital pinup girls vol. 2 - lovely shooting (japan)" sha1="b8b7fc58f7dffe8fc7fa2ccbf54929dcd47d2a30" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="dodamega">
<!--
Origin: redump.org
@@ -6207,7 +6426,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-250"/>
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doda-mega mix (japan)" sha1="8f22b6018c1451d6d22fea585c9457e2138ce489" />
</diskarea>
@@ -6237,7 +6456,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-130 / 2TD-3012"/>
<info name="alt_title" value="どきどきディスクCD版 第1巻 クラブD.O.事務局" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doki doki disk cd-ban vol. 1 (japan)" sha1="8bf3875f21ba28d30b7e837344d5560b15fe32e3" />
</diskarea>
@@ -6264,7 +6483,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="DCD-0004"/>
<info name="alt_title" value="どきどきディスクCD版 Club D.O. vol.2" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doki doki disk cd-ban vol. 2 (japan)" sha1="7f724424639975dcbc6aa7e003862bf74ce4f199" />
</diskarea>
@@ -6283,7 +6502,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ディー・オー (D.O.)</publisher>
<info name="alt_title" value="どきどきディスクCD版 Club D.O. vol.3" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doki doki disk cd-ban vol. 3 (japan)" sha1="b69090b18762165bc2f4a90623900a87abb3b35b" />
</diskarea>
@@ -6320,7 +6539,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="doki_doki_vacation_disk_a.hdm" size="1261568" crc="4ac3ba75" sha1="21996fd03ddf22159a7552f99fd622c251d2a935" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doki doki vacation - kirameku kisetsu no naka de (japan)" sha1="d6d454e713b10c3f8ab8076a4fde4ededfc2cdbf" />
</diskarea>
@@ -6349,12 +6568,12 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="DOR ~ ベストセレクション ~ 下巻" />
<info name="release" value="199305xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor - best selection - gekan (japan) (disc 1)" sha1="b5589543eb983def1db44c123f8c9b145adf527b" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor - best selection - gekan (japan) (disc 2)" sha1="dfc103e319c6cac2f4221eaff7d84db86801a25e" />
</diskarea>
@@ -6387,12 +6606,12 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="DOR ~ ベストセレクション ~ 上巻" />
<info name="release" value="199304xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor - best selection - joukan (japan) (disc 1)" sha1="770c26f4fe1782fcf18c4af4282466cbf04e2e73" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor - best selection - joukan (japan) (disc 2)" sha1="7a370502b8e6ffcb59af96c4131d98d614f9d8fc" />
</diskarea>
@@ -6413,7 +6632,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-255 / 2TD-3004"/>
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor se (special edition) '93 (japan)" sha1="effc100b0dc1850e840390a8ae52b7b5e80af821" />
</diskarea>
@@ -6434,7 +6653,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-255"/>
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor special edition '93 (alt)" sha1="7c8ed53fc332b99eebdeb81933184b85b424a1ac" />
</diskarea>
@@ -6463,7 +6682,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="DOR SPECIAL EDITION 魁" />
<info name="release" value="199306xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dor se (special edition) sakigake - battle hold in ashikaga kougyou koukou (japan)" sha1="4a18488a58238f7845be3be3261f50765d7ce2c2" />
</diskarea>
@@ -6482,7 +6701,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-229 / AOBA-22"/>
<info name="alt_title" value="同級生" />
<info name="release" value="199303xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doukyuusei (japan)" sha1="47796ab7a7790501f12064d1c73a9de0533cbe9d" />
</diskarea>
@@ -6502,7 +6721,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="同級生2" />
<info name="release" value="199502xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="doukyuusei 2 (japan)" sha1="174a434978ffdd635703cd11651c96bc827b2dcd" />
</diskarea>
@@ -6530,7 +6749,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-103"/>
<info name="release" value="199303xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dracula hakushaku - bishoujo-tachi no chi no shitatari (japan)" sha1="9287fda1d1148c86fe280b2f4ab012bb89a73976" />
</diskarea>
@@ -6554,7 +6773,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ドラゴンハーフ" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon half (japan)" sha1="d772fa9f6b648b71a7db0261b1b131c70bf5a954" />
</diskarea>
@@ -6574,7 +6793,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ドラゴンナイトIII" />
<info name="release" value="199202xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon knight iii (japan)" sha1="536e7ce3481098703e6544371f6bbaf060bd04b0" />
</diskarea>
@@ -6594,7 +6813,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ドラゴンナイト4" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon knight 4 (japan)" sha1="b430f8be0f739cb090a661f4663252e935bf63d1" />
</diskarea>
@@ -6620,14 +6839,14 @@ User/save disks that can be created from the game itself are not included.
<rom name="Dragons of Flame (Japan) (Track 15).bin" size="19702704" crc="3bc9f46b" sha1="0e5d2c7a9afbf03c211d014d8daa676ec8a06223"/>
<rom name="Dragons of Flame (Japan).cue" size="1767" crc="7e003f93" sha1="04286683d48e6634f819e3b050f56f30a9c0817d"/>
-->
- <description>Dragons of Flame</description>
+ <description>Advanced Dungeons &amp; Dragons - Dragons of Flame</description>
<year>1992</year>
<publisher>ポニーキャニオン (Pony Canyon)</publisher>
<info name="serial" value="HMC-195"/>
<info name="alt_title" value="ドラゴン・オブ・フレイム" />
<info name="release" value="199201xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragons of flame (japan)" sha1="503ff24e5edd5979e1e12eb402efa2c103d25e9a" />
</diskarea>
@@ -6653,7 +6872,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-232"/>
<info name="alt_title" value="ドラゴンショック" />
<info name="release" value="198911xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dragon shock (japan)" sha1="d47577ee4bf566ad6b2fc51fc59a53600152be24" />
</diskarea>
@@ -6709,7 +6928,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ドラッケン" />
<info name="release" value="199011xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="drakkhen (japan)" sha1="a109ee34ec4411e873cbcd6c1a3c3ba9bfec55b0" />
</diskarea>
@@ -6748,7 +6967,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ダンジョンマスター" />
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dungeon Master (japan) (en,ja) (rev 1)" sha1="cdf5928a77fc20122f5868bd4a5b02893b9383f3" />
</diskarea>
@@ -6787,7 +7006,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ダンジョンマスター" />
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dungeon master (japan) (en,ja)" sha1="439dad555cd68f7b416c9905947be53251fc7113" />
</diskarea>
@@ -6814,7 +7033,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ダンジョンマスターII スカルキープ" />
<info name="release" value="199401xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dungeon master ii - skullkeep (japan)" sha1="39c047d39140b49fab30c216c0edd2ec45e4041b" />
</diskarea>
@@ -6846,7 +7065,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="drive_simulator_program_disk.mfm" size="3402692" crc="1d154b3d" sha1="39c084fef13c31493a48ea553ad8284934cf07f0"/>
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<feature name="part_id" value="Navisoft Advanced Road Map" />
<diskarea name="cdrom">
<disk name="navisoft - advanced road map (japan) (bundled with fmt application)" sha1="13d78dfefba28ff76f6115caa4f94ff4e8b70686" />
@@ -6866,7 +7085,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ダインエドジャパン (DynEd Japan)</publisher>
<info name="serial" value="CDAC 060200"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dyned demo disc (japan)" sha1="f349658d3d0d67da21633adc5fa10c0e479680e3" />
</diskarea>
@@ -6888,7 +7107,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ダイナミック イングリッシュ 2 (基礎)" />
<info name="release" value="199107xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dynamic english 2 - basic (japan) (disc 1)" sha1="70306cc6c13c2100fcec2fda629e95073b738dff" />
</diskarea>
@@ -6915,7 +7134,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="dynamic_english_3_upper_basic.hdm" size="1261568" crc="e1a17802" sha1="e68855807a82dfa02c09aeed3fdc67f9096092ce" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dynamic english 3 - upper basic (japan) (disc 1) (version 1.0)" sha1="0c50213706c1508dbc7d6e63d8371faefc9fd80e" />
</diskarea>
@@ -6934,7 +7153,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="A276CF91·A276CF92·A276CF93 / FMB-3012"/>
<info name="alt_title" value="えほんらいたー SCHOOL" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ehon writer school v1.1 l21 (japan)" sha1="18c5b116e43a0188d800234ac67b9cb23b2072eb" />
</diskarea>
@@ -6952,7 +7171,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="えほんらいたー SCHOOL" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ehonwrit" sha1="093d955515b1f06cbb67ccc5aeccf45402ec0587" />
</diskarea>
@@ -6971,7 +7190,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="A276CF90 / FMB-3011"/>
<info name="alt_title" value="えほんらいたー" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ehon writer v1.1 l10 (japan)" sha1="7e50b2620a90528e3b9ccd24f79536ec11dcf4f7" />
</diskarea>
@@ -6990,7 +7209,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="A276CF90 / FMB-3011A"/>
<info name="alt_title" value="えほんらいたー" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ehon writer v1.1 l10 (japan) (rev a)" sha1="d7a60d5f4e8e61c532a81d08164131a0d759ebcd" />
</diskarea>
@@ -7093,7 +7312,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="栄冠は君に2 高校野球全国大会" />
<info name="release" value="199108xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="eikan wa kimi ni 2 - koukou yakyuu zenkoku taikai (japan) (rev a)" sha1="401f46c7f782b07f8668b64cb49a6e17340da534" />
</diskarea>
@@ -7196,7 +7415,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="栄冠は君に2 高校野球全国大会" />
<info name="release" value="199108xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="eikan wa kimi ni 2 - koukou yakyuu zenkoku taikai (japan)" sha1="f2d4f551a85a59dfb29855b4e9affd5ea90ac65c" />
</diskarea>
@@ -7220,7 +7439,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エイミーと呼ばないでっ" />
<info name="release" value="199508xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="eimmy to yobanaide - please don't call me eimmy (japan)" sha1="15ba4ebd4f932f9b3406e40b439172a7680222f7" />
</diskarea>
@@ -7240,7 +7459,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エル・フィッシュ" />
<info name="release" value="199407xx" />
<info name="usage" value="Requires HDD installation, 4 MB RAM and a 486 CPU"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="elfish (japan)" sha1="8711c6e0bbf4b38923ce9ae93c1bf842b0ee6be0" />
</diskarea>
@@ -7260,7 +7479,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エル・フィッシュ LITE" />
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="elfish lite (japan)" sha1="2c203a5dc86bfa2752e17bc89c7bfc1cb1f5b53d" />
</diskarea>
@@ -7296,7 +7515,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エルムナイト" />
<info name="release" value="199211xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="living body armor, a - elm knight (japan)" sha1="1de311fea7d4f173d5660c2530c585f05f83f6ef" />
</diskarea>
@@ -7333,7 +7552,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="emerald dragon (system disk).hdm" size="1261568" crc="35b0d7c1" sha1="55689ee69dc51816b2e2529c67ff9b14380571d5" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emerald dragon (japan)" sha1="c8c14a2ed288bbad50e35cbdac3bc82e78b71342" />
</diskarea>
@@ -7365,7 +7584,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="emit1_v1.30_r2.00_1995-01-20.hdm" size="1261568" crc="68c2fd3b" sha1="aa76ef1e43a943622abe942022b58a24fe64a6bb" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emit vol. 1 - toki no maigo (japan) (en,ja)" sha1="038ddc530689da76a82b225a8deefd713b0b059e" />
</diskarea>
@@ -7397,7 +7616,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="emit1_v1.30_r2.00_1994-04-26.hdm" size="1261568" crc="eca37c28" sha1="58d7f1add8ad84ce7200b0661f380608d8d0639a" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emit vol. 1 - toki no maigo (japan) (en,ja)" sha1="038ddc530689da76a82b225a8deefd713b0b059e" />
</diskarea>
@@ -7429,7 +7648,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="emit1_v1.20_r1.00.hdm" size="1261568" crc="49b1a035" sha1="1b0f1886a587e6b9e4bacdfd90145837a3eb6cc0" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emit vol. 1 - toki no maigo (japan) (en,ja)" sha1="038ddc530689da76a82b225a8deefd713b0b059e" />
</diskarea>
@@ -7454,7 +7673,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-904"/>
<info name="alt_title" value="エミット Vol. 1 時の迷子" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emit vol. 1 - toki no maigo (japan) (demo)" sha1="e7613bfaee8c5fb76427a89e1d21d243949d22ee" />
</diskarea>
@@ -7487,7 +7706,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="emit2.hdm" size="1261568" crc="b0e599e6" sha1="a7ba288dd17aa136e3fad5d5d070d5c87c61d5b6" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emit vol. 2 - inochigake no tabi (japan) (en,ja)" sha1="ae0de13b275b8f7ce5082008002aa4c275d011db" />
</diskarea>
@@ -7519,7 +7738,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="emit3.hdm" size="1261568" crc="4e00e431" sha1="8feb87e951bb4030c085a3a37add7091533c7272" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="emit vol. 3 - watashi ni sayonara o (japan) (en,ja)" sha1="b19d7321c656c3c8722ece8a17622e441422ec20" />
</diskarea>
@@ -7558,7 +7777,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="l_empereur.hdm" size="1261568" crc="0a253a52" sha1="736db4e33ff329f100e1b9607e8ac4c11f5232e5" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="l'empereur (japan)" sha1="6fd271652eae89b4879a468319cfee2f19ef5216" />
</diskarea>
@@ -7578,7 +7797,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-129"/>
<info name="alt_title" value="音と絵の出る英語辞書 No.2 「English in Dream」" />
<info name="release" value="199006xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="oto to e no deru eigo jisho no. 2 - english in dream (japan)" sha1="723b47c980e0025ee2837ecfc974d288cd9057e0" />
</diskarea>
@@ -7598,7 +7817,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エンゲージ・エランズ ~魅惑の使徒たち~" />
<info name="release" value="199504xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="engage errands - miwaku no shito-tachi (japan)" sha1="bb0414297d57a64167a398bbc22a3ad833a71d4d" />
</diskarea>
@@ -7624,7 +7843,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="engage_errands_2.hdm" size="1261568" crc="be2392d0" sha1="b78c26c423cf98bf35b84ba5a1c9b26228ab8306" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="engage errands ii - kouki o ninau mono (japan)" sha1="27e608f9663dd7afdf10cb7a35eb277d7c31b7a5" />
</diskarea>
@@ -7732,7 +7951,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-223"/>
<info name="alt_title" value="宴会王" />
<info name="release" value="198910xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="enkaiou (japan)" sha1="ffc1f51758abeffed4c5639002115fc3c6356ff8" />
</diskarea>
@@ -7843,7 +8062,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="宴会王の逆襲 Ver.2" />
<info name="release" value="199108xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="enkaiou no gyakushuu ver. 2 - return of enkaio (japan)" sha1="fdcf02ffa63078b7954475473587a2cb93069e67" />
</diskarea>
@@ -7914,7 +8133,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="宴会王 Ver.3 ~地球最大の決戦~" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM. Controller must be connected to port 2."/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="enkaiou ver. 3 - chikyuu saidai no kessen (japan)" sha1="88287d383e2f69f6fde07b042dcb44cb0c217f1f" />
</diskarea>
@@ -7944,7 +8163,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="悦楽の学園" />
<info name="release" value="199408xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="etsuraku no gakuen (japan)" sha1="2470af744ee14ad76a2a904d83ab4b8f51a6aa61" />
</diskarea>
@@ -7964,13 +8183,32 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="B276E020"/>
<info name="release" value="199211xx" />
<info name="usage" value="Requires a MIDI interface and 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="euphony ii &amp; mtr v1.1 l20 (japan)" sha1="0cf6324f3cbf7e1184bef891bff768d9279bb7a7" />
</diskarea>
</part>
</software>
+ <software name="eup2sc">
+ <!--
+ Origin: redump.org
+ <rom name="Euphony II &amp; Score V1.1 L10 (Japan).bin" size="8114400" crc="ca8c1521" sha1="1b1e116fc7d80c501cefde6d8cec5f24b3865705"/>
+ <rom name="Euphony II &amp; Score V1.1 L10 (Japan).cue" size="124" crc="14e70bd9" sha1="c488dc6a0cc18b7c9909b4793dfd8e3dc9cb366e"/>
+ -->
+ <description>Euphony II / Score V1.1 L10</description>
+ <year>1993</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="B276E030"/>
+ <info name="release" value="199304xx" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="euphony ii &amp; score v1.1 l10 (japan)" sha1="404c3310e6eddca03b476ca1badd8815855a473f" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="eurosens">
<!--
Origin: redump.org (CD) / wiggy2k (floppy)
@@ -8002,7 +8240,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="europa_sensen.hdm" size="1261568" crc="b6355674" sha1="28ed4ad10c4ba16567cbab278b51ca148587be15" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="europa sensen (japan)" sha1="80f373c8be4389d3b78dc6fbc55292388891fe13" />
</diskarea>
@@ -8030,7 +8268,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="DPS-70"/>
<info name="alt_title" value="エヴォリューション" />
<info name="release" value="198903xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="evolution (japan)" sha1="c518e330a3a9faccb4f1a7295d158361a5cf82f3" />
</diskarea>
@@ -8070,7 +8308,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="エクセレント10" />
<info name="release" value="199010xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="excellent 10 (japan)" sha1="9f8b604f5ae4f94eb4150bb1fe45cdd2b8bc9e9d" />
</diskarea>
@@ -8163,12 +8401,12 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMF-901-1 / HMF-901-2"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="exciting cd (japan) (disc 1)" sha1="8ca3755bfc2a1b62c6a3c48881bbe7a8eae57503" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="exciting cd (japan) (disc 2)" sha1="d7b3354fc2456bf442fa4b49e4593a991fa66cbd" />
</diskarea>
@@ -8261,12 +8499,12 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMF-911-1 / HMF-911-2"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="exciting cd (japan) (disc 1) (car marty)" sha1="32db51b25710c6fd5474f34eab054710be50e507" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="exciting cd (japan) (disc 2) (car marty)" sha1="cd94937e0280fd37b78476f3fc2a2eb100a607b2" />
</diskarea>
@@ -8358,12 +8596,12 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMF-913-1 / HMF-913-2"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="exciting cd '94 summer (japan) (disc 1)" sha1="029b2743d0b9abdb0c6657c1dfd817b00ed54f82" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="exciting cd '94 summer (japan) (disc 2)" sha1="88c91991075e6897102e80ea53186700a67c5959" />
</diskarea>
@@ -8422,14 +8660,14 @@ User/save disks that can be created from the game itself are not included.
<rom name="Eye of the Beholder II - The Legend of Darkmoon (Japan) (Track 47).bin" size="35209440" crc="72205ce3" sha1="b60f2096ca0e2278f8fcf1e3b2dc14a336b68d33"/>
<rom name="Eye of the Beholder II - The Legend of Darkmoon (Japan).cue" size="7055" crc="479038d3" sha1="995698629cd8c851aedb850b68f415c3fda0561a"/>
-->
- <description>Eye of the Beholder II - The Legend of Darkmoon</description>
+ <description>Advanced Dungeons &amp; Dragons - Eye of the Beholder II: The Legend of Darkmoon</description>
<year>1993</year>
<publisher>サイベル (Cybelle)</publisher>
<info name="serial" value="HME-201"/>
<info name="alt_title" value="アイ・オブ・ザ・ビホルダー2 ザ・レジェンド・オブ・ダークムーン" />
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="eye of the beholder ii - the legend of darkmoon (japan)" sha1="493b4851d5b58929dec179af9865f07e59ff4dee" />
</diskarea>
@@ -8462,7 +8700,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="f29-retaliator.hdm" size="1261568" crc="5556e184" sha1="12f5be30c8122e493f5fcd6f6b2679dfea62621f" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f29 retaliator (japan)" sha1="9f7bcea83a0e2aad66076fc921afb934169578ee" />
</diskarea>
@@ -8491,7 +8729,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-135"/>
<info name="alt_title" value="プロ野球ファミリー・スタジアム 90年度 ペナント・レース版" />
<info name="release" value="199009xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="pro yakyuu family stadium - 90-nendo pennant race-ban (japan)" sha1="da59ba87b6ebd5ded5dbad2576466ef2d377e370" />
</diskarea>
@@ -8518,7 +8756,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic386 v1.1l21 (japan)" sha1="e80c5fe46eecff9ae75f3334377b42fd44fd0ab2" />
</diskarea>
@@ -8545,7 +8783,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic 386 v1.1l20 (japan)" sha1="2c18dc8b8193ed5c5b41a6caba8103ea41da0bcc" />
</diskarea>
@@ -8562,7 +8800,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic386 v1.1 l10 (japan)" sha1="55d0c4fa89e9407a2d8a6a068ccbd6e459dc7b4a" />
</diskarea>
@@ -8579,7 +8817,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C010"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic386 v1.1 l10 (japan) (rev b)" sha1="4d0623451f45655131b88b02905cb7be0baa021e" />
</diskarea>
@@ -8609,7 +8847,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C011"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic386 v2.1 l10 (japan)" sha1="096c6a673b835b9d928500c1c28648404d27a256" />
</diskarea>
@@ -8645,7 +8883,7 @@ User/save disks that can be created from the game itself are not included.
<year>1991</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C020"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic386 compiler v1.1 l21 (japan) (rev d)" sha1="519ae9300f47300dd8cc90feed18e77c2790a2dd" />
</diskarea>
@@ -8675,13 +8913,43 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="B276C021"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="f-basic386 compiler v2.1l10 (japan)" sha1="176537f88c83b2182b6e5f016a5c4b871f0cf1eb" />
</diskarea>
</part>
</software>
+ <software name="fbc2120">
+ <!--
+ Origin: redump.org
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 01).bin" size="263894400" crc="ecc88cb8" sha1="8b7bca2b4244985069c405a6322f2c72581566a4"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 02).bin" size="41729184" crc="dfdf5c43" sha1="07c632f89506d3a543ea3fcbfa22a49bd43961ee"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 03).bin" size="15059856" crc="cb66c765" sha1="628f7b773a50a0b9b9011dc8602d8e12436da3fa"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 04).bin" size="24166800" crc="bd9213bc" sha1="006c5fcd90adff06b677b98017c4a69ef464b6de"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 05).bin" size="37330944" crc="5debd853" sha1="23d9e5395780a406cfe3e20210d553d1cf0f7064"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 06).bin" size="9085776" crc="5e39e97a" sha1="72c227ba97d353aefba2431ac8a93c3b4915bebd"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 07).bin" size="5491920" crc="5500d74a" sha1="7274dbf63d2db90579f79f1fadb8a6a7977ae76d"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 08).bin" size="5120304" crc="34a73d87" sha1="2a1cc41bf6b7f528efd77e38b539ea3f5e305780"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 09).bin" size="9478560" crc="547491a0" sha1="acaa5f1933d0cd48f9270520092110d13ae3a80b"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 10).bin" size="4793376" crc="e20371ea" sha1="55af96c06a9dad5c0d77caa8eb8705d3f90cb945"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 11).bin" size="16793280" crc="173b15bf" sha1="743c367f69136fb6e84c459dbce4d66cae7ca2ea"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 12).bin" size="34720224" crc="b51a094d" sha1="bd08476b38823cefc6aa5edcaa07c42ebc889fa5"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan) (Track 13).bin" size="20963376" crc="9e09fe32" sha1="2f63b84a1728104ebe2e2dae3b101c96b05a0279"/>
+ <rom name="F-BASIC386 Compiler V2.1 L20 (Japan).cue" size="1685" crc="6227b8b7" sha1="7c10d83df5af8a82533c2b4f4bc1d02786494749"/>
+ -->
+ <description>F-BASIC386 Compiler V2.1 L20</description>
+ <year>1992</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="B276C021"/>
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="f-basic386 compiler v2.1 l20 (japan)" sha1="75fc3656b6764d49ad00dd1f6a4fc356bf880136" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="finalb">
<!--
Origin: redump.org
@@ -8699,13 +8967,32 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ファイナル・ブロー" />
<info name="release" value="199003xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="final blow (japan)" sha1="8884cd2ba7b9d32bea083a15f222d79b06366874" />
</diskarea>
</part>
</software>
+ <!-- Windows / FM Towns hybrid -->
+ <software name="fjournal">
+ <!--
+ Origin: redump.org
+ <rom name="Fujitsu Journal Special Edition By CD-ROM (Japan).bin" size="232495200" crc="8e7edc8a" sha1="2fc9b16f7851220184aab0c035c3c15ed24ecdf7"/>
+ <rom name="Fujitsu Journal Special Edition By CD-ROM (Japan).cue" size="115" crc="189d47f0" sha1="a36cdc1510455650dadc20ef7932304753f9b00f"/>
+ -->
+ <description>Fujitsu Journal Special Edition by CD-ROM</description>
+ <year>1994</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="HMF-523"/>
+ <info name="usage" value="Requires 4 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="fujitsu journal special edition by cd-rom (japan)" sha1="5657ff2ef22daa497d3841a7c1fd00f6e1ff8d45" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="flashb">
<!--
Origin: redump.org
@@ -8745,7 +9032,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="フラッシュバック" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="flashback (japan)" sha1="d0bf9895ed82bc4ed0e7b7b9cb37ac155bd71efb" />
</diskarea>
@@ -8765,7 +9052,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="絵と音の365日" />
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns flexdata collection vol. 1 - e to oto no 365-nichi (japan)" sha1="898454b9ab54bdaa8fff9b3d93fa8e81a555c4b7" />
</diskarea>
@@ -8857,7 +9144,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMA-904"/>
<info name="alt_title" value="FM TOWNS アプリケーション・カタログCD‐ROM オリジナル・ソフト編" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns application catalog cd-rom - original soft-hen (japan)" sha1="071d7090c1295d610cd9518bd547ab07f6c73ff5" />
</diskarea>
@@ -8916,7 +9203,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-208"/>
<info name="alt_title" value="太っ腹 No.1" />
<info name="release" value="198907xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="futoppara no. 1 - fm towns hyper cd demo (japan)" sha1="f9391f09f7026540c31e7edeaedc3faf59c2328a" />
</diskarea>
@@ -8944,7 +9231,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-219A / A2760530 / TSC410"/>
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns super technology demo 1993 (japan) (rev a)" sha1="9cb4e58f89bc5f65ff27790a71dc197454bfccb0" />
</diskarea>
@@ -8972,7 +9259,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-219 / A2760530 / TSC410"/>
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns super technology demo 1993 (japan)" sha1="c38c4b0011a144ed7edcad08a67aac699e9ae496" />
</diskarea>
@@ -9000,7 +9287,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-919"/>
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns super technology demo 1993 (japan) (hibaihin)" sha1="97be055f8df22d433faf088a3ae27d465097057c" />
</diskarea>
@@ -9056,7 +9343,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="release" value="198905xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns world (japan)" sha1="2cc956195a87e787fa6142ab5e1bbb2beb66f867" />
</diskarea>
@@ -9076,7 +9363,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-198 / A2760210 / TSC200"/>
<info name="release" value="199202xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fractal engine demo (japan)" sha1="73aa255b22250fc736da51104fcb81236041ffd5" />
</diskarea>
@@ -9096,7 +9383,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-185"/>
<info name="release" value="199211xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free will - knight of argent (japan)" sha1="b9244d898c5898c843b7a990e60b7e118939bc1b" />
</diskarea>
@@ -9112,7 +9399,7 @@ User/save disks that can be created from the game itself are not included.
<description>Frog Feast Demo</description>
<year>2005</year>
<publisher>Rastersoft</publisher>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="frog feast demo" sha1="901e479de1eec91b97675a36acc752f0fd97e1a2" />
</diskarea>
@@ -9142,13 +9429,13 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-175-1 / HMC-175-2 / A2760132"/>
<info name="release" value="199111xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Program Disk"/>
<diskarea name="cdrom">
<disk name="free software collection 4 (japan) (disc 1) (program disk)" sha1="c287c77ee6065a55f9394d1b9c6c8318f1905597" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Library Disk"/>
<diskarea name="cdrom">
<disk name="free software collection 4 (japan) (disc 2) (library disk)" sha1="0256e333138094bb431e97ee34e161040168184b" />
@@ -9175,7 +9462,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-117 / A2760240"/>
<info name="release" value="199205xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 5 (japan) (rev b)" sha1="34365b8601ac67eba566d015c297d6c2e324347b" />
</diskarea>
@@ -9201,7 +9488,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-117 / A2760240"/>
<info name="release" value="199205xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 5 (japan) (rev a)" sha1="636624c0365eea619a49bdf5abcb0601c9cc066e" />
</diskarea>
@@ -9227,7 +9514,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-117 / A2760240"/>
<info name="release" value="199205xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 5 (japan)" sha1="b429e65d9aaba3a54ea281c7fd70bee8eb0ddeea" />
</diskarea>
@@ -9246,7 +9533,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-141A / A2760241"/>
<info name="release" value="199306xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 6 (japan) (rev a)" sha1="345ab517fbceeaa095b439262312361bf42388c6" />
</diskarea>
@@ -9265,7 +9552,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-141 / A2760241"/>
<info name="release" value="199306xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 6 (japan)" sha1="bfe19885bb2adff9ec90c8d8e3dee6c347cfc36b" />
</diskarea>
@@ -9284,7 +9571,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-225A / A2760242"/>
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 7 (japan) (rev a)" sha1="acd3dfc82325f7cf86ea6b72acc583ec906afc6f" />
</diskarea>
@@ -9303,7 +9590,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-225 / A2760242"/>
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 7 (japan)" sha1="563e5d8ecb60322f2aca13f36c206e7ce790df24" />
</diskarea>
@@ -9322,7 +9609,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-141 / A2760243"/>
<info name="release" value="199406xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 8 (japan)" sha1="999bab354bfd8d0a686591f5ba1a37e2e25f51bf" />
</diskarea>
@@ -9341,7 +9628,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-185 / A2760244"/>
<info name="release" value="199412xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 9 (japan)" sha1="c6d7e1284bda809a485dfc3862b581a105edbc8d" />
</diskarea>
@@ -9360,7 +9647,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMG-119 / A2760245"/>
<info name="release" value="199506xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 10 (japan)" sha1="9b9cd6454e4720fe6a8c75ae4a0cbad627e137e4" />
</diskarea>
@@ -9379,7 +9666,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMG-140 / A2760246"/>
<info name="release" value="199506xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection 11 (japan)" sha1="671cc15698e4f4f86533feb2bf927c46211a2111" />
</diskarea>
@@ -9398,7 +9685,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-224 / A2760490"/>
<info name="release" value="199211xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free software collection marty.1 (japan)" sha1="25b54e516972dcd33eba8bb21c3d3f9f8c50d576" />
</diskarea>
@@ -9419,7 +9706,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="FM TOWNS フリー・ソフト入門キット" />
<info name="release" value="19950801" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fm towns free soft nyuumon kit (japan)" sha1="8a54de6339bd7098a3f32461c59092b76752b060" />
</diskarea>
@@ -9428,11 +9715,18 @@ User/save disks that can be created from the game itself are not included.
<software name="fshark">
<!--
- Origin: Neo Kobe Collection
- <rom name="Hishouzame.ccd" size="2540" crc="d022c37d" sha1="0a685e7969c98abd27f05d6028a62ff45a5f90ce"/>
- <rom name="Hishouzame.cue" size="466" crc="2978eaa2" sha1="d2d182a4560a6372c3b4ff16d07de6fa57b4b423"/>
- <rom name="Hishouzame.img" size="315948864" crc="604f9205" sha1="b5a88d02c35cf660a2cc0d99d3ff918a1582d213"/>
- <rom name="Hishouzame.sub" size="12895872" crc="b246ed6d" sha1="7b8ef1c9515fb0ba1282da6dba17eeade2cb9b1c"/>
+ Origin: redump.org
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 01).bin" size="10231200" crc="b4815477" sha1="c439a005d9d4e97402eb063dfcd7e5a6c48ae8e6"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 02).bin" size="4885104" crc="f180754f" sha1="f871d783bfb75a5f9a98e2da9983a8e180829994"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 03).bin" size="53802000" crc="b39e8551" sha1="d1505743334744c4ae91f8a4510f07a97ac28616"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 04).bin" size="52049760" crc="1691df08" sha1="6e44e6826b365c65bbc220130ff81faa72bbddab"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 05).bin" size="52825920" crc="2d154240" sha1="9a553f00323e0666963c50795e094c5f7e178355"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 06).bin" size="56412720" crc="079283b0" sha1="e4523d5d230c3419d1e8bb6064101bf71c43dee2"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 07).bin" size="64879920" crc="9c49fd97" sha1="127736953c1751a83629fe646800e9338fb38a4b"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 08).bin" size="6844320" crc="08c2fdb8" sha1="b441224496125affca217c610d61d554b0d4e93d"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 09).bin" size="3363360" crc="df844bd8" sha1="e4f9b11ff457b55f194dfc540303607efb0a8a8c"/>
+ <rom name="Hishouzame - Flying Shark (Japan) (Track 10).bin" size="10654560" crc="64ccacb2" sha1="04cdbf1224095d32b1ffa09c9199da835fd2c51b"/>
+ <rom name="Hishouzame - Flying Shark (Japan).cue" size="1262" crc="ba89752b" sha1="12aad3947623e518090cca4fb635ed1077219552"/>
-->
<description>Hishouzame / Flying Shark</description>
<year>1993</year>
@@ -9441,9 +9735,9 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="飛翔鮫" />
<info name="release" value="199309xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
- <disk name="hishouzame" sha1="4704726801f67e1cd09ba1f7475985036edff19c" />
+ <disk name="hishouzame - flying shark (japan)" sha1="c56c61dfe9e0a3fff58b54aa2158363950235d31" />
</diskarea>
</part>
</software>
@@ -9477,7 +9771,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="uchuu kaitou funny bee (boot disk).hdm" size="1261568" crc="4bcc3120" sha1="f721efe9534554a1a9e4e2201b8f7c4102987b29" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="uchuu kaitou funny bee (japan)" sha1="6ea67120a66e1153f648fab8008d3a14fe7de5a0" />
</diskarea>
@@ -9510,7 +9804,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMA-233"/>
<info name="release" value="198911xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free ware collection 1 (japan)" sha1="b451dbadf11c32c32c2b052ecb63f58e76e9237a" />
</diskarea>
@@ -9532,7 +9826,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMB-165"/>
<info name="release" value="199006xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free ware collection 2 (japan)" sha1="3196596ca7b815a0834187957694b5e2cf67f423" />
</diskarea>
@@ -9561,7 +9855,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-105 / A2760131"/>
<info name="release" value="199103xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="free ware collection 3 (japan)" sha1="6296769f045442298187631abb5238b8b65a46c9" />
</diskarea>
@@ -9595,7 +9889,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="habitatv2.1l10.hdm" size="1261568" crc="4dc2691b" sha1="a99ada487e1970240a284eb67f7420b13c45f265" status="baddump" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu habitat v2.1 l13a (japan)" sha1="cdca631e389c9d67f86fc2f389d389ba94b9b7d8" />
</diskarea>
@@ -9624,7 +9918,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="habitatv2.1l10.hdm" size="1261568" crc="4dc2691b" sha1="a99ada487e1970240a284eb67f7420b13c45f265" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu habitat v2.1l10 (japan)" sha1="5704f482ca0bb17e0a01f82bfc4ea272a7534bda" />
</diskarea>
@@ -9649,7 +9943,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="habitatv1.1l10.hdm" size="1261568" crc="50c7b10b" sha1="914e848878470fa6c8e4adcebbb7af79a5ff6bb1" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="fujitsu habitat v1.1 l10 (japan)" sha1="062246ef4ead6738ec830b7f9b04e35af67b9723" />
</diskarea>
@@ -9669,7 +9963,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="FMB-3018 / B276D061"/>
<info name="release" value="199402xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="homestudio v1.2l10 (japan)" sha1="2248f1e971cd4f96f40b57cd6659af2fe64d531d" />
</diskarea>
@@ -9688,7 +9982,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="BD276D060"/>
<info name="release" value="199212xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="homestudio v1.1 l10 (japan)" sha1="338e4a26aaae5fc330a2e90efda23cfe1fd0ab53" />
</diskarea>
@@ -9715,7 +10009,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ジーファイヴ" />
<info name="release" value="198907xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="g5 (japan) (rev a)" sha1="3038fd11e7c7f58b17ef96fb9c872f4c7924915a" />
</diskarea>
@@ -9747,7 +10041,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="g5.hdm" size="1261568" crc="be71541a" sha1="b6686763b1d4774a623c88bf86eee029224657c7" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="g5 (japan)" sha1="022cce796bb7879860ac6e7955a7de2763910bd2" />
</diskarea>
@@ -9768,7 +10062,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ガジェット" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires HDD installation, Windows 3.1 and 8 MB RAM. According to the packaging, the FM Towns II MA is the recommended model."/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gadget - invention, travel, &amp; adventure (japan)" sha1="17fd106223035a825406a673027eae0ad92e219d" />
</diskarea>
@@ -9804,7 +10098,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="学園爆裂転校生!" />
<info name="release" value="199603xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gakuen bakuretsu tenkousei (japan)" sha1="1ad336ca6f7d057d662a0c8864094cb4e37f2d2b" />
</diskarea>
@@ -9853,7 +10147,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="学園KING -日出彦学校をつくる-" />
<info name="release" value="199606xx" />
<info name="usage" value="Requires HDD installation and 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gakuen king - hidehiko gakkou o tsukuru (japan)" sha1="7c1ee85c04009071bf457498e36392c42f11403d" />
</diskarea>
@@ -9882,7 +10176,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ギャラクシーフォースII" />
<info name="release" value="199103xx" />
<info name="usage" value="Requires 2 MB RAM. Supports XE-1AP analog pad in analog MD mode on second controller port. Use a Towns Pad on first port to navigate menus." />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="galaxy force ii (japan)" sha1="90c869b43bc7f846251f35ef5e5b741f641c6184" />
</diskarea>
@@ -9922,7 +10216,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-134 / FMSC0010"/>
<info name="alt_title" value="GAMEテクノポリス スーパーコレクション1" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="super collection 1 - game technopolis (himitsu no hanazono &amp; kimi dake ni ai o... +) (japan)" sha1="e2021a46714e9c69a53bdaf73f37b382fb32269a" />
</diskarea>
@@ -9965,7 +10259,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-184 / FMSC0020"/>
<info name="alt_title" value="GAMEテクノポリス スーパーコレクション2" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="super collection 2 - game technopolis (iv - tesera &amp; hatsukoi monogatari +) (japan)" sha1="67df75ed63d50d428ea0ca844ac68c9ee98a06b2" />
</diskarea>
@@ -10000,7 +10294,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="学園ボンバー" />
<info name="release" value="199406xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gakuen bomber (japan)" sha1="674c244901c8eba6efa29c17c61eac1236897c44" />
</diskarea>
@@ -10020,7 +10314,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>データウエスト (Data West)</publisher>
<info name="release" value="198903xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gedit towns (japan)" sha1="90051dc5334e32ae1ef19842b7c12bac3acca804" />
</diskarea>
@@ -10047,7 +10341,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="GEKIRIN 失なわれし宝剣" />
<info name="release" value="199412xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gekirin - ushinawareshi houken (japan)" sha1="272ad06089fd6b3d807032989655b7ef4c7f5257" />
</diskarea>
@@ -10086,7 +10380,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="現代大戦略EXスペシャル" />
<info name="release" value="199409xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gendai daisenryaku ex special (japan)" sha1="4bec5d1e7a74bcb5178f5ee39912e5a47ae25556" />
</diskarea>
@@ -10106,7 +10400,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ジェノサイド・スクウエア" />
<info name="release" value="199304xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="genocide^2 - genocide square (japan)" sha1="0bb72510a65ed2110efdd913889506776120b7ef" />
</diskarea>
@@ -10151,7 +10445,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="戯画もーしょん" />
<info name="release" value="199503xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="giga mortion (japan)" sha1="12d511ae7e8cda2f385f89e5d4abf1f0b2fbfab5" />
</diskarea>
@@ -10185,7 +10479,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="銀河英雄伝説ⅡDX+ TOWNSスペシャル" />
<info name="release" value="199205xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ginga eiyuu densetsu ii dx+ towns special (japan)" sha1="873fddaf81e034d22b502811d9b3c181fd436950" />
</diskarea>
@@ -10211,7 +10505,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="gingaed3sp_gamedisk.hdm" size="1261568" crc="44a6fe22" sha1="f85fe21a0ffb344f8cb24abb87ab6bd853267aca" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ginga eiyuu densetsu iii sp (japan)" sha1="a490e0279fbb11f6e0b3d97e1cceb74c0cc09c09" />
</diskarea>
@@ -10232,7 +10526,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="NHKスペシャル 銀河宇宙オデッセイ① 「旅立ち わが太陽系」" />
<info name="release" value="199103xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nhk special - ginga uchuu odyssey vol. 1 - tabidachi waga taiyoukei (japan)" sha1="93f1ba6fe8419f7d7a45fe94776c39def396dfd9" />
</diskarea>
@@ -10253,7 +10547,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="NHKスペシャル 銀河宇宙オデッセイ② 「超新星爆発」" />
<info name="release" value="199204xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nhk special - ginga uchuu odyssey vol. 2 - choushinsei bakuhatsu (japan)" sha1="d59248d8aea3611c11bf1be77ecb445f96425617" />
</diskarea>
@@ -10274,7 +10568,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="NHKスペシャル 銀河宇宙オデッセイ② 「超新星爆発」" />
<info name="release" value="199204xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nhk special - ginga uchuu odyssey vol. 2 - choushinsei bakuhatsu (japan) (fm towns marty rerelease)" sha1="d2cb3bda0b569addb6e8b1a8a8018fadb027f232" />
</diskarea>
@@ -10292,7 +10586,7 @@ User/save disks that can be created from the game itself are not included.
<year>1989</year>
<publisher>FM Users Group</publisher>
<info name="serial" value="HMA-234"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gnu for towns (japan)" sha1="f193f55170db6dbd4e4c11f20d6d5ea6e88147d4" />
</diskarea>
@@ -10311,7 +10605,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>FM Users Group</publisher>
<info name="serial" value="HMC-117"/>
<info name="release" value="199104xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gnu for towns rel. 2 (japan)" sha1="cd22ccaa7d4b6da00c2289f7bb70fbcd78aa5f3c" />
</diskarea>
@@ -10404,7 +10698,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="碁キチくんシリーズ 囲碁入門道場" />
<info name="release" value="199106xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gokichi-kun series - igo nyuumon doujou (japan)" sha1="04cf41bc82ff779126578696ada6796acdd11a04" />
</diskarea>
@@ -10430,7 +10724,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="goh ii towns special (system disk).hdm" size="1261568" crc="b694cf42" sha1="a9084609cd53c81263c05f1310946cbd5a561059" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gou ii - towns special (japan)" sha1="689262728feac068819447909c4f88eae6ee1145" />
</diskarea>
@@ -10449,7 +10743,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-191"/>
<info name="release" value="199411xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gokko vol. 01 - doctor (japan)" sha1="aef878a0937ec2e9350467de8f94cc3118cd7420" />
</diskarea>
@@ -10468,7 +10762,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-196"/>
<info name="release" value="199412xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gokko vol. 02 - school gal's (japan)" sha1="88ff6c151f5cfa8efb54b90ba641e58d359aba42" />
</diskarea>
@@ -10487,7 +10781,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMF-198"/>
<info name="release" value="199412xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gokko vol. 03 - etcetera (japan)" sha1="52dfd5efdfb673a4bb882f13e7394844b0ecd4bb" />
</diskarea>
@@ -10519,7 +10813,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="極楽まんだら" />
<info name="release" value="199402xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gokuraku mandala (japan)" sha1="911f06db513d74c86c4e8b2baa10a9ac21663d56" />
</diskarea>
@@ -10564,7 +10858,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="メルヘン図書館 グリム童話 赤ずきん" />
<info name="release" value="198912xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns hyper ehon - maerchen toshokan grimm douwa - grimm maerchen - akazukin (japan)" sha1="8d1663e914866178550bc21aad8655db1d490ee8" />
</diskarea>
@@ -10615,7 +10909,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-270"/>
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="maerchen toshokan grimm douwa - grimm maerchen - bremen no ongakutai (japan)" sha1="083ccc5752f6c472df658ee3cd524013e136649a" />
</diskarea>
@@ -10672,7 +10966,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-194"/>
<info name="release" value="199011xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns hyper ehon - maerchen toshokan grimm douwa vol. 4 - grimm maerchen - ibara-hime (nemuri-hime) (japan)" sha1="9cc622ca53925d76762324181af2faa5ab3653ed" />
</diskarea>
@@ -10716,7 +11010,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-193"/>
<info name="release" value="199011xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns hyper ehon - maerchen toshokan grimm douwa vol. 3 - grimm maerchen - ookami to nana-hiki koyagi (japan)" sha1="2e7b77ba31f32390cd8d123f4e6bace64ce70078" />
</diskarea>
@@ -10742,7 +11036,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="gulfwar_systemdisk.hdm" size="1261568" crc="00f642ac" sha1="27f9c0e58446d1f026f8e2eba514d8f871aa37e2" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gulfwar" sha1="cddf2d940887c637abc2990616eaaf39926b74f8" />
</diskarea>
@@ -10774,7 +11068,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ガンブレイズ" />
<info name="release" value="199412xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gunblaze (japan)" sha1="9f4631523057e4946484d23b3d5f28d1d65d16e6" />
</diskarea>
@@ -10813,7 +11107,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="機動戦士ガンダム ハイパー クラシック オペレーション" />
<info name="release" value="199208xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mobile suit gundam - hyper classic operation (japan)" sha1="b2880252a789e03118cce630d3a3ed410f22cc60" />
</diskarea>
@@ -10852,7 +11146,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="機動戦士ガンダム ハイパー デザート オペレーション" />
<info name="release" value="199209xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="mobile suit gundam - hyper desert operation (japan)" sha1="11b91659de9bdb5678ee9eb776bedd0ace620923" />
</diskarea>
@@ -10877,7 +11171,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-132 / FWFJ 34109"/>
<info name="release" value="199010xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="gunship - the helicopter simulation (japan)" sha1="d60b20686c1e4ed6f791d890f397fabcc3950e32" />
</diskarea>
@@ -10972,7 +11266,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="はじめての旅行英会話" />
<info name="release" value="199011xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hajimete no ryokou eikaiwa (japan)" sha1="22fb8ccedb18ce0346ec4c49a412b185122f52ef" />
</diskarea>
@@ -11067,7 +11361,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="はじめての旅行英会話" />
<info name="release" value="199303xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hajimete no ryokou eikaiwa (japan) (fm towns marty rerelease)" sha1="42fd840f281773e3348c58317c4f9624ff66a696" />
</diskarea>
@@ -11109,7 +11403,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="half_moon_ni_kawaru_made.hdm" size="1261568" crc="664957f7" sha1="24dc3bf141e174e52869f29309a0aee1db08ade8" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="half moon ni kawaru made - ramiyaryou no nijiiro tamatebako (japan)" sha1="7d53089f5f8c7d54ae832813280f9953c6759004" />
</diskarea>
@@ -11134,7 +11428,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="花の記憶" />
<info name="release" value="199512xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hana no kioku (japan)" sha1="2731913e69aca9b1d9c39612e08143a131882291" />
</diskarea>
@@ -11155,7 +11449,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="花の記憶 ~第ニ章~" />
<info name="release" value="199702xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hana no kioku - dainishou (japan)" sha1="1a26c741efb00389dae5935792ef78d0a199752e" />
</diskarea>
@@ -11182,7 +11476,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hanafuda de pon (boot disk).hdm" size="1261568" crc="cad3cfe6" sha1="3d4eb251057b7a82cabb683114731013ced571ad" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hanafuda de pon (japan)" sha1="16fd12112f988ab839b6391872779c97ac7f2053" />
</diskarea>
@@ -11202,7 +11496,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="花よりダンゴ2" />
<info name="release" value="19930417" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hana yori dango 2 (japan)" sha1="15129ffdf02c307db6a8174b6c953a820497cb2f" />
</diskarea>
@@ -11236,7 +11530,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="全日本美少女麻雀選手権大会 ハートでロン!!" />
<info name="release" value="199503xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="zen nihon bishoujo mahjong senshuken taikai - heart de ron (japan)" sha1="44ab329b41b6fe0051aa31c20ebe492bca7f0de2" />
</diskarea>
@@ -11255,7 +11549,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-158"/>
<info name="release" value="199306xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="healthy life ii (japan)" sha1="2531e85ed24612e89f8ed30232de9853cae4cc72" />
</diskarea>
@@ -11275,7 +11569,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="B276D231"/>
<info name="release" value="199503xx" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="high c compiler multimedia kaihatsu kit v1.7 l13 (japan)" sha1="20462e195d35084e11b5282ad63d88f3da3e3629" />
</diskarea>
@@ -11294,7 +11588,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="High C Compiler マルチメディア・キット V1.7L12" />
<info name="serial" value="B276D220"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="high c compiler multimedia kit v1.7l12 (japan)" sha1="e2a0029805fe11e0b3d312861de1d7f51950d93a" />
</diskarea>
@@ -11347,13 +11641,66 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-148"/>
<info name="alt_title" value="平家物語(上巻)" />
<info name="release" value="199202xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="heike monogatari (joukan) (japan)" sha1="a85967c9e8338ecccc4bb23aa1eb84bf4af7b8b3" />
</diskarea>
</part>
</software>
+ <software name="heike1r">
+ <!--
+ Origin: redump.org
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 01).bin" size="31399200" crc="d62218aa" sha1="44bdc084f430eeb1cf741b837fe6376a2bac9d3e"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 02).bin" size="12731376" crc="fb93789e" sha1="185c47423ebc06d92d68b9fc6c40ed7bfb231406"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 03).bin" size="23261280" crc="dae50a17" sha1="307facf273b3f41143992cd57da3792721e74520"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 04).bin" size="24218544" crc="1a500ddb" sha1="f94d597934ec821a470954034f80fd83bfdc52b9"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 05).bin" size="31053456" crc="00877cef" sha1="0f12b45ca5fd8d1fdfbf0c63b5165e9cdba817c2"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 06).bin" size="15318576" crc="e4deb330" sha1="956398afeb622fb426f7c55e57eb80b4610f7b3d"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 07).bin" size="31055808" crc="774ace82" sha1="b467e6244b9156d649ce5317611238b226a06541"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 08).bin" size="15163344" crc="ab156078" sha1="a36acc0f3fad761ae72421dfe0744123dcc2066a"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 09).bin" size="32982096" crc="3bfa3913" sha1="80d84db44dd2ab400e9e646b3d1bab745fae648e"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 10).bin" size="24185616" crc="1c69d316" sha1="89c2038e2d52d51e7dcaef158c20a448906f3172"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 11).bin" size="22054704" crc="486b1040" sha1="4c8356f708ebdffa210b4cbc9234a2dc8f100717"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 12).bin" size="22021776" crc="81ac17e1" sha1="97f77001baab1b941e1462fdb31caa3e99c02423"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 13).bin" size="31062864" crc="8516386a" sha1="86a70d21ea2d35fe5b95e8db1c52c4614c5f21dc"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 14).bin" size="26285952" crc="caec09ad" sha1="27066cee699c7839cf4e095b8cfc248d69061975"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 15).bin" size="8076768" crc="94dc1eff" sha1="aa734225df1aba1656b5c0475e584422ccb7beef"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 16).bin" size="22804992" crc="313d060e" sha1="d45d89915e0d5894d0795f128d1d4817b2f2db64"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 17).bin" size="16346400" crc="6cc8b731" sha1="e5296b929ec277fd570f366daebffd0b5113efac"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 18).bin" size="14998704" crc="461bb9dc" sha1="f1d44fa995fc302d762640c8035d255036faa141"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 19).bin" size="28623840" crc="2c09d61f" sha1="dc352caafe3714191bfb752a7d4cb98addae8984"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 20).bin" size="20768160" crc="f66780d3" sha1="0980d37ecc7d9a83566d3afcd1ffe92abe5862d1"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 21).bin" size="31406256" crc="0dee5725" sha1="c822cdac3b3cb5e8cf2dc1d714645f91d17dc164"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 22).bin" size="17484768" crc="89fe8942" sha1="c265ab76897b7e5a1f8eebb25ad2849b6b14f9e0"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 23).bin" size="29461152" crc="774cd696" sha1="024b90ae2d3d7e76e75ec997f4a54db73010d4c6"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 24).bin" size="28906080" crc="e3f50c2e" sha1="151e6bea815f0c8de238f4697b9915c0bbc23b80"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 25).bin" size="25272240" crc="efa97112" sha1="f8b5081cde87b31f921bd552872ae300daa1f0e2"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 26).bin" size="16593360" crc="231f8708" sha1="175bc34f7aa9f5d3ee1febb3f34f074f4756a866"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 27).bin" size="16332288" crc="35c5e0e1" sha1="78a70b07ad5428bcbb42ae1fc1b404acbcba8bab"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 28).bin" size="30183216" crc="ced9f03b" sha1="a8cedd14532afd9891b1ea2ab156ac99fa57adf2"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 29).bin" size="9377424" crc="87bb0247" sha1="8de25d3874e73acfea4d939ef3b93975a5019288"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 30).bin" size="14770560" crc="1d33b144" sha1="3f3881d6710d87d7385212f47abf01ccefb3fa4c"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 31).bin" size="4123056" crc="12edc8b4" sha1="ace2c3eb9822ccd2752c143f4039e4c7b56c8a14"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 32).bin" size="4186560" crc="4cb36324" sha1="859373d49c4960906fdae02d6f77824993012c79"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 33).bin" size="4602864" crc="17183c7e" sha1="7f92986af50c3256e83438e1e6b62274ced786d3"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 34).bin" size="4217136" crc="6c7f299e" sha1="132111f3ab4dd30d7db9629afde2e3d94ad137f9"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease) (Track 35).bin" size="4391184" crc="5cbdd965" sha1="2fcc743d6a75a9ce9a062cdd9a86057af7f29f40"/>
+ <rom name="Heike Monogatari (Joukan) (Japan) (Rerelease).cue" size="4905" crc="daf1b18c" sha1="5bc8bcf940367767822dd956e503691cc0e10768"/>
+ -->
+ <description>Heike Monogatari (Joukan) (rerelease)</description>
+ <year>1992</year>
+ <publisher>CRI</publisher>
+ <info name="serial" value="HMC-148"/>
+ <info name="alt_title" value="平家物語(上巻)" />
+ <info name="release" value="199202xx" />
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="heike monogatari (joukan) (japan) (rerelease)" sha1="a31831bcd17f24b70fd0d2c11502c425d8b88ee0" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="heike2">
<!--
Origin: redump.org
@@ -11406,13 +11753,33 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-149"/>
<info name="alt_title" value="平家物語(下巻)" />
<info name="release" value="199204xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="heike monogatari (gekan) (japan)" sha1="82b3abf196dc5fc9948d40a3c2807bf64d0aea4f" />
</diskarea>
</part>
</software>
+ <software name="herolanc">
+ <!--
+ Origin: redump.org
+ <rom name="Heroes of the Lance (Japan) (En,Ja).bin" size="6698496" crc="b4fb7f62" sha1="ed9ed92f74bc78fc01aca78381027e5424f72e39"/>
+ <rom name="Heroes of the Lance (Japan) (En,Ja).cue" size="101" crc="927dee57" sha1="3f242e6c26f912029870c8e503994f41718dcff8"/>
+ -->
+ <description>Advanced Dungeons &amp; Dragons - Heroes of the Lance</description>
+ <year>1990</year>
+ <publisher>ポニーキャニオン (Pony Canyon)</publisher>
+ <info name="serial" value="HMB-158 / K98B5127"/>
+ <info name="alt_title" value="ヒーロー・オブ・ランス" />
+ <info name="release" value="199006xx" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="heroes of the lance (japan) (en,ja)" sha1="50bb7035f4c8e6160ba3338e1020a80ca7e2ab52" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="hfetish">
<!--
Origin: redump.org
@@ -11426,7 +11793,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ハイパー・フェティシズム" />
<info name="release" value="199503xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper fetishism (japan)" sha1="40052a58a056709334273f5199dfae2bb11db116" />
</diskarea>
@@ -11518,12 +11885,12 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-924-1 / HME-924-2"/>
<info name="alt_title" value="ハイライトCD20" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<diskarea name="cdrom">
<disk name="highlight cd 20 (disc 1)" sha1="a0ef91dca608cbc40207b2e84ccdec862de949eb" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<diskarea name="cdrom">
<disk name="highlight cd 20 (disc 2)" sha1="955cf09e0e6789cc24eb804622513313ff92a310" />
</diskarea>
@@ -11543,7 +11910,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ことばあそび CDVIEW HiP CATCH" />
<info name="release" value="199203xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kotoba asobi - cdview hip catch (japan)" sha1="1e0e0b7b053614d9c2a61e4fb35865fe2dd797e6" />
</diskarea>
@@ -11569,7 +11936,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hiouden ii (japan) (system disk).hdm" size="1261568" crc="0e78d3a2" sha1="b610c81e548fe3ed78ba8b79e7766ec7b50f2bd3" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hiouden ii (japan)" sha1="559dc86590f0a486293e2e695875eff12e13d31f" />
</diskarea>
@@ -11590,7 +11957,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ひらがなのえほん" />
<info name="release" value="199308xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hiragana no ehon (japan)" sha1="7c533b22746d1808d967704594e5d47c17e9121c" />
</diskarea>
@@ -11617,7 +11984,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="【テクノストレス予防法シリーズ】 疲労" />
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="technostress yobou-hou series - hirou (japan)" sha1="22be39e55d6c3ed0c7a836be7bb151425c2e8954" />
</diskarea>
@@ -11649,7 +12016,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="走り女Ⅱ" />
<info name="release" value="199512xx" />
<info name="usage" value="Requires 2 MB RAM and HDD installation"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="running girls - hashiri onna ii (japan)" sha1="9dc4f42919ff2e0f63c3d70064f87d98c0ea1b9f" />
</diskarea>
@@ -11669,7 +12036,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="星の砂物語" />
<info name="release" value="199209xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hoshi no suna monogatari (japan)" sha1="ad83d392cbee7606a0b7d00e6a461f30d3233bdb" />
</diskarea>
@@ -11689,7 +12056,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="星の砂物語2" />
<info name="release" value="199210xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hoshi no suna monogatari 2 (japan)" sha1="1318d282ee9ad2f102ad8eaed1a02fbe66450066" />
</diskarea>
@@ -11724,7 +12091,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="星の砂物語3" />
<info name="release" value="199508xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hoshi no suna monogatari 3 (japan)" sha1="f1e43060237558610d7f924e6c0d8fc4ff5ed39f" />
</diskarea>
@@ -11772,7 +12139,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-127"/>
<info name="alt_title" value="ハイパー・アクアリウム 【海水編】" />
<info name="release" value="199204xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper aquarium - kaisui-hen (japan)" sha1="c6b705c9f8e81aaea49e8eb4c3060cd2b388b62a" />
</diskarea>
@@ -11830,7 +12197,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-184"/>
<info name="alt_title" value="ハイパー・アクアリウム 【淡水編】" />
<info name="release" value="199201xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper aquarium - tansui-hen (japan)" sha1="fa5df399ef25bb0dbfe304e915160f2a1a88d918" />
</diskarea>
@@ -11854,7 +12221,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper address (japan) (rev a) (system disk).hdm" size="1261568" crc="78e49f11" sha1="4f628a06f80ccd049a0da22998475d4e263b6dd1" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper address (japan) (rev a)" sha1="738b25e42d02d5a6c3683d486419c918a633f555" />
</diskarea>
@@ -11878,7 +12245,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper address (system disk).hdm" size="1261568" crc="9f587fde" sha1="4344771e7f36b8a3461c9d69ea8cb6057fab19f4" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper address (japan)" sha1="fe6f863d9e854ba822d5bd34f0faa4330248e977" />
</diskarea>
@@ -11903,7 +12270,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper_address_ver_2.0.hdm" size="1261568" crc="b547457c" sha1="a86f9f2200f5f54a42504f8ddc228fb99404495a" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper address ver. 2.0 (japan)" sha1="00755736bab60abc334487e29fd8317332482b21" />
</diskarea>
@@ -11965,7 +12332,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ハイパー・チャンネル TOWNS TV" />
<info name="release" value="199001xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper channel - towns tv (japan)" sha1="acd1ed9b0b39e45360528b4678f6f318733b054b" />
</diskarea>
@@ -11995,7 +12362,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-199A"/>
<info name="alt_title" value="ハイパー・ドリーム" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper dream (japan) (rev a)" sha1="205acc04b229b91d3d321a2650694b3ac0cdb4fe" />
</diskarea>
@@ -12014,7 +12381,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ダットジャパン (Datt Japan)</publisher>
<info name="serial" value="HMA-211"/>
<info name="release" value="198910xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper dx (japan)" sha1="de094723e0269db01f9eba3ae4a8f3e7bc6ecc6a" />
</diskarea>
@@ -12051,7 +12418,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper_land.hdm" size="1261568" crc="c462df32" sha1="8852be06fb139615085ea542a17ed6b13046e90f" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper land - doubutsu no sekai (japan)" sha1="d5d4f5cc55bb716a55423aaedbabd70986573088" />
</diskarea>
@@ -12088,7 +12455,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="DJT-002"/>
<info name="alt_title" value="HyperlandⅡ ~ミミの大冒険~" />
<info name="release" value="199502xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyperland ii - mimi no daibouken (japan)" sha1="2ddd943c94d3a5cf244c0385e0169129998148cd" />
</diskarea>
@@ -12127,7 +12494,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper_planet_1992-02-14.hdm" size="1261568" crc="14bc0b4f" sha1="2aa9ac7e8e655599f19611c8160430867d035d70" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet (japan)" sha1="489ede661a707adef7868526cfbbbb9d0bc6e55c" />
</diskarea>
@@ -12160,7 +12527,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>ダットジャパン (Datt Japan)</publisher>
<info name="serial" value="HMC-903"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet (japan) (demo)" sha1="d936f6bddb5bfbcc9652446eb1466a8676ef333b" />
</diskarea>
@@ -12199,7 +12566,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper_planet_marty.hdm" size="1261568" crc="bff17a79" sha1="139be75e703aefe0a3eb1131967de02e1af559e7" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet for marty (japan)" sha1="9cb884c64bcd1c2cff35fea66cf1e6503150a551" />
</diskarea>
@@ -12238,7 +12605,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper-planet-19900920.hdm" size="1261568" crc="29830434" sha1="90f294023993e778d06a90fb802618a668e0a23e" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet (japan)" sha1="489ede661a707adef7868526cfbbbb9d0bc6e55c" />
</diskarea>
@@ -12277,7 +12644,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper-planet-19900915.hdm" size="1261568" crc="ec701443" sha1="345ba017d784e42d926dc73548e8149c3a10c6c1" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet (japan)" sha1="489ede661a707adef7868526cfbbbb9d0bc6e55c" />
</diskarea>
@@ -12315,7 +12682,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ハイパー・プラネット四季VOL.1" />
<info name="release" value="199207xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet shiki vol. 1 (japan)" sha1="2b0df49f5183f5502776d514515b6be254d742b3" />
</diskarea>
@@ -12351,7 +12718,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ハイパー・プラネット四季VOL.2" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet shiki vol. 2 (japan)" sha1="86d8ef51f12b8d811c1f8f6843b5803eb6c1af0f" />
</diskarea>
@@ -12391,7 +12758,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ハイパー・プラネット四季VOL.3" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper planet shiki vol. 3 - uraraka na haru no seiza-hen (japan)" sha1="ddca18db8a3eb6850e3d4c04c8d6d0b87db476d3" />
</diskarea>
@@ -12418,7 +12785,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper_note_1992-03-03.hdm" size="1261568" crc="a5d9788b" sha1="7179eef7ab264ba7e15b5cd159e7ed817e35fe17" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper note (japan)" sha1="23e86c388f7ef78bcbd63b3fc6abaee5d5d4081f" />
</diskarea>
@@ -12444,7 +12811,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="hyper_note_1991-12-12.hdm" size="1261568" crc="985f94b6" sha1="af4704239151af3b1e80b528d11ad5d9198f99f3" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper note (japan)" sha1="23e86c388f7ef78bcbd63b3fc6abaee5d5d4081f" />
</diskarea>
@@ -12527,7 +12894,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="nhk_zoku_kiso_eigo_1.hdm" size="1261568" crc="1bfd75bc" sha1="27bf306f1f46a617249c51c234daf8805d4424f1" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nhk zoku kiso eigo - dai-1-kan (japan)" sha1="ec27b8a0e59a0c13216f5f6a545bd8e249d944f3" />
</diskarea>
@@ -12610,7 +12977,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="nhk_zoku_kiso_eigo_2.hdm" size="1261568" crc="2ce8038a" sha1="ccabd046714c9f613653c6541bfb7326c93053ab" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nhk zoku kiso eigo - dai-2-kan (japan)" sha1="0732d9bf16e69d16320fb4e52ed9b6ca6541b6e1" />
</diskarea>
@@ -12689,7 +13056,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="nhk_zoku_kiso_eigo_3.hdm" size="1261568" crc="e24c6072" sha1="fea5dcc8d4944ea2c0db97858c24163cc12abc17" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="nhk zoku kiso eigo - dai-3-kan (japan)" sha1="96613434cfe144c0e0c575fd63694cb97d7a3dec" />
</diskarea>
@@ -12712,7 +13079,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-109"/>
<info name="release" value="199304xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="hyper ocean (japan)" sha1="8c0b5c5e30ecfa63720967a6a7043b6ca7d5ee79" />
</diskarea>
@@ -12776,7 +13143,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="idol project (system disk) (1995-06-16 17-22-18).hdm" size="1261568" crc="59d7e80e" sha1="91c06dc48b2b25bae7050066e115694729efd861" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="idol project (japan)" sha1="24b9fd6146afa220f8e235136dcfbfad21420bfc" />
</diskarea>
@@ -12840,7 +13207,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="idol project (system disk) (1995-06-16 15-06-42).hdm" size="1261568" crc="333c3b70" sha1="1bb2803ff13314b69bc8fd9705ec2bc6a7737c12" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="idol project (japan)" sha1="24b9fd6146afa220f8e235136dcfbfad21420bfc" />
</diskarea>
@@ -12861,7 +13228,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="イフ" />
<info name="release" value="199306xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="if - invitations from fantastic stories (japan)" sha1="a3963c710a9476b96933976e6dc716b73d2da054" />
</diskarea>
@@ -12881,7 +13248,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="WIC-5147"/>
<info name="release" value="199604xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="if 1-2-3 cd collection (japan)" sha1="cd0600c3e1d2cd68f87404054b20eaed712af533" />
</diskarea>
@@ -12902,7 +13269,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="イフ2" />
<info name="release" value="19931119" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="if 2 - invitations from fantastic stories (japan)" sha1="aab5838de5a0e92d8a887e075f913aed0acdf18d" />
</diskarea>
@@ -12923,7 +13290,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="イフ3" />
<info name="release" value="199504xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="if 3 - invitations from fantastic stories (japan)" sha1="3d9672f8bcf7d558fd532ddefd3bc0dfa14e816a" />
</diskarea>
@@ -12941,7 +13308,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>アスキー (ASCII)</publisher>
<info name="serial" value="HMA-219A"/>
<info name="alt_title" value="囲碁II" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="igo ii (japan) (rev a)" sha1="c8086e68ae61656c24034decab5c5044e02f50c6" />
</diskarea>
@@ -12959,7 +13326,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>アスキー (ASCII)</publisher>
<info name="serial" value="HMA-219"/>
<info name="alt_title" value="囲碁II" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="igo ii (japan)" sha1="8786cd9864720372c3fca5ea58a8a9a13c84b438" />
</diskarea>
@@ -12987,7 +13354,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="igo_doujou_mondai_disk_dai-2-shuu.mfm" size="3444632" crc="9cfe32cf" sha1="91a66e690b71758708c05b2dca217256d582c466" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="igo doujou (japan)" sha1="e02b655f76e26f64c4dc1b3f1abcb566caa0ad4e" />
</diskarea>
@@ -13008,7 +13375,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="囲碁道場初段 開眼!級から段への挑戦" />
<info name="release" value="199105xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="igo doujou shodan (japan) (rev a)" sha1="c1327c0705c839c5380e3900d188983ce5a11534" />
</diskarea>
@@ -13067,7 +13434,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="囲碁道場破り 免許皆伝!!めざせ7級" />
<info name="release" value="199010xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="igo doujou yaburi (japan)" sha1="bda0e95f336bfaaf13ecce27606561fb7e9b46b4" />
</diskarea>
@@ -13086,7 +13453,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-501"/>
<info name="alt_title" value="いい旅いい味ご案内 〈ふるさと小包&かんぽの宿〉 平成元年度版" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ii tabi ii aji goannai - furusato kodzutsumi &amp; kanpo no yado - heisei gannendo-ban (japan)" sha1="2c15f864bcff84ce81104d179539bd1e37bcde6a" />
</diskarea>
@@ -13106,7 +13473,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="イラスト百科 ~山下秀樹のいきいきカット集~" />
<info name="release" value="199008xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="illust hyakka - yamashita hideki no ikiiki cut-shuu (japan) (rev a)" sha1="b5927af960c7a80087ab24c96cd93f52fc7b340a" />
</diskarea>
@@ -13147,13 +13514,40 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="イメージファイト" />
<info name="release" value="199011xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="imagefight (japan)" sha1="ab1dc382c58152383694c90272881d743f8e511f" />
</diskarea>
</part>
</software>
+ <software name="imgfightd">
+ <!--
+ Origin: redump.org
+ <rom name="ImageFight (Japan) (Demo) (Track 1).bin" size="10231200" crc="f53bfcef" sha1="c8c87d224a068321f3287777c4070d5a80f7fce3"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 2).bin" size="2822400" crc="85090d9a" sha1="ef4461e567432eedafab42a3532f43e3fc7d54be"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 3).bin" size="9525600" crc="3b5094a8" sha1="9a2fdeb4e46be3ee271cca7e5e8680c071541b94"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 4).bin" size="9525600" crc="390032f5" sha1="63dfd13c0e3131d9deef7c0945f9ca9b0e9a3111"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 5).bin" size="9525600" crc="1d1cc519" sha1="b92f212e73642ffb46bb48bc907d171473c63900"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 6).bin" size="9525600" crc="7ee5f374" sha1="2074eea94287040d036695370196236176cfd9ac"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 7).bin" size="9525600" crc="8465b2bf" sha1="7c7056e7bce811136d7d03313f305c04275cecab"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 8).bin" size="9525600" crc="07e9a82f" sha1="4716c13df9a2dc48a21b1ccbc193395ff046a8de"/>
+ <rom name="ImageFight (Japan) (Demo) (Track 9).bin" size="9525600" crc="b7b3f799" sha1="f24e84208fae98b3484a8ac25134461bb8b1605a"/>
+ <rom name="ImageFight (Japan) (Demo).cue" size="1053" crc="afc351aa" sha1="f77219ac71b2453e9ed9df918605d3d39afa0253"/>
+ -->
+ <description>Image Fight (demo)</description>
+ <year>1990</year>
+ <publisher>ビング (Ving)</publisher>
+ <info name="serial" value="HMB-927"/>
+ <info name="alt_title" value="イメージファイト" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="imagefight (japan) (demo)" sha1="7cfddc7f4a9da8abcaeb2b370b45373ce607030e" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="imgpower">
<!--
Origin: redump.org
@@ -13166,7 +13560,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-136"/>
<info name="release" value="199003xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="image power (japan)" sha1="2b5ab4222feb6384f8cee18251ab3caa04ca8f2b" />
</diskarea>
@@ -13202,7 +13596,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="インクレディブル・マシーン" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="incredible machine, the (japan)" sha1="cf66d0ff684711a0bf6bb6ce4c77c867cebe32a1" />
</diskarea>
@@ -13237,7 +13631,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-142 / A2760060 / TSC170"/>
<info name="release" value="199007xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="indiana jones and the last crusade (japan) (en,ja)" sha1="9ac388d3e0640d45cf2469a6fe4a872a45dcd8f2" />
</diskarea>
@@ -13269,7 +13663,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMB-916"/>
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="indiana jones and the last crusade (japan) (en,ja) (demo)" sha1="469d1fe1a750ef91efa4423c80cd3efbea22659a" />
</diskarea>
@@ -13289,7 +13683,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="インディ・ジョーンズ ~アトランティスの運命~" />
<info name="release" value="199308xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="indiana jones and the fate of atlantis (japan) (en,ja)" sha1="4d0b2b2ea535018bb90841cd8eefaa0b05aae45c" />
</diskarea>
@@ -13310,7 +13704,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="インフェステーション 沈黙の惑星" />
<info name="release" value="199203xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="infestation - chinmoku no wakusei (japan) (en,ja,fr,de)" sha1="a7ac12be57d8a70b5789ac7c8c2fbb899c58a900" />
</diskarea>
@@ -13350,7 +13744,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="inindou_datou_nobunaga.hdm" size="1261568" crc="357c74fd" sha1="29ef6aa58cff7779a8e6e98e67970f0e2e501200" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="inindou - datou nobunaga (japan)" sha1="b23ddfb43d2d01acf8a6e9f94806037c910127ce" />
</diskarea>
@@ -13382,7 +13776,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="淫獣学園 Laブルーガール" />
<info name="release" value="199407xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="injuu gakuen - la blue girl (japan)" sha1="d4d9b50ffdd37d16ee54079c3af936415f6a234d" />
</diskarea>
@@ -13419,7 +13813,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="iris-tei_serenade_disk_a.hdm" size="1261568" crc="33b53c9d" sha1="b07e99791bf2c52948e796ac392f0a588d88d4ce" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="iris-tei serenade (japan)" sha1="cb2c726ce594c8e56c47f8ce6c19ddbee96e62e6" />
</diskarea>
@@ -13450,7 +13844,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="石道" />
<info name="release" value="199006xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ishidoo - the way of stones (japan) (en,ja)" sha1="7b09ebbdf76f9e06c921e94b25e802381b579fe9" />
</diskarea>
@@ -13485,7 +13879,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="ishin.d88" size="1281968" crc="5885c76c" sha1="29b0773c95d1f69d943c1ee47e957f7b7eb6cb55" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ishin no arashi (japan)" sha1="4ff7137e99f3d682d80a7f3eca2451d70ea24534" />
</diskarea>
@@ -13504,7 +13898,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-206 / AOBA-15"/>
<info name="alt_title" value="雀ジャカ雀" />
<info name="release" value="199301xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jan jaka jan (japan)" sha1="ab5100758d1f378f2e1b5451247847be983e1df4" />
</diskarea>
@@ -13547,7 +13941,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="雀豪4" />
<info name="release" value="199411xx" />
<info name="usage" value="Requires 2 MB RAM. Insert a floppy disk in drive 1 before booting the game."/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jangou 4 (japan)" sha1="9ce1de99992be1439d98127f5d9e1cf133c13f2d" />
</diskarea>
@@ -13575,7 +13969,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="雀妃楼" />
<info name="release" value="199406xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jankirou (japan)" sha1="b7b9df14a8e5a1397996d05b1d37fa81476eab5d" />
</diskarea>
@@ -13595,7 +13989,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="情報倶楽部" />
<info name="release" value="198911xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jouhou club - card processor ver. 1.1 (japan)" sha1="84c7c26036a354c170f5fc9f638ebc52df02eeca" />
</diskarea>
@@ -13627,7 +14021,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ジェラシー" />
<info name="release" value="199507xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jealousy (japan)" sha1="1d14efa85e889f00ce444700e6d8c53327e2496d" />
</diskarea>
@@ -13697,7 +14091,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMB-514"/>
<info name="release" value="199103xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="towns chiri - jigsaw world (japan)" sha1="a4887948ed3c8e1a3429946460dd9603c5c1b5d3" />
</diskarea>
@@ -13737,7 +14131,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="jinmon_yuugi.hdm" size="1261568" crc="20ec80fc" sha1="401b3a1ab93f35ff3cff14e473cc87bf250102ac" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="jinmon yuugi (japan)" sha1="6e1d0415672f0c159fd3c6416e8cd9401e359c9e" />
</diskarea>
@@ -13756,7 +14150,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-152 / MTC-1006"/>
<info name="release" value="199207xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joker towns (Japan)" sha1="bc09ad20f315dcd4804452b5885c06eca281b48d" />
</diskarea>
@@ -13799,7 +14193,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="女子校生少女伝説 ~コスプレ・スペシャル~" />
<info name="release" value="199404xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joshikousei shoujo densetsu - cosplay special (japan)" sha1="d1e10958dcee9059fa4c8341748623fe9a994de3" />
</diskarea>
@@ -13840,7 +14234,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="女子高生少女発熱" />
<info name="release" value="199312xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joshikousei shoujo hatsunetsu (japan)" sha1="154bf04fafea22bc136ce1823dee37397c08e1bb" />
</diskarea>
@@ -13871,7 +14265,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="Jリーグ1994 プロフェッショナル・サッカー" />
<info name="release" value="199409xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="japan professional football league - j.league 1994 professional soccer (japan)" sha1="72b221b297ed968a4bbb8a3925a5e8ab073e55f6" />
</diskarea>
@@ -13896,7 +14290,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="joshikou_seifuku_monogatari.hdm" size="1261568" crc="3fdba734" sha1="8e8aed41e329bd02479e6b55675110ddc29b33f2" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joshikou seifuku monogatari (japan)" sha1="02c2c164c2554ac90faf6db3ee856357bd668110" />
</diskarea>
@@ -13921,7 +14315,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ジョシュア" />
<info name="release" value="199211xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="joshua (japan)" sha1="6144fef2a4c5368c90c7aa5990174e55e8161484" />
</diskarea>
@@ -13941,7 +14335,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="B276E210"/>
<info name="alt_title" value="奏 V1.1L20" />
<info name="usage" value="Requires 6 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kanade v1.1 l20 (japan)" sha1="427e4d012e3d3251ffb2874f12439d69b2946437" />
</diskarea>
@@ -13960,7 +14354,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="B276E210"/>
<info name="alt_title" value="奏 V1.1L10A" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kanade v1.1l10 (japan) (rev a)" sha1="9a4cad8e1bc964f3550f8cd75c71553163bfa181" />
</diskarea>
@@ -13983,7 +14377,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="カタカナのえほん" />
<info name="release" value="199504xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="katakana no ehon (japan)" sha1="ed55e7e0c38637008afadc83f8ea6f1168976f74" />
</diskarea>
@@ -14003,7 +14397,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="上村ケイのセクシー・テレフォン ~ピンクの花嫁~" />
<info name="release" value="199209xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kamimura kei no sexy telephone - pink no hanayome (japan)" sha1="d96d26ed481029006f7dcd22dbd8a64e306191ef" />
</diskarea>
@@ -14023,7 +14417,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="上村ケイのセクシー・リゾート ~桃色クイズ~" />
<info name="release" value="199209xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kamimura kei no sexy resort - momoiro quiz (japan)" sha1="7e107d920fd1b415a41570eef802d6a2e297d5a0" />
</diskarea>
@@ -14045,7 +14439,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="けろけろけろっぴとおりがみのたびびと" />
<info name="release" value="199507xx" />
<info name="usage" value="Requires 4 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kero kero keroppi to origami no tabibito (japan)" sha1="127568a04fa8b579528931978a37aa13a516bfce" />
</diskarea>
@@ -14066,7 +14460,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="かんじのえほん" />
<info name="release" value="199207xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kanji no ehon (japan)" sha1="d7ca0ee65ad99a17d090b0a6d8f6ca84284ee6e9" />
</diskarea>
@@ -14088,7 +14482,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="かんじのえほん2" />
<info name="release" value="199408xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kanji no ehon 2 (japan)" sha1="730c0ea8b63f4b43d4705664e92d3c58c6564a4a" />
</diskarea>
@@ -14113,7 +14507,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="漢字ランド3年" />
<info name="release" value="199507xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kanji land 3-nen (japan) (rev a)" sha1="fb7b3684231bde65a285fe528b6c42f0be6f74cd" />
</diskarea>
@@ -14137,7 +14531,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="漢字ランド3年" />
<info name="release" value="199507xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kanji land 3-nen (japan)" sha1="0e3286fa0144c4d9a6f63062f99909482fcf7926" />
</diskarea>
@@ -14156,7 +14550,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMD-114 / A2760290 / TSC260"/>
<info name="release" value="199208xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kid pix (japan)" sha1="1927381b738b04709ac79f310441e989ec36540c" />
</diskarea>
@@ -14175,7 +14569,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMF-120 / A2760391 / TSC-440"/>
<info name="release" value="199503xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kid pix companion (japan)" sha1="bf3707961e8146b76a82b745e9dd183bbb7c1d54" />
</diskarea>
@@ -14200,7 +14594,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="kid_pix_jr_sample_data_disk.hdm" size="1261568" crc="5e39a314" sha1="7f3eba701dff9f54013ace974e93f7e2e5d5e599" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kid pix jr. (japan)" sha1="d04476f773b16a14bc53ca2f19695b5db7bd789a" />
</diskarea>
@@ -14227,13 +14621,41 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="KIGEN 輝きの覇者" />
<info name="release" value="199205xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kigen - kagayaki no hasha (japan)" sha1="96234871427347ced00af0d3290b431c9404d430" />
</diskarea>
</part>
</software>
+ <software name="kijapan">
+ <!--
+ Origin: redump.org
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 1).bin" size="63151200" crc="84f5e823" sha1="e9a27d434de2bc9b57b8f94199c7190079954005"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 2).bin" size="32281200" crc="ff9ada44" sha1="f3b525466ebf60f79257652eefffe0444f6d1fde"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 3).bin" size="64209600" crc="edf1bb90" sha1="43579eaec5910f9aa553960f3306b0b6a72a9d08"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 4).bin" size="61387200" crc="5a9d4ff2" sha1="0bc243e64408f13e98b2368ab2f867123fe4f246"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 5).bin" size="74617200" crc="778ff50b" sha1="2be173d0091c5cfb474eca8aaf107e676d5aa3ca"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 6).bin" size="34927200" crc="5e5366dc" sha1="5f5fd9778287a89062dc51384ba090deeffb6d1c"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 7).bin" size="62092800" crc="4daf9603" sha1="852460acff582e7ad013d5baf0fdd7f1ef598bf3"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 8).bin" size="48686400" crc="5c6ec011" sha1="09f26a07777a357ca6f21cf5c338764d5aec406e"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan) (Track 9).bin" size="62092800" crc="b4f1e940" sha1="5f8579f18cfb168e8bc8528c8e13b6434da1fbf1"/>
+ <rom name="Fouge Vol. 1 - Ki - Japan - Maeda Shinzo no Sekai (Japan).cue" size="1341" crc="31e66984" sha1="50e77bfba428351dfae39c3a3060ed993468777e"/>
+ -->
+ <description>Fouge Vol. 1 - Ki - Japan - Maeda Shinzou no Sekai</description> <!-- "Fouge" is written between the kanji for 風珠 -->
+ <year>1993</year>
+ <publisher>富士通 (Fujitsu)</publisher>
+ <info name="serial" value="HME-165 / A2760470 / BGV-010"/>
+ <info name="alt_title" value="風珠Vol.1 季-JAPAN 前田真三の世界" />
+ <info name="release" value="199309xx" />
+ <info name="usage" value="Requires 2 MB RAM"/>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="fouge vol. 1 - ki - japan - maeda shinzo no sekai (japan)" sha1="af1d775128ca4b26e5c7a403941b5bd4045483b9" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="kindanke">
<!--
Origin: redump.org
@@ -14257,7 +14679,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="禁断の血族" />
<info name="release" value="199407xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kindan no ketsuzoku (japan)" sha1="8fdb182fe5904dcad4d0911938372d7d1b022d71" />
</diskarea>
@@ -14293,7 +14715,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="キングス バウンティ 盗まれた秩序" />
<info name="release" value="199407xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="king's bounty - nusumareta chitsujo (japan)" sha1="bf99dedb2744e78056c1cbff963e83071baa38ad" />
</diskarea>
@@ -14314,7 +14736,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="拘束超人" />
<info name="release" value="199608xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kousoku choujin (japan)" sha1="f79595a2edc07e16038e363862ede078448461f1" />
</diskarea>
@@ -14332,7 +14754,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>シエラオンラインジャパン (Sierra On-Line Japan)</publisher>
<info name="release" value="199108xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="king's quest v - absence makes the heart go yonder (japan) (en,ja) (rev 1)" sha1="eecf847609c5602daa3b731e7563a9f122bba812" />
</diskarea>
@@ -14352,7 +14774,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="極" />
<info name="release" value="199210xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kiwame (japan)" sha1="03237f11476eb1c4d2acc8075507ef64ebc9fae1" />
</diskarea>
@@ -14372,7 +14794,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="極II" />
<info name="release" value="199406xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kiwame ii (japan)" sha1="5ade123de0cd29a24779ae3a5c04afbc37d2280a" />
</diskarea>
@@ -14393,7 +14815,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="機械じかけのマリアン" />
<info name="release" value="199408xx" />
<info name="usage" value="Requires 8 MB RAM and TownsOS V2.1 L40 or later"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kikai jikake no marian (japan)" sha1="3cd9d330f7e32a53b5a65d85a7cbbd573763b84f" />
</diskarea>
@@ -14414,7 +14836,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ここは楽園荘" />
<info name="release" value="199603xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="koko wa rakuensou (japan)" sha1="d486b113f37ed11e4e5053a014da8e5a35831800" />
</diskarea>
@@ -14435,7 +14857,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="ここは楽園荘2" />
<info name="release" value="199604xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="koko wa rakuensou 2 (japan)" sha1="cabcebaeb62a2f47fb5d95faf101910732baf369" />
</diskarea>
@@ -14475,7 +14897,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="kouryuuki.hdm" size="1261568" crc="c37a6cb0" sha1="a152158d4d74cf7172f5e53ece8f3ddddf88ce45" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kouryuuki (japan)" sha1="02c72a8f00f985d6ad6589b305b9c976c7ffb8e8" />
</diskarea>
@@ -14496,7 +14918,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="くすり指の教科書" />
<info name="release" value="199604xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kusuriyubi no kyoukasho (japan)" sha1="3abab66cb04e640a92d745f6d63867e756bb8771" />
</diskarea>
@@ -14523,7 +14945,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-236 / YHRS-229"/>
<info name="alt_title" value="KYAN KYAN COLLECTION 大富豪編" />
<info name="release" value="198912xx" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyan kyan collection - daifugouhen (japan)" sha1="f17dd146b08af177df1d00dfc88d5e3ed0bc9366" />
</diskarea>
@@ -14622,7 +15044,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="電脳絵本 恐竜の世界" />
<info name="release" value="199004xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="dennou ehon - kyouryuu no sekai (japan)" sha1="159f98ea09b322d6ca42e94dc1dbf5a9519e8a82" />
</diskarea>
@@ -14670,7 +15092,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMB-506"/>
<info name="alt_title" value="教育&FM TOWNS" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyouiku &amp; fm towns (japan)" sha1="79686cdf1abba0959b5fba7e1060248d59559946" />
</diskarea>
@@ -14709,7 +15131,7 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="serial" value="HMB-520"/>
<info name="alt_title" value="教育&FM TOWNS VOL.2" />
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyouiku &amp; fm towns vol. 2 (japan)" sha1="fc80f084ff0b8b3ecb1b10635bb5012c35b2aa85" />
</diskarea>
@@ -14759,7 +15181,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMC-526"/>
<info name="alt_title" value="教育&FM TOWNS VOL.3" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyouiku &amp; fm towns vol. 3 (japan)" sha1="1eec5db2f2e844b59d1f0bf824ffae7b5e1821d2" />
</diskarea>
@@ -14778,7 +15200,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="恭子のいぢわる!! ~ハチャメチャ大進撃~" />
<info name="release" value="199410xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyouko no ijiwaru hachamecha daishingeki (japan)" sha1="766f1b7cd9e43aa7b7bba21687abb80c29fe590d" />
</diskarea>
@@ -14825,7 +15247,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="the legend of kyrandia (user disk).hdm" size="1261568" crc="da0241b6" sha1="12e125595d6a87496cf891bba1f67034d110b9e8" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="legend of kyrandia, the (japan) (en,ja) (fm towns)" sha1="7d4c3b1998abd6e19ea22548e53e55dfbb638613" />
</diskarea>
@@ -14929,7 +15351,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="キランディア2 運命の手" />
<info name="release" value="199510xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyrandia ii - the hand of fate (japan) (en,ja)" sha1="adef11bcdd2398cb14c509f572a65fb4f849cf17" />
</diskarea>
@@ -14972,7 +15394,7 @@ User/save disks that can be created from the game itself are not included.
<info name="alt_title" value="究極タイガー" />
<info name="release" value="199402xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="kyuukyoku tiger (japan)" sha1="ab6dd07e2ffe8041e60124bfe63452a76730d8ea" />
</diskarea>
@@ -15014,7 +15436,7 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HME-243 / MTC-1069"/>
<info name="release" value="199311xx" />
<info name="usage" value="Requires 2 MB RAM"/>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="ku^2++ (japan)" sha1="38c6be8640bb0f567275bee58671657dc5e81a63" />
</diskarea>
@@ -15041,7 +15463,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="lands_of_lore.hdm" size="1261568" crc="eaf15ec6" sha1="6a00499b09999b878c89a3db9ab27ee54ca2b11c" />
</dataarea>
</part>
- <part name="cdrom" interface="fmt_cdrom">
+ <part name="cdrom" interface="cdrom">
<diskarea name="cdrom">
<disk name="lands of lore - the throne of chaos (japan)" sha1="c87c0a4f748cbc17f8cf62a332027d549ec3fce9" />
</diskarea>
@@ -15231,19 +15653,19 @@ User/save disks that can be created from the game itself are not included.
<info name="serial" value="HMA-207 / SW-002"/>
<info name="alt_title" value="ラスト・ハルマゲドン CDスペシャル" />
<info name="release" value="198907xx" />
- <part name="cdrom1" interface="fmt_cdrom">
+ <part name="cdrom1" interface="cdrom">
<feature name="part_id" value="Disc A"/>
<diskarea name="cdrom">
<disk name="last armageddon - cd special (japan) (disc a) (rerelease)" sha1="c42a5e1cca558d42962621a59a3437a581f9b443" />
</diskarea>
</part>
- <part name="cdrom2" interface="fmt_cdrom">
+ <part name="cdrom2" interface="cdrom">
<feature name="part_id" value="Disc B"/>
<diskarea name="cdrom">
<disk name="last armageddon - cd special (japan) (disc b) (rerelease)" sha1="6654bf0972622ba355bb4241310bd46ba3ea12a4" />
</diskarea>
</part>
- <part name="cdrom3" interface="fmt_cdrom"